From bce234ec504e69046acdd33d3504acd245ca9b5c Mon Sep 17 00:00:00 2001 From: zelophed Date: Thu, 18 Aug 2022 17:30:48 +0200 Subject: [PATCH 001/515] Pondering Alone, Part I --- build.gradle | 81 +- .../com/simibubi/create/AllBlockPartials.java | 4 +- .../java/com/simibubi/create/AllBlocks.java | 2 +- .../com/simibubi/create/AllEntityTypes.java | 2 +- .../com/simibubi/create/AllParticleTypes.java | 2 +- .../com/simibubi/create/AllRecipeTypes.java | 2 +- .../java/com/simibubi/create/AllShapes.java | 2 +- .../com/simibubi/create/AllSoundEvents.java | 4 +- .../simibubi/create/AllSpecialTextures.java | 16 +- .../com/simibubi/create/AllSpriteShifts.java | 2 +- .../java/com/simibubi/create/AllTags.java | 4 +- .../com/simibubi/create/CreateClient.java | 26 +- .../api/connectivity/ConnectivityHandler.java | 12 +- .../java/com/simibubi/create/compat/Mods.java | 3 +- .../simibubi/create/compat/jei/CreateJEI.java | 2 +- .../create/compat/jei/DoubleItemIcon.java | 2 +- .../jei/PotionFluidSubtypeInterpreter.java | 2 +- .../compat/jei/ScreenResourceWrapper.java | 8 +- .../compat/jei/category/BasinCategory.java | 6 +- .../jei/category/CreateRecipeCategory.java | 12 +- .../compat/jei/category/CrushingCategory.java | 2 +- .../jei/category/DeployingCategory.java | 4 +- .../jei/category/FanBlastingCategory.java | 2 +- .../jei/category/FanHauntingCategory.java | 2 +- .../jei/category/FanSmokingCategory.java | 2 +- .../jei/category/FanWashingCategory.java | 2 +- .../jei/category/ItemApplicationCategory.java | 6 +- .../jei/category/PolishingCategory.java | 2 +- .../category/ProcessingViaFanCategory.java | 4 +- .../category/SequencedAssemblyCategory.java | 12 +- .../animations/AnimatedBlazeBurner.java | 5 +- .../category/animations/AnimatedDeployer.java | 2 +- .../animations/AnimatedItemDrain.java | 2 +- .../category/animations/AnimatedKinetics.java | 11 +- .../category/animations/AnimatedMixer.java | 2 +- .../category/animations/AnimatedPress.java | 2 +- .../category/animations/AnimatedSpout.java | 4 +- .../SequencedAssemblySubCategory.java | 4 +- .../content/contraptions/KineticDebugger.java | 9 +- .../contraptions/RotationPropagator.java | 14 +- .../contraptions/TorquePropagator.java | 2 +- .../base/DirectionalAxisKineticBlock.java | 5 +- .../base/DirectionalKineticBlock.java | 3 +- .../base/GeneratingKineticTileEntity.java | 10 +- .../base/HorizontalAxisKineticBlock.java | 3 +- .../base/HorizontalKineticBlock.java | 3 +- .../content/contraptions/base/IRotate.java | 11 +- .../base/KineticEffectHandler.java | 2 +- .../contraptions/base/KineticTileEntity.java | 24 +- .../base/KineticTileEntityRenderer.java | 6 +- .../base/RotatedPillarKineticBlock.java | 3 +- .../contraptions/base/flwdata/BeltType.java | 2 +- .../base/flwdata/KineticData.java | 2 +- .../base/flwdata/RotatingType.java | 2 +- .../BlockBreakingKineticTileEntity.java | 8 +- .../components/actors/DrillActorInstance.java | 4 +- .../actors/DrillMovementBehaviour.java | 2 +- .../components/actors/DrillRenderer.java | 6 +- .../actors/HarvesterActorInstance.java | 8 +- .../actors/HarvesterMovementBehaviour.java | 2 +- .../components/actors/HarvesterRenderer.java | 8 +- .../components/actors/PIInstance.java | 2 +- .../components/actors/PSIActorInstance.java | 5 +- .../components/actors/PSIInstance.java | 3 +- .../actors/PloughMovementBehaviour.java | 2 +- .../PortableStorageInterfaceMovement.java | 6 +- .../PortableStorageInterfaceRenderer.java | 6 +- .../PortableStorageInterfaceTileEntity.java | 2 +- .../actors/SawMovementBehaviour.java | 2 +- .../actors/SeatMovementBehaviour.java | 4 +- .../components/clock/CuckooClockRenderer.java | 2 +- .../clock/CuckooClockTileEntity.java | 12 +- .../crafter/ConnectedInputHandler.java | 2 +- .../crafter/MechanicalCrafterBlock.java | 8 +- .../crafter/MechanicalCrafterRenderer.java | 6 +- .../crafter/MechanicalCrafterTileEntity.java | 6 +- .../components/crafter/RecipeGridHandler.java | 4 +- .../components/crank/HandCrankBlock.java | 8 +- .../components/crank/HandCrankInstance.java | 2 +- .../components/crank/HandCrankTileEntity.java | 2 +- .../components/crank/ValveHandleBlock.java | 4 +- .../crusher/CrushingWheelBlock.java | 4 +- .../crusher/CrushingWheelControllerBlock.java | 8 +- .../CrushingWheelControllerTileEntity.java | 4 +- .../crusher/CrushingWheelTileEntity.java | 4 +- .../deployer/DeployerActorInstance.java | 8 +- .../deployer/DeployerApplicationRecipe.java | 4 +- .../deployer/DeployerFakePlayer.java | 4 +- .../deployer/DeployerFilterSlot.java | 4 +- .../components/deployer/DeployerHandler.java | 2 +- .../components/deployer/DeployerInstance.java | 4 +- .../deployer/DeployerMovementBehaviour.java | 6 +- .../deployer/DeployerMovingInteraction.java | 2 +- .../components/deployer/DeployerRenderer.java | 13 +- .../deployer/DeployerTileEntity.java | 6 +- .../components/fan/AirCurrent.java | 4 +- .../components/fan/EncasedFanBlock.java | 4 +- .../components/fan/EncasedFanRenderer.java | 4 +- .../components/fan/NozzleTileEntity.java | 2 +- .../components/flywheel/FlyWheelInstance.java | 4 +- .../components/flywheel/FlywheelRenderer.java | 2 +- .../flywheel/FlywheelTileEntity.java | 4 +- .../components/millstone/MillstoneBlock.java | 2 +- .../millstone/MillstoneTileEntity.java | 4 +- .../mixer/MechanicalMixerRenderer.java | 4 +- .../mixer/MechanicalMixerTileEntity.java | 8 +- .../components/mixer/MixerInstance.java | 2 +- .../motor/CreativeMotorTileEntity.java | 6 +- .../press/MechanicalPressTileEntity.java | 2 +- .../components/press/PressInstance.java | 5 +- .../components/press/PressingBehaviour.java | 4 +- .../components/press/PressingRecipe.java | 8 +- .../components/saw/CuttingRecipe.java | 8 +- .../components/saw/SawFilterSlot.java | 2 +- .../components/saw/SawRenderer.java | 4 +- .../components/saw/SawTileEntity.java | 6 +- .../components/steam/PoweredShaftBlock.java | 10 +- .../components/steam/SteamEngineBlock.java | 14 +- .../components/steam/SteamEngineRenderer.java | 4 +- .../steam/SteamEngineTileEntity.java | 8 +- .../components/steam/SteamEngineValueBox.java | 6 +- .../steam/whistle/WhistleBlock.java | 4 +- .../steam/whistle/WhistleExtenderBlock.java | 2 +- .../steam/whistle/WhistleRenderer.java | 6 +- .../steam/whistle/WhistleTileEntity.java | 14 +- .../AbstractContraptionEntity.java | 8 +- .../structureMovement/AssemblyException.java | 6 +- .../structureMovement/Contraption.java | 10 +- .../ContraptionCollider.java | 8 +- .../structureMovement/ContraptionHandler.java | 10 +- .../ContraptionHandlerClient.java | 6 +- .../structureMovement/ContraptionWorld.java | 3 +- .../ControlledContraptionEntity.java | 6 +- .../DirectionalExtenderScrollOptionSlot.java | 2 +- .../IControlContraption.java | 6 +- .../IDisplayAssemblyExceptions.java | 8 +- .../MountedFluidStorage.java | 6 +- .../structureMovement/MountedStorage.java | 4 +- .../MountedStorageManager.java | 2 +- .../structureMovement/MovementContext.java | 5 +- .../OrientedContraptionEntity.java | 10 +- .../structureMovement/StructureTransform.java | 10 +- .../bearing/BearingInstance.java | 4 +- .../bearing/BearingRenderer.java | 2 +- .../bearing/ClockworkBearingTileEntity.java | 13 +- .../bearing/ClockworkContraption.java | 2 +- .../bearing/MechanicalBearingTileEntity.java | 8 +- .../structureMovement/bearing/SailBlock.java | 8 +- .../bearing/StabilizedBearingInstance.java | 2 +- .../StabilizedBearingMovementBehaviour.java | 2 +- .../bearing/WindmillBearingBlock.java | 6 +- .../bearing/WindmillBearingTileEntity.java | 7 +- .../chassis/AbstractChassisBlock.java | 2 +- .../chassis/ChassisRangeDisplay.java | 14 +- .../chassis/ChassisTileEntity.java | 8 +- .../chassis/StickerInstance.java | 4 +- .../chassis/StickerRenderer.java | 6 +- .../chassis/StickerTileEntity.java | 6 +- .../gantry/GantryCarriageBlock.java | 4 +- .../gantry/GantryCarriageInstance.java | 4 +- .../gantry/GantryCarriageRenderer.java | 8 +- .../gantry/GantryContraptionEntity.java | 4 +- .../glue/SuperGlueEntity.java | 6 +- .../glue/SuperGlueHandler.java | 6 +- .../structureMovement/glue/SuperGlueItem.java | 2 +- .../glue/SuperGlueSelectionHandler.java | 24 +- .../glue/SuperGlueSelectionHelper.java | 2 +- .../interaction/controls/ControlsHandler.java | 6 +- .../controls/ControlsMovementBehaviour.java | 8 +- .../controls/ControlsRenderer.java | 4 +- .../controls/ControlsServerHandler.java | 4 +- .../interaction/controls/TrainHUD.java | 30 +- .../mounted/CartAssembleRailType.java | 10 +- .../mounted/CartAssemblerBlockItem.java | 6 +- .../mounted/CartAssemblerTileEntity.java | 13 +- .../mounted/MinecartContraptionItem.java | 10 +- .../mounted/MountedContraption.java | 8 +- .../piston/LinearActuatorTileEntity.java | 4 +- .../piston/MechanicalPistonBlock.java | 4 +- .../piston/PistonContraption.java | 2 +- .../piston/PistonExtensionPoleBlock.java | 8 +- .../pulley/AbstractPulleyRenderer.java | 2 +- .../pulley/HosePulleyInstance.java | 3 +- .../pulley/RopePulleyInstance.java | 3 +- .../render/ContraptionMatrices.java | 2 +- .../render/ContraptionRenderInfo.java | 2 +- .../render/FlwContraption.java | 3 +- .../render/SBBContraptionManager.java | 2 +- .../train/CouplingHandler.java | 14 +- .../train/CouplingHandlerClient.java | 2 +- .../train/CouplingPhysics.java | 14 +- .../train/CouplingRenderer.java | 14 +- .../train/MinecartCouplingItem.java | 2 +- .../train/MinecartSim2020.java | 2 +- .../CapabilityMinecartController.java | 4 +- .../train/capability/MinecartController.java | 12 +- .../tracks/ControllerRailBlock.java | 4 +- .../components/turntable/TurntableBlock.java | 6 +- .../turntable/TurntableHandler.java | 10 +- .../waterwheel/WaterWheelBlock.java | 6 +- .../waterwheel/WaterWheelTileEntity.java | 4 +- .../contraptions/fluids/FlowSource.java | 2 +- .../content/contraptions/fluids/FluidFX.java | 2 +- .../contraptions/fluids/FluidNetwork.java | 6 +- .../contraptions/fluids/FluidPropagator.java | 4 +- .../fluids/FluidTransportBehaviour.java | 4 +- .../contraptions/fluids/OpenEndedPipe.java | 2 +- .../fluids/PipeAttachmentModel.java | 6 +- .../contraptions/fluids/PipeConnection.java | 12 +- .../contraptions/fluids/PumpCogInstance.java | 4 +- .../contraptions/fluids/PumpRenderer.java | 2 +- .../contraptions/fluids/PumpTileEntity.java | 12 +- .../fluids/actors/FillingRecipe.java | 8 +- .../fluids/actors/FluidDrainingBehaviour.java | 4 +- .../fluids/actors/FluidFillingBehaviour.java | 4 +- .../actors/FluidManipulationBehaviour.java | 4 +- .../fluids/actors/HosePulleyBlock.java | 4 +- .../fluids/actors/HosePulleyTileEntity.java | 2 +- .../fluids/actors/ItemDrainRenderer.java | 2 +- .../fluids/actors/ItemDrainTileEntity.java | 6 +- .../fluids/actors/SpoutTileEntity.java | 4 +- .../fluids/particle/BasinFluidParticle.java | 2 +- .../fluids/particle/FluidStackParticle.java | 2 +- .../fluids/pipes/AxisPipeBlock.java | 4 +- .../fluids/pipes/BracketBlock.java | 2 +- .../fluids/pipes/EncasedPipeBlock.java | 4 +- .../fluids/pipes/FluidPipeBlock.java | 6 +- .../fluids/pipes/FluidValveBlock.java | 4 +- .../fluids/pipes/FluidValveInstance.java | 4 +- .../fluids/pipes/FluidValveRenderer.java | 2 +- .../fluids/pipes/FluidValveTileEntity.java | 4 +- .../fluids/pipes/SmartFluidPipeBlock.java | 6 +- .../pipes/SmartFluidPipeTileEntity.java | 4 +- .../TransparentStraightPipeRenderer.java | 4 +- .../fluids/potion/PotionFluid.java | 2 +- .../fluids/potion/PotionFluidHandler.java | 4 +- .../contraptions/fluids/tank/BoilerData.java | 33 +- .../fluids/tank/FluidTankBlock.java | 2 +- .../fluids/tank/FluidTankModel.java | 2 +- .../fluids/tank/FluidTankRenderer.java | 4 +- .../fluids/tank/FluidTankTileEntity.java | 4 +- .../goggles/GoggleConfigScreen.java | 22 +- .../goggles/GoggleOverlayRenderer.java | 26 +- .../goggles/IHaveGoggleInformation.java | 20 +- .../itemAssembly/SequencedAssemblyItem.java | 3 +- .../itemAssembly/SequencedAssemblyRecipe.java | 12 +- .../particle/AirFlowParticle.java | 4 +- .../contraptions/particle/AirParticle.java | 8 +- .../contraptions/particle/CubeParticle.java | 10 +- .../particle/RotationIndicatorParticle.java | 8 +- .../contraptions/processing/BasinRecipe.java | 2 +- .../processing/BasinRenderer.java | 12 +- .../processing/BasinTileEntity.java | 16 +- .../processing/EmptyingByBasin.java | 6 +- .../processing/HeatCondition.java | 3 +- .../processing/InWorldProcessing.java | 4 +- .../processing/ProcessingOutput.java | 2 +- .../processing/ProcessingRecipeBuilder.java | 14 +- .../processing/burner/BlazeBurnerBlock.java | 2 +- .../burner/BlazeBurnerBlockItem.java | 2 +- .../BlazeBurnerInteractionBehaviour.java | 16 +- .../burner/BlazeBurnerMovementBehaviour.java | 10 +- .../burner/BlazeBurnerRenderer.java | 10 +- .../burner/BlazeBurnerTileEntity.java | 8 +- .../burner/LitBlazeBurnerBlock.java | 2 +- .../relays/advanced/GantryShaftBlock.java | 12 +- .../advanced/GantryShaftTileEntity.java | 2 +- .../relays/advanced/SpeedControllerBlock.java | 8 +- .../advanced/SpeedControllerTileEntity.java | 12 +- .../advanced/sequencer/Instruction.java | 2 +- .../sequencer/InstructionSpeedModifiers.java | 5 +- .../sequencer/SequencedGearshiftBlock.java | 4 +- .../sequencer/SequencedGearshiftScreen.java | 26 +- .../sequencer/SequencerInstructions.java | 7 +- .../contraptions/relays/belt/BeltBlock.java | 2 +- .../contraptions/relays/belt/BeltHelper.java | 2 +- .../relays/belt/BeltInstance.java | 2 +- .../contraptions/relays/belt/BeltPart.java | 5 +- .../relays/belt/BeltRenderer.java | 10 +- .../contraptions/relays/belt/BeltShapes.java | 2 +- .../contraptions/relays/belt/BeltSlicer.java | 14 +- .../contraptions/relays/belt/BeltSlope.java | 5 +- .../relays/belt/BeltTileEntity.java | 2 +- .../relays/belt/item/BeltConnectorItem.java | 2 +- .../BeltTunnelInteractionHandler.java | 2 +- .../BracketedKineticTileRenderer.java | 4 +- .../BracketedTileEntityBehaviour.java | 2 +- .../relays/elementary/CogWheelBlock.java | 2 +- .../relays/elementary/CogwheelBlockItem.java | 8 +- .../relays/elementary/ShaftBlock.java | 8 +- .../relays/encased/EncasedBeltBlock.java | 4 +- .../relays/encased/EncasedCogCTBehaviour.java | 2 +- .../relays/encased/EncasedCogInstance.java | 2 +- .../relays/encased/EncasedCogRenderer.java | 2 +- .../relays/encased/SplitShaftInstance.java | 2 +- .../relays/encased/SplitShaftRenderer.java | 6 +- .../contraptions/relays/gauge/GaugeBlock.java | 10 +- .../relays/gauge/GaugeInstance.java | 6 +- .../relays/gauge/GaugeRenderer.java | 2 +- .../relays/gauge/GaugeShaper.java | 4 +- .../relays/gauge/GaugeTileEntity.java | 4 +- .../relays/gauge/SpeedGaugeTileEntity.java | 6 +- .../relays/gauge/StressGaugeTileEntity.java | 18 +- .../relays/gearbox/GearboxInstance.java | 2 +- .../relays/gearbox/GearboxRenderer.java | 6 +- .../relays/gearbox/VerticalGearboxItem.java | 4 +- .../contraptions/wrench/IWrenchable.java | 4 +- .../wrench/WrenchItemRenderer.java | 2 +- .../curiosities/ChromaticCompoundColor.java | 5 +- .../curiosities/ChromaticCompoundItem.java | 4 +- .../curiosities/ExperienceNuggetItem.java | 5 +- .../curiosities/NoGravMagicalDohickyItem.java | 2 +- .../curiosities/TreeFertilizerItem.java | 9 +- .../curiosities/armor/BackTankUtil.java | 4 +- .../armor/CopperBacktankArmorLayer.java | 12 +- .../armor/CopperBacktankRenderer.java | 7 +- .../armor/CopperBacktankTileEntity.java | 8 +- .../curiosities/armor/DivingBootsItem.java | 2 +- .../bell/AbstractBellTileEntity.java | 6 +- .../curiosities/bell/BellRenderer.java | 2 +- .../curiosities/bell/HauntedBellPulser.java | 2 +- .../curiosities/bell/SoulPulseEffect.java | 2 +- .../curiosities/deco/MetalLadderBlock.java | 6 +- .../curiosities/deco/PlacardRenderer.java | 2 +- .../curiosities/deco/PlacardTileEntity.java | 2 +- .../deco/SlidingDoorMovementBehaviour.java | 2 +- .../deco/SlidingDoorTileEntity.java | 4 +- .../girder/ConnectedGirderModel.java | 2 +- .../curiosities/girder/GirderBlock.java | 6 +- .../girder/GirderBlockStateGenerator.java | 2 +- .../girder/GirderPlacementHelper.java | 4 +- .../girder/GirderWrenchBehavior.java | 14 +- .../curiosities/symmetry/SymmetryHandler.java | 2 +- .../symmetry/SymmetryWandItem.java | 4 +- .../symmetry/SymmetryWandScreen.java | 17 +- .../client/SymmetryWandItemRenderer.java | 2 +- .../symmetry/mirror/CrossPlaneMirror.java | 4 +- .../symmetry/mirror/PlaneMirror.java | 4 +- .../symmetry/mirror/SymmetryMirror.java | 6 +- .../symmetry/mirror/TriplePlaneMirror.java | 4 +- .../toolbox/RadialToolboxMenu.java | 18 +- .../curiosities/toolbox/ToolBoxInstance.java | 4 +- .../curiosities/toolbox/ToolboxHandler.java | 2 +- .../toolbox/ToolboxHandlerClient.java | 2 +- .../curiosities/toolbox/ToolboxInventory.java | 2 +- .../curiosities/toolbox/ToolboxRenderer.java | 2 +- .../curiosities/toolbox/ToolboxScreen.java | 25 +- .../toolbox/ToolboxTileEntity.java | 6 +- .../curiosities/tools/BlueprintEntity.java | 4 +- .../tools/BlueprintOverlayRenderer.java | 9 +- .../curiosities/tools/BlueprintRenderer.java | 2 +- .../curiosities/tools/BlueprintScreen.java | 33 +- .../curiosities/tools/ExtendoGripItem.java | 2 +- .../tools/ExtendoGripItemRenderer.java | 2 +- .../tools/ExtendoGripRenderHandler.java | 2 +- .../curiosities/tools/SandPaperItem.java | 2 +- .../tools/SandPaperItemRenderer.java | 2 +- .../weapons/BuiltinPotatoProjectileTypes.java | 2 +- .../curiosities/weapons/PotatoCannonItem.java | 12 +- .../weapons/PotatoCannonItemRenderer.java | 2 +- .../weapons/PotatoCannonRenderHandler.java | 2 +- .../weapons/PotatoProjectileEntity.java | 2 +- .../weapons/PotatoProjectileRenderMode.java | 2 +- .../curiosities/zapper/PlacementPatterns.java | 6 +- .../curiosities/zapper/ZapperItem.java | 8 +- .../zapper/ZapperRenderHandler.java | 4 +- .../curiosities/zapper/ZapperScreen.java | 20 +- .../zapper/terrainzapper/Brush.java | 6 +- .../zapper/terrainzapper/CylinderBrush.java | 6 +- .../zapper/terrainzapper/DynamicBrush.java | 4 +- .../terrainzapper/PlacementOptions.java | 3 +- .../zapper/terrainzapper/SphereBrush.java | 6 +- .../zapper/terrainzapper/TerrainTools.java | 4 +- .../zapper/terrainzapper/WorldshaperItem.java | 8 +- .../WorldshaperItemRenderer.java | 4 +- .../WorldshaperRenderHandler.java | 6 +- .../terrainzapper/WorldshaperScreen.java | 20 +- .../content/logistics/IRedstoneLinkable.java | 14 +- .../logistics/RedstoneLinkNetworkHandler.java | 4 +- .../block/belts/tunnel/BeltTunnelBlock.java | 4 +- .../belts/tunnel/BeltTunnelInstance.java | 6 +- .../belts/tunnel/BeltTunnelRenderer.java | 6 +- .../block/belts/tunnel/BeltTunnelShapes.java | 3 +- .../belts/tunnel/BeltTunnelTileEntity.java | 6 +- .../belts/tunnel/BrassTunnelFilterSlot.java | 2 +- .../belts/tunnel/BrassTunnelTileEntity.java | 21 +- .../block/chute/AbstractChuteBlock.java | 6 +- .../logistics/block/chute/ChuteBlock.java | 10 +- .../block/chute/ChuteTileEntity.java | 20 +- .../SmartChuteFilterSlotPositioning.java | 4 +- .../logistics/block/depot/DepotBehaviour.java | 8 +- .../logistics/block/depot/DepotRenderer.java | 2 +- .../logistics/block/depot/EjectorBlock.java | 2 +- .../block/depot/EjectorInstance.java | 2 +- .../block/depot/EjectorRenderer.java | 6 +- .../block/depot/EjectorTargetHandler.java | 20 +- .../block/depot/EjectorTileEntity.java | 20 +- .../logistics/block/depot/EntityLauncher.java | 23 +- .../block/diodes/BrassDiodeInstance.java | 3 +- .../block/diodes/BrassDiodeRenderer.java | 2 +- .../block/diodes/BrassDiodeScrollSlot.java | 4 +- .../block/diodes/BrassDiodeTileEntity.java | 10 +- .../block/display/DisplayLinkBlock.java | 10 +- .../block/display/DisplayLinkBlockItem.java | 14 +- .../block/display/DisplayLinkRenderer.java | 2 +- .../block/display/DisplayLinkScreen.java | 56 +- .../block/display/DisplayLinkTileEntity.java | 16 +- .../display/source/BoilerDisplaySource.java | 18 +- .../source/DeathCounterDisplaySource.java | 4 +- .../source/FillLevelDisplaySource.java | 8 +- .../source/FluidListDisplaySource.java | 4 +- .../display/source/ItemListDisplaySource.java | 2 +- .../source/ItemThoughputDisplaySource.java | 8 +- .../source/KineticSpeedDisplaySource.java | 6 +- .../source/KineticStressDisplaySource.java | 10 +- .../source/RedstonePowerDisplaySource.java | 12 +- .../source/ScoreboardDisplaySource.java | 10 +- .../source/SingleLineDisplaySource.java | 6 +- .../source/StatTrackingDisplaySource.java | 2 +- .../source/StationSummaryDisplaySource.java | 16 +- .../source/TimeOfDayDisplaySource.java | 10 +- .../source/ValueListDisplaySource.java | 14 +- .../block/display/target/DisplayTarget.java | 4 +- .../display/target/LecternDisplayTarget.java | 4 +- .../target/SingleLineDisplayTarget.java | 10 +- .../block/funnel/BeltFunnelBlock.java | 4 +- .../logistics/block/funnel/FunnelBlock.java | 4 +- .../funnel/FunnelFilterSlotPositioning.java | 4 +- .../block/funnel/FunnelInstance.java | 2 +- .../block/funnel/FunnelRenderer.java | 4 +- .../block/funnel/FunnelTileEntity.java | 10 +- .../AllArmInteractionPointTypes.java | 2 +- .../block/mechanicalArm/ArmAngleTarget.java | 7 +- .../block/mechanicalArm/ArmInstance.java | 9 +- .../mechanicalArm/ArmInteractionPoint.java | 4 +- .../ArmInteractionPointHandler.java | 14 +- .../block/mechanicalArm/ArmRenderer.java | 9 +- .../block/mechanicalArm/ArmTileEntity.java | 14 +- .../block/redstone/AnalogLeverInstance.java | 6 +- .../block/redstone/AnalogLeverRenderer.java | 4 +- .../block/redstone/AnalogLeverTileEntity.java | 8 +- .../block/redstone/ContentObserverBlock.java | 4 +- .../redstone/ContentObserverTileEntity.java | 2 +- .../redstone/FilteredDetectorFilterSlot.java | 4 +- .../block/redstone/NixieTubeBlock.java | 2 +- .../block/redstone/NixieTubeRenderer.java | 15 +- .../block/redstone/NixieTubeTileEntity.java | 2 +- .../block/redstone/RedstoneLinkBlock.java | 4 +- .../redstone/RedstoneLinkFrequencySlot.java | 4 +- .../block/redstone/RoseQuartzLampBlock.java | 2 +- .../block/redstone/StockpileSwitchBlock.java | 4 +- .../block/redstone/StockpileSwitchScreen.java | 34 +- .../logistics/block/vault/ItemVaultItem.java | 2 +- .../item/LecternControllerRenderer.java | 2 +- .../item/LinkedControllerClientHandler.java | 14 +- .../logistics/item/LinkedControllerItem.java | 2 +- .../item/LinkedControllerItemRenderer.java | 6 +- .../item/LinkedControllerScreen.java | 20 +- .../item/LinkedControllerServerHandler.java | 10 +- .../item/filter/AbstractFilterScreen.java | 21 +- .../item/filter/AttributeFilterContainer.java | 2 +- .../item/filter/AttributeFilterScreen.java | 26 +- .../logistics/item/filter/FilterItem.java | 10 +- .../logistics/item/filter/FilterScreen.java | 18 +- .../logistics/item/filter/ItemAttribute.java | 7 +- .../attribute/ShulkerFillLevelAttribute.java | 4 +- .../logistics/trains/BezierConnection.java | 6 +- .../trains/CameraDistanceModifier.java | 3 +- .../logistics/trains/DimensionPalette.java | 3 +- .../logistics/trains/GraphLocation.java | 8 +- .../content/logistics/trains/ITrackBlock.java | 6 +- .../logistics/trains/RailwaySavedData.java | 2 +- .../content/logistics/trains/TrackEdge.java | 2 +- .../content/logistics/trains/TrackGraph.java | 10 +- .../logistics/trains/TrackGraphHelper.java | 2 +- .../logistics/trains/TrackGraphSync.java | 4 +- .../trains/TrackGraphSyncPacket.java | 8 +- .../trains/TrackGraphVisualizer.java | 18 +- .../logistics/trains/TrackNodeLocation.java | 5 +- .../trains/entity/ArrivalSoundQueue.java | 4 +- .../trains/entity/BogeyInstance.java | 6 +- .../logistics/trains/entity/Carriage.java | 12 +- .../trains/entity/CarriageBogey.java | 10 +- .../trains/entity/CarriageContraption.java | 18 +- .../entity/CarriageContraptionEntity.java | 16 +- .../entity/CarriageContraptionInstance.java | 5 +- .../entity/CarriageCouplingRenderer.java | 4 +- .../trains/entity/CarriageParticles.java | 8 +- .../trains/entity/CarriageSounds.java | 4 +- .../trains/entity/CarriageSyncData.java | 8 +- .../logistics/trains/entity/Navigation.java | 10 +- .../logistics/trains/entity/Train.java | 20 +- .../trains/entity/TrainMigration.java | 6 +- .../logistics/trains/entity/TrainPacket.java | 4 +- .../trains/entity/TrainRelocationPacket.java | 6 +- .../trains/entity/TrainRelocator.java | 28 +- .../logistics/trains/entity/TrainStatus.java | 6 +- .../trains/entity/TravellingPoint.java | 4 +- .../management/display/FlapDisplayBlock.java | 8 +- .../management/display/FlapDisplayLayout.java | 3 +- .../display/FlapDisplayRenderer.java | 10 +- .../display/FlapDisplaySection.java | 16 +- .../display/FlapDisplayTileEntity.java | 12 +- .../edgePoint/CurvedTrackSelectionPacket.java | 8 +- .../trains/management/edgePoint/EdgeData.java | 4 +- .../edgePoint/EdgePointManager.java | 5 +- .../edgePoint/EdgePointStorage.java | 2 +- .../edgePoint/TrackEdgeIntersection.java | 2 +- .../edgePoint/TrackTargetingBehaviour.java | 8 +- .../edgePoint/TrackTargetingBlockItem.java | 20 +- .../edgePoint/TrackTargetingClient.java | 2 +- .../edgePoint/signal/EdgeGroupColor.java | 6 +- .../edgePoint/signal/SignalBlock.java | 7 +- .../edgePoint/signal/SignalBoundary.java | 6 +- .../edgePoint/signal/SignalEdgeGroup.java | 6 +- .../edgePoint/signal/SignalPropagator.java | 6 +- .../edgePoint/signal/SignalRenderer.java | 4 +- .../edgePoint/signal/SignalTileEntity.java | 4 +- .../edgePoint/signal/TrackEdgePoint.java | 2 +- .../station/AbstractStationScreen.java | 13 +- .../edgePoint/station/AssemblyScreen.java | 32 +- .../edgePoint/station/StationBlock.java | 4 +- .../edgePoint/station/StationEditPacket.java | 2 +- .../edgePoint/station/StationScreen.java | 36 +- .../edgePoint/station/StationTileEntity.java | 30 +- .../edgePoint/station/WideIconButton.java | 5 +- .../schedule/DestinationSuggestions.java | 2 +- .../management/schedule/IScheduleInput.java | 6 +- .../trains/management/schedule/Schedule.java | 4 +- .../management/schedule/ScheduleEntry.java | 4 +- .../management/schedule/ScheduleItem.java | 12 +- .../schedule/ScheduleItemRetrieval.java | 10 +- .../management/schedule/ScheduleRuntime.java | 2 +- .../management/schedule/ScheduleScreen.java | 62 +- .../schedule/TrainHatArmorLayer.java | 2 +- .../condition/CargoThresholdCondition.java | 19 +- .../condition/FluidThresholdCondition.java | 21 +- .../condition/IdleCargoCondition.java | 16 +- .../condition/ItemThresholdCondition.java | 25 +- .../condition/PlayerPassengerCondition.java | 18 +- .../condition/RedstoneLinkCondition.java | 22 +- .../condition/ScheduleWaitCondition.java | 8 +- .../schedule/condition/ScheduledDelay.java | 10 +- .../condition/StationPoweredCondition.java | 12 +- .../condition/StationUnloadedCondition.java | 12 +- .../condition/TimeOfDayCondition.java | 22 +- .../condition/TimedWaitCondition.java | 20 +- .../ChangeThrottleInstruction.java | 14 +- .../destination/ChangeTitleInstruction.java | 12 +- .../destination/DestinationInstruction.java | 16 +- .../destination/ScheduleInstruction.java | 4 +- .../destination/TextScheduleInstruction.java | 6 +- .../trains/track/CurvedTrackInteraction.java | 6 +- .../trains/track/StandardBogeyBlock.java | 4 +- .../trains/track/StandardBogeyTileEntity.java | 8 +- .../logistics/trains/track/TrackBlock.java | 18 +- .../trains/track/TrackBlockItem.java | 12 +- .../trains/track/TrackBlockOutline.java | 12 +- .../logistics/trains/track/TrackInstance.java | 6 +- .../logistics/trains/track/TrackPaver.java | 8 +- .../trains/track/TrackPlacement.java | 46 +- .../logistics/trains/track/TrackRenderer.java | 6 +- .../logistics/trains/track/TrackShape.java | 4 +- .../trains/track/TrackTileEntity.java | 4 +- .../palettes/AllPaletteStoneTypes.java | 2 +- .../palettes/ConnectedPillarBlock.java | 3 +- .../content/palettes/PaletteBlockPartial.java | 2 +- .../schematics/ClientSchematicLoader.java | 6 +- .../content/schematics/MaterialChecklist.java | 6 +- .../schematics/SchematicChunkSource.java | 251 ---- .../content/schematics/SchematicPrinter.java | 13 +- .../content/schematics/SchematicWorld.java | 250 ---- .../schematics/ServerSchematicLoader.java | 8 +- .../block/SchematicTableScreen.java | 36 +- .../block/SchematicTableTileEntity.java | 10 +- .../block/SchematicannonInstance.java | 2 +- .../block/SchematicannonScreen.java | 71 +- .../block/SchematicannonTileEntity.java | 6 +- .../client/SchematicAndQuillHandler.java | 30 +- .../client/SchematicEditScreen.java | 22 +- .../schematics/client/SchematicHandler.java | 10 +- .../client/SchematicPromptScreen.java | 20 +- .../schematics/client/SchematicRenderer.java | 4 +- .../client/SchematicTransformation.java | 8 +- .../client/ToolSelectionScreen.java | 10 +- .../schematics/client/tools/DeployTool.java | 6 +- .../schematics/client/tools/FlipTool.java | 10 +- .../client/tools/ISchematicTool.java | 8 +- .../schematics/client/tools/MoveTool.java | 4 +- .../client/tools/PlacementToolBase.java | 2 +- .../schematics/client/tools/RotateTool.java | 6 +- .../client/tools/SchematicToolBase.java | 8 +- .../schematics/client/tools/Tools.java | 7 +- .../filtering/SchematicInstances.java | 4 +- .../item/SchematicAndQuillItem.java | 2 +- .../schematics/item/SchematicItem.java | 8 +- .../simibubi/create/events/ClientEvents.java | 29 +- .../simibubi/create/events/CommonEvents.java | 8 +- .../ClientResourceReloadListener.java | 2 - .../create/foundation/block/BigOutlines.java | 6 +- .../foundation/block/BlockStressDefaults.java | 2 +- .../foundation/block/BlockStressValues.java | 9 +- .../foundation/block/CopperBlockSet.java | 5 +- .../foundation/block/ItemUseOverrides.java | 2 +- .../block/WrenchableDirectionalBlock.java | 2 +- .../block/connected/AllCTTypes.java | 2 +- .../foundation/block/connected/CTModel.java | 2 +- .../foundation/command/CouplingCommand.java | 2 +- .../foundation/command/HighlightPacket.java | 4 +- .../foundation/command/KillTPSCommand.java | 24 +- .../foundation/command/PonderCommand.java | 2 +- .../command/SConfigureConfigPacket.java | 8 +- .../create/foundation/config/AllConfigs.java | 1 + .../create/foundation/config/CClient.java | 34 +- .../create/foundation/config/CCommon.java | 2 + .../foundation/config/CCuriosities.java | 2 + .../create/foundation/config/CFluids.java | 2 + .../create/foundation/config/CKinetics.java | 2 + .../create/foundation/config/CLogistics.java | 2 + .../create/foundation/config/CRecipes.java | 2 + .../create/foundation/config/CSchematics.java | 2 + .../create/foundation/config/CServer.java | 2 + .../create/foundation/config/CStress.java | 7 +- .../create/foundation/config/CTrains.java | 8 +- .../create/foundation/config/CWorldGen.java | 5 +- .../create/foundation/config/ConfigBase.java | 192 --- .../config/ui/BaseConfigScreen.java | 27 +- .../foundation/config/ui/ConfigHelper.java | 2 +- .../config/ui/ConfigModListScreen.java | 16 +- .../foundation/config/ui/ConfigScreen.java | 21 +- .../config/ui/ConfigScreenList.java | 20 +- .../config/ui/HintableTextFieldWidget.java | 4 +- .../config/ui/OpenCreateMenuButton.java | 2 +- .../config/ui/SubMenuConfigScreen.java | 42 +- .../config/ui/entries/BooleanEntry.java | 12 +- .../config/ui/entries/EnumEntry.java | 20 +- .../config/ui/entries/NumberEntry.java | 17 +- .../config/ui/entries/SubMenuEntry.java | 6 +- .../config/ui/entries/ValueEntry.java | 14 +- .../foundation/data/AllLangPartials.java | 7 +- .../create/foundation/data/BlockStateGen.java | 6 +- .../create/foundation/data/LangMerger.java | 4 +- .../foundation/data/recipe/CompatMetals.java | 2 +- .../data/recipe/CrushingRecipeGen.java | 2 +- .../data/recipe/LogStrippingFakeRecipes.java | 4 +- .../data/recipe/StandardRecipeGen.java | 2 +- .../foundation/fluid/CombinedTankWrapper.java | 3 +- .../create/foundation/fluid/FluidHelper.java | 8 +- .../foundation/fluid/FluidRenderer.java | 159 +-- .../foundation/gui/AbstractSimiScreen.java | 169 --- .../create/foundation/gui/AllGuiTextures.java | 56 +- .../create/foundation/gui/AllIcons.java | 6 +- .../foundation/gui/ConfirmationScreen.java | 230 ---- .../foundation/gui/CreateMainMenuScreen.java | 30 +- .../gui/CustomLightingSettings.java | 2 + .../foundation/gui/ILightingSettings.java | 12 - .../create/foundation/gui/ModularGuiLine.java | 5 +- .../foundation/gui/ModularGuiLineBuilder.java | 10 +- .../create/foundation/gui/ScreenOpener.java | 101 -- .../simibubi/create/foundation/gui/Theme.java | 235 ---- .../gui/TickableGuiEventListener.java | 7 - .../create/foundation/gui/UIRenderHelper.java | 322 ------ .../AbstractSimiContainerScreen.java | 6 +- .../foundation/gui/element/BoxElement.java | 158 --- .../gui/element/CombinedStencilElement.java | 79 -- .../gui/element/DelegatedStencilElement.java | 52 - .../gui/element/GuiGameElement.java | 291 ----- .../gui/element/PartialModelGuiElement.java | 22 + .../foundation/gui/element/RenderElement.java | 89 -- .../foundation/gui/element/ScreenElement.java | 13 - .../gui/element/StencilElement.java | 52 - .../gui/element/TextStencilElement.java | 79 -- .../gui/widget/AbstractSimiWidget.java | 100 -- .../foundation/gui/widget/BoxWidget.java | 223 ---- .../foundation/gui/widget/ElementWidget.java | 156 --- .../foundation/gui/widget/IconButton.java | 7 +- .../foundation/gui/widget/Indicator.java | 3 +- .../create/foundation/gui/widget/Label.java | 7 +- .../foundation/gui/widget/ScrollInput.java | 9 +- .../gui/widget/SelectionScrollInput.java | 4 +- .../foundation/gui/widget/TooltipArea.java | 1 + .../foundation/item/CountedItemStackList.java | 2 +- .../foundation/item/ItemDescription.java | 45 +- .../create/foundation/item/ItemHelper.java | 2 +- .../create/foundation/item/TooltipHelper.java | 137 +-- .../item/render/PartialItemModelRenderer.java | 2 +- .../create/foundation/mixin/CameraMixin.java | 2 +- .../mixin/ModelDataRefreshMixin.java | 3 +- .../foundation/mixin/WindowResizeMixin.java | 28 - .../mixin/accessor/GameRendererAccessor.java | 13 - .../accessor/ParticleEngineAccessor.java | 17 - ...onderIndex.java => CreatePonderIndex.java} | 186 +-- .../foundation/ponder/CreatePonderTag.java | 93 ++ .../foundation/ponder/CreateSceneBuilder.java | 341 ++++++ .../ponder/CreateSharedPonderText.java | 26 + .../create/foundation/ponder/ElementLink.java | 29 - .../foundation/ponder/PonderChapter.java | 55 - .../ponder/PonderChapterRegistry.java | 60 - .../foundation/ponder/PonderLocalization.java | 203 ---- .../foundation/ponder/PonderPalette.java | 36 - .../ponder/PonderRegistrationHelper.java | 108 -- .../foundation/ponder/PonderRegistry.java | 121 -- .../create/foundation/ponder/PonderScene.java | 589 ---------- .../ponder/PonderStoryBoardEntry.java | 84 -- .../create/foundation/ponder/PonderTag.java | 184 --- .../foundation/ponder/PonderTagRegistry.java | 122 -- .../ponder/PonderTooltipHandler.java | 178 --- .../create/foundation/ponder/PonderWorld.java | 355 ------ .../ponder/PonderWorldParticles.java | 104 -- .../foundation/ponder/PonderWorldTileFix.java | 45 + .../foundation/ponder/SceneBuilder.java | 890 -------------- .../foundation/ponder/SceneBuildingUtil.java | 119 -- .../create/foundation/ponder/Selection.java | 155 --- .../foundation/ponder/content/ArmScenes.java | 35 +- .../ponder/content/BearingScenes.java | 45 +- .../foundation/ponder/content/BeltScenes.java | 40 +- .../ponder/content/CartAssemblerScenes.java | 36 +- .../ponder/content/ChainDriveScenes.java | 34 +- .../ponder/content/ChassisScenes.java | 35 +- .../ponder/content/ChuteScenes.java | 30 +- .../ponder/content/CrafterScenes.java | 44 +- .../ponder/content/DebugScenes.java | 451 -------- .../ponder/content/DeployerScenes.java | 38 +- .../ponder/content/DisplayScenes.java | 32 +- .../ponder/content/EjectorScenes.java | 37 +- .../foundation/ponder/content/FanScenes.java | 31 +- .../ponder/content/FunnelScenes.java | 33 +- .../ponder/content/GantryScenes.java | 31 +- .../ponder/content/ItemVaultScenes.java | 20 +- .../ponder/content/KineticsScenes.java | 69 +- .../ponder/content/MechanicalDrillScenes.java | 25 +- .../ponder/content/MechanicalSawScenes.java | 28 +- .../ponder/content/MovementActorScenes.java | 39 +- .../ponder/content/PistonScenes.java | 32 +- .../ponder/content/ProcessingScenes.java | 45 +- .../ponder/content/PulleyScenes.java | 28 +- .../ponder/content/RedstoneScenes.java | 28 +- .../ponder/content/RedstoneScenes2.java | 19 +- .../foundation/ponder/content/SharedText.java | 38 - .../ponder/content/SteamScenes.java | 24 +- .../ponder/content/TemplateScenes.java | 12 +- .../ponder/content/TunnelScenes.java | 34 +- .../ponder/content/fluid/DrainScenes.java | 18 +- .../fluid/FluidMovementActorScenes.java | 22 +- .../ponder/content/fluid/FluidTankScenes.java | 30 +- .../content/fluid/HosePulleyScenes.java | 22 +- .../ponder/content/fluid/PipeScenes.java | 36 +- .../ponder/content/fluid/PumpScenes.java | 30 +- .../ponder/content/fluid/SpoutScenes.java | 24 +- .../content/trains/TrackObserverScenes.java | 24 +- .../ponder/content/trains/TrackScenes.java | 33 +- .../ponder/content/trains/TrainScenes.java | 29 +- .../content/trains/TrainSignalScenes.java | 38 +- .../content/trains/TrainStationScenes.java | 31 +- .../element/AnimatedOverlayElement.java | 29 - .../ponder/element/AnimatedSceneElement.java | 85 -- .../ponder/element/BeltItemElement.java | 2 + .../ponder/element/EntityElement.java | 16 - .../ponder/element/ExpandedParrotElement.java | 48 + .../ponder/element/InputWindowElement.java | 149 --- .../ponder/element/MinecartElement.java | 113 -- .../ponder/element/OutlinerElement.java | 35 - .../ponder/element/ParrotElement.java | 272 ----- .../ponder/element/PonderElement.java | 23 - .../ponder/element/PonderOverlayElement.java | 13 - .../ponder/element/PonderSceneElement.java | 17 - .../ponder/element/TextWindowElement.java | 155 --- .../ponder/element/TrackedElement.java | 42 - .../ponder/element/WorldSectionElement.java | 462 -------- .../ponder/element/package-info.java | 9 + .../instruction/AnimateBogeyInstruction.java | 5 - .../AnimateElementInstruction.java | 58 - .../AnimateMinecartInstruction.java | 28 - .../instruction/AnimateParrotInstruction.java | 28 - .../AnimateTileEntityInstruction.java | 9 +- .../AnimateWorldSectionInstruction.java | 29 - .../instruction/ChaseAABBInstruction.java | 30 - .../CreateMinecartInstruction.java | 18 - .../instruction/CreateParrotInstruction.java | 18 - .../ponder/instruction/DelayInstruction.java | 9 - .../DisplayWorldSectionInstruction.java | 59 - .../instruction/EmitParticlesInstruction.java | 56 - .../instruction/FadeInOutInstruction.java | 49 - .../instruction/FadeIntoSceneInstruction.java | 55 - .../FadeOutOfSceneInstruction.java | 48 - .../instruction/HideAllInstruction.java | 55 - .../HighlightValueBoxInstruction.java | 31 - .../instruction/KeyframeInstruction.java | 28 - .../ponder/instruction/LineInstruction.java | 32 - .../MarkAsFinishedInstruction.java | 22 - .../instruction/MovePoiInstruction.java | 25 - .../OutlineSelectionInstruction.java | 28 - .../ponder/instruction/PonderInstruction.java | 45 - .../instruction/ReplaceBlocksInstruction.java | 47 - .../instruction/RotateSceneInstruction.java | 33 - .../instruction/ShowInputInstruction.java | 31 - .../ponder/instruction/TextInstruction.java | 56 - .../instruction/TickingInstruction.java | 49 - .../TileEntityDataInstruction.java | 49 - .../instruction/WorldModifyInstruction.java | 31 - .../ponder/instruction/package-info.java | 9 + .../foundation/ponder/package-info.java | 9 + .../foundation/ponder/ui/ChapterLabel.java | 47 - .../foundation/ponder/ui/LayoutHelper.java | 118 -- .../ponder/ui/NavigatableSimiScreen.java | 255 ---- .../foundation/ponder/ui/PonderButton.java | 135 --- .../ponder/ui/PonderIndexScreen.java | 226 ---- .../ponder/ui/PonderProgressBar.java | 177 --- .../ponder/ui/PonderTagIndexScreen.java | 242 ---- .../foundation/ponder/ui/PonderTagScreen.java | 363 ------ .../create/foundation/ponder/ui/PonderUI.java | 1026 ----------------- .../foundation/render/CachedBufferer.java | 2 +- .../create/foundation/render/RenderTypes.java | 41 - .../foundation/render/SuperByteBuffer.java | 2 +- .../render/SuperRenderTypeBuffer.java | 95 -- .../render/TileEntityRenderHelper.java | 2 +- .../foundation/sound/RepeatingSound.java | 3 +- .../create/foundation/sound/SoundScape.java | 4 +- .../create/foundation/sound/SoundScapes.java | 6 +- .../tileEntity/SmartTileEntity.java | 5 +- .../CenteredSideValueBoxTransform.java | 5 +- .../tileEntity/behaviour/ValueBox.java | 17 +- .../behaviour/ValueBoxTransform.java | 4 +- .../TransportedItemStackHandlerBehaviour.java | 2 +- .../EdgeInteractionHandler.java | 2 +- .../EdgeInteractionRenderer.java | 6 +- .../filtering/FilteringBehaviour.java | 2 +- .../behaviour/filtering/FilteringHandler.java | 10 +- .../filtering/FilteringRenderer.java | 16 +- .../filtering/SidedFilteringBehaviour.java | 4 +- .../fluid/SmartFluidTankBehaviour.java | 6 +- .../CapManipulationBehaviourBase.java | 2 +- .../behaviour/linked/LinkBehaviour.java | 2 +- .../behaviour/linked/LinkRenderer.java | 16 +- .../scrollvalue/ScrollValueHandler.java | 2 +- .../scrollvalue/ScrollValueRenderer.java | 8 +- .../foundation/utility/AngleHelper.java | 52 - .../utility/AnimationTickHolder.java | 59 - .../create/foundation/utility/BBHelper.java | 20 - .../create/foundation/utility/BlockFace.java | 52 - .../utility/CameraAngleAnimationService.java | 4 +- .../create/foundation/utility/Color.java | 312 ----- .../create/foundation/utility/Couple.java | 157 --- .../utility/{Lang.java => CreateLang.java} | 52 +- .../foundation/utility/DirectionHelper.java | 82 -- .../create/foundation/utility/DyeHelper.java | 11 +- .../foundation/utility/FilesHelper.java | 1 + .../foundation/utility/FluidFormatter.java | 5 +- .../create/foundation/utility/FontHelper.java | 88 -- .../foundation/utility/IntAttached.java | 61 - .../create/foundation/utility/Iterate.java | 48 - .../foundation/utility/LangBuilder.java | 167 --- .../foundation/utility/LangNumberFormat.java | 33 - .../create/foundation/utility/NBTHelper.java | 111 -- .../create/foundation/utility/Pair.java | 68 -- .../create/foundation/utility/Pointing.java | 35 - .../utility/ServerSpeedProvider.java | 4 +- .../create/foundation/utility/TreeCutter.java | 13 +- .../foundation/utility/UniqueLinkedList.java | 102 -- .../create/foundation/utility/VecHelper.java | 346 ------ .../foundation/utility/VoxelShaper.java | 143 --- .../foundation/utility/WorldAttached.java | 43 - .../foundation/utility/WorldHelper.java | 13 - .../foundation/utility/animation/Force.java | 102 -- .../utility/animation/LerpedFloat.java | 150 --- .../utility/animation/PhysicalFloat.java | 90 -- .../utility/ghost/GhostBlockParams.java | 50 - .../utility/ghost/GhostBlockRenderer.java | 142 --- .../foundation/utility/ghost/GhostBlocks.java | 84 -- .../utility/outliner/AABBOutline.java | 101 -- .../utility/outliner/BlockClusterOutline.java | 183 --- .../utility/outliner/ChasingAABBOutline.java | 42 - .../utility/outliner/LineOutline.java | 66 -- .../foundation/utility/outliner/Outline.java | 248 ---- .../foundation/utility/outliner/Outliner.java | 190 --- .../utility/placement/IPlacementHelper.java | 167 --- .../utility/placement/PlacementHelpers.java | 323 ------ .../utility/placement/PlacementOffset.java | 154 --- .../placement/{util => }/PoleHelper.java | 6 +- .../worldWrappers/DummyLevelEntityGetter.java | 41 - .../worldWrappers/DummyStatusListener.java | 23 - .../PlacementSimulationServerWorld.java | 56 - .../utility/worldWrappers/RayTraceWorld.java | 47 - .../worldWrappers/WrappedClientWorld.java | 141 --- .../worldWrappers/WrappedServerWorld.java | 121 -- .../utility/worldWrappers/WrappedWorld.java | 242 ---- .../utility/worldWrappers/package-info.java | 6 - .../foundation/worldgen/AllWorldFeatures.java | 2 +- .../worldgen/ConfigDrivenFeatureEntry.java | 4 +- .../foundation/worldgen/LayerPattern.java | 8 +- .../textures/gui/placement_indicator.png | Bin 835 -> 0 bytes .../assets/create/textures/special/blank.png | Bin 99 -> 0 bytes src/main/resources/create.mixins.json | 9 +- 893 files changed, 4106 insertions(+), 20444 deletions(-) delete mode 100644 src/main/java/com/simibubi/create/content/schematics/SchematicChunkSource.java delete mode 100644 src/main/java/com/simibubi/create/content/schematics/SchematicWorld.java delete mode 100644 src/main/java/com/simibubi/create/foundation/config/ConfigBase.java delete mode 100644 src/main/java/com/simibubi/create/foundation/gui/AbstractSimiScreen.java delete mode 100644 src/main/java/com/simibubi/create/foundation/gui/ConfirmationScreen.java delete mode 100644 src/main/java/com/simibubi/create/foundation/gui/ILightingSettings.java delete mode 100644 src/main/java/com/simibubi/create/foundation/gui/ScreenOpener.java delete mode 100644 src/main/java/com/simibubi/create/foundation/gui/Theme.java delete mode 100644 src/main/java/com/simibubi/create/foundation/gui/TickableGuiEventListener.java delete mode 100644 src/main/java/com/simibubi/create/foundation/gui/UIRenderHelper.java delete mode 100644 src/main/java/com/simibubi/create/foundation/gui/element/BoxElement.java delete mode 100644 src/main/java/com/simibubi/create/foundation/gui/element/CombinedStencilElement.java delete mode 100644 src/main/java/com/simibubi/create/foundation/gui/element/DelegatedStencilElement.java delete mode 100644 src/main/java/com/simibubi/create/foundation/gui/element/GuiGameElement.java create mode 100644 src/main/java/com/simibubi/create/foundation/gui/element/PartialModelGuiElement.java delete mode 100644 src/main/java/com/simibubi/create/foundation/gui/element/RenderElement.java delete mode 100644 src/main/java/com/simibubi/create/foundation/gui/element/ScreenElement.java delete mode 100644 src/main/java/com/simibubi/create/foundation/gui/element/StencilElement.java delete mode 100644 src/main/java/com/simibubi/create/foundation/gui/element/TextStencilElement.java delete mode 100644 src/main/java/com/simibubi/create/foundation/gui/widget/AbstractSimiWidget.java delete mode 100644 src/main/java/com/simibubi/create/foundation/gui/widget/BoxWidget.java delete mode 100644 src/main/java/com/simibubi/create/foundation/gui/widget/ElementWidget.java delete mode 100644 src/main/java/com/simibubi/create/foundation/mixin/WindowResizeMixin.java delete mode 100644 src/main/java/com/simibubi/create/foundation/mixin/accessor/GameRendererAccessor.java delete mode 100644 src/main/java/com/simibubi/create/foundation/mixin/accessor/ParticleEngineAccessor.java rename src/main/java/com/simibubi/create/foundation/ponder/{content/PonderIndex.java => CreatePonderIndex.java} (76%) create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/CreatePonderTag.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/CreateSceneBuilder.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/CreateSharedPonderText.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/ElementLink.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/PonderChapter.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/PonderChapterRegistry.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/PonderLocalization.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/PonderPalette.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/PonderRegistrationHelper.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/PonderStoryBoardEntry.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/PonderTag.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/PonderTagRegistry.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/PonderTooltipHandler.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/PonderWorldParticles.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/PonderWorldTileFix.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/SceneBuildingUtil.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/Selection.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/content/SharedText.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/element/AnimatedOverlayElement.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/element/AnimatedSceneElement.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/element/EntityElement.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/element/ExpandedParrotElement.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/element/InputWindowElement.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/element/MinecartElement.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/element/OutlinerElement.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/element/ParrotElement.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/element/PonderElement.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/element/PonderOverlayElement.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/element/PonderSceneElement.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/element/TextWindowElement.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/element/TrackedElement.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/element/WorldSectionElement.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/element/package-info.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instruction/AnimateBogeyInstruction.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instruction/AnimateElementInstruction.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instruction/AnimateMinecartInstruction.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instruction/AnimateParrotInstruction.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instruction/AnimateWorldSectionInstruction.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instruction/ChaseAABBInstruction.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instruction/CreateMinecartInstruction.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instruction/CreateParrotInstruction.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instruction/DelayInstruction.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instruction/DisplayWorldSectionInstruction.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instruction/EmitParticlesInstruction.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instruction/FadeInOutInstruction.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instruction/FadeIntoSceneInstruction.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instruction/FadeOutOfSceneInstruction.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instruction/HideAllInstruction.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instruction/HighlightValueBoxInstruction.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instruction/KeyframeInstruction.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instruction/LineInstruction.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instruction/MarkAsFinishedInstruction.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instruction/MovePoiInstruction.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instruction/OutlineSelectionInstruction.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instruction/PonderInstruction.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instruction/ReplaceBlocksInstruction.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instruction/RotateSceneInstruction.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instruction/ShowInputInstruction.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instruction/TextInstruction.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instruction/TickingInstruction.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instruction/TileEntityDataInstruction.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instruction/WorldModifyInstruction.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instruction/package-info.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/package-info.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/ui/ChapterLabel.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/ui/LayoutHelper.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/ui/NavigatableSimiScreen.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/ui/PonderButton.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/ui/PonderIndexScreen.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/ui/PonderProgressBar.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/ui/PonderTagIndexScreen.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/ui/PonderTagScreen.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/ui/PonderUI.java delete mode 100644 src/main/java/com/simibubi/create/foundation/render/SuperRenderTypeBuffer.java delete mode 100644 src/main/java/com/simibubi/create/foundation/utility/AngleHelper.java delete mode 100644 src/main/java/com/simibubi/create/foundation/utility/AnimationTickHolder.java delete mode 100644 src/main/java/com/simibubi/create/foundation/utility/BBHelper.java delete mode 100644 src/main/java/com/simibubi/create/foundation/utility/BlockFace.java delete mode 100644 src/main/java/com/simibubi/create/foundation/utility/Color.java delete mode 100644 src/main/java/com/simibubi/create/foundation/utility/Couple.java rename src/main/java/com/simibubi/create/foundation/utility/{Lang.java => CreateLang.java} (60%) delete mode 100644 src/main/java/com/simibubi/create/foundation/utility/DirectionHelper.java delete mode 100644 src/main/java/com/simibubi/create/foundation/utility/FontHelper.java delete mode 100644 src/main/java/com/simibubi/create/foundation/utility/IntAttached.java delete mode 100644 src/main/java/com/simibubi/create/foundation/utility/Iterate.java delete mode 100644 src/main/java/com/simibubi/create/foundation/utility/LangBuilder.java delete mode 100644 src/main/java/com/simibubi/create/foundation/utility/LangNumberFormat.java delete mode 100644 src/main/java/com/simibubi/create/foundation/utility/NBTHelper.java delete mode 100644 src/main/java/com/simibubi/create/foundation/utility/Pair.java delete mode 100644 src/main/java/com/simibubi/create/foundation/utility/Pointing.java delete mode 100644 src/main/java/com/simibubi/create/foundation/utility/UniqueLinkedList.java delete mode 100644 src/main/java/com/simibubi/create/foundation/utility/VecHelper.java delete mode 100644 src/main/java/com/simibubi/create/foundation/utility/VoxelShaper.java delete mode 100644 src/main/java/com/simibubi/create/foundation/utility/WorldAttached.java delete mode 100644 src/main/java/com/simibubi/create/foundation/utility/WorldHelper.java delete mode 100644 src/main/java/com/simibubi/create/foundation/utility/animation/Force.java delete mode 100644 src/main/java/com/simibubi/create/foundation/utility/animation/LerpedFloat.java delete mode 100644 src/main/java/com/simibubi/create/foundation/utility/animation/PhysicalFloat.java delete mode 100644 src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlockParams.java delete mode 100644 src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlockRenderer.java delete mode 100644 src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlocks.java delete mode 100644 src/main/java/com/simibubi/create/foundation/utility/outliner/AABBOutline.java delete mode 100644 src/main/java/com/simibubi/create/foundation/utility/outliner/BlockClusterOutline.java delete mode 100644 src/main/java/com/simibubi/create/foundation/utility/outliner/ChasingAABBOutline.java delete mode 100644 src/main/java/com/simibubi/create/foundation/utility/outliner/LineOutline.java delete mode 100644 src/main/java/com/simibubi/create/foundation/utility/outliner/Outline.java delete mode 100644 src/main/java/com/simibubi/create/foundation/utility/outliner/Outliner.java delete mode 100644 src/main/java/com/simibubi/create/foundation/utility/placement/IPlacementHelper.java delete mode 100644 src/main/java/com/simibubi/create/foundation/utility/placement/PlacementHelpers.java delete mode 100644 src/main/java/com/simibubi/create/foundation/utility/placement/PlacementOffset.java rename src/main/java/com/simibubi/create/foundation/utility/placement/{util => }/PoleHelper.java (93%) delete mode 100644 src/main/java/com/simibubi/create/foundation/utility/worldWrappers/DummyLevelEntityGetter.java delete mode 100644 src/main/java/com/simibubi/create/foundation/utility/worldWrappers/DummyStatusListener.java delete mode 100644 src/main/java/com/simibubi/create/foundation/utility/worldWrappers/PlacementSimulationServerWorld.java delete mode 100644 src/main/java/com/simibubi/create/foundation/utility/worldWrappers/RayTraceWorld.java delete mode 100644 src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedClientWorld.java delete mode 100644 src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedServerWorld.java delete mode 100644 src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedWorld.java delete mode 100644 src/main/java/com/simibubi/create/foundation/utility/worldWrappers/package-info.java delete mode 100644 src/main/resources/assets/create/textures/gui/placement_indicator.png delete mode 100644 src/main/resources/assets/create/textures/special/blank.png diff --git a/build.gradle b/build.gradle index b5c3bafa48..1ab37b67ae 100644 --- a/build.gradle +++ b/build.gradle @@ -25,7 +25,19 @@ apply plugin: 'org.spongepowered.mixin' boolean dev = System.getenv('RELEASE') == null || System.getenv('RELEASE').equals('false'); // jozu: I use a gradle workspace with both projects. // The project is named Flywheel-Forge, but sub-projects are named by folder. -boolean inWorkspace = findProject(':Flywheel') != null +boolean flywheelInWorkspace = findProject(':Flywheel') != null + +boolean inMultiModWorkspace = rootProject.hasProperty('multiModWorkspace.enabled') +boolean catnipInWorkspace = rootProject.hasProperty('multiModWorkspace.catnip') +boolean ponderInWorkspace = rootProject.hasProperty('multiModWorkspace.ponder') + +if (catnipInWorkspace) { + evaluationDependsOn(":catnip") +} + +if (ponderInWorkspace) { + evaluationDependsOn(":Ponder") +} ext.buildNumber = System.getenv('BUILD_NUMBER') if (buildNumber == null) buildNumber = 'custom' @@ -44,8 +56,18 @@ minecraft { runs { client { workingDirectory project.file('run') + if (inMultiModWorkspace) + ideaModule "createmod.Create.main" + else + ideaModule "Create.main" + arg '-mixin.config=create.mixins.json' arg '-mixin.config=flywheel.mixins.json' + + if (catnipInWorkspace) { + arg '-mixin.config=catnip.mixins.json' + } + //jvmArgs '-XX:+UnlockCommercialFeatures' // uncomment for profiling property 'forge.logging.console.level', 'info' mods { @@ -53,11 +75,25 @@ minecraft { source sourceSets.main } - if (inWorkspace) { + if (flywheelInWorkspace) { flywheel { source project(":Flywheel").sourceSets.main } } + + if (catnipInWorkspace) { + catnip { + source project(":catnip:Common").sourceSets.main + source project(":catnip:Forge").sourceSets.main + } + } + + if (ponderInWorkspace) { + ponder { + source project(":Ponder:Common").sourceSets.main + source project(":Ponder:Forge").sourceSets.main + } + } } } @@ -69,6 +105,20 @@ minecraft { create { source sourceSets.main } + + if (catnipInWorkspace) { + catnip { + source project(":catnip:Common").sourceSets.main + source project(":catnip:Forge").sourceSets.main + } + } + + if (ponderInWorkspace) { + ponder { + source project(":Ponder:Common").sourceSets.main + source project(":Ponder:Forge").sourceSets.main + } + } } } @@ -82,11 +132,18 @@ minecraft { source sourceSets.main } - if (inWorkspace) { + if (flywheelInWorkspace) { flywheel { source project(":Flywheel").sourceSets.main } } + + if (ponderInWorkspace) { + ponder { + source project(":Ponder:Common").sourceSets.main + source project(":Ponder:Forge").sourceSets.main + } + } } } } @@ -152,12 +209,28 @@ dependencies { implementation fg.deobf(registrate) shade registrate - if (inWorkspace) { + if (flywheelInWorkspace) { implementation project(':Flywheel') } else { implementation fg.deobf("com.jozufozu.flywheel:Flywheel-Forge:${flywheel_version}") } + if (catnipInWorkspace) { + implementation project(":catnip:Common") + implementation project(":catnip:Forge") + } else { + //todo + throw new AssertionError() + } + + if (ponderInWorkspace) { + implementation project(":Ponder:Common") + implementation project(":Ponder:Forge") + } else { + //todo + throw new AssertionError() + } + compileOnly fg.deobf("mezz.jei:jei-${jei_minecraft_version}:${jei_version}:api") runtimeOnly fg.deobf("mezz.jei:jei-${jei_minecraft_version}:${jei_version}") diff --git a/src/main/java/com/simibubi/create/AllBlockPartials.java b/src/main/java/com/simibubi/create/AllBlockPartials.java index 674af4f642..2959506a57 100644 --- a/src/main/java/com/simibubi/create/AllBlockPartials.java +++ b/src/main/java/com/simibubi/create/AllBlockPartials.java @@ -6,9 +6,9 @@ import java.util.Map; import com.jozufozu.flywheel.core.PartialModel; import com.simibubi.create.content.contraptions.fluids.FluidTransportBehaviour; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.Lang; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.lang.Lang; import net.minecraft.core.Direction; import net.minecraft.world.item.DyeColor; diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index fc288dde45..142e0dd205 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -231,13 +231,13 @@ import com.simibubi.create.foundation.data.SharedProperties; import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.item.UncontainableBlockItem; import com.simibubi.create.foundation.utility.ColorHandlers; -import com.simibubi.create.foundation.utility.Couple; import com.simibubi.create.foundation.utility.DyeHelper; import com.tterrag.registrate.providers.RegistrateRecipeProvider; import com.tterrag.registrate.providers.loot.RegistrateBlockLootTables; import com.tterrag.registrate.util.DataIngredient; import com.tterrag.registrate.util.entry.BlockEntry; +import net.createmod.catnip.utility.Couple; import net.minecraft.client.renderer.RenderType; import net.minecraft.core.Direction.Axis; import net.minecraft.core.Direction.AxisDirection; diff --git a/src/main/java/com/simibubi/create/AllEntityTypes.java b/src/main/java/com/simibubi/create/AllEntityTypes.java index 1f893325f5..42ddd1ad1b 100644 --- a/src/main/java/com/simibubi/create/AllEntityTypes.java +++ b/src/main/java/com/simibubi/create/AllEntityTypes.java @@ -17,12 +17,12 @@ import com.simibubi.create.content.logistics.trains.entity.CarriageContraptionEn import com.simibubi.create.content.logistics.trains.entity.CarriageContraptionEntityRenderer; import com.simibubi.create.content.logistics.trains.entity.CarriageContraptionInstance; import com.simibubi.create.foundation.data.CreateEntityBuilder; -import com.simibubi.create.foundation.utility.Lang; import com.tterrag.registrate.util.entry.EntityEntry; import com.tterrag.registrate.util.nullness.NonNullConsumer; import com.tterrag.registrate.util.nullness.NonNullFunction; import com.tterrag.registrate.util.nullness.NonNullSupplier; +import net.createmod.catnip.utility.lang.Lang; import net.minecraft.client.renderer.entity.EntityRenderer; import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.world.entity.Entity; diff --git a/src/main/java/com/simibubi/create/AllParticleTypes.java b/src/main/java/com/simibubi/create/AllParticleTypes.java index 722f1b5d25..5e9120583a 100644 --- a/src/main/java/com/simibubi/create/AllParticleTypes.java +++ b/src/main/java/com/simibubi/create/AllParticleTypes.java @@ -12,8 +12,8 @@ import com.simibubi.create.content.contraptions.particle.ICustomParticleData; import com.simibubi.create.content.contraptions.particle.RotationIndicatorParticleData; import com.simibubi.create.content.curiosities.bell.SoulBaseParticle; import com.simibubi.create.content.curiosities.bell.SoulParticle; -import com.simibubi.create.foundation.utility.Lang; +import net.createmod.catnip.utility.lang.Lang; import net.minecraft.client.Minecraft; import net.minecraft.client.particle.ParticleEngine; import net.minecraft.core.particles.ParticleOptions; diff --git a/src/main/java/com/simibubi/create/AllRecipeTypes.java b/src/main/java/com/simibubi/create/AllRecipeTypes.java index 6b9c33f421..5ddce18364 100644 --- a/src/main/java/com/simibubi/create/AllRecipeTypes.java +++ b/src/main/java/com/simibubi/create/AllRecipeTypes.java @@ -25,9 +25,9 @@ import com.simibubi.create.content.contraptions.processing.ProcessingRecipeBuild import com.simibubi.create.content.contraptions.processing.ProcessingRecipeSerializer; import com.simibubi.create.content.curiosities.toolbox.ToolboxDyeingRecipe; import com.simibubi.create.content.curiosities.tools.SandPaperPolishingRecipe; -import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.recipe.IRecipeTypeInfo; +import net.createmod.catnip.utility.lang.Lang; import net.minecraft.core.Registry; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.Container; diff --git a/src/main/java/com/simibubi/create/AllShapes.java b/src/main/java/com/simibubi/create/AllShapes.java index 57ae5e08c3..c30d3f575a 100644 --- a/src/main/java/com/simibubi/create/AllShapes.java +++ b/src/main/java/com/simibubi/create/AllShapes.java @@ -9,8 +9,8 @@ import java.util.function.BiFunction; import com.simibubi.create.content.logistics.block.chute.ChuteShapes; import com.simibubi.create.content.logistics.trains.track.TrackVoxelShapes; -import com.simibubi.create.foundation.utility.VoxelShaper; +import net.createmod.catnip.utility.VoxelShaper; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; import net.minecraft.world.level.block.Block; diff --git a/src/main/java/com/simibubi/create/AllSoundEvents.java b/src/main/java/com/simibubi/create/AllSoundEvents.java index 3835bf89eb..dd0323f69b 100644 --- a/src/main/java/com/simibubi/create/AllSoundEvents.java +++ b/src/main/java/com/simibubi/create/AllSoundEvents.java @@ -12,9 +12,9 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonArray; import com.google.gson.JsonObject; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.Pair; +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.Pair; import net.minecraft.core.Vec3i; import net.minecraft.data.DataGenerator; import net.minecraft.data.DataProvider; diff --git a/src/main/java/com/simibubi/create/AllSpecialTextures.java b/src/main/java/com/simibubi/create/AllSpecialTextures.java index f697d04d6a..03a1424053 100644 --- a/src/main/java/com/simibubi/create/AllSpecialTextures.java +++ b/src/main/java/com/simibubi/create/AllSpecialTextures.java @@ -1,12 +1,10 @@ package com.simibubi.create; -import com.mojang.blaze3d.systems.RenderSystem; - +import net.createmod.catnip.render.BindableTexture; import net.minecraft.resources.ResourceLocation; -public enum AllSpecialTextures { +public enum AllSpecialTextures implements BindableTexture { - BLANK("blank.png"), CHECKERED("checkerboard.png"), THIN_CHECKERED("thin_checkerboard.png"), CUTOUT_CHECKERED("cutout_checkerboard.png"), @@ -17,18 +15,14 @@ public enum AllSpecialTextures { ; public static final String ASSET_PATH = "textures/special/"; - private ResourceLocation location; + private final ResourceLocation location; - private AllSpecialTextures(String filename) { + AllSpecialTextures(String filename) { location = Create.asResource(ASSET_PATH + filename); } - public void bind() { - RenderSystem.setShaderTexture(0, location); - } - public ResourceLocation getLocation() { return location; } -} \ No newline at end of file +} diff --git a/src/main/java/com/simibubi/create/AllSpriteShifts.java b/src/main/java/com/simibubi/create/AllSpriteShifts.java index 31abb134d7..2e33669c38 100644 --- a/src/main/java/com/simibubi/create/AllSpriteShifts.java +++ b/src/main/java/com/simibubi/create/AllSpriteShifts.java @@ -11,8 +11,8 @@ import com.simibubi.create.foundation.block.connected.CTSpriteShifter; import com.simibubi.create.foundation.block.connected.CTType; import com.simibubi.create.foundation.block.render.SpriteShiftEntry; import com.simibubi.create.foundation.block.render.SpriteShifter; -import com.simibubi.create.foundation.utility.Couple; +import net.createmod.catnip.utility.Couple; import net.minecraft.world.item.DyeColor; import net.minecraft.world.level.block.state.properties.WoodType; diff --git a/src/main/java/com/simibubi/create/AllTags.java b/src/main/java/com/simibubi/create/AllTags.java index 7a228a6112..3da108c32d 100644 --- a/src/main/java/com/simibubi/create/AllTags.java +++ b/src/main/java/com/simibubi/create/AllTags.java @@ -8,12 +8,12 @@ import java.util.Collections; import com.simibubi.create.foundation.data.CreateRegistrate; import com.simibubi.create.foundation.data.recipe.Mods; -import com.simibubi.create.foundation.utility.Lang; import com.tterrag.registrate.builders.BlockBuilder; import com.tterrag.registrate.builders.ItemBuilder; import com.tterrag.registrate.providers.ProviderType; import com.tterrag.registrate.util.nullness.NonNullFunction; +import net.createmod.catnip.utility.lang.Lang; import net.minecraft.data.tags.TagsProvider.TagAppender; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.BlockTags; @@ -445,7 +445,7 @@ public class AllTags { strippedWoodCompat(Mods.BOP, "fir", "redwood", "cherry", "mahogany", "jacaranda", "palm", "willow", "dead", "magic", "umbran", "hellbark"); strippedWoodCompat(Mods.BSK, "bluebright", "starlit", "frostbright", "lunar", "dusk", "maple", "cherry"); - + AllItemTags.MODDED_STRIPPED_LOGS.addOptional(Mods.BYG, "stripped_bulbis_stem"); AllItemTags.MODDED_STRIPPED_WOOD.addOptional(Mods.BYG, "stripped_bulbis_wood"); diff --git a/src/main/java/com/simibubi/create/CreateClient.java b/src/main/java/com/simibubi/create/CreateClient.java index 5b847be56b..7c5eaad2b1 100644 --- a/src/main/java/com/simibubi/create/CreateClient.java +++ b/src/main/java/com/simibubi/create/CreateClient.java @@ -20,17 +20,18 @@ import com.simibubi.create.content.schematics.client.SchematicAndQuillHandler; import com.simibubi.create.content.schematics.client.SchematicHandler; import com.simibubi.create.foundation.ClientResourceReloadListener; import com.simibubi.create.foundation.config.AllConfigs; -import com.simibubi.create.foundation.gui.UIRenderHelper; -import com.simibubi.create.foundation.ponder.content.PonderIndex; -import com.simibubi.create.foundation.ponder.element.WorldSectionElement; +import com.simibubi.create.foundation.ponder.CreatePonderIndex; +import com.simibubi.create.foundation.ponder.CreatePonderTag; +import com.simibubi.create.foundation.ponder.CreateSharedPonderText; +import com.simibubi.create.foundation.ponder.PonderWorldTileFix; import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.render.CreateContexts; import com.simibubi.create.foundation.render.SuperByteBufferCache; import com.simibubi.create.foundation.utility.ModelSwapper; import com.simibubi.create.foundation.utility.ShippedResourcePacks; -import com.simibubi.create.foundation.utility.ghost.GhostBlocks; -import com.simibubi.create.foundation.utility.outliner.Outliner; +import net.createmod.ponder.foundation.PonderIndex; +import net.createmod.ponder.foundation.PonderWorld; import net.minecraft.ChatFormatting; import net.minecraft.client.GraphicsStatus; import net.minecraft.client.Minecraft; @@ -48,8 +49,7 @@ import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; public class CreateClient { public static final SuperByteBufferCache BUFFER_CACHE = new SuperByteBufferCache(); - public static final Outliner OUTLINER = new Outliner(); - public static final GhostBlocks GHOST_BLOCKS = new GhostBlocks(); + //public static final Outliner OUTLINER = new Outliner(); public static final ModelSwapper MODEL_SWAPPER = new ModelSwapper(); public static final CasingConnectivity CASING_CONNECTIVITY = new CasingConnectivity(); @@ -75,6 +75,8 @@ public class CreateClient { ZAPPER_RENDER_HANDLER.registerListeners(forgeEventBus); POTATO_CANNON_RENDER_HANDLER.registerListeners(forgeEventBus); + + CreateSharedPonderText.loadClass(); } public static void clientInit(final FMLClientSetupEvent event) { @@ -83,7 +85,6 @@ public class CreateClient { BUFFER_CACHE.registerCompartment(CachedBufferer.DIRECTIONAL_PARTIAL); BUFFER_CACHE.registerCompartment(KineticTileEntityRenderer.KINETIC_TILE); BUFFER_CACHE.registerCompartment(SBBContraptionManager.CONTRAPTION, 20); - BUFFER_CACHE.registerCompartment(WorldSectionElement.DOC_WORLD_SECTION, 20); ShippedResourcePacks.extractFiles("Copper Legacy Pack"); @@ -92,12 +93,13 @@ public class CreateClient { AllBlockPartials.init(); AllStitchedTextures.init(); - PonderIndex.register(); - PonderIndex.registerTags(); + CreatePonderIndex.register(); + CreatePonderIndex.registerTags(); + PonderIndex.addIndex(CreatePonderIndex::register); + PonderIndex.addIndex(CreatePonderTag::register); + PonderWorld.onRestore(PonderWorldTileFix::fixControllerTiles); registerOverlays(); - - UIRenderHelper.init(); } private static void registerOverlays() { diff --git a/src/main/java/com/simibubi/create/api/connectivity/ConnectivityHandler.java b/src/main/java/com/simibubi/create/api/connectivity/ConnectivityHandler.java index a840bb8d8c..811d8932d4 100644 --- a/src/main/java/com/simibubi/create/api/connectivity/ConnectivityHandler.java +++ b/src/main/java/com/simibubi/create/api/connectivity/ConnectivityHandler.java @@ -15,8 +15,8 @@ import org.apache.commons.lang3.tuple.Pair; import com.simibubi.create.content.contraptions.fluids.tank.CreativeFluidTankTileEntity; import com.simibubi.create.foundation.tileEntity.IMultiTileContainer; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.BlockGetter; @@ -316,13 +316,13 @@ public class ConnectivityHandler { for (int yOffset = 0; yOffset < height; yOffset++) { for (int xOffset = 0; xOffset < width; xOffset++) { for (int zOffset = 0; zOffset < width; zOffset++) { - + BlockPos pos = switch (axis) { case X -> origin.offset(yOffset, xOffset, zOffset); case Y -> origin.offset(xOffset, yOffset, zOffset); case Z -> origin.offset(xOffset, zOffset, yOffset); }; - + T partAt = partAt(be.getType(), level, pos); if (partAt == null) continue; @@ -354,19 +354,19 @@ public class ConnectivityHandler { frontier.add(partAt); partAt.preventConnectivityUpdate(); } - if (cache != null) + if (cache != null) cache.put(pos, partAt); } } } - + if (be instanceof IMultiTileContainer.Inventory iinv && iinv.hasInventory()) be.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) .invalidate(); if (be instanceof IMultiTileContainer.Fluid ifluid && ifluid.hasTank()) be.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) .invalidate(); - + if (tryReconnect) formMulti(be.getType(), level, cache == null ? new SearchCache<>() : cache, frontier); } diff --git a/src/main/java/com/simibubi/create/compat/Mods.java b/src/main/java/com/simibubi/create/compat/Mods.java index 52201bb24a..bccf79f7ce 100644 --- a/src/main/java/com/simibubi/create/compat/Mods.java +++ b/src/main/java/com/simibubi/create/compat/Mods.java @@ -3,8 +3,7 @@ package com.simibubi.create.compat; import java.util.Optional; import java.util.function.Supplier; -import com.simibubi.create.foundation.utility.Lang; - +import net.createmod.catnip.utility.lang.Lang; import net.minecraftforge.fml.ModList; /** diff --git a/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java b/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java index 8bb25ddff9..e35e3e7469 100644 --- a/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java +++ b/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java @@ -53,7 +53,6 @@ import com.simibubi.create.content.logistics.item.filter.AbstractFilterScreen; import com.simibubi.create.content.logistics.trains.management.schedule.ScheduleScreen; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.config.CRecipes; -import com.simibubi.create.foundation.config.ConfigBase.ConfigBool; import com.simibubi.create.foundation.data.recipe.LogStrippingFakeRecipes; import com.simibubi.create.foundation.gui.container.AbstractSimiContainerScreen; import com.simibubi.create.foundation.utility.recipe.IRecipeTypeInfo; @@ -69,6 +68,7 @@ import mezz.jei.api.registration.IRecipeRegistration; import mezz.jei.api.registration.IRecipeTransferRegistration; import mezz.jei.api.registration.ISubtypeRegistration; import mezz.jei.api.runtime.IIngredientManager; +import net.createmod.catnip.config.ConfigBase.ConfigBool; import net.minecraft.client.Minecraft; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; diff --git a/src/main/java/com/simibubi/create/compat/jei/DoubleItemIcon.java b/src/main/java/com/simibubi/create/compat/jei/DoubleItemIcon.java index 917597d569..d0d764ec06 100644 --- a/src/main/java/com/simibubi/create/compat/jei/DoubleItemIcon.java +++ b/src/main/java/com/simibubi/create/compat/jei/DoubleItemIcon.java @@ -4,9 +4,9 @@ import java.util.function.Supplier; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.foundation.gui.element.GuiGameElement; import mezz.jei.api.gui.drawable.IDrawable; +import net.createmod.catnip.gui.element.GuiGameElement; import net.minecraft.world.item.ItemStack; public class DoubleItemIcon implements IDrawable { diff --git a/src/main/java/com/simibubi/create/compat/jei/PotionFluidSubtypeInterpreter.java b/src/main/java/com/simibubi/create/compat/jei/PotionFluidSubtypeInterpreter.java index ee5d05a6c5..88ad8fd507 100644 --- a/src/main/java/com/simibubi/create/compat/jei/PotionFluidSubtypeInterpreter.java +++ b/src/main/java/com/simibubi/create/compat/jei/PotionFluidSubtypeInterpreter.java @@ -3,10 +3,10 @@ package com.simibubi.create.compat.jei; import java.util.List; import com.simibubi.create.content.contraptions.fluids.potion.PotionFluid.BottleType; -import com.simibubi.create.foundation.utility.NBTHelper; import mezz.jei.api.ingredients.subtypes.IIngredientSubtypeInterpreter; import mezz.jei.api.ingredients.subtypes.UidContext; +import net.createmod.catnip.utility.NBTHelper; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.item.alchemy.Potion; diff --git a/src/main/java/com/simibubi/create/compat/jei/ScreenResourceWrapper.java b/src/main/java/com/simibubi/create/compat/jei/ScreenResourceWrapper.java index bc7bd4aa47..50270bfc31 100644 --- a/src/main/java/com/simibubi/create/compat/jei/ScreenResourceWrapper.java +++ b/src/main/java/com/simibubi/create/compat/jei/ScreenResourceWrapper.java @@ -16,19 +16,19 @@ public class ScreenResourceWrapper implements IDrawable { @Override public int getWidth() { - return resource.width; + return resource.getWidth(); } @Override public int getHeight() { - return resource.height; + return resource.getHeight(); } @Override public void draw(PoseStack matrixStack, int xOffset, int yOffset) { resource.bind(); - GuiComponent.blit(matrixStack, xOffset, yOffset, 0, resource.startX, resource.startY, resource.width, - resource.height, 256, 256); + GuiComponent.blit(matrixStack, xOffset, yOffset, 0, resource.getStartX(), resource.getStartY(), resource.getWidth(), + resource.getHeight(), 256, 256); } } diff --git a/src/main/java/com/simibubi/create/compat/jei/category/BasinCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/BasinCategory.java index e62d7786fa..f00482fb9e 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/BasinCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/BasinCategory.java @@ -17,8 +17,7 @@ import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlo import com.simibubi.create.foundation.fluid.FluidIngredient; import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.item.ItemHelper; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.Pair; +import com.simibubi.create.foundation.utility.CreateLang; import mezz.jei.api.constants.VanillaTypes; import mezz.jei.api.gui.builder.IRecipeLayoutBuilder; @@ -26,6 +25,7 @@ import mezz.jei.api.gui.drawable.IDrawable; import mezz.jei.api.gui.ingredient.IRecipeSlotsView; import mezz.jei.api.recipe.IFocusGroup; import mezz.jei.api.recipe.RecipeIngredientRole; +import net.createmod.catnip.utility.Pair; import net.minecraft.client.Minecraft; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; @@ -136,7 +136,7 @@ public class BasinCategory extends CreateRecipeCategory { AllGuiTextures heatBar = noHeat ? AllGuiTextures.JEI_NO_HEAT_BAR : AllGuiTextures.JEI_HEAT_BAR; heatBar.render(matrixStack, 4, 80); - Minecraft.getInstance().font.draw(matrixStack, Lang.translateDirect(requiredHeat.getTranslationKey()), 9, + Minecraft.getInstance().font.draw(matrixStack, CreateLang.translateDirect(requiredHeat.getTranslationKey()), 9, 86, requiredHeat.getColor()); } diff --git a/src/main/java/com/simibubi/create/compat/jei/category/CreateRecipeCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/CreateRecipeCategory.java index 4ed8d74f9d..af64f25c5e 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/CreateRecipeCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/CreateRecipeCategory.java @@ -18,7 +18,7 @@ import com.simibubi.create.compat.jei.EmptyBackground; import com.simibubi.create.content.contraptions.fluids.potion.PotionFluidHandler; import com.simibubi.create.content.contraptions.processing.ProcessingOutput; import com.simibubi.create.foundation.gui.AllGuiTextures; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import mezz.jei.api.constants.VanillaTypes; import mezz.jei.api.gui.drawable.IDrawable; @@ -77,7 +77,7 @@ public abstract class CreateRecipeCategory> implements IReci @Override public Component getTitle() { - return Lang.translateDirect("recipe." + name); + return CreateLang.translateDirect("recipe." + name); } @Override @@ -125,7 +125,7 @@ public abstract class CreateRecipeCategory> implements IReci return (view, tooltip) -> { float chance = output.getChance(); if (chance != 1) - tooltip.add(1, Lang.translateDirect("recipe.processing.chance", chance < 0.01 ? "<1" : (int) (chance * 100)) + tooltip.add(1, CreateLang.translateDirect("recipe.processing.chance", chance < 0.01 ? "<1" : (int) (chance * 100)) .withStyle(ChatFormatting.GOLD)); }; } @@ -168,7 +168,7 @@ public abstract class CreateRecipeCategory> implements IReci } int amount = mbAmount == -1 ? fluidStack.getAmount() : mbAmount; - Component text = new TextComponent(String.valueOf(amount)).append(Lang.translateDirect("generic.unit.millibuckets")).withStyle(ChatFormatting.GOLD); + Component text = new TextComponent(String.valueOf(amount)).append(CreateLang.translateDirect("generic.unit.millibuckets")).withStyle(ChatFormatting.GOLD); if (tooltip.isEmpty()) tooltip.add(0, text); else { @@ -183,12 +183,12 @@ public abstract class CreateRecipeCategory> implements IReci return new IDrawable() { @Override public int getWidth() { - return texture.width; + return texture.getWidth(); } @Override public int getHeight() { - return texture.height; + return texture.getHeight(); } @Override diff --git a/src/main/java/com/simibubi/create/compat/jei/category/CrushingCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/CrushingCategory.java index b74db89c52..29f0b1f460 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/CrushingCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/CrushingCategory.java @@ -13,12 +13,12 @@ import com.simibubi.create.content.contraptions.components.crusher.AbstractCrush import com.simibubi.create.content.contraptions.processing.ProcessingOutput; import com.simibubi.create.content.contraptions.processing.ProcessingRecipe; import com.simibubi.create.foundation.gui.AllGuiTextures; -import com.simibubi.create.foundation.ponder.ui.LayoutHelper; import mezz.jei.api.gui.builder.IRecipeLayoutBuilder; import mezz.jei.api.gui.ingredient.IRecipeSlotsView; import mezz.jei.api.recipe.IFocusGroup; import mezz.jei.api.recipe.RecipeIngredientRole; +import net.createmod.catnip.utility.layout.LayoutHelper; @ParametersAreNonnullByDefault public class CrushingCategory extends CreateRecipeCategory { diff --git a/src/main/java/com/simibubi/create/compat/jei/category/DeployingCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/DeployingCategory.java index 93f898f5bf..3f943fffa4 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/DeployingCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/DeployingCategory.java @@ -7,7 +7,7 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.compat.jei.category.animations.AnimatedDeployer; import com.simibubi.create.content.contraptions.components.deployer.DeployerApplicationRecipe; import com.simibubi.create.foundation.gui.AllGuiTextures; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import mezz.jei.api.gui.builder.IRecipeLayoutBuilder; import mezz.jei.api.gui.builder.IRecipeSlotBuilder; @@ -47,7 +47,7 @@ public class DeployingCategory extends CreateRecipeCategory tooltip.add(1, Lang.translateDirect("recipe.deploying.not_consumed").withStyle(ChatFormatting.GOLD))); + handItemSlot.addTooltipCallback((recipeSlotView, tooltip) -> tooltip.add(1, CreateLang.translateDirect("recipe.deploying.not_consumed").withStyle(ChatFormatting.GOLD))); } } diff --git a/src/main/java/com/simibubi/create/compat/jei/category/FanBlastingCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/FanBlastingCategory.java index 442d5f4bb2..6e6119a773 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/FanBlastingCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/FanBlastingCategory.java @@ -6,8 +6,8 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllItems; import com.simibubi.create.compat.jei.category.animations.AnimatedKinetics; import com.simibubi.create.foundation.gui.AllGuiTextures; -import com.simibubi.create.foundation.gui.element.GuiGameElement; +import net.createmod.catnip.gui.element.GuiGameElement; import net.minecraft.world.item.Items; import net.minecraft.world.item.crafting.AbstractCookingRecipe; import net.minecraft.world.level.material.Fluids; diff --git a/src/main/java/com/simibubi/create/compat/jei/category/FanHauntingCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/FanHauntingCategory.java index c676a9bb53..a5782b671c 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/FanHauntingCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/FanHauntingCategory.java @@ -7,8 +7,8 @@ import com.simibubi.create.AllItems; import com.simibubi.create.compat.jei.category.animations.AnimatedKinetics; import com.simibubi.create.content.contraptions.components.fan.HauntingRecipe; import com.simibubi.create.foundation.gui.AllGuiTextures; -import com.simibubi.create.foundation.gui.element.GuiGameElement; +import net.createmod.catnip.gui.element.GuiGameElement; import net.minecraft.world.item.Items; import net.minecraft.world.level.block.Blocks; diff --git a/src/main/java/com/simibubi/create/compat/jei/category/FanSmokingCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/FanSmokingCategory.java index c1b32749f6..f114736238 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/FanSmokingCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/FanSmokingCategory.java @@ -6,8 +6,8 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllItems; import com.simibubi.create.compat.jei.category.animations.AnimatedKinetics; import com.simibubi.create.foundation.gui.AllGuiTextures; -import com.simibubi.create.foundation.gui.element.GuiGameElement; +import net.createmod.catnip.gui.element.GuiGameElement; import net.minecraft.world.item.Items; import net.minecraft.world.item.crafting.SmokingRecipe; import net.minecraft.world.level.block.Blocks; diff --git a/src/main/java/com/simibubi/create/compat/jei/category/FanWashingCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/FanWashingCategory.java index eea7ead05a..9dbc12ed95 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/FanWashingCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/FanWashingCategory.java @@ -6,8 +6,8 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllItems; import com.simibubi.create.compat.jei.category.animations.AnimatedKinetics; import com.simibubi.create.content.contraptions.components.fan.SplashingRecipe; -import com.simibubi.create.foundation.gui.element.GuiGameElement; +import net.createmod.catnip.gui.element.GuiGameElement; import net.minecraft.world.item.Items; import net.minecraft.world.level.material.Fluids; diff --git a/src/main/java/com/simibubi/create/compat/jei/category/ItemApplicationCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/ItemApplicationCategory.java index 4533509ebf..a212a4e37b 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/ItemApplicationCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/ItemApplicationCategory.java @@ -10,14 +10,14 @@ import com.simibubi.create.AllItems; import com.simibubi.create.compat.jei.category.animations.AnimatedKinetics; import com.simibubi.create.content.contraptions.processing.ItemApplicationRecipe; import com.simibubi.create.foundation.gui.AllGuiTextures; -import com.simibubi.create.foundation.gui.element.GuiGameElement; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import mezz.jei.api.constants.VanillaTypes; import mezz.jei.api.gui.builder.IRecipeLayoutBuilder; import mezz.jei.api.gui.ingredient.IRecipeSlotsView; import mezz.jei.api.recipe.IFocusGroup; import mezz.jei.api.recipe.RecipeIngredientRole; +import net.createmod.catnip.gui.element.GuiGameElement; import net.minecraft.ChatFormatting; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; @@ -47,7 +47,7 @@ public class ItemApplicationCategory extends CreateRecipeCategory tooltip.add(1, Lang.translateDirect("recipe.deploying.not_consumed") + ? (view, tooltip) -> tooltip.add(1, CreateLang.translateDirect("recipe.deploying.not_consumed") .withStyle(ChatFormatting.GOLD)) : (view, tooltip) -> {} ); diff --git a/src/main/java/com/simibubi/create/compat/jei/category/PolishingCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/PolishingCategory.java index 8f44662e5c..52c365a52c 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/PolishingCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/PolishingCategory.java @@ -7,12 +7,12 @@ import com.simibubi.create.AllItems; import com.simibubi.create.content.contraptions.processing.ProcessingOutput; import com.simibubi.create.content.curiosities.tools.SandPaperPolishingRecipe; import com.simibubi.create.foundation.gui.AllGuiTextures; -import com.simibubi.create.foundation.gui.element.GuiGameElement; import mezz.jei.api.gui.builder.IRecipeLayoutBuilder; import mezz.jei.api.gui.ingredient.IRecipeSlotsView; import mezz.jei.api.recipe.IFocusGroup; import mezz.jei.api.recipe.RecipeIngredientRole; +import net.createmod.catnip.gui.element.GuiGameElement; import net.minecraft.core.NonNullList; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.ItemStack; diff --git a/src/main/java/com/simibubi/create/compat/jei/category/ProcessingViaFanCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/ProcessingViaFanCategory.java index ed7ee5d9fb..c54df10f2b 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/ProcessingViaFanCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/ProcessingViaFanCategory.java @@ -13,7 +13,7 @@ import com.simibubi.create.compat.jei.category.animations.AnimatedKinetics; import com.simibubi.create.content.contraptions.processing.ProcessingOutput; import com.simibubi.create.content.contraptions.processing.ProcessingRecipe; import com.simibubi.create.foundation.gui.AllGuiTextures; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import mezz.jei.api.gui.builder.IRecipeLayoutBuilder; import mezz.jei.api.gui.drawable.IDrawable; @@ -38,7 +38,7 @@ public abstract class ProcessingViaFanCategory> extends Crea public static Supplier getFan(String name) { return () -> AllBlocks.ENCASED_FAN.asStack() - .setHoverName(Lang.translateDirect("recipe." + name + ".fan").withStyle(style -> style.withItalic(false))); + .setHoverName(CreateLang.translateDirect("recipe." + name + ".fan").withStyle(style -> style.withItalic(false))); } @Override diff --git a/src/main/java/com/simibubi/create/compat/jei/category/SequencedAssemblyCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/SequencedAssemblyCategory.java index f1c00c5ecd..b2d4861964 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/SequencedAssemblyCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/SequencedAssemblyCategory.java @@ -17,7 +17,7 @@ import com.simibubi.create.content.contraptions.itemAssembly.SequencedAssemblyRe import com.simibubi.create.content.contraptions.itemAssembly.SequencedRecipe; import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllIcons; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import mezz.jei.api.gui.builder.IRecipeLayoutBuilder; import mezz.jei.api.gui.ingredient.IRecipeSlotsView; @@ -63,7 +63,7 @@ public class SequencedAssemblyCategory extends CreateRecipeCategory getTooltipStrings(SequencedAssemblyRecipe recipe, IRecipeSlotsView iRecipeSlotsView, double mouseX, double mouseY) { List tooltip = new ArrayList<>(); - TranslatableComponent junk = Lang.translateDirect("recipe.assembly.junk"); + TranslatableComponent junk = CreateLang.translateDirect("recipe.assembly.junk"); boolean singleOutput = recipe.getOutputChance() == 1; boolean willRepeat = recipe.getLoops() > 1; @@ -164,7 +164,7 @@ public class SequencedAssemblyCategory extends CreateRecipeCategory= minX && mouseX < maxX && mouseY >= minY && mouseY < maxY) { float chance = recipe.getOutputChance(); tooltip.add(junk); - tooltip.add(Lang.translateDirect("recipe.processing.chance", chance < 0.01 ? "<1" : 100 - (int) (chance * 100)) + tooltip.add(CreateLang.translateDirect("recipe.processing.chance", chance < 0.01 ? "<1" : 100 - (int) (chance * 100)) .withStyle(ChatFormatting.GOLD)); return tooltip; } @@ -174,7 +174,7 @@ public class SequencedAssemblyCategory extends CreateRecipeCategory= minX && mouseX < maxX && mouseY >= minY && mouseY < maxY) { - tooltip.add(Lang.translateDirect("recipe.assembly.repeat", recipe.getLoops())); + tooltip.add(CreateLang.translateDirect("recipe.assembly.repeat", recipe.getLoops())); return tooltip; } @@ -192,7 +192,7 @@ public class SequencedAssemblyCategory extends CreateRecipeCategory sequencedRecipe = sequence.get(i); SequencedAssemblySubCategory subCategory = getSubCategory(sequencedRecipe); if (relativeX >= 0 && relativeX < subCategory.getWidth()) { - tooltip.add(Lang.translateDirect("recipe.assembly.step", i + 1)); + tooltip.add(CreateLang.translateDirect("recipe.assembly.step", i + 1)); tooltip.add(sequencedRecipe.getAsAssemblyRecipe() .getDescriptionForAssembly() .plainCopy() diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedBlazeBurner.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedBlazeBurner.java index 3f76002bff..d34187d97e 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedBlazeBurner.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedBlazeBurner.java @@ -10,8 +10,9 @@ import com.simibubi.create.AllSpriteShifts; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock.HeatLevel; import com.simibubi.create.foundation.block.render.SpriteShiftEntry; import com.simibubi.create.foundation.render.CachedBufferer; -import com.simibubi.create.foundation.utility.AnimationTickHolder; +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.ponder.utility.WorldTickHolder; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.MultiBufferSource; @@ -71,7 +72,7 @@ public class AnimatedBlazeBurner extends AnimatedKinetics { - spriteShift.getTarget() .getV0(); - float time = AnimationTickHolder.getRenderTime(Minecraft.getInstance().level); + float time = WorldTickHolder.getRenderTime(Minecraft.getInstance().level); float speed = 1 / 32f + 1 / 64f * heatLevel.ordinal(); double vScroll = speed * time; diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedDeployer.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedDeployer.java index 218aa985c1..b331b58af9 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedDeployer.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedDeployer.java @@ -5,8 +5,8 @@ import com.mojang.math.Vector3f; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.components.deployer.DeployerBlock; -import com.simibubi.create.foundation.utility.AnimationTickHolder; +import net.createmod.catnip.utility.AnimationTickHolder; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedItemDrain.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedItemDrain.java index 1c7e569130..21b4722a2f 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedItemDrain.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedItemDrain.java @@ -5,8 +5,8 @@ import com.mojang.blaze3d.vertex.Tesselator; import com.mojang.math.Vector3f; import com.simibubi.create.AllBlocks; import com.simibubi.create.foundation.fluid.FluidRenderer; -import com.simibubi.create.foundation.gui.UIRenderHelper; +import net.createmod.catnip.gui.UIRenderHelper; import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.MultiBufferSource.BufferSource; diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedKinetics.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedKinetics.java index b78a6672af..e4fe8aa33b 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedKinetics.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedKinetics.java @@ -4,17 +4,18 @@ import com.jozufozu.flywheel.core.PartialModel; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlocks; import com.simibubi.create.foundation.gui.CustomLightingSettings; -import com.simibubi.create.foundation.gui.ILightingSettings; -import com.simibubi.create.foundation.gui.element.GuiGameElement; -import com.simibubi.create.foundation.utility.AnimationTickHolder; +import com.simibubi.create.foundation.gui.element.PartialModelGuiElement; import mezz.jei.api.gui.drawable.IDrawable; +import net.createmod.catnip.gui.ILightingSettings; +import net.createmod.catnip.gui.element.GuiGameElement; +import net.createmod.catnip.utility.AnimationTickHolder; import net.minecraft.core.Direction.Axis; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockStateProperties; public abstract class AnimatedKinetics implements IDrawable { - + public int offset = 0; public static final ILightingSettings DEFAULT_LIGHTING = CustomLightingSettings.builder() @@ -36,7 +37,7 @@ public abstract class AnimatedKinetics implements IDrawable { * Use {@link #blockElement(PartialModel)} if calling from inside a subclass. */ public static GuiGameElement.GuiRenderBuilder defaultBlockElement(PartialModel partial) { - return GuiGameElement.of(partial) + return PartialModelGuiElement.of(partial) .lighting(DEFAULT_LIGHTING); } diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedMixer.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedMixer.java index fa041a4187..87600cd94b 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedMixer.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedMixer.java @@ -4,8 +4,8 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Vector3f; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlocks; -import com.simibubi.create.foundation.utility.AnimationTickHolder; +import net.createmod.catnip.utility.AnimationTickHolder; import net.minecraft.util.Mth; public class AnimatedMixer extends AnimatedKinetics { diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedPress.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedPress.java index 26b0c10613..873c29b008 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedPress.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedPress.java @@ -4,8 +4,8 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Vector3f; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlocks; -import com.simibubi.create.foundation.utility.AnimationTickHolder; +import net.createmod.catnip.utility.AnimationTickHolder; import net.minecraft.core.Direction.Axis; public class AnimatedPress extends AnimatedKinetics { diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSpout.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSpout.java index faac26a706..86017412af 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSpout.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSpout.java @@ -9,9 +9,9 @@ import com.mojang.math.Vector3f; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlocks; import com.simibubi.create.foundation.fluid.FluidRenderer; -import com.simibubi.create.foundation.gui.UIRenderHelper; -import com.simibubi.create.foundation.utility.AnimationTickHolder; +import net.createmod.catnip.gui.UIRenderHelper; +import net.createmod.catnip.utility.AnimationTickHolder; import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.MultiBufferSource.BufferSource; diff --git a/src/main/java/com/simibubi/create/compat/jei/category/sequencedAssembly/SequencedAssemblySubCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/sequencedAssembly/SequencedAssemblySubCategory.java index 8e70946eb6..5476bd1220 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/sequencedAssembly/SequencedAssemblySubCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/sequencedAssembly/SequencedAssemblySubCategory.java @@ -9,7 +9,7 @@ import com.simibubi.create.compat.jei.category.animations.AnimatedSpout; import com.simibubi.create.content.contraptions.components.deployer.DeployerApplicationRecipe; import com.simibubi.create.content.contraptions.itemAssembly.SequencedRecipe; import com.simibubi.create.foundation.fluid.FluidIngredient; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import mezz.jei.api.constants.VanillaTypes; import mezz.jei.api.gui.builder.IRecipeLayoutBuilder; @@ -111,7 +111,7 @@ public abstract class SequencedAssemblySubCategory { if (recipe.getAsAssemblyRecipe() instanceof DeployerApplicationRecipe deployerRecipe && deployerRecipe.shouldKeepHeldItem()) { slot.addTooltipCallback( - (recipeSlotView, tooltip) -> tooltip.add(1, Lang.translateDirect("recipe.deploying.not_consumed").withStyle(ChatFormatting.GOLD)) + (recipeSlotView, tooltip) -> tooltip.add(1, CreateLang.translateDirect("recipe.deploying.not_consumed").withStyle(ChatFormatting.GOLD)) ); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/KineticDebugger.java b/src/main/java/com/simibubi/create/content/contraptions/KineticDebugger.java index 4bf664f29d..2fc6a546e4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/KineticDebugger.java +++ b/src/main/java/com/simibubi/create/content/contraptions/KineticDebugger.java @@ -5,9 +5,10 @@ import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.config.AllConfigs; -import com.simibubi.create.foundation.utility.Color; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.CatnipClient; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.theme.Color; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.core.BlockPos; @@ -44,7 +45,7 @@ public class KineticDebugger { .getBlockSupportShape(world, toOutline); if (te.getTheoreticalSpeed() != 0 && !shape.isEmpty()) - CreateClient.OUTLINER.chaseAABB("kineticSource", shape.bounds() + CatnipClient.OUTLINER.chaseAABB("kineticSource", shape.bounds() .move(toOutline)) .lineWidth(1 / 16f) .colored(te.hasSource() ? Color.generateFromLong(te.network).getRGB() : 0xffcc00); @@ -54,7 +55,7 @@ public class KineticDebugger { Vec3 vec = Vec3.atLowerCornerOf(Direction.get(AxisDirection.POSITIVE, axis) .getNormal()); Vec3 center = VecHelper.getCenterOf(te.getBlockPos()); - CreateClient.OUTLINER.showLine("rotationAxis", center.add(vec), center.subtract(vec)) + CatnipClient.OUTLINER.showLine("rotationAxis", center.add(vec), center.subtract(vec)) .lineWidth(1 / 16f); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/RotationPropagator.java b/src/main/java/com/simibubi/create/content/contraptions/RotationPropagator.java index 7b0bd897f1..9b15ed2416 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/RotationPropagator.java +++ b/src/main/java/com/simibubi/create/content/contraptions/RotationPropagator.java @@ -17,8 +17,8 @@ import com.simibubi.create.content.contraptions.relays.encased.EncasedBeltBlock; import com.simibubi.create.content.contraptions.relays.encased.SplitShaftTileEntity; import com.simibubi.create.content.contraptions.relays.gearbox.GearboxTileEntity; import com.simibubi.create.foundation.config.AllConfigs; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -36,7 +36,7 @@ public class RotationPropagator { * Determines the change in rotation between two attached kinetic entities. For * instance, an axis connection returns 1 while a 1-to-1 gear connection * reverses the rotation and therefore returns -1. - * + * * @param from * @param to * @return @@ -201,7 +201,7 @@ public class RotationPropagator { /** * Insert the added position to the kinetic network. - * + * * @param worldIn * @param pos */ @@ -215,7 +215,7 @@ public class RotationPropagator { /** * Search for sourceless networks attached to the given entity and update them. - * + * * @param currentTE */ private static void propagateNewSource(KineticTileEntity currentTE) { @@ -230,7 +230,7 @@ public class RotationPropagator { if (newSpeed == 0 && oppositeSpeed == 0) continue; - + boolean incompatible = Math.signum(newSpeed) != Math.signum(speedOfNeighbour) && (newSpeed != 0 && speedOfNeighbour != 0); @@ -300,7 +300,7 @@ public class RotationPropagator { /** * Remove the given entity from the network. - * + * * @param worldIn * @param pos * @param removedTE @@ -333,7 +333,7 @@ public class RotationPropagator { /** * Clear the entire subnetwork depending on the given entity and find a new * source - * + * * @param updateTE */ private static void propagateMissingSource(KineticTileEntity updateTE) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/TorquePropagator.java b/src/main/java/com/simibubi/create/content/contraptions/TorquePropagator.java index ecaac86c3e..008d115c63 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/TorquePropagator.java +++ b/src/main/java/com/simibubi/create/content/contraptions/TorquePropagator.java @@ -5,8 +5,8 @@ import java.util.Map; import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.base.KineticTileEntity; -import com.simibubi.create.foundation.utility.WorldHelper; +import net.createmod.catnip.utility.WorldHelper; import net.minecraft.world.level.LevelAccessor; public class TorquePropagator { diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/DirectionalAxisKineticBlock.java b/src/main/java/com/simibubi/create/content/contraptions/base/DirectionalAxisKineticBlock.java index 9de9138d86..c52216273d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/DirectionalAxisKineticBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/DirectionalAxisKineticBlock.java @@ -1,8 +1,7 @@ package com.simibubi.create.content.contraptions.base; -import com.simibubi.create.foundation.utility.DirectionHelper; -import com.simibubi.create.foundation.utility.Iterate; - +import net.createmod.catnip.utility.DirectionHelper; +import net.createmod.catnip.utility.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/DirectionalKineticBlock.java b/src/main/java/com/simibubi/create/content/contraptions/base/DirectionalKineticBlock.java index 219643025e..8b5b278833 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/DirectionalKineticBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/DirectionalKineticBlock.java @@ -1,7 +1,6 @@ package com.simibubi.create.content.contraptions.base; -import com.simibubi.create.foundation.utility.Iterate; - +import net.createmod.catnip.utility.Iterate; import net.minecraft.core.Direction; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.block.Block; diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/GeneratingKineticTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/base/GeneratingKineticTileEntity.java index d9dfcb4679..8086f7cc0f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/GeneratingKineticTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/GeneratingKineticTileEntity.java @@ -5,7 +5,7 @@ import java.util.List; import com.simibubi.create.content.contraptions.KineticNetwork; import com.simibubi.create.content.contraptions.base.IRotate.SpeedLevel; import com.simibubi.create.content.contraptions.base.IRotate.StressImpact; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; @@ -64,9 +64,9 @@ public abstract class GeneratingKineticTileEntity extends KineticTileEntity { if (Mth.equal(stressBase, 0)) return added; - Lang.translate("gui.goggles.generator_stats") + CreateLang.translate("gui.goggles.generator_stats") .forGoggles(tooltip); - Lang.translate("tooltip.capacityProvided") + CreateLang.translate("tooltip.capacityProvided") .style(ChatFormatting.GRAY) .forGoggles(tooltip); @@ -77,11 +77,11 @@ public abstract class GeneratingKineticTileEntity extends KineticTileEntity { float stressTotal = stressBase * speed; - Lang.number(stressTotal) + CreateLang.number(stressTotal) .translate("generic.unit.stress") .style(ChatFormatting.AQUA) .space() - .add(Lang.translate("gui.goggles.at_current_speed") + .add(CreateLang.translate("gui.goggles.at_current_speed") .style(ChatFormatting.DARK_GRAY)) .forGoggles(tooltip, 1); diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalAxisKineticBlock.java b/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalAxisKineticBlock.java index a9c674ac99..053a3b22ed 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalAxisKineticBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalAxisKineticBlock.java @@ -1,7 +1,6 @@ package com.simibubi.create.content.contraptions.base; -import com.simibubi.create.foundation.utility.Iterate; - +import net.createmod.catnip.utility.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalKineticBlock.java b/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalKineticBlock.java index 85cfc7e957..70286fd678 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalKineticBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalKineticBlock.java @@ -1,7 +1,6 @@ package com.simibubi.create.content.contraptions.base; -import com.simibubi.create.foundation.utility.Iterate; - +import net.createmod.catnip.utility.Iterate; import net.minecraft.core.Direction; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.block.Block; diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/IRotate.java b/src/main/java/com/simibubi/create/content/contraptions/base/IRotate.java index 089d861014..cb5ee91420 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/IRotate.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/IRotate.java @@ -3,9 +3,10 @@ package com.simibubi.create.content.contraptions.base; import com.simibubi.create.content.contraptions.wrench.IWrenchable; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.item.ItemDescription; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.LangBuilder; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.lang.Lang; +import net.createmod.catnip.utility.lang.LangBuilder; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -73,12 +74,12 @@ public interface IRotate extends IWrenchable { public static LangBuilder getFormattedSpeedText(float speed, boolean overstressed) { SpeedLevel speedLevel = of(speed); - LangBuilder builder = Lang.text(ItemDescription.makeProgressBar(3, speedLevel.ordinal())); + LangBuilder builder = CreateLang.text(ItemDescription.makeProgressBar(3, speedLevel.ordinal())); builder.translate("tooltip.speedRequirement." + Lang.asId(speedLevel.name())) .space() .text("(") - .add(Lang.number(Math.abs(speed))) + .add(CreateLang.number(Math.abs(speed))) .space() .translate("generic.unit.rpm") .text(")") @@ -133,7 +134,7 @@ public interface IRotate extends IWrenchable { public static LangBuilder getFormattedStressText(double stressPercent) { StressImpact stressLevel = of(stressPercent); - return Lang.text(ItemDescription.makeProgressBar(3, Math.min(stressLevel.ordinal() + 1, 3))) + return CreateLang.text(ItemDescription.makeProgressBar(3, Math.min(stressLevel.ordinal() + 1, 3))) .translate("tooltip.stressImpact." + Lang.asId(stressLevel.name())) .text(String.format(" (%s%%) ", (int) (stressPercent * 100))) .style(stressLevel.getRelativeColor()); diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticEffectHandler.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticEffectHandler.java index 4385eb3d09..4955f6c969 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticEffectHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticEffectHandler.java @@ -4,8 +4,8 @@ import java.util.Random; import com.simibubi.create.content.contraptions.base.IRotate.SpeedLevel; import com.simibubi.create.content.contraptions.particle.RotationIndicatorParticleData; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction.Axis; import net.minecraft.core.particles.ParticleOptions; diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java index 4f875beb69..77d3ffab8f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java @@ -19,13 +19,13 @@ import com.simibubi.create.content.contraptions.relays.elementary.ICogWheel; import com.simibubi.create.content.contraptions.relays.gearbox.GearboxBlock; import com.simibubi.create.foundation.block.BlockStressValues; import com.simibubi.create.foundation.config.AllConfigs; -import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.sound.SoundScapes; import com.simibubi.create.foundation.sound.SoundScapes.AmbienceGroup; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.FontHelper; import net.minecraft.ChatFormatting; import net.minecraft.client.resources.language.I18n; import net.minecraft.core.BlockPos; @@ -397,10 +397,10 @@ public class KineticTileEntity extends SmartTileEntity implements IHaveGoggleInf if (overStressed && AllConfigs.CLIENT.enableOverstressedTooltip.get()) { tooltip.add(componentSpacing.plainCopy() - .append(Lang.translateDirect("gui.stressometer.overstressed") + .append(CreateLang.translateDirect("gui.stressometer.overstressed") .withStyle(GOLD))); - Component hint = Lang.translateDirect("gui.contraptions.network_overstressed"); - List cutString = TooltipHelper.cutTextComponent(hint, GRAY, ChatFormatting.WHITE); + Component hint = CreateLang.translateDirect("gui.contraptions.network_overstressed"); + List cutString = FontHelper.cutTextComponent(hint, GRAY, ChatFormatting.WHITE); for (int i = 0; i < cutString.size(); i++) tooltip.add(componentSpacing.plainCopy() .append(cutString.get(i))); @@ -409,12 +409,12 @@ public class KineticTileEntity extends SmartTileEntity implements IHaveGoggleInf if (notFastEnough) { tooltip.add(componentSpacing.plainCopy() - .append(Lang.translateDirect("tooltip.speedRequirement") + .append(CreateLang.translateDirect("tooltip.speedRequirement") .withStyle(GOLD))); Component hint = - Lang.translateDirect("gui.contraptions.not_fast_enough", I18n.get(getBlockState().getBlock() + CreateLang.translateDirect("gui.contraptions.not_fast_enough", I18n.get(getBlockState().getBlock() .getDescriptionId())); - List cutString = TooltipHelper.cutTextComponent(hint, GRAY, ChatFormatting.WHITE); + List cutString = FontHelper.cutTextComponent(hint, GRAY, ChatFormatting.WHITE); for (int i = 0; i < cutString.size(); i++) tooltip.add(componentSpacing.plainCopy() .append(cutString.get(i))); @@ -434,19 +434,19 @@ public class KineticTileEntity extends SmartTileEntity implements IHaveGoggleInf if (Mth.equal(stressAtBase, 0)) return added; - Lang.translate("gui.goggles.kinetic_stats") + CreateLang.translate("gui.goggles.kinetic_stats") .forGoggles(tooltip); - Lang.translate("tooltip.stressImpact") + CreateLang.translate("tooltip.stressImpact") .style(GRAY) .forGoggles(tooltip); float stressTotal = stressAtBase * Math.abs(getTheoreticalSpeed()); - Lang.number(stressTotal) + CreateLang.number(stressTotal) .translate("generic.unit.stress") .style(ChatFormatting.AQUA) .space() - .add(Lang.translate("gui.goggles.at_current_speed") + .add(CreateLang.translate("gui.goggles.at_current_speed") .style(ChatFormatting.DARK_GRAY)) .forGoggles(tooltip, 1); diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java index 3ef7482b8f..4b3b17bba2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java @@ -12,9 +12,9 @@ import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.SuperByteBufferCache; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.Color; +import net.createmod.catnip.utility.theme.Color; +import net.createmod.ponder.utility.WorldTickHolder; import net.minecraft.client.renderer.ItemBlockRenderTypes; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; @@ -77,7 +77,7 @@ public class KineticTileEntityRenderer extends SafeTileEntityRenderer, Batched { diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/flwdata/KineticData.java b/src/main/java/com/simibubi/create/content/contraptions/base/flwdata/KineticData.java index 88f97c572a..16faae5eda 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/flwdata/KineticData.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/flwdata/KineticData.java @@ -3,8 +3,8 @@ package com.simibubi.create.content.contraptions.base.flwdata; import com.jozufozu.flywheel.core.materials.BasicData; import com.mojang.math.Vector3f; import com.simibubi.create.content.contraptions.base.KineticTileEntity; -import com.simibubi.create.foundation.utility.Color; +import net.createmod.catnip.utility.theme.Color; import net.minecraft.core.BlockPos; public class KineticData extends BasicData { diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/flwdata/RotatingType.java b/src/main/java/com/simibubi/create/content/contraptions/base/flwdata/RotatingType.java index bef2e4722e..b9bcaf258e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/flwdata/RotatingType.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/flwdata/RotatingType.java @@ -11,8 +11,8 @@ import com.mojang.math.Vector3f; import com.simibubi.create.content.contraptions.KineticDebugger; import com.simibubi.create.foundation.render.AllInstanceFormats; import com.simibubi.create.foundation.render.AllProgramSpecs; -import com.simibubi.create.foundation.utility.AnimationTickHolder; +import net.createmod.catnip.utility.AnimationTickHolder; import net.minecraft.resources.ResourceLocation; public class RotatingType implements Instanced, Batched { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/BlockBreakingKineticTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/BlockBreakingKineticTileEntity.java index dee22e4bae..004b2c6050 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/BlockBreakingKineticTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/BlockBreakingKineticTileEntity.java @@ -3,8 +3,8 @@ package com.simibubi.create.content.contraptions.components.actors; import java.util.concurrent.atomic.AtomicInteger; import com.simibubi.create.content.contraptions.base.KineticTileEntity; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; @@ -40,7 +40,7 @@ public abstract class BlockBreakingKineticTileEntity extends KineticTileEntity { if (destroyProgress == -1) destroyNextTick(); } - + @Override public void lazyTick() { super.lazyTick(); @@ -93,9 +93,9 @@ public abstract class BlockBreakingKineticTileEntity extends KineticTileEntity { return; if (getSpeed() == 0) return; - + breakingPos = getBreakingPos(); - + if (ticksUntilNextProgress < 0) return; if (ticksUntilNextProgress-- > 0) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillActorInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillActorInstance.java index 304fe9cd17..586510a9ab 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillActorInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillActorInstance.java @@ -9,9 +9,9 @@ import com.simibubi.create.content.contraptions.components.actors.flwdata.ActorD import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance; import com.simibubi.create.foundation.render.AllMaterialSpecs; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.core.Direction; import net.minecraft.world.level.block.state.BlockState; 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 89ebb9582d..729895524a 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 @@ -9,8 +9,8 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Mov import com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionMatrices; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.core.BlockPos; import net.minecraft.world.damagesource.DamageSource; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java index 28140233b6..cfa4a78548 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java @@ -9,10 +9,10 @@ import com.simibubi.create.content.contraptions.components.structureMovement.ren import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterActorInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterActorInstance.java index de07acdd9d..517367a8dc 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterActorInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterActorInstance.java @@ -8,10 +8,10 @@ import com.jozufozu.flywheel.core.virtual.VirtualRenderWorld; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.core.Direction; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockStateProperties; @@ -61,6 +61,8 @@ public class HarvesterActorInstance extends ActorInstance { double radians = arcLength * oneOverRadius; + + float deg = AngleHelper.deg(radians); deg = (float) (((int) (deg * 3000)) / 3000); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterMovementBehaviour.java index 9360166dcc..6a52e27654 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterMovementBehaviour.java @@ -13,8 +13,8 @@ import com.simibubi.create.content.contraptions.components.structureMovement.ren import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.utility.BlockHelper; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.core.BlockPos; import net.minecraft.tags.BlockTags; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java index 0fbe0c3d87..6cdd17929c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java @@ -11,10 +11,10 @@ import com.simibubi.create.content.contraptions.components.structureMovement.ren import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.ponder.utility.WorldTickHolder; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; @@ -63,7 +63,7 @@ public class HarvesterRenderer extends SafeTileEntityRenderer implements DynamicInstance, TickableInstance { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PloughMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PloughMovementBehaviour.java index 1cca39d6bf..fdfdcd42df 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PloughMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PloughMovementBehaviour.java @@ -4,8 +4,8 @@ import com.simibubi.create.content.contraptions.components.actors.PloughBlock.Pl import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.content.logistics.trains.track.FakeTrackBlock; import com.simibubi.create.foundation.advancement.AllAdvancements; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.InteractionHand; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceMovement.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceMovement.java index 6df522cf8e..e6f55f8e45 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceMovement.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceMovement.java @@ -12,10 +12,10 @@ import com.simibubi.create.content.contraptions.components.structureMovement.ren import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionMatrices; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; import com.simibubi.create.content.logistics.trains.entity.CarriageContraption; -import com.simibubi.create.foundation.utility.VecHelper; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; -import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceRenderer.java index 051f630862..0e246a1a3e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceRenderer.java @@ -15,10 +15,10 @@ import com.simibubi.create.content.contraptions.components.structureMovement.ren import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceTileEntity.java index 17c41d628d..8f540b1161 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceTileEntity.java @@ -8,8 +8,8 @@ import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.animation.LerpedFloat; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.util.Mth; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/SawMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/SawMovementBehaviour.java index 17965f8645..3bf582af12 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/SawMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/SawMovementBehaviour.java @@ -10,8 +10,8 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Mov import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionMatrices; import com.simibubi.create.foundation.utility.AbstractBlockBreakQueue; import com.simibubi.create.foundation.utility.TreeCutter; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/SeatMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/SeatMovementBehaviour.java index 5c50828744..efaded0fd0 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/SeatMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/SeatMovementBehaviour.java @@ -6,8 +6,8 @@ import java.util.UUID; import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity; import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.block.SlabBlock; @@ -28,7 +28,7 @@ public class SeatMovementBehaviour implements MovementBehaviour { @Override public void visitNewPosition(MovementContext context, BlockPos pos) { MovementBehaviour.super.visitNewPosition(context, pos); - + AbstractContraptionEntity contraptionEntity = context.contraption.entity; if (contraptionEntity == null) return; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockRenderer.java index db08c740e2..342d3e2da9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockRenderer.java @@ -9,8 +9,8 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.clock.CuckooClockTileEntity.Animation; import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.utility.AngleHelper; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockTileEntity.java index 2367a0a232..e86e9eeee9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/clock/CuckooClockTileEntity.java @@ -5,12 +5,12 @@ import java.util.List; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.NBTHelper; -import com.simibubi.create.foundation.utility.VecHelper; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; -import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; import net.minecraft.core.BlockPos; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.nbt.CompoundTag; @@ -42,7 +42,7 @@ public class CuckooClockTileEntity extends KineticTileEntity { super(type, pos, state); animationType = Animation.NONE; } - + @Override public void addBehaviours(List behaviours) { super.addBehaviours(behaviours); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/ConnectedInputHandler.java b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/ConnectedInputHandler.java index 36a6c2d7c9..ae6ae78dab 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/ConnectedInputHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/ConnectedInputHandler.java @@ -15,8 +15,8 @@ import java.util.function.Consumer; import java.util.stream.Collectors; import com.simibubi.create.AllBlocks; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterBlock.java index 47062a61b3..4930787ba6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterBlock.java @@ -11,11 +11,11 @@ import com.simibubi.create.content.contraptions.relays.elementary.ICogWheel; import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InvManipulationBehaviour; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.Pointing; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterRenderer.java index 72a648e767..2b40f623c0 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterRenderer.java @@ -16,10 +16,10 @@ import com.simibubi.create.content.contraptions.components.crafter.RecipeGridHan import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.Pointing; +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterTileEntity.java index 1028647dbe..532f20b483 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterTileEntity.java @@ -21,10 +21,10 @@ import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.edgeInteraction.EdgeInteractionBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InvManipulationBehaviour; -import com.simibubi.create.foundation.utility.BlockFace; -import com.simibubi.create.foundation.utility.Pointing; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.BlockFace; +import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.particles.ItemParticleOption; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/RecipeGridHandler.java b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/RecipeGridHandler.java index 8f6be9a346..a0435b6c36 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/RecipeGridHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/RecipeGridHandler.java @@ -17,9 +17,9 @@ import com.google.common.base.Predicates; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllRecipeTypes; import com.simibubi.create.foundation.config.AllConfigs; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.Pointing; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.Pointing; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; 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 075352feda..b0d6d0449e 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 @@ -8,8 +8,8 @@ import com.simibubi.create.content.contraptions.base.DirectionalKineticBlock; import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.config.AllConfigs; -import com.simibubi.create.foundation.utility.Couple; +import net.createmod.catnip.utility.Couple; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -61,11 +61,11 @@ public class HandCrankBlock extends DirectionalKineticBlock implements ITE te.turn(player.isShiftKeyDown())); player.causeFoodExhaustion(getRotationSpeed() * AllConfigs.SERVER.kinetics.crankHungerMultiplier.getF()); - + if (player.getFoodData() .getFoodLevel() == 0) AllAdvancements.HAND_CRANK.awardTo(player); - + return InteractionResult.SUCCESS; } @@ -129,7 +129,7 @@ public class HandCrankBlock extends DirectionalKineticBlock implements ITE getSpeedRange() { return Couple.create(32, 32); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankInstance.java index c3eaeb2180..7eacbb4542 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankInstance.java @@ -6,8 +6,8 @@ import com.jozufozu.flywheel.api.instance.DynamicInstance; import com.jozufozu.flywheel.core.PartialModel; import com.jozufozu.flywheel.core.materials.model.ModelData; import com.simibubi.create.content.contraptions.base.SingleRotatingInstance; -import com.simibubi.create.foundation.utility.AnimationTickHolder; +import net.createmod.catnip.utility.AnimationTickHolder; import net.minecraft.core.Direction; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.properties.BlockStateProperties; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankTileEntity.java index 4ef31339fd..534f9aec86 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankTileEntity.java @@ -3,8 +3,8 @@ package com.simibubi.create.content.contraptions.components.crank; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllSoundEvents; import com.simibubi.create.content.contraptions.base.GeneratingKineticTileEntity; -import com.simibubi.create.foundation.utility.AnimationTickHolder; +import net.createmod.catnip.utility.AnimationTickHolder; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.block.Block; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crank/ValveHandleBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/crank/ValveHandleBlock.java index 9c22fa6b45..9666c0e461 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crank/ValveHandleBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crank/ValveHandleBlock.java @@ -5,8 +5,8 @@ import javax.annotation.ParametersAreNonnullByDefault; import com.jozufozu.flywheel.core.PartialModel; import com.simibubi.create.AllBlocks; import com.simibubi.create.foundation.utility.BlockHelper; -import com.simibubi.create.foundation.utility.Couple; +import net.createmod.catnip.utility.Couple; import net.minecraft.core.BlockPos; import net.minecraft.core.NonNullList; import net.minecraft.world.InteractionHand; @@ -74,7 +74,7 @@ public class ValveHandleBlock extends HandCrankBlock { public int getRotationSpeed() { return 16; } - + public static Couple getSpeedRange() { return Couple.create(16, 16); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelBlock.java index 911391a56a..8b5957b077 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelBlock.java @@ -7,8 +7,8 @@ import com.simibubi.create.AllShapes; import com.simibubi.create.AllTileEntities; import com.simibubi.create.content.contraptions.base.RotatedPillarKineticBlock; import com.simibubi.create.foundation.block.ITE; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -189,7 +189,7 @@ public class CrushingWheelBlock extends RotatedPillarKineticBlock implements ITE public Class getTileEntityClass() { return CrushingWheelTileEntity.class; } - + @Override public BlockEntityType getTileEntityType() { return AllTileEntities.CRUSHING_WHEEL.get(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelControllerBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelControllerBlock.java index 7bb3f606a6..65f3adb91c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelControllerBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelControllerBlock.java @@ -8,8 +8,8 @@ import com.simibubi.create.AllTileEntities; import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.item.ItemHelper; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -150,11 +150,11 @@ public class CrushingWheelControllerBlock extends DirectionalBlock implements IT continue; te.crushingspeed = Math.abs(cwte.getSpeed() / 50f); te.sendData(); - + cwte.award(AllAdvancements.CRUSHING_WHEEL); - if (cwte.getSpeed() > 255) + if (cwte.getSpeed() > 255) cwte.award(AllAdvancements.CRUSHER_MAXED); - + break; } }); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelControllerTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelControllerTileEntity.java index 120001d632..cff2190d0a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelControllerTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelControllerTileEntity.java @@ -16,9 +16,9 @@ import com.simibubi.create.foundation.sound.SoundScapes.AmbienceGroup; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; -import com.simibubi.create.foundation.utility.NBTHelper; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelTileEntity.java index 7cedbe8ce9..8cf82d834f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelTileEntity.java @@ -5,8 +5,8 @@ import java.util.List; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.damagesource.DamageSource; @@ -36,7 +36,7 @@ public class CrushingWheelTileEntity extends KineticTileEntity { super.addBehaviours(behaviours); registerAwardables(behaviours, AllAdvancements.CRUSHING_WHEEL, AllAdvancements.CRUSHER_MAXED); } - + @Override public void onSpeedChanged(float prevSpeed) { super.onSpeedChanged(prevSpeed); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerActorInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerActorInstance.java index 7477c48d12..9b5fa3c3f3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerActorInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerActorInstance.java @@ -18,11 +18,11 @@ import com.simibubi.create.content.contraptions.base.flwdata.RotatingData; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance; import com.simibubi.create.foundation.render.AllMaterialSpecs; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.NBTHelper; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.util.Mth; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerApplicationRecipe.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerApplicationRecipe.java index 92126100dd..8f127d6bd2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerApplicationRecipe.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerApplicationRecipe.java @@ -12,7 +12,7 @@ import com.simibubi.create.content.contraptions.itemAssembly.IAssemblyRecipe; import com.simibubi.create.content.contraptions.processing.ItemApplicationRecipe; import com.simibubi.create.content.contraptions.processing.ProcessingRecipeBuilder; import com.simibubi.create.content.contraptions.processing.ProcessingRecipeBuilder.ProcessingRecipeParams; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TextComponent; @@ -60,7 +60,7 @@ public class DeployerApplicationRecipe extends ItemApplicationRecipe implements .getItems(); if (matchingStacks.length == 0) return new TextComponent("Invalid"); - return Lang.translateDirect("recipe.assembly.deploying_item", + return CreateLang.translateDirect("recipe.assembly.deploying_item", new TranslatableComponent(matchingStacks[0].getDescriptionId()).getString()); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerFakePlayer.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerFakePlayer.java index 682b626d7f..360ae94083 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerFakePlayer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerFakePlayer.java @@ -8,7 +8,7 @@ import org.apache.commons.lang3.tuple.Pair; import com.mojang.authlib.GameProfile; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.config.CKinetics; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import io.netty.util.concurrent.Future; import io.netty.util.concurrent.GenericFutureListener; @@ -64,7 +64,7 @@ public class DeployerFakePlayer extends FakePlayer { @Override public Component getDisplayName() { - return Lang.translateDirect("block.deployer.damage_source_name"); + return CreateLang.translateDirect("block.deployer.damage_source_name"); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerFilterSlot.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerFilterSlot.java index ae37feff1a..bbbe1a2924 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerFilterSlot.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerFilterSlot.java @@ -3,9 +3,9 @@ package com.simibubi.create.content.contraptions.components.deployer; import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; import net.minecraft.world.level.block.state.BlockState; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerHandler.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerHandler.java index fd663810bc..36988c0b09 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerHandler.java @@ -21,8 +21,8 @@ import com.simibubi.create.content.logistics.trains.ITrackBlock; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour; import com.simibubi.create.foundation.utility.BlockHelper; -import com.simibubi.create.foundation.utility.worldWrappers.WrappedWorld; +import net.createmod.catnip.utility.worldWrappers.WrappedWorld; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerInstance.java index f34dec09b2..cd0804c299 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerInstance.java @@ -12,9 +12,9 @@ import com.mojang.math.Quaternion; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.relays.encased.ShaftInstance; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.AnimationTickHolder; +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Vec3i; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerMovementBehaviour.java index 116918e763..dd5269e183 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerMovementBehaviour.java @@ -25,16 +25,16 @@ import com.simibubi.create.content.logistics.item.filter.FilterItem; import com.simibubi.create.content.logistics.trains.entity.CarriageContraption; import com.simibubi.create.content.logistics.trains.entity.CarriageContraptionEntity; import com.simibubi.create.content.schematics.ItemRequirement; -import com.simibubi.create.content.schematics.SchematicWorld; import com.simibubi.create.content.schematics.filtering.SchematicInstances; import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.item.ItemHelper; import com.simibubi.create.foundation.item.ItemHelper.ExtractionCountMode; import com.simibubi.create.foundation.utility.BlockHelper; -import com.simibubi.create.foundation.utility.NBTHelper; import com.simibubi.create.foundation.utility.NBTProcessors; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.worldWrappers.SchematicWorld; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerMovingInteraction.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerMovingInteraction.java index 401d77731f..ef86be9880 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerMovingInteraction.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerMovingInteraction.java @@ -6,8 +6,8 @@ import com.simibubi.create.AllItems; import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.content.contraptions.components.structureMovement.MovingInteractionBehaviour; -import com.simibubi.create.foundation.utility.NBTHelper; +import net.createmod.catnip.utility.NBTHelper; import net.minecraft.core.BlockPos; import net.minecraft.nbt.Tag; import net.minecraft.server.level.ServerLevel; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java index e5abdf1fb4..31e662e127 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java @@ -23,11 +23,12 @@ import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringRenderer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.NBTHelper; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.ponder.utility.WorldTickHolder; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; @@ -98,7 +99,7 @@ public class DeployerRenderer extends SafeTileEntityRenderer ms.translate(0, isBlockItem ? 9 / 16f : 11 / 16f, 0); ms.scale(scale, scale, scale); transform = TransformType.GROUND; - ms.mulPose(Vector3f.YP.rotationDegrees(AnimationTickHolder.getRenderTime(te.getLevel()))); + ms.mulPose(Vector3f.YP.rotationDegrees(WorldTickHolder.getRenderTime(te.getLevel()))); } else { float scale = punching ? .75f : isBlockItem ? .75f - 1 / 64f : .5f; @@ -194,7 +195,7 @@ public class DeployerRenderer extends SafeTileEntityRenderer axis = def.getRotationAxis(context.state); } - float time = AnimationTickHolder.getRenderTime(context.world) / 20; + float time = WorldTickHolder.getRenderTime(context.world) / 20; float angle = (time * speed) % 360; TransformStack.cast(m) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java index 72ad80ce45..d3f6e0b4a8 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java @@ -22,10 +22,10 @@ import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.BeltProcessingBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; -import com.simibubi.create.foundation.utility.NBTHelper; -import com.simibubi.create.foundation.utility.VecHelper; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.animation.LerpedFloat; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/AirCurrent.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/AirCurrent.java index 7a68fc8049..c715cc43a0 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/AirCurrent.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/AirCurrent.java @@ -15,9 +15,9 @@ import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour.TransportedResult; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanBlock.java index 06c3a4eddc..3fc85edb6d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanBlock.java @@ -4,8 +4,8 @@ import com.simibubi.create.AllTileEntities; import com.simibubi.create.content.contraptions.base.DirectionalKineticBlock; import com.simibubi.create.content.logistics.block.chute.AbstractChuteBlock; import com.simibubi.create.foundation.block.ITE; -import com.simibubi.create.foundation.utility.worldWrappers.WrappedWorld; +import net.createmod.catnip.utility.worldWrappers.WrappedWorld; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -102,7 +102,7 @@ public class EncasedFanBlock extends DirectionalKineticBlock implements ITE getTileEntityClass() { return EncasedFanTileEntity.class; } - + @Override public BlockEntityType getTileEntityType() { return AllTileEntities.ENCASED_FAN.get(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java index 73b918fa7c..7c7b54f446 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java @@ -10,8 +10,8 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.utility.AnimationTickHolder; +import net.createmod.ponder.utility.WorldTickHolder; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; @@ -42,7 +42,7 @@ public class EncasedFanRenderer extends KineticTileEntityRenderer { SuperByteBuffer fanInner = CachedBufferer.partialFacing(AllBlockPartials.ENCASED_FAN_INNER, te.getBlockState(), direction.getOpposite()); - float time = AnimationTickHolder.getRenderTime(te.getLevel()); + float time = WorldTickHolder.getRenderTime(te.getLevel()); float speed = te.getSpeed() * 5; if (speed > 0) speed = Mth.clamp(speed, 80, 64 * 20); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/NozzleTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/NozzleTileEntity.java index c5b912999f..504b3376ff 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/NozzleTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/NozzleTileEntity.java @@ -7,7 +7,7 @@ import java.util.List; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.particles.ParticleTypes; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java index d7b8dd9b7a..33dfc93ca5 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java @@ -7,9 +7,9 @@ import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.content.contraptions.base.KineticTileInstance; import com.simibubi.create.content.contraptions.base.flwdata.RotatingData; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.AnimationTickHolder; +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.core.Direction; public class FlyWheelInstance extends KineticTileInstance implements DynamicInstance { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java index 274f8ba2f7..4e46948ffc 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java @@ -7,8 +7,8 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.utility.AngleHelper; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelTileEntity.java index dc9700099c..4ebaa2f6f0 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelTileEntity.java @@ -1,9 +1,9 @@ package com.simibubi.create.content.contraptions.components.flywheel; import com.simibubi.create.content.contraptions.base.KineticTileEntity; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; -import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.block.entity.BlockEntityType; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneBlock.java index 1260b4697f..7c504cf3ff 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneBlock.java @@ -6,8 +6,8 @@ import com.simibubi.create.content.contraptions.base.KineticBlock; import com.simibubi.create.content.contraptions.relays.elementary.ICogWheel; import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.item.ItemHelper; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneTileEntity.java index 65527e3457..9594928721 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneTileEntity.java @@ -10,8 +10,8 @@ import com.simibubi.create.foundation.sound.SoundScapes; import com.simibubi.create.foundation.sound.SoundScapes.AmbienceGroup; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -137,7 +137,7 @@ public class MillstoneTileEntity extends KineticTileEntity { lastRecipe.rollResults() .forEach(stack -> ItemHandlerHelper.insertItemStacked(outputInv, stack, false)); award(AllAdvancements.MILLSTONE); - + sendData(); setChanged(); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java index ec59b20376..1d57368401 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java @@ -8,8 +8,8 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.utility.AnimationTickHolder; +import net.createmod.ponder.utility.WorldTickHolder; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; @@ -43,7 +43,7 @@ public class MechanicalMixerRenderer extends KineticTileEntityRenderer { float renderedHeadOffset = mixer.getRenderedHeadOffset(partialTicks); float speed = mixer.getRenderedHeadRotationSpeed(partialTicks); - float time = AnimationTickHolder.getRenderTime(te.getLevel()); + float time = WorldTickHolder.getRenderTime(te.getLevel()); float angle = ((time * speed * 6 / 10f) % 360) / 180 * (float) Math.PI; SuperByteBuffer poleRender = CachedBufferer.partial(AllBlockPartials.MECHANICAL_MIXER_POLE, blockState); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerTileEntity.java index c36e0da53b..fbeb6381c9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerTileEntity.java @@ -18,10 +18,10 @@ import com.simibubi.create.foundation.item.SmartInventory; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour.TankSegment; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction.Axis; import net.minecraft.core.particles.ItemParticleOption; @@ -97,7 +97,7 @@ public class MechanicalMixerTileEntity extends BasinOperatingTileEntity { super.addBehaviours(behaviours); registerAwardables(behaviours, AllAdvancements.MIXER); } - + @Override protected AABB createRenderBoundingBox() { return new AABB(worldPosition).expandTowards(0, -1.5, 0); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MixerInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MixerInstance.java index 8104dd20ba..11bb3df77c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MixerInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MixerInstance.java @@ -8,8 +8,8 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.flwdata.RotatingData; import com.simibubi.create.content.contraptions.relays.encased.EncasedCogInstance; import com.simibubi.create.foundation.render.AllMaterialSpecs; -import com.simibubi.create.foundation.utility.AnimationTickHolder; +import net.createmod.catnip.utility.AnimationTickHolder; import net.minecraft.core.Direction; public class MixerInstance extends EncasedCogInstance implements DynamicInstance { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorTileEntity.java index 1e8c397c18..0d64ed497b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorTileEntity.java @@ -9,7 +9,7 @@ import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.CenteredSideValueBoxTransform; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollValueBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollValueBehaviour.StepContext; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import net.minecraft.core.BlockPos; import net.minecraft.world.level.block.entity.BlockEntityType; @@ -32,11 +32,11 @@ public class CreativeMotorTileEntity extends GeneratingKineticTileEntity { CenteredSideValueBoxTransform slot = new CenteredSideValueBoxTransform( (motor, side) -> motor.getValue(CreativeMotorBlock.FACING) == side.getOpposite()); - generatedSpeed = new ScrollValueBehaviour(Lang.translateDirect("generic.speed"), this, slot); + generatedSpeed = new ScrollValueBehaviour(CreateLang.translateDirect("generic.speed"), this, slot); generatedSpeed.between(-max, max); generatedSpeed.value = DEFAULT_SPEED; generatedSpeed.scrollableValue = DEFAULT_SPEED; - generatedSpeed.withUnit(i -> Lang.translateDirect("generic.unit.rpm")); + generatedSpeed.withUnit(i -> CreateLang.translateDirect("generic.unit.rpm")); generatedSpeed.withCallback(i -> this.updateGeneratedRotation()); generatedSpeed.withStepFunction(CreativeMotorTileEntity::step); behaviours.add(generatedSpeed); 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 0fb8b8b73f..4ed5244a2e 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 @@ -21,8 +21,8 @@ import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.item.ItemHelper; import com.simibubi.create.foundation.item.SmartInventory; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.NonNullList; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/press/PressInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/press/PressInstance.java index 25d7271e3f..8d1afbfb76 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/press/PressInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/press/PressInstance.java @@ -8,8 +8,9 @@ import com.mojang.math.Quaternion; import com.mojang.math.Vector3f; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.relays.encased.ShaftInstance; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.AnimationTickHolder; + +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.math.AngleHelper; public class PressInstance extends ShaftInstance implements DynamicInstance { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/press/PressingBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/press/PressingBehaviour.java index 5297f1bb1b..d95a2222e2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/press/PressingBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/press/PressingBehaviour.java @@ -10,9 +10,9 @@ import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.BeltProcessingBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour; -import com.simibubi.create.foundation.utility.NBTHelper; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.particles.ItemParticleOption; import net.minecraft.core.particles.ParticleTypes; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/press/PressingRecipe.java b/src/main/java/com/simibubi/create/content/contraptions/components/press/PressingRecipe.java index 4ecff8535c..d063ac1ee4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/press/PressingRecipe.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/press/PressingRecipe.java @@ -12,7 +12,7 @@ import com.simibubi.create.compat.jei.category.sequencedAssembly.SequencedAssemb import com.simibubi.create.content.contraptions.itemAssembly.IAssemblyRecipe; import com.simibubi.create.content.contraptions.processing.ProcessingRecipe; import com.simibubi.create.content.contraptions.processing.ProcessingRecipeBuilder.ProcessingRecipeParams; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import net.minecraft.network.chat.Component; import net.minecraft.world.item.crafting.Ingredient; @@ -53,14 +53,14 @@ public class PressingRecipe extends ProcessingRecipe implements I @Override @OnlyIn(Dist.CLIENT) public Component getDescriptionForAssembly() { - return Lang.translateDirect("recipe.assembly.pressing"); + return CreateLang.translateDirect("recipe.assembly.pressing"); } - + @Override public void addRequiredMachines(Set list) { list.add(AllBlocks.MECHANICAL_PRESS.get()); } - + @Override public Supplier> getJEISubCategory() { return () -> SequencedAssemblySubCategory.AssemblyPressing::new; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/CuttingRecipe.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/CuttingRecipe.java index 2c6c50c6d9..85d9c23da5 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/CuttingRecipe.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/CuttingRecipe.java @@ -12,7 +12,7 @@ import com.simibubi.create.compat.jei.category.sequencedAssembly.SequencedAssemb import com.simibubi.create.content.contraptions.itemAssembly.IAssemblyRecipe; import com.simibubi.create.content.contraptions.processing.ProcessingRecipe; import com.simibubi.create.content.contraptions.processing.ProcessingRecipeBuilder.ProcessingRecipeParams; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import net.minecraft.network.chat.Component; import net.minecraft.world.item.crafting.Ingredient; @@ -53,14 +53,14 @@ public class CuttingRecipe extends ProcessingRecipe implements IA @Override @OnlyIn(Dist.CLIENT) public Component getDescriptionForAssembly() { - return Lang.translateDirect("recipe.assembly.cutting"); + return CreateLang.translateDirect("recipe.assembly.cutting"); } - + @Override public void addRequiredMachines(Set list) { list.add(AllBlocks.MECHANICAL_SAW.get()); } - + @Override public Supplier> getJEISubCategory() { return () -> SequencedAssemblySubCategory.AssemblyCutting::new; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawFilterSlot.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawFilterSlot.java index c9a407a641..bab4a34961 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawFilterSlot.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawFilterSlot.java @@ -3,8 +3,8 @@ package com.simibubi.create.content.contraptions.components.saw; import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.Direction; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java index 6da19d6a57..e2877c068a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java @@ -17,9 +17,9 @@ import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringRenderer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawTileEntity.java index 4a02a5415c..f84e4b1fab 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawTileEntity.java @@ -27,10 +27,10 @@ import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputB import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; import com.simibubi.create.foundation.utility.AbstractBlockBreakQueue; import com.simibubi.create.foundation.utility.TreeCutter; -import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.recipe.RecipeConditions; import com.simibubi.create.foundation.utility.recipe.RecipeFinder; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -346,8 +346,8 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { ItemHelper.addToList(stack, list); } } - - for (int slot = 0; slot < list.size() && slot + 1 < inventory.getSlots(); slot++) + + for (int slot = 0; slot < list.size() && slot + 1 < inventory.getSlots(); slot++) inventory.setStackInSlot(slot + 1, list.get(slot)); award(AllAdvancements.SAW_PROCESSING); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/steam/PoweredShaftBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/steam/PoweredShaftBlock.java index ef16af57db..006985a1fd 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/steam/PoweredShaftBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/steam/PoweredShaftBlock.java @@ -8,10 +8,10 @@ import com.simibubi.create.AllTileEntities; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.relays.elementary.AbstractShaftBlock; import com.simibubi.create.content.contraptions.relays.elementary.ShaftBlock; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.placement.IPlacementHelper; -import com.simibubi.create.foundation.utility.placement.PlacementHelpers; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.placement.IPlacementHelper; +import net.createmod.catnip.utility.placement.PlacementHelpers; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; @@ -57,10 +57,10 @@ public class PoweredShaftBlock extends AbstractShaftBlock { if (helper.matchesItem(heldItem)) return helper.getOffset(pPlayer, pLevel, pState, pPos, pHit) .placeInWorld(pLevel, (BlockItem) heldItem.getItem(), pPlayer, pHand, pHit); - + return InteractionResult.PASS; } - + @Override public RenderShape getRenderShape(BlockState pState) { return RenderShape.ENTITYBLOCK_ANIMATED; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/steam/SteamEngineBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/steam/SteamEngineBlock.java index 67848b7a7e..63023543e1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/steam/SteamEngineBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/steam/SteamEngineBlock.java @@ -13,11 +13,11 @@ import com.simibubi.create.content.contraptions.wrench.IWrenchable; import com.simibubi.create.foundation.advancement.AdvancementBehaviour; import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.utility.BlockHelper; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.placement.IPlacementHelper; -import com.simibubi.create.foundation.utility.placement.PlacementHelpers; -import com.simibubi.create.foundation.utility.placement.PlacementOffset; +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.placement.IPlacementHelper; +import net.createmod.catnip.utility.placement.PlacementHelpers; +import net.createmod.catnip.utility.placement.PlacementOffset; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -66,7 +66,7 @@ public class SteamEngineBlock extends FaceAttachedHorizontalDirectionalBlock super.setPlacedBy(pLevel, pPos, pState, pPlacer, pStack); AdvancementBehaviour.setPlacedBy(pLevel, pPos, pPlacer); } - + @Override public boolean canSurvive(BlockState pState, LevelReader pLevel, BlockPos pPos) { return canAttach(pLevel, pPos, getConnectedDirection(pState).getOpposite()); @@ -193,7 +193,7 @@ public class SteamEngineBlock extends FaceAttachedHorizontalDirectionalBlock if (isShaftValid(state, shaft)) break; } - + BlockState newState = world.getBlockState(shaftPos); if (!newState.getMaterial().isReplaceable()) return PlacementOffset.fail(); @@ -204,7 +204,7 @@ public class SteamEngineBlock extends FaceAttachedHorizontalDirectionalBlock .setValue(PoweredShaftBlock.AXIS, axis)); } } - + public static Couple getSpeedRange() { return Couple.create(16, 64); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/steam/SteamEngineRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/steam/SteamEngineRenderer.java index a9def6a7f6..723736f522 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/steam/SteamEngineRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/steam/SteamEngineRenderer.java @@ -8,8 +8,8 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; -import com.simibubi.create.foundation.utility.AngleHelper; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; @@ -77,7 +77,7 @@ public class SteamEngineRenderer extends SafeTileEntityRenderer behaviours) { movementDirection = new ScrollOptionBehaviour<>(RotationDirection.class, - Lang.translateDirect("contraptions.windmill.rotation_direction"), this, new SteamEngineValueBox()); + CreateLang.translateDirect("contraptions.windmill.rotation_direction"), this, new SteamEngineValueBox()); movementDirection.requiresWrench(); movementDirection.onlyActiveWhen(() -> { PoweredShaftTileEntity shaft = getShaft(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/steam/SteamEngineValueBox.java b/src/main/java/com/simibubi/create/content/contraptions/components/steam/SteamEngineValueBox.java index 2b294850ac..98443a457f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/steam/SteamEngineValueBox.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/steam/SteamEngineValueBox.java @@ -3,10 +3,10 @@ package com.simibubi.create.content.contraptions.components.steam; import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.Pointing; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; import net.minecraft.world.level.block.state.BlockState; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/steam/whistle/WhistleBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/steam/whistle/WhistleBlock.java index 15b2225e4a..8f52b20766 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/steam/whistle/WhistleBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/steam/whistle/WhistleBlock.java @@ -10,8 +10,8 @@ import com.simibubi.create.content.contraptions.fluids.tank.FluidTankBlock; import com.simibubi.create.content.contraptions.wrench.IWrenchable; import com.simibubi.create.foundation.advancement.AdvancementBehaviour; import com.simibubi.create.foundation.block.ITE; -import com.simibubi.create.foundation.utility.Lang; +import net.createmod.catnip.utility.lang.Lang; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -77,7 +77,7 @@ public class WhistleBlock extends Block implements ITE, IWren super.setPlacedBy(pLevel, pPos, pState, pPlacer, pStack); AdvancementBehaviour.setPlacedBy(pLevel, pPos, pPlacer); } - + @Override public boolean canSurvive(BlockState pState, LevelReader pLevel, BlockPos pPos) { return FluidTankBlock.isTank(pLevel.getBlockState(pPos.relative(getAttachedDirection(pState)))); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/steam/whistle/WhistleExtenderBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/steam/whistle/WhistleExtenderBlock.java index 8fd4dd69a8..cc4cb63cab 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/steam/whistle/WhistleExtenderBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/steam/whistle/WhistleExtenderBlock.java @@ -4,8 +4,8 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; import com.simibubi.create.content.contraptions.components.steam.whistle.WhistleBlock.WhistleSize; import com.simibubi.create.content.contraptions.wrench.IWrenchable; -import com.simibubi.create.foundation.utility.Lang; +import net.createmod.catnip.utility.lang.Lang; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/steam/whistle/WhistleRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/steam/whistle/WhistleRenderer.java index 1aafc8d7bc..a7f8218e67 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/steam/whistle/WhistleRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/steam/whistle/WhistleRenderer.java @@ -6,9 +6,9 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.components.steam.whistle.WhistleBlock.WhistleSize; import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.AnimationTickHolder; +import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.ponder.utility.WorldTickHolder; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; @@ -35,7 +35,7 @@ public class WhistleRenderer extends SafeTileEntityRenderer { float offset = te.animation.getValue(partialTicks); if (te.animation.getChaseTarget() > 0 && te.animation.getValue() > 0.5f) { - float wiggleProgress = (AnimationTickHolder.getTicks(te.getLevel()) + partialTicks) / 8f; + float wiggleProgress = (WorldTickHolder.getTicks(te.getLevel()) + partialTicks) / 8f; offset -= Math.sin(wiggleProgress * (2 * Mth.PI) * (4 - size.ordinal())) / 16f; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/steam/whistle/WhistleTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/steam/whistle/WhistleTileEntity.java index 0f2a0ecd2f..d129c01a3d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/steam/whistle/WhistleTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/steam/whistle/WhistleTileEntity.java @@ -13,12 +13,12 @@ import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation; import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.VecHelper; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; -import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -107,11 +107,11 @@ public class WhistleTileEntity extends SmartTileEntity implements IHaveGoggleInf @Override public boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking) { - String[] pitches = Lang.translateDirect("generic.notes") + String[] pitches = CreateLang.translateDirect("generic.notes") .getString() .split(";"); TextComponent textComponent = new TextComponent(spacing); - tooltip.add(textComponent.append(Lang.translateDirect("generic.pitch", pitches[pitch % pitches.length]))); + tooltip.add(textComponent.append(CreateLang.translateDirect("generic.pitch", pitches[pitch % pitches.length]))); return true; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java index eff5279e66..1c778ff2fc 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java @@ -36,9 +36,9 @@ import com.simibubi.create.content.logistics.trains.entity.Train; import com.simibubi.create.foundation.collision.Matrix3d; import com.simibubi.create.foundation.mixin.accessor.ServerLevelAccessor; import com.simibubi.create.foundation.networking.AllPackets; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -95,7 +95,7 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit /* * staleTicks are a band-aid to prevent a frame or two of missing blocks between * contraption discard and off-thread block placement on disassembly - * + * * FIXME this timeout should be longer but then also cancelled early based on a * chunk rebuild listener */ @@ -115,7 +115,7 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit return; contraption.onEntityCreated(this); } - + @Override public void move(MoverType pType, Vec3 pPos) { if (pType == MoverType.SHULKER) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AssemblyException.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AssemblyException.java index 630d563b10..3049d691dd 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AssemblyException.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AssemblyException.java @@ -1,7 +1,7 @@ package com.simibubi.create.content.contraptions.components.structureMovement; import com.simibubi.create.foundation.config.AllConfigs; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; @@ -45,7 +45,7 @@ public class AssemblyException extends Exception { } public AssemblyException(String langKey, Object... objects) { - this(Lang.translateDirect("gui.assembly.exception." + langKey, objects)); + this(CreateLang.translateDirect("gui.assembly.exception." + langKey, objects)); } public static AssemblyException unmovableBlock(BlockPos pos, BlockState state) { @@ -72,7 +72,7 @@ public class AssemblyException extends Exception { public static AssemblyException noPistonPoles() { return new AssemblyException("noPistonPoles"); } - + public static AssemblyException notEnoughSails(int sails) { return new AssemblyException("not_enough_sails", sails, AllConfigs.SERVER.kinetics.minimumWindmillSails.get()); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java index 5a66c6d05c..62ba36e36c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java @@ -67,15 +67,15 @@ import com.simibubi.create.content.logistics.trains.IBogeyBlock; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.tileEntity.IMultiTileContainer; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; -import com.simibubi.create.foundation.utility.BBHelper; -import com.simibubi.create.foundation.utility.BlockFace; import com.simibubi.create.foundation.utility.BlockHelper; import com.simibubi.create.foundation.utility.ICoordinate; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.NBTHelper; import com.simibubi.create.foundation.utility.NBTProcessors; -import com.simibubi.create.foundation.utility.UniqueLinkedList; +import net.createmod.catnip.utility.BBHelper; +import net.createmod.catnip.utility.BlockFace; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.utility.UniqueLinkedList; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionCollider.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionCollider.java index 97c49484ce..395f775ffd 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionCollider.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionCollider.java @@ -25,9 +25,9 @@ import com.simibubi.create.foundation.collision.OrientedBB; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.utility.BlockHelper; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.client.player.LocalPlayer; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -89,10 +89,10 @@ public class ContraptionCollider { continue; entity.getSelfAndPassengers().forEach(e -> { - if (e instanceof ServerPlayer) + if (e instanceof ServerPlayer) ((ServerPlayer) e).connection.aboveGroundTickCount = 0; }); - + if (playerType == PlayerType.SERVER) continue; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionHandler.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionHandler.java index 84f6b2a49a..6e72902fbe 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionHandler.java @@ -8,11 +8,11 @@ import java.util.List; import java.util.Map; import com.simibubi.create.foundation.advancement.AllAdvancements; -import com.simibubi.create.foundation.utility.VecHelper; -import com.simibubi.create.foundation.utility.WorldAttached; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import it.unimi.dsi.fastutil.objects.ObjectLists; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.WorldAttached; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; import net.minecraft.world.entity.Entity; @@ -53,7 +53,7 @@ public class ContraptionHandler { contraptionEntity.staleTicks--; continue; } - + ContraptionCollider.collideEntities(contraptionEntity); } } @@ -80,8 +80,8 @@ public class ContraptionHandler { return; Vec3 prevPosition = VecHelper.readNBT(data.getList("ContraptionMountLocation", Tag.TAG_DOUBLE)); data.remove("ContraptionMountLocation"); - - if (entityLiving instanceof Player player && !prevPosition.closerThan(position, 5000)) + + if (entityLiving instanceof Player player && !prevPosition.closerThan(position, 5000)) AllAdvancements.LONG_TRAVEL.awardTo(player); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionHandlerClient.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionHandlerClient.java index f9d40b9cb9..cb828b3db5 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionHandlerClient.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionHandlerClient.java @@ -11,12 +11,12 @@ import com.simibubi.create.content.contraptions.components.structureMovement.syn import com.simibubi.create.content.logistics.trains.entity.CarriageContraptionEntity; import com.simibubi.create.content.logistics.trains.entity.TrainRelocator; import com.simibubi.create.foundation.networking.AllPackets; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.RaycastHelper; import com.simibubi.create.foundation.utility.RaycastHelper.PredicateTraceResult; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; import net.minecraft.client.player.RemotePlayer; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionWorld.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionWorld.java index c5e429949c..e9e945e69c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionWorld.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionWorld.java @@ -1,7 +1,6 @@ package com.simibubi.create.content.contraptions.components.structureMovement; -import com.simibubi.create.foundation.utility.worldWrappers.WrappedWorld; - +import net.createmod.catnip.utility.worldWrappers.WrappedWorld; import net.minecraft.core.BlockPos; import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundSource; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ControlledContraptionEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ControlledContraptionEntity.java index c00fa8cad3..5e61ec4dce 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ControlledContraptionEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ControlledContraptionEntity.java @@ -1,14 +1,14 @@ package com.simibubi.create.content.contraptions.components.structureMovement; -import static com.simibubi.create.foundation.utility.AngleHelper.angleLerp; +import static net.createmod.catnip.utility.math.AngleHelper.angleLerp; import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllEntityTypes; import com.simibubi.create.content.contraptions.components.structureMovement.bearing.BearingContraption; -import com.simibubi.create.foundation.utility.NBTHelper; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/DirectionalExtenderScrollOptionSlot.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/DirectionalExtenderScrollOptionSlot.java index 0a04654c9e..17e1f91d39 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/DirectionalExtenderScrollOptionSlot.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/DirectionalExtenderScrollOptionSlot.java @@ -5,8 +5,8 @@ import java.util.function.BiPredicate; import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.foundation.tileEntity.behaviour.CenteredSideValueBoxTransform; -import com.simibubi.create.foundation.utility.AngleHelper; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.core.Direction; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockStateProperties; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/IControlContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/IControlContraption.java index a48f9d8837..0b1b7864d2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/IControlContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/IControlContraption.java @@ -2,20 +2,20 @@ package com.simibubi.create.content.contraptions.components.structureMovement; import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.INamedIconOptions; -import com.simibubi.create.foundation.utility.Lang; +import net.createmod.catnip.utility.lang.Lang; import net.minecraft.core.BlockPos; public interface IControlContraption { public boolean isAttachedTo(AbstractContraptionEntity contraption); - + public void attach(ControlledContraptionEntity contraption); public void onStall(); public boolean isValid(); - + public BlockPos getBlockPosition(); static enum MovementMode implements INamedIconOptions { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/IDisplayAssemblyExceptions.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/IDisplayAssemblyExceptions.java index d9477f0c35..4c59fedb96 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/IDisplayAssemblyExceptions.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/IDisplayAssemblyExceptions.java @@ -4,9 +4,9 @@ import java.util.Arrays; import java.util.List; import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation; -import com.simibubi.create.foundation.item.TooltipHelper; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.FontHelper; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TextComponent; @@ -22,12 +22,12 @@ public interface IDisplayAssemblyExceptions { tooltip.add(TextComponent.EMPTY); tooltip.add(IHaveGoggleInformation.componentSpacing.plainCopy() - .append(Lang.translateDirect("gui.assembly.exception") + .append(CreateLang.translateDirect("gui.assembly.exception") .withStyle(ChatFormatting.GOLD))); String text = e.component.getString(); Arrays.stream(text.split("\n")) - .forEach(l -> TooltipHelper.cutStringTextComponent(l, ChatFormatting.GRAY, ChatFormatting.WHITE) + .forEach(l -> FontHelper.cutStringTextComponent(l, ChatFormatting.GRAY, ChatFormatting.WHITE) .forEach(c -> tooltip.add(IHaveGoggleInformation.componentSpacing.plainCopy() .append(c)))); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MountedFluidStorage.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MountedFluidStorage.java index a86acebfa7..d372a7a28f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MountedFluidStorage.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MountedFluidStorage.java @@ -6,10 +6,10 @@ import com.simibubi.create.content.contraptions.fluids.tank.CreativeFluidTankTil import com.simibubi.create.content.contraptions.fluids.tank.FluidTankTileEntity; import com.simibubi.create.foundation.fluid.SmartFluidTank; import com.simibubi.create.foundation.networking.AllPackets; -import com.simibubi.create.foundation.utility.NBTHelper; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; -import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.entity.Entity; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MountedStorage.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MountedStorage.java index f9d8f28130..ba39c3687a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MountedStorage.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MountedStorage.java @@ -5,8 +5,8 @@ import com.simibubi.create.content.contraptions.components.crafter.MechanicalCra import com.simibubi.create.content.contraptions.processing.ProcessingInventory; import com.simibubi.create.content.logistics.block.inventories.BottomlessItemHandler; import com.simibubi.create.content.logistics.block.vault.ItemVaultTileEntity; -import com.simibubi.create.foundation.utility.NBTHelper; +import net.createmod.catnip.utility.NBTHelper; import net.minecraft.core.NonNullList; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.ContainerHelper; @@ -182,7 +182,7 @@ public class MountedStorage { public boolean isValid() { return valid; } - + public boolean canUseForFuel() { return !noFuel; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MountedStorageManager.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MountedStorageManager.java index 6d75668671..aa01f46270 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MountedStorageManager.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MountedStorageManager.java @@ -11,8 +11,8 @@ import java.util.stream.Collectors; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption.ContraptionInvWrapper; import com.simibubi.create.content.contraptions.fluids.tank.FluidTankTileEntity; import com.simibubi.create.foundation.fluid.CombinedTankWrapper; -import com.simibubi.create.foundation.utility.NBTHelper; +import net.createmod.catnip.utility.NBTHelper; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementContext.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementContext.java index 751044b5b9..953fa42f6e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementContext.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementContext.java @@ -2,8 +2,7 @@ package com.simibubi.create.content.contraptions.components.structureMovement; import java.util.function.UnaryOperator; -import com.simibubi.create.foundation.utility.VecHelper; - +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; @@ -79,4 +78,4 @@ public class MovementContext { return nbt; } -} \ No newline at end of file +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/OrientedContraptionEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/OrientedContraptionEntity.java index 6738e47695..96742f86be 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/OrientedContraptionEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/OrientedContraptionEntity.java @@ -1,6 +1,6 @@ package com.simibubi.create.content.contraptions.components.structureMovement; -import static com.simibubi.create.foundation.utility.AngleHelper.angleLerp; +import static net.createmod.catnip.utility.math.AngleHelper.angleLerp; import java.util.Optional; import java.util.UUID; @@ -17,11 +17,11 @@ import com.simibubi.create.content.contraptions.components.structureMovement.tra import com.simibubi.create.content.contraptions.components.structureMovement.train.capability.CapabilityMinecartController; import com.simibubi.create.content.contraptions.components.structureMovement.train.capability.MinecartController; import com.simibubi.create.foundation.item.ItemHelper; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.NBTHelper; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/StructureTransform.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/StructureTransform.java index 1fd7d9b890..e78c220db6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/StructureTransform.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/StructureTransform.java @@ -9,10 +9,10 @@ import com.simibubi.create.content.contraptions.base.DirectionalAxisKineticBlock import com.simibubi.create.content.contraptions.components.structureMovement.chassis.AbstractChassisBlock; import com.simibubi.create.content.contraptions.relays.belt.BeltBlock; import com.simibubi.create.content.contraptions.relays.belt.BeltSlope; -import com.simibubi.create.foundation.utility.DirectionHelper; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.DirectionHelper; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -96,7 +96,7 @@ public class StructureTransform { vec = VecHelper.rotate(vec, angle, rotationAxis); return vec; } - + public Vec3 applyWithoutOffset(Vec3 localVec) { Vec3 vec = localVec; if (mirror != null) @@ -136,7 +136,7 @@ public class StructureTransform { if (rotationAxis == Axis.Y) { if (block instanceof BellBlock) { - if (state.getValue(BlockStateProperties.BELL_ATTACHMENT) == BellAttachType.DOUBLE_WALL) + if (state.getValue(BlockStateProperties.BELL_ATTACHMENT) == BellAttachType.DOUBLE_WALL) state = state.setValue(BlockStateProperties.BELL_ATTACHMENT, BellAttachType.SINGLE_WALL); return state.setValue(BellBlock.FACING, rotation.rotate(state.getValue(BellBlock.FACING))); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingInstance.java index e4f3034029..46f0405b05 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingInstance.java @@ -9,8 +9,8 @@ import com.mojang.math.Vector3f; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.BackHalfShaftInstance; import com.simibubi.create.content.contraptions.base.KineticTileEntity; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.AnimationTickHolder; +import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.utility.AnimationTickHolder; import net.minecraft.core.Direction; import net.minecraft.world.level.block.state.properties.BlockStateProperties; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java index 659152cce2..715ae5c0c9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java @@ -8,7 +8,7 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.utility.AngleHelper; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkBearingTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkBearingTileEntity.java index c1faf28d4b..d753580b07 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkBearingTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkBearingTileEntity.java @@ -15,10 +15,11 @@ import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.INamedIconOptions; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollOptionBehaviour; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.foundation.utility.ServerSpeedProvider; +import net.createmod.catnip.utility.lang.Lang; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -54,7 +55,7 @@ public class ClockworkBearingTileEntity extends KineticTileEntity public void addBehaviours(List behaviours) { super.addBehaviours(behaviours); operationMode = new ScrollOptionBehaviour<>(ClockHands.class, - Lang.translateDirect("contraptions.clockwork.clock_hands"), this, getMovementModeSlot()); + CreateLang.translateDirect("contraptions.clockwork.clock_hands"), this, getMovementModeSlot()); operationMode.requiresWrench(); behaviours.add(operationMode); registerAwardables(behaviours, AllAdvancements.CLOCKWORK_BEARING); @@ -241,7 +242,7 @@ public class ClockworkBearingTileEntity extends KineticTileEntity hourHand.setPos(anchor.getX(), anchor.getY(), anchor.getZ()); hourHand.setRotationAxis(direction.getAxis()); level.addFreshEntity(hourHand); - + if (contraption.getLeft() .containsBlockBreakers()) award(AllAdvancements.CONTRAPTION_ACTORS); @@ -254,12 +255,12 @@ public class ClockworkBearingTileEntity extends KineticTileEntity minuteHand.setPos(anchor.getX(), anchor.getY(), anchor.getZ()); minuteHand.setRotationAxis(direction.getAxis()); level.addFreshEntity(minuteHand); - + if (contraption.getRight() .containsBlockBreakers()) award(AllAdvancements.CONTRAPTION_ACTORS); } - + award(AllAdvancements.CLOCKWORK_BEARING); // Run diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkContraption.java index 5027c0bea2..5d82af30a1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkContraption.java @@ -10,8 +10,8 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Ass import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionType; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionLighter; -import com.simibubi.create.foundation.utility.NBTHelper; +import net.createmod.catnip.utility.NBTHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingTileEntity.java index b02f94773f..329296ae18 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingTileEntity.java @@ -12,10 +12,10 @@ import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollOptionBehaviour; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.foundation.utility.ServerSpeedProvider; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; @@ -51,7 +51,7 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity @Override public void addBehaviours(List behaviours) { super.addBehaviours(behaviours); - movementMode = new ScrollOptionBehaviour<>(RotationMode.class, Lang.translateDirect("contraptions.movement_mode"), + movementMode = new ScrollOptionBehaviour<>(RotationMode.class, CreateLang.translateDirect("contraptions.movement_mode"), this, getMovementModeSlot()); movementMode.requiresWrench(); behaviours.add(movementMode); @@ -177,7 +177,7 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity level.addFreshEntity(movedContraption); AllSoundEvents.CONTRAPTION_ASSEMBLE.playOnServer(level, worldPosition); - + if (contraption.containsBlockBreakers()) award(AllAdvancements.CONTRAPTION_ACTORS); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/SailBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/SailBlock.java index ee71a2dd5c..25d7b81ded 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/SailBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/SailBlock.java @@ -12,11 +12,11 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; import com.simibubi.create.foundation.block.WrenchableDirectionalBlock; import com.simibubi.create.foundation.utility.BlockHelper; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.placement.IPlacementHelper; -import com.simibubi.create.foundation.utility.placement.PlacementHelpers; -import com.simibubi.create.foundation.utility.placement.PlacementOffset; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.placement.IPlacementHelper; +import net.createmod.catnip.utility.placement.PlacementHelpers; +import net.createmod.catnip.utility.placement.PlacementOffset; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingInstance.java index 88d9b79982..909f94895f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingInstance.java @@ -11,8 +11,8 @@ import com.simibubi.create.content.contraptions.base.flwdata.RotatingData; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance; import com.simibubi.create.foundation.render.AllMaterialSpecs; -import com.simibubi.create.foundation.utility.AnimationTickHolder; +import net.createmod.catnip.utility.AnimationTickHolder; import net.minecraft.core.Direction; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockStateProperties; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingMovementBehaviour.java index 340db86f89..4185af03d9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingMovementBehaviour.java @@ -17,8 +17,8 @@ import com.simibubi.create.content.contraptions.components.structureMovement.ren import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.utility.AnimationTickHolder; +import net.createmod.catnip.utility.AnimationTickHolder; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/WindmillBearingBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/WindmillBearingBlock.java index a28c89f029..da97e6dcf1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/WindmillBearingBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/WindmillBearingBlock.java @@ -2,8 +2,8 @@ package com.simibubi.create.content.contraptions.components.structureMovement.be import com.simibubi.create.AllTileEntities; import com.simibubi.create.foundation.block.ITE; -import com.simibubi.create.foundation.utility.Couple; +import net.createmod.catnip.utility.Couple; import net.minecraft.core.BlockPos; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; @@ -46,12 +46,12 @@ public class WindmillBearingBlock extends BearingBlock implements ITE getTileEntityClass() { return WindmillBearingTileEntity.class; } - + @Override public BlockEntityType getTileEntityType() { return AllTileEntities.WINDMILL_BEARING.get(); } - + public static Couple getSpeedRange() { return Couple.create(1, 16); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/WindmillBearingTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/WindmillBearingTileEntity.java index e9c5d7079c..89af1936a6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/WindmillBearingTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/WindmillBearingTileEntity.java @@ -8,8 +8,9 @@ import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.INamedIconOptions; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollOptionBehaviour; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.lang.Lang; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.util.Mth; @@ -52,7 +53,7 @@ public class WindmillBearingTileEntity extends MechanicalBearingTileEntity { if (!running) assembleNextTick = true; } - + public void disassembleForMovement() { if (!running) return; @@ -101,7 +102,7 @@ public class WindmillBearingTileEntity extends MechanicalBearingTileEntity { super.addBehaviours(behaviours); behaviours.remove(movementMode); movementDirection = new ScrollOptionBehaviour<>(RotationDirection.class, - Lang.translateDirect("contraptions.windmill.rotation_direction"), this, getMovementModeSlot()); + CreateLang.translateDirect("contraptions.windmill.rotation_direction"), this, getMovementModeSlot()); movementDirection.requiresWrench(); movementDirection.withCallback($ -> onDirectionChanged()); behaviours.add(movementDirection); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/AbstractChassisBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/AbstractChassisBlock.java index 3c1ae6875b..e6435644a1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/AbstractChassisBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/AbstractChassisBlock.java @@ -5,8 +5,8 @@ import com.simibubi.create.AllSoundEvents; import com.simibubi.create.AllTileEntities; import com.simibubi.create.content.contraptions.wrench.IWrenchable; import com.simibubi.create.foundation.block.ITE; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.particles.ParticleTypes; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/ChassisRangeDisplay.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/ChassisRangeDisplay.java index 26a1ca3249..13cbbffe6e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/ChassisRangeDisplay.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/ChassisRangeDisplay.java @@ -13,8 +13,8 @@ import com.mojang.datafixers.util.Pair; import com.simibubi.create.AllItems; import com.simibubi.create.AllKeys; import com.simibubi.create.AllSpecialTextures; -import com.simibubi.create.CreateClient; +import net.createmod.catnip.CatnipClient; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.world.entity.player.Player; @@ -35,7 +35,7 @@ public class ChassisRangeDisplay { public Entry(ChassisTileEntity te) { this.te = te; timer = DISPLAY_TIME; - CreateClient.OUTLINER.showCluster(getOutlineKey(), createSelection(te)) + CatnipClient.OUTLINER.showCluster(getOutlineKey(), createSelection(te)) .colored(0xFFFFFF) .disableNormals() .lineWidth(1 / 16f) @@ -97,7 +97,7 @@ public class ChassisRangeDisplay { Entry entry = entries.get(pos); if (tickEntry(entry, hasWrench)) iterator.remove(); - CreateClient.OUTLINER.keep(entry.getOutlineKey()); + CatnipClient.OUTLINER.keep(entry.getOutlineKey()); } for (Iterator iterator = groupEntries.iterator(); iterator.hasNext();) { @@ -107,7 +107,7 @@ public class ChassisRangeDisplay { if (group == lastHoveredGroup) lastHoveredGroup = null; } - CreateClient.OUTLINER.keep(group.getOutlineKey()); + CatnipClient.OUTLINER.keep(group.getOutlineKey()); } if (!hasWrench) @@ -173,9 +173,9 @@ public class ChassisRangeDisplay { GroupEntry hoveredGroup = new GroupEntry(chassis); for (ChassisTileEntity included : hoveredGroup.includedTEs) - CreateClient.OUTLINER.remove(included.getBlockPos()); + CatnipClient.OUTLINER.remove(included.getBlockPos()); - groupEntries.forEach(entry -> CreateClient.OUTLINER.remove(entry.getOutlineKey())); + groupEntries.forEach(entry -> CatnipClient.OUTLINER.remove(entry.getOutlineKey())); groupEntries.clear(); entries.clear(); groupEntries.add(hoveredGroup); @@ -186,7 +186,7 @@ public class ChassisRangeDisplay { BlockPos pos = chassis.getBlockPos(); GroupEntry entry = getExistingGroupForPos(pos); if (entry != null) - CreateClient.OUTLINER.remove(entry.getOutlineKey()); + CatnipClient.OUTLINER.remove(entry.getOutlineKey()); groupEntries.clear(); entries.clear(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/ChassisTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/ChassisTileEntity.java index 2a552461cd..37d1823054 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/ChassisTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/ChassisTileEntity.java @@ -16,9 +16,9 @@ import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.CenteredSideValueBoxTransform; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.BulkScrollValueBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollValueBehaviour; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -41,7 +41,7 @@ public class ChassisTileEntity extends SmartTileEntity { @Override public void addBehaviours(List behaviours) { int max = AllConfigs.SERVER.kinetics.maxChassisRange.get(); - range = new BulkScrollValueBehaviour(Lang.translateDirect("generic.range"), this, new CenteredSideValueBoxTransform(), + range = new BulkScrollValueBehaviour(CreateLang.translateDirect("generic.range"), this, new CenteredSideValueBoxTransform(), te -> ((ChassisTileEntity) te).collectChassisGroup()); range.requiresWrench(); range.between(1, max); @@ -56,7 +56,7 @@ public class ChassisTileEntity extends SmartTileEntity { public void initialize() { super.initialize(); if (getBlockState().getBlock() instanceof RadialChassisBlock) - range.setLabel(Lang.translateDirect("generic.radius")); + range.setLabel(CreateLang.translateDirect("generic.radius")); } public int getRange() { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerInstance.java index e94e2b5cec..ce923e75a9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerInstance.java @@ -5,9 +5,9 @@ import com.jozufozu.flywheel.api.instance.DynamicInstance; import com.jozufozu.flywheel.backend.instancing.blockentity.BlockEntityInstance; import com.jozufozu.flywheel.core.materials.model.ModelData; import com.simibubi.create.AllBlockPartials; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.AnimationTickHolder; +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.Minecraft; import net.minecraft.core.Direction; import net.minecraft.util.Mth; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerRenderer.java index cfb6a1d0e0..d33f73eab3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerRenderer.java @@ -6,9 +6,9 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.AnimationTickHolder; +import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.ponder.utility.WorldTickHolder; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; @@ -29,7 +29,7 @@ public class StickerRenderer extends SafeTileEntityRenderer { BlockState state = te.getBlockState(); SuperByteBuffer head = CachedBufferer.partial(AllBlockPartials.STICKER_HEAD, state); - float offset = te.piston.getValue(AnimationTickHolder.getPartialTicks(te.getLevel())); + float offset = te.piston.getValue(WorldTickHolder.getPartialTicks(te.getLevel())); if (te.getLevel() != Minecraft.getInstance().level && !te.isVirtual()) offset = state.getValue(StickerBlock.EXTENDED) ? 1 : 0; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerTileEntity.java index 71724bf40c..413ef22d40 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerTileEntity.java @@ -9,9 +9,9 @@ import com.simibubi.create.content.contraptions.components.structureMovement.glu import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueItem; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; -import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -85,7 +85,7 @@ public class StickerTileEntity extends SmartTileEntity { protected void write(CompoundTag tag, boolean clientPacket) { super.write(tag, clientPacket); } - + @Override protected void read(CompoundTag compound, boolean clientPacket) { super.read(compound, clientPacket); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageBlock.java index 71ae146fca..cff65aee1f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageBlock.java @@ -6,8 +6,8 @@ import com.simibubi.create.content.contraptions.base.DirectionalAxisKineticBlock import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.relays.advanced.GantryShaftBlock; import com.simibubi.create.foundation.block.ITE; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -138,5 +138,5 @@ public class GantryCarriageBlock extends DirectionalAxisKineticBlock implements public BlockEntityType getTileEntityType() { return AllTileEntities.GANTRY_PINION.get(); } - + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageInstance.java index f84270b534..626854d9c8 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageInstance.java @@ -7,9 +7,9 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.relays.encased.ShaftInstance; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.util.Mth; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageRenderer.java index 6e3e6fd44c..b2e52eb9f5 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageRenderer.java @@ -7,10 +7,10 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.ponder.utility.WorldTickHolder; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; @@ -70,7 +70,7 @@ public class GantryCarriageRenderer extends KineticTileEntityRenderer { } public static float getAngleForTe(KineticTileEntity te, final BlockPos pos, Axis axis) { - float time = AnimationTickHolder.getRenderTime(te.getLevel()); + float time = WorldTickHolder.getRenderTime(te.getLevel()); float offset = getRotationOffsetForPosition(te, pos, axis); return (time * te.getSpeed() * 3f / 20 + offset) % 360; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryContraptionEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryContraptionEntity.java index f088e92362..ec27f26c05 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryContraptionEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryContraptionEntity.java @@ -10,9 +10,9 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Str import com.simibubi.create.content.contraptions.relays.advanced.GantryShaftBlock; import com.simibubi.create.content.contraptions.relays.advanced.GantryShaftTileEntity; import com.simibubi.create.foundation.networking.AllPackets; -import com.simibubi.create.foundation.utility.NBTHelper; import com.simibubi.create.foundation.utility.ServerSpeedProvider; +import net.createmod.catnip.utility.NBTHelper; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -121,7 +121,7 @@ public class GantryContraptionEntity extends AbstractContraptionEntity { if (level.isClientSide) return; - + axisMotion = pinionMovementSpeed; setContraptionMotion(movementVec); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java index 2c74e3b0fe..c6086068c5 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java @@ -15,9 +15,9 @@ import com.simibubi.create.content.contraptions.components.structureMovement.cha import com.simibubi.create.content.schematics.ISpecialEntityItemRequirement; import com.simibubi.create.content.schematics.ItemRequirement; import com.simibubi.create.content.schematics.ItemRequirement.ItemUseType; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -294,7 +294,7 @@ public class SuperGlueEntity extends Entity implements IEntityAdditionalSpawnDat public PushReaction getPistonPushReaction() { return PushReaction.IGNORE; } - + @Override public PortalInfo findDimensionEntryPoint(ServerLevel pDestination) { portalEntrancePos = blockPosition(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueHandler.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueHandler.java index 66ed67c86d..08c9b8a9c4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueHandler.java @@ -6,10 +6,10 @@ import java.util.Set; import com.simibubi.create.AllItems; import com.simibubi.create.content.contraptions.components.structureMovement.BlockMovementChecks; import com.simibubi.create.foundation.networking.AllPackets; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.placement.IPlacementHelper; -import com.simibubi.create.foundation.utility.worldWrappers.RayTraceWorld; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.placement.IPlacementHelper; +import net.createmod.catnip.utility.worldWrappers.RayTraceWorld; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueItem.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueItem.java index feacc0e42b..931bd5ac01 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueItem.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueItem.java @@ -1,8 +1,8 @@ package com.simibubi.create.content.contraptions.components.structureMovement.glue; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.AbstractChassisBlock; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.particles.ItemParticleOption; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueSelectionHandler.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueSelectionHandler.java index ca772f7930..7c828b90a8 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueSelectionHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueSelectionHandler.java @@ -7,12 +7,12 @@ import java.util.Set; import com.google.common.base.Objects; import com.simibubi.create.AllSoundEvents; import com.simibubi.create.AllSpecialTextures; -import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.AbstractChassisBlock; import com.simibubi.create.foundation.networking.AllPackets; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.foundation.utility.RaycastHelper; +import net.createmod.catnip.CatnipClient; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.player.LocalPlayer; @@ -63,7 +63,7 @@ public class SuperGlueSelectionHandler { if (clusterCooldown > 0) { if (clusterCooldown == 25) player.displayClientMessage(TextComponent.EMPTY, true); - CreateClient.OUTLINER.keep(clusterOutlineSlot); + CatnipClient.OUTLINER.keep(clusterOutlineSlot); clusterCooldown--; } @@ -97,7 +97,7 @@ public class SuperGlueSelectionHandler { for (SuperGlueEntity glueEntity : glueNearby) { boolean h = clusterCooldown == 0 && glueEntity == selected; AllSpecialTextures faceTex = h ? AllSpecialTextures.GLUE : null; - CreateClient.OUTLINER.showAABB(glueEntity, glueEntity.getBoundingBox()) + CatnipClient.OUTLINER.showAABB(glueEntity, glueEntity.getBoundingBox()) .colored(h ? HIGHLIGHT : PASSIVE) .withFaceTextures(faceTex, faceTex) .disableNormals() @@ -115,7 +115,7 @@ public class SuperGlueSelectionHandler { } if (firstPos != null && !firstPos.closerThan(hovered, 24)) { - Lang.translate("super_glue.too_far") + CreateLang.translate("super_glue.too_far") .color(FAIL) .sendStatus(player); return; @@ -147,18 +147,18 @@ public class SuperGlueSelectionHandler { key = "super_glue.click_to_discard"; } - Lang.translate(key) + CreateLang.translate(key) .color(color) .sendStatus(player); if (currentSelectionBox != null) - CreateClient.OUTLINER.showAABB(bbOutlineSlot, currentSelectionBox) + CatnipClient.OUTLINER.showAABB(bbOutlineSlot, currentSelectionBox) .colored(canReach && canAfford && !cancel ? HIGHLIGHT : FAIL) .withFaceTextures(AllSpecialTextures.GLUE, AllSpecialTextures.GLUE) .disableNormals() .lineWidth(1 / 16f); - CreateClient.OUTLINER.showCluster(clusterOutlineSlot, currentCluster) + CatnipClient.OUTLINER.showCluster(clusterOutlineSlot, currentCluster) .colored(0x4D9162) .disableNormals() .lineWidth(1 / 64f); @@ -233,7 +233,7 @@ public class SuperGlueSelectionHandler { firstPos = hoveredPos; if (face != null) SuperGlueItem.spawnParticles(level, firstPos, face, true); - Lang.translate("super_glue.first_pos") + CreateLang.translate("super_glue.first_pos") .sendStatus(player); AllSoundEvents.SLIME_ADDED.playAt(level, firstPos, 0.5F, 0.85F, false); level.playSound(player, firstPos, SoundEvents.ITEM_FRAME_ADD_ITEM, SoundSource.BLOCKS, 0.75f, 1); @@ -244,7 +244,7 @@ public class SuperGlueSelectionHandler { LocalPlayer player = Minecraft.getInstance().player; currentCluster = null; firstPos = null; - Lang.translate("super_glue.abort") + CreateLang.translate("super_glue.abort") .sendStatus(player); clusterCooldown = 0; } @@ -256,14 +256,14 @@ public class SuperGlueSelectionHandler { player.level.playSound(player, hoveredPos, SoundEvents.ITEM_FRAME_ADD_ITEM, SoundSource.BLOCKS, 0.75f, 1); if (currentCluster != null) - CreateClient.OUTLINER.showCluster(clusterOutlineSlot, currentCluster) + CatnipClient.OUTLINER.showCluster(clusterOutlineSlot, currentCluster) .colored(0xB5F2C6) .withFaceTextures(AllSpecialTextures.GLUE, AllSpecialTextures.HIGHLIGHT_CHECKERED) .disableNormals() .lineWidth(1 / 24f); discard(); - Lang.translate("super_glue.success") + CreateLang.translate("super_glue.success") .sendStatus(player); clusterCooldown = 40; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueSelectionHelper.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueSelectionHelper.java index 4089269d5b..fc85e12c65 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueSelectionHelper.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueSelectionHelper.java @@ -6,8 +6,8 @@ import java.util.List; import java.util.Set; import com.simibubi.create.content.contraptions.components.structureMovement.BlockMovementChecks; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.NonNullList; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/interaction/controls/ControlsHandler.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/interaction/controls/ControlsHandler.java index 3017f10d36..f7cc8edcb1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/interaction/controls/ControlsHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/interaction/controls/ControlsHandler.java @@ -11,7 +11,7 @@ import com.mojang.blaze3d.platform.InputConstants; import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity; import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.utility.ControlsUtil; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; @@ -40,7 +40,7 @@ public class ControlsHandler { controlsPos = controllerLocalPos; Minecraft.getInstance().player.displayClientMessage( - Lang.translateDirect("contraption.controls.start_controlling", entity.getContraptionName()), true); + CreateLang.translateDirect("contraption.controls.start_controlling", entity.getContraptionName()), true); } public static void stopControlling() { @@ -57,7 +57,7 @@ public class ControlsHandler { controlsPos = null; currentlyPressed.clear(); - Minecraft.getInstance().player.displayClientMessage(Lang.translateDirect("contraption.controls.stop_controlling"), + Minecraft.getInstance().player.displayClientMessage(CreateLang.translateDirect("contraption.controls.stop_controlling"), true); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/interaction/controls/ControlsMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/interaction/controls/ControlsMovementBehaviour.java index abff6a032e..d0dbee40b9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/interaction/controls/ControlsMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/interaction/controls/ControlsMovementBehaviour.java @@ -8,10 +8,10 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Mov import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionMatrices; import com.simibubi.create.content.logistics.trains.entity.CarriageContraptionEntity; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; -import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; +import net.createmod.ponder.utility.WorldTickHolder; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.core.Direction; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate.StructureBlockInfo; @@ -80,7 +80,7 @@ public class ControlsMovementBehaviour implements MovementBehaviour { angles.speed.chase(0, 0, Chaser.EXP); } - float pt = AnimationTickHolder.getPartialTicks(context.world); + float pt = WorldTickHolder.getPartialTicks(context.world); ControlsRenderer.render(context, renderWorld, matrices, buffer, angles.equipAnimation.getValue(pt), angles.speed.getValue(pt), angles.steering.getValue(pt)); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/interaction/controls/ControlsRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/interaction/controls/ControlsRenderer.java index 6bbfe9b0a9..a18d92934b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/interaction/controls/ControlsRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/interaction/controls/ControlsRenderer.java @@ -9,9 +9,9 @@ import com.simibubi.create.content.contraptions.components.structureMovement.ren import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/interaction/controls/ControlsServerHandler.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/interaction/controls/ControlsServerHandler.java index f3d78b7c25..55e19ffb12 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/interaction/controls/ControlsServerHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/interaction/controls/ControlsServerHandler.java @@ -9,9 +9,9 @@ import java.util.Map.Entry; import java.util.UUID; import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity; -import com.simibubi.create.foundation.utility.IntAttached; -import com.simibubi.create.foundation.utility.WorldAttached; +import net.createmod.catnip.utility.IntAttached; +import net.createmod.catnip.utility.WorldAttached; import net.minecraft.core.BlockPos; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.LevelAccessor; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/interaction/controls/TrainHUD.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/interaction/controls/TrainHUD.java index 3a7b7d2115..ebccd40b18 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/interaction/controls/TrainHUD.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/interaction/controls/TrainHUD.java @@ -7,12 +7,12 @@ import com.simibubi.create.content.logistics.trains.entity.Train; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.networking.AllPackets; -import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.ControlsUtil; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; -import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; -import com.simibubi.create.foundation.utility.placement.PlacementHelpers; +import net.createmod.catnip.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.utility.placement.PlacementHelpers; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiComponent; @@ -132,12 +132,12 @@ public class TrainHUD { AllGuiTextures.TRAIN_HUD_FRAME.render(poseStack, -2, 1); AllGuiTextures.TRAIN_HUD_SPEED_BG.render(poseStack, 0, 0); - int w = (int) (AllGuiTextures.TRAIN_HUD_SPEED.width * displayedSpeed.getValue(partialTicks)); - int h = AllGuiTextures.TRAIN_HUD_SPEED.height; + int w = (int) (AllGuiTextures.TRAIN_HUD_SPEED.getWidth() * displayedSpeed.getValue(partialTicks)); + int h = AllGuiTextures.TRAIN_HUD_SPEED.getHeight(); AllGuiTextures.TRAIN_HUD_SPEED.bind(); - GuiComponent.blit(poseStack, 0, 0, 0, AllGuiTextures.TRAIN_HUD_SPEED.startX, - AllGuiTextures.TRAIN_HUD_SPEED.startY, w, h, 256, 256); + GuiComponent.blit(poseStack, 0, 0, 0, AllGuiTextures.TRAIN_HUD_SPEED.getStartX(), + AllGuiTextures.TRAIN_HUD_SPEED.getStartY(), w, h, 256, 256); int promptSize = (int) displayedPromptSize.getValue(partialTicks); if (promptSize > 1) { @@ -147,8 +147,8 @@ public class TrainHUD { AllGuiTextures.TRAIN_PROMPT_L.render(poseStack, -3, 0); AllGuiTextures.TRAIN_PROMPT_R.render(poseStack, promptSize, 0); - GuiComponent.blit(poseStack, 0, 0, 0, AllGuiTextures.TRAIN_PROMPT.startX + (128 - promptSize / 2f), - AllGuiTextures.TRAIN_PROMPT.startY, promptSize, AllGuiTextures.TRAIN_PROMPT.height, 256, 256); + GuiComponent.blit(poseStack, 0, 0, 0, AllGuiTextures.TRAIN_PROMPT.getStartX() + (128 - promptSize / 2f), + AllGuiTextures.TRAIN_PROMPT.getStartY(), promptSize, AllGuiTextures.TRAIN_PROMPT.getHeight(), 256, 256); poseStack.popPose(); @@ -166,13 +166,13 @@ public class TrainHUD { AllGuiTextures.TRAIN_HUD_DIRECTION.render(poseStack, 77, -20); - w = (int) (AllGuiTextures.TRAIN_HUD_THROTTLE.width * (1 - displayedThrottle.getValue(partialTicks))); + w = (int) (AllGuiTextures.TRAIN_HUD_THROTTLE.getWidth() * (1 - displayedThrottle.getValue(partialTicks))); AllGuiTextures.TRAIN_HUD_THROTTLE.bind(); - int invW = AllGuiTextures.TRAIN_HUD_THROTTLE.width - w; - GuiComponent.blit(poseStack, invW, 0, 0, AllGuiTextures.TRAIN_HUD_THROTTLE.startX + invW, - AllGuiTextures.TRAIN_HUD_THROTTLE.startY, w, h, 256, 256); + int invW = AllGuiTextures.TRAIN_HUD_THROTTLE.getWidth() - w; + GuiComponent.blit(poseStack, invW, 0, 0, AllGuiTextures.TRAIN_HUD_THROTTLE.getStartX() + invW, + AllGuiTextures.TRAIN_HUD_THROTTLE.getStartY(), w, h, 256, 256); AllGuiTextures.TRAIN_HUD_THROTTLE_POINTER.render(poseStack, - Math.max(1, AllGuiTextures.TRAIN_HUD_THROTTLE.width - w) - 3, -2); + Math.max(1, AllGuiTextures.TRAIN_HUD_THROTTLE.getWidth() - w) - 3, -2); // Direction diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssembleRailType.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssembleRailType.java index 0810b6a344..f67e1edfe6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssembleRailType.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssembleRailType.java @@ -3,9 +3,9 @@ package com.simibubi.create.content.contraptions.components.structureMovement.mo import java.util.function.Supplier; import com.simibubi.create.AllBlocks; -import com.simibubi.create.foundation.utility.Lang; import com.tterrag.registrate.util.entry.BlockEntry; +import net.createmod.catnip.utility.lang.Lang; import net.minecraft.util.StringRepresentable; import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; @@ -13,13 +13,13 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; public enum CartAssembleRailType implements StringRepresentable { - + REGULAR(Blocks.RAIL), POWERED_RAIL(Blocks.POWERED_RAIL), DETECTOR_RAIL(Blocks.DETECTOR_RAIL), ACTIVATOR_RAIL(Blocks.ACTIVATOR_RAIL), CONTROLLER_RAIL(AllBlocks.CONTROLLER_RAIL) - + ; private final Supplier railBlockSupplier; @@ -42,11 +42,11 @@ public enum CartAssembleRailType implements StringRepresentable { public Item getItem() { return railItemSupplier.get(); } - + public boolean matches(BlockState rail) { return rail.getBlock() == railBlockSupplier.get(); } - + @Override public String getSerializedName() { return Lang.asId(name()); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerBlockItem.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerBlockItem.java index 7482573daa..988509093e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerBlockItem.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerBlockItem.java @@ -5,7 +5,7 @@ import javax.annotation.Nonnull; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.components.tracks.ControllerRailBlock; import com.simibubi.create.foundation.advancement.AdvancementBehaviour; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -49,7 +49,7 @@ public class CartAssemblerBlockItem extends BlockItem { if (player == null) return false; if (!(block instanceof BaseRailBlock)) { - Lang.translate("block.cart_assembler.invalid") + CreateLang.translate("block.cart_assembler.invalid") .sendStatus(player); return false; } @@ -86,4 +86,4 @@ public class CartAssemblerBlockItem extends BlockItem { AdvancementBehaviour.setPlacedBy(world, pos, player); return true; } -} \ No newline at end of file +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerTileEntity.java index 0ae9a855a4..8dad06ae63 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerTileEntity.java @@ -19,11 +19,12 @@ import com.simibubi.create.foundation.tileEntity.behaviour.CenteredSideValueBoxT import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.INamedIconOptions; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollOptionBehaviour; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.VecHelper; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.lang.Lang; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -173,7 +174,7 @@ public class CartAssemblerTileEntity extends SmartTileEntity implements IDisplay nbt.putDouble("PushX", 0); cart.deserializeNBT(nbt); } - + if (contraption.containsBlockBreakers()) award(AllAdvancements.CONTRAPTION_ACTORS); } @@ -234,7 +235,7 @@ public class CartAssemblerTileEntity extends SmartTileEntity implements IDisplay @Override public void addBehaviours(List behaviours) { movementMode = new ScrollOptionBehaviour<>(CartMovementMode.class, - Lang.translateDirect("contraptions.cart_movement_mode"), this, getMovementModeSlot()); + CreateLang.translateDirect("contraptions.cart_movement_mode"), this, getMovementModeSlot()); movementMode.requiresWrench(); behaviours.add(movementMode); registerAwardables(behaviours, AllAdvancements.CONTRAPTION_ACTORS); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MinecartContraptionItem.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MinecartContraptionItem.java index 28c22731a9..fe9e746ccd 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MinecartContraptionItem.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MinecartContraptionItem.java @@ -13,9 +13,9 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Con import com.simibubi.create.content.contraptions.components.structureMovement.OrientedContraptionEntity; import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.config.ContraptionMovementSetting; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.NBTHelper; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.NBTHelper; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockSource; @@ -218,7 +218,7 @@ public class MinecartContraptionItem extends Item { OrientedContraptionEntity contraption = (OrientedContraptionEntity) passengers.get(0); if(ContraptionMovementSetting.isNoPickup(contraption.getContraption().getBlocks().values())) { - player.displayClientMessage(Lang.translateDirect("contraption.minecart_contraption_illegal_pickup") + player.displayClientMessage(CreateLang.translateDirect("contraption.minecart_contraption_illegal_pickup") .withStyle(ChatFormatting.RED), true); return; } @@ -236,7 +236,7 @@ public class MinecartContraptionItem extends Item { NbtIo.write(generatedStack.serializeNBT(), dataOutput); int estimatedPacketSize = dataOutput.toByteArray().length; if (estimatedPacketSize > 2_000_000) { - player.displayClientMessage(Lang.translateDirect("contraption.minecart_contraption_too_big") + player.displayClientMessage(CreateLang.translateDirect("contraption.minecart_contraption_too_big") .withStyle(ChatFormatting.RED), true); return; } @@ -250,7 +250,7 @@ public class MinecartContraptionItem extends Item { .getBlocks() .size() > 200) AllAdvancements.CART_PICKUP.awardTo(player); - + player.getInventory().placeItemBackInInventory(generatedStack); contraption.discard(); entity.discard(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MountedContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MountedContraption.java index 90f30b4ec7..e98a9a2eb9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MountedContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MountedContraption.java @@ -13,10 +13,10 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Con import com.simibubi.create.content.contraptions.components.structureMovement.NonStationaryLighter; import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerTileEntity.CartMovementMode; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionLighter; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.NBTHelper; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -159,7 +159,7 @@ public class MountedContraption extends Contraption { if (cart instanceof Container container) storage.attachExternal(new ContraptionInvWrapper(true, new InvWrapper(container))); } - + @Override @OnlyIn(Dist.CLIENT) public ContraptionLighter makeLighter() { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/LinearActuatorTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/LinearActuatorTileEntity.java index 39e54a86ea..fce8b9cceb 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/LinearActuatorTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/LinearActuatorTileEntity.java @@ -13,7 +13,7 @@ import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollOptionBehaviour; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.foundation.utility.ServerSpeedProvider; import net.minecraft.core.BlockPos; @@ -49,7 +49,7 @@ public abstract class LinearActuatorTileEntity extends KineticTileEntity @Override public void addBehaviours(List behaviours) { super.addBehaviours(behaviours); - movementMode = new ScrollOptionBehaviour<>(MovementMode.class, Lang.translateDirect("contraptions.movement_mode"), + movementMode = new ScrollOptionBehaviour<>(MovementMode.class, CreateLang.translateDirect("contraptions.movement_mode"), this, getMovementModeSlot()); movementMode.requiresWrench(); movementMode.withCallback(t -> waitingForSpeedChange = false); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonBlock.java index 856c5bbeae..af367514cc 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonBlock.java @@ -9,8 +9,8 @@ import com.simibubi.create.AllTileEntities; import com.simibubi.create.content.contraptions.base.DirectionalAxisKineticBlock; import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.config.AllConfigs; -import com.simibubi.create.foundation.utility.Lang; +import net.createmod.catnip.utility.lang.Lang; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.particles.ParticleTypes; @@ -208,7 +208,7 @@ public class MechanicalPistonBlock extends DirectionalAxisKineticBlock implement public Class getTileEntityClass() { return MechanicalPistonTileEntity.class; } - + @Override public BlockEntityType getTileEntityType() { return AllTileEntities.MECHANICAL_PISTON.get(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonContraption.java index 7413928c2b..a35c278e45 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonContraption.java @@ -21,8 +21,8 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Tra import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.PistonState; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionLighter; import com.simibubi.create.foundation.config.AllConfigs; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonExtensionPoleBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonExtensionPoleBlock.java index e0f63749a2..f153df8fde 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonExtensionPoleBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonExtensionPoleBlock.java @@ -11,10 +11,10 @@ import com.simibubi.create.AllShapes; import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.PistonState; import com.simibubi.create.content.contraptions.wrench.IWrenchable; import com.simibubi.create.foundation.block.WrenchableDirectionalBlock; -import com.simibubi.create.foundation.utility.placement.IPlacementHelper; -import com.simibubi.create.foundation.utility.placement.PlacementHelpers; -import com.simibubi.create.foundation.utility.placement.util.PoleHelper; +import com.simibubi.create.foundation.utility.placement.PoleHelper; +import net.createmod.catnip.utility.placement.IPlacementHelper; +import net.createmod.catnip.utility.placement.PlacementHelpers; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -150,7 +150,7 @@ public class PistonExtensionPoleBlock extends WrenchableDirectionalBlock impleme @Override public BlockState updateShape(BlockState state, Direction direction, BlockState neighbourState, LevelAccessor world, BlockPos pos, BlockPos neighbourPos) { - if (state.getValue(BlockStateProperties.WATERLOGGED)) + if (state.getValue(BlockStateProperties.WATERLOGGED)) world.scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world)); return state; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/AbstractPulleyRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/AbstractPulleyRenderer.java index dfa6dcd0c9..1feb2bef14 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/AbstractPulleyRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/AbstractPulleyRenderer.java @@ -9,8 +9,8 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.utility.AngleHelper; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/HosePulleyInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/HosePulleyInstance.java index 62d7c0e65a..607b7ee6d6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/HosePulleyInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/HosePulleyInstance.java @@ -6,7 +6,8 @@ import com.jozufozu.flywheel.core.Materials; import com.jozufozu.flywheel.core.materials.oriented.OrientedData; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.fluids.actors.HosePulleyTileEntity; -import com.simibubi.create.foundation.utility.AnimationTickHolder; + +import net.createmod.catnip.utility.AnimationTickHolder; public class HosePulleyInstance extends AbstractPulleyInstance { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/RopePulleyInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/RopePulleyInstance.java index 5eac17ee0f..95e5efcc89 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/RopePulleyInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/RopePulleyInstance.java @@ -6,7 +6,8 @@ import com.jozufozu.flywheel.api.MaterialManager; import com.jozufozu.flywheel.core.materials.oriented.OrientedData; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlocks; -import com.simibubi.create.foundation.utility.AnimationTickHolder; + +import net.createmod.catnip.utility.AnimationTickHolder; public class RopePulleyInstance extends AbstractPulleyInstance { public RopePulleyInstance(MaterialManager dispatcher, PulleyTileEntity tile) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionMatrices.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionMatrices.java index a685a2553e..41465a0744 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionMatrices.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionMatrices.java @@ -3,8 +3,8 @@ package com.simibubi.create.content.contraptions.components.structureMovement.re import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Matrix4f; import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity; -import com.simibubi.create.foundation.utility.AnimationTickHolder; +import net.createmod.catnip.utility.AnimationTickHolder; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderInfo.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderInfo.java index 857a1ec4bf..87b25cff7e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderInfo.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderInfo.java @@ -5,8 +5,8 @@ import com.jozufozu.flywheel.event.BeginFrameEvent; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; -import com.simibubi.create.foundation.utility.AnimationTickHolder; +import net.createmod.catnip.utility.AnimationTickHolder; import net.minecraft.util.Mth; public class ContraptionRenderInfo { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/FlwContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/FlwContraption.java index 1149940a0c..2f04034a55 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/FlwContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/FlwContraption.java @@ -14,7 +14,6 @@ import com.jozufozu.flywheel.backend.instancing.batching.BatchingEngine; import com.jozufozu.flywheel.backend.instancing.instancing.InstancingEngine; import com.jozufozu.flywheel.backend.model.ArrayModelRenderer; import com.jozufozu.flywheel.core.model.Model; -import com.jozufozu.flywheel.core.model.WorldModel; import com.jozufozu.flywheel.core.model.WorldModelBuilder; import com.jozufozu.flywheel.core.virtual.VirtualRenderWorld; import com.jozufozu.flywheel.event.BeginFrameEvent; @@ -24,7 +23,7 @@ import com.mojang.math.Matrix4f; import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; import com.simibubi.create.foundation.render.CreateContexts; -import com.simibubi.create.foundation.utility.AnimationTickHolder; +import net.createmod.catnip.utility.AnimationTickHolder; import net.minecraft.client.renderer.RenderType; import net.minecraft.util.Mth; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/SBBContraptionManager.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/SBBContraptionManager.java index ce34578b31..0cbfdcdf06 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/SBBContraptionManager.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/SBBContraptionManager.java @@ -7,8 +7,8 @@ import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.SuperByteBufferCache; -import com.simibubi.create.foundation.utility.Pair; +import net.createmod.catnip.utility.Pair; import net.minecraft.client.renderer.RenderType; import net.minecraft.world.level.LevelAccessor; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingHandler.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingHandler.java index d833d5a29d..21a0a8d22f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingHandler.java @@ -12,9 +12,9 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Abs import com.simibubi.create.content.contraptions.components.structureMovement.train.capability.CapabilityMinecartController; import com.simibubi.create.content.contraptions.components.structureMovement.train.capability.MinecartController; import com.simibubi.create.foundation.config.AllConfigs; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.Lang; +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.Iterate; +import com.simibubi.create.foundation.utility.CreateLang; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.Entity; @@ -45,7 +45,7 @@ public class CouplingHandler { event.setResult(Result.DENY); } } - + public static void forEachLoadedCoupling(Level world, Consumer> consumer) { if (world == null) return; @@ -83,13 +83,13 @@ public class CouplingHandler { int distanceTo = (int) entity1.position() .distanceTo(entity2.position()); boolean contraptionCoupling = player == null; - + if (distanceTo < 2) { if (contraptionCoupling) return false; // dont allow train contraptions with <2 distance distanceTo = 2; } - + if (distanceTo > AllConfigs.SERVER.kinetics.maxCartCouplingLength.get()) { status(player, tooFar); return false; @@ -177,7 +177,7 @@ public class CouplingHandler { public static void status(Player player, String key) { if (player == null) return; - player.displayClientMessage(Lang.translateDirect("minecart_coupling." + key), true); + player.displayClientMessage(CreateLang.translateDirect("minecart_coupling." + key), true); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingHandlerClient.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingHandlerClient.java index 954241a47f..4fe1a74beb 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingHandlerClient.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingHandlerClient.java @@ -5,7 +5,7 @@ import java.util.Random; import com.mojang.math.Vector3f; import com.simibubi.create.AllItems; import com.simibubi.create.foundation.networking.AllPackets; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingPhysics.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingPhysics.java index d4c02314af..b158459c1a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingPhysics.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingPhysics.java @@ -1,9 +1,9 @@ package com.simibubi.create.content.contraptions.components.structureMovement.train; import com.simibubi.create.content.contraptions.components.structureMovement.train.capability.MinecartController; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.tags.BlockTags; @@ -64,10 +64,10 @@ public class CouplingPhysics { Vec3 link = otherCart.position() .subtract(pos); float correctionMagnitude = firstLoop ? -stress / 2f : -stress; - + if (!MinecartSim2020.canAddMotion(cart)) correctionMagnitude /= 2; - + correction = shape != null ? followLinkOnRail(link, pos, correctionMagnitude, MinecartSim2020.getRailVec(shape)).subtract(pos) : link.normalize() @@ -93,7 +93,7 @@ public class CouplingPhysics { public static void softCollisionStep(Level world, Couple carts, double couplingLength) { Couple maxSpeed = carts.map(AbstractMinecart::getMaxCartSpeedOnRail); Couple canAddmotion = carts.map(MinecartSim2020::canAddMotion); - + // Assuming Minecarts will never move faster than 1 block/tick Couple motions = carts.map(Entity::getDeltaMovement); motions.replaceWithParams(VecHelper::clamp, Couple.create(1f, 1f)); @@ -140,7 +140,7 @@ public class CouplingPhysics { .scale(correctionMagnitude); correction = VecHelper.clamp(correction, maxSpeed.get(current)); - + motions.set(current, motions.get(current) .add(correction)); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingRenderer.java index 63eead5a97..ed79cd25f2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingRenderer.java @@ -7,16 +7,16 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.math.Vector3f; import com.simibubi.create.AllBlockPartials; -import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.KineticDebugger; import com.simibubi.create.content.contraptions.components.structureMovement.train.capability.MinecartController; import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.Color; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.CatnipClient; +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.theme.Color; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.LevelRenderer; @@ -228,13 +228,13 @@ public class CouplingRenderer { int color = Color.mixColors(0xabf0e9, 0xee8572, (float) Mth .clamp(Math.abs(first.getCouplingLength(true) - connectedCenter.distanceTo(mainCenter)) * 8, 0, 1)); - CreateClient.OUTLINER.showLine(mainCart.getId() + "", mainCenter, connectedCenter) + CatnipClient.OUTLINER.showLine(mainCart.getId() + "", mainCenter, connectedCenter) .colored(color) .lineWidth(1 / 8f); Vec3 point = mainCart.position() .add(0, yOffset, 0); - CreateClient.OUTLINER.showLine(mainCart.getId() + "_dot", point, point.add(0, 1 / 128f, 0)) + CatnipClient.OUTLINER.showLine(mainCart.getId() + "_dot", point, point.add(0, 1 / 128f, 0)) .colored(0xffffff) .lineWidth(1 / 4f); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartCouplingItem.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartCouplingItem.java index 0a5542e8bc..2eb72d2b5b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartCouplingItem.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartCouplingItem.java @@ -3,8 +3,8 @@ package com.simibubi.create.content.contraptions.components.structureMovement.tr import com.simibubi.create.AllItems; import com.simibubi.create.content.contraptions.components.structureMovement.train.capability.CapabilityMinecartController; import com.simibubi.create.content.contraptions.components.structureMovement.train.capability.MinecartController; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Iterate; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartSim2020.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartSim2020.java index ebdfd34c57..a885c3d360 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartSim2020.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartSim2020.java @@ -6,8 +6,8 @@ import com.google.common.collect.Maps; import com.mojang.datafixers.util.Pair; import com.simibubi.create.content.contraptions.components.structureMovement.train.capability.CapabilityMinecartController; import com.simibubi.create.content.contraptions.components.structureMovement.train.capability.MinecartController; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.Util; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/capability/CapabilityMinecartController.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/capability/CapabilityMinecartController.java index 5433e0e855..c3528dc5ce 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/capability/CapabilityMinecartController.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/capability/CapabilityMinecartController.java @@ -14,11 +14,11 @@ import javax.annotation.Nullable; import com.simibubi.create.AllItems; import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.components.structureMovement.train.CouplingHandler; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.WorldAttached; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import it.unimi.dsi.fastutil.objects.ObjectLists; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.WorldAttached; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/capability/MinecartController.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/capability/MinecartController.java index df2f10db09..21bcad1155 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/capability/MinecartController.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/capability/MinecartController.java @@ -15,11 +15,11 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Abs import com.simibubi.create.content.contraptions.components.structureMovement.OrientedContraptionEntity; import com.simibubi.create.content.contraptions.components.structureMovement.train.CouplingHandler; import com.simibubi.create.foundation.networking.AllPackets; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.NBTHelper; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; @@ -176,11 +176,11 @@ public class MinecartController implements INBTSerializable { List passengers = cart().getPassengers(); if (!passengers.isEmpty()) { Entity entity = passengers.get(0); - if (entity instanceof AbstractContraptionEntity) + if (entity instanceof AbstractContraptionEntity) ((AbstractContraptionEntity) entity).disassemble(); } } - + couplings.set(main, Optional.empty()); needsEntryRefresh |= main; sendData(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/tracks/ControllerRailBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/tracks/ControllerRailBlock.java index 2c5914c768..726f0e90c6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/tracks/ControllerRailBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/tracks/ControllerRailBlock.java @@ -5,9 +5,9 @@ import javax.annotation.ParametersAreNonnullByDefault; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.wrench.IWrenchable; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/turntable/TurntableBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/turntable/TurntableBlock.java index f4908cb458..b4bc2db988 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/turntable/TurntableBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/turntable/TurntableBlock.java @@ -5,8 +5,8 @@ import com.simibubi.create.AllTileEntities; import com.simibubi.create.content.contraptions.base.KineticBlock; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.foundation.block.ITE; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -102,12 +102,12 @@ public class TurntableBlock extends KineticBlock implements ITE getTileEntityClass() { return TurntableTileEntity.class; } - + @Override public BlockEntityType getTileEntityType() { return AllTileEntities.TURNTABLE.get(); } - + @Override public boolean isPathfindable(BlockState state, BlockGetter reader, BlockPos pos, PathComputationType type) { return false; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/turntable/TurntableHandler.java b/src/main/java/com/simibubi/create/content/contraptions/components/turntable/TurntableHandler.java index 2a8a7f1f92..510384b50b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/turntable/TurntableHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/turntable/TurntableHandler.java @@ -1,9 +1,9 @@ package com.simibubi.create.content.contraptions.components.turntable; import com.simibubi.create.AllBlocks; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.util.Mth; @@ -26,16 +26,16 @@ public class TurntableHandler { BlockEntity tileEntity = mc.level.getBlockEntity(pos); if (!(tileEntity instanceof TurntableTileEntity)) return; - + TurntableTileEntity turnTable = (TurntableTileEntity) tileEntity; float speed = turnTable.getSpeed() * 3/10; if (speed == 0) return; - + Vec3 origin = VecHelper.getCenterOf(pos); Vec3 offset = mc.player.position().subtract(origin); - + if (offset.length() > 1/4f) speed *= Mth.clamp((1/2f - offset.length()) * 2, 0, 1); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/waterwheel/WaterWheelBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/waterwheel/WaterWheelBlock.java index 058dab2d90..ce9a4baeef 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/waterwheel/WaterWheelBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/waterwheel/WaterWheelBlock.java @@ -9,10 +9,10 @@ import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.fluid.FluidHelper; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.worldWrappers.WrappedWorld; +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.worldWrappers.WrappedWorld; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/waterwheel/WaterWheelTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/waterwheel/WaterWheelTileEntity.java index 07aa48beca..78dc298047 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/waterwheel/WaterWheelTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/waterwheel/WaterWheelTileEntity.java @@ -9,8 +9,8 @@ import com.simibubi.create.content.contraptions.base.GeneratingKineticTileEntity import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; @@ -35,7 +35,7 @@ public class WaterWheelTileEntity extends GeneratingKineticTileEntity { super.addBehaviours(behaviours); registerAwardables(behaviours, AllAdvancements.LAVA_WHEEL, AllAdvancements.WATER_WHEEL); } - + @Override protected void read(CompoundTag compound, boolean clientPacket) { super.read(compound, clientPacket); diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/FlowSource.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/FlowSource.java index 8a24552757..38fd948874 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/FlowSource.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/FlowSource.java @@ -4,8 +4,8 @@ import java.lang.ref.WeakReference; import java.util.function.Predicate; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.utility.BlockFace; +import net.createmod.catnip.utility.BlockFace; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraftforge.common.util.LazyOptional; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidFX.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidFX.java index 0332d638dc..6dfd73e254 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidFX.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidFX.java @@ -5,8 +5,8 @@ import java.util.Random; import com.simibubi.create.AllParticleTypes; import com.simibubi.create.content.contraptions.fluids.particle.FluidParticleData; import com.simibubi.create.foundation.fluid.FluidHelper; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidNetwork.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidNetwork.java index ee559d9ae7..779c623c3c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidNetwork.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidNetwork.java @@ -16,10 +16,10 @@ import com.simibubi.create.content.contraptions.components.actors.PortableFluidI import com.simibubi.create.content.contraptions.fluids.PipeConnection.Flow; import com.simibubi.create.foundation.fluid.FluidHelper; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.utility.BlockFace; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.Pair; +import net.createmod.catnip.utility.BlockFace; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.Pair; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.Level; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidPropagator.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidPropagator.java index 5451e001b7..a48f3d460d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidPropagator.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidPropagator.java @@ -17,9 +17,9 @@ import com.simibubi.create.foundation.advancement.CreateAdvancement; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.utility.BlockHelper; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.Pair; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.Pair; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidTransportBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidTransportBehaviour.java index 92e200e36e..b7c3eed42a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidTransportBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidTransportBehaviour.java @@ -13,9 +13,9 @@ import com.simibubi.create.content.contraptions.fluids.pipes.EncasedPipeBlock; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.WorldAttached; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.WorldAttached; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/OpenEndedPipe.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/OpenEndedPipe.java index bc4059b734..c281ceede4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/OpenEndedPipe.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/OpenEndedPipe.java @@ -14,7 +14,7 @@ import com.simibubi.create.foundation.advancement.AdvancementBehaviour; import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.fluid.FluidHelper; -import com.simibubi.create.foundation.utility.BlockFace; +import net.createmod.catnip.utility.BlockFace; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/PipeAttachmentModel.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/PipeAttachmentModel.java index c4ab64276d..8b84ec12ff 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/PipeAttachmentModel.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/PipeAttachmentModel.java @@ -11,8 +11,8 @@ import com.simibubi.create.content.contraptions.fluids.pipes.FluidPipeBlock; import com.simibubi.create.content.contraptions.relays.elementary.BracketedTileEntityBehaviour; import com.simibubi.create.foundation.block.connected.BakedModelWrapperWithData; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Iterate; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.resources.model.BakedModel; @@ -32,11 +32,11 @@ public class PipeAttachmentModel extends BakedModelWrapperWithData { public static PipeAttachmentModel opaque(BakedModel template) { return new PipeAttachmentModel(template, false); } - + public static PipeAttachmentModel transparent(BakedModel template) { return new PipeAttachmentModel(template, true); } - + public PipeAttachmentModel(BakedModel template, boolean hideAttachmentConnector) { super(template); this.hideAttachmentConnector = hideAttachmentConnector; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/PipeConnection.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/PipeConnection.java index b51f5b698f..241a2e74e5 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/PipeConnection.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/PipeConnection.java @@ -5,12 +5,12 @@ import java.util.Random; import java.util.function.Predicate; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.utility.BlockFace; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.VecHelper; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.BlockFace; +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.animation.LerpedFloat; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -203,7 +203,7 @@ public class PipeConnection { float flowSpeed = 1 / 32f + Mth.clamp(pressure.get(flow.inbound) / 512f, 0, 1) * 31 / 32f; flow.progress.setValue(Math.min(flow.progress.getValue() + flowSpeed, 1)); - if (flow.progress.getValue() >= 1) + if (flow.progress.getValue() >= 1) flow.complete = true; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpCogInstance.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpCogInstance.java index 6d85b1fc07..fcf24d94d8 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpCogInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpCogInstance.java @@ -8,9 +8,9 @@ import com.jozufozu.flywheel.core.materials.model.ModelData; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.SingleRotatingInstance; import com.simibubi.create.content.contraptions.base.flwdata.RotatingData; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.AnimationTickHolder; +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.core.Direction; import net.minecraft.util.Mth; import net.minecraft.world.level.block.state.BlockState; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java index 23e41b42a3..16a3cf01c3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java @@ -7,8 +7,8 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.utility.AngleHelper; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpTileEntity.java index 94c155f010..319827a5cd 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpTileEntity.java @@ -17,13 +17,13 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.utility.BlockFace; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.Pair; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; -import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.utility.BlockFace; +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FillingRecipe.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FillingRecipe.java index 380945f5ba..9b2d739133 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FillingRecipe.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FillingRecipe.java @@ -11,7 +11,7 @@ import com.simibubi.create.content.contraptions.itemAssembly.IAssemblyRecipe; import com.simibubi.create.content.contraptions.processing.ProcessingRecipe; import com.simibubi.create.content.contraptions.processing.ProcessingRecipeBuilder.ProcessingRecipeParams; import com.simibubi.create.foundation.fluid.FluidIngredient; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TextComponent; @@ -58,7 +58,7 @@ public class FillingRecipe extends ProcessingRecipe implements IA @Override public void addAssemblyIngredients(List list) {} - + @Override public void addAssemblyFluidIngredients(List list) { list.add(getRequiredFluid()); @@ -71,7 +71,7 @@ public class FillingRecipe extends ProcessingRecipe implements IA .getMatchingFluidStacks(); if (matchingFluidStacks.size() == 0) return new TextComponent("Invalid"); - return Lang.translateDirect("recipe.assembly.spout_filling_fluid", + return CreateLang.translateDirect("recipe.assembly.spout_filling_fluid", matchingFluidStacks.get(0).getDisplayName().getString()); } @@ -79,7 +79,7 @@ public class FillingRecipe extends ProcessingRecipe implements IA public void addRequiredMachines(Set list) { list.add(AllBlocks.SPOUT.get()); } - + @Override public Supplier> getJEISubCategory() { return () -> SequencedAssemblySubCategory.AssemblySpouting::new; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidDrainingBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidDrainingBehaviour.java index 916eb54afe..6badb7b44c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidDrainingBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidDrainingBehaviour.java @@ -12,11 +12,11 @@ import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.fluid.FluidHelper; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType; -import com.simibubi.create.foundation.utility.BBHelper; -import com.simibubi.create.foundation.utility.Iterate; import it.unimi.dsi.fastutil.PriorityQueue; import it.unimi.dsi.fastutil.objects.ObjectHeapPriorityQueue; +import net.createmod.catnip.utility.BBHelper; +import net.createmod.catnip.utility.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidFillingBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidFillingBehaviour.java index afdb103796..8a0c1157bf 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidFillingBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidFillingBehaviour.java @@ -11,11 +11,11 @@ import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.fluid.FluidHelper; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType; -import com.simibubi.create.foundation.utility.BBHelper; -import com.simibubi.create.foundation.utility.Iterate; import it.unimi.dsi.fastutil.PriorityQueue; import it.unimi.dsi.fastutil.objects.ObjectHeapPriorityQueue; +import net.createmod.catnip.utility.BBHelper; +import net.createmod.catnip.utility.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.sounds.SoundEvents; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidManipulationBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidManipulationBehaviour.java index a3f4282742..d6709d48b3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidManipulationBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidManipulationBehaviour.java @@ -13,9 +13,9 @@ import com.simibubi.create.foundation.fluid.FluidHelper; import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyBlock.java index 37c2313754..f5a947704c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyBlock.java @@ -5,8 +5,8 @@ import com.simibubi.create.content.contraptions.base.HorizontalKineticBlock; import com.simibubi.create.content.contraptions.fluids.pipes.FluidPipeBlock; import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -87,7 +87,7 @@ public class HosePulleyBlock extends HorizontalKineticBlock implements ITE getTileEntityClass() { return HosePulleyTileEntity.class; } - + @Override public BlockEntityType getTileEntityType() { return AllTileEntities.HOSE_PULLEY.get(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyTileEntity.java index e466e72fdc..4f3e0ec8ae 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyTileEntity.java @@ -8,8 +8,8 @@ import com.simibubi.create.foundation.fluid.SmartFluidTank; import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.utility.ServerSpeedProvider; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.animation.LerpedFloat; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainRenderer.java index 0b6c9e33f6..fd5d4ec895 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainRenderer.java @@ -12,8 +12,8 @@ import com.simibubi.create.foundation.fluid.FluidRenderer; import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour.TankSegment; import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRenderer; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.block.model.ItemTransforms.TransformType; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainTileEntity.java index 2206c65ddd..aa62404120 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainTileEntity.java @@ -13,10 +13,10 @@ import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour; import com.simibubi.create.foundation.utility.BlockHelper; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.Pair; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutTileEntity.java index db8ce23baa..9fcd3af4d6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutTileEntity.java @@ -21,9 +21,9 @@ import com.simibubi.create.foundation.tileEntity.behaviour.belt.BeltProcessingBe import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour.TransportedResult; import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour; -import com.simibubi.create.foundation.utility.NBTHelper; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.particles.ParticleOptions; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/particle/BasinFluidParticle.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/particle/BasinFluidParticle.java index decde44184..847b7be1aa 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/particle/BasinFluidParticle.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/particle/BasinFluidParticle.java @@ -4,7 +4,7 @@ import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.math.Quaternion; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.processing.BasinTileEntity; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.client.Camera; import net.minecraft.client.multiplayer.ClientLevel; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/particle/FluidStackParticle.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/particle/FluidStackParticle.java index f0e3a670cc..99b14533d1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/particle/FluidStackParticle.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/particle/FluidStackParticle.java @@ -2,8 +2,8 @@ package com.simibubi.create.content.contraptions.fluids.particle; import com.simibubi.create.AllParticleTypes; import com.simibubi.create.content.contraptions.fluids.potion.PotionFluid; -import com.simibubi.create.foundation.utility.Color; +import net.createmod.catnip.utility.theme.Color; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.particle.ParticleRenderType; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/AxisPipeBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/AxisPipeBlock.java index 1bcb6bbb17..f91b869e13 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/AxisPipeBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/AxisPipeBlock.java @@ -12,7 +12,7 @@ import com.simibubi.create.content.contraptions.relays.elementary.BracketedTileE import com.simibubi.create.content.contraptions.wrench.IWrenchableWithBracket; import com.simibubi.create.foundation.advancement.AdvancementBehaviour; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -76,7 +76,7 @@ public class AxisPipeBlock extends RotatedPillarBlock implements IWrenchableWith super.setPlacedBy(pLevel, pPos, pState, pPlacer, pStack); AdvancementBehaviour.setPlacedBy(pLevel, pPos, pPlacer); } - + @Override public void onPlace(BlockState state, Level world, BlockPos pos, BlockState oldState, boolean isMoving) { if (world.isClientSide) diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/BracketBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/BracketBlock.java index 2d663dd90e..bf93122107 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/BracketBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/BracketBlock.java @@ -8,8 +8,8 @@ import com.simibubi.create.content.contraptions.fluids.FluidPropagator; import com.simibubi.create.content.contraptions.relays.elementary.AbstractSimpleShaftBlock; import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock; import com.simibubi.create.foundation.block.WrenchableDirectionalBlock; -import com.simibubi.create.foundation.utility.Lang; +import net.createmod.catnip.utility.lang.Lang; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; import net.minecraft.util.StringRepresentable; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/EncasedPipeBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/EncasedPipeBlock.java index e5ed9a4226..45e47834b8 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/EncasedPipeBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/EncasedPipeBlock.java @@ -19,8 +19,8 @@ import com.simibubi.create.content.schematics.ISpecialBlockItemRequirement; import com.simibubi.create.content.schematics.ItemRequirement; import com.simibubi.create.foundation.advancement.AdvancementBehaviour; import com.simibubi.create.foundation.block.ITE; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.protocol.game.DebugPackets; @@ -61,7 +61,7 @@ public class EncasedPipeBlock extends Block implements IWrenchable, ISpecialBloc builder.add(NORTH, EAST, SOUTH, WEST, UP, DOWN); super.createBlockStateDefinition(builder); } - + @Override public void setPlacedBy(Level pLevel, BlockPos pPos, BlockState pState, LivingEntity pPlacer, ItemStack pStack) { super.setPlacedBy(pLevel, pPos, pState, pPlacer, pStack); diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidPipeBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidPipeBlock.java index b9d8d4be04..6ec3424315 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidPipeBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidPipeBlock.java @@ -16,8 +16,8 @@ import com.simibubi.create.foundation.advancement.AdvancementBehaviour; import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -95,7 +95,7 @@ public class FluidPipeBlock extends PipeBlock .filter(pc -> pc != null && pc.hasFlow()) .findAny() .ifPresent($ -> AllAdvancements.GLASS_PIPE.awardTo(context.getPlayer()))); - + FluidTransportBehaviour.cacheFlows(world, pos); world.setBlockAndUpdate(pos, AllBlocks.GLASS_FLUID_PIPE.getDefaultState() .setValue(GlassFluidPipeBlock.AXIS, axis) @@ -118,7 +118,7 @@ public class FluidPipeBlock extends PipeBlock return InteractionResult.PASS; if (world.isClientSide) return InteractionResult.SUCCESS; - + FluidTransportBehaviour.cacheFlows(world, pos); world.setBlockAndUpdate(pos, EncasedPipeBlock.transferSixWayProperties(state, AllBlocks.ENCASED_FLUID_PIPE.getDefaultState())); diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveBlock.java index a9bed692f0..2937c0e072 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveBlock.java @@ -9,8 +9,8 @@ import com.simibubi.create.AllTileEntities; import com.simibubi.create.content.contraptions.base.DirectionalAxisKineticBlock; import com.simibubi.create.content.contraptions.fluids.FluidPropagator; import com.simibubi.create.foundation.block.ITE; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -125,7 +125,7 @@ public class FluidValveBlock extends DirectionalAxisKineticBlock implements IAxi public void tick(BlockState state, ServerLevel world, BlockPos pos, Random r) { FluidPropagator.propagateChangedPipe(world, pos, state); } - + @Override public boolean isPathfindable(BlockState state, BlockGetter reader, BlockPos pos, PathComputationType type) { return false; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveInstance.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveInstance.java index d8d688604b..068167f93b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveInstance.java @@ -8,8 +8,8 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.relays.encased.ShaftInstance; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.AnimationTickHolder; +import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.utility.AnimationTickHolder; import net.minecraft.core.Direction; import net.minecraft.util.Mth; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveRenderer.java index 2b6404cfe5..e13b565c44 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveRenderer.java @@ -7,7 +7,7 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.utility.AngleHelper; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveTileEntity.java index 93d76fb9f6..d0c1768c14 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveTileEntity.java @@ -7,8 +7,8 @@ import com.simibubi.create.content.contraptions.fluids.FluidPropagator; import com.simibubi.create.content.contraptions.fluids.pipes.StraightPipeTileEntity.StraightPipeFluidTransportBehaviour; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; -import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/SmartFluidPipeBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/SmartFluidPipeBlock.java index 768b128d1c..560fa3899c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/SmartFluidPipeBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/SmartFluidPipeBlock.java @@ -8,8 +8,8 @@ import com.simibubi.create.content.contraptions.fluids.FluidPropagator; import com.simibubi.create.content.contraptions.wrench.IWrenchable; import com.simibubi.create.foundation.advancement.AdvancementBehaviour; import com.simibubi.create.foundation.block.ITE; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.VoxelShaper; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.VoxelShaper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -142,7 +142,7 @@ public class SmartFluidPipeBlock extends FaceAttachedHorizontalDirectionalBlock : face == AttachFace.CEILING ? AllShapes.SMART_FLUID_PIPE_CEILING : AllShapes.SMART_FLUID_PIPE_WALL; return shape.get(state.getValue(FACING)); } - + @Override public void setPlacedBy(Level pLevel, BlockPos pPos, BlockState pState, LivingEntity pPlacer, ItemStack pStack) { super.setPlacedBy(pLevel, pPos, pState, pPlacer, pStack); diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/SmartFluidPipeTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/SmartFluidPipeTileEntity.java index b003463673..b5619ea618 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/SmartFluidPipeTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/SmartFluidPipeTileEntity.java @@ -10,8 +10,8 @@ import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/TransparentStraightPipeRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/TransparentStraightPipeRenderer.java index 76ed62dc42..307e7cee72 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/TransparentStraightPipeRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/TransparentStraightPipeRenderer.java @@ -6,9 +6,9 @@ import com.simibubi.create.content.contraptions.fluids.PipeConnection.Flow; import com.simibubi.create.foundation.fluid.FluidRenderer; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.animation.LerpedFloat; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/potion/PotionFluid.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/potion/PotionFluid.java index 45059a5d99..ad7bdfb868 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/potion/PotionFluid.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/potion/PotionFluid.java @@ -5,8 +5,8 @@ import java.util.List; import com.simibubi.create.AllFluids; import com.simibubi.create.content.contraptions.fluids.VirtualFluid; -import com.simibubi.create.foundation.utility.NBTHelper; +import net.createmod.catnip.utility.NBTHelper; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.network.chat.Component; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/potion/PotionFluidHandler.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/potion/PotionFluidHandler.java index febb50e293..c898f806cb 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/potion/PotionFluidHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/potion/PotionFluidHandler.java @@ -8,9 +8,9 @@ import com.google.common.collect.Lists; import com.simibubi.create.content.contraptions.fluids.potion.PotionFluid.BottleType; import com.simibubi.create.foundation.fluid.FluidHelper; import com.simibubi.create.foundation.fluid.FluidIngredient; -import com.simibubi.create.foundation.utility.NBTHelper; -import com.simibubi.create.foundation.utility.Pair; +import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.utility.Pair; import net.minecraft.ChatFormatting; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/BoilerData.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/BoilerData.java index f204dc2017..1fe4c5f9d9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/BoilerData.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/BoilerData.java @@ -17,12 +17,13 @@ import com.simibubi.create.foundation.advancement.AdvancementBehaviour; import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.block.BlockStressValues; import com.simibubi.create.foundation.fluid.FluidHelper; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; -import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; +import com.simibubi.create.foundation.utility.CreateLang; import joptsimple.internal.Strings; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.utility.lang.Lang; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -96,7 +97,7 @@ public class BoilerData { for (float i : supplyOverTime) waterSupply = Math.max(i, waterSupply); } - + if (controller instanceof CreativeFluidTankTileEntity) waterSupply = waterSupplyPerLevel * 20; @@ -154,7 +155,7 @@ public class BoilerData { tooltip.add(indent.plainCopy() .append( - Lang.translateDirect("boiler.status", getHeatLevelTextComponent().withStyle(ChatFormatting.GREEN)))); + CreateLang.translateDirect("boiler.status", getHeatLevelTextComponent().withStyle(ChatFormatting.GREEN)))); tooltip.add(indent2.plainCopy() .append(getSizeComponent(true, false))); tooltip.add(indent2.plainCopy() @@ -171,16 +172,16 @@ public class BoilerData { tooltip.add(Lang.empty()); - Lang.translate("tooltip.capacityProvided") + CreateLang.translate("tooltip.capacityProvided") .style(ChatFormatting.GRAY) .forGoggles(tooltip); - Lang.number(totalSU) + CreateLang.number(totalSU) .translate("generic.unit.stress") .style(ChatFormatting.AQUA) .space() - .add((attachedEngines == 1 ? Lang.translate("boiler.via_one_engine") - : Lang.translate("boiler.via_engines", attachedEngines)).style(ChatFormatting.DARK_GRAY)) + .add((attachedEngines == 1 ? CreateLang.translate("boiler.via_one_engine") + : CreateLang.translate("boiler.via_engines", attachedEngines)).style(ChatFormatting.DARK_GRAY)) .forGoggles(tooltip, 1); return true; @@ -198,10 +199,10 @@ public class BoilerData { public MutableComponent getHeatLevelTextComponent() { int boilerLevel = Math.min(activeHeat, Math.min(maxHeatForWater, maxHeatForSize)); - return isPassive() ? Lang.translateDirect("boiler.passive") - : (boilerLevel == 0 ? Lang.translateDirect("boiler.idle") - : boilerLevel == 18 ? Lang.translateDirect("boiler.max_lvl") - : Lang.translateDirect("boiler.lvl", String.valueOf(boilerLevel))); + return isPassive() ? CreateLang.translateDirect("boiler.passive") + : (boilerLevel == 0 ? CreateLang.translateDirect("boiler.idle") + : boilerLevel == 18 ? CreateLang.translateDirect("boiler.max_lvl") + : CreateLang.translateDirect("boiler.lvl", String.valueOf(boilerLevel))); } public MutableComponent getSizeComponent(boolean forGoggles, boolean useBlocksAsBars, ChatFormatting... styles) { @@ -226,9 +227,9 @@ public class BoilerData { ChatFormatting style1 = styles.length >= 1 ? styles[0] : ChatFormatting.GRAY; ChatFormatting style2 = styles.length >= 2 ? styles[1] : ChatFormatting.DARK_GRAY; - return Lang.translateDirect("boiler." + label) + return CreateLang.translateDirect("boiler." + label) .withStyle(style1) - .append(Lang.translateDirect("boiler." + label + "_dots") + .append(CreateLang.translateDirect("boiler." + label + "_dots") .withStyle(style2)) .append(base); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankBlock.java index 901263a438..c76f4fb391 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankBlock.java @@ -11,8 +11,8 @@ import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.fluid.FluidHelper; import com.simibubi.create.foundation.fluid.FluidHelper.FluidExchange; import com.simibubi.create.foundation.tileEntity.ComparatorUtil; -import com.simibubi.create.foundation.utility.Lang; +import net.createmod.catnip.utility.lang.Lang; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.particles.BlockParticleOption; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankModel.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankModel.java index e239afc290..fe4285bfa8 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankModel.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankModel.java @@ -10,8 +10,8 @@ import com.simibubi.create.AllSpriteShifts; import com.simibubi.create.api.connectivity.ConnectivityHandler; import com.simibubi.create.foundation.block.connected.CTModel; import com.simibubi.create.foundation.block.connected.CTSpriteShiftEntry; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Iterate; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.resources.model.BakedModel; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankRenderer.java index e4f2ae7e73..8d671b431e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankRenderer.java @@ -7,9 +7,9 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.foundation.fluid.FluidRenderer; import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.animation.LerpedFloat; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankTileEntity.java index ea089ddc21..10035b0bee 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankTileEntity.java @@ -16,9 +16,9 @@ import com.simibubi.create.foundation.fluid.SmartFluidTank; import com.simibubi.create.foundation.tileEntity.IMultiTileContainer; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; -import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/contraptions/goggles/GoggleConfigScreen.java b/src/main/java/com/simibubi/create/content/contraptions/goggles/GoggleConfigScreen.java index 36ca4481e2..668aaf5a1d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/goggles/GoggleConfigScreen.java +++ b/src/main/java/com/simibubi/create/content/contraptions/goggles/GoggleConfigScreen.java @@ -6,10 +6,10 @@ import java.util.List; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllItems; import com.simibubi.create.foundation.config.AllConfigs; -import com.simibubi.create.foundation.gui.AbstractSimiScreen; -import com.simibubi.create.foundation.gui.element.GuiGameElement; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.gui.AbstractSimiScreen; +import net.createmod.catnip.gui.element.GuiGameElement; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.FormattedText; @@ -27,27 +27,27 @@ public class GoggleConfigScreen extends AbstractSimiScreen { Component componentSpacing = new TextComponent(" "); tooltip = new ArrayList<>(); tooltip.add(componentSpacing.plainCopy() - .append(Lang.translateDirect("gui.config.overlay1"))); + .append(CreateLang.translateDirect("gui.config.overlay1"))); tooltip.add(componentSpacing.plainCopy() - .append(Lang.translateDirect("gui.config.overlay2") + .append(CreateLang.translateDirect("gui.config.overlay2") .withStyle(ChatFormatting.GRAY))); tooltip.add(TextComponent.EMPTY); tooltip.add(componentSpacing.plainCopy() - .append(Lang.translateDirect("gui.config.overlay3"))); + .append(CreateLang.translateDirect("gui.config.overlay3"))); tooltip.add(componentSpacing.plainCopy() - .append(Lang.translateDirect("gui.config.overlay4"))); + .append(CreateLang.translateDirect("gui.config.overlay4"))); tooltip.add(TextComponent.EMPTY); tooltip.add(componentSpacing.plainCopy() - .append(Lang.translateDirect("gui.config.overlay5") + .append(CreateLang.translateDirect("gui.config.overlay5") .withStyle(ChatFormatting.GRAY))); tooltip.add(componentSpacing.plainCopy() - .append(Lang.translateDirect("gui.config.overlay6") + .append(CreateLang.translateDirect("gui.config.overlay6") .withStyle(ChatFormatting.GRAY))); tooltip.add(TextComponent.EMPTY); tooltip.add(componentSpacing.plainCopy() - .append(Lang.translateDirect("gui.config.overlay7"))); + .append(CreateLang.translateDirect("gui.config.overlay7"))); tooltip.add(componentSpacing.plainCopy() - .append(Lang.translateDirect("gui.config.overlay8"))); + .append(CreateLang.translateDirect("gui.config.overlay8"))); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/goggles/GoggleOverlayRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/goggles/GoggleOverlayRenderer.java index 367f6ca2c4..138d1858fe 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/goggles/GoggleOverlayRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/goggles/GoggleOverlayRenderer.java @@ -7,7 +7,6 @@ import java.util.Map; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; -import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.components.structureMovement.IDisplayAssemblyExceptions; import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock; import com.simibubi.create.content.contraptions.components.structureMovement.piston.PistonExtensionPoleBlock; @@ -15,15 +14,16 @@ import com.simibubi.create.content.logistics.trains.entity.TrainRelocator; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.config.CClient; import com.simibubi.create.foundation.gui.RemovedGuiUtils; -import com.simibubi.create.foundation.gui.Theme; -import com.simibubi.create.foundation.gui.element.GuiGameElement; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBox; -import com.simibubi.create.foundation.utility.Color; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.outliner.Outline; -import com.simibubi.create.foundation.utility.outliner.Outliner.OutlineEntry; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.CatnipClient; +import net.createmod.catnip.gui.element.GuiGameElement; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.outliner.Outline; +import net.createmod.catnip.utility.outliner.Outliner.OutlineEntry; +import net.createmod.catnip.utility.theme.Color; +import net.createmod.catnip.utility.theme.Theme; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.core.BlockPos; @@ -45,7 +45,7 @@ public class GoggleOverlayRenderer { public static final IIngameOverlay OVERLAY = GoggleOverlayRenderer::renderOverlay; - private static final Map outlines = CreateClient.OUTLINER.getOutlines(); + private static final Map outlines = CatnipClient.OUTLINER.getOutlines(); public static int hoverTicks = 0; public static BlockPos lastHovered = null; @@ -146,7 +146,7 @@ public class GoggleOverlayRenderer { tooltip.add(TextComponent.EMPTY); tooltip.add(IHaveGoggleInformation.componentSpacing.plainCopy() - .append(Lang.translateDirect("gui.goggles.pole_length")) + .append(CreateLang.translateDirect("gui.goggles.pole_length")) .append(new TextComponent(" " + poles))); } @@ -178,13 +178,13 @@ public class GoggleOverlayRenderer { float fade = Mth.clamp((hoverTicks + partialTicks) / 12f, 0, 1); Boolean useCustom = cfg.overlayCustomColor.get(); Color colorBackground = useCustom ? new Color(cfg.overlayBackgroundColor.get()) - : Theme.c(Theme.Key.VANILLA_TOOLTIP_BACKGROUND) + : Theme.Key.VANILLA_TOOLTIP_BACKGROUND.c() .scaleAlpha(.75f); Color colorBorderTop = useCustom ? new Color(cfg.overlayBorderColorTop.get()) - : Theme.c(Theme.Key.VANILLA_TOOLTIP_BORDER, true) + : Theme.Key.VANILLA_TOOLTIP_BORDER.c(true) .copy(); Color colorBorderBot = useCustom ? new Color(cfg.overlayBorderColorBot.get()) - : Theme.c(Theme.Key.VANILLA_TOOLTIP_BORDER, false) + : Theme.Key.VANILLA_TOOLTIP_BORDER.c(false) .copy(); if (fade < 1) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/goggles/IHaveGoggleInformation.java b/src/main/java/com/simibubi/create/content/contraptions/goggles/IHaveGoggleInformation.java index 0eeaf904f9..3717295975 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/goggles/IHaveGoggleInformation.java +++ b/src/main/java/com/simibubi/create/content/contraptions/goggles/IHaveGoggleInformation.java @@ -3,9 +3,9 @@ package com.simibubi.create.content.contraptions.goggles; import java.util.List; import java.util.Optional; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.LangBuilder; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.lang.LangBuilder; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TextComponent; @@ -50,8 +50,8 @@ public interface IHaveGoggleInformation { if (tank.getTanks() == 0) return false; - LangBuilder mb = Lang.translate("generic.unit.millibuckets"); - Lang.translate("gui.goggles.fluid_container") + LangBuilder mb = CreateLang.translate("generic.unit.millibuckets"); + CreateLang.translate("gui.goggles.fluid_container") .forGoggles(tooltip); boolean isEmpty = true; @@ -60,16 +60,16 @@ public interface IHaveGoggleInformation { if (fluidStack.isEmpty()) continue; - Lang.fluidName(fluidStack) + CreateLang.fluidName(fluidStack) .style(ChatFormatting.GRAY) .forGoggles(tooltip, 1); - Lang.builder() - .add(Lang.number(fluidStack.getAmount()) + CreateLang.builder() + .add(CreateLang.number(fluidStack.getAmount()) .add(mb) .style(ChatFormatting.GOLD)) .text(ChatFormatting.GRAY, " / ") - .add(Lang.number(tank.getTankCapacity(i)) + .add(CreateLang.number(tank.getTankCapacity(i)) .add(mb) .style(ChatFormatting.DARK_GRAY)) .forGoggles(tooltip, 1); @@ -86,8 +86,8 @@ public interface IHaveGoggleInformation { if (!isEmpty) return true; - Lang.translate("gui.goggles.fluid_container.capacity") - .add(Lang.number(tank.getTankCapacity(0)) + CreateLang.translate("gui.goggles.fluid_container.capacity") + .add(CreateLang.number(tank.getTankCapacity(0)) .add(mb) .style(ChatFormatting.GOLD)) .style(ChatFormatting.GRAY) diff --git a/src/main/java/com/simibubi/create/content/contraptions/itemAssembly/SequencedAssemblyItem.java b/src/main/java/com/simibubi/create/content/contraptions/itemAssembly/SequencedAssemblyItem.java index 4240b612cc..104da47187 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/itemAssembly/SequencedAssemblyItem.java +++ b/src/main/java/com/simibubi/create/content/contraptions/itemAssembly/SequencedAssemblyItem.java @@ -1,7 +1,6 @@ package com.simibubi.create.content.contraptions.itemAssembly; -import com.simibubi.create.foundation.utility.Color; - +import net.createmod.catnip.utility.theme.Color; import net.minecraft.core.NonNullList; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.CreativeModeTab; diff --git a/src/main/java/com/simibubi/create/content/contraptions/itemAssembly/SequencedAssemblyRecipe.java b/src/main/java/com/simibubi/create/content/contraptions/itemAssembly/SequencedAssemblyRecipe.java index 1dca38cfe7..cb0e727b2d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/itemAssembly/SequencedAssemblyRecipe.java +++ b/src/main/java/com/simibubi/create/content/contraptions/itemAssembly/SequencedAssemblyRecipe.java @@ -12,9 +12,9 @@ import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.processing.ProcessingOutput; import com.simibubi.create.content.contraptions.processing.ProcessingRecipe; import com.simibubi.create.foundation.fluid.FluidIngredient; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.Pair; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.Pair; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.nbt.CompoundTag; @@ -213,7 +213,7 @@ public class SequencedAssemblyRecipe implements Recipe { public boolean isSpecial() { return true; } - + @Override public RecipeType getType() { return AllRecipeTypes.SEQUENCED_ASSEMBLY.getType(); @@ -240,9 +240,9 @@ public class SequencedAssemblyRecipe implements Recipe { int step = sequencedAssemblyRecipe.getStep(stack); int total = length * sequencedAssemblyRecipe.loops; toolTip.add(new TextComponent("")); - toolTip.add(Lang.translateDirect("recipe.sequenced_assembly") + toolTip.add(CreateLang.translateDirect("recipe.sequenced_assembly") .withStyle(ChatFormatting.GRAY)); - toolTip.add(Lang.translateDirect("recipe.assembly.progress", step, total) + toolTip.add(CreateLang.translateDirect("recipe.assembly.progress", step, total) .withStyle(ChatFormatting.DARK_GRAY)); int remaining = total - step; @@ -253,7 +253,7 @@ public class SequencedAssemblyRecipe implements Recipe { Component textComponent = sequencedRecipe.getAsAssemblyRecipe() .getDescriptionForAssembly(); if (i == 0) - toolTip.add(Lang.translateDirect("recipe.assembly.next", textComponent) + toolTip.add(CreateLang.translateDirect("recipe.assembly.next", textComponent) .withStyle(ChatFormatting.AQUA)); else toolTip.add(new TextComponent("-> ").append(textComponent) diff --git a/src/main/java/com/simibubi/create/content/contraptions/particle/AirFlowParticle.java b/src/main/java/com/simibubi/create/content/contraptions/particle/AirFlowParticle.java index e529c41260..efa52db3d3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/particle/AirFlowParticle.java +++ b/src/main/java/com/simibubi/create/content/contraptions/particle/AirFlowParticle.java @@ -5,9 +5,9 @@ import javax.annotation.Nonnull; import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.components.fan.IAirCurrentSource; import com.simibubi.create.content.contraptions.processing.InWorldProcessing; -import com.simibubi.create.foundation.utility.Color; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.theme.Color; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.particle.Particle; import net.minecraft.client.particle.ParticleProvider; diff --git a/src/main/java/com/simibubi/create/content/contraptions/particle/AirParticle.java b/src/main/java/com/simibubi/create/content/contraptions/particle/AirParticle.java index 1959fd31e3..8d9d24abda 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/particle/AirParticle.java +++ b/src/main/java/com/simibubi/create/content/contraptions/particle/AirParticle.java @@ -1,8 +1,8 @@ package com.simibubi.create.content.contraptions.particle; import com.simibubi.create.Create; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.particle.Particle; import net.minecraft.client.particle.ParticleProvider; @@ -48,7 +48,7 @@ public class AirParticle extends SimpleAnimatedParticle { lifetime = Math.min((int) (length / data.speed), 60); selectSprite(7); setAlpha(.25f); - + if (length == 0) { remove(); setAlpha(0); @@ -72,11 +72,11 @@ public class AirParticle extends SimpleAnimatedParticle { float progress = (float) Math.pow(((float) age) / lifetime, drag); float angle = (progress * 2 * 360 + twirlAngleOffset) % 360; Vec3 twirl = VecHelper.rotate(new Vec3(0, twirlRadius, 0), angle, twirlAxis); - + float x = (float) (Mth.lerp(progress, originX, targetX) + twirl.x); float y = (float) (Mth.lerp(progress, originY, targetY) + twirl.y); float z = (float) (Mth.lerp(progress, originZ, targetZ) + twirl.z); - + xd = x - this.x; yd = y - this.y; zd = z - this.z; diff --git a/src/main/java/com/simibubi/create/content/contraptions/particle/CubeParticle.java b/src/main/java/com/simibubi/create/content/contraptions/particle/CubeParticle.java index 59f36cb069..004aea5305 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/particle/CubeParticle.java +++ b/src/main/java/com/simibubi/create/content/contraptions/particle/CubeParticle.java @@ -7,8 +7,8 @@ import com.mojang.blaze3d.vertex.DefaultVertexFormat; import com.mojang.blaze3d.vertex.Tesselator; import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.blaze3d.vertex.VertexFormat; -import com.simibubi.create.AllSpecialTextures; +import net.createmod.catnip.enums.CatnipSpecialTextures; import net.minecraft.client.Camera; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.particle.Particle; @@ -44,7 +44,7 @@ public class CubeParticle extends Particle { private static final ParticleRenderType RENDER_TYPE = new ParticleRenderType() { @Override public void begin(BufferBuilder builder, TextureManager textureManager) { - AllSpecialTextures.BLANK.bind(); + CatnipSpecialTextures.BLANK.bind(); // transparent, additive blending RenderSystem.depthMask(false); @@ -87,13 +87,13 @@ public class CubeParticle extends Particle { public void averageAge(int age) { this.lifetime = (int) (age + (random.nextDouble() * 2D - 1D) * 8); } - + public void setHot(boolean hot) { this.hot = hot; } - + private boolean billowing = false; - + @Override public void tick() { if (this.hot && this.age > 0) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/particle/RotationIndicatorParticle.java b/src/main/java/com/simibubi/create/content/contraptions/particle/RotationIndicatorParticle.java index 5939402935..a2a94bce1a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/particle/RotationIndicatorParticle.java +++ b/src/main/java/com/simibubi/create/content/contraptions/particle/RotationIndicatorParticle.java @@ -2,10 +2,10 @@ package com.simibubi.create.content.contraptions.particle; import com.mojang.blaze3d.vertex.VertexConsumer; import com.simibubi.create.content.contraptions.goggles.GogglesItem; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.Color; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.theme.Color; +import net.createmod.ponder.utility.WorldTickHolder; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; @@ -67,7 +67,7 @@ public class RotationIndicatorParticle extends SimpleAnimatedParticle { } public void move(double x, double y, double z) { - float time = AnimationTickHolder.getTicks(level); + float time = WorldTickHolder.getTicks(level); float angle = (float) ((time * speed) % 360) - (speed / 2 * age * (((float) age) / lifetime)); if (speed < 0 && axis.isVertical()) angle += 180; diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRecipe.java b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRecipe.java index 7e213f2e8c..3834919182 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRecipe.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRecipe.java @@ -16,7 +16,7 @@ import com.simibubi.create.foundation.item.SmartInventory; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour.TankSegment; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Iterate; import com.simibubi.create.foundation.utility.recipe.IRecipeTypeInfo; import net.minecraft.world.item.ItemStack; diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRenderer.java index 92c1923336..c8e5d5346a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRenderer.java @@ -8,10 +8,12 @@ import com.simibubi.create.foundation.fluid.FluidRenderer; import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour.TankSegment; import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRenderer; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.IntAttached; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.math.AngleHelper; + +import net.createmod.ponder.utility.WorldTickHolder; + +import net.createmod.catnip.utility.IntAttached; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; @@ -73,7 +75,7 @@ public class BasinRenderer extends SmartTileEntityRenderer { if (fluidLevel > 0) { ms.translate(0, (Mth.sin( - AnimationTickHolder.getRenderTime(basin.getLevel()) / 12f + anglePartition * itemCount) + 1.5f) + WorldTickHolder.getRenderTime(basin.getLevel()) / 12f + anglePartition * itemCount) + 1.5f) * 1 / 32f, 0); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java index f2549660aa..0c4843ff22 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java @@ -28,14 +28,14 @@ import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBe import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour.TankSegment; import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InvManipulationBehaviour; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.IntAttached; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.NBTHelper; -import com.simibubi.create.foundation.utility.VecHelper; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; -import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.IntAttached; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/EmptyingByBasin.java b/src/main/java/com/simibubi/create/content/contraptions/processing/EmptyingByBasin.java index 1a29725af4..95f75c9621 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/EmptyingByBasin.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/EmptyingByBasin.java @@ -5,8 +5,8 @@ import java.util.Optional; import com.simibubi.create.AllRecipeTypes; import com.simibubi.create.content.contraptions.fluids.potion.PotionFluidHandler; -import com.simibubi.create.foundation.utility.Pair; +import net.createmod.catnip.utility.Pair; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.PotionItem; import net.minecraft.world.item.crafting.Recipe; @@ -26,7 +26,7 @@ public class EmptyingByBasin { public static boolean canItemBeEmptied(Level world, ItemStack stack) { if (stack.getItem() instanceof PotionItem) return true; - + wrapper.setItem(0, stack); if (AllRecipeTypes.EMPTYING.find(wrapper, world) .isPresent()) @@ -51,7 +51,7 @@ public class EmptyingByBasin { if (stack.getItem() instanceof PotionItem) return PotionFluidHandler.emptyPotion(stack, simulate); - + wrapper.setItem(0, stack); Optional> recipe = AllRecipeTypes.EMPTYING.find(wrapper, world); if (recipe.isPresent()) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/HeatCondition.java b/src/main/java/com/simibubi/create/content/contraptions/processing/HeatCondition.java index d2f3f5f39f..b5cb0c4d07 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/HeatCondition.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/HeatCondition.java @@ -3,7 +3,8 @@ package com.simibubi.create.content.contraptions.processing; import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock.HeatLevel; -import com.simibubi.create.foundation.utility.Lang; + +import net.createmod.catnip.utility.lang.Lang; public enum HeatCondition { diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/InWorldProcessing.java b/src/main/java/com/simibubi/create/content/contraptions/processing/InWorldProcessing.java index ce57a9fc1c..e309645429 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/InWorldProcessing.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/InWorldProcessing.java @@ -19,9 +19,9 @@ import com.simibubi.create.content.contraptions.relays.belt.transport.Transporte import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.item.ItemHelper; import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour.TransportedResult; -import com.simibubi.create.foundation.utility.Color; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.theme.Color; import net.minecraft.core.BlockPos; import net.minecraft.core.particles.DustParticleOptions; import net.minecraft.core.particles.ParticleTypes; diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingOutput.java b/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingOutput.java index 0d280b60d1..1d482b5b47 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingOutput.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingOutput.java @@ -8,8 +8,8 @@ import com.google.gson.JsonParser; import com.google.gson.JsonSyntaxException; import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.simibubi.create.Create; -import com.simibubi.create.foundation.utility.Pair; +import net.createmod.catnip.utility.Pair; import net.minecraft.nbt.TagParser; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingRecipeBuilder.java b/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingRecipeBuilder.java index 653b37d033..e63a523440 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingRecipeBuilder.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingRecipeBuilder.java @@ -10,10 +10,10 @@ import com.simibubi.create.foundation.data.SimpleDatagenIngredient; import com.simibubi.create.foundation.data.recipe.Mods; import com.simibubi.create.foundation.fluid.FluidHelper; import com.simibubi.create.foundation.fluid.FluidIngredient; -import com.simibubi.create.foundation.utility.Pair; import com.simibubi.create.foundation.utility.recipe.IRecipeTypeInfo; import com.tterrag.registrate.util.DataIngredient; +import net.createmod.catnip.utility.Pair; import net.minecraft.core.NonNullList; import net.minecraft.data.recipes.FinishedRecipe; import net.minecraft.resources.ResourceLocation; @@ -118,12 +118,12 @@ public class ProcessingRecipeBuilder> { params.ingredients.add(ingredient); return this; } - + public ProcessingRecipeBuilder require(Mods mod, String id) { params.ingredients.add(new SimpleDatagenIngredient(mod, id)); return this; } - + public ProcessingRecipeBuilder require(ResourceLocation ingredient) { params.ingredients.add(DataIngredient.ingredient(null, ingredient)); return this; @@ -169,11 +169,11 @@ public class ProcessingRecipeBuilder> { public ProcessingRecipeBuilder output(float chance, Mods mod, String id, int amount) { return output(new ProcessingOutput(Pair.of(mod.asResource(id), amount), chance)); } - + public ProcessingRecipeBuilder output(float chance, ResourceLocation registryName, int amount) { return output(new ProcessingOutput(Pair.of(registryName, amount), chance)); } - + public ProcessingRecipeBuilder output(ProcessingOutput output) { params.results.add(output); return this; @@ -188,7 +188,7 @@ public class ProcessingRecipeBuilder> { params.fluidResults.add(fluidStack); return this; } - + public ProcessingRecipeBuilder toolNotConsumed() { params.keepHeldItem = true; return this; @@ -223,7 +223,7 @@ public class ProcessingRecipeBuilder> { protected NonNullList fluidResults; protected int processingDuration; protected HeatCondition requiredHeat; - + public boolean keepHeldItem; protected ProcessingRecipeParams(ResourceLocation id) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerBlock.java b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerBlock.java index 073850685a..859b48d6ee 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerBlock.java @@ -12,8 +12,8 @@ import com.simibubi.create.AllTileEntities; import com.simibubi.create.content.contraptions.processing.BasinTileEntity; import com.simibubi.create.content.contraptions.wrench.IWrenchable; import com.simibubi.create.foundation.block.ITE; -import com.simibubi.create.foundation.utility.Lang; +import net.createmod.catnip.utility.lang.Lang; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.advancements.critereon.StatePropertiesPredicate; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerBlockItem.java b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerBlockItem.java index e90367af99..f632c8c52b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerBlockItem.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerBlockItem.java @@ -7,8 +7,8 @@ import java.util.Map; import javax.annotation.ParametersAreNonnullByDefault; import com.simibubi.create.AllBlocks; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.NonNullList; diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerInteractionBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerInteractionBehaviour.java index 2756310ad7..d6874906b8 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerInteractionBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerInteractionBehaviour.java @@ -12,9 +12,9 @@ import com.simibubi.create.content.logistics.trains.entity.Train; import com.simibubi.create.content.logistics.trains.management.schedule.Schedule; import com.simibubi.create.content.logistics.trains.management.schedule.ScheduleItem; import com.simibubi.create.foundation.advancement.AllAdvancements; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.Iterate; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -59,18 +59,18 @@ public class BlazeBurnerInteractionBehaviour extends MovingInteractionBehaviour if (train.runtime.paused && !train.runtime.completed) { train.runtime.paused = false; AllSoundEvents.CONFIRM.playOnServer(player.level, player.blockPosition(), 1, 1); - player.displayClientMessage(Lang.translateDirect("schedule.continued"), true); + player.displayClientMessage(CreateLang.translateDirect("schedule.continued"), true); return true; } if (!itemInHand.isEmpty()) { AllSoundEvents.DENY.playOnServer(player.level, player.blockPosition(), 1, 1); - player.displayClientMessage(Lang.translateDirect("schedule.remove_with_empty_hand"), true); + player.displayClientMessage(CreateLang.translateDirect("schedule.remove_with_empty_hand"), true); return true; } AllSoundEvents.playItemPickup(player); - player.displayClientMessage(Lang.translateDirect( + player.displayClientMessage(CreateLang.translateDirect( train.runtime.isAutoSchedule ? "schedule.auto_removed_from_train" : "schedule.removed_from_train"), true); player.setItemInHand(activeHand, train.runtime.returnSchedule()); @@ -86,21 +86,21 @@ public class BlazeBurnerInteractionBehaviour extends MovingInteractionBehaviour if (schedule.entries.isEmpty()) { AllSoundEvents.DENY.playOnServer(player.level, player.blockPosition(), 1, 1); - player.displayClientMessage(Lang.translateDirect("schedule.no_stops"), true); + player.displayClientMessage(CreateLang.translateDirect("schedule.no_stops"), true); return true; } train.runtime.setSchedule(schedule, false); AllAdvancements.CONDUCTOR.awardTo(player); AllSoundEvents.CONFIRM.playOnServer(player.level, player.blockPosition(), 1, 1); - player.displayClientMessage(Lang.translateDirect("schedule.applied_to_train") + player.displayClientMessage(CreateLang.translateDirect("schedule.applied_to_train") .withStyle(ChatFormatting.GREEN), true); itemInHand.shrink(1); player.setItemInHand(activeHand, itemInHand.isEmpty() ? ItemStack.EMPTY : itemInHand); return true; } - player.displayClientMessage(Lang.translateDirect("schedule.non_controlling_seat"), true); + player.displayClientMessage(CreateLang.translateDirect("schedule.non_controlling_seat"), true); AllSoundEvents.DENY.playOnServer(player.level, player.blockPosition(), 1, 1); return true; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerMovementBehaviour.java index 28de9978c7..2f62d8a09b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerMovementBehaviour.java @@ -10,12 +10,12 @@ import com.simibubi.create.content.contraptions.components.structureMovement.ren import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock.HeatLevel; import com.simibubi.create.content.logistics.trains.entity.CarriageContraption; import com.simibubi.create.content.logistics.trains.entity.CarriageContraptionEntity; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.VecHelper; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; -import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerRenderer.java index 8e9c113c85..445fdddeaa 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerRenderer.java @@ -15,10 +15,10 @@ import com.simibubi.create.foundation.block.render.SpriteShiftEntry; import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.ponder.utility.WorldTickHolder; import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; @@ -55,7 +55,7 @@ public class BlazeBurnerRenderer extends SafeTileEntityRenderer 0.125f; HeatLevel heatLevel = BlazeBurnerBlock.getHeatLevelOf(blockState); - float time = AnimationTickHolder.getRenderTime(level); + float time = WorldTickHolder.getRenderTime(level); float renderTick = time + (hashCode % 13) * 16f; float offsetMult = heatLevel.isAtLeast(HeatLevel.FADING) ? 64 : 16; float offset = Mth.sin((float) ((renderTick / 16f) % (2 * Math.PI))) / offsetMult; diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerTileEntity.java index 6a17d9f85f..29fde8d2df 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerTileEntity.java @@ -10,11 +10,11 @@ import com.simibubi.create.content.contraptions.fluids.tank.FluidTankBlock; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock.HeatLevel; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.VecHelper; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; -import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/LitBlazeBurnerBlock.java b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/LitBlazeBurnerBlock.java index 72efff7299..9370ce4e9e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/LitBlazeBurnerBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/LitBlazeBurnerBlock.java @@ -6,8 +6,8 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.wrench.IWrenchable; -import com.simibubi.create.foundation.utility.Lang; +import net.createmod.catnip.utility.lang.Lang; import net.minecraft.core.BlockPos; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.sounds.SoundEvents; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftBlock.java index c4160824a4..99447d3518 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftBlock.java @@ -10,13 +10,13 @@ import com.simibubi.create.AllTileEntities; import com.simibubi.create.content.contraptions.base.DirectionalKineticBlock; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.foundation.block.ITE; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.placement.IPlacementHelper; -import com.simibubi.create.foundation.utility.placement.PlacementHelpers; -import com.simibubi.create.foundation.utility.placement.PlacementOffset; -import com.simibubi.create.foundation.utility.placement.util.PoleHelper; +import com.simibubi.create.foundation.utility.placement.PoleHelper; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.lang.Lang; +import net.createmod.catnip.utility.placement.IPlacementHelper; +import net.createmod.catnip.utility.placement.PlacementHelpers; +import net.createmod.catnip.utility.placement.PlacementOffset; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftTileEntity.java index 62a0f4200f..2b46a3d279 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftTileEntity.java @@ -4,8 +4,8 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryCarriageBlock; import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryCarriageTileEntity; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.util.Mth; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerBlock.java index 681b117d97..5af86e511c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerBlock.java @@ -11,10 +11,10 @@ import com.simibubi.create.content.contraptions.base.HorizontalAxisKineticBlock; import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock; import com.simibubi.create.content.contraptions.relays.elementary.ICogWheel; import com.simibubi.create.foundation.block.ITE; -import com.simibubi.create.foundation.utility.placement.IPlacementHelper; -import com.simibubi.create.foundation.utility.placement.PlacementHelpers; -import com.simibubi.create.foundation.utility.placement.PlacementOffset; +import net.createmod.catnip.utility.placement.IPlacementHelper; +import net.createmod.catnip.utility.placement.PlacementHelpers; +import net.createmod.catnip.utility.placement.PlacementOffset; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction.Axis; @@ -111,7 +111,7 @@ public class SpeedControllerBlock extends HorizontalAxisKineticBlock implements public Class getTileEntityClass() { return SpeedControllerTileEntity.class; } - + @Override public BlockEntityType getTileEntityType() { return AllTileEntities.ROTATION_SPEED_CONTROLLER.get(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerTileEntity.java index 9238ed52ef..2e6a609ec9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerTileEntity.java @@ -12,9 +12,9 @@ import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollValueBehaviour; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.VecHelper; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.block.entity.BlockEntityType; @@ -45,15 +45,15 @@ public class SpeedControllerTileEntity extends KineticTileEntity { Integer max = AllConfigs.SERVER.kinetics.maxRotationSpeed.get(); targetSpeed = - new ScrollValueBehaviour(Lang.translateDirect("generic.speed"), this, new ControllerValueBoxTransform()); + new ScrollValueBehaviour(CreateLang.translateDirect("generic.speed"), this, new ControllerValueBoxTransform()); targetSpeed.between(-max, max); targetSpeed.value = DEFAULT_SPEED; targetSpeed.moveText(new Vec3(9, 0, 10)); - targetSpeed.withUnit(i -> Lang.translateDirect("generic.unit.rpm")); + targetSpeed.withUnit(i -> CreateLang.translateDirect("generic.unit.rpm")); targetSpeed.withCallback(i -> this.updateTargetRotation()); targetSpeed.withStepFunction(CreativeMotorTileEntity::step); behaviours.add(targetSpeed); - + registerAwardables(behaviours, AllAdvancements.SPEED_CONTROLLER); } @@ -63,7 +63,7 @@ public class SpeedControllerTileEntity extends KineticTileEntity { RotationPropagator.handleRemoved(level, worldPosition, this); removeSource(); attachKinetics(); - + if (isCogwheelPresent() && getSpeed() != 0) award(AllAdvancements.SPEED_CONTROLLER); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/Instruction.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/Instruction.java index 9335285d19..e7600dc5d0 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/Instruction.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/Instruction.java @@ -3,8 +3,8 @@ package com.simibubi.create.content.contraptions.relays.advanced.sequencer; import java.util.Vector; import com.simibubi.create.content.contraptions.base.KineticTileEntity; -import com.simibubi.create.foundation.utility.NBTHelper; +import net.createmod.catnip.utility.NBTHelper; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/InstructionSpeedModifiers.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/InstructionSpeedModifiers.java index 23bdf20482..0767102bd3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/InstructionSpeedModifiers.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/InstructionSpeedModifiers.java @@ -3,8 +3,9 @@ package com.simibubi.create.content.contraptions.relays.advanced.sequencer; import java.util.ArrayList; import java.util.List; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.lang.Lang; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TextComponent; @@ -32,7 +33,7 @@ public enum InstructionSpeedModifiers { static List getOptions() { List options = new ArrayList<>(); for (InstructionSpeedModifiers entry : values()) - options.add(Lang.translateDirect(entry.translationKey)); + options.add(CreateLang.translateDirect(entry.translationKey)); return options; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftBlock.java index c7c15ce82f..bcee0828b3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftBlock.java @@ -8,8 +8,8 @@ import com.simibubi.create.content.contraptions.base.HorizontalAxisKineticBlock; import com.simibubi.create.content.contraptions.base.KineticBlock; import com.simibubi.create.content.contraptions.base.RotatedPillarKineticBlock; import com.simibubi.create.foundation.block.ITE; -import com.simibubi.create.foundation.gui.ScreenOpener; +import net.createmod.catnip.gui.ScreenOpener; import net.minecraft.client.player.LocalPlayer; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -149,7 +149,7 @@ public class SequencedGearshiftBlock extends HorizontalAxisKineticBlock implemen public Class getTileEntityClass() { return SequencedGearshiftTileEntity.class; } - + @Override public BlockEntityType getTileEntityType() { return AllTileEntities.SEQUENCED_GEARSHIFT.get(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftScreen.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftScreen.java index 087dfa4f92..592995fb12 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftScreen.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftScreen.java @@ -4,16 +4,16 @@ import java.util.Vector; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllBlocks; -import com.simibubi.create.foundation.gui.AbstractSimiScreen; import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllIcons; -import com.simibubi.create.foundation.gui.element.GuiGameElement; import com.simibubi.create.foundation.gui.widget.IconButton; import com.simibubi.create.foundation.gui.widget.ScrollInput; import com.simibubi.create.foundation.gui.widget.SelectionScrollInput; import com.simibubi.create.foundation.networking.AllPackets; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.gui.AbstractSimiScreen; +import net.createmod.catnip.gui.element.GuiGameElement; import net.minecraft.core.BlockPos; import net.minecraft.nbt.ListTag; import net.minecraft.network.chat.Component; @@ -33,7 +33,7 @@ public class SequencedGearshiftScreen extends AbstractSimiScreen { private Vector> inputs; public SequencedGearshiftScreen(SequencedGearshiftTileEntity te) { - super(Lang.translateDirect("gui.sequenced_gearshift.title")); + super(CreateLang.translateDirect("gui.sequenced_gearshift.title")); this.instructions = te.instructions; this.pos = te.getBlockPos(); compareTag = Instruction.serializeAll(instructions); @@ -41,7 +41,7 @@ public class SequencedGearshiftScreen extends AbstractSimiScreen { @Override protected void init() { - setWindowSize(background.width, background.height); + setWindowSize(background.getWidth(), background.getHeight()); setWindowOffset(-20, 0); super.init(); @@ -56,7 +56,7 @@ public class SequencedGearshiftScreen extends AbstractSimiScreen { initInputsOfRow(row, x, y); confirmButton = - new IconButton(x + background.width - 33, y + background.height - 24, AllIcons.I_CONFIRM); + new IconButton(x + background.getWidth() - 33, y + background.getHeight() - 24, AllIcons.I_CONFIRM); confirmButton.withCallback(() -> { onClose(); }); @@ -78,13 +78,13 @@ public class SequencedGearshiftScreen extends AbstractSimiScreen { new SelectionScrollInput(x, y + rowHeight * row, 50, 18).forOptions(SequencerInstructions.getOptions()) .calling(state -> instructionUpdated(index, state)) .setState(instruction.instruction.ordinal()) - .titled(Lang.translateDirect("gui.sequenced_gearshift.instruction")); + .titled(CreateLang.translateDirect("gui.sequenced_gearshift.instruction")); ScrollInput value = new ScrollInput(x + 58, y + rowHeight * row, 28, 18).calling(state -> instruction.value = state); ScrollInput direction = new SelectionScrollInput(x + 88, y + rowHeight * row, 28, 18) .forOptions(InstructionSpeedModifiers.getOptions()) .calling(state -> instruction.speedModifier = InstructionSpeedModifiers.values()[state]) - .titled(Lang.translateDirect("gui.sequenced_gearshift.speed")); + .titled(CreateLang.translateDirect("gui.sequenced_gearshift.speed")); rowInputs.add(type); rowInputs.add(value); @@ -105,7 +105,7 @@ public class SequencedGearshiftScreen extends AbstractSimiScreen { value.active = value.visible = hasValue; if (hasValue) value.withRange(1, def.maxValue + 1) - .titled(Lang.translateDirect(def.parameterKey)) + .titled(CreateLang.translateDirect(def.parameterKey)) .withShiftStep(def.shiftStep) .setState(instruction.value) .onChanged(); @@ -136,7 +136,7 @@ public class SequencedGearshiftScreen extends AbstractSimiScreen { for (int row = 0; row < instructions.capacity(); row++) { AllGuiTextures toDraw = AllGuiTextures.SEQUENCER_EMPTY; - int yOffset = toDraw.height * row; + int yOffset = toDraw.getHeight() * row; if (row >= instructions.size()) { toDraw.render(ms, x, y + 14 + yOffset, this); continue; @@ -146,7 +146,7 @@ public class SequencedGearshiftScreen extends AbstractSimiScreen { SequencerInstructions def = instruction.instruction; def.background.render(ms, x, y + 14 + yOffset, this); - label(ms, 36, yOffset - 3, Lang.translateDirect(def.translationKey)); + label(ms, 36, yOffset - 3, CreateLang.translateDirect(def.translationKey)); if (def.hasValueParameter) { String text = def.formatValue(instruction.value); int stringWidth = font.width(text); @@ -156,10 +156,10 @@ public class SequencedGearshiftScreen extends AbstractSimiScreen { label(ms, 127, yOffset - 3, instruction.speedModifier.label); } - drawCenteredString(ms, font, title, x + (background.width - 8) / 2, y + 3, 0xFFFFFF); + drawCenteredString(ms, font, title, x + (background.getWidth() - 8) / 2, y + 3, 0xFFFFFF); GuiGameElement.of(renderedItem) - .at(x + background.width + 6, y + background.height - 56, -200) + .at(x + background.getWidth() + 6, y + background.getHeight() - 56, -200) .scale(5) .render(ms); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencerInstructions.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencerInstructions.java index 060a0df7ee..b30479f207 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencerInstructions.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencerInstructions.java @@ -4,8 +4,9 @@ import java.util.ArrayList; import java.util.List; import com.simibubi.create.foundation.gui.AllGuiTextures; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.lang.Lang; import net.minecraft.network.chat.Component; public enum SequencerInstructions { @@ -48,13 +49,13 @@ public enum SequencerInstructions { static List getOptions() { List options = new ArrayList<>(); for (SequencerInstructions entry : values()) - options.add(Lang.translateDirect(entry.descriptiveTranslationKey)); + options.add(CreateLang.translateDirect(entry.descriptiveTranslationKey)); return options; } String formatValue(int value) { if (this == TURN_ANGLE) - return value + Lang.translateDirect("generic.unit.degrees").getString(); + return value + CreateLang.translateDirect("generic.unit.degrees").getString(); if (this == TURN_DISTANCE) return value + "m"; if (this == DELAY) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlock.java index 501ed451fb..cb1b9b6928 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlock.java @@ -26,7 +26,7 @@ import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.block.render.DestroyProgressRenderingHandler; import com.simibubi.create.foundation.block.render.ReducedDestroyEffects; import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour.TransportedResult; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Iterate; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.LevelRenderer; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltHelper.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltHelper.java index 4f0086b07e..a636499f9a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltHelper.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltHelper.java @@ -1,8 +1,8 @@ package com.simibubi.create.content.contraptions.relays.belt; import com.simibubi.create.AllTags.AllItemTags; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Vec3i; import net.minecraft.util.Mth; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java index 0a518ce6ce..20547fd705 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java @@ -17,8 +17,8 @@ import com.simibubi.create.content.contraptions.base.flwdata.BeltData; import com.simibubi.create.content.contraptions.base.flwdata.RotatingData; import com.simibubi.create.foundation.block.render.SpriteShiftEntry; import com.simibubi.create.foundation.render.AllMaterialSpecs; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Iterate; import net.minecraft.core.Direction; import net.minecraft.world.item.DyeColor; import net.minecraft.world.level.LightLayer; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltPart.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltPart.java index 852c07c972..b3c4d366d4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltPart.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltPart.java @@ -1,7 +1,6 @@ package com.simibubi.create.content.contraptions.relays.belt; -import com.simibubi.create.foundation.utility.Lang; - +import net.createmod.catnip.utility.lang.Lang; import net.minecraft.util.StringRepresentable; public enum BeltPart implements StringRepresentable { @@ -11,4 +10,4 @@ public enum BeltPart implements StringRepresentable { public String getSerializedName() { return Lang.asId(name()); } -} \ No newline at end of file +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java index b27ed9d8b4..2dd0d3585e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java @@ -19,11 +19,11 @@ import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.render.ShadowRenderHelper; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.worldWrappers.WrappedWorld; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.utility.worldWrappers.WrappedWorld; +import net.createmod.ponder.utility.WorldTickHolder; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; @@ -75,7 +75,7 @@ public class BeltRenderer extends SafeTileEntityRenderer { PoseStack localTransforms = new PoseStack(); TransformStack msr = TransformStack.cast(localTransforms); VertexConsumer vb = buffer.getBuffer(RenderType.solid()); - float renderTick = AnimationTickHolder.getRenderTime(te.getLevel()); + float renderTick = WorldTickHolder.getRenderTime(te.getLevel()); msr.centre() .rotateY(AngleHelper.horizontalAngle(facing) + (upward ? 180 : 0) + (sideways ? 270 : 0)) diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltShapes.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltShapes.java index 2cd553b0dc..382d440ca7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltShapes.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltShapes.java @@ -6,8 +6,8 @@ import java.util.HashMap; import java.util.Map; import com.simibubi.create.AllShapes; -import com.simibubi.create.foundation.utility.VoxelShaper; +import net.createmod.catnip.utility.VoxelShaper; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; import net.minecraft.world.level.block.state.BlockState; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltSlicer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltSlicer.java index 681e16ec7e..4feee13ecf 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltSlicer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltSlicer.java @@ -7,15 +7,15 @@ import java.util.Optional; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; -import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity.CasingType; import com.simibubi.create.content.contraptions.relays.belt.item.BeltConnectorItem; import com.simibubi.create.content.contraptions.relays.belt.transport.BeltInventory; import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.VecHelper; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.CatnipClient; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; @@ -169,14 +169,14 @@ public class BeltSlicer { if (itemstack.isEmpty()) continue; int count = itemstack.getCount(); - + if (AllItems.BELT_CONNECTOR.isIn(itemstack)) { if (!world.isClientSide) itemstack.shrink(1); beltFound = true; continue; } - + if (AllBlocks.SHAFT.isIn(itemstack)) { int taken = Math.min(count, requiredShafts - amountRetrieved); if (!world.isClientSide) @@ -470,13 +470,13 @@ public class BeltSlicer { return; if (feedback.langKey != null) - mc.player.displayClientMessage(Lang.translateDirect(feedback.langKey) + mc.player.displayClientMessage(CreateLang.translateDirect(feedback.langKey) .withStyle(feedback.formatting), true); else mc.player.displayClientMessage(new TextComponent(""), true); if (feedback.bb != null) - CreateClient.OUTLINER.chaseAABB("BeltSlicer", feedback.bb) + CatnipClient.OUTLINER.chaseAABB("BeltSlicer", feedback.bb) .lineWidth(1 / 16f) .colored(feedback.color); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltSlope.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltSlope.java index 0001fb187d..71445af0b2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltSlope.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltSlope.java @@ -1,7 +1,6 @@ package com.simibubi.create.content.contraptions.relays.belt; -import com.simibubi.create.foundation.utility.Lang; - +import net.createmod.catnip.utility.lang.Lang; import net.minecraft.util.StringRepresentable; public enum BeltSlope implements StringRepresentable { @@ -15,4 +14,4 @@ public enum BeltSlope implements StringRepresentable { public boolean isDiagonal() { return this == UPWARD || this == DOWNWARD; } -} \ No newline at end of file +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java index 6405eaf324..49ff2db67b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java @@ -31,8 +31,8 @@ import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour.TransportedResult; -import com.simibubi.create.foundation.utility.NBTHelper; +import net.createmod.catnip.utility.NBTHelper; import net.minecraft.client.renderer.LightTexture; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/item/BeltConnectorItem.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/item/BeltConnectorItem.java index ac3f3edb4a..d2c2d006be 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/item/BeltConnectorItem.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/item/BeltConnectorItem.java @@ -15,7 +15,7 @@ import com.simibubi.create.content.contraptions.relays.elementary.AbstractSimple import com.simibubi.create.content.contraptions.relays.elementary.ShaftBlock; import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.config.AllConfigs; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltTunnelInteractionHandler.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltTunnelInteractionHandler.java index ab1c46c402..f94385a42b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltTunnelInteractionHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltTunnelInteractionHandler.java @@ -13,8 +13,8 @@ import com.simibubi.create.content.logistics.block.display.DisplayLinkBlock; import com.simibubi.create.content.logistics.block.display.source.AccumulatedItemCountDisplaySource; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.item.ItemStack; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/BracketedKineticTileRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/BracketedKineticTileRenderer.java index 8e0e866601..cc1dde5750 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/BracketedKineticTileRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/BracketedKineticTileRenderer.java @@ -8,8 +8,8 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.utility.AnimationTickHolder; +import net.createmod.ponder.utility.WorldTickHolder; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider.Context; @@ -48,7 +48,7 @@ public class BracketedKineticTileRenderer extends KineticTileEntityRenderer { ms, buffer.getBuffer(RenderType.solid()), light); float offset = getShaftAngleOffset(axis, pos); - float time = AnimationTickHolder.getRenderTime(te.getLevel()); + float time = WorldTickHolder.getRenderTime(te.getLevel()); float angle = ((time * te.getSpeed() * 3f / 10 + offset) % 360) / 180 * (float) Math.PI; SuperByteBuffer shaft = diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/BracketedTileEntityBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/BracketedTileEntityBehaviour.java index 8c5ae2e3b1..733362df59 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/BracketedTileEntityBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/BracketedTileEntityBehaviour.java @@ -9,8 +9,8 @@ import com.simibubi.create.content.schematics.ItemRequirement; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType; -import com.simibubi.create.foundation.utility.NBTHelper; +import net.createmod.catnip.utility.NBTHelper; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; import net.minecraft.world.level.Level; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/CogWheelBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/CogWheelBlock.java index cd366bc9c8..1d6ad96e4f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/CogWheelBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/CogWheelBlock.java @@ -9,8 +9,8 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.relays.advanced.SpeedControllerBlock; import com.simibubi.create.content.contraptions.relays.encased.EncasedCogwheelBlock; import com.simibubi.create.foundation.advancement.AllAdvancements; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Iterate; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/CogwheelBlockItem.java b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/CogwheelBlockItem.java index caabc7551a..92a96642ae 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/CogwheelBlockItem.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/CogwheelBlockItem.java @@ -10,11 +10,11 @@ import com.simibubi.create.content.contraptions.base.DirectionalKineticBlock; import com.simibubi.create.content.contraptions.base.HorizontalKineticBlock; import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.base.RotatedPillarKineticBlock; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.placement.IPlacementHelper; -import com.simibubi.create.foundation.utility.placement.PlacementHelpers; -import com.simibubi.create.foundation.utility.placement.PlacementOffset; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.placement.IPlacementHelper; +import net.createmod.catnip.utility.placement.PlacementHelpers; +import net.createmod.catnip.utility.placement.PlacementOffset; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/ShaftBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/ShaftBlock.java index 4adaf8acb9..60e78e8d5a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/ShaftBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/ShaftBlock.java @@ -9,11 +9,11 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.components.steam.PoweredShaftBlock; import com.simibubi.create.content.contraptions.relays.encased.EncasedShaftBlock; import com.simibubi.create.content.curiosities.girder.GirderEncasedShaftBlock; -import com.simibubi.create.foundation.utility.placement.IPlacementHelper; -import com.simibubi.create.foundation.utility.placement.PlacementHelpers; -import com.simibubi.create.foundation.utility.placement.PlacementOffset; -import com.simibubi.create.foundation.utility.placement.util.PoleHelper; +import com.simibubi.create.foundation.utility.placement.PoleHelper; +import net.createmod.catnip.utility.placement.IPlacementHelper; +import net.createmod.catnip.utility.placement.PlacementHelpers; +import net.createmod.catnip.utility.placement.PlacementOffset; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/EncasedBeltBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/EncasedBeltBlock.java index a4c585b9ae..0712f27fc8 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/EncasedBeltBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/EncasedBeltBlock.java @@ -5,9 +5,9 @@ import com.simibubi.create.content.contraptions.base.DirectionalAxisKineticBlock import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.RotatedPillarKineticBlock; import com.simibubi.create.foundation.block.ITE; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.Lang; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.lang.Lang; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/EncasedCogCTBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/EncasedCogCTBehaviour.java index bebb607d5a..832047bd00 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/EncasedCogCTBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/EncasedCogCTBehaviour.java @@ -7,8 +7,8 @@ import org.jetbrains.annotations.Nullable; import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.relays.elementary.ICogWheel; import com.simibubi.create.foundation.block.connected.CTSpriteShiftEntry; -import com.simibubi.create.foundation.utility.Couple; +import net.createmod.catnip.utility.Couple; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/EncasedCogInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/EncasedCogInstance.java index 62d6f45bc0..3baebd86a9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/EncasedCogInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/EncasedCogInstance.java @@ -14,8 +14,8 @@ import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileInstance; import com.simibubi.create.content.contraptions.base.flwdata.RotatingData; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Iterate; import net.minecraft.core.Direction; import net.minecraft.core.Direction.AxisDirection; import net.minecraft.world.level.block.Block; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/EncasedCogRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/EncasedCogRenderer.java index 74445ff1fb..40e5ae91bf 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/EncasedCogRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/EncasedCogRenderer.java @@ -8,8 +8,8 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Iterate; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java index d6ded2749f..9b1576a0be 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java @@ -10,8 +10,8 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.base.KineticTileInstance; import com.simibubi.create.content.contraptions.base.flwdata.RotatingData; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Iterate; import net.minecraft.core.Direction; import net.minecraft.world.level.block.Block; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java index ba38d1481c..d048c8828c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java @@ -8,9 +8,9 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Iterate; +import net.createmod.ponder.utility.WorldTickHolder; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; @@ -33,7 +33,7 @@ public class SplitShaftRenderer extends KineticTileEntityRenderer { Block block = te.getBlockState().getBlock(); final Axis boxAxis = ((IRotate) block).getRotationAxis(te.getBlockState()); final BlockPos pos = te.getBlockPos(); - float time = AnimationTickHolder.getRenderTime(te.getLevel()); + float time = WorldTickHolder.getRenderTime(te.getLevel()); for (Direction direction : Iterate.directions) { Axis axis = direction.getAxis(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeBlock.java index 64f421053c..a9e08deafb 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeBlock.java @@ -7,12 +7,12 @@ import com.simibubi.create.AllTileEntities; import com.simibubi.create.content.contraptions.base.DirectionalAxisKineticBlock; import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.foundation.block.ITE; -import com.simibubi.create.foundation.utility.Color; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.VecHelper; -import com.simibubi.create.foundation.utility.worldWrappers.WrappedWorld; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.lang.Lang; +import net.createmod.catnip.utility.theme.Color; +import net.createmod.catnip.utility.worldWrappers.WrappedWorld; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeInstance.java index b27f440120..702ae2e72d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeInstance.java @@ -11,10 +11,10 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.relays.encased.ShaftInstance; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.Iterate; import net.minecraft.core.Direction; import net.minecraft.util.Mth; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeRenderer.java index a5872e8b37..38e3798b5d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeRenderer.java @@ -10,8 +10,8 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.relays.gauge.GaugeBlock.Type; import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Iterate; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeShaper.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeShaper.java index b21d42d340..5a47c03465 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeShaper.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeShaper.java @@ -3,8 +3,8 @@ package com.simibubi.create.content.contraptions.relays.gauge; import java.util.Arrays; import com.simibubi.create.AllShapes; -import com.simibubi.create.foundation.utility.VoxelShaper; +import net.createmod.catnip.utility.VoxelShaper; import net.minecraft.core.Direction; import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.VoxelShape; @@ -29,4 +29,4 @@ public class GaugeShaper extends VoxelShaper { public VoxelShape get(Direction direction, boolean axisAlong) { return (axisAlong ? axisTrue : axisFalse).get(direction); } -} \ No newline at end of file +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeTileEntity.java index bdd77ba69f..dc7e10a1e8 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeTileEntity.java @@ -4,7 +4,7 @@ import java.util.List; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; @@ -48,7 +48,7 @@ public class GaugeTileEntity extends KineticTileEntity implements IHaveGoggleInf @Override public boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking) { - tooltip.add(componentSpacing.plainCopy().append(Lang.translateDirect("gui.gauge.info_header"))); + tooltip.add(componentSpacing.plainCopy().append(CreateLang.translateDirect("gui.gauge.info_header"))); return true; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/SpeedGaugeTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/SpeedGaugeTileEntity.java index fb48c72094..18aed589f4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/SpeedGaugeTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/SpeedGaugeTileEntity.java @@ -4,9 +4,9 @@ import java.util.List; import com.simibubi.create.content.contraptions.base.IRotate.SpeedLevel; import com.simibubi.create.foundation.config.AllConfigs; -import com.simibubi.create.foundation.utility.Color; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.theme.Color; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; @@ -55,7 +55,7 @@ public class SpeedGaugeTileEntity extends GaugeTileEntity { @Override public boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking) { super.addToGoggleTooltip(tooltip, isPlayerSneaking); - Lang.translate("gui.speedometer.title") + CreateLang.translate("gui.speedometer.title") .style(ChatFormatting.GRAY) .forGoggles(tooltip); SpeedLevel.getFormattedSpeedText(speed, isOverStressed()) diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/StressGaugeTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/StressGaugeTileEntity.java index 665226cb1c..85301cf74d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/StressGaugeTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/StressGaugeTileEntity.java @@ -7,10 +7,10 @@ import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.item.ItemDescription; import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.utility.Color; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.LangBuilder; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.lang.LangBuilder; +import net.createmod.catnip.utility.theme.Color; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; @@ -81,33 +81,33 @@ public class StressGaugeTileEntity extends GaugeTileEntity { double capacity = getNetworkCapacity(); double stressFraction = getNetworkStress() / (capacity == 0 ? 1 : capacity); - Lang.translate("gui.stressometer.title") + CreateLang.translate("gui.stressometer.title") .style(ChatFormatting.GRAY) .forGoggles(tooltip); if (getTheoreticalSpeed() == 0) - Lang.text(ItemDescription.makeProgressBar(3, 0)) + CreateLang.text(ItemDescription.makeProgressBar(3, 0)) .translate("gui.stressometer.no_rotation") .style(ChatFormatting.DARK_GRAY) .forGoggles(tooltip); else { StressImpact.getFormattedStressText(stressFraction) .forGoggles(tooltip); - Lang.translate("gui.stressometer.capacity") + CreateLang.translate("gui.stressometer.capacity") .style(ChatFormatting.GRAY) .forGoggles(tooltip); double remainingCapacity = capacity - getNetworkStress(); - LangBuilder su = Lang.translate("generic.unit.stress"); - LangBuilder stressTip = Lang.number(remainingCapacity) + LangBuilder su = CreateLang.translate("generic.unit.stress"); + LangBuilder stressTip = CreateLang.number(remainingCapacity) .add(su) .style(StressImpact.of(stressFraction) .getRelativeColor()); if (remainingCapacity != capacity) stressTip.text(ChatFormatting.GRAY, " / ") - .add(Lang.number(capacity) + .add(CreateLang.number(capacity) .add(su) .style(ChatFormatting.DARK_GRAY)); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java index ae7173155e..1fa8af6328 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java @@ -10,8 +10,8 @@ import com.jozufozu.flywheel.api.MaterialManager; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileInstance; import com.simibubi.create.content.contraptions.base.flwdata.RotatingData; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.LightLayer; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java index 04671bcade..d5babb04e2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java @@ -7,9 +7,9 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Iterate; +import net.createmod.ponder.utility.WorldTickHolder; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; @@ -31,7 +31,7 @@ public class GearboxRenderer extends KineticTileEntityRenderer { final Axis boxAxis = te.getBlockState().getValue(BlockStateProperties.AXIS); final BlockPos pos = te.getBlockPos(); - float time = AnimationTickHolder.getRenderTime(te.getLevel()); + float time = WorldTickHolder.getRenderTime(te.getLevel()); for (Direction direction : Iterate.directions) { final Axis axis = direction.getAxis(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/VerticalGearboxItem.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/VerticalGearboxItem.java index 5b5a4761a1..1a89bf55e2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/VerticalGearboxItem.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/VerticalGearboxItem.java @@ -4,8 +4,8 @@ import java.util.Map; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.base.IRotate; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -29,7 +29,7 @@ public class VerticalGearboxItem extends BlockItem { @Override public void fillItemCategory(CreativeModeTab p_150895_1_, NonNullList p_150895_2_) { } - + @Override public String getDescriptionId() { return "item.create.vertical_gearbox"; diff --git a/src/main/java/com/simibubi/create/content/contraptions/wrench/IWrenchable.java b/src/main/java/com/simibubi/create/content/contraptions/wrench/IWrenchable.java index dc2a857353..f2d074a47d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/wrench/IWrenchable.java +++ b/src/main/java/com/simibubi/create/content/contraptions/wrench/IWrenchable.java @@ -9,9 +9,9 @@ import com.simibubi.create.content.contraptions.base.HorizontalAxisKineticBlock; import com.simibubi.create.content.contraptions.base.HorizontalKineticBlock; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.RotatedPillarKineticBlock; -import com.simibubi.create.foundation.utility.DirectionHelper; -import com.simibubi.create.foundation.utility.VoxelShaper; +import net.createmod.catnip.utility.DirectionHelper; +import net.createmod.catnip.utility.VoxelShaper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; diff --git a/src/main/java/com/simibubi/create/content/contraptions/wrench/WrenchItemRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/wrench/WrenchItemRenderer.java index 1539410e10..f6ab1c9e0f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/wrench/WrenchItemRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/wrench/WrenchItemRenderer.java @@ -5,7 +5,7 @@ import com.mojang.math.Vector3f; import com.simibubi.create.foundation.item.render.CustomRenderedItemModelRenderer; import com.simibubi.create.foundation.item.render.PartialItemModelRenderer; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollValueHandler; -import com.simibubi.create.foundation.utility.AnimationTickHolder; +import net.createmod.catnip.utility.AnimationTickHolder; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.block.model.ItemTransforms; diff --git a/src/main/java/com/simibubi/create/content/curiosities/ChromaticCompoundColor.java b/src/main/java/com/simibubi/create/content/curiosities/ChromaticCompoundColor.java index 64b108331b..1b9e1a44e6 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/ChromaticCompoundColor.java +++ b/src/main/java/com/simibubi/create/content/curiosities/ChromaticCompoundColor.java @@ -1,8 +1,7 @@ package com.simibubi.create.content.curiosities; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.Color; - +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.theme.Color; import net.minecraft.client.Minecraft; import net.minecraft.client.color.item.ItemColor; import net.minecraft.util.Mth; diff --git a/src/main/java/com/simibubi/create/content/curiosities/ChromaticCompoundItem.java b/src/main/java/com/simibubi/create/content/curiosities/ChromaticCompoundItem.java index 6d2537478f..4b66b0d05b 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/ChromaticCompoundItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/ChromaticCompoundItem.java @@ -11,9 +11,9 @@ import com.simibubi.create.foundation.config.CRecipes; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour.TransportedResult; -import com.simibubi.create.foundation.utility.Color; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.theme.Color; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.NonNullList; diff --git a/src/main/java/com/simibubi/create/content/curiosities/ExperienceNuggetItem.java b/src/main/java/com/simibubi/create/content/curiosities/ExperienceNuggetItem.java index 53b91160e6..9c981a587c 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/ExperienceNuggetItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/ExperienceNuggetItem.java @@ -1,7 +1,6 @@ package com.simibubi.create.content.curiosities; -import com.simibubi.create.foundation.utility.VecHelper; - +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.Direction.Axis; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; @@ -60,7 +59,7 @@ public class ExperienceNuggetItem extends Item { xp.setDeltaMovement(motion); pLevel.addFreshEntity(xp); } - + pPlayer.setItemInHand(pUsedHand, ItemStack.EMPTY); return InteractionResultHolder.consume(itemInHand); } diff --git a/src/main/java/com/simibubi/create/content/curiosities/NoGravMagicalDohickyItem.java b/src/main/java/com/simibubi/create/content/curiosities/NoGravMagicalDohickyItem.java index 4d314d7209..6224a431ef 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/NoGravMagicalDohickyItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/NoGravMagicalDohickyItem.java @@ -1,6 +1,6 @@ package com.simibubi.create.content.curiosities; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.NonNullList; import net.minecraft.core.particles.ParticleTypes; diff --git a/src/main/java/com/simibubi/create/content/curiosities/TreeFertilizerItem.java b/src/main/java/com/simibubi/create/content/curiosities/TreeFertilizerItem.java index 47ae26065e..5d80b7e416 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/TreeFertilizerItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/TreeFertilizerItem.java @@ -1,7 +1,10 @@ package com.simibubi.create.content.curiosities; -import com.simibubi.create.foundation.utility.worldWrappers.PlacementSimulationServerWorld; +import javax.annotation.Nonnull; +import org.jetbrains.annotations.NotNull; + +import net.createmod.catnip.utility.worldWrappers.PlacementSimulationServerWorld; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.tags.BlockTags; @@ -93,14 +96,14 @@ public class TreeFertilizerItem extends Item { } @Override - public BlockState getBlockState(BlockPos pos) { + public @NotNull BlockState getBlockState(@Nonnull BlockPos pos) { if (pos.getY() <= 9) return soil; return super.getBlockState(pos); } @Override - public boolean setBlock(BlockPos pos, BlockState newState, int flags) { + public boolean setBlock(@Nonnull BlockPos pos, @Nonnull BlockState newState, int flags) { if (newState.getBlock() == Blocks.PODZOL) return true; return super.setBlock(pos, newState, flags); diff --git a/src/main/java/com/simibubi/create/content/curiosities/armor/BackTankUtil.java b/src/main/java/com/simibubi/create/content/curiosities/armor/BackTankUtil.java index c84a256fe0..4f0f2e2718 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/armor/BackTankUtil.java +++ b/src/main/java/com/simibubi/create/content/curiosities/armor/BackTankUtil.java @@ -4,7 +4,7 @@ import com.simibubi.create.AllEnchantments; import com.simibubi.create.AllItems; import com.simibubi.create.AllSoundEvents; import com.simibubi.create.foundation.config.AllConfigs; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; @@ -63,7 +63,7 @@ public class BackTankUtil { return; boolean depleted = threshold == 1; - MutableComponent component = Lang.translateDirect(depleted ? "backtank.depleted" : "backtank.low"); + MutableComponent component = CreateLang.translateDirect(depleted ? "backtank.depleted" : "backtank.low"); AllSoundEvents.DENY.play(player.level, null, player.blockPosition(), 1, 1.25f); AllSoundEvents.STEAM.play(player.level, null, player.blockPosition(), .5f, .5f); diff --git a/src/main/java/com/simibubi/create/content/curiosities/armor/CopperBacktankArmorLayer.java b/src/main/java/com/simibubi/create/content/curiosities/armor/CopperBacktankArmorLayer.java index 9ceefaf8e3..58201e55a4 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/armor/CopperBacktankArmorLayer.java +++ b/src/main/java/com/simibubi/create/content/curiosities/armor/CopperBacktankArmorLayer.java @@ -4,12 +4,14 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; -import com.simibubi.create.foundation.gui.element.GuiGameElement; +import net.createmod.catnip.gui.element.GuiGameElement; import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.Color; +import net.createmod.catnip.utility.math.AngleHelper; + +import net.createmod.ponder.utility.WorldTickHolder; + +import net.createmod.catnip.utility.theme.Color; import net.minecraft.client.Minecraft; import net.minecraft.client.model.EntityModel; @@ -78,7 +80,7 @@ public class CopperBacktankArmorLayer behaviours) { super.addBehaviours(behaviours); registerAwardables(behaviours, AllAdvancements.BACKTANK); } - + @Override public void onSpeedChanged(float previousSpeed) { super.onSpeedChanged(previousSpeed); if (getSpeed() != 0) award(AllAdvancements.BACKTANK); } - + @Override public void tick() { super.tick(); diff --git a/src/main/java/com/simibubi/create/content/curiosities/armor/DivingBootsItem.java b/src/main/java/com/simibubi/create/content/curiosities/armor/DivingBootsItem.java index 4f154a3fdc..d0d914d703 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/armor/DivingBootsItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/armor/DivingBootsItem.java @@ -1,8 +1,8 @@ package com.simibubi.create.content.curiosities.armor; import com.simibubi.create.AllItems; -import com.simibubi.create.foundation.utility.NBTHelper; +import net.createmod.catnip.utility.NBTHelper; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.Pose; diff --git a/src/main/java/com/simibubi/create/content/curiosities/bell/AbstractBellTileEntity.java b/src/main/java/com/simibubi/create/content/curiosities/bell/AbstractBellTileEntity.java index 98aceda437..079889058a 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/bell/AbstractBellTileEntity.java +++ b/src/main/java/com/simibubi/create/content/curiosities/bell/AbstractBellTileEntity.java @@ -5,8 +5,8 @@ import java.util.List; import com.jozufozu.flywheel.core.PartialModel; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.utility.NBTHelper; +import net.createmod.catnip.utility.NBTHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; @@ -52,7 +52,7 @@ public abstract class AbstractBellTileEntity extends SmartTileEntity { ringingTicks = 0; } } - + @Override protected void write(CompoundTag tag, boolean clientPacket) { super.write(tag, clientPacket); @@ -60,7 +60,7 @@ public abstract class AbstractBellTileEntity extends SmartTileEntity { return; NBTHelper.writeEnum(tag, "Ringing", ringDirection); } - + @Override protected void read(CompoundTag tag, boolean clientPacket) { super.read(tag, clientPacket); diff --git a/src/main/java/com/simibubi/create/content/curiosities/bell/BellRenderer.java b/src/main/java/com/simibubi/create/content/curiosities/bell/BellRenderer.java index 291a236fd7..65476e0b61 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/bell/BellRenderer.java +++ b/src/main/java/com/simibubi/create/content/curiosities/bell/BellRenderer.java @@ -4,7 +4,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; -import com.simibubi.create.foundation.utility.AngleHelper; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; diff --git a/src/main/java/com/simibubi/create/content/curiosities/bell/HauntedBellPulser.java b/src/main/java/com/simibubi/create/content/curiosities/bell/HauntedBellPulser.java index d90c066ea7..57488fa7da 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/bell/HauntedBellPulser.java +++ b/src/main/java/com/simibubi/create/content/curiosities/bell/HauntedBellPulser.java @@ -8,8 +8,8 @@ import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import com.simibubi.create.AllBlocks; import com.simibubi.create.foundation.networking.AllPackets; -import com.simibubi.create.foundation.utility.IntAttached; +import net.createmod.catnip.utility.IntAttached; import net.minecraft.core.BlockPos; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.Level; diff --git a/src/main/java/com/simibubi/create/content/curiosities/bell/SoulPulseEffect.java b/src/main/java/com/simibubi/create/content/curiosities/bell/SoulPulseEffect.java index 892020b1f4..e90a1dfa9a 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/bell/SoulPulseEffect.java +++ b/src/main/java/com/simibubi/create/content/curiosities/bell/SoulPulseEffect.java @@ -7,7 +7,7 @@ import java.util.stream.Stream; import com.google.common.collect.Streams; import com.simibubi.create.content.curiosities.bell.SoulParticle.ExpandingPerimeterData; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.world.entity.EntityType; diff --git a/src/main/java/com/simibubi/create/content/curiosities/deco/MetalLadderBlock.java b/src/main/java/com/simibubi/create/content/curiosities/deco/MetalLadderBlock.java index a5c44f1805..82c150814a 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/deco/MetalLadderBlock.java +++ b/src/main/java/com/simibubi/create/content/curiosities/deco/MetalLadderBlock.java @@ -5,10 +5,10 @@ import java.util.function.Predicate; import com.simibubi.create.content.contraptions.wrench.IWrenchable; import com.simibubi.create.content.curiosities.tools.ExtendoGripItem; import com.simibubi.create.foundation.config.AllConfigs; -import com.simibubi.create.foundation.utility.placement.IPlacementHelper; -import com.simibubi.create.foundation.utility.placement.PlacementHelpers; -import com.simibubi.create.foundation.utility.placement.PlacementOffset; +import net.createmod.catnip.utility.placement.IPlacementHelper; +import net.createmod.catnip.utility.placement.PlacementHelpers; +import net.createmod.catnip.utility.placement.PlacementOffset; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/curiosities/deco/PlacardRenderer.java b/src/main/java/com/simibubi/create/content/curiosities/deco/PlacardRenderer.java index 478ec22e4f..3a6eab42cd 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/deco/PlacardRenderer.java +++ b/src/main/java/com/simibubi/create/content/curiosities/deco/PlacardRenderer.java @@ -3,8 +3,8 @@ package com.simibubi.create.content.curiosities.deco; import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; -import com.simibubi.create.foundation.utility.AngleHelper; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.block.model.ItemTransforms.TransformType; diff --git a/src/main/java/com/simibubi/create/content/curiosities/deco/PlacardTileEntity.java b/src/main/java/com/simibubi/create/content/curiosities/deco/PlacardTileEntity.java index ab6fa677ea..26edb157af 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/deco/PlacardTileEntity.java +++ b/src/main/java/com/simibubi/create/content/curiosities/deco/PlacardTileEntity.java @@ -6,8 +6,8 @@ import com.mojang.math.Vector3f; import com.simibubi.create.AllBlocks; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.particles.DustParticleOptions; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/curiosities/deco/SlidingDoorMovementBehaviour.java b/src/main/java/com/simibubi/create/content/curiosities/deco/SlidingDoorMovementBehaviour.java index 5e42e9b1ae..5ed747f68b 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/deco/SlidingDoorMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/curiosities/deco/SlidingDoorMovementBehaviour.java @@ -7,7 +7,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Mov import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.content.logistics.trains.entity.CarriageContraptionEntity; import com.simibubi.create.content.logistics.trains.entity.CarriageSyncData; -import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; import net.minecraft.core.BlockPos; import net.minecraft.sounds.SoundEvents; diff --git a/src/main/java/com/simibubi/create/content/curiosities/deco/SlidingDoorTileEntity.java b/src/main/java/com/simibubi/create/content/curiosities/deco/SlidingDoorTileEntity.java index 98d9f93f88..008e10e3f7 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/deco/SlidingDoorTileEntity.java +++ b/src/main/java/com/simibubi/create/content/curiosities/deco/SlidingDoorTileEntity.java @@ -4,8 +4,8 @@ import java.util.List; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; -import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; import net.minecraft.core.BlockPos; import net.minecraft.sounds.SoundEvents; diff --git a/src/main/java/com/simibubi/create/content/curiosities/girder/ConnectedGirderModel.java b/src/main/java/com/simibubi/create/content/curiosities/girder/ConnectedGirderModel.java index 373800fd2a..5fe648575a 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/girder/ConnectedGirderModel.java +++ b/src/main/java/com/simibubi/create/content/curiosities/girder/ConnectedGirderModel.java @@ -7,8 +7,8 @@ import java.util.Random; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.foundation.block.connected.CTModel; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Iterate; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.resources.model.BakedModel; import net.minecraft.core.BlockPos; 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 ff20a1c6ba..eb9fe907eb 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 @@ -19,10 +19,10 @@ import com.simibubi.create.content.logistics.trains.management.display.FlapDispl import com.simibubi.create.content.logistics.trains.track.TrackBlock; import com.simibubi.create.content.logistics.trains.track.TrackShape; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.placement.IPlacementHelper; -import com.simibubi.create.foundation.utility.placement.PlacementHelpers; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.placement.IPlacementHelper; +import net.createmod.catnip.utility.placement.PlacementHelpers; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/curiosities/girder/GirderBlockStateGenerator.java b/src/main/java/com/simibubi/create/content/curiosities/girder/GirderBlockStateGenerator.java index 1c387539c5..affde64b4f 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/girder/GirderBlockStateGenerator.java +++ b/src/main/java/com/simibubi/create/content/curiosities/girder/GirderBlockStateGenerator.java @@ -1,10 +1,10 @@ package com.simibubi.create.content.curiosities.girder; import com.simibubi.create.foundation.data.AssetLookup; -import com.simibubi.create.foundation.utility.Iterate; import com.tterrag.registrate.providers.DataGenContext; import com.tterrag.registrate.providers.RegistrateBlockstateProvider; +import net.createmod.catnip.utility.Iterate; import net.minecraft.core.Direction.Axis; import net.minecraft.world.level.block.Block; import net.minecraftforge.client.model.generators.MultiPartBlockStateBuilder; diff --git a/src/main/java/com/simibubi/create/content/curiosities/girder/GirderPlacementHelper.java b/src/main/java/com/simibubi/create/content/curiosities/girder/GirderPlacementHelper.java index 154a476bf5..0f2e26c364 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/girder/GirderPlacementHelper.java +++ b/src/main/java/com/simibubi/create/content/curiosities/girder/GirderPlacementHelper.java @@ -7,9 +7,9 @@ import com.google.common.base.Predicates; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.curiosities.tools.ExtendoGripItem; import com.simibubi.create.foundation.config.AllConfigs; -import com.simibubi.create.foundation.utility.placement.IPlacementHelper; -import com.simibubi.create.foundation.utility.placement.PlacementOffset; +import net.createmod.catnip.utility.placement.IPlacementHelper; +import net.createmod.catnip.utility.placement.PlacementOffset; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/curiosities/girder/GirderWrenchBehavior.java b/src/main/java/com/simibubi/create/content/curiosities/girder/GirderWrenchBehavior.java index dd8fe7a894..9b35c0a954 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/girder/GirderWrenchBehavior.java +++ b/src/main/java/com/simibubi/create/content/curiosities/girder/GirderWrenchBehavior.java @@ -8,13 +8,13 @@ import org.jetbrains.annotations.Nullable; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; -import com.simibubi.create.CreateClient; -import com.simibubi.create.foundation.utility.Color; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.Pair; -import com.simibubi.create.foundation.utility.VecHelper; -import com.simibubi.create.foundation.utility.placement.IPlacementHelper; +import net.createmod.catnip.CatnipClient; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.placement.IPlacementHelper; +import net.createmod.catnip.utility.theme.Color; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.core.BlockPos; @@ -91,7 +91,7 @@ public class GirderWrenchBehavior { .getNormal()) .scale(0.1 * normalMultiplier)); - CreateClient.OUTLINER.showAABB("girderWrench", new AABB(corner1, corner2)) + CatnipClient.OUTLINER.showAABB("girderWrench", new AABB(corner1, corner2)) .lineWidth(1 / 32f) .colored(new Color(127, 127, 127)); } diff --git a/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryHandler.java b/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryHandler.java index 0a30ce6070..8c61bf3e18 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryHandler.java +++ b/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryHandler.java @@ -8,8 +8,8 @@ import com.mojang.math.Vector3f; import com.simibubi.create.AllItems; import com.simibubi.create.content.curiosities.symmetry.mirror.EmptyMirror; import com.simibubi.create.content.curiosities.symmetry.mirror.SymmetryMirror; -import com.simibubi.create.foundation.utility.AnimationTickHolder; +import net.createmod.catnip.utility.AnimationTickHolder; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; diff --git a/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryWandItem.java b/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryWandItem.java index 44aa285ba6..a935b7591b 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryWandItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryWandItem.java @@ -16,12 +16,12 @@ import com.simibubi.create.content.curiosities.symmetry.mirror.EmptyMirror; import com.simibubi.create.content.curiosities.symmetry.mirror.PlaneMirror; import com.simibubi.create.content.curiosities.symmetry.mirror.SymmetryMirror; import com.simibubi.create.foundation.config.AllConfigs; -import com.simibubi.create.foundation.gui.ScreenOpener; import com.simibubi.create.foundation.item.render.SimpleCustomRenderer; import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.utility.BlockHelper; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.gui.ScreenOpener; +import net.createmod.catnip.utility.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryWandScreen.java b/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryWandScreen.java index a5c77c3b59..64592fb1a3 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryWandScreen.java +++ b/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryWandScreen.java @@ -7,17 +7,18 @@ import com.simibubi.create.content.curiosities.symmetry.mirror.EmptyMirror; import com.simibubi.create.content.curiosities.symmetry.mirror.PlaneMirror; import com.simibubi.create.content.curiosities.symmetry.mirror.SymmetryMirror; import com.simibubi.create.content.curiosities.symmetry.mirror.TriplePlaneMirror; -import com.simibubi.create.foundation.gui.AbstractSimiScreen; import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllIcons; -import com.simibubi.create.foundation.gui.element.GuiGameElement; +import com.simibubi.create.foundation.gui.element.PartialModelGuiElement; import com.simibubi.create.foundation.gui.widget.IconButton; import com.simibubi.create.foundation.gui.widget.Label; import com.simibubi.create.foundation.gui.widget.ScrollInput; import com.simibubi.create.foundation.gui.widget.SelectionScrollInput; import com.simibubi.create.foundation.networking.AllPackets; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.gui.AbstractSimiScreen; +import net.createmod.catnip.gui.element.GuiGameElement; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TextComponent; import net.minecraft.world.InteractionHand; @@ -34,8 +35,8 @@ public class SymmetryWandScreen extends AbstractSimiScreen { private Label labelAlign; private IconButton confirmButton; - private final Component mirrorType = Lang.translateDirect("gui.symmetryWand.mirrorType"); - private final Component orientation = Lang.translateDirect("gui.symmetryWand.orientation"); + private final Component mirrorType = CreateLang.translateDirect("gui.symmetryWand.mirrorType"); + private final Component orientation = CreateLang.translateDirect("gui.symmetryWand.orientation"); private SymmetryMirror currentElement; private ItemStack wand; @@ -54,7 +55,7 @@ public class SymmetryWandScreen extends AbstractSimiScreen { @Override public void init() { - setWindowSize(background.width, background.height); + setWindowSize(background.getWidth(), background.getHeight()); setWindowOffset(-20, 0); super.init(); @@ -96,7 +97,7 @@ public class SymmetryWandScreen extends AbstractSimiScreen { addRenderableWidget(areaType); addRenderableWidget(labelType); - confirmButton = new IconButton(x + background.width - 33, y + background.height - 24, AllIcons.I_CONFIRM); + confirmButton = new IconButton(x + background.getWidth() - 33, y + background.getHeight() - 24, AllIcons.I_CONFIRM); confirmButton.withCallback(() -> { onClose(); }); @@ -139,7 +140,7 @@ public class SymmetryWandScreen extends AbstractSimiScreen { ms.mulPose(new Vector3f(.3f, 1f, 0f).rotationDegrees(-22.5f)); currentElement.applyModelTransform(ms); // RenderSystem.multMatrix(ms.peek().getModel()); - GuiGameElement.of(currentElement.getModel()) + PartialModelGuiElement.of(currentElement.getModel()) .render(ms); ms.popPose(); diff --git a/src/main/java/com/simibubi/create/content/curiosities/symmetry/client/SymmetryWandItemRenderer.java b/src/main/java/com/simibubi/create/content/curiosities/symmetry/client/SymmetryWandItemRenderer.java index 4f28a4d67a..0710777052 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/symmetry/client/SymmetryWandItemRenderer.java +++ b/src/main/java/com/simibubi/create/content/curiosities/symmetry/client/SymmetryWandItemRenderer.java @@ -4,8 +4,8 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Vector3f; import com.simibubi.create.foundation.item.render.CustomRenderedItemModelRenderer; import com.simibubi.create.foundation.item.render.PartialItemModelRenderer; -import com.simibubi.create.foundation.utility.AnimationTickHolder; +import net.createmod.catnip.utility.AnimationTickHolder; import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.block.model.ItemTransforms; diff --git a/src/main/java/com/simibubi/create/content/curiosities/symmetry/mirror/CrossPlaneMirror.java b/src/main/java/com/simibubi/create/content/curiosities/symmetry/mirror/CrossPlaneMirror.java index e1342bf4b1..12764744ac 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/symmetry/mirror/CrossPlaneMirror.java +++ b/src/main/java/com/simibubi/create/content/curiosities/symmetry/mirror/CrossPlaneMirror.java @@ -9,7 +9,7 @@ import com.jozufozu.flywheel.core.PartialModel; import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllBlockPartials; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; @@ -105,7 +105,7 @@ public class CrossPlaneMirror extends SymmetryMirror { @Override public List getAlignToolTips() { - return ImmutableList.of(Lang.translateDirect("orientation.orthogonal"), Lang.translateDirect("orientation.diagonal")); + return ImmutableList.of(CreateLang.translateDirect("orientation.orthogonal"), CreateLang.translateDirect("orientation.diagonal")); } } diff --git a/src/main/java/com/simibubi/create/content/curiosities/symmetry/mirror/PlaneMirror.java b/src/main/java/com/simibubi/create/content/curiosities/symmetry/mirror/PlaneMirror.java index 06b6a0ceb4..d3fd47378e 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/symmetry/mirror/PlaneMirror.java +++ b/src/main/java/com/simibubi/create/content/curiosities/symmetry/mirror/PlaneMirror.java @@ -9,7 +9,7 @@ import com.jozufozu.flywheel.core.PartialModel; import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllBlockPartials; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; @@ -101,7 +101,7 @@ public class PlaneMirror extends SymmetryMirror { @Override public List getAlignToolTips() { - return ImmutableList.of(Lang.translateDirect("orientation.alongZ"), Lang.translateDirect("orientation.alongX")); + return ImmutableList.of(CreateLang.translateDirect("orientation.alongZ"), CreateLang.translateDirect("orientation.alongX")); } } diff --git a/src/main/java/com/simibubi/create/content/curiosities/symmetry/mirror/SymmetryMirror.java b/src/main/java/com/simibubi/create/content/curiosities/symmetry/mirror/SymmetryMirror.java index 0ad3e979e4..afd3f9faf3 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/symmetry/mirror/SymmetryMirror.java +++ b/src/main/java/com/simibubi/create/content/curiosities/symmetry/mirror/SymmetryMirror.java @@ -7,7 +7,7 @@ import java.util.Map; import com.google.common.collect.ImmutableList; import com.jozufozu.flywheel.core.PartialModel; import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -45,8 +45,8 @@ public abstract class SymmetryMirror { } public static List getMirrors() { - return ImmutableList.of(Lang.translateDirect("symmetry.mirror.plane"), Lang.translateDirect("symmetry.mirror.doublePlane"), - Lang.translateDirect("symmetry.mirror.triplePlane")); + return ImmutableList.of(CreateLang.translateDirect("symmetry.mirror.plane"), CreateLang.translateDirect("symmetry.mirror.doublePlane"), + CreateLang.translateDirect("symmetry.mirror.triplePlane")); } public StringRepresentable getOrientation() { diff --git a/src/main/java/com/simibubi/create/content/curiosities/symmetry/mirror/TriplePlaneMirror.java b/src/main/java/com/simibubi/create/content/curiosities/symmetry/mirror/TriplePlaneMirror.java index a0d9a9a613..163863af08 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/symmetry/mirror/TriplePlaneMirror.java +++ b/src/main/java/com/simibubi/create/content/curiosities/symmetry/mirror/TriplePlaneMirror.java @@ -7,7 +7,7 @@ import java.util.Map; import com.google.common.collect.ImmutableList; import com.jozufozu.flywheel.core.PartialModel; import com.simibubi.create.AllBlockPartials; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; @@ -66,7 +66,7 @@ public class TriplePlaneMirror extends SymmetryMirror { @Override public List getAlignToolTips() { - return ImmutableList.of(Lang.translateDirect("orientation.horizontal")); + return ImmutableList.of(CreateLang.translateDirect("orientation.horizontal")); } } diff --git a/src/main/java/com/simibubi/create/content/curiosities/toolbox/RadialToolboxMenu.java b/src/main/java/com/simibubi/create/content/curiosities/toolbox/RadialToolboxMenu.java index 0bf111bec1..9ff5270cec 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/toolbox/RadialToolboxMenu.java +++ b/src/main/java/com/simibubi/create/content/curiosities/toolbox/RadialToolboxMenu.java @@ -13,15 +13,15 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllKeys; -import com.simibubi.create.foundation.gui.AbstractSimiScreen; import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllIcons; -import com.simibubi.create.foundation.gui.element.GuiGameElement; import com.simibubi.create.foundation.networking.AllPackets; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.gui.AbstractSimiScreen; +import net.createmod.catnip.gui.element.GuiGameElement; +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.ChatFormatting; import net.minecraft.client.KeyMapping; import net.minecraft.network.chat.Component; @@ -81,7 +81,7 @@ public class RadialToolboxMenu extends AbstractSimiScreen { if (state == State.DETACH) { - tip = Lang.translateDirect("toolbox.outOfRange"); + tip = CreateLang.translateDirect("toolbox.outOfRange"); if (hoveredX > -20 && hoveredX < 20 && hoveredY > -80 && hoveredY < -20) hoveredSlot = UNEQUIP; @@ -99,7 +99,7 @@ public class RadialToolboxMenu extends AbstractSimiScreen { ms.translate(0.5, -0.5, 0); if (!scrollMode && hoveredSlot == UNEQUIP) { AllGuiTextures.TOOLBELT_SLOT_HIGHLIGHT.render(ms, -13, -13, this); - tip = Lang.translateDirect("toolbox.detach") + tip = CreateLang.translateDirect("toolbox.detach") .withStyle(ChatFormatting.GOLD); } ms.popPose(); @@ -117,7 +117,7 @@ public class RadialToolboxMenu extends AbstractSimiScreen { ms.translate(0.5, -0.5, 0); if (!scrollMode && hoveredSlot == DEPOSIT) { AllGuiTextures.TOOLBELT_SLOT_HIGHLIGHT.render(ms, -13, -13, this); - tip = Lang.translateDirect(state == State.SELECT_BOX ? "toolbox.depositAll" : "toolbox.depositBox") + tip = CreateLang.translateDirect(state == State.SELECT_BOX ? "toolbox.depositAll" : "toolbox.depositBox") .withStyle(ChatFormatting.GOLD); } ms.popPose(); @@ -179,7 +179,7 @@ public class RadialToolboxMenu extends AbstractSimiScreen { (scrollMode ? AllIcons.I_REFRESH : AllIcons.I_FLIP).render(ms, -9, -9, this); if (!scrollMode && UNEQUIP == hoveredSlot) { AllGuiTextures.TOOLBELT_SLOT_HIGHLIGHT.render(ms, -13, -13, this); - tip = Lang.translateDirect("toolbox.unequip", minecraft.player.getMainHandItem() + tip = CreateLang.translateDirect("toolbox.unequip", minecraft.player.getMainHandItem() .getHoverName()) .withStyle(ChatFormatting.GOLD); } diff --git a/src/main/java/com/simibubi/create/content/curiosities/toolbox/ToolBoxInstance.java b/src/main/java/com/simibubi/create/content/curiosities/toolbox/ToolBoxInstance.java index aac661c5ed..d7bdcea9cd 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/toolbox/ToolBoxInstance.java +++ b/src/main/java/com/simibubi/create/content/curiosities/toolbox/ToolBoxInstance.java @@ -7,9 +7,9 @@ import com.jozufozu.flywheel.backend.instancing.blockentity.BlockEntityInstance; import com.jozufozu.flywheel.core.Materials; import com.jozufozu.flywheel.core.materials.model.ModelData; import com.simibubi.create.AllBlockPartials; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.Iterate; import net.minecraft.core.Direction; import net.minecraft.world.level.block.state.BlockState; diff --git a/src/main/java/com/simibubi/create/content/curiosities/toolbox/ToolboxHandler.java b/src/main/java/com/simibubi/create/content/curiosities/toolbox/ToolboxHandler.java index c7ec4aacc4..5dc5d971e4 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/toolbox/ToolboxHandler.java +++ b/src/main/java/com/simibubi/create/content/curiosities/toolbox/ToolboxHandler.java @@ -7,8 +7,8 @@ import java.util.stream.Collectors; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.networking.ISyncPersistentData.PersistentDataPacket; -import com.simibubi.create.foundation.utility.WorldAttached; +import net.createmod.catnip.utility.WorldAttached; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; diff --git a/src/main/java/com/simibubi/create/content/curiosities/toolbox/ToolboxHandlerClient.java b/src/main/java/com/simibubi/create/content/curiosities/toolbox/ToolboxHandlerClient.java index a4c61f2fc9..45c0bb3501 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/toolbox/ToolboxHandlerClient.java +++ b/src/main/java/com/simibubi/create/content/curiosities/toolbox/ToolboxHandlerClient.java @@ -13,9 +13,9 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllKeys; import com.simibubi.create.foundation.gui.AllGuiTextures; -import com.simibubi.create.foundation.gui.ScreenOpener; import com.simibubi.create.foundation.networking.AllPackets; +import net.createmod.catnip.gui.ScreenOpener; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/simibubi/create/content/curiosities/toolbox/ToolboxInventory.java b/src/main/java/com/simibubi/create/content/curiosities/toolbox/ToolboxInventory.java index 1d35771c3d..e6b6a94e05 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/toolbox/ToolboxInventory.java +++ b/src/main/java/com/simibubi/create/content/curiosities/toolbox/ToolboxInventory.java @@ -7,8 +7,8 @@ import java.util.function.Consumer; import javax.annotation.Nonnull; import com.simibubi.create.AllItems; -import com.simibubi.create.foundation.utility.NBTHelper; +import net.createmod.catnip.utility.NBTHelper; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; import net.minecraft.world.item.ItemStack; diff --git a/src/main/java/com/simibubi/create/content/curiosities/toolbox/ToolboxRenderer.java b/src/main/java/com/simibubi/create/content/curiosities/toolbox/ToolboxRenderer.java index 86912a6524..d8e20592ac 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/toolbox/ToolboxRenderer.java +++ b/src/main/java/com/simibubi/create/content/curiosities/toolbox/ToolboxRenderer.java @@ -6,8 +6,8 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRenderer; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Iterate; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; diff --git a/src/main/java/com/simibubi/create/content/curiosities/toolbox/ToolboxScreen.java b/src/main/java/com/simibubi/create/content/curiosities/toolbox/ToolboxScreen.java index 13110e32b4..9969f4f3de 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/toolbox/ToolboxScreen.java +++ b/src/main/java/com/simibubi/create/content/curiosities/toolbox/ToolboxScreen.java @@ -12,12 +12,13 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.container.AbstractSimiContainerScreen; -import com.simibubi.create.foundation.gui.element.GuiGameElement; +import com.simibubi.create.foundation.gui.element.PartialModelGuiElement; import com.simibubi.create.foundation.gui.widget.IconButton; import com.simibubi.create.foundation.networking.AllPackets; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.gui.element.GuiGameElement; +import net.createmod.catnip.utility.Iterate; import net.minecraft.client.renderer.Rect2i; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Inventory; @@ -44,13 +45,13 @@ public class ToolboxScreen extends AbstractSimiContainerScreen @Override protected void init() { - setWindowSize(30 + BG.width, BG.height + PLAYER.height - 24); + setWindowSize(30 + BG.getWidth(), BG.getHeight() + PLAYER.getHeight() - 24); setWindowOffset(-11, 0); super.init(); color = menu.contentHolder.getColor(); - confirmButton = new IconButton(leftPos + 30 + BG.width - 33, topPos + BG.height - 24, AllIcons.I_CONFIRM); + confirmButton = new IconButton(leftPos + 30 + BG.getWidth() - 33, topPos + BG.getHeight() - 24, AllIcons.I_CONFIRM); confirmButton.withCallback(() -> { minecraft.player.closeContainer(); }); @@ -60,11 +61,11 @@ public class ToolboxScreen extends AbstractSimiContainerScreen disposeButton.withCallback(() -> { AllPackets.channel.sendToServer(new ToolboxDisposeAllPacket(menu.contentHolder.getBlockPos())); }); - disposeButton.setToolTip(Lang.translateDirect("toolbox.depositBox")); + disposeButton.setToolTip(CreateLang.translateDirect("toolbox.depositBox")); addRenderableWidget(disposeButton); extraAreas = ImmutableList.of( - new Rect2i(leftPos + 30 + BG.width, topPos + BG.height - 15 - 34 - 6, 72, 68) + new Rect2i(leftPos + 30 + BG.getWidth(), topPos + BG.getHeight() - 15 - 34 - 6, 72, 68) ); } @@ -77,17 +78,17 @@ public class ToolboxScreen extends AbstractSimiContainerScreen @Override protected void renderBg(PoseStack ms, float partialTicks, int mouseX, int mouseY) { - int x = leftPos + imageWidth - BG.width; + int x = leftPos + imageWidth - BG.getWidth(); int y = topPos; BG.render(ms, x, y, this); font.draw(ms, title, x + 15, y + 4, 0x442000); int invX = leftPos; - int invY = topPos + imageHeight - PLAYER.height; + int invY = topPos + imageHeight - PLAYER.getHeight(); renderPlayerInventory(ms, invX, invY); - renderToolbox(ms, x + BG.width + 50, y + BG.height + 12, partialTicks); + renderToolbox(ms, x + BG.getWidth() + 50, y + BG.getHeight() + 12, partialTicks); hoveredToolboxSlot = null; for (int compartment = 0; compartment < 8; compartment++) { @@ -141,7 +142,7 @@ public class ToolboxScreen extends AbstractSimiContainerScreen .translate(0, -6 / 16f, 12 / 16f) .rotateX(-105 * menu.contentHolder.lid.getValue(partialTicks)) .translate(0, 6 / 16f, -12 / 16f); - GuiGameElement.of(AllBlockPartials.TOOLBOX_LIDS.get(color)) + PartialModelGuiElement.of(AllBlockPartials.TOOLBOX_LIDS.get(color)) .render(ms); ms.popPose(); @@ -149,7 +150,7 @@ public class ToolboxScreen extends AbstractSimiContainerScreen ms.pushPose(); ms.translate(0, -offset * 1 / 8f, menu.contentHolder.drawers.getValue(partialTicks) * -.175f * (2 - offset)); - GuiGameElement.of(AllBlockPartials.TOOLBOX_DRAWER) + PartialModelGuiElement.of(AllBlockPartials.TOOLBOX_DRAWER) .render(ms); ms.popPose(); } diff --git a/src/main/java/com/simibubi/create/content/curiosities/toolbox/ToolboxTileEntity.java b/src/main/java/com/simibubi/create/content/curiosities/toolbox/ToolboxTileEntity.java index a44225964c..5a1fa9f2b1 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/toolbox/ToolboxTileEntity.java +++ b/src/main/java/com/simibubi/create/content/curiosities/toolbox/ToolboxTileEntity.java @@ -14,10 +14,10 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.utility.ResetableLazy; -import com.simibubi.create.foundation.utility.VecHelper; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; -import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintEntity.java b/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintEntity.java index fafa00debb..506a89d92a 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintEntity.java +++ b/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintEntity.java @@ -17,10 +17,10 @@ import com.simibubi.create.content.schematics.ISpecialEntityItemRequirement; import com.simibubi.create.content.schematics.ItemRequirement; import com.simibubi.create.content.schematics.ItemRequirement.ItemUseType; import com.simibubi.create.foundation.networking.ISyncPersistentData; -import com.simibubi.create.foundation.utility.Couple; import com.simibubi.create.foundation.utility.IInteractionChecker; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; 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 6889a801e9..e8d2386926 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 @@ -18,10 +18,11 @@ 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.track.TrackPlacement.PlacementInfo; import com.simibubi.create.foundation.gui.AllGuiTextures; -import com.simibubi.create.foundation.gui.element.GuiGameElement; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.Pair; +import net.createmod.catnip.gui.element.GuiGameElement; +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.Pair; +import net.createmod.ponder.utility.WorldTickHolder; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.nbt.CompoundTag; @@ -288,7 +289,7 @@ public class BlueprintOverlayRenderer { public static void drawItemStack(PoseStack ms, Minecraft mc, int x, int y, ItemStack itemStack, String count) { if (itemStack.getItem() instanceof FilterItem) { - int step = AnimationTickHolder.getTicks(mc.level) / 10; + int step = WorldTickHolder.getTicks(mc.level) / 10; ItemStack[] itemsMatchingFilter = getItemsMatchingFilter(itemStack); if (itemsMatchingFilter.length > 0) itemStack = itemsMatchingFilter[step % itemsMatchingFilter.length]; diff --git a/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintRenderer.java b/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintRenderer.java index 4b68a02cca..64813303cf 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintRenderer.java +++ b/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintRenderer.java @@ -8,8 +8,8 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.curiosities.tools.BlueprintEntity.BlueprintSection; import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.utility.Couple; +import net.createmod.catnip.utility.Couple; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.Sheets; diff --git a/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintScreen.java b/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintScreen.java index 3999c10dc0..09fedc9ff8 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintScreen.java +++ b/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintScreen.java @@ -14,11 +14,12 @@ import com.simibubi.create.content.logistics.item.filter.FilterScreenPacket.Opti import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.container.AbstractSimiContainerScreen; -import com.simibubi.create.foundation.gui.element.GuiGameElement; +import com.simibubi.create.foundation.gui.element.PartialModelGuiElement; import com.simibubi.create.foundation.gui.widget.IconButton; import com.simibubi.create.foundation.networking.AllPackets; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.gui.element.GuiGameElement; import net.minecraft.ChatFormatting; import net.minecraft.client.renderer.Rect2i; import net.minecraft.network.chat.Component; @@ -40,20 +41,20 @@ public class BlueprintScreen extends AbstractSimiContainerScreen { menu.clearContents(); contentsCleared(); menu.sendClearPacket(); }); - confirmButton = new IconButton(x + background.width - 33, y + background.height - 24, AllIcons.I_CONFIRM); + confirmButton = new IconButton(x + background.getWidth() - 33, y + background.getHeight() - 24, AllIcons.I_CONFIRM); confirmButton.withCallback(() -> { minecraft.player.closeContainer(); }); @@ -61,13 +62,13 @@ public class BlueprintScreen extends AbstractSimiContainerScreenat(x + background.width + 20, y + background.height - 32, 0) + PartialModelGuiElement.of(AllBlockPartials.CRAFTING_BLUEPRINT_1x1).at(x + background.getWidth() + 20, y + background.getHeight() - 32, 0) .rotate(45, -45, 22.5f) .scale(40) .render(ms); @@ -107,26 +108,26 @@ public class BlueprintScreen extends AbstractSimiContainerScreen filter = Predicates.alwaysFalse(); - + switch (pattern) { case Chance25: filter = pos -> r.nextBoolean() || r.nextBoolean(); @@ -56,7 +56,7 @@ public enum PlacementPatterns { default: break; } - + blocksIn.removeIf(filter); } diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperItem.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperItem.java index 43ddf5fe46..f913cdae93 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperItem.java @@ -9,8 +9,8 @@ import com.simibubi.create.AllTags.AllBlockTags; import com.simibubi.create.CreateClient; import com.simibubi.create.foundation.item.ItemDescription; import com.simibubi.create.foundation.utility.BlockHelper; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.NBTHelper; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.NBTHelper; import com.simibubi.create.foundation.utility.NBTProcessors; import net.minecraft.ChatFormatting; @@ -59,7 +59,7 @@ public abstract class ZapperItem extends Item { .getBlock() .getName(); ItemDescription.add(tooltip, - Lang.translateDirect("terrainzapper.usingBlock", + CreateLang.translateDirect("terrainzapper.usingBlock", usedBlock.withStyle(ChatFormatting.GRAY)) .withStyle(ChatFormatting.DARK_GRAY)); } @@ -180,7 +180,7 @@ public abstract class ZapperItem extends Item { public Component validateUsage(ItemStack item) { CompoundTag tag = item.getOrCreateTag(); if (!canActivateWithoutSelectedBlock(item) && !tag.contains("BlockUsed")) - return Lang.translateDirect("terrainzapper.leftClickToSet"); + return CreateLang.translateDirect("terrainzapper.leftClickToSet"); return null; } diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperRenderHandler.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperRenderHandler.java index 9028abdaa8..6984825791 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperRenderHandler.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperRenderHandler.java @@ -8,8 +8,8 @@ import java.util.function.Supplier; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Vector3f; import com.simibubi.create.AllSoundEvents; -import com.simibubi.create.CreateClient; +import net.createmod.catnip.CatnipClient; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.core.particles.ParticleTypes; @@ -38,7 +38,7 @@ public class ZapperRenderHandler extends ShootableGadgetRenderHandler { return; cachedBeams.forEach(beam -> { - CreateClient.OUTLINER.endChasingLine(beam, beam.start, beam.end, 1 - beam.itensity, false) + CatnipClient.OUTLINER.endChasingLine(beam, beam.start, beam.end, 1 - beam.itensity, false) .disableNormals() .colored(0xffffff) .lineWidth(beam.itensity * 1 / 8f); diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperScreen.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperScreen.java index 6328eaaa72..bb4edd234c 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperScreen.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperScreen.java @@ -4,15 +4,15 @@ import java.util.Vector; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Vector3f; -import com.simibubi.create.foundation.gui.AbstractSimiScreen; import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllIcons; -import com.simibubi.create.foundation.gui.element.GuiGameElement; import com.simibubi.create.foundation.gui.widget.IconButton; import com.simibubi.create.foundation.networking.AllPackets; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.NBTHelper; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.gui.AbstractSimiScreen; +import net.createmod.catnip.gui.element.GuiGameElement; +import net.createmod.catnip.utility.NBTHelper; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; import net.minecraft.network.chat.Component; @@ -24,7 +24,7 @@ import net.minecraft.world.level.block.state.BlockState; public abstract class ZapperScreen extends AbstractSimiScreen { - protected final Component patternSection = Lang.translateDirect("gui.terrainzapper.patternSection"); + protected final Component patternSection = CreateLang.translateDirect("gui.terrainzapper.patternSection"); protected AllGuiTextures background; protected ItemStack zapper; @@ -54,7 +54,7 @@ public abstract class ZapperScreen extends AbstractSimiScreen { @Override protected void init() { - setWindowSize(background.width, background.height); + setWindowSize(background.getWidth(), background.getHeight()); setWindowOffset(-10, 0); super.init(); @@ -64,7 +64,7 @@ public abstract class ZapperScreen extends AbstractSimiScreen { int y = guiTop; confirmButton = - new IconButton(x + background.width - 33, y + background.height - 24, AllIcons.I_CONFIRM); + new IconButton(x + background.getWidth() - 33, y + background.getHeight() - 24, AllIcons.I_CONFIRM); confirmButton.withCallback(() -> { onClose(); }); @@ -75,13 +75,13 @@ public abstract class ZapperScreen extends AbstractSimiScreen { for (int col = 0; col <= 2; col++) { int id = patternButtons.size(); PlacementPatterns pattern = PlacementPatterns.values()[id]; - IconButton patternButton = new IconButton(x + background.width - 76 + col * 18, y + 21 + row * 18, pattern.icon); + IconButton patternButton = new IconButton(x + background.getWidth() - 76 + col * 18, y + 21 + row * 18, pattern.icon); patternButton.withCallback(() -> { patternButtons.forEach(b -> b.active = true); patternButton.active = false; currentPattern = pattern; }); - patternButton.setToolTip(Lang.translateDirect("gui.terrainzapper.pattern." + pattern.translationKey)); + patternButton.setToolTip(CreateLang.translateDirect("gui.terrainzapper.pattern." + pattern.translationKey)); patternButtons.add(patternButton); } } @@ -123,7 +123,7 @@ public abstract class ZapperScreen extends AbstractSimiScreen { protected void renderZapper(PoseStack ms, int x, int y) { GuiGameElement.of(zapper) .scale(4) - .at(x + background.width, y + background.height - 48, -200) + .at(x + background.getWidth(), y + background.getHeight() - 48, -200) .render(ms); } diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/Brush.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/Brush.java index 4b1123d170..1953dd6cc7 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/Brush.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/Brush.java @@ -2,7 +2,7 @@ package com.simibubi.create.content.curiosities.zapper.terrainzapper; import java.util.Collection; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -30,7 +30,7 @@ public abstract class Brush { public TerrainTools[] getSupportedTools() { return TerrainTools.values(); } - + public TerrainTools redirectTool(TerrainTools tool) { return tool; } @@ -52,7 +52,7 @@ public abstract class Brush { } Component getParamLabel(int paramIndex) { - return Lang + return CreateLang .translateDirect(paramIndex == 0 ? "generic.width" : paramIndex == 1 ? "generic.height" : "generic.length"); } diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/CylinderBrush.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/CylinderBrush.java index e468a11f54..1b9d2d9ccc 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/CylinderBrush.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/CylinderBrush.java @@ -8,9 +8,9 @@ import java.util.stream.Collectors; import org.apache.commons.lang3.tuple.Pair; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.VecHelper; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.AxisDirection; @@ -74,7 +74,7 @@ public class CylinderBrush extends ShapedBrush { @Override Component getParamLabel(int paramIndex) { - return paramIndex == 0 ? Lang.translateDirect("generic.radius") : super.getParamLabel(paramIndex); + return paramIndex == 0 ? CreateLang.translateDirect("generic.radius") : super.getParamLabel(paramIndex); } @Override diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/DynamicBrush.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/DynamicBrush.java index 976376488d..f9fda83654 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/DynamicBrush.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/DynamicBrush.java @@ -7,7 +7,7 @@ import java.util.List; import java.util.Set; import com.simibubi.create.foundation.utility.BlockHelper; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -27,7 +27,7 @@ public class DynamicBrush extends Brush { } Component getParamLabel(int paramIndex) { - return Lang.translateDirect("generic.range"); + return CreateLang.translateDirect("generic.range"); } @Override diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/PlacementOptions.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/PlacementOptions.java index 9861b25055..8f096363d5 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/PlacementOptions.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/PlacementOptions.java @@ -1,7 +1,8 @@ package com.simibubi.create.content.curiosities.zapper.terrainzapper; import com.simibubi.create.foundation.gui.AllIcons; -import com.simibubi.create.foundation.utility.Lang; + +import net.createmod.catnip.utility.lang.Lang; public enum PlacementOptions { diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/SphereBrush.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/SphereBrush.java index 4fcfa3b9e7..c0531d4785 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/SphereBrush.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/SphereBrush.java @@ -5,9 +5,9 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.VecHelper; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; @@ -51,7 +51,7 @@ public class SphereBrush extends ShapedBrush { @Override Component getParamLabel(int paramIndex) { - return Lang.translateDirect("generic.radius"); + return CreateLang.translateDirect("generic.radius"); } @Override diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/TerrainTools.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/TerrainTools.java index 79e6fe2be3..258485d338 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/TerrainTools.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/TerrainTools.java @@ -6,8 +6,8 @@ import javax.annotation.Nullable; import com.simibubi.create.content.curiosities.zapper.ZapperItem; import com.simibubi.create.foundation.gui.AllIcons; -import com.simibubi.create.foundation.utility.Lang; +import net.createmod.catnip.utility.lang.Lang; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; @@ -26,7 +26,7 @@ public enum TerrainTools { Flatten(AllIcons.I_FLATTEN), ; - + public String translationKey; public AllIcons icon; diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperItem.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperItem.java index ddc4901f83..5084407f8d 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperItem.java @@ -6,11 +6,11 @@ import java.util.function.Consumer; import com.simibubi.create.content.curiosities.zapper.PlacementPatterns; import com.simibubi.create.content.curiosities.zapper.ZapperItem; -import com.simibubi.create.foundation.gui.ScreenOpener; import com.simibubi.create.foundation.item.render.SimpleCustomRenderer; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.NBTHelper; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.gui.ScreenOpener; +import net.createmod.catnip.utility.NBTHelper; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; @@ -51,7 +51,7 @@ public class WorldshaperItem extends ZapperItem { public Component validateUsage(ItemStack item) { if (!item.getOrCreateTag() .contains("BrushParams")) - return Lang.translateDirect("terrainzapper.shiftRightClickToSet"); + return CreateLang.translateDirect("terrainzapper.shiftRightClickToSet"); return super.validateUsage(item); } diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperItemRenderer.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperItemRenderer.java index a163d209ca..c7facd63f2 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperItemRenderer.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperItemRenderer.java @@ -6,7 +6,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Vector3f; import com.simibubi.create.content.curiosities.zapper.ZapperItemRenderer; import com.simibubi.create.foundation.item.render.PartialItemModelRenderer; -import com.simibubi.create.foundation.utility.AnimationTickHolder; +import net.createmod.catnip.utility.AnimationTickHolder; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; @@ -38,7 +38,7 @@ public class WorldshaperItemRenderer extends ZapperItemRenderer brushOptions = - Lang.translatedOptions("gui.terrainzapper.brush", "cuboid", "sphere", "cylinder", "surface", "cluster"); + CreateLang.translatedOptions("gui.terrainzapper.brush", "cuboid", "sphere", "cylinder", "surface", "cluster"); protected Vector toolButtons; protected Vector placementButtons; @@ -84,7 +84,7 @@ public class WorldshaperScreen extends ZapperScreen { brushLabel = new Label(x + 61, y + 25, TextComponent.EMPTY).withShadow(); brushInput = new SelectionScrollInput(x + 56, y + 20, 77, 18).forOptions(brushOptions) - .titled(Lang.translateDirect("gui.terrainzapper.brush")) + .titled(CreateLang.translateDirect("gui.terrainzapper.brush")) .writingTo(brushLabel) .calling(brushIndex -> { currentBrush = TerrainBrushes.values()[brushIndex]; @@ -165,12 +165,12 @@ public class WorldshaperScreen extends ZapperScreen { followDiagonalsIndicator.state = followDiagonalsIndicator.state == State.OFF ? State.ON : State.OFF; currentFollowDiagonals = !currentFollowDiagonals; }); - followDiagonals.setToolTip(Lang.translateDirect("gui.terrainzapper.searchDiagonal")); + followDiagonals.setToolTip(CreateLang.translateDirect("gui.terrainzapper.searchDiagonal")); acrossMaterials.withCallback(() -> { acrossMaterialsIndicator.state = acrossMaterialsIndicator.state == State.OFF ? State.ON : State.OFF; currentAcrossMaterials = !currentAcrossMaterials; }); - acrossMaterials.setToolTip(Lang.translateDirect("gui.terrainzapper.searchFuzzy")); + acrossMaterials.setToolTip(CreateLang.translateDirect("gui.terrainzapper.searchFuzzy")); addRenderableWidget(followDiagonals); addRenderableWidget(followDiagonalsIndicator); addRenderableWidget(acrossMaterials); @@ -196,7 +196,7 @@ public class WorldshaperScreen extends ZapperScreen { toolButton.active = false; currentTool = tool; }); - toolButton.setToolTip(Lang.translateDirect("gui.terrainzapper.tool." + tool.translationKey)); + toolButton.setToolTip(CreateLang.translateDirect("gui.terrainzapper.tool." + tool.translationKey)); toolButtons.add(toolButton); } @@ -228,7 +228,7 @@ public class WorldshaperScreen extends ZapperScreen { placementButton.active = false; currentPlacement = option; }); - placementButton.setToolTip(Lang.translateDirect("gui.terrainzapper.placement." + option.translationKey)); + placementButton.setToolTip(CreateLang.translateDirect("gui.terrainzapper.placement." + option.translationKey)); placementButtons.add(placementButton); } diff --git a/src/main/java/com/simibubi/create/content/logistics/IRedstoneLinkable.java b/src/main/java/com/simibubi/create/content/logistics/IRedstoneLinkable.java index 1fa782796a..dc1ffbd161 100644 --- a/src/main/java/com/simibubi/create/content/logistics/IRedstoneLinkable.java +++ b/src/main/java/com/simibubi/create/content/logistics/IRedstoneLinkable.java @@ -1,22 +1,22 @@ package com.simibubi.create.content.logistics; import com.simibubi.create.content.logistics.RedstoneLinkNetworkHandler.Frequency; -import com.simibubi.create.foundation.utility.Couple; +import net.createmod.catnip.utility.Couple; import net.minecraft.core.BlockPos; public interface IRedstoneLinkable { public int getTransmittedStrength(); - + public void setReceivedStrength(int power); - + public boolean isListening(); - + public boolean isAlive(); - + public Couple getNetworkKey(); - + public BlockPos getLocation(); - + } diff --git a/src/main/java/com/simibubi/create/content/logistics/RedstoneLinkNetworkHandler.java b/src/main/java/com/simibubi/create/content/logistics/RedstoneLinkNetworkHandler.java index 019b6de478..f553bfd2f5 100644 --- a/src/main/java/com/simibubi/create/content/logistics/RedstoneLinkNetworkHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/RedstoneLinkNetworkHandler.java @@ -11,9 +11,9 @@ import java.util.concurrent.atomic.AtomicInteger; import com.simibubi.create.Create; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.tileEntity.behaviour.linked.LinkBehaviour; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.WorldHelper; +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.WorldHelper; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelBlock.java index 0d5ea76a47..616f83a801 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelBlock.java @@ -9,9 +9,9 @@ import com.simibubi.create.content.logistics.block.funnel.BeltFunnelBlock; import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.worldWrappers.WrappedWorld; +import net.createmod.catnip.utility.lang.Lang; +import net.createmod.catnip.utility.worldWrappers.WrappedWorld; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelInstance.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelInstance.java index 67d5d7c002..f5ef5a0edf 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelInstance.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelInstance.java @@ -13,9 +13,9 @@ import com.jozufozu.flywheel.backend.instancing.blockentity.BlockEntityInstance; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.logistics.block.flap.FlapData; import com.simibubi.create.foundation.render.AllMaterialSpecs; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.animation.LerpedFloat; import net.minecraft.core.Direction; import net.minecraft.world.level.LightLayer; @@ -77,7 +77,7 @@ public class BeltTunnelInstance extends BlockEntityInstance { LerpedFloat lerpedFloat = blockEntity.flaps.get(direction); - if (lerpedFloat == null) + if (lerpedFloat == null) return; float flapness = lerpedFloat.getValue(AnimationTickHolder.getPartialTicks()); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelRenderer.java index fbf9195961..e8b94dddcc 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelRenderer.java @@ -8,10 +8,10 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRenderer; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelShapes.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelShapes.java index f7e359aec7..5bbcedcb2a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelShapes.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelShapes.java @@ -2,8 +2,7 @@ package com.simibubi.create.content.logistics.block.belts.tunnel; import static net.minecraft.world.level.block.Block.box; -import com.simibubi.create.foundation.utility.VoxelShaper; - +import net.createmod.catnip.utility.VoxelShaper; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; import net.minecraft.world.level.block.state.BlockState; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelTileEntity.java index 3541b7c1d5..bb61ca4582 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelTileEntity.java @@ -17,10 +17,10 @@ import com.simibubi.create.content.logistics.packet.TunnelFlapPacket; import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; -import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelFilterSlot.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelFilterSlot.java index 66c9aa1d9b..4ce492fcc9 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelFilterSlot.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelFilterSlot.java @@ -1,8 +1,8 @@ package com.simibubi.create.content.logistics.block.belts.tunnel; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.world.phys.Vec3; public class BrassTunnelFilterSlot extends ValueBoxTransform.Sided { diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelTileEntity.java index 6651acef17..7a9e91127b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelTileEntity.java @@ -26,11 +26,12 @@ import com.simibubi.create.foundation.tileEntity.behaviour.filtering.SidedFilter import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.INamedIconOptions; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollOptionBehaviour; import com.simibubi.create.foundation.utility.BlockHelper; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.NBTHelper; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.utility.lang.Lang; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -91,7 +92,7 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity implements IHave public void addBehaviours(List behaviours) { super.addBehaviours(behaviours); behaviours.add(selectionMode = new ScrollOptionBehaviour<>(SelectionMode.class, - Lang.translateDirect("logistics.when_multiple_outputs_available"), this, + CreateLang.translateDirect("logistics.when_multiple_outputs_available"), this, new CenteredSideValueBoxTransform((state, d) -> d == Direction.UP))); selectionMode.requiresWrench(); @@ -746,20 +747,20 @@ public class BrassTunnelTileEntity extends BeltTunnelTileEntity implements IHave List allStacks = grabAllStacksOfGroup(true); if (allStacks.isEmpty()) return false; - + tooltip.add(componentSpacing.plainCopy() - .append(Lang.translateDirect("tooltip.brass_tunnel.contains")) + .append(CreateLang.translateDirect("tooltip.brass_tunnel.contains")) .withStyle(ChatFormatting.WHITE)); for (ItemStack item : allStacks) { tooltip.add(componentSpacing.plainCopy() - .append(Lang.translateDirect("tooltip.brass_tunnel.contains_entry", new TranslatableComponent(item.getDescriptionId()) + .append(CreateLang.translateDirect("tooltip.brass_tunnel.contains_entry", new TranslatableComponent(item.getDescriptionId()) .getString(), item.getCount())) .withStyle(ChatFormatting.GRAY)); } tooltip.add(componentSpacing.plainCopy() - .append(Lang.translateDirect("tooltip.brass_tunnel.retrieve")) + .append(CreateLang.translateDirect("tooltip.brass_tunnel.retrieve")) .withStyle(ChatFormatting.DARK_GRAY)); - + return true; } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/chute/AbstractChuteBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/chute/AbstractChuteBlock.java index 9bf371d8c5..1fa2d1af34 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/chute/AbstractChuteBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/chute/AbstractChuteBlock.java @@ -11,8 +11,8 @@ import com.simibubi.create.foundation.block.render.ReducedDestroyEffects; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.InteractionHand; @@ -40,7 +40,7 @@ public abstract class AbstractChuteBlock extends Block implements IWrenchable, I public AbstractChuteBlock(Properties p_i48440_1_) { super(p_i48440_1_); } - + @OnlyIn(Dist.CLIENT) public void initializeClient(Consumer consumer) { consumer.accept(new ReducedDestroyEffects()); @@ -80,7 +80,7 @@ public abstract class AbstractChuteBlock extends Block implements IWrenchable, I super.setPlacedBy(pLevel, pPos, pState, pPlacer, pStack); AdvancementBehaviour.setPlacedBy(pLevel, pPos, pPlacer); } - + @Override public void updateEntityAfterFallOn(BlockGetter worldIn, Entity entityIn) { super.updateEntityAfterFallOn(worldIn, entityIn); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteBlock.java index df7f411d3c..15b02e528e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteBlock.java @@ -5,9 +5,9 @@ import java.util.Map; import com.simibubi.create.AllTileEntities; import com.simibubi.create.content.logistics.block.funnel.FunnelBlock; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.Lang; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.lang.Lang; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.util.StringRepresentable; @@ -28,7 +28,7 @@ import net.minecraft.world.level.block.state.properties.Property; import net.minecraft.world.level.pathfinder.PathComputationType; public class ChuteBlock extends AbstractChuteBlock { - + public static final Property SHAPE = EnumProperty.create("shape", Shape.class); public static final DirectionProperty FACING = BlockStateProperties.FACING_HOPPER; @@ -141,12 +141,12 @@ public class ChuteBlock extends AbstractChuteBlock { return state.setValue(SHAPE, Shape.NORMAL); return state.setValue(SHAPE, Shape.INTERSECTION); } - + @Override public boolean isPathfindable(BlockState state, BlockGetter reader, BlockPos pos, PathComputationType type) { return false; } - + @Override public BlockEntityType getTileEntityType() { return AllTileEntities.CHUTE.get(); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteTileEntity.java index b24733582d..f1694170a4 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteTileEntity.java @@ -25,11 +25,11 @@ import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputB import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour.TransportedResult; import com.simibubi.create.foundation.utility.BlockHelper; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.VecHelper; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.animation.LerpedFloat; import net.minecraft.ChatFormatting; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; @@ -700,26 +700,26 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor public boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking) { boolean downward = getItemMotion() < 0; tooltip.add(componentSpacing.plainCopy() - .append(Lang.translateDirect("tooltip.chute.header"))); + .append(CreateLang.translateDirect("tooltip.chute.header"))); if (pull == 0 && push == 0) tooltip.add(componentSpacing.plainCopy() - .append(Lang.translateDirect("tooltip.chute.no_fans_attached")) + .append(CreateLang.translateDirect("tooltip.chute.no_fans_attached")) .withStyle(ChatFormatting.GRAY)); if (pull != 0) tooltip.add(componentSpacing.plainCopy() - .append(Lang.translateDirect("tooltip.chute.fans_" + (pull > 0 ? "pull_up" : "push_down")) + .append(CreateLang.translateDirect("tooltip.chute.fans_" + (pull > 0 ? "pull_up" : "push_down")) .withStyle(ChatFormatting.GRAY))); if (push != 0) tooltip.add(componentSpacing.plainCopy() - .append(Lang.translateDirect("tooltip.chute.fans_" + (push > 0 ? "push_up" : "pull_down")) + .append(CreateLang.translateDirect("tooltip.chute.fans_" + (push > 0 ? "push_up" : "pull_down")) .withStyle(ChatFormatting.GRAY))); tooltip.add(componentSpacing.plainCopy() .append("-> ") - .append(Lang.translateDirect("tooltip.chute.items_move_" + (downward ? "down" : "up")) + .append(CreateLang.translateDirect("tooltip.chute.items_move_" + (downward ? "down" : "up")) .withStyle(ChatFormatting.YELLOW))); if (!item.isEmpty()) { tooltip.add(componentSpacing.plainCopy() - .append(Lang.translateDirect("tooltip.chute.contains", new TranslatableComponent(item.getDescriptionId()) + .append(CreateLang.translateDirect("tooltip.chute.contains", new TranslatableComponent(item.getDescriptionId()) .getString(), item.getCount())) .withStyle(ChatFormatting.GREEN)); } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/chute/SmartChuteFilterSlotPositioning.java b/src/main/java/com/simibubi/create/content/logistics/block/chute/SmartChuteFilterSlotPositioning.java index c28d77587c..7f79810c03 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/chute/SmartChuteFilterSlotPositioning.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/chute/SmartChuteFilterSlotPositioning.java @@ -1,8 +1,8 @@ package com.simibubi.create.content.logistics.block.chute; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotBehaviour.java index 84a16e8d52..7f0e65d7e5 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotBehaviour.java @@ -21,9 +21,9 @@ import com.simibubi.create.foundation.tileEntity.behaviour.belt.BeltProcessingBe import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour.TransportedResult; -import com.simibubi.create.foundation.utility.NBTHelper; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; @@ -77,12 +77,12 @@ public class DepotBehaviour extends TileEntityBehaviour { public void enableMerging() { allowMerge = true; } - + public DepotBehaviour withCallback(Consumer changeListener) { onHeldInserted = changeListener; return this; } - + public DepotBehaviour onlyAccepts(Predicate filter) { acceptedItems = filter; return this; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotRenderer.java index 9822137571..1646ee2e47 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotRenderer.java @@ -9,8 +9,8 @@ import com.simibubi.create.content.contraptions.relays.belt.BeltHelper; import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.block.model.ItemTransforms.TransformType; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorBlock.java index 875d6462cb..ed026a63d9 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorBlock.java @@ -10,8 +10,8 @@ import com.simibubi.create.content.contraptions.base.HorizontalKineticBlock; import com.simibubi.create.content.logistics.block.depot.EjectorTileEntity.State; import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.networking.AllPackets; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorInstance.java b/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorInstance.java index 1a37a11410..d90c269d64 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorInstance.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorInstance.java @@ -5,8 +5,8 @@ import com.jozufozu.flywheel.api.instance.DynamicInstance; import com.jozufozu.flywheel.core.materials.model.ModelData; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.relays.encased.ShaftInstance; -import com.simibubi.create.foundation.utility.AnimationTickHolder; +import net.createmod.catnip.utility.AnimationTickHolder; import net.minecraft.util.Mth; public class EjectorInstance extends ShaftInstance implements DynamicInstance { diff --git a/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorRenderer.java index 9a60342e8a..900d364ecf 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorRenderer.java @@ -11,10 +11,10 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.IntAttached; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.IntAttached; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorTargetHandler.java b/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorTargetHandler.java index fd08082eeb..a3c2075bef 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorTargetHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorTargetHandler.java @@ -3,14 +3,14 @@ package com.simibubi.create.content.logistics.block.depot; import com.mojang.math.Vector3f; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; -import com.simibubi.create.CreateClient; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.networking.AllPackets; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.Color; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.VecHelper; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.CatnipClient; +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.theme.Color; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; @@ -59,7 +59,7 @@ public class EjectorTargetHandler { String key = "weighted_ejector.target_set"; ChatFormatting colour = ChatFormatting.GOLD; - player.displayClientMessage(Lang.translateDirect(key) + player.displayClientMessage(CreateLang.translateDirect(key) .withStyle(colour), true); currentSelection = pos; launcher = null; @@ -101,7 +101,7 @@ public class EjectorTargetHandler { Direction validTargetDirection = getValidTargetDirection(pos); if (validTargetDirection == null) { - player.displayClientMessage(Lang.translateDirect(key) + player.displayClientMessage(CreateLang.translateDirect(key) .withStyle(colour), true); currentItem = null; currentSelection = null; @@ -112,7 +112,7 @@ public class EjectorTargetHandler { colour = ChatFormatting.GREEN; player.displayClientMessage( - Lang.translateDirect(key, currentSelection.getX(), currentSelection.getY(), currentSelection.getZ()) + CreateLang.translateDirect(key, currentSelection.getX(), currentSelection.getY(), currentSelection.getZ()) .withStyle(colour), true); @@ -213,7 +213,7 @@ public class EjectorTargetHandler { ClientLevel world = mc.level; AABB bb = new AABB(0, 0, 0, 1, 0, 1).move(currentSelection.offset(-validX, -yDiff, -validZ)); - CreateClient.OUTLINER.chaseAABB("valid", bb) + CatnipClient.OUTLINER.chaseAABB("valid", bb) .colored(intColor) .lineWidth(1 / 16f); @@ -263,7 +263,7 @@ public class EjectorTargetHandler { BlockState state = world.getBlockState(pos); VoxelShape shape = state.getShape(world, pos); AABB boundingBox = shape.isEmpty() ? new AABB(BlockPos.ZERO) : shape.bounds(); - CreateClient.OUTLINER.showAABB("target", boundingBox.move(pos)) + CatnipClient.OUTLINER.showAABB("target", boundingBox.move(pos)) .colored(0xffcb74) .lineWidth(1 / 16f); } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorTileEntity.java index d9946340c7..927c8421d7 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorTileEntity.java @@ -19,16 +19,16 @@ import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollValueBehaviour; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.IntAttached; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.NBTHelper; -import com.simibubi.create.foundation.utility.Pair; -import com.simibubi.create.foundation.utility.VecHelper; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; -import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.IntAttached; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -102,7 +102,7 @@ public class EjectorTileEntity extends KineticTileEntity { super.addBehaviours(behaviours); behaviours.add(depotBehaviour = new DepotBehaviour(this)); - maxStackSize = new ScrollValueBehaviour(Lang.translateDirect("weighted_ejector.stack_size"), this, new EjectorSlot()) + maxStackSize = new ScrollValueBehaviour(CreateLang.translateDirect("weighted_ejector.stack_size"), this, new EjectorSlot()) .between(0, 64) .withFormatter(i -> i == 0 ? "*" : String.valueOf(i)) .onlyActiveWhen(() -> state == State.CHARGED) diff --git a/src/main/java/com/simibubi/create/content/logistics/block/depot/EntityLauncher.java b/src/main/java/com/simibubi/create/content/logistics/block/depot/EntityLauncher.java index ac7101318a..87619fabf4 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/depot/EntityLauncher.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/depot/EntityLauncher.java @@ -1,8 +1,7 @@ package com.simibubi.create.content.logistics.block.depot; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.VecHelper; - +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -97,40 +96,40 @@ public class EntityLauncher { * Vertical Motion fv(x) = (x - 0.08) * 0.98 * (Gravity modification ignored) * > See LivingEntity.travel() - * + * ** n-th Iterative * (= given initial velocity x, motion after t ticks) * X'(x, t) = x * 0.91^t * Y'(x, t) = x * 0.98^t + ((0.98^t - 1) / (0.98 - 1)) * -0.0784 - * + * ** integral * (= given intial velocity x, location offset after t ticks) * X(x, t) = -10.6033x * (-1 + 0.91^t) * Y(x, t) = -49.4983x * 0.98^t + 49.4983x - 194.033 * 0.98^t - 3.92t + 194.033 - * + * ** argmax y * (= given initial y velocity, ticks at which y reaches top) * tPeak(x) = log(98 / (25x + 98)) / (2*log(7) - 2*log(5) - log(2)) - * + * ** max y * (= given initial y velocity, height offset at tPeak) * yPeak(x) = 889.636 + 49.4983x + 0.032928/(98 + 25x) + 194.033 * log(1/(98 + 25x)) - * + * ** yPeak inverse (Zelo's approximation) * (= given yPeak, initial y velocity required to reach it at max) * yMotion(h) = sqrt(2h/13) + 0.015h - * + * ** Y'(x, t) inverse (Simi's approximation) * (= given yTarget and initial y velocity, elapsed ticks when arc hits yTarget on its way down) * t*(x, v) = sqrt(yPeak(v) - x) * 4.87 + 0.115 * (yPeak(v) - x) + tPeak(v) - * + * ** xMotion * (= given t* and xTarget, initial x velocity such that X'(x, t*) = xTarget) * xMotion(t, x) = x / (-10.6033 * (-1 + 0.91^t)); - * + * ** xError * Interpolated correction function from observed inaccuracies in-game - * + * */ double xError = (-0.0007 * Math.pow(xTarget + .5, 2) + 0.484) diff --git a/src/main/java/com/simibubi/create/content/logistics/block/diodes/BrassDiodeInstance.java b/src/main/java/com/simibubi/create/content/logistics/block/diodes/BrassDiodeInstance.java index 450726b17a..331aec4159 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/diodes/BrassDiodeInstance.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/diodes/BrassDiodeInstance.java @@ -6,7 +6,8 @@ import com.jozufozu.flywheel.backend.instancing.blockentity.BlockEntityInstance; import com.jozufozu.flywheel.core.Materials; import com.jozufozu.flywheel.core.materials.model.ModelData; import com.simibubi.create.AllBlockPartials; -import com.simibubi.create.foundation.utility.Color; + +import net.createmod.catnip.utility.theme.Color; public class BrassDiodeInstance extends BlockEntityInstance implements TickableInstance { diff --git a/src/main/java/com/simibubi/create/content/logistics/block/diodes/BrassDiodeRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/diodes/BrassDiodeRenderer.java index f7cdaf99d5..828a1cf639 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/diodes/BrassDiodeRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/diodes/BrassDiodeRenderer.java @@ -4,8 +4,8 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.tileEntity.renderer.ColoredOverlayTileEntityRenderer; -import com.simibubi.create.foundation.utility.Color; +import net.createmod.catnip.utility.theme.Color; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; public class BrassDiodeRenderer extends ColoredOverlayTileEntityRenderer { diff --git a/src/main/java/com/simibubi/create/content/logistics/block/diodes/BrassDiodeScrollSlot.java b/src/main/java/com/simibubi/create/content/logistics/block/diodes/BrassDiodeScrollSlot.java index 540a0638a8..3cd3011472 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/diodes/BrassDiodeScrollSlot.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/diodes/BrassDiodeScrollSlot.java @@ -3,9 +3,9 @@ package com.simibubi.create.content.logistics.block.diodes; import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.phys.Vec3; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/diodes/BrassDiodeTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/diodes/BrassDiodeTileEntity.java index 0e08276e8f..28e2aec103 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/diodes/BrassDiodeTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/diodes/BrassDiodeTileEntity.java @@ -8,7 +8,7 @@ import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollValueBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollValueBehaviour.StepContext; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; @@ -29,7 +29,7 @@ public abstract class BrassDiodeTileEntity extends SmartTileEntity { @Override public void addBehaviours(List behaviours) { - maxState = new ScrollValueBehaviour(Lang.translateDirect("generic.delay"), this, new BrassDiodeScrollSlot()) + maxState = new ScrollValueBehaviour(CreateLang.translateDirect("generic.delay"), this, new BrassDiodeScrollSlot()) .between(2, 60 * 20 * 30); maxState.withStepFunction(this::step); maxState.withFormatter(this::format); @@ -98,10 +98,10 @@ public abstract class BrassDiodeTileEntity extends SmartTileEntity { private Component getUnit(int value) { if (value < 20) - return Lang.translateDirect("generic.unit.ticks"); + return CreateLang.translateDirect("generic.unit.ticks"); if (value < 20 * 60) - return Lang.translateDirect("generic.unit.seconds"); - return Lang.translateDirect("generic.unit.minutes"); + return CreateLang.translateDirect("generic.unit.seconds"); + return CreateLang.translateDirect("generic.unit.minutes"); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/display/DisplayLinkBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/display/DisplayLinkBlock.java index 85ae770fcc..78323e27f5 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/display/DisplayLinkBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/display/DisplayLinkBlock.java @@ -11,10 +11,10 @@ import com.simibubi.create.content.logistics.block.display.source.RedstonePowerD import com.simibubi.create.foundation.advancement.AdvancementBehaviour; import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.block.WrenchableDirectionalBlock; -import com.simibubi.create.foundation.gui.ScreenOpener; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.gui.ScreenOpener; +import net.createmod.catnip.utility.Iterate; import net.minecraft.client.player.LocalPlayer; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -57,7 +57,7 @@ public class DisplayLinkBlock extends WrenchableDirectionalBlock implements ITE< placed = placed.setValue(FACING, context.getClickedFace()); return placed.setValue(POWERED, shouldBePowered(placed, context.getLevel(), context.getClickedPos())); } - + @Override public void setPlacedBy(Level pLevel, BlockPos pPos, BlockState pState, LivingEntity pPlacer, ItemStack pStack) { super.setPlacedBy(pLevel, pPos, pState, pPlacer, pStack); @@ -151,7 +151,7 @@ public class DisplayLinkBlock extends WrenchableDirectionalBlock implements ITE< if (!(player instanceof LocalPlayer)) return; if (te.targetOffset.equals(BlockPos.ZERO)) { - player.displayClientMessage(Lang.translateDirect("display_link.invalid"), true); + player.displayClientMessage(CreateLang.translateDirect("display_link.invalid"), true); return; } ScreenOpener.open(new DisplayLinkScreen(te)); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/display/DisplayLinkBlockItem.java b/src/main/java/com/simibubi/create/content/logistics/block/display/DisplayLinkBlockItem.java index 7520f0de3e..134bc941b6 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/display/DisplayLinkBlockItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/display/DisplayLinkBlockItem.java @@ -1,11 +1,11 @@ package com.simibubi.create.content.logistics.block.display; import com.simibubi.create.AllBlocks; -import com.simibubi.create.CreateClient; import com.simibubi.create.content.logistics.block.display.target.DisplayTarget; import com.simibubi.create.foundation.config.AllConfigs; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.CatnipClient; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; @@ -60,7 +60,7 @@ public class DisplayLinkBlockItem extends BlockItem { if (player.isSteppingCarefully() && stack.hasTag()) { if (level.isClientSide) return InteractionResult.SUCCESS; - player.displayClientMessage(Lang.translateDirect("display_link.clear"), true); + player.displayClientMessage(CreateLang.translateDirect("display_link.clear"), true); stack.setTag(null); return InteractionResult.SUCCESS; } @@ -70,7 +70,7 @@ public class DisplayLinkBlockItem extends BlockItem { return InteractionResult.SUCCESS; CompoundTag stackTag = stack.getOrCreateTag(); stackTag.put("SelectedPos", NbtUtils.writeBlockPos(pos)); - player.displayClientMessage(Lang.translateDirect("display_link.set"), true); + player.displayClientMessage(CreateLang.translateDirect("display_link.set"), true); stack.setTag(stackTag); return InteractionResult.SUCCESS; } @@ -83,7 +83,7 @@ public class DisplayLinkBlockItem extends BlockItem { .isReplaceable() ? 0 : 1); if (!selectedPos.closerThan(placedPos, AllConfigs.SERVER.logistics.displayLinkRange.get())) { - player.displayClientMessage(Lang.translateDirect("display_link.too_far") + player.displayClientMessage(CreateLang.translateDirect("display_link.too_far") .withStyle(ChatFormatting.RED), true); return InteractionResult.FAIL; } @@ -98,7 +98,7 @@ public class DisplayLinkBlockItem extends BlockItem { ItemStack itemInHand = player.getItemInHand(pContext.getHand()); if (!itemInHand.isEmpty()) itemInHand.setTag(null); - player.displayClientMessage(Lang.translateDirect("display_link.success") + player.displayClientMessage(CreateLang.translateDirect("display_link.success") .withStyle(ChatFormatting.GREEN), true); return useOn; } @@ -127,7 +127,7 @@ public class DisplayLinkBlockItem extends BlockItem { lastShownPos = selectedPos; } - CreateClient.OUTLINER.showAABB("target", lastShownAABB) + CatnipClient.OUTLINER.showAABB("target", lastShownAABB) .colored(0xffcb74) .lineWidth(1 / 16f); } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/display/DisplayLinkRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/display/DisplayLinkRenderer.java index 3650b25544..2f80123bd3 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/display/DisplayLinkRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/display/DisplayLinkRenderer.java @@ -6,8 +6,8 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.render.RenderTypes; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; -import com.simibubi.create.foundation.utility.AngleHelper; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/display/DisplayLinkScreen.java b/src/main/java/com/simibubi/create/content/logistics/block/display/DisplayLinkScreen.java index 5ad126c0ed..e11be329c8 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/display/DisplayLinkScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/display/DisplayLinkScreen.java @@ -9,25 +9,25 @@ import com.simibubi.create.content.logistics.block.display.source.DisplaySource; import com.simibubi.create.content.logistics.block.display.source.SingleLineDisplaySource; import com.simibubi.create.content.logistics.block.display.target.DisplayTarget; import com.simibubi.create.content.logistics.block.display.target.DisplayTargetStats; -import com.simibubi.create.foundation.gui.AbstractSimiScreen; import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.ModularGuiLine; import com.simibubi.create.foundation.gui.ModularGuiLineBuilder; -import com.simibubi.create.foundation.gui.ScreenOpener; -import com.simibubi.create.foundation.gui.element.GuiGameElement; -import com.simibubi.create.foundation.gui.widget.AbstractSimiWidget; -import com.simibubi.create.foundation.gui.widget.ElementWidget; import com.simibubi.create.foundation.gui.widget.IconButton; import com.simibubi.create.foundation.gui.widget.Label; import com.simibubi.create.foundation.gui.widget.ScrollInput; import com.simibubi.create.foundation.gui.widget.SelectionScrollInput; import com.simibubi.create.foundation.networking.AllPackets; -import com.simibubi.create.foundation.ponder.PonderTag; -import com.simibubi.create.foundation.ponder.ui.PonderTagScreen; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.ponder.CreatePonderTag; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.gui.AbstractSimiScreen; +import net.createmod.catnip.gui.ScreenOpener; +import net.createmod.catnip.gui.element.GuiGameElement; +import net.createmod.catnip.gui.widget.AbstractSimiWidget; +import net.createmod.catnip.gui.widget.ElementWidget; +import net.createmod.catnip.utility.Couple; +import net.createmod.ponder.foundation.ui.PonderTagScreen; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.multiplayer.ClientLevel; @@ -74,7 +74,7 @@ public class DisplayLinkScreen extends AbstractSimiScreen { @Override protected void init() { - setWindowSize(background.width, background.height); + setWindowSize(background.getWidth(), background.getHeight()); super.init(); clearWidgets(); @@ -84,7 +84,7 @@ public class DisplayLinkScreen extends AbstractSimiScreen { initGathererOptions(); - confirmButton = new IconButton(x + background.width - 33, y + background.height - 24, AllIcons.I_CONFIRM); + confirmButton = new IconButton(x + background.getWidth() - 33, y + background.getHeight() - 24, AllIcons.I_CONFIRM); confirmButton.withCallback(this::onClose); addRenderableWidget(confirmButton); } @@ -142,7 +142,7 @@ public class DisplayLinkScreen extends AbstractSimiScreen { if (rows > 1) { targetLineSelector = new ScrollInput(x + 61, y + 105, 135, 16).withRange(0, rows) - .titled(Lang.translateDirect("display_link.display_on")) + .titled(CreateLang.translateDirect("display_link.display_on")) .inverted() .calling(i -> targetLineLabel.text = target.getLineOptionText(i)) .setState(startIndex); @@ -155,15 +155,15 @@ public class DisplayLinkScreen extends AbstractSimiScreen { sourceWidget = new ElementWidget(x + 37, y + 26) .showingElement(GuiGameElement.of(sourceIcon)) .withCallback((mX, mY) -> { - ScreenOpener.open(new PonderTagScreen(PonderTag.DISPLAY_SOURCES)); + ScreenOpener.open(new PonderTagScreen(CreatePonderTag.DISPLAY_SOURCES)); }); sourceWidget.getToolTip().addAll(List.of( - Lang.translateDirect("display_link.reading_from"), + CreateLang.translateDirect("display_link.reading_from"), sourceState.getBlock().getName() .withStyle(s -> s.withColor(sources.isEmpty() ? 0xF68989 : 0xF2C16D)), - Lang.translateDirect("display_link.attached_side"), - Lang.translateDirect("display_link.view_compatible") + CreateLang.translateDirect("display_link.attached_side"), + CreateLang.translateDirect("display_link.view_compatible") .withStyle(ChatFormatting.GRAY) )); @@ -172,15 +172,15 @@ public class DisplayLinkScreen extends AbstractSimiScreen { targetWidget = new ElementWidget(x + 37, y + 105) .showingElement(GuiGameElement.of(targetIcon)) .withCallback((mX, mY) -> { - ScreenOpener.open(new PonderTagScreen(PonderTag.DISPLAY_TARGETS)); + ScreenOpener.open(new PonderTagScreen(CreatePonderTag.DISPLAY_TARGETS)); }); targetWidget.getToolTip().addAll(List.of( - Lang.translateDirect("display_link.writing_to"), + CreateLang.translateDirect("display_link.writing_to"), targetState.getBlock().getName() .withStyle(s -> s.withColor(target == null ? 0xF68989 : 0xF2C16D)), - Lang.translateDirect("display_link.targeted_location"), - Lang.translateDirect("display_link.view_compatible") + CreateLang.translateDirect("display_link.targeted_location"), + CreateLang.translateDirect("display_link.view_compatible") .withStyle(ChatFormatting.GRAY) )); @@ -199,7 +199,7 @@ public class DisplayLinkScreen extends AbstractSimiScreen { .toList(); sourceTypeSelector = new SelectionScrollInput(x + 61, y + 26, 135, 16).forOptions(options) .writingTo(sourceTypeLabel) - .titled(Lang.translateDirect("display_link.information_type")) + .titled(CreateLang.translateDirect("display_link.information_type")) .calling(this::initGathererSourceSubOptions) .setState(startIndex); sourceTypeSelector.onChanged(); @@ -218,8 +218,8 @@ public class DisplayLinkScreen extends AbstractSimiScreen { if (targetLineSelector != null) targetLineSelector - .titled(source instanceof SingleLineDisplaySource ? Lang.translateDirect("display_link.display_on") - : Lang.translateDirect("display_link.display_on_multiline")); + .titled(source instanceof SingleLineDisplaySource ? CreateLang.translateDirect("display_link.display_on") + : CreateLang.translateDirect("display_link.display_on_multiline")); configWidgets.forEach(s -> { s.forEach(this::removeWidget); @@ -254,13 +254,13 @@ public class DisplayLinkScreen extends AbstractSimiScreen { int y = guiTop; background.render(ms, x, y, this); - MutableComponent header = Lang.translateDirect("display_link.title"); - font.draw(ms, header, x + background.width / 2 - font.width(header) / 2, y + 4, 0x442000); + MutableComponent header = CreateLang.translateDirect("display_link.title"); + font.draw(ms, header, x + background.getWidth() / 2 - font.width(header) / 2, y + 4, 0x442000); if (sources.isEmpty()) - font.drawShadow(ms, Lang.translateDirect("display_link.no_source"), x + 65, y + 30, 0xD3D3D3); + font.drawShadow(ms, CreateLang.translateDirect("display_link.no_source"), x + 65, y + 30, 0xD3D3D3); if (target == null) - font.drawShadow(ms, Lang.translateDirect("display_link.no_target"), x + 65, y + 109, 0xD3D3D3); + font.drawShadow(ms, CreateLang.translateDirect("display_link.no_target"), x + 65, y + 109, 0xD3D3D3); ms.pushPose(); ms.translate(0, guiTop + 46, 0); @@ -274,7 +274,7 @@ public class DisplayLinkScreen extends AbstractSimiScreen { ms.pushPose(); TransformStack.cast(ms) .pushPose() - .translate(x + background.width + 4, y + background.height + 4, 100) + .translate(x + background.getWidth() + 4, y + background.getHeight() + 4, 100) .scale(40) .rotateX(-22) .rotateY(63); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/display/DisplayLinkTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/display/DisplayLinkTileEntity.java index c06ee51e97..c2dd25782e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/display/DisplayLinkTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/display/DisplayLinkTileEntity.java @@ -7,10 +7,10 @@ import com.simibubi.create.content.logistics.block.display.target.DisplayTarget; import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.utility.NBTHelper; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; -import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; @@ -31,7 +31,7 @@ public class DisplayLinkTileEntity extends SmartTileEntity { public LerpedFloat glow; private boolean sendPulse; - + public int refreshTicks; public DisplayLinkTileEntity(BlockEntityType type, BlockPos pos, BlockState state) { @@ -47,7 +47,7 @@ public class DisplayLinkTileEntity extends SmartTileEntity { @Override public void tick() { super.tick(); - + if (isVirtual()) { glow.tickChaser(); return; @@ -59,7 +59,7 @@ public class DisplayLinkTileEntity extends SmartTileEntity { glow.tickChaser(); return; } - + refreshTicks++; if (refreshTicks < activeSource.getPassiveRefreshTicks()) return; @@ -114,7 +114,7 @@ public class DisplayLinkTileEntity extends SmartTileEntity { activeSource.transferData(context, activeTarget, targetLine); sendPulse = true; sendData(); - + award(AllAdvancements.DISPLAY_LINK); } @@ -133,7 +133,7 @@ public class DisplayLinkTileEntity extends SmartTileEntity { protected void write(CompoundTag tag, boolean clientPacket) { super.write(tag, clientPacket); writeGatheredData(tag, clientPacket); - if (clientPacket && activeTarget != null) + if (clientPacket && activeTarget != null) tag.putString("TargetType", activeTarget.id.toString()); if (clientPacket && sendPulse) { sendPulse = false; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/display/source/BoilerDisplaySource.java b/src/main/java/com/simibubi/create/content/logistics/block/display/source/BoilerDisplaySource.java index bb7c371967..3f209da906 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/display/source/BoilerDisplaySource.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/display/source/BoilerDisplaySource.java @@ -11,7 +11,7 @@ import com.simibubi.create.content.logistics.block.display.target.DisplayTargetS import com.simibubi.create.content.logistics.trains.management.display.FlapDisplayLayout; import com.simibubi.create.content.logistics.trains.management.display.FlapDisplaySection; import com.simibubi.create.content.logistics.trains.management.display.FlapDisplayTileEntity; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import joptsimple.internal.Strings; import net.minecraft.ChatFormatting; @@ -23,16 +23,16 @@ import net.minecraft.world.level.block.entity.LecternBlockEntity; public class BoilerDisplaySource extends DisplaySource { public static final List notEnoughSpaceSingle = - List.of(Lang.translateDirect("display_source.boiler.not_enough_space") - .append(Lang.translateDirect("display_source.boiler.for_boiler_status"))); + List.of(CreateLang.translateDirect("display_source.boiler.not_enough_space") + .append(CreateLang.translateDirect("display_source.boiler.for_boiler_status"))); public static final List notEnoughSpaceDouble = - List.of(Lang.translateDirect("display_source.boiler.not_enough_space"), - Lang.translateDirect("display_source.boiler.for_boiler_status")); + List.of(CreateLang.translateDirect("display_source.boiler.not_enough_space"), + CreateLang.translateDirect("display_source.boiler.for_boiler_status")); public static final List> notEnoughSpaceFlap = - List.of(List.of(Lang.translateDirect("display_source.boiler.not_enough_space")), - List.of(Lang.translateDirect("display_source.boiler.for_boiler_status"))); + List.of(List.of(CreateLang.translateDirect("display_source.boiler.not_enough_space")), + List.of(CreateLang.translateDirect("display_source.boiler.for_boiler_status"))); @Override public List provideText(DisplayLinkContext context, DisplayTargetStats stats) { @@ -133,7 +133,7 @@ public class BoilerDisplaySource extends DisplaySource { heat = new TextComponent(Strings.repeat(' ', lw - labelWidthOf("heat"))).append(heat); } - return Stream.of(List.of(Lang.translateDirect(label, boiler.getHeatLevelTextComponent())), + return Stream.of(List.of(CreateLang.translateDirect(label, boiler.getHeatLevelTextComponent())), List.of(size, boiler.getSizeComponent(!forFlapDisplay, forFlapDisplay, ChatFormatting.BLACK)), List.of(water, boiler.getWaterComponent(!forFlapDisplay, forFlapDisplay, ChatFormatting.BLACK)), List.of(heat, boiler.getHeatComponent(!forFlapDisplay, forFlapDisplay, ChatFormatting.BLACK))); @@ -151,7 +151,7 @@ public class BoilerDisplaySource extends DisplaySource { private MutableComponent labelOf(String label) { if (label.isBlank()) return TextComponent.EMPTY.copy(); - return Lang.translateDirect("boiler." + label); + return CreateLang.translateDirect("boiler." + label); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/block/display/source/DeathCounterDisplaySource.java b/src/main/java/com/simibubi/create/content/logistics/block/display/source/DeathCounterDisplaySource.java index d248da2497..467735291d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/display/source/DeathCounterDisplaySource.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/display/source/DeathCounterDisplaySource.java @@ -1,6 +1,6 @@ package com.simibubi.create.content.logistics.block.display.source; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; @@ -26,7 +26,7 @@ public class DeathCounterDisplaySource extends StatTrackingDisplaySource { @Override protected Component getObjectiveDisplayName() { - return Lang.translateDirect("display_source.scoreboard.objective.deaths"); + return CreateLang.translateDirect("display_source.scoreboard.objective.deaths"); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/display/source/FillLevelDisplaySource.java b/src/main/java/com/simibubi/create/content/logistics/block/display/source/FillLevelDisplaySource.java index dc6807dedb..417872df07 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/display/source/FillLevelDisplaySource.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/display/source/FillLevelDisplaySource.java @@ -3,7 +3,7 @@ package com.simibubi.create.content.logistics.block.display.source; import com.simibubi.create.content.logistics.block.display.DisplayLinkContext; import com.simibubi.create.content.logistics.block.redstone.StockpileSwitchTileEntity; import com.simibubi.create.foundation.gui.ModularGuiLineBuilder; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraftforge.api.distmarker.Dist; @@ -18,7 +18,7 @@ public class FillLevelDisplaySource extends PercentOrProgressBarDisplaySource { return null; return sste.currentLevel; } - + @Override protected boolean progressBarActive(DisplayLinkContext context) { return context.sourceConfig() @@ -37,8 +37,8 @@ public class FillLevelDisplaySource extends PercentOrProgressBarDisplaySource { if (isFirstLine) return; builder.addSelectionScrollInput(0, 120, - (si, l) -> si.forOptions(Lang.translatedOptions("display_source.fill_level", "percent", "progress_bar")) - .titled(Lang.translateDirect("display_source.fill_level.display")), + (si, l) -> si.forOptions(CreateLang.translatedOptions("display_source.fill_level", "percent", "progress_bar")) + .titled(CreateLang.translateDirect("display_source.fill_level.display")), "Mode"); } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/display/source/FluidListDisplaySource.java b/src/main/java/com/simibubi/create/content/logistics/block/display/source/FluidListDisplaySource.java index 19c16a5d1b..e60c099aa9 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/display/source/FluidListDisplaySource.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/display/source/FluidListDisplaySource.java @@ -15,10 +15,10 @@ import com.simibubi.create.content.logistics.trains.management.display.FlapDispl import com.simibubi.create.content.logistics.trains.management.display.FlapDisplayTileEntity; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.inventory.TankManipulationBehaviour; -import com.simibubi.create.foundation.utility.Couple; import com.simibubi.create.foundation.utility.FluidFormatter; -import com.simibubi.create.foundation.utility.IntAttached; +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.IntAttached; import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.world.level.block.entity.BlockEntity; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/display/source/ItemListDisplaySource.java b/src/main/java/com/simibubi/create/content/logistics/block/display/source/ItemListDisplaySource.java index 4e9768dbdf..2fe4620862 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/display/source/ItemListDisplaySource.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/display/source/ItemListDisplaySource.java @@ -7,8 +7,8 @@ import com.simibubi.create.content.logistics.block.redstone.ContentObserverTileE import com.simibubi.create.foundation.item.CountedItemStackList; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InvManipulationBehaviour; -import com.simibubi.create.foundation.utility.IntAttached; +import net.createmod.catnip.utility.IntAttached; import net.minecraft.network.chat.MutableComponent; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraftforge.items.IItemHandler; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/display/source/ItemThoughputDisplaySource.java b/src/main/java/com/simibubi/create/content/logistics/block/display/source/ItemThoughputDisplaySource.java index e4e346aa0d..161e86e9b0 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/display/source/ItemThoughputDisplaySource.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/display/source/ItemThoughputDisplaySource.java @@ -5,7 +5,7 @@ import com.simibubi.create.content.logistics.block.display.DisplayLinkContext; import com.simibubi.create.content.logistics.block.display.DisplayLinkTileEntity; import com.simibubi.create.content.logistics.block.display.target.DisplayTargetStats; import com.simibubi.create.foundation.gui.ModularGuiLineBuilder; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.FloatTag; @@ -44,7 +44,7 @@ public class ItemThoughputDisplaySource extends AccumulatedItemCountDisplaySourc } } - return Lang.number(rate) + return CreateLang.number(rate) .component(); } @@ -108,8 +108,8 @@ public class ItemThoughputDisplaySource extends AccumulatedItemCountDisplaySourc return; builder.addSelectionScrollInput(0, 80, (si, l) -> { - si.forOptions(Lang.translatedOptions("display_source.item_throughput.interval", "second", "minute", "hour")) - .titled(Lang.translateDirect("display_source.item_throughput.interval")); + si.forOptions(CreateLang.translatedOptions("display_source.item_throughput.interval", "second", "minute", "hour")) + .titled(CreateLang.translateDirect("display_source.item_throughput.interval")); }, "Interval"); } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/display/source/KineticSpeedDisplaySource.java b/src/main/java/com/simibubi/create/content/logistics/block/display/source/KineticSpeedDisplaySource.java index e04d40a4a1..27012269d3 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/display/source/KineticSpeedDisplaySource.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/display/source/KineticSpeedDisplaySource.java @@ -4,7 +4,7 @@ import com.simibubi.create.content.contraptions.relays.gauge.SpeedGaugeTileEntit import com.simibubi.create.content.logistics.block.display.DisplayLinkContext; import com.simibubi.create.content.logistics.block.display.target.DisplayTargetStats; import com.simibubi.create.foundation.gui.ModularGuiLineBuilder; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import net.minecraft.network.chat.MutableComponent; import net.minecraftforge.api.distmarker.Dist; @@ -20,7 +20,7 @@ public class KineticSpeedDisplaySource extends NumericSingleLineDisplaySource { boolean absoluteValue = context.sourceConfig() .getInt("Directional") == 0; float speed = absoluteValue ? Math.abs(gaugeTile.getSpeed()) : gaugeTile.getSpeed(); - return Lang.number(speed) + return CreateLang.number(speed) .space() .translate("generic.unit.rpm") .component(); @@ -41,7 +41,7 @@ public class KineticSpeedDisplaySource extends NumericSingleLineDisplaySource { builder.addSelectionScrollInput(0, 95, (selectionScrollInput, label) -> { selectionScrollInput - .forOptions(Lang.translatedOptions("display_source.kinetic_speed", "absolute", "directional")); + .forOptions(CreateLang.translatedOptions("display_source.kinetic_speed", "absolute", "directional")); }, "Directional"); } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/display/source/KineticStressDisplaySource.java b/src/main/java/com/simibubi/create/content/logistics/block/display/source/KineticStressDisplaySource.java index 1a1a06185b..e7ee30ca6b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/display/source/KineticStressDisplaySource.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/display/source/KineticStressDisplaySource.java @@ -4,9 +4,9 @@ import com.simibubi.create.content.contraptions.relays.gauge.StressGaugeTileEnti import com.simibubi.create.content.logistics.block.display.DisplayLinkContext; import com.simibubi.create.content.logistics.trains.management.display.FlapDisplayTileEntity; import com.simibubi.create.foundation.gui.ModularGuiLineBuilder; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.LangBuilder; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.lang.LangBuilder; import net.minecraft.network.chat.MutableComponent; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -18,7 +18,7 @@ public class KineticStressDisplaySource extends PercentOrProgressBarDisplaySourc int mode = getMode(context); if (mode == 1) return super.formatNumeric(context, currentLevel); - LangBuilder builder = Lang.number(currentLevel); + LangBuilder builder = CreateLang.number(currentLevel); if (context.getTargetTE() instanceof FlapDisplayTileEntity) builder.space(); return builder.translate("generic.unit.stress") @@ -69,9 +69,9 @@ public class KineticStressDisplaySource extends PercentOrProgressBarDisplaySourc return; builder.addSelectionScrollInput(0, 120, (si, l) -> si - .forOptions(Lang.translatedOptions("display_source.kinetic_stress", "progress_bar", "percent", + .forOptions(CreateLang.translatedOptions("display_source.kinetic_stress", "progress_bar", "percent", "current", "max", "remaining")) - .titled(Lang.translateDirect("display_source.kinetic_stress.display")), + .titled(CreateLang.translateDirect("display_source.kinetic_stress.display")), "Mode"); } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/display/source/RedstonePowerDisplaySource.java b/src/main/java/com/simibubi/create/content/logistics/block/display/source/RedstonePowerDisplaySource.java index 03e0195a84..844c3f57fa 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/display/source/RedstonePowerDisplaySource.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/display/source/RedstonePowerDisplaySource.java @@ -2,7 +2,7 @@ package com.simibubi.create.content.logistics.block.display.source; import com.simibubi.create.content.logistics.block.display.DisplayLinkContext; import com.simibubi.create.foundation.gui.ModularGuiLineBuilder; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.TextComponent; @@ -12,7 +12,7 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; public class RedstonePowerDisplaySource extends PercentOrProgressBarDisplaySource { - + @Override protected String getTranslationKey() { return "redstone_power"; @@ -22,7 +22,7 @@ public class RedstonePowerDisplaySource extends PercentOrProgressBarDisplaySourc protected MutableComponent formatNumeric(DisplayLinkContext context, Float currentLevel) { return new TextComponent(String.valueOf((int) (currentLevel * 15))); } - + @Override protected boolean allowsLabeling(DisplayLinkContext context) { return true; @@ -52,9 +52,9 @@ public class RedstonePowerDisplaySource extends PercentOrProgressBarDisplaySourc if (isFirstLine) return; builder.addSelectionScrollInput(0, 120, - (si, l) -> si.forOptions(Lang.translatedOptions("display_source.redstone_power", "number", "progress_bar")) - .titled(Lang.translateDirect("display_source.redstone_power.display")), + (si, l) -> si.forOptions(CreateLang.translatedOptions("display_source.redstone_power", "number", "progress_bar")) + .titled(CreateLang.translateDirect("display_source.redstone_power.display")), "Mode"); } - + } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/display/source/ScoreboardDisplaySource.java b/src/main/java/com/simibubi/create/content/logistics/block/display/source/ScoreboardDisplaySource.java index cafedbba60..3f48f84561 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/display/source/ScoreboardDisplaySource.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/display/source/ScoreboardDisplaySource.java @@ -5,9 +5,9 @@ import java.util.stream.Stream; import com.google.common.collect.ImmutableList; import com.simibubi.create.content.logistics.block.display.DisplayLinkContext; import com.simibubi.create.foundation.gui.ModularGuiLineBuilder; -import com.simibubi.create.foundation.utility.IntAttached; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.IntAttached; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.TextComponent; @@ -47,7 +47,7 @@ public class ScoreboardDisplaySource extends ValueListDisplaySource { private ImmutableList> notFound(String objective) { return ImmutableList - .of(IntAttached.with(404, Lang.translateDirect("display_source.scoreboard.objective_not_found", objective))); + .of(IntAttached.with(404, CreateLang.translateDirect("display_source.scoreboard.objective_not_found", objective))); } @Override @@ -60,9 +60,9 @@ public class ScoreboardDisplaySource extends ValueListDisplaySource { if (isFirstLine) builder.addTextInput(0, 137, (e, t) -> { e.setValue(""); - t.withTooltip(ImmutableList.of(Lang.translateDirect("display_source.scoreboard.objective") + t.withTooltip(ImmutableList.of(CreateLang.translateDirect("display_source.scoreboard.objective") .withStyle(s -> s.withColor(0x5391E1)), - Lang.translateDirect("gui.schedule.lmb_edit") + CreateLang.translateDirect("gui.schedule.lmb_edit") .withStyle(ChatFormatting.DARK_GRAY, ChatFormatting.ITALIC))); }, "Objective"); else diff --git a/src/main/java/com/simibubi/create/content/logistics/block/display/source/SingleLineDisplaySource.java b/src/main/java/com/simibubi/create/content/logistics/block/display/source/SingleLineDisplaySource.java index c557050a06..867d0fe365 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/display/source/SingleLineDisplaySource.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/display/source/SingleLineDisplaySource.java @@ -9,7 +9,7 @@ import com.simibubi.create.content.logistics.trains.management.display.FlapDispl import com.simibubi.create.content.logistics.trains.management.display.FlapDisplaySection; import com.simibubi.create.content.logistics.trains.management.display.FlapDisplayTileEntity; import com.simibubi.create.foundation.gui.ModularGuiLineBuilder; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.MutableComponent; @@ -34,9 +34,9 @@ public abstract class SingleLineDisplaySource extends DisplaySource { protected void addLabelingTextBox(ModularGuiLineBuilder builder) { builder.addTextInput(0, 137, (e, t) -> { e.setValue(""); - t.withTooltip(ImmutableList.of(Lang.translateDirect("display_source.label") + t.withTooltip(ImmutableList.of(CreateLang.translateDirect("display_source.label") .withStyle(s -> s.withColor(0x5391E1)), - Lang.translateDirect("gui.schedule.lmb_edit") + CreateLang.translateDirect("gui.schedule.lmb_edit") .withStyle(ChatFormatting.DARK_GRAY, ChatFormatting.ITALIC))); }, "Label"); } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/display/source/StatTrackingDisplaySource.java b/src/main/java/com/simibubi/create/content/logistics/block/display/source/StatTrackingDisplaySource.java index c4f15525ca..59e05d215e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/display/source/StatTrackingDisplaySource.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/display/source/StatTrackingDisplaySource.java @@ -4,8 +4,8 @@ import java.util.stream.Stream; import com.simibubi.create.content.logistics.block.display.DisplayLinkContext; import com.simibubi.create.foundation.gui.ModularGuiLineBuilder; -import com.simibubi.create.foundation.utility.IntAttached; +import net.createmod.catnip.utility.IntAttached; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.server.level.ServerLevel; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/display/source/StationSummaryDisplaySource.java b/src/main/java/com/simibubi/create/content/logistics/block/display/source/StationSummaryDisplaySource.java index 60c5f2c136..ddc8aef751 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/display/source/StationSummaryDisplaySource.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/display/source/StationSummaryDisplaySource.java @@ -16,7 +16,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.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.gui.ModularGuiLineBuilder; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import net.minecraft.ChatFormatting; import net.minecraft.nbt.CompoundTag; @@ -57,7 +57,7 @@ public class StationSummaryDisplaySource extends DisplaySource { } else if (prediction.ticks < 200) { lines.add(WHITESPACE); - lines.add(Lang.translateDirect("display_source.station_summary.now")); + lines.add(CreateLang.translateDirect("display_source.station_summary.now")); } else { int min = prediction.ticks / 1200; @@ -68,8 +68,8 @@ public class StationSummaryDisplaySource extends DisplaySource { sec = 0; } lines.add(min > 0 ? new TextComponent(String.valueOf(min)) : WHITESPACE); - lines.add(min > 0 ? Lang.translateDirect("display_source.station_summary.minutes") - : Lang.translateDirect("display_source.station_summary.seconds", sec)); + lines.add(min > 0 ? CreateLang.translateDirect("display_source.station_summary.minutes") + : CreateLang.translateDirect("display_source.station_summary.seconds", sec)); } lines.add(prediction.train.name.copy()); @@ -187,16 +187,16 @@ public class StationSummaryDisplaySource extends DisplaySource { if (isFirstLine) { builder.addTextInput(0, 137, (e, t) -> { e.setValue(""); - t.withTooltip(ImmutableList.of(Lang.translateDirect("display_source.station_summary.filter") + t.withTooltip(ImmutableList.of(CreateLang.translateDirect("display_source.station_summary.filter") .withStyle(s -> s.withColor(0x5391E1)), - Lang.translateDirect("gui.schedule.lmb_edit") + CreateLang.translateDirect("gui.schedule.lmb_edit") .withStyle(ChatFormatting.DARK_GRAY, ChatFormatting.ITALIC))); }, "Filter"); return; } builder.addScrollInput(0, 32, (si, l) -> { - si.titled(Lang.translateDirect("display_source.station_summary.train_name_column")) + si.titled(CreateLang.translateDirect("display_source.station_summary.train_name_column")) .withRange(0, 73) .withShiftStep(12); si.setState(50); @@ -204,7 +204,7 @@ public class StationSummaryDisplaySource extends DisplaySource { }, "NameColumn"); builder.addScrollInput(36, 22, (si, l) -> { - si.titled(Lang.translateDirect("display_source.station_summary.platform_column")) + si.titled(CreateLang.translateDirect("display_source.station_summary.platform_column")) .withRange(0, 16) .withShiftStep(4); si.setState(3); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/display/source/TimeOfDayDisplaySource.java b/src/main/java/com/simibubi/create/content/logistics/block/display/source/TimeOfDayDisplaySource.java index d71ef7bbf8..c68eda8af5 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/display/source/TimeOfDayDisplaySource.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/display/source/TimeOfDayDisplaySource.java @@ -6,7 +6,7 @@ import com.simibubi.create.content.logistics.block.display.DisplayLinkContext; import com.simibubi.create.content.logistics.block.display.target.DisplayTargetStats; import com.simibubi.create.content.logistics.trains.management.display.FlapDisplaySection; import com.simibubi.create.foundation.gui.ModularGuiLineBuilder; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.TextComponent; @@ -17,7 +17,7 @@ import net.minecraftforge.api.distmarker.OnlyIn; public class TimeOfDayDisplaySource extends SingleLineDisplaySource { public static final MutableComponent EMPTY_TIME = new TextComponent("--:--"); - + @Override protected MutableComponent provideLine(DisplayLinkContext context, DisplayTargetStats stats) { if (!(context.level()instanceof ServerLevel sLevel)) @@ -35,7 +35,7 @@ public class TimeOfDayDisplaySource extends SingleLineDisplaySource { int dayTime = (int) (sLevel.getDayTime() % 24000); int hours = (dayTime / 1000 + 6) % 24; int minutes = (dayTime % 1000) * 60 / 1000; - MutableComponent suffix = Lang.translateDirect("generic.daytime." + (hours > 11 ? "pm" : "am")); + MutableComponent suffix = CreateLang.translateDirect("generic.daytime." + (hours > 11 ? "pm" : "am")); minutes = minutes / 5 * 5; if (c12) { @@ -78,8 +78,8 @@ public class TimeOfDayDisplaySource extends SingleLineDisplaySource { return; builder.addSelectionScrollInput(0, 60, (si, l) -> { - si.forOptions(Lang.translatedOptions("display_source.time", "12_hour", "24_hour")) - .titled(Lang.translateDirect("display_source.time.format")); + si.forOptions(CreateLang.translatedOptions("display_source.time", "12_hour", "24_hour")) + .titled(CreateLang.translateDirect("display_source.time.format")); }, "Cycle"); } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/display/source/ValueListDisplaySource.java b/src/main/java/com/simibubi/create/content/logistics/block/display/source/ValueListDisplaySource.java index 193067fadf..36dc94ada5 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/display/source/ValueListDisplaySource.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/display/source/ValueListDisplaySource.java @@ -15,10 +15,10 @@ import com.simibubi.create.content.logistics.trains.management.display.FlapDispl import com.simibubi.create.content.logistics.trains.management.display.FlapDisplaySection; import com.simibubi.create.content.logistics.trains.management.display.FlapDisplayTileEntity; import com.simibubi.create.foundation.gui.ModularGuiLineBuilder; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.IntAttached; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.IntAttached; import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.TextComponent; import net.minecraft.world.level.block.entity.LecternBlockEntity; @@ -138,11 +138,11 @@ public abstract class ValueListDisplaySource extends DisplaySource { private Couple shorten(int number) { if (number >= 1000000) return Couple.create(new TextComponent(String.valueOf(number / 1000000)), - Lang.translateDirect("display_source.value_list.million") + CreateLang.translateDirect("display_source.value_list.million") .append(WHITESPACE)); if (number >= 1000) return Couple.create(new TextComponent(String.valueOf(number / 1000)), - Lang.translateDirect("display_source.value_list.thousand") + CreateLang.translateDirect("display_source.value_list.thousand") .append(WHITESPACE)); return Couple.create(new TextComponent(String.valueOf(number)), WHITESPACE); } @@ -162,8 +162,8 @@ public abstract class ValueListDisplaySource extends DisplaySource { @OnlyIn(Dist.CLIENT) protected void addFullNumberConfig(ModularGuiLineBuilder builder) { builder.addSelectionScrollInput(0, 75, - (si, l) -> si.forOptions(Lang.translatedOptions("display_source.value_list", "shortened", "full_number")) - .titled(Lang.translateDirect("display_source.value_list.display")), + (si, l) -> si.forOptions(CreateLang.translatedOptions("display_source.value_list", "shortened", "full_number")) + .titled(CreateLang.translateDirect("display_source.value_list.display")), "Format"); } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/display/target/DisplayTarget.java b/src/main/java/com/simibubi/create/content/logistics/block/display/target/DisplayTarget.java index 6c1848421e..b4542bd802 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/display/target/DisplayTarget.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/display/target/DisplayTarget.java @@ -5,7 +5,7 @@ import java.util.List; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.logistics.block.display.DisplayBehaviour; import com.simibubi.create.content.logistics.block.display.DisplayLinkContext; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; @@ -32,7 +32,7 @@ public abstract class DisplayTarget extends DisplayBehaviour { } public Component getLineOptionText(int line) { - return Lang.translateDirect("display_target.line", line + 1); + return CreateLang.translateDirect("display_target.line", line + 1); } public static void reserve(int line, BlockEntity target, DisplayLinkContext context) { diff --git a/src/main/java/com/simibubi/create/content/logistics/block/display/target/LecternDisplayTarget.java b/src/main/java/com/simibubi/create/content/logistics/block/display/target/LecternDisplayTarget.java index 9e97bdbee2..da2a3dec03 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/display/target/LecternDisplayTarget.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/display/target/LecternDisplayTarget.java @@ -3,7 +3,7 @@ package com.simibubi.create.content.logistics.block.display.target; import java.util.List; import com.simibubi.create.content.logistics.block.display.DisplayLinkContext; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; @@ -65,7 +65,7 @@ public class LecternDisplayTarget extends DisplayTarget { } public Component getLineOptionText(int line) { - return Lang.translateDirect("display_target.page", line + 1); + return CreateLang.translateDirect("display_target.page", line + 1); } private ItemStack signBook(ItemStack book) { diff --git a/src/main/java/com/simibubi/create/content/logistics/block/display/target/SingleLineDisplayTarget.java b/src/main/java/com/simibubi/create/content/logistics/block/display/target/SingleLineDisplayTarget.java index 0858e5a923..aa327dc870 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/display/target/SingleLineDisplayTarget.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/display/target/SingleLineDisplayTarget.java @@ -3,7 +3,7 @@ package com.simibubi.create.content.logistics.block.display.target; import java.util.List; import com.simibubi.create.content.logistics.block.display.DisplayLinkContext; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; @@ -14,19 +14,19 @@ public abstract class SingleLineDisplayTarget extends DisplayTarget { public final void acceptText(int line, List text, DisplayLinkContext context) { acceptLine(text.get(0), context); } - + protected abstract void acceptLine(MutableComponent text, DisplayLinkContext context); @Override public final DisplayTargetStats provideStats(DisplayLinkContext context) { return new DisplayTargetStats(1, getWidth(context), this); } - + @Override public Component getLineOptionText(int line) { - return Lang.translateDirect("display_target.single_line"); + return CreateLang.translateDirect("display_target.single_line"); } - + protected abstract int getWidth(DisplayLinkContext context); } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/BeltFunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/BeltFunnelBlock.java index fcaafeae9f..bf1def8548 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/BeltFunnelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/BeltFunnelBlock.java @@ -9,10 +9,10 @@ import com.simibubi.create.content.schematics.ItemRequirement; import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.VoxelShaper; import com.tterrag.registrate.util.entry.BlockEntry; +import net.createmod.catnip.utility.VoxelShaper; +import net.createmod.catnip.utility.lang.Lang; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.util.StringRepresentable; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelBlock.java index 930da5e2d3..f20236d408 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelBlock.java @@ -4,8 +4,8 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.AllShapes; import com.simibubi.create.foundation.advancement.AdvancementBehaviour; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.AxisDirection; @@ -63,7 +63,7 @@ public abstract class FunnelBlock extends AbstractDirectionalFunnelBlock { protected void createBlockStateDefinition(Builder builder) { super.createBlockStateDefinition(builder.add(EXTRACTING)); } - + @Override public void setPlacedBy(Level pLevel, BlockPos pPos, BlockState pState, LivingEntity pPlacer, ItemStack pStack) { super.setPlacedBy(pLevel, pPos, pState, pPlacer, pStack); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelFilterSlotPositioning.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelFilterSlotPositioning.java index 2188665cb4..109230fa9a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelFilterSlotPositioning.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelFilterSlotPositioning.java @@ -4,9 +4,9 @@ import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.content.logistics.block.funnel.BeltFunnelBlock.Shape; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; import net.minecraft.world.level.block.state.BlockState; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelInstance.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelInstance.java index 24e44245ed..3b3b29a722 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelInstance.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelInstance.java @@ -11,8 +11,8 @@ import com.jozufozu.flywheel.core.PartialModel; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.logistics.block.flap.FlapData; import com.simibubi.create.foundation.render.AllMaterialSpecs; -import com.simibubi.create.foundation.utility.AnimationTickHolder; +import net.createmod.catnip.utility.AnimationTickHolder; import net.minecraft.core.Direction; import net.minecraft.world.level.LightLayer; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelRenderer.java index 1e62bf5537..08ac338d5a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelRenderer.java @@ -9,9 +9,9 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRenderer; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java index b48342493f..350b0e1ff0 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java @@ -20,11 +20,11 @@ import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InvManipulationBehaviour; -import com.simibubi.create.foundation.utility.BlockFace; -import com.simibubi.create.foundation.utility.VecHelper; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; -import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.utility.BlockFace; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; @@ -336,7 +336,7 @@ public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringIn .onFunnelTransfer(level, worldPosition, stack); award(AllAdvancements.FUNNEL); } - + private LerpedFloat createChasingFlap() { return LerpedFloat.linear() .startWithValue(.25f) diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/AllArmInteractionPointTypes.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/AllArmInteractionPointTypes.java index 5a47eda716..042c7f67bb 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/AllArmInteractionPointTypes.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/AllArmInteractionPointTypes.java @@ -30,8 +30,8 @@ import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemS import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour.TransportedResult; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InvManipulationBehaviour; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.resources.ResourceLocation; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmAngleTarget.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmAngleTarget.java index 2181b41aea..7da424500a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmAngleTarget.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmAngleTarget.java @@ -1,8 +1,7 @@ package com.simibubi.create.content.logistics.block.mechanicalArm; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.VecHelper; - +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -25,7 +24,7 @@ public class ArmAngleTarget { } public ArmAngleTarget(BlockPos armPos, Vec3 pointTarget, Direction clawFacing, boolean ceiling) { -// if (ceiling) +// if (ceiling) // clawFacing = clawFacing.getOpposite(); Vec3 target = pointTarget; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java index ab27c8f6a0..9ac0a575b3 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java @@ -14,10 +14,11 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.SingleRotatingInstance; import com.simibubi.create.content.contraptions.base.flwdata.RotatingData; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.Color; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.theme.Color; +import net.createmod.ponder.utility.WorldTickHolder; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.entity.ItemRenderer; import net.minecraft.util.Mth; @@ -110,7 +111,7 @@ public class ArmInstance extends SingleRotatingInstance implements DynamicInstan int color; if (rave) { - float renderTick = AnimationTickHolder.getRenderTime(this.arm.getLevel()) + (blockEntity.hashCode() % 64); + float renderTick = WorldTickHolder.getRenderTime(this.arm.getLevel()) + (blockEntity.hashCode() % 64); baseAngle = (renderTick * 10) % 360; lowerArmAngle = Mth.lerp((Mth.sin(renderTick / 4) + 1) / 2, -45, 15); upperArmAngle = Mth.lerp((Mth.sin(renderTick / 8) + 1) / 4, -45, 95); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPoint.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPoint.java index b6fe03b8c6..cfee2085b5 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPoint.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPoint.java @@ -3,9 +3,9 @@ package com.simibubi.create.content.logistics.block.mechanicalArm; import javax.annotation.Nullable; import com.simibubi.create.content.contraptions.components.structureMovement.StructureTransform; -import com.simibubi.create.foundation.utility.NBTHelper; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPointHandler.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPointHandler.java index 91e6724d5a..44c5c301a1 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPointHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPointHandler.java @@ -7,11 +7,11 @@ import java.util.List; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; -import com.simibubi.create.CreateClient; import com.simibubi.create.content.logistics.block.mechanicalArm.ArmInteractionPoint.Mode; import com.simibubi.create.foundation.networking.AllPackets; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.CatnipClient; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; @@ -64,8 +64,8 @@ public class ArmInteractionPointHandler { selected.cycleMode(); if (player != null) { Mode mode = selected.getMode(); - Lang.builder() - .translate(mode.getTranslationKey(), Lang.blockName(state) + CreateLang.builder() + .translate(mode.getTranslationKey(), CreateLang.blockName(state) .style(ChatFormatting.WHITE)) .color(mode.getColor()) .sendStatus(player); @@ -104,7 +104,7 @@ public class ArmInteractionPointHandler { LocalPlayer player = Minecraft.getInstance().player; if (removed > 0) { - Lang.builder() + CreateLang.builder() .translate("mechanical_arm.points_outside_range", removed) .style(ChatFormatting.RED) .sendStatus(player); @@ -118,7 +118,7 @@ public class ArmInteractionPointHandler { inputs++; } if (inputs + outputs > 0) - Lang.builder() + CreateLang.builder() .translate("mechanical_arm.summary", inputs, outputs) .style(ChatFormatting.WHITE) .sendStatus(player); @@ -201,7 +201,7 @@ public class ArmInteractionPointHandler { int color = point.getMode() .getColor(); - CreateClient.OUTLINER.showAABB(point, shape.bounds() + CatnipClient.OUTLINER.showAABB(point, shape.bounds() .move(pos)) .colored(color) .lineWidth(1 / 16f); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java index 1baec6fdc9..a7b592082e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java @@ -10,10 +10,11 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.logistics.block.mechanicalArm.ArmTileEntity.Phase; import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.Color; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.theme.Color; +import net.createmod.ponder.utility.WorldTickHolder; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; @@ -65,7 +66,7 @@ public class ArmRenderer extends KineticTileEntityRenderer { boolean rave = arm.phase == Phase.DANCING && te.getSpeed() != 0; if (rave) { - float renderTick = AnimationTickHolder.getRenderTime(te.getLevel()) + (te.hashCode() % 64); + float renderTick = WorldTickHolder.getRenderTime(te.getLevel()) + (te.hashCode() % 64); baseAngle = (renderTick * 10) % 360; lowerArmAngle = Mth.lerp((Mth.sin(renderTick / 4) + 1) / 2, -45, 15); upperArmAngle = Mth.lerp((Mth.sin(renderTick / 8) + 1) / 4, -45, 95); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java index 8ac68137a8..e3f0470998 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java @@ -19,11 +19,13 @@ import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.CenteredSideValueBoxTransform; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.INamedIconOptions; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollOptionBehaviour; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.NBTHelper; -import com.simibubi.create.foundation.utility.VecHelper; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; + +import net.createmod.catnip.utility.lang.Lang; +import net.createmod.catnip.utility.math.AngleHelper; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.animation.LerpedFloat; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -102,7 +104,7 @@ public class ArmTileEntity extends KineticTileEntity implements ITransformableTE super.addBehaviours(behaviours); selectionMode = new ScrollOptionBehaviour(SelectionMode.class, - Lang.translateDirect("logistics.when_multiple_outputs_available"), this, new SelectionModeValueBox()); + CreateLang.translateDirect("logistics.when_multiple_outputs_available"), this, new SelectionModeValueBox()); selectionMode.requiresWrench(); behaviours.add(selectionMode); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverInstance.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverInstance.java index 86a77af8b4..3f629a0436 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverInstance.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverInstance.java @@ -8,10 +8,10 @@ import com.jozufozu.flywheel.core.materials.model.ModelData; import com.jozufozu.flywheel.util.transform.Rotate; import com.jozufozu.flywheel.util.transform.Translate; import com.simibubi.create.AllBlockPartials; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.Color; +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.utility.theme.Color; import net.minecraft.core.Direction; import net.minecraft.world.level.block.state.properties.AttachFace; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverRenderer.java index 8fb88fd82c..f8bfb13b43 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverRenderer.java @@ -7,9 +7,9 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.Color; +import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.utility.theme.Color; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverTileEntity.java index d7bd93f53a..55a19a514c 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverTileEntity.java @@ -5,10 +5,10 @@ import java.util.List; import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; -import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; @@ -79,7 +79,7 @@ public class AnalogLeverTileEntity extends SmartTileEntity implements IHaveGoggl @Override public boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking) { - tooltip.add(componentSpacing.plainCopy().append(Lang.translateDirect("tooltip.analogStrength", this.state))); + tooltip.add(componentSpacing.plainCopy().append(CreateLang.translateDirect("tooltip.analogStrength", this.state))); return true; } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/ContentObserverBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/ContentObserverBlock.java index 17dd8134a9..d0005a7bb9 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/ContentObserverBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/ContentObserverBlock.java @@ -13,8 +13,8 @@ import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InvManipulationBehaviour; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; @@ -163,7 +163,7 @@ public class ContentObserverBlock extends HorizontalDirectionalBlock implements public Class getTileEntityClass() { return ContentObserverTileEntity.class; } - + @Override public BlockEntityType getTileEntityType() { return AllTileEntities.CONTENT_OBSERVER.get(); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/ContentObserverTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/ContentObserverTileEntity.java index 7d2dc71a21..363b1d0b1d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/ContentObserverTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/ContentObserverTileEntity.java @@ -12,8 +12,8 @@ import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBe import com.simibubi.create.foundation.tileEntity.behaviour.inventory.CapManipulationBehaviourBase.InterfaceProvider; import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InvManipulationBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.inventory.TankManipulationBehaviour; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/FilteredDetectorFilterSlot.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/FilteredDetectorFilterSlot.java index b7436efe05..08921f17ab 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/FilteredDetectorFilterSlot.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/FilteredDetectorFilterSlot.java @@ -3,9 +3,9 @@ package com.simibubi.create.content.logistics.block.redstone; import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.world.level.block.HorizontalDirectionalBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/NixieTubeBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/NixieTubeBlock.java index 6d72a9c41d..197c188d8a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/NixieTubeBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/NixieTubeBlock.java @@ -13,7 +13,7 @@ import com.simibubi.create.content.schematics.ISpecialBlockItemRequirement; import com.simibubi.create.content.schematics.ItemRequirement; import com.simibubi.create.content.schematics.ItemRequirement.ItemUseType; import com.simibubi.create.foundation.block.ITE; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/NixieTubeRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/NixieTubeRenderer.java index 4428908fad..278399247c 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/NixieTubeRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/NixieTubeRenderer.java @@ -9,12 +9,13 @@ import com.simibubi.create.content.logistics.block.redstone.DoubleFaceAttachedBl import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.render.RenderTypes; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.Color; -import com.simibubi.create.foundation.utility.Couple; +import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.utility.theme.Color; +import net.createmod.catnip.utility.Couple; import com.simibubi.create.foundation.utility.DyeHelper; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.ponder.utility.WorldTickHolder; + +import net.createmod.catnip.utility.Iterate; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; @@ -143,7 +144,7 @@ public class NixieTubeRenderer extends SafeTileEntityRenderer getTileEntityClass() { return RedstoneLinkTileEntity.class; } - + @Override public BlockEntityType getTileEntityType() { return AllTileEntities.REDSTONE_LINK.get(); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneLinkFrequencySlot.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneLinkFrequencySlot.java index e3a9526e57..df07b1df0a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneLinkFrequencySlot.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/RedstoneLinkFrequencySlot.java @@ -3,9 +3,9 @@ package com.simibubi.create.content.logistics.block.redstone; import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; import net.minecraft.world.level.block.state.BlockState; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/RoseQuartzLampBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/RoseQuartzLampBlock.java index 9046030dbf..340c9c363d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/RoseQuartzLampBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/RoseQuartzLampBlock.java @@ -9,8 +9,8 @@ import java.util.function.BiConsumer; import com.simibubi.create.content.contraptions.wrench.IWrenchable; import com.simibubi.create.content.logistics.block.diodes.BrassDiodeBlock; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchBlock.java index 8b28fab101..7e7250a118 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchBlock.java @@ -7,9 +7,9 @@ import com.simibubi.create.AllShapes; import com.simibubi.create.AllTileEntities; import com.simibubi.create.content.contraptions.wrench.IWrenchable; import com.simibubi.create.foundation.block.ITE; -import com.simibubi.create.foundation.gui.ScreenOpener; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.gui.ScreenOpener; +import net.createmod.catnip.utility.Iterate; import net.minecraft.client.player.LocalPlayer; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchScreen.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchScreen.java index f6b26b01c2..cc642d4c02 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchScreen.java @@ -3,17 +3,17 @@ package com.simibubi.create.content.logistics.block.redstone; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.logistics.packet.ConfigureStockswitchPacket; -import com.simibubi.create.foundation.gui.AbstractSimiScreen; import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllIcons; -import com.simibubi.create.foundation.gui.element.GuiGameElement; import com.simibubi.create.foundation.gui.widget.IconButton; import com.simibubi.create.foundation.gui.widget.ScrollInput; import com.simibubi.create.foundation.networking.AllPackets; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; -import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.gui.AbstractSimiScreen; +import net.createmod.catnip.gui.element.GuiGameElement; +import net.createmod.catnip.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TextComponent; import net.minecraft.world.item.ItemStack; @@ -25,7 +25,7 @@ public class StockpileSwitchScreen extends AbstractSimiScreen { private IconButton confirmButton; private IconButton flipSignals; - private final Component invertSignal = Lang.translateDirect("gui.stockpile_switch.invert_signal"); + private final Component invertSignal = CreateLang.translateDirect("gui.stockpile_switch.invert_signal"); private final ItemStack renderedItem = new ItemStack(AllBlocks.STOCKPILE_SWITCH.get()); private AllGuiTextures background; @@ -36,7 +36,7 @@ public class StockpileSwitchScreen extends AbstractSimiScreen { private LerpedFloat cursorLane; public StockpileSwitchScreen(StockpileSwitchTileEntity te) { - super(Lang.translateDirect("gui.stockpile_switch.title")); + super(CreateLang.translateDirect("gui.stockpile_switch.title")); background = AllGuiTextures.STOCKSWITCH; this.te = te; lastModification = -1; @@ -44,7 +44,7 @@ public class StockpileSwitchScreen extends AbstractSimiScreen { @Override protected void init() { - setWindowSize(background.width, background.height); + setWindowSize(background.getWidth(), background.getHeight()); setWindowOffset(-20, 0); super.init(); @@ -60,7 +60,7 @@ public class StockpileSwitchScreen extends AbstractSimiScreen { .titled(TextComponent.EMPTY.plainCopy()) .calling(state -> { lastModification = 0; - offBelow.titled(Lang.translateDirect("gui.stockpile_switch.move_to_upper_at", state)); + offBelow.titled(CreateLang.translateDirect("gui.stockpile_switch.move_to_upper_at", state)); if (onAbove.getState() <= state) { onAbove.setState(state + 1); onAbove.onChanged(); @@ -72,7 +72,7 @@ public class StockpileSwitchScreen extends AbstractSimiScreen { .titled(TextComponent.EMPTY.plainCopy()) .calling(state -> { lastModification = 0; - onAbove.titled(Lang.translateDirect("gui.stockpile_switch.move_to_lower_at", state)); + onAbove.titled(CreateLang.translateDirect("gui.stockpile_switch.move_to_lower_at", state)); if (offBelow.getState() >= state) { offBelow.setState(state - 1); offBelow.onChanged(); @@ -87,7 +87,7 @@ public class StockpileSwitchScreen extends AbstractSimiScreen { addRenderableWidget(offBelow); confirmButton = - new IconButton(x + background.width - 33, y + background.height - 24, AllIcons.I_CONFIRM); + new IconButton(x + background.getWidth() - 33, y + background.getHeight() - 24, AllIcons.I_CONFIRM); confirmButton.withCallback(() -> { onClose(); }); @@ -110,16 +110,16 @@ public class StockpileSwitchScreen extends AbstractSimiScreen { AllGuiTextures.STOCKSWITCH_POWERED_LANE.render(ms, x + 36, y + (te.isInverted() ? 18 : 40), this); AllGuiTextures.STOCKSWITCH_UNPOWERED_LANE.render(ms, x + 36, y + (te.isInverted() ? 40 : 18), this); - drawCenteredString(ms, font, title, x + (background.width - 8) / 2, y + 3, 0xFFFFFF); + drawCenteredString(ms, font, title, x + (background.getWidth() - 8) / 2, y + 3, 0xFFFFFF); AllGuiTextures sprite = AllGuiTextures.STOCKSWITCH_INTERVAL; float lowerBound = offBelow.getState(); float upperBound = onAbove.getState(); sprite.bind(); - blit(ms, (int) (x + upperBound) + 37, y + 18, (int) (sprite.startX + upperBound), sprite.startY, - (int) (sprite.width - upperBound), sprite.height); - blit(ms, x + 37, y + 40, sprite.startX, sprite.startY, (int) (lowerBound), sprite.height); + blit(ms, (int) (x + upperBound) + 37, y + 18, (int) (sprite.getStartX() + upperBound), sprite.getStartY(), + (int) (sprite.getWidth() - upperBound), sprite.getHeight()); + blit(ms, x + 37, y + 40, sprite.getStartX(), sprite.getStartY(), (int) (lowerBound), sprite.getHeight()); AllGuiTextures.STOCKSWITCH_ARROW_UP.render(ms, (int) (x + lowerBound + 36) - 2, y + 35, this); AllGuiTextures.STOCKSWITCH_ARROW_DOWN.render(ms, (int) (x + upperBound + 36) - 3, y + 17, this); @@ -127,14 +127,14 @@ public class StockpileSwitchScreen extends AbstractSimiScreen { if (te.currentLevel != -1) { AllGuiTextures cursor = AllGuiTextures.STOCKSWITCH_CURSOR; ms.pushPose(); - ms.translate(Math.min(99, this.cursor.getValue(partialTicks) * sprite.width), + ms.translate(Math.min(99, this.cursor.getValue(partialTicks) * sprite.getWidth()), cursorLane.getValue(partialTicks) * 22, 0); cursor.render(ms, x + 34, y + 19, this); ms.popPose(); } GuiGameElement.of(renderedItem) - .at(x + background.width + 6, y + background.height - 56, -200) + .at(x + background.getWidth() + 6, y + background.getHeight() - 56, -200) .scale(5) .render(ms); } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/vault/ItemVaultItem.java b/src/main/java/com/simibubi/create/content/logistics/block/vault/ItemVaultItem.java index fdd76e9bde..cdb33430dd 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/vault/ItemVaultItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/vault/ItemVaultItem.java @@ -2,8 +2,8 @@ package com.simibubi.create.content.logistics.block.vault; import com.simibubi.create.AllTileEntities; import com.simibubi.create.api.connectivity.ConnectivityHandler; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/logistics/item/LecternControllerRenderer.java b/src/main/java/com/simibubi/create/content/logistics/item/LecternControllerRenderer.java index d56a6ac3d4..b9841c9cdc 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/LecternControllerRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/LecternControllerRenderer.java @@ -5,8 +5,8 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllItems; import com.simibubi.create.foundation.item.render.PartialItemModelRenderer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; -import com.simibubi.create.foundation.utility.AngleHelper; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.block.model.ItemTransforms.TransformType; diff --git a/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerClientHandler.java b/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerClientHandler.java index 25ea8591d4..8938e7fd1d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerClientHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerClientHandler.java @@ -13,14 +13,14 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.AllSoundEvents; -import com.simibubi.create.CreateClient; -import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.linked.LinkBehaviour; import com.simibubi.create.foundation.utility.ControlsUtil; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.CatnipClient; +import net.createmod.catnip.utility.FontHelper; import net.minecraft.ChatFormatting; import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; @@ -187,7 +187,7 @@ public class LinkedControllerClientHandler { VoxelShape shape = mc.level.getBlockState(selectedLocation) .getShape(mc.level, selectedLocation); if (!shape.isEmpty()) - CreateClient.OUTLINER.showAABB("controller", shape.bounds() + CatnipClient.OUTLINER.showAABB("controller", shape.bounds() .move(selectedLocation)) .colored(0xB73C2D) .lineWidth(1 / 16f); @@ -196,7 +196,7 @@ public class LinkedControllerClientHandler { LinkBehaviour linkBehaviour = TileEntityBehaviour.get(mc.level, selectedLocation, LinkBehaviour.TYPE); if (linkBehaviour != null) { AllPackets.channel.sendToServer(new LinkedControllerBindPacket(integer, selectedLocation)); - Lang.translate("linked_controller.key_bound", controls.get(integer) + CreateLang.translate("linked_controller.key_bound", controls.get(integer) .getTranslatedKeyMessage() .getString()) .sendStatus(mc.player); @@ -233,9 +233,9 @@ public class LinkedControllerClientHandler { } List list = new ArrayList<>(); - list.add(Lang.translateDirect("linked_controller.bind_mode") + list.add(CreateLang.translateDirect("linked_controller.bind_mode") .withStyle(ChatFormatting.GOLD)); - list.addAll(TooltipHelper.cutTextComponent(Lang.translateDirect("linked_controller.press_keybind", keys), + list.addAll(FontHelper.cutTextComponent(CreateLang.translateDirect("linked_controller.press_keybind", keys), ChatFormatting.GRAY, ChatFormatting.GRAY)); int width = 0; diff --git a/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerItem.java b/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerItem.java index 9b3ae02e74..6a6d65910d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerItem.java @@ -7,8 +7,8 @@ import com.simibubi.create.AllItems; import com.simibubi.create.content.logistics.RedstoneLinkNetworkHandler; import com.simibubi.create.content.logistics.RedstoneLinkNetworkHandler.Frequency; import com.simibubi.create.foundation.item.render.SimpleCustomRenderer; -import com.simibubi.create.foundation.utility.Couple; +import net.createmod.catnip.utility.Couple; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; diff --git a/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerItemRenderer.java b/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerItemRenderer.java index 76cf1d624b..8746f7b685 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerItemRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerItemRenderer.java @@ -8,10 +8,10 @@ import com.simibubi.create.AllItems; import com.simibubi.create.content.logistics.item.LinkedControllerClientHandler.Mode; import com.simibubi.create.foundation.item.render.CustomRenderedItemModelRenderer; import com.simibubi.create.foundation.item.render.PartialItemModelRenderer; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; -import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.block.model.ItemTransforms; diff --git a/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerScreen.java b/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerScreen.java index 5436e38af2..97aaabf2ec 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerScreen.java @@ -11,11 +11,11 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.container.AbstractSimiContainerScreen; -import com.simibubi.create.foundation.gui.element.GuiGameElement; import com.simibubi.create.foundation.gui.widget.IconButton; import com.simibubi.create.foundation.utility.ControlsUtil; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.gui.element.GuiGameElement; import net.minecraft.ChatFormatting; import net.minecraft.client.renderer.Rect2i; import net.minecraft.network.chat.Component; @@ -37,19 +37,19 @@ public class LinkedControllerScreen extends AbstractSimiContainerScreen { menu.clearContents(); menu.sendClearPacket(); }); - confirmButton = new IconButton(x + background.width - 33, y + background.height - 24, AllIcons.I_CONFIRM); + confirmButton = new IconButton(x + background.getWidth() - 33, y + background.getHeight() - 24, AllIcons.I_CONFIRM); confirmButton.withCallback(() -> { minecraft.player.closeContainer(); }); @@ -57,13 +57,13 @@ public class LinkedControllerScreen extends AbstractSimiContainerScreenat(x + background.width - 4, y + background.height - 56, -200) + .GuiRenderBuilder>at(x + background.getWidth() - 4, y + background.getHeight() - 56, -200) .scale(5) .render(ms); } @@ -109,7 +109,7 @@ public class LinkedControllerScreen extends AbstractSimiContainerScreen addToTooltip(List list, int slot) { if (slot < 0 || slot >= 12) return list; - list.add(Lang.translateDirect("linked_controller.frequency_slot_" + ((slot % 2) + 1), ControlsUtil.getControls() + list.add(CreateLang.translateDirect("linked_controller.frequency_slot_" + ((slot % 2) + 1), ControlsUtil.getControls() .get(slot / 2) .getTranslatedKeyMessage() .getString()) diff --git a/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerServerHandler.java b/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerServerHandler.java index 56962c1c5d..3c4fdba4c0 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerServerHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerServerHandler.java @@ -14,10 +14,10 @@ import com.simibubi.create.content.logistics.IRedstoneLinkable; import com.simibubi.create.content.logistics.RedstoneLinkNetworkHandler.Frequency; import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.tileEntity.behaviour.linked.LinkBehaviour; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.IntAttached; -import com.simibubi.create.foundation.utility.WorldAttached; +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.IntAttached; +import net.createmod.catnip.utility.WorldAttached; import net.minecraft.core.BlockPos; import net.minecraft.world.level.LevelAccessor; @@ -73,8 +73,8 @@ public class LinkedControllerServerHandler { ManualFrequencyEntry entry = new ManualFrequencyEntry(pos, activated); Create.REDSTONE_LINK_NETWORK_HANDLER.addToNetwork(world, entry); list.add(entry); - - for (IRedstoneLinkable linkable : Create.REDSTONE_LINK_NETWORK_HANDLER.getNetworkOf(world, entry)) + + for (IRedstoneLinkable linkable : Create.REDSTONE_LINK_NETWORK_HANDLER.getNetworkOf(world, entry)) if (linkable instanceof LinkBehaviour lb && lb.isListening()) AllAdvancements.LINKED_CONTROLLER.awardTo(world.getPlayerByUUID(uniqueID)); } diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/AbstractFilterScreen.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/AbstractFilterScreen.java index f06e717327..a145db03f2 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/AbstractFilterScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/AbstractFilterScreen.java @@ -12,7 +12,6 @@ import com.simibubi.create.content.logistics.item.filter.FilterScreenPacket.Opti import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.container.AbstractSimiContainerScreen; -import com.simibubi.create.foundation.gui.element.GuiGameElement; import com.simibubi.create.foundation.gui.widget.IconButton; import com.simibubi.create.foundation.gui.widget.Indicator; import com.simibubi.create.foundation.gui.widget.Indicator.State; @@ -20,6 +19,8 @@ import com.simibubi.create.foundation.item.ItemDescription.Palette; import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.networking.AllPackets; +import net.createmod.catnip.gui.element.GuiGameElement; +import net.createmod.catnip.utility.FontHelper; import net.minecraft.client.renderer.Rect2i; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; @@ -40,19 +41,19 @@ public abstract class AbstractFilterScreen ex @Override protected void init() { - setWindowSize(Math.max(background.width, PLAYER_INVENTORY.width), background.height + 4 + PLAYER_INVENTORY.height); + setWindowSize(Math.max(background.getWidth(), PLAYER_INVENTORY.getWidth()), background.getHeight() + 4 + PLAYER_INVENTORY.getHeight()); super.init(); int x = leftPos; int y = topPos; - resetButton = new IconButton(x + background.width - 62, y + background.height - 24, AllIcons.I_TRASH); + resetButton = new IconButton(x + background.getWidth() - 62, y + background.getHeight() - 24, AllIcons.I_TRASH); resetButton.withCallback(() -> { menu.clearContents(); contentsCleared(); menu.sendClearPacket(); }); - confirmButton = new IconButton(x + background.width - 33, y + background.height - 24, AllIcons.I_CONFIRM); + confirmButton = new IconButton(x + background.getWidth() - 33, y + background.getHeight() - 24, AllIcons.I_CONFIRM); confirmButton.withCallback(() -> { minecraft.player.closeContainer(); }); @@ -61,24 +62,24 @@ public abstract class AbstractFilterScreen ex addRenderableWidget(confirmButton); extraAreas = ImmutableList.of( - new Rect2i(x + background.width, y + background.height - 40, 80, 48) + new Rect2i(x + background.getWidth(), y + background.getHeight() - 40, 80, 48) ); } @Override protected void renderBg(PoseStack ms, float partialTicks, int mouseX, int mouseY) { - int invX = getLeftOfCentered(PLAYER_INVENTORY.width); - int invY = topPos + background.height + 4; + int invX = getLeftOfCentered(PLAYER_INVENTORY.getWidth()); + int invY = topPos + background.getHeight() + 4; renderPlayerInventory(ms, invX, invY); int x = leftPos; int y = topPos; background.render(ms, x, y, this); - drawCenteredString(ms, font, title, x + (background.width - 8) / 2, y + 3, 0xFFFFFF); + drawCenteredString(ms, font, title, x + (background.getWidth() - 8) / 2, y + 3, 0xFFFFFF); GuiGameElement.of(menu.contentHolder) - .at(x + background.width, y + background.height - 56, -200) + .at(x + background.getWidth(), y + background.getHeight() - 56, -200) .scale(5) .render(ms); } @@ -142,7 +143,7 @@ public abstract class AbstractFilterScreen ex if (!button.isHoveredOrFocused()) return; List tip = button.getToolTip(); - tip.addAll(TooltipHelper.cutTextComponent(tooltip, GRAY, GRAY)); + tip.addAll(FontHelper.cutTextComponent(tooltip, GRAY, GRAY)); } protected void contentsCleared() {} diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterContainer.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterContainer.java index 2ab82ce707..1f7fa4db21 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterContainer.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterContainer.java @@ -4,7 +4,7 @@ import java.util.ArrayList; import java.util.List; import com.simibubi.create.AllContainerTypes; -import com.simibubi.create.foundation.utility.Pair; +import net.createmod.catnip.utility.Pair; import net.minecraft.ChatFormatting; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterScreen.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterScreen.java index fb5488ccb1..394721315e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterScreen.java @@ -15,8 +15,8 @@ import com.simibubi.create.foundation.gui.widget.Indicator; import com.simibubi.create.foundation.gui.widget.Label; import com.simibubi.create.foundation.gui.widget.SelectionScrollInput; import com.simibubi.create.foundation.networking.AllPackets; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.Pair; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.Pair; import net.minecraft.ChatFormatting; import net.minecraft.nbt.CompoundTag; @@ -30,19 +30,19 @@ public class AttributeFilterScreen extends AbstractFilterScreen 3) { @@ -111,10 +111,10 @@ public class FilterItem extends Item implements MenuProvider { WhitelistMode whitelistMode = WhitelistMode.values()[filter.getOrCreateTag() .getInt("WhitelistMode")]; list.add((whitelistMode == WhitelistMode.WHITELIST_CONJ - ? Lang.translateDirect("gui.attribute_filter.allow_list_conjunctive") + ? CreateLang.translateDirect("gui.attribute_filter.allow_list_conjunctive") : whitelistMode == WhitelistMode.WHITELIST_DISJ - ? Lang.translateDirect("gui.attribute_filter.allow_list_disjunctive") - : Lang.translateDirect("gui.attribute_filter.deny_list")).withStyle(ChatFormatting.GOLD)); + ? CreateLang.translateDirect("gui.attribute_filter.allow_list_disjunctive") + : CreateLang.translateDirect("gui.attribute_filter.deny_list")).withStyle(ChatFormatting.GOLD)); int count = 0; ListTag attributes = filter.getOrCreateTag() diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterScreen.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterScreen.java index 9bae5a3e67..623bac7ba1 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterScreen.java @@ -8,7 +8,7 @@ import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.widget.IconButton; import com.simibubi.create.foundation.gui.widget.Indicator; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; @@ -19,15 +19,15 @@ public class FilterScreen extends AbstractFilterScreen { private static final String PREFIX = "gui.filter."; - private Component allowN = Lang.translateDirect(PREFIX + "allow_list"); - private Component allowDESC = Lang.translateDirect(PREFIX + "allow_list.description"); - private Component denyN = Lang.translateDirect(PREFIX + "deny_list"); - private Component denyDESC = Lang.translateDirect(PREFIX + "deny_list.description"); + private Component allowN = CreateLang.translateDirect(PREFIX + "allow_list"); + private Component allowDESC = CreateLang.translateDirect(PREFIX + "allow_list.description"); + private Component denyN = CreateLang.translateDirect(PREFIX + "deny_list"); + private Component denyDESC = CreateLang.translateDirect(PREFIX + "deny_list.description"); - private Component respectDataN = Lang.translateDirect(PREFIX + "respect_data"); - private Component respectDataDESC = Lang.translateDirect(PREFIX + "respect_data.description"); - private Component ignoreDataN = Lang.translateDirect(PREFIX + "ignore_data"); - private Component ignoreDataDESC = Lang.translateDirect(PREFIX + "ignore_data.description"); + private Component respectDataN = CreateLang.translateDirect(PREFIX + "respect_data"); + private Component respectDataDESC = CreateLang.translateDirect(PREFIX + "respect_data.description"); + private Component ignoreDataN = CreateLang.translateDirect(PREFIX + "ignore_data"); + private Component ignoreDataDESC = CreateLang.translateDirect(PREFIX + "ignore_data.description"); private IconButton whitelist, blacklist; private IconButton respectNBT, ignoreNBT; diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/ItemAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/ItemAttribute.java index a5353d6a77..9fdb6c9c01 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/ItemAttribute.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/ItemAttribute.java @@ -24,8 +24,9 @@ import com.simibubi.create.content.logistics.item.filter.attribute.astralsorcery import com.simibubi.create.content.logistics.item.filter.attribute.astralsorcery.AstralSorceryAttunementAttribute; import com.simibubi.create.content.logistics.item.filter.attribute.astralsorcery.AstralSorceryCrystalAttribute; import com.simibubi.create.content.logistics.item.filter.attribute.astralsorcery.AstralSorceryPerkGemAttribute; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.lang.Lang; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.resources.ResourceLocation; @@ -122,7 +123,7 @@ public interface ItemAttribute { @OnlyIn(value = Dist.CLIENT) default TranslatableComponent format(boolean inverted) { - return Lang.translateDirect("item_attributes." + getTranslationKey() + (inverted ? ".inverted" : ""), + return CreateLang.translateDirect("item_attributes." + getTranslationKey() + (inverted ? ".inverted" : ""), getTranslationParameters()); } @@ -300,7 +301,7 @@ public interface ItemAttribute { @Override @OnlyIn(value = Dist.CLIENT) public TranslatableComponent format(boolean inverted) { - return Lang.translateDirect("item_attributes." + getTranslationKey() + (inverted ? ".inverted" : ""), + return CreateLang.translateDirect("item_attributes." + getTranslationKey() + (inverted ? ".inverted" : ""), group.getDisplayName()); } diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/ShulkerFillLevelAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/ShulkerFillLevelAttribute.java index 86fca30e04..acc594a16f 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/ShulkerFillLevelAttribute.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/ShulkerFillLevelAttribute.java @@ -8,7 +8,7 @@ import java.util.stream.Collectors; import javax.annotation.Nullable; import com.simibubi.create.content.logistics.item.filter.ItemAttribute; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import net.minecraft.core.NonNullList; import net.minecraft.nbt.CompoundTag; @@ -48,7 +48,7 @@ public class ShulkerFillLevelAttribute implements ItemAttribute { public Object[] getTranslationParameters() { String parameter = ""; if (levels != null) - parameter = Lang.translateDirect("item_attributes." + getTranslationKey() + "." + levels.key).getString(); + parameter = CreateLang.translateDirect("item_attributes." + getTranslationKey() + "." + levels.key).getString(); return new Object[]{parameter}; } 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 5c543536d0..ff3eb942ce 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 @@ -7,10 +7,10 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack.Pose; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.logistics.trains.track.TrackRenderer; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction.Axis; import net.minecraft.core.particles.BlockParticleOption; diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/CameraDistanceModifier.java b/src/main/java/com/simibubi/create/content/logistics/trains/CameraDistanceModifier.java index ce02689f2e..dc289fc8be 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/CameraDistanceModifier.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/CameraDistanceModifier.java @@ -1,7 +1,8 @@ package com.simibubi.create.content.logistics.trains; import com.simibubi.create.foundation.config.AllConfigs; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; + +import net.createmod.catnip.utility.animation.LerpedFloat; public class CameraDistanceModifier { diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/DimensionPalette.java b/src/main/java/com/simibubi/create/content/logistics/trains/DimensionPalette.java index 8ab827f42d..381d9b66b6 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/DimensionPalette.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/DimensionPalette.java @@ -3,8 +3,7 @@ package com.simibubi.create.content.logistics.trains; import java.util.ArrayList; import java.util.List; -import com.simibubi.create.foundation.utility.NBTHelper; - +import net.createmod.catnip.utility.NBTHelper; import net.minecraft.core.Registry; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/GraphLocation.java b/src/main/java/com/simibubi/create/content/logistics/trains/GraphLocation.java index e64513743b..6dc5519c7b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/GraphLocation.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/GraphLocation.java @@ -1,11 +1,11 @@ package com.simibubi.create.content.logistics.trains; -import com.simibubi.create.foundation.utility.Couple; +import net.createmod.catnip.utility.Couple; public class GraphLocation { - + public TrackGraph graph; public Couple edge; public double position; - -} \ No newline at end of file + +} 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 33946c2a50..e3e0b46809 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 @@ -15,9 +15,9 @@ import com.simibubi.create.content.logistics.trains.management.edgePoint.TrackTa import com.simibubi.create.content.logistics.trains.track.BezierTrackPointLocation; import com.simibubi.create.content.logistics.trains.track.TrackBlock; import com.simibubi.create.content.logistics.trains.track.TrackShape; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.Pair; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.Pair; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.AxisDirection; @@ -97,7 +97,7 @@ public interface ITrackBlock { firstLocation.forceNode(); secondLocation.forceNode(); } - + boolean skipFirst = false; boolean skipSecond = false; diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/RailwaySavedData.java b/src/main/java/com/simibubi/create/content/logistics/trains/RailwaySavedData.java index a5b2c1fb38..dfdad12b9d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/RailwaySavedData.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/RailwaySavedData.java @@ -9,8 +9,8 @@ import com.simibubi.create.content.logistics.trains.entity.Train; import com.simibubi.create.content.logistics.trains.management.edgePoint.EdgePointType; import com.simibubi.create.content.logistics.trains.management.edgePoint.signal.SignalBoundary; import com.simibubi.create.content.logistics.trains.management.edgePoint.signal.SignalEdgeGroup; -import com.simibubi.create.foundation.utility.NBTHelper; +import net.createmod.catnip.utility.NBTHelper; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; import net.minecraft.server.MinecraftServer; diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/TrackEdge.java b/src/main/java/com/simibubi/create/content/logistics/trains/TrackEdge.java index d5e3affe07..61078a2995 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/TrackEdge.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/TrackEdge.java @@ -6,8 +6,8 @@ import java.util.Collections; import com.google.common.collect.ImmutableList; import com.simibubi.create.content.logistics.trains.management.edgePoint.EdgeData; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction.Axis; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/TrackGraph.java b/src/main/java/com/simibubi/create/content/logistics/trains/TrackGraph.java index 897713e94d..eee4865961 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/TrackGraph.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/TrackGraph.java @@ -28,12 +28,12 @@ import com.simibubi.create.content.logistics.trains.management.edgePoint.EdgePoi import com.simibubi.create.content.logistics.trains.management.edgePoint.TrackEdgeIntersection; import com.simibubi.create.content.logistics.trains.management.edgePoint.signal.SignalEdgeGroup; import com.simibubi.create.content.logistics.trains.management.edgePoint.signal.TrackEdgePoint; -import com.simibubi.create.foundation.utility.Color; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.NBTHelper; -import com.simibubi.create.foundation.utility.Pair; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.theme.Color; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/TrackGraphHelper.java b/src/main/java/com/simibubi/create/content/logistics/trains/TrackGraphHelper.java index 8400d15019..b49ef2e78a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/TrackGraphHelper.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/TrackGraphHelper.java @@ -10,8 +10,8 @@ import com.simibubi.create.Create; import com.simibubi.create.content.logistics.trains.TrackNodeLocation.DiscoveredLocation; import com.simibubi.create.content.logistics.trains.track.BezierTrackPointLocation; import com.simibubi.create.content.logistics.trains.track.TrackTileEntity; -import com.simibubi.create.foundation.utility.Couple; +import net.createmod.catnip.utility.Couple; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction.AxisDirection; import net.minecraft.world.level.Level; diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/TrackGraphSync.java b/src/main/java/com/simibubi/create/content/logistics/trains/TrackGraphSync.java index 2c52fe5854..527b3d01d0 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/TrackGraphSync.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/TrackGraphSync.java @@ -15,9 +15,9 @@ import com.simibubi.create.content.logistics.trains.management.edgePoint.signal. import com.simibubi.create.content.logistics.trains.management.edgePoint.signal.SignalEdgeGroupPacket; import com.simibubi.create.content.logistics.trains.management.edgePoint.signal.TrackEdgePoint; import com.simibubi.create.foundation.networking.AllPackets; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.Pair; +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.Pair; import net.minecraft.server.level.ServerPlayer; import net.minecraftforge.network.PacketDistributor; diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/TrackGraphSyncPacket.java b/src/main/java/com/simibubi/create/content/logistics/trains/TrackGraphSyncPacket.java index 33e5e0790a..442e9da8e9 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/TrackGraphSyncPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/TrackGraphSyncPacket.java @@ -12,10 +12,10 @@ import com.simibubi.create.Create; import com.simibubi.create.content.logistics.trains.management.edgePoint.EdgeData; import com.simibubi.create.content.logistics.trains.management.edgePoint.EdgePointType; import com.simibubi.create.content.logistics.trains.management.edgePoint.signal.TrackEdgePoint; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.Pair; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.phys.Vec3; @@ -268,4 +268,4 @@ public class TrackGraphSyncPacket extends TrackGraphPacket { updatedEdgeData.put(key, Pair.of(groupType, list)); } -} \ No newline at end of file +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/TrackGraphVisualizer.java b/src/main/java/com/simibubi/create/content/logistics/trains/TrackGraphVisualizer.java index e82b7ec167..ab5195d679 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/TrackGraphVisualizer.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/TrackGraphVisualizer.java @@ -9,15 +9,15 @@ import org.lwjgl.glfw.GLFW; import com.simibubi.create.AllKeys; import com.simibubi.create.Create; -import com.simibubi.create.CreateClient; import com.simibubi.create.content.logistics.trains.management.edgePoint.EdgeData; import com.simibubi.create.content.logistics.trains.management.edgePoint.signal.SignalBoundary; import com.simibubi.create.content.logistics.trains.management.edgePoint.signal.SignalEdgeGroup; import com.simibubi.create.content.logistics.trains.management.edgePoint.signal.TrackEdgePoint; -import com.simibubi.create.foundation.utility.Color; -import com.simibubi.create.foundation.utility.Pair; -import com.simibubi.create.foundation.utility.outliner.Outliner; +import net.createmod.catnip.CatnipClient; +import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.utility.outliner.Outliner; +import net.createmod.catnip.utility.theme.Color; import net.minecraft.client.Minecraft; import net.minecraft.world.entity.Entity; import net.minecraft.world.phys.AABB; @@ -36,7 +36,7 @@ public class TrackGraphVisualizer { return; Vec3 camera = cameraEntity.getEyePosition(); - Outliner outliner = CreateClient.OUTLINER; + Outliner outliner = CatnipClient.OUTLINER; boolean ctrl = false; // AllKeys.isKeyDown(GLFW.GLFW_KEY_LEFT_CONTROL); Map allGroups = Create.RAILWAYS.sided(null).signalEdgeGroups; float width = 1 / 8f; @@ -235,7 +235,7 @@ public class TrackGraphVisualizer { Vec3 yOffset = new Vec3(0, 3 / 16f, 0); Vec3 v1 = location.add(yOffset); Vec3 v2 = v1.add(node.normal.scale(3 / 16f)); - CreateClient.OUTLINER.showLine(Integer.valueOf(node.netId), v1, v2) + CatnipClient.OUTLINER.showLine(Integer.valueOf(node.netId), v1, v2) .colored(Color.mixColors(Color.WHITE, graph.color, 1)) .lineWidth(1 / 8f); @@ -251,7 +251,7 @@ public class TrackGraphVisualizer { if (!edge.node1.location.dimension.equals(edge.node2.location.dimension)) { v1 = location.add(yOffset); v2 = v1.add(node.normal.scale(3 / 16f)); - CreateClient.OUTLINER.showLine(Integer.valueOf(node.netId), v1, v2) + CatnipClient.OUTLINER.showLine(Integer.valueOf(node.netId), v1, v2) .colored(Color.mixColors(Color.WHITE, graph.color, 1)) .lineWidth(1 / 4f); continue; @@ -261,7 +261,7 @@ public class TrackGraphVisualizer { yOffset = new Vec3(0, (other.hashCode() > hashCode ? 6 : 4) / 16f, 0); if (!edge.isTurn()) { - CreateClient.OUTLINER.showLine(edge, edge.getPosition(0) + CatnipClient.OUTLINER.showLine(edge, edge.getPosition(0) .add(yOffset), edge.getPosition(1) .add(yOffset)) @@ -275,7 +275,7 @@ public class TrackGraphVisualizer { for (int i = 0; i <= turn.getSegmentCount(); i++) { Vec3 current = edge.getPosition(i * 1f / turn.getSegmentCount()); if (previous != null) - CreateClient.OUTLINER + CatnipClient.OUTLINER .showLine(Pair.of(edge, previous), previous.add(yOffset), current.add(yOffset)) .colored(graph.color) .lineWidth(1 / 16f); diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/TrackNodeLocation.java b/src/main/java/com/simibubi/create/content/logistics/trains/TrackNodeLocation.java index 4ad5c089d2..944bd87ff6 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/TrackNodeLocation.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/TrackNodeLocation.java @@ -5,8 +5,7 @@ import java.util.HashSet; import java.util.Objects; import java.util.Set; -import com.simibubi.create.foundation.utility.Iterate; - +import net.createmod.catnip.utility.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Vec3i; import net.minecraft.nbt.CompoundTag; @@ -58,7 +57,7 @@ public class TrackNodeLocation extends Vec3i { return equalsIgnoreDim(pOther) && pOther instanceof TrackNodeLocation tnl && Objects.equals(tnl.dimension, dimension); } - + public boolean equalsIgnoreDim(Object pOther) { return super.equals(pOther); } diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/ArrivalSoundQueue.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/ArrivalSoundQueue.java index f96bace94d..2c3400ce34 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/entity/ArrivalSoundQueue.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/ArrivalSoundQueue.java @@ -12,8 +12,8 @@ import com.simibubi.create.AllSoundEvents; import com.simibubi.create.content.contraptions.components.steam.whistle.WhistleBlock; import com.simibubi.create.content.contraptions.components.steam.whistle.WhistleBlock.WhistleSize; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; -import com.simibubi.create.foundation.utility.NBTHelper; -import com.simibubi.create.foundation.utility.Pair; +import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.utility.Pair; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/BogeyInstance.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/BogeyInstance.java index 9a8a6c9c1d..3a1df60072 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/entity/BogeyInstance.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/BogeyInstance.java @@ -9,9 +9,9 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.relays.elementary.ShaftBlock; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.BlockAndTintGetter; @@ -44,7 +44,7 @@ public sealed class BogeyInstance { public void hiddenFrame() { beginFrame(0, null); } - + public void beginFrame(float wheelAngle, PoseStack ms) { if (ms == null) { for (int i : Iterate.zeroAndOne) diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/Carriage.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/Carriage.java index 43fbb12eeb..d6620f222c 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/entity/Carriage.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/Carriage.java @@ -26,11 +26,11 @@ import com.simibubi.create.content.logistics.trains.TrackNodeLocation; import com.simibubi.create.content.logistics.trains.entity.TravellingPoint.IEdgePointListener; import com.simibubi.create.content.logistics.trains.entity.TravellingPoint.ITrackSelector; import com.simibubi.create.foundation.advancement.AllAdvancements; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.NBTHelper; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; @@ -124,7 +124,7 @@ public class Carriage { boolean onTwoBogeys = isOnTwoBogeys(); double stress = train.derailed ? 0 : onTwoBogeys ? bogeySpacing - getAnchorDiff() : 0; blocked = false; - + MutableDouble distanceMoved = new MutableDouble(distance); boolean iterateFromBack = distance < 0; @@ -136,7 +136,7 @@ public class Carriage { CarriageBogey bogey = bogeys.get(actuallyFirstBogey); double bogeyCorrection = stress * (actuallyFirstBogey ? 0.5d : -0.5d); double bogeyStress = bogey.getStress(); - + for (boolean firstWheel : Iterate.trueAndFalse) { boolean actuallyFirstWheel = firstWheel ^ iterateFromBack; TravellingPoint point = bogey.points.get(actuallyFirstWheel); diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageBogey.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageBogey.java index be80158df4..f09df46821 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageBogey.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageBogey.java @@ -7,12 +7,12 @@ import com.simibubi.create.Create; import com.simibubi.create.content.logistics.trains.DimensionPalette; import com.simibubi.create.content.logistics.trains.IBogeyBlock; import com.simibubi.create.content.logistics.trains.TrackGraph; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.VecHelper; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.core.Direction.Axis; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageContraption.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageContraption.java index ad23961913..c0ea4b2721 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageContraption.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageContraption.java @@ -23,12 +23,12 @@ import com.simibubi.create.content.contraptions.components.structureMovement.tra import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock.HeatLevel; import com.simibubi.create.content.logistics.trains.IBogeyBlock; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.NBTHelper; -import com.simibubi.create.foundation.utility.VecHelper; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -71,7 +71,7 @@ public class CarriageContraption extends Contraption { // render public int portalCutoffMin; public int portalCutoffMax; - + static final IItemHandlerModifiable fallbackItems = new ItemStackHandler(); static final IFluidHandler fallbackFluids = new FluidTank(0); @@ -104,9 +104,9 @@ public class CarriageContraption extends Contraption { if (bogeys == 0) return false; if (bogeys > 2) - throw new AssemblyException(Lang.translateDirect("train_assembly.too_many_bogeys", bogeys)); + throw new AssemblyException(CreateLang.translateDirect("train_assembly.too_many_bogeys", bogeys)); if (sidewaysControls) - throw new AssemblyException(Lang.translateDirect("train_assembly.sideways_controls")); + throw new AssemblyException(CreateLang.translateDirect("train_assembly.sideways_controls")); for (BlockPos blazePos : assembledBlazeBurners) for (Direction direction : Iterate.directionsInAxis(assemblyDirection.getAxis())) @@ -235,7 +235,7 @@ public class CarriageContraption extends Contraption { protected MountedStorageManager getStorageForSpawnPacket() { return storageProxy; } - + @Override protected ContraptionType getType() { return ContraptionType.CARRIAGE; diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageContraptionEntity.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageContraptionEntity.java index b4e0a7feae..e2aa26d0f5 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageContraptionEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageContraptionEntity.java @@ -26,11 +26,11 @@ import com.simibubi.create.content.logistics.trains.entity.TravellingPoint.Steer import com.simibubi.create.content.logistics.trains.management.edgePoint.station.GlobalStation; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.networking.AllPackets; -import com.simibubi.create.foundation.utility.Color; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.VecHelper; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.theme.Color; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -532,7 +532,7 @@ public class CarriageContraptionEntity extends OrientedContraptionEntity { @Override public Component getDisplayName() { if (carriage == null) - return Lang.translateDirect("train"); + return CreateLang.translateDirect("train"); return carriage.train.name; } @@ -591,7 +591,7 @@ public class CarriageContraptionEntity extends OrientedContraptionEntity { boolean spaceDown = heldControls.contains(4); GlobalStation currentStation = carriage.train.getCurrentStation(); if (currentStation != null && spaceDown) { - sendPrompt(player, Lang.translateDirect("train.arrived_at", + sendPrompt(player, CreateLang.translateDirect("train.arrived_at", new TextComponent(currentStation.name).withStyle(s -> s.withColor(0x704630))), false); return true; } @@ -603,7 +603,7 @@ public class CarriageContraptionEntity extends OrientedContraptionEntity { if (currentStation != null && targetSpeed != 0) { stationMessage = false; - sendPrompt(player, Lang.translateDirect("train.departing_from", + sendPrompt(player, CreateLang.translateDirect("train.departing_from", new TextComponent(currentStation.name).withStyle(s -> s.withColor(0x704630))), false); } @@ -683,7 +683,7 @@ public class CarriageContraptionEntity extends OrientedContraptionEntity { boolean stationMessage = false; private void displayApproachStationMessage(Player player, GlobalStation station) { - sendPrompt(player, Lang.translateDirect("contraption.controls.approach_station", + sendPrompt(player, CreateLang.translateDirect("contraption.controls.approach_station", new KeybindComponent("key.jump"), station.name), false); stationMessage = true; } diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageContraptionInstance.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageContraptionInstance.java index 4d18e25255..f6252724f5 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageContraptionInstance.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageContraptionInstance.java @@ -7,8 +7,9 @@ import com.jozufozu.flywheel.util.AnimationTickHolder; import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Vector3f; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.Iterate; + +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.Iterate; public class CarriageContraptionInstance extends EntityInstance implements DynamicInstance { diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageCouplingRenderer.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageCouplingRenderer.java index f67a86798d..47a4bd0d6a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageCouplingRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageCouplingRenderer.java @@ -8,9 +8,9 @@ import com.mojang.blaze3d.vertex.VertexConsumer; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.CreateClient; import com.simibubi.create.foundation.render.CachedBufferer; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.AnimationTickHolder; +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.MultiBufferSource; diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageParticles.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageParticles.java index be2e6fe412..d7ec1b9b82 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageParticles.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageParticles.java @@ -3,11 +3,11 @@ package com.simibubi.create.content.logistics.trains.entity; import java.util.Random; import com.simibubi.create.content.logistics.trains.entity.Carriage.DimensionalCarriageEntity; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.VecHelper; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; -import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; import net.minecraft.client.Minecraft; import net.minecraft.core.Direction.Axis; import net.minecraft.core.particles.ParticleTypes; diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageSounds.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageSounds.java index 6d109d1adb..fe1a1e1e68 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageSounds.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageSounds.java @@ -3,9 +3,9 @@ package com.simibubi.create.content.logistics.trains.entity; import com.simibubi.create.AllSoundEvents; import com.simibubi.create.AllSoundEvents.SoundEntry; import com.simibubi.create.content.logistics.trains.entity.Carriage.DimensionalCarriageEntity; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; -import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; import net.minecraft.client.Minecraft; import net.minecraft.client.resources.sounds.AbstractTickableSoundInstance; import net.minecraft.sounds.SoundEvent; diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageSyncData.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageSyncData.java index 1cf7226cb8..ebc17c5bf2 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageSyncData.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageSyncData.java @@ -18,11 +18,11 @@ import com.simibubi.create.content.logistics.trains.TrackGraph; import com.simibubi.create.content.logistics.trains.TrackNode; import com.simibubi.create.content.logistics.trains.entity.Carriage.DimensionalCarriageEntity; import com.simibubi.create.content.logistics.trains.entity.TravellingPoint.ITrackSelector; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.Pair; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.util.Mth; import net.minecraft.world.phys.Vec3; diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/Navigation.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/Navigation.java index dfba07f876..73090dbcda 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/entity/Navigation.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/Navigation.java @@ -31,10 +31,10 @@ import com.simibubi.create.content.logistics.trains.management.edgePoint.signal. import com.simibubi.create.content.logistics.trains.management.edgePoint.signal.SignalEdgeGroup; import com.simibubi.create.content.logistics.trains.management.edgePoint.signal.TrackEdgePoint; import com.simibubi.create.content.logistics.trains.management.edgePoint.station.GlobalStation; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.NBTHelper; -import com.simibubi.create.foundation.utility.Pair; +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.utility.Pair; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; @@ -251,7 +251,7 @@ public class Navigation { return; } } - + topSpeed *= train.throttle; double turnTopSpeed = Math.min(topSpeed, train.maxTurnSpeed()); diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/Train.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/Train.java index 148c06159b..9c38a71531 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/entity/Train.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/Train.java @@ -47,13 +47,13 @@ import com.simibubi.create.content.logistics.trains.management.schedule.Schedule import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.networking.AllPackets; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.NBTHelper; -import com.simibubi.create.foundation.utility.Pair; -import com.simibubi.create.foundation.utility.VecHelper; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -125,7 +125,7 @@ public class Train { public int honkPitch; public float accumulatedSteamRelease; - + int tickOffset; double[] stress; @@ -142,7 +142,7 @@ public class Train { this.carriageSpacing = carriageSpacing; this.icon = TrainIconType.getDefault(); this.stress = new double[carriageSpacing.size()]; - this.name = Lang.translateDirect("train.unnamed"); + this.name = CreateLang.translateDirect("train.unnamed"); this.status = new TrainStatus(this); this.doubleEnded = doubleEnded; @@ -315,7 +315,7 @@ public class Train { entries++; } } - + if (entries > 0) actual = total / entries; @@ -372,7 +372,7 @@ public class Train { toFollowBackward == null ? navigation::control : mp -> mp.follow(toFollowBackward); double totalStress = derailed ? 0 : leadingStress + trailingStress; - + boolean first = i == 0; boolean last = i == carriageCount - 1; int carriageType = first ? last ? Carriage.BOTH : Carriage.FIRST : last ? Carriage.LAST : Carriage.MIDDLE; diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/TrainMigration.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/TrainMigration.java index 31185549eb..e2069fb4c3 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/entity/TrainMigration.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/TrainMigration.java @@ -8,9 +8,9 @@ import com.simibubi.create.content.logistics.trains.TrackEdge; import com.simibubi.create.content.logistics.trains.TrackGraph; import com.simibubi.create.content.logistics.trains.TrackNode; import com.simibubi.create.content.logistics.trains.TrackNodeLocation; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; import net.minecraft.util.Mth; @@ -118,4 +118,4 @@ public class TrainMigration { return trainMigration; } -} \ No newline at end of file +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/TrainPacket.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/TrainPacket.java index fc180a458d..30da25564a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/entity/TrainPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/TrainPacket.java @@ -9,9 +9,9 @@ import java.util.function.Supplier; import com.simibubi.create.CreateClient; import com.simibubi.create.content.logistics.trains.IBogeyBlock; import com.simibubi.create.foundation.networking.SimplePacketBase; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.Iterate; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.world.level.block.Block; diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/TrainRelocationPacket.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/TrainRelocationPacket.java index 614ec29a36..36c6b4a4da 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/entity/TrainRelocationPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/TrainRelocationPacket.java @@ -8,9 +8,9 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Con import com.simibubi.create.content.logistics.trains.track.BezierTrackPointLocation; import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.networking.SimplePacketBase; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.VecHelper; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.network.FriendlyByteBuf; @@ -96,7 +96,7 @@ public class TrainRelocationPacket extends SimplePacketBase { } if (TrainRelocator.relocate(train, sender.level, pos, hoveredBezier, direction, lookAngle, false)) { - sender.displayClientMessage(Lang.translateDirect("train.relocate.success") + sender.displayClientMessage(CreateLang.translateDirect("train.relocate.success") .withStyle(ChatFormatting.GREEN), true); train.carriages.forEach(c -> c.forEachPresentEntity(e -> { e.nonDamageTicks = 10; diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/TrainRelocator.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/TrainRelocator.java index 838a536cc7..773934f74e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/entity/TrainRelocator.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/TrainRelocator.java @@ -14,7 +14,6 @@ import org.apache.commons.lang3.mutable.MutableInt; import com.simibubi.create.AllItems; import com.simibubi.create.Create; -import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionHandlerClient; import com.simibubi.create.content.logistics.trains.GraphLocation; @@ -32,10 +31,11 @@ import com.simibubi.create.content.logistics.trains.track.TrackBlockOutline; import com.simibubi.create.content.logistics.trains.track.TrackBlockOutline.BezierPointSelection; import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.networking.AllPackets; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.Pair; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.CatnipClient; +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.Pair; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; @@ -85,7 +85,7 @@ public class TrainRelocator { if (!player.position() .closerThan(relocatingOrigin, 24) || player.isSteppingCarefully()) { relocatingTrain = null; - player.displayClientMessage(Lang.translateDirect("train.relocate.abort") + player.displayClientMessage(CreateLang.translateDirect("train.relocate.abort") .withStyle(ChatFormatting.RED), true); return; } @@ -119,7 +119,7 @@ public class TrainRelocator { for (int i = 0; i < toVisualise.size() - 1; i++) { Vec3 vec1 = toVisualise.get(i); Vec3 vec2 = toVisualise.get(i + 1); - CreateClient.OUTLINER.showLine(Pair.of(relocating, i), vec1.add(0, -.925f, 0), vec2.add(0, -.925f, 0)) + CatnipClient.OUTLINER.showLine(Pair.of(relocating, i), vec1.add(0, -.925f, 0), vec2.add(0, -.925f, 0)) .colored(lastHoveredResult || i != toVisualise.size() - 2 ? 0x95CD41 : 0xEA5C2B) .disableNormals() .lineWidth(i % 2 == 1 ? 1 / 6f : 1 / 4f); @@ -150,7 +150,7 @@ public class TrainRelocator { boolean direction = bezierSelection != null && lookAngle.dot(bezierSelection.direction()) < 0; boolean result = relocate(relocating, mc.level, blockPos, hoveredBezier, direction, lookAngle, true); if (!simulate && result) { - relocating.carriages.forEach(c -> c.forEachPresentEntity(e -> e.nonDamageTicks = 10)); + relocating.carriages.forEach(c -> c.forEachPresentEntity(e -> e.nonDamageTicks = 10)); AllPackets.channel.sendToServer(new TrainRelocationPacket(relocatingTrain, blockPos, hoveredBezier, direction, lookAngle, relocatingEntityId)); } @@ -267,7 +267,7 @@ public class TrainRelocator { @OnlyIn(Dist.CLIENT) public static void visualise(Train train, int i, Vec3 v1, Vec3 v2, boolean valid) { - CreateClient.OUTLINER.showLine(Pair.of(train, i), v1.add(0, -.825f, 0), v2.add(0, -.825f, 0)) + CatnipClient.OUTLINER.showLine(Pair.of(train, i), v1.add(0, -.825f, 0), v2.add(0, -.825f, 0)) .colored(valid ? 0x95CD41 : 0xEA5C2B) .disableNormals() .lineWidth(i % 2 == 1 ? 1 / 6f : 1 / 4f); @@ -296,14 +296,14 @@ public class TrainRelocator { if (entity instanceof AbstractContraptionEntity ce && Math.abs(ce.getPosition(0) .subtract(ce.getPosition(1)) .lengthSqr()) > 1 / 1024d) { - player.displayClientMessage(Lang.translateDirect("train.cannot_relocate_moving") + player.displayClientMessage(CreateLang.translateDirect("train.cannot_relocate_moving") .withStyle(ChatFormatting.RED), true); relocatingTrain = null; return; } if (!AllItems.WRENCH.isIn(player.getMainHandItem())) { - player.displayClientMessage(Lang.translateDirect("train.relocate.abort") + player.displayClientMessage(CreateLang.translateDirect("train.relocate.abort") .withStyle(ChatFormatting.RED), true); relocatingTrain = null; return; @@ -311,19 +311,19 @@ public class TrainRelocator { if (!player.position() .closerThan(relocatingOrigin, 24)) { - player.displayClientMessage(Lang.translateDirect("train.relocate.too_far") + player.displayClientMessage(CreateLang.translateDirect("train.relocate.too_far") .withStyle(ChatFormatting.RED), true); return; } Boolean success = relocateClient(relocating, true); if (success == null) - player.displayClientMessage(Lang.translateDirect("train.relocate", relocating.name), true); + player.displayClientMessage(CreateLang.translateDirect("train.relocate", relocating.name), true); else if (success.booleanValue()) - player.displayClientMessage(Lang.translateDirect("train.relocate.valid") + player.displayClientMessage(CreateLang.translateDirect("train.relocate.valid") .withStyle(ChatFormatting.GREEN), true); else - player.displayClientMessage(Lang.translateDirect("train.relocate.invalid") + player.displayClientMessage(CreateLang.translateDirect("train.relocate.invalid") .withStyle(ChatFormatting.RED), true); return; } diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/TrainStatus.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/TrainStatus.java index ac30cd36b0..f16b86ad7f 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/entity/TrainStatus.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/TrainStatus.java @@ -3,7 +3,7 @@ package com.simibubi.create.content.logistics.trains.entity; import java.util.ArrayList; import java.util.List; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; @@ -122,7 +122,7 @@ public class TrainStatus { if (owner == null) return; if (owner instanceof Player player) { - player.displayClientMessage(Lang.translateDirect("train.status", train.name) + player.displayClientMessage(CreateLang.translateDirect("train.status", train.name) .withStyle(ChatFormatting.GOLD), false); queued.forEach(c -> player.displayClientMessage(c, false)); } @@ -131,7 +131,7 @@ public class TrainStatus { public void displayInformation(String key, boolean itsAGoodThing, Object... args) { queued.add(new TextComponent(" - ").withStyle(ChatFormatting.GRAY) - .append(Lang.translateDirect("train.status." + key, args) + .append(CreateLang.translateDirect("train.status." + key, args) .withStyle(st -> st.withColor(itsAGoodThing ? 0xD5ECC2 : 0xFFD3B4)))); if (queued.size() > 3) queued.remove(0); diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/TravellingPoint.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/TravellingPoint.java index 194d926a65..1d0b23bd5a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/entity/TravellingPoint.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/TravellingPoint.java @@ -24,9 +24,9 @@ import com.simibubi.create.content.logistics.trains.TrackNode; import com.simibubi.create.content.logistics.trains.TrackNodeLocation; import com.simibubi.create.content.logistics.trains.management.edgePoint.EdgeData; import com.simibubi.create.content.logistics.trains.management.edgePoint.signal.TrackEdgePoint; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.Pair; +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.Pair; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; import net.minecraft.util.Mth; diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/display/FlapDisplayBlock.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/display/FlapDisplayBlock.java index d1b065ffa8..176cd30746 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/display/FlapDisplayBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/display/FlapDisplayBlock.java @@ -14,11 +14,11 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.relays.elementary.ICogWheel; import com.simibubi.create.content.contraptions.wrench.IWrenchable; import com.simibubi.create.foundation.block.ITE; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.placement.IPlacementHelper; -import com.simibubi.create.foundation.utility.placement.PlacementHelpers; -import com.simibubi.create.foundation.utility.placement.PlacementOffset; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.placement.IPlacementHelper; +import net.createmod.catnip.utility.placement.PlacementHelpers; +import net.createmod.catnip.utility.placement.PlacementOffset; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/display/FlapDisplayLayout.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/display/FlapDisplayLayout.java index 192467846b..f11707f073 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/display/FlapDisplayLayout.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/display/FlapDisplayLayout.java @@ -5,8 +5,7 @@ import java.util.List; import org.apache.commons.lang3.mutable.MutableInt; -import com.simibubi.create.foundation.utility.NBTHelper; - +import net.createmod.catnip.utility.NBTHelper; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/display/FlapDisplayRenderer.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/display/FlapDisplayRenderer.java index f4902659bf..675a7eb9dc 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/display/FlapDisplayRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/display/FlapDisplayRenderer.java @@ -13,9 +13,9 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.AnimationTickHolder; +import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.ponder.utility.WorldTickHolder; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.font.FontSet; @@ -89,7 +89,7 @@ public class FlapDisplayRenderer extends KineticTileEntityRenderer { for (int i = 0; i < line.size(); i++) { FlapDisplaySection section = line.get(i); renderOutput.nextSection(section); - int ticks = AnimationTickHolder.getTicks(te.getLevel()); + int ticks = WorldTickHolder.getTicks(te.getLevel()); String text = section.renderCharsIndividually() || !section.spinning[0] ? section.text : section.cyclingOptions[((ticks / 3) + i * 13) % section.cyclingOptions.length]; StringDecomposer.iterateFormatted(text, Style.EMPTY, renderOutput); @@ -143,8 +143,8 @@ public class FlapDisplayRenderer extends KineticTileEntityRenderer { public boolean accept(int charIndex, Style style, int glyph) { FontSet fontset = getFontSet(); - int ticks = paused ? 0 : AnimationTickHolder.getTicks(level); - float time = paused ? 0 : AnimationTickHolder.getRenderTime(level); + int ticks = paused ? 0 : WorldTickHolder.getTicks(level); + float time = paused ? 0 : WorldTickHolder.getRenderTime(level); float dim = 1; if (section.renderCharsIndividually() && section.spinning[Math.min(charIndex, section.spinning.length)]) { diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/display/FlapDisplaySection.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/display/FlapDisplaySection.java index 4481a80ca2..0405294ebc 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/display/FlapDisplaySection.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/display/FlapDisplaySection.java @@ -6,9 +6,9 @@ import java.util.Map; import com.google.common.base.Strings; import com.simibubi.create.Create; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.NBTHelper; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.NBTHelper; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.util.Mth; @@ -89,11 +89,11 @@ public class FlapDisplaySection { int max = Math.max(4, (int) (cyclingOptions.length * 1.75f)); if (spinningTicks > max) return 0; - + spinningTicks++; if (spinningTicks <= max && spinningTicks < 2) return spinningTicks == 1 ? 0 : spinning.length; - + int spinningFlaps = 0; for (int i = 0; i < spinning.length; i++) { int increasingChance = Mth.clamp(8 - spinningTicks, 1, 10); @@ -107,11 +107,11 @@ public class FlapDisplaySection { spinning[i + 1] &= continueSpin; if (spinningTicks > max) spinning[i] = false; - + if (spinning[i]) spinningFlaps++; } - + return spinningFlaps; } @@ -170,9 +170,9 @@ public class FlapDisplaySection { } public static String[] getFlapCycle(String key) { - return LOADED_FLAP_CYCLES.computeIfAbsent(key, k -> Lang.translateDirect("flap_display.cycles." + key) + return LOADED_FLAP_CYCLES.computeIfAbsent(key, k -> CreateLang.translateDirect("flap_display.cycles." + key) .getString() .split(";")); } -} \ No newline at end of file +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/display/FlapDisplayTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/display/FlapDisplayTileEntity.java index 37b7abb9ae..8a4b5dfa11 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/display/FlapDisplayTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/display/FlapDisplayTileEntity.java @@ -10,8 +10,8 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.utility.DyeHelper; import com.simibubi.create.foundation.utility.DynamicComponent; -import com.simibubi.create.foundation.utility.NBTHelper; +import net.createmod.catnip.utility.NBTHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; @@ -168,7 +168,7 @@ public class FlapDisplayTileEntity extends KineticTileEntity { colour[lineIndex] = color == DyeColor.WHITE ? null : color; notifyUpdate(); } - + public void setGlowing(int lineIndex) { glowingLines[lineIndex] = true; notifyUpdate(); @@ -205,7 +205,7 @@ public class FlapDisplayTileEntity extends KineticTileEntity { for (int j = 0; j < manualLines.length; j++) if (manualLines[j]) NBTHelper.putMarker(tag, "CustomLine" + j); - + for (int j = 0; j < glowingLines.length; j++) if (glowingLines[j]) NBTHelper.putMarker(tag, "GlowingLine" + j); @@ -234,7 +234,7 @@ public class FlapDisplayTileEntity extends KineticTileEntity { manualLines = new boolean[ySize * 2]; for (int i = 0; i < ySize * 2; i++) manualLines[i] = tag.contains("CustomLine" + i); - + glowingLines = new boolean[ySize * 2]; for (int i = 0; i < ySize * 2; i++) glowingLines[i] = tag.contains("GlowingLine" + i); @@ -321,9 +321,9 @@ public class FlapDisplayTileEntity extends KineticTileEntity { : DyeHelper.DYE_TABLE.get(color) .getFirst() | 0xFF_000000; } - + public boolean isLineGlowing(int line) { return glowingLines[line]; } - + } diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/CurvedTrackSelectionPacket.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/CurvedTrackSelectionPacket.java index f248780f25..958e1bc4a9 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/CurvedTrackSelectionPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/CurvedTrackSelectionPacket.java @@ -8,7 +8,7 @@ import com.simibubi.create.content.logistics.trains.management.edgePoint.TrackTa import com.simibubi.create.content.logistics.trains.track.BezierTrackPointLocation; import com.simibubi.create.content.logistics.trains.track.TrackTileEntity; import com.simibubi.create.foundation.networking.TileEntityConfigurationPacket; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; @@ -62,7 +62,7 @@ public class CurvedTrackSelectionPacket extends TileEntityConfigurationPacket result.setValue(overlap)); if (result.getValue().feedback != null) { - player.displayClientMessage(Lang.translateDirect(result.getValue().feedback) + player.displayClientMessage(CreateLang.translateDirect(result.getValue().feedback) .withStyle(ChatFormatting.RED), true); AllSoundEvents.DENY.play(player.level, null, pos, .5f, 1); return; @@ -90,7 +90,7 @@ public class CurvedTrackSelectionPacket extends TileEntityConfigurationPacket result.setValue(overlap)); if (result.getValue().feedback != null) { - player.displayClientMessage(Lang.translateDirect(result.getValue().feedback) + player.displayClientMessage(CreateLang.translateDirect(result.getValue().feedback) .withStyle(ChatFormatting.RED), true); AllSoundEvents.DENY.play(level, null, pos, .5f, 1); return InteractionResult.FAIL; @@ -98,14 +98,14 @@ public class TrackTargetingBlockItem extends BlockItem { stackTag.put("SelectedPos", NbtUtils.writeBlockPos(pos)); stackTag.putBoolean("SelectedDirection", front); stackTag.remove("Bezier"); - player.displayClientMessage(Lang.translateDirect("track_target.set"), true); + player.displayClientMessage(CreateLang.translateDirect("track_target.set"), true); stack.setTag(stackTag); AllSoundEvents.CONTROLLER_CLICK.play(level, null, pos, 1, 1); return InteractionResult.SUCCESS; } if (!stack.hasTag()) { - player.displayClientMessage(Lang.translateDirect("track_target.missing") + player.displayClientMessage(CreateLang.translateDirect("track_target.missing") .withStyle(ChatFormatting.RED), true); return InteractionResult.FAIL; } @@ -121,7 +121,7 @@ public class TrackTargetingBlockItem extends BlockItem { boolean bezier = tag.contains("Bezier"); if (!selectedPos.closerThan(placedPos, bezier ? 64 + 16 : 16)) { - player.displayClientMessage(Lang.translateDirect("track_target.too_far") + player.displayClientMessage(CreateLang.translateDirect("track_target.too_far") .withStyle(ChatFormatting.RED), true); return InteractionResult.FAIL; } @@ -139,12 +139,12 @@ public class TrackTargetingBlockItem extends BlockItem { ItemStack itemInHand = player.getItemInHand(pContext.getHand()); if (!itemInHand.isEmpty()) itemInHand.setTag(null); - player.displayClientMessage(Lang.translateDirect("track_target.success") + player.displayClientMessage(CreateLang.translateDirect("track_target.success") .withStyle(ChatFormatting.GREEN), true); - + if (type == EdgePointType.SIGNAL) AllAdvancements.SIGNAL.awardTo(player); - + return useOn; } diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/TrackTargetingClient.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/TrackTargetingClient.java index 94f6290681..d804d8f2cd 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/TrackTargetingClient.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/TrackTargetingClient.java @@ -10,8 +10,8 @@ import com.simibubi.create.content.logistics.trains.management.edgePoint.TrackTa import com.simibubi.create.content.logistics.trains.track.BezierTrackPointLocation; import com.simibubi.create.content.logistics.trains.track.TrackBlockOutline; import com.simibubi.create.content.logistics.trains.track.TrackBlockOutline.BezierPointSelection; -import com.simibubi.create.foundation.render.SuperRenderTypeBuffer; +import net.createmod.catnip.render.SuperRenderTypeBuffer; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; import net.minecraft.client.renderer.LevelRenderer; diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/EdgeGroupColor.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/EdgeGroupColor.java index 6c0161ec18..0528181912 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/EdgeGroupColor.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/EdgeGroupColor.java @@ -1,6 +1,6 @@ package com.simibubi.create.content.logistics.trains.management.edgePoint.signal; -import com.simibubi.create.foundation.utility.Color; +import net.createmod.catnip.utility.theme.Color; public enum EdgeGroupColor { @@ -30,7 +30,7 @@ public enum EdgeGroupColor { return mask; return mask | this.mask; } - + public Color get() { return color; } @@ -38,7 +38,7 @@ public enum EdgeGroupColor { public static EdgeGroupColor getDefault() { return values()[0]; } - + public static EdgeGroupColor findNextAvailable(int mask) { EdgeGroupColor[] values = values(); for (int i = 0; i < values.length; i++) { diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/SignalBlock.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/SignalBlock.java index 15dd4fadd4..e702522f17 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/SignalBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/SignalBlock.java @@ -7,8 +7,9 @@ import javax.annotation.Nullable; import com.simibubi.create.AllTileEntities; import com.simibubi.create.content.contraptions.wrench.IWrenchable; import com.simibubi.create.foundation.block.ITE; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.lang.Lang; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; @@ -108,10 +109,10 @@ public class SignalBlock extends Block implements ITE, IWrench if (signal != null) { signal.cycleSignalType(pos); if (player != null) - player.displayClientMessage(Lang.translateDirect("track_signal.mode_change." + signal.getTypeFor(pos) + player.displayClientMessage(CreateLang.translateDirect("track_signal.mode_change." + signal.getTypeFor(pos) .getSerializedName()), true); } else if (player != null) - player.displayClientMessage(Lang.translateDirect("track_signal.cannot_change_mode"), true); + player.displayClientMessage(CreateLang.translateDirect("track_signal.cannot_change_mode"), true); }); return InteractionResult.SUCCESS; } diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/SignalBoundary.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/SignalBoundary.java index 6d57f86e21..9727f2f894 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/SignalBoundary.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/SignalBoundary.java @@ -14,10 +14,10 @@ import com.simibubi.create.content.logistics.trains.management.edgePoint.EdgePoi import com.simibubi.create.content.logistics.trains.management.edgePoint.signal.SignalBlock.SignalType; import com.simibubi.create.content.logistics.trains.management.edgePoint.signal.SignalTileEntity.OverlayState; import com.simibubi.create.content.logistics.trains.management.edgePoint.signal.SignalTileEntity.SignalState; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.NBTHelper; +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.NBTHelper; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/SignalEdgeGroup.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/SignalEdgeGroup.java index 3f84a6f47a..f2828d8179 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/SignalEdgeGroup.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/SignalEdgeGroup.java @@ -13,7 +13,7 @@ import org.apache.commons.lang3.mutable.MutableInt; import com.google.common.base.Predicates; import com.simibubi.create.Create; import com.simibubi.create.content.logistics.trains.entity.Train; -import com.simibubi.create.foundation.utility.NBTHelper; +import net.createmod.catnip.utility.NBTHelper; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; @@ -29,7 +29,7 @@ public class SignalEdgeGroup { public Map intersecting; public Set intersectingResolved; public Set adjacent; - + public boolean fallbackGroup; public SignalEdgeGroup(UUID id) { @@ -40,7 +40,7 @@ public class SignalEdgeGroup { intersectingResolved = new HashSet<>(); color = EdgeGroupColor.getDefault(); } - + public SignalEdgeGroup asFallback() { fallbackGroup = true; return this; diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/SignalPropagator.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/SignalPropagator.java index 6eaf4319f6..f1581b665e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/SignalPropagator.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/SignalPropagator.java @@ -20,9 +20,9 @@ import com.simibubi.create.content.logistics.trains.TrackNodeLocation; import com.simibubi.create.content.logistics.trains.entity.Train; import com.simibubi.create.content.logistics.trains.management.edgePoint.EdgeData; import com.simibubi.create.content.logistics.trains.management.edgePoint.EdgePointType; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.Pair; +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.Pair; public class SignalPropagator { diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/SignalRenderer.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/SignalRenderer.java index 0be8feda63..506ec06b93 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/SignalRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/SignalRenderer.java @@ -9,7 +9,7 @@ import com.simibubi.create.content.logistics.trains.management.edgePoint.signal. import com.simibubi.create.content.logistics.trains.management.edgePoint.signal.SignalTileEntity.SignalState; import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; -import com.simibubi.create.foundation.utility.AnimationTickHolder; +import net.createmod.ponder.utility.WorldTickHolder; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; @@ -30,7 +30,7 @@ public class SignalRenderer extends SafeTileEntityRenderer { SignalState signalState = te.getState(); OverlayState overlayState = te.getOverlay(); - float renderTime = AnimationTickHolder.getRenderTime(te.getLevel()); + float renderTime = WorldTickHolder.getRenderTime(te.getLevel()); if (signalState.isRedLight(renderTime)) CachedBufferer.partial(AllBlockPartials.SIGNAL_ON, blockState) .renderInto(ms, buffer.getBuffer(RenderType.solid())); diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/SignalTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/SignalTileEntity.java index 68bccc274e..3910a33890 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/SignalTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/SignalTileEntity.java @@ -11,7 +11,7 @@ import com.simibubi.create.content.logistics.trains.management.edgePoint.TrackTa import com.simibubi.create.content.logistics.trains.management.edgePoint.signal.SignalBlock.SignalType; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.utility.NBTHelper; +import net.createmod.catnip.utility.NBTHelper; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; @@ -109,7 +109,7 @@ public class SignalTileEntity extends SmartTileEntity implements ITransformableT boundary.updateTilePower(this); notifyUpdate(); }); - + blockState.getOptionalValue(SignalBlock.TYPE) .ifPresent(stateType -> { SignalType targetType = boundary.getTypeFor(worldPosition); diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/TrackEdgePoint.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/TrackEdgePoint.java index acfaa54eb7..0ec69784e7 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/TrackEdgePoint.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/TrackEdgePoint.java @@ -11,8 +11,8 @@ import com.simibubi.create.content.logistics.trains.TrackNodeLocation; import com.simibubi.create.content.logistics.trains.management.edgePoint.EdgePointType; import com.simibubi.create.content.logistics.trains.management.edgePoint.TrackTargetingBehaviour; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.utility.Couple; +import net.createmod.catnip.utility.Couple; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/AbstractStationScreen.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/AbstractStationScreen.java index ed32075aee..0848f263ce 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/AbstractStationScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/AbstractStationScreen.java @@ -10,12 +10,13 @@ import com.simibubi.create.CreateClient; import com.simibubi.create.content.logistics.trains.entity.Carriage; import com.simibubi.create.content.logistics.trains.entity.Train; import com.simibubi.create.content.logistics.trains.entity.TrainIconType; -import com.simibubi.create.foundation.gui.AbstractSimiScreen; import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllIcons; -import com.simibubi.create.foundation.gui.element.GuiGameElement; +import com.simibubi.create.foundation.gui.element.PartialModelGuiElement; import com.simibubi.create.foundation.gui.widget.IconButton; +import net.createmod.catnip.gui.AbstractSimiScreen; +import net.createmod.catnip.gui.element.GuiGameElement; import net.minecraft.world.level.block.state.properties.BlockStateProperties; public abstract class AbstractStationScreen extends AbstractSimiScreen { @@ -39,14 +40,14 @@ public abstract class AbstractStationScreen extends AbstractSimiScreen { @Override protected void init() { - setWindowSize(background.width, background.height); + setWindowSize(background.getWidth(), background.getHeight()); super.init(); clearWidgets(); int x = guiLeft; int y = guiTop; - confirmButton = new IconButton(x + background.width - 33, y + background.height - 24, AllIcons.I_CONFIRM); + confirmButton = new IconButton(x + background.getWidth() - 33, y + background.getHeight() - 24, AllIcons.I_CONFIRM); confirmButton.withCallback(this::onClose); addRenderableWidget(confirmButton); } @@ -81,7 +82,7 @@ public abstract class AbstractStationScreen extends AbstractSimiScreen { ms.pushPose(); TransformStack msr = TransformStack.cast(ms); msr.pushPose() - .translate(x + background.width + 4, y + background.height + 4, 100) + .translate(x + background.getWidth() + 4, y + background.getHeight() + 4, 100) .scale(40) .rotateX(-22) .rotateY(63); @@ -92,7 +93,7 @@ public abstract class AbstractStationScreen extends AbstractSimiScreen { if (te.resolveFlagAngle()) { msr.translate(1 / 16f, -19 / 16f, -12 / 16f); StationRenderer.transformFlag(msr, te, partialTicks, 180, false); - GuiGameElement.of(getFlag(partialTicks)) + PartialModelGuiElement.of(getFlag(partialTicks)) .render(ms); } diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/AssemblyScreen.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/AssemblyScreen.java index c7dc735806..a9d71a8d4d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/AssemblyScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/AssemblyScreen.java @@ -15,7 +15,7 @@ import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.widget.IconButton; import com.simibubi.create.foundation.gui.widget.ScrollInput; import com.simibubi.create.foundation.networking.AllPackets; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import net.minecraft.client.gui.components.Widget; import net.minecraft.network.chat.MutableComponent; @@ -38,18 +38,18 @@ public class AssemblyScreen extends AbstractStationScreen { super.init(); int x = guiLeft; int y = guiTop; - int by = y + background.height - 24; + int by = y + background.getHeight() - 24; Widget widget = renderables.get(0); if (widget instanceof IconButton ib) { ib.setIcon(AllIcons.I_PRIORITY_VERY_LOW); - ib.setToolTip(Lang.translateDirect("station.close")); + ib.setToolTip(CreateLang.translateDirect("station.close")); } iconTypes = TrainIconType.REGISTRY.keySet() .stream() .toList(); - iconTypeScroll = new ScrollInput(x + 4, y + 17, 184, 14).titled(Lang.translateDirect("station.icon_type")); + iconTypeScroll = new ScrollInput(x + 4, y + 17, 184, 14).titled(CreateLang.translateDirect("station.icon_type")); iconTypeScroll.withRange(0, iconTypes.size()); iconTypeScroll.withStepFunction(ctx -> -iconTypeScroll.standardStep() .apply(ctx)); @@ -63,14 +63,14 @@ public class AssemblyScreen extends AbstractStationScreen { toggleAssemblyButton = new WideIconButton(x + 94, by, AllGuiTextures.I_ASSEMBLE_TRAIN); toggleAssemblyButton.active = false; - toggleAssemblyButton.setToolTip(Lang.translateDirect("station.assemble_train")); + toggleAssemblyButton.setToolTip(CreateLang.translateDirect("station.assemble_train")); toggleAssemblyButton.withCallback(() -> { AllPackets.channel.sendToServer(StationEditPacket.tryAssemble(te.getBlockPos())); }); quitAssembly = new IconButton(x + 73, by, AllIcons.I_DISABLE); quitAssembly.active = true; - quitAssembly.setToolTip(Lang.translateDirect("station.cancel")); + quitAssembly.setToolTip(CreateLang.translateDirect("station.cancel")); quitAssembly.withCallback(() -> { AllPackets.channel.sendToServer(StationEditPacket.configure(te.getBlockPos(), false, station.name)); minecraft.setScreen(new StationScreen(te, station)); @@ -102,7 +102,7 @@ public class AssemblyScreen extends AbstractStationScreen { displayedTrain = new WeakReference<>(null); quitAssembly.active = true; iconTypeScroll.active = iconTypeScroll.visible = false; - toggleAssemblyButton.setToolTip(Lang.translateDirect("station.assemble_train")); + toggleAssemblyButton.setToolTip(CreateLang.translateDirect("station.assemble_train")); toggleAssemblyButton.setIcon(AllGuiTextures.I_ASSEMBLE_TRAIN); toggleAssemblyButton.withCallback(() -> { AllPackets.channel.sendToServer(StationEditPacket.tryAssemble(te.getBlockPos())); @@ -119,36 +119,36 @@ public class AssemblyScreen extends AbstractStationScreen { int x = guiLeft; int y = guiTop; - MutableComponent header = Lang.translateDirect("station.assembly_title"); - font.draw(ms, header, x + background.width / 2 - font.width(header) / 2, y + 4, 0x0E2233); + MutableComponent header = CreateLang.translateDirect("station.assembly_title"); + font.draw(ms, header, x + background.getWidth() / 2 - font.width(header) / 2, y + 4, 0x0E2233); AssemblyException lastAssemblyException = te.lastException; if (lastAssemblyException != null) { - MutableComponent text = Lang.translateDirect("station.failed"); + MutableComponent text = CreateLang.translateDirect("station.failed"); font.draw(ms, text, x + 97 - font.width(text) / 2, y + 47, 0x775B5B); int offset = 0; if (te.failedCarriageIndex != -1) { - font.draw(ms, Lang.translateDirect("station.carriage_number", te.failedCarriageIndex), x + 30, y + 67, + font.draw(ms, CreateLang.translateDirect("station.carriage_number", te.failedCarriageIndex), x + 30, y + 67, 0x7A7A7A); offset += 10; } font.drawWordWrap(lastAssemblyException.component, x + 30, y + 67 + offset, 134, 0x775B5B); offset += font.split(lastAssemblyException.component, 134) .size() * 9 + 5; - font.drawWordWrap(Lang.translateDirect("station.retry"), x + 30, y + 67 + offset, 134, 0x7A7A7A); + font.drawWordWrap(CreateLang.translateDirect("station.retry"), x + 30, y + 67 + offset, 134, 0x7A7A7A); return; } int bogeyCount = te.bogeyCount; - MutableComponent text = Lang.translateDirect( + MutableComponent text = CreateLang.translateDirect( bogeyCount == 0 ? "station.no_bogeys" : bogeyCount == 1 ? "station.one_bogey" : "station.more_bogeys", bogeyCount); font.draw(ms, text, x + 97 - font.width(text) / 2, y + 47, 0x7A7A7A); - font.drawWordWrap(Lang.translateDirect("station.how_to"), x + 28, y + 62, 134, 0x7A7A7A); - font.drawWordWrap(Lang.translateDirect("station.how_to_1"), x + 28, y + 94, 134, 0x7A7A7A); - font.drawWordWrap(Lang.translateDirect("station.how_to_2"), x + 28, y + 117, 138, 0x7A7A7A); + font.drawWordWrap(CreateLang.translateDirect("station.how_to"), x + 28, y + 62, 134, 0x7A7A7A); + font.drawWordWrap(CreateLang.translateDirect("station.how_to_1"), x + 28, y + 94, 134, 0x7A7A7A); + font.drawWordWrap(CreateLang.translateDirect("station.how_to_2"), x + 28, y + 117, 138, 0x7A7A7A); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationBlock.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationBlock.java index 401ae4200d..96823f11d0 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationBlock.java @@ -9,8 +9,8 @@ import com.simibubi.create.content.logistics.block.depot.SharedDepotBlockMethods import com.simibubi.create.foundation.advancement.AdvancementBehaviour; import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.block.ProperWaterloggedBlock; -import com.simibubi.create.foundation.gui.ScreenOpener; +import net.createmod.catnip.gui.ScreenOpener; import net.minecraft.client.player.LocalPlayer; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -69,7 +69,7 @@ public class StationBlock extends Block implements ITE, IWren updateWater(pLevel, pState, pCurrentPos); return pState; } - + @Override public void setPlacedBy(Level pLevel, BlockPos pPos, BlockState pState, LivingEntity pPlacer, ItemStack pStack) { super.setPlacedBy(pLevel, pPos, pState, pPlacer, pStack); diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationEditPacket.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationEditPacket.java index e1ec084c7b..eeaf9f4857 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationEditPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationEditPacket.java @@ -4,8 +4,8 @@ import com.simibubi.create.Create; import com.simibubi.create.content.logistics.trains.GraphLocation; import com.simibubi.create.content.logistics.trains.entity.Train; import com.simibubi.create.foundation.networking.TileEntityConfigurationPacket; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.level.ServerPlayer; diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationScreen.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationScreen.java index 89da131f39..dec6a9f432 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationScreen.java @@ -13,12 +13,12 @@ import com.simibubi.create.content.logistics.trains.entity.Train; import com.simibubi.create.content.logistics.trains.entity.TrainIconType; import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllIcons; -import com.simibubi.create.foundation.gui.UIRenderHelper; import com.simibubi.create.foundation.gui.widget.IconButton; import com.simibubi.create.foundation.networking.AllPackets; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.gui.UIRenderHelper; +import net.createmod.catnip.utility.animation.LerpedFloat; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.components.EditBox; import net.minecraft.network.chat.Component; @@ -57,7 +57,7 @@ public class StationScreen extends AbstractStationScreen { Consumer onTextChanged; onTextChanged = s -> nameBox.x = nameBoxX(s, nameBox); - nameBox = new EditBox(new NoShadowFontWrapper(font), x + 23, y + 4, background.width - 20, 10, + nameBox = new EditBox(new NoShadowFontWrapper(font), x + 23, y + 4, background.getWidth() - 20, 10, new TextComponent(station.name)); nameBox.setBordered(false); nameBox.setMaxLength(25); @@ -92,7 +92,7 @@ public class StationScreen extends AbstractStationScreen { addRenderableWidget(dropScheduleButton); onTextChanged = s -> trainNameBox.x = nameBoxX(s, trainNameBox); - trainNameBox = new EditBox(font, x + 23, y + 47, background.width - 75, 10, new TextComponent("")); + trainNameBox = new EditBox(font, x + 23, y + 47, background.getWidth() - 75, 10, new TextComponent("")); trainNameBox.setBordered(false); trainNameBox.setMaxLength(35); trainNameBox.setTextColor(0xC6C6C6); @@ -154,7 +154,7 @@ public class StationScreen extends AbstractStationScreen { addRenderableWidget(trainNameBox); int trainIconWidth = getTrainIconWidth(imminentTrain); - int targetPos = background.width / 2 - trainIconWidth / 2; + int targetPos = background.getWidth() / 2 - trainIconWidth / 2; if (trainIconWidth > 130) targetPos -= trainIconWidth - 130; float f = (float) (imminentTrain.navigation.distanceToDestination / 15f); @@ -166,14 +166,14 @@ public class StationScreen extends AbstractStationScreen { } int trainIconWidth = getTrainIconWidth(train); - int targetPos = background.width / 2 - trainIconWidth / 2; + int targetPos = background.getWidth() / 2 - trainIconWidth / 2; if (trainIconWidth > 130) targetPos -= trainIconWidth - 130; if (leavingAnimation > 0) { disassembleTrainButton.active = false; float f = 1 - (leavingAnimation / 80f); - trainPosition.setValue(targetPos + f * f * f * (background.width - targetPos + 5)); + trainPosition.setValue(targetPos + f * f * f * (background.getWidth() - targetPos + 5)); leavingAnimation--; if (leavingAnimation > 0) return; @@ -196,7 +196,7 @@ public class StationScreen extends AbstractStationScreen { if (te.trainHasSchedule) dropScheduleButton.setToolTip( - Lang.translateDirect(te.trainHasAutoSchedule ? "station.remove_auto_schedule" : "station.remove_schedule")); + CreateLang.translateDirect(te.trainHasAutoSchedule ? "station.remove_auto_schedule" : "station.remove_schedule")); else dropScheduleButton.getToolTip() .clear(); @@ -206,21 +206,21 @@ public class StationScreen extends AbstractStationScreen { } private int nameBoxX(String s, EditBox nameBox) { - return guiLeft + background.width / 2 - (Math.min(font.width(s), nameBox.getWidth()) + 10) / 2; + return guiLeft + background.getWidth() / 2 - (Math.min(font.width(s), nameBox.getWidth()) + 10) / 2; } private void updateAssemblyTooltip(String key) { if (key == null) { - disassembleTrainButton.setToolTip(Lang.translateDirect("station.disassemble_train")); - newTrainButton.setToolTip(Lang.translateDirect("station.create_train")); + disassembleTrainButton.setToolTip(CreateLang.translateDirect("station.disassemble_train")); + newTrainButton.setToolTip(CreateLang.translateDirect("station.create_train")); return; } for (IconButton ib : new IconButton[] { disassembleTrainButton, newTrainButton }) { List toolTip = ib.getToolTip(); toolTip.clear(); - toolTip.add(Lang.translateDirect("station." + key) + toolTip.add(CreateLang.translateDirect("station." + key) .withStyle(ChatFormatting.GRAY)); - toolTip.add(Lang.translateDirect("station." + key + "_1") + toolTip.add(CreateLang.translateDirect("station." + key + "_1") .withStyle(ChatFormatting.GRAY)); } } @@ -238,7 +238,7 @@ public class StationScreen extends AbstractStationScreen { Train train = displayedTrain.get(); if (train == null) { - MutableComponent header = Lang.translateDirect("station.idle"); + MutableComponent header = CreateLang.translateDirect("station.idle"); font.draw(ms, header, x + 97 - font.width(header) / 2, y + 47, 0x7A7A7A); return; } @@ -254,7 +254,7 @@ public class StationScreen extends AbstractStationScreen { List carriages = train.carriages; for (int i = carriages.size() - 1; i > 0; i--) { RenderSystem.setShaderColor(1, 1, 1, Math.min(1f, - Math.min((position + offset - 10) / 30f, (background.width - 40 - position - offset) / 30f))); + Math.min((position + offset - 10) / 30f, (background.getWidth() - 40 - position - offset) / 30f))); // if (i == carriages.size() - 1 && train.doubleEnded) { // offset += icon.render(TrainIconType.FLIPPED_ENGINE, ms, x + offset, y + 20) + 1; // continue; @@ -264,7 +264,7 @@ public class StationScreen extends AbstractStationScreen { } RenderSystem.setShaderColor(1, 1, 1, - Math.min(1f, Math.min((position + offset - 10) / 30f, (background.width - 40 - position - offset) / 30f))); + Math.min(1f, Math.min((position + offset - 10) / 30f, (background.getWidth() - 40 - position - offset) / 30f))); offset += icon.render(TrainIconType.ENGINE, ms, x + offset, y + 20); RenderSystem.disableBlend(); ms.popPose(); @@ -292,7 +292,7 @@ public class StationScreen extends AbstractStationScreen { @Override public boolean mouseClicked(double pMouseX, double pMouseY, int pButton) { if (!nameBox.isFocused() && pMouseY > guiTop && pMouseY < guiTop + 14 && pMouseX > guiLeft - && pMouseX < guiLeft + background.width) { + && pMouseX < guiLeft + background.getWidth()) { nameBox.setFocus(true); nameBox.setHighlightPos(0); setFocused(nameBox); diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationTileEntity.java index 1c9edc2bd6..cf7adf4a83 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationTileEntity.java @@ -44,13 +44,13 @@ import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.NBTHelper; -import com.simibubi.create.foundation.utility.WorldAttached; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; -import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.utility.WorldAttached; +import net.createmod.catnip.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; @@ -284,7 +284,7 @@ public class StationTileEntity extends SmartTileEntity implements ITransformable ItemStack handItem = player.getItemInHand(hand); if (!player.isCreative() && !AllBlocks.RAILWAY_CASING.isIn(handItem)) { - player.displayClientMessage(Lang.translateDirect("train_assembly.requires_casing"), true); + player.displayClientMessage(CreateLang.translateDirect("train_assembly.requires_casing"), true); return false; } @@ -298,7 +298,7 @@ public class StationTileEntity extends SmartTileEntity implements ITransformable BlockState bogeyAnchor = ProperWaterloggedBlock.withWater(level, track.getBogeyAnchor(level, pos, state), pos); level.setBlock(targetPos, bogeyAnchor, 3); - player.displayClientMessage(Lang.translateDirect("train_assembly.bogey_created"), true); + player.displayClientMessage(CreateLang.translateDirect("train_assembly.bogey_created"), true); SoundType soundtype = bogeyAnchor.getBlock() .getSoundType(state, level, pos, player); level.playSound(null, pos, soundtype.getPlaceSound(), SoundSource.BLOCKS, (soundtype.getVolume() + 1.0F) / 2.0F, @@ -452,7 +452,7 @@ public class StationTileEntity extends SmartTileEntity implements ITransformable return; if (bogeyLocations[0] != 0) { - exception(new AssemblyException(Lang.translateDirect("train_assembly.frontmost_bogey_at_station")), -1); + exception(new AssemblyException(CreateLang.translateDirect("train_assembly.frontmost_bogey_at_station")), -1); return; } @@ -485,7 +485,7 @@ public class StationTileEntity extends SmartTileEntity implements ITransformable break; if (loc - iPrevious < 3) { - exception(new AssemblyException(Lang.translateDirect("train_assembly.bogeys_too_close", i, i + 1)), -1); + exception(new AssemblyException(CreateLang.translateDirect("train_assembly.bogeys_too_close", i, i + 1)), -1); return; } @@ -561,7 +561,7 @@ public class StationTileEntity extends SmartTileEntity implements ITransformable } if (points.size() == 0) { - exception(new AssemblyException(Lang.translateDirect("train_assembly.no_bogeys")), -1); + exception(new AssemblyException(CreateLang.translateDirect("train_assembly.no_bogeys")), -1); return; } @@ -583,7 +583,7 @@ public class StationTileEntity extends SmartTileEntity implements ITransformable atLeastOneForwardControls |= contraption.hasForwardControls(); contraption.setSoundQueueOffset(offset); if (!success) { - exception(new AssemblyException(Lang.translateDirect("train_assembly.nothing_attached", bogeyIndex + 1)), + exception(new AssemblyException(CreateLang.translateDirect("train_assembly.nothing_attached", bogeyIndex + 1)), -1); return; } @@ -602,7 +602,7 @@ public class StationTileEntity extends SmartTileEntity implements ITransformable if (secondBogeyPos != null) { if (bogeyIndex == bogeyCount - 1 || !secondBogeyPos .equals(bogeyPosOffset.relative(assemblyDirection, bogeyLocations[bogeyIndex + 1] + 1))) { - exception(new AssemblyException(Lang.translateDirect("train_assembly.not_connected_in_order")), + exception(new AssemblyException(CreateLang.translateDirect("train_assembly.not_connected_in_order")), contraptions.size() + 1); return; } @@ -613,7 +613,7 @@ public class StationTileEntity extends SmartTileEntity implements ITransformable bogeyIndex++; } else if (!typeOfFirstBogey.allowsSingleBogeyCarriage()) { - exception(new AssemblyException(Lang.translateDirect("train_assembly.single_bogey_carriage")), + exception(new AssemblyException(CreateLang.translateDirect("train_assembly.single_bogey_carriage")), contraptions.size() + 1); return; } @@ -623,7 +623,7 @@ public class StationTileEntity extends SmartTileEntity implements ITransformable } if (!atLeastOneForwardControls) { - exception(new AssemblyException(Lang.translateDirect("train_assembly.no_controls")), -1); + exception(new AssemblyException(CreateLang.translateDirect("train_assembly.no_controls")), -1); return; } diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/WideIconButton.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/WideIconButton.java index 1ea17f9394..90f21aa034 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/WideIconButton.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/WideIconButton.java @@ -2,9 +2,10 @@ package com.simibubi.create.content.logistics.trains.management.edgePoint.statio import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.foundation.gui.AllGuiTextures; -import com.simibubi.create.foundation.gui.element.ScreenElement; import com.simibubi.create.foundation.gui.widget.IconButton; +import net.createmod.catnip.gui.element.ScreenElement; + public class WideIconButton extends IconButton { public WideIconButton(int x, int y, ScreenElement icon) { @@ -14,7 +15,7 @@ public class WideIconButton extends IconButton { @Override protected void drawBg(PoseStack matrixStack, AllGuiTextures button) { super.drawBg(matrixStack, button); - blit(matrixStack, x + 9, y, button.startX + 1, button.startY, button.width - 1, button.height); + blit(matrixStack, x + 9, y, button.getStartX() + 1, button.getStartY(), button.getWidth() - 1, button.getHeight()); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/DestinationSuggestions.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/DestinationSuggestions.java index 43ff18a2b6..59b410c452 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/DestinationSuggestions.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/DestinationSuggestions.java @@ -5,8 +5,8 @@ import java.util.List; import com.mojang.brigadier.context.StringRange; import com.mojang.brigadier.suggestion.Suggestion; -import com.simibubi.create.foundation.utility.IntAttached; +import net.createmod.catnip.utility.IntAttached; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.components.CommandSuggestions; diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/IScheduleInput.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/IScheduleInput.java index 85c1b0fe83..104dd3e606 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/IScheduleInput.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/IScheduleInput.java @@ -7,8 +7,8 @@ import javax.annotation.Nullable; import com.google.common.collect.ImmutableList; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.foundation.gui.ModularGuiLineBuilder; -import com.simibubi.create.foundation.utility.Pair; +import net.createmod.catnip.utility.Pair; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TranslatableComponent; @@ -40,7 +40,7 @@ public interface IScheduleInput { } public default void setItem(int slot, ItemStack stack) {} - + public default ItemStack getItem(int slot) { return ItemStack.EMPTY; } @@ -58,4 +58,4 @@ public interface IScheduleInput { return false; } -} \ No newline at end of file +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/Schedule.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/Schedule.java index dfc6b1f94d..0e5352f845 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/Schedule.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/Schedule.java @@ -19,9 +19,9 @@ import com.simibubi.create.content.logistics.trains.management.schedule.destinat import com.simibubi.create.content.logistics.trains.management.schedule.destination.ChangeTitleInstruction; import com.simibubi.create.content.logistics.trains.management.schedule.destination.DestinationInstruction; import com.simibubi.create.content.logistics.trains.management.schedule.destination.ScheduleInstruction; -import com.simibubi.create.foundation.utility.NBTHelper; -import com.simibubi.create.foundation.utility.Pair; +import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.utility.Pair; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/ScheduleEntry.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/ScheduleEntry.java index 1aeefc7293..a759544aef 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/ScheduleEntry.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/ScheduleEntry.java @@ -5,8 +5,8 @@ import java.util.List; import com.simibubi.create.content.logistics.trains.management.schedule.condition.ScheduleWaitCondition; import com.simibubi.create.content.logistics.trains.management.schedule.destination.ScheduleInstruction; -import com.simibubi.create.foundation.utility.NBTHelper; +import net.createmod.catnip.utility.NBTHelper; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; @@ -46,4 +46,4 @@ public class ScheduleEntry { return entry; } -} \ No newline at end of file +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/ScheduleItem.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/ScheduleItem.java index 9698773e38..e4e666b86b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/ScheduleItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/ScheduleItem.java @@ -10,9 +10,9 @@ import com.simibubi.create.content.logistics.trains.entity.CarriageContraptionEn import com.simibubi.create.content.logistics.trains.entity.Train; import com.simibubi.create.content.logistics.trains.management.schedule.destination.DestinationInstruction; import com.simibubi.create.foundation.advancement.AllAdvancements; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.Couple; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.NonNullList; @@ -98,27 +98,27 @@ public class ScheduleItem extends Item implements MenuProvider { .get(seatIndex); Couple directions = cc.conductorSeats.get(seatPos); if (directions == null) { - pPlayer.displayClientMessage(Lang.translateDirect("schedule.non_controlling_seat"), true); + pPlayer.displayClientMessage(CreateLang.translateDirect("schedule.non_controlling_seat"), true); AllSoundEvents.DENY.playOnServer(pPlayer.level, pPlayer.blockPosition(), 1, 1); return InteractionResult.SUCCESS; } if (train.runtime.getSchedule() != null) { AllSoundEvents.DENY.playOnServer(pPlayer.level, pPlayer.blockPosition(), 1, 1); - pPlayer.displayClientMessage(Lang.translateDirect("schedule.remove_with_empty_hand"), true); + pPlayer.displayClientMessage(CreateLang.translateDirect("schedule.remove_with_empty_hand"), true); return InteractionResult.SUCCESS; } if (schedule.entries.isEmpty()) { AllSoundEvents.DENY.playOnServer(pPlayer.level, pPlayer.blockPosition(), 1, 1); - pPlayer.displayClientMessage(Lang.translateDirect("schedule.no_stops"), true); + pPlayer.displayClientMessage(CreateLang.translateDirect("schedule.no_stops"), true); return InteractionResult.SUCCESS; } train.runtime.setSchedule(schedule, false); AllAdvancements.CONDUCTOR.awardTo(pPlayer); AllSoundEvents.CONFIRM.playOnServer(pPlayer.level, pPlayer.blockPosition(), 1, 1); - pPlayer.displayClientMessage(Lang.translateDirect("schedule.applied_to_train") + pPlayer.displayClientMessage(CreateLang.translateDirect("schedule.applied_to_train") .withStyle(ChatFormatting.GREEN), true); pStack.shrink(1); pPlayer.setItemInHand(pUsedHand, pStack.isEmpty() ? ItemStack.EMPTY : pStack); diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/ScheduleItemRetrieval.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/ScheduleItemRetrieval.java index 3ff2d33954..ca2609e6c0 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/ScheduleItemRetrieval.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/ScheduleItemRetrieval.java @@ -6,9 +6,9 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Con import com.simibubi.create.content.logistics.trains.entity.CarriageContraption; import com.simibubi.create.content.logistics.trains.entity.CarriageContraptionEntity; import com.simibubi.create.content.logistics.trains.entity.Train; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.Couple; import net.minecraft.core.BlockPos; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.Entity; @@ -71,7 +71,7 @@ public class ScheduleItemRetrieval { if (train.runtime.paused && !train.runtime.completed) { train.runtime.paused = false; AllSoundEvents.CONFIRM.playOnServer(player.level, player.blockPosition(), 1, 1); - player.displayClientMessage(Lang.translateDirect("schedule.continued"), true); + player.displayClientMessage(CreateLang.translateDirect("schedule.continued"), true); event.setCanceled(true); return; } @@ -79,14 +79,14 @@ public class ScheduleItemRetrieval { ItemStack itemInHand = player.getItemInHand(event.getHand()); if (!itemInHand.isEmpty()) { AllSoundEvents.DENY.playOnServer(player.level, player.blockPosition(), 1, 1); - player.displayClientMessage(Lang.translateDirect("schedule.remove_with_empty_hand"), true); + player.displayClientMessage(CreateLang.translateDirect("schedule.remove_with_empty_hand"), true); event.setCanceled(true); return; } AllSoundEvents.playItemPickup(player); player.displayClientMessage( - Lang.translateDirect( + CreateLang.translateDirect( train.runtime.isAutoSchedule ? "schedule.auto_removed_from_train" : "schedule.removed_from_train"), true); diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/ScheduleRuntime.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/ScheduleRuntime.java index 476d65322b..f720e2e1a6 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/ScheduleRuntime.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/ScheduleRuntime.java @@ -17,8 +17,8 @@ import com.simibubi.create.content.logistics.trains.management.schedule.destinat import com.simibubi.create.content.logistics.trains.management.schedule.destination.ChangeTitleInstruction; import com.simibubi.create.content.logistics.trains.management.schedule.destination.DestinationInstruction; import com.simibubi.create.content.logistics.trains.management.schedule.destination.ScheduleInstruction; -import com.simibubi.create.foundation.utility.NBTHelper; +import net.createmod.catnip.utility.NBTHelper; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; import net.minecraft.network.chat.MutableComponent; diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/ScheduleScreen.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/ScheduleScreen.java index f1e8a25d3c..52c6dfb7b1 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/ScheduleScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/ScheduleScreen.java @@ -31,22 +31,22 @@ import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.ModularGuiLine; import com.simibubi.create.foundation.gui.ModularGuiLineBuilder; -import com.simibubi.create.foundation.gui.UIRenderHelper; import com.simibubi.create.foundation.gui.container.AbstractSimiContainerScreen; import com.simibubi.create.foundation.gui.container.GhostItemSubmitPacket; -import com.simibubi.create.foundation.gui.element.GuiGameElement; import com.simibubi.create.foundation.gui.widget.IconButton; import com.simibubi.create.foundation.gui.widget.Indicator; import com.simibubi.create.foundation.gui.widget.Indicator.State; import com.simibubi.create.foundation.gui.widget.Label; import com.simibubi.create.foundation.gui.widget.SelectionScrollInput; import com.simibubi.create.foundation.networking.AllPackets; -import com.simibubi.create.foundation.utility.IntAttached; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.Pair; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; -import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.gui.UIRenderHelper; +import net.createmod.catnip.gui.element.GuiGameElement; +import net.createmod.catnip.utility.IntAttached; +import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; @@ -108,11 +108,11 @@ public class ScheduleScreen extends AbstractSimiContainerScreen minecraft.player.closeContainer()); addRenderableWidget(confirmButton); @@ -127,10 +127,10 @@ public class ScheduleScreen extends AbstractSimiContainerScreen tip = cyclicButton.getToolTip(); - tip.add(Lang.translateDirect("schedule.loop")); - tip.add(Lang.translateDirect("schedule.loop1") + tip.add(CreateLang.translateDirect("schedule.loop")); + tip.add(CreateLang.translateDirect("schedule.loop1") .withStyle(ChatFormatting.GRAY)); - tip.add(Lang.translateDirect("schedule.loop2") + tip.add(CreateLang.translateDirect("schedule.loop2") .withStyle(ChatFormatting.GRAY)); addRenderableWidget(cyclicButton); @@ -141,7 +141,7 @@ public class ScheduleScreen extends AbstractSimiContainerScreen 0 && !schedule.entries.isEmpty(); - resetProgress.setToolTip(Lang.translateDirect("schedule.reset")); + resetProgress.setToolTip(CreateLang.translateDirect("schedule.reset")); addRenderableWidget(resetProgress); skipProgress = new IconButton(leftPos + 63, topPos + 202, AllIcons.I_PRIORITY_LOW); @@ -151,11 +151,11 @@ public class ScheduleScreen extends AbstractSimiContainerScreen 0; }); skipProgress.active = schedule.entries.size() > 1; - skipProgress.setToolTip(Lang.translateDirect("schedule.skip")); + skipProgress.setToolTip(CreateLang.translateDirect("schedule.skip")); addRenderableWidget(skipProgress); stopEditing(); - extraAreas = ImmutableList.of(new Rect2i(leftPos + bg.width, topPos + bg.height - 56, 48, 48)); + extraAreas = ImmutableList.of(new Rect2i(leftPos + bg.getWidth(), topPos + bg.getHeight() - 56, 48, 48)); horizontalScrolls.clear(); for (int i = 0; i < schedule.entries.size(); i++) horizontalScrolls.add(LerpedFloat.linear() @@ -194,7 +194,7 @@ public class ScheduleScreen extends AbstractSimiContainerScreen { ScheduleInstruction newlyCreated = Schedule.INSTRUCTION_TYPES.get(index) @@ -219,7 +219,7 @@ public class ScheduleScreen extends AbstractSimiContainerScreen { ScheduleWaitCondition newlyCreated = Schedule.CONDITION_TYPES.get(index) @@ -633,9 +633,9 @@ public class ScheduleScreen extends AbstractSimiContainerScreen 180 && x <= 192) { if (y > 0 && y <= 14) { - renderTooltip(ms, ImmutableList.of(Lang.translateDirect("gui.schedule.remove_entry")), Optional.empty(), + renderTooltip(ms, ImmutableList.of(CreateLang.translateDirect("gui.schedule.remove_entry")), Optional.empty(), mx, my); if (click == 0) { entries.remove(entry); @@ -695,7 +695,7 @@ public class ScheduleScreen extends AbstractSimiContainerScreen cardHeight - 14) { - renderTooltip(ms, ImmutableList.of(Lang.translateDirect("gui.schedule.duplicate")), Optional.empty(), mx, + renderTooltip(ms, ImmutableList.of(CreateLang.translateDirect("gui.schedule.duplicate")), Optional.empty(), mx, my); if (click == 0) { entries.add(entries.indexOf(entry), entry.clone()); @@ -707,7 +707,7 @@ public class ScheduleScreen extends AbstractSimiContainerScreen 194) { if (y > 7 && y <= 20 && i > 0) { - renderTooltip(ms, ImmutableList.of(Lang.translateDirect("gui.schedule.move_up")), Optional.empty(), mx, + renderTooltip(ms, ImmutableList.of(CreateLang.translateDirect("gui.schedule.move_up")), Optional.empty(), mx, my); if (click == 0) { entries.remove(entry); @@ -717,7 +717,7 @@ public class ScheduleScreen extends AbstractSimiContainerScreen 20 && y <= 33 && i < entries.size() - 1) { - renderTooltip(ms, ImmutableList.of(Lang.translateDirect("gui.schedule.move_down")), Optional.empty(), mx, + renderTooltip(ms, ImmutableList.of(CreateLang.translateDirect("gui.schedule.move_down")), Optional.empty(), mx, my); if (click == 0) { entries.remove(entry); @@ -767,7 +767,7 @@ public class ScheduleScreen extends AbstractSimiContainerScreen= 0) { boolean canRemove = conditions.size() > 1 || columns.size() > 1; List components = new ArrayList<>(); - components.add(Lang.translateDirect("schedule.condition_type") + components.add(CreateLang.translateDirect("schedule.condition_type") .withStyle(ChatFormatting.GRAY)); ScheduleWaitCondition condition = conditions.get(row); components.addAll(condition.getTitleAs("condition")); @@ -795,7 +795,7 @@ public class ScheduleScreen extends AbstractSimiContainerScreen 18 * conditions.size() && y <= 18 * conditions.size() + 10 && x >= w / 2 - 5 && x < w / 2 + 5) { - renderTooltip(ms, ImmutableList.of(Lang.translateDirect("gui.schedule.add_condition")), Optional.empty(), + renderTooltip(ms, ImmutableList.of(CreateLang.translateDirect("gui.schedule.add_condition")), Optional.empty(), mx, my); if (click == 0) startEditing(new ScheduledDelay(), confirmed -> { @@ -811,7 +811,7 @@ public class ScheduleScreen extends AbstractSimiContainerScreen 15 || y > 20) return false; - renderTooltip(ms, ImmutableList.of(Lang.translateDirect("gui.schedule.alternative_condition")), Optional.empty(), + renderTooltip(ms, ImmutableList.of(CreateLang.translateDirect("gui.schedule.alternative_condition")), Optional.empty(), mx, my); if (click == 0) startEditing(new ScheduledDelay(), confirmed -> { @@ -827,7 +827,7 @@ public class ScheduleScreen extends AbstractSimiContainerScreen 33 || y > 14) return false; - renderTooltip(ms, ImmutableList.of(Lang.translateDirect("gui.schedule.add_entry")), Optional.empty(), mx, my); + renderTooltip(ms, ImmutableList.of(CreateLang.translateDirect("gui.schedule.add_entry")), Optional.empty(), mx, my); if (click == 0) startEditing(new DestinationInstruction(), confirmed -> { if (!confirmed) @@ -994,7 +994,7 @@ public class ScheduleScreen extends AbstractSimiContainerScreenat(leftPos + AllGuiTextures.SCHEDULE.width, topPos + AllGuiTextures.SCHEDULE.height - 56, + .GuiRenderBuilder>at(leftPos + AllGuiTextures.SCHEDULE.getWidth(), topPos + AllGuiTextures.SCHEDULE.getHeight() - 56, -200) .scale(3) .render(matrixStack); @@ -1023,7 +1023,7 @@ public class ScheduleScreen extends AbstractSimiContainerScreen translatedOptions() { return Arrays.stream(values()) - .map(op -> Lang.translateDirect("schedule.condition.threshold." + Lang.asId(op.name()))) + .map(op -> CreateLang.translateDirect("schedule.condition.threshold." + Lang.asId(op.name()))) .toList(); } } @@ -61,12 +62,12 @@ public abstract class CargoThresholdCondition extends LazyTickedScheduleConditio context.putInt("LastChecked", status); return test(level, train, context); } - + protected void requestStatusToUpdate(int amount, CompoundTag context) { context.putInt("CurrentDisplay", amount); super.requestStatusToUpdate(context); }; - + protected int getLastDisplaySnapshot(CompoundTag context) { if (!context.contains("CurrentDisplay")) return -1; @@ -108,8 +109,8 @@ public abstract class CargoThresholdCondition extends LazyTickedScheduleConditio @Override public List getSecondLineTooltip(int slot) { - return ImmutableList.of(Lang.translateDirect("schedule.condition.threshold.place_item"), - Lang.translateDirect("schedule.condition.threshold.place_item_2") + return ImmutableList.of(CreateLang.translateDirect("schedule.condition.threshold.place_item"), + CreateLang.translateDirect("schedule.condition.threshold.place_item_2") .withStyle(ChatFormatting.GRAY)); } @@ -118,11 +119,11 @@ public abstract class CargoThresholdCondition extends LazyTickedScheduleConditio public void initConfigurationWidgets(ModularGuiLineBuilder builder) { builder.addSelectionScrollInput(0, 24, (i, l) -> { i.forOptions(Ops.translatedOptions()) - .titled(Lang.translateDirect("schedule.condition.threshold.train_holds")) + .titled(CreateLang.translateDirect("schedule.condition.threshold.train_holds")) .format(state -> new TextComponent(" " + Ops.values()[state].formatted)); }, "Operator"); builder.addIntegerTextInput(29, 41, (e, t) -> { }, "Threshold"); } -} \ No newline at end of file +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/condition/FluidThresholdCondition.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/condition/FluidThresholdCondition.java index db595a20d0..57853e3966 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/condition/FluidThresholdCondition.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/condition/FluidThresholdCondition.java @@ -9,8 +9,9 @@ import com.simibubi.create.content.logistics.item.filter.FilterItem; import com.simibubi.create.content.logistics.trains.entity.Carriage; import com.simibubi.create.content.logistics.trains.entity.Train; import com.simibubi.create.foundation.gui.ModularGuiLineBuilder; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.lang.Lang; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.nbt.CompoundTag; @@ -96,12 +97,12 @@ public class FluidThresholdCondition extends CargoThresholdCondition { @Override public List getTitleAs(String type) { return ImmutableList.of( - Lang.translateDirect("schedule.condition.threshold.train_holds", - Lang.translateDirect("schedule.condition.threshold." + Lang.asId(getOperator().name()))), - Lang.translateDirect("schedule.condition.threshold.x_units_of_item", getThreshold(), - Lang.translateDirect("schedule.condition.threshold.buckets"), + CreateLang.translateDirect("schedule.condition.threshold.train_holds", + CreateLang.translateDirect("schedule.condition.threshold." + Lang.asId(getOperator().name()))), + CreateLang.translateDirect("schedule.condition.threshold.x_units_of_item", getThreshold(), + CreateLang.translateDirect("schedule.condition.threshold.buckets"), compareStack.getItem() instanceof FilterItem - ? Lang.translateDirect("schedule.condition.threshold.matching_content") + ? CreateLang.translateDirect("schedule.condition.threshold.matching_content") : loadFluid().getDisplayName()) .withStyle(ChatFormatting.DARK_AQUA)); } @@ -126,7 +127,7 @@ public class FluidThresholdCondition extends CargoThresholdCondition { public void initConfigurationWidgets(ModularGuiLineBuilder builder) { super.initConfigurationWidgets(builder); builder.addSelectionScrollInput(71, 50, (i, l) -> { - i.forOptions(ImmutableList.of(Lang.translateDirect("schedule.condition.threshold.buckets"))) + i.forOptions(ImmutableList.of(CreateLang.translateDirect("schedule.condition.threshold.buckets"))) .titled(null); }, "Measure"); } @@ -137,8 +138,8 @@ public class FluidThresholdCondition extends CargoThresholdCondition { if (lastDisplaySnapshot == -1) return TextComponent.EMPTY.copy(); int offset = getOperator() == Ops.LESS ? -1 : getOperator() == Ops.GREATER ? 1 : 0; - return Lang.translateDirect("schedule.condition.threshold.status", lastDisplaySnapshot, - Math.max(0, getThreshold() + offset), Lang.translateDirect("schedule.condition.threshold.buckets")); + return CreateLang.translateDirect("schedule.condition.threshold.status", lastDisplaySnapshot, + Math.max(0, getThreshold() + offset), CreateLang.translateDirect("schedule.condition.threshold.buckets")); } -} \ No newline at end of file +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/condition/IdleCargoCondition.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/condition/IdleCargoCondition.java index d4801c0cae..e661b1db98 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/condition/IdleCargoCondition.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/condition/IdleCargoCondition.java @@ -3,9 +3,9 @@ package com.simibubi.create.content.logistics.trains.management.schedule.conditi import com.simibubi.create.Create; import com.simibubi.create.content.logistics.trains.entity.Carriage; import com.simibubi.create.content.logistics.trains.entity.Train; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.Pair; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.Pair; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; @@ -13,25 +13,25 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; public class IdleCargoCondition extends TimedWaitCondition { - + @Override public Pair getSummary() { - return Pair.of(ItemStack.EMPTY, Lang.translateDirect("schedule.condition.idle_short", formatTime(true))); + return Pair.of(ItemStack.EMPTY, CreateLang.translateDirect("schedule.condition.idle_short", formatTime(true))); } @Override public ResourceLocation getId() { return Create.asResource("idle"); } - + @Override public boolean tickCompletion(Level level, Train train, CompoundTag context) { int idleTime = Integer.MAX_VALUE; - for (Carriage carriage : train.carriages) + for (Carriage carriage : train.carriages) idleTime = Math.min(idleTime, carriage.storage.getTicksSinceLastExchange()); context.putInt("Time", idleTime); requestDisplayIfNecessary(context, idleTime); return idleTime > totalWaitTicks(); } - -} \ No newline at end of file + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/condition/ItemThresholdCondition.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/condition/ItemThresholdCondition.java index d33b488e23..fcb26a4eb2 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/condition/ItemThresholdCondition.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/condition/ItemThresholdCondition.java @@ -8,8 +8,9 @@ import com.simibubi.create.content.logistics.item.filter.FilterItem; import com.simibubi.create.content.logistics.trains.entity.Carriage; import com.simibubi.create.content.logistics.trains.entity.Train; import com.simibubi.create.foundation.gui.ModularGuiLineBuilder; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.lang.Lang; import net.minecraft.ChatFormatting; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; @@ -93,11 +94,11 @@ public class ItemThresholdCondition extends CargoThresholdCondition { @Override public List getTitleAs(String type) { return ImmutableList.of( - Lang.translateDirect("schedule.condition.threshold.train_holds", - Lang.translateDirect("schedule.condition.threshold." + Lang.asId(getOperator().name()))), - Lang.translateDirect("schedule.condition.threshold.x_units_of_item", getThreshold(), - Lang.translateDirect("schedule.condition.threshold." + (inStacks() ? "stacks" : "items")), - stack.getItem() instanceof FilterItem ? Lang.translateDirect("schedule.condition.threshold.matching_content") + CreateLang.translateDirect("schedule.condition.threshold.train_holds", + CreateLang.translateDirect("schedule.condition.threshold." + Lang.asId(getOperator().name()))), + CreateLang.translateDirect("schedule.condition.threshold.x_units_of_item", getThreshold(), + CreateLang.translateDirect("schedule.condition.threshold." + (inStacks() ? "stacks" : "items")), + stack.getItem() instanceof FilterItem ? CreateLang.translateDirect("schedule.condition.threshold.matching_content") : stack.getHoverName()) .withStyle(ChatFormatting.DARK_AQUA)); } @@ -116,9 +117,9 @@ public class ItemThresholdCondition extends CargoThresholdCondition { public void initConfigurationWidgets(ModularGuiLineBuilder builder) { super.initConfigurationWidgets(builder); builder.addSelectionScrollInput(71, 50, (i, l) -> { - i.forOptions(ImmutableList.of(Lang.translateDirect("schedule.condition.threshold.items"), - Lang.translateDirect("schedule.condition.threshold.stacks"))) - .titled(Lang.translateDirect("schedule.condition.threshold.item_measure")); + i.forOptions(ImmutableList.of(CreateLang.translateDirect("schedule.condition.threshold.items"), + CreateLang.translateDirect("schedule.condition.threshold.stacks"))) + .titled(CreateLang.translateDirect("schedule.condition.threshold.item_measure")); }, "Measure"); } @@ -128,8 +129,8 @@ public class ItemThresholdCondition extends CargoThresholdCondition { if (lastDisplaySnapshot == -1) return TextComponent.EMPTY.copy(); int offset = getOperator() == Ops.LESS ? -1 : getOperator() == Ops.GREATER ? 1 : 0; - return Lang.translateDirect("schedule.condition.threshold.status", lastDisplaySnapshot, + return CreateLang.translateDirect("schedule.condition.threshold.status", lastDisplaySnapshot, Math.max(0, getThreshold() + offset), - Lang.translateDirect("schedule.condition.threshold." + (inStacks() ? "stacks" : "items"))); + CreateLang.translateDirect("schedule.condition.threshold." + (inStacks() ? "stacks" : "items"))); } -} \ No newline at end of file +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/condition/PlayerPassengerCondition.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/condition/PlayerPassengerCondition.java index bc2a90ee0c..4edbbe1d92 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/condition/PlayerPassengerCondition.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/condition/PlayerPassengerCondition.java @@ -7,9 +7,9 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.Create; import com.simibubi.create.content.logistics.trains.entity.Train; import com.simibubi.create.foundation.gui.ModularGuiLineBuilder; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.Pair; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.Pair; import net.minecraft.ChatFormatting; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; @@ -29,7 +29,7 @@ public class PlayerPassengerCondition extends ScheduleWaitCondition { int target = getTarget(); return Pair.of(AllBlocks.SEATS.get(DyeColor.YELLOW) .asStack(), - Lang.translateDirect("schedule.condition.player_count." + (target == 1 ? "summary" : "summary_plural"), target)); + CreateLang.translateDirect("schedule.condition.player_count." + (target == 1 ? "summary" : "summary_plural"), target)); } @Override @@ -48,8 +48,8 @@ public class PlayerPassengerCondition extends ScheduleWaitCondition { @Override public List getTitleAs(String type) { int target = getTarget(); - return ImmutableList.of(Lang.translateDirect("schedule.condition.player_count.seated", - Lang.translateDirect("schedule.condition.player_count." + (target == 1 ? "summary" : "summary_plural"), + return ImmutableList.of(CreateLang.translateDirect("schedule.condition.player_count.seated", + CreateLang.translateDirect("schedule.condition.player_count." + (target == 1 ? "summary" : "summary_plural"), new TextComponent("" + target).withStyle(ChatFormatting.DARK_AQUA)))); } @@ -57,14 +57,14 @@ public class PlayerPassengerCondition extends ScheduleWaitCondition { @OnlyIn(Dist.CLIENT) public void initConfigurationWidgets(ModularGuiLineBuilder builder) { builder.addScrollInput(0, 31, (i, l) -> { - i.titled(Lang.translateDirect("schedule.condition.player_count.players")) + i.titled(CreateLang.translateDirect("schedule.condition.player_count.players")) .withShiftStep(5) .withRange(0, 21); }, "Count"); builder.addSelectionScrollInput(36, 85, (i, l) -> { - i.forOptions(Lang.translatedOptions("schedule.condition.player_count", "exactly", "or_above")) - .titled(Lang.translateDirect("schedule.condition.player_count.condition")); + i.forOptions(CreateLang.translatedOptions("schedule.condition.player_count", "exactly", "or_above")) + .titled(CreateLang.translateDirect("schedule.condition.player_count.condition")); }, "Exact"); } @@ -81,7 +81,7 @@ public class PlayerPassengerCondition extends ScheduleWaitCondition { @Override public MutableComponent getWaitingStatus(Level level, Train train, CompoundTag tag) { - return Lang.translateDirect("schedule.condition.player_count.status", train.countPlayerPassengers(), getTarget()); + return CreateLang.translateDirect("schedule.condition.player_count.status", train.countPlayerPassengers(), getTarget()); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/condition/RedstoneLinkCondition.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/condition/RedstoneLinkCondition.java index 97e8099271..12f2bf8909 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/condition/RedstoneLinkCondition.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/condition/RedstoneLinkCondition.java @@ -8,10 +8,10 @@ import com.simibubi.create.Create; import com.simibubi.create.content.logistics.RedstoneLinkNetworkHandler.Frequency; import com.simibubi.create.content.logistics.trains.entity.Train; import com.simibubi.create.foundation.gui.ModularGuiLineBuilder; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.Pair; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.Pair; import net.minecraft.ChatFormatting; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; @@ -40,20 +40,20 @@ public class RedstoneLinkCondition extends ScheduleWaitCondition { @Override public Pair getSummary() { return Pair.of(AllBlocks.REDSTONE_LINK.asStack(), - lowActivation() ? Lang.translateDirect("schedule.condition.redstone_link_off") - : Lang.translateDirect("schedule.condition.redstone_link_on")); + lowActivation() ? CreateLang.translateDirect("schedule.condition.redstone_link_off") + : CreateLang.translateDirect("schedule.condition.redstone_link_on")); } @Override public List getSecondLineTooltip(int slot) { - return ImmutableList.of(Lang.translateDirect(slot == 0 ? "logistics.firstFrequency" : "logistics.secondFrequency") + return ImmutableList.of(CreateLang.translateDirect(slot == 0 ? "logistics.firstFrequency" : "logistics.secondFrequency") .withStyle(ChatFormatting.RED)); } @Override public List getTitleAs(String type) { return ImmutableList.of( - Lang.translateDirect("schedule.condition.redstone_link.frequency_" + (lowActivation() ? "unpowered" : "powered")), + CreateLang.translateDirect("schedule.condition.redstone_link.frequency_" + (lowActivation() ? "unpowered" : "powered")), new TextComponent(" #1 ").withStyle(ChatFormatting.GRAY) .append(freq.getFirst() .getStack() @@ -114,14 +114,14 @@ public class RedstoneLinkCondition extends ScheduleWaitCondition { @OnlyIn(Dist.CLIENT) public void initConfigurationWidgets(ModularGuiLineBuilder builder) { builder.addSelectionScrollInput(20, 101, - (i, l) -> i.forOptions(Lang.translatedOptions("schedule.condition.redstone_link", "powered", "unpowered")) - .titled(Lang.translateDirect("schedule.condition.redstone_link.frequency_state")), + (i, l) -> i.forOptions(CreateLang.translatedOptions("schedule.condition.redstone_link", "powered", "unpowered")) + .titled(CreateLang.translateDirect("schedule.condition.redstone_link.frequency_state")), "Inverted"); } - + @Override public MutableComponent getWaitingStatus(Level level, Train train, CompoundTag tag) { - return Lang.translateDirect("schedule.condition.redstone_link.status"); + return CreateLang.translateDirect("schedule.condition.redstone_link.status"); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/condition/ScheduleWaitCondition.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/condition/ScheduleWaitCondition.java index a8e307d6a1..4b94496d44 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/condition/ScheduleWaitCondition.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/condition/ScheduleWaitCondition.java @@ -6,8 +6,8 @@ import com.simibubi.create.Create; import com.simibubi.create.content.logistics.trains.entity.Train; import com.simibubi.create.content.logistics.trains.management.schedule.Schedule; import com.simibubi.create.content.logistics.trains.management.schedule.ScheduleDataEntry; -import com.simibubi.create.foundation.utility.Pair; +import net.createmod.catnip.utility.Pair; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.MutableComponent; import net.minecraft.resources.ResourceLocation; @@ -16,11 +16,11 @@ import net.minecraft.world.level.Level; public abstract class ScheduleWaitCondition extends ScheduleDataEntry { public abstract boolean tickCompletion(Level level, Train train, CompoundTag context); - + protected void requestStatusToUpdate(CompoundTag context) { context.putInt("StatusVersion", context.getInt("StatusVersion") + 1); } - + public final CompoundTag write() { CompoundTag tag = new CompoundTag(); tag.putString("Id", getId().toString()); @@ -50,4 +50,4 @@ public abstract class ScheduleWaitCondition extends ScheduleDataEntry { public abstract MutableComponent getWaitingStatus(Level level, Train train, CompoundTag tag); -} \ No newline at end of file +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/condition/ScheduledDelay.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/condition/ScheduledDelay.java index 2b6b9cd15c..8dec83f951 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/condition/ScheduledDelay.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/condition/ScheduledDelay.java @@ -2,9 +2,9 @@ package com.simibubi.create.content.logistics.trains.management.schedule.conditi import com.simibubi.create.Create; import com.simibubi.create.content.logistics.trains.entity.Train; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.Pair; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.Pair; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; @@ -15,7 +15,7 @@ public class ScheduledDelay extends TimedWaitCondition { @Override public Pair getSummary() { - return Pair.of(ItemStack.EMPTY, Lang.translateDirect("schedule.condition.delay_short", formatTime(true))); + return Pair.of(ItemStack.EMPTY, CreateLang.translateDirect("schedule.condition.delay_short", formatTime(true))); } @Override @@ -23,7 +23,7 @@ public class ScheduledDelay extends TimedWaitCondition { int time = context.getInt("Time"); if (time >= totalWaitTicks()) return true; - + context.putInt("Time", time + 1); requestDisplayIfNecessary(context, time); return false; @@ -34,4 +34,4 @@ public class ScheduledDelay extends TimedWaitCondition { return Create.asResource("delay"); } -} \ No newline at end of file +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/condition/StationPoweredCondition.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/condition/StationPoweredCondition.java index 7760bc5853..558bd4880d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/condition/StationPoweredCondition.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/condition/StationPoweredCondition.java @@ -3,9 +3,9 @@ package com.simibubi.create.content.logistics.trains.management.schedule.conditi import com.simibubi.create.Create; import com.simibubi.create.content.logistics.trains.entity.Train; import com.simibubi.create.content.logistics.trains.management.edgePoint.station.GlobalStation; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.Pair; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.Pair; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; @@ -17,9 +17,9 @@ import net.minecraft.world.level.Level; public class StationPoweredCondition extends ScheduleWaitCondition { @Override public Pair getSummary() { - return Pair.of(ItemStack.EMPTY, Lang.translateDirect("schedule.condition.powered")); + return Pair.of(ItemStack.EMPTY, CreateLang.translateDirect("schedule.condition.powered")); } - + @Override public boolean tickCompletion(Level level, Train train, CompoundTag context) { GlobalStation currentStation = train.getCurrentStation(); @@ -44,6 +44,6 @@ public class StationPoweredCondition extends ScheduleWaitCondition { @Override public MutableComponent getWaitingStatus(Level level, Train train, CompoundTag tag) { - return Lang.translateDirect("schedule.condition.powered.status"); + return CreateLang.translateDirect("schedule.condition.powered.status"); } -} \ No newline at end of file +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/condition/StationUnloadedCondition.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/condition/StationUnloadedCondition.java index 8f5ccbd925..211ce9aa9a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/condition/StationUnloadedCondition.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/condition/StationUnloadedCondition.java @@ -3,9 +3,9 @@ package com.simibubi.create.content.logistics.trains.management.schedule.conditi import com.simibubi.create.Create; import com.simibubi.create.content.logistics.trains.entity.Train; import com.simibubi.create.content.logistics.trains.management.edgePoint.station.GlobalStation; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.Pair; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.Pair; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; @@ -17,7 +17,7 @@ import net.minecraft.world.level.Level; public class StationUnloadedCondition extends ScheduleWaitCondition { @Override public Pair getSummary() { - return Pair.of(ItemStack.EMPTY, Lang.translateDirect("schedule.condition.unloaded")); + return Pair.of(ItemStack.EMPTY, CreateLang.translateDirect("schedule.condition.unloaded")); } @Override @@ -25,7 +25,7 @@ public class StationUnloadedCondition extends ScheduleWaitCondition { GlobalStation currentStation = train.getCurrentStation(); if (currentStation == null) return false; - if (level instanceof ServerLevel serverLevel) + if (level instanceof ServerLevel serverLevel) return !serverLevel.isPositionEntityTicking(currentStation.getTilePos()); return false; } @@ -43,6 +43,6 @@ public class StationUnloadedCondition extends ScheduleWaitCondition { @Override public MutableComponent getWaitingStatus(Level level, Train train, CompoundTag tag) { - return Lang.translateDirect("schedule.condition.unloaded.status"); + return CreateLang.translateDirect("schedule.condition.unloaded.status"); } -} \ No newline at end of file +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/condition/TimeOfDayCondition.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/condition/TimeOfDayCondition.java index 1664d7f6d5..19f8cdcd90 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/condition/TimeOfDayCondition.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/condition/TimeOfDayCondition.java @@ -12,9 +12,9 @@ import com.simibubi.create.content.logistics.trains.entity.Train; import com.simibubi.create.foundation.gui.ModularGuiLineBuilder; import com.simibubi.create.foundation.gui.widget.Label; import com.simibubi.create.foundation.gui.widget.ScrollInput; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.Pair; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.Pair; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.GuiComponent; import net.minecraft.nbt.CompoundTag; @@ -74,16 +74,16 @@ public class TimeOfDayCondition extends ScheduleWaitCondition { int hour12raw = hour % 12 == 0 ? 12 : hour % 12; String hr12 = doubleDigitHrs ? twoDigits(hour12raw) : ("" + hour12raw); String hr24 = doubleDigitHrs ? twoDigits(hour) : ("" + hour); - return Lang.translateDirect("schedule.condition.time_of_day.digital_format", hr12, hr24, twoDigits(minute), - hour > 11 ? Lang.translateDirect("generic.daytime.pm") : Lang.translateDirect("generic.daytime.am")); + return CreateLang.translateDirect("schedule.condition.time_of_day.digital_format", hr12, hr24, twoDigits(minute), + hour > 11 ? CreateLang.translateDirect("generic.daytime.pm") : CreateLang.translateDirect("generic.daytime.am")); } @Override public List getTitleAs(String type) { - return ImmutableList.of(Lang.translateDirect("schedule.condition.time_of_day.scheduled"), + return ImmutableList.of(CreateLang.translateDirect("schedule.condition.time_of_day.scheduled"), getDigitalDisplay(intData("Hour"), intData("Minute"), false).withStyle(ChatFormatting.DARK_AQUA) .append(new TextComponent(" -> ").withStyle(ChatFormatting.DARK_GRAY)) - .append(Lang + .append(CreateLang .translatedOptions("schedule.condition.time_of_day.rotation", "every_24", "every_12", "every_6", "every_4", "every_3", "every_2", "every_1", "every_0_45", "every_0_30", "every_0_15") .get(intData("Rotation")) @@ -131,13 +131,13 @@ public class TimeOfDayCondition extends ScheduleWaitCondition { }, "Minute"); builder.addSelectionScrollInput(52, 62, (i, l) -> { - i.forOptions(Lang.translatedOptions("schedule.condition.time_of_day.rotation", "every_24", "every_12", + i.forOptions(CreateLang.translatedOptions("schedule.condition.time_of_day.rotation", "every_24", "every_12", "every_6", "every_4", "every_3", "every_2", "every_1", "every_0_45", "every_0_30", "every_0_15")) - .titled(Lang.translateDirect("schedule.condition.time_of_day.rotation")); + .titled(CreateLang.translateDirect("schedule.condition.time_of_day.rotation")); }, "Rotation"); hourInput.getValue() - .titled(Lang.translateDirect("generic.daytime.hour")) + .titled(CreateLang.translateDirect("generic.daytime.hour")) .calling(t -> { data.putInt("Hour", t); timeLabel.getValue().text = getDigitalDisplay(t, minuteInput.getValue() @@ -147,7 +147,7 @@ public class TimeOfDayCondition extends ScheduleWaitCondition { .withShiftStep(6); minuteInput.getValue() - .titled(Lang.translateDirect("generic.daytime.minute")) + .titled(CreateLang.translateDirect("generic.daytime.minute")) .calling(t -> { data.putInt("Minute", t); timeLabel.getValue().text = getDigitalDisplay(hourInput.getValue() @@ -185,7 +185,7 @@ public class TimeOfDayCondition extends ScheduleWaitCondition { int departingHour = (departureTime / 1000 + 6) % 24; int departingMinute = (departureTime % 1000) * 60 / 1000; - return Lang.translateDirect("schedule.condition.time_of_day.status") + return CreateLang.translateDirect("schedule.condition.time_of_day.status") .append(getDigitalDisplay(departingHour, departingMinute, false)); } diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/condition/TimedWaitCondition.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/condition/TimedWaitCondition.java index 8ea96afbce..12aac1c6f3 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/condition/TimedWaitCondition.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/condition/TimedWaitCondition.java @@ -5,7 +5,7 @@ import java.util.List; import com.google.common.collect.ImmutableList; import com.simibubi.create.content.logistics.trains.entity.Train; import com.simibubi.create.foundation.gui.ModularGuiLineBuilder; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import net.minecraft.ChatFormatting; import net.minecraft.nbt.CompoundTag; @@ -37,7 +37,7 @@ public abstract class TimedWaitCondition extends ScheduleWaitCondition { } public static List translatedOptions() { - return Lang.translatedOptions(null, TICKS.key, SECONDS.key, MINUTES.key); + return CreateLang.translatedOptions(null, TICKS.key, SECONDS.key, MINUTES.key); } } @@ -61,14 +61,14 @@ public abstract class TimedWaitCondition extends ScheduleWaitCondition { protected Component formatTime(boolean compact) { if (compact) return new TextComponent(getValue() + getUnit().suffix); - return new TextComponent(getValue() + " ").append(Lang.translateDirect(getUnit().key)); + return new TextComponent(getValue() + " ").append(CreateLang.translateDirect(getUnit().key)); } @Override public List getTitleAs(String type) { return ImmutableList.of( new TranslatableComponent(getId().getNamespace() + ".schedule." + type + "." + getId().getPath()), - Lang.translateDirect("schedule.condition.for_x_time", formatTime(false)) + CreateLang.translateDirect("schedule.condition.for_x_time", formatTime(false)) .withStyle(ChatFormatting.DARK_AQUA)); } @@ -79,7 +79,7 @@ public abstract class TimedWaitCondition extends ScheduleWaitCondition { @Override public List getSecondLineTooltip(int slot) { - return ImmutableList.of(Lang.translateDirect("generic.duration")); + return ImmutableList.of(CreateLang.translateDirect("generic.duration")); } public int getValue() { @@ -94,7 +94,7 @@ public abstract class TimedWaitCondition extends ScheduleWaitCondition { @OnlyIn(Dist.CLIENT) public void initConfigurationWidgets(ModularGuiLineBuilder builder) { builder.addScrollInput(0, 31, (i, l) -> { - i.titled(Lang.translateDirect("generic.duration")) + i.titled(CreateLang.translateDirect("generic.duration")) .withShiftStep(15) .withRange(0, 121); i.lockedTooltipX = -15; @@ -103,7 +103,7 @@ public abstract class TimedWaitCondition extends ScheduleWaitCondition { builder.addSelectionScrollInput(36, 85, (i, l) -> { i.forOptions(TimeUnit.translatedOptions()) - .titled(Lang.translateDirect("generic.timeUnit")); + .titled(CreateLang.translateDirect("generic.timeUnit")); }, "TimeUnit"); } @@ -116,8 +116,8 @@ public abstract class TimedWaitCondition extends ScheduleWaitCondition { (int) (showInMinutes ? Math.floor(ticksUntilDeparture / (20 * 60f)) : Math.ceil(ticksUntilDeparture / 100f) * 5); String key = "generic." + (showInMinutes ? num == 1 ? "daytime.minute" : "unit.minutes" : num == 1 ? "daytime.second" : "unit.seconds"); - return Lang.translateDirect("schedule.condition." + getId().getPath() + ".status", - new TextComponent(num + " ").append(Lang.translateDirect(key))); + return CreateLang.translateDirect("schedule.condition." + getId().getPath() + ".status", + new TextComponent(num + " ").append(CreateLang.translateDirect(key))); } -} \ No newline at end of file +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/destination/ChangeThrottleInstruction.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/destination/ChangeThrottleInstruction.java index 75fa8801a1..5560c1fa99 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/destination/ChangeThrottleInstruction.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/destination/ChangeThrottleInstruction.java @@ -6,9 +6,9 @@ import com.google.common.collect.ImmutableList; import com.simibubi.create.AllBlocks; import com.simibubi.create.Create; import com.simibubi.create.foundation.gui.ModularGuiLineBuilder; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.Pair; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.Pair; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TextComponent; @@ -23,7 +23,7 @@ public class ChangeThrottleInstruction extends ScheduleInstruction { super(); data.putInt("Value", 100); } - + @Override public Pair getSummary() { return Pair.of(icon(), formatted()); @@ -50,7 +50,7 @@ public class ChangeThrottleInstruction extends ScheduleInstruction { @Override public List getTitleAs(String type) { - return ImmutableList.of(Lang + return ImmutableList.of(CreateLang .translateDirect("schedule." + type + "." + getId().getPath() + ".summary", formatted().withStyle(ChatFormatting.WHITE)) .withStyle(ChatFormatting.GOLD)); @@ -62,7 +62,7 @@ public class ChangeThrottleInstruction extends ScheduleInstruction { builder.addScrollInput(0, 50, (si, l) -> { si.withRange(5, 101) .withStepFunction(c -> c.shift ? 25 : 5) - .titled(Lang.translateDirect("schedule.instruction.throttle_edit_box")); + .titled(CreateLang.translateDirect("schedule.instruction.throttle_edit_box")); l.withSuffix("%"); }, "Value"); } @@ -77,8 +77,8 @@ public class ChangeThrottleInstruction extends ScheduleInstruction { @Override public List getSecondLineTooltip(int slot) { - return ImmutableList.of(Lang.translateDirect("schedule.instruction.throttle_edit_box"), - Lang.translateDirect("schedule.instruction.throttle_edit_box_1") + return ImmutableList.of(CreateLang.translateDirect("schedule.instruction.throttle_edit_box"), + CreateLang.translateDirect("schedule.instruction.throttle_edit_box_1") .withStyle(ChatFormatting.GRAY)); } diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/destination/ChangeTitleInstruction.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/destination/ChangeTitleInstruction.java index 57c1c2f42c..a552151f70 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/destination/ChangeTitleInstruction.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/destination/ChangeTitleInstruction.java @@ -4,9 +4,9 @@ import java.util.List; import com.google.common.collect.ImmutableList; import com.simibubi.create.Create; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.Pair; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.Pair; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TextComponent; @@ -35,7 +35,7 @@ public class ChangeTitleInstruction extends TextScheduleInstruction { public boolean supportsConditions() { return false; } - + public String getScheduleTitle() { return getLabelText(); } @@ -46,10 +46,10 @@ public class ChangeTitleInstruction extends TextScheduleInstruction { @Override public List getSecondLineTooltip(int slot) { - return ImmutableList.of(Lang.translateDirect("schedule.instruction.name_edit_box"), - Lang.translateDirect("schedule.instruction.name_edit_box_1") + return ImmutableList.of(CreateLang.translateDirect("schedule.instruction.name_edit_box"), + CreateLang.translateDirect("schedule.instruction.name_edit_box_1") .withStyle(ChatFormatting.GRAY), - Lang.translateDirect("schedule.instruction.name_edit_box_2") + CreateLang.translateDirect("schedule.instruction.name_edit_box_2") .withStyle(ChatFormatting.DARK_GRAY)); } diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/destination/DestinationInstruction.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/destination/DestinationInstruction.java index 400852fbd4..fe468bd35d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/destination/DestinationInstruction.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/destination/DestinationInstruction.java @@ -7,9 +7,9 @@ import org.apache.commons.lang3.StringUtils; import com.google.common.collect.ImmutableList; import com.simibubi.create.AllBlocks; import com.simibubi.create.Create; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.Pair; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.Pair; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.components.EditBox; import net.minecraft.network.chat.Component; @@ -44,7 +44,7 @@ public class DestinationInstruction extends TextScheduleInstruction { public String getFilter() { return getLabelText(); } - + public String getFilterForRegex() { String filter = getFilter(); if (filter.isBlank()) @@ -54,12 +54,12 @@ public class DestinationInstruction extends TextScheduleInstruction { @Override public List getSecondLineTooltip(int slot) { - return ImmutableList.of(Lang.translateDirect("schedule.instruction.filter_edit_box"), - Lang.translateDirect("schedule.instruction.filter_edit_box_1") + return ImmutableList.of(CreateLang.translateDirect("schedule.instruction.filter_edit_box"), + CreateLang.translateDirect("schedule.instruction.filter_edit_box_1") .withStyle(ChatFormatting.GRAY), - Lang.translateDirect("schedule.instruction.filter_edit_box_2") + CreateLang.translateDirect("schedule.instruction.filter_edit_box_2") .withStyle(ChatFormatting.DARK_GRAY), - Lang.translateDirect("schedule.instruction.filter_edit_box_3") + CreateLang.translateDirect("schedule.instruction.filter_edit_box_3") .withStyle(ChatFormatting.DARK_GRAY)); } @@ -69,4 +69,4 @@ public class DestinationInstruction extends TextScheduleInstruction { box.setFilter(s -> StringUtils.countMatches(s, '*') <= 3); } -} \ No newline at end of file +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/destination/ScheduleInstruction.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/destination/ScheduleInstruction.java index cc35540942..d140b78a50 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/destination/ScheduleInstruction.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/destination/ScheduleInstruction.java @@ -5,8 +5,8 @@ import java.util.function.Supplier; import com.simibubi.create.Create; import com.simibubi.create.content.logistics.trains.management.schedule.Schedule; import com.simibubi.create.content.logistics.trains.management.schedule.ScheduleDataEntry; -import com.simibubi.create.foundation.utility.Pair; +import net.createmod.catnip.utility.Pair; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; @@ -41,4 +41,4 @@ public abstract class ScheduleInstruction extends ScheduleDataEntry { return scheduleDestination; } -} \ No newline at end of file +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/destination/TextScheduleInstruction.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/destination/TextScheduleInstruction.java index b930198696..6bb64fe896 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/destination/TextScheduleInstruction.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/destination/TextScheduleInstruction.java @@ -4,7 +4,7 @@ import java.util.List; import com.google.common.collect.ImmutableList; import com.simibubi.create.foundation.gui.ModularGuiLineBuilder; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.components.EditBox; @@ -21,8 +21,8 @@ public abstract class TextScheduleInstruction extends ScheduleInstruction { @Override public List getTitleAs(String type) { - return ImmutableList.of(Lang.translateDirect("schedule." + type + "." + getId().getPath() + ".summary") - .withStyle(ChatFormatting.GOLD), Lang.translateDirect("generic.in_quotes", new TextComponent(getLabelText()))); + return ImmutableList.of(CreateLang.translateDirect("schedule." + type + "." + getId().getPath() + ".summary") + .withStyle(ChatFormatting.GOLD), CreateLang.translateDirect("generic.in_quotes", new TextComponent(getLabelText()))); } @Override 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 4194b591ee..bdb77bd18c 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 @@ -5,9 +5,9 @@ import com.simibubi.create.AllItems; 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; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.VecHelper; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; @@ -118,7 +118,7 @@ public class CurvedTrackInteraction { ItemStack heldItem = player.getMainHandItem(); Item item = heldItem.getItem(); if (AllBlocks.TRACK.isIn(heldItem)) { - player.displayClientMessage(Lang.translateDirect("track.turn_start") + player.displayClientMessage(CreateLang.translateDirect("track.turn_start") .withStyle(ChatFormatting.RED), true); player.swing(InteractionHand.MAIN_HAND); return true; diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/track/StandardBogeyBlock.java b/src/main/java/com/simibubi/create/content/logistics/trains/track/StandardBogeyBlock.java index 9db10db41c..1b7a571ca8 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/track/StandardBogeyBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/track/StandardBogeyBlock.java @@ -19,9 +19,9 @@ import com.simibubi.create.content.schematics.ItemRequirement.ItemUseType; import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.block.ProperWaterloggedBlock; import com.simibubi.create.foundation.render.CachedBufferer; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/track/StandardBogeyTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/trains/track/StandardBogeyTileEntity.java index 9a4c8a621a..6968fc4583 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/track/StandardBogeyTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/track/StandardBogeyTileEntity.java @@ -2,8 +2,8 @@ package com.simibubi.create.content.logistics.trains.track; import com.simibubi.create.content.logistics.trains.IBogeyBlock; import com.simibubi.create.foundation.tileEntity.CachedRenderBBTileEntity; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.animation.LerpedFloat; import net.minecraft.core.BlockPos; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; @@ -21,13 +21,13 @@ public class StandardBogeyTileEntity extends CachedRenderBBTileEntity { } // Ponder - + LerpedFloat virtualAnimation = LerpedFloat.angular(); - + public float getVirtualAngle(float partialTicks) { return virtualAnimation.getValue(partialTicks); } - + public void animate(float distanceMoved) { BlockState blockState = getBlockState(); if (!(blockState.getBlock() instanceof IBogeyBlock type)) 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 c4b2acb680..1cee9963b9 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 @@ -43,13 +43,13 @@ import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.block.ProperWaterloggedBlock; import com.simibubi.create.foundation.block.render.DestroyProgressRenderingHandler; import com.simibubi.create.foundation.block.render.ReducedDestroyEffects; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.BlockFace; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.Pair; -import com.simibubi.create.foundation.utility.VecHelper; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.BlockFace; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.ChatFormatting; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.LevelRenderer; @@ -287,11 +287,11 @@ public class TrackBlock extends Block Player player = level.getNearestPlayer(pos.getX(), pos.getY(), pos.getZ(), 10, Predicates.alwaysTrue()); if (player == null) return; - player.displayClientMessage(new TextComponent(" ").append(Lang.translateDirect("portal_track.failed")) + player.displayClientMessage(new TextComponent(" ").append(CreateLang.translateDirect("portal_track.failed")) .withStyle(ChatFormatting.GOLD), false); MutableComponent component = - failPos != null ? Lang.translateDirect("portal_track." + fail, failPos.getX(), failPos.getY(), failPos.getZ()) - : Lang.translateDirect("portal_track." + fail); + failPos != null ? CreateLang.translateDirect("portal_track." + fail, failPos.getX(), failPos.getY(), failPos.getZ()) + : CreateLang.translateDirect("portal_track." + fail); player.displayClientMessage(new TextComponent(" - ").withStyle(ChatFormatting.GRAY) .append(component.withStyle(st -> st.withColor(0xFFD3B4))), false); } 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 a8b5929dcd..9baf8a7285 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 @@ -5,10 +5,10 @@ import com.simibubi.create.AllSoundEvents; 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; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.Pair; -import com.simibubi.create.foundation.utility.VecHelper; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; @@ -62,7 +62,7 @@ public class TrackBlockItem extends BlockItem { if (state.getBlock()instanceof TrackBlock track && track.getTrackAxes(level, pos, state) .size() > 1) { if (!level.isClientSide) - player.displayClientMessage(Lang.translateDirect("track.junction_start") + player.displayClientMessage(CreateLang.translateDirect("track.junction_start") .withStyle(ChatFormatting.RED), true); return InteractionResult.SUCCESS; } @@ -75,7 +75,7 @@ public class TrackBlockItem extends BlockItem { } else if (player.isSteppingCarefully()) { if (!level.isClientSide) { - player.displayClientMessage(Lang.translateDirect("track.selection_cleared"), true); + player.displayClientMessage(CreateLang.translateDirect("track.selection_cleared"), true); stack.setTag(null); } else level.playSound(player, pos, SoundEvents.ITEM_FRAME_REMOVE_ITEM, SoundSource.BLOCKS, 0.75f, 1); @@ -101,7 +101,7 @@ public class TrackBlockItem extends BlockItem { PlacementInfo info = TrackPlacement.tryConnect(level, player, pos, state, stack, hasGirder, extend); if (info.message != null && !level.isClientSide) - player.displayClientMessage(Lang.translateDirect(info.message), true); + player.displayClientMessage(CreateLang.translateDirect(info.message), true); if (!info.valid) { AllSoundEvents.DENY.playFrom(player, 1, 1); return InteractionResult.FAIL; 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 0417825dde..14baafb25b 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 @@ -11,13 +11,13 @@ import com.mojang.blaze3d.vertex.VertexConsumer; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; import com.simibubi.create.content.logistics.trains.BezierConnection; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.RaycastHelper; -import com.simibubi.create.foundation.utility.VecHelper; -import com.simibubi.create.foundation.utility.WorldAttached; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.WorldAttached; +import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.ponder.utility.WorldTickHolder; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; import net.minecraft.client.renderer.MultiBufferSource; @@ -56,7 +56,7 @@ public class TrackBlockOutline { if (mc.level == null) return; - Vec3 origin = player.getEyePosition(AnimationTickHolder.getPartialTicks(mc.level)); + Vec3 origin = player.getEyePosition(WorldTickHolder.getPartialTicks(mc.level)); double maxRange = mc.hitResult == null ? Double.MAX_VALUE : mc.hitResult.getLocation() 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 7bb371ede6..1cc112a620 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,9 +20,9 @@ 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.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.Iterate; import net.minecraft.client.renderer.RenderType; import net.minecraft.core.BlockPos; @@ -38,7 +38,7 @@ public class TrackInstance extends BlockEntityInstance { @Override public void update() { - if (blockEntity.connections.isEmpty()) + if (blockEntity.connections.isEmpty()) return; remove(); diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackPaver.java b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackPaver.java index 9c70d7ca6f..ffa2745329 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackPaver.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackPaver.java @@ -10,10 +10,10 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.content.curiosities.girder.GirderBlock; import com.simibubi.create.content.logistics.trains.BezierConnection; import com.simibubi.create.foundation.block.ProperWaterloggedBlock; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.Pair; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -124,7 +124,7 @@ public class TrackPaver { float[] lut = bc.getStepLUT(); for (int i = 0; i < segCount; i++) { - float t = i == segCount ? 1 : i * lut[i] / segCount; + float t = i * lut[i] / segCount; t += 0.5f / segCount; Vec3 result = VecHelper.bezier(end1, end2, finish1, finish2, t); 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 246e2fe165..5aae156624 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 @@ -9,21 +9,21 @@ import java.util.Set; import com.jozufozu.flywheel.util.Color; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllSpecialTextures; -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.ITrackBlock; import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.block.ProperWaterloggedBlock; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.Pair; -import com.simibubi.create.foundation.utility.VecHelper; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; -import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.CatnipClient; +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; @@ -279,10 +279,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) @@ -443,10 +443,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); } @@ -609,17 +609,17 @@ public class TrackPlacement { BlueprintOverlayRenderer.displayTrackRequirements(info, player.getOffhandItem()); if (info.valid) - player.displayClientMessage(Lang.translateDirect("track.valid_connection") + player.displayClientMessage(CreateLang.translateDirect("track.valid_connection") .withStyle(ChatFormatting.GREEN), true); else if (info.message != null) - player.displayClientMessage(Lang.translateDirect(info.message) + player.displayClientMessage(CreateLang.translateDirect(info.message) .withStyle(info.message.equals("track.second_point") ? ChatFormatting.WHITE : ChatFormatting.RED), true); 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; @@ -636,11 +636,11 @@ public class TrackPlacement { } if (hints != null && !hints.either(Collection::isEmpty)) { - CreateClient.OUTLINER.showCluster("track_valid", hints.getFirst()) + CatnipClient.OUTLINER.showCluster("track_valid", hints.getFirst()) .withFaceTexture(AllSpecialTextures.THIN_CHECKERED) .colored(0x95CD41) .lineWidth(0); - CreateClient.OUTLINER.showCluster("track_invalid", hints.getSecond()) + CatnipClient.OUTLINER.showCluster("track_invalid", hints.getSecond()) .withFaceTexture(AllSpecialTextures.THIN_CHECKERED) .colored(0xEA5C2B) .lineWidth(0); @@ -720,13 +720,13 @@ public class TrackPlacement { .scale(0.5f); Vec3 middle2 = rail2.add(previous2) .scale(0.5f); - CreateClient.OUTLINER + CatnipClient.OUTLINER .showLine(Pair.of(key, i * 2), VecHelper.lerp(s, middle1, previous1), VecHelper.lerp(s, middle1, rail1)) .colored(railcolor) .disableNormals() .lineWidth(lw); - CreateClient.OUTLINER + CatnipClient.OUTLINER .showLine(Pair.of(key, i * 2 + 1), VecHelper.lerp(s, middle2, previous2), VecHelper.lerp(s, middle2, rail2)) .colored(railcolor) @@ -739,8 +739,8 @@ public class TrackPlacement { } for (int i = segCount + 1; i <= lastLineCount; i++) { - CreateClient.OUTLINER.remove(Pair.of(key, i * 2)); - CreateClient.OUTLINER.remove(Pair.of(key, i * 2 + 1)); + CatnipClient.OUTLINER.remove(Pair.of(key, i * 2)); + CatnipClient.OUTLINER.remove(Pair.of(key, i * 2 + 1)); } lastLineCount = segCount; @@ -749,7 +749,7 @@ public class TrackPlacement { @OnlyIn(Dist.CLIENT) private static void line(int id, Vec3 v1, Vec3 o1, Vec3 ex) { int color = Color.mixColors(0xEA5C2B, 0x95CD41, animation.getValue()); - CreateClient.OUTLINER.showLine(Pair.of("start", id), v1.subtract(o1), v1.add(ex)) + CatnipClient.OUTLINER.showLine(Pair.of("start", id), v1.subtract(o1), v1.add(ex)) .lineWidth(1 / 8f) .disableNormals() .colored(color); 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 1ee412ea0d..bbe999bc52 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 @@ -17,10 +17,10 @@ import com.simibubi.create.content.logistics.trains.BezierConnection.GirderAngle import com.simibubi.create.content.logistics.trains.BezierConnection.SegmentAngles; import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackShape.java b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackShape.java index 0c3e2332b3..8567a7d961 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackShape.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackShape.java @@ -5,8 +5,8 @@ import java.util.List; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; -import com.simibubi.create.foundation.utility.Lang; +import net.createmod.catnip.utility.lang.Lang; import net.minecraft.core.Direction; import net.minecraft.util.StringRepresentable; import net.minecraft.world.level.block.Mirror; @@ -161,4 +161,4 @@ public enum TrackShape implements StringRepresentable { return shape; } -} \ No newline at end of file +} 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 80cae8969a..beb2e7b4e3 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 @@ -20,9 +20,9 @@ import com.simibubi.create.foundation.tileEntity.IMergeableTE; import com.simibubi.create.foundation.tileEntity.RemoveTileEntityPacket; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.utility.Pair; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction.Axis; import net.minecraft.core.Registry; diff --git a/src/main/java/com/simibubi/create/content/palettes/AllPaletteStoneTypes.java b/src/main/java/com/simibubi/create/content/palettes/AllPaletteStoneTypes.java index c395138493..aeebf7d03e 100644 --- a/src/main/java/com/simibubi/create/content/palettes/AllPaletteStoneTypes.java +++ b/src/main/java/com/simibubi/create/content/palettes/AllPaletteStoneTypes.java @@ -8,9 +8,9 @@ import java.util.function.Function; import com.simibubi.create.AllTags; import com.simibubi.create.Create; import com.simibubi.create.foundation.data.CreateRegistrate; -import com.simibubi.create.foundation.utility.Lang; import com.tterrag.registrate.util.nullness.NonNullSupplier; +import net.createmod.catnip.utility.lang.Lang; import net.minecraft.tags.TagKey; import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; diff --git a/src/main/java/com/simibubi/create/content/palettes/ConnectedPillarBlock.java b/src/main/java/com/simibubi/create/content/palettes/ConnectedPillarBlock.java index 2a7e7011f8..1f5be362a7 100644 --- a/src/main/java/com/simibubi/create/content/palettes/ConnectedPillarBlock.java +++ b/src/main/java/com/simibubi/create/content/palettes/ConnectedPillarBlock.java @@ -2,8 +2,7 @@ package com.simibubi.create.content.palettes; import java.util.Random; -import com.simibubi.create.foundation.utility.Iterate; - +import net.createmod.catnip.utility.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/palettes/PaletteBlockPartial.java b/src/main/java/com/simibubi/create/content/palettes/PaletteBlockPartial.java index 5d917b39e4..2190e039cb 100644 --- a/src/main/java/com/simibubi/create/content/palettes/PaletteBlockPartial.java +++ b/src/main/java/com/simibubi/create/content/palettes/PaletteBlockPartial.java @@ -7,7 +7,6 @@ import java.util.function.Supplier; import com.simibubi.create.Create; import com.simibubi.create.foundation.data.CreateRegistrate; -import com.simibubi.create.foundation.utility.Lang; import com.tterrag.registrate.builders.BlockBuilder; import com.tterrag.registrate.builders.ItemBuilder; import com.tterrag.registrate.providers.DataGenContext; @@ -18,6 +17,7 @@ import com.tterrag.registrate.util.DataIngredient; import com.tterrag.registrate.util.entry.BlockEntry; import com.tterrag.registrate.util.nullness.NonnullType; +import net.createmod.catnip.utility.lang.Lang; import net.minecraft.data.recipes.ShapedRecipeBuilder; import net.minecraft.data.recipes.ShapelessRecipeBuilder; import net.minecraft.resources.ResourceLocation; diff --git a/src/main/java/com/simibubi/create/content/schematics/ClientSchematicLoader.java b/src/main/java/com/simibubi/create/content/schematics/ClientSchematicLoader.java index 5ed7705905..d7b8df0908 100644 --- a/src/main/java/com/simibubi/create/content/schematics/ClientSchematicLoader.java +++ b/src/main/java/com/simibubi/create/content/schematics/ClientSchematicLoader.java @@ -18,8 +18,8 @@ import com.simibubi.create.Create; import com.simibubi.create.content.schematics.packet.SchematicUploadPacket; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.networking.AllPackets; +import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.foundation.utility.FilesHelper; -import com.simibubi.create.foundation.utility.Lang; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; @@ -86,8 +86,8 @@ public class ClientSchematicLoader { if (size > maxSize * 1000) { LocalPlayer player = Minecraft.getInstance().player; if (player != null) { - player.sendMessage(Lang.translateDirect("schematics.uploadTooLarge").append(" (" + size / 1000 + " KB)."), player.getUUID()); - player.sendMessage(Lang.translateDirect("schematics.maxAllowedSize").append(" " + maxSize + " KB"), player.getUUID()); + player.sendMessage(CreateLang.translateDirect("schematics.uploadTooLarge").append(" (" + size / 1000 + " KB)."), player.getUUID()); + player.sendMessage(CreateLang.translateDirect("schematics.maxAllowedSize").append(" " + maxSize + " KB"), player.getUUID()); } return false; } diff --git a/src/main/java/com/simibubi/create/content/schematics/MaterialChecklist.java b/src/main/java/com/simibubi/create/content/schematics/MaterialChecklist.java index 8c4fd1ec83..94be338d28 100644 --- a/src/main/java/com/simibubi/create/content/schematics/MaterialChecklist.java +++ b/src/main/java/com/simibubi/create/content/schematics/MaterialChecklist.java @@ -7,7 +7,7 @@ import java.util.Locale; import com.google.common.collect.Sets; import com.simibubi.create.content.schematics.ItemRequirement.ItemUseType; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import it.unimi.dsi.fastutil.objects.Object2IntArrayMap; import it.unimi.dsi.fastutil.objects.Object2IntMap; @@ -81,7 +81,7 @@ public class MaterialChecklist { if (blocksNotLoaded) { textComponent = new TextComponent("\n" + ChatFormatting.RED); - textComponent = textComponent.append(Lang.translateDirect("materialChecklist.blocksNotLoaded")); + textComponent = textComponent.append(CreateLang.translateDirect("materialChecklist.blocksNotLoaded")); pages.add(StringTag.valueOf(Component.Serializer.toJson(textComponent))); } @@ -135,7 +135,7 @@ public class MaterialChecklist { tag.put("pages", pages); tag.putString("author", "Schematicannon"); tag.putString("title", ChatFormatting.BLUE + "Material Checklist"); - textComponent = Lang.translateDirect("materialChecklist") + textComponent = CreateLang.translateDirect("materialChecklist") .setStyle(Style.EMPTY.withColor(ChatFormatting.BLUE) .withItalic(Boolean.FALSE)); book.getOrCreateTagElement("display") diff --git a/src/main/java/com/simibubi/create/content/schematics/SchematicChunkSource.java b/src/main/java/com/simibubi/create/content/schematics/SchematicChunkSource.java deleted file mode 100644 index 1a51bb12b5..0000000000 --- a/src/main/java/com/simibubi/create/content/schematics/SchematicChunkSource.java +++ /dev/null @@ -1,251 +0,0 @@ -package com.simibubi.create.content.schematics; - -import java.util.List; -import java.util.function.BooleanSupplier; -import java.util.function.Supplier; - -import javax.annotation.Nullable; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.core.Holder; -import net.minecraft.core.Registry; -import net.minecraft.core.RegistryAccess; -import net.minecraft.resources.ResourceKey; -import net.minecraft.server.level.ChunkHolder; -import net.minecraft.sounds.SoundEvent; -import net.minecraft.sounds.SoundSource; -import net.minecraft.util.profiling.ProfilerFiller; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.crafting.RecipeManager; -import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkAccess; -import net.minecraft.world.level.chunk.ChunkSource; -import net.minecraft.world.level.chunk.ChunkStatus; -import net.minecraft.world.level.chunk.LevelChunk; -import net.minecraft.world.level.dimension.DimensionType; -import net.minecraft.world.level.entity.LevelEntityGetter; -import net.minecraft.world.level.gameevent.GameEvent; -import net.minecraft.world.level.lighting.LevelLightEngine; -import net.minecraft.world.level.material.Fluid; -import net.minecraft.world.level.material.FluidState; -import net.minecraft.world.level.material.Fluids; -import net.minecraft.world.level.saveddata.maps.MapItemSavedData; -import net.minecraft.world.level.storage.WritableLevelData; -import net.minecraft.world.scores.Scoreboard; -import net.minecraft.world.ticks.BlackholeTickAccess; -import net.minecraft.world.ticks.LevelTickAccess; - -public class SchematicChunkSource extends ChunkSource { - private final Level fallbackWorld; - - public SchematicChunkSource(Level world) { - fallbackWorld = world; - } - - @Nullable - @Override - public BlockGetter getChunkForLighting(int x, int z) { - return getChunk(x, z); - } - - @Override - public Level getLevel() { - return fallbackWorld; - } - - @Nullable - @Override - public ChunkAccess getChunk(int x, int z, ChunkStatus status, boolean p_212849_4_) { - return getChunk(x, z); - } - - public ChunkAccess getChunk(int x, int z) { - return new EmptierChunk(fallbackWorld.registryAccess()); - } - - @Override - public String gatherStats() { - return "WrappedChunkProvider"; - } - - @Override - public LevelLightEngine getLightEngine() { - return fallbackWorld.getLightEngine(); - } - - @Override - public void tick(BooleanSupplier p_202162_, boolean p_202163_) {} - - @Override - public int getLoadedChunksCount() { - return 0; - } - - public static class EmptierChunk extends LevelChunk { - - private static final class DummyLevel extends Level { - private RegistryAccess access; - - private DummyLevel(WritableLevelData p_46450_, ResourceKey p_46451_, Holder p_46452_, - Supplier p_46453_, boolean p_46454_, boolean p_46455_, long p_46456_) { - super(p_46450_, p_46451_, p_46452_, p_46453_, p_46454_, p_46455_, p_46456_); - } - - public Level withAccess(RegistryAccess access) { - this.access = access; - return this; - } - - @Override - public ChunkSource getChunkSource() { - return null; - } - - @Override - public void levelEvent(Player pPlayer, int pType, BlockPos pPos, int pData) {} - - @Override - public void gameEvent(Entity pEntity, GameEvent pEvent, BlockPos pPos) {} - - @Override - public RegistryAccess registryAccess() { - return access; - } - - @Override - public List players() { - return null; - } - - @Override - public Holder getUncachedNoiseBiome(int pX, int pY, int pZ) { - return null; - } - - @Override - public float getShade(Direction pDirection, boolean pShade) { - return 0; - } - - @Override - public void sendBlockUpdated(BlockPos pPos, BlockState pOldState, BlockState pNewState, int pFlags) {} - - @Override - public void playSound(Player pPlayer, double pX, double pY, double pZ, SoundEvent pSound, - SoundSource pCategory, float pVolume, float pPitch) {} - - @Override - public void playSound(Player pPlayer, Entity pEntity, SoundEvent pEvent, SoundSource pCategory, - float pVolume, float pPitch) {} - - @Override - public String gatherChunkSourceStats() { - return null; - } - - @Override - public Entity getEntity(int pId) { - return null; - } - - @Override - public MapItemSavedData getMapData(String pMapName) { - return null; - } - - @Override - public void setMapData(String pMapId, MapItemSavedData pData) {} - - @Override - public int getFreeMapId() { - return 0; - } - - @Override - public void destroyBlockProgress(int pBreakerId, BlockPos pPos, int pProgress) {} - - @Override - public Scoreboard getScoreboard() { - return null; - } - - @Override - public RecipeManager getRecipeManager() { - return null; - } - - @Override - protected LevelEntityGetter getEntities() { - return null; - } - - @Override - public LevelTickAccess getBlockTicks() { - return BlackholeTickAccess.emptyLevelList(); - } - - @Override - public LevelTickAccess getFluidTicks() { - return BlackholeTickAccess.emptyLevelList(); - } - } - - private static final DummyLevel DUMMY_LEVEL = new DummyLevel(null, null, RegistryAccess.BUILTIN.get() - .registryOrThrow(Registry.DIMENSION_TYPE_REGISTRY) - .getHolderOrThrow(DimensionType.OVERWORLD_LOCATION), null, false, false, 0); - - public EmptierChunk(RegistryAccess registryAccess) { - super(DUMMY_LEVEL.withAccess(registryAccess), null); - } - - public BlockState getBlockState(BlockPos p_180495_1_) { - return Blocks.VOID_AIR.defaultBlockState(); - } - - @Nullable - public BlockState setBlockState(BlockPos p_177436_1_, BlockState p_177436_2_, boolean p_177436_3_) { - return null; - } - - public FluidState getFluidState(BlockPos p_204610_1_) { - return Fluids.EMPTY.defaultFluidState(); - } - - public int getLightEmission(BlockPos p_217298_1_) { - return 0; - } - - @Nullable - public BlockEntity getBlockEntity(BlockPos p_177424_1_, EntityCreationType p_177424_2_) { - return null; - } - - public void addAndRegisterBlockEntity(BlockEntity p_150813_1_) {} - - public void setBlockEntity(BlockEntity p_177426_2_) {} - - public void removeBlockEntity(BlockPos p_177425_1_) {} - - public void markUnsaved() {} - - public boolean isEmpty() { - return true; - } - - public boolean isYSpaceEmpty(int p_76606_1_, int p_76606_2_) { - return true; - } - - public ChunkHolder.FullChunkStatus getFullStatus() { - return ChunkHolder.FullChunkStatus.BORDER; - } - } -} diff --git a/src/main/java/com/simibubi/create/content/schematics/SchematicPrinter.java b/src/main/java/com/simibubi/create/content/schematics/SchematicPrinter.java index 528e67b2bb..c21a34657a 100644 --- a/src/main/java/com/simibubi/create/content/schematics/SchematicPrinter.java +++ b/src/main/java/com/simibubi/create/content/schematics/SchematicPrinter.java @@ -9,9 +9,10 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Blo import com.simibubi.create.content.contraptions.components.structureMovement.StructureTransform; import com.simibubi.create.content.schematics.item.SchematicItem; import com.simibubi.create.foundation.tileEntity.IMergeableTE; -import com.simibubi.create.foundation.utility.BBHelper; import com.simibubi.create.foundation.utility.BlockHelper; +import net.createmod.catnip.utility.BBHelper; +import net.createmod.catnip.utility.worldWrappers.SchematicWorld; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; @@ -61,7 +62,7 @@ public class SchematicPrinter { schematicLoaded = true; } } - + printingEntityIndex = compound.getInt("EntityProgress"); printStage = PrintStage.valueOf(compound.getString("PrintStage")); compound.getList("DeferredBlocks", 10).stream() @@ -74,7 +75,7 @@ public class SchematicPrinter { compound.put("CurrentPos", NbtUtils.writeBlockPos(currentPos)); if (schematicAnchor != null) compound.put("Anchor", NbtUtils.writeBlockPos(schematicAnchor)); - + compound.putInt("EntityProgress", printingEntityIndex); compound.putString("PrintStage", printStage.name()); ListTag tagDeferredBlocks = new ListTag(); @@ -97,11 +98,11 @@ public class SchematicPrinter { BlockPos extraBounds = StructureTemplate.calculateRelativePosition(settings, new BlockPos(activeTemplate.getSize()) .offset(-1, -1, -1)); - blockReader.bounds = BBHelper.encapsulate(blockReader.bounds, extraBounds); + blockReader.setBounds(BBHelper.encapsulate(blockReader.getBounds(), extraBounds)); StructureTransform transform = new StructureTransform(settings.getRotationPivot(), Direction.Axis.Y, settings.getRotation(), settings.getMirror()); - for (BlockEntity te : blockReader.tileEntities.values()) + for (BlockEntity te : blockReader.getTileEntities().values()) transform.apply(te); printingEntityIndex = -1; @@ -194,7 +195,7 @@ public class SchematicPrinter { BlockState toReplace = world.getBlockState(pos); BlockEntity toReplaceTE = world.getBlockEntity(pos); BlockState toReplaceOther = null; - + if (state.hasProperty(BlockStateProperties.BED_PART) && state.hasProperty(BlockStateProperties.HORIZONTAL_FACING) && state.getValue(BlockStateProperties.BED_PART) == BedPart.FOOT) toReplaceOther = world.getBlockState(pos.relative(state.getValue(BlockStateProperties.HORIZONTAL_FACING))); diff --git a/src/main/java/com/simibubi/create/content/schematics/SchematicWorld.java b/src/main/java/com/simibubi/create/content/schematics/SchematicWorld.java deleted file mode 100644 index e503b539ad..0000000000 --- a/src/main/java/com/simibubi/create/content/schematics/SchematicWorld.java +++ /dev/null @@ -1,250 +0,0 @@ -package com.simibubi.create.content.schematics; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.function.Predicate; -import java.util.stream.Stream; - -import com.simibubi.create.Create; -import com.simibubi.create.foundation.utility.BBHelper; -import com.simibubi.create.foundation.utility.worldWrappers.WrappedWorld; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.core.Holder; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.decoration.ArmorStand; -import net.minecraft.world.entity.decoration.ItemFrame; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.LightLayer; -import net.minecraft.world.level.ServerLevelAccessor; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.biome.Biomes; -import net.minecraft.world.level.block.AbstractFurnaceBlock; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; -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.BlockStateProperties; -import net.minecraft.world.level.levelgen.structure.BoundingBox; -import net.minecraft.world.level.material.Fluid; -import net.minecraft.world.level.material.FluidState; -import net.minecraft.world.phys.AABB; -import net.minecraft.world.ticks.BlackholeTickAccess; -import net.minecraft.world.ticks.LevelTickAccess; -import net.minecraftforge.registries.ForgeRegistries; - -public class SchematicWorld extends WrappedWorld implements ServerLevelAccessor { - - protected Map blocks; - protected Map tileEntities; - protected List renderedTileEntities; - protected List entities; - protected BoundingBox bounds; - - public BlockPos anchor; - public boolean renderMode; - - public SchematicWorld(Level original) { - this(BlockPos.ZERO, original); - } - - public SchematicWorld(BlockPos anchor, Level original) { - super(original); - setChunkSource(new SchematicChunkSource(this)); - this.blocks = new HashMap<>(); - this.tileEntities = new HashMap<>(); - this.bounds = new BoundingBox(BlockPos.ZERO); - this.anchor = anchor; - this.entities = new ArrayList<>(); - this.renderedTileEntities = new ArrayList<>(); - } - - public Set getAllPositions() { - return blocks.keySet(); - } - - @Override - public boolean addFreshEntity(Entity entityIn) { - if (entityIn instanceof ItemFrame) - ((ItemFrame) entityIn).getItem() - .setTag(null); - if (entityIn instanceof ArmorStand) { - ArmorStand armorStandEntity = (ArmorStand) entityIn; - armorStandEntity.getAllSlots() - .forEach(stack -> stack.setTag(null)); - } - - return entities.add(entityIn); - } - - public Stream getEntityStream() { - return entities.stream(); - } - - @Override - public BlockEntity getBlockEntity(BlockPos pos) { - if (isOutsideBuildHeight(pos)) - return null; - if (tileEntities.containsKey(pos)) - return tileEntities.get(pos); - if (!blocks.containsKey(pos.subtract(anchor))) - return null; - - BlockState blockState = getBlockState(pos); - if (blockState.hasBlockEntity()) { - try { - BlockEntity tileEntity = ((EntityBlock) blockState.getBlock()).newBlockEntity(pos, blockState); - if (tileEntity != null) { - onTEadded(tileEntity, pos); - tileEntities.put(pos, tileEntity); - renderedTileEntities.add(tileEntity); - } - return tileEntity; - } catch (Exception e) { - Create.LOGGER.debug("Could not create TE of block " + blockState + ": " + e); - } - } - return null; - } - - protected void onTEadded(BlockEntity tileEntity, BlockPos pos) { - tileEntity.setLevel(this); - } - - @Override - public BlockState getBlockState(BlockPos globalPos) { - BlockPos pos = globalPos.subtract(anchor); - - if (pos.getY() - bounds.minY() == -1 && !renderMode) - return Blocks.GRASS_BLOCK.defaultBlockState(); - if (getBounds().isInside(pos) && blocks.containsKey(pos)) - return processBlockStateForPrinting(blocks.get(pos)); - return Blocks.AIR.defaultBlockState(); - } - - public Map getBlockMap() { - return blocks; - } - - @Override - public FluidState getFluidState(BlockPos pos) { - return getBlockState(pos).getFluidState(); - } - - @Override - public Holder getBiome(BlockPos pos) { - return ForgeRegistries.BIOMES.getHolder(Biomes.PLAINS.location()) - .orElse(null); - } - - @Override - public int getBrightness(LightLayer lightLayer, BlockPos pos) { - return 15; - } - - @Override - public float getShade(Direction face, boolean hasShade) { - return 1f; - } - - @Override - public LevelTickAccess getBlockTicks() { - return BlackholeTickAccess.emptyLevelList(); - } - - @Override - public LevelTickAccess getFluidTicks() { - return BlackholeTickAccess.emptyLevelList(); - } - - @Override - public List getEntities(Entity arg0, AABB arg1, Predicate arg2) { - return Collections.emptyList(); - } - - @Override - public List getEntitiesOfClass(Class arg0, AABB arg1, Predicate arg2) { - return Collections.emptyList(); - } - - @Override - public List players() { - return Collections.emptyList(); - } - - @Override - public int getSkyDarken() { - return 0; - } - - @Override - public boolean isStateAtPosition(BlockPos pos, Predicate predicate) { - return predicate.test(getBlockState(pos)); - } - - @Override - public boolean destroyBlock(BlockPos arg0, boolean arg1) { - return setBlock(arg0, Blocks.AIR.defaultBlockState(), 3); - } - - @Override - public boolean removeBlock(BlockPos arg0, boolean arg1) { - return setBlock(arg0, Blocks.AIR.defaultBlockState(), 3); - } - - @Override - public boolean setBlock(BlockPos pos, BlockState arg1, int arg2) { - pos = pos.immutable() - .subtract(anchor); - bounds = BBHelper.encapsulate(bounds, pos); - blocks.put(pos, arg1); - if (tileEntities.containsKey(pos)) { - BlockEntity tileEntity = tileEntities.get(pos); - if (!tileEntity.getType() - .isValid(arg1)) { - tileEntities.remove(pos); - renderedTileEntities.remove(tileEntity); - } - } - - BlockEntity tileEntity = getBlockEntity(pos); - if (tileEntity != null) - tileEntities.put(pos, tileEntity); - - return true; - } - - @Override - public void sendBlockUpdated(BlockPos pos, BlockState oldState, BlockState newState, int flags) {} - - public BoundingBox getBounds() { - return bounds; - } - - public Iterable getRenderedTileEntities() { - return renderedTileEntities; - } - - protected BlockState processBlockStateForPrinting(BlockState state) { - if (state.getBlock() instanceof AbstractFurnaceBlock && state.hasProperty(BlockStateProperties.LIT)) - state = state.setValue(BlockStateProperties.LIT, false); - return state; - } - - @Override - public ServerLevel getLevel() { - if (this.world instanceof ServerLevel) { - return (ServerLevel) this.world; - } - throw new IllegalStateException("Cannot use IServerWorld#getWorld in a client environment"); - } - -} diff --git a/src/main/java/com/simibubi/create/content/schematics/ServerSchematicLoader.java b/src/main/java/com/simibubi/create/content/schematics/ServerSchematicLoader.java index 96c1c1479b..33074a7846 100644 --- a/src/main/java/com/simibubi/create/content/schematics/ServerSchematicLoader.java +++ b/src/main/java/com/simibubi/create/content/schematics/ServerSchematicLoader.java @@ -21,8 +21,8 @@ import com.simibubi.create.content.schematics.item.SchematicAndQuillItem; import com.simibubi.create.content.schematics.item.SchematicItem; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.config.CSchematics; +import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.foundation.utility.FilesHelper; -import com.simibubi.create.foundation.utility.Lang; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; @@ -163,10 +163,10 @@ public class ServerSchematicLoader { protected boolean validateSchematicSizeOnServer(ServerPlayer player, long size) { Integer maxFileSize = getConfig().maxTotalSchematicSize.get(); if (size > maxFileSize * 1000) { - - player.sendMessage(Lang.translateDirect("schematics.uploadTooLarge") + + player.sendMessage(CreateLang.translateDirect("schematics.uploadTooLarge") .append(new TextComponent(" (" + size / 1000 + " KB).")), player.getUUID()); - player.sendMessage(Lang.translateDirect("schematics.maxAllowedSize") + player.sendMessage(CreateLang.translateDirect("schematics.maxAllowedSize") .append(new TextComponent(" " + maxFileSize + " KB")), player.getUUID()); return false; } diff --git a/src/main/java/com/simibubi/create/content/schematics/block/SchematicTableScreen.java b/src/main/java/com/simibubi/create/content/schematics/block/SchematicTableScreen.java index 525cc369a5..e7f48f9c3f 100644 --- a/src/main/java/com/simibubi/create/content/schematics/block/SchematicTableScreen.java +++ b/src/main/java/com/simibubi/create/content/schematics/block/SchematicTableScreen.java @@ -15,13 +15,13 @@ import com.simibubi.create.content.schematics.ClientSchematicLoader; import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.container.AbstractSimiContainerScreen; -import com.simibubi.create.foundation.gui.element.GuiGameElement; import com.simibubi.create.foundation.gui.widget.IconButton; import com.simibubi.create.foundation.gui.widget.Label; import com.simibubi.create.foundation.gui.widget.ScrollInput; import com.simibubi.create.foundation.gui.widget.SelectionScrollInput; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.gui.element.GuiGameElement; import net.minecraft.Util; import net.minecraft.client.renderer.Rect2i; import net.minecraft.network.chat.Component; @@ -32,12 +32,12 @@ import net.minecraft.world.item.ItemStack; public class SchematicTableScreen extends AbstractSimiContainerScreen { - private final Component uploading = Lang.translateDirect("gui.schematicTable.uploading"); - private final Component finished = Lang.translateDirect("gui.schematicTable.finished"); - private final Component refresh = Lang.translateDirect("gui.schematicTable.refresh"); - private final Component folder = Lang.translateDirect("gui.schematicTable.open_folder"); - private final Component noSchematics = Lang.translateDirect("gui.schematicTable.noSchematics"); - private final Component availableSchematicsTitle = Lang.translateDirect("gui.schematicTable.availableSchematics"); + private final Component uploading = CreateLang.translateDirect("gui.schematicTable.uploading"); + private final Component finished = CreateLang.translateDirect("gui.schematicTable.finished"); + private final Component refresh = CreateLang.translateDirect("gui.schematicTable.refresh"); + private final Component folder = CreateLang.translateDirect("gui.schematicTable.open_folder"); + private final Component noSchematics = CreateLang.translateDirect("gui.schematicTable.noSchematics"); + private final Component availableSchematicsTitle = CreateLang.translateDirect("gui.schematicTable.availableSchematics"); protected AllGuiTextures background; @@ -63,7 +63,7 @@ public class SchematicTableScreen extends AbstractSimiContainerScreenat(x + background.width, y + background.height - 40, -200) + .at(x + background.getWidth(), y + background.getHeight() - 40, -200) .scale(3) .render(ms); SCHEMATIC_TABLE_PROGRESS.bind(); - int width = (int) (SCHEMATIC_TABLE_PROGRESS.width + int width = (int) (SCHEMATIC_TABLE_PROGRESS.getWidth() * Mth.lerp(partialTicks, lastChasingProgress, chasingProgress)); - int height = SCHEMATIC_TABLE_PROGRESS.height; - blit(ms, x + 70, y + 57, SCHEMATIC_TABLE_PROGRESS.startX, - SCHEMATIC_TABLE_PROGRESS.startY, width, height); + int height = SCHEMATIC_TABLE_PROGRESS.getHeight(); + blit(ms, x + 70, y + 57, SCHEMATIC_TABLE_PROGRESS.getStartX(), + SCHEMATIC_TABLE_PROGRESS.getStartY(), width, height); } @Override diff --git a/src/main/java/com/simibubi/create/content/schematics/block/SchematicTableTileEntity.java b/src/main/java/com/simibubi/create/content/schematics/block/SchematicTableTileEntity.java index bcfe547214..6efa518ff1 100644 --- a/src/main/java/com/simibubi/create/content/schematics/block/SchematicTableTileEntity.java +++ b/src/main/java/com/simibubi/create/content/schematics/block/SchematicTableTileEntity.java @@ -4,8 +4,8 @@ import java.util.List; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.foundation.utility.IInteractionChecker; -import com.simibubi.create.foundation.utility.Lang; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; @@ -56,7 +56,7 @@ public class SchematicTableTileEntity extends SmartTileEntity implements MenuPro protected void read(CompoundTag compound, boolean clientPacket) { inventory.deserializeNBT(compound.getCompound("Inventory")); super.read(compound, clientPacket); - + if (!clientPacket) return; if (compound.contains("Uploading")) { @@ -74,14 +74,14 @@ public class SchematicTableTileEntity extends SmartTileEntity implements MenuPro protected void write(CompoundTag compound, boolean clientPacket) { compound.put("Inventory", inventory.serializeNBT()); super.write(compound, clientPacket); - + if (clientPacket && isUploading) { compound.putBoolean("Uploading", true); compound.putString("Schematic", uploadingSchematic); compound.putFloat("Progress", uploadingProgress); } } - + @Override public void tick() { // Update Client Tile @@ -113,7 +113,7 @@ public class SchematicTableTileEntity extends SmartTileEntity implements MenuPro @Override public Component getDisplayName() { - return Lang.translateDirect("gui.schematicTable.title"); + return CreateLang.translateDirect("gui.schematicTable.title"); } @Override diff --git a/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonInstance.java b/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonInstance.java index fc68495dfb..83d29c1d0d 100644 --- a/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonInstance.java +++ b/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonInstance.java @@ -8,8 +8,8 @@ import com.jozufozu.flywheel.core.materials.model.ModelData; import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllBlockPartials; -import com.simibubi.create.foundation.utility.AnimationTickHolder; +import net.createmod.catnip.utility.AnimationTickHolder; import net.minecraft.core.Direction; public class SchematicannonInstance extends BlockEntityInstance implements DynamicInstance { diff --git a/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonScreen.java b/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonScreen.java index acb3fdfbc6..094cbb8b48 100644 --- a/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonScreen.java +++ b/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonScreen.java @@ -17,15 +17,16 @@ import com.simibubi.create.content.schematics.packet.ConfigureSchematicannonPack import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.container.AbstractSimiContainerScreen; -import com.simibubi.create.foundation.gui.element.GuiGameElement; import com.simibubi.create.foundation.gui.widget.IconButton; import com.simibubi.create.foundation.gui.widget.Indicator; import com.simibubi.create.foundation.gui.widget.Indicator.State; import com.simibubi.create.foundation.item.ItemDescription.Palette; import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.networking.AllPackets; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.gui.element.GuiGameElement; +import net.createmod.catnip.utility.FontHelper; import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.renderer.Rect2i; import net.minecraft.network.chat.Component; @@ -38,7 +39,7 @@ public class SchematicannonScreen extends AbstractSimiContainerScreen replaceLevelIndicators; protected Vector replaceLevelButtons; @@ -83,7 +84,7 @@ public class SchematicannonScreen extends AbstractSimiContainerScreen(4); List icons = ImmutableList.of(AllIcons.I_DONT_REPLACE, AllIcons.I_REPLACE_SOLID, AllIcons.I_REPLACE_ANY, AllIcons.I_REPLACE_EMPTY); - List toolTips = ImmutableList.of(Lang.translateDirect("gui.schematicannon.option.dontReplaceSolid"), - Lang.translateDirect("gui.schematicannon.option.replaceWithSolid"), - Lang.translateDirect("gui.schematicannon.option.replaceWithAny"), - Lang.translateDirect("gui.schematicannon.option.replaceWithEmpty")); + List toolTips = ImmutableList.of(CreateLang.translateDirect("gui.schematicannon.option.dontReplaceSolid"), + CreateLang.translateDirect("gui.schematicannon.option.replaceWithSolid"), + CreateLang.translateDirect("gui.schematicannon.option.replaceWithAny"), + CreateLang.translateDirect("gui.schematicannon.option.replaceWithEmpty")); for (int i = 0; i < 4; i++) { replaceLevelIndicators.add(new Indicator(x + 33 + i * 18, y + 111, TextComponent.EMPTY)); @@ -169,7 +170,7 @@ public class SchematicannonScreen extends AbstractSimiContainerScreen { sendOptionUpdate(Option.SKIP_MISSING, !menu.contentHolder.skipMissing); }); - skipMissingButton.setToolTip(Lang.translateDirect("gui.schematicannon.option.skipMissing")); + skipMissingButton.setToolTip(CreateLang.translateDirect("gui.schematicannon.option.skipMissing")); skipMissingIndicator = new Indicator(x + 111, y + 111, TextComponent.EMPTY); Collections.addAll(placementSettingWidgets, skipMissingButton, skipMissingIndicator); @@ -177,7 +178,7 @@ public class SchematicannonScreen extends AbstractSimiContainerScreen { sendOptionUpdate(Option.SKIP_TILES, !menu.contentHolder.replaceTileEntities); }); - skipTilesButton.setToolTip(Lang.translateDirect("gui.schematicannon.option.skipTileEntities")); + skipTilesButton.setToolTip(CreateLang.translateDirect("gui.schematicannon.option.skipTileEntities")); skipTilesIndicator = new Indicator(x + 129, y + 111, TextComponent.EMPTY); Collections.addAll(placementSettingWidgets, skipTilesButton, skipTilesIndicator); @@ -266,21 +267,21 @@ public class SchematicannonScreen extends AbstractSimiContainerScreen tip = button.getToolTip(); tip.add((enabled ? optionEnabled : optionDisabled).plainCopy() .withStyle(BLUE)); - tip.addAll(TooltipHelper - .cutTextComponent(Lang.translateDirect("gui.schematicannon.option." + tooltipKey + ".description"), GRAY, GRAY)); + tip.addAll(FontHelper + .cutTextComponent(CreateLang.translateDirect("gui.schematicannon.option." + tooltipKey + ".description"), GRAY, GRAY)); } @Override protected void renderBg(PoseStack ms, float partialTicks, int mouseX, int mouseY) { - int invX = getLeftOfCentered(AllGuiTextures.PLAYER_INVENTORY.width); - int invY = topPos + BG_TOP.height + BG_BOTTOM.height + 2; + int invX = getLeftOfCentered(AllGuiTextures.PLAYER_INVENTORY.getWidth()); + int invY = topPos + BG_TOP.getHeight() + BG_BOTTOM.getHeight() + 2; renderPlayerInventory(ms, invX, invY); int x = leftPos; int y = topPos; BG_TOP.render(ms, x, y, this); - BG_BOTTOM.render(ms, x, y + BG_TOP.height, this); + BG_BOTTOM.render(ms, x, y + BG_TOP.getHeight(), this); SchematicannonTileEntity te = menu.contentHolder; renderPrintingProgress(ms, x, y, te.schematicProgress); @@ -292,13 +293,13 @@ public class SchematicannonScreen extends AbstractSimiContainerScreenat(x + BG_TOP.width, y + BG_TOP.height + BG_BOTTOM.height - 48, -200) + .GuiRenderBuilder>at(x + BG_TOP.getWidth(), y + BG_TOP.getHeight() + BG_BOTTOM.getHeight() - 48, -200) .scale(5) .render(ms); - drawCenteredString(ms, font, title, x + (BG_TOP.width - 8) / 2, y + 3, 0xFFFFFF); + drawCenteredString(ms, font, title, x + (BG_TOP.getWidth() - 8) / 2, y + 3, 0xFFFFFF); - Component msg = Lang.translateDirect("schematicannon.status." + te.statusMsg); + Component msg = CreateLang.translateDirect("schematicannon.status." + te.statusMsg); int stringWidth = font.width(msg); if (te.missingItem != null) { @@ -320,14 +321,14 @@ public class SchematicannonScreen extends AbstractSimiContainerScreen= fuelX && mouseY >= fuelY && mouseX <= fuelX + AllGuiTextures.SCHEMATICANNON_FUEL.width - && mouseY <= fuelY + AllGuiTextures.SCHEMATICANNON_FUEL.height) { + if (mouseX >= fuelX && mouseY >= fuelY && mouseX <= fuelX + AllGuiTextures.SCHEMATICANNON_FUEL.getWidth() + && mouseY <= fuelY + AllGuiTextures.SCHEMATICANNON_FUEL.getHeight()) { List tooltip = getFuelLevelTooltip(te); renderComponentTooltip(matrixStack, tooltip, mouseX, mouseY); } @@ -357,13 +358,13 @@ public class SchematicannonScreen extends AbstractSimiContainerScreen tooltip = new ArrayList<>(); if (te.hasCreativeCrate) { - tooltip.add(Lang.translateDirect(_gunpowderLevel, "" + 100)); + tooltip.add(CreateLang.translateDirect(_gunpowderLevel, "" + 100)); tooltip.add(new TextComponent("(").append(AllBlocks.CREATIVE_CRATE.get() .getName()) .append(")") @@ -398,11 +399,11 @@ public class SchematicannonScreen extends AbstractSimiContainerScreen rotationOptions = - Lang.translatedOptions("schematic.rotation", "none", "cw90", "cw180", "cw270"); + CreateLang.translatedOptions("schematic.rotation", "none", "cw90", "cw180", "cw270"); private final List mirrorOptions = - Lang.translatedOptions("schematic.mirror", "none", "leftRight", "frontBack"); - private final Component rotationLabel = Lang.translateDirect("schematic.rotation"); - private final Component mirrorLabel = Lang.translateDirect("schematic.mirror"); + CreateLang.translatedOptions("schematic.mirror", "none", "leftRight", "frontBack"); + private final Component rotationLabel = CreateLang.translateDirect("schematic.rotation"); + private final Component mirrorLabel = CreateLang.translateDirect("schematic.mirror"); private AllGuiTextures background; @@ -52,7 +52,7 @@ public class SchematicEditScreen extends AbstractSimiScreen { @Override protected void init() { - setWindowSize(background.width, background.height); + setWindowSize(background.getWidth(), background.getHeight()); setWindowOffset(-6, 0); super.init(); @@ -114,7 +114,7 @@ public class SchematicEditScreen extends AbstractSimiScreen { addRenderableWidgets(labelR, labelM, rotationArea, mirrorArea); confirmButton = - new IconButton(x + background.width - 33, y + background.height - 24, AllIcons.I_CONFIRM); + new IconButton(x + background.getWidth() - 33, y + background.getHeight() - 24, AllIcons.I_CONFIRM); confirmButton.withCallback(() -> { onClose(); }); @@ -157,10 +157,10 @@ public class SchematicEditScreen extends AbstractSimiScreen { background.render(ms, x, y, this); String title = handler.getCurrentSchematicName(); - drawCenteredString(ms, font, title, x + (background.width - 8) / 2, y + 3, 0xFFFFFF); + drawCenteredString(ms, font, title, x + (background.getWidth() - 8) / 2, y + 3, 0xFFFFFF); GuiGameElement.of(AllItems.SCHEMATIC.asStack()) - .at(x + background.width + 6, y + background.height - 40, -200) + .at(x + background.getWidth() + 6, y + background.getHeight() - 40, -200) .scale(3) .render(ms); } diff --git a/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java b/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java index b124818741..477b2851f8 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java @@ -9,18 +9,18 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.AllKeys; import com.simibubi.create.content.contraptions.components.structureMovement.StructureTransform; -import com.simibubi.create.content.schematics.SchematicWorld; import com.simibubi.create.content.schematics.client.tools.Tools; import com.simibubi.create.content.schematics.filtering.SchematicInstances; import com.simibubi.create.content.schematics.item.SchematicItem; import com.simibubi.create.content.schematics.packet.SchematicPlacePacket; import com.simibubi.create.content.schematics.packet.SchematicSyncPacket; import com.simibubi.create.foundation.networking.AllPackets; -import com.simibubi.create.foundation.render.SuperRenderTypeBuffer; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.NBTHelper; -import com.simibubi.create.foundation.utility.outliner.AABBOutline; +import net.createmod.catnip.render.SuperRenderTypeBuffer; +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.utility.outliner.AABBOutline; +import net.createmod.catnip.utility.worldWrappers.SchematicWorld; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/simibubi/create/content/schematics/client/SchematicPromptScreen.java b/src/main/java/com/simibubi/create/content/schematics/client/SchematicPromptScreen.java index ca1a4ac36d..e1aa5513c9 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/SchematicPromptScreen.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/SchematicPromptScreen.java @@ -5,13 +5,13 @@ import org.lwjgl.glfw.GLFW; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllItems; import com.simibubi.create.CreateClient; -import com.simibubi.create.foundation.gui.AbstractSimiScreen; import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllIcons; -import com.simibubi.create.foundation.gui.element.GuiGameElement; import com.simibubi.create.foundation.gui.widget.IconButton; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.gui.AbstractSimiScreen; +import net.createmod.catnip.gui.element.GuiGameElement; import net.minecraft.client.gui.components.EditBox; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TextComponent; @@ -20,9 +20,9 @@ public class SchematicPromptScreen extends AbstractSimiScreen { private AllGuiTextures background; - private final Component convertLabel = Lang.translateDirect("schematicAndQuill.convert"); - private final Component abortLabel = Lang.translateDirect("action.discard"); - private final Component confirmLabel = Lang.translateDirect("action.saveToFile"); + private final Component convertLabel = CreateLang.translateDirect("schematicAndQuill.convert"); + private final Component abortLabel = CreateLang.translateDirect("action.discard"); + private final Component confirmLabel = CreateLang.translateDirect("action.saveToFile"); private EditBox nameField; private IconButton confirm; @@ -30,13 +30,13 @@ public class SchematicPromptScreen extends AbstractSimiScreen { private IconButton convert; public SchematicPromptScreen() { - super(Lang.translateDirect("schematicAndQuill.title")); + super(CreateLang.translateDirect("schematicAndQuill.title")); background = AllGuiTextures.SCHEMATIC_PROMPT; } @Override public void init() { - setWindowSize(background.width, background.height); + setWindowSize(background.getWidth(), background.getHeight()); super.init(); int x = guiLeft; @@ -80,7 +80,7 @@ public class SchematicPromptScreen extends AbstractSimiScreen { int y = guiTop; background.render(ms, x, y, this); - drawCenteredString(ms, font, title, x + (background.width - 8) / 2, y + 3, 0xFFFFFF); + drawCenteredString(ms, font, title, x + (background.getWidth() - 8) / 2, y + 3, 0xFFFFFF); GuiGameElement.of(AllItems.SCHEMATIC.asStack()) .at(x + 22, y + 23, 0) @@ -88,7 +88,7 @@ public class SchematicPromptScreen extends AbstractSimiScreen { GuiGameElement.of(AllItems.SCHEMATIC_AND_QUILL.asStack()) .scale(3) - .at(x + background.width + 6, y + background.height - 40, -200) + .at(x + background.getWidth() + 6, y + background.getHeight() - 40, -200) .render(ms); } diff --git a/src/main/java/com/simibubi/create/content/schematics/client/SchematicRenderer.java b/src/main/java/com/simibubi/create/content/schematics/client/SchematicRenderer.java index 5eea3f1698..7c9f49f2a0 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/SchematicRenderer.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/SchematicRenderer.java @@ -11,11 +11,11 @@ import com.mojang.blaze3d.vertex.BufferBuilder; import com.mojang.blaze3d.vertex.DefaultVertexFormat; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexFormat; -import com.simibubi.create.content.schematics.SchematicWorld; import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.render.SuperRenderTypeBuffer; import com.simibubi.create.foundation.render.TileEntityRenderHelper; +import net.createmod.catnip.render.SuperRenderTypeBuffer; +import net.createmod.catnip.utility.worldWrappers.SchematicWorld; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.ItemBlockRenderTypes; import net.minecraft.client.renderer.RenderType; diff --git a/src/main/java/com/simibubi/create/content/schematics/client/SchematicTransformation.java b/src/main/java/com/simibubi/create/content/schematics/client/SchematicTransformation.java index d9d7628aaa..4195cff5b6 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/SchematicTransformation.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/SchematicTransformation.java @@ -4,11 +4,11 @@ import static java.lang.Math.abs; import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.VecHelper; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; -import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction.Axis; import net.minecraft.world.level.block.Mirror; diff --git a/src/main/java/com/simibubi/create/content/schematics/client/ToolSelectionScreen.java b/src/main/java/com/simibubi/create/content/schematics/client/ToolSelectionScreen.java index 2a567a8e44..5ff5e4b697 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/ToolSelectionScreen.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/ToolSelectionScreen.java @@ -9,7 +9,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllKeys; import com.simibubi.create.content.schematics.client.tools.Tools; import com.simibubi.create.foundation.gui.AllGuiTextures; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.Screen; @@ -18,7 +18,7 @@ import net.minecraft.network.chat.TextComponent; public class ToolSelectionScreen extends Screen { - public final String scrollToCycle = Lang.translateDirect("gui.toolmenu.cycle") + public final String scrollToCycle = CreateLang.translateDirect("gui.toolmenu.cycle") .getString(); public final String holdToFocus = "gui.toolmenu.focusKey"; @@ -75,7 +75,7 @@ public class ToolSelectionScreen extends Screen { RenderSystem.setShaderColor(1, 1, 1, focused ? 7 / 8f : 1 / 2f); RenderSystem.setShaderTexture(0, gray.location); - blit(matrixStack, x - 15, y, gray.startX, gray.startY, w, h, gray.width, gray.height); + blit(matrixStack, x - 15, y, gray.getStartX(), gray.getStartY(), w, h, gray.getWidth(), gray.getHeight()); float toolTipAlpha = yOffset / 10; List toolTip = tools.get(selection) @@ -84,7 +84,7 @@ public class ToolSelectionScreen extends Screen { if (toolTipAlpha > 0.25f) { RenderSystem.setShaderColor(.7f, .7f, .8f, toolTipAlpha); - blit(matrixStack, x - 15, y + 33, gray.startX, gray.startY, w, h + 22, gray.width, gray.height); + blit(matrixStack, x - 15, y + 33, gray.getStartX(), gray.getStartY(), w, h + 22, gray.getWidth(), gray.getHeight()); RenderSystem.setShaderColor(1, 1, 1, 1); if (toolTip.size() > 0) @@ -103,7 +103,7 @@ public class ToolSelectionScreen extends Screen { int width = minecraft.getWindow() .getGuiScaledWidth(); if (!focused) - drawCenteredString(matrixStack, minecraft.font, Lang.translateDirect(holdToFocus, keyName), width / 2, + drawCenteredString(matrixStack, minecraft.font, CreateLang.translateDirect(holdToFocus, keyName), width / 2, y - 10, 0xCCDDFF); else drawCenteredString(matrixStack, minecraft.font, scrollToCycle, width / 2, y - 10, 0xCCDDFF); diff --git a/src/main/java/com/simibubi/create/content/schematics/client/tools/DeployTool.java b/src/main/java/com/simibubi/create/content/schematics/client/tools/DeployTool.java index e2abd68c17..2a0338242b 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/tools/DeployTool.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/tools/DeployTool.java @@ -4,10 +4,10 @@ import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllKeys; import com.simibubi.create.content.schematics.client.SchematicTransformation; -import com.simibubi.create.foundation.render.SuperRenderTypeBuffer; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.outliner.AABBOutline; +import net.createmod.catnip.render.SuperRenderTypeBuffer; +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.outliner.AABBOutline; import net.minecraft.core.BlockPos; import net.minecraft.nbt.NbtUtils; import net.minecraft.util.Mth; diff --git a/src/main/java/com/simibubi/create/content/schematics/client/tools/FlipTool.java b/src/main/java/com/simibubi/create/content/schematics/client/tools/FlipTool.java index 10ceb15475..789a9fdcd2 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/tools/FlipTool.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/tools/FlipTool.java @@ -2,10 +2,10 @@ package com.simibubi.create.content.schematics.client.tools; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllSpecialTextures; -import com.simibubi.create.foundation.render.SuperRenderTypeBuffer; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.outliner.AABBOutline; +import net.createmod.catnip.render.SuperRenderTypeBuffer; +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.outliner.AABBOutline; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.AxisDirection; @@ -67,7 +67,7 @@ public class FlipTool extends PlacementToolBase { .inflate(1 - directionVec.x, 1 - directionVec.y, 1 - directionVec.z); bounds = bounds.move(directionVec.scale(.5f) .multiply(boundsSize)); - + outline.setBounds(bounds); AllSpecialTextures tex = AllSpecialTextures.CHECKERED; outline.getParams() @@ -76,7 +76,7 @@ public class FlipTool extends PlacementToolBase { .colored(0xdddddd) .withFaceTextures(tex, tex); outline.render(ms, buffer, AnimationTickHolder.getPartialTicks()); - + super.renderOnSchematic(ms, buffer); } diff --git a/src/main/java/com/simibubi/create/content/schematics/client/tools/ISchematicTool.java b/src/main/java/com/simibubi/create/content/schematics/client/tools/ISchematicTool.java index f7a2ecdf72..df8083632a 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/tools/ISchematicTool.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/tools/ISchematicTool.java @@ -1,20 +1,20 @@ package com.simibubi.create.content.schematics.client.tools; import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.foundation.render.SuperRenderTypeBuffer; +import net.createmod.catnip.render.SuperRenderTypeBuffer; import net.minecraftforge.client.gui.ForgeIngameGui; public interface ISchematicTool { public void init(); public void updateSelection(); - + public boolean handleRightClick(); public boolean handleMouseWheel(double delta); - + public void renderTool(PoseStack ms, SuperRenderTypeBuffer buffer); public void renderOverlay(ForgeIngameGui gui, PoseStack poseStack, float partialTicks, int width, int height); public void renderOnSchematic(PoseStack ms, SuperRenderTypeBuffer buffer); - + } diff --git a/src/main/java/com/simibubi/create/content/schematics/client/tools/MoveTool.java b/src/main/java/com/simibubi/create/content/schematics/client/tools/MoveTool.java index 9f1bc0bba6..9f30222873 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/tools/MoveTool.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/tools/MoveTool.java @@ -1,8 +1,8 @@ package com.simibubi.create.content.schematics.client.tools; import com.simibubi.create.content.schematics.client.SchematicTransformation; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.Direction.Axis; import net.minecraft.world.phys.Vec3; @@ -30,7 +30,7 @@ public class MoveTool extends PlacementToolBase { vec = VecHelper.rotate(vec, transformation.getRotationTarget(), Axis.Y); transformation.move((float) vec.x, 0, (float) vec.z); schematicHandler.markDirty(); - + return true; } diff --git a/src/main/java/com/simibubi/create/content/schematics/client/tools/PlacementToolBase.java b/src/main/java/com/simibubi/create/content/schematics/client/tools/PlacementToolBase.java index ca7b40d21b..a51f9626a9 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/tools/PlacementToolBase.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/tools/PlacementToolBase.java @@ -1,8 +1,8 @@ package com.simibubi.create.content.schematics.client.tools; import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.foundation.render.SuperRenderTypeBuffer; +import net.createmod.catnip.render.SuperRenderTypeBuffer; import net.minecraftforge.client.gui.ForgeIngameGui; public abstract class PlacementToolBase extends SchematicToolBase { diff --git a/src/main/java/com/simibubi/create/content/schematics/client/tools/RotateTool.java b/src/main/java/com/simibubi/create/content/schematics/client/tools/RotateTool.java index 55b3e3dcc8..ef1a5aaaec 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/tools/RotateTool.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/tools/RotateTool.java @@ -1,10 +1,10 @@ package com.simibubi.create.content.schematics.client.tools; import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.foundation.render.SuperRenderTypeBuffer; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.outliner.LineOutline; +import net.createmod.catnip.render.SuperRenderTypeBuffer; +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.outliner.LineOutline; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; diff --git a/src/main/java/com/simibubi/create/content/schematics/client/tools/SchematicToolBase.java b/src/main/java/com/simibubi/create/content/schematics/client/tools/SchematicToolBase.java index b3296d1d03..d4de72cdeb 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/tools/SchematicToolBase.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/tools/SchematicToolBase.java @@ -9,13 +9,13 @@ import com.simibubi.create.AllSpecialTextures; import com.simibubi.create.CreateClient; import com.simibubi.create.content.schematics.client.SchematicHandler; import com.simibubi.create.content.schematics.client.SchematicTransformation; -import com.simibubi.create.foundation.render.SuperRenderTypeBuffer; -import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.RaycastHelper; import com.simibubi.create.foundation.utility.RaycastHelper.PredicateTraceResult; -import com.simibubi.create.foundation.utility.VecHelper; -import com.simibubi.create.foundation.utility.outliner.AABBOutline; +import net.createmod.catnip.render.SuperRenderTypeBuffer; +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.outliner.AABBOutline; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/simibubi/create/content/schematics/client/tools/Tools.java b/src/main/java/com/simibubi/create/content/schematics/client/tools/Tools.java index 9b6d9ae287..19e707dfca 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/tools/Tools.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/tools/Tools.java @@ -5,8 +5,9 @@ import java.util.Collections; import java.util.List; import com.simibubi.create.foundation.gui.AllIcons; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.lang.Lang; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TranslatableComponent; @@ -32,7 +33,7 @@ public enum Tools { } public TranslatableComponent getDisplayName() { - return Lang.translateDirect("schematic.tool." + Lang.asId(name())); + return CreateLang.translateDirect("schematic.tool." + Lang.asId(name())); } public AllIcons getIcon() { @@ -48,7 +49,7 @@ public enum Tools { } public List getDescription() { - return Lang.translatedOptions("schematic.tool." + Lang.asId(name()) + ".description", "0", "1", "2", "3"); + return CreateLang.translatedOptions("schematic.tool." + Lang.asId(name()) + ".description", "0", "1", "2", "3"); } } diff --git a/src/main/java/com/simibubi/create/content/schematics/filtering/SchematicInstances.java b/src/main/java/com/simibubi/create/content/schematics/filtering/SchematicInstances.java index f9f175a1c2..1e6bebd253 100644 --- a/src/main/java/com/simibubi/create/content/schematics/filtering/SchematicInstances.java +++ b/src/main/java/com/simibubi/create/content/schematics/filtering/SchematicInstances.java @@ -6,10 +6,10 @@ import javax.annotation.Nullable; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; -import com.simibubi.create.content.schematics.SchematicWorld; import com.simibubi.create.content.schematics.item.SchematicItem; -import com.simibubi.create.foundation.utility.WorldAttached; +import net.createmod.catnip.utility.WorldAttached; +import net.createmod.catnip.utility.worldWrappers.SchematicWorld; import net.minecraft.core.BlockPos; import net.minecraft.core.Vec3i; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/schematics/item/SchematicAndQuillItem.java b/src/main/java/com/simibubi/create/content/schematics/item/SchematicAndQuillItem.java index e773b1322f..a2740022ea 100644 --- a/src/main/java/com/simibubi/create/content/schematics/item/SchematicAndQuillItem.java +++ b/src/main/java/com/simibubi/create/content/schematics/item/SchematicAndQuillItem.java @@ -4,8 +4,8 @@ import java.util.Iterator; import com.simibubi.create.AllEntityTypes; import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueEntity; -import com.simibubi.create.foundation.utility.NBTHelper; +import net.createmod.catnip.utility.NBTHelper; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.DoubleTag; diff --git a/src/main/java/com/simibubi/create/content/schematics/item/SchematicItem.java b/src/main/java/com/simibubi/create/content/schematics/item/SchematicItem.java index 78c73a66d2..57e6e78c6e 100644 --- a/src/main/java/com/simibubi/create/content/schematics/item/SchematicItem.java +++ b/src/main/java/com/simibubi/create/content/schematics/item/SchematicItem.java @@ -19,10 +19,10 @@ import com.simibubi.create.AllItems; import com.simibubi.create.content.schematics.SchematicProcessor; import com.simibubi.create.content.schematics.client.SchematicEditScreen; import com.simibubi.create.content.schematics.filtering.SchematicInstances; -import com.simibubi.create.foundation.gui.ScreenOpener; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.NBTHelper; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.gui.ScreenOpener; +import net.createmod.catnip.utility.NBTHelper; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.NonNullList; @@ -87,7 +87,7 @@ public class SchematicItem extends Item { tooltip.add(new TextComponent(ChatFormatting.GOLD + stack.getTag() .getString("File"))); } else { - tooltip.add(Lang.translateDirect("schematic.invalid").withStyle(ChatFormatting.RED)); + tooltip.add(CreateLang.translateDirect("schematic.invalid").withStyle(ChatFormatting.RED)); } super.appendHoverText(stack, worldIn, tooltip, flagIn); } diff --git a/src/main/java/com/simibubi/create/events/ClientEvents.java b/src/main/java/com/simibubi/create/events/ClientEvents.java index 42fe5bf3ca..d27a994c22 100644 --- a/src/main/java/com/simibubi/create/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/events/ClientEvents.java @@ -52,20 +52,20 @@ import com.simibubi.create.foundation.item.ItemDescription; import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.networking.LeftClickPacket; -import com.simibubi.create.foundation.ponder.PonderTooltipHandler; -import com.simibubi.create.foundation.render.SuperRenderTypeBuffer; import com.simibubi.create.foundation.sound.SoundScapes; import com.simibubi.create.foundation.tileEntity.behaviour.edgeInteraction.EdgeInteractionRenderer; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringRenderer; import com.simibubi.create.foundation.tileEntity.behaviour.linked.LinkRenderer; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollValueHandler; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollValueRenderer; -import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.CameraAngleAnimationService; import com.simibubi.create.foundation.utility.ServerSpeedProvider; -import com.simibubi.create.foundation.utility.placement.PlacementHelpers; -import com.simibubi.create.foundation.utility.worldWrappers.WrappedClientWorld; +import net.createmod.catnip.render.DefaultSuperRenderTypeBufferImpl; +import net.createmod.catnip.render.SuperRenderTypeBuffer; +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.placement.PlacementHelpers; +import net.createmod.catnip.utility.worldWrappers.WrappedClientWorld; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; @@ -88,7 +88,6 @@ import net.minecraftforge.client.event.EntityRenderersEvent; import net.minecraftforge.client.event.EntityViewRenderEvent; import net.minecraftforge.client.event.RegisterClientReloadListenersEvent; import net.minecraftforge.client.event.RenderLevelLastEvent; -import net.minecraftforge.client.event.RenderTooltipEvent; import net.minecraftforge.event.TickEvent.ClientTickEvent; import net.minecraftforge.event.TickEvent.Phase; import net.minecraftforge.event.TickEvent.RenderTickEvent; @@ -138,7 +137,6 @@ public class ClientEvents { CapabilityMinecartController.tick(world); CouplingPhysics.tick(world); - PonderTooltipHandler.tick(); // ScreenOpener.tick(); ServerSpeedProvider.clientTick(); BeltConnectorHandler.tick(); @@ -158,8 +156,7 @@ public class ClientEvents { ArmInteractionPointHandler.tick(); EjectorTargetHandler.tick(); PlacementHelpers.tick(); - CreateClient.OUTLINER.tickOutlines(); - CreateClient.GHOST_BLOCKS.tickGhosts(); + //CreateClient.OUTLINER.tickOutlines(); ContraptionRenderDispatcher.tick(world); BlueprintOverlayRenderer.tick(); ToolboxHandlerClient.clientTick(); @@ -208,23 +205,21 @@ public class ClientEvents { @SubscribeEvent public static void onRenderWorld(RenderLevelLastEvent event) { - Vec3 cameraPos = Minecraft.getInstance().gameRenderer.getMainCamera() - .getPosition(); + Vec3 cameraPos = Minecraft.getInstance().gameRenderer.getMainCamera().getPosition(); float pt = AnimationTickHolder.getPartialTicks(); PoseStack ms = event.getPoseStack(); ms.pushPose(); ms.translate(-cameraPos.x(), -cameraPos.y(), -cameraPos.z()); - SuperRenderTypeBuffer buffer = SuperRenderTypeBuffer.getInstance(); + SuperRenderTypeBuffer buffer = DefaultSuperRenderTypeBufferImpl.getInstance(); TrackBlockOutline.drawCurveSelection(ms, buffer); TrackTargetingClient.render(ms, buffer); CouplingRenderer.renderAll(ms, buffer); CarriageCouplingRenderer.renderAll(ms, buffer); CreateClient.SCHEMATIC_HANDLER.render(ms, buffer); - CreateClient.GHOST_BLOCKS.renderAll(ms, buffer); - CreateClient.OUTLINER.renderOutlines(ms, buffer, pt); + //CreateClient.OUTLINER.renderOutlines(ms, buffer, pt); buffer.draw(); RenderSystem.enableCull(); @@ -242,11 +237,6 @@ public class ClientEvents { event.setPitch(CameraAngleAnimationService.getPitch(partialTicks)); } - @SubscribeEvent - public static void getItemTooltipColor(RenderTooltipEvent.Color event) { - PonderTooltipHandler.handleTooltipColor(event); - } - @SubscribeEvent public static void addToItemTooltip(ItemTooltipEvent event) { if (!AllConfigs.CLIENT.tooltips.get()) @@ -281,7 +271,6 @@ public class ClientEvents { } } - PonderTooltipHandler.addToTooltip(event.getToolTip(), stack); SequencedAssemblyRecipe.addToTooltip(event.getToolTip(), stack); } diff --git a/src/main/java/com/simibubi/create/events/CommonEvents.java b/src/main/java/com/simibubi/create/events/CommonEvents.java index 57582f7a03..feb9dc3862 100644 --- a/src/main/java/com/simibubi/create/events/CommonEvents.java +++ b/src/main/java/com/simibubi/create/events/CommonEvents.java @@ -15,12 +15,12 @@ import com.simibubi.create.content.logistics.item.LinkedControllerServerHandler; import com.simibubi.create.content.logistics.trains.entity.CarriageEntityHandler; import com.simibubi.create.foundation.command.AllCommands; import com.simibubi.create.foundation.fluid.FluidHelper; -import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.ServerSpeedProvider; -import com.simibubi.create.foundation.utility.WorldAttached; import com.simibubi.create.foundation.utility.recipe.RecipeFinder; import com.simibubi.create.foundation.worldgen.AllWorldFeatures; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.WorldAttached; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerPlayer; @@ -81,7 +81,7 @@ public class CommonEvents { ToolboxHandler.playerLogin(player); Create.RAILWAYS.playerLogin(player); } - + @SubscribeEvent public static void playerLoggedOut(PlayerLoggedOutEvent event) { Player player = event.getPlayer(); @@ -155,7 +155,7 @@ public class CommonEvents { public static void onEntityEnterSection(EntityEvent.EnteringSection event) { CarriageEntityHandler.onEntityEnterSection(event); } - + @SubscribeEvent public static void addReloadListeners(AddReloadListenerEvent event) { event.addListener(RecipeFinder.LISTENER); diff --git a/src/main/java/com/simibubi/create/foundation/ClientResourceReloadListener.java b/src/main/java/com/simibubi/create/foundation/ClientResourceReloadListener.java index c0e81e1991..9fb46a8fc5 100644 --- a/src/main/java/com/simibubi/create/foundation/ClientResourceReloadListener.java +++ b/src/main/java/com/simibubi/create/foundation/ClientResourceReloadListener.java @@ -2,7 +2,6 @@ package com.simibubi.create.foundation; import com.simibubi.create.CreateClient; import com.simibubi.create.foundation.sound.SoundScapes; -import com.simibubi.create.foundation.utility.LangNumberFormat; import net.minecraft.server.packs.resources.ResourceManager; import net.minecraft.server.packs.resources.ResourceManagerReloadListener; @@ -13,7 +12,6 @@ public class ClientResourceReloadListener implements ResourceManagerReloadListen public void onResourceManagerReload(ResourceManager resourceManager) { CreateClient.invalidateRenderers(); SoundScapes.invalidateAll(); - LangNumberFormat.numberFormat.update(); } } diff --git a/src/main/java/com/simibubi/create/foundation/block/BigOutlines.java b/src/main/java/com/simibubi/create/foundation/block/BigOutlines.java index c5414b80c5..e10d4b671a 100644 --- a/src/main/java/com/simibubi/create/foundation/block/BigOutlines.java +++ b/src/main/java/com/simibubi/create/foundation/block/BigOutlines.java @@ -2,10 +2,10 @@ package com.simibubi.create.foundation.block; import com.simibubi.create.content.curiosities.deco.SlidingDoorBlock; import com.simibubi.create.content.logistics.trains.track.TrackBlock; -import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.RaycastHelper; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.ponder.utility.WorldTickHolder; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; import net.minecraft.core.BlockPos; @@ -30,7 +30,7 @@ public class BigOutlines { result = null; - Vec3 origin = player.getEyePosition(AnimationTickHolder.getPartialTicks(mc.level)); + Vec3 origin = player.getEyePosition(WorldTickHolder.getPartialTicks(mc.level)); double maxRange = mc.hitResult == null ? Double.MAX_VALUE : mc.hitResult.getLocation() diff --git a/src/main/java/com/simibubi/create/foundation/block/BlockStressDefaults.java b/src/main/java/com/simibubi/create/foundation/block/BlockStressDefaults.java index 1ea374b1b2..a816ac8a9e 100644 --- a/src/main/java/com/simibubi/create/foundation/block/BlockStressDefaults.java +++ b/src/main/java/com/simibubi/create/foundation/block/BlockStressDefaults.java @@ -4,10 +4,10 @@ import java.util.HashMap; import java.util.Map; import java.util.function.Supplier; -import com.simibubi.create.foundation.utility.Couple; import com.tterrag.registrate.builders.BlockBuilder; import com.tterrag.registrate.util.nullness.NonNullUnaryOperator; +import net.createmod.catnip.utility.Couple; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.Block; diff --git a/src/main/java/com/simibubi/create/foundation/block/BlockStressValues.java b/src/main/java/com/simibubi/create/foundation/block/BlockStressValues.java index 6d2e5f4ffb..7e8198b944 100644 --- a/src/main/java/com/simibubi/create/foundation/block/BlockStressValues.java +++ b/src/main/java/com/simibubi/create/foundation/block/BlockStressValues.java @@ -5,8 +5,7 @@ import java.util.Map; import javax.annotation.Nullable; -import com.simibubi.create.foundation.utility.Couple; - +import net.createmod.catnip.utility.Couple; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.Block; @@ -76,7 +75,7 @@ public class BlockStressValues { public interface IStressValueProvider { /** * Gets the stress impact of a block. - * + * * @param block The block. * @return the stress impact value of the block, or 0 if it does not have one. */ @@ -84,7 +83,7 @@ public class BlockStressValues { /** * Gets the stress capacity of a block. - * + * * @param block The block. * @return the stress capacity value of the block, or 0 if it does not have one. */ @@ -95,7 +94,7 @@ public class BlockStressValues { boolean hasCapacity(Block block); /** - * + * * @param block * @return min, max generated RPM; null if block does not have a stress capacity */ diff --git a/src/main/java/com/simibubi/create/foundation/block/CopperBlockSet.java b/src/main/java/com/simibubi/create/foundation/block/CopperBlockSet.java index b266d1bd03..5a94e0122d 100644 --- a/src/main/java/com/simibubi/create/foundation/block/CopperBlockSet.java +++ b/src/main/java/com/simibubi/create/foundation/block/CopperBlockSet.java @@ -10,8 +10,8 @@ import java.util.function.Supplier; import org.apache.commons.lang3.ArrayUtils; import com.simibubi.create.AllTags; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.Lang; +import net.createmod.catnip.utility.Iterate; + import com.tterrag.registrate.AbstractRegistrate; import com.tterrag.registrate.builders.BlockBuilder; import com.tterrag.registrate.providers.DataGenContext; @@ -23,6 +23,7 @@ import com.tterrag.registrate.util.entry.BlockEntry; import com.tterrag.registrate.util.nullness.NonNullBiConsumer; import com.tterrag.registrate.util.nullness.NonNullFunction; +import net.createmod.catnip.utility.lang.Lang; import net.minecraft.data.recipes.ShapelessRecipeBuilder; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.BlockTags; diff --git a/src/main/java/com/simibubi/create/foundation/block/ItemUseOverrides.java b/src/main/java/com/simibubi/create/foundation/block/ItemUseOverrides.java index ac60408745..858c12fe0c 100644 --- a/src/main/java/com/simibubi/create/foundation/block/ItemUseOverrides.java +++ b/src/main/java/com/simibubi/create/foundation/block/ItemUseOverrides.java @@ -4,8 +4,8 @@ import java.util.HashSet; import java.util.Set; import com.simibubi.create.AllItems; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.InteractionResult; import net.minecraft.world.level.block.Block; diff --git a/src/main/java/com/simibubi/create/foundation/block/WrenchableDirectionalBlock.java b/src/main/java/com/simibubi/create/foundation/block/WrenchableDirectionalBlock.java index 2714f87dd9..c338164107 100644 --- a/src/main/java/com/simibubi/create/foundation/block/WrenchableDirectionalBlock.java +++ b/src/main/java/com/simibubi/create/foundation/block/WrenchableDirectionalBlock.java @@ -1,7 +1,7 @@ package com.simibubi.create.foundation.block; import com.simibubi.create.content.contraptions.wrench.IWrenchable; -import com.simibubi.create.foundation.utility.DirectionHelper; +import net.createmod.catnip.utility.DirectionHelper; import net.minecraft.core.Direction; import net.minecraft.world.item.context.BlockPlaceContext; diff --git a/src/main/java/com/simibubi/create/foundation/block/connected/AllCTTypes.java b/src/main/java/com/simibubi/create/foundation/block/connected/AllCTTypes.java index c0bec9a52b..bfd8eb96b7 100644 --- a/src/main/java/com/simibubi/create/foundation/block/connected/AllCTTypes.java +++ b/src/main/java/com/simibubi/create/foundation/block/connected/AllCTTypes.java @@ -3,8 +3,8 @@ package com.simibubi.create.foundation.block.connected; import com.simibubi.create.Create; import com.simibubi.create.foundation.block.connected.ConnectedTextureBehaviour.CTContext; import com.simibubi.create.foundation.block.connected.ConnectedTextureBehaviour.ContextRequirement; -import com.simibubi.create.foundation.utility.Lang; +import net.createmod.catnip.utility.lang.Lang; import net.minecraft.resources.ResourceLocation; public enum AllCTTypes implements CTType { diff --git a/src/main/java/com/simibubi/create/foundation/block/connected/CTModel.java b/src/main/java/com/simibubi/create/foundation/block/connected/CTModel.java index 4dd338b18b..f9aac18227 100644 --- a/src/main/java/com/simibubi/create/foundation/block/connected/CTModel.java +++ b/src/main/java/com/simibubi/create/foundation/block/connected/CTModel.java @@ -7,8 +7,8 @@ import java.util.Random; import com.simibubi.create.foundation.block.connected.ConnectedTextureBehaviour.CTContext; import com.simibubi.create.foundation.block.render.QuadHelper; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Iterate; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.resources.model.BakedModel; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/simibubi/create/foundation/command/CouplingCommand.java b/src/main/java/com/simibubi/create/foundation/command/CouplingCommand.java index acb60d2958..1ba9ade40a 100644 --- a/src/main/java/com/simibubi/create/foundation/command/CouplingCommand.java +++ b/src/main/java/com/simibubi/create/foundation/command/CouplingCommand.java @@ -12,7 +12,7 @@ import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; import com.simibubi.create.content.contraptions.components.structureMovement.train.CouplingHandler; import com.simibubi.create.content.contraptions.components.structureMovement.train.capability.CapabilityMinecartController; import com.simibubi.create.content.contraptions.components.structureMovement.train.capability.MinecartController; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Iterate; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; diff --git a/src/main/java/com/simibubi/create/foundation/command/HighlightPacket.java b/src/main/java/com/simibubi/create/foundation/command/HighlightPacket.java index 7ecc083808..9920342145 100644 --- a/src/main/java/com/simibubi/create/foundation/command/HighlightPacket.java +++ b/src/main/java/com/simibubi/create/foundation/command/HighlightPacket.java @@ -3,9 +3,9 @@ package com.simibubi.create.foundation.command; import java.util.function.Supplier; import com.simibubi.create.AllSpecialTextures; -import com.simibubi.create.CreateClient; import com.simibubi.create.foundation.networking.SimplePacketBase; +import net.createmod.catnip.CatnipClient; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.network.FriendlyByteBuf; @@ -48,7 +48,7 @@ public class HighlightPacket extends SimplePacketBase { if (Minecraft.getInstance().level == null || !Minecraft.getInstance().level.isLoaded(pos)) return; - CreateClient.OUTLINER.showAABB("highlightCommand", Shapes.block() + CatnipClient.OUTLINER.showAABB("highlightCommand", Shapes.block() .bounds() .move(pos), 200) .lineWidth(1 / 32f) diff --git a/src/main/java/com/simibubi/create/foundation/command/KillTPSCommand.java b/src/main/java/com/simibubi/create/foundation/command/KillTPSCommand.java index 171a5a6ba2..dd7f24fceb 100644 --- a/src/main/java/com/simibubi/create/foundation/command/KillTPSCommand.java +++ b/src/main/java/com/simibubi/create/foundation/command/KillTPSCommand.java @@ -3,7 +3,7 @@ package com.simibubi.create.foundation.command; import com.mojang.brigadier.arguments.IntegerArgumentType; import com.mojang.brigadier.builder.ArgumentBuilder; import com.simibubi.create.Create; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; @@ -16,14 +16,14 @@ public class KillTPSCommand { .executes(ctx -> { // killtps no arguments ctx.getSource() - .sendSuccess(Lang.translateDirect("command.killTPSCommand.status.slowed_by.0", + .sendSuccess(CreateLang.translateDirect("command.killTPSCommand.status.slowed_by.0", Create.LAGGER.isLagging() ? Create.LAGGER.getTickTime() : 0), true); if (Create.LAGGER.isLagging()) ctx.getSource() - .sendSuccess(Lang.translateDirect("command.killTPSCommand.status.usage.0"), true); + .sendSuccess(CreateLang.translateDirect("command.killTPSCommand.status.usage.0"), true); else ctx.getSource() - .sendSuccess(Lang.translateDirect("command.killTPSCommand.status.usage.1"), true); + .sendSuccess(CreateLang.translateDirect("command.killTPSCommand.status.usage.1"), true); return 1; }) @@ -34,31 +34,31 @@ public class KillTPSCommand { if (tickTime > 0) { Create.LAGGER.setLagging(true); ctx.getSource() - .sendSuccess((Lang.translateDirect("command.killTPSCommand.status.slowed_by.1", tickTime)), + .sendSuccess((CreateLang.translateDirect("command.killTPSCommand.status.slowed_by.1", tickTime)), true); ctx.getSource() - .sendSuccess(Lang.translateDirect("command.killTPSCommand.status.usage.0"), true); + .sendSuccess(CreateLang.translateDirect("command.killTPSCommand.status.usage.0"), true); } else { ctx.getSource() - .sendSuccess(Lang.translateDirect("command.killTPSCommand.status.usage.1"), true); + .sendSuccess(CreateLang.translateDirect("command.killTPSCommand.status.usage.1"), true); } return 1; }) - .then(Commands.argument(Lang.translateDirect("command.killTPSCommand.argument.tickTime") + .then(Commands.argument(CreateLang.translateDirect("command.killTPSCommand.argument.tickTime") .getContents(), IntegerArgumentType.integer(1)) .executes(ctx -> { // killtps start tickTime int tickTime = IntegerArgumentType.getInteger(ctx, - Lang.translateDirect("command.killTPSCommand.argument.tickTime") + CreateLang.translateDirect("command.killTPSCommand.argument.tickTime") .getContents()); Create.LAGGER.setTickTime(tickTime); Create.LAGGER.setLagging(true); ctx.getSource() - .sendSuccess((Lang.translateDirect("command.killTPSCommand.status.slowed_by.1", tickTime)), + .sendSuccess((CreateLang.translateDirect("command.killTPSCommand.status.slowed_by.1", tickTime)), true); ctx.getSource() - .sendSuccess(Lang.translateDirect("command.killTPSCommand.status.usage.0"), true); + .sendSuccess(CreateLang.translateDirect("command.killTPSCommand.status.usage.0"), true); return 1; }))) @@ -67,7 +67,7 @@ public class KillTPSCommand { // killtps stop Create.LAGGER.setLagging(false); ctx.getSource() - .sendSuccess(Lang.translateDirect("command.killTPSCommand.status.slowed_by.2"), false); + .sendSuccess(CreateLang.translateDirect("command.killTPSCommand.status.slowed_by.2"), false); return 1; })); diff --git a/src/main/java/com/simibubi/create/foundation/command/PonderCommand.java b/src/main/java/com/simibubi/create/foundation/command/PonderCommand.java index 94ae2bc4ce..1da2c9a27b 100644 --- a/src/main/java/com/simibubi/create/foundation/command/PonderCommand.java +++ b/src/main/java/com/simibubi/create/foundation/command/PonderCommand.java @@ -7,8 +7,8 @@ import com.mojang.brigadier.Command; import com.mojang.brigadier.builder.ArgumentBuilder; import com.mojang.brigadier.suggestion.SuggestionProvider; import com.simibubi.create.foundation.networking.AllPackets; -import com.simibubi.create.foundation.ponder.PonderRegistry; +import net.createmod.ponder.foundation.PonderRegistry; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; import net.minecraft.commands.SharedSuggestionProvider; diff --git a/src/main/java/com/simibubi/create/foundation/command/SConfigureConfigPacket.java b/src/main/java/com/simibubi/create/foundation/command/SConfigureConfigPacket.java index 63036eddad..113173e775 100644 --- a/src/main/java/com/simibubi/create/foundation/command/SConfigureConfigPacket.java +++ b/src/main/java/com/simibubi/create/foundation/command/SConfigureConfigPacket.java @@ -12,13 +12,13 @@ import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.config.ui.BaseConfigScreen; import com.simibubi.create.foundation.config.ui.ConfigHelper; import com.simibubi.create.foundation.config.ui.SubMenuConfigScreen; -import com.simibubi.create.foundation.gui.ScreenOpener; import com.simibubi.create.foundation.networking.SimplePacketBase; -import com.simibubi.create.foundation.ponder.PonderRegistry; -import com.simibubi.create.foundation.ponder.ui.PonderIndexScreen; -import com.simibubi.create.foundation.ponder.ui.PonderUI; import com.simibubi.create.foundation.utility.CameraAngleAnimationService; +import net.createmod.catnip.gui.ScreenOpener; +import net.createmod.ponder.foundation.PonderRegistry; +import net.createmod.ponder.foundation.ui.PonderIndexScreen; +import net.createmod.ponder.foundation.ui.PonderUI; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; diff --git a/src/main/java/com/simibubi/create/foundation/config/AllConfigs.java b/src/main/java/com/simibubi/create/foundation/config/AllConfigs.java index 7563838407..5091f2dc2f 100644 --- a/src/main/java/com/simibubi/create/foundation/config/AllConfigs.java +++ b/src/main/java/com/simibubi/create/foundation/config/AllConfigs.java @@ -9,6 +9,7 @@ import org.apache.commons.lang3.tuple.Pair; import com.simibubi.create.foundation.block.BlockStressValues; +import net.createmod.catnip.config.ConfigBase; import net.minecraftforge.common.ForgeConfigSpec; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.ModLoadingContext; diff --git a/src/main/java/com/simibubi/create/foundation/config/CClient.java b/src/main/java/com/simibubi/create/foundation/config/CClient.java index 01f374a134..ab899ae448 100644 --- a/src/main/java/com/simibubi/create/foundation/config/CClient.java +++ b/src/main/java/com/simibubi/create/foundation/config/CClient.java @@ -1,7 +1,11 @@ package com.simibubi.create.foundation.config; +import javax.annotation.Nonnull; + import com.simibubi.create.foundation.config.ui.ConfigAnnotations; +import net.createmod.catnip.config.ConfigBase; + public class CClient extends ConfigBase { public final ConfigGroup client = group(0, "client", @@ -49,22 +53,6 @@ public class CClient extends ConfigBase { public final ConfigInt overlayBorderColorBot = i(0x50_28007f, Integer.MIN_VALUE, Integer.MAX_VALUE, "customBorderBotOverlay", Comments.overlayBorderColorBot); - //placement assist group - public final ConfigGroup placementAssist = group(1, "placementAssist", - Comments.placementAssist); - public final ConfigEnum placementIndicator = e(PlacementIndicatorSetting.TEXTURE, "indicatorType", - Comments.placementIndicator); - public final ConfigFloat indicatorScale = f(1.0f, 0f, "indicatorScale", - Comments.indicatorScale); - - //ponder group - public final ConfigGroup ponder = group(1, "ponder", - Comments.ponder); - public final ConfigBool comfyReading = b(false, "comfyReading", - Comments.comfyReading); - public final ConfigBool editingMode = b(false, "editingMode", - Comments.editingMode); - //sound group public final ConfigGroup sound = group(1, "sound", Comments.sound); @@ -78,14 +66,11 @@ public class CClient extends ConfigBase { public final ConfigFloat mountedZoomMultiplier = f(3, 0, "mountedZoomMultiplier", Comments.mountedZoomMultiplier); @Override + @Nonnull public String getName() { return "client"; } - public enum PlacementIndicatorSetting { - TEXTURE, TRIANGLE, NONE - } - private static class Comments { static String client = "Client-only settings - If you're looking for general settings, look inside your worlds serverconfig folder!"; static String tooltips = "Show item descriptions on Shift and controls on Ctrl."; @@ -130,15 +115,6 @@ public class CClient extends ConfigBase { "The custom bot color of the border gradient to use for the Goggle- and Hover- Overlays, if enabled", "[in Hex: #AaRrGgBb]", ConfigAnnotations.IntDisplay.HEX.asComment() }; - static String placementAssist = "Settings for the Placement Assist"; - static String[] placementIndicator = new String[]{ - "What indicator should be used when showing where the assisted placement ends up relative to your crosshair", - "Choose 'NONE' to disable the Indicator altogether" - }; - static String indicatorScale = "Change the size of the Indicator by this multiplier"; - static String ponder = "Ponder settings"; - static String comfyReading = "Slow down a ponder scene whenever there is text on screen."; - static String editingMode = "Show additional info in the ponder view and reload scene scripts more frequently."; static String sound = "Sound settings"; static String enableAmbientSounds = "Make cogs rumble and machines clatter."; static String ambientVolumeCap = "Maximum volume modifier of Ambient noise"; diff --git a/src/main/java/com/simibubi/create/foundation/config/CCommon.java b/src/main/java/com/simibubi/create/foundation/config/CCommon.java index 13847bc113..f285008aa1 100644 --- a/src/main/java/com/simibubi/create/foundation/config/CCommon.java +++ b/src/main/java/com/simibubi/create/foundation/config/CCommon.java @@ -1,5 +1,7 @@ package com.simibubi.create.foundation.config; +import net.createmod.catnip.config.ConfigBase; + public class CCommon extends ConfigBase { public final CWorldGen worldGen = nested(0, CWorldGen::new, Comments.worldGen); diff --git a/src/main/java/com/simibubi/create/foundation/config/CCuriosities.java b/src/main/java/com/simibubi/create/foundation/config/CCuriosities.java index 14ddacd564..9c8d663f4f 100644 --- a/src/main/java/com/simibubi/create/foundation/config/CCuriosities.java +++ b/src/main/java/com/simibubi/create/foundation/config/CCuriosities.java @@ -1,5 +1,7 @@ package com.simibubi.create.foundation.config; +import net.createmod.catnip.config.ConfigBase; + public class CCuriosities extends ConfigBase { public final ConfigInt maxSymmetryWandRange = i(50, 10, "maxSymmetryWandRange", Comments.symmetryRange); diff --git a/src/main/java/com/simibubi/create/foundation/config/CFluids.java b/src/main/java/com/simibubi/create/foundation/config/CFluids.java index 7f7d65f618..4831b7125e 100644 --- a/src/main/java/com/simibubi/create/foundation/config/CFluids.java +++ b/src/main/java/com/simibubi/create/foundation/config/CFluids.java @@ -2,6 +2,8 @@ package com.simibubi.create.foundation.config; import com.simibubi.create.content.contraptions.fluids.actors.FluidManipulationBehaviour.BottomlessFluidMode; +import net.createmod.catnip.config.ConfigBase; + public class CFluids extends ConfigBase { public final ConfigInt fluidTankCapacity = i(8, 1, "fluidTankCapacity", Comments.buckets, Comments.fluidTankCapacity); diff --git a/src/main/java/com/simibubi/create/foundation/config/CKinetics.java b/src/main/java/com/simibubi/create/foundation/config/CKinetics.java index 1b41296447..66c66ae1c4 100644 --- a/src/main/java/com/simibubi/create/foundation/config/CKinetics.java +++ b/src/main/java/com/simibubi/create/foundation/config/CKinetics.java @@ -2,6 +2,8 @@ package com.simibubi.create.foundation.config; import com.simibubi.create.foundation.config.ui.ConfigAnnotations; +import net.createmod.catnip.config.ConfigBase; + public class CKinetics extends ConfigBase { public final ConfigBool disableStress = b(false, "disableStress", Comments.disableStress); diff --git a/src/main/java/com/simibubi/create/foundation/config/CLogistics.java b/src/main/java/com/simibubi/create/foundation/config/CLogistics.java index cde5fe2d31..90e813ef4a 100644 --- a/src/main/java/com/simibubi/create/foundation/config/CLogistics.java +++ b/src/main/java/com/simibubi/create/foundation/config/CLogistics.java @@ -1,5 +1,7 @@ package com.simibubi.create.foundation.config; +import net.createmod.catnip.config.ConfigBase; + public class CLogistics extends ConfigBase { public final ConfigInt defaultExtractionLimit = diff --git a/src/main/java/com/simibubi/create/foundation/config/CRecipes.java b/src/main/java/com/simibubi/create/foundation/config/CRecipes.java index ec35f974fa..54308361fe 100644 --- a/src/main/java/com/simibubi/create/foundation/config/CRecipes.java +++ b/src/main/java/com/simibubi/create/foundation/config/CRecipes.java @@ -1,5 +1,7 @@ package com.simibubi.create.foundation.config; +import net.createmod.catnip.config.ConfigBase; + public class CRecipes extends ConfigBase { public final ConfigBool bulkPressing = b(false, "bulkPressing", Comments.bulkPressing); diff --git a/src/main/java/com/simibubi/create/foundation/config/CSchematics.java b/src/main/java/com/simibubi/create/foundation/config/CSchematics.java index 3409a41fc9..83dfe74e00 100644 --- a/src/main/java/com/simibubi/create/foundation/config/CSchematics.java +++ b/src/main/java/com/simibubi/create/foundation/config/CSchematics.java @@ -1,5 +1,7 @@ package com.simibubi.create.foundation.config; +import net.createmod.catnip.config.ConfigBase; + public class CSchematics extends ConfigBase { public final ConfigBool creativePrintIncludesAir = b(false, "creativePrintIncludesAir", Comments.creativePrintIncludesAir); diff --git a/src/main/java/com/simibubi/create/foundation/config/CServer.java b/src/main/java/com/simibubi/create/foundation/config/CServer.java index af92126516..caa18c49d6 100644 --- a/src/main/java/com/simibubi/create/foundation/config/CServer.java +++ b/src/main/java/com/simibubi/create/foundation/config/CServer.java @@ -1,5 +1,7 @@ package com.simibubi.create.foundation.config; +import net.createmod.catnip.config.ConfigBase; + public class CServer extends ConfigBase { public final ConfigGroup infrastructure = group(0, "infrastructure", Comments.infrastructure); diff --git a/src/main/java/com/simibubi/create/foundation/config/CStress.java b/src/main/java/com/simibubi/create/foundation/config/CStress.java index 5ab9d0bc23..2659248efe 100644 --- a/src/main/java/com/simibubi/create/foundation/config/CStress.java +++ b/src/main/java/com/simibubi/create/foundation/config/CStress.java @@ -4,11 +4,14 @@ import java.util.HashMap; import java.util.Map; import java.util.function.Supplier; +import javax.annotation.Nonnull; + import com.simibubi.create.Create; import com.simibubi.create.foundation.block.BlockStressDefaults; import com.simibubi.create.foundation.block.BlockStressValues.IStressValueProvider; -import com.simibubi.create.foundation.utility.Couple; +import net.createmod.catnip.config.ConfigBase; +import net.createmod.catnip.utility.Couple; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.Block; import net.minecraftforge.common.ForgeConfigSpec.Builder; @@ -20,7 +23,7 @@ public class CStress extends ConfigBase implements IStressValueProvider { private final Map> impacts = new HashMap<>(); @Override - protected void registerAll(Builder builder) { + public void registerAll(@Nonnull Builder builder) { builder.comment("", Comments.su, Comments.impact) .push("impact"); BlockStressDefaults.DEFAULT_IMPACTS.forEach((r, i) -> { diff --git a/src/main/java/com/simibubi/create/foundation/config/CTrains.java b/src/main/java/com/simibubi/create/foundation/config/CTrains.java index e76b70cb58..68cd7302c6 100644 --- a/src/main/java/com/simibubi/create/foundation/config/CTrains.java +++ b/src/main/java/com/simibubi/create/foundation/config/CTrains.java @@ -1,22 +1,24 @@ package com.simibubi.create.foundation.config; +import net.createmod.catnip.config.ConfigBase; + public class CTrains extends ConfigBase { public final ConfigBool trainsCauseDamage = b(true, "trainsCauseDamage", Comments.trainsCauseDamage); public final ConfigInt maxAssemblyLength = i(128, 5, "maxAssemblyLength", Comments.maxAssemblyLength); public final ConfigInt maxBogeyCount = i(20, 1, "maxBogeyCount", Comments.maxBogeyCount); public final ConfigFloat manualTrainSpeedModifier = f(.75f, 0, "manualTrainSpeedModifier", Comments.manualTrainSpeedModifier); - + public final ConfigGroup trainStats = group(1, "trainStats", "Standard Trains"); public final ConfigFloat trainTopSpeed = f(28, 0, "trainTopSpeed", Comments.mps, Comments.trainTopSpeed); public final ConfigFloat trainTurningTopSpeed = f(14, 0, "trainTurningTopSpeed", Comments.mps, Comments.trainTurningTopSpeed); public final ConfigFloat trainAcceleration = f(3, 0, "trainAcceleration", Comments.acc, Comments.trainAcceleration); - + public final ConfigGroup poweredTrainStats = group(1, "poweredTrainStats", "Powered Trains"); public final ConfigFloat poweredTrainTopSpeed = f(40, 0, "poweredTrainTopSpeed", Comments.mps, Comments.poweredTrainTopSpeed); public final ConfigFloat poweredTrainTurningTopSpeed = f(20, 0, "poweredTrainTurningTopSpeed", Comments.mps, Comments.poweredTrainTurningTopSpeed); public final ConfigFloat poweredTrainAcceleration = f(3, 0, "poweredTrainAcceleration", Comments.acc, Comments.poweredTrainAcceleration); - + @Override public String getName() { diff --git a/src/main/java/com/simibubi/create/foundation/config/CWorldGen.java b/src/main/java/com/simibubi/create/foundation/config/CWorldGen.java index 8220e50df5..43ba43cc9e 100644 --- a/src/main/java/com/simibubi/create/foundation/config/CWorldGen.java +++ b/src/main/java/com/simibubi/create/foundation/config/CWorldGen.java @@ -1,7 +1,10 @@ package com.simibubi.create.foundation.config; +import javax.annotation.Nonnull; + import com.simibubi.create.foundation.worldgen.AllWorldFeatures; +import net.createmod.catnip.config.ConfigBase; import net.minecraftforge.common.ForgeConfigSpec.Builder; public class CWorldGen extends ConfigBase { @@ -9,7 +12,7 @@ public class CWorldGen extends ConfigBase { public final ConfigBool disable = b(false, "disableWorldGen", Comments.disable); @Override - protected void registerAll(Builder builder) { + public void registerAll(@Nonnull Builder builder) { super.registerAll(builder); AllWorldFeatures.fillConfig(builder); } diff --git a/src/main/java/com/simibubi/create/foundation/config/ConfigBase.java b/src/main/java/com/simibubi/create/foundation/config/ConfigBase.java deleted file mode 100644 index 5b8565da38..0000000000 --- a/src/main/java/com/simibubi/create/foundation/config/ConfigBase.java +++ /dev/null @@ -1,192 +0,0 @@ -package com.simibubi.create.foundation.config; - -import java.util.ArrayList; -import java.util.List; -import java.util.function.Function; -import java.util.function.Supplier; - -import net.minecraftforge.common.ForgeConfigSpec; -import net.minecraftforge.common.ForgeConfigSpec.BooleanValue; -import net.minecraftforge.common.ForgeConfigSpec.Builder; -import net.minecraftforge.common.ForgeConfigSpec.ConfigValue; -import net.minecraftforge.common.ForgeConfigSpec.DoubleValue; -import net.minecraftforge.common.ForgeConfigSpec.EnumValue; -import net.minecraftforge.common.ForgeConfigSpec.IntValue; - -public abstract class ConfigBase { - - public ForgeConfigSpec specification; - - protected int depth; - protected List> allValues; - protected List children; - - protected void registerAll(final ForgeConfigSpec.Builder builder) { - for (CValue cValue : allValues) - cValue.register(builder); - } - - public void onLoad() { - if (children != null) - children.forEach(ConfigBase::onLoad); - } - - public void onReload() { - if (children != null) - children.forEach(ConfigBase::onReload); - } - - public abstract String getName(); - - @FunctionalInterface - protected static interface IValueProvider> - extends Function { - } - - protected ConfigBool b(boolean current, String name, String... comment) { - return new ConfigBool(name, current, comment); - } - - protected ConfigFloat f(float current, float min, float max, String name, String... comment) { - return new ConfigFloat(name, current, min, max, comment); - } - - protected ConfigFloat f(float current, float min, String name, String... comment) { - return f(current, min, Float.MAX_VALUE, name, comment); - } - - protected ConfigInt i(int current, int min, int max, String name, String... comment) { - return new ConfigInt(name, current, min, max, comment); - } - - protected ConfigInt i(int current, int min, String name, String... comment) { - return i(current, min, Integer.MAX_VALUE, name, comment); - } - - protected > ConfigEnum e(T defaultValue, String name, String... comment) { - return new ConfigEnum<>(name, defaultValue, comment); - } - - protected ConfigGroup group(int depth, String name, String... comment) { - return new ConfigGroup(name, depth, comment); - } - - protected T nested(int depth, Supplier constructor, String... comment) { - T config = constructor.get(); - new ConfigGroup(config.getName(), depth, comment); - new CValue(config.getName(), builder -> { - config.depth = depth; - config.registerAll(builder); - if (config.depth > depth) - builder.pop(config.depth - depth); - return null; - }); - if (children == null) - children = new ArrayList<>(); - children.add(config); - return config; - } - - public class CValue> { - protected ConfigValue value; - protected String name; - private IValueProvider provider; - - public CValue(String name, IValueProvider provider, String... comment) { - this.name = name; - this.provider = builder -> { - addComments(builder, comment); - return provider.apply(builder); - }; - if (allValues == null) - allValues = new ArrayList<>(); - allValues.add(this); - } - - public void addComments(Builder builder, String... comment) { - if (comment.length > 0) { - String[] comments = new String[comment.length + 1]; - comments[0] = " "; - System.arraycopy(comment, 0, comments, 1, comment.length); - builder.comment(comments); - } else - builder.comment(" "); - } - - public void register(ForgeConfigSpec.Builder builder) { - value = provider.apply(builder); - } - - public V get() { - return value.get(); - } - - public void set(V value) { - this.value.set(value); - } - - public String getName() { - return name; - } - } - - /** - * Marker for config subgroups - */ - public class ConfigGroup extends CValue { - - private int groupDepth; - private String[] comment; - - public ConfigGroup(String name, int depth, String... comment) { - super(name, builder -> null, comment); - groupDepth = depth; - this.comment = comment; - } - - @Override - public void register(Builder builder) { - if (depth > groupDepth) - builder.pop(depth - groupDepth); - depth = groupDepth; - addComments(builder, comment); - builder.push(getName()); - depth++; - } - - } - - public class ConfigBool extends CValue { - - public ConfigBool(String name, boolean def, String... comment) { - super(name, builder -> builder.define(name, def), comment); - } - } - - public class ConfigEnum> extends CValue> { - - public ConfigEnum(String name, T defaultValue, String[] comment) { - super(name, builder -> builder.defineEnum(name, defaultValue), comment); - } - - } - - public class ConfigFloat extends CValue { - - public ConfigFloat(String name, float current, float min, float max, String... comment) { - super(name, builder -> builder.defineInRange(name, current, min, max), comment); - } - - public float getF() { - return get().floatValue(); - } - } - - public class ConfigInt extends CValue { - - public ConfigInt(String name, int current, int min, int max, String... comment) { - super(name, builder -> builder.defineInRange(name, current, min, max), comment); - } - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/BaseConfigScreen.java b/src/main/java/com/simibubi/create/foundation/config/ui/BaseConfigScreen.java index cf5fb411f2..e3f3d488be 100644 --- a/src/main/java/com/simibubi/create/foundation/config/ui/BaseConfigScreen.java +++ b/src/main/java/com/simibubi/create/foundation/config/ui/BaseConfigScreen.java @@ -14,13 +14,14 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.Create; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.gui.AllIcons; -import com.simibubi.create.foundation.gui.ScreenOpener; -import com.simibubi.create.foundation.gui.Theme; -import com.simibubi.create.foundation.gui.UIRenderHelper; -import com.simibubi.create.foundation.gui.element.DelegatedStencilElement; -import com.simibubi.create.foundation.gui.element.TextStencilElement; -import com.simibubi.create.foundation.gui.widget.BoxWidget; -import com.simibubi.create.foundation.item.TooltipHelper; +import net.createmod.catnip.gui.ScreenOpener; + +import net.createmod.catnip.gui.element.FadableScreenElement; +import net.createmod.catnip.utility.FontHelper; +import net.createmod.catnip.utility.theme.Theme; +import net.createmod.catnip.gui.UIRenderHelper; +import net.createmod.catnip.gui.element.TextStencilElement; +import net.createmod.catnip.gui.widget.BoxWidget; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.screens.Screen; @@ -30,7 +31,7 @@ import net.minecraftforge.fml.config.ModConfig; public class BaseConfigScreen extends ConfigScreen { - public static final DelegatedStencilElement.ElementRenderer DISABLED_RENDERER = (ms, width, height, alpha) -> UIRenderHelper.angledGradient(ms, 0, 0, height / 2, height, width, Theme.p(Theme.Key.BUTTON_DISABLE)); + public static final FadableScreenElement DISABLED_RENDERER = (ms, width, height, alpha) -> UIRenderHelper.angledGradient(ms, 0, 0, height / 2, height, width, Theme.Key.BUTTON_DISABLE.p()); private static final Map> DEFAULTS = new HashMap<>(); static { @@ -182,7 +183,7 @@ public class BaseConfigScreen extends ConfigScreen { serverConfigWidget.getToolTip() .add(new TextComponent("Stored individually per World")); serverConfigWidget.getToolTip() - .addAll(TooltipHelper.cutTextComponent( + .addAll(FontHelper.cutTextComponent( new TextComponent( "Gameplay settings can only be accessed from the in-game menu after joining a World or Server."), ChatFormatting.GRAY, ChatFormatting.GRAY)); @@ -194,15 +195,15 @@ public class BaseConfigScreen extends ConfigScreen { TextStencilElement titleText = new TextStencilElement(font, modID.toUpperCase(Locale.ROOT)) .centered(true, true) .withElementRenderer((ms, w, h, alpha) -> { - UIRenderHelper.angledGradient(ms, 0, 0, h / 2, h, w / 2, Theme.p(Theme.Key.CONFIG_TITLE_A)); - UIRenderHelper.angledGradient(ms, 0, w / 2, h / 2, h, w / 2, Theme.p(Theme.Key.CONFIG_TITLE_B)); + UIRenderHelper.angledGradient(ms, 0, 0, h / 2, h, w / 2, Theme.Key.CONFIG_TITLE_A.p()); + UIRenderHelper.angledGradient(ms, 0, w / 2, h / 2, h, w / 2, Theme.Key.CONFIG_TITLE_B.p()); }); int boxWidth = width + 10; int boxHeight = 39; int boxPadding = 4; title = new BoxWidget(-5, height / 2 - 110, boxWidth, boxHeight) //.withCustomBackground(new Color(0x20_000000, true)) - .withBorderColors(Theme.p(Theme.Key.BUTTON_IDLE)) + .withBorderColors(Theme.Key.BUTTON_IDLE.p()) .withPadding(0, boxPadding) .rescaleElement(boxWidth / 2f, (boxHeight - 2 * boxPadding) / 2f)//double the text size by telling it the element is only half as big as the available space .showingElement(titleText.at(0, 7)); @@ -230,7 +231,7 @@ public class BaseConfigScreen extends ConfigScreen { @Override protected void renderWindow(PoseStack ms, int mouseX, int mouseY, float partialTicks) { - drawCenteredString(ms, font, "Access Configs for Mod:", width / 2, height / 2 - 105, Theme.i(Theme.Key.TEXT_ACCENT_STRONG)); + drawCenteredString(ms, font, "Access Configs for Mod:", width / 2, height / 2 - 105, Theme.Key.TEXT_ACCENT_STRONG.i()); } private void linkTo(Screen screen) { diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/ConfigHelper.java b/src/main/java/com/simibubi/create/foundation/config/ui/ConfigHelper.java index af0e38450d..912240d12a 100644 --- a/src/main/java/com/simibubi/create/foundation/config/ui/ConfigHelper.java +++ b/src/main/java/com/simibubi/create/foundation/config/ui/ConfigHelper.java @@ -20,8 +20,8 @@ import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import com.simibubi.create.Create; import com.simibubi.create.foundation.config.AllConfigs; -import com.simibubi.create.foundation.utility.Pair; +import net.createmod.catnip.utility.Pair; import net.minecraftforge.common.ForgeConfigSpec; import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.ModList; diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/ConfigModListScreen.java b/src/main/java/com/simibubi/create/foundation/config/ui/ConfigModListScreen.java index 51231e5884..71f05047fd 100644 --- a/src/main/java/com/simibubi/create/foundation/config/ui/ConfigModListScreen.java +++ b/src/main/java/com/simibubi/create/foundation/config/ui/ConfigModListScreen.java @@ -8,12 +8,12 @@ import org.lwjgl.glfw.GLFW; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.foundation.gui.AllIcons; -import com.simibubi.create.foundation.gui.ScreenOpener; -import com.simibubi.create.foundation.gui.Theme; -import com.simibubi.create.foundation.gui.element.DelegatedStencilElement; -import com.simibubi.create.foundation.gui.widget.BoxWidget; -import com.simibubi.create.foundation.item.TooltipHelper; +import net.createmod.catnip.gui.ScreenOpener; +import net.createmod.catnip.gui.element.DelegatedStencilElement; +import net.createmod.catnip.gui.widget.BoxWidget; +import net.createmod.catnip.utility.FontHelper; +import net.createmod.catnip.utility.theme.Theme; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.TextComponent; @@ -87,9 +87,9 @@ public class ConfigModListScreen extends ConfigScreen { list.setScrollAmount(list.getScrollAmount()); if (list.children().size() > 0) { - this.search.setTextColor(Theme.i(Theme.Key.TEXT)); + this.search.setTextColor(Theme.Key.TEXT.i()); } else { - this.search.setTextColor(Theme.i(Theme.Key.BUTTON_FAIL)); + this.search.setTextColor(Theme.Key.BUTTON_FAIL.i()); } } @@ -113,7 +113,7 @@ public class ConfigModListScreen extends ConfigScreen { button.updateColorsFromState(); button.modifyElement(e -> ((DelegatedStencilElement) e).withElementRenderer(BaseConfigScreen.DISABLED_RENDERER)); labelTooltip.add(new TextComponent(toHumanReadable(id))); - labelTooltip.addAll(TooltipHelper.cutTextComponent(new TextComponent("This Mod does not have any configs registered or is not using Forge's config system"), ChatFormatting.GRAY, ChatFormatting.GRAY)); + labelTooltip.addAll(FontHelper.cutTextComponent(new TextComponent("This Mod does not have any configs registered or is not using Forge's config system"), ChatFormatting.GRAY, ChatFormatting.GRAY)); } listeners.add(button); diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/ConfigScreen.java b/src/main/java/com/simibubi/create/foundation/config/ui/ConfigScreen.java index bd86c151d0..3bf80618ea 100644 --- a/src/main/java/com/simibubi/create/foundation/config/ui/ConfigScreen.java +++ b/src/main/java/com/simibubi/create/foundation/config/ui/ConfigScreen.java @@ -16,14 +16,14 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock; -import com.simibubi.create.foundation.gui.AbstractSimiScreen; import com.simibubi.create.foundation.gui.CreateMainMenuScreen; -import com.simibubi.create.foundation.gui.UIRenderHelper; -import com.simibubi.create.foundation.gui.element.GuiGameElement; -import com.simibubi.create.foundation.gui.element.StencilElement; -import com.simibubi.create.foundation.utility.animation.Force; -import com.simibubi.create.foundation.utility.animation.PhysicalFloat; +import net.createmod.catnip.gui.AbstractSimiScreen; +import net.createmod.catnip.gui.UIRenderHelper; +import net.createmod.catnip.gui.element.DelegatedStencilElement; +import net.createmod.catnip.gui.element.GuiGameElement; +import net.createmod.catnip.utility.animation.Force; +import net.createmod.catnip.utility.animation.PhysicalFloat; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.Screen; import net.minecraft.core.Direction; @@ -75,7 +75,7 @@ public abstract class ConfigScreen extends AbstractSimiScreen { renderMenuBackground(ms, partialTicks); } - new StencilElement() { + /*new StencilElement() { @Override protected void renderStencil(PoseStack ms) { renderCog(ms, partialTicks); @@ -85,7 +85,12 @@ public abstract class ConfigScreen extends AbstractSimiScreen { protected void renderElement(PoseStack ms) { fill(ms, -200, -200, 200, 200, 0x60_000000); } - }.at(width * 0.5f, height * 0.5f, 0).render(ms); + }*/ + + new DelegatedStencilElement( + (ps, x, y, alpha) -> renderCog(ps, partialTicks), + (ps, x, y, alpha) -> fill(ms, -200, -200, 200, 200, 0x60_000000) + ).at(width * 0.5f, height * 0.5f, 0).render(ms); super.renderWindowBackground(ms, mouseX, mouseY, partialTicks); diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/ConfigScreenList.java b/src/main/java/com/simibubi/create/foundation/config/ui/ConfigScreenList.java index f014b54246..e229be96fb 100644 --- a/src/main/java/com/simibubi/create/foundation/config/ui/ConfigScreenList.java +++ b/src/main/java/com/simibubi/create/foundation/config/ui/ConfigScreenList.java @@ -13,13 +13,13 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.foundation.config.ui.entries.NumberEntry; import com.simibubi.create.foundation.gui.RemovedGuiUtils; -import com.simibubi.create.foundation.gui.Theme; -import com.simibubi.create.foundation.gui.TickableGuiEventListener; -import com.simibubi.create.foundation.gui.UIRenderHelper; -import com.simibubi.create.foundation.gui.element.TextStencilElement; -import com.simibubi.create.foundation.utility.Color; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; +import net.createmod.catnip.gui.TickableGuiEventListener; +import net.createmod.catnip.gui.UIRenderHelper; +import net.createmod.catnip.gui.element.TextStencilElement; +import net.createmod.catnip.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.theme.Color; +import net.createmod.catnip.utility.theme.Theme; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.components.EditBox; @@ -177,7 +177,7 @@ public class ConfigScreenList extends ObjectSelectionList UIRenderHelper.angledGradient(ms, 0, 0, height / 2, height, width, Theme.p(Theme.Key.TEXT_ACCENT_STRONG))); + this.label.withElementRenderer((ms, width, height, alpha) -> UIRenderHelper.angledGradient(ms, 0, 0, height / 2, height, width, Theme.Key.TEXT_ACCENT_STRONG.p())); labelTooltip = new ArrayList<>(); } @@ -216,8 +216,8 @@ public class ConfigScreenList extends ObjectSelectionList getLabelWidth(width) - 10) { @@ -225,7 +225,7 @@ public class ConfigScreenList extends ObjectSelectionList red = Theme.p(Theme.Key.BUTTON_FAIL); - Couple green = Theme.p(Theme.Key.BUTTON_SUCCESS); + Couple red = Theme.Key.BUTTON_FAIL.p(); + Couple green = Theme.Key.BUTTON_SUCCESS.p(); DelegatedStencilElement stencil = new DelegatedStencilElement(); @@ -332,13 +332,13 @@ public class SubMenuConfigScreen extends ConfigScreen { stencil.withElementRenderer((ms, w, h, alpha) -> UIRenderHelper.angledGradient(ms, 90, 8, 0, 16, 16, red)); serverLocked.withBorderColors(red); serverLocked.getToolTip().add(new TextComponent("Locked").withStyle(ChatFormatting.BOLD)); - serverLocked.getToolTip().addAll(TooltipHelper.cutStringTextComponent("You do not have enough permissions to edit the server config. You can still look at the current values here though.", ChatFormatting.GRAY, ChatFormatting.GRAY)); + serverLocked.getToolTip().addAll(FontHelper.cutStringTextComponent("You do not have enough permissions to edit the server config. You can still look at the current values here though.", ChatFormatting.GRAY, ChatFormatting.GRAY)); } else { stencil.withStencilRenderer((ms, w, h, alpha) -> AllIcons.I_CONFIG_UNLOCKED.render(ms, 0, 0)); stencil.withElementRenderer((ms, w, h, alpha) -> UIRenderHelper.angledGradient(ms, 90, 8, 0, 16, 16, green)); serverLocked.withBorderColors(green); serverLocked.getToolTip().add(new TextComponent("Unlocked").withStyle(ChatFormatting.BOLD)); - serverLocked.getToolTip().addAll(TooltipHelper.cutStringTextComponent("You have enough permissions to edit the server config. Changes you make here will be synced with the server when you save them.", ChatFormatting.GRAY, ChatFormatting.GRAY)); + serverLocked.getToolTip().addAll(FontHelper.cutStringTextComponent("You have enough permissions to edit the server config. Changes you make here will be synced with the server when you save them.", ChatFormatting.GRAY, ChatFormatting.GRAY)); } addRenderableWidget(serverLocked); @@ -349,7 +349,7 @@ public class SubMenuConfigScreen extends ConfigScreen { super.renderWindow(ms, mouseX, mouseY, partialTicks); int x = width / 2; - drawCenteredString(ms, minecraft.font, ConfigScreen.modID + " > " + type.toString().toLowerCase(Locale.ROOT) + " > " + title, x, 15, Theme.i(Theme.Key.TEXT)); + drawCenteredString(ms, minecraft.font, ConfigScreen.modID + " > " + type.toString().toLowerCase(Locale.ROOT) + " > " + title, x, 15, Theme.Key.TEXT.i()); } @Override @@ -393,9 +393,9 @@ public class SubMenuConfigScreen extends ConfigScreen { private void updateFilter(String search) { if (list.search(search)) { - this.search.setTextColor(Theme.i(Theme.Key.TEXT)); + this.search.setTextColor(Theme.Key.TEXT.i()); } else { - this.search.setTextColor(Theme.i(Theme.Key.BUTTON_FAIL)); + this.search.setTextColor(Theme.Key.BUTTON_FAIL.i()); } } diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/entries/BooleanEntry.java b/src/main/java/com/simibubi/create/foundation/config/ui/entries/BooleanEntry.java index 3711004411..1d617ea240 100644 --- a/src/main/java/com/simibubi/create/foundation/config/ui/entries/BooleanEntry.java +++ b/src/main/java/com/simibubi/create/foundation/config/ui/entries/BooleanEntry.java @@ -2,11 +2,11 @@ package com.simibubi.create.foundation.config.ui.entries; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.foundation.gui.AllIcons; -import com.simibubi.create.foundation.gui.Theme; -import com.simibubi.create.foundation.gui.UIRenderHelper; -import com.simibubi.create.foundation.gui.element.RenderElement; -import com.simibubi.create.foundation.gui.widget.BoxWidget; +import net.createmod.catnip.gui.UIRenderHelper; +import net.createmod.catnip.gui.element.RenderElement; +import net.createmod.catnip.gui.widget.BoxWidget; +import net.createmod.catnip.utility.theme.Theme; import net.minecraftforge.common.ForgeConfigSpec; public class BooleanEntry extends ValueEntry { @@ -19,11 +19,11 @@ public class BooleanEntry extends ValueEntry { super(label, value, spec); enabled = AllIcons.I_CONFIRM.asStencil() - .withElementRenderer((ms, width, height, alpha) -> UIRenderHelper.angledGradient(ms, 0, 0, height / 2, height, width, Theme.p(Theme.Key.BUTTON_SUCCESS))) + .withElementRenderer((ms, width, height, alpha) -> UIRenderHelper.angledGradient(ms, 0, 0, height / 2, height, width, Theme.Key.BUTTON_SUCCESS.p())) .at(10, 0); disabled = AllIcons.I_DISABLE.asStencil() - .withElementRenderer((ms, width, height, alpha) -> UIRenderHelper.angledGradient(ms, 0, 0, height / 2, height, width, Theme.p(Theme.Key.BUTTON_FAIL))) + .withElementRenderer((ms, width, height, alpha) -> UIRenderHelper.angledGradient(ms, 0, 0, height / 2, height, width, Theme.Key.BUTTON_FAIL.p())) .at(10, 0); button = new BoxWidget().showingElement(enabled) diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/entries/EnumEntry.java b/src/main/java/com/simibubi/create/foundation/config/ui/entries/EnumEntry.java index cc70e436f7..d57f949425 100644 --- a/src/main/java/com/simibubi/create/foundation/config/ui/entries/EnumEntry.java +++ b/src/main/java/com/simibubi/create/foundation/config/ui/entries/EnumEntry.java @@ -5,13 +5,13 @@ import java.util.Locale; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.foundation.config.ui.ConfigScreen; import com.simibubi.create.foundation.gui.AllIcons; -import com.simibubi.create.foundation.gui.Theme; -import com.simibubi.create.foundation.gui.UIRenderHelper; -import com.simibubi.create.foundation.gui.element.BoxElement; -import com.simibubi.create.foundation.gui.element.DelegatedStencilElement; -import com.simibubi.create.foundation.gui.element.TextStencilElement; -import com.simibubi.create.foundation.gui.widget.BoxWidget; +import net.createmod.catnip.gui.UIRenderHelper; +import net.createmod.catnip.gui.element.BoxElement; +import net.createmod.catnip.gui.element.DelegatedStencilElement; +import net.createmod.catnip.gui.element.TextStencilElement; +import net.createmod.catnip.gui.widget.BoxWidget; +import net.createmod.catnip.utility.theme.Theme; import net.minecraft.client.Minecraft; import net.minecraftforge.common.ForgeConfigSpec; @@ -28,18 +28,18 @@ public class EnumEntry extends ValueEntry> { valueText = new TextStencilElement(Minecraft.getInstance().font, "YEP").centered(true, true); valueText.withElementRenderer((ms, width, height, alpha) -> UIRenderHelper.angledGradient(ms, 0, 0, height / 2, - height, width, Theme.p(Theme.Key.TEXT))); + height, width, Theme.Key.TEXT.p())); DelegatedStencilElement l = AllIcons.I_CONFIG_PREV.asStencil(); cycleLeft = new BoxWidget(0, 0, cycleWidth + 8, 16) - .withCustomBackground(Theme.c(Theme.Key.PONDER_BACKGROUND_FLAT)) + .withCustomBackground(Theme.Key.PONDER_BACKGROUND_FLAT.c()) .showingElement(l) .withCallback(() -> cycleValue(-1)); l.withElementRenderer(BoxWidget.gradientFactory.apply(cycleLeft)); DelegatedStencilElement r = AllIcons.I_CONFIG_NEXT.asStencil(); cycleRight = new BoxWidget(0, 0, cycleWidth + 8, 16) - .withCustomBackground(Theme.c(Theme.Key.PONDER_BACKGROUND_FLAT)) + .withCustomBackground(Theme.Key.PONDER_BACKGROUND_FLAT.c()) .showingElement(r) .withCallback(() -> cycleValue(1)); r.at(cycleWidth - 8, 0); @@ -94,7 +94,7 @@ public class EnumEntry extends ValueEntry> { cycleRight.render(ms, mouseX, mouseY, partialTicks); new BoxElement() - .withBackground(Theme.c(Theme.Key.PONDER_BACKGROUND_FLAT)) + .withBackground(Theme.Key.PONDER_BACKGROUND_FLAT.c()) .flatBorder(0x01_000000) .withBounds(48, 6) .at(cycleLeft.x + 22, cycleLeft.y + 5) diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/entries/NumberEntry.java b/src/main/java/com/simibubi/create/foundation/config/ui/entries/NumberEntry.java index e90668608c..656e5846a8 100644 --- a/src/main/java/com/simibubi/create/foundation/config/ui/entries/NumberEntry.java +++ b/src/main/java/com/simibubi/create/foundation/config/ui/entries/NumberEntry.java @@ -8,9 +8,10 @@ import javax.annotation.Nullable; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.foundation.config.ui.ConfigTextField; -import com.simibubi.create.foundation.gui.Theme; -import com.simibubi.create.foundation.gui.UIRenderHelper; -import com.simibubi.create.foundation.gui.element.TextStencilElement; + +import net.createmod.catnip.utility.theme.Theme; +import net.createmod.catnip.gui.UIRenderHelper; +import net.createmod.catnip.gui.element.TextStencilElement; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; @@ -61,7 +62,7 @@ public abstract class NumberEntry extends ValueEntry { } else { textField.setValue(String.valueOf(getValue())); } - textField.setTextColor(Theme.i(Theme.Key.TEXT)); + textField.setTextColor(Theme.Key.TEXT.i()); Object range = spec.getRange(); try { @@ -76,13 +77,13 @@ public abstract class NumberEntry extends ValueEntry { if (min.doubleValue() > getTypeMin().doubleValue()) { TextComponent t = new TextComponent(formatBound(min) + " < "); minText = new TextStencilElement(font, t).centered(true, false); - minText.withElementRenderer((ms, width, height, alpha) -> UIRenderHelper.angledGradient(ms, 0 ,0, height/2, height, width, Theme.p(Theme.Key.TEXT_DARKER))); + minText.withElementRenderer((ms, width, height, alpha) -> UIRenderHelper.angledGradient(ms, 0 ,0, height/2, height, width, Theme.Key.TEXT_DARKER.p())); minOffset = font.width(t); } if (max.doubleValue() < getTypeMax().doubleValue()) { TextComponent t = new TextComponent(" < " + formatBound(max)); maxText = new TextStencilElement(font, t).centered(true, false); - maxText.withElementRenderer((ms, width, height, alpha) -> UIRenderHelper.angledGradient(ms, 0 ,0, height/2, height, width, Theme.p(Theme.Key.TEXT_DARKER))); + maxText.withElementRenderer((ms, width, height, alpha) -> UIRenderHelper.angledGradient(ms, 0 ,0, height/2, height, width, Theme.Key.TEXT_DARKER.p())); maxOffset = font.width(t); } } catch (NoSuchFieldException | IllegalAccessException | ClassCastException | NullPointerException ignored) { @@ -95,11 +96,11 @@ public abstract class NumberEntry extends ValueEntry { if (!spec.test(number)) throw new IllegalArgumentException(); - textField.setTextColor(Theme.i(Theme.Key.TEXT)); + textField.setTextColor(Theme.Key.TEXT.i()); setValue(number); } catch (IllegalArgumentException ignored) { - textField.setTextColor(Theme.i(Theme.Key.BUTTON_FAIL)); + textField.setTextColor(Theme.Key.BUTTON_FAIL.i()); } }); diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/entries/SubMenuEntry.java b/src/main/java/com/simibubi/create/foundation/config/ui/entries/SubMenuEntry.java index d86f98aaaf..c9a6c9a4c0 100644 --- a/src/main/java/com/simibubi/create/foundation/config/ui/entries/SubMenuEntry.java +++ b/src/main/java/com/simibubi/create/foundation/config/ui/entries/SubMenuEntry.java @@ -5,10 +5,10 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.foundation.config.ui.ConfigScreenList; import com.simibubi.create.foundation.config.ui.SubMenuConfigScreen; import com.simibubi.create.foundation.gui.AllIcons; -import com.simibubi.create.foundation.gui.ScreenOpener; -import com.simibubi.create.foundation.gui.element.DelegatedStencilElement; -import com.simibubi.create.foundation.gui.widget.BoxWidget; +import net.createmod.catnip.gui.ScreenOpener; +import net.createmod.catnip.gui.element.DelegatedStencilElement; +import net.createmod.catnip.gui.widget.BoxWidget; import net.minecraftforge.common.ForgeConfigSpec; public class SubMenuEntry extends ConfigScreenList.LabeledEntry { diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/entries/ValueEntry.java b/src/main/java/com/simibubi/create/foundation/config/ui/entries/ValueEntry.java index 1d3d89d3b6..1e1ce7418b 100644 --- a/src/main/java/com/simibubi/create/foundation/config/ui/entries/ValueEntry.java +++ b/src/main/java/com/simibubi/create/foundation/config/ui/entries/ValueEntry.java @@ -15,11 +15,11 @@ import com.simibubi.create.foundation.config.ui.ConfigHelper; import com.simibubi.create.foundation.config.ui.ConfigScreen; import com.simibubi.create.foundation.config.ui.ConfigScreenList; import com.simibubi.create.foundation.gui.AllIcons; -import com.simibubi.create.foundation.gui.element.DelegatedStencilElement; -import com.simibubi.create.foundation.gui.widget.BoxWidget; -import com.simibubi.create.foundation.item.TooltipHelper; -import com.simibubi.create.foundation.utility.Pair; +import net.createmod.catnip.gui.element.DelegatedStencilElement; +import net.createmod.catnip.gui.widget.BoxWidget; +import net.createmod.catnip.utility.FontHelper; +import net.createmod.catnip.utility.Pair; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.TextComponent; import net.minecraftforge.common.ForgeConfigSpec; @@ -69,15 +69,15 @@ public class ValueEntry extends ConfigScreenList.LabeledEntry { labelTooltip.addAll(commentLines.stream() .filter(Predicates.not(s -> s.startsWith("Range"))) .map(TextComponent::new) - .flatMap(stc -> TooltipHelper.cutTextComponent(stc, ChatFormatting.GRAY, ChatFormatting.GRAY) + .flatMap(stc -> FontHelper.cutTextComponent(stc, ChatFormatting.GRAY, ChatFormatting.GRAY) .stream()) .collect(Collectors.toList())); if (annotations.containsKey(ConfigAnnotations.RequiresRelog.TRUE.getName())) - labelTooltip.addAll(TooltipHelper.cutTextComponent(new TextComponent("Changing this value will require a _relog_ to take full effect"), ChatFormatting.GRAY, ChatFormatting.GOLD)); + labelTooltip.addAll(FontHelper.cutTextComponent(new TextComponent("Changing this value will require a _relog_ to take full effect"), ChatFormatting.GRAY, ChatFormatting.GOLD)); if (annotations.containsKey(ConfigAnnotations.RequiresRestart.CLIENT.getName())) - labelTooltip.addAll(TooltipHelper.cutTextComponent(new TextComponent("Changing this value will require a _restart_ to take full effect"), ChatFormatting.GRAY, ChatFormatting.RED)); + labelTooltip.addAll(FontHelper.cutTextComponent(new TextComponent("Changing this value will require a _restart_ to take full effect"), ChatFormatting.GRAY, ChatFormatting.RED)); labelTooltip.add(new TextComponent(ConfigScreen.modID + ":" + path.get(path.size() - 1)).withStyle(ChatFormatting.DARK_GRAY)); } diff --git a/src/main/java/com/simibubi/create/foundation/data/AllLangPartials.java b/src/main/java/com/simibubi/create/foundation/data/AllLangPartials.java index 436839f30d..8ed068b2e2 100644 --- a/src/main/java/com/simibubi/create/foundation/data/AllLangPartials.java +++ b/src/main/java/com/simibubi/create/foundation/data/AllLangPartials.java @@ -5,9 +5,10 @@ import com.google.gson.JsonElement; import com.simibubi.create.AllSoundEvents; import com.simibubi.create.Create; import com.simibubi.create.foundation.advancement.AllAdvancements; -import com.simibubi.create.foundation.ponder.PonderLocalization; import com.simibubi.create.foundation.utility.FilesHelper; -import com.simibubi.create.foundation.utility.Lang; + +import net.createmod.catnip.utility.lang.Lang; +import net.createmod.ponder.foundation.PonderLocalization; public enum AllLangPartials { @@ -15,7 +16,7 @@ public enum AllLangPartials { INTERFACE("UI & Messages"), SUBTITLES("Subtitles", AllSoundEvents::provideLangEntries), TOOLTIPS("Item Descriptions"), - PONDER("Ponder Content", PonderLocalization::provideLangEntries), + PONDER("Ponder Content", () -> PonderLocalization.provideLangEntries(Create.ID)), ; diff --git a/src/main/java/com/simibubi/create/foundation/data/BlockStateGen.java b/src/main/java/com/simibubi/create/foundation/data/BlockStateGen.java index 8b2619a020..8b14483f48 100644 --- a/src/main/java/com/simibubi/create/foundation/data/BlockStateGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/BlockStateGen.java @@ -25,12 +25,12 @@ import com.simibubi.create.content.contraptions.components.structureMovement.mou import com.simibubi.create.content.contraptions.fluids.pipes.EncasedPipeBlock; import com.simibubi.create.content.contraptions.fluids.pipes.FluidPipeBlock; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.Pointing; import com.tterrag.registrate.providers.DataGenContext; import com.tterrag.registrate.providers.RegistrateBlockstateProvider; import com.tterrag.registrate.util.nullness.NonNullBiConsumer; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.Pointing; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; import net.minecraft.core.Direction.AxisDirection; @@ -76,7 +76,7 @@ public class BlockStateGen { boolean customItem) { return (c, p) -> horizontalAxisBlock(c, p, getBlockModel(customItem, c, p)); } - + public static NonNullBiConsumer, RegistrateBlockstateProvider> simpleCubeAll( String path) { return (c, p) -> p.simpleBlock(c.get(), p.models() diff --git a/src/main/java/com/simibubi/create/foundation/data/LangMerger.java b/src/main/java/com/simibubi/create/foundation/data/LangMerger.java index ddbb9529da..b6c759e0bc 100644 --- a/src/main/java/com/simibubi/create/foundation/data/LangMerger.java +++ b/src/main/java/com/simibubi/create/foundation/data/LangMerger.java @@ -23,9 +23,9 @@ import com.google.gson.GsonBuilder; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.simibubi.create.Create; -import com.simibubi.create.foundation.ponder.PonderScene; import com.simibubi.create.foundation.utility.FilesHelper; +import net.createmod.ponder.foundation.PonderScene; import net.minecraft.data.DataGenerator; import net.minecraft.data.DataProvider; import net.minecraft.data.HashCache; @@ -60,7 +60,7 @@ public class LangMerger implements DataProvider { private void populateLangIgnore() { // Key prefixes added here will NOT be transferred to lang templates langIgnore.add("create.ponder.debug_"); // Ponder debug scene text - langIgnore.add("create.gui.chromatic_projector"); + langIgnore.add("create.gui.chromatic_projector"); } private boolean shouldIgnore(String key) { diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/CompatMetals.java b/src/main/java/com/simibubi/create/foundation/data/recipe/CompatMetals.java index dd275be0b6..ec23433977 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/CompatMetals.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/CompatMetals.java @@ -4,7 +4,7 @@ import static com.simibubi.create.foundation.data.recipe.Mods.IE; import static com.simibubi.create.foundation.data.recipe.Mods.MEK; import static com.simibubi.create.foundation.data.recipe.Mods.TH; -import com.simibubi.create.foundation.utility.Lang; +import net.createmod.catnip.utility.lang.Lang; public enum CompatMetals { ALUMINUM(IE), diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/CrushingRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/CrushingRecipeGen.java index 1b4b9d8945..4866950897 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/CrushingRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/CrushingRecipeGen.java @@ -20,8 +20,8 @@ import com.simibubi.create.AllTags; import com.simibubi.create.content.contraptions.processing.ProcessingRecipe; import com.simibubi.create.content.contraptions.processing.ProcessingRecipeBuilder; import com.simibubi.create.content.palettes.AllPaletteStoneTypes; -import com.simibubi.create.foundation.utility.Lang; +import net.createmod.catnip.utility.lang.Lang; import net.minecraft.data.DataGenerator; import net.minecraft.tags.ItemTags; import net.minecraft.util.Mth; diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/LogStrippingFakeRecipes.java b/src/main/java/com/simibubi/create/foundation/data/recipe/LogStrippingFakeRecipes.java index 3cf72b7537..a5b2b49f69 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/LogStrippingFakeRecipes.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/LogStrippingFakeRecipes.java @@ -6,7 +6,7 @@ import java.util.List; import com.simibubi.create.content.contraptions.components.deployer.ManualApplicationRecipe; import com.simibubi.create.content.contraptions.processing.ProcessingRecipeBuilder; import com.simibubi.create.foundation.config.AllConfigs; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.ItemTags; @@ -33,7 +33,7 @@ public class LogStrippingFakeRecipes { ItemStack axe = new ItemStack(Items.IRON_AXE); axe.hideTooltipPart(TooltipPart.MODIFIERS); - axe.setHoverName(Lang.translateDirect("recipe.item_application.any_axe") + axe.setHoverName(CreateLang.translateDirect("recipe.item_application.any_axe") .withStyle(style -> style.withItalic(false))); ITagManager tags = ForgeRegistries.ITEMS.tags(); tags.getTag(ItemTags.LOGS) diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java index fdb315cfd5..fdaf19f147 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java @@ -27,11 +27,11 @@ import com.simibubi.create.Create; import com.simibubi.create.content.AllSections; import com.simibubi.create.content.palettes.AllPaletteBlocks; import com.simibubi.create.content.palettes.AllPaletteStoneTypes; -import com.simibubi.create.foundation.utility.Lang; import com.tterrag.registrate.util.entry.BlockEntry; import com.tterrag.registrate.util.entry.ItemEntry; import com.tterrag.registrate.util.entry.ItemProviderEntry; +import net.createmod.catnip.utility.lang.Lang; import net.minecraft.advancements.critereon.ItemPredicate; import net.minecraft.data.DataGenerator; import net.minecraft.data.recipes.FinishedRecipe; diff --git a/src/main/java/com/simibubi/create/foundation/fluid/CombinedTankWrapper.java b/src/main/java/com/simibubi/create/foundation/fluid/CombinedTankWrapper.java index a04d735312..e589109175 100644 --- a/src/main/java/com/simibubi/create/foundation/fluid/CombinedTankWrapper.java +++ b/src/main/java/com/simibubi/create/foundation/fluid/CombinedTankWrapper.java @@ -1,7 +1,6 @@ package com.simibubi.create.foundation.fluid; -import com.simibubi.create.foundation.utility.Iterate; - +import net.createmod.catnip.utility.Iterate; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.items.wrapper.EmptyHandler; diff --git a/src/main/java/com/simibubi/create/foundation/fluid/FluidHelper.java b/src/main/java/com/simibubi/create/foundation/fluid/FluidHelper.java index ce8dec8de0..e12980842b 100644 --- a/src/main/java/com/simibubi/create/foundation/fluid/FluidHelper.java +++ b/src/main/java/com/simibubi/create/foundation/fluid/FluidHelper.java @@ -11,8 +11,8 @@ import com.simibubi.create.content.contraptions.fluids.actors.GenericItemFilling import com.simibubi.create.content.contraptions.fluids.tank.CreativeFluidTankTileEntity; import com.simibubi.create.content.contraptions.processing.EmptyingByBasin; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; -import com.simibubi.create.foundation.utility.Pair; +import net.createmod.catnip.utility.Pair; import net.minecraft.nbt.TagParser; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.TagKey; @@ -48,15 +48,15 @@ public class FluidHelper { public static boolean isLava(Fluid fluid) { return convertToStill(fluid) == Fluids.LAVA; } - + public static boolean isTag(Fluid fluid, TagKey pTag) { return fluid.is(pTag); } - + public static boolean isTag(FluidState fluid, TagKey pTag) { return isTag(fluid.getType(), pTag); } - + public static boolean isTag(FluidStack fluid, TagKey pTag) { return isTag(fluid.getFluid(), pTag); } diff --git a/src/main/java/com/simibubi/create/foundation/fluid/FluidRenderer.java b/src/main/java/com/simibubi/create/foundation/fluid/FluidRenderer.java index 3cd201912e..2946f12f26 100644 --- a/src/main/java/com/simibubi/create/foundation/fluid/FluidRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/fluid/FluidRenderer.java @@ -4,36 +4,25 @@ import java.util.function.Function; import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.PoseStack.Pose; import com.mojang.blaze3d.vertex.VertexConsumer; -import com.simibubi.create.foundation.render.RenderTypes; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.BasicFluidRenderer; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.core.Direction; -import net.minecraft.core.Direction.Axis; -import net.minecraft.core.Direction.AxisDirection; -import net.minecraft.core.Vec3i; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; import net.minecraft.world.inventory.InventoryMenu; import net.minecraft.world.level.material.Fluid; -import net.minecraft.world.phys.Vec3; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fluids.FluidAttributes; import net.minecraftforge.fluids.FluidStack; @OnlyIn(Dist.CLIENT) -public class FluidRenderer { - - public static VertexConsumer getFluidBuilder(MultiBufferSource buffer) { - return buffer.getBuffer(RenderTypes.getFluid()); - } +public class FluidRenderer extends BasicFluidRenderer { public static void renderFluidStream(FluidStack fluidStack, Direction direction, float radius, float progress, boolean inbound, MultiBufferSource buffer, PoseStack ms, int light) { @@ -87,149 +76,9 @@ public class FluidRenderer { ms.popPose(); } - public static void renderFluidBox(FluidStack fluidStack, float xMin, float yMin, float zMin, float xMax, - float yMax, float zMax, MultiBufferSource buffer, PoseStack ms, int light, boolean renderBottom) { - renderFluidBox(fluidStack, xMin, yMin, zMin, xMax, yMax, zMax, getFluidBuilder(buffer), ms, light, renderBottom); - } - - public static void renderFluidBox(FluidStack fluidStack, float xMin, float yMin, float zMin, float xMax, - float yMax, float zMax, VertexConsumer builder, PoseStack ms, int light, boolean renderBottom) { - Fluid fluid = fluidStack.getFluid(); - FluidAttributes fluidAttributes = fluid.getAttributes(); - TextureAtlasSprite fluidTexture = Minecraft.getInstance() - .getTextureAtlas(InventoryMenu.BLOCK_ATLAS) - .apply(fluidAttributes.getStillTexture(fluidStack)); - - int color = fluidAttributes.getColor(fluidStack); - int blockLightIn = (light >> 4) & 0xF; - int luminosity = Math.max(blockLightIn, fluidAttributes.getLuminosity(fluidStack)); - light = (light & 0xF00000) | luminosity << 4; - - Vec3 center = new Vec3(xMin + (xMax - xMin) / 2, yMin + (yMax - yMin) / 2, zMin + (zMax - zMin) / 2); - ms.pushPose(); - if (fluidStack.getFluid() - .getAttributes() - .isLighterThanAir()) - TransformStack.cast(ms) - .translate(center) - .rotateX(180) - .translateBack(center); - - for (Direction side : Iterate.directions) { - if (side == Direction.DOWN && !renderBottom) - continue; - - boolean positive = side.getAxisDirection() == AxisDirection.POSITIVE; - if (side.getAxis() - .isHorizontal()) { - if (side.getAxis() == Axis.X) { - renderStillTiledFace(side, zMin, yMin, zMax, yMax, positive ? xMax : xMin, - builder, ms, light, color, fluidTexture); - } else { - renderStillTiledFace(side, xMin, yMin, xMax, yMax, positive ? zMax : zMin, - builder, ms, light, color, fluidTexture); - } - } else { - renderStillTiledFace(side, xMin, zMin, xMax, zMax, positive ? yMax : yMin, - builder, ms, light, color, fluidTexture); - } - } - - ms.popPose(); - } - - public static void renderStillTiledFace(Direction dir, float left, float down, float right, float up, - float depth, VertexConsumer builder, PoseStack ms, int light, int color, TextureAtlasSprite texture) { - FluidRenderer.renderTiledFace(dir, left, down, right, up, depth, builder, ms, light, color, texture, 1); - } - public static void renderFlowingTiledFace(Direction dir, float left, float down, float right, float up, float depth, VertexConsumer builder, PoseStack ms, int light, int color, TextureAtlasSprite texture) { - FluidRenderer.renderTiledFace(dir, left, down, right, up, depth, builder, ms, light, color, texture, 0.5f); - } - - public static void renderTiledFace(Direction dir, float left, float down, float right, float up, - float depth, VertexConsumer builder, PoseStack ms, int light, int color, TextureAtlasSprite texture, - float textureScale) { - boolean positive = dir.getAxisDirection() == Direction.AxisDirection.POSITIVE; - boolean horizontal = dir.getAxis().isHorizontal(); - boolean x = dir.getAxis() == Axis.X; - - float shrink = texture.uvShrinkRatio() * 0.25f * textureScale; - float centerU = texture.getU0() + (texture.getU1() - texture.getU0()) * 0.5f * textureScale; - float centerV = texture.getV0() + (texture.getV1() - texture.getV0()) * 0.5f * textureScale; - - float f; - float x2 = 0; - float y2 = 0; - float u1, u2; - float v1, v2; - for (float x1 = left; x1 < right; x1 = x2) { - f = Mth.floor(x1); - x2 = Math.min(f + 1, right); - if (dir == Direction.NORTH || dir == Direction.EAST) { - f = Mth.ceil(x2); - u1 = texture.getU((f - x2) * 16 * textureScale); - u2 = texture.getU((f - x1) * 16 * textureScale); - } else { - u1 = texture.getU((x1 - f) * 16 * textureScale); - u2 = texture.getU((x2 - f) * 16 * textureScale); - } - u1 = Mth.lerp(shrink, u1, centerU); - u2 = Mth.lerp(shrink, u2, centerU); - for (float y1 = down; y1 < up; y1 = y2) { - f = Mth.floor(y1); - y2 = Math.min(f + 1, up); - if (dir == Direction.UP) { - v1 = texture.getV((y1 - f) * 16 * textureScale); - v2 = texture.getV((y2 - f) * 16 * textureScale); - } else { - f = Mth.ceil(y2); - v1 = texture.getV((f - y2) * 16 * textureScale); - v2 = texture.getV((f - y1) * 16 * textureScale); - } - v1 = Mth.lerp(shrink, v1, centerV); - v2 = Mth.lerp(shrink, v2, centerV); - - if (horizontal) { - if (x) { - putVertex(builder, ms, depth, y2, positive ? x2 : x1, color, u1, v1, dir, light); - putVertex(builder, ms, depth, y1, positive ? x2 : x1, color, u1, v2, dir, light); - putVertex(builder, ms, depth, y1, positive ? x1 : x2, color, u2, v2, dir, light); - putVertex(builder, ms, depth, y2, positive ? x1 : x2, color, u2, v1, dir, light); - } else { - putVertex(builder, ms, positive ? x1 : x2, y2, depth, color, u1, v1, dir, light); - putVertex(builder, ms, positive ? x1 : x2, y1, depth, color, u1, v2, dir, light); - putVertex(builder, ms, positive ? x2 : x1, y1, depth, color, u2, v2, dir, light); - putVertex(builder, ms, positive ? x2 : x1, y2, depth, color, u2, v1, dir, light); - } - } else { - putVertex(builder, ms, x1, depth, positive ? y1 : y2, color, u1, v1, dir, light); - putVertex(builder, ms, x1, depth, positive ? y2 : y1, color, u1, v2, dir, light); - putVertex(builder, ms, x2, depth, positive ? y2 : y1, color, u2, v2, dir, light); - putVertex(builder, ms, x2, depth, positive ? y1 : y2, color, u2, v1, dir, light); - } - } - } - } - - private static void putVertex(VertexConsumer builder, PoseStack ms, float x, float y, float z, int color, float u, - float v, Direction face, int light) { - - Vec3i normal = face.getNormal(); - Pose peek = ms.last(); - int a = color >> 24 & 0xff; - int r = color >> 16 & 0xff; - int g = color >> 8 & 0xff; - int b = color & 0xff; - - builder.vertex(peek.pose(), x, y, z) - .color(r, g, b, a) - .uv(u, v) - .overlayCoords(OverlayTexture.NO_OVERLAY) - .uv2(light) - .normal(peek.normal(), normal.getX(), normal.getY(), normal.getZ()) - .endVertex(); + renderTiledFace(dir, left, down, right, up, depth, builder, ms, light, color, texture, 0.5f); } } diff --git a/src/main/java/com/simibubi/create/foundation/gui/AbstractSimiScreen.java b/src/main/java/com/simibubi/create/foundation/gui/AbstractSimiScreen.java deleted file mode 100644 index f0388bc00f..0000000000 --- a/src/main/java/com/simibubi/create/foundation/gui/AbstractSimiScreen.java +++ /dev/null @@ -1,169 +0,0 @@ -package com.simibubi.create.foundation.gui; - -import java.util.Collection; -import java.util.List; - -import com.mojang.blaze3d.platform.InputConstants; -import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.foundation.gui.widget.AbstractSimiWidget; - -import net.minecraft.client.gui.components.AbstractWidget; -import net.minecraft.client.gui.components.Widget; -import net.minecraft.client.gui.components.events.GuiEventListener; -import net.minecraft.client.gui.narration.NarratableEntry; -import net.minecraft.client.gui.screens.Screen; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.TextComponent; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; - -@OnlyIn(Dist.CLIENT) -public abstract class AbstractSimiScreen extends Screen { - - protected int windowWidth, windowHeight; - protected int windowXOffset, windowYOffset; - protected int guiLeft, guiTop; - - protected AbstractSimiScreen(Component title) { - super(title); - } - - protected AbstractSimiScreen() { - this(TextComponent.EMPTY); - } - - /** - * This method must be called before {@code super.init()}! - */ - protected void setWindowSize(int width, int height) { - windowWidth = width; - windowHeight = height; - } - - /** - * This method must be called before {@code super.init()}! - */ - protected void setWindowOffset(int xOffset, int yOffset) { - windowXOffset = xOffset; - windowYOffset = yOffset; - } - - @Override - protected void init() { - guiLeft = (width - windowWidth) / 2; - guiTop = (height - windowHeight) / 2; - guiLeft += windowXOffset; - guiTop += windowYOffset; - } - - @Override - public void tick() { - for (GuiEventListener listener : children()) { - if (listener instanceof TickableGuiEventListener tickable) { - tickable.tick(); - } - } - } - - @Override - public boolean isPauseScreen() { - return false; - } - - @SuppressWarnings("unchecked") - protected void addRenderableWidgets(W... widgets) { - for (W widget : widgets) { - addRenderableWidget(widget); - } - } - - protected void addRenderableWidgets(Collection widgets) { - for (W widget : widgets) { - addRenderableWidget(widget); - } - } - - protected void removeWidgets(GuiEventListener... widgets) { - for (GuiEventListener widget : widgets) { - removeWidget(widget); - } - } - - protected void removeWidgets(Collection widgets) { - for (GuiEventListener widget : widgets) { - removeWidget(widget); - } - } - - @Override - public void render(PoseStack ms, int mouseX, int mouseY, float partialTicks) { - partialTicks = minecraft.getFrameTime(); - - ms.pushPose(); - - prepareFrame(); - - renderWindowBackground(ms, mouseX, mouseY, partialTicks); - renderWindow(ms, mouseX, mouseY, partialTicks); - super.render(ms, mouseX, mouseY, partialTicks); - renderWindowForeground(ms, mouseX, mouseY, partialTicks); - - endFrame(); - - ms.popPose(); - } - - @Override - public boolean keyPressed(int keyCode, int scanCode, int modifiers) { - boolean keyPressed = super.keyPressed(keyCode, scanCode, modifiers); - if (keyPressed || getFocused() != null) - return keyPressed; - - InputConstants.Key mouseKey = InputConstants.getKey(keyCode, scanCode); - if (this.minecraft.options.keyInventory.isActiveAndMatches(mouseKey)) { - this.onClose(); - return true; - } - - return false; - } - - protected void prepareFrame() {} - - protected void renderWindowBackground(PoseStack ms, int mouseX, int mouseY, float partialTicks) { - renderBackground(ms); - } - - protected abstract void renderWindow(PoseStack ms, int mouseX, int mouseY, float partialTicks); - - protected void renderWindowForeground(PoseStack ms, int mouseX, int mouseY, float partialTicks) { - for (Widget widget : renderables) { - if (widget instanceof AbstractSimiWidget simiWidget && simiWidget.isHoveredOrFocused() - && simiWidget.visible) { - List tooltip = simiWidget.getToolTip(); - if (tooltip.isEmpty()) - continue; - int ttx = simiWidget.lockedTooltipX == -1 ? mouseX : simiWidget.lockedTooltipX + simiWidget.x; - int tty = simiWidget.lockedTooltipY == -1 ? mouseY : simiWidget.lockedTooltipY + simiWidget.y; - renderComponentTooltip(ms, tooltip, ttx, tty); - } - } - } - - protected void endFrame() {} - - @Deprecated - protected void debugWindowArea(PoseStack matrixStack) { - fill(matrixStack, guiLeft + windowWidth, guiTop + windowHeight, guiLeft, guiTop, 0xD3D3D3D3); - } - - @Override - public GuiEventListener getFocused() { - GuiEventListener focused = super.getFocused(); - if (focused instanceof AbstractWidget && !((AbstractWidget) focused).isFocused()) - focused = null; - setFocused(focused); - return focused; - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java index 53f9571e80..78c1cbae31 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java @@ -1,17 +1,18 @@ package com.simibubi.create.foundation.gui; -import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.Create; -import com.simibubi.create.foundation.gui.element.ScreenElement; -import com.simibubi.create.foundation.utility.Color; +import net.createmod.catnip.gui.TextureSheetSegment; +import net.createmod.catnip.gui.UIRenderHelper; +import net.createmod.catnip.gui.element.ScreenElement; +import net.createmod.catnip.utility.theme.Color; import net.minecraft.client.gui.GuiComponent; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -public enum AllGuiTextures implements ScreenElement { +public enum AllGuiTextures implements ScreenElement, TextureSheetSegment { // Inventories PLAYER_INVENTORY("player_inventory", 176, 108), @@ -163,7 +164,7 @@ public enum AllGuiTextures implements ScreenElement { SPEECH_TOOLTIP_BACKGROUND("widgets", 0, 24, 8, 8), SPEECH_TOOLTIP_COLOR("widgets", 8, 24, 8, 8), - + TRAIN_HUD_SPEED_BG("widgets", 0, 190, 182, 5), TRAIN_HUD_SPEED("widgets", 0, 185, 182, 5), TRAIN_HUD_THROTTLE("widgets", 0, 195, 182, 5), @@ -174,30 +175,24 @@ public enum AllGuiTextures implements ScreenElement { TRAIN_PROMPT_R("widgets", 11, 209, 3, 16), TRAIN_PROMPT("widgets", 0, 230, 256, 16), - // PlacementIndicator - PLACEMENT_INDICATOR_SHEET("placement_indicator", 0, 0, 16, 256); - ; public static final int FONT_COLOR = 0x575F7A; public final ResourceLocation location; - public int width, height; - public int startX, startY; + private final int width; + private final int height; + private final int startX; + private final int startY; - private AllGuiTextures(String location, int width, int height) { + AllGuiTextures(String location, int width, int height) { this(location, 0, 0, width, height); } - - private AllGuiTextures(int startX, int startY) { - this("icons", startX * 16, startY * 16, 16, 16); - } - - private AllGuiTextures(String location, int startX, int startY, int width, int height) { + AllGuiTextures(String location, int startX, int startY, int width, int height) { this(Create.ID, location, startX, startY, width, height); } - private AllGuiTextures(String namespace, String location, int startX, int startY, int width, int height) { + AllGuiTextures(String namespace, String location, int startX, int startY, int width, int height) { this.location = new ResourceLocation(namespace, "textures/gui/" + location + ".png"); this.width = width; this.height = height; @@ -205,9 +200,9 @@ public enum AllGuiTextures implements ScreenElement { this.startY = startY; } - @OnlyIn(Dist.CLIENT) - public void bind() { - RenderSystem.setShaderTexture(0, location); + @Override + public ResourceLocation getLocation() { + return location; } @OnlyIn(Dist.CLIENT) @@ -229,4 +224,23 @@ public enum AllGuiTextures implements ScreenElement { UIRenderHelper.drawColoredTexture(ms, c, x, y, startX, startY, width, height); } + @Override + public int getStartX() { + return startX; + } + + @Override + public int getStartY() { + return startY; + } + + @Override + public int getWidth() { + return width; + } + + @Override + public int getHeight() { + return height; + } } diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java b/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java index 0051e041e0..310956648f 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java @@ -5,10 +5,10 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.math.Matrix4f; import com.simibubi.create.Create; -import com.simibubi.create.foundation.gui.element.DelegatedStencilElement; -import com.simibubi.create.foundation.gui.element.ScreenElement; -import com.simibubi.create.foundation.utility.Color; +import net.createmod.catnip.gui.element.DelegatedStencilElement; +import net.createmod.catnip.gui.element.ScreenElement; +import net.createmod.catnip.utility.theme.Color; import net.minecraft.client.gui.GuiComponent; import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.MultiBufferSource; diff --git a/src/main/java/com/simibubi/create/foundation/gui/ConfirmationScreen.java b/src/main/java/com/simibubi/create/foundation/gui/ConfirmationScreen.java deleted file mode 100644 index 211539583b..0000000000 --- a/src/main/java/com/simibubi/create/foundation/gui/ConfirmationScreen.java +++ /dev/null @@ -1,230 +0,0 @@ -package com.simibubi.create.foundation.gui; - -import java.util.ArrayList; -import java.util.List; -import java.util.function.Consumer; - -import javax.annotation.Nonnull; - -import org.lwjgl.opengl.GL30; - -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.foundation.gui.element.BoxElement; -import com.simibubi.create.foundation.gui.element.TextStencilElement; -import com.simibubi.create.foundation.gui.widget.BoxWidget; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.screens.Screen; -import net.minecraft.network.chat.FormattedText; -import net.minecraft.network.chat.Style; - -public class ConfirmationScreen extends AbstractSimiScreen { - - private Screen source; - private Consumer action = _success -> { - }; - private List text = new ArrayList<>(); - private boolean centered = false; - private int x; - private int y; - private int textWidth; - private int textHeight; - private boolean tristate; - - private BoxWidget confirm; - private BoxWidget confirmDontSave; - private BoxWidget cancel; - private BoxElement textBackground; - - public enum Response { - Confirm, ConfirmDontSave, Cancel - } - - /* - * Removes text lines from the back of the list - * */ - public ConfirmationScreen removeTextLines(int amount) { - if (amount > text.size()) - return clearText(); - - text.subList(text.size() - amount, text.size()).clear(); - return this; - } - - public ConfirmationScreen clearText() { - this.text.clear(); - return this; - } - - public ConfirmationScreen addText(FormattedText text) { - this.text.add(text); - return this; - } - - public ConfirmationScreen withText(FormattedText text) { - return clearText().addText(text); - } - - public ConfirmationScreen at(int x, int y) { - this.x = Math.max(x, 0); - this.y = Math.max(y, 0); - this.centered = false; - return this; - } - - public ConfirmationScreen centered() { - this.centered = true; - return this; - } - - public ConfirmationScreen withAction(Consumer action) { - this.action = r -> action.accept(r == Response.Confirm); - return this; - } - - public ConfirmationScreen withThreeActions(Consumer action) { - this.action = action; - this.tristate = true; - return this; - } - - public void open(@Nonnull Screen source) { - this.source = source; - Minecraft client = source.getMinecraft(); - this.init(client, client.getWindow().getGuiScaledWidth(), client.getWindow().getGuiScaledHeight()); - this.minecraft.screen = this; - } - - @Override - public void tick() { - super.tick(); - source.tick(); - } - - @Override - protected void init() { - super.init(); - - ArrayList copy = new ArrayList<>(text); - text.clear(); - copy.forEach(t -> text.addAll(font.getSplitter().splitLines(t, 300, Style.EMPTY))); - - textHeight = text.size() * (font.lineHeight + 1) + 4; - textWidth = 300; - - if (centered) { - x = width/2 - textWidth/2 - 2; - y = height/2 - textHeight/2 - 16; - } else { - x = Math.max(0, x - textWidth / 2); - y = Math.max(0, y -= textHeight); - } - - if (x + textWidth > width) { - x = width - textWidth; - } - - if (y + textHeight + 30 > height) { - y = height - textHeight - 30; - } - - int buttonX = x + textWidth / 2 - 6 - (int) (70 * (tristate ? 1.5f : 1)); - - TextStencilElement confirmText = - new TextStencilElement(font, tristate ? "Save" : "Confirm").centered(true, true); - confirm = new BoxWidget(buttonX, y + textHeight + 6, 70, 16).withCallback(() -> accept(Response.Confirm)); - confirm.showingElement(confirmText.withElementRenderer(BoxWidget.gradientFactory.apply(confirm))); - addRenderableWidget(confirm); - - buttonX += 12 + 70; - - if (tristate) { - TextStencilElement confirmDontSaveText = - new TextStencilElement(font, "Don't Save").centered(true, true); - confirmDontSave = - new BoxWidget(buttonX, y + textHeight + 6, 70, 16).withCallback(() -> accept(Response.ConfirmDontSave)); - confirmDontSave.showingElement( - confirmDontSaveText.withElementRenderer(BoxWidget.gradientFactory.apply(confirmDontSave))); - addRenderableWidget(confirmDontSave); - buttonX += 12 + 70; - } - - TextStencilElement cancelText = new TextStencilElement(font, "Cancel").centered(true, true); - cancel = new BoxWidget(buttonX, y + textHeight + 6, 70, 16) - .withCallback(() -> accept(Response.Cancel)); - cancel.showingElement(cancelText.withElementRenderer(BoxWidget.gradientFactory.apply(cancel))); - addRenderableWidget(cancel); - - textBackground = new BoxElement() - .gradientBorder(Theme.p(Theme.Key.BUTTON_DISABLE)) - .withBounds(width + 10, textHeight + 35) - .at(-5, y - 5); - - if (text.size() == 1) - x = (width - font.width(text.get(0))) / 2; - } - - @Override - public void onClose() { - accept(Response.Cancel); - } - - private void accept(Response success) { - minecraft.screen = source; - action.accept(success); - } - - @Override - protected void renderWindow(PoseStack ms, int mouseX, int mouseY, float partialTicks) { - textBackground.render(ms); - int offset = font.lineHeight + 1; - int lineY = y - offset; - - ms.pushPose(); - ms.translate(0, 0, 200); - - for (FormattedText line : text) { - lineY += offset; - if (line == null) - continue; - font.draw(ms, line.getString(), x, lineY, 0xeaeaea); - } - - ms.popPose(); - } - - @Override - protected void renderWindowBackground(PoseStack ms, int mouseX, int mouseY, float partialTicks) { - endFrame(); - - source.render(ms, 0, 0, 10); // zero mouse coords to prevent further tooltips - - prepareFrame(); - - this.fillGradient(ms, 0, 0, this.width, this.height, 0x70101010, 0x80101010); - } - - - @Override - protected void prepareFrame() { - UIRenderHelper.swapAndBlitColor(minecraft.getMainRenderTarget(), UIRenderHelper.framebuffer); - RenderSystem.clear(GL30.GL_STENCIL_BUFFER_BIT | GL30.GL_DEPTH_BUFFER_BIT, Minecraft.ON_OSX); - } - - @Override - protected void endFrame() { - UIRenderHelper.swapAndBlitColor(UIRenderHelper.framebuffer, minecraft.getMainRenderTarget()); - } - - @Override - public void resize(@Nonnull Minecraft client, int width, int height) { - super.resize(client, width, height); - source.resize(client, width, height); - } - - @Override - public boolean isPauseScreen() { - return true; - } -} diff --git a/src/main/java/com/simibubi/create/foundation/gui/CreateMainMenuScreen.java b/src/main/java/com/simibubi/create/foundation/gui/CreateMainMenuScreen.java index 51889c28f1..0b18b11ea9 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/CreateMainMenuScreen.java +++ b/src/main/java/com/simibubi/create/foundation/gui/CreateMainMenuScreen.java @@ -7,14 +7,16 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllBlocks; import com.simibubi.create.Create; import com.simibubi.create.foundation.config.ui.BaseConfigScreen; -import com.simibubi.create.foundation.gui.element.BoxElement; -import com.simibubi.create.foundation.gui.element.GuiGameElement; -import com.simibubi.create.foundation.item.TooltipHelper; -import com.simibubi.create.foundation.ponder.ui.PonderTagIndexScreen; -import com.simibubi.create.foundation.utility.Color; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.gui.AbstractSimiScreen; +import net.createmod.catnip.gui.ScreenOpener; +import net.createmod.catnip.gui.element.BoxElement; +import net.createmod.catnip.gui.element.GuiGameElement; +import net.createmod.catnip.utility.FontHelper; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.theme.Color; +import net.createmod.ponder.foundation.ui.PonderTagIndexScreen; import net.minecraft.ChatFormatting; import net.minecraft.Util; import net.minecraft.client.Minecraft; @@ -143,12 +145,12 @@ public class CreateMainMenuScreen extends AbstractSimiScreen { int bLongWidth = 200; addRenderableWidget( - new Button(center - 100, yStart + 92, bLongWidth, bHeight, Lang.translateDirect("menu.return"), $ -> linkTo(parent))); - addRenderableWidget(new Button(center - 100, yStart + 24 + -16, bLongWidth, bHeight, Lang.translateDirect("menu.configure"), + new Button(center - 100, yStart + 92, bLongWidth, bHeight, CreateLang.translateDirect("menu.return"), $ -> linkTo(parent))); + addRenderableWidget(new Button(center - 100, yStart + 24 + -16, bLongWidth, bHeight, CreateLang.translateDirect("menu.configure"), $ -> linkTo(BaseConfigScreen.forCreate(this)))); gettingStarted = new Button(center + 2, yStart + 48 + -16, bShortWidth, bHeight, - Lang.translateDirect("menu.ponder_index"), $ -> linkTo(new PonderTagIndexScreen())); + CreateLang.translateDirect("menu.ponder_index"), $ -> linkTo(new PonderTagIndexScreen())); gettingStarted.active = !(parent instanceof TitleScreen); addRenderableWidget(gettingStarted); @@ -162,10 +164,10 @@ public class CreateMainMenuScreen extends AbstractSimiScreen { (b, ps, mx, my) -> renderTooltip(ps, MODRINTH_TOOLTIP, mx, my))); addRenderableWidget(new Button(center + 2, yStart + 68, bShortWidth, bHeight, - Lang.translateDirect("menu.report_bugs"), + CreateLang.translateDirect("menu.report_bugs"), $ -> linkTo(ISSUE_TRACKER_LINK))); addRenderableWidget(new Button(center - 100, yStart + 68, bShortWidth, bHeight, - Lang.translateDirect("menu.support"), + CreateLang.translateDirect("menu.support"), $ -> linkTo(SUPPORT_LINK))); } @@ -179,7 +181,7 @@ public class CreateMainMenuScreen extends AbstractSimiScreen { return; if (mouseY < gettingStarted.y || mouseY > gettingStarted.y + 20) return; - renderComponentTooltip(ms, TooltipHelper.cutTextComponent(Lang.translateDirect("menu.only_ingame"), ChatFormatting.GRAY, + renderComponentTooltip(ms, FontHelper.cutTextComponent(CreateLang.translateDirect("menu.only_ingame"), ChatFormatting.GRAY, ChatFormatting.GRAY), mouseX, mouseY); } } @@ -217,7 +219,7 @@ public class CreateMainMenuScreen extends AbstractSimiScreen { @Override protected void renderBg(PoseStack pPoseStack, Minecraft pMinecraft, int pMouseX, int pMouseY) { pPoseStack.pushPose(); - pPoseStack.translate(x + width / 2 - (icon.width * scale) / 2, y + height / 2 - (icon.height * scale) / 2, 0); + pPoseStack.translate(x + width / 2 - (icon.getWidth() * scale) / 2, y + height / 2 - (icon.getHeight() * scale) / 2, 0); pPoseStack.scale(scale, scale, 1); icon.render(pPoseStack, 0, 0); pPoseStack.popPose(); diff --git a/src/main/java/com/simibubi/create/foundation/gui/CustomLightingSettings.java b/src/main/java/com/simibubi/create/foundation/gui/CustomLightingSettings.java index 9abc3159c7..b29f194227 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/CustomLightingSettings.java +++ b/src/main/java/com/simibubi/create/foundation/gui/CustomLightingSettings.java @@ -4,6 +4,8 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.math.Matrix4f; import com.mojang.math.Vector3f; +import net.createmod.catnip.gui.ILightingSettings; + public class CustomLightingSettings implements ILightingSettings { private Vector3f light1; diff --git a/src/main/java/com/simibubi/create/foundation/gui/ILightingSettings.java b/src/main/java/com/simibubi/create/foundation/gui/ILightingSettings.java deleted file mode 100644 index 045d6c97ea..0000000000 --- a/src/main/java/com/simibubi/create/foundation/gui/ILightingSettings.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.simibubi.create.foundation.gui; - -import com.mojang.blaze3d.platform.Lighting; - -public interface ILightingSettings { - - void applyLighting(); - - static final ILightingSettings DEFAULT_3D = () -> Lighting.setupFor3DItems(); - static final ILightingSettings DEFAULT_FLAT = () -> Lighting.setupForFlatItems(); - -} diff --git a/src/main/java/com/simibubi/create/foundation/gui/ModularGuiLine.java b/src/main/java/com/simibubi/create/foundation/gui/ModularGuiLine.java index b098bf142d..913396d4ed 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/ModularGuiLine.java +++ b/src/main/java/com/simibubi/create/foundation/gui/ModularGuiLine.java @@ -7,9 +7,10 @@ import java.util.function.Consumer; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.foundation.gui.widget.ScrollInput; import com.simibubi.create.foundation.gui.widget.TooltipArea; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.Pair; +import net.createmod.catnip.gui.UIRenderHelper; +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.Pair; import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.components.EditBox; import net.minecraft.client.gui.components.Widget; diff --git a/src/main/java/com/simibubi/create/foundation/gui/ModularGuiLineBuilder.java b/src/main/java/com/simibubi/create/foundation/gui/ModularGuiLineBuilder.java index 4a2a56e6e3..7f0a701b5e 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/ModularGuiLineBuilder.java +++ b/src/main/java/com/simibubi/create/foundation/gui/ModularGuiLineBuilder.java @@ -6,9 +6,9 @@ import com.simibubi.create.foundation.gui.widget.Label; import com.simibubi.create.foundation.gui.widget.ScrollInput; import com.simibubi.create.foundation.gui.widget.SelectionScrollInput; import com.simibubi.create.foundation.gui.widget.TooltipArea; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.Pair; +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.Pair; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.components.EditBox; import net.minecraft.network.chat.TextComponent; @@ -40,12 +40,12 @@ public class ModularGuiLineBuilder { addScrollInput(input, inputTransform, dataKey); return this; } - + public ModularGuiLineBuilder customArea(int x, int width) { target.customBoxes.add(Couple.create(x, width)); return this; } - + public ModularGuiLineBuilder speechBubble() { target.speechBubble = true; return this; @@ -88,4 +88,4 @@ public class ModularGuiLineBuilder { return this; } -} \ No newline at end of file +} diff --git a/src/main/java/com/simibubi/create/foundation/gui/ScreenOpener.java b/src/main/java/com/simibubi/create/foundation/gui/ScreenOpener.java deleted file mode 100644 index 3d1b6f05f7..0000000000 --- a/src/main/java/com/simibubi/create/foundation/gui/ScreenOpener.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.simibubi.create.foundation.gui; - -import java.util.ArrayDeque; -import java.util.ArrayList; -import java.util.Deque; -import java.util.List; -import java.util.Optional; - -import javax.annotation.Nullable; - -import com.simibubi.create.foundation.ponder.ui.NavigatableSimiScreen; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.screens.Screen; - -public class ScreenOpener { - - private static final Deque backStack = new ArrayDeque<>(); - private static Screen backSteppedFrom = null; - - public static void open(Screen screen) { - open(Minecraft.getInstance().screen, screen); - } - - public static void open(@Nullable Screen current, Screen toOpen) { - backSteppedFrom = null; - if (current != null) { - if (backStack.size() >= 15) // don't go deeper than 15 steps - backStack.pollLast(); - - backStack.push(current); - } else - backStack.clear(); - - openScreen(toOpen); - } - - public static void openPreviousScreen(Screen current, Optional screenWithContext) { - if (backStack.isEmpty()) - return; - backSteppedFrom = current; - Screen previousScreen = backStack.pop(); - if (previousScreen instanceof NavigatableSimiScreen) { - NavigatableSimiScreen previousAbstractSimiScreen = (NavigatableSimiScreen) previousScreen; - screenWithContext.ifPresent(s -> s.shareContextWith(previousAbstractSimiScreen)); - previousAbstractSimiScreen.transition.startWithValue(-0.1) - .chase(-1, .4f, LerpedFloat.Chaser.EXP); - } - openScreen(previousScreen); - } - - // transitions are only supported in simiScreens atm. they take care of all the - // rendering for it - public static void transitionTo(NavigatableSimiScreen screen) { - if (tryBackTracking(screen)) - return; - screen.transition.startWithValue(0.1) - .chase(1, .4f, LerpedFloat.Chaser.EXP); - open(screen); - } - - private static boolean tryBackTracking(NavigatableSimiScreen screen) { - List screenHistory = getScreenHistory(); - if (screenHistory.isEmpty()) - return false; - Screen previouslyRenderedScreen = screenHistory.get(0); - if (!(previouslyRenderedScreen instanceof NavigatableSimiScreen)) - return false; - if (!screen.isEquivalentTo((NavigatableSimiScreen) previouslyRenderedScreen)) - return false; - - openPreviousScreen(Minecraft.getInstance().screen, Optional.of(screen)); - return true; - } - - public static void clearStack() { - backStack.clear(); - } - - public static List getScreenHistory() { - return new ArrayList<>(backStack); - } - - @Nullable - public static Screen getPreviouslyRenderedScreen() { - return backSteppedFrom != null ? backSteppedFrom : backStack.peek(); - } - - private static void openScreen(Screen screen) { - Minecraft.getInstance() - .tell(() -> { - Minecraft.getInstance() - .setScreen(screen); - Screen previouslyRenderedScreen = getPreviouslyRenderedScreen(); - if (previouslyRenderedScreen != null && screen instanceof NavigatableSimiScreen) - previouslyRenderedScreen.init(Minecraft.getInstance(), screen.width, screen.height); - }); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/gui/Theme.java b/src/main/java/com/simibubi/create/foundation/gui/Theme.java deleted file mode 100644 index ad21e7223b..0000000000 --- a/src/main/java/com/simibubi/create/foundation/gui/Theme.java +++ /dev/null @@ -1,235 +0,0 @@ -package com.simibubi.create.foundation.gui; - -import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -import com.simibubi.create.foundation.utility.Color; -import com.simibubi.create.foundation.utility.Couple; - -public class Theme { - - private static final List THEMES = new ArrayList<>(); - public static final Theme BASE = addTheme(new Theme()); - - public static Theme addTheme(@Nonnull Theme theme) { - THEMES.add(theme); - THEMES.sort(Comparator.comparingInt(Theme::getPriority).reversed()); - return theme; - } - - public static void removeTheme(Theme theme) { - THEMES.remove(theme); - } - - public static void reload() { - THEMES.forEach(Theme::init); - } - - private static ColorHolder resolve(String key) { - return THEMES - .stream() - .map(theme -> theme.get(key)) - .filter(Objects::nonNull) - .findFirst() - .map(holder -> holder.lookupKey == null ? holder : resolve(holder.lookupKey)) - .orElse(ColorHolder.MISSING); - } - - @Nonnull public static Couple p(@Nonnull Key key) {return p(key.get());} - @Nonnull public static Couple p(String key) {return resolve(key).asPair();} - - @Nonnull public static Color c(@Nonnull Key key, boolean first) {return c(key.get(), first);} - @Nonnull public static Color c(String key, boolean first) {return p(key).get(first);} - - public static int i(@Nonnull Key key, boolean first) {return i(key.get(), first);} - public static int i(String key, boolean first) {return p(key).get(first).getRGB();} - - @Nonnull public static Color c(@Nonnull Key key) {return c(key.get());} - @Nonnull public static Color c(String key) {return resolve(key).get();} - - public static int i(@Nonnull Key key) {return i(key.get());} - public static int i(String key) {return resolve(key).get().getRGB();} - - //-----------// - - protected final Map colors; - private int priority = 0; - - protected Theme() { - colors = new HashMap<>(); - init(); - } - - /* - * Small note to addons: if you also want to make use of Theme, - * and add new Keys, please do not use mixins. Instead make a Theme - * subclass, override init and apply it via the static #addTheme - * - **/ - - protected void init() { - put(Key.BUTTON_IDLE, new Color(0xdd_8ab6d6, true), new Color(0x90_8ab6d6, true)); - put(Key.BUTTON_HOVER, new Color(0xff_9ABBD3, true), new Color(0xd0_9ABBD3, true)); - put(Key.BUTTON_CLICK, new Color(0xff_ffffff), new Color(0xee_ffffff)); - put(Key.BUTTON_DISABLE, new Color(0x80_909090, true), new Color(0x60_909090, true)); - put(Key.BUTTON_SUCCESS, new Color(0xcc_88f788, true), new Color(0xcc_20cc20, true)); - put(Key.BUTTON_FAIL, new Color(0xcc_f78888, true), new Color(0xcc_cc2020, true)); - put(Key.TEXT, new Color(0xff_eeeeee), new Color(0xff_a3a3a3)); - put(Key.TEXT_DARKER, new Color(0xff_a3a3a3), new Color(0xff_808080)); - put(Key.TEXT_ACCENT_STRONG, new Color(0xff_8ab6d6), new Color(0xff_8ab6d6)); - put(Key.TEXT_ACCENT_SLIGHT, new Color(0xff_ddeeff), new Color(0xff_a0b0c0)); - put(Key.STREAK, new Color(0x101010, false)); - put(Key.VANILLA_TOOLTIP_BORDER, new Color(0x50_5000ff, true), new Color(0x50_28007f, true)); - put(Key.VANILLA_TOOLTIP_BACKGROUND, new Color(0xf0_100010, true)); - - put(Key.PONDER_BUTTON_IDLE, new Color(0x60_c0c0ff, true), new Color(0x30_c0c0ff, true)); - put(Key.PONDER_BUTTON_HOVER, new Color(0xf0_c0c0ff, true), new Color(0xa0_c0c0ff, true)); - put(Key.PONDER_BUTTON_CLICK, new Color(0xff_ffffff), new Color(0xdd_ffffff)); - put(Key.PONDER_BUTTON_DISABLE, new Color(0x80_909090, true), new Color(0x20_909090, true)); - put(Key.PONDER_BACKGROUND_TRANSPARENT, new Color(0xdd_000000, true)); - put(Key.PONDER_BACKGROUND_FLAT, new Color(0xff_000000, false)); - put(Key.PONDER_BACKGROUND_IMPORTANT, new Color(0xdd_0e0e20, true)); - put(Key.PONDER_IDLE, new Color(0x40ffeedd, true), new Color(0x20ffeedd, true)); - put(Key.PONDER_HOVER, new Color(0x70ffffff, true), new Color(0x30ffffff, true)); - put(Key.PONDER_HIGHLIGHT, new Color(0xf0ffeedd, true), new Color(0x60ffeedd, true)); - put(Key.TEXT_WINDOW_BORDER, new Color(0x607a6000, true), new Color(0x207a6000, true)); - put(Key.PONDER_BACK_ARROW, new Color(0xf0aa9999, true), new Color(0x30aa9999, true)); - put(Key.PONDER_PROGRESSBAR, new Color(0x80ffeedd, true), new Color(0x50ffeedd, true)); - put(Key.PONDER_MISSING_CREATE, new Color(0x70_984500, true), new Color(0x70_692400, true)); - //put(Key.PONDER_MISSING_VANILLA, new Color(0x50_5000ff, true), new Color(0x50_300077, true)); - lookup(Key.PONDER_MISSING_VANILLA, Key.VANILLA_TOOLTIP_BORDER); - put(Key.CONFIG_TITLE_A, new Color(0xffc69fbc, true), new Color(0xfff6b8bb, true)); - put(Key.CONFIG_TITLE_B, new Color(0xfff6b8bb, true), new Color(0xfffbf994, true)); - //put(Key., new Color(0x, true), new Color(0x, true)); - } - - protected void put(String key, Color c) { - colors.put(key, ColorHolder.single(c)); - } - - protected void put(Key key, Color c) { - put(key.get(), c); - } - - protected void put(String key, Color c1, Color c2) { - colors.put(key, ColorHolder.pair(c1, c2)); - } - - protected void put(Key key, Color c1, Color c2) { - put(key.get(), c1, c2); - } - - protected void lookup(Key key, Key source) { - colors.put(key.get(), ColorHolder.lookup(source.get())); - } - - @Nullable protected ColorHolder get(String key) { - return colors.get(key); - } - - public int getPriority() { - return priority; - } - - public Theme setPriority(int priority) { - this.priority = priority; - return this; - } - - public static class Key { - - public static final Key BUTTON_IDLE = new Key(); - public static final Key BUTTON_HOVER = new Key(); - public static final Key BUTTON_CLICK = new Key(); - public static final Key BUTTON_DISABLE = new Key(); - public static final Key BUTTON_SUCCESS = new Key(); - public static final Key BUTTON_FAIL = new Key(); - - public static final Key TEXT = new Key(); - public static final Key TEXT_DARKER = new Key(); - public static final Key TEXT_ACCENT_STRONG = new Key(); - public static final Key TEXT_ACCENT_SLIGHT = new Key(); - - public static final Key STREAK = new Key(); - public static final Key VANILLA_TOOLTIP_BORDER = new Key(); - public static final Key VANILLA_TOOLTIP_BACKGROUND = new Key(); - - public static final Key PONDER_BACKGROUND_TRANSPARENT = new Key(); - public static final Key PONDER_BACKGROUND_FLAT = new Key(); - public static final Key PONDER_BACKGROUND_IMPORTANT = new Key(); - public static final Key PONDER_IDLE = new Key(); - public static final Key PONDER_HOVER = new Key(); - public static final Key PONDER_HIGHLIGHT = new Key(); - public static final Key TEXT_WINDOW_BORDER = new Key(); - public static final Key PONDER_BACK_ARROW = new Key(); - public static final Key PONDER_PROGRESSBAR = new Key(); - public static final Key PONDER_MISSING_CREATE = new Key(); - public static final Key PONDER_MISSING_VANILLA = new Key(); - - public static final Key PONDER_BUTTON_IDLE = new Key(); - public static final Key PONDER_BUTTON_HOVER = new Key(); - public static final Key PONDER_BUTTON_CLICK = new Key(); - public static final Key PONDER_BUTTON_DISABLE = new Key(); - - public static final Key CONFIG_TITLE_A = new Key(); - public static final Key CONFIG_TITLE_B = new Key(); - - private static int index = 0; - - private final String s; - - protected Key() { - this.s = "_" + index++; - } - - protected Key(String s) { - this.s = s; - } - - public String get() { - return s; - } - } - - private static class ColorHolder { - - private static final ColorHolder MISSING = ColorHolder.single(Color.BLACK); - - private Couple colors; - private String lookupKey; - - private static ColorHolder single(Color c) { - ColorHolder h = new ColorHolder(); - h.colors = Couple.create(c.setImmutable(), c.setImmutable()); - return h; - } - - private static ColorHolder pair(Color first, Color second) { - ColorHolder h = new ColorHolder(); - h.colors = Couple.create(first.setImmutable(), second.setImmutable()); - return h; - } - - private static ColorHolder lookup(String key) { - ColorHolder h = new ColorHolder(); - h.lookupKey = key; - return h; - } - - private Color get() { - return colors.getFirst(); - } - - private Couple asPair() { - return colors; - } - - } -} diff --git a/src/main/java/com/simibubi/create/foundation/gui/TickableGuiEventListener.java b/src/main/java/com/simibubi/create/foundation/gui/TickableGuiEventListener.java deleted file mode 100644 index 898760fb28..0000000000 --- a/src/main/java/com/simibubi/create/foundation/gui/TickableGuiEventListener.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.simibubi.create.foundation.gui; - -import net.minecraft.client.gui.components.events.GuiEventListener; - -public interface TickableGuiEventListener extends GuiEventListener { - void tick(); -} diff --git a/src/main/java/com/simibubi/create/foundation/gui/UIRenderHelper.java b/src/main/java/com/simibubi/create/foundation/gui/UIRenderHelper.java deleted file mode 100644 index b59168cd0e..0000000000 --- a/src/main/java/com/simibubi/create/foundation/gui/UIRenderHelper.java +++ /dev/null @@ -1,322 +0,0 @@ -package com.simibubi.create.foundation.gui; - -import javax.annotation.Nonnull; - -import org.lwjgl.opengl.GL20; -import org.lwjgl.opengl.GL30; - -import com.mojang.blaze3d.pipeline.RenderTarget; -import com.mojang.blaze3d.platform.GlConst; -import com.mojang.blaze3d.platform.GlStateManager; -import com.mojang.blaze3d.platform.Window; -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.BufferBuilder; -import com.mojang.blaze3d.vertex.DefaultVertexFormat; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.Tesselator; -import com.mojang.blaze3d.vertex.VertexFormat; -import com.mojang.math.Matrix4f; -import com.mojang.math.Vector3f; -import com.simibubi.create.foundation.utility.Color; -import com.simibubi.create.foundation.utility.Couple; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.GameRenderer; -import net.minecraftforge.client.gui.GuiUtils; - -public class UIRenderHelper { - - /** - * An FBO that has a stencil buffer for use wherever stencil are necessary. Forcing the main FBO to have a stencil - * buffer will cause GL error spam when using fabulous graphics. - */ - public static CustomRenderTarget framebuffer; - - public static void init() { - RenderSystem.recordRenderCall(() -> { - Window mainWindow = Minecraft.getInstance().getWindow(); - framebuffer = CustomRenderTarget.create(mainWindow); - }); - } - - public static void updateWindowSize(Window mainWindow) { - if (framebuffer != null) - framebuffer.resize(mainWindow.getWidth(), mainWindow.getHeight(), Minecraft.ON_OSX); - } - - public static void drawFramebuffer(float alpha) { - framebuffer.renderWithAlpha(alpha); - } - - /** - * Switch from src to dst, after copying the contents of src to dst. - */ - public static void swapAndBlitColor(RenderTarget src, RenderTarget dst) { - GlStateManager._glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, src.frameBufferId); - GlStateManager._glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, dst.frameBufferId); - GlStateManager._glBlitFrameBuffer(0, 0, src.viewWidth, src.viewHeight, 0, 0, dst.viewWidth, dst.viewHeight, GL30.GL_COLOR_BUFFER_BIT, GL20.GL_LINEAR); - - GlStateManager._glBindFramebuffer(GlConst.GL_FRAMEBUFFER, dst.frameBufferId); - } - - public static void streak(PoseStack ms, float angle, int x, int y, int breadth, int length) { - streak(ms, angle, x, y, breadth, length, Theme.i(Theme.Key.STREAK)); - } - // angle in degrees; 0° -> fading to the right - // x and y specify the middle point of the starting edge - // breadth is the total width of the streak - - public static void streak(PoseStack ms, float angle, int x, int y, int breadth, int length, int color) { - int a1 = 0xa0 << 24; - int a2 = 0x80 << 24; - int a3 = 0x10 << 24; - int a4 = 0x00 << 24; - - color &= 0x00FFFFFF; - int c1 = a1 | color; - int c2 = a2 | color; - int c3 = a3 | color; - int c4 = a4 | color; - - ms.pushPose(); - ms.translate(x, y, 0); - ms.mulPose(Vector3f.ZP.rotationDegrees(angle - 90)); - - streak(ms, breadth / 2, length, c1, c2, c3, c4); - - ms.popPose(); - } - - public static void streak(PoseStack ms, float angle, int x, int y, int breadth, int length, Color c) { - Color color = c.copy().setImmutable(); - int c1 = color.scaleAlpha(0.625f).getRGB(); - int c2 = color.scaleAlpha(0.5f).getRGB(); - int c3 = color.scaleAlpha(0.0625f).getRGB(); - int c4 = color.scaleAlpha(0f).getRGB(); - - ms.pushPose(); - ms.translate(x, y, 0); - ms.mulPose(Vector3f.ZP.rotationDegrees(angle - 90)); - - streak(ms, breadth / 2, length, c1, c2, c3, c4); - - ms.popPose(); - } - - private static void streak(PoseStack ms, int width, int height, int c1, int c2, int c3, int c4) { - double split1 = .5; - double split2 = .75; - Matrix4f model = ms.last().pose(); - GuiUtils.drawGradientRect(model, 0, -width, 0, width, (int) (split1 * height), c1, c2); - GuiUtils.drawGradientRect(model, 0, -width, (int) (split1 * height), width, (int) (split2 * height), c2, c3); - GuiUtils.drawGradientRect(model, 0, -width, (int) (split2 * height), width, height, c3, c4); - } - - /** - * @see #angledGradient(MatrixStack, float, int, int, int, int, int, Color, Color) - */ - public static void angledGradient(@Nonnull PoseStack ms, float angle, int x, int y, int breadth, int length, Couple c) { - angledGradient(ms, angle, x, y, 0, breadth, length, c); - } - - /** - * @see #angledGradient(MatrixStack, float, int, int, int, int, int, Color, Color) - */ - public static void angledGradient(@Nonnull PoseStack ms, float angle, int x, int y, int z, int breadth, int length, Couple c) { - angledGradient(ms, angle, x, y, z, breadth, length, c.getFirst(), c.getSecond()); - } - - /** - * @see #angledGradient(MatrixStack, float, int, int, int, int, int, Color, Color) - */ - public static void angledGradient(@Nonnull PoseStack ms, float angle, int x, int y, int breadth, int length, Color color1, Color color2) { - angledGradient(ms, angle, x, y, 0, breadth, length, color1, color2); - } - - /** - * x and y specify the middle point of the starting edge - * - * @param angle the angle of the gradient in degrees; 0° means from left to right - * @param color1 the color at the starting edge - * @param color2 the color at the ending edge - * @param breadth the total width of the gradient - */ - public static void angledGradient(@Nonnull PoseStack ms, float angle, int x, int y, int z, int breadth, int length, Color color1, Color color2) { - ms.pushPose(); - ms.translate(x, y, z); - ms.mulPose(Vector3f.ZP.rotationDegrees(angle - 90)); - - Matrix4f model = ms.last().pose(); - int w = breadth / 2; - GuiUtils.drawGradientRect(model, 0, -w, 0, w, length, color1.getRGB(), color2.getRGB()); - - ms.popPose(); - } - - public static void breadcrumbArrow(PoseStack matrixStack, int x, int y, int z, int width, int height, int indent, Couple colors) {breadcrumbArrow(matrixStack, x, y, z, width, height, indent, colors.getFirst(), colors.getSecond());} - - // draws a wide chevron-style breadcrumb arrow pointing left - public static void breadcrumbArrow(PoseStack matrixStack, int x, int y, int z, int width, int height, int indent, Color startColor, Color endColor) { - matrixStack.pushPose(); - matrixStack.translate(x - indent, y, z); - - breadcrumbArrow(matrixStack, width, height, indent, startColor, endColor); - - matrixStack.popPose(); - } - - private static void breadcrumbArrow(PoseStack ms, int width, int height, int indent, Color c1, Color c2) { - - /* - * 0,0 x1,y1 ********************* x4,y4 ***** x7,y7 - * **** **** - * **** **** - * x0,y0 x2,y2 x5,y5 - * **** **** - * **** **** - * x3,y3 ********************* x6,y6 ***** x8,y8 - * - */ - - float x0 = 0, y0 = height / 2f; - float x1 = indent, y1 = 0; - float x2 = indent, y2 = height / 2f; - float x3 = indent, y3 = height; - float x4 = width, y4 = 0; - float x5 = width, y5 = height / 2f; - float x6 = width, y6 = height; - float x7 = indent + width, y7 = 0; - float x8 = indent + width, y8 = height; - - indent = Math.abs(indent); - width = Math.abs(width); - Color fc1 = Color.mixColors(c1, c2, 0); - Color fc2 = Color.mixColors(c1, c2, (indent) / (width + 2f * indent)); - Color fc3 = Color.mixColors(c1, c2, (indent + width) / (width + 2f * indent)); - Color fc4 = Color.mixColors(c1, c2, 1); - - RenderSystem.disableTexture(); - RenderSystem.enableBlend(); - RenderSystem.disableCull(); - RenderSystem.defaultBlendFunc(); - RenderSystem.setShader(GameRenderer::getPositionColorShader); - - Tesselator tessellator = Tesselator.getInstance(); - BufferBuilder bufferbuilder = tessellator.getBuilder(); - Matrix4f model = ms.last().pose(); - bufferbuilder.begin(VertexFormat.Mode.TRIANGLES, DefaultVertexFormat.POSITION_COLOR); - - bufferbuilder.vertex(model, x0, y0, 0).color(fc1.getRed(), fc1.getGreen(), fc1.getBlue(), fc1.getAlpha()).endVertex(); - bufferbuilder.vertex(model, x1, y1, 0).color(fc2.getRed(), fc2.getGreen(), fc2.getBlue(), fc2.getAlpha()).endVertex(); - bufferbuilder.vertex(model, x2, y2, 0).color(fc2.getRed(), fc2.getGreen(), fc2.getBlue(), fc2.getAlpha()).endVertex(); - - bufferbuilder.vertex(model, x0, y0, 0).color(fc1.getRed(), fc1.getGreen(), fc1.getBlue(), fc1.getAlpha()).endVertex(); - bufferbuilder.vertex(model, x2, y2, 0).color(fc2.getRed(), fc2.getGreen(), fc2.getBlue(), fc2.getAlpha()).endVertex(); - bufferbuilder.vertex(model, x3, y3, 0).color(fc2.getRed(), fc2.getGreen(), fc2.getBlue(), fc2.getAlpha()).endVertex(); - - bufferbuilder.vertex(model, x3, y3, 0).color(fc2.getRed(), fc2.getGreen(), fc2.getBlue(), fc2.getAlpha()).endVertex(); - bufferbuilder.vertex(model, x1, y1, 0).color(fc2.getRed(), fc2.getGreen(), fc2.getBlue(), fc2.getAlpha()).endVertex(); - bufferbuilder.vertex(model, x4, y4, 0).color(fc3.getRed(), fc3.getGreen(), fc3.getBlue(), fc3.getAlpha()).endVertex(); - - bufferbuilder.vertex(model, x3, y3, 0).color(fc2.getRed(), fc2.getGreen(), fc2.getBlue(), fc2.getAlpha()).endVertex(); - bufferbuilder.vertex(model, x4, y4, 0).color(fc3.getRed(), fc3.getGreen(), fc3.getBlue(), fc3.getAlpha()).endVertex(); - bufferbuilder.vertex(model, x6, y6, 0).color(fc3.getRed(), fc3.getGreen(), fc3.getBlue(), fc3.getAlpha()).endVertex(); - - bufferbuilder.vertex(model, x5, y5, 0).color(fc3.getRed(), fc3.getGreen(), fc3.getBlue(), fc3.getAlpha()).endVertex(); - bufferbuilder.vertex(model, x4, y4, 0).color(fc3.getRed(), fc3.getGreen(), fc3.getBlue(), fc3.getAlpha()).endVertex(); - bufferbuilder.vertex(model, x7, y7, 0).color(fc4.getRed(), fc4.getGreen(), fc4.getBlue(), fc4.getAlpha()).endVertex(); - - bufferbuilder.vertex(model, x6, y6, 0).color(fc3.getRed(), fc3.getGreen(), fc3.getBlue(), fc3.getAlpha()).endVertex(); - bufferbuilder.vertex(model, x5, y5, 0).color(fc3.getRed(), fc3.getGreen(), fc3.getBlue(), fc3.getAlpha()).endVertex(); - bufferbuilder.vertex(model, x8, y8, 0).color(fc4.getRed(), fc4.getGreen(), fc4.getBlue(), fc4.getAlpha()).endVertex(); - - tessellator.end(); - RenderSystem.enableCull(); - RenderSystem.disableBlend(); - RenderSystem.enableTexture(); - } - - //just like AbstractGui#drawTexture, but with a color at every vertex - public static void drawColoredTexture(PoseStack ms, Color c, int x, int y, int tex_left, int tex_top, int width, int height) { - drawColoredTexture(ms, c, x, y, 0, (float) tex_left, (float) tex_top, width, height, 256, 256); - } - - public static void drawColoredTexture(PoseStack ms, Color c, int x, int y, int z, float tex_left, float tex_top, int width, int height, int sheet_width, int sheet_height) { - drawColoredTexture(ms, c, x, x + width, y, y + height, z, width, height, tex_left, tex_top, sheet_width, sheet_height); - } - - public static void drawStretched(PoseStack ms, int left, int top, int w, int h, int z, AllGuiTextures tex) { - tex.bind(); - drawTexturedQuad(ms.last() - .pose(), Color.WHITE, left, left + w, top, top + h, z, tex.startX / 256f, (tex.startX + tex.width) / 256f, - tex.startY / 256f, (tex.startY + tex.height) / 256f); - } - - private static void drawColoredTexture(PoseStack ms, Color c, int left, int right, int top, int bot, int z, int tex_width, int tex_height, float tex_left, float tex_top, int sheet_width, int sheet_height) { - drawTexturedQuad(ms.last().pose(), c, left, right, top, bot, z, (tex_left + 0.0F) / (float) sheet_width, (tex_left + (float) tex_width) / (float) sheet_width, (tex_top + 0.0F) / (float) sheet_height, (tex_top + (float) tex_height) / (float) sheet_height); - } - - private static void drawTexturedQuad(Matrix4f m, Color c, int left, int right, int top, int bot, int z, float u1, float u2, float v1, float v2) { - Tesselator tesselator = Tesselator.getInstance(); - BufferBuilder bufferbuilder = tesselator.getBuilder(); - RenderSystem.enableBlend(); - RenderSystem.defaultBlendFunc(); - RenderSystem.setShader(GameRenderer::getPositionColorTexShader); - bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR_TEX); - bufferbuilder.vertex(m, (float) left , (float) bot, (float) z).color(c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()).uv(u1, v2).endVertex(); - bufferbuilder.vertex(m, (float) right, (float) bot, (float) z).color(c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()).uv(u2, v2).endVertex(); - bufferbuilder.vertex(m, (float) right, (float) top, (float) z).color(c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()).uv(u2, v1).endVertex(); - bufferbuilder.vertex(m, (float) left , (float) top, (float) z).color(c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()).uv(u1, v1).endVertex(); - tesselator.end(); - RenderSystem.disableBlend(); - } - - public static void flipForGuiRender(PoseStack poseStack) { - poseStack.mulPoseMatrix(Matrix4f.createScaleMatrix(1, -1, 1)); - } - - public static class CustomRenderTarget extends RenderTarget { - - public CustomRenderTarget(boolean useDepth) { - super(useDepth); - } - - public static CustomRenderTarget create(Window mainWindow) { - CustomRenderTarget framebuffer = new CustomRenderTarget(true); - framebuffer.resize(mainWindow.getWidth(), mainWindow.getHeight(), Minecraft.ON_OSX); - framebuffer.setClearColor(0, 0, 0, 0); - framebuffer.enableStencil(); - return framebuffer; - } - - public void renderWithAlpha(float alpha) { - Window window = Minecraft.getInstance().getWindow(); - - float vx = (float) window.getGuiScaledWidth(); - float vy = (float) window.getGuiScaledHeight(); - float tx = (float) viewWidth / (float) width; - float ty = (float) viewHeight / (float) height; - - RenderSystem.enableTexture(); - RenderSystem.enableDepthTest(); - RenderSystem.setShader(() -> Minecraft.getInstance().gameRenderer.blitShader); - RenderSystem.getShader().setSampler("DiffuseSampler", colorTextureId); - - bindRead(); - - Tesselator tessellator = Tesselator.getInstance(); - BufferBuilder bufferbuilder = tessellator.getBuilder(); - bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR_TEX); - - bufferbuilder.vertex(0, vy, 0).color(1, 1, 1, alpha).uv(0, 0).endVertex(); - bufferbuilder.vertex(vx, vy, 0).color(1, 1, 1, alpha).uv(tx, 0).endVertex(); - bufferbuilder.vertex(vx, 0, 0).color(1, 1, 1, alpha).uv(tx, ty).endVertex(); - bufferbuilder.vertex(0, 0, 0).color(1, 1, 1, alpha).uv(0, ty).endVertex(); - - tessellator.end(); - unbindRead(); - } - - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/gui/container/AbstractSimiContainerScreen.java b/src/main/java/com/simibubi/create/foundation/gui/container/AbstractSimiContainerScreen.java index f18e1a0232..9d8732cccc 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/container/AbstractSimiContainerScreen.java +++ b/src/main/java/com/simibubi/create/foundation/gui/container/AbstractSimiContainerScreen.java @@ -9,9 +9,9 @@ import javax.annotation.ParametersAreNonnullByDefault; import com.mojang.blaze3d.platform.InputConstants; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.foundation.gui.AllGuiTextures; -import com.simibubi.create.foundation.gui.TickableGuiEventListener; -import com.simibubi.create.foundation.gui.widget.AbstractSimiWidget; +import net.createmod.catnip.gui.TickableGuiEventListener; +import net.createmod.catnip.gui.widget.AbstractSimiWidget; import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.components.Widget; import net.minecraft.client.gui.components.events.GuiEventListener; @@ -141,7 +141,7 @@ public abstract class AbstractSimiContainerScreen T withBackground(Color color) { - this.background = color; - //noinspection unchecked - return (T) this; - } - - public T withBackground(int color) { - return withBackground(new Color(color, true)); - } - - public T flatBorder(Color color) { - this.borderTop = color; - this.borderBot = color; - //noinspection unchecked - return (T) this; - } - - public T flatBorder(int color) { - return flatBorder(new Color(color, true)); - } - - public T gradientBorder(Couple colors) { - this.borderTop = colors.getFirst(); - this.borderBot = colors.getSecond(); - //noinspection unchecked - return (T) this; - } - - public T gradientBorder(Color top, Color bot) { - this.borderTop = top; - this.borderBot = bot; - //noinspection unchecked - return (T) this; - } - - public T gradientBorder(int top, int bot) { - return gradientBorder(new Color(top, true), new Color(bot, true)); - } - - public T withBorderOffset(int offset) { - this.borderOffset = offset; - //noinspection unchecked - return (T) this; - } - - @Override - public void render(PoseStack ms) { - renderBox(ms); - } - - //total box width = 1 * 2 (outer border) + 1 * 2 (inner color border) + 2 * borderOffset + width - //defaults to 2 + 2 + 4 + 16 = 24px - //batch everything together to save a bunch of gl calls over GuiUtils - protected void renderBox(PoseStack ms) { - /* - * _____________ - * _|_____________|_ - * | | ___________ | | - * | | | | | | | - * | | | | | | | - * | | |--* | | | | - * | | | h | | | - * | | | --w-+ | | | - * | | | | | | - * | | |_________| | | - * |_|_____________|_| - * |_____________| - * - * */ - RenderSystem.disableTexture(); - RenderSystem.enableBlend(); - RenderSystem.defaultBlendFunc(); - RenderSystem.setShader(GameRenderer::getPositionColorShader); - - Matrix4f model = ms.last().pose(); - int f = borderOffset; - Color c1 = background.copy().scaleAlpha(alpha); - Color c2 = borderTop.copy().scaleAlpha(alpha); - Color c3 = borderBot.copy().scaleAlpha(alpha); - Tesselator tessellator = Tesselator.getInstance(); - BufferBuilder b = tessellator.getBuilder(); - - b.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); - //outer top - b.vertex(model, x - f - 1 , y - f - 2 , z).color(c1.getRed(), c1.getGreen(), c1.getBlue(), c1.getAlpha()).endVertex(); - b.vertex(model, x - f - 1 , y - f - 1 , z).color(c1.getRed(), c1.getGreen(), c1.getBlue(), c1.getAlpha()).endVertex(); - b.vertex(model, x + f + 1 + width, y - f - 1 , z).color(c1.getRed(), c1.getGreen(), c1.getBlue(), c1.getAlpha()).endVertex(); - b.vertex(model, x + f + 1 + width, y - f - 2 , z).color(c1.getRed(), c1.getGreen(), c1.getBlue(), c1.getAlpha()).endVertex(); - //outer left - b.vertex(model, x - f - 2 , y - f - 1 , z).color(c1.getRed(), c1.getGreen(), c1.getBlue(), c1.getAlpha()).endVertex(); - b.vertex(model, x - f - 2 , y + f + 1 + height, z).color(c1.getRed(), c1.getGreen(), c1.getBlue(), c1.getAlpha()).endVertex(); - b.vertex(model, x - f - 1 , y + f + 1 + height, z).color(c1.getRed(), c1.getGreen(), c1.getBlue(), c1.getAlpha()).endVertex(); - b.vertex(model, x - f - 1 , y - f - 1 , z).color(c1.getRed(), c1.getGreen(), c1.getBlue(), c1.getAlpha()).endVertex(); - //outer bottom - b.vertex(model, x - f - 1 , y + f + 1 + height, z).color(c1.getRed(), c1.getGreen(), c1.getBlue(), c1.getAlpha()).endVertex(); - b.vertex(model, x - f - 1 , y + f + 2 + height, z).color(c1.getRed(), c1.getGreen(), c1.getBlue(), c1.getAlpha()).endVertex(); - b.vertex(model, x + f + 1 + width, y + f + 2 + height, z).color(c1.getRed(), c1.getGreen(), c1.getBlue(), c1.getAlpha()).endVertex(); - b.vertex(model, x + f + 1 + width, y + f + 1 + height, z).color(c1.getRed(), c1.getGreen(), c1.getBlue(), c1.getAlpha()).endVertex(); - //outer right - b.vertex(model, x + f + 1 + width, y - f - 1 , z).color(c1.getRed(), c1.getGreen(), c1.getBlue(), c1.getAlpha()).endVertex(); - b.vertex(model, x + f + 1 + width, y + f + 1 + height, z).color(c1.getRed(), c1.getGreen(), c1.getBlue(), c1.getAlpha()).endVertex(); - b.vertex(model, x + f + 2 + width, y + f + 1 + height, z).color(c1.getRed(), c1.getGreen(), c1.getBlue(), c1.getAlpha()).endVertex(); - b.vertex(model, x + f + 2 + width, y - f - 1 , z).color(c1.getRed(), c1.getGreen(), c1.getBlue(), c1.getAlpha()).endVertex(); - //inner background - also render behind the inner edges - b.vertex(model, x - f - 1 , y - f - 1 , z).color(c1.getRed(), c1.getGreen(), c1.getBlue(), c1.getAlpha()).endVertex(); - b.vertex(model, x - f - 1 , y + f + 1 + height, z).color(c1.getRed(), c1.getGreen(), c1.getBlue(), c1.getAlpha()).endVertex(); - b.vertex(model, x + f + 1 + width, y + f + 1 + height, z).color(c1.getRed(), c1.getGreen(), c1.getBlue(), c1.getAlpha()).endVertex(); - b.vertex(model, x + f + 1 + width, y - f - 1 , z).color(c1.getRed(), c1.getGreen(), c1.getBlue(), c1.getAlpha()).endVertex(); - tessellator.end(); - b.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); - //inner top - includes corners - b.vertex(model, x - f - 1 , y - f - 1 , z).color(c2.getRed(), c2.getGreen(), c2.getBlue(), c2.getAlpha()).endVertex(); - b.vertex(model, x - f - 1 , y - f , z).color(c2.getRed(), c2.getGreen(), c2.getBlue(), c2.getAlpha()).endVertex(); - b.vertex(model, x + f + 1 + width, y - f , z).color(c2.getRed(), c2.getGreen(), c2.getBlue(), c2.getAlpha()).endVertex(); - b.vertex(model, x + f + 1 + width, y - f - 1 , z).color(c2.getRed(), c2.getGreen(), c2.getBlue(), c2.getAlpha()).endVertex(); - //inner left - excludes corners - b.vertex(model, x - f - 1 , y - f , z).color(c2.getRed(), c2.getGreen(), c2.getBlue(), c2.getAlpha()).endVertex(); - b.vertex(model, x - f - 1 , y + f + height, z).color(c3.getRed(), c3.getGreen(), c3.getBlue(), c3.getAlpha()).endVertex(); - b.vertex(model, x - f , y + f + height, z).color(c3.getRed(), c3.getGreen(), c3.getBlue(), c3.getAlpha()).endVertex(); - b.vertex(model, x - f , y - f , z).color(c2.getRed(), c2.getGreen(), c2.getBlue(), c2.getAlpha()).endVertex(); - //inner bottom - includes corners - b.vertex(model, x - f - 1 , y + f + height, z).color(c3.getRed(), c3.getGreen(), c3.getBlue(), c3.getAlpha()).endVertex(); - b.vertex(model, x - f - 1 , y + f + 1 + height, z).color(c3.getRed(), c3.getGreen(), c3.getBlue(), c3.getAlpha()).endVertex(); - b.vertex(model, x + f + 1 + width, y + f + 1 + height, z).color(c3.getRed(), c3.getGreen(), c3.getBlue(), c3.getAlpha()).endVertex(); - b.vertex(model, x + f + 1 + width, y + f + height, z).color(c3.getRed(), c3.getGreen(), c3.getBlue(), c3.getAlpha()).endVertex(); - //inner right - excludes corners - b.vertex(model, x + f + width, y - f , z).color(c2.getRed(), c2.getGreen(), c2.getBlue(), c2.getAlpha()).endVertex(); - b.vertex(model, x + f + width, y + f + height, z).color(c3.getRed(), c3.getGreen(), c3.getBlue(), c3.getAlpha()).endVertex(); - b.vertex(model, x + f + 1 + width, y + f + height, z).color(c3.getRed(), c3.getGreen(), c3.getBlue(), c3.getAlpha()).endVertex(); - b.vertex(model, x + f + 1 + width, y - f , z).color(c2.getRed(), c2.getGreen(), c2.getBlue(), c2.getAlpha()).endVertex(); - - tessellator.end(); - - RenderSystem.disableBlend(); - RenderSystem.enableTexture(); - } -} diff --git a/src/main/java/com/simibubi/create/foundation/gui/element/CombinedStencilElement.java b/src/main/java/com/simibubi/create/foundation/gui/element/CombinedStencilElement.java deleted file mode 100644 index 6096f8427b..0000000000 --- a/src/main/java/com/simibubi/create/foundation/gui/element/CombinedStencilElement.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.simibubi.create.foundation.gui.element; - -import javax.annotation.Nonnull; - -import com.mojang.blaze3d.vertex.PoseStack; - -public class CombinedStencilElement extends StencilElement { - - private StencilElement element1; - private StencilElement element2; - private ElementMode mode; - - private CombinedStencilElement() {} - - public static CombinedStencilElement of(@Nonnull StencilElement element1, @Nonnull StencilElement element2) { - return of(element1, element2, ElementMode.FIRST); - } - - public static CombinedStencilElement of(@Nonnull StencilElement element1, @Nonnull StencilElement element2, ElementMode mode) { - CombinedStencilElement e = new CombinedStencilElement(); - e.element1 = element1; - e.element2 = element2; - e.mode = mode; - return e; - } - - public T withFirst(StencilElement element) { - this.element1 = element; - //noinspection unchecked - return (T) this; - } - - public T withSecond(StencilElement element) { - this.element2 = element; - //noinspection unchecked - return (T) this; - } - - public T withMode(ElementMode mode) { - this.mode = mode; - //noinspection unchecked - return (T) this; - } - - @Override - protected void renderStencil(PoseStack ms) { - ms.pushPose(); - element1.transform(ms); - element1.withBounds(width, height); - element1.renderStencil(ms); - ms.popPose(); - ms.pushPose(); - element2.transform(ms); - element2.withBounds(width, height); - element2.renderStencil(ms); - ms.popPose(); - } - - @Override - protected void renderElement(PoseStack ms) { - if (mode.rendersFirst()) - element1.withBounds(width, height).renderElement(ms); - - if (mode.rendersSecond()) - element2.withBounds(width, height).renderElement(ms); - } - - public enum ElementMode { - FIRST, SECOND, BOTH; - - boolean rendersFirst() { - return this == FIRST || this == BOTH; - } - - boolean rendersSecond() { - return this == SECOND || this == BOTH; - } - } -} diff --git a/src/main/java/com/simibubi/create/foundation/gui/element/DelegatedStencilElement.java b/src/main/java/com/simibubi/create/foundation/gui/element/DelegatedStencilElement.java deleted file mode 100644 index 4ca427a4de..0000000000 --- a/src/main/java/com/simibubi/create/foundation/gui/element/DelegatedStencilElement.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.simibubi.create.foundation.gui.element; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.foundation.gui.UIRenderHelper; -import com.simibubi.create.foundation.utility.Color; - -public class DelegatedStencilElement extends StencilElement { - - protected static final ElementRenderer EMPTY_RENDERER = (ms, width, height, alpha) -> {}; - protected static final ElementRenderer DEFAULT_ELEMENT = (ms, width, height, alpha) -> UIRenderHelper.angledGradient(ms, 0, -3, 5, height+4, width+6, new Color(0xff_10dd10).scaleAlpha(alpha), new Color(0xff_1010dd).scaleAlpha(alpha)); - - protected ElementRenderer stencil; - protected ElementRenderer element; - - public DelegatedStencilElement() { - stencil = EMPTY_RENDERER; - element = DEFAULT_ELEMENT; - } - - public DelegatedStencilElement(ElementRenderer stencil, ElementRenderer element) { - this.stencil = stencil; - this.element = element; - } - - public T withStencilRenderer(ElementRenderer renderer) { - stencil = renderer; - //noinspection unchecked - return (T) this; - } - - public T withElementRenderer(ElementRenderer renderer) { - element = renderer; - //noinspection unchecked - return (T) this; - } - - @Override - protected void renderStencil(PoseStack ms) { - stencil.render(ms, width, height, 1); - } - - @Override - protected void renderElement(PoseStack ms) { - element.render(ms, width, height, alpha); - } - - @FunctionalInterface - public interface ElementRenderer { - void render(PoseStack ms, int width, int height, float alpha); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/gui/element/GuiGameElement.java b/src/main/java/com/simibubi/create/foundation/gui/element/GuiGameElement.java deleted file mode 100644 index 0309b9532c..0000000000 --- a/src/main/java/com/simibubi/create/foundation/gui/element/GuiGameElement.java +++ /dev/null @@ -1,291 +0,0 @@ -package com.simibubi.create.foundation.gui.element; - -import javax.annotation.Nullable; - -import com.jozufozu.flywheel.core.PartialModel; -import com.jozufozu.flywheel.core.virtual.VirtualEmptyModelData; -import com.mojang.blaze3d.platform.GlStateManager; -import com.mojang.blaze3d.platform.GlStateManager.DestFactor; -import com.mojang.blaze3d.platform.GlStateManager.SourceFactor; -import com.mojang.blaze3d.platform.Lighting; -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; -import com.mojang.math.Vector3f; -import com.simibubi.create.foundation.fluid.FluidRenderer; -import com.simibubi.create.foundation.gui.ILightingSettings; -import com.simibubi.create.foundation.gui.UIRenderHelper; -import com.simibubi.create.foundation.utility.Color; -import com.simibubi.create.foundation.utility.VecHelper; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.ItemBlockRenderTypes; -import net.minecraft.client.renderer.LightTexture; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.Sheets; -import net.minecraft.client.renderer.block.BlockRenderDispatcher; -import net.minecraft.client.renderer.block.model.ItemTransforms; -import net.minecraft.client.renderer.entity.ItemRenderer; -import net.minecraft.client.renderer.texture.OverlayTexture; -import net.minecraft.client.resources.model.BakedModel; -import net.minecraft.core.BlockPos; -import net.minecraft.world.inventory.InventoryMenu; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.ItemLike; -import net.minecraft.world.level.block.BaseFireBlock; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.LiquidBlock; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.material.Fluid; -import net.minecraft.world.phys.Vec3; -import net.minecraftforge.fluids.FluidStack; - -public class GuiGameElement { - - public static GuiRenderBuilder of(ItemStack stack) { - return new GuiItemRenderBuilder(stack); - } - - public static GuiRenderBuilder of(ItemLike itemProvider) { - return new GuiItemRenderBuilder(itemProvider); - } - - public static GuiRenderBuilder of(BlockState state) { - return new GuiBlockStateRenderBuilder(state); - } - - public static GuiRenderBuilder of(PartialModel partial) { - return new GuiBlockPartialRenderBuilder(partial); - } - - public static GuiRenderBuilder of(Fluid fluid) { - return new GuiBlockStateRenderBuilder(fluid.defaultFluidState() - .createLegacyBlock() - .setValue(LiquidBlock.LEVEL, 0)); - } - - public static abstract class GuiRenderBuilder extends RenderElement { - protected double xLocal, yLocal, zLocal; - protected double xRot, yRot, zRot; - protected double scale = 1; - protected int color = 0xFFFFFF; - protected Vec3 rotationOffset = Vec3.ZERO; - protected ILightingSettings customLighting = null; - - public GuiRenderBuilder atLocal(double x, double y, double z) { - this.xLocal = x; - this.yLocal = y; - this.zLocal = z; - return this; - } - - public GuiRenderBuilder rotate(double xRot, double yRot, double zRot) { - this.xRot = xRot; - this.yRot = yRot; - this.zRot = zRot; - return this; - } - - public GuiRenderBuilder rotateBlock(double xRot, double yRot, double zRot) { - return this.rotate(xRot, yRot, zRot) - .withRotationOffset(VecHelper.getCenterOf(BlockPos.ZERO)); - } - - public GuiRenderBuilder scale(double scale) { - this.scale = scale; - return this; - } - - public GuiRenderBuilder color(int color) { - this.color = color; - return this; - } - - public GuiRenderBuilder withRotationOffset(Vec3 offset) { - this.rotationOffset = offset; - return this; - } - - public GuiRenderBuilder lighting(ILightingSettings lighting) { - customLighting = lighting; - return this; - } - - protected void prepareMatrix(PoseStack matrixStack) { - matrixStack.pushPose(); - RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); - RenderSystem.enableDepthTest(); - RenderSystem.enableBlend(); - RenderSystem.blendFunc(SourceFactor.SRC_ALPHA, DestFactor.ONE_MINUS_SRC_ALPHA); - prepareLighting(matrixStack); - } - - protected void transformMatrix(PoseStack matrixStack) { - matrixStack.translate(x, y, z); - matrixStack.scale((float) scale, (float) scale, (float) scale); - matrixStack.translate(xLocal, yLocal, zLocal); - UIRenderHelper.flipForGuiRender(matrixStack); - matrixStack.translate(rotationOffset.x, rotationOffset.y, rotationOffset.z); - matrixStack.mulPose(Vector3f.ZP.rotationDegrees((float) zRot)); - matrixStack.mulPose(Vector3f.XP.rotationDegrees((float) xRot)); - matrixStack.mulPose(Vector3f.YP.rotationDegrees((float) yRot)); - matrixStack.translate(-rotationOffset.x, -rotationOffset.y, -rotationOffset.z); - } - - protected void cleanUpMatrix(PoseStack matrixStack) { - matrixStack.popPose(); - cleanUpLighting(matrixStack); - } - - protected void prepareLighting(PoseStack matrixStack) { - if (customLighting != null) { - customLighting.applyLighting(); - } else { - Lighting.setupFor3DItems(); - } - } - - protected void cleanUpLighting(PoseStack matrixStack) { - if (customLighting != null) { - Lighting.setupFor3DItems(); - } - } - } - - private static class GuiBlockModelRenderBuilder extends GuiRenderBuilder { - - protected BakedModel blockModel; - protected BlockState blockState; - - public GuiBlockModelRenderBuilder(BakedModel blockmodel, @Nullable BlockState blockState) { - this.blockState = blockState == null ? Blocks.AIR.defaultBlockState() : blockState; - this.blockModel = blockmodel; - } - - @Override - public void render(PoseStack matrixStack) { - prepareMatrix(matrixStack); - - Minecraft mc = Minecraft.getInstance(); - BlockRenderDispatcher blockRenderer = mc.getBlockRenderer(); - MultiBufferSource.BufferSource buffer = mc.renderBuffers() - .bufferSource(); - RenderType renderType = blockState.getBlock() == Blocks.AIR ? Sheets.translucentCullBlockSheet() - : ItemBlockRenderTypes.getRenderType(blockState, true); - VertexConsumer vb = buffer.getBuffer(renderType); - - transformMatrix(matrixStack); - - RenderSystem.setShaderTexture(0, InventoryMenu.BLOCK_ATLAS); - renderModel(blockRenderer, buffer, renderType, vb, matrixStack); - - cleanUpMatrix(matrixStack); - } - - protected void renderModel(BlockRenderDispatcher blockRenderer, MultiBufferSource.BufferSource buffer, - RenderType renderType, VertexConsumer vb, PoseStack ms) { - int color = Minecraft.getInstance() - .getBlockColors() - .getColor(blockState, null, null, 0); - Color rgb = new Color(color == -1 ? this.color : color); - blockRenderer.getModelRenderer() - .renderModel(ms.last(), vb, blockState, blockModel, rgb.getRedAsFloat(), rgb.getGreenAsFloat(), rgb.getBlueAsFloat(), - LightTexture.FULL_BRIGHT, OverlayTexture.NO_OVERLAY, VirtualEmptyModelData.INSTANCE); - buffer.endBatch(); - } - - } - - public static class GuiBlockStateRenderBuilder extends GuiBlockModelRenderBuilder { - - public GuiBlockStateRenderBuilder(BlockState blockstate) { - super(Minecraft.getInstance() - .getBlockRenderer() - .getBlockModel(blockstate), blockstate); - } - - @Override - protected void renderModel(BlockRenderDispatcher blockRenderer, MultiBufferSource.BufferSource buffer, - RenderType renderType, VertexConsumer vb, PoseStack ms) { - if (blockState.getBlock() instanceof BaseFireBlock) { - Lighting.setupForFlatItems(); - blockRenderer.renderSingleBlock(blockState, ms, buffer, LightTexture.FULL_BRIGHT, OverlayTexture.NO_OVERLAY, - VirtualEmptyModelData.INSTANCE); - buffer.endBatch(); - Lighting.setupFor3DItems(); - return; - } - - super.renderModel(blockRenderer, buffer, renderType, vb, ms); - - if (blockState.getFluidState() - .isEmpty()) - return; - - FluidRenderer.renderFluidBox(new FluidStack(blockState.getFluidState() - .getType(), 1000), 0, 0, 0, 1, 1, 1, buffer, ms, LightTexture.FULL_BRIGHT, false); - buffer.endBatch(); - } - } - - public static class GuiBlockPartialRenderBuilder extends GuiBlockModelRenderBuilder { - - public GuiBlockPartialRenderBuilder(PartialModel partial) { - super(partial.get(), null); - } - - } - - public static class GuiItemRenderBuilder extends GuiRenderBuilder { - - private final ItemStack stack; - - public GuiItemRenderBuilder(ItemStack stack) { - this.stack = stack; - } - - public GuiItemRenderBuilder(ItemLike provider) { - this(new ItemStack(provider)); - } - - @Override - public void render(PoseStack matrixStack) { - prepareMatrix(matrixStack); - transformMatrix(matrixStack); - renderItemIntoGUI(matrixStack, stack, customLighting == null); - cleanUpMatrix(matrixStack); - } - - public static void renderItemIntoGUI(PoseStack matrixStack, ItemStack stack, boolean useDefaultLighting) { - ItemRenderer renderer = Minecraft.getInstance().getItemRenderer(); - BakedModel bakedModel = renderer.getModel(stack, null, null, 0); - - renderer.textureManager.getTexture(InventoryMenu.BLOCK_ATLAS).setFilter(false, false); - RenderSystem.setShaderTexture(0, InventoryMenu.BLOCK_ATLAS); - RenderSystem.enableBlend(); - RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); - RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); - matrixStack.pushPose(); - matrixStack.translate(0, 0, 100.0F + renderer.blitOffset); - matrixStack.translate(8.0F, -8.0F, 0.0F); - matrixStack.scale(16.0F, 16.0F, 16.0F); - MultiBufferSource.BufferSource buffer = Minecraft.getInstance().renderBuffers().bufferSource(); - boolean flatLighting = !bakedModel.usesBlockLight(); - if (useDefaultLighting && flatLighting) { - Lighting.setupForFlatItems(); - } - - renderer.render(stack, ItemTransforms.TransformType.GUI, false, matrixStack, buffer, LightTexture.FULL_BRIGHT, OverlayTexture.NO_OVERLAY, bakedModel); - buffer.endBatch(); - RenderSystem.enableDepthTest(); - if (useDefaultLighting && flatLighting) { - Lighting.setupFor3DItems(); - } - - matrixStack.popPose(); - } - - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/gui/element/PartialModelGuiElement.java b/src/main/java/com/simibubi/create/foundation/gui/element/PartialModelGuiElement.java new file mode 100644 index 0000000000..03164f67c5 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/gui/element/PartialModelGuiElement.java @@ -0,0 +1,22 @@ +package com.simibubi.create.foundation.gui.element; + +import com.jozufozu.flywheel.core.PartialModel; + +import net.createmod.catnip.gui.element.GuiGameElement; + + +public class PartialModelGuiElement extends GuiGameElement { + + public static GuiRenderBuilder of(PartialModel partial) { + return new GuiBlockPartialRenderBuilder(partial); + } + + public static class GuiBlockPartialRenderBuilder extends GuiBlockModelRenderBuilder { + + public GuiBlockPartialRenderBuilder(PartialModel partial) { + super(partial.get(), null); + } + + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/gui/element/RenderElement.java b/src/main/java/com/simibubi/create/foundation/gui/element/RenderElement.java deleted file mode 100644 index 444c03b5de..0000000000 --- a/src/main/java/com/simibubi/create/foundation/gui/element/RenderElement.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.simibubi.create.foundation.gui.element; - -import com.mojang.blaze3d.vertex.PoseStack; - -public abstract class RenderElement implements ScreenElement { - - public static final RenderElement EMPTY = new RenderElement() { - @Override - public void render(PoseStack ms) { - } - }; - - public static RenderElement of(ScreenElement renderable) { - return new SimpleRenderElement(renderable); - } - - protected int width = 16, height = 16; - protected float x = 0, y = 0, z = 0; - protected float alpha = 1f; - - public T at(float x, float y) { - this.x = x; - this.y = y; - //noinspection unchecked - return (T) this; - } - - public T at(float x, float y, float z) { - this.x = x; - this.y = y; - this.z = z; - //noinspection unchecked - return (T) this; - } - - public T withBounds(int width, int height) { - this.width = width; - this.height = height; - //noinspection unchecked - return (T) this; - } - - public T withAlpha(float alpha) { - this.alpha = alpha; - //noinspection unchecked - return (T) this; - } - - public int getWidth() { - return width; - } - - public int getHeight() { - return height; - } - - public float getX() { - return x; - } - - public float getY() { - return y; - } - - public float getZ() { - return z; - } - - public abstract void render(PoseStack ms); - - @Override - public void render(PoseStack ms, int x, int y) { - this.at(x, y).render(ms); - } - - public static class SimpleRenderElement extends RenderElement { - - private ScreenElement renderable; - - public SimpleRenderElement(ScreenElement renderable) { - this.renderable = renderable; - } - - @Override - public void render(PoseStack ms) { - renderable.render(ms, (int) x, (int) y); - } - } -} diff --git a/src/main/java/com/simibubi/create/foundation/gui/element/ScreenElement.java b/src/main/java/com/simibubi/create/foundation/gui/element/ScreenElement.java deleted file mode 100644 index 9fa0f28c94..0000000000 --- a/src/main/java/com/simibubi/create/foundation/gui/element/ScreenElement.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.simibubi.create.foundation.gui.element; - -import com.mojang.blaze3d.vertex.PoseStack; - -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; - -public interface ScreenElement { - - @OnlyIn(Dist.CLIENT) - void render(PoseStack ms, int x, int y); - -} diff --git a/src/main/java/com/simibubi/create/foundation/gui/element/StencilElement.java b/src/main/java/com/simibubi/create/foundation/gui/element/StencilElement.java deleted file mode 100644 index dbe8fce56c..0000000000 --- a/src/main/java/com/simibubi/create/foundation/gui/element/StencilElement.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.simibubi.create.foundation.gui.element; - -import org.lwjgl.opengl.GL11; - -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; - -import net.minecraft.client.Minecraft; - -public abstract class StencilElement extends RenderElement { - - @Override - public void render(PoseStack ms) { - ms.pushPose(); - transform(ms); - prepareStencil(ms); - renderStencil(ms); - prepareElement(ms); - renderElement(ms); - cleanUp(ms); - ms.popPose(); - } - - protected abstract void renderStencil(PoseStack ms); - - protected abstract void renderElement(PoseStack ms); - - protected void transform(PoseStack ms) { - ms.translate(x, y, z); - } - - protected void prepareStencil(PoseStack ms) { - GL11.glDisable(GL11.GL_STENCIL_TEST); - RenderSystem.stencilMask(~0); - RenderSystem.clear(GL11.GL_STENCIL_BUFFER_BIT, Minecraft.ON_OSX); - GL11.glEnable(GL11.GL_STENCIL_TEST); - RenderSystem.stencilOp(GL11.GL_REPLACE, GL11.GL_KEEP, GL11.GL_KEEP); - RenderSystem.stencilMask(0xFF); - RenderSystem.stencilFunc(GL11.GL_NEVER, 1, 0xFF); - } - - protected void prepareElement(PoseStack ms) { - GL11.glEnable(GL11.GL_STENCIL_TEST); - RenderSystem.stencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_KEEP); - RenderSystem.stencilFunc(GL11.GL_EQUAL, 1, 0xFF); - } - - protected void cleanUp(PoseStack ms) { - GL11.glDisable(GL11.GL_STENCIL_TEST); - - } -} diff --git a/src/main/java/com/simibubi/create/foundation/gui/element/TextStencilElement.java b/src/main/java/com/simibubi/create/foundation/gui/element/TextStencilElement.java deleted file mode 100644 index d735a33aa6..0000000000 --- a/src/main/java/com/simibubi/create/foundation/gui/element/TextStencilElement.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.simibubi.create.foundation.gui.element; - -import com.mojang.blaze3d.vertex.PoseStack; - -import net.minecraft.client.gui.Font; -import net.minecraft.network.chat.MutableComponent; -import net.minecraft.network.chat.TextComponent; - -public class TextStencilElement extends DelegatedStencilElement { - - protected Font font; - protected MutableComponent component; - protected boolean centerVertically = false; - protected boolean centerHorizontally = false; - - public TextStencilElement(Font font) { - super(); - this.font = font; - height = 10; - } - - public TextStencilElement(Font font, String text) { - this(font); - component = new TextComponent(text); - } - - public TextStencilElement(Font font, MutableComponent component) { - this(font); - this.component = component; - } - - public TextStencilElement withText(String text) { - component = new TextComponent(text); - return this; - } - - public TextStencilElement withText(MutableComponent component) { - this.component = component; - return this; - } - - public TextStencilElement centered(boolean vertical, boolean horizontal) { - this.centerVertically = vertical; - this.centerHorizontally = horizontal; - return this; - } - - @Override - protected void renderStencil(PoseStack ms) { - - float x = 0, y = 0; - if (centerHorizontally) - x = width / 2f - font.width(component) / 2f; - - if (centerVertically) - y = height / 2f - (font.lineHeight - 1) / 2f; - - font.draw(ms, component, x, y, 0xff_000000); - } - - @Override - protected void renderElement(PoseStack ms) { - float x = 0, y = 0; - if (centerHorizontally) - x = width / 2f - font.width(component) / 2f; - - if (centerVertically) - y = height / 2f - (font.lineHeight - 1) / 2f; - - ms.pushPose(); - ms.translate(x, y, 0); - element.render(ms, font.width(component), font.lineHeight + 2, alpha); - ms.popPose(); - } - - public MutableComponent getComponent() { - return component; - } -} diff --git a/src/main/java/com/simibubi/create/foundation/gui/widget/AbstractSimiWidget.java b/src/main/java/com/simibubi/create/foundation/gui/widget/AbstractSimiWidget.java deleted file mode 100644 index 85cdd4ae18..0000000000 --- a/src/main/java/com/simibubi/create/foundation/gui/widget/AbstractSimiWidget.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.simibubi.create.foundation.gui.widget; - -import java.util.LinkedList; -import java.util.List; -import java.util.function.BiConsumer; - -import javax.annotation.Nonnull; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.foundation.gui.TickableGuiEventListener; - -import net.minecraft.client.gui.components.AbstractWidget; -import net.minecraft.client.gui.narration.NarrationElementOutput; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.TextComponent; - -public abstract class AbstractSimiWidget extends AbstractWidget implements TickableGuiEventListener { - - public static final int HEADER_RGB = 0x5391E1; - - protected float z; - protected boolean wasHovered = false; - protected List toolTip = new LinkedList<>(); - protected BiConsumer onClick = (_$, _$$) -> {}; - - public int lockedTooltipX = -1; - public int lockedTooltipY = -1; - - protected AbstractSimiWidget(int x, int y) { - this(x, y, 16, 16); - } - - protected AbstractSimiWidget(int x, int y, int width, int height) { - this(x, y, width, height, TextComponent.EMPTY); - } - - protected AbstractSimiWidget(int x, int y, int width, int height, Component message) { - super(x, y, width, height, message); - } - - public T withCallback(BiConsumer cb) { - this.onClick = cb; - //noinspection unchecked - return (T) this; - } - - public T withCallback(Runnable cb) { - return withCallback((_$, _$$) -> cb.run()); - } - - public T atZLevel(float z) { - this.z = z; - //noinspection unchecked - return (T) this; - } - - public List getToolTip() { - return toolTip; - } - - @Override - public void tick() {} - - @Override - public void render(@Nonnull PoseStack ms, int mouseX, int mouseY, float partialTicks) { - if (visible) { - isHovered = mouseX >= x && mouseY >= y && mouseX < x + width && mouseY < y + height; - beforeRender(ms, mouseX, mouseY, partialTicks); - renderButton(ms, mouseX, mouseY, partialTicks); - afterRender(ms, mouseX, mouseY, partialTicks); - wasHovered = isHoveredOrFocused(); - } - } - - protected void beforeRender(@Nonnull PoseStack ms, int mouseX, int mouseY, float partialTicks) { - ms.pushPose(); - } - - @Override - public void renderButton(@Nonnull PoseStack ms, int mouseX, int mouseY, float partialTicks) { - } - - protected void afterRender(@Nonnull PoseStack ms, int mouseX, int mouseY, float partialTicks) { - ms.popPose(); - } - - public void runCallback(double mouseX, double mouseY) { - onClick.accept((int) mouseX, (int) mouseY); - } - - @Override - public void onClick(double mouseX, double mouseY) { - runCallback(mouseX, mouseY); - } - - @Override - public void updateNarration(NarrationElementOutput pNarrationElementOutput) { - defaultButtonNarrationText(pNarrationElementOutput); - } -} diff --git a/src/main/java/com/simibubi/create/foundation/gui/widget/BoxWidget.java b/src/main/java/com/simibubi/create/foundation/gui/widget/BoxWidget.java deleted file mode 100644 index 424a9009ab..0000000000 --- a/src/main/java/com/simibubi/create/foundation/gui/widget/BoxWidget.java +++ /dev/null @@ -1,223 +0,0 @@ -package com.simibubi.create.foundation.gui.widget; - -import java.util.function.Function; - -import javax.annotation.Nonnull; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.foundation.gui.Theme; -import com.simibubi.create.foundation.gui.Theme.Key; -import com.simibubi.create.foundation.gui.UIRenderHelper; -import com.simibubi.create.foundation.gui.element.BoxElement; -import com.simibubi.create.foundation.gui.element.DelegatedStencilElement; -import com.simibubi.create.foundation.utility.Color; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; - -public class BoxWidget extends ElementWidget { - - public static final Function gradientFactory = (box) -> (ms, w, h, alpha) -> UIRenderHelper.angledGradient(ms, 90, w/2, -2, w + 4, h + 4, box.gradientColor1, box.gradientColor2); - - protected BoxElement box; - - protected Color customBorderTop; - protected Color customBorderBot; - protected Color customBackground; - protected boolean animateColors = true; - protected LerpedFloat colorAnimation = LerpedFloat.linear(); - - protected Color gradientColor1, gradientColor2; - private Color previousColor1, previousColor2; - private Color colorTarget1 = Theme.c(getIdleTheme(), true).copy(); - private Color colorTarget2 = Theme.c(getIdleTheme(), false).copy(); - - public BoxWidget() { - this(0, 0); - } - - public BoxWidget(int x, int y) { - this(x, y, 16, 16); - } - - public BoxWidget(int x, int y, int width, int height) { - super(x, y, width, height); - box = new BoxElement() - .at(x, y) - .withBounds(width, height); - gradientColor1 = colorTarget1; - gradientColor2 = colorTarget2; - } - - public T withBounds(int width, int height) { - this.width = width; - this.height = height; - //noinspection unchecked - return (T) this; - } - - public T withBorderColors(Couple colors) { - this.customBorderTop = colors.getFirst(); - this.customBorderBot = colors.getSecond(); - updateColorsFromState(); - //noinspection unchecked - return (T) this; - } - - public T withBorderColors(Color top, Color bot) { - this.customBorderTop = top; - this.customBorderBot = bot; - updateColorsFromState(); - //noinspection unchecked - return (T) this; - } - - public T withCustomBackground(Color color) { - this.customBackground = color; - //noinspection unchecked - return (T) this; - } - - public T animateColors(boolean b) { - this.animateColors = b; - //noinspection unchecked - return (T) this; - } - - @Override - public void tick() { - super.tick(); - colorAnimation.tickChaser(); - } - - @Override - public void onClick(double x, double y) { - super.onClick(x, y); - - gradientColor1 = Theme.c(getClickTheme(), true); - gradientColor2 = Theme.c(getClickTheme(), false); - startGradientAnimation(getColorForState(true), getColorForState(false), true, 0.15); - } - - @Override - protected void beforeRender(@Nonnull PoseStack ms, int mouseX, int mouseY, float partialTicks) { - super.beforeRender(ms, mouseX, mouseY, partialTicks); - - if (isHovered != wasHovered) { - startGradientAnimation( - getColorForState(true), - getColorForState(false), - isHovered - ); - } - - if (colorAnimation.settled()) { - gradientColor1 = colorTarget1; - gradientColor2 = colorTarget2; - } else { - float animationValue = 1 - Math.abs(colorAnimation.getValue(partialTicks)); - gradientColor1 = Color.mixColors(previousColor1, colorTarget1, animationValue); - gradientColor2 = Color.mixColors(previousColor2, colorTarget2, animationValue); - } - - } - - @Override - public void renderButton(@Nonnull PoseStack ms, int mouseX, int mouseY, float partialTicks) { - float fadeValue = fade.getValue(partialTicks); - if (fadeValue < .1f) - return; - - box.withAlpha(fadeValue); - box.withBackground(customBackground != null ? customBackground : Theme.c(Theme.Key.PONDER_BACKGROUND_TRANSPARENT)) - .gradientBorder(gradientColor1, gradientColor2) - .at(x, y, z) - .withBounds(width, height) - .render(ms); - - super.renderButton(ms, mouseX, mouseY, partialTicks); - - wasHovered = isHovered; - } - - @Override - public boolean isMouseOver(double mX, double mY) { - if (!active || !visible) - return false; - - return - x - 4 <= mX && - y - 4 <= mY && - mX <= x + 4 + width && - mY <= y + 4 + height; - } - - public BoxElement getBox() { - return box; - } - - public void updateColorsFromState() { - colorTarget1 = getColorForState(true); - colorTarget2 = getColorForState(false); - } - - public void animateGradientFromState() { - startGradientAnimation( - getColorForState(true), - getColorForState(false), - true - ); - } - - private void startGradientAnimation(Color c1, Color c2, boolean positive, double expSpeed) { - if (!animateColors) - return; - - colorAnimation.startWithValue(positive ? 1 : -1); - colorAnimation.chase(0, expSpeed, LerpedFloat.Chaser.EXP); - colorAnimation.tickChaser(); - - previousColor1 = gradientColor1; - previousColor2 = gradientColor2; - - colorTarget1 = c1; - colorTarget2 = c2; - } - - private void startGradientAnimation(Color c1, Color c2, boolean positive) { - startGradientAnimation(c1, c2, positive, 0.6); - } - - private Color getColorForState(boolean first) { - if (!active) - return Theme.p(getDisabledTheme()).get(first); - - if (isHovered) { - if (first) - return customBorderTop != null ? customBorderTop.darker() : Theme.c(getHoverTheme(), true); - else - return customBorderBot != null ? customBorderBot.darker() : Theme.c(getHoverTheme(), false); - } - - if (first) - return customBorderTop != null ? customBorderTop : Theme.c(getIdleTheme(), true); - else - return customBorderBot != null ? customBorderBot : Theme.c(getIdleTheme(), false); - } - - public Key getDisabledTheme() { - return Theme.Key.BUTTON_DISABLE; - } - - public Key getIdleTheme() { - return Theme.Key.BUTTON_IDLE; - } - - public Key getHoverTheme() { - return Theme.Key.BUTTON_HOVER; - } - - public Key getClickTheme() { - return Theme.Key.BUTTON_CLICK; - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/gui/widget/ElementWidget.java b/src/main/java/com/simibubi/create/foundation/gui/widget/ElementWidget.java deleted file mode 100644 index 1642ab0976..0000000000 --- a/src/main/java/com/simibubi/create/foundation/gui/widget/ElementWidget.java +++ /dev/null @@ -1,156 +0,0 @@ -package com.simibubi.create.foundation.gui.widget; - -import java.util.function.Consumer; -import java.util.function.UnaryOperator; - -import javax.annotation.Nonnull; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.foundation.gui.element.RenderElement; -import com.simibubi.create.foundation.gui.element.ScreenElement; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; - -public class ElementWidget extends AbstractSimiWidget { - - protected RenderElement element = RenderElement.EMPTY; - - protected boolean usesFade = false; - protected int fadeModX; - protected int fadeModY; - protected LerpedFloat fade = LerpedFloat.linear().startWithValue(1); - - protected boolean rescaleElement = false; - protected float rescaleSizeX; - protected float rescaleSizeY; - - protected float paddingX = 0; - protected float paddingY = 0; - - public ElementWidget(int x, int y) { - super(x, y); - } - - public ElementWidget(int x, int y, int width, int height) { - super(x, y, width, height); - } - - public T showingElement(RenderElement element) { - this.element = element; - //noinspection unchecked - return (T) this; - } - - public T showing(ScreenElement renderable) { - return this.showingElement(RenderElement.of(renderable)); - } - - public T modifyElement(Consumer consumer) { - if (element != null) - consumer.accept(element); - //noinspection unchecked - return (T) this; - } - - public T mapElement(UnaryOperator function) { - if (element != null) - element = function.apply(element); - //noinspection unchecked - return (T) this; - } - - public T withPadding(float paddingX, float paddingY) { - this.paddingX = paddingX; - this.paddingY = paddingY; - //noinspection unchecked - return (T) this; - } - - public T enableFade(int fadeModifierX, int fadeModifierY) { - this.fade.startWithValue(0); - this.usesFade = true; - this.fadeModX = fadeModifierX; - this.fadeModY = fadeModifierY; - //noinspection unchecked - return (T) this; - } - - public T disableFade() { - this.fade.startWithValue(1); - this.usesFade = false; - //noinspection unchecked - return (T) this; - } - - public LerpedFloat fade() { - return fade; - } - - public T fade(float target) { - fade.chase(target, 0.1, LerpedFloat.Chaser.EXP); - //noinspection unchecked - return (T) this; - } - - /** - * Rescaling and its effects aren't properly tested with most elements. - * Thought it should work fine when using a TextStencilElement. - * Check BaseConfigScreen's title for such an example. - */ - @Deprecated - public T rescaleElement(float rescaleSizeX, float rescaleSizeY) { - this.rescaleElement = true; - this.rescaleSizeX = rescaleSizeX; - this.rescaleSizeY = rescaleSizeY; - //noinspection unchecked - return (T) this; - } - - public T disableRescale() { - this.rescaleElement = false; - //noinspection unchecked - return (T) this; - } - - @Override - public void tick() { - super.tick(); - fade.tickChaser(); - } - - @Override - protected void beforeRender(@Nonnull PoseStack ms, int mouseX, int mouseY, float partialTicks) { - super.beforeRender(ms, mouseX, mouseY, partialTicks); - - float fadeValue = fade.getValue(partialTicks); - element.withAlpha(fadeValue); - if (fadeValue < 1) { - ms.translate((1 - fadeValue) * fadeModX, (1 - fadeValue) * fadeModY, 0); - } - } - - @Override - public void renderButton(@Nonnull PoseStack ms, int mouseX, int mouseY, float partialTicks) { - ms.pushPose(); - ms.translate(x + paddingX, y + paddingY, z); - float innerWidth = width - 2 * paddingX; - float innerHeight = height - 2 * paddingY; - float eX = element.getX(), eY = element.getY(); - if (rescaleElement) { - float xScale = innerWidth / rescaleSizeX; - float yScale = innerHeight / rescaleSizeY; - ms.scale(xScale, yScale, 1); - element.at(eX / xScale, eY / yScale); - innerWidth /= xScale; - innerHeight /= yScale; - } - element.withBounds((int) innerWidth, (int) innerHeight).render(ms); - ms.popPose(); - if (rescaleElement) { - element.at(eX, eY); - } - } - - public RenderElement getRenderElement() { - return element; - } -} diff --git a/src/main/java/com/simibubi/create/foundation/gui/widget/IconButton.java b/src/main/java/com/simibubi/create/foundation/gui/widget/IconButton.java index 366eb41775..1769050beb 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/widget/IconButton.java +++ b/src/main/java/com/simibubi/create/foundation/gui/widget/IconButton.java @@ -5,8 +5,9 @@ import javax.annotation.Nonnull; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.foundation.gui.AllGuiTextures; -import com.simibubi.create.foundation.gui.element.ScreenElement; +import net.createmod.catnip.gui.element.ScreenElement; +import net.createmod.catnip.gui.widget.AbstractSimiWidget; import net.minecraft.network.chat.Component; public class IconButton extends AbstractSimiWidget { @@ -16,7 +17,7 @@ public class IconButton extends AbstractSimiWidget { public IconButton(int x, int y, ScreenElement icon) { this(x, y, 18, 18, icon); } - + public IconButton(int x, int y, int w, int h, ScreenElement icon) { super(x, y, w, h); this.icon = icon; @@ -38,7 +39,7 @@ public class IconButton extends AbstractSimiWidget { protected void drawBg(PoseStack matrixStack, AllGuiTextures button) { AllGuiTextures.BUTTON.bind(); - blit(matrixStack, x, y, button.startX, button.startY, button.width, button.height); + blit(matrixStack, x, y, button.getStartX(), button.getStartY(), button.getWidth(), button.getHeight()); } public void setToolTip(Component text) { diff --git a/src/main/java/com/simibubi/create/foundation/gui/widget/Indicator.java b/src/main/java/com/simibubi/create/foundation/gui/widget/Indicator.java index 4589f9d9bb..fc50f74a50 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/widget/Indicator.java +++ b/src/main/java/com/simibubi/create/foundation/gui/widget/Indicator.java @@ -6,6 +6,7 @@ import com.google.common.collect.ImmutableList; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.foundation.gui.AllGuiTextures; +import net.createmod.catnip.gui.widget.AbstractSimiWidget; import net.minecraft.network.chat.Component; public class Indicator extends AbstractSimiWidget { @@ -13,7 +14,7 @@ public class Indicator extends AbstractSimiWidget { public State state; public Indicator(int x, int y, Component tooltip) { - super(x, y, AllGuiTextures.INDICATOR.width, AllGuiTextures.INDICATOR.height); + super(x, y, AllGuiTextures.INDICATOR.getWidth(), AllGuiTextures.INDICATOR.getHeight()); this.toolTip = ImmutableList.of(tooltip); this.state = State.OFF; } diff --git a/src/main/java/com/simibubi/create/foundation/gui/widget/Label.java b/src/main/java/com/simibubi/create/foundation/gui/widget/Label.java index 414f5ab5b7..d047a740be 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/widget/Label.java +++ b/src/main/java/com/simibubi/create/foundation/gui/widget/Label.java @@ -5,6 +5,7 @@ import javax.annotation.Nonnull; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; +import net.createmod.catnip.gui.widget.AbstractSimiWidget; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; import net.minecraft.network.chat.Component; @@ -45,12 +46,12 @@ public class Label extends AbstractSimiWidget { public void setTextAndTrim(Component newText, boolean trimFront, int maxWidthPx) { Font fontRenderer = Minecraft.getInstance().font; - + if (fontRenderer.width(newText) <= maxWidthPx) { text = newText; return; } - + String trim = "..."; int trimWidth = fontRenderer.width(trim); @@ -79,7 +80,7 @@ public class Label extends AbstractSimiWidget { MutableComponent copy = text.plainCopy(); if (suffix != null && !suffix.isEmpty()) copy.append(suffix); - + if (hasShadow) font.drawShadow(matrixStack, copy, x, y, color); else diff --git a/src/main/java/com/simibubi/create/foundation/gui/widget/ScrollInput.java b/src/main/java/com/simibubi/create/foundation/gui/widget/ScrollInput.java index 337729b27a..df2ad074cd 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/widget/ScrollInput.java +++ b/src/main/java/com/simibubi/create/foundation/gui/widget/ScrollInput.java @@ -5,8 +5,9 @@ import java.util.function.Function; import com.simibubi.create.AllKeys; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollValueBehaviour.StepContext; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.gui.widget.AbstractSimiWidget; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; @@ -16,9 +17,9 @@ public class ScrollInput extends AbstractSimiWidget { protected Consumer onScroll; protected int state; - protected Component title = Lang.translateDirect("gui.scrollInput.defaultTitle"); - protected final Component scrollToModify = Lang.translateDirect("gui.scrollInput.scrollToModify"); - protected final Component shiftScrollsFaster = Lang.translateDirect("gui.scrollInput.shiftScrollsFaster"); + protected Component title = CreateLang.translateDirect("gui.scrollInput.defaultTitle"); + protected final Component scrollToModify = CreateLang.translateDirect("gui.scrollInput.scrollToModify"); + protected final Component shiftScrollsFaster = CreateLang.translateDirect("gui.scrollInput.shiftScrollsFaster"); protected Label displayLabel; protected boolean inverted; protected Function formatter; diff --git a/src/main/java/com/simibubi/create/foundation/gui/widget/SelectionScrollInput.java b/src/main/java/com/simibubi/create/foundation/gui/widget/SelectionScrollInput.java index 1a570d4462..16b2566d3c 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/widget/SelectionScrollInput.java +++ b/src/main/java/com/simibubi/create/foundation/gui/widget/SelectionScrollInput.java @@ -3,7 +3,7 @@ package com.simibubi.create.foundation.gui.widget; import java.util.ArrayList; import java.util.List; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; @@ -12,7 +12,7 @@ import net.minecraft.network.chat.TextComponent; public class SelectionScrollInput extends ScrollInput { - private final MutableComponent scrollToSelect = Lang.translateDirect("gui.scrollInput.scrollToSelect"); + private final MutableComponent scrollToSelect = CreateLang.translateDirect("gui.scrollInput.scrollToSelect"); protected List options; public SelectionScrollInput(int xIn, int yIn, int widthIn, int heightIn) { diff --git a/src/main/java/com/simibubi/create/foundation/gui/widget/TooltipArea.java b/src/main/java/com/simibubi/create/foundation/gui/widget/TooltipArea.java index db256b4a45..c566017ac7 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/widget/TooltipArea.java +++ b/src/main/java/com/simibubi/create/foundation/gui/widget/TooltipArea.java @@ -4,6 +4,7 @@ import java.util.List; import com.mojang.blaze3d.vertex.PoseStack; +import net.createmod.catnip.gui.widget.AbstractSimiWidget; import net.minecraft.network.chat.Component; public class TooltipArea extends AbstractSimiWidget { diff --git a/src/main/java/com/simibubi/create/foundation/item/CountedItemStackList.java b/src/main/java/com/simibubi/create/foundation/item/CountedItemStackList.java index 2b964a7c6d..9da37a03d7 100644 --- a/src/main/java/com/simibubi/create/foundation/item/CountedItemStackList.java +++ b/src/main/java/com/simibubi/create/foundation/item/CountedItemStackList.java @@ -8,7 +8,7 @@ import java.util.Set; import java.util.stream.Stream; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; -import com.simibubi.create.foundation.utility.IntAttached; +import net.createmod.catnip.utility.IntAttached; import net.minecraft.network.chat.MutableComponent; import net.minecraft.world.item.Item; diff --git a/src/main/java/com/simibubi/create/foundation/item/ItemDescription.java b/src/main/java/com/simibubi/create/foundation/item/ItemDescription.java index 3f0be8ba23..a7bf0fe344 100644 --- a/src/main/java/com/simibubi/create/foundation/item/ItemDescription.java +++ b/src/main/java/com/simibubi/create/foundation/item/ItemDescription.java @@ -1,7 +1,7 @@ package com.simibubi.create.foundation.item; -import static com.simibubi.create.foundation.item.TooltipHelper.cutStringTextComponent; -import static com.simibubi.create.foundation.item.TooltipHelper.cutTextComponent; +import static net.createmod.catnip.utility.FontHelper.cutStringTextComponent; +import static net.createmod.catnip.utility.FontHelper.cutTextComponent; import static net.minecraft.ChatFormatting.AQUA; import static net.minecraft.ChatFormatting.BLUE; import static net.minecraft.ChatFormatting.DARK_GRAY; @@ -27,10 +27,11 @@ import com.simibubi.create.content.contraptions.goggles.GogglesItem; import com.simibubi.create.foundation.block.BlockStressValues; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.config.CKinetics; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.LangBuilder; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.lang.Lang; +import net.createmod.catnip.utility.lang.LangBuilder; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.Screen; @@ -85,8 +86,8 @@ public class ItemDescription { List list = new ArrayList<>(); CKinetics config = AllConfigs.SERVER.kinetics; - LangBuilder rpmUnit = Lang.translate("generic.unit.rpm"); - LangBuilder suUnit = Lang.translate("generic.unit.stress"); + LangBuilder rpmUnit = CreateLang.translate("generic.unit.rpm"); + LangBuilder suUnit = CreateLang.translate("generic.unit.stress"); boolean hasGoggles = GogglesItem.isWearingGoggles(Minecraft.getInstance().player); @@ -102,19 +103,19 @@ public class ItemDescription { boolean hasStressCapacity = StressImpact.isEnabled() && BlockStressValues.hasCapacity(block); if (hasStressImpact) { - Lang.translate("tooltip.stressImpact") + CreateLang.translate("tooltip.stressImpact") .style(GRAY) .addTo(list); double impact = BlockStressValues.getImpact(block); StressImpact impactId = impact >= config.highStressImpact.get() ? StressImpact.HIGH : (impact >= config.mediumStressImpact.get() ? StressImpact.MEDIUM : StressImpact.LOW); - LangBuilder builder = Lang.builder() - .add(Lang.text(makeProgressBar(3, impactId.ordinal() + 1)) + LangBuilder builder = CreateLang.builder() + .add(CreateLang.text(makeProgressBar(3, impactId.ordinal() + 1)) .style(impactId.getAbsoluteColor())); if (hasGoggles) { - builder.add(Lang.number(impact)) + builder.add(CreateLang.number(impact)) .text("x ") .add(rpmUnit) .addTo(list); @@ -124,7 +125,7 @@ public class ItemDescription { } if (hasStressCapacity) { - Lang.translate("tooltip.capacityProvided") + CreateLang.translate("tooltip.capacityProvided") .style(GRAY) .addTo(list); @@ -137,22 +138,22 @@ public class ItemDescription { StressImpact impactId = capacity >= config.highCapacity.get() ? StressImpact.HIGH : (capacity >= config.mediumCapacity.get() ? StressImpact.MEDIUM : StressImpact.LOW); StressImpact opposite = StressImpact.values()[StressImpact.values().length - 2 - impactId.ordinal()]; - LangBuilder builder = Lang.builder() - .add(Lang.text(makeProgressBar(3, impactId.ordinal() + 1)) + LangBuilder builder = CreateLang.builder() + .add(CreateLang.text(makeProgressBar(3, impactId.ordinal() + 1)) .style(opposite.getAbsoluteColor())); if (hasGoggles) { - builder.add(Lang.number(capacity)) + builder.add(CreateLang.number(capacity)) .text("x ") .add(rpmUnit) .addTo(list); if (generatedRPM != null) { - LangBuilder amount = Lang.number(capacity * generatedRPM.getSecond()) + LangBuilder amount = CreateLang.number(capacity * generatedRPM.getSecond()) .add(suUnit); - Lang.text(" -> ") + CreateLang.text(" -> ") .add(!generatedRPM.getFirst() - .equals(generatedRPM.getSecond()) ? Lang.translate("tooltip.up_to", amount) : amount) + .equals(generatedRPM.getSecond()) ? CreateLang.translate("tooltip.up_to", amount) : amount) .style(DARK_GRAY) .addTo(list); } @@ -191,14 +192,14 @@ public class ItemDescription { boolean hasControls = !linesOnCtrl.isEmpty(); if (hasDescription || hasControls) { - String[] holdDesc = Lang.translateDirect("tooltip.holdForDescription", "$") + String[] holdDesc = CreateLang.translateDirect("tooltip.holdForDescription", "$") .getString() .split("\\$"); - String[] holdCtrl = Lang.translateDirect("tooltip.holdForControls", "$") + String[] holdCtrl = CreateLang.translateDirect("tooltip.holdForControls", "$") .getString() .split("\\$"); - MutableComponent keyShift = Lang.translateDirect("tooltip.keyShift"); - MutableComponent keyCtrl = Lang.translateDirect("tooltip.keyCtrl"); + MutableComponent keyShift = CreateLang.translateDirect("tooltip.keyShift"); + MutableComponent keyCtrl = CreateLang.translateDirect("tooltip.keyCtrl"); for (List list : Arrays.asList(lines, linesOnShift, linesOnCtrl)) { boolean shift = list == linesOnShift; boolean ctrl = list == linesOnCtrl; diff --git a/src/main/java/com/simibubi/create/foundation/item/ItemHelper.java b/src/main/java/com/simibubi/create/foundation/item/ItemHelper.java index b2a454fb8f..aab5514a9b 100644 --- a/src/main/java/com/simibubi/create/foundation/item/ItemHelper.java +++ b/src/main/java/com/simibubi/create/foundation/item/ItemHelper.java @@ -10,8 +10,8 @@ import javax.annotation.Nullable; import org.apache.commons.lang3.mutable.MutableInt; import com.simibubi.create.foundation.config.AllConfigs; -import com.simibubi.create.foundation.utility.Pair; +import net.createmod.catnip.utility.Pair; import net.minecraft.core.BlockPos; import net.minecraft.core.NonNullList; import net.minecraft.util.Mth; diff --git a/src/main/java/com/simibubi/create/foundation/item/TooltipHelper.java b/src/main/java/com/simibubi/create/foundation/item/TooltipHelper.java index bccd617619..8d012bdc43 100644 --- a/src/main/java/com/simibubi/create/foundation/item/TooltipHelper.java +++ b/src/main/java/com/simibubi/create/foundation/item/TooltipHelper.java @@ -1,26 +1,20 @@ package com.simibubi.create.foundation.item; -import java.text.BreakIterator; -import java.util.ArrayList; import java.util.HashMap; -import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.function.Supplier; -import com.google.common.base.Strings; import com.mojang.bridge.game.Language; import com.simibubi.create.content.AllSections; import com.simibubi.create.content.contraptions.goggles.GogglesItem; import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation; import com.simibubi.create.foundation.item.ItemDescription.Palette; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.FontHelper; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.FontHelper; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.Font; import net.minecraft.client.resources.language.I18n; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; @@ -29,18 +23,16 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.ItemLike; -import net.minecraftforge.client.MinecraftForgeClient; public class TooltipHelper { - public static final int maxWidthPerLine = 200; public static final Map cachedTooltips = new HashMap<>(); public static Language cachedLanguage; private static boolean gogglesMode; private static final Map> tooltipReferrals = new HashMap<>(); public static MutableComponent holdShift(Palette color, boolean highlighted) { - return Lang.translateDirect("tooltip.holdForDescription", Lang.translateDirect("tooltip.keyShift") + return CreateLang.translateDirect("tooltip.holdForDescription", CreateLang.translateDirect("tooltip.keyShift") .withStyle(ChatFormatting.GRAY)) .withStyle(ChatFormatting.DARK_GRAY); } @@ -48,10 +40,10 @@ public class TooltipHelper { public static void addHint(List tooltip, String hintKey, Object... messageParams) { Component spacing = IHaveGoggleInformation.componentSpacing; tooltip.add(spacing.plainCopy() - .append(Lang.translateDirect(hintKey + ".title")) + .append(CreateLang.translateDirect(hintKey + ".title")) .withStyle(ChatFormatting.GOLD)); - Component hint = Lang.translateDirect(hintKey); - List cutComponent = TooltipHelper.cutTextComponent(hint, ChatFormatting.GRAY, ChatFormatting.WHITE); + Component hint = CreateLang.translateDirect(hintKey); + List cutComponent = FontHelper.cutTextComponent(hint, ChatFormatting.GRAY, ChatFormatting.WHITE); for (Component component : cutComponent) tooltip.add(spacing.plainCopy() .append(component)); @@ -67,122 +59,7 @@ public class TooltipHelper { tooltipReferrals.put(item.asItem(), () -> string); } - @Deprecated - public static List cutString(Component s, ChatFormatting defaultColor, ChatFormatting highlightColor) { - return cutString(s.getContents(), defaultColor, highlightColor, 0); - } - - @Deprecated - public static List cutString(String s, ChatFormatting defaultColor, ChatFormatting highlightColor, - int indent) { - // Apply markup - String markedUp = s.replaceAll("_([^_]+)_", highlightColor + "$1" + defaultColor); - - // Split words - List words = new LinkedList<>(); - BreakIterator iterator = BreakIterator.getLineInstance(MinecraftForgeClient.getLocale()); - iterator.setText(markedUp); - int start = iterator.first(); - for (int end = iterator.next(); end != BreakIterator.DONE; start = end, end = iterator.next()) { - String word = markedUp.substring(start, end); - words.add(word); - } - - Font font = Minecraft.getInstance().font; - List lines = FontHelper.cutString(font, markedUp, maxWidthPerLine); - - // Format - String lineStart = Strings.repeat(" ", indent); - List formattedLines = new ArrayList<>(lines.size()); - String format = defaultColor.toString(); - for (String line : lines) { - String formattedLine = format + lineStart + line; - formattedLines.add(formattedLine); -// format = TextFormatting.getFormatString(formattedLine); - } - return formattedLines; - } - - public static List cutStringTextComponent(String c, ChatFormatting defaultColor, - ChatFormatting highlightColor) { - return cutTextComponent(new TextComponent(c), defaultColor, highlightColor, 0); - } - - public static List cutTextComponent(Component c, ChatFormatting defaultColor, - ChatFormatting highlightColor) { - return cutTextComponent(c, defaultColor, highlightColor, 0); - } - - public static List cutStringTextComponent(String c, ChatFormatting defaultColor, - ChatFormatting highlightColor, int indent) { - return cutTextComponent(new TextComponent(c), defaultColor, highlightColor, indent); - } - - public static List cutTextComponent(Component c, ChatFormatting defaultColor, - ChatFormatting highlightColor, int indent) { - String s = c.getString(); - - // Apply markup - String markedUp = s;// .replaceAll("_([^_]+)_", highlightColor + "$1" + defaultColor); - - // Split words - List words = new LinkedList<>(); - BreakIterator iterator = BreakIterator.getLineInstance(MinecraftForgeClient.getLocale()); - iterator.setText(markedUp); - int start = iterator.first(); - for (int end = iterator.next(); end != BreakIterator.DONE; start = end, end = iterator.next()) { - String word = markedUp.substring(start, end); - words.add(word); - } - - // Apply hard wrap - Font font = Minecraft.getInstance().font; - List lines = new LinkedList<>(); - StringBuilder currentLine = new StringBuilder(); - int width = 0; - for (String word : words) { - int newWidth = font.width(word.replaceAll("_", "")); - if (width + newWidth > maxWidthPerLine) { - if (width > 0) { - String line = currentLine.toString(); - lines.add(line); - currentLine = new StringBuilder(); - width = 0; - } else { - lines.add(word); - continue; - } - } - currentLine.append(word); - width += newWidth; - } - if (width > 0) { - lines.add(currentLine.toString()); - } - - // Format - MutableComponent lineStart = new TextComponent(Strings.repeat(" ", indent)); - lineStart.withStyle(defaultColor); - List formattedLines = new ArrayList<>(lines.size()); - Couple f = Couple.create(highlightColor, defaultColor); - - boolean currentlyHighlighted = false; - for (String string : lines) { - MutableComponent currentComponent = lineStart.plainCopy(); - String[] split = string.split("_"); - for (String part : split) { - currentComponent.append(new TextComponent(part).withStyle(f.get(currentlyHighlighted))); - currentlyHighlighted = !currentlyHighlighted; - } - - formattedLines.add(currentComponent); - currentlyHighlighted = !currentlyHighlighted; - } - - return formattedLines; - } - -// public static List cutTextComponentOld(ITextComponent c, TextFormatting defaultColor, + // public static List cutTextComponentOld(ITextComponent c, TextFormatting defaultColor, // TextFormatting highlightColor, int indent) { // IFormattableTextComponent lineStart = StringTextComponent.EMPTY.copy(); // for (int i = 0; i < indent; i++) diff --git a/src/main/java/com/simibubi/create/foundation/item/render/PartialItemModelRenderer.java b/src/main/java/com/simibubi/create/foundation/item/render/PartialItemModelRenderer.java index 2b3e8a104a..230905b404 100644 --- a/src/main/java/com/simibubi/create/foundation/item/render/PartialItemModelRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/item/render/PartialItemModelRenderer.java @@ -5,8 +5,8 @@ import java.util.Random; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.simibubi.create.foundation.render.RenderTypes; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Iterate; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; diff --git a/src/main/java/com/simibubi/create/foundation/mixin/CameraMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/CameraMixin.java index 89c792ba67..0347255680 100644 --- a/src/main/java/com/simibubi/create/foundation/mixin/CameraMixin.java +++ b/src/main/java/com/simibubi/create/foundation/mixin/CameraMixin.java @@ -7,8 +7,8 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import com.simibubi.create.content.logistics.trains.CameraDistanceModifier; -import com.simibubi.create.foundation.utility.AnimationTickHolder; +import net.createmod.catnip.utility.AnimationTickHolder; import net.minecraft.client.Camera; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.BlockGetter; diff --git a/src/main/java/com/simibubi/create/foundation/mixin/ModelDataRefreshMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/ModelDataRefreshMixin.java index 8814dacffe..e37d392894 100644 --- a/src/main/java/com/simibubi/create/foundation/mixin/ModelDataRefreshMixin.java +++ b/src/main/java/com/simibubi/create/foundation/mixin/ModelDataRefreshMixin.java @@ -5,8 +5,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import com.simibubi.create.content.schematics.SchematicWorld; - +import net.createmod.catnip.utility.worldWrappers.SchematicWorld; import net.minecraft.client.Minecraft; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; diff --git a/src/main/java/com/simibubi/create/foundation/mixin/WindowResizeMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/WindowResizeMixin.java deleted file mode 100644 index 515cfea40e..0000000000 --- a/src/main/java/com/simibubi/create/foundation/mixin/WindowResizeMixin.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.simibubi.create.foundation.mixin; - -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import com.mojang.blaze3d.platform.Window; -import com.simibubi.create.foundation.gui.UIRenderHelper; - -import net.minecraft.client.Minecraft; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; - -@OnlyIn(Dist.CLIENT) -@Mixin(Minecraft.class) -public class WindowResizeMixin { - - @Shadow @Final private Window window; - - @Inject(at = @At("TAIL"), method = "resizeDisplay") - private void updateWindowSize(CallbackInfo ci) { - UIRenderHelper.updateWindowSize(window); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/mixin/accessor/GameRendererAccessor.java b/src/main/java/com/simibubi/create/foundation/mixin/accessor/GameRendererAccessor.java deleted file mode 100644 index 0fb4fafe28..0000000000 --- a/src/main/java/com/simibubi/create/foundation/mixin/accessor/GameRendererAccessor.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.simibubi.create.foundation.mixin.accessor; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Invoker; - -import net.minecraft.client.Camera; -import net.minecraft.client.renderer.GameRenderer; - -@Mixin(GameRenderer.class) -public interface GameRendererAccessor { - @Invoker("getFov") - double create$callGetFov(Camera camera, float partialTicks, boolean useFOVSetting); -} diff --git a/src/main/java/com/simibubi/create/foundation/mixin/accessor/ParticleEngineAccessor.java b/src/main/java/com/simibubi/create/foundation/mixin/accessor/ParticleEngineAccessor.java deleted file mode 100644 index 049cb8fc37..0000000000 --- a/src/main/java/com/simibubi/create/foundation/mixin/accessor/ParticleEngineAccessor.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.simibubi.create.foundation.mixin.accessor; - -import java.util.Map; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import net.minecraft.client.particle.ParticleEngine; -import net.minecraft.client.particle.ParticleProvider; -import net.minecraft.resources.ResourceLocation; - -@Mixin(ParticleEngine.class) -public interface ParticleEngineAccessor { - // This field cannot be ATed because its type is patched by Forge - @Accessor("providers") - Map> create$getProviders(); -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java b/src/main/java/com/simibubi/create/foundation/ponder/CreatePonderIndex.java similarity index 76% rename from src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java rename to src/main/java/com/simibubi/create/foundation/ponder/CreatePonderIndex.java index ed44673e80..bddb277f23 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/CreatePonderIndex.java @@ -1,12 +1,34 @@ -package com.simibubi.create.foundation.ponder.content; +package com.simibubi.create.foundation.ponder; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.Create; -import com.simibubi.create.foundation.config.AllConfigs; -import com.simibubi.create.foundation.ponder.PonderRegistrationHelper; -import com.simibubi.create.foundation.ponder.PonderRegistry; -import com.simibubi.create.foundation.ponder.PonderTag; +import com.simibubi.create.foundation.ponder.content.ArmScenes; +import com.simibubi.create.foundation.ponder.content.BearingScenes; +import com.simibubi.create.foundation.ponder.content.BeltScenes; +import com.simibubi.create.foundation.ponder.content.CartAssemblerScenes; +import com.simibubi.create.foundation.ponder.content.ChainDriveScenes; +import com.simibubi.create.foundation.ponder.content.ChassisScenes; +import com.simibubi.create.foundation.ponder.content.ChuteScenes; +import com.simibubi.create.foundation.ponder.content.CrafterScenes; +import com.simibubi.create.foundation.ponder.content.DeployerScenes; +import com.simibubi.create.foundation.ponder.content.DisplayScenes; +import com.simibubi.create.foundation.ponder.content.EjectorScenes; +import com.simibubi.create.foundation.ponder.content.FanScenes; +import com.simibubi.create.foundation.ponder.content.FunnelScenes; +import com.simibubi.create.foundation.ponder.content.GantryScenes; +import com.simibubi.create.foundation.ponder.content.ItemVaultScenes; +import com.simibubi.create.foundation.ponder.content.KineticsScenes; +import com.simibubi.create.foundation.ponder.content.MechanicalDrillScenes; +import com.simibubi.create.foundation.ponder.content.MechanicalSawScenes; +import com.simibubi.create.foundation.ponder.content.MovementActorScenes; +import com.simibubi.create.foundation.ponder.content.PistonScenes; +import com.simibubi.create.foundation.ponder.content.ProcessingScenes; +import com.simibubi.create.foundation.ponder.content.PulleyScenes; +import com.simibubi.create.foundation.ponder.content.RedstoneScenes; +import com.simibubi.create.foundation.ponder.content.RedstoneScenes2; +import com.simibubi.create.foundation.ponder.content.SteamScenes; +import com.simibubi.create.foundation.ponder.content.TunnelScenes; import com.simibubi.create.foundation.ponder.content.fluid.DrainScenes; import com.simibubi.create.foundation.ponder.content.fluid.FluidMovementActorScenes; import com.simibubi.create.foundation.ponder.content.fluid.FluidTankScenes; @@ -19,13 +41,17 @@ import com.simibubi.create.foundation.ponder.content.trains.TrackScenes; 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.ItemProviderEntry; +import com.tterrag.registrate.util.entry.RegistryEntry; +import net.createmod.ponder.foundation.CustomPonderRegistrationHelper; +import net.createmod.ponder.foundation.content.DebugScenes; import net.minecraft.world.item.DyeColor; import net.minecraft.world.level.block.Blocks; -public class PonderIndex { +public class CreatePonderIndex { - static final PonderRegistrationHelper HELPER = new PonderRegistrationHelper(Create.ID); + private static final CustomPonderRegistrationHelper> HELPER = new CustomPonderRegistrationHelper<>(Create.ID, RegistryEntry::getId); public static final boolean REGISTER_DEBUG_SCENES = false; @@ -35,24 +61,24 @@ public class PonderIndex { // (!) Modifications inside storyboard methods only require re-opening the ui HELPER.forComponents(AllBlocks.SHAFT) - .addStoryBoard("shaft/relay", KineticsScenes::shaftAsRelay, PonderTag.KINETIC_RELAYS); + .addStoryBoard("shaft/relay", KineticsScenes::shaftAsRelay, CreatePonderTag.KINETIC_RELAYS); HELPER.forComponents(AllBlocks.SHAFT, AllBlocks.ANDESITE_ENCASED_SHAFT, AllBlocks.BRASS_ENCASED_SHAFT) .addStoryBoard("shaft/encasing", KineticsScenes::shaftsCanBeEncased); HELPER.forComponents(AllBlocks.COGWHEEL) - .addStoryBoard("cog/small", KineticsScenes::cogAsRelay, PonderTag.KINETIC_RELAYS) + .addStoryBoard("cog/small", KineticsScenes::cogAsRelay, CreatePonderTag.KINETIC_RELAYS) .addStoryBoard("cog/speedup", KineticsScenes::cogsSpeedUp) .addStoryBoard("cog/encasing", KineticsScenes::cogwheelsCanBeEncased); HELPER.forComponents(AllBlocks.LARGE_COGWHEEL) .addStoryBoard("cog/speedup", KineticsScenes::cogsSpeedUp) - .addStoryBoard("cog/large", KineticsScenes::largeCogAsRelay, PonderTag.KINETIC_RELAYS) + .addStoryBoard("cog/large", KineticsScenes::largeCogAsRelay, CreatePonderTag.KINETIC_RELAYS) .addStoryBoard("cog/encasing", KineticsScenes::cogwheelsCanBeEncased); HELPER.forComponents(AllItems.BELT_CONNECTOR) - .addStoryBoard("belt/connect", BeltScenes::beltConnector, PonderTag.KINETIC_RELAYS) + .addStoryBoard("belt/connect", BeltScenes::beltConnector, CreatePonderTag.KINETIC_RELAYS) .addStoryBoard("belt/directions", BeltScenes::directions) - .addStoryBoard("belt/transport", BeltScenes::transport, PonderTag.LOGISTICS) + .addStoryBoard("belt/transport", BeltScenes::transport, CreatePonderTag.LOGISTICS) .addStoryBoard("belt/encasing", BeltScenes::beltsCanBeEncased); HELPER.forComponents(AllBlocks.ANDESITE_CASING, AllBlocks.BRASS_CASING) @@ -60,32 +86,32 @@ public class PonderIndex { .addStoryBoard("belt/encasing", BeltScenes::beltsCanBeEncased); HELPER.forComponents(AllBlocks.GEARBOX, AllItems.VERTICAL_GEARBOX) - .addStoryBoard("gearbox", KineticsScenes::gearbox, PonderTag.KINETIC_RELAYS); + .addStoryBoard("gearbox", KineticsScenes::gearbox, CreatePonderTag.KINETIC_RELAYS); - HELPER.addStoryBoard(AllBlocks.CLUTCH, "clutch", KineticsScenes::clutch, PonderTag.KINETIC_RELAYS); - HELPER.addStoryBoard(AllBlocks.GEARSHIFT, "gearshift", KineticsScenes::gearshift, PonderTag.KINETIC_RELAYS); + HELPER.addStoryBoard(AllBlocks.CLUTCH, "clutch", KineticsScenes::clutch, CreatePonderTag.KINETIC_RELAYS); + HELPER.addStoryBoard(AllBlocks.GEARSHIFT, "gearshift", KineticsScenes::gearshift, CreatePonderTag.KINETIC_RELAYS); HELPER.forComponents(AllBlocks.SEQUENCED_GEARSHIFT) .addStoryBoard("sequenced_gearshift", KineticsScenes::sequencedGearshift); HELPER.forComponents(AllBlocks.ENCASED_FAN) - .addStoryBoard("fan/direction", FanScenes::direction, PonderTag.KINETIC_APPLIANCES) + .addStoryBoard("fan/direction", FanScenes::direction, CreatePonderTag.KINETIC_APPLIANCES) .addStoryBoard("fan/processing", FanScenes::processing); HELPER.forComponents(AllBlocks.CREATIVE_MOTOR) - .addStoryBoard("creative_motor", KineticsScenes::creativeMotor, PonderTag.KINETIC_SOURCES) + .addStoryBoard("creative_motor", KineticsScenes::creativeMotor, CreatePonderTag.KINETIC_SOURCES) .addStoryBoard("creative_motor_mojang", KineticsScenes::creativeMotorMojang); HELPER.addStoryBoard(AllBlocks.WATER_WHEEL, "water_wheel", KineticsScenes::waterWheel, - PonderTag.KINETIC_SOURCES); - HELPER.addStoryBoard(AllBlocks.HAND_CRANK, "hand_crank", KineticsScenes::handCrank, PonderTag.KINETIC_SOURCES); + CreatePonderTag.KINETIC_SOURCES); + HELPER.addStoryBoard(AllBlocks.HAND_CRANK, "hand_crank", KineticsScenes::handCrank, CreatePonderTag.KINETIC_SOURCES); HELPER.addStoryBoard(AllBlocks.COPPER_VALVE_HANDLE, "valve_handle", KineticsScenes::valveHandle, - PonderTag.KINETIC_SOURCES); + CreatePonderTag.KINETIC_SOURCES); HELPER.forComponents(AllBlocks.DYED_VALVE_HANDLES.toArray()) .addStoryBoard("valve_handle", KineticsScenes::valveHandle); HELPER.addStoryBoard(AllBlocks.ENCASED_CHAIN_DRIVE, "chain_drive/relay", ChainDriveScenes::chainDriveAsRelay, - PonderTag.KINETIC_RELAYS); + CreatePonderTag.KINETIC_RELAYS); HELPER.forComponents(AllBlocks.ENCASED_CHAIN_DRIVE, AllBlocks.ADJUSTABLE_CHAIN_GEARSHIFT) .addStoryBoard("chain_drive/gearshift", ChainDriveScenes::adjustableChainGearshift); @@ -124,12 +150,12 @@ public class PonderIndex { // Vaults HELPER.forComponents(AllBlocks.ITEM_VAULT) - .addStoryBoard("item_vault/storage", ItemVaultScenes::storage, PonderTag.LOGISTICS) + .addStoryBoard("item_vault/storage", ItemVaultScenes::storage, CreatePonderTag.LOGISTICS) .addStoryBoard("item_vault/sizes", ItemVaultScenes::sizes); // Chutes HELPER.forComponents(AllBlocks.CHUTE) - .addStoryBoard("chute/downward", ChuteScenes::downward, PonderTag.LOGISTICS) + .addStoryBoard("chute/downward", ChuteScenes::downward, CreatePonderTag.LOGISTICS) .addStoryBoard("chute/upward", ChuteScenes::upward); HELPER.forComponents(AllBlocks.CHUTE, AllBlocks.SMART_CHUTE) .addStoryBoard("chute/smart", ChuteScenes::smart); @@ -137,7 +163,7 @@ public class PonderIndex { // Funnels HELPER.addStoryBoard(AllBlocks.BRASS_FUNNEL, "funnels/brass", FunnelScenes::brass); HELPER.forComponents(AllBlocks.ANDESITE_FUNNEL, AllBlocks.BRASS_FUNNEL) - .addStoryBoard("funnels/intro", FunnelScenes::intro, PonderTag.LOGISTICS) + .addStoryBoard("funnels/intro", FunnelScenes::intro, CreatePonderTag.LOGISTICS) .addStoryBoard("funnels/direction", FunnelScenes::directionality) .addStoryBoard("funnels/compat", FunnelScenes::compat) .addStoryBoard("funnels/redstone", FunnelScenes::redstone) @@ -152,26 +178,26 @@ public class PonderIndex { // Chassis & Super Glue HELPER.forComponents(AllBlocks.LINEAR_CHASSIS, AllBlocks.SECONDARY_LINEAR_CHASSIS) - .addStoryBoard("chassis/linear_group", ChassisScenes::linearGroup, PonderTag.CONTRAPTION_ASSEMBLY) + .addStoryBoard("chassis/linear_group", ChassisScenes::linearGroup, CreatePonderTag.CONTRAPTION_ASSEMBLY) .addStoryBoard("chassis/linear_attachment", ChassisScenes::linearAttachement); HELPER.forComponents(AllBlocks.RADIAL_CHASSIS) - .addStoryBoard("chassis/radial", ChassisScenes::radial, PonderTag.CONTRAPTION_ASSEMBLY); + .addStoryBoard("chassis/radial", ChassisScenes::radial, CreatePonderTag.CONTRAPTION_ASSEMBLY); HELPER.forComponents(AllItems.SUPER_GLUE) - .addStoryBoard("super_glue", ChassisScenes::superGlue, PonderTag.CONTRAPTION_ASSEMBLY); + .addStoryBoard("super_glue", ChassisScenes::superGlue, CreatePonderTag.CONTRAPTION_ASSEMBLY); HELPER.forComponents(AllBlocks.STICKER) - .addStoryBoard("sticker", RedstoneScenes::sticker, PonderTag.CONTRAPTION_ASSEMBLY); + .addStoryBoard("sticker", RedstoneScenes::sticker, CreatePonderTag.CONTRAPTION_ASSEMBLY); // Mechanical Arm HELPER.forComponents(AllBlocks.MECHANICAL_ARM) - .addStoryBoard("mechanical_arm/setup", ArmScenes::setup, PonderTag.ARM_TARGETS) + .addStoryBoard("mechanical_arm/setup", ArmScenes::setup, CreatePonderTag.ARM_TARGETS) .addStoryBoard("mechanical_arm/filter", ArmScenes::filtering) .addStoryBoard("mechanical_arm/modes", ArmScenes::modes) .addStoryBoard("mechanical_arm/redstone", ArmScenes::redstone); // Mechanical Piston HELPER.forComponents(AllBlocks.MECHANICAL_PISTON, AllBlocks.STICKY_MECHANICAL_PISTON) - .addStoryBoard("mechanical_piston/anchor", PistonScenes::movement, PonderTag.KINETIC_APPLIANCES, - PonderTag.MOVEMENT_ANCHOR); + .addStoryBoard("mechanical_piston/anchor", PistonScenes::movement, CreatePonderTag.KINETIC_APPLIANCES, + CreatePonderTag.MOVEMENT_ANCHOR); HELPER .forComponents(AllBlocks.MECHANICAL_PISTON, AllBlocks.STICKY_MECHANICAL_PISTON, AllBlocks.PISTON_EXTENSION_POLE) @@ -181,16 +207,16 @@ public class PonderIndex { // Windmill Bearing HELPER.forComponents(AllBlocks.ROPE_PULLEY) - .addStoryBoard("rope_pulley/anchor", PulleyScenes::movement, PonderTag.KINETIC_APPLIANCES, - PonderTag.MOVEMENT_ANCHOR) + .addStoryBoard("rope_pulley/anchor", PulleyScenes::movement, CreatePonderTag.KINETIC_APPLIANCES, + CreatePonderTag.MOVEMENT_ANCHOR) .addStoryBoard("rope_pulley/modes", PulleyScenes::movementModes) .addStoryBoard("rope_pulley/attachment", PulleyScenes::attachment); // Windmill Bearing HELPER.forComponents(AllBlocks.WINDMILL_BEARING) - .addStoryBoard("windmill_bearing/source", BearingScenes::windmillsAsSource, PonderTag.KINETIC_SOURCES) + .addStoryBoard("windmill_bearing/source", BearingScenes::windmillsAsSource, CreatePonderTag.KINETIC_SOURCES) .addStoryBoard("windmill_bearing/structure", BearingScenes::windmillsAnyStructure, - PonderTag.MOVEMENT_ANCHOR); + CreatePonderTag.MOVEMENT_ANCHOR); HELPER.forComponents(AllBlocks.SAIL) .addStoryBoard("sail", BearingScenes::sail); HELPER.forComponents(AllBlocks.SAIL_FRAME) @@ -198,21 +224,21 @@ public class PonderIndex { // Mechanical Bearing HELPER.forComponents(AllBlocks.MECHANICAL_BEARING) - .addStoryBoard("mechanical_bearing/anchor", BearingScenes::mechanicalBearing, PonderTag.KINETIC_APPLIANCES, - PonderTag.MOVEMENT_ANCHOR) + .addStoryBoard("mechanical_bearing/anchor", BearingScenes::mechanicalBearing, CreatePonderTag.KINETIC_APPLIANCES, + CreatePonderTag.MOVEMENT_ANCHOR) .addStoryBoard("mechanical_bearing/modes", BearingScenes::bearingModes) .addStoryBoard("mechanical_bearing/stabilized", BearingScenes::stabilizedBearings, - PonderTag.CONTRAPTION_ACTOR); + CreatePonderTag.CONTRAPTION_ACTOR); // Clockwork Bearing HELPER.addStoryBoard(AllBlocks.CLOCKWORK_BEARING, "clockwork_bearing", BearingScenes::clockwork, - PonderTag.KINETIC_APPLIANCES, PonderTag.MOVEMENT_ANCHOR); + CreatePonderTag.KINETIC_APPLIANCES, CreatePonderTag.MOVEMENT_ANCHOR); // Gantries HELPER.addStoryBoard(AllBlocks.GANTRY_SHAFT, "gantry/intro", GantryScenes::introForShaft, - PonderTag.KINETIC_APPLIANCES, PonderTag.MOVEMENT_ANCHOR); + CreatePonderTag.KINETIC_APPLIANCES, CreatePonderTag.MOVEMENT_ANCHOR); HELPER.addStoryBoard(AllBlocks.GANTRY_CARRIAGE, "gantry/intro", GantryScenes::introForPinion, - PonderTag.KINETIC_APPLIANCES, PonderTag.MOVEMENT_ANCHOR); + CreatePonderTag.KINETIC_APPLIANCES, CreatePonderTag.MOVEMENT_ANCHOR); HELPER.forComponents(AllBlocks.GANTRY_SHAFT, AllBlocks.GANTRY_CARRIAGE) .addStoryBoard("gantry/redstone", GantryScenes::redstone) .addStoryBoard("gantry/direction", GantryScenes::direction) @@ -220,31 +246,31 @@ public class PonderIndex { // Cart Assembler HELPER.forComponents(AllBlocks.CART_ASSEMBLER) - .addStoryBoard("cart_assembler/anchor", CartAssemblerScenes::anchor, PonderTag.MOVEMENT_ANCHOR) + .addStoryBoard("cart_assembler/anchor", CartAssemblerScenes::anchor, CreatePonderTag.MOVEMENT_ANCHOR) .addStoryBoard("cart_assembler/modes", CartAssemblerScenes::modes) .addStoryBoard("cart_assembler/dual", CartAssemblerScenes::dual) .addStoryBoard("cart_assembler/rails", CartAssemblerScenes::rails); // Movement Actors HELPER.forComponents(AllBlocks.PORTABLE_STORAGE_INTERFACE) - .addStoryBoard("portable_interface/transfer", MovementActorScenes::psiTransfer, PonderTag.CONTRAPTION_ACTOR) + .addStoryBoard("portable_interface/transfer", MovementActorScenes::psiTransfer, CreatePonderTag.CONTRAPTION_ACTOR) .addStoryBoard("portable_interface/redstone", MovementActorScenes::psiRedstone); HELPER.forComponents(AllBlocks.REDSTONE_CONTACT) .addStoryBoard("redstone_contact", RedstoneScenes::contact); HELPER.forComponents(AllBlocks.MECHANICAL_SAW) - .addStoryBoard("mechanical_saw/processing", MechanicalSawScenes::processing, PonderTag.KINETIC_APPLIANCES) + .addStoryBoard("mechanical_saw/processing", MechanicalSawScenes::processing, CreatePonderTag.KINETIC_APPLIANCES) .addStoryBoard("mechanical_saw/breaker", MechanicalSawScenes::treeCutting) - .addStoryBoard("mechanical_saw/contraption", MechanicalSawScenes::contraption, PonderTag.CONTRAPTION_ACTOR); + .addStoryBoard("mechanical_saw/contraption", MechanicalSawScenes::contraption, CreatePonderTag.CONTRAPTION_ACTOR); HELPER.forComponents(AllBlocks.MECHANICAL_DRILL) - .addStoryBoard("mechanical_drill/breaker", MechanicalDrillScenes::breaker, PonderTag.KINETIC_APPLIANCES) + .addStoryBoard("mechanical_drill/breaker", MechanicalDrillScenes::breaker, CreatePonderTag.KINETIC_APPLIANCES) .addStoryBoard("mechanical_drill/contraption", MechanicalDrillScenes::contraption, - PonderTag.CONTRAPTION_ACTOR); + CreatePonderTag.CONTRAPTION_ACTOR); HELPER.forComponents(AllBlocks.DEPLOYER) - .addStoryBoard("deployer/filter", DeployerScenes::filter, PonderTag.KINETIC_APPLIANCES) + .addStoryBoard("deployer/filter", DeployerScenes::filter, CreatePonderTag.KINETIC_APPLIANCES) .addStoryBoard("deployer/modes", DeployerScenes::modes) .addStoryBoard("deployer/processing", DeployerScenes::processing) .addStoryBoard("deployer/redstone", DeployerScenes::redstone) - .addStoryBoard("deployer/contraption", DeployerScenes::contraption, PonderTag.CONTRAPTION_ACTOR); + .addStoryBoard("deployer/contraption", DeployerScenes::contraption, CreatePonderTag.CONTRAPTION_ACTOR); HELPER.forComponents(AllBlocks.MECHANICAL_HARVESTER) .addStoryBoard("harvester", MovementActorScenes::harvester); HELPER.forComponents(AllBlocks.MECHANICAL_PLOUGH) @@ -252,36 +278,36 @@ public class PonderIndex { // Fluids HELPER.forComponents(AllBlocks.FLUID_PIPE) - .addStoryBoard("fluid_pipe/flow", PipeScenes::flow, PonderTag.FLUIDS) + .addStoryBoard("fluid_pipe/flow", PipeScenes::flow, CreatePonderTag.FLUIDS) .addStoryBoard("fluid_pipe/interaction", PipeScenes::interaction) .addStoryBoard("fluid_pipe/encasing", PipeScenes::encasing); HELPER.forComponents(AllBlocks.COPPER_CASING) .addStoryBoard("fluid_pipe/encasing", PipeScenes::encasing); HELPER.forComponents(AllBlocks.MECHANICAL_PUMP) - .addStoryBoard("mechanical_pump/flow", PumpScenes::flow, PonderTag.FLUIDS, PonderTag.KINETIC_APPLIANCES) + .addStoryBoard("mechanical_pump/flow", PumpScenes::flow, CreatePonderTag.FLUIDS, CreatePonderTag.KINETIC_APPLIANCES) .addStoryBoard("mechanical_pump/speed", PumpScenes::speed); HELPER.forComponents(AllBlocks.FLUID_VALVE) - .addStoryBoard("fluid_valve", PipeScenes::valve, PonderTag.FLUIDS, PonderTag.KINETIC_APPLIANCES); + .addStoryBoard("fluid_valve", PipeScenes::valve, CreatePonderTag.FLUIDS, CreatePonderTag.KINETIC_APPLIANCES); HELPER.forComponents(AllBlocks.SMART_FLUID_PIPE) - .addStoryBoard("smart_pipe", PipeScenes::smart, PonderTag.FLUIDS); + .addStoryBoard("smart_pipe", PipeScenes::smart, CreatePonderTag.FLUIDS); HELPER.forComponents(AllBlocks.FLUID_TANK) - .addStoryBoard("fluid_tank/storage", FluidTankScenes::storage, PonderTag.FLUIDS) + .addStoryBoard("fluid_tank/storage", FluidTankScenes::storage, CreatePonderTag.FLUIDS) .addStoryBoard("fluid_tank/sizes", FluidTankScenes::sizes); HELPER.forComponents(AllBlocks.CREATIVE_FLUID_TANK) - .addStoryBoard("fluid_tank/storage_creative", FluidTankScenes::creative, PonderTag.FLUIDS, - PonderTag.CREATIVE) + .addStoryBoard("fluid_tank/storage_creative", FluidTankScenes::creative, CreatePonderTag.FLUIDS, + CreatePonderTag.CREATIVE) .addStoryBoard("fluid_tank/sizes_creative", FluidTankScenes::sizes); HELPER.forComponents(AllBlocks.HOSE_PULLEY) - .addStoryBoard("hose_pulley/intro", HosePulleyScenes::intro, PonderTag.FLUIDS, PonderTag.KINETIC_APPLIANCES) + .addStoryBoard("hose_pulley/intro", HosePulleyScenes::intro, CreatePonderTag.FLUIDS, CreatePonderTag.KINETIC_APPLIANCES) .addStoryBoard("hose_pulley/level", HosePulleyScenes::level) .addStoryBoard("hose_pulley/infinite", HosePulleyScenes::infinite); HELPER.forComponents(AllBlocks.SPOUT) - .addStoryBoard("spout", SpoutScenes::filling, PonderTag.FLUIDS); + .addStoryBoard("spout", SpoutScenes::filling, CreatePonderTag.FLUIDS); HELPER.forComponents(AllBlocks.ITEM_DRAIN) - .addStoryBoard("item_drain", DrainScenes::emptying, PonderTag.FLUIDS); + .addStoryBoard("item_drain", DrainScenes::emptying, CreatePonderTag.FLUIDS); HELPER.forComponents(AllBlocks.PORTABLE_FLUID_INTERFACE) - .addStoryBoard("portable_interface/transfer_fluid", FluidMovementActorScenes::transfer, PonderTag.FLUIDS, - PonderTag.CONTRAPTION_ACTOR) + .addStoryBoard("portable_interface/transfer_fluid", FluidMovementActorScenes::transfer, CreatePonderTag.FLUIDS, + CreatePonderTag.CONTRAPTION_ACTOR) .addStoryBoard("portable_interface/redstone_fluid", MovementActorScenes::psiRedstone); // Redstone @@ -343,15 +369,11 @@ public class PonderIndex { if (REGISTER_DEBUG_SCENES) DebugScenes.registerAll(); } - - public static boolean editingModeActive() { - return AllConfigs.CLIENT.editingMode.get(); - } - public static void registerTags() { // Add items to tags here - PonderRegistry.TAGS.forTag(PonderTag.KINETIC_RELAYS) + //PonderRegistry.TAGS.forTag(PonderTag.KINETIC_RELAYS) + HELPER.addToTag(CreatePonderTag.KINETIC_RELAYS) .add(AllBlocks.SHAFT) .add(AllBlocks.COGWHEEL) .add(AllBlocks.LARGE_COGWHEEL) @@ -364,7 +386,7 @@ public class PonderIndex { .add(AllBlocks.SEQUENCED_GEARSHIFT) .add(AllBlocks.ROTATION_SPEED_CONTROLLER); - PonderRegistry.TAGS.forTag(PonderTag.KINETIC_SOURCES) + HELPER.addToTag(CreatePonderTag.KINETIC_SOURCES) .add(AllBlocks.HAND_CRANK) .add(AllBlocks.COPPER_VALVE_HANDLE) .add(AllBlocks.WATER_WHEEL) @@ -372,7 +394,7 @@ public class PonderIndex { .add(AllBlocks.STEAM_ENGINE) .add(AllBlocks.CREATIVE_MOTOR); - PonderRegistry.TAGS.forTag(PonderTag.TRAIN_RELATED) + HELPER.addToTag(CreatePonderTag.TRAIN_RELATED) .add(AllBlocks.TRACK) .add(AllBlocks.TRACK_STATION) .add(AllBlocks.TRACK_SIGNAL) @@ -383,7 +405,7 @@ public class PonderIndex { .add(AllBlocks.TRAIN_TRAPDOOR) .add(AllBlocks.RAILWAY_CASING); - PonderRegistry.TAGS.forTag(PonderTag.KINETIC_APPLIANCES) + HELPER.addToTag(CreatePonderTag.KINETIC_APPLIANCES) .add(AllBlocks.MILLSTONE) .add(AllBlocks.TURNTABLE) .add(AllBlocks.ENCASED_FAN) @@ -405,7 +427,7 @@ public class PonderIndex { .add(AllBlocks.DISPLAY_BOARD) .add(AllBlocks.CRUSHING_WHEEL); - PonderRegistry.TAGS.forTag(PonderTag.FLUIDS) + HELPER.addToTag(CreatePonderTag.FLUIDS) .add(AllBlocks.FLUID_PIPE) .add(AllBlocks.MECHANICAL_PUMP) .add(AllBlocks.FLUID_VALVE) @@ -417,7 +439,7 @@ public class PonderIndex { .add(AllBlocks.FLUID_TANK) .add(AllBlocks.CREATIVE_FLUID_TANK); - PonderRegistry.TAGS.forTag(PonderTag.ARM_TARGETS) + HELPER.addToTag(CreatePonderTag.ARM_TARGETS) .add(AllBlocks.MECHANICAL_ARM) .add(AllItems.BELT_CONNECTOR) .add(AllBlocks.CHUTE) @@ -439,7 +461,7 @@ public class PonderIndex { .add(Blocks.SOUL_CAMPFIRE) .add(Blocks.RESPAWN_ANCHOR); - PonderRegistry.TAGS.forTag(PonderTag.LOGISTICS) + HELPER.addToTag(CreatePonderTag.LOGISTICS) .add(AllItems.BELT_CONNECTOR) .add(AllItems.FILTER) .add(AllItems.ATTRIBUTE_FILTER) @@ -458,7 +480,7 @@ public class PonderIndex { .add(AllBlocks.CREATIVE_CRATE) .add(AllBlocks.PORTABLE_STORAGE_INTERFACE); - PonderRegistry.TAGS.forTag(PonderTag.DECORATION) + HELPER.addToTag(CreatePonderTag.DECORATION) .add(AllBlocks.ORANGE_NIXIE_TUBE) .add(AllBlocks.DISPLAY_BOARD) .add(AllBlocks.CUCKOO_CLOCK) @@ -470,17 +492,17 @@ public class PonderIndex { .add(AllBlocks.COPPER_CASING) .add(AllBlocks.RAILWAY_CASING); - PonderRegistry.TAGS.forTag(PonderTag.CREATIVE) + HELPER.addToTag(CreatePonderTag.CREATIVE) .add(AllBlocks.CREATIVE_CRATE) .add(AllBlocks.CREATIVE_FLUID_TANK) .add(AllBlocks.CREATIVE_MOTOR); - PonderRegistry.TAGS.forTag(PonderTag.SAILS) + HELPER.addToTag(CreatePonderTag.SAILS) .add(AllBlocks.SAIL) .add(AllBlocks.SAIL_FRAME) .add(Blocks.WHITE_WOOL); - PonderRegistry.TAGS.forTag(PonderTag.REDSTONE) + HELPER.addToTag(CreatePonderTag.REDSTONE) .add(AllBlocks.ORANGE_NIXIE_TUBE) .add(AllBlocks.REDSTONE_CONTACT) .add(AllBlocks.ANALOG_LEVER) @@ -491,7 +513,7 @@ public class PonderIndex { .add(AllBlocks.POWERED_TOGGLE_LATCH) .add(AllBlocks.ROSE_QUARTZ_LAMP); - PonderRegistry.TAGS.forTag(PonderTag.MOVEMENT_ANCHOR) + HELPER.addToTag(CreatePonderTag.MOVEMENT_ANCHOR) .add(AllBlocks.MECHANICAL_PISTON) .add(AllBlocks.WINDMILL_BEARING) .add(AllBlocks.MECHANICAL_BEARING) @@ -501,7 +523,7 @@ public class PonderIndex { .add(AllBlocks.CART_ASSEMBLER) .add(AllBlocks.TRACK_STATION); - PonderRegistry.TAGS.forTag(PonderTag.CONTRAPTION_ASSEMBLY) + HELPER.addToTag(CreatePonderTag.CONTRAPTION_ASSEMBLY) .add(AllBlocks.LINEAR_CHASSIS) .add(AllBlocks.SECONDARY_LINEAR_CHASSIS) .add(AllBlocks.RADIAL_CHASSIS) @@ -510,7 +532,7 @@ public class PonderIndex { .add(Blocks.SLIME_BLOCK) .add(Blocks.HONEY_BLOCK); - PonderRegistry.TAGS.forTag(PonderTag.CONTRAPTION_ACTOR) + HELPER.addToTag(CreatePonderTag.CONTRAPTION_ACTOR) .add(AllBlocks.MECHANICAL_HARVESTER) .add(AllBlocks.MECHANICAL_PLOUGH) .add(AllBlocks.MECHANICAL_DRILL) @@ -528,7 +550,7 @@ public class PonderIndex { .add(Blocks.DISPENSER) .add(Blocks.DROPPER); - PonderRegistry.TAGS.forTag(PonderTag.DISPLAY_SOURCES) + HELPER.addToTag(CreatePonderTag.DISPLAY_SOURCES) .add(AllBlocks.SEATS.get(DyeColor.WHITE)) .add(AllBlocks.ORANGE_NIXIE_TUBE) .add(AllBlocks.STOCKPILE_SWITCH) @@ -548,7 +570,7 @@ public class PonderIndex { .add(Blocks.COMMAND_BLOCK) .add(Blocks.TARGET); - PonderRegistry.TAGS.forTag(PonderTag.DISPLAY_TARGETS) + HELPER.addToTag(CreatePonderTag.DISPLAY_TARGETS) .add(AllBlocks.ORANGE_NIXIE_TUBE) .add(AllBlocks.DISPLAY_BOARD) .add(AllBlocks.DISPLAY_LINK) diff --git a/src/main/java/com/simibubi/create/foundation/ponder/CreatePonderTag.java b/src/main/java/com/simibubi/create/foundation/ponder/CreatePonderTag.java new file mode 100644 index 0000000000..3d3503b6d2 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/CreatePonderTag.java @@ -0,0 +1,93 @@ +package com.simibubi.create.foundation.ponder; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllItems; +import com.simibubi.create.Create; + +import net.createmod.ponder.foundation.PonderTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.block.Blocks; + +public class CreatePonderTag extends PonderTag { + + public static final PonderTag KINETIC_RELAYS = create("kinetic_relays") + .item(AllBlocks.COGWHEEL.get(), true, false) + .defaultLang("Kinetic Blocks", "Components which help relaying Rotational Force elsewhere") + .addToIndex(); + + public static final PonderTag KINETIC_SOURCES = create("kinetic_sources") + .item(AllBlocks.WATER_WHEEL.get(), true, false) + .defaultLang("Kinetic Sources", "Components which generate Rotational Force") + .addToIndex(); + public static final PonderTag KINETIC_APPLIANCES = create("kinetic_appliances") + .item(AllBlocks.MECHANICAL_PRESS.get(), true, false) + .defaultLang("Kinetic Appliances", "Components which make use of Rotational Force") + .addToIndex(); + public static final PonderTag FLUIDS = create("fluids") + .item(AllBlocks.FLUID_PIPE.get(), true, false) + .defaultLang("Fluid Manipulators", "Components which help relaying and making use of Fluids") + .addToIndex(); + public static final PonderTag LOGISTICS = create("logistics") + .item(Blocks.CHEST, true, false) + .defaultLang("Item Transportation", "Components which help moving items around") + .addToIndex(); + public static final PonderTag REDSTONE = create("redstone") + .item(Items.REDSTONE, true, false) + .defaultLang("Logic Components", "Components which help with redstone engineering") + .addToIndex(); + public static final PonderTag DECORATION = create("decoration") + .item(Items.ROSE_BUSH, true, false) + .defaultLang("Aesthetics", "Components used mostly for decorative purposes"); + public static final PonderTag CREATIVE = create("creative").item(AllBlocks.CREATIVE_CRATE.get(), true, false) + .defaultLang("Creative Mode", "Components not usually available for Survival Mode") + .addToIndex(); + public static final PonderTag MOVEMENT_ANCHOR = create("movement_anchor") + .item(AllBlocks.MECHANICAL_PISTON.get(), true, false) + .defaultLang("Movement Anchors", + "Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways") + .addToIndex(); + public static final PonderTag CONTRAPTION_ACTOR = create("contraption_actor") + .item(AllBlocks.MECHANICAL_HARVESTER.get(), true, false) + .defaultLang("Contraption Actors", + "Components which expose special behaviour when attached to a moving contraption") + .addToIndex(); + public static final PonderTag CONTRAPTION_ASSEMBLY = create("contraption_assembly") + .item(AllItems.SUPER_GLUE.get(), true, false) + .defaultLang("Block Attachment Utility", + "Tools and Components used to assemble structures moved as an animated Contraption") + .addToIndex(); + public static final PonderTag SAILS = create("windmill_sails") + .item(AllBlocks.WINDMILL_BEARING.get()) + .defaultLang("Sails for Windmill Bearings", + "Blocks that count towards the strength of a Windmill Contraption when assembled. Each of these have equal efficiency in doing so."); + public static final PonderTag ARM_TARGETS = create("arm_targets") + .item(AllBlocks.MECHANICAL_ARM.get()) + .defaultLang("Targets for Mechanical Arms", + "Components which can be selected as inputs or outputs to the Mechanical Arm"); + public static final PonderTag TRAIN_RELATED = create("train_related") + .item(AllBlocks.TRACK.get()) + .defaultLang("Railway Equipment", "Components used in the construction or management of Train Contraptions") + .addToIndex(); + public static final PonderTag DISPLAY_SOURCES = create("display_sources") + .item(AllBlocks.DISPLAY_LINK.get(), true, false) + .item(AllBlocks.DISPLAY_LINK.get(), false, true) + .defaultLang("Sources for Display Links", + "Components or Blocks which offer some data that can be read with a Display Link"); + public static final PonderTag DISPLAY_TARGETS = create("display_targets") + .item(AllBlocks.DISPLAY_LINK.get(), true, false) + .item(AllBlocks.DISPLAY_LINK.get(), false, true) + .defaultLang("Targets for Display Links", + "Components or Blocks which can process and display the data received from a Display Link"); + + public CreatePonderTag(ResourceLocation id) { + super(id); + } + + private static PonderTag create(String id) { + return create(Create.ID, id); + } + + // Make sure class is loaded; Lang registration happens with builder calls + public static void register() {} +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/CreateSceneBuilder.java b/src/main/java/com/simibubi/create/foundation/ponder/CreateSceneBuilder.java new file mode 100644 index 0000000000..3279580e1f --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/CreateSceneBuilder.java @@ -0,0 +1,341 @@ +package com.simibubi.create.foundation.ponder; + +import java.util.function.Supplier; +import java.util.function.UnaryOperator; + +import com.simibubi.create.content.contraptions.base.IRotate; +import com.simibubi.create.content.contraptions.base.KineticBlock; +import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import com.simibubi.create.content.contraptions.components.crafter.ConnectedInputHandler; +import com.simibubi.create.content.contraptions.components.crafter.MechanicalCrafterTileEntity; +import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueItem; +import com.simibubi.create.content.contraptions.components.structureMovement.interaction.controls.ControlsBlock; +import com.simibubi.create.content.contraptions.fluids.PumpTileEntity; +import com.simibubi.create.content.contraptions.particle.RotationIndicatorParticleData; +import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerTileEntity; +import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; +import com.simibubi.create.content.contraptions.relays.gauge.SpeedGaugeTileEntity; +import com.simibubi.create.content.logistics.block.display.DisplayLinkTileEntity; +import com.simibubi.create.content.logistics.block.funnel.FunnelTileEntity; +import com.simibubi.create.content.logistics.block.mechanicalArm.ArmTileEntity; +import com.simibubi.create.content.logistics.trains.management.display.FlapDisplayTileEntity; +import com.simibubi.create.content.logistics.trains.management.edgePoint.signal.SignalTileEntity; +import com.simibubi.create.content.logistics.trains.management.edgePoint.station.StationTileEntity; +import com.simibubi.create.foundation.ponder.element.BeltItemElement; +import com.simibubi.create.foundation.ponder.element.ExpandedParrotElement; +import com.simibubi.create.foundation.ponder.instruction.AnimateTileEntityInstruction; +import com.simibubi.create.foundation.tileEntity.SmartTileEntity; +import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour; + +import net.createmod.catnip.utility.FunctionalHelper; +import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.ponder.foundation.ElementLink; +import net.createmod.ponder.foundation.PonderScene; +import net.createmod.ponder.foundation.PonderWorld; +import net.createmod.ponder.foundation.SceneBuilder; +import net.createmod.ponder.foundation.Selection; +import net.createmod.ponder.foundation.element.ParrotElement; +import net.createmod.ponder.foundation.element.WorldSectionElement; +import net.createmod.ponder.foundation.instruction.CreateParrotInstruction; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.animal.Parrot; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; + +public class CreateSceneBuilder extends SceneBuilder { + + public final EffectInstructions effects; + public final WorldInstructions world; + public final SpecialInstructions special; + + public CreateSceneBuilder(SceneBuilder baseSceneBuilder) { + this(baseSceneBuilder.getScene()); + } + + private CreateSceneBuilder(PonderScene ponderScene) { + super(ponderScene); + effects = new EffectInstructions(); + world = new WorldInstructions(); + special = new SpecialInstructions(); + } + + public class EffectInstructions extends SceneBuilder.EffectInstructions { + + public void superGlue(BlockPos pos, Direction side, boolean fullBlock) { + addInstruction(scene -> SuperGlueItem.spawnParticles(scene.getWorld(), pos, side, fullBlock)); + } + + private void rotationIndicator(BlockPos pos, boolean direction) { + addInstruction(scene -> { + BlockState blockState = scene.getWorld() + .getBlockState(pos); + BlockEntity tileEntity = scene.getWorld() + .getBlockEntity(pos); + + if (!(blockState.getBlock() instanceof KineticBlock kineticBlock)) + return; + if (!(tileEntity instanceof KineticTileEntity kineticTile)) + return; + + Direction.Axis rotationAxis = kineticBlock.getRotationAxis(blockState); + + float speed = kineticTile.getTheoreticalSpeed(); + IRotate.SpeedLevel speedLevel = IRotate.SpeedLevel.of(speed); + int color = direction ? speed > 0 ? 0xeb5e0b : 0x1687a7 : speedLevel.getColor(); + int particleSpeed = speedLevel.getParticleSpeed(); + particleSpeed *= Math.signum(speed); + + Vec3 location = VecHelper.getCenterOf(pos); + RotationIndicatorParticleData particleData = new RotationIndicatorParticleData(color, particleSpeed, + kineticBlock.getParticleInitialRadius(), kineticBlock.getParticleTargetRadius(), 20, rotationAxis.name() + .charAt(0)); + + for (int i = 0; i < 20; i++) + scene.getWorld() + .addParticle(particleData, location.x, location.y, location.z, 0, 0, 0); + }); + } + + public void rotationSpeedIndicator(BlockPos pos) { + rotationIndicator(pos, false); + } + + public void rotationDirectionIndicator(BlockPos pos) { + rotationIndicator(pos, true); + } + + + } + + public class WorldInstructions extends SceneBuilder.WorldInstructions { + + public void rotateBearing(BlockPos pos, float angle, int duration) { + addInstruction(AnimateTileEntityInstruction.bearing(pos, angle, duration)); + } + + public void movePulley(BlockPos pos, float distance, int duration) { + addInstruction(AnimateTileEntityInstruction.pulley(pos, distance, duration)); + } + + public void animateBogey(BlockPos pos, float distance, int duration) { + addInstruction(AnimateTileEntityInstruction.bogey(pos, distance, duration + 1)); + } + + public void moveDeployer(BlockPos pos, float distance, int duration) { + addInstruction(AnimateTileEntityInstruction.deployer(pos, distance, duration)); + } + + public void createItemOnBeltLike(BlockPos location, Direction insertionSide, ItemStack stack) { + addInstruction(scene -> { + PonderWorld world = scene.getWorld(); + BlockEntity tileEntity = world.getBlockEntity(location); + if (!(tileEntity instanceof SmartTileEntity beltTileEntity)) + return; + DirectBeltInputBehaviour behaviour = beltTileEntity.getBehaviour(DirectBeltInputBehaviour.TYPE); + if (behaviour == null) + return; + behaviour.handleInsertion(stack, insertionSide.getOpposite(), false); + }); + flapFunnel(location.above(), true); + } + + public ElementLink createItemOnBelt(BlockPos beltLocation, Direction insertionSide, + ItemStack stack) { + ElementLink link = new ElementLink<>(BeltItemElement.class); + addInstruction(scene -> { + PonderWorld world = scene.getWorld(); + BlockEntity tileEntity = world.getBlockEntity(beltLocation); + if (!(tileEntity instanceof BeltTileEntity beltTileEntity)) + return; + + DirectBeltInputBehaviour behaviour = beltTileEntity.getBehaviour(DirectBeltInputBehaviour.TYPE); + behaviour.handleInsertion(stack, insertionSide.getOpposite(), false); + + BeltTileEntity controllerTE = beltTileEntity.getControllerTE(); + if (controllerTE != null) + controllerTE.tick(); + + TransportedItemStackHandlerBehaviour transporter = + beltTileEntity.getBehaviour(TransportedItemStackHandlerBehaviour.TYPE); + transporter.handleProcessingOnAllItems(tis -> { + BeltItemElement tracker = new BeltItemElement(tis); + scene.addElement(tracker); + scene.linkElement(tracker, link); + return TransportedItemStackHandlerBehaviour.TransportedResult.doNothing(); + }); + }); + flapFunnel(beltLocation.above(), true); + return link; + } + + public void removeItemsFromBelt(BlockPos beltLocation) { + addInstruction(scene -> { + PonderWorld world = scene.getWorld(); + BlockEntity tileEntity = world.getBlockEntity(beltLocation); + if (!(tileEntity instanceof SmartTileEntity beltTileEntity)) + return; + TransportedItemStackHandlerBehaviour transporter = + beltTileEntity.getBehaviour(TransportedItemStackHandlerBehaviour.TYPE); + if (transporter == null) + return; + transporter.handleCenteredProcessingOnAllItems(.52f, tis -> TransportedItemStackHandlerBehaviour.TransportedResult.removeItem()); + }); + } + + public void stallBeltItem(ElementLink link, boolean stalled) { + addInstruction(scene -> { + BeltItemElement resolve = scene.resolve(link); + if (resolve != null) + resolve.ifPresent(tis -> tis.locked = stalled); + }); + } + + public void changeBeltItemTo(ElementLink link, ItemStack newStack) { + addInstruction(scene -> { + BeltItemElement resolve = scene.resolve(link); + if (resolve != null) + resolve.ifPresent(tis -> tis.stack = newStack); + }); + } + + public void setKineticSpeed(Selection selection, float speed) { + modifyKineticSpeed(selection, f -> speed); + } + + public void multiplyKineticSpeed(Selection selection, float modifier) { + modifyKineticSpeed(selection, f -> f * modifier); + } + + public void modifyKineticSpeed(Selection selection, UnaryOperator speedFunc) { + modifyTileNBT(selection, SpeedGaugeTileEntity.class, nbt -> { + float newSpeed = speedFunc.apply(nbt.getFloat("Speed")); + nbt.putFloat("Value", SpeedGaugeTileEntity.getDialTarget(newSpeed)); + }); + modifyTileNBT(selection, KineticTileEntity.class, nbt -> { + nbt.putFloat("Speed", speedFunc.apply(nbt.getFloat("Speed"))); + }); + } + + public void propagatePipeChange(BlockPos pos) { + modifyTileEntity(pos, PumpTileEntity.class, te -> te.onSpeedChanged(0)); + } + + public void setFilterData(Selection selection, Class teType, ItemStack filter) { + modifyTileNBT(selection, teType, nbt -> { + nbt.put("Filter", filter.serializeNBT()); + }); + } + + public void instructArm(BlockPos armLocation, ArmTileEntity.Phase phase, ItemStack heldItem, + int targetedPoint) { + modifyTileNBT(getScene().getSceneBuildingUtil().select.position(armLocation), ArmTileEntity.class, compound -> { + NBTHelper.writeEnum(compound, "Phase", phase); + compound.put("HeldItem", heldItem.serializeNBT()); + compound.putInt("TargetPointIndex", targetedPoint); + compound.putFloat("MovementProgress", 0); + }); + } + + public void flapFunnel(BlockPos position, boolean outward) { + modifyTileEntity(position, FunnelTileEntity.class, funnel -> funnel.flap(!outward)); + } + + public void setCraftingResult(BlockPos crafter, ItemStack output) { + modifyTileEntity(crafter, MechanicalCrafterTileEntity.class, mct -> mct.setScriptedResult(output)); + } + + public void connectCrafterInvs(BlockPos position1, BlockPos position2) { + addInstruction(s -> { + ConnectedInputHandler.toggleConnection(s.getWorld(), position1, position2); + s.forEach(WorldSectionElement.class, WorldSectionElement::queueRedraw); + }); + } + + public void toggleControls(BlockPos position) { + cycleBlockProperty(position, ControlsBlock.VIRTUAL); + } + + public void animateTrainStation(BlockPos position, boolean trainPresent) { + modifyTileNBT(getScene().getSceneBuildingUtil().select.position(position), StationTileEntity.class, + c -> c.putBoolean("ForceFlag", trainPresent)); + } + + public void conductorBlaze(BlockPos position, boolean conductor) { + modifyTileNBT(getScene().getSceneBuildingUtil().select.position(position), BlazeBurnerTileEntity.class, + c -> c.putBoolean("TrainHat", conductor)); + } + + public void changeSignalState(BlockPos position, SignalTileEntity.SignalState state) { + modifyTileNBT(getScene().getSceneBuildingUtil().select.position(position), SignalTileEntity.class, + c -> NBTHelper.writeEnum(c, "State", state)); + } + + public void setDisplayBoardText(BlockPos position, int line, Component text) { + modifyTileEntity(position, FlapDisplayTileEntity.class, + t -> t.applyTextManually(line, Component.Serializer.toJson(text))); + } + + public void dyeDisplayBoard(BlockPos position, int line, DyeColor color) { + modifyTileEntity(position, FlapDisplayTileEntity.class, t -> t.setColour(line, color)); + } + + public void flashDisplayLink(BlockPos position) { + modifyTileEntity(position, DisplayLinkTileEntity.class, linkTile -> linkTile.glow.setValue(2)); + } + + } + + public class SpecialInstructions extends SceneBuilder.SpecialInstructions { + + @Override + public ElementLink createBirb(Vec3 location, Supplier pose) { + ElementLink link = new ElementLink<>(ParrotElement.class); + ParrotElement parrot = ExpandedParrotElement.create(location, pose); + addInstruction(new CreateParrotInstruction(10, Direction.DOWN, parrot)); + addInstruction(scene -> scene.linkElement(parrot, link)); + return link; + } + + public ElementLink birbOnTurntable(BlockPos pos) { + return createBirb(VecHelper.getCenterOf(pos), () -> new ParrotSpinOnComponentPose(pos)); + } + + public ElementLink birbOnSpinnyShaft(BlockPos pos) { + return createBirb(VecHelper.getCenterOf(pos) + .add(0, 0.5, 0), () -> new ParrotSpinOnComponentPose(pos)); + } + + public void conductorBirb(ElementLink birb, boolean conductor) { + addInstruction(scene -> scene.resolveOptional(birb) + .map(FunctionalHelper.filterAndCast(ExpandedParrotElement.class)) + .ifPresent(expandedBirb -> expandedBirb.setConductor(conductor))); + } + + public static class ParrotSpinOnComponentPose extends ParrotElement.ParrotPose { + private final BlockPos componentPos; + + public ParrotSpinOnComponentPose(BlockPos componentPos) { + this.componentPos = componentPos; + } + + @Override + protected void tick(PonderScene scene, Parrot entity, Vec3 location) { + BlockEntity tileEntity = scene.getWorld() + .getBlockEntity(componentPos); + if (!(tileEntity instanceof KineticTileEntity)) + return; + float rpm = ((KineticTileEntity) tileEntity).getSpeed(); + entity.yRotO = entity.getYRot(); + entity.setYRot(entity.getYRot() + (rpm * .3f)); + } + } + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/CreateSharedPonderText.java b/src/main/java/com/simibubi/create/foundation/ponder/CreateSharedPonderText.java new file mode 100644 index 0000000000..23798a84d2 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/CreateSharedPonderText.java @@ -0,0 +1,26 @@ +package com.simibubi.create.foundation.ponder; + +import java.util.function.BiConsumer; + +import com.simibubi.create.Create; + +import net.createmod.ponder.foundation.content.SharedText; + +public class CreateSharedPonderText { + + public static void loadClass() { + SharedText.registerText(Create.ID, CreateSharedPonderText::createSharedText); + } + + private static void createSharedText(BiConsumer adder) { + adder.accept("rpm8", "8 RPM"); + adder.accept("rpm16", "16 RPM"); + adder.accept("rpm16_source", "Source: 16 RPM"); + adder.accept("rpm32", "32 RPM"); + + adder.accept("movement_anchors", "With the help of Super Glue, larger structures can be moved."); + adder.accept("behaviour_modify_wrench", "This behaviour can be modified using a Wrench"); + adder.accept("storage_on_contraption", "Inventories attached to the Contraption will pick up their drops automatically"); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/ElementLink.java b/src/main/java/com/simibubi/create/foundation/ponder/ElementLink.java deleted file mode 100644 index 8484baf657..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/ElementLink.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.simibubi.create.foundation.ponder; - -import java.util.UUID; - -import com.simibubi.create.foundation.ponder.element.PonderElement; - -public class ElementLink { - - private Class elementClass; - private UUID id; - - public ElementLink(Class elementClass) { - this(elementClass, UUID.randomUUID()); - } - - public ElementLink(Class elementClass, UUID id) { - this.elementClass = elementClass; - this.id = id; - } - - public UUID getId() { - return id; - } - - public T cast(PonderElement e) { - return elementClass.cast(e); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderChapter.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderChapter.java deleted file mode 100644 index d09c382b43..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderChapter.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.simibubi.create.foundation.ponder; - -import javax.annotation.Nonnull; - -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.foundation.gui.element.ScreenElement; - -import net.minecraft.client.gui.GuiComponent; -import net.minecraft.resources.ResourceLocation; - -public class PonderChapter implements ScreenElement { - - private final ResourceLocation id; - private final ResourceLocation icon; - - private PonderChapter(ResourceLocation id) { - this.id = id; - icon = new ResourceLocation(id.getNamespace(), "textures/ponder/chapter/" + id.getPath() + ".png"); - } - - public ResourceLocation getId() { - return id; - } - - public String getTitle() { - return PonderLocalization.getChapter(id); - } - - public PonderChapter addTagsToChapter(PonderTag... tags) { - for (PonderTag t : tags) - PonderRegistry.TAGS.add(t, this); - return this; - } - - @Override - public void render(PoseStack ms, int x, int y) { - ms.pushPose(); - RenderSystem.setShaderTexture(0, icon); - ms.scale(0.25f, 0.25f, 1); - //x and y offset, blit z offset, tex x and y, tex width and height, entire tex sheet width and height - GuiComponent.blit(ms, x, y, 0, 0, 0, 64, 64, 64, 64); - ms.popPose(); - } - - @Nonnull - public static PonderChapter of(ResourceLocation id) { - PonderChapter chapter = PonderRegistry.CHAPTERS.getChapter(id); - if (chapter == null) { - chapter = PonderRegistry.CHAPTERS.addChapter(new PonderChapter(id)); - } - - return chapter; - } -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderChapterRegistry.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderChapterRegistry.java deleted file mode 100644 index 6fb60ad9ae..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderChapterRegistry.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.simibubi.create.foundation.ponder; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -import com.simibubi.create.foundation.utility.Pair; - -import net.minecraft.resources.ResourceLocation; - -public class PonderChapterRegistry { - - private final Map>> chapters; - - public PonderChapterRegistry() { - chapters = new HashMap<>(); - } - - PonderChapter addChapter(@Nonnull PonderChapter chapter) { - synchronized (chapters) { - chapters.put(chapter.getId(), Pair.of(chapter, new ArrayList<>())); - } - return chapter; - } - - @Nullable - PonderChapter getChapter(ResourceLocation id) { - Pair> pair = chapters.get(id); - if (pair == null) - return null; - - return pair.getFirst(); - } - - public void addStoriesToChapter(@Nonnull PonderChapter chapter, PonderStoryBoardEntry... entries) { - List entryList = chapters.get(chapter.getId()).getSecond(); - synchronized (entryList) { - Collections.addAll(entryList, entries); - } - } - - public List getAllChapters() { - return chapters - .values() - .stream() - .map(Pair::getFirst) - .collect(Collectors.toList()); - } - - public List getStories(PonderChapter chapter) { - return chapters.get(chapter.getId()).getSecond(); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderLocalization.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderLocalization.java deleted file mode 100644 index 51b9313973..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderLocalization.java +++ /dev/null @@ -1,203 +0,0 @@ -package com.simibubi.create.foundation.ponder; - -import java.util.HashMap; -import java.util.Map; - -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.simibubi.create.Create; -import com.simibubi.create.foundation.ponder.content.PonderIndex; -import com.simibubi.create.foundation.ponder.content.SharedText; -import com.simibubi.create.foundation.ponder.ui.PonderTagIndexScreen; -import com.simibubi.create.foundation.ponder.ui.PonderTagScreen; -import com.simibubi.create.foundation.ponder.ui.PonderUI; -import com.simibubi.create.foundation.utility.Couple; -import com.tterrag.registrate.AbstractRegistrate; - -import net.minecraft.client.resources.language.I18n; -import net.minecraft.resources.ResourceLocation; - -public class PonderLocalization { - - static final Map SHARED = new HashMap<>(); - static final Map> TAG = new HashMap<>(); - static final Map CHAPTER = new HashMap<>(); - static final Map> SPECIFIC = new HashMap<>(); - - // - - public static void registerShared(ResourceLocation key, String enUS) { - SHARED.put(key, enUS); - } - - public static void registerTag(ResourceLocation key, String enUS, String description) { - TAG.put(key, Couple.create(enUS, description)); - } - - public static void registerChapter(ResourceLocation key, String enUS) { - CHAPTER.put(key, enUS); - } - - public static void registerSpecific(ResourceLocation sceneId, String key, String enUS) { - SPECIFIC.computeIfAbsent(sceneId, $ -> new HashMap<>()) - .put(key, enUS); - } - - // - - public static String getShared(ResourceLocation key) { - if (PonderIndex.editingModeActive()) - return SHARED.containsKey(key) ? SHARED.get(key) : ("unregistered shared entry: " + key); - return I18n.get(langKeyForShared(key)); - } - - public static String getTag(ResourceLocation key) { - if (PonderIndex.editingModeActive()) - return TAG.containsKey(key) ? TAG.get(key) - .getFirst() : ("unregistered tag entry: " + key); - return I18n.get(langKeyForTag(key)); - } - - public static String getTagDescription(ResourceLocation key) { - if (PonderIndex.editingModeActive()) - return TAG.containsKey(key) ? TAG.get(key) - .getSecond() : ("unregistered tag entry: " + key); - return I18n.get(langKeyForTagDescription(key)); - } - - public static String getChapter(ResourceLocation key) { - if (PonderIndex.editingModeActive()) - return CHAPTER.containsKey(key) ? CHAPTER.get(key) : ("unregistered chapter entry: " + key); - return I18n.get(langKeyForChapter(key)); - } - - public static String getSpecific(ResourceLocation sceneId, String k) { - if (PonderIndex.editingModeActive()) - return SPECIFIC.get(sceneId) - .get(k); - return I18n.get(langKeyForSpecific(sceneId, k)); - } - - // - - public static final String LANG_PREFIX = "ponder."; - - public static void record(String namespace, JsonObject object) { - SHARED.forEach((k, v) -> { - if (k.getNamespace().equals(namespace)) { - object.addProperty(langKeyForShared(k), v); - } - }); - - TAG.forEach((k, v) -> { - if (k.getNamespace().equals(namespace)) { - object.addProperty(langKeyForTag(k), v.getFirst()); - object.addProperty(langKeyForTagDescription(k), v.getSecond()); - } - }); - - CHAPTER.forEach((k, v) -> { - if (k.getNamespace().equals(namespace)) { - object.addProperty(langKeyForChapter(k), v); - } - }); - - SPECIFIC.entrySet() - .stream() - .filter(entry -> entry.getKey().getNamespace().equals(namespace)) - .sorted(Map.Entry.comparingByKey()) - .forEach(entry -> { - entry.getValue() - .entrySet() - .stream() - .sorted(Map.Entry.comparingByKey()) - .forEach(subEntry -> object.addProperty( - langKeyForSpecific(entry.getKey(), subEntry.getKey()), subEntry.getValue())); - }); - } - - private static void recordGeneral(JsonObject object) { - addGeneral(object, PonderTooltipHandler.HOLD_TO_PONDER, "Hold [%1$s] to Ponder"); - addGeneral(object, PonderTooltipHandler.SUBJECT, "Subject of this scene"); - addGeneral(object, PonderUI.PONDERING, "Pondering about..."); - addGeneral(object, PonderUI.IDENTIFY_MODE, "Identify mode active.\nUnpause with [%1$s]"); - addGeneral(object, PonderTagScreen.ASSOCIATED, "Associated Entries"); - - addGeneral(object, PonderUI.CLOSE, "Close"); - addGeneral(object, PonderUI.IDENTIFY, "Identify"); - addGeneral(object, PonderUI.NEXT, "Next Scene"); - addGeneral(object, PonderUI.NEXT_UP, "Up Next:"); - addGeneral(object, PonderUI.PREVIOUS, "Previous Scene"); - addGeneral(object, PonderUI.REPLAY, "Replay"); - addGeneral(object, PonderUI.THINK_BACK, "Think Back"); - addGeneral(object, PonderUI.SLOW_TEXT, "Comfy Reading"); - - addGeneral(object, PonderTagIndexScreen.EXIT, "Exit"); - addGeneral(object, PonderTagIndexScreen.WELCOME, "Welcome to Ponder"); - addGeneral(object, PonderTagIndexScreen.CATEGORIES, "Available Categories in Create"); - addGeneral(object, PonderTagIndexScreen.DESCRIPTION, - "Click one of the icons to learn about its associated Items and Blocks"); - addGeneral(object, PonderTagIndexScreen.TITLE, "Ponder Index"); - } - - private static void addGeneral(JsonObject json, String key, String enUS) { - json.addProperty(Create.ID + "." + key, enUS); - } - - public static void generateSceneLang() { - PonderRegistry.ALL.forEach((id, list) -> { - for (int i = 0; i < list.size(); i++) - PonderRegistry.compileScene(i, list.get(i), null); - }); - } - - /** - * Internal use only. - */ - public static JsonObject provideLangEntries() { - SharedText.gatherText(); - PonderTag.register(); - PonderIndex.register(); - - generateSceneLang(); - - JsonObject object = new JsonObject(); - recordGeneral(object); - record(Create.ID, object); - return object; - } - - public static void provideRegistrateLang(AbstractRegistrate registrate) { - generateSceneLang(); - - JsonObject object = new JsonObject(); - record(registrate.getModid(), object); - - for (Map.Entry entry : object.entrySet()) { - registrate.addRawLang(entry.getKey(), entry.getValue().getAsString()); - } - } - - // - - protected static String langKeyForShared(ResourceLocation k) { - return k.getNamespace() + "." + LANG_PREFIX + "shared." + k.getPath(); - } - - protected static String langKeyForTag(ResourceLocation k) { - return k.getNamespace() + "." + LANG_PREFIX + "tag." + k.getPath(); - } - - protected static String langKeyForTagDescription(ResourceLocation k) { - return k.getNamespace() + "." + LANG_PREFIX + "tag." + k.getPath() + ".description"; - } - - protected static String langKeyForChapter(ResourceLocation k) { - return k.getNamespace() + "." + LANG_PREFIX + "chapter." + k.getPath(); - } - - protected static String langKeyForSpecific(ResourceLocation sceneId, String k) { - return sceneId.getNamespace() + "." + LANG_PREFIX + sceneId.getPath() + "." + k; - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderPalette.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderPalette.java deleted file mode 100644 index cf79d4ba0b..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderPalette.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.simibubi.create.foundation.ponder; - -import com.simibubi.create.foundation.utility.Color; - -public enum PonderPalette { - - WHITE(0xFF_eeeeee), - BLACK(0xFF_221111), - - RED(0xFF_ff5d6c), - GREEN(0xFF_8cba51), - BLUE(0xFF_5f6caf), - - SLOW(0xFF_22ff22), - MEDIUM(0xFF_0084ff), - FAST(0xFF_ff55ff), - - INPUT(0xFF_7FCDE0), - OUTPUT(0xFF_DDC166), - - ; - - private final Color color; - - PonderPalette(int color) { - this.color = new Color(color); - } - - public int getColor() { - return color.getRGB(); - } - - public Color getColorObject() { - return color; - } -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistrationHelper.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistrationHelper.java deleted file mode 100644 index d17711d57d..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistrationHelper.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.simibubi.create.foundation.ponder; - -import java.util.Arrays; -import java.util.function.Consumer; - -import com.simibubi.create.foundation.ponder.PonderStoryBoardEntry.PonderStoryBoard; -import com.tterrag.registrate.util.entry.ItemProviderEntry; - -import net.minecraft.resources.ResourceLocation; - -public class PonderRegistrationHelper { - - protected String namespace; - - public PonderRegistrationHelper(String namespace) { - this.namespace = namespace; - } - - public PonderStoryBoardEntry addStoryBoard(ResourceLocation component, - ResourceLocation schematicLocation, PonderStoryBoard storyBoard, PonderTag... tags) { - PonderStoryBoardEntry entry = this.createStoryBoardEntry(storyBoard, schematicLocation, component); - entry.highlightTags(tags); - PonderRegistry.addStoryBoard(entry); - return entry; - } - - public PonderStoryBoardEntry addStoryBoard(ResourceLocation component, - String schematicPath, PonderStoryBoard storyBoard, PonderTag... tags) { - return addStoryBoard(component, asLocation(schematicPath), storyBoard, tags); - } - - public PonderStoryBoardEntry addStoryBoard(ItemProviderEntry component, - ResourceLocation schematicLocation, PonderStoryBoard storyBoard, PonderTag... tags) { - return addStoryBoard(component.getId(), schematicLocation, storyBoard, tags); - } - - public PonderStoryBoardEntry addStoryBoard(ItemProviderEntry component, - String schematicPath, PonderStoryBoard storyBoard, PonderTag... tags) { - return addStoryBoard(component, asLocation(schematicPath), storyBoard, tags); - } - - public MultiSceneBuilder forComponents(ItemProviderEntry... components) { - return new MultiSceneBuilder(Arrays.asList(components)); - } - - public MultiSceneBuilder forComponents(Iterable> components) { - return new MultiSceneBuilder(components); - } - - public PonderStoryBoardEntry createStoryBoardEntry(PonderStoryBoard storyBoard, ResourceLocation schematicLocation, ResourceLocation component) { - return new PonderStoryBoardEntry(storyBoard, namespace, schematicLocation, component); - } - - public PonderStoryBoardEntry createStoryBoardEntry(PonderStoryBoard storyBoard, String schematicPath, ResourceLocation component) { - return createStoryBoardEntry(storyBoard, asLocation(schematicPath), component); - } - - public PonderTag createTag(String name) { - return new PonderTag(asLocation(name)); - } - - public PonderChapter getOrCreateChapter(String name) { - return PonderChapter.of(asLocation(name)); - } - - public ResourceLocation asLocation(String path) { - return new ResourceLocation(namespace, path); - } - - public class MultiSceneBuilder { - - protected Iterable> components; - - protected MultiSceneBuilder(Iterable> components) { - this.components = components; - } - - public MultiSceneBuilder addStoryBoard(ResourceLocation schematicLocation, PonderStoryBoard storyBoard) { - return addStoryBoard(schematicLocation, storyBoard, $ -> { - }); - } - - public MultiSceneBuilder addStoryBoard(ResourceLocation schematicLocation, PonderStoryBoard storyBoard, PonderTag... tags) { - return addStoryBoard(schematicLocation, storyBoard, sb -> sb.highlightTags(tags)); - } - - public MultiSceneBuilder addStoryBoard(ResourceLocation schematicLocation, PonderStoryBoard storyBoard, - Consumer extras) { - components.forEach(c -> extras.accept(PonderRegistrationHelper.this.addStoryBoard(c, schematicLocation, storyBoard))); - return this; - } - - public MultiSceneBuilder addStoryBoard(String schematicPath, PonderStoryBoard storyBoard) { - return addStoryBoard(asLocation(schematicPath), storyBoard); - } - - public MultiSceneBuilder addStoryBoard(String schematicPath, PonderStoryBoard storyBoard, PonderTag... tags) { - return addStoryBoard(asLocation(schematicPath), storyBoard, tags); - } - - public MultiSceneBuilder addStoryBoard(String schematicPath, PonderStoryBoard storyBoard, - Consumer extras) { - return addStoryBoard(asLocation(schematicPath), storyBoard, extras); - } - - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java deleted file mode 100644 index 0bf8893c26..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java +++ /dev/null @@ -1,121 +0,0 @@ -package com.simibubi.create.foundation.ponder; - -import java.io.BufferedInputStream; -import java.io.DataInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.zip.GZIPInputStream; - -import com.simibubi.create.Create; -import com.simibubi.create.foundation.ponder.content.PonderIndex; -import com.simibubi.create.foundation.ponder.content.SharedText; - -import net.minecraft.client.Minecraft; -import net.minecraft.core.BlockPos; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.NbtAccounter; -import net.minecraft.nbt.NbtIo; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.packs.resources.Resource; -import net.minecraft.server.packs.resources.ResourceManager; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; -import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; - -public class PonderRegistry { - - public static final PonderTagRegistry TAGS = new PonderTagRegistry(); - public static final PonderChapterRegistry CHAPTERS = new PonderChapterRegistry(); - // Map from item IDs to storyboard entries - public static final Map> ALL = new HashMap<>(); - - public static void addStoryBoard(PonderStoryBoardEntry entry) { - synchronized (ALL) { - List list = ALL.computeIfAbsent(entry.getComponent(), $ -> new ArrayList<>()); - synchronized (list) { - list.add(entry); - } - } - } - - public static List compile(ResourceLocation id) { - List list = ALL.get(id); - if (list == null) { - return Collections.emptyList(); - } - return compile(list); - } - - public static List compile(PonderChapter chapter) { - List list = CHAPTERS.getStories(chapter); - if (list == null) { - return Collections.emptyList(); - } - return compile(list); - } - - public static List compile(List entries) { - if (PonderIndex.editingModeActive()) { - PonderLocalization.SHARED.clear(); - SharedText.gatherText(); - } - - List scenes = new ArrayList<>(); - - for (int i = 0; i < entries.size(); i++) { - PonderStoryBoardEntry sb = entries.get(i); - StructureTemplate activeTemplate = loadSchematic(sb.getSchematicLocation()); - PonderWorld world = new PonderWorld(BlockPos.ZERO, Minecraft.getInstance().level); - activeTemplate.placeInWorld(world, BlockPos.ZERO, BlockPos.ZERO, new StructurePlaceSettings(), world.random, Block.UPDATE_CLIENTS); - world.createBackup(); - PonderScene scene = compileScene(i, sb, world); - scene.begin(); - scenes.add(scene); - } - - return scenes; - } - - public static PonderScene compileScene(int i, PonderStoryBoardEntry sb, PonderWorld world) { - PonderScene scene = new PonderScene(world, sb.getNamespace(), sb.getComponent(), sb.getTags()); - SceneBuilder builder = scene.builder(); - sb.getBoard() - .program(builder, scene.getSceneBuildingUtil()); - return scene; - } - - public static StructureTemplate loadSchematic(ResourceLocation location) { - return loadSchematic(Minecraft.getInstance().getResourceManager(), location); - } - - public static StructureTemplate loadSchematic(ResourceManager resourceManager, ResourceLocation location) { - String namespace = location.getNamespace(); - String path = "ponder/" + location.getPath() + ".nbt"; - ResourceLocation location1 = new ResourceLocation(namespace, path); - - try (Resource resource = resourceManager.getResource(location1)) { - return loadSchematic(resource.getInputStream()); - } catch (FileNotFoundException e) { - Create.LOGGER.error("Ponder schematic missing: " + location1, e); - } catch (IOException e) { - Create.LOGGER.error("Failed to read ponder schematic: " + location1, e); - } - return new StructureTemplate(); - } - - public static StructureTemplate loadSchematic(InputStream resourceStream) throws IOException { - StructureTemplate t = new StructureTemplate(); - DataInputStream stream = - new DataInputStream(new BufferedInputStream(new GZIPInputStream(resourceStream))); - CompoundTag nbt = NbtIo.read(stream, new NbtAccounter(0x20000000L)); - t.load(nbt); - return t; - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java deleted file mode 100644 index 061b59b5df..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java +++ /dev/null @@ -1,589 +0,0 @@ -package com.simibubi.create.foundation.ponder; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.UUID; -import java.util.function.Consumer; -import java.util.function.Function; -import java.util.function.Supplier; - -import javax.annotation.Nullable; - -import org.apache.commons.lang3.mutable.MutableDouble; -import org.apache.commons.lang3.mutable.MutableObject; - -import com.jozufozu.flywheel.util.DiffuseLightCalculator; -import com.jozufozu.flywheel.util.transform.TransformStack; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.math.Matrix4f; -import com.mojang.math.Vector4f; -import com.simibubi.create.foundation.gui.UIRenderHelper; -import com.simibubi.create.foundation.ponder.content.PonderIndex; -import com.simibubi.create.foundation.ponder.element.PonderElement; -import com.simibubi.create.foundation.ponder.element.PonderOverlayElement; -import com.simibubi.create.foundation.ponder.element.PonderSceneElement; -import com.simibubi.create.foundation.ponder.element.WorldSectionElement; -import com.simibubi.create.foundation.ponder.instruction.HideAllInstruction; -import com.simibubi.create.foundation.ponder.instruction.PonderInstruction; -import com.simibubi.create.foundation.ponder.ui.PonderUI; -import com.simibubi.create.foundation.render.ForcedDiffuseState; -import com.simibubi.create.foundation.render.SuperRenderTypeBuffer; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.Pair; -import com.simibubi.create.foundation.utility.VecHelper; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; -import com.simibubi.create.foundation.utility.outliner.Outliner; - -import it.unimi.dsi.fastutil.ints.IntArrayList; -import it.unimi.dsi.fastutil.ints.IntList; -import net.minecraft.client.Camera; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.core.Direction.Axis; -import net.minecraft.core.Vec3i; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.decoration.ArmorStand; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.levelgen.structure.BoundingBox; -import net.minecraft.world.phys.BlockHitResult; -import net.minecraft.world.phys.Vec2; -import net.minecraft.world.phys.Vec3; - -public class PonderScene { - - public static final String TITLE_KEY = "header"; - - private boolean finished; -// private int sceneIndex; - private int textIndex; - ResourceLocation sceneId; - - private IntList keyframeTimes; - - List schedule; - private List activeSchedule; - private Map linkedElements; - private Set elements; - private List tags; - - private PonderWorld world; - private String namespace; - private ResourceLocation component; - private SceneTransform transform; - private SceneCamera camera; - private Outliner outliner; -// private String defaultTitle; - - private Vec3 pointOfInterest; - private Vec3 chasingPointOfInterest; - private WorldSectionElement baseWorldSection; - @Nullable - private Entity renderViewEntity; - - int basePlateOffsetX; - int basePlateOffsetZ; - int basePlateSize; - float scaleFactor; - float yOffset; - - private boolean stoppedCounting; - private int totalTime; - private int currentTime; - - public PonderScene(PonderWorld world, String namespace, ResourceLocation component, Collection tags) { - if (world != null) - world.scene = this; - - pointOfInterest = Vec3.ZERO; - textIndex = 1; - - this.world = world; - this.namespace = namespace; - this.component = component; - - outliner = new Outliner(); - elements = new HashSet<>(); - linkedElements = new HashMap<>(); - this.tags = new ArrayList<>(tags); - schedule = new ArrayList<>(); - activeSchedule = new ArrayList<>(); - transform = new SceneTransform(); - basePlateSize = getBounds().getXSpan(); - camera = new SceneCamera(); - baseWorldSection = new WorldSectionElement(); - renderViewEntity = world != null ? new ArmorStand(world, 0, 0, 0) : null; - keyframeTimes = new IntArrayList(4); - scaleFactor = 1; - yOffset = 0; - - setPointOfInterest(new Vec3(0, 4, 0)); - } - - public void deselect() { - forEach(WorldSectionElement.class, WorldSectionElement::resetSelectedBlock); - } - - public Pair rayTraceScene(Vec3 from, Vec3 to) { - MutableObject> nearestHit = new MutableObject<>(); - MutableDouble bestDistance = new MutableDouble(0); - - forEach(WorldSectionElement.class, wse -> { - wse.resetSelectedBlock(); - if (!wse.isVisible()) - return; - Pair rayTrace = wse.rayTrace(world, from, to); - if (rayTrace == null) - return; - double distanceTo = rayTrace.getFirst() - .distanceTo(from); - if (nearestHit.getValue() != null && distanceTo >= bestDistance.getValue()) - return; - - nearestHit.setValue(Pair.of(wse, rayTrace.getSecond())); - bestDistance.setValue(distanceTo); - }); - - if (nearestHit.getValue() == null) - return Pair.of(ItemStack.EMPTY, null); - - BlockPos selectedPos = nearestHit.getValue() - .getSecond(); - - BlockPos origin = new BlockPos(basePlateOffsetX, 0, basePlateOffsetZ); - if (!world.getBounds() - .isInside(selectedPos)) - return Pair.of(ItemStack.EMPTY, null); - if (BoundingBox.fromCorners(origin, origin.offset(new Vec3i(basePlateSize - 1, 0, basePlateSize - 1))) - .isInside(selectedPos)) { - if (PonderIndex.editingModeActive()) - nearestHit.getValue() - .getFirst() - .selectBlock(selectedPos); - return Pair.of(ItemStack.EMPTY, selectedPos); - } - - nearestHit.getValue() - .getFirst() - .selectBlock(selectedPos); - BlockState blockState = world.getBlockState(selectedPos); - ItemStack pickBlock = blockState.getCloneItemStack( - new BlockHitResult(VecHelper.getCenterOf(selectedPos), Direction.UP, selectedPos, true), world, selectedPos, - Minecraft.getInstance().player); - - return Pair.of(pickBlock, selectedPos); - } - - public void reset() { - currentTime = 0; - activeSchedule.clear(); - schedule.forEach(mdi -> mdi.reset(this)); - } - - public void begin() { - reset(); - forEach(pe -> pe.reset(this)); - - world.restore(); - elements.clear(); - linkedElements.clear(); - keyframeTimes.clear(); - - transform = new SceneTransform(); - finished = false; - setPointOfInterest(new Vec3(0, 4, 0)); - - baseWorldSection.setEmpty(); - baseWorldSection.forceApplyFade(1); - elements.add(baseWorldSection); - - totalTime = 0; - stoppedCounting = false; - activeSchedule.addAll(schedule); - activeSchedule.forEach(i -> i.onScheduled(this)); - } - - public WorldSectionElement getBaseWorldSection() { - return baseWorldSection; - } - - public float getSceneProgress() { - return totalTime == 0 ? 0 : currentTime / (float) totalTime; - } - - public void fadeOut() { - reset(); - activeSchedule.add(new HideAllInstruction(10, null)); - } - - public void renderScene(SuperRenderTypeBuffer buffer, PoseStack ms, float pt) { - ForcedDiffuseState.pushCalculator(DiffuseLightCalculator.DEFAULT); - ms.pushPose(); - Minecraft mc = Minecraft.getInstance(); - Entity prevRVE = mc.cameraEntity; - - mc.cameraEntity = this.renderViewEntity; - forEachVisible(PonderSceneElement.class, e -> e.renderFirst(world, buffer, ms, pt)); - mc.cameraEntity = prevRVE; - - for (RenderType type : RenderType.chunkBufferLayers()) - forEachVisible(PonderSceneElement.class, e -> e.renderLayer(world, buffer, type, ms, pt)); - - forEachVisible(PonderSceneElement.class, e -> e.renderLast(world, buffer, ms, pt)); - camera.set(transform.xRotation.getValue(pt) + 90, transform.yRotation.getValue(pt) + 180); - world.renderEntities(ms, buffer, camera, pt); - world.renderParticles(ms, buffer, camera, pt); - outliner.renderOutlines(ms, buffer, pt); - - ms.popPose(); - ForcedDiffuseState.popCalculator(); - } - - public void renderOverlay(PonderUI screen, PoseStack ms, float partialTicks) { - ms.pushPose(); - forEachVisible(PonderOverlayElement.class, e -> e.render(this, screen, ms, partialTicks)); - ms.popPose(); - } - - public void setPointOfInterest(Vec3 poi) { - if (chasingPointOfInterest == null) - pointOfInterest = poi; - chasingPointOfInterest = poi; - } - - public Vec3 getPointOfInterest() { - return pointOfInterest; - } - - public void tick() { - if (chasingPointOfInterest != null) - pointOfInterest = VecHelper.lerp(.25f, pointOfInterest, chasingPointOfInterest); - - outliner.tickOutlines(); - world.tick(); - transform.tick(); - forEach(e -> e.tick(this)); - - if (currentTime < totalTime) - currentTime++; - - for (Iterator iterator = activeSchedule.iterator(); iterator.hasNext();) { - PonderInstruction instruction = iterator.next(); - instruction.tick(this); - if (instruction.isComplete()) { - iterator.remove(); - if (instruction.isBlocking()) - break; - continue; - } - if (instruction.isBlocking()) - break; - } - - if (activeSchedule.isEmpty()) - finished = true; - } - - public void seekToTime(int time) { - if (time < currentTime) - throw new IllegalStateException("Cannot seek backwards. Rewind first."); - - while (currentTime < time && !finished) { - forEach(e -> e.whileSkipping(this)); - tick(); - } - - forEach(WorldSectionElement.class, WorldSectionElement::queueRedraw); - } - - public void addToSceneTime(int time) { - if (!stoppedCounting) - totalTime += time; - } - - public void stopCounting() { - stoppedCounting = true; - } - - public void markKeyframe(int offset) { - if (!stoppedCounting) - keyframeTimes.add(totalTime + offset); - } - - public void addElement(PonderElement e) { - elements.add(e); - } - - public void linkElement(E e, ElementLink link) { - linkedElements.put(link.getId(), e); - } - - public E resolve(ElementLink link) { - return link.cast(linkedElements.get(link.getId())); - } - - public void runWith(ElementLink link, Consumer callback) { - callback.accept(resolve(link)); - } - - public F applyTo(ElementLink link, Function function) { - return function.apply(resolve(link)); - } - - public void forEach(Consumer function) { - for (PonderElement elemtent : elements) - function.accept(elemtent); - } - - public void forEach(Class type, Consumer function) { - for (PonderElement element : elements) - if (type.isInstance(element)) - function.accept(type.cast(element)); - } - - public void forEachVisible(Class type, Consumer function) { - for (PonderElement element : elements) - if (type.isInstance(element) && element.isVisible()) - function.accept(type.cast(element)); - } - - public void forEachWorldEntity(Class type, Consumer function) { - world.getEntityStream() - .filter(type::isInstance) - .map(type::cast) - .forEach(function); - /* - * for (Entity element : world.getEntities()) { if (type.isInstance(element)) - * function.accept(type.cast(element)); } - */ - } - - public Supplier registerText(String defaultText) { - final String key = "text_" + textIndex; - PonderLocalization.registerSpecific(sceneId, key, defaultText); - Supplier supplier = () -> PonderLocalization.getSpecific(sceneId, key); - textIndex++; - return supplier; - } - - public SceneBuilder builder() { - return new SceneBuilder(this); - } - - public SceneBuildingUtil getSceneBuildingUtil() { - return new SceneBuildingUtil(getBounds()); - } - - public String getTitle() { - return getString(TITLE_KEY); - } - - public String getString(String key) { - return PonderLocalization.getSpecific(sceneId, key); - } - - public PonderWorld getWorld() { - return world; - } - - public String getNamespace() { - return namespace; - } - - public int getKeyframeCount() { - return keyframeTimes.size(); - } - - public int getKeyframeTime(int index) { - return keyframeTimes.getInt(index); - } - - public List getTags() { - return tags; - } - - public ResourceLocation getComponent() { - return component; - } - - public Set getElements() { - return elements; - } - - public BoundingBox getBounds() { - return world == null ? new BoundingBox(BlockPos.ZERO) : world.getBounds(); - } - - public ResourceLocation getId() { - return sceneId; - } - - public SceneTransform getTransform() { - return transform; - } - - public Outliner getOutliner() { - return outliner; - } - - public boolean isFinished() { - return finished; - } - - public void setFinished(boolean finished) { - this.finished = finished; - } - - public int getBasePlateOffsetX() { - return basePlateOffsetX; - } - - public int getBasePlateOffsetZ() { - return basePlateOffsetZ; - } - - public int getBasePlateSize() { - return basePlateSize; - } - - public float getYOffset() { - return yOffset; - } - - public int getTotalTime() { - return totalTime; - } - - public int getCurrentTime() { - return currentTime; - } - - public class SceneTransform { - - public LerpedFloat xRotation, yRotation; - - // Screen params - private int width, height; - private double offset; - private Matrix4f cachedMat; - - public SceneTransform() { - xRotation = LerpedFloat.angular() - .disableSmartAngleChasing() - .startWithValue(-35); - yRotation = LerpedFloat.angular() - .disableSmartAngleChasing() - .startWithValue(55 + 90); - } - - public void tick() { - xRotation.tickChaser(); - yRotation.tickChaser(); - } - - public void updateScreenParams(int width, int height, double offset) { - this.width = width; - this.height = height; - this.offset = offset; - cachedMat = null; - } - - public PoseStack apply(PoseStack ms) { - return apply(ms, AnimationTickHolder.getPartialTicks(world), false); - } - - public PoseStack apply(PoseStack ms, float pt, boolean overlayCompatible) { - ms.translate(width / 2, height / 2, 200 + offset); - - TransformStack.cast(ms) - .rotateX(-35) - .rotateY(55) - .translate(offset, 0, 0) - .rotateY(-55) - .rotateX(35) - .rotateX(xRotation.getValue(pt)) - .rotateY(yRotation.getValue(pt)); - - float f = 30 * scaleFactor; - - if (!overlayCompatible) { - UIRenderHelper.flipForGuiRender(ms); - ms.scale(f, f, f); - ms.translate((basePlateSize + basePlateOffsetX) / -2f, -1f + yOffset, - (basePlateSize + basePlateOffsetZ) / -2f); - } else { - // For block breaking overlay; Don't ask - ms.scale(f, f, f); - if (f == 30) - ms.translate(0.525, .2975, .9); - ms.translate((basePlateSize + basePlateOffsetX) / -2f, -yOffset, - (basePlateSize + basePlateOffsetZ) / -2f); - float y = (float) (0.5065 * Math.pow(2.2975, Math.log(1 / scaleFactor) / Math.log(2))) / 30; - ms.scale(y, -y, -y); - } - - return ms; - } - - public void updateSceneRVE(float pt) { - Vec3 v = screenToScene(width / 2, height / 2, 500, pt); - if (renderViewEntity != null) - renderViewEntity.setPos(v.x, v.y, v.z); - } - - public Vec3 screenToScene(double x, double y, int depth, float pt) { - refreshMatrix(pt); - Vec3 vec = new Vec3(x, y, depth); - - vec = vec.subtract(width / 2, height / 2, 200 + offset); - vec = VecHelper.rotate(vec, 35, Axis.X); - vec = VecHelper.rotate(vec, -55, Axis.Y); - vec = vec.subtract(offset, 0, 0); - vec = VecHelper.rotate(vec, 55, Axis.Y); - vec = VecHelper.rotate(vec, -35, Axis.X); - vec = VecHelper.rotate(vec, -xRotation.getValue(pt), Axis.X); - vec = VecHelper.rotate(vec, -yRotation.getValue(pt), Axis.Y); - - float f = 1f / (30 * scaleFactor); - - vec = vec.multiply(f, -f, f); - vec = vec.subtract((basePlateSize + basePlateOffsetX) / -2f, -1f + yOffset, - (basePlateSize + basePlateOffsetZ) / -2f); - - return vec; - } - - public Vec2 sceneToScreen(Vec3 vec, float pt) { - refreshMatrix(pt); - Vector4f vec4 = new Vector4f((float) vec.x, (float) vec.y, (float) vec.z, 1); - vec4.transform(cachedMat); - return new Vec2(vec4.x(), vec4.y()); - } - - protected void refreshMatrix(float pt) { - if (cachedMat != null) - return; - cachedMat = apply(new PoseStack(), pt, false).last() - .pose(); - } - - } - - public class SceneCamera extends Camera { - - public void set(float xRotation, float yRotation) { - setRotation(yRotation, xRotation); - } - - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderStoryBoardEntry.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderStoryBoardEntry.java deleted file mode 100644 index 5936c44834..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderStoryBoardEntry.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.simibubi.create.foundation.ponder; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import net.minecraft.resources.ResourceLocation; - -public class PonderStoryBoardEntry { - - private final PonderStoryBoard board; - private final String namespace; - private final ResourceLocation schematicLocation; - private final ResourceLocation component; - private final List tags; - - public PonderStoryBoardEntry(PonderStoryBoard board, String namespace, ResourceLocation schematicLocation, ResourceLocation component) { - this.board = board; - this.namespace = namespace; - this.schematicLocation = schematicLocation; - this.component = component; - this.tags = new ArrayList<>(); - } - - public PonderStoryBoardEntry(PonderStoryBoard board, String namespace, String schematicPath, ResourceLocation component) { - this(board, namespace, new ResourceLocation(namespace, schematicPath), component); - } - - public PonderStoryBoard getBoard() { - return board; - } - - public String getNamespace() { - return namespace; - } - - public ResourceLocation getSchematicLocation() { - return schematicLocation; - } - - public ResourceLocation getComponent() { - return component; - } - - public List getTags() { - return tags; - } - - // Builder start - - public PonderStoryBoardEntry highlightTag(PonderTag tag) { - tags.add(tag); - return this; - } - - public PonderStoryBoardEntry highlightTags(PonderTag... tags) { - Collections.addAll(this.tags, tags); - return this; - } - - public PonderStoryBoardEntry highlightAllTags() { - tags.add(PonderTag.Highlight.ALL); - return this; - } - - public PonderStoryBoardEntry chapter(PonderChapter chapter) { - PonderRegistry.CHAPTERS.addStoriesToChapter(chapter, this); - return this; - } - - public PonderStoryBoardEntry chapters(PonderChapter... chapters) { - for (PonderChapter c : chapters) - chapter(c); - return this; - } - - // Builder end - - @FunctionalInterface - public interface PonderStoryBoard { - void program(SceneBuilder scene, SceneBuildingUtil util); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderTag.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderTag.java deleted file mode 100644 index 3d3d5932a4..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderTag.java +++ /dev/null @@ -1,184 +0,0 @@ -package com.simibubi.create.foundation.ponder; - -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.Create; -import com.simibubi.create.foundation.gui.element.GuiGameElement; -import com.simibubi.create.foundation.gui.element.ScreenElement; - -import net.minecraft.client.gui.GuiComponent; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; -import net.minecraft.world.level.ItemLike; -import net.minecraft.world.level.block.Blocks; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; - -public class PonderTag implements ScreenElement { - - public static final PonderTag - - KINETIC_RELAYS = create("kinetic_relays").item(AllBlocks.COGWHEEL.get(), true, false) - .defaultLang("Kinetic Blocks", "Components which help relaying Rotational Force elsewhere") - .addToIndex(), - - KINETIC_SOURCES = create("kinetic_sources").item(AllBlocks.WATER_WHEEL.get(), true, false) - .defaultLang("Kinetic Sources", "Components which generate Rotational Force") - .addToIndex(), - - KINETIC_APPLIANCES = create("kinetic_appliances").item(AllBlocks.MECHANICAL_PRESS.get(), true, false) - .defaultLang("Kinetic Appliances", "Components which make use of Rotational Force") - .addToIndex(), - - FLUIDS = create("fluids").item(AllBlocks.FLUID_PIPE.get(), true, false) - .defaultLang("Fluid Manipulators", "Components which help relaying and making use of Fluids") - .addToIndex(), - - LOGISTICS = create("logistics").item(Blocks.CHEST, true, false) - .defaultLang("Item Transportation", "Components which help moving items around") - .addToIndex(), - - REDSTONE = create("redstone").item(Items.REDSTONE, true, false) - .defaultLang("Logic Components", "Components which help with redstone engineering") - .addToIndex(), - - DECORATION = create("decoration").item(Items.ROSE_BUSH, true, false) - .defaultLang("Aesthetics", "Components used mostly for decorative purposes"), - - CREATIVE = create("creative").item(AllBlocks.CREATIVE_CRATE.get(), true, false) - .defaultLang("Creative Mode", "Components not usually available for Survival Mode") - .addToIndex(), - - MOVEMENT_ANCHOR = create("movement_anchor").item(AllBlocks.MECHANICAL_PISTON.get(), true, false) - .defaultLang("Movement Anchors", - "Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways") - .addToIndex(), - - CONTRAPTION_ACTOR = create("contraption_actor").item(AllBlocks.MECHANICAL_HARVESTER.get(), true, false) - .defaultLang("Contraption Actors", - "Components which expose special behaviour when attached to a moving contraption") - .addToIndex(), - - CONTRAPTION_ASSEMBLY = create("contraption_assembly").item(AllItems.SUPER_GLUE.get(), true, false) - .defaultLang("Block Attachment Utility", - "Tools and Components used to assemble structures moved as an animated Contraption") - .addToIndex(), - - SAILS = create("windmill_sails").item(AllBlocks.WINDMILL_BEARING.get()) - .defaultLang("Sails for Windmill Bearings", - "Blocks that count towards the strength of a Windmill Contraption when assembled. Each of these have equal efficiency in doing so."), - - ARM_TARGETS = create("arm_targets").item(AllBlocks.MECHANICAL_ARM.get()) - .defaultLang("Targets for Mechanical Arms", - "Components which can be selected as inputs or outputs to the Mechanical Arm"), - - TRAIN_RELATED = create("train_related").item(AllBlocks.TRACK.get()) - .defaultLang("Railway Equipment", "Components used in the construction or management of Train Contraptions") - .addToIndex(), - - DISPLAY_SOURCES = create("display_sources").item(AllBlocks.DISPLAY_LINK.get(), true, false) - .item(AllBlocks.DISPLAY_LINK.get(), false, true) - .defaultLang("Sources for Display Links", - "Components or Blocks which offer some data that can be read with a Display Link"), - - DISPLAY_TARGETS = create("display_targets").item(AllBlocks.DISPLAY_LINK.get(), true, false) - .item(AllBlocks.DISPLAY_LINK.get(), false, true) - .defaultLang("Targets for Display Links", - "Components or Blocks which can process and display the data received from a Display Link"); - - public static class Highlight { - public static final PonderTag ALL = create("_all"); - } - - private final ResourceLocation id; - private ResourceLocation icon; - private ItemStack itemIcon = ItemStack.EMPTY; - private ItemStack mainItem = ItemStack.EMPTY; - - public PonderTag(ResourceLocation id) { - this.id = id; - } - - public ResourceLocation getId() { - return id; - } - - public ItemStack getMainItem() { - return mainItem; - } - - public String getTitle() { - return PonderLocalization.getTag(id); - } - - public String getDescription() { - return PonderLocalization.getTagDescription(id); - } - - // Builder - - public PonderTag defaultLang(String title, String description) { - PonderLocalization.registerTag(id, title, description); - return this; - } - - public PonderTag addToIndex() { - PonderRegistry.TAGS.listTag(this); - return this; - } - - public PonderTag icon(ResourceLocation location) { - this.icon = new ResourceLocation(location.getNamespace(), "textures/ponder/tag/" + location.getPath() + ".png"); - return this; - } - - public PonderTag icon(String location) { - this.icon = new ResourceLocation(id.getNamespace(), "textures/ponder/tag/" + location + ".png"); - return this; - } - - public PonderTag idAsIcon() { - return icon(id); - } - - public PonderTag item(ItemLike item, boolean useAsIcon, boolean useAsMainItem) { - if (useAsIcon) - this.itemIcon = new ItemStack(item); - if (useAsMainItem) - this.mainItem = new ItemStack(item); - return this; - } - - public PonderTag item(ItemLike item) { - return this.item(item, true, true); - } - - @Override - @OnlyIn(Dist.CLIENT) - public void render(PoseStack ms, int x, int y) { - ms.pushPose(); - ms.translate(x, y, 0); - if (icon != null) { - RenderSystem.setShaderTexture(0, icon); - ms.scale(0.25f, 0.25f, 1); - GuiComponent.blit(ms, 0, 0, 0, 0, 0, 64, 64, 64, 64); - } else if (!itemIcon.isEmpty()) { - ms.translate(-4, -4, 0); - ms.scale(1.5f, 1.5f, 1.5f); - GuiGameElement.of(itemIcon) - .render(ms); - } - ms.popPose(); - } - - private static PonderTag create(String id) { - return new PonderTag(Create.asResource(id)); - } - - // Load class - public static void register() {} - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderTagRegistry.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderTagRegistry.java deleted file mode 100644 index cad0c1babf..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderTagRegistry.java +++ /dev/null @@ -1,122 +0,0 @@ -package com.simibubi.create.foundation.ponder; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.LinkedHashMultimap; -import com.google.common.collect.Multimap; -import com.tterrag.registrate.util.entry.ItemProviderEntry; - -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.ItemLike; - -public class PonderTagRegistry { - - private final Multimap tags; - private final Multimap chapterTags; - - private final List listedTags; - - public PonderTagRegistry() { - tags = LinkedHashMultimap.create(); - chapterTags = LinkedHashMultimap.create(); - listedTags = new ArrayList<>(); - } - - public Set getTags(ResourceLocation item) { - return ImmutableSet.copyOf(tags.get(item)); - } - - public Set getTags(PonderChapter chapter) { - return ImmutableSet.copyOf(chapterTags.get(chapter)); - } - - public Set getItems(PonderTag tag) { - return tags.entries() - .stream() - .filter(e -> e.getValue() == tag) - .map(Map.Entry::getKey) - .collect(ImmutableSet.toImmutableSet()); - } - - public Set getChapters(PonderTag tag) { - return chapterTags.entries() - .stream() - .filter(e -> e.getValue() == tag) - .map(Map.Entry::getKey) - .collect(ImmutableSet.toImmutableSet()); - } - - public List getListedTags() { - return listedTags; - } - - public void listTag(PonderTag tag) { - listedTags.add(tag); - } - - public void add(PonderTag tag, ResourceLocation item) { - synchronized (tags) { - tags.put(item, tag); - } - } - - public void add(PonderTag tag, PonderChapter chapter) { - synchronized (chapterTags) { - chapterTags.put(chapter, tag); - } - } - - public ItemBuilder forItems(ResourceLocation... items) { - return new ItemBuilder(items); - } - - public TagBuilder forTag(PonderTag tag) { - return new TagBuilder(tag); - } - - public class ItemBuilder { - - private final Collection items; - - private ItemBuilder(ResourceLocation... items) { - this.items = Arrays.asList(items); - } - - public ItemBuilder add(PonderTag tag) { - items.forEach(i -> PonderTagRegistry.this.add(tag, i)); - return this; - } - - } - - public class TagBuilder { - - private final PonderTag tag; - - private TagBuilder(PonderTag tag) { - this.tag = tag; - } - - public TagBuilder add(ResourceLocation item) { - PonderTagRegistry.this.add(tag, item); - return this; - } - - public TagBuilder add(ItemLike item) { - return add(item.asItem() - .getRegistryName()); - } - - public TagBuilder add(ItemProviderEntry entry) { - return add(entry.get()); - } - - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderTooltipHandler.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderTooltipHandler.java deleted file mode 100644 index cf22e348c9..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderTooltipHandler.java +++ /dev/null @@ -1,178 +0,0 @@ -package com.simibubi.create.foundation.ponder; - -import java.util.List; - -import com.google.common.base.Strings; -import com.mojang.blaze3d.platform.InputConstants; -import com.simibubi.create.foundation.gui.ScreenOpener; -import com.simibubi.create.foundation.ponder.ui.NavigatableSimiScreen; -import com.simibubi.create.foundation.ponder.ui.PonderUI; -import com.simibubi.create.foundation.utility.Color; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; - -import net.minecraft.ChatFormatting; -import net.minecraft.client.KeyMapping; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.Font; -import net.minecraft.client.gui.screens.Screen; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.MutableComponent; -import net.minecraft.network.chat.TextComponent; -import net.minecraft.world.item.ItemStack; -import net.minecraftforge.client.event.RenderTooltipEvent; - -public class PonderTooltipHandler { - - public static boolean enable = true; - - static LerpedFloat holdWProgress = LerpedFloat.linear() - .startWithValue(0); - static ItemStack hoveredStack = ItemStack.EMPTY; - static ItemStack trackingStack = ItemStack.EMPTY; - static boolean subject = false; - static boolean deferTick = false; - - public static final String HOLD_TO_PONDER = PonderLocalization.LANG_PREFIX + "hold_to_ponder"; - public static final String SUBJECT = PonderLocalization.LANG_PREFIX + "subject"; - - public static void tick() { - deferTick = true; - } - - public static void deferredTick() { - deferTick = false; - Minecraft instance = Minecraft.getInstance(); - Screen currentScreen = instance.screen; - - if (hoveredStack.isEmpty() || trackingStack.isEmpty()) { - trackingStack = ItemStack.EMPTY; - holdWProgress.startWithValue(0); - return; - } - - float value = holdWProgress.getValue(); - int keyCode = ponderKeybind().getKey() - .getValue(); - long window = instance.getWindow() - .getWindow(); - - if (!subject && InputConstants.isKeyDown(window, keyCode)) { - if (value >= 1) { - if (currentScreen instanceof NavigatableSimiScreen) - ((NavigatableSimiScreen) currentScreen).centerScalingOnMouse(); - ScreenOpener.transitionTo(PonderUI.of(trackingStack)); - holdWProgress.startWithValue(0); - return; - } - holdWProgress.setValue(Math.min(1, value + Math.max(.25f, value) * .25f)); - } else - holdWProgress.setValue(Math.max(0, value - .05f)); - - hoveredStack = ItemStack.EMPTY; - } - - public static void addToTooltip(List toolTip, ItemStack stack) { - if (!enable) - return; - - updateHovered(stack); - - if (deferTick) - deferredTick(); - - if (trackingStack != stack) - return; - - float renderPartialTicks = Minecraft.getInstance() - .getFrameTime(); - Component component = subject ? Lang.translateDirect(SUBJECT) - .withStyle(ChatFormatting.GREEN) - : makeProgressBar(Math.min(1, holdWProgress.getValue(renderPartialTicks) * 8 / 7f)); - if (toolTip.size() < 2) - toolTip.add(component); - else - toolTip.add(1, component); - } - - protected static void updateHovered(ItemStack stack) { - Minecraft instance = Minecraft.getInstance(); - Screen currentScreen = instance.screen; - boolean inPonderUI = currentScreen instanceof PonderUI; - - ItemStack prevStack = trackingStack; - hoveredStack = ItemStack.EMPTY; - subject = false; - - if (inPonderUI) { - PonderUI ponderUI = (PonderUI) currentScreen; - if (stack.sameItem(ponderUI.getSubject())) - subject = true; - } - - if (stack.isEmpty()) - return; - if (!PonderRegistry.ALL.containsKey(stack.getItem() - .getRegistryName())) - return; - - if (prevStack.isEmpty() || !prevStack.sameItem(stack)) - holdWProgress.startWithValue(0); - - hoveredStack = stack; - trackingStack = stack; - } - - public static void handleTooltipColor(RenderTooltipEvent.Color event) { - if (trackingStack != event.getItemStack()) - return; - if (holdWProgress.getValue() == 0) - return; - float renderPartialTicks = Minecraft.getInstance() - .getFrameTime(); - int start = event.getOriginalBorderStart(); - int end = event.getOriginalBorderEnd(); - float progress = Math.min(1, holdWProgress.getValue(renderPartialTicks) * 8 / 7f); - - start = getSmoothColorForProgress(progress); - end = getSmoothColorForProgress((progress)); - - event.setBorderStart(start | 0xa0000000); - event.setBorderEnd(end | 0xa0000000); - } - - private static int getSmoothColorForProgress(float progress) { - if (progress < .5f) - return Color.mixColors(0x5000FF, 5592575, progress * 2); - return Color.mixColors(5592575, 0xffffff, (progress - .5f) * 2); - } - - private static Component makeProgressBar(float progress) { - MutableComponent holdW = Lang - .translateDirect(HOLD_TO_PONDER, - ((MutableComponent) ponderKeybind().getTranslatedKeyMessage()).withStyle(ChatFormatting.GRAY)) - .withStyle(ChatFormatting.DARK_GRAY); - - Font fontRenderer = Minecraft.getInstance().font; - float charWidth = fontRenderer.width("|"); - float tipWidth = fontRenderer.width(holdW); - - int total = (int) (tipWidth / charWidth); - int current = (int) (progress * total); - - if (progress > 0) { - String bars = ""; - bars += ChatFormatting.GRAY + Strings.repeat("|", current); - if (progress < 1) - bars += ChatFormatting.DARK_GRAY + Strings.repeat("|", total - current); - return new TextComponent(bars); - } - - return holdW; - } - - protected static KeyMapping ponderKeybind() { - return Minecraft.getInstance().options.keyUp; - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java deleted file mode 100644 index a81424f726..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java +++ /dev/null @@ -1,355 +0,0 @@ -package com.simibubi.create.foundation.ponder; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.function.Supplier; - -import javax.annotation.Nullable; - -import com.google.common.base.Suppliers; -import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.content.contraptions.relays.belt.BeltBlock; -import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; -import com.simibubi.create.content.schematics.SchematicWorld; -import com.simibubi.create.foundation.mixin.accessor.ParticleEngineAccessor; -import com.simibubi.create.foundation.ponder.element.WorldSectionElement; -import com.simibubi.create.foundation.render.SuperRenderTypeBuffer; -import com.simibubi.create.foundation.tileEntity.IMultiTileContainer; -import com.simibubi.create.foundation.tileEntity.SmartTileEntity; -import com.simibubi.create.foundation.utility.worldWrappers.WrappedClientWorld; - -import net.minecraft.client.Camera; -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.client.particle.Particle; -import net.minecraft.client.particle.ParticleProvider; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.entity.EntityRenderDispatcher; -import net.minecraft.core.BlockPos; -import net.minecraft.core.particles.BlockParticleOption; -import net.minecraft.core.particles.ParticleOptions; -import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.Mth; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.inventory.InventoryMenu; -import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.LightLayer; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.AABB; -import net.minecraft.world.phys.Vec3; -import net.minecraft.world.phys.shapes.VoxelShape; -import net.minecraftforge.registries.ForgeRegistries; - -public class PonderWorld extends SchematicWorld { - - public PonderScene scene; - - protected Map originalBlocks; - protected Map originalTileEntities; - protected Map blockBreakingProgressions; - protected List originalEntities; - private Supplier asClientWorld = Suppliers.memoize(() -> WrappedClientWorld.of(this)); - - protected PonderWorldParticles particles; - private final Map> particleProviders; - - int overrideLight; - Selection mask; - - public PonderWorld(BlockPos anchor, Level original) { - super(anchor, original); - originalBlocks = new HashMap<>(); - originalTileEntities = new HashMap<>(); - blockBreakingProgressions = new HashMap<>(); - originalEntities = new ArrayList<>(); - particles = new PonderWorldParticles(this); - particleProviders = ((ParticleEngineAccessor) Minecraft.getInstance().particleEngine).create$getProviders(); - } - - public void createBackup() { - originalBlocks.clear(); - originalTileEntities.clear(); - blocks.forEach((k, v) -> originalBlocks.put(k, v)); - tileEntities.forEach( - (k, v) -> originalTileEntities.put(k, BlockEntity.loadStatic(k, blocks.get(k), v.saveWithFullMetadata()))); - entities.forEach(e -> EntityType.create(e.serializeNBT(), this) - .ifPresent(originalEntities::add)); - } - - public void restore() { - entities.clear(); - blocks.clear(); - tileEntities.clear(); - blockBreakingProgressions.clear(); - renderedTileEntities.clear(); - originalBlocks.forEach((k, v) -> blocks.put(k, v)); - originalTileEntities.forEach((k, v) -> { - BlockEntity te = BlockEntity.loadStatic(k, originalBlocks.get(k), v.saveWithFullMetadata()); - onTEadded(te, te.getBlockPos()); - tileEntities.put(k, te); - renderedTileEntities.add(te); - }); - originalEntities.forEach(e -> EntityType.create(e.serializeNBT(), this) - .ifPresent(entities::add)); - particles.clearEffects(); - fixControllerTileEntities(); - } - - public void restoreBlocks(Selection selection) { - selection.forEach(p -> { - if (originalBlocks.containsKey(p)) - blocks.put(p, originalBlocks.get(p)); - if (originalTileEntities.containsKey(p)) { - BlockEntity te = BlockEntity.loadStatic(p, originalBlocks.get(p), originalTileEntities.get(p) - .saveWithFullMetadata()); - onTEadded(te, te.getBlockPos()); - tileEntities.put(p, te); - } - }); - redraw(); - } - - private void redraw() { - if (scene != null) - scene.forEach(WorldSectionElement.class, WorldSectionElement::queueRedraw); - } - - public void pushFakeLight(int light) { - this.overrideLight = light; - } - - public void popLight() { - this.overrideLight = -1; - } - - @Override - public int getBrightness(LightLayer p_226658_1_, BlockPos p_226658_2_) { - return overrideLight == -1 ? 15 : overrideLight; - } - - public void setMask(Selection mask) { - this.mask = mask; - } - - public void clearMask() { - this.mask = null; - } - - @Override - public BlockState getBlockState(BlockPos globalPos) { - if (mask != null && !mask.test(globalPos.subtract(anchor))) - return Blocks.AIR.defaultBlockState(); - return super.getBlockState(globalPos); - } - - @Override // For particle collision - public BlockGetter getChunkForCollisions(int p_225522_1_, int p_225522_2_) { - return this; - } - - public void renderEntities(PoseStack ms, SuperRenderTypeBuffer buffer, Camera ari, float pt) { - Vec3 Vector3d = ari.getPosition(); - double d0 = Vector3d.x(); - double d1 = Vector3d.y(); - double d2 = Vector3d.z(); - - for (Entity entity : entities) { - if (entity.tickCount == 0) { - entity.xOld = entity.getX(); - entity.yOld = entity.getY(); - entity.zOld = entity.getZ(); - } - renderEntity(entity, d0, d1, d2, pt, ms, buffer); - } - - buffer.draw(RenderType.entitySolid(InventoryMenu.BLOCK_ATLAS)); - buffer.draw(RenderType.entityCutout(InventoryMenu.BLOCK_ATLAS)); - buffer.draw(RenderType.entityCutoutNoCull(InventoryMenu.BLOCK_ATLAS)); - buffer.draw(RenderType.entitySmoothCutout(InventoryMenu.BLOCK_ATLAS)); - } - - private void renderEntity(Entity entity, double x, double y, double z, float pt, PoseStack ms, - MultiBufferSource buffer) { - double d0 = Mth.lerp((double) pt, entity.xOld, entity.getX()); - double d1 = Mth.lerp((double) pt, entity.yOld, entity.getY()); - double d2 = Mth.lerp((double) pt, entity.zOld, entity.getZ()); - float f = Mth.lerp(pt, entity.yRotO, entity.getYRot()); - EntityRenderDispatcher renderManager = Minecraft.getInstance() - .getEntityRenderDispatcher(); - int light = renderManager.getRenderer(entity) - .getPackedLightCoords(entity, pt); - renderManager.render(entity, d0 - x, d1 - y, d2 - z, f, pt, ms, buffer, light); - } - - public void renderParticles(PoseStack ms, MultiBufferSource buffer, Camera ari, float pt) { - particles.renderParticles(ms, buffer, ari, pt); - } - - public void tick() { - particles.tick(); - - for (Iterator iterator = entities.iterator(); iterator.hasNext();) { - Entity entity = iterator.next(); - - entity.tickCount++; - entity.xOld = entity.getX(); - entity.yOld = entity.getY(); - entity.zOld = entity.getZ(); - entity.tick(); - - if (entity.getY() <= -.5f) - entity.discard(); - - if (!entity.isAlive()) - iterator.remove(); - } - } - - @Override - public void addParticle(ParticleOptions data, double x, double y, double z, double mx, double my, double mz) { - addParticle(makeParticle(data, x, y, z, mx, my, mz)); - } - - @Override - public void addAlwaysVisibleParticle(ParticleOptions data, double x, double y, double z, double mx, double my, double mz) { - addParticle(data, x, y, z, mx, my, mz); - } - - @Nullable - @SuppressWarnings("unchecked") - private Particle makeParticle(T data, double x, double y, double z, double mx, double my, - double mz) { - ResourceLocation key = ForgeRegistries.PARTICLE_TYPES.getKey(data.getType()); - ParticleProvider particleProvider = (ParticleProvider) particleProviders.get(key); - return particleProvider == null ? null - : particleProvider.createParticle(data, asClientWorld.get(), x, y, z, mx, my, mz); - } - - @Override - public boolean setBlock(BlockPos pos, BlockState arg1, int arg2) { - return super.setBlock(pos, arg1, arg2); - } - - public void addParticle(Particle p) { - if (p != null) - particles.addParticle(p); - } - - @Override - protected void onTEadded(BlockEntity tileEntity, BlockPos pos) { - super.onTEadded(tileEntity, pos); - if (!(tileEntity instanceof SmartTileEntity)) - return; - SmartTileEntity smartTileEntity = (SmartTileEntity) tileEntity; - smartTileEntity.markVirtual(); - } - - public void fixControllerTileEntities() { - for (BlockEntity tileEntity : tileEntities.values()) { - - if (tileEntity instanceof BeltTileEntity) { - BeltTileEntity beltTileEntity = (BeltTileEntity) tileEntity; - if (!beltTileEntity.isController()) - continue; - BlockPos controllerPos = tileEntity.getBlockPos(); - for (BlockPos blockPos : BeltBlock.getBeltChain(this, controllerPos)) { - BlockEntity tileEntity2 = getBlockEntity(blockPos); - if (!(tileEntity2 instanceof BeltTileEntity)) - continue; - BeltTileEntity belt2 = (BeltTileEntity) tileEntity2; - belt2.setController(controllerPos); - } - } - - if (tileEntity instanceof IMultiTileContainer) { - IMultiTileContainer multiTile = (IMultiTileContainer) tileEntity; - BlockPos lastKnown = multiTile.getLastKnownPos(); - BlockPos current = tileEntity.getBlockPos(); - if (lastKnown == null || current == null) - continue; - if (multiTile.isController()) - continue; - if (!lastKnown.equals(current)) { - BlockPos newControllerPos = multiTile.getController() - .offset(current.subtract(lastKnown)); - multiTile.setController(newControllerPos); - } - } - - } - } - - public void setBlockBreakingProgress(BlockPos pos, int damage) { - if (damage == 0) - blockBreakingProgressions.remove(pos); - else - blockBreakingProgressions.put(pos, damage - 1); - } - - public Map getBlockBreakingProgressions() { - return blockBreakingProgressions; - } - - public void addBlockDestroyEffects(BlockPos pos, BlockState state) { - VoxelShape voxelshape = state.getShape(this, pos); - if (voxelshape.isEmpty()) - return; - - AABB bb = voxelshape.bounds(); - double d1 = Math.min(1.0D, bb.maxX - bb.minX); - double d2 = Math.min(1.0D, bb.maxY - bb.minY); - double d3 = Math.min(1.0D, bb.maxZ - bb.minZ); - int i = Math.max(2, Mth.ceil(d1 / 0.25D)); - int j = Math.max(2, Mth.ceil(d2 / 0.25D)); - int k = Math.max(2, Mth.ceil(d3 / 0.25D)); - - for (int l = 0; l < i; ++l) { - for (int i1 = 0; i1 < j; ++i1) { - for (int j1 = 0; j1 < k; ++j1) { - double d4 = (l + 0.5D) / i; - double d5 = (i1 + 0.5D) / j; - double d6 = (j1 + 0.5D) / k; - double d7 = d4 * d1 + bb.minX; - double d8 = d5 * d2 + bb.minY; - double d9 = d6 * d3 + bb.minZ; - addParticle(new BlockParticleOption(ParticleTypes.BLOCK, state), pos.getX() + d7, pos.getY() + d8, - pos.getZ() + d9, d4 - 0.5D, d5 - 0.5D, d6 - 0.5D); - } - } - } - } - - @Override - protected BlockState processBlockStateForPrinting(BlockState state) { - return state; - } - - @Override - public boolean hasChunkAt(BlockPos pos) { - return true; // fix particle lighting - } - - @Override - public boolean hasChunk(int x, int y) { - return true; // fix particle lighting - } - - @Override - public boolean isLoaded(BlockPos pos) { - return true; // fix particle lighting - } - - @Override - public boolean hasNearbyAlivePlayer(double p_217358_1_, double p_217358_3_, double p_217358_5_, double p_217358_7_) { - return true; // always enable spawner animations - } -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderWorldParticles.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderWorldParticles.java deleted file mode 100644 index fb99c02616..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderWorldParticles.java +++ /dev/null @@ -1,104 +0,0 @@ -package com.simibubi.create.foundation.ponder; - -import java.util.Collection; -import java.util.Iterator; -import java.util.Map; -import java.util.Queue; - -import com.google.common.collect.EvictingQueue; -import com.google.common.collect.Maps; -import com.google.common.collect.Queues; -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.BufferBuilder; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.Tesselator; - -import net.minecraft.client.Camera; -import net.minecraft.client.Minecraft; -import net.minecraft.client.particle.Particle; -import net.minecraft.client.particle.ParticleRenderType; -import net.minecraft.client.renderer.GameRenderer; -import net.minecraft.client.renderer.LightTexture; -import net.minecraft.client.renderer.MultiBufferSource; - -public class PonderWorldParticles { - - private final Map> byType = Maps.newIdentityHashMap(); - private final Queue queue = Queues.newArrayDeque(); - - PonderWorld world; - - public PonderWorldParticles(PonderWorld world) { - this.world = world; - } - - public void addParticle(Particle p) { - this.queue.add(p); - } - - public void tick() { - this.byType.forEach((p_228347_1_, p_228347_2_) -> this.tickParticleList(p_228347_2_)); - - Particle particle; - if (queue.isEmpty()) - return; - while ((particle = this.queue.poll()) != null) - this.byType.computeIfAbsent(particle.getRenderType(), $ -> EvictingQueue.create(16384)) - .add(particle); - } - - private void tickParticleList(Collection p_187240_1_) { - if (p_187240_1_.isEmpty()) - return; - - Iterator iterator = p_187240_1_.iterator(); - while (iterator.hasNext()) { - Particle particle = iterator.next(); - particle.tick(); - if (!particle.isAlive()) - iterator.remove(); - } - } - - public void renderParticles(PoseStack ms, MultiBufferSource buffer, Camera renderInfo, float pt) { - Minecraft mc = Minecraft.getInstance(); - LightTexture lightTexture = mc.gameRenderer.lightTexture(); - - lightTexture.turnOnLightLayer(); - RenderSystem.enableDepthTest(); - PoseStack posestack = RenderSystem.getModelViewStack(); - posestack.pushPose(); - posestack.mulPoseMatrix(ms.last().pose()); - RenderSystem.applyModelViewMatrix(); - - for (ParticleRenderType iparticlerendertype : this.byType.keySet()) { - if (iparticlerendertype == ParticleRenderType.NO_RENDER) - continue; - Iterable iterable = this.byType.get(iparticlerendertype); - if (iterable != null) { - RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); - RenderSystem.setShader(GameRenderer::getParticleShader); - - Tesselator tessellator = Tesselator.getInstance(); - BufferBuilder bufferbuilder = tessellator.getBuilder(); - iparticlerendertype.begin(bufferbuilder, mc.textureManager); - - for (Particle particle : iterable) - particle.render(bufferbuilder, renderInfo, pt); - - iparticlerendertype.end(tessellator); - } - } - - posestack.popPose(); - RenderSystem.applyModelViewMatrix(); - RenderSystem.depthMask(true); - RenderSystem.disableBlend(); - lightTexture.turnOffLightLayer(); - } - - public void clearEffects() { - this.byType.clear(); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderWorldTileFix.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderWorldTileFix.java new file mode 100644 index 0000000000..7b5f0b7dfa --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderWorldTileFix.java @@ -0,0 +1,45 @@ +package com.simibubi.create.foundation.ponder; + +import com.simibubi.create.content.contraptions.relays.belt.BeltBlock; +import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; +import com.simibubi.create.foundation.tileEntity.IMultiTileContainer; + +import net.createmod.ponder.foundation.PonderWorld; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.entity.BlockEntity; + +public class PonderWorldTileFix { + + public static void fixControllerTiles(PonderWorld world) { + for (BlockEntity tileEntity : world.getTileEntities().values()) { + + if (tileEntity instanceof BeltTileEntity beltTileEntity) { + if (!beltTileEntity.isController()) + continue; + BlockPos controllerPos = tileEntity.getBlockPos(); + for (BlockPos blockPos : BeltBlock.getBeltChain(world, controllerPos)) { + BlockEntity tileEntity2 = world.getBlockEntity(blockPos); + if (!(tileEntity2 instanceof BeltTileEntity belt2)) + continue; + belt2.setController(controllerPos); + } + } + + if (tileEntity instanceof IMultiTileContainer multiTile) { + BlockPos lastKnown = multiTile.getLastKnownPos(); + BlockPos current = tileEntity.getBlockPos(); + if (lastKnown == null) + continue; + if (multiTile.isController()) + continue; + if (!lastKnown.equals(current)) { + BlockPos newControllerPos = multiTile.getController() + .offset(current.subtract(lastKnown)); + multiTile.setController(newControllerPos); + } + } + + } + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java deleted file mode 100644 index 890d8a2cdf..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java +++ /dev/null @@ -1,890 +0,0 @@ -package com.simibubi.create.foundation.ponder; - -import java.util.Optional; -import java.util.UUID; -import java.util.function.Consumer; -import java.util.function.Function; -import java.util.function.Supplier; -import java.util.function.UnaryOperator; - -import com.mojang.math.Vector3f; -import com.simibubi.create.content.contraptions.base.IRotate.SpeedLevel; -import com.simibubi.create.content.contraptions.base.KineticBlock; -import com.simibubi.create.content.contraptions.base.KineticTileEntity; -import com.simibubi.create.content.contraptions.components.crafter.ConnectedInputHandler; -import com.simibubi.create.content.contraptions.components.crafter.MechanicalCrafterTileEntity; -import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueItem; -import com.simibubi.create.content.contraptions.components.structureMovement.interaction.controls.ControlsBlock; -import com.simibubi.create.content.contraptions.fluids.PumpTileEntity; -import com.simibubi.create.content.contraptions.particle.RotationIndicatorParticleData; -import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerTileEntity; -import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; -import com.simibubi.create.content.contraptions.relays.gauge.SpeedGaugeTileEntity; -import com.simibubi.create.content.logistics.block.display.DisplayLinkTileEntity; -import com.simibubi.create.content.logistics.block.funnel.FunnelTileEntity; -import com.simibubi.create.content.logistics.block.mechanicalArm.ArmTileEntity; -import com.simibubi.create.content.logistics.trains.management.display.FlapDisplayTileEntity; -import com.simibubi.create.content.logistics.trains.management.edgePoint.signal.SignalTileEntity; -import com.simibubi.create.content.logistics.trains.management.edgePoint.signal.SignalTileEntity.SignalState; -import com.simibubi.create.content.logistics.trains.management.edgePoint.station.StationTileEntity; -import com.simibubi.create.foundation.ponder.element.AnimatedSceneElement; -import com.simibubi.create.foundation.ponder.element.BeltItemElement; -import com.simibubi.create.foundation.ponder.element.EntityElement; -import com.simibubi.create.foundation.ponder.element.InputWindowElement; -import com.simibubi.create.foundation.ponder.element.MinecartElement; -import com.simibubi.create.foundation.ponder.element.MinecartElement.MinecartConstructor; -import com.simibubi.create.foundation.ponder.element.ParrotElement; -import com.simibubi.create.foundation.ponder.element.ParrotElement.ParrotPose; -import com.simibubi.create.foundation.ponder.element.ParrotElement.SpinOnComponentPose; -import com.simibubi.create.foundation.ponder.element.TextWindowElement; -import com.simibubi.create.foundation.ponder.element.WorldSectionElement; -import com.simibubi.create.foundation.ponder.instruction.AnimateMinecartInstruction; -import com.simibubi.create.foundation.ponder.instruction.AnimateParrotInstruction; -import com.simibubi.create.foundation.ponder.instruction.AnimateTileEntityInstruction; -import com.simibubi.create.foundation.ponder.instruction.AnimateWorldSectionInstruction; -import com.simibubi.create.foundation.ponder.instruction.ChaseAABBInstruction; -import com.simibubi.create.foundation.ponder.instruction.CreateMinecartInstruction; -import com.simibubi.create.foundation.ponder.instruction.CreateParrotInstruction; -import com.simibubi.create.foundation.ponder.instruction.DelayInstruction; -import com.simibubi.create.foundation.ponder.instruction.DisplayWorldSectionInstruction; -import com.simibubi.create.foundation.ponder.instruction.EmitParticlesInstruction; -import com.simibubi.create.foundation.ponder.instruction.EmitParticlesInstruction.Emitter; -import com.simibubi.create.foundation.ponder.instruction.FadeOutOfSceneInstruction; -import com.simibubi.create.foundation.ponder.instruction.HighlightValueBoxInstruction; -import com.simibubi.create.foundation.ponder.instruction.KeyframeInstruction; -import com.simibubi.create.foundation.ponder.instruction.LineInstruction; -import com.simibubi.create.foundation.ponder.instruction.MarkAsFinishedInstruction; -import com.simibubi.create.foundation.ponder.instruction.MovePoiInstruction; -import com.simibubi.create.foundation.ponder.instruction.OutlineSelectionInstruction; -import com.simibubi.create.foundation.ponder.instruction.PonderInstruction; -import com.simibubi.create.foundation.ponder.instruction.ReplaceBlocksInstruction; -import com.simibubi.create.foundation.ponder.instruction.RotateSceneInstruction; -import com.simibubi.create.foundation.ponder.instruction.ShowInputInstruction; -import com.simibubi.create.foundation.ponder.instruction.TextInstruction; -import com.simibubi.create.foundation.ponder.instruction.TileEntityDataInstruction; -import com.simibubi.create.foundation.tileEntity.SmartTileEntity; -import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; -import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour; -import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour.TransportedResult; -import com.simibubi.create.foundation.utility.Color; -import com.simibubi.create.foundation.utility.NBTHelper; -import com.simibubi.create.foundation.utility.VecHelper; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.core.Direction.Axis; -import net.minecraft.core.Vec3i; -import net.minecraft.core.particles.DustParticleOptions; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.item.ItemEntity; -import net.minecraft.world.item.DyeColor; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.RedstoneTorchBlock; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.state.properties.BlockStateProperties; -import net.minecraft.world.level.block.state.properties.Property; -import net.minecraft.world.phys.AABB; -import net.minecraft.world.phys.Vec3; - -/** - * Enqueue instructions to the schedule via this object's methods. - */ -public class SceneBuilder { - - /** - * Ponder's toolkit for showing information on top of the scene world, such as - * highlighted bounding boxes, texts, icons and keybindings. - */ - public final OverlayInstructions overlay; - - /** - * Instructions for manipulating the schematic and its currently visible areas. - * Allows to show, hide and modify blocks as the scene plays out. - */ - public final WorldInstructions world; - - /** - * Additional tools for debugging ponder and bypassing the facade - */ - public final DebugInstructions debug; - - /** - * Special effects to embellish and communicate with - */ - public final EffectInstructions effects; - - /** - * Random other instructions that might come in handy - */ - public final SpecialInstructions special; - - private final PonderScene scene; - - public SceneBuilder(PonderScene ponderScene) { - scene = ponderScene; - overlay = new OverlayInstructions(); - special = new SpecialInstructions(); - world = new WorldInstructions(); - debug = new DebugInstructions(); - effects = new EffectInstructions(); - } - - // General - - /** - * Assign a unique translation key, as well as the standard english translation - * for this scene's title using this method, anywhere inside the program - * function. - * - * @param sceneId - * @param title - */ - public void title(String sceneId, String title) { - scene.sceneId = new ResourceLocation(scene.getNamespace(), sceneId); - PonderLocalization.registerSpecific(scene.sceneId, PonderScene.TITLE_KEY, title); - } - - /** - * Communicates to the ponder UI which parts of the schematic make up the base - * horizontally. Use of this is encouraged whenever there are components outside - * the the base plate.
- * As a result, showBasePlate() will only show the configured size, and the - * scene's scaling inside the UI will be consistent with its base size. - * - * @param xOffset Block spaces between the base plate and the schematic - * boundary on the Western side. - * @param zOffset Block spaces between the base plate and the schematic - * boundary on the Northern side. - * @param basePlateSize Length in blocks of the base plate itself. Ponder - * assumes it to be square - */ - public void configureBasePlate(int xOffset, int zOffset, int basePlateSize) { - scene.basePlateOffsetX = xOffset; - scene.basePlateOffsetZ = zOffset; - scene.basePlateSize = basePlateSize; - } - - /** - * Use this in case you are not happy with the scale of the scene relative to - * the overlay - * - * @param factor {@literal >}1 will make the scene appear larger, smaller - * otherwise - */ - public void scaleSceneView(float factor) { - scene.scaleFactor = factor; - } - - /** - * Use this in case you are not happy with the vertical alignment of the scene - * relative to the overlay - * - * @param yOffset {@literal >}0 moves the scene up, down otherwise - */ - public void setSceneOffsetY(float yOffset) { - scene.yOffset = yOffset; - } - - /** - * Fade the layer of blocks into the scene ponder assumes to be the base plate - * of the schematic's structure. Makes for a nice opener - */ - public void showBasePlate() { - world.showSection(scene.getSceneBuildingUtil().select.cuboid( - new BlockPos(scene.getBasePlateOffsetX(), 0, scene.getBasePlateOffsetZ()), - new Vec3i(scene.getBasePlateSize() - 1, 0, scene.getBasePlateSize() - 1)), Direction.UP); - } - - /** - * Adds an instruction to the scene. It is recommended to only use this method - * if another method in this class or its subclasses does not already allow - * adding a certain instruction. - */ - public void addInstruction(PonderInstruction instruction) { - scene.schedule.add(instruction); - } - - /** - * Adds a simple instruction to the scene. It is recommended to only use this - * method if another method in this class or its subclasses does not already - * allow adding a certain instruction. - */ - public void addInstruction(Consumer callback) { - addInstruction(PonderInstruction.simple(callback)); - } - - /** - * Before running the upcoming instructions, wait for a duration to let previous - * actions play out.
- * Idle does not stall any animations, only schedules a time gap between - * instructions. - * - * @param ticks Duration to wait for - */ - public void idle(int ticks) { - addInstruction(new DelayInstruction(ticks)); - } - - /** - * Before running the upcoming instructions, wait for a duration to let previous - * actions play out.
- * Idle does not stall any animations, only schedules a time gap between - * instructions. - * - * @param seconds Duration to wait for - */ - public void idleSeconds(int seconds) { - idle(seconds * 20); - } - - /** - * Once the scene reaches this instruction in the timeline, mark it as - * "finished". This happens automatically when the end of a storyboard is - * reached, but can be desirable to do earlier, in order to bypass the wait for - * any residual text windows to time out.
- * So far this event only affects the "next scene" button in the UI to flash. - */ - public void markAsFinished() { - addInstruction(new MarkAsFinishedInstruction()); - } - - /** - * Pans the scene's camera view around the vertical axis by the given amount - * - * @param degrees - */ - public void rotateCameraY(float degrees) { - addInstruction(new RotateSceneInstruction(0, degrees, true)); - } - - /** - * Adds a Key Frame at the end of the last delay() instruction for the users to - * skip to - */ - public void addKeyframe() { - addInstruction(KeyframeInstruction.IMMEDIATE); - } - - /** - * Adds a Key Frame a couple ticks after the last delay() instruction for the - * users to skip to - */ - public void addLazyKeyframe() { - addInstruction(KeyframeInstruction.DELAYED); - } - - public class EffectInstructions { - - public void emitParticles(Vec3 location, Emitter emitter, float amountPerCycle, int cycles) { - addInstruction(new EmitParticlesInstruction(location, emitter, amountPerCycle, cycles)); - } - - public void superGlue(BlockPos pos, Direction side, boolean fullBlock) { - addInstruction(scene -> SuperGlueItem.spawnParticles(scene.getWorld(), pos, side, fullBlock)); - } - - private void rotationIndicator(BlockPos pos, boolean direction) { - addInstruction(scene -> { - BlockState blockState = scene.getWorld() - .getBlockState(pos); - BlockEntity tileEntity = scene.getWorld() - .getBlockEntity(pos); - - if (!(blockState.getBlock() instanceof KineticBlock)) - return; - if (!(tileEntity instanceof KineticTileEntity)) - return; - - KineticTileEntity kte = (KineticTileEntity) tileEntity; - KineticBlock kb = (KineticBlock) blockState.getBlock(); - Axis rotationAxis = kb.getRotationAxis(blockState); - - float speed = kte.getTheoreticalSpeed(); - SpeedLevel speedLevel = SpeedLevel.of(speed); - int color = direction ? speed > 0 ? 0xeb5e0b : 0x1687a7 : speedLevel.getColor(); - int particleSpeed = speedLevel.getParticleSpeed(); - particleSpeed *= Math.signum(speed); - - Vec3 location = VecHelper.getCenterOf(pos); - RotationIndicatorParticleData particleData = new RotationIndicatorParticleData(color, particleSpeed, - kb.getParticleInitialRadius(), kb.getParticleTargetRadius(), 20, rotationAxis.name() - .charAt(0)); - - for (int i = 0; i < 20; i++) - scene.getWorld() - .addParticle(particleData, location.x, location.y, location.z, 0, 0, 0); - }); - } - - public void rotationSpeedIndicator(BlockPos pos) { - rotationIndicator(pos, false); - } - - public void rotationDirectionIndicator(BlockPos pos) { - rotationIndicator(pos, true); - } - - public void indicateRedstone(BlockPos pos) { - createRedstoneParticles(pos, 0xFF0000, 10); - } - - public void indicateSuccess(BlockPos pos) { - createRedstoneParticles(pos, 0x80FFaa, 10); - } - - public void createRedstoneParticles(BlockPos pos, int color, int amount) { - Vector3f rgb = new Color(color).asVectorF(); - addInstruction(new EmitParticlesInstruction(VecHelper.getCenterOf(pos), - Emitter.withinBlockSpace(new DustParticleOptions(rgb, 1), Vec3.ZERO), amount, 2)); - } - - } - - public class OverlayInstructions { - - public TextWindowElement.Builder showText(int duration) { - TextWindowElement textWindowElement = new TextWindowElement(); - addInstruction(new TextInstruction(textWindowElement, duration)); - return textWindowElement.new Builder(scene); - } - - public TextWindowElement.Builder showSelectionWithText(Selection selection, int duration) { - TextWindowElement textWindowElement = new TextWindowElement(); - addInstruction(new TextInstruction(textWindowElement, duration, selection)); - return textWindowElement.new Builder(scene).pointAt(selection.getCenter()); - } - - public void showControls(InputWindowElement element, int duration) { - addInstruction(new ShowInputInstruction(element.clone(), duration)); - } - - public void chaseBoundingBoxOutline(PonderPalette color, Object slot, AABB boundingBox, int duration) { - addInstruction(new ChaseAABBInstruction(color, slot, boundingBox, duration)); - } - - public void showCenteredScrollInput(BlockPos pos, Direction side, int duration) { - showScrollInput(scene.getSceneBuildingUtil().vector.blockSurface(pos, side), side, duration); - } - - public void showScrollInput(Vec3 location, Direction side, int duration) { - Axis axis = side.getAxis(); - float s = 1 / 16f; - float q = 1 / 4f; - Vec3 expands = new Vec3(axis == Axis.X ? s : q, axis == Axis.Y ? s : q, axis == Axis.Z ? s : q); - addInstruction(new HighlightValueBoxInstruction(location, expands, duration)); - } - - public void showRepeaterScrollInput(BlockPos pos, int duration) { - float s = 1 / 16f; - float q = 1 / 6f; - Vec3 expands = new Vec3(q, s, q); - addInstruction( - new HighlightValueBoxInstruction(scene.getSceneBuildingUtil().vector.blockSurface(pos, Direction.DOWN) - .add(0, 3 / 16f, 0), expands, duration)); - } - - public void showFilterSlotInput(Vec3 location, int duration) { - float s = .1f; - Vec3 expands = new Vec3(s, s, s); - addInstruction(new HighlightValueBoxInstruction(location, expands, duration)); - } - - public void showLine(PonderPalette color, Vec3 start, Vec3 end, int duration) { - addInstruction(new LineInstruction(color, start, end, duration, false)); - } - - public void showBigLine(PonderPalette color, Vec3 start, Vec3 end, int duration) { - addInstruction(new LineInstruction(color, start, end, duration, true)); - } - - public void showOutline(PonderPalette color, Object slot, Selection selection, int duration) { - addInstruction(new OutlineSelectionInstruction(color, slot, selection, duration)); - } - - } - - public class SpecialInstructions { - - public ElementLink birbOnTurntable(BlockPos pos) { - return createBirb(VecHelper.getCenterOf(pos), () -> new SpinOnComponentPose(pos)); - } - - public ElementLink birbOnSpinnyShaft(BlockPos pos) { - return createBirb(VecHelper.getCenterOf(pos) - .add(0, 0.5, 0), () -> new SpinOnComponentPose(pos)); - } - - public ElementLink createBirb(Vec3 location, Supplier pose) { - ElementLink link = new ElementLink<>(ParrotElement.class); - ParrotElement parrot = ParrotElement.create(location, pose); - addInstruction(new CreateParrotInstruction(10, Direction.DOWN, parrot)); - addInstruction(scene -> scene.linkElement(parrot, link)); - return link; - } - - public void changeBirbPose(ElementLink birb, Supplier pose) { - addInstruction(scene -> scene.resolve(birb) - .setPose(pose.get())); - } - - public void conductorBirb(ElementLink birb, boolean conductor) { - addInstruction(scene -> scene.resolve(birb) - .setConductor(conductor)); - } - - public void movePointOfInterest(Vec3 location) { - addInstruction(new MovePoiInstruction(location)); - } - - public void movePointOfInterest(BlockPos location) { - movePointOfInterest(VecHelper.getCenterOf(location)); - } - - public void rotateParrot(ElementLink link, double xRotation, double yRotation, double zRotation, - int duration) { - addInstruction(AnimateParrotInstruction.rotate(link, new Vec3(xRotation, yRotation, zRotation), duration)); - } - - public void moveParrot(ElementLink link, Vec3 offset, int duration) { - addInstruction(AnimateParrotInstruction.move(link, offset, duration)); - } - - public ElementLink createCart(Vec3 location, float angle, MinecartConstructor type) { - ElementLink link = new ElementLink<>(MinecartElement.class); - MinecartElement cart = new MinecartElement(location, angle, type); - addInstruction(new CreateMinecartInstruction(10, Direction.DOWN, cart)); - addInstruction(scene -> scene.linkElement(cart, link)); - return link; - } - - public void rotateCart(ElementLink link, float yRotation, int duration) { - addInstruction(AnimateMinecartInstruction.rotate(link, yRotation, duration)); - } - - public void moveCart(ElementLink link, Vec3 offset, int duration) { - addInstruction(AnimateMinecartInstruction.move(link, offset, duration)); - } - - public void hideElement(ElementLink link, Direction direction) { - addInstruction(new FadeOutOfSceneInstruction<>(15, direction, link)); - } - - } - - public class WorldInstructions { - - public void incrementBlockBreakingProgress(BlockPos pos) { - addInstruction(scene -> { - PonderWorld world = scene.getWorld(); - int progress = world.getBlockBreakingProgressions() - .getOrDefault(pos, -1) + 1; - if (progress == 9) { - world.addBlockDestroyEffects(pos, world.getBlockState(pos)); - world.destroyBlock(pos, false); - world.setBlockBreakingProgress(pos, 0); - scene.forEach(WorldSectionElement.class, WorldSectionElement::queueRedraw); - } else - world.setBlockBreakingProgress(pos, progress + 1); - }); - } - - public void showSection(Selection selection, Direction fadeInDirection) { - addInstruction(new DisplayWorldSectionInstruction(15, fadeInDirection, selection, - Optional.of(scene::getBaseWorldSection))); - } - - public void showSectionAndMerge(Selection selection, Direction fadeInDirection, - ElementLink link) { - addInstruction(new DisplayWorldSectionInstruction(15, fadeInDirection, selection, - Optional.of(() -> scene.resolve(link)))); - } - - public void glueBlockOnto(BlockPos position, Direction fadeInDirection, ElementLink link) { - addInstruction(new DisplayWorldSectionInstruction(15, fadeInDirection, - scene.getSceneBuildingUtil().select.position(position), Optional.of(() -> scene.resolve(link)), - position)); - } - - public ElementLink showIndependentSection(Selection selection, Direction fadeInDirection) { - DisplayWorldSectionInstruction instruction = - new DisplayWorldSectionInstruction(15, fadeInDirection, selection, Optional.empty()); - addInstruction(instruction); - return instruction.createLink(scene); - } - - public ElementLink showIndependentSectionImmediately(Selection selection) { - DisplayWorldSectionInstruction instruction = - new DisplayWorldSectionInstruction(0, Direction.DOWN, selection, Optional.empty()); - addInstruction(instruction); - return instruction.createLink(scene); - } - - public void hideSection(Selection selection, Direction fadeOutDirection) { - WorldSectionElement worldSectionElement = new WorldSectionElement(selection); - ElementLink elementLink = new ElementLink<>(WorldSectionElement.class); - - addInstruction(scene -> { - scene.getBaseWorldSection() - .erase(selection); - scene.linkElement(worldSectionElement, elementLink); - scene.addElement(worldSectionElement); - worldSectionElement.queueRedraw(); - }); - - hideIndependentSection(elementLink, fadeOutDirection); - } - - public void hideIndependentSection(ElementLink link, Direction fadeOutDirection) { - addInstruction(new FadeOutOfSceneInstruction<>(15, fadeOutDirection, link)); - } - - public void restoreBlocks(Selection selection) { - addInstruction(scene -> scene.getWorld() - .restoreBlocks(selection)); - } - - public ElementLink makeSectionIndependent(Selection selection) { - WorldSectionElement worldSectionElement = new WorldSectionElement(selection); - ElementLink elementLink = new ElementLink<>(WorldSectionElement.class); - - addInstruction(scene -> { - scene.getBaseWorldSection() - .erase(selection); - scene.linkElement(worldSectionElement, elementLink); - scene.addElement(worldSectionElement); - worldSectionElement.queueRedraw(); - worldSectionElement.resetAnimatedTransform(); - worldSectionElement.setVisible(true); - worldSectionElement.forceApplyFade(1); - }); - - return elementLink; - } - - public void rotateSection(ElementLink link, double xRotation, double yRotation, - double zRotation, int duration) { - addInstruction( - AnimateWorldSectionInstruction.rotate(link, new Vec3(xRotation, yRotation, zRotation), duration)); - } - - public void configureCenterOfRotation(ElementLink link, Vec3 anchor) { - addInstruction(scene -> scene.resolve(link) - .setCenterOfRotation(anchor)); - } - - public void configureStabilization(ElementLink link, Vec3 anchor) { - addInstruction(scene -> scene.resolve(link) - .stabilizeRotation(anchor)); - } - - public void moveSection(ElementLink link, Vec3 offset, int duration) { - addInstruction(AnimateWorldSectionInstruction.move(link, offset, duration)); - } - - public void rotateBearing(BlockPos pos, float angle, int duration) { - addInstruction(AnimateTileEntityInstruction.bearing(pos, angle, duration)); - } - - public void movePulley(BlockPos pos, float distance, int duration) { - addInstruction(AnimateTileEntityInstruction.pulley(pos, distance, duration)); - } - - public void animateBogey(BlockPos pos, float distance, int duration) { - addInstruction(AnimateTileEntityInstruction.bogey(pos, distance, duration + 1)); - } - - public void moveDeployer(BlockPos pos, float distance, int duration) { - addInstruction(AnimateTileEntityInstruction.deployer(pos, distance, duration)); - } - - public void setBlocks(Selection selection, BlockState state, boolean spawnParticles) { - addInstruction(new ReplaceBlocksInstruction(selection, $ -> state, true, spawnParticles)); - } - - public void destroyBlock(BlockPos pos) { - setBlock(pos, Blocks.AIR.defaultBlockState(), true); - } - - public void setBlock(BlockPos pos, BlockState state, boolean spawnParticles) { - setBlocks(scene.getSceneBuildingUtil().select.position(pos), state, spawnParticles); - } - - public void replaceBlocks(Selection selection, BlockState state, boolean spawnParticles) { - modifyBlocks(selection, $ -> state, spawnParticles); - } - - public void modifyBlock(BlockPos pos, UnaryOperator stateFunc, boolean spawnParticles) { - modifyBlocks(scene.getSceneBuildingUtil().select.position(pos), stateFunc, spawnParticles); - } - - public void cycleBlockProperty(BlockPos pos, Property property) { - modifyBlocks(scene.getSceneBuildingUtil().select.position(pos), - s -> s.hasProperty(property) ? s.cycle(property) : s, false); - } - - public void modifyBlocks(Selection selection, UnaryOperator stateFunc, boolean spawnParticles) { - addInstruction(new ReplaceBlocksInstruction(selection, stateFunc, false, spawnParticles)); - } - - public void toggleRedstonePower(Selection selection) { - modifyBlocks(selection, s -> { - if (s.hasProperty(BlockStateProperties.POWER)) - s = s.setValue(BlockStateProperties.POWER, s.getValue(BlockStateProperties.POWER) == 0 ? 15 : 0); - if (s.hasProperty(BlockStateProperties.POWERED)) - s = s.cycle(BlockStateProperties.POWERED); - if (s.hasProperty(RedstoneTorchBlock.LIT)) - s = s.cycle(RedstoneTorchBlock.LIT); - return s; - }, false); - } - - public void modifyEntities(Class entityClass, Consumer entityCallBack) { - addInstruction(scene -> scene.forEachWorldEntity(entityClass, entityCallBack)); - } - - public void modifyEntitiesInside(Class entityClass, Selection area, - Consumer entityCallBack) { - addInstruction(scene -> scene.forEachWorldEntity(entityClass, e -> { - if (area.test(e.blockPosition())) - entityCallBack.accept(e); - })); - } - - public void modifyEntity(ElementLink link, Consumer entityCallBack) { - addInstruction(scene -> { - EntityElement resolve = scene.resolve(link); - if (resolve != null) - resolve.ifPresent(entityCallBack::accept); - }); - } - - public ElementLink createEntity(Function factory) { - ElementLink link = new ElementLink<>(EntityElement.class, UUID.randomUUID()); - addInstruction(scene -> { - PonderWorld world = scene.getWorld(); - Entity entity = factory.apply(world); - EntityElement handle = new EntityElement(entity); - scene.addElement(handle); - scene.linkElement(handle, link); - world.addFreshEntity(entity); - }); - return link; - } - - public ElementLink createItemEntity(Vec3 location, Vec3 motion, ItemStack stack) { - return createEntity(world -> { - ItemEntity itemEntity = new ItemEntity(world, location.x, location.y, location.z, stack); - itemEntity.setDeltaMovement(motion); - return itemEntity; - }); - } - - public void createItemOnBeltLike(BlockPos location, Direction insertionSide, ItemStack stack) { - addInstruction(scene -> { - PonderWorld world = scene.getWorld(); - BlockEntity tileEntity = world.getBlockEntity(location); - if (!(tileEntity instanceof SmartTileEntity)) - return; - SmartTileEntity beltTileEntity = (SmartTileEntity) tileEntity; - DirectBeltInputBehaviour behaviour = beltTileEntity.getBehaviour(DirectBeltInputBehaviour.TYPE); - if (behaviour == null) - return; - behaviour.handleInsertion(stack, insertionSide.getOpposite(), false); - }); - flapFunnel(location.above(), true); - } - - public ElementLink createItemOnBelt(BlockPos beltLocation, Direction insertionSide, - ItemStack stack) { - ElementLink link = new ElementLink<>(BeltItemElement.class); - addInstruction(scene -> { - PonderWorld world = scene.getWorld(); - BlockEntity tileEntity = world.getBlockEntity(beltLocation); - if (!(tileEntity instanceof BeltTileEntity)) - return; - - BeltTileEntity beltTileEntity = (BeltTileEntity) tileEntity; - DirectBeltInputBehaviour behaviour = beltTileEntity.getBehaviour(DirectBeltInputBehaviour.TYPE); - behaviour.handleInsertion(stack, insertionSide.getOpposite(), false); - - BeltTileEntity controllerTE = beltTileEntity.getControllerTE(); - if (controllerTE != null) - controllerTE.tick(); - - TransportedItemStackHandlerBehaviour transporter = - beltTileEntity.getBehaviour(TransportedItemStackHandlerBehaviour.TYPE); - transporter.handleProcessingOnAllItems(tis -> { - BeltItemElement tracker = new BeltItemElement(tis); - scene.addElement(tracker); - scene.linkElement(tracker, link); - return TransportedResult.doNothing(); - }); - }); - flapFunnel(beltLocation.above(), true); - return link; - } - - public void removeItemsFromBelt(BlockPos beltLocation) { - addInstruction(scene -> { - PonderWorld world = scene.getWorld(); - BlockEntity tileEntity = world.getBlockEntity(beltLocation); - if (!(tileEntity instanceof SmartTileEntity)) - return; - SmartTileEntity beltTileEntity = (SmartTileEntity) tileEntity; - TransportedItemStackHandlerBehaviour transporter = - beltTileEntity.getBehaviour(TransportedItemStackHandlerBehaviour.TYPE); - if (transporter == null) - return; - transporter.handleCenteredProcessingOnAllItems(.52f, tis -> TransportedResult.removeItem()); - }); - } - - public void stallBeltItem(ElementLink link, boolean stalled) { - addInstruction(scene -> { - BeltItemElement resolve = scene.resolve(link); - if (resolve != null) - resolve.ifPresent(tis -> tis.locked = stalled); - }); - } - - public void changeBeltItemTo(ElementLink link, ItemStack newStack) { - addInstruction(scene -> { - BeltItemElement resolve = scene.resolve(link); - if (resolve != null) - resolve.ifPresent(tis -> tis.stack = newStack); - }); - } - - public void setKineticSpeed(Selection selection, float speed) { - modifyKineticSpeed(selection, f -> speed); - } - - public void multiplyKineticSpeed(Selection selection, float modifier) { - modifyKineticSpeed(selection, f -> f * modifier); - } - - public void modifyKineticSpeed(Selection selection, UnaryOperator speedFunc) { - modifyTileNBT(selection, SpeedGaugeTileEntity.class, nbt -> { - float newSpeed = speedFunc.apply(nbt.getFloat("Speed")); - nbt.putFloat("Value", SpeedGaugeTileEntity.getDialTarget(newSpeed)); - }); - modifyTileNBT(selection, KineticTileEntity.class, nbt -> { - nbt.putFloat("Speed", speedFunc.apply(nbt.getFloat("Speed"))); - }); - } - - public void propagatePipeChange(BlockPos pos) { - modifyTileEntity(pos, PumpTileEntity.class, te -> te.onSpeedChanged(0)); - } - - public void setFilterData(Selection selection, Class teType, ItemStack filter) { - modifyTileNBT(selection, teType, nbt -> { - nbt.put("Filter", filter.serializeNBT()); - }); - } - - public void modifyTileNBT(Selection selection, Class teType, - Consumer consumer) { - modifyTileNBT(selection, teType, consumer, false); - } - - public void modifyTileEntity(BlockPos position, Class teType, Consumer consumer) { - addInstruction(scene -> { - BlockEntity tileEntity = scene.getWorld() - .getBlockEntity(position); - if (teType.isInstance(tileEntity)) - consumer.accept(teType.cast(tileEntity)); - }); - } - - public void modifyTileNBT(Selection selection, Class teType, - Consumer consumer, boolean reDrawBlocks) { - addInstruction(new TileEntityDataInstruction(selection, teType, nbt -> { - consumer.accept(nbt); - return nbt; - }, reDrawBlocks)); - } - - public void instructArm(BlockPos armLocation, ArmTileEntity.Phase phase, ItemStack heldItem, - int targetedPoint) { - modifyTileNBT(scene.getSceneBuildingUtil().select.position(armLocation), ArmTileEntity.class, compound -> { - NBTHelper.writeEnum(compound, "Phase", phase); - compound.put("HeldItem", heldItem.serializeNBT()); - compound.putInt("TargetPointIndex", targetedPoint); - compound.putFloat("MovementProgress", 0); - }); - } - - public void flapFunnel(BlockPos position, boolean outward) { - modifyTileEntity(position, FunnelTileEntity.class, funnel -> funnel.flap(!outward)); - } - - public void setCraftingResult(BlockPos crafter, ItemStack output) { - modifyTileEntity(crafter, MechanicalCrafterTileEntity.class, mct -> mct.setScriptedResult(output)); - } - - public void connectCrafterInvs(BlockPos position1, BlockPos position2) { - addInstruction(s -> { - ConnectedInputHandler.toggleConnection(s.getWorld(), position1, position2); - s.forEach(WorldSectionElement.class, WorldSectionElement::queueRedraw); - }); - } - - public void toggleControls(BlockPos position) { - cycleBlockProperty(position, ControlsBlock.VIRTUAL); - } - - public void animateTrainStation(BlockPos position, boolean trainPresent) { - modifyTileNBT(scene.getSceneBuildingUtil().select.position(position), StationTileEntity.class, - c -> c.putBoolean("ForceFlag", trainPresent)); - } - - public void conductorBlaze(BlockPos position, boolean conductor) { - modifyTileNBT(scene.getSceneBuildingUtil().select.position(position), BlazeBurnerTileEntity.class, - c -> c.putBoolean("TrainHat", conductor)); - } - - public void changeSignalState(BlockPos position, SignalState state) { - modifyTileNBT(scene.getSceneBuildingUtil().select.position(position), SignalTileEntity.class, - c -> NBTHelper.writeEnum(c, "State", state)); - } - - public void setDisplayBoardText(BlockPos position, int line, Component text) { - modifyTileEntity(position, FlapDisplayTileEntity.class, - t -> t.applyTextManually(line, Component.Serializer.toJson(text))); - } - - public void dyeDisplayBoard(BlockPos position, int line, DyeColor color) { - modifyTileEntity(position, FlapDisplayTileEntity.class, t -> t.setColour(line, color)); - } - - public void flashDisplayLink(BlockPos position) { - modifyTileEntity(position, DisplayLinkTileEntity.class, linkTile -> linkTile.glow.setValue(2)); - } - - } - - public class DebugInstructions { - - public void debugSchematic() { - addInstruction( - scene -> scene.addElement(new WorldSectionElement(scene.getSceneBuildingUtil().select.everywhere()))); - } - - public void addInstructionInstance(PonderInstruction instruction) { - addInstruction(instruction); - } - - public void enqueueCallback(Consumer callback) { - addInstruction(callback); - } - - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuildingUtil.java b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuildingUtil.java deleted file mode 100644 index 5abc667adf..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuildingUtil.java +++ /dev/null @@ -1,119 +0,0 @@ -package com.simibubi.create.foundation.ponder; - -import com.simibubi.create.foundation.utility.VecHelper; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.core.Vec3i; -import net.minecraft.world.level.levelgen.structure.BoundingBox; -import net.minecraft.world.phys.Vec3; - -/** - * Helpful shortcuts for marking boundaries, points or sections inside the scene - */ -public class SceneBuildingUtil { - - public final SelectionUtil select; - public final VectorUtil vector; - public final PositionUtil grid; - - private final BoundingBox sceneBounds; - - SceneBuildingUtil(BoundingBox sceneBounds) { - this.sceneBounds = sceneBounds; - this.select = new SelectionUtil(); - this.vector = new VectorUtil(); - this.grid = new PositionUtil(); - } - - public class PositionUtil { - - public BlockPos at(int x, int y, int z) { - return new BlockPos(x, y, z); - } - - public BlockPos zero() { - return at(0, 0, 0); - } - - } - - public class VectorUtil { - - public Vec3 centerOf(int x, int y, int z) { - return centerOf(grid.at(x, y, z)); - } - - public Vec3 centerOf(BlockPos pos) { - return VecHelper.getCenterOf(pos); - } - - public Vec3 topOf(int x, int y, int z) { - return blockSurface(grid.at(x, y, z), Direction.UP); - } - - public Vec3 topOf(BlockPos pos) { - return blockSurface(pos, Direction.UP); - } - - public Vec3 blockSurface(BlockPos pos, Direction face) { - return blockSurface(pos, face, 0); - } - - public Vec3 blockSurface(BlockPos pos, Direction face, float margin) { - return centerOf(pos).add(Vec3.atLowerCornerOf(face.getNormal()) - .scale(.5f + margin)); - } - - public Vec3 of(double x, double y, double z) { - return new Vec3(x, y, z); - } - - } - - public class SelectionUtil { - - public Selection everywhere() { - return Selection.of(sceneBounds); - } - - public Selection position(int x, int y, int z) { - return position(grid.at(x, y, z)); - } - - public Selection position(BlockPos pos) { - return cuboid(pos, BlockPos.ZERO); - } - - public Selection fromTo(int x, int y, int z, int x2, int y2, int z2) { - return fromTo(new BlockPos(x, y, z), new BlockPos(x2, y2, z2)); - } - - public Selection fromTo(BlockPos pos1, BlockPos pos2) { - return cuboid(pos1, pos2.subtract(pos1)); - } - - public Selection column(int x, int z) { - return cuboid(new BlockPos(x, 1, z), new Vec3i(0, sceneBounds.getYSpan(), 0)); - } - - public Selection layer(int y) { - return layers(y, 1); - } - - public Selection layersFrom(int y) { - return layers(y, sceneBounds.getYSpan() - y); - } - - public Selection layers(int y, int height) { - return cuboid(new BlockPos(0, y, 0), new Vec3i(sceneBounds.getXSpan() - 1, - Math.min(sceneBounds.getYSpan() - y, height) - 1, sceneBounds.getZSpan() - 1)); - } - - public Selection cuboid(BlockPos origin, Vec3i size) { - return Selection.of(BoundingBox.fromCorners(origin, origin.offset(size))); - } - - } - -} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/foundation/ponder/Selection.java b/src/main/java/com/simibubi/create/foundation/ponder/Selection.java deleted file mode 100644 index de4e32d5b4..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/Selection.java +++ /dev/null @@ -1,155 +0,0 @@ -package com.simibubi.create.foundation.ponder; - -import java.util.HashSet; -import java.util.Set; -import java.util.function.Consumer; -import java.util.function.Predicate; - -import com.simibubi.create.foundation.utility.outliner.Outline.OutlineParams; -import com.simibubi.create.foundation.utility.outliner.Outliner; - -import net.minecraft.core.BlockPos; -import net.minecraft.world.level.levelgen.structure.BoundingBox; -import net.minecraft.world.phys.AABB; -import net.minecraft.world.phys.Vec3; - -public abstract class Selection implements Predicate { - - public static Selection of(BoundingBox bb) { - return new Simple(bb); - } - - public abstract Selection add(Selection other); - - public abstract Selection substract(Selection other); - - public abstract Selection copy(); - - public abstract Vec3 getCenter(); - - public abstract void forEach(Consumer callback); - - public abstract OutlineParams makeOutline(Outliner outliner, Object slot); - - public OutlineParams makeOutline(Outliner outliner) { - return makeOutline(outliner, this); - } - - private static class Compound extends Selection { - - Set posSet; - Vec3 center; - - public Compound(Simple initial) { - posSet = new HashSet<>(); - add(initial); - } - - private Compound(Set template) { - posSet = new HashSet<>(template); - } - - @Override - public boolean test(BlockPos t) { - return posSet.contains(t); - } - - @Override - public Selection add(Selection other) { - other.forEach(p -> posSet.add(p.immutable())); - center = null; - return this; - } - - @Override - public Selection substract(Selection other) { - other.forEach(p -> posSet.remove(p.immutable())); - center = null; - return this; - } - - @Override - public void forEach(Consumer callback) { - posSet.forEach(callback); - } - - @Override - public OutlineParams makeOutline(Outliner outliner, Object slot) { - return outliner.showCluster(slot, posSet); - } - - @Override - public Vec3 getCenter() { - return center == null ? center = evalCenter() : center; - } - - private Vec3 evalCenter() { - Vec3 center = Vec3.ZERO; - if (posSet.isEmpty()) - return center; - for (BlockPos blockPos : posSet) - center = center.add(Vec3.atLowerCornerOf(blockPos)); - center = center.scale(1f / posSet.size()); - return center.add(new Vec3(.5, .5, .5)); - } - - @Override - public Selection copy() { - return new Compound(posSet); - } - - } - - private static class Simple extends Selection { - - private BoundingBox bb; - private AABB aabb; - - public Simple(BoundingBox bb) { - this.bb = bb; - this.aabb = getAABB(); - } - - @Override - public boolean test(BlockPos t) { - return bb.isInside(t); - } - - @Override - public Selection add(Selection other) { - return new Compound(this).add(other); - } - - @Override - public Selection substract(Selection other) { - return new Compound(this).substract(other); - } - - @Override - public void forEach(Consumer callback) { - BlockPos.betweenClosedStream(bb) - .forEach(callback); - } - - @Override - public Vec3 getCenter() { - return aabb.getCenter(); - } - - @Override - public OutlineParams makeOutline(Outliner outliner, Object slot) { - return outliner.showAABB(slot, aabb); - } - - private AABB getAABB() { - return new AABB(bb.minX(), bb.minY(), bb.minZ(), bb.maxX() + 1, bb.maxY() + 1, bb.maxZ() + 1); - } - - @Override - public Selection copy() { - return new Simple(new BoundingBox(bb.minX(), bb.minY(), bb.minZ(), bb.maxX(), bb.maxY(), bb.maxZ())); - } - - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/ArmScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/ArmScenes.java index ee25578c29..380cdaa869 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/ArmScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/ArmScenes.java @@ -1,18 +1,21 @@ package com.simibubi.create.foundation.ponder.content; import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllItems; import com.simibubi.create.AllShapes; import com.simibubi.create.content.contraptions.components.crafter.MechanicalCrafterTileEntity; import com.simibubi.create.content.logistics.block.funnel.FunnelTileEntity; import com.simibubi.create.content.logistics.block.mechanicalArm.ArmTileEntity.Phase; -import com.simibubi.create.foundation.ponder.ElementLink; -import com.simibubi.create.foundation.ponder.PonderPalette; -import com.simibubi.create.foundation.ponder.SceneBuilder; -import com.simibubi.create.foundation.ponder.SceneBuildingUtil; -import com.simibubi.create.foundation.ponder.Selection; -import com.simibubi.create.foundation.ponder.element.InputWindowElement; -import com.simibubi.create.foundation.ponder.element.WorldSectionElement; -import com.simibubi.create.foundation.utility.Pointing; +import com.simibubi.create.foundation.ponder.CreateSceneBuilder; + +import net.createmod.ponder.foundation.ElementLink; +import net.createmod.ponder.foundation.PonderPalette; +import net.createmod.ponder.foundation.SceneBuilder; +import net.createmod.ponder.foundation.SceneBuildingUtil; +import net.createmod.ponder.foundation.Selection; +import net.createmod.ponder.foundation.element.InputWindowElement; +import net.createmod.ponder.foundation.element.WorldSectionElement; +import net.createmod.catnip.utility.Pointing; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -24,7 +27,8 @@ import net.minecraft.world.phys.Vec3; public class ArmScenes { - public static void setup(SceneBuilder scene, SceneBuildingUtil util) { + public static void setup(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("mechanical_arm", "Setting up Mechanical Arms"); scene.configureBasePlate(0, 0, 5); scene.showBasePlate(); @@ -242,7 +246,8 @@ public class ArmScenes { } - public static void filtering(SceneBuilder scene, SceneBuildingUtil util) { + public static void filtering(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("mechanical_arm_filtering", "Filtering Outputs of the Mechanical Arm"); scene.configureBasePlate(0, 0, 6); scene.scaleSceneView(0.9f); @@ -263,7 +268,7 @@ public class ArmScenes { scene.idle(2); } } - + scene.world.showSection(util.select.position(6, 1, 1), Direction.WEST); scene.world.showSection(util.select.position(2, 1, 1), Direction.EAST); @@ -380,7 +385,8 @@ public class ArmScenes { scene.idle(120); } - public static void modes(SceneBuilder scene, SceneBuildingUtil util) { + public static void modes(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("mechanical_arm_modes", "Distribution modes of the Mechanical Arm"); scene.configureBasePlate(0, 1, 5); scene.world.setBlock(util.grid.at(3, 1, 0), Blocks.BARRIER.defaultBlockState(), false); @@ -435,7 +441,7 @@ public class ArmScenes { scene.idle(60); scene.overlay.showControls(new InputWindowElement(scrollSlot, Pointing.RIGHT).scroll() - .withWrench(), 40); + .withItem(AllItems.WRENCH.asStack()), 40); scene.idle(10); scene.overlay.showText(50) .text("Scrolling with a Wrench will allow you to configure it") @@ -526,7 +532,8 @@ public class ArmScenes { } - public static void redstone(SceneBuilder scene, SceneBuildingUtil util) { + public static void redstone(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("mechanical_arm_redstone", "Controlling Mechanical Arms with Redstone"); scene.configureBasePlate(0, 0, 5); scene.world.showSection(util.select.layer(0), Direction.UP); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/BearingScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/BearingScenes.java index a15bcc77ca..fcc9fe7911 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/BearingScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/BearingScenes.java @@ -5,15 +5,17 @@ import com.simibubi.create.AllItems; import com.simibubi.create.content.contraptions.components.actors.HarvesterTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.bearing.SailBlock; import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueEntity; -import com.simibubi.create.foundation.ponder.ElementLink; -import com.simibubi.create.foundation.ponder.PonderPalette; -import com.simibubi.create.foundation.ponder.SceneBuilder; -import com.simibubi.create.foundation.ponder.SceneBuildingUtil; -import com.simibubi.create.foundation.ponder.Selection; -import com.simibubi.create.foundation.ponder.element.InputWindowElement; -import com.simibubi.create.foundation.ponder.element.WorldSectionElement; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.Pointing; +import com.simibubi.create.foundation.ponder.CreateSceneBuilder; + +import net.createmod.ponder.foundation.ElementLink; +import net.createmod.ponder.foundation.PonderPalette; +import net.createmod.ponder.foundation.SceneBuilder; +import net.createmod.ponder.foundation.SceneBuildingUtil; +import net.createmod.ponder.foundation.Selection; +import net.createmod.ponder.foundation.element.InputWindowElement; +import net.createmod.ponder.foundation.element.WorldSectionElement; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.Pointing; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -30,7 +32,8 @@ import net.minecraft.world.phys.Vec3; public class BearingScenes { - public static void windmillsAsSource(SceneBuilder scene, SceneBuildingUtil util) { + public static void windmillsAsSource(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("windmill_source", "Generating Rotational Force using Windmill Bearings"); scene.configureBasePlate(1, 1, 5); scene.setSceneOffsetY(-1); @@ -150,7 +153,7 @@ public class BearingScenes { Vec3 surface = util.vector.blockSurface(windmill, Direction.WEST); scene.overlay.showControls(new InputWindowElement(surface, Pointing.DOWN).scroll() - .withWrench(), 60); + .withItem(AllItems.WRENCH.asStack()), 60); scene.overlay.showCenteredScrollInput(windmill, Direction.WEST, 50); scene.overlay.showText(60) .pointAt(surface) @@ -181,7 +184,8 @@ public class BearingScenes { } - public static void windmillsAnyStructure(SceneBuilder scene, SceneBuildingUtil util) { + public static void windmillsAnyStructure(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("windmill_structure", "Windmill Contraptions"); scene.configureBasePlate(1, 1, 5); scene.setSceneOffsetY(-1); @@ -232,7 +236,8 @@ public class BearingScenes { scene.world.modifyTileEntity(util.grid.at(2, 1, 5), HarvesterTileEntity.class, hte -> hte.setAnimatedSpeed(0)); } - public static void mechanicalBearing(SceneBuilder scene, SceneBuildingUtil util) { + public static void mechanicalBearing(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("mechanical_bearing", "Movings Structures using the Mechanical Bearing"); scene.configureBasePlate(1, 1, 5); scene.setSceneOffsetY(-1); @@ -323,7 +328,8 @@ public class BearingScenes { scene.world.setKineticSpeed(all, 0); } - public static void bearingModes(SceneBuilder scene, SceneBuildingUtil util) { + public static void bearingModes(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("bearing_modes", "Movement Modes of the Mechanical Bearing"); scene.configureBasePlate(1, 1, 6); scene.setSceneOffsetY(-1); @@ -382,7 +388,7 @@ public class BearingScenes { scene.overlay.showCenteredScrollInput(bearingPos, Direction.NORTH, 60); scene.overlay.showControls( new InputWindowElement(util.vector.blockSurface(bearingPos, Direction.NORTH), Pointing.DOWN).scroll() - .withWrench(), + .withItem(AllItems.WRENCH.asStack()), 60); scene.idle(10); scene.overlay.showText(60) @@ -412,7 +418,8 @@ public class BearingScenes { } - public static void stabilizedBearings(SceneBuilder scene, SceneBuildingUtil util) { + public static void stabilizedBearings(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("stabilized_bearings", "Stabilized Contraptions"); scene.configureBasePlate(1, 1, 5); scene.setSceneOffsetY(-1); @@ -485,7 +492,8 @@ public class BearingScenes { scene.world.setKineticSpeed(beltAndBearing, 0); } - public static void clockwork(SceneBuilder scene, SceneBuildingUtil util) { + public static void clockwork(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("clockwork_bearing", "Animating Structures using Clockwork Bearings"); scene.configureBasePlate(1, 1, 5); scene.setSceneOffsetY(-1); @@ -638,7 +646,8 @@ public class BearingScenes { sails(scene, util, true); } - private static void sails(SceneBuilder scene, SceneBuildingUtil util, boolean frame) { + private static void sails(SceneBuilder builder, SceneBuildingUtil util, boolean frame) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); String plural = frame ? "Sail Frames" : "Sails"; scene.title(frame ? "sail_frame" : "sail", "Assembling Windmills using " + plural); scene.configureBasePlate(0, 0, 5); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/BeltScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/BeltScenes.java index 9739f37ca8..4bf29e8843 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/BeltScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/BeltScenes.java @@ -14,20 +14,21 @@ import com.simibubi.create.content.contraptions.relays.belt.BeltPart; import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; import com.simibubi.create.content.contraptions.relays.elementary.ShaftBlock; import com.simibubi.create.content.logistics.block.mechanicalArm.ArmTileEntity.Phase; -import com.simibubi.create.foundation.ponder.ElementLink; -import com.simibubi.create.foundation.ponder.PonderPalette; -import com.simibubi.create.foundation.ponder.SceneBuilder; -import com.simibubi.create.foundation.ponder.SceneBuildingUtil; -import com.simibubi.create.foundation.ponder.Selection; -import com.simibubi.create.foundation.ponder.element.EntityElement; -import com.simibubi.create.foundation.ponder.element.InputWindowElement; -import com.simibubi.create.foundation.ponder.element.ParrotElement; -import com.simibubi.create.foundation.ponder.element.ParrotElement.FaceCursorPose; -import com.simibubi.create.foundation.ponder.element.ParrotElement.FacePointOfInterestPose; -import com.simibubi.create.foundation.ponder.element.WorldSectionElement; -import com.simibubi.create.foundation.utility.NBTHelper; -import com.simibubi.create.foundation.utility.Pointing; +import com.simibubi.create.foundation.ponder.CreateSceneBuilder; +import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.foundation.ElementLink; +import net.createmod.ponder.foundation.PonderPalette; +import net.createmod.ponder.foundation.SceneBuilder; +import net.createmod.ponder.foundation.SceneBuildingUtil; +import net.createmod.ponder.foundation.Selection; +import net.createmod.ponder.foundation.element.EntityElement; +import net.createmod.ponder.foundation.element.InputWindowElement; +import net.createmod.ponder.foundation.element.ParrotElement; +import net.createmod.ponder.foundation.element.ParrotElement.FaceCursorPose; +import net.createmod.ponder.foundation.element.ParrotElement.FacePointOfInterestPose; +import net.createmod.ponder.foundation.element.WorldSectionElement; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -42,7 +43,8 @@ import net.minecraft.world.phys.Vec3; public class BeltScenes { - public static void beltConnector(SceneBuilder scene, SceneBuildingUtil util) { + public static void beltConnector(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("belt_connector", "Using Mechanical Belts"); scene.configureBasePlate(0, 0, 5); scene.showBasePlate(); @@ -145,7 +147,7 @@ public class BeltScenes { scene.idle(20); scene.overlay.showControls(new InputWindowElement(util.vector.topOf(shaftLocation), Pointing.DOWN).rightClick() - .withWrench(), 50); + .withItem(AllItems.WRENCH.asStack()), 50); scene.idle(7); scene.world.modifyBlock(shaftLocation, s -> s.setValue(BeltBlock.PART, BeltPart.MIDDLE), true); scene.idle(10); @@ -320,7 +322,8 @@ public class BeltScenes { scene.markAsFinished(); } - public static void transport(SceneBuilder scene, SceneBuildingUtil util) { + public static void transport(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("belt_transport", "Using Mechanical Belts for Logistics"); scene.configureBasePlate(0, 0, 5); scene.setSceneOffsetY(-1); @@ -472,7 +475,7 @@ public class BeltScenes { scene.overlay .showControls(new InputWindowElement(util.vector.topOf(beltPos.south()), Pointing.DOWN).rightClick() - .withWrench(), 40); + .withItem(AllItems.WRENCH.asStack()), 40); scene.idle(7); scene.world.modifyBlock(beltPos.south(), s -> s.setValue(BeltBlock.CASING, false), true); scene.overlay.showText(80) @@ -481,7 +484,8 @@ public class BeltScenes { .pointAt(util.vector.blockSurface(beltPos.south(), Direction.WEST)); } - public static void depot(SceneBuilder scene, SceneBuildingUtil util) { + public static void depot(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("depot", "Using Depots"); scene.configureBasePlate(0, 0, 5); scene.showBasePlate(); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/CartAssemblerScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/CartAssemblerScenes.java index 90351ed32f..6177d3a0cb 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/CartAssemblerScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/CartAssemblerScenes.java @@ -4,18 +4,19 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssembleRailType; import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerBlock; -import com.simibubi.create.foundation.ponder.ElementLink; -import com.simibubi.create.foundation.ponder.PonderPalette; -import com.simibubi.create.foundation.ponder.SceneBuilder; -import com.simibubi.create.foundation.ponder.SceneBuildingUtil; -import com.simibubi.create.foundation.ponder.Selection; -import com.simibubi.create.foundation.ponder.element.EntityElement; -import com.simibubi.create.foundation.ponder.element.InputWindowElement; -import com.simibubi.create.foundation.ponder.element.MinecartElement; -import com.simibubi.create.foundation.ponder.element.WorldSectionElement; -import com.simibubi.create.foundation.ponder.instruction.EmitParticlesInstruction.Emitter; -import com.simibubi.create.foundation.utility.Pointing; +import com.simibubi.create.foundation.ponder.CreateSceneBuilder; +import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.foundation.ElementLink; +import net.createmod.ponder.foundation.PonderPalette; +import net.createmod.ponder.foundation.SceneBuilder; +import net.createmod.ponder.foundation.SceneBuildingUtil; +import net.createmod.ponder.foundation.Selection; +import net.createmod.ponder.foundation.element.EntityElement; +import net.createmod.ponder.foundation.element.InputWindowElement; +import net.createmod.ponder.foundation.element.MinecartElement; +import net.createmod.ponder.foundation.element.WorldSectionElement; +import net.createmod.ponder.foundation.instruction.EmitParticlesInstruction.Emitter; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.particles.ParticleTypes; @@ -31,7 +32,8 @@ import net.minecraft.world.phys.Vec3; public class CartAssemblerScenes { - public static void anchor(SceneBuilder scene, SceneBuildingUtil util) { + public static void anchor(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("cart_assembler", "Moving Structures using Cart Assemblers"); scene.configureBasePlate(0, 0, 5); scene.scaleSceneView(.9f); @@ -148,7 +150,7 @@ public class CartAssemblerScenes { Vec3 cartCenter = util.vector.centerOf(assemblerPos.north(2)); scene.overlay.showControls(new InputWindowElement(cartCenter, Pointing.LEFT).rightClick() - .withWrench(), 40); + .withItem(AllItems.WRENCH.asStack()), 40); scene.idle(7); scene.special.moveCart(cart, util.vector.of(0, -100, 4), 0); scene.world.moveSection(anchor, util.vector.of(0, -100, 4), 0); @@ -177,7 +179,8 @@ public class CartAssemblerScenes { scene.world.moveSection(contraption, util.vector.of(0, -.5, 0), 5); } - public static void modes(SceneBuilder scene, SceneBuildingUtil util) { + public static void modes(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("cart_assembler_modes", "Orientation Settings for Minecart Contraptions"); scene.configureBasePlate(0, 0, 5); scene.world.showSection(util.select.layer(0), Direction.UP); @@ -259,7 +262,7 @@ public class CartAssemblerScenes { .add(0, 0, -2 / 16f); scene.overlay.showScrollInput(blockSurface, Direction.NORTH, 60); scene.overlay.showControls(new InputWindowElement(blockSurface, Pointing.DOWN).scroll() - .withWrench(), 60); + .withItem(AllItems.WRENCH.asStack()), 60); scene.idle(10); scene.overlay.showText(60) .pointAt(util.vector.of(3, 1.5, 3)) @@ -413,7 +416,8 @@ public class CartAssemblerScenes { } - public static void rails(SceneBuilder scene, SceneBuildingUtil util) { + public static void rails(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("cart_assembler_rails", "Other types of Minecarts and Rails"); scene.configureBasePlate(0, 0, 6); scene.scaleSceneView(.9f); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/ChainDriveScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/ChainDriveScenes.java index 73984829c7..c7b2768d50 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/ChainDriveScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/ChainDriveScenes.java @@ -1,17 +1,19 @@ package com.simibubi.create.foundation.ponder.content; +import com.simibubi.create.AllItems; import com.simibubi.create.content.contraptions.relays.encased.EncasedBeltBlock; import com.simibubi.create.content.logistics.block.redstone.AnalogLeverTileEntity; -import com.simibubi.create.foundation.ponder.ElementLink; -import com.simibubi.create.foundation.ponder.PonderPalette; -import com.simibubi.create.foundation.ponder.SceneBuilder; -import com.simibubi.create.foundation.ponder.SceneBuildingUtil; -import com.simibubi.create.foundation.ponder.Selection; -import com.simibubi.create.foundation.ponder.element.InputWindowElement; -import com.simibubi.create.foundation.ponder.element.TextWindowElement.Builder; -import com.simibubi.create.foundation.ponder.element.WorldSectionElement; -import com.simibubi.create.foundation.utility.Pointing; +import com.simibubi.create.foundation.ponder.CreateSceneBuilder; +import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.foundation.ElementLink; +import net.createmod.ponder.foundation.PonderPalette; +import net.createmod.ponder.foundation.SceneBuilder; +import net.createmod.ponder.foundation.SceneBuildingUtil; +import net.createmod.ponder.foundation.Selection; +import net.createmod.ponder.foundation.element.InputWindowElement; +import net.createmod.ponder.foundation.element.TextWindowElement.Builder; +import net.createmod.ponder.foundation.element.WorldSectionElement; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -20,7 +22,8 @@ import net.minecraft.world.phys.AABB; public class ChainDriveScenes { - public static void chainDriveAsRelay(SceneBuilder scene, SceneBuildingUtil util) { + public static void chainDriveAsRelay(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("chain_drive", "Relaying rotational force with Chain Drives"); scene.configureBasePlate(0, 0, 5); scene.world.showSection(util.select.layer(0), Direction.UP); @@ -76,7 +79,7 @@ public class ChainDriveScenes { scene.addKeyframe(); scene.overlay.showControls(new InputWindowElement(util.vector.topOf(rotatedECD), Pointing.DOWN).rightClick() - .withWrench(), 30); + .withItem(AllItems.WRENCH.asStack()), 30); scene.idle(7); scene.world.modifyBlock(rotatedECD, s -> s.setValue(EncasedBeltBlock.AXIS, Axis.Y), true); scene.idle(40); @@ -94,7 +97,8 @@ public class ChainDriveScenes { scene.markAsFinished(); } - public static void adjustableChainGearshift(SceneBuilder scene, SceneBuildingUtil util) { + public static void adjustableChainGearshift(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("chain_gearshift", "Controlling rotational speed with Chain Gearshifts"); scene.configureBasePlate(0, 0, 5); scene.setSceneOffsetY(-1); @@ -255,14 +259,14 @@ public class ChainDriveScenes { for (BlockPos gauge : new BlockPos[] { eastGauge, middleGauge, westGauge }) { scene.idle(5); - Builder builder = scene.overlay.showText(180) + Builder textBuilder = scene.overlay.showText(180) .colored(gauge == westGauge ? PonderPalette.SLOW : PonderPalette.MEDIUM) .placeNearTarget() .pointAt(util.vector.blockSurface(gauge, Direction.NORTH)); if (gauge == westGauge) - builder.text("12 RPM"); + textBuilder.text("12 RPM"); else - builder.sharedText(gauge == eastGauge ? "rpm16_source" : "rpm16"); + textBuilder.sharedText(gauge == eastGauge ? "rpm16_source" : "rpm16"); } } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/ChassisScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/ChassisScenes.java index f1fcde366b..50bfefa679 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/ChassisScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/ChassisScenes.java @@ -5,15 +5,16 @@ import org.apache.commons.lang3.mutable.MutableObject; import com.simibubi.create.AllItems; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.LinearChassisBlock; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.RadialChassisBlock; -import com.simibubi.create.foundation.ponder.ElementLink; -import com.simibubi.create.foundation.ponder.PonderPalette; -import com.simibubi.create.foundation.ponder.SceneBuilder; -import com.simibubi.create.foundation.ponder.SceneBuildingUtil; -import com.simibubi.create.foundation.ponder.Selection; -import com.simibubi.create.foundation.ponder.element.InputWindowElement; -import com.simibubi.create.foundation.ponder.element.WorldSectionElement; -import com.simibubi.create.foundation.utility.Pointing; +import com.simibubi.create.foundation.ponder.CreateSceneBuilder; +import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.foundation.ElementLink; +import net.createmod.ponder.foundation.PonderPalette; +import net.createmod.ponder.foundation.SceneBuilder; +import net.createmod.ponder.foundation.SceneBuildingUtil; +import net.createmod.ponder.foundation.Selection; +import net.createmod.ponder.foundation.element.InputWindowElement; +import net.createmod.ponder.foundation.element.WorldSectionElement; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.item.ItemStack; @@ -24,7 +25,8 @@ import net.minecraft.world.phys.Vec3; public class ChassisScenes { - public static void linearGroup(SceneBuilder scene, SceneBuildingUtil util) { + public static void linearGroup(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("linear_chassis_group", "Moving Linear Chassis in groups"); scene.configureBasePlate(0, 0, 5); scene.world.showSection(util.select.layer(0), Direction.UP); @@ -89,7 +91,8 @@ public class ChassisScenes { scene.idle(50); } - public static void linearAttachement(SceneBuilder scene, SceneBuildingUtil util) { + public static void linearAttachement(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("linear_chassis_attachment", "Attaching blocks using Linear Chassis"); scene.configureBasePlate(0, 0, 5); scene.setSceneOffsetY(-1); @@ -183,7 +186,7 @@ public class ChassisScenes { Vec3 blockSurface = util.vector.blockSurface(chassisPos, Direction.NORTH); scene.overlay.showCenteredScrollInput(chassisPos, Direction.NORTH, 50); scene.overlay.showControls(new InputWindowElement(blockSurface, Pointing.UP).scroll() - .withWrench(), 50); + .withItem(AllItems.WRENCH.asStack()), 50); scene.idle(10); scene.overlay.showOutline(PonderPalette.WHITE, chassis, column3, 20); @@ -216,7 +219,7 @@ public class ChassisScenes { scene.overlay.showCenteredScrollInput(chassisPos, Direction.NORTH, 50); scene.overlay.showControls(new InputWindowElement(blockSurface, Pointing.UP).whileCTRL() .scroll() - .withWrench(), 50); + .withItem(AllItems.WRENCH.asStack()), 50); column1 = util.select.fromTo(1, 3, 2, 3, 3, 2); column2 = util.select.fromTo(1, 3, 2, 3, 4, 2); @@ -291,7 +294,8 @@ public class ChassisScenes { scene.world.rotateSection(chain, 0, 720, 0, 160); } - public static void radial(SceneBuilder scene, SceneBuildingUtil util) { + public static void radial(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("radial_chassis", "Attaching blocks using Radial Chassis"); scene.configureBasePlate(0, 0, 5); scene.setSceneOffsetY(-1); @@ -442,7 +446,7 @@ public class ChassisScenes { blockSurface = util.vector.topOf(chassisPos); scene.overlay.showCenteredScrollInput(chassisPos, Direction.UP, 50); scene.overlay.showControls(new InputWindowElement(blockSurface, Pointing.DOWN).scroll() - .withWrench(), 50); + .withItem(AllItems.WRENCH.asStack()), 50); scene.idle(10); scene.overlay.showOutline(PonderPalette.WHITE, chassis, r2, 20); @@ -483,7 +487,8 @@ public class ChassisScenes { .text("Blocks not reachable by any sticky face will not attach"); } - public static void superGlue(SceneBuilder scene, SceneBuildingUtil util) { + public static void superGlue(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("super_glue", "Attaching blocks using Super Glue"); scene.configureBasePlate(0, 0, 5); scene.showBasePlate(); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/ChuteScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/ChuteScenes.java index 61f6072407..c0e374e6d6 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/ChuteScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/ChuteScenes.java @@ -7,16 +7,17 @@ import com.simibubi.create.AllItems; import com.simibubi.create.content.logistics.block.chute.ChuteBlock; import com.simibubi.create.content.logistics.block.chute.ChuteBlock.Shape; import com.simibubi.create.content.logistics.block.chute.SmartChuteTileEntity; -import com.simibubi.create.foundation.ponder.ElementLink; -import com.simibubi.create.foundation.ponder.PonderPalette; -import com.simibubi.create.foundation.ponder.SceneBuilder; -import com.simibubi.create.foundation.ponder.SceneBuildingUtil; -import com.simibubi.create.foundation.ponder.Selection; -import com.simibubi.create.foundation.ponder.element.EntityElement; -import com.simibubi.create.foundation.ponder.element.InputWindowElement; -import com.simibubi.create.foundation.ponder.element.WorldSectionElement; -import com.simibubi.create.foundation.utility.Pointing; +import com.simibubi.create.foundation.ponder.CreateSceneBuilder; +import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.foundation.ElementLink; +import net.createmod.ponder.foundation.PonderPalette; +import net.createmod.ponder.foundation.SceneBuilder; +import net.createmod.ponder.foundation.SceneBuildingUtil; +import net.createmod.ponder.foundation.Selection; +import net.createmod.ponder.foundation.element.EntityElement; +import net.createmod.ponder.foundation.element.InputWindowElement; +import net.createmod.ponder.foundation.element.WorldSectionElement; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.entity.Entity; @@ -28,7 +29,8 @@ import net.minecraft.world.phys.Vec3; public class ChuteScenes { - public static void downward(SceneBuilder scene, SceneBuildingUtil util) { + public static void downward(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("chute", "Transporting Items downward via Chutes"); scene.configureBasePlate(0, 0, 5); scene.scaleSceneView(.9f); @@ -63,7 +65,7 @@ public class ChuteScenes { scene.overlay.showControls( new InputWindowElement(util.vector.blockSurface(util.grid.at(2, 3, 2), Direction.NORTH), Pointing.RIGHT) .rightClick() - .withWrench(), + .withItem(AllItems.WRENCH.asStack()), 40); scene.idle(7); scene.world.modifyBlock(util.grid.at(3, 3, 3), s -> s.setValue(ChuteBlock.SHAPE, ChuteBlock.Shape.WINDOW), false); @@ -139,7 +141,8 @@ public class ChuteScenes { scene.markAsFinished(); } - public static void upward(SceneBuilder scene, SceneBuildingUtil util) { + public static void upward(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("chute_upward", "Transporting Items upward via Chutes"); scene.configureBasePlate(0, 0, 5); scene.scaleSceneView(.9f); @@ -189,7 +192,8 @@ public class ChuteScenes { scene.world.createItemOnBeltLike(util.grid.at(1, 2, 2), Direction.EAST, stack); } - public static void smart(SceneBuilder scene, SceneBuildingUtil util) { + public static void smart(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("smart_chute", "Filtering Items using Smart Chutes"); scene.configureBasePlate(0, 0, 5); scene.scaleSceneView(.9f); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/CrafterScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/CrafterScenes.java index 7bfe68a549..5b8df66d63 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/CrafterScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/CrafterScenes.java @@ -6,15 +6,17 @@ import com.google.common.collect.ImmutableList; import com.simibubi.create.AllItems; import com.simibubi.create.content.contraptions.components.crafter.MechanicalCrafterBlock; import com.simibubi.create.content.contraptions.components.crafter.MechanicalCrafterTileEntity; -import com.simibubi.create.foundation.ponder.ElementLink; -import com.simibubi.create.foundation.ponder.PonderPalette; -import com.simibubi.create.foundation.ponder.SceneBuilder; -import com.simibubi.create.foundation.ponder.SceneBuildingUtil; -import com.simibubi.create.foundation.ponder.Selection; -import com.simibubi.create.foundation.ponder.element.EntityElement; -import com.simibubi.create.foundation.ponder.element.InputWindowElement; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.Pointing; +import com.simibubi.create.foundation.ponder.CreateSceneBuilder; + +import net.createmod.ponder.foundation.ElementLink; +import net.createmod.ponder.foundation.PonderPalette; +import net.createmod.ponder.foundation.SceneBuilder; +import net.createmod.ponder.foundation.SceneBuildingUtil; +import net.createmod.ponder.foundation.Selection; +import net.createmod.ponder.foundation.element.EntityElement; +import net.createmod.ponder.foundation.element.InputWindowElement; +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.Pointing; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -28,7 +30,8 @@ import net.minecraftforge.items.ItemHandlerHelper; public class CrafterScenes { - public static void setup(SceneBuilder scene, SceneBuildingUtil util) { + public static void setup(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("mechanical_crafter", "Setting up Mechanical Crafters"); scene.configureBasePlate(0, 0, 5); scene.world.showSection(util.select.layer(0), Direction.UP); @@ -59,7 +62,7 @@ public class CrafterScenes { scene.overlay.showControls( new InputWindowElement(util.vector.blockSurface(util.grid.at(2, 3, 2), Direction.NORTH), Pointing.RIGHT) .rightClick() - .withWrench(), + .withItem(AllItems.WRENCH.asStack()), 40); scene.idle(7); scene.world.cycleBlockProperty(util.grid.at(2, 3, 2), MechanicalCrafterBlock.POINTING); @@ -76,7 +79,7 @@ public class CrafterScenes { for (BlockPos pos : positions) { scene.overlay.showControls( new InputWindowElement(util.vector.blockSurface(pos, Direction.NORTH), Pointing.RIGHT).rightClick() - .withWrench(), + .withItem(AllItems.WRENCH.asStack()), 10); scene.idle(7); scene.world.cycleBlockProperty(pos, MechanicalCrafterBlock.POINTING); @@ -234,7 +237,8 @@ public class CrafterScenes { scene.world.toggleRedstonePower(redstone); } - public static void connect(SceneBuilder scene, SceneBuildingUtil util) { + public static void connect(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("mechanical_crafter_connect", "Connecting Inventories of Crafters"); scene.configureBasePlate(0, 0, 5); scene.world.showSection(util.select.layer(0), Direction.UP); @@ -285,7 +289,7 @@ public class CrafterScenes { scene.overlay.chaseBoundingBoxOutline(PonderPalette.WHITE, new Object(), bb, 45); scene.overlay.showControls(new InputWindowElement(v, Pointing.LEFT).rightClick() - .withWrench(), 40); + .withItem(AllItems.WRENCH.asStack()), 40); scene.idle(7); scene.world.connectCrafterInvs(util.grid.at(2, 2, 2), util.grid.at(1, 2, 2)); scene.idle(40); @@ -296,22 +300,22 @@ public class CrafterScenes { .text("Using the Wrench at their backs, Mechanical Crafter inputs can be combined"); scene.idle(80); scene.overlay.showControls(new InputWindowElement(v.add(0, 1, 0), Pointing.LEFT).rightClick() - .withWrench(), 20); + .withItem(AllItems.WRENCH.asStack()), 20); scene.idle(7); scene.world.connectCrafterInvs(util.grid.at(2, 3, 2), util.grid.at(1, 3, 2)); scene.idle(20); scene.overlay.showControls(new InputWindowElement(v.add(0, -1, 0), Pointing.LEFT).rightClick() - .withWrench(), 20); + .withItem(AllItems.WRENCH.asStack()), 20); scene.idle(7); scene.world.connectCrafterInvs(util.grid.at(2, 1, 2), util.grid.at(1, 1, 2)); scene.idle(20); scene.overlay.showControls(new InputWindowElement(v.add(.5, -.5, 0), Pointing.LEFT).rightClick() - .withWrench(), 20); + .withItem(AllItems.WRENCH.asStack()), 20); scene.idle(7); scene.world.connectCrafterInvs(util.grid.at(2, 1, 2), util.grid.at(2, 2, 2)); scene.idle(10); scene.overlay.showControls(new InputWindowElement(v.add(.5, .5, 0), Pointing.LEFT).rightClick() - .withWrench(), 20); + .withItem(AllItems.WRENCH.asStack()), 20); scene.idle(7); scene.world.connectCrafterInvs(util.grid.at(2, 2, 2), util.grid.at(2, 3, 2)); scene.idle(20); @@ -343,7 +347,9 @@ public class CrafterScenes { } - public static void covers(SceneBuilder scene, SceneBuildingUtil util) { + public static void covers(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); + scene.title("mechanical_crafter_covers", "Covering slots of Mechanical Crafters"); scene.configureBasePlate(0, 0, 5); scene.world.showSection(util.select.layer(0), Direction.UP); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java deleted file mode 100644 index 196bb65a6a..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java +++ /dev/null @@ -1,451 +0,0 @@ -package com.simibubi.create.foundation.ponder.content; - -import com.simibubi.create.AllBlocks; -import com.simibubi.create.AllItems; -import com.simibubi.create.content.contraptions.base.IRotate.SpeedLevel; -import com.simibubi.create.content.contraptions.particle.RotationIndicatorParticleData; -import com.simibubi.create.foundation.ponder.ElementLink; -import com.simibubi.create.foundation.ponder.PonderPalette; -import com.simibubi.create.foundation.ponder.PonderStoryBoardEntry.PonderStoryBoard; -import com.simibubi.create.foundation.ponder.SceneBuilder; -import com.simibubi.create.foundation.ponder.SceneBuildingUtil; -import com.simibubi.create.foundation.ponder.Selection; -import com.simibubi.create.foundation.ponder.element.BeltItemElement; -import com.simibubi.create.foundation.ponder.element.InputWindowElement; -import com.simibubi.create.foundation.ponder.element.ParrotElement.DancePose; -import com.simibubi.create.foundation.ponder.element.ParrotElement.FacePointOfInterestPose; -import com.simibubi.create.foundation.ponder.element.WorldSectionElement; -import com.simibubi.create.foundation.ponder.instruction.EmitParticlesInstruction.Emitter; -import com.simibubi.create.foundation.utility.Pointing; -import com.tterrag.registrate.util.entry.ItemEntry; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.item.ItemEntity; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.phys.AABB; -import net.minecraft.world.phys.Vec3; - -public class DebugScenes { - - private static int index; - - public static void registerAll() { - index = 1; - add(DebugScenes::coordinateScene); - add(DebugScenes::blocksScene); - add(DebugScenes::fluidsScene); - add(DebugScenes::offScreenScene); - add(DebugScenes::particleScene); - add(DebugScenes::controlsScene); - add(DebugScenes::birbScene); - add(DebugScenes::sectionsScene); - add(DebugScenes::itemScene); - add(DebugScenes::pipeScene); - } - - private static void add(PonderStoryBoard sb) { - ItemEntry item = AllItems.BRASS_HAND; - String schematicPath = "debug/scene_" + index; - PonderIndex.HELPER.addStoryBoard(item, schematicPath, sb) - .highlightAllTags() - .chapter(PonderIndex.HELPER.getOrCreateChapter("debug")); - index++; - } - - public static void empty(SceneBuilder scene, SceneBuildingUtil util) { - scene.title("debug_empty", "Missing Content"); - scene.showBasePlate(); - scene.idle(5); - } - - public static void coordinateScene(SceneBuilder scene, SceneBuildingUtil util) { - scene.title("debug_coords", "Coordinate Space"); - scene.showBasePlate(); - scene.idle(10); - scene.world.showSection(util.select.layersFrom(1), Direction.DOWN); - - Selection xAxis = util.select.fromTo(2, 1, 1, 4, 1, 1); - Selection yAxis = util.select.fromTo(1, 2, 1, 1, 4, 1); - Selection zAxis = util.select.fromTo(1, 1, 2, 1, 1, 4); - - scene.idle(10); - scene.overlay.showSelectionWithText(xAxis, 20) - .colored(PonderPalette.RED) - .text("Das X axis"); - scene.idle(20); - scene.overlay.showSelectionWithText(yAxis, 20) - .colored(PonderPalette.GREEN) - .text("Das Y axis"); - scene.idle(20); - scene.overlay.showSelectionWithText(zAxis, 20) - .colored(PonderPalette.BLUE) - .text("Das Z axis"); - } - - public static void blocksScene(SceneBuilder scene, SceneBuildingUtil util) { - scene.title("debug_blocks", "Changing Blocks"); - scene.showBasePlate(); - scene.idle(10); - scene.world.showSection(util.select.layersFrom(1), Direction.DOWN); - scene.idle(10); - scene.overlay.showText(1000) - .independent(10) - .text("Blocks can be modified"); - scene.idle(20); - scene.world.replaceBlocks(util.select.fromTo(1, 1, 3, 2, 2, 4), - AllBlocks.REFINED_RADIANCE_CASING.getDefaultState(), true); - scene.idle(10); - scene.world.replaceBlocks(util.select.position(3, 1, 1), Blocks.GOLD_BLOCK.defaultBlockState(), true); - scene.rotateCameraY(180); - scene.markAsFinished(); - } - - public static void fluidsScene(SceneBuilder scene, SceneBuildingUtil util) { - scene.title("debug_fluids", "Showing Fluids"); - scene.showBasePlate(); - scene.idle(10); - Vec3 parrotPos = util.vector.topOf(1, 0, 1); - scene.special.createBirb(parrotPos, FacePointOfInterestPose::new); - scene.world.showSection(util.select.layersFrom(1), Direction.DOWN); - scene.overlay.showText(1000) - .text("Fluid rendering test.") - .pointAt(new Vec3(1, 2.5, 4.5)); - scene.markAsFinished(); - - Object outlineSlot = new Object(); - - Vec3 vec1 = util.vector.topOf(1, 0, 0); - Vec3 vec2 = util.vector.topOf(0, 0, 1); - AABB boundingBox1 = new AABB(vec1, vec1).expandTowards(0, 2.5, 0) - .inflate(.15, 0, .15); - AABB boundingBox2 = new AABB(vec2, vec2).expandTowards(0, .125, 0) - .inflate(.45, 0, .45); - Vec3 poi1 = boundingBox1.getCenter(); - Vec3 poi2 = boundingBox2.getCenter(); - - for (int i = 0; i < 10; i++) { - scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, outlineSlot, - i % 2 == 0 ? boundingBox1 : boundingBox2, 15); - scene.idle(3); - scene.special.movePointOfInterest(i % 2 == 0 ? poi1 : poi2); - scene.idle(12); - } - - scene.idle(12); - scene.special.movePointOfInterest(util.grid.at(-4, 5, 4)); - scene.overlay.showText(40) - .colored(PonderPalette.RED) - .text("wut?") - .pointAt(parrotPos.add(-.25f, 0.25f, .25f)); - - } - - public static void offScreenScene(SceneBuilder scene, SceneBuildingUtil util) { - scene.title("debug_baseplate", "Out of bounds / configureBasePlate"); - scene.configureBasePlate(1, 0, 6); - scene.showBasePlate(); - - Selection out1 = util.select.fromTo(7, 0, 0, 8, 0, 5); - Selection out2 = util.select.fromTo(0, 0, 0, 0, 0, 5); - Selection blocksExceptBasePlate = util.select.layersFrom(1) - .add(out1) - .add(out2); - - scene.idle(10); - scene.world.showSection(blocksExceptBasePlate, Direction.DOWN); - scene.idle(10); - - scene.overlay.showSelectionWithText(out1, 100) - .colored(PonderPalette.BLACK) - .text("Blocks outside of the base plate do not affect scaling"); - scene.overlay.showSelectionWithText(out2, 100) - .colored(PonderPalette.BLACK) - .text("configureBasePlate() makes sure of that."); - scene.markAsFinished(); - } - - public static void particleScene(SceneBuilder scene, SceneBuildingUtil util) { - scene.title("debug_particles", "Emitting particles"); - scene.showBasePlate(); - scene.idle(10); - scene.world.showSection(util.select.layersFrom(1), Direction.DOWN); - scene.idle(10); - - Vec3 emitterPos = util.vector.of(2.5, 2.25, 2.5); - Emitter emitter = Emitter.simple(ParticleTypes.LAVA, util.vector.of(0, .1, 0)); - Emitter rotation = - Emitter.simple(new RotationIndicatorParticleData(SpeedLevel.MEDIUM.getColor(), 12, 1, 1, 20, 'Y'), - util.vector.of(0, .1, 0)); - - scene.overlay.showText(20) - .text("Incoming...") - .pointAt(emitterPos); - scene.idle(30); - scene.effects.emitParticles(emitterPos, emitter, 1, 60); - scene.effects.emitParticles(emitterPos, rotation, 20, 1); - scene.idle(30); - scene.rotateCameraY(180); - } - - public static void controlsScene(SceneBuilder scene, SceneBuildingUtil util) { - scene.title("debug_controls", "Basic player interaction"); - scene.showBasePlate(); - scene.idle(10); - scene.world.showSection(util.select.layer(1), Direction.DOWN); - scene.idle(4); - scene.world.showSection(util.select.layer(2), Direction.DOWN); - scene.idle(4); - scene.world.showSection(util.select.layer(3), Direction.DOWN); - scene.idle(10); - - BlockPos shaftPos = util.grid.at(3, 1, 1); - Selection shaftSelection = util.select.position(shaftPos); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(shaftPos), Pointing.DOWN).rightClick() - .whileSneaking() - .withWrench(), 40); - scene.idle(20); - scene.world.replaceBlocks(shaftSelection, AllBlocks.SHAFT.getDefaultState(), true); - - scene.idle(20); - scene.world.hideSection(shaftSelection, Direction.UP); - - scene.idle(20); - - scene.overlay.showControls(new InputWindowElement(util.vector.of(1, 4.5, 3.5), Pointing.LEFT).rightClick() - .withItem(new ItemStack(Blocks.POLISHED_ANDESITE)), 20); - scene.world.showSection(util.select.layer(4), Direction.DOWN); - - scene.idle(40); - - BlockPos chassis = util.grid.at(1, 1, 3); - Vec3 chassisSurface = util.vector.blockSurface(chassis, Direction.NORTH); - - Object chassisValueBoxHighlight = new Object(); - Object chassisEffectHighlight = new Object(); - - AABB point = new AABB(chassisSurface, chassisSurface); - AABB expanded = point.inflate(1 / 4f, 1 / 4f, 1 / 16f); - - Selection singleBlock = util.select.position(1, 2, 3); - Selection twoBlocks = util.select.fromTo(1, 2, 3, 1, 3, 3); - Selection threeBlocks = util.select.fromTo(1, 2, 3, 1, 4, 3); - - Selection singleRow = util.select.fromTo(1, 2, 3, 3, 2, 3); - Selection twoRows = util.select.fromTo(1, 2, 3, 3, 3, 3); - Selection threeRows = twoRows.copy() - .add(threeBlocks); - - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, chassisValueBoxHighlight, point, 1); - scene.idle(1); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, chassisValueBoxHighlight, expanded, 120); - scene.overlay.showControls(new InputWindowElement(chassisSurface, Pointing.UP).scroll() - .withWrench(), 40); - - PonderPalette white = PonderPalette.WHITE; - scene.overlay.showOutline(white, chassisEffectHighlight, singleBlock, 10); - scene.idle(10); - scene.overlay.showOutline(white, chassisEffectHighlight, twoBlocks, 10); - scene.idle(10); - scene.overlay.showOutline(white, chassisEffectHighlight, threeBlocks, 10); - scene.idle(10); - scene.overlay.showOutline(white, chassisEffectHighlight, twoBlocks, 10); - scene.idle(10); - scene.overlay.showOutline(white, chassisEffectHighlight, singleBlock, 10); - scene.idle(10); - - scene.idle(30); - scene.overlay.showControls(new InputWindowElement(chassisSurface, Pointing.UP).whileCTRL() - .scroll() - .withWrench(), 40); - - scene.overlay.showOutline(white, chassisEffectHighlight, singleRow, 10); - scene.idle(10); - scene.overlay.showOutline(white, chassisEffectHighlight, twoRows, 10); - scene.idle(10); - scene.overlay.showOutline(white, chassisEffectHighlight, threeRows, 10); - scene.idle(10); - scene.overlay.showOutline(white, chassisEffectHighlight, twoRows, 10); - scene.idle(10); - scene.overlay.showOutline(white, chassisEffectHighlight, singleRow, 10); - scene.idle(10); - - scene.markAsFinished(); - } - - public static void birbScene(SceneBuilder scene, SceneBuildingUtil util) { - scene.title("debug_birbs", "Birbs"); - scene.showBasePlate(); - scene.idle(10); - scene.world.showSection(util.select.layersFrom(1), Direction.DOWN); - scene.idle(10); - - BlockPos pos = new BlockPos(1, 2, 3); - scene.special.birbOnSpinnyShaft(pos); - scene.overlay.showText(100) - .colored(PonderPalette.GREEN) - .text("More birbs = More interesting") - .pointAt(util.vector.topOf(pos)); - - scene.idle(10); - scene.special.createBirb(util.vector.topOf(0, 1, 2), DancePose::new); - scene.idle(10); - - scene.special.createBirb(util.vector.centerOf(3, 1, 3) - .add(0, 0.25f, 0), FacePointOfInterestPose::new); - scene.idle(20); - - BlockPos poi1 = util.grid.at(4, 1, 0); - BlockPos poi2 = util.grid.at(0, 1, 4); - - scene.world.setBlock(poi1, Blocks.GOLD_BLOCK.defaultBlockState(), true); - scene.special.movePointOfInterest(poi1); - scene.idle(20); - - scene.world.setBlock(poi2, Blocks.GOLD_BLOCK.defaultBlockState(), true); - scene.special.movePointOfInterest(poi2); - scene.overlay.showText(20) - .text("Point of Interest") - .pointAt(util.vector.centerOf(poi2)); - scene.idle(20); - - scene.world.destroyBlock(poi1); - scene.special.movePointOfInterest(poi1); - scene.idle(20); - - scene.world.destroyBlock(poi2); - scene.special.movePointOfInterest(poi2); - } - - public static void sectionsScene(SceneBuilder scene, SceneBuildingUtil util) { - scene.title("debug_sections", "Sections"); - scene.showBasePlate(); - scene.idle(10); - scene.rotateCameraY(95); - - BlockPos mergePos = util.grid.at(1, 1, 1); - BlockPos independentPos = util.grid.at(3, 1, 1); - Selection toMerge = util.select.position(mergePos); - Selection independent = util.select.position(independentPos); - Selection start = util.select.layersFrom(1) - .substract(toMerge) - .substract(independent); - - scene.world.showSection(start, Direction.DOWN); - scene.idle(20); - - scene.world.showSection(toMerge, Direction.DOWN); - ElementLink link = scene.world.showIndependentSection(independent, Direction.DOWN); - - scene.idle(20); - - scene.overlay.showText(40) - .colored(PonderPalette.GREEN) - .text("This Section got merged to base.") - .pointAt(util.vector.topOf(mergePos)); - scene.idle(10); - scene.overlay.showText(40) - .colored(PonderPalette.RED) - .text("This Section renders independently.") - .pointAt(util.vector.topOf(independentPos)); - - scene.idle(40); - - scene.world.hideIndependentSection(link, Direction.DOWN); - scene.world.hideSection(util.select.fromTo(mergePos, util.grid.at(1, 1, 4)), Direction.DOWN); - - scene.idle(20); - - Selection hiddenReplaceArea = util.select.fromTo(2, 1, 2, 4, 1, 4) - .substract(util.select.position(4, 1, 3)) - .substract(util.select.position(2, 1, 3)); - - scene.world.hideSection(hiddenReplaceArea, Direction.UP); - scene.idle(20); - scene.world.setBlocks(hiddenReplaceArea, AllBlocks.REFINED_RADIANCE_CASING.getDefaultState(), false); - scene.world.showSection(hiddenReplaceArea, Direction.DOWN); - scene.idle(20); - scene.overlay.showSelectionWithText(hiddenReplaceArea, 30) - .colored(PonderPalette.BLUE) - .text("Seamless substitution of blocks"); - - scene.idle(40); - - ElementLink helicopter = scene.world.makeSectionIndependent(hiddenReplaceArea); - scene.world.rotateSection(helicopter, 50, 5 * 360, 0, 60); - scene.world.moveSection(helicopter, util.vector.of(0, 4, 5), 50); - scene.overlay.showText(30) - .colored(PonderPalette.BLUE) - .text("Up, up and away.") - .independent(30); - - scene.idle(40); - scene.world.hideIndependentSection(helicopter, Direction.UP); - - } - - public static void itemScene(SceneBuilder scene, SceneBuildingUtil util) { - scene.title("debug_items", "Manipulating Items"); - scene.configureBasePlate(0, 0, 6); - scene.world.showSection(util.select.layer(0), Direction.UP); - scene.idle(10); - scene.world.showSection(util.select.layersFrom(1), Direction.DOWN); - - ItemStack brassItem = AllItems.BRASS_INGOT.asStack(); - ItemStack copperItem = new ItemStack(Items.COPPER_INGOT); - - for (int z = 4; z >= 2; z--) { - scene.world.createItemEntity(util.vector.centerOf(0, 4, z), Vec3.ZERO, brassItem.copy()); - scene.idle(10); - } - - BlockPos beltPos = util.grid.at(2, 1, 3); - ElementLink itemOnBelt = - scene.world.createItemOnBelt(beltPos, Direction.EAST, copperItem.copy()); - - scene.idle(10); - scene.world.stallBeltItem(itemOnBelt, true); - scene.idle(5); - scene.overlay.showText(40) - .colored(PonderPalette.FAST) - .text("Belt Items can only be force-stalled on the belt they were created on.") - .pointAt(util.vector.topOf(2, 1, 2)); - scene.idle(45); - scene.world.stallBeltItem(itemOnBelt, false); - scene.idle(20); - - scene.world.modifyEntities(ItemEntity.class, entity -> { - if (copperItem.sameItem(entity.getItem())) - entity.setNoGravity(true); - }); - - scene.idle(20); - - scene.world.modifyEntities(ItemEntity.class, entity -> { - if (brassItem.sameItem(entity.getItem())) - entity.setDeltaMovement(util.vector.of(-.15f, .5f, 0)); - }); - - scene.idle(27); - - scene.world.modifyEntities(ItemEntity.class, Entity::discard); - } - - public static void pipeScene(SceneBuilder scene, SceneBuildingUtil util) { - scene.title("debug_pipes", "Manipulating Items"); - scene.configureBasePlate(0, 0, 5); - scene.world.showSection(util.select.layer(0), Direction.UP); - scene.idle(10); - scene.world.showSection(util.select.layersFrom(1), Direction.DOWN); - - - - - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/DeployerScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/DeployerScenes.java index 82205e5b78..e412ca3649 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/DeployerScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/DeployerScenes.java @@ -3,18 +3,19 @@ package com.simibubi.create.foundation.ponder.content; import com.simibubi.create.AllItems; import com.simibubi.create.content.contraptions.components.deployer.DeployerTileEntity; import com.simibubi.create.content.curiosities.tools.SandPaperItem; -import com.simibubi.create.foundation.ponder.ElementLink; -import com.simibubi.create.foundation.ponder.PonderPalette; -import com.simibubi.create.foundation.ponder.SceneBuilder; -import com.simibubi.create.foundation.ponder.SceneBuildingUtil; -import com.simibubi.create.foundation.ponder.Selection; +import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import com.simibubi.create.foundation.ponder.element.BeltItemElement; -import com.simibubi.create.foundation.ponder.element.EntityElement; -import com.simibubi.create.foundation.ponder.element.InputWindowElement; -import com.simibubi.create.foundation.ponder.element.WorldSectionElement; -import com.simibubi.create.foundation.ponder.instruction.EmitParticlesInstruction.Emitter; -import com.simibubi.create.foundation.utility.Pointing; +import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.foundation.ElementLink; +import net.createmod.ponder.foundation.PonderPalette; +import net.createmod.ponder.foundation.SceneBuilder; +import net.createmod.ponder.foundation.SceneBuildingUtil; +import net.createmod.ponder.foundation.Selection; +import net.createmod.ponder.foundation.element.EntityElement; +import net.createmod.ponder.foundation.element.InputWindowElement; +import net.createmod.ponder.foundation.element.WorldSectionElement; +import net.createmod.ponder.foundation.instruction.EmitParticlesInstruction.Emitter; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.particles.BlockParticleOption; @@ -30,7 +31,8 @@ import net.minecraft.world.phys.Vec3; public class DeployerScenes { - public static void filter(SceneBuilder scene, SceneBuildingUtil util) { + public static void filter(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("deployer", "Using the Deployer"); scene.configureBasePlate(0, 0, 5); @@ -234,7 +236,8 @@ public class DeployerScenes { } } - public static void modes(SceneBuilder scene, SceneBuildingUtil util) { + public static void modes(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("deployer_modes", "Modes of the Deployer"); scene.configureBasePlate(0, 0, 5); scene.world.showSection(util.select.layer(0), Direction.UP); @@ -277,7 +280,7 @@ public class DeployerScenes { scene.idle(46); scene.overlay.showControls(new InputWindowElement(frontVec, Pointing.LEFT).rightClick() - .withWrench(), 40); + .withItem(AllItems.WRENCH.asStack()), 40); scene.idle(7); scene.world.modifyTileNBT(deployerSelection, DeployerTileEntity.class, nbt -> nbt.putString("Mode", "PUNCH")); scene.idle(45); @@ -307,7 +310,8 @@ public class DeployerScenes { } } - public static void processing(SceneBuilder scene, SceneBuildingUtil util) { + public static void processing(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("deployer_processing", "Processing Items using Deployers"); scene.configureBasePlate(0, 0, 5); scene.world.showSection(util.select.layer(0), Direction.UP); @@ -423,7 +427,8 @@ public class DeployerScenes { scene.world.stallBeltItem(ingot2, false); } - public static void redstone(SceneBuilder scene, SceneBuildingUtil util) { + public static void redstone(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("deployer_redstone", "Controlling Deployers with Redstone"); scene.configureBasePlate(0, 0, 5); scene.world.showSection(util.select.layer(0), Direction.UP); @@ -489,7 +494,8 @@ public class DeployerScenes { } - public static void contraption(SceneBuilder scene, SceneBuildingUtil util) { + public static void contraption(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("deployer_contraption", "Using Deployers on Contraptions"); scene.configureBasePlate(0, 0, 6); scene.scaleSceneView(.9f); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/DisplayScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/DisplayScenes.java index 06fb92e84b..8093dcd327 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/DisplayScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/DisplayScenes.java @@ -2,16 +2,17 @@ package com.simibubi.create.foundation.ponder.content; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; -import com.simibubi.create.foundation.ponder.ElementLink; -import com.simibubi.create.foundation.ponder.PonderPalette; -import com.simibubi.create.foundation.ponder.SceneBuilder; -import com.simibubi.create.foundation.ponder.SceneBuildingUtil; -import com.simibubi.create.foundation.ponder.Selection; -import com.simibubi.create.foundation.ponder.element.InputWindowElement; -import com.simibubi.create.foundation.ponder.element.WorldSectionElement; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.Pointing; +import com.simibubi.create.foundation.ponder.CreateSceneBuilder; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.foundation.ElementLink; +import net.createmod.ponder.foundation.PonderPalette; +import net.createmod.ponder.foundation.SceneBuilder; +import net.createmod.ponder.foundation.SceneBuildingUtil; +import net.createmod.ponder.foundation.Selection; +import net.createmod.ponder.foundation.element.InputWindowElement; +import net.createmod.ponder.foundation.element.WorldSectionElement; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.chat.TextComponent; @@ -24,7 +25,8 @@ import net.minecraft.world.phys.Vec3; public class DisplayScenes { - public static void link(SceneBuilder scene, SceneBuildingUtil util) { + public static void link(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("display_link", "Setting up Display Links"); scene.configureBasePlate(0, 0, 5); scene.showBasePlate(); @@ -156,7 +158,7 @@ public class DisplayScenes { scene.world.moveSection(stressElement, util.vector.of(0, -2, 0), 0); scene.idle(10); scene.world.setDisplayBoardText(board, 1, - new TextComponent(1024 + " ").append(Lang.translateDirect("generic.unit.stress"))); + new TextComponent(1024 + " ").append(CreateLang.translateDirect("generic.unit.stress"))); scene.world.flashDisplayLink(linkPos); scene.idle(40); scene.world.hideIndependentSection(stressElement, Direction.SOUTH); @@ -185,7 +187,7 @@ public class DisplayScenes { scene.world.moveSection(cuckooElement, util.vector.of(0, -1, 0), 0); scene.idle(10); scene.world.setDisplayBoardText(board, 1, - new TextComponent("6:00 ").append(Lang.translateDirect("generic.daytime.pm"))); + new TextComponent("6:00 ").append(CreateLang.translateDirect("generic.daytime.pm"))); scene.world.setDisplayBoardText(board, 2, TextComponent.EMPTY); scene.world.flashDisplayLink(linkPos); scene.idle(90); @@ -225,7 +227,8 @@ public class DisplayScenes { scene.idle(60); } - public static void board(SceneBuilder scene, SceneBuildingUtil util) { + public static void board(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("display_board", "Using Display Boards"); scene.configureBasePlate(0, 0, 5); scene.showBasePlate(); @@ -372,7 +375,8 @@ public class DisplayScenes { } - public static void redstone(SceneBuilder scene, SceneBuildingUtil util) { + public static void redstone(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("display_link_redstone", "Redstone Control"); scene.configureBasePlate(0, 0, 5); scene.showBasePlate(); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/EjectorScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/EjectorScenes.java index 08a978e0c1..c8fda939bc 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/EjectorScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/EjectorScenes.java @@ -1,19 +1,21 @@ package com.simibubi.create.foundation.ponder.content; import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllItems; import com.simibubi.create.content.logistics.block.depot.EjectorTileEntity; import com.simibubi.create.foundation.gui.AllIcons; -import com.simibubi.create.foundation.ponder.ElementLink; -import com.simibubi.create.foundation.ponder.PonderPalette; -import com.simibubi.create.foundation.ponder.SceneBuilder; -import com.simibubi.create.foundation.ponder.SceneBuildingUtil; -import com.simibubi.create.foundation.ponder.Selection; -import com.simibubi.create.foundation.ponder.element.InputWindowElement; -import com.simibubi.create.foundation.ponder.element.ParrotElement; -import com.simibubi.create.foundation.ponder.element.WorldSectionElement; -import com.simibubi.create.foundation.utility.NBTHelper; -import com.simibubi.create.foundation.utility.Pointing; +import com.simibubi.create.foundation.ponder.CreateSceneBuilder; +import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.foundation.ElementLink; +import net.createmod.ponder.foundation.PonderPalette; +import net.createmod.ponder.foundation.SceneBuilder; +import net.createmod.ponder.foundation.SceneBuildingUtil; +import net.createmod.ponder.foundation.Selection; +import net.createmod.ponder.foundation.element.InputWindowElement; +import net.createmod.ponder.foundation.element.ParrotElement; +import net.createmod.ponder.foundation.element.WorldSectionElement; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.entity.Entity; @@ -26,7 +28,8 @@ import net.minecraftforge.items.ItemHandlerHelper; public class EjectorScenes { - public static void ejector(SceneBuilder scene, SceneBuildingUtil util) { + public static void ejector(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("weighted_ejector", "Using Weighted Ejectors"); scene.configureBasePlate(0, 0, 5); scene.showBasePlate(); @@ -154,7 +157,7 @@ public class EjectorScenes { Vec3 input = util.vector.of(4.8, 1 + 12 / 16f, 2.5); Vec3 topOfSlot = input.add(0, 2 / 16f, 0); scene.overlay.showControls(new InputWindowElement(topOfSlot, Pointing.DOWN).scroll() - .withWrench(), 60); + .withItem(AllItems.WRENCH.asStack()), 60); scene.overlay.showFilterSlotInput(input, 80); scene.idle(10); scene.overlay.showText(80) @@ -213,7 +216,8 @@ public class EjectorScenes { } - public static void splitY(SceneBuilder scene, SceneBuildingUtil util) { + public static void splitY(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("weighted_ejector_tunnel", "Splitting item stacks using Weighted Ejectors"); scene.configureBasePlate(0, 0, 5); scene.world.showSection(util.select.layer(0), Direction.UP); @@ -239,7 +243,7 @@ public class EjectorScenes { BlockPos tunnel = util.grid.at(2, 2, 3); scene.overlay.showControls(new InputWindowElement(util.vector.topOf(tunnel), Pointing.DOWN).scroll() - .withWrench(), 70); + .withItem(AllItems.WRENCH.asStack()), 70); scene.idle(10); scene.overlay.showControls( new InputWindowElement(util.vector.topOf(tunnel), Pointing.UP).showing(AllIcons.I_TUNNEL_PREFER_NEAREST), @@ -257,7 +261,7 @@ public class EjectorScenes { Vec3 input = util.vector.of(2.5, 1 + 12 / 16f, 2.8); Vec3 topOfSlot = input.add(0, 2 / 16f, 0); scene.overlay.showControls(new InputWindowElement(topOfSlot, Pointing.DOWN).scroll() - .withWrench(), 60); + .withItem(AllItems.WRENCH.asStack()), 60); scene.overlay.showFilterSlotInput(input, 80); scene.idle(10); scene.overlay.showText(80) @@ -290,7 +294,8 @@ public class EjectorScenes { scene.world.multiplyKineticSpeed(util.select.everywhere(), 16f); } - public static void redstone(SceneBuilder scene, SceneBuildingUtil util) { + public static void redstone(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("weighted_ejector_redstone", "Controlling Weighted Ejectors with Redstone"); scene.configureBasePlate(0, 0, 5); scene.world.showSection(util.select.layer(0), Direction.UP); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/FanScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/FanScenes.java index fb01d35add..19bc952dac 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/FanScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/FanScenes.java @@ -2,20 +2,21 @@ package com.simibubi.create.foundation.ponder.content; import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; import com.simibubi.create.content.logistics.block.depot.DepotTileEntity; -import com.simibubi.create.foundation.ponder.ElementLink; -import com.simibubi.create.foundation.ponder.PonderPalette; -import com.simibubi.create.foundation.ponder.SceneBuilder; -import com.simibubi.create.foundation.ponder.SceneBuildingUtil; -import com.simibubi.create.foundation.ponder.Selection; +import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import com.simibubi.create.foundation.ponder.element.BeltItemElement; -import com.simibubi.create.foundation.ponder.element.EntityElement; -import com.simibubi.create.foundation.ponder.element.InputWindowElement; -import com.simibubi.create.foundation.ponder.element.ParrotElement; -import com.simibubi.create.foundation.ponder.element.ParrotElement.FlappyPose; -import com.simibubi.create.foundation.ponder.element.WorldSectionElement; -import com.simibubi.create.foundation.ponder.instruction.EmitParticlesInstruction.Emitter; -import com.simibubi.create.foundation.utility.Pointing; +import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.foundation.ElementLink; +import net.createmod.ponder.foundation.PonderPalette; +import net.createmod.ponder.foundation.SceneBuilder; +import net.createmod.ponder.foundation.SceneBuildingUtil; +import net.createmod.ponder.foundation.Selection; +import net.createmod.ponder.foundation.element.EntityElement; +import net.createmod.ponder.foundation.element.InputWindowElement; +import net.createmod.ponder.foundation.element.ParrotElement; +import net.createmod.ponder.foundation.element.ParrotElement.FlappyPose; +import net.createmod.ponder.foundation.element.WorldSectionElement; +import net.createmod.ponder.foundation.instruction.EmitParticlesInstruction.Emitter; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.particles.ParticleTypes; @@ -29,7 +30,8 @@ import net.minecraft.world.phys.Vec3; public class FanScenes { - public static void direction(SceneBuilder scene, SceneBuildingUtil util) { + public static void direction(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("fan_direction", "Air flow of Encased Fans"); scene.configureBasePlate(0, 1, 5); scene.world.showSection(util.select.layer(0), Direction.UP); @@ -86,7 +88,8 @@ public class FanScenes { } - public static void processing(SceneBuilder scene, SceneBuildingUtil util) { + public static void processing(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("fan_processing", "Processing Items using Encased Fans"); scene.configureBasePlate(1, 0, 5); scene.world.showSection(util.select.layer(0) diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/FunnelScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/FunnelScenes.java index 554883d2f1..bfdabfd5a5 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/FunnelScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/FunnelScenes.java @@ -5,16 +5,17 @@ import com.simibubi.create.AllItems; import com.simibubi.create.content.logistics.block.funnel.BeltFunnelBlock; import com.simibubi.create.content.logistics.block.funnel.FunnelBlock; import com.simibubi.create.content.logistics.block.funnel.FunnelTileEntity; -import com.simibubi.create.foundation.ponder.ElementLink; -import com.simibubi.create.foundation.ponder.PonderPalette; -import com.simibubi.create.foundation.ponder.SceneBuilder; -import com.simibubi.create.foundation.ponder.SceneBuildingUtil; -import com.simibubi.create.foundation.ponder.Selection; -import com.simibubi.create.foundation.ponder.element.EntityElement; -import com.simibubi.create.foundation.ponder.element.InputWindowElement; -import com.simibubi.create.foundation.ponder.element.WorldSectionElement; -import com.simibubi.create.foundation.utility.Pointing; +import com.simibubi.create.foundation.ponder.CreateSceneBuilder; +import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.foundation.ElementLink; +import net.createmod.ponder.foundation.PonderPalette; +import net.createmod.ponder.foundation.SceneBuilder; +import net.createmod.ponder.foundation.SceneBuildingUtil; +import net.createmod.ponder.foundation.Selection; +import net.createmod.ponder.foundation.element.EntityElement; +import net.createmod.ponder.foundation.element.InputWindowElement; +import net.createmod.ponder.foundation.element.WorldSectionElement; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.entity.Entity; @@ -31,7 +32,8 @@ import net.minecraftforge.items.ItemHandlerHelper; public class FunnelScenes { - public static void intro(SceneBuilder scene, SceneBuildingUtil util) { + public static void intro(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("funnel_intro", "Using funnels"); scene.configureBasePlate(0, 1, 5); scene.world.showSection(util.select.layer(0), Direction.UP); @@ -105,7 +107,8 @@ public class FunnelScenes { scene.markAsFinished(); } - public static void directionality(SceneBuilder scene, SceneBuildingUtil util) { + public static void directionality(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("funnel_direction", "Direction of Transfer"); scene.configureBasePlate(0, 0, 5); scene.world.showSection(util.select.layer(0), Direction.UP); @@ -165,7 +168,7 @@ public class FunnelScenes { // Wrench interaction InputWindowElement wrenchControls = new InputWindowElement(topSide, Pointing.RIGHT).rightClick() - .withWrench(); + .withItem(AllItems.WRENCH.asStack()); scene.overlay.showControls(wrenchControls, 40); scene.idle(10); scene.world.modifyBlock(topFunnel, s -> s.cycle(FunnelBlock.EXTRACTING), true); @@ -248,7 +251,8 @@ public class FunnelScenes { } } - public static void compat(SceneBuilder scene, SceneBuildingUtil util) { + public static void compat(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("funnel_compat", "Funnel compatibility"); scene.configureBasePlate(0, 0, 5); @@ -348,7 +352,8 @@ public class FunnelScenes { scene.idle(60); } - public static void brass(SceneBuilder scene, SceneBuildingUtil util) { + public static void brass(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("brass_funnel", "The Brass Funnel"); scene.configureBasePlate(0, 0, 5); scene.world.showSection(util.select.layer(0), Direction.UP); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/GantryScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/GantryScenes.java index 0df78ea172..d5b08cec81 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/GantryScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/GantryScenes.java @@ -1,16 +1,17 @@ package com.simibubi.create.foundation.ponder.content; import com.simibubi.create.AllItems; -import com.simibubi.create.foundation.ponder.ElementLink; -import com.simibubi.create.foundation.ponder.PonderPalette; -import com.simibubi.create.foundation.ponder.SceneBuilder; -import com.simibubi.create.foundation.ponder.SceneBuildingUtil; -import com.simibubi.create.foundation.ponder.Selection; -import com.simibubi.create.foundation.ponder.element.InputWindowElement; -import com.simibubi.create.foundation.ponder.element.WorldSectionElement; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.Pointing; +import com.simibubi.create.foundation.ponder.CreateSceneBuilder; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.foundation.ElementLink; +import net.createmod.ponder.foundation.PonderPalette; +import net.createmod.ponder.foundation.SceneBuilder; +import net.createmod.ponder.foundation.SceneBuildingUtil; +import net.createmod.ponder.foundation.Selection; +import net.createmod.ponder.foundation.element.InputWindowElement; +import net.createmod.ponder.foundation.element.WorldSectionElement; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.block.Blocks; @@ -28,7 +29,8 @@ public class GantryScenes { intro(scene, util, false); } - private static void intro(SceneBuilder scene, SceneBuildingUtil util, boolean pinion) { + private static void intro(SceneBuilder builder, SceneBuildingUtil util, boolean pinion) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); String id = "gantry_" + (pinion ? "carriage" : "shaft"); String title = "Using Gantry " + (pinion ? "Carriages" : "Shafts"); scene.title(id, title); @@ -99,7 +101,8 @@ public class GantryScenes { scene.markAsFinished(); } - public static void redstone(SceneBuilder scene, SceneBuildingUtil util) { + public static void redstone(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("gantry_redstone", "Gantry Power Propagation"); scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); @@ -153,7 +156,8 @@ public class GantryScenes { scene.markAsFinished(); } - public static void direction(SceneBuilder scene, SceneBuildingUtil util) { + public static void direction(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("gantry_direction", "Gantry Movement Direction"); scene.configureBasePlate(0, 0, 5); scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); @@ -256,7 +260,8 @@ public class GantryScenes { } - public static void subgantry(SceneBuilder scene, SceneBuildingUtil util) { + public static void subgantry(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("gantry_cascaded", "Cascaded Gantries"); scene.configureBasePlate(0, 0, 5); scene.setSceneOffsetY(-1); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/ItemVaultScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/ItemVaultScenes.java index 2f8bb49887..0b9bc199ec 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/ItemVaultScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/ItemVaultScenes.java @@ -2,15 +2,16 @@ package com.simibubi.create.foundation.ponder.content; import com.simibubi.create.AllItems; import com.simibubi.create.foundation.gui.AllIcons; -import com.simibubi.create.foundation.ponder.ElementLink; -import com.simibubi.create.foundation.ponder.PonderPalette; -import com.simibubi.create.foundation.ponder.SceneBuilder; -import com.simibubi.create.foundation.ponder.SceneBuildingUtil; -import com.simibubi.create.foundation.ponder.Selection; -import com.simibubi.create.foundation.ponder.element.InputWindowElement; -import com.simibubi.create.foundation.ponder.element.WorldSectionElement; -import com.simibubi.create.foundation.utility.Pointing; +import com.simibubi.create.foundation.ponder.CreateSceneBuilder; +import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.foundation.ElementLink; +import net.createmod.ponder.foundation.PonderPalette; +import net.createmod.ponder.foundation.SceneBuilder; +import net.createmod.ponder.foundation.SceneBuildingUtil; +import net.createmod.ponder.foundation.Selection; +import net.createmod.ponder.foundation.element.InputWindowElement; +import net.createmod.ponder.foundation.element.WorldSectionElement; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.item.ItemStack; @@ -19,7 +20,8 @@ import net.minecraft.world.phys.Vec3; public class ItemVaultScenes { - public static void storage(SceneBuilder scene, SceneBuildingUtil util) { + public static void storage(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("item_vault_storage", "Storing Items in Vaults"); scene.configureBasePlate(0, 0, 5); scene.showBasePlate(); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/KineticsScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/KineticsScenes.java index 71cac5317e..dde113079f 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/KineticsScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/KineticsScenes.java @@ -13,16 +13,17 @@ import com.simibubi.create.content.contraptions.relays.encased.EncasedShaftBlock import com.simibubi.create.content.contraptions.relays.gauge.GaugeBlock; import com.simibubi.create.content.contraptions.relays.gauge.StressGaugeTileEntity; import com.simibubi.create.content.logistics.block.redstone.NixieTubeTileEntity; -import com.simibubi.create.foundation.ponder.ElementLink; -import com.simibubi.create.foundation.ponder.PonderPalette; -import com.simibubi.create.foundation.ponder.SceneBuilder; -import com.simibubi.create.foundation.ponder.SceneBuildingUtil; -import com.simibubi.create.foundation.ponder.Selection; -import com.simibubi.create.foundation.ponder.element.InputWindowElement; -import com.simibubi.create.foundation.ponder.element.WorldSectionElement; -import com.simibubi.create.foundation.utility.Pointing; +import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import com.tterrag.registrate.util.entry.BlockEntry; +import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.foundation.ElementLink; +import net.createmod.ponder.foundation.PonderPalette; +import net.createmod.ponder.foundation.SceneBuilder; +import net.createmod.ponder.foundation.SceneBuildingUtil; +import net.createmod.ponder.foundation.Selection; +import net.createmod.ponder.foundation.element.InputWindowElement; +import net.createmod.ponder.foundation.element.WorldSectionElement; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -37,7 +38,8 @@ import net.minecraft.world.phys.Vec3; public class KineticsScenes { - public static void shaftAsRelay(SceneBuilder scene, SceneBuildingUtil util) { + public static void shaftAsRelay(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("shaft", "Relaying rotational force using Shafts"); scene.configureBasePlate(0, 0, 5); scene.world.showSection(util.select.layer(0), Direction.UP); @@ -69,7 +71,8 @@ public class KineticsScenes { scene.markAsFinished(); } - public static void shaftsCanBeEncased(SceneBuilder scene, SceneBuildingUtil util) { + public static void shaftsCanBeEncased(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("shaft_casing", "Encasing Shafts"); scene.configureBasePlate(0, 0, 5); scene.showBasePlate(); @@ -110,7 +113,8 @@ public class KineticsScenes { scene.idle(70); } - public static void cogAsRelay(SceneBuilder scene, SceneBuildingUtil util) { + public static void cogAsRelay(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("cogwheel", "Relaying rotational force using Cogwheels"); scene.configureBasePlate(0, 0, 5); BlockPos gauge = util.grid.at(4, 1, 1); @@ -151,7 +155,8 @@ public class KineticsScenes { } - public static void largeCogAsRelay(SceneBuilder scene, SceneBuildingUtil util) { + public static void largeCogAsRelay(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("large_cogwheel", "Relaying rotational force using Large Cogwheels"); scene.configureBasePlate(1, 1, 5); scene.world.setBlock(util.grid.at(4, 2, 3), AllBlocks.LARGE_COGWHEEL.getDefaultState() @@ -200,7 +205,8 @@ public class KineticsScenes { } - public static void cogsSpeedUp(SceneBuilder scene, SceneBuildingUtil util) { + public static void cogsSpeedUp(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("cog_speedup", "Gearshifting with Cogs"); scene.configureBasePlate(0, 0, 5); scene.world.showSection(util.select.layer(0), Direction.UP); @@ -293,7 +299,8 @@ public class KineticsScenes { scene.idle(40); } - public static void cogwheelsCanBeEncased(SceneBuilder scene, SceneBuildingUtil util) { + public static void cogwheelsCanBeEncased(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("cogwheel_casing", "Encasing Cogwheels"); scene.configureBasePlate(0, 0, 5); scene.world.showSection(util.select.layer(0), Direction.UP); @@ -370,7 +377,7 @@ public class KineticsScenes { Vec3 wrenchHere = util.vector.topOf(2, 1, 2) .add(.25, 0, -.25); scene.overlay.showControls(new InputWindowElement(wrenchHere, Pointing.RIGHT).rightClick() - .withWrench(), 25); + .withItem(AllItems.WRENCH.asStack()), 25); scene.idle(7); scene.world.cycleBlockProperty(util.grid.at(2, 1, 2), EncasedCogwheelBlock.TOP_SHAFT); scene.idle(15); @@ -388,13 +395,14 @@ public class KineticsScenes { scene.idle(40); scene.overlay.showControls(new InputWindowElement(wrenchHere, Pointing.RIGHT).rightClick() - .withWrench(), 25); + .withItem(AllItems.WRENCH.asStack()), 25); scene.idle(7); scene.world.cycleBlockProperty(util.grid.at(2, 1, 2), EncasedCogwheelBlock.TOP_SHAFT); scene.world.setKineticSpeed(shaft2, 0); } - public static void gearbox(SceneBuilder scene, SceneBuildingUtil util) { + public static void gearbox(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("gearbox", "Relaying rotational force using Gearboxes"); scene.configureBasePlate(1, 1, 5); scene.setSceneOffsetY(-1); @@ -476,7 +484,8 @@ public class KineticsScenes { } - public static void clutch(SceneBuilder scene, SceneBuildingUtil util) { + public static void clutch(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("clutch", "Controlling rotational force using a Clutch"); scene.configureBasePlate(0, 0, 5); scene.world.showSection(util.select.layer(0), Direction.UP); @@ -528,7 +537,8 @@ public class KineticsScenes { scene.effects.indicateSuccess(gaugePos); } - public static void gearshift(SceneBuilder scene, SceneBuildingUtil util) { + public static void gearshift(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("gearshift", "Controlling rotational force using a Gearshift"); scene.configureBasePlate(0, 0, 5); scene.world.showSection(util.select.layer(0), Direction.UP); @@ -576,7 +586,8 @@ public class KineticsScenes { } } - public static void creativeMotor(SceneBuilder scene, SceneBuildingUtil util) { + public static void creativeMotor(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("creative_motor", "Generating Rotational Force using Creative Motors"); scene.configureBasePlate(0, 0, 5); scene.world.showSection(util.select.layer(0), Direction.UP); @@ -622,7 +633,8 @@ public class KineticsScenes { scene.rotateCameraY(-90); } - public static void waterWheel(SceneBuilder scene, SceneBuildingUtil util) { + public static void waterWheel(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("water_wheel", "Generating Rotational Force using Water Wheels"); scene.configureBasePlate(0, 0, 5); scene.world.showSection(util.select.layer(0), Direction.UP); @@ -735,7 +747,8 @@ public class KineticsScenes { manualSource(scene, util, true); } - public static void valveHandle(SceneBuilder scene, SceneBuildingUtil util) { + public static void valveHandle(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); manualSource(scene, util, false); scene.world.setKineticSpeed(util.select.everywhere(), 0); scene.idle(20); @@ -753,7 +766,8 @@ public class KineticsScenes { .pointAt(centerOf); } - private static void manualSource(SceneBuilder scene, SceneBuildingUtil util, boolean handCrank) { + private static void manualSource(SceneBuilder builder, SceneBuildingUtil util, boolean handCrank) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); String name = handCrank ? "Hand Cranks" : "Valve Handles"; scene.title(handCrank ? "hand_crank" : "valve_handle", "Generating Rotational Force using " + name); scene.configureBasePlate(0, 0, 5); @@ -816,7 +830,8 @@ public class KineticsScenes { scene.idle(90); } - public static void sequencedGearshift(SceneBuilder scene, SceneBuildingUtil util) { + public static void sequencedGearshift(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("sequenced_gearshift", "Controlling Rotational Speed using Sequenced Gearshifts"); scene.configureBasePlate(1, 0, 5); scene.showBasePlate(); @@ -971,7 +986,8 @@ public class KineticsScenes { scene.world.setKineticSpeed(outputKinetics, 0); } - public static void speedController(SceneBuilder scene, SceneBuildingUtil util) { + public static void speedController(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("rotation_speed_controller", "Using the Rotational Speed Controller"); scene.configureBasePlate(0, 0, 5); scene.world.showSection(util.select.layer(0), Direction.UP); @@ -1049,7 +1065,8 @@ public class KineticsScenes { gauge(scene, util, false); } - private static void gauge(SceneBuilder scene, SceneBuildingUtil util, boolean speed) { + private static void gauge(SceneBuilder builder, SceneBuildingUtil util, boolean speed) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); String component = speed ? "Speedometer" : "Stressometer"; String title = "Monitoring Kinetic information using the " + component; scene.title(speed ? "speedometer" : "stressometer", title); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalDrillScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalDrillScenes.java index 5399be267a..feb0731545 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalDrillScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalDrillScenes.java @@ -1,14 +1,15 @@ package com.simibubi.create.foundation.ponder.content; -import com.simibubi.create.foundation.ponder.ElementLink; -import com.simibubi.create.foundation.ponder.SceneBuilder; -import com.simibubi.create.foundation.ponder.SceneBuildingUtil; -import com.simibubi.create.foundation.ponder.Selection; -import com.simibubi.create.foundation.ponder.element.EntityElement; -import com.simibubi.create.foundation.ponder.element.InputWindowElement; -import com.simibubi.create.foundation.ponder.element.WorldSectionElement; -import com.simibubi.create.foundation.utility.Pointing; +import com.simibubi.create.foundation.ponder.CreateSceneBuilder; +import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.foundation.ElementLink; +import net.createmod.ponder.foundation.SceneBuilder; +import net.createmod.ponder.foundation.SceneBuildingUtil; +import net.createmod.ponder.foundation.Selection; +import net.createmod.ponder.foundation.element.EntityElement; +import net.createmod.ponder.foundation.element.InputWindowElement; +import net.createmod.ponder.foundation.element.WorldSectionElement; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.entity.Entity; @@ -20,7 +21,8 @@ import net.minecraft.world.phys.Vec3; public class MechanicalDrillScenes { - public static void breaker(SceneBuilder scene, SceneBuildingUtil util) { + public static void breaker(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("mechanical_drill", "Breaking Blocks with the Mechanical Drill"); scene.configureBasePlate(0, 0, 5); @@ -55,7 +57,7 @@ public class MechanicalDrillScenes { util.vector.of(0, .1f, 0), new ItemStack(Items.OAK_PLANKS)); scene.idle(20); scene.idle(15); - + scene.world.modifyEntity(plankEntity, Entity::discard); scene.world.modifyKineticSpeed(util.select.everywhere(), f -> 4 * f); scene.effects.rotationSpeedIndicator(breakingPos.east(3)); @@ -81,7 +83,8 @@ public class MechanicalDrillScenes { scene.idle(50); } - public static void contraption(SceneBuilder scene, SceneBuildingUtil util) { + public static void contraption(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("mechanical_drill_contraption", "Using Mechanical Drills on Contraptions"); scene.configureBasePlate(0, 0, 6); scene.world.showSection(util.select.layer(0), Direction.UP); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalSawScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalSawScenes.java index 29715ce437..1ce98047b1 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalSawScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalSawScenes.java @@ -3,16 +3,17 @@ package com.simibubi.create.foundation.ponder.content; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.components.saw.SawTileEntity; import com.simibubi.create.content.contraptions.relays.elementary.ShaftBlock; -import com.simibubi.create.foundation.ponder.ElementLink; -import com.simibubi.create.foundation.ponder.PonderPalette; -import com.simibubi.create.foundation.ponder.SceneBuilder; -import com.simibubi.create.foundation.ponder.SceneBuildingUtil; -import com.simibubi.create.foundation.ponder.Selection; -import com.simibubi.create.foundation.ponder.element.EntityElement; -import com.simibubi.create.foundation.ponder.element.InputWindowElement; -import com.simibubi.create.foundation.ponder.element.WorldSectionElement; -import com.simibubi.create.foundation.utility.Pointing; +import com.simibubi.create.foundation.ponder.CreateSceneBuilder; +import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.foundation.ElementLink; +import net.createmod.ponder.foundation.PonderPalette; +import net.createmod.ponder.foundation.SceneBuilder; +import net.createmod.ponder.foundation.SceneBuildingUtil; +import net.createmod.ponder.foundation.Selection; +import net.createmod.ponder.foundation.element.EntityElement; +import net.createmod.ponder.foundation.element.InputWindowElement; +import net.createmod.ponder.foundation.element.WorldSectionElement; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -25,7 +26,8 @@ import net.minecraft.world.phys.Vec3; public class MechanicalSawScenes { - public static void processing(SceneBuilder scene, SceneBuildingUtil util) { + public static void processing(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("mechanical_saw_processing", "Processing Items on the Mechanical Saw"); scene.configureBasePlate(0, 0, 5); scene.world.showSection(util.select.layer(0), Direction.UP); @@ -171,7 +173,8 @@ public class MechanicalSawScenes { scene.world.modifyEntities(ItemEntity.class, Entity::discard); } - public static void treeCutting(SceneBuilder scene, SceneBuildingUtil util) { + public static void treeCutting(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("mechanical_saw_breaker", "Cutting Trees with the Mechanical Saw"); scene.configureBasePlate(0, 0, 5); scene.scaleSceneView(.9f); @@ -264,7 +267,8 @@ public class MechanicalSawScenes { } } - public static void contraption(SceneBuilder scene, SceneBuildingUtil util) { + public static void contraption(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("mechanical_saw_contraption", "Using Mechanical Saws on Contraptions"); scene.configureBasePlate(1, 0, 6); scene.scaleSceneView(.9f); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/MovementActorScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/MovementActorScenes.java index 0cd882d023..f39ae5d39c 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/MovementActorScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/MovementActorScenes.java @@ -4,18 +4,19 @@ import com.simibubi.create.content.contraptions.components.actors.HarvesterTileE import com.simibubi.create.content.contraptions.components.actors.PortableItemInterfaceTileEntity; import com.simibubi.create.content.contraptions.components.actors.PortableStorageInterfaceTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.LinearChassisBlock; -import com.simibubi.create.foundation.ponder.ElementLink; -import com.simibubi.create.foundation.ponder.PonderPalette; -import com.simibubi.create.foundation.ponder.SceneBuilder; -import com.simibubi.create.foundation.ponder.SceneBuildingUtil; -import com.simibubi.create.foundation.ponder.Selection; -import com.simibubi.create.foundation.ponder.element.EntityElement; -import com.simibubi.create.foundation.ponder.element.InputWindowElement; -import com.simibubi.create.foundation.ponder.element.ParrotElement; -import com.simibubi.create.foundation.ponder.element.ParrotElement.FlappyPose; -import com.simibubi.create.foundation.ponder.element.WorldSectionElement; -import com.simibubi.create.foundation.utility.Pointing; +import com.simibubi.create.foundation.ponder.CreateSceneBuilder; +import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.foundation.ElementLink; +import net.createmod.ponder.foundation.PonderPalette; +import net.createmod.ponder.foundation.SceneBuilder; +import net.createmod.ponder.foundation.SceneBuildingUtil; +import net.createmod.ponder.foundation.Selection; +import net.createmod.ponder.foundation.element.EntityElement; +import net.createmod.ponder.foundation.element.InputWindowElement; +import net.createmod.ponder.foundation.element.ParrotElement; +import net.createmod.ponder.foundation.element.ParrotElement.FlappyPose; +import net.createmod.ponder.foundation.element.WorldSectionElement; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.entity.Entity; @@ -29,7 +30,8 @@ import net.minecraft.world.phys.Vec3; public class MovementActorScenes { - public static void psiTransfer(SceneBuilder scene, SceneBuildingUtil util) { + public static void psiTransfer(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("portable_storage_interface", "Contraption Storage Exchange"); scene.configureBasePlate(0, 0, 6); scene.scaleSceneView(0.95f); @@ -162,7 +164,8 @@ public class MovementActorScenes { scene.world.rotateSection(contraption, 0, 270, 0, 120); } - public static void psiRedstone(SceneBuilder scene, SceneBuildingUtil util) { + public static void psiRedstone(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("portable_storage_interface_redstone", "Redstone Control"); scene.configureBasePlate(0, 0, 5); scene.setSceneOffsetY(-1); @@ -203,7 +206,8 @@ public class MovementActorScenes { scene.markAsFinished(); } - public static void harvester(SceneBuilder scene, SceneBuildingUtil util) { + public static void harvester(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("mechanical_harvester", "Using Mechanical Harvesters on Contraptions"); scene.configureBasePlate(0, 0, 6); scene.scaleSceneView(0.9f); @@ -334,7 +338,8 @@ public class MovementActorScenes { hte -> hte.setAnimatedSpeed(0)); } - public static void plough(SceneBuilder scene, SceneBuildingUtil util) { + public static void plough(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("mechanical_plough", "Using Mechanical Ploughs on Contraptions"); scene.configureBasePlate(0, 0, 6); scene.scaleSceneView(0.9f); @@ -476,10 +481,10 @@ public class MovementActorScenes { scene.idle(15); scene.world.showSectionAndMerge(util.select.fromTo(4, 3, 3, 4, 2, 3), Direction.DOWN, contraption); scene.idle(15); - + BlockPos bearingPos = util.grid.at(4, 3, 4); scene.addKeyframe(); - + scene.world.setKineticSpeed(util.select.position(4, 0, 6), 8); scene.world.setKineticSpeed(util.select.position(5, 1, 6), -16); scene.world.setKineticSpeed(util.select.position(4, 3, 5), -16); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/PistonScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/PistonScenes.java index a561f1ff8a..6211bcd065 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/PistonScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/PistonScenes.java @@ -2,17 +2,18 @@ package com.simibubi.create.foundation.ponder.content; import com.simibubi.create.AllItems; import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonHeadBlock; -import com.simibubi.create.foundation.ponder.ElementLink; -import com.simibubi.create.foundation.ponder.PonderPalette; -import com.simibubi.create.foundation.ponder.SceneBuilder; -import com.simibubi.create.foundation.ponder.SceneBuildingUtil; -import com.simibubi.create.foundation.ponder.Selection; -import com.simibubi.create.foundation.ponder.element.InputWindowElement; -import com.simibubi.create.foundation.ponder.element.ParrotElement; -import com.simibubi.create.foundation.ponder.element.ParrotElement.FaceCursorPose; -import com.simibubi.create.foundation.ponder.element.WorldSectionElement; -import com.simibubi.create.foundation.utility.Pointing; +import com.simibubi.create.foundation.ponder.CreateSceneBuilder; +import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.foundation.ElementLink; +import net.createmod.ponder.foundation.PonderPalette; +import net.createmod.ponder.foundation.SceneBuilder; +import net.createmod.ponder.foundation.SceneBuildingUtil; +import net.createmod.ponder.foundation.Selection; +import net.createmod.ponder.foundation.element.InputWindowElement; +import net.createmod.ponder.foundation.element.ParrotElement; +import net.createmod.ponder.foundation.element.ParrotElement.FaceCursorPose; +import net.createmod.ponder.foundation.element.WorldSectionElement; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.item.ItemStack; @@ -24,7 +25,8 @@ import net.minecraft.world.level.block.state.properties.PistonType; public class PistonScenes { - public static void movement(SceneBuilder scene, SceneBuildingUtil util) { + public static void movement(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("mechanical_piston", "Moving Structures using Mechanical Pistons"); scene.configureBasePlate(0, 0, 5); scene.world.showSection(util.select.layer(0) @@ -141,7 +143,8 @@ public class PistonScenes { scene.world.moveSection(chassis, util.vector.of(-2, 0, 0), 40); } - public static void poles(SceneBuilder scene, SceneBuildingUtil util) { + public static void poles(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("piston_pole", "Piston Extension Poles"); scene.configureBasePlate(0, 0, 5); scene.world.showSection(util.select.layer(0), Direction.UP); @@ -207,7 +210,8 @@ public class PistonScenes { } - public static void movementModes(SceneBuilder scene, SceneBuildingUtil util) { + public static void movementModes(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("mechanical_piston_modes", "Movement Modes of the Mechanical Piston"); scene.configureBasePlate(0, 0, 5); Selection rose = util.select.fromTo(0, 2, 2, 0, 1, 2); @@ -272,7 +276,7 @@ public class PistonScenes { scene.world.showIndependentSection(rose, Direction.DOWN); scene.overlay.showCenteredScrollInput(piston, Direction.UP, 60); scene.overlay.showControls(new InputWindowElement(util.vector.topOf(piston), Pointing.DOWN).scroll() - .withWrench(), 60); + .withItem(AllItems.WRENCH.asStack()), 60); scene.overlay.showText(70) .pointAt(util.vector.topOf(piston)) .placeNearTarget() diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/ProcessingScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/ProcessingScenes.java index bd20d9bbeb..d95038d684 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/ProcessingScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/ProcessingScenes.java @@ -13,21 +13,22 @@ import com.simibubi.create.content.contraptions.processing.BasinTileEntity; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock.HeatLevel; import com.simibubi.create.content.contraptions.processing.burner.LitBlazeBurnerBlock; -import com.simibubi.create.foundation.ponder.ElementLink; -import com.simibubi.create.foundation.ponder.PonderPalette; -import com.simibubi.create.foundation.ponder.SceneBuilder; -import com.simibubi.create.foundation.ponder.SceneBuildingUtil; -import com.simibubi.create.foundation.ponder.Selection; +import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import com.simibubi.create.foundation.ponder.element.BeltItemElement; -import com.simibubi.create.foundation.ponder.element.EntityElement; -import com.simibubi.create.foundation.ponder.element.InputWindowElement; -import com.simibubi.create.foundation.ponder.element.WorldSectionElement; -import com.simibubi.create.foundation.ponder.instruction.EmitParticlesInstruction.Emitter; -import com.simibubi.create.foundation.utility.IntAttached; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.NBTHelper; -import com.simibubi.create.foundation.utility.Pointing; +import net.createmod.catnip.utility.IntAttached; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.foundation.ElementLink; +import net.createmod.ponder.foundation.PonderPalette; +import net.createmod.ponder.foundation.SceneBuilder; +import net.createmod.ponder.foundation.SceneBuildingUtil; +import net.createmod.ponder.foundation.Selection; +import net.createmod.ponder.foundation.element.EntityElement; +import net.createmod.ponder.foundation.element.InputWindowElement; +import net.createmod.ponder.foundation.element.WorldSectionElement; +import net.createmod.ponder.foundation.instruction.EmitParticlesInstruction.Emitter; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.particles.ItemParticleOption; @@ -43,7 +44,8 @@ import net.minecraft.world.phys.Vec3; public class ProcessingScenes { - public static void millstone(SceneBuilder scene, SceneBuildingUtil util) { + public static void millstone(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("millstone", "Processing Items in the Millstone"); scene.configureBasePlate(0, 0, 5); @@ -142,7 +144,8 @@ public class ProcessingScenes { scene.idle(60); } - public static void crushingWheels(SceneBuilder scene, SceneBuildingUtil util) { + public static void crushingWheels(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("crushing_wheels", "Processing Items with Crushing Wheels"); scene.configureBasePlate(0, 0, 5); scene.scaleSceneView(.9f); @@ -268,7 +271,8 @@ public class ProcessingScenes { } } - public static void pressing(SceneBuilder scene, SceneBuildingUtil util) { + public static void pressing(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("mechanical_press", "Processing Items with the Mechanical Press"); scene.configureBasePlate(0, 0, 5); scene.world.showSection(util.select.layer(0), Direction.UP); @@ -377,7 +381,8 @@ public class ProcessingScenes { } - public static void mixing(SceneBuilder scene, SceneBuildingUtil util) { + public static void mixing(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("mechanical_mixer", "Processing Items with the Mechanical Mixer"); scene.configureBasePlate(0, 0, 5); scene.world.setBlock(util.grid.at(1, 1, 2), AllBlocks.ANDESITE_CASING.getDefaultState(), false); @@ -459,7 +464,8 @@ public class ProcessingScenes { scene.idle(80); } - public static void compacting(SceneBuilder scene, SceneBuildingUtil util) { + public static void compacting(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("mechanical_press_compacting", "Compacting items with the Mechanical Press"); scene.configureBasePlate(0, 0, 5); scene.world.setBlock(util.grid.at(1, 1, 2), AllBlocks.ANDESITE_CASING.getDefaultState(), false); @@ -728,7 +734,8 @@ public class ProcessingScenes { scene.idle(90); } - public static void basin(SceneBuilder scene, SceneBuildingUtil util) { + public static void basin(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("basin", "Processing Items in the Basin"); scene.configureBasePlate(0, 0, 5); scene.world.showSection(util.select.layer(0), Direction.UP); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/PulleyScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/PulleyScenes.java index 482c4f36ef..5aa76244f5 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/PulleyScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/PulleyScenes.java @@ -1,22 +1,24 @@ package com.simibubi.create.foundation.ponder.content; import com.simibubi.create.AllItems; -import com.simibubi.create.foundation.ponder.ElementLink; -import com.simibubi.create.foundation.ponder.PonderPalette; -import com.simibubi.create.foundation.ponder.SceneBuilder; -import com.simibubi.create.foundation.ponder.SceneBuildingUtil; -import com.simibubi.create.foundation.ponder.Selection; -import com.simibubi.create.foundation.ponder.element.InputWindowElement; -import com.simibubi.create.foundation.ponder.element.WorldSectionElement; -import com.simibubi.create.foundation.utility.Pointing; +import com.simibubi.create.foundation.ponder.CreateSceneBuilder; +import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.foundation.ElementLink; +import net.createmod.ponder.foundation.PonderPalette; +import net.createmod.ponder.foundation.SceneBuilder; +import net.createmod.ponder.foundation.SceneBuildingUtil; +import net.createmod.ponder.foundation.Selection; +import net.createmod.ponder.foundation.element.InputWindowElement; +import net.createmod.ponder.foundation.element.WorldSectionElement; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.block.Blocks; public class PulleyScenes { - public static void movement(SceneBuilder scene, SceneBuildingUtil util) { + public static void movement(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("rope_pulley", "Moving Structures using Rope Pulleys"); scene.configureBasePlate(0, 0, 5); scene.scaleSceneView(0.95f); @@ -112,7 +114,8 @@ public class PulleyScenes { scene.idle(50); } - public static void movementModes(SceneBuilder scene, SceneBuildingUtil util) { + public static void movementModes(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("rope_pulley_modes", "Movement Modes of the Rope Pulley"); scene.configureBasePlate(0, 0, 5); scene.scaleSceneView(0.95f); @@ -165,7 +168,7 @@ public class PulleyScenes { scene.world.showSection(util.select.position(flowerPos), Direction.DOWN); scene.overlay.showCenteredScrollInput(pulleyPos, Direction.UP, 60); scene.overlay.showControls(new InputWindowElement(util.vector.topOf(pulleyPos), Pointing.DOWN).scroll() - .withWrench(), 60); + .withItem(AllItems.WRENCH.asStack()), 60); scene.overlay.showText(70) .pointAt(util.vector.topOf(pulleyPos)) .placeNearTarget() @@ -188,7 +191,8 @@ public class PulleyScenes { scene.idle(90); } - public static void attachment(SceneBuilder scene, SceneBuildingUtil util) { + public static void attachment(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("rope_pulley_attachment", "Moving Pulleys as part of a Contraption"); scene.configureBasePlate(0, 0, 5); scene.scaleSceneView(0.95f); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/RedstoneScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/RedstoneScenes.java index 7e7bb5c1fc..97a3453bfc 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/RedstoneScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/RedstoneScenes.java @@ -1,6 +1,7 @@ package com.simibubi.create.foundation.ponder.content; import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllItems; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.StickerBlock; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.StickerTileEntity; import com.simibubi.create.content.logistics.block.diodes.BrassDiodeBlock; @@ -13,16 +14,17 @@ import com.simibubi.create.content.logistics.block.redstone.NixieTubeBlock; import com.simibubi.create.content.logistics.block.redstone.NixieTubeTileEntity; import com.simibubi.create.content.logistics.block.redstone.RedstoneLinkBlock; import com.simibubi.create.content.logistics.block.redstone.RedstoneLinkTileEntity; -import com.simibubi.create.foundation.ponder.ElementLink; -import com.simibubi.create.foundation.ponder.PonderPalette; -import com.simibubi.create.foundation.ponder.SceneBuilder; -import com.simibubi.create.foundation.ponder.SceneBuildingUtil; -import com.simibubi.create.foundation.ponder.Selection; -import com.simibubi.create.foundation.ponder.element.InputWindowElement; -import com.simibubi.create.foundation.ponder.element.ParrotElement; -import com.simibubi.create.foundation.ponder.element.WorldSectionElement; -import com.simibubi.create.foundation.utility.Pointing; +import com.simibubi.create.foundation.ponder.CreateSceneBuilder; +import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.foundation.ElementLink; +import net.createmod.ponder.foundation.PonderPalette; +import net.createmod.ponder.foundation.SceneBuilder; +import net.createmod.ponder.foundation.SceneBuildingUtil; +import net.createmod.ponder.foundation.Selection; +import net.createmod.ponder.foundation.element.InputWindowElement; +import net.createmod.ponder.foundation.element.ParrotElement; +import net.createmod.ponder.foundation.element.WorldSectionElement; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; @@ -38,7 +40,8 @@ import net.minecraft.world.phys.Vec3; public class RedstoneScenes { - public static void sticker(SceneBuilder scene, SceneBuildingUtil util) { + public static void sticker(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("sticker", "Attaching blocks using the Sticker"); scene.configureBasePlate(0, 0, 5); scene.showBasePlate(); @@ -112,7 +115,8 @@ public class RedstoneScenes { scene.world.rotateSection(sticker, 0, 180 * 3, 0, 80); } - public static void contact(SceneBuilder scene, SceneBuildingUtil util) { + public static void contact(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("redstone_contact", "Redstone Contacts"); scene.configureBasePlate(0, 0, 5); scene.showBasePlate(); @@ -723,7 +727,7 @@ public class RedstoneScenes { scene.idle(60); scene.overlay.showControls(new InputWindowElement(link3Vec, Pointing.UP).rightClick() - .withWrench(), 40); + .withItem(AllItems.WRENCH.asStack()), 40); scene.idle(7); scene.world.modifyBlock(link3Pos, s -> s.cycle(RedstoneLinkBlock.RECEIVER), true); scene.idle(10); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/RedstoneScenes2.java b/src/main/java/com/simibubi/create/foundation/ponder/content/RedstoneScenes2.java index fc79d5297b..56143bb753 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/RedstoneScenes2.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/RedstoneScenes2.java @@ -1,15 +1,16 @@ package com.simibubi.create.foundation.ponder.content; +import com.simibubi.create.AllItems; import com.simibubi.create.content.logistics.block.redstone.NixieTubeTileEntity; import com.simibubi.create.content.logistics.block.redstone.RoseQuartzLampBlock; -import com.simibubi.create.foundation.ponder.ElementLink; -import com.simibubi.create.foundation.ponder.SceneBuilder; -import com.simibubi.create.foundation.ponder.SceneBuildingUtil; -import com.simibubi.create.foundation.ponder.Selection; -import com.simibubi.create.foundation.ponder.element.InputWindowElement; -import com.simibubi.create.foundation.ponder.element.WorldSectionElement; -import com.simibubi.create.foundation.utility.Pointing; +import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.foundation.ElementLink; +import net.createmod.ponder.foundation.SceneBuilder; +import net.createmod.ponder.foundation.SceneBuildingUtil; +import net.createmod.ponder.foundation.Selection; +import net.createmod.ponder.foundation.element.InputWindowElement; +import net.createmod.ponder.foundation.element.WorldSectionElement; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -114,7 +115,7 @@ public class RedstoneScenes2 { scene.overlay .showControls(new InputWindowElement(util.vector.topOf(centerLamp.east(2)), Pointing.DOWN).rightClick() - .withWrench(), 20); + .withItem(AllItems.WRENCH.asStack()), 20); scene.idle(6); scene.world.cycleBlockProperty(centerLamp.east(), RoseQuartzLampBlock.POWERING); scene.world.toggleRedstonePower(comparator); @@ -122,7 +123,7 @@ public class RedstoneScenes2 { scene.idle(20); scene.overlay.showControls(new InputWindowElement(util.vector.topOf(centerLamp), Pointing.DOWN).rightClick() - .withWrench(), 20); + .withItem(AllItems.WRENCH.asStack()), 20); scene.idle(6); scene.world.cycleBlockProperty(centerLamp.west(), RoseQuartzLampBlock.POWERING); scene.world.toggleRedstonePower(comparator); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/SharedText.java b/src/main/java/com/simibubi/create/foundation/ponder/content/SharedText.java deleted file mode 100644 index aa04c28aa9..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/SharedText.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.simibubi.create.foundation.ponder.content; - -import com.simibubi.create.Create; -import com.simibubi.create.foundation.ponder.PonderLocalization; - -import net.minecraft.resources.ResourceLocation; - -public class SharedText { - - public static void gatherText() { - // Add entries used across several ponder scenes (Safe for hotswap) - - add("sneak_and", "Sneak +"); - add("ctrl_and", "Ctrl +"); - - add("rpm8", "8 RPM"); - add("rpm16", "16 RPM"); - add("rpm16_source", "Source: 16 RPM"); - add("rpm32", "32 RPM"); - - add("movement_anchors", "With the help of Super Glue, larger structures can be moved."); - add("behaviour_modify_wrench", "This behaviour can be modified using a Wrench"); - add("storage_on_contraption", "Inventories attached to the Contraption will pick up their drops automatically"); - } - - public static String get(ResourceLocation key) { - return PonderLocalization.getShared(key); - } - - public static void add(ResourceLocation k, String v) { - PonderLocalization.registerShared(k, v); - } - - private static void add(String k, String v) { - add(Create.asResource(k), v); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/SteamScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/SteamScenes.java index bce07dd0f6..a957198e57 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/SteamScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/SteamScenes.java @@ -7,16 +7,17 @@ import com.simibubi.create.content.contraptions.components.steam.whistle.Whistle import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock.HeatLevel; import com.simibubi.create.content.contraptions.relays.elementary.ShaftBlock; -import com.simibubi.create.foundation.ponder.ElementLink; -import com.simibubi.create.foundation.ponder.PonderPalette; -import com.simibubi.create.foundation.ponder.SceneBuilder; -import com.simibubi.create.foundation.ponder.SceneBuildingUtil; -import com.simibubi.create.foundation.ponder.Selection; -import com.simibubi.create.foundation.ponder.element.InputWindowElement; -import com.simibubi.create.foundation.ponder.element.WorldSectionElement; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.Pointing; +import com.simibubi.create.foundation.ponder.CreateSceneBuilder; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.foundation.ElementLink; +import net.createmod.ponder.foundation.PonderPalette; +import net.createmod.ponder.foundation.SceneBuilder; +import net.createmod.ponder.foundation.SceneBuildingUtil; +import net.createmod.ponder.foundation.Selection; +import net.createmod.ponder.foundation.element.InputWindowElement; +import net.createmod.ponder.foundation.element.WorldSectionElement; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -140,7 +141,7 @@ public class SteamScenes { rightClick = new InputWindowElement(util.vector.blockSurface(util.grid.at(2, 3, 1), Direction.EAST), Pointing.RIGHT) - .withWrench() + .withItem(AllItems.WRENCH.asStack()) .rightClick(); scene.overlay.showControls(rightClick, 50); @@ -189,7 +190,8 @@ public class SteamScenes { scene.idle(40); } - public static void engine(SceneBuilder scene, SceneBuildingUtil util) { + public static void engine(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("steam_engine", "Setting up Steam Engines"); scene.configureBasePlate(0, 0, 7); scene.setSceneOffsetY(-1); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/TemplateScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/TemplateScenes.java index 714a9b8e99..c4ee7d7d84 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/TemplateScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/TemplateScenes.java @@ -1,18 +1,20 @@ package com.simibubi.create.foundation.ponder.content; -import com.simibubi.create.foundation.ponder.SceneBuilder; -import com.simibubi.create.foundation.ponder.SceneBuildingUtil; +import com.simibubi.create.foundation.ponder.CreateSceneBuilder; +import net.createmod.ponder.foundation.SceneBuilder; +import net.createmod.ponder.foundation.SceneBuildingUtil; import net.minecraft.core.Direction; public class TemplateScenes { - - public static void templateMethod(SceneBuilder scene, SceneBuildingUtil util) { + + public static void templateMethod(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("", ""); scene.configureBasePlate(0, 0, 5); scene.world.showSection(util.select.layer(0), Direction.UP); scene.idle(5); scene.world.showSection(util.select.layersFrom(1), Direction.DOWN); } - + } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/TunnelScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/TunnelScenes.java index 076a44f0e7..f6a6cd1ce9 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/TunnelScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/TunnelScenes.java @@ -7,19 +7,20 @@ import com.simibubi.create.content.contraptions.relays.belt.BeltBlock; import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; import com.simibubi.create.content.logistics.block.belts.tunnel.BrassTunnelTileEntity; import com.simibubi.create.foundation.gui.AllIcons; -import com.simibubi.create.foundation.ponder.ElementLink; -import com.simibubi.create.foundation.ponder.PonderPalette; -import com.simibubi.create.foundation.ponder.SceneBuilder; -import com.simibubi.create.foundation.ponder.SceneBuildingUtil; -import com.simibubi.create.foundation.ponder.element.InputWindowElement; -import com.simibubi.create.foundation.ponder.element.WorldSectionElement; +import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.SidedFilteringBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollOptionBehaviour; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.NBTHelper; -import com.simibubi.create.foundation.utility.Pointing; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.ponder.foundation.ElementLink; +import net.createmod.ponder.foundation.PonderPalette; +import net.createmod.ponder.foundation.SceneBuilder; +import net.createmod.ponder.foundation.SceneBuildingUtil; +import net.createmod.ponder.foundation.element.InputWindowElement; +import net.createmod.ponder.foundation.element.WorldSectionElement; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.entity.Entity; @@ -32,7 +33,8 @@ import net.minecraft.world.phys.Vec3; public class TunnelScenes { - public static void andesite(SceneBuilder scene, SceneBuildingUtil util) { + public static void andesite(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("andesite_tunnel", "Using Andesite Tunnels"); scene.configureBasePlate(0, 0, 5); @@ -105,7 +107,8 @@ public class TunnelScenes { scene.world.multiplyKineticSpeed(util.select.everywhere(), 16f); } - public static void brass(SceneBuilder scene, SceneBuildingUtil util) { + public static void brass(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("brass_tunnel", "Using Brass Tunnels"); scene.configureBasePlate(1, 0, 5); scene.world.cycleBlockProperty(util.grid.at(3, 1, 2), BeltBlock.CASING); @@ -228,7 +231,7 @@ public class TunnelScenes { Vec3 tunnelTop = util.vector.topOf(tunnelPos); scene.overlay.showControls(new InputWindowElement(tunnelTop, Pointing.DOWN).scroll() - .withWrench(), 80); + .withItem(AllItems.WRENCH.asStack()), 80); scene.idle(7); scene.overlay.showCenteredScrollInput(tunnelPos, Direction.UP, 120); scene.overlay.showText(120) @@ -344,7 +347,8 @@ public class TunnelScenes { .add(0, 0.3, 0); } - public static void brassModes(SceneBuilder scene, SceneBuildingUtil util) { + public static void brassModes(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("brass_tunnel_modes", "Distribution Modes of the Brass Tunnel"); scene.configureBasePlate(0, 1, 5); BlockState barrier = Blocks.BARRIER.defaultBlockState(); @@ -361,7 +365,7 @@ public class TunnelScenes { Vec3 tunnelTop = util.vector.topOf(util.grid.at(2, 2, 3)); scene.overlay.showControls(new InputWindowElement(tunnelTop, Pointing.DOWN).scroll() - .withWrench(), 80); + .withItem(AllItems.WRENCH.asStack()), 80); scene.idle(7); scene.overlay.showCenteredScrollInput(util.grid.at(2, 2, 3), Direction.UP, 120); scene.overlay.showText(120) diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/DrainScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/DrainScenes.java index a5553a79d3..9d8dff3f53 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/DrainScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/DrainScenes.java @@ -1,15 +1,16 @@ package com.simibubi.create.foundation.ponder.content.fluid; import com.simibubi.create.content.contraptions.fluids.actors.ItemDrainTileEntity; -import com.simibubi.create.foundation.ponder.ElementLink; -import com.simibubi.create.foundation.ponder.SceneBuilder; -import com.simibubi.create.foundation.ponder.SceneBuildingUtil; -import com.simibubi.create.foundation.ponder.Selection; -import com.simibubi.create.foundation.ponder.element.InputWindowElement; -import com.simibubi.create.foundation.ponder.element.WorldSectionElement; +import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour; -import com.simibubi.create.foundation.utility.Pointing; +import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.foundation.ElementLink; +import net.createmod.ponder.foundation.SceneBuilder; +import net.createmod.ponder.foundation.SceneBuildingUtil; +import net.createmod.ponder.foundation.Selection; +import net.createmod.ponder.foundation.element.InputWindowElement; +import net.createmod.ponder.foundation.element.WorldSectionElement; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.item.ItemStack; @@ -21,7 +22,8 @@ import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction; public class DrainScenes { - public static void emptying(SceneBuilder scene, SceneBuildingUtil util) { + public static void emptying(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("item_drain", "Emptying Fluid Containers using Item Drains"); scene.configureBasePlate(0, 0, 5); scene.showBasePlate(); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/FluidMovementActorScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/FluidMovementActorScenes.java index a0f01576d3..39a16ce532 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/FluidMovementActorScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/FluidMovementActorScenes.java @@ -4,15 +4,16 @@ import com.simibubi.create.AllFluids; import com.simibubi.create.content.contraptions.components.actors.PortableFluidInterfaceTileEntity; import com.simibubi.create.content.contraptions.fluids.tank.FluidTankTileEntity; import com.simibubi.create.foundation.fluid.FluidHelper; -import com.simibubi.create.foundation.ponder.ElementLink; -import com.simibubi.create.foundation.ponder.PonderPalette; -import com.simibubi.create.foundation.ponder.SceneBuilder; -import com.simibubi.create.foundation.ponder.SceneBuildingUtil; -import com.simibubi.create.foundation.ponder.Selection; -import com.simibubi.create.foundation.ponder.element.InputWindowElement; -import com.simibubi.create.foundation.ponder.element.WorldSectionElement; -import com.simibubi.create.foundation.utility.Pointing; +import com.simibubi.create.foundation.ponder.CreateSceneBuilder; +import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.foundation.ElementLink; +import net.createmod.ponder.foundation.PonderPalette; +import net.createmod.ponder.foundation.SceneBuilder; +import net.createmod.ponder.foundation.SceneBuildingUtil; +import net.createmod.ponder.foundation.Selection; +import net.createmod.ponder.foundation.element.InputWindowElement; +import net.createmod.ponder.foundation.element.WorldSectionElement; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.item.ItemStack; @@ -24,7 +25,8 @@ import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction; public class FluidMovementActorScenes { - public static void transfer(SceneBuilder scene, SceneBuildingUtil util) { + public static void transfer(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("portable_fluid_interface", "Contraption Fluid Exchange"); scene.configureBasePlate(0, 0, 6); scene.scaleSceneView(0.95f); @@ -193,7 +195,7 @@ public class FluidMovementActorScenes { scene.idle(15); scene.world.rotateBearing(bearing, 270, 120); scene.world.rotateSection(contraption, 0, 270, 0, 120); - + scene.idle(100); scene.markAsFinished(); } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/FluidTankScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/FluidTankScenes.java index aca6c625e2..783c53c3f2 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/FluidTankScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/FluidTankScenes.java @@ -2,6 +2,7 @@ package com.simibubi.create.foundation.ponder.content.fluid; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllFluids; +import com.simibubi.create.AllItems; import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.fluids.FluidFX; import com.simibubi.create.content.contraptions.fluids.actors.SpoutTileEntity; @@ -12,17 +13,18 @@ import com.simibubi.create.content.contraptions.fluids.tank.FluidTankTileEntity; import com.simibubi.create.content.logistics.block.redstone.NixieTubeTileEntity; import com.simibubi.create.foundation.fluid.FluidHelper; import com.simibubi.create.foundation.gui.AllIcons; -import com.simibubi.create.foundation.ponder.ElementLink; -import com.simibubi.create.foundation.ponder.PonderPalette; -import com.simibubi.create.foundation.ponder.SceneBuilder; -import com.simibubi.create.foundation.ponder.SceneBuildingUtil; -import com.simibubi.create.foundation.ponder.Selection; -import com.simibubi.create.foundation.ponder.element.InputWindowElement; -import com.simibubi.create.foundation.ponder.element.WorldSectionElement; -import com.simibubi.create.foundation.ponder.instruction.EmitParticlesInstruction.Emitter; -import com.simibubi.create.foundation.utility.Pointing; -import com.simibubi.create.foundation.utility.VecHelper; +import com.simibubi.create.foundation.ponder.CreateSceneBuilder; +import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.ponder.foundation.ElementLink; +import net.createmod.ponder.foundation.PonderPalette; +import net.createmod.ponder.foundation.SceneBuilder; +import net.createmod.ponder.foundation.SceneBuildingUtil; +import net.createmod.ponder.foundation.Selection; +import net.createmod.ponder.foundation.element.InputWindowElement; +import net.createmod.ponder.foundation.element.WorldSectionElement; +import net.createmod.ponder.foundation.instruction.EmitParticlesInstruction.Emitter; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.item.ItemStack; @@ -35,7 +37,8 @@ import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction; public class FluidTankScenes { - public static void storage(SceneBuilder scene, SceneBuildingUtil util) { + public static void storage(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("fluid_tank_storage", "Storing Fluids in Fluid Tanks"); scene.configureBasePlate(0, 0, 5); scene.showBasePlate(); @@ -335,7 +338,7 @@ public class FluidTankScenes { scene.overlay.showControls( new InputWindowElement(util.vector.blockSurface(util.grid.at(3, 3, 1), Direction.NORTH), Pointing.RIGHT) .rightClick() - .withWrench(), + .withItem(AllItems.WRENCH.asStack()), 60); scene.idle(7); scene.world.modifyBlocks(full2, s -> s.setValue(FluidTankBlock.SHAPE, FluidTankBlock.Shape.PLAIN), false); @@ -349,7 +352,8 @@ public class FluidTankScenes { scene.idle(50); } - public static void creative(SceneBuilder scene, SceneBuildingUtil util) { + public static void creative(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("creative_fluid_tank", "Creative Fluid Tanks"); scene.configureBasePlate(0, 0, 5); scene.showBasePlate(); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/HosePulleyScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/HosePulleyScenes.java index 9fdfa78f88..96292c8ed0 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/HosePulleyScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/HosePulleyScenes.java @@ -6,13 +6,14 @@ import java.util.List; import com.simibubi.create.content.contraptions.fluids.actors.HosePulleyFluidHandler; import com.simibubi.create.content.contraptions.fluids.actors.HosePulleyTileEntity; -import com.simibubi.create.foundation.ponder.ElementLink; -import com.simibubi.create.foundation.ponder.PonderPalette; -import com.simibubi.create.foundation.ponder.SceneBuilder; -import com.simibubi.create.foundation.ponder.SceneBuildingUtil; -import com.simibubi.create.foundation.ponder.Selection; -import com.simibubi.create.foundation.ponder.element.WorldSectionElement; +import com.simibubi.create.foundation.ponder.CreateSceneBuilder; +import net.createmod.ponder.foundation.ElementLink; +import net.createmod.ponder.foundation.PonderPalette; +import net.createmod.ponder.foundation.SceneBuilder; +import net.createmod.ponder.foundation.SceneBuildingUtil; +import net.createmod.ponder.foundation.Selection; +import net.createmod.ponder.foundation.element.WorldSectionElement; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.block.Blocks; @@ -25,7 +26,8 @@ import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction; public class HosePulleyScenes { - public static void intro(SceneBuilder scene, SceneBuildingUtil util) { + public static void intro(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("hose_pulley", "Source Filling and Draining using Hose Pulleys"); scene.configureBasePlate(0, 0, 3); scene.setSceneOffsetY(-1); @@ -156,7 +158,8 @@ public class HosePulleyScenes { } - public static void level(SceneBuilder scene, SceneBuildingUtil util) { + public static void level(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("hose_pulley_level", "Fill and Drain level of Hose Pulleys"); scene.configureBasePlate(0, 0, 3); scene.setSceneOffsetY(-1.5f); @@ -298,7 +301,8 @@ public class HosePulleyScenes { scene.idle(80); } - public static void infinite(SceneBuilder scene, SceneBuildingUtil util) { + public static void infinite(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("hose_pulley_infinite", "Passively Filling and Draining large bodies of Fluid"); scene.configureBasePlate(0, 0, 5); scene.setSceneOffsetY(-.5f); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/PipeScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/PipeScenes.java index 891b072354..b9512b7ea3 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/PipeScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/PipeScenes.java @@ -2,6 +2,7 @@ package com.simibubi.create.foundation.ponder.content.fluid; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllFluids; +import com.simibubi.create.AllItems; import com.simibubi.create.content.contraptions.fluids.PumpBlock; import com.simibubi.create.content.contraptions.fluids.actors.ItemDrainTileEntity; import com.simibubi.create.content.contraptions.fluids.pipes.AxisPipeBlock; @@ -13,16 +14,17 @@ import com.simibubi.create.content.contraptions.fluids.pipes.SmartFluidPipeTileE import com.simibubi.create.content.contraptions.fluids.tank.FluidTankTileEntity; import com.simibubi.create.content.contraptions.processing.BasinTileEntity; import com.simibubi.create.foundation.fluid.FluidHelper; -import com.simibubi.create.foundation.ponder.ElementLink; -import com.simibubi.create.foundation.ponder.PonderPalette; -import com.simibubi.create.foundation.ponder.SceneBuilder; -import com.simibubi.create.foundation.ponder.SceneBuildingUtil; -import com.simibubi.create.foundation.ponder.Selection; -import com.simibubi.create.foundation.ponder.element.InputWindowElement; -import com.simibubi.create.foundation.ponder.element.WorldSectionElement; +import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour; -import com.simibubi.create.foundation.utility.Pointing; +import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.foundation.ElementLink; +import net.createmod.ponder.foundation.PonderPalette; +import net.createmod.ponder.foundation.SceneBuilder; +import net.createmod.ponder.foundation.SceneBuildingUtil; +import net.createmod.ponder.foundation.Selection; +import net.createmod.ponder.foundation.element.InputWindowElement; +import net.createmod.ponder.foundation.element.WorldSectionElement; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -42,7 +44,8 @@ import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction; public class PipeScenes { - public static void flow(SceneBuilder scene, SceneBuildingUtil util) { + public static void flow(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("fluid_pipe_flow", "Moving Fluids using Copper Pipes"); scene.configureBasePlate(0, 0, 5); scene.showBasePlate(); @@ -92,7 +95,7 @@ public class PipeScenes { scene.idle(60); scene.overlay.showControls(new InputWindowElement(util.vector.centerOf(2, 1, 1), Pointing.DOWN).rightClick() - .withWrench(), 40); + .withItem(AllItems.WRENCH.asStack()), 40); scene.idle(7); scene.world.restoreBlocks(util.select.position(2, 1, 1)); scene.overlay.showText(70) @@ -103,7 +106,7 @@ public class PipeScenes { scene.idle(40); scene.overlay.showControls(new InputWindowElement(util.vector.centerOf(1, 1, 2), Pointing.DOWN).rightClick() - .withWrench(), 10); + .withItem(AllItems.WRENCH.asStack()), 10); scene.idle(7); scene.world.restoreBlocks(util.select.position(1, 1, 2)); scene.idle(40); @@ -177,7 +180,8 @@ public class PipeScenes { scene.idle(50); } - public static void interaction(SceneBuilder scene, SceneBuildingUtil util) { + public static void interaction(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("fluid_pipe_interaction", "Draining and Filling fluid containers"); scene.configureBasePlate(0, 1, 5); scene.showBasePlate(); @@ -371,7 +375,8 @@ public class PipeScenes { scene.idle(20); } - public static void valve(SceneBuilder scene, SceneBuildingUtil util) { + public static void valve(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("valve_pipe", "Controlling Fluid flow using Valves"); scene.configureBasePlate(0, 0, 5); scene.showBasePlate(); @@ -465,7 +470,8 @@ public class PipeScenes { scene.world.setKineticSpeed(valveKinetics, 0); } - public static void smart(SceneBuilder scene, SceneBuildingUtil util) { + public static void smart(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("smart_pipe", "Controlling Fluid flow using Smart Pipes"); scene.configureBasePlate(1, 0, 5); scene.showBasePlate(); @@ -482,7 +488,7 @@ public class PipeScenes { Selection pump = util.select.position(1, 1, 2); Selection basin = util.select.position(basinPos); BlockPos smartPos = util.grid.at(3, 1, 1); - + scene.world.modifyTileEntity(basinPos, BasinTileEntity.class, te -> te.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) .ifPresent(ifh -> ifh.fill(new FluidStack(ForgeMod.MILK.get(), 1000), FluidAction.EXECUTE))); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/PumpScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/PumpScenes.java index 298af869f4..c71ee1d551 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/PumpScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/PumpScenes.java @@ -1,20 +1,22 @@ package com.simibubi.create.foundation.ponder.content.fluid; import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllItems; import com.simibubi.create.content.contraptions.fluids.PumpBlock; import com.simibubi.create.content.contraptions.fluids.pipes.FluidPipeBlock; import com.simibubi.create.content.contraptions.fluids.pipes.GlassFluidPipeBlock; import com.simibubi.create.content.contraptions.fluids.tank.FluidTankTileEntity; import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock; -import com.simibubi.create.foundation.ponder.ElementLink; -import com.simibubi.create.foundation.ponder.PonderPalette; -import com.simibubi.create.foundation.ponder.SceneBuilder; -import com.simibubi.create.foundation.ponder.SceneBuildingUtil; -import com.simibubi.create.foundation.ponder.Selection; -import com.simibubi.create.foundation.ponder.element.InputWindowElement; -import com.simibubi.create.foundation.ponder.element.WorldSectionElement; -import com.simibubi.create.foundation.utility.Pointing; +import com.simibubi.create.foundation.ponder.CreateSceneBuilder; +import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.foundation.ElementLink; +import net.createmod.ponder.foundation.PonderPalette; +import net.createmod.ponder.foundation.SceneBuilder; +import net.createmod.ponder.foundation.SceneBuildingUtil; +import net.createmod.ponder.foundation.Selection; +import net.createmod.ponder.foundation.element.InputWindowElement; +import net.createmod.ponder.foundation.element.WorldSectionElement; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -26,7 +28,8 @@ import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction; public class PumpScenes { - public static void flow(SceneBuilder scene, SceneBuildingUtil util) { + public static void flow(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("mechanical_pump_flow", "Fluid Transportation using Mechanical Pumps"); scene.configureBasePlate(0, 0, 5); scene.showBasePlate(); @@ -143,7 +146,7 @@ public class PumpScenes { scene.idle(55); scene.overlay.showControls(new InputWindowElement(util.vector.topOf(pumpPos), Pointing.DOWN).rightClick() - .withWrench(), 40); + .withItem(AllItems.WRENCH.asStack()), 40); scene.idle(7); scene.world.modifyBlock(pumpPos, s -> s.setValue(PumpBlock.FACING, Direction.EAST), true); scene.overlay.showText(70) @@ -166,7 +169,8 @@ public class PumpScenes { } - public static void speed(SceneBuilder scene, SceneBuildingUtil util) { + public static void speed(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("mechanical_pump_speed", "Throughput of Mechanical Pumps"); scene.configureBasePlate(0, 0, 5); scene.showBasePlate(); @@ -301,13 +305,13 @@ public class PumpScenes { scene.overlay .showControls(new InputWindowElement(util.vector.topOf(pumpPos.south()), Pointing.DOWN).rightClick() - .withWrench(), 30); + .withItem(AllItems.WRENCH.asStack()), 30); scene.idle(7); scene.world.modifyBlock(pumpPos.south(), s -> s.setValue(PumpBlock.FACING, Direction.WEST), true); scene.idle(30); scene.overlay .showControls(new InputWindowElement(util.vector.topOf(pumpPos.north()), Pointing.DOWN).rightClick() - .withWrench(), 30); + .withItem(AllItems.WRENCH.asStack()), 30); scene.idle(7); scene.world.modifyBlock(pumpPos.north(), s -> s.setValue(PumpBlock.FACING, Direction.WEST), true); scene.idle(30); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/SpoutScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/SpoutScenes.java index 8f86f5d708..62afd29357 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/SpoutScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/SpoutScenes.java @@ -6,18 +6,19 @@ import com.simibubi.create.content.contraptions.fluids.FluidFX; import com.simibubi.create.content.contraptions.fluids.actors.SpoutTileEntity; import com.simibubi.create.foundation.fluid.FluidHelper; import com.simibubi.create.foundation.gui.AllIcons; -import com.simibubi.create.foundation.ponder.ElementLink; -import com.simibubi.create.foundation.ponder.PonderPalette; -import com.simibubi.create.foundation.ponder.SceneBuilder; -import com.simibubi.create.foundation.ponder.SceneBuildingUtil; -import com.simibubi.create.foundation.ponder.Selection; +import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import com.simibubi.create.foundation.ponder.element.BeltItemElement; -import com.simibubi.create.foundation.ponder.element.InputWindowElement; -import com.simibubi.create.foundation.ponder.element.WorldSectionElement; -import com.simibubi.create.foundation.ponder.instruction.EmitParticlesInstruction.Emitter; -import com.simibubi.create.foundation.utility.Pointing; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.ponder.foundation.ElementLink; +import net.createmod.ponder.foundation.PonderPalette; +import net.createmod.ponder.foundation.SceneBuilder; +import net.createmod.ponder.foundation.SceneBuildingUtil; +import net.createmod.ponder.foundation.Selection; +import net.createmod.ponder.foundation.element.InputWindowElement; +import net.createmod.ponder.foundation.element.WorldSectionElement; +import net.createmod.ponder.foundation.instruction.EmitParticlesInstruction.Emitter; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.particles.ParticleOptions; @@ -28,7 +29,8 @@ import net.minecraftforge.fluids.FluidStack; public class SpoutScenes { - public static void filling(SceneBuilder scene, SceneBuildingUtil util) { + public static void filling(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("spout_filling", "Filling Items using a Spout"); scene.configureBasePlate(0, 0, 5); scene.showBasePlate(); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/trains/TrackObserverScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/trains/TrackObserverScenes.java index ddf08e405a..4644f4e11f 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/trains/TrackObserverScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/trains/TrackObserverScenes.java @@ -2,17 +2,18 @@ package com.simibubi.create.foundation.ponder.content.trains; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.logistics.trains.management.edgePoint.observer.TrackObserverTileEntity; -import com.simibubi.create.foundation.ponder.ElementLink; -import com.simibubi.create.foundation.ponder.PonderPalette; -import com.simibubi.create.foundation.ponder.SceneBuilder; -import com.simibubi.create.foundation.ponder.SceneBuildingUtil; -import com.simibubi.create.foundation.ponder.Selection; -import com.simibubi.create.foundation.ponder.element.InputWindowElement; -import com.simibubi.create.foundation.ponder.element.ParrotElement; -import com.simibubi.create.foundation.ponder.element.ParrotElement.FacePointOfInterestPose; -import com.simibubi.create.foundation.ponder.element.WorldSectionElement; -import com.simibubi.create.foundation.utility.Pointing; +import com.simibubi.create.foundation.ponder.CreateSceneBuilder; +import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.foundation.ElementLink; +import net.createmod.ponder.foundation.PonderPalette; +import net.createmod.ponder.foundation.SceneBuilder; +import net.createmod.ponder.foundation.SceneBuildingUtil; +import net.createmod.ponder.foundation.Selection; +import net.createmod.ponder.foundation.element.InputWindowElement; +import net.createmod.ponder.foundation.element.ParrotElement; +import net.createmod.ponder.foundation.element.ParrotElement.FacePointOfInterestPose; +import net.createmod.ponder.foundation.element.WorldSectionElement; import net.minecraft.core.Direction; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; @@ -21,7 +22,8 @@ import net.minecraft.world.phys.Vec3; public class TrackObserverScenes { - public static void observe(SceneBuilder scene, SceneBuildingUtil util) { + public static void observe(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("track_observer", "Detecting Trains"); scene.configureBasePlate(1, 1, 9); scene.scaleSceneView(.65f); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/trains/TrackScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/trains/TrackScenes.java index 4087a6a7e5..6faaf9df30 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/trains/TrackScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/trains/TrackScenes.java @@ -4,17 +4,18 @@ import java.util.List; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock; -import com.simibubi.create.foundation.ponder.ElementLink; -import com.simibubi.create.foundation.ponder.PonderPalette; -import com.simibubi.create.foundation.ponder.SceneBuilder; -import com.simibubi.create.foundation.ponder.SceneBuildingUtil; -import com.simibubi.create.foundation.ponder.Selection; -import com.simibubi.create.foundation.ponder.element.InputWindowElement; -import com.simibubi.create.foundation.ponder.element.ParrotElement; -import com.simibubi.create.foundation.ponder.element.ParrotElement.FacePointOfInterestPose; -import com.simibubi.create.foundation.ponder.element.WorldSectionElement; -import com.simibubi.create.foundation.utility.Pointing; +import com.simibubi.create.foundation.ponder.CreateSceneBuilder; +import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.foundation.ElementLink; +import net.createmod.ponder.foundation.PonderPalette; +import net.createmod.ponder.foundation.SceneBuilder; +import net.createmod.ponder.foundation.SceneBuildingUtil; +import net.createmod.ponder.foundation.Selection; +import net.createmod.ponder.foundation.element.InputWindowElement; +import net.createmod.ponder.foundation.element.ParrotElement; +import net.createmod.ponder.foundation.element.ParrotElement.FacePointOfInterestPose; +import net.createmod.ponder.foundation.element.WorldSectionElement; import net.minecraft.core.Direction; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Blocks; @@ -257,7 +258,8 @@ public class TrackScenes { scene.world.showSectionAndMerge(util.select.position(2, 8, 3), Direction.DOWN, slopeStart); } - public static void portal(SceneBuilder scene, SceneBuildingUtil util) { + public static void portal(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("track_portal", "Tracks and the Nether"); scene.configureBasePlate(0, 0, 9); scene.scaleSceneView(.65f); @@ -270,7 +272,7 @@ public class TrackScenes { scene.world.showSection(util.select.position(4, 1, i), Direction.DOWN); scene.idle(2); } - + scene.world.toggleControls(util.grid.at(4, 3, 3)); scene.idle(15); @@ -343,14 +345,15 @@ public class TrackScenes { } - public static void chunks(SceneBuilder scene, SceneBuildingUtil util) { + public static void chunks(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("track_chunks", "Traversing unloaded Chunks"); scene.configureBasePlate(0, 0, 9); scene.scaleSceneView(.65f); scene.setSceneOffsetY(-1); - + scene.world.cycleBlockProperty(util.grid.at(5, 3, 4), BlazeBurnerBlock.HEAT_LEVEL); - + ElementLink stationElement = scene.world.showIndependentSection(util.select.fromTo(0, 0, 0, 8, 0, 8), Direction.UP); ElementLink stationTrackElement = diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/trains/TrainScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/trains/TrainScenes.java index fc7bd93b45..792a8ce851 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/trains/TrainScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/trains/TrainScenes.java @@ -3,17 +3,18 @@ package com.simibubi.create.foundation.ponder.content.trains; import com.simibubi.create.AllItems; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock; import com.simibubi.create.content.logistics.trains.management.edgePoint.station.StationBlock; -import com.simibubi.create.foundation.ponder.ElementLink; -import com.simibubi.create.foundation.ponder.PonderPalette; -import com.simibubi.create.foundation.ponder.SceneBuilder; -import com.simibubi.create.foundation.ponder.SceneBuildingUtil; -import com.simibubi.create.foundation.ponder.Selection; -import com.simibubi.create.foundation.ponder.element.InputWindowElement; -import com.simibubi.create.foundation.ponder.element.ParrotElement; -import com.simibubi.create.foundation.ponder.element.ParrotElement.FacePointOfInterestPose; -import com.simibubi.create.foundation.ponder.element.WorldSectionElement; -import com.simibubi.create.foundation.utility.Pointing; +import com.simibubi.create.foundation.ponder.CreateSceneBuilder; +import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.foundation.ElementLink; +import net.createmod.ponder.foundation.PonderPalette; +import net.createmod.ponder.foundation.SceneBuilder; +import net.createmod.ponder.foundation.SceneBuildingUtil; +import net.createmod.ponder.foundation.Selection; +import net.createmod.ponder.foundation.element.InputWindowElement; +import net.createmod.ponder.foundation.element.ParrotElement; +import net.createmod.ponder.foundation.element.ParrotElement.FacePointOfInterestPose; +import net.createmod.ponder.foundation.element.WorldSectionElement; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.item.ItemStack; @@ -23,7 +24,8 @@ import net.minecraft.world.phys.Vec3; public class TrainScenes { - public static void controls(SceneBuilder scene, SceneBuildingUtil util) { + public static void controls(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("train_controls", "Controlling Trains"); scene.configureBasePlate(1, 0, 9); scene.scaleSceneView(.75f); @@ -159,7 +161,8 @@ public class TrainScenes { scene.idle(60); } - public static void schedule(SceneBuilder scene, SceneBuildingUtil util) { + public static void schedule(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("train_schedule", "Using Train Schedules"); scene.configureBasePlate(1, 0, 9); scene.scaleSceneView(.75f); @@ -167,7 +170,7 @@ public class TrainScenes { scene.showBasePlate(); scene.world.cycleBlockProperty(util.grid.at(3, 3, 4), BlazeBurnerBlock.HEAT_LEVEL); - + for (int i = 10; i >= 0; i--) { scene.world.showSection(util.select.position(i, 1, 4), Direction.DOWN); scene.idle(1); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/trains/TrainSignalScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/trains/TrainSignalScenes.java index 6c35b21d39..2b14c360bc 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/trains/TrainSignalScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/trains/TrainSignalScenes.java @@ -4,18 +4,19 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.content.logistics.trains.management.edgePoint.signal.SignalBlock; import com.simibubi.create.content.logistics.trains.management.edgePoint.signal.SignalTileEntity.SignalState; -import com.simibubi.create.foundation.ponder.ElementLink; -import com.simibubi.create.foundation.ponder.PonderPalette; -import com.simibubi.create.foundation.ponder.SceneBuilder; -import com.simibubi.create.foundation.ponder.SceneBuildingUtil; -import com.simibubi.create.foundation.ponder.Selection; -import com.simibubi.create.foundation.ponder.element.InputWindowElement; -import com.simibubi.create.foundation.ponder.element.ParrotElement; -import com.simibubi.create.foundation.ponder.element.ParrotElement.DancePose; -import com.simibubi.create.foundation.ponder.element.ParrotElement.FacePointOfInterestPose; -import com.simibubi.create.foundation.ponder.element.WorldSectionElement; -import com.simibubi.create.foundation.utility.Pointing; +import com.simibubi.create.foundation.ponder.CreateSceneBuilder; +import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.foundation.ElementLink; +import net.createmod.ponder.foundation.PonderPalette; +import net.createmod.ponder.foundation.SceneBuilder; +import net.createmod.ponder.foundation.SceneBuildingUtil; +import net.createmod.ponder.foundation.Selection; +import net.createmod.ponder.foundation.element.InputWindowElement; +import net.createmod.ponder.foundation.element.ParrotElement; +import net.createmod.ponder.foundation.element.ParrotElement.DancePose; +import net.createmod.ponder.foundation.element.ParrotElement.FacePointOfInterestPose; +import net.createmod.ponder.foundation.element.WorldSectionElement; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.phys.AABB; @@ -23,7 +24,8 @@ import net.minecraft.world.phys.Vec3; public class TrainSignalScenes { - public static void placement(SceneBuilder scene, SceneBuildingUtil util) { + public static void placement(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("train_signal_placement", "Placing Train Signals"); scene.configureBasePlate(1, 0, 12); scene.scaleSceneView(.65f); @@ -48,7 +50,7 @@ public class TrainSignalScenes { Selection secondNixie = util.select.position(8, 2, 9); Selection thirdNixie = util.select.position(9, 4, 8); Selection train = util.select.fromTo(5, 2, 5, 1, 3, 7); - + scene.world.toggleControls(util.grid.at(3, 3, 6)); Vec3 marker = util.vector.topOf(8, 0, 6) @@ -202,7 +204,8 @@ public class TrainSignalScenes { scene.idle(70); } - public static void signaling(SceneBuilder scene, SceneBuildingUtil util) { + public static void signaling(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("train_signal_signaling", "Collision Prevention with Signals"); scene.configureBasePlate(1, 0, 15); scene.scaleSceneView(.5f); @@ -214,7 +217,7 @@ public class TrainSignalScenes { scene.world.showSection(util.select.position(i, 1, 15 - i), Direction.DOWN); scene.idle(1); } - + scene.world.toggleControls(util.grid.at(13, 3, 7)); scene.world.toggleControls(util.grid.at(13, 3, 1)); scene.world.toggleControls(util.grid.at(13, 3, 4)); @@ -341,7 +344,7 @@ public class TrainSignalScenes { scene.overlay.showControls( new InputWindowElement(util.vector.blockSurface(s1Pos, Direction.EAST), Pointing.RIGHT).rightClick() - .withWrench(), + .withItem(AllItems.WRENCH.asStack()), 80); scene.idle(6); scene.world.cycleBlockProperty(s1Pos, SignalBlock.TYPE); @@ -486,7 +489,8 @@ public class TrainSignalScenes { scene.idle(60); } - public static void redstone(SceneBuilder scene, SceneBuildingUtil util) { + public static void redstone(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("train_signal_redstone", "Signals & Redstone"); scene.configureBasePlate(0, 0, 9); scene.scaleSceneView(.75f); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/trains/TrainStationScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/trains/TrainStationScenes.java index 3e94025526..f5d7f1d7d0 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/trains/TrainStationScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/trains/TrainStationScenes.java @@ -3,17 +3,18 @@ package com.simibubi.create.foundation.ponder.content.trains; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.content.logistics.trains.management.edgePoint.station.StationBlock; -import com.simibubi.create.foundation.ponder.ElementLink; -import com.simibubi.create.foundation.ponder.PonderPalette; -import com.simibubi.create.foundation.ponder.SceneBuilder; -import com.simibubi.create.foundation.ponder.SceneBuildingUtil; -import com.simibubi.create.foundation.ponder.Selection; -import com.simibubi.create.foundation.ponder.element.InputWindowElement; -import com.simibubi.create.foundation.ponder.element.ParrotElement; -import com.simibubi.create.foundation.ponder.element.ParrotElement.FacePointOfInterestPose; -import com.simibubi.create.foundation.ponder.element.WorldSectionElement; -import com.simibubi.create.foundation.utility.Pointing; +import com.simibubi.create.foundation.ponder.CreateSceneBuilder; +import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.foundation.ElementLink; +import net.createmod.ponder.foundation.PonderPalette; +import net.createmod.ponder.foundation.SceneBuilder; +import net.createmod.ponder.foundation.SceneBuildingUtil; +import net.createmod.ponder.foundation.Selection; +import net.createmod.ponder.foundation.element.InputWindowElement; +import net.createmod.ponder.foundation.element.ParrotElement; +import net.createmod.ponder.foundation.element.ParrotElement.FacePointOfInterestPose; +import net.createmod.ponder.foundation.element.WorldSectionElement; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.item.ItemStack; @@ -25,7 +26,8 @@ import net.minecraft.world.phys.Vec3; public class TrainStationScenes { - public static void assembly(SceneBuilder scene, SceneBuildingUtil util) { + public static void assembly(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("train_assembly", "Assembling Trains"); scene.configureBasePlate(1, 0, 12); scene.scaleSceneView(.65f); @@ -311,7 +313,7 @@ public class TrainStationScenes { Vec3 target = util.vector.topOf(util.grid.at(5, 3, 6)); scene.overlay.showControls(new InputWindowElement(target, Pointing.DOWN).rightClick() - .withWrench(), 75); + .withItem(AllItems.WRENCH.asStack()), 75); scene.idle(15); scene.overlay.showText(70) @@ -324,13 +326,14 @@ public class TrainStationScenes { scene.overlay .showControls(new InputWindowElement(util.vector.topOf(util.grid.at(6, 0, 2)), Pointing.DOWN).rightClick() - .withWrench(), 15); + .withItem(AllItems.WRENCH.asStack()), 15); scene.idle(15); scene.world.moveSection(trainElement3, util.vector.of(0, 0, -4), 5); } - public static void autoSchedule(SceneBuilder scene, SceneBuildingUtil util) { + public static void autoSchedule(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("auto_schedule", "Stations & Scheduling"); scene.configureBasePlate(1, 0, 12); scene.scaleSceneView(.65f); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/element/AnimatedOverlayElement.java b/src/main/java/com/simibubi/create/foundation/ponder/element/AnimatedOverlayElement.java deleted file mode 100644 index 27d1ff57da..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/element/AnimatedOverlayElement.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.simibubi.create.foundation.ponder.element; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.foundation.ponder.PonderScene; -import com.simibubi.create.foundation.ponder.ui.PonderUI; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; - -public abstract class AnimatedOverlayElement extends PonderOverlayElement { - - protected LerpedFloat fade; - - public AnimatedOverlayElement() { - fade = LerpedFloat.linear() - .startWithValue(0); - } - - public void setFade(float fade) { - this.fade.setValue(fade); - } - - @Override - public final void render(PonderScene scene, PonderUI screen, PoseStack ms, float partialTicks) { - float currentFade = fade.getValue(partialTicks); - render(scene, screen, ms, partialTicks, currentFade); - } - - protected abstract void render(PonderScene scene, PonderUI screen, PoseStack ms, float partialTicks, float fade); - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/element/AnimatedSceneElement.java b/src/main/java/com/simibubi/create/foundation/ponder/element/AnimatedSceneElement.java deleted file mode 100644 index a8c8b7258f..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/element/AnimatedSceneElement.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.simibubi.create.foundation.ponder.element; - -import com.jozufozu.flywheel.util.transform.TransformStack; -import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.foundation.ponder.PonderWorld; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; - -import net.minecraft.client.renderer.LightTexture; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.util.Mth; -import net.minecraft.world.phys.Vec3; - -public abstract class AnimatedSceneElement extends PonderSceneElement { - - protected Vec3 fadeVec; - protected LerpedFloat fade; - - public AnimatedSceneElement() { - fade = LerpedFloat.linear() - .startWithValue(0); - } - - public void forceApplyFade(float fade) { - this.fade.startWithValue(fade); - } - - public void setFade(float fade) { - this.fade.setValue(fade); - } - - public void setFadeVec(Vec3 fadeVec) { - this.fadeVec = fadeVec; - } - - @Override - public final void renderFirst(PonderWorld world, MultiBufferSource buffer, PoseStack ms, float pt) { - ms.pushPose(); - float currentFade = applyFade(ms, pt); - renderFirst(world, buffer, ms, currentFade, pt); - ms.popPose(); - } - - @Override - public final void renderLayer(PonderWorld world, MultiBufferSource buffer, RenderType type, PoseStack ms, - float pt) { - ms.pushPose(); - float currentFade = applyFade(ms, pt); - renderLayer(world, buffer, type, ms, currentFade, pt); - ms.popPose(); - } - - @Override - public final void renderLast(PonderWorld world, MultiBufferSource buffer, PoseStack ms, float pt) { - ms.pushPose(); - float currentFade = applyFade(ms, pt); - renderLast(world, buffer, ms, currentFade, pt); - ms.popPose(); - } - - protected float applyFade(PoseStack ms, float pt) { - float currentFade = fade.getValue(pt); - if (fadeVec != null) - TransformStack.cast(ms) - .translate(fadeVec.scale(-1 + currentFade)); - return currentFade; - } - - protected void renderLayer(PonderWorld world, MultiBufferSource buffer, RenderType type, PoseStack ms, float fade, - float pt) {} - - protected void renderFirst(PonderWorld world, MultiBufferSource buffer, PoseStack ms, float fade, float pt) {} - - protected void renderLast(PonderWorld world, MultiBufferSource buffer, PoseStack ms, float fade, float pt) {} - - protected int lightCoordsFromFade(float fade) { - int light = LightTexture.FULL_BRIGHT; - if (fade != 1) { - light = (int) (Mth.lerp(fade, 5, 0xF)); - light = LightTexture.pack(light, light); - } - return light; - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/element/BeltItemElement.java b/src/main/java/com/simibubi/create/foundation/ponder/element/BeltItemElement.java index 79640d5bc2..2912a56d1b 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/element/BeltItemElement.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/element/BeltItemElement.java @@ -2,6 +2,8 @@ package com.simibubi.create.foundation.ponder.element; import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; +import net.createmod.ponder.foundation.element.TrackedElement; + public class BeltItemElement extends TrackedElement { public BeltItemElement(TransportedItemStack wrapped) { diff --git a/src/main/java/com/simibubi/create/foundation/ponder/element/EntityElement.java b/src/main/java/com/simibubi/create/foundation/ponder/element/EntityElement.java deleted file mode 100644 index 3c3d5b30cb..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/element/EntityElement.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.simibubi.create.foundation.ponder.element; - -import net.minecraft.world.entity.Entity; - -public class EntityElement extends TrackedElement { - - public EntityElement(Entity wrapped) { - super(wrapped); - } - - @Override - protected boolean isStillValid(Entity element) { - return element.isAlive(); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/element/ExpandedParrotElement.java b/src/main/java/com/simibubi/create/foundation/ponder/element/ExpandedParrotElement.java new file mode 100644 index 0000000000..fc3471588a --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/element/ExpandedParrotElement.java @@ -0,0 +1,48 @@ +package com.simibubi.create.foundation.ponder.element; + +import java.util.function.Supplier; + +import net.createmod.ponder.foundation.PonderScene; +import net.createmod.ponder.foundation.element.ParrotElement; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.phys.Vec3; + +public class ExpandedParrotElement extends ParrotElement { + + protected boolean deferConductor = false; + + protected ExpandedParrotElement(Vec3 location, Supplier pose) { + super(location, pose); + } + + @Override + public void reset(PonderScene scene) { + super.reset(scene); + entity.getPersistentData().remove("TrainHat"); + deferConductor = false; + } + + @Override + public void tick(PonderScene scene) { + boolean wasNull = entity == null; + super.tick(scene); + if (wasNull) { + if (deferConductor) { + setConductor(true); + } + deferConductor = false; + } + } + + public void setConductor(boolean isConductor) { + if (entity == null) { + deferConductor = isConductor; + return; + } + CompoundTag data = entity.getPersistentData(); + if (isConductor) + data.putBoolean("TrainHat", true); + else + data.remove("TrainHat"); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/element/InputWindowElement.java b/src/main/java/com/simibubi/create/foundation/ponder/element/InputWindowElement.java deleted file mode 100644 index cc2fcbbb7a..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/element/InputWindowElement.java +++ /dev/null @@ -1,149 +0,0 @@ -package com.simibubi.create.foundation.ponder.element; - -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.AllItems; -import com.simibubi.create.Create; -import com.simibubi.create.foundation.gui.AllIcons; -import com.simibubi.create.foundation.gui.element.GuiGameElement; -import com.simibubi.create.foundation.ponder.PonderLocalization; -import com.simibubi.create.foundation.ponder.PonderPalette; -import com.simibubi.create.foundation.ponder.PonderScene; -import com.simibubi.create.foundation.ponder.ui.PonderUI; -import com.simibubi.create.foundation.utility.Pointing; - -import net.minecraft.client.gui.Font; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.phys.Vec2; -import net.minecraft.world.phys.Vec3; - -public class InputWindowElement extends AnimatedOverlayElement { - - private Pointing direction; - ResourceLocation key; - AllIcons icon; - ItemStack item = ItemStack.EMPTY; - private Vec3 sceneSpace; - - public InputWindowElement clone() { - InputWindowElement inputWindowElement = new InputWindowElement(sceneSpace, direction); - inputWindowElement.key = key; - inputWindowElement.icon = icon; - inputWindowElement.item = item.copy(); - return inputWindowElement; - } - - public InputWindowElement(Vec3 sceneSpace, Pointing direction) { - this.sceneSpace = sceneSpace; - this.direction = direction; - } - - public InputWindowElement withItem(ItemStack stack) { - item = stack; - return this; - } - - public InputWindowElement withWrench() { - item = AllItems.WRENCH.asStack(); - return this; - } - - public InputWindowElement scroll() { - icon = AllIcons.I_SCROLL; - return this; - } - - public InputWindowElement rightClick() { - icon = AllIcons.I_RMB; - return this; - } - - public InputWindowElement showing(AllIcons icon) { - this.icon = icon; - return this; - } - - public InputWindowElement leftClick() { - icon = AllIcons.I_LMB; - return this; - } - - public InputWindowElement whileSneaking() { - key = Create.asResource("sneak_and"); - return this; - } - - public InputWindowElement whileCTRL() { - key = Create.asResource("ctrl_and"); - return this; - } - - @Override - protected void render(PonderScene scene, PonderUI screen, PoseStack ms, float partialTicks, float fade) { - Font font = screen.getFontRenderer(); - int width = 0; - int height = 0; - - float xFade = direction == Pointing.RIGHT ? -1 : direction == Pointing.LEFT ? 1 : 0; - float yFade = direction == Pointing.DOWN ? -1 : direction == Pointing.UP ? 1 : 0; - xFade *= 10 * (1 - fade); - yFade *= 10 * (1 - fade); - - boolean hasItem = !item.isEmpty(); - boolean hasText = key != null; - boolean hasIcon = icon != null; - int keyWidth = 0; - String text = hasText ? PonderLocalization.getShared(key) : ""; - - if (fade < 1 / 16f) - return; - Vec2 sceneToScreen = scene.getTransform() - .sceneToScreen(sceneSpace, partialTicks); - - if (hasIcon) { - width += 24; - height = 24; - } - - if (hasText) { - keyWidth = font.width(text); - width += keyWidth; - } - - if (hasItem) { - width += 24; - height = 24; - } - - ms.pushPose(); - ms.translate(sceneToScreen.x + xFade, sceneToScreen.y + yFade, 400); - - PonderUI.renderSpeechBox(ms, 0, 0, width, height, false, direction, true); - - ms.translate(0, 0, 100); - - if (hasText) - font.draw(ms, text, 2, (height - font.lineHeight) / 2f + 2, - PonderPalette.WHITE.getColorObject().scaleAlpha(fade).getRGB()); - - if (hasIcon) { - ms.pushPose(); - ms.translate(keyWidth, 0, 0); - ms.scale(1.5f, 1.5f, 1.5f); - icon.render(ms, 0, 0, screen); - ms.popPose(); - } - - if (hasItem) { - GuiGameElement.of(item) - .at(keyWidth + (hasIcon ? 24 : 0), 0) - .scale(1.5) - .render(ms); - RenderSystem.disableDepthTest(); - } - - ms.popPose(); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/element/MinecartElement.java b/src/main/java/com/simibubi/create/foundation/ponder/element/MinecartElement.java deleted file mode 100644 index deded12107..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/element/MinecartElement.java +++ /dev/null @@ -1,113 +0,0 @@ -package com.simibubi.create.foundation.ponder.element; - -import com.jozufozu.flywheel.util.transform.TransformStack; -import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.foundation.ponder.PonderScene; -import com.simibubi.create.foundation.ponder.PonderWorld; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.entity.EntityRenderDispatcher; -import net.minecraft.util.Mth; -import net.minecraft.world.entity.vehicle.AbstractMinecart; -import net.minecraft.world.level.Level; -import net.minecraft.world.phys.Vec3; - -public class MinecartElement extends AnimatedSceneElement { - - private Vec3 location; - private LerpedFloat rotation; - private AbstractMinecart entity; - private MinecartConstructor constructor; - private float initialRotation; - - public interface MinecartConstructor { - AbstractMinecart create(Level w, double x, double y, double z); - } - - public MinecartElement(Vec3 location, float rotation, MinecartConstructor constructor) { - initialRotation = rotation; - this.location = location.add(0, 1 / 16f, 0); - this.constructor = constructor; - this.rotation = LerpedFloat.angular() - .startWithValue(rotation); - } - - @Override - public void reset(PonderScene scene) { - super.reset(scene); - entity.setPosRaw(0, 0, 0); - entity.xo = 0; - entity.yo = 0; - entity.zo = 0; - entity.xOld = 0; - entity.yOld = 0; - entity.zOld = 0; - rotation.startWithValue(initialRotation); - } - - @Override - public void tick(PonderScene scene) { - super.tick(scene); - if (entity == null) - entity = constructor.create(scene.getWorld(), 0, 0, 0); - - entity.tickCount++; - entity.setOnGround(true); - entity.xo = entity.getX(); - entity.yo = entity.getY(); - entity.zo = entity.getZ(); - entity.xOld = entity.getX(); - entity.yOld = entity.getY(); - entity.zOld = entity.getZ(); - } - - public void setPositionOffset(Vec3 position, boolean immediate) { - if (entity == null) - return; - entity.setPos(position.x, position.y, position.z); - if (!immediate) - return; - entity.xo = position.x; - entity.yo = position.y; - entity.zo = position.z; - } - - public void setRotation(float angle, boolean immediate) { - if (entity == null) - return; - rotation.setValue(angle); - if (!immediate) - return; - rotation.startWithValue(angle); - } - - public Vec3 getPositionOffset() { - return entity != null ? entity.position() : Vec3.ZERO; - } - - public Vec3 getRotation() { - return new Vec3(0, rotation.getValue(), 0); - } - - @Override - protected void renderLast(PonderWorld world, MultiBufferSource buffer, PoseStack ms, float fade, float pt) { - EntityRenderDispatcher entityrenderermanager = Minecraft.getInstance() - .getEntityRenderDispatcher(); - if (entity == null) - entity = constructor.create(world, 0, 0, 0); - - ms.pushPose(); - ms.translate(location.x, location.y, location.z); - ms.translate(Mth.lerp(pt, entity.xo, entity.getX()), - Mth.lerp(pt, entity.yo, entity.getY()), Mth.lerp(pt, entity.zo, entity.getZ())); - - TransformStack.cast(ms) - .rotateY(rotation.getValue(pt)); - - entityrenderermanager.render(entity, 0, 0, 0, 0, pt, ms, buffer, lightCoordsFromFade(fade)); - ms.popPose(); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/element/OutlinerElement.java b/src/main/java/com/simibubi/create/foundation/ponder/element/OutlinerElement.java deleted file mode 100644 index 8943974741..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/element/OutlinerElement.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.simibubi.create.foundation.ponder.element; - -import java.util.function.Function; - -import com.simibubi.create.foundation.ponder.PonderScene; -import com.simibubi.create.foundation.utility.outliner.Outline.OutlineParams; -import com.simibubi.create.foundation.utility.outliner.Outliner; - -public class OutlinerElement extends AnimatedSceneElement { - - private Function outlinerCall; - private int overrideColor; - - public OutlinerElement(Function outlinerCall) { - this.outlinerCall = outlinerCall; - this.overrideColor = -1; - } - - @Override - public void tick(PonderScene scene) { - super.tick(scene); - if (fade.getValue() < 1/16f) - return; - if (fade.getValue(0) > fade.getValue(1)) - return; - OutlineParams params = outlinerCall.apply(scene.getOutliner()); - if (overrideColor != -1) - params.colored(overrideColor); - } - - public void setColor(int overrideColor) { - this.overrideColor = overrideColor; - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/element/ParrotElement.java b/src/main/java/com/simibubi/create/foundation/ponder/element/ParrotElement.java deleted file mode 100644 index 0c4c8fe7a2..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/element/ParrotElement.java +++ /dev/null @@ -1,272 +0,0 @@ -package com.simibubi.create.foundation.ponder.element; - -import java.util.function.Supplier; - -import com.jozufozu.flywheel.util.transform.TransformStack; -import com.mojang.blaze3d.platform.Window; -import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.Create; -import com.simibubi.create.content.contraptions.base.KineticTileEntity; -import com.simibubi.create.foundation.ponder.PonderScene; -import com.simibubi.create.foundation.ponder.PonderWorld; -import com.simibubi.create.foundation.ponder.ui.PonderUI; -import com.simibubi.create.foundation.utility.AngleHelper; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.entity.EntityRenderDispatcher; -import net.minecraft.core.BlockPos; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.util.Mth; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.animal.Parrot; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.phys.Vec3; - -public class ParrotElement extends AnimatedSceneElement { - - private Vec3 location; - private Parrot entity; - private ParrotPose pose; - private boolean deferConductor = false; - private Supplier initialPose; - - public static ParrotElement create(Vec3 location, Supplier pose) { - return new ParrotElement(location, pose); - } - - protected ParrotElement(Vec3 location, Supplier pose) { - this.location = location; - initialPose = pose; - setPose(initialPose.get()); - } - - @Override - public void reset(PonderScene scene) { - super.reset(scene); - setPose(initialPose.get()); - entity.setPosRaw(0, 0, 0); - entity.xo = 0; - entity.yo = 0; - entity.zo = 0; - entity.xOld = 0; - entity.yOld = 0; - entity.zOld = 0; - entity.setXRot(entity.xRotO = 0); - entity.setYRot(entity.yRotO = 180); - entity.getPersistentData() - .remove("TrainHat"); - deferConductor = false; - } - - @Override - public void tick(PonderScene scene) { - super.tick(scene); - if (entity == null) { - entity = pose.create(scene.getWorld()); - entity.setYRot(entity.yRotO = 180); - if (deferConductor) - setConductor(deferConductor); - deferConductor = false; - } - - entity.tickCount++; - entity.yHeadRotO = entity.yHeadRot; - entity.oFlapSpeed = entity.flapSpeed; - entity.oFlap = entity.flap; - entity.setOnGround(true); - - entity.xo = entity.getX(); - entity.yo = entity.getY(); - entity.zo = entity.getZ(); - entity.yRotO = entity.getYRot(); - entity.xRotO = entity.getXRot(); - - pose.tick(scene, entity, location); - - entity.xOld = entity.getX(); - entity.yOld = entity.getY(); - entity.zOld = entity.getZ(); - } - - public void setPositionOffset(Vec3 position, boolean immediate) { - if (entity == null) - return; - entity.setPos(position.x, position.y, position.z); - if (!immediate) - return; - entity.xo = position.x; - entity.yo = position.y; - entity.zo = position.z; - } - - public void setRotation(Vec3 eulers, boolean immediate) { - if (entity == null) - return; - entity.setXRot((float) eulers.x); - entity.setYRot((float) eulers.y); - if (!immediate) - return; - entity.xRotO = entity.getXRot(); - entity.yRotO = entity.getYRot(); - } - - public void setConductor(boolean isConductor) { - if (entity == null) { - deferConductor = isConductor; - return; - } - CompoundTag data = entity.getPersistentData(); - if (isConductor) - data.putBoolean("TrainHat", true); - else - data.remove("TrainHat"); - } - - public Vec3 getPositionOffset() { - return entity != null ? entity.position() : Vec3.ZERO; - } - - public Vec3 getRotation() { - return entity != null ? new Vec3(entity.getXRot(), entity.getYRot(), 0) : Vec3.ZERO; - } - - @Override - protected void renderLast(PonderWorld world, MultiBufferSource buffer, PoseStack ms, float fade, float pt) { - EntityRenderDispatcher entityrenderermanager = Minecraft.getInstance() - .getEntityRenderDispatcher(); - - if (entity == null) { - entity = pose.create(world); - entity.setYRot(entity.yRotO = 180); - } - - ms.pushPose(); - ms.translate(location.x, location.y, location.z); - ms.translate(Mth.lerp(pt, entity.xo, entity.getX()), Mth.lerp(pt, entity.yo, entity.getY()), - Mth.lerp(pt, entity.zo, entity.getZ())); - - TransformStack.cast(ms) - .rotateY(AngleHelper.angleLerp(pt, entity.yRotO, entity.getYRot())); - - entityrenderermanager.render(entity, 0, 0, 0, 0, pt, ms, buffer, lightCoordsFromFade(fade)); - ms.popPose(); - } - - public void setPose(ParrotPose pose) { - this.pose = pose; - } - - public static abstract class ParrotPose { - - abstract void tick(PonderScene scene, Parrot entity, Vec3 location); - - Parrot create(PonderWorld world) { - Parrot entity = new Parrot(EntityType.PARROT, world); - int nextInt = Create.RANDOM.nextInt(5); - entity.setVariant(nextInt == 1 ? 0 : nextInt); // blue parrots are kinda hard to see - return entity; - } - - } - - public static class DancePose extends ParrotPose { - - @Override - Parrot create(PonderWorld world) { - Parrot entity = super.create(world); - entity.setRecordPlayingNearby(BlockPos.ZERO, true); - return entity; - } - - @Override - void tick(PonderScene scene, Parrot entity, Vec3 location) { - entity.yRotO = entity.getYRot(); - entity.setYRot(entity.getYRot() - 2); - } - - } - - public static class FlappyPose extends ParrotPose { - - @Override - void tick(PonderScene scene, Parrot entity, Vec3 location) { - double length = entity.position() - .subtract(entity.xOld, entity.yOld, entity.zOld) - .length(); - entity.setOnGround(false); - double phase = Math.min(length * 15, 8); - float f = (float) ((PonderUI.ponderTicks % 100) * phase); - entity.flapSpeed = Mth.sin(f) + 1; - if (length == 0) - entity.flapSpeed = 0; - } - - } - - public static class SpinOnComponentPose extends ParrotPose { - - private BlockPos componentPos; - - public SpinOnComponentPose(BlockPos componentPos) { - this.componentPos = componentPos; - } - - @Override - void tick(PonderScene scene, Parrot entity, Vec3 location) { - BlockEntity tileEntity = scene.getWorld() - .getBlockEntity(componentPos); - if (!(tileEntity instanceof KineticTileEntity)) - return; - float rpm = ((KineticTileEntity) tileEntity).getSpeed(); - entity.yRotO = entity.getYRot(); - entity.setYRot(entity.getYRot() + (rpm * .3f)); - } - - } - - public static abstract class FaceVecPose extends ParrotPose { - - @Override - void tick(PonderScene scene, Parrot entity, Vec3 location) { - Vec3 p_200602_2_ = getFacedVec(scene); - Vec3 Vector3d = location.add(entity.getEyePosition(0)); - double d0 = p_200602_2_.x - Vector3d.x; - double d1 = p_200602_2_.y - Vector3d.y; - double d2 = p_200602_2_.z - Vector3d.z; - double d3 = Mth.sqrt((float) (d0 * d0 + d2 * d2)); - float targetPitch = Mth.wrapDegrees((float) -(Mth.atan2(d1, d3) * (double) (180F / (float) Math.PI))); - float targetYaw = Mth.wrapDegrees((float) -(Mth.atan2(d2, d0) * (double) (180F / (float) Math.PI)) + 90); - - entity.setXRot(AngleHelper.angleLerp(.4f, entity.getXRot(), targetPitch)); - entity.setYRot(AngleHelper.angleLerp(.4f, entity.getYRot(), targetYaw)); - } - - protected abstract Vec3 getFacedVec(PonderScene scene); - - } - - public static class FacePointOfInterestPose extends FaceVecPose { - - @Override - protected Vec3 getFacedVec(PonderScene scene) { - return scene.getPointOfInterest(); - } - - } - - public static class FaceCursorPose extends FaceVecPose { - - @Override - protected Vec3 getFacedVec(PonderScene scene) { - Minecraft minecraft = Minecraft.getInstance(); - Window w = minecraft.getWindow(); - double mouseX = minecraft.mouseHandler.xpos() * w.getGuiScaledWidth() / w.getScreenWidth(); - double mouseY = minecraft.mouseHandler.ypos() * w.getGuiScaledHeight() / w.getScreenHeight(); - return scene.getTransform() - .screenToScene(mouseX, mouseY, 300, 0); - } - - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/element/PonderElement.java b/src/main/java/com/simibubi/create/foundation/ponder/element/PonderElement.java deleted file mode 100644 index f8f63dc09a..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/element/PonderElement.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.simibubi.create.foundation.ponder.element; - -import com.simibubi.create.foundation.ponder.PonderScene; - -public class PonderElement { - - boolean visible = true; - - public void whileSkipping(PonderScene scene) {} - - public void tick(PonderScene scene) {} - - public void reset(PonderScene scene) {} - - public boolean isVisible() { - return visible; - } - - public void setVisible(boolean visible) { - this.visible = visible; - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/element/PonderOverlayElement.java b/src/main/java/com/simibubi/create/foundation/ponder/element/PonderOverlayElement.java deleted file mode 100644 index 9808d3d18e..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/element/PonderOverlayElement.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.simibubi.create.foundation.ponder.element; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.foundation.ponder.PonderScene; -import com.simibubi.create.foundation.ponder.ui.PonderUI; - -public abstract class PonderOverlayElement extends PonderElement { - - public void tick(PonderScene scene) {} - - public abstract void render(PonderScene scene, PonderUI screen, PoseStack ms, float partialTicks); - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/element/PonderSceneElement.java b/src/main/java/com/simibubi/create/foundation/ponder/element/PonderSceneElement.java deleted file mode 100644 index b5f5211fa8..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/element/PonderSceneElement.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.simibubi.create.foundation.ponder.element; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.foundation.ponder.PonderWorld; - -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.RenderType; - -public abstract class PonderSceneElement extends PonderElement { - - public abstract void renderFirst(PonderWorld world, MultiBufferSource buffer, PoseStack ms, float pt); - - public abstract void renderLayer(PonderWorld world, MultiBufferSource buffer, RenderType type, PoseStack ms, float pt); - - public abstract void renderLast(PonderWorld world, MultiBufferSource buffer, PoseStack ms, float pt); - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/element/TextWindowElement.java b/src/main/java/com/simibubi/create/foundation/ponder/element/TextWindowElement.java deleted file mode 100644 index 6d792a8afd..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/element/TextWindowElement.java +++ /dev/null @@ -1,155 +0,0 @@ -package com.simibubi.create.foundation.ponder.element; - -import java.util.List; -import java.util.function.Supplier; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.math.Matrix4f; -import com.simibubi.create.foundation.gui.Theme; -import com.simibubi.create.foundation.gui.element.BoxElement; -import com.simibubi.create.foundation.ponder.PonderLocalization; -import com.simibubi.create.foundation.ponder.PonderPalette; -import com.simibubi.create.foundation.ponder.PonderScene; -import com.simibubi.create.foundation.ponder.ui.PonderUI; -import com.simibubi.create.foundation.utility.Color; - -import net.minecraft.network.chat.FormattedText; -import net.minecraft.network.chat.Style; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.Mth; -import net.minecraft.world.phys.Vec2; -import net.minecraft.world.phys.Vec3; -import net.minecraftforge.client.gui.GuiUtils; - -public class TextWindowElement extends AnimatedOverlayElement { - - Supplier textGetter = () -> "(?) No text was provided"; - String bakedText; - - // from 0 to 200 - int y; - - Vec3 vec; - - boolean nearScene = false; - int color = PonderPalette.WHITE.getColor(); - - public class Builder { - - private PonderScene scene; - - public Builder(PonderScene scene) { - this.scene = scene; - } - - public Builder colored(PonderPalette color) { - TextWindowElement.this.color = color.getColor(); - return this; - } - - public Builder pointAt(Vec3 vec) { - TextWindowElement.this.vec = vec; - return this; - } - - public Builder independent(int y) { - TextWindowElement.this.y = y; - return this; - } - - public Builder independent() { - return independent(0); - } - - public Builder text(String defaultText) { - textGetter = scene.registerText(defaultText); - return this; - } - - public Builder sharedText(ResourceLocation key) { - textGetter = () -> PonderLocalization.getShared(key); - return this; - } - - public Builder sharedText(String key) { - return sharedText(new ResourceLocation(scene.getNamespace(), key)); - } - - public Builder placeNearTarget() { - TextWindowElement.this.nearScene = true; - return this; - } - - public Builder attachKeyFrame() { - scene.builder() - .addLazyKeyframe(); - return this; - } - - } - - @Override - protected void render(PonderScene scene, PonderUI screen, PoseStack ms, float partialTicks, float fade) { - if (bakedText == null) - bakedText = textGetter.get(); - if (fade < 1 / 16f) - return; - Vec2 sceneToScreen = vec != null ? scene.getTransform() - .sceneToScreen(vec, partialTicks) : new Vec2(screen.width / 2, (screen.height - 200) / 2 + y - 8); - - float yDiff = (screen.height / 2f - sceneToScreen.y - 10) / 100f; - int targetX = (int) (screen.width * Mth.lerp(yDiff * yDiff, 6f / 8, 5f / 8)); - - if (nearScene) - targetX = (int) Math.min(targetX, sceneToScreen.x + 50); - - int textWidth = Math.min(screen.width - targetX, 180); - - List lines = screen.getFontRenderer().getSplitter().splitLines(bakedText, textWidth, Style.EMPTY); - - int boxWidth = 0; - for (FormattedText line : lines) - boxWidth = Math.max(boxWidth, screen.getFontRenderer().width(line)); - - int boxHeight = screen.getFontRenderer() - .wordWrapHeight(bakedText, boxWidth); - - ms.pushPose(); - ms.translate(0, sceneToScreen.y, 400); - - new BoxElement() - .withBackground(Theme.c(Theme.Key.PONDER_BACKGROUND_FLAT)) - .gradientBorder(Theme.p(Theme.Key.TEXT_WINDOW_BORDER)) - .at(targetX - 10, 3, 100) - .withBounds(boxWidth, boxHeight - 1) - .render(ms); - - //PonderUI.renderBox(ms, targetX - 10, 3, boxWidth, boxHeight - 1, 0xaa000000, 0x30eebb00, 0x10eebb00); - - int brighterColor = Color.mixColors(color, 0xFFffffdd, 1 / 2f); - brighterColor = (0x00ffffff & brighterColor) | 0xff000000; - if (vec != null) { - ms.pushPose(); - ms.translate(sceneToScreen.x, 0, 0); - double lineTarget = (targetX - sceneToScreen.x) * fade; - ms.scale((float) lineTarget, 1, 1); - Matrix4f model = ms.last().pose(); - GuiUtils.drawGradientRect(model, -100, 0, 0, 1, 1, brighterColor, brighterColor); - GuiUtils.drawGradientRect(model, -100, 0, 1, 1, 2, 0xFF494949, 0xFF393939); - ms.popPose(); - } - - ms.translate(0, 0, 400); - for (int i = 0; i < lines.size(); i++) { - screen.getFontRenderer() - .draw(ms, lines.get(i) - .getString(), targetX - 10, 3 + 9 * i, new Color(brighterColor).scaleAlpha(fade).getRGB()); - } - ms.popPose(); - } - - public int getColor() { - return color; - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/element/TrackedElement.java b/src/main/java/com/simibubi/create/foundation/ponder/element/TrackedElement.java deleted file mode 100644 index bcf5fa7769..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/element/TrackedElement.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.simibubi.create.foundation.ponder.element; - -import java.lang.ref.WeakReference; -import java.util.function.Consumer; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.foundation.ponder.PonderWorld; - -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.RenderType; - -public abstract class TrackedElement extends PonderSceneElement { - - private WeakReference reference; - - public TrackedElement(T wrapped) { - this.reference = new WeakReference<>(wrapped); - } - - public void ifPresent(Consumer func) { - if (reference == null) - return; - T resolved = reference.get(); - if (resolved == null) - return; - func.accept(resolved); - } - - protected boolean isStillValid(T element) { - return true; - } - - @Override - public void renderFirst(PonderWorld world, MultiBufferSource buffer, PoseStack ms, float pt) {} - - @Override - public void renderLayer(PonderWorld world, MultiBufferSource buffer, RenderType type, PoseStack ms, float pt) {} - - @Override - public void renderLast(PonderWorld world, MultiBufferSource buffer, PoseStack ms, float pt) {} - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/element/WorldSectionElement.java b/src/main/java/com/simibubi/create/foundation/ponder/element/WorldSectionElement.java deleted file mode 100644 index ad25496309..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/element/WorldSectionElement.java +++ /dev/null @@ -1,462 +0,0 @@ -package com.simibubi.create.foundation.ponder.element; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Random; -import java.util.function.Consumer; - -import com.jozufozu.flywheel.core.model.ModelUtil; -import com.jozufozu.flywheel.core.model.ShadeSeparatedBufferBuilder; -import com.jozufozu.flywheel.core.model.ShadeSeparatingVertexConsumer; -import com.jozufozu.flywheel.util.transform.TransformStack; -import com.mojang.blaze3d.vertex.BufferBuilder; -import com.mojang.blaze3d.vertex.DefaultVertexFormat; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.SheetedDecalTextureGenerator; -import com.mojang.blaze3d.vertex.VertexConsumer; -import com.mojang.blaze3d.vertex.VertexFormat; -import com.simibubi.create.CreateClient; -import com.simibubi.create.foundation.ponder.PonderScene; -import com.simibubi.create.foundation.ponder.PonderWorld; -import com.simibubi.create.foundation.ponder.Selection; -import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.render.SuperByteBufferCache; -import com.simibubi.create.foundation.render.SuperRenderTypeBuffer; -import com.simibubi.create.foundation.render.TileEntityRenderHelper; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.Pair; -import com.simibubi.create.foundation.utility.VecHelper; -import com.simibubi.create.foundation.utility.outliner.AABBOutline; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.ItemBlockRenderTypes; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.block.BlockRenderDispatcher; -import net.minecraft.client.renderer.block.ModelBlockRenderer; -import net.minecraft.client.resources.model.ModelBakery; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction.Axis; -import net.minecraft.util.Mth; -import net.minecraft.world.level.ClipContext; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.EntityBlock; -import net.minecraft.world.level.block.RenderShape; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.entity.BlockEntityTicker; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.material.FluidState; -import net.minecraft.world.phys.BlockHitResult; -import net.minecraft.world.phys.Vec3; -import net.minecraft.world.phys.shapes.CollisionContext; -import net.minecraft.world.phys.shapes.VoxelShape; -import net.minecraftforge.client.ForgeHooksClient; -import net.minecraftforge.client.model.data.EmptyModelData; - -public class WorldSectionElement extends AnimatedSceneElement { - - public static final SuperByteBufferCache.Compartment> DOC_WORLD_SECTION = - new SuperByteBufferCache.Compartment<>(); - - private static final ThreadLocal THREAD_LOCAL_OBJECTS = ThreadLocal.withInitial(ThreadLocalObjects::new); - - List renderedTileEntities; - List>> tickableTileEntities; - Selection section; - boolean redraw; - - Vec3 prevAnimatedOffset = Vec3.ZERO; - Vec3 animatedOffset = Vec3.ZERO; - Vec3 prevAnimatedRotation = Vec3.ZERO; - Vec3 animatedRotation = Vec3.ZERO; - Vec3 centerOfRotation = Vec3.ZERO; - Vec3 stabilizationAnchor = null; - - BlockPos selectedBlock; - - public WorldSectionElement() {} - - public WorldSectionElement(Selection section) { - this.section = section.copy(); - centerOfRotation = section.getCenter(); - } - - public void mergeOnto(WorldSectionElement other) { - setVisible(false); - if (other.isEmpty()) - other.set(section); - else - other.add(section); - } - - public void set(Selection selection) { - applyNewSelection(selection.copy()); - } - - public void add(Selection toAdd) { - applyNewSelection(this.section.add(toAdd)); - } - - public void erase(Selection toErase) { - applyNewSelection(this.section.substract(toErase)); - } - - private void applyNewSelection(Selection selection) { - this.section = selection; - queueRedraw(); - } - - public void setCenterOfRotation(Vec3 center) { - centerOfRotation = center; - } - - public void stabilizeRotation(Vec3 anchor) { - stabilizationAnchor = anchor; - } - - @Override - public void reset(PonderScene scene) { - super.reset(scene); - resetAnimatedTransform(); - resetSelectedBlock(); - } - - public void selectBlock(BlockPos pos) { - selectedBlock = pos; - } - - public void resetSelectedBlock() { - selectedBlock = null; - } - - public void resetAnimatedTransform() { - prevAnimatedOffset = Vec3.ZERO; - animatedOffset = Vec3.ZERO; - prevAnimatedRotation = Vec3.ZERO; - animatedRotation = Vec3.ZERO; - } - - public void queueRedraw() { - redraw = true; - } - - public boolean isEmpty() { - return section == null; - } - - public void setEmpty() { - section = null; - } - - public void setAnimatedRotation(Vec3 eulerAngles, boolean force) { - this.animatedRotation = eulerAngles; - if (force) - prevAnimatedRotation = animatedRotation; - } - - public Vec3 getAnimatedRotation() { - return animatedRotation; - } - - public void setAnimatedOffset(Vec3 offset, boolean force) { - this.animatedOffset = offset; - if (force) - prevAnimatedOffset = animatedOffset; - } - - public Vec3 getAnimatedOffset() { - return animatedOffset; - } - - @Override - public boolean isVisible() { - return super.isVisible() && !isEmpty(); - } - - class WorldSectionRayTraceResult { - Vec3 actualHitVec; - BlockPos worldPos; - } - - public Pair rayTrace(PonderWorld world, Vec3 source, Vec3 target) { - world.setMask(this.section); - Vec3 transformedTarget = reverseTransformVec(target); - BlockHitResult rayTraceBlocks = world.clip(new ClipContext(reverseTransformVec(source), transformedTarget, - ClipContext.Block.OUTLINE, ClipContext.Fluid.NONE, null)); - world.clearMask(); - - if (rayTraceBlocks == null) - return null; - if (rayTraceBlocks.getLocation() == null) - return null; - - double t = rayTraceBlocks.getLocation() - .subtract(transformedTarget) - .lengthSqr() - / source.subtract(target) - .lengthSqr(); - Vec3 actualHit = VecHelper.lerp((float) t, target, source); - return Pair.of(actualHit, rayTraceBlocks.getBlockPos()); - } - - private Vec3 reverseTransformVec(Vec3 in) { - float pt = AnimationTickHolder.getPartialTicks(); - in = in.subtract(VecHelper.lerp(pt, prevAnimatedOffset, animatedOffset)); - if (!animatedRotation.equals(Vec3.ZERO) || !prevAnimatedRotation.equals(Vec3.ZERO)) { - if (centerOfRotation == null) - centerOfRotation = section.getCenter(); - double rotX = Mth.lerp(pt, prevAnimatedRotation.x, animatedRotation.x); - double rotZ = Mth.lerp(pt, prevAnimatedRotation.z, animatedRotation.z); - double rotY = Mth.lerp(pt, prevAnimatedRotation.y, animatedRotation.y); - in = in.subtract(centerOfRotation); - in = VecHelper.rotate(in, -rotX, Axis.X); - in = VecHelper.rotate(in, -rotZ, Axis.Z); - in = VecHelper.rotate(in, -rotY, Axis.Y); - in = in.add(centerOfRotation); - if (stabilizationAnchor != null) { - in = in.subtract(stabilizationAnchor); - in = VecHelper.rotate(in, rotX, Axis.X); - in = VecHelper.rotate(in, rotZ, Axis.Z); - in = VecHelper.rotate(in, rotY, Axis.Y); - in = in.add(stabilizationAnchor); - } - } - return in; - } - - public void transformMS(PoseStack ms, float pt) { - TransformStack.cast(ms) - .translate(VecHelper.lerp(pt, prevAnimatedOffset, animatedOffset)); - if (!animatedRotation.equals(Vec3.ZERO) || !prevAnimatedRotation.equals(Vec3.ZERO)) { - if (centerOfRotation == null) - centerOfRotation = section.getCenter(); - double rotX = Mth.lerp(pt, prevAnimatedRotation.x, animatedRotation.x); - double rotZ = Mth.lerp(pt, prevAnimatedRotation.z, animatedRotation.z); - double rotY = Mth.lerp(pt, prevAnimatedRotation.y, animatedRotation.y); - TransformStack.cast(ms) - .translate(centerOfRotation) - .rotateX(rotX) - .rotateZ(rotZ) - .rotateY(rotY) - .translateBack(centerOfRotation); - if (stabilizationAnchor != null) { - TransformStack.cast(ms) - .translate(stabilizationAnchor) - .rotateX(-rotX) - .rotateZ(-rotZ) - .rotateY(-rotY) - .translateBack(stabilizationAnchor); - } - } - } - - public void tick(PonderScene scene) { - prevAnimatedOffset = animatedOffset; - prevAnimatedRotation = animatedRotation; - if (!isVisible()) - return; - loadTEsIfMissing(scene.getWorld()); - renderedTileEntities.removeIf(te -> scene.getWorld() - .getBlockEntity(te.getBlockPos()) != te); - tickableTileEntities.removeIf(te -> scene.getWorld() - .getBlockEntity(te.getFirst() - .getBlockPos()) != te.getFirst()); - tickableTileEntities.forEach(te -> te.getSecond() - .accept(scene.getWorld())); - } - - @Override - public void whileSkipping(PonderScene scene) { - if (redraw) { - renderedTileEntities = null; - tickableTileEntities = null; - } - redraw = false; - } - - protected void loadTEsIfMissing(PonderWorld world) { - if (renderedTileEntities != null) - return; - tickableTileEntities = new ArrayList<>(); - renderedTileEntities = new ArrayList<>(); - section.forEach(pos -> { - BlockEntity tileEntity = world.getBlockEntity(pos); - BlockState blockState = world.getBlockState(pos); - Block block = blockState.getBlock(); - if (tileEntity == null) - return; - if (!(block instanceof EntityBlock)) - return; - tileEntity.setBlockState(world.getBlockState(pos)); - BlockEntityTicker ticker = ((EntityBlock) block).getTicker(world, blockState, tileEntity.getType()); - if (ticker != null) - addTicker(tileEntity, ticker); - renderedTileEntities.add(tileEntity); - }); - } - - @SuppressWarnings("unchecked") - private void addTicker(T tileEntity, BlockEntityTicker ticker) { - tickableTileEntities.add(Pair.of(tileEntity, w -> ((BlockEntityTicker) ticker).tick(w, - tileEntity.getBlockPos(), tileEntity.getBlockState(), tileEntity))); - } - - @Override - public void renderFirst(PonderWorld world, MultiBufferSource buffer, PoseStack ms, float fade, float pt) { - int light = -1; - if (fade != 1) - light = (int) (Mth.lerp(fade, 5, 14)); - if (redraw) { - renderedTileEntities = null; - tickableTileEntities = null; - } - - ms.pushPose(); - transformMS(ms, pt); - world.pushFakeLight(light); - renderTileEntities(world, ms, buffer, pt); - world.popLight(); - - Map blockBreakingProgressions = world.getBlockBreakingProgressions(); - PoseStack overlayMS = null; - - for (Entry entry : blockBreakingProgressions.entrySet()) { - BlockPos pos = entry.getKey(); - if (!section.test(pos)) - continue; - if (overlayMS == null) { - overlayMS = new PoseStack(); - world.scene.getTransform() - .apply(overlayMS, pt, true); - transformMS(overlayMS, pt); - } - - ms.pushPose(); - ms.translate(pos.getX(), pos.getY(), pos.getZ()); - VertexConsumer builder = new SheetedDecalTextureGenerator( - buffer.getBuffer(ModelBakery.DESTROY_TYPES.get(entry.getValue())), overlayMS.last() - .pose(), - overlayMS.last() - .normal()); - ModelUtil.VANILLA_RENDERER - .renderBatched(world.getBlockState(pos), pos, world, ms, builder, true, new Random(), - EmptyModelData.INSTANCE); - ms.popPose(); - } - - ms.popPose(); - } - - @Override - protected void renderLayer(PonderWorld world, MultiBufferSource buffer, RenderType type, PoseStack ms, float fade, - float pt) { - SuperByteBufferCache bufferCache = CreateClient.BUFFER_CACHE; - - int code = hashCode() ^ world.hashCode(); - Pair key = Pair.of(code, RenderType.chunkBufferLayers() - .indexOf(type)); - - if (redraw) - bufferCache.invalidate(DOC_WORLD_SECTION, key); - SuperByteBuffer contraptionBuffer = - bufferCache.get(DOC_WORLD_SECTION, key, () -> buildStructureBuffer(world, type)); - if (contraptionBuffer.isEmpty()) - return; - - transformMS(contraptionBuffer.getTransforms(), pt); - int light = lightCoordsFromFade(fade); - contraptionBuffer - .light(light) - .renderInto(ms, buffer.getBuffer(type)); - } - - @Override - protected void renderLast(PonderWorld world, MultiBufferSource buffer, PoseStack ms, float fade, float pt) { - redraw = false; - if (selectedBlock == null) - return; - BlockState blockState = world.getBlockState(selectedBlock); - if (blockState.isAir()) - return; - VoxelShape shape = - blockState.getShape(world, selectedBlock, CollisionContext.of(Minecraft.getInstance().player)); - if (shape.isEmpty()) - return; - - ms.pushPose(); - transformMS(ms, pt); - ms.translate(selectedBlock.getX(), selectedBlock.getY(), selectedBlock.getZ()); - - AABBOutline aabbOutline = new AABBOutline(shape.bounds()); - aabbOutline.getParams() - .lineWidth(1 / 64f) - .colored(0xefefef) - .disableNormals(); - aabbOutline.render(ms, (SuperRenderTypeBuffer) buffer, pt); - - ms.popPose(); - } - - private void renderTileEntities(PonderWorld world, PoseStack ms, MultiBufferSource buffer, float pt) { - loadTEsIfMissing(world); - TileEntityRenderHelper.renderTileEntities(world, renderedTileEntities, ms, buffer, pt); - } - - private SuperByteBuffer buildStructureBuffer(PonderWorld world, RenderType layer) { - BlockRenderDispatcher dispatcher = ModelUtil.VANILLA_RENDERER; - ThreadLocalObjects objects = THREAD_LOCAL_OBJECTS.get(); - - PoseStack poseStack = objects.poseStack; - Random random = objects.random; - ShadeSeparatingVertexConsumer shadeSeparatingWrapper = objects.shadeSeparatingWrapper; - ShadeSeparatedBufferBuilder builder = new ShadeSeparatedBufferBuilder(512); - BufferBuilder unshadedBuilder = objects.unshadedBuilder; - - builder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.BLOCK); - unshadedBuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.BLOCK); - shadeSeparatingWrapper.prepare(builder, unshadedBuilder); - - world.setMask(this.section); - ForgeHooksClient.setRenderType(layer); - ModelBlockRenderer.enableCaching(); - section.forEach(pos -> { - BlockState state = world.getBlockState(pos); - FluidState fluidState = world.getFluidState(pos); - - poseStack.pushPose(); - poseStack.translate(pos.getX(), pos.getY(), pos.getZ()); - - if (state.getRenderShape() == RenderShape.MODEL && ItemBlockRenderTypes.canRenderInLayer(state, layer)) { - BlockEntity tileEntity = world.getBlockEntity(pos); - dispatcher.renderBatched(state, pos, world, poseStack, shadeSeparatingWrapper, true, random, - tileEntity != null ? tileEntity.getModelData() : EmptyModelData.INSTANCE); - } - - if (!fluidState.isEmpty() && ItemBlockRenderTypes.canRenderInLayer(fluidState, layer)) - dispatcher.renderLiquid(pos, world, builder, state, fluidState); - - poseStack.popPose(); - }); - ModelBlockRenderer.clearCache(); - ForgeHooksClient.setRenderType(null); - world.clearMask(); - - shadeSeparatingWrapper.clear(); - unshadedBuilder.end(); - builder.appendUnshadedVertices(unshadedBuilder); - builder.end(); - - return new SuperByteBuffer(builder); - } - - private static class ThreadLocalObjects { - public final PoseStack poseStack = new PoseStack(); - public final Random random = new Random(); - public final ShadeSeparatingVertexConsumer shadeSeparatingWrapper = new ShadeSeparatingVertexConsumer(); - public final BufferBuilder unshadedBuilder = new BufferBuilder(512); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/element/package-info.java b/src/main/java/com/simibubi/create/foundation/ponder/element/package-info.java new file mode 100644 index 0000000000..d5ca466a54 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/element/package-info.java @@ -0,0 +1,9 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +@FieldsAreNonnullByDefault +package com.simibubi.create.foundation.ponder.element; + +import javax.annotation.ParametersAreNonnullByDefault; + +import net.minecraft.FieldsAreNonnullByDefault; +import net.minecraft.MethodsReturnNonnullByDefault; diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instruction/AnimateBogeyInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instruction/AnimateBogeyInstruction.java deleted file mode 100644 index 7ef25e721b..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/instruction/AnimateBogeyInstruction.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.simibubi.create.foundation.ponder.instruction; - -public class AnimateBogeyInstruction { - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instruction/AnimateElementInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instruction/AnimateElementInstruction.java deleted file mode 100644 index 9df7626310..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/instruction/AnimateElementInstruction.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.simibubi.create.foundation.ponder.instruction; - -import java.util.function.BiConsumer; -import java.util.function.Function; - -import com.simibubi.create.foundation.ponder.ElementLink; -import com.simibubi.create.foundation.ponder.PonderScene; -import com.simibubi.create.foundation.ponder.element.PonderSceneElement; - -import net.minecraft.world.phys.Vec3; - -public class AnimateElementInstruction extends TickingInstruction { - - protected Vec3 deltaPerTick; - protected Vec3 totalDelta; - protected Vec3 target; - protected ElementLink link; - protected T element; - - private BiConsumer setter; - private Function getter; - - protected AnimateElementInstruction(ElementLink link, Vec3 totalDelta, int ticks, - BiConsumer setter, Function getter) { - super(false, ticks); - this.link = link; - this.setter = setter; - this.getter = getter; - this.deltaPerTick = totalDelta.scale(1d / ticks); - this.totalDelta = totalDelta; - this.target = totalDelta; - } - - @Override - protected final void firstTick(PonderScene scene) { - super.firstTick(scene); - element = scene.resolve(link); - if (element == null) - return; - target = getter.apply(element) - .add(totalDelta); - } - - @Override - public void tick(PonderScene scene) { - super.tick(scene); - if (element == null) - return; - if (remainingTicks == 0) { - setter.accept(element, target); - setter.accept(element, target); - return; - } - setter.accept(element, getter.apply(element) - .add(deltaPerTick)); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instruction/AnimateMinecartInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instruction/AnimateMinecartInstruction.java deleted file mode 100644 index 3dc1df60a4..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/instruction/AnimateMinecartInstruction.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.simibubi.create.foundation.ponder.instruction; - -import java.util.function.BiConsumer; -import java.util.function.Function; - -import com.simibubi.create.foundation.ponder.ElementLink; -import com.simibubi.create.foundation.ponder.element.MinecartElement; - -import net.minecraft.world.phys.Vec3; - -public class AnimateMinecartInstruction extends AnimateElementInstruction { - - public static AnimateMinecartInstruction rotate(ElementLink link, float rotation, int ticks) { - return new AnimateMinecartInstruction(link, new Vec3(0, rotation, 0), ticks, - (wse, v) -> wse.setRotation((float) v.y, ticks == 0), MinecartElement::getRotation); - } - - public static AnimateMinecartInstruction move(ElementLink link, Vec3 offset, int ticks) { - return new AnimateMinecartInstruction(link, offset, ticks, (wse, v) -> wse.setPositionOffset(v, ticks == 0), - MinecartElement::getPositionOffset); - } - - protected AnimateMinecartInstruction(ElementLink link, Vec3 totalDelta, int ticks, - BiConsumer setter, Function getter) { - super(link, totalDelta, ticks, setter, getter); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instruction/AnimateParrotInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instruction/AnimateParrotInstruction.java deleted file mode 100644 index 27b86461e7..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/instruction/AnimateParrotInstruction.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.simibubi.create.foundation.ponder.instruction; - -import java.util.function.BiConsumer; -import java.util.function.Function; - -import com.simibubi.create.foundation.ponder.ElementLink; -import com.simibubi.create.foundation.ponder.element.ParrotElement; - -import net.minecraft.world.phys.Vec3; - -public class AnimateParrotInstruction extends AnimateElementInstruction { - - public static AnimateParrotInstruction rotate(ElementLink link, Vec3 rotation, int ticks) { - return new AnimateParrotInstruction(link, rotation, ticks, (wse, v) -> wse.setRotation(v, ticks == 0), - ParrotElement::getRotation); - } - - public static AnimateParrotInstruction move(ElementLink link, Vec3 offset, int ticks) { - return new AnimateParrotInstruction(link, offset, ticks, (wse, v) -> wse.setPositionOffset(v, ticks == 0), - ParrotElement::getPositionOffset); - } - - protected AnimateParrotInstruction(ElementLink link, Vec3 totalDelta, int ticks, - BiConsumer setter, Function getter) { - super(link, totalDelta, ticks, setter, getter); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instruction/AnimateTileEntityInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instruction/AnimateTileEntityInstruction.java index cd65b8a368..335a29e659 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instruction/AnimateTileEntityInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instruction/AnimateTileEntityInstruction.java @@ -8,9 +8,10 @@ import com.simibubi.create.content.contraptions.components.deployer.DeployerTile import com.simibubi.create.content.contraptions.components.structureMovement.bearing.IBearingTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.pulley.PulleyTileEntity; import com.simibubi.create.content.logistics.trains.track.StandardBogeyTileEntity; -import com.simibubi.create.foundation.ponder.PonderScene; -import com.simibubi.create.foundation.ponder.PonderWorld; +import net.createmod.ponder.foundation.PonderScene; +import net.createmod.ponder.foundation.PonderWorld; +import net.createmod.ponder.foundation.instruction.TickingInstruction; import net.minecraft.core.BlockPos; import net.minecraft.world.level.block.entity.BlockEntity; @@ -21,8 +22,8 @@ public class AnimateTileEntityInstruction extends TickingInstruction { protected double target; protected final BlockPos location; - private BiConsumer setter; - private Function getter; + private final BiConsumer setter; + private final Function getter; public static AnimateTileEntityInstruction bearing(BlockPos location, float totalDelta, int ticks) { return new AnimateTileEntityInstruction(location, totalDelta, ticks, diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instruction/AnimateWorldSectionInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instruction/AnimateWorldSectionInstruction.java deleted file mode 100644 index afb362a478..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/instruction/AnimateWorldSectionInstruction.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.simibubi.create.foundation.ponder.instruction; - -import java.util.function.BiConsumer; -import java.util.function.Function; - -import com.simibubi.create.foundation.ponder.ElementLink; -import com.simibubi.create.foundation.ponder.element.WorldSectionElement; - -import net.minecraft.world.phys.Vec3; - -public class AnimateWorldSectionInstruction extends AnimateElementInstruction { - - public static AnimateWorldSectionInstruction rotate(ElementLink link, Vec3 rotation, - int ticks) { - return new AnimateWorldSectionInstruction(link, rotation, ticks, - (wse, v) -> wse.setAnimatedRotation(v, ticks == 0), WorldSectionElement::getAnimatedRotation); - } - - public static AnimateWorldSectionInstruction move(ElementLink link, Vec3 offset, int ticks) { - return new AnimateWorldSectionInstruction(link, offset, ticks, (wse, v) -> wse.setAnimatedOffset(v, ticks == 0), - WorldSectionElement::getAnimatedOffset); - } - - protected AnimateWorldSectionInstruction(ElementLink link, Vec3 totalDelta, int ticks, - BiConsumer setter, Function getter) { - super(link, totalDelta, ticks, setter, getter); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instruction/ChaseAABBInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instruction/ChaseAABBInstruction.java deleted file mode 100644 index 9370df375f..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/instruction/ChaseAABBInstruction.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.simibubi.create.foundation.ponder.instruction; - -import com.simibubi.create.foundation.ponder.PonderPalette; -import com.simibubi.create.foundation.ponder.PonderScene; - -import net.minecraft.world.phys.AABB; - -public class ChaseAABBInstruction extends TickingInstruction { - - private AABB bb; - private Object slot; - private PonderPalette color; - - public ChaseAABBInstruction(PonderPalette color, Object slot, AABB bb, int ticks) { - super(false, ticks); - this.color = color; - this.slot = slot; - this.bb = bb; - } - - @Override - public void tick(PonderScene scene) { - super.tick(scene); - scene.getOutliner() - .chaseAABB(slot, bb) - .lineWidth(1 / 16f) - .colored(color.getColor()); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instruction/CreateMinecartInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instruction/CreateMinecartInstruction.java deleted file mode 100644 index efd187fe48..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/instruction/CreateMinecartInstruction.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.simibubi.create.foundation.ponder.instruction; - -import com.simibubi.create.foundation.ponder.element.MinecartElement; - -import net.minecraft.core.Direction; - -public class CreateMinecartInstruction extends FadeIntoSceneInstruction { - - public CreateMinecartInstruction(int fadeInTicks, Direction fadeInFrom, MinecartElement element) { - super(fadeInTicks, fadeInFrom, element); - } - - @Override - protected Class getElementClass() { - return MinecartElement.class; - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instruction/CreateParrotInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instruction/CreateParrotInstruction.java deleted file mode 100644 index 32ec9153b3..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/instruction/CreateParrotInstruction.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.simibubi.create.foundation.ponder.instruction; - -import com.simibubi.create.foundation.ponder.element.ParrotElement; - -import net.minecraft.core.Direction; - -public class CreateParrotInstruction extends FadeIntoSceneInstruction { - - public CreateParrotInstruction(int fadeInTicks, Direction fadeInFrom, ParrotElement element) { - super(fadeInTicks, fadeInFrom, element); - } - - @Override - protected Class getElementClass() { - return ParrotElement.class; - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instruction/DelayInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instruction/DelayInstruction.java deleted file mode 100644 index a112b8599a..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/instruction/DelayInstruction.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.simibubi.create.foundation.ponder.instruction; - -public class DelayInstruction extends TickingInstruction { - - public DelayInstruction(int ticks) { - super(true, ticks); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instruction/DisplayWorldSectionInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instruction/DisplayWorldSectionInstruction.java deleted file mode 100644 index b809239dec..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/instruction/DisplayWorldSectionInstruction.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.simibubi.create.foundation.ponder.instruction; - -import java.util.Optional; -import java.util.function.Supplier; - -import javax.annotation.Nullable; - -import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueItem; -import com.simibubi.create.foundation.ponder.PonderScene; -import com.simibubi.create.foundation.ponder.Selection; -import com.simibubi.create.foundation.ponder.element.WorldSectionElement; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; - -public class DisplayWorldSectionInstruction extends FadeIntoSceneInstruction { - - private Selection initialSelection; - private Optional> mergeOnto; - private BlockPos glue; - - public DisplayWorldSectionInstruction(int fadeInTicks, Direction fadeInFrom, Selection selection, - Optional> mergeOnto) { - this(fadeInTicks, fadeInFrom, selection, mergeOnto, null); - } - - public DisplayWorldSectionInstruction(int fadeInTicks, Direction fadeInFrom, Selection selection, - Optional> mergeOnto, @Nullable BlockPos glue) { - super(fadeInTicks, fadeInFrom, new WorldSectionElement(selection)); - initialSelection = selection; - this.mergeOnto = mergeOnto; - this.glue = glue; - } - - @Override - protected void firstTick(PonderScene scene) { - super.firstTick(scene); - mergeOnto.ifPresent(wse -> element.setAnimatedOffset(wse.get() - .getAnimatedOffset(), true)); - element.set(initialSelection); - element.setVisible(true); - } - - @Override - public void tick(PonderScene scene) { - super.tick(scene); - if (remainingTicks > 0) - return; - mergeOnto.ifPresent(c -> element.mergeOnto(c.get())); - if (glue != null) - SuperGlueItem.spawnParticles(scene.getWorld(), glue, fadeInFrom, true); - } - - @Override - protected Class getElementClass() { - return WorldSectionElement.class; - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instruction/EmitParticlesInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instruction/EmitParticlesInstruction.java deleted file mode 100644 index 6c19f81e09..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/instruction/EmitParticlesInstruction.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.simibubi.create.foundation.ponder.instruction; - -import com.simibubi.create.Create; -import com.simibubi.create.foundation.ponder.PonderScene; -import com.simibubi.create.foundation.ponder.PonderWorld; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.particle.ParticleEngine; -import net.minecraft.core.particles.ParticleOptions; -import net.minecraft.world.phys.Vec3; - -public class EmitParticlesInstruction extends TickingInstruction { - - private Vec3 anchor; - private Emitter emitter; - private float runsPerTick; - - @FunctionalInterface - public static interface Emitter { - - public static Emitter simple(T data, Vec3 motion) { - return (w, x, y, z) -> w.addParticle(data, x, y, z, motion.x, motion.y, motion.z); - } - - public static Emitter withinBlockSpace(T data, Vec3 motion) { - return (w, x, y, z) -> w.addParticle(data, Math.floor(x) + Create.RANDOM.nextFloat(), - Math.floor(y) + Create.RANDOM.nextFloat(), Math.floor(z) + Create.RANDOM.nextFloat(), motion.x, - motion.y, motion.z); - } - - static ParticleEngine paticleManager() { - return Minecraft.getInstance().particleEngine; - } - - public void create(PonderWorld world, double x, double y, double z); - - } - - public EmitParticlesInstruction(Vec3 anchor, Emitter emitter, float runsPerTick, int ticks) { - super(false, ticks); - this.anchor = anchor; - this.emitter = emitter; - this.runsPerTick = runsPerTick; - } - - @Override - public void tick(PonderScene scene) { - super.tick(scene); - int runs = (int) runsPerTick; - if (Create.RANDOM.nextFloat() < (runsPerTick - runs)) - runs++; - for (int i = 0; i < runs; i++) - emitter.create(scene.getWorld(), anchor.x, anchor.y, anchor.z); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instruction/FadeInOutInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instruction/FadeInOutInstruction.java deleted file mode 100644 index 6860d2565a..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/instruction/FadeInOutInstruction.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.simibubi.create.foundation.ponder.instruction; - -import com.simibubi.create.foundation.ponder.PonderScene; - -public abstract class FadeInOutInstruction extends TickingInstruction { - - protected static final int fadeTime = 5; - - public FadeInOutInstruction(int duration) { - super(false, duration + 2 * fadeTime); - } - - protected abstract void show(PonderScene scene); - - protected abstract void hide(PonderScene scene); - - protected abstract void applyFade(PonderScene scene, float fade); - - @Override - protected void firstTick(PonderScene scene) { - super.firstTick(scene); - show(scene); - applyFade(scene, 0); - } - - @Override - public void tick(PonderScene scene) { - super.tick(scene); - int elapsed = totalTicks - remainingTicks; - - if (elapsed < fadeTime) { - float fade = (elapsed / (float) fadeTime); - applyFade(scene, fade * fade); - - } else if (remainingTicks < fadeTime) { - float fade = (remainingTicks / (float) fadeTime); - applyFade(scene, fade * fade); - - } else - applyFade(scene, 1); - - if (remainingTicks == 0) { - applyFade(scene, 0); - hide(scene); - } - - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instruction/FadeIntoSceneInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instruction/FadeIntoSceneInstruction.java deleted file mode 100644 index 267345998f..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/instruction/FadeIntoSceneInstruction.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.simibubi.create.foundation.ponder.instruction; - -import com.simibubi.create.foundation.ponder.ElementLink; -import com.simibubi.create.foundation.ponder.PonderScene; -import com.simibubi.create.foundation.ponder.element.AnimatedSceneElement; - -import net.minecraft.core.Direction; -import net.minecraft.world.phys.Vec3; - -public abstract class FadeIntoSceneInstruction extends TickingInstruction { - - protected Direction fadeInFrom; - protected T element; - private ElementLink elementLink; - - public FadeIntoSceneInstruction(int fadeInTicks, Direction fadeInFrom, T element) { - super(false, fadeInTicks); - this.fadeInFrom = fadeInFrom; - this.element = element; - } - - @Override - protected void firstTick(PonderScene scene) { - super.firstTick(scene); - scene.addElement(element); - element.setVisible(true); - element.setFade(0); - element.setFadeVec(fadeInFrom == null ? Vec3.ZERO - : Vec3.atLowerCornerOf(fadeInFrom.getNormal()) - .scale(.5f)); - if (elementLink != null) - scene.linkElement(element, elementLink); - } - - @Override - public void tick(PonderScene scene) { - super.tick(scene); - float fade = totalTicks == 0 ? 1 : (remainingTicks / (float) totalTicks); - element.setFade(1 - fade * fade); - if (remainingTicks == 0) { - if (totalTicks == 0) - element.setFade(1); - element.setFade(1); - } - } - - public ElementLink createLink(PonderScene scene) { - elementLink = new ElementLink<>(getElementClass()); - scene.linkElement(element, elementLink); - return elementLink; - } - - protected abstract Class getElementClass(); - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instruction/FadeOutOfSceneInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instruction/FadeOutOfSceneInstruction.java deleted file mode 100644 index fdd2589f0d..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/instruction/FadeOutOfSceneInstruction.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.simibubi.create.foundation.ponder.instruction; - -import com.simibubi.create.foundation.ponder.ElementLink; -import com.simibubi.create.foundation.ponder.PonderScene; -import com.simibubi.create.foundation.ponder.element.AnimatedSceneElement; - -import net.minecraft.core.Direction; -import net.minecraft.world.phys.Vec3; - -public class FadeOutOfSceneInstruction extends TickingInstruction { - - private Direction fadeOutTo; - private ElementLink link; - private T element; - - public FadeOutOfSceneInstruction(int fadeOutTicks, Direction fadeOutTo, ElementLink link) { - super(false, fadeOutTicks); - this.fadeOutTo = fadeOutTo == null ? null : fadeOutTo.getOpposite(); - this.link = link; - } - - @Override - protected void firstTick(PonderScene scene) { - super.firstTick(scene); - element = scene.resolve(link); - if (element == null) - return; - element.setVisible(true); - element.setFade(1); - element.setFadeVec(fadeOutTo == null ? Vec3.ZERO - : Vec3.atLowerCornerOf(fadeOutTo.getNormal()) - .scale(.5f)); - } - - @Override - public void tick(PonderScene scene) { - super.tick(scene); - if (element == null) - return; - float fade = (remainingTicks / (float) totalTicks); - element.setFade(1 - (1 - fade) * (1 - fade)); - if (remainingTicks == 0) { - element.setVisible(false); - element.setFade(0); - } - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instruction/HideAllInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instruction/HideAllInstruction.java deleted file mode 100644 index 89ea2a8fbd..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/instruction/HideAllInstruction.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.simibubi.create.foundation.ponder.instruction; - -import com.simibubi.create.foundation.ponder.PonderScene; -import com.simibubi.create.foundation.ponder.element.AnimatedOverlayElement; -import com.simibubi.create.foundation.ponder.element.AnimatedSceneElement; - -import net.minecraft.core.Direction; -import net.minecraft.world.phys.Vec3; - -public class HideAllInstruction extends TickingInstruction { - - private Direction fadeOutTo; - - public HideAllInstruction(int fadeOutTicks, Direction fadeOutTo) { - super(false, fadeOutTicks); - this.fadeOutTo = fadeOutTo; - } - - @Override - protected void firstTick(PonderScene scene) { - super.firstTick(scene); - scene.getElements() - .forEach(element -> { - if (element instanceof AnimatedSceneElement) { - AnimatedSceneElement animatedSceneElement = (AnimatedSceneElement) element; - animatedSceneElement.setFade(1); - animatedSceneElement - .setFadeVec(fadeOutTo == null ? null : Vec3.atLowerCornerOf(fadeOutTo.getNormal()).scale(.5f)); - } else if (element instanceof AnimatedOverlayElement) { - AnimatedOverlayElement animatedSceneElement = (AnimatedOverlayElement) element; - animatedSceneElement.setFade(1); - } else - element.setVisible(false); - }); - } - - @Override - public void tick(PonderScene scene) { - super.tick(scene); - float fade = (remainingTicks / (float) totalTicks); - - scene.forEach(AnimatedSceneElement.class, ase -> { - ase.setFade(fade * fade); - if (remainingTicks == 0) - ase.setFade(0); - }); - - scene.forEach(AnimatedOverlayElement.class, aoe -> { - aoe.setFade(fade * fade); - if (remainingTicks == 0) - aoe.setFade(0); - }); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instruction/HighlightValueBoxInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instruction/HighlightValueBoxInstruction.java deleted file mode 100644 index 0af8b6ad72..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/instruction/HighlightValueBoxInstruction.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.simibubi.create.foundation.ponder.instruction; - -import com.simibubi.create.foundation.ponder.PonderPalette; -import com.simibubi.create.foundation.ponder.PonderScene; - -import net.minecraft.world.phys.AABB; -import net.minecraft.world.phys.Vec3; - -public class HighlightValueBoxInstruction extends TickingInstruction { - - private Vec3 vec; - private Vec3 expands; - - public HighlightValueBoxInstruction(Vec3 vec, Vec3 expands, int duration) { - super(false, duration); - this.vec = vec; - this.expands = expands; - } - - @Override - public void tick(PonderScene scene) { - super.tick(scene); - AABB point = new AABB(vec, vec); - AABB expanded = point.inflate(expands.x, expands.y, expands.z); - scene.getOutliner() - .chaseAABB(vec, remainingTicks == totalTicks ? point : expanded) - .lineWidth(1 / 32f) - .colored(PonderPalette.WHITE.getColor()); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instruction/KeyframeInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instruction/KeyframeInstruction.java deleted file mode 100644 index 765e5efe12..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/instruction/KeyframeInstruction.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.simibubi.create.foundation.ponder.instruction; - -import com.simibubi.create.foundation.ponder.PonderScene; - -public class KeyframeInstruction extends PonderInstruction { - - public static final KeyframeInstruction IMMEDIATE = new KeyframeInstruction(false); - public static final KeyframeInstruction DELAYED = new KeyframeInstruction(true); - - private boolean delayed; - - private KeyframeInstruction(boolean delayed) { - this.delayed = delayed; - } - - @Override - public boolean isComplete() { - return true; - } - - @Override - public void tick(PonderScene scene) { } - - @Override - public void onScheduled(PonderScene scene) { - scene.markKeyframe(delayed ? 6 : 0); - } -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instruction/LineInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instruction/LineInstruction.java deleted file mode 100644 index 92b2cc2581..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/instruction/LineInstruction.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.simibubi.create.foundation.ponder.instruction; - -import com.simibubi.create.foundation.ponder.PonderPalette; -import com.simibubi.create.foundation.ponder.PonderScene; - -import net.minecraft.world.phys.Vec3; - -public class LineInstruction extends TickingInstruction { - - private PonderPalette color; - private Vec3 start; - private Vec3 end; - private boolean big; - - public LineInstruction(PonderPalette color, Vec3 start, Vec3 end, int ticks, boolean big) { - super(false, ticks); - this.color = color; - this.start = start; - this.end = end; - this.big = big; - } - - @Override - public void tick(PonderScene scene) { - super.tick(scene); - scene.getOutliner() - .showLine(start, start, end) - .lineWidth(big ? 1 / 8f : 1 / 16f) - .colored(color.getColor()); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instruction/MarkAsFinishedInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instruction/MarkAsFinishedInstruction.java deleted file mode 100644 index 31d3a17c7d..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/instruction/MarkAsFinishedInstruction.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.simibubi.create.foundation.ponder.instruction; - -import com.simibubi.create.foundation.ponder.PonderScene; - -public class MarkAsFinishedInstruction extends PonderInstruction { - - @Override - public boolean isComplete() { - return true; - } - - @Override - public void tick(PonderScene scene) { - scene.setFinished(true); - } - - @Override - public void onScheduled(PonderScene scene) { - scene.stopCounting(); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instruction/MovePoiInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instruction/MovePoiInstruction.java deleted file mode 100644 index 4b43913418..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/instruction/MovePoiInstruction.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.simibubi.create.foundation.ponder.instruction; - -import com.simibubi.create.foundation.ponder.PonderScene; - -import net.minecraft.world.phys.Vec3; - -public class MovePoiInstruction extends PonderInstruction { - - private Vec3 poi; - - public MovePoiInstruction(Vec3 poi) { - this.poi = poi; - } - - @Override - public boolean isComplete() { - return true; - } - - @Override - public void tick(PonderScene scene) { - scene.setPointOfInterest(poi); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instruction/OutlineSelectionInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instruction/OutlineSelectionInstruction.java deleted file mode 100644 index 85510775ba..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/instruction/OutlineSelectionInstruction.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.simibubi.create.foundation.ponder.instruction; - -import com.simibubi.create.foundation.ponder.PonderPalette; -import com.simibubi.create.foundation.ponder.PonderScene; -import com.simibubi.create.foundation.ponder.Selection; - -public class OutlineSelectionInstruction extends TickingInstruction { - - private PonderPalette color; - private Object slot; - private Selection selection; - - public OutlineSelectionInstruction(PonderPalette color, Object slot, Selection selection, int ticks) { - super(false, ticks); - this.color = color; - this.slot = slot; - this.selection = selection; - } - - @Override - public void tick(PonderScene scene) { - super.tick(scene); - selection.makeOutline(scene.getOutliner(), slot) - .lineWidth(1 / 16f) - .colored(color.getColor()); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instruction/PonderInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instruction/PonderInstruction.java deleted file mode 100644 index 48bcb49b2b..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/instruction/PonderInstruction.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.simibubi.create.foundation.ponder.instruction; - -import java.util.function.Consumer; - -import com.simibubi.create.foundation.ponder.PonderScene; - -public abstract class PonderInstruction { - - public boolean isBlocking() { - return false; - } - - public void reset(PonderScene scene) {} - - public abstract boolean isComplete(); - - public void onScheduled(PonderScene scene) {} - - public abstract void tick(PonderScene scene); - - public static PonderInstruction simple(Consumer callback) { - return new Simple(callback); - } - - private static class Simple extends PonderInstruction { - - private Consumer callback; - - public Simple(Consumer callback) { - this.callback = callback; - } - - @Override - public boolean isComplete() { - return true; - } - - @Override - public void tick(PonderScene scene) { - callback.accept(scene); - } - - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instruction/ReplaceBlocksInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instruction/ReplaceBlocksInstruction.java deleted file mode 100644 index 219ad9bfde..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/instruction/ReplaceBlocksInstruction.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.simibubi.create.foundation.ponder.instruction; - -import java.util.function.UnaryOperator; - -import com.simibubi.create.foundation.ponder.PonderScene; -import com.simibubi.create.foundation.ponder.PonderWorld; -import com.simibubi.create.foundation.ponder.Selection; - -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.state.BlockState; - -public class ReplaceBlocksInstruction extends WorldModifyInstruction { - - private UnaryOperator stateToUse; - private boolean replaceAir; - private boolean spawnParticles; - - public ReplaceBlocksInstruction(Selection selection, UnaryOperator stateToUse, boolean replaceAir, - boolean spawnParticles) { - super(selection); - this.stateToUse = stateToUse; - this.replaceAir = replaceAir; - this.spawnParticles = spawnParticles; - } - - @Override - protected void runModification(Selection selection, PonderScene scene) { - PonderWorld world = scene.getWorld(); - selection.forEach(pos -> { - if (!world.getBounds() - .isInside(pos)) - return; - BlockState prevState = world.getBlockState(pos); - if (!replaceAir && prevState == Blocks.AIR.defaultBlockState()) - return; - if (spawnParticles) - world.addBlockDestroyEffects(pos, prevState); - world.setBlockAndUpdate(pos, stateToUse.apply(prevState)); - }); - } - - @Override - protected boolean needsRedraw() { - return true; - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instruction/RotateSceneInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instruction/RotateSceneInstruction.java deleted file mode 100644 index ade54ac015..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/instruction/RotateSceneInstruction.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.simibubi.create.foundation.ponder.instruction; - -import com.simibubi.create.foundation.ponder.PonderScene; -import com.simibubi.create.foundation.ponder.PonderScene.SceneTransform; -import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; - -public class RotateSceneInstruction extends PonderInstruction { - - private float xRot; - private float yRot; - private boolean relative; - - public RotateSceneInstruction(float xRot, float yRot, boolean relative) { - this.xRot = xRot; - this.yRot = yRot; - this.relative = relative; - } - - @Override - public boolean isComplete() { - return true; - } - - @Override - public void tick(PonderScene scene) { - SceneTransform transform = scene.getTransform(); - float targetX = relative ? transform.xRotation.getChaseTarget() + xRot : xRot; - float targetY = relative ? transform.yRotation.getChaseTarget() + yRot : yRot; - transform.xRotation.chase(targetX, .1f, Chaser.EXP); - transform.yRotation.chase(targetY, .1f, Chaser.EXP); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instruction/ShowInputInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instruction/ShowInputInstruction.java deleted file mode 100644 index b94ddbadda..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/instruction/ShowInputInstruction.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.simibubi.create.foundation.ponder.instruction; - -import com.simibubi.create.foundation.ponder.PonderScene; -import com.simibubi.create.foundation.ponder.element.InputWindowElement; - -public class ShowInputInstruction extends FadeInOutInstruction { - - private InputWindowElement element; - - public ShowInputInstruction(InputWindowElement element, int ticks) { - super(ticks); - this.element = element; - } - - @Override - protected void show(PonderScene scene) { - scene.addElement(element); - element.setVisible(true); - } - - @Override - protected void hide(PonderScene scene) { - element.setVisible(false); - } - - @Override - protected void applyFade(PonderScene scene, float fade) { - element.setFade(fade); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instruction/TextInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instruction/TextInstruction.java deleted file mode 100644 index 2b81b5805e..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/instruction/TextInstruction.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.simibubi.create.foundation.ponder.instruction; - -import com.simibubi.create.foundation.ponder.PonderScene; -import com.simibubi.create.foundation.ponder.Selection; -import com.simibubi.create.foundation.ponder.element.OutlinerElement; -import com.simibubi.create.foundation.ponder.element.TextWindowElement; - -public class TextInstruction extends FadeInOutInstruction { - - private TextWindowElement element; - private OutlinerElement outline; - - public TextInstruction(TextWindowElement element, int duration) { - super(duration); - this.element = element; - } - - public TextInstruction(TextWindowElement element, int duration, Selection selection) { - this(element, duration); - outline = new OutlinerElement(o -> selection.makeOutline(o) - .lineWidth(1 / 16f)); - } - - @Override - public void tick(PonderScene scene) { - super.tick(scene); - if (outline != null) - outline.setColor(element.getColor()); - } - - @Override - protected void show(PonderScene scene) { - scene.addElement(element); - element.setVisible(true); - if (outline != null) { - scene.addElement(outline); - outline.setFade(1); - outline.setVisible(true); - } - } - - @Override - protected void hide(PonderScene scene) { - element.setVisible(false); - if (outline != null) { - outline.setFade(0); - outline.setVisible(false); - } - } - - @Override - protected void applyFade(PonderScene scene, float fade) { - element.setFade(fade); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instruction/TickingInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instruction/TickingInstruction.java deleted file mode 100644 index fc5549b503..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/instruction/TickingInstruction.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.simibubi.create.foundation.ponder.instruction; - -import com.simibubi.create.foundation.ponder.PonderScene; - -public abstract class TickingInstruction extends PonderInstruction { - - private boolean blocking; - protected int totalTicks; - protected int remainingTicks; - - public TickingInstruction(boolean blocking, int ticks) { - this.blocking = blocking; - remainingTicks = totalTicks = ticks; - } - - @Override - public void reset(PonderScene scene) { - super.reset(scene); - remainingTicks = totalTicks; - } - - protected void firstTick(PonderScene scene) {} - - @Override - public void onScheduled(PonderScene scene) { - super.onScheduled(scene); - if (isBlocking()) - scene.addToSceneTime(totalTicks); - } - - @Override - public void tick(PonderScene scene) { - if (remainingTicks == totalTicks) - firstTick(scene); - if (remainingTicks > 0) - remainingTicks--; - } - - @Override - public boolean isComplete() { - return remainingTicks == 0; - } - - @Override - public boolean isBlocking() { - return blocking; - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instruction/TileEntityDataInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instruction/TileEntityDataInstruction.java deleted file mode 100644 index e42ef5ddfc..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/instruction/TileEntityDataInstruction.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.simibubi.create.foundation.ponder.instruction; - -import java.util.function.UnaryOperator; - -import com.simibubi.create.foundation.ponder.PonderScene; -import com.simibubi.create.foundation.ponder.PonderWorld; -import com.simibubi.create.foundation.ponder.Selection; -import com.simibubi.create.foundation.tileEntity.SyncedTileEntity; - -import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.level.block.entity.BlockEntity; - -public class TileEntityDataInstruction extends WorldModifyInstruction { - - private boolean redraw; - private UnaryOperator data; - private Class type; - - public TileEntityDataInstruction(Selection selection, Class type, - UnaryOperator data, boolean redraw) { - super(selection); - this.type = type; - this.data = data; - this.redraw = redraw; - } - - @Override - protected void runModification(Selection selection, PonderScene scene) { - PonderWorld world = scene.getWorld(); - selection.forEach(pos -> { - if (!world.getBounds() - .isInside(pos)) - return; - BlockEntity tileEntity = world.getBlockEntity(pos); - if (!type.isInstance(tileEntity)) - return; - CompoundTag apply = data.apply(tileEntity.saveWithFullMetadata()); - if (tileEntity instanceof SyncedTileEntity) - ((SyncedTileEntity) tileEntity).readClient(apply); - tileEntity.load(apply); - }); - } - - @Override - protected boolean needsRedraw() { - return redraw; - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instruction/WorldModifyInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instruction/WorldModifyInstruction.java deleted file mode 100644 index 3640fcc407..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/instruction/WorldModifyInstruction.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.simibubi.create.foundation.ponder.instruction; - -import com.simibubi.create.foundation.ponder.PonderScene; -import com.simibubi.create.foundation.ponder.Selection; -import com.simibubi.create.foundation.ponder.element.WorldSectionElement; - -public abstract class WorldModifyInstruction extends PonderInstruction { - - private Selection selection; - - public WorldModifyInstruction(Selection selection) { - this.selection = selection; - } - - @Override - public boolean isComplete() { - return true; - } - - @Override - public void tick(PonderScene scene) { - runModification(selection, scene); - if (needsRedraw()) - scene.forEach(WorldSectionElement.class, WorldSectionElement::queueRedraw); - } - - protected abstract void runModification(Selection selection, PonderScene scene); - - protected abstract boolean needsRedraw(); - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instruction/package-info.java b/src/main/java/com/simibubi/create/foundation/ponder/instruction/package-info.java new file mode 100644 index 0000000000..b2be52faab --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/instruction/package-info.java @@ -0,0 +1,9 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +@FieldsAreNonnullByDefault +package com.simibubi.create.foundation.ponder.instruction; + +import javax.annotation.ParametersAreNonnullByDefault; + +import net.minecraft.FieldsAreNonnullByDefault; +import net.minecraft.MethodsReturnNonnullByDefault; diff --git a/src/main/java/com/simibubi/create/foundation/ponder/package-info.java b/src/main/java/com/simibubi/create/foundation/ponder/package-info.java new file mode 100644 index 0000000000..a782f56179 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/package-info.java @@ -0,0 +1,9 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +@FieldsAreNonnullByDefault +package com.simibubi.create.foundation.ponder; + +import javax.annotation.ParametersAreNonnullByDefault; + +import net.minecraft.FieldsAreNonnullByDefault; +import net.minecraft.MethodsReturnNonnullByDefault; diff --git a/src/main/java/com/simibubi/create/foundation/ponder/ui/ChapterLabel.java b/src/main/java/com/simibubi/create/foundation/ponder/ui/ChapterLabel.java deleted file mode 100644 index b32dbfe974..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/ui/ChapterLabel.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.simibubi.create.foundation.ponder.ui; - -import java.util.function.BiConsumer; - -import javax.annotation.Nonnull; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.foundation.gui.Theme; -import com.simibubi.create.foundation.gui.UIRenderHelper; -import com.simibubi.create.foundation.gui.widget.AbstractSimiWidget; -import com.simibubi.create.foundation.ponder.PonderChapter; - -import net.minecraft.client.Minecraft; - -public class ChapterLabel extends AbstractSimiWidget { - - private final PonderChapter chapter; - private final PonderButton button; - - public ChapterLabel(PonderChapter chapter, int x, int y, BiConsumer onClick) { - super(x, y, 175, 38); - - this.button = new PonderButton(x + 4, y + 4, 30, 30) - .showing(chapter) - .withCallback(onClick); - - this.chapter = chapter; - } - - @Override - public void render(@Nonnull PoseStack ms, int mouseX, int mouseY, float partialTicks) { - UIRenderHelper.streak(ms, 0, x, y + height / 2, height - 2, width); - Minecraft.getInstance().font.draw(ms, chapter.getTitle(), x + 50, - y + 20, Theme.i(Theme.Key.TEXT_ACCENT_SLIGHT)); - - button.renderButton(ms, mouseX, mouseY, partialTicks); - super.render(ms, mouseX, mouseY, partialTicks); - } - - @Override - public void onClick(double x, double y) { - if (!button.isMouseOver(x, y)) - return; - - button.runCallback(x, y); - } -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/ui/LayoutHelper.java b/src/main/java/com/simibubi/create/foundation/ponder/ui/LayoutHelper.java deleted file mode 100644 index f815220b9f..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/ui/LayoutHelper.java +++ /dev/null @@ -1,118 +0,0 @@ -package com.simibubi.create.foundation.ponder.ui; - -import net.minecraft.client.renderer.Rect2i; - -public interface LayoutHelper { - - static LayoutHelper centeredHorizontal(int itemCount, int rows, int width, int height, int spacing) { - return new CenteredHorizontalLayoutHelper(itemCount, rows, width, height, spacing); - } - - int getX(); - - int getY(); - - void next(); - - int getTotalWidth(); - - int getTotalHeight(); - - default Rect2i getArea() { - int lWidth = getTotalWidth(); - int lHeight = getTotalHeight(); - return new Rect2i(-lWidth / 2, -lHeight / 2, lWidth, lHeight); - } - - class CenteredHorizontalLayoutHelper implements LayoutHelper { - - int itemCount; - int rows; - int width; - int height; - int spacing; - - int currentColumn = 0; - int currentRow = 0; - int[] rowCounts; - int x = 0, y = 0; - - CenteredHorizontalLayoutHelper(int itemCount, int rows, int width, int height, int spacing) { - this.itemCount = itemCount; - this.rows = rows; - this.width = width; - this.height = height; - this.spacing = spacing; - - rowCounts = new int[rows]; - int itemsPerRow = itemCount / rows; - int itemDiff = itemCount - itemsPerRow * rows; - for (int i = 0; i < rows; i++) { - rowCounts[i] = itemsPerRow; - if (itemDiff > 0) { - rowCounts[i]++; - itemDiff--; - } - } - - init(); - } - - @Override - public int getX() { - return x; - } - - @Override - public int getY() { - return y; - } - - @Override - public void next() { - currentColumn++; - if (currentColumn >= rowCounts[currentRow]) { - // nextRow - if (++currentRow >= rows) { - x = 0; - y = 0; - return; - } - - currentColumn = 0; - prepareX(); - y += height + spacing; - return; - } - - x += width + spacing; - } - - private void init() { - prepareX(); - prepareY(); - } - - private void prepareX() { - int rowWidth = rowCounts[currentRow] * width + (rowCounts[currentRow] - 1) * spacing; - x = -(rowWidth / 2); - } - - private void prepareY() { - int totalHeight = rows * height + (rows > 1 ? ((rows - 1) * spacing) : 0); - y = -(totalHeight / 2); - } - - @Override - public int getTotalWidth() { - return rowCounts[0] * width + (rowCounts[0] - 1) * spacing; - } - - @Override - public int getTotalHeight() { - return rows * height + (rows > 1 ? ((rows - 1) * spacing) : 0); - } - - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/ui/NavigatableSimiScreen.java b/src/main/java/com/simibubi/create/foundation/ponder/ui/NavigatableSimiScreen.java deleted file mode 100644 index 2b1bb46827..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/ui/NavigatableSimiScreen.java +++ /dev/null @@ -1,255 +0,0 @@ -package com.simibubi.create.foundation.ponder.ui; - -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; - -import org.apache.commons.lang3.mutable.MutableBoolean; -import org.apache.commons.lang3.mutable.MutableInt; -import org.lwjgl.glfw.GLFW; - -import com.mojang.blaze3d.platform.Window; -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.foundation.gui.AbstractSimiScreen; -import com.simibubi.create.foundation.gui.ScreenOpener; -import com.simibubi.create.foundation.gui.Theme; -import com.simibubi.create.foundation.gui.UIRenderHelper; -import com.simibubi.create.foundation.ponder.PonderLocalization; -import com.simibubi.create.foundation.ponder.PonderTooltipHandler; -import com.simibubi.create.foundation.utility.Color; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.screens.Screen; -import net.minecraft.network.chat.TranslatableComponent; -import net.minecraft.util.Mth; - -public abstract class NavigatableSimiScreen extends AbstractSimiScreen { - - public static final String THINK_BACK = PonderLocalization.LANG_PREFIX + "think_back"; - - protected int depthPointX, depthPointY; - public final LerpedFloat transition = LerpedFloat.linear() - .startWithValue(0) - .chase(0, .1f, LerpedFloat.Chaser.LINEAR); - protected final LerpedFloat arrowAnimation = LerpedFloat.linear() - .startWithValue(0) - .chase(0, 0.075f, LerpedFloat.Chaser.LINEAR); - protected PonderButton backTrack; - - public NavigatableSimiScreen() { - Window window = Minecraft.getInstance().getWindow(); - depthPointX = window.getGuiScaledWidth() / 2; - depthPointY = window.getGuiScaledHeight() / 2; - } - - @Override - public void onClose() { - ScreenOpener.clearStack(); - super.onClose(); - } - - @Override - public void tick() { - super.tick(); - transition.tickChaser(); - arrowAnimation.tickChaser(); - } - - @Override - protected void init() { - super.init(); - - backTrack = null; - List screenHistory = ScreenOpener.getScreenHistory(); - if (screenHistory.isEmpty()) - return; - if (!(screenHistory.get(0) instanceof NavigatableSimiScreen)) - return; - - NavigatableSimiScreen screen = (NavigatableSimiScreen) screenHistory.get(0); - - addRenderableWidget(backTrack = new PonderButton(31, height - 31 - 20).enableFade(0, 5) - .withCallback(() -> ScreenOpener.openPreviousScreen(this, Optional.empty()))); - backTrack.fade(1); - - screen.initBackTrackIcon(backTrack); - } - - /** - * Called when {@code this} represents the previous screen to - * initialize the {@code backTrack} icon of the current screen. - * - * @param backTrack The backTrack button of the current screen. - */ - protected abstract void initBackTrackIcon(PonderButton backTrack); - - @Override - public void render(PoseStack ms, int mouseX, int mouseY, float partialTicks) { - super.render(ms, mouseX, mouseY, partialTicks); -// renderZeloBreadcrumbs(ms, mouseX, mouseY, partialTicks); - if (backTrack == null) - return; - - ms.pushPose(); - ms.translate(0, 0, 500); - if (backTrack.isHoveredOrFocused()) { - TranslatableComponent translate = Lang.translateDirect(backTrackingLangKey()); - font.draw(ms, translate, 41 - font.width(translate) / 2, height - 16, - Theme.i(Theme.Key.TEXT_DARKER)); - if (Mth.equal(arrowAnimation.getValue(), arrowAnimation.getChaseTarget())) { - arrowAnimation.setValue(1); - arrowAnimation.setValue(1);// called twice to also set the previous value to 1 - } - } - ms.popPose(); - } - - protected String backTrackingLangKey() { - return THINK_BACK; - } - - @Override - protected void renderWindowBackground(PoseStack ms, int mouseX, int mouseY, float partialTicks) { - if (backTrack != null) { - int x = (int) Mth.lerp(arrowAnimation.getValue(partialTicks), -9, 21); - int maxX = backTrack.x + backTrack.getWidth(); - - if (x + 30 < backTrack.x) - UIRenderHelper.breadcrumbArrow(ms, x + 30, height - 51, 0, maxX - (x + 30), 20, 5, - Theme.p(Theme.Key.PONDER_BACK_ARROW)); - - UIRenderHelper.breadcrumbArrow(ms, x, height - 51, 0, 30, 20, 5, Theme.p(Theme.Key.PONDER_BACK_ARROW)); - UIRenderHelper.breadcrumbArrow(ms, x - 30, height - 51, 0, 30, 20, 5, Theme.p(Theme.Key.PONDER_BACK_ARROW)); - } - - if (transition.getChaseTarget() == 0 || transition.settled()) { - renderBackground(ms); - return; - } - - renderBackground(ms); - - Screen lastScreen = ScreenOpener.getPreviouslyRenderedScreen(); - float transitionValue = transition.getValue(partialTicks); - float scale = 1 + 0.5f * transitionValue; - - // draw last screen into buffer - if (lastScreen != null && lastScreen != this && !transition.settled()) { - ms.pushPose(); - UIRenderHelper.framebuffer.clear(Minecraft.ON_OSX); - ms.translate(0, 0, -1000); - UIRenderHelper.framebuffer.bindWrite(true); - PonderTooltipHandler.enable = false; - lastScreen.render(ms, mouseX, mouseY, partialTicks); - PonderTooltipHandler.enable = true; - - ms.popPose(); - ms.pushPose(); - - // use the buffer texture - minecraft.getMainRenderTarget() - .bindWrite(true); - - Window window = minecraft.getWindow(); - int dpx = window.getGuiScaledWidth() / 2; - int dpy = window.getGuiScaledHeight() / 2; - if (lastScreen instanceof NavigatableSimiScreen navigableScreen) { - dpx = navigableScreen.depthPointX; - dpy = navigableScreen.depthPointY; - } - - ms.translate(dpx, dpy, 0); - ms.scale(scale, scale, 1); - ms.translate(-dpx, -dpy, 0); - RenderSystem.enableBlend(); - RenderSystem.defaultBlendFunc(); - UIRenderHelper.drawFramebuffer(1f - Math.abs(transitionValue)); - RenderSystem.disableBlend(); - ms.popPose(); - } - - // modify current screen as well - scale = transitionValue > 0 ? 1 - 0.5f * (1 - transitionValue) : 1 + .5f * (1 + transitionValue); - ms.translate(depthPointX, depthPointY, 0); - ms.scale(scale, scale, 1); - ms.translate(-depthPointX, -depthPointY, 0); - } - - @Override - public boolean keyPressed(int code, int p_keyPressed_2_, int p_keyPressed_3_) { - if (code == GLFW.GLFW_KEY_BACKSPACE) { - ScreenOpener.openPreviousScreen(this, Optional.empty()); - return true; - } - return super.keyPressed(code, p_keyPressed_2_, p_keyPressed_3_); - } - - public void centerScalingOn(int x, int y) { - depthPointX = x; - depthPointY = y; - } - - public void centerScalingOnMouse() { - Window w = minecraft.getWindow(); - double mouseX = minecraft.mouseHandler.xpos() * w.getGuiScaledWidth() / w.getScreenWidth(); - double mouseY = minecraft.mouseHandler.ypos() * w.getGuiScaledHeight() / w.getScreenHeight(); - centerScalingOn((int) mouseX, (int) mouseY); - } - - public boolean isEquivalentTo(NavigatableSimiScreen other) { - return false; - } - - public void shareContextWith(NavigatableSimiScreen other) {} - - protected void renderZeloBreadcrumbs(PoseStack ms, int mouseX, int mouseY, float partialTicks) { - List history = ScreenOpener.getScreenHistory(); - if (history.isEmpty()) - return; - - history.add(0, minecraft.screen); - int spacing = 20; - - List names = history.stream() - .map(NavigatableSimiScreen::screenTitle) - .collect(Collectors.toList()); - - int bWidth = names.stream() - .mapToInt(s -> font.width(s) + spacing) - .sum(); - - MutableInt x = new MutableInt(width - bWidth); - MutableInt y = new MutableInt(height - 18); - MutableBoolean first = new MutableBoolean(true); - - if (x.getValue() < 25) - x.setValue(25); - - ms.pushPose(); - ms.translate(0, 0, 600); - names.forEach(s -> { - int sWidth = font.width(s); - UIRenderHelper.breadcrumbArrow(ms, x.getValue(), y.getValue(), 0, sWidth + spacing, 14, spacing / 2, - new Color(0xdd101010), new Color(0x44101010)); - font.draw(ms, s, x.getValue() + 5, y.getValue() + 3, first.getValue() ? 0xffeeffee : 0xffddeeff); - first.setFalse(); - - x.add(sWidth + spacing); - }); - ms.popPose(); - } - - private static String screenTitle(Screen screen) { - if (screen instanceof NavigatableSimiScreen) - return ((NavigatableSimiScreen) screen).getBreadcrumbTitle(); - return "<"; - } - - protected String getBreadcrumbTitle() { - return this.getClass() - .getSimpleName(); - } -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/ui/PonderButton.java b/src/main/java/com/simibubi/create/foundation/ponder/ui/PonderButton.java deleted file mode 100644 index 2639f2b34a..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/ui/PonderButton.java +++ /dev/null @@ -1,135 +0,0 @@ -package com.simibubi.create.foundation.ponder.ui; - -import javax.annotation.Nonnull; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.foundation.gui.Theme; -import com.simibubi.create.foundation.gui.Theme.Key; -import com.simibubi.create.foundation.gui.element.GuiGameElement; -import com.simibubi.create.foundation.gui.element.RenderElement; -import com.simibubi.create.foundation.gui.widget.BoxWidget; -import com.simibubi.create.foundation.gui.widget.ElementWidget; -import com.simibubi.create.foundation.ponder.PonderTag; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.Color; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; - -import net.minecraft.client.KeyMapping; -import net.minecraft.client.Minecraft; -import net.minecraft.util.Mth; -import net.minecraft.world.item.ItemStack; - -public class PonderButton extends BoxWidget { - - protected ItemStack item; - protected PonderTag tag; - protected KeyMapping shortcut; - protected LerpedFloat flash = LerpedFloat.linear().startWithValue(0).chase(0, 0.1f, LerpedFloat.Chaser.EXP); - - public PonderButton(int x, int y) { - this(x, y, 20, 20); - } - - public PonderButton(int x, int y, int width, int height) { - super(x, y, width, height); - z = 420; - paddingX = 2; - paddingY = 2; - } - - public T withShortcut(KeyMapping key) { - this.shortcut = key; - //noinspection unchecked - return (T) this; - } - - public T showingTag(PonderTag tag) { - return showing(this.tag = tag); - } - - public T showing(ItemStack item) { - this.item = item; - return super.showingElement(GuiGameElement.of(item) - .scale(1.5f) - .at(-4, -4)); - } - - @Override - public T showingElement(RenderElement element) { - return super.showingElement(element); - } - - public void flash() { - flash.updateChaseTarget(1); - } - - public void dim() { - flash.updateChaseTarget(0); - } - - @Override - public void tick() { - super.tick(); - flash.tickChaser(); - } - - @Override - protected void beforeRender(@Nonnull PoseStack ms, int mouseX, int mouseY, float partialTicks) { - super.beforeRender(ms, mouseX, mouseY, partialTicks); - - float flashValue = flash.getValue(partialTicks); - if (flashValue > .1f) { - float sin = 0.5f + 0.5f * Mth.sin((AnimationTickHolder.getTicks(true) + partialTicks) / 5f); - sin *= flashValue; - Color nc1 = new Color(255, 255, 255, Mth.clamp(gradientColor1.getAlpha() + 150, 0, 255)); - Color nc2 = new Color(155, 155, 155, Mth.clamp(gradientColor2.getAlpha() + 150, 0, 255)); - gradientColor1 = gradientColor1.mixWith(nc1, sin); - gradientColor2 = gradientColor2.mixWith(nc2, sin); - } - } - - @Override - public void renderButton(@Nonnull PoseStack ms, int mouseX, int mouseY, float partialTicks) { - super.renderButton(ms, mouseX, mouseY, partialTicks); - float fadeValue = fade.getValue(); - - if (fadeValue < .1f) - return; - - if (shortcut != null) { - ms.pushPose(); - ms.translate(0, 0, z + 10); - drawCenteredString(ms, Minecraft.getInstance().font, shortcut.getTranslatedKeyMessage(), x + width / 2 + 8, y + height - 6, Theme.c(Theme.Key.TEXT_DARKER).scaleAlpha(fadeValue).getRGB()); - ms.popPose(); - } - } - - public ItemStack getItem() { - return item; - } - - public PonderTag getTag() { - return tag; - } - - @Override - public Key getDisabledTheme() { - return Theme.Key.PONDER_BUTTON_DISABLE; - } - - @Override - public Key getIdleTheme() { - return Theme.Key.PONDER_BUTTON_IDLE; - } - - @Override - public Key getHoverTheme() { - return Theme.Key.PONDER_BUTTON_HOVER; - } - - @Override - public Key getClickTheme() { - return Theme.Key.PONDER_BUTTON_CLICK; - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/ui/PonderIndexScreen.java b/src/main/java/com/simibubi/create/foundation/ponder/ui/PonderIndexScreen.java deleted file mode 100644 index 17e3374394..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/ui/PonderIndexScreen.java +++ /dev/null @@ -1,226 +0,0 @@ -package com.simibubi.create.foundation.ponder.ui; - -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; - -import com.mojang.blaze3d.platform.Window; -import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.AllBlocks; -import com.simibubi.create.AllItems; -import com.simibubi.create.content.contraptions.components.crank.ValveHandleBlock; -import com.simibubi.create.foundation.gui.ScreenOpener; -import com.simibubi.create.foundation.gui.Theme; -import com.simibubi.create.foundation.gui.UIRenderHelper; -import com.simibubi.create.foundation.ponder.PonderChapter; -import com.simibubi.create.foundation.ponder.PonderRegistry; - -import net.minecraft.client.gui.components.events.GuiEventListener; -import net.minecraft.client.renderer.Rect2i; -import net.minecraft.util.Mth; -import net.minecraft.world.item.BlockItem; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.Block; -import net.minecraftforge.registries.ForgeRegistries; - -public class PonderIndexScreen extends NavigatableSimiScreen { - - protected final List chapters; - private final double chapterXmult = 0.5; - private final double chapterYmult = 0.3; - protected Rect2i chapterArea; - - protected final List items; - private final double itemXmult = 0.5; - private double itemYmult = 0.75; - protected Rect2i itemArea; - - private ItemStack hoveredItem = ItemStack.EMPTY; - - public PonderIndexScreen() { - chapters = new ArrayList<>(); - items = new ArrayList<>(); - } - - @Override - protected void init() { - super.init(); - - chapters.clear(); - // chapters.addAll(PonderRegistry.CHAPTERS.getAllChapters()); - - items.clear(); - PonderRegistry.ALL.keySet() - .stream() - .map(key -> { - Item item = ForgeRegistries.ITEMS.getValue(key); - if (item == null) { - Block b = ForgeRegistries.BLOCKS.getValue(key); - if (b != null) - item = b.asItem(); - } - return item; - }) - .filter(Objects::nonNull) - .filter(PonderIndexScreen::exclusions) - .forEach(items::add); - - boolean hasChapters = !chapters.isEmpty(); - - // setup chapters - LayoutHelper layout = LayoutHelper.centeredHorizontal(chapters.size(), - Mth.clamp((int) Math.ceil(chapters.size() / 4f), 1, 4), 200, 38, 16); - chapterArea = layout.getArea(); - int chapterCenterX = (int) (width * chapterXmult); - int chapterCenterY = (int) (height * chapterYmult); - - // todo at some point pagination or horizontal scrolling may be needed for - // chapters/items - for (PonderChapter chapter : chapters) { - ChapterLabel label = new ChapterLabel(chapter, chapterCenterX + layout.getX(), - chapterCenterY + layout.getY(), (mouseX, mouseY) -> { - centerScalingOn(mouseX, mouseY); - ScreenOpener.transitionTo(PonderUI.of(chapter)); - }); - - addRenderableWidget(label); - layout.next(); - } - - // setup items - if (!hasChapters) { - itemYmult = 0.5; - } - - int maxItemRows = hasChapters ? 4 : 7; - layout = LayoutHelper.centeredHorizontal(items.size(), - Mth.clamp((int) Math.ceil(items.size() / 11f), 1, maxItemRows), 28, 28, 8); - itemArea = layout.getArea(); - int itemCenterX = (int) (width * itemXmult); - int itemCenterY = (int) (height * itemYmult); - - for (Item item : items) { - PonderButton b = new PonderButton(itemCenterX + layout.getX() + 4, itemCenterY + layout.getY() + 4) - .showing(new ItemStack(item)) - .withCallback((x, y) -> { - if (!PonderRegistry.ALL.containsKey(item.getRegistryName())) - return; - - centerScalingOn(x, y); - ScreenOpener.transitionTo(PonderUI.of(new ItemStack(item))); - }); - - addRenderableWidget(b); - layout.next(); - } - - } - - @Override - protected void initBackTrackIcon(PonderButton backTrack) { - backTrack.showing(AllItems.WRENCH.asStack()); - } - - private static boolean exclusions(Item item) { - if (item instanceof BlockItem) { - Block block = ((BlockItem) item).getBlock(); - if (block instanceof ValveHandleBlock && !AllBlocks.COPPER_VALVE_HANDLE.is(item)) - return false; - } - - return true; - } - - @Override - public void tick() { - super.tick(); - PonderUI.ponderTicks++; - - hoveredItem = ItemStack.EMPTY; - Window w = minecraft.getWindow(); - double mouseX = minecraft.mouseHandler.xpos() * w.getGuiScaledWidth() / w.getScreenWidth(); - double mouseY = minecraft.mouseHandler.ypos() * w.getGuiScaledHeight() / w.getScreenHeight(); - for (GuiEventListener child : children()) { - if (child instanceof PonderButton button) { - if (button.isMouseOver(mouseX, mouseY)) { - hoveredItem = button.getItem(); - } - } - } - } - - @Override - protected void renderWindow(PoseStack ms, int mouseX, int mouseY, float partialTicks) { - int x = (int) (width * chapterXmult); - int y = (int) (height * chapterYmult); - - if (!chapters.isEmpty()) { - ms.pushPose(); - ms.translate(x, y, 0); - - UIRenderHelper.streak(ms, 0, chapterArea.getX() - 10, chapterArea.getY() - 20, 20, 220); - font.draw(ms, "Topics to Ponder about", chapterArea.getX() - 5, chapterArea.getY() - 25, Theme.i(Theme.Key.TEXT)); - - ms.popPose(); - } - - x = (int) (width * itemXmult); - y = (int) (height * itemYmult); - - ms.pushPose(); - ms.translate(x, y, 0); - - UIRenderHelper.streak(ms, 0, itemArea.getX() - 10, itemArea.getY() - 20, 20, 220); - font.draw(ms, "Items to inspect", itemArea.getX() - 5, itemArea.getY() - 25, Theme.i(Theme.Key.TEXT)); - - ms.popPose(); - } - - @Override - protected void renderWindowForeground(PoseStack ms, int mouseX, int mouseY, float partialTicks) { - if (hoveredItem.isEmpty()) - return; - - ms.pushPose(); - ms.translate(0, 0, 200); - - renderTooltip(ms, hoveredItem, mouseX, mouseY); - - ms.popPose(); - } - - /*@Override - public boolean mouseClicked(double x, double y, int button) { - MutableBoolean handled = new MutableBoolean(false); - widgets.forEach(w -> { - if (handled.booleanValue()) - return; - if (!w.isMouseOver(x, y)) - return; - if (w instanceof PonderButton) { - PonderButton btn = (PonderButton) w; - btn.runCallback(x, y); - handled.setTrue(); - } - }); - - if (handled.booleanValue()) - return true; - return super.mouseClicked(x, y, button); - }*/ - - @Override - public boolean isEquivalentTo(NavigatableSimiScreen other) { - return other instanceof PonderIndexScreen; - } - - public ItemStack getHoveredTooltipItem() { - return hoveredItem; - } - - @Override - public boolean isPauseScreen() { - return true; - } -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/ui/PonderProgressBar.java b/src/main/java/com/simibubi/create/foundation/ponder/ui/PonderProgressBar.java deleted file mode 100644 index ab3e5b0e91..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/ui/PonderProgressBar.java +++ /dev/null @@ -1,177 +0,0 @@ -package com.simibubi.create.foundation.ponder.ui; - -import javax.annotation.Nonnull; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.foundation.gui.Theme; -import com.simibubi.create.foundation.gui.element.BoxElement; -import com.simibubi.create.foundation.gui.widget.AbstractSimiWidget; -import com.simibubi.create.foundation.ponder.PonderScene; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.Font; -import net.minecraft.client.sounds.SoundManager; -import net.minecraftforge.client.gui.GuiUtils; - -public class PonderProgressBar extends AbstractSimiWidget { - - LerpedFloat progress; - - PonderUI ponder; - - public PonderProgressBar(PonderUI ponder, int xIn, int yIn, int widthIn, int heightIn) { - super(xIn, yIn, widthIn, heightIn); - - this.ponder = ponder; - progress = LerpedFloat.linear() - .startWithValue(0); - } - - public void tick() { - progress.chase(ponder.getActiveScene() - .getSceneProgress(), .5f, LerpedFloat.Chaser.EXP); - progress.tickChaser(); - } - - @Override - protected boolean clicked(double mouseX, double mouseY) { - return this.active && this.visible && ponder.getActiveScene().getKeyframeCount() > 0 - && mouseX >= (double) this.x && mouseX < (double) (this.x + this.width + 4) && mouseY >= (double) this.y - 3 - && mouseY < (double) (this.y + this.height + 20); - } - - @Override - public void onClick(double mouseX, double mouseY) { - PonderScene activeScene = ponder.getActiveScene(); - - int keyframeIndex = getHoveredKeyframeIndex(activeScene, mouseX); - - if (keyframeIndex == -1) - ponder.seekToTime(0); - else if (keyframeIndex == activeScene.getKeyframeCount()) - ponder.seekToTime(activeScene.getTotalTime()); - else - ponder.seekToTime(activeScene.getKeyframeTime(keyframeIndex)); - } - - public int getHoveredKeyframeIndex(PonderScene activeScene, double mouseX) { - int totalTime = activeScene.getTotalTime(); - int clickedAtTime = (int) ((mouseX - x) / ((double) width + 4) * totalTime); - - { - int lastKeyframeTime = activeScene.getKeyframeTime(activeScene.getKeyframeCount() - 1); - - int diffToEnd = totalTime - clickedAtTime; - int diffToLast = clickedAtTime - lastKeyframeTime; - - if (diffToEnd > 0 && diffToEnd < diffToLast / 2) { - return activeScene.getKeyframeCount(); - } - } - - int index = -1; - - for (int i = 0; i < activeScene.getKeyframeCount(); i++) { - int keyframeTime = activeScene.getKeyframeTime(i); - - if (keyframeTime > clickedAtTime) - break; - - index = i; - } - - return index; - } - - @Override - public void renderButton(@Nonnull PoseStack ms, int mouseX, int mouseY, float partialTicks) { - - isHovered = clicked(mouseX, mouseY); - - new BoxElement() - .withBackground(Theme.c(Theme.Key.PONDER_BACKGROUND_FLAT)) - .gradientBorder(Theme.p(Theme.Key.PONDER_IDLE)) - .at(x, y, 400) - .withBounds(width, height) - .render(ms); - - ms.pushPose(); - ms.translate(x - 2, y - 2, 100); - - ms.pushPose(); - ms.scale((width + 4) * progress.getValue(partialTicks), 1, 1); - int c1 = Theme.i(Theme.Key.PONDER_PROGRESSBAR, true); - int c2 = Theme.i(Theme.Key.PONDER_PROGRESSBAR, false); - GuiUtils.drawGradientRect(ms.last().pose(), 310, 0, 3, 1, 4, c1, c1); - GuiUtils.drawGradientRect(ms.last().pose(), 310, 0, 4, 1, 5, c2, c2); - ms.popPose(); - - renderKeyframes(ms, mouseX, partialTicks); - - ms.popPose(); - } - - private void renderKeyframes(PoseStack ms, int mouseX, float partialTicks) { - PonderScene activeScene = ponder.getActiveScene(); - - int hoverStartColor = Theme.i(Theme.Key.PONDER_HOVER, true) | 0xa0_000000; - int hoverEndColor = Theme.i(Theme.Key.PONDER_HOVER, false) | 0xa0_000000; - int idleStartColor = Theme.i(Theme.Key.PONDER_IDLE, true) | 0x40_000000; - int idleEndColor = Theme.i(Theme.Key.PONDER_IDLE, false) | 0x40_000000; - int hoverIndex; - - if (isHovered) { - hoverIndex = getHoveredKeyframeIndex(activeScene, mouseX); - } else { - hoverIndex = -2; - } - - if (hoverIndex == -1) - drawKeyframe(ms, activeScene, true, 0, 0, hoverStartColor, hoverEndColor, 8); - else if (hoverIndex == activeScene.getKeyframeCount()) - drawKeyframe(ms, activeScene, true, activeScene.getTotalTime(), width + 4, hoverStartColor, hoverEndColor, 8); - - for (int i = 0; i < activeScene.getKeyframeCount(); i++) { - int keyframeTime = activeScene.getKeyframeTime(i); - int keyframePos = (int) (((float) keyframeTime) / ((float) activeScene.getTotalTime()) * (width + 4)); - - boolean selected = i == hoverIndex; - int startColor = selected ? hoverStartColor : idleStartColor; - int endColor = selected ? hoverEndColor : idleEndColor; - int height = selected ? 8 : 4; - - drawKeyframe(ms, activeScene, selected, keyframeTime, keyframePos, startColor, endColor, height); - - } - } - - private void drawKeyframe(PoseStack ms, PonderScene activeScene, boolean selected, int keyframeTime, int keyframePos, int startColor, int endColor, int height) { - if (selected) { - Font font = Minecraft.getInstance().font; - GuiUtils.drawGradientRect(ms.last() - .pose(), 600, keyframePos, 10, keyframePos + 1, 10 + height, endColor, startColor); - ms.pushPose(); - ms.translate(0, 0, 200); - String text; - int offset; - if (activeScene.getCurrentTime() < keyframeTime) { - text = ">"; - offset = -1 - font.width(text); - } else { - text = "<"; - offset = 3; - } - font.draw(ms, text, keyframePos + offset, 10, endColor); - ms.popPose(); - } - - GuiUtils.drawGradientRect(ms.last() - .pose(), 400, keyframePos, -1, keyframePos + 1, 2 + height, startColor, endColor); - } - - @Override - public void playDownSound(SoundManager handler) { - - } -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/ui/PonderTagIndexScreen.java b/src/main/java/com/simibubi/create/foundation/ponder/ui/PonderTagIndexScreen.java deleted file mode 100644 index c7bd9bc8bc..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/ui/PonderTagIndexScreen.java +++ /dev/null @@ -1,242 +0,0 @@ -package com.simibubi.create.foundation.ponder.ui; - -import java.util.List; -import java.util.Optional; - -import com.mojang.blaze3d.platform.Window; -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.AllItems; -import com.simibubi.create.foundation.gui.AllIcons; -import com.simibubi.create.foundation.gui.ScreenOpener; -import com.simibubi.create.foundation.gui.Theme; -import com.simibubi.create.foundation.gui.UIRenderHelper; -import com.simibubi.create.foundation.gui.element.BoxElement; -import com.simibubi.create.foundation.gui.element.GuiGameElement; -import com.simibubi.create.foundation.item.TooltipHelper; -import com.simibubi.create.foundation.ponder.PonderLocalization; -import com.simibubi.create.foundation.ponder.PonderRegistry; -import com.simibubi.create.foundation.ponder.PonderTag; -import com.simibubi.create.foundation.utility.FontHelper; -import com.simibubi.create.foundation.utility.Lang; - -import net.minecraft.ChatFormatting; -import net.minecraft.client.gui.components.events.GuiEventListener; -import net.minecraft.client.renderer.Rect2i; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.TextComponent; -import net.minecraft.util.Mth; - -public class PonderTagIndexScreen extends NavigatableSimiScreen { - - public static final String EXIT = PonderLocalization.LANG_PREFIX + "exit"; - public static final String TITLE = PonderLocalization.LANG_PREFIX + "index_title"; - public static final String WELCOME = PonderLocalization.LANG_PREFIX + "welcome"; - public static final String CATEGORIES = PonderLocalization.LANG_PREFIX + "categories"; - public static final String DESCRIPTION = PonderLocalization.LANG_PREFIX + "index_description"; - - private final double itemXmult = 0.5; - protected Rect2i itemArea; - protected Rect2i chapterArea; - private final double mainYmult = 0.15; - - private PonderTag hoveredItem = null; - - // The ponder entry point from the menu. May be changed to include general - // chapters in the future - public PonderTagIndexScreen() {} - - @Override - protected void init() { - super.init(); - - List tags = PonderRegistry.TAGS.getListedTags(); - int rowCount = Mth.clamp((int) Math.ceil(tags.size() / 11d), 1, 3); - LayoutHelper layout = LayoutHelper.centeredHorizontal(tags.size(), rowCount, 28, 28, 8); - itemArea = layout.getArea(); - int itemCenterX = (int) (width * itemXmult); - int itemCenterY = getItemsY(); - - for (PonderTag i : tags) { - PonderButton b = - new PonderButton(itemCenterX + layout.getX() + 4, itemCenterY + layout.getY() + 4).showingTag(i) - .withCallback((mouseX, mouseY) -> { - centerScalingOn(mouseX, mouseY); - ScreenOpener.transitionTo(new PonderTagScreen(i)); - }); - addRenderableWidget(b); - layout.next(); - } - - addRenderableWidget(backTrack = new PonderButton(31, height - 31 - 20).enableFade(0, 5) - .showing(AllIcons.I_MTD_CLOSE) - .withCallback(() -> ScreenOpener.openPreviousScreen(this, Optional.empty()))); - backTrack.fade(1); - } - - @Override - protected void initBackTrackIcon(PonderButton backTrack) { - backTrack.showing(AllItems.WRENCH.asStack()); - } - - @Override - public void tick() { - super.tick(); - PonderUI.ponderTicks++; - - hoveredItem = null; - Window w = minecraft.getWindow(); - double mouseX = minecraft.mouseHandler.xpos() * w.getGuiScaledWidth() / w.getScreenWidth(); - double mouseY = minecraft.mouseHandler.ypos() * w.getGuiScaledHeight() / w.getScreenHeight(); - for (GuiEventListener child : children()) { - if (child == backTrack) - continue; - if (child instanceof PonderButton button) - if (button.isMouseOver(mouseX, mouseY)) - hoveredItem = button.getTag(); - } - } - - @Override - protected String backTrackingLangKey() { - return EXIT; - } - - @Override - protected void renderWindow(PoseStack ms, int mouseX, int mouseY, float partialTicks) { - renderItems(ms, mouseX, mouseY, partialTicks); - - ms.pushPose(); - ms.translate(width / 2 - 120, height * mainYmult - 40, 0); - - ms.pushPose(); - // ms.translate(0, 0, 800); - int x = 31 + 20 + 8; - int y = 31; - - String title = Lang.translateDirect(WELCOME) - .getString(); - - int streakHeight = 35; - UIRenderHelper.streak(ms, 0, x - 4, y - 12 + streakHeight / 2, streakHeight, 240); - // PonderUI.renderBox(ms, 21, 21, 30, 30, false); - new BoxElement().withBackground(Theme.c(Theme.Key.PONDER_BACKGROUND_FLAT)) - .gradientBorder(Theme.p(Theme.Key.PONDER_IDLE)) - .at(21, 21, 100) - .withBounds(30, 30) - .render(ms); - - font.draw(ms, title, x + 8, y + 1, Theme.i(Theme.Key.TEXT)); -// y += 8; -// x += 0; -// ms.translate(x, y, 0); -// ms.translate(0, 0, 5); -// textRenderer.draw(ms, title, 0, 0, Theme.i(Theme.Key.TEXT)); - ms.popPose(); - - ms.pushPose(); - ms.translate(23, 23, 10); - ms.scale(1.66f, 1.66f, 1.66f); - ms.translate(-4, -4, 0); - ms.scale(1.5f, 1.5f, 1.5f); - GuiGameElement.of(AllItems.WRENCH.asStack()) - .render(ms); - ms.popPose(); - ms.popPose(); - - ms.pushPose(); - int w = (int) (width * .45); - x = (width - w) / 2; - y = getItemsY() - 10 + Math.max(itemArea.getHeight(), 48); - - String desc = Lang.translateDirect(DESCRIPTION) - .getString(); - int h = font.wordWrapHeight(desc, w); - - // PonderUI.renderBox(ms, x - 3, y - 3, w + 6, h + 6, false); - new BoxElement().withBackground(Theme.c(Theme.Key.PONDER_BACKGROUND_FLAT)) - .gradientBorder(Theme.p(Theme.Key.PONDER_IDLE)) - .at(x - 3, y - 3, 90) - .withBounds(w + 6, h + 6) - .render(ms); - - ms.translate(0, 0, 100); - FontHelper.drawSplitString(ms, font, desc, x, y, w, Theme.i(Theme.Key.TEXT)); - ms.popPose(); - } - - protected void renderItems(PoseStack ms, int mouseX, int mouseY, float partialTicks) { - List tags = PonderRegistry.TAGS.getListedTags(); - if (tags.isEmpty()) - return; - - int x = (int) (width * itemXmult); - int y = getItemsY(); - - String relatedTitle = Lang.translateDirect(CATEGORIES) - .getString(); - int stringWidth = font.width(relatedTitle); - - ms.pushPose(); - ms.translate(x, y, 0); - // PonderUI.renderBox(ms, (sWidth - stringWidth) / 2 - 5, itemArea.getY() - 21, - // stringWidth + 10, 10, false); - new BoxElement().withBackground(Theme.c(Theme.Key.PONDER_BACKGROUND_FLAT)) - .gradientBorder(Theme.p(Theme.Key.PONDER_IDLE)) - .at((windowWidth - stringWidth) / 2f - 5, itemArea.getY() - 21, 100) - .withBounds(stringWidth + 10, 10) - .render(ms); - - ms.translate(0, 0, 200); - -// UIRenderHelper.streak(0, itemArea.getX() - 10, itemArea.getY() - 20, 20, 180, 0x101010); - drawCenteredString(ms, font, relatedTitle, windowWidth / 2, itemArea.getY() - 20, Theme.i(Theme.Key.TEXT)); - - ms.translate(0, 0, -200); - - UIRenderHelper.streak(ms, 0, 0, 0, itemArea.getHeight() + 10, itemArea.getWidth() / 2 + 75); - UIRenderHelper.streak(ms, 180, 0, 0, itemArea.getHeight() + 10, itemArea.getWidth() / 2 + 75); - - ms.popPose(); - - } - - public int getItemsY() { - return (int) (mainYmult * height + 85); - } - - @Override - protected void renderWindowForeground(PoseStack ms, int mouseX, int mouseY, float partialTicks) { - RenderSystem.disableDepthTest(); - ms.pushPose(); - ms.translate(0, 0, 200); - - if (hoveredItem != null) { - List list = TooltipHelper.cutStringTextComponent(hoveredItem.getDescription(), - ChatFormatting.GRAY, ChatFormatting.GRAY); - list.add(0, new TextComponent(hoveredItem.getTitle())); - renderComponentTooltip(ms, list, mouseX, mouseY); - } - - ms.popPose(); - RenderSystem.enableDepthTest(); - } - - @Override - protected String getBreadcrumbTitle() { - return Lang.translateDirect(TITLE) - .getString(); - } - - @Override - public boolean isPauseScreen() { - return true; - } - - @Override - public void removed() { - super.removed(); - hoveredItem = null; - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/ui/PonderTagScreen.java b/src/main/java/com/simibubi/create/foundation/ponder/ui/PonderTagScreen.java deleted file mode 100644 index 8540268751..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/ui/PonderTagScreen.java +++ /dev/null @@ -1,363 +0,0 @@ -package com.simibubi.create.foundation.ponder.ui; - -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; - -import com.mojang.blaze3d.platform.Window; -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.Create; -import com.simibubi.create.foundation.gui.ScreenOpener; -import com.simibubi.create.foundation.gui.Theme; -import com.simibubi.create.foundation.gui.UIRenderHelper; -import com.simibubi.create.foundation.gui.element.BoxElement; -import com.simibubi.create.foundation.ponder.PonderChapter; -import com.simibubi.create.foundation.ponder.PonderLocalization; -import com.simibubi.create.foundation.ponder.PonderRegistry; -import com.simibubi.create.foundation.ponder.PonderTag; -import com.simibubi.create.foundation.utility.FontHelper; -import com.simibubi.create.foundation.utility.Lang; - -import net.minecraft.client.gui.components.events.GuiEventListener; -import net.minecraft.client.renderer.Rect2i; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.Mth; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.Block; -import net.minecraftforge.registries.ForgeRegistries; - -public class PonderTagScreen extends NavigatableSimiScreen { - - public static final String ASSOCIATED = PonderLocalization.LANG_PREFIX + "associated"; - - private final PonderTag tag; - protected final List items; - private final double itemXmult = 0.5; - protected Rect2i itemArea; - protected final List chapters; - private final double chapterXmult = 0.5; - private final double chapterYmult = 0.75; - protected Rect2i chapterArea; - private final double mainYmult = 0.15; - - private ItemStack hoveredItem = ItemStack.EMPTY; - - public PonderTagScreen(PonderTag tag) { - this.tag = tag; - items = new ArrayList<>(); - chapters = new ArrayList<>(); - } - - @Override - protected void init() { - super.init(); - - // items - items.clear(); - PonderRegistry.TAGS.getItems(tag) - .stream() - .map(key -> { - Item item = ForgeRegistries.ITEMS.getValue(key); - if (item == null) { - Block b = ForgeRegistries.BLOCKS.getValue(key); - if (b != null) - item = b.asItem(); - } - return item; - }) - .filter(Objects::nonNull) - .forEach(items::add); - - if (!tag.getMainItem().isEmpty()) - items.remove(tag.getMainItem().getItem()); - - int rowCount = Mth.clamp((int) Math.ceil(items.size() / 11d), 1, 3); - LayoutHelper layout = LayoutHelper.centeredHorizontal(items.size(), rowCount, 28, 28, 8); - itemArea = layout.getArea(); - int itemCenterX = (int) (width * itemXmult); - int itemCenterY = getItemsY(); - - for (Item i : items) { - PonderButton b = new PonderButton(itemCenterX + layout.getX() + 4, itemCenterY + layout.getY() + 4) - .showing(new ItemStack(i)); - - if (PonderRegistry.ALL.containsKey(i.getRegistryName())) { - b.withCallback((mouseX, mouseY) -> { - centerScalingOn(mouseX, mouseY); - ScreenOpener.transitionTo(PonderUI.of(new ItemStack(i), tag)); - }); - } else { - if (i.getRegistryName() - .getNamespace() - .equals(Create.ID)) - b.withBorderColors(Theme.p(Theme.Key.PONDER_MISSING_CREATE)) - .animateColors(false); - else - b.withBorderColors(Theme.p(Theme.Key.PONDER_MISSING_VANILLA)) - .animateColors(false); - } - - addRenderableWidget(b); - layout.next(); - } - - if (!tag.getMainItem().isEmpty()) { - ResourceLocation registryName = tag.getMainItem() - .getItem() - .getRegistryName(); - - PonderButton b = new PonderButton(itemCenterX - layout.getTotalWidth() / 2 - 48, itemCenterY - 10) - .showing(tag.getMainItem()); - b.withCustomBackground(Theme.c(Theme.Key.PONDER_BACKGROUND_IMPORTANT)); - - if (PonderRegistry.ALL.containsKey(registryName)) { - b.withCallback((mouseX, mouseY) -> { - centerScalingOn(mouseX, mouseY); - ScreenOpener.transitionTo(PonderUI.of(tag.getMainItem(), tag)); - }); - } else { - if (registryName.getNamespace() - .equals(Create.ID)) - b.withBorderColors(Theme.p(Theme.Key.PONDER_MISSING_CREATE)) - .animateColors(false); - else - b.withBorderColors(Theme.p(Theme.Key.PONDER_MISSING_VANILLA)) - .animateColors(false); - } - - addRenderableWidget(b); - } - - // chapters - chapters.clear(); - chapters.addAll(PonderRegistry.TAGS.getChapters(tag)); - - rowCount = Mth.clamp((int) Math.ceil(chapters.size() / 3f), 1, 3); - layout = LayoutHelper.centeredHorizontal(chapters.size(), rowCount, 200, 38, 16); - chapterArea = layout.getArea(); - int chapterCenterX = (int) (width * chapterXmult); - int chapterCenterY = (int) (height * chapterYmult); - - for (PonderChapter chapter : chapters) { - ChapterLabel label = new ChapterLabel(chapter, chapterCenterX + layout.getX(), - chapterCenterY + layout.getY(), (mouseX, mouseY) -> { - centerScalingOn(mouseX, mouseY); - ScreenOpener.transitionTo(PonderUI.of(chapter)); - }); - - addRenderableWidget(label); - layout.next(); - } - - } - - @Override - protected void initBackTrackIcon(PonderButton backTrack) { - backTrack.showing(tag); - } - - @Override - public void tick() { - super.tick(); - PonderUI.ponderTicks++; - - hoveredItem = ItemStack.EMPTY; - Window w = minecraft.getWindow(); - double mouseX = minecraft.mouseHandler.xpos() * w.getGuiScaledWidth() / w.getScreenWidth(); - double mouseY = minecraft.mouseHandler.ypos() * w.getGuiScaledHeight() / w.getScreenHeight(); - for (GuiEventListener child : children()) { - if (child == backTrack) - continue; - if (child instanceof PonderButton button) - if (button.isMouseOver(mouseX, mouseY)) { - hoveredItem = button.getItem(); - } - } - } - - @Override - protected void renderWindow(PoseStack ms, int mouseX, int mouseY, float partialTicks) { - renderItems(ms, mouseX, mouseY, partialTicks); - - renderChapters(ms, mouseX, mouseY, partialTicks); - - ms.pushPose(); - ms.translate(width / 2 - 120, height * mainYmult - 40, 0); - - ms.pushPose(); - //ms.translate(0, 0, 800); - int x = 31 + 20 + 8; - int y = 31; - - String title = tag.getTitle(); - - int streakHeight = 35; - UIRenderHelper.streak(ms, 0, x - 4, y - 12 + streakHeight / 2, streakHeight, 240); - //PonderUI.renderBox(ms, 21, 21, 30, 30, false); - new BoxElement() - .withBackground(Theme.c(Theme.Key.PONDER_BACKGROUND_FLAT)) - .gradientBorder(Theme.p(Theme.Key.PONDER_IDLE)) - .at(21, 21, 100) - .withBounds(30, 30) - .render(ms); - - font.draw(ms, Lang.translateDirect(PonderUI.PONDERING), x, y - 6, Theme.i(Theme.Key.TEXT_DARKER)); - y += 8; - x += 0; - ms.translate(x, y, 0); - ms.translate(0, 0, 5); - font.draw(ms, title, 0, 0, Theme.i(Theme.Key.TEXT)); - ms.popPose(); - - ms.pushPose(); - ms.translate(23, 23, 10); - ms.scale(1.66f, 1.66f, 1.66f); - tag.render(ms, 0, 0); - ms.popPose(); - ms.popPose(); - - ms.pushPose(); - int w = (int) (width * .45); - x = (width - w) / 2; - y = getItemsY() - 10 + Math.max(itemArea.getHeight(), 48); - - String desc = tag.getDescription(); - int h = font.wordWrapHeight(desc, w); - - - //PonderUI.renderBox(ms, x - 3, y - 3, w + 6, h + 6, false); - new BoxElement() - .withBackground(Theme.c(Theme.Key.PONDER_BACKGROUND_FLAT)) - .gradientBorder(Theme.p(Theme.Key.PONDER_IDLE)) - .at(x - 3, y - 3, 90) - .withBounds(w + 6, h + 6) - .render(ms); - - ms.translate(0, 0, 100); - FontHelper.drawSplitString(ms, font, desc, x, y, w, Theme.i(Theme.Key.TEXT)); - ms.popPose(); - } - - protected void renderItems(PoseStack ms, int mouseX, int mouseY, float partialTicks) { - if (items.isEmpty()) - return; - - int x = (int) (width * itemXmult); - int y = getItemsY(); - - String relatedTitle = Lang.translateDirect(ASSOCIATED).getString(); - int stringWidth = font.width(relatedTitle); - - ms.pushPose(); - ms.translate(x, y, 0); - //PonderUI.renderBox(ms, (sWidth - stringWidth) / 2 - 5, itemArea.getY() - 21, stringWidth + 10, 10, false); - new BoxElement() - .withBackground(Theme.c(Theme.Key.PONDER_BACKGROUND_FLAT)) - .gradientBorder(Theme.p(Theme.Key.PONDER_IDLE)) - .at((windowWidth - stringWidth) / 2f - 5, itemArea.getY() - 21, 100) - .withBounds(stringWidth + 10, 10) - .render(ms); - - ms.translate(0, 0, 200); - -// UIRenderHelper.streak(0, itemArea.getX() - 10, itemArea.getY() - 20, 20, 180, 0x101010); - drawCenteredString(ms, font, relatedTitle, windowWidth / 2, itemArea.getY() - 20, Theme.i(Theme.Key.TEXT)); - - ms.translate(0,0, -200); - - UIRenderHelper.streak(ms, 0, 0, 0, itemArea.getHeight() + 10, itemArea.getWidth() / 2 + 75); - UIRenderHelper.streak(ms, 180, 0, 0, itemArea.getHeight() + 10, itemArea.getWidth() / 2 + 75); - - ms.popPose(); - - } - - public int getItemsY() { - return (int) (mainYmult * height + 85); - } - - protected void renderChapters(PoseStack ms, int mouseX, int mouseY, float partialTicks) { - if (chapters.isEmpty()) - return; - - int chapterX = (int) (width * chapterXmult); - int chapterY = (int) (height * chapterYmult); - - ms.pushPose(); - ms.translate(chapterX, chapterY, 0); - - UIRenderHelper.streak(ms, 0, chapterArea.getX() - 10, chapterArea.getY() - 20, 20, 220); - font.draw(ms, "More Topics to Ponder about", chapterArea.getX() - 5, chapterArea.getY() - 25, Theme.i(Theme.Key.TEXT_ACCENT_SLIGHT)); - - ms.popPose(); - } - - @Override - protected void renderWindowForeground(PoseStack ms, int mouseX, int mouseY, float partialTicks) { - RenderSystem.disableDepthTest(); - ms.pushPose(); - ms.translate(0, 0, 200); - - if (!hoveredItem.isEmpty()) { - renderTooltip(ms, hoveredItem, mouseX, mouseY); - } - - ms.popPose(); - RenderSystem.enableDepthTest(); - } - - @Override - protected String getBreadcrumbTitle() { - return tag.getTitle(); - } - - public ItemStack getHoveredTooltipItem() { - return hoveredItem; - } - - /*@Override - public boolean mouseClicked(double x, double y, int button) { - MutableBoolean handled = new MutableBoolean(false); - widgets.forEach(w -> { - if (handled.booleanValue()) - return; - if (!w.isMouseOver(x, y)) - return; - if (w instanceof PonderButton) { - PonderButton mtdButton = (PonderButton) w; - mtdButton.runCallback(x, y); - handled.setTrue(); - return; - } - }); - - if (handled.booleanValue()) - return true; - return super.mouseClicked(x, y, button); - }*/ - - @Override - public boolean isEquivalentTo(NavigatableSimiScreen other) { - if (other instanceof PonderTagScreen) - return tag == ((PonderTagScreen) other).tag; - return super.isEquivalentTo(other); - } - - @Override - public boolean isPauseScreen() { - return true; - } - - public PonderTag getTag() { - return tag; - } - - @Override - public void removed() { - super.removed(); - hoveredItem = ItemStack.EMPTY; - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/ui/PonderUI.java b/src/main/java/com/simibubi/create/foundation/ponder/ui/PonderUI.java deleted file mode 100644 index b0258e4038..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/ui/PonderUI.java +++ /dev/null @@ -1,1026 +0,0 @@ -package com.simibubi.create.foundation.ponder.ui; - -import static com.simibubi.create.foundation.ponder.PonderLocalization.LANG_PREFIX; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Random; -import java.util.stream.IntStream; - -import com.mojang.blaze3d.platform.ClipboardManager; -import com.mojang.blaze3d.platform.Window; -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.math.Matrix4f; -import com.mojang.math.Vector3f; -import com.simibubi.create.Create; -import com.simibubi.create.foundation.config.AllConfigs; -import com.simibubi.create.foundation.gui.AllGuiTextures; -import com.simibubi.create.foundation.gui.AllIcons; -import com.simibubi.create.foundation.gui.ScreenOpener; -import com.simibubi.create.foundation.gui.Theme; -import com.simibubi.create.foundation.gui.UIRenderHelper; -import com.simibubi.create.foundation.gui.element.BoxElement; -import com.simibubi.create.foundation.gui.element.GuiGameElement; -import com.simibubi.create.foundation.ponder.PonderChapter; -import com.simibubi.create.foundation.ponder.PonderRegistry; -import com.simibubi.create.foundation.ponder.PonderScene; -import com.simibubi.create.foundation.ponder.PonderScene.SceneTransform; -import com.simibubi.create.foundation.ponder.PonderStoryBoardEntry; -import com.simibubi.create.foundation.ponder.PonderTag; -import com.simibubi.create.foundation.ponder.PonderWorld; -import com.simibubi.create.foundation.ponder.content.DebugScenes; -import com.simibubi.create.foundation.ponder.content.PonderIndex; -import com.simibubi.create.foundation.ponder.element.TextWindowElement; -import com.simibubi.create.foundation.render.SuperRenderTypeBuffer; -import com.simibubi.create.foundation.utility.Color; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.FontHelper; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.Pair; -import com.simibubi.create.foundation.utility.Pointing; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; -import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; - -import net.minecraft.ChatFormatting; -import net.minecraft.client.Minecraft; -import net.minecraft.client.Options; -import net.minecraft.client.gui.Font; -import net.minecraft.client.gui.components.events.GuiEventListener; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.network.chat.MutableComponent; -import net.minecraft.network.chat.Style; -import net.minecraft.network.chat.TextComponent; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.Mth; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.levelgen.structure.BoundingBox; -import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; -import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; -import net.minecraft.world.phys.Vec3; -import net.minecraftforge.client.gui.GuiUtils; -import net.minecraftforge.registries.ForgeRegistries; - -public class PonderUI extends NavigatableSimiScreen { - - public static int ponderTicks; - public static float ponderPartialTicksPaused; - - public static final String PONDERING = LANG_PREFIX + "pondering"; - public static final String IDENTIFY_MODE = LANG_PREFIX + "identify_mode"; - public static final String IN_CHAPTER = LANG_PREFIX + "in_chapter"; - public static final String IDENTIFY = LANG_PREFIX + "identify"; - public static final String PREVIOUS = LANG_PREFIX + "previous"; - public static final String CLOSE = LANG_PREFIX + "close"; - public static final String NEXT = LANG_PREFIX + "next"; - public static final String NEXT_UP = LANG_PREFIX + "next_up"; - public static final String REPLAY = LANG_PREFIX + "replay"; - public static final String SLOW_TEXT = LANG_PREFIX + "slow_text"; - - private List scenes; - private List tags; - private List tagButtons; - private List tagFades; - private LerpedFloat fadeIn; - ItemStack stack; - PonderChapter chapter = null; - - private boolean userViewMode; - private boolean identifyMode; - private ItemStack hoveredTooltipItem; - private BlockPos hoveredBlockPos; - - private ClipboardManager clipboardHelper; - private BlockPos copiedBlockPos; - - private LerpedFloat finishingFlash; - private LerpedFloat nextUp; - private int finishingFlashWarmup = 0; - private int nextUpWarmup = 0; - - private LerpedFloat lazyIndex; - private int index = 0; - private PonderTag referredToByTag; - - private PonderButton left, right, scan, chap, userMode, close, replay, slowMode; - private int skipCooling = 0; - - private int extendedTickLength = 0; - private int extendedTickTimer = 0; - - public static PonderUI of(ResourceLocation id) { - return new PonderUI(PonderRegistry.compile(id)); - } - - public static PonderUI of(ItemStack item) { - return new PonderUI(PonderRegistry.compile(item.getItem() - .getRegistryName())); - } - - public static PonderUI of(ItemStack item, PonderTag tag) { - PonderUI ponderUI = new PonderUI(PonderRegistry.compile(item.getItem() - .getRegistryName())); - ponderUI.referredToByTag = tag; - return ponderUI; - } - - public static PonderUI of(PonderChapter chapter) { - PonderUI ui = new PonderUI(PonderRegistry.compile(chapter)); - ui.chapter = chapter; - return ui; - } - - PonderUI(List scenes) { - ResourceLocation component = scenes.get(0) - .getComponent(); - if (ForgeRegistries.ITEMS.containsKey(component)) - stack = new ItemStack(ForgeRegistries.ITEMS.getValue(component)); - else - stack = new ItemStack(ForgeRegistries.BLOCKS.getValue(component)); - - tags = new ArrayList<>(PonderRegistry.TAGS.getTags(component)); - this.scenes = scenes; - if (scenes.isEmpty()) { - List l = Collections.singletonList(new PonderStoryBoardEntry(DebugScenes::empty, - Create.ID, "debug/scene_1", new ResourceLocation("minecraft", "stick"))); - scenes.addAll(PonderRegistry.compile(l)); - } - lazyIndex = LerpedFloat.linear() - .startWithValue(index); - fadeIn = LerpedFloat.linear() - .startWithValue(0) - .chase(1, .1f, Chaser.EXP); - clipboardHelper = new ClipboardManager(); - finishingFlash = LerpedFloat.linear() - .startWithValue(0) - .chase(0, .1f, Chaser.EXP); - nextUp = LerpedFloat.linear() - .startWithValue(0) - .chase(0, .4f, Chaser.EXP); - } - - @Override - protected void init() { - super.init(); - - tagButtons = new ArrayList<>(); - tagFades = new ArrayList<>(); - - tags.forEach(t -> { - int i = tagButtons.size(); - int x = 31; - int y = 81 + i * 30; - - PonderButton b2 = new PonderButton(x, y).showing(t) - .withCallback((mX, mY) -> { - centerScalingOn(mX, mY); - ScreenOpener.transitionTo(new PonderTagScreen(t)); - }); - - addRenderableWidget(b2); - tagButtons.add(b2); - - LerpedFloat chase = LerpedFloat.linear() - .startWithValue(0) - .chase(0, .05f, Chaser.exp(.1)); - tagFades.add(chase); - - }); - - /* - * if (chapter != null) { widgets.add(chap = new PonderButton(width - 31 - 24, - * 31, () -> { }).showing(chapter)); } - */ - - Options bindings = minecraft.options; - int spacing = 8; - int bX = (width - 20) / 2 - (70 + 2 * spacing); - int bY = height - 20 - 31; - - { - int pX = (width / 2) - 110; - int pY = bY + 20 + 4; - int pW = width - 2 * pX; - addRenderableWidget(new PonderProgressBar(this, pX, pY, pW, 1)); - } - - addRenderableWidget(scan = new PonderButton(bX, bY).withShortcut(bindings.keyDrop) - .showing(AllIcons.I_MTD_SCAN) - .enableFade(0, 5) - .withCallback(() -> { - identifyMode = !identifyMode; - if (!identifyMode) - scenes.get(index) - .deselect(); - else - ponderPartialTicksPaused = minecraft.getFrameTime(); - })); - scan.atZLevel(600); - - addRenderableWidget(slowMode = new PonderButton(width - 20 - 31, bY).showing(AllIcons.I_MTD_SLOW_MODE) - .enableFade(0, 5) - .withCallback(() -> setComfyReadingEnabled(!isComfyReadingEnabled()))); - - if (PonderIndex.editingModeActive()) { - addRenderableWidget(userMode = new PonderButton(width - 50 - 31, bY).showing(AllIcons.I_MTD_USER_MODE) - .enableFade(0, 5) - .withCallback(() -> userViewMode = !userViewMode)); - } - - bX += 50 + spacing; - addRenderableWidget(left = new PonderButton(bX, bY).withShortcut(bindings.keyLeft) - .showing(AllIcons.I_MTD_LEFT) - .enableFade(0, 5) - .withCallback(() -> this.scroll(false))); - - bX += 20 + spacing; - addRenderableWidget(close = new PonderButton(bX, bY).withShortcut(bindings.keyInventory) - .showing(AllIcons.I_MTD_CLOSE) - .enableFade(0, 5) - .withCallback(this::onClose)); - - bX += 20 + spacing; - addRenderableWidget(right = new PonderButton(bX, bY).withShortcut(bindings.keyRight) - .showing(AllIcons.I_MTD_RIGHT) - .enableFade(0, 5) - .withCallback(() -> this.scroll(true))); - - bX += 50 + spacing; - addRenderableWidget(replay = new PonderButton(bX, bY).withShortcut(bindings.keyDown) - .showing(AllIcons.I_MTD_REPLAY) - .enableFade(0, 5) - .withCallback(this::replay)); - } - - @Override - protected void initBackTrackIcon(PonderButton backTrack) { - backTrack.showing(stack); - } - - @Override - public void tick() { - super.tick(); - - if (skipCooling > 0) - skipCooling--; - - if (referredToByTag != null) { - for (int i = 0; i < scenes.size(); i++) { - PonderScene ponderScene = scenes.get(i); - if (!ponderScene.getTags() - .contains(referredToByTag)) - continue; - if (i == index) - break; - scenes.get(index) - .fadeOut(); - index = i; - scenes.get(index) - .begin(); - lazyIndex.chase(index, 1 / 4f, Chaser.EXP); - identifyMode = false; - break; - } - referredToByTag = null; - } - - lazyIndex.tickChaser(); - fadeIn.tickChaser(); - finishingFlash.tickChaser(); - nextUp.tickChaser(); - PonderScene activeScene = scenes.get(index); - - extendedTickLength = 0; - if (isComfyReadingEnabled()) - activeScene.forEachVisible(TextWindowElement.class, twe -> extendedTickLength = 2); - - if (extendedTickTimer == 0) { - if (!identifyMode) { - ponderTicks++; - if (skipCooling == 0) - activeScene.tick(); - } - - if (!identifyMode) { - float lazyIndexValue = lazyIndex.getValue(); - if (Math.abs(lazyIndexValue - index) > 1 / 512f) - scenes.get(lazyIndexValue < index ? index - 1 : index + 1) - .tick(); - } - extendedTickTimer = extendedTickLength; - } else - extendedTickTimer--; - - if (activeScene.getCurrentTime() == activeScene.getTotalTime() - 1) { - finishingFlashWarmup = 30; - nextUpWarmup = 50; - } - - if (finishingFlashWarmup > 0) { - finishingFlashWarmup--; - if (finishingFlashWarmup == 0) { - finishingFlash.setValue(1); - finishingFlash.setValue(1); - } - } - - if (nextUpWarmup > 0) { - nextUpWarmup--; - if (nextUpWarmup == 0) - nextUp.updateChaseTarget(1); - } - - updateIdentifiedItem(activeScene); - } - - public PonderScene getActiveScene() { - return scenes.get(index); - } - - public void seekToTime(int time) { - if (getActiveScene().getCurrentTime() > time) - replay(); - - getActiveScene().seekToTime(time); - if (time != 0) - coolDownAfterSkip(); - } - - public void updateIdentifiedItem(PonderScene activeScene) { - hoveredTooltipItem = ItemStack.EMPTY; - hoveredBlockPos = null; - if (!identifyMode) - return; - - Window w = minecraft.getWindow(); - double mouseX = minecraft.mouseHandler.xpos() * w.getGuiScaledWidth() / w.getScreenWidth(); - double mouseY = minecraft.mouseHandler.ypos() * w.getGuiScaledHeight() / w.getScreenHeight(); - SceneTransform t = activeScene.getTransform(); - Vec3 vec1 = t.screenToScene(mouseX, mouseY, 1000, 0); - Vec3 vec2 = t.screenToScene(mouseX, mouseY, -100, 0); - Pair pair = activeScene.rayTraceScene(vec1, vec2); - hoveredTooltipItem = pair.getFirst(); - hoveredBlockPos = pair.getSecond(); - } - - @Override - public boolean mouseScrolled(double mouseX, double mouseY, double delta) { - if (scroll(delta > 0)) - return true; - return super.mouseScrolled(mouseX, mouseY, delta); - } - - protected void replay() { - identifyMode = false; - PonderScene scene = scenes.get(index); - - if (hasShiftDown()) { - List list = PonderRegistry.ALL.get(scene.getComponent()); - PonderStoryBoardEntry sb = list.get(index); - StructureTemplate activeTemplate = PonderRegistry.loadSchematic(sb.getSchematicLocation()); - PonderWorld world = new PonderWorld(BlockPos.ZERO, Minecraft.getInstance().level); - activeTemplate.placeInWorld(world, BlockPos.ZERO, BlockPos.ZERO, new StructurePlaceSettings(), new Random(), - Block.UPDATE_CLIENTS); - world.createBackup(); - scene = PonderRegistry.compileScene(index, sb, world); - scene.begin(); - scenes.set(index, scene); - } - - scene.begin(); - } - - protected boolean scroll(boolean forward) { - int prevIndex = index; - index = forward ? index + 1 : index - 1; - index = Mth.clamp(index, 0, scenes.size() - 1); - if (prevIndex != index) {// && Math.abs(index - lazyIndex.getValue()) < 1.5f) { - scenes.get(prevIndex) - .fadeOut(); - scenes.get(index) - .begin(); - lazyIndex.chase(index, 1 / 4f, Chaser.EXP); - identifyMode = false; - return true; - } else - index = prevIndex; - return false; - } - - @Override - protected void renderWindow(PoseStack ms, int mouseX, int mouseY, float partialTicks) { - partialTicks = getPartialTicks(); - RenderSystem.enableBlend(); - renderVisibleScenes(ms, mouseX, mouseY, - skipCooling > 0 ? 0 : identifyMode ? ponderPartialTicksPaused : partialTicks); - renderWidgets(ms, mouseX, mouseY, identifyMode ? ponderPartialTicksPaused : partialTicks); - } - - @Override - public void renderBackground(PoseStack ms) { - super.renderBackground(ms); - } - - protected void renderVisibleScenes(PoseStack ms, int mouseX, int mouseY, float partialTicks) { - renderScene(ms, mouseX, mouseY, index, partialTicks); - float lazyIndexValue = lazyIndex.getValue(partialTicks); - if (Math.abs(lazyIndexValue - index) > 1 / 512f) - renderScene(ms, mouseX, mouseY, lazyIndexValue < index ? index - 1 : index + 1, partialTicks); - } - - protected void renderScene(PoseStack ms, int mouseX, int mouseY, int i, float partialTicks) { - SuperRenderTypeBuffer buffer = SuperRenderTypeBuffer.getInstance(); - PonderScene story = scenes.get(i); - double value = lazyIndex.getValue(minecraft.getFrameTime()); - double diff = i - value; - double slide = Mth.lerp(diff * diff, 200, 600) * diff; - - RenderSystem.enableBlend(); - RenderSystem.enableDepthTest(); - RenderSystem.backupProjectionMatrix(); - - // has to be outside of MS transforms, important for vertex sorting - Matrix4f matrix4f = new Matrix4f(RenderSystem.getProjectionMatrix()); - matrix4f.multiplyWithTranslation(0, 0, 800); - RenderSystem.setProjectionMatrix(matrix4f); - - ms.pushPose(); - ms.translate(0, 0, -800); - story.getTransform() - .updateScreenParams(width, height, slide); - story.getTransform() - .apply(ms, partialTicks, false); - story.getTransform() - .updateSceneRVE(partialTicks); - story.renderScene(buffer, ms, partialTicks); - buffer.draw(); - - BoundingBox bounds = story.getBounds(); - ms.pushPose(); - - // kool shadow fx - { - RenderSystem.enableCull(); - RenderSystem.enableDepthTest(); - ms.pushPose(); - ms.translate(story.getBasePlateOffsetX(), 0, story.getBasePlateOffsetZ()); - UIRenderHelper.flipForGuiRender(ms); - - float flash = finishingFlash.getValue(partialTicks) * .9f; - float alpha = flash; - flash *= flash; - flash = ((flash * 2) - 1); - flash *= flash; - flash = 1 - flash; - - for (int f = 0; f < 4; f++) { - ms.translate(story.getBasePlateSize(), 0, 0); - ms.pushPose(); - ms.translate(0, 0, -1 / 1024f); - if (flash > 0) { - ms.pushPose(); - ms.scale(1, .5f + flash * .75f, 1); - GuiUtils.drawGradientRect(ms.last() - .pose(), 0, 0, -1, -story.getBasePlateSize(), 0, 0x00_c6ffc9, - new Color(0xaa_c6ffc9).scaleAlpha(alpha) - .getRGB()); - ms.popPose(); - } - ms.translate(0, 0, 2 / 1024f); - GuiUtils.drawGradientRect(ms.last() - .pose(), 0, 0, 0, -story.getBasePlateSize(), 4, 0x66_000000, 0x00_000000); - ms.popPose(); - ms.mulPose(Vector3f.YP.rotationDegrees(-90)); - } - ms.popPose(); - RenderSystem.disableCull(); - RenderSystem.disableDepthTest(); - } - - // coords for debug - if (PonderIndex.editingModeActive() && !userViewMode) { - - ms.scale(-1, -1, 1); - ms.scale(1 / 16f, 1 / 16f, 1 / 16f); - ms.translate(1, -8, -1 / 64f); - - // X AXIS - ms.pushPose(); - ms.translate(4, -3, 0); - ms.translate(0, 0, -2 / 1024f); - for (int x = 0; x <= bounds.getXSpan(); x++) { - ms.translate(-16, 0, 0); - font.draw(ms, x == bounds.getXSpan() ? "x" : "" + x, 0, 0, 0xFFFFFFFF); - } - ms.popPose(); - - // Z AXIS - ms.pushPose(); - ms.scale(-1, 1, 1); - ms.translate(0, -3, -4); - ms.mulPose(Vector3f.YP.rotationDegrees(-90)); - ms.translate(-8, -2, 2 / 64f); - for (int z = 0; z <= bounds.getZSpan(); z++) { - ms.translate(16, 0, 0); - font.draw(ms, z == bounds.getZSpan() ? "z" : "" + z, 0, 0, 0xFFFFFFFF); - } - ms.popPose(); - - // DIRECTIONS - ms.pushPose(); - ms.translate(bounds.getXSpan() * -8, 0, bounds.getZSpan() * 8); - ms.mulPose(Vector3f.YP.rotationDegrees(-90)); - for (Direction d : Iterate.horizontalDirections) { - ms.mulPose(Vector3f.YP.rotationDegrees(90)); - ms.pushPose(); - ms.translate(0, 0, bounds.getZSpan() * 16); - ms.mulPose(Vector3f.XP.rotationDegrees(-90)); - font.draw(ms, d.name() - .substring(0, 1), 0, 0, 0x66FFFFFF); - font.draw(ms, "|", 2, 10, 0x44FFFFFF); - font.draw(ms, ".", 2, 14, 0x22FFFFFF); - ms.popPose(); - } - ms.popPose(); - buffer.draw(); - } - - ms.popPose(); - ms.popPose(); - RenderSystem.restoreProjectionMatrix(); - } - - protected void renderWidgets(PoseStack ms, int mouseX, int mouseY, float partialTicks) { - RenderSystem.disableDepthTest(); - - float fade = fadeIn.getValue(partialTicks); - float lazyIndexValue = lazyIndex.getValue(partialTicks); - float indexDiff = Math.abs(lazyIndexValue - index); - PonderScene activeScene = scenes.get(index); - PonderScene nextScene = scenes.size() > index + 1 ? scenes.get(index + 1) : null; - - boolean noWidgetsHovered = true; - for (GuiEventListener child : children()) - noWidgetsHovered &= !child.isMouseOver(mouseX, mouseY); - - int tooltipColor = Theme.i(Theme.Key.TEXT_DARKER); - { - // Chapter title - ms.pushPose(); - ms.translate(0, 0, 400); - int x = 31 + 20 + 8; - int y = 31; - - String title = activeScene.getTitle(); - int wordWrappedHeight = font.wordWrapHeight(title, left.x - 51); - - int streakHeight = 35 - 9 + wordWrappedHeight; - UIRenderHelper.streak(ms, 0, x - 4, y - 12 + streakHeight / 2, streakHeight, (int) (150 * fade)); - UIRenderHelper.streak(ms, 180, x - 4, y - 12 + streakHeight / 2, streakHeight, (int) (30 * fade)); - new BoxElement().withBackground(Theme.c(Theme.Key.PONDER_BACKGROUND_FLAT)) - .gradientBorder(Theme.p(Theme.Key.PONDER_IDLE)) - .at(21, 21, 100) - .withBounds(30, 30) - .render(ms); - - GuiGameElement.of(stack) - .scale(2) - .at(x - 39, y - 11) - .render(ms); - - font.draw(ms, Lang.translateDirect(PONDERING), x, y - 6, tooltipColor); - y += 8; - x += 0; - ms.translate(x, y, 0); - ms.mulPose(Vector3f.XN.rotationDegrees(indexDiff * -75)); - ms.translate(0, 0, 5); - FontHelper.drawSplitString(ms, font, title, 0, 0, left.x - 51, Theme.c(Theme.Key.TEXT) - .scaleAlpha(1 - indexDiff) - .getRGB()); - ms.popPose(); - - if (chapter != null) { - ms.pushPose(); - - ms.translate(chap.x - 4 - 4, chap.y, 0); - UIRenderHelper.streak(ms, 180, 4, 10, 26, (int) (150 * fade)); - - drawRightAlignedString(font, ms, Lang.translateDirect(IN_CHAPTER) - .getString(), 0, 0, tooltipColor); - drawRightAlignedString(font, ms, chapter.getTitle(), 0, 12, Theme.i(Theme.Key.TEXT)); - - ms.popPose(); - } - - Color c1 = Theme.c(Theme.Key.PONDER_BACK_ARROW) - .setAlpha(0x40); - Color c2 = Theme.c(Theme.Key.PONDER_BACK_ARROW) - .setAlpha(0x20); - Color c3 = Theme.c(Theme.Key.PONDER_BACK_ARROW) - .setAlpha(0x10); - UIRenderHelper.breadcrumbArrow(ms, width / 2 - 20, height - 51, 0, 20, 20, 5, c1, c2); - UIRenderHelper.breadcrumbArrow(ms, width / 2 + 20, height - 51, 0, -20, 20, -5, c1, c2); - UIRenderHelper.breadcrumbArrow(ms, width / 2 - 90, height - 51, 0, 70, 20, 5, c1, c3); - UIRenderHelper.breadcrumbArrow(ms, width / 2 + 90, height - 51, 0, -70, 20, -5, c1, c3); - } - - if (identifyMode) { - if (noWidgetsHovered && mouseY < height - 80) { - ms.pushPose(); - ms.translate(mouseX, mouseY, 100); - if (hoveredTooltipItem.isEmpty()) { - MutableComponent text = Lang - .translateDirect(IDENTIFY_MODE, - ((MutableComponent) minecraft.options.keyDrop.getTranslatedKeyMessage()) - .withStyle(ChatFormatting.WHITE)) - .withStyle(ChatFormatting.GRAY); - - // renderOrderedTooltip(ms, textRenderer.wrapLines(text, width / 3), 0, 0); - renderComponentTooltip(ms, font.getSplitter() - .splitLines(text, width / 3, Style.EMPTY), 0, 0, font); - /* - * String tooltip = Lang .createTranslationTextComponent(IDENTIFY_MODE, - * client.gameSettings.keyBindDrop.getBoundKeyLocalizedText().applyTextStyle( - * TextFormatting.WHITE)) .applyTextStyle(TextFormatting.GRAY) - * .getFormattedText(); renderTooltip(font.listFormattedStringToWidth(tooltip, - * width / 3), 0, 0); - */ - } else - renderTooltip(ms, hoveredTooltipItem, 0, 0); - if (hoveredBlockPos != null && PonderIndex.editingModeActive() && !userViewMode) { - ms.translate(0, -15, 0); - boolean copied = copiedBlockPos != null && hoveredBlockPos.equals(copiedBlockPos); - MutableComponent coords = new TextComponent( - hoveredBlockPos.getX() + ", " + hoveredBlockPos.getY() + ", " + hoveredBlockPos.getZ()) - .withStyle(copied ? ChatFormatting.GREEN : ChatFormatting.GOLD); - renderTooltip(ms, coords, 0, 0); - } - ms.popPose(); - } - scan.flash(); - } else { - scan.dim(); - } - - if (PonderIndex.editingModeActive()) { - if (userViewMode) - userMode.flash(); - else - userMode.dim(); - } - - if (isComfyReadingEnabled()) - slowMode.flash(); - else - slowMode.dim(); - - { - // Scene overlay - float scenePT = skipCooling > 0 ? 0 : partialTicks; - ms.pushPose(); - ms.translate(0, 0, 100); - renderOverlay(ms, index, scenePT); - if (indexDiff > 1 / 512f) - renderOverlay(ms, lazyIndexValue < index ? index - 1 : index + 1, scenePT); - ms.popPose(); - } - - boolean finished = activeScene.isFinished(); - - // Next up: - if (finished && nextScene != null && nextUp.getValue() > 1 / 16f && !nextScene.getId() - .equals(Create.asResource("creative_motor_mojang"))) { - ms.pushPose(); - ms.translate(right.x + 10, right.y - 6 + nextUp.getValue(partialTicks) * 5, 400); - int boxWidth = (Math.max(font.width(nextScene.getTitle()), font.width(Lang.translateDirect(NEXT_UP))) + 5); - renderSpeechBox(ms, 0, 0, boxWidth, 20, right.isHoveredOrFocused(), Pointing.DOWN, false); - ms.translate(0, -29, 100); - drawCenteredString(ms, font, Lang.translateDirect(NEXT_UP), 0, 0, Theme.i(Theme.Key.TEXT_DARKER)); - drawCenteredString(ms, font, nextScene.getTitle(), 0, 10, Theme.i(Theme.Key.TEXT)); - ms.popPose(); - } - - // Widgets - renderables.forEach(w -> { - if (w instanceof PonderButton button) { - button.fade() - .startWithValue(fade); - } - }); - - if (index == 0 || index == 1 && lazyIndexValue < index) - left.fade() - .startWithValue(lazyIndexValue); - if (index == scenes.size() - 1 || index == scenes.size() - 2 && lazyIndexValue > index) - right.fade() - .startWithValue(scenes.size() - lazyIndexValue - 1); - - if (finished) - right.flash(); - else { - right.dim(); - nextUp.updateChaseTarget(0); - } - - // Tags - List sceneTags = activeScene.getTags(); - boolean highlightAll = sceneTags.contains(PonderTag.Highlight.ALL); - double s = Minecraft.getInstance() - .getWindow() - .getGuiScale(); - IntStream.range(0, tagButtons.size()) - .forEach(i -> { - ms.pushPose(); - LerpedFloat chase = tagFades.get(i); - PonderButton button = tagButtons.get(i); - if (button.isMouseOver(mouseX, mouseY)) { - chase.updateChaseTarget(1); - } else - chase.updateChaseTarget(0); - - chase.tickChaser(); - - if (highlightAll) - button.flash(); - else - button.dim(); - - int x = button.x + button.getWidth() + 4; - int y = button.y - 2; - ms.translate(x, y + 5 * (1 - fade), 800); - - float fadedWidth = 200 * chase.getValue(partialTicks); - UIRenderHelper.streak(ms, 0, 0, 12, 26, (int) fadedWidth); - - RenderSystem.enableScissor((int) (x * s), 0, (int) (fadedWidth * s), (int) (height * s)); - - String tagName = this.tags.get(i) - .getTitle(); - font.draw(ms, tagName, 3, 8, Theme.i(Theme.Key.TEXT_ACCENT_SLIGHT)); - - RenderSystem.disableScissor(); - - ms.popPose(); - }); - - ms.pushPose(); - ms.translate(0, 0, 500); - int tooltipY = height - 16; - if (scan.isHoveredOrFocused()) - drawCenteredString(ms, font, Lang.translateDirect(IDENTIFY), scan.x + 10, tooltipY, tooltipColor); - if (index != 0 && left.isHoveredOrFocused()) - drawCenteredString(ms, font, Lang.translateDirect(PREVIOUS), left.x + 10, tooltipY, tooltipColor); - if (close.isHoveredOrFocused()) - drawCenteredString(ms, font, Lang.translateDirect(CLOSE), close.x + 10, tooltipY, tooltipColor); - if (index != scenes.size() - 1 && right.isHoveredOrFocused()) - drawCenteredString(ms, font, Lang.translateDirect(NEXT), right.x + 10, tooltipY, tooltipColor); - if (replay.isHoveredOrFocused()) - drawCenteredString(ms, font, Lang.translateDirect(REPLAY), replay.x + 10, tooltipY, tooltipColor); - if (slowMode.isHoveredOrFocused()) - drawCenteredString(ms, font, Lang.translateDirect(SLOW_TEXT), slowMode.x + 5, tooltipY, tooltipColor); - if (PonderIndex.editingModeActive() && userMode.isHoveredOrFocused()) - drawCenteredString(ms, font, "Editor View", userMode.x + 10, tooltipY, tooltipColor); - ms.popPose(); - - RenderSystem.enableDepthTest(); - } - - private void renderOverlay(PoseStack ms, int i, float partialTicks) { - if (identifyMode) - return; - ms.pushPose(); - PonderScene story = scenes.get(i); - story.renderOverlay(this, ms, skipCooling > 0 ? 0 : identifyMode ? ponderPartialTicksPaused : partialTicks); - ms.popPose(); - } - - @Override - public boolean mouseClicked(double x, double y, int button) { - if (identifyMode && hoveredBlockPos != null && PonderIndex.editingModeActive()) { - long handle = minecraft.getWindow() - .getWindow(); - if (copiedBlockPos != null && button == 1) { - clipboardHelper.setClipboard(handle, - "util.select.fromTo(" + copiedBlockPos.getX() + ", " + copiedBlockPos.getY() + ", " - + copiedBlockPos.getZ() + ", " + hoveredBlockPos.getX() + ", " + hoveredBlockPos.getY() + ", " - + hoveredBlockPos.getZ() + ")"); - copiedBlockPos = hoveredBlockPos; - return true; - } - - if (hasShiftDown()) - clipboardHelper.setClipboard(handle, "util.select.position(" + hoveredBlockPos.getX() + ", " - + hoveredBlockPos.getY() + ", " + hoveredBlockPos.getZ() + ")"); - else - clipboardHelper.setClipboard(handle, "util.grid.at(" + hoveredBlockPos.getX() + ", " - + hoveredBlockPos.getY() + ", " + hoveredBlockPos.getZ() + ")"); - copiedBlockPos = hoveredBlockPos; - return true; - } - - return super.mouseClicked(x, y, button); - } - - @Override - public boolean keyPressed(int code, int p_keyPressed_2_, int p_keyPressed_3_) { - Options settings = Minecraft.getInstance().options; - int sCode = settings.keyDown.getKey() - .getValue(); - int aCode = settings.keyLeft.getKey() - .getValue(); - int dCode = settings.keyRight.getKey() - .getValue(); - int qCode = settings.keyDrop.getKey() - .getValue(); - - if (code == sCode) { - replay(); - return true; - } - - if (code == aCode) { - scroll(false); - return true; - } - - if (code == dCode) { - scroll(true); - return true; - } - - if (code == qCode) { - identifyMode = !identifyMode; - if (!identifyMode) - scenes.get(index) - .deselect(); - return true; - } - - return super.keyPressed(code, p_keyPressed_2_, p_keyPressed_3_); - } - - @Override - protected String getBreadcrumbTitle() { - if (chapter != null) - return chapter.getTitle(); - - return stack.getItem() - .getDescription() - .getString(); - } - - public Font getFontRenderer() { - return font; - } - - protected boolean isMouseOver(double mouseX, double mouseY, int x, int y, int w, int h) { - boolean hovered = !(mouseX < x || mouseX > x + w); - hovered &= !(mouseY < y || mouseY > y + h); - return hovered; - } - - public static void renderSpeechBox(PoseStack ms, int x, int y, int w, int h, boolean highlighted, Pointing pointing, - boolean returnWithLocalTransform) { - if (!returnWithLocalTransform) - ms.pushPose(); - - int boxX = x; - int boxY = y; - int divotX = x; - int divotY = y; - int divotRotation = 0; - int divotSize = 8; - int distance = 1; - int divotRadius = divotSize / 2; - Couple borderColors = Theme.p(highlighted ? Theme.Key.PONDER_BUTTON_HOVER : Theme.Key.PONDER_IDLE); - Color c; - - switch (pointing) { - default: - case DOWN: - divotRotation = 0; - boxX -= w / 2; - boxY -= h + divotSize + 1 + distance; - divotX -= divotRadius; - divotY -= divotSize + distance; - c = borderColors.getSecond(); - break; - case LEFT: - divotRotation = 90; - boxX += divotSize + 1 + distance; - boxY -= h / 2; - divotX += distance; - divotY -= divotRadius; - c = Color.mixColors(borderColors, 0.5f); - break; - case RIGHT: - divotRotation = 270; - boxX -= w + divotSize + 1 + distance; - boxY -= h / 2; - divotX -= divotSize + distance; - divotY -= divotRadius; - c = Color.mixColors(borderColors, 0.5f); - break; - case UP: - divotRotation = 180; - boxX -= w / 2; - boxY += divotSize + 1 + distance; - divotX -= divotRadius; - divotY += distance; - c = borderColors.getFirst(); - break; - } - - new BoxElement().withBackground(Theme.c(Theme.Key.PONDER_BACKGROUND_FLAT)) - .gradientBorder(borderColors) - .at(boxX, boxY, 100) - .withBounds(w, h) - .render(ms); - - ms.pushPose(); - ms.translate(divotX + divotRadius, divotY + divotRadius, 10); - ms.mulPose(Vector3f.ZP.rotationDegrees(divotRotation)); - ms.translate(-divotRadius, -divotRadius, 0); - AllGuiTextures.SPEECH_TOOLTIP_BACKGROUND.render(ms, 0, 0); - AllGuiTextures.SPEECH_TOOLTIP_COLOR.render(ms, 0, 0, c); - ms.popPose(); - - if (returnWithLocalTransform) { - ms.translate(boxX, boxY, 0); - return; - } - - ms.popPose(); - - } - - public ItemStack getHoveredTooltipItem() { - return hoveredTooltipItem; - } - - public ItemStack getSubject() { - return stack; - } - - @Override - public boolean isEquivalentTo(NavigatableSimiScreen other) { - if (other instanceof PonderUI) - return stack.sameItem(((PonderUI) other).stack); - return super.isEquivalentTo(other); - } - - @Override - public void shareContextWith(NavigatableSimiScreen other) { - if (other instanceof PonderUI) { - PonderUI ponderUI = (PonderUI) other; - ponderUI.referredToByTag = referredToByTag; - } - } - - public static float getPartialTicks() { - float renderPartialTicks = Minecraft.getInstance() - .getFrameTime(); - - if (Minecraft.getInstance().screen instanceof PonderUI) { - PonderUI ui = (PonderUI) Minecraft.getInstance().screen; - if (ui.identifyMode) - return ponderPartialTicksPaused; - - return (renderPartialTicks + (ui.extendedTickLength - ui.extendedTickTimer)) / (ui.extendedTickLength + 1); - } - - return renderPartialTicks; - } - - @Override - public boolean isPauseScreen() { - return true; - } - - public void coolDownAfterSkip() { - skipCooling = 15; - } - - @Override - public void removed() { - super.removed(); - hoveredTooltipItem = ItemStack.EMPTY; - } - - public void drawRightAlignedString(Font fontRenderer, PoseStack ms, String string, int x, int y, int color) { - fontRenderer.draw(ms, string, (float) (x - fontRenderer.width(string)), (float) y, color); - } - - public boolean isComfyReadingEnabled() { - return AllConfigs.CLIENT.comfyReading.get(); - } - - public void setComfyReadingEnabled(boolean slowTextMode) { - AllConfigs.CLIENT.comfyReading.set(slowTextMode); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/render/CachedBufferer.java b/src/main/java/com/simibubi/create/foundation/render/CachedBufferer.java index 278f51c43c..de205a5f69 100644 --- a/src/main/java/com/simibubi/create/foundation/render/CachedBufferer.java +++ b/src/main/java/com/simibubi/create/foundation/render/CachedBufferer.java @@ -11,8 +11,8 @@ import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.CreateClient; import com.simibubi.create.foundation.render.SuperByteBufferCache.Compartment; -import com.simibubi.create.foundation.utility.AngleHelper; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.core.Direction; import net.minecraft.world.level.block.state.BlockState; diff --git a/src/main/java/com/simibubi/create/foundation/render/RenderTypes.java b/src/main/java/com/simibubi/create/foundation/render/RenderTypes.java index a3cb7035f1..b86325117c 100644 --- a/src/main/java/com/simibubi/create/foundation/render/RenderTypes.java +++ b/src/main/java/com/simibubi/create/foundation/render/RenderTypes.java @@ -4,7 +4,6 @@ import java.io.IOException; import com.mojang.blaze3d.vertex.DefaultVertexFormat; import com.mojang.blaze3d.vertex.VertexFormat; -import com.simibubi.create.AllSpecialTextures; import com.simibubi.create.Create; import net.minecraft.client.renderer.RenderStateShard; @@ -23,33 +22,6 @@ public class RenderTypes extends RenderStateShard { public static final RenderStateShard.ShaderStateShard GLOWING_SHADER = new RenderStateShard.ShaderStateShard(() -> Shaders.glowingShader); - private static final RenderType OUTLINE_SOLID = - RenderType.create(createLayerName("outline_solid"), DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, false, - false, RenderType.CompositeState.builder() - .setShaderState(RENDERTYPE_ENTITY_SOLID_SHADER) - .setTextureState(new RenderStateShard.TextureStateShard(AllSpecialTextures.BLANK.getLocation(), false, false)) - .setCullState(CULL) - .setLightmapState(LIGHTMAP) - .setOverlayState(OVERLAY) - .createCompositeState(false)); - - public static RenderType getOutlineSolid() { - return OUTLINE_SOLID; - } - - public static RenderType getOutlineTranslucent(ResourceLocation texture, boolean cull) { - return RenderType.create(createLayerName("outline_translucent" + (cull ? "_cull" : "")), - DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, false, true, RenderType.CompositeState.builder() - .setShaderState(cull ? RENDERTYPE_ENTITY_TRANSLUCENT_CULL_SHADER : RENDERTYPE_ENTITY_TRANSLUCENT_SHADER) - .setTextureState(new RenderStateShard.TextureStateShard(texture, false, false)) - .setTransparencyState(TRANSLUCENT_TRANSPARENCY) - .setCullState(cull ? CULL : NO_CULL) - .setLightmapState(LIGHTMAP) - .setOverlayState(OVERLAY) - .setWriteMaskState(COLOR_WRITE) - .createCompositeState(false)); - } - public static RenderType getGlowingSolid(ResourceLocation texture) { return RenderType.create(createLayerName("glowing_solid"), DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, true, false, RenderType.CompositeState.builder() @@ -125,19 +97,6 @@ public class RenderTypes extends RenderStateShard { return ITEM_PARTIAL_TRANSLUCENT; } - private static final RenderType FLUID = RenderType.create(createLayerName("fluid"), - DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, false, true, RenderType.CompositeState.builder() - .setShaderState(RENDERTYPE_ENTITY_TRANSLUCENT_CULL_SHADER) - .setTextureState(BLOCK_SHEET_MIPPED) - .setTransparencyState(TRANSLUCENT_TRANSPARENCY) - .setLightmapState(LIGHTMAP) - .setOverlayState(OVERLAY) - .createCompositeState(true)); - - public static RenderType getFluid() { - return FLUID; - } - private static String createLayerName(String name) { return Create.ID + ":" + name; } diff --git a/src/main/java/com/simibubi/create/foundation/render/SuperByteBuffer.java b/src/main/java/com/simibubi/create/foundation/render/SuperByteBuffer.java index 0890291913..85897cf5a4 100644 --- a/src/main/java/com/simibubi/create/foundation/render/SuperByteBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/SuperByteBuffer.java @@ -19,10 +19,10 @@ import com.mojang.math.Quaternion; import com.mojang.math.Vector3f; import com.mojang.math.Vector4f; import com.simibubi.create.foundation.block.render.SpriteShiftEntry; -import com.simibubi.create.foundation.utility.Color; import it.unimi.dsi.fastutil.longs.Long2IntMap; import it.unimi.dsi.fastutil.longs.Long2IntOpenHashMap; +import net.createmod.catnip.utility.theme.Color; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.LightTexture; diff --git a/src/main/java/com/simibubi/create/foundation/render/SuperRenderTypeBuffer.java b/src/main/java/com/simibubi/create/foundation/render/SuperRenderTypeBuffer.java deleted file mode 100644 index 57716c3824..0000000000 --- a/src/main/java/com/simibubi/create/foundation/render/SuperRenderTypeBuffer.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.simibubi.create.foundation.render; - -import java.util.SortedMap; - -import com.mojang.blaze3d.vertex.BufferBuilder; -import com.mojang.blaze3d.vertex.VertexConsumer; - -import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap; -import net.minecraft.Util; -import net.minecraft.client.renderer.ChunkBufferBuilderPack; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.Sheets; -import net.minecraft.client.resources.model.ModelBakery; - -public class SuperRenderTypeBuffer implements MultiBufferSource { - - private static final SuperRenderTypeBuffer INSTANCE = new SuperRenderTypeBuffer(); - - public static SuperRenderTypeBuffer getInstance() { - return INSTANCE; - } - - private SuperRenderTypeBufferPhase earlyBuffer; - private SuperRenderTypeBufferPhase defaultBuffer; - private SuperRenderTypeBufferPhase lateBuffer; - - public SuperRenderTypeBuffer() { - earlyBuffer = new SuperRenderTypeBufferPhase(); - defaultBuffer = new SuperRenderTypeBufferPhase(); - lateBuffer = new SuperRenderTypeBufferPhase(); - } - - public VertexConsumer getEarlyBuffer(RenderType type) { - return earlyBuffer.bufferSource.getBuffer(type); - } - - @Override - public VertexConsumer getBuffer(RenderType type) { - return defaultBuffer.bufferSource.getBuffer(type); - } - - public VertexConsumer getLateBuffer(RenderType type) { - return lateBuffer.bufferSource.getBuffer(type); - } - - public void draw() { - earlyBuffer.bufferSource.endBatch(); - defaultBuffer.bufferSource.endBatch(); - lateBuffer.bufferSource.endBatch(); - } - - public void draw(RenderType type) { - earlyBuffer.bufferSource.endBatch(type); - defaultBuffer.bufferSource.endBatch(type); - lateBuffer.bufferSource.endBatch(type); - } - - private static class SuperRenderTypeBufferPhase { - - // Visible clones from RenderBuffers - private final ChunkBufferBuilderPack fixedBufferPack = new ChunkBufferBuilderPack(); - private final SortedMap fixedBuffers = Util.make(new Object2ObjectLinkedOpenHashMap<>(), map -> { - map.put(Sheets.solidBlockSheet(), fixedBufferPack.builder(RenderType.solid())); - map.put(Sheets.cutoutBlockSheet(), fixedBufferPack.builder(RenderType.cutout())); - map.put(Sheets.bannerSheet(), fixedBufferPack.builder(RenderType.cutoutMipped())); - map.put(Sheets.translucentCullBlockSheet(), fixedBufferPack.builder(RenderType.translucent())); - put(map, Sheets.shieldSheet()); - put(map, Sheets.bedSheet()); - put(map, Sheets.shulkerBoxSheet()); - put(map, Sheets.signSheet()); - put(map, Sheets.chestSheet()); - put(map, RenderType.translucentNoCrumbling()); - put(map, RenderType.armorGlint()); - put(map, RenderType.armorEntityGlint()); - put(map, RenderType.glint()); - put(map, RenderType.glintDirect()); - put(map, RenderType.glintTranslucent()); - put(map, RenderType.entityGlint()); - put(map, RenderType.entityGlintDirect()); - put(map, RenderType.waterMask()); - put(map, RenderTypes.getOutlineSolid()); - ModelBakery.DESTROY_TYPES.forEach((p_173062_) -> { - put(map, p_173062_); - }); - }); - private final MultiBufferSource.BufferSource bufferSource = MultiBufferSource.immediateWithBuffers(fixedBuffers, new BufferBuilder(256)); - - private static void put(Object2ObjectLinkedOpenHashMap map, RenderType type) { - map.put(type, new BufferBuilder(type.bufferSize())); - } - - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/render/TileEntityRenderHelper.java b/src/main/java/com/simibubi/create/foundation/render/TileEntityRenderHelper.java index 70bde02e92..b8d322de42 100644 --- a/src/main/java/com/simibubi/create/foundation/render/TileEntityRenderHelper.java +++ b/src/main/java/com/simibubi/create/foundation/render/TileEntityRenderHelper.java @@ -14,8 +14,8 @@ import com.mojang.math.Matrix4f; import com.mojang.math.Vector4f; import com.simibubi.create.Create; import com.simibubi.create.foundation.config.AllConfigs; -import com.simibubi.create.foundation.utility.AnimationTickHolder; +import net.createmod.catnip.utility.AnimationTickHolder; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.MultiBufferSource; diff --git a/src/main/java/com/simibubi/create/foundation/sound/RepeatingSound.java b/src/main/java/com/simibubi/create/foundation/sound/RepeatingSound.java index 5356c96858..bb9815a55b 100644 --- a/src/main/java/com/simibubi/create/foundation/sound/RepeatingSound.java +++ b/src/main/java/com/simibubi/create/foundation/sound/RepeatingSound.java @@ -1,7 +1,6 @@ package com.simibubi.create.foundation.sound; -import com.simibubi.create.foundation.utility.AnimationTickHolder; - +import net.createmod.catnip.utility.AnimationTickHolder; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.sounds.SoundEvent; diff --git a/src/main/java/com/simibubi/create/foundation/sound/SoundScape.java b/src/main/java/com/simibubi/create/foundation/sound/SoundScape.java index 2c7b8efb27..7a1d071810 100644 --- a/src/main/java/com/simibubi/create/foundation/sound/SoundScape.java +++ b/src/main/java/com/simibubi/create/foundation/sound/SoundScape.java @@ -6,8 +6,8 @@ import java.util.List; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.sound.SoundScapes.AmbienceGroup; import com.simibubi.create.foundation.sound.SoundScapes.PitchGroup; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/simibubi/create/foundation/sound/SoundScapes.java b/src/main/java/com/simibubi/create/foundation/sound/SoundScapes.java index d3025d3978..1f0302690e 100644 --- a/src/main/java/com/simibubi/create/foundation/sound/SoundScapes.java +++ b/src/main/java/com/simibubi/create/foundation/sound/SoundScapes.java @@ -12,9 +12,9 @@ import java.util.function.BiFunction; import com.simibubi.create.AllSoundEvents; import com.simibubi.create.foundation.config.AllConfigs; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.Pair; +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.Pair; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.sounds.SoundEvents; @@ -60,7 +60,7 @@ public class SoundScapes { .repeating(AllSoundEvents.CRUSHING_2.getMainEvent(), 0.425f, .75f, 2) .repeating(AllSoundEvents.CRUSHING_3.getMainEvent(), 2f, 1.75f, 2); } - + private static SoundScape milling(float pitch, AmbienceGroup group) { return new SoundScape(pitch, group).repeating(AllSoundEvents.CRUSHING_1.getMainEvent(), 1.545f, .75f, 1) .repeating(AllSoundEvents.CRUSHING_2.getMainEvent(), 0.425f, .75f, 2); diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/SmartTileEntity.java b/src/main/java/com/simibubi/create/foundation/tileEntity/SmartTileEntity.java index 1c91eeda83..de046fd476 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/SmartTileEntity.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/SmartTileEntity.java @@ -15,6 +15,7 @@ import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType; import com.simibubi.create.foundation.utility.IInteractionChecker; import com.simibubi.create.foundation.utility.IPartialSafeNBT; +import net.createmod.ponder.foundation.VirtualTileEntity; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; @@ -26,7 +27,7 @@ import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.items.CapabilityItemHandler; -public abstract class SmartTileEntity extends CachedRenderBBTileEntity implements IPartialSafeNBT, IInteractionChecker, ISpecialBlockEntityItemRequirement { +public abstract class SmartTileEntity extends CachedRenderBBTileEntity implements IPartialSafeNBT, IInteractionChecker, ISpecialBlockEntityItemRequirement, VirtualTileEntity { private final Map, TileEntityBehaviour> behaviours = new HashMap<>(); private boolean initialized = false; @@ -195,10 +196,12 @@ public abstract class SmartTileEntity extends CachedRenderBBTileEntity implement this.lazyTickCounter = slowTickRate; } + @Override public void markVirtual() { virtualMode = true; } + @Override public boolean isVirtual() { return virtualMode; } diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/CenteredSideValueBoxTransform.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/CenteredSideValueBoxTransform.java index 634cd42045..f042b42e37 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/CenteredSideValueBoxTransform.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/CenteredSideValueBoxTransform.java @@ -2,8 +2,7 @@ package com.simibubi.create.foundation.tileEntity.behaviour; import java.util.function.BiPredicate; -import com.simibubi.create.foundation.utility.VecHelper; - +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.Direction; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; @@ -15,7 +14,7 @@ public class CenteredSideValueBoxTransform extends ValueBoxTransform.Sided { public CenteredSideValueBoxTransform() { this((b, d) -> true); } - + public CenteredSideValueBoxTransform(BiPredicate allowedDirections) { this.allowedDirections = allowedDirections; } diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/ValueBox.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/ValueBox.java index e50ad52c21..6fec54f08c 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/ValueBox.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/ValueBox.java @@ -1,15 +1,17 @@ package com.simibubi.create.foundation.tileEntity.behaviour; +import javax.annotation.Nonnull; + import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.content.logistics.item.filter.FilterItem; import com.simibubi.create.foundation.gui.AllIcons; -import com.simibubi.create.foundation.render.SuperRenderTypeBuffer; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform.Sided; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.INamedIconOptions; -import com.simibubi.create.foundation.utility.Color; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.outliner.ChasingAABBOutline; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.render.SuperRenderTypeBuffer; +import net.createmod.catnip.utility.outliner.ChasingAABBOutline; +import net.createmod.catnip.utility.theme.Color; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; import net.minecraft.client.renderer.LightTexture; @@ -76,7 +78,7 @@ public class ValueBox extends ChasingAABBOutline { } @Override - public void render(PoseStack ms, SuperRenderTypeBuffer buffer, float pt) { + public void render(@Nonnull PoseStack ms, @Nonnull SuperRenderTypeBuffer buffer, float pt) { boolean hasTransform = transform != null; if (transform instanceof Sided && params.getHighlightedFace() != null) ((Sided) transform).fromSide(params.getHighlightedFace()); @@ -87,9 +89,6 @@ public class ValueBox extends ChasingAABBOutline { ms.translate(pos.getX(), pos.getY(), pos.getZ()); if (hasTransform) transform.transform(blockState, ms); - transformNormals = ms.last() - .normal() - .copy(); params.colored(isPassive ? passiveColor : highlightColor); super.render(ms, buffer, pt); @@ -198,7 +197,7 @@ public class ValueBox extends ChasingAABBOutline { public IconValueBox(Component label, INamedIconOptions iconValue, AABB bb, BlockPos pos) { super(label, bb, pos); - subLabel(Lang.translateDirect(iconValue.getTranslationKey())); + subLabel(CreateLang.translateDirect(iconValue.getTranslationKey())); icon = iconValue.getIcon(); } diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/ValueBoxTransform.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/ValueBoxTransform.java index 9158b824d3..bd63ddc223 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/ValueBoxTransform.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/ValueBoxTransform.java @@ -6,9 +6,9 @@ import org.apache.commons.lang3.tuple.Pair; import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; import net.minecraft.world.level.block.state.BlockState; diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/belt/TransportedItemStackHandlerBehaviour.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/belt/TransportedItemStackHandlerBehaviour.java index 869e52ad0a..9e745a4723 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/belt/TransportedItemStackHandlerBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/belt/TransportedItemStackHandlerBehaviour.java @@ -10,8 +10,8 @@ import com.simibubi.create.content.contraptions.relays.belt.transport.Transporte import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.world.item.ItemStack; import net.minecraft.world.phys.Vec3; diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/edgeInteraction/EdgeInteractionHandler.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/edgeInteraction/EdgeInteractionHandler.java index 4ec901624c..96cb61e8a4 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/edgeInteraction/EdgeInteractionHandler.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/edgeInteraction/EdgeInteractionHandler.java @@ -5,9 +5,9 @@ import java.util.List; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.utility.BlockHelper; -import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.RaycastHelper; +import net.createmod.catnip.utility.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Vec3i; diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/edgeInteraction/EdgeInteractionRenderer.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/edgeInteraction/EdgeInteractionRenderer.java index d801e692da..1a841d45ae 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/edgeInteraction/EdgeInteractionRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/edgeInteraction/EdgeInteractionRenderer.java @@ -3,11 +3,11 @@ package com.simibubi.create.foundation.tileEntity.behaviour.edgeInteraction; import java.util.List; import com.simibubi.create.AllSpecialTextures; -import com.simibubi.create.CreateClient; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBox; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.CatnipClient; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.core.BlockPos; @@ -84,7 +84,7 @@ public class EdgeInteractionRenderer { .withColors(0x7A6A2C, 0xB79D64) .passive(!hit); - CreateClient.OUTLINER.showValueBox("edge", box) + CatnipClient.OUTLINER.showOutline("edge", box) .lineWidth(1 / 64f) .withFaceTexture(hit ? AllSpecialTextures.THIN_CHECKERED : null) .highlightFace(face); diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringBehaviour.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringBehaviour.java index 332a688f8f..8fc291364a 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringBehaviour.java @@ -10,8 +10,8 @@ import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.entity.item.ItemEntity; diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringHandler.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringHandler.java index 88ecece529..d259e406d7 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringHandler.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringHandler.java @@ -8,7 +8,7 @@ import com.simibubi.create.content.logistics.item.filter.FilterItem; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform.Sided; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.foundation.utility.RaycastHelper; import net.minecraft.ChatFormatting; @@ -73,7 +73,7 @@ public class FilteringHandler { return; if (AllBlocks.MECHANICAL_ARM.isIn(toApply)) return; - + if (event.getSide() != LogicalSide.CLIENT) { if (!player.isCreative()) { if (toApply.getItem() instanceof FilterItem) @@ -97,7 +97,7 @@ public class FilteringHandler { Component formattedText = world.getBlockState(pos) .getBlock() .getName(); - player.displayClientMessage(Lang.translateDirect("logistics.filter." + feedback, formattedText) + player.displayClientMessage(CreateLang.translateDirect("logistics.filter." + feedback, formattedText) .withStyle(ChatFormatting.WHITE), true); } @@ -132,14 +132,14 @@ public class FilteringHandler { ((Sided) filtering.slotPositioning).fromSide(result.getDirection()); if (!filtering.testHit(objectMouseOver.getLocation())) return false; - + ItemStack filterItem = filtering.getFilter(); filtering.ticksUntilScrollPacket = 10; int maxAmount = (filterItem.getItem() instanceof FilterItem) ? 64 : filterItem.getMaxStackSize(); int prev = filtering.scrollableValue; filtering.scrollableValue = (int) Mth.clamp(filtering.scrollableValue + delta * (AllKeys.ctrlDown() ? 16 : 1), 0, maxAmount); - + if (prev != filtering.scrollableValue) { float pitch = (filtering.scrollableValue) / (float) (maxAmount); pitch = Mth.lerp(pitch, 1.5f, 2f); diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringRenderer.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringRenderer.java index 9afef6ce7d..73c8a831b9 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringRenderer.java @@ -2,7 +2,6 @@ package com.simibubi.create.foundation.tileEntity.behaviour.filtering; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllSpecialTextures; -import com.simibubi.create.CreateClient; import com.simibubi.create.content.logistics.item.filter.FilterItem; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; @@ -12,11 +11,12 @@ import com.simibubi.create.foundation.tileEntity.behaviour.ValueBox.ItemValueBox import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxRenderer; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform.Sided; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.Pair; -import com.simibubi.create.foundation.utility.VecHelper; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.CatnipClient; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.MultiBufferSource; @@ -67,7 +67,7 @@ public class FilteringRenderer { boolean showCount = behaviour.isCountVisible(); boolean fluids = behaviour.fluidFilter; Component label = isFilterSlotted ? TextComponent.EMPTY - : Lang.translateDirect(behaviour.recipeFilter ? "logistics.recipe_filter" + : CreateLang.translateDirect(behaviour.recipeFilter ? "logistics.recipe_filter" : fluids ? "logistics.fluid_filter" : "logistics.filter"); boolean hit = behaviour.slotPositioning.testHit(state, target.getLocation() .subtract(Vec3.atLowerCornerOf(pos))); @@ -80,10 +80,10 @@ public class FilteringRenderer { box.offsetLabel(behaviour.textShift) .withColors(fluids ? 0x407088 : 0x7A6A2C, fluids ? 0x70adb5 : 0xB79D64) - .scrollTooltip(showCount && !isFilterSlotted ? new TextComponent("[").append(Lang.translateDirect("action.scroll")).append("]") : TextComponent.EMPTY) + .scrollTooltip(showCount && !isFilterSlotted ? new TextComponent("[").append(CreateLang.translateDirect("action.scroll")).append("]") : TextComponent.EMPTY) .passive(!hit); - CreateClient.OUTLINER.showValueBox(Pair.of("filter", pos), box.transform(behaviour.slotPositioning)) + CatnipClient.OUTLINER.showOutline(Pair.of("filter", pos), box.transform(behaviour.slotPositioning)) .lineWidth(1 / 64f) .withFaceTexture(hit ? AllSpecialTextures.THIN_CHECKERED : null) .highlightFace(result.getDirection()); diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/SidedFilteringBehaviour.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/SidedFilteringBehaviour.java index 87753bc80a..f2c2db89e2 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/SidedFilteringBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/SidedFilteringBehaviour.java @@ -11,9 +11,9 @@ import com.simibubi.create.content.schematics.ItemRequirement; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform.Sided; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.NBTHelper; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.NBTHelper; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/fluid/SmartFluidTankBehaviour.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/fluid/SmartFluidTankBehaviour.java index 565518ec48..648f65d823 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/fluid/SmartFluidTankBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/fluid/SmartFluidTankBehaviour.java @@ -9,9 +9,9 @@ import com.simibubi.create.foundation.fluid.SmartFluidTank; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType; -import com.simibubi.create.foundation.utility.NBTHelper; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; -import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/CapManipulationBehaviourBase.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/CapManipulationBehaviourBase.java index 852938793d..fd8a2860f5 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/CapManipulationBehaviourBase.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/CapManipulationBehaviourBase.java @@ -5,8 +5,8 @@ import javax.annotation.Nullable; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; -import com.simibubi.create.foundation.utility.BlockFace; +import net.createmod.catnip.utility.BlockFace; import net.minecraft.core.BlockPos; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/linked/LinkBehaviour.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/linked/LinkBehaviour.java index 320e2a805a..6f0ed8c624 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/linked/LinkBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/linked/LinkBehaviour.java @@ -14,8 +14,8 @@ import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; -import com.simibubi.create.foundation.utility.Couple; +import net.createmod.catnip.utility.Couple; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.ItemStack; diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/linked/LinkRenderer.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/linked/LinkRenderer.java index b37edff8d8..10e27ad5ec 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/linked/LinkRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/linked/LinkRenderer.java @@ -3,17 +3,17 @@ package com.simibubi.create.foundation.tileEntity.behaviour.linked; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.datafixers.util.Pair; import com.simibubi.create.AllSpecialTextures; -import com.simibubi.create.CreateClient; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBox; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxRenderer; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.VecHelper; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.CatnipClient; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.MultiBufferSource; @@ -42,8 +42,8 @@ public class LinkRenderer { if (behaviour == null) return; - Component freq1 = Lang.translateDirect("logistics.firstFrequency"); - Component freq2 = Lang.translateDirect("logistics.secondFrequency"); + Component freq1 = CreateLang.translateDirect("logistics.firstFrequency"); + Component freq2 = CreateLang.translateDirect("logistics.secondFrequency"); for (boolean first : Iterate.trueAndFalse) { AABB bb = new AABB(Vec3.ZERO, Vec3.ZERO).inflate(.25f); @@ -54,7 +54,7 @@ public class LinkRenderer { ValueBox box = new ValueBox(label, bb, pos).withColors(0x601F18, 0xB73C2D) .offsetLabel(behaviour.textShift) .passive(!hit); - CreateClient.OUTLINER.showValueBox(Pair.of(Boolean.valueOf(first), pos), box.transform(transform)) + CatnipClient.OUTLINER.showOutline(Pair.of(Boolean.valueOf(first), pos), box.transform(transform)) .lineWidth(1 / 64f) .withFaceTexture(hit ? AllSpecialTextures.THIN_CHECKERED : null) .highlightFace(result.getDirection()); @@ -66,7 +66,7 @@ public class LinkRenderer { if (te == null || te.isRemoved()) return; - + Entity cameraEntity = Minecraft.getInstance().cameraEntity; float max = AllConfigs.CLIENT.filterItemRenderDistance.getF(); if (!te.isVirtual() && cameraEntity != null && cameraEntity.position() diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/scrollvalue/ScrollValueHandler.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/scrollvalue/ScrollValueHandler.java index f3b4d0824b..f6b5c409b8 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/scrollvalue/ScrollValueHandler.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/scrollvalue/ScrollValueHandler.java @@ -7,8 +7,8 @@ import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform.Sided; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollValueBehaviour.StepContext; -import com.simibubi.create.foundation.utility.animation.PhysicalFloat; +import net.createmod.catnip.utility.animation.PhysicalFloat; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/scrollvalue/ScrollValueRenderer.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/scrollvalue/ScrollValueRenderer.java index ec75457429..28ff073182 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/scrollvalue/ScrollValueRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/scrollvalue/ScrollValueRenderer.java @@ -2,14 +2,14 @@ package com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue; import com.simibubi.create.AllItems; import com.simibubi.create.AllKeys; -import com.simibubi.create.CreateClient; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBox; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBox.IconValueBox; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBox.TextValueBox; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.CatnipClient; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.core.BlockPos; @@ -70,12 +70,12 @@ public class ScrollValueRenderer { box.subLabel(new TextComponent("(").append(behaviour.unit.apply(behaviour.scrollableValue)).append(")")); } - box.scrollTooltip(new TextComponent("[").append(Lang.translateDirect("action.scroll")).append("]")); + box.scrollTooltip(new TextComponent("[").append(CreateLang.translateDirect("action.scroll")).append("]")); box.offsetLabel(behaviour.textShift.add(20, -10, 0)) .withColors(0x5A5D5A, 0xB5B7B6) .passive(!highlight); - CreateClient.OUTLINER.showValueBox(pos, box.transform(behaviour.slotPositioning)) + CatnipClient.OUTLINER.showOutline(pos, box.transform(behaviour.slotPositioning)) .lineWidth(1 / 64f) .highlightFace(face); } diff --git a/src/main/java/com/simibubi/create/foundation/utility/AngleHelper.java b/src/main/java/com/simibubi/create/foundation/utility/AngleHelper.java deleted file mode 100644 index 4c3715fb68..0000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/AngleHelper.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.simibubi.create.foundation.utility; - -import net.minecraft.core.Direction; -import net.minecraft.core.Direction.Axis; -import net.minecraft.util.Mth; - -public class AngleHelper { - - public static float horizontalAngle(Direction facing) { - if (facing.getAxis().isVertical()) - return 0; - float angle = facing.toYRot(); - if (facing.getAxis() == Axis.X) - angle = -angle; - return angle; - } - - public static float verticalAngle(Direction facing) { - return facing == Direction.UP ? -90 : facing == Direction.DOWN ? 90 : 0; - } - - public static float rad(double angle) { - if (angle == 0) - return 0; - return (float) (angle / 180 * Math.PI); - } - - public static float deg(double angle) { - if (angle == 0) - return 0; - return (float) (angle * 180 / Math.PI); - } - - public static float angleLerp(double pct, double current, double target) { - return (float) (current + getShortestAngleDiff(current, target) * pct); - } - - public static float getShortestAngleDiff(double current, double target) { - current = current % 360; - target = target % 360; - return (float) (((((target - current) % 360) + 540) % 360) - 180); - } - - public static float getShortestAngleDiff(double current, double target, float hint) { - float diff = getShortestAngleDiff(current, target); - if (Mth.equal(Math.abs(diff), 180) && Math.signum(diff) != Math.signum(hint)) { - return diff + 360*Math.signum(hint); - } - return diff; - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/utility/AnimationTickHolder.java b/src/main/java/com/simibubi/create/foundation/utility/AnimationTickHolder.java deleted file mode 100644 index 091326516d..0000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/AnimationTickHolder.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.simibubi.create.foundation.utility; - -import com.simibubi.create.foundation.ponder.PonderWorld; -import com.simibubi.create.foundation.ponder.ui.PonderUI; -import com.simibubi.create.foundation.utility.worldWrappers.WrappedClientWorld; - -import net.minecraft.client.Minecraft; -import net.minecraft.world.level.LevelAccessor; - -public class AnimationTickHolder { - - private static int ticks; - private static int pausedTicks; - - public static void reset() { - ticks = 0; - pausedTicks = 0; - } - - public static void tick() { - if (!Minecraft.getInstance() - .isPaused()) { - ticks = (ticks + 1) % 1_728_000; // wrap around every 24 hours so we maintain enough floating point precision - } else { - pausedTicks = (pausedTicks + 1) % 1_728_000; - } - } - - public static int getTicks() { - return getTicks(false); - } - - public static int getTicks(boolean includePaused) { - return includePaused ? ticks + pausedTicks : ticks; - } - - public static float getRenderTime() { - return getTicks() + getPartialTicks(); - } - - public static float getPartialTicks() { - Minecraft mc = Minecraft.getInstance(); - return (mc.isPaused() ? mc.pausePartialTick : mc.getFrameTime()); - } - - public static int getTicks(LevelAccessor world) { - if (world instanceof WrappedClientWorld) - return getTicks(((WrappedClientWorld) world).getWrappedWorld()); - return world instanceof PonderWorld ? PonderUI.ponderTicks : getTicks(); - } - - public static float getRenderTime(LevelAccessor world) { - return getTicks(world) + getPartialTicks(world); - } - - public static float getPartialTicks(LevelAccessor world) { - return world instanceof PonderWorld ? PonderUI.getPartialTicks() : getPartialTicks(); - } -} diff --git a/src/main/java/com/simibubi/create/foundation/utility/BBHelper.java b/src/main/java/com/simibubi/create/foundation/utility/BBHelper.java deleted file mode 100644 index f2b9af8903..0000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/BBHelper.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.simibubi.create.foundation.utility; - -import net.minecraft.core.BlockPos; -import net.minecraft.world.level.levelgen.structure.BoundingBox; - -public class BBHelper { - - public static BoundingBox encapsulate(BoundingBox bb, BlockPos pos) { - return new BoundingBox(Math.min(bb.minX(), pos.getX()), Math.min(bb.minY(), pos.getY()), - Math.min(bb.minZ(), pos.getZ()), Math.max(bb.maxX(), pos.getX()), Math.max(bb.maxY(), pos.getY()), - Math.max(bb.maxZ(), pos.getZ())); - } - - public static BoundingBox encapsulate(BoundingBox bb, BoundingBox bb2) { - return new BoundingBox(Math.min(bb.minX(), bb2.minX()), Math.min(bb.minY(), bb2.minY()), - Math.min(bb.minZ(), bb2.minZ()), Math.max(bb.maxX(), bb2.maxX()), Math.max(bb.maxY(), bb2.maxY()), - Math.max(bb.maxZ(), bb2.maxZ())); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/utility/BlockFace.java b/src/main/java/com/simibubi/create/foundation/utility/BlockFace.java deleted file mode 100644 index 97176b224e..0000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/BlockFace.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.simibubi.create.foundation.utility; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.NbtUtils; - -public class BlockFace extends Pair { - - public BlockFace(BlockPos first, Direction second) { - super(first, second); - } - - public boolean isEquivalent(BlockFace other) { - if (equals(other)) - return true; - return getConnectedPos().equals(other.getPos()) && getPos().equals(other.getConnectedPos()); - } - - public BlockPos getPos() { - return getFirst(); - } - - public Direction getFace() { - return getSecond(); - } - - public Direction getOppositeFace() { - return getSecond().getOpposite(); - } - - public BlockFace getOpposite() { - return new BlockFace(getConnectedPos(), getOppositeFace()); - } - - public BlockPos getConnectedPos() { - return getPos().relative(getFace()); - } - - public CompoundTag serializeNBT() { - CompoundTag compoundNBT = new CompoundTag(); - compoundNBT.put("Pos", NbtUtils.writeBlockPos(getPos())); - NBTHelper.writeEnum(compoundNBT, "Face", getFace()); - return compoundNBT; - } - - public static BlockFace fromNBT(CompoundTag compound) { - return new BlockFace(NbtUtils.readBlockPos(compound.getCompound("Pos")), - NBTHelper.readEnum(compound, "Face", Direction.class)); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/utility/CameraAngleAnimationService.java b/src/main/java/com/simibubi/create/foundation/utility/CameraAngleAnimationService.java index 69f84cbba9..de84d21b9b 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/CameraAngleAnimationService.java +++ b/src/main/java/com/simibubi/create/foundation/utility/CameraAngleAnimationService.java @@ -1,7 +1,7 @@ package com.simibubi.create.foundation.utility; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; - +import net.createmod.catnip.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.Minecraft; import net.minecraft.util.Mth; diff --git a/src/main/java/com/simibubi/create/foundation/utility/Color.java b/src/main/java/com/simibubi/create/foundation/utility/Color.java deleted file mode 100644 index a1f1bb4f59..0000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/Color.java +++ /dev/null @@ -1,312 +0,0 @@ -package com.simibubi.create.foundation.utility; - -import java.util.function.UnaryOperator; - -import javax.annotation.Nonnull; - -import com.google.common.hash.Hashing; -import com.mojang.math.Vector3f; - -import net.minecraft.util.Mth; -import net.minecraft.world.phys.Vec3; - -public class Color { - public final static Color TRANSPARENT_BLACK = new Color(0, 0, 0, 0).setImmutable(); - public final static Color BLACK = new Color(0, 0, 0).setImmutable(); - public final static Color WHITE = new Color(255, 255, 255).setImmutable(); - public final static Color RED = new Color(255, 0, 0).setImmutable(); - public final static Color GREEN = new Color(0, 255, 0).setImmutable(); - public final static Color SPRING_GREEN = new Color(0, 255, 187).setImmutable(); - - protected boolean mutable = true; - protected int value; - - public Color(int r, int g, int b) { - this(r, g, b, 0xff); - } - - public Color(int r, int g, int b, int a) { - value = ((a & 0xff) << 24) | - ((r & 0xff) << 16) | - ((g & 0xff) << 8) | - ((b & 0xff) << 0); - } - - public Color(float r, float g, float b, float a) { - this( - (int) (0.5 + 0xff * Mth.clamp(r, 0, 1)), - (int) (0.5 + 0xff * Mth.clamp(g, 0, 1)), - (int) (0.5 + 0xff * Mth.clamp(b, 0, 1)), - (int) (0.5 + 0xff * Mth.clamp(a, 0, 1)) - ); - } - - public Color(int rgba) { - value = rgba; - } - - public Color(int rgb, boolean hasAlpha) { - if (hasAlpha) { - value = rgb; - } else { - value = rgb | 0xff_000000; - } - } - - public Color copy() { - return copy(true); - } - - public Color copy(boolean mutable) { - if (mutable) - return new Color(value); - else - return new Color(value).setImmutable(); - } - - /** - * Mark this color as immutable. Attempting to mutate this color in the future - * will instead cause a copy to be created that can me modified. - */ - public Color setImmutable() { - this.mutable = false; - return this; - } - - /** - * @return the red component in the range 0-255. - * @see #getRGB - */ - public int getRed() { - return (getRGB() >> 16) & 0xff; - } - - /** - * @return the green component in the range 0-255. - * @see #getRGB - */ - public int getGreen() { - return (getRGB() >> 8) & 0xff; - } - - /** - * @return the blue component in the range 0-255. - * @see #getRGB - */ - public int getBlue() { - return (getRGB() >> 0) & 0xff; - } - - /** - * @return the alpha component in the range 0-255. - * @see #getRGB - */ - public int getAlpha() { - return (getRGB() >> 24) & 0xff; - } - - /** - * @return the red component in the range 0-1f. - */ - public float getRedAsFloat() { - return getRed() / 255f; - } - - /** - * @return the green component in the range 0-1f. - */ - public float getGreenAsFloat() { - return getGreen() / 255f; - } - - /** - * @return the blue component in the range 0-1f. - */ - public float getBlueAsFloat() { - return getBlue() / 255f; - } - - /** - * @return the alpha component in the range 0-1f. - */ - public float getAlphaAsFloat() { - return getAlpha() / 255f; - } - - /** - * Returns the RGB value representing this color - * (Bits 24-31 are alpha, 16-23 are red, 8-15 are green, 0-7 are blue). - * @return the RGB value of the color - */ - public int getRGB() { - return value; - } - - public Vec3 asVector() { - return new Vec3(getRedAsFloat(), getGreenAsFloat(), getBlueAsFloat()); - } - - public Vector3f asVectorF() { - return new Vector3f(getRedAsFloat(), getGreenAsFloat(), getBlueAsFloat()); - } - - public Color setRed(int r) { - return ensureMutable().setRedUnchecked(r); - } - - public Color setGreen(int g) { - return ensureMutable().setGreenUnchecked(g); - } - - public Color setBlue(int b) { - return ensureMutable().setBlueUnchecked(b); - } - - public Color setAlpha(int a) { - return ensureMutable().setAlphaUnchecked(a); - } - - public Color setRed(float r) { - return ensureMutable().setRedUnchecked((int) (0xff * Mth.clamp(r, 0, 1))); - } - - public Color setGreen(float g) { - return ensureMutable().setGreenUnchecked((int) (0xff * Mth.clamp(g, 0, 1))); - } - - public Color setBlue(float b) { - return ensureMutable().setBlueUnchecked((int) (0xff * Mth.clamp(b, 0, 1))); - } - - public Color setAlpha(float a) { - return ensureMutable().setAlphaUnchecked((int) (0xff * Mth.clamp(a, 0, 1))); - } - - public Color scaleAlpha(float factor) { - return ensureMutable().setAlphaUnchecked((int) (getAlpha() * Mth.clamp(factor, 0, 1))); - } - - public Color mixWith(Color other, float weight) { - return ensureMutable() - .setRedUnchecked((int) (getRed() + (other.getRed() - getRed()) * weight)) - .setGreenUnchecked((int) (getGreen() + (other.getGreen() - getGreen()) * weight)) - .setBlueUnchecked((int) (getBlue() + (other.getBlue() - getBlue()) * weight)) - .setAlphaUnchecked((int) (getAlpha() + (other.getAlpha() - getAlpha()) * weight)); - } - - public Color darker() { - int a = getAlpha(); - return ensureMutable().mixWith(BLACK, .25f).setAlphaUnchecked(a); - } - - public Color brighter() { - int a = getAlpha(); - return ensureMutable().mixWith(WHITE, .25f).setAlphaUnchecked(a); - } - - public Color setValue(int value) { - return ensureMutable().setValueUnchecked(value); - } - - public Color modifyValue(UnaryOperator function) { - int newValue = function.apply(value); - if (newValue == value) - return this; - - return ensureMutable().setValueUnchecked(newValue); - } - - // ********* // - - protected Color ensureMutable() { - if (this.mutable) - return this; - - return new Color(this.value); - } - - protected Color setRedUnchecked(int r) { - this.value = (this.value & 0xff_00ffff) | ((r & 0xff) << 16); - return this; - } - - protected Color setGreenUnchecked(int g) { - this.value = (this.value & 0xff_ff00ff) | ((g & 0xff) << 8); - return this; - } - - protected Color setBlueUnchecked(int b) { - this.value = (this.value & 0xff_ffff00) | ((b & 0xff) << 0); - return this; - } - - protected Color setAlphaUnchecked(int a) { - this.value = (this.value & 0x00_ffffff) | ((a & 0xff) << 24); - return this; - } - - protected Color setValueUnchecked(int value) { - this.value = value; - return this; - } - - // ********* // - - public static Color mixColors(@Nonnull Color c1, @Nonnull Color c2, float w) { - return new Color( - (int) (c1.getRed() + (c2.getRed() - c1.getRed()) * w), - (int) (c1.getGreen() + (c2.getGreen() - c1.getGreen()) * w), - (int) (c1.getBlue() + (c2.getBlue() - c1.getBlue()) * w), - (int) (c1.getAlpha() + (c2.getAlpha() - c1.getAlpha()) * w) - ); - } - - public static Color mixColors(@Nonnull Couple colors, float w) { - return mixColors(colors.getFirst(), colors.getSecond(), w); - } - - public static int mixColors(int color1, int color2, float w) { - int a1 = (color1 >> 24); - int r1 = (color1 >> 16) & 0xFF; - int g1 = (color1 >> 8) & 0xFF; - int b1 = color1 & 0xFF; - int a2 = (color2 >> 24); - int r2 = (color2 >> 16) & 0xFF; - int g2 = (color2 >> 8) & 0xFF; - int b2 = color2 & 0xFF; - - return - ((int) (a1 + (a2 - a1) * w) << 24) + - ((int) (r1 + (r2 - r1) * w) << 16) + - ((int) (g1 + (g2 - g1) * w) << 8) + - ((int) (b1 + (b2 - b1) * w) << 0); - } - - public static Color rainbowColor(int timeStep) { - int localTimeStep = Math.abs(timeStep) % 1536; - int timeStepInPhase = localTimeStep % 256; - int phaseBlue = localTimeStep / 256; - int red = colorInPhase(phaseBlue + 4, timeStepInPhase); - int green = colorInPhase(phaseBlue + 2, timeStepInPhase); - int blue = colorInPhase(phaseBlue, timeStepInPhase); - return new Color(red, green, blue); - } - - private static int colorInPhase(int phase, int progress) { - phase = phase % 6; - if (phase <= 1) - return 0; - if (phase == 2) - return progress; - if (phase <= 4) - return 255; - else - return 255 - progress; - } - - public static Color generateFromLong(long l) { - return rainbowColor(Hashing.crc32().hashLong(l).asInt()) - .mixWith(WHITE, 0.5f); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/utility/Couple.java b/src/main/java/com/simibubi/create/foundation/utility/Couple.java deleted file mode 100644 index 608ab696c5..0000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/Couple.java +++ /dev/null @@ -1,157 +0,0 @@ -package com.simibubi.create.foundation.utility; - -import java.util.Iterator; -import java.util.List; -import java.util.function.BiConsumer; -import java.util.function.BiFunction; -import java.util.function.Consumer; -import java.util.function.Function; -import java.util.function.Predicate; -import java.util.function.Supplier; -import java.util.stream.Stream; - -import com.google.common.collect.ImmutableList; - -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListTag; - -public class Couple extends Pair implements Iterable { - - private static final Couple TRUE_AND_FALSE = Couple.create(true, false); - - protected Couple(T first, T second) { - super(first, second); - } - - public static Couple create(T first, T second) { - return new Couple<>(first, second); - } - - public static Couple create(Supplier factory) { - return new Couple<>(factory.get(), factory.get()); - } - - public static Couple createWithContext(Function factory) { - return new Couple<>(factory.apply(true), factory.apply(false)); - } - - public T get(boolean first) { - return first ? getFirst() : getSecond(); - } - - public void set(boolean first, T value) { - if (first) - setFirst(value); - else - setSecond(value); - } - - @Override - public Couple copy() { - return create(first, second); - } - - public Couple map(Function function) { - return Couple.create(function.apply(first), function.apply(second)); - } - - public Couple mapWithContext(BiFunction function) { - return Couple.create(function.apply(first, true), function.apply(second, false)); - } - - public Couple mapWithParams(BiFunction function, Couple values) { - return Couple.create(function.apply(first, values.first), function.apply(second, values.second)); - } - - public Couple mapNotNullWithParam(BiFunction function, R value) { - return Couple.create(first != null ? function.apply(first, value) : null, - second != null ? function.apply(second, value) : null); - } - - public boolean both(Predicate test) { - return test.test(getFirst()) && test.test(getSecond()); - } - - public boolean either(Predicate test) { - return test.test(getFirst()) || test.test(getSecond()); - } - - public void replace(Function function) { - setFirst(function.apply(getFirst())); - setSecond(function.apply(getSecond())); - } - - public void replaceWithContext(BiFunction function) { - replaceWithParams(function, TRUE_AND_FALSE); - } - - public void replaceWithParams(BiFunction function, Couple values) { - setFirst(function.apply(getFirst(), values.getFirst())); - setSecond(function.apply(getSecond(), values.getSecond())); - } - - @Override - public void forEach(Consumer consumer) { - consumer.accept(getFirst()); - consumer.accept(getSecond()); - } - - public void forEachWithContext(BiConsumer consumer) { - forEachWithParams(consumer, TRUE_AND_FALSE); - } - - public void forEachWithParams(BiConsumer function, Couple values) { - function.accept(getFirst(), values.getFirst()); - function.accept(getSecond(), values.getSecond()); - } - - public Couple swap() { - return Couple.create(second, first); - } - - public ListTag serializeEach(Function serializer) { - return NBTHelper.writeCompoundList(ImmutableList.of(first, second), serializer); - } - - public static Couple deserializeEach(ListTag list, Function deserializer) { - List readCompoundList = NBTHelper.readCompoundList(list, deserializer); - return new Couple<>(readCompoundList.get(0), readCompoundList.get(1)); - } - - @Override - public Iterator iterator() { - return new Couplerator<>(this); - } - - public Stream stream() { - return Stream.of(first, second); - } - - private static class Couplerator implements Iterator { - - int state; - private final Couple couple; - - public Couplerator(Couple couple) { - this.couple = couple; - state = 0; - } - - @Override - public boolean hasNext() { - return state != 2; - } - - @Override - public T next() { - state++; - if (state == 1) - return couple.first; - if (state == 2) - return couple.second; - return null; - } - - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/utility/Lang.java b/src/main/java/com/simibubi/create/foundation/utility/CreateLang.java similarity index 60% rename from src/main/java/com/simibubi/create/foundation/utility/Lang.java rename to src/main/java/com/simibubi/create/foundation/utility/CreateLang.java index 3e062b8bb1..08c0cb7323 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/Lang.java +++ b/src/main/java/com/simibubi/create/foundation/utility/CreateLang.java @@ -2,37 +2,26 @@ package com.simibubi.create.foundation.utility; import java.util.ArrayList; import java.util.List; -import java.util.Locale; import com.simibubi.create.Create; +import net.createmod.catnip.utility.lang.Lang; +import net.createmod.catnip.utility.lang.LangBuilder; +import net.createmod.catnip.utility.lang.LangNumberFormat; import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.TextComponent; import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.fluids.FluidStack; -public class Lang { +public class CreateLang extends Lang { /** - * legacy-ish. Use Lang.translate and other builder methods where possible - * - * @param key - * @param args - * @return + * legacy-ish. Use CreateLang.translate and other builder methods where possible + * */ public static TranslatableComponent translateDirect(String key, Object... args) { - return new TranslatableComponent(Create.ID + "." + key, resolveBuilders(args)); - } - - public static String asId(String name) { - return name.toLowerCase(Locale.ROOT); - } - - public static String nonPluralId(String name) { - String asId = asId(name); - return asId.endsWith("s") ? asId.substring(0, asId.length() - 1) : asId; + return new TranslatableComponent(Create.ID + "." + key, LangBuilder.resolveBuilders(args)); } public static List translatedOptions(String prefix, String... keys) { @@ -42,35 +31,23 @@ public class Lang { return result; } - public static Component empty() { - return TextComponent.EMPTY; - } - - // - public static LangBuilder builder() { return new LangBuilder(Create.ID); } - public static LangBuilder builder(String namespace) { - return new LangBuilder(namespace); - } - - // - public static LangBuilder blockName(BlockState state) { return builder().add(state.getBlock() - .getName()); + .getName()); } public static LangBuilder itemName(ItemStack stack) { return builder().add(stack.getHoverName() - .copy()); + .copy()); } public static LangBuilder fluidName(FluidStack stack) { return builder().add(stack.getDisplayName() - .copy()); + .copy()); } public static LangBuilder number(double d) { @@ -85,13 +62,4 @@ public class Lang { return builder().text(text); } - // - - public static Object[] resolveBuilders(Object[] args) { - for (int i = 0; i < args.length; i++) - if (args[i]instanceof LangBuilder cb) - args[i] = cb.component(); - return args; - } - } diff --git a/src/main/java/com/simibubi/create/foundation/utility/DirectionHelper.java b/src/main/java/com/simibubi/create/foundation/utility/DirectionHelper.java deleted file mode 100644 index a5ea227fa2..0000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/DirectionHelper.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.simibubi.create.foundation.utility; - -import static net.minecraft.core.Direction.DOWN; -import static net.minecraft.core.Direction.EAST; -import static net.minecraft.core.Direction.NORTH; -import static net.minecraft.core.Direction.SOUTH; -import static net.minecraft.core.Direction.UP; -import static net.minecraft.core.Direction.WEST; - -import net.minecraft.core.Direction; -import net.minecraft.core.Direction.Axis; - -/** - * A bunch of methods that got stripped out of Direction in 1.15 - * - * @author Mojang - */ -public class DirectionHelper { - - public static Direction rotateAround(Direction dir, Direction.Axis axis) { - switch (axis) { - case X: - if (dir != WEST && dir != EAST) { - return rotateX(dir); - } - - return dir; - case Y: - if (dir != UP && dir != DOWN) { - return dir.getClockWise(); - } - - return dir; - case Z: - if (dir != NORTH && dir != SOUTH) { - return rotateZ(dir); - } - - return dir; - default: - throw new IllegalStateException("Unable to get CW facing for axis " + axis); - } - } - - public static Direction rotateX(Direction dir) { - switch (dir) { - case NORTH: - return DOWN; - case EAST: - case WEST: - default: - throw new IllegalStateException("Unable to get X-rotated facing of " + dir); - case SOUTH: - return UP; - case UP: - return NORTH; - case DOWN: - return SOUTH; - } - } - - public static Direction rotateZ(Direction dir) { - switch (dir) { - case EAST: - return DOWN; - case SOUTH: - default: - throw new IllegalStateException("Unable to get Z-rotated facing of " + dir); - case WEST: - return UP; - case UP: - return EAST; - case DOWN: - return WEST; - } - } - - public static Direction getPositivePerpendicular(Axis horizontalAxis) { - return horizontalAxis == Axis.X ? SOUTH : EAST; - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/utility/DyeHelper.java b/src/main/java/com/simibubi/create/foundation/utility/DyeHelper.java index b9d690b984..772f0aaf7c 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/DyeHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/DyeHelper.java @@ -4,6 +4,7 @@ import java.util.Map; import com.google.common.collect.ImmutableMap; +import net.createmod.catnip.utility.Couple; import net.minecraft.world.item.DyeColor; import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.block.Blocks; @@ -49,28 +50,28 @@ public class DyeHelper { } public static final Map> DYE_TABLE = new ImmutableMap.Builder>() - + // DyeColor, ( Front RGB, Back RGB ) .put(DyeColor.BLACK, Couple.create(0x45403B, 0x21201F)) .put(DyeColor.RED, Couple.create(0xB13937, 0x632737)) .put(DyeColor.GREEN, Couple.create(0x208A46, 0x1D6045)) .put(DyeColor.BROWN, Couple.create(0xAC855C, 0x68533E)) - + .put(DyeColor.BLUE, Couple.create(0x5391E1, 0x504B90)) .put(DyeColor.GRAY, Couple.create(0x5D666F, 0x313538)) .put(DyeColor.LIGHT_GRAY, Couple.create(0x95969B, 0x707070)) .put(DyeColor.PURPLE, Couple.create(0x9F54AE, 0x63366C)) - + .put(DyeColor.CYAN, Couple.create(0x3EABB4, 0x3C7872)) .put(DyeColor.PINK, Couple.create(0xD5A8CB, 0xB86B95)) .put(DyeColor.LIME, Couple.create(0xA3DF55, 0x4FB16F)) .put(DyeColor.YELLOW, Couple.create(0xE6D756, 0xE9AC29)) - + .put(DyeColor.LIGHT_BLUE, Couple.create(0x69CED2, 0x508AA5)) .put(DyeColor.ORANGE, Couple.create(0xEE9246, 0xD94927)) .put(DyeColor.MAGENTA, Couple.create(0xF062B0, 0xC04488)) .put(DyeColor.WHITE, Couple.create(0xEDEAE5, 0xBBB6B0)) - + .build(); } diff --git a/src/main/java/com/simibubi/create/foundation/utility/FilesHelper.java b/src/main/java/com/simibubi/create/foundation/utility/FilesHelper.java index a4b3c8b78f..4e82204af5 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/FilesHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/FilesHelper.java @@ -15,6 +15,7 @@ import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; import com.simibubi.create.Create; +import net.createmod.catnip.utility.lang.Lang; import net.minecraft.nbt.CompoundTag; public class FilesHelper { diff --git a/src/main/java/com/simibubi/create/foundation/utility/FluidFormatter.java b/src/main/java/com/simibubi/create/foundation/utility/FluidFormatter.java index 5e9ac98dc9..66ac19a09b 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/FluidFormatter.java +++ b/src/main/java/com/simibubi/create/foundation/utility/FluidFormatter.java @@ -1,5 +1,6 @@ package com.simibubi.create.foundation.utility; +import net.createmod.catnip.utility.Couple; import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.TextComponent; @@ -14,13 +15,13 @@ public class FluidFormatter { if (shorten && amount >= 1000) { return Couple.create( new TextComponent(String.format("%.1f" , amount / 1000d)), - Lang.translateDirect("generic.unit.buckets") + CreateLang.translateDirect("generic.unit.buckets") ); } return Couple.create( new TextComponent(String.valueOf(amount)), - Lang.translateDirect("generic.unit.millibuckets") + CreateLang.translateDirect("generic.unit.millibuckets") ); } diff --git a/src/main/java/com/simibubi/create/foundation/utility/FontHelper.java b/src/main/java/com/simibubi/create/foundation/utility/FontHelper.java deleted file mode 100644 index c9914e91e1..0000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/FontHelper.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.simibubi.create.foundation.utility; - -import java.text.BreakIterator; -import java.util.LinkedList; -import java.util.List; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.Tesselator; -import com.mojang.math.Matrix4f; - -import net.minecraft.client.gui.Font; -import net.minecraft.client.renderer.LightTexture; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraftforge.client.MinecraftForgeClient; - -public final class FontHelper { - - private FontHelper() {} - - public static List cutString(Font font, String text, int maxWidthPerLine) { - // Split words - List words = new LinkedList<>(); - BreakIterator iterator = BreakIterator.getLineInstance(MinecraftForgeClient.getLocale()); - iterator.setText(text); - int start = iterator.first(); - for (int end = iterator.next(); end != BreakIterator.DONE; start = end, end = iterator.next()) { - String word = text.substring(start, end); - words.add(word); - } - // Apply hard wrap - List lines = new LinkedList<>(); - StringBuilder currentLine = new StringBuilder(); - int width = 0; - for (String word : words) { - int newWidth = font.width(word); - if (width + newWidth > maxWidthPerLine) { - if (width > 0) { - String line = currentLine.toString(); - lines.add(line); - currentLine = new StringBuilder(); - width = 0; - } else { - lines.add(word); - continue; - } - } - currentLine.append(word); - width += newWidth; - } - if (width > 0) { - lines.add(currentLine.toString()); - } - return lines; - } - - public static void drawSplitString(PoseStack ms, Font font, String text, int x, int y, int width, - int color) { - List list = cutString(font, text, width); - Matrix4f matrix4f = ms.last() - .pose(); - - for (String s : list) { - float f = (float) x; - if (font.isBidirectional()) { - int i = font.width(font.bidirectionalShaping(s)); - f += (float) (width - i); - } - - draw(font, s, f, (float) y, color, matrix4f, false); - y += 9; - } - } - - private static int draw(Font font, String p_228078_1_, float p_228078_2_, float p_228078_3_, - int p_228078_4_, Matrix4f p_228078_5_, boolean p_228078_6_) { - if (p_228078_1_ == null) { - return 0; - } else { - MultiBufferSource.BufferSource irendertypebuffer$impl = MultiBufferSource.immediate(Tesselator.getInstance() - .getBuilder()); - int i = font.drawInBatch(p_228078_1_, p_228078_2_, p_228078_3_, p_228078_4_, p_228078_6_, p_228078_5_, - irendertypebuffer$impl, false, 0, LightTexture.FULL_BRIGHT); - irendertypebuffer$impl.endBatch(); - return i; - } - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/utility/IntAttached.java b/src/main/java/com/simibubi/create/foundation/utility/IntAttached.java deleted file mode 100644 index 884258200e..0000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/IntAttached.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.simibubi.create.foundation.utility; - -import java.util.Comparator; -import java.util.function.Function; - -import net.minecraft.nbt.CompoundTag; - -public class IntAttached extends Pair { - - protected IntAttached(Integer first, V second) { - super(first, second); - } - - public static IntAttached with(int number, V value) { - return new IntAttached<>(number, value); - } - - public static IntAttached withZero(V value) { - return new IntAttached<>(0, value); - } - - public boolean isZero() { - return first.intValue() == 0; - } - - public boolean exceeds(int value) { - return first.intValue() > value; - } - - public boolean isOrBelowZero() { - return first.intValue() <= 0; - } - - public void increment() { - first++; - } - - public void decrement() { - first--; - } - - public V getValue() { - return getSecond(); - } - - public CompoundTag serializeNBT(Function serializer) { - CompoundTag nbt = new CompoundTag(); - nbt.put("Item", serializer.apply(getValue())); - nbt.putInt("Location", getFirst()); - return nbt; - } - - public static Comparator> comparator() { - return (i1, i2) -> Integer.compare(i2.getFirst(), i1.getFirst()); - } - - public static IntAttached read(CompoundTag nbt, Function deserializer) { - return IntAttached.with(nbt.getInt("Location"), deserializer.apply(nbt.getCompound("Item"))); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/utility/Iterate.java b/src/main/java/com/simibubi/create/foundation/utility/Iterate.java deleted file mode 100644 index e8e541aa19..0000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/Iterate.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.simibubi.create.foundation.utility; - -import java.util.Arrays; -import java.util.EnumSet; -import java.util.List; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.core.Direction.Axis; - -public class Iterate { - - public static final boolean[] trueAndFalse = { true, false }; - public static final boolean[] falseAndTrue = { false, true }; - public static final int[] zeroAndOne = { 0, 1 }; - public static final int[] positiveAndNegative = { 1, -1 }; - public static final Direction[] directions = Direction.values(); - public static final Direction[] horizontalDirections = getHorizontals(); - public static final Axis[] axes = Axis.values(); - public static final EnumSet axisSet = EnumSet.allOf(Direction.Axis.class); - - private static Direction[] getHorizontals() { - Direction[] directions = new Direction[4]; - for (int i = 0; i < 4; i++) - directions[i] = Direction.from2DDataValue(i); - return directions; - } - - public static Direction[] directionsInAxis(Axis axis) { - switch (axis) { - case X: - return new Direction[] { Direction.EAST, Direction.WEST }; - case Y: - return new Direction[] { Direction.UP, Direction.DOWN }; - default: - case Z: - return new Direction[] { Direction.SOUTH, Direction.NORTH }; - } - } - - public static List hereAndBelow(BlockPos pos) { - return Arrays.asList(pos, pos.below()); - } - - public static List hereBelowAndAbove(BlockPos pos) { - return Arrays.asList(pos, pos.below(), pos.above()); - } -} diff --git a/src/main/java/com/simibubi/create/foundation/utility/LangBuilder.java b/src/main/java/com/simibubi/create/foundation/utility/LangBuilder.java deleted file mode 100644 index 5440c102ae..0000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/LangBuilder.java +++ /dev/null @@ -1,167 +0,0 @@ -package com.simibubi.create.foundation.utility; - -import java.util.List; - -import joptsimple.internal.Strings; -import net.minecraft.ChatFormatting; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.MutableComponent; -import net.minecraft.network.chat.TextComponent; -import net.minecraft.network.chat.TranslatableComponent; -import net.minecraft.world.entity.player.Player; - -public class LangBuilder { - - String namespace; - MutableComponent component; - - public LangBuilder(String namespace) { - this.namespace = namespace; - } - - public LangBuilder space() { - return text(" "); - } - - public LangBuilder newLine() { - return text("\n"); - } - - /** - * Appends a localised component
- * To add an independently formatted localised component, use add() and a nested - * builder - * - * @param langKey - * @param args - * @return - */ - public LangBuilder translate(String langKey, Object... args) { - return add(new TranslatableComponent(namespace + "." + langKey, Lang.resolveBuilders(args))); - } - - /** - * Appends a text component - * - * @param literalText - * @return - */ - public LangBuilder text(String literalText) { - return add(new TextComponent(literalText)); - } - - /** - * Appends a colored text component - * - * @param format - * @param literalText - * @return - */ - public LangBuilder text(ChatFormatting format, String literalText) { - return add(new TextComponent(literalText).withStyle(format)); - } - - /** - * Appends a colored text component - * - * @param color - * @param literalText - * @return - */ - public LangBuilder text(int color, String literalText) { - return add(new TextComponent(literalText).withStyle(s -> s.withColor(color))); - } - - /** - * Appends the contents of another builder - * - * @param otherBuilder - * @return - */ - public LangBuilder add(LangBuilder otherBuilder) { - return add(otherBuilder.component()); - } - - /** - * Appends a component - * - * @param customComponent - * @return - */ - public LangBuilder add(MutableComponent customComponent) { - component = component == null ? customComponent : component.append(customComponent); - return this; - } - - // - - /** - * Applies the format to all added components - * - * @param format - * @return - */ - public LangBuilder style(ChatFormatting format) { - assertComponent(); - component = component.withStyle(format); - return this; - } - - /** - * Applies the color to all added components - * - * @param color - * @return - */ - public LangBuilder color(int color) { - assertComponent(); - component = component.withStyle(s -> s.withColor(color)); - return this; - } - - // - - public MutableComponent component() { - assertComponent(); - return component; - } - - public String string() { - return component().getString(); - } - - public String json() { - return Component.Serializer.toJson(component()); - } - - public void sendStatus(Player player) { - player.displayClientMessage(component(), true); - } - - public void sendChat(Player player) { - player.displayClientMessage(component(), false); - } - - public void addTo(List tooltip) { - tooltip.add(component()); - } - - public void forGoggles(List tooltip) { - forGoggles(tooltip, 0); - } - - public void forGoggles(List tooltip, int indents) { - tooltip.add(Lang.builder() - .text(Strings.repeat(' ', 4 + indents)) - .add(this) - .component()); - } - - // - - private void assertComponent() { - if (component == null) - throw new IllegalStateException("No components were added to builder"); - } - -} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/foundation/utility/LangNumberFormat.java b/src/main/java/com/simibubi/create/foundation/utility/LangNumberFormat.java deleted file mode 100644 index e96b33e502..0000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/LangNumberFormat.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.simibubi.create.foundation.utility; - -import java.text.NumberFormat; -import java.util.Locale; - -import net.minecraft.client.Minecraft; - -public class LangNumberFormat { - - private NumberFormat format = NumberFormat.getNumberInstance(Locale.ROOT); - public static LangNumberFormat numberFormat = new LangNumberFormat(); - - public NumberFormat get() { - return format; - } - - public void update() { - format = NumberFormat.getInstance(Minecraft.getInstance() - .getLanguageManager() - .getSelected() - .getJavaLocale()); - format.setMaximumFractionDigits(2); - format.setMinimumFractionDigits(0); - format.setGroupingUsed(true); - } - - public static String format(double d) { - return numberFormat.get() - .format(d) - .replace("\u00A0", " "); - } - -} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/foundation/utility/NBTHelper.java b/src/main/java/com/simibubi/create/foundation/utility/NBTHelper.java deleted file mode 100644 index 267a343eb5..0000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/NBTHelper.java +++ /dev/null @@ -1,111 +0,0 @@ -package com.simibubi.create.foundation.utility; - -import java.util.ArrayList; -import java.util.List; -import java.util.function.Consumer; -import java.util.function.Function; - -import javax.annotation.Nonnull; - -import net.minecraft.core.Vec3i; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.FloatTag; -import net.minecraft.nbt.IntTag; -import net.minecraft.nbt.ListTag; -import net.minecraft.nbt.Tag; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.phys.AABB; - -public class NBTHelper { - - public static void putMarker(CompoundTag nbt, String marker) { - nbt.putBoolean(marker, true); - } - - public static > T readEnum(CompoundTag nbt, String key, Class enumClass) { - T[] enumConstants = enumClass.getEnumConstants(); - if (enumConstants == null) - throw new IllegalArgumentException("Non-Enum class passed to readEnum: " + enumClass.getName()); - if (nbt.contains(key, Tag.TAG_STRING)) { - String name = nbt.getString(key); - for (T t : enumConstants) { - if (t.name() - .equals(name)) - return t; - } - } - return enumConstants[0]; - } - - public static > void writeEnum(CompoundTag nbt, String key, T enumConstant) { - nbt.putString(key, enumConstant.name()); - } - - public static ListTag writeCompoundList(Iterable list, Function serializer) { - ListTag listNBT = new ListTag(); - list.forEach(t -> { - CompoundTag apply = serializer.apply(t); - if (apply == null) - return; - listNBT.add(apply); - }); - return listNBT; - } - - public static List readCompoundList(ListTag listNBT, Function deserializer) { - List list = new ArrayList<>(listNBT.size()); - listNBT.forEach(inbt -> list.add(deserializer.apply((CompoundTag) inbt))); - return list; - } - - public static void iterateCompoundList(ListTag listNBT, Consumer consumer) { - listNBT.forEach(inbt -> consumer.accept((CompoundTag) inbt)); - } - - public static ListTag writeItemList(Iterable stacks) { - return writeCompoundList(stacks, ItemStack::serializeNBT); - } - - public static List readItemList(ListTag stacks) { - return readCompoundList(stacks, ItemStack::of); - } - - public static ListTag writeAABB(AABB bb) { - ListTag bbtag = new ListTag(); - bbtag.add(FloatTag.valueOf((float) bb.minX)); - bbtag.add(FloatTag.valueOf((float) bb.minY)); - bbtag.add(FloatTag.valueOf((float) bb.minZ)); - bbtag.add(FloatTag.valueOf((float) bb.maxX)); - bbtag.add(FloatTag.valueOf((float) bb.maxY)); - bbtag.add(FloatTag.valueOf((float) bb.maxZ)); - return bbtag; - } - - public static AABB readAABB(ListTag bbtag) { - if (bbtag == null || bbtag.isEmpty()) - return null; - return new AABB(bbtag.getFloat(0), bbtag.getFloat(1), bbtag.getFloat(2), bbtag.getFloat(3), - bbtag.getFloat(4), bbtag.getFloat(5)); - } - - public static ListTag writeVec3i(Vec3i vec) { - ListTag tag = new ListTag(); - tag.add(IntTag.valueOf(vec.getX())); - tag.add(IntTag.valueOf(vec.getY())); - tag.add(IntTag.valueOf(vec.getZ())); - return tag; - } - - public static Vec3i readVec3i(ListTag tag) { - return new Vec3i(tag.getInt(0), tag.getInt(1), tag.getInt(2)); - } - - @Nonnull - public static Tag getINBT(CompoundTag nbt, String id) { - Tag inbt = nbt.get(id); - if (inbt != null) - return inbt; - return new CompoundTag(); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/utility/Pair.java b/src/main/java/com/simibubi/create/foundation/utility/Pair.java deleted file mode 100644 index 908e7047cb..0000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/Pair.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.simibubi.create.foundation.utility; - -import java.util.Objects; - -public class Pair { - - F first; - S second; - - protected Pair(F first, S second) { - this.first = first; - this.second = second; - } - - public static Pair of(F first, S second) { - return new Pair<>(first, second); - } - - public F getFirst() { - return first; - } - - public S getSecond() { - return second; - } - - public void setFirst(F first) { - this.first = first; - } - - public void setSecond(S second) { - this.second = second; - } - - public Pair copy() { - return Pair.of(first, second); - } - - @Override - public boolean equals(final Object obj) { - if (obj == this) - return true; - if (obj instanceof Pair) { - final Pair other = (Pair) obj; - return Objects.equals(first, other.first) && Objects.equals(second, other.second); - } - return false; - } - - @Override - public int hashCode() { - return (nullHash(first) * 31) ^ nullHash(second); - } - - int nullHash(Object o) { - return o == null ? 0 : o.hashCode(); - } - - @Override - public String toString() { - return "(" + first + ", " + second + ")"; - } - - public Pair swap() { - return Pair.of(second, first); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/utility/Pointing.java b/src/main/java/com/simibubi/create/foundation/utility/Pointing.java deleted file mode 100644 index e0829811b6..0000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/Pointing.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.simibubi.create.foundation.utility; - -import net.minecraft.core.Direction; -import net.minecraft.core.Direction.Axis; -import net.minecraft.core.Direction.AxisDirection; -import net.minecraft.util.StringRepresentable; - -public enum Pointing implements StringRepresentable { - UP(0), LEFT(270), DOWN(180), RIGHT(90); - - private int xRotation; - - private Pointing(int xRotation) { - this.xRotation = xRotation; - } - - @Override - public String getSerializedName() { - return Lang.asId(name()); - } - - public int getXRotation() { - return xRotation; - } - - public Direction getCombinedDirection(Direction direction) { - Axis axis = direction.getAxis(); - Direction top = axis == Axis.Y ? Direction.SOUTH : Direction.UP; - int rotations = direction.getAxisDirection() == AxisDirection.NEGATIVE ? 4 - ordinal() : ordinal(); - for (int i = 0; i < rotations; i++) - top = DirectionHelper.rotateAround(top, axis); - return top; - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/utility/ServerSpeedProvider.java b/src/main/java/com/simibubi/create/foundation/utility/ServerSpeedProvider.java index 3ec6c46192..a9670f4ac0 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/ServerSpeedProvider.java +++ b/src/main/java/com/simibubi/create/foundation/utility/ServerSpeedProvider.java @@ -5,9 +5,9 @@ import java.util.function.Supplier; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.networking.SimplePacketBase; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; -import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; import net.minecraft.client.Minecraft; import net.minecraft.network.FriendlyByteBuf; import net.minecraftforge.api.distmarker.Dist; diff --git a/src/main/java/com/simibubi/create/foundation/utility/TreeCutter.java b/src/main/java/com/simibubi/create/foundation/utility/TreeCutter.java index af46f9b980..9622fae699 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/TreeCutter.java +++ b/src/main/java/com/simibubi/create/foundation/utility/TreeCutter.java @@ -17,6 +17,7 @@ import com.simibubi.create.AllTags; import com.simibubi.create.compat.Mods; import com.simibubi.create.compat.dynamictrees.DynamicTree; +import net.createmod.catnip.utility.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.tags.BlockTags; @@ -47,7 +48,7 @@ public class TreeCutter { @Nonnull public static Optional findDynamicTree(Block startBlock, BlockPos pos) { - if (canDynamicTreeCutFrom(startBlock)) + if (canDynamicTreeCutFrom(startBlock)) return Mods.DYNAMICTREES.runIfInstalled(() -> () -> new DynamicTree(pos)); return Optional.empty(); } @@ -150,7 +151,7 @@ public class TreeCutter { if (property instanceof IntegerProperty ip && property.getName() .equals("distance")) distanceProperty = ip; - + int distance = !isLeaf ? 0 : blockState.getValue(distanceProperty); for (Direction direction : Iterate.directions) { BlockPos offset = currentPos.relative(direction); @@ -158,11 +159,11 @@ public class TreeCutter { continue; BlockState state = reader.getBlockState(offset); BlockPos subtract = offset.subtract(pos); - - for (Property property : state.getValues().keySet()) + + for (Property property : state.getValues().keySet()) if (property instanceof IntegerProperty ip && property.getName().equals("distance")) distanceProperty = ip; - + int horizontalDistance = Math.max(Math.abs(subtract.getX()), Math.abs(subtract.getZ())); if (isLeaf(state) && state.getValue(distanceProperty) > distance || isNonDecayingLeaf(state) && horizontalDistance < 4) @@ -247,7 +248,7 @@ public class TreeCutter { } private static boolean isLeaf(BlockState state) { - for (Property property : state.getValues().keySet()) + for (Property property : state.getValues().keySet()) if (property instanceof IntegerProperty && property.getName().equals("distance")) return true; return false; diff --git a/src/main/java/com/simibubi/create/foundation/utility/UniqueLinkedList.java b/src/main/java/com/simibubi/create/foundation/utility/UniqueLinkedList.java deleted file mode 100644 index d97f077ba2..0000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/UniqueLinkedList.java +++ /dev/null @@ -1,102 +0,0 @@ -package com.simibubi.create.foundation.utility; - -import java.util.Collection; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.stream.Collectors; - -public class UniqueLinkedList extends LinkedList { - /** - * - */ - private static final long serialVersionUID = 1L; - private final HashSet contained = new HashSet<>(); - - @Override - public boolean contains(Object o) { - return contained.contains(o); - } - - @Override - public E poll() { - E e = super.poll(); - contained.remove(e); - return e; - } - - @Override - public boolean add(E e) { - if (contained.add(e)) - return super.add(e); - else - return false; - } - - @Override - public void add(int index, E element) { - if (contained.add(element)) - super.add(index, element); - } - - @Override - public void addFirst(E e) { - if (contained.add(e)) - super.addFirst(e); - } - - @Override - public void addLast(E e) { - if (contained.add(e)) - super.addLast(e); - } - - @Override - public boolean addAll(Collection c) { - List filtered = c.stream() - .filter(it -> !contained.contains(it)) - .collect(Collectors.toList()); - return super.addAll(filtered); - } - - @Override - public boolean addAll(int index, Collection c) { - List filtered = c.stream() - .filter(it -> !contained.contains(it)) - .collect(Collectors.toList()); - return super.addAll(index, filtered); - } - - @Override - public boolean remove(Object o) { - contained.remove(o); - return super.remove(o); - } - - @Override - public E remove(int index) { - E e = super.remove(index); - contained.remove(e); - return e; - } - - @Override - public E removeFirst() { - E e = super.removeFirst(); - contained.remove(e); - return e; - } - - @Override - public E removeLast() { - E e = super.removeLast(); - contained.remove(e); - return e; - } - - @Override - public void clear() { - super.clear(); - contained.clear(); - } -} diff --git a/src/main/java/com/simibubi/create/foundation/utility/VecHelper.java b/src/main/java/com/simibubi/create/foundation/utility/VecHelper.java deleted file mode 100644 index ffb52b2b36..0000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/VecHelper.java +++ /dev/null @@ -1,346 +0,0 @@ -package com.simibubi.create.foundation.utility; - -import java.util.Random; - -import javax.annotation.Nullable; - -import com.mojang.math.Quaternion; -import com.mojang.math.Vector3f; -import com.simibubi.create.foundation.mixin.accessor.GameRendererAccessor; - -import net.minecraft.client.Camera; -import net.minecraft.client.Minecraft; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.core.Direction.Axis; -import net.minecraft.core.Vec3i; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.DoubleTag; -import net.minecraft.nbt.ListTag; -import net.minecraft.nbt.Tag; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.util.Mth; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.block.Mirror; -import net.minecraft.world.phys.Vec3; - -public class VecHelper { - - public static final Vec3 CENTER_OF_ORIGIN = new Vec3(.5, .5, .5); - - public static Vec3 rotate(Vec3 vec, Vec3 rotationVec) { - return rotate(vec, rotationVec.x, rotationVec.y, rotationVec.z); - } - - public static Vec3 rotate(Vec3 vec, double xRot, double yRot, double zRot) { - return rotate(rotate(rotate(vec, xRot, Axis.X), yRot, Axis.Y), zRot, Axis.Z); - } - - public static Vec3 rotateCentered(Vec3 vec, double deg, Axis axis) { - Vec3 shift = getCenterOf(BlockPos.ZERO); - return VecHelper.rotate(vec.subtract(shift), deg, axis) - .add(shift); - } - - public static Vec3 rotate(Vec3 vec, double deg, Axis axis) { - if (deg == 0) - return vec; - if (vec == Vec3.ZERO) - return vec; - - float angle = (float) (deg / 180f * Math.PI); - double sin = Mth.sin(angle); - double cos = Mth.cos(angle); - double x = vec.x; - double y = vec.y; - double z = vec.z; - - if (axis == Axis.X) - return new Vec3(x, y * cos - z * sin, z * cos + y * sin); - if (axis == Axis.Y) - return new Vec3(x * cos + z * sin, y, z * cos - x * sin); - if (axis == Axis.Z) - return new Vec3(x * cos - y * sin, y * cos + x * sin, z); - return vec; - } - - public static Vec3 mirrorCentered(Vec3 vec, Mirror mirror) { - Vec3 shift = getCenterOf(BlockPos.ZERO); - return VecHelper.mirror(vec.subtract(shift), mirror) - .add(shift); - } - - public static Vec3 mirror(Vec3 vec, Mirror mirror) { - if (mirror == null || mirror == Mirror.NONE) - return vec; - if (vec == Vec3.ZERO) - return vec; - - double x = vec.x; - double y = vec.y; - double z = vec.z; - - if (mirror == Mirror.LEFT_RIGHT) - return new Vec3(x, y, -z); - if (mirror == Mirror.FRONT_BACK) - return new Vec3(-x, y, z); - return vec; - } - - public static Vec3 lookAt(Vec3 vec, Vec3 fwd) { - fwd = fwd.normalize(); - Vec3 up = new Vec3(0, 1, 0); - double dot = fwd.dot(up); - if (Math.abs(dot) > 1 - 1.0E-3) - up = new Vec3(0, 0, dot > 0 ? 1 : -1); - Vec3 right = fwd.cross(up) - .normalize(); - up = right.cross(fwd) - .normalize(); - double x = vec.x * right.x + vec.y * up.x + vec.z * fwd.x; - double y = vec.x * right.y + vec.y * up.y + vec.z * fwd.y; - double z = vec.x * right.z + vec.y * up.z + vec.z * fwd.z; - return new Vec3(x, y, z); - } - - public static boolean isVecPointingTowards(Vec3 vec, Direction direction) { - return Vec3.atLowerCornerOf(direction.getNormal()) - .dot(vec.normalize()) > 0.125; // slight tolerance to activate perpendicular movement actors - } - - public static Vec3 getCenterOf(Vec3i pos) { - if (pos.equals(Vec3i.ZERO)) - return CENTER_OF_ORIGIN; - return Vec3.atLowerCornerOf(pos) - .add(.5f, .5f, .5f); - } - - public static Vec3 offsetRandomly(Vec3 vec, Random r, float radius) { - return new Vec3(vec.x + (r.nextFloat() - .5f) * 2 * radius, vec.y + (r.nextFloat() - .5f) * 2 * radius, - vec.z + (r.nextFloat() - .5f) * 2 * radius); - } - - public static Vec3 axisAlingedPlaneOf(Vec3 vec) { - vec = vec.normalize(); - return new Vec3(1, 1, 1).subtract(Math.abs(vec.x), Math.abs(vec.y), Math.abs(vec.z)); - } - - public static Vec3 axisAlingedPlaneOf(Direction face) { - return axisAlingedPlaneOf(Vec3.atLowerCornerOf(face.getNormal())); - } - - public static ListTag writeNBT(Vec3 vec) { - ListTag listnbt = new ListTag(); - listnbt.add(DoubleTag.valueOf(vec.x)); - listnbt.add(DoubleTag.valueOf(vec.y)); - listnbt.add(DoubleTag.valueOf(vec.z)); - return listnbt; - } - - public static CompoundTag writeNBTCompound(Vec3 vec) { - CompoundTag compoundTag = new CompoundTag(); - compoundTag.put("V", writeNBT(vec)); - return compoundTag; - } - - public static Vec3 readNBT(ListTag list) { - if (list.isEmpty()) - return Vec3.ZERO; - return new Vec3(list.getDouble(0), list.getDouble(1), list.getDouble(2)); - } - - public static Vec3 readNBTCompound(CompoundTag nbt) { - return readNBT(nbt.getList("V", Tag.TAG_DOUBLE)); - } - - public static void write(Vec3 vec, FriendlyByteBuf buffer) { - buffer.writeDouble(vec.x); - buffer.writeDouble(vec.y); - buffer.writeDouble(vec.z); - } - - public static Vec3 read(FriendlyByteBuf buffer) { - return new Vec3(buffer.readDouble(), buffer.readDouble(), buffer.readDouble()); - } - - public static Vec3 voxelSpace(double x, double y, double z) { - return new Vec3(x, y, z).scale(1 / 16f); - } - - public static int getCoordinate(Vec3i pos, Axis axis) { - return axis.choose(pos.getX(), pos.getY(), pos.getZ()); - } - - public static float getCoordinate(Vec3 vec, Axis axis) { - return (float) axis.choose(vec.x, vec.y, vec.z); - } - - public static boolean onSameAxis(BlockPos pos1, BlockPos pos2, Axis axis) { - if (pos1.equals(pos2)) - return true; - for (Axis otherAxis : Axis.values()) - if (axis != otherAxis) - if (getCoordinate(pos1, otherAxis) != getCoordinate(pos2, otherAxis)) - return false; - return true; - } - - public static Vec3 clamp(Vec3 vec, float maxLength) { - return vec.length() > maxLength ? vec.normalize() - .scale(maxLength) : vec; - } - - public static Vec3 lerp(float p, Vec3 from, Vec3 to) { - return from.add(to.subtract(from) - .scale(p)); - } - - public static Vec3 slerp(float p, Vec3 from, Vec3 to) { - double theta = Math.acos(from.dot(to)); - return from.scale(Mth.sin(1 - p) * theta) - .add(to.scale(Mth.sin((float) (theta * p)))) - .scale(1 / Mth.sin((float) theta)); - } - - public static Vec3 clampComponentWise(Vec3 vec, float maxLength) { - return new Vec3(Mth.clamp(vec.x, -maxLength, maxLength), Mth.clamp(vec.y, -maxLength, maxLength), - Mth.clamp(vec.z, -maxLength, maxLength)); - } - - public static Vec3 project(Vec3 vec, Vec3 ontoVec) { - if (ontoVec.equals(Vec3.ZERO)) - return Vec3.ZERO; - return ontoVec.scale(vec.dot(ontoVec) / ontoVec.lengthSqr()); - } - - @Nullable - public static Vec3 intersectSphere(Vec3 origin, Vec3 lineDirection, Vec3 sphereCenter, double radius) { - if (lineDirection.equals(Vec3.ZERO)) - return null; - if (lineDirection.length() != 1) - lineDirection = lineDirection.normalize(); - - Vec3 diff = origin.subtract(sphereCenter); - double lineDotDiff = lineDirection.dot(diff); - double delta = lineDotDiff * lineDotDiff - (diff.lengthSqr() - radius * radius); - if (delta < 0) - return null; - double t = -lineDotDiff + Math.sqrt(delta); - return origin.add(lineDirection.scale(t)); - } - - // https://forums.minecraftforge.net/topic/88562-116solved-3d-to-2d-conversion/?do=findComment&comment=413573 - // slightly modified - public static Vec3 projectToPlayerView(Vec3 target, float partialTicks) { - /* - * The (centered) location on the screen of the given 3d point in the world. - * Result is (dist right of center screen, dist up from center screen, if < 0, - * then in front of view plane) - */ - Camera ari = Minecraft.getInstance().gameRenderer.getMainCamera(); - Vec3 camera_pos = ari.getPosition(); - Quaternion camera_rotation_conj = ari.rotation() - .copy(); - camera_rotation_conj.conj(); - - Vector3f result3f = new Vector3f((float) (camera_pos.x - target.x), (float) (camera_pos.y - target.y), - (float) (camera_pos.z - target.z)); - result3f.transform(camera_rotation_conj); - - // ----- compensate for view bobbing (if active) ----- - // the following code adapted from GameRenderer::applyBobbing (to invert it) - Minecraft mc = Minecraft.getInstance(); - if (mc.options.bobView) { - Entity renderViewEntity = mc.getCameraEntity(); - if (renderViewEntity instanceof Player) { - Player playerentity = (Player) renderViewEntity; - float distwalked_modified = playerentity.walkDist; - - float f = distwalked_modified - playerentity.walkDistO; - float f1 = -(distwalked_modified + f * partialTicks); - float f2 = Mth.lerp(partialTicks, playerentity.oBob, playerentity.bob); - Quaternion q2 = - new Quaternion(Vector3f.XP, Math.abs(Mth.cos(f1 * (float) Math.PI - 0.2F) * f2) * 5.0F, true); - q2.conj(); - result3f.transform(q2); - - Quaternion q1 = new Quaternion(Vector3f.ZP, Mth.sin(f1 * (float) Math.PI) * f2 * 3.0F, true); - q1.conj(); - result3f.transform(q1); - - Vector3f bob_translation = new Vector3f((Mth.sin(f1 * (float) Math.PI) * f2 * 0.5F), - (-Math.abs(Mth.cos(f1 * (float) Math.PI) * f2)), 0.0f); - bob_translation.setY(-bob_translation.y()); // this is weird but hey, if it works - result3f.add(bob_translation); - } - } - - // ----- adjust for fov ----- - float fov = (float) ((GameRendererAccessor) mc.gameRenderer).create$callGetFov(ari, partialTicks, true); - - float half_height = (float) mc.getWindow() - .getGuiScaledHeight() / 2; - float scale_factor = half_height / (result3f.z() * (float) Math.tan(Math.toRadians(fov / 2))); - return new Vec3(-result3f.x() * scale_factor, result3f.y() * scale_factor, result3f.z()); - } - - public static Vec3 bezier(Vec3 p1, Vec3 p2, Vec3 q1, Vec3 q2, float t) { - Vec3 v1 = lerp(t, p1, q1); - Vec3 v2 = lerp(t, q1, q2); - Vec3 v3 = lerp(t, q2, p2); - Vec3 inner1 = lerp(t, v1, v2); - Vec3 inner2 = lerp(t, v2, v3); - Vec3 result = lerp(t, inner1, inner2); - return result; - } - - public static Vec3 bezierDerivative(Vec3 p1, Vec3 p2, Vec3 q1, Vec3 q2, float t) { - return p1.scale(-3 * t * t + 6 * t - 3) - .add(q1.scale(9 * t * t - 12 * t + 3)) - .add(q2.scale(-9 * t * t + 6 * t)) - .add(p2.scale(3 * t * t)); - } - - @Nullable - public static double[] intersectRanged(Vec3 p1, Vec3 q1, Vec3 p2, Vec3 q2, Axis plane) { - Vec3 pDiff = p2.subtract(p1); - Vec3 qDiff = q2.subtract(q1); - double[] intersect = intersect(p1, q1, pDiff.normalize(), qDiff.normalize(), plane); - if (intersect == null) - return null; - if (intersect[0] < 0 || intersect[1] < 0) - return null; - if (intersect[0] > pDiff.length() || intersect[1] > qDiff.length()) - return null; - return intersect; - } - - @Nullable - public static double[] intersect(Vec3 p1, Vec3 p2, Vec3 r, Vec3 s, Axis plane) { - if (plane == Axis.X) { - p1 = new Vec3(p1.y, 0, p1.z); - p2 = new Vec3(p2.y, 0, p2.z); - r = new Vec3(r.y, 0, r.z); - s = new Vec3(s.y, 0, s.z); - } - - if (plane == Axis.Z) { - p1 = new Vec3(p1.x, 0, p1.y); - p2 = new Vec3(p2.x, 0, p2.y); - r = new Vec3(r.x, 0, r.y); - s = new Vec3(s.x, 0, s.y); - } - - Vec3 qminusp = p2.subtract(p1); - double rcs = r.x * s.z - r.z * s.x; - if (Mth.equal(rcs, 0)) - return null; - Vec3 rdivrcs = r.scale(1 / rcs); - Vec3 sdivrcs = s.scale(1 / rcs); - double t = qminusp.x * sdivrcs.z - qminusp.z * sdivrcs.x; - double u = qminusp.x * rdivrcs.z - qminusp.z * rdivrcs.x; - return new double[] { t, u }; - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/utility/VoxelShaper.java b/src/main/java/com/simibubi/create/foundation/utility/VoxelShaper.java deleted file mode 100644 index b5aac84573..0000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/VoxelShaper.java +++ /dev/null @@ -1,143 +0,0 @@ -package com.simibubi.create.foundation.utility; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; -import java.util.function.Function; - -import org.apache.commons.lang3.mutable.MutableObject; - -import net.minecraft.core.Direction; -import net.minecraft.core.Direction.Axis; -import net.minecraft.core.Direction.AxisDirection; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.phys.Vec3; -import net.minecraft.world.phys.shapes.Shapes; -import net.minecraft.world.phys.shapes.VoxelShape; - -public class VoxelShaper { - - private Map shapes = new HashMap<>(); - - public VoxelShape get(Direction direction) { - return shapes.get(direction); - } - - public VoxelShape get(Axis axis) { - return shapes.get(axisAsFace(axis)); - } - - public static VoxelShaper forHorizontal(VoxelShape shape, Direction facing) { - return forDirectionsWithRotation(shape, facing, Direction.Plane.HORIZONTAL, new HorizontalRotationValues()); - } - - public static VoxelShaper forHorizontalAxis(VoxelShape shape, Axis along) { - return forDirectionsWithRotation(shape, axisAsFace(along), Arrays.asList(Direction.SOUTH, Direction.EAST), - new HorizontalRotationValues()); - } - - public static VoxelShaper forDirectional(VoxelShape shape, Direction facing) { - return forDirectionsWithRotation(shape, facing, Arrays.asList(Iterate.directions), new DefaultRotationValues()); - } - - public static VoxelShaper forAxis(VoxelShape shape, Axis along) { - return forDirectionsWithRotation(shape, axisAsFace(along), - Arrays.asList(Direction.SOUTH, Direction.EAST, Direction.UP), new DefaultRotationValues()); - } - - public VoxelShaper withVerticalShapes(VoxelShape upShape) { - shapes.put(Direction.UP, upShape); - shapes.put(Direction.DOWN, rotatedCopy(upShape, new Vec3(180, 0, 0))); - return this; - } - - public VoxelShaper withShape(VoxelShape shape, Direction facing) { - shapes.put(facing, shape); - return this; - } - - public static Direction axisAsFace(Axis axis) { - return Direction.get(AxisDirection.POSITIVE, axis); - } - - protected static float horizontalAngleFromDirection(Direction direction) { - return (float) ((Math.max(direction.get2DDataValue(), 0) & 3) * 90); - } - - protected static VoxelShaper forDirectionsWithRotation(VoxelShape shape, Direction facing, - Iterable directions, Function rotationValues) { - VoxelShaper voxelShaper = new VoxelShaper(); - for (Direction dir : directions) { - voxelShaper.shapes.put(dir, rotate(shape, facing, dir, rotationValues)); - } - return voxelShaper; - } - - protected static VoxelShape rotate(VoxelShape shape, Direction from, Direction to, - Function usingValues) { - if (from == to) - return shape; - - return rotatedCopy(shape, usingValues.apply(from) - .reverse() - .add(usingValues.apply(to))); - } - - protected static VoxelShape rotatedCopy(VoxelShape shape, Vec3 rotation) { - if (rotation.equals(Vec3.ZERO)) - return shape; - - MutableObject result = new MutableObject<>(Shapes.empty()); - Vec3 center = new Vec3(8, 8, 8); - - shape.forAllBoxes((x1, y1, z1, x2, y2, z2) -> { - Vec3 v1 = new Vec3(x1, y1, z1).scale(16) - .subtract(center); - Vec3 v2 = new Vec3(x2, y2, z2).scale(16) - .subtract(center); - - v1 = VecHelper.rotate(v1, (float) rotation.x, Axis.X); - v1 = VecHelper.rotate(v1, (float) rotation.y, Axis.Y); - v1 = VecHelper.rotate(v1, (float) rotation.z, Axis.Z) - .add(center); - - v2 = VecHelper.rotate(v2, (float) rotation.x, Axis.X); - v2 = VecHelper.rotate(v2, (float) rotation.y, Axis.Y); - v2 = VecHelper.rotate(v2, (float) rotation.z, Axis.Z) - .add(center); - - VoxelShape rotated = blockBox(v1, v2); - result.setValue(Shapes.or(result.getValue(), rotated)); - }); - - return result.getValue(); - } - - protected static VoxelShape blockBox(Vec3 v1, Vec3 v2) { - return Block.box( - Math.min(v1.x, v2.x), - Math.min(v1.y, v2.y), - Math.min(v1.z, v2.z), - Math.max(v1.x, v2.x), - Math.max(v1.y, v2.y), - Math.max(v1.z, v2.z) - ); - } - - protected static class DefaultRotationValues implements Function { - // assume facing up as the default rotation - @Override - public Vec3 apply(Direction direction) { - return new Vec3(direction == Direction.UP ? 0 : (Direction.Plane.VERTICAL.test(direction) ? 180 : 90), - -horizontalAngleFromDirection(direction), 0); - } - } - - protected static class HorizontalRotationValues implements Function { - @Override - public Vec3 apply(Direction direction) { - return new Vec3(0, -horizontalAngleFromDirection(direction), 0); - } - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/utility/WorldAttached.java b/src/main/java/com/simibubi/create/foundation/utility/WorldAttached.java deleted file mode 100644 index 4986354f50..0000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/WorldAttached.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.simibubi.create.foundation.utility; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import javax.annotation.Nonnull; - -import net.minecraft.world.level.LevelAccessor; -import net.minecraftforge.common.util.NonNullFunction; - -public class WorldAttached { - - static List> allMaps = new ArrayList<>(); - Map attached; - private final NonNullFunction factory; - - public WorldAttached(NonNullFunction factory) { - this.factory = factory; - attached = new HashMap<>(); - allMaps.add(attached); - } - - public static void invalidateWorld(LevelAccessor world) { - allMaps.forEach(m -> m.remove(world)); - } - - @Nonnull - public T get(LevelAccessor world) { - T t = attached.get(world); - if (t != null) - return t; - T entry = factory.apply(world); - put(world, entry); - return entry; - } - - public void put(LevelAccessor world, T entry) { - attached.put(world, entry); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/utility/WorldHelper.java b/src/main/java/com/simibubi/create/foundation/utility/WorldHelper.java deleted file mode 100644 index b444b6d6ea..0000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/WorldHelper.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.simibubi.create.foundation.utility; - -import net.minecraft.core.Registry; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.LevelAccessor; - -public class WorldHelper { - public static ResourceLocation getDimensionID(LevelAccessor world) { - return world.registryAccess() - .registryOrThrow(Registry.DIMENSION_TYPE_REGISTRY) - .getKey(world.dimensionType()); - } -} diff --git a/src/main/java/com/simibubi/create/foundation/utility/animation/Force.java b/src/main/java/com/simibubi/create/foundation/utility/animation/Force.java deleted file mode 100644 index d15b3e627a..0000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/animation/Force.java +++ /dev/null @@ -1,102 +0,0 @@ -package com.simibubi.create.foundation.utility.animation; - -public interface Force { - - float get(float mass, float value, float speed); - - boolean finished(); - - class Drag implements Force { - final float dragFactor; - - public Drag(float dragFactor) { - this.dragFactor = dragFactor; - } - - @Override - public float get(float mass, float value, float speed) { - return -speed * dragFactor; - } - - @Override - public boolean finished() { - return false; - } - } - - class Zeroing implements Force { - final float g; - - public Zeroing(float g) { - this.g = g / 20; - } - - @Override - public float get(float mass, float value, float speed) { - return -Math.signum(value) * g * mass; - } - - @Override - public boolean finished() { - return false; - } - } - - class Impulse implements Force { - - float force; - - public Impulse(float force) { - this.force = force; - } - - @Override - public float get(float mass, float value, float speed) { - return force; - } - - @Override - public boolean finished() { - return true; - } - } - - class OverTime implements Force { - int timeRemaining; - float f; - - public OverTime(int time, float totalAcceleration) { - this.timeRemaining = time; - this.f = totalAcceleration / (float) time; - } - - @Override - public float get(float mass, float value, float speed) { - timeRemaining--; - return f; - } - - @Override - public boolean finished() { - return timeRemaining <= 0; - } - } - - class Static implements Force { - float force; - - public Static(float force) { - this.force = force; - } - - @Override - public float get(float mass, float value, float speed) { - return force; - } - - @Override - public boolean finished() { - return false; - } - } -} diff --git a/src/main/java/com/simibubi/create/foundation/utility/animation/LerpedFloat.java b/src/main/java/com/simibubi/create/foundation/utility/animation/LerpedFloat.java deleted file mode 100644 index bb9e24ef11..0000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/animation/LerpedFloat.java +++ /dev/null @@ -1,150 +0,0 @@ -package com.simibubi.create.foundation.utility.animation; - -import com.simibubi.create.foundation.utility.AngleHelper; - -import net.minecraft.nbt.CompoundTag; -import net.minecraft.util.Mth; - -public class LerpedFloat { - - protected Interpolator interpolator; - protected float previousValue; - protected float value; - - protected Chaser chaseFunction; - protected float chaseTarget; - protected float chaseSpeed; - protected boolean angularChase; - - protected boolean forcedSync; - - public LerpedFloat(Interpolator interpolator) { - this.interpolator = interpolator; - startWithValue(0); - forcedSync = true; - } - - public static LerpedFloat linear() { - return new LerpedFloat((p, c, t) -> (float) Mth.lerp(p, c, t)); - } - - public static LerpedFloat angular() { - LerpedFloat lerpedFloat = new LerpedFloat(AngleHelper::angleLerp); - lerpedFloat.angularChase = true; - return lerpedFloat; - } - - public LerpedFloat startWithValue(double value) { - float f = (float) value; - this.previousValue = f; - this.chaseTarget = f; - this.value = f; - return this; - } - - public LerpedFloat chase(double value, double speed, Chaser chaseFunction) { - updateChaseTarget((float) value); - this.chaseSpeed = (float) speed; - this.chaseFunction = chaseFunction; - return this; - } - - public LerpedFloat disableSmartAngleChasing() { - angularChase = false; - return this; - } - - public void updateChaseTarget(float target) { - if (angularChase) - target = value + AngleHelper.getShortestAngleDiff(value, target); - this.chaseTarget = target; - } - - public boolean updateChaseSpeed(double speed) { - float prevSpeed = this.chaseSpeed; - this.chaseSpeed = (float) speed; - return !Mth.equal(prevSpeed, speed); - } - - public void tickChaser() { - previousValue = value; - if (chaseFunction == null) - return; - if (Mth.equal((double) value, chaseTarget)) { - value = chaseTarget; - return; - } - value = chaseFunction.chase(value, chaseSpeed, chaseTarget); - } - - public void setValueNoUpdate(double value) { - this.value = (float) value; - } - - public void setValue(double value) { - this.previousValue = this.value; - this.value = (float) value; - } - - public float getValue() { - return getValue(1); - } - - public float getValue(float partialTicks) { - return interpolator.interpolate(partialTicks, previousValue, value); - } - - public boolean settled() { - return Mth.equal((double) previousValue, value); - } - - public float getChaseTarget() { - return chaseTarget; - } - - public void forceNextSync() { - forcedSync = true; - } - - public CompoundTag writeNBT() { - CompoundTag compoundNBT = new CompoundTag(); - compoundNBT.putFloat("Speed", chaseSpeed); - compoundNBT.putFloat("Target", chaseTarget); - compoundNBT.putFloat("Value", value); - if (forcedSync) - compoundNBT.putBoolean("Force", true); - forcedSync = false; - return compoundNBT; - } - - public void readNBT(CompoundTag compoundNBT, boolean clientPacket) { - if (!clientPacket || compoundNBT.contains("Force")) - startWithValue(compoundNBT.getFloat("Value")); - readChaser(compoundNBT); - } - - protected void readChaser(CompoundTag compoundNBT) { - chaseSpeed = compoundNBT.getFloat("Speed"); - chaseTarget = compoundNBT.getFloat("Target"); - } - - @FunctionalInterface - public interface Interpolator { - float interpolate(double progress, double current, double target); - } - - @FunctionalInterface - public interface Chaser { - - Chaser IDLE = (c, s, t) -> (float) c; - Chaser EXP = exp(Double.MAX_VALUE); - Chaser LINEAR = (c, s, t) -> (float) (c + Mth.clamp(t - c, -s, s)); - - static Chaser exp(double maxEffectiveSpeed) { - return (c, s, t) -> (float) (c + Mth.clamp((t - c) * s, -maxEffectiveSpeed, maxEffectiveSpeed)); - } - - float chase(double current, double speed, double target); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/utility/animation/PhysicalFloat.java b/src/main/java/com/simibubi/create/foundation/utility/animation/PhysicalFloat.java deleted file mode 100644 index ca2e61afc4..0000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/animation/PhysicalFloat.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.simibubi.create.foundation.utility.animation; - -import java.util.ArrayList; - -import net.minecraft.util.Mth; - -public class PhysicalFloat { - - float previousValue; - float value; - - float previousSpeed; - float speed; - float limit = Float.NaN; - - float mass; - - private final ArrayList forces = new ArrayList<>(); - - public static PhysicalFloat create() { - return new PhysicalFloat(1); - } - - public static PhysicalFloat create(float mass) { - return new PhysicalFloat(mass); - } - - public PhysicalFloat(float mass) { - this.mass = mass; - } - - public PhysicalFloat startAt(double value) { - previousValue = this.value = (float) value; - return this; - } - - public PhysicalFloat withDrag(double drag) { - return addForce(new Force.Drag((float) drag)); - } - - public PhysicalFloat zeroing(double g) { - return addForce(new Force.Zeroing((float) g)); - } - - public PhysicalFloat withLimit(float limit) { - this.limit = limit; - return this; - } - - public void tick() { - previousSpeed = speed; - previousValue = value; - - float totalImpulse = 0; - for (Force force : forces) - totalImpulse += force.get(mass, value, speed) / mass; - - speed += totalImpulse; - - forces.removeIf(Force::finished); - - if (Float.isFinite(limit)) { - speed = Mth.clamp(speed, -limit, limit); - } - - value += speed; - } - - public PhysicalFloat addForce(Force f) { - forces.add(f); - return this; - } - - public PhysicalFloat bump(double force) { - return addForce(new Force.Impulse((float) force)); - } - - public PhysicalFloat bump(int time, double force) { - return addForce(new Force.OverTime(time, (float) force)); - } - - public float getValue() { - return getValue(1); - } - - public float getValue(float partialTicks) { - return Mth.lerp(partialTicks, previousValue, value); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlockParams.java b/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlockParams.java deleted file mode 100644 index 6c76a9525b..0000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlockParams.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.simibubi.create.foundation.utility.ghost; - -import java.util.function.Supplier; - -import net.minecraft.core.BlockPos; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; - -public class GhostBlockParams { - - protected final BlockState state; - protected BlockPos pos; - protected Supplier alphaSupplier; - - private GhostBlockParams(BlockState state) { - this.state = state; - this.pos = BlockPos.ZERO; - this.alphaSupplier = () -> 1f; - } - - public static GhostBlockParams of(BlockState state) { - return new GhostBlockParams(state); - } - - public static GhostBlockParams of(Block block) { - return of(block.defaultBlockState()); - } - - public GhostBlockParams at(BlockPos pos) { - this.pos = pos; - return this; - } - - public GhostBlockParams at(int x, int y, int z) { - return this.at(new BlockPos(x, y, z)); - } - - public GhostBlockParams alpha(Supplier alphaSupplier) { - this.alphaSupplier = alphaSupplier; - return this; - } - - public GhostBlockParams alpha(float alpha) { - return this.alpha(() -> alpha); - } - - public GhostBlockParams breathingAlpha() { - return this.alpha(() -> (float) GhostBlocks.getBreathingAlpha()); - } -} diff --git a/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlockRenderer.java b/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlockRenderer.java deleted file mode 100644 index 1f7cbc5005..0000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlockRenderer.java +++ /dev/null @@ -1,142 +0,0 @@ -package com.simibubi.create.foundation.utility.ghost; - -import java.util.List; -import java.util.Random; - -import javax.annotation.Nullable; - -import com.jozufozu.flywheel.core.virtual.VirtualEmptyModelData; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; -import com.simibubi.create.foundation.render.SuperRenderTypeBuffer; -import com.simibubi.create.foundation.utility.placement.PlacementHelpers; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.ItemBlockRenderTypes; -import net.minecraft.client.renderer.LevelRenderer; -import net.minecraft.client.renderer.LightTexture; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.block.BlockRenderDispatcher; -import net.minecraft.client.renderer.block.model.BakedQuad; -import net.minecraft.client.renderer.texture.OverlayTexture; -import net.minecraft.client.resources.model.BakedModel; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.util.Mth; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.client.model.data.IModelData; - -public abstract class GhostBlockRenderer { - - private static final GhostBlockRenderer STANDARD = new DefaultGhostBlockRenderer(); - - public static GhostBlockRenderer standard() { - return STANDARD; - } - - private static final GhostBlockRenderer TRANSPARENT = new TransparentGhostBlockRenderer(); - - public static GhostBlockRenderer transparent() { - return TRANSPARENT; - } - - public abstract void render(PoseStack ms, SuperRenderTypeBuffer buffer, GhostBlockParams params); - - private static class DefaultGhostBlockRenderer extends GhostBlockRenderer { - - @Override - public void render(PoseStack ms, SuperRenderTypeBuffer buffer, GhostBlockParams params) { - ms.pushPose(); - - BlockRenderDispatcher dispatcher = Minecraft.getInstance() - .getBlockRenderer(); - - BakedModel model = dispatcher.getBlockModel(params.state); - - RenderType layer = ItemBlockRenderTypes.getRenderType(params.state, false); - VertexConsumer vb = buffer.getEarlyBuffer(layer); - - BlockPos pos = params.pos; - ms.translate(pos.getX(), pos.getY(), pos.getZ()); - - dispatcher.getModelRenderer() - .renderModel(ms.last(), vb, params.state, model, 1f, 1f, 1f, LightTexture.FULL_BRIGHT, OverlayTexture.NO_OVERLAY, - VirtualEmptyModelData.INSTANCE); - - ms.popPose(); - } - - } - - private static class TransparentGhostBlockRenderer extends GhostBlockRenderer { - - @Override - public void render(PoseStack ms, SuperRenderTypeBuffer buffer, GhostBlockParams params) { - ms.pushPose(); - - Minecraft mc = Minecraft.getInstance(); - BlockRenderDispatcher dispatcher = mc.getBlockRenderer(); - - BakedModel model = dispatcher.getBlockModel(params.state); - - RenderType layer = RenderType.translucent(); - VertexConsumer vb = buffer.getEarlyBuffer(layer); - - BlockPos pos = params.pos; - ms.translate(pos.getX(), pos.getY(), pos.getZ()); - - ms.translate(.5, .5, .5); - ms.scale(.85f, .85f, .85f); - ms.translate(-.5, -.5, -.5); - - float alpha = params.alphaSupplier.get() * .75f * PlacementHelpers.getCurrentAlpha(); - renderModel(ms.last(), vb, params.state, model, 1f, 1f, 1f, alpha, - LevelRenderer.getLightColor(mc.level, pos), OverlayTexture.NO_OVERLAY, - VirtualEmptyModelData.INSTANCE); - - ms.popPose(); - } - - // ModelBlockRenderer - public void renderModel(PoseStack.Pose pose, VertexConsumer consumer, - @Nullable BlockState state, BakedModel model, float red, float green, float blue, - float alpha, int packedLight, int packedOverlay, IModelData modelData) { - Random random = new Random(); - - for (Direction direction : Direction.values()) { - random.setSeed(42L); - renderQuadList(pose, consumer, red, green, blue, alpha, - model.getQuads(state, direction, random, modelData), packedLight, packedOverlay); - } - - random.setSeed(42L); - renderQuadList(pose, consumer, red, green, blue, alpha, - model.getQuads(state, null, random, modelData), packedLight, packedOverlay); - } - - // ModelBlockRenderer - private static void renderQuadList(PoseStack.Pose pose, VertexConsumer consumer, - float red, float green, float blue, float alpha, List quads, - int packedLight, int packedOverlay) { - for (BakedQuad quad : quads) { - float f; - float f1; - float f2; - if (quad.isTinted()) { - f = Mth.clamp(red, 0.0F, 1.0F); - f1 = Mth.clamp(green, 0.0F, 1.0F); - f2 = Mth.clamp(blue, 0.0F, 1.0F); - } else { - f = 1.0F; - f1 = 1.0F; - f2 = 1.0F; - } - - consumer.putBulkData(pose, quad, f, f1, f2, alpha, packedLight, packedOverlay); - } - - } - - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlocks.java b/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlocks.java deleted file mode 100644 index 7fae395c93..0000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlocks.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.simibubi.create.foundation.utility.ghost; - -import java.util.HashMap; -import java.util.Map; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.foundation.render.SuperRenderTypeBuffer; - -import net.minecraft.util.Mth; -import net.minecraft.world.level.block.state.BlockState; - -public class GhostBlocks { - - public static double getBreathingAlpha() { - double period = 2500; - double timer = System.currentTimeMillis() % period; - double offset = Mth.cos((float) ((2d/period) * Math.PI * timer)); - return 0.55d - 0.2d * offset; - } - - final Map ghosts; - - public GhostBlockParams showGhostState(Object slot, BlockState state) { - return showGhostState(slot, state, 1); - } - - public GhostBlockParams showGhostState(Object slot, BlockState state, int ttl) { - Entry e = refresh(slot, GhostBlockRenderer.transparent(), GhostBlockParams.of(state), ttl); - return e.params; - } - - public GhostBlockParams showGhost(Object slot, GhostBlockRenderer ghost, GhostBlockParams params, int ttl) { - Entry e = refresh(slot, ghost, params, ttl); - return e.params; - } - - private Entry refresh(Object slot, GhostBlockRenderer ghost, GhostBlockParams params, int ttl) { - if (!ghosts.containsKey(slot)) - ghosts.put(slot, new Entry(ghost, params, ttl)); - - Entry e = ghosts.get(slot); - e.ticksToLive = ttl; - e.params = params; - e.ghost = ghost; - return e; - } - - public GhostBlocks() { - ghosts = new HashMap<>(); - } - - public void tickGhosts() { - ghosts.forEach((slot, entry) -> entry.ticksToLive--); - ghosts.entrySet().removeIf(e -> !e.getValue().isAlive()); - } - - public void renderAll(PoseStack ms, SuperRenderTypeBuffer buffer) { - ghosts.forEach((slot, entry) -> { - GhostBlockRenderer ghost = entry.ghost; - ghost.render(ms, buffer, entry.params); - }); - } - - static class Entry { - - private GhostBlockRenderer ghost; - private GhostBlockParams params; - private int ticksToLive; - - public Entry(GhostBlockRenderer ghost, GhostBlockParams params) { - this(ghost, params, 1); - } - - public Entry(GhostBlockRenderer ghost, GhostBlockParams params, int ttl) { - this.ghost = ghost; - this.params = params; - this.ticksToLive = ttl; - } - - public boolean isAlive() { - return ticksToLive >= 0; - } - } -} diff --git a/src/main/java/com/simibubi/create/foundation/utility/outliner/AABBOutline.java b/src/main/java/com/simibubi/create/foundation/utility/outliner/AABBOutline.java deleted file mode 100644 index 12af403493..0000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/outliner/AABBOutline.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.simibubi.create.foundation.utility.outliner; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; -import com.simibubi.create.foundation.render.RenderTypes; -import com.simibubi.create.foundation.render.SuperRenderTypeBuffer; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.core.Direction; -import net.minecraft.core.Direction.Axis; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.phys.AABB; -import net.minecraft.world.phys.Vec3; - -public class AABBOutline extends Outline { - - protected AABB bb; - - public AABBOutline(AABB bb) { - this.setBounds(bb); - } - - @Override - public void render(PoseStack ms, SuperRenderTypeBuffer buffer, float pt) { - renderBB(ms, buffer, bb); - } - - public void renderBB(PoseStack ms, SuperRenderTypeBuffer buffer, AABB bb) { - Vec3 projectedView = Minecraft.getInstance().gameRenderer.getMainCamera() - .getPosition(); - boolean noCull = bb.contains(projectedView); - bb = bb.inflate(noCull ? -1 / 128d : 1 / 128d); - noCull |= params.disableCull; - - Vec3 xyz = new Vec3(bb.minX, bb.minY, bb.minZ); - Vec3 Xyz = new Vec3(bb.maxX, bb.minY, bb.minZ); - Vec3 xYz = new Vec3(bb.minX, bb.maxY, bb.minZ); - Vec3 XYz = new Vec3(bb.maxX, bb.maxY, bb.minZ); - Vec3 xyZ = new Vec3(bb.minX, bb.minY, bb.maxZ); - Vec3 XyZ = new Vec3(bb.maxX, bb.minY, bb.maxZ); - Vec3 xYZ = new Vec3(bb.minX, bb.maxY, bb.maxZ); - Vec3 XYZ = new Vec3(bb.maxX, bb.maxY, bb.maxZ); - - Vec3 start = xyz; - renderAACuboidLine(ms, buffer, start, Xyz); - renderAACuboidLine(ms, buffer, start, xYz); - renderAACuboidLine(ms, buffer, start, xyZ); - - start = XyZ; - renderAACuboidLine(ms, buffer, start, xyZ); - renderAACuboidLine(ms, buffer, start, XYZ); - renderAACuboidLine(ms, buffer, start, Xyz); - - start = XYz; - renderAACuboidLine(ms, buffer, start, xYz); - renderAACuboidLine(ms, buffer, start, Xyz); - renderAACuboidLine(ms, buffer, start, XYZ); - - start = xYZ; - renderAACuboidLine(ms, buffer, start, XYZ); - renderAACuboidLine(ms, buffer, start, xyZ); - renderAACuboidLine(ms, buffer, start, xYz); - - renderFace(ms, buffer, Direction.NORTH, xYz, XYz, Xyz, xyz, noCull); - renderFace(ms, buffer, Direction.SOUTH, XYZ, xYZ, xyZ, XyZ, noCull); - renderFace(ms, buffer, Direction.EAST, XYz, XYZ, XyZ, Xyz, noCull); - renderFace(ms, buffer, Direction.WEST, xYZ, xYz, xyz, xyZ, noCull); - renderFace(ms, buffer, Direction.UP, xYZ, XYZ, XYz, xYz, noCull); - renderFace(ms, buffer, Direction.DOWN, xyz, Xyz, XyZ, xyZ, noCull); - - } - - protected void renderFace(PoseStack ms, SuperRenderTypeBuffer buffer, Direction direction, Vec3 p1, Vec3 p2, - Vec3 p3, Vec3 p4, boolean noCull) { - if (!params.faceTexture.isPresent()) - return; - - ResourceLocation faceTexture = params.faceTexture.get() - .getLocation(); - float alphaBefore = params.alpha; - params.alpha = - (direction == params.getHighlightedFace() && params.hightlightedFaceTexture.isPresent()) ? 1 : 0.5f; - - RenderType translucentType = RenderTypes.getOutlineTranslucent(faceTexture, !noCull); - VertexConsumer builder = buffer.getLateBuffer(translucentType); - - Axis axis = direction.getAxis(); - Vec3 uDiff = p2.subtract(p1); - Vec3 vDiff = p4.subtract(p1); - float maxU = (float) Math.abs(axis == Axis.X ? uDiff.z : uDiff.x); - float maxV = (float) Math.abs(axis == Axis.Y ? vDiff.z : vDiff.y); - putQuadUV(ms, builder, p1, p2, p3, p4, 0, 0, maxU, maxV, Direction.UP); - params.alpha = alphaBefore; - } - - public void setBounds(AABB bb) { - this.bb = bb; - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/utility/outliner/BlockClusterOutline.java b/src/main/java/com/simibubi/create/foundation/utility/outliner/BlockClusterOutline.java deleted file mode 100644 index 0f005a5bb9..0000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/outliner/BlockClusterOutline.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.simibubi.create.foundation.utility.outliner; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Optional; -import java.util.Set; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; -import com.simibubi.create.AllSpecialTextures; -import com.simibubi.create.foundation.render.RenderTypes; -import com.simibubi.create.foundation.render.SuperRenderTypeBuffer; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.VecHelper; - -import net.minecraft.client.renderer.RenderType; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.core.Direction.Axis; -import net.minecraft.core.Direction.AxisDirection; -import net.minecraft.world.phys.Vec3; - -public class BlockClusterOutline extends Outline { - - private Cluster cluster; - - public BlockClusterOutline(Iterable selection) { - cluster = new Cluster(); - selection.forEach(cluster::include); - } - - @Override - public void render(PoseStack ms, SuperRenderTypeBuffer buffer, float pt) { - cluster.visibleEdges.forEach(edge -> { - Vec3 start = Vec3.atLowerCornerOf(edge.pos); - Direction direction = Direction.get(AxisDirection.POSITIVE, edge.axis); - renderAACuboidLine(ms, buffer, start, Vec3.atLowerCornerOf(edge.pos.relative(direction))); - }); - - Optional faceTexture = params.faceTexture; - if (!faceTexture.isPresent()) - return; - - RenderType translucentType = RenderTypes.getOutlineTranslucent(faceTexture.get() - .getLocation(), true); - VertexConsumer builder = buffer.getLateBuffer(translucentType); - - cluster.visibleFaces.forEach((face, axisDirection) -> { - Direction direction = Direction.get(axisDirection, face.axis); - BlockPos pos = face.pos; - if (axisDirection == AxisDirection.POSITIVE) - pos = pos.relative(direction.getOpposite()); - renderBlockFace(ms, builder, pos, direction); - }); - } - - static Vec3 xyz = new Vec3(-.5, -.5, -.5); - static Vec3 Xyz = new Vec3(.5, -.5, -.5); - static Vec3 xYz = new Vec3(-.5, .5, -.5); - static Vec3 XYz = new Vec3(.5, .5, -.5); - static Vec3 xyZ = new Vec3(-.5, -.5, .5); - static Vec3 XyZ = new Vec3(.5, -.5, .5); - static Vec3 xYZ = new Vec3(-.5, .5, .5); - static Vec3 XYZ = new Vec3(.5, .5, .5); - - protected void renderBlockFace(PoseStack ms, VertexConsumer builder, BlockPos pos, Direction face) { - Vec3 center = VecHelper.getCenterOf(pos); - Vec3 offset = Vec3.atLowerCornerOf(face.getNormal()); - offset = offset.scale(1 / 128d); - center = center.add(offset); - - ms.pushPose(); - ms.translate(center.x, center.y, center.z); - - switch (face) { - case DOWN: - putQuad(ms, builder, xyz, Xyz, XyZ, xyZ, face); - break; - case EAST: - putQuad(ms, builder, XYz, XYZ, XyZ, Xyz, face); - break; - case NORTH: - putQuad(ms, builder, xYz, XYz, Xyz, xyz, face); - break; - case SOUTH: - putQuad(ms, builder, XYZ, xYZ, xyZ, XyZ, face); - break; - case UP: - putQuad(ms, builder, xYZ, XYZ, XYz, xYz, face); - break; - case WEST: - putQuad(ms, builder, xYZ, xYz, xyz, xyZ, face); - default: - break; - } - - ms.popPose(); - } - - private static class Cluster { - - private Map visibleFaces; - private Set visibleEdges; - - public Cluster() { - visibleEdges = new HashSet<>(); - visibleFaces = new HashMap<>(); - } - - public void include(BlockPos pos) { - - // 6 FACES - for (Axis axis : Iterate.axes) { - Direction direction = Direction.get(AxisDirection.POSITIVE, axis); - for (int offset : Iterate.zeroAndOne) { - MergeEntry entry = new MergeEntry(axis, pos.relative(direction, offset)); - if (visibleFaces.remove(entry) == null) - visibleFaces.put(entry, offset == 0 ? AxisDirection.NEGATIVE : AxisDirection.POSITIVE); - } - } - - // 12 EDGES - for (Axis axis : Iterate.axes) { - for (Axis axis2 : Iterate.axes) { - if (axis == axis2) - continue; - for (Axis axis3 : Iterate.axes) { - if (axis == axis3) - continue; - if (axis2 == axis3) - continue; - - Direction direction = Direction.get(AxisDirection.POSITIVE, axis2); - Direction direction2 = Direction.get(AxisDirection.POSITIVE, axis3); - - for (int offset : Iterate.zeroAndOne) { - BlockPos entryPos = pos.relative(direction, offset); - for (int offset2 : Iterate.zeroAndOne) { - entryPos = entryPos.relative(direction2, offset2); - MergeEntry entry = new MergeEntry(axis, entryPos); - if (!visibleEdges.remove(entry)) - visibleEdges.add(entry); - } - } - } - - break; - } - } - - } - - } - - private static class MergeEntry { - - private Axis axis; - private BlockPos pos; - - public MergeEntry(Axis axis, BlockPos pos) { - this.axis = axis; - this.pos = pos; - } - - @Override - public boolean equals(Object o) { - if (this == o) - return true; - if (!(o instanceof MergeEntry)) - return false; - - MergeEntry other = (MergeEntry) o; - return this.axis == other.axis && this.pos.equals(other.pos); - } - - @Override - public int hashCode() { - return this.pos.hashCode() * 31 + axis.ordinal(); - } - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/utility/outliner/ChasingAABBOutline.java b/src/main/java/com/simibubi/create/foundation/utility/outliner/ChasingAABBOutline.java deleted file mode 100644 index 4c0b22ba4d..0000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/outliner/ChasingAABBOutline.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.simibubi.create.foundation.utility.outliner; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.foundation.render.SuperRenderTypeBuffer; - -import net.minecraft.util.Mth; -import net.minecraft.world.phys.AABB; - -public class ChasingAABBOutline extends AABBOutline { - - AABB targetBB; - AABB prevBB; - - public ChasingAABBOutline(AABB bb) { - super(bb); - prevBB = bb.inflate(0); - targetBB = bb.inflate(0); - } - - public void target(AABB target) { - targetBB = target; - } - - @Override - public void tick() { - prevBB = bb; - setBounds(interpolateBBs(bb, targetBB, .5f)); - } - - @Override - public void render(PoseStack ms, SuperRenderTypeBuffer buffer, float pt) { - renderBB(ms, buffer, interpolateBBs(prevBB, bb, pt)); - } - - private static AABB interpolateBBs(AABB current, AABB target, float pt) { - return new AABB(Mth.lerp(pt, current.minX, target.minX), - Mth.lerp(pt, current.minY, target.minY), Mth.lerp(pt, current.minZ, target.minZ), - Mth.lerp(pt, current.maxX, target.maxX), Mth.lerp(pt, current.maxY, target.maxY), - Mth.lerp(pt, current.maxZ, target.maxZ)); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/utility/outliner/LineOutline.java b/src/main/java/com/simibubi/create/foundation/utility/outliner/LineOutline.java deleted file mode 100644 index 7803dbe846..0000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/outliner/LineOutline.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.simibubi.create.foundation.utility.outliner; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.foundation.render.SuperRenderTypeBuffer; - -import net.minecraft.util.Mth; -import net.minecraft.world.phys.Vec3; - -public class LineOutline extends Outline { - - protected Vec3 start = Vec3.ZERO; - protected Vec3 end = Vec3.ZERO; - - public LineOutline set(Vec3 start, Vec3 end) { - this.start = start; - this.end = end; - return this; - } - - @Override - public void render(PoseStack ms, SuperRenderTypeBuffer buffer, float pt) { - renderCuboidLine(ms, buffer, start, end); - } - - public static class EndChasingLineOutline extends LineOutline { - - float prevProgress = 0; - float progress = 0; - private boolean lockStart; - - public EndChasingLineOutline(boolean lockStart) { - this.lockStart = lockStart; - } - - @Override - public void tick() {} - - public EndChasingLineOutline setProgress(float progress) { - prevProgress = this.progress; - this.progress = progress; - return this; - } - - @Override - public LineOutline set(Vec3 start, Vec3 end) { - if (!end.equals(this.end)) - super.set(start, end); - return this; - } - - @Override - public void render(PoseStack ms, SuperRenderTypeBuffer buffer, float pt) { - float distanceToTarget = Mth.lerp(pt, prevProgress, progress); - if (!lockStart) - distanceToTarget = 1 - distanceToTarget; - Vec3 start = lockStart ? this.end : this.start; - Vec3 end = lockStart ? this.start : this.end; - - start = end.add(this.start.subtract(end) - .scale(distanceToTarget)); - renderCuboidLine(ms, buffer, start, end); - } - - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/utility/outliner/Outline.java b/src/main/java/com/simibubi/create/foundation/utility/outliner/Outline.java deleted file mode 100644 index 8f0b7d62eb..0000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/outliner/Outline.java +++ /dev/null @@ -1,248 +0,0 @@ -package com.simibubi.create.foundation.utility.outliner; - -import java.util.Optional; - -import javax.annotation.Nullable; - -import com.jozufozu.flywheel.util.transform.TransformStack; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; -import com.mojang.math.Matrix3f; -import com.simibubi.create.AllSpecialTextures; -import com.simibubi.create.foundation.render.RenderTypes; -import com.simibubi.create.foundation.render.SuperRenderTypeBuffer; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.Color; -import com.simibubi.create.foundation.utility.VecHelper; - -import net.minecraft.client.renderer.LightTexture; -import net.minecraft.client.renderer.texture.OverlayTexture; -import net.minecraft.core.Direction; -import net.minecraft.core.Direction.Axis; -import net.minecraft.util.Mth; -import net.minecraft.world.phys.Vec3; - -public abstract class Outline { - - protected OutlineParams params; - protected Matrix3f transformNormals; // TODO: not used? - - public Outline() { - params = new OutlineParams(); - } - - public abstract void render(PoseStack ms, SuperRenderTypeBuffer buffer, float pt); - - public void tick() {} - - public OutlineParams getParams() { - return params; - } - - public void renderCuboidLine(PoseStack ms, SuperRenderTypeBuffer buffer, Vec3 start, Vec3 end) { - Vec3 diff = end.subtract(start); - float hAngle = AngleHelper.deg(Mth.atan2(diff.x, diff.z)); - float hDistance = (float) diff.multiply(1, 0, 1) - .length(); - float vAngle = AngleHelper.deg(Mth.atan2(hDistance, diff.y)) - 90; - ms.pushPose(); - TransformStack.cast(ms) - .translate(start) - .rotateY(hAngle).rotateX(vAngle); - renderAACuboidLine(ms, buffer, Vec3.ZERO, new Vec3(0, 0, diff.length())); - ms.popPose(); - } - - public void renderAACuboidLine(PoseStack ms, SuperRenderTypeBuffer buffer, Vec3 start, Vec3 end) { - float lineWidth = params.getLineWidth(); - if (lineWidth == 0) - return; - - VertexConsumer builder = buffer.getBuffer(RenderTypes.getOutlineSolid()); - - Vec3 diff = end.subtract(start); - if (diff.x + diff.y + diff.z < 0) { - Vec3 temp = start; - start = end; - end = temp; - diff = diff.scale(-1); - } - - Vec3 extension = diff.normalize() - .scale(lineWidth / 2); - Vec3 plane = VecHelper.axisAlingedPlaneOf(diff); - Direction face = Direction.getNearest(diff.x, diff.y, diff.z); - Axis axis = face.getAxis(); - - start = start.subtract(extension); - end = end.add(extension); - plane = plane.scale(lineWidth / 2); - - Vec3 a1 = plane.add(start); - Vec3 b1 = plane.add(end); - plane = VecHelper.rotate(plane, -90, axis); - Vec3 a2 = plane.add(start); - Vec3 b2 = plane.add(end); - plane = VecHelper.rotate(plane, -90, axis); - Vec3 a3 = plane.add(start); - Vec3 b3 = plane.add(end); - plane = VecHelper.rotate(plane, -90, axis); - Vec3 a4 = plane.add(start); - Vec3 b4 = plane.add(end); - - if (params.disableNormals) { - face = Direction.UP; - putQuad(ms, builder, b4, b3, b2, b1, face); - putQuad(ms, builder, a1, a2, a3, a4, face); - putQuad(ms, builder, a1, b1, b2, a2, face); - putQuad(ms, builder, a2, b2, b3, a3, face); - putQuad(ms, builder, a3, b3, b4, a4, face); - putQuad(ms, builder, a4, b4, b1, a1, face); - return; - } - - putQuad(ms, builder, b4, b3, b2, b1, face); - putQuad(ms, builder, a1, a2, a3, a4, face.getOpposite()); - Vec3 vec = a1.subtract(a4); - face = Direction.getNearest(vec.x, vec.y, vec.z); - putQuad(ms, builder, a1, b1, b2, a2, face); - vec = VecHelper.rotate(vec, -90, axis); - face = Direction.getNearest(vec.x, vec.y, vec.z); - putQuad(ms, builder, a2, b2, b3, a3, face); - vec = VecHelper.rotate(vec, -90, axis); - face = Direction.getNearest(vec.x, vec.y, vec.z); - putQuad(ms, builder, a3, b3, b4, a4, face); - vec = VecHelper.rotate(vec, -90, axis); - face = Direction.getNearest(vec.x, vec.y, vec.z); - putQuad(ms, builder, a4, b4, b1, a1, face); - } - - public void putQuad(PoseStack ms, VertexConsumer builder, Vec3 v1, Vec3 v2, Vec3 v3, Vec3 v4, - Direction normal) { - putQuadUV(ms, builder, v1, v2, v3, v4, 0, 0, 1, 1, normal); - } - - public void putQuadUV(PoseStack ms, VertexConsumer builder, Vec3 v1, Vec3 v2, Vec3 v3, Vec3 v4, float minU, - float minV, float maxU, float maxV, Direction normal) { - putVertex(ms, builder, v1, minU, minV, normal); - putVertex(ms, builder, v2, maxU, minV, normal); - putVertex(ms, builder, v3, maxU, maxV, normal); - putVertex(ms, builder, v4, minU, maxV, normal); - } - - protected void putVertex(PoseStack ms, VertexConsumer builder, Vec3 pos, float u, float v, Direction normal) { - putVertex(ms.last(), builder, (float) pos.x, (float) pos.y, (float) pos.z, u, v, normal); - } - - protected void putVertex(PoseStack.Pose pose, VertexConsumer builder, float x, float y, float z, float u, float v, Direction normal) { - Color rgb = params.rgb; - if (transformNormals == null) - transformNormals = pose.normal(); - - int xOffset = 0; - int yOffset = 0; - int zOffset = 0; - - if (normal != null) { - xOffset = normal.getStepX(); - yOffset = normal.getStepY(); - zOffset = normal.getStepZ(); - } - - builder.vertex(pose.pose(), x, y, z) - .color(rgb.getRedAsFloat(), rgb.getGreenAsFloat(), rgb.getBlueAsFloat(), rgb.getAlphaAsFloat() * params.alpha) - .uv(u, v) - .overlayCoords(OverlayTexture.NO_OVERLAY) - .uv2(params.lightMap) - .normal(pose.normal(), xOffset, yOffset, zOffset) - .endVertex(); - - transformNormals = null; - } - - public static class OutlineParams { - protected Optional faceTexture; - protected Optional hightlightedFaceTexture; - protected Direction highlightedFace; - protected boolean fadeLineWidth; - protected boolean disableCull; - protected boolean disableNormals; - protected float alpha; - protected int lightMap; - protected Color rgb; - private float lineWidth; - - public OutlineParams() { - faceTexture = hightlightedFaceTexture = Optional.empty(); - alpha = 1; - lineWidth = 1 / 32f; - fadeLineWidth = true; - rgb = Color.WHITE; - lightMap = LightTexture.FULL_BRIGHT; - } - - // builder - - public OutlineParams colored(int color) { - rgb = new Color(color, false); - return this; - } - - public OutlineParams colored(Color c) { - rgb = c.copy(); - return this; - } - - public OutlineParams lightMap(int light) { - lightMap = light; - return this; - } - - public OutlineParams lineWidth(float width) { - this.lineWidth = width; - return this; - } - - public OutlineParams withFaceTexture(AllSpecialTextures texture) { - this.faceTexture = Optional.ofNullable(texture); - return this; - } - - public OutlineParams clearTextures() { - return this.withFaceTextures(null, null); - } - - public OutlineParams withFaceTextures(AllSpecialTextures texture, AllSpecialTextures highlightTexture) { - this.faceTexture = Optional.ofNullable(texture); - this.hightlightedFaceTexture = Optional.ofNullable(highlightTexture); - return this; - } - - public OutlineParams highlightFace(@Nullable Direction face) { - highlightedFace = face; - return this; - } - - public OutlineParams disableNormals() { - disableNormals = true; - return this; - } - - public OutlineParams disableCull() { - disableCull = true; - return this; - } - - // getter - - public float getLineWidth() { - return fadeLineWidth ? alpha * lineWidth : lineWidth; - } - - public Direction getHighlightedFace() { - return highlightedFace; - } - - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/utility/outliner/Outliner.java b/src/main/java/com/simibubi/create/foundation/utility/outliner/Outliner.java deleted file mode 100644 index c6f061cec2..0000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/outliner/Outliner.java +++ /dev/null @@ -1,190 +0,0 @@ -package com.simibubi.create.foundation.utility.outliner; - -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.Optional; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.foundation.render.SuperRenderTypeBuffer; -import com.simibubi.create.foundation.tileEntity.behaviour.ValueBox; -import com.simibubi.create.foundation.utility.outliner.LineOutline.EndChasingLineOutline; -import com.simibubi.create.foundation.utility.outliner.Outline.OutlineParams; - -import net.minecraft.core.BlockPos; -import net.minecraft.util.Mth; -import net.minecraft.world.phys.AABB; -import net.minecraft.world.phys.Vec3; - -public class Outliner { - - private final Map outlines = Collections.synchronizedMap(new HashMap<>()); - private final Map outlinesView = Collections.unmodifiableMap(outlines); - - // Facade - - public OutlineParams showValueBox(Object slot, ValueBox box) { - outlines.put(slot, new OutlineEntry(box)); - return box.getParams(); - } - - public OutlineParams showLine(Object slot, Vec3 start, Vec3 end) { - if (!outlines.containsKey(slot)) { - LineOutline outline = new LineOutline(); - outlines.put(slot, new OutlineEntry(outline)); - } - OutlineEntry entry = outlines.get(slot); - entry.ticksTillRemoval = 1; - ((LineOutline) entry.outline).set(start, end); - return entry.outline.getParams(); - } - - public OutlineParams endChasingLine(Object slot, Vec3 start, Vec3 end, float chasingProgress, boolean lockStart) { - if (!outlines.containsKey(slot)) { - EndChasingLineOutline outline = new EndChasingLineOutline(lockStart); - outlines.put(slot, new OutlineEntry(outline)); - } - OutlineEntry entry = outlines.get(slot); - entry.ticksTillRemoval = 1; - ((EndChasingLineOutline) entry.outline).setProgress(chasingProgress) - .set(start, end); - return entry.outline.getParams(); - } - - public OutlineParams showAABB(Object slot, AABB bb, int ttl) { - createAABBOutlineIfMissing(slot, bb); - ChasingAABBOutline outline = getAndRefreshAABB(slot, ttl); - outline.prevBB = outline.targetBB = outline.bb = bb; - return outline.getParams(); - } - - public OutlineParams showAABB(Object slot, AABB bb) { - createAABBOutlineIfMissing(slot, bb); - ChasingAABBOutline outline = getAndRefreshAABB(slot); - outline.prevBB = outline.targetBB = outline.bb = bb; - return outline.getParams(); - } - - public OutlineParams chaseAABB(Object slot, AABB bb) { - createAABBOutlineIfMissing(slot, bb); - ChasingAABBOutline outline = getAndRefreshAABB(slot); - outline.targetBB = bb; - return outline.getParams(); - } - - public OutlineParams showCluster(Object slot, Iterable selection) { - BlockClusterOutline outline = new BlockClusterOutline(selection); - OutlineEntry entry = new OutlineEntry(outline); - outlines.put(slot, entry); - return entry.getOutline() - .getParams(); - } - - public void keep(Object slot) { - if (outlines.containsKey(slot)) - outlines.get(slot).ticksTillRemoval = 1; - } - - public void remove(Object slot) { - outlines.remove(slot); - } - - public Optional edit(Object slot) { - keep(slot); - if (outlines.containsKey(slot)) - return Optional.of(outlines.get(slot) - .getOutline() - .getParams()); - return Optional.empty(); - } - - public Map getOutlines() { - return outlinesView; - } - - // Utility - - private void createAABBOutlineIfMissing(Object slot, AABB bb) { - if (!outlines.containsKey(slot) || !(outlines.get(slot).outline instanceof AABBOutline)) { - ChasingAABBOutline outline = new ChasingAABBOutline(bb); - outlines.put(slot, new OutlineEntry(outline)); - } - } - - private ChasingAABBOutline getAndRefreshAABB(Object slot) { - OutlineEntry entry = outlines.get(slot); - entry.ticksTillRemoval = 1; - return (ChasingAABBOutline) entry.getOutline(); - } - - private ChasingAABBOutline getAndRefreshAABB(Object slot, int ttl) { - OutlineEntry entry = outlines.get(slot); - entry.ticksTillRemoval = ttl; - return (ChasingAABBOutline) entry.getOutline(); - } - - // Maintenance - - public void tickOutlines() { - Iterator iterator = outlines.values() - .iterator(); - while (iterator.hasNext()) { - OutlineEntry entry = iterator.next(); - entry.tick(); - if (!entry.isAlive()) - iterator.remove(); - } - } - - public void renderOutlines(PoseStack ms, SuperRenderTypeBuffer buffer, float pt) { - outlines.forEach((key, entry) -> { - Outline outline = entry.getOutline(); - OutlineParams params = outline.getParams(); - params.alpha = 1; - if (entry.isFading()) { - int prevTicks = entry.ticksTillRemoval + 1; - float fadeticks = OutlineEntry.fadeTicks; - float lastAlpha = prevTicks >= 0 ? 1 : 1 + (prevTicks / fadeticks); - float currentAlpha = 1 + (entry.ticksTillRemoval / fadeticks); - float alpha = Mth.lerp(pt, lastAlpha, currentAlpha); - - params.alpha = alpha * alpha * alpha; - if (params.alpha < 1 / 8f) - return; - } - outline.render(ms, buffer, pt); - }); - } - - public static class OutlineEntry { - - static final int fadeTicks = 8; - private Outline outline; - private int ticksTillRemoval; - - public OutlineEntry(Outline outline) { - this.outline = outline; - ticksTillRemoval = 1; - } - - public void tick() { - ticksTillRemoval--; - outline.tick(); - } - - public boolean isAlive() { - return ticksTillRemoval >= -fadeTicks; - } - - public boolean isFading() { - return ticksTillRemoval < 0; - } - - public Outline getOutline() { - return outline; - } - - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/utility/placement/IPlacementHelper.java b/src/main/java/com/simibubi/create/foundation/utility/placement/IPlacementHelper.java deleted file mode 100644 index 9689da935f..0000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/placement/IPlacementHelper.java +++ /dev/null @@ -1,167 +0,0 @@ -package com.simibubi.create.foundation.utility.placement; - -import java.util.Arrays; -import java.util.Collection; -import java.util.Comparator; -import java.util.List; -import java.util.function.Function; -import java.util.function.Predicate; -import java.util.stream.Collectors; - -import com.simibubi.create.CreateClient; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.Pair; -import com.simibubi.create.foundation.utility.VecHelper; - -import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.core.Vec3i; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.BlockItem; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.BlockHitResult; -import net.minecraft.world.phys.Vec3; - -@MethodsReturnNonnullByDefault -public interface IPlacementHelper { - - /** - * used as an identifier in SuperGlueHandler to skip blocks placed by helpers - */ - BlockState ID = new BlockState(Blocks.AIR, null, null); - - /** - * @return a predicate that gets tested with the items held in the players hands
- * should return true if this placement helper is active with the given item - */ - Predicate getItemPredicate(); - - /** - * @return a predicate that gets tested with the blockstate the player is looking at
- * should return true if this placement helper is active with the given blockstate - */ - Predicate getStatePredicate(); - - /** - * - * @param player the player that activated the placement helper - * @param world the world that the placement helper got activated in - * @param state the Blockstate of the Block that the player is looking at or clicked on - * @param pos the position of the Block the player is looking at or clicked on - * @param ray the exact raytrace result - * - * @return the PlacementOffset object describing where to place the new block.
- * Use {@link PlacementOffset#fail} when no new position could be found.
- * Use {@link PlacementOffset#success(Vec3i)} with the new BlockPos to indicate a success - * and call {@link PlacementOffset#withTransform(Function)} if the blocks default state has to be modified before it is placed - */ - PlacementOffset getOffset(Player player, Level world, BlockState state, BlockPos pos, BlockHitResult ray); - - //sets the offset's ghost state with the default state of the held block item, this is used in PlacementHelpers and can be ignored in most cases - default PlacementOffset getOffset(Player player, Level world, BlockState state, BlockPos pos, BlockHitResult ray, ItemStack heldItem) { - PlacementOffset offset = getOffset(player, world, state, pos, ray); - if (heldItem.getItem() instanceof BlockItem) { - BlockItem blockItem = (BlockItem) heldItem.getItem(); - offset = offset.withGhostState(blockItem.getBlock().defaultBlockState()); - } - return offset; - } - - /** - * overwrite this method if your placement helper needs a different rendering than the default ghost state - * - * @param pos the position of the Block the player is looking at or clicked on - * @param state the Blockstate of the Block that the player is looking at or clicked on - * @param ray the exact raytrace result - * @param offset the PlacementOffset returned by {@link #getOffset(Player, Level, BlockState, BlockPos, BlockHitResult)}
- * the offset will always be successful if this method is called - */ - default void renderAt(BlockPos pos, BlockState state, BlockHitResult ray, PlacementOffset offset) { - displayGhost(offset); - } - - //RIP - static void renderArrow(Vec3 center, Vec3 target, Direction arrowPlane) { - renderArrow(center, target, arrowPlane, 1D); - } - static void renderArrow(Vec3 center, Vec3 target, Direction arrowPlane, double distanceFromCenter) { - Vec3 direction = target.subtract(center).normalize(); - Vec3 facing = Vec3.atLowerCornerOf(arrowPlane.getNormal()); - Vec3 start = center.add(direction); - Vec3 offset = direction.scale(distanceFromCenter - 1); - Vec3 offsetA = direction.cross(facing).normalize().scale(.25); - Vec3 offsetB = facing.cross(direction).normalize().scale(.25); - Vec3 endA = center.add(direction.scale(.75)).add(offsetA); - Vec3 endB = center.add(direction.scale(.75)).add(offsetB); - CreateClient.OUTLINER.showLine("placementArrowA" + center + target, start.add(offset), endA.add(offset)).lineWidth(1 / 16f); - CreateClient.OUTLINER.showLine("placementArrowB" + center + target, start.add(offset), endB.add(offset)).lineWidth(1 / 16f); - } - - default void displayGhost(PlacementOffset offset) { - if (!offset.hasGhostState()) - return; - - CreateClient.GHOST_BLOCKS.showGhostState(this, offset.getTransform().apply(offset.getGhostState())) - .at(offset.getBlockPos()) - .breathingAlpha(); - } - - static List orderedByDistanceOnlyAxis(BlockPos pos, Vec3 hit, Direction.Axis axis) { - return orderedByDistance(pos, hit, dir -> dir.getAxis() == axis); - } - - static List orderedByDistanceOnlyAxis(BlockPos pos, Vec3 hit, Direction.Axis axis, Predicate includeDirection) { - return orderedByDistance(pos, hit, ((Predicate) dir -> dir.getAxis() == axis).and(includeDirection)); - } - - static List orderedByDistanceExceptAxis(BlockPos pos, Vec3 hit, Direction.Axis axis) { - return orderedByDistance(pos, hit, dir -> dir.getAxis() != axis); - } - - static List orderedByDistanceExceptAxis(BlockPos pos, Vec3 hit, Direction.Axis axis, Predicate includeDirection) { - return orderedByDistance(pos, hit, ((Predicate) dir -> dir.getAxis() != axis).and(includeDirection)); - } - - static List orderedByDistanceExceptAxis(BlockPos pos, Vec3 hit, Direction.Axis first, Direction.Axis second) { - return orderedByDistanceExceptAxis(pos, hit, first, d -> d.getAxis() != second); - } - - static List orderedByDistanceExceptAxis(BlockPos pos, Vec3 hit, Direction.Axis first, Direction.Axis second, Predicate includeDirection) { - return orderedByDistanceExceptAxis(pos, hit, first, ((Predicate) d -> d.getAxis() != second).and(includeDirection)); - } - - static List orderedByDistance(BlockPos pos, Vec3 hit) { - return orderedByDistance(pos, hit, _$ -> true); - } - - static List orderedByDistance(BlockPos pos, Vec3 hit, Predicate includeDirection) { - Vec3 centerToHit = hit.subtract(VecHelper.getCenterOf(pos)); - return Arrays.stream(Iterate.directions) - .filter(includeDirection) - .map(dir -> Pair.of(dir, Vec3.atLowerCornerOf(dir.getNormal()).distanceTo(centerToHit))) - .sorted(Comparator.comparingDouble(Pair::getSecond)) - .map(Pair::getFirst) - .collect(Collectors.toList()); - } - - static List orderedByDistance(BlockPos pos, Vec3 hit, Collection directions) { - Vec3 centerToHit = hit.subtract(VecHelper.getCenterOf(pos)); - return directions.stream() - .map(dir -> Pair.of(dir, Vec3.atLowerCornerOf(dir.getNormal()).distanceTo(centerToHit))) - .sorted(Comparator.comparingDouble(Pair::getSecond)) - .map(Pair::getFirst) - .toList(); - } - - default boolean matchesItem(ItemStack item) { - return getItemPredicate().test(item); - } - - default boolean matchesState(BlockState state) { - return getStatePredicate().test(state); - } -} diff --git a/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementHelpers.java b/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementHelpers.java deleted file mode 100644 index e3427f52c3..0000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementHelpers.java +++ /dev/null @@ -1,323 +0,0 @@ -package com.simibubi.create.foundation.utility.placement; - -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; - -import com.mojang.blaze3d.platform.Window; -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.BufferBuilder; -import com.mojang.blaze3d.vertex.DefaultVertexFormat; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.Tesselator; -import com.mojang.blaze3d.vertex.VertexFormat; -import com.mojang.math.Matrix4f; -import com.mojang.math.Vector3f; -import com.simibubi.create.foundation.config.AllConfigs; -import com.simibubi.create.foundation.config.CClient; -import com.simibubi.create.foundation.gui.AllGuiTextures; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.VecHelper; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; -import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.client.renderer.GameRenderer; -import net.minecraft.core.BlockPos; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.BlockHitResult; -import net.minecraft.world.phys.Vec3; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.client.event.RenderGameOverlayEvent; -import net.minecraftforge.client.gui.ForgeIngameGui; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; - -@Mod.EventBusSubscriber -public class PlacementHelpers { - - private static final List helpers = new ArrayList<>(); - private static int animationTick = 0; - private static final LerpedFloat angle = LerpedFloat.angular() - .chase(0, 0.25f, Chaser.EXP); - private static BlockPos target = null; - private static BlockPos lastTarget = null; - - public static int register(IPlacementHelper helper) { - helpers.add(helper); - return helpers.size() - 1; - } - - public static IPlacementHelper get(int id) { - if (id < 0 || id >= helpers.size()) - throw new ArrayIndexOutOfBoundsException("id " + id + " for placement helper not known"); - - return helpers.get(id); - } - - @OnlyIn(Dist.CLIENT) - public static void tick() { - setTarget(null); - checkHelpers(); - - if (target == null) { - if (animationTick > 0) - animationTick = Math.max(animationTick - 2, 0); - - return; - } - - if (animationTick < 10) - animationTick++; - - } - - @OnlyIn(Dist.CLIENT) - private static void checkHelpers() { - Minecraft mc = Minecraft.getInstance(); - ClientLevel world = mc.level; - - if (world == null) - return; - - if (!(mc.hitResult instanceof BlockHitResult)) - return; - - BlockHitResult ray = (BlockHitResult) mc.hitResult; - - if (mc.player == null) - return; - - if (mc.player.isShiftKeyDown())// for now, disable all helpers when sneaking TODO add helpers that respect - // sneaking but still show position - return; - - for (InteractionHand hand : InteractionHand.values()) { - - ItemStack heldItem = mc.player.getItemInHand(hand); - List filteredForHeldItem = helpers.stream() - .filter(helper -> helper.matchesItem(heldItem)) - .collect(Collectors.toList()); - if (filteredForHeldItem.isEmpty()) - continue; - - BlockPos pos = ray.getBlockPos(); - BlockState state = world.getBlockState(pos); - - List filteredForState = filteredForHeldItem.stream() - .filter(helper -> helper.matchesState(state)) - .collect(Collectors.toList()); - if (filteredForState.isEmpty()) - continue; - - boolean atLeastOneMatch = false; - for (IPlacementHelper h : filteredForState) { - PlacementOffset offset = h.getOffset(mc.player, world, state, pos, ray, heldItem); - - if (offset.isSuccessful()) { - h.renderAt(pos, state, ray, offset); - setTarget(offset.getBlockPos()); - atLeastOneMatch = true; - break; - } - - } - - // at least one helper activated, no need to check the offhand if we are still - // in the mainhand - if (atLeastOneMatch) - return; - - } - } - - static void setTarget(BlockPos target) { - PlacementHelpers.target = target; - - if (target == null) - return; - - if (lastTarget == null) { - lastTarget = target; - return; - } - - if (!lastTarget.equals(target)) - lastTarget = target; - } - - @SubscribeEvent - @OnlyIn(Dist.CLIENT) - public static void afterRenderOverlayLayer(RenderGameOverlayEvent.PostLayer event) { - if (event.getOverlay() != ForgeIngameGui.CROSSHAIR_ELEMENT) - return; - - Minecraft mc = Minecraft.getInstance(); - Player player = mc.player; - - if (player != null && animationTick > 0) { - Window res = event.getWindow(); - - float screenY = res.getGuiScaledHeight() / 2f; - float screenX = res.getGuiScaledWidth() / 2f; - float progress = getCurrentAlpha(); - - drawDirectionIndicator(event.getMatrixStack(), event.getPartialTicks(), screenX, screenY, progress); - } - } - - public static float getCurrentAlpha() { - return Math.min(animationTick / 10f/* + event.getPartialTicks() */, 1f); - } - - @OnlyIn(Dist.CLIENT) - private static void drawDirectionIndicator(PoseStack ms, float partialTicks, float centerX, float centerY, - float progress) { - float r = .8f; - float g = .8f; - float b = .8f; - float a = progress * progress; - - Vec3 projTarget = VecHelper.projectToPlayerView(VecHelper.getCenterOf(lastTarget), partialTicks); - - Vec3 target = new Vec3(projTarget.x, projTarget.y, 0); - if (projTarget.z > 0) - target = target.reverse(); - - Vec3 norm = target.normalize(); - Vec3 ref = new Vec3(0, 1, 0); - float targetAngle = AngleHelper.deg(Math.acos(norm.dot(ref))); - - if (norm.x < 0) - targetAngle = 360 - targetAngle; - - if (animationTick < 10) - angle.setValue(targetAngle); - - angle.chase(targetAngle, .25f, Chaser.EXP); - angle.tickChaser(); - - float snapSize = 22.5f; - float snappedAngle = (snapSize * Math.round(angle.getValue(0f) / snapSize)) % 360f; - - float length = 10; - - CClient.PlacementIndicatorSetting mode = AllConfigs.CLIENT.placementIndicator.get(); - if (mode == CClient.PlacementIndicatorSetting.TRIANGLE) - fadedArrow(ms, centerX, centerY, r, g, b, a, length, snappedAngle); - else if (mode == CClient.PlacementIndicatorSetting.TEXTURE) - textured(ms, centerX, centerY, a, snappedAngle); - } - - private static void fadedArrow(PoseStack ms, float centerX, float centerY, float r, float g, float b, float a, - float length, float snappedAngle) { - RenderSystem.disableTexture(); - RenderSystem.enableBlend(); - RenderSystem.defaultBlendFunc(); - RenderSystem.setShader(GameRenderer::getPositionColorShader); - - ms.pushPose(); - ms.translate(centerX, centerY, 5); - ms.mulPose(Vector3f.ZP.rotationDegrees(angle.getValue(0))); - // RenderSystem.rotatef(snappedAngle, 0, 0, 1); - double scale = AllConfigs.CLIENT.indicatorScale.get(); - ms.scale((float) scale, (float) scale, 1); - - Tesselator tessellator = Tesselator.getInstance(); - BufferBuilder bufferbuilder = tessellator.getBuilder(); - bufferbuilder.begin(VertexFormat.Mode.TRIANGLE_FAN, DefaultVertexFormat.POSITION_COLOR); - - Matrix4f mat = ms.last() - .pose(); - - bufferbuilder.vertex(mat, 0, -(10 + length), 0) - .color(r, g, b, a) - .endVertex(); - - bufferbuilder.vertex(mat, -9, -3, 0) - .color(r, g, b, 0f) - .endVertex(); - bufferbuilder.vertex(mat, -6, -6, 0) - .color(r, g, b, 0f) - .endVertex(); - bufferbuilder.vertex(mat, -3, -8, 0) - .color(r, g, b, 0f) - .endVertex(); - bufferbuilder.vertex(mat, 0, -8.5f, 0) - .color(r, g, b, 0f) - .endVertex(); - bufferbuilder.vertex(mat, 3, -8, 0) - .color(r, g, b, 0f) - .endVertex(); - bufferbuilder.vertex(mat, 6, -6, 0) - .color(r, g, b, 0f) - .endVertex(); - bufferbuilder.vertex(mat, 9, -3, 0) - .color(r, g, b, 0f) - .endVertex(); - - tessellator.end(); - RenderSystem.disableBlend(); - RenderSystem.enableTexture(); - ms.popPose(); - } - - @OnlyIn(Dist.CLIENT) - public static void textured(PoseStack ms, float centerX, float centerY, float alpha, float snappedAngle) { - RenderSystem.enableTexture(); - AllGuiTextures.PLACEMENT_INDICATOR_SHEET.bind(); - RenderSystem.enableDepthTest(); - RenderSystem.enableBlend(); - RenderSystem.defaultBlendFunc(); - RenderSystem.setShader(GameRenderer::getPositionColorTexShader); - - ms.pushPose(); - ms.translate(centerX, centerY, 50); - float scale = AllConfigs.CLIENT.indicatorScale.get() - .floatValue() * .75f; - ms.scale(scale, scale, 1); - ms.scale(12, 12, 1); - - float index = snappedAngle / 22.5f; - float tex_size = 16f / 256f; - - float tx = 0; - float ty = index * tex_size; - float tw = 1f; - float th = tex_size; - - Tesselator tessellator = Tesselator.getInstance(); - BufferBuilder buffer = tessellator.getBuilder(); - buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR_TEX); - - Matrix4f mat = ms.last() - .pose(); - buffer.vertex(mat, -1, -1, 0) - .color(1f, 1f, 1f, alpha) - .uv(tx, ty) - .endVertex(); - buffer.vertex(mat, -1, 1, 0) - .color(1f, 1f, 1f, alpha) - .uv(tx, ty + th) - .endVertex(); - buffer.vertex(mat, 1, 1, 0) - .color(1f, 1f, 1f, alpha) - .uv(tx + tw, ty + th) - .endVertex(); - buffer.vertex(mat, 1, -1, 0) - .color(1f, 1f, 1f, alpha) - .uv(tx + tw, ty) - .endVertex(); - - tessellator.end(); - - RenderSystem.disableBlend(); - ms.popPose(); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementOffset.java b/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementOffset.java deleted file mode 100644 index 912dde2713..0000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementOffset.java +++ /dev/null @@ -1,154 +0,0 @@ -package com.simibubi.create.foundation.utility.placement; - -import java.util.function.Function; - -import net.minecraft.advancements.CriteriaTriggers; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Vec3i; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.sounds.SoundSource; -import net.minecraft.stats.Stats; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.BlockItem; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.context.UseOnContext; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.SoundType; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.state.properties.BlockStateProperties; -import net.minecraft.world.level.material.FluidState; -import net.minecraft.world.level.material.Fluids; -import net.minecraft.world.phys.BlockHitResult; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.common.util.BlockSnapshot; -import net.minecraftforge.event.world.BlockEvent; - -public class PlacementOffset { - - private final boolean success; - private Vec3i pos; - private Function stateTransform; - private BlockState ghostState; - - private PlacementOffset(boolean success) { - this.success = success; - this.pos = BlockPos.ZERO; - this.stateTransform = Function.identity(); - this.ghostState = null; - } - - public static PlacementOffset fail() { - return new PlacementOffset(false); - } - - public static PlacementOffset success() { - return new PlacementOffset(true); - } - - public static PlacementOffset success(Vec3i pos) { - return success().at(pos); - } - - public static PlacementOffset success(Vec3i pos, Function transform) { - return success().at(pos).withTransform(transform); - } - - public PlacementOffset at(Vec3i pos) { - this.pos = pos; - return this; - } - - public PlacementOffset withTransform(Function stateTransform) { - this.stateTransform = stateTransform; - return this; - } - - public PlacementOffset withGhostState(BlockState ghostState) { - this.ghostState = ghostState; - return this; - } - - public boolean isSuccessful() { - return success; - } - - public Vec3i getPos() { - return pos; - } - - public BlockPos getBlockPos() { - if (pos instanceof BlockPos) - return (BlockPos) pos; - - return new BlockPos(pos); - } - - public Function getTransform() { - return stateTransform; - } - - public boolean hasGhostState() { - return ghostState != null; - } - - public BlockState getGhostState() { - return ghostState; - } - - public boolean isReplaceable(Level world) { - if (!success) - return false; - - return world.getBlockState(new BlockPos(pos)).getMaterial().isReplaceable(); - } - - public InteractionResult placeInWorld(Level world, BlockItem blockItem, Player player, InteractionHand hand, BlockHitResult ray) { - - if (!isReplaceable(world)) - return InteractionResult.PASS; - - if (world.isClientSide) - return InteractionResult.SUCCESS; - - UseOnContext context = new UseOnContext(player, hand, ray); - BlockPos newPos = new BlockPos(pos); - ItemStack stackBefore = player.getItemInHand(hand) - .copy(); - - if (!world.mayInteract(player, newPos)) - return InteractionResult.PASS; - - BlockState state = stateTransform.apply(blockItem.getBlock().defaultBlockState()); - if (state.hasProperty(BlockStateProperties.WATERLOGGED)) { - FluidState fluidState = world.getFluidState(newPos); - state = state.setValue(BlockStateProperties.WATERLOGGED, fluidState.getType() == Fluids.WATER); - } - - BlockSnapshot snapshot = BlockSnapshot.create(world.dimension(), world, newPos); - world.setBlockAndUpdate(newPos, state); - - BlockEvent.EntityPlaceEvent event = new BlockEvent.EntityPlaceEvent(snapshot, IPlacementHelper.ID, player); - if (MinecraftForge.EVENT_BUS.post(event)) { - snapshot.restore(true, false); - return InteractionResult.FAIL; - } - - BlockState newState = world.getBlockState(newPos); - SoundType soundtype = newState.getSoundType(world, newPos, player); - world.playSound(null, newPos, soundtype.getPlaceSound(), SoundSource.BLOCKS, (soundtype.getVolume() + 1.0F) / 2.0F, soundtype.getPitch() * 0.8F); - - player.awardStat(Stats.ITEM_USED.get(blockItem)); - newState.getBlock() - .setPlacedBy(world, newPos, newState, player, stackBefore); - - if (player instanceof ServerPlayer) - CriteriaTriggers.PLACED_BLOCK.trigger((ServerPlayer) player, newPos, context.getItemInHand()); - - if (!player.isCreative()) - context.getItemInHand().shrink(1); - - return InteractionResult.SUCCESS; - } -} diff --git a/src/main/java/com/simibubi/create/foundation/utility/placement/util/PoleHelper.java b/src/main/java/com/simibubi/create/foundation/utility/placement/PoleHelper.java similarity index 93% rename from src/main/java/com/simibubi/create/foundation/utility/placement/util/PoleHelper.java rename to src/main/java/com/simibubi/create/foundation/utility/placement/PoleHelper.java index dade69a27b..9e0e2f9abb 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/placement/util/PoleHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/placement/PoleHelper.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.utility.placement.util; +package com.simibubi.create.foundation.utility.placement; import java.util.List; import java.util.function.Function; @@ -6,9 +6,9 @@ import java.util.function.Predicate; import com.simibubi.create.content.curiosities.tools.ExtendoGripItem; import com.simibubi.create.foundation.config.AllConfigs; -import com.simibubi.create.foundation.utility.placement.IPlacementHelper; -import com.simibubi.create.foundation.utility.placement.PlacementOffset; +import net.createmod.catnip.utility.placement.IPlacementHelper; +import net.createmod.catnip.utility.placement.PlacementOffset; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/DummyLevelEntityGetter.java b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/DummyLevelEntityGetter.java deleted file mode 100644 index 56354294c6..0000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/DummyLevelEntityGetter.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.simibubi.create.foundation.utility.worldWrappers; - -import java.util.Collections; -import java.util.UUID; -import java.util.function.Consumer; - -import net.minecraft.world.level.entity.EntityAccess; -import net.minecraft.world.level.entity.EntityTypeTest; -import net.minecraft.world.level.entity.LevelEntityGetter; -import net.minecraft.world.phys.AABB; - -public class DummyLevelEntityGetter implements LevelEntityGetter { - - @Override - public T get(int p_156931_) { - return null; - } - - @Override - public T get(UUID pUuid) { - return null; - } - - @Override - public Iterable getAll() { - return Collections.emptyList(); - } - - @Override - public void get(EntityTypeTest p_156935_, Consumer p_156936_) { - } - - @Override - public void get(AABB p_156937_, Consumer p_156938_) { - } - - @Override - public void get(EntityTypeTest p_156932_, AABB p_156933_, Consumer p_156934_) { - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/DummyStatusListener.java b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/DummyStatusListener.java deleted file mode 100644 index b54485931f..0000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/DummyStatusListener.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.simibubi.create.foundation.utility.worldWrappers; - -import javax.annotation.Nullable; - -import net.minecraft.server.level.progress.ChunkProgressListener; -import net.minecraft.world.level.ChunkPos; -import net.minecraft.world.level.chunk.ChunkStatus; - -public class DummyStatusListener implements ChunkProgressListener { - - @Override - public void updateSpawnPos(ChunkPos pCenter) {} - - @Override - public void onStatusChange(ChunkPos pChunkPosition, @Nullable ChunkStatus pNewStatus) {} - - @Override - public void start() {} - - @Override - public void stop() {} - -} diff --git a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/PlacementSimulationServerWorld.java b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/PlacementSimulationServerWorld.java deleted file mode 100644 index ad855a7a7d..0000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/PlacementSimulationServerWorld.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.simibubi.create.foundation.utility.worldWrappers; - -import java.util.HashMap; -import java.util.function.Predicate; - -import net.minecraft.core.BlockPos; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.state.BlockState; - -public class PlacementSimulationServerWorld extends WrappedServerWorld { - public HashMap blocksAdded; - - public PlacementSimulationServerWorld(ServerLevel wrapped) { - super(wrapped); - blocksAdded = new HashMap<>(); - } - - public void clear() { - blocksAdded.clear(); - } - - @Override - public boolean setBlock(BlockPos pos, BlockState newState, int flags) { - blocksAdded.put(pos.immutable(), newState); - return true; - } - - @Override - public boolean setBlockAndUpdate(BlockPos pos, BlockState state) { - return setBlock(pos, state, 0); - } - - @Override - public boolean isStateAtPosition(BlockPos pos, Predicate condition) { - return condition.test(getBlockState(pos)); - } - - @Override - public boolean isLoaded(BlockPos pos) { - return true; - } - - @Override - public boolean isAreaLoaded(BlockPos center, int range) { - return true; - } - - @Override - public BlockState getBlockState(BlockPos pos) { - if (blocksAdded.containsKey(pos)) - return blocksAdded.get(pos); - return Blocks.AIR.defaultBlockState(); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/RayTraceWorld.java b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/RayTraceWorld.java deleted file mode 100644 index cc6d567c0f..0000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/RayTraceWorld.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.simibubi.create.foundation.utility.worldWrappers; - -import java.util.function.BiFunction; - -import net.minecraft.core.BlockPos; -import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.material.FluidState; - -public class RayTraceWorld implements BlockGetter { - - private final LevelAccessor template; - private final BiFunction stateGetter; - - public RayTraceWorld(LevelAccessor template, BiFunction stateGetter) { - this.template = template; - this.stateGetter = stateGetter; - } - - @Override - public BlockEntity getBlockEntity(BlockPos pos) { - return template.getBlockEntity(pos); - } - - @Override - public BlockState getBlockState(BlockPos pos) { - return stateGetter.apply(pos, template.getBlockState(pos)); - } - - @Override - public FluidState getFluidState(BlockPos pos) { - return template.getFluidState(pos); - } - - @Override - public int getHeight() { - return template.getHeight(); - } - - @Override - public int getMinBuildHeight() { - return template.getMinBuildHeight(); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedClientWorld.java b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedClientWorld.java deleted file mode 100644 index fb80258322..0000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedClientWorld.java +++ /dev/null @@ -1,141 +0,0 @@ -package com.simibubi.create.foundation.utility.worldWrappers; - -import java.util.List; - -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.core.BlockPos; -import net.minecraft.core.particles.ParticleOptions; -import net.minecraft.sounds.SoundEvent; -import net.minecraft.sounds.SoundSource; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.ai.targeting.TargetingConditions; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.ColorResolver; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.LightLayer; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.material.FluidState; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; - -@OnlyIn(Dist.CLIENT) -@SuppressWarnings("deprecation") -@ParametersAreNonnullByDefault -public class WrappedClientWorld extends ClientLevel { - private static final Minecraft mc = Minecraft.getInstance(); - protected Level world; - - private WrappedClientWorld(Level world) { - super(mc.getConnection(), mc.level.getLevelData(), world.dimension(), world.dimensionTypeRegistration(), - mc.getConnection().serverChunkRadius, mc.level.getServerSimulationDistance(), world.getProfilerSupplier(), - mc.levelRenderer, world.isDebug(), world.getBiomeManager().biomeZoomSeed); - this.world = world; - } - - public static WrappedClientWorld of(Level world) { - return new WrappedClientWorld(world); - } - - @Override - public boolean hasChunkAt(BlockPos pos) { - return world.hasChunkAt(pos); - } - - @Override - public boolean isLoaded(BlockPos pos) { - return world.isLoaded(pos); - } - - @Override - public BlockState getBlockState(BlockPos pos) { - return world.getBlockState(pos); - } - - // FIXME: blockstate#getCollisionShape with WrappedClientWorld gives unreliable - // data (maybe) - - @Override - public int getBrightness(LightLayer type, BlockPos pos) { - return world.getBrightness(type, pos); - } - - @Override - public int getLightEmission(BlockPos pos) { - return world.getLightEmission(pos); - } - - @Override - public FluidState getFluidState(BlockPos pos) { - return world.getFluidState(pos); - } - - @Nullable - @Override - public T getNearestEntity(List p_217361_1_, TargetingConditions p_217361_2_, - @Nullable LivingEntity p_217361_3_, double p_217361_4_, double p_217361_6_, double p_217361_8_) { - return world.getNearestEntity(p_217361_1_, p_217361_2_, p_217361_3_, p_217361_4_, p_217361_6_, p_217361_8_); - } - - @Override - public int getBlockTint(BlockPos p_225525_1_, ColorResolver p_225525_2_) { - return world.getBlockTint(p_225525_1_, p_225525_2_); - } - - // FIXME: Emissive Lighting might not light stuff properly - - @Override - public void addParticle(ParticleOptions p_195594_1_, double p_195594_2_, double p_195594_4_, double p_195594_6_, - double p_195594_8_, double p_195594_10_, double p_195594_12_) { - world.addParticle(p_195594_1_, p_195594_2_, p_195594_4_, p_195594_6_, p_195594_8_, p_195594_10_, p_195594_12_); - } - - @Override - public void addParticle(ParticleOptions p_195590_1_, boolean p_195590_2_, double p_195590_3_, double p_195590_5_, - double p_195590_7_, double p_195590_9_, double p_195590_11_, double p_195590_13_) { - world.addParticle(p_195590_1_, p_195590_2_, p_195590_3_, p_195590_5_, p_195590_7_, p_195590_9_, p_195590_11_, - p_195590_13_); - } - - @Override - public void addAlwaysVisibleParticle(ParticleOptions p_195589_1_, double p_195589_2_, double p_195589_4_, - double p_195589_6_, double p_195589_8_, double p_195589_10_, double p_195589_12_) { - world.addAlwaysVisibleParticle(p_195589_1_, p_195589_2_, p_195589_4_, p_195589_6_, p_195589_8_, p_195589_10_, - p_195589_12_); - } - - @Override - public void addAlwaysVisibleParticle(ParticleOptions p_217404_1_, boolean p_217404_2_, double p_217404_3_, - double p_217404_5_, double p_217404_7_, double p_217404_9_, double p_217404_11_, double p_217404_13_) { - world.addAlwaysVisibleParticle(p_217404_1_, p_217404_2_, p_217404_3_, p_217404_5_, p_217404_7_, p_217404_9_, - p_217404_11_, p_217404_13_); - } - - @Override - public void playLocalSound(double p_184134_1_, double p_184134_3_, double p_184134_5_, SoundEvent p_184134_7_, - SoundSource p_184134_8_, float p_184134_9_, float p_184134_10_, boolean p_184134_11_) { - world.playLocalSound(p_184134_1_, p_184134_3_, p_184134_5_, p_184134_7_, p_184134_8_, p_184134_9_, p_184134_10_, - p_184134_11_); - } - - @Override - public void playSound(@Nullable Player p_184148_1_, double p_184148_2_, double p_184148_4_, double p_184148_6_, - SoundEvent p_184148_8_, SoundSource p_184148_9_, float p_184148_10_, float p_184148_11_) { - world.playSound(p_184148_1_, p_184148_2_, p_184148_4_, p_184148_6_, p_184148_8_, p_184148_9_, p_184148_10_, - p_184148_11_); - } - - @Nullable - @Override - public BlockEntity getBlockEntity(BlockPos p_175625_1_) { - return world.getBlockEntity(p_175625_1_); - } - - public Level getWrappedWorld() { - return world; - } -} diff --git a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedServerWorld.java b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedServerWorld.java deleted file mode 100644 index 9996c4ddbf..0000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedServerWorld.java +++ /dev/null @@ -1,121 +0,0 @@ -package com.simibubi.create.foundation.utility.worldWrappers; - -import java.util.Collections; -import java.util.List; - -import javax.annotation.ParametersAreNonnullByDefault; - -import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.Util; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Holder; -import net.minecraft.server.level.ServerChunkCache; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.sounds.SoundEvent; -import net.minecraft.sounds.SoundSource; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.crafting.RecipeManager; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.material.Fluid; -import net.minecraft.world.level.saveddata.maps.MapItemSavedData; -import net.minecraft.world.level.storage.ServerLevelData; -import net.minecraft.world.ticks.LevelTicks; - -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -public class WrappedServerWorld extends ServerLevel { - - protected Level world; - - public WrappedServerWorld(Level world) { - super(world.getServer(), Util.backgroundExecutor(), world.getServer().storageSource, - (ServerLevelData) world.getLevelData(), world.dimension(), world.dimensionTypeRegistration(), - new DummyStatusListener(), ((ServerChunkCache) world.getChunkSource()).getGenerator(), world.isDebug(), - world.getBiomeManager().biomeZoomSeed, Collections.emptyList(), false); - this.world = world; - } - - @Override - public float getSunAngle(float p_72826_1_) { - return 0; - } - - @Override - public int getMaxLocalRawBrightness(BlockPos pos) { - return 15; - } - - @Override - public void sendBlockUpdated(BlockPos pos, BlockState oldState, BlockState newState, int flags) { - world.sendBlockUpdated(pos, oldState, newState, flags); - } - - @Override - public LevelTicks getBlockTicks() { - return super.getBlockTicks(); - } - - @Override - public LevelTicks getFluidTicks() { - return super.getFluidTicks(); - } - - @Override - public void levelEvent(Player player, int type, BlockPos pos, int data) {} - - @Override - public List players() { - return Collections.emptyList(); - } - - @Override - public void playSound(Player player, double x, double y, double z, SoundEvent soundIn, SoundSource category, - float volume, float pitch) {} - - @Override - public void playSound(Player p_217384_1_, Entity p_217384_2_, SoundEvent p_217384_3_, SoundSource p_217384_4_, - float p_217384_5_, float p_217384_6_) {} - - @Override - public Entity getEntity(int id) { - return null; - } - - @Override - public MapItemSavedData getMapData(String mapName) { - return null; - } - - @Override - public boolean addFreshEntity(Entity entityIn) { - entityIn.level = world; - return world.addFreshEntity(entityIn); - } - - @Override - public void setMapData(String mapId, MapItemSavedData mapDataIn) {} - - @Override - public int getFreeMapId() { - return 0; - } - - @Override - public void destroyBlockProgress(int breakerId, BlockPos pos, int progress) {} - - @Override - public RecipeManager getRecipeManager() { - return world.getRecipeManager(); - } - - @Override - public Holder getUncachedNoiseBiome(int p_225604_1_, int p_225604_2_, int p_225604_3_) { - return world.getUncachedNoiseBiome(p_225604_1_, p_225604_2_, p_225604_3_); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedWorld.java b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedWorld.java deleted file mode 100644 index fe0e82d5d3..0000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedWorld.java +++ /dev/null @@ -1,242 +0,0 @@ -package com.simibubi.create.foundation.utility.worldWrappers; - -import java.util.Collections; -import java.util.List; -import java.util.function.Predicate; - -import javax.annotation.Nullable; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.core.Holder; -import net.minecraft.core.RegistryAccess; -import net.minecraft.core.SectionPos; -import net.minecraft.sounds.SoundEvent; -import net.minecraft.sounds.SoundSource; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.crafting.RecipeManager; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkSource; -import net.minecraft.world.level.entity.LevelEntityGetter; -import net.minecraft.world.level.gameevent.GameEvent; -import net.minecraft.world.level.lighting.LevelLightEngine; -import net.minecraft.world.level.material.Fluid; -import net.minecraft.world.level.saveddata.maps.MapItemSavedData; -import net.minecraft.world.level.storage.WritableLevelData; -import net.minecraft.world.scores.Scoreboard; -import net.minecraft.world.ticks.LevelTickAccess; - -public class WrappedWorld extends Level { - - protected Level world; - protected ChunkSource chunkSource; - - protected LevelEntityGetter entityGetter = new DummyLevelEntityGetter<>(); - - public WrappedWorld(Level world) { - super((WritableLevelData) world.getLevelData(), world.dimension(), world.dimensionTypeRegistration(), - world::getProfiler, world.isClientSide, world.isDebug(), 0); - this.world = world; - } - - public void setChunkSource(ChunkSource source) { - this.chunkSource = source; - } - - public Level getLevel() { - return world; - } - - @Override - public LevelLightEngine getLightEngine() { - return world.getLightEngine(); - } - - @Override - public BlockState getBlockState(@Nullable BlockPos pos) { - return world.getBlockState(pos); - } - - @Override - public boolean isStateAtPosition(BlockPos p_217375_1_, Predicate p_217375_2_) { - return world.isStateAtPosition(p_217375_1_, p_217375_2_); - } - - @Override - @Nullable - public BlockEntity getBlockEntity(BlockPos pos) { - return world.getBlockEntity(pos); - } - - @Override - public boolean setBlock(BlockPos pos, BlockState newState, int flags) { - return world.setBlock(pos, newState, flags); - } - - @Override - public int getMaxLocalRawBrightness(BlockPos pos) { - return 15; - } - - @Override - public void sendBlockUpdated(BlockPos pos, BlockState oldState, BlockState newState, int flags) { - world.sendBlockUpdated(pos, oldState, newState, flags); - } - - @Override - public LevelTickAccess getBlockTicks() { - return world.getBlockTicks(); - } - - @Override - public LevelTickAccess getFluidTicks() { - return world.getFluidTicks(); - } - - @Override - public ChunkSource getChunkSource() { - return chunkSource != null ? chunkSource : world.getChunkSource(); - } - - @Override - public void levelEvent(@Nullable Player player, int type, BlockPos pos, int data) {} - - @Override - public List players() { - return Collections.emptyList(); - } - - @Override - public void playSound(@Nullable Player player, double x, double y, double z, SoundEvent soundIn, - SoundSource category, float volume, float pitch) {} - - @Override - public void playSound(@Nullable Player p_217384_1_, Entity p_217384_2_, SoundEvent p_217384_3_, - SoundSource p_217384_4_, float p_217384_5_, float p_217384_6_) {} - - @Override - public Entity getEntity(int id) { - return null; - } - - @Override - public MapItemSavedData getMapData(String mapName) { - return null; - } - - @Override - public boolean addFreshEntity(Entity entityIn) { - entityIn.level = world; - return world.addFreshEntity(entityIn); - } - - @Override - public void setMapData(String pMapId, MapItemSavedData pData) {} - - @Override - public int getFreeMapId() { - return world.getFreeMapId(); - } - - @Override - public void destroyBlockProgress(int breakerId, BlockPos pos, int progress) {} - - @Override - public Scoreboard getScoreboard() { - return world.getScoreboard(); - } - - @Override - public RecipeManager getRecipeManager() { - return world.getRecipeManager(); - } - - @Override - public Holder getUncachedNoiseBiome(int p_225604_1_, int p_225604_2_, int p_225604_3_) { - return world.getUncachedNoiseBiome(p_225604_1_, p_225604_2_, p_225604_3_); - } - - @Override - public RegistryAccess registryAccess() { - return world.registryAccess(); - } - - @Override - public float getShade(Direction p_230487_1_, boolean p_230487_2_) { - return world.getShade(p_230487_1_, p_230487_2_); - } - - @Override - public void updateNeighbourForOutputSignal(BlockPos p_175666_1_, Block p_175666_2_) {} - - @Override - public void gameEvent(Entity pEntity, GameEvent pEvent, BlockPos pPos) {} - - @Override - public String gatherChunkSourceStats() { - return world.gatherChunkSourceStats(); - } - - @Override - protected LevelEntityGetter getEntities() { - return entityGetter; - } - - // Intentionally copied from LevelHeightAccessor. Workaround for issues caused - // when other mods (such as Lithium) - // override the vanilla implementations in ways which cause WrappedWorlds to - // return incorrect, default height info. - // WrappedWorld subclasses should implement their own getMinBuildHeight and - // getHeight overrides where they deviate - // from the defaults for their dimension. - - @Override - public int getMaxBuildHeight() { - return this.getMinBuildHeight() + this.getHeight(); - } - - @Override - public int getSectionsCount() { - return this.getMaxSection() - this.getMinSection(); - } - - @Override - public int getMinSection() { - return SectionPos.blockToSectionCoord(this.getMinBuildHeight()); - } - - @Override - public int getMaxSection() { - return SectionPos.blockToSectionCoord(this.getMaxBuildHeight() - 1) + 1; - } - - @Override - public boolean isOutsideBuildHeight(BlockPos pos) { - return this.isOutsideBuildHeight(pos.getY()); - } - - @Override - public boolean isOutsideBuildHeight(int y) { - return y < this.getMinBuildHeight() || y >= this.getMaxBuildHeight(); - } - - @Override - public int getSectionIndex(int y) { - return this.getSectionIndexFromSectionY(SectionPos.blockToSectionCoord(y)); - } - - @Override - public int getSectionIndexFromSectionY(int sectionY) { - return sectionY - this.getMinSection(); - } - - @Override - public int getSectionYFromSectionIndex(int sectionIndex) { - return sectionIndex + this.getMinSection(); - } -} diff --git a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/package-info.java b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/package-info.java deleted file mode 100644 index 87851a339d..0000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -@ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -package com.simibubi.create.foundation.utility.worldWrappers; - -import javax.annotation.ParametersAreNonnullByDefault; - -import net.minecraft.MethodsReturnNonnullByDefault; diff --git a/src/main/java/com/simibubi/create/foundation/worldgen/AllWorldFeatures.java b/src/main/java/com/simibubi/create/foundation/worldgen/AllWorldFeatures.java index 11a7036448..8901513bb1 100644 --- a/src/main/java/com/simibubi/create/foundation/worldgen/AllWorldFeatures.java +++ b/src/main/java/com/simibubi/create/foundation/worldgen/AllWorldFeatures.java @@ -6,8 +6,8 @@ import java.util.Map; import com.google.common.collect.ImmutableList; import com.simibubi.create.AllBlocks; import com.simibubi.create.Create; -import com.simibubi.create.foundation.utility.Couple; +import net.createmod.catnip.utility.Couple; import net.minecraft.core.Registry; import net.minecraft.data.BuiltinRegistries; import net.minecraft.resources.ResourceLocation; diff --git a/src/main/java/com/simibubi/create/foundation/worldgen/ConfigDrivenFeatureEntry.java b/src/main/java/com/simibubi/create/foundation/worldgen/ConfigDrivenFeatureEntry.java index b2b87db7c3..629ade1d3f 100644 --- a/src/main/java/com/simibubi/create/foundation/worldgen/ConfigDrivenFeatureEntry.java +++ b/src/main/java/com/simibubi/create/foundation/worldgen/ConfigDrivenFeatureEntry.java @@ -6,10 +6,10 @@ import java.util.function.Function; import com.google.common.collect.ImmutableList; import com.simibubi.create.Create; -import com.simibubi.create.foundation.config.ConfigBase; -import com.simibubi.create.foundation.utility.Couple; import com.tterrag.registrate.util.nullness.NonNullSupplier; +import net.createmod.catnip.config.ConfigBase; +import net.createmod.catnip.utility.Couple; import net.minecraft.core.Holder; import net.minecraft.data.worldgen.features.OreFeatures; import net.minecraft.world.level.block.Block; diff --git a/src/main/java/com/simibubi/create/foundation/worldgen/LayerPattern.java b/src/main/java/com/simibubi/create/foundation/worldgen/LayerPattern.java index 71ad7fd2e4..a423aacd44 100644 --- a/src/main/java/com/simibubi/create/foundation/worldgen/LayerPattern.java +++ b/src/main/java/com/simibubi/create/foundation/worldgen/LayerPattern.java @@ -7,10 +7,10 @@ import java.util.Random; import javax.annotation.Nullable; import com.google.common.collect.ImmutableList; -import com.simibubi.create.foundation.utility.Couple; import com.simibubi.create.foundation.worldgen.LayerPattern.Layer.LayerBuilder; import com.tterrag.registrate.util.nullness.NonNullSupplier; +import net.createmod.catnip.utility.Couple; import net.minecraft.data.worldgen.features.OreFeatures; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; @@ -50,13 +50,13 @@ public class LayerPattern { } class Builder { - + private boolean netherMode; public LayerPattern build() { return LayerPattern.this; } - + public Builder inNether() { netherMode = true; return this; @@ -117,7 +117,7 @@ public class LayerPattern { } return blocks(block.defaultBlockState(), block.defaultBlockState()); } - + public LayerBuilder blocks(Block block, Block deepblock) { return blocks(block.defaultBlockState(), deepblock.defaultBlockState()); } diff --git a/src/main/resources/assets/create/textures/gui/placement_indicator.png b/src/main/resources/assets/create/textures/gui/placement_indicator.png deleted file mode 100644 index ca111ee399dccff9412985c830eefb59f78bbd4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 835 zcmV-J1HAl+P)(R7l6AmdlcxFc3uvi(cmwTvHk62aLUs0qqBbw<-^k_pywAKk65Q<5#Mp zn#C;)>dWoZVv6G40w>}$$%T~o(kZ1$F7Tz%q!imM{2`^wuoMAr4$G&Cv94PZ-rC_> zguIGJYt28EVMF_bPs1DLjnjFB+n^2f<9jhyW*g}{TFpPDU*fsL^7-jVRefigHxjn9 zZcP=$&Rp}!0`%;(1c{A`P6SzW%fwD9ex$TF{KVe`$<(aqL6PmlXSx&f<)K7zJu zY()B$njnIbf{_J$qSaO`r)?HH6#1n~OpY@AOy~YgerjtQ_VeK>7x-|%0Xh0Bp7R5( z_BPI8v?}79#-yUvp9Y2{HQXH=tz$tKa6>CKVEDV}Z9ZZZYR85kT}I*uQ#rdEKW>>% zr-@lB8HU{4xTV*K74w1^bKrxtAh_aXJg2q*_7mMG)muVhR7kv{HG_QztvWBk#@cJ4 zh(29JaDiKGScTEFynou+5f~BtlTa7b&c`2EG{eljI#N$(xcKEKA-(tA1l212)3I4;gA|s^$(BRh-CP-xcdMA N002ovPDHLkV1hz)epvtj diff --git a/src/main/resources/assets/create/textures/special/blank.png b/src/main/resources/assets/create/textures/special/blank.png deleted file mode 100644 index 2e084d97d231ce0b73c9fdfbf8e6c811997b0f48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 99 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;OS+@4BLl<6e(pbstUx| Date: Wed, 31 Aug 2022 13:52:28 +0200 Subject: [PATCH 002/515] Pondering Alone, Part II -move some theme keys to a new ponder specific theme -move config gui to catnip -fix some client/server siding issues -move some icons to catnip/ponder -move some commands to catnip/ponder -refactor SConfigureConfigPacket and move it to catnip -add PonderPlugin to bundle all ponder extension points --- build.gradle | 10 + .../com/simibubi/create/CreateClient.java | 11 +- .../interaction/controls/TrainHUD.java | 4 +- .../BracketedKineticBlockModel.java | 24 +- .../simibubi/create/events/ClientEvents.java | 24 +- .../foundation/command/AllCommands.java | 46 +- .../command/CameraAngleCommand.java | 25 +- .../command/CameraDistanceCommand.java | 18 +- .../foundation/command/ConfigCommand.java | 90 ---- .../command/FabulousWarningCommand.java | 11 +- .../command/FixLightingCommand.java | 11 +- .../foundation/command/FlySpeedCommand.java | 47 -- .../command/OverlayConfigCommand.java | 25 +- .../foundation/command/PonderCommand.java | 56 --- .../command/SConfigureConfigPacket.java | 275 ---------- .../command/SimpleCreateActions.java | 111 +++++ .../command/ToggleDebugCommand.java | 11 +- .../create/foundation/config/CClient.java | 3 +- .../create/foundation/config/CKinetics.java | 3 +- .../config/ui/BaseConfigScreen.java | 252 ---------- .../config/ui/CConfigureConfigPacket.java | 96 ---- .../config/ui/ConfigAnnotations.java | 112 ----- .../foundation/config/ui/ConfigHelper.java | 232 --------- .../config/ui/ConfigModListScreen.java | 147 ------ .../foundation/config/ui/ConfigScreen.java | 168 ------- .../config/ui/ConfigScreenList.java | 278 ----------- .../foundation/config/ui/ConfigTextField.java | 27 - .../config/ui/HintableTextFieldWidget.java | 62 --- .../config/ui/SubMenuConfigScreen.java | 469 ------------------ .../config/ui/entries/BooleanEntry.java | 66 --- .../config/ui/entries/EnumEntry.java | 109 ---- .../config/ui/entries/NumberEntry.java | 246 --------- .../config/ui/entries/SubMenuEntry.java | 49 -- .../config/ui/entries/ValueEntry.java | 143 ------ .../foundation/gui/CreateMainMenuScreen.java | 4 +- .../widget}/OpenCreateMenuButton.java | 4 +- .../foundation/networking/AllPackets.java | 20 +- .../foundation/ponder/CreatePonderIndex.java | 25 +- .../foundation/ponder/CreatePonderPlugin.java | 31 ++ .../ponder/content/ItemVaultScenes.java | 4 +- .../ponder/content/fluid/FluidTankScenes.java | 4 +- .../ponder/content/fluid/SpoutScenes.java | 4 +- .../resources/META-INF/accesstransformer.cfg | 5 +- 43 files changed, 284 insertions(+), 3078 deletions(-) delete mode 100644 src/main/java/com/simibubi/create/foundation/command/ConfigCommand.java delete mode 100644 src/main/java/com/simibubi/create/foundation/command/FlySpeedCommand.java delete mode 100644 src/main/java/com/simibubi/create/foundation/command/PonderCommand.java delete mode 100644 src/main/java/com/simibubi/create/foundation/command/SConfigureConfigPacket.java create mode 100644 src/main/java/com/simibubi/create/foundation/command/SimpleCreateActions.java delete mode 100644 src/main/java/com/simibubi/create/foundation/config/ui/BaseConfigScreen.java delete mode 100644 src/main/java/com/simibubi/create/foundation/config/ui/CConfigureConfigPacket.java delete mode 100644 src/main/java/com/simibubi/create/foundation/config/ui/ConfigAnnotations.java delete mode 100644 src/main/java/com/simibubi/create/foundation/config/ui/ConfigHelper.java delete mode 100644 src/main/java/com/simibubi/create/foundation/config/ui/ConfigModListScreen.java delete mode 100644 src/main/java/com/simibubi/create/foundation/config/ui/ConfigScreen.java delete mode 100644 src/main/java/com/simibubi/create/foundation/config/ui/ConfigScreenList.java delete mode 100644 src/main/java/com/simibubi/create/foundation/config/ui/ConfigTextField.java delete mode 100644 src/main/java/com/simibubi/create/foundation/config/ui/HintableTextFieldWidget.java delete mode 100644 src/main/java/com/simibubi/create/foundation/config/ui/SubMenuConfigScreen.java delete mode 100644 src/main/java/com/simibubi/create/foundation/config/ui/entries/BooleanEntry.java delete mode 100644 src/main/java/com/simibubi/create/foundation/config/ui/entries/EnumEntry.java delete mode 100644 src/main/java/com/simibubi/create/foundation/config/ui/entries/NumberEntry.java delete mode 100644 src/main/java/com/simibubi/create/foundation/config/ui/entries/SubMenuEntry.java delete mode 100644 src/main/java/com/simibubi/create/foundation/config/ui/entries/ValueEntry.java rename src/main/java/com/simibubi/create/foundation/{config/ui => gui/widget}/OpenCreateMenuButton.java (98%) create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/CreatePonderPlugin.java diff --git a/build.gradle b/build.gradle index 1ab37b67ae..e4c8bba13a 100644 --- a/build.gradle +++ b/build.gradle @@ -99,6 +99,11 @@ minecraft { server { workingDirectory project.file('run/server') + if (inMultiModWorkspace) + ideaModule "createmod.Create.main" + else + ideaModule "Create.main" + arg '-mixin.config=create.mixins.json' property 'forge.logging.console.level', 'info' mods { @@ -124,6 +129,11 @@ minecraft { data { workingDirectory project.file('run') + if (inMultiModWorkspace) + ideaModule "createmod.Create.main" + else + ideaModule "Create.main" + property 'forge.logging.markers', 'REGISTRIES,REGISTRYDUMP' property 'forge.logging.console.level', 'debug' args '--mod', 'create', '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources') diff --git a/src/main/java/com/simibubi/create/CreateClient.java b/src/main/java/com/simibubi/create/CreateClient.java index 7c5eaad2b1..fa3bcdd026 100644 --- a/src/main/java/com/simibubi/create/CreateClient.java +++ b/src/main/java/com/simibubi/create/CreateClient.java @@ -20,10 +20,8 @@ import com.simibubi.create.content.schematics.client.SchematicAndQuillHandler; import com.simibubi.create.content.schematics.client.SchematicHandler; import com.simibubi.create.foundation.ClientResourceReloadListener; import com.simibubi.create.foundation.config.AllConfigs; -import com.simibubi.create.foundation.ponder.CreatePonderIndex; -import com.simibubi.create.foundation.ponder.CreatePonderTag; +import com.simibubi.create.foundation.ponder.CreatePonderPlugin; import com.simibubi.create.foundation.ponder.CreateSharedPonderText; -import com.simibubi.create.foundation.ponder.PonderWorldTileFix; import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.render.CreateContexts; import com.simibubi.create.foundation.render.SuperByteBufferCache; @@ -31,7 +29,6 @@ import com.simibubi.create.foundation.utility.ModelSwapper; import com.simibubi.create.foundation.utility.ShippedResourcePacks; import net.createmod.ponder.foundation.PonderIndex; -import net.createmod.ponder.foundation.PonderWorld; import net.minecraft.ChatFormatting; import net.minecraft.client.GraphicsStatus; import net.minecraft.client.Minecraft; @@ -93,11 +90,7 @@ public class CreateClient { AllBlockPartials.init(); AllStitchedTextures.init(); - CreatePonderIndex.register(); - CreatePonderIndex.registerTags(); - PonderIndex.addIndex(CreatePonderIndex::register); - PonderIndex.addIndex(CreatePonderTag::register); - PonderWorld.onRestore(PonderWorldTileFix::fixControllerTiles); + PonderIndex.addPlugin(new CreatePonderPlugin()); registerOverlays(); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/interaction/controls/TrainHUD.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/interaction/controls/TrainHUD.java index ebccd40b18..814dc8819b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/interaction/controls/TrainHUD.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/interaction/controls/TrainHUD.java @@ -12,7 +12,7 @@ import com.simibubi.create.foundation.utility.ControlsUtil; import net.createmod.catnip.utility.animation.LerpedFloat; import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; import net.createmod.catnip.utility.math.AngleHelper; -import net.createmod.catnip.utility.placement.PlacementHelpers; +import net.createmod.catnip.utility.placement.PlacementClient; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiComponent; @@ -203,7 +203,7 @@ public class TrainHUD { poseStack.translate(91, -9, 0); poseStack.scale(0.925f, 0.925f, 1); - PlacementHelpers.textured(poseStack, 0, 0, 1, snappedAngle); + PlacementClient.textured(poseStack, 0, 0, 1, snappedAngle); poseStack.popPose(); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/BracketedKineticBlockModel.java b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/BracketedKineticBlockModel.java index dc52fdd690..ec5b472d03 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/BracketedKineticBlockModel.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/BracketedKineticBlockModel.java @@ -15,6 +15,7 @@ import net.minecraft.core.Direction; import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.client.model.BakedModelWrapper; +import net.minecraftforge.client.model.data.EmptyModelData; import net.minecraftforge.client.model.data.IModelData; import net.minecraftforge.client.model.data.ModelDataMap; import net.minecraftforge.client.model.data.ModelProperty; @@ -29,8 +30,9 @@ public class BracketedKineticBlockModel extends BakedModelWrapper { @Override public IModelData getModelData(BlockAndTintGetter world, BlockPos pos, BlockState state, IModelData tileData) { - if (VirtualEmptyModelData.is(tileData)) + if (VirtualEmptyModelData.is(tileData) || tileData.equals(EmptyModelData.INSTANCE)) return tileData; + BracketedModelData data = new BracketedModelData(); BracketedTileEntityBehaviour attachmentBehaviour = TileEntityBehaviour.get(world, pos, BracketedTileEntityBehaviour.TYPE); @@ -42,16 +44,18 @@ public class BracketedKineticBlockModel extends BakedModelWrapper { @Override public List getQuads(BlockState state, Direction side, Random rand, IModelData data) { - if (!VirtualEmptyModelData.is(data)) { - if (data.hasProperty(BRACKET_PROPERTY)) { - BracketedModelData pipeData = data.getData(BRACKET_PROPERTY); - BakedModel bracket = pipeData.getBracket(); - if (bracket != null) - return bracket.getQuads(state, side, rand, data); - } - return Collections.emptyList(); + if (VirtualEmptyModelData.is(data) || data.equals(EmptyModelData.INSTANCE)) { + return super.getQuads(state, side, rand, data); } - return super.getQuads(state, side, rand, data); + + if (data.hasProperty(BRACKET_PROPERTY)) { + BracketedModelData pipeData = data.getData(BRACKET_PROPERTY); + BakedModel bracket = pipeData.getBracket(); + if (bracket != null) + return bracket.getQuads(state, side, rand, data); + } + + return Collections.emptyList(); } private static class BracketedModelData { diff --git a/src/main/java/com/simibubi/create/events/ClientEvents.java b/src/main/java/com/simibubi/create/events/ClientEvents.java index d27a994c22..c85924e432 100644 --- a/src/main/java/com/simibubi/create/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/events/ClientEvents.java @@ -5,6 +5,7 @@ import java.util.List; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.AllBlocks; import com.simibubi.create.AllFluids; import com.simibubi.create.AllItems; import com.simibubi.create.Create; @@ -25,6 +26,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.tra import com.simibubi.create.content.contraptions.components.turntable.TurntableHandler; import com.simibubi.create.content.contraptions.itemAssembly.SequencedAssemblyRecipe; import com.simibubi.create.content.contraptions.relays.belt.item.BeltConnectorHandler; +import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock; import com.simibubi.create.content.curiosities.armor.CopperBacktankArmorLayer; import com.simibubi.create.content.curiosities.girder.GirderWrenchBehavior; import com.simibubi.create.content.curiosities.toolbox.ToolboxHandlerClient; @@ -46,7 +48,6 @@ import com.simibubi.create.content.logistics.trains.track.CurvedTrackInteraction import com.simibubi.create.content.logistics.trains.track.TrackBlockOutline; import com.simibubi.create.content.logistics.trains.track.TrackPlacement; import com.simibubi.create.foundation.config.AllConfigs; -import com.simibubi.create.foundation.config.ui.BaseConfigScreen; import com.simibubi.create.foundation.fluid.FluidHelper; import com.simibubi.create.foundation.item.ItemDescription; import com.simibubi.create.foundation.item.TooltipHelper; @@ -61,16 +62,18 @@ import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollVal import com.simibubi.create.foundation.utility.CameraAngleAnimationService; import com.simibubi.create.foundation.utility.ServerSpeedProvider; +import net.createmod.catnip.config.ui.BaseConfigScreen; +import net.createmod.catnip.config.ui.ConfigScreen; import net.createmod.catnip.render.DefaultSuperRenderTypeBufferImpl; import net.createmod.catnip.render.SuperRenderTypeBuffer; import net.createmod.catnip.utility.AnimationTickHolder; -import net.createmod.catnip.utility.placement.PlacementHelpers; import net.createmod.catnip.utility.worldWrappers.WrappedClientWorld; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.entity.EntityRenderDispatcher; import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TextComponent; import net.minecraft.world.item.BlockItem; @@ -121,7 +124,6 @@ public class ClientEvents { } SoundScapes.tick(); - AnimationTickHolder.tick(); ScrollValueHandler.tick(); CreateClient.SCHEMATIC_SENDER.tick(); @@ -137,7 +139,6 @@ public class ClientEvents { CapabilityMinecartController.tick(world); CouplingPhysics.tick(world); - // ScreenOpener.tick(); ServerSpeedProvider.clientTick(); BeltConnectorHandler.tick(); // BeltSlicer.tickHoveringInformation(); @@ -155,8 +156,6 @@ public class ClientEvents { // CollisionDebugger.tick(); ArmInteractionPointHandler.tick(); EjectorTargetHandler.tick(); - PlacementHelpers.tick(); - //CreateClient.OUTLINER.tickOutlines(); ContraptionRenderDispatcher.tick(world); BlueprintOverlayRenderer.tick(); ToolboxHandlerClient.clientTick(); @@ -188,7 +187,6 @@ public class ClientEvents { LevelAccessor world = event.getWorld(); if (world.isClientSide() && world instanceof ClientLevel && !(world instanceof WrappedClientWorld)) { CreateClient.invalidateRenderers(); - AnimationTickHolder.reset(); } } @@ -199,7 +197,6 @@ public class ClientEvents { return; CreateClient.invalidateRenderers(); CreateClient.SOUL_PULSE_EFFECT_HANDLER.refresh(); - AnimationTickHolder.reset(); ControlsHandler.levelUnloaded(event.getWorld()); } @@ -219,7 +216,6 @@ public class ClientEvents { CarriageCouplingRenderer.renderAll(ms, buffer); CreateClient.SCHEMATIC_HANDLER.render(ms, buffer); - //CreateClient.OUTLINER.renderOutlines(ms, buffer, pt); buffer.draw(); RenderSystem.enableCull(); @@ -392,7 +388,15 @@ public class ClientEvents { .orElseThrow(() -> new IllegalStateException("Create Mod Container missing after loadCompleted")); createContainer.registerExtensionPoint(ConfigGuiHandler.ConfigGuiFactory.class, () -> new ConfigGuiHandler.ConfigGuiFactory( - (mc, previousScreen) -> BaseConfigScreen.forCreate(previousScreen))); + (mc, previousScreen) -> new BaseConfigScreen(previousScreen, Create.ID))); + + BaseConfigScreen.setDefaultActionFor(Create.ID, base -> base + .withTitles("Client Settings", "World Generation Settings", "Gameplay Settings") + .withSpecs(AllConfigs.CLIENT.specification, AllConfigs.COMMON.specification, AllConfigs.SERVER.specification) + ); + + ConfigScreen.shadowState = AllBlocks.LARGE_COGWHEEL.getDefaultState().setValue(CogWheelBlock.AXIS, Direction.Axis.Y); + } } diff --git a/src/main/java/com/simibubi/create/foundation/command/AllCommands.java b/src/main/java/com/simibubi/create/foundation/command/AllCommands.java index 8664b0a5e7..bd11e8a6bb 100644 --- a/src/main/java/com/simibubi/create/foundation/command/AllCommands.java +++ b/src/main/java/com/simibubi/create/foundation/command/AllCommands.java @@ -1,13 +1,11 @@ package com.simibubi.create.foundation.command; -import java.util.Collections; import java.util.function.Predicate; import com.mojang.brigadier.CommandDispatcher; -import com.mojang.brigadier.builder.LiteralArgumentBuilder; -import com.mojang.brigadier.tree.CommandNode; import com.mojang.brigadier.tree.LiteralCommandNode; +import net.createmod.catnip.command.CatnipCommands; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; import net.minecraft.world.entity.player.Player; @@ -32,8 +30,6 @@ public class AllCommands { .then(KillTrainCommand.register()) .then(PassengerCommand.register()) .then(CouplingCommand.register()) - .then(ConfigCommand.register()) - .then(PonderCommand.register()) .then(CloneCommand.register()) .then(GlueCommand.register()) @@ -41,15 +37,10 @@ public class AllCommands { .then(util) ); - createRoot.addChild(buildRedirect("u", util)); - - CommandNode c = dispatcher.findNode(Collections.singleton("c")); - if (c != null) - return; - - dispatcher.getRoot() - .addChild(buildRedirect("c", createRoot)); + createRoot.addChild(CatnipCommands.buildRedirect("u", util)); + //add all of Create's commands to /c if it already exists, otherwise create the shortcut + CatnipCommands.createOrAddToShortcut(dispatcher, "c", createRoot); } private static LiteralCommandNode buildUtilityCommands() { @@ -59,38 +50,9 @@ public class AllCommands { .then(ClearBufferCacheCommand.register()) .then(CameraDistanceCommand.register()) .then(CameraAngleCommand.register()) - .then(FlySpeedCommand.register()) //.then(KillTPSCommand.register()) .build(); } - /** - * ***** - * https://github.com/VelocityPowered/Velocity/blob/8abc9c80a69158ebae0121fda78b55c865c0abad/proxy/src/main/java/com/velocitypowered/proxy/util/BrigadierUtils.java#L38 - * ***** - *

- * Returns a literal node that redirects its execution to - * the given destination node. - * - * @param alias the command alias - * @param destination the destination node - * - * @return the built node - */ - public static LiteralCommandNode buildRedirect(final String alias, final LiteralCommandNode destination) { - // Redirects only work for nodes with children, but break the top argument-less command. - // Manually adding the root command after setting the redirect doesn't fix it. - // See https://github.com/Mojang/brigadier/issues/46). Manually clone the node instead. - LiteralArgumentBuilder builder = LiteralArgumentBuilder - .literal(alias) - .requires(destination.getRequirement()) - .forward(destination.getRedirect(), destination.getRedirectModifier(), destination.isFork()) - .executes(destination.getCommand()); - for (CommandNode child : destination.getChildren()) { - builder.then(child); - } - return builder.build(); - } - } diff --git a/src/main/java/com/simibubi/create/foundation/command/CameraAngleCommand.java b/src/main/java/com/simibubi/create/foundation/command/CameraAngleCommand.java index c712c9825b..f405139b70 100644 --- a/src/main/java/com/simibubi/create/foundation/command/CameraAngleCommand.java +++ b/src/main/java/com/simibubi/create/foundation/command/CameraAngleCommand.java @@ -7,14 +7,14 @@ import com.mojang.brigadier.arguments.FloatArgumentType; import com.mojang.brigadier.builder.ArgumentBuilder; import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; -import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.utility.CameraAngleAnimationService; +import net.createmod.catnip.net.ClientboundSimpleActionPacket; +import net.createmod.catnip.platform.CatnipServices; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; import net.minecraft.commands.arguments.EntityArgument; import net.minecraft.server.level.ServerPlayer; -import net.minecraftforge.network.PacketDistributor; public class CameraAngleCommand { @@ -50,13 +50,12 @@ public class CameraAngleCommand { AtomicInteger targets = new AtomicInteger(0); float angleTarget = FloatArgumentType.getFloat(ctx, "degrees"); - String optionName = (yaw ? SConfigureConfigPacket.Actions.camAngleYawTarget : SConfigureConfigPacket.Actions.camAnglePitchTarget).name(); + String optionName = yaw ? "camAngleYawTarget" : "camAnglePitchTarget"; getPlayersFromContext(ctx).forEach(player -> { - AllPackets.channel.send( - PacketDistributor.PLAYER.with(() -> player), - new SConfigureConfigPacket(optionName, String.valueOf(angleTarget)) - ); + CatnipServices.NETWORK.sendToPlayer( + player, + new ClientboundSimpleActionPacket(optionName, String.valueOf(angleTarget))); targets.incrementAndGet(); }); @@ -67,9 +66,9 @@ public class CameraAngleCommand { AtomicInteger targets = new AtomicInteger(0); getPlayersFromContext(ctx).forEach(player -> { - AllPackets.channel.send( - PacketDistributor.PLAYER.with(() -> player), - new SConfigureConfigPacket(SConfigureConfigPacket.Actions.camAngleFunction.name(), value) + CatnipServices.NETWORK.sendToPlayer( + player, + new ClientboundSimpleActionPacket("camAngleFunction", value) ); targets.incrementAndGet(); }); @@ -81,9 +80,9 @@ public class CameraAngleCommand { AtomicInteger targets = new AtomicInteger(0); getPlayersFromContext(ctx).forEach(player -> { - AllPackets.channel.send( - PacketDistributor.PLAYER.with(() -> player), - new SConfigureConfigPacket(SConfigureConfigPacket.Actions.camAngleFunction.name(), value + ":" + speed) + CatnipServices.NETWORK.sendToPlayer( + player, + new ClientboundSimpleActionPacket("camAngleFunction", value + ":" + speed) ); targets.incrementAndGet(); }); diff --git a/src/main/java/com/simibubi/create/foundation/command/CameraDistanceCommand.java b/src/main/java/com/simibubi/create/foundation/command/CameraDistanceCommand.java index 770a1f2ef1..24ae3ef810 100644 --- a/src/main/java/com/simibubi/create/foundation/command/CameraDistanceCommand.java +++ b/src/main/java/com/simibubi/create/foundation/command/CameraDistanceCommand.java @@ -3,12 +3,12 @@ package com.simibubi.create.foundation.command; import com.mojang.brigadier.Command; import com.mojang.brigadier.arguments.FloatArgumentType; import com.mojang.brigadier.builder.ArgumentBuilder; -import com.simibubi.create.foundation.networking.AllPackets; +import net.createmod.catnip.net.ClientboundSimpleActionPacket; +import net.createmod.catnip.platform.CatnipServices; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; import net.minecraft.server.level.ServerPlayer; -import net.minecraftforge.network.PacketDistributor; public class CameraDistanceCommand { @@ -17,10 +17,9 @@ public class CameraDistanceCommand { .then(Commands.literal("reset") .executes(ctx -> { ServerPlayer player = ctx.getSource().getPlayerOrException(); - AllPackets.channel.send( - PacketDistributor.PLAYER.with(() -> player), - new SConfigureConfigPacket(SConfigureConfigPacket.Actions.zoomMultiplier.name(), "1") - ); + CatnipServices.NETWORK.sendToPlayer( + player, + new ClientboundSimpleActionPacket("zoomMultiplier", "")); return Command.SINGLE_SUCCESS; }) @@ -28,10 +27,9 @@ public class CameraDistanceCommand { .executes(ctx -> { float multiplier = FloatArgumentType.getFloat(ctx, "multiplier"); ServerPlayer player = ctx.getSource().getPlayerOrException(); - AllPackets.channel.send( - PacketDistributor.PLAYER.with(() -> player), - new SConfigureConfigPacket(SConfigureConfigPacket.Actions.zoomMultiplier.name(), String.valueOf(multiplier)) - ); + CatnipServices.NETWORK.sendToPlayer( + player, + new ClientboundSimpleActionPacket("zoomMultiplier", String.valueOf(multiplier))); return Command.SINGLE_SUCCESS; }) diff --git a/src/main/java/com/simibubi/create/foundation/command/ConfigCommand.java b/src/main/java/com/simibubi/create/foundation/command/ConfigCommand.java deleted file mode 100644 index a7abc0456f..0000000000 --- a/src/main/java/com/simibubi/create/foundation/command/ConfigCommand.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.simibubi.create.foundation.command; - -import com.mojang.brigadier.Command; -import com.mojang.brigadier.arguments.StringArgumentType; -import com.mojang.brigadier.builder.ArgumentBuilder; -import com.simibubi.create.Create; -import com.simibubi.create.foundation.config.ui.ConfigHelper; -import com.simibubi.create.foundation.networking.AllPackets; - -import net.minecraft.commands.CommandSourceStack; -import net.minecraft.commands.Commands; -import net.minecraft.network.chat.TextComponent; -import net.minecraft.server.level.ServerPlayer; -import net.minecraftforge.fml.config.ModConfig; -import net.minecraftforge.network.PacketDistributor; - -/** - * Examples: - * /create config client - to open Create's ConfigGui with the client config already selected - * /create config "botania:common" - to open Create's ConfigGui with Botania's common config already selected - * /create config "create:client.client.rainbowDebug" set false - to disable Create's rainbow debug for the sender - */ -public class ConfigCommand { - - public static ArgumentBuilder register() { - return Commands.literal("config") - .executes(ctx -> { - ServerPlayer player = ctx.getSource().getPlayerOrException(); - AllPackets.channel.send( - PacketDistributor.PLAYER.with(() -> player), - new SConfigureConfigPacket(SConfigureConfigPacket.Actions.configScreen.name(), "") - ); - - return Command.SINGLE_SUCCESS; - }) - .then(Commands.argument("path", StringArgumentType.string()) - .executes(ctx -> { - ServerPlayer player = ctx.getSource().getPlayerOrException(); - AllPackets.channel.send( - PacketDistributor.PLAYER.with(() -> player), - new SConfigureConfigPacket(SConfigureConfigPacket.Actions.configScreen.name(), StringArgumentType.getString(ctx, "path")) - ); - - return Command.SINGLE_SUCCESS; - }) - .then(Commands.literal("set") - .requires(cs -> cs.hasPermission(2)) - .then(Commands.argument("value", StringArgumentType.string()) - .executes(ctx -> { - String path = StringArgumentType.getString(ctx, "path"); - String value = StringArgumentType.getString(ctx, "value"); - - - ConfigHelper.ConfigPath configPath; - try { - configPath = ConfigHelper.ConfigPath.parse(path); - } catch (IllegalArgumentException e) { - ctx.getSource().sendFailure(new TextComponent(e.getMessage())); - return 0; - } - - if (configPath.getType() == ModConfig.Type.CLIENT) { - ServerPlayer player = ctx.getSource().getPlayerOrException(); - AllPackets.channel.send( - PacketDistributor.PLAYER.with(() -> player), - new SConfigureConfigPacket("SET" + path, value) - ); - - return Command.SINGLE_SUCCESS; - } - - try { - ConfigHelper.setConfigValue(configPath, value); - ctx.getSource().sendSuccess(new TextComponent("Great Success!"), false); - return Command.SINGLE_SUCCESS; - } catch (ConfigHelper.InvalidValueException e) { - ctx.getSource().sendFailure(new TextComponent("Config could not be set the the specified value!")); - return 0; - } catch (Exception e) { - ctx.getSource().sendFailure(new TextComponent("Something went wrong while trying to set config value. Check the server logs for more information")); - Create.LOGGER.warn("Exception during server-side config value set:", e); - return 0; - } - }) - ) - ) - ); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/command/FabulousWarningCommand.java b/src/main/java/com/simibubi/create/foundation/command/FabulousWarningCommand.java index e2029155f4..180036856b 100644 --- a/src/main/java/com/simibubi/create/foundation/command/FabulousWarningCommand.java +++ b/src/main/java/com/simibubi/create/foundation/command/FabulousWarningCommand.java @@ -2,12 +2,12 @@ package com.simibubi.create.foundation.command; import com.mojang.brigadier.Command; import com.mojang.brigadier.builder.ArgumentBuilder; -import com.simibubi.create.foundation.networking.AllPackets; +import net.createmod.catnip.net.ClientboundSimpleActionPacket; +import net.createmod.catnip.platform.CatnipServices; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; import net.minecraft.server.level.ServerPlayer; -import net.minecraftforge.network.PacketDistributor; public class FabulousWarningCommand { @@ -18,10 +18,9 @@ public class FabulousWarningCommand { ServerPlayer player = ctx.getSource() .getPlayerOrException(); - AllPackets.channel.send( - PacketDistributor.PLAYER.with(() -> player), - new SConfigureConfigPacket(SConfigureConfigPacket.Actions.fabulousWarning.name(), "") - ); + CatnipServices.NETWORK.sendToPlayer( + player, + new ClientboundSimpleActionPacket("fabulousWarning", "")); return Command.SINGLE_SUCCESS; }); diff --git a/src/main/java/com/simibubi/create/foundation/command/FixLightingCommand.java b/src/main/java/com/simibubi/create/foundation/command/FixLightingCommand.java index ceca349252..325f7c152a 100644 --- a/src/main/java/com/simibubi/create/foundation/command/FixLightingCommand.java +++ b/src/main/java/com/simibubi/create/foundation/command/FixLightingCommand.java @@ -1,13 +1,12 @@ package com.simibubi.create.foundation.command; import com.mojang.brigadier.builder.ArgumentBuilder; -import com.simibubi.create.foundation.networking.AllPackets; +import net.createmod.catnip.net.ClientboundSimpleActionPacket; +import net.createmod.catnip.platform.CatnipServices; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; import net.minecraft.network.chat.TextComponent; -import net.minecraft.server.level.ServerPlayer; -import net.minecraftforge.network.PacketDistributor; public class FixLightingCommand { @@ -15,9 +14,9 @@ public class FixLightingCommand { return Commands.literal("fixLighting") .requires(cs -> cs.hasPermission(0)) .executes(ctx -> { - AllPackets.channel.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) ctx.getSource() - .getEntity()), - new SConfigureConfigPacket(SConfigureConfigPacket.Actions.fixLighting.name(), String.valueOf(true))); + CatnipServices.NETWORK.sendToPlayer( + ctx.getSource().getPlayerOrException(), + new ClientboundSimpleActionPacket("fixLighting", String.valueOf(true))); ctx.getSource() .sendSuccess( diff --git a/src/main/java/com/simibubi/create/foundation/command/FlySpeedCommand.java b/src/main/java/com/simibubi/create/foundation/command/FlySpeedCommand.java deleted file mode 100644 index 0f6bf0e27a..0000000000 --- a/src/main/java/com/simibubi/create/foundation/command/FlySpeedCommand.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.simibubi.create.foundation.command; - -import com.mojang.brigadier.Command; -import com.mojang.brigadier.arguments.FloatArgumentType; -import com.mojang.brigadier.builder.ArgumentBuilder; -import com.mojang.brigadier.context.CommandContext; - -import net.minecraft.commands.CommandSourceStack; -import net.minecraft.commands.Commands; -import net.minecraft.commands.arguments.EntityArgument; -import net.minecraft.network.chat.TextComponent; -import net.minecraft.network.protocol.game.ClientboundPlayerAbilitiesPacket; -import net.minecraft.server.level.ServerPlayer; - -public class FlySpeedCommand { - - public static ArgumentBuilder register() { - return Commands.literal("flySpeed") - .requires(cs -> cs.hasPermission(2)) - .then(Commands.argument("speed", FloatArgumentType.floatArg(0)) - .then(Commands.argument("target", EntityArgument.player()) - .executes(ctx -> sendFlySpeedUpdate(ctx, EntityArgument.getPlayer(ctx, "target"), - FloatArgumentType.getFloat(ctx, "speed")))) - .executes(ctx -> sendFlySpeedUpdate(ctx, ctx.getSource() - .getPlayerOrException(), FloatArgumentType.getFloat(ctx, "speed")))) - .then(Commands.literal("reset") - .then(Commands.argument("target", EntityArgument.player()) - .executes(ctx -> sendFlySpeedUpdate(ctx, EntityArgument.getPlayer(ctx, "target"), 0.05f))) - .executes(ctx -> sendFlySpeedUpdate(ctx, ctx.getSource() - .getPlayerOrException(), 0.05f)) - - ); - } - - private static int sendFlySpeedUpdate(CommandContext ctx, ServerPlayer player, float speed) { - ClientboundPlayerAbilitiesPacket packet = new ClientboundPlayerAbilitiesPacket(player.getAbilities()); - packet.flyingSpeed = speed; - player.connection.send(packet); - - ctx.getSource() - .sendSuccess(new TextComponent("Temporarily set " + player.getName() - .getString() + "'s Flying Speed to: " + speed), true); - - return Command.SINGLE_SUCCESS; - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/command/OverlayConfigCommand.java b/src/main/java/com/simibubi/create/foundation/command/OverlayConfigCommand.java index 384fc6c417..74582df64e 100644 --- a/src/main/java/com/simibubi/create/foundation/command/OverlayConfigCommand.java +++ b/src/main/java/com/simibubi/create/foundation/command/OverlayConfigCommand.java @@ -1,15 +1,16 @@ package com.simibubi.create.foundation.command; +import com.mojang.brigadier.Command; import com.mojang.brigadier.builder.ArgumentBuilder; -import com.simibubi.create.foundation.networking.AllPackets; +import net.createmod.catnip.net.ClientboundSimpleActionPacket; +import net.createmod.catnip.platform.CatnipServices; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; import net.minecraft.network.chat.TextComponent; -import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.player.Player; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; -import net.minecraftforge.network.PacketDistributor; public class OverlayConfigCommand { @@ -18,12 +19,12 @@ public class OverlayConfigCommand { .requires(cs -> cs.hasPermission(0)) .then(Commands.literal("reset") .executes(ctx -> { - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> SConfigureConfigPacket.Actions.overlayReset.performAction("")); + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> SimpleCreateActions.overlayReset("")); DistExecutor.unsafeRunWhenOn(Dist.DEDICATED_SERVER, () -> () -> - AllPackets.channel.send( - PacketDistributor.PLAYER.with(() -> (ServerPlayer) ctx.getSource().getEntity()), - new SConfigureConfigPacket(SConfigureConfigPacket.Actions.overlayReset.name(), ""))); + CatnipServices.NETWORK.sendToPlayer( + (Player) ctx.getSource().getEntity(), + new ClientboundSimpleActionPacket("overlayReset", ""))); ctx.getSource() .sendSuccess(new TextComponent("reset overlay offset"), true); @@ -32,17 +33,17 @@ public class OverlayConfigCommand { }) ) .executes(ctx -> { - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> SConfigureConfigPacket.Actions.overlayScreen.performAction("")); + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> SimpleCreateActions.overlayScreen("")); DistExecutor.unsafeRunWhenOn(Dist.DEDICATED_SERVER, () -> () -> - AllPackets.channel.send( - PacketDistributor.PLAYER.with(() -> (ServerPlayer) ctx.getSource().getEntity()), - new SConfigureConfigPacket(SConfigureConfigPacket.Actions.overlayScreen.name(), ""))); + CatnipServices.NETWORK.sendToPlayer( + (Player) ctx.getSource().getEntity(), + new ClientboundSimpleActionPacket("overlayScreen", ""))); ctx.getSource() .sendSuccess(new TextComponent("window opened"), true); - return 1; + return Command.SINGLE_SUCCESS; }); } diff --git a/src/main/java/com/simibubi/create/foundation/command/PonderCommand.java b/src/main/java/com/simibubi/create/foundation/command/PonderCommand.java deleted file mode 100644 index 1da2c9a27b..0000000000 --- a/src/main/java/com/simibubi/create/foundation/command/PonderCommand.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.simibubi.create.foundation.command; - -import java.util.Collection; - -import com.google.common.collect.ImmutableList; -import com.mojang.brigadier.Command; -import com.mojang.brigadier.builder.ArgumentBuilder; -import com.mojang.brigadier.suggestion.SuggestionProvider; -import com.simibubi.create.foundation.networking.AllPackets; - -import net.createmod.ponder.foundation.PonderRegistry; -import net.minecraft.commands.CommandSourceStack; -import net.minecraft.commands.Commands; -import net.minecraft.commands.SharedSuggestionProvider; -import net.minecraft.commands.arguments.EntityArgument; -import net.minecraft.commands.arguments.ResourceLocationArgument; -import net.minecraft.commands.synchronization.SuggestionProviders; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.level.ServerPlayer; -import net.minecraftforge.common.util.FakePlayer; -import net.minecraftforge.network.PacketDistributor; - -public class PonderCommand { - public static final SuggestionProvider ITEM_PONDERS = SuggestionProviders.register(new ResourceLocation("all_ponders"), (iSuggestionProviderCommandContext, builder) -> SharedSuggestionProvider.suggestResource(PonderRegistry.ALL.keySet().stream(), builder)); - - static ArgumentBuilder register() { - return Commands.literal("ponder") - .requires(cs -> cs.hasPermission(0)) - .executes(ctx -> openScene("index", ctx.getSource().getPlayerOrException())) - .then(Commands.argument("scene", ResourceLocationArgument.id()) - .suggests(ITEM_PONDERS) - .executes(ctx -> openScene(ResourceLocationArgument.getId(ctx, "scene").toString(), ctx.getSource().getPlayerOrException())) - .then(Commands.argument("targets", EntityArgument.players()) - .requires(cs -> cs.hasPermission(2)) - .executes(ctx -> openScene(ResourceLocationArgument.getId(ctx, "scene").toString(), EntityArgument.getPlayers(ctx, "targets"))) - ) - ); - - } - - private static int openScene(String sceneId, ServerPlayer player) { - return openScene(sceneId, ImmutableList.of(player)); - } - - private static int openScene(String sceneId, Collection players) { - for (ServerPlayer player : players) { - if (player instanceof FakePlayer) - continue; - - AllPackets.channel.send( - PacketDistributor.PLAYER.with(() -> player), - new SConfigureConfigPacket(SConfigureConfigPacket.Actions.openPonder.name(), sceneId)); - } - return Command.SINGLE_SUCCESS; - } -} diff --git a/src/main/java/com/simibubi/create/foundation/command/SConfigureConfigPacket.java b/src/main/java/com/simibubi/create/foundation/command/SConfigureConfigPacket.java deleted file mode 100644 index 113173e775..0000000000 --- a/src/main/java/com/simibubi/create/foundation/command/SConfigureConfigPacket.java +++ /dev/null @@ -1,275 +0,0 @@ -package com.simibubi.create.foundation.command; - -import java.util.function.Consumer; -import java.util.function.Supplier; - -import org.apache.logging.log4j.LogManager; - -import com.simibubi.create.Create; -import com.simibubi.create.content.contraptions.goggles.GoggleConfigScreen; -import com.simibubi.create.content.logistics.trains.CameraDistanceModifier; -import com.simibubi.create.foundation.config.AllConfigs; -import com.simibubi.create.foundation.config.ui.BaseConfigScreen; -import com.simibubi.create.foundation.config.ui.ConfigHelper; -import com.simibubi.create.foundation.config.ui.SubMenuConfigScreen; -import com.simibubi.create.foundation.networking.SimplePacketBase; -import com.simibubi.create.foundation.utility.CameraAngleAnimationService; - -import net.createmod.catnip.gui.ScreenOpener; -import net.createmod.ponder.foundation.PonderRegistry; -import net.createmod.ponder.foundation.ui.PonderIndexScreen; -import net.createmod.ponder.foundation.ui.PonderUI; -import net.minecraft.ChatFormatting; -import net.minecraft.client.Minecraft; -import net.minecraft.client.player.LocalPlayer; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.chat.ChatType; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.MutableComponent; -import net.minecraft.network.chat.TextComponent; -import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.common.ForgeConfig; -import net.minecraftforge.fml.DistExecutor; -import net.minecraftforge.fml.config.ModConfig; -import net.minecraftforge.network.NetworkEvent; - -public class SConfigureConfigPacket extends SimplePacketBase { - - private final String option; - private final String value; - - public SConfigureConfigPacket(String option, String value) { - this.option = option; - this.value = value; - } - - public SConfigureConfigPacket(FriendlyByteBuf buffer) { - this.option = buffer.readUtf(32767); - this.value = buffer.readUtf(32767); - } - - @Override - public void write(FriendlyByteBuf buffer) { - buffer.writeUtf(option); - buffer.writeUtf(value); - } - - @Override - public void handle(Supplier ctx) { - ctx.get() - .enqueueWork(() -> DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { - if (option.startsWith("SET")) { - trySetConfig(option.substring(3), value); - return; - } - - try { - Actions.valueOf(option) - .performAction(value); - } catch (IllegalArgumentException e) { - LogManager.getLogger() - .warn("Received ConfigureConfigPacket with invalid Option: " + option); - } - })); - - ctx.get() - .setPacketHandled(true); - } - - private static void trySetConfig(String option, String value) { - LocalPlayer player = Minecraft.getInstance().player; - if (player == null) - return; - - ConfigHelper.ConfigPath configPath; - try { - configPath = ConfigHelper.ConfigPath.parse(option); - } catch (IllegalArgumentException e) { - player.displayClientMessage(new TextComponent(e.getMessage()), false); - return; - } - - if (configPath.getType() != ModConfig.Type.CLIENT) { - Create.LOGGER.warn("Received type-mismatched config packet on client"); - return; - } - - try { - ConfigHelper.setConfigValue(configPath, value); - player.displayClientMessage(new TextComponent("Great Success!"), false); - } catch (ConfigHelper.InvalidValueException e) { - player.displayClientMessage(new TextComponent("Config could not be set the the specified value!"), false); - } catch (Exception e) { - player.displayClientMessage(new TextComponent("Something went wrong while trying to set config value. Check the client logs for more information"), false); - Create.LOGGER.warn("Exception during client-side config value set:", e); - } - - } - - public enum Actions { - configScreen(() -> Actions::configScreen), - rainbowDebug(() -> Actions::rainbowDebug), - overlayScreen(() -> Actions::overlayScreen), - fixLighting(() -> Actions::experimentalLighting), - overlayReset(() -> Actions::overlayReset), - openPonder(() -> Actions::openPonder), - fabulousWarning(() -> Actions::fabulousWarning), - zoomMultiplier(() -> Actions::zoomMultiplier), - camAngleYawTarget(() -> value -> camAngleTarget(value, true)), - camAnglePitchTarget(() -> value -> camAngleTarget(value, false)), - camAngleFunction(() -> Actions::camAngleFunction) - - ; - - private final Supplier> consumer; - - Actions(Supplier> action) { - this.consumer = action; - } - - void performAction(String value) { - consumer.get() - .accept(value); - } - - @OnlyIn(Dist.CLIENT) - private static void configScreen(String value) { - if (value.equals("")) { - ScreenOpener.open(BaseConfigScreen.forCreate(null)); - return; - } - - LocalPlayer player = Minecraft.getInstance().player; - ConfigHelper.ConfigPath configPath; - try { - configPath = ConfigHelper.ConfigPath.parse(value); - } catch (IllegalArgumentException e) { - player.displayClientMessage(new TextComponent(e.getMessage()), false); - return; - } - - try { - ScreenOpener.open(SubMenuConfigScreen.find(configPath)); - } catch (Exception e) { - player.displayClientMessage(new TextComponent("Unable to find the specified config"), false); - } - } - - @OnlyIn(Dist.CLIENT) - private static void rainbowDebug(String value) { - LocalPlayer player = Minecraft.getInstance().player; - if (player == null || "".equals(value)) - return; - - if (value.equals("info")) { - Component text = new TextComponent("Rainbow Debug Utility is currently: ") - .append(boolToText(AllConfigs.CLIENT.rainbowDebug.get())); - player.displayClientMessage(text, false); - return; - } - - AllConfigs.CLIENT.rainbowDebug.set(Boolean.parseBoolean(value)); - Component text = boolToText(AllConfigs.CLIENT.rainbowDebug.get()) - .append(new TextComponent(" Rainbow Debug Utility").withStyle(ChatFormatting.WHITE)); - player.displayClientMessage(text, false); - } - - @OnlyIn(Dist.CLIENT) - private static void overlayReset(String value) { - AllConfigs.CLIENT.overlayOffsetX.set(0); - AllConfigs.CLIENT.overlayOffsetY.set(0); - } - - @OnlyIn(Dist.CLIENT) - private static void overlayScreen(String value) { - ScreenOpener.open(new GoggleConfigScreen()); - } - - @OnlyIn(Dist.CLIENT) - private static void experimentalLighting(String value) { - ForgeConfig.CLIENT.experimentalForgeLightPipelineEnabled.set(true); - Minecraft.getInstance().levelRenderer.allChanged(); - } - - @OnlyIn(Dist.CLIENT) - private static void openPonder(String value) { - if (value.equals("index")) { - ScreenOpener.transitionTo(new PonderIndexScreen()); - return; - } - - ResourceLocation id = new ResourceLocation(value); - if (!PonderRegistry.ALL.containsKey(id)) { - Create.LOGGER.error("Could not find ponder scenes for item: " + id); - return; - } - - ScreenOpener.transitionTo(PonderUI.of(id)); - - } - - @OnlyIn(Dist.CLIENT) - private static void fabulousWarning(String value) { - AllConfigs.CLIENT.ignoreFabulousWarning.set(true); - Minecraft.getInstance().gui.handleChat(ChatType.CHAT, - new TextComponent("Disabled Fabulous graphics warning"), - Minecraft.getInstance().player.getUUID()); - } - - @OnlyIn(Dist.CLIENT) - private static void zoomMultiplier(String value) { - try { - float v = Float.parseFloat(value); - if (v <= 0) - return; - - CameraDistanceModifier.zoomOut(v); - } catch (NumberFormatException ignored) { - Create.LOGGER.debug("Received non-float value {} in zoom packet, ignoring", value); - } - } - - @OnlyIn(Dist.CLIENT) - private static void camAngleTarget(String value, boolean yaw) { - try { - float v = Float.parseFloat(value); - - if (yaw) { - CameraAngleAnimationService.setYawTarget(v); - } else { - CameraAngleAnimationService.setPitchTarget(v); - } - - } catch (NumberFormatException ignored) { - Create.LOGGER.debug("Received non-float value {} in camAngle packet, ignoring", value); - } - } - - @OnlyIn(Dist.CLIENT) - private static void camAngleFunction(String value) { - CameraAngleAnimationService.Mode mode = CameraAngleAnimationService.Mode.LINEAR; - String modeString = value; - float speed = -1; - String[] split = value.split(":"); - if (split.length > 1) { - modeString = split[0]; - try { - speed = Float.parseFloat(split[1]); - } catch (NumberFormatException ignored) {} - } - try { - mode = CameraAngleAnimationService.Mode.valueOf(modeString); - } catch (IllegalArgumentException ignored) {} - - CameraAngleAnimationService.setAnimationMode(mode); - CameraAngleAnimationService.setAnimationSpeed(speed); - } - - private static MutableComponent boolToText(boolean b) { - return b ? new TextComponent("enabled").withStyle(ChatFormatting.DARK_GREEN) - : new TextComponent("disabled").withStyle(ChatFormatting.RED); - } - } -} diff --git a/src/main/java/com/simibubi/create/foundation/command/SimpleCreateActions.java b/src/main/java/com/simibubi/create/foundation/command/SimpleCreateActions.java new file mode 100644 index 0000000000..4350bc3338 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/command/SimpleCreateActions.java @@ -0,0 +1,111 @@ +package com.simibubi.create.foundation.command; + +import com.simibubi.create.Create; +import com.simibubi.create.content.contraptions.goggles.GoggleConfigScreen; +import com.simibubi.create.content.logistics.trains.CameraDistanceModifier; +import com.simibubi.create.foundation.config.AllConfigs; +import com.simibubi.create.foundation.utility.CameraAngleAnimationService; + +import net.createmod.catnip.gui.ScreenOpener; +import net.minecraft.ChatFormatting; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.network.chat.ChatType; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.chat.TextComponent; +import net.minecraftforge.common.ForgeConfig; + +public class SimpleCreateActions { + + public static void rainbowDebug(String value) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null || "".equals(value)) + return; + + if (value.equals("info")) { + Component text = new TextComponent("Rainbow Debug Utility is currently: ") + .append(boolToText(AllConfigs.CLIENT.rainbowDebug.get())); + player.displayClientMessage(text, false); + return; + } + + AllConfigs.CLIENT.rainbowDebug.set(Boolean.parseBoolean(value)); + Component text = boolToText(AllConfigs.CLIENT.rainbowDebug.get()) + .append(new TextComponent(" Rainbow Debug Utility").withStyle(ChatFormatting.WHITE)); + player.displayClientMessage(text, false); + } + + public static void overlayReset(String value) { + AllConfigs.CLIENT.overlayOffsetX.set(0); + AllConfigs.CLIENT.overlayOffsetY.set(0); + } + + public static void overlayScreen(String value) { + ScreenOpener.open(new GoggleConfigScreen()); + } + + public static void experimentalLighting(String value) { + ForgeConfig.CLIENT.experimentalForgeLightPipelineEnabled.set(true); + Minecraft.getInstance().levelRenderer.allChanged(); + } + + public static void fabulousWarning(String value) { + AllConfigs.CLIENT.ignoreFabulousWarning.set(true); + Minecraft.getInstance().gui.handleChat(ChatType.CHAT, + new TextComponent("Disabled Fabulous graphics warning"), + Minecraft.getInstance().player.getUUID()); + } + + public static void zoomMultiplier(String value) { + try { + float v = Float.parseFloat(value); + if (v <= 0) + return; + + CameraDistanceModifier.zoomOut(v); + } catch (NumberFormatException ignored) { + Create.LOGGER.debug("Received non-float value {} in zoom packet, ignoring", value); + } + } + + public static void camAngleTarget(String value, boolean yaw) { + try { + float v = Float.parseFloat(value); + + if (yaw) { + CameraAngleAnimationService.setYawTarget(v); + } else { + CameraAngleAnimationService.setPitchTarget(v); + } + + } catch (NumberFormatException ignored) { + Create.LOGGER.debug("Received non-float value {} in camAngle packet, ignoring", value); + } + } + + public static void camAngleFunction(String value) { + CameraAngleAnimationService.Mode mode = CameraAngleAnimationService.Mode.LINEAR; + String modeString = value; + float speed = -1; + String[] split = value.split(":"); + if (split.length > 1) { + modeString = split[0]; + try { + speed = Float.parseFloat(split[1]); + } catch (NumberFormatException ignored) {} + } + try { + mode = CameraAngleAnimationService.Mode.valueOf(modeString); + } catch (IllegalArgumentException ignored) {} + + CameraAngleAnimationService.setAnimationMode(mode); + CameraAngleAnimationService.setAnimationSpeed(speed); + } + + private static MutableComponent boolToText(boolean b) { + return b ? new TextComponent("enabled").withStyle(ChatFormatting.DARK_GREEN) + : new TextComponent("disabled").withStyle(ChatFormatting.RED); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/command/ToggleDebugCommand.java b/src/main/java/com/simibubi/create/foundation/command/ToggleDebugCommand.java index fbd7b3ffab..6873824fa9 100644 --- a/src/main/java/com/simibubi/create/foundation/command/ToggleDebugCommand.java +++ b/src/main/java/com/simibubi/create/foundation/command/ToggleDebugCommand.java @@ -1,9 +1,8 @@ package com.simibubi.create.foundation.command; -import com.simibubi.create.foundation.networking.AllPackets; - +import net.createmod.catnip.net.ClientboundSimpleActionPacket; +import net.createmod.catnip.platform.CatnipServices; import net.minecraft.server.level.ServerPlayer; -import net.minecraftforge.network.PacketDistributor; public class ToggleDebugCommand extends ConfigureConfigCommand { @@ -13,9 +12,9 @@ public class ToggleDebugCommand extends ConfigureConfigCommand { @Override protected void sendPacket(ServerPlayer player, String option) { - AllPackets.channel.send( - PacketDistributor.PLAYER.with(() -> player), - new SConfigureConfigPacket(SConfigureConfigPacket.Actions.rainbowDebug.name(), option) + CatnipServices.NETWORK.sendToPlayer( + player, + new ClientboundSimpleActionPacket("rainbowDebug", option) ); } } diff --git a/src/main/java/com/simibubi/create/foundation/config/CClient.java b/src/main/java/com/simibubi/create/foundation/config/CClient.java index ab899ae448..83ecfb41f7 100644 --- a/src/main/java/com/simibubi/create/foundation/config/CClient.java +++ b/src/main/java/com/simibubi/create/foundation/config/CClient.java @@ -2,9 +2,8 @@ package com.simibubi.create.foundation.config; import javax.annotation.Nonnull; -import com.simibubi.create.foundation.config.ui.ConfigAnnotations; - import net.createmod.catnip.config.ConfigBase; +import net.createmod.catnip.config.ui.ConfigAnnotations; public class CClient extends ConfigBase { diff --git a/src/main/java/com/simibubi/create/foundation/config/CKinetics.java b/src/main/java/com/simibubi/create/foundation/config/CKinetics.java index 66c66ae1c4..0827cff3d0 100644 --- a/src/main/java/com/simibubi/create/foundation/config/CKinetics.java +++ b/src/main/java/com/simibubi/create/foundation/config/CKinetics.java @@ -1,8 +1,7 @@ package com.simibubi.create.foundation.config; -import com.simibubi.create.foundation.config.ui.ConfigAnnotations; - import net.createmod.catnip.config.ConfigBase; +import net.createmod.catnip.config.ui.ConfigAnnotations; public class CKinetics extends ConfigBase { diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/BaseConfigScreen.java b/src/main/java/com/simibubi/create/foundation/config/ui/BaseConfigScreen.java deleted file mode 100644 index e3f3d488be..0000000000 --- a/src/main/java/com/simibubi/create/foundation/config/ui/BaseConfigScreen.java +++ /dev/null @@ -1,252 +0,0 @@ -package com.simibubi.create.foundation.config.ui; - -import java.util.HashMap; -import java.util.Locale; -import java.util.Map; -import java.util.function.UnaryOperator; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -import org.lwjgl.glfw.GLFW; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.Create; -import com.simibubi.create.foundation.config.AllConfigs; -import com.simibubi.create.foundation.gui.AllIcons; -import net.createmod.catnip.gui.ScreenOpener; - -import net.createmod.catnip.gui.element.FadableScreenElement; -import net.createmod.catnip.utility.FontHelper; -import net.createmod.catnip.utility.theme.Theme; -import net.createmod.catnip.gui.UIRenderHelper; -import net.createmod.catnip.gui.element.TextStencilElement; -import net.createmod.catnip.gui.widget.BoxWidget; - -import net.minecraft.ChatFormatting; -import net.minecraft.client.gui.screens.Screen; -import net.minecraft.network.chat.TextComponent; -import net.minecraftforge.common.ForgeConfigSpec; -import net.minecraftforge.fml.config.ModConfig; - -public class BaseConfigScreen extends ConfigScreen { - - public static final FadableScreenElement DISABLED_RENDERER = (ms, width, height, alpha) -> UIRenderHelper.angledGradient(ms, 0, 0, height / 2, height, width, Theme.Key.BUTTON_DISABLE.p()); - private static final Map> DEFAULTS = new HashMap<>(); - - static { - DEFAULTS.put(Create.ID, (base) -> base - .withTitles("Client Settings", "World Generation Settings", "Gameplay Settings") - .withSpecs(AllConfigs.CLIENT.specification, AllConfigs.COMMON.specification, AllConfigs.SERVER.specification) - ); - } - - /** - * If you are a Create Addon dev and want to change the config labels, - * add a default action here. - * - * Make sure you call either {@link #withSpecs(ForgeConfigSpec, ForgeConfigSpec, ForgeConfigSpec)} - * or {@link #searchForSpecsInModContainer()} - * - * @param modID the modID of your addon/mod - */ - public static void setDefaultActionFor(String modID, UnaryOperator transform) { - if (modID.equals(Create.ID)) - return; - - DEFAULTS.put(modID, transform); - } - - public static BaseConfigScreen forCreate(Screen parent) { - return new BaseConfigScreen(parent); - } - - BoxWidget clientConfigWidget; - BoxWidget commonConfigWidget; - BoxWidget serverConfigWidget; - BoxWidget goBack; - BoxWidget others; - BoxWidget title; - - ForgeConfigSpec clientSpec; - ForgeConfigSpec commonSpec; - ForgeConfigSpec serverSpec; - String clientTile = "Client Config"; - String commonTile = "Common Config"; - String serverTile = "Server Config"; - String modID; - protected boolean returnOnClose; - - public BaseConfigScreen(Screen parent, @Nonnull String modID) { - super(parent); - this.modID = modID; - - if (DEFAULTS.containsKey(modID)) - DEFAULTS.get(modID).apply(this); - else { - this.searchForSpecsInModContainer(); - } - } - - private BaseConfigScreen(Screen parent) { - this(parent, Create.ID); - } - - /** - * If you have static references to your Configs or ConfigSpecs (like Create does in {@link AllConfigs}), - * please use {@link #withSpecs(ForgeConfigSpec, ForgeConfigSpec, ForgeConfigSpec)} instead - */ - public BaseConfigScreen searchForSpecsInModContainer() { - if (!ConfigHelper.hasAnyForgeConfig(this.modID)){ - return this; - } - - try { - clientSpec = ConfigHelper.findForgeConfigSpecFor(ModConfig.Type.CLIENT, this.modID); - } catch (Exception e) { - Create.LOGGER.debug("Unable to find ClientConfigSpec for mod: " + this.modID); - } - - try { - commonSpec = ConfigHelper.findForgeConfigSpecFor(ModConfig.Type.COMMON, this.modID); - } catch (Exception e) { - Create.LOGGER.debug("Unable to find CommonConfigSpec for mod: " + this.modID); - } - - try { - serverSpec = ConfigHelper.findForgeConfigSpecFor(ModConfig.Type.SERVER, this.modID); - } catch (Exception e) { - Create.LOGGER.debug("Unable to find ServerConfigSpec for mod: " + this.modID); - } - - return this; - } - - public BaseConfigScreen withSpecs(@Nullable ForgeConfigSpec client, @Nullable ForgeConfigSpec common, @Nullable ForgeConfigSpec server) { - clientSpec = client; - commonSpec = common; - serverSpec = server; - return this; - } - - public BaseConfigScreen withTitles(@Nullable String client, @Nullable String common, @Nullable String server) { - if (client != null) - clientTile = client; - - if (common != null) - commonTile = common; - - if (server != null) - serverTile = server; - - return this; - } - - @Override - protected void init() { - super.init(); - returnOnClose = true; - - TextStencilElement clientText = new TextStencilElement(font, new TextComponent(clientTile)).centered(true, true); - addRenderableWidget(clientConfigWidget = new BoxWidget(width / 2 - 100, height / 2 - 15 - 30, 200, 16).showingElement(clientText)); - - if (clientSpec != null) { - clientConfigWidget.withCallback(() -> linkTo(new SubMenuConfigScreen(this, ModConfig.Type.CLIENT, clientSpec))); - clientText.withElementRenderer(BoxWidget.gradientFactory.apply(clientConfigWidget)); - } else { - clientConfigWidget.active = false; - clientConfigWidget.updateColorsFromState(); - clientText.withElementRenderer(DISABLED_RENDERER); - } - - TextStencilElement commonText = new TextStencilElement(font, new TextComponent(commonTile)).centered(true, true); - addRenderableWidget(commonConfigWidget = new BoxWidget(width / 2 - 100, height / 2 - 15, 200, 16).showingElement(commonText)); - - if (commonSpec != null) { - commonConfigWidget.withCallback(() -> linkTo(new SubMenuConfigScreen(this, ModConfig.Type.COMMON, commonSpec))); - commonText.withElementRenderer(BoxWidget.gradientFactory.apply(commonConfigWidget)); - } else { - commonConfigWidget.active = false; - commonConfigWidget.updateColorsFromState(); - commonText.withElementRenderer(DISABLED_RENDERER); - } - - TextStencilElement serverText = new TextStencilElement(font, new TextComponent(serverTile)).centered(true, true); - addRenderableWidget(serverConfigWidget = new BoxWidget(width / 2 - 100, height / 2 - 15 + 30, 200, 16).showingElement(serverText)); - - if (serverSpec == null) { - serverConfigWidget.active = false; - serverConfigWidget.updateColorsFromState(); - serverText.withElementRenderer(DISABLED_RENDERER); - } else if (minecraft.level == null) { - serverText.withElementRenderer(DISABLED_RENDERER); - serverConfigWidget.getToolTip() - .add(new TextComponent("Stored individually per World")); - serverConfigWidget.getToolTip() - .addAll(FontHelper.cutTextComponent( - new TextComponent( - "Gameplay settings can only be accessed from the in-game menu after joining a World or Server."), - ChatFormatting.GRAY, ChatFormatting.GRAY)); - } else { - serverConfigWidget.withCallback(() -> linkTo(new SubMenuConfigScreen(this, ModConfig.Type.SERVER, serverSpec))); - serverText.withElementRenderer(BoxWidget.gradientFactory.apply(serverConfigWidget)); - } - - TextStencilElement titleText = new TextStencilElement(font, modID.toUpperCase(Locale.ROOT)) - .centered(true, true) - .withElementRenderer((ms, w, h, alpha) -> { - UIRenderHelper.angledGradient(ms, 0, 0, h / 2, h, w / 2, Theme.Key.CONFIG_TITLE_A.p()); - UIRenderHelper.angledGradient(ms, 0, w / 2, h / 2, h, w / 2, Theme.Key.CONFIG_TITLE_B.p()); - }); - int boxWidth = width + 10; - int boxHeight = 39; - int boxPadding = 4; - title = new BoxWidget(-5, height / 2 - 110, boxWidth, boxHeight) - //.withCustomBackground(new Color(0x20_000000, true)) - .withBorderColors(Theme.Key.BUTTON_IDLE.p()) - .withPadding(0, boxPadding) - .rescaleElement(boxWidth / 2f, (boxHeight - 2 * boxPadding) / 2f)//double the text size by telling it the element is only half as big as the available space - .showingElement(titleText.at(0, 7)); - title.active = false; - - addRenderableWidget(title); - - - ConfigScreen.modID = this.modID; - - goBack = new BoxWidget(width / 2 - 134, height / 2, 20, 20).withPadding(2, 2) - .withCallback(() -> linkTo(parent)); - goBack.showingElement(AllIcons.I_CONFIG_BACK.asStencil() - .withElementRenderer(BoxWidget.gradientFactory.apply(goBack))); - goBack.getToolTip() - .add(new TextComponent("Go Back")); - addRenderableWidget(goBack); - - TextStencilElement othersText = new TextStencilElement(font, new TextComponent("Access Configs of other Mods")).centered(true, true); - others = new BoxWidget(width / 2 - 100, height / 2 - 15 + 90, 200, 16).showingElement(othersText); - othersText.withElementRenderer(BoxWidget.gradientFactory.apply(others)); - others.withCallback(() -> linkTo(new ConfigModListScreen(this))); - addRenderableWidget(others); - } - - @Override - protected void renderWindow(PoseStack ms, int mouseX, int mouseY, float partialTicks) { - drawCenteredString(ms, font, "Access Configs for Mod:", width / 2, height / 2 - 105, Theme.Key.TEXT_ACCENT_STRONG.i()); - } - - private void linkTo(Screen screen) { - returnOnClose = false; - ScreenOpener.open(screen); - } - - @Override - public boolean keyPressed(int keyCode, int scanCode, int modifiers) { - if (super.keyPressed(keyCode, scanCode, modifiers)) - return true; - if (keyCode == GLFW.GLFW_KEY_BACKSPACE) { - linkTo(parent); - } - return false; - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/CConfigureConfigPacket.java b/src/main/java/com/simibubi/create/foundation/config/ui/CConfigureConfigPacket.java deleted file mode 100644 index 6e1a122243..0000000000 --- a/src/main/java/com/simibubi/create/foundation/config/ui/CConfigureConfigPacket.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.simibubi.create.foundation.config.ui; - -import java.util.Objects; -import java.util.function.Supplier; - -import com.simibubi.create.Create; -import com.simibubi.create.foundation.networking.SimplePacketBase; - -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.server.level.ServerPlayer; -import net.minecraftforge.common.ForgeConfigSpec; -import net.minecraftforge.fml.config.ModConfig; -import net.minecraftforge.network.NetworkEvent; - -public class CConfigureConfigPacket extends SimplePacketBase { - - private String modID; - private String path; - private String value; - - public CConfigureConfigPacket(String modID, String path, T value) { - this.modID = Objects.requireNonNull(modID); - this.path = path; - this.value = serialize(value); - } - - public CConfigureConfigPacket(FriendlyByteBuf buffer) { - this.modID = buffer.readUtf(32767); - this.path = buffer.readUtf(32767); - this.value = buffer.readUtf(32767); - } - - @Override - public void write(FriendlyByteBuf buffer) { - buffer.writeUtf(modID); - buffer.writeUtf(path); - buffer.writeUtf(value); - } - - @Override - public void handle(Supplier context) { - context.get().enqueueWork(() -> { - try { - ServerPlayer sender = context.get().getSender(); - if (sender == null || !sender.hasPermissions(2)) - return; - - ForgeConfigSpec spec = ConfigHelper.findForgeConfigSpecFor(ModConfig.Type.SERVER, modID); - if (spec == null) - return; - ForgeConfigSpec.ValueSpec valueSpec = spec.getRaw(path); - ForgeConfigSpec.ConfigValue configValue = spec.getValues().get(path); - - T v = (T) deserialize(configValue.get(), value); - if (!valueSpec.test(v)) - return; - - configValue.set(v); - } catch (Exception e) { - Create.LOGGER.warn("Unable to handle ConfigureConfig Packet. ", e); - } - }); - - context.get().setPacketHandled(true); - } - - public String serialize(T value) { - if (value instanceof Boolean) - return Boolean.toString((Boolean) value); - if (value instanceof Enum) - return ((Enum) value).name(); - if (value instanceof Integer) - return Integer.toString((Integer) value); - if (value instanceof Float) - return Float.toString((Float) value); - if (value instanceof Double) - return Double.toString((Double) value); - - throw new IllegalArgumentException("unknown type " + value + ": " + value.getClass().getSimpleName()); - } - - public static Object deserialize(Object type, String sValue) { - if (type instanceof Boolean) - return Boolean.parseBoolean(sValue); - if (type instanceof Enum) - return Enum.valueOf(((Enum) type).getClass(), sValue); - if (type instanceof Integer) - return Integer.parseInt(sValue); - if (type instanceof Float) - return Float.parseFloat(sValue); - if (type instanceof Double) - return Double.parseDouble(sValue); - - throw new IllegalArgumentException("unknown type " + type + ": " + type.getClass().getSimpleName()); - } -} diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/ConfigAnnotations.java b/src/main/java/com/simibubi/create/foundation/config/ui/ConfigAnnotations.java deleted file mode 100644 index f52290faef..0000000000 --- a/src/main/java/com/simibubi/create/foundation/config/ui/ConfigAnnotations.java +++ /dev/null @@ -1,112 +0,0 @@ -package com.simibubi.create.foundation.config.ui; - -public class ConfigAnnotations { - - - /** - * Changes the way the Integer value is display. - */ - public enum IntDisplay implements ConfigAnnotation { - HEX("#"), - ZERO_X("0x"), - ZERO_B("0b"); - - private final String value; - - IntDisplay(String value) { - this.value = value; - } - - @Override - public String getName() { - return "IntDisplay"; - } - - @Override - public String getValue() { - return value; - } - } - - /** - * Indicates to the player that changing this value will require a restart to take full effect - */ - public enum RequiresRestart implements ConfigAnnotation { - CLIENT("client"), - SERVER("server"), - BOTH("both"); - - private final String value; - - RequiresRestart(String value) { - this.value = value; - } - - @Override - public String getName() { - return "RequiresReload"; - } - - @Override - public String getValue() { - return value; - } - } - - /** - * Indicates to the player that changing this value will require them to relog to take full effect - */ - public enum RequiresRelog implements ConfigAnnotation { - TRUE; - - @Override - public String getName() { - return "RequiresRelog"; - } - } - - /** - * Changing a value that is annotated with Execute will cause the player to run the given command automatically. - */ - public static class Execute implements ConfigAnnotation { - - private final String command; - - public static Execute run(String command) { - return new Execute(command); - } - - private Execute(String command) { - this.command = command; - } - - @Override - public String getName() { - return "Execute"; - } - - @Override - public String getValue() { - return command; - } - } - - public interface ConfigAnnotation { - String getName(); - - default String getValue() { - return null; - } - - default String asComment() { - String comment = "[@cui:" + getName(); - String value = getValue(); - if (value != null) { - comment = comment + ":" + value; - } - comment = comment + "]"; - return comment; - } - - } -} diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/ConfigHelper.java b/src/main/java/com/simibubi/create/foundation/config/ui/ConfigHelper.java deleted file mode 100644 index 912240d12a..0000000000 --- a/src/main/java/com/simibubi/create/foundation/config/ui/ConfigHelper.java +++ /dev/null @@ -1,232 +0,0 @@ -package com.simibubi.create.foundation.config.ui; - -import java.util.Arrays; -import java.util.EnumMap; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Objects; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicReference; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -import com.google.common.cache.CacheBuilder; -import com.google.common.cache.CacheLoader; -import com.google.common.cache.LoadingCache; -import com.simibubi.create.Create; -import com.simibubi.create.foundation.config.AllConfigs; - -import net.createmod.catnip.utility.Pair; -import net.minecraftforge.common.ForgeConfigSpec; -import net.minecraftforge.fml.ModContainer; -import net.minecraftforge.fml.ModList; -import net.minecraftforge.fml.config.IConfigSpec; -import net.minecraftforge.fml.config.ModConfig; -import net.minecraftforge.fml.util.ObfuscationReflectionHelper; - -public class ConfigHelper { - - public static final Pattern unitPattern = Pattern.compile("\\[(in .*)]"); - public static final Pattern annotationPattern = Pattern.compile("\\[@cui:([^:]*)(?::(.*))?]"); - - public static final Map changes = new HashMap<>(); - private static final LoadingCache> configCache = - CacheBuilder.newBuilder() - .expireAfterAccess(5, TimeUnit.MINUTES) - .build(new CacheLoader>() { - @Override - public EnumMap load(@Nonnull String key) { - return findModConfigsUncached(key); - } - }); - - private static EnumMap findModConfigsUncached(String modID) { - ModContainer modContainer = ModList.get() - .getModContainerById(modID) - .orElseThrow(() -> new IllegalArgumentException("Unable to find ModContainer for id: " + modID)); - EnumMap configs = - ObfuscationReflectionHelper.getPrivateValue(ModContainer.class, modContainer, "configs"); - return Objects.requireNonNull(configs); - } - - public static IConfigSpec findConfigSpecFor(ModConfig.Type type, String modID) { - if (!modID.equals(Create.ID)) - return configCache.getUnchecked(modID) - .get(type) - .getSpec(); - return AllConfigs.byType(type).specification; - } - - @Nullable - public static ForgeConfigSpec findForgeConfigSpecFor(ModConfig.Type type, String modID) { - IConfigSpec spec = findConfigSpecFor(type, modID); - if (spec instanceof ForgeConfigSpec) { - return (ForgeConfigSpec) spec; - } - return null; - } - - public static boolean hasAnyConfig(String modID) { - if (!modID.equals(Create.ID)) - return !configCache.getUnchecked(modID) - .isEmpty(); - return true; - } - - public static boolean hasAnyForgeConfig(String modID) { - if (!modID.equals(Create.ID)) - return configCache.getUnchecked(modID) - .values() - .stream() - .anyMatch(config -> config.getSpec() instanceof ForgeConfigSpec); - return true; - } - - // Directly set a value - public static void setConfigValue(ConfigPath path, String value) throws InvalidValueException { - ForgeConfigSpec spec = findForgeConfigSpecFor(path.getType(), path.getModID()); - if (spec == null) - return; - - List pathList = Arrays.asList(path.getPath()); - ForgeConfigSpec.ValueSpec valueSpec = spec.getRaw(pathList); - ForgeConfigSpec.ConfigValue configValue = spec.getValues() - .get(pathList); - T v = (T) CConfigureConfigPacket.deserialize(configValue.get(), value); - if (!valueSpec.test(v)) - throw new InvalidValueException(); - - configValue.set(v); - } - - // Add a value to the current UI's changes list - public static void setValue(String path, ForgeConfigSpec.ConfigValue configValue, T value, - @Nullable Map annotations) { - if (value.equals(configValue.get())) { - changes.remove(path); - } else { - changes.put(path, annotations == null ? new ConfigChange(value) : new ConfigChange(value, annotations)); - } - } - - // Get a value from the current UI's changes list or the config value, if its - // unchanged - public static T getValue(String path, ForgeConfigSpec.ConfigValue configValue) { - ConfigChange configChange = changes.get(path); - if (configChange != null) - // noinspection unchecked - return (T) configChange.value; - else - return configValue.get(); - } - - public static Pair> readMetadataFromComment(List commentLines) { - AtomicReference unit = new AtomicReference<>(); - Map annotations = new HashMap<>(); - - commentLines.removeIf(line -> { - if (line.trim() - .isEmpty()) { - return true; - } - - Matcher matcher = annotationPattern.matcher(line); - if (matcher.matches()) { - String annotation = matcher.group(1); - String aValue = matcher.group(2); - annotations.putIfAbsent(annotation, aValue); - - return true; - } - - matcher = unitPattern.matcher(line); - if (matcher.matches()) { - unit.set(matcher.group(1)); - } - - return false; - }); - - return Pair.of(unit.get(), annotations); - } - - public static class ConfigPath { - private String modID = Create.ID; - private ModConfig.Type type = ModConfig.Type.CLIENT; - private String[] path; - - public static ConfigPath parse(String string) { - ConfigPath cp = new ConfigPath(); - String p = string; - int index = string.indexOf(":"); - if (index >= 0) { - p = string.substring(index + 1); - if (index >= 1) { - cp.modID = string.substring(0, index); - } - } - String[] split = p.split("\\."); - try { - cp.type = ModConfig.Type.valueOf(split[0].toUpperCase(Locale.ROOT)); - } catch (Exception e) { - throw new IllegalArgumentException("path must start with either 'client.', 'common.' or 'server.'"); - } - - cp.path = new String[split.length - 1]; - System.arraycopy(split, 1, cp.path, 0, cp.path.length); - - return cp; - } - - public ConfigPath setID(String modID) { - this.modID = modID; - return this; - } - - public ConfigPath setType(ModConfig.Type type) { - this.type = type; - return this; - } - - public ConfigPath setPath(String[] path) { - this.path = path; - return this; - } - - public String getModID() { - return modID; - } - - public ModConfig.Type getType() { - return type; - } - - public String[] getPath() { - return path; - } - } - - public static class ConfigChange { - Object value; - Map annotations; - - ConfigChange(Object value) { - this.value = value; - } - - ConfigChange(Object value, Map annotations) { - this(value); - this.annotations = new HashMap<>(); - this.annotations.putAll(annotations); - } - } - - public static class InvalidValueException extends Exception { - private static final long serialVersionUID = 1L; - } -} diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/ConfigModListScreen.java b/src/main/java/com/simibubi/create/foundation/config/ui/ConfigModListScreen.java deleted file mode 100644 index 71f05047fd..0000000000 --- a/src/main/java/com/simibubi/create/foundation/config/ui/ConfigModListScreen.java +++ /dev/null @@ -1,147 +0,0 @@ -package com.simibubi.create.foundation.config.ui; - -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; - -import org.lwjgl.glfw.GLFW; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.foundation.gui.AllIcons; - -import net.createmod.catnip.gui.ScreenOpener; -import net.createmod.catnip.gui.element.DelegatedStencilElement; -import net.createmod.catnip.gui.widget.BoxWidget; -import net.createmod.catnip.utility.FontHelper; -import net.createmod.catnip.utility.theme.Theme; -import net.minecraft.ChatFormatting; -import net.minecraft.client.gui.screens.Screen; -import net.minecraft.network.chat.TextComponent; -import net.minecraftforge.fml.ModList; -import net.minecraftforge.forgespi.language.IModInfo; - -public class ConfigModListScreen extends ConfigScreen { - - ConfigScreenList list; - HintableTextFieldWidget search; - BoxWidget goBack; - List allEntries; - - public ConfigModListScreen(Screen parent) { - super(parent); - } - - @Override - protected void init() { - super.init(); - - int listWidth = Math.min(width - 80, 300); - - list = new ConfigScreenList(minecraft, listWidth, height - 60, 15, height - 45, 40); - list.setLeftPos(this.width / 2 - list.getWidth() / 2); - addRenderableWidget(list); - - allEntries = new ArrayList<>(); - ModList.get().getMods().stream().map(IModInfo::getModId).forEach(id -> allEntries.add(new ModEntry(id, this))); - allEntries.sort((e1, e2) -> { - int empty = (e2.button.active ? 1 : 0) - (e1.button.active ? 1 : 0); - if (empty != 0) - return empty; - - return e1.id.compareToIgnoreCase(e2.id); - }); - list.children().clear(); - list.children().addAll(allEntries); - - goBack = new BoxWidget(width / 2 - listWidth / 2 - 30, height / 2 + 65, 20, 20).withPadding(2, 2) - .withCallback(() -> ScreenOpener.open(parent)); - goBack.showingElement(AllIcons.I_CONFIG_BACK.asStencil() - .withElementRenderer(BoxWidget.gradientFactory.apply(goBack))); - goBack.getToolTip() - .add(new TextComponent("Go Back")); - addRenderableWidget(goBack); - - search = new HintableTextFieldWidget(font, width / 2 - listWidth / 2, height - 35, listWidth, 20); - search.setResponder(this::updateFilter); - search.setHint("Search..."); - search.moveCursorToStart(); - addRenderableWidget(search); - } - - @Override - public boolean keyPressed(int keyCode, int scanCode, int modifiers) { - if (super.keyPressed(keyCode, scanCode, modifiers)) - return true; - if (keyCode == GLFW.GLFW_KEY_BACKSPACE) { - ScreenOpener.open(parent); - } - return false; - } - - private void updateFilter(String search) { - list.children().clear(); - allEntries - .stream() - .filter(modEntry -> modEntry.id.contains(search.toLowerCase(Locale.ROOT))) - .forEach(list.children()::add); - - list.setScrollAmount(list.getScrollAmount()); - if (list.children().size() > 0) { - this.search.setTextColor(Theme.Key.TEXT.i()); - } else { - this.search.setTextColor(Theme.Key.BUTTON_FAIL.i()); - } - } - - public static class ModEntry extends ConfigScreenList.LabeledEntry { - - protected BoxWidget button; - protected String id; - - public ModEntry(String id, Screen parent) { - super(toHumanReadable(id)); - this.id = id; - - button = new BoxWidget(0, 0, 35, 16) - .showingElement(AllIcons.I_CONFIG_OPEN.asStencil().at(10, 0)); - button.modifyElement(e -> ((DelegatedStencilElement) e).withElementRenderer(BoxWidget.gradientFactory.apply(button))); - - if (ConfigHelper.hasAnyForgeConfig(id)) { - button.withCallback(() -> ScreenOpener.open(new BaseConfigScreen(parent, id))); - } else { - button.active = false; - button.updateColorsFromState(); - button.modifyElement(e -> ((DelegatedStencilElement) e).withElementRenderer(BaseConfigScreen.DISABLED_RENDERER)); - labelTooltip.add(new TextComponent(toHumanReadable(id))); - labelTooltip.addAll(FontHelper.cutTextComponent(new TextComponent("This Mod does not have any configs registered or is not using Forge's config system"), ChatFormatting.GRAY, ChatFormatting.GRAY)); - } - - listeners.add(button); - } - - public String getId() { - return id; - } - - @Override - public void tick() { - super.tick(); - button.tick(); - } - - @Override - public void render(PoseStack ms, int index, int y, int x, int width, int height, int mouseX, int mouseY, boolean p_230432_9_, float partialTicks) { - super.render(ms, index, y, x, width, height, mouseX, mouseY, p_230432_9_, partialTicks); - - button.x = x + width - 108; - button.y = y + 10; - button.setHeight(height - 20); - button.render(ms, mouseX, mouseY, partialTicks); - } - - @Override - protected int getLabelWidth(int totalWidth) { - return (int) (totalWidth * labelWidthMult) + 30; - } - } -} diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/ConfigScreen.java b/src/main/java/com/simibubi/create/foundation/config/ui/ConfigScreen.java deleted file mode 100644 index 3bf80618ea..0000000000 --- a/src/main/java/com/simibubi/create/foundation/config/ui/ConfigScreen.java +++ /dev/null @@ -1,168 +0,0 @@ -package com.simibubi.create.foundation.config.ui; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; -import java.util.stream.Collectors; - -import javax.annotation.Nonnull; - -import org.apache.commons.lang3.StringUtils; -import org.apache.logging.log4j.util.TriConsumer; -import org.lwjgl.opengl.GL30; - -import com.mojang.blaze3d.platform.GlStateManager; -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.AllBlocks; -import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock; -import com.simibubi.create.foundation.gui.CreateMainMenuScreen; - -import net.createmod.catnip.gui.AbstractSimiScreen; -import net.createmod.catnip.gui.UIRenderHelper; -import net.createmod.catnip.gui.element.DelegatedStencilElement; -import net.createmod.catnip.gui.element.GuiGameElement; -import net.createmod.catnip.utility.animation.Force; -import net.createmod.catnip.utility.animation.PhysicalFloat; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.screens.Screen; -import net.minecraft.core.Direction; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.client.event.ScreenEvent; - -public abstract class ConfigScreen extends AbstractSimiScreen { - - /* - * - * TODO - * - * reduce number of packets sent to the server when saving a bunch of values - * - * FIXME - * - * tooltips are hidden underneath the scrollbar, if the bar is near the middle - * - */ - - public static final Map> backgrounds = new HashMap<>(); - public static final PhysicalFloat cogSpin = PhysicalFloat.create().withLimit(10f).withDrag(0.3).addForce(new Force.Static(.2f)); - public static final BlockState cogwheelState = AllBlocks.LARGE_COGWHEEL.getDefaultState().setValue(CogWheelBlock.AXIS, Direction.Axis.Y); - public static String modID = null; - protected final Screen parent; - - public ConfigScreen(Screen parent) { - this.parent = parent; - } - - @Override - public void tick() { - super.tick(); - cogSpin.tick(); - } - - @Override - public void renderBackground(@Nonnull PoseStack ms) { - net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new ScreenEvent.BackgroundDrawnEvent(this, ms)); - } - - @Override - protected void renderWindowBackground(PoseStack ms, int mouseX, int mouseY, float partialTicks) { - if (this.minecraft != null && this.minecraft.level != null) { - //in game - fill(ms, 0, 0, this.width, this.height, 0xb0_282c34); - } else { - //in menus - renderMenuBackground(ms, partialTicks); - } - - /*new StencilElement() { - @Override - protected void renderStencil(PoseStack ms) { - renderCog(ms, partialTicks); - } - - @Override - protected void renderElement(PoseStack ms) { - fill(ms, -200, -200, 200, 200, 0x60_000000); - } - }*/ - - new DelegatedStencilElement( - (ps, x, y, alpha) -> renderCog(ps, partialTicks), - (ps, x, y, alpha) -> fill(ms, -200, -200, 200, 200, 0x60_000000) - ).at(width * 0.5f, height * 0.5f, 0).render(ms); - - super.renderWindowBackground(ms, mouseX, mouseY, partialTicks); - - } - - @Override - protected void prepareFrame() { - UIRenderHelper.swapAndBlitColor(minecraft.getMainRenderTarget(), UIRenderHelper.framebuffer); - RenderSystem.clear(GL30.GL_STENCIL_BUFFER_BIT | GL30.GL_DEPTH_BUFFER_BIT, Minecraft.ON_OSX); - } - - @Override - protected void endFrame() { - UIRenderHelper.swapAndBlitColor(UIRenderHelper.framebuffer, minecraft.getMainRenderTarget()); - } - - @Override - protected void renderWindow(PoseStack ms, int mouseX, int mouseY, float partialTicks) { - } - - @Override - public boolean mouseScrolled(double mouseX, double mouseY, double delta) { - cogSpin.bump(3, -delta * 5); - - return super.mouseScrolled(mouseX, mouseY, delta); - } - - @Override - public boolean isPauseScreen() { - return true; - } - - public static String toHumanReadable(String key) { - String s = key.replaceAll("_", " "); - s = Arrays.stream(StringUtils.splitByCharacterTypeCamelCase(s)).map(StringUtils::capitalize).collect(Collectors.joining(" ")); - s = StringUtils.normalizeSpace(s); - return s; - } - - /** - * By default ConfigScreens will render the Create Panorama as - * their background when opened from the Main- or ModList-Menu. - * If your addon wants to render something else, please add to the - * backgrounds Map in this Class with your modID as the key. - */ - protected void renderMenuBackground(PoseStack ms, float partialTicks) { - TriConsumer customBackground = backgrounds.get(modID); - if (customBackground != null) { - customBackground.accept(this, ms, partialTicks); - return; - } - - float elapsedPartials = minecraft.getDeltaFrameTime(); - CreateMainMenuScreen.PANORAMA.render(elapsedPartials, 1); - - RenderSystem.setShaderTexture(0, CreateMainMenuScreen.PANORAMA_OVERLAY_TEXTURES); - RenderSystem.enableBlend(); - RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); - blit(ms, 0, 0, this.width, this.height, 0.0F, 0.0F, 16, 128, 16, 128); - - fill(ms, 0, 0, this.width, this.height, 0x90_282c34); - } - - protected void renderCog(PoseStack ms, float partialTicks) { - ms.pushPose(); - - ms.translate(-100, 100, -100); - ms.scale(200, 200, 1); - GuiGameElement.of(cogwheelState) - .rotateBlock(22.5, cogSpin.getValue(partialTicks), 22.5) - .render(ms); - - ms.popPose(); - } -} diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/ConfigScreenList.java b/src/main/java/com/simibubi/create/foundation/config/ui/ConfigScreenList.java deleted file mode 100644 index e229be96fb..0000000000 --- a/src/main/java/com/simibubi/create/foundation/config/ui/ConfigScreenList.java +++ /dev/null @@ -1,278 +0,0 @@ -package com.simibubi.create.foundation.config.ui; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Optional; - -import com.mojang.blaze3d.platform.GlStateManager; -import com.mojang.blaze3d.platform.Window; -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.foundation.config.ui.entries.NumberEntry; -import com.simibubi.create.foundation.gui.RemovedGuiUtils; - -import net.createmod.catnip.gui.TickableGuiEventListener; -import net.createmod.catnip.gui.UIRenderHelper; -import net.createmod.catnip.gui.element.TextStencilElement; -import net.createmod.catnip.utility.animation.LerpedFloat; -import net.createmod.catnip.utility.theme.Color; -import net.createmod.catnip.utility.theme.Theme; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.Font; -import net.minecraft.client.gui.components.EditBox; -import net.minecraft.client.gui.components.ObjectSelectionList; -import net.minecraft.client.gui.components.events.GuiEventListener; -import net.minecraft.client.gui.screens.Screen; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.MutableComponent; -import net.minecraft.network.chat.TextComponent; - -public class ConfigScreenList extends ObjectSelectionList implements TickableGuiEventListener { - - public static EditBox currentText; - - public ConfigScreenList(Minecraft client, int width, int height, int top, int bottom, int elementHeight) { - super(client, width, height, top, bottom, elementHeight); - setRenderBackground(false); - setRenderTopAndBottom(false); - setRenderSelection(false); - currentText = null; - headerHeight = 3; - } - - @Override - public void render(PoseStack ms, int mouseX, int mouseY, float partialTicks) { - Color c = new Color(0x60_000000); - UIRenderHelper.angledGradient(ms, 90, x0 + width / 2, y0, width, 5, c, Color.TRANSPARENT_BLACK); - UIRenderHelper.angledGradient(ms, -90, x0 + width / 2, y1, width, 5, c, Color.TRANSPARENT_BLACK); - UIRenderHelper.angledGradient(ms, 0, x0, y0 + height / 2, height, 5, c, Color.TRANSPARENT_BLACK); - UIRenderHelper.angledGradient(ms, 180, x1, y0 + height / 2, height, 5, c, Color.TRANSPARENT_BLACK); - - super.render(ms, mouseX, mouseY, partialTicks); - } - - @Override - protected void renderList(PoseStack p_238478_1_, int p_238478_2_, int p_238478_3_, int p_238478_4_, int p_238478_5_, float p_238478_6_) { - Window window = minecraft.getWindow(); - double d0 = window.getGuiScale(); - RenderSystem.enableScissor((int) (this.x0 * d0), (int) (window.getHeight() - (this.y1 * d0)), (int) (this.width * d0), (int) (this.height * d0)); - super.renderList(p_238478_1_, p_238478_2_, p_238478_3_, p_238478_4_, p_238478_5_, p_238478_6_); - RenderSystem.disableScissor(); - } - - @Override - public boolean mouseClicked(double x, double y, int button) { - children().stream().filter(e -> e instanceof NumberEntry).forEach(e -> e.mouseClicked(x, y, button)); - - return super.mouseClicked(x, y, button); - } - - @Override - public int getRowWidth() { - return width - 16; - } - - @Override - protected int getScrollbarPosition() { - return x0 + this.width - 6; - } - - @Override - public void tick() { - /*for(int i = 0; i < getItemCount(); ++i) { - int top = this.getRowTop(i); - int bot = top + itemHeight; - if (bot >= this.y0 && top <= this.y1) - this.getEntry(i).tick(); - }*/ - children().forEach(Entry::tick); - - } - - public boolean search(String query) { - if (query == null || query.isEmpty()) { - setScrollAmount(0); - return true; - } - - String q = query.toLowerCase(Locale.ROOT); - Optional first = children().stream().filter(entry -> { - if (entry.path == null) - return false; - - String[] split = entry.path.split("\\."); - String key = split[split.length - 1].toLowerCase(Locale.ROOT); - return key.contains(q); - }).findFirst(); - - if (!first.isPresent()) { - setScrollAmount(0); - return false; - } - - Entry e = first.get(); - e.annotations.put("highlight", "(:"); - centerScrollOn(e); - return true; - } - - public void bumpCog(float force) { - ConfigScreen.cogSpin.bump(3, force); - } - - public static abstract class Entry extends ObjectSelectionList.Entry implements TickableGuiEventListener { - protected List listeners; - protected Map annotations; - protected String path; - - protected Entry() { - listeners = new ArrayList<>(); - annotations = new HashMap<>(); - } - - @Override - public boolean mouseClicked(double x, double y, int button) { - return getGuiListeners().stream().anyMatch(l -> l.mouseClicked(x, y, button)); - } - - @Override - public boolean keyPressed(int code, int keyPressed_2_, int keyPressed_3_) { - return getGuiListeners().stream().anyMatch(l -> l.keyPressed(code, keyPressed_2_, keyPressed_3_)); - } - - @Override - public boolean charTyped(char ch, int code) { - return getGuiListeners().stream().anyMatch(l -> l.charTyped(ch, code)); - } - - @Override - public void tick() {} - - public List getGuiListeners() { - return listeners; - } - - protected void setEditable(boolean b) {} - - protected boolean isCurrentValueChanged() { - if (path == null) { - return false; - } - return ConfigHelper.changes.containsKey(path); - } - } - - public static class LabeledEntry extends Entry { - - protected static final float labelWidthMult = 0.4f; - - protected TextStencilElement label; - protected List labelTooltip; - protected String unit = null; - protected LerpedFloat differenceAnimation = LerpedFloat.linear().startWithValue(0); - protected LerpedFloat highlightAnimation = LerpedFloat.linear().startWithValue(0); - - public LabeledEntry(String label) { - this.label = new TextStencilElement(Minecraft.getInstance().font, label); - this.label.withElementRenderer((ms, width, height, alpha) -> UIRenderHelper.angledGradient(ms, 0, 0, height / 2, height, width, Theme.Key.TEXT_ACCENT_STRONG.p())); - labelTooltip = new ArrayList<>(); - } - - public LabeledEntry(String label, String path) { - this(label); - this.path = path; - } - - @Override - public void tick() { - differenceAnimation.tickChaser(); - highlightAnimation.tickChaser(); - super.tick(); - } - - @Override - public void render(PoseStack ms, int index, int y, int x, int width, int height, int mouseX, int mouseY, boolean p_230432_9_, float partialTicks) { - if (isCurrentValueChanged()) { - if (differenceAnimation.getChaseTarget() != 1) - differenceAnimation.chase(1, .5f, LerpedFloat.Chaser.EXP); - } else { - if (differenceAnimation.getChaseTarget() != 0) - differenceAnimation.chase(0, .6f, LerpedFloat.Chaser.EXP); - } - - float animation = differenceAnimation.getValue(partialTicks); - if (animation > .1f) { - int offset = (int) (30 * (1 - animation)); - - if (annotations.containsKey(ConfigAnnotations.RequiresRestart.CLIENT.getName())) { - UIRenderHelper.streak(ms, 180, x + width + 10 + offset, y + height / 2, height - 6, 110, new Color(0x50_601010)); - } else if (annotations.containsKey(ConfigAnnotations.RequiresRelog.TRUE.getName())) { - UIRenderHelper.streak(ms, 180, x + width + 10 + offset, y + height / 2, height - 6, 110, new Color(0x40_eefb17)); - } - - UIRenderHelper.breadcrumbArrow(ms, x - 10 - offset, y + 6, 0, -20, 24, -18, new Color(0x70_ffffff), Color.TRANSPARENT_BLACK); - } - - UIRenderHelper.streak(ms, 0, x - 10, y + height / 2, height - 6, width / 8 * 7, new Color(0xdd_000000)); - UIRenderHelper.streak(ms, 180, x + (int) (width * 1.35f) + 10, y + height / 2, height - 6, width / 8 * 7, new Color(0xdd_000000)); - MutableComponent component = label.getComponent(); - Font font = Minecraft.getInstance().font; - if (font.width(component) > getLabelWidth(width) - 10) { - label.withText(font.substrByWidth(component, getLabelWidth(width) - 15).getString() + "..."); - } - if (unit != null) { - int unitWidth = font.width(unit); - font.draw(ms, unit, x + getLabelWidth(width) - unitWidth - 5, y + height / 2 + 2, Theme.Key.TEXT_DARKER.i()); - label.at(x + 10, y + height / 2 - 10, 0).render(ms); - } else { - label.at(x + 10, y + height / 2 - 4, 0).render(ms); - } - - if (annotations.containsKey("highlight")) { - highlightAnimation.startWithValue(1).chase(0, 0.1f, LerpedFloat.Chaser.LINEAR); - annotations.remove("highlight"); - } - - animation = highlightAnimation.getValue(partialTicks); - if (animation > .01f) { - Color highlight = new Color(0xa0_ffffff).scaleAlpha(animation); - UIRenderHelper.streak(ms, 0, x - 10, y + height / 2, height - 6, 5, highlight); - UIRenderHelper.streak(ms, 180, x + width, y + height / 2, height - 6, 5, highlight); - UIRenderHelper.streak(ms, 90, x + width / 2 - 5, y + 3, width + 10, 5, highlight); - UIRenderHelper.streak(ms, -90, x + width / 2 - 5, y + height - 3, width + 10, 5, highlight); - } - - - if (mouseX > x && mouseX < x + getLabelWidth(width) && mouseY > y + 5 && mouseY < y + height - 5) { - List tooltip = getLabelTooltip(); - if (tooltip.isEmpty()) - return; - - RenderSystem.disableScissor(); - Screen screen = Minecraft.getInstance().screen; - ms.pushPose(); - ms.translate(0, 0, 400); - RemovedGuiUtils.drawHoveringText(ms, tooltip, mouseX, mouseY, screen.width, screen.height, 300, font); - ms.popPose(); - GlStateManager._enableScissorTest(); - } - } - - public List getLabelTooltip() { - return labelTooltip; - } - - protected int getLabelWidth(int totalWidth) { - return totalWidth; - } - - // TODO 1.17 - @Override - public Component getNarration() { - return TextComponent.EMPTY; - } - } -} diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/ConfigTextField.java b/src/main/java/com/simibubi/create/foundation/config/ui/ConfigTextField.java deleted file mode 100644 index 7aa402f165..0000000000 --- a/src/main/java/com/simibubi/create/foundation/config/ui/ConfigTextField.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.simibubi.create.foundation.config.ui; - -import net.minecraft.client.gui.Font; - -public class ConfigTextField extends HintableTextFieldWidget { - - public ConfigTextField(Font font, int x, int y, int width, int height) { - super(font, x, y, width, height); - } - - @Override - public void setFocus(boolean focus) { - super.setFocus(focus); - - if (!focus) { - if (ConfigScreenList.currentText == this) - ConfigScreenList.currentText = null; - - return; - } - - if (ConfigScreenList.currentText != null && ConfigScreenList.currentText != this) - ConfigScreenList.currentText.setFocus(false); - - ConfigScreenList.currentText = this; - } -} diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/HintableTextFieldWidget.java b/src/main/java/com/simibubi/create/foundation/config/ui/HintableTextFieldWidget.java deleted file mode 100644 index e84e1ed0d4..0000000000 --- a/src/main/java/com/simibubi/create/foundation/config/ui/HintableTextFieldWidget.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.simibubi.create.foundation.config.ui; - -import org.lwjgl.glfw.GLFW; - -import com.mojang.blaze3d.platform.InputConstants; -import com.mojang.blaze3d.vertex.PoseStack; - -import net.createmod.catnip.utility.theme.Theme; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.Font; -import net.minecraft.client.gui.components.EditBox; -import net.minecraft.network.chat.TextComponent; - -public class HintableTextFieldWidget extends EditBox { - - protected Font font; - protected String hint; - - public HintableTextFieldWidget(Font font, int x, int y, int width, int height) { - super(font, x, y, width, height, TextComponent.EMPTY); - this.font = font; - } - - public void setHint(String hint) { - this.hint = hint; - } - - @Override - public void renderButton(PoseStack ms, int mouseX, int mouseY, float partialTicks) { - super.renderButton(ms, mouseX, mouseY, partialTicks); - - if (hint == null || hint.isEmpty()) - return; - - if (!getValue().isEmpty()) - return; - - font.draw(ms, hint, x + 5, this.y + (this.height - 8) / 2, Theme.Key.TEXT.c().scaleAlpha(.75f).getRGB()); - } - - @Override - public boolean mouseClicked(double x, double y, int button) { - if (!isMouseOver(x, y)) - return false; - - if (button == GLFW.GLFW_MOUSE_BUTTON_RIGHT) { - setValue(""); - return true; - } else - return super.mouseClicked(x, y, button); - } - - @Override - public boolean keyPressed(int code, int p_keyPressed_2_, int p_keyPressed_3_) { - InputConstants.Key mouseKey = InputConstants.getKey(code, p_keyPressed_2_); - if (Minecraft.getInstance().options.keyInventory.isActiveAndMatches(mouseKey)) { - return true; - } - - return super.keyPressed(code, p_keyPressed_2_, p_keyPressed_3_); - } -} diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/SubMenuConfigScreen.java b/src/main/java/com/simibubi/create/foundation/config/ui/SubMenuConfigScreen.java deleted file mode 100644 index bcd848a559..0000000000 --- a/src/main/java/com/simibubi/create/foundation/config/ui/SubMenuConfigScreen.java +++ /dev/null @@ -1,469 +0,0 @@ -package com.simibubi.create.foundation.config.ui; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.function.Consumer; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -import org.lwjgl.glfw.GLFW; - -import com.electronwill.nightconfig.core.AbstractConfig; -import com.electronwill.nightconfig.core.UnmodifiableConfig; -import com.google.common.collect.Lists; -import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.foundation.config.ui.ConfigScreenList.LabeledEntry; -import com.simibubi.create.foundation.config.ui.entries.BooleanEntry; -import com.simibubi.create.foundation.config.ui.entries.EnumEntry; -import com.simibubi.create.foundation.config.ui.entries.NumberEntry; -import com.simibubi.create.foundation.config.ui.entries.SubMenuEntry; -import com.simibubi.create.foundation.config.ui.entries.ValueEntry; -import com.simibubi.create.foundation.gui.AllIcons; -import com.simibubi.create.foundation.networking.AllPackets; - -import net.createmod.catnip.gui.ConfirmationScreen; -import net.createmod.catnip.gui.ConfirmationScreen.Response; -import net.createmod.catnip.gui.ScreenOpener; -import net.createmod.catnip.gui.UIRenderHelper; -import net.createmod.catnip.gui.element.DelegatedStencilElement; -import net.createmod.catnip.gui.widget.BoxWidget; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.FontHelper; -import net.createmod.catnip.utility.Pair; -import net.createmod.catnip.utility.theme.Color; -import net.createmod.catnip.utility.theme.Theme; -import net.minecraft.ChatFormatting; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.components.events.GuiEventListener; -import net.minecraft.client.gui.screens.Screen; -import net.minecraft.network.chat.FormattedText; -import net.minecraft.network.chat.TextComponent; -import net.minecraftforge.common.ForgeConfigSpec; -import net.minecraftforge.fml.config.ModConfig; - -public class SubMenuConfigScreen extends ConfigScreen { - - public final ModConfig.Type type; - protected ForgeConfigSpec spec; - protected UnmodifiableConfig configGroup; - protected ConfigScreenList list; - - protected BoxWidget resetAll; - protected BoxWidget saveChanges; - protected BoxWidget discardChanges; - protected BoxWidget goBack; - protected BoxWidget serverLocked; - protected HintableTextFieldWidget search; - protected int listWidth; - protected String title; - protected Set highlights = new HashSet<>(); - - public static SubMenuConfigScreen find(ConfigHelper.ConfigPath path) { - // TODO 1.17: can be null - ForgeConfigSpec spec = ConfigHelper.findForgeConfigSpecFor(path.getType(), path.getModID()); - UnmodifiableConfig values = spec.getValues(); - BaseConfigScreen base = new BaseConfigScreen(null, path.getModID()); - SubMenuConfigScreen screen = new SubMenuConfigScreen(base, "root", path.getType(), spec, values); - List remainingPath = Lists.newArrayList(path.getPath()); - - path: while (!remainingPath.isEmpty()) { - String next = remainingPath.remove(0); - for (Map.Entry entry : values.valueMap().entrySet()) { - String key = entry.getKey(); - Object obj = entry.getValue(); - if (!key.equalsIgnoreCase(next)) - continue; - - if (!(obj instanceof AbstractConfig)) { - //highlight entry - screen.highlights.add(path.getPath()[path.getPath().length - 1]); - continue; - } - - values = (UnmodifiableConfig) obj; - screen = new SubMenuConfigScreen(screen, toHumanReadable(key), path.getType(), spec, values); - continue path; - } - - break; - } - - ConfigScreen.modID = path.getModID(); - return screen; - } - - public SubMenuConfigScreen(Screen parent, String title, ModConfig.Type type, ForgeConfigSpec configSpec, UnmodifiableConfig configGroup) { - super(parent); - this.type = type; - this.spec = configSpec; - this.title = title; - this.configGroup = configGroup; - } - - public SubMenuConfigScreen(Screen parent, ModConfig.Type type, ForgeConfigSpec configSpec) { - super(parent); - this.type = type; - this.spec = configSpec; - this.title = "root"; - this.configGroup = configSpec.getValues(); - } - - protected void clearChanges() { - ConfigHelper.changes.clear(); - list.children() - .stream() - .filter(e -> e instanceof ValueEntry) - .forEach(e -> ((ValueEntry) e).onValueChange()); - } - - protected void saveChanges() { - UnmodifiableConfig values = spec.getValues(); - ConfigHelper.changes.forEach((path, change) -> { - ForgeConfigSpec.ConfigValue configValue = values.get(path); - configValue.set(change.value); - - if (type == ModConfig.Type.SERVER) { - AllPackets.channel.sendToServer(new CConfigureConfigPacket<>(ConfigScreen.modID, path, change.value)); - } - - String command = change.annotations.get("Execute"); - if (minecraft.player != null && command != null && command.startsWith("/")) { - minecraft.player.chat(command); - //AllPackets.channel.sendToServer(new CChatMessagePacket(command)); - } - }); - clearChanges(); - } - - protected void resetConfig(UnmodifiableConfig values) { - values.valueMap().forEach((key, obj) -> { - if (obj instanceof AbstractConfig) { - resetConfig((UnmodifiableConfig) obj); - } else if (obj instanceof ForgeConfigSpec.ConfigValue) { - ForgeConfigSpec.ConfigValue configValue = (ForgeConfigSpec.ConfigValue) obj; - ForgeConfigSpec.ValueSpec valueSpec = spec.getRaw((List) configValue.getPath()); - - List comments = new ArrayList<>(); - - if (valueSpec.getComment() != null) - comments.addAll(Arrays.asList(valueSpec.getComment().split("\n"))); - - Pair> metadata = ConfigHelper.readMetadataFromComment(comments); - - ConfigHelper.setValue(String.join(".", configValue.getPath()), configValue, valueSpec.getDefault(), metadata.getSecond()); - } - }); - - list.children() - .stream() - .filter(e -> e instanceof ValueEntry) - .forEach(e -> ((ValueEntry) e).onValueChange()); - } - - @Override - protected void init() { - super.init(); - - listWidth = Math.min(width - 80, 300); - - int yCenter = height / 2; - int listL = this.width / 2 - listWidth / 2; - int listR = this.width / 2 + listWidth / 2; - - resetAll = new BoxWidget(listR + 10, yCenter - 25, 20, 20) - .withPadding(2, 2) - .withCallback((x, y) -> - new ConfirmationScreen() - .centered() - .withText(FormattedText.of("Resetting all settings of the " + type.toString() + " config. Are you sure?")) - .withAction(success -> { - if (success) - resetConfig(spec.getValues()); - }) - .open(this) - ); - - resetAll.showingElement(AllIcons.I_CONFIG_RESET.asStencil().withElementRenderer(BoxWidget.gradientFactory.apply(resetAll))); - resetAll.getToolTip().add(new TextComponent("Reset All")); - resetAll.getToolTip().addAll(FontHelper.cutStringTextComponent("Click here to reset all settings to their default value.", ChatFormatting.GRAY, ChatFormatting.GRAY)); - - saveChanges = new BoxWidget(listL - 30, yCenter - 25, 20, 20) - .withPadding(2, 2) - .withCallback((x, y) -> { - if (ConfigHelper.changes.isEmpty()) - return; - - ConfirmationScreen confirm = new ConfirmationScreen() - .centered() - .withText(FormattedText.of("Saving " + ConfigHelper.changes.size() + " changed value" + (ConfigHelper.changes.size() != 1 ? "s" : "") + "")) - .withAction(success -> { - if (success) - saveChanges(); - }); - - addAnnotationsToConfirm(confirm).open(this); - }); - saveChanges.showingElement(AllIcons.I_CONFIG_SAVE.asStencil().withElementRenderer(BoxWidget.gradientFactory.apply(saveChanges))); - saveChanges.getToolTip().add(new TextComponent("Save Changes")); - saveChanges.getToolTip().addAll(FontHelper.cutStringTextComponent("Click here to save your current changes.", ChatFormatting.GRAY, ChatFormatting.GRAY)); - - discardChanges = new BoxWidget(listL - 30, yCenter + 5, 20, 20) - .withPadding(2, 2) - .withCallback((x, y) -> { - if (ConfigHelper.changes.isEmpty()) - return; - - new ConfirmationScreen() - .centered() - .withText(FormattedText.of("Discarding " + ConfigHelper.changes.size() + " unsaved change" + (ConfigHelper.changes.size() != 1 ? "s" : "") + "")) - .withAction(success -> { - if (success) - clearChanges(); - }) - .open(this); - }); - discardChanges.showingElement(AllIcons.I_CONFIG_DISCARD.asStencil().withElementRenderer(BoxWidget.gradientFactory.apply(discardChanges))); - discardChanges.getToolTip().add(new TextComponent("Discard Changes")); - discardChanges.getToolTip().addAll(FontHelper.cutStringTextComponent("Click here to discard all the changes you made.", ChatFormatting.GRAY, ChatFormatting.GRAY)); - - goBack = new BoxWidget(listL - 30, yCenter + 65, 20, 20) - .withPadding(2, 2) - .withCallback(this::attemptBackstep); - goBack.showingElement(AllIcons.I_CONFIG_BACK.asStencil().withElementRenderer(BoxWidget.gradientFactory.apply(goBack))); - goBack.getToolTip().add(new TextComponent("Go Back")); - - addRenderableWidget(resetAll); - addRenderableWidget(saveChanges); - addRenderableWidget(discardChanges); - addRenderableWidget(goBack); - - list = new ConfigScreenList(minecraft, listWidth, height - 80, 35, height - 45, 40); - list.setLeftPos(this.width / 2 - list.getWidth() / 2); - - addRenderableWidget(list); - - search = new ConfigTextField(font, width / 2 - listWidth / 2, height - 35, listWidth, 20); - search.setResponder(this::updateFilter); - search.setHint("Search..."); - search.moveCursorToStart(); - addRenderableWidget(search); - - configGroup.valueMap().forEach((key, obj) -> { - String humanKey = toHumanReadable(key); - - if (obj instanceof AbstractConfig) { - SubMenuEntry entry = new SubMenuEntry(this, humanKey, spec, (UnmodifiableConfig) obj); - entry.path = key; - list.children().add(entry); - if (configGroup.valueMap() - .size() == 1) - ScreenOpener.open( - new SubMenuConfigScreen(parent, humanKey, type, spec, (UnmodifiableConfig) obj)); - - } else if (obj instanceof ForgeConfigSpec.ConfigValue) { - ForgeConfigSpec.ConfigValue configValue = (ForgeConfigSpec.ConfigValue) obj; - ForgeConfigSpec.ValueSpec valueSpec = spec.getRaw(configValue.getPath()); - Object value = configValue.get(); - ConfigScreenList.Entry entry = null; - - if (value instanceof Boolean) { - entry = new BooleanEntry(humanKey, (ForgeConfigSpec.ConfigValue) configValue, valueSpec); - } else if (value instanceof Enum) { - entry = new EnumEntry(humanKey, (ForgeConfigSpec.ConfigValue>) configValue, valueSpec); - } else if (value instanceof Number) { - entry = NumberEntry.create(value, humanKey, configValue, valueSpec); - } - - if (entry == null) - entry = new LabeledEntry("Impl missing - " + configValue.get().getClass().getSimpleName() + " " + humanKey + " : " + value); - - if (highlights.contains(key)) - entry.annotations.put("highlight", ":)"); - - list.children().add(entry); - } - }); - - Collections.sort(list.children(), - (e, e2) -> { - int group = (e2 instanceof SubMenuEntry ? 1 : 0) - (e instanceof SubMenuEntry ? 1 : 0); - if (group == 0 && e instanceof LabeledEntry && e2 instanceof LabeledEntry) { - LabeledEntry le = (LabeledEntry) e; - LabeledEntry le2 = (LabeledEntry) e2; - return le.label.getComponent() - .getString() - .compareTo(le2.label.getComponent() - .getString()); - } - return group; - }); - - list.search(highlights.stream().findFirst().orElse("")); - - //extras for server configs - if (type != ModConfig.Type.SERVER) - return; - if (minecraft.hasSingleplayerServer()) - return; - - boolean canEdit = minecraft != null && minecraft.player != null && minecraft.player.hasPermissions(2); - - Couple red = Theme.Key.BUTTON_FAIL.p(); - Couple green = Theme.Key.BUTTON_SUCCESS.p(); - - DelegatedStencilElement stencil = new DelegatedStencilElement(); - - serverLocked = new BoxWidget(listR + 10, yCenter + 5, 20, 20) - .withPadding(2, 2) - .showingElement(stencil); - - if (!canEdit) { - list.children().forEach(e -> e.setEditable(false)); - resetAll.active = false; - stencil.withStencilRenderer((ms, w, h, alpha) -> AllIcons.I_CONFIG_LOCKED.render(ms, 0, 0)); - stencil.withElementRenderer((ms, w, h, alpha) -> UIRenderHelper.angledGradient(ms, 90, 8, 0, 16, 16, red)); - serverLocked.withBorderColors(red); - serverLocked.getToolTip().add(new TextComponent("Locked").withStyle(ChatFormatting.BOLD)); - serverLocked.getToolTip().addAll(FontHelper.cutStringTextComponent("You do not have enough permissions to edit the server config. You can still look at the current values here though.", ChatFormatting.GRAY, ChatFormatting.GRAY)); - } else { - stencil.withStencilRenderer((ms, w, h, alpha) -> AllIcons.I_CONFIG_UNLOCKED.render(ms, 0, 0)); - stencil.withElementRenderer((ms, w, h, alpha) -> UIRenderHelper.angledGradient(ms, 90, 8, 0, 16, 16, green)); - serverLocked.withBorderColors(green); - serverLocked.getToolTip().add(new TextComponent("Unlocked").withStyle(ChatFormatting.BOLD)); - serverLocked.getToolTip().addAll(FontHelper.cutStringTextComponent("You have enough permissions to edit the server config. Changes you make here will be synced with the server when you save them.", ChatFormatting.GRAY, ChatFormatting.GRAY)); - } - - addRenderableWidget(serverLocked); - } - - @Override - protected void renderWindow(PoseStack ms, int mouseX, int mouseY, float partialTicks) { - super.renderWindow(ms, mouseX, mouseY, partialTicks); - - int x = width / 2; - drawCenteredString(ms, minecraft.font, ConfigScreen.modID + " > " + type.toString().toLowerCase(Locale.ROOT) + " > " + title, x, 15, Theme.Key.TEXT.i()); - } - - @Override - protected void renderWindowForeground(PoseStack ms, int mouseX, int mouseY, float partialTicks) { - super.renderWindowForeground(ms, mouseX, mouseY, partialTicks); - } - - @Override - public void resize(@Nonnull Minecraft client, int width, int height) { - double scroll = list.getScrollAmount(); - init(client, width, height); - list.setScrollAmount(scroll); - } - - @Nullable - @Override - public GuiEventListener getFocused() { - if (ConfigScreenList.currentText != null) - return ConfigScreenList.currentText; - - return super.getFocused(); - } - - @Override - public boolean keyPressed(int keyCode, int scanCode, int modifiers) { - if (super.keyPressed(keyCode, scanCode, modifiers)) - return true; - - if (Screen.hasControlDown()) { - if (keyCode == GLFW.GLFW_KEY_F) { - search.setFocus(true); - } - } - - if (keyCode == GLFW.GLFW_KEY_BACKSPACE) { - attemptBackstep(); - } - - return false; - } - - private void updateFilter(String search) { - if (list.search(search)) { - this.search.setTextColor(Theme.Key.TEXT.i()); - } else { - this.search.setTextColor(Theme.Key.BUTTON_FAIL.i()); - } - } - - private void attemptBackstep() { - if (ConfigHelper.changes.isEmpty() || !(parent instanceof BaseConfigScreen)) { - ScreenOpener.open(parent); - return; - } - - showLeavingPrompt(success -> { - if (success == Response.Cancel) - return; - if (success == Response.Confirm) - saveChanges(); - ConfigHelper.changes.clear(); - ScreenOpener.open(parent); - }); - } - - @Override - public void onClose() { - if (ConfigHelper.changes.isEmpty()) { - super.onClose(); - return; - } - - showLeavingPrompt(success -> { - if (success == Response.Cancel) - return; - if (success == Response.Confirm) - saveChanges(); - ConfigHelper.changes.clear(); - super.onClose(); - }); - } - - public void showLeavingPrompt(Consumer action) { - ConfirmationScreen screen = new ConfirmationScreen() - .centered() - .withThreeActions(action) - .addText(FormattedText.of("Leaving with " + ConfigHelper.changes.size() + " unsaved change" - + (ConfigHelper.changes.size() != 1 ? "s" : "") + " for this config")); - - addAnnotationsToConfirm(screen).open(this); - } - - private ConfirmationScreen addAnnotationsToConfirm(ConfirmationScreen screen) { - AtomicBoolean relog = new AtomicBoolean(false); - AtomicBoolean restart = new AtomicBoolean(false); - ConfigHelper.changes.values().forEach(change -> { - if (change.annotations.containsKey(ConfigAnnotations.RequiresRelog.TRUE.getName())) - relog.set(true); - - if (change.annotations.containsKey(ConfigAnnotations.RequiresRestart.CLIENT.getName())) - restart.set(true); - }); - - if (relog.get()) { - screen.addText(FormattedText.of(" ")); - screen.addText(FormattedText.of("At least one changed value will require you to relog to take full effect")); - } - - if (restart.get()) { - screen.addText(FormattedText.of(" ")); - screen.addText(FormattedText.of("At least one changed value will require you to restart your game to take full effect")); - } - - return screen; - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/entries/BooleanEntry.java b/src/main/java/com/simibubi/create/foundation/config/ui/entries/BooleanEntry.java deleted file mode 100644 index 1d617ea240..0000000000 --- a/src/main/java/com/simibubi/create/foundation/config/ui/entries/BooleanEntry.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.simibubi.create.foundation.config.ui.entries; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.foundation.gui.AllIcons; - -import net.createmod.catnip.gui.UIRenderHelper; -import net.createmod.catnip.gui.element.RenderElement; -import net.createmod.catnip.gui.widget.BoxWidget; -import net.createmod.catnip.utility.theme.Theme; -import net.minecraftforge.common.ForgeConfigSpec; - -public class BooleanEntry extends ValueEntry { - - RenderElement enabled; - RenderElement disabled; - BoxWidget button; - - public BooleanEntry(String label, ForgeConfigSpec.ConfigValue value, ForgeConfigSpec.ValueSpec spec) { - super(label, value, spec); - - enabled = AllIcons.I_CONFIRM.asStencil() - .withElementRenderer((ms, width, height, alpha) -> UIRenderHelper.angledGradient(ms, 0, 0, height / 2, height, width, Theme.Key.BUTTON_SUCCESS.p())) - .at(10, 0); - - disabled = AllIcons.I_DISABLE.asStencil() - .withElementRenderer((ms, width, height, alpha) -> UIRenderHelper.angledGradient(ms, 0, 0, height / 2, height, width, Theme.Key.BUTTON_FAIL.p())) - .at(10, 0); - - button = new BoxWidget().showingElement(enabled) - .withCallback(() -> setValue(!getValue())); - - listeners.add(button); - onReset(); - } - - @Override - protected void setEditable(boolean b) { - super.setEditable(b); - button.active = b; - } - - @Override - public void tick() { - super.tick(); - button.tick(); - } - - @Override - public void render(PoseStack ms, int index, int y, int x, int width, int height, int mouseX, int mouseY, - boolean p_230432_9_, float partialTicks) { - super.render(ms, index, y, x, width, height, mouseX, mouseY, p_230432_9_, partialTicks); - - button.x = x + width - 80 - resetWidth; - button.y = y + 10; - button.setWidth(35); - button.setHeight(height - 20); - button.render(ms, mouseX, mouseY, partialTicks); - } - - @Override - public void onValueChange(Boolean newValue) { - super.onValueChange(newValue); - button.showingElement(newValue ? enabled : disabled); - bumpCog(newValue ? 15f : -16f); - } -} diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/entries/EnumEntry.java b/src/main/java/com/simibubi/create/foundation/config/ui/entries/EnumEntry.java deleted file mode 100644 index d57f949425..0000000000 --- a/src/main/java/com/simibubi/create/foundation/config/ui/entries/EnumEntry.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.simibubi.create.foundation.config.ui.entries; - -import java.util.Locale; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.foundation.config.ui.ConfigScreen; -import com.simibubi.create.foundation.gui.AllIcons; - -import net.createmod.catnip.gui.UIRenderHelper; -import net.createmod.catnip.gui.element.BoxElement; -import net.createmod.catnip.gui.element.DelegatedStencilElement; -import net.createmod.catnip.gui.element.TextStencilElement; -import net.createmod.catnip.gui.widget.BoxWidget; -import net.createmod.catnip.utility.theme.Theme; -import net.minecraft.client.Minecraft; -import net.minecraftforge.common.ForgeConfigSpec; - -public class EnumEntry extends ValueEntry> { - - protected static final int cycleWidth = 34; - - protected TextStencilElement valueText; - protected BoxWidget cycleLeft; - protected BoxWidget cycleRight; - - public EnumEntry(String label, ForgeConfigSpec.ConfigValue> value, ForgeConfigSpec.ValueSpec spec) { - super(label, value, spec); - - valueText = new TextStencilElement(Minecraft.getInstance().font, "YEP").centered(true, true); - valueText.withElementRenderer((ms, width, height, alpha) -> UIRenderHelper.angledGradient(ms, 0, 0, height / 2, - height, width, Theme.Key.TEXT.p())); - - DelegatedStencilElement l = AllIcons.I_CONFIG_PREV.asStencil(); - cycleLeft = new BoxWidget(0, 0, cycleWidth + 8, 16) - .withCustomBackground(Theme.Key.PONDER_BACKGROUND_FLAT.c()) - .showingElement(l) - .withCallback(() -> cycleValue(-1)); - l.withElementRenderer(BoxWidget.gradientFactory.apply(cycleLeft)); - - DelegatedStencilElement r = AllIcons.I_CONFIG_NEXT.asStencil(); - cycleRight = new BoxWidget(0, 0, cycleWidth + 8, 16) - .withCustomBackground(Theme.Key.PONDER_BACKGROUND_FLAT.c()) - .showingElement(r) - .withCallback(() -> cycleValue(1)); - r.at(cycleWidth - 8, 0); - r.withElementRenderer(BoxWidget.gradientFactory.apply(cycleRight)); - - listeners.add(cycleLeft); - listeners.add(cycleRight); - - onReset(); - } - - protected void cycleValue(int direction) { - Enum e = getValue(); - Enum[] options = e.getDeclaringClass() - .getEnumConstants(); - e = options[Math.floorMod(e.ordinal() + direction, options.length)]; - setValue(e); - bumpCog(direction * 15f); - } - - @Override - protected void setEditable(boolean b) { - super.setEditable(b); - cycleLeft.active = b; - cycleLeft.animateGradientFromState(); - cycleRight.active = b; - cycleRight.animateGradientFromState(); - } - - @Override - public void tick() { - super.tick(); - cycleLeft.tick(); - cycleRight.tick(); - } - - @Override - public void render(PoseStack ms, int index, int y, int x, int width, int height, int mouseX, int mouseY, - boolean p_230432_9_, float partialTicks) { - super.render(ms, index, y, x, width, height, mouseX, mouseY, p_230432_9_, partialTicks); - - cycleLeft.x = x + getLabelWidth(width) + 4; - cycleLeft.y = y + 10; - cycleLeft.render(ms, mouseX, mouseY, partialTicks); - - valueText.at(cycleLeft.x + cycleWidth - 8, y + 10, 200) - .withBounds(width - getLabelWidth(width) - 2 * cycleWidth - resetWidth - 4, 16) - .render(ms); - - cycleRight.x = x + width - cycleWidth * 2 - resetWidth + 10; - cycleRight.y = y + 10; - cycleRight.render(ms, mouseX, mouseY, partialTicks); - - new BoxElement() - .withBackground(Theme.Key.PONDER_BACKGROUND_FLAT.c()) - .flatBorder(0x01_000000) - .withBounds(48, 6) - .at(cycleLeft.x + 22, cycleLeft.y + 5) - .render(ms); - } - - @Override - public void onValueChange(Enum newValue) { - super.onValueChange(newValue); - valueText.withText(ConfigScreen.toHumanReadable(newValue.name().toLowerCase(Locale.ROOT))); - } -} diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/entries/NumberEntry.java b/src/main/java/com/simibubi/create/foundation/config/ui/entries/NumberEntry.java deleted file mode 100644 index 656e5846a8..0000000000 --- a/src/main/java/com/simibubi/create/foundation/config/ui/entries/NumberEntry.java +++ /dev/null @@ -1,246 +0,0 @@ -package com.simibubi.create.foundation.config.ui.entries; - -import java.lang.reflect.Field; -import java.util.Locale; -import java.util.function.Function; - -import javax.annotation.Nullable; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.foundation.config.ui.ConfigTextField; - -import net.createmod.catnip.utility.theme.Theme; -import net.createmod.catnip.gui.UIRenderHelper; -import net.createmod.catnip.gui.element.TextStencilElement; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.Font; -import net.minecraft.client.gui.components.EditBox; -import net.minecraft.network.chat.TextComponent; -import net.minecraftforge.common.ForgeConfigSpec; - -public abstract class NumberEntry extends ValueEntry { - - protected int minOffset = 0, maxOffset = 0; - protected TextStencilElement minText = null, maxText = null; - protected EditBox textField; - - @Nullable - public static NumberEntry create(Object type, String label, ForgeConfigSpec.ConfigValue value, ForgeConfigSpec.ValueSpec spec) { - if (type instanceof Integer) { - return new IntegerEntry(label, (ForgeConfigSpec.ConfigValue) value, spec); - } else if (type instanceof Float) { - return new FloatEntry(label, (ForgeConfigSpec.ConfigValue) value, spec); - } else if (type instanceof Double) { - return new DoubleEntry(label, (ForgeConfigSpec.ConfigValue) value, spec); - } - - return null; - } - - public NumberEntry(String label, ForgeConfigSpec.ConfigValue value, ForgeConfigSpec.ValueSpec spec) { - super(label, value, spec); - textField = new ConfigTextField(Minecraft.getInstance().font, 0, 0, 200, 20); - if (this instanceof IntegerEntry && annotations.containsKey("IntDisplay")) { - String intDisplay = annotations.get("IntDisplay"); - int intValue = (Integer) getValue(); - String textValue; - switch (intDisplay) { - case "#": - textValue = "#" + Integer.toHexString(intValue).toUpperCase(Locale.ROOT); - break; - case "0x": - textValue = "0x" + Integer.toHexString(intValue).toUpperCase(Locale.ROOT); - break; - case "0b": - textValue = "0b" + Integer.toBinaryString(intValue); - break; - default: - textValue = String.valueOf(intValue); - } - textField.setValue(textValue); - } else { - textField.setValue(String.valueOf(getValue())); - } - textField.setTextColor(Theme.Key.TEXT.i()); - - Object range = spec.getRange(); - try { - Field minField = range.getClass().getDeclaredField("min"); - Field maxField = range.getClass().getDeclaredField("max"); - minField.setAccessible(true); - maxField.setAccessible(true); - T min = (T) minField.get(range); - T max = (T) maxField.get(range); - - Font font = Minecraft.getInstance().font; - if (min.doubleValue() > getTypeMin().doubleValue()) { - TextComponent t = new TextComponent(formatBound(min) + " < "); - minText = new TextStencilElement(font, t).centered(true, false); - minText.withElementRenderer((ms, width, height, alpha) -> UIRenderHelper.angledGradient(ms, 0 ,0, height/2, height, width, Theme.Key.TEXT_DARKER.p())); - minOffset = font.width(t); - } - if (max.doubleValue() < getTypeMax().doubleValue()) { - TextComponent t = new TextComponent(" < " + formatBound(max)); - maxText = new TextStencilElement(font, t).centered(true, false); - maxText.withElementRenderer((ms, width, height, alpha) -> UIRenderHelper.angledGradient(ms, 0 ,0, height/2, height, width, Theme.Key.TEXT_DARKER.p())); - maxOffset = font.width(t); - } - } catch (NoSuchFieldException | IllegalAccessException | ClassCastException | NullPointerException ignored) { - - } - - textField.setResponder(s -> { - try { - T number = getParser().apply(s); - if (!spec.test(number)) - throw new IllegalArgumentException(); - - textField.setTextColor(Theme.Key.TEXT.i()); - setValue(number); - - } catch (IllegalArgumentException ignored) { - textField.setTextColor(Theme.Key.BUTTON_FAIL.i()); - } - }); - - textField.moveCursorToStart(); - listeners.add(textField); - onReset(); - } - - protected String formatBound(T bound) { - String sci = String.format("%.2E", bound.doubleValue()); - String str = String.valueOf(bound); - return sci.length() < str.length() ? sci : str; - } - - protected abstract T getTypeMin(); - - protected abstract T getTypeMax(); - - protected abstract Function getParser(); - - @Override - protected void setEditable(boolean b) { - super.setEditable(b); - textField.setEditable(b); - } - - @Override - public void onValueChange(T newValue) { - super.onValueChange(newValue); - - try { - T current = getParser().apply(textField.getValue()); - if (!current.equals(newValue)) { - textField.setValue(String.valueOf(newValue)); - } - } catch (IllegalArgumentException ignored) {} - } - - @Override - public void tick() { - super.tick(); - textField.tick(); - } - - @Override - public void render(PoseStack ms, int index, int y, int x, int width, int height, int mouseX, int mouseY, boolean p_230432_9_, float partialTicks) { - super.render(ms, index, y, x, width, height, mouseX, mouseY, p_230432_9_, partialTicks); - - textField.x = x + width - 82 - resetWidth; - textField.y = y + 8; - textField.setWidth(Math.min(width - getLabelWidth(width) - resetWidth - minOffset - maxOffset, 40)); - textField.setHeight(20); - textField.render(ms, mouseX, mouseY, partialTicks); - - if (minText != null) - minText - .at(textField.x - minOffset, textField.y, 0) - .withBounds(minOffset, textField.getHeight()) - .render(ms); - - if (maxText != null) - maxText - .at(textField.x + textField.getWidth(), textField.y, 0) - .withBounds(maxOffset, textField.getHeight()) - .render(ms); - } - - public static class IntegerEntry extends NumberEntry { - - public IntegerEntry(String label, ForgeConfigSpec.ConfigValue value, ForgeConfigSpec.ValueSpec spec) { - super(label, value, spec); - } - - @Override - protected Integer getTypeMin() { - return Integer.MIN_VALUE; - } - - @Override - protected Integer getTypeMax() { - return Integer.MAX_VALUE; - } - - @Override - protected Function getParser() { - return (string) -> { - if (string.startsWith("#")) { - return Integer.parseUnsignedInt(string.substring(1), 16); - } else if (string.startsWith("0x")) { - return Integer.parseUnsignedInt(string.substring(2), 16); - } else if (string.startsWith("0b")) { - return Integer.parseUnsignedInt(string.substring(2), 2); - } else { - return Integer.parseInt(string); - } - }; - } - } - - public static class FloatEntry extends NumberEntry { - - public FloatEntry(String label, ForgeConfigSpec.ConfigValue value, ForgeConfigSpec.ValueSpec spec) { - super(label, value, spec); - } - - @Override - protected Float getTypeMin() { - return -Float.MAX_VALUE; - } - - @Override - protected Float getTypeMax() { - return Float.MAX_VALUE; - } - - @Override - protected Function getParser() { - return Float::parseFloat; - } - } - - public static class DoubleEntry extends NumberEntry { - - public DoubleEntry(String label, ForgeConfigSpec.ConfigValue value, ForgeConfigSpec.ValueSpec spec) { - super(label, value, spec); - } - - @Override - protected Double getTypeMin() { - return (double) -Float.MAX_VALUE; - } - - @Override - protected Double getTypeMax() { - return (double) Float.MAX_VALUE; - } - - @Override - protected Function getParser() { - return Double::parseDouble; - } - } -} diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/entries/SubMenuEntry.java b/src/main/java/com/simibubi/create/foundation/config/ui/entries/SubMenuEntry.java deleted file mode 100644 index c9a6c9a4c0..0000000000 --- a/src/main/java/com/simibubi/create/foundation/config/ui/entries/SubMenuEntry.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.simibubi.create.foundation.config.ui.entries; - -import com.electronwill.nightconfig.core.UnmodifiableConfig; -import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.foundation.config.ui.ConfigScreenList; -import com.simibubi.create.foundation.config.ui.SubMenuConfigScreen; -import com.simibubi.create.foundation.gui.AllIcons; - -import net.createmod.catnip.gui.ScreenOpener; -import net.createmod.catnip.gui.element.DelegatedStencilElement; -import net.createmod.catnip.gui.widget.BoxWidget; -import net.minecraftforge.common.ForgeConfigSpec; - -public class SubMenuEntry extends ConfigScreenList.LabeledEntry { - - protected BoxWidget button; - - public SubMenuEntry(SubMenuConfigScreen parent, String label, ForgeConfigSpec spec, UnmodifiableConfig config) { - super(label); - - button = new BoxWidget(0, 0, 35, 16) - .showingElement(AllIcons.I_CONFIG_OPEN.asStencil().at(10, 0)) - .withCallback(() -> ScreenOpener.open(new SubMenuConfigScreen(parent, label, parent.type, spec, config))); - button.modifyElement(e -> ((DelegatedStencilElement) e).withElementRenderer(BoxWidget.gradientFactory.apply(button))); - - listeners.add(button); - } - - @Override - public void tick() { - super.tick(); - button.tick(); - } - - @Override - public void render(PoseStack ms, int index, int y, int x, int width, int height, int mouseX, int mouseY, boolean p_230432_9_, float partialTicks) { - super.render(ms, index, y, x, width, height, mouseX, mouseY, p_230432_9_, partialTicks); - - button.x = x + width - 108; - button.y = y + 10; - button.setHeight(height - 20); - button.render(ms, mouseX, mouseY, partialTicks); - } - - @Override - protected int getLabelWidth(int totalWidth) { - return (int) (totalWidth * labelWidthMult) + 30; - } -} diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/entries/ValueEntry.java b/src/main/java/com/simibubi/create/foundation/config/ui/entries/ValueEntry.java deleted file mode 100644 index 1e1ce7418b..0000000000 --- a/src/main/java/com/simibubi/create/foundation/config/ui/entries/ValueEntry.java +++ /dev/null @@ -1,143 +0,0 @@ -package com.simibubi.create.foundation.config.ui.entries; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -import javax.annotation.Nonnull; - -import com.google.common.base.Predicates; -import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.foundation.config.ui.ConfigAnnotations; -import com.simibubi.create.foundation.config.ui.ConfigHelper; -import com.simibubi.create.foundation.config.ui.ConfigScreen; -import com.simibubi.create.foundation.config.ui.ConfigScreenList; -import com.simibubi.create.foundation.gui.AllIcons; - -import net.createmod.catnip.gui.element.DelegatedStencilElement; -import net.createmod.catnip.gui.widget.BoxWidget; -import net.createmod.catnip.utility.FontHelper; -import net.createmod.catnip.utility.Pair; -import net.minecraft.ChatFormatting; -import net.minecraft.network.chat.TextComponent; -import net.minecraftforge.common.ForgeConfigSpec; - -public class ValueEntry extends ConfigScreenList.LabeledEntry { - - protected static final int resetWidth = 28;//including 6px offset on either side - - protected ForgeConfigSpec.ConfigValue value; - protected ForgeConfigSpec.ValueSpec spec; - protected BoxWidget resetButton; - protected boolean editable = true; - - public ValueEntry(String label, ForgeConfigSpec.ConfigValue value, ForgeConfigSpec.ValueSpec spec) { - super(label); - this.value = value; - this.spec = spec; - this.path = String.join(".", value.getPath()); - - resetButton = new BoxWidget(0, 0, resetWidth - 12, 16) - .showingElement(AllIcons.I_CONFIG_RESET.asStencil()) - .withCallback(() -> { - setValue((T) spec.getDefault()); - this.onReset(); - }); - resetButton.modifyElement(e -> ((DelegatedStencilElement) e).withElementRenderer(BoxWidget.gradientFactory.apply(resetButton))); - - listeners.add(resetButton); - - List path = value.getPath(); - labelTooltip.add(new TextComponent(label).withStyle(ChatFormatting.WHITE)); - String comment = spec.getComment(); - if (comment == null || comment.isEmpty()) - return; - - List commentLines = new ArrayList<>(Arrays.asList(comment.split("\n"))); - - - Pair> metadata = ConfigHelper.readMetadataFromComment(commentLines); - if (metadata.getFirst() != null) { - unit = metadata.getFirst(); - } - if (metadata.getSecond() != null && !metadata.getSecond().isEmpty()) { - annotations.putAll(metadata.getSecond()); - } - // add comment to tooltip - labelTooltip.addAll(commentLines.stream() - .filter(Predicates.not(s -> s.startsWith("Range"))) - .map(TextComponent::new) - .flatMap(stc -> FontHelper.cutTextComponent(stc, ChatFormatting.GRAY, ChatFormatting.GRAY) - .stream()) - .collect(Collectors.toList())); - - if (annotations.containsKey(ConfigAnnotations.RequiresRelog.TRUE.getName())) - labelTooltip.addAll(FontHelper.cutTextComponent(new TextComponent("Changing this value will require a _relog_ to take full effect"), ChatFormatting.GRAY, ChatFormatting.GOLD)); - - if (annotations.containsKey(ConfigAnnotations.RequiresRestart.CLIENT.getName())) - labelTooltip.addAll(FontHelper.cutTextComponent(new TextComponent("Changing this value will require a _restart_ to take full effect"), ChatFormatting.GRAY, ChatFormatting.RED)); - - labelTooltip.add(new TextComponent(ConfigScreen.modID + ":" + path.get(path.size() - 1)).withStyle(ChatFormatting.DARK_GRAY)); - } - - @Override - protected void setEditable(boolean b) { - editable = b; - resetButton.active = editable && !isCurrentValueDefault(); - resetButton.animateGradientFromState(); - } - - @Override - public void tick() { - super.tick(); - resetButton.tick(); - } - - @Override - public void render(PoseStack ms, int index, int y, int x, int width, int height, int mouseX, int mouseY, boolean p_230432_9_, float partialTicks) { - super.render(ms, index, y, x, width, height, mouseX, mouseY, p_230432_9_, partialTicks); - - resetButton.x = x + width - resetWidth + 6; - resetButton.y = y + 10; - resetButton.render(ms, mouseX, mouseY, partialTicks); - } - - @Override - protected int getLabelWidth(int totalWidth) { - return (int) (totalWidth * labelWidthMult) + 30; - } - - public void setValue(@Nonnull T value) { - ConfigHelper.setValue(path, this.value, value, annotations); - onValueChange(value); - } - - @Nonnull - public T getValue() { - return ConfigHelper.getValue(path, this.value); - } - - protected boolean isCurrentValueDefault() { - return spec.getDefault().equals(getValue()); - } - - public void onReset() { - onValueChange(getValue()); - } - - public void onValueChange() { - onValueChange(getValue()); - } - public void onValueChange(T newValue) { - resetButton.active = editable && !isCurrentValueDefault(); - resetButton.animateGradientFromState(); - } - - protected void bumpCog() {bumpCog(10f);} - protected void bumpCog(float force) { - if (list != null && list instanceof ConfigScreenList) - ((ConfigScreenList) list).bumpCog(force); - } -} diff --git a/src/main/java/com/simibubi/create/foundation/gui/CreateMainMenuScreen.java b/src/main/java/com/simibubi/create/foundation/gui/CreateMainMenuScreen.java index 0b18b11ea9..4596abcfab 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/CreateMainMenuScreen.java +++ b/src/main/java/com/simibubi/create/foundation/gui/CreateMainMenuScreen.java @@ -6,9 +6,9 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllBlocks; import com.simibubi.create.Create; -import com.simibubi.create.foundation.config.ui.BaseConfigScreen; import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.config.ui.BaseConfigScreen; import net.createmod.catnip.gui.AbstractSimiScreen; import net.createmod.catnip.gui.ScreenOpener; import net.createmod.catnip.gui.element.BoxElement; @@ -147,7 +147,7 @@ public class CreateMainMenuScreen extends AbstractSimiScreen { addRenderableWidget( new Button(center - 100, yStart + 92, bLongWidth, bHeight, CreateLang.translateDirect("menu.return"), $ -> linkTo(parent))); addRenderableWidget(new Button(center - 100, yStart + 24 + -16, bLongWidth, bHeight, CreateLang.translateDirect("menu.configure"), - $ -> linkTo(BaseConfigScreen.forCreate(this)))); + $ -> linkTo(new BaseConfigScreen(this, Create.ID)))); gettingStarted = new Button(center + 2, yStart + 48 + -16, bShortWidth, bHeight, CreateLang.translateDirect("menu.ponder_index"), $ -> linkTo(new PonderTagIndexScreen())); diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/OpenCreateMenuButton.java b/src/main/java/com/simibubi/create/foundation/gui/widget/OpenCreateMenuButton.java similarity index 98% rename from src/main/java/com/simibubi/create/foundation/config/ui/OpenCreateMenuButton.java rename to src/main/java/com/simibubi/create/foundation/gui/widget/OpenCreateMenuButton.java index 52d2914e10..718d3889ef 100644 --- a/src/main/java/com/simibubi/create/foundation/config/ui/OpenCreateMenuButton.java +++ b/src/main/java/com/simibubi/create/foundation/gui/widget/OpenCreateMenuButton.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.config.ui; +package com.simibubi.create.foundation.gui.widget; import java.util.Arrays; import java.util.List; @@ -10,8 +10,8 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllItems; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.gui.CreateMainMenuScreen; -import net.createmod.catnip.gui.ScreenOpener; +import net.createmod.catnip.gui.ScreenOpener; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.components.Button; diff --git a/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java b/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java index a87c02ef66..96871fa544 100644 --- a/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java +++ b/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java @@ -75,8 +75,7 @@ import com.simibubi.create.content.schematics.packet.SchematicPlacePacket; import com.simibubi.create.content.schematics.packet.SchematicSyncPacket; import com.simibubi.create.content.schematics.packet.SchematicUploadPacket; import com.simibubi.create.foundation.command.HighlightPacket; -import com.simibubi.create.foundation.command.SConfigureConfigPacket; -import com.simibubi.create.foundation.config.ui.CConfigureConfigPacket; +import com.simibubi.create.foundation.command.SimpleCreateActions; import com.simibubi.create.foundation.gui.container.ClearContainerPacket; import com.simibubi.create.foundation.gui.container.GhostItemSubmitPacket; import com.simibubi.create.foundation.tileEntity.RemoveTileEntityPacket; @@ -84,6 +83,7 @@ import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringCo import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollValueUpdatePacket; import com.simibubi.create.foundation.utility.ServerSpeedProvider; +import net.createmod.catnip.net.ClientboundSimpleActionPacket; import net.minecraft.core.BlockPos; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; @@ -123,7 +123,7 @@ public enum AllPackets { LINKED_CONTROLLER_BIND(LinkedControllerBindPacket.class, LinkedControllerBindPacket::new, PLAY_TO_SERVER), LINKED_CONTROLLER_USE_LECTERN(LinkedControllerStopLecternPacket.class, LinkedControllerStopLecternPacket::new, PLAY_TO_SERVER), - C_CONFIGURE_CONFIG(CConfigureConfigPacket.class, CConfigureConfigPacket::new, PLAY_TO_SERVER), + //C_CONFIGURE_CONFIG(CConfigureConfigPacket.class, CConfigureConfigPacket::new, PLAY_TO_SERVER), SUBMIT_GHOST_ITEM(GhostItemSubmitPacket.class, GhostItemSubmitPacket::new, PLAY_TO_SERVER), BLUEPRINT_COMPLETE_RECIPE(BlueprintAssignCompleteRecipePacket.class, BlueprintAssignCompleteRecipePacket::new, PLAY_TO_SERVER), @@ -153,7 +153,7 @@ public enum AllPackets { SYMMETRY_EFFECT(SymmetryEffectPacket.class, SymmetryEffectPacket::new, PLAY_TO_CLIENT), SERVER_SPEED(ServerSpeedProvider.Packet.class, ServerSpeedProvider.Packet::new, PLAY_TO_CLIENT), BEAM_EFFECT(ZapperBeamPacket.class, ZapperBeamPacket::new, PLAY_TO_CLIENT), - S_CONFIGURE_CONFIG(SConfigureConfigPacket.class, SConfigureConfigPacket::new, PLAY_TO_CLIENT), + //S_CONFIGURE_CONFIG(SConfigureConfigPacket.class, SConfigureConfigPacket::new, PLAY_TO_CLIENT), CONTRAPTION_STALL(ContraptionStallPacket.class, ContraptionStallPacket::new, PLAY_TO_CLIENT), CONTRAPTION_DISASSEMBLE(ContraptionDisassemblyPacket.class, ContraptionDisassemblyPacket::new, PLAY_TO_CLIENT), CONTRAPTION_BLOCK_CHANGED(ContraptionBlockChangedPacket.class, ContraptionBlockChangedPacket::new, PLAY_TO_CLIENT), @@ -192,6 +192,18 @@ public enum AllPackets { public static final String NETWORK_VERSION_STR = String.valueOf(NETWORK_VERSION); public static SimpleChannel channel; + static { + ClientboundSimpleActionPacket.addAction("rainbowDebug", () -> SimpleCreateActions::rainbowDebug); + ClientboundSimpleActionPacket.addAction("overlayReset", () -> SimpleCreateActions::overlayReset); + ClientboundSimpleActionPacket.addAction("overlayScreen", () -> SimpleCreateActions::overlayScreen); + ClientboundSimpleActionPacket.addAction("experimentalLighting", () -> SimpleCreateActions::experimentalLighting); + ClientboundSimpleActionPacket.addAction("fabulousWarning", () -> SimpleCreateActions::fabulousWarning); + ClientboundSimpleActionPacket.addAction("zoomMultiplier", () -> SimpleCreateActions::zoomMultiplier); + ClientboundSimpleActionPacket.addAction("camAngleYawTarget", () -> value -> SimpleCreateActions.camAngleTarget(value, true)); + ClientboundSimpleActionPacket.addAction("camAnglePitchTarget", () -> value -> SimpleCreateActions.camAngleTarget(value, false)); + ClientboundSimpleActionPacket.addAction("camAngleFunction", () -> SimpleCreateActions::camAngleFunction); + } + private LoadedPacket packet; AllPackets(Class type, Function factory, diff --git a/src/main/java/com/simibubi/create/foundation/ponder/CreatePonderIndex.java b/src/main/java/com/simibubi/create/foundation/ponder/CreatePonderIndex.java index bddb277f23..1ab368509a 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/CreatePonderIndex.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/CreatePonderIndex.java @@ -1,8 +1,12 @@ package com.simibubi.create.foundation.ponder; +import java.util.List; +import java.util.function.Predicate; + import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.Create; +import com.simibubi.create.content.contraptions.components.crank.ValveHandleBlock; import com.simibubi.create.foundation.ponder.content.ArmScenes; import com.simibubi.create.foundation.ponder.content.BearingScenes; import com.simibubi.create.foundation.ponder.content.BeltScenes; @@ -45,15 +49,28 @@ import com.tterrag.registrate.util.entry.ItemProviderEntry; import com.tterrag.registrate.util.entry.RegistryEntry; import net.createmod.ponder.foundation.CustomPonderRegistrationHelper; -import net.createmod.ponder.foundation.content.DebugScenes; +import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.DyeColor; +import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; public class CreatePonderIndex { private static final CustomPonderRegistrationHelper> HELPER = new CustomPonderRegistrationHelper<>(Create.ID, RegistryEntry::getId); - public static final boolean REGISTER_DEBUG_SCENES = false; + public static final List> INDEX_SCREEN_EXCLUSIONS = List.of( + itemLike -> { + if (!(itemLike instanceof BlockItem blockItem)) + return false; + + Block block = blockItem.getBlock(); + if (!(block instanceof ValveHandleBlock)) + return false; + + return !AllBlocks.COPPER_VALVE_HANDLE.is(block); + } + ); public static void register() { // Register storyboards here @@ -364,10 +381,6 @@ public class CreatePonderIndex { .addStoryBoard("steam_whistle", SteamScenes::whistle); HELPER.forComponents(AllBlocks.STEAM_ENGINE) .addStoryBoard("steam_engine", SteamScenes::engine); - - // Debug scenes, can be found in game via the Brass Hand - if (REGISTER_DEBUG_SCENES) - DebugScenes.registerAll(); } public static void registerTags() { // Add items to tags here diff --git a/src/main/java/com/simibubi/create/foundation/ponder/CreatePonderPlugin.java b/src/main/java/com/simibubi/create/foundation/ponder/CreatePonderPlugin.java new file mode 100644 index 0000000000..fce55e4fe5 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/CreatePonderPlugin.java @@ -0,0 +1,31 @@ +package com.simibubi.create.foundation.ponder; + +import java.util.function.Predicate; +import java.util.stream.Stream; + +import net.createmod.ponder.foundation.PonderPlugin; +import net.createmod.ponder.foundation.PonderWorld; +import net.minecraft.world.level.ItemLike; + +public class CreatePonderPlugin implements PonderPlugin { + + @Override + public void registerScenes() { + CreatePonderIndex.register(); + } + + @Override + public void registerTags() { + CreatePonderIndex.registerTags(); + } + + @Override + public void onPonderWorldRestore(PonderWorld world) { + PonderWorldTileFix.fixControllerTiles(world); + } + + @Override + public Stream> indexExclusions() { + return CreatePonderIndex.INDEX_SCREEN_EXCLUSIONS.stream(); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/ItemVaultScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/ItemVaultScenes.java index 0b9bc199ec..2905adbf11 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/ItemVaultScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/ItemVaultScenes.java @@ -1,10 +1,10 @@ package com.simibubi.create.foundation.ponder.content; import com.simibubi.create.AllItems; -import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.enums.PonderGuiTextures; import net.createmod.ponder.foundation.ElementLink; import net.createmod.ponder.foundation.PonderPalette; import net.createmod.ponder.foundation.SceneBuilder; @@ -62,7 +62,7 @@ public class ItemVaultScenes { ItemStack hand = AllItems.BRASS_HAND.asStack(); scene.overlay .showControls(new InputWindowElement(util.vector.blockSurface(frontVault, Direction.NORTH), Pointing.RIGHT) - .showing(AllIcons.I_MTD_CLOSE) + .showing(PonderGuiTextures.ICON_PONDER_CLOSE) .withItem(hand), 40); scene.idle(7); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/FluidTankScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/FluidTankScenes.java index 783c53c3f2..efd8da6232 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/FluidTankScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/FluidTankScenes.java @@ -12,11 +12,11 @@ import com.simibubi.create.content.contraptions.fluids.tank.FluidTankBlock; import com.simibubi.create.content.contraptions.fluids.tank.FluidTankTileEntity; import com.simibubi.create.content.logistics.block.redstone.NixieTubeTileEntity; import com.simibubi.create.foundation.fluid.FluidHelper; -import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; import net.createmod.catnip.utility.VecHelper; +import net.createmod.ponder.enums.PonderGuiTextures; import net.createmod.ponder.foundation.ElementLink; import net.createmod.ponder.foundation.PonderPalette; import net.createmod.ponder.foundation.SceneBuilder; @@ -162,7 +162,7 @@ public class FluidTankScenes { ItemStack bucket = new ItemStack(Items.BUCKET, 1); scene.overlay.showControls( new InputWindowElement(util.vector.blockSurface(util.grid.at(2, 2, 2), Direction.NORTH), Pointing.RIGHT) - .showing(AllIcons.I_MTD_CLOSE) + .showing(PonderGuiTextures.ICON_PONDER_CLOSE) .withItem(bucket), 40); scene.idle(7); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/SpoutScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/SpoutScenes.java index 62afd29357..a820c562c3 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/SpoutScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/fluid/SpoutScenes.java @@ -5,12 +5,12 @@ import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.fluids.FluidFX; import com.simibubi.create.content.contraptions.fluids.actors.SpoutTileEntity; import com.simibubi.create.foundation.fluid.FluidHelper; -import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import com.simibubi.create.foundation.ponder.element.BeltItemElement; import net.createmod.catnip.utility.Pointing; import net.createmod.catnip.utility.VecHelper; +import net.createmod.ponder.enums.PonderGuiTextures; import net.createmod.ponder.foundation.ElementLink; import net.createmod.ponder.foundation.PonderPalette; import net.createmod.ponder.foundation.SceneBuilder; @@ -74,7 +74,7 @@ public class SpoutScenes { .getBucket(honey); scene.overlay.showControls( new InputWindowElement(util.vector.blockSurface(util.grid.at(2, 3, 2), Direction.NORTH), Pointing.RIGHT) - .showing(AllIcons.I_MTD_CLOSE) + .showing(PonderGuiTextures.ICON_PONDER_CLOSE) .withItem(bucket), 40); scene.idle(7); diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index b543a5b53c..33ad6cbc2a 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -1,4 +1,3 @@ -public net.minecraft.client.Minecraft f_91013_ # pausePartialTick public net.minecraft.client.gui.Font m_92863_(Lnet/minecraft/resources/ResourceLocation;)Lnet/minecraft/client/gui/font/FontSet; # getFontSet public net.minecraft.client.gui.screens.TitleScreen f_96729_ # panorama public net.minecraft.client.multiplayer.ClientPacketListener f_104897_ # serverChunkRadius @@ -7,8 +6,6 @@ public net.minecraft.client.renderer.ItemInHandRenderer f_109300_ # mainHandItem public net.minecraft.client.renderer.ItemInHandRenderer f_109301_ # offHandItem public net.minecraft.client.renderer.entity.ItemRenderer f_115096_ # textureManager -public-f net.minecraft.network.protocol.game.ClientboundPlayerAbilitiesPacket f_132663_ # flyingSpeed - public net.minecraft.server.MinecraftServer f_129744_ # storageSource public net.minecraft.server.network.ServerGamePacketListenerImpl f_9737_ # aboveGroundTickCount @@ -40,4 +37,4 @@ public net.minecraft.client.model.AgeableListModel f_102011_ # babyBodyScale public net.minecraft.client.model.AgeableListModel f_102012_ # bodyYOffset public net.minecraft.client.gui.components.CommandSuggestions f_93866_ # suggestions -public net.minecraft.client.gui.components.CommandSuggestions$SuggestionsList (Lnet/minecraft/client/gui/components/CommandSuggestions;IIILjava/util/List;Z)V # \ No newline at end of file +public net.minecraft.client.gui.components.CommandSuggestions$SuggestionsList (Lnet/minecraft/client/gui/components/CommandSuggestions;IIILjava/util/List;Z)V # From 63979193a9574d6276fb03895f29eb443f874834 Mon Sep 17 00:00:00 2001 From: zelophed Date: Fri, 2 Sep 2022 21:29:44 +0200 Subject: [PATCH 003/515] Queen Maeve(n) - include ponder and catnip dependencies from createmod maven when not building in multimod workspace --- build.gradle | 11 +++++++---- gradle.properties | 2 ++ 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index e4c8bba13a..c7718175a5 100644 --- a/build.gradle +++ b/build.gradle @@ -206,6 +206,11 @@ repositories { //location of the maven for curios api url = "https://maven.theillusivec4.top/" } + maven { + // Location of the maven for Ponder, Catnip + name 'createmod maven' + url 'https://maven.createmod.net' + } } configurations { @@ -229,16 +234,14 @@ dependencies { implementation project(":catnip:Common") implementation project(":catnip:Forge") } else { - //todo - throw new AssertionError() + implementation fg.deobf("net.createmod.catnip:Catnip-Forge-${minecraft_version}:${catnip_version}") } if (ponderInWorkspace) { implementation project(":Ponder:Common") implementation project(":Ponder:Forge") } else { - //todo - throw new AssertionError() + implementation fg.deobf("net.createmod.ponder:Ponder-Forge-${minecraft_version}:${ponder_version}") } compileOnly fg.deobf("mezz.jei:jei-${jei_minecraft_version}:${jei_version}:api") diff --git a/gradle.properties b/gradle.properties index 4848de8108..e10fc3e226 100644 --- a/gradle.properties +++ b/gradle.properties @@ -24,6 +24,8 @@ jei_minecraft_version = 1.18.2 jei_version = 9.5.3.143 curios_minecraft_version = 1.18.2 curios_version = 5.0.7.0 +catnip_version = 0.5.0 +ponder_version = 0.5.0 # curseforge information projectId = 328085 From b2fe04a3c87fb3c39a6d369d00916ad1566777aa Mon Sep 17 00:00:00 2001 From: zelophed Date: Mon, 19 Sep 2022 12:57:31 +0200 Subject: [PATCH 004/515] Pondering Alone, Part III - move SuperByteBuffer and its caching to catnip - move sprite shifter to catnip - no longer use StitchedSprites for (ct) sprite shifts - fix ponder fluid rendering by using SBB for WorldSectionElement again - allow catnip-forge to load without being present on the server --- .../com/simibubi/create/AllSpriteShifts.java | 4 +- .../com/simibubi/create/CreateClient.java | 21 ++-- .../animations/AnimatedBlazeBurner.java | 6 +- .../content/contraptions/KineticDebugger.java | 4 +- .../base/KineticTileEntityRenderer.java | 10 +- .../contraptions/base/flwdata/BeltData.java | 2 +- .../components/actors/DrillRenderer.java | 32 ++--- .../components/actors/HarvesterRenderer.java | 8 +- .../PortableStorageInterfaceRenderer.java | 16 +-- .../components/clock/CuckooClockRenderer.java | 16 +-- .../crafter/MechanicalCrafterRenderer.java | 8 +- .../components/crank/HandCrankRenderer.java | 6 +- .../components/deployer/DeployerRenderer.java | 15 +-- .../components/fan/EncasedFanRenderer.java | 8 +- .../components/fan/NozzleTileEntity.java | 2 +- .../components/flywheel/FlywheelRenderer.java | 6 +- .../millstone/MillstoneRenderer.java | 6 +- .../mixer/MechanicalMixerRenderer.java | 10 +- .../motor/CreativeMotorRenderer.java | 6 +- .../press/MechanicalPressRenderer.java | 6 +- .../components/saw/SawRenderer.java | 30 +++-- .../components/steam/SteamEngineRenderer.java | 15 +-- .../steam/whistle/WhistleRenderer.java | 8 +- .../bearing/BearingInstance.java | 4 +- .../bearing/BearingRenderer.java | 10 +- .../StabilizedBearingMovementBehaviour.java | 11 +- .../chassis/StickerRenderer.java | 25 ++-- .../gantry/GantryCarriageRenderer.java | 16 ++- .../controls/ControlsRenderer.java | 12 +- .../pulley/AbstractPulleyRenderer.java | 10 +- .../pulley/PulleyRenderer.java | 12 +- .../render/ContraptionInstanceManager.java | 2 - .../render/ContraptionRenderDispatcher.java | 5 +- .../render/FlwContraption.java | 2 +- .../render/SBBContraptionManager.java | 19 +-- .../train/CouplingHandler.java | 4 +- .../train/CouplingHandlerClient.java | 2 +- .../train/CouplingPhysics.java | 2 +- .../train/CouplingRenderer.java | 10 +- .../contraptions/fluids/OpenEndedPipe.java | 2 +- .../contraptions/fluids/PumpRenderer.java | 17 +-- .../fluids/actors/HosePulleyRenderer.java | 8 +- .../fluids/actors/SpoutRenderer.java | 4 +- .../fluids/particle/BasinFluidParticle.java | 2 +- .../fluids/pipes/AxisPipeBlock.java | 2 +- .../fluids/pipes/FluidValveInstance.java | 4 +- .../fluids/pipes/FluidValveRenderer.java | 27 ++-- .../fluids/pipes/FluidValveTileEntity.java | 2 +- .../fluids/pipes/SmartFluidPipeBlock.java | 2 +- .../pipes/SmartFluidPipeTileEntity.java | 4 +- .../fluids/tank/FluidTankRenderer.java | 16 +-- .../contraptions/processing/BasinRecipe.java | 2 +- .../processing/BasinRenderer.java | 6 +- .../processing/BasinTileEntity.java | 2 +- .../burner/BlazeBurnerRenderer.java | 26 ++-- .../advanced/SpeedControllerRenderer.java | 9 +- .../contraptions/relays/belt/BeltBlock.java | 2 +- .../relays/belt/BeltInstance.java | 2 +- .../contraptions/relays/belt/BeltModel.java | 2 +- .../relays/belt/BeltRenderer.java | 10 +- .../relays/belt/item/BeltConnectorItem.java | 2 +- .../BracketedKineticBlockModel.java | 6 +- .../BracketedKineticTileRenderer.java | 8 +- .../relays/encased/EncasedCogRenderer.java | 8 +- .../relays/encased/SplitShaftRenderer.java | 6 +- .../relays/gauge/GaugeRenderer.java | 8 +- .../relays/gearbox/GearboxRenderer.java | 6 +- .../wrench/WrenchItemRenderer.java | 2 +- .../curiosities/NoGravMagicalDohickyItem.java | 1 - .../armor/CopperBacktankArmorLayer.java | 43 ++++--- .../armor/CopperBacktankRenderer.java | 16 ++- .../armor/CopperBacktankTileEntity.java | 2 +- .../curiosities/bell/BellRenderer.java | 8 +- .../curiosities/bell/SoulPulseEffect.java | 2 +- .../deco/SlidingDoorMovementBehaviour.java | 2 +- .../curiosities/deco/SlidingDoorRenderer.java | 6 +- .../deco/SlidingDoorTileEntity.java | 2 +- .../curiosities/toolbox/ToolboxRenderer.java | 21 ++-- .../curiosities/tools/BlueprintRenderer.java | 28 +++-- .../curiosities/zapper/ZapperItem.java | 2 +- .../WorldshaperItemRenderer.java | 2 +- .../terrainzapper/WorldshaperScreen.java | 2 +- .../belts/tunnel/BeltTunnelRenderer.java | 6 +- .../SmartChuteFilterSlotPositioning.java | 4 +- .../block/depot/EjectorRenderer.java | 12 +- .../block/diodes/BrassDiodeRenderer.java | 6 +- .../block/display/DisplayLinkRenderer.java | 18 +-- .../block/funnel/FunnelRenderer.java | 6 +- .../block/mechanicalArm/ArmRenderer.java | 18 +-- .../block/mechanicalArm/ArmTileEntity.java | 7 +- .../block/redstone/AnalogLeverRenderer.java | 8 +- .../block/redstone/NixieTubeBlock.java | 2 +- .../block/redstone/NixieTubeRenderer.java | 53 ++++---- .../block/redstone/NixieTubeTileEntity.java | 2 +- .../item/filter/AttributeFilterContainer.java | 2 +- .../item/filter/AttributeFilterScreen.java | 2 +- .../trains/entity/ArrivalSoundQueue.java | 2 +- .../entity/CarriageCouplingRenderer.java | 21 ++-- .../logistics/trains/entity/Navigation.java | 2 +- .../display/FlapDisplayRenderer.java | 6 +- .../edgePoint/TrackTargetingBehaviour.java | 4 +- .../edgePoint/signal/SignalEdgeGroup.java | 2 +- .../edgePoint/signal/SignalPropagator.java | 1 + .../edgePoint/signal/SignalRenderer.java | 8 +- .../edgePoint/signal/SignalTileEntity.java | 2 +- .../edgePoint/station/StationRenderer.java | 27 ++-- .../schedule/TrainHatArmorLayer.java | 8 +- .../trains/track/StandardBogeyBlock.java | 36 +++--- .../logistics/trains/track/TrackRenderer.java | 24 ++-- .../block/SchematicannonRenderer.java | 8 +- .../schematics/client/SchematicRenderer.java | 5 +- .../block/connected/CTSpriteShiftEntry.java | 6 +- .../block/connected/CTSpriteShifter.java | 13 +- .../block/render/SpriteShiftEntry.java | 50 -------- .../block/render/SpriteShifter.java | 23 ---- .../command/ClearBufferCacheCommand.java | 2 + .../render/BakedModelRenderHelper.java | 29 ----- ...ufferer.java => CachedPartialBuffers.java} | 31 ++--- .../render/FlwSuperBufferFactory.java | 28 +++++ ...yteBuffer.java => FlwSuperByteBuffer.java} | 119 +++++++++--------- .../render/SuperByteBufferCache.java | 54 -------- .../render/TileEntityRenderHelper.java | 2 +- .../ColoredOverlayTileEntityRenderer.java | 2 +- 123 files changed, 652 insertions(+), 734 deletions(-) delete mode 100644 src/main/java/com/simibubi/create/foundation/block/render/SpriteShiftEntry.java delete mode 100644 src/main/java/com/simibubi/create/foundation/block/render/SpriteShifter.java delete mode 100644 src/main/java/com/simibubi/create/foundation/render/BakedModelRenderHelper.java rename src/main/java/com/simibubi/create/foundation/render/{CachedBufferer.java => CachedPartialBuffers.java} (69%) create mode 100644 src/main/java/com/simibubi/create/foundation/render/FlwSuperBufferFactory.java rename src/main/java/com/simibubi/create/foundation/render/{SuperByteBuffer.java => FlwSuperByteBuffer.java} (79%) delete mode 100644 src/main/java/com/simibubi/create/foundation/render/SuperByteBufferCache.java diff --git a/src/main/java/com/simibubi/create/AllSpriteShifts.java b/src/main/java/com/simibubi/create/AllSpriteShifts.java index 2e33669c38..e5eb174c3e 100644 --- a/src/main/java/com/simibubi/create/AllSpriteShifts.java +++ b/src/main/java/com/simibubi/create/AllSpriteShifts.java @@ -9,9 +9,9 @@ import com.simibubi.create.foundation.block.connected.AllCTTypes; import com.simibubi.create.foundation.block.connected.CTSpriteShiftEntry; import com.simibubi.create.foundation.block.connected.CTSpriteShifter; import com.simibubi.create.foundation.block.connected.CTType; -import com.simibubi.create.foundation.block.render.SpriteShiftEntry; -import com.simibubi.create.foundation.block.render.SpriteShifter; +import net.createmod.catnip.render.SpriteShiftEntry; +import net.createmod.catnip.render.SpriteShifter; import net.createmod.catnip.utility.Couple; import net.minecraft.world.item.DyeColor; import net.minecraft.world.level.block.state.properties.WoodType; diff --git a/src/main/java/com/simibubi/create/CreateClient.java b/src/main/java/com/simibubi/create/CreateClient.java index fa3bcdd026..61e4cc77ef 100644 --- a/src/main/java/com/simibubi/create/CreateClient.java +++ b/src/main/java/com/simibubi/create/CreateClient.java @@ -22,12 +22,14 @@ import com.simibubi.create.foundation.ClientResourceReloadListener; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.ponder.CreatePonderPlugin; import com.simibubi.create.foundation.ponder.CreateSharedPonderText; -import com.simibubi.create.foundation.render.CachedBufferer; +import com.simibubi.create.foundation.render.CachedPartialBuffers; import com.simibubi.create.foundation.render.CreateContexts; -import com.simibubi.create.foundation.render.SuperByteBufferCache; +import com.simibubi.create.foundation.render.FlwSuperBufferFactory; import com.simibubi.create.foundation.utility.ModelSwapper; import com.simibubi.create.foundation.utility.ShippedResourcePacks; +import net.createmod.catnip.render.SuperBufferFactory; +import net.createmod.catnip.render.SuperByteBufferCache; import net.createmod.ponder.foundation.PonderIndex; import net.minecraft.ChatFormatting; import net.minecraft.client.GraphicsStatus; @@ -45,8 +47,6 @@ import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; public class CreateClient { - public static final SuperByteBufferCache BUFFER_CACHE = new SuperByteBufferCache(); - //public static final Outliner OUTLINER = new Outliner(); public static final ModelSwapper MODEL_SWAPPER = new ModelSwapper(); public static final CasingConnectivity CASING_CONNECTIVITY = new CasingConnectivity(); @@ -77,11 +77,12 @@ public class CreateClient { } public static void clientInit(final FMLClientSetupEvent event) { - BUFFER_CACHE.registerCompartment(CachedBufferer.GENERIC_TILE); - BUFFER_CACHE.registerCompartment(CachedBufferer.PARTIAL); - BUFFER_CACHE.registerCompartment(CachedBufferer.DIRECTIONAL_PARTIAL); - BUFFER_CACHE.registerCompartment(KineticTileEntityRenderer.KINETIC_TILE); - BUFFER_CACHE.registerCompartment(SBBContraptionManager.CONTRAPTION, 20); + SuperBufferFactory.setInstance(new FlwSuperBufferFactory()); + + SuperByteBufferCache.getInstance().registerCompartment(CachedPartialBuffers.PARTIAL); + SuperByteBufferCache.getInstance().registerCompartment(CachedPartialBuffers.DIRECTIONAL_PARTIAL); + SuperByteBufferCache.getInstance().registerCompartment(KineticTileEntityRenderer.KINETIC_TILE); + SuperByteBufferCache.getInstance().registerCompartment(SBBContraptionManager.CONTRAPTION, 20); ShippedResourcePacks.extractFiles("Copper Legacy Pack"); @@ -107,8 +108,6 @@ public class CreateClient { } public static void invalidateRenderers() { - BUFFER_CACHE.invalidate(); - SCHEMATIC_HANDLER.updateRenderers(); ContraptionRenderDispatcher.reset(); } diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedBlazeBurner.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedBlazeBurner.java index d34187d97e..04ce87abfb 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedBlazeBurner.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedBlazeBurner.java @@ -8,9 +8,9 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllSpriteShifts; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock.HeatLevel; -import com.simibubi.create.foundation.block.render.SpriteShiftEntry; -import com.simibubi.create.foundation.render.CachedBufferer; +import com.simibubi.create.foundation.render.CachedPartialBuffers; +import net.createmod.catnip.render.SpriteShiftEntry; import net.createmod.catnip.utility.AnimationTickHolder; import net.createmod.ponder.utility.WorldTickHolder; import net.minecraft.client.Minecraft; @@ -87,7 +87,7 @@ public class AnimatedBlazeBurner extends AnimatedKinetics { MultiBufferSource.BufferSource buffer = mc.renderBuffers() .bufferSource(); VertexConsumer vb = buffer.getBuffer(RenderType.cutoutMipped()); - CachedBufferer.partial(AllBlockPartials.BLAZE_BURNER_FLAME, Blocks.AIR.defaultBlockState()) + CachedPartialBuffers.partial(AllBlockPartials.BLAZE_BURNER_FLAME, Blocks.AIR.defaultBlockState()) .shiftUVScrolling(spriteShift, (float) uScroll, (float) vScroll) .light(LightTexture.FULL_BRIGHT) .renderInto(matrixStack, vb); diff --git a/src/main/java/com/simibubi/create/content/contraptions/KineticDebugger.java b/src/main/java/com/simibubi/create/content/contraptions/KineticDebugger.java index 2fc6a546e4..53e03fd017 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/KineticDebugger.java +++ b/src/main/java/com/simibubi/create/content/contraptions/KineticDebugger.java @@ -1,12 +1,12 @@ package com.simibubi.create.content.contraptions; -import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.config.AllConfigs; import net.createmod.catnip.CatnipClient; +import net.createmod.catnip.render.SuperByteBufferCache; import net.createmod.catnip.utility.VecHelper; import net.createmod.catnip.utility.theme.Color; import net.minecraft.client.Minecraft; @@ -29,7 +29,7 @@ public class KineticDebugger { if (!isActive()) { if (KineticTileEntityRenderer.rainbowMode) { KineticTileEntityRenderer.rainbowMode = false; - CreateClient.BUFFER_CACHE.invalidate(); + SuperByteBufferCache.getInstance().invalidate(); } return; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java index 4b3b17bba2..82b52ccf95 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java @@ -8,11 +8,11 @@ import com.mojang.blaze3d.vertex.VertexConsumer; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.KineticDebugger; import com.simibubi.create.content.contraptions.relays.elementary.ICogWheel; -import com.simibubi.create.foundation.render.CachedBufferer; -import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.render.SuperByteBufferCache; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; +import net.createmod.catnip.render.CachedBlockBuffers; +import net.createmod.catnip.render.SuperByteBuffer; +import net.createmod.catnip.render.SuperByteBufferCache; import net.createmod.catnip.utility.theme.Color; import net.createmod.ponder.utility.WorldTickHolder; import net.minecraft.client.renderer.ItemBlockRenderTypes; @@ -62,12 +62,12 @@ public class KineticTileEntityRenderer extends SafeTileEntityRenderer { + superByteBuffer + .transform(matrices.getModel()) + .centre() + .rotateY(AngleHelper.horizontalAngle(facing)) + .rotateX(AngleHelper.verticalAngle(facing)) + .rotateZ(angle) + .unCentre() + .light(matrices.getWorld(), + ContraptionRenderDispatcher.getContraptionWorldLight(context, renderWorld)) + .renderInto(matrices.getViewProjection(), buffer.getBuffer(RenderType.solid())); + }); + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java index 6cdd17929c..09125719d5 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java @@ -8,10 +8,10 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionMatrices; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; -import com.simibubi.create.foundation.render.CachedBufferer; -import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.CachedPartialBuffers; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; +import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.VecHelper; import net.createmod.catnip.utility.math.AngleHelper; import net.createmod.ponder.utility.WorldTickHolder; @@ -33,7 +33,7 @@ public class HarvesterRenderer extends SafeTileEntityRenderer drawCallback) { - SuperByteBuffer middle = CachedBufferer.partial(getMiddleForState(blockState, lit), blockState); - SuperByteBuffer top = CachedBufferer.partial(getTopForState(blockState), blockState); + SuperByteBuffer middle = CachedPartialBuffers.partial(getMiddleForState(blockState, lit), blockState); + SuperByteBuffer top = CachedPartialBuffers.partial(getTopForState(blockState), blockState); if (local != null) { middle.transform(local); @@ -80,10 +80,10 @@ public class PortableStorageInterfaceRenderer extends SafeTileEntityRenderer BlockState blockState = te.getBlockState(); Vec3 offset = getHandOffset(te, partialTicks, blockState); - SuperByteBuffer pole = CachedBufferer.partial(AllBlockPartials.DEPLOYER_POLE, blockState); - SuperByteBuffer hand = CachedBufferer.partial(te.getHandPose(), blockState); + SuperByteBuffer pole = CachedPartialBuffers.partial(AllBlockPartials.DEPLOYER_POLE, blockState); + SuperByteBuffer hand = CachedPartialBuffers.partial(te.getHandPose(), blockState); transform(pole.translate(offset.x, offset.y, offset.z), blockState, true) .light(light) @@ -167,9 +168,9 @@ public class DeployerRenderer extends SafeTileEntityRenderer if (context.contraption.stalled) speed = 0; - SuperByteBuffer shaft = CachedBufferer.block(AllBlocks.SHAFT.getDefaultState()); - SuperByteBuffer pole = CachedBufferer.partial(AllBlockPartials.DEPLOYER_POLE, blockState); - SuperByteBuffer hand = CachedBufferer.partial(handPose, blockState); + SuperByteBuffer shaft = CachedBlockBuffers.block(AllBlocks.SHAFT.getDefaultState()); + SuperByteBuffer pole = CachedPartialBuffers.partial(AllBlockPartials.DEPLOYER_POLE, blockState); + SuperByteBuffer hand = CachedPartialBuffers.partial(handPose, blockState); double factor; if (context.contraption.stalled || context.position == null || context.data.contains("StationaryTimer")) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java index 7c7b54f446..136ea476fb 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java @@ -8,9 +8,9 @@ import com.mojang.blaze3d.vertex.VertexConsumer; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.render.CachedBufferer; -import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.CachedPartialBuffers; +import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.ponder.utility.WorldTickHolder; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.MultiBufferSource; @@ -38,9 +38,9 @@ public class EncasedFanRenderer extends KineticTileEntityRenderer { int lightInFront = LevelRenderer.getLightColor(te.getLevel(), te.getBlockPos().relative(direction)); SuperByteBuffer shaftHalf = - CachedBufferer.partialFacing(AllBlockPartials.SHAFT_HALF, te.getBlockState(), direction.getOpposite()); + CachedPartialBuffers.partialFacing(AllBlockPartials.SHAFT_HALF, te.getBlockState(), direction.getOpposite()); SuperByteBuffer fanInner = - CachedBufferer.partialFacing(AllBlockPartials.ENCASED_FAN_INNER, te.getBlockState(), direction.getOpposite()); + CachedPartialBuffers.partialFacing(AllBlockPartials.ENCASED_FAN_INNER, te.getBlockState(), direction.getOpposite()); float time = WorldTickHolder.getRenderTime(te.getLevel()); float speed = te.getSpeed() * 5; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/NozzleTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/NozzleTileEntity.java index 504b3376ff..5f8da35166 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/NozzleTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/NozzleTileEntity.java @@ -7,8 +7,8 @@ import java.util.List; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java index 4e46948ffc..b3a40ddae1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java @@ -5,9 +5,9 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.render.CachedBufferer; -import com.simibubi.create.foundation.render.SuperByteBuffer; +import net.createmod.catnip.render.CachedBlockBuffers; +import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; @@ -40,7 +40,7 @@ public class FlywheelRenderer extends KineticTileEntityRenderer { private void renderFlywheel(KineticTileEntity te, PoseStack ms, int light, BlockState blockState, float angle, VertexConsumer vb) { - SuperByteBuffer wheel = CachedBufferer.block(blockState); + SuperByteBuffer wheel = CachedBlockBuffers.block(blockState); kineticRotationTransform(wheel, te, getRotationAxisOf(te), AngleHelper.rad(angle), light); wheel.renderInto(ms, vb); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneRenderer.java index 0dfd15517a..3f6ab496f2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillstoneRenderer.java @@ -3,9 +3,9 @@ package com.simibubi.create.content.contraptions.components.millstone; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.render.CachedBufferer; -import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.CachedPartialBuffers; +import net.createmod.catnip.render.SuperByteBuffer; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.minecraft.world.level.block.state.BlockState; @@ -17,7 +17,7 @@ public class MillstoneRenderer extends KineticTileEntityRenderer { @Override protected SuperByteBuffer getRotatedModel(KineticTileEntity te, BlockState state) { - return CachedBufferer.partial(AllBlockPartials.MILLSTONE_COG, state); + return CachedPartialBuffers.partial(AllBlockPartials.MILLSTONE_COG, state); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java index 1d57368401..b3882edde4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java @@ -6,9 +6,9 @@ import com.mojang.blaze3d.vertex.VertexConsumer; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.render.CachedBufferer; -import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.CachedPartialBuffers; +import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.ponder.utility.WorldTickHolder; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; @@ -38,7 +38,7 @@ public class MechanicalMixerRenderer extends KineticTileEntityRenderer { VertexConsumer vb = buffer.getBuffer(RenderType.solid()); - SuperByteBuffer superBuffer = CachedBufferer.partial(AllBlockPartials.SHAFTLESS_COGWHEEL, blockState); + SuperByteBuffer superBuffer = CachedPartialBuffers.partial(AllBlockPartials.SHAFTLESS_COGWHEEL, blockState); standardKineticRotationTransform(superBuffer, te, light).renderInto(ms, vb); float renderedHeadOffset = mixer.getRenderedHeadOffset(partialTicks); @@ -46,12 +46,12 @@ public class MechanicalMixerRenderer extends KineticTileEntityRenderer { float time = WorldTickHolder.getRenderTime(te.getLevel()); float angle = ((time * speed * 6 / 10f) % 360) / 180 * (float) Math.PI; - SuperByteBuffer poleRender = CachedBufferer.partial(AllBlockPartials.MECHANICAL_MIXER_POLE, blockState); + SuperByteBuffer poleRender = CachedPartialBuffers.partial(AllBlockPartials.MECHANICAL_MIXER_POLE, blockState); poleRender.translate(0, -renderedHeadOffset, 0) .light(light) .renderInto(ms, vb); - SuperByteBuffer headRender = CachedBufferer.partial(AllBlockPartials.MECHANICAL_MIXER_HEAD, blockState); + SuperByteBuffer headRender = CachedPartialBuffers.partial(AllBlockPartials.MECHANICAL_MIXER_HEAD, blockState); headRender.rotateCentered(Direction.UP, angle) .translate(0, -renderedHeadOffset, 0) .light(light) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorRenderer.java index 6885a9ea88..68ab979ee8 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/motor/CreativeMotorRenderer.java @@ -3,9 +3,9 @@ package com.simibubi.create.content.contraptions.components.motor; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.render.CachedBufferer; -import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.CachedPartialBuffers; +import net.createmod.catnip.render.SuperByteBuffer; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.minecraft.world.level.block.state.BlockState; @@ -17,7 +17,7 @@ public class CreativeMotorRenderer extends KineticTileEntityRenderer { @Override protected SuperByteBuffer getRotatedModel(KineticTileEntity te, BlockState state) { - return CachedBufferer.partialFacing(AllBlockPartials.SHAFT_HALF, state); + return CachedPartialBuffers.partialFacing(AllBlockPartials.SHAFT_HALF, state); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressRenderer.java index 44302ce7cd..2911b6193a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressRenderer.java @@ -7,9 +7,9 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.render.CachedBufferer; -import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.CachedPartialBuffers; +import net.createmod.catnip.render.SuperByteBuffer; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; @@ -39,7 +39,7 @@ public class MechanicalPressRenderer extends KineticTileEntityRenderer { float renderedHeadOffset = pressingBehaviour.getRenderedHeadOffset(partialTicks) * pressingBehaviour.mode.headOffset; - SuperByteBuffer headRender = CachedBufferer.partialFacing(AllBlockPartials.MECHANICAL_PRESS_HEAD, blockState, + SuperByteBuffer headRender = CachedPartialBuffers.partialFacing(AllBlockPartials.MECHANICAL_PRESS_HEAD, blockState, blockState.getValue(HORIZONTAL_FACING)); headRender.translate(0, -renderedHeadOffset, 0) .light(light) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java index e2877c068a..871a60fa2f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java @@ -2,6 +2,8 @@ package com.simibubi.create.content.contraptions.components.saw; import static net.minecraft.world.level.block.state.properties.BlockStateProperties.FACING; +import java.util.Optional; + import com.jozufozu.flywheel.backend.Backend; import com.jozufozu.flywheel.core.PartialModel; import com.jozufozu.flywheel.core.virtual.VirtualRenderWorld; @@ -13,11 +15,13 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionMatrices; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; -import com.simibubi.create.foundation.render.CachedBufferer; -import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.CachedPartialBuffers; +import com.simibubi.create.foundation.render.FlwSuperByteBuffer; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringRenderer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; +import net.createmod.catnip.render.CachedBlockBuffers; +import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.VecHelper; import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.Minecraft; @@ -79,7 +83,7 @@ public class SawRenderer extends SafeTileEntityRenderer { rotate = true; } - SuperByteBuffer superBuffer = CachedBufferer.partialFacing(partial, blockState); + SuperByteBuffer superBuffer = CachedPartialBuffers.partialFacing(partial, blockState); if (rotate) { superBuffer.rotateCentered(Direction.UP, AngleHelper.rad(90)); } @@ -147,9 +151,9 @@ public class SawRenderer extends SafeTileEntityRenderer { if (state.getValue(FACING) .getAxis() .isHorizontal()) - return CachedBufferer.partialFacing(AllBlockPartials.SHAFT_HALF, + return CachedPartialBuffers.partialFacing(AllBlockPartials.SHAFT_HALF, state.rotate(te.getLevel(), te.getBlockPos(), Rotation.CLOCKWISE_180)); - return CachedBufferer.block(KineticTileEntityRenderer.KINETIC_TILE, + return CachedBlockBuffers.block(KineticTileEntityRenderer.KINETIC_TILE, getRenderedBlockState(te)); } @@ -175,19 +179,25 @@ public class SawRenderer extends SafeTileEntityRenderer { boolean shouldAnimate = (context.contraption.stalled && horizontal) || (!context.contraption.stalled && !backwards && moving); - SuperByteBuffer superBuffer; + SuperByteBuffer sBuffer; if (SawBlock.isHorizontal(state)) { if (shouldAnimate) - superBuffer = CachedBufferer.partial(AllBlockPartials.SAW_BLADE_HORIZONTAL_ACTIVE, state); + sBuffer = CachedPartialBuffers.partial(AllBlockPartials.SAW_BLADE_HORIZONTAL_ACTIVE, state); else - superBuffer = CachedBufferer.partial(AllBlockPartials.SAW_BLADE_HORIZONTAL_INACTIVE, state); + sBuffer = CachedPartialBuffers.partial(AllBlockPartials.SAW_BLADE_HORIZONTAL_INACTIVE, state); } else { if (shouldAnimate) - superBuffer = CachedBufferer.partial(AllBlockPartials.SAW_BLADE_VERTICAL_ACTIVE, state); + sBuffer = CachedPartialBuffers.partial(AllBlockPartials.SAW_BLADE_VERTICAL_ACTIVE, state); else - superBuffer = CachedBufferer.partial(AllBlockPartials.SAW_BLADE_VERTICAL_INACTIVE, state); + sBuffer = CachedPartialBuffers.partial(AllBlockPartials.SAW_BLADE_VERTICAL_INACTIVE, state); } + Optional optional = FlwSuperByteBuffer.cast(sBuffer); + if (optional.isEmpty()) + return; + + FlwSuperByteBuffer superBuffer = optional.get(); + superBuffer.transform(matrices.getModel()) .centre() .rotateY(AngleHelper.horizontalAngle(facing)) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/steam/SteamEngineRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/steam/SteamEngineRenderer.java index 723736f522..e50c2bad0a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/steam/SteamEngineRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/steam/SteamEngineRenderer.java @@ -5,8 +5,8 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.render.CachedBufferer; -import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.CachedPartialBuffers; +import com.simibubi.create.foundation.render.FlwSuperByteBuffer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import net.createmod.catnip.utility.math.AngleHelper; @@ -71,11 +71,12 @@ public class SteamEngineRenderer extends SafeTileEntityRenderer { offset -= Math.sin(wiggleProgress * (2 * Mth.PI) * (4 - size.ordinal())) / 16f; } - CachedBufferer.partial(mouth, blockState) - .centre() - .rotateY(AngleHelper.horizontalAngle(direction)) - .unCentre() + CachedPartialBuffers.partial(mouth, blockState) + .rotateCentered(Direction.Axis.Y, Mth.DEG_TO_RAD * AngleHelper.horizontalAngle(direction)) .translate(0, offset * 4 / 16f, 0) .light(light) .renderInto(ms, buffer.getBuffer(RenderType.solid())); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingInstance.java index 46f0405b05..78af1e8c82 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingInstance.java @@ -9,9 +9,9 @@ import com.mojang.math.Vector3f; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.BackHalfShaftInstance; import com.simibubi.create.content.contraptions.base.KineticTileEntity; -import net.createmod.catnip.utility.math.AngleHelper; -import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.core.Direction; import net.minecraft.world.level.block.state.properties.BlockStateProperties; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java index 715ae5c0c9..f73161d229 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java @@ -6,10 +6,10 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.render.CachedBufferer; -import com.simibubi.create.foundation.render.SuperByteBuffer; -import net.createmod.catnip.utility.math.AngleHelper; +import com.simibubi.create.foundation.render.CachedPartialBuffers; +import net.createmod.catnip.render.SuperByteBuffer; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; @@ -36,7 +36,7 @@ public class BearingRenderer extends KineticTileEntityRenderer { .getValue(BlockStateProperties.FACING); PartialModel top = bearingTe.isWoodenTop() ? AllBlockPartials.BEARING_TOP_WOODEN : AllBlockPartials.BEARING_TOP; - SuperByteBuffer superBuffer = CachedBufferer.partial(top, te.getBlockState()); + SuperByteBuffer superBuffer = CachedPartialBuffers.partial(top, te.getBlockState()); float interpolatedAngle = bearingTe.getInterpolatedAngle(partialTicks - 1); kineticRotationTransform(superBuffer, te, facing.getAxis(), (float) (interpolatedAngle / 180 * Math.PI), light); @@ -51,7 +51,7 @@ public class BearingRenderer extends KineticTileEntityRenderer { @Override protected SuperByteBuffer getRotatedModel(KineticTileEntity te, BlockState state) { - return CachedBufferer.partialFacing(AllBlockPartials.SHAFT_HALF, state, state + return CachedPartialBuffers.partialFacing(AllBlockPartials.SHAFT_HALF, state, state .getValue(BearingBlock.FACING) .getOpposite()); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingMovementBehaviour.java index 4185af03d9..d17ce71e0c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/StabilizedBearingMovementBehaviour.java @@ -15,9 +15,10 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Ori import com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionMatrices; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; -import com.simibubi.create.foundation.render.CachedBufferer; -import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.CachedPartialBuffers; +import com.simibubi.create.foundation.render.FlwSuperByteBuffer; +import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.AnimationTickHolder; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; @@ -38,7 +39,7 @@ public class StabilizedBearingMovementBehaviour implements MovementBehaviour { Direction facing = context.state.getValue(BlockStateProperties.FACING); PartialModel top = AllBlockPartials.BEARING_TOP; - SuperByteBuffer superBuffer = CachedBufferer.partial(top, context.state); + SuperByteBuffer superBuffer = CachedPartialBuffers.partial(top, context.state); float renderPartialTicks = AnimationTickHolder.getPartialTicks(); // rotate to match blockstate @@ -53,10 +54,8 @@ public class StabilizedBearingMovementBehaviour implements MovementBehaviour { rotation.mul(orientation); - orientation = rotation; - superBuffer.transform(matrices.getModel()); - superBuffer.rotateCentered(orientation); + FlwSuperByteBuffer.cast(superBuffer).ifPresent(flwBuffer -> flwBuffer.rotateCentered(rotation)); // render superBuffer diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerRenderer.java index d33f73eab3..c9fdfad4cc 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerRenderer.java @@ -3,10 +3,11 @@ package com.simibubi.create.content.contraptions.components.structureMovement.ch import com.jozufozu.flywheel.backend.Backend; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllBlockPartials; -import com.simibubi.create.foundation.render.CachedBufferer; -import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.CachedPartialBuffers; +import com.simibubi.create.foundation.render.FlwSuperByteBuffer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; +import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.math.AngleHelper; import net.createmod.ponder.utility.WorldTickHolder; import net.minecraft.client.Minecraft; @@ -28,19 +29,23 @@ public class StickerRenderer extends SafeTileEntityRenderer { if (Backend.canUseInstancing(te.getLevel())) return; BlockState state = te.getBlockState(); - SuperByteBuffer head = CachedBufferer.partial(AllBlockPartials.STICKER_HEAD, state); - float offset = te.piston.getValue(WorldTickHolder.getPartialTicks(te.getLevel())); + SuperByteBuffer head = CachedPartialBuffers.partial(AllBlockPartials.STICKER_HEAD, state); + float offset; if (te.getLevel() != Minecraft.getInstance().level && !te.isVirtual()) offset = state.getValue(StickerBlock.EXTENDED) ? 1 : 0; + else + offset = te.piston.getValue(WorldTickHolder.getPartialTicks(te.getLevel())); Direction facing = state.getValue(StickerBlock.FACING); - head.nudge(te.hashCode()) - .centre() - .rotateY(AngleHelper.horizontalAngle(facing)) - .rotateX(AngleHelper.verticalAngle(facing) + 90) - .unCentre() - .translate(0, (offset * offset) * 4 / 16f, 0); + FlwSuperByteBuffer.cast(head).ifPresent(flwBuffer -> flwBuffer + .nudge(te.hashCode()) + .centre() + .rotateY(AngleHelper.horizontalAngle(facing)) + .rotateX(AngleHelper.verticalAngle(facing) + 90) + .unCentre() + .translate(0, (offset * offset) * 4 / 16f, 0)); + head.light(light) .renderInto(ms, buffer.getBuffer(RenderType.solid())); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageRenderer.java index b2e52eb9f5..9f7900b5bf 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageRenderer.java @@ -5,9 +5,10 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.render.CachedBufferer; -import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.CachedPartialBuffers; +import com.simibubi.create.foundation.render.FlwSuperByteBuffer; +import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.Iterate; import net.createmod.catnip.utility.math.AngleHelper; import net.createmod.ponder.utility.WorldTickHolder; @@ -54,15 +55,18 @@ public class GantryCarriageRenderer extends KineticTileEntityRenderer { if (facing == Direction.NORTH || facing == Direction.EAST) angleForTe *= -1; - SuperByteBuffer cogs = CachedBufferer.partial(AllBlockPartials.GANTRY_COGS, state); - cogs.centre() + SuperByteBuffer cogs = CachedPartialBuffers.partial(AllBlockPartials.GANTRY_COGS, state); + float finalAngleForTe = angleForTe; + FlwSuperByteBuffer.cast(cogs).ifPresent(flwBuffer -> flwBuffer + .centre() .rotateY(AngleHelper.horizontalAngle(facing)) .rotateX(facing == Direction.UP ? 0 : facing == Direction.DOWN ? 180 : 90) .rotateY(alongFirst ^ facing.getAxis() == Axis.X ? 0 : 90) .translate(0, -9 / 16f, 0) - .rotateX(-angleForTe) + .rotateX(-finalAngleForTe) .translate(0, 9 / 16f, 0) - .unCentre(); + .unCentre() + ); cogs.light(light) .renderInto(ms, buffer.getBuffer(RenderType.solid())); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/interaction/controls/ControlsRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/interaction/controls/ControlsRenderer.java index a18d92934b..67deebf708 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/interaction/controls/ControlsRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/interaction/controls/ControlsRenderer.java @@ -7,9 +7,9 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionMatrices; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; -import com.simibubi.create.foundation.render.CachedBufferer; -import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.CachedPartialBuffers; +import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.Iterate; import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.renderer.MultiBufferSource; @@ -25,13 +25,11 @@ public class ControlsRenderer { BlockState state = context.state; Direction facing = state.getValue(ControlsBlock.FACING); - SuperByteBuffer cover = CachedBufferer.partial(AllBlockPartials.TRAIN_CONTROLS_COVER, state); + SuperByteBuffer cover = CachedPartialBuffers.partial(AllBlockPartials.TRAIN_CONTROLS_COVER, state); float hAngle = 180 + AngleHelper.horizontalAngle(facing); PoseStack ms = matrices.getModel(); cover.transform(ms) - .centre() - .rotateY(hAngle) - .unCentre() + .rotateCentered(Direction.Axis.Y, Mth.DEG_TO_RAD * hAngle) .light(matrices.getWorld(), ContraptionRenderDispatcher.getContraptionWorldLight(context, renderWorld)) .renderInto(matrices.getViewProjection(), buffer.getBuffer(RenderType.cutoutMipped())); @@ -39,7 +37,7 @@ public class ControlsRenderer { for (boolean first : Iterate.trueAndFalse) { float vAngle = (float) Mth.clamp(first ? firstLever * 70 - 25 : secondLever * 15, -45, 45); - SuperByteBuffer lever = CachedBufferer.partial(AllBlockPartials.TRAIN_CONTROLS_LEVER, state); + SuperByteBuffer lever = CachedPartialBuffers.partial(AllBlockPartials.TRAIN_CONTROLS_LEVER, state); ms.pushPose(); TransformStack.cast(ms) .centre() diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/AbstractPulleyRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/AbstractPulleyRenderer.java index 1feb2bef14..52eaaa7294 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/AbstractPulleyRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/AbstractPulleyRenderer.java @@ -7,9 +7,9 @@ import com.mojang.blaze3d.vertex.VertexConsumer; import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.render.CachedBufferer; -import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.CachedPartialBuffers; +import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.MultiBufferSource; @@ -60,8 +60,8 @@ public abstract class AbstractPulleyRenderer extends KineticTileEntityRenderer { BlockState blockState = te.getBlockState(); BlockPos pos = te.getBlockPos(); - SuperByteBuffer halfMagnet = CachedBufferer.partial(this.halfMagnet, blockState); - SuperByteBuffer halfRope = CachedBufferer.partial(this.halfRope, blockState); + SuperByteBuffer halfMagnet = CachedPartialBuffers.partial(this.halfMagnet, blockState); + SuperByteBuffer halfRope = CachedPartialBuffers.partial(this.halfRope, blockState); SuperByteBuffer magnet = renderMagnet(te); SuperByteBuffer rope = renderRope(te); @@ -108,7 +108,7 @@ public abstract class AbstractPulleyRenderer extends KineticTileEntityRenderer { protected SuperByteBuffer getRotatedCoil(KineticTileEntity te) { BlockState blockState = te.getBlockState(); - return CachedBufferer.partialFacing(getCoil(), blockState, + return CachedPartialBuffers.partialFacing(getCoil(), blockState, Direction.get(AxisDirection.POSITIVE, getShaftAxis(te))); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyRenderer.java index ce547d0790..0948d02278 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyRenderer.java @@ -5,9 +5,9 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity; -import com.simibubi.create.foundation.render.CachedBufferer; -import com.simibubi.create.foundation.render.SuperByteBuffer; +import net.createmod.catnip.render.CachedBlockBuffers; +import net.createmod.catnip.render.SuperByteBuffer; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.minecraft.core.Direction.Axis; import net.minecraft.util.Mth; @@ -31,12 +31,12 @@ public class PulleyRenderer extends AbstractPulleyRenderer { @Override protected SuperByteBuffer renderRope(KineticTileEntity te) { - return CachedBufferer.block(AllBlocks.ROPE.getDefaultState()); + return CachedBlockBuffers.block(AllBlocks.ROPE.getDefaultState()); } @Override protected SuperByteBuffer renderMagnet(KineticTileEntity te) { - return CachedBufferer.block(AllBlocks.PULLEY_MAGNET.getDefaultState()); + return CachedBlockBuffers.block(AllBlocks.PULLEY_MAGNET.getDefaultState()); } @Override @@ -63,10 +63,10 @@ public class PulleyRenderer extends AbstractPulleyRenderer { return offset; } - + @Override public int getViewDistance() { return 128; } - + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionInstanceManager.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionInstanceManager.java index df1ed3059f..e235053032 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionInstanceManager.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionInstanceManager.java @@ -8,8 +8,6 @@ import org.apache.commons.lang3.tuple.Pair; import com.jozufozu.flywheel.api.MaterialManager; import com.jozufozu.flywheel.api.instance.DynamicInstance; -import com.jozufozu.flywheel.api.instance.TickableInstance; -import com.jozufozu.flywheel.backend.instancing.AbstractInstance; import com.jozufozu.flywheel.backend.instancing.TaskEngine; import com.jozufozu.flywheel.backend.instancing.blockentity.BlockEntityInstanceManager; import com.jozufozu.flywheel.core.virtual.VirtualRenderWorld; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderDispatcher.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderDispatcher.java index c6c5e30cf9..e34a04dd5a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderDispatcher.java @@ -23,9 +23,10 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Con import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionWorld; import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; -import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.FlwSuperByteBuffer; import com.simibubi.create.foundation.render.TileEntityRenderHelper; +import net.createmod.catnip.render.SuperByteBuffer; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.LightTexture; @@ -175,7 +176,7 @@ public class ContraptionRenderDispatcher { .withBlocks(values) .withModelData(c.modelData) .build(); - return new SuperByteBuffer(builder); + return new FlwSuperByteBuffer(builder); } public static int getLight(Level world, float lx, float ly, float lz) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/FlwContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/FlwContraption.java index 2f04034a55..bc07e08e06 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/FlwContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/FlwContraption.java @@ -23,8 +23,8 @@ import com.mojang.math.Matrix4f; import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; import com.simibubi.create.foundation.render.CreateContexts; -import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.AnimationTickHolder; import net.minecraft.client.renderer.RenderType; import net.minecraft.util.Mth; import net.minecraft.world.level.Level; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/SBBContraptionManager.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/SBBContraptionManager.java index 0cbfdcdf06..94c33da0de 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/SBBContraptionManager.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/SBBContraptionManager.java @@ -3,11 +3,10 @@ package com.simibubi.create.content.contraptions.components.structureMovement.re import com.jozufozu.flywheel.core.virtual.VirtualRenderWorld; import com.jozufozu.flywheel.event.RenderLayerEvent; import com.mojang.blaze3d.vertex.VertexConsumer; -import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; -import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.render.SuperByteBufferCache; +import com.simibubi.create.foundation.render.FlwSuperByteBuffer; +import net.createmod.catnip.render.SuperByteBufferCache; import net.createmod.catnip.utility.Pair; import net.minecraft.client.renderer.RenderType; import net.minecraft.world.level.LevelAccessor; @@ -33,7 +32,7 @@ public class SBBContraptionManager extends ContraptionRenderingWorld ContraptionRenderDispatcher.buildStructureBuffer(renderInfo.renderWorld, renderInfo.contraption, layer)); + FlwSuperByteBuffer.cast( + SuperByteBufferCache.getInstance().get(CONTRAPTION, Pair.of(renderInfo.contraption, layer), () -> ContraptionRenderDispatcher.buildStructureBuffer(renderInfo.renderWorld, renderInfo.contraption, layer)) + ).ifPresent(superBuffer -> { + if (superBuffer.isEmpty()) + return; - if (!contraptionBuffer.isEmpty()) { ContraptionMatrices matrices = renderInfo.getMatrices(); - contraptionBuffer.transform(matrices.getModel()) + superBuffer.transform(matrices.getModel()) .light(matrices.getWorld()) .hybridLight() .renderInto(matrices.getViewProjection(), consumer); - } - + }); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingHandler.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingHandler.java index 21a0a8d22f..5dc6aab805 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingHandler.java @@ -12,10 +12,10 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Abs import com.simibubi.create.content.contraptions.components.structureMovement.train.capability.CapabilityMinecartController; import com.simibubi.create.content.contraptions.components.structureMovement.train.capability.MinecartController; import com.simibubi.create.foundation.config.AllConfigs; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.Iterate; import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.Iterate; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingHandlerClient.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingHandlerClient.java index 4fe1a74beb..ddbe3ad137 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingHandlerClient.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingHandlerClient.java @@ -5,8 +5,8 @@ import java.util.Random; import com.mojang.math.Vector3f; import com.simibubi.create.AllItems; import com.simibubi.create.foundation.networking.AllPackets; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.player.LocalPlayer; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingPhysics.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingPhysics.java index b158459c1a..d73bb7605f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingPhysics.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingPhysics.java @@ -1,10 +1,10 @@ package com.simibubi.create.content.contraptions.components.structureMovement.train; import com.simibubi.create.content.contraptions.components.structureMovement.train.capability.MinecartController; + import net.createmod.catnip.utility.Couple; import net.createmod.catnip.utility.Iterate; import net.createmod.catnip.utility.VecHelper; - import net.minecraft.core.BlockPos; import net.minecraft.tags.BlockTags; import net.minecraft.util.Mth; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingRenderer.java index ed79cd25f2..f34f3c7369 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/CouplingRenderer.java @@ -9,10 +9,10 @@ import com.mojang.math.Vector3f; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.KineticDebugger; import com.simibubi.create.content.contraptions.components.structureMovement.train.capability.MinecartController; -import com.simibubi.create.foundation.render.CachedBufferer; -import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.CachedPartialBuffers; import net.createmod.catnip.CatnipClient; +import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.AnimationTickHolder; import net.createmod.catnip.utility.Couple; import net.createmod.catnip.utility.VecHelper; @@ -66,9 +66,9 @@ public class CouplingRenderer { BlockState renderState = Blocks.AIR.defaultBlockState(); VertexConsumer builder = buffer.getBuffer(RenderType.solid()); - SuperByteBuffer attachment = CachedBufferer.partial(AllBlockPartials.COUPLING_ATTACHMENT, renderState); - SuperByteBuffer ring = CachedBufferer.partial(AllBlockPartials.COUPLING_RING, renderState); - SuperByteBuffer connector = CachedBufferer.partial(AllBlockPartials.COUPLING_CONNECTOR, renderState); + SuperByteBuffer attachment = CachedPartialBuffers.partial(AllBlockPartials.COUPLING_ATTACHMENT, renderState); + SuperByteBuffer ring = CachedPartialBuffers.partial(AllBlockPartials.COUPLING_RING, renderState); + SuperByteBuffer connector = CachedPartialBuffers.partial(AllBlockPartials.COUPLING_CONNECTOR, renderState); Vec3 zero = Vec3.ZERO; Vec3 firstEndpoint = transforms.getFirst() diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/OpenEndedPipe.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/OpenEndedPipe.java index c281ceede4..cfa5d8b3c3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/OpenEndedPipe.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/OpenEndedPipe.java @@ -14,8 +14,8 @@ import com.simibubi.create.foundation.advancement.AdvancementBehaviour; import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.fluid.FluidHelper; -import net.createmod.catnip.utility.BlockFace; +import net.createmod.catnip.utility.BlockFace; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java index 16a3cf01c3..568dce60ec 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpRenderer.java @@ -5,9 +5,10 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.render.CachedBufferer; -import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.CachedPartialBuffers; +import com.simibubi.create.foundation.render.FlwSuperByteBuffer; +import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; @@ -33,10 +34,11 @@ public class PumpRenderer extends KineticTileEntityRenderer { Vec3 rotationOffset = new Vec3(.5, 14 / 16f, .5); BlockState blockState = te.getBlockState(); float angle = Mth.lerp(pump.arrowDirection.getValue(partialTicks), 0, 90) - 90; - SuperByteBuffer arrow = CachedBufferer.partial(AllBlockPartials.MECHANICAL_PUMP_ARROW, blockState); + SuperByteBuffer arrow = CachedPartialBuffers.partial(AllBlockPartials.MECHANICAL_PUMP_ARROW, blockState); for (float yRot : new float[] { 0, 90 }) { Direction direction = blockState.getValue(PumpBlock.FACING); - arrow.centre() + FlwSuperByteBuffer.cast(arrow).ifPresent(flwBuffer -> flwBuffer + .centre() .rotateY(AngleHelper.horizontalAngle(direction) + 180) .rotateX(-AngleHelper.verticalAngle(direction) - 90) .unCentre() @@ -44,14 +46,15 @@ public class PumpRenderer extends KineticTileEntityRenderer { .rotateY(yRot) .rotateZ(angle) .translateBack(rotationOffset) - .light(light) - .renderInto(ms, buffer.getBuffer(RenderType.solid())); + ); + + arrow.light(light).renderInto(ms, buffer.getBuffer(RenderType.solid())); } } @Override protected SuperByteBuffer getRotatedModel(KineticTileEntity te, BlockState state) { - return CachedBufferer.partialFacing(AllBlockPartials.MECHANICAL_PUMP_COG, state); + return CachedPartialBuffers.partialFacing(AllBlockPartials.MECHANICAL_PUMP_COG, state); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyRenderer.java index 5f14a97d97..8541aeb3fa 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyRenderer.java @@ -4,9 +4,9 @@ import com.jozufozu.flywheel.core.PartialModel; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.pulley.AbstractPulleyRenderer; -import com.simibubi.create.foundation.render.CachedBufferer; -import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.CachedPartialBuffers; +import net.createmod.catnip.render.SuperByteBuffer; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.minecraft.core.Direction.Axis; @@ -31,12 +31,12 @@ public class HosePulleyRenderer extends AbstractPulleyRenderer { @Override protected SuperByteBuffer renderRope(KineticTileEntity te) { - return CachedBufferer.partial(AllBlockPartials.HOSE, te.getBlockState()); + return CachedPartialBuffers.partial(AllBlockPartials.HOSE, te.getBlockState()); } @Override protected SuperByteBuffer renderMagnet(KineticTileEntity te) { - return CachedBufferer.partial(AllBlockPartials.HOSE_MAGNET, te.getBlockState()); + return CachedPartialBuffers.partial(AllBlockPartials.HOSE_MAGNET, te.getBlockState()); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutRenderer.java index cc64435893..4c2e498ace 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutRenderer.java @@ -4,7 +4,7 @@ import com.jozufozu.flywheel.core.PartialModel; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.foundation.fluid.FluidRenderer; -import com.simibubi.create.foundation.render.CachedBufferer; +import com.simibubi.create.foundation.render.CachedPartialBuffers; import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour.TankSegment; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; @@ -72,7 +72,7 @@ public class SpoutRenderer extends SafeTileEntityRenderer { ms.pushPose(); for (PartialModel bit : BITS) { - CachedBufferer.partial(bit, te.getBlockState()) + CachedPartialBuffers.partial(bit, te.getBlockState()) .light(light) .renderInto(ms, buffer.getBuffer(RenderType.solid())); ms.translate(0, -3 * squeeze / 32f, 0); diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/particle/BasinFluidParticle.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/particle/BasinFluidParticle.java index 847b7be1aa..d79e64abf1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/particle/BasinFluidParticle.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/particle/BasinFluidParticle.java @@ -4,8 +4,8 @@ import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.math.Quaternion; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.processing.BasinTileEntity; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.client.Camera; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/AxisPipeBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/AxisPipeBlock.java index f91b869e13..c40dc7958e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/AxisPipeBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/AxisPipeBlock.java @@ -12,8 +12,8 @@ import com.simibubi.create.content.contraptions.relays.elementary.BracketedTileE import com.simibubi.create.content.contraptions.wrench.IWrenchableWithBracket; import com.simibubi.create.foundation.advancement.AdvancementBehaviour; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveInstance.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveInstance.java index 068167f93b..e9e7efa513 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveInstance.java @@ -8,9 +8,9 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.relays.encased.ShaftInstance; -import net.createmod.catnip.utility.math.AngleHelper; -import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.core.Direction; import net.minecraft.util.Mth; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveRenderer.java index e13b565c44..cbf7b9f281 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveRenderer.java @@ -5,10 +5,11 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.render.CachedBufferer; -import com.simibubi.create.foundation.render.SuperByteBuffer; -import net.createmod.catnip.utility.math.AngleHelper; +import com.simibubi.create.foundation.render.CachedPartialBuffers; +import com.simibubi.create.foundation.render.FlwSuperByteBuffer; +import net.createmod.catnip.render.SuperByteBuffer; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; @@ -31,7 +32,7 @@ public class FluidValveRenderer extends KineticTileEntityRenderer { super.renderSafe(te, partialTicks, ms, buffer, light, overlay); BlockState blockState = te.getBlockState(); - SuperByteBuffer pointer = CachedBufferer.partial(AllBlockPartials.FLUID_VALVE_POINTER, blockState); + SuperByteBuffer pointer = CachedPartialBuffers.partial(AllBlockPartials.FLUID_VALVE_POINTER, blockState); Direction facing = blockState.getValue(FluidValveBlock.FACING); if (!(te instanceof FluidValveTileEntity valve)) @@ -41,15 +42,21 @@ public class FluidValveRenderer extends KineticTileEntityRenderer { Axis pipeAxis = FluidValveBlock.getPipeAxis(blockState); Axis shaftAxis = KineticTileEntityRenderer.getRotationAxisOf(te); - int pointerRotationOffset = 0; + int pointerRotationOffset; if (pipeAxis.isHorizontal() && shaftAxis == Axis.X || pipeAxis.isVertical()) pointerRotationOffset = 90; + else + pointerRotationOffset = 0; - pointer.centre() - .rotateY(AngleHelper.horizontalAngle(facing)) - .rotateX(facing == Direction.UP ? 0 : facing == Direction.DOWN ? 180 : 90) - .rotateY(pointerRotationOffset + pointerRotation) - .unCentre() + FlwSuperByteBuffer.cast(pointer).ifPresent(flwBuffer -> flwBuffer + .centre() + .rotateY(AngleHelper.horizontalAngle(facing)) + .rotateX(facing == Direction.UP ? 0 : facing == Direction.DOWN ? 180 : 90) + .rotateY(pointerRotationOffset + pointerRotation) + .unCentre() + ); + + pointer .light(light) .renderInto(ms, buffer.getBuffer(RenderType.solid())); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveTileEntity.java index d0c1768c14..2f932753bc 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveTileEntity.java @@ -7,9 +7,9 @@ import com.simibubi.create.content.contraptions.fluids.FluidPropagator; import com.simibubi.create.content.contraptions.fluids.pipes.StraightPipeTileEntity.StraightPipeFluidTransportBehaviour; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; + import net.createmod.catnip.utility.animation.LerpedFloat; import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/SmartFluidPipeBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/SmartFluidPipeBlock.java index 560fa3899c..d2f0551f6c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/SmartFluidPipeBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/SmartFluidPipeBlock.java @@ -8,9 +8,9 @@ import com.simibubi.create.content.contraptions.fluids.FluidPropagator; import com.simibubi.create.content.contraptions.wrench.IWrenchable; import com.simibubi.create.foundation.advancement.AdvancementBehaviour; import com.simibubi.create.foundation.block.ITE; + import net.createmod.catnip.utility.Iterate; import net.createmod.catnip.utility.VoxelShaper; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/SmartFluidPipeTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/SmartFluidPipeTileEntity.java index b5619ea618..ea218cc7da 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/SmartFluidPipeTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/SmartFluidPipeTileEntity.java @@ -10,9 +10,9 @@ import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; -import net.createmod.catnip.utility.math.AngleHelper; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankRenderer.java index 8d671b431e..ba946a9e84 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankRenderer.java @@ -5,7 +5,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.foundation.fluid.FluidRenderer; -import com.simibubi.create.foundation.render.CachedBufferer; +import com.simibubi.create.foundation.render.CachedPartialBuffers; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import net.createmod.catnip.utility.Iterate; @@ -90,18 +90,18 @@ public class FluidTankRenderer extends SafeTileEntityRenderer { PartialModel beltPartial = getBeltPartial(diagonal, start, end, bottom); - SuperByteBuffer beltBuffer = CachedBufferer.partial(beltPartial, blockState) + SuperByteBuffer beltBuffer = CachedPartialBuffers.partial(beltPartial, blockState) .light(light); SpriteShiftEntry spriteShift = getSpriteShiftEntry(color, diagonal, bottom); @@ -140,7 +140,7 @@ public class BeltRenderer extends SafeTileEntityRenderer { return stack; }; - SuperByteBuffer superBuffer = CachedBufferer.partialDirectional(AllBlockPartials.BELT_PULLEY, blockState, dir, matrixStackSupplier); + SuperByteBuffer superBuffer = CachedPartialBuffers.partialDirectional(AllBlockPartials.BELT_PULLEY, blockState, dir, matrixStackSupplier); KineticTileEntityRenderer.standardKineticRotationTransform(superBuffer, te, light).renderInto(ms, vb); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/item/BeltConnectorItem.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/item/BeltConnectorItem.java index d2c2d006be..6d808ccd79 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/item/BeltConnectorItem.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/item/BeltConnectorItem.java @@ -15,8 +15,8 @@ import com.simibubi.create.content.contraptions.relays.elementary.AbstractSimple import com.simibubi.create.content.contraptions.relays.elementary.ShaftBlock; import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.config.AllConfigs; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/BracketedKineticBlockModel.java b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/BracketedKineticBlockModel.java index ec5b472d03..4679668467 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/BracketedKineticBlockModel.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/BracketedKineticBlockModel.java @@ -7,6 +7,7 @@ import java.util.Random; import com.jozufozu.flywheel.core.virtual.VirtualEmptyModelData; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import net.createmod.catnip.ForgeCatnipClient; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.resources.model.BakedModel; @@ -15,7 +16,6 @@ import net.minecraft.core.Direction; import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.client.model.BakedModelWrapper; -import net.minecraftforge.client.model.data.EmptyModelData; import net.minecraftforge.client.model.data.IModelData; import net.minecraftforge.client.model.data.ModelDataMap; import net.minecraftforge.client.model.data.ModelProperty; @@ -30,7 +30,7 @@ public class BracketedKineticBlockModel extends BakedModelWrapper { @Override public IModelData getModelData(BlockAndTintGetter world, BlockPos pos, BlockState state, IModelData tileData) { - if (VirtualEmptyModelData.is(tileData) || tileData.equals(EmptyModelData.INSTANCE)) + if (VirtualEmptyModelData.is(tileData)) return tileData; BracketedModelData data = new BracketedModelData(); @@ -44,7 +44,7 @@ public class BracketedKineticBlockModel extends BakedModelWrapper { @Override public List getQuads(BlockState state, Direction side, Random rand, IModelData data) { - if (VirtualEmptyModelData.is(data) || data.equals(EmptyModelData.INSTANCE)) { + if (VirtualEmptyModelData.is(data) || data.equals(ForgeCatnipClient.NoModelData)) { return super.getQuads(state, side, rand, data); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/BracketedKineticTileRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/BracketedKineticTileRenderer.java index cc1dde5750..d3b65a5d6e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/BracketedKineticTileRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/BracketedKineticTileRenderer.java @@ -6,9 +6,9 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.render.CachedBufferer; -import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.CachedPartialBuffers; +import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.ponder.utility.WorldTickHolder; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; @@ -44,7 +44,7 @@ public class BracketedKineticTileRenderer extends KineticTileEntityRenderer { Direction facing = Direction.fromAxisAndDirection(axis, AxisDirection.POSITIVE); renderRotatingBuffer(te, - CachedBufferer.partialFacingVertical(AllBlockPartials.SHAFTLESS_LARGE_COGWHEEL, te.getBlockState(), facing), + CachedPartialBuffers.partialFacingVertical(AllBlockPartials.SHAFTLESS_LARGE_COGWHEEL, te.getBlockState(), facing), ms, buffer.getBuffer(RenderType.solid()), light); float offset = getShaftAngleOffset(axis, pos); @@ -52,7 +52,7 @@ public class BracketedKineticTileRenderer extends KineticTileEntityRenderer { float angle = ((time * te.getSpeed() * 3f / 10 + offset) % 360) / 180 * (float) Math.PI; SuperByteBuffer shaft = - CachedBufferer.partialFacingVertical(AllBlockPartials.COGWHEEL_SHAFT, te.getBlockState(), facing); + CachedPartialBuffers.partialFacingVertical(AllBlockPartials.COGWHEEL_SHAFT, te.getBlockState(), facing); kineticRotationTransform(shaft, te, axis, angle, light); shaft.renderInto(ms, buffer.getBuffer(RenderType.solid())); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/EncasedCogRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/EncasedCogRenderer.java index 40e5ae91bf..809cb1f00c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/EncasedCogRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/EncasedCogRenderer.java @@ -6,9 +6,9 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.render.CachedBufferer; -import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.CachedPartialBuffers; +import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.Iterate; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; @@ -51,14 +51,14 @@ public class EncasedCogRenderer extends KineticTileEntityRenderer { for (Direction d : Iterate.directionsInAxis(getRotationAxisOf(te))) { if (!def.hasShaftTowards(te.getLevel(), te.getBlockPos(), blockState, d)) continue; - renderRotatingBuffer(te, CachedBufferer.partialFacing(AllBlockPartials.SHAFT_HALF, te.getBlockState(), d), + renderRotatingBuffer(te, CachedPartialBuffers.partialFacing(AllBlockPartials.SHAFT_HALF, te.getBlockState(), d), ms, buffer.getBuffer(RenderType.solid()), light); } } @Override protected SuperByteBuffer getRotatedModel(KineticTileEntity te, BlockState state) { - return CachedBufferer.partialFacingVertical( + return CachedPartialBuffers.partialFacingVertical( large ? AllBlockPartials.SHAFTLESS_LARGE_COGWHEEL : AllBlockPartials.SHAFTLESS_COGWHEEL, state, Direction.fromAxisAndDirection(state.getValue(EncasedCogwheelBlock.AXIS), AxisDirection.POSITIVE)); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java index d048c8828c..a2b4518e6d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java @@ -6,9 +6,9 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.render.CachedBufferer; -import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.CachedPartialBuffers; +import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.Iterate; import net.createmod.ponder.utility.WorldTickHolder; import net.minecraft.client.renderer.MultiBufferSource; @@ -52,7 +52,7 @@ public class SplitShaftRenderer extends KineticTileEntityRenderer { angle = angle / 180f * (float) Math.PI; SuperByteBuffer superByteBuffer = - CachedBufferer.partialFacing(AllBlockPartials.SHAFT_HALF, te.getBlockState(), direction); + CachedPartialBuffers.partialFacing(AllBlockPartials.SHAFT_HALF, te.getBlockState(), direction); kineticRotationTransform(superByteBuffer, te, axis, angle, light); superByteBuffer.renderInto(ms, buffer.getBuffer(RenderType.solid())); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeRenderer.java index 38e3798b5d..41ac6e65f8 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeRenderer.java @@ -8,9 +8,9 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.relays.gauge.GaugeBlock.Type; -import com.simibubi.create.foundation.render.CachedBufferer; -import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.CachedPartialBuffers; +import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.Iterate; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; @@ -48,8 +48,8 @@ public class GaugeRenderer extends KineticTileEntityRenderer { PartialModel partialModel = (type == Type.SPEED ? AllBlockPartials.GAUGE_HEAD_SPEED : AllBlockPartials.GAUGE_HEAD_STRESS); SuperByteBuffer headBuffer = - CachedBufferer.partial(partialModel, gaugeState); - SuperByteBuffer dialBuffer = CachedBufferer.partial(AllBlockPartials.GAUGE_DIAL, gaugeState); + CachedPartialBuffers.partial(partialModel, gaugeState); + SuperByteBuffer dialBuffer = CachedPartialBuffers.partial(AllBlockPartials.GAUGE_DIAL, gaugeState); float dialPivot = 5.75f / 16; float progress = Mth.lerp(partialTicks, gaugeTE.prevDialState, gaugeTE.dialState); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java index d5babb04e2..0ef72e4d49 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java @@ -5,9 +5,9 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.render.CachedBufferer; -import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.CachedPartialBuffers; +import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.Iterate; import net.createmod.ponder.utility.WorldTickHolder; import net.minecraft.client.renderer.MultiBufferSource; @@ -38,7 +38,7 @@ public class GearboxRenderer extends KineticTileEntityRenderer { if (boxAxis == axis) continue; - SuperByteBuffer shaft = CachedBufferer.partialFacing(AllBlockPartials.SHAFT_HALF, te.getBlockState(), direction); + SuperByteBuffer shaft = CachedPartialBuffers.partialFacing(AllBlockPartials.SHAFT_HALF, te.getBlockState(), direction); float offset = getRotationOffsetForPosition(te, pos, axis); float angle = (time * te.getSpeed() * 3f / 10) % 360; diff --git a/src/main/java/com/simibubi/create/content/contraptions/wrench/WrenchItemRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/wrench/WrenchItemRenderer.java index f6ab1c9e0f..ef305f1177 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/wrench/WrenchItemRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/wrench/WrenchItemRenderer.java @@ -5,8 +5,8 @@ import com.mojang.math.Vector3f; import com.simibubi.create.foundation.item.render.CustomRenderedItemModelRenderer; import com.simibubi.create.foundation.item.render.PartialItemModelRenderer; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollValueHandler; -import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.AnimationTickHolder; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.block.model.ItemTransforms; import net.minecraft.client.resources.model.BakedModel; diff --git a/src/main/java/com/simibubi/create/content/curiosities/NoGravMagicalDohickyItem.java b/src/main/java/com/simibubi/create/content/curiosities/NoGravMagicalDohickyItem.java index 6224a431ef..6bdae263fc 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/NoGravMagicalDohickyItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/NoGravMagicalDohickyItem.java @@ -1,7 +1,6 @@ package com.simibubi.create.content.curiosities; import net.createmod.catnip.utility.VecHelper; - import net.minecraft.core.NonNullList; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/curiosities/armor/CopperBacktankArmorLayer.java b/src/main/java/com/simibubi/create/content/curiosities/armor/CopperBacktankArmorLayer.java index 58201e55a4..1253dd5359 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/armor/CopperBacktankArmorLayer.java +++ b/src/main/java/com/simibubi/create/content/curiosities/armor/CopperBacktankArmorLayer.java @@ -4,15 +4,15 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; +import com.simibubi.create.foundation.render.CachedPartialBuffers; +import com.simibubi.create.foundation.render.FlwSuperByteBuffer; + import net.createmod.catnip.gui.element.GuiGameElement; -import com.simibubi.create.foundation.render.CachedBufferer; -import com.simibubi.create.foundation.render.SuperByteBuffer; +import net.createmod.catnip.render.CachedBlockBuffers; +import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.math.AngleHelper; - -import net.createmod.ponder.utility.WorldTickHolder; - import net.createmod.catnip.utility.theme.Color; - +import net.createmod.ponder.utility.WorldTickHolder; import net.minecraft.client.Minecraft; import net.minecraft.client.model.EntityModel; import net.minecraft.client.model.HumanoidModel; @@ -63,8 +63,8 @@ public class CopperBacktankArmorLayer flwBuffer + .forEntityRender() + .light(light) + .renderInto(ms, buffer.getBuffer(renderType)) + ); - cogs.centre() - .rotateY(180) - .unCentre() - .translate(0, 6.5f / 16, 11f / 16) - .rotate(Direction.EAST, AngleHelper.rad(2 * WorldTickHolder.getRenderTime(entity.level) % 360)) - .translate(0, -6.5f / 16, -11f / 16); + FlwSuperByteBuffer.cast(cogs).ifPresent(flwBuffer -> flwBuffer + .centre() + .rotateY(180) + .unCentre() + .translate(0, 6.5f / 16, 11f / 16) + .rotate(Direction.EAST, AngleHelper.rad(2 * WorldTickHolder.getRenderTime(entity.level) % 360)) + .translate(0, -6.5f / 16, -11f / 16) + .forEntityRender() + ); - cogs.forEntityRender() - .light(light) - .renderInto(ms, buffer.getBuffer(renderType)); + cogs.light(light).renderInto(ms, buffer.getBuffer(renderType)); ms.popPose(); } diff --git a/src/main/java/com/simibubi/create/content/curiosities/armor/CopperBacktankRenderer.java b/src/main/java/com/simibubi/create/content/curiosities/armor/CopperBacktankRenderer.java index cdebfcb142..c4df6f90ca 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/armor/CopperBacktankRenderer.java +++ b/src/main/java/com/simibubi/create/content/curiosities/armor/CopperBacktankRenderer.java @@ -4,16 +4,16 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.render.CachedBufferer; -import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.CachedPartialBuffers; + +import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.math.AngleHelper; - import net.createmod.ponder.utility.WorldTickHolder; - import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.minecraft.core.Direction; +import net.minecraft.util.Mth; import net.minecraft.world.level.block.state.BlockState; public class CopperBacktankRenderer extends KineticTileEntityRenderer { @@ -28,10 +28,8 @@ public class CopperBacktankRenderer extends KineticTileEntityRenderer { super.renderSafe(te, partialTicks, ms, buffer, light, overlay); BlockState blockState = te.getBlockState(); - SuperByteBuffer cogs = CachedBufferer.partial(AllBlockPartials.COPPER_BACKTANK_COGS, blockState); - cogs.centre() - .rotateY(180 + AngleHelper.horizontalAngle(blockState.getValue(CopperBacktankBlock.HORIZONTAL_FACING))) - .unCentre() + SuperByteBuffer cogs = CachedPartialBuffers.partial(AllBlockPartials.COPPER_BACKTANK_COGS, blockState); + cogs.rotateCentered(Direction.Axis.Y, Mth.DEG_TO_RAD * (180 + AngleHelper.horizontalAngle(blockState.getValue(CopperBacktankBlock.HORIZONTAL_FACING)))) .translate(0, 6.5f / 16, 11f / 16) .rotate(Direction.EAST, AngleHelper.rad(te.getSpeed() / 4f * WorldTickHolder.getRenderTime(te.getLevel()) % 360)) @@ -42,7 +40,7 @@ public class CopperBacktankRenderer extends KineticTileEntityRenderer { @Override protected SuperByteBuffer getRotatedModel(KineticTileEntity te, BlockState state) { - return CachedBufferer.partial(AllBlockPartials.COPPER_BACKTANK_SHAFT, state); + return CachedPartialBuffers.partial(AllBlockPartials.COPPER_BACKTANK_SHAFT, state); } } diff --git a/src/main/java/com/simibubi/create/content/curiosities/armor/CopperBacktankTileEntity.java b/src/main/java/com/simibubi/create/content/curiosities/armor/CopperBacktankTileEntity.java index ad9133ed13..f24043699e 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/armor/CopperBacktankTileEntity.java +++ b/src/main/java/com/simibubi/create/content/curiosities/armor/CopperBacktankTileEntity.java @@ -10,8 +10,8 @@ import com.simibubi.create.content.contraptions.particle.AirParticleData; import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.tileEntity.ComparatorUtil; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction.Axis; import net.minecraft.core.particles.ParticleTypes; diff --git a/src/main/java/com/simibubi/create/content/curiosities/bell/BellRenderer.java b/src/main/java/com/simibubi/create/content/curiosities/bell/BellRenderer.java index 65476e0b61..0b13b7b9f0 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/bell/BellRenderer.java +++ b/src/main/java/com/simibubi/create/content/curiosities/bell/BellRenderer.java @@ -1,11 +1,11 @@ package com.simibubi.create.content.curiosities.bell; import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.foundation.render.CachedBufferer; -import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.CachedPartialBuffers; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; -import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.render.SuperByteBuffer; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; @@ -26,7 +26,7 @@ public class BellRenderer extends SafeTileEnt Direction facing = state.getValue(BellBlock.FACING); BellAttachType attachment = state.getValue(BellBlock.ATTACHMENT); - SuperByteBuffer bell = CachedBufferer.partial(te.getBellModel(), state); + SuperByteBuffer bell = CachedPartialBuffers.partial(te.getBellModel(), state); if (te.isRinging) bell.rotateCentered(te.ringDirection.getCounterClockWise(), getSwingAngle(te.ringingTicks + partialTicks)); diff --git a/src/main/java/com/simibubi/create/content/curiosities/bell/SoulPulseEffect.java b/src/main/java/com/simibubi/create/content/curiosities/bell/SoulPulseEffect.java index e90a1dfa9a..bba8951f0b 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/bell/SoulPulseEffect.java +++ b/src/main/java/com/simibubi/create/content/curiosities/bell/SoulPulseEffect.java @@ -7,8 +7,8 @@ import java.util.stream.Stream; import com.google.common.collect.Streams; import com.simibubi.create.content.curiosities.bell.SoulParticle.ExpandingPerimeterData; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.SpawnPlacements; diff --git a/src/main/java/com/simibubi/create/content/curiosities/deco/SlidingDoorMovementBehaviour.java b/src/main/java/com/simibubi/create/content/curiosities/deco/SlidingDoorMovementBehaviour.java index 5ed747f68b..ecea33eafd 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/deco/SlidingDoorMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/curiosities/deco/SlidingDoorMovementBehaviour.java @@ -7,8 +7,8 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Mov import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.content.logistics.trains.entity.CarriageContraptionEntity; import com.simibubi.create.content.logistics.trains.entity.CarriageSyncData; -import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; import net.minecraft.core.BlockPos; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; diff --git a/src/main/java/com/simibubi/create/content/curiosities/deco/SlidingDoorRenderer.java b/src/main/java/com/simibubi/create/content/curiosities/deco/SlidingDoorRenderer.java index 0b9ca3d86a..8afa39a3b4 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/deco/SlidingDoorRenderer.java +++ b/src/main/java/com/simibubi/create/content/curiosities/deco/SlidingDoorRenderer.java @@ -2,9 +2,9 @@ package com.simibubi.create.content.curiosities.deco; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; -import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; +import net.createmod.catnip.render.CachedBlockBuffers; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider.Context; @@ -43,10 +43,10 @@ public class SlidingDoorRenderer extends SafeTileEntityRenderer { @@ -28,26 +29,24 @@ public class ToolboxRenderer extends SmartTileEntityRenderer Direction facing = blockState.getValue(ToolboxBlock.FACING) .getOpposite(); SuperByteBuffer lid = - CachedBufferer.partial(AllBlockPartials.TOOLBOX_LIDS.get(tileEntityIn.getColor()), blockState); - SuperByteBuffer drawer = CachedBufferer.partial(AllBlockPartials.TOOLBOX_DRAWER, blockState); + CachedPartialBuffers.partial(AllBlockPartials.TOOLBOX_LIDS.get(tileEntityIn.getColor()), blockState); + SuperByteBuffer drawer = CachedPartialBuffers.partial(AllBlockPartials.TOOLBOX_DRAWER, blockState); float lidAngle = tileEntityIn.lid.getValue(partialTicks); float drawerOffset = tileEntityIn.drawers.getValue(partialTicks); VertexConsumer builder = buffer.getBuffer(RenderType.cutoutMipped()); - lid.centre() - .rotateY(-facing.toYRot()) - .unCentre() + lid + .rotateCentered(Direction.Axis.Y, Mth.DEG_TO_RAD * -facing.toYRot()) .translate(0, 6 / 16f, 12 / 16f) - .rotateX(135 * lidAngle) + .rotate(Direction.Axis.X, Mth.DEG_TO_RAD * (135 * lidAngle)) .translate(0, -6 / 16f, -12 / 16f) .light(light) .renderInto(ms, builder); for (int offset : Iterate.zeroAndOne) { - drawer.centre() - .rotateY(-facing.toYRot()) - .unCentre() + drawer + .rotateCentered(Direction.Axis.Y, Mth.DEG_TO_RAD * -facing.toYRot()) .translate(0, offset * 1 / 8f, -drawerOffset * .175f * (2 - offset)) .light(light) .renderInto(ms, builder); diff --git a/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintRenderer.java b/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintRenderer.java index 64813303cf..d81e93975d 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintRenderer.java +++ b/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintRenderer.java @@ -6,9 +6,10 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Matrix3f; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.curiosities.tools.BlueprintEntity.BlueprintSection; -import com.simibubi.create.foundation.render.CachedBufferer; -import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.CachedPartialBuffers; +import com.simibubi.create.foundation.render.FlwSuperByteBuffer; +import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.Couple; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; @@ -33,16 +34,21 @@ public class BlueprintRenderer extends EntityRenderer { int light) { PartialModel partialModel = entity.size == 3 ? AllBlockPartials.CRAFTING_BLUEPRINT_3x3 : entity.size == 2 ? AllBlockPartials.CRAFTING_BLUEPRINT_2x2 : AllBlockPartials.CRAFTING_BLUEPRINT_1x1; - SuperByteBuffer sbb = CachedBufferer.partial(partialModel, Blocks.AIR.defaultBlockState()); - sbb.rotateY(-yaw) - .rotateX(90.0F + entity.getXRot()) - .translate(-.5, -1 / 32f, -.5); - if (entity.size == 2) - sbb.translate(.5, 0, -.5); + SuperByteBuffer sbb = CachedPartialBuffers.partial(partialModel, Blocks.AIR.defaultBlockState()); + FlwSuperByteBuffer.cast(sbb).ifPresent(flwBuffer -> { + flwBuffer + .rotateY(-yaw) + .rotateX(90.0F + entity.getXRot()) + .translate(-.5, -1 / 32f, -.5); + + if (entity.size == 2) + flwBuffer.translate(.5, 0, -.5); + + flwBuffer.forEntityRender() + .light(light) + .renderInto(ms, buffer.getBuffer(Sheets.solidBlockSheet())); + }); - sbb.forEntityRender() - .light(light) - .renderInto(ms, buffer.getBuffer(Sheets.solidBlockSheet())); super.render(entity, yaw, pt, ms, buffer, light); ms.pushPose(); diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperItem.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperItem.java index f913cdae93..261c9f68f4 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperItem.java @@ -10,9 +10,9 @@ import com.simibubi.create.CreateClient; import com.simibubi.create.foundation.item.ItemDescription; import com.simibubi.create.foundation.utility.BlockHelper; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.NBTHelper; import com.simibubi.create.foundation.utility.NBTProcessors; +import net.createmod.catnip.utility.NBTHelper; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperItemRenderer.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperItemRenderer.java index c7facd63f2..9986edd82d 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperItemRenderer.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperItemRenderer.java @@ -6,8 +6,8 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Vector3f; import com.simibubi.create.content.curiosities.zapper.ZapperItemRenderer; import com.simibubi.create.foundation.item.render.PartialItemModelRenderer; -import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.AnimationTickHolder; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; import net.minecraft.client.renderer.LightTexture; diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperScreen.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperScreen.java index 51994ec450..3abfc96a5a 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperScreen.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/terrainzapper/WorldshaperScreen.java @@ -15,8 +15,8 @@ import com.simibubi.create.foundation.gui.widget.Label; import com.simibubi.create.foundation.gui.widget.ScrollInput; import com.simibubi.create.foundation.gui.widget.SelectionScrollInput; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.utility.NBTHelper; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelRenderer.java index e8b94dddcc..adf1f92b81 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelRenderer.java @@ -5,10 +5,10 @@ import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.simibubi.create.AllBlockPartials; -import com.simibubi.create.foundation.render.CachedBufferer; -import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.CachedPartialBuffers; import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRenderer; +import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.Iterate; import net.createmod.catnip.utility.VecHelper; import net.createmod.catnip.utility.math.AngleHelper; @@ -34,7 +34,7 @@ public class BeltTunnelRenderer extends SmartTileEntityRenderer applyLidAngle(te, angle, flwBuffer)); + model.light(light).renderInto(ms, vertexBuilder); } TransformStack msr = TransformStack.cast(ms); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/diodes/BrassDiodeRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/diodes/BrassDiodeRenderer.java index 828a1cf639..adf8983b26 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/diodes/BrassDiodeRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/diodes/BrassDiodeRenderer.java @@ -1,10 +1,10 @@ package com.simibubi.create.content.logistics.block.diodes; import com.simibubi.create.AllBlockPartials; -import com.simibubi.create.foundation.render.CachedBufferer; -import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.CachedPartialBuffers; import com.simibubi.create.foundation.tileEntity.renderer.ColoredOverlayTileEntityRenderer; +import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.theme.Color; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; @@ -21,7 +21,7 @@ public class BrassDiodeRenderer extends ColoredOverlayTileEntityRenderer flwBuffer + .light(LightTexture.FULL_BRIGHT) + .color(color, color, color, 255) + .disableDiffuse() + .renderInto(ms, buffer.getBuffer(RenderTypes.getAdditive())) + ); ms.popPose(); } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelRenderer.java index 08ac338d5a..71b76a77a0 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelRenderer.java @@ -6,10 +6,10 @@ import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.simibubi.create.AllBlockPartials; -import com.simibubi.create.foundation.render.CachedBufferer; -import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.CachedPartialBuffers; import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRenderer; +import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.VecHelper; import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.renderer.MultiBufferSource; @@ -37,7 +37,7 @@ public class FunnelRenderer extends SmartTileEntityRenderer { VertexConsumer vb = buffer.getBuffer(RenderType.solid()); PartialModel partialModel = (blockState.getBlock() instanceof FunnelBlock ? AllBlockPartials.FUNNEL_FLAP : AllBlockPartials.BELT_FUNNEL_FLAP); - SuperByteBuffer flapBuffer = CachedBufferer.partial(partialModel, blockState); + SuperByteBuffer flapBuffer = CachedPartialBuffers.partial(partialModel, blockState); Vec3 pivot = VecHelper.voxelSpace(0, 10, 9.5f); TransformStack msr = TransformStack.cast(ms); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java index a7b592082e..3e6a107528 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java @@ -8,9 +8,9 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.logistics.block.mechanicalArm.ArmTileEntity.Phase; -import com.simibubi.create.foundation.render.CachedBufferer; -import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.CachedPartialBuffers; +import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.AnimationTickHolder; import net.createmod.catnip.utility.Iterate; import net.createmod.catnip.utility.theme.Color; @@ -113,17 +113,17 @@ public class ArmRenderer extends KineticTileEntityRenderer { private void renderArm(VertexConsumer builder, PoseStack ms, PoseStack msLocal, TransformStack msr, BlockState blockState, int color, float baseAngle, float lowerArmAngle, float upperArmAngle, float headAngle, boolean hasItem, boolean isBlockItem, int light) { - SuperByteBuffer base = CachedBufferer.partial(AllBlockPartials.ARM_BASE, blockState) + SuperByteBuffer base = CachedPartialBuffers.partial(AllBlockPartials.ARM_BASE, blockState) .light(light); - SuperByteBuffer lowerBody = CachedBufferer.partial(AllBlockPartials.ARM_LOWER_BODY, blockState) + SuperByteBuffer lowerBody = CachedPartialBuffers.partial(AllBlockPartials.ARM_LOWER_BODY, blockState) .light(light); - SuperByteBuffer upperBody = CachedBufferer.partial(AllBlockPartials.ARM_UPPER_BODY, blockState) + SuperByteBuffer upperBody = CachedPartialBuffers.partial(AllBlockPartials.ARM_UPPER_BODY, blockState) .light(light); - SuperByteBuffer head = CachedBufferer.partial(AllBlockPartials.ARM_HEAD, blockState) + SuperByteBuffer head = CachedPartialBuffers.partial(AllBlockPartials.ARM_HEAD, blockState) .light(light); - SuperByteBuffer claw = CachedBufferer.partial(AllBlockPartials.ARM_CLAW_BASE, blockState) + SuperByteBuffer claw = CachedPartialBuffers.partial(AllBlockPartials.ARM_CLAW_BASE, blockState) .light(light); - SuperByteBuffer clawGrip = CachedBufferer.partial(AllBlockPartials.ARM_CLAW_GRIP, blockState); + SuperByteBuffer clawGrip = CachedPartialBuffers.partial(AllBlockPartials.ARM_CLAW_GRIP, blockState); transformBase(msr, baseAngle); base.transform(msLocal) @@ -204,7 +204,7 @@ public class ArmRenderer extends KineticTileEntityRenderer { @Override protected SuperByteBuffer getRotatedModel(KineticTileEntity te, BlockState state) { - return CachedBufferer.partial(AllBlockPartials.ARM_COG, state); + return CachedPartialBuffers.partial(AllBlockPartials.ARM_COG, state); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java index e3f0470998..8d7c4d239c 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java @@ -19,14 +19,13 @@ import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.CenteredSideValueBoxTransform; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.INamedIconOptions; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollOptionBehaviour; - -import net.createmod.catnip.utility.lang.Lang; -import net.createmod.catnip.utility.math.AngleHelper; import com.simibubi.create.foundation.utility.CreateLang; + import net.createmod.catnip.utility.NBTHelper; import net.createmod.catnip.utility.VecHelper; import net.createmod.catnip.utility.animation.LerpedFloat; - +import net.createmod.catnip.utility.lang.Lang; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverRenderer.java index f8bfb13b43..a3c7c83388 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverRenderer.java @@ -4,10 +4,10 @@ import com.jozufozu.flywheel.backend.Backend; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.simibubi.create.AllBlockPartials; -import com.simibubi.create.foundation.render.CachedBufferer; -import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.CachedPartialBuffers; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; +import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.math.AngleHelper; import net.createmod.catnip.utility.theme.Color; import net.minecraft.client.renderer.MultiBufferSource; @@ -34,7 +34,7 @@ public class AnalogLeverRenderer extends SafeTileEntityRenderer flwBuffer + .light(0xf000f0) + .disableDiffuse() + .scale(vert ? longSide : 1, vert ? 1 : longSide, 1) + .renderInto(ms, buffer.getBuffer(RenderType.translucent())) + ); - CachedBufferer + FlwSuperByteBuffer.cast(CachedPartialBuffers .partial( first ? AllBlockPartials.SIGNAL_RED_GLOW : yellow ? AllBlockPartials.SIGNAL_YELLOW_GLOW : AllBlockPartials.SIGNAL_WHITE_GLOW, - blockState) - .light(0xf000f0) - .disableDiffuse() - .scale(vert ? longSideGlow : 2, vert ? 2 : longSideGlow, 2) - .renderInto(ms, buffer.getBuffer(RenderTypes.getAdditive())); + blockState)).ifPresent(flwBuffer -> flwBuffer + .light(0xf000f0) + .disableDiffuse() + .scale(vert ? longSideGlow : 2, vert ? 2 : longSideGlow, 2) + .renderInto(ms, buffer.getBuffer(RenderTypes.getAdditive())) + ); } - CachedBufferer + FlwSuperByteBuffer.cast(CachedPartialBuffers .partial(first ? AllBlockPartials.SIGNAL_RED - : yellow ? AllBlockPartials.SIGNAL_YELLOW : AllBlockPartials.SIGNAL_WHITE, blockState) - .light(0xF000F0) - .disableDiffuse() - .scale(1 + 1 / 16f) - .renderInto(ms, buffer.getBuffer(RenderTypes.getAdditive())); + : yellow ? AllBlockPartials.SIGNAL_YELLOW : AllBlockPartials.SIGNAL_WHITE, blockState)) + .ifPresent(flwBuffer -> flwBuffer + .light(0xF000F0) + .disableDiffuse() + .scale(1 + 1 / 16f) + .renderInto(ms, buffer.getBuffer(RenderTypes.getAdditive())) + ); ms.popPose(); } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/NixieTubeTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/NixieTubeTileEntity.java index 28099269af..563b6edaa8 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/NixieTubeTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/NixieTubeTileEntity.java @@ -9,9 +9,9 @@ import com.simibubi.create.content.logistics.trains.management.edgePoint.signal. import com.simibubi.create.content.logistics.trains.management.edgePoint.signal.SignalTileEntity.SignalState; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import net.createmod.catnip.utility.Couple; import com.simibubi.create.foundation.utility.DynamicComponent; +import net.createmod.catnip.utility.Couple; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterContainer.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterContainer.java index 1f7fa4db21..43c390c76d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterContainer.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterContainer.java @@ -4,8 +4,8 @@ import java.util.ArrayList; import java.util.List; import com.simibubi.create.AllContainerTypes; -import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.utility.Pair; import net.minecraft.ChatFormatting; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterScreen.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterScreen.java index 394721315e..6e0006dbcb 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterScreen.java @@ -16,8 +16,8 @@ import com.simibubi.create.foundation.gui.widget.Label; import com.simibubi.create.foundation.gui.widget.SelectionScrollInput; import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.utility.Pair; import net.minecraft.ChatFormatting; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/ArrivalSoundQueue.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/ArrivalSoundQueue.java index 2c3400ce34..b8da7d418e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/entity/ArrivalSoundQueue.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/ArrivalSoundQueue.java @@ -12,9 +12,9 @@ import com.simibubi.create.AllSoundEvents; import com.simibubi.create.content.contraptions.components.steam.whistle.WhistleBlock; import com.simibubi.create.content.contraptions.components.steam.whistle.WhistleBlock.WhistleSize; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; + import net.createmod.catnip.utility.NBTHelper; import net.createmod.catnip.utility.Pair; - import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageCouplingRenderer.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageCouplingRenderer.java index 47a4bd0d6a..322d0239ab 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageCouplingRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageCouplingRenderer.java @@ -7,7 +7,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.CreateClient; -import com.simibubi.create.foundation.render.CachedBufferer; +import com.simibubi.create.foundation.render.CachedPartialBuffers; import net.createmod.catnip.utility.AnimationTickHolder; import net.createmod.catnip.utility.math.AngleHelper; @@ -16,6 +16,7 @@ import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.Level; @@ -74,9 +75,9 @@ public class CarriageCouplingRenderer { ms.pushPose(); ms.pushPose(); ms.translate(anchor.x, anchor.y, anchor.z); - CachedBufferer.partial(AllBlockPartials.TRAIN_COUPLING_HEAD, air) - .rotateY(-yRot) - .rotateX(xRot) + CachedPartialBuffers.partial(AllBlockPartials.TRAIN_COUPLING_HEAD, air) + .rotate(Direction.Axis.Y, Mth.DEG_TO_RAD * -yRot) + .rotate(Direction.Axis.X, Mth.DEG_TO_RAD * xRot) .light(lightCoords) .renderInto(ms, vb); @@ -86,9 +87,9 @@ public class CarriageCouplingRenderer { int couplingSegments = (int) Math.round(couplingDistance * 4); double stretch = ((anchor2.distanceTo(anchor) - 2 * margin) * 4) / couplingSegments; for (int j = 0; j < couplingSegments; j++) { - CachedBufferer.partial(AllBlockPartials.TRAIN_COUPLING_CABLE, air) - .rotateY(-yRot + 180) - .rotateX(-xRot) + CachedPartialBuffers.partial(AllBlockPartials.TRAIN_COUPLING_CABLE, air) + .rotate(Direction.Axis.Y, Mth.DEG_TO_RAD * (-yRot + 180)) + .rotate(Direction.Axis.X, Mth.DEG_TO_RAD * -xRot) .translate(0, 0, margin + 2 / 16f) .scale(1, 1, (float) stretch) .translate(0, 0, j / 4f) @@ -102,9 +103,9 @@ public class CarriageCouplingRenderer { ms.translate(-position.x, -position.y, -position.z); ms.translate(position2.x, position2.y, position2.z); ms.translate(anchor2.x, anchor2.y, anchor2.z); - CachedBufferer.partial(AllBlockPartials.TRAIN_COUPLING_HEAD, air) - .rotateY(-yRot + 180) - .rotateX(-xRot) + CachedPartialBuffers.partial(AllBlockPartials.TRAIN_COUPLING_HEAD, air) + .rotate(Direction.Axis.Y, Mth.DEG_TO_RAD * (-yRot + 180)) + .rotate(Direction.Axis.X, Mth.DEG_TO_RAD * -xRot) .light(lightCoords2) .renderInto(ms, vb); ms.popPose(); diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/Navigation.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/Navigation.java index 73090dbcda..55b20a67ff 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/entity/Navigation.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/Navigation.java @@ -31,11 +31,11 @@ import com.simibubi.create.content.logistics.trains.management.edgePoint.signal. import com.simibubi.create.content.logistics.trains.management.edgePoint.signal.SignalEdgeGroup; import com.simibubi.create.content.logistics.trains.management.edgePoint.signal.TrackEdgePoint; import com.simibubi.create.content.logistics.trains.management.edgePoint.station.GlobalStation; + import net.createmod.catnip.utility.Couple; import net.createmod.catnip.utility.Iterate; import net.createmod.catnip.utility.NBTHelper; import net.createmod.catnip.utility.Pair; - import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; import net.minecraft.util.Mth; diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/display/FlapDisplayRenderer.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/display/FlapDisplayRenderer.java index 675a7eb9dc..aeaeb46810 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/display/FlapDisplayRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/display/FlapDisplayRenderer.java @@ -11,9 +11,9 @@ import com.mojang.math.Matrix4f; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.foundation.render.CachedBufferer; -import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.CachedPartialBuffers; +import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.math.AngleHelper; import net.createmod.ponder.utility.WorldTickHolder; import net.minecraft.client.Minecraft; @@ -232,7 +232,7 @@ public class FlapDisplayRenderer extends KineticTileEntityRenderer { @Override protected SuperByteBuffer getRotatedModel(KineticTileEntity te, BlockState state) { - return CachedBufferer.partialFacingVertical(AllBlockPartials.SHAFTLESS_COGWHEEL, state, + return CachedPartialBuffers.partialFacingVertical(AllBlockPartials.SHAFTLESS_COGWHEEL, state, state.getValue(FlapDisplayBlock.HORIZONTAL_FACING)); } diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/TrackTargetingBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/TrackTargetingBehaviour.java index 75df6c09c4..240a8eded9 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/TrackTargetingBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/TrackTargetingBehaviour.java @@ -21,7 +21,7 @@ import com.simibubi.create.content.logistics.trains.management.edgePoint.signal. import com.simibubi.create.content.logistics.trains.management.edgePoint.signal.TrackEdgePoint; import com.simibubi.create.content.logistics.trains.track.BezierTrackPointLocation; import com.simibubi.create.content.logistics.trains.track.TrackTileEntity; -import com.simibubi.create.foundation.render.CachedBufferer; +import com.simibubi.create.foundation.render.CachedPartialBuffers; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType; @@ -327,7 +327,7 @@ public class TrackTargetingBehaviour extends TileEntit ITrackBlock track = (ITrackBlock) block; PartialModel partial = track.prepareTrackOverlay(level, pos, trackState, bezier, direction, ms, type); if (partial != null) - CachedBufferer.partial(partial, trackState) + CachedPartialBuffers.partial(partial, trackState) .translate(.5, 0, .5) .scale(scale) .translate(-.5, 0, -.5) diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/SignalEdgeGroup.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/SignalEdgeGroup.java index f2828d8179..8f1e04e0da 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/SignalEdgeGroup.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/SignalEdgeGroup.java @@ -13,8 +13,8 @@ import org.apache.commons.lang3.mutable.MutableInt; import com.google.common.base.Predicates; import com.simibubi.create.Create; import com.simibubi.create.content.logistics.trains.entity.Train; -import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.utility.NBTHelper; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/SignalPropagator.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/SignalPropagator.java index f1581b665e..a05c14f18c 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/SignalPropagator.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/SignalPropagator.java @@ -20,6 +20,7 @@ import com.simibubi.create.content.logistics.trains.TrackNodeLocation; import com.simibubi.create.content.logistics.trains.entity.Train; import com.simibubi.create.content.logistics.trains.management.edgePoint.EdgeData; import com.simibubi.create.content.logistics.trains.management.edgePoint.EdgePointType; + import net.createmod.catnip.utility.Couple; import net.createmod.catnip.utility.Iterate; import net.createmod.catnip.utility.Pair; diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/SignalRenderer.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/SignalRenderer.java index 506ec06b93..1145d93c52 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/SignalRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/SignalRenderer.java @@ -7,10 +7,10 @@ import com.simibubi.create.content.logistics.trains.management.edgePoint.TrackTa import com.simibubi.create.content.logistics.trains.management.edgePoint.TrackTargetingBehaviour.RenderedTrackOverlayType; import com.simibubi.create.content.logistics.trains.management.edgePoint.signal.SignalTileEntity.OverlayState; import com.simibubi.create.content.logistics.trains.management.edgePoint.signal.SignalTileEntity.SignalState; -import com.simibubi.create.foundation.render.CachedBufferer; +import com.simibubi.create.foundation.render.CachedPartialBuffers; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; -import net.createmod.ponder.utility.WorldTickHolder; +import net.createmod.ponder.utility.WorldTickHolder; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; @@ -32,10 +32,10 @@ public class SignalRenderer extends SafeTileEntityRenderer { float renderTime = WorldTickHolder.getRenderTime(te.getLevel()); if (signalState.isRedLight(renderTime)) - CachedBufferer.partial(AllBlockPartials.SIGNAL_ON, blockState) + CachedPartialBuffers.partial(AllBlockPartials.SIGNAL_ON, blockState) .renderInto(ms, buffer.getBuffer(RenderType.solid())); else - CachedBufferer.partial(AllBlockPartials.SIGNAL_OFF, blockState) + CachedPartialBuffers.partial(AllBlockPartials.SIGNAL_OFF, blockState) .light(light) .renderInto(ms, buffer.getBuffer(RenderType.solid())); diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/SignalTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/SignalTileEntity.java index 3910a33890..42f9d79256 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/SignalTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/signal/SignalTileEntity.java @@ -11,8 +11,8 @@ import com.simibubi.create.content.logistics.trains.management.edgePoint.TrackTa import com.simibubi.create.content.logistics.trains.management.edgePoint.signal.SignalBlock.SignalType; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.utility.NBTHelper; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.block.entity.BlockEntityType; diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationRenderer.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationRenderer.java index e71fdf1ed5..3598422716 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationRenderer.java @@ -9,10 +9,11 @@ import com.simibubi.create.content.logistics.block.depot.DepotRenderer; import com.simibubi.create.content.logistics.trains.ITrackBlock; import com.simibubi.create.content.logistics.trains.management.edgePoint.TrackTargetingBehaviour; import com.simibubi.create.content.logistics.trains.management.edgePoint.TrackTargetingBehaviour.RenderedTrackOverlayType; -import com.simibubi.create.foundation.render.CachedBufferer; -import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.CachedPartialBuffers; +import com.simibubi.create.foundation.render.FlwSuperByteBuffer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; +import net.createmod.catnip.render.SuperByteBuffer; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; @@ -48,7 +49,7 @@ public class StationRenderer extends SafeTileEntityRenderer { GlobalStation station = te.getStation(); boolean isAssembling = te.getBlockState() .getValue(StationBlock.ASSEMBLING); - + if (!isAssembling || (station == null || station.getPresentTrain() != null) && !te.isVirtual()) { renderFlag( te.flag.getValue(partialTicks) > 0.75f ? AllBlockPartials.STATION_ON : AllBlockPartials.STATION_OFF, te, @@ -68,7 +69,7 @@ public class StationRenderer extends SafeTileEntityRenderer { if (te.isVirtual() && te.bogeyLocations == null) te.refreshAssemblyInfo(); - + if (direction == null || te.assemblyLength == 0 || te.bogeyLocations == null) return; @@ -97,7 +98,7 @@ public class StationRenderer extends SafeTileEntityRenderer { if (valid != -1) { int lightColor = LevelRenderer.getLightColor(level, currentPos); - SuperByteBuffer sbb = CachedBufferer.partial(assemblyOverlay, trackState); + SuperByteBuffer sbb = CachedPartialBuffers.partial(assemblyOverlay, trackState); sbb.color(valid); sbb.light(lightColor); sbb.renderInto(ms, vb); @@ -113,13 +114,15 @@ public class StationRenderer extends SafeTileEntityRenderer { MultiBufferSource buffer, int light, int overlay) { if (!te.resolveFlagAngle()) return; - SuperByteBuffer flagBB = CachedBufferer.partial(flag, te.getBlockState()); - transformFlag(flagBB, te, partialTicks, te.flagYRot, te.flagFlipped); - flagBB.translate(0.5f / 16, 0, 0) - .rotateY(te.flagFlipped ? 0 : 180) - .translate(-0.5f / 16, 0, 0) - .light(light) - .renderInto(ms, buffer.getBuffer(RenderType.cutoutMipped())); + SuperByteBuffer flagBB = CachedPartialBuffers.partial(flag, te.getBlockState()); + FlwSuperByteBuffer.cast(flagBB).ifPresent(flwBuffer -> { + transformFlag(flwBuffer, te, partialTicks, te.flagYRot, te.flagFlipped); + flwBuffer.translate(0.5f / 16, 0, 0) + .rotateY(te.flagFlipped ? 0 : 180) + .translate(-0.5f / 16, 0, 0); + }); + + flagBB.light(light).renderInto(ms, buffer.getBuffer(RenderType.cutoutMipped())); } public static void transformFlag(Transform flag, StationTileEntity te, float partialTicks, int yRot, diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/TrainHatArmorLayer.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/TrainHatArmorLayer.java index 0f64e7599f..09ea459613 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/TrainHatArmorLayer.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/TrainHatArmorLayer.java @@ -7,7 +7,8 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Con import com.simibubi.create.content.logistics.trains.entity.CarriageContraption; import com.simibubi.create.content.logistics.trains.entity.CarriageContraptionEntity; import com.simibubi.create.foundation.mixin.accessor.AgeableListModelAccessor; -import com.simibubi.create.foundation.render.CachedBufferer; +import com.simibubi.create.foundation.render.CachedPartialBuffers; +import com.simibubi.create.foundation.render.FlwSuperByteBuffer; import net.createmod.catnip.utility.Couple; import net.minecraft.client.model.AgeableListModel; @@ -113,10 +114,11 @@ public class TrainHatArmorLayer ms.translate(0, -2.25f / 16f, 0); msr.rotateX(-8.5f); BlockState air = Blocks.AIR.defaultBlockState(); - CachedBufferer.partial(AllBlockPartials.TRAIN_HAT, air) + FlwSuperByteBuffer.cast(CachedPartialBuffers.partial(AllBlockPartials.TRAIN_HAT, air)).ifPresent(sbb -> sbb .forEntityRender() .light(light) - .renderInto(ms, buffer.getBuffer(renderType)); + .renderInto(ms, buffer.getBuffer(renderType)) + ); } ms.popPose(); diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/track/StandardBogeyBlock.java b/src/main/java/com/simibubi/create/content/logistics/trains/track/StandardBogeyBlock.java index 1b7a571ca8..9452a1d670 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/track/StandardBogeyBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/track/StandardBogeyBlock.java @@ -18,8 +18,9 @@ import com.simibubi.create.content.schematics.ItemRequirement; import com.simibubi.create.content.schematics.ItemRequirement.ItemUseType; import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.block.ProperWaterloggedBlock; -import com.simibubi.create.foundation.render.CachedBufferer; +import com.simibubi.create.foundation.render.CachedPartialBuffers; +import net.createmod.catnip.render.CachedBlockBuffers; import net.createmod.catnip.utility.Iterate; import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.renderer.MultiBufferSource; @@ -27,6 +28,7 @@ import net.minecraft.client.renderer.RenderType; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; +import net.minecraft.util.Mth; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.BlockGetter; @@ -132,12 +134,10 @@ public class StandardBogeyBlock extends Block BlockState air = Blocks.AIR.defaultBlockState(); for (int i : Iterate.zeroAndOne) - CachedBufferer.block(AllBlocks.SHAFT.getDefaultState() + CachedBlockBuffers.block(AllBlocks.SHAFT.getDefaultState() .setValue(ShaftBlock.AXIS, Axis.Z)) .translate(-.5f, .25f, i * -1) - .centre() - .rotateZ(wheelAngle) - .unCentre() + .rotateCentered(Axis.Z, Mth.DEG_TO_RAD * wheelAngle) .light(light) .renderInto(ms, vb); @@ -149,16 +149,16 @@ public class StandardBogeyBlock extends Block } private void renderBogey(float wheelAngle, PoseStack ms, int light, VertexConsumer vb, BlockState air) { - CachedBufferer.partial(AllBlockPartials.BOGEY_FRAME, air) + CachedPartialBuffers.partial(AllBlockPartials.BOGEY_FRAME, air) .scale(1 - 1 / 512f) .light(light) .renderInto(ms, vb); for (int side : Iterate.positiveAndNegative) { ms.pushPose(); - CachedBufferer.partial(AllBlockPartials.SMALL_BOGEY_WHEELS, air) + CachedPartialBuffers.partial(AllBlockPartials.SMALL_BOGEY_WHEELS, air) .translate(0, 12 / 16f, side) - .rotateX(wheelAngle) + .rotate(Axis.X, Mth.DEG_TO_RAD * wheelAngle) .light(light) .renderInto(ms, vb); ms.popPose(); @@ -167,35 +167,33 @@ public class StandardBogeyBlock extends Block private void renderLargeBogey(float wheelAngle, PoseStack ms, int light, VertexConsumer vb, BlockState air) { for (int i : Iterate.zeroAndOne) - CachedBufferer.block(AllBlocks.SHAFT.getDefaultState() + CachedBlockBuffers.block(AllBlocks.SHAFT.getDefaultState() .setValue(ShaftBlock.AXIS, Axis.X)) .translate(-.5f, .25f, .5f + i * -2) - .centre() - .rotateX(wheelAngle) - .unCentre() + .rotateCentered(Axis.X, Mth.DEG_TO_RAD * wheelAngle) .light(light) .renderInto(ms, vb); - CachedBufferer.partial(AllBlockPartials.BOGEY_DRIVE, air) + CachedPartialBuffers.partial(AllBlockPartials.BOGEY_DRIVE, air) .scale(1 - 1 / 512f) .light(light) .renderInto(ms, vb); - CachedBufferer.partial(AllBlockPartials.BOGEY_PISTON, air) + CachedPartialBuffers.partial(AllBlockPartials.BOGEY_PISTON, air) .translate(0, 0, 1 / 4f * Math.sin(AngleHelper.rad(wheelAngle))) .light(light) .renderInto(ms, vb); ms.pushPose(); - CachedBufferer.partial(AllBlockPartials.LARGE_BOGEY_WHEELS, air) + CachedPartialBuffers.partial(AllBlockPartials.LARGE_BOGEY_WHEELS, air) .translate(0, 1, 0) - .rotateX(wheelAngle) + .rotate(Axis.X, Mth.DEG_TO_RAD * wheelAngle) .light(light) .renderInto(ms, vb); - CachedBufferer.partial(AllBlockPartials.BOGEY_PIN, air) + CachedPartialBuffers.partial(AllBlockPartials.BOGEY_PIN, air) .translate(0, 1, 0) - .rotateX(wheelAngle) + .rotate(Axis.X, Mth.DEG_TO_RAD * wheelAngle) .translate(0, 1 / 4f, 0) - .rotateX(-wheelAngle) + .rotate(Axis.X, Mth.DEG_TO_RAD * -wheelAngle) .light(light) .renderInto(ms, vb); ms.popPose(); 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 bbe999bc52..771c100cce 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 @@ -15,7 +15,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.foundation.render.CachedBufferer; +import com.simibubi.create.foundation.render.CachedPartialBuffers; +import com.simibubi.create.foundation.render.FlwSuperByteBuffer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import net.createmod.catnip.utility.Iterate; @@ -66,19 +67,20 @@ public class TrackRenderer extends SafeTileEntityRenderer { SegmentAngles segment = segments[i]; int light = LevelRenderer.getLightColor(level, segment.lightPosition.offset(tePosition)); - CachedBufferer.partial(TRACK_TIE, air) + FlwSuperByteBuffer.cast(CachedPartialBuffers.partial(TRACK_TIE, air)).ifPresent(sbb -> sbb .mulPose(segment.tieTransform.pose()) .mulNormal(segment.tieTransform.normal()) .light(light) - .renderInto(ms, vb); + .renderInto(ms, vb) + ); for (boolean first : Iterate.trueAndFalse) { Pose transform = segment.railTransforms.get(first); - CachedBufferer.partial(first ? TRACK_SEGMENT_LEFT : TRACK_SEGMENT_RIGHT, air) - .mulPose(transform.pose()) + FlwSuperByteBuffer.cast(CachedPartialBuffers.partial(first ? TRACK_SEGMENT_LEFT : TRACK_SEGMENT_RIGHT, air)).ifPresent(sbb -> sbb .mulPose(transform.pose()) .mulNormal(transform.normal()) .light(light) - .renderInto(ms, vb); + .renderInto(ms, vb) + ); } } @@ -99,20 +101,22 @@ public class TrackRenderer extends SafeTileEntityRenderer { for (boolean first : Iterate.trueAndFalse) { Pose beamTransform = segment.beams.get(first); - CachedBufferer.partial(GIRDER_SEGMENT_MIDDLE, air) + FlwSuperByteBuffer.cast(CachedPartialBuffers.partial(GIRDER_SEGMENT_MIDDLE, air)).ifPresent(sbb -> sbb .mulPose(beamTransform.pose()) .mulNormal(beamTransform.normal()) .light(light) - .renderInto(ms, vb); + .renderInto(ms, vb) + ); for (boolean top : Iterate.trueAndFalse) { Pose beamCapTransform = segment.beamCaps.get(top) .get(first); - CachedBufferer.partial(top ? GIRDER_SEGMENT_TOP : GIRDER_SEGMENT_BOTTOM, air) + FlwSuperByteBuffer.cast(CachedPartialBuffers.partial(top ? GIRDER_SEGMENT_TOP : GIRDER_SEGMENT_BOTTOM, air)).ifPresent(sbb -> sbb .mulPose(beamCapTransform.pose()) .mulNormal(beamCapTransform.normal()) .light(light) - .renderInto(ms, vb); + .renderInto(ms, vb) + ); } } } diff --git a/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonRenderer.java b/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonRenderer.java index f41be97540..ae7bf5bd4e 100644 --- a/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonRenderer.java +++ b/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonRenderer.java @@ -12,10 +12,10 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.content.schematics.block.LaunchedItem.ForBelt; import com.simibubi.create.content.schematics.block.LaunchedItem.ForBlockState; import com.simibubi.create.content.schematics.block.LaunchedItem.ForEntity; -import com.simibubi.create.foundation.render.CachedBufferer; -import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.CachedPartialBuffers; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; +import net.createmod.catnip.render.SuperByteBuffer; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; @@ -57,14 +57,14 @@ public class SchematicannonRenderer extends SafeTileEntityRenderer ENTRY_CACHE = new HashMap<>(); + //private static final Map ENTRY_CACHE = new HashMap<>(); public static CTSpriteShiftEntry getCT(CTType type, ResourceLocation blockTexture, ResourceLocation connectedTexture) { String key = blockTexture + "->" + connectedTexture + "+" + type.getId(); if (ENTRY_CACHE.containsKey(key)) return (CTSpriteShiftEntry) ENTRY_CACHE.get(key); - CTSpriteShiftEntry entry = new CTSpriteShiftEntry(type); - entry.set(blockTexture, connectedTexture); + CTSpriteShiftEntry entry = new CTSpriteShiftEntry(type, blockTexture, connectedTexture); ENTRY_CACHE.put(key, entry); return entry; } diff --git a/src/main/java/com/simibubi/create/foundation/block/render/SpriteShiftEntry.java b/src/main/java/com/simibubi/create/foundation/block/render/SpriteShiftEntry.java deleted file mode 100644 index 537ff9d68f..0000000000 --- a/src/main/java/com/simibubi/create/foundation/block/render/SpriteShiftEntry.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.simibubi.create.foundation.block.render; - -import com.jozufozu.flywheel.core.StitchedSprite; - -import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.resources.ResourceLocation; - -public class SpriteShiftEntry { - protected StitchedSprite original; - protected StitchedSprite target; - - public void set(ResourceLocation originalTextureLocation, ResourceLocation targetTextureLocation) { - original = new StitchedSprite(originalTextureLocation); - target = new StitchedSprite(targetTextureLocation); - } - - public ResourceLocation getOriginalResourceLocation() { - return original.getLocation(); - } - - public ResourceLocation getTargetResourceLocation() { - return target.getLocation(); - } - - public TextureAtlasSprite getOriginal() { - return original.get(); - } - - public TextureAtlasSprite getTarget() { - return target.get(); - } - - public float getTargetU(float localU) { - return getTarget().getU(getUnInterpolatedU(getOriginal(), localU)); - } - - public float getTargetV(float localV) { - return getTarget().getV(getUnInterpolatedV(getOriginal(), localV)); - } - - public static float getUnInterpolatedU(TextureAtlasSprite sprite, float u) { - float f = sprite.getU1() - sprite.getU0(); - return (u - sprite.getU0()) / f * 16.0F; - } - - public static float getUnInterpolatedV(TextureAtlasSprite sprite, float v) { - float f = sprite.getV1() - sprite.getV0(); - return (v - sprite.getV0()) / f * 16.0F; - } -} diff --git a/src/main/java/com/simibubi/create/foundation/block/render/SpriteShifter.java b/src/main/java/com/simibubi/create/foundation/block/render/SpriteShifter.java deleted file mode 100644 index 0b97d60b78..0000000000 --- a/src/main/java/com/simibubi/create/foundation/block/render/SpriteShifter.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.simibubi.create.foundation.block.render; - -import java.util.HashMap; -import java.util.Map; - -import net.minecraft.resources.ResourceLocation; - -public class SpriteShifter { - - private static final Map ENTRY_CACHE = new HashMap<>(); - - public static SpriteShiftEntry get(ResourceLocation originalLocation, ResourceLocation targetLocation) { - String key = originalLocation + "->" + targetLocation; - if (ENTRY_CACHE.containsKey(key)) - return ENTRY_CACHE.get(key); - - SpriteShiftEntry entry = new SpriteShiftEntry(); - entry.set(originalLocation, targetLocation); - ENTRY_CACHE.put(key, entry); - return entry; - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/command/ClearBufferCacheCommand.java b/src/main/java/com/simibubi/create/foundation/command/ClearBufferCacheCommand.java index 34a47169c0..755e5e48a4 100644 --- a/src/main/java/com/simibubi/create/foundation/command/ClearBufferCacheCommand.java +++ b/src/main/java/com/simibubi/create/foundation/command/ClearBufferCacheCommand.java @@ -3,6 +3,7 @@ package com.simibubi.create.foundation.command; import com.mojang.brigadier.builder.ArgumentBuilder; import com.simibubi.create.CreateClient; +import net.createmod.catnip.CatnipClient; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; import net.minecraft.network.chat.TextComponent; @@ -25,6 +26,7 @@ public class ClearBufferCacheCommand { @OnlyIn(Dist.CLIENT) private static void execute() { + CatnipClient.invalidateRenderers(); CreateClient.invalidateRenderers(); } } diff --git a/src/main/java/com/simibubi/create/foundation/render/BakedModelRenderHelper.java b/src/main/java/com/simibubi/create/foundation/render/BakedModelRenderHelper.java deleted file mode 100644 index aa8300cde5..0000000000 --- a/src/main/java/com/simibubi/create/foundation/render/BakedModelRenderHelper.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.simibubi.create.foundation.render; - -import com.jozufozu.flywheel.core.model.ModelUtil; -import com.mojang.blaze3d.vertex.BufferBuilder; -import com.mojang.blaze3d.vertex.PoseStack; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.block.BlockRenderDispatcher; -import net.minecraft.client.resources.model.BakedModel; -import net.minecraft.world.level.block.state.BlockState; - -public class BakedModelRenderHelper { - - public static SuperByteBuffer standardBlockRender(BlockState renderedState) { - BlockRenderDispatcher dispatcher = Minecraft.getInstance() - .getBlockRenderer(); - return standardModelRender(dispatcher.getBlockModel(renderedState), renderedState); - } - - public static SuperByteBuffer standardModelRender(BakedModel model, BlockState referenceState) { - return standardModelRender(model, referenceState, new PoseStack()); - } - - public static SuperByteBuffer standardModelRender(BakedModel model, BlockState referenceState, PoseStack ms) { - BufferBuilder builder = ModelUtil.getBufferBuilder(model, referenceState, ms); - return new SuperByteBuffer(builder); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/render/CachedBufferer.java b/src/main/java/com/simibubi/create/foundation/render/CachedPartialBuffers.java similarity index 69% rename from src/main/java/com/simibubi/create/foundation/render/CachedBufferer.java rename to src/main/java/com/simibubi/create/foundation/render/CachedPartialBuffers.java index de205a5f69..248925090f 100644 --- a/src/main/java/com/simibubi/create/foundation/render/CachedBufferer.java +++ b/src/main/java/com/simibubi/create/foundation/render/CachedPartialBuffers.java @@ -9,36 +9,28 @@ import org.apache.commons.lang3.tuple.Pair; import com.jozufozu.flywheel.core.PartialModel; import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.CreateClient; -import com.simibubi.create.foundation.render.SuperByteBufferCache.Compartment; +import net.createmod.catnip.render.SuperBufferFactory; +import net.createmod.catnip.render.SuperByteBuffer; +import net.createmod.catnip.render.SuperByteBufferCache; +import net.createmod.catnip.render.SuperByteBufferCache.Compartment; import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.core.Direction; import net.minecraft.world.level.block.state.BlockState; -public class CachedBufferer { - - public static final Compartment GENERIC_TILE = new Compartment<>(); +public class CachedPartialBuffers { public static final Compartment PARTIAL = new Compartment<>(); public static final Compartment> DIRECTIONAL_PARTIAL = new Compartment<>(); - public static SuperByteBuffer block(BlockState toRender) { - return block(GENERIC_TILE, toRender); - } - - public static SuperByteBuffer block(Compartment compartment, BlockState toRender) { - return CreateClient.BUFFER_CACHE.get(compartment, toRender, () -> BakedModelRenderHelper.standardBlockRender(toRender)); - } - public static SuperByteBuffer partial(PartialModel partial, BlockState referenceState) { - return CreateClient.BUFFER_CACHE.get(PARTIAL, partial, - () -> BakedModelRenderHelper.standardModelRender(partial.get(), referenceState)); + return SuperByteBufferCache.getInstance().get(PARTIAL, partial, + () -> SuperBufferFactory.getInstance().createForBlock(partial.get(), referenceState)); } public static SuperByteBuffer partial(PartialModel partial, BlockState referenceState, Supplier modelTransform) { - return CreateClient.BUFFER_CACHE.get(PARTIAL, partial, - () -> BakedModelRenderHelper.standardModelRender(partial.get(), referenceState, modelTransform.get())); + return SuperByteBufferCache.getInstance().get(PARTIAL, partial, + () -> SuperBufferFactory.getInstance().createForBlock(partial.get(), referenceState, modelTransform.get())); } public static SuperByteBuffer partialFacing(PartialModel partial, BlockState referenceState) { @@ -58,8 +50,8 @@ public class CachedBufferer { public static SuperByteBuffer partialDirectional(PartialModel partial, BlockState referenceState, Direction dir, Supplier modelTransform) { - return CreateClient.BUFFER_CACHE.get(DIRECTIONAL_PARTIAL, Pair.of(dir, partial), - () -> BakedModelRenderHelper.standardModelRender(partial.get(), referenceState, modelTransform.get())); + return SuperByteBufferCache.getInstance().get(DIRECTIONAL_PARTIAL, Pair.of(dir, partial), + () -> SuperBufferFactory.getInstance().createForBlock(partial.get(), referenceState, modelTransform.get())); } public static Supplier rotateToFace(Direction facing) { @@ -85,5 +77,4 @@ public class CachedBufferer { return stack; }; } - } diff --git a/src/main/java/com/simibubi/create/foundation/render/FlwSuperBufferFactory.java b/src/main/java/com/simibubi/create/foundation/render/FlwSuperBufferFactory.java new file mode 100644 index 0000000000..c7137ff8ea --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/FlwSuperBufferFactory.java @@ -0,0 +1,28 @@ +package com.simibubi.create.foundation.render; + +import javax.annotation.ParametersAreNonnullByDefault; + +import com.jozufozu.flywheel.core.model.ModelUtil; +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.PoseStack; + +import net.createmod.catnip.render.SuperBufferFactory; +import net.createmod.catnip.render.SuperByteBuffer; +import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.world.level.block.state.BlockState; + +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +public class FlwSuperBufferFactory implements SuperBufferFactory { + + @Override + public SuperByteBuffer create(BufferBuilder builder) { + return new FlwSuperByteBuffer(builder); + } + + @Override + public SuperByteBuffer createForBlock(BakedModel model, BlockState referenceState, PoseStack ms) { + return create(ModelUtil.getBufferBuilder(model, referenceState, ms)); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/SuperByteBuffer.java b/src/main/java/com/simibubi/create/foundation/render/FlwSuperByteBuffer.java similarity index 79% rename from src/main/java/com/simibubi/create/foundation/render/SuperByteBuffer.java rename to src/main/java/com/simibubi/create/foundation/render/FlwSuperByteBuffer.java index 85897cf5a4..42dbc27b1f 100644 --- a/src/main/java/com/simibubi/create/foundation/render/SuperByteBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/FlwSuperByteBuffer.java @@ -1,7 +1,10 @@ package com.simibubi.create.foundation.render; +import java.util.Optional; import java.util.function.IntPredicate; +import javax.annotation.ParametersAreNonnullByDefault; + import com.jozufozu.flywheel.api.vertex.ShadedVertexList; import com.jozufozu.flywheel.api.vertex.VertexList; import com.jozufozu.flywheel.backend.ShadersModHandler; @@ -18,11 +21,12 @@ import com.mojang.math.Matrix4f; import com.mojang.math.Quaternion; import com.mojang.math.Vector3f; import com.mojang.math.Vector4f; -import com.simibubi.create.foundation.block.render.SpriteShiftEntry; import it.unimi.dsi.fastutil.longs.Long2IntMap; import it.unimi.dsi.fastutil.longs.Long2IntOpenHashMap; -import net.createmod.catnip.utility.theme.Color; +import net.createmod.catnip.render.SpriteShiftEntry; +import net.createmod.catnip.render.SuperByteBuffer; +import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.LightTexture; @@ -32,7 +36,10 @@ import net.minecraft.core.Direction; import net.minecraft.util.Mth; import net.minecraft.world.level.Level; -public class SuperByteBuffer implements Transform, TStack { +@SuppressWarnings("unchecked") +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +public class FlwSuperByteBuffer implements Transform, TStack, SuperByteBuffer { private final VertexList template; private final IntPredicate shadedPredicate; @@ -66,7 +73,7 @@ public class SuperByteBuffer implements Transform, TStack, TStack, TStack, TStack, TStack, TStack> 16) & 0xFF); g = ((color >> 8) & 0xFF); @@ -328,37 +352,27 @@ public class SuperByteBuffer implements Transform, TStack { - builder.uv(entry.getTargetU(u), entry.getTargetV(v)); - }; + public FlwSuperByteBuffer shiftUV(SpriteShiftEntry entry) { + this.spriteShiftFunc = (builder, u, v) -> builder.uv(entry.getTargetU(u), entry.getTargetV(v)); return this; } - public SuperByteBuffer shiftUVScrolling(SpriteShiftEntry entry, float scrollV) { - return this.shiftUVScrolling(entry, 0, scrollV); - } - - public SuperByteBuffer shiftUVScrolling(SpriteShiftEntry entry, float scrollU, float scrollV) { + public FlwSuperByteBuffer shiftUVScrolling(SpriteShiftEntry entry, float scrollU, float scrollV) { this.spriteShiftFunc = (builder, u, v) -> { float targetU = u - entry.getOriginal() .getU0() + entry.getTarget() @@ -373,7 +387,7 @@ public class SuperByteBuffer implements Transform, TStack { float targetU = entry.getTarget() .getU((SpriteShiftEntry.getUnInterpolatedU(entry.getOriginal(), u) / sheetSize) + uTarget * 16); @@ -384,46 +398,40 @@ public class SuperByteBuffer implements Transform, TStack, TStack cast(SuperByteBuffer buffer) { + if (!(buffer instanceof FlwSuperByteBuffer flwBuffer)) + return Optional.empty(); + + return Optional.of(flwBuffer); + } + public static int transformColor(byte component, float scale) { return Mth.clamp((int) (Byte.toUnsignedInt(component) * scale), 0, 255); } @@ -465,14 +480,4 @@ public class SuperByteBuffer implements Transform, TStack LevelRenderer.getLightColor(world, pos)); } - @FunctionalInterface - public interface SpriteShiftFunc { - void shift(VertexConsumer builder, float u, float v); - } - - @FunctionalInterface - public interface VertexLighter { - int getPackedLight(float x, float y, float z); - } - } diff --git a/src/main/java/com/simibubi/create/foundation/render/SuperByteBufferCache.java b/src/main/java/com/simibubi/create/foundation/render/SuperByteBufferCache.java deleted file mode 100644 index f11ea9b945..0000000000 --- a/src/main/java/com/simibubi/create/foundation/render/SuperByteBufferCache.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.simibubi.create.foundation.render; - -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; - -import com.google.common.cache.Cache; -import com.google.common.cache.CacheBuilder; - -public class SuperByteBufferCache { - - protected final Map, Cache> caches = new HashMap<>(); - - public synchronized void registerCompartment(Compartment compartment) { - caches.put(compartment, CacheBuilder.newBuilder() - .build()); - } - - public synchronized void registerCompartment(Compartment compartment, long ticksUntilExpired) { - caches.put(compartment, CacheBuilder.newBuilder() - .expireAfterAccess(ticksUntilExpired * 50, TimeUnit.MILLISECONDS) - .build()); - } - - public SuperByteBuffer get(Compartment compartment, T key, Callable callable) { - Cache cache = caches.get(compartment); - if (cache != null) { - try { - return cache.get(key, callable); - } catch (ExecutionException e) { - e.printStackTrace(); - } - } - return null; - } - - public void invalidate(Compartment compartment, T key) { - caches.get(compartment).invalidate(key); - } - - public void invalidate(Compartment compartment) { - caches.get(compartment).invalidateAll(); - } - - public void invalidate() { - caches.forEach((compartment, cache) -> cache.invalidateAll()); - } - - public static class Compartment { - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/render/TileEntityRenderHelper.java b/src/main/java/com/simibubi/create/foundation/render/TileEntityRenderHelper.java index b8d322de42..4484f6434b 100644 --- a/src/main/java/com/simibubi/create/foundation/render/TileEntityRenderHelper.java +++ b/src/main/java/com/simibubi/create/foundation/render/TileEntityRenderHelper.java @@ -107,7 +107,7 @@ public class TileEntityRenderHelper { if (renderWorld != null) { int renderWorldLight = LevelRenderer.getLightColor(renderWorld, renderWorldPos); - return SuperByteBuffer.maxLight(worldLight, renderWorldLight); + return FlwSuperByteBuffer.maxLight(worldLight, renderWorldLight); } return worldLight; diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/renderer/ColoredOverlayTileEntityRenderer.java b/src/main/java/com/simibubi/create/foundation/tileEntity/renderer/ColoredOverlayTileEntityRenderer.java index 8ba1894acc..5e9fcc2743 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/renderer/ColoredOverlayTileEntityRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/renderer/ColoredOverlayTileEntityRenderer.java @@ -2,8 +2,8 @@ package com.simibubi.create.foundation.tileEntity.renderer; import com.jozufozu.flywheel.backend.Backend; import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.foundation.render.SuperByteBuffer; +import net.createmod.catnip.render.SuperByteBuffer; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; From c8531b1c2afc6e7cf51326e003c7474aa389f17c Mon Sep 17 00:00:00 2001 From: zelophed Date: Mon, 19 Sep 2022 13:30:37 +0200 Subject: [PATCH 005/515] bump catnip and ponder version --- gradle.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index e10fc3e226..e40eff626f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -24,8 +24,8 @@ jei_minecraft_version = 1.18.2 jei_version = 9.5.3.143 curios_minecraft_version = 1.18.2 curios_version = 5.0.7.0 -catnip_version = 0.5.0 -ponder_version = 0.5.0 +catnip_version = 0.5.4 +ponder_version = 0.5.5 # curseforge information projectId = 328085 From 9791cf51adc9b012f31e1b84809db7e027c30ef9 Mon Sep 17 00:00:00 2001 From: zelophed Date: Sun, 2 Oct 2022 22:27:06 +0200 Subject: [PATCH 006/515] Pondering Alone, Part IV - refactor PonderTagIndexScreen to include tags from all mods, not just create - fix missing translations and incorrect color themes on backstep/think-back buttons - modify shared text to be part of ponder plugins instead - add the vanilla panorama as a default to configUI in menus - allow the ponder command to open the ponder tag index as well as regular index - sort ponder index elements by their resource location --- build.gradle | 7 + gradle.properties | 4 +- src/generated/resources/.cache/cache | 1544 ++++++++--------- .../resources/assets/create/lang/en_us.json | 22 +- .../assets/create/lang/unfinished/de_de.json | 24 +- .../assets/create/lang/unfinished/es_cl.json | 22 +- .../assets/create/lang/unfinished/es_es.json | 22 +- .../assets/create/lang/unfinished/fr_fr.json | 24 +- .../assets/create/lang/unfinished/it_it.json | 24 +- .../assets/create/lang/unfinished/ja_jp.json | 22 +- .../assets/create/lang/unfinished/ko_kr.json | 22 +- .../assets/create/lang/unfinished/nl_nl.json | 24 +- .../assets/create/lang/unfinished/pl_pl.json | 22 +- .../assets/create/lang/unfinished/pt_br.json | 24 +- .../assets/create/lang/unfinished/pt_pt.json | 24 +- .../assets/create/lang/unfinished/ro_ro.json | 22 +- .../assets/create/lang/unfinished/ru_ru.json | 24 +- .../assets/create/lang/unfinished/zh_cn.json | 22 +- .../assets/create/lang/unfinished/zh_tw.json | 22 +- src/main/java/com/simibubi/create/Create.java | 7 +- .../com/simibubi/create/CreateClient.java | 33 +- .../simibubi/create/events/ClientEvents.java | 12 - .../foundation/ponder/CreatePonderPlugin.java | 20 + .../ponder/CreateSharedPonderText.java | 26 - .../assets/create/lang/default/interface.json | 2 + 25 files changed, 877 insertions(+), 1144 deletions(-) delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/CreateSharedPonderText.java diff --git a/build.gradle b/build.gradle index c7718175a5..38f2608202 100644 --- a/build.gradle +++ b/build.gradle @@ -148,6 +148,13 @@ minecraft { } } + if (catnipInWorkspace) { + catnip { + source project(":catnip:Common").sourceSets.main + source project(":catnip:Forge").sourceSets.main + } + } + if (ponderInWorkspace) { ponder { source project(":Ponder:Common").sourceSets.main diff --git a/gradle.properties b/gradle.properties index e40eff626f..9ea2bef643 100644 --- a/gradle.properties +++ b/gradle.properties @@ -24,8 +24,8 @@ jei_minecraft_version = 1.18.2 jei_version = 9.5.3.143 curios_minecraft_version = 1.18.2 curios_version = 5.0.7.0 -catnip_version = 0.5.4 -ponder_version = 0.5.5 +catnip_version = 0.5.5 +ponder_version = 0.5.6 # curseforge information projectId = 328085 diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 5bf871ea3e..7f22e8c23f 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -559,22 +559,22 @@ bf2b0310500213ff853c748c236eb5d01f61658e assets/create/blockstates/yellow_toolbo 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json f85edc574ee6de0de7693ffb031266643db6724a assets/create/lang/en_ud.json -f9fcf3163210806f6cea642b13d36632f3f3c533 assets/create/lang/en_us.json -fcf6c0723f89de67ab5f30e01305522b236bd824 assets/create/lang/unfinished/de_de.json -9083ade329d6b2c7469339f2c7ab54d7866f90ff assets/create/lang/unfinished/es_cl.json -db21f76f89573602c77b988371453013bac530cb assets/create/lang/unfinished/es_es.json -b1ed4fc7258f6fb93127e84ed4364f7cc224be2b assets/create/lang/unfinished/fr_fr.json -7cf94dae2536d27f32cfe7aad3a9a9eb7b9978ac assets/create/lang/unfinished/it_it.json -b8252343025f1555ae717e03b7503bfd9c1069f7 assets/create/lang/unfinished/ja_jp.json -bcc01ee88c1877e46f280c967d92b506d328b08d assets/create/lang/unfinished/ko_kr.json -4fd2bf884f18bf833d9819aed2f6fe83cc8ea9a6 assets/create/lang/unfinished/nl_nl.json -e32d5b48ca498b97e036f5cdf0f3b4192b478adf assets/create/lang/unfinished/pl_pl.json -f9d8fdca30725e5e340f7c2727eb3da197081a25 assets/create/lang/unfinished/pt_br.json -f5648cf550a440d2c60dcb7f8b4605d89f0f9713 assets/create/lang/unfinished/pt_pt.json -6f283e7589df6c2293be271846535887bf5a288c assets/create/lang/unfinished/ro_ro.json -119f9953874f07d016fd9602510221de0cd1730b assets/create/lang/unfinished/ru_ru.json -6a5ab805701021b67b4585f0ae014e4b509d8c45 assets/create/lang/unfinished/zh_cn.json -a6eff86622e24eda8f490587734c19526d0c6ecf assets/create/lang/unfinished/zh_tw.json +73d94f88de387c8824e08fc42cb9d86c731fcc4f assets/create/lang/en_us.json +1a76a185f3d3b4660d57e7912b86dfd6b489bf15 assets/create/lang/unfinished/de_de.json +cfaa87f761bece4e778cdb2f3428f303c656da51 assets/create/lang/unfinished/es_cl.json +bb4233a8e3c2dfb596f40317fc41101f5249b50b assets/create/lang/unfinished/es_es.json +d6b68099aed4b9890f4465432bf387fadcd873e4 assets/create/lang/unfinished/fr_fr.json +28e0397cf0f57c153cd533622c9c4e735c70f8f4 assets/create/lang/unfinished/it_it.json +45fb1861a4d3f66017447c2fda7d3c48dcc5172b assets/create/lang/unfinished/ja_jp.json +d33f475d0c7f5b6a84acaac27afe5f7e8241fde5 assets/create/lang/unfinished/ko_kr.json +90409353d58de8acec379b2c05750ceb39b2cc80 assets/create/lang/unfinished/nl_nl.json +06fb202632d371a56b7c2c68bb77bd969d193216 assets/create/lang/unfinished/pl_pl.json +6bc293e500c05ab52b22991e06438eae7b38e419 assets/create/lang/unfinished/pt_br.json +f1a4f7903a9e7432a5f01971253266fc2555c58b assets/create/lang/unfinished/pt_pt.json +5d3611ac242099a3d9ba1f364c05756e00cd604f assets/create/lang/unfinished/ro_ro.json +4176728a0a46ffd42cd695041d8004e47aef57a5 assets/create/lang/unfinished/ru_ru.json +eb67684ce01f5f71fcbde60b7023c6981587e473 assets/create/lang/unfinished/zh_cn.json +5e70ef5f3740550b5c75e53d92ee62b417dec770 assets/create/lang/unfinished/zh_tw.json 487a511a01b2a4531fb672f917922312db78f958 assets/create/models/block/acacia_window.json b48060cba1a382f373a05bf0039054053eccf076 assets/create/models/block/acacia_window_pane_noside.json 3066db1bf03cffa1a9c7fbacf47ae586632f4eb3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -2305,10 +2305,20 @@ cbe6b6d0eb188a8c0600b54cee860116d305e905 data/create/advancements/recipes/buildi 34ceb3033f5f41a5fdffeea0a3adead36748f65a data/create/advancements/recipes/building_blocks/smelting/nickel_ingot_compat_thermal.json edb22e0bb018cf00e51f37d912939207c4bf5ac5 data/create/advancements/recipes/building_blocks/smelting/silver_ingot_compat_thermal.json f10041d864bfb1e6f017e442ae85ee9503b3f5a4 data/create/advancements/recipes/building_blocks/smelting/tin_ingot_compat_thermal.json +e7134f9dd47eb9f706f1ec1bd886a14eb7d3010a data/create/advancements/recipes/create.base/acacia_window.json +abeb5dfa9931aac86b080309bd0ed5397fd1254b data/create/advancements/recipes/create.base/acacia_window_pane.json +60545d0d6d70b4be2a22b03b09de45c6d4f7434b data/create/advancements/recipes/create.base/andesite_pillar_from_andesite_stonecutting.json +e742f68e9374ad009cd0325094b113c83570bcd2 data/create/advancements/recipes/create.base/andesite_pillar_from_stone_types_andesite_stonecutting.json +72ec3cf271a07b0bd4d63265904280e8607c052d data/create/advancements/recipes/create.base/asurine_pillar_from_asurine_stonecutting.json +f1ba98fa90ae0b81cef3e8bfed4a63565539b4a2 data/create/advancements/recipes/create.base/asurine_pillar_from_stone_types_asurine_stonecutting.json +2e69af13ca72acd06ceb1079a371add27a1c0db0 data/create/advancements/recipes/create.base/birch_window.json +62772c540e195fc6b8cfa91f9ae32898c649f93e data/create/advancements/recipes/create.base/birch_window_pane.json ba80332510acab3f60f30d8b802ee2d450fd51b9 data/create/advancements/recipes/create.base/blasting/zinc_ingot_from_crushed.json 4bb60ef5e186f12a9d52e61319db8c78300c64ab data/create/advancements/recipes/create.base/blasting/zinc_ingot_from_ore.json 00ff89f208cb9023d7a2657c43d267e21755fb2e data/create/advancements/recipes/create.base/blasting/zinc_ingot_from_raw_ore.json 13ce2dba955de3b6b943fa406e3dde6863093820 data/create/advancements/recipes/create.base/brass_ladder_from_plates_brass_stonecutting.json +bfa045d74386df70fd1130c934ed814376442dee data/create/advancements/recipes/create.base/calcite_pillar_from_calcite_stonecutting.json +7d0d2554ea3e646941a1ed59c8f5e9d45f9d76d6 data/create/advancements/recipes/create.base/calcite_pillar_from_stone_types_calcite_stonecutting.json 1dea56b4759da676f0edf0878ec834a4129d110b data/create/advancements/recipes/create.base/copper_ladder_from_plates_copper_stonecutting.json 19b18800dfc55508e250ebb87fbaa70510736834 data/create/advancements/recipes/create.base/copper_shingle_slab.json 0a8b2f2e35c128e470d0fd1a886b9d6ca2e99483 data/create/advancements/recipes/create.base/copper_shingle_slab_from_copper_shingles_stonecutting.json @@ -2539,10 +2549,359 @@ d8a83ace588c01d781fea3e62fa3762ee04e0250 data/create/advancements/recipes/create 827269a9749c37af9221d27281a85de09942fa2a data/create/advancements/recipes/create.base/crafting/materials/zinc_ingot_from_compacting.json b15e93ea48cc71a78dca4d5fa5738d5354a3a944 data/create/advancements/recipes/create.base/crafting/materials/zinc_ingot_from_decompacting.json b13ffffe311c3e16c3577aeeca881a04aeed7ee6 data/create/advancements/recipes/create.base/crafting/materials/zinc_nugget_from_decompacting.json +265595b70feaec33e5a2d7fb552b0284fcc09030 data/create/advancements/recipes/create.base/crafting/palettes/scorchia.json 4f8b8c90b7659b41f282127a0c6e509309a26200 data/create/advancements/recipes/create.base/crafting/schematics/empty_schematic.json 453c39a149831f27b4c0069fae40cb1a8c87ed5e data/create/advancements/recipes/create.base/crafting/schematics/schematic_and_quill.json d5efcd206b74c5165cbd4c2f5bb7bf3cf3eeae34 data/create/advancements/recipes/create.base/crafting/schematics/schematic_table.json cd1f66066664ed58995f8a7988fb1aa22605650b data/create/advancements/recipes/create.base/crafting/schematics/schematicannon.json +0577e7cff04b9fb37d8d4fccf8218271fc7983ca data/create/advancements/recipes/create.base/crimsite_pillar_from_crimsite_stonecutting.json +97c48ddf1f9ef0f8433bf34ed7c4f6a7f44cf445 data/create/advancements/recipes/create.base/crimsite_pillar_from_stone_types_crimsite_stonecutting.json +203e85e700f1122545ff04b215983048f68a3391 data/create/advancements/recipes/create.base/crimson_window.json +33bf129965a516f9d5f239900d1c844737cecaad data/create/advancements/recipes/create.base/crimson_window_pane.json +ed4530b3a2c074868b2e59145840ad1a19ccba8a data/create/advancements/recipes/create.base/cut_andesite_brick_slab.json +94f17edc574e5f7c6d8a7b53d006cb1cbcde25ae data/create/advancements/recipes/create.base/cut_andesite_brick_slab_from_andesite_stonecutting.json +4bd0c00092d0f9bc61d9c4024588109d66ddcc86 data/create/advancements/recipes/create.base/cut_andesite_brick_slab_from_stone_types_andesite_stonecutting.json +e43b1433cb2a69411501b559b0314f1ec10a2e92 data/create/advancements/recipes/create.base/cut_andesite_brick_slab_recycling.json +4cfaf94df2b896cf72cab1d3a64f0a581214824f data/create/advancements/recipes/create.base/cut_andesite_brick_stairs.json +925fe65983678ffe844e91c60960af4f678d0613 data/create/advancements/recipes/create.base/cut_andesite_brick_stairs_from_andesite_stonecutting.json +89b206cac06cb0cff8610924ec049d8c55e50476 data/create/advancements/recipes/create.base/cut_andesite_brick_stairs_from_stone_types_andesite_stonecutting.json +98a12597165abfad0d624f31d3319f0fa1319fe0 data/create/advancements/recipes/create.base/cut_andesite_brick_wall.json +d438fb733ad85e32915d22d4b90a2f030b2c8af7 data/create/advancements/recipes/create.base/cut_andesite_brick_wall_from_andesite_stonecutting.json +6653fbf0a0e467614e3dae0449391fde17ddc13a data/create/advancements/recipes/create.base/cut_andesite_brick_wall_from_stone_types_andesite_stonecutting.json +b08740a89c92e7a1631db8d3fe75575e0d124684 data/create/advancements/recipes/create.base/cut_andesite_bricks_from_andesite_stonecutting.json +d2ef2a017d948ef65d7c650b5942e8400cd90631 data/create/advancements/recipes/create.base/cut_andesite_bricks_from_stone_types_andesite_stonecutting.json +0a96201e3db9566258a92921a532482174bc4c5c data/create/advancements/recipes/create.base/cut_andesite_from_andesite_stonecutting.json +ce5e8f5028f3c034288d83ec75e4a0d4707083e3 data/create/advancements/recipes/create.base/cut_andesite_from_stone_types_andesite_stonecutting.json +8870b4ac0c0e9b85014900e7332a9cd2d2566088 data/create/advancements/recipes/create.base/cut_andesite_slab.json +135db9d4173c37b16c2fc65932eac1a4e54dceca data/create/advancements/recipes/create.base/cut_andesite_slab_from_andesite_stonecutting.json +d1efc4cfc0f7176726ffcb331518bd254c5c7258 data/create/advancements/recipes/create.base/cut_andesite_slab_from_stone_types_andesite_stonecutting.json +a044b810d6545600702a431b6d2686f66318015c data/create/advancements/recipes/create.base/cut_andesite_slab_recycling.json +62024570060391333c9486fad7a583a42e37c223 data/create/advancements/recipes/create.base/cut_andesite_stairs.json +7361895dddec1a3adfa4b95c8b37ef9069708169 data/create/advancements/recipes/create.base/cut_andesite_stairs_from_andesite_stonecutting.json +b1376510a8b23d6583c598f4d72fe6efe8db8397 data/create/advancements/recipes/create.base/cut_andesite_stairs_from_stone_types_andesite_stonecutting.json +4e1e7906a468aae37a50f2fbc2974f76f0d5cc45 data/create/advancements/recipes/create.base/cut_andesite_wall.json +d34cd111c437bfe2a1e3861f3260929748e8cd47 data/create/advancements/recipes/create.base/cut_andesite_wall_from_andesite_stonecutting.json +f51fc6f6f143755bcc6f5c23b0fabc28ffa0bac2 data/create/advancements/recipes/create.base/cut_andesite_wall_from_stone_types_andesite_stonecutting.json +2f8534038e4eaf900d5713f7da9c1777c94206ff data/create/advancements/recipes/create.base/cut_asurine_brick_slab.json +1912d017ba8ca9566a9d1f88e77590360069ad45 data/create/advancements/recipes/create.base/cut_asurine_brick_slab_from_asurine_stonecutting.json +ae13c7ccbc88bbdb18c0ab3b9cacb17a9180a4d8 data/create/advancements/recipes/create.base/cut_asurine_brick_slab_from_stone_types_asurine_stonecutting.json +3eafcea4cd7c89bfefb28f2cd777254e4ff3d0a2 data/create/advancements/recipes/create.base/cut_asurine_brick_slab_recycling.json +bfa993105851f003de6aa1c00e98ecb45f887221 data/create/advancements/recipes/create.base/cut_asurine_brick_stairs.json +fb3a53300eb9455f6f43101657c47129d91da9a2 data/create/advancements/recipes/create.base/cut_asurine_brick_stairs_from_asurine_stonecutting.json +82969baccbae9fc780bcacc153373e4c950d40ea data/create/advancements/recipes/create.base/cut_asurine_brick_stairs_from_stone_types_asurine_stonecutting.json +d79ab014cfd342c4d0d2f009efbd9c184e63febf data/create/advancements/recipes/create.base/cut_asurine_brick_wall.json +444b4ea33df8e0df2ded71eab421d2b9bdc3cda0 data/create/advancements/recipes/create.base/cut_asurine_brick_wall_from_asurine_stonecutting.json +f577588ecfb59ac292b7b70e2941019e8df21786 data/create/advancements/recipes/create.base/cut_asurine_brick_wall_from_stone_types_asurine_stonecutting.json +5ff70e673771131564de6322cc35b6e593577295 data/create/advancements/recipes/create.base/cut_asurine_bricks_from_asurine_stonecutting.json +a54da6f90bc65a172ca0fb91ad07ba9d5417c4b2 data/create/advancements/recipes/create.base/cut_asurine_bricks_from_stone_types_asurine_stonecutting.json +2632008bb91d0e11a33673d700d167110e8a2382 data/create/advancements/recipes/create.base/cut_asurine_from_asurine_stonecutting.json +6b941f80605fa3975a85599aad98548ef7aa75f9 data/create/advancements/recipes/create.base/cut_asurine_from_stone_types_asurine_stonecutting.json +1d690ad6b8872c53ead4605811d7af05ef6ff1fa data/create/advancements/recipes/create.base/cut_asurine_slab.json +92dfaf6c019a8ca312b8166b9405dfa8fc913b6d data/create/advancements/recipes/create.base/cut_asurine_slab_from_asurine_stonecutting.json +c8e47f89166125399c0589214f3b2b9e97292c9f data/create/advancements/recipes/create.base/cut_asurine_slab_from_stone_types_asurine_stonecutting.json +d95398cb5c655ba6847c67d02157b0271b60388c data/create/advancements/recipes/create.base/cut_asurine_slab_recycling.json +cbb810c11d85d06db6b7a359fbe6cd0a9dcbcf45 data/create/advancements/recipes/create.base/cut_asurine_stairs.json +e1662afaa8c7d51147a0a6de026e6af4e3531d42 data/create/advancements/recipes/create.base/cut_asurine_stairs_from_asurine_stonecutting.json +9ab3524bd285b037f4fdc6326043ae2961d65530 data/create/advancements/recipes/create.base/cut_asurine_stairs_from_stone_types_asurine_stonecutting.json +21297a6c5e5a199d726bd69d14e428f1aec7812c data/create/advancements/recipes/create.base/cut_asurine_wall.json +8bee425cf3538bd56a58aa1fe9395b4345b74136 data/create/advancements/recipes/create.base/cut_asurine_wall_from_asurine_stonecutting.json +71d251ce3df2336600f95ab30d631f97e658ef7e data/create/advancements/recipes/create.base/cut_asurine_wall_from_stone_types_asurine_stonecutting.json +9d14ee83bcf0ffc34726c3d8779cbfd837cf1939 data/create/advancements/recipes/create.base/cut_calcite_brick_slab.json +d9f421cff97701cc410cb8331a98acbf6f55735e data/create/advancements/recipes/create.base/cut_calcite_brick_slab_from_calcite_stonecutting.json +bd7156472c1196cc9c9e3ee9a7495b457b5cef9e data/create/advancements/recipes/create.base/cut_calcite_brick_slab_from_stone_types_calcite_stonecutting.json +7da4dda4a0cdf01d3f85d9bf0ba654963fec20fe data/create/advancements/recipes/create.base/cut_calcite_brick_slab_recycling.json +c7977b9ff93275fa47bbd35a2d8363ba1ddfe88e data/create/advancements/recipes/create.base/cut_calcite_brick_stairs.json +6983a9c816c71bd48e0f8eab6694dd9807b3b89d data/create/advancements/recipes/create.base/cut_calcite_brick_stairs_from_calcite_stonecutting.json +2bb344a67b931a751b55416ebac2ab06148253c6 data/create/advancements/recipes/create.base/cut_calcite_brick_stairs_from_stone_types_calcite_stonecutting.json +af44c65cf9c10193ab59c3e00d2f4975855ab982 data/create/advancements/recipes/create.base/cut_calcite_brick_wall.json +9f53fd8a316a07875e4506368b0f7f4a4d654013 data/create/advancements/recipes/create.base/cut_calcite_brick_wall_from_calcite_stonecutting.json +51e705c29c29f806c6c0e6a90f892f66a0d6c1f8 data/create/advancements/recipes/create.base/cut_calcite_brick_wall_from_stone_types_calcite_stonecutting.json +f0d336a0e2acccc8c89c2572df264bd5101fdf5a data/create/advancements/recipes/create.base/cut_calcite_bricks_from_calcite_stonecutting.json +07267856fbc82e1c8e8e43321f1f2102af2280a3 data/create/advancements/recipes/create.base/cut_calcite_bricks_from_stone_types_calcite_stonecutting.json +e41e44f35ad264f9fb34badd9098f7b5e9a568d2 data/create/advancements/recipes/create.base/cut_calcite_from_calcite_stonecutting.json +e19dba28493a65974667ee7ee7b24a5fca4b1808 data/create/advancements/recipes/create.base/cut_calcite_from_stone_types_calcite_stonecutting.json +4ca3f81cf9e5ce231199703f4e1bc8be8fc2bbb3 data/create/advancements/recipes/create.base/cut_calcite_slab.json +85e2368b7d6e4cd355725efc1d1ff96168000be1 data/create/advancements/recipes/create.base/cut_calcite_slab_from_calcite_stonecutting.json +e5148a533f8f5f88d62c076a2a39258dc59f9262 data/create/advancements/recipes/create.base/cut_calcite_slab_from_stone_types_calcite_stonecutting.json +3789eac9c5e1f5b9ef022d9f9646c89e39c2d347 data/create/advancements/recipes/create.base/cut_calcite_slab_recycling.json +039675196670f72286f297d9f8ccf0c0b20bdcc5 data/create/advancements/recipes/create.base/cut_calcite_stairs.json +c8a130c3f9e1f56f23fe893d8a2ba77178351eae data/create/advancements/recipes/create.base/cut_calcite_stairs_from_calcite_stonecutting.json +6bbcb9895d83e36a3ae97384493c3be8ee5fe55c data/create/advancements/recipes/create.base/cut_calcite_stairs_from_stone_types_calcite_stonecutting.json +36063f9a43bbcce80061060b81dea3aef05c28bb data/create/advancements/recipes/create.base/cut_calcite_wall.json +4618952de8369790936ffa075fa6f5ce5bf12503 data/create/advancements/recipes/create.base/cut_calcite_wall_from_calcite_stonecutting.json +801baf1ca0e70909c92d76ad0235a5b3f29a5ba5 data/create/advancements/recipes/create.base/cut_calcite_wall_from_stone_types_calcite_stonecutting.json +ea71950b15b6a4220d6215e338f9ae5f5e06b3ef data/create/advancements/recipes/create.base/cut_crimsite_brick_slab.json +842bb39066516a4812294a65d5049e86000d01c3 data/create/advancements/recipes/create.base/cut_crimsite_brick_slab_from_crimsite_stonecutting.json +83a5f94eb99c16fab64fc6500b80d83a9af5db1f data/create/advancements/recipes/create.base/cut_crimsite_brick_slab_from_stone_types_crimsite_stonecutting.json +04264884a2152d916e815b9748293182021cc4f1 data/create/advancements/recipes/create.base/cut_crimsite_brick_slab_recycling.json +01709a99d0c590db01be2a93009f8f9ace341332 data/create/advancements/recipes/create.base/cut_crimsite_brick_stairs.json +e2db045f5f59f2307442b747851fec77ca5b8483 data/create/advancements/recipes/create.base/cut_crimsite_brick_stairs_from_crimsite_stonecutting.json +0e2b7313cd6cbc9f11a08a509e6332ae108749de data/create/advancements/recipes/create.base/cut_crimsite_brick_stairs_from_stone_types_crimsite_stonecutting.json +b74f939a78a6ae8cc5f7862543b66d62af08406a data/create/advancements/recipes/create.base/cut_crimsite_brick_wall.json +372c493b13a25301ab44d65e5f8115a2c0820494 data/create/advancements/recipes/create.base/cut_crimsite_brick_wall_from_crimsite_stonecutting.json +1b66941a2e8122f6a668d6bc984acc7dc3d16714 data/create/advancements/recipes/create.base/cut_crimsite_brick_wall_from_stone_types_crimsite_stonecutting.json +81ddf327faca5a5ac231fb508747f5f45f41081a data/create/advancements/recipes/create.base/cut_crimsite_bricks_from_crimsite_stonecutting.json +529f9ea8f68bea9a08d78ff5a8c9bc8177cacdc3 data/create/advancements/recipes/create.base/cut_crimsite_bricks_from_stone_types_crimsite_stonecutting.json +2adb46ea5f694625cd59ad6bd2b2d9780229fbc3 data/create/advancements/recipes/create.base/cut_crimsite_from_crimsite_stonecutting.json +1f13d1ca2433dc0773c670baf1d05bacc798a57c data/create/advancements/recipes/create.base/cut_crimsite_from_stone_types_crimsite_stonecutting.json +840c9d7d245f0f42115b2743a91b8d4c1dc088ed data/create/advancements/recipes/create.base/cut_crimsite_slab.json +67ded3941e324e446603c202c437f5b562e24d81 data/create/advancements/recipes/create.base/cut_crimsite_slab_from_crimsite_stonecutting.json +ec4b8d4d62814de99215dbfb3bba5699a5b8a679 data/create/advancements/recipes/create.base/cut_crimsite_slab_from_stone_types_crimsite_stonecutting.json +6eb7b166ad302f2fa68a9850f7f70bd9b8c87c12 data/create/advancements/recipes/create.base/cut_crimsite_slab_recycling.json +1929009937c54d27b3d0795ea9696f8dd1bd0e40 data/create/advancements/recipes/create.base/cut_crimsite_stairs.json +ff4c0629e38d8957fd7a717d5f4be0cf124ff57a data/create/advancements/recipes/create.base/cut_crimsite_stairs_from_crimsite_stonecutting.json +02ea17a131cbf5cf33f676a81001882b48ac4a14 data/create/advancements/recipes/create.base/cut_crimsite_stairs_from_stone_types_crimsite_stonecutting.json +39783496e980de6d46d0b2cfbed511f0e5aa4b29 data/create/advancements/recipes/create.base/cut_crimsite_wall.json +e1ba89b360f00e8d3eef835ff9eff85caae7d73c data/create/advancements/recipes/create.base/cut_crimsite_wall_from_crimsite_stonecutting.json +8f660ddb06f9a1ae967f60a78500c68e8275a953 data/create/advancements/recipes/create.base/cut_crimsite_wall_from_stone_types_crimsite_stonecutting.json +1a7b4b885a9b7d79b19cf242388b7ff1742e7322 data/create/advancements/recipes/create.base/cut_deepslate_brick_slab.json +13a710791758f5b9140b15c2e8ae2fed995d580e data/create/advancements/recipes/create.base/cut_deepslate_brick_slab_from_deepslate_stonecutting.json +8ee86edd13132095dfc39a6ed6df42388ec5572d data/create/advancements/recipes/create.base/cut_deepslate_brick_slab_from_stone_types_deepslate_stonecutting.json +3e8051f691d443482bb310b8b2944e465f730473 data/create/advancements/recipes/create.base/cut_deepslate_brick_slab_recycling.json +dda71649a4c6cfb98b52f56359ba8591bd75a7c7 data/create/advancements/recipes/create.base/cut_deepslate_brick_stairs.json +b8d3a864f169933ab2d675ab7076584e0ed65c93 data/create/advancements/recipes/create.base/cut_deepslate_brick_stairs_from_deepslate_stonecutting.json +0e19dd19b645e65d6011023c5427b6a2702a78d1 data/create/advancements/recipes/create.base/cut_deepslate_brick_stairs_from_stone_types_deepslate_stonecutting.json +3a5d6017059db9ca093d939f94e06d7c6b22b026 data/create/advancements/recipes/create.base/cut_deepslate_brick_wall.json +0bfcbb510f4fad6f22cc7e9d49ed1c2a140e87db data/create/advancements/recipes/create.base/cut_deepslate_brick_wall_from_deepslate_stonecutting.json +c42cd084901a39d4634c1293180439b8abee69bb data/create/advancements/recipes/create.base/cut_deepslate_brick_wall_from_stone_types_deepslate_stonecutting.json +164eb4390657f4b711f7b0776e8854c505a0cd93 data/create/advancements/recipes/create.base/cut_deepslate_bricks_from_deepslate_stonecutting.json +ccb68f8f5202411738532d3decb403435ea65f3f data/create/advancements/recipes/create.base/cut_deepslate_bricks_from_stone_types_deepslate_stonecutting.json +feb39ae181092afc477b5f25bb803134e7cf50bd data/create/advancements/recipes/create.base/cut_deepslate_from_deepslate_stonecutting.json +7680fa2a942b2bed38cda9e7b5e3f9b114a36cb8 data/create/advancements/recipes/create.base/cut_deepslate_from_stone_types_deepslate_stonecutting.json +580882992706de7aa6d22a99b27b6fb43d3ee446 data/create/advancements/recipes/create.base/cut_deepslate_slab.json +7703abba82b7c66274d78724a3676c133bf5f54f data/create/advancements/recipes/create.base/cut_deepslate_slab_from_deepslate_stonecutting.json +2e198c264887a731e785d1b0ea06c526097067db data/create/advancements/recipes/create.base/cut_deepslate_slab_from_stone_types_deepslate_stonecutting.json +74383206fffb712349b72e5682d58f3923b93499 data/create/advancements/recipes/create.base/cut_deepslate_slab_recycling.json +4ef416feb9052e7560d8926fffdd9402441fb69e data/create/advancements/recipes/create.base/cut_deepslate_stairs.json +6612f1a52b9f73cfa8f3dc305407ab6bfbeae801 data/create/advancements/recipes/create.base/cut_deepslate_stairs_from_deepslate_stonecutting.json +ecb46ad524f0cbe3b1a6ad7b12f8ec9fb980442a data/create/advancements/recipes/create.base/cut_deepslate_stairs_from_stone_types_deepslate_stonecutting.json +4058f68b3eddf3b45ebbefc8c4c78c0638b70837 data/create/advancements/recipes/create.base/cut_deepslate_wall.json +1aaac5c2e9eff578887d4ee6eff310841e8d2773 data/create/advancements/recipes/create.base/cut_deepslate_wall_from_deepslate_stonecutting.json +9a58b1950d7d907b068c686c00c649bda4783d36 data/create/advancements/recipes/create.base/cut_deepslate_wall_from_stone_types_deepslate_stonecutting.json +b9ca24915029eae5b1eee5774d7099a715f5c942 data/create/advancements/recipes/create.base/cut_diorite_brick_slab.json +514203d3c4d8e2920f3dfdb0897f154ddd39a5fd data/create/advancements/recipes/create.base/cut_diorite_brick_slab_from_diorite_stonecutting.json +cbebac4a5d65912436fc644085ffff850b0a1951 data/create/advancements/recipes/create.base/cut_diorite_brick_slab_from_stone_types_diorite_stonecutting.json +85662add4d3976ffc189bd3d45cd22bb3a953686 data/create/advancements/recipes/create.base/cut_diorite_brick_slab_recycling.json +4c6a2ec9b08f050ca8cdac58daf0d226a6cec5ef data/create/advancements/recipes/create.base/cut_diorite_brick_stairs.json +d07cc218496efa412e03dc3cf0c089a71e478a21 data/create/advancements/recipes/create.base/cut_diorite_brick_stairs_from_diorite_stonecutting.json +d172ddb80c9911a9ac3c9c192e0d9126d73a8cd0 data/create/advancements/recipes/create.base/cut_diorite_brick_stairs_from_stone_types_diorite_stonecutting.json +7e7b4eae4020e785fd29168215c391d768cf3648 data/create/advancements/recipes/create.base/cut_diorite_brick_wall.json +10d653a811083f84ae1bce77f4bca65885dd7668 data/create/advancements/recipes/create.base/cut_diorite_brick_wall_from_diorite_stonecutting.json +6e8270df13af7eaa9f6d4713757bdb4c5b5572f6 data/create/advancements/recipes/create.base/cut_diorite_brick_wall_from_stone_types_diorite_stonecutting.json +a693f2d3e5b303289ce21ace8317d542b456024a data/create/advancements/recipes/create.base/cut_diorite_bricks_from_diorite_stonecutting.json +253482c6b7be447425d63318bce8d50a5a5e3704 data/create/advancements/recipes/create.base/cut_diorite_bricks_from_stone_types_diorite_stonecutting.json +e5cfac9e7474aa34407d4ae41fb38d92a0ca59d5 data/create/advancements/recipes/create.base/cut_diorite_from_diorite_stonecutting.json +d5274319ebf41708cfb2c84fd06ce64583ab9577 data/create/advancements/recipes/create.base/cut_diorite_from_stone_types_diorite_stonecutting.json +531c66991e42aaf169b64ba9b93eb08cd5aa60a1 data/create/advancements/recipes/create.base/cut_diorite_slab.json +d5041d0925e15a1ab83ce51710d22ab1ffbafa13 data/create/advancements/recipes/create.base/cut_diorite_slab_from_diorite_stonecutting.json +6114e07219bba9090e9c1e51150e809bd830d8ae data/create/advancements/recipes/create.base/cut_diorite_slab_from_stone_types_diorite_stonecutting.json +eea5a315b65f20bcc35bd82d403993b36cca59a3 data/create/advancements/recipes/create.base/cut_diorite_slab_recycling.json +13b33317fee528281a285cd0aa81543eb966f36b data/create/advancements/recipes/create.base/cut_diorite_stairs.json +5f22908071957276dbe3496d56b57299a45e9ee5 data/create/advancements/recipes/create.base/cut_diorite_stairs_from_diorite_stonecutting.json +69097d2673bd2e3108b2c51b5f444ae48f53f93f data/create/advancements/recipes/create.base/cut_diorite_stairs_from_stone_types_diorite_stonecutting.json +4b0d8c17903387d17b00f0ba4d04009c340204ee data/create/advancements/recipes/create.base/cut_diorite_wall.json +18b5fc74dfb4f4d1e220273b1324a680e147b026 data/create/advancements/recipes/create.base/cut_diorite_wall_from_diorite_stonecutting.json +e01243eb51ff9554c51e0acb391a5674a9f78acd data/create/advancements/recipes/create.base/cut_diorite_wall_from_stone_types_diorite_stonecutting.json +948d6c357a67e2b535eaccf91ba10b9e1b154bde data/create/advancements/recipes/create.base/cut_dripstone_brick_slab.json +ab6f0088274a89a925039383a0899039d3be6f87 data/create/advancements/recipes/create.base/cut_dripstone_brick_slab_from_dripstone_block_stonecutting.json +a8a7a85d873026eb3b0139baa6cda9036cce7ad0 data/create/advancements/recipes/create.base/cut_dripstone_brick_slab_from_stone_types_dripstone_stonecutting.json +37ed0d2ac50cbe3eae2293de18a9a2b5f6ae8261 data/create/advancements/recipes/create.base/cut_dripstone_brick_slab_recycling.json +c91657409f41c707a2da3c41726f33ef0a2208e3 data/create/advancements/recipes/create.base/cut_dripstone_brick_stairs.json +46e8a8a54133a66c5d194d174a1847befdb2eedb data/create/advancements/recipes/create.base/cut_dripstone_brick_stairs_from_dripstone_block_stonecutting.json +8b594a7297ed5b4ab870e5c93661209dc9c71445 data/create/advancements/recipes/create.base/cut_dripstone_brick_stairs_from_stone_types_dripstone_stonecutting.json +927e551e7d9d43b03717453af3c6c30684ba12da data/create/advancements/recipes/create.base/cut_dripstone_brick_wall.json +576fddccf646453dc6bf8aafd94b8d1ac8c25b77 data/create/advancements/recipes/create.base/cut_dripstone_brick_wall_from_dripstone_block_stonecutting.json +cb368165b3c9d2c0e55eaad4d653068eb23b06aa data/create/advancements/recipes/create.base/cut_dripstone_brick_wall_from_stone_types_dripstone_stonecutting.json +adfe5459b3e99e60f6c644bad64d30a982ab1101 data/create/advancements/recipes/create.base/cut_dripstone_bricks_from_dripstone_block_stonecutting.json +c4ffd6b94835ee6c3fd9f57211f81e010682a86f data/create/advancements/recipes/create.base/cut_dripstone_bricks_from_stone_types_dripstone_stonecutting.json +5173d5d4858a2f7c591113e4415705e8c03e66cb data/create/advancements/recipes/create.base/cut_dripstone_from_dripstone_block_stonecutting.json +91a5bcd2e5bd62b05f06a09fa3468ec0410f03a7 data/create/advancements/recipes/create.base/cut_dripstone_from_stone_types_dripstone_stonecutting.json +d37d039b66c69653ea0220ad4be9ddc4e2de05f7 data/create/advancements/recipes/create.base/cut_dripstone_slab.json +e82133bba107ec937e7a403d99ece14203299b4e data/create/advancements/recipes/create.base/cut_dripstone_slab_from_dripstone_block_stonecutting.json +d3b41ed76e5b72b07f7d8496f6396680d2bd9ce6 data/create/advancements/recipes/create.base/cut_dripstone_slab_from_stone_types_dripstone_stonecutting.json +27001803f39f327873f3a3be8a755640ebcb1cb1 data/create/advancements/recipes/create.base/cut_dripstone_slab_recycling.json +eeb39079c0677c89d166497963c7036d072174fb data/create/advancements/recipes/create.base/cut_dripstone_stairs.json +60f0147009231acfb7e7b732a59dcf80cd5bc527 data/create/advancements/recipes/create.base/cut_dripstone_stairs_from_dripstone_block_stonecutting.json +fa915c08ac484c141882a8d67808df0a575b0f86 data/create/advancements/recipes/create.base/cut_dripstone_stairs_from_stone_types_dripstone_stonecutting.json +1512d4705c0fa89f1cfaf08f130dfc73cb266f6d data/create/advancements/recipes/create.base/cut_dripstone_wall.json +cd3af424e32d5bdf0df86f283b5a05f821b32671 data/create/advancements/recipes/create.base/cut_dripstone_wall_from_dripstone_block_stonecutting.json +a4683c2cb715958e28d41ef3815ab7bfb9457ca7 data/create/advancements/recipes/create.base/cut_dripstone_wall_from_stone_types_dripstone_stonecutting.json +f5ea0be8a3fbf4c43909dbe4406beb0ec2192e13 data/create/advancements/recipes/create.base/cut_granite_brick_slab.json +9b5ee834a63a6bed03ee0f72c29a1a1a1b721d27 data/create/advancements/recipes/create.base/cut_granite_brick_slab_from_granite_stonecutting.json +3a6b3cb61b2e4e9d6a3c6460282390225ca5b1a3 data/create/advancements/recipes/create.base/cut_granite_brick_slab_from_stone_types_granite_stonecutting.json +7a02490ca3f70fcf88331b0f26a033a916b810e8 data/create/advancements/recipes/create.base/cut_granite_brick_slab_recycling.json +671f6973814216ec04f42b7d7535aa7b61b55b26 data/create/advancements/recipes/create.base/cut_granite_brick_stairs.json +47c0cf03575a11321bcde3c3ac0a1fd1bfeaa3b3 data/create/advancements/recipes/create.base/cut_granite_brick_stairs_from_granite_stonecutting.json +4b8412e62f3f0c44ca008ce4a13f48a6289fce78 data/create/advancements/recipes/create.base/cut_granite_brick_stairs_from_stone_types_granite_stonecutting.json +56fc4c60fe99e8ca6130b3714f1be6f4966d1ab4 data/create/advancements/recipes/create.base/cut_granite_brick_wall.json +e3d1d56a58171943f52d2bd7f55444410c31e490 data/create/advancements/recipes/create.base/cut_granite_brick_wall_from_granite_stonecutting.json +e1a1a24c843869427afc43980215a56fa2b22a7e data/create/advancements/recipes/create.base/cut_granite_brick_wall_from_stone_types_granite_stonecutting.json +686ea3f73b7ba7db9d733f162deec5599cec62e2 data/create/advancements/recipes/create.base/cut_granite_bricks_from_granite_stonecutting.json +5dbce50c004b049d3904f0a93aa5a7f69fd2cb68 data/create/advancements/recipes/create.base/cut_granite_bricks_from_stone_types_granite_stonecutting.json +77ed7edee3a5be5a04fe4cad4b5cf71016d1c4a9 data/create/advancements/recipes/create.base/cut_granite_from_granite_stonecutting.json +f30f34b296b0884759c5aa147c282bad27ddd992 data/create/advancements/recipes/create.base/cut_granite_from_stone_types_granite_stonecutting.json +958e8b048745fb67608771e8a76e692dc2409739 data/create/advancements/recipes/create.base/cut_granite_slab.json +79c09173c4e162a9edc526e2daf3169194db6363 data/create/advancements/recipes/create.base/cut_granite_slab_from_granite_stonecutting.json +7352a3471cbcecfd95aac0052f82c3af29ffad32 data/create/advancements/recipes/create.base/cut_granite_slab_from_stone_types_granite_stonecutting.json +3f7effd2b9e22e0ec996f19656f708e528fc7f81 data/create/advancements/recipes/create.base/cut_granite_slab_recycling.json +41bf95f5f8c2983a79610e05e5e5657667779117 data/create/advancements/recipes/create.base/cut_granite_stairs.json +24c850200e40cec34b3575b2872b70e81da5ff62 data/create/advancements/recipes/create.base/cut_granite_stairs_from_granite_stonecutting.json +0b6c32b17e4f5d88faa0986301a9a84c93566272 data/create/advancements/recipes/create.base/cut_granite_stairs_from_stone_types_granite_stonecutting.json +0a856a007ee8107e6e141a7c4d3db61b3f42a75f data/create/advancements/recipes/create.base/cut_granite_wall.json +651e9fff7b0ca7c7e33fbae68f1a5268c48051d8 data/create/advancements/recipes/create.base/cut_granite_wall_from_granite_stonecutting.json +0c38e6cfbca90f40daa49fab1114a12a6403816f data/create/advancements/recipes/create.base/cut_granite_wall_from_stone_types_granite_stonecutting.json +dbeb316b62ed53a36c3a77619e8a7847107f828c data/create/advancements/recipes/create.base/cut_limestone_brick_slab.json +64fb60e342657c1fc80f42634fa312696efd2bb4 data/create/advancements/recipes/create.base/cut_limestone_brick_slab_from_limestone_stonecutting.json +bfc7bfad55e8afa583f30d5504674f2fc017d2b3 data/create/advancements/recipes/create.base/cut_limestone_brick_slab_from_stone_types_limestone_stonecutting.json +0a9b5d1f6cddb3e3bc249e8182f22e53007337db data/create/advancements/recipes/create.base/cut_limestone_brick_slab_recycling.json +ac5e10d641bcffa6ed7baea1690cef93ab872987 data/create/advancements/recipes/create.base/cut_limestone_brick_stairs.json +3f63787b154d5dbf4f85555af28cdc53c9b82cf6 data/create/advancements/recipes/create.base/cut_limestone_brick_stairs_from_limestone_stonecutting.json +985eb26bfee853fe43b2479bd71a43d923fc6c21 data/create/advancements/recipes/create.base/cut_limestone_brick_stairs_from_stone_types_limestone_stonecutting.json +776d430cb58597be6d3f2d3f93978c2d57eb3703 data/create/advancements/recipes/create.base/cut_limestone_brick_wall.json +eb12ec324ee169772cca06265919d7b7259bd9d7 data/create/advancements/recipes/create.base/cut_limestone_brick_wall_from_limestone_stonecutting.json +6d5846c46ccfce35bf389b08a31c863c9612b498 data/create/advancements/recipes/create.base/cut_limestone_brick_wall_from_stone_types_limestone_stonecutting.json +46bf4386d4b9c4348f305198dd3bd47f4c60d805 data/create/advancements/recipes/create.base/cut_limestone_bricks_from_limestone_stonecutting.json +3c00d099ff1958b2549a4e8b04f14dfcc1469db3 data/create/advancements/recipes/create.base/cut_limestone_bricks_from_stone_types_limestone_stonecutting.json +50ba84a90bc126e5171b8bee5c3546119488bd2c data/create/advancements/recipes/create.base/cut_limestone_from_limestone_stonecutting.json +5bad7318b3c241a75fb1ff111c660c755c2181b0 data/create/advancements/recipes/create.base/cut_limestone_from_stone_types_limestone_stonecutting.json +a2eda8210e7c97058fbcd27d4934dfd1d03267fd data/create/advancements/recipes/create.base/cut_limestone_slab.json +9e391d9c97f617af06657819fc3712c1a4263a52 data/create/advancements/recipes/create.base/cut_limestone_slab_from_limestone_stonecutting.json +5c44837ff0108cb2ee2e200ea7fc3609469ca585 data/create/advancements/recipes/create.base/cut_limestone_slab_from_stone_types_limestone_stonecutting.json +df8254521080fc9f9eff64036ec3d4b0e00f5c4d data/create/advancements/recipes/create.base/cut_limestone_slab_recycling.json +1efc4f73c5ed7c181ac23178aba4da174c68c1af data/create/advancements/recipes/create.base/cut_limestone_stairs.json +c0feff8f8e607ec5ca8d6a75ebbf20382825139c data/create/advancements/recipes/create.base/cut_limestone_stairs_from_limestone_stonecutting.json +50cd6653df844e6cdd17027745e9acbe7e50affc data/create/advancements/recipes/create.base/cut_limestone_stairs_from_stone_types_limestone_stonecutting.json +5a677ebd58bf5570c4390f964c8ab7c355baeee8 data/create/advancements/recipes/create.base/cut_limestone_wall.json +b545759d95e9a3fed6591a6cba8304c6d930ec00 data/create/advancements/recipes/create.base/cut_limestone_wall_from_limestone_stonecutting.json +a2fe1ee0ba424ed35f13e6e5248c805486ef9008 data/create/advancements/recipes/create.base/cut_limestone_wall_from_stone_types_limestone_stonecutting.json +2120a327cc45f3e856198b87ea8bedb0d3fa9b9f data/create/advancements/recipes/create.base/cut_ochrum_brick_slab.json +309c4025c0b538188b6554cf26f888af3b78cfe9 data/create/advancements/recipes/create.base/cut_ochrum_brick_slab_from_ochrum_stonecutting.json +dd71c858dafd641c776e4c1af9fd37bc4484e906 data/create/advancements/recipes/create.base/cut_ochrum_brick_slab_from_stone_types_ochrum_stonecutting.json +3bfa629fd5cba5352429bdd3d6a4ed86ae522ce3 data/create/advancements/recipes/create.base/cut_ochrum_brick_slab_recycling.json +6ea27f007b02f22753a8e8a943ebf11be93268f7 data/create/advancements/recipes/create.base/cut_ochrum_brick_stairs.json +0d11e7e4ac1a602b6ec4f5edc58618a28fcd327a data/create/advancements/recipes/create.base/cut_ochrum_brick_stairs_from_ochrum_stonecutting.json +df55d8cfb16b41886d8dd8fa07036ffb94a48641 data/create/advancements/recipes/create.base/cut_ochrum_brick_stairs_from_stone_types_ochrum_stonecutting.json +fcb3ad214aacdfc228adf8f637ade0d62cc84dff data/create/advancements/recipes/create.base/cut_ochrum_brick_wall.json +ca74feca7dae05bbb8bdc742df3bfb039b6e6542 data/create/advancements/recipes/create.base/cut_ochrum_brick_wall_from_ochrum_stonecutting.json +3ecefca0632744c2f83c64d39944fa45c6bea50e data/create/advancements/recipes/create.base/cut_ochrum_brick_wall_from_stone_types_ochrum_stonecutting.json +f31b47e3d3560d2f3928d7b13720092a48833861 data/create/advancements/recipes/create.base/cut_ochrum_bricks_from_ochrum_stonecutting.json +c46df872eebb7578fc5c670ffb02c51b838ae0fa data/create/advancements/recipes/create.base/cut_ochrum_bricks_from_stone_types_ochrum_stonecutting.json +82bfe44e446b950141236666b654e690de9b87ec data/create/advancements/recipes/create.base/cut_ochrum_from_ochrum_stonecutting.json +d128fb5785174ad7c96fd27b8383a7910372a46a data/create/advancements/recipes/create.base/cut_ochrum_from_stone_types_ochrum_stonecutting.json +c4a36b6ae85368f1c8ffb93f233d38525b258e39 data/create/advancements/recipes/create.base/cut_ochrum_slab.json +7dad77e90a5711ccee0dbf02624b5a193dadace5 data/create/advancements/recipes/create.base/cut_ochrum_slab_from_ochrum_stonecutting.json +b8557a404a534267e3e98ad2ba8a527d57e6fb02 data/create/advancements/recipes/create.base/cut_ochrum_slab_from_stone_types_ochrum_stonecutting.json +a8ab8009f2934625f11b72b558c73302502e1e63 data/create/advancements/recipes/create.base/cut_ochrum_slab_recycling.json +265c91096b029829973674c5de20dc547da36db5 data/create/advancements/recipes/create.base/cut_ochrum_stairs.json +9b9d576ecb2ac3259db9437d0b5ec1301b73aced data/create/advancements/recipes/create.base/cut_ochrum_stairs_from_ochrum_stonecutting.json +767fa7f43d83b4f4cb08ab56b757c0d597097e99 data/create/advancements/recipes/create.base/cut_ochrum_stairs_from_stone_types_ochrum_stonecutting.json +7385e2a71da32d1a53ef0de2873d7181e6f8fd32 data/create/advancements/recipes/create.base/cut_ochrum_wall.json +7d0a5d7cce1abacb4dd8683b21a7c4777f57113e data/create/advancements/recipes/create.base/cut_ochrum_wall_from_ochrum_stonecutting.json +018765fbfda5b14edb7796b3fbb8e89ab11fdd6d data/create/advancements/recipes/create.base/cut_ochrum_wall_from_stone_types_ochrum_stonecutting.json +648ba0d229c3285a0d29e3d0c3bfe3a35f18c42e data/create/advancements/recipes/create.base/cut_scorchia_brick_slab.json +b1fbd6078eec777b49c924ec4510614cf276c8fa data/create/advancements/recipes/create.base/cut_scorchia_brick_slab_from_scorchia_stonecutting.json +7c9a476ec80f2596bc4892176e4d3a8512c5623c data/create/advancements/recipes/create.base/cut_scorchia_brick_slab_from_stone_types_scorchia_stonecutting.json +bbdb70ad3afec15e80f4d76784830372d4703573 data/create/advancements/recipes/create.base/cut_scorchia_brick_slab_recycling.json +75f39ad0c03ab1527d872a898f38d45b19e29553 data/create/advancements/recipes/create.base/cut_scorchia_brick_stairs.json +a6bf6d18b99fabe332a951c0394a224f357e41f8 data/create/advancements/recipes/create.base/cut_scorchia_brick_stairs_from_scorchia_stonecutting.json +6629748757115717bfe14cbf3d3d6ab528d3694d data/create/advancements/recipes/create.base/cut_scorchia_brick_stairs_from_stone_types_scorchia_stonecutting.json +693587803f1d9cf432ffc98efc38a7301863e7e4 data/create/advancements/recipes/create.base/cut_scorchia_brick_wall.json +712205ccf5262fe9e7ab28453d2d7d709f7ef423 data/create/advancements/recipes/create.base/cut_scorchia_brick_wall_from_scorchia_stonecutting.json +b1584b4b178daf18794594b2480abcc7f3fccef2 data/create/advancements/recipes/create.base/cut_scorchia_brick_wall_from_stone_types_scorchia_stonecutting.json +3404169dbd586a5ca6d9cd3a700d429fad990327 data/create/advancements/recipes/create.base/cut_scorchia_bricks_from_scorchia_stonecutting.json +6446650bc090e554a84e2ca8f47ab498d648c5d1 data/create/advancements/recipes/create.base/cut_scorchia_bricks_from_stone_types_scorchia_stonecutting.json +f14269d1b25e89a35bfdb7df171adaed6db0e34b data/create/advancements/recipes/create.base/cut_scorchia_from_scorchia_stonecutting.json +431d969a9a542ed892f57226e00dda55ac148c1e data/create/advancements/recipes/create.base/cut_scorchia_from_stone_types_scorchia_stonecutting.json +e8966a786652b83a082702db58ebd48975d9c39b data/create/advancements/recipes/create.base/cut_scorchia_slab.json +bb848c2588162414dc29cf29eed8e53b152456df data/create/advancements/recipes/create.base/cut_scorchia_slab_from_scorchia_stonecutting.json +70a29ee26b3f75c5b592316b9c2f8cb7a8911989 data/create/advancements/recipes/create.base/cut_scorchia_slab_from_stone_types_scorchia_stonecutting.json +b0a16e7fa0781a0b1ec88e459b3f0f9ce4a8694e data/create/advancements/recipes/create.base/cut_scorchia_slab_recycling.json +dd9435b2712de63fe276557060c8526c0814089d data/create/advancements/recipes/create.base/cut_scorchia_stairs.json +20c9d0e6757d676d22aaf161a1c5fcbceaf3ed03 data/create/advancements/recipes/create.base/cut_scorchia_stairs_from_scorchia_stonecutting.json +931e056dbab47c2443ad599410266c4f734449b9 data/create/advancements/recipes/create.base/cut_scorchia_stairs_from_stone_types_scorchia_stonecutting.json +cfed62ee22025b8b81386ff60d6b98ebe5021680 data/create/advancements/recipes/create.base/cut_scorchia_wall.json +c2048348b425351899a720552c9b60d246d344ab data/create/advancements/recipes/create.base/cut_scorchia_wall_from_scorchia_stonecutting.json +5d6270c11595156c91b03dbf8678c96d2334281b data/create/advancements/recipes/create.base/cut_scorchia_wall_from_stone_types_scorchia_stonecutting.json +ada66ca04cf48339915e20871cc0b8491f2f5348 data/create/advancements/recipes/create.base/cut_scoria_brick_slab.json +42138c8287f2006502b4d5fb1de0cb470f6a6713 data/create/advancements/recipes/create.base/cut_scoria_brick_slab_from_scoria_stonecutting.json +1b84a09b6490223ab5f90b6736bb36909cbb1b5c data/create/advancements/recipes/create.base/cut_scoria_brick_slab_from_stone_types_scoria_stonecutting.json +09dc9f9206ea2417d7cec4d34044cb12b0b33b01 data/create/advancements/recipes/create.base/cut_scoria_brick_slab_recycling.json +4a3bea2d8a975290c9e233dbbd29d2eb6c7fa7c8 data/create/advancements/recipes/create.base/cut_scoria_brick_stairs.json +b017c15c67995b8ac6a3abe6b4c4e8377b29ae00 data/create/advancements/recipes/create.base/cut_scoria_brick_stairs_from_scoria_stonecutting.json +efbc323c5b72779a5e15a7f4ea65890b52b23622 data/create/advancements/recipes/create.base/cut_scoria_brick_stairs_from_stone_types_scoria_stonecutting.json +263f108b99aa88921842d1a3c54c4848f11be33c data/create/advancements/recipes/create.base/cut_scoria_brick_wall.json +05f536b24f94d4fdebba8fed7e8fd38ef6613b6f data/create/advancements/recipes/create.base/cut_scoria_brick_wall_from_scoria_stonecutting.json +0c4d7fadd78c936d0a2ce39f8322ab23ef74b9dd data/create/advancements/recipes/create.base/cut_scoria_brick_wall_from_stone_types_scoria_stonecutting.json +f342f7a18b2eb879e8f78ab64718121bbc9179bc data/create/advancements/recipes/create.base/cut_scoria_bricks_from_scoria_stonecutting.json +d85bec26fe30e699ec34a65f141f4e7f7ca1feee data/create/advancements/recipes/create.base/cut_scoria_bricks_from_stone_types_scoria_stonecutting.json +a8579934fc32aa4ef87edaab8a95fa15eabc2a11 data/create/advancements/recipes/create.base/cut_scoria_from_scoria_stonecutting.json +c9a7ce0bbd9adcba5e0778915b3c581806027e85 data/create/advancements/recipes/create.base/cut_scoria_from_stone_types_scoria_stonecutting.json +0f2773b05f66834e24849757b5f0db0d6303cde3 data/create/advancements/recipes/create.base/cut_scoria_slab.json +1251ab2f5db6871bec830705990a1687882bb4a2 data/create/advancements/recipes/create.base/cut_scoria_slab_from_scoria_stonecutting.json +66482c7da597ecd80dab359964be19edc9e8e34e data/create/advancements/recipes/create.base/cut_scoria_slab_from_stone_types_scoria_stonecutting.json +4fe5898b8bcbe50a7659d46cff98df634acd1a06 data/create/advancements/recipes/create.base/cut_scoria_slab_recycling.json +42a763570344a099ff2b65cf64d7b99b618ecf1e data/create/advancements/recipes/create.base/cut_scoria_stairs.json +a1cf05108e524b4dbe3cd5bb8482f64b1c7b3f9a data/create/advancements/recipes/create.base/cut_scoria_stairs_from_scoria_stonecutting.json +721fd1c870080ee0fea7899488a32bf97a26993e data/create/advancements/recipes/create.base/cut_scoria_stairs_from_stone_types_scoria_stonecutting.json +58d35a5095bd9e5342244ae10b08c552b9b8115a data/create/advancements/recipes/create.base/cut_scoria_wall.json +10f172bdf7c5b9539aea5948d83e9af325fb7b8d data/create/advancements/recipes/create.base/cut_scoria_wall_from_scoria_stonecutting.json +86759d164402ae98db84b9aafc5823a3dd3811c1 data/create/advancements/recipes/create.base/cut_scoria_wall_from_stone_types_scoria_stonecutting.json +9637e9799d86ce911fd993f2720e0ba0eb856024 data/create/advancements/recipes/create.base/cut_tuff_brick_slab.json +b4301c349fcbc1e033b67e2ffcbfcb37593d0d2a data/create/advancements/recipes/create.base/cut_tuff_brick_slab_from_stone_types_tuff_stonecutting.json +cafb286a19630493130146b99a7ccc7be0dcc14f data/create/advancements/recipes/create.base/cut_tuff_brick_slab_from_tuff_stonecutting.json +0b98ab0cee6f96433892e38828814805cf4b91f1 data/create/advancements/recipes/create.base/cut_tuff_brick_slab_recycling.json +554e7de94e12145f03a17c9649cfb5167cad6ba8 data/create/advancements/recipes/create.base/cut_tuff_brick_stairs.json +1b5507c2a12bea515e098d21f1ee10b5321db8ce data/create/advancements/recipes/create.base/cut_tuff_brick_stairs_from_stone_types_tuff_stonecutting.json +ba970a16dd336a4be3e3fbb97f82373861aa559e data/create/advancements/recipes/create.base/cut_tuff_brick_stairs_from_tuff_stonecutting.json +9ee5223788023d5762bec6ce04c5f41ca331b664 data/create/advancements/recipes/create.base/cut_tuff_brick_wall.json +42cb7c6b86aad7cbaf69089f45e38965e66781ff data/create/advancements/recipes/create.base/cut_tuff_brick_wall_from_stone_types_tuff_stonecutting.json +038bd1d415b84429f42c2eb95fcb2e27a7e5b6c2 data/create/advancements/recipes/create.base/cut_tuff_brick_wall_from_tuff_stonecutting.json +65fd41988bec5d85d2a82babacf80991efa62b0b data/create/advancements/recipes/create.base/cut_tuff_bricks_from_stone_types_tuff_stonecutting.json +0bd67f5eb8f7c38d6ccddd798d2ef3bbf63e2921 data/create/advancements/recipes/create.base/cut_tuff_bricks_from_tuff_stonecutting.json +6d0f8f4b2c3e25e4c9749a43e9cff2cdec411042 data/create/advancements/recipes/create.base/cut_tuff_from_stone_types_tuff_stonecutting.json +d460a959a10428b7cfe7f73dae22af56c605e33c data/create/advancements/recipes/create.base/cut_tuff_from_tuff_stonecutting.json +a6e26d9b445cc7edc3621f01351211569ce172ca data/create/advancements/recipes/create.base/cut_tuff_slab.json +73dd3380e6ad5ec1da3818c637ffe8f3e772e586 data/create/advancements/recipes/create.base/cut_tuff_slab_from_stone_types_tuff_stonecutting.json +0370696b91be4c6a318f6e5c3a7e22eedfba4dba data/create/advancements/recipes/create.base/cut_tuff_slab_from_tuff_stonecutting.json +b315307fde8bf63d0072820aee13d4efcb12ffa3 data/create/advancements/recipes/create.base/cut_tuff_slab_recycling.json +ee713365e9ecef75f6941e243872ef65d9d476f1 data/create/advancements/recipes/create.base/cut_tuff_stairs.json +1e89398126c2113492924c4880b6c964cbb8409d data/create/advancements/recipes/create.base/cut_tuff_stairs_from_stone_types_tuff_stonecutting.json +7a79b60deed6cd3e95b9579c2487aa033e8f16f4 data/create/advancements/recipes/create.base/cut_tuff_stairs_from_tuff_stonecutting.json +7f6306c60cc2aa9aa548fdceb37e2dd1d2b79486 data/create/advancements/recipes/create.base/cut_tuff_wall.json +ebdbf3f3ef03ec96ec86510547c1e748b1afa5c0 data/create/advancements/recipes/create.base/cut_tuff_wall_from_stone_types_tuff_stonecutting.json +f2c5743f76105a5f4395bf0c9b7761b687a34bbb data/create/advancements/recipes/create.base/cut_tuff_wall_from_tuff_stonecutting.json +6a81d22158c6506d623091272368bdca5853268e data/create/advancements/recipes/create.base/cut_veridium_brick_slab.json +3e4ed2dcff2b6a0f788ae461875bebbe5532419d data/create/advancements/recipes/create.base/cut_veridium_brick_slab_from_stone_types_veridium_stonecutting.json +bf2185260292777e0c06baaa98def71c36475996 data/create/advancements/recipes/create.base/cut_veridium_brick_slab_from_veridium_stonecutting.json +48dee94d24be14aa8f275a474e1a8f95bc563f28 data/create/advancements/recipes/create.base/cut_veridium_brick_slab_recycling.json +f3819ca3bd1b50a1ac87a990c3a97d9b161f3feb data/create/advancements/recipes/create.base/cut_veridium_brick_stairs.json +b27c6f31d9d9f67675cee3c525b4c8a7ed998b0f data/create/advancements/recipes/create.base/cut_veridium_brick_stairs_from_stone_types_veridium_stonecutting.json +27ae0292076b9025bb0a5fd890b2d5c4ccddf922 data/create/advancements/recipes/create.base/cut_veridium_brick_stairs_from_veridium_stonecutting.json +acc9de007a3604d4a639a0c5ed9efaa95e899f0a data/create/advancements/recipes/create.base/cut_veridium_brick_wall.json +8ced7547c271428a50d255fd6553d55268b238b2 data/create/advancements/recipes/create.base/cut_veridium_brick_wall_from_stone_types_veridium_stonecutting.json +785f4928bcaa7282ba487094e6663ff420ca0da1 data/create/advancements/recipes/create.base/cut_veridium_brick_wall_from_veridium_stonecutting.json +8b584556f0a0ff7f71d4eb7f544bab545fe875cd data/create/advancements/recipes/create.base/cut_veridium_bricks_from_stone_types_veridium_stonecutting.json +a8cfbd173a14ecb6ff6a2d0116c1a80f167a8dbd data/create/advancements/recipes/create.base/cut_veridium_bricks_from_veridium_stonecutting.json +8feed403d077cad87f295fe33bfc54a850dfd470 data/create/advancements/recipes/create.base/cut_veridium_from_stone_types_veridium_stonecutting.json +1ee547c7713948f9a9aab374aafc0a09545ec0ff data/create/advancements/recipes/create.base/cut_veridium_from_veridium_stonecutting.json +5b40bf7228e05720dfb6a902461e735c82c694bc data/create/advancements/recipes/create.base/cut_veridium_slab.json +6a80d8d39c79f232ae70ebd4f3c2588593f3ca84 data/create/advancements/recipes/create.base/cut_veridium_slab_from_stone_types_veridium_stonecutting.json +a6588bb646607750cd8e889e665d63fbf5c8009e data/create/advancements/recipes/create.base/cut_veridium_slab_from_veridium_stonecutting.json +fe55bb155073bb02a9f3e6e5c1aeb42d99889d1b data/create/advancements/recipes/create.base/cut_veridium_slab_recycling.json +16f32df46decaaf7a5ca39855c29cfde85d57aff data/create/advancements/recipes/create.base/cut_veridium_stairs.json +04baf71fb6c6d700f93fc6500d1d8ad4aeae4b55 data/create/advancements/recipes/create.base/cut_veridium_stairs_from_stone_types_veridium_stonecutting.json +43ffa6bae9cb94d413d2bfa445b54da8ead70bf9 data/create/advancements/recipes/create.base/cut_veridium_stairs_from_veridium_stonecutting.json +462dad973e5a5d7c0232e121cf2f393bbcb2a1af data/create/advancements/recipes/create.base/cut_veridium_wall.json +ec49c9c74384046302ab83c6a5d85f3639ca15cf data/create/advancements/recipes/create.base/cut_veridium_wall_from_stone_types_veridium_stonecutting.json +57cd9d8f2c3d626acf1adf2cff932953965bd4f2 data/create/advancements/recipes/create.base/cut_veridium_wall_from_veridium_stonecutting.json +6110ac033d24e463a31fb641ce6c3a03505bdfaa data/create/advancements/recipes/create.base/dark_oak_window.json +fc2da04056c0a1a3347c227696c13d85394e27e6 data/create/advancements/recipes/create.base/dark_oak_window_pane.json +2b60559e5ac50dfb2292d481f7be0c183f75becd data/create/advancements/recipes/create.base/deepslate_pillar_from_deepslate_stonecutting.json +1d92970498686beaba3ee97a964d95f00bd8aef8 data/create/advancements/recipes/create.base/deepslate_pillar_from_stone_types_deepslate_stonecutting.json +9581791d1a820d85d105bc1efae2df9ba34204cb data/create/advancements/recipes/create.base/diorite_pillar_from_diorite_stonecutting.json +79375ff88b84f85e1983cba3e4af45abe399f881 data/create/advancements/recipes/create.base/diorite_pillar_from_stone_types_diorite_stonecutting.json +7a0e600fdcc58aa91f06c7049209a7af138451e8 data/create/advancements/recipes/create.base/dripstone_pillar_from_dripstone_block_stonecutting.json +9c64a60aa3741533d1fe6d43bfcdf52673880651 data/create/advancements/recipes/create.base/dripstone_pillar_from_stone_types_dripstone_stonecutting.json 513de02268c39a5e9e35aa048b95bdef089b0506 data/create/advancements/recipes/create.base/exposed_copper_shingle_slab.json cdd290ecaaba6c2debf40bbb4619834b53873478 data/create/advancements/recipes/create.base/exposed_copper_shingle_slab_from_exposed_copper_shingles_stonecutting.json cf780e8976aabaed5c8af81c8bb0575566b1192e data/create/advancements/recipes/create.base/exposed_copper_shingle_stairs.json @@ -2551,6 +2910,50 @@ c66711a5e902e052806b3b963b36f8d66a19b04d data/create/advancements/recipes/create 73c87bb34bb523d1253ef447ca7a74f8996e4f6c data/create/advancements/recipes/create.base/exposed_copper_tile_slab_from_exposed_copper_tiles_stonecutting.json 9342614352d7359477ed968da90ac4decb6b5f57 data/create/advancements/recipes/create.base/exposed_copper_tile_stairs.json 4e982ff097886f4b6b36ff381ff55e335496526d data/create/advancements/recipes/create.base/exposed_copper_tile_stairs_from_exposed_copper_tiles_stonecutting.json +05331b5f1701453ecdfd0b3e6429b22ec209ba67 data/create/advancements/recipes/create.base/framed_glass_from_glass_colorless_stonecutting.json +a2146b1cb0dab36728469c0792bc3ec187ea950b data/create/advancements/recipes/create.base/framed_glass_pane.json +c89d97bf7dbdc3740c4c3cc9446f0921b9bbe6e3 data/create/advancements/recipes/create.base/granite_pillar_from_granite_stonecutting.json +b19bee1283f3ba551d61c55a1c06eb55251a1cae data/create/advancements/recipes/create.base/granite_pillar_from_stone_types_granite_stonecutting.json +cbb40e82dba460ee126966a52f0164e740ac1f11 data/create/advancements/recipes/create.base/horizontal_framed_glass_from_glass_colorless_stonecutting.json +ebea30dbcdd4122277d34d7fce8da3b8a8847a42 data/create/advancements/recipes/create.base/horizontal_framed_glass_pane.json +c6dcd54313fd12beefb3e01f4e920c38dd4dd199 data/create/advancements/recipes/create.base/jungle_window.json +0cdc5053b1cf611cc1b547474bb07002cb937d10 data/create/advancements/recipes/create.base/jungle_window_pane.json +7d6d3a25a07cef49d063efdb3f08e398af8a35ac data/create/advancements/recipes/create.base/layered_andesite_from_andesite_stonecutting.json +ed7c2b3e8ff59650f778e5e59091160504cadcbf data/create/advancements/recipes/create.base/layered_andesite_from_stone_types_andesite_stonecutting.json +ba48b5d40355f78d28d625880a7fe9d08a8fa794 data/create/advancements/recipes/create.base/layered_asurine_from_asurine_stonecutting.json +e0d81bbdf528639801e356638586e3f99a50df88 data/create/advancements/recipes/create.base/layered_asurine_from_stone_types_asurine_stonecutting.json +2550ea6568993184477477ce1c719288cd0e0711 data/create/advancements/recipes/create.base/layered_calcite_from_calcite_stonecutting.json +de419f3101e178df221db89037b46e1d96052cc1 data/create/advancements/recipes/create.base/layered_calcite_from_stone_types_calcite_stonecutting.json +a48d42cfecc29f7569409938e5946e7e205d80c6 data/create/advancements/recipes/create.base/layered_crimsite_from_crimsite_stonecutting.json +95c44bdacc04b0c31f2a998a3160b69913e57bdb data/create/advancements/recipes/create.base/layered_crimsite_from_stone_types_crimsite_stonecutting.json +1d070b4add75d96fb794ede0d6d618afa62a93de data/create/advancements/recipes/create.base/layered_deepslate_from_deepslate_stonecutting.json +6263226c942c1beb37d03cff355484278e951ab7 data/create/advancements/recipes/create.base/layered_deepslate_from_stone_types_deepslate_stonecutting.json +5180fe223dbe3074004ab87d17557d2ce0cd11aa data/create/advancements/recipes/create.base/layered_diorite_from_diorite_stonecutting.json +d30377692acc40c521e395f7733ebb9657b94801 data/create/advancements/recipes/create.base/layered_diorite_from_stone_types_diorite_stonecutting.json +fe64f0ae3d3011281bcff85eee513925ae9d23cc data/create/advancements/recipes/create.base/layered_dripstone_from_dripstone_block_stonecutting.json +e69181339b04a35aed5f70f13bbc71fee33a7c49 data/create/advancements/recipes/create.base/layered_dripstone_from_stone_types_dripstone_stonecutting.json +d0f7155542a4350efa92297cf8fec0649e963b21 data/create/advancements/recipes/create.base/layered_granite_from_granite_stonecutting.json +2d734268284b9493fb1f5531893459de2dab8984 data/create/advancements/recipes/create.base/layered_granite_from_stone_types_granite_stonecutting.json +c9d170be3d0ad11171449da98d3edac42de2dfab data/create/advancements/recipes/create.base/layered_limestone_from_limestone_stonecutting.json +f2985b6b3ae1c9f4af2eae76ba63f129ef6f6e28 data/create/advancements/recipes/create.base/layered_limestone_from_stone_types_limestone_stonecutting.json +5e26afbed98e1403897c00dc4f546e2e50bd8dfb data/create/advancements/recipes/create.base/layered_ochrum_from_ochrum_stonecutting.json +9d6f09080e3822bad136e405157dfe316b2e6371 data/create/advancements/recipes/create.base/layered_ochrum_from_stone_types_ochrum_stonecutting.json +9a3ee6235c6f817fabdd78799fd28184f39f00b5 data/create/advancements/recipes/create.base/layered_scorchia_from_scorchia_stonecutting.json +8ccd1142c7384665e8c4ee8fd1a0b70e19629f22 data/create/advancements/recipes/create.base/layered_scorchia_from_stone_types_scorchia_stonecutting.json +24402ed4dc9a76c1e3d5d0e307d6ad7b926e798b data/create/advancements/recipes/create.base/layered_scoria_from_scoria_stonecutting.json +857dc86c30226f766d28317ed6822d8b2254e0a5 data/create/advancements/recipes/create.base/layered_scoria_from_stone_types_scoria_stonecutting.json +0141f9a512a8a7e8f595265d1ce3015cc6291c56 data/create/advancements/recipes/create.base/layered_tuff_from_stone_types_tuff_stonecutting.json +55df0bebc3e4c3f4e1c55b3ff24f9340605af24e data/create/advancements/recipes/create.base/layered_tuff_from_tuff_stonecutting.json +94722b51c4fbe9f9ff75a002cbdbdad244c434b1 data/create/advancements/recipes/create.base/layered_veridium_from_stone_types_veridium_stonecutting.json +6372ecc3cad33f5b1b6224bba09ceeba84c72a55 data/create/advancements/recipes/create.base/layered_veridium_from_veridium_stonecutting.json +a50ae92f63a26e0baa28fc5ab0b04356c046df3f data/create/advancements/recipes/create.base/limestone_pillar_from_limestone_stonecutting.json +00529d5adf436743a3b5e1cd32db4198cbe7d5e0 data/create/advancements/recipes/create.base/limestone_pillar_from_stone_types_limestone_stonecutting.json +888b844c55a3457db50de4b3150f3db64717815b data/create/advancements/recipes/create.base/oak_window.json +ea8ec2e00c9d88b9a58202033c483efa068a15b5 data/create/advancements/recipes/create.base/oak_window_pane.json +7ac4e8386d77e36c0d921e31b3860eb8d0eb9f46 data/create/advancements/recipes/create.base/ochrum_pillar_from_ochrum_stonecutting.json +5c662131b9d73434a5ee6abda5b6f5b9819e194d data/create/advancements/recipes/create.base/ochrum_pillar_from_stone_types_ochrum_stonecutting.json +fc374d88e9f4ffeb54348a611dc470f148c572de data/create/advancements/recipes/create.base/ornate_iron_window.json +47aebe2078baf3b0c22f09934461f7376ebbea39 data/create/advancements/recipes/create.base/ornate_iron_window_pane.json f252ece4cb4229302f9f7cb490d3a2722856660a data/create/advancements/recipes/create.base/oxidized_copper_shingle_slab.json 71c3e234e634292b28a4409179d9c96982d88631 data/create/advancements/recipes/create.base/oxidized_copper_shingle_slab_from_oxidized_copper_shingles_stonecutting.json a0cca91653064ca509a1dc499ff6d9fd8ae80584 data/create/advancements/recipes/create.base/oxidized_copper_shingle_stairs.json @@ -2559,12 +2962,365 @@ f35f31c4ce11e8aaf6eef0e840eced22d969c614 data/create/advancements/recipes/create 873bedb88243757360f8c49b15eef4d8f28c09da data/create/advancements/recipes/create.base/oxidized_copper_tile_slab_from_oxidized_copper_tiles_stonecutting.json f89386ad5e50a50cfb2d423b9543c1bb7b6fd867 data/create/advancements/recipes/create.base/oxidized_copper_tile_stairs.json 18dac4389d7b0fac7287dfa8dd21b65a0b04cfb6 data/create/advancements/recipes/create.base/oxidized_copper_tile_stairs_from_oxidized_copper_tiles_stonecutting.json +0b40d3c37e27d9d9297f050ad710af6c17821954 data/create/advancements/recipes/create.base/polished_cut_andesite_from_andesite_stonecutting.json +eb1770f5e5f4384e84ae90e566d0d48a857b7748 data/create/advancements/recipes/create.base/polished_cut_andesite_from_stone_types_andesite_stonecutting.json +f586b7389c46acb2ade3286ea234e5b37bfd728c data/create/advancements/recipes/create.base/polished_cut_andesite_slab.json +5b516a1a4d06ef3feda840a17210163c2ca877dc data/create/advancements/recipes/create.base/polished_cut_andesite_slab_from_andesite_stonecutting.json +498fc5a6424fe6c88ebd4cc8b53f6d676e9d9188 data/create/advancements/recipes/create.base/polished_cut_andesite_slab_from_stone_types_andesite_stonecutting.json +ffb80923d91ca656fe305c11bba42558586fe0e1 data/create/advancements/recipes/create.base/polished_cut_andesite_slab_recycling.json +e45b2859f682f0d5a79c8f512d729cdab0f41b07 data/create/advancements/recipes/create.base/polished_cut_andesite_stairs.json +b9cb136ee1bcdbae5baa6704f41344243f5652a0 data/create/advancements/recipes/create.base/polished_cut_andesite_stairs_from_andesite_stonecutting.json +10cc2ca75bb30b053fa69d068d2a9c7ef87637ba data/create/advancements/recipes/create.base/polished_cut_andesite_stairs_from_stone_types_andesite_stonecutting.json +583ce4d1c1cd552d5a72699a37674249fe7401f0 data/create/advancements/recipes/create.base/polished_cut_andesite_wall.json +c90cb91b0727412c50f4305f1adef672eb8f8cf8 data/create/advancements/recipes/create.base/polished_cut_andesite_wall_from_andesite_stonecutting.json +9f8caf52e6c3dfc2016c426a50f815f960d5269b data/create/advancements/recipes/create.base/polished_cut_andesite_wall_from_stone_types_andesite_stonecutting.json +4ebcf46e0f0d7137edffd0b5aac21891166ccb63 data/create/advancements/recipes/create.base/polished_cut_asurine_from_asurine_stonecutting.json +0b3a9ded875cda304807d42cda63ae21501b7634 data/create/advancements/recipes/create.base/polished_cut_asurine_from_stone_types_asurine_stonecutting.json +a130d8dbcce578935f80f88ec0fa358f4228dac5 data/create/advancements/recipes/create.base/polished_cut_asurine_slab.json +783b09282793015d63e0b1cf4985d3f7c244ab0f data/create/advancements/recipes/create.base/polished_cut_asurine_slab_from_asurine_stonecutting.json +cc13d3f0bff3f2b0bf2de85abca00705e4a81e37 data/create/advancements/recipes/create.base/polished_cut_asurine_slab_from_stone_types_asurine_stonecutting.json +7010ab9ffc821bb275b4cec27f2c9db9622af9d1 data/create/advancements/recipes/create.base/polished_cut_asurine_slab_recycling.json +1096c59d9bd15cb8aab394fe0ff66da80cc46a81 data/create/advancements/recipes/create.base/polished_cut_asurine_stairs.json +b2e6570b18c61be6eb6a2444ed39bf0fa5c95aa0 data/create/advancements/recipes/create.base/polished_cut_asurine_stairs_from_asurine_stonecutting.json +cdfb66d340fa033a39542c01037f5496e855bd23 data/create/advancements/recipes/create.base/polished_cut_asurine_stairs_from_stone_types_asurine_stonecutting.json +e320c6c5dbd309ba5350849272bb23144efb3476 data/create/advancements/recipes/create.base/polished_cut_asurine_wall.json +7f1d8de21421010fb26d1c766937b325e189299e data/create/advancements/recipes/create.base/polished_cut_asurine_wall_from_asurine_stonecutting.json +6f5ffa6740da9bf04fdda7c98c3cdb5cbd57197c data/create/advancements/recipes/create.base/polished_cut_asurine_wall_from_stone_types_asurine_stonecutting.json +a4c629631e8e5c7986f57f3d6bb91f7b7d3e418c data/create/advancements/recipes/create.base/polished_cut_calcite_from_calcite_stonecutting.json +8d10a06915727fb18d700ae070bc86ea043016e0 data/create/advancements/recipes/create.base/polished_cut_calcite_from_stone_types_calcite_stonecutting.json +dffa80dc9d33f51a09e83a2cd0853bb1b8fe02f2 data/create/advancements/recipes/create.base/polished_cut_calcite_slab.json +77d2be04354b5dae58a2caa21a58da8850f1eb56 data/create/advancements/recipes/create.base/polished_cut_calcite_slab_from_calcite_stonecutting.json +29f32235d5e2c2c459be7713aa3a1483e97f4962 data/create/advancements/recipes/create.base/polished_cut_calcite_slab_from_stone_types_calcite_stonecutting.json +efdd09efc26d6bb5c09bb675000cd2184270b7d2 data/create/advancements/recipes/create.base/polished_cut_calcite_slab_recycling.json +741258ec7ed31fe52b6ba4dbbcb862416aaa58f7 data/create/advancements/recipes/create.base/polished_cut_calcite_stairs.json +df7e7d2a22cbdee7d1da8de5f3b72442888f95e9 data/create/advancements/recipes/create.base/polished_cut_calcite_stairs_from_calcite_stonecutting.json +aad8f2c37d1f9afc4458af9bc80e7c6126439405 data/create/advancements/recipes/create.base/polished_cut_calcite_stairs_from_stone_types_calcite_stonecutting.json +a7b17e5de70e3bafe3c8baa6eaca46d2960a4e8f data/create/advancements/recipes/create.base/polished_cut_calcite_wall.json +33a3beefad529ad38530465187c47d220d7ee67b data/create/advancements/recipes/create.base/polished_cut_calcite_wall_from_calcite_stonecutting.json +5c01adcb1cb87295fd04dacebb5233dcb0f106f3 data/create/advancements/recipes/create.base/polished_cut_calcite_wall_from_stone_types_calcite_stonecutting.json +2a2287b48f280d708bf1ace15a6cf47f843bcc3d data/create/advancements/recipes/create.base/polished_cut_crimsite_from_crimsite_stonecutting.json +836c453c4402f4ab1987739ee6917fdbf8876c67 data/create/advancements/recipes/create.base/polished_cut_crimsite_from_stone_types_crimsite_stonecutting.json +921bba5dd275e352ec70dae77d4cb5f827b102fb data/create/advancements/recipes/create.base/polished_cut_crimsite_slab.json +262379573371a647dc8db16c20b6839f8d84a83a data/create/advancements/recipes/create.base/polished_cut_crimsite_slab_from_crimsite_stonecutting.json +c789071c930dd96e5bb94c52cb5e829cf8f1af85 data/create/advancements/recipes/create.base/polished_cut_crimsite_slab_from_stone_types_crimsite_stonecutting.json +68acda5eec2763d5dfb5b5a3a4189c038be977fe data/create/advancements/recipes/create.base/polished_cut_crimsite_slab_recycling.json +d815d1c9ac0ce8da57d70c9d032b89735c4b195a data/create/advancements/recipes/create.base/polished_cut_crimsite_stairs.json +a08fbc497ae4ac3d5329a9d821f34122d4594f5b data/create/advancements/recipes/create.base/polished_cut_crimsite_stairs_from_crimsite_stonecutting.json +fe7bf3b4a8ba0198cd554e6688b63882f06598c8 data/create/advancements/recipes/create.base/polished_cut_crimsite_stairs_from_stone_types_crimsite_stonecutting.json +7d98c180a3e607debdf445716a0afb7871365c55 data/create/advancements/recipes/create.base/polished_cut_crimsite_wall.json +1e4dc3659a7b4ea19892f46e79e64d39e00f91eb data/create/advancements/recipes/create.base/polished_cut_crimsite_wall_from_crimsite_stonecutting.json +3288269fcb833e800eb85b63772f6ac31470fcac data/create/advancements/recipes/create.base/polished_cut_crimsite_wall_from_stone_types_crimsite_stonecutting.json +a5af84ab6d956cd2e792089c29a537fac38385af data/create/advancements/recipes/create.base/polished_cut_deepslate_from_deepslate_stonecutting.json +a8f643103c2a090ec8528bb809e34b62a7be6e30 data/create/advancements/recipes/create.base/polished_cut_deepslate_from_stone_types_deepslate_stonecutting.json +cf7e54d4de0878a8897b88d2f665e18a5f9a2c98 data/create/advancements/recipes/create.base/polished_cut_deepslate_slab.json +c7362df3fc83656fe7303b4387d73025f2b4ad99 data/create/advancements/recipes/create.base/polished_cut_deepslate_slab_from_deepslate_stonecutting.json +13452ee3337ec5593a39ef5bef11d417954bd2d4 data/create/advancements/recipes/create.base/polished_cut_deepslate_slab_from_stone_types_deepslate_stonecutting.json +f81f073c058eb2cc11d9da867623de6236334d1f data/create/advancements/recipes/create.base/polished_cut_deepslate_slab_recycling.json +b20598c000e99606a312afc03ba7b42848df8577 data/create/advancements/recipes/create.base/polished_cut_deepslate_stairs.json +061f866c67d85de04de23c0b50e4452d0e4873b4 data/create/advancements/recipes/create.base/polished_cut_deepslate_stairs_from_deepslate_stonecutting.json +24a45f95f9712d5a1c13d3ff9b39852315642ab3 data/create/advancements/recipes/create.base/polished_cut_deepslate_stairs_from_stone_types_deepslate_stonecutting.json +0311f17cd4a3fe104ddbc7274b79af4ac1d225f8 data/create/advancements/recipes/create.base/polished_cut_deepslate_wall.json +fb97fa5120b6fb5517ee10dd9881bcd9d963056b data/create/advancements/recipes/create.base/polished_cut_deepslate_wall_from_deepslate_stonecutting.json +96503ff4f30270817cd1533a8176c79bbf31ace5 data/create/advancements/recipes/create.base/polished_cut_deepslate_wall_from_stone_types_deepslate_stonecutting.json +5508cc3ff907f1d14aa8d3f95f76b3f78f8ec92a data/create/advancements/recipes/create.base/polished_cut_diorite_from_diorite_stonecutting.json +5c2db9e1c43373ac00b3b4d8e91ef6fc02c44246 data/create/advancements/recipes/create.base/polished_cut_diorite_from_stone_types_diorite_stonecutting.json +3b29c85c6b110ac2972b4256ba7263e8c9f8b8eb data/create/advancements/recipes/create.base/polished_cut_diorite_slab.json +1db0b4fc490e3be9940e9be389640158576cde1c data/create/advancements/recipes/create.base/polished_cut_diorite_slab_from_diorite_stonecutting.json +451845eeb640288c8bf71217beaeff72ad6cf193 data/create/advancements/recipes/create.base/polished_cut_diorite_slab_from_stone_types_diorite_stonecutting.json +7744af97556df2cc2e0a0df82848fbfc83b84e5e data/create/advancements/recipes/create.base/polished_cut_diorite_slab_recycling.json +9c65eb9ef807c50a6b4bff8e84155ec571f43b97 data/create/advancements/recipes/create.base/polished_cut_diorite_stairs.json +558ab6f3ccd4093620c2fc3d55d97c2f072cd052 data/create/advancements/recipes/create.base/polished_cut_diorite_stairs_from_diorite_stonecutting.json +9a2b884dba5c009b3270362a96a2e35af8f6c7a3 data/create/advancements/recipes/create.base/polished_cut_diorite_stairs_from_stone_types_diorite_stonecutting.json +f5776826b97bb85f2dcb5e31f38ea0861f09fa34 data/create/advancements/recipes/create.base/polished_cut_diorite_wall.json +bbc453f07cbce4aab18c8b268ef0e67d2c67ac9d data/create/advancements/recipes/create.base/polished_cut_diorite_wall_from_diorite_stonecutting.json +a13b9c144f6b4025bc09321bcaf10d6e8819fe6c data/create/advancements/recipes/create.base/polished_cut_diorite_wall_from_stone_types_diorite_stonecutting.json +5f0d40b2900cb1b7524851b3378dc54db5899bd9 data/create/advancements/recipes/create.base/polished_cut_dripstone_from_dripstone_block_stonecutting.json +5f3e729a2078e9c4a63910ffb94643c8e404b4b9 data/create/advancements/recipes/create.base/polished_cut_dripstone_from_stone_types_dripstone_stonecutting.json +7aea176a86176ba501a6dd81a510c4b7aee6bc1f data/create/advancements/recipes/create.base/polished_cut_dripstone_slab.json +cdb572a8e8d0947abad7751217c922fc02774feb data/create/advancements/recipes/create.base/polished_cut_dripstone_slab_from_dripstone_block_stonecutting.json +d7fad9d7b21fa919e2748559ae19fe8469802f18 data/create/advancements/recipes/create.base/polished_cut_dripstone_slab_from_stone_types_dripstone_stonecutting.json +285183adee8c2a49533cfbb90e43c6d52479aba3 data/create/advancements/recipes/create.base/polished_cut_dripstone_slab_recycling.json +c6d87b066cb569cb02b2e45350ad9dd501119da8 data/create/advancements/recipes/create.base/polished_cut_dripstone_stairs.json +2feffefb1a004a6351e77fef280f715b19f23ce5 data/create/advancements/recipes/create.base/polished_cut_dripstone_stairs_from_dripstone_block_stonecutting.json +ac6c23c5055b6f6d052ef77fd5e5d9abe03aae50 data/create/advancements/recipes/create.base/polished_cut_dripstone_stairs_from_stone_types_dripstone_stonecutting.json +9c00100b2480e96208878ebeb5d4bd0fad8b2f1b data/create/advancements/recipes/create.base/polished_cut_dripstone_wall.json +6400512ddccf789552754c4926af61e9d756b0e5 data/create/advancements/recipes/create.base/polished_cut_dripstone_wall_from_dripstone_block_stonecutting.json +9a7aab1384a2bd16e9c770b1ee4272ec7da3a0b7 data/create/advancements/recipes/create.base/polished_cut_dripstone_wall_from_stone_types_dripstone_stonecutting.json +c1fde3a2ae63f264607d2636fd7a941bd69ada4a data/create/advancements/recipes/create.base/polished_cut_granite_from_granite_stonecutting.json +02f95a7c77a6f3fb4c0e9dee5e2b0a1ed29c6829 data/create/advancements/recipes/create.base/polished_cut_granite_from_stone_types_granite_stonecutting.json +b2996c37a3c275fa660efacb5dec09018186ed0d data/create/advancements/recipes/create.base/polished_cut_granite_slab.json +fbeb3b9dfc033b5a42015ba3e7d86efd64e3540e data/create/advancements/recipes/create.base/polished_cut_granite_slab_from_granite_stonecutting.json +5443afc05d1b2ddf40529b464b4dc1c23f842c08 data/create/advancements/recipes/create.base/polished_cut_granite_slab_from_stone_types_granite_stonecutting.json +10fd18e20c3fb1ceeab330dbf31e26955529e828 data/create/advancements/recipes/create.base/polished_cut_granite_slab_recycling.json +1b2dc9a3fe173206b9f1245d37c09eb38170fc3f data/create/advancements/recipes/create.base/polished_cut_granite_stairs.json +6ecfa15ad72f14a2bea19f46d3094d8ba9c62d42 data/create/advancements/recipes/create.base/polished_cut_granite_stairs_from_granite_stonecutting.json +97569ef21a72a255d19686160784867cc3432abf data/create/advancements/recipes/create.base/polished_cut_granite_stairs_from_stone_types_granite_stonecutting.json +8091977361291921fd9f243e12a5aa1cca86a18c data/create/advancements/recipes/create.base/polished_cut_granite_wall.json +5470b3e84aba29d3a7d2aa97b58ddf11bf2bd151 data/create/advancements/recipes/create.base/polished_cut_granite_wall_from_granite_stonecutting.json +f3bf3d42c94118089e325b665defa5d247200ff4 data/create/advancements/recipes/create.base/polished_cut_granite_wall_from_stone_types_granite_stonecutting.json +c96de26c50e58385cad94a78cfeb58608661772d data/create/advancements/recipes/create.base/polished_cut_limestone_from_limestone_stonecutting.json +9b382f040e4d2242d622d41e1e79d3968098bda3 data/create/advancements/recipes/create.base/polished_cut_limestone_from_stone_types_limestone_stonecutting.json +cae79fa85c4a0b5ce93bfcd6bbb5fed19bb7d949 data/create/advancements/recipes/create.base/polished_cut_limestone_slab.json +e032f7dd47f920cdcc92022f765b9c1cb3a226a5 data/create/advancements/recipes/create.base/polished_cut_limestone_slab_from_limestone_stonecutting.json +7ec1c771d5999fe790c73acd3270897c6598568a data/create/advancements/recipes/create.base/polished_cut_limestone_slab_from_stone_types_limestone_stonecutting.json +93355df15c9e8121be008d60999d50b51937a398 data/create/advancements/recipes/create.base/polished_cut_limestone_slab_recycling.json +894b1fe416b1ae96063ed2ba31705ed4ad688053 data/create/advancements/recipes/create.base/polished_cut_limestone_stairs.json +e0e891afe059478ecb7dc3af703f8d588415319e data/create/advancements/recipes/create.base/polished_cut_limestone_stairs_from_limestone_stonecutting.json +047785396cae4b06ca4adceb3fe3015c409d0ba0 data/create/advancements/recipes/create.base/polished_cut_limestone_stairs_from_stone_types_limestone_stonecutting.json +c58d0114ce5fff8707391bde70427fdc566da9df data/create/advancements/recipes/create.base/polished_cut_limestone_wall.json +04b685f0b61c0d51a5487b5dd8de637b4bf831e7 data/create/advancements/recipes/create.base/polished_cut_limestone_wall_from_limestone_stonecutting.json +2095b7ecf5c436fb8f74dfa36c3ffacbcf96e085 data/create/advancements/recipes/create.base/polished_cut_limestone_wall_from_stone_types_limestone_stonecutting.json +8b73abf2e6ee23bf4ba88403fa2c5f35d5891347 data/create/advancements/recipes/create.base/polished_cut_ochrum_from_ochrum_stonecutting.json +6ba244a42d0c383b21fe18a397c29622995e05dc data/create/advancements/recipes/create.base/polished_cut_ochrum_from_stone_types_ochrum_stonecutting.json +b2b8109f6d9fb8d029316003d0e9d74d484fe116 data/create/advancements/recipes/create.base/polished_cut_ochrum_slab.json +20fab23493e8cb492a8e3125c03745a8a29fd020 data/create/advancements/recipes/create.base/polished_cut_ochrum_slab_from_ochrum_stonecutting.json +db6dc05898baf5cceaf815640bf2ac7d2e4a0915 data/create/advancements/recipes/create.base/polished_cut_ochrum_slab_from_stone_types_ochrum_stonecutting.json +50a4287e0e8f76ac7f2925bdf6f7f49f3c97da38 data/create/advancements/recipes/create.base/polished_cut_ochrum_slab_recycling.json +8e6cf6b4f820aa723c8d1c662c67b50b4f724e63 data/create/advancements/recipes/create.base/polished_cut_ochrum_stairs.json +838e99e7e4f101fc55e4ed92d030a54f8e8aee46 data/create/advancements/recipes/create.base/polished_cut_ochrum_stairs_from_ochrum_stonecutting.json +70f9e2092b03692a8920c690795215cb29c471f3 data/create/advancements/recipes/create.base/polished_cut_ochrum_stairs_from_stone_types_ochrum_stonecutting.json +af0d4bbd836b87bf38a7a4117f614e4aad777b4a data/create/advancements/recipes/create.base/polished_cut_ochrum_wall.json +d14cf0e70d39c721df6275c18ae8a15ec34222cc data/create/advancements/recipes/create.base/polished_cut_ochrum_wall_from_ochrum_stonecutting.json +e4d857ced76c0b5c114bc9ee7f2c0564913e2328 data/create/advancements/recipes/create.base/polished_cut_ochrum_wall_from_stone_types_ochrum_stonecutting.json +fdab7e664df92355afa6cf69ddafcf3b4c7953c1 data/create/advancements/recipes/create.base/polished_cut_scorchia_from_scorchia_stonecutting.json +6432437da5619bc6b1e444afed630e5eed306809 data/create/advancements/recipes/create.base/polished_cut_scorchia_from_stone_types_scorchia_stonecutting.json +753e307037d68b9d2fdccf0c81df38e8f3d455ff data/create/advancements/recipes/create.base/polished_cut_scorchia_slab.json +f0b3ae066debd5cb47dbd0ba0ca10687fe85b5aa data/create/advancements/recipes/create.base/polished_cut_scorchia_slab_from_scorchia_stonecutting.json +abb08b61c0397fcac8da1ea1d9bc4893e34ee785 data/create/advancements/recipes/create.base/polished_cut_scorchia_slab_from_stone_types_scorchia_stonecutting.json +f43693ed17af0a290d4c6617e19bcbe96c45c948 data/create/advancements/recipes/create.base/polished_cut_scorchia_slab_recycling.json +d3336915f5107648e5cbb88faf5b9a7933544290 data/create/advancements/recipes/create.base/polished_cut_scorchia_stairs.json +c55240e40f9eff5b80c9c03e10145c3ee730c0cd data/create/advancements/recipes/create.base/polished_cut_scorchia_stairs_from_scorchia_stonecutting.json +42c1752adaad2165bdac0b9c7dad92378551afa5 data/create/advancements/recipes/create.base/polished_cut_scorchia_stairs_from_stone_types_scorchia_stonecutting.json +0b188fe4f974de39e0bc95455d7535a23e360da3 data/create/advancements/recipes/create.base/polished_cut_scorchia_wall.json +e224056d60c369e2660f80f76d18ac2805a5bc50 data/create/advancements/recipes/create.base/polished_cut_scorchia_wall_from_scorchia_stonecutting.json +41550259417179d27e4c4757d5d3238fad7e604c data/create/advancements/recipes/create.base/polished_cut_scorchia_wall_from_stone_types_scorchia_stonecutting.json +699455869dd9c5da41c75837128f8ea8869b03a9 data/create/advancements/recipes/create.base/polished_cut_scoria_from_scoria_stonecutting.json +7ba8670830cc9d75d9fde0b9f8755ce17a8e9ef0 data/create/advancements/recipes/create.base/polished_cut_scoria_from_stone_types_scoria_stonecutting.json +66703005f99a94fc6ea5116137cdd9f92587c65b data/create/advancements/recipes/create.base/polished_cut_scoria_slab.json +5b975acadbb183094d163d6adf86e383570a568b data/create/advancements/recipes/create.base/polished_cut_scoria_slab_from_scoria_stonecutting.json +845e9a421824a08cbaa1e1fc6ec5a516951aeb8b data/create/advancements/recipes/create.base/polished_cut_scoria_slab_from_stone_types_scoria_stonecutting.json +4eb724b4e98fdbac78cd477c81bddf311baa7be1 data/create/advancements/recipes/create.base/polished_cut_scoria_slab_recycling.json +78b17572dcb97167336e578884cd654e6722c736 data/create/advancements/recipes/create.base/polished_cut_scoria_stairs.json +a128199102f8470872df8795d447d42a6b3e3f2a data/create/advancements/recipes/create.base/polished_cut_scoria_stairs_from_scoria_stonecutting.json +06d4e87d154a43a1b24ef0a59f5bfd86ff1aa7fd data/create/advancements/recipes/create.base/polished_cut_scoria_stairs_from_stone_types_scoria_stonecutting.json +b23bfe7dec5d9d1653f80083372b09a175346c09 data/create/advancements/recipes/create.base/polished_cut_scoria_wall.json +44700241f1ac0dd1b89fc5f4e2e1278282905b15 data/create/advancements/recipes/create.base/polished_cut_scoria_wall_from_scoria_stonecutting.json +f0fdcd21fc01252a09c011c3b7b90976e5c9a13e data/create/advancements/recipes/create.base/polished_cut_scoria_wall_from_stone_types_scoria_stonecutting.json +0a8e730ebb689e91be2612322b75f2cb6741c278 data/create/advancements/recipes/create.base/polished_cut_tuff_from_stone_types_tuff_stonecutting.json +87a070369be46ec6bdd832b9cd68c91d7ce30d08 data/create/advancements/recipes/create.base/polished_cut_tuff_from_tuff_stonecutting.json +2167409e5ce55b3aac7459adff0c8f0d292d1ee4 data/create/advancements/recipes/create.base/polished_cut_tuff_slab.json +d32637133a669cfe3e79162d5b81371424c30e1a data/create/advancements/recipes/create.base/polished_cut_tuff_slab_from_stone_types_tuff_stonecutting.json +25047a59d37af5ac03a653a78e281f2018ddd59c data/create/advancements/recipes/create.base/polished_cut_tuff_slab_from_tuff_stonecutting.json +3a0ac46378189ad7a277404c1b8cf8531d4a1af9 data/create/advancements/recipes/create.base/polished_cut_tuff_slab_recycling.json +f1b33402a22f88b3800c13937c5ca5d520100c61 data/create/advancements/recipes/create.base/polished_cut_tuff_stairs.json +83f06b5a4df8123f030636d63e593ee3e707c9e6 data/create/advancements/recipes/create.base/polished_cut_tuff_stairs_from_stone_types_tuff_stonecutting.json +78ebd52a223e6487f4cce74d1ba989b3a8d9593e data/create/advancements/recipes/create.base/polished_cut_tuff_stairs_from_tuff_stonecutting.json +1d26b42d8c61dbb217d6ad556c7834c539d516f3 data/create/advancements/recipes/create.base/polished_cut_tuff_wall.json +8eebf6f7e1b35b2450c1cdb359f945afe938842d data/create/advancements/recipes/create.base/polished_cut_tuff_wall_from_stone_types_tuff_stonecutting.json +4fbd528e080da120b653cacaca3a0f31bc01966e data/create/advancements/recipes/create.base/polished_cut_tuff_wall_from_tuff_stonecutting.json +dd96bad1261056a3dc85daa14a86ae35c3359ebc data/create/advancements/recipes/create.base/polished_cut_veridium_from_stone_types_veridium_stonecutting.json +f2c6750f75781a820b2336e6bdf4306d843fb367 data/create/advancements/recipes/create.base/polished_cut_veridium_from_veridium_stonecutting.json +2c41806191b7fa295626ebff3f730c57e7548366 data/create/advancements/recipes/create.base/polished_cut_veridium_slab.json +40dee410400577705156205da0283210f316df73 data/create/advancements/recipes/create.base/polished_cut_veridium_slab_from_stone_types_veridium_stonecutting.json +5d8d8bdedad5c1e1c9f1eb433907b96994647293 data/create/advancements/recipes/create.base/polished_cut_veridium_slab_from_veridium_stonecutting.json +0f5ede2179f6111df2ab5b122992e0ed3b07cc12 data/create/advancements/recipes/create.base/polished_cut_veridium_slab_recycling.json +d3c67a4faf93190e1de2cc3a45ceff05b566f143 data/create/advancements/recipes/create.base/polished_cut_veridium_stairs.json +f9654753495f21ebc977577bd68b48f9342d28eb data/create/advancements/recipes/create.base/polished_cut_veridium_stairs_from_stone_types_veridium_stonecutting.json +9aeefc092662b2e70ae5f31f87ea8b08e1e44e91 data/create/advancements/recipes/create.base/polished_cut_veridium_stairs_from_veridium_stonecutting.json +cddfc113bdeb65b6c3b6c03464f8c1b58184a03a data/create/advancements/recipes/create.base/polished_cut_veridium_wall.json +3fba2f3cbf33e52859936c79dbe35889e1feca9f data/create/advancements/recipes/create.base/polished_cut_veridium_wall_from_stone_types_veridium_stonecutting.json +7530647e53e597277c53f774a48482322b4950e0 data/create/advancements/recipes/create.base/polished_cut_veridium_wall_from_veridium_stonecutting.json 57b304371e080df11d87a539b1c5b30721057ce6 data/create/advancements/recipes/create.base/rose_quartz_block_from_rose_quartz_stonecutting.json 6afa5267c43c3592a5da7d9f4526b712d5ef5b15 data/create/advancements/recipes/create.base/rose_quartz_tiles_from_polished_rose_quartz_stonecutting.json +4436c573f6c2f8f2e3b5de43e405e832546e04e0 data/create/advancements/recipes/create.base/scorchia_pillar_from_scorchia_stonecutting.json +3b5e6ce9528b42d64c0250a09ed4e0e3d4102f31 data/create/advancements/recipes/create.base/scorchia_pillar_from_stone_types_scorchia_stonecutting.json +a18f7ceb32cf98586d8ddd6e1df329d2a6b1a65d data/create/advancements/recipes/create.base/scoria_pillar_from_scoria_stonecutting.json +0bbd23987408b918e3e5766c61cb39ac59dbd544 data/create/advancements/recipes/create.base/scoria_pillar_from_stone_types_scoria_stonecutting.json +300cacc3afa69c36c6b1391381270dba70187acc data/create/advancements/recipes/create.base/small_andesite_brick_slab.json +de4845cc4b4f437b24c98b7a15a8b7c5786402e0 data/create/advancements/recipes/create.base/small_andesite_brick_slab_from_andesite_stonecutting.json +d6c0a0785c9008027f7f63068df1e82dfee732f6 data/create/advancements/recipes/create.base/small_andesite_brick_slab_from_stone_types_andesite_stonecutting.json +afd51e720e7779ab3238d73ef18f377758f02945 data/create/advancements/recipes/create.base/small_andesite_brick_slab_recycling.json +96c29ddb61670374f4cf766f9c6d64c97a931d87 data/create/advancements/recipes/create.base/small_andesite_brick_stairs.json +dc92752a2bd894fcdaef6749b1b99ba89fe6d2bd data/create/advancements/recipes/create.base/small_andesite_brick_stairs_from_andesite_stonecutting.json +827f8ef1514d72e8312e0a9024eadd2e7f326d37 data/create/advancements/recipes/create.base/small_andesite_brick_stairs_from_stone_types_andesite_stonecutting.json +73f91c7b0977aee86db964dfa06482ead7d34d59 data/create/advancements/recipes/create.base/small_andesite_brick_wall.json +8c7303cbf6fd0725d020eeb19dde94b4184f3f14 data/create/advancements/recipes/create.base/small_andesite_brick_wall_from_andesite_stonecutting.json +17932fec4f5f86c474950dd2b5ea5b55448d0e52 data/create/advancements/recipes/create.base/small_andesite_brick_wall_from_stone_types_andesite_stonecutting.json +6435a60dc0a4ef7f404203a8cf8f648fbdb34ffc data/create/advancements/recipes/create.base/small_andesite_bricks_from_andesite_stonecutting.json +9318600c5c8ef54223304f64a165c6bc2f7156fa data/create/advancements/recipes/create.base/small_andesite_bricks_from_stone_types_andesite_stonecutting.json +4f14581c6b4a2c239be0bef509da8411d9ef8e26 data/create/advancements/recipes/create.base/small_asurine_brick_slab.json +6745e4ebb518ad80091556cbf32b973992e19b6c data/create/advancements/recipes/create.base/small_asurine_brick_slab_from_asurine_stonecutting.json +16273c6c2cb763447d19c12e99479d4315745ed7 data/create/advancements/recipes/create.base/small_asurine_brick_slab_from_stone_types_asurine_stonecutting.json +6892bde03d8a34708bd8765f757f71ec0d4e49fa data/create/advancements/recipes/create.base/small_asurine_brick_slab_recycling.json +37ba73538f245171593ac0a904b6bccf6d8bb2ef data/create/advancements/recipes/create.base/small_asurine_brick_stairs.json +2b97cf57bbb3ea62960106ba7cbaf9c56bbd315b data/create/advancements/recipes/create.base/small_asurine_brick_stairs_from_asurine_stonecutting.json +31427a313d87a0ed3c5834a1a268fc09c9d58d54 data/create/advancements/recipes/create.base/small_asurine_brick_stairs_from_stone_types_asurine_stonecutting.json +033cb0012b30bf16337c19cde62ed1e10315e6f3 data/create/advancements/recipes/create.base/small_asurine_brick_wall.json +54f142325e10921e7b3ebeace53ed15d1079c32a data/create/advancements/recipes/create.base/small_asurine_brick_wall_from_asurine_stonecutting.json +fcb103d6bb39b7143488d0579e033df829816d56 data/create/advancements/recipes/create.base/small_asurine_brick_wall_from_stone_types_asurine_stonecutting.json +b0735c0b0728d71ea71cc0fc3d683fb31b261334 data/create/advancements/recipes/create.base/small_asurine_bricks_from_asurine_stonecutting.json +6b946dfe1474d04e07583143eda6ff7300fb2e1c data/create/advancements/recipes/create.base/small_asurine_bricks_from_stone_types_asurine_stonecutting.json +5f374ed58d180ec77574fca1876eb7b2cbdb3a41 data/create/advancements/recipes/create.base/small_calcite_brick_slab.json +a24fddfe8d820ef1be9363f0fc9f2c09a70fc14c data/create/advancements/recipes/create.base/small_calcite_brick_slab_from_calcite_stonecutting.json +a145e089e956de4784fd72ade7b38c857a89a12a data/create/advancements/recipes/create.base/small_calcite_brick_slab_from_stone_types_calcite_stonecutting.json +cd69414cae0aeac920b8d2ee564a937e7a010bc0 data/create/advancements/recipes/create.base/small_calcite_brick_slab_recycling.json +ea5be41090edbe664014b9c524484e031b928694 data/create/advancements/recipes/create.base/small_calcite_brick_stairs.json +ced939524a59cfbad011466d0e8753ae64540ac6 data/create/advancements/recipes/create.base/small_calcite_brick_stairs_from_calcite_stonecutting.json +21379acdf4151f44e13cd655554e4656477940ee data/create/advancements/recipes/create.base/small_calcite_brick_stairs_from_stone_types_calcite_stonecutting.json +60223eee91b2700c398dce8cd591e7cd87c10894 data/create/advancements/recipes/create.base/small_calcite_brick_wall.json +e16ef0a5f3f17ec00cdea70b13b82c18c5da4509 data/create/advancements/recipes/create.base/small_calcite_brick_wall_from_calcite_stonecutting.json +deaa1726d8abb3ca45138f8e2df80ee7f9d9c7f9 data/create/advancements/recipes/create.base/small_calcite_brick_wall_from_stone_types_calcite_stonecutting.json +d064e0898e77e15b872e7443a1ca2fc7d681f5af data/create/advancements/recipes/create.base/small_calcite_bricks_from_calcite_stonecutting.json +e32092ab21903a55160f18963f541d08bda8cadf data/create/advancements/recipes/create.base/small_calcite_bricks_from_stone_types_calcite_stonecutting.json +5a072dcdeb8110b8a9d168e375ef1a640d969c97 data/create/advancements/recipes/create.base/small_crimsite_brick_slab.json +b679037ec984a118274ce6960c4c6f45620426d9 data/create/advancements/recipes/create.base/small_crimsite_brick_slab_from_crimsite_stonecutting.json +d392a5d566c1068fdcb249e6d9e716a6f4a94d20 data/create/advancements/recipes/create.base/small_crimsite_brick_slab_from_stone_types_crimsite_stonecutting.json +4d69e7036a2634920ef70e8011cc0608bde1eca1 data/create/advancements/recipes/create.base/small_crimsite_brick_slab_recycling.json +9d136af48f43718fc26652e5d8916fbde25e8701 data/create/advancements/recipes/create.base/small_crimsite_brick_stairs.json +ee72409dbfeee185e67c13ade6e32f458c531ed1 data/create/advancements/recipes/create.base/small_crimsite_brick_stairs_from_crimsite_stonecutting.json +e80548fd94390467a8905f22a25998342246d9fa data/create/advancements/recipes/create.base/small_crimsite_brick_stairs_from_stone_types_crimsite_stonecutting.json +79d090f6779afdd6d9d67a745398ac249d832ff6 data/create/advancements/recipes/create.base/small_crimsite_brick_wall.json +80dd89a2ededa556394892c116f1cc7685e83910 data/create/advancements/recipes/create.base/small_crimsite_brick_wall_from_crimsite_stonecutting.json +d3971d31714ce7f275b9a443c5dd866f6b801894 data/create/advancements/recipes/create.base/small_crimsite_brick_wall_from_stone_types_crimsite_stonecutting.json +712a112040f7ac193ba189b4a8628f2d13da3bc9 data/create/advancements/recipes/create.base/small_crimsite_bricks_from_crimsite_stonecutting.json +29784f85f09d61f787325b2f5e74ebfd00dda19f data/create/advancements/recipes/create.base/small_crimsite_bricks_from_stone_types_crimsite_stonecutting.json +1b8c01d276baafa9a191755a6fd6ce7cb801d457 data/create/advancements/recipes/create.base/small_deepslate_brick_slab.json +16fcc4339bbbbd0d1cd17c2e3b62750d08fa7fec data/create/advancements/recipes/create.base/small_deepslate_brick_slab_from_deepslate_stonecutting.json +2ed38cbe7c1d40b35dd6cb37afd88547ae16e9a4 data/create/advancements/recipes/create.base/small_deepslate_brick_slab_from_stone_types_deepslate_stonecutting.json +70e7e03e53c2216a260b72c9ea09b23b4de067d4 data/create/advancements/recipes/create.base/small_deepslate_brick_slab_recycling.json +43eb80bfac7fa5f472a99351271f4dc3f4aeab07 data/create/advancements/recipes/create.base/small_deepslate_brick_stairs.json +8bc70944652d1e77f4c72112ea0f1b2e254e081b data/create/advancements/recipes/create.base/small_deepslate_brick_stairs_from_deepslate_stonecutting.json +83f7dad65ad4ea3bd94be6044befa01702fbb353 data/create/advancements/recipes/create.base/small_deepslate_brick_stairs_from_stone_types_deepslate_stonecutting.json +2dcffd52b1f7944785ba99152bb03560e0129376 data/create/advancements/recipes/create.base/small_deepslate_brick_wall.json +229e5fd0e8d134f77a6ffc82df399d74ee945609 data/create/advancements/recipes/create.base/small_deepslate_brick_wall_from_deepslate_stonecutting.json +4f6383db36710be1c631906f55db5bb1ad218a06 data/create/advancements/recipes/create.base/small_deepslate_brick_wall_from_stone_types_deepslate_stonecutting.json +82034fa5341a792b44b57da0fb93da5afd5203a2 data/create/advancements/recipes/create.base/small_deepslate_bricks_from_deepslate_stonecutting.json +16495dbb600f4211928fed061ed4c47572838fa5 data/create/advancements/recipes/create.base/small_deepslate_bricks_from_stone_types_deepslate_stonecutting.json +c0f83424aec4cbadf07ef0badea726ce29e0167a data/create/advancements/recipes/create.base/small_diorite_brick_slab.json +02d7f9a8205eebbe40557f3846a4685cdcc03021 data/create/advancements/recipes/create.base/small_diorite_brick_slab_from_diorite_stonecutting.json +668c9cfd9894ae917aab4b7844dfb2fe76602f41 data/create/advancements/recipes/create.base/small_diorite_brick_slab_from_stone_types_diorite_stonecutting.json +3267f2eeffef0339d3b13e67dc090786d28914d5 data/create/advancements/recipes/create.base/small_diorite_brick_slab_recycling.json +a83a561c5f0bf3987c55cebc95a55d57534d9e84 data/create/advancements/recipes/create.base/small_diorite_brick_stairs.json +4b67330f1267b11fea38b0d01d394724f4009ba6 data/create/advancements/recipes/create.base/small_diorite_brick_stairs_from_diorite_stonecutting.json +4960ed2fa02a1f9b7db3d1c67f46c05a149deaf9 data/create/advancements/recipes/create.base/small_diorite_brick_stairs_from_stone_types_diorite_stonecutting.json +effd3e58e297d221b34b4c8e8a75de4270fee267 data/create/advancements/recipes/create.base/small_diorite_brick_wall.json +be04f12a749038ec48af9894e764dcc11d518290 data/create/advancements/recipes/create.base/small_diorite_brick_wall_from_diorite_stonecutting.json +a7bf592296f090230c24ac943f116ae278550ffa data/create/advancements/recipes/create.base/small_diorite_brick_wall_from_stone_types_diorite_stonecutting.json +2518f2c946f826c8a05fec1e2059b40ce37fba53 data/create/advancements/recipes/create.base/small_diorite_bricks_from_diorite_stonecutting.json +1f25dfce9a68ea2bbb7da6434b434cf00b61665f data/create/advancements/recipes/create.base/small_diorite_bricks_from_stone_types_diorite_stonecutting.json +35c8fb272097f6213ded13d27c5d02e6015065aa data/create/advancements/recipes/create.base/small_dripstone_brick_slab.json +1ac0f3a17716627ff5e05d35cd24bd5938a257d8 data/create/advancements/recipes/create.base/small_dripstone_brick_slab_from_dripstone_block_stonecutting.json +87c04f24bc2f25f3e143f10def190801c29e6fd7 data/create/advancements/recipes/create.base/small_dripstone_brick_slab_from_stone_types_dripstone_stonecutting.json +e3d2179ca50b41efe35aa03bfd61e559a7d5630c data/create/advancements/recipes/create.base/small_dripstone_brick_slab_recycling.json +37d7a1be30004d7ccdfec25d33c7d74b21d4febf data/create/advancements/recipes/create.base/small_dripstone_brick_stairs.json +2d0e980957e0b87aad7c16ec07eb953c0c129c42 data/create/advancements/recipes/create.base/small_dripstone_brick_stairs_from_dripstone_block_stonecutting.json +93bead666003e19d05b8d3b0807c5d8301f551d3 data/create/advancements/recipes/create.base/small_dripstone_brick_stairs_from_stone_types_dripstone_stonecutting.json +3427010fbad93888b0ae0587f823fea9a7f452b3 data/create/advancements/recipes/create.base/small_dripstone_brick_wall.json +ef1fffab529415aecedd0cd18156928498134885 data/create/advancements/recipes/create.base/small_dripstone_brick_wall_from_dripstone_block_stonecutting.json +010e881452348a399b97d17bf6fcf5295b972338 data/create/advancements/recipes/create.base/small_dripstone_brick_wall_from_stone_types_dripstone_stonecutting.json +e3c0b46ec5d1641764688c1b8cf59b68b2e567e6 data/create/advancements/recipes/create.base/small_dripstone_bricks_from_dripstone_block_stonecutting.json +0a97ad6d3c486f53f63db57614ec3a02e4ca4a39 data/create/advancements/recipes/create.base/small_dripstone_bricks_from_stone_types_dripstone_stonecutting.json +3620b5cae44dcd9ec9677a5fba350927fb9ba947 data/create/advancements/recipes/create.base/small_granite_brick_slab.json +9529ed99ecc43c45c852ab06dd36dfeccb6b9cc4 data/create/advancements/recipes/create.base/small_granite_brick_slab_from_granite_stonecutting.json +e416f759a2f8906a091ab1c3774c41ee02c75aea data/create/advancements/recipes/create.base/small_granite_brick_slab_from_stone_types_granite_stonecutting.json +4e76602a927f8dcc5c26e9012d4b3a2ee5fb91a3 data/create/advancements/recipes/create.base/small_granite_brick_slab_recycling.json +274c73f6ab4df8b657c1eee190701764d544ad17 data/create/advancements/recipes/create.base/small_granite_brick_stairs.json +e9297f7257a1c1b6290b56a619f3c41498908132 data/create/advancements/recipes/create.base/small_granite_brick_stairs_from_granite_stonecutting.json +f502f9f45f1ddb1b9671bfa83d0e72e28d0137ad data/create/advancements/recipes/create.base/small_granite_brick_stairs_from_stone_types_granite_stonecutting.json +4c5144c09f531780cb5c483ff8478c0ebbefe066 data/create/advancements/recipes/create.base/small_granite_brick_wall.json +0c270bb2fbd33e3c7ec884ed3ac8c117cf6c4828 data/create/advancements/recipes/create.base/small_granite_brick_wall_from_granite_stonecutting.json +e701e3364b5510a0ae07ab4eb337271a7422d8a3 data/create/advancements/recipes/create.base/small_granite_brick_wall_from_stone_types_granite_stonecutting.json +f574aeb1a2cb7e3a161f4b06094ce2c3122ab76f data/create/advancements/recipes/create.base/small_granite_bricks_from_granite_stonecutting.json +31ca38c6d4b37dcc184e138a40711f9739ebc0e3 data/create/advancements/recipes/create.base/small_granite_bricks_from_stone_types_granite_stonecutting.json +fc5e47a6b92409624b4524ebfa7112752125a53a data/create/advancements/recipes/create.base/small_limestone_brick_slab.json +782790a0adc91304d2a825554c6e96a67c2a1d38 data/create/advancements/recipes/create.base/small_limestone_brick_slab_from_limestone_stonecutting.json +1ccde69d64ad3c55a4cdf16b1046c37696f215d5 data/create/advancements/recipes/create.base/small_limestone_brick_slab_from_stone_types_limestone_stonecutting.json +1eaeac979c42614cb9a08c44a5de3b07d15b72dc data/create/advancements/recipes/create.base/small_limestone_brick_slab_recycling.json +70942e63057e406ed162c0d0d8e6de1b70ddeeb0 data/create/advancements/recipes/create.base/small_limestone_brick_stairs.json +0fa64aeea56fdedcd9c13e4f6d601f15492df446 data/create/advancements/recipes/create.base/small_limestone_brick_stairs_from_limestone_stonecutting.json +e62535e212b37ed1f7b078ccd7d351debe5961f7 data/create/advancements/recipes/create.base/small_limestone_brick_stairs_from_stone_types_limestone_stonecutting.json +f47fe8dff9d7c2f19e4237a6a50f15d62c496c33 data/create/advancements/recipes/create.base/small_limestone_brick_wall.json +8d75fa20565fa1441b25ca8798e2067e165e657b data/create/advancements/recipes/create.base/small_limestone_brick_wall_from_limestone_stonecutting.json +2ac7e83b39b31b51b65694830f86d87d0306a275 data/create/advancements/recipes/create.base/small_limestone_brick_wall_from_stone_types_limestone_stonecutting.json +c00c6d4f1073b90ca92175720dc10a0c11985a9f data/create/advancements/recipes/create.base/small_limestone_bricks_from_limestone_stonecutting.json +40d9f7b6cf7f667c6b103112cb1332a7b0b6fd90 data/create/advancements/recipes/create.base/small_limestone_bricks_from_stone_types_limestone_stonecutting.json +79e9f47906ce74614f3b864a7e58b64f322999b8 data/create/advancements/recipes/create.base/small_ochrum_brick_slab.json +7765cf2ad88cf892c4ddf4e3de0a3de797db680a data/create/advancements/recipes/create.base/small_ochrum_brick_slab_from_ochrum_stonecutting.json +ebb3c89e517fb251883614048eba4f69a2928e52 data/create/advancements/recipes/create.base/small_ochrum_brick_slab_from_stone_types_ochrum_stonecutting.json +e81cb716f08131530ecde01bef626ef160deb504 data/create/advancements/recipes/create.base/small_ochrum_brick_slab_recycling.json +368fffcbf70709aaee394fc5b1e39c7ee7c3e5e9 data/create/advancements/recipes/create.base/small_ochrum_brick_stairs.json +2371b8195b3b02581221345be41a212dfb11656e data/create/advancements/recipes/create.base/small_ochrum_brick_stairs_from_ochrum_stonecutting.json +4dd2775d21b085db35c798e2e402b3bc8e55a977 data/create/advancements/recipes/create.base/small_ochrum_brick_stairs_from_stone_types_ochrum_stonecutting.json +fc5c86d935760cd49916773ca9b3625dabfac841 data/create/advancements/recipes/create.base/small_ochrum_brick_wall.json +8654f40c78c65ff2069c434562f7929aa4e2d293 data/create/advancements/recipes/create.base/small_ochrum_brick_wall_from_ochrum_stonecutting.json +5f9a53d974c34dd146a4bba599349608be0bca07 data/create/advancements/recipes/create.base/small_ochrum_brick_wall_from_stone_types_ochrum_stonecutting.json +6eaba6b9654bd90c42fe4cde9de3cc4e59f4dd91 data/create/advancements/recipes/create.base/small_ochrum_bricks_from_ochrum_stonecutting.json +c7c4893d0f539dfb37a68752c8d5334bdab47eef data/create/advancements/recipes/create.base/small_ochrum_bricks_from_stone_types_ochrum_stonecutting.json 8547f4a498595eb11dde29df4b6f9e9051d2bf5f data/create/advancements/recipes/create.base/small_rose_quartz_tiles_from_polished_rose_quartz_stonecutting.json +ece579c71a88be47b633e8c5dd3b4bf37aa459cf data/create/advancements/recipes/create.base/small_scorchia_brick_slab.json +cb37044471b3cb8f264ed078ce68069d5fae92ce data/create/advancements/recipes/create.base/small_scorchia_brick_slab_from_scorchia_stonecutting.json +1d3911ee4791cd4610e21eb56d64f3b0ad80f68a data/create/advancements/recipes/create.base/small_scorchia_brick_slab_from_stone_types_scorchia_stonecutting.json +e6037926126e8dd8ee7ad66a8b8ff8ae30ee9598 data/create/advancements/recipes/create.base/small_scorchia_brick_slab_recycling.json +7f3b331d41710ef046f0568b98ab9909187d24f8 data/create/advancements/recipes/create.base/small_scorchia_brick_stairs.json +73963827986a441ed2e48933b6a3f4f7abd1364b data/create/advancements/recipes/create.base/small_scorchia_brick_stairs_from_scorchia_stonecutting.json +dfdfae1211103dba882347f03a391854a1b777ed data/create/advancements/recipes/create.base/small_scorchia_brick_stairs_from_stone_types_scorchia_stonecutting.json +9f67f1e196c4d8a79e4d2f9c89b9474b8d2296c1 data/create/advancements/recipes/create.base/small_scorchia_brick_wall.json +f893900560b9d181e4cd3b5d5d64d2714cc18fe1 data/create/advancements/recipes/create.base/small_scorchia_brick_wall_from_scorchia_stonecutting.json +b116bc5e471d41e923301c2b2e5e98eed3a321cb data/create/advancements/recipes/create.base/small_scorchia_brick_wall_from_stone_types_scorchia_stonecutting.json +915ecd3d436c13b2a99c511d6d9344e29513b7e9 data/create/advancements/recipes/create.base/small_scorchia_bricks_from_scorchia_stonecutting.json +e974bed81b41e70dbb0843f578a36743e35b32ca data/create/advancements/recipes/create.base/small_scorchia_bricks_from_stone_types_scorchia_stonecutting.json +cba080ab3f583bef645b4352582bd20bdbe9c689 data/create/advancements/recipes/create.base/small_scoria_brick_slab.json +ab2c50c139e30a4bb81656f4e0b6a2a9db597766 data/create/advancements/recipes/create.base/small_scoria_brick_slab_from_scoria_stonecutting.json +6a776f133e41ec78bce1b8977926aee34be9cec0 data/create/advancements/recipes/create.base/small_scoria_brick_slab_from_stone_types_scoria_stonecutting.json +14fd4673916e285a52be589d1f3896caaad1aad1 data/create/advancements/recipes/create.base/small_scoria_brick_slab_recycling.json +5c5bf5ba99284116306fe1b2ebcd097af6c0339d data/create/advancements/recipes/create.base/small_scoria_brick_stairs.json +20958ea6e3d2b2381d173550b9944e47762451ac data/create/advancements/recipes/create.base/small_scoria_brick_stairs_from_scoria_stonecutting.json +8798a719383020f0676abb75a21e865f22dc6aac data/create/advancements/recipes/create.base/small_scoria_brick_stairs_from_stone_types_scoria_stonecutting.json +a3d9e134156633a36b2cc8b7b726db04bf3128e1 data/create/advancements/recipes/create.base/small_scoria_brick_wall.json +ac660bb4d4361b211e15469cb35a3e1a3a6f8e66 data/create/advancements/recipes/create.base/small_scoria_brick_wall_from_scoria_stonecutting.json +aee085608b2783338d237de097ecb8d56232c70b data/create/advancements/recipes/create.base/small_scoria_brick_wall_from_stone_types_scoria_stonecutting.json +05dfab0a1ea49c27d1340915615f13040d25b224 data/create/advancements/recipes/create.base/small_scoria_bricks_from_scoria_stonecutting.json +96aa8101f2898c511344038f4147d671964d8e6b data/create/advancements/recipes/create.base/small_scoria_bricks_from_stone_types_scoria_stonecutting.json +695fd912be2dd851f1fd88a1d5da705fe31bbbd8 data/create/advancements/recipes/create.base/small_tuff_brick_slab.json +3b0d147ae4fdd29a269566653cf72e8ccb89924f data/create/advancements/recipes/create.base/small_tuff_brick_slab_from_stone_types_tuff_stonecutting.json +22beafb48ff7e62e325909cb5b0f024a0db78ea0 data/create/advancements/recipes/create.base/small_tuff_brick_slab_from_tuff_stonecutting.json +702409b115a333852c109ee1ea3d1171f9a92aed data/create/advancements/recipes/create.base/small_tuff_brick_slab_recycling.json +6ad25f61bcdca8666ebda2ac545879d2378f2ff5 data/create/advancements/recipes/create.base/small_tuff_brick_stairs.json +13548e5be1ad4fa16ee4ebec8e92e957ee5bbb35 data/create/advancements/recipes/create.base/small_tuff_brick_stairs_from_stone_types_tuff_stonecutting.json +15f69e65317572dd4711f6138c6d300aa61f4bef data/create/advancements/recipes/create.base/small_tuff_brick_stairs_from_tuff_stonecutting.json +64e070de55266a5baeab104b0038e2ad2213de57 data/create/advancements/recipes/create.base/small_tuff_brick_wall.json +d2025c2ff16fde9e894dc1233e082cf41a0d5746 data/create/advancements/recipes/create.base/small_tuff_brick_wall_from_stone_types_tuff_stonecutting.json +1c6dbeab80771e4443f4e525fdb10f9c6aa37a34 data/create/advancements/recipes/create.base/small_tuff_brick_wall_from_tuff_stonecutting.json +0fa4de5ac062d18f6da7e2b3479f98538179b3ea data/create/advancements/recipes/create.base/small_tuff_bricks_from_stone_types_tuff_stonecutting.json +b9f7672130294d582d0b7e42d586b2a374cd84dd data/create/advancements/recipes/create.base/small_tuff_bricks_from_tuff_stonecutting.json +c1d651c71e069591a84f82528739ab85fbd0aab5 data/create/advancements/recipes/create.base/small_veridium_brick_slab.json +ae1b0c860e09f6ea133e907347438e66fcc70546 data/create/advancements/recipes/create.base/small_veridium_brick_slab_from_stone_types_veridium_stonecutting.json +f82f070d9847f22cbc214d21b2e395cf07959302 data/create/advancements/recipes/create.base/small_veridium_brick_slab_from_veridium_stonecutting.json +1bf0e0949679bac7ae08750db6ebcc4249532f13 data/create/advancements/recipes/create.base/small_veridium_brick_slab_recycling.json +2b6385e8818dc1dd49b4a548a02f7fa1835a0c69 data/create/advancements/recipes/create.base/small_veridium_brick_stairs.json +11c34ab4c7870be987179b2234aa16950e75ef43 data/create/advancements/recipes/create.base/small_veridium_brick_stairs_from_stone_types_veridium_stonecutting.json +97b26042e85c3567b849041f099fbbeabe4f481f data/create/advancements/recipes/create.base/small_veridium_brick_stairs_from_veridium_stonecutting.json +4d7784260f803a5b1e613f9b21fccb03caf60d89 data/create/advancements/recipes/create.base/small_veridium_brick_wall.json +80a9aa2619cd4cffca4508babeb19fbc0a286f2a data/create/advancements/recipes/create.base/small_veridium_brick_wall_from_stone_types_veridium_stonecutting.json +2011c91886e942a9da7a2bd9de5a29f25e650cba data/create/advancements/recipes/create.base/small_veridium_brick_wall_from_veridium_stonecutting.json +754de16cc88c011ac1d4e2694f360275ac033055 data/create/advancements/recipes/create.base/small_veridium_bricks_from_stone_types_veridium_stonecutting.json +4fa09ae6e4836eb7455a09192a632106834322f4 data/create/advancements/recipes/create.base/small_veridium_bricks_from_veridium_stonecutting.json +4550af183202b037472e0c36fdcebbee634f9dde data/create/advancements/recipes/create.base/smelting/scoria.json b2b9c6d93ff4d912081cee2ab5e68209828cdc86 data/create/advancements/recipes/create.base/smelting/zinc_ingot_from_crushed.json 16e52ba04279bcf803c5f6be46550ba5d81be1a3 data/create/advancements/recipes/create.base/smelting/zinc_ingot_from_ore.json 88a8661167993de0f2897c95e398b6f77429d724 data/create/advancements/recipes/create.base/smelting/zinc_ingot_from_raw_ore.json +de4224f7b90c28fe5e9c96fc0b4cfc96f7210849 data/create/advancements/recipes/create.base/spruce_window.json +01c22ed9ded738f86839904914be9d45152509a7 data/create/advancements/recipes/create.base/spruce_window_pane.json +ab0cacba05f8def9cc91b993d464c297babf6fc3 data/create/advancements/recipes/create.base/tiled_glass_from_glass_colorless_stonecutting.json +2ba583f7c01b6f9f3f66e12d338ecd596d726538 data/create/advancements/recipes/create.base/tiled_glass_pane.json +5cdb738efecdd51938c1a83b2fc0c65feb732b69 data/create/advancements/recipes/create.base/tuff_pillar_from_stone_types_tuff_stonecutting.json +b620a4db35a7f02adf97ed03afd39910feb38eb5 data/create/advancements/recipes/create.base/tuff_pillar_from_tuff_stonecutting.json +024648eadff0dfd43354f194b035251fe61718d0 data/create/advancements/recipes/create.base/veridium_pillar_from_stone_types_veridium_stonecutting.json +ff8a4ea4ad4e56379f4dfc78909b669c72702680 data/create/advancements/recipes/create.base/veridium_pillar_from_veridium_stonecutting.json +24fafe59013a3e0439a73ea4e0cef114fc9a8e4b data/create/advancements/recipes/create.base/vertical_framed_glass_from_glass_colorless_stonecutting.json +8f719c087e4344de4cb57e06f10ebd49850f17b5 data/create/advancements/recipes/create.base/vertical_framed_glass_pane.json +7211458c5fb7116de2e789252da01b08820ec207 data/create/advancements/recipes/create.base/warped_window.json +cce0482d2f60d11478bb73c778e157744899b7d3 data/create/advancements/recipes/create.base/warped_window_pane.json 7116a947db0270e0948da79fbb89ba8a9585fc06 data/create/advancements/recipes/create.base/weathered_copper_shingle_slab.json 3596f5854c2791d92cb0cad28870b4cfffeda7da data/create/advancements/recipes/create.base/weathered_copper_shingle_slab_from_weathered_copper_shingles_stonecutting.json 072a42e28fa53adc050b76e68cf513019322b071 data/create/advancements/recipes/create.base/weathered_copper_shingle_stairs.json @@ -2573,762 +3329,6 @@ b2b9c6d93ff4d912081cee2ab5e68209828cdc86 data/create/advancements/recipes/create 6e197869c90b2ee996fac4735336183939d1fe2b data/create/advancements/recipes/create.base/weathered_copper_tile_slab_from_weathered_copper_tiles_stonecutting.json 5ff8d9ec43683be5be130f980091222ffccfb2d9 data/create/advancements/recipes/create.base/weathered_copper_tile_stairs.json 2a058814de30b03625e90da7188cea7cabe7b4a0 data/create/advancements/recipes/create.base/weathered_copper_tile_stairs_from_weathered_copper_tiles_stonecutting.json -e7134f9dd47eb9f706f1ec1bd886a14eb7d3010a data/create/advancements/recipes/create.palettes/acacia_window.json -abeb5dfa9931aac86b080309bd0ed5397fd1254b data/create/advancements/recipes/create.palettes/acacia_window_pane.json -60545d0d6d70b4be2a22b03b09de45c6d4f7434b data/create/advancements/recipes/create.palettes/andesite_pillar_from_andesite_stonecutting.json -e742f68e9374ad009cd0325094b113c83570bcd2 data/create/advancements/recipes/create.palettes/andesite_pillar_from_stone_types_andesite_stonecutting.json -72ec3cf271a07b0bd4d63265904280e8607c052d data/create/advancements/recipes/create.palettes/asurine_pillar_from_asurine_stonecutting.json -f1ba98fa90ae0b81cef3e8bfed4a63565539b4a2 data/create/advancements/recipes/create.palettes/asurine_pillar_from_stone_types_asurine_stonecutting.json -2e69af13ca72acd06ceb1079a371add27a1c0db0 data/create/advancements/recipes/create.palettes/birch_window.json -62772c540e195fc6b8cfa91f9ae32898c649f93e data/create/advancements/recipes/create.palettes/birch_window_pane.json -bfa045d74386df70fd1130c934ed814376442dee data/create/advancements/recipes/create.palettes/calcite_pillar_from_calcite_stonecutting.json -7d0d2554ea3e646941a1ed59c8f5e9d45f9d76d6 data/create/advancements/recipes/create.palettes/calcite_pillar_from_stone_types_calcite_stonecutting.json -265595b70feaec33e5a2d7fb552b0284fcc09030 data/create/advancements/recipes/create.palettes/crafting/palettes/scorchia.json -0577e7cff04b9fb37d8d4fccf8218271fc7983ca data/create/advancements/recipes/create.palettes/crimsite_pillar_from_crimsite_stonecutting.json -97c48ddf1f9ef0f8433bf34ed7c4f6a7f44cf445 data/create/advancements/recipes/create.palettes/crimsite_pillar_from_stone_types_crimsite_stonecutting.json -203e85e700f1122545ff04b215983048f68a3391 data/create/advancements/recipes/create.palettes/crimson_window.json -33bf129965a516f9d5f239900d1c844737cecaad data/create/advancements/recipes/create.palettes/crimson_window_pane.json -ed4530b3a2c074868b2e59145840ad1a19ccba8a data/create/advancements/recipes/create.palettes/cut_andesite_brick_slab.json -94f17edc574e5f7c6d8a7b53d006cb1cbcde25ae data/create/advancements/recipes/create.palettes/cut_andesite_brick_slab_from_andesite_stonecutting.json -4bd0c00092d0f9bc61d9c4024588109d66ddcc86 data/create/advancements/recipes/create.palettes/cut_andesite_brick_slab_from_stone_types_andesite_stonecutting.json -e43b1433cb2a69411501b559b0314f1ec10a2e92 data/create/advancements/recipes/create.palettes/cut_andesite_brick_slab_recycling.json -4cfaf94df2b896cf72cab1d3a64f0a581214824f data/create/advancements/recipes/create.palettes/cut_andesite_brick_stairs.json -925fe65983678ffe844e91c60960af4f678d0613 data/create/advancements/recipes/create.palettes/cut_andesite_brick_stairs_from_andesite_stonecutting.json -89b206cac06cb0cff8610924ec049d8c55e50476 data/create/advancements/recipes/create.palettes/cut_andesite_brick_stairs_from_stone_types_andesite_stonecutting.json -98a12597165abfad0d624f31d3319f0fa1319fe0 data/create/advancements/recipes/create.palettes/cut_andesite_brick_wall.json -d438fb733ad85e32915d22d4b90a2f030b2c8af7 data/create/advancements/recipes/create.palettes/cut_andesite_brick_wall_from_andesite_stonecutting.json -6653fbf0a0e467614e3dae0449391fde17ddc13a data/create/advancements/recipes/create.palettes/cut_andesite_brick_wall_from_stone_types_andesite_stonecutting.json -b08740a89c92e7a1631db8d3fe75575e0d124684 data/create/advancements/recipes/create.palettes/cut_andesite_bricks_from_andesite_stonecutting.json -d2ef2a017d948ef65d7c650b5942e8400cd90631 data/create/advancements/recipes/create.palettes/cut_andesite_bricks_from_stone_types_andesite_stonecutting.json -0a96201e3db9566258a92921a532482174bc4c5c data/create/advancements/recipes/create.palettes/cut_andesite_from_andesite_stonecutting.json -ce5e8f5028f3c034288d83ec75e4a0d4707083e3 data/create/advancements/recipes/create.palettes/cut_andesite_from_stone_types_andesite_stonecutting.json -8870b4ac0c0e9b85014900e7332a9cd2d2566088 data/create/advancements/recipes/create.palettes/cut_andesite_slab.json -135db9d4173c37b16c2fc65932eac1a4e54dceca data/create/advancements/recipes/create.palettes/cut_andesite_slab_from_andesite_stonecutting.json -d1efc4cfc0f7176726ffcb331518bd254c5c7258 data/create/advancements/recipes/create.palettes/cut_andesite_slab_from_stone_types_andesite_stonecutting.json -a044b810d6545600702a431b6d2686f66318015c data/create/advancements/recipes/create.palettes/cut_andesite_slab_recycling.json -62024570060391333c9486fad7a583a42e37c223 data/create/advancements/recipes/create.palettes/cut_andesite_stairs.json -7361895dddec1a3adfa4b95c8b37ef9069708169 data/create/advancements/recipes/create.palettes/cut_andesite_stairs_from_andesite_stonecutting.json -b1376510a8b23d6583c598f4d72fe6efe8db8397 data/create/advancements/recipes/create.palettes/cut_andesite_stairs_from_stone_types_andesite_stonecutting.json -4e1e7906a468aae37a50f2fbc2974f76f0d5cc45 data/create/advancements/recipes/create.palettes/cut_andesite_wall.json -d34cd111c437bfe2a1e3861f3260929748e8cd47 data/create/advancements/recipes/create.palettes/cut_andesite_wall_from_andesite_stonecutting.json -f51fc6f6f143755bcc6f5c23b0fabc28ffa0bac2 data/create/advancements/recipes/create.palettes/cut_andesite_wall_from_stone_types_andesite_stonecutting.json -2f8534038e4eaf900d5713f7da9c1777c94206ff data/create/advancements/recipes/create.palettes/cut_asurine_brick_slab.json -1912d017ba8ca9566a9d1f88e77590360069ad45 data/create/advancements/recipes/create.palettes/cut_asurine_brick_slab_from_asurine_stonecutting.json -ae13c7ccbc88bbdb18c0ab3b9cacb17a9180a4d8 data/create/advancements/recipes/create.palettes/cut_asurine_brick_slab_from_stone_types_asurine_stonecutting.json -3eafcea4cd7c89bfefb28f2cd777254e4ff3d0a2 data/create/advancements/recipes/create.palettes/cut_asurine_brick_slab_recycling.json -bfa993105851f003de6aa1c00e98ecb45f887221 data/create/advancements/recipes/create.palettes/cut_asurine_brick_stairs.json -fb3a53300eb9455f6f43101657c47129d91da9a2 data/create/advancements/recipes/create.palettes/cut_asurine_brick_stairs_from_asurine_stonecutting.json -82969baccbae9fc780bcacc153373e4c950d40ea data/create/advancements/recipes/create.palettes/cut_asurine_brick_stairs_from_stone_types_asurine_stonecutting.json -d79ab014cfd342c4d0d2f009efbd9c184e63febf data/create/advancements/recipes/create.palettes/cut_asurine_brick_wall.json -444b4ea33df8e0df2ded71eab421d2b9bdc3cda0 data/create/advancements/recipes/create.palettes/cut_asurine_brick_wall_from_asurine_stonecutting.json -f577588ecfb59ac292b7b70e2941019e8df21786 data/create/advancements/recipes/create.palettes/cut_asurine_brick_wall_from_stone_types_asurine_stonecutting.json -5ff70e673771131564de6322cc35b6e593577295 data/create/advancements/recipes/create.palettes/cut_asurine_bricks_from_asurine_stonecutting.json -a54da6f90bc65a172ca0fb91ad07ba9d5417c4b2 data/create/advancements/recipes/create.palettes/cut_asurine_bricks_from_stone_types_asurine_stonecutting.json -2632008bb91d0e11a33673d700d167110e8a2382 data/create/advancements/recipes/create.palettes/cut_asurine_from_asurine_stonecutting.json -6b941f80605fa3975a85599aad98548ef7aa75f9 data/create/advancements/recipes/create.palettes/cut_asurine_from_stone_types_asurine_stonecutting.json -1d690ad6b8872c53ead4605811d7af05ef6ff1fa data/create/advancements/recipes/create.palettes/cut_asurine_slab.json -92dfaf6c019a8ca312b8166b9405dfa8fc913b6d data/create/advancements/recipes/create.palettes/cut_asurine_slab_from_asurine_stonecutting.json -c8e47f89166125399c0589214f3b2b9e97292c9f data/create/advancements/recipes/create.palettes/cut_asurine_slab_from_stone_types_asurine_stonecutting.json -d95398cb5c655ba6847c67d02157b0271b60388c data/create/advancements/recipes/create.palettes/cut_asurine_slab_recycling.json -cbb810c11d85d06db6b7a359fbe6cd0a9dcbcf45 data/create/advancements/recipes/create.palettes/cut_asurine_stairs.json -e1662afaa8c7d51147a0a6de026e6af4e3531d42 data/create/advancements/recipes/create.palettes/cut_asurine_stairs_from_asurine_stonecutting.json -9ab3524bd285b037f4fdc6326043ae2961d65530 data/create/advancements/recipes/create.palettes/cut_asurine_stairs_from_stone_types_asurine_stonecutting.json -21297a6c5e5a199d726bd69d14e428f1aec7812c data/create/advancements/recipes/create.palettes/cut_asurine_wall.json -8bee425cf3538bd56a58aa1fe9395b4345b74136 data/create/advancements/recipes/create.palettes/cut_asurine_wall_from_asurine_stonecutting.json -71d251ce3df2336600f95ab30d631f97e658ef7e data/create/advancements/recipes/create.palettes/cut_asurine_wall_from_stone_types_asurine_stonecutting.json -9d14ee83bcf0ffc34726c3d8779cbfd837cf1939 data/create/advancements/recipes/create.palettes/cut_calcite_brick_slab.json -d9f421cff97701cc410cb8331a98acbf6f55735e data/create/advancements/recipes/create.palettes/cut_calcite_brick_slab_from_calcite_stonecutting.json -bd7156472c1196cc9c9e3ee9a7495b457b5cef9e data/create/advancements/recipes/create.palettes/cut_calcite_brick_slab_from_stone_types_calcite_stonecutting.json -7da4dda4a0cdf01d3f85d9bf0ba654963fec20fe data/create/advancements/recipes/create.palettes/cut_calcite_brick_slab_recycling.json -c7977b9ff93275fa47bbd35a2d8363ba1ddfe88e data/create/advancements/recipes/create.palettes/cut_calcite_brick_stairs.json -6983a9c816c71bd48e0f8eab6694dd9807b3b89d data/create/advancements/recipes/create.palettes/cut_calcite_brick_stairs_from_calcite_stonecutting.json -2bb344a67b931a751b55416ebac2ab06148253c6 data/create/advancements/recipes/create.palettes/cut_calcite_brick_stairs_from_stone_types_calcite_stonecutting.json -af44c65cf9c10193ab59c3e00d2f4975855ab982 data/create/advancements/recipes/create.palettes/cut_calcite_brick_wall.json -9f53fd8a316a07875e4506368b0f7f4a4d654013 data/create/advancements/recipes/create.palettes/cut_calcite_brick_wall_from_calcite_stonecutting.json -51e705c29c29f806c6c0e6a90f892f66a0d6c1f8 data/create/advancements/recipes/create.palettes/cut_calcite_brick_wall_from_stone_types_calcite_stonecutting.json -f0d336a0e2acccc8c89c2572df264bd5101fdf5a data/create/advancements/recipes/create.palettes/cut_calcite_bricks_from_calcite_stonecutting.json -07267856fbc82e1c8e8e43321f1f2102af2280a3 data/create/advancements/recipes/create.palettes/cut_calcite_bricks_from_stone_types_calcite_stonecutting.json -e41e44f35ad264f9fb34badd9098f7b5e9a568d2 data/create/advancements/recipes/create.palettes/cut_calcite_from_calcite_stonecutting.json -e19dba28493a65974667ee7ee7b24a5fca4b1808 data/create/advancements/recipes/create.palettes/cut_calcite_from_stone_types_calcite_stonecutting.json -4ca3f81cf9e5ce231199703f4e1bc8be8fc2bbb3 data/create/advancements/recipes/create.palettes/cut_calcite_slab.json -85e2368b7d6e4cd355725efc1d1ff96168000be1 data/create/advancements/recipes/create.palettes/cut_calcite_slab_from_calcite_stonecutting.json -e5148a533f8f5f88d62c076a2a39258dc59f9262 data/create/advancements/recipes/create.palettes/cut_calcite_slab_from_stone_types_calcite_stonecutting.json -3789eac9c5e1f5b9ef022d9f9646c89e39c2d347 data/create/advancements/recipes/create.palettes/cut_calcite_slab_recycling.json -039675196670f72286f297d9f8ccf0c0b20bdcc5 data/create/advancements/recipes/create.palettes/cut_calcite_stairs.json -c8a130c3f9e1f56f23fe893d8a2ba77178351eae data/create/advancements/recipes/create.palettes/cut_calcite_stairs_from_calcite_stonecutting.json -6bbcb9895d83e36a3ae97384493c3be8ee5fe55c data/create/advancements/recipes/create.palettes/cut_calcite_stairs_from_stone_types_calcite_stonecutting.json -36063f9a43bbcce80061060b81dea3aef05c28bb data/create/advancements/recipes/create.palettes/cut_calcite_wall.json -4618952de8369790936ffa075fa6f5ce5bf12503 data/create/advancements/recipes/create.palettes/cut_calcite_wall_from_calcite_stonecutting.json -801baf1ca0e70909c92d76ad0235a5b3f29a5ba5 data/create/advancements/recipes/create.palettes/cut_calcite_wall_from_stone_types_calcite_stonecutting.json -ea71950b15b6a4220d6215e338f9ae5f5e06b3ef data/create/advancements/recipes/create.palettes/cut_crimsite_brick_slab.json -842bb39066516a4812294a65d5049e86000d01c3 data/create/advancements/recipes/create.palettes/cut_crimsite_brick_slab_from_crimsite_stonecutting.json -83a5f94eb99c16fab64fc6500b80d83a9af5db1f data/create/advancements/recipes/create.palettes/cut_crimsite_brick_slab_from_stone_types_crimsite_stonecutting.json -04264884a2152d916e815b9748293182021cc4f1 data/create/advancements/recipes/create.palettes/cut_crimsite_brick_slab_recycling.json -01709a99d0c590db01be2a93009f8f9ace341332 data/create/advancements/recipes/create.palettes/cut_crimsite_brick_stairs.json -e2db045f5f59f2307442b747851fec77ca5b8483 data/create/advancements/recipes/create.palettes/cut_crimsite_brick_stairs_from_crimsite_stonecutting.json -0e2b7313cd6cbc9f11a08a509e6332ae108749de data/create/advancements/recipes/create.palettes/cut_crimsite_brick_stairs_from_stone_types_crimsite_stonecutting.json -b74f939a78a6ae8cc5f7862543b66d62af08406a data/create/advancements/recipes/create.palettes/cut_crimsite_brick_wall.json -372c493b13a25301ab44d65e5f8115a2c0820494 data/create/advancements/recipes/create.palettes/cut_crimsite_brick_wall_from_crimsite_stonecutting.json -1b66941a2e8122f6a668d6bc984acc7dc3d16714 data/create/advancements/recipes/create.palettes/cut_crimsite_brick_wall_from_stone_types_crimsite_stonecutting.json -81ddf327faca5a5ac231fb508747f5f45f41081a data/create/advancements/recipes/create.palettes/cut_crimsite_bricks_from_crimsite_stonecutting.json -529f9ea8f68bea9a08d78ff5a8c9bc8177cacdc3 data/create/advancements/recipes/create.palettes/cut_crimsite_bricks_from_stone_types_crimsite_stonecutting.json -2adb46ea5f694625cd59ad6bd2b2d9780229fbc3 data/create/advancements/recipes/create.palettes/cut_crimsite_from_crimsite_stonecutting.json -1f13d1ca2433dc0773c670baf1d05bacc798a57c data/create/advancements/recipes/create.palettes/cut_crimsite_from_stone_types_crimsite_stonecutting.json -840c9d7d245f0f42115b2743a91b8d4c1dc088ed data/create/advancements/recipes/create.palettes/cut_crimsite_slab.json -67ded3941e324e446603c202c437f5b562e24d81 data/create/advancements/recipes/create.palettes/cut_crimsite_slab_from_crimsite_stonecutting.json -ec4b8d4d62814de99215dbfb3bba5699a5b8a679 data/create/advancements/recipes/create.palettes/cut_crimsite_slab_from_stone_types_crimsite_stonecutting.json -6eb7b166ad302f2fa68a9850f7f70bd9b8c87c12 data/create/advancements/recipes/create.palettes/cut_crimsite_slab_recycling.json -1929009937c54d27b3d0795ea9696f8dd1bd0e40 data/create/advancements/recipes/create.palettes/cut_crimsite_stairs.json -ff4c0629e38d8957fd7a717d5f4be0cf124ff57a data/create/advancements/recipes/create.palettes/cut_crimsite_stairs_from_crimsite_stonecutting.json -02ea17a131cbf5cf33f676a81001882b48ac4a14 data/create/advancements/recipes/create.palettes/cut_crimsite_stairs_from_stone_types_crimsite_stonecutting.json -39783496e980de6d46d0b2cfbed511f0e5aa4b29 data/create/advancements/recipes/create.palettes/cut_crimsite_wall.json -e1ba89b360f00e8d3eef835ff9eff85caae7d73c data/create/advancements/recipes/create.palettes/cut_crimsite_wall_from_crimsite_stonecutting.json -8f660ddb06f9a1ae967f60a78500c68e8275a953 data/create/advancements/recipes/create.palettes/cut_crimsite_wall_from_stone_types_crimsite_stonecutting.json -1a7b4b885a9b7d79b19cf242388b7ff1742e7322 data/create/advancements/recipes/create.palettes/cut_deepslate_brick_slab.json -13a710791758f5b9140b15c2e8ae2fed995d580e data/create/advancements/recipes/create.palettes/cut_deepslate_brick_slab_from_deepslate_stonecutting.json -8ee86edd13132095dfc39a6ed6df42388ec5572d data/create/advancements/recipes/create.palettes/cut_deepslate_brick_slab_from_stone_types_deepslate_stonecutting.json -3e8051f691d443482bb310b8b2944e465f730473 data/create/advancements/recipes/create.palettes/cut_deepslate_brick_slab_recycling.json -dda71649a4c6cfb98b52f56359ba8591bd75a7c7 data/create/advancements/recipes/create.palettes/cut_deepslate_brick_stairs.json -b8d3a864f169933ab2d675ab7076584e0ed65c93 data/create/advancements/recipes/create.palettes/cut_deepslate_brick_stairs_from_deepslate_stonecutting.json -0e19dd19b645e65d6011023c5427b6a2702a78d1 data/create/advancements/recipes/create.palettes/cut_deepslate_brick_stairs_from_stone_types_deepslate_stonecutting.json -3a5d6017059db9ca093d939f94e06d7c6b22b026 data/create/advancements/recipes/create.palettes/cut_deepslate_brick_wall.json -0bfcbb510f4fad6f22cc7e9d49ed1c2a140e87db data/create/advancements/recipes/create.palettes/cut_deepslate_brick_wall_from_deepslate_stonecutting.json -c42cd084901a39d4634c1293180439b8abee69bb data/create/advancements/recipes/create.palettes/cut_deepslate_brick_wall_from_stone_types_deepslate_stonecutting.json -164eb4390657f4b711f7b0776e8854c505a0cd93 data/create/advancements/recipes/create.palettes/cut_deepslate_bricks_from_deepslate_stonecutting.json -ccb68f8f5202411738532d3decb403435ea65f3f data/create/advancements/recipes/create.palettes/cut_deepslate_bricks_from_stone_types_deepslate_stonecutting.json -feb39ae181092afc477b5f25bb803134e7cf50bd data/create/advancements/recipes/create.palettes/cut_deepslate_from_deepslate_stonecutting.json -7680fa2a942b2bed38cda9e7b5e3f9b114a36cb8 data/create/advancements/recipes/create.palettes/cut_deepslate_from_stone_types_deepslate_stonecutting.json -580882992706de7aa6d22a99b27b6fb43d3ee446 data/create/advancements/recipes/create.palettes/cut_deepslate_slab.json -7703abba82b7c66274d78724a3676c133bf5f54f data/create/advancements/recipes/create.palettes/cut_deepslate_slab_from_deepslate_stonecutting.json -2e198c264887a731e785d1b0ea06c526097067db data/create/advancements/recipes/create.palettes/cut_deepslate_slab_from_stone_types_deepslate_stonecutting.json -74383206fffb712349b72e5682d58f3923b93499 data/create/advancements/recipes/create.palettes/cut_deepslate_slab_recycling.json -4ef416feb9052e7560d8926fffdd9402441fb69e data/create/advancements/recipes/create.palettes/cut_deepslate_stairs.json -6612f1a52b9f73cfa8f3dc305407ab6bfbeae801 data/create/advancements/recipes/create.palettes/cut_deepslate_stairs_from_deepslate_stonecutting.json -ecb46ad524f0cbe3b1a6ad7b12f8ec9fb980442a data/create/advancements/recipes/create.palettes/cut_deepslate_stairs_from_stone_types_deepslate_stonecutting.json -4058f68b3eddf3b45ebbefc8c4c78c0638b70837 data/create/advancements/recipes/create.palettes/cut_deepslate_wall.json -1aaac5c2e9eff578887d4ee6eff310841e8d2773 data/create/advancements/recipes/create.palettes/cut_deepslate_wall_from_deepslate_stonecutting.json -9a58b1950d7d907b068c686c00c649bda4783d36 data/create/advancements/recipes/create.palettes/cut_deepslate_wall_from_stone_types_deepslate_stonecutting.json -b9ca24915029eae5b1eee5774d7099a715f5c942 data/create/advancements/recipes/create.palettes/cut_diorite_brick_slab.json -514203d3c4d8e2920f3dfdb0897f154ddd39a5fd data/create/advancements/recipes/create.palettes/cut_diorite_brick_slab_from_diorite_stonecutting.json -cbebac4a5d65912436fc644085ffff850b0a1951 data/create/advancements/recipes/create.palettes/cut_diorite_brick_slab_from_stone_types_diorite_stonecutting.json -85662add4d3976ffc189bd3d45cd22bb3a953686 data/create/advancements/recipes/create.palettes/cut_diorite_brick_slab_recycling.json -4c6a2ec9b08f050ca8cdac58daf0d226a6cec5ef data/create/advancements/recipes/create.palettes/cut_diorite_brick_stairs.json -d07cc218496efa412e03dc3cf0c089a71e478a21 data/create/advancements/recipes/create.palettes/cut_diorite_brick_stairs_from_diorite_stonecutting.json -d172ddb80c9911a9ac3c9c192e0d9126d73a8cd0 data/create/advancements/recipes/create.palettes/cut_diorite_brick_stairs_from_stone_types_diorite_stonecutting.json -7e7b4eae4020e785fd29168215c391d768cf3648 data/create/advancements/recipes/create.palettes/cut_diorite_brick_wall.json -10d653a811083f84ae1bce77f4bca65885dd7668 data/create/advancements/recipes/create.palettes/cut_diorite_brick_wall_from_diorite_stonecutting.json -6e8270df13af7eaa9f6d4713757bdb4c5b5572f6 data/create/advancements/recipes/create.palettes/cut_diorite_brick_wall_from_stone_types_diorite_stonecutting.json -a693f2d3e5b303289ce21ace8317d542b456024a data/create/advancements/recipes/create.palettes/cut_diorite_bricks_from_diorite_stonecutting.json -253482c6b7be447425d63318bce8d50a5a5e3704 data/create/advancements/recipes/create.palettes/cut_diorite_bricks_from_stone_types_diorite_stonecutting.json -e5cfac9e7474aa34407d4ae41fb38d92a0ca59d5 data/create/advancements/recipes/create.palettes/cut_diorite_from_diorite_stonecutting.json -d5274319ebf41708cfb2c84fd06ce64583ab9577 data/create/advancements/recipes/create.palettes/cut_diorite_from_stone_types_diorite_stonecutting.json -531c66991e42aaf169b64ba9b93eb08cd5aa60a1 data/create/advancements/recipes/create.palettes/cut_diorite_slab.json -d5041d0925e15a1ab83ce51710d22ab1ffbafa13 data/create/advancements/recipes/create.palettes/cut_diorite_slab_from_diorite_stonecutting.json -6114e07219bba9090e9c1e51150e809bd830d8ae data/create/advancements/recipes/create.palettes/cut_diorite_slab_from_stone_types_diorite_stonecutting.json -eea5a315b65f20bcc35bd82d403993b36cca59a3 data/create/advancements/recipes/create.palettes/cut_diorite_slab_recycling.json -13b33317fee528281a285cd0aa81543eb966f36b data/create/advancements/recipes/create.palettes/cut_diorite_stairs.json -5f22908071957276dbe3496d56b57299a45e9ee5 data/create/advancements/recipes/create.palettes/cut_diorite_stairs_from_diorite_stonecutting.json -69097d2673bd2e3108b2c51b5f444ae48f53f93f data/create/advancements/recipes/create.palettes/cut_diorite_stairs_from_stone_types_diorite_stonecutting.json -4b0d8c17903387d17b00f0ba4d04009c340204ee data/create/advancements/recipes/create.palettes/cut_diorite_wall.json -18b5fc74dfb4f4d1e220273b1324a680e147b026 data/create/advancements/recipes/create.palettes/cut_diorite_wall_from_diorite_stonecutting.json -e01243eb51ff9554c51e0acb391a5674a9f78acd data/create/advancements/recipes/create.palettes/cut_diorite_wall_from_stone_types_diorite_stonecutting.json -948d6c357a67e2b535eaccf91ba10b9e1b154bde data/create/advancements/recipes/create.palettes/cut_dripstone_brick_slab.json -ab6f0088274a89a925039383a0899039d3be6f87 data/create/advancements/recipes/create.palettes/cut_dripstone_brick_slab_from_dripstone_block_stonecutting.json -a8a7a85d873026eb3b0139baa6cda9036cce7ad0 data/create/advancements/recipes/create.palettes/cut_dripstone_brick_slab_from_stone_types_dripstone_stonecutting.json -37ed0d2ac50cbe3eae2293de18a9a2b5f6ae8261 data/create/advancements/recipes/create.palettes/cut_dripstone_brick_slab_recycling.json -c91657409f41c707a2da3c41726f33ef0a2208e3 data/create/advancements/recipes/create.palettes/cut_dripstone_brick_stairs.json -46e8a8a54133a66c5d194d174a1847befdb2eedb data/create/advancements/recipes/create.palettes/cut_dripstone_brick_stairs_from_dripstone_block_stonecutting.json -8b594a7297ed5b4ab870e5c93661209dc9c71445 data/create/advancements/recipes/create.palettes/cut_dripstone_brick_stairs_from_stone_types_dripstone_stonecutting.json -927e551e7d9d43b03717453af3c6c30684ba12da data/create/advancements/recipes/create.palettes/cut_dripstone_brick_wall.json -576fddccf646453dc6bf8aafd94b8d1ac8c25b77 data/create/advancements/recipes/create.palettes/cut_dripstone_brick_wall_from_dripstone_block_stonecutting.json -cb368165b3c9d2c0e55eaad4d653068eb23b06aa data/create/advancements/recipes/create.palettes/cut_dripstone_brick_wall_from_stone_types_dripstone_stonecutting.json -adfe5459b3e99e60f6c644bad64d30a982ab1101 data/create/advancements/recipes/create.palettes/cut_dripstone_bricks_from_dripstone_block_stonecutting.json -c4ffd6b94835ee6c3fd9f57211f81e010682a86f data/create/advancements/recipes/create.palettes/cut_dripstone_bricks_from_stone_types_dripstone_stonecutting.json -5173d5d4858a2f7c591113e4415705e8c03e66cb data/create/advancements/recipes/create.palettes/cut_dripstone_from_dripstone_block_stonecutting.json -91a5bcd2e5bd62b05f06a09fa3468ec0410f03a7 data/create/advancements/recipes/create.palettes/cut_dripstone_from_stone_types_dripstone_stonecutting.json -d37d039b66c69653ea0220ad4be9ddc4e2de05f7 data/create/advancements/recipes/create.palettes/cut_dripstone_slab.json -e82133bba107ec937e7a403d99ece14203299b4e data/create/advancements/recipes/create.palettes/cut_dripstone_slab_from_dripstone_block_stonecutting.json -d3b41ed76e5b72b07f7d8496f6396680d2bd9ce6 data/create/advancements/recipes/create.palettes/cut_dripstone_slab_from_stone_types_dripstone_stonecutting.json -27001803f39f327873f3a3be8a755640ebcb1cb1 data/create/advancements/recipes/create.palettes/cut_dripstone_slab_recycling.json -eeb39079c0677c89d166497963c7036d072174fb data/create/advancements/recipes/create.palettes/cut_dripstone_stairs.json -60f0147009231acfb7e7b732a59dcf80cd5bc527 data/create/advancements/recipes/create.palettes/cut_dripstone_stairs_from_dripstone_block_stonecutting.json -fa915c08ac484c141882a8d67808df0a575b0f86 data/create/advancements/recipes/create.palettes/cut_dripstone_stairs_from_stone_types_dripstone_stonecutting.json -1512d4705c0fa89f1cfaf08f130dfc73cb266f6d data/create/advancements/recipes/create.palettes/cut_dripstone_wall.json -cd3af424e32d5bdf0df86f283b5a05f821b32671 data/create/advancements/recipes/create.palettes/cut_dripstone_wall_from_dripstone_block_stonecutting.json -a4683c2cb715958e28d41ef3815ab7bfb9457ca7 data/create/advancements/recipes/create.palettes/cut_dripstone_wall_from_stone_types_dripstone_stonecutting.json -f5ea0be8a3fbf4c43909dbe4406beb0ec2192e13 data/create/advancements/recipes/create.palettes/cut_granite_brick_slab.json -9b5ee834a63a6bed03ee0f72c29a1a1a1b721d27 data/create/advancements/recipes/create.palettes/cut_granite_brick_slab_from_granite_stonecutting.json -3a6b3cb61b2e4e9d6a3c6460282390225ca5b1a3 data/create/advancements/recipes/create.palettes/cut_granite_brick_slab_from_stone_types_granite_stonecutting.json -7a02490ca3f70fcf88331b0f26a033a916b810e8 data/create/advancements/recipes/create.palettes/cut_granite_brick_slab_recycling.json -671f6973814216ec04f42b7d7535aa7b61b55b26 data/create/advancements/recipes/create.palettes/cut_granite_brick_stairs.json -47c0cf03575a11321bcde3c3ac0a1fd1bfeaa3b3 data/create/advancements/recipes/create.palettes/cut_granite_brick_stairs_from_granite_stonecutting.json -4b8412e62f3f0c44ca008ce4a13f48a6289fce78 data/create/advancements/recipes/create.palettes/cut_granite_brick_stairs_from_stone_types_granite_stonecutting.json -56fc4c60fe99e8ca6130b3714f1be6f4966d1ab4 data/create/advancements/recipes/create.palettes/cut_granite_brick_wall.json -e3d1d56a58171943f52d2bd7f55444410c31e490 data/create/advancements/recipes/create.palettes/cut_granite_brick_wall_from_granite_stonecutting.json -e1a1a24c843869427afc43980215a56fa2b22a7e data/create/advancements/recipes/create.palettes/cut_granite_brick_wall_from_stone_types_granite_stonecutting.json -686ea3f73b7ba7db9d733f162deec5599cec62e2 data/create/advancements/recipes/create.palettes/cut_granite_bricks_from_granite_stonecutting.json -5dbce50c004b049d3904f0a93aa5a7f69fd2cb68 data/create/advancements/recipes/create.palettes/cut_granite_bricks_from_stone_types_granite_stonecutting.json -77ed7edee3a5be5a04fe4cad4b5cf71016d1c4a9 data/create/advancements/recipes/create.palettes/cut_granite_from_granite_stonecutting.json -f30f34b296b0884759c5aa147c282bad27ddd992 data/create/advancements/recipes/create.palettes/cut_granite_from_stone_types_granite_stonecutting.json -958e8b048745fb67608771e8a76e692dc2409739 data/create/advancements/recipes/create.palettes/cut_granite_slab.json -79c09173c4e162a9edc526e2daf3169194db6363 data/create/advancements/recipes/create.palettes/cut_granite_slab_from_granite_stonecutting.json -7352a3471cbcecfd95aac0052f82c3af29ffad32 data/create/advancements/recipes/create.palettes/cut_granite_slab_from_stone_types_granite_stonecutting.json -3f7effd2b9e22e0ec996f19656f708e528fc7f81 data/create/advancements/recipes/create.palettes/cut_granite_slab_recycling.json -41bf95f5f8c2983a79610e05e5e5657667779117 data/create/advancements/recipes/create.palettes/cut_granite_stairs.json -24c850200e40cec34b3575b2872b70e81da5ff62 data/create/advancements/recipes/create.palettes/cut_granite_stairs_from_granite_stonecutting.json -0b6c32b17e4f5d88faa0986301a9a84c93566272 data/create/advancements/recipes/create.palettes/cut_granite_stairs_from_stone_types_granite_stonecutting.json -0a856a007ee8107e6e141a7c4d3db61b3f42a75f data/create/advancements/recipes/create.palettes/cut_granite_wall.json -651e9fff7b0ca7c7e33fbae68f1a5268c48051d8 data/create/advancements/recipes/create.palettes/cut_granite_wall_from_granite_stonecutting.json -0c38e6cfbca90f40daa49fab1114a12a6403816f data/create/advancements/recipes/create.palettes/cut_granite_wall_from_stone_types_granite_stonecutting.json -dbeb316b62ed53a36c3a77619e8a7847107f828c data/create/advancements/recipes/create.palettes/cut_limestone_brick_slab.json -64fb60e342657c1fc80f42634fa312696efd2bb4 data/create/advancements/recipes/create.palettes/cut_limestone_brick_slab_from_limestone_stonecutting.json -bfc7bfad55e8afa583f30d5504674f2fc017d2b3 data/create/advancements/recipes/create.palettes/cut_limestone_brick_slab_from_stone_types_limestone_stonecutting.json -0a9b5d1f6cddb3e3bc249e8182f22e53007337db data/create/advancements/recipes/create.palettes/cut_limestone_brick_slab_recycling.json -ac5e10d641bcffa6ed7baea1690cef93ab872987 data/create/advancements/recipes/create.palettes/cut_limestone_brick_stairs.json -3f63787b154d5dbf4f85555af28cdc53c9b82cf6 data/create/advancements/recipes/create.palettes/cut_limestone_brick_stairs_from_limestone_stonecutting.json -985eb26bfee853fe43b2479bd71a43d923fc6c21 data/create/advancements/recipes/create.palettes/cut_limestone_brick_stairs_from_stone_types_limestone_stonecutting.json -776d430cb58597be6d3f2d3f93978c2d57eb3703 data/create/advancements/recipes/create.palettes/cut_limestone_brick_wall.json -eb12ec324ee169772cca06265919d7b7259bd9d7 data/create/advancements/recipes/create.palettes/cut_limestone_brick_wall_from_limestone_stonecutting.json -6d5846c46ccfce35bf389b08a31c863c9612b498 data/create/advancements/recipes/create.palettes/cut_limestone_brick_wall_from_stone_types_limestone_stonecutting.json -46bf4386d4b9c4348f305198dd3bd47f4c60d805 data/create/advancements/recipes/create.palettes/cut_limestone_bricks_from_limestone_stonecutting.json -3c00d099ff1958b2549a4e8b04f14dfcc1469db3 data/create/advancements/recipes/create.palettes/cut_limestone_bricks_from_stone_types_limestone_stonecutting.json -50ba84a90bc126e5171b8bee5c3546119488bd2c data/create/advancements/recipes/create.palettes/cut_limestone_from_limestone_stonecutting.json -5bad7318b3c241a75fb1ff111c660c755c2181b0 data/create/advancements/recipes/create.palettes/cut_limestone_from_stone_types_limestone_stonecutting.json -a2eda8210e7c97058fbcd27d4934dfd1d03267fd data/create/advancements/recipes/create.palettes/cut_limestone_slab.json -9e391d9c97f617af06657819fc3712c1a4263a52 data/create/advancements/recipes/create.palettes/cut_limestone_slab_from_limestone_stonecutting.json -5c44837ff0108cb2ee2e200ea7fc3609469ca585 data/create/advancements/recipes/create.palettes/cut_limestone_slab_from_stone_types_limestone_stonecutting.json -df8254521080fc9f9eff64036ec3d4b0e00f5c4d data/create/advancements/recipes/create.palettes/cut_limestone_slab_recycling.json -1efc4f73c5ed7c181ac23178aba4da174c68c1af data/create/advancements/recipes/create.palettes/cut_limestone_stairs.json -c0feff8f8e607ec5ca8d6a75ebbf20382825139c data/create/advancements/recipes/create.palettes/cut_limestone_stairs_from_limestone_stonecutting.json -50cd6653df844e6cdd17027745e9acbe7e50affc data/create/advancements/recipes/create.palettes/cut_limestone_stairs_from_stone_types_limestone_stonecutting.json -5a677ebd58bf5570c4390f964c8ab7c355baeee8 data/create/advancements/recipes/create.palettes/cut_limestone_wall.json -b545759d95e9a3fed6591a6cba8304c6d930ec00 data/create/advancements/recipes/create.palettes/cut_limestone_wall_from_limestone_stonecutting.json -a2fe1ee0ba424ed35f13e6e5248c805486ef9008 data/create/advancements/recipes/create.palettes/cut_limestone_wall_from_stone_types_limestone_stonecutting.json -2120a327cc45f3e856198b87ea8bedb0d3fa9b9f data/create/advancements/recipes/create.palettes/cut_ochrum_brick_slab.json -309c4025c0b538188b6554cf26f888af3b78cfe9 data/create/advancements/recipes/create.palettes/cut_ochrum_brick_slab_from_ochrum_stonecutting.json -dd71c858dafd641c776e4c1af9fd37bc4484e906 data/create/advancements/recipes/create.palettes/cut_ochrum_brick_slab_from_stone_types_ochrum_stonecutting.json -3bfa629fd5cba5352429bdd3d6a4ed86ae522ce3 data/create/advancements/recipes/create.palettes/cut_ochrum_brick_slab_recycling.json -6ea27f007b02f22753a8e8a943ebf11be93268f7 data/create/advancements/recipes/create.palettes/cut_ochrum_brick_stairs.json -0d11e7e4ac1a602b6ec4f5edc58618a28fcd327a data/create/advancements/recipes/create.palettes/cut_ochrum_brick_stairs_from_ochrum_stonecutting.json -df55d8cfb16b41886d8dd8fa07036ffb94a48641 data/create/advancements/recipes/create.palettes/cut_ochrum_brick_stairs_from_stone_types_ochrum_stonecutting.json -fcb3ad214aacdfc228adf8f637ade0d62cc84dff data/create/advancements/recipes/create.palettes/cut_ochrum_brick_wall.json -ca74feca7dae05bbb8bdc742df3bfb039b6e6542 data/create/advancements/recipes/create.palettes/cut_ochrum_brick_wall_from_ochrum_stonecutting.json -3ecefca0632744c2f83c64d39944fa45c6bea50e data/create/advancements/recipes/create.palettes/cut_ochrum_brick_wall_from_stone_types_ochrum_stonecutting.json -f31b47e3d3560d2f3928d7b13720092a48833861 data/create/advancements/recipes/create.palettes/cut_ochrum_bricks_from_ochrum_stonecutting.json -c46df872eebb7578fc5c670ffb02c51b838ae0fa data/create/advancements/recipes/create.palettes/cut_ochrum_bricks_from_stone_types_ochrum_stonecutting.json -82bfe44e446b950141236666b654e690de9b87ec data/create/advancements/recipes/create.palettes/cut_ochrum_from_ochrum_stonecutting.json -d128fb5785174ad7c96fd27b8383a7910372a46a data/create/advancements/recipes/create.palettes/cut_ochrum_from_stone_types_ochrum_stonecutting.json -c4a36b6ae85368f1c8ffb93f233d38525b258e39 data/create/advancements/recipes/create.palettes/cut_ochrum_slab.json -7dad77e90a5711ccee0dbf02624b5a193dadace5 data/create/advancements/recipes/create.palettes/cut_ochrum_slab_from_ochrum_stonecutting.json -b8557a404a534267e3e98ad2ba8a527d57e6fb02 data/create/advancements/recipes/create.palettes/cut_ochrum_slab_from_stone_types_ochrum_stonecutting.json -a8ab8009f2934625f11b72b558c73302502e1e63 data/create/advancements/recipes/create.palettes/cut_ochrum_slab_recycling.json -265c91096b029829973674c5de20dc547da36db5 data/create/advancements/recipes/create.palettes/cut_ochrum_stairs.json -9b9d576ecb2ac3259db9437d0b5ec1301b73aced data/create/advancements/recipes/create.palettes/cut_ochrum_stairs_from_ochrum_stonecutting.json -767fa7f43d83b4f4cb08ab56b757c0d597097e99 data/create/advancements/recipes/create.palettes/cut_ochrum_stairs_from_stone_types_ochrum_stonecutting.json -7385e2a71da32d1a53ef0de2873d7181e6f8fd32 data/create/advancements/recipes/create.palettes/cut_ochrum_wall.json -7d0a5d7cce1abacb4dd8683b21a7c4777f57113e data/create/advancements/recipes/create.palettes/cut_ochrum_wall_from_ochrum_stonecutting.json -018765fbfda5b14edb7796b3fbb8e89ab11fdd6d data/create/advancements/recipes/create.palettes/cut_ochrum_wall_from_stone_types_ochrum_stonecutting.json -648ba0d229c3285a0d29e3d0c3bfe3a35f18c42e data/create/advancements/recipes/create.palettes/cut_scorchia_brick_slab.json -b1fbd6078eec777b49c924ec4510614cf276c8fa data/create/advancements/recipes/create.palettes/cut_scorchia_brick_slab_from_scorchia_stonecutting.json -7c9a476ec80f2596bc4892176e4d3a8512c5623c data/create/advancements/recipes/create.palettes/cut_scorchia_brick_slab_from_stone_types_scorchia_stonecutting.json -bbdb70ad3afec15e80f4d76784830372d4703573 data/create/advancements/recipes/create.palettes/cut_scorchia_brick_slab_recycling.json -75f39ad0c03ab1527d872a898f38d45b19e29553 data/create/advancements/recipes/create.palettes/cut_scorchia_brick_stairs.json -a6bf6d18b99fabe332a951c0394a224f357e41f8 data/create/advancements/recipes/create.palettes/cut_scorchia_brick_stairs_from_scorchia_stonecutting.json -6629748757115717bfe14cbf3d3d6ab528d3694d data/create/advancements/recipes/create.palettes/cut_scorchia_brick_stairs_from_stone_types_scorchia_stonecutting.json -693587803f1d9cf432ffc98efc38a7301863e7e4 data/create/advancements/recipes/create.palettes/cut_scorchia_brick_wall.json -712205ccf5262fe9e7ab28453d2d7d709f7ef423 data/create/advancements/recipes/create.palettes/cut_scorchia_brick_wall_from_scorchia_stonecutting.json -b1584b4b178daf18794594b2480abcc7f3fccef2 data/create/advancements/recipes/create.palettes/cut_scorchia_brick_wall_from_stone_types_scorchia_stonecutting.json -3404169dbd586a5ca6d9cd3a700d429fad990327 data/create/advancements/recipes/create.palettes/cut_scorchia_bricks_from_scorchia_stonecutting.json -6446650bc090e554a84e2ca8f47ab498d648c5d1 data/create/advancements/recipes/create.palettes/cut_scorchia_bricks_from_stone_types_scorchia_stonecutting.json -f14269d1b25e89a35bfdb7df171adaed6db0e34b data/create/advancements/recipes/create.palettes/cut_scorchia_from_scorchia_stonecutting.json -431d969a9a542ed892f57226e00dda55ac148c1e data/create/advancements/recipes/create.palettes/cut_scorchia_from_stone_types_scorchia_stonecutting.json -e8966a786652b83a082702db58ebd48975d9c39b data/create/advancements/recipes/create.palettes/cut_scorchia_slab.json -bb848c2588162414dc29cf29eed8e53b152456df data/create/advancements/recipes/create.palettes/cut_scorchia_slab_from_scorchia_stonecutting.json -70a29ee26b3f75c5b592316b9c2f8cb7a8911989 data/create/advancements/recipes/create.palettes/cut_scorchia_slab_from_stone_types_scorchia_stonecutting.json -b0a16e7fa0781a0b1ec88e459b3f0f9ce4a8694e data/create/advancements/recipes/create.palettes/cut_scorchia_slab_recycling.json -dd9435b2712de63fe276557060c8526c0814089d data/create/advancements/recipes/create.palettes/cut_scorchia_stairs.json -20c9d0e6757d676d22aaf161a1c5fcbceaf3ed03 data/create/advancements/recipes/create.palettes/cut_scorchia_stairs_from_scorchia_stonecutting.json -931e056dbab47c2443ad599410266c4f734449b9 data/create/advancements/recipes/create.palettes/cut_scorchia_stairs_from_stone_types_scorchia_stonecutting.json -cfed62ee22025b8b81386ff60d6b98ebe5021680 data/create/advancements/recipes/create.palettes/cut_scorchia_wall.json -c2048348b425351899a720552c9b60d246d344ab data/create/advancements/recipes/create.palettes/cut_scorchia_wall_from_scorchia_stonecutting.json -5d6270c11595156c91b03dbf8678c96d2334281b data/create/advancements/recipes/create.palettes/cut_scorchia_wall_from_stone_types_scorchia_stonecutting.json -ada66ca04cf48339915e20871cc0b8491f2f5348 data/create/advancements/recipes/create.palettes/cut_scoria_brick_slab.json -42138c8287f2006502b4d5fb1de0cb470f6a6713 data/create/advancements/recipes/create.palettes/cut_scoria_brick_slab_from_scoria_stonecutting.json -1b84a09b6490223ab5f90b6736bb36909cbb1b5c data/create/advancements/recipes/create.palettes/cut_scoria_brick_slab_from_stone_types_scoria_stonecutting.json -09dc9f9206ea2417d7cec4d34044cb12b0b33b01 data/create/advancements/recipes/create.palettes/cut_scoria_brick_slab_recycling.json -4a3bea2d8a975290c9e233dbbd29d2eb6c7fa7c8 data/create/advancements/recipes/create.palettes/cut_scoria_brick_stairs.json -b017c15c67995b8ac6a3abe6b4c4e8377b29ae00 data/create/advancements/recipes/create.palettes/cut_scoria_brick_stairs_from_scoria_stonecutting.json -efbc323c5b72779a5e15a7f4ea65890b52b23622 data/create/advancements/recipes/create.palettes/cut_scoria_brick_stairs_from_stone_types_scoria_stonecutting.json -263f108b99aa88921842d1a3c54c4848f11be33c data/create/advancements/recipes/create.palettes/cut_scoria_brick_wall.json -05f536b24f94d4fdebba8fed7e8fd38ef6613b6f data/create/advancements/recipes/create.palettes/cut_scoria_brick_wall_from_scoria_stonecutting.json -0c4d7fadd78c936d0a2ce39f8322ab23ef74b9dd data/create/advancements/recipes/create.palettes/cut_scoria_brick_wall_from_stone_types_scoria_stonecutting.json -f342f7a18b2eb879e8f78ab64718121bbc9179bc data/create/advancements/recipes/create.palettes/cut_scoria_bricks_from_scoria_stonecutting.json -d85bec26fe30e699ec34a65f141f4e7f7ca1feee data/create/advancements/recipes/create.palettes/cut_scoria_bricks_from_stone_types_scoria_stonecutting.json -a8579934fc32aa4ef87edaab8a95fa15eabc2a11 data/create/advancements/recipes/create.palettes/cut_scoria_from_scoria_stonecutting.json -c9a7ce0bbd9adcba5e0778915b3c581806027e85 data/create/advancements/recipes/create.palettes/cut_scoria_from_stone_types_scoria_stonecutting.json -0f2773b05f66834e24849757b5f0db0d6303cde3 data/create/advancements/recipes/create.palettes/cut_scoria_slab.json -1251ab2f5db6871bec830705990a1687882bb4a2 data/create/advancements/recipes/create.palettes/cut_scoria_slab_from_scoria_stonecutting.json -66482c7da597ecd80dab359964be19edc9e8e34e data/create/advancements/recipes/create.palettes/cut_scoria_slab_from_stone_types_scoria_stonecutting.json -4fe5898b8bcbe50a7659d46cff98df634acd1a06 data/create/advancements/recipes/create.palettes/cut_scoria_slab_recycling.json -42a763570344a099ff2b65cf64d7b99b618ecf1e data/create/advancements/recipes/create.palettes/cut_scoria_stairs.json -a1cf05108e524b4dbe3cd5bb8482f64b1c7b3f9a data/create/advancements/recipes/create.palettes/cut_scoria_stairs_from_scoria_stonecutting.json -721fd1c870080ee0fea7899488a32bf97a26993e data/create/advancements/recipes/create.palettes/cut_scoria_stairs_from_stone_types_scoria_stonecutting.json -58d35a5095bd9e5342244ae10b08c552b9b8115a data/create/advancements/recipes/create.palettes/cut_scoria_wall.json -10f172bdf7c5b9539aea5948d83e9af325fb7b8d data/create/advancements/recipes/create.palettes/cut_scoria_wall_from_scoria_stonecutting.json -86759d164402ae98db84b9aafc5823a3dd3811c1 data/create/advancements/recipes/create.palettes/cut_scoria_wall_from_stone_types_scoria_stonecutting.json -9637e9799d86ce911fd993f2720e0ba0eb856024 data/create/advancements/recipes/create.palettes/cut_tuff_brick_slab.json -b4301c349fcbc1e033b67e2ffcbfcb37593d0d2a data/create/advancements/recipes/create.palettes/cut_tuff_brick_slab_from_stone_types_tuff_stonecutting.json -cafb286a19630493130146b99a7ccc7be0dcc14f data/create/advancements/recipes/create.palettes/cut_tuff_brick_slab_from_tuff_stonecutting.json -0b98ab0cee6f96433892e38828814805cf4b91f1 data/create/advancements/recipes/create.palettes/cut_tuff_brick_slab_recycling.json -554e7de94e12145f03a17c9649cfb5167cad6ba8 data/create/advancements/recipes/create.palettes/cut_tuff_brick_stairs.json -1b5507c2a12bea515e098d21f1ee10b5321db8ce data/create/advancements/recipes/create.palettes/cut_tuff_brick_stairs_from_stone_types_tuff_stonecutting.json -ba970a16dd336a4be3e3fbb97f82373861aa559e data/create/advancements/recipes/create.palettes/cut_tuff_brick_stairs_from_tuff_stonecutting.json -9ee5223788023d5762bec6ce04c5f41ca331b664 data/create/advancements/recipes/create.palettes/cut_tuff_brick_wall.json -42cb7c6b86aad7cbaf69089f45e38965e66781ff data/create/advancements/recipes/create.palettes/cut_tuff_brick_wall_from_stone_types_tuff_stonecutting.json -038bd1d415b84429f42c2eb95fcb2e27a7e5b6c2 data/create/advancements/recipes/create.palettes/cut_tuff_brick_wall_from_tuff_stonecutting.json -65fd41988bec5d85d2a82babacf80991efa62b0b data/create/advancements/recipes/create.palettes/cut_tuff_bricks_from_stone_types_tuff_stonecutting.json -0bd67f5eb8f7c38d6ccddd798d2ef3bbf63e2921 data/create/advancements/recipes/create.palettes/cut_tuff_bricks_from_tuff_stonecutting.json -6d0f8f4b2c3e25e4c9749a43e9cff2cdec411042 data/create/advancements/recipes/create.palettes/cut_tuff_from_stone_types_tuff_stonecutting.json -d460a959a10428b7cfe7f73dae22af56c605e33c data/create/advancements/recipes/create.palettes/cut_tuff_from_tuff_stonecutting.json -a6e26d9b445cc7edc3621f01351211569ce172ca data/create/advancements/recipes/create.palettes/cut_tuff_slab.json -73dd3380e6ad5ec1da3818c637ffe8f3e772e586 data/create/advancements/recipes/create.palettes/cut_tuff_slab_from_stone_types_tuff_stonecutting.json -0370696b91be4c6a318f6e5c3a7e22eedfba4dba data/create/advancements/recipes/create.palettes/cut_tuff_slab_from_tuff_stonecutting.json -b315307fde8bf63d0072820aee13d4efcb12ffa3 data/create/advancements/recipes/create.palettes/cut_tuff_slab_recycling.json -ee713365e9ecef75f6941e243872ef65d9d476f1 data/create/advancements/recipes/create.palettes/cut_tuff_stairs.json -1e89398126c2113492924c4880b6c964cbb8409d data/create/advancements/recipes/create.palettes/cut_tuff_stairs_from_stone_types_tuff_stonecutting.json -7a79b60deed6cd3e95b9579c2487aa033e8f16f4 data/create/advancements/recipes/create.palettes/cut_tuff_stairs_from_tuff_stonecutting.json -7f6306c60cc2aa9aa548fdceb37e2dd1d2b79486 data/create/advancements/recipes/create.palettes/cut_tuff_wall.json -ebdbf3f3ef03ec96ec86510547c1e748b1afa5c0 data/create/advancements/recipes/create.palettes/cut_tuff_wall_from_stone_types_tuff_stonecutting.json -f2c5743f76105a5f4395bf0c9b7761b687a34bbb data/create/advancements/recipes/create.palettes/cut_tuff_wall_from_tuff_stonecutting.json -6a81d22158c6506d623091272368bdca5853268e data/create/advancements/recipes/create.palettes/cut_veridium_brick_slab.json -3e4ed2dcff2b6a0f788ae461875bebbe5532419d data/create/advancements/recipes/create.palettes/cut_veridium_brick_slab_from_stone_types_veridium_stonecutting.json -bf2185260292777e0c06baaa98def71c36475996 data/create/advancements/recipes/create.palettes/cut_veridium_brick_slab_from_veridium_stonecutting.json -48dee94d24be14aa8f275a474e1a8f95bc563f28 data/create/advancements/recipes/create.palettes/cut_veridium_brick_slab_recycling.json -f3819ca3bd1b50a1ac87a990c3a97d9b161f3feb data/create/advancements/recipes/create.palettes/cut_veridium_brick_stairs.json -b27c6f31d9d9f67675cee3c525b4c8a7ed998b0f data/create/advancements/recipes/create.palettes/cut_veridium_brick_stairs_from_stone_types_veridium_stonecutting.json -27ae0292076b9025bb0a5fd890b2d5c4ccddf922 data/create/advancements/recipes/create.palettes/cut_veridium_brick_stairs_from_veridium_stonecutting.json -acc9de007a3604d4a639a0c5ed9efaa95e899f0a data/create/advancements/recipes/create.palettes/cut_veridium_brick_wall.json -8ced7547c271428a50d255fd6553d55268b238b2 data/create/advancements/recipes/create.palettes/cut_veridium_brick_wall_from_stone_types_veridium_stonecutting.json -785f4928bcaa7282ba487094e6663ff420ca0da1 data/create/advancements/recipes/create.palettes/cut_veridium_brick_wall_from_veridium_stonecutting.json -8b584556f0a0ff7f71d4eb7f544bab545fe875cd data/create/advancements/recipes/create.palettes/cut_veridium_bricks_from_stone_types_veridium_stonecutting.json -a8cfbd173a14ecb6ff6a2d0116c1a80f167a8dbd data/create/advancements/recipes/create.palettes/cut_veridium_bricks_from_veridium_stonecutting.json -8feed403d077cad87f295fe33bfc54a850dfd470 data/create/advancements/recipes/create.palettes/cut_veridium_from_stone_types_veridium_stonecutting.json -1ee547c7713948f9a9aab374aafc0a09545ec0ff data/create/advancements/recipes/create.palettes/cut_veridium_from_veridium_stonecutting.json -5b40bf7228e05720dfb6a902461e735c82c694bc data/create/advancements/recipes/create.palettes/cut_veridium_slab.json -6a80d8d39c79f232ae70ebd4f3c2588593f3ca84 data/create/advancements/recipes/create.palettes/cut_veridium_slab_from_stone_types_veridium_stonecutting.json -a6588bb646607750cd8e889e665d63fbf5c8009e data/create/advancements/recipes/create.palettes/cut_veridium_slab_from_veridium_stonecutting.json -fe55bb155073bb02a9f3e6e5c1aeb42d99889d1b data/create/advancements/recipes/create.palettes/cut_veridium_slab_recycling.json -16f32df46decaaf7a5ca39855c29cfde85d57aff data/create/advancements/recipes/create.palettes/cut_veridium_stairs.json -04baf71fb6c6d700f93fc6500d1d8ad4aeae4b55 data/create/advancements/recipes/create.palettes/cut_veridium_stairs_from_stone_types_veridium_stonecutting.json -43ffa6bae9cb94d413d2bfa445b54da8ead70bf9 data/create/advancements/recipes/create.palettes/cut_veridium_stairs_from_veridium_stonecutting.json -462dad973e5a5d7c0232e121cf2f393bbcb2a1af data/create/advancements/recipes/create.palettes/cut_veridium_wall.json -ec49c9c74384046302ab83c6a5d85f3639ca15cf data/create/advancements/recipes/create.palettes/cut_veridium_wall_from_stone_types_veridium_stonecutting.json -57cd9d8f2c3d626acf1adf2cff932953965bd4f2 data/create/advancements/recipes/create.palettes/cut_veridium_wall_from_veridium_stonecutting.json -6110ac033d24e463a31fb641ce6c3a03505bdfaa data/create/advancements/recipes/create.palettes/dark_oak_window.json -fc2da04056c0a1a3347c227696c13d85394e27e6 data/create/advancements/recipes/create.palettes/dark_oak_window_pane.json -2b60559e5ac50dfb2292d481f7be0c183f75becd data/create/advancements/recipes/create.palettes/deepslate_pillar_from_deepslate_stonecutting.json -1d92970498686beaba3ee97a964d95f00bd8aef8 data/create/advancements/recipes/create.palettes/deepslate_pillar_from_stone_types_deepslate_stonecutting.json -9581791d1a820d85d105bc1efae2df9ba34204cb data/create/advancements/recipes/create.palettes/diorite_pillar_from_diorite_stonecutting.json -79375ff88b84f85e1983cba3e4af45abe399f881 data/create/advancements/recipes/create.palettes/diorite_pillar_from_stone_types_diorite_stonecutting.json -7a0e600fdcc58aa91f06c7049209a7af138451e8 data/create/advancements/recipes/create.palettes/dripstone_pillar_from_dripstone_block_stonecutting.json -9c64a60aa3741533d1fe6d43bfcdf52673880651 data/create/advancements/recipes/create.palettes/dripstone_pillar_from_stone_types_dripstone_stonecutting.json -05331b5f1701453ecdfd0b3e6429b22ec209ba67 data/create/advancements/recipes/create.palettes/framed_glass_from_glass_colorless_stonecutting.json -a2146b1cb0dab36728469c0792bc3ec187ea950b data/create/advancements/recipes/create.palettes/framed_glass_pane.json -c89d97bf7dbdc3740c4c3cc9446f0921b9bbe6e3 data/create/advancements/recipes/create.palettes/granite_pillar_from_granite_stonecutting.json -b19bee1283f3ba551d61c55a1c06eb55251a1cae data/create/advancements/recipes/create.palettes/granite_pillar_from_stone_types_granite_stonecutting.json -cbb40e82dba460ee126966a52f0164e740ac1f11 data/create/advancements/recipes/create.palettes/horizontal_framed_glass_from_glass_colorless_stonecutting.json -ebea30dbcdd4122277d34d7fce8da3b8a8847a42 data/create/advancements/recipes/create.palettes/horizontal_framed_glass_pane.json -c6dcd54313fd12beefb3e01f4e920c38dd4dd199 data/create/advancements/recipes/create.palettes/jungle_window.json -0cdc5053b1cf611cc1b547474bb07002cb937d10 data/create/advancements/recipes/create.palettes/jungle_window_pane.json -7d6d3a25a07cef49d063efdb3f08e398af8a35ac data/create/advancements/recipes/create.palettes/layered_andesite_from_andesite_stonecutting.json -ed7c2b3e8ff59650f778e5e59091160504cadcbf data/create/advancements/recipes/create.palettes/layered_andesite_from_stone_types_andesite_stonecutting.json -ba48b5d40355f78d28d625880a7fe9d08a8fa794 data/create/advancements/recipes/create.palettes/layered_asurine_from_asurine_stonecutting.json -e0d81bbdf528639801e356638586e3f99a50df88 data/create/advancements/recipes/create.palettes/layered_asurine_from_stone_types_asurine_stonecutting.json -2550ea6568993184477477ce1c719288cd0e0711 data/create/advancements/recipes/create.palettes/layered_calcite_from_calcite_stonecutting.json -de419f3101e178df221db89037b46e1d96052cc1 data/create/advancements/recipes/create.palettes/layered_calcite_from_stone_types_calcite_stonecutting.json -a48d42cfecc29f7569409938e5946e7e205d80c6 data/create/advancements/recipes/create.palettes/layered_crimsite_from_crimsite_stonecutting.json -95c44bdacc04b0c31f2a998a3160b69913e57bdb data/create/advancements/recipes/create.palettes/layered_crimsite_from_stone_types_crimsite_stonecutting.json -1d070b4add75d96fb794ede0d6d618afa62a93de data/create/advancements/recipes/create.palettes/layered_deepslate_from_deepslate_stonecutting.json -6263226c942c1beb37d03cff355484278e951ab7 data/create/advancements/recipes/create.palettes/layered_deepslate_from_stone_types_deepslate_stonecutting.json -5180fe223dbe3074004ab87d17557d2ce0cd11aa data/create/advancements/recipes/create.palettes/layered_diorite_from_diorite_stonecutting.json -d30377692acc40c521e395f7733ebb9657b94801 data/create/advancements/recipes/create.palettes/layered_diorite_from_stone_types_diorite_stonecutting.json -fe64f0ae3d3011281bcff85eee513925ae9d23cc data/create/advancements/recipes/create.palettes/layered_dripstone_from_dripstone_block_stonecutting.json -e69181339b04a35aed5f70f13bbc71fee33a7c49 data/create/advancements/recipes/create.palettes/layered_dripstone_from_stone_types_dripstone_stonecutting.json -d0f7155542a4350efa92297cf8fec0649e963b21 data/create/advancements/recipes/create.palettes/layered_granite_from_granite_stonecutting.json -2d734268284b9493fb1f5531893459de2dab8984 data/create/advancements/recipes/create.palettes/layered_granite_from_stone_types_granite_stonecutting.json -c9d170be3d0ad11171449da98d3edac42de2dfab data/create/advancements/recipes/create.palettes/layered_limestone_from_limestone_stonecutting.json -f2985b6b3ae1c9f4af2eae76ba63f129ef6f6e28 data/create/advancements/recipes/create.palettes/layered_limestone_from_stone_types_limestone_stonecutting.json -5e26afbed98e1403897c00dc4f546e2e50bd8dfb data/create/advancements/recipes/create.palettes/layered_ochrum_from_ochrum_stonecutting.json -9d6f09080e3822bad136e405157dfe316b2e6371 data/create/advancements/recipes/create.palettes/layered_ochrum_from_stone_types_ochrum_stonecutting.json -9a3ee6235c6f817fabdd78799fd28184f39f00b5 data/create/advancements/recipes/create.palettes/layered_scorchia_from_scorchia_stonecutting.json -8ccd1142c7384665e8c4ee8fd1a0b70e19629f22 data/create/advancements/recipes/create.palettes/layered_scorchia_from_stone_types_scorchia_stonecutting.json -24402ed4dc9a76c1e3d5d0e307d6ad7b926e798b data/create/advancements/recipes/create.palettes/layered_scoria_from_scoria_stonecutting.json -857dc86c30226f766d28317ed6822d8b2254e0a5 data/create/advancements/recipes/create.palettes/layered_scoria_from_stone_types_scoria_stonecutting.json -0141f9a512a8a7e8f595265d1ce3015cc6291c56 data/create/advancements/recipes/create.palettes/layered_tuff_from_stone_types_tuff_stonecutting.json -55df0bebc3e4c3f4e1c55b3ff24f9340605af24e data/create/advancements/recipes/create.palettes/layered_tuff_from_tuff_stonecutting.json -94722b51c4fbe9f9ff75a002cbdbdad244c434b1 data/create/advancements/recipes/create.palettes/layered_veridium_from_stone_types_veridium_stonecutting.json -6372ecc3cad33f5b1b6224bba09ceeba84c72a55 data/create/advancements/recipes/create.palettes/layered_veridium_from_veridium_stonecutting.json -a50ae92f63a26e0baa28fc5ab0b04356c046df3f data/create/advancements/recipes/create.palettes/limestone_pillar_from_limestone_stonecutting.json -00529d5adf436743a3b5e1cd32db4198cbe7d5e0 data/create/advancements/recipes/create.palettes/limestone_pillar_from_stone_types_limestone_stonecutting.json -888b844c55a3457db50de4b3150f3db64717815b data/create/advancements/recipes/create.palettes/oak_window.json -ea8ec2e00c9d88b9a58202033c483efa068a15b5 data/create/advancements/recipes/create.palettes/oak_window_pane.json -7ac4e8386d77e36c0d921e31b3860eb8d0eb9f46 data/create/advancements/recipes/create.palettes/ochrum_pillar_from_ochrum_stonecutting.json -5c662131b9d73434a5ee6abda5b6f5b9819e194d data/create/advancements/recipes/create.palettes/ochrum_pillar_from_stone_types_ochrum_stonecutting.json -fc374d88e9f4ffeb54348a611dc470f148c572de data/create/advancements/recipes/create.palettes/ornate_iron_window.json -47aebe2078baf3b0c22f09934461f7376ebbea39 data/create/advancements/recipes/create.palettes/ornate_iron_window_pane.json -0b40d3c37e27d9d9297f050ad710af6c17821954 data/create/advancements/recipes/create.palettes/polished_cut_andesite_from_andesite_stonecutting.json -eb1770f5e5f4384e84ae90e566d0d48a857b7748 data/create/advancements/recipes/create.palettes/polished_cut_andesite_from_stone_types_andesite_stonecutting.json -f586b7389c46acb2ade3286ea234e5b37bfd728c data/create/advancements/recipes/create.palettes/polished_cut_andesite_slab.json -5b516a1a4d06ef3feda840a17210163c2ca877dc data/create/advancements/recipes/create.palettes/polished_cut_andesite_slab_from_andesite_stonecutting.json -498fc5a6424fe6c88ebd4cc8b53f6d676e9d9188 data/create/advancements/recipes/create.palettes/polished_cut_andesite_slab_from_stone_types_andesite_stonecutting.json -ffb80923d91ca656fe305c11bba42558586fe0e1 data/create/advancements/recipes/create.palettes/polished_cut_andesite_slab_recycling.json -e45b2859f682f0d5a79c8f512d729cdab0f41b07 data/create/advancements/recipes/create.palettes/polished_cut_andesite_stairs.json -b9cb136ee1bcdbae5baa6704f41344243f5652a0 data/create/advancements/recipes/create.palettes/polished_cut_andesite_stairs_from_andesite_stonecutting.json -10cc2ca75bb30b053fa69d068d2a9c7ef87637ba data/create/advancements/recipes/create.palettes/polished_cut_andesite_stairs_from_stone_types_andesite_stonecutting.json -583ce4d1c1cd552d5a72699a37674249fe7401f0 data/create/advancements/recipes/create.palettes/polished_cut_andesite_wall.json -c90cb91b0727412c50f4305f1adef672eb8f8cf8 data/create/advancements/recipes/create.palettes/polished_cut_andesite_wall_from_andesite_stonecutting.json -9f8caf52e6c3dfc2016c426a50f815f960d5269b data/create/advancements/recipes/create.palettes/polished_cut_andesite_wall_from_stone_types_andesite_stonecutting.json -4ebcf46e0f0d7137edffd0b5aac21891166ccb63 data/create/advancements/recipes/create.palettes/polished_cut_asurine_from_asurine_stonecutting.json -0b3a9ded875cda304807d42cda63ae21501b7634 data/create/advancements/recipes/create.palettes/polished_cut_asurine_from_stone_types_asurine_stonecutting.json -a130d8dbcce578935f80f88ec0fa358f4228dac5 data/create/advancements/recipes/create.palettes/polished_cut_asurine_slab.json -783b09282793015d63e0b1cf4985d3f7c244ab0f data/create/advancements/recipes/create.palettes/polished_cut_asurine_slab_from_asurine_stonecutting.json -cc13d3f0bff3f2b0bf2de85abca00705e4a81e37 data/create/advancements/recipes/create.palettes/polished_cut_asurine_slab_from_stone_types_asurine_stonecutting.json -7010ab9ffc821bb275b4cec27f2c9db9622af9d1 data/create/advancements/recipes/create.palettes/polished_cut_asurine_slab_recycling.json -1096c59d9bd15cb8aab394fe0ff66da80cc46a81 data/create/advancements/recipes/create.palettes/polished_cut_asurine_stairs.json -b2e6570b18c61be6eb6a2444ed39bf0fa5c95aa0 data/create/advancements/recipes/create.palettes/polished_cut_asurine_stairs_from_asurine_stonecutting.json -cdfb66d340fa033a39542c01037f5496e855bd23 data/create/advancements/recipes/create.palettes/polished_cut_asurine_stairs_from_stone_types_asurine_stonecutting.json -e320c6c5dbd309ba5350849272bb23144efb3476 data/create/advancements/recipes/create.palettes/polished_cut_asurine_wall.json -7f1d8de21421010fb26d1c766937b325e189299e data/create/advancements/recipes/create.palettes/polished_cut_asurine_wall_from_asurine_stonecutting.json -6f5ffa6740da9bf04fdda7c98c3cdb5cbd57197c data/create/advancements/recipes/create.palettes/polished_cut_asurine_wall_from_stone_types_asurine_stonecutting.json -a4c629631e8e5c7986f57f3d6bb91f7b7d3e418c data/create/advancements/recipes/create.palettes/polished_cut_calcite_from_calcite_stonecutting.json -8d10a06915727fb18d700ae070bc86ea043016e0 data/create/advancements/recipes/create.palettes/polished_cut_calcite_from_stone_types_calcite_stonecutting.json -dffa80dc9d33f51a09e83a2cd0853bb1b8fe02f2 data/create/advancements/recipes/create.palettes/polished_cut_calcite_slab.json -77d2be04354b5dae58a2caa21a58da8850f1eb56 data/create/advancements/recipes/create.palettes/polished_cut_calcite_slab_from_calcite_stonecutting.json -29f32235d5e2c2c459be7713aa3a1483e97f4962 data/create/advancements/recipes/create.palettes/polished_cut_calcite_slab_from_stone_types_calcite_stonecutting.json -efdd09efc26d6bb5c09bb675000cd2184270b7d2 data/create/advancements/recipes/create.palettes/polished_cut_calcite_slab_recycling.json -741258ec7ed31fe52b6ba4dbbcb862416aaa58f7 data/create/advancements/recipes/create.palettes/polished_cut_calcite_stairs.json -df7e7d2a22cbdee7d1da8de5f3b72442888f95e9 data/create/advancements/recipes/create.palettes/polished_cut_calcite_stairs_from_calcite_stonecutting.json -aad8f2c37d1f9afc4458af9bc80e7c6126439405 data/create/advancements/recipes/create.palettes/polished_cut_calcite_stairs_from_stone_types_calcite_stonecutting.json -a7b17e5de70e3bafe3c8baa6eaca46d2960a4e8f data/create/advancements/recipes/create.palettes/polished_cut_calcite_wall.json -33a3beefad529ad38530465187c47d220d7ee67b data/create/advancements/recipes/create.palettes/polished_cut_calcite_wall_from_calcite_stonecutting.json -5c01adcb1cb87295fd04dacebb5233dcb0f106f3 data/create/advancements/recipes/create.palettes/polished_cut_calcite_wall_from_stone_types_calcite_stonecutting.json -2a2287b48f280d708bf1ace15a6cf47f843bcc3d data/create/advancements/recipes/create.palettes/polished_cut_crimsite_from_crimsite_stonecutting.json -836c453c4402f4ab1987739ee6917fdbf8876c67 data/create/advancements/recipes/create.palettes/polished_cut_crimsite_from_stone_types_crimsite_stonecutting.json -921bba5dd275e352ec70dae77d4cb5f827b102fb data/create/advancements/recipes/create.palettes/polished_cut_crimsite_slab.json -262379573371a647dc8db16c20b6839f8d84a83a data/create/advancements/recipes/create.palettes/polished_cut_crimsite_slab_from_crimsite_stonecutting.json -c789071c930dd96e5bb94c52cb5e829cf8f1af85 data/create/advancements/recipes/create.palettes/polished_cut_crimsite_slab_from_stone_types_crimsite_stonecutting.json -68acda5eec2763d5dfb5b5a3a4189c038be977fe data/create/advancements/recipes/create.palettes/polished_cut_crimsite_slab_recycling.json -d815d1c9ac0ce8da57d70c9d032b89735c4b195a data/create/advancements/recipes/create.palettes/polished_cut_crimsite_stairs.json -a08fbc497ae4ac3d5329a9d821f34122d4594f5b data/create/advancements/recipes/create.palettes/polished_cut_crimsite_stairs_from_crimsite_stonecutting.json -fe7bf3b4a8ba0198cd554e6688b63882f06598c8 data/create/advancements/recipes/create.palettes/polished_cut_crimsite_stairs_from_stone_types_crimsite_stonecutting.json -7d98c180a3e607debdf445716a0afb7871365c55 data/create/advancements/recipes/create.palettes/polished_cut_crimsite_wall.json -1e4dc3659a7b4ea19892f46e79e64d39e00f91eb data/create/advancements/recipes/create.palettes/polished_cut_crimsite_wall_from_crimsite_stonecutting.json -3288269fcb833e800eb85b63772f6ac31470fcac data/create/advancements/recipes/create.palettes/polished_cut_crimsite_wall_from_stone_types_crimsite_stonecutting.json -a5af84ab6d956cd2e792089c29a537fac38385af data/create/advancements/recipes/create.palettes/polished_cut_deepslate_from_deepslate_stonecutting.json -a8f643103c2a090ec8528bb809e34b62a7be6e30 data/create/advancements/recipes/create.palettes/polished_cut_deepslate_from_stone_types_deepslate_stonecutting.json -cf7e54d4de0878a8897b88d2f665e18a5f9a2c98 data/create/advancements/recipes/create.palettes/polished_cut_deepslate_slab.json -c7362df3fc83656fe7303b4387d73025f2b4ad99 data/create/advancements/recipes/create.palettes/polished_cut_deepslate_slab_from_deepslate_stonecutting.json -13452ee3337ec5593a39ef5bef11d417954bd2d4 data/create/advancements/recipes/create.palettes/polished_cut_deepslate_slab_from_stone_types_deepslate_stonecutting.json -f81f073c058eb2cc11d9da867623de6236334d1f data/create/advancements/recipes/create.palettes/polished_cut_deepslate_slab_recycling.json -b20598c000e99606a312afc03ba7b42848df8577 data/create/advancements/recipes/create.palettes/polished_cut_deepslate_stairs.json -061f866c67d85de04de23c0b50e4452d0e4873b4 data/create/advancements/recipes/create.palettes/polished_cut_deepslate_stairs_from_deepslate_stonecutting.json -24a45f95f9712d5a1c13d3ff9b39852315642ab3 data/create/advancements/recipes/create.palettes/polished_cut_deepslate_stairs_from_stone_types_deepslate_stonecutting.json -0311f17cd4a3fe104ddbc7274b79af4ac1d225f8 data/create/advancements/recipes/create.palettes/polished_cut_deepslate_wall.json -fb97fa5120b6fb5517ee10dd9881bcd9d963056b data/create/advancements/recipes/create.palettes/polished_cut_deepslate_wall_from_deepslate_stonecutting.json -96503ff4f30270817cd1533a8176c79bbf31ace5 data/create/advancements/recipes/create.palettes/polished_cut_deepslate_wall_from_stone_types_deepslate_stonecutting.json -5508cc3ff907f1d14aa8d3f95f76b3f78f8ec92a data/create/advancements/recipes/create.palettes/polished_cut_diorite_from_diorite_stonecutting.json -5c2db9e1c43373ac00b3b4d8e91ef6fc02c44246 data/create/advancements/recipes/create.palettes/polished_cut_diorite_from_stone_types_diorite_stonecutting.json -3b29c85c6b110ac2972b4256ba7263e8c9f8b8eb data/create/advancements/recipes/create.palettes/polished_cut_diorite_slab.json -1db0b4fc490e3be9940e9be389640158576cde1c data/create/advancements/recipes/create.palettes/polished_cut_diorite_slab_from_diorite_stonecutting.json -451845eeb640288c8bf71217beaeff72ad6cf193 data/create/advancements/recipes/create.palettes/polished_cut_diorite_slab_from_stone_types_diorite_stonecutting.json -7744af97556df2cc2e0a0df82848fbfc83b84e5e data/create/advancements/recipes/create.palettes/polished_cut_diorite_slab_recycling.json -9c65eb9ef807c50a6b4bff8e84155ec571f43b97 data/create/advancements/recipes/create.palettes/polished_cut_diorite_stairs.json -558ab6f3ccd4093620c2fc3d55d97c2f072cd052 data/create/advancements/recipes/create.palettes/polished_cut_diorite_stairs_from_diorite_stonecutting.json -9a2b884dba5c009b3270362a96a2e35af8f6c7a3 data/create/advancements/recipes/create.palettes/polished_cut_diorite_stairs_from_stone_types_diorite_stonecutting.json -f5776826b97bb85f2dcb5e31f38ea0861f09fa34 data/create/advancements/recipes/create.palettes/polished_cut_diorite_wall.json -bbc453f07cbce4aab18c8b268ef0e67d2c67ac9d data/create/advancements/recipes/create.palettes/polished_cut_diorite_wall_from_diorite_stonecutting.json -a13b9c144f6b4025bc09321bcaf10d6e8819fe6c data/create/advancements/recipes/create.palettes/polished_cut_diorite_wall_from_stone_types_diorite_stonecutting.json -5f0d40b2900cb1b7524851b3378dc54db5899bd9 data/create/advancements/recipes/create.palettes/polished_cut_dripstone_from_dripstone_block_stonecutting.json -5f3e729a2078e9c4a63910ffb94643c8e404b4b9 data/create/advancements/recipes/create.palettes/polished_cut_dripstone_from_stone_types_dripstone_stonecutting.json -7aea176a86176ba501a6dd81a510c4b7aee6bc1f data/create/advancements/recipes/create.palettes/polished_cut_dripstone_slab.json -cdb572a8e8d0947abad7751217c922fc02774feb data/create/advancements/recipes/create.palettes/polished_cut_dripstone_slab_from_dripstone_block_stonecutting.json -d7fad9d7b21fa919e2748559ae19fe8469802f18 data/create/advancements/recipes/create.palettes/polished_cut_dripstone_slab_from_stone_types_dripstone_stonecutting.json -285183adee8c2a49533cfbb90e43c6d52479aba3 data/create/advancements/recipes/create.palettes/polished_cut_dripstone_slab_recycling.json -c6d87b066cb569cb02b2e45350ad9dd501119da8 data/create/advancements/recipes/create.palettes/polished_cut_dripstone_stairs.json -2feffefb1a004a6351e77fef280f715b19f23ce5 data/create/advancements/recipes/create.palettes/polished_cut_dripstone_stairs_from_dripstone_block_stonecutting.json -ac6c23c5055b6f6d052ef77fd5e5d9abe03aae50 data/create/advancements/recipes/create.palettes/polished_cut_dripstone_stairs_from_stone_types_dripstone_stonecutting.json -9c00100b2480e96208878ebeb5d4bd0fad8b2f1b data/create/advancements/recipes/create.palettes/polished_cut_dripstone_wall.json -6400512ddccf789552754c4926af61e9d756b0e5 data/create/advancements/recipes/create.palettes/polished_cut_dripstone_wall_from_dripstone_block_stonecutting.json -9a7aab1384a2bd16e9c770b1ee4272ec7da3a0b7 data/create/advancements/recipes/create.palettes/polished_cut_dripstone_wall_from_stone_types_dripstone_stonecutting.json -c1fde3a2ae63f264607d2636fd7a941bd69ada4a data/create/advancements/recipes/create.palettes/polished_cut_granite_from_granite_stonecutting.json -02f95a7c77a6f3fb4c0e9dee5e2b0a1ed29c6829 data/create/advancements/recipes/create.palettes/polished_cut_granite_from_stone_types_granite_stonecutting.json -b2996c37a3c275fa660efacb5dec09018186ed0d data/create/advancements/recipes/create.palettes/polished_cut_granite_slab.json -fbeb3b9dfc033b5a42015ba3e7d86efd64e3540e data/create/advancements/recipes/create.palettes/polished_cut_granite_slab_from_granite_stonecutting.json -5443afc05d1b2ddf40529b464b4dc1c23f842c08 data/create/advancements/recipes/create.palettes/polished_cut_granite_slab_from_stone_types_granite_stonecutting.json -10fd18e20c3fb1ceeab330dbf31e26955529e828 data/create/advancements/recipes/create.palettes/polished_cut_granite_slab_recycling.json -1b2dc9a3fe173206b9f1245d37c09eb38170fc3f data/create/advancements/recipes/create.palettes/polished_cut_granite_stairs.json -6ecfa15ad72f14a2bea19f46d3094d8ba9c62d42 data/create/advancements/recipes/create.palettes/polished_cut_granite_stairs_from_granite_stonecutting.json -97569ef21a72a255d19686160784867cc3432abf data/create/advancements/recipes/create.palettes/polished_cut_granite_stairs_from_stone_types_granite_stonecutting.json -8091977361291921fd9f243e12a5aa1cca86a18c data/create/advancements/recipes/create.palettes/polished_cut_granite_wall.json -5470b3e84aba29d3a7d2aa97b58ddf11bf2bd151 data/create/advancements/recipes/create.palettes/polished_cut_granite_wall_from_granite_stonecutting.json -f3bf3d42c94118089e325b665defa5d247200ff4 data/create/advancements/recipes/create.palettes/polished_cut_granite_wall_from_stone_types_granite_stonecutting.json -c96de26c50e58385cad94a78cfeb58608661772d data/create/advancements/recipes/create.palettes/polished_cut_limestone_from_limestone_stonecutting.json -9b382f040e4d2242d622d41e1e79d3968098bda3 data/create/advancements/recipes/create.palettes/polished_cut_limestone_from_stone_types_limestone_stonecutting.json -cae79fa85c4a0b5ce93bfcd6bbb5fed19bb7d949 data/create/advancements/recipes/create.palettes/polished_cut_limestone_slab.json -e032f7dd47f920cdcc92022f765b9c1cb3a226a5 data/create/advancements/recipes/create.palettes/polished_cut_limestone_slab_from_limestone_stonecutting.json -7ec1c771d5999fe790c73acd3270897c6598568a data/create/advancements/recipes/create.palettes/polished_cut_limestone_slab_from_stone_types_limestone_stonecutting.json -93355df15c9e8121be008d60999d50b51937a398 data/create/advancements/recipes/create.palettes/polished_cut_limestone_slab_recycling.json -894b1fe416b1ae96063ed2ba31705ed4ad688053 data/create/advancements/recipes/create.palettes/polished_cut_limestone_stairs.json -e0e891afe059478ecb7dc3af703f8d588415319e data/create/advancements/recipes/create.palettes/polished_cut_limestone_stairs_from_limestone_stonecutting.json -047785396cae4b06ca4adceb3fe3015c409d0ba0 data/create/advancements/recipes/create.palettes/polished_cut_limestone_stairs_from_stone_types_limestone_stonecutting.json -c58d0114ce5fff8707391bde70427fdc566da9df data/create/advancements/recipes/create.palettes/polished_cut_limestone_wall.json -04b685f0b61c0d51a5487b5dd8de637b4bf831e7 data/create/advancements/recipes/create.palettes/polished_cut_limestone_wall_from_limestone_stonecutting.json -2095b7ecf5c436fb8f74dfa36c3ffacbcf96e085 data/create/advancements/recipes/create.palettes/polished_cut_limestone_wall_from_stone_types_limestone_stonecutting.json -8b73abf2e6ee23bf4ba88403fa2c5f35d5891347 data/create/advancements/recipes/create.palettes/polished_cut_ochrum_from_ochrum_stonecutting.json -6ba244a42d0c383b21fe18a397c29622995e05dc data/create/advancements/recipes/create.palettes/polished_cut_ochrum_from_stone_types_ochrum_stonecutting.json -b2b8109f6d9fb8d029316003d0e9d74d484fe116 data/create/advancements/recipes/create.palettes/polished_cut_ochrum_slab.json -20fab23493e8cb492a8e3125c03745a8a29fd020 data/create/advancements/recipes/create.palettes/polished_cut_ochrum_slab_from_ochrum_stonecutting.json -db6dc05898baf5cceaf815640bf2ac7d2e4a0915 data/create/advancements/recipes/create.palettes/polished_cut_ochrum_slab_from_stone_types_ochrum_stonecutting.json -50a4287e0e8f76ac7f2925bdf6f7f49f3c97da38 data/create/advancements/recipes/create.palettes/polished_cut_ochrum_slab_recycling.json -8e6cf6b4f820aa723c8d1c662c67b50b4f724e63 data/create/advancements/recipes/create.palettes/polished_cut_ochrum_stairs.json -838e99e7e4f101fc55e4ed92d030a54f8e8aee46 data/create/advancements/recipes/create.palettes/polished_cut_ochrum_stairs_from_ochrum_stonecutting.json -70f9e2092b03692a8920c690795215cb29c471f3 data/create/advancements/recipes/create.palettes/polished_cut_ochrum_stairs_from_stone_types_ochrum_stonecutting.json -af0d4bbd836b87bf38a7a4117f614e4aad777b4a data/create/advancements/recipes/create.palettes/polished_cut_ochrum_wall.json -d14cf0e70d39c721df6275c18ae8a15ec34222cc data/create/advancements/recipes/create.palettes/polished_cut_ochrum_wall_from_ochrum_stonecutting.json -e4d857ced76c0b5c114bc9ee7f2c0564913e2328 data/create/advancements/recipes/create.palettes/polished_cut_ochrum_wall_from_stone_types_ochrum_stonecutting.json -fdab7e664df92355afa6cf69ddafcf3b4c7953c1 data/create/advancements/recipes/create.palettes/polished_cut_scorchia_from_scorchia_stonecutting.json -6432437da5619bc6b1e444afed630e5eed306809 data/create/advancements/recipes/create.palettes/polished_cut_scorchia_from_stone_types_scorchia_stonecutting.json -753e307037d68b9d2fdccf0c81df38e8f3d455ff data/create/advancements/recipes/create.palettes/polished_cut_scorchia_slab.json -f0b3ae066debd5cb47dbd0ba0ca10687fe85b5aa data/create/advancements/recipes/create.palettes/polished_cut_scorchia_slab_from_scorchia_stonecutting.json -abb08b61c0397fcac8da1ea1d9bc4893e34ee785 data/create/advancements/recipes/create.palettes/polished_cut_scorchia_slab_from_stone_types_scorchia_stonecutting.json -f43693ed17af0a290d4c6617e19bcbe96c45c948 data/create/advancements/recipes/create.palettes/polished_cut_scorchia_slab_recycling.json -d3336915f5107648e5cbb88faf5b9a7933544290 data/create/advancements/recipes/create.palettes/polished_cut_scorchia_stairs.json -c55240e40f9eff5b80c9c03e10145c3ee730c0cd data/create/advancements/recipes/create.palettes/polished_cut_scorchia_stairs_from_scorchia_stonecutting.json -42c1752adaad2165bdac0b9c7dad92378551afa5 data/create/advancements/recipes/create.palettes/polished_cut_scorchia_stairs_from_stone_types_scorchia_stonecutting.json -0b188fe4f974de39e0bc95455d7535a23e360da3 data/create/advancements/recipes/create.palettes/polished_cut_scorchia_wall.json -e224056d60c369e2660f80f76d18ac2805a5bc50 data/create/advancements/recipes/create.palettes/polished_cut_scorchia_wall_from_scorchia_stonecutting.json -41550259417179d27e4c4757d5d3238fad7e604c data/create/advancements/recipes/create.palettes/polished_cut_scorchia_wall_from_stone_types_scorchia_stonecutting.json -699455869dd9c5da41c75837128f8ea8869b03a9 data/create/advancements/recipes/create.palettes/polished_cut_scoria_from_scoria_stonecutting.json -7ba8670830cc9d75d9fde0b9f8755ce17a8e9ef0 data/create/advancements/recipes/create.palettes/polished_cut_scoria_from_stone_types_scoria_stonecutting.json -66703005f99a94fc6ea5116137cdd9f92587c65b data/create/advancements/recipes/create.palettes/polished_cut_scoria_slab.json -5b975acadbb183094d163d6adf86e383570a568b data/create/advancements/recipes/create.palettes/polished_cut_scoria_slab_from_scoria_stonecutting.json -845e9a421824a08cbaa1e1fc6ec5a516951aeb8b data/create/advancements/recipes/create.palettes/polished_cut_scoria_slab_from_stone_types_scoria_stonecutting.json -4eb724b4e98fdbac78cd477c81bddf311baa7be1 data/create/advancements/recipes/create.palettes/polished_cut_scoria_slab_recycling.json -78b17572dcb97167336e578884cd654e6722c736 data/create/advancements/recipes/create.palettes/polished_cut_scoria_stairs.json -a128199102f8470872df8795d447d42a6b3e3f2a data/create/advancements/recipes/create.palettes/polished_cut_scoria_stairs_from_scoria_stonecutting.json -06d4e87d154a43a1b24ef0a59f5bfd86ff1aa7fd data/create/advancements/recipes/create.palettes/polished_cut_scoria_stairs_from_stone_types_scoria_stonecutting.json -b23bfe7dec5d9d1653f80083372b09a175346c09 data/create/advancements/recipes/create.palettes/polished_cut_scoria_wall.json -44700241f1ac0dd1b89fc5f4e2e1278282905b15 data/create/advancements/recipes/create.palettes/polished_cut_scoria_wall_from_scoria_stonecutting.json -f0fdcd21fc01252a09c011c3b7b90976e5c9a13e data/create/advancements/recipes/create.palettes/polished_cut_scoria_wall_from_stone_types_scoria_stonecutting.json -0a8e730ebb689e91be2612322b75f2cb6741c278 data/create/advancements/recipes/create.palettes/polished_cut_tuff_from_stone_types_tuff_stonecutting.json -87a070369be46ec6bdd832b9cd68c91d7ce30d08 data/create/advancements/recipes/create.palettes/polished_cut_tuff_from_tuff_stonecutting.json -2167409e5ce55b3aac7459adff0c8f0d292d1ee4 data/create/advancements/recipes/create.palettes/polished_cut_tuff_slab.json -d32637133a669cfe3e79162d5b81371424c30e1a data/create/advancements/recipes/create.palettes/polished_cut_tuff_slab_from_stone_types_tuff_stonecutting.json -25047a59d37af5ac03a653a78e281f2018ddd59c data/create/advancements/recipes/create.palettes/polished_cut_tuff_slab_from_tuff_stonecutting.json -3a0ac46378189ad7a277404c1b8cf8531d4a1af9 data/create/advancements/recipes/create.palettes/polished_cut_tuff_slab_recycling.json -f1b33402a22f88b3800c13937c5ca5d520100c61 data/create/advancements/recipes/create.palettes/polished_cut_tuff_stairs.json -83f06b5a4df8123f030636d63e593ee3e707c9e6 data/create/advancements/recipes/create.palettes/polished_cut_tuff_stairs_from_stone_types_tuff_stonecutting.json -78ebd52a223e6487f4cce74d1ba989b3a8d9593e data/create/advancements/recipes/create.palettes/polished_cut_tuff_stairs_from_tuff_stonecutting.json -1d26b42d8c61dbb217d6ad556c7834c539d516f3 data/create/advancements/recipes/create.palettes/polished_cut_tuff_wall.json -8eebf6f7e1b35b2450c1cdb359f945afe938842d data/create/advancements/recipes/create.palettes/polished_cut_tuff_wall_from_stone_types_tuff_stonecutting.json -4fbd528e080da120b653cacaca3a0f31bc01966e data/create/advancements/recipes/create.palettes/polished_cut_tuff_wall_from_tuff_stonecutting.json -dd96bad1261056a3dc85daa14a86ae35c3359ebc data/create/advancements/recipes/create.palettes/polished_cut_veridium_from_stone_types_veridium_stonecutting.json -f2c6750f75781a820b2336e6bdf4306d843fb367 data/create/advancements/recipes/create.palettes/polished_cut_veridium_from_veridium_stonecutting.json -2c41806191b7fa295626ebff3f730c57e7548366 data/create/advancements/recipes/create.palettes/polished_cut_veridium_slab.json -40dee410400577705156205da0283210f316df73 data/create/advancements/recipes/create.palettes/polished_cut_veridium_slab_from_stone_types_veridium_stonecutting.json -5d8d8bdedad5c1e1c9f1eb433907b96994647293 data/create/advancements/recipes/create.palettes/polished_cut_veridium_slab_from_veridium_stonecutting.json -0f5ede2179f6111df2ab5b122992e0ed3b07cc12 data/create/advancements/recipes/create.palettes/polished_cut_veridium_slab_recycling.json -d3c67a4faf93190e1de2cc3a45ceff05b566f143 data/create/advancements/recipes/create.palettes/polished_cut_veridium_stairs.json -f9654753495f21ebc977577bd68b48f9342d28eb data/create/advancements/recipes/create.palettes/polished_cut_veridium_stairs_from_stone_types_veridium_stonecutting.json -9aeefc092662b2e70ae5f31f87ea8b08e1e44e91 data/create/advancements/recipes/create.palettes/polished_cut_veridium_stairs_from_veridium_stonecutting.json -cddfc113bdeb65b6c3b6c03464f8c1b58184a03a data/create/advancements/recipes/create.palettes/polished_cut_veridium_wall.json -3fba2f3cbf33e52859936c79dbe35889e1feca9f data/create/advancements/recipes/create.palettes/polished_cut_veridium_wall_from_stone_types_veridium_stonecutting.json -7530647e53e597277c53f774a48482322b4950e0 data/create/advancements/recipes/create.palettes/polished_cut_veridium_wall_from_veridium_stonecutting.json -4436c573f6c2f8f2e3b5de43e405e832546e04e0 data/create/advancements/recipes/create.palettes/scorchia_pillar_from_scorchia_stonecutting.json -3b5e6ce9528b42d64c0250a09ed4e0e3d4102f31 data/create/advancements/recipes/create.palettes/scorchia_pillar_from_stone_types_scorchia_stonecutting.json -a18f7ceb32cf98586d8ddd6e1df329d2a6b1a65d data/create/advancements/recipes/create.palettes/scoria_pillar_from_scoria_stonecutting.json -0bbd23987408b918e3e5766c61cb39ac59dbd544 data/create/advancements/recipes/create.palettes/scoria_pillar_from_stone_types_scoria_stonecutting.json -300cacc3afa69c36c6b1391381270dba70187acc data/create/advancements/recipes/create.palettes/small_andesite_brick_slab.json -de4845cc4b4f437b24c98b7a15a8b7c5786402e0 data/create/advancements/recipes/create.palettes/small_andesite_brick_slab_from_andesite_stonecutting.json -d6c0a0785c9008027f7f63068df1e82dfee732f6 data/create/advancements/recipes/create.palettes/small_andesite_brick_slab_from_stone_types_andesite_stonecutting.json -afd51e720e7779ab3238d73ef18f377758f02945 data/create/advancements/recipes/create.palettes/small_andesite_brick_slab_recycling.json -96c29ddb61670374f4cf766f9c6d64c97a931d87 data/create/advancements/recipes/create.palettes/small_andesite_brick_stairs.json -dc92752a2bd894fcdaef6749b1b99ba89fe6d2bd data/create/advancements/recipes/create.palettes/small_andesite_brick_stairs_from_andesite_stonecutting.json -827f8ef1514d72e8312e0a9024eadd2e7f326d37 data/create/advancements/recipes/create.palettes/small_andesite_brick_stairs_from_stone_types_andesite_stonecutting.json -73f91c7b0977aee86db964dfa06482ead7d34d59 data/create/advancements/recipes/create.palettes/small_andesite_brick_wall.json -8c7303cbf6fd0725d020eeb19dde94b4184f3f14 data/create/advancements/recipes/create.palettes/small_andesite_brick_wall_from_andesite_stonecutting.json -17932fec4f5f86c474950dd2b5ea5b55448d0e52 data/create/advancements/recipes/create.palettes/small_andesite_brick_wall_from_stone_types_andesite_stonecutting.json -6435a60dc0a4ef7f404203a8cf8f648fbdb34ffc data/create/advancements/recipes/create.palettes/small_andesite_bricks_from_andesite_stonecutting.json -9318600c5c8ef54223304f64a165c6bc2f7156fa data/create/advancements/recipes/create.palettes/small_andesite_bricks_from_stone_types_andesite_stonecutting.json -4f14581c6b4a2c239be0bef509da8411d9ef8e26 data/create/advancements/recipes/create.palettes/small_asurine_brick_slab.json -6745e4ebb518ad80091556cbf32b973992e19b6c data/create/advancements/recipes/create.palettes/small_asurine_brick_slab_from_asurine_stonecutting.json -16273c6c2cb763447d19c12e99479d4315745ed7 data/create/advancements/recipes/create.palettes/small_asurine_brick_slab_from_stone_types_asurine_stonecutting.json -6892bde03d8a34708bd8765f757f71ec0d4e49fa data/create/advancements/recipes/create.palettes/small_asurine_brick_slab_recycling.json -37ba73538f245171593ac0a904b6bccf6d8bb2ef data/create/advancements/recipes/create.palettes/small_asurine_brick_stairs.json -2b97cf57bbb3ea62960106ba7cbaf9c56bbd315b data/create/advancements/recipes/create.palettes/small_asurine_brick_stairs_from_asurine_stonecutting.json -31427a313d87a0ed3c5834a1a268fc09c9d58d54 data/create/advancements/recipes/create.palettes/small_asurine_brick_stairs_from_stone_types_asurine_stonecutting.json -033cb0012b30bf16337c19cde62ed1e10315e6f3 data/create/advancements/recipes/create.palettes/small_asurine_brick_wall.json -54f142325e10921e7b3ebeace53ed15d1079c32a data/create/advancements/recipes/create.palettes/small_asurine_brick_wall_from_asurine_stonecutting.json -fcb103d6bb39b7143488d0579e033df829816d56 data/create/advancements/recipes/create.palettes/small_asurine_brick_wall_from_stone_types_asurine_stonecutting.json -b0735c0b0728d71ea71cc0fc3d683fb31b261334 data/create/advancements/recipes/create.palettes/small_asurine_bricks_from_asurine_stonecutting.json -6b946dfe1474d04e07583143eda6ff7300fb2e1c data/create/advancements/recipes/create.palettes/small_asurine_bricks_from_stone_types_asurine_stonecutting.json -5f374ed58d180ec77574fca1876eb7b2cbdb3a41 data/create/advancements/recipes/create.palettes/small_calcite_brick_slab.json -a24fddfe8d820ef1be9363f0fc9f2c09a70fc14c data/create/advancements/recipes/create.palettes/small_calcite_brick_slab_from_calcite_stonecutting.json -a145e089e956de4784fd72ade7b38c857a89a12a data/create/advancements/recipes/create.palettes/small_calcite_brick_slab_from_stone_types_calcite_stonecutting.json -cd69414cae0aeac920b8d2ee564a937e7a010bc0 data/create/advancements/recipes/create.palettes/small_calcite_brick_slab_recycling.json -ea5be41090edbe664014b9c524484e031b928694 data/create/advancements/recipes/create.palettes/small_calcite_brick_stairs.json -ced939524a59cfbad011466d0e8753ae64540ac6 data/create/advancements/recipes/create.palettes/small_calcite_brick_stairs_from_calcite_stonecutting.json -21379acdf4151f44e13cd655554e4656477940ee data/create/advancements/recipes/create.palettes/small_calcite_brick_stairs_from_stone_types_calcite_stonecutting.json -60223eee91b2700c398dce8cd591e7cd87c10894 data/create/advancements/recipes/create.palettes/small_calcite_brick_wall.json -e16ef0a5f3f17ec00cdea70b13b82c18c5da4509 data/create/advancements/recipes/create.palettes/small_calcite_brick_wall_from_calcite_stonecutting.json -deaa1726d8abb3ca45138f8e2df80ee7f9d9c7f9 data/create/advancements/recipes/create.palettes/small_calcite_brick_wall_from_stone_types_calcite_stonecutting.json -d064e0898e77e15b872e7443a1ca2fc7d681f5af data/create/advancements/recipes/create.palettes/small_calcite_bricks_from_calcite_stonecutting.json -e32092ab21903a55160f18963f541d08bda8cadf data/create/advancements/recipes/create.palettes/small_calcite_bricks_from_stone_types_calcite_stonecutting.json -5a072dcdeb8110b8a9d168e375ef1a640d969c97 data/create/advancements/recipes/create.palettes/small_crimsite_brick_slab.json -b679037ec984a118274ce6960c4c6f45620426d9 data/create/advancements/recipes/create.palettes/small_crimsite_brick_slab_from_crimsite_stonecutting.json -d392a5d566c1068fdcb249e6d9e716a6f4a94d20 data/create/advancements/recipes/create.palettes/small_crimsite_brick_slab_from_stone_types_crimsite_stonecutting.json -4d69e7036a2634920ef70e8011cc0608bde1eca1 data/create/advancements/recipes/create.palettes/small_crimsite_brick_slab_recycling.json -9d136af48f43718fc26652e5d8916fbde25e8701 data/create/advancements/recipes/create.palettes/small_crimsite_brick_stairs.json -ee72409dbfeee185e67c13ade6e32f458c531ed1 data/create/advancements/recipes/create.palettes/small_crimsite_brick_stairs_from_crimsite_stonecutting.json -e80548fd94390467a8905f22a25998342246d9fa data/create/advancements/recipes/create.palettes/small_crimsite_brick_stairs_from_stone_types_crimsite_stonecutting.json -79d090f6779afdd6d9d67a745398ac249d832ff6 data/create/advancements/recipes/create.palettes/small_crimsite_brick_wall.json -80dd89a2ededa556394892c116f1cc7685e83910 data/create/advancements/recipes/create.palettes/small_crimsite_brick_wall_from_crimsite_stonecutting.json -d3971d31714ce7f275b9a443c5dd866f6b801894 data/create/advancements/recipes/create.palettes/small_crimsite_brick_wall_from_stone_types_crimsite_stonecutting.json -712a112040f7ac193ba189b4a8628f2d13da3bc9 data/create/advancements/recipes/create.palettes/small_crimsite_bricks_from_crimsite_stonecutting.json -29784f85f09d61f787325b2f5e74ebfd00dda19f data/create/advancements/recipes/create.palettes/small_crimsite_bricks_from_stone_types_crimsite_stonecutting.json -1b8c01d276baafa9a191755a6fd6ce7cb801d457 data/create/advancements/recipes/create.palettes/small_deepslate_brick_slab.json -16fcc4339bbbbd0d1cd17c2e3b62750d08fa7fec data/create/advancements/recipes/create.palettes/small_deepslate_brick_slab_from_deepslate_stonecutting.json -2ed38cbe7c1d40b35dd6cb37afd88547ae16e9a4 data/create/advancements/recipes/create.palettes/small_deepslate_brick_slab_from_stone_types_deepslate_stonecutting.json -70e7e03e53c2216a260b72c9ea09b23b4de067d4 data/create/advancements/recipes/create.palettes/small_deepslate_brick_slab_recycling.json -43eb80bfac7fa5f472a99351271f4dc3f4aeab07 data/create/advancements/recipes/create.palettes/small_deepslate_brick_stairs.json -8bc70944652d1e77f4c72112ea0f1b2e254e081b data/create/advancements/recipes/create.palettes/small_deepslate_brick_stairs_from_deepslate_stonecutting.json -83f7dad65ad4ea3bd94be6044befa01702fbb353 data/create/advancements/recipes/create.palettes/small_deepslate_brick_stairs_from_stone_types_deepslate_stonecutting.json -2dcffd52b1f7944785ba99152bb03560e0129376 data/create/advancements/recipes/create.palettes/small_deepslate_brick_wall.json -229e5fd0e8d134f77a6ffc82df399d74ee945609 data/create/advancements/recipes/create.palettes/small_deepslate_brick_wall_from_deepslate_stonecutting.json -4f6383db36710be1c631906f55db5bb1ad218a06 data/create/advancements/recipes/create.palettes/small_deepslate_brick_wall_from_stone_types_deepslate_stonecutting.json -82034fa5341a792b44b57da0fb93da5afd5203a2 data/create/advancements/recipes/create.palettes/small_deepslate_bricks_from_deepslate_stonecutting.json -16495dbb600f4211928fed061ed4c47572838fa5 data/create/advancements/recipes/create.palettes/small_deepslate_bricks_from_stone_types_deepslate_stonecutting.json -c0f83424aec4cbadf07ef0badea726ce29e0167a data/create/advancements/recipes/create.palettes/small_diorite_brick_slab.json -02d7f9a8205eebbe40557f3846a4685cdcc03021 data/create/advancements/recipes/create.palettes/small_diorite_brick_slab_from_diorite_stonecutting.json -668c9cfd9894ae917aab4b7844dfb2fe76602f41 data/create/advancements/recipes/create.palettes/small_diorite_brick_slab_from_stone_types_diorite_stonecutting.json -3267f2eeffef0339d3b13e67dc090786d28914d5 data/create/advancements/recipes/create.palettes/small_diorite_brick_slab_recycling.json -a83a561c5f0bf3987c55cebc95a55d57534d9e84 data/create/advancements/recipes/create.palettes/small_diorite_brick_stairs.json -4b67330f1267b11fea38b0d01d394724f4009ba6 data/create/advancements/recipes/create.palettes/small_diorite_brick_stairs_from_diorite_stonecutting.json -4960ed2fa02a1f9b7db3d1c67f46c05a149deaf9 data/create/advancements/recipes/create.palettes/small_diorite_brick_stairs_from_stone_types_diorite_stonecutting.json -effd3e58e297d221b34b4c8e8a75de4270fee267 data/create/advancements/recipes/create.palettes/small_diorite_brick_wall.json -be04f12a749038ec48af9894e764dcc11d518290 data/create/advancements/recipes/create.palettes/small_diorite_brick_wall_from_diorite_stonecutting.json -a7bf592296f090230c24ac943f116ae278550ffa data/create/advancements/recipes/create.palettes/small_diorite_brick_wall_from_stone_types_diorite_stonecutting.json -2518f2c946f826c8a05fec1e2059b40ce37fba53 data/create/advancements/recipes/create.palettes/small_diorite_bricks_from_diorite_stonecutting.json -1f25dfce9a68ea2bbb7da6434b434cf00b61665f data/create/advancements/recipes/create.palettes/small_diorite_bricks_from_stone_types_diorite_stonecutting.json -35c8fb272097f6213ded13d27c5d02e6015065aa data/create/advancements/recipes/create.palettes/small_dripstone_brick_slab.json -1ac0f3a17716627ff5e05d35cd24bd5938a257d8 data/create/advancements/recipes/create.palettes/small_dripstone_brick_slab_from_dripstone_block_stonecutting.json -87c04f24bc2f25f3e143f10def190801c29e6fd7 data/create/advancements/recipes/create.palettes/small_dripstone_brick_slab_from_stone_types_dripstone_stonecutting.json -e3d2179ca50b41efe35aa03bfd61e559a7d5630c data/create/advancements/recipes/create.palettes/small_dripstone_brick_slab_recycling.json -37d7a1be30004d7ccdfec25d33c7d74b21d4febf data/create/advancements/recipes/create.palettes/small_dripstone_brick_stairs.json -2d0e980957e0b87aad7c16ec07eb953c0c129c42 data/create/advancements/recipes/create.palettes/small_dripstone_brick_stairs_from_dripstone_block_stonecutting.json -93bead666003e19d05b8d3b0807c5d8301f551d3 data/create/advancements/recipes/create.palettes/small_dripstone_brick_stairs_from_stone_types_dripstone_stonecutting.json -3427010fbad93888b0ae0587f823fea9a7f452b3 data/create/advancements/recipes/create.palettes/small_dripstone_brick_wall.json -ef1fffab529415aecedd0cd18156928498134885 data/create/advancements/recipes/create.palettes/small_dripstone_brick_wall_from_dripstone_block_stonecutting.json -010e881452348a399b97d17bf6fcf5295b972338 data/create/advancements/recipes/create.palettes/small_dripstone_brick_wall_from_stone_types_dripstone_stonecutting.json -e3c0b46ec5d1641764688c1b8cf59b68b2e567e6 data/create/advancements/recipes/create.palettes/small_dripstone_bricks_from_dripstone_block_stonecutting.json -0a97ad6d3c486f53f63db57614ec3a02e4ca4a39 data/create/advancements/recipes/create.palettes/small_dripstone_bricks_from_stone_types_dripstone_stonecutting.json -3620b5cae44dcd9ec9677a5fba350927fb9ba947 data/create/advancements/recipes/create.palettes/small_granite_brick_slab.json -9529ed99ecc43c45c852ab06dd36dfeccb6b9cc4 data/create/advancements/recipes/create.palettes/small_granite_brick_slab_from_granite_stonecutting.json -e416f759a2f8906a091ab1c3774c41ee02c75aea data/create/advancements/recipes/create.palettes/small_granite_brick_slab_from_stone_types_granite_stonecutting.json -4e76602a927f8dcc5c26e9012d4b3a2ee5fb91a3 data/create/advancements/recipes/create.palettes/small_granite_brick_slab_recycling.json -274c73f6ab4df8b657c1eee190701764d544ad17 data/create/advancements/recipes/create.palettes/small_granite_brick_stairs.json -e9297f7257a1c1b6290b56a619f3c41498908132 data/create/advancements/recipes/create.palettes/small_granite_brick_stairs_from_granite_stonecutting.json -f502f9f45f1ddb1b9671bfa83d0e72e28d0137ad data/create/advancements/recipes/create.palettes/small_granite_brick_stairs_from_stone_types_granite_stonecutting.json -4c5144c09f531780cb5c483ff8478c0ebbefe066 data/create/advancements/recipes/create.palettes/small_granite_brick_wall.json -0c270bb2fbd33e3c7ec884ed3ac8c117cf6c4828 data/create/advancements/recipes/create.palettes/small_granite_brick_wall_from_granite_stonecutting.json -e701e3364b5510a0ae07ab4eb337271a7422d8a3 data/create/advancements/recipes/create.palettes/small_granite_brick_wall_from_stone_types_granite_stonecutting.json -f574aeb1a2cb7e3a161f4b06094ce2c3122ab76f data/create/advancements/recipes/create.palettes/small_granite_bricks_from_granite_stonecutting.json -31ca38c6d4b37dcc184e138a40711f9739ebc0e3 data/create/advancements/recipes/create.palettes/small_granite_bricks_from_stone_types_granite_stonecutting.json -fc5e47a6b92409624b4524ebfa7112752125a53a data/create/advancements/recipes/create.palettes/small_limestone_brick_slab.json -782790a0adc91304d2a825554c6e96a67c2a1d38 data/create/advancements/recipes/create.palettes/small_limestone_brick_slab_from_limestone_stonecutting.json -1ccde69d64ad3c55a4cdf16b1046c37696f215d5 data/create/advancements/recipes/create.palettes/small_limestone_brick_slab_from_stone_types_limestone_stonecutting.json -1eaeac979c42614cb9a08c44a5de3b07d15b72dc data/create/advancements/recipes/create.palettes/small_limestone_brick_slab_recycling.json -70942e63057e406ed162c0d0d8e6de1b70ddeeb0 data/create/advancements/recipes/create.palettes/small_limestone_brick_stairs.json -0fa64aeea56fdedcd9c13e4f6d601f15492df446 data/create/advancements/recipes/create.palettes/small_limestone_brick_stairs_from_limestone_stonecutting.json -e62535e212b37ed1f7b078ccd7d351debe5961f7 data/create/advancements/recipes/create.palettes/small_limestone_brick_stairs_from_stone_types_limestone_stonecutting.json -f47fe8dff9d7c2f19e4237a6a50f15d62c496c33 data/create/advancements/recipes/create.palettes/small_limestone_brick_wall.json -8d75fa20565fa1441b25ca8798e2067e165e657b data/create/advancements/recipes/create.palettes/small_limestone_brick_wall_from_limestone_stonecutting.json -2ac7e83b39b31b51b65694830f86d87d0306a275 data/create/advancements/recipes/create.palettes/small_limestone_brick_wall_from_stone_types_limestone_stonecutting.json -c00c6d4f1073b90ca92175720dc10a0c11985a9f data/create/advancements/recipes/create.palettes/small_limestone_bricks_from_limestone_stonecutting.json -40d9f7b6cf7f667c6b103112cb1332a7b0b6fd90 data/create/advancements/recipes/create.palettes/small_limestone_bricks_from_stone_types_limestone_stonecutting.json -79e9f47906ce74614f3b864a7e58b64f322999b8 data/create/advancements/recipes/create.palettes/small_ochrum_brick_slab.json -7765cf2ad88cf892c4ddf4e3de0a3de797db680a data/create/advancements/recipes/create.palettes/small_ochrum_brick_slab_from_ochrum_stonecutting.json -ebb3c89e517fb251883614048eba4f69a2928e52 data/create/advancements/recipes/create.palettes/small_ochrum_brick_slab_from_stone_types_ochrum_stonecutting.json -e81cb716f08131530ecde01bef626ef160deb504 data/create/advancements/recipes/create.palettes/small_ochrum_brick_slab_recycling.json -368fffcbf70709aaee394fc5b1e39c7ee7c3e5e9 data/create/advancements/recipes/create.palettes/small_ochrum_brick_stairs.json -2371b8195b3b02581221345be41a212dfb11656e data/create/advancements/recipes/create.palettes/small_ochrum_brick_stairs_from_ochrum_stonecutting.json -4dd2775d21b085db35c798e2e402b3bc8e55a977 data/create/advancements/recipes/create.palettes/small_ochrum_brick_stairs_from_stone_types_ochrum_stonecutting.json -fc5c86d935760cd49916773ca9b3625dabfac841 data/create/advancements/recipes/create.palettes/small_ochrum_brick_wall.json -8654f40c78c65ff2069c434562f7929aa4e2d293 data/create/advancements/recipes/create.palettes/small_ochrum_brick_wall_from_ochrum_stonecutting.json -5f9a53d974c34dd146a4bba599349608be0bca07 data/create/advancements/recipes/create.palettes/small_ochrum_brick_wall_from_stone_types_ochrum_stonecutting.json -6eaba6b9654bd90c42fe4cde9de3cc4e59f4dd91 data/create/advancements/recipes/create.palettes/small_ochrum_bricks_from_ochrum_stonecutting.json -c7c4893d0f539dfb37a68752c8d5334bdab47eef data/create/advancements/recipes/create.palettes/small_ochrum_bricks_from_stone_types_ochrum_stonecutting.json -ece579c71a88be47b633e8c5dd3b4bf37aa459cf data/create/advancements/recipes/create.palettes/small_scorchia_brick_slab.json -cb37044471b3cb8f264ed078ce68069d5fae92ce data/create/advancements/recipes/create.palettes/small_scorchia_brick_slab_from_scorchia_stonecutting.json -1d3911ee4791cd4610e21eb56d64f3b0ad80f68a data/create/advancements/recipes/create.palettes/small_scorchia_brick_slab_from_stone_types_scorchia_stonecutting.json -e6037926126e8dd8ee7ad66a8b8ff8ae30ee9598 data/create/advancements/recipes/create.palettes/small_scorchia_brick_slab_recycling.json -7f3b331d41710ef046f0568b98ab9909187d24f8 data/create/advancements/recipes/create.palettes/small_scorchia_brick_stairs.json -73963827986a441ed2e48933b6a3f4f7abd1364b data/create/advancements/recipes/create.palettes/small_scorchia_brick_stairs_from_scorchia_stonecutting.json -dfdfae1211103dba882347f03a391854a1b777ed data/create/advancements/recipes/create.palettes/small_scorchia_brick_stairs_from_stone_types_scorchia_stonecutting.json -9f67f1e196c4d8a79e4d2f9c89b9474b8d2296c1 data/create/advancements/recipes/create.palettes/small_scorchia_brick_wall.json -f893900560b9d181e4cd3b5d5d64d2714cc18fe1 data/create/advancements/recipes/create.palettes/small_scorchia_brick_wall_from_scorchia_stonecutting.json -b116bc5e471d41e923301c2b2e5e98eed3a321cb data/create/advancements/recipes/create.palettes/small_scorchia_brick_wall_from_stone_types_scorchia_stonecutting.json -915ecd3d436c13b2a99c511d6d9344e29513b7e9 data/create/advancements/recipes/create.palettes/small_scorchia_bricks_from_scorchia_stonecutting.json -e974bed81b41e70dbb0843f578a36743e35b32ca data/create/advancements/recipes/create.palettes/small_scorchia_bricks_from_stone_types_scorchia_stonecutting.json -cba080ab3f583bef645b4352582bd20bdbe9c689 data/create/advancements/recipes/create.palettes/small_scoria_brick_slab.json -ab2c50c139e30a4bb81656f4e0b6a2a9db597766 data/create/advancements/recipes/create.palettes/small_scoria_brick_slab_from_scoria_stonecutting.json -6a776f133e41ec78bce1b8977926aee34be9cec0 data/create/advancements/recipes/create.palettes/small_scoria_brick_slab_from_stone_types_scoria_stonecutting.json -14fd4673916e285a52be589d1f3896caaad1aad1 data/create/advancements/recipes/create.palettes/small_scoria_brick_slab_recycling.json -5c5bf5ba99284116306fe1b2ebcd097af6c0339d data/create/advancements/recipes/create.palettes/small_scoria_brick_stairs.json -20958ea6e3d2b2381d173550b9944e47762451ac data/create/advancements/recipes/create.palettes/small_scoria_brick_stairs_from_scoria_stonecutting.json -8798a719383020f0676abb75a21e865f22dc6aac data/create/advancements/recipes/create.palettes/small_scoria_brick_stairs_from_stone_types_scoria_stonecutting.json -a3d9e134156633a36b2cc8b7b726db04bf3128e1 data/create/advancements/recipes/create.palettes/small_scoria_brick_wall.json -ac660bb4d4361b211e15469cb35a3e1a3a6f8e66 data/create/advancements/recipes/create.palettes/small_scoria_brick_wall_from_scoria_stonecutting.json -aee085608b2783338d237de097ecb8d56232c70b data/create/advancements/recipes/create.palettes/small_scoria_brick_wall_from_stone_types_scoria_stonecutting.json -05dfab0a1ea49c27d1340915615f13040d25b224 data/create/advancements/recipes/create.palettes/small_scoria_bricks_from_scoria_stonecutting.json -96aa8101f2898c511344038f4147d671964d8e6b data/create/advancements/recipes/create.palettes/small_scoria_bricks_from_stone_types_scoria_stonecutting.json -695fd912be2dd851f1fd88a1d5da705fe31bbbd8 data/create/advancements/recipes/create.palettes/small_tuff_brick_slab.json -3b0d147ae4fdd29a269566653cf72e8ccb89924f data/create/advancements/recipes/create.palettes/small_tuff_brick_slab_from_stone_types_tuff_stonecutting.json -22beafb48ff7e62e325909cb5b0f024a0db78ea0 data/create/advancements/recipes/create.palettes/small_tuff_brick_slab_from_tuff_stonecutting.json -702409b115a333852c109ee1ea3d1171f9a92aed data/create/advancements/recipes/create.palettes/small_tuff_brick_slab_recycling.json -6ad25f61bcdca8666ebda2ac545879d2378f2ff5 data/create/advancements/recipes/create.palettes/small_tuff_brick_stairs.json -13548e5be1ad4fa16ee4ebec8e92e957ee5bbb35 data/create/advancements/recipes/create.palettes/small_tuff_brick_stairs_from_stone_types_tuff_stonecutting.json -15f69e65317572dd4711f6138c6d300aa61f4bef data/create/advancements/recipes/create.palettes/small_tuff_brick_stairs_from_tuff_stonecutting.json -64e070de55266a5baeab104b0038e2ad2213de57 data/create/advancements/recipes/create.palettes/small_tuff_brick_wall.json -d2025c2ff16fde9e894dc1233e082cf41a0d5746 data/create/advancements/recipes/create.palettes/small_tuff_brick_wall_from_stone_types_tuff_stonecutting.json -1c6dbeab80771e4443f4e525fdb10f9c6aa37a34 data/create/advancements/recipes/create.palettes/small_tuff_brick_wall_from_tuff_stonecutting.json -0fa4de5ac062d18f6da7e2b3479f98538179b3ea data/create/advancements/recipes/create.palettes/small_tuff_bricks_from_stone_types_tuff_stonecutting.json -b9f7672130294d582d0b7e42d586b2a374cd84dd data/create/advancements/recipes/create.palettes/small_tuff_bricks_from_tuff_stonecutting.json -c1d651c71e069591a84f82528739ab85fbd0aab5 data/create/advancements/recipes/create.palettes/small_veridium_brick_slab.json -ae1b0c860e09f6ea133e907347438e66fcc70546 data/create/advancements/recipes/create.palettes/small_veridium_brick_slab_from_stone_types_veridium_stonecutting.json -f82f070d9847f22cbc214d21b2e395cf07959302 data/create/advancements/recipes/create.palettes/small_veridium_brick_slab_from_veridium_stonecutting.json -1bf0e0949679bac7ae08750db6ebcc4249532f13 data/create/advancements/recipes/create.palettes/small_veridium_brick_slab_recycling.json -2b6385e8818dc1dd49b4a548a02f7fa1835a0c69 data/create/advancements/recipes/create.palettes/small_veridium_brick_stairs.json -11c34ab4c7870be987179b2234aa16950e75ef43 data/create/advancements/recipes/create.palettes/small_veridium_brick_stairs_from_stone_types_veridium_stonecutting.json -97b26042e85c3567b849041f099fbbeabe4f481f data/create/advancements/recipes/create.palettes/small_veridium_brick_stairs_from_veridium_stonecutting.json -4d7784260f803a5b1e613f9b21fccb03caf60d89 data/create/advancements/recipes/create.palettes/small_veridium_brick_wall.json -80a9aa2619cd4cffca4508babeb19fbc0a286f2a data/create/advancements/recipes/create.palettes/small_veridium_brick_wall_from_stone_types_veridium_stonecutting.json -2011c91886e942a9da7a2bd9de5a29f25e650cba data/create/advancements/recipes/create.palettes/small_veridium_brick_wall_from_veridium_stonecutting.json -754de16cc88c011ac1d4e2694f360275ac033055 data/create/advancements/recipes/create.palettes/small_veridium_bricks_from_stone_types_veridium_stonecutting.json -4fa09ae6e4836eb7455a09192a632106834322f4 data/create/advancements/recipes/create.palettes/small_veridium_bricks_from_veridium_stonecutting.json -4550af183202b037472e0c36fdcebbee634f9dde data/create/advancements/recipes/create.palettes/smelting/scoria.json -de4224f7b90c28fe5e9c96fc0b4cfc96f7210849 data/create/advancements/recipes/create.palettes/spruce_window.json -01c22ed9ded738f86839904914be9d45152509a7 data/create/advancements/recipes/create.palettes/spruce_window_pane.json -ab0cacba05f8def9cc91b993d464c297babf6fc3 data/create/advancements/recipes/create.palettes/tiled_glass_from_glass_colorless_stonecutting.json -2ba583f7c01b6f9f3f66e12d338ecd596d726538 data/create/advancements/recipes/create.palettes/tiled_glass_pane.json -5cdb738efecdd51938c1a83b2fc0c65feb732b69 data/create/advancements/recipes/create.palettes/tuff_pillar_from_stone_types_tuff_stonecutting.json -b620a4db35a7f02adf97ed03afd39910feb38eb5 data/create/advancements/recipes/create.palettes/tuff_pillar_from_tuff_stonecutting.json -024648eadff0dfd43354f194b035251fe61718d0 data/create/advancements/recipes/create.palettes/veridium_pillar_from_stone_types_veridium_stonecutting.json -ff8a4ea4ad4e56379f4dfc78909b669c72702680 data/create/advancements/recipes/create.palettes/veridium_pillar_from_veridium_stonecutting.json -24fafe59013a3e0439a73ea4e0cef114fc9a8e4b data/create/advancements/recipes/create.palettes/vertical_framed_glass_from_glass_colorless_stonecutting.json -8f719c087e4344de4cb57e06f10ebd49850f17b5 data/create/advancements/recipes/create.palettes/vertical_framed_glass_pane.json -7211458c5fb7116de2e789252da01b08820ec207 data/create/advancements/recipes/create.palettes/warped_window.json -cce0482d2f60d11478bb73c778e157744899b7d3 data/create/advancements/recipes/create.palettes/warped_window_pane.json 340b7f0161ec9513273c90f28bf4c7edc18f3c7f data/create/advancements/recipes/decorations/smelting/glass_pane_from_framed_glass_pane.json 6cf30c17433f545140d247414b6d211b904a63be data/create/advancements/recipes/decorations/smelting/glass_pane_from_horizontal_framed_glass_pane.json d759d42813afa08afa27fdc6b986ad89b735be4a data/create/advancements/recipes/decorations/smelting/glass_pane_from_tiled_glass_pane.json diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index a0116afcb1..fe87b57c66 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -886,6 +886,8 @@ "create.menu.report_bugs": "Report Issues", "create.menu.support": "Support Us", + "create.ponder.mod_name": "Create", + "create.recipe.crushing": "Crushing", "create.recipe.milling": "Milling", "create.recipe.fan_washing": "Bulk Washing", @@ -2051,30 +2053,10 @@ "_": "->------------------------] Ponder Content [------------------------<-", - "create.ponder.hold_to_ponder": "Hold [%1$s] to Ponder", - "create.ponder.subject": "Subject of this scene", - "create.ponder.pondering": "Pondering about...", - "create.ponder.identify_mode": "Identify mode active.\nUnpause with [%1$s]", - "create.ponder.associated": "Associated Entries", - "create.ponder.close": "Close", - "create.ponder.identify": "Identify", - "create.ponder.next": "Next Scene", - "create.ponder.next_up": "Up Next:", - "create.ponder.previous": "Previous Scene", - "create.ponder.replay": "Replay", - "create.ponder.think_back": "Think Back", - "create.ponder.slow_text": "Comfy Reading", - "create.ponder.exit": "Exit", - "create.ponder.welcome": "Welcome to Ponder", - "create.ponder.categories": "Available Categories in Create", - "create.ponder.index_description": "Click one of the icons to learn about its associated Items and Blocks", - "create.ponder.index_title": "Ponder Index", "create.ponder.shared.rpm16": "16 RPM", "create.ponder.shared.behaviour_modify_wrench": "This behaviour can be modified using a Wrench", "create.ponder.shared.storage_on_contraption": "Inventories attached to the Contraption will pick up their drops automatically", - "create.ponder.shared.sneak_and": "Sneak +", "create.ponder.shared.rpm8": "8 RPM", - "create.ponder.shared.ctrl_and": "Ctrl +", "create.ponder.shared.rpm32": "32 RPM", "create.ponder.shared.rpm16_source": "Source: 16 RPM", "create.ponder.shared.movement_anchors": "With the help of Super Glue, larger structures can be moved.", diff --git a/src/generated/resources/assets/create/lang/unfinished/de_de.json b/src/generated/resources/assets/create/lang/unfinished/de_de.json index 20c2183745..9752fe1945 100644 --- a/src/generated/resources/assets/create/lang/unfinished/de_de.json +++ b/src/generated/resources/assets/create/lang/unfinished/de_de.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1330", + "_": "Missing Localizations: 1311", "_": "->------------------------] Game Elements [------------------------<-", @@ -887,6 +887,8 @@ "create.menu.report_bugs": "Fehler melden", "create.menu.support": "Unterstütze uns", + "create.ponder.mod_name": "UNLOCALIZED: Create", + "create.recipe.crushing": "Mahlen (Mahlwerk)", "create.recipe.milling": "Mahlen (Mahlstein)", "create.recipe.fan_washing": "Sammelwaschen", @@ -2052,30 +2054,10 @@ "_": "->------------------------] Ponder Content [------------------------<-", - "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", - "create.ponder.subject": "UNLOCALIZED: Subject of this scene", - "create.ponder.pondering": "UNLOCALIZED: Pondering about...", - "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", - "create.ponder.associated": "UNLOCALIZED: Associated Entries", - "create.ponder.close": "UNLOCALIZED: Close", - "create.ponder.identify": "UNLOCALIZED: Identify", - "create.ponder.next": "UNLOCALIZED: Next Scene", - "create.ponder.next_up": "UNLOCALIZED: Up Next:", - "create.ponder.previous": "UNLOCALIZED: Previous Scene", - "create.ponder.replay": "UNLOCALIZED: Replay", - "create.ponder.think_back": "UNLOCALIZED: Think Back", - "create.ponder.slow_text": "UNLOCALIZED: Comfy Reading", - "create.ponder.exit": "UNLOCALIZED: Exit", - "create.ponder.welcome": "UNLOCALIZED: Welcome to Ponder", - "create.ponder.categories": "UNLOCALIZED: Available Categories in Create", - "create.ponder.index_description": "UNLOCALIZED: Click one of the icons to learn about its associated Items and Blocks", - "create.ponder.index_title": "UNLOCALIZED: Ponder Index", "create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM", "create.ponder.shared.behaviour_modify_wrench": "UNLOCALIZED: This behaviour can be modified using a Wrench", "create.ponder.shared.storage_on_contraption": "UNLOCALIZED: Inventories attached to the Contraption will pick up their drops automatically", - "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM", - "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", "create.ponder.shared.rpm32": "UNLOCALIZED: 32 RPM", "create.ponder.shared.rpm16_source": "UNLOCALIZED: Source: 16 RPM", "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Super Glue, larger structures can be moved.", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_cl.json b/src/generated/resources/assets/create/lang/unfinished/es_cl.json index ca13510479..9f3e1b8e34 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_cl.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_cl.json @@ -887,6 +887,8 @@ "create.menu.report_bugs": "Reportar Problemas", "create.menu.support": "Apóyanos", + "create.ponder.mod_name": "UNLOCALIZED: Create", + "create.recipe.crushing": "Triturando", "create.recipe.milling": "Moliendo", "create.recipe.fan_washing": "Lavando", @@ -2052,30 +2054,10 @@ "_": "->------------------------] Ponder Content [------------------------<-", - "create.ponder.hold_to_ponder": ">Mantén [%1$s] para reflexionar", - "create.ponder.subject": "Sujeto de esta escena", - "create.ponder.pondering": "Reflexionando sobre...", - "create.ponder.identify_mode": "Modo de identificación activado.\nDespausa con [%1$s]", - "create.ponder.associated": "Entradas asociadas", - "create.ponder.close": "Cerrar", - "create.ponder.identify": "Identificar", - "create.ponder.next": "Siguiente Escena", - "create.ponder.next_up": "UNLOCALIZED: Up Next:", - "create.ponder.previous": "Escena Previa", - "create.ponder.replay": "Reiniciar", - "create.ponder.think_back": "Pensar Atrás", - "create.ponder.slow_text": "Lectura Cómoda", - "create.ponder.exit": "Salir", - "create.ponder.welcome": "Bienvenido a Reflexionar", - "create.ponder.categories": "Categorías Disponibles en Create", - "create.ponder.index_description": "Haz clic en uno de los iconos para conocer sus elementos y bloques asociados", - "create.ponder.index_title": "Índice de Reflexión", "create.ponder.shared.rpm16": "16 RPM", "create.ponder.shared.behaviour_modify_wrench": "Este comportamiento se puede modificar con una llave inglesa", "create.ponder.shared.storage_on_contraption": "Los inventarios adjuntos a la contrapción recogerán los objetos automáticamente", - "create.ponder.shared.sneak_and": "Agáchate +", "create.ponder.shared.rpm8": "8 RPM", - "create.ponder.shared.ctrl_and": "Ctrl +", "create.ponder.shared.rpm32": "32 RPM", "create.ponder.shared.rpm16_source": "Fuente: 16 RPM", "create.ponder.shared.movement_anchors": "Con la ayuda de Chasis o La Gotita, se pueden mover estructuras más grandes.", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_es.json b/src/generated/resources/assets/create/lang/unfinished/es_es.json index fb4a2413d2..332e36d7e8 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_es.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_es.json @@ -887,6 +887,8 @@ "create.menu.report_bugs": "Reportar problemas", "create.menu.support": "Apóyenos", + "create.ponder.mod_name": "UNLOCALIZED: Create", + "create.recipe.crushing": "Trituración", "create.recipe.milling": "Fresado", "create.recipe.fan_washing": "Lavado a granel", @@ -2052,30 +2054,10 @@ "_": "->------------------------] Ponder Content [------------------------<-", - "create.ponder.hold_to_ponder": "Mantén [%1$s] para considerar", - "create.ponder.subject": "Tema de esta escena", - "create.ponder.pondering": "Considerando sobre...", - "create.ponder.identify_mode": "Identificando modo activo.\nDespausea con [%1$s]", - "create.ponder.associated": "Entradas asociadas", - "create.ponder.close": "Cerrar", - "create.ponder.identify": "Identificar", - "create.ponder.next": "Escena siguiente", - "create.ponder.next_up": "UNLOCALIZED: Up Next:", - "create.ponder.previous": "Escena previa", - "create.ponder.replay": "Repetición", - "create.ponder.think_back": "Volver atrás", - "create.ponder.slow_text": "Lectura cómoda", - "create.ponder.exit": "Salir", - "create.ponder.welcome": "Bienvenido al instructivo de Create", - "create.ponder.categories": "Categorías disponibles", - "create.ponder.index_description": "Haga clic en uno de los iconos para conocer sus objetos y bloques asociados", - "create.ponder.index_title": "Índice", "create.ponder.shared.rpm16": "16 RPM", "create.ponder.shared.behaviour_modify_wrench": "Este comportamiento puede modificarse mediante una llave inglesa", "create.ponder.shared.storage_on_contraption": "Los inventarios unidos a un artefacto animado recogerán sus producciones automáticamente", - "create.ponder.shared.sneak_and": "Mayús izdo. +", "create.ponder.shared.rpm8": "8 RPM", - "create.ponder.shared.ctrl_and": "Ctrl +", "create.ponder.shared.rpm32": "32 RPM", "create.ponder.shared.rpm16_source": "Fuente: 16 RPM", "create.ponder.shared.movement_anchors": "Con la ayuda de un chasis o pegamento, se pueden mover estructuras más grandes.", diff --git a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json index ee1c3f6765..308008e1eb 100644 --- a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json +++ b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 2131", + "_": "Missing Localizations: 2112", "_": "->------------------------] Game Elements [------------------------<-", @@ -887,6 +887,8 @@ "create.menu.report_bugs": "UNLOCALIZED: Report Issues", "create.menu.support": "UNLOCALIZED: Support Us", + "create.ponder.mod_name": "UNLOCALIZED: Create", + "create.recipe.crushing": "Ecrasement", "create.recipe.milling": "Mouture", "create.recipe.fan_washing": "Lavage", @@ -2052,30 +2054,10 @@ "_": "->------------------------] Ponder Content [------------------------<-", - "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", - "create.ponder.subject": "UNLOCALIZED: Subject of this scene", - "create.ponder.pondering": "UNLOCALIZED: Pondering about...", - "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", - "create.ponder.associated": "UNLOCALIZED: Associated Entries", - "create.ponder.close": "UNLOCALIZED: Close", - "create.ponder.identify": "UNLOCALIZED: Identify", - "create.ponder.next": "UNLOCALIZED: Next Scene", - "create.ponder.next_up": "UNLOCALIZED: Up Next:", - "create.ponder.previous": "UNLOCALIZED: Previous Scene", - "create.ponder.replay": "UNLOCALIZED: Replay", - "create.ponder.think_back": "UNLOCALIZED: Think Back", - "create.ponder.slow_text": "UNLOCALIZED: Comfy Reading", - "create.ponder.exit": "UNLOCALIZED: Exit", - "create.ponder.welcome": "UNLOCALIZED: Welcome to Ponder", - "create.ponder.categories": "UNLOCALIZED: Available Categories in Create", - "create.ponder.index_description": "UNLOCALIZED: Click one of the icons to learn about its associated Items and Blocks", - "create.ponder.index_title": "UNLOCALIZED: Ponder Index", "create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM", "create.ponder.shared.behaviour_modify_wrench": "UNLOCALIZED: This behaviour can be modified using a Wrench", "create.ponder.shared.storage_on_contraption": "UNLOCALIZED: Inventories attached to the Contraption will pick up their drops automatically", - "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM", - "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", "create.ponder.shared.rpm32": "UNLOCALIZED: 32 RPM", "create.ponder.shared.rpm16_source": "UNLOCALIZED: Source: 16 RPM", "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Super Glue, larger structures can be moved.", diff --git a/src/generated/resources/assets/create/lang/unfinished/it_it.json b/src/generated/resources/assets/create/lang/unfinished/it_it.json index 626ff0dd52..736b93af52 100644 --- a/src/generated/resources/assets/create/lang/unfinished/it_it.json +++ b/src/generated/resources/assets/create/lang/unfinished/it_it.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1902", + "_": "Missing Localizations: 1883", "_": "->------------------------] Game Elements [------------------------<-", @@ -887,6 +887,8 @@ "create.menu.report_bugs": "UNLOCALIZED: Report Issues", "create.menu.support": "UNLOCALIZED: Support Us", + "create.ponder.mod_name": "UNLOCALIZED: Create", + "create.recipe.crushing": "Frantumazione", "create.recipe.milling": "Macinatura", "create.recipe.fan_washing": "Lavaggio volumetrico", @@ -2052,30 +2054,10 @@ "_": "->------------------------] Ponder Content [------------------------<-", - "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", - "create.ponder.subject": "UNLOCALIZED: Subject of this scene", - "create.ponder.pondering": "UNLOCALIZED: Pondering about...", - "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", - "create.ponder.associated": "UNLOCALIZED: Associated Entries", - "create.ponder.close": "UNLOCALIZED: Close", - "create.ponder.identify": "UNLOCALIZED: Identify", - "create.ponder.next": "UNLOCALIZED: Next Scene", - "create.ponder.next_up": "UNLOCALIZED: Up Next:", - "create.ponder.previous": "UNLOCALIZED: Previous Scene", - "create.ponder.replay": "UNLOCALIZED: Replay", - "create.ponder.think_back": "UNLOCALIZED: Think Back", - "create.ponder.slow_text": "UNLOCALIZED: Comfy Reading", - "create.ponder.exit": "UNLOCALIZED: Exit", - "create.ponder.welcome": "UNLOCALIZED: Welcome to Ponder", - "create.ponder.categories": "UNLOCALIZED: Available Categories in Create", - "create.ponder.index_description": "UNLOCALIZED: Click one of the icons to learn about its associated Items and Blocks", - "create.ponder.index_title": "UNLOCALIZED: Ponder Index", "create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM", "create.ponder.shared.behaviour_modify_wrench": "UNLOCALIZED: This behaviour can be modified using a Wrench", "create.ponder.shared.storage_on_contraption": "UNLOCALIZED: Inventories attached to the Contraption will pick up their drops automatically", - "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM", - "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", "create.ponder.shared.rpm32": "UNLOCALIZED: 32 RPM", "create.ponder.shared.rpm16_source": "UNLOCALIZED: Source: 16 RPM", "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Super Glue, larger structures can be moved.", diff --git a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json index 12107c8c91..0c12651ae9 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json +++ b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json @@ -887,6 +887,8 @@ "create.menu.report_bugs": "バグ報告", "create.menu.support": "私たちを応援する", + "create.ponder.mod_name": "UNLOCALIZED: Create", + "create.recipe.crushing": "粉砕", "create.recipe.milling": "製粉", "create.recipe.fan_washing": "一括洗浄", @@ -2052,30 +2054,10 @@ "_": "->------------------------] Ponder Content [------------------------<-", - "create.ponder.hold_to_ponder": "[%1$s] を長押しして思案画面を開く", - "create.ponder.subject": "このシーンの主題", - "create.ponder.pondering": "思案中...", - "create.ponder.identify_mode": "確認モードになっています.\n [%1$s] で一時停止を解除", - "create.ponder.associated": "関連項目", - "create.ponder.close": "閉じる", - "create.ponder.identify": "ブロック名を確認", - "create.ponder.next": "次のシーン", - "create.ponder.next_up": "UNLOCALIZED: Up Next:", - "create.ponder.previous": "前のシーン", - "create.ponder.replay": "最初から", - "create.ponder.think_back": "戻る", - "create.ponder.slow_text": "熟考(スロー再生)", - "create.ponder.exit": "終了", - "create.ponder.welcome": "思案画面へようこそ", - "create.ponder.categories": "Createで閲覧できるカテゴリ", - "create.ponder.index_description": "アイテムをクリックすると、関連するアイテムやブロックの情報が表示されます。", - "create.ponder.index_title": "思案索引", "create.ponder.shared.rpm16": "16 RPM", "create.ponder.shared.behaviour_modify_wrench": "この挙動はレンチを使って変更できます", "create.ponder.shared.storage_on_contraption": "構造物中の収納ブロックは自動的にドロップを拾います", - "create.ponder.shared.sneak_and": "スニーク +", "create.ponder.shared.rpm8": "8 RPM", - "create.ponder.shared.ctrl_and": "Ctrl +", "create.ponder.shared.rpm32": "32 RPM", "create.ponder.shared.rpm16_source": "動力源: 16 RPM", "create.ponder.shared.movement_anchors": "シャーシや超粘着剤を使えば大きな構造物も動かせます", diff --git a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json index ce10bb8010..dfb166eae5 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json +++ b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json @@ -887,6 +887,8 @@ "create.menu.report_bugs": "버그 제보하기", "create.menu.support": "후원하기", + "create.ponder.mod_name": "UNLOCALIZED: Create", + "create.recipe.crushing": "분쇄", "create.recipe.milling": "제분", "create.recipe.fan_washing": "세척", @@ -2052,30 +2054,10 @@ "_": "->------------------------] Ponder Content [------------------------<-", - "create.ponder.hold_to_ponder": "[%1$s]키를 눌러 분석하기", - "create.ponder.subject": "분석의 주제", - "create.ponder.pondering": "분석 중입니다...", - "create.ponder.identify_mode": "탐색모드가 활성화되어 있습니다. \n[%1$s]를 눌러 중지합니다.", - "create.ponder.associated": "연관된 항목들", - "create.ponder.close": "닫기", - "create.ponder.identify": "탐색", - "create.ponder.next": "다음 장면", - "create.ponder.next_up": "UNLOCALIZED: Up Next:", - "create.ponder.previous": "이전 장면", - "create.ponder.replay": "다시 재생", - "create.ponder.think_back": "되돌아가기", - "create.ponder.slow_text": "편하게 읽기", - "create.ponder.exit": "나가기", - "create.ponder.welcome": "분석 메뉴에 어서오세요", - "create.ponder.categories": "Create에서 둘러볼 수 있는 목록들", - "create.ponder.index_description": "아이콘을 클릭해 관련 아이템과 블록에 대해 알아볼 수 있습니다.", - "create.ponder.index_title": "분석 메뉴 제목", "create.ponder.shared.rpm16": "16 RPM", "create.ponder.shared.behaviour_modify_wrench": "이 기능은 렌치를 이용해 변경할 수 있습니다.", "create.ponder.shared.storage_on_contraption": "구조물에 부착된 보관함은 구조물이 떨어뜨린 아이템을 자동으로 줍습니다.", - "create.ponder.shared.sneak_and": "웅크리기 +", "create.ponder.shared.rpm8": "8 RPM", - "create.ponder.shared.ctrl_and": "Ctrl +", "create.ponder.shared.rpm32": "32 RPM", "create.ponder.shared.rpm16_source": "기본 속도: 16 RPM", "create.ponder.shared.movement_anchors": "섀시나 강력 접착제를 이용해 큰 구조물도 옮길 수 있습니다.", diff --git a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json index 573e6a3f58..70f330436f 100644 --- a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json +++ b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 2479", + "_": "Missing Localizations: 2460", "_": "->------------------------] Game Elements [------------------------<-", @@ -887,6 +887,8 @@ "create.menu.report_bugs": "UNLOCALIZED: Report Issues", "create.menu.support": "UNLOCALIZED: Support Us", + "create.ponder.mod_name": "UNLOCALIZED: Create", + "create.recipe.crushing": "Verpulveren", "create.recipe.milling": "UNLOCALIZED: Milling", "create.recipe.fan_washing": "UNLOCALIZED: Bulk Washing", @@ -2052,30 +2054,10 @@ "_": "->------------------------] Ponder Content [------------------------<-", - "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", - "create.ponder.subject": "UNLOCALIZED: Subject of this scene", - "create.ponder.pondering": "UNLOCALIZED: Pondering about...", - "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", - "create.ponder.associated": "UNLOCALIZED: Associated Entries", - "create.ponder.close": "UNLOCALIZED: Close", - "create.ponder.identify": "UNLOCALIZED: Identify", - "create.ponder.next": "UNLOCALIZED: Next Scene", - "create.ponder.next_up": "UNLOCALIZED: Up Next:", - "create.ponder.previous": "UNLOCALIZED: Previous Scene", - "create.ponder.replay": "UNLOCALIZED: Replay", - "create.ponder.think_back": "UNLOCALIZED: Think Back", - "create.ponder.slow_text": "UNLOCALIZED: Comfy Reading", - "create.ponder.exit": "UNLOCALIZED: Exit", - "create.ponder.welcome": "UNLOCALIZED: Welcome to Ponder", - "create.ponder.categories": "UNLOCALIZED: Available Categories in Create", - "create.ponder.index_description": "UNLOCALIZED: Click one of the icons to learn about its associated Items and Blocks", - "create.ponder.index_title": "UNLOCALIZED: Ponder Index", "create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM", "create.ponder.shared.behaviour_modify_wrench": "UNLOCALIZED: This behaviour can be modified using a Wrench", "create.ponder.shared.storage_on_contraption": "UNLOCALIZED: Inventories attached to the Contraption will pick up their drops automatically", - "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM", - "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", "create.ponder.shared.rpm32": "UNLOCALIZED: 32 RPM", "create.ponder.shared.rpm16_source": "UNLOCALIZED: Source: 16 RPM", "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Super Glue, larger structures can be moved.", diff --git a/src/generated/resources/assets/create/lang/unfinished/pl_pl.json b/src/generated/resources/assets/create/lang/unfinished/pl_pl.json index 7e184a856c..0dfdb927c8 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pl_pl.json +++ b/src/generated/resources/assets/create/lang/unfinished/pl_pl.json @@ -887,6 +887,8 @@ "create.menu.report_bugs": "Zgłoś błąd", "create.menu.support": "Wesprzyj nas", + "create.ponder.mod_name": "UNLOCALIZED: Create", + "create.recipe.crushing": "Kruszenie", "create.recipe.milling": "Mielenie", "create.recipe.fan_washing": "Hurtowe płukanie", @@ -2052,30 +2054,10 @@ "_": "->------------------------] Ponder Content [------------------------<-", - "create.ponder.hold_to_ponder": "Przytrzymaj [%1$s], aby przeanalizować", - "create.ponder.subject": "Temat tej sceny", - "create.ponder.pondering": "Temat analizy:", - "create.ponder.identify_mode": "Tryb identyfikacji aktywny. Naciśnij [%1$s], aby wyłączyć", - "create.ponder.associated": "Powiązane hasła", - "create.ponder.close": "Zamknij", - "create.ponder.identify": "Identyfikacja", - "create.ponder.next": "Następna scena", - "create.ponder.next_up": "UNLOCALIZED: Up Next:", - "create.ponder.previous": "Poprzednia scena", - "create.ponder.replay": "Powtórka", - "create.ponder.think_back": "Powrót", - "create.ponder.slow_text": "Wygodne czytanie", - "create.ponder.exit": "Wyjście", - "create.ponder.welcome": "Witaj w menu analizowania", - "create.ponder.categories": "Dostępne kategorie w Create", - "create.ponder.index_description": "Kliknij na jedną z ikon aby dowiedzieć się informacji na temat powiązanych bloków i przedmiotów.", - "create.ponder.index_title": "Katalog analiz", "create.ponder.shared.rpm16": "16 Ob/min", "create.ponder.shared.behaviour_modify_wrench": "To zachowanie może być zmodyfikowane przy pomocy klucza", "create.ponder.shared.storage_on_contraption": "Pojemniki przyłączone do maszyny będą podnosiły przedmioty automatycznie", - "create.ponder.shared.sneak_and": "Skradanie +", "create.ponder.shared.rpm8": "8 Ob/min", - "create.ponder.shared.ctrl_and": "Ctrl +", "create.ponder.shared.rpm32": "32 Ob/min", "create.ponder.shared.rpm16_source": "Źródło: 16 Ob/min", "create.ponder.shared.movement_anchors": "Z pomocą stelaży lub Super Glue, większe struktury mogą być przesuwane.", diff --git a/src/generated/resources/assets/create/lang/unfinished/pt_br.json b/src/generated/resources/assets/create/lang/unfinished/pt_br.json index 070e9be01c..ab00232c80 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pt_br.json +++ b/src/generated/resources/assets/create/lang/unfinished/pt_br.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1513", + "_": "Missing Localizations: 1494", "_": "->------------------------] Game Elements [------------------------<-", @@ -887,6 +887,8 @@ "create.menu.report_bugs": "Informar um erro", "create.menu.support": "Suporte nós", + "create.ponder.mod_name": "UNLOCALIZED: Create", + "create.recipe.crushing": "Triturando", "create.recipe.milling": "Moendo", "create.recipe.fan_washing": "Lavagem em massa", @@ -2052,30 +2054,10 @@ "_": "->------------------------] Ponder Content [------------------------<-", - "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", - "create.ponder.subject": "UNLOCALIZED: Subject of this scene", - "create.ponder.pondering": "UNLOCALIZED: Pondering about...", - "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", - "create.ponder.associated": "UNLOCALIZED: Associated Entries", - "create.ponder.close": "UNLOCALIZED: Close", - "create.ponder.identify": "UNLOCALIZED: Identify", - "create.ponder.next": "UNLOCALIZED: Next Scene", - "create.ponder.next_up": "UNLOCALIZED: Up Next:", - "create.ponder.previous": "UNLOCALIZED: Previous Scene", - "create.ponder.replay": "UNLOCALIZED: Replay", - "create.ponder.think_back": "UNLOCALIZED: Think Back", - "create.ponder.slow_text": "UNLOCALIZED: Comfy Reading", - "create.ponder.exit": "UNLOCALIZED: Exit", - "create.ponder.welcome": "UNLOCALIZED: Welcome to Ponder", - "create.ponder.categories": "UNLOCALIZED: Available Categories in Create", - "create.ponder.index_description": "UNLOCALIZED: Click one of the icons to learn about its associated Items and Blocks", - "create.ponder.index_title": "UNLOCALIZED: Ponder Index", "create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM", "create.ponder.shared.behaviour_modify_wrench": "UNLOCALIZED: This behaviour can be modified using a Wrench", "create.ponder.shared.storage_on_contraption": "UNLOCALIZED: Inventories attached to the Contraption will pick up their drops automatically", - "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM", - "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", "create.ponder.shared.rpm32": "UNLOCALIZED: 32 RPM", "create.ponder.shared.rpm16_source": "UNLOCALIZED: Source: 16 RPM", "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Super Glue, larger structures can be moved.", diff --git a/src/generated/resources/assets/create/lang/unfinished/pt_pt.json b/src/generated/resources/assets/create/lang/unfinished/pt_pt.json index 495bcb454b..8ee42ef054 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pt_pt.json +++ b/src/generated/resources/assets/create/lang/unfinished/pt_pt.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 2188", + "_": "Missing Localizations: 2169", "_": "->------------------------] Game Elements [------------------------<-", @@ -887,6 +887,8 @@ "create.menu.report_bugs": "UNLOCALIZED: Report Issues", "create.menu.support": "UNLOCALIZED: Support Us", + "create.ponder.mod_name": "UNLOCALIZED: Create", + "create.recipe.crushing": "Moendo", "create.recipe.milling": "UNLOCALIZED: Milling", "create.recipe.fan_washing": "Lavagem em massa", @@ -2052,30 +2054,10 @@ "_": "->------------------------] Ponder Content [------------------------<-", - "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", - "create.ponder.subject": "UNLOCALIZED: Subject of this scene", - "create.ponder.pondering": "UNLOCALIZED: Pondering about...", - "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", - "create.ponder.associated": "UNLOCALIZED: Associated Entries", - "create.ponder.close": "UNLOCALIZED: Close", - "create.ponder.identify": "UNLOCALIZED: Identify", - "create.ponder.next": "UNLOCALIZED: Next Scene", - "create.ponder.next_up": "UNLOCALIZED: Up Next:", - "create.ponder.previous": "UNLOCALIZED: Previous Scene", - "create.ponder.replay": "UNLOCALIZED: Replay", - "create.ponder.think_back": "UNLOCALIZED: Think Back", - "create.ponder.slow_text": "UNLOCALIZED: Comfy Reading", - "create.ponder.exit": "UNLOCALIZED: Exit", - "create.ponder.welcome": "UNLOCALIZED: Welcome to Ponder", - "create.ponder.categories": "UNLOCALIZED: Available Categories in Create", - "create.ponder.index_description": "UNLOCALIZED: Click one of the icons to learn about its associated Items and Blocks", - "create.ponder.index_title": "UNLOCALIZED: Ponder Index", "create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM", "create.ponder.shared.behaviour_modify_wrench": "UNLOCALIZED: This behaviour can be modified using a Wrench", "create.ponder.shared.storage_on_contraption": "UNLOCALIZED: Inventories attached to the Contraption will pick up their drops automatically", - "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM", - "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", "create.ponder.shared.rpm32": "UNLOCALIZED: 32 RPM", "create.ponder.shared.rpm16_source": "UNLOCALIZED: Source: 16 RPM", "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Super Glue, larger structures can be moved.", diff --git a/src/generated/resources/assets/create/lang/unfinished/ro_ro.json b/src/generated/resources/assets/create/lang/unfinished/ro_ro.json index ca47740a94..2d35e1a03e 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ro_ro.json +++ b/src/generated/resources/assets/create/lang/unfinished/ro_ro.json @@ -887,6 +887,8 @@ "create.menu.report_bugs": "Raportează Probleme", "create.menu.support": "Susține-ne", + "create.ponder.mod_name": "UNLOCALIZED: Create", + "create.recipe.crushing": "Strivire", "create.recipe.milling": "Frezare", "create.recipe.fan_washing": "Spălare În Vrac", @@ -2052,30 +2054,10 @@ "_": "->------------------------] Ponder Content [------------------------<-", - "create.ponder.hold_to_ponder": "Ține apăsat [%1$s] pentru a Chibzui", - "create.ponder.subject": "Subiectul acestei scene", - "create.ponder.pondering": "Chibzuind despre...", - "create.ponder.identify_mode": "Mod de identificare activ.\nÎntrerupe cu [%1$s]", - "create.ponder.associated": "Intrări asociate", - "create.ponder.close": "Închide", - "create.ponder.identify": "Identifică", - "create.ponder.next": "Scena următoare", - "create.ponder.next_up": "UNLOCALIZED: Up Next:", - "create.ponder.previous": "Scena precedentă", - "create.ponder.replay": "Reia", - "create.ponder.think_back": "Gândește Înapoi", - "create.ponder.slow_text": "Citit Confortabil", - "create.ponder.exit": "Ieși", - "create.ponder.welcome": "Bine ai venit la Chibzuire", - "create.ponder.categories": "Categorii valabile în Create", - "create.ponder.index_description": "Apasă pe una dintre iconițe pentru a învăța despre Obiectele și Blocurile asociate lui", - "create.ponder.index_title": "Indecele de Chibzuire", "create.ponder.shared.rpm16": "16 RPM", "create.ponder.shared.behaviour_modify_wrench": "Acest comportament poate fi modificat folosind o Cheie", "create.ponder.shared.storage_on_contraption": "Inventarele atașate la Invenție vor strânge dropurile lor automat", - "create.ponder.shared.sneak_and": "Furișare +", "create.ponder.shared.rpm8": "8 RPM", - "create.ponder.shared.ctrl_and": "Ctrl +", "create.ponder.shared.rpm32": "32 RPM", "create.ponder.shared.rpm16_source": "Sursă: 16 RPM", "create.ponder.shared.movement_anchors": "Cu ajutorul unui Șasiu sau cu Super Glue, structuri mai mari pot fi mișcate.", diff --git a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json index a36d7059da..37becf61c8 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json +++ b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1", + "_": "Missing Localizations: 2", "_": "->------------------------] Game Elements [------------------------<-", @@ -887,6 +887,8 @@ "create.menu.report_bugs": "Нашли ошибку?", "create.menu.support": "Поддержите нас", + "create.ponder.mod_name": "UNLOCALIZED: Create", + "create.recipe.crushing": "Измельчение", "create.recipe.milling": "Помол", "create.recipe.fan_washing": "Массовая промывка", @@ -2052,30 +2054,10 @@ "_": "->------------------------] Ponder Content [------------------------<-", - "create.ponder.hold_to_ponder": "Удерживайте [%1$s] для размышления", - "create.ponder.subject": "Субъект этой сцены", - "create.ponder.pondering": "Размышляем о/об...", - "create.ponder.identify_mode": "Режим Идентификации включён.\nУбрать паузу: [%1$s]", - "create.ponder.associated": "Связанные статьи", - "create.ponder.close": "Закрыть", - "create.ponder.identify": "Определить", - "create.ponder.next": "Следующая сцена", - "create.ponder.next_up": "Дальше:", - "create.ponder.previous": "Предыдущая сцена", - "create.ponder.replay": "Воспроизвести снова", - "create.ponder.think_back": "Подумать о предыдущем", - "create.ponder.slow_text": "Удобное чтение", - "create.ponder.exit": "Выйти", - "create.ponder.welcome": "Добро пожаловать в размышления", - "create.ponder.categories": "Категории, доступные в Create", - "create.ponder.index_description": "Кликните по одной из иконок, чтобы узнать о связанных с ней предметах и блоках.", - "create.ponder.index_title": "Содержание размышлений", "create.ponder.shared.rpm16": "16 об./мин.", "create.ponder.shared.behaviour_modify_wrench": "Это поведение может быть изменено Ключом", "create.ponder.shared.storage_on_contraption": "Присоединённые к штуковине инвентари будут подбирать вещи автоматически", - "create.ponder.shared.sneak_and": "Красться +", "create.ponder.shared.rpm8": "8 об./мин.", - "create.ponder.shared.ctrl_and": "Ctrl +", "create.ponder.shared.rpm32": "32 об./мин.", "create.ponder.shared.rpm16_source": "Источник: 16 об./мин.", "create.ponder.shared.movement_anchors": "С помощью суперклея или шасси, более крупные структуры могут быть сдвинуты.", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json index 84c200c7a2..39d2c7d4ee 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json @@ -887,6 +887,8 @@ "create.menu.report_bugs": "报告问题", "create.menu.support": "支持我们", + "create.ponder.mod_name": "UNLOCALIZED: Create", + "create.recipe.crushing": "粉碎", "create.recipe.milling": "研磨", "create.recipe.fan_washing": "批量洗涤", @@ -2052,30 +2054,10 @@ "_": "->------------------------] Ponder Content [------------------------<-", - "create.ponder.hold_to_ponder": "按住 [%1$s] 开始思索", - "create.ponder.subject": "情景主题", - "create.ponder.pondering": "思索……", - "create.ponder.identify_mode": "显示方块名称已启用\n按 [%1$s] 继续思索", - "create.ponder.associated": "关联词条", - "create.ponder.close": "思索结束", - "create.ponder.identify": "显示方块名称", - "create.ponder.next": "下一情景", - "create.ponder.next_up": "UNLOCALIZED: Up Next:", - "create.ponder.previous": "上一情景", - "create.ponder.replay": "重放", - "create.ponder.think_back": "回想", - "create.ponder.slow_text": "舒适阅读", - "create.ponder.exit": "退出", - "create.ponder.welcome": "欢迎来到思索界面", - "create.ponder.categories": "机械动力中包含的条目", - "create.ponder.index_description": "点击一个图标来查看相关的物品和方块", - "create.ponder.index_title": "思索索引", "create.ponder.shared.rpm16": "16 RPM", "create.ponder.shared.behaviour_modify_wrench": "可以用扳手调整它的行为", "create.ponder.shared.storage_on_contraption": "与装置相接的容器,会自动拾取装置遇到的掉落物", - "create.ponder.shared.sneak_and": "潜行 +", "create.ponder.shared.rpm8": "8 RPM", - "create.ponder.shared.ctrl_and": "Ctrl +", "create.ponder.shared.rpm32": "32 RPM", "create.ponder.shared.rpm16_source": "动力源:16 RPM", "create.ponder.shared.movement_anchors": "有了底盘和强力胶,移动起大型结构轻轻松松", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json index b5c7bb1c53..d1fbae2081 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json @@ -887,6 +887,8 @@ "create.menu.report_bugs": "回報問題", "create.menu.support": "支持我們", + "create.ponder.mod_name": "UNLOCALIZED: Create", + "create.recipe.crushing": "粉碎", "create.recipe.milling": "研磨", "create.recipe.fan_washing": "批次洗滌", @@ -2052,30 +2054,10 @@ "_": "->------------------------] Ponder Content [------------------------<-", - "create.ponder.hold_to_ponder": "按住 [%1$s] 來查看此物品的教學", - "create.ponder.subject": "本場景的主題", - "create.ponder.pondering": "有關於...", - "create.ponder.identify_mode": "暫停模式已啟動\n按 [%1$s] 來取消暫停模式", - "create.ponder.associated": "相關物品", - "create.ponder.close": "關閉", - "create.ponder.identify": "暫停", - "create.ponder.next": "下個場景", - "create.ponder.next_up": "UNLOCALIZED: Up Next:", - "create.ponder.previous": "上個場景", - "create.ponder.replay": "重播", - "create.ponder.think_back": "返回", - "create.ponder.slow_text": "放慢文字顯示速度", - "create.ponder.exit": "離開", - "create.ponder.welcome": "歡迎來到教學", - "create.ponder.categories": "Create 中的分類", - "create.ponder.index_description": "點擊其中一個圖像查看和他相關的物品以及方塊", - "create.ponder.index_title": "教學首頁", "create.ponder.shared.rpm16": "16 RPM", "create.ponder.shared.behaviour_modify_wrench": "使用扳手來調整這個動作", "create.ponder.shared.storage_on_contraption": "與結構相連的儲物空間會自動撿取物品", - "create.ponder.shared.sneak_and": "潛行 +", "create.ponder.shared.rpm8": "8 RPM", - "create.ponder.shared.ctrl_and": "Ctrl +", "create.ponder.shared.rpm32": "32 RPM", "create.ponder.shared.rpm16_source": "轉速: 16 RPM", "create.ponder.shared.movement_anchors": "有了機殼底盤和強力膠就可以移動大型結構", diff --git a/src/main/java/com/simibubi/create/Create.java b/src/main/java/com/simibubi/create/Create.java index 481edf9aae..4b406bbc12 100644 --- a/src/main/java/com/simibubi/create/Create.java +++ b/src/main/java/com/simibubi/create/Create.java @@ -20,7 +20,6 @@ import com.simibubi.create.content.logistics.block.display.AllDisplayBehaviours; import com.simibubi.create.content.logistics.block.mechanicalArm.AllArmInteractionPointTypes; import com.simibubi.create.content.logistics.trains.GlobalRailwayManager; import com.simibubi.create.content.palettes.AllPaletteBlocks; -import com.simibubi.create.content.palettes.PalettesItemGroup; import com.simibubi.create.content.schematics.SchematicProcessor; import com.simibubi.create.content.schematics.ServerSchematicLoader; import com.simibubi.create.content.schematics.filtering.SchematicInstances; @@ -36,9 +35,11 @@ import com.simibubi.create.foundation.data.recipe.ProcessingRecipeGen; import com.simibubi.create.foundation.data.recipe.SequencedAssemblyRecipeGen; import com.simibubi.create.foundation.data.recipe.StandardRecipeGen; import com.simibubi.create.foundation.networking.AllPackets; +import com.simibubi.create.foundation.ponder.CreatePonderPlugin; import com.simibubi.create.foundation.worldgen.AllWorldFeatures; import com.tterrag.registrate.util.nullness.NonNullSupplier; +import net.createmod.ponder.foundation.PonderIndex; import net.minecraft.core.particles.ParticleType; import net.minecraft.data.DataGenerator; import net.minecraft.resources.ResourceLocation; @@ -126,7 +127,7 @@ public class Create { modEventBus.addGenericListener(DataSerializerEntry.class, AllEntityDataSerializers::register); forgeEventBus.addListener(EventPriority.HIGH, SlidingDoorBlock::stopItQuark); - + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> CreateClient.onCtorClient(modEventBus, forgeEventBus)); Mods.CURIOS.executeIfInstalled(() -> Curios::init); @@ -148,6 +149,8 @@ public class Create { } public static void gatherData(GatherDataEvent event) { + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> PonderIndex.addPlugin(new CreatePonderPlugin())); + DataGenerator gen = event.getGenerator(); gen.addProvider(new AllAdvancements(gen)); gen.addProvider(new LangMerger(gen)); diff --git a/src/main/java/com/simibubi/create/CreateClient.java b/src/main/java/com/simibubi/create/CreateClient.java index 61e4cc77ef..4e4e7691d0 100644 --- a/src/main/java/com/simibubi/create/CreateClient.java +++ b/src/main/java/com/simibubi/create/CreateClient.java @@ -1,11 +1,14 @@ package com.simibubi.create; +import com.mojang.blaze3d.platform.GlStateManager; +import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueSelectionHandler; import com.simibubi.create.content.contraptions.components.structureMovement.interaction.controls.TrainHUD; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; import com.simibubi.create.content.contraptions.components.structureMovement.render.SBBContraptionManager; import com.simibubi.create.content.contraptions.goggles.GoggleOverlayRenderer; +import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock; import com.simibubi.create.content.contraptions.relays.encased.CasingConnectivity; import com.simibubi.create.content.curiosities.armor.CopperBacktankArmorLayer; import com.simibubi.create.content.curiosities.bell.SoulPulseEffectHandler; @@ -20,20 +23,24 @@ import com.simibubi.create.content.schematics.client.SchematicAndQuillHandler; import com.simibubi.create.content.schematics.client.SchematicHandler; import com.simibubi.create.foundation.ClientResourceReloadListener; import com.simibubi.create.foundation.config.AllConfigs; +import com.simibubi.create.foundation.gui.CreateMainMenuScreen; import com.simibubi.create.foundation.ponder.CreatePonderPlugin; -import com.simibubi.create.foundation.ponder.CreateSharedPonderText; import com.simibubi.create.foundation.render.CachedPartialBuffers; import com.simibubi.create.foundation.render.CreateContexts; import com.simibubi.create.foundation.render.FlwSuperBufferFactory; import com.simibubi.create.foundation.utility.ModelSwapper; import com.simibubi.create.foundation.utility.ShippedResourcePacks; +import net.createmod.catnip.config.ui.BaseConfigScreen; +import net.createmod.catnip.config.ui.ConfigScreen; import net.createmod.catnip.render.SuperBufferFactory; import net.createmod.catnip.render.SuperByteBufferCache; import net.createmod.ponder.foundation.PonderIndex; import net.minecraft.ChatFormatting; import net.minecraft.client.GraphicsStatus; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.core.Direction; import net.minecraft.network.chat.ChatType; import net.minecraft.network.chat.ClickEvent; import net.minecraft.network.chat.ComponentUtils; @@ -72,8 +79,6 @@ public class CreateClient { ZAPPER_RENDER_HANDLER.registerListeners(forgeEventBus); POTATO_CANNON_RENDER_HANDLER.registerListeners(forgeEventBus); - - CreateSharedPonderText.loadClass(); } public static void clientInit(final FMLClientSetupEvent event) { @@ -93,6 +98,8 @@ public class CreateClient { PonderIndex.addPlugin(new CreatePonderPlugin()); + setupConfigUIBackground(); + registerOverlays(); } @@ -107,6 +114,26 @@ public class CreateClient { OverlayRegistry.registerOverlayAbove(ForgeIngameGui.HOTBAR_ELEMENT, "Create's Toolboxes", ToolboxHandlerClient.OVERLAY); } + private static void setupConfigUIBackground() { + ConfigScreen.backgrounds.put(Create.ID, (screen, ms, partialTicks) -> { + CreateMainMenuScreen.PANORAMA.render(screen.getMinecraft().getDeltaFrameTime(), 1); + + RenderSystem.setShaderTexture(0, CreateMainMenuScreen.PANORAMA_OVERLAY_TEXTURES); + RenderSystem.enableBlend(); + RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); + Screen.blit(ms, 0, 0, screen.width, screen.height, 0.0F, 0.0F, 16, 128, 16, 128); + + Screen.fill(ms, 0, 0, screen.width, screen.height, 0x90_282c34); + }); + + ConfigScreen.shadowState = AllBlocks.LARGE_COGWHEEL.getDefaultState().setValue(CogWheelBlock.AXIS, Direction.Axis.Y); + + BaseConfigScreen.setDefaultActionFor(Create.ID, base -> base + .withTitles("Client Settings", "World Generation Settings", "Gameplay Settings") + .withSpecs(AllConfigs.CLIENT.specification, AllConfigs.COMMON.specification, AllConfigs.SERVER.specification) + ); + } + public static void invalidateRenderers() { SCHEMATIC_HANDLER.updateRenderers(); ContraptionRenderDispatcher.reset(); diff --git a/src/main/java/com/simibubi/create/events/ClientEvents.java b/src/main/java/com/simibubi/create/events/ClientEvents.java index c85924e432..825c498433 100644 --- a/src/main/java/com/simibubi/create/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/events/ClientEvents.java @@ -5,7 +5,6 @@ import java.util.List; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.AllBlocks; import com.simibubi.create.AllFluids; import com.simibubi.create.AllItems; import com.simibubi.create.Create; @@ -26,7 +25,6 @@ import com.simibubi.create.content.contraptions.components.structureMovement.tra import com.simibubi.create.content.contraptions.components.turntable.TurntableHandler; import com.simibubi.create.content.contraptions.itemAssembly.SequencedAssemblyRecipe; import com.simibubi.create.content.contraptions.relays.belt.item.BeltConnectorHandler; -import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock; import com.simibubi.create.content.curiosities.armor.CopperBacktankArmorLayer; import com.simibubi.create.content.curiosities.girder.GirderWrenchBehavior; import com.simibubi.create.content.curiosities.toolbox.ToolboxHandlerClient; @@ -63,7 +61,6 @@ import com.simibubi.create.foundation.utility.CameraAngleAnimationService; import com.simibubi.create.foundation.utility.ServerSpeedProvider; import net.createmod.catnip.config.ui.BaseConfigScreen; -import net.createmod.catnip.config.ui.ConfigScreen; import net.createmod.catnip.render.DefaultSuperRenderTypeBufferImpl; import net.createmod.catnip.render.SuperRenderTypeBuffer; import net.createmod.catnip.utility.AnimationTickHolder; @@ -73,7 +70,6 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.entity.EntityRenderDispatcher; import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TextComponent; import net.minecraft.world.item.BlockItem; @@ -389,14 +385,6 @@ public class ClientEvents { createContainer.registerExtensionPoint(ConfigGuiHandler.ConfigGuiFactory.class, () -> new ConfigGuiHandler.ConfigGuiFactory( (mc, previousScreen) -> new BaseConfigScreen(previousScreen, Create.ID))); - - BaseConfigScreen.setDefaultActionFor(Create.ID, base -> base - .withTitles("Client Settings", "World Generation Settings", "Gameplay Settings") - .withSpecs(AllConfigs.CLIENT.specification, AllConfigs.COMMON.specification, AllConfigs.SERVER.specification) - ); - - ConfigScreen.shadowState = AllBlocks.LARGE_COGWHEEL.getDefaultState().setValue(CogWheelBlock.AXIS, Direction.Axis.Y); - } } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/CreatePonderPlugin.java b/src/main/java/com/simibubi/create/foundation/ponder/CreatePonderPlugin.java index fce55e4fe5..c2108e436d 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/CreatePonderPlugin.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/CreatePonderPlugin.java @@ -1,14 +1,22 @@ package com.simibubi.create.foundation.ponder; +import java.util.function.BiConsumer; import java.util.function.Predicate; import java.util.stream.Stream; +import com.simibubi.create.Create; + import net.createmod.ponder.foundation.PonderPlugin; import net.createmod.ponder.foundation.PonderWorld; import net.minecraft.world.level.ItemLike; public class CreatePonderPlugin implements PonderPlugin { + @Override + public String getModID() { + return Create.ID; + } + @Override public void registerScenes() { CreatePonderIndex.register(); @@ -19,6 +27,18 @@ public class CreatePonderPlugin implements PonderPlugin { CreatePonderIndex.registerTags(); } + @Override + public void registerSharedText(BiConsumer adder) { + adder.accept("rpm8", "8 RPM"); + adder.accept("rpm16", "16 RPM"); + adder.accept("rpm16_source", "Source: 16 RPM"); + adder.accept("rpm32", "32 RPM"); + + adder.accept("movement_anchors", "With the help of Super Glue, larger structures can be moved."); + adder.accept("behaviour_modify_wrench", "This behaviour can be modified using a Wrench"); + adder.accept("storage_on_contraption", "Inventories attached to the Contraption will pick up their drops automatically"); + } + @Override public void onPonderWorldRestore(PonderWorld world) { PonderWorldTileFix.fixControllerTiles(world); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/CreateSharedPonderText.java b/src/main/java/com/simibubi/create/foundation/ponder/CreateSharedPonderText.java deleted file mode 100644 index 23798a84d2..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/CreateSharedPonderText.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.simibubi.create.foundation.ponder; - -import java.util.function.BiConsumer; - -import com.simibubi.create.Create; - -import net.createmod.ponder.foundation.content.SharedText; - -public class CreateSharedPonderText { - - public static void loadClass() { - SharedText.registerText(Create.ID, CreateSharedPonderText::createSharedText); - } - - private static void createSharedText(BiConsumer adder) { - adder.accept("rpm8", "8 RPM"); - adder.accept("rpm16", "16 RPM"); - adder.accept("rpm16_source", "Source: 16 RPM"); - adder.accept("rpm32", "32 RPM"); - - adder.accept("movement_anchors", "With the help of Super Glue, larger structures can be moved."); - adder.accept("behaviour_modify_wrench", "This behaviour can be modified using a Wrench"); - adder.accept("storage_on_contraption", "Inventories attached to the Contraption will pick up their drops automatically"); - } - -} diff --git a/src/main/resources/assets/create/lang/default/interface.json b/src/main/resources/assets/create/lang/default/interface.json index 84cb246e42..11374baaf5 100644 --- a/src/main/resources/assets/create/lang/default/interface.json +++ b/src/main/resources/assets/create/lang/default/interface.json @@ -29,6 +29,8 @@ "create.menu.report_bugs": "Report Issues", "create.menu.support": "Support Us", + "create.ponder.mod_name": "Create", + "create.recipe.crushing": "Crushing", "create.recipe.milling": "Milling", "create.recipe.fan_washing": "Bulk Washing", From 88cc589abcd9f63b3959fc133957da7488992ca9 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Wed, 15 Mar 2023 15:51:06 +0100 Subject: [PATCH 007/515] Help, its again --- .../com/simibubi/create/AllBlockPartials.java | 5 + .../com/simibubi/create/AllEntityTypes.java | 11 + .../java/com/simibubi/create/AllItems.java | 16 + src/main/java/com/simibubi/create/Create.java | 1 + .../components/actors/SeatEntity.java | 3 + .../contraptions/relays/belt/BeltBlock.java | 32 +- .../relays/belt/BeltRenderer.java | 14 +- .../belt/transport/TransportedItemStack.java | 3 + .../block/chute/AbstractChuteBlock.java | 26 +- .../logistics/block/chute/ChuteRenderer.java | 9 +- .../logistics/block/depot/DepotBehaviour.java | 5 +- .../logistics/block/depot/DepotRenderer.java | 9 +- .../logistics/block/depot/EjectorBlock.java | 4 +- .../block/depot/EjectorRenderer.java | 19 +- .../block/depot/EjectorTileEntity.java | 3 + .../block/depot/SharedDepotBlockMethods.java | 25 +- .../logistics/block/funnel/FunnelBlock.java | 30 +- .../block/funnel/FunnelTileEntity.java | 11 +- .../item/box/PackageDestroyPacket.java | 55 +++ .../logistics/item/box/PackageEntity.java | 433 ++++++++++++++++++ .../logistics/item/box/PackageItem.java | 271 +++++++++++ .../logistics/item/box/PackageRenderer.java | 46 ++ .../foundation/data/BuilderTransformers.java | 11 + .../create/foundation/item/ItemHelper.java | 14 + .../foundation/networking/AllPackets.java | 2 + .../models/item/cardboard_package_10x12.json | 22 + .../models/item/cardboard_package_10x8.json | 22 + .../models/item/cardboard_package_12x10.json | 22 + .../models/item/cardboard_package_12x12.json | 22 + .../models/item/package_transforms.json | 26 ++ .../textures/entity/package/cardboard.png | Bin 0 -> 1401 bytes .../entity/package/cardboard_particle.png | Bin 0 -> 375 bytes 32 files changed, 1111 insertions(+), 61 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/logistics/item/box/PackageDestroyPacket.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/item/box/PackageEntity.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/item/box/PackageItem.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/item/box/PackageRenderer.java create mode 100644 src/main/resources/assets/create/models/item/cardboard_package_10x12.json create mode 100644 src/main/resources/assets/create/models/item/cardboard_package_10x8.json create mode 100644 src/main/resources/assets/create/models/item/cardboard_package_12x10.json create mode 100644 src/main/resources/assets/create/models/item/cardboard_package_12x12.json create mode 100644 src/main/resources/assets/create/models/item/package_transforms.json create mode 100644 src/main/resources/assets/create/textures/entity/package/cardboard.png create mode 100644 src/main/resources/assets/create/textures/entity/package/cardboard_particle.png diff --git a/src/main/java/com/simibubi/create/AllBlockPartials.java b/src/main/java/com/simibubi/create/AllBlockPartials.java index 90402767fc..876b2dbb65 100644 --- a/src/main/java/com/simibubi/create/AllBlockPartials.java +++ b/src/main/java/com/simibubi/create/AllBlockPartials.java @@ -12,6 +12,7 @@ import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.Lang; import net.minecraft.core.Direction; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.DyeColor; public class AllBlockPartials { @@ -176,6 +177,7 @@ public class AllBlockPartials { public static final Map METAL_GIRDER_BRACKETS = new EnumMap<>(Direction.class); public static final Map TOOLBOX_LIDS = new EnumMap<>(DyeColor.class); public static final List CONTRAPTION_CONTROLS_INDICATOR = new ArrayList<>(); + public static final Map PACKAGES = new HashMap<>(); static { for (FluidTransportBehaviour.AttachmentTypes.ComponentPartials type : FluidTransportBehaviour.AttachmentTypes.ComponentPartials.values()) { @@ -192,6 +194,9 @@ public class AllBlockPartials { METAL_GIRDER_BRACKETS.put(d, block("metal_girder/bracket_" + Lang.asId(d.name()))); for (int i = 0; i < 8; i++) CONTRAPTION_CONTROLS_INDICATOR.add(block("contraption_controls/indicator_" + i)); + for (String size : new String[] { "12x12", "10x12", "12x10", "10x8" }) + PACKAGES.put(Create.asResource("cardboard_package_" + size), + new PartialModel(new ResourceLocation(Create.ID, "item/cardboard_package_" + size))); } private static PartialModel block(String path) { diff --git a/src/main/java/com/simibubi/create/AllEntityTypes.java b/src/main/java/com/simibubi/create/AllEntityTypes.java index 1f893325f5..2ba1039237 100644 --- a/src/main/java/com/simibubi/create/AllEntityTypes.java +++ b/src/main/java/com/simibubi/create/AllEntityTypes.java @@ -13,6 +13,8 @@ import com.simibubi.create.content.curiosities.tools.BlueprintEntity; import com.simibubi.create.content.curiosities.tools.BlueprintRenderer; import com.simibubi.create.content.curiosities.weapons.PotatoProjectileEntity; import com.simibubi.create.content.curiosities.weapons.PotatoProjectileRenderer; +import com.simibubi.create.content.logistics.item.box.PackageEntity; +import com.simibubi.create.content.logistics.item.box.PackageRenderer; import com.simibubi.create.content.logistics.trains.entity.CarriageContraptionEntity; import com.simibubi.create.content.logistics.trains.entity.CarriageContraptionEntityRenderer; import com.simibubi.create.content.logistics.trains.entity.CarriageContraptionInstance; @@ -29,6 +31,7 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.EntityType.EntityFactory; import net.minecraft.world.entity.MobCategory; +import net.minecraftforge.event.entity.EntityAttributeCreationEvent; public class AllEntityTypes { @@ -58,6 +61,9 @@ public class AllEntityTypes { public static final EntityEntry SEAT = register("seat", SeatEntity::new, () -> SeatEntity.Render::new, MobCategory.MISC, 5, Integer.MAX_VALUE, false, true, SeatEntity::build).register(); + + public static final EntityEntry PACKAGE = register("package", PackageEntity::new, () -> PackageRenderer::new, + MobCategory.MISC, 10, 3, true, false, PackageEntity::build).register(); // @@ -85,6 +91,11 @@ public class AllEntityTypes { }) .renderer(renderer); } + + public static void registerEntityAttributes(EntityAttributeCreationEvent event) { + event.put(PACKAGE.get(), PackageEntity.createPackageAttributes() + .build()); + } public static void register() {} } diff --git a/src/main/java/com/simibubi/create/AllItems.java b/src/main/java/com/simibubi/create/AllItems.java index b746ce92a7..64a7d8eb02 100644 --- a/src/main/java/com/simibubi/create/AllItems.java +++ b/src/main/java/com/simibubi/create/AllItems.java @@ -50,11 +50,13 @@ import com.simibubi.create.content.curiosities.tools.SandPaperItem; import com.simibubi.create.content.curiosities.weapons.PotatoCannonItem; import com.simibubi.create.content.curiosities.zapper.terrainzapper.WorldshaperItem; import com.simibubi.create.content.logistics.item.LinkedControllerItem; +import com.simibubi.create.content.logistics.item.box.PackageItem; import com.simibubi.create.content.logistics.item.filter.FilterItem; import com.simibubi.create.content.logistics.trains.management.schedule.ScheduleItem; import com.simibubi.create.content.schematics.item.SchematicAndQuillItem; import com.simibubi.create.content.schematics.item.SchematicItem; import com.simibubi.create.foundation.data.AssetLookup; +import com.simibubi.create.foundation.data.BuilderTransformers; import com.simibubi.create.foundation.data.CreateRegistrate; import com.simibubi.create.foundation.data.recipe.CompatMetals; import com.simibubi.create.foundation.item.HiddenIngredientItem; @@ -353,6 +355,20 @@ public class AllItems { REGISTRATE.startSection(LOGISTICS); } + public static final ItemEntry CARDBOARD_PACKAGE_12x12 = + REGISTRATE.item("cardboard_package_12x12", p -> new PackageItem(p, 12, 12)) + .transform(BuilderTransformers.packageItem("cardboard", 12, 12)) + .register(), + CARDBOARD_PACKAGE_10x12 = REGISTRATE.item("cardboard_package_10x12", p -> new PackageItem(p, 10, 12)) + .transform(BuilderTransformers.packageItem("cardboard", 10, 12)) + .register(), + CARDBOARD_PACKAGE_10x8 = REGISTRATE.item("cardboard_package_10x8", p -> new PackageItem(p, 10, 8)) + .transform(BuilderTransformers.packageItem("cardboard", 10, 8)) + .register(), + CARDBOARD_PACKAGE_12x10 = REGISTRATE.item("cardboard_package_12x10", p -> new PackageItem(p, 12, 10)) + .transform(BuilderTransformers.packageItem("cardboard", 12, 10)) + .register(); + public static final ItemEntry FILTER = REGISTRATE.item("filter", FilterItem::regular) .model(AssetLookup.existingItemModel()) .register(); diff --git a/src/main/java/com/simibubi/create/Create.java b/src/main/java/com/simibubi/create/Create.java index 841ef3c248..5066676d1b 100644 --- a/src/main/java/com/simibubi/create/Create.java +++ b/src/main/java/com/simibubi/create/Create.java @@ -131,6 +131,7 @@ public class Create { CopperRegistries.inject(); modEventBus.addListener(Create::init); + modEventBus.addListener(AllEntityTypes::registerEntityAttributes); modEventBus.addListener(EventPriority.LOWEST, Create::gatherData); modEventBus.addGenericListener(SoundEvent.class, AllSoundEvents::register); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/SeatEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/SeatEntity.java index 761a6c30ba..2c8602d19b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/SeatEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/SeatEntity.java @@ -1,6 +1,7 @@ package com.simibubi.create.content.contraptions.components.actors; import com.simibubi.create.AllEntityTypes; +import com.simibubi.create.content.logistics.item.box.PackageEntity; import net.minecraft.client.renderer.culling.Frustum; import net.minecraft.client.renderer.entity.EntityRenderer; @@ -73,6 +74,8 @@ public class SeatEntity extends Entity implements IEntityAdditionalSpawnData { return 1 / 8f; if (entity instanceof Wolf) return 1 / 16f; + if (entity instanceof PackageEntity) + return 1 / 4f; return 0; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlock.java index 747699d801..2ed93d49d7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlock.java @@ -22,14 +22,18 @@ import com.simibubi.create.content.contraptions.relays.belt.transport.BeltMoveme import com.simibubi.create.content.contraptions.relays.belt.transport.BeltTunnelInteractionHandler; import com.simibubi.create.content.curiosities.armor.DivingBootsItem; import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelBlock; +import com.simibubi.create.content.logistics.item.box.PackageEntity; +import com.simibubi.create.content.logistics.item.box.PackageItem; import com.simibubi.create.content.schematics.ISpecialBlockItemRequirement; import com.simibubi.create.content.schematics.ItemRequirement; import com.simibubi.create.content.schematics.ItemRequirement.ItemUseType; import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.block.render.DestroyProgressRenderingHandler; import com.simibubi.create.foundation.block.render.ReducedDestroyEffects; +import com.simibubi.create.foundation.item.ItemHelper; import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour.TransportedResult; import com.simibubi.create.foundation.utility.Iterate; +import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.LevelRenderer; @@ -45,7 +49,6 @@ import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Mob; -import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.DyeColor; @@ -74,6 +77,7 @@ import net.minecraft.world.level.pathfinder.PathComputationType; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.HitResult; +import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.EntityCollisionContext; import net.minecraft.world.phys.shapes.Shapes; @@ -198,25 +202,26 @@ public class BeltBlock extends HorizontalKineticBlock implements ITE 0) return; - if (!entityIn.isAlive()) + Vec3 targetLocation = VecHelper.getCenterOf(pos) + .add(0, 5 / 16f, 0); + if (!PackageEntity.centerPackage(entityIn, targetLocation)) return; if (BeltTunnelInteractionHandler.getTunnelOnPosition(worldIn, pos) != null) return; withTileEntityDo(worldIn, pos, te -> { - ItemEntity itemEntity = (ItemEntity) entityIn; IItemHandler handler = te.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) .orElse(null); if (handler == null) return; - ItemStack remainder = handler.insertItem(0, itemEntity.getItem() - .copy(), false); + ItemStack remainder = handler.insertItem(0, asItem, false); if (remainder.isEmpty()) - itemEntity.discard(); + entityIn.discard(); }); return; } @@ -273,6 +278,19 @@ public class BeltBlock extends HorizontalKineticBlock implements ITE { for (int i = 0; i <= count; i++) { ms.pushPose(); - + + boolean box = transported.stack.getItem() instanceof PackageItem; ms.mulPose(Vector3f.YP.rotationDegrees(transported.angle)); if (!blockItem && !renderUpright) { ms.translate(0, -.09375, 0); ms.mulPose(Vector3f.XP.rotationDegrees(90)); } - if (blockItem) { + if (blockItem && !box) ms.translate(r.nextFloat() * .0625f * i, 0, r.nextFloat() * .0625f * i); - } - ms.scale(.5f, .5f, .5f); + if (box) { + ms.translate(0, 6 / 16f, 0); + ms.scale(2f, 2f, 2f); + } else + ms.scale(.5f, .5f, .5f); + itemRenderer.renderStatic(null, transported.stack, TransformType.FIXED, false, ms, buffer, te.getLevel(), stackLight, overlay, 0); ms.popPose(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/TransportedItemStack.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/TransportedItemStack.java index becba0f918..156d412dd7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/TransportedItemStack.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/TransportedItemStack.java @@ -4,6 +4,7 @@ import java.util.Random; import com.simibubi.create.content.contraptions.processing.InWorldProcessing; import com.simibubi.create.content.contraptions.relays.belt.BeltHelper; +import com.simibubi.create.content.logistics.item.box.PackageItem; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; @@ -32,6 +33,8 @@ public class TransportedItemStack implements Comparable { this.stack = stack; boolean centered = BeltHelper.isItemUpright(stack); angle = centered ? 180 : R.nextInt(360); + if (stack.getItem() instanceof PackageItem) + angle = 180 + R.nextInt(10); sideOffset = prevSideOffset = getTargetSideOffset(); insertedFrom = Direction.UP; } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/chute/AbstractChuteBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/chute/AbstractChuteBlock.java index 9bf371d8c5..bf8bbfa9ae 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/chute/AbstractChuteBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/chute/AbstractChuteBlock.java @@ -5,13 +5,16 @@ import java.util.function.Consumer; import javax.annotation.Nullable; import com.simibubi.create.content.contraptions.wrench.IWrenchable; +import com.simibubi.create.content.logistics.item.box.PackageEntity; import com.simibubi.create.foundation.advancement.AdvancementBehaviour; import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.block.render.ReducedDestroyEffects; +import com.simibubi.create.foundation.item.ItemHelper; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; import com.simibubi.create.foundation.utility.Iterate; +import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -84,27 +87,26 @@ public abstract class AbstractChuteBlock extends Block implements IWrenchable, I @Override public void updateEntityAfterFallOn(BlockGetter worldIn, Entity entityIn) { super.updateEntityAfterFallOn(worldIn, entityIn); - if (!(entityIn instanceof ItemEntity)) + ItemStack stack = ItemHelper.fromItemEntity(entityIn); + if (stack.isEmpty()) return; if (entityIn.level.isClientSide) return; - if (!entityIn.isAlive()) - return; - DirectBeltInputBehaviour input = TileEntityBehaviour.get(entityIn.level, new BlockPos(entityIn.position() - .add(0, 0.5f, 0)).below(), DirectBeltInputBehaviour.TYPE); + BlockPos pos = new BlockPos(entityIn.position() + .add(0, 0.5f, 0)).below(); + DirectBeltInputBehaviour input = TileEntityBehaviour.get(entityIn.level, pos, DirectBeltInputBehaviour.TYPE); if (input == null) return; if (!input.canInsertFromSide(Direction.UP)) return; - ItemEntity itemEntity = (ItemEntity) entityIn; - ItemStack toInsert = itemEntity.getItem(); - ItemStack remainder = input.handleInsertion(toInsert, Direction.UP, false); - + if (!PackageEntity.centerPackage(entityIn, VecHelper.getCenterOf(pos))) + return; + ItemStack remainder = input.handleInsertion(stack, Direction.UP, false); if (remainder.isEmpty()) - itemEntity.discard(); - if (remainder.getCount() < toInsert.getCount()) - itemEntity.setItem(remainder); + entityIn.discard(); + else if (remainder.getCount() < stack.getCount() && entityIn instanceof ItemEntity) + ((ItemEntity) entityIn).setItem(remainder); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteRenderer.java index 169d45a91e..81b2c4171b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteRenderer.java @@ -3,6 +3,7 @@ package com.simibubi.create.content.logistics.block.chute; import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.content.logistics.block.chute.ChuteBlock.Shape; +import com.simibubi.create.content.logistics.item.box.PackageItem; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import net.minecraft.client.Minecraft; @@ -43,8 +44,12 @@ public class ChuteRenderer extends SafeTileEntityRenderer { float itemPosition = te.itemPosition.getValue(partialTicks); ms.translate(0, -.5 + itemPosition, 0); ms.scale(itemScale, itemScale, itemScale); - msr.rotateX(itemPosition * 180); - msr.rotateY(itemPosition * 180); + if (te.item.getItem() instanceof PackageItem) { + ms.scale(3, 3, 3); + } else { + msr.rotateX(itemPosition * 180); + msr.rotateY(itemPosition * 180); + } itemRenderer.renderStatic(te.item, TransformType.FIXED, light, overlay, ms, buffer, 0); ms.popPose(); } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotBehaviour.java index 84a16e8d52..528ec349ee 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotBehaviour.java @@ -254,8 +254,9 @@ public class DepotBehaviour extends TileEntityBehaviour { int cumulativeStackSize = getPresentStackSize(); for (TransportedItemStack transportedItemStack : incoming) cumulativeStackSize += transportedItemStack.stack.getCount(); - int fromGetter = maxStackSize.get(); - return (fromGetter == 0 ? 64 : fromGetter) - cumulativeStackSize; + int fromGetter = + Math.min(maxStackSize.get() == 0 ? 64 : maxStackSize.get(), getHeldItemStack().getMaxStackSize()); + return (fromGetter) - cumulativeStackSize; } public ItemStack insert(TransportedItemStack heldItem, boolean simulate) { diff --git a/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotRenderer.java index 9822137571..d014adc4ce 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotRenderer.java @@ -7,6 +7,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Vector3f; import com.simibubi.create.content.contraptions.relays.belt.BeltHelper; import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; +import com.simibubi.create.content.logistics.item.box.PackageItem; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.VecHelper; @@ -126,7 +127,13 @@ public class DepotRenderer extends SafeTileEntityRenderer { ms.pushPose(); if (blockItem) ms.translate(r.nextFloat() * .0625f * i, 0, r.nextFloat() * .0625f * i); - ms.scale(.5f, .5f, .5f); + + if (itemStack.getItem() instanceof PackageItem) { + ms.translate(0, 6/16f, 0); + ms.scale(2f, 2f, 2f); + } else + ms.scale(.5f, .5f, .5f); + if (!blockItem && !renderUpright) { ms.translate(0, -3 / 16f, 0); msr.rotateX(90); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorBlock.java index 875d6462cb..f4b6d7c7fc 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/depot/EjectorBlock.java @@ -9,6 +9,7 @@ import com.simibubi.create.AllTileEntities; import com.simibubi.create.content.contraptions.base.HorizontalKineticBlock; import com.simibubi.create.content.logistics.block.depot.EjectorTileEntity.State; import com.simibubi.create.foundation.block.ITE; +import com.simibubi.create.foundation.item.ItemHelper; import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.utility.VecHelper; @@ -19,7 +20,6 @@ import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; @@ -79,7 +79,7 @@ public class EjectorBlock extends HorizontalKineticBlock implements ITE builder) { super.createBlockStateDefinition(builder.add(EXTRACTING)); } - + @Override public void setPlacedBy(Level pLevel, BlockPos pPos, BlockState pState, LivingEntity pPlacer, ItemStack pStack) { super.setPlacedBy(pLevel, pPos, pState, pPlacer, pStack); @@ -106,31 +108,31 @@ public abstract class FunnelBlock extends AbstractDirectionalFunnelBlock { public void entityInside(BlockState state, Level worldIn, BlockPos pos, Entity entityIn) { if (worldIn.isClientSide) return; - if (!(entityIn instanceof ItemEntity)) + ItemStack stack = ItemHelper.fromItemEntity(entityIn); + if (stack.isEmpty()) return; if (!canInsertIntoFunnel(state)) return; - if (!entityIn.isAlive()) - return; - ItemEntity itemEntity = (ItemEntity) entityIn; Direction direction = getFunnelFacing(state); + Vec3 openPos = VecHelper.getCenterOf(pos) + .add(Vec3.atLowerCornerOf(direction.getNormal()) + .scale(-.25f)); Vec3 diff = entityIn.position() - .subtract(VecHelper.getCenterOf(pos) - .add(Vec3.atLowerCornerOf(direction.getNormal()) - .scale(-.325f))); + .subtract(openPos); double projectedDiff = direction.getAxis() .choose(diff.x, diff.y, diff.z); if (projectedDiff < 0 == (direction.getAxisDirection() == AxisDirection.POSITIVE)) return; + float yOffset = direction == Direction.UP ? 0.075f : direction == Direction.DOWN ? -0.5f : -0.5f; + if (!PackageEntity.centerPackage(entityIn, openPos.add(0, yOffset, 0))) + return; - ItemStack toInsert = itemEntity.getItem(); - ItemStack remainder = tryInsert(worldIn, pos, toInsert, false); - + ItemStack remainder = tryInsert(worldIn, pos, stack, false); if (remainder.isEmpty()) - itemEntity.discard(); - if (remainder.getCount() < toInsert.getCount()) - itemEntity.setItem(remainder); + entityIn.discard(); + if (remainder.getCount() < stack.getCount() && entityIn instanceof ItemEntity) + ((ItemEntity) entityIn).setItem(remainder); } protected boolean canInsertIntoFunnel(BlockState state) { diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java index b48342493f..bfc03c4a50 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java @@ -11,6 +11,7 @@ import com.simibubi.create.content.contraptions.relays.belt.BeltHelper; import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; import com.simibubi.create.content.logistics.block.funnel.BeltFunnelBlock.Shape; +import com.simibubi.create.content.logistics.item.box.PackageEntity; import com.simibubi.create.content.logistics.packet.FunnelFlapPacket; import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.config.AllConfigs; @@ -28,6 +29,7 @@ import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntityType; @@ -44,7 +46,7 @@ public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringIn private InvManipulationBehaviour invManipulation; private int extractionCooldown; - private WeakReference lastObserved; // In-world Extractors only + private WeakReference lastObserved; // In-world Extractors only LerpedFloat flap; @@ -123,7 +125,7 @@ public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringIn if (lastObserved == null) { trackingEntityPresent = false; } else { - ItemEntity lastEntity = lastObserved.get(); + Entity lastEntity = lastObserved.get(); if (lastEntity == null || !lastEntity.isAlive() || !lastEntity.getBoundingBox() .intersects(area)) { trackingEntityPresent = false; @@ -140,8 +142,9 @@ public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringIn .extract(amountToExtract); if (stack.isEmpty()) return; - for (ItemEntity itemEntity : level.getEntitiesOfClass(ItemEntity.class, area)) { - lastObserved = new WeakReference<>(itemEntity); + for (Entity entity : level.getEntities(null, area)) { + if (entity instanceof ItemEntity || entity instanceof PackageEntity) + lastObserved = new WeakReference<>(entity); return; } diff --git a/src/main/java/com/simibubi/create/content/logistics/item/box/PackageDestroyPacket.java b/src/main/java/com/simibubi/create/content/logistics/item/box/PackageDestroyPacket.java new file mode 100644 index 0000000000..9c22deacbf --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/item/box/PackageDestroyPacket.java @@ -0,0 +1,55 @@ +package com.simibubi.create.content.logistics.item.box; + +import java.util.function.Supplier; + +import com.simibubi.create.Create; +import com.simibubi.create.foundation.networking.SimplePacketBase; +import com.simibubi.create.foundation.utility.VecHelper; + +import net.minecraft.client.Minecraft; +import net.minecraft.core.particles.ItemParticleOption; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.network.NetworkEvent; + +public class PackageDestroyPacket extends SimplePacketBase { + + protected Vec3 location; + private ItemStack box; + + public PackageDestroyPacket(FriendlyByteBuf buffer) { + location = new Vec3(buffer.readDouble(), buffer.readDouble(), buffer.readDouble()); + box = buffer.readItem(); + } + + public PackageDestroyPacket(Vec3 location, ItemStack box) { + this.location = location; + this.box = box.copy(); + this.box.setTag(null); + } + + @Override + public void write(FriendlyByteBuf buffer) { + buffer.writeDouble(location.x); + buffer.writeDouble(location.y); + buffer.writeDouble(location.z); + buffer.writeItem(box); + } + + @Override + public void handle(Supplier context) { + NetworkEvent.Context ctx = context.get(); + ctx.enqueueWork(() -> { + for (int i = 0; i < 20; i++) { + Vec3 pos = VecHelper.offsetRandomly(location, Create.RANDOM, .5f); + Vec3 motion = Vec3.ZERO; + Minecraft.getInstance().level.addParticle(new ItemParticleOption(ParticleTypes.ITEM, box), pos.x, pos.y, + pos.z, motion.x, motion.y, motion.z); + } + }); + ctx.setPacketHandled(true); + } + +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/content/logistics/item/box/PackageEntity.java b/src/main/java/com/simibubi/create/content/logistics/item/box/PackageEntity.java new file mode 100644 index 0000000000..de9e5e9d1f --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/item/box/PackageEntity.java @@ -0,0 +1,433 @@ +package com.simibubi.create.content.logistics.item.box; + +import java.util.Collections; +import java.util.List; + +import javax.annotation.Nullable; + +import com.simibubi.create.AllEntityTypes; +import com.simibubi.create.Create; +import com.simibubi.create.content.logistics.block.chute.ChuteBlock; +import com.simibubi.create.foundation.networking.AllPackets; +import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.VecHelper; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.protocol.Packet; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityDimensions; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.HumanoidArm; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Pose; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.projectile.AbstractArrow; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.HitResult; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.phys.shapes.VoxelShape; +import net.minecraftforge.entity.IEntityAdditionalSpawnData; +import net.minecraftforge.items.ItemStackHandler; +import net.minecraftforge.network.NetworkHooks; +import net.minecraftforge.network.PacketDistributor; +import net.minecraftforge.network.PlayMessages.SpawnEntity; + +public class PackageEntity extends LivingEntity implements IEntityAdditionalSpawnData { + + private Entity originalEntity; + public ItemStack box; + + public int extractorAnimationProgress; + public Direction extractorSide; + public int insertionDelay; + + public Vec3 clientPosition, vec2 = Vec3.ZERO, vec3 = Vec3.ZERO; + + @SuppressWarnings("unchecked") + public PackageEntity(EntityType entityTypeIn, Level worldIn) { + super((EntityType) entityTypeIn, worldIn); + box = ItemStack.EMPTY; + setYRot(this.random.nextFloat() * 360.0F); + insertionDelay = 30; + } + + public PackageEntity(Level worldIn, double x, double y, double z) { + this(AllEntityTypes.PACKAGE.get(), worldIn); + this.setPos(x, y, z); + this.refreshDimensions(); + } + + public static PackageEntity fromDroppedItem(Level world, Entity originalEntity, ItemStack itemstack) { + PackageEntity packageEntity = AllEntityTypes.PACKAGE.get() + .create(world); + + Vec3 position = originalEntity.position(); + packageEntity.setPos(position); + packageEntity.setBox(itemstack); + packageEntity.setDeltaMovement(originalEntity.getDeltaMovement() + .scale(1.5f)); + packageEntity.originalEntity = originalEntity; + + if (world != null && !world.isClientSide) + if (ChuteBlock.isChute(world.getBlockState(new BlockPos(position.x, position.y + .5f, position.z)))) + packageEntity.setYRot(((int) packageEntity.getYRot()) / 90 * 90); + + return packageEntity; + } + + @Override + public ItemStack getPickedResult(HitResult target) { + return box.copy(); + } + + public static AttributeSupplier.Builder createPackageAttributes() { + return LivingEntity.createLivingAttributes() + .add(Attributes.MAX_HEALTH, 5f) + .add(Attributes.MOVEMENT_SPEED, 1f); + } + + public static EntityType.Builder build(EntityType.Builder builder) { + @SuppressWarnings("unchecked") + EntityType.Builder boxBuilder = (EntityType.Builder) builder; + return boxBuilder.setCustomClientFactory(PackageEntity::spawn) + .sized(1, 1); + } + + @Override + public void travel(Vec3 p_213352_1_) { + super.travel(p_213352_1_); + if (!level.isClientSide) + return; + if (getDeltaMovement().length() < 1 / 128f) + return; + if (tickCount >= 20) + return; + + Vec3 motion = getDeltaMovement().scale(.75f); + AABB bb = getBoundingBox(); + List entityStream = level.getEntityCollisions(this, bb.expandTowards(motion)); + motion = collideBoundingBox(this, motion, bb, level, entityStream); + + Vec3 clientPos = position().add(motion); + if (lerpSteps != 0) + clientPos = VecHelper.lerp(Math.min(1, tickCount / 20f), clientPos, new Vec3(lerpX, lerpY, lerpZ)); + if (tickCount < 5) + setPos(clientPos.x, clientPos.y, clientPos.z); + if (tickCount < 20) + lerpTo(clientPos.x, clientPos.y, clientPos.z, getYRot(), getXRot(), lerpSteps == 0 ? 3 : lerpSteps, true); + } + + @Override + public void lerpMotion(double x, double y, double z) { + setDeltaMovement(getDeltaMovement().add(x, y, z) + .scale(.5f)); + } + + public String getAddress() { + return box.getTag() + .getString("Address"); + } + + @Override + public void tick() { + if (firstTick) { + verifyInitialEntity(); + originalEntity = null; + } + insertionDelay = Math.min(insertionDelay + 1, 30); + if (extractorAnimationProgress > -1) { + extractorAnimationProgress--; + return; + } + super.tick(); + } + + /* + * Forge created package entities even when an ItemEntity is spawned as 'fake'. + * See: GiveCommand#giveItem. This method discards the package if it originated + * from such a fake item + */ + protected void verifyInitialEntity() { + if (!(originalEntity instanceof ItemEntity itemEntity)) + return; + CompoundTag nbt = new CompoundTag(); + itemEntity.addAdditionalSaveData(nbt); + if (nbt.getInt("PickupDelay") != 32767) // See: ItemEntity#makeFakeItem + return; + discard(); + } + + @Override + public EntityDimensions getDimensions(Pose pPose) { + if (box == null) + return super.getDimensions(pPose); + return new EntityDimensions(PackageItem.getWidth(box), PackageItem.getHeight(box), true); + } + + public static PackageEntity spawn(SpawnEntity spawnEntity, Level world) { + PackageEntity packageEntity = + new PackageEntity(world, spawnEntity.getPosX(), spawnEntity.getPosY(), spawnEntity.getPosZ()); + packageEntity.setDeltaMovement(spawnEntity.getVelX(), spawnEntity.getVelY(), spawnEntity.getVelZ()); + packageEntity.clientPosition = packageEntity.position(); + return packageEntity; + } + + public ItemStack getBox() { + return box; + } + + public static boolean centerPackage(Entity entity, Vec3 target) { + if (!(entity instanceof PackageEntity)) + return true; + PackageEntity packageEntity = (PackageEntity) entity; + return packageEntity.decreaseInsertionTimer(target); + } + + public boolean decreaseInsertionTimer(@Nullable Vec3 targetSpot) { + if (level.isClientSide) + return true; + if (targetSpot != null) { + setDeltaMovement(getDeltaMovement().scale(.75f) + .multiply(1, .25f, 1)); + Vec3 pos = position().add(targetSpot.subtract(position()) + .scale(.2f)); + setPos(pos.x, pos.y, pos.z); + float yawTarget = ((int) getYRot()) / 90 * 90; + setYRot(AngleHelper.angleLerp(.5f, getYRot(), yawTarget)); + } + insertionDelay = Math.max(insertionDelay - 3, 0); + return insertionDelay == 0; + } + + public void setBox(ItemStack box) { + this.box = box.copy(); + refreshDimensions(); + } + + @Override + public boolean isPushable() { + return true; + } + + @Override + public boolean canCollideWith(Entity pEntity) { + return pEntity instanceof PackageEntity && pEntity.getBoundingBox().maxY < getBoundingBox().minY + .125f; + } + + @Override + public boolean canBeCollidedWith() { + return false; + } + + @Override + public InteractionResult interact(Player pPlayer, InteractionHand pHand) { + if (!pPlayer.getItemInHand(pHand) + .isEmpty()) + return super.interact(pPlayer, pHand); + pPlayer.setItemInHand(pHand, box); + level.playSound(null, blockPosition(), SoundEvents.ITEM_PICKUP, SoundSource.PLAYERS, .2f, + .75f + Create.RANDOM.nextFloat()); + remove(RemovalReason.DISCARDED); + return InteractionResult.SUCCESS; + } + + @Override + public void push(Entity entityIn) { + if (entityIn instanceof PackageEntity) { + if (entityIn.getBoundingBox().minY < this.getBoundingBox().maxY) + super.push(entityIn); + } else if (entityIn.getBoundingBox().minY <= this.getBoundingBox().minY) { + super.push(entityIn); + } + } + + @Override + public double getPassengersRidingOffset() { + return this.getDimensions(getPose()).height; + } + + @Override + protected void onInsideBlock(BlockState state) { + super.onInsideBlock(state); + if (!isAlive()) + return; + if (state.getBlock() == Blocks.WATER) { + destroy(DamageSource.DROWN); + remove(RemovalReason.KILLED); + } + } + + @Override + public boolean hurt(DamageSource source, float amount) { + if (level.isClientSide || !this.isAlive()) + return false; + + if (DamageSource.OUT_OF_WORLD.equals(source)) { + this.remove(RemovalReason.DISCARDED); + return false; + } + + if (DamageSource.IN_WALL.equals(source) && (isPassenger() || insertionDelay < 20)) + return false; + + if (DamageSource.FALL.equals(source)) + return false; + + if (this.isInvulnerableTo(source)) + return false; + + if (source.isExplosion()) { + this.destroy(source); + this.remove(RemovalReason.KILLED); + return false; + } + + if (DamageSource.IN_FIRE.equals(source)) { + if (this.isOnFire()) { + this.takeDamage(source, 0.15F); + } else { + this.setSecondsOnFire(5); + } + return false; + } + + if (DamageSource.ON_FIRE.equals(source) && this.getHealth() > 0.5F) { + this.takeDamage(source, 4.0F); + return false; + } + + boolean wasShot = source.getDirectEntity() instanceof AbstractArrow; + boolean shotCanPierce = wasShot && ((AbstractArrow) source.getDirectEntity()).getPierceLevel() > 0; + + if (source.getEntity() instanceof Player && !((Player) source.getEntity()).getAbilities().mayBuild) + return false; + + this.destroy(source); + this.remove(RemovalReason.KILLED); + return shotCanPierce; + } + + private void takeDamage(DamageSource source, float amount) { + float hp = this.getHealth(); + hp = hp - amount; + if (hp <= 0.5F) { + this.destroy(source); + this.remove(RemovalReason.KILLED); + } else { + this.setHealth(hp); + } + } + + private void destroy(DamageSource source) { + AllPackets.channel.send(PacketDistributor.TRACKING_ENTITY.with(() -> this), + new PackageDestroyPacket(position(), box)); + this.level.playSound((Player) null, getX(), getY(), getZ(), SoundEvents.ARMOR_STAND_BREAK, + this.getSoundSource(), 1.0F, 1.0F); + this.dropAllDeathLoot(source); + } + + @Override + protected void dropAllDeathLoot(DamageSource pDamageSource) { + super.dropAllDeathLoot(pDamageSource); + ItemStackHandler contents = PackageItem.getContents(box); + for (int i = 0; i < contents.getSlots(); i++) { + ItemStack itemstack = contents.getStackInSlot(i); + if (itemstack.isEmpty()) + continue; + ItemEntity entityIn = new ItemEntity(level, getX(), getY(), getZ(), itemstack); + level.addFreshEntity(entityIn); + } + } + + @Override + public void readAdditionalSaveData(CompoundTag compound) { + super.readAdditionalSaveData(compound); + box = ItemStack.of(compound.getCompound("Box")); + } + + @Override + public void addAdditionalSaveData(CompoundTag compound) { + super.addAdditionalSaveData(compound); + compound.put("Box", box.serializeNBT()); + } + + @Override + public Packet getAddEntityPacket() { + return NetworkHooks.getEntitySpawningPacket(this); + } + + @Override + public Iterable getArmorSlots() { + return Collections.emptyList(); + } + + @Override + public ItemStack getItemBySlot(EquipmentSlot pSlot) { + if (pSlot == EquipmentSlot.MAINHAND) + return getBox(); + return ItemStack.EMPTY; + } + + @Override + public void setItemSlot(EquipmentSlot pSlot, ItemStack pStack) { + if (pSlot == EquipmentSlot.MAINHAND) + setBox(pStack); + } + + @Override + public HumanoidArm getMainArm() { + return HumanoidArm.RIGHT; + } + + @Override + public InteractionHand getUsedItemHand() { + return InteractionHand.MAIN_HAND; + } + + @Override + public void writeSpawnData(FriendlyByteBuf buffer) { + buffer.writeItem(getBox()); + Vec3 motion = getDeltaMovement(); + buffer.writeFloat((float) motion.x); + buffer.writeFloat((float) motion.y); + buffer.writeFloat((float) motion.z); + } + + @Override + public void readSpawnData(FriendlyByteBuf additionalData) { + setBox(additionalData.readItem()); + setDeltaMovement(additionalData.readFloat(), additionalData.readFloat(), additionalData.readFloat()); + } + + protected SoundEvent getFallSound(int heightIn) { + return SoundEvents.ARMOR_STAND_FALL; + } + + @Nullable + protected SoundEvent getHurtSound(DamageSource damageSourceIn) { + return SoundEvents.ARMOR_STAND_HIT; + } + + @Nullable + protected SoundEvent getDeathSound() { + return SoundEvents.ARMOR_STAND_BREAK; + } + +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/content/logistics/item/box/PackageItem.java b/src/main/java/com/simibubi/create/content/logistics/item/box/PackageItem.java new file mode 100644 index 0000000000..0fa1f69a9e --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/item/box/PackageItem.java @@ -0,0 +1,271 @@ +package com.simibubi.create.content.logistics.item.box; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +import com.simibubi.create.AllEntityTypes; +import com.simibubi.create.AllItems; +import com.simibubi.create.foundation.utility.Components; + +import net.minecraft.ChatFormatting; +import net.minecraft.core.Direction; +import net.minecraft.core.NonNullList; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; +import net.minecraft.network.chat.Component; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.UseAnim; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.items.ItemStackHandler; + +public class PackageItem extends Item { + + public static final List ALL_BOXES = new ArrayList<>(); + public static ItemStack FALLBACK_BOX = ItemStack.EMPTY; + public static final int SLOTS = 9; + + int width, height; + + public PackageItem(Properties properties, int width, int height) { + super(properties); + this.width = width; + this.height = height; + ALL_BOXES.add(this); + } + + public static ItemStack getFallbackBox() { + if (FALLBACK_BOX.isEmpty()) + FALLBACK_BOX = new ItemStack(ALL_BOXES.get(0)); + return FALLBACK_BOX; + } + + @Override + public boolean hasCustomEntity(ItemStack stack) { + return true; + } + + @Override + public Entity createEntity(Level world, Entity location, ItemStack itemstack) { + return PackageEntity.fromDroppedItem(world, location, itemstack); + } + + public static ItemStack containing(List stacks) { + ItemStack box = new ItemStack(randomBox()); + CompoundTag compound = new CompoundTag(); + ItemStackHandler newInv = new ItemStackHandler(9); + compound.put("Items", newInv.serializeNBT()); + box.setTag(compound); + return box; + } + + @Override + public void fillItemCategory(CreativeModeTab pCategory, NonNullList pItems) {} + + public static void addAddress(ItemStack box, String address) { + box.getOrCreateTag() + .putString("Address", address); + } + + public static boolean matchAddress(ItemStack box, String other) { + String address = box.getTag() + .getString("Address"); + if (address == null || address.isEmpty()) + return false; + if (address.equals("*")) + return true; + if (address.equals(other)) + return true; + if (address.endsWith("*") && other.startsWith(address.substring(0, address.length() - 1))) + return true; + + return false; + } + + public static float getWidth(ItemStack box) { + if (box.getItem() instanceof PackageItem) + return ((PackageItem) box.getItem()).width / 16f; + return 1; + } + + public static float getHeight(ItemStack box) { + if (box.getItem() instanceof PackageItem) + return ((PackageItem) box.getItem()).height / 16f; + return 1; + } + + public static ItemStackHandler getContents(ItemStack box) { + ItemStackHandler newInv = new ItemStackHandler(9); + CompoundTag invNBT = box.getOrCreateTagElement("Items"); + if (!invNBT.isEmpty()) + newInv.deserializeNBT(invNBT); + newInv.setStackInSlot(0, AllItems.BRASS_INGOT.asStack()); + return newInv; + } + + public static PackageItem randomBox() { + return ALL_BOXES.get(new Random().nextInt(ALL_BOXES.size())); + } + + @Override + public void appendHoverText(ItemStack pStack, Level pLevel, List pTooltipComponents, + TooltipFlag pIsAdvanced) { + super.appendHoverText(pStack, pLevel, pTooltipComponents, pIsAdvanced); + CompoundTag compoundnbt = pStack.getOrCreateTag(); + + if (compoundnbt.contains("Address", Tag.TAG_STRING)) + pTooltipComponents.add(Components.literal("-> " + compoundnbt.getString("Address")) + .withStyle(ChatFormatting.GOLD)); + if (!compoundnbt.contains("Items", Tag.TAG_LIST)) + return; + + int j = 0; + ItemStackHandler contents = getContents(pStack); + for (int i = 0; i < contents.getSlots(); i++) { + ItemStack itemstack = contents.getStackInSlot(i); + if (itemstack.isEmpty()) + continue; + if (j > 4) { + pTooltipComponents.add(Components.translatable("container.shulkerBox.more", j - i) + .withStyle(ChatFormatting.ITALIC)); + break; + } + ++j; + pTooltipComponents.add(itemstack.getDisplayName() + .copy() + .append(" x") + .append(String.valueOf(itemstack.getCount())) + .withStyle(ChatFormatting.GRAY)); + } + } + + // Throwing stuff + + @Override + public int getUseDuration(ItemStack p_77626_1_) { + return 72000; + } + + @Override + public UseAnim getUseAnimation(ItemStack pStack) { + return UseAnim.BOW; + } + + public InteractionResultHolder open(Level worldIn, Player playerIn, InteractionHand handIn) { + ItemStack box = playerIn.getItemInHand(handIn); + ItemStackHandler contents = getContents(box); + for (int i = 0; i < contents.getSlots(); i++) { + ItemStack itemstack = contents.getStackInSlot(i); + if (itemstack.isEmpty()) + continue; + playerIn.getInventory() + .placeItemBackInInventory(itemstack); + } + if (!playerIn.isCreative()) + box.shrink(1); + return new InteractionResultHolder<>(InteractionResult.SUCCESS, box); + } + + @Override + public InteractionResult useOn(UseOnContext context) { + if (context.getPlayer() + .isSteppingCarefully()) + return open(context.getLevel(), context.getPlayer(), context.getHand()).getResult(); + + Vec3 point = context.getClickLocation(); + float h = height / 16f; + float r = width / 2f / 16f; + + if (context.getClickedFace() == Direction.DOWN) + point = point.subtract(0, h + .25f, 0); + else if (context.getClickedFace() + .getAxis() + .isHorizontal()) + point = point.add(Vec3.atLowerCornerOf(context.getClickedFace() + .getNormal()) + .scale(r)); + + AABB scanBB = new AABB(point, point).inflate(r, 0, r) + .expandTowards(0, h, 0); + Level world = context.getLevel(); + if (!world.getEntities(AllEntityTypes.PACKAGE.get(), scanBB, e -> true) + .isEmpty()) + return super.useOn(context); + + PackageEntity packageEntity = new PackageEntity(world, point.x, point.y, point.z); + ItemStack itemInHand = context.getItemInHand(); + packageEntity.setBox(itemInHand.copy()); + world.addFreshEntity(packageEntity); + itemInHand.shrink(1); + return InteractionResult.SUCCESS; + } + + @Override + public InteractionResultHolder use(Level world, Player player, InteractionHand hand) { + if (player.isSteppingCarefully()) + return open(world, player, hand); + ItemStack itemstack = player.getItemInHand(hand); + player.startUsingItem(hand); + return InteractionResultHolder.success(itemstack); + } + + @Override + public void releaseUsing(ItemStack stack, Level world, LivingEntity entity, int ticks) { + if (!(entity instanceof Player)) + return; + Player playerentity = (Player) entity; + int i = this.getUseDuration(stack) - ticks; + if (i < 0) + return; + + float f = getPackageVelocity(i); + if (f < 0.1D) + return; + if (world.isClientSide) + return; + + world.playSound(null, playerentity.getX(), playerentity.getY(), playerentity.getZ(), SoundEvents.SNOWBALL_THROW, + SoundSource.NEUTRAL, 0.5F, 0.5F); + + ItemStack copy = stack.copy(); + if (!playerentity.isCreative()) + stack.shrink(1); + if (stack.isEmpty()) + playerentity.getInventory() + .removeItem(stack); + + Vec3 vec = new Vec3(entity.getX(), entity.getY() + entity.getBoundingBox() + .getYsize() / 2f, entity.getZ()); + Vec3 motion = entity.getLookAngle() + .scale(f * 2); + vec = vec.add(motion); + + PackageEntity packageEntity = new PackageEntity(world, vec.x, vec.y, vec.z); + packageEntity.setBox(copy); + packageEntity.setDeltaMovement(motion); + world.addFreshEntity(packageEntity); + } + + public static float getPackageVelocity(int p_185059_0_) { + float f = (float) p_185059_0_ / 20.0F; + f = (f * f + f * 2.0F) / 3.0F; + if (f > 1.0F) + f = 1.0F; + return f; + } + +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/content/logistics/item/box/PackageRenderer.java b/src/main/java/com/simibubi/create/content/logistics/item/box/PackageRenderer.java new file mode 100644 index 0000000000..fe9280ea4d --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/item/box/PackageRenderer.java @@ -0,0 +1,46 @@ +package com.simibubi.create.content.logistics.item.box; + +import com.jozufozu.flywheel.core.PartialModel; +import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.foundation.render.CachedBufferer; +import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.utility.AngleHelper; + +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider.Context; +import net.minecraft.core.Direction; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Blocks; + +public class PackageRenderer extends EntityRenderer { + + public PackageRenderer(Context pContext) { + super(pContext); + } + + @Override + public void render(PackageEntity entity, float yaw, float pt, PoseStack ms, MultiBufferSource buffer, int light) { + ItemStack box = entity.box; + if (box.isEmpty()) + box = PackageItem.getFallbackBox(); + PartialModel model = AllBlockPartials.PACKAGES.get(box.getItem() + .getRegistryName()); + SuperByteBuffer sbb = CachedBufferer.partial(model, Blocks.AIR.defaultBlockState()); + sbb.translate(-.5, 0, -.5) + .rotateCentered(Direction.UP, AngleHelper.rad(yaw)) + .light(light) + .nudge(entity.getId()); + sbb.renderInto(ms, buffer.getBuffer(RenderType.solid())); + super.render(entity, yaw, pt, ms, buffer, light); + } + + @Override + public ResourceLocation getTextureLocation(PackageEntity pEntity) { + return null; + } + +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java b/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java index 7c56ee9c98..7719406281 100644 --- a/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java +++ b/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java @@ -9,6 +9,7 @@ import static com.simibubi.create.foundation.data.CreateRegistrate.casingConnect import static com.simibubi.create.foundation.data.CreateRegistrate.connectedTextures; import java.util.HashMap; +import java.util.Locale; import java.util.Map; import java.util.function.Supplier; @@ -35,6 +36,7 @@ import com.simibubi.create.content.curiosities.frames.CopycatBlock; import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelBlock; import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelBlock.Shape; import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelItem; +import com.simibubi.create.content.logistics.item.box.PackageItem; import com.simibubi.create.content.logistics.trains.IBogeyBlock; import com.simibubi.create.content.logistics.trains.track.StandardBogeyBlock; import com.simibubi.create.foundation.block.BlockStressDefaults; @@ -43,6 +45,7 @@ import com.simibubi.create.foundation.block.connected.CTSpriteShiftEntry; import com.simibubi.create.foundation.block.connected.HorizontalCTBehaviour; import com.simibubi.create.foundation.utility.RegisteredObjects; import com.tterrag.registrate.builders.BlockBuilder; +import com.tterrag.registrate.builders.ItemBuilder; import com.tterrag.registrate.util.DataIngredient; import com.tterrag.registrate.util.nullness.NonNullUnaryOperator; @@ -428,4 +431,12 @@ public class BuilderTransformers { .build(); } + public static NonNullUnaryOperator> packageItem( + String material, int diameter, int height) { + return b -> b.properties(p -> p.stacksTo(1)) + .model((c, p) -> p.getExistingFile(p.modLoc(c.getName()))) + .lang(material.substring(0, 1) + .toUpperCase(Locale.ROOT) + material.substring(1) + " Package"); + } + } diff --git a/src/main/java/com/simibubi/create/foundation/item/ItemHelper.java b/src/main/java/com/simibubi/create/foundation/item/ItemHelper.java index b2a454fb8f..d343444f18 100644 --- a/src/main/java/com/simibubi/create/foundation/item/ItemHelper.java +++ b/src/main/java/com/simibubi/create/foundation/item/ItemHelper.java @@ -9,6 +9,7 @@ import javax.annotation.Nullable; import org.apache.commons.lang3.mutable.MutableInt; +import com.simibubi.create.content.logistics.item.box.PackageEntity; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.utility.Pair; @@ -16,6 +17,8 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.NonNullList; import net.minecraft.util.Mth; import net.minecraft.world.Containers; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.level.Level; @@ -278,4 +281,15 @@ public class ItemHelper { } return -1; } + + public static ItemStack fromItemEntity(Entity entityIn) { + if (!entityIn.isAlive()) + return ItemStack.EMPTY; + if (entityIn instanceof PackageEntity) { + PackageEntity packageEntity = (PackageEntity) entityIn; + return packageEntity.getBox(); + } + return entityIn instanceof ItemEntity ? ((ItemEntity) entityIn).getItem() : ItemStack.EMPTY; + } + } diff --git a/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java b/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java index e30bd38735..b0fd85f500 100644 --- a/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java +++ b/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java @@ -56,6 +56,7 @@ import com.simibubi.create.content.logistics.block.mechanicalArm.ArmPlacementPac import com.simibubi.create.content.logistics.item.LinkedControllerBindPacket; import com.simibubi.create.content.logistics.item.LinkedControllerInputPacket; import com.simibubi.create.content.logistics.item.LinkedControllerStopLecternPacket; +import com.simibubi.create.content.logistics.item.box.PackageDestroyPacket; import com.simibubi.create.content.logistics.item.filter.FilterScreenPacket; import com.simibubi.create.content.logistics.packet.ConfigureStockswitchPacket; import com.simibubi.create.content.logistics.packet.FunnelFlapPacket; @@ -195,6 +196,7 @@ public enum AllPackets { TRACK_GRAPH_ROLL_CALL(TrackGraphRollCallPacket.class, TrackGraphRollCallPacket::new, PLAY_TO_CLIENT), UPDATE_ELEVATOR_FLOORS(ElevatorFloorListPacket.class, ElevatorFloorListPacket::new, PLAY_TO_CLIENT), CONTRAPTION_ACTOR_TOGGLE(ContraptionDisableActorPacket.class, ContraptionDisableActorPacket::new, PLAY_TO_CLIENT), + PACKAGE_DESTROYED(PackageDestroyPacket.class, PackageDestroyPacket::new, PLAY_TO_CLIENT), SET_FIRE_IMMUNE(NetheriteDivingHandler.SetFireImmunePacket.class, NetheriteDivingHandler.SetFireImmunePacket::new, PLAY_TO_CLIENT), ; diff --git a/src/main/resources/assets/create/models/item/cardboard_package_10x12.json b/src/main/resources/assets/create/models/item/cardboard_package_10x12.json new file mode 100644 index 0000000000..2c909f0368 --- /dev/null +++ b/src/main/resources/assets/create/models/item/cardboard_package_10x12.json @@ -0,0 +1,22 @@ +{ + "credit": "Made with Blockbench", + "parent": "create:item/package_transforms", + "textures": { + "0": "create:entity/package/cardboard", + "particle": "create:entity/package/cardboard_particle" + }, + "elements": [ + { + "from": [3, 0, 3], + "to": [13, 12, 13], + "faces": { + "north": {"uv": [6.75, 10, 9.25, 13], "texture": "#0"}, + "east": {"uv": [4.25, 7.5, 6.75, 10.5], "texture": "#0"}, + "south": {"uv": [6.75, 10, 9.25, 13], "texture": "#0"}, + "west": {"uv": [4.25, 10.5, 6.75, 13.5], "texture": "#0"}, + "up": {"uv": [6.75, 7.5, 9.25, 10], "texture": "#0"}, + "down": {"uv": [6.75, 13, 9.25, 15.5], "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/cardboard_package_10x8.json b/src/main/resources/assets/create/models/item/cardboard_package_10x8.json new file mode 100644 index 0000000000..fd38cbdbdc --- /dev/null +++ b/src/main/resources/assets/create/models/item/cardboard_package_10x8.json @@ -0,0 +1,22 @@ +{ + "credit": "Made with Blockbench", + "parent": "create:item/package_transforms", + "textures": { + "0": "create:entity/package/cardboard", + "particle": "create:entity/package/cardboard_particle" + }, + "elements": [ + { + "from": [3, 0, 3], + "to": [13, 8, 13], + "faces": { + "north": {"uv": [9.25, 3, 11.75, 5], "texture": "#0"}, + "east": {"uv": [6.75, 0.5, 9.25, 2.5], "texture": "#0"}, + "south": {"uv": [9.25, 3, 11.75, 5], "texture": "#0"}, + "west": {"uv": [6.75, 2.5, 9.25, 4.5], "texture": "#0"}, + "up": {"uv": [9.25, 0.5, 11.75, 3], "texture": "#0"}, + "down": {"uv": [6.75, 4.5, 9.25, 7], "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/cardboard_package_12x10.json b/src/main/resources/assets/create/models/item/cardboard_package_12x10.json new file mode 100644 index 0000000000..a5253293f5 --- /dev/null +++ b/src/main/resources/assets/create/models/item/cardboard_package_12x10.json @@ -0,0 +1,22 @@ +{ + "credit": "Made with Blockbench", + "parent": "create:item/package_transforms", + "textures": { + "0": "create:entity/package/cardboard", + "particle": "create:entity/package/cardboard_particle" + }, + "elements": [ + { + "from": [2, 0, 2], + "to": [14, 10, 14], + "faces": { + "north": {"uv": [3.25, 4.5, 6.25, 7], "texture": "#0"}, + "east": {"uv": [0.25, 1.5, 3.25, 4], "texture": "#0"}, + "south": {"uv": [3.25, 4.5, 6.25, 7], "texture": "#0"}, + "west": {"uv": [0.25, 4, 3.25, 6.5], "texture": "#0"}, + "up": {"uv": [3.25, 1.5, 6.25, 4.5], "texture": "#0"}, + "down": {"uv": [0.25, 6.5, 3.25, 9.5], "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/cardboard_package_12x12.json b/src/main/resources/assets/create/models/item/cardboard_package_12x12.json new file mode 100644 index 0000000000..c052f0582b --- /dev/null +++ b/src/main/resources/assets/create/models/item/cardboard_package_12x12.json @@ -0,0 +1,22 @@ +{ + "credit": "Made with Blockbench", + "parent": "create:item/package_transforms", + "textures": { + "0": "create:entity/package/cardboard", + "particle": "create:entity/package/cardboard_particle" + }, + "elements": [ + { + "from": [2, 0, 2], + "to": [14, 12, 14], + "faces": { + "north": {"uv": [12.75, 8.5, 15.75, 11.5], "texture": "#0"}, + "east": {"uv": [9.75, 5.5, 12.75, 8.5], "texture": "#0"}, + "south": {"uv": [12.75, 8.5, 15.75, 11.5], "texture": "#0"}, + "west": {"uv": [9.75, 8.5, 12.75, 11.5], "texture": "#0"}, + "up": {"uv": [12.75, 5.5, 15.75, 8.5], "texture": "#0"}, + "down": {"uv": [9.75, 11.5, 12.75, 14.5], "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/package_transforms.json b/src/main/resources/assets/create/models/item/package_transforms.json new file mode 100644 index 0000000000..56f73a6175 --- /dev/null +++ b/src/main/resources/assets/create/models/item/package_transforms.json @@ -0,0 +1,26 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "display": { + "thirdperson_righthand": { + "rotation": [75, 71, 0], + "translation": [0, 5.25, 0], + "scale": [0.87, 0.87, 0.87] + }, + "thirdperson_lefthand": { + "rotation": [75, 71, 0], + "translation": [0, 5.25, 0], + "scale": [0.87, 0.87, 0.87] + }, + "firstperson_righthand": { + "rotation": [0, 87, 0], + "translation": [2.75, 2, -0.25], + "scale": [0.97, 0.97, 0.97] + }, + "firstperson_lefthand": { + "rotation": [0, 87, 0], + "translation": [2.75, 2, -0.25], + "scale": [0.97, 0.97, 0.97] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/entity/package/cardboard.png b/src/main/resources/assets/create/textures/entity/package/cardboard.png new file mode 100644 index 0000000000000000000000000000000000000000..93056c2b2302ab21b90af39f26bda8a3fb134db2 GIT binary patch literal 1401 zcmb7E`!^E`9G{tN#N8&`*v;#px{hZ;xreQZX>GH4jci!u)iAG?CNpBoHnlNihN}qS zAg@Vz-IS0bJ>->CBBty1;C9`0|AYHI=kxiT&-a|~`Fzj!hcAzS^VHHX&;S4cS{N@h zQK{}f09I9UX?wBYj2&9arizpOs<@FIS5vEUPS*+Paw)6eY=F-pQ@QLyd-1v7vrg9W z&oqe>t9emZ5=nJ}Gi^o8yab>5Hi0O~w>dwt{&JkWlqHv?*W|{Orc+ANLej&L3BCuC z{0|Bl#NzY8g{fqDSvoW5PzLRYkU2ksoe4f#Ka=Daw7uQA zS~@CPxsQt|TFv6;1lCP;=lCLKx!c}^jlj9J*Po`>J!&w>^1^qZ;!&C5e^A%z8maJTU}kA)Pi7rOP0O+v`d zv~3@WWE9#H^MG@RqEftI1?^FU85WWP%Rwf@vLd=Rm~_L*`aT z+Hj$L-}1njwKiB6?|Zg7R*Uc$#JZqYFO#GtvjH-d-@6XOZ{PX zC7t@$BEnb&GnlZ>F2SrwLNCt6M^00yqe$$Aw#k` zpR|qND+WQBh8-lDFV9C?zTUYU^sG+}ip2@U-Ybj73yK~;s0sWYY=czEeIa3ax?soT z4ViiOfi@yA7{+$P3Q#T6(RYH&;vak+|0ntG?A_P7X0{V-71#cn4Ddjt?eNweyQI?U=Qh!_X=P`I0U;RkNP)k&EULfj1_DkBpt(y{w^v3FuGt9#vZzjouKl)-A6 znnz>Je#Q#MHM1W%&uYvm!wa8NE&n)e>u3*}_Xo7}WmpJ=W3Uu+2W*)G=y~B5Y)c3k z!%65fVVy&b~U<}lf>)SY*J5x`|d=6mflS0|CRvX zOuML&lHi2Hjq-V6)a#;HsZ^>1XHqvfS4ZGS#SWoFp!dOUUA|>R&pza*m++5j}>^PS?~H+{jA6-lSL=}UCMU?zNS%Lhh0G|-ospaAG8x!X>BayfbrJ zWdzg5S=~TeI14-?iy0XB4uLSEsD@VqP;i;2i(`mJu&zI&&>;n$>{AJcSFPT>YvarR z`!jFcY*zNY{6v6JB=dyjQl^9{E90`ZzRopT{XI&3=EA;*8=w675@0&hxlvKK(v!tN zQnc}@&aBcVlT)u_y$btwI33-^*3@3GSW`RT&Tlu9o0f^f^+y%uRp0SC|D3d73e%~% z;nKETU$vKO>%K6Y{^CJQ^QC6Z^w)k~hg04!eE7nX>)+Gc+tSwFyx4QKPoDKOH Date: Wed, 15 Mar 2023 17:29:25 +0100 Subject: [PATCH 008/515] Return of the smooth belt --- src/generated/resources/.cache/cache | 4 +- .../resources/assets/create/lang/en_ud.json | 5 + .../resources/assets/create/lang/en_us.json | 5 + .../relays/belt/BeltBlockEntity.java | 11 +- .../relays/belt/BeltRenderer.java | 229 +++++++++--------- .../relays/belt/transport/BeltInventory.java | 27 ++- .../item/box/PackageDestroyPacket.java | 11 +- .../logistics/item/box/PackageEntity.java | 4 +- .../logistics/item/box/PackageRenderer.java | 4 +- 9 files changed, 172 insertions(+), 128 deletions(-) diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index f9bb93b657..eeb46218c1 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -566,8 +566,8 @@ bf2b0310500213ff853c748c236eb5d01f61658e assets/create/blockstates/yellow_toolbo 5616dda664dd106d576848124fc0fc1de18d0fd3 assets/create/blockstates/yellow_valve_handle.json 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json -f1bedeb51c35e70a2247178634e61ea637a6622e assets/create/lang/en_ud.json -59bd0d1e0f74f1dbfd2443b3e6cb8c683b57827a assets/create/lang/en_us.json +c9b92d20967574614dbe75121c47b9d5b395235b assets/create/lang/en_ud.json +74fd63a753a9c0de2275ba4a0faa3d5fe94aed36 assets/create/lang/en_us.json 487a511a01b2a4531fb672f917922312db78f958 assets/create/models/block/acacia_window.json b48060cba1a382f373a05bf0039054053eccf076 assets/create/models/block/acacia_window_pane_noside.json 3066db1bf03cffa1a9c7fbacf47ae586632f4eb3 assets/create/models/block/acacia_window_pane_noside_alt.json diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index ebd1117181..dd58fb6beb 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -573,6 +573,7 @@ "entity.create.contraption": "uo\u0131\u0287d\u0250\u0279\u0287uo\u0186", "entity.create.crafting_blueprint": "\u0287u\u0131\u0279d\u01DDn\u05DF\u15FA bu\u0131\u0287\u025F\u0250\u0279\u0186", "entity.create.gantry_contraption": "uo\u0131\u0287d\u0250\u0279\u0287uo\u0186 \u028E\u0279\u0287u\u0250\u2141", + "entity.create.package": "\u01DDb\u0250\u029E\u0254\u0250\u0500", "entity.create.potato_projectile": "\u01DD\u05DF\u0131\u0287\u0254\u01DD\u0638o\u0279\u0500 o\u0287\u0250\u0287o\u0500", "entity.create.seat": "\u0287\u0250\u01DDS", "entity.create.stationary_contraption": "uo\u0131\u0287d\u0250\u0279\u0287uo\u0186 \u028E\u0279\u0250uo\u0131\u0287\u0250\u0287S", @@ -590,6 +591,10 @@ "item.create.brass_nugget": "\u0287\u01DDbbnN ss\u0250\u0279\u15FA", "item.create.brass_sheet": "\u0287\u01DD\u01DD\u0265S ss\u0250\u0279\u15FA", "item.create.builders_tea": "\u0250\u01DD\u27D8 s,\u0279\u01DDp\u05DF\u0131n\u15FA", + "item.create.cardboard_package_10x12": "\u01DDb\u0250\u029E\u0254\u0250\u0500 p\u0279\u0250oqp\u0279\u0250\u0186", + "item.create.cardboard_package_10x8": "\u01DDb\u0250\u029E\u0254\u0250\u0500 p\u0279\u0250oqp\u0279\u0250\u0186", + "item.create.cardboard_package_12x10": "\u01DDb\u0250\u029E\u0254\u0250\u0500 p\u0279\u0250oqp\u0279\u0250\u0186", + "item.create.cardboard_package_12x12": "\u01DDb\u0250\u029E\u0254\u0250\u0500 p\u0279\u0250oqp\u0279\u0250\u0186", "item.create.chest_minecart_contraption": "uo\u0131\u0287d\u0250\u0279\u0287uo\u0186 \u0287\u0279\u0250\u0254\u01DDu\u0131W \u0287s\u01DD\u0265\u0186", "item.create.chocolate_bucket": "\u0287\u01DD\u029E\u0254n\u15FA \u01DD\u0287\u0250\u05DFo\u0254o\u0265\u0186", "item.create.chocolate_glazed_berries": "s\u01DD\u0131\u0279\u0279\u01DD\u15FA p\u01DDz\u0250\u05DF\u2141 \u01DD\u0287\u0250\u05DFo\u0254o\u0265\u0186", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 48c2234b14..646d7f79a9 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -578,6 +578,7 @@ "entity.create.contraption": "Contraption", "entity.create.crafting_blueprint": "Crafting Blueprint", "entity.create.gantry_contraption": "Gantry Contraption", + "entity.create.package": "Package", "entity.create.potato_projectile": "Potato Projectile", "entity.create.seat": "Seat", "entity.create.stationary_contraption": "Stationary Contraption", @@ -597,6 +598,10 @@ "item.create.brass_nugget": "Brass Nugget", "item.create.brass_sheet": "Brass Sheet", "item.create.builders_tea": "Builder's Tea", + "item.create.cardboard_package_10x12": "Cardboard Package", + "item.create.cardboard_package_10x8": "Cardboard Package", + "item.create.cardboard_package_12x10": "Cardboard Package", + "item.create.cardboard_package_12x12": "Cardboard Package", "item.create.chest_minecart_contraption": "Chest Minecart Contraption", "item.create.chocolate_bucket": "Chocolate Bucket", "item.create.chocolate_glazed_berries": "Chocolate Glazed Berries", diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlockEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlockEntity.java index 32d19648ff..67a4aa1645 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlockEntity.java @@ -498,11 +498,16 @@ public class BeltBlockEntity extends KineticBlockEntity { .isVertical()) { if (movementFacing != side) { transportedStack.sideOffset = side.getAxisDirection() - .getStep() * .35f; + .getStep() * .675f; if (side.getAxis() == Axis.X) transportedStack.sideOffset *= -1; - } else - transportedStack.beltPosition = getDirectionAwareBeltMovementSpeed() > 0 ? index : index + 1; + } else { + float extraOffset = + BeltHelper.getSegmentBE(level, worldPosition.relative(movementFacing.getOpposite())) != null ? .275f + : 0; + transportedStack.beltPosition = + getDirectionAwareBeltMovementSpeed() > 0 ? index - extraOffset : index + 1 + extraOffset; + } } transportedStack.prevSideOffset = transportedStack.sideOffset; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java index 6b077cb4f5..6583b50286 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java @@ -13,6 +13,7 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.AllPartialModels; import com.simibubi.create.AllSpriteShifts; import com.simibubi.create.content.contraptions.base.KineticBlockEntityRenderer; +import com.simibubi.create.content.contraptions.relays.belt.transport.BeltInventory; import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; import com.simibubi.create.content.logistics.item.box.PackageItem; import com.simibubi.create.foundation.block.render.SpriteShiftEntry; @@ -197,128 +198,134 @@ public class BeltRenderer extends SafeBlockEntityRenderer { boolean onContraption = be.getLevel() instanceof WrappedWorld; - for (TransportedItemStack transported : be.getInventory() - .getTransportedItems()) { - ms.pushPose(); - TransformStack.cast(ms) - .nudge(transported.angle); + BeltInventory inventory = be.getInventory(); + for (TransportedItemStack transported : inventory.getTransportedItems()) + renderItem(be, partialTicks, ms, buffer, light, overlay, beltFacing, directionVec, slope, verticality, + slopeAlongX, onContraption, transported); + if (inventory.getLazyClientItem() != null) + renderItem(be, partialTicks, ms, buffer, light, overlay, beltFacing, directionVec, slope, verticality, + slopeAlongX, onContraption, inventory.getLazyClientItem()); - float offset; - float sideOffset; - float verticalMovement; + ms.popPose(); + } - if (be.getSpeed() == 0) { - offset = transported.beltPosition; - sideOffset = transported.sideOffset; - } else { - offset = Mth.lerp(partialTicks, transported.prevBeltPosition, transported.beltPosition); - sideOffset = Mth.lerp(partialTicks, transported.prevSideOffset, transported.sideOffset); - } + private void renderItem(BeltBlockEntity be, float partialTicks, PoseStack ms, MultiBufferSource buffer, int light, + int overlay, Direction beltFacing, Vec3i directionVec, BeltSlope slope, int verticality, boolean slopeAlongX, + boolean onContraption, TransportedItemStack transported) { + ms.pushPose(); + TransformStack.cast(ms) + .nudge(transported.angle); - if (offset < .5) - verticalMovement = 0; - else - verticalMovement = verticality * (Math.min(offset, be.beltLength - .5f) - .5f); - Vec3 offsetVec = Vec3.atLowerCornerOf(directionVec).scale(offset); - if (verticalMovement != 0) - offsetVec = offsetVec.add(0, verticalMovement, 0); - boolean onSlope = - slope != BeltSlope.HORIZONTAL && Mth.clamp(offset, .5f, be.beltLength - .5f) == offset; - boolean tiltForward = (slope == BeltSlope.DOWNWARD ^ beltFacing - .getAxisDirection() == AxisDirection.POSITIVE) == (beltFacing - .getAxis() == Axis.Z); - float slopeAngle = onSlope ? tiltForward ? -45 : 45 : 0; + float offset = Mth.lerp(partialTicks, transported.prevBeltPosition, transported.beltPosition); + float sideOffset = Mth.lerp(partialTicks, transported.prevSideOffset, transported.sideOffset); + float verticalMovement = verticality; - ms.translate(offsetVec.x, offsetVec.y, offsetVec.z); - - boolean alongX = beltFacing - .getClockWise() - .getAxis() == Axis.X; - if (!alongX) - sideOffset *= -1; - ms.translate(alongX ? sideOffset : 0, 0, alongX ? 0 : sideOffset); - - int stackLight = onContraption ? light : getPackedLight(be, offset); - ItemRenderer itemRenderer = Minecraft.getInstance() - .getItemRenderer(); - boolean renderUpright = BeltHelper.isItemUpright(transported.stack); - boolean blockItem = itemRenderer.getModel(transported.stack, be.getLevel(), null, 0) - .isGui3d(); - int count = (int) (Mth.log2((int) (transported.stack.getCount()))) / 2; - Random r = new Random(transported.angle); - - boolean slopeShadowOnly = renderUpright && onSlope; - float slopeOffset = 1 / 8f; - if (slopeShadowOnly) - ms.pushPose(); - if (!renderUpright || slopeShadowOnly) - ms.mulPose(new Vector3f(slopeAlongX ? 0 : 1, 0, slopeAlongX ? 1 : 0).rotationDegrees(slopeAngle)); - if (onSlope) - ms.translate(0, slopeOffset, 0); - ms.pushPose(); - ms.translate(0, -1 / 8f + 0.005f, 0); - ShadowRenderHelper.renderShadow(ms, buffer, .75f, .2f); - ms.popPose(); - if (slopeShadowOnly) { - ms.popPose(); - ms.translate(0, slopeOffset, 0); - } - - if (renderUpright) { - Entity renderViewEntity = Minecraft.getInstance().cameraEntity; - if (renderViewEntity != null) { - Vec3 positionVec = renderViewEntity.position(); - Vec3 vectorForOffset = BeltHelper.getVectorForOffset(be, offset); - Vec3 diff = vectorForOffset.subtract(positionVec); - float yRot = (float) (Mth.atan2(diff.x, diff.z) + Math.PI); - ms.mulPose(Vector3f.YP.rotation(yRot)); - } - ms.translate(0, 3 / 32d, 1 / 16f); - } - - for (int i = 0; i <= count; i++) { - ms.pushPose(); - - boolean box = transported.stack.getItem() instanceof PackageItem; - ms.mulPose(Vector3f.YP.rotationDegrees(transported.angle)); - if (!blockItem && !renderUpright) { - ms.translate(0, -.09375, 0); - ms.mulPose(Vector3f.XP.rotationDegrees(90)); - } - - if (blockItem && !box) - ms.translate(r.nextFloat() * .0625f * i, 0, r.nextFloat() * .0625f * i); - - if (box) { - ms.translate(0, 6 / 16f, 0); - ms.scale(2f, 2f, 2f); - } else - ms.scale(.5f, .5f, .5f); - - itemRenderer.renderStatic(null, transported.stack, TransformType.FIXED, false, ms, buffer, - be.getLevel(), stackLight, overlay, 0); - ms.popPose(); - - if (!renderUpright) { - if (!blockItem) - ms.mulPose(Vector3f.YP.rotationDegrees(10)); - ms.translate(0, blockItem ? 1 / 64d : 1 / 16d, 0); - } else - ms.translate(0, 0, -1 / 16f); - - } - - ms.popPose(); + if (be.getSpeed() == 0) { + offset = transported.beltPosition; + sideOffset = transported.sideOffset; } + + if (offset < .5) + verticalMovement = 0; + else + verticalMovement = verticality * (Math.min(offset, be.beltLength - .5f) - .5f); + Vec3 offsetVec = Vec3.atLowerCornerOf(directionVec).scale(offset); + if (verticalMovement != 0) + offsetVec = offsetVec.add(0, verticalMovement, 0); + boolean onSlope = + slope != BeltSlope.HORIZONTAL && Mth.clamp(offset, .5f, be.beltLength - .5f) == offset; + boolean tiltForward = (slope == BeltSlope.DOWNWARD ^ beltFacing + .getAxisDirection() == AxisDirection.POSITIVE) == (beltFacing + .getAxis() == Axis.Z); + float slopeAngle = onSlope ? tiltForward ? -45 : 45 : 0; + + ms.translate(offsetVec.x, offsetVec.y, offsetVec.z); + + boolean alongX = beltFacing + .getClockWise() + .getAxis() == Axis.X; + if (!alongX) + sideOffset *= -1; + ms.translate(alongX ? sideOffset : 0, 0, alongX ? 0 : sideOffset); + + int stackLight = onContraption ? light : getPackedLight(be, offset); + ItemRenderer itemRenderer = Minecraft.getInstance() + .getItemRenderer(); + boolean renderUpright = BeltHelper.isItemUpright(transported.stack); + boolean blockItem = itemRenderer.getModel(transported.stack, be.getLevel(), null, 0) + .isGui3d(); + int count = (int) (Mth.log2((int) (transported.stack.getCount()))) / 2; + Random r = new Random(transported.angle); + + boolean slopeShadowOnly = renderUpright && onSlope; + float slopeOffset = 1 / 8f; + if (slopeShadowOnly) + ms.pushPose(); + if (!renderUpright || slopeShadowOnly) + ms.mulPose(new Vector3f(slopeAlongX ? 0 : 1, 0, slopeAlongX ? 1 : 0).rotationDegrees(slopeAngle)); + if (onSlope) + ms.translate(0, slopeOffset, 0); + ms.pushPose(); + ms.translate(0, -1 / 8f + 0.005f, 0); + ShadowRenderHelper.renderShadow(ms, buffer, .75f, .2f); + ms.popPose(); + if (slopeShadowOnly) { + ms.popPose(); + ms.translate(0, slopeOffset, 0); + } + + if (renderUpright) { + Entity renderViewEntity = Minecraft.getInstance().cameraEntity; + if (renderViewEntity != null) { + Vec3 positionVec = renderViewEntity.position(); + Vec3 vectorForOffset = BeltHelper.getVectorForOffset(be, offset); + Vec3 diff = vectorForOffset.subtract(positionVec); + float yRot = (float) (Mth.atan2(diff.x, diff.z) + Math.PI); + ms.mulPose(Vector3f.YP.rotation(yRot)); + } + ms.translate(0, 3 / 32d, 1 / 16f); + } + + for (int i = 0; i <= count; i++) { + ms.pushPose(); + + boolean box = transported.stack.getItem() instanceof PackageItem; + ms.mulPose(Vector3f.YP.rotationDegrees(transported.angle)); + if (!blockItem && !renderUpright) { + ms.translate(0, -.09375, 0); + ms.mulPose(Vector3f.XP.rotationDegrees(90)); + } + + if (blockItem && !box) + ms.translate(r.nextFloat() * .0625f * i, 0, r.nextFloat() * .0625f * i); + + if (box) { + ms.translate(0, 6 / 16f, 0); + ms.scale(2f, 2f, 2f); + } else + ms.scale(.5f, .5f, .5f); + + itemRenderer.renderStatic(null, transported.stack, TransformType.FIXED, false, ms, buffer, + be.getLevel(), stackLight, overlay, 0); + ms.popPose(); + + if (!renderUpright) { + if (!blockItem) + ms.mulPose(Vector3f.YP.rotationDegrees(10)); + ms.translate(0, blockItem ? 1 / 64d : 1 / 16d, 0); + } else + ms.translate(0, 0, -1 / 16f); + + } + ms.popPose(); } protected int getPackedLight(BeltBlockEntity controller, float beltPos) { int segment = (int) Math.floor(beltPos); - if (controller.lighter == null || segment >= controller.lighter.lightSegments() || segment < 0) + if (controller.lighter == null || controller.lighter.lightSegments() == 0) return 0; - - return controller.lighter.getPackedLight(segment); + return controller.lighter.getPackedLight(Mth.clamp(segment, 0, controller.lighter.lightSegments() - 1)); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltInventory.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltInventory.java index 23351a0b62..5b53c0557b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltInventory.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltInventory.java @@ -8,6 +8,8 @@ import java.util.LinkedList; import java.util.List; import java.util.function.Function; +import javax.annotation.Nullable; + import com.simibubi.create.content.contraptions.relays.belt.BeltBlock; import com.simibubi.create.content.contraptions.relays.belt.BeltBlockEntity; import com.simibubi.create.content.contraptions.relays.belt.BeltHelper; @@ -39,6 +41,8 @@ public class BeltInventory { final List toRemove; boolean beltMovementPositive; final float SEGMENT_WINDOW = .75f; + + TransportedItemStack lazyClientItem; public BeltInventory(BeltBlockEntity be) { this.belt = be; @@ -49,6 +53,14 @@ public class BeltInventory { public void tick() { + // Residual item for "smooth" transitions + if (lazyClientItem != null) { + if (lazyClientItem.locked) + lazyClientItem = null; + else + lazyClientItem.locked = true; + } + // Added/Removed items from previous cycle if (!toInsert.isEmpty() || !toRemove.isEmpty()) { toInsert.forEach(this::insert); @@ -195,8 +207,12 @@ public class BeltInventory { continue; currentItem.stack = remainder; - if (remainder.isEmpty()) + if (remainder.isEmpty()) { + lazyClientItem = currentItem; + lazyClientItem.locked = false; iterator.remove(); + } else + currentItem.stack = remainder; flapTunnel(this, lastOffset, movementFacing, false); belt.sendData(); @@ -390,6 +406,8 @@ public class BeltInventory { items.clear(); nbt.getList("Items", Tag.TAG_COMPOUND) .forEach(inbt -> items.add(TransportedItemStack.read((CompoundTag) inbt))); + if (nbt.contains("LazyItem")) + lazyClientItem = TransportedItemStack.read(nbt.getCompound("LazyItem")); beltMovementPositive = nbt.getBoolean("PositiveOrder"); } @@ -398,6 +416,8 @@ public class BeltInventory { ListTag itemsNBT = new ListTag(); items.forEach(stack -> itemsNBT.add(stack.serializeNBT())); nbt.put("Items", itemsNBT); + if (lazyClientItem != null) + nbt.put("LazyItem", lazyClientItem.serializeNBT()); nbt.putBoolean("PositiveOrder", beltMovementPositive); return nbt; } @@ -456,4 +476,9 @@ public class BeltInventory { return items; } + @Nullable + public TransportedItemStack getLazyClientItem() { + return lazyClientItem; + } + } diff --git a/src/main/java/com/simibubi/create/content/logistics/item/box/PackageDestroyPacket.java b/src/main/java/com/simibubi/create/content/logistics/item/box/PackageDestroyPacket.java index 9c22deacbf..32744d0f11 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/box/PackageDestroyPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/box/PackageDestroyPacket.java @@ -1,7 +1,5 @@ package com.simibubi.create.content.logistics.item.box; -import java.util.function.Supplier; - import com.simibubi.create.Create; import com.simibubi.create.foundation.networking.SimplePacketBase; import com.simibubi.create.foundation.utility.VecHelper; @@ -12,7 +10,7 @@ import net.minecraft.core.particles.ParticleTypes; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.item.ItemStack; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.network.NetworkEvent; +import net.minecraftforge.network.NetworkEvent.Context; public class PackageDestroyPacket extends SimplePacketBase { @@ -37,10 +35,9 @@ public class PackageDestroyPacket extends SimplePacketBase { buffer.writeDouble(location.z); buffer.writeItem(box); } - + @Override - public void handle(Supplier context) { - NetworkEvent.Context ctx = context.get(); + public boolean handle(Context ctx) { ctx.enqueueWork(() -> { for (int i = 0; i < 20; i++) { Vec3 pos = VecHelper.offsetRandomly(location, Create.RANDOM, .5f); @@ -49,7 +46,7 @@ public class PackageDestroyPacket extends SimplePacketBase { pos.z, motion.x, motion.y, motion.z); } }); - ctx.setPacketHandled(true); + return true; } } \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/content/logistics/item/box/PackageEntity.java b/src/main/java/com/simibubi/create/content/logistics/item/box/PackageEntity.java index de9e5e9d1f..22c3a6a5da 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/box/PackageEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/box/PackageEntity.java @@ -336,8 +336,8 @@ public class PackageEntity extends LivingEntity implements IEntityAdditionalSpaw } private void destroy(DamageSource source) { - AllPackets.channel.send(PacketDistributor.TRACKING_ENTITY.with(() -> this), - new PackageDestroyPacket(position(), box)); + AllPackets.getChannel() + .send(PacketDistributor.TRACKING_ENTITY.with(() -> this), new PackageDestroyPacket(position(), box)); this.level.playSound((Player) null, getX(), getY(), getZ(), SoundEvents.ARMOR_STAND_BREAK, this.getSoundSource(), 1.0F, 1.0F); this.dropAllDeathLoot(source); diff --git a/src/main/java/com/simibubi/create/content/logistics/item/box/PackageRenderer.java b/src/main/java/com/simibubi/create/content/logistics/item/box/PackageRenderer.java index fe9280ea4d..f9afc19d5a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/box/PackageRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/box/PackageRenderer.java @@ -2,7 +2,7 @@ package com.simibubi.create.content.logistics.item.box; import com.jozufozu.flywheel.core.PartialModel; import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.AllPartialModels; import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.AngleHelper; @@ -27,7 +27,7 @@ public class PackageRenderer extends EntityRenderer { ItemStack box = entity.box; if (box.isEmpty()) box = PackageItem.getFallbackBox(); - PartialModel model = AllBlockPartials.PACKAGES.get(box.getItem() + PartialModel model = AllPartialModels.PACKAGES.get(box.getItem() .getRegistryName()); SuperByteBuffer sbb = CachedBufferer.partial(model, Blocks.AIR.defaultBlockState()); sbb.translate(-.5, 0, -.5) From e9b5c01bc16477ac4483aaab27befac912277068 Mon Sep 17 00:00:00 2001 From: zelophed Date: Mon, 7 Aug 2023 15:35:30 +0200 Subject: [PATCH 009/515] update gradle version and buildscripts - also includes diverse leftover changes --- build.gradle | 13 +- gradle.properties | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- .../java/com/simibubi/create/AllKeys.java | 1 + .../animations/AnimatedItemDrain.java | 2 +- .../category/animations/AnimatedSpout.java | 6 +- .../fluids/actors/ItemDrainRenderer.java | 4 +- .../fluids/actors/SpoutRenderer.java | 4 +- .../fluids/tank/FluidTankRenderer.java | 2 +- .../processing/BasinRenderer.java | 3 +- .../wrench/RadialWrenchHandler.java | 49 ++++++ .../contraptions/wrench/RadialWrenchMenu.java | 142 ++++++++++++++++++ .../contraptions/wrench/package-info.java | 9 ++ .../simibubi/create/events/InputEvents.java | 6 +- .../foundation/data/CreateRegistrate.java | 3 +- 15 files changed, 226 insertions(+), 22 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchHandler.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchMenu.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/wrench/package-info.java diff --git a/build.gradle b/build.gradle index bcb70cf8fb..43edb4c667 100644 --- a/build.gradle +++ b/build.gradle @@ -69,7 +69,8 @@ minecraft { arg '-mixin.config=catnip.mixins.json' } - //jvmArgs("-XX:+IgnoreUnrecognizedVMOptions", "-XX:+AllowEnhancedClassRedefinition") // uncomment with jbr + jvmArgs("-XX:-OmitStackTraceInFastThrow") // uncomment when you get exceptions with null messages etc + jvmArgs("-XX:+IgnoreUnrecognizedVMOptions", "-XX:+AllowEnhancedClassRedefinition") // uncomment with jbr //jvmArgs '-XX:+UnlockCommercialFeatures' // uncomment for profiling property 'forge.logging.console.level', 'info' mods { @@ -283,8 +284,8 @@ mixin { // Workaround for SpongePowered/MixinGradle#38 afterEvaluate { - tasks.configureReobfTaskForReobfJar.mustRunAfter(tasks.compileJava) - tasks.configureReobfTaskForReobfJarJar.mustRunAfter(tasks.compileJava) + //tasks.configureReobfTaskForReobfJar.mustRunAfter(tasks.compileJava) + //tasks.configureReobfTaskForReobfJarJar.mustRunAfter(tasks.compileJava) } tasks.withType(JavaCompile).configureEach { @@ -296,13 +297,13 @@ compileJava { } jar { - classifier = 'slim' + archiveClassifier = 'slim' manifest { attributes([ 'Specification-Title': 'create', 'Specification-Vendor': 'simibubi', 'Specification-Version': '1', - 'Implementation-Title': project.jar.baseName, + 'Implementation-Title': archiveBaseName, 'Implementation-Version': project.jar.archiveVersion, 'Implementation-Vendor': 'simibubi', 'Implementation-Timestamp': new Date().format("yyyy-MM-dd'T'HH:mm:ssZ"), @@ -314,7 +315,7 @@ jar { task jarJarRelease { doLast { tasks.jarJar { - classifier = '' + archiveClassifier = '' } } finalizedBy tasks.jarJar diff --git a/gradle.properties b/gradle.properties index cc0b944de9..bd716da6e7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,7 +11,7 @@ minecraft_version = 1.18.2 forge_version = 40.1.60 # build dependency versions -forgegradle_version = 5.1.53 +forgegradle_version = 6.+ mixingradle_version = 0.7-SNAPSHOT mixin_version = 0.8.5 librarian_version = 1.+ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index aa991fceae..fae08049a6 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/src/main/java/com/simibubi/create/AllKeys.java b/src/main/java/com/simibubi/create/AllKeys.java index 8da43a2c8b..666f7279bf 100644 --- a/src/main/java/com/simibubi/create/AllKeys.java +++ b/src/main/java/com/simibubi/create/AllKeys.java @@ -14,6 +14,7 @@ public enum AllKeys { TOOL_MENU("toolmenu", GLFW.GLFW_KEY_LEFT_ALT), ACTIVATE_TOOL("", GLFW.GLFW_KEY_LEFT_CONTROL), TOOLBELT("toolbelt", GLFW.GLFW_KEY_LEFT_ALT), + ROTATE_MENU("rotate_menu", GLFW.GLFW_KEY_B), ; diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedItemDrain.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedItemDrain.java index 21b4722a2f..77208dcea5 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedItemDrain.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedItemDrain.java @@ -40,7 +40,7 @@ public class AnimatedItemDrain extends AnimatedKinetics { ms.scale(scale, scale, scale); float from = 2/16f; float to = 1f - from; - FluidRenderer.renderFluidBox(fluid, from, from, from, to, 3/4f, to, buffer, ms, LightTexture.FULL_BRIGHT, false); + FluidRenderer.renderFluidBox(fluid.getFluid(), fluid.getAmount(), from, from, from, to, 3/4f, to, buffer, ms, LightTexture.FULL_BRIGHT, false); buffer.endBatch(); matrixStack.popPose(); diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSpout.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSpout.java index 86017412af..60184df0f9 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSpout.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSpout.java @@ -73,7 +73,8 @@ public class AnimatedSpout extends AnimatedKinetics { matrixStack.scale(16, 16, 16); float from = 3f / 16f; float to = 17f / 16f; - FluidRenderer.renderFluidBox(fluids.get(0), from, from, from, to, to, to, buffer, matrixStack, LightTexture.FULL_BRIGHT, false); + FluidStack fluidStack = fluids.get(0); + FluidRenderer.renderFluidBox(fluidStack.getFluid(), fluidStack.getAmount(), from, from, from, to, to, to, buffer, matrixStack, LightTexture.FULL_BRIGHT, false); matrixStack.popPose(); float width = 1 / 128f * squeeze; @@ -83,8 +84,7 @@ public class AnimatedSpout extends AnimatedKinetics { matrixStack.translate(-0.5f, 0, -0.5f); from = -width / 2 + 0.5f; to = width / 2 + 0.5f; - FluidRenderer.renderFluidBox(fluids.get(0), from, 0, from, to, 2, to, buffer, matrixStack, LightTexture.FULL_BRIGHT, - false); + FluidRenderer.renderFluidBox(fluidStack.getFluid(), fluidStack.getAmount(), from, 0, from, to, 2, to, buffer, matrixStack, LightTexture.FULL_BRIGHT, false); buffer.endBatch(); Lighting.setupFor3DItems(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainRenderer.java index fd5d4ec895..dfef7be46c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainRenderer.java @@ -149,7 +149,7 @@ public class ItemDrainRenderer extends SmartTileEntityRenderer { float yOffset = (11 / 16f) * level; ms.pushPose(); ms.translate(0, yOffset, 0); - FluidRenderer.renderFluidBox(fluidStack, min, min - yOffset, min, max, min, max, buffer, ms, light, + FluidRenderer.renderFluidBox(fluidStack.getFluid(), fluidStack.getAmount(), min, min - yOffset, min, max, min, max, buffer, ms, light, false); ms.popPose(); } @@ -58,7 +58,7 @@ public class SpoutRenderer extends SafeTileEntityRenderer { if (processingTicks != -1) { radius = (float) (Math.pow(((2 * processingProgress) - 1), 2) - 1); AABB bb = new AABB(0.5, .5, 0.5, 0.5, -1.2, 0.5).inflate(radius / 32f); - FluidRenderer.renderFluidBox(fluidStack, (float) bb.minX, (float) bb.minY, (float) bb.minZ, + FluidRenderer.renderFluidBox(fluidStack.getFluid(), fluidStack.getAmount(), (float) bb.minX, (float) bb.minY, (float) bb.minZ, (float) bb.maxX, (float) bb.maxY, (float) bb.maxZ, buffer, ms, light, true); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankRenderer.java index ba946a9e84..a404380b39 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankRenderer.java @@ -73,7 +73,7 @@ public class FluidTankRenderer extends SafeTileEntityRenderer { float partial = Mth.clamp(units / totalUnits, 0, 1); xMax += partial * 12 / 16f; - FluidRenderer.renderFluidBox(renderedFluid, xMin, yMin, zMin, xMax, yMax, zMax, buffer, ms, light, - false); + FluidRenderer.renderFluidBox(renderedFluid.getFluid(), renderedFluid.getAmount(), xMin, yMin, zMin, xMax, yMax, zMax, buffer, ms, light, false); xMin = xMax; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchHandler.java b/src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchHandler.java new file mode 100644 index 0000000000..5212dd9793 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchHandler.java @@ -0,0 +1,49 @@ +package com.simibubi.create.content.contraptions.wrench; + +import com.simibubi.create.AllItems; +import com.simibubi.create.AllKeys; + +import net.createmod.catnip.gui.ScreenOpener; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.GameType; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.HitResult; + +public class RadialWrenchHandler { + + public static void onKeyInput(int key, boolean pressed) { + Minecraft mc = Minecraft.getInstance(); + if (mc.gameMode == null || mc.gameMode.getPlayerMode() == GameType.SPECTATOR) + return; + + if (key != AllKeys.ROTATE_MENU.getBoundCode()) + return; + + LocalPlayer player = mc.player; + if (player == null) + return; + + Level level = player.level; + + ItemStack heldItem = player.getMainHandItem(); + if (heldItem.getItem() != AllItems.WRENCH.get()) + return; + + HitResult objectMouseOver = mc.hitResult; + if (!(objectMouseOver instanceof BlockHitResult blockHitResult)) + return; + + BlockState state = level.getBlockState(blockHitResult.getBlockPos()); + + if (!(state.getBlock() instanceof IWrenchable)) + return; + + ScreenOpener.open(new RadialWrenchMenu(state)); + + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchMenu.java b/src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchMenu.java new file mode 100644 index 0000000000..702d4d20e3 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchMenu.java @@ -0,0 +1,142 @@ +package com.simibubi.create.content.contraptions.wrench; + +import java.util.ArrayList; +import java.util.List; + +import com.mojang.blaze3d.platform.InputConstants; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Quaternion; +import com.mojang.math.Vector3f; +import com.simibubi.create.AllKeys; +import com.simibubi.create.content.contraptions.base.DirectionalKineticBlock; +import com.simibubi.create.content.contraptions.base.HorizontalAxisKineticBlock; +import com.simibubi.create.content.contraptions.base.HorizontalKineticBlock; +import com.simibubi.create.content.contraptions.base.RotatedPillarKineticBlock; + +import net.createmod.catnip.gui.AbstractSimiScreen; +import net.createmod.catnip.gui.RadialMenu; +import net.createmod.catnip.gui.element.GuiGameElement; +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.theme.Color; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.Property; +import net.minecraft.world.phys.Vec3; + +public class RadialWrenchMenu extends AbstractSimiScreen { + + private static final List> properties = List.of( + RotatedPillarKineticBlock.AXIS, + DirectionalKineticBlock.FACING, + HorizontalAxisKineticBlock.HORIZONTAL_AXIS, + HorizontalKineticBlock.HORIZONTAL_FACING + ); + + private final BlockState state; + private List allStates = List.of(); + private RadialMenu radialMenu; + private int ticksOpen; + + public RadialWrenchMenu(BlockState state) { + this.state = state; + + if (!(state.getBlock() instanceof IWrenchable wrenchable)) + return; + + allStates = getRotatedStates(state); + /*allStates = Stream.concat(Arrays.stream(Iterate.directions) + .map(dir -> wrenchable.getRotatedBlockState(state, dir)), + Stream.of(state) + ).distinct().toList();*/ + + radialMenu = new RadialMenu(allStates.size()); + } + + public static List getRotatedStates(BlockState state) { + List states = new ArrayList<>(); + states.add(state); + + for (Property property : properties) { + if (state.hasProperty(property)) { + cycleAllPropertyValues(property, states); + } + } + + return states; + } + + private static void cycleAllPropertyValues(Property property, List states) { + while (true) { + BlockState lastState = states.get(states.size() - 1); + BlockState cycledState = lastState.cycle(property); + + if (states.contains(cycledState)) + break; + + states.add(cycledState); + } + } + + @Override + public void tick() { + ticksOpen++; + + super.tick(); + } + + @Override + protected void renderWindow(PoseStack ms, int mouseX, int mouseY, float partialTicks) { + int x = this.width / 2; + int y = this.height / 2; + + LocalPlayer player = Minecraft.getInstance().player; + + Vec3 lookAngle = player.getLookAngle(); + Quaternion quaternion = Quaternion.fromXYZDegrees(new Vector3f(player.getXRot(), player.getYRot(), 0)); + + ms.pushPose(); + ms.translate(x, y, 0); + + ms.pushPose(); + + radialMenu.draw(ms, allStates + .stream() + .map(state -> GuiGameElement.of(state) + .rotateBlock(player.getXRot(), player.getYRot() + 180, 0f) + .scale(24) + ).toList() + ); + + ms.popPose(); + + if (allStates.size() <= 1) { + GuiGameElement.of(state) + .rotateBlock(player.getXRot(), player.getYRot(), 0f) + .scale(24) + .render(ms); + } + + ms.popPose(); + + } + + @Override + public void renderBackground(PoseStack p_238651_1_, int p_238651_2_) { + Color color = new Color(0x50_101010) + .scaleAlpha(Math.min(1, (ticksOpen + AnimationTickHolder.getPartialTicks()) / 20f)); + + fillGradient(p_238651_1_, 0, 0, this.width, this.height, color.getRGB(), color.getRGB()); + } + + @Override + public boolean keyReleased(int code, int scanCode, int modifiers) { + InputConstants.Key mouseKey = InputConstants.getKey(code, scanCode); + if (AllKeys.ROTATE_MENU.getKeybind().isActiveAndMatches(mouseKey)) { + onClose(); + return true; + } + return super.keyReleased(code, scanCode, modifiers); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/wrench/package-info.java b/src/main/java/com/simibubi/create/content/contraptions/wrench/package-info.java new file mode 100644 index 0000000000..24b04c90e1 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/wrench/package-info.java @@ -0,0 +1,9 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +@FieldsAreNonnullByDefault +package com.simibubi.create.content.contraptions.wrench; + +import javax.annotation.ParametersAreNonnullByDefault; + +import net.minecraft.FieldsAreNonnullByDefault; +import net.minecraft.MethodsReturnNonnullByDefault; diff --git a/src/main/java/com/simibubi/create/events/InputEvents.java b/src/main/java/com/simibubi/create/events/InputEvents.java index b40b720cd7..0e688c6696 100644 --- a/src/main/java/com/simibubi/create/events/InputEvents.java +++ b/src/main/java/com/simibubi/create/events/InputEvents.java @@ -1,7 +1,10 @@ package com.simibubi.create.events; +import org.lwjgl.glfw.GLFW; + import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.components.structureMovement.interaction.controls.TrainHUD; +import com.simibubi.create.content.contraptions.wrench.RadialWrenchHandler; import com.simibubi.create.content.curiosities.toolbox.ToolboxHandlerClient; import com.simibubi.create.content.logistics.item.LinkedControllerClientHandler; import com.simibubi.create.content.logistics.trains.entity.TrainRelocator; @@ -28,10 +31,11 @@ public class InputEvents { return; int key = event.getKey(); - boolean pressed = !(event.getAction() == 0); + boolean pressed = event.getAction() != GLFW.GLFW_RELEASE; CreateClient.SCHEMATIC_HANDLER.onKeyInput(key, pressed); ToolboxHandlerClient.onKeyInput(key, pressed); + RadialWrenchHandler.onKeyInput(key, pressed); } @SubscribeEvent diff --git a/src/main/java/com/simibubi/create/foundation/data/CreateRegistrate.java b/src/main/java/com/simibubi/create/foundation/data/CreateRegistrate.java index 490be08761..3b12125f62 100644 --- a/src/main/java/com/simibubi/create/foundation/data/CreateRegistrate.java +++ b/src/main/java/com/simibubi/create/foundation/data/CreateRegistrate.java @@ -98,8 +98,7 @@ public class CreateRegistrate extends AbstractRegistrate { public AllSections getSection(IForgeRegistryEntry entry) { return sectionLookup.entrySet() .stream() - .filter(e -> e.getKey() - .get() == entry) + .filter(e -> e.getKey().get() == entry) .map(Entry::getValue) .findFirst() .orElse(AllSections.UNASSIGNED); From 9098002c170ab8cd9e204e53f409421582a16e8d Mon Sep 17 00:00:00 2001 From: zelophed Date: Sun, 13 Aug 2023 23:39:10 +0200 Subject: [PATCH 010/515] Wait it's all Flywheel? Always has been. - add flywheel as a dependency to catnip --- .../com/simibubi/create/CreateClient.java | 9 +- .../animations/AnimatedBlazeBurner.java | 4 +- .../category/animations/AnimatedKinetics.java | 3 +- .../ContraptionControlsRenderer.java | 6 +- .../actors/harvester/HarvesterRenderer.java | 6 +- .../psi/PortableStorageInterfaceRenderer.java | 6 +- .../actors/roller/RollerRenderer.java | 10 +- .../trainControls/ControlsRenderer.java | 6 +- .../contraptions/bearing/BearingRenderer.java | 6 +- .../StabilizedBearingMovementBehaviour.java | 4 +- .../contraptions/chassis/StickerRenderer.java | 4 +- .../elevator/ElevatorPulleyRenderer.java | 10 +- .../gantry/GantryCarriageRenderer.java | 4 +- .../minecart/CouplingRenderer.java | 8 +- .../pulley/AbstractPulleyRenderer.java | 8 +- .../contraptions/pulley/PulleyRenderer.java | 6 +- .../render/ContraptionRenderDispatcher.java | 4 +- .../slidingDoor/SlidingDoorRenderer.java | 7 +- .../steamWhistle/WhistleRenderer.java | 4 +- .../equipment/armor/BacktankArmorLayer.java | 7 +- .../equipment/armor/BacktankRenderer.java | 6 +- .../content/equipment/bell/BellRenderer.java | 4 +- .../blueprint/BlueprintRenderer.java | 4 +- .../equipment/blueprint/BlueprintScreen.java | 3 +- .../symmetryWand/SymmetryWandScreen.java | 3 +- .../equipment/toolbox/ToolboxRenderer.java | 6 +- .../equipment/toolbox/ToolboxScreen.java | 5 +- .../fluids/hosePulley/HosePulleyRenderer.java | 6 +- .../pipes/valve/FluidValveRenderer.java | 4 +- .../content/fluids/pump/PumpRenderer.java | 4 +- .../content/fluids/spout/SpoutRenderer.java | 4 +- .../fluids/tank/FluidTankRenderer.java | 6 +- .../base/KineticBlockEntityRenderer.java | 6 +- .../content/kinetics/belt/BeltRenderer.java | 6 +- .../kinetics/clock/CuckooClockRenderer.java | 14 +- .../crafter/MechanicalCrafterRenderer.java | 6 +- .../kinetics/crank/HandCrankBlockEntity.java | 4 +- .../crank/ValveHandleBlockEntity.java | 4 +- .../kinetics/deployer/DeployerRenderer.java | 13 +- .../content/kinetics/drill/DrillRenderer.java | 6 +- .../kinetics/fan/EncasedFanRenderer.java | 6 +- .../kinetics/flywheel/FlywheelRenderer.java | 4 +- .../content/kinetics/gauge/GaugeRenderer.java | 6 +- .../kinetics/gearbox/GearboxRenderer.java | 4 +- .../kinetics/mechanicalArm/ArmRenderer.java | 16 +- .../kinetics/millstone/MillstoneRenderer.java | 4 +- .../mixer/MechanicalMixerRenderer.java | 8 +- .../kinetics/motor/CreativeMotorRenderer.java | 4 +- .../press/MechanicalPressRenderer.java | 4 +- .../content/kinetics/saw/SawRenderer.java | 17 +- .../BracketedKineticBlockEntityRenderer.java | 6 +- .../encased/EncasedCogRenderer.java | 6 +- .../SpeedControllerRenderer.java | 7 +- .../steamEngine/SteamEngineRenderer.java | 4 +- .../transmission/SplitShaftRenderer.java | 4 +- .../waterwheel/WaterWheelInstance.java | 4 +- .../waterwheel/WaterWheelRenderer.java | 4 +- .../logistics/depot/EjectorRenderer.java | 10 +- .../logistics/funnel/FunnelRenderer.java | 4 +- .../logistics/tunnel/BeltTunnelRenderer.java | 4 +- .../burner/BlazeBurnerRenderer.java | 14 +- .../analogLever/AnalogLeverRenderer.java | 6 +- .../redstone/diodes/BrassDiodeRenderer.java | 4 +- .../displayLink/DisplayLinkRenderer.java | 6 +- .../redstone/nixieTube/NixieTubeRenderer.java | 10 +- .../cannon/SchematicannonRenderer.java | 6 +- .../schematics/client/SchematicRenderer.java | 4 +- .../content/trains/bogey/BogeyRenderer.java | 13 +- .../trains/display/FlapDisplayRenderer.java | 4 +- .../entity/CarriageCouplingRenderer.java | 8 +- .../trains/schedule/TrainHatArmorLayer.java | 4 +- .../content/trains/signal/SignalRenderer.java | 6 +- .../trains/station/AbstractStationScreen.java | 3 +- .../trains/station/StationRenderer.java | 6 +- .../content/trains/track/TrackRenderer.java | 10 +- .../trains/track/TrackTargetingBehaviour.java | 4 +- .../block/connected/CTSpriteShiftEntry.java | 4 +- .../block/connected/CTSpriteShifter.java | 7 +- .../foundation/events/ClientEvents.java | 4 +- .../gui/element/PartialModelGuiElement.java | 22 - .../foundation/ponder/CreatePonderTag.java | 93 ---- .../render/BlockEntityRenderHelper.java | 3 +- .../render/CachedPartialBuffers.java | 80 --- .../render/FlwSuperBufferFactory.java | 33 -- .../foundation/render/FlwSuperByteBuffer.java | 476 ------------------ .../foundation/render/ForcedDiffuseState.java | 31 -- .../command/ClearBufferCacheCommand.java | 2 + 87 files changed, 239 insertions(+), 986 deletions(-) delete mode 100644 src/main/java/com/simibubi/create/foundation/gui/element/PartialModelGuiElement.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/CreatePonderTag.java delete mode 100644 src/main/java/com/simibubi/create/foundation/render/CachedPartialBuffers.java delete mode 100644 src/main/java/com/simibubi/create/foundation/render/FlwSuperBufferFactory.java delete mode 100644 src/main/java/com/simibubi/create/foundation/render/FlwSuperByteBuffer.java delete mode 100644 src/main/java/com/simibubi/create/foundation/render/ForcedDiffuseState.java diff --git a/src/main/java/com/simibubi/create/CreateClient.java b/src/main/java/com/simibubi/create/CreateClient.java index 27ef263a15..e53efde58d 100644 --- a/src/main/java/com/simibubi/create/CreateClient.java +++ b/src/main/java/com/simibubi/create/CreateClient.java @@ -26,16 +26,14 @@ import com.simibubi.create.content.trains.track.TrackPlacementOverlay; import com.simibubi.create.foundation.ClientResourceReloadListener; import com.simibubi.create.foundation.blockEntity.behaviour.ValueSettingsClient; import com.simibubi.create.foundation.ponder.CreatePonderPlugin; -import com.simibubi.create.foundation.render.CachedPartialBuffers; import com.simibubi.create.foundation.render.CreateContexts; -import com.simibubi.create.foundation.render.FlwSuperBufferFactory; import com.simibubi.create.foundation.utility.ModelSwapper; import com.simibubi.create.infrastructure.config.AllConfigs; import com.simibubi.create.infrastructure.gui.CreateMainMenuScreen; import net.createmod.catnip.config.ui.BaseConfigScreen; import net.createmod.catnip.config.ui.ConfigScreen; -import net.createmod.catnip.render.SuperBufferFactory; +import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBufferCache; import net.createmod.catnip.utility.lang.Components; import net.createmod.ponder.foundation.PonderIndex; @@ -91,10 +89,9 @@ public class CreateClient { //BUFFER_CACHE.registerCompartment(WaterWheelRenderer.WATER_WHEEL); //BUFFER_CACHE.registerCompartment(SBBContraptionManager.CONTRAPTION, 20); //BUFFER_CACHE.registerCompartment(WorldSectionElement.DOC_WORLD_SECTION, 20); - SuperBufferFactory.setInstance(new FlwSuperBufferFactory()); - SuperByteBufferCache.getInstance().registerCompartment(CachedPartialBuffers.PARTIAL); - SuperByteBufferCache.getInstance().registerCompartment(CachedPartialBuffers.DIRECTIONAL_PARTIAL); + SuperByteBufferCache.getInstance().registerCompartment(CachedBuffers.PARTIAL); + SuperByteBufferCache.getInstance().registerCompartment(CachedBuffers.DIRECTIONAL_PARTIAL); SuperByteBufferCache.getInstance().registerCompartment(KineticBlockEntityRenderer.KINETIC_BLOCK); SuperByteBufferCache.getInstance().registerCompartment(WaterWheelRenderer.WATER_WHEEL); SuperByteBufferCache.getInstance().registerCompartment(SBBContraptionManager.CONTRAPTION, 20); diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedBlazeBurner.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedBlazeBurner.java index 976db5e56d..aee43dee4a 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedBlazeBurner.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedBlazeBurner.java @@ -8,8 +8,8 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.AllPartialModels; import com.simibubi.create.AllSpriteShifts; import com.simibubi.create.content.processing.burner.BlazeBurnerBlock.HeatLevel; -import com.simibubi.create.foundation.render.CachedPartialBuffers; +import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SpriteShiftEntry; import net.createmod.catnip.utility.AnimationTickHolder; import net.createmod.ponder.utility.WorldTickHolder; @@ -87,7 +87,7 @@ public class AnimatedBlazeBurner extends AnimatedKinetics { MultiBufferSource.BufferSource buffer = mc.renderBuffers() .bufferSource(); VertexConsumer vb = buffer.getBuffer(RenderType.cutoutMipped()); - CachedPartialBuffers.partial(AllPartialModels.BLAZE_BURNER_FLAME, Blocks.AIR.defaultBlockState()) + CachedBuffers.partial(AllPartialModels.BLAZE_BURNER_FLAME, Blocks.AIR.defaultBlockState()) .shiftUVScrolling(spriteShift, (float) uScroll, (float) vScroll) .light(LightTexture.FULL_BRIGHT) .renderInto(matrixStack, vb); diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedKinetics.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedKinetics.java index 6efb3824c8..04bacddff5 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedKinetics.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedKinetics.java @@ -4,7 +4,6 @@ import com.jozufozu.flywheel.core.PartialModel; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllPartialModels; import com.simibubi.create.foundation.gui.CustomLightingSettings; -import com.simibubi.create.foundation.gui.element.PartialModelGuiElement; import mezz.jei.api.gui.drawable.IDrawable; import net.createmod.catnip.gui.ILightingSettings; @@ -37,7 +36,7 @@ public abstract class AnimatedKinetics implements IDrawable { * Use {@link #blockElement(PartialModel)} if calling from inside a subclass. */ public static GuiGameElement.GuiRenderBuilder defaultBlockElement(PartialModel partial) { - return PartialModelGuiElement.of(partial) + return GuiGameElement.of(partial) .lighting(DEFAULT_LIGHTING); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/actors/contraptionControls/ContraptionControlsRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/actors/contraptionControls/ContraptionControlsRenderer.java index 5bff7c8f08..5b0cab3c94 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/actors/contraptionControls/ContraptionControlsRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/actors/contraptionControls/ContraptionControlsRenderer.java @@ -13,9 +13,9 @@ import com.simibubi.create.content.contraptions.behaviour.MovementContext; import com.simibubi.create.content.contraptions.render.ContraptionMatrices; import com.simibubi.create.content.redstone.nixieTube.NixieTubeRenderer; import com.simibubi.create.foundation.blockEntity.renderer.SmartBlockEntityRenderer; -import com.simibubi.create.foundation.render.CachedPartialBuffers; import com.simibubi.create.foundation.utility.DyeHelper; +import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.utility.Couple; import net.createmod.catnip.utility.VecHelper; import net.createmod.catnip.utility.math.AngleHelper; @@ -57,14 +57,14 @@ public class ContraptionControlsRenderer extends SmartBlockEntityRenderer drawCallback) { - SuperByteBuffer middle = CachedPartialBuffers.partial(getMiddleForState(blockState, lit), blockState); - SuperByteBuffer top = CachedPartialBuffers.partial(getTopForState(blockState), blockState); + SuperByteBuffer middle = CachedBuffers.partial(getMiddleForState(blockState, lit), blockState); + SuperByteBuffer top = CachedBuffers.partial(getTopForState(blockState), blockState); if (local != null) { middle.transform(local); diff --git a/src/main/java/com/simibubi/create/content/contraptions/actors/roller/RollerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/actors/roller/RollerRenderer.java index b3e7e49fae..1f67384a6a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/actors/roller/RollerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/actors/roller/RollerRenderer.java @@ -10,8 +10,8 @@ import com.simibubi.create.content.contraptions.behaviour.MovementContext; import com.simibubi.create.content.contraptions.render.ContraptionMatrices; import com.simibubi.create.content.contraptions.render.ContraptionRenderDispatcher; import com.simibubi.create.foundation.blockEntity.renderer.SmartBlockEntityRenderer; -import com.simibubi.create.foundation.render.CachedPartialBuffers; +import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.VecHelper; import net.createmod.catnip.utility.math.AngleHelper; @@ -37,7 +37,7 @@ public class RollerRenderer extends SmartBlockEntityRenderer ms.pushPose(); ms.translate(0, -0.25, 0); - SuperByteBuffer superBuffer = CachedPartialBuffers.partial(AllPartialModels.ROLLER_WHEEL, blockState); + SuperByteBuffer superBuffer = CachedBuffers.partial(AllPartialModels.ROLLER_WHEEL, blockState); Direction facing = blockState.getValue(RollerBlock.FACING); superBuffer.translate(Vec3.atLowerCornerOf(facing.getNormal()) .scale(17 / 16f)); @@ -48,7 +48,7 @@ public class RollerRenderer extends SmartBlockEntityRenderer .renderInto(ms, buffer.getBuffer(RenderType.cutoutMipped())); ms.popPose(); - CachedPartialBuffers.partial(AllPartialModels.ROLLER_FRAME, blockState) + CachedBuffers.partial(AllPartialModels.ROLLER_FRAME, blockState) .rotateCentered(Direction.UP, AngleHelper.rad(AngleHelper.horizontalAngle(facing) + 180)) .light(light) .renderInto(ms, buffer.getBuffer(RenderType.cutoutMipped())); @@ -58,7 +58,7 @@ public class RollerRenderer extends SmartBlockEntityRenderer ContraptionMatrices matrices, MultiBufferSource buffers) { BlockState blockState = context.state; Direction facing = blockState.getValue(HORIZONTAL_FACING); - SuperByteBuffer superBuffer = CachedPartialBuffers.partial(AllPartialModels.ROLLER_WHEEL, blockState); + SuperByteBuffer superBuffer = CachedBuffers.partial(AllPartialModels.ROLLER_WHEEL, blockState); float speed = (float) (!VecHelper.isVecPointingTowards(context.relativeMotion, facing.getOpposite()) ? context.getAnimationSpeed() : -context.getAnimationSpeed()); @@ -80,7 +80,7 @@ public class RollerRenderer extends SmartBlockEntityRenderer .renderInto(viewProjection, buffers.getBuffer(RenderType.cutoutMipped())); viewProjection.popPose(); - CachedPartialBuffers.partial(AllPartialModels.ROLLER_FRAME, blockState) + CachedBuffers.partial(AllPartialModels.ROLLER_FRAME, blockState) .transform(matrices.getModel()) .rotateCentered(Direction.UP, AngleHelper.rad(AngleHelper.horizontalAngle(facing) + 180)) .light(matrices.getWorld(), contraptionWorldLight) diff --git a/src/main/java/com/simibubi/create/content/contraptions/actors/trainControls/ControlsRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/actors/trainControls/ControlsRenderer.java index 2edd98f3c4..6c661e7830 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/actors/trainControls/ControlsRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/actors/trainControls/ControlsRenderer.java @@ -7,8 +7,8 @@ import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.contraptions.behaviour.MovementContext; import com.simibubi.create.content.contraptions.render.ContraptionMatrices; import com.simibubi.create.content.contraptions.render.ContraptionRenderDispatcher; -import com.simibubi.create.foundation.render.CachedPartialBuffers; +import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.Iterate; import net.createmod.catnip.utility.math.AngleHelper; @@ -25,7 +25,7 @@ public class ControlsRenderer { BlockState state = context.state; Direction facing = state.getValue(ControlsBlock.FACING); - SuperByteBuffer cover = CachedPartialBuffers.partial(AllPartialModels.TRAIN_CONTROLS_COVER, state); + SuperByteBuffer cover = CachedBuffers.partial(AllPartialModels.TRAIN_CONTROLS_COVER, state); float hAngle = 180 + AngleHelper.horizontalAngle(facing); PoseStack ms = matrices.getModel(); cover.transform(ms) @@ -39,7 +39,7 @@ public class ControlsRenderer { for (boolean first : Iterate.trueAndFalse) { float vAngle = (float) Mth.clamp(first ? firstLever * 70 - 25 : secondLever * 15, -45, 45); - SuperByteBuffer lever = CachedPartialBuffers.partial(AllPartialModels.TRAIN_CONTROLS_LEVER, state); + SuperByteBuffer lever = CachedBuffers.partial(AllPartialModels.TRAIN_CONTROLS_LEVER, state); ms.pushPose(); TransformStack.cast(ms) .centre() diff --git a/src/main/java/com/simibubi/create/content/contraptions/bearing/BearingRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/bearing/BearingRenderer.java index c18a429350..12fbdea7c1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/bearing/BearingRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/bearing/BearingRenderer.java @@ -6,8 +6,8 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.kinetics.base.KineticBlockEntity; import com.simibubi.create.content.kinetics.base.KineticBlockEntityRenderer; -import com.simibubi.create.foundation.render.CachedPartialBuffers; +import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.renderer.MultiBufferSource; @@ -35,7 +35,7 @@ public class BearingRenderer .getValue(BlockStateProperties.FACING); PartialModel top = be.isWoodenTop() ? AllPartialModels.BEARING_TOP_WOODEN : AllPartialModels.BEARING_TOP; - SuperByteBuffer superBuffer = CachedPartialBuffers.partial(top, be.getBlockState()); + SuperByteBuffer superBuffer = CachedBuffers.partial(top, be.getBlockState()); float interpolatedAngle = be.getInterpolatedAngle(partialTicks - 1); kineticRotationTransform(superBuffer, be, facing.getAxis(), (float) (interpolatedAngle / 180 * Math.PI), light); @@ -50,7 +50,7 @@ public class BearingRenderer @Override protected SuperByteBuffer getRotatedModel(KineticBlockEntity be, BlockState state) { - return CachedPartialBuffers.partialFacing(AllPartialModels.SHAFT_HALF, state, state + return CachedBuffers.partialFacing(AllPartialModels.SHAFT_HALF, state, state .getValue(BearingBlock.FACING) .getOpposite()); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/bearing/StabilizedBearingMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/bearing/StabilizedBearingMovementBehaviour.java index eae805fe4d..f99d24f798 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/bearing/StabilizedBearingMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/bearing/StabilizedBearingMovementBehaviour.java @@ -15,8 +15,8 @@ import com.simibubi.create.content.contraptions.behaviour.MovementContext; import com.simibubi.create.content.contraptions.render.ActorInstance; import com.simibubi.create.content.contraptions.render.ContraptionMatrices; import com.simibubi.create.content.contraptions.render.ContraptionRenderDispatcher; -import com.simibubi.create.foundation.render.CachedPartialBuffers; +import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.AnimationTickHolder; import net.minecraft.client.renderer.MultiBufferSource; @@ -44,7 +44,7 @@ public class StabilizedBearingMovementBehaviour implements MovementBehaviour { Direction facing = context.state.getValue(BlockStateProperties.FACING); PartialModel top = AllPartialModels.BEARING_TOP; - SuperByteBuffer superBuffer = CachedPartialBuffers.partial(top, context.state); + SuperByteBuffer superBuffer = CachedBuffers.partial(top, context.state); float renderPartialTicks = AnimationTickHolder.getPartialTicks(); // rotate to match blockstate diff --git a/src/main/java/com/simibubi/create/content/contraptions/chassis/StickerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/chassis/StickerRenderer.java index 7783bf126c..4947a4d15a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/chassis/StickerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/chassis/StickerRenderer.java @@ -4,8 +4,8 @@ import com.jozufozu.flywheel.backend.Backend; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllPartialModels; import com.simibubi.create.foundation.blockEntity.renderer.SafeBlockEntityRenderer; -import com.simibubi.create.foundation.render.CachedPartialBuffers; +import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.math.AngleHelper; import net.createmod.ponder.utility.WorldTickHolder; @@ -28,7 +28,7 @@ public class StickerRenderer extends SafeBlockEntityRenderer if (Backend.canUseInstancing(be.getLevel())) return; BlockState state = be.getBlockState(); - SuperByteBuffer head = CachedPartialBuffers.partial(AllPartialModels.STICKER_HEAD, state); + SuperByteBuffer head = CachedBuffers.partial(AllPartialModels.STICKER_HEAD, state); float offset = be.piston.getValue(WorldTickHolder.getPartialTicks(be.getLevel())); if (be.getLevel() != Minecraft.getInstance().level && !be.isVirtual()) diff --git a/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorPulleyRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorPulleyRenderer.java index 9add3a291b..697fedb707 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorPulleyRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorPulleyRenderer.java @@ -8,8 +8,8 @@ import com.simibubi.create.content.contraptions.pulley.AbstractPulleyRenderer; import com.simibubi.create.content.contraptions.pulley.PulleyRenderer; import com.simibubi.create.content.kinetics.base.KineticBlockEntity; import com.simibubi.create.content.kinetics.base.KineticBlockEntityRenderer; -import com.simibubi.create.foundation.render.CachedPartialBuffers; +import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SpriteShiftEntry; import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.math.AngleHelper; @@ -53,7 +53,7 @@ public class ElevatorPulleyRenderer extends KineticBlockEntityRenderer .75f) { @@ -110,7 +110,7 @@ public class ElevatorPulleyRenderer extends KineticBlockEntityRenderer exten BlockState blockState = be.getBlockState(); BlockPos pos = be.getBlockPos(); - SuperByteBuffer halfMagnet = CachedPartialBuffers.partial(this.halfMagnet, blockState); - SuperByteBuffer halfRope = CachedPartialBuffers.partial(this.halfRope, blockState); + SuperByteBuffer halfMagnet = CachedBuffers.partial(this.halfMagnet, blockState); + SuperByteBuffer halfRope = CachedBuffers.partial(this.halfRope, blockState); SuperByteBuffer magnet = renderMagnet(be); SuperByteBuffer rope = renderRope(be); @@ -108,7 +108,7 @@ public abstract class AbstractPulleyRenderer exten protected SuperByteBuffer getRotatedCoil(T be) { BlockState blockState = be.getBlockState(); - return CachedPartialBuffers.partialFacing(getCoil(), blockState, + return CachedBuffers.partialFacing(getCoil(), blockState, Direction.get(AxisDirection.POSITIVE, getShaftAxis(be))); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/pulley/PulleyRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/pulley/PulleyRenderer.java index a8c5fca98a..196a95bd64 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/pulley/PulleyRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/pulley/PulleyRenderer.java @@ -5,7 +5,7 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.contraptions.AbstractContraptionEntity; -import net.createmod.catnip.render.CachedBlockBuffers; +import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.minecraft.core.Direction.Axis; @@ -30,12 +30,12 @@ public class PulleyRenderer extends AbstractPulleyRenderer { @Override protected SuperByteBuffer renderRope(PulleyBlockEntity be) { - return CachedBlockBuffers.block(AllBlocks.ROPE.getDefaultState()); + return CachedBuffers.block(AllBlocks.ROPE.getDefaultState()); } @Override protected SuperByteBuffer renderMagnet(PulleyBlockEntity be) { - return CachedBlockBuffers.block(AllBlocks.PULLEY_MAGNET.getDefaultState()); + return CachedBuffers.block(AllBlocks.PULLEY_MAGNET.getDefaultState()); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionRenderDispatcher.java b/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionRenderDispatcher.java index c335bcdd05..13a464a96a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionRenderDispatcher.java @@ -24,8 +24,8 @@ import com.simibubi.create.content.contraptions.ContraptionWorld; import com.simibubi.create.content.contraptions.behaviour.MovementBehaviour; import com.simibubi.create.content.contraptions.behaviour.MovementContext; import com.simibubi.create.foundation.render.BlockEntityRenderHelper; -import com.simibubi.create.foundation.render.FlwSuperByteBuffer; +import net.createmod.catnip.render.ShadeSpearatingSuperByteBuffer; import net.createmod.catnip.render.SuperByteBuffer; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.LevelRenderer; @@ -176,7 +176,7 @@ public class ContraptionRenderDispatcher { .withBlocks(values) .withModelData(c.modelData) .build(); - SuperByteBuffer sbb = new FlwSuperByteBuffer(data); + SuperByteBuffer sbb = new ShadeSpearatingSuperByteBuffer(data); data.release(); return sbb; } diff --git a/src/main/java/com/simibubi/create/content/decoration/slidingDoor/SlidingDoorRenderer.java b/src/main/java/com/simibubi/create/content/decoration/slidingDoor/SlidingDoorRenderer.java index ddaea86b43..13271197e6 100644 --- a/src/main/java/com/simibubi/create/content/decoration/slidingDoor/SlidingDoorRenderer.java +++ b/src/main/java/com/simibubi/create/content/decoration/slidingDoor/SlidingDoorRenderer.java @@ -5,9 +5,8 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.simibubi.create.AllPartialModels; import com.simibubi.create.foundation.blockEntity.renderer.SafeBlockEntityRenderer; -import com.simibubi.create.foundation.render.CachedPartialBuffers; -import net.createmod.catnip.render.CachedBlockBuffers; +import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.Couple; import net.createmod.catnip.utility.Iterate; @@ -55,7 +54,7 @@ public class SlidingDoorRenderer extends SafeBlockEntityRenderer offset -= Math.sin(wiggleProgress * (2 * Mth.PI) * (4 - size.ordinal())) / 16f; } - CachedPartialBuffers.partial(mouth, blockState) + CachedBuffers.partial(mouth, blockState) .centre() .rotateY(AngleHelper.horizontalAngle(direction)) .unCentre() diff --git a/src/main/java/com/simibubi/create/content/equipment/armor/BacktankArmorLayer.java b/src/main/java/com/simibubi/create/content/equipment/armor/BacktankArmorLayer.java index bb1c0d0565..0cb49e352e 100644 --- a/src/main/java/com/simibubi/create/content/equipment/armor/BacktankArmorLayer.java +++ b/src/main/java/com/simibubi/create/content/equipment/armor/BacktankArmorLayer.java @@ -1,9 +1,8 @@ package com.simibubi.create.content.equipment.armor; import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.foundation.render.CachedPartialBuffers; -import net.createmod.catnip.render.CachedBlockBuffers; +import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.math.AngleHelper; import net.createmod.ponder.utility.WorldTickHolder; @@ -46,8 +45,8 @@ public class BacktankArmorLayer RenderType renderType = Sheets.cutoutBlockSheet(); BlockState renderedState = item.getBlock().defaultBlockState() .setValue(BacktankBlock.HORIZONTAL_FACING, Direction.SOUTH); - SuperByteBuffer backtank = CachedBlockBuffers.block(renderedState); - SuperByteBuffer cogs = CachedPartialBuffers.partial(BacktankRenderer.getCogsModel(renderedState), renderedState); + SuperByteBuffer backtank = CachedBuffers.block(renderedState); + SuperByteBuffer cogs = CachedBuffers.partial(BacktankRenderer.getCogsModel(renderedState), renderedState); ms.pushPose(); diff --git a/src/main/java/com/simibubi/create/content/equipment/armor/BacktankRenderer.java b/src/main/java/com/simibubi/create/content/equipment/armor/BacktankRenderer.java index 4470db564d..7d536636dd 100644 --- a/src/main/java/com/simibubi/create/content/equipment/armor/BacktankRenderer.java +++ b/src/main/java/com/simibubi/create/content/equipment/armor/BacktankRenderer.java @@ -5,8 +5,8 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.kinetics.base.KineticBlockEntityRenderer; -import com.simibubi.create.foundation.render.CachedPartialBuffers; +import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.math.AngleHelper; import net.createmod.ponder.utility.WorldTickHolder; @@ -27,7 +27,7 @@ public class BacktankRenderer extends KineticBlockEntityRenderer extends SafeBlockE Direction facing = state.getValue(BellBlock.FACING); BellAttachType attachment = state.getValue(BellBlock.ATTACHMENT); - SuperByteBuffer bell = CachedPartialBuffers.partial(be.getBellModel(), state); + SuperByteBuffer bell = CachedBuffers.partial(be.getBellModel(), state); if (be.isRinging) bell.rotateCentered(be.ringDirection.getCounterClockWise(), getSwingAngle(be.ringingTicks + partialTicks)); diff --git a/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintRenderer.java b/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintRenderer.java index 3fdc962dd3..e603483a43 100644 --- a/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintRenderer.java +++ b/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintRenderer.java @@ -6,8 +6,8 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Matrix3f; import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.equipment.blueprint.BlueprintEntity.BlueprintSection; -import com.simibubi.create.foundation.render.CachedPartialBuffers; +import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.Couple; import net.minecraft.client.Minecraft; @@ -33,7 +33,7 @@ public class BlueprintRenderer extends EntityRenderer { int light) { PartialModel partialModel = entity.size == 3 ? AllPartialModels.CRAFTING_BLUEPRINT_3x3 : entity.size == 2 ? AllPartialModels.CRAFTING_BLUEPRINT_2x2 : AllPartialModels.CRAFTING_BLUEPRINT_1x1; - SuperByteBuffer sbb = CachedPartialBuffers.partial(partialModel, Blocks.AIR.defaultBlockState()); + SuperByteBuffer sbb = CachedBuffers.partial(partialModel, Blocks.AIR.defaultBlockState()); sbb.rotateY(-yaw) .rotateX(90.0F + entity.getXRot()) .translate(-.5, -1 / 32f, -.5); diff --git a/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintScreen.java b/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintScreen.java index e67678bc5e..e99032ce43 100644 --- a/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintScreen.java +++ b/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintScreen.java @@ -14,7 +14,6 @@ import com.simibubi.create.content.logistics.filter.FilterScreenPacket; import com.simibubi.create.content.logistics.filter.FilterScreenPacket.Option; import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllIcons; -import com.simibubi.create.foundation.gui.element.PartialModelGuiElement; import com.simibubi.create.foundation.gui.menu.AbstractSimiContainerScreen; import com.simibubi.create.foundation.gui.widget.IconButton; import com.simibubi.create.foundation.utility.CreateLang; @@ -77,7 +76,7 @@ public class BlueprintScreen extends AbstractSimiContainerScreen background.render(ms, x, y, this); font.draw(ms, title, x + 15, y + 4, 0xFFFFFF); - PartialModelGuiElement.of(AllPartialModels.CRAFTING_BLUEPRINT_1x1).at(x + background.getWidth() + 20, y + background.getHeight() - 32, 0) .rotate(45, -45, 22.5f) .scale(40) diff --git a/src/main/java/com/simibubi/create/content/equipment/symmetryWand/SymmetryWandScreen.java b/src/main/java/com/simibubi/create/content/equipment/symmetryWand/SymmetryWandScreen.java index f9a2e12c56..670ffaee2b 100644 --- a/src/main/java/com/simibubi/create/content/equipment/symmetryWand/SymmetryWandScreen.java +++ b/src/main/java/com/simibubi/create/content/equipment/symmetryWand/SymmetryWandScreen.java @@ -10,7 +10,6 @@ import com.simibubi.create.content.equipment.symmetryWand.mirror.SymmetryMirror; import com.simibubi.create.content.equipment.symmetryWand.mirror.TriplePlaneMirror; import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllIcons; -import com.simibubi.create.foundation.gui.element.PartialModelGuiElement; import com.simibubi.create.foundation.gui.widget.IconButton; import com.simibubi.create.foundation.gui.widget.Label; import com.simibubi.create.foundation.gui.widget.ScrollInput; @@ -140,7 +139,7 @@ public class SymmetryWandScreen extends AbstractSimiScreen { ms.mulPose(new Vector3f(.3f, 1f, 0f).rotationDegrees(-22.5f)); currentElement.applyModelTransform(ms); // RenderSystem.multMatrix(ms.peek().getModel()); - PartialModelGuiElement.of(currentElement.getModel()) + GuiGameElement.of(currentElement.getModel()) .render(ms); ms.popPose(); diff --git a/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolboxRenderer.java b/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolboxRenderer.java index 6905240f40..f9420cb6c5 100644 --- a/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolboxRenderer.java +++ b/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolboxRenderer.java @@ -4,8 +4,8 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.simibubi.create.AllPartialModels; import com.simibubi.create.foundation.blockEntity.renderer.SmartBlockEntityRenderer; -import com.simibubi.create.foundation.render.CachedPartialBuffers; +import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.Iterate; import net.minecraft.client.renderer.MultiBufferSource; @@ -28,8 +28,8 @@ public class ToolboxRenderer extends SmartBlockEntityRenderer { .translate(0, -6 / 16f, 12 / 16f) .rotateX(-105 * menu.contentHolder.lid.getValue(partialTicks)) .translate(0, 6 / 16f, -12 / 16f); - PartialModelGuiElement.of(AllPartialModels.TOOLBOX_LIDS.get(color)) + GuiGameElement.of(AllPartialModels.TOOLBOX_LIDS.get(color)) .render(ms); ms.popPose(); @@ -150,7 +149,7 @@ public class ToolboxScreen extends AbstractSimiContainerScreen { ms.pushPose(); ms.translate(0, -offset * 1 / 8f, menu.contentHolder.drawers.getValue(partialTicks) * -.175f * (2 - offset)); - PartialModelGuiElement.of(AllPartialModels.TOOLBOX_DRAWER) + GuiGameElement.of(AllPartialModels.TOOLBOX_DRAWER) .render(ms); ms.popPose(); } diff --git a/src/main/java/com/simibubi/create/content/fluids/hosePulley/HosePulleyRenderer.java b/src/main/java/com/simibubi/create/content/fluids/hosePulley/HosePulleyRenderer.java index 2f9688c3e4..99d84f64ce 100644 --- a/src/main/java/com/simibubi/create/content/fluids/hosePulley/HosePulleyRenderer.java +++ b/src/main/java/com/simibubi/create/content/fluids/hosePulley/HosePulleyRenderer.java @@ -3,8 +3,8 @@ package com.simibubi.create.content.fluids.hosePulley; import com.jozufozu.flywheel.core.PartialModel; import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.contraptions.pulley.AbstractPulleyRenderer; -import com.simibubi.create.foundation.render.CachedPartialBuffers; +import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.minecraft.core.Direction.Axis; @@ -30,12 +30,12 @@ public class HosePulleyRenderer extends AbstractPulleyRenderer { @Override protected SuperByteBuffer getRotatedModel(PumpBlockEntity be, BlockState state) { - return CachedPartialBuffers.partialFacing(AllPartialModels.MECHANICAL_PUMP_COG, state); + return CachedBuffers.partialFacing(AllPartialModels.MECHANICAL_PUMP_COG, state); } } diff --git a/src/main/java/com/simibubi/create/content/fluids/spout/SpoutRenderer.java b/src/main/java/com/simibubi/create/content/fluids/spout/SpoutRenderer.java index efc63e214a..195fc52885 100644 --- a/src/main/java/com/simibubi/create/content/fluids/spout/SpoutRenderer.java +++ b/src/main/java/com/simibubi/create/content/fluids/spout/SpoutRenderer.java @@ -7,8 +7,8 @@ import com.simibubi.create.foundation.blockEntity.behaviour.fluid.SmartFluidTank import com.simibubi.create.foundation.blockEntity.behaviour.fluid.SmartFluidTankBehaviour.TankSegment; import com.simibubi.create.foundation.blockEntity.renderer.SafeBlockEntityRenderer; import com.simibubi.create.foundation.fluid.FluidRenderer; -import com.simibubi.create.foundation.render.CachedPartialBuffers; +import net.createmod.catnip.render.CachedBuffers; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; @@ -82,7 +82,7 @@ public class SpoutRenderer extends SafeBlockEntityRenderer { ms.pushPose(); for (PartialModel bit : BITS) { - CachedPartialBuffers.partial(bit, be.getBlockState()) + CachedBuffers.partial(bit, be.getBlockState()) .light(light) .renderInto(ms, buffer.getBuffer(RenderType.solid())); ms.translate(0, -3 * squeeze / 32f, 0); diff --git a/src/main/java/com/simibubi/create/content/fluids/tank/FluidTankRenderer.java b/src/main/java/com/simibubi/create/content/fluids/tank/FluidTankRenderer.java index 4b08035f57..b7f9426255 100644 --- a/src/main/java/com/simibubi/create/content/fluids/tank/FluidTankRenderer.java +++ b/src/main/java/com/simibubi/create/content/fluids/tank/FluidTankRenderer.java @@ -6,8 +6,8 @@ import com.mojang.blaze3d.vertex.VertexConsumer; import com.simibubi.create.AllPartialModels; import com.simibubi.create.foundation.blockEntity.renderer.SafeBlockEntityRenderer; import com.simibubi.create.foundation.fluid.FluidRenderer; -import com.simibubi.create.foundation.render.CachedPartialBuffers; +import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.utility.Iterate; import net.createmod.catnip.utility.animation.LerpedFloat; import net.minecraft.client.renderer.MultiBufferSource; @@ -90,13 +90,13 @@ public class FluidTankRenderer extends SafeBlockEntityRenderer extends Sa } protected SuperByteBuffer getRotatedModel(T be, BlockState state) { - return CachedBlockBuffers.block(KINETIC_BLOCK, state); + return CachedBuffers.block(KINETIC_BLOCK, state); } public static void renderRotatingKineticBlock(KineticBlockEntity be, BlockState renderedState, PoseStack ms, VertexConsumer buffer, int light) { - SuperByteBuffer superByteBuffer = CachedBlockBuffers.block(KINETIC_BLOCK, renderedState); + SuperByteBuffer superByteBuffer = CachedBuffers.block(KINETIC_BLOCK, renderedState); renderRotatingBuffer(be, superByteBuffer, ms, buffer, light); } diff --git a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltRenderer.java b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltRenderer.java index 7e46a4a88d..6fc97f8df8 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltRenderer.java +++ b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltRenderer.java @@ -15,9 +15,9 @@ import com.simibubi.create.AllSpriteShifts; import com.simibubi.create.content.kinetics.base.KineticBlockEntityRenderer; import com.simibubi.create.content.kinetics.belt.transport.TransportedItemStack; import com.simibubi.create.foundation.blockEntity.renderer.SafeBlockEntityRenderer; -import com.simibubi.create.foundation.render.CachedPartialBuffers; import com.simibubi.create.foundation.render.ShadowRenderHelper; +import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SpriteShiftEntry; import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.Iterate; @@ -95,7 +95,7 @@ public class BeltRenderer extends SafeBlockEntityRenderer { PartialModel beltPartial = getBeltPartial(diagonal, start, end, bottom); - SuperByteBuffer beltBuffer = CachedPartialBuffers.partial(beltPartial, blockState) + SuperByteBuffer beltBuffer = CachedBuffers.partial(beltPartial, blockState) .light(light); SpriteShiftEntry spriteShift = getSpriteShiftEntry(color, diagonal, bottom); @@ -140,7 +140,7 @@ public class BeltRenderer extends SafeBlockEntityRenderer { return stack; }; - SuperByteBuffer superBuffer = CachedPartialBuffers.partialDirectional(AllPartialModels.BELT_PULLEY, blockState, dir, matrixStackSupplier); + SuperByteBuffer superBuffer = CachedBuffers.partialDirectional(AllPartialModels.BELT_PULLEY, blockState, dir, matrixStackSupplier); KineticBlockEntityRenderer.standardKineticRotationTransform(superBuffer, be, light).renderInto(ms, vb); } } diff --git a/src/main/java/com/simibubi/create/content/kinetics/clock/CuckooClockRenderer.java b/src/main/java/com/simibubi/create/content/kinetics/clock/CuckooClockRenderer.java index bdd8bee89c..3c98b5625f 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/clock/CuckooClockRenderer.java +++ b/src/main/java/com/simibubi/create/content/kinetics/clock/CuckooClockRenderer.java @@ -6,8 +6,8 @@ import com.mojang.blaze3d.vertex.VertexConsumer; import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.kinetics.base.KineticBlockEntityRenderer; import com.simibubi.create.content.kinetics.clock.CuckooClockBlockEntity.Animation; -import com.simibubi.create.foundation.render.CachedPartialBuffers; +import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.renderer.MultiBufferSource; @@ -36,8 +36,8 @@ public class CuckooClockRenderer extends KineticBlockEntityRenderer @Override protected SuperByteBuffer getRotatedModel(DrillBlockEntity be, BlockState state) { - return CachedPartialBuffers.partialFacing(AllPartialModels.DRILL_HEAD, state); + return CachedBuffers.partialFacing(AllPartialModels.DRILL_HEAD, state); } public static void renderInContraption(MovementContext context, VirtualRenderWorld renderWorld, ContraptionMatrices matrices, MultiBufferSource buffer) { BlockState state = context.state; - SuperByteBuffer superBuffer = CachedPartialBuffers.partial(AllPartialModels.DRILL_HEAD, state); + SuperByteBuffer superBuffer = CachedBuffers.partial(AllPartialModels.DRILL_HEAD, state); Direction facing = state.getValue(DrillBlock.FACING); float speed = (float) (context.contraption.stalled diff --git a/src/main/java/com/simibubi/create/content/kinetics/fan/EncasedFanRenderer.java b/src/main/java/com/simibubi/create/content/kinetics/fan/EncasedFanRenderer.java index 63aebb703d..f2744282cb 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/fan/EncasedFanRenderer.java +++ b/src/main/java/com/simibubi/create/content/kinetics/fan/EncasedFanRenderer.java @@ -7,8 +7,8 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.kinetics.base.KineticBlockEntityRenderer; -import com.simibubi.create.foundation.render.CachedPartialBuffers; +import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.ponder.utility.WorldTickHolder; import net.minecraft.client.renderer.LevelRenderer; @@ -37,9 +37,9 @@ public class EncasedFanRenderer extends KineticBlockEntityRenderer { PartialModel partialModel = (type == Type.SPEED ? AllPartialModels.GAUGE_HEAD_SPEED : AllPartialModels.GAUGE_HEAD_STRESS); SuperByteBuffer headBuffer = - CachedPartialBuffers.partial(partialModel, gaugeState); - SuperByteBuffer dialBuffer = CachedPartialBuffers.partial(AllPartialModels.GAUGE_DIAL, gaugeState); + CachedBuffers.partial(partialModel, gaugeState); + SuperByteBuffer dialBuffer = CachedBuffers.partial(AllPartialModels.GAUGE_DIAL, gaugeState); float dialPivot = 5.75f / 16; float progress = Mth.lerp(partialTicks, gaugeBE.prevDialState, gaugeBE.dialState); diff --git a/src/main/java/com/simibubi/create/content/kinetics/gearbox/GearboxRenderer.java b/src/main/java/com/simibubi/create/content/kinetics/gearbox/GearboxRenderer.java index 5a87a77e20..9c68b2339d 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/gearbox/GearboxRenderer.java +++ b/src/main/java/com/simibubi/create/content/kinetics/gearbox/GearboxRenderer.java @@ -4,8 +4,8 @@ import com.jozufozu.flywheel.backend.Backend; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.kinetics.base.KineticBlockEntityRenderer; -import com.simibubi.create.foundation.render.CachedPartialBuffers; +import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.Iterate; import net.createmod.ponder.utility.WorldTickHolder; @@ -37,7 +37,7 @@ public class GearboxRenderer extends KineticBlockEntityRenderer { private void renderArm(VertexConsumer builder, PoseStack ms, PoseStack msLocal, TransformStack msr, BlockState blockState, int color, float baseAngle, float lowerArmAngle, float upperArmAngle, float headAngle, boolean goggles, boolean inverted, boolean hasItem, boolean isBlockItem, int light) { - SuperByteBuffer base = CachedPartialBuffers.partial(AllPartialModels.ARM_BASE, blockState) + SuperByteBuffer base = CachedBuffers.partial(AllPartialModels.ARM_BASE, blockState) .light(light); - SuperByteBuffer lowerBody = CachedPartialBuffers.partial(AllPartialModels.ARM_LOWER_BODY, blockState) + SuperByteBuffer lowerBody = CachedBuffers.partial(AllPartialModels.ARM_LOWER_BODY, blockState) .light(light); - SuperByteBuffer upperBody = CachedPartialBuffers.partial(AllPartialModels.ARM_UPPER_BODY, blockState) + SuperByteBuffer upperBody = CachedBuffers.partial(AllPartialModels.ARM_UPPER_BODY, blockState) .light(light); - SuperByteBuffer claw = CachedPartialBuffers + SuperByteBuffer claw = CachedBuffers .partial(goggles ? AllPartialModels.ARM_CLAW_BASE_GOGGLES : AllPartialModels.ARM_CLAW_BASE, blockState) .light(light); - SuperByteBuffer upperClawGrip = CachedPartialBuffers.partial(AllPartialModels.ARM_CLAW_GRIP_UPPER, + SuperByteBuffer upperClawGrip = CachedBuffers.partial(AllPartialModels.ARM_CLAW_GRIP_UPPER, blockState) .light(light); - SuperByteBuffer lowerClawGrip = CachedPartialBuffers.partial(AllPartialModels.ARM_CLAW_GRIP_LOWER, blockState) + SuperByteBuffer lowerClawGrip = CachedBuffers.partial(AllPartialModels.ARM_CLAW_GRIP_LOWER, blockState) .light(light); transformBase(msr, baseAngle); @@ -201,7 +201,7 @@ public class ArmRenderer extends KineticBlockEntityRenderer { @Override protected SuperByteBuffer getRotatedModel(ArmBlockEntity be, BlockState state) { - return CachedPartialBuffers.partial(AllPartialModels.ARM_COG, state); + return CachedBuffers.partial(AllPartialModels.ARM_COG, state); } } diff --git a/src/main/java/com/simibubi/create/content/kinetics/millstone/MillstoneRenderer.java b/src/main/java/com/simibubi/create/content/kinetics/millstone/MillstoneRenderer.java index 72c2f2f140..57bedbd36a 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/millstone/MillstoneRenderer.java +++ b/src/main/java/com/simibubi/create/content/kinetics/millstone/MillstoneRenderer.java @@ -2,8 +2,8 @@ package com.simibubi.create.content.kinetics.millstone; import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.kinetics.base.KineticBlockEntityRenderer; -import com.simibubi.create.foundation.render.CachedPartialBuffers; +import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.minecraft.world.level.block.state.BlockState; @@ -16,7 +16,7 @@ public class MillstoneRenderer extends KineticBlockEntityRenderer { rotate = true; } - SuperByteBuffer superBuffer = CachedPartialBuffers.partialFacing(partial, blockState); + SuperByteBuffer superBuffer = CachedBuffers.partialFacing(partial, blockState); if (rotate) { superBuffer.rotateCentered(Direction.UP, AngleHelper.rad(90)); } @@ -148,9 +147,9 @@ public class SawRenderer extends SafeBlockEntityRenderer { if (state.getValue(FACING) .getAxis() .isHorizontal()) - return CachedPartialBuffers.partialFacing(AllPartialModels.SHAFT_HALF, + return CachedBuffers.partialFacing(AllPartialModels.SHAFT_HALF, state.rotate(be.getLevel(), be.getBlockPos(), Rotation.CLOCKWISE_180)); - return CachedBlockBuffers.block(KineticBlockEntityRenderer.KINETIC_BLOCK, + return CachedBuffers.block(KineticBlockEntityRenderer.KINETIC_BLOCK, getRenderedBlockState(be)); } @@ -179,14 +178,14 @@ public class SawRenderer extends SafeBlockEntityRenderer { SuperByteBuffer superBuffer; if (SawBlock.isHorizontal(state)) { if (shouldAnimate) - superBuffer = CachedPartialBuffers.partial(AllPartialModels.SAW_BLADE_HORIZONTAL_ACTIVE, state); + superBuffer = CachedBuffers.partial(AllPartialModels.SAW_BLADE_HORIZONTAL_ACTIVE, state); else - superBuffer = CachedPartialBuffers.partial(AllPartialModels.SAW_BLADE_HORIZONTAL_INACTIVE, state); + superBuffer = CachedBuffers.partial(AllPartialModels.SAW_BLADE_HORIZONTAL_INACTIVE, state); } else { if (shouldAnimate) - superBuffer = CachedPartialBuffers.partial(AllPartialModels.SAW_BLADE_VERTICAL_ACTIVE, state); + superBuffer = CachedBuffers.partial(AllPartialModels.SAW_BLADE_VERTICAL_ACTIVE, state); else - superBuffer = CachedPartialBuffers.partial(AllPartialModels.SAW_BLADE_VERTICAL_INACTIVE, state); + superBuffer = CachedBuffers.partial(AllPartialModels.SAW_BLADE_VERTICAL_INACTIVE, state); } superBuffer.transform(matrices.getModel()) diff --git a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/BracketedKineticBlockEntityRenderer.java b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/BracketedKineticBlockEntityRenderer.java index 25f2dcce20..620878efcf 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/BracketedKineticBlockEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/BracketedKineticBlockEntityRenderer.java @@ -5,8 +5,8 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.kinetics.base.KineticBlockEntityRenderer; -import com.simibubi.create.foundation.render.CachedPartialBuffers; +import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.ponder.utility.WorldTickHolder; import net.minecraft.client.renderer.MultiBufferSource; @@ -41,12 +41,12 @@ public class BracketedKineticBlockEntityRenderer extends KineticBlockEntityRende Axis axis = getRotationAxisOf(be); Direction facing = Direction.fromAxisAndDirection(axis, AxisDirection.POSITIVE); renderRotatingBuffer(be, - CachedPartialBuffers.partialFacingVertical(AllPartialModels.SHAFTLESS_LARGE_COGWHEEL, be.getBlockState(), facing), + CachedBuffers.partialFacingVertical(AllPartialModels.SHAFTLESS_LARGE_COGWHEEL, be.getBlockState(), facing), ms, buffer.getBuffer(RenderType.solid()), light); float angle = getAngleForLargeCogShaft(be, axis); SuperByteBuffer shaft = - CachedPartialBuffers.partialFacingVertical(AllPartialModels.COGWHEEL_SHAFT, be.getBlockState(), facing); + CachedBuffers.partialFacingVertical(AllPartialModels.COGWHEEL_SHAFT, be.getBlockState(), facing); kineticRotationTransform(shaft, be, axis, angle, light); shaft.renderInto(ms, buffer.getBuffer(RenderType.solid())); diff --git a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogRenderer.java b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogRenderer.java index c1d67927c7..b701eb11c2 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogRenderer.java +++ b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogRenderer.java @@ -7,8 +7,8 @@ import com.simibubi.create.content.kinetics.base.IRotate; import com.simibubi.create.content.kinetics.base.KineticBlockEntityRenderer; import com.simibubi.create.content.kinetics.simpleRelays.BracketedKineticBlockEntityRenderer; import com.simibubi.create.content.kinetics.simpleRelays.SimpleKineticBlockEntity; -import com.simibubi.create.foundation.render.CachedPartialBuffers; +import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.Iterate; import net.minecraft.client.renderer.MultiBufferSource; @@ -59,7 +59,7 @@ public class EncasedCogRenderer extends KineticBlockEntityRenderer extends CutoutR } else { dir = state.getValue(WaterWheelBlock.FACING); } - PoseStack transform = CachedPartialBuffers.rotateToFaceVertical(dir).get(); + PoseStack transform = CachedBuffers.rotateToFaceVertical(dir).get(); return BlockModel.of(model, Blocks.AIR.defaultBlockState(), transform); }); } diff --git a/src/main/java/com/simibubi/create/content/kinetics/waterwheel/WaterWheelRenderer.java b/src/main/java/com/simibubi/create/content/kinetics/waterwheel/WaterWheelRenderer.java index 1024d66031..d97671c31c 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/waterwheel/WaterWheelRenderer.java +++ b/src/main/java/com/simibubi/create/content/kinetics/waterwheel/WaterWheelRenderer.java @@ -10,10 +10,10 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.kinetics.base.KineticBlockEntityRenderer; import com.simibubi.create.foundation.model.BakedModelHelper; -import com.simibubi.create.foundation.render.CachedPartialBuffers; import it.unimi.dsi.fastutil.objects.Reference2ReferenceOpenHashMap; import net.createmod.catnip.platform.CatnipServices; +import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperBufferFactory; import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.render.SuperByteBufferCache; @@ -69,7 +69,7 @@ public class WaterWheelRenderer extends Kinetic } else { dir = state1.getValue(WaterWheelBlock.FACING); } - PoseStack transform = CachedPartialBuffers.rotateToFaceVertical(dir).get(); + PoseStack transform = CachedBuffers.rotateToFaceVertical(dir).get(); return SuperBufferFactory.getInstance().createForBlock(model, Blocks.AIR.defaultBlockState(), transform); }); } diff --git a/src/main/java/com/simibubi/create/content/logistics/depot/EjectorRenderer.java b/src/main/java/com/simibubi/create/content/logistics/depot/EjectorRenderer.java index 5c708ca042..63ee719f47 100644 --- a/src/main/java/com/simibubi/create/content/logistics/depot/EjectorRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/depot/EjectorRenderer.java @@ -1,19 +1,19 @@ package com.simibubi.create.content.logistics.depot; import com.jozufozu.flywheel.backend.Backend; +import com.jozufozu.flywheel.util.transform.Rotate; import com.jozufozu.flywheel.util.transform.TransformStack; +import com.jozufozu.flywheel.util.transform.Translate; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.kinetics.base.KineticBlockEntity; import com.simibubi.create.content.kinetics.base.ShaftRenderer; -import com.simibubi.create.foundation.render.CachedPartialBuffers; +import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.IntAttached; import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.flw.Rotate; -import net.createmod.catnip.utility.flw.Translate; import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; @@ -46,7 +46,7 @@ public class EjectorRenderer extends ShaftRenderer { float angle = lidProgress * 70; if (!Backend.canUseInstancing(be.getLevel())) { - SuperByteBuffer model = CachedPartialBuffers.partial(AllPartialModels.EJECTOR_TOP, be.getBlockState()); + SuperByteBuffer model = CachedBuffers.partial(AllPartialModels.EJECTOR_TOP, be.getBlockState()); applyLidAngle(be, angle, model); model.light(light) .renderInto(ms, vertexBuilder); @@ -80,7 +80,7 @@ public class EjectorRenderer extends ShaftRenderer { return; ms.pushPose(); - //applyLidAngle(be, angle, msr);//TODO flw + applyLidAngle(be, angle, msr); msr.centre() .rotateY(-180 - AngleHelper.horizontalAngle(be.getBlockState() .getValue(EjectorBlock.HORIZONTAL_FACING))) diff --git a/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelRenderer.java b/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelRenderer.java index 27179aa22d..e94dd99a87 100644 --- a/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelRenderer.java @@ -7,8 +7,8 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.simibubi.create.AllPartialModels; import com.simibubi.create.foundation.blockEntity.renderer.SmartBlockEntityRenderer; -import com.simibubi.create.foundation.render.CachedPartialBuffers; +import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.VecHelper; import net.createmod.catnip.utility.math.AngleHelper; @@ -37,7 +37,7 @@ public class FunnelRenderer extends SmartBlockEntityRenderer VertexConsumer vb = buffer.getBuffer(RenderType.solid()); PartialModel partialModel = (blockState.getBlock() instanceof FunnelBlock ? AllPartialModels.FUNNEL_FLAP : AllPartialModels.BELT_FUNNEL_FLAP); - SuperByteBuffer flapBuffer = CachedPartialBuffers.partial(partialModel, blockState); + SuperByteBuffer flapBuffer = CachedBuffers.partial(partialModel, blockState); Vec3 pivot = VecHelper.voxelSpace(0, 10, 9.5f); TransformStack msr = TransformStack.cast(ms); diff --git a/src/main/java/com/simibubi/create/content/logistics/tunnel/BeltTunnelRenderer.java b/src/main/java/com/simibubi/create/content/logistics/tunnel/BeltTunnelRenderer.java index cfbc2c2a36..af632f7175 100644 --- a/src/main/java/com/simibubi/create/content/logistics/tunnel/BeltTunnelRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/tunnel/BeltTunnelRenderer.java @@ -6,8 +6,8 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.simibubi.create.AllPartialModels; import com.simibubi.create.foundation.blockEntity.renderer.SmartBlockEntityRenderer; -import com.simibubi.create.foundation.render.CachedPartialBuffers; +import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.Iterate; import net.createmod.catnip.utility.VecHelper; @@ -34,7 +34,7 @@ public class BeltTunnelRenderer extends SmartBlockEntityRenderer materialManager.defaultSolid() .material(Materials.TRANSFORMED) .getModel(model).createInstance()) - .map((ModelData transform) -> new BogeyModelData((Transform) transform))//TODO + .map(BogeyModelData::new) .toArray(BogeyModelData[]::new); contraptionModelData.put(keyFromModel(model), modelData); } @@ -214,7 +213,7 @@ public abstract class BogeyRenderer { .mapToObj(i -> materialManager.defaultSolid() .material(Materials.TRANSFORMED) .getModel(state).createInstance()) - .map((ModelData transform) -> new BogeyModelData((Transform) transform))//TODO + .map(BogeyModelData::new) .toArray(BogeyModelData[]::new); contraptionModelData.put(keyFromModel(state), modelData); } @@ -327,10 +326,10 @@ public abstract class BogeyRenderer { public record BogeyModelData(Transform transform) implements Transform { public static BogeyModelData from(PartialModel model) { BlockState air = Blocks.AIR.defaultBlockState(); - return new BogeyModelData(CachedPartialBuffers.partial(model, air)); + return new BogeyModelData(CachedBuffers.partial(model, air)); } public static BogeyModelData from(BlockState model) { - return new BogeyModelData(CachedBlockBuffers.block(model)); + return new BogeyModelData(CachedBuffers.block(model)); } public void render(PoseStack ms, int light, @Nullable VertexConsumer vb) { transform.scale(1 - 1/512f); diff --git a/src/main/java/com/simibubi/create/content/trains/display/FlapDisplayRenderer.java b/src/main/java/com/simibubi/create/content/trains/display/FlapDisplayRenderer.java index eb4607b62c..d3fac216f9 100644 --- a/src/main/java/com/simibubi/create/content/trains/display/FlapDisplayRenderer.java +++ b/src/main/java/com/simibubi/create/content/trains/display/FlapDisplayRenderer.java @@ -10,8 +10,8 @@ import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.math.Matrix4f; import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.kinetics.base.KineticBlockEntityRenderer; -import com.simibubi.create.foundation.render.CachedPartialBuffers; +import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.math.AngleHelper; import net.createmod.ponder.utility.WorldTickHolder; @@ -228,7 +228,7 @@ public class FlapDisplayRenderer extends KineticBlockEntityRenderer ms.translate(0, -2.25f / 16f, 0); msr.rotateX(-8.5f); BlockState air = Blocks.AIR.defaultBlockState(); - CachedPartialBuffers.partial(AllPartialModels.TRAIN_HAT, air) + CachedBuffers.partial(AllPartialModels.TRAIN_HAT, air) .forEntityRender() .light(light) .renderInto(ms, buffer.getBuffer(renderType)); diff --git a/src/main/java/com/simibubi/create/content/trains/signal/SignalRenderer.java b/src/main/java/com/simibubi/create/content/trains/signal/SignalRenderer.java index 4f22a1ac4d..32f3490a0d 100644 --- a/src/main/java/com/simibubi/create/content/trains/signal/SignalRenderer.java +++ b/src/main/java/com/simibubi/create/content/trains/signal/SignalRenderer.java @@ -9,8 +9,8 @@ import com.simibubi.create.content.trains.track.ITrackBlock; import com.simibubi.create.content.trains.track.TrackTargetingBehaviour; import com.simibubi.create.content.trains.track.TrackTargetingBehaviour.RenderedTrackOverlayType; import com.simibubi.create.foundation.blockEntity.renderer.SafeBlockEntityRenderer; -import com.simibubi.create.foundation.render.CachedPartialBuffers; +import net.createmod.catnip.render.CachedBuffers; import net.createmod.ponder.utility.WorldTickHolder; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; @@ -33,10 +33,10 @@ public class SignalRenderer extends SafeBlockEntityRenderer { float renderTime = WorldTickHolder.getRenderTime(be.getLevel()); if (signalState.isRedLight(renderTime)) - CachedPartialBuffers.partial(AllPartialModels.SIGNAL_ON, blockState) + CachedBuffers.partial(AllPartialModels.SIGNAL_ON, blockState) .renderInto(ms, buffer.getBuffer(RenderType.solid())); else - CachedPartialBuffers.partial(AllPartialModels.SIGNAL_OFF, blockState) + CachedBuffers.partial(AllPartialModels.SIGNAL_OFF, blockState) .light(light) .renderInto(ms, buffer.getBuffer(RenderType.solid())); diff --git a/src/main/java/com/simibubi/create/content/trains/station/AbstractStationScreen.java b/src/main/java/com/simibubi/create/content/trains/station/AbstractStationScreen.java index 110ff6d666..04b2bbb982 100644 --- a/src/main/java/com/simibubi/create/content/trains/station/AbstractStationScreen.java +++ b/src/main/java/com/simibubi/create/content/trains/station/AbstractStationScreen.java @@ -13,7 +13,6 @@ import com.simibubi.create.content.trains.entity.Train; import com.simibubi.create.content.trains.entity.TrainIconType; import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllIcons; -import com.simibubi.create.foundation.gui.element.PartialModelGuiElement; import com.simibubi.create.foundation.gui.widget.IconButton; import net.createmod.catnip.gui.AbstractSimiScreen; @@ -111,7 +110,7 @@ public abstract class AbstractStationScreen extends AbstractSimiScreen { if (blockEntity.resolveFlagAngle()) { msr.translate(1 / 16f, -19 / 16f, -12 / 16f); StationRenderer.transformFlag(msr, blockEntity, partialTicks, 180, false); - PartialModelGuiElement.of(getFlag(partialTicks)) + GuiGameElement.of(getFlag(partialTicks)) .render(ms); } diff --git a/src/main/java/com/simibubi/create/content/trains/station/StationRenderer.java b/src/main/java/com/simibubi/create/content/trains/station/StationRenderer.java index 29ccf28d83..840cfd14e6 100644 --- a/src/main/java/com/simibubi/create/content/trains/station/StationRenderer.java +++ b/src/main/java/com/simibubi/create/content/trains/station/StationRenderer.java @@ -11,8 +11,8 @@ import com.simibubi.create.content.trains.track.ITrackBlock; import com.simibubi.create.content.trains.track.TrackTargetingBehaviour; import com.simibubi.create.content.trains.track.TrackTargetingBehaviour.RenderedTrackOverlayType; import com.simibubi.create.foundation.blockEntity.renderer.SafeBlockEntityRenderer; -import com.simibubi.create.foundation.render.CachedPartialBuffers; +import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.MultiBufferSource; @@ -99,7 +99,7 @@ public class StationRenderer extends SafeBlockEntityRenderer if (valid != -1) { int lightColor = LevelRenderer.getLightColor(level, currentPos); - SuperByteBuffer sbb = CachedPartialBuffers.partial(assemblyOverlay, trackState); + SuperByteBuffer sbb = CachedBuffers.partial(assemblyOverlay, trackState); sbb.color(valid); sbb.light(lightColor); sbb.renderInto(ms, vb); @@ -115,7 +115,7 @@ public class StationRenderer extends SafeBlockEntityRenderer MultiBufferSource buffer, int light, int overlay) { if (!be.resolveFlagAngle()) return; - SuperByteBuffer flagBB = CachedPartialBuffers.partial(flag, be.getBlockState()); + SuperByteBuffer flagBB = CachedBuffers.partial(flag, be.getBlockState()); //transformFlag(flagBB, be, partialTicks, be.flagYRot, be.flagFlipped);//TODO flw flagBB.translate(0.5f / 16, 0, 0) .rotateY(be.flagFlipped ? 0 : 180) diff --git a/src/main/java/com/simibubi/create/content/trains/track/TrackRenderer.java b/src/main/java/com/simibubi/create/content/trains/track/TrackRenderer.java index 0a1fe075ad..e8279a0e73 100644 --- a/src/main/java/com/simibubi/create/content/trains/track/TrackRenderer.java +++ b/src/main/java/com/simibubi/create/content/trains/track/TrackRenderer.java @@ -11,8 +11,8 @@ import com.mojang.blaze3d.vertex.VertexConsumer; import com.simibubi.create.content.trains.track.BezierConnection.GirderAngles; import com.simibubi.create.content.trains.track.BezierConnection.SegmentAngles; import com.simibubi.create.foundation.blockEntity.renderer.SafeBlockEntityRenderer; -import com.simibubi.create.foundation.render.CachedPartialBuffers; +import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.utility.Iterate; import net.createmod.catnip.utility.VecHelper; import net.createmod.catnip.utility.math.AngleHelper; @@ -60,7 +60,7 @@ public class TrackRenderer extends SafeBlockEntityRenderer { TrackMaterial.TrackModelHolder modelHolder = bc.getMaterial().getModelHolder(); - CachedPartialBuffers.partial(modelHolder.tie(), air) + CachedBuffers.partial(modelHolder.tie(), air) .mulPose(segment.tieTransform.pose()) .mulNormal(segment.tieTransform.normal()) .light(light) @@ -68,7 +68,7 @@ public class TrackRenderer extends SafeBlockEntityRenderer { for (boolean first : Iterate.trueAndFalse) { Pose transform = segment.railTransforms.get(first); - CachedPartialBuffers.partial(first ? modelHolder.segment_left() : modelHolder.segment_right(), air) + CachedBuffers.partial(first ? modelHolder.segment_left() : modelHolder.segment_right(), air) .mulPose(transform.pose()) .mulNormal(transform.normal()) .light(light) @@ -93,7 +93,7 @@ public class TrackRenderer extends SafeBlockEntityRenderer { for (boolean first : Iterate.trueAndFalse) { Pose beamTransform = segment.beams.get(first); - CachedPartialBuffers.partial(GIRDER_SEGMENT_MIDDLE, air) + CachedBuffers.partial(GIRDER_SEGMENT_MIDDLE, air) .mulPose(beamTransform.pose()) .mulNormal(beamTransform.normal()) .light(light) @@ -102,7 +102,7 @@ public class TrackRenderer extends SafeBlockEntityRenderer { for (boolean top : Iterate.trueAndFalse) { Pose beamCapTransform = segment.beamCaps.get(top) .get(first); - CachedPartialBuffers.partial(top ? GIRDER_SEGMENT_TOP : GIRDER_SEGMENT_BOTTOM, air) + CachedBuffers.partial(top ? GIRDER_SEGMENT_TOP : GIRDER_SEGMENT_BOTTOM, air) .mulPose(beamCapTransform.pose()) .mulNormal(beamCapTransform.normal()) .light(light) diff --git a/src/main/java/com/simibubi/create/content/trains/track/TrackTargetingBehaviour.java b/src/main/java/com/simibubi/create/content/trains/track/TrackTargetingBehaviour.java index 54c47a3c0c..567d19815d 100644 --- a/src/main/java/com/simibubi/create/content/trains/track/TrackTargetingBehaviour.java +++ b/src/main/java/com/simibubi/create/content/trains/track/TrackTargetingBehaviour.java @@ -22,8 +22,8 @@ import com.simibubi.create.content.trains.signal.TrackEdgePoint; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BehaviourType; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; -import com.simibubi.create.foundation.render.CachedPartialBuffers; +import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.utility.Iterate; import net.createmod.catnip.utility.VecHelper; import net.createmod.catnip.utility.worldWrappers.SchematicWorld; @@ -323,7 +323,7 @@ public class TrackTargetingBehaviour extends BlockEnti ITrackBlock track = (ITrackBlock) block; PartialModel partial = track.prepareTrackOverlay(level, pos, trackState, bezier, direction, ms, type); if (partial != null) - CachedPartialBuffers.partial(partial, trackState) + CachedBuffers.partial(partial, trackState) .translate(.5, 0, .5) .scale(scale) .translate(-.5, 0, -.5) diff --git a/src/main/java/com/simibubi/create/foundation/block/connected/CTSpriteShiftEntry.java b/src/main/java/com/simibubi/create/foundation/block/connected/CTSpriteShiftEntry.java index be77b1dbbc..1b3e4c03d9 100644 --- a/src/main/java/com/simibubi/create/foundation/block/connected/CTSpriteShiftEntry.java +++ b/src/main/java/com/simibubi/create/foundation/block/connected/CTSpriteShiftEntry.java @@ -1,14 +1,12 @@ package com.simibubi.create.foundation.block.connected; import net.createmod.catnip.render.SpriteShiftEntry; -import net.minecraft.resources.ResourceLocation; public class CTSpriteShiftEntry extends SpriteShiftEntry { protected final CTType type; - public CTSpriteShiftEntry(CTType type, ResourceLocation originalTextureLocation, ResourceLocation targetTextureLocation) { - super(originalTextureLocation, targetTextureLocation); + public CTSpriteShiftEntry(CTType type) { this.type = type; } diff --git a/src/main/java/com/simibubi/create/foundation/block/connected/CTSpriteShifter.java b/src/main/java/com/simibubi/create/foundation/block/connected/CTSpriteShifter.java index b0c5cc8c0b..0752e5525a 100644 --- a/src/main/java/com/simibubi/create/foundation/block/connected/CTSpriteShifter.java +++ b/src/main/java/com/simibubi/create/foundation/block/connected/CTSpriteShifter.java @@ -3,10 +3,10 @@ package com.simibubi.create.foundation.block.connected; import java.util.HashMap; import java.util.Map; -import net.createmod.catnip.render.SpriteShifter; +import net.createmod.catnip.platform.CatnipServices; import net.minecraft.resources.ResourceLocation; -public class CTSpriteShifter extends SpriteShifter { +public class CTSpriteShifter { private static final Map ENTRY_CACHE = new HashMap<>(); @@ -15,7 +15,8 @@ public class CTSpriteShifter extends SpriteShifter { if (ENTRY_CACHE.containsKey(key)) return ENTRY_CACHE.get(key); - CTSpriteShiftEntry entry = new CTSpriteShiftEntry(type, blockTexture, connectedTexture); + CTSpriteShiftEntry entry = new CTSpriteShiftEntry(type); + CatnipServices.PLATFORM.executeOnClientOnly(() -> () -> entry.set(blockTexture, connectedTexture)); ENTRY_CACHE.put(key, entry); return entry; } diff --git a/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java b/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java index 43b0c86417..378e3ae0a2 100644 --- a/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java @@ -58,7 +58,7 @@ import com.simibubi.create.foundation.utility.ServerSpeedProvider; import com.simibubi.create.infrastructure.config.AllConfigs; import net.createmod.catnip.config.ui.BaseConfigScreen; -import net.createmod.catnip.render.DefaultSuperRenderTypeBufferImpl; +import net.createmod.catnip.render.DefaultSuperRenderTypeBuffer; import net.createmod.catnip.render.SuperRenderTypeBuffer; import net.createmod.catnip.utility.AnimationTickHolder; import net.createmod.catnip.utility.worldWrappers.WrappedClientWorld; @@ -198,7 +198,7 @@ public class ClientEvents { public static void onRenderWorld(RenderLevelLastEvent event) { PoseStack ms = event.getPoseStack(); ms.pushPose(); - SuperRenderTypeBuffer buffer = DefaultSuperRenderTypeBufferImpl.getInstance(); + SuperRenderTypeBuffer buffer = DefaultSuperRenderTypeBuffer.getInstance(); float partialTicks = AnimationTickHolder.getPartialTicks(); Vec3 camera = Minecraft.getInstance().gameRenderer.getMainCamera() .getPosition(); diff --git a/src/main/java/com/simibubi/create/foundation/gui/element/PartialModelGuiElement.java b/src/main/java/com/simibubi/create/foundation/gui/element/PartialModelGuiElement.java deleted file mode 100644 index 03164f67c5..0000000000 --- a/src/main/java/com/simibubi/create/foundation/gui/element/PartialModelGuiElement.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.simibubi.create.foundation.gui.element; - -import com.jozufozu.flywheel.core.PartialModel; - -import net.createmod.catnip.gui.element.GuiGameElement; - - -public class PartialModelGuiElement extends GuiGameElement { - - public static GuiRenderBuilder of(PartialModel partial) { - return new GuiBlockPartialRenderBuilder(partial); - } - - public static class GuiBlockPartialRenderBuilder extends GuiBlockModelRenderBuilder { - - public GuiBlockPartialRenderBuilder(PartialModel partial) { - super(partial.get(), null); - } - - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/CreatePonderTag.java b/src/main/java/com/simibubi/create/foundation/ponder/CreatePonderTag.java deleted file mode 100644 index 3d3503b6d2..0000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/CreatePonderTag.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.simibubi.create.foundation.ponder; - -import com.simibubi.create.AllBlocks; -import com.simibubi.create.AllItems; -import com.simibubi.create.Create; - -import net.createmod.ponder.foundation.PonderTag; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.Items; -import net.minecraft.world.level.block.Blocks; - -public class CreatePonderTag extends PonderTag { - - public static final PonderTag KINETIC_RELAYS = create("kinetic_relays") - .item(AllBlocks.COGWHEEL.get(), true, false) - .defaultLang("Kinetic Blocks", "Components which help relaying Rotational Force elsewhere") - .addToIndex(); - - public static final PonderTag KINETIC_SOURCES = create("kinetic_sources") - .item(AllBlocks.WATER_WHEEL.get(), true, false) - .defaultLang("Kinetic Sources", "Components which generate Rotational Force") - .addToIndex(); - public static final PonderTag KINETIC_APPLIANCES = create("kinetic_appliances") - .item(AllBlocks.MECHANICAL_PRESS.get(), true, false) - .defaultLang("Kinetic Appliances", "Components which make use of Rotational Force") - .addToIndex(); - public static final PonderTag FLUIDS = create("fluids") - .item(AllBlocks.FLUID_PIPE.get(), true, false) - .defaultLang("Fluid Manipulators", "Components which help relaying and making use of Fluids") - .addToIndex(); - public static final PonderTag LOGISTICS = create("logistics") - .item(Blocks.CHEST, true, false) - .defaultLang("Item Transportation", "Components which help moving items around") - .addToIndex(); - public static final PonderTag REDSTONE = create("redstone") - .item(Items.REDSTONE, true, false) - .defaultLang("Logic Components", "Components which help with redstone engineering") - .addToIndex(); - public static final PonderTag DECORATION = create("decoration") - .item(Items.ROSE_BUSH, true, false) - .defaultLang("Aesthetics", "Components used mostly for decorative purposes"); - public static final PonderTag CREATIVE = create("creative").item(AllBlocks.CREATIVE_CRATE.get(), true, false) - .defaultLang("Creative Mode", "Components not usually available for Survival Mode") - .addToIndex(); - public static final PonderTag MOVEMENT_ANCHOR = create("movement_anchor") - .item(AllBlocks.MECHANICAL_PISTON.get(), true, false) - .defaultLang("Movement Anchors", - "Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways") - .addToIndex(); - public static final PonderTag CONTRAPTION_ACTOR = create("contraption_actor") - .item(AllBlocks.MECHANICAL_HARVESTER.get(), true, false) - .defaultLang("Contraption Actors", - "Components which expose special behaviour when attached to a moving contraption") - .addToIndex(); - public static final PonderTag CONTRAPTION_ASSEMBLY = create("contraption_assembly") - .item(AllItems.SUPER_GLUE.get(), true, false) - .defaultLang("Block Attachment Utility", - "Tools and Components used to assemble structures moved as an animated Contraption") - .addToIndex(); - public static final PonderTag SAILS = create("windmill_sails") - .item(AllBlocks.WINDMILL_BEARING.get()) - .defaultLang("Sails for Windmill Bearings", - "Blocks that count towards the strength of a Windmill Contraption when assembled. Each of these have equal efficiency in doing so."); - public static final PonderTag ARM_TARGETS = create("arm_targets") - .item(AllBlocks.MECHANICAL_ARM.get()) - .defaultLang("Targets for Mechanical Arms", - "Components which can be selected as inputs or outputs to the Mechanical Arm"); - public static final PonderTag TRAIN_RELATED = create("train_related") - .item(AllBlocks.TRACK.get()) - .defaultLang("Railway Equipment", "Components used in the construction or management of Train Contraptions") - .addToIndex(); - public static final PonderTag DISPLAY_SOURCES = create("display_sources") - .item(AllBlocks.DISPLAY_LINK.get(), true, false) - .item(AllBlocks.DISPLAY_LINK.get(), false, true) - .defaultLang("Sources for Display Links", - "Components or Blocks which offer some data that can be read with a Display Link"); - public static final PonderTag DISPLAY_TARGETS = create("display_targets") - .item(AllBlocks.DISPLAY_LINK.get(), true, false) - .item(AllBlocks.DISPLAY_LINK.get(), false, true) - .defaultLang("Targets for Display Links", - "Components or Blocks which can process and display the data received from a Display Link"); - - public CreatePonderTag(ResourceLocation id) { - super(id); - } - - private static PonderTag create(String id) { - return create(Create.ID, id); - } - - // Make sure class is loaded; Lang registration happens with builder calls - public static void register() {} -} diff --git a/src/main/java/com/simibubi/create/foundation/render/BlockEntityRenderHelper.java b/src/main/java/com/simibubi/create/foundation/render/BlockEntityRenderHelper.java index cc759c540d..30def0d177 100644 --- a/src/main/java/com/simibubi/create/foundation/render/BlockEntityRenderHelper.java +++ b/src/main/java/com/simibubi/create/foundation/render/BlockEntityRenderHelper.java @@ -16,6 +16,7 @@ import com.simibubi.create.Create; import com.simibubi.create.infrastructure.config.AllConfigs; import net.createmod.catnip.platform.CatnipServices; +import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.AnimationTickHolder; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.LevelRenderer; @@ -107,7 +108,7 @@ public class BlockEntityRenderHelper { if (renderWorld != null) { int renderWorldLight = LevelRenderer.getLightColor(renderWorld, renderWorldPos); - return FlwSuperByteBuffer.maxLight(worldLight, renderWorldLight); + return SuperByteBuffer.maxLight(worldLight, renderWorldLight); } return worldLight; diff --git a/src/main/java/com/simibubi/create/foundation/render/CachedPartialBuffers.java b/src/main/java/com/simibubi/create/foundation/render/CachedPartialBuffers.java deleted file mode 100644 index 248925090f..0000000000 --- a/src/main/java/com/simibubi/create/foundation/render/CachedPartialBuffers.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.simibubi.create.foundation.render; - -import static net.minecraft.world.level.block.state.properties.BlockStateProperties.FACING; - -import java.util.function.Supplier; - -import org.apache.commons.lang3.tuple.Pair; - -import com.jozufozu.flywheel.core.PartialModel; -import com.jozufozu.flywheel.util.transform.TransformStack; -import com.mojang.blaze3d.vertex.PoseStack; - -import net.createmod.catnip.render.SuperBufferFactory; -import net.createmod.catnip.render.SuperByteBuffer; -import net.createmod.catnip.render.SuperByteBufferCache; -import net.createmod.catnip.render.SuperByteBufferCache.Compartment; -import net.createmod.catnip.utility.math.AngleHelper; -import net.minecraft.core.Direction; -import net.minecraft.world.level.block.state.BlockState; - -public class CachedPartialBuffers { - public static final Compartment PARTIAL = new Compartment<>(); - public static final Compartment> DIRECTIONAL_PARTIAL = new Compartment<>(); - - public static SuperByteBuffer partial(PartialModel partial, BlockState referenceState) { - return SuperByteBufferCache.getInstance().get(PARTIAL, partial, - () -> SuperBufferFactory.getInstance().createForBlock(partial.get(), referenceState)); - } - - public static SuperByteBuffer partial(PartialModel partial, BlockState referenceState, - Supplier modelTransform) { - return SuperByteBufferCache.getInstance().get(PARTIAL, partial, - () -> SuperBufferFactory.getInstance().createForBlock(partial.get(), referenceState, modelTransform.get())); - } - - public static SuperByteBuffer partialFacing(PartialModel partial, BlockState referenceState) { - Direction facing = referenceState.getValue(FACING); - return partialFacing(partial, referenceState, facing); - } - - public static SuperByteBuffer partialFacing(PartialModel partial, BlockState referenceState, Direction facing) { - return partialDirectional(partial, referenceState, facing, - rotateToFace(facing)); - } - - public static SuperByteBuffer partialFacingVertical(PartialModel partial, BlockState referenceState, Direction facing) { - return partialDirectional(partial, referenceState, facing, - rotateToFaceVertical(facing)); - } - - public static SuperByteBuffer partialDirectional(PartialModel partial, BlockState referenceState, Direction dir, - Supplier modelTransform) { - return SuperByteBufferCache.getInstance().get(DIRECTIONAL_PARTIAL, Pair.of(dir, partial), - () -> SuperBufferFactory.getInstance().createForBlock(partial.get(), referenceState, modelTransform.get())); - } - - public static Supplier rotateToFace(Direction facing) { - return () -> { - PoseStack stack = new PoseStack(); - TransformStack.cast(stack) - .centre() - .rotateY(AngleHelper.horizontalAngle(facing)) - .rotateX(AngleHelper.verticalAngle(facing)) - .unCentre(); - return stack; - }; - } - - public static Supplier rotateToFaceVertical(Direction facing) { - return () -> { - PoseStack stack = new PoseStack(); - TransformStack.cast(stack) - .centre() - .rotateY(AngleHelper.horizontalAngle(facing)) - .rotateX(AngleHelper.verticalAngle(facing) + 90) - .unCentre(); - return stack; - }; - } -} diff --git a/src/main/java/com/simibubi/create/foundation/render/FlwSuperBufferFactory.java b/src/main/java/com/simibubi/create/foundation/render/FlwSuperBufferFactory.java deleted file mode 100644 index 461a41709b..0000000000 --- a/src/main/java/com/simibubi/create/foundation/render/FlwSuperBufferFactory.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.simibubi.create.foundation.render; - -import javax.annotation.ParametersAreNonnullByDefault; - -import com.jozufozu.flywheel.core.model.ModelUtil; -import com.jozufozu.flywheel.core.model.ShadeSeparatedBufferedData; -import com.mojang.blaze3d.vertex.BufferBuilder; -import com.mojang.blaze3d.vertex.PoseStack; - -import net.createmod.catnip.render.DefaultSuperBufferFactory; -import net.createmod.catnip.render.SuperBufferFactory; -import net.createmod.catnip.render.SuperByteBuffer; -import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.client.resources.model.BakedModel; -import net.minecraft.world.level.block.state.BlockState; - -@MethodsReturnNonnullByDefault -@ParametersAreNonnullByDefault -public class FlwSuperBufferFactory implements SuperBufferFactory { - - @Override - public SuperByteBuffer create(BufferBuilder builder) { - return new DefaultSuperBufferFactory().create(builder);//TODO - } - - @Override - public SuperByteBuffer createForBlock(BakedModel model, BlockState referenceState, PoseStack ms) { - ShadeSeparatedBufferedData data = ModelUtil.getBufferedData(model, referenceState, ms); - FlwSuperByteBuffer sbb = new FlwSuperByteBuffer(data); - data.release(); - return sbb; - } -} diff --git a/src/main/java/com/simibubi/create/foundation/render/FlwSuperByteBuffer.java b/src/main/java/com/simibubi/create/foundation/render/FlwSuperByteBuffer.java deleted file mode 100644 index f8cea3780f..0000000000 --- a/src/main/java/com/simibubi/create/foundation/render/FlwSuperByteBuffer.java +++ /dev/null @@ -1,476 +0,0 @@ -package com.simibubi.create.foundation.render; - -import java.nio.ByteBuffer; -import java.util.Optional; -import java.util.function.IntPredicate; - -import javax.annotation.ParametersAreNonnullByDefault; - -import com.jozufozu.flywheel.api.vertex.ShadedVertexList; -import com.jozufozu.flywheel.api.vertex.VertexList; -import com.jozufozu.flywheel.backend.ShadersModHandler; -import com.jozufozu.flywheel.core.model.ShadeSeparatedBufferedData; -import com.jozufozu.flywheel.core.vertex.BlockVertexList; -import com.jozufozu.flywheel.util.DiffuseLightCalculator; -import com.mojang.blaze3d.vertex.BufferBuilder; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; -import com.mojang.math.Matrix3f; -import com.mojang.math.Matrix4f; -import com.mojang.math.Quaternion; -import com.mojang.math.Vector3f; -import com.mojang.math.Vector4f; - -import it.unimi.dsi.fastutil.longs.Long2IntMap; -import it.unimi.dsi.fastutil.longs.Long2IntOpenHashMap; -import net.createmod.catnip.render.SpriteShiftEntry; -import net.createmod.catnip.render.SuperByteBuffer; -import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.LevelRenderer; -import net.minecraft.client.renderer.LightTexture; -import net.minecraft.client.renderer.texture.OverlayTexture; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.util.Mth; -import net.minecraft.world.level.Level; - -@SuppressWarnings("unchecked") -@MethodsReturnNonnullByDefault -@ParametersAreNonnullByDefault -public class FlwSuperByteBuffer implements SuperByteBuffer { - - private final VertexList template; - private final IntPredicate shadedPredicate; - - // Vertex Position - private final PoseStack transforms = new PoseStack(); - - // Vertex Coloring - private boolean shouldColor; - private int r, g, b, a; - private boolean disableDiffuseMult; - private DiffuseLightCalculator diffuseCalculator; - - // Vertex Texture Coords - private SpriteShiftFunc spriteShiftFunc; - - // Vertex Overlay Color - private boolean hasOverlay; - private int overlay = OverlayTexture.NO_OVERLAY; - - // Vertex Lighting - private boolean useWorldLight; - private Matrix4f lightTransform; - private boolean hasCustomLight; - private int packedLightCoords; - private boolean hybridLight; - - // Vertex Normals - private boolean fullNormalTransform; - - // Temporary - private static final Long2IntMap WORLD_LIGHT_CACHE = new Long2IntOpenHashMap(); - - public FlwSuperByteBuffer(ByteBuffer vertexBuffer, BufferBuilder.DrawState drawState, int unshadedStartVertex) { - int vertexCount = drawState.vertexCount(); - int stride = drawState.format().getVertexSize(); - - ShadedVertexList template = new BlockVertexList.Shaded(vertexBuffer, vertexCount, stride, unshadedStartVertex); - shadedPredicate = template::isShaded; - this.template = template; - - transforms.pushPose(); - } - - public FlwSuperByteBuffer(ShadeSeparatedBufferedData data) { - this(data.vertexBuffer(), data.drawState(), data.unshadedStartVertex()); - } - - public FlwSuperByteBuffer(ByteBuffer vertexBuffer, BufferBuilder.DrawState drawState) { - int vertexCount = drawState.vertexCount(); - int stride = drawState.format().getVertexSize(); - - template = new BlockVertexList(vertexBuffer, vertexCount, stride); - shadedPredicate = index -> true; - - transforms.pushPose(); - } - - public void renderInto(PoseStack input, VertexConsumer builder) { - if (isEmpty()) - return; - - Matrix4f modelMat = input.last() - .pose() - .copy(); - Matrix4f localTransforms = transforms.last() - .pose(); - modelMat.multiply(localTransforms); - - Matrix3f normalMat; - if (fullNormalTransform) { - normalMat = input.last() - .normal() - .copy(); - Matrix3f localNormalTransforms = transforms.last() - .normal(); - normalMat.mul(localNormalTransforms); - } else { - normalMat = transforms.last() - .normal() - .copy(); - } - - if (useWorldLight) { - WORLD_LIGHT_CACHE.clear(); - } - - final Vector4f pos = new Vector4f(); - final Vector3f normal = new Vector3f(); - final Vector4f lightPos = new Vector4f(); - - DiffuseLightCalculator diffuseCalculator = ForcedDiffuseState.getForcedCalculator(); - final boolean disableDiffuseMult = - this.disableDiffuseMult || (ShadersModHandler.isShaderPackInUse() && diffuseCalculator == null); - if (diffuseCalculator == null) { - diffuseCalculator = this.diffuseCalculator; - if (diffuseCalculator == null) { - diffuseCalculator = DiffuseLightCalculator.forCurrentLevel(); - } - } - - final int vertexCount = template.getVertexCount(); - for (int i = 0; i < vertexCount; i++) { - float x = template.getX(i); - float y = template.getY(i); - float z = template.getZ(i); - - pos.set(x, y, z, 1F); - pos.transform(modelMat); - builder.vertex(pos.x(), pos.y(), pos.z()); - - float normalX = template.getNX(i); - float normalY = template.getNY(i); - float normalZ = template.getNZ(i); - - normal.set(normalX, normalY, normalZ); - normal.transform(normalMat); - float nx = normal.x(); - float ny = normal.y(); - float nz = normal.z(); - - byte r, g, b, a; - if (shouldColor) { - r = (byte) this.r; - g = (byte) this.g; - b = (byte) this.b; - a = (byte) this.a; - } else { - r = template.getR(i); - g = template.getG(i); - b = template.getB(i); - a = template.getA(i); - } - if (disableDiffuseMult) { - builder.color(r, g, b, a); - } else { - float instanceDiffuse = diffuseCalculator.getDiffuse(nx, ny, nz, shadedPredicate.test(i)); - int colorR = transformColor(r, instanceDiffuse); - int colorG = transformColor(g, instanceDiffuse); - int colorB = transformColor(b, instanceDiffuse); - builder.color(colorR, colorG, colorB, a); - } - - float u = template.getU(i); - float v = template.getV(i); - if (spriteShiftFunc != null) { - spriteShiftFunc.shift(builder, u, v); - } else { - builder.uv(u, v); - } - - if (hasOverlay) { - builder.overlayCoords(overlay); - } - - int light; - if (useWorldLight) { - lightPos.set(((x - .5f) * 15 / 16f) + .5f, (y - .5f) * 15 / 16f + .5f, (z - .5f) * 15 / 16f + .5f, 1f); - lightPos.transform(localTransforms); - if (lightTransform != null) { - lightPos.transform(lightTransform); - } - - light = getLight(Minecraft.getInstance().level, lightPos); - if (hasCustomLight) { - light = maxLight(light, packedLightCoords); - } - } else if (hasCustomLight) { - light = packedLightCoords; - } else { - light = template.getLight(i); - } - - if (hybridLight) { - builder.uv2(maxLight(light, template.getLight(i))); - } else { - builder.uv2(light); - } - - builder.normal(nx, ny, nz); - - builder.endVertex(); - } - - reset(); - } - - @Override - public FlwSuperByteBuffer reset() { - while (!transforms.clear()) - transforms.popPose(); - transforms.pushPose(); - - shouldColor = false; - r = 0; - g = 0; - b = 0; - a = 0; - disableDiffuseMult = false; - diffuseCalculator = null; - spriteShiftFunc = null; - hasOverlay = false; - overlay = OverlayTexture.NO_OVERLAY; - useWorldLight = false; - lightTransform = null; - hasCustomLight = false; - packedLightCoords = 0; - hybridLight = false; - fullNormalTransform = false; - return this; - } - - public boolean isEmpty() { - return template.isEmpty(); - } - - @Override - public void delete() { - template.delete(); - } - - public PoseStack getTransforms() { - return transforms; - } - - @Override - public FlwSuperByteBuffer translate(double x, double y, double z) { - transforms.translate(x, y, z); - return this; - } - - @Override - public FlwSuperByteBuffer multiply(Quaternion quaternion) { - transforms.mulPose(quaternion); - return this; - } - @Override - public FlwSuperByteBuffer scale(float factorX, float factorY, float factorZ) { - transforms.scale(factorX, factorY, factorZ); - return this; - } - - @Override - public FlwSuperByteBuffer pushPose() { - transforms.pushPose(); - return this; - } - - @Override - public FlwSuperByteBuffer popPose() { - transforms.popPose(); - return this; - } - - @Override - public FlwSuperByteBuffer mulPose(Matrix4f pose) { - transforms.last() - .pose() - .multiply(pose); - return this; - } - - @Override - public FlwSuperByteBuffer mulNormal(Matrix3f normal) { - transforms.last() - .normal() - .mul(normal); - return this; - } - - public FlwSuperByteBuffer transform(PoseStack stack) { - transforms.last() - .pose() - .multiply(stack.last() - .pose()); - transforms.last() - .normal() - .mul(stack.last() - .normal()); - return this; - } - - public FlwSuperByteBuffer rotateCentered(Direction axis, float radians) { - translate(.5f, .5f, .5f).rotate(axis, radians) - .translate(-.5f, -.5f, -.5f); - return this; - } - - public FlwSuperByteBuffer rotateCentered(Quaternion q) { - translate(.5f, .5f, .5f).multiply(q) - .translate(-.5f, -.5f, -.5f); - return this; - } - - public FlwSuperByteBuffer color(int r, int g, int b, int a) { - shouldColor = true; - this.r = r; - this.g = g; - this.b = b; - this.a = a; - return this; - } - - public FlwSuperByteBuffer color(int color) { - shouldColor = true; - r = ((color >> 16) & 0xFF); - g = ((color >> 8) & 0xFF); - b = (color & 0xFF); - a = 255; - return this; - } - - /** - * Prevents vertex colors from being multiplied by the diffuse value calculated - * from the final transformed normal vector. Useful for entity rendering, when - * diffuse is applied automatically later. - */ - public FlwSuperByteBuffer disableDiffuse() { - disableDiffuseMult = true; - return this; - } - - public FlwSuperByteBuffer diffuseCalculator(DiffuseLightCalculator diffuseCalculator) { - this.diffuseCalculator = diffuseCalculator; - return this; - } - - public FlwSuperByteBuffer shiftUV(SpriteShiftEntry entry) { - this.spriteShiftFunc = (builder, u, v) -> builder.uv(entry.getTargetU(u), entry.getTargetV(v)); - return this; - } - - public FlwSuperByteBuffer shiftUVScrolling(SpriteShiftEntry entry, float scrollU, float scrollV) { - this.spriteShiftFunc = (builder, u, v) -> { - float targetU = u - entry.getOriginal() - .getU0() + entry.getTarget() - .getU0() - + scrollU; - float targetV = v - entry.getOriginal() - .getV0() + entry.getTarget() - .getV0() - + scrollV; - builder.uv(targetU, targetV); - }; - return this; - } - - public FlwSuperByteBuffer shiftUVtoSheet(SpriteShiftEntry entry, float uTarget, float vTarget, int sheetSize) { - this.spriteShiftFunc = (builder, u, v) -> { - float targetU = entry.getTarget() - .getU((SpriteShiftEntry.getUnInterpolatedU(entry.getOriginal(), u) / sheetSize) + uTarget * 16); - float targetV = entry.getTarget() - .getV((SpriteShiftEntry.getUnInterpolatedV(entry.getOriginal(), v) / sheetSize) + vTarget * 16); - builder.uv(targetU, targetV); - }; - return this; - } - - public FlwSuperByteBuffer overlay() { - hasOverlay = true; - return this; - } - - public FlwSuperByteBuffer overlay(int overlay) { - hasOverlay = true; - this.overlay = overlay; - return this; - } - - public FlwSuperByteBuffer light() { - useWorldLight = true; - return this; - } - - public FlwSuperByteBuffer light(Matrix4f lightTransform) { - useWorldLight = true; - this.lightTransform = lightTransform; - return this; - } - - public FlwSuperByteBuffer light(int packedLightCoords) { - hasCustomLight = true; - this.packedLightCoords = packedLightCoords; - return this; - } - - /** - * Uses max light from calculated light (world light or custom light) and vertex - * light for the final light value. Ineffective if any other light method was - * not called. - */ - public FlwSuperByteBuffer hybridLight() { - hybridLight = true; - return this; - } - - /** - * Transforms normals not only by the local matrix stack, but also by the passed - * matrix stack. - */ - public FlwSuperByteBuffer fullNormalTransform() { - fullNormalTransform = true; - return this; - } - - @Deprecated - public static Optional cast(SuperByteBuffer buffer) { - if (!(buffer instanceof FlwSuperByteBuffer flwBuffer)) - return Optional.empty(); - - return Optional.of(flwBuffer); - } - - public static int transformColor(byte component, float scale) { - return Mth.clamp((int) (Byte.toUnsignedInt(component) * scale), 0, 255); - } - - public static int transformColor(int component, float scale) { - return Mth.clamp((int) (component * scale), 0, 255); - } - - public static int maxLight(int packedLight1, int packedLight2) { - int blockLight1 = LightTexture.block(packedLight1); - int skyLight1 = LightTexture.sky(packedLight1); - int blockLight2 = LightTexture.block(packedLight2); - int skyLight2 = LightTexture.sky(packedLight2); - return LightTexture.pack(Math.max(blockLight1, blockLight2), Math.max(skyLight1, skyLight2)); - } - - private static int getLight(Level world, Vector4f lightPos) { - BlockPos pos = new BlockPos(lightPos.x(), lightPos.y(), lightPos.z()); - return WORLD_LIGHT_CACHE.computeIfAbsent(pos.asLong(), $ -> LevelRenderer.getLightColor(world, pos)); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/render/ForcedDiffuseState.java b/src/main/java/com/simibubi/create/foundation/render/ForcedDiffuseState.java deleted file mode 100644 index 5dd88fecdb..0000000000 --- a/src/main/java/com/simibubi/create/foundation/render/ForcedDiffuseState.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.simibubi.create.foundation.render; - -import javax.annotation.Nullable; - -import com.jozufozu.flywheel.util.DiffuseLightCalculator; - -import it.unimi.dsi.fastutil.objects.ObjectArrayList; - -public final class ForcedDiffuseState { - private static final ThreadLocal> FORCED_DIFFUSE = ThreadLocal.withInitial(ObjectArrayList::new); - - private ForcedDiffuseState() { - } - - public static void pushCalculator(DiffuseLightCalculator calculator) { - FORCED_DIFFUSE.get().push(calculator); - } - - public static void popCalculator() { - FORCED_DIFFUSE.get().pop(); - } - - @Nullable - public static DiffuseLightCalculator getForcedCalculator() { - ObjectArrayList stack = FORCED_DIFFUSE.get(); - if (stack.isEmpty()) { - return null; - } - return stack.top(); - } -} diff --git a/src/main/java/com/simibubi/create/infrastructure/command/ClearBufferCacheCommand.java b/src/main/java/com/simibubi/create/infrastructure/command/ClearBufferCacheCommand.java index 9ce88b7437..1ab6ff043b 100644 --- a/src/main/java/com/simibubi/create/infrastructure/command/ClearBufferCacheCommand.java +++ b/src/main/java/com/simibubi/create/infrastructure/command/ClearBufferCacheCommand.java @@ -3,6 +3,7 @@ package com.simibubi.create.infrastructure.command; import com.mojang.brigadier.builder.ArgumentBuilder; import com.simibubi.create.CreateClient; +import net.createmod.catnip.CatnipClient; import net.createmod.catnip.utility.lang.Components; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; @@ -25,6 +26,7 @@ public class ClearBufferCacheCommand { @OnlyIn(Dist.CLIENT) private static void execute() { + CatnipClient.invalidateRenderers(); CreateClient.invalidateRenderers(); } } From c4facc4bf469e6f338f532ff1f9324f3c6505f2f Mon Sep 17 00:00:00 2001 From: zelophed Date: Thu, 17 Aug 2023 00:30:28 +0200 Subject: [PATCH 011/515] clean up buildscripts --- build.gradle | 236 ++++++++++---------------- gradle.properties | 10 ++ gradle/java.gradle | 42 +++++ settings.gradle | 11 ++ src/main/resources/META-INF/mods.toml | 15 +- 5 files changed, 158 insertions(+), 156 deletions(-) create mode 100644 gradle/java.gradle diff --git a/build.gradle b/build.gradle index efce25043f..7abc3f02ab 100644 --- a/build.gradle +++ b/build.gradle @@ -1,31 +1,28 @@ -buildscript { - repositories { - maven { url = 'https://maven.minecraftforge.net' } - mavenCentral() - jcenter() - maven { url = 'https://repo.spongepowered.org/repository/maven-public' } - maven { url = 'https://maven.parchmentmc.org' } - } - dependencies { - classpath "net.minecraftforge.gradle:ForgeGradle:${forgegradle_version}" - classpath "org.spongepowered:mixingradle:${mixingradle_version}" - classpath "org.parchmentmc:librarian:${librarian_version}" - } -} - plugins { + id 'idea' + id 'eclipse' + id 'maven-publish' + + id 'net.minecraftforge.gradle' version "${forgegradle_version}" + id 'org.spongepowered.mixin' version "${mixingradle_version}" + id 'org.parchmentmc.librarian.forgegradle' version "${librarian_version}" + id 'com.matthewprenger.cursegradle' version "${cursegradle_version}" } -apply plugin: 'net.minecraftforge.gradle' -apply plugin: 'org.parchmentmc.librarian.forgegradle' -apply plugin: 'eclipse' -apply plugin: 'maven-publish' -apply plugin: 'org.spongepowered.mixin' -apply plugin: 'idea' + +apply from: './gradle/java.gradle' jarJar.enable() -boolean dev = System.getenv('RELEASE') == null || System.getenv('RELEASE').equals('false'); +boolean dev = System.getenv('RELEASE') == null || System.getenv('RELEASE').equals('false') +ext.buildNumber = System.getenv('BUILD_NUMBER') + +base { + archivesName = "create-${artifact_minecraft_version}" + group = 'com.simibubi.create' + version = mod_version + (dev && buildNumber != null ? "-${buildNumber}" : '') +} + // jozu: I use a gradle workspace with both projects. // The project is named Flywheel-Forge, but sub-projects are named by folder. boolean flywheelInWorkspace = findProject(':Flywheel') != null @@ -42,55 +39,58 @@ if (ponderInWorkspace) { evaluationDependsOn(":Ponder") } -ext.buildNumber = System.getenv('BUILD_NUMBER') +project.logger.lifecycle("MultiModWorkspace ${inMultiModWorkspace || flywheelInWorkspace ? 'enabled' : 'disabled'} for project ${project.name}.") +project.logger.lifecycle("Dependencies included in Workspace: [Flywheel: ${flywheelInWorkspace}], [Catnip: ${catnipInWorkspace}], [Ponder: ${ponderInWorkspace}]") -group = 'com.simibubi.create' -archivesBaseName = "create-${artifact_minecraft_version}" -version = mod_version + (dev && buildNumber != null ? "-${buildNumber}" : '') +mixin { + add sourceSets.main, 'create.refmap.json' -java.toolchain.languageVersion = JavaLanguageVersion.of(17) + config 'create.mixins.json' +} -println('Java: ' + System.getProperty('java.version') + ' JVM: ' + System.getProperty('java.vm.version') + ' (' + System.getProperty('java.vendor') + ') Arch: ' + System.getProperty('os.arch')) +println "Java: ${System.getProperty 'java.version'}, JVM: ${System.getProperty 'java.vm.version'} (${System.getProperty 'java.vendor'}), Arch: ${System.getProperty 'os.arch'}" minecraft { + if (Boolean.parseBoolean(project.use_parchment)) { mappings channel: 'parchment', version: "${parchment_version}-${minecraft_version}" } else { mappings channel: 'official', version: "${minecraft_version}" } - accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') + // This property allows configuring Gradle's ProcessResources task(s) to run on IDE output locations before launching the game. + copyIdeResources = true + + if (file('src/main/resources/META-INF/accesstransformer.cfg').exists()) { + accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') + } runs { - client { + // applies to all the run configs below + configureEach { workingDirectory project.file('run') + if (inMultiModWorkspace) ideaModule "createmod.Create.main" else ideaModule "Create.main" - arg '-mixin.config=create.mixins.json' - arg '-mixin.config=flywheel.mixins.json' - - if (catnipInWorkspace) { - arg '-mixin.config=catnip.mixins.json' - } - - jvmArgs("-XX:-OmitStackTraceInFastThrow") // uncomment when you get exceptions with null messages etc - jvmArgs("-XX:+IgnoreUnrecognizedVMOptions", "-XX:+AllowEnhancedClassRedefinition") // uncomment with jbr - //jvmArgs '-XX:+UnlockCommercialFeatures' // uncomment for profiling property 'forge.logging.console.level', 'info' + jvmArgs '-XX:+IgnoreUnrecognizedVMOptions', '-XX:+AllowEnhancedClassRedefinition' // uncomment with jbr + //jvmArgs("-XX:-OmitStackTraceInFastThrow") // uncomment when you get exceptions with null messages etc + //jvmArgs '-XX:+UnlockCommercialFeatures' // uncomment for profiling + + property 'mixin.env.remapRefMap', 'true' + property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" + + arg '-mixin.config=create.mixins.json' + arg '-mixin.config=catnip.mixins.json' + mods { create { source sourceSets.main } - if (flywheelInWorkspace) { - flywheel { - source project(":Flywheel").sourceSets.main - } - } - if (catnipInWorkspace) { catnip { source project(":catnip:Common").sourceSets.main @@ -107,83 +107,37 @@ minecraft { } } + client { + arg '-mixin.config=flywheel.mixins.json' + + mods { + if (flywheelInWorkspace) { + flywheel { + source project(":Flywheel").sourceSets.main + } + } + } + } + server { workingDirectory project.file('run/server') - if (inMultiModWorkspace) - ideaModule "createmod.Create.main" - else - ideaModule "Create.main" - - arg '-mixin.config=create.mixins.json' - property 'forge.logging.console.level', 'info' - mods { - create { - source sourceSets.main - } - - if (catnipInWorkspace) { - catnip { - source project(":catnip:Common").sourceSets.main - source project(":catnip:Forge").sourceSets.main - } - } - - if (ponderInWorkspace) { - ponder { - source project(":Ponder:Common").sourceSets.main - source project(":Ponder:Forge").sourceSets.main - } - } - } } data { - workingDirectory project.file('run') - if (inMultiModWorkspace) - ideaModule "createmod.Create.main" - else - ideaModule "Create.main" - property 'forge.logging.markers', 'REGISTRIES,REGISTRYDUMP' property 'forge.logging.console.level', 'debug' args '--mod', 'create', '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources') mods { - create { - source sourceSets.main - } - if (flywheelInWorkspace) { flywheel { source project(":Flywheel").sourceSets.main } } - - if (catnipInWorkspace) { - catnip { - source project(":catnip:Common").sourceSets.main - source project(":catnip:Forge").sourceSets.main - } - } - - if (ponderInWorkspace) { - ponder { - source project(":Ponder:Common").sourceSets.main - source project(":Ponder:Forge").sourceSets.main - } - } } } gameTestServer { workingDirectory project.file('run/gametest') - arg '-mixin.config=create.mixins.json' - property 'forge.logging.console.level', 'info' - mods { - create { - source sourceSets.main - } - } - //setForceExit false } } @@ -248,6 +202,11 @@ repositories { } } +sourceSets.main.resources { + srcDir 'src/generated/resources' + exclude '.cache/' +} + dependencies { minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}" @@ -315,45 +274,44 @@ sourceSets.main.java { } } -sourceSets.main.resources { - srcDir 'src/generated/resources' - exclude '.cache/' -} - -mixin { - add sourceSets.main, 'create.refmap.json' -} - // Workaround for SpongePowered/MixinGradle#38 afterEvaluate { //tasks.configureReobfTaskForReobfJar.mustRunAfter(tasks.compileJava) //tasks.configureReobfTaskForReobfJarJar.mustRunAfter(tasks.compileJava) } -tasks.withType(JavaCompile).configureEach { - options.encoding = 'UTF-8' // Use the UTF-8 charset for Java compilation +processResources { + def buildProps = project.properties.clone() + + // Replaces FML's magic file.jarVersion string with the correct version at build time. + buildProps.put('file', [jarVersion: project.version]) + + filesMatching(['META-INF/mods.toml', 'pack.mcmeta']) { + expand buildProps + } } compileJava { options.compilerArgs = ['-Xdiags:verbose'] } -jar { - archiveClassifier = 'slim' - manifest { - attributes([ - 'Specification-Title': 'create', - 'Specification-Vendor': 'simibubi', - 'Specification-Version': '1', - 'Implementation-Title': archiveBaseName, - 'Implementation-Version': project.jar.archiveVersion, - 'Implementation-Vendor': 'simibubi', - 'Implementation-Timestamp': new Date().format("yyyy-MM-dd'T'HH:mm:ssZ"), - 'MixinConfigs': 'create.mixins.json' - ]) +void addLicense(jarTask) { + jarTask.from('LICENSE') { + rename { "${it}_${project.archivesBaseName}" } } } +tasks.jar { + archiveClassifier = 'slim' + finalizedBy('reobfJar') + addLicense it +} + +tasks.jarJar { + finalizedBy('reobfJarJar') + addLicense it +} + task jarJarRelease { group = 'jarjar' doLast { @@ -364,28 +322,10 @@ task jarJarRelease { finalizedBy tasks.jarJar } -java { - withSourcesJar() - withJavadocJar() -} - -void addLicense(jarTask) { - jarTask.from('LICENSE') { - rename { "${it}_${project.archivesBaseName}" } - } -} - -jar.finalizedBy('reobfJar') -tasks.jarJar.finalizedBy('reobfJarJar') - -addLicense(jar) -addLicense(tasks.jarJar) - -publishing { +project.publishing { publications { mavenJava(MavenPublication) { - artifactId = archivesBaseName - + artifactId base.archivesName.get() from components.java fg.component(it) jarJar.component(it) diff --git a/gradle.properties b/gradle.properties index d7c83e6bed..9b6830019f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -35,6 +35,16 @@ cc_tweaked_enable = true cc_tweaked_minecraft_version = 1.19.2 cc_tweaked_version = 1.101.2 +# mod options +mod_id = create +mod_name = Create +mod_author = simibubi +mod_homepage = https://www.curseforge.com/minecraft/mc-mods/create +mod_source = https://github.com/Creators-of-Create/Create +mod_issues = https://github.com/Creators-of-Create/Create/issues +mod_description = Technology that empowers the player. +mod_license = MIT + # curseforge information projectId = 328085 curse_type = beta diff --git a/gradle/java.gradle b/gradle/java.gradle new file mode 100644 index 0000000000..3d87b8b34f --- /dev/null +++ b/gradle/java.gradle @@ -0,0 +1,42 @@ +apply plugin: 'java' + +java.toolchain.languageVersion = JavaLanguageVersion.of(17) +java.withSourcesJar() +java.withJavadocJar() + +jar { + manifest { + attributes([ + 'Specification-Title' : mod_name, + 'Specification-Vendor' : mod_author, + 'Specification-Version' : project.jar.archiveVersion, + 'Implementation-Title' : project.name, + 'Implementation-Version' : project.jar.archiveVersion, + 'Implementation-Vendor' : mod_author, + 'Implementation-Timestamp': new Date().format("yyyy-MM-dd'T'HH:mm:ssZ"), + 'Timestampe' : System.currentTimeMillis(), + 'Built-On-Java' : "${System.getProperty('java.vm.version')} (${System.getProperty('java.vm.vendor')})", + 'Build-On-Minecraft' : minecraft_version + ]) + } +} + +tasks.withType(JavaCompile).configureEach { + + it.options.encoding = 'UTF-8' + it.options.release = 17 +} + +// Disables Gradle's custom module metadata from being published to maven. The +// metadata includes mapped dependencies which are not reasonably consumable by +// other mod developers. +tasks.withType(GenerateModuleMetadata) { + + enabled = false +} + +javadoc { + + // Suppress annoying warnings when generating JavaDoc files. + options.addStringOption('Xdoclint:none', '-quiet') +} diff --git a/settings.gradle b/settings.gradle index ecc4e71820..dad6a0a448 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1,12 @@ +pluginManagement { + repositories { + gradlePluginPortal() + mavenCentral() + jcenter() + maven { url = 'https://maven.minecraftforge.net' } + maven { url = 'https://repo.spongepowered.org/repository/maven-public' } + maven { url = 'https://maven.parchmentmc.org' } + } +} + rootProject.name = 'Create' diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index d24edaa0bd..f024c0226d 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -1,20 +1,19 @@ modLoader="javafml" loaderVersion="[43,)" -issueTrackerURL="https://github.com/Creators-of-Create/Create/issues" -license="MIT" +issueTrackerURL="${mod_issues}" +license="${mod_license}" [[mods]] modId="create" -# The Implementation-Version property in the jar's MANIFEST.MF file will be used as the mod version at runtime version="${file.jarVersion}" -displayName="Create" -#updateJSONURL="" -displayURL="https://www.curseforge.com/minecraft/mc-mods/create" +displayName="${mod_name}" +displayURL="${mod_homepage}" logoFile="logo.png" #credits="" -authors="simibubi" +authors="${mod_author}" description=''' -Technology that empowers the player.''' +${mod_description} +''' [[dependencies.create]] modId="forge" From 9620acec0487fae39281ded157013a10f94b92f5 Mon Sep 17 00:00:00 2001 From: zelophed Date: Thu, 17 Aug 2023 16:34:43 +0200 Subject: [PATCH 012/515] update dependency versions --- gradle.properties | 4 ++-- src/main/resources/META-INF/mods.toml | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index 9b6830019f..9ffd6e12d1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -28,8 +28,8 @@ jei_minecraft_version = 1.19.2 jei_version = 11.2.0.254 curios_minecraft_version = 1.19.2 curios_version = 5.1.1.0 -catnip_version = 0.5.7 -ponder_version = 0.5.8 +catnip_version = 0.6.3 +ponder_version = 0.6.3 cc_tweaked_enable = true cc_tweaked_minecraft_version = 1.19.2 diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index f024c0226d..a632d9897b 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -35,3 +35,17 @@ ${mod_description} versionRange="[0.6.9,0.6.10)" ordering="AFTER" side="CLIENT" + +[[dependencies.create]] + modId="catnip" + mandatory=true + versionRange="[0.6,)" + ordering="AFTER" + side="BOTH" + +[[dependencies.create]] + modId="ponder" + mandatory=true + versionRange="[0.6,)" + ordering="AFTER" + side="BOTH" From dce985737c88ed82dbb09308745ade84c49524e6 Mon Sep 17 00:00:00 2001 From: zelophed Date: Sun, 27 Aug 2023 12:11:41 +0200 Subject: [PATCH 013/515] Fixed SmartBE's not being marked as virtual by Ponder - minor improvements to ponderUI animations --- build.gradle | 2 +- gradle.properties | 4 ++-- .../create/foundation/blockEntity/SmartBlockEntity.java | 3 ++- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index 7abc3f02ab..defe2a5cee 100644 --- a/build.gradle +++ b/build.gradle @@ -185,7 +185,7 @@ repositories { } maven { // Location of the maven for Ponder, Catnip - name 'createmod maven' + name = 'createmod maven' url 'https://maven.createmod.net' } maven { diff --git a/gradle.properties b/gradle.properties index 9ffd6e12d1..1a00be0f6c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -28,8 +28,8 @@ jei_minecraft_version = 1.19.2 jei_version = 11.2.0.254 curios_minecraft_version = 1.19.2 curios_version = 5.1.1.0 -catnip_version = 0.6.3 -ponder_version = 0.6.3 +catnip_version = 0.6.5 +ponder_version = 0.6.5 cc_tweaked_enable = true cc_tweaked_minecraft_version = 1.19.2 diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/SmartBlockEntity.java b/src/main/java/com/simibubi/create/foundation/blockEntity/SmartBlockEntity.java index 0e3931ad00..13de100533 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/SmartBlockEntity.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/SmartBlockEntity.java @@ -17,6 +17,7 @@ import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour import com.simibubi.create.foundation.utility.IInteractionChecker; import com.simibubi.create.foundation.utility.IPartialSafeNBT; +import net.createmod.ponder.foundation.VirtualBlockEntity; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; @@ -29,7 +30,7 @@ import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.items.CapabilityItemHandler; public abstract class SmartBlockEntity extends CachedRenderBBBlockEntity - implements IPartialSafeNBT, IInteractionChecker, ISpecialBlockEntityItemRequirement { + implements IPartialSafeNBT, IInteractionChecker, ISpecialBlockEntityItemRequirement, VirtualBlockEntity { private final Map, BlockEntityBehaviour> behaviours = new HashMap<>(); private boolean initialized = false; From e9b0229f7140cb28501ff1af7f538834efd23551 Mon Sep 17 00:00:00 2001 From: zelophed Date: Sat, 9 Sep 2023 15:57:41 +0200 Subject: [PATCH 014/515] refactor part of the ponder registration API --- gradle.properties | 4 +- .../foundation/data/AllLangPartials.java | 4 +- .../foundation/ponder/CreatePonderPlugin.java | 33 +- .../infrastructure/ponder/AllPonderTags.java | 506 +++++++++--------- .../ponder/CreatePonderIndex.java | 12 +- 5 files changed, 291 insertions(+), 268 deletions(-) diff --git a/gradle.properties b/gradle.properties index 3ded1fc61f..98a7172e96 100644 --- a/gradle.properties +++ b/gradle.properties @@ -28,8 +28,8 @@ jei_minecraft_version = 1.19.2 jei_version = 11.2.0.254 curios_minecraft_version = 1.19.2 curios_version = 5.1.1.0 -catnip_version = 0.6.5 -ponder_version = 0.6.5 +catnip_version = 0.7.11 +ponder_version = 0.7.12 cc_tweaked_enable = true cc_tweaked_minecraft_version = 1.19.2 diff --git a/src/main/java/com/simibubi/create/foundation/data/AllLangPartials.java b/src/main/java/com/simibubi/create/foundation/data/AllLangPartials.java index e41c9ef903..cabef94980 100644 --- a/src/main/java/com/simibubi/create/foundation/data/AllLangPartials.java +++ b/src/main/java/com/simibubi/create/foundation/data/AllLangPartials.java @@ -7,7 +7,7 @@ import com.simibubi.create.Create; import com.simibubi.create.foundation.advancement.AllAdvancements; import net.createmod.catnip.utility.lang.Lang; -import net.createmod.ponder.foundation.PonderLocalization; +import net.createmod.ponder.foundation.PonderIndex; public enum AllLangPartials implements LangPartial { @@ -15,7 +15,7 @@ public enum AllLangPartials implements LangPartial { INTERFACE("UI & Messages"), SUBTITLES("Subtitles", AllSoundEvents::provideLangEntries), TOOLTIPS("Item Descriptions"), - PONDER("Ponder Content", () -> PonderLocalization.provideLangEntries(Create.ID)), + PONDER("Ponder Content", () -> PonderIndex.getLangAccess().provideLangEntries(Create.ID)), ; diff --git a/src/main/java/com/simibubi/create/foundation/ponder/CreatePonderPlugin.java b/src/main/java/com/simibubi/create/foundation/ponder/CreatePonderPlugin.java index 5e918c70b2..feb70b3323 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/CreatePonderPlugin.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/CreatePonderPlugin.java @@ -1,6 +1,5 @@ package com.simibubi.create.foundation.ponder; -import java.util.function.BiConsumer; import java.util.function.Predicate; import java.util.stream.Stream; @@ -9,36 +8,40 @@ import com.simibubi.create.infrastructure.ponder.AllPonderTags; import com.simibubi.create.infrastructure.ponder.CreatePonderIndex; import net.createmod.ponder.foundation.PonderLevel; -import net.createmod.ponder.foundation.PonderPlugin; +import net.createmod.ponder.foundation.api.registration.PonderPlugin; +import net.createmod.ponder.foundation.api.registration.PonderSceneRegistrationHelper; +import net.createmod.ponder.foundation.api.registration.PonderTagRegistrationHelper; +import net.createmod.ponder.foundation.api.registration.SharedTextRegistrationHelper; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.ItemLike; public class CreatePonderPlugin implements PonderPlugin { @Override - public String getModID() { + public String getModId() { return Create.ID; } @Override - public void registerScenes() { - CreatePonderIndex.register(); + public void registerScenes(PonderSceneRegistrationHelper helper) { + CreatePonderIndex.register(helper); } @Override - public void registerTags() { - AllPonderTags.register(); + public void registerTags(PonderTagRegistrationHelper helper) { + AllPonderTags.register(helper); } @Override - public void registerSharedText(BiConsumer adder) { - adder.accept("rpm8", "8 RPM"); - adder.accept("rpm16", "16 RPM"); - adder.accept("rpm16_source", "Source: 16 RPM"); - adder.accept("rpm32", "32 RPM"); + public void registerSharedText(SharedTextRegistrationHelper helper) { + helper.registerSharedText("rpm8", "8 RPM"); + helper.registerSharedText("rpm16", "16 RPM"); + helper.registerSharedText("rpm16_source", "Source: 16 RPM"); + helper.registerSharedText("rpm32", "32 RPM"); - adder.accept("movement_anchors", "With the help of Super Glue, larger structures can be moved."); - adder.accept("behaviour_modify_wrench", "This behaviour can be modified using a Wrench"); - adder.accept("storage_on_contraption", "Inventories attached to the Contraption will pick up their drops automatically"); + helper.registerSharedText("movement_anchors", "With the help of Super Glue, larger structures can be moved."); + helper.registerSharedText("behaviour_modify_wrench", "This behaviour can be modified using a Wrench"); + helper.registerSharedText("storage_on_contraption", "Inventories attached to the Contraption will pick up their drops automatically"); } @Override diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/AllPonderTags.java b/src/main/java/com/simibubi/create/infrastructure/ponder/AllPonderTags.java index d03a8a0ece..51e73e6767 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/AllPonderTags.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/AllPonderTags.java @@ -4,330 +4,354 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.Create; import com.simibubi.create.compat.Mods; -import com.tterrag.registrate.util.entry.ItemProviderEntry; import com.tterrag.registrate.util.entry.RegistryEntry; -import net.createmod.ponder.foundation.CustomPonderRegistrationHelper; +import net.createmod.catnip.platform.CatnipServices; import net.createmod.ponder.foundation.PonderTag; +import net.createmod.ponder.foundation.api.registration.PonderTagRegistrationHelper; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.Items; +import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraftforge.registries.ForgeRegistries; public class AllPonderTags { - private static final CustomPonderRegistrationHelper> HELPER = new CustomPonderRegistrationHelper<>(Create.ID, RegistryEntry::getId); - public static final PonderTag KINETIC_RELAYS = create("kinetic_relays").item(AllBlocks.COGWHEEL.get()) - .defaultLang("Kinetic Blocks", "Components which help relaying Rotational Force elsewhere") - .addToIndex(), + .defaultLang("Kinetic Blocks", "Components which help relaying Rotational Force elsewhere"), - KINETIC_SOURCES = create("kinetic_sources").item(AllBlocks.WATER_WHEEL.get()) - .defaultLang("Kinetic Sources", "Components which generate Rotational Force") - .addToIndex(), + KINETIC_SOURCES = create("kinetic_sources").item(AllBlocks.WATER_WHEEL.get()) + .defaultLang("Kinetic Sources", "Components which generate Rotational Force"), - KINETIC_APPLIANCES = create("kinetic_appliances").item(AllBlocks.MECHANICAL_PRESS.get()) - .defaultLang("Kinetic Appliances", "Components which make use of Rotational Force") - .addToIndex(), + KINETIC_APPLIANCES = create("kinetic_appliances").item(AllBlocks.MECHANICAL_PRESS.get()) + .defaultLang("Kinetic Appliances", "Components which make use of Rotational Force"), - FLUIDS = create("fluids").item(AllBlocks.FLUID_PIPE.get()) - .defaultLang("Fluid Manipulators", "Components which help relaying and making use of Fluids") - .addToIndex(), + FLUIDS = create("fluids").item(AllBlocks.FLUID_PIPE.get()) + .defaultLang("Fluid Manipulators", "Components which help relaying and making use of Fluids"), - LOGISTICS = create("logistics").item(Blocks.CHEST) - .defaultLang("Item Transportation", "Components which help moving items around") - .addToIndex(), + LOGISTICS = create("logistics").item(Blocks.CHEST) + .defaultLang("Item Transportation", "Components which help moving items around"), - REDSTONE = create("redstone").item(Items.REDSTONE) - .defaultLang("Logic Components", "Components which help with redstone engineering") - .addToIndex(), + REDSTONE = create("redstone").item(Items.REDSTONE) + .defaultLang("Logic Components", "Components which help with redstone engineering"), - DECORATION = create("decoration").item(Items.ROSE_BUSH) + DECORATION = create("decoration").item(Items.ROSE_BUSH) .defaultLang("Aesthetics", "Components used mostly for decorative purposes"), - CREATIVE = create("creative").item(AllBlocks.CREATIVE_CRATE.get()) - .defaultLang("Creative Mode", "Components not usually available for Survival Mode") - .addToIndex(), + CREATIVE = create("creative").item(AllBlocks.CREATIVE_CRATE.get()) + .defaultLang("Creative Mode", "Components not usually available for Survival Mode"), - MOVEMENT_ANCHOR = create("movement_anchor").item(AllBlocks.MECHANICAL_PISTON.get()) + MOVEMENT_ANCHOR = create("movement_anchor").item(AllBlocks.MECHANICAL_PISTON.get()) .defaultLang("Movement Anchors", - "Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways") - .addToIndex(), + "Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways"), - CONTRAPTION_ACTOR = create("contraption_actor").item(AllBlocks.MECHANICAL_HARVESTER.get()) + CONTRAPTION_ACTOR = create("contraption_actor").item(AllBlocks.MECHANICAL_HARVESTER.get()) .defaultLang("Contraption Actors", - "Components which expose special behaviour when attached to a moving contraption") - .addToIndex(), + "Components which expose special behaviour when attached to a moving contraption"), - CONTRAPTION_ASSEMBLY = create("contraption_assembly").item(AllItems.SUPER_GLUE.get()) + CONTRAPTION_ASSEMBLY = create("contraption_assembly").item(AllItems.SUPER_GLUE.get()) .defaultLang("Block Attachment Utility", - "Tools and Components used to assemble structures moved as an animated Contraption") - .addToIndex(), + "Tools and Components used to assemble structures moved as an animated Contraption"), - SAILS = create("windmill_sails").item(AllBlocks.WINDMILL_BEARING.get(), true, true) + SAILS = create("windmill_sails").item(AllBlocks.WINDMILL_BEARING.get(), true, true) .defaultLang("Sails for Windmill Bearings", - "Blocks that count towards the strength of a Windmill Contraption when assembled. Each of these have equal efficiency in doing so."), + "Blocks that count towards the strength of a Windmill Contraption when assembled. Each of these have equal efficiency in doing so."), - ARM_TARGETS = create("arm_targets").item(AllBlocks.MECHANICAL_ARM.get(), true, true) + ARM_TARGETS = create("arm_targets").item(AllBlocks.MECHANICAL_ARM.get(), true, true) .defaultLang("Targets for Mechanical Arms", - "Components which can be selected as inputs or outputs to the Mechanical Arm"), + "Components which can be selected as inputs or outputs to the Mechanical Arm"), - TRAIN_RELATED = create("train_related").item(AllBlocks.TRACK.get()) - .defaultLang("Railway Equipment", "Components used in the construction or management of Train Contraptions") - .addToIndex(), + TRAIN_RELATED = create("train_related").item(AllBlocks.TRACK.get()) + .defaultLang("Railway Equipment", + "Components used in the construction or management of Train Contraptions"), - RECENTLY_UPDATED = create("recently_updated").item(AllBlocks.CLIPBOARD.get()) + RECENTLY_UPDATED = create("recently_updated").item(AllBlocks.CLIPBOARD.get()) .defaultLang("Recent Changes", - "Components that have been added or changed significantly in the latest versions of Create") - .addToIndex(), + "Components that have been added or changed significantly in the latest versions of Create"), - DISPLAY_SOURCES = create("display_sources").item(AllBlocks.DISPLAY_LINK.get(), true, true) + DISPLAY_SOURCES = create("display_sources").item(AllBlocks.DISPLAY_LINK.get(), true, true) .defaultLang("Sources for Display Links", - "Components or Blocks which offer some data that can be read with a Display Link"), + "Components or Blocks which offer some data that can be read with a Display Link"), - DISPLAY_TARGETS = create("display_targets").item(AllBlocks.DISPLAY_LINK.get(), true, true) + DISPLAY_TARGETS = create("display_targets").item(AllBlocks.DISPLAY_LINK.get(), true, true) .defaultLang("Targets for Display Links", - "Components or Blocks which can process and display the data received from a Display Link"); + "Components or Blocks which can process and display the data received from a Display Link"); private static PonderTag create(String id) { return new PonderTag(Create.asResource(id)); } - public static void register() { - // Add items to tags here + public static void register(PonderTagRegistrationHelper helper) { + + PonderTagRegistrationHelper> HELPER = helper.withKeyFunction(RegistryEntry::getId); + + PonderTagRegistrationHelper itemHelper = helper.withKeyFunction( + CatnipServices.REGISTRIES::getKeyOrThrow); + + helper + .registerTag(KINETIC_RELAYS, true) + .registerTag(KINETIC_SOURCES, true) + .registerTag(KINETIC_APPLIANCES, true) + .registerTag(FLUIDS, true) + .registerTag(LOGISTICS, true) + .registerTag(REDSTONE, true) + .registerTag(DECORATION, true) + .registerTag(CREATIVE, true) + .registerTag(MOVEMENT_ANCHOR, true) + .registerTag(CONTRAPTION_ACTOR, true) + .registerTag(CONTRAPTION_ASSEMBLY, true) + .registerTag(SAILS) + .registerTag(ARM_TARGETS) + .registerTag(TRAIN_RELATED, true) + .registerTag(RECENTLY_UPDATED, true) + .registerTag(DISPLAY_SOURCES) + .registerTag(DISPLAY_TARGETS); HELPER.addToTag(RECENTLY_UPDATED) - .add(AllBlocks.WATER_WHEEL) - .add(AllBlocks.LARGE_WATER_WHEEL) - .add(AllBlocks.COPPER_VALVE_HANDLE) - .add(AllBlocks.ELEVATOR_PULLEY) - .add(AllBlocks.CONTRAPTION_CONTROLS) - .add(AllBlocks.MECHANICAL_ROLLER) - .add(AllBlocks.MECHANICAL_PUMP) - .add(AllBlocks.SMART_OBSERVER) - .add(AllBlocks.THRESHOLD_SWITCH) - .add(AllItems.NETHERITE_BACKTANK) - .add(AllBlocks.COPYCAT_PANEL) - .add(AllBlocks.COPYCAT_STEP); + .add(AllBlocks.WATER_WHEEL) + .add(AllBlocks.LARGE_WATER_WHEEL) + .add(AllBlocks.COPPER_VALVE_HANDLE) + .add(AllBlocks.ELEVATOR_PULLEY) + .add(AllBlocks.CONTRAPTION_CONTROLS) + .add(AllBlocks.MECHANICAL_ROLLER) + .add(AllBlocks.MECHANICAL_PUMP) + .add(AllBlocks.SMART_OBSERVER) + .add(AllBlocks.THRESHOLD_SWITCH) + .add(AllItems.NETHERITE_BACKTANK) + .add(AllBlocks.COPYCAT_PANEL) + .add(AllBlocks.COPYCAT_STEP); HELPER.addToTag(KINETIC_RELAYS) - .add(AllBlocks.SHAFT) - .add(AllBlocks.COGWHEEL) - .add(AllBlocks.LARGE_COGWHEEL) - .add(AllItems.BELT_CONNECTOR) - .add(AllBlocks.GEARBOX) - .add(AllBlocks.CLUTCH) - .add(AllBlocks.GEARSHIFT) - .add(AllBlocks.ENCASED_CHAIN_DRIVE) - .add(AllBlocks.ADJUSTABLE_CHAIN_GEARSHIFT) - .add(AllBlocks.SEQUENCED_GEARSHIFT) - .add(AllBlocks.ROTATION_SPEED_CONTROLLER); + .add(AllBlocks.SHAFT) + .add(AllBlocks.COGWHEEL) + .add(AllBlocks.LARGE_COGWHEEL) + .add(AllItems.BELT_CONNECTOR) + .add(AllBlocks.GEARBOX) + .add(AllBlocks.CLUTCH) + .add(AllBlocks.GEARSHIFT) + .add(AllBlocks.ENCASED_CHAIN_DRIVE) + .add(AllBlocks.ADJUSTABLE_CHAIN_GEARSHIFT) + .add(AllBlocks.SEQUENCED_GEARSHIFT) + .add(AllBlocks.ROTATION_SPEED_CONTROLLER); HELPER.addToTag(KINETIC_SOURCES) - .add(AllBlocks.HAND_CRANK) - .add(AllBlocks.COPPER_VALVE_HANDLE) - .add(AllBlocks.WATER_WHEEL) - .add(AllBlocks.LARGE_WATER_WHEEL) - .add(AllBlocks.WINDMILL_BEARING) - .add(AllBlocks.STEAM_ENGINE) - .add(AllBlocks.CREATIVE_MOTOR); + .add(AllBlocks.HAND_CRANK) + .add(AllBlocks.COPPER_VALVE_HANDLE) + .add(AllBlocks.WATER_WHEEL) + .add(AllBlocks.LARGE_WATER_WHEEL) + .add(AllBlocks.WINDMILL_BEARING) + .add(AllBlocks.STEAM_ENGINE) + .add(AllBlocks.CREATIVE_MOTOR); HELPER.addToTag(TRAIN_RELATED) - .add(AllBlocks.TRACK) - .add(AllBlocks.TRACK_STATION) - .add(AllBlocks.TRACK_SIGNAL) - .add(AllBlocks.TRACK_OBSERVER) - .add(AllBlocks.TRAIN_CONTROLS) - .add(AllItems.SCHEDULE) - .add(AllBlocks.TRAIN_DOOR) - .add(AllBlocks.TRAIN_TRAPDOOR) - .add(AllBlocks.RAILWAY_CASING); + .add(AllBlocks.TRACK) + .add(AllBlocks.TRACK_STATION) + .add(AllBlocks.TRACK_SIGNAL) + .add(AllBlocks.TRACK_OBSERVER) + .add(AllBlocks.TRAIN_CONTROLS) + .add(AllItems.SCHEDULE) + .add(AllBlocks.TRAIN_DOOR) + .add(AllBlocks.TRAIN_TRAPDOOR) + .add(AllBlocks.RAILWAY_CASING); HELPER.addToTag(KINETIC_APPLIANCES) - .add(AllBlocks.MILLSTONE) - .add(AllBlocks.TURNTABLE) - .add(AllBlocks.ENCASED_FAN) - .add(AllBlocks.CUCKOO_CLOCK) - .add(AllBlocks.MECHANICAL_PRESS) - .add(AllBlocks.MECHANICAL_MIXER) - .add(AllBlocks.MECHANICAL_CRAFTER) - .add(AllBlocks.MECHANICAL_DRILL) - .add(AllBlocks.MECHANICAL_SAW) - .add(AllBlocks.DEPLOYER) - .add(AllBlocks.MECHANICAL_PUMP) - .add(AllBlocks.MECHANICAL_ARM) - .add(AllBlocks.MECHANICAL_PISTON) - .add(AllBlocks.ROPE_PULLEY) - .add(AllBlocks.ELEVATOR_PULLEY) - .add(AllBlocks.MECHANICAL_BEARING) - .add(AllBlocks.GANTRY_SHAFT) - .add(AllBlocks.GANTRY_CARRIAGE) - .add(AllBlocks.CLOCKWORK_BEARING) - .add(AllBlocks.DISPLAY_BOARD) - .add(AllBlocks.CRUSHING_WHEEL); + .add(AllBlocks.MILLSTONE) + .add(AllBlocks.TURNTABLE) + .add(AllBlocks.ENCASED_FAN) + .add(AllBlocks.CUCKOO_CLOCK) + .add(AllBlocks.MECHANICAL_PRESS) + .add(AllBlocks.MECHANICAL_MIXER) + .add(AllBlocks.MECHANICAL_CRAFTER) + .add(AllBlocks.MECHANICAL_DRILL) + .add(AllBlocks.MECHANICAL_SAW) + .add(AllBlocks.DEPLOYER) + .add(AllBlocks.MECHANICAL_PUMP) + .add(AllBlocks.MECHANICAL_ARM) + .add(AllBlocks.MECHANICAL_PISTON) + .add(AllBlocks.ROPE_PULLEY) + .add(AllBlocks.ELEVATOR_PULLEY) + .add(AllBlocks.MECHANICAL_BEARING) + .add(AllBlocks.GANTRY_SHAFT) + .add(AllBlocks.GANTRY_CARRIAGE) + .add(AllBlocks.CLOCKWORK_BEARING) + .add(AllBlocks.DISPLAY_BOARD) + .add(AllBlocks.CRUSHING_WHEEL); HELPER.addToTag(FLUIDS) - .add(AllBlocks.FLUID_PIPE) - .add(AllBlocks.MECHANICAL_PUMP) - .add(AllBlocks.FLUID_VALVE) - .add(AllBlocks.SMART_FLUID_PIPE) - .add(AllBlocks.HOSE_PULLEY) - .add(AllBlocks.ITEM_DRAIN) - .add(AllBlocks.SPOUT) - .add(AllBlocks.PORTABLE_FLUID_INTERFACE) - .add(AllBlocks.FLUID_TANK) - .add(AllBlocks.CREATIVE_FLUID_TANK); + .add(AllBlocks.FLUID_PIPE) + .add(AllBlocks.MECHANICAL_PUMP) + .add(AllBlocks.FLUID_VALVE) + .add(AllBlocks.SMART_FLUID_PIPE) + .add(AllBlocks.HOSE_PULLEY) + .add(AllBlocks.ITEM_DRAIN) + .add(AllBlocks.SPOUT) + .add(AllBlocks.PORTABLE_FLUID_INTERFACE) + .add(AllBlocks.FLUID_TANK) + .add(AllBlocks.CREATIVE_FLUID_TANK); HELPER.addToTag(ARM_TARGETS) - .add(AllBlocks.MECHANICAL_ARM) - .add(AllItems.BELT_CONNECTOR) - .add(AllBlocks.CHUTE) - .add(AllBlocks.DEPOT) - .add(AllBlocks.WEIGHTED_EJECTOR) - .add(AllBlocks.BASIN) - .add(AllBlocks.ANDESITE_FUNNEL) - .add(AllBlocks.BRASS_FUNNEL) - .add(AllBlocks.MECHANICAL_CRAFTER) - .add(AllBlocks.MILLSTONE) - .add(AllBlocks.DEPLOYER) - .add(AllBlocks.MECHANICAL_SAW) - .add(AllBlocks.BLAZE_BURNER) - .add(AllBlocks.CRUSHING_WHEEL) - .add(AllBlocks.TRACK_STATION) - .add(Blocks.COMPOSTER) - .add(Blocks.JUKEBOX) - .add(Blocks.CAMPFIRE) - .add(Blocks.SOUL_CAMPFIRE) - .add(Blocks.RESPAWN_ANCHOR); + .add(AllBlocks.MECHANICAL_ARM) + .add(AllItems.BELT_CONNECTOR) + .add(AllBlocks.CHUTE) + .add(AllBlocks.DEPOT) + .add(AllBlocks.WEIGHTED_EJECTOR) + .add(AllBlocks.BASIN) + .add(AllBlocks.ANDESITE_FUNNEL) + .add(AllBlocks.BRASS_FUNNEL) + .add(AllBlocks.MECHANICAL_CRAFTER) + .add(AllBlocks.MILLSTONE) + .add(AllBlocks.DEPLOYER) + .add(AllBlocks.MECHANICAL_SAW) + .add(AllBlocks.BLAZE_BURNER) + .add(AllBlocks.CRUSHING_WHEEL) + .add(AllBlocks.TRACK_STATION); + + itemHelper.addToTag(ARM_TARGETS) + .add(Blocks.COMPOSTER) + .add(Blocks.JUKEBOX) + .add(Blocks.CAMPFIRE) + .add(Blocks.SOUL_CAMPFIRE) + .add(Blocks.RESPAWN_ANCHOR); HELPER.addToTag(LOGISTICS) - .add(AllItems.BELT_CONNECTOR) - .add(AllItems.FILTER) - .add(AllItems.ATTRIBUTE_FILTER) - .add(AllBlocks.CHUTE) - .add(AllBlocks.SMART_CHUTE) - .add(AllBlocks.ITEM_VAULT) - .add(AllBlocks.DEPOT) - .add(AllBlocks.WEIGHTED_EJECTOR) - .add(AllBlocks.MECHANICAL_ARM) - .add(AllBlocks.ANDESITE_FUNNEL) - .add(AllBlocks.BRASS_FUNNEL) - .add(AllBlocks.ANDESITE_TUNNEL) - .add(AllBlocks.BRASS_TUNNEL) - .add(AllBlocks.SMART_OBSERVER) - .add(AllBlocks.THRESHOLD_SWITCH) - .add(AllBlocks.CREATIVE_CRATE) - .add(AllBlocks.PORTABLE_STORAGE_INTERFACE); + .add(AllItems.BELT_CONNECTOR) + .add(AllItems.FILTER) + .add(AllItems.ATTRIBUTE_FILTER) + .add(AllBlocks.CHUTE) + .add(AllBlocks.SMART_CHUTE) + .add(AllBlocks.ITEM_VAULT) + .add(AllBlocks.DEPOT) + .add(AllBlocks.WEIGHTED_EJECTOR) + .add(AllBlocks.MECHANICAL_ARM) + .add(AllBlocks.ANDESITE_FUNNEL) + .add(AllBlocks.BRASS_FUNNEL) + .add(AllBlocks.ANDESITE_TUNNEL) + .add(AllBlocks.BRASS_TUNNEL) + .add(AllBlocks.SMART_OBSERVER) + .add(AllBlocks.THRESHOLD_SWITCH) + .add(AllBlocks.CREATIVE_CRATE) + .add(AllBlocks.PORTABLE_STORAGE_INTERFACE); HELPER.addToTag(DECORATION) - .add(AllBlocks.ORANGE_NIXIE_TUBE) - .add(AllBlocks.DISPLAY_BOARD) - .add(AllBlocks.CUCKOO_CLOCK) - .add(AllBlocks.WOODEN_BRACKET) - .add(AllBlocks.METAL_BRACKET) - .add(AllBlocks.METAL_GIRDER) - .add(AllBlocks.ANDESITE_CASING) - .add(AllBlocks.BRASS_CASING) - .add(AllBlocks.COPPER_CASING) - .add(AllBlocks.RAILWAY_CASING); + .add(AllBlocks.ORANGE_NIXIE_TUBE) + .add(AllBlocks.DISPLAY_BOARD) + .add(AllBlocks.CUCKOO_CLOCK) + .add(AllBlocks.WOODEN_BRACKET) + .add(AllBlocks.METAL_BRACKET) + .add(AllBlocks.METAL_GIRDER) + .add(AllBlocks.ANDESITE_CASING) + .add(AllBlocks.BRASS_CASING) + .add(AllBlocks.COPPER_CASING) + .add(AllBlocks.RAILWAY_CASING); HELPER.addToTag(CREATIVE) - .add(AllBlocks.CREATIVE_CRATE) - .add(AllBlocks.CREATIVE_FLUID_TANK) - .add(AllBlocks.CREATIVE_MOTOR); + .add(AllBlocks.CREATIVE_CRATE) + .add(AllBlocks.CREATIVE_FLUID_TANK) + .add(AllBlocks.CREATIVE_MOTOR); HELPER.addToTag(SAILS) - .add(AllBlocks.SAIL) - .add(AllBlocks.SAIL_FRAME) - .add(Blocks.WHITE_WOOL); + .add(AllBlocks.SAIL) + .add(AllBlocks.SAIL_FRAME); + + itemHelper.addToTag(SAILS) + .add(Blocks.WHITE_WOOL); HELPER.addToTag(REDSTONE) - .add(AllBlocks.SMART_OBSERVER) - .add(AllBlocks.THRESHOLD_SWITCH) - .add(AllBlocks.ORANGE_NIXIE_TUBE) - .add(AllBlocks.REDSTONE_CONTACT) - .add(AllBlocks.ANALOG_LEVER) - .add(AllBlocks.REDSTONE_LINK) - .add(AllBlocks.PULSE_EXTENDER) - .add(AllBlocks.PULSE_REPEATER) - .add(AllBlocks.POWERED_LATCH) - .add(AllBlocks.POWERED_TOGGLE_LATCH) - .add(AllBlocks.ROSE_QUARTZ_LAMP); + .add(AllBlocks.SMART_OBSERVER) + .add(AllBlocks.THRESHOLD_SWITCH) + .add(AllBlocks.ORANGE_NIXIE_TUBE) + .add(AllBlocks.REDSTONE_CONTACT) + .add(AllBlocks.ANALOG_LEVER) + .add(AllBlocks.REDSTONE_LINK) + .add(AllBlocks.PULSE_EXTENDER) + .add(AllBlocks.PULSE_REPEATER) + .add(AllBlocks.POWERED_LATCH) + .add(AllBlocks.POWERED_TOGGLE_LATCH) + .add(AllBlocks.ROSE_QUARTZ_LAMP); HELPER.addToTag(MOVEMENT_ANCHOR) - .add(AllBlocks.MECHANICAL_PISTON) - .add(AllBlocks.WINDMILL_BEARING) - .add(AllBlocks.MECHANICAL_BEARING) - .add(AllBlocks.CLOCKWORK_BEARING) - .add(AllBlocks.ROPE_PULLEY) - .add(AllBlocks.ELEVATOR_PULLEY) - .add(AllBlocks.GANTRY_CARRIAGE) - .add(AllBlocks.CART_ASSEMBLER) - .add(AllBlocks.TRACK_STATION); + .add(AllBlocks.MECHANICAL_PISTON) + .add(AllBlocks.WINDMILL_BEARING) + .add(AllBlocks.MECHANICAL_BEARING) + .add(AllBlocks.CLOCKWORK_BEARING) + .add(AllBlocks.ROPE_PULLEY) + .add(AllBlocks.ELEVATOR_PULLEY) + .add(AllBlocks.GANTRY_CARRIAGE) + .add(AllBlocks.CART_ASSEMBLER) + .add(AllBlocks.TRACK_STATION); HELPER.addToTag(CONTRAPTION_ASSEMBLY) - .add(AllBlocks.LINEAR_CHASSIS) - .add(AllBlocks.SECONDARY_LINEAR_CHASSIS) - .add(AllBlocks.RADIAL_CHASSIS) - .add(AllItems.SUPER_GLUE) - .add(AllBlocks.STICKER) - .add(Blocks.SLIME_BLOCK) - .add(Blocks.HONEY_BLOCK); + .add(AllBlocks.LINEAR_CHASSIS) + .add(AllBlocks.SECONDARY_LINEAR_CHASSIS) + .add(AllBlocks.RADIAL_CHASSIS) + .add(AllItems.SUPER_GLUE) + .add(AllBlocks.STICKER); + + itemHelper.addToTag(CONTRAPTION_ASSEMBLY) + .add(Blocks.SLIME_BLOCK) + .add(Blocks.HONEY_BLOCK); HELPER.addToTag(CONTRAPTION_ACTOR) - .add(AllBlocks.MECHANICAL_HARVESTER) - .add(AllBlocks.MECHANICAL_PLOUGH) - .add(AllBlocks.MECHANICAL_DRILL) - .add(AllBlocks.MECHANICAL_SAW) - .add(AllBlocks.DEPLOYER) - .add(AllBlocks.PORTABLE_STORAGE_INTERFACE) - .add(AllBlocks.PORTABLE_FLUID_INTERFACE) - .add(AllBlocks.MECHANICAL_BEARING) - .add(AllBlocks.ANDESITE_FUNNEL) - .add(AllBlocks.BRASS_FUNNEL) - .add(AllBlocks.SEATS.get(DyeColor.WHITE)) - .add(AllBlocks.TRAIN_CONTROLS) - .add(AllBlocks.CONTRAPTION_CONTROLS) - .add(AllBlocks.REDSTONE_CONTACT) - .add(Blocks.BELL) - .add(Blocks.DISPENSER) - .add(Blocks.DROPPER); + .add(AllBlocks.MECHANICAL_HARVESTER) + .add(AllBlocks.MECHANICAL_PLOUGH) + .add(AllBlocks.MECHANICAL_DRILL) + .add(AllBlocks.MECHANICAL_SAW) + .add(AllBlocks.DEPLOYER) + .add(AllBlocks.PORTABLE_STORAGE_INTERFACE) + .add(AllBlocks.PORTABLE_FLUID_INTERFACE) + .add(AllBlocks.MECHANICAL_BEARING) + .add(AllBlocks.ANDESITE_FUNNEL) + .add(AllBlocks.BRASS_FUNNEL) + .add(AllBlocks.SEATS.get(DyeColor.WHITE)) + .add(AllBlocks.TRAIN_CONTROLS) + .add(AllBlocks.CONTRAPTION_CONTROLS) + .add(AllBlocks.REDSTONE_CONTACT); + + itemHelper.addToTag(CONTRAPTION_ACTOR) + .add(Blocks.BELL) + .add(Blocks.DISPENSER) + .add(Blocks.DROPPER); HELPER.addToTag(DISPLAY_SOURCES) - .add(AllBlocks.SEATS.get(DyeColor.WHITE)) - .add(AllBlocks.ORANGE_NIXIE_TUBE) - .add(AllBlocks.THRESHOLD_SWITCH) - .add(AllBlocks.SMART_OBSERVER) - .add(AllBlocks.ANDESITE_TUNNEL) - .add(AllBlocks.TRACK_OBSERVER) - .add(AllBlocks.TRACK_STATION) - .add(AllBlocks.DISPLAY_LINK) - .add(AllBlocks.BRASS_TUNNEL) - .add(AllBlocks.CUCKOO_CLOCK) - .add(AllBlocks.STRESSOMETER) - .add(AllBlocks.SPEEDOMETER) - .add(AllBlocks.FLUID_TANK) - .add(AllItems.BELT_CONNECTOR) - .add(Blocks.ENCHANTING_TABLE) - .add(Blocks.RESPAWN_ANCHOR) - .add(Blocks.COMMAND_BLOCK) - .add(Blocks.TARGET); + .add(AllBlocks.SEATS.get(DyeColor.WHITE)) + .add(AllBlocks.ORANGE_NIXIE_TUBE) + .add(AllBlocks.THRESHOLD_SWITCH) + .add(AllBlocks.SMART_OBSERVER) + .add(AllBlocks.ANDESITE_TUNNEL) + .add(AllBlocks.TRACK_OBSERVER) + .add(AllBlocks.TRACK_STATION) + .add(AllBlocks.DISPLAY_LINK) + .add(AllBlocks.BRASS_TUNNEL) + .add(AllBlocks.CUCKOO_CLOCK) + .add(AllBlocks.STRESSOMETER) + .add(AllBlocks.SPEEDOMETER) + .add(AllBlocks.FLUID_TANK) + .add(AllItems.BELT_CONNECTOR); + + itemHelper.addToTag(DISPLAY_SOURCES) + .add(Blocks.ENCHANTING_TABLE) + .add(Blocks.RESPAWN_ANCHOR) + .add(Blocks.COMMAND_BLOCK) + .add(Blocks.TARGET); Mods.COMPUTERCRAFT.executeIfInstalled(() -> () -> { Block computer = ForgeRegistries.BLOCKS.getValue(Mods.COMPUTERCRAFT.rl("computer_advanced")); if (computer != null) - HELPER.addToTag(DISPLAY_SOURCES).add(computer); + itemHelper.addToTag(DISPLAY_SOURCES).add(computer); }); HELPER.addToTag(DISPLAY_TARGETS) - .add(AllBlocks.ORANGE_NIXIE_TUBE) - .add(AllBlocks.DISPLAY_BOARD) - .add(AllBlocks.DISPLAY_LINK) - .add(Blocks.OAK_SIGN) - .add(Blocks.LECTERN); + .add(AllBlocks.ORANGE_NIXIE_TUBE) + .add(AllBlocks.DISPLAY_BOARD) + .add(AllBlocks.DISPLAY_LINK); + + itemHelper.addToTag(DISPLAY_TARGETS) + .add(Blocks.OAK_SIGN) + .add(Blocks.LECTERN); } } diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/CreatePonderIndex.java b/src/main/java/com/simibubi/create/infrastructure/ponder/CreatePonderIndex.java index 4f8fe6bd20..7645966a13 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/CreatePonderIndex.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/CreatePonderIndex.java @@ -54,7 +54,8 @@ import com.tterrag.registrate.util.entry.BlockEntry; import com.tterrag.registrate.util.entry.ItemProviderEntry; import com.tterrag.registrate.util.entry.RegistryEntry; -import net.createmod.ponder.foundation.CustomPonderRegistrationHelper; +import net.createmod.ponder.foundation.api.registration.PonderSceneRegistrationHelper; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.BlockItem; import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.block.Block; @@ -62,9 +63,6 @@ import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.RegistryObject; public class CreatePonderIndex { - - static final CustomPonderRegistrationHelper> HELPER = new CustomPonderRegistrationHelper<>(Create.ID, RegistryEntry::getId); - public static final List> INDEX_SCREEN_EXCLUSIONS = List.of( itemLike -> { if (!(itemLike instanceof BlockItem blockItem)) @@ -78,10 +76,8 @@ public class CreatePonderIndex { } ); - public static void register() { - // Register storyboards here - // (!) Added entries require re-launch - // (!) Modifications inside storyboard methods only require re-opening the ui + public static void register(PonderSceneRegistrationHelper helper) { + PonderSceneRegistrationHelper> HELPER = helper.withKeyFunction(RegistryEntry::getId); HELPER.forComponents(AllBlocks.SHAFT) .addStoryBoard("shaft/relay", KineticsScenes::shaftAsRelay, AllPonderTags.KINETIC_RELAYS); From c25968853d4b111c592cdb40d9a0cd19be0874a9 Mon Sep 17 00:00:00 2001 From: zelophed Date: Sat, 16 Sep 2023 13:25:26 +0200 Subject: [PATCH 015/515] more ponder API refactors --- gradle.properties | 4 +- .../displayLink/DisplayLinkScreen.java | 6 +- .../blockEntity/SmartBlockEntity.java | 2 +- .../foundation/ponder/CreatePonderPlugin.java | 27 +- .../foundation/ponder/CreateSceneBuilder.java | 37 +- ...rIndex.java => AllCreatePonderScenes.java} | 133 +- ...nderTags.java => AllCreatePonderTags.java} | 165 ++- .../ponder/scenes/ArmScenes.java | 420 +++---- .../ponder/scenes/BearingScenes.java | 590 ++++----- .../ponder/scenes/BeltScenes.java | 424 +++---- .../ponder/scenes/CartAssemblerScenes.java | 492 ++++---- .../ponder/scenes/ChainDriveScenes.java | 176 +-- .../ponder/scenes/ChassisScenes.java | 545 ++++----- .../ponder/scenes/ChuteScenes.java | 186 +-- .../ponder/scenes/CrafterScenes.java | 316 ++--- .../ponder/scenes/DeployerScenes.java | 442 +++---- .../ponder/scenes/DetectorScenes.java | 340 +++--- .../ponder/scenes/DisplayScenes.java | 366 +++--- .../ponder/scenes/EjectorScenes.java | 272 ++--- .../ponder/scenes/ElevatorScenes.java | 468 +++---- .../ponder/scenes/FanScenes.java | 209 ++-- .../ponder/scenes/FunnelScenes.java | 364 +++--- .../ponder/scenes/GantryScenes.java | 244 ++-- .../ponder/scenes/ItemVaultScenes.java | 198 +-- .../ponder/scenes/KineticsScenes.java | 1073 +++++++++-------- .../ponder/scenes/MechanicalDrillScenes.java | 178 +-- .../ponder/scenes/MechanicalSawScenes.java | 354 +++--- .../ponder/scenes/MovementActorScenes.java | 682 +++++------ .../ponder/scenes/PistonScenes.java | 278 ++--- .../ponder/scenes/ProcessingScenes.java | 620 +++++----- .../ponder/scenes/PulleyScenes.java | 324 ++--- .../ponder/scenes/RedstoneScenes.java | 604 +++++----- .../ponder/scenes/RedstoneScenes2.java | 113 +- .../ponder/scenes/RollerScenes.java | 412 +++---- .../ponder/scenes/SteamScenes.java | 390 +++--- .../ponder/scenes/TemplateScenes.java | 8 +- .../ponder/scenes/TunnelScenes.java | 356 +++--- .../ponder/scenes/fluid/DrainScenes.java | 74 +- .../fluid/FluidMovementActorScenes.java | 126 +- .../ponder/scenes/fluid/FluidTankScenes.java | 348 +++--- .../ponder/scenes/fluid/HosePulleyScenes.java | 262 ++-- .../ponder/scenes/fluid/PipeScenes.java | 456 +++---- .../ponder/scenes/fluid/PumpScenes.java | 276 ++--- .../ponder/scenes/fluid/SpoutScenes.java | 120 +- .../scenes/trains/TrackObserverScenes.java | 144 +-- .../ponder/scenes/trains/TrackScenes.java | 350 +++--- .../ponder/scenes/trains/TrainScenes.java | 210 ++-- .../scenes/trains/TrainSignalScenes.java | 494 ++++---- .../scenes/trains/TrainStationScenes.java | 408 +++---- 49 files changed, 7601 insertions(+), 7485 deletions(-) rename src/main/java/com/simibubi/create/infrastructure/ponder/{CreatePonderIndex.java => AllCreatePonderScenes.java} (83%) rename src/main/java/com/simibubi/create/infrastructure/ponder/{AllPonderTags.java => AllCreatePonderTags.java} (70%) diff --git a/gradle.properties b/gradle.properties index 98a7172e96..8503647fd3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -28,8 +28,8 @@ jei_minecraft_version = 1.19.2 jei_version = 11.2.0.254 curios_minecraft_version = 1.19.2 curios_version = 5.1.1.0 -catnip_version = 0.7.11 -ponder_version = 0.7.12 +catnip_version = 0.7.13 +ponder_version = 0.7.14 cc_tweaked_enable = true cc_tweaked_minecraft_version = 1.19.2 diff --git a/src/main/java/com/simibubi/create/content/redstone/displayLink/DisplayLinkScreen.java b/src/main/java/com/simibubi/create/content/redstone/displayLink/DisplayLinkScreen.java index 8fd8af775e..c4e499792f 100644 --- a/src/main/java/com/simibubi/create/content/redstone/displayLink/DisplayLinkScreen.java +++ b/src/main/java/com/simibubi/create/content/redstone/displayLink/DisplayLinkScreen.java @@ -19,7 +19,7 @@ import com.simibubi.create.foundation.gui.widget.Label; import com.simibubi.create.foundation.gui.widget.ScrollInput; import com.simibubi.create.foundation.gui.widget.SelectionScrollInput; import com.simibubi.create.foundation.utility.CreateLang; -import com.simibubi.create.infrastructure.ponder.AllPonderTags; +import com.simibubi.create.infrastructure.ponder.AllCreatePonderTags; import net.createmod.catnip.gui.AbstractSimiScreen; import net.createmod.catnip.gui.ScreenOpener; @@ -155,7 +155,7 @@ public class DisplayLinkScreen extends AbstractSimiScreen { sourceWidget = new ElementWidget(x + 37, y + 26) .showingElement(GuiGameElement.of(sourceIcon)) .withCallback((mX, mY) -> { - ScreenOpener.open(new PonderTagScreen(AllPonderTags.DISPLAY_SOURCES)); + ScreenOpener.open(new PonderTagScreen(AllCreatePonderTags.DISPLAY_SOURCES)); }); sourceWidget.getToolTip().addAll(List.of( @@ -172,7 +172,7 @@ public class DisplayLinkScreen extends AbstractSimiScreen { targetWidget = new ElementWidget(x + 37, y + 105) .showingElement(GuiGameElement.of(targetIcon)) .withCallback((mX, mY) -> { - ScreenOpener.open(new PonderTagScreen(AllPonderTags.DISPLAY_TARGETS)); + ScreenOpener.open(new PonderTagScreen(AllCreatePonderTags.DISPLAY_TARGETS)); }); targetWidget.getToolTip().addAll(List.of( diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/SmartBlockEntity.java b/src/main/java/com/simibubi/create/foundation/blockEntity/SmartBlockEntity.java index 13de100533..50e33ac190 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/SmartBlockEntity.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/SmartBlockEntity.java @@ -17,7 +17,7 @@ import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour import com.simibubi.create.foundation.utility.IInteractionChecker; import com.simibubi.create.foundation.utility.IPartialSafeNBT; -import net.createmod.ponder.foundation.VirtualBlockEntity; +import net.createmod.ponder.api.VirtualBlockEntity; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; diff --git a/src/main/java/com/simibubi/create/foundation/ponder/CreatePonderPlugin.java b/src/main/java/com/simibubi/create/foundation/ponder/CreatePonderPlugin.java index feb70b3323..6d4961132b 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/CreatePonderPlugin.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/CreatePonderPlugin.java @@ -1,19 +1,18 @@ package com.simibubi.create.foundation.ponder; -import java.util.function.Predicate; -import java.util.stream.Stream; - +import com.simibubi.create.AllBlocks; import com.simibubi.create.Create; -import com.simibubi.create.infrastructure.ponder.AllPonderTags; -import com.simibubi.create.infrastructure.ponder.CreatePonderIndex; +import com.simibubi.create.content.kinetics.crank.ValveHandleBlock; +import com.simibubi.create.infrastructure.ponder.AllCreatePonderScenes; +import com.simibubi.create.infrastructure.ponder.AllCreatePonderTags; +import net.createmod.ponder.api.registration.IndexExclusionHelper; +import net.createmod.ponder.api.registration.PonderPlugin; +import net.createmod.ponder.api.registration.PonderSceneRegistrationHelper; +import net.createmod.ponder.api.registration.PonderTagRegistrationHelper; +import net.createmod.ponder.api.registration.SharedTextRegistrationHelper; import net.createmod.ponder.foundation.PonderLevel; -import net.createmod.ponder.foundation.api.registration.PonderPlugin; -import net.createmod.ponder.foundation.api.registration.PonderSceneRegistrationHelper; -import net.createmod.ponder.foundation.api.registration.PonderTagRegistrationHelper; -import net.createmod.ponder.foundation.api.registration.SharedTextRegistrationHelper; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.ItemLike; public class CreatePonderPlugin implements PonderPlugin { @@ -24,12 +23,12 @@ public class CreatePonderPlugin implements PonderPlugin { @Override public void registerScenes(PonderSceneRegistrationHelper helper) { - CreatePonderIndex.register(helper); + AllCreatePonderScenes.register(helper); } @Override public void registerTags(PonderTagRegistrationHelper helper) { - AllPonderTags.register(helper); + AllCreatePonderTags.register(helper); } @Override @@ -50,7 +49,7 @@ public class CreatePonderPlugin implements PonderPlugin { } @Override - public Stream> indexExclusions() { - return CreatePonderIndex.INDEX_SCREEN_EXCLUSIONS.stream(); + public void indexExclusions(IndexExclusionHelper helper) { + helper.excludeBlockVariants(ValveHandleBlock.class, AllBlocks.COPPER_VALVE_HANDLE.get()); } } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/CreateSceneBuilder.java b/src/main/java/com/simibubi/create/foundation/ponder/CreateSceneBuilder.java index 2a439876b7..f357ad98ee 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/CreateSceneBuilder.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/CreateSceneBuilder.java @@ -31,10 +31,11 @@ import com.simibubi.create.foundation.ponder.instruction.AnimateBlockEntityInstr import net.createmod.catnip.utility.FunctionalHelper; import net.createmod.catnip.utility.NBTHelper; import net.createmod.catnip.utility.VecHelper; +import net.createmod.ponder.api.scene.SceneBuilder; import net.createmod.ponder.foundation.ElementLink; import net.createmod.ponder.foundation.PonderLevel; import net.createmod.ponder.foundation.PonderScene; -import net.createmod.ponder.foundation.SceneBuilder; +import net.createmod.ponder.foundation.PonderSceneBuilder; import net.createmod.ponder.foundation.Selection; import net.createmod.ponder.foundation.element.ParrotElement; import net.createmod.ponder.foundation.element.WorldSectionElement; @@ -49,11 +50,11 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; -public class CreateSceneBuilder extends SceneBuilder { +public class CreateSceneBuilder extends PonderSceneBuilder { - public final EffectInstructions effects; - public final WorldInstructions world; - public final SpecialInstructions special; + private final EffectInstructions effects; + private final WorldInstructions world; + private final SpecialInstructions special; public CreateSceneBuilder(SceneBuilder baseSceneBuilder) { this(baseSceneBuilder.getScene()); @@ -66,7 +67,19 @@ public class CreateSceneBuilder extends SceneBuilder { special = new SpecialInstructions(); } - public class EffectInstructions extends SceneBuilder.EffectInstructions { + public EffectInstructions effects() { + return effects; + } + + public WorldInstructions world() { + return world; + } + + public SpecialInstructions special() { + return special; + } + + public class EffectInstructions extends PonderEffectInstructions { public void superGlue(BlockPos pos, Direction side, boolean fullBlock) { addInstruction(scene -> SuperGlueItem.spawnParticles(scene.getWorld(), pos, side, fullBlock)); @@ -112,7 +125,7 @@ public class CreateSceneBuilder extends SceneBuilder { } - public class WorldInstructions extends SceneBuilder.WorldInstructions { + public class WorldInstructions extends PonderWorldInstructions { public void rotateBearing(BlockPos pos, float angle, int duration) { addInstruction(AnimateBlockEntityInstruction.bearing(pos, angle, duration)); @@ -233,7 +246,7 @@ public class CreateSceneBuilder extends SceneBuilder { public void instructArm(BlockPos armLocation, ArmBlockEntity.Phase phase, ItemStack heldItem, int targetedPoint) { - modifyBlockEntityNBT(scene.getSceneBuildingUtil().select.position(armLocation), ArmBlockEntity.class, + modifyBlockEntityNBT(scene.getSceneBuildingUtil().select().position(armLocation), ArmBlockEntity.class, compound -> { NBTHelper.writeEnum(compound, "Phase", phase); compound.put("HeldItem", heldItem.serializeNBT()); @@ -262,17 +275,17 @@ public class CreateSceneBuilder extends SceneBuilder { } public void animateTrainStation(BlockPos position, boolean trainPresent) { - modifyBlockEntityNBT(getScene().getSceneBuildingUtil().select.position(position), StationBlockEntity.class, + modifyBlockEntityNBT(getScene().getSceneBuildingUtil().select().position(position), StationBlockEntity.class, c -> c.putBoolean("ForceFlag", trainPresent)); } public void conductorBlaze(BlockPos position, boolean conductor) { - modifyBlockEntityNBT(getScene().getSceneBuildingUtil().select.position(position), BlazeBurnerBlockEntity.class, + modifyBlockEntityNBT(getScene().getSceneBuildingUtil().select().position(position), BlazeBurnerBlockEntity.class, c -> c.putBoolean("TrainHat", conductor)); } public void changeSignalState(BlockPos position, SignalBlockEntity.SignalState state) { - modifyBlockEntityNBT(getScene().getSceneBuildingUtil().select.position(position), SignalBlockEntity.class, + modifyBlockEntityNBT(getScene().getSceneBuildingUtil().select().position(position), SignalBlockEntity.class, c -> NBTHelper.writeEnum(c, "State", state)); } @@ -292,7 +305,7 @@ public class CreateSceneBuilder extends SceneBuilder { } - public class SpecialInstructions extends SceneBuilder.SpecialInstructions { + public class SpecialInstructions extends PonderSpecialInstructions { @Override public ElementLink createBirb(Vec3 location, Supplier pose) { diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/CreatePonderIndex.java b/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderScenes.java similarity index 83% rename from src/main/java/com/simibubi/create/infrastructure/ponder/CreatePonderIndex.java rename to src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderScenes.java index 7645966a13..c2d3e655a6 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/CreatePonderIndex.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderScenes.java @@ -1,12 +1,8 @@ package com.simibubi.create.infrastructure.ponder; -import java.util.List; -import java.util.function.Predicate; - import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.Create; -import com.simibubi.create.content.kinetics.crank.ValveHandleBlock; import com.simibubi.create.content.trains.track.TrackBlock; import com.simibubi.create.content.trains.track.TrackMaterial; import com.simibubi.create.infrastructure.ponder.scenes.ArmScenes; @@ -54,50 +50,35 @@ import com.tterrag.registrate.util.entry.BlockEntry; import com.tterrag.registrate.util.entry.ItemProviderEntry; import com.tterrag.registrate.util.entry.RegistryEntry; -import net.createmod.ponder.foundation.api.registration.PonderSceneRegistrationHelper; +import net.createmod.ponder.api.registration.PonderSceneRegistrationHelper; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.BlockItem; -import net.minecraft.world.level.ItemLike; -import net.minecraft.world.level.block.Block; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.RegistryObject; -public class CreatePonderIndex { - public static final List> INDEX_SCREEN_EXCLUSIONS = List.of( - itemLike -> { - if (!(itemLike instanceof BlockItem blockItem)) - return false; - - Block block = blockItem.getBlock(); - if (!(block instanceof ValveHandleBlock)) - return false; - - return !AllBlocks.COPPER_VALVE_HANDLE.is(block); - } - ); +public class AllCreatePonderScenes { public static void register(PonderSceneRegistrationHelper helper) { PonderSceneRegistrationHelper> HELPER = helper.withKeyFunction(RegistryEntry::getId); HELPER.forComponents(AllBlocks.SHAFT) - .addStoryBoard("shaft/relay", KineticsScenes::shaftAsRelay, AllPonderTags.KINETIC_RELAYS); + .addStoryBoard("shaft/relay", KineticsScenes::shaftAsRelay, AllCreatePonderTags.KINETIC_RELAYS); HELPER.forComponents(AllBlocks.SHAFT, AllBlocks.ANDESITE_ENCASED_SHAFT, AllBlocks.BRASS_ENCASED_SHAFT) .addStoryBoard("shaft/encasing", KineticsScenes::shaftsCanBeEncased); HELPER.forComponents(AllBlocks.COGWHEEL) - .addStoryBoard("cog/small", KineticsScenes::cogAsRelay, AllPonderTags.KINETIC_RELAYS) + .addStoryBoard("cog/small", KineticsScenes::cogAsRelay, AllCreatePonderTags.KINETIC_RELAYS) .addStoryBoard("cog/speedup", KineticsScenes::cogsSpeedUp) .addStoryBoard("cog/encasing", KineticsScenes::cogwheelsCanBeEncased); HELPER.forComponents(AllBlocks.LARGE_COGWHEEL) .addStoryBoard("cog/speedup", KineticsScenes::cogsSpeedUp) - .addStoryBoard("cog/large", KineticsScenes::largeCogAsRelay, AllPonderTags.KINETIC_RELAYS) + .addStoryBoard("cog/large", KineticsScenes::largeCogAsRelay, AllCreatePonderTags.KINETIC_RELAYS) .addStoryBoard("cog/encasing", KineticsScenes::cogwheelsCanBeEncased); HELPER.forComponents(AllItems.BELT_CONNECTOR) - .addStoryBoard("belt/connect", BeltScenes::beltConnector, AllPonderTags.KINETIC_RELAYS) + .addStoryBoard("belt/connect", BeltScenes::beltConnector, AllCreatePonderTags.KINETIC_RELAYS) .addStoryBoard("belt/directions", BeltScenes::directions) - .addStoryBoard("belt/transport", BeltScenes::transport, AllPonderTags.LOGISTICS) + .addStoryBoard("belt/transport", BeltScenes::transport, AllCreatePonderTags.LOGISTICS) .addStoryBoard("belt/encasing", BeltScenes::beltsCanBeEncased); HELPER.forComponents(AllBlocks.ANDESITE_CASING, AllBlocks.BRASS_CASING) @@ -105,35 +86,35 @@ public class CreatePonderIndex { .addStoryBoard("belt/encasing", BeltScenes::beltsCanBeEncased); HELPER.forComponents(AllBlocks.GEARBOX, AllItems.VERTICAL_GEARBOX) - .addStoryBoard("gearbox", KineticsScenes::gearbox, AllPonderTags.KINETIC_RELAYS); + .addStoryBoard("gearbox", KineticsScenes::gearbox, AllCreatePonderTags.KINETIC_RELAYS); - HELPER.addStoryBoard(AllBlocks.CLUTCH, "clutch", KineticsScenes::clutch, AllPonderTags.KINETIC_RELAYS); - HELPER.addStoryBoard(AllBlocks.GEARSHIFT, "gearshift", KineticsScenes::gearshift, AllPonderTags.KINETIC_RELAYS); + HELPER.addStoryBoard(AllBlocks.CLUTCH, "clutch", KineticsScenes::clutch, AllCreatePonderTags.KINETIC_RELAYS); + HELPER.addStoryBoard(AllBlocks.GEARSHIFT, "gearshift", KineticsScenes::gearshift, AllCreatePonderTags.KINETIC_RELAYS); HELPER.forComponents(AllBlocks.SEQUENCED_GEARSHIFT) .addStoryBoard("sequenced_gearshift", KineticsScenes::sequencedGearshift); HELPER.forComponents(AllBlocks.ENCASED_FAN) - .addStoryBoard("fan/direction", FanScenes::direction, AllPonderTags.KINETIC_APPLIANCES) + .addStoryBoard("fan/direction", FanScenes::direction, AllCreatePonderTags.KINETIC_APPLIANCES) .addStoryBoard("fan/processing", FanScenes::processing); HELPER.forComponents(AllBlocks.CREATIVE_MOTOR) - .addStoryBoard("creative_motor", KineticsScenes::creativeMotor, AllPonderTags.KINETIC_SOURCES) + .addStoryBoard("creative_motor", KineticsScenes::creativeMotor, AllCreatePonderTags.KINETIC_SOURCES) .addStoryBoard("creative_motor_mojang", KineticsScenes::creativeMotorMojang); HELPER.addStoryBoard(AllBlocks.WATER_WHEEL, "water_wheel", KineticsScenes::waterWheel, - AllPonderTags.KINETIC_SOURCES); + AllCreatePonderTags.KINETIC_SOURCES); HELPER.addStoryBoard(AllBlocks.LARGE_WATER_WHEEL, "large_water_wheel", KineticsScenes::largeWaterWheel, - AllPonderTags.KINETIC_SOURCES); + AllCreatePonderTags.KINETIC_SOURCES); - HELPER.addStoryBoard(AllBlocks.HAND_CRANK, "hand_crank", KineticsScenes::handCrank, AllPonderTags.KINETIC_SOURCES); + HELPER.addStoryBoard(AllBlocks.HAND_CRANK, "hand_crank", KineticsScenes::handCrank, AllCreatePonderTags.KINETIC_SOURCES); HELPER.addStoryBoard(AllBlocks.COPPER_VALVE_HANDLE, "valve_handle", KineticsScenes::valveHandle, - AllPonderTags.KINETIC_SOURCES); + AllCreatePonderTags.KINETIC_SOURCES); HELPER.forComponents(AllBlocks.DYED_VALVE_HANDLES.toArray()) .addStoryBoard("valve_handle", KineticsScenes::valveHandle); HELPER.addStoryBoard(AllBlocks.ENCASED_CHAIN_DRIVE, "chain_drive/relay", ChainDriveScenes::chainDriveAsRelay, - AllPonderTags.KINETIC_RELAYS); + AllCreatePonderTags.KINETIC_RELAYS); HELPER.forComponents(AllBlocks.ENCASED_CHAIN_DRIVE, AllBlocks.ADJUSTABLE_CHAIN_GEARSHIFT) .addStoryBoard("chain_drive/gearshift", ChainDriveScenes::adjustableChainGearshift); @@ -172,12 +153,12 @@ public class CreatePonderIndex { // Vaults HELPER.forComponents(AllBlocks.ITEM_VAULT) - .addStoryBoard("item_vault/storage", ItemVaultScenes::storage, AllPonderTags.LOGISTICS) + .addStoryBoard("item_vault/storage", ItemVaultScenes::storage, AllCreatePonderTags.LOGISTICS) .addStoryBoard("item_vault/sizes", ItemVaultScenes::sizes); // Chutes HELPER.forComponents(AllBlocks.CHUTE) - .addStoryBoard("chute/downward", ChuteScenes::downward, AllPonderTags.LOGISTICS) + .addStoryBoard("chute/downward", ChuteScenes::downward, AllCreatePonderTags.LOGISTICS) .addStoryBoard("chute/upward", ChuteScenes::upward); HELPER.forComponents(AllBlocks.CHUTE, AllBlocks.SMART_CHUTE) .addStoryBoard("chute/smart", ChuteScenes::smart); @@ -185,7 +166,7 @@ public class CreatePonderIndex { // Funnels HELPER.addStoryBoard(AllBlocks.BRASS_FUNNEL, "funnels/brass", FunnelScenes::brass); HELPER.forComponents(AllBlocks.ANDESITE_FUNNEL, AllBlocks.BRASS_FUNNEL) - .addStoryBoard("funnels/intro", FunnelScenes::intro, AllPonderTags.LOGISTICS) + .addStoryBoard("funnels/intro", FunnelScenes::intro, AllCreatePonderTags.LOGISTICS) .addStoryBoard("funnels/direction", FunnelScenes::directionality) .addStoryBoard("funnels/compat", FunnelScenes::compat) .addStoryBoard("funnels/redstone", FunnelScenes::redstone) @@ -200,26 +181,26 @@ public class CreatePonderIndex { // Chassis & Super Glue HELPER.forComponents(AllBlocks.LINEAR_CHASSIS, AllBlocks.SECONDARY_LINEAR_CHASSIS) - .addStoryBoard("chassis/linear_group", ChassisScenes::linearGroup, AllPonderTags.CONTRAPTION_ASSEMBLY) + .addStoryBoard("chassis/linear_group", ChassisScenes::linearGroup, AllCreatePonderTags.CONTRAPTION_ASSEMBLY) .addStoryBoard("chassis/linear_attachment", ChassisScenes::linearAttachement); HELPER.forComponents(AllBlocks.RADIAL_CHASSIS) - .addStoryBoard("chassis/radial", ChassisScenes::radial, AllPonderTags.CONTRAPTION_ASSEMBLY); + .addStoryBoard("chassis/radial", ChassisScenes::radial, AllCreatePonderTags.CONTRAPTION_ASSEMBLY); HELPER.forComponents(AllItems.SUPER_GLUE) - .addStoryBoard("super_glue", ChassisScenes::superGlue, AllPonderTags.CONTRAPTION_ASSEMBLY); + .addStoryBoard("super_glue", ChassisScenes::superGlue, AllCreatePonderTags.CONTRAPTION_ASSEMBLY); HELPER.forComponents(AllBlocks.STICKER) - .addStoryBoard("sticker", RedstoneScenes::sticker, AllPonderTags.CONTRAPTION_ASSEMBLY); + .addStoryBoard("sticker", RedstoneScenes::sticker, AllCreatePonderTags.CONTRAPTION_ASSEMBLY); // Mechanical Arm HELPER.forComponents(AllBlocks.MECHANICAL_ARM) - .addStoryBoard("mechanical_arm/setup", ArmScenes::setup, AllPonderTags.ARM_TARGETS) + .addStoryBoard("mechanical_arm/setup", ArmScenes::setup, AllCreatePonderTags.ARM_TARGETS) .addStoryBoard("mechanical_arm/filter", ArmScenes::filtering) .addStoryBoard("mechanical_arm/modes", ArmScenes::modes) .addStoryBoard("mechanical_arm/redstone", ArmScenes::redstone); // Mechanical Piston HELPER.forComponents(AllBlocks.MECHANICAL_PISTON, AllBlocks.STICKY_MECHANICAL_PISTON) - .addStoryBoard("mechanical_piston/anchor", PistonScenes::movement, AllPonderTags.KINETIC_APPLIANCES, - AllPonderTags.MOVEMENT_ANCHOR); + .addStoryBoard("mechanical_piston/anchor", PistonScenes::movement, AllCreatePonderTags.KINETIC_APPLIANCES, + AllCreatePonderTags.MOVEMENT_ANCHOR); HELPER .forComponents(AllBlocks.MECHANICAL_PISTON, AllBlocks.STICKY_MECHANICAL_PISTON, AllBlocks.PISTON_EXTENSION_POLE) @@ -229,8 +210,8 @@ public class CreatePonderIndex { // Pulleys HELPER.forComponents(AllBlocks.ROPE_PULLEY) - .addStoryBoard("rope_pulley/anchor", PulleyScenes::movement, AllPonderTags.KINETIC_APPLIANCES, - AllPonderTags.MOVEMENT_ANCHOR) + .addStoryBoard("rope_pulley/anchor", PulleyScenes::movement, AllCreatePonderTags.KINETIC_APPLIANCES, + AllCreatePonderTags.MOVEMENT_ANCHOR) .addStoryBoard("rope_pulley/modes", PulleyScenes::movementModes) .addStoryBoard("rope_pulley/multi_rope", PulleyScenes::multiRope) .addStoryBoard("rope_pulley/attachment", PulleyScenes::attachment); @@ -240,9 +221,9 @@ public class CreatePonderIndex { // Windmill Bearing HELPER.forComponents(AllBlocks.WINDMILL_BEARING) - .addStoryBoard("windmill_bearing/source", BearingScenes::windmillsAsSource, AllPonderTags.KINETIC_SOURCES) + .addStoryBoard("windmill_bearing/source", BearingScenes::windmillsAsSource, AllCreatePonderTags.KINETIC_SOURCES) .addStoryBoard("windmill_bearing/structure", BearingScenes::windmillsAnyStructure, - AllPonderTags.MOVEMENT_ANCHOR); + AllCreatePonderTags.MOVEMENT_ANCHOR); HELPER.forComponents(AllBlocks.SAIL) .addStoryBoard("sail", BearingScenes::sail); HELPER.forComponents(AllBlocks.SAIL_FRAME) @@ -250,21 +231,21 @@ public class CreatePonderIndex { // Mechanical Bearing HELPER.forComponents(AllBlocks.MECHANICAL_BEARING) - .addStoryBoard("mechanical_bearing/anchor", BearingScenes::mechanicalBearing, AllPonderTags.KINETIC_APPLIANCES, - AllPonderTags.MOVEMENT_ANCHOR) + .addStoryBoard("mechanical_bearing/anchor", BearingScenes::mechanicalBearing, AllCreatePonderTags.KINETIC_APPLIANCES, + AllCreatePonderTags.MOVEMENT_ANCHOR) .addStoryBoard("mechanical_bearing/modes", BearingScenes::bearingModes) .addStoryBoard("mechanical_bearing/stabilized", BearingScenes::stabilizedBearings, - AllPonderTags.CONTRAPTION_ACTOR); + AllCreatePonderTags.CONTRAPTION_ACTOR); // Clockwork Bearing HELPER.addStoryBoard(AllBlocks.CLOCKWORK_BEARING, "clockwork_bearing", BearingScenes::clockwork, - AllPonderTags.KINETIC_APPLIANCES, AllPonderTags.MOVEMENT_ANCHOR); + AllCreatePonderTags.KINETIC_APPLIANCES, AllCreatePonderTags.MOVEMENT_ANCHOR); // Gantries HELPER.addStoryBoard(AllBlocks.GANTRY_SHAFT, "gantry/intro", GantryScenes::introForShaft, - AllPonderTags.KINETIC_APPLIANCES, AllPonderTags.MOVEMENT_ANCHOR); + AllCreatePonderTags.KINETIC_APPLIANCES, AllCreatePonderTags.MOVEMENT_ANCHOR); HELPER.addStoryBoard(AllBlocks.GANTRY_CARRIAGE, "gantry/intro", GantryScenes::introForPinion, - AllPonderTags.KINETIC_APPLIANCES, AllPonderTags.MOVEMENT_ANCHOR); + AllCreatePonderTags.KINETIC_APPLIANCES, AllCreatePonderTags.MOVEMENT_ANCHOR); HELPER.forComponents(AllBlocks.GANTRY_SHAFT, AllBlocks.GANTRY_CARRIAGE) .addStoryBoard("gantry/redstone", GantryScenes::redstone) .addStoryBoard("gantry/direction", GantryScenes::direction) @@ -272,31 +253,31 @@ public class CreatePonderIndex { // Cart Assembler HELPER.forComponents(AllBlocks.CART_ASSEMBLER) - .addStoryBoard("cart_assembler/anchor", CartAssemblerScenes::anchor, AllPonderTags.MOVEMENT_ANCHOR) + .addStoryBoard("cart_assembler/anchor", CartAssemblerScenes::anchor, AllCreatePonderTags.MOVEMENT_ANCHOR) .addStoryBoard("cart_assembler/modes", CartAssemblerScenes::modes) .addStoryBoard("cart_assembler/dual", CartAssemblerScenes::dual) .addStoryBoard("cart_assembler/rails", CartAssemblerScenes::rails); // Movement Actors HELPER.forComponents(AllBlocks.PORTABLE_STORAGE_INTERFACE) - .addStoryBoard("portable_interface/transfer", MovementActorScenes::psiTransfer, AllPonderTags.CONTRAPTION_ACTOR) + .addStoryBoard("portable_interface/transfer", MovementActorScenes::psiTransfer, AllCreatePonderTags.CONTRAPTION_ACTOR) .addStoryBoard("portable_interface/redstone", MovementActorScenes::psiRedstone); HELPER.forComponents(AllBlocks.REDSTONE_CONTACT) .addStoryBoard("redstone_contact", RedstoneScenes::contact); HELPER.forComponents(AllBlocks.MECHANICAL_SAW) - .addStoryBoard("mechanical_saw/processing", MechanicalSawScenes::processing, AllPonderTags.KINETIC_APPLIANCES) + .addStoryBoard("mechanical_saw/processing", MechanicalSawScenes::processing, AllCreatePonderTags.KINETIC_APPLIANCES) .addStoryBoard("mechanical_saw/breaker", MechanicalSawScenes::treeCutting) - .addStoryBoard("mechanical_saw/contraption", MechanicalSawScenes::contraption, AllPonderTags.CONTRAPTION_ACTOR); + .addStoryBoard("mechanical_saw/contraption", MechanicalSawScenes::contraption, AllCreatePonderTags.CONTRAPTION_ACTOR); HELPER.forComponents(AllBlocks.MECHANICAL_DRILL) - .addStoryBoard("mechanical_drill/breaker", MechanicalDrillScenes::breaker, AllPonderTags.KINETIC_APPLIANCES) + .addStoryBoard("mechanical_drill/breaker", MechanicalDrillScenes::breaker, AllCreatePonderTags.KINETIC_APPLIANCES) .addStoryBoard("mechanical_drill/contraption", MechanicalDrillScenes::contraption, - AllPonderTags.CONTRAPTION_ACTOR); + AllCreatePonderTags.CONTRAPTION_ACTOR); HELPER.forComponents(AllBlocks.DEPLOYER) - .addStoryBoard("deployer/filter", DeployerScenes::filter, AllPonderTags.KINETIC_APPLIANCES) + .addStoryBoard("deployer/filter", DeployerScenes::filter, AllCreatePonderTags.KINETIC_APPLIANCES) .addStoryBoard("deployer/modes", DeployerScenes::modes) .addStoryBoard("deployer/processing", DeployerScenes::processing) .addStoryBoard("deployer/redstone", DeployerScenes::redstone) - .addStoryBoard("deployer/contraption", DeployerScenes::contraption, AllPonderTags.CONTRAPTION_ACTOR); + .addStoryBoard("deployer/contraption", DeployerScenes::contraption, AllCreatePonderTags.CONTRAPTION_ACTOR); HELPER.forComponents(AllBlocks.MECHANICAL_HARVESTER) .addStoryBoard("harvester", MovementActorScenes::harvester); HELPER.forComponents(AllBlocks.MECHANICAL_PLOUGH) @@ -309,36 +290,36 @@ public class CreatePonderIndex { // Fluids HELPER.forComponents(AllBlocks.FLUID_PIPE) - .addStoryBoard("fluid_pipe/flow", PipeScenes::flow, AllPonderTags.FLUIDS) + .addStoryBoard("fluid_pipe/flow", PipeScenes::flow, AllCreatePonderTags.FLUIDS) .addStoryBoard("fluid_pipe/interaction", PipeScenes::interaction) .addStoryBoard("fluid_pipe/encasing", PipeScenes::encasing); HELPER.forComponents(AllBlocks.COPPER_CASING) .addStoryBoard("fluid_pipe/encasing", PipeScenes::encasing); HELPER.forComponents(AllBlocks.MECHANICAL_PUMP) - .addStoryBoard("mechanical_pump/flow", PumpScenes::flow, AllPonderTags.FLUIDS, AllPonderTags.KINETIC_APPLIANCES) + .addStoryBoard("mechanical_pump/flow", PumpScenes::flow, AllCreatePonderTags.FLUIDS, AllCreatePonderTags.KINETIC_APPLIANCES) .addStoryBoard("mechanical_pump/speed", PumpScenes::speed); HELPER.forComponents(AllBlocks.FLUID_VALVE) - .addStoryBoard("fluid_valve", PipeScenes::valve, AllPonderTags.FLUIDS, AllPonderTags.KINETIC_APPLIANCES); + .addStoryBoard("fluid_valve", PipeScenes::valve, AllCreatePonderTags.FLUIDS, AllCreatePonderTags.KINETIC_APPLIANCES); HELPER.forComponents(AllBlocks.SMART_FLUID_PIPE) - .addStoryBoard("smart_pipe", PipeScenes::smart, AllPonderTags.FLUIDS); + .addStoryBoard("smart_pipe", PipeScenes::smart, AllCreatePonderTags.FLUIDS); HELPER.forComponents(AllBlocks.FLUID_TANK) - .addStoryBoard("fluid_tank/storage", FluidTankScenes::storage, AllPonderTags.FLUIDS) + .addStoryBoard("fluid_tank/storage", FluidTankScenes::storage, AllCreatePonderTags.FLUIDS) .addStoryBoard("fluid_tank/sizes", FluidTankScenes::sizes); HELPER.forComponents(AllBlocks.CREATIVE_FLUID_TANK) - .addStoryBoard("fluid_tank/storage_creative", FluidTankScenes::creative, AllPonderTags.FLUIDS, - AllPonderTags.CREATIVE) + .addStoryBoard("fluid_tank/storage_creative", FluidTankScenes::creative, AllCreatePonderTags.FLUIDS, + AllCreatePonderTags.CREATIVE) .addStoryBoard("fluid_tank/sizes_creative", FluidTankScenes::sizes); HELPER.forComponents(AllBlocks.HOSE_PULLEY) - .addStoryBoard("hose_pulley/intro", HosePulleyScenes::intro, AllPonderTags.FLUIDS, AllPonderTags.KINETIC_APPLIANCES) + .addStoryBoard("hose_pulley/intro", HosePulleyScenes::intro, AllCreatePonderTags.FLUIDS, AllCreatePonderTags.KINETIC_APPLIANCES) .addStoryBoard("hose_pulley/level", HosePulleyScenes::level) .addStoryBoard("hose_pulley/infinite", HosePulleyScenes::infinite); HELPER.forComponents(AllBlocks.SPOUT) - .addStoryBoard("spout", SpoutScenes::filling, AllPonderTags.FLUIDS); + .addStoryBoard("spout", SpoutScenes::filling, AllCreatePonderTags.FLUIDS); HELPER.forComponents(AllBlocks.ITEM_DRAIN) - .addStoryBoard("item_drain", DrainScenes::emptying, AllPonderTags.FLUIDS); + .addStoryBoard("item_drain", DrainScenes::emptying, AllCreatePonderTags.FLUIDS); HELPER.forComponents(AllBlocks.PORTABLE_FLUID_INTERFACE) - .addStoryBoard("portable_interface/transfer_fluid", FluidMovementActorScenes::transfer, AllPonderTags.FLUIDS, - AllPonderTags.CONTRAPTION_ACTOR) + .addStoryBoard("portable_interface/transfer_fluid", FluidMovementActorScenes::transfer, AllCreatePonderTags.FLUIDS, + AllCreatePonderTags.CONTRAPTION_ACTOR) .addStoryBoard("portable_interface/redstone_fluid", MovementActorScenes::psiRedstone); // Redstone diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/AllPonderTags.java b/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderTags.java similarity index 70% rename from src/main/java/com/simibubi/create/infrastructure/ponder/AllPonderTags.java rename to src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderTags.java index 51e73e6767..58ce971cad 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/AllPonderTags.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderTags.java @@ -7,8 +7,7 @@ import com.simibubi.create.compat.Mods; import com.tterrag.registrate.util.entry.RegistryEntry; import net.createmod.catnip.platform.CatnipServices; -import net.createmod.ponder.foundation.PonderTag; -import net.createmod.ponder.foundation.api.registration.PonderTagRegistrationHelper; +import net.createmod.ponder.api.registration.PonderTagRegistrationHelper; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.Items; @@ -17,9 +16,29 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraftforge.registries.ForgeRegistries; -public class AllPonderTags { +public class AllCreatePonderTags { - public static final PonderTag + public static final ResourceLocation + + KINETIC_RELAYS = loc("kinetic_relays"), + KINETIC_SOURCES = loc("kinetic_sources"), + KINETIC_APPLIANCES = loc("kinetic_appliances"), + FLUIDS = loc("fluids"), + LOGISTICS = loc("logistics"), + REDSTONE = loc("redstone"), + DECORATION = loc("decoration"), + CREATIVE = loc("creative"), + MOVEMENT_ANCHOR = loc("movement_anchor"), + CONTRAPTION_ACTOR = loc("contraption_actor"), + CONTRAPTION_ASSEMBLY = loc("contraption_assembly"), + SAILS = loc("windmill_sails"), + ARM_TARGETS = loc("arm_targets"), + TRAIN_RELATED = loc("train_related"), + RECENTLY_UPDATED = loc("recently_updated"), + DISPLAY_SOURCES = loc("display_sources"), + DISPLAY_TARGETS = loc("display_targets"); + + /*public static final PonderTag KINETIC_RELAYS = create("kinetic_relays").item(AllBlocks.COGWHEEL.get()) .defaultLang("Kinetic Blocks", "Components which help relaying Rotational Force elsewhere"), @@ -79,10 +98,10 @@ public class AllPonderTags { DISPLAY_TARGETS = create("display_targets").item(AllBlocks.DISPLAY_LINK.get(), true, true) .defaultLang("Targets for Display Links", - "Components or Blocks which can process and display the data received from a Display Link"); + "Components or Blocks which can process and display the data received from a Display Link");*/ - private static PonderTag create(String id) { - return new PonderTag(Create.asResource(id)); + private static ResourceLocation loc(String id) { + return Create.asResource(id); } public static void register(PonderTagRegistrationHelper helper) { @@ -92,24 +111,120 @@ public class AllPonderTags { PonderTagRegistrationHelper itemHelper = helper.withKeyFunction( CatnipServices.REGISTRIES::getKeyOrThrow); - helper - .registerTag(KINETIC_RELAYS, true) - .registerTag(KINETIC_SOURCES, true) - .registerTag(KINETIC_APPLIANCES, true) - .registerTag(FLUIDS, true) - .registerTag(LOGISTICS, true) - .registerTag(REDSTONE, true) - .registerTag(DECORATION, true) - .registerTag(CREATIVE, true) - .registerTag(MOVEMENT_ANCHOR, true) - .registerTag(CONTRAPTION_ACTOR, true) - .registerTag(CONTRAPTION_ASSEMBLY, true) - .registerTag(SAILS) - .registerTag(ARM_TARGETS) - .registerTag(TRAIN_RELATED, true) - .registerTag(RECENTLY_UPDATED, true) - .registerTag(DISPLAY_SOURCES) - .registerTag(DISPLAY_TARGETS); + helper.registerTag(KINETIC_RELAYS) + .addToIndex() + .item(AllBlocks.COGWHEEL.get()) + .title("Kinetic Blocks") + .description("Components which help relaying Rotational Force elsewhere") + .register(); + + helper.registerTag(KINETIC_SOURCES) + .addToIndex() + .item(AllBlocks.WATER_WHEEL.get()) + .title("Kinetic Sources") + .description("Components which generate Rotational Force") + .register(); + + helper.registerTag(KINETIC_APPLIANCES) + .addToIndex() + .item(AllBlocks.MECHANICAL_PRESS.get()) + .title("Kinetic Appliances") + .description("Components which make use of Rotational Force") + .register(); + + helper.registerTag(FLUIDS) + .addToIndex() + .item(AllBlocks.FLUID_PIPE.get()) + .title("Fluid Manipulators") + .description("Components which help relaying and making use of Fluids") + .register(); + + helper.registerTag(LOGISTICS) + .addToIndex() + .item(Blocks.CHEST) + .title("Item Transportation") + .description("Components which help moving items around") + .register(); + + helper.registerTag(REDSTONE) + .addToIndex() + .item(Items.REDSTONE) + .title("Logic Components") + .description("Components which help with redstone engineering") + .register(); + + helper.registerTag(DECORATION) + .addToIndex() + .item(Items.ROSE_BUSH) + .title("Aesthetics") + .description("Components used mostly for decorative purposes") + .register(); + + helper.registerTag(CREATIVE) + .addToIndex() + .item(AllBlocks.CREATIVE_CRATE.get()) + .title("Creative Mode") + .description("Components not usually available for Survival Mode") + .register(); + + helper.registerTag(MOVEMENT_ANCHOR) + .addToIndex() + .item(AllBlocks.MECHANICAL_PISTON.get()) + .title("Movement Anchors") + .description("Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways") + .register(); + + helper.registerTag(CONTRAPTION_ACTOR) + .addToIndex() + .item(AllBlocks.MECHANICAL_HARVESTER.get()) + .title("Contraption Actors") + .description("Components which expose special behaviour when attached to a moving contraption") + .register(); + + helper.registerTag(CONTRAPTION_ASSEMBLY) + .addToIndex() + .item(AllItems.SUPER_GLUE.get()) + .title("Block Attachment Utility") + .description("Tools and Components used to assemble structures moved as an animated Contraption") + .register(); + + helper.registerTag(SAILS) + .item(AllBlocks.WINDMILL_BEARING.get()) + .title("Sails for Windmill Bearings") + .description("Blocks that count towards the strength of a Windmill Contraption when assembled. Each of these have equal efficiency in doing so.") + .register(); + + helper.registerTag(ARM_TARGETS) + .item(AllBlocks.MECHANICAL_ARM.get()) + .title("Targets for Mechanical Arms") + .description("Components which can be selected as inputs or outputs to the Mechanical Arm") + .register(); + + helper.registerTag(TRAIN_RELATED) + .addToIndex() + .item(AllBlocks.TRACK.get()) + .title("Railway Equipment") + .description("Components used in the construction or management of Train Contraptions") + .register(); + + helper.registerTag(RECENTLY_UPDATED) + .addToIndex() + .item(AllBlocks.CLIPBOARD.get()) + .title("Recent Changes") + .description("Components that have been added or changed significantly in the latest versions of Create") + .register(); + + helper.registerTag(DISPLAY_SOURCES) + .item(AllBlocks.DISPLAY_LINK.get()) + .title("Sources for Display Links") + .description("Components or Blocks which offer some data that can be read with a Display Link") + .register(); + + helper.registerTag(DISPLAY_TARGETS) + .item(AllBlocks.DISPLAY_LINK.get()) + .title("Targets for Display Links") + .description("Components or Blocks which can process and display the data received from a Display Link") + .register(); HELPER.addToTag(RECENTLY_UPDATED) .add(AllBlocks.WATER_WHEEL) diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ArmScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ArmScenes.java index 8ac1a9c62a..d6e2bb7239 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ArmScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ArmScenes.java @@ -8,10 +8,10 @@ import com.simibubi.create.content.logistics.funnel.FunnelBlockEntity; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; import net.createmod.ponder.foundation.ElementLink; import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.SceneBuilder; -import net.createmod.ponder.foundation.SceneBuildingUtil; import net.createmod.ponder.foundation.Selection; import net.createmod.ponder.foundation.element.InputWindowElement; import net.createmod.ponder.foundation.element.WorldSectionElement; @@ -32,83 +32,83 @@ public class ArmScenes { scene.showBasePlate(); ItemStack armItem = AllBlocks.MECHANICAL_ARM.asStack(); - BlockPos armPos = util.grid.at(2, 1, 2); - Selection armSel = util.select.position(armPos); - BlockPos inputDepot = util.grid.at(4, 2, 1); - Vec3 depotSurface = util.vector.blockSurface(inputDepot, Direction.NORTH); - Vec3 armSurface = util.vector.blockSurface(armPos, Direction.WEST); + BlockPos armPos = util.grid().at(2, 1, 2); + Selection armSel = util.select().position(armPos); + BlockPos inputDepot = util.grid().at(4, 2, 1); + Vec3 depotSurface = util.vector().blockSurface(inputDepot, Direction.NORTH); + Vec3 armSurface = util.vector().blockSurface(armPos, Direction.WEST); scene.idle(20); - scene.world.setKineticSpeed(armSel, 0); - scene.world.showSection(armSel, Direction.DOWN); + scene.world().setKineticSpeed(armSel, 0); + scene.world().showSection(armSel, Direction.DOWN); scene.idle(10); - scene.effects.indicateRedstone(armPos); - scene.overlay.showSelectionWithText(armSel, 70) + scene.effects().indicateRedstone(armPos); + scene.overlay().showSelectionWithText(armSel, 70) .attachKeyFrame() .colored(PonderPalette.RED) .text("Mechanical Arms have to be assigned their in- and outputs before they are placed") .pointAt(armSurface) .placeNearTarget(); scene.idle(80); - scene.world.showSection(util.select.fromTo(4, 1, 1, 4, 2, 1), Direction.DOWN); - scene.world.showSection(util.select.fromTo(0, 1, 1, 0, 2, 1), Direction.DOWN); - scene.world.hideSection(armSel, Direction.UP); + scene.world().showSection(util.select().fromTo(4, 1, 1, 4, 2, 1), Direction.DOWN); + scene.world().showSection(util.select().fromTo(0, 1, 1, 0, 2, 1), Direction.DOWN); + scene.world().hideSection(armSel, Direction.UP); scene.idle(20); - scene.overlay.showControls(new InputWindowElement(depotSurface, Pointing.RIGHT).rightClick() + scene.overlay().showControls(new InputWindowElement(depotSurface, Pointing.RIGHT).rightClick() .withItem(armItem), 50); scene.idle(7); AABB depotBounds = AllShapes.CASING_13PX.get(Direction.UP) .bounds(); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.INPUT, new Object(), depotBounds.move(4, 2, 1), 400); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.INPUT, new Object(), depotBounds.move(4, 2, 1), 400); - scene.overlay.showText(70) + scene.overlay().showText(70) .attachKeyFrame() .colored(PonderPalette.INPUT) .text("Right-Click inventories while holding the Arm to assign them as Targets") - .pointAt(util.vector.blockSurface(inputDepot, Direction.WEST)) + .pointAt(util.vector().blockSurface(inputDepot, Direction.WEST)) .placeNearTarget(); scene.idle(80); - BlockPos outputDepot = util.grid.at(0, 2, 1); + BlockPos outputDepot = util.grid().at(0, 2, 1); InputWindowElement input = - new InputWindowElement(util.vector.blockSurface(outputDepot, Direction.NORTH), Pointing.RIGHT).rightClick() + new InputWindowElement(util.vector().blockSurface(outputDepot, Direction.NORTH), Pointing.RIGHT).rightClick() .withItem(armItem); - scene.overlay.showControls(input, 20); + scene.overlay().showControls(input, 20); scene.idle(7); Object second = new Object(); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.INPUT, second, depotBounds.move(0, 2, 1), 100); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.INPUT, second, depotBounds.move(0, 2, 1), 100); scene.idle(25); - scene.overlay.showControls(input, 30); + scene.overlay().showControls(input, 30); scene.idle(7); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, second, depotBounds.move(0, 2, 1), 280); - scene.overlay.showText(70) + scene.overlay().chaseBoundingBoxOutline(PonderPalette.OUTPUT, second, depotBounds.move(0, 2, 1), 280); + scene.overlay().showText(70) .colored(PonderPalette.OUTPUT) .text("Right-Click again to toggle between Input (Blue) and Output (Yellow)") - .pointAt(util.vector.blockSurface(outputDepot, Direction.WEST)) + .pointAt(util.vector().blockSurface(outputDepot, Direction.WEST)) .placeNearTarget(); scene.idle(80); - scene.world.showSection(util.select.position(1, 1, 0), Direction.DOWN); + scene.world().showSection(util.select().position(1, 1, 0), Direction.DOWN); scene.idle(15); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.INPUT, new Object(), depotBounds.move(1, 1, 0), 43); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.INPUT, new Object(), depotBounds.move(1, 1, 0), 43); - scene.overlay.showText(50) + scene.overlay().showText(50) .colored(PonderPalette.WHITE) .text("Left-Click components to remove their Selection") - .pointAt(util.vector.blockSurface(util.grid.at(1, 1, 0), Direction.WEST)) + .pointAt(util.vector().blockSurface(util.grid().at(1, 1, 0), Direction.WEST)) .placeNearTarget(); scene.idle(35); - scene.overlay - .showControls(new InputWindowElement(util.vector.topOf(util.grid.at(1, 1, 0)), Pointing.DOWN).leftClick() + scene.overlay() + .showControls(new InputWindowElement(util.vector().topOf(util.grid().at(1, 1, 0)), Pointing.DOWN).leftClick() .withItem(armItem), 30); scene.idle(50); - scene.world.showSection(armSel, Direction.DOWN); + scene.world().showSection(armSel, Direction.DOWN); scene.idle(10); Vec3 armTop = armSurface.add(0.5, 1.5, 0); - scene.overlay.showText(70) + scene.overlay().showText(70) .attachKeyFrame() .colored(PonderPalette.GREEN) .text("Once placed, the Mechanical Arm will target the blocks selected previously") @@ -116,77 +116,77 @@ public class ArmScenes { .placeNearTarget(); scene.idle(80); - scene.effects.indicateSuccess(armPos); - scene.world.showSection(util.select.fromTo(2, 1, 5, 2, 1, 3) - .add(util.select.position(2, 0, 5)), Direction.DOWN); + scene.effects().indicateSuccess(armPos); + scene.world().showSection(util.select().fromTo(2, 1, 5, 2, 1, 3) + .add(util.select().position(2, 0, 5)), Direction.DOWN); ItemStack copper = new ItemStack(Items.COPPER_INGOT); - scene.world.createItemOnBeltLike(inputDepot, Direction.SOUTH, copper); + scene.world().createItemOnBeltLike(inputDepot, Direction.SOUTH, copper); scene.idle(10); - scene.world.setKineticSpeed(armSel, -48); + scene.world().setKineticSpeed(armSel, -48); scene.idle(20); - scene.world.instructArm(armPos, Phase.MOVE_TO_INPUT, ItemStack.EMPTY, 1); + scene.world().instructArm(armPos, Phase.MOVE_TO_INPUT, ItemStack.EMPTY, 1); scene.idle(24); - scene.world.removeItemsFromBelt(inputDepot); - scene.world.instructArm(armPos, Phase.SEARCH_OUTPUTS, copper, -1); + scene.world().removeItemsFromBelt(inputDepot); + scene.world().instructArm(armPos, Phase.SEARCH_OUTPUTS, copper, -1); scene.idle(20); - scene.world.instructArm(armPos, Phase.MOVE_TO_OUTPUT, copper, 1); + scene.world().instructArm(armPos, Phase.MOVE_TO_OUTPUT, copper, 1); scene.idle(24); - scene.world.createItemOnBeltLike(outputDepot, Direction.UP, copper); - scene.world.instructArm(armPos, Phase.SEARCH_INPUTS, ItemStack.EMPTY, -1); + scene.world().createItemOnBeltLike(outputDepot, Direction.UP, copper); + scene.world().instructArm(armPos, Phase.SEARCH_INPUTS, ItemStack.EMPTY, -1); scene.idle(44); - scene.world.showSection(util.select.fromTo(1, 1, 4, 1, 3, 4), Direction.DOWN); + scene.world().showSection(util.select().fromTo(1, 1, 4, 1, 3, 4), Direction.DOWN); scene.idle(5); - scene.world.showSection(util.select.position(4, 1, 2), Direction.DOWN); + scene.world().showSection(util.select().position(4, 1, 2), Direction.DOWN); scene.idle(5); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, new Object(), depotBounds.move(0, 2, 1), 60); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.OUTPUT, new Object(), depotBounds.move(0, 2, 1), 60); scene.idle(5); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.INPUT, new Object(), depotBounds.move(4, 2, 1), 60); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.INPUT, new Object(), depotBounds.move(4, 2, 1), 60); scene.idle(5); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, new Object(), depotBounds.move(1, 1, 0), 60); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.OUTPUT, new Object(), depotBounds.move(1, 1, 0), 60); scene.idle(5); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.INPUT, new Object(), depotBounds.move(1, 3, 4), 60); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.INPUT, new Object(), depotBounds.move(1, 3, 4), 60); scene.idle(5); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.INPUT, new Object(), depotBounds.move(4, 1, 2), 60); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.INPUT, new Object(), depotBounds.move(4, 1, 2), 60); scene.idle(5); - scene.overlay.showText(80) + scene.overlay().showText(80) .attachKeyFrame() .text("They can have any amount of in- and outputs within their range") - .pointAt(util.vector.blockSurface(util.grid.at(1, 3, 4), Direction.WEST)) + .pointAt(util.vector().blockSurface(util.grid().at(1, 3, 4), Direction.WEST)) .placeNearTarget(); - inputDepot = util.grid.at(1, 3, 4); - outputDepot = util.grid.at(1, 1, 0); + inputDepot = util.grid().at(1, 3, 4); + outputDepot = util.grid().at(1, 1, 0); copper = new ItemStack(Items.COPPER_BLOCK); - scene.world.createItemOnBeltLike(inputDepot, Direction.SOUTH, copper); + scene.world().createItemOnBeltLike(inputDepot, Direction.SOUTH, copper); scene.idle(20); - scene.world.instructArm(armPos, Phase.MOVE_TO_INPUT, ItemStack.EMPTY, 2); + scene.world().instructArm(armPos, Phase.MOVE_TO_INPUT, ItemStack.EMPTY, 2); scene.idle(24); - scene.world.removeItemsFromBelt(inputDepot); - scene.world.instructArm(armPos, Phase.SEARCH_OUTPUTS, copper, -1); + scene.world().removeItemsFromBelt(inputDepot); + scene.world().instructArm(armPos, Phase.SEARCH_OUTPUTS, copper, -1); scene.idle(20); - scene.world.instructArm(armPos, Phase.MOVE_TO_OUTPUT, copper, 0); + scene.world().instructArm(armPos, Phase.MOVE_TO_OUTPUT, copper, 0); scene.idle(24); - scene.world.createItemOnBeltLike(outputDepot, Direction.UP, copper); - scene.world.instructArm(armPos, Phase.SEARCH_INPUTS, ItemStack.EMPTY, -1); + scene.world().createItemOnBeltLike(outputDepot, Direction.UP, copper); + scene.world().instructArm(armPos, Phase.SEARCH_INPUTS, ItemStack.EMPTY, -1); - scene.world.hideSection(util.select.fromTo(4, 2, 1, 4, 1, 1), Direction.UP); + scene.world().hideSection(util.select().fromTo(4, 2, 1, 4, 1, 1), Direction.UP); scene.idle(2); - scene.world.hideSection(util.select.fromTo(1, 1, 4, 1, 3, 4), Direction.UP); + scene.world().hideSection(util.select().fromTo(1, 1, 4, 1, 3, 4), Direction.UP); scene.idle(5); - scene.world.hideSection(util.select.fromTo(0, 1, 1, 0, 2, 1), Direction.UP); + scene.world().hideSection(util.select().fromTo(0, 1, 1, 0, 2, 1), Direction.UP); scene.idle(2); - scene.world.hideSection(util.select.position(1, 1, 0), Direction.UP); + scene.world().hideSection(util.select().position(1, 1, 0), Direction.UP); scene.idle(5); - scene.world.hideSection(util.select.position(4, 1, 2), Direction.UP); + scene.world().hideSection(util.select().position(4, 1, 2), Direction.UP); scene.idle(15); - scene.world.showSection(util.select.fromTo(4, 1, 3, 4, 2, 3), Direction.NORTH); + scene.world().showSection(util.select().fromTo(4, 1, 3, 4, 2, 3), Direction.NORTH); scene.idle(5); - scene.world.showSection(util.select.fromTo(0, 1, 3, 0, 2, 3), Direction.NORTH); + scene.world().showSection(util.select().fromTo(0, 1, 3, 0, 2, 3), Direction.NORTH); scene.idle(15); Object in = new Object(); @@ -194,52 +194,52 @@ public class ArmScenes { AABB chestBounds = new AABB(1 / 16f, 0, 1 / 16f, 15 / 16f, 14 / 16f, 15 / 16f); AABB funnelBounds = new AABB(0, 0, 8 / 16f, 16 / 16f, 16 / 16f, 16 / 16f); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, in, chestBounds.move(4, 2, 3), 120); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, out, chestBounds.move(0, 2, 3), 120); - scene.overlay.showText(80) + scene.overlay().chaseBoundingBoxOutline(PonderPalette.RED, in, chestBounds.move(4, 2, 3), 120); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.RED, out, chestBounds.move(0, 2, 3), 120); + scene.overlay().showText(80) .attachKeyFrame() .text("However, not every type of Inventory can be interacted with directly") .colored(PonderPalette.RED) .placeNearTarget() - .pointAt(util.vector.blockSurface(util.grid.at(0, 2, 3), Direction.WEST)); + .pointAt(util.vector().blockSurface(util.grid().at(0, 2, 3), Direction.WEST)); scene.idle(90); - scene.world.showSection(util.select.fromTo(4, 1, 2, 4, 2, 2), Direction.SOUTH); + scene.world().showSection(util.select().fromTo(4, 1, 2, 4, 2, 2), Direction.SOUTH); scene.idle(5); - scene.world.showSection(util.select.position(0, 2, 2), Direction.SOUTH); + scene.world().showSection(util.select().position(0, 2, 2), Direction.SOUTH); scene.idle(10); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.INPUT, in, depotBounds.move(4, 1, 2), 80); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.INPUT, in, depotBounds.move(4, 1, 2), 80); scene.idle(5); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, out, funnelBounds.move(0, 2, 2), 80); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.OUTPUT, out, funnelBounds.move(0, 2, 2), 80); scene.idle(5); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("Funnels and Depots can help to Bridge that gap") .colored(PonderPalette.OUTPUT) .placeNearTarget() - .pointAt(util.vector.topOf(util.grid.at(0, 2, 2)) + .pointAt(util.vector().topOf(util.grid().at(0, 2, 2)) .add(0, 0, 0.25)); scene.idle(70); ItemStack sword = new ItemStack(Items.GOLDEN_SWORD); - inputDepot = util.grid.at(4, 1, 2); - scene.overlay - .showControls(new InputWindowElement(util.vector.topOf(inputDepot), Pointing.RIGHT).withItem(sword), 30); - scene.world.createItemOnBeltLike(inputDepot, Direction.SOUTH, sword); + inputDepot = util.grid().at(4, 1, 2); + scene.overlay() + .showControls(new InputWindowElement(util.vector().topOf(inputDepot), Pointing.RIGHT).withItem(sword), 30); + scene.world().createItemOnBeltLike(inputDepot, Direction.SOUTH, sword); scene.idle(20); - scene.world.instructArm(armPos, Phase.MOVE_TO_INPUT, ItemStack.EMPTY, 0); + scene.world().instructArm(armPos, Phase.MOVE_TO_INPUT, ItemStack.EMPTY, 0); scene.idle(24); - scene.world.removeItemsFromBelt(inputDepot); - scene.world.instructArm(armPos, Phase.SEARCH_OUTPUTS, sword, -1); + scene.world().removeItemsFromBelt(inputDepot); + scene.world().instructArm(armPos, Phase.SEARCH_OUTPUTS, sword, -1); scene.idle(20); - scene.world.instructArm(armPos, Phase.MOVE_TO_OUTPUT, sword, 2); + scene.world().instructArm(armPos, Phase.MOVE_TO_OUTPUT, sword, 2); scene.idle(24); - scene.world.flapFunnel(util.grid.at(0, 2, 2), false); - scene.world.instructArm(armPos, Phase.SEARCH_INPUTS, ItemStack.EMPTY, -1); + scene.world().flapFunnel(util.grid().at(0, 2, 2), false); + scene.world().instructArm(armPos, Phase.SEARCH_INPUTS, ItemStack.EMPTY, -1); scene.idle(5); - scene.overlay.showControls( - new InputWindowElement(util.vector.blockSurface(util.grid.at(0, 2, 3), Direction.WEST), Pointing.LEFT) + scene.overlay().showControls( + new InputWindowElement(util.vector().blockSurface(util.grid().at(0, 2, 3), Direction.WEST), Pointing.LEFT) .withItem(sword), 30); @@ -250,68 +250,68 @@ public class ArmScenes { scene.title("mechanical_arm_filtering", "Filtering Outputs of the Mechanical Arm"); scene.configureBasePlate(0, 0, 6); scene.scaleSceneView(0.9f); - scene.world.setKineticSpeed(util.select.fromTo(4, 1, 4, 6, 0, 5), 0); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().setKineticSpeed(util.select().fromTo(4, 1, 4, 6, 0, 5), 0); + scene.world().showSection(util.select().layer(0), Direction.UP); scene.idle(10); - scene.world.showSection(util.select.fromTo(4, 1, 4, 5, 1, 5), Direction.DOWN); + scene.world().showSection(util.select().fromTo(4, 1, 4, 5, 1, 5), Direction.DOWN); scene.idle(10); for (int x = 0; x < 2; x++) { scene.idle(3); - scene.world.showSection(util.select.position(x + 1, 1, 4), Direction.DOWN); + scene.world().showSection(util.select().position(x + 1, 1, 4), Direction.DOWN); } for (int y = 0; y < 3; y++) { for (int x = 0; x < 3; x++) { - scene.world.showSection(util.select.position(y == 1 ? x + 3 : 5 - x, y + 1, 1), Direction.DOWN); + scene.world().showSection(util.select().position(y == 1 ? x + 3 : 5 - x, y + 1, 1), Direction.DOWN); scene.idle(2); } } - scene.world.showSection(util.select.position(6, 1, 1), Direction.WEST); - scene.world.showSection(util.select.position(2, 1, 1), Direction.EAST); + scene.world().showSection(util.select().position(6, 1, 1), Direction.WEST); + scene.world().showSection(util.select().position(2, 1, 1), Direction.EAST); ItemStack sand = new ItemStack(Items.SAND, 64); ItemStack sulphur = new ItemStack(Items.GUNPOWDER, 64); - scene.world.createItemOnBeltLike(util.grid.at(2, 1, 4), Direction.SOUTH, sand); - scene.world.createItemOnBeltLike(util.grid.at(1, 1, 4), Direction.SOUTH, sulphur); + scene.world().createItemOnBeltLike(util.grid().at(2, 1, 4), Direction.SOUTH, sand); + scene.world().createItemOnBeltLike(util.grid().at(1, 1, 4), Direction.SOUTH, sulphur); - scene.overlay.showSelectionWithText(util.select.fromTo(2, 1, 4, 1, 1, 4), 60) + scene.overlay().showSelectionWithText(util.select().fromTo(2, 1, 4, 1, 1, 4), 60) .text("Inputs") .placeNearTarget() .colored(PonderPalette.INPUT); scene.idle(50); - scene.overlay.showSelectionWithText(util.select.fromTo(5, 3, 1, 3, 1, 1), 40) + scene.overlay().showSelectionWithText(util.select().fromTo(5, 3, 1, 3, 1, 1), 40) .text("Outputs") .placeNearTarget() .colored(PonderPalette.OUTPUT); scene.idle(50); - scene.overlay.showText(80) + scene.overlay().showText(80) .attachKeyFrame() .text("Sometimes it is desirable to restrict targets of the Arm by matching a filter") .placeNearTarget() - .pointAt(util.vector.blockSurface(util.grid.at(3, 3, 1), Direction.WEST)); + .pointAt(util.vector().blockSurface(util.grid().at(3, 3, 1), Direction.WEST)); scene.idle(90); scene.rotateCameraY(-90 - 30); scene.idle(20); - scene.overlay.showSelectionWithText(util.select.position(4, 1, 4), 80) + scene.overlay().showSelectionWithText(util.select().position(4, 1, 4), 80) .colored(PonderPalette.RED) .text("Mechanical Arms by themselves do not provide any options for filtering") .placeNearTarget(); scene.idle(90); for (int y = 0; y < 3; y++) { - scene.world.showSection(util.select.fromTo(5, y + 1, 2, 3, y + 1, 2), Direction.NORTH); + scene.world().showSection(util.select().fromTo(5, y + 1, 2, 3, y + 1, 2), Direction.NORTH); scene.idle(2); } - Vec3 filterSlot = util.vector.of(3.5, 3.75, 2.6); - scene.overlay.showFilterSlotInput(filterSlot, Direction.NORTH, 80); + Vec3 filterSlot = util.vector().of(3.5, 3.75, 2.6); + scene.overlay().showFilterSlotInput(filterSlot, Direction.NORTH, 80); scene.idle(10); - scene.overlay.showText(80) + scene.overlay().showText(80) .attachKeyFrame() .colored(PonderPalette.GREEN) .pointAt(filterSlot) @@ -322,61 +322,61 @@ public class ArmScenes { for (int y = 0; y < 3; y++) { for (int x = 0; x < 3; x++) { ItemStack item = (x + y) % 2 == 0 ? sulphur : sand; - scene.overlay + scene.overlay() .showControls(new InputWindowElement(filterSlot.add(2 - x, -y, 0), Pointing.LEFT).rightClick() .withItem(item), 5); scene.idle(7); - scene.world.setFilterData(util.select.position(5 - x, 3 - y, 2), FunnelBlockEntity.class, item); + scene.world().setFilterData(util.select().position(5 - x, 3 - y, 2), FunnelBlockEntity.class, item); scene.idle(4); } } - scene.world.setKineticSpeed(util.select.fromTo(4, 1, 4, 6, 0, 5), 24); - scene.world.multiplyKineticSpeed(util.select.position(5, 1, 5), -1); - scene.world.multiplyKineticSpeed(util.select.position(4, 1, 4), 2); + scene.world().setKineticSpeed(util.select().fromTo(4, 1, 4, 6, 0, 5), 24); + scene.world().multiplyKineticSpeed(util.select().position(5, 1, 5), -1); + scene.world().multiplyKineticSpeed(util.select().position(4, 1, 4), 2); scene.idle(10); - BlockPos armPos = util.grid.at(4, 1, 4); - scene.world.instructArm(armPos, Phase.MOVE_TO_INPUT, ItemStack.EMPTY, 1); + BlockPos armPos = util.grid().at(4, 1, 4); + scene.world().instructArm(armPos, Phase.MOVE_TO_INPUT, ItemStack.EMPTY, 1); scene.idle(24); - scene.world.instructArm(armPos, Phase.SEARCH_OUTPUTS, sand, -1); + scene.world().instructArm(armPos, Phase.SEARCH_OUTPUTS, sand, -1); scene.idle(20); - scene.overlay.showText(80) + scene.overlay().showText(80) .attachKeyFrame() - .pointAt(util.vector.topOf(2, 1, 4)) + .pointAt(util.vector().topOf(2, 1, 4)) .text("The Arm is smart enough not to pick up items it couldn't distribute") .placeNearTarget(); scene.idle(90); for (int i = 0; i < 4; i++) { int index = i * 2 + 1; - scene.world.instructArm(armPos, Phase.MOVE_TO_OUTPUT, sand, index); + scene.world().instructArm(armPos, Phase.MOVE_TO_OUTPUT, sand, index); scene.idle(24); - BlockPos funnelPos = util.grid.at(5 - index % 3, 1 + index / 3, 2); - scene.world.flapFunnel(funnelPos, false); - scene.world.instructArm(armPos, Phase.SEARCH_INPUTS, i == 3 ? ItemStack.EMPTY : sand, -1); - scene.world.modifyBlockEntity(funnelPos.north(), MechanicalCrafterBlockEntity.class, mct -> mct.getInventory() + BlockPos funnelPos = util.grid().at(5 - index % 3, 1 + index / 3, 2); + scene.world().flapFunnel(funnelPos, false); + scene.world().instructArm(armPos, Phase.SEARCH_INPUTS, i == 3 ? ItemStack.EMPTY : sand, -1); + scene.world().modifyBlockEntity(funnelPos.north(), MechanicalCrafterBlockEntity.class, mct -> mct.getInventory() .insertItem(0, sand.copy(), false)); scene.idle(10); } - scene.world.instructArm(armPos, Phase.MOVE_TO_INPUT, ItemStack.EMPTY, 0); + scene.world().instructArm(armPos, Phase.MOVE_TO_INPUT, ItemStack.EMPTY, 0); scene.idle(24); - scene.world.instructArm(armPos, Phase.SEARCH_OUTPUTS, sulphur, -1); + scene.world().instructArm(armPos, Phase.SEARCH_OUTPUTS, sulphur, -1); scene.idle(20); scene.rotateCameraY(120); - scene.world.setCraftingResult(util.grid.at(3, 1, 1), new ItemStack(Blocks.TNT)); + scene.world().setCraftingResult(util.grid().at(3, 1, 1), new ItemStack(Blocks.TNT)); for (int i = 0; i < 5; i++) { int index = i * 2; - scene.world.instructArm(armPos, Phase.MOVE_TO_OUTPUT, sulphur, index); + scene.world().instructArm(armPos, Phase.MOVE_TO_OUTPUT, sulphur, index); scene.idle(24); - BlockPos funnelPos = util.grid.at(3 + index % 3, 1 + index / 3, 2); - scene.world.flapFunnel(funnelPos, false); - scene.world.instructArm(armPos, Phase.SEARCH_INPUTS, i == 4 ? ItemStack.EMPTY : sulphur, -1); - scene.world.modifyBlockEntity(funnelPos.north(), MechanicalCrafterBlockEntity.class, mct -> mct.getInventory() + BlockPos funnelPos = util.grid().at(3 + index % 3, 1 + index / 3, 2); + scene.world().flapFunnel(funnelPos, false); + scene.world().instructArm(armPos, Phase.SEARCH_INPUTS, i == 4 ? ItemStack.EMPTY : sulphur, -1); + scene.world().modifyBlockEntity(funnelPos.north(), MechanicalCrafterBlockEntity.class, mct -> mct.getInventory() .insertItem(0, sulphur.copy(), false)); scene.idle(10); } @@ -388,107 +388,107 @@ public class ArmScenes { CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("mechanical_arm_modes", "Distribution modes of the Mechanical Arm"); scene.configureBasePlate(0, 1, 5); - scene.world.setBlock(util.grid.at(3, 1, 0), Blocks.BARRIER.defaultBlockState(), false); + scene.world().setBlock(util.grid().at(3, 1, 0), Blocks.BARRIER.defaultBlockState(), false); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); scene.idle(5); - scene.world.showSection(util.select.fromTo(3, 1, 4, 4, 1, 5), Direction.DOWN); + scene.world().showSection(util.select().fromTo(3, 1, 4, 4, 1, 5), Direction.DOWN); scene.idle(5); - scene.world.showSection(util.select.fromTo(1, 1, 4, 1, 2, 5), Direction.NORTH); + scene.world().showSection(util.select().fromTo(1, 1, 4, 1, 2, 5), Direction.NORTH); scene.idle(5); - scene.world.showSection(util.select.fromTo(1, 1, 1, 5, 1, 2), Direction.SOUTH); + scene.world().showSection(util.select().fromTo(1, 1, 1, 5, 1, 2), Direction.SOUTH); scene.idle(10); AABB depotBox = AllShapes.CASING_13PX.get(Direction.UP) .bounds(); AABB beltBox = depotBox.contract(0, -3 / 16f, 0) .inflate(1, 0, 0); - BlockPos depotPos = util.grid.at(1, 1, 4); - BlockPos armPos = util.grid.at(3, 1, 4); + BlockPos depotPos = util.grid().at(1, 1, 4); + BlockPos armPos = util.grid().at(3, 1, 4); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.INPUT, depotBox, depotBox.move(1, 1, 4), 60); - scene.overlay.showText(30) + scene.overlay().chaseBoundingBoxOutline(PonderPalette.INPUT, depotBox, depotBox.move(1, 1, 4), 60); + scene.overlay().showText(30) .text("Input") - .pointAt(util.vector.blockSurface(depotPos, Direction.WEST)) + .pointAt(util.vector().blockSurface(depotPos, Direction.WEST)) .placeNearTarget() .colored(PonderPalette.INPUT); scene.idle(40); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, depotBox, beltBox.move(2, 1, 2), 40); - scene.overlay.showText(40) + scene.overlay().chaseBoundingBoxOutline(PonderPalette.OUTPUT, depotBox, beltBox.move(2, 1, 2), 40); + scene.overlay().showText(40) .text("Outputs") - .pointAt(util.vector.blockSurface(util.grid.at(1, 1, 2), Direction.WEST)) + .pointAt(util.vector().blockSurface(util.grid().at(1, 1, 2), Direction.WEST)) .placeNearTarget() .colored(PonderPalette.OUTPUT); scene.idle(50); ItemStack item = new ItemStack(Items.SNOWBALL); - scene.world.createItemOnBeltLike(depotPos, Direction.SOUTH, item); - scene.overlay.showText(60) + scene.world().createItemOnBeltLike(depotPos, Direction.SOUTH, item); + scene.overlay().showText(60) .attachKeyFrame() .text("Whenever an Arm has to choose between multiple valid outputs...") - .pointAt(util.vector.blockSurface(util.grid.at(2, 1, 2), Direction.UP)) + .pointAt(util.vector().blockSurface(util.grid().at(2, 1, 2), Direction.UP)) .placeNearTarget() .colored(PonderPalette.OUTPUT); scene.idle(70); - Vec3 scrollSlot = util.vector.of(3.5, 1 + 3 / 16f, 4); - scene.overlay.showFilterSlotInput(scrollSlot, Direction.NORTH, 120); - scene.overlay.showText(50) + Vec3 scrollSlot = util.vector().of(3.5, 1 + 3 / 16f, 4); + scene.overlay().showFilterSlotInput(scrollSlot, Direction.NORTH, 120); + scene.overlay().showText(50) .text("...it will act according to its setting") .pointAt(scrollSlot) .placeNearTarget(); scene.idle(60); - scene.overlay.showControls(new InputWindowElement(scrollSlot, Pointing.RIGHT).rightClick(), 40); + scene.overlay().showControls(new InputWindowElement(scrollSlot, Pointing.RIGHT).rightClick(), 40); scene.idle(10); - scene.overlay.showText(50) + scene.overlay().showText(50) .text("The value panel will allow you to configure it") .pointAt(scrollSlot) .placeNearTarget(); scene.idle(60); ElementLink blockage = - scene.world.showIndependentSection(util.select.position(4, 1, 0), Direction.UP); - scene.world.moveSection(blockage, util.vector.of(-1, 0, 0), 0); + scene.world().showIndependentSection(util.select().position(4, 1, 0), Direction.UP); + scene.world().moveSection(blockage, util.vector().of(-1, 0, 0), 0); for (int i = 0; i < 20; i++) { if (i == 2) { - scene.overlay.showText(60) + scene.overlay().showText(60) .attachKeyFrame() .text("Round Robin mode simply cycles through all outputs that are available") - .pointAt(util.vector.blockSurface(util.grid.at(2, 1, 2), Direction.UP)) + .pointAt(util.vector().blockSurface(util.grid().at(2, 1, 2), Direction.UP)) .placeNearTarget() .colored(PonderPalette.OUTPUT); } if (i == 6) continue; if (i == 7) { - scene.overlay.showText(60) + scene.overlay().showText(60) .attachKeyFrame() .text("If an output is unable to take more items, it will be skipped") - .pointAt(util.vector.blockSurface(util.grid.at(3, 1, 2), Direction.UP)) + .pointAt(util.vector().blockSurface(util.grid().at(3, 1, 2), Direction.UP)) .placeNearTarget() .colored(PonderPalette.GREEN); } if (i == 12) { - scene.world.moveSection(blockage, util.vector.of(-1, 0, 0), 10); - scene.world.setBlock(util.grid.at(3, 1, 0), Blocks.BARRIER.defaultBlockState(), false); + scene.world().moveSection(blockage, util.vector().of(-1, 0, 0), 10); + scene.world().setBlock(util.grid().at(3, 1, 0), Blocks.BARRIER.defaultBlockState(), false); } int index = i % 3; if (i == 13) { - scene.world.setBlock(util.grid.at(2, 1, 0), Blocks.BARRIER.defaultBlockState(), false); + scene.world().setBlock(util.grid().at(2, 1, 0), Blocks.BARRIER.defaultBlockState(), false); ElementLink blockage2 = - scene.world.showIndependentSection(util.select.position(4, 1, 0), Direction.UP); - scene.world.moveSection(blockage2, util.vector.of(-2, 0, 0), 0); - scene.overlay.showText(60) + scene.world().showIndependentSection(util.select().position(4, 1, 0), Direction.UP); + scene.world().moveSection(blockage2, util.vector().of(-2, 0, 0), 0); + scene.overlay().showText(60) .attachKeyFrame() .text("Prefer First prioritizes the outputs selected earliest when configuring this Arm") - .pointAt(util.vector.blockSurface(util.grid.at(3, 1, 2), Direction.UP)) + .pointAt(util.vector().blockSurface(util.grid().at(3, 1, 2), Direction.UP)) .placeNearTarget() .colored(PonderPalette.GREEN); index = 0; @@ -502,31 +502,31 @@ public class ArmScenes { index = 2; scene.idle(5); - scene.world.instructArm(armPos, Phase.MOVE_TO_INPUT, ItemStack.EMPTY, 0); + scene.world().instructArm(armPos, Phase.MOVE_TO_INPUT, ItemStack.EMPTY, 0); scene.idle(12); - scene.world.instructArm(armPos, Phase.SEARCH_OUTPUTS, item, -1); - scene.world.removeItemsFromBelt(depotPos); + scene.world().instructArm(armPos, Phase.SEARCH_OUTPUTS, item, -1); + scene.world().removeItemsFromBelt(depotPos); scene.idle(5); if (i == 9) { - scene.overlay.showText(80) + scene.overlay().showText(80) .attachKeyFrame() .text("Forced Round Robin mode will never skip outputs, and instead wait until they are free") - .pointAt(util.vector.blockSurface(util.grid.at(3, 1, 2), Direction.UP)) + .pointAt(util.vector().blockSurface(util.grid().at(3, 1, 2), Direction.UP)) .placeNearTarget() .colored(PonderPalette.RED); scene.idle(40); - scene.world.moveSection(blockage, util.vector.of(1, 0, 0), 10); - scene.world.setBlock(util.grid.at(3, 1, 0), Blocks.AIR.defaultBlockState(), false); + scene.world().moveSection(blockage, util.vector().of(1, 0, 0), 10); + scene.world().setBlock(util.grid().at(3, 1, 0), Blocks.AIR.defaultBlockState(), false); scene.idle(50); - scene.world.multiplyKineticSpeed(util.select.fromTo(1, 1, 1, 5, 0, 3), 2); + scene.world().multiplyKineticSpeed(util.select().fromTo(1, 1, 1, 5, 0, 3), 2); } - scene.world.instructArm(armPos, Phase.MOVE_TO_OUTPUT, item, index); - scene.world.createItemOnBeltLike(depotPos, Direction.SOUTH, item); + scene.world().instructArm(armPos, Phase.MOVE_TO_OUTPUT, item, index); + scene.world().createItemOnBeltLike(depotPos, Direction.SOUTH, item); scene.idle(12); - scene.world.instructArm(armPos, Phase.SEARCH_INPUTS, ItemStack.EMPTY, -1); - scene.world.createItemOnBelt(util.grid.at(3 - index, 1, 2), Direction.UP, item); + scene.world().instructArm(armPos, Phase.SEARCH_INPUTS, ItemStack.EMPTY, -1); + scene.world().createItemOnBelt(util.grid().at(3 - index, 1, 2), Direction.UP, item); } } @@ -535,62 +535,62 @@ public class ArmScenes { CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("mechanical_arm_redstone", "Controlling Mechanical Arms with Redstone"); scene.configureBasePlate(0, 0, 5); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); scene.idle(5); - scene.world.showSection(util.select.fromTo(1, 1, 3, 2, 1, 4), Direction.DOWN); + scene.world().showSection(util.select().fromTo(1, 1, 3, 2, 1, 4), Direction.DOWN); scene.idle(5); - scene.world.showSection(util.select.fromTo(3, 1, 5, 4, 1, 3), Direction.WEST); + scene.world().showSection(util.select().fromTo(3, 1, 5, 4, 1, 3), Direction.WEST); scene.idle(5); - scene.world.showSection(util.select.position(4, 1, 2), Direction.SOUTH); + scene.world().showSection(util.select().position(4, 1, 2), Direction.SOUTH); scene.idle(5); - scene.world.showSection(util.select.fromTo(2, 1, 1, 4, 1, 1), Direction.EAST); + scene.world().showSection(util.select().fromTo(2, 1, 1, 4, 1, 1), Direction.EAST); scene.idle(10); - Selection redstone = util.select.fromTo(1, 1, 0, 1, 1, 2); - scene.world.showSection(redstone, Direction.SOUTH); + Selection redstone = util.select().fromTo(1, 1, 0, 1, 1, 2); + scene.world().showSection(redstone, Direction.SOUTH); - BlockPos armPos = util.grid.at(1, 1, 3); - BlockPos leverPos = util.grid.at(1, 1, 0); + BlockPos armPos = util.grid().at(1, 1, 3); + BlockPos leverPos = util.grid().at(1, 1, 0); ItemStack item = new ItemStack(Items.REDSTONE_ORE); - scene.world.createItemOnBeltLike(util.grid.at(4, 1, 1), Direction.SOUTH, item); + scene.world().createItemOnBeltLike(util.grid().at(4, 1, 1), Direction.SOUTH, item); for (int i = 0; i < 3; i++) { scene.idle(12); if (i == 1) { - scene.world.toggleRedstonePower(redstone); - scene.effects.indicateRedstone(leverPos); + scene.world().toggleRedstonePower(redstone); + scene.effects().indicateRedstone(leverPos); scene.idle(10); - scene.overlay.showText(60) + scene.overlay().showText(60) .colored(PonderPalette.RED) .attachKeyFrame() - .pointAt(util.vector.topOf(armPos)) + .pointAt(util.vector().topOf(armPos)) .placeNearTarget() .text("When powered by Redstone, Mechanical Arms will not activate"); scene.idle(70); - scene.world.toggleRedstonePower(redstone); + scene.world().toggleRedstonePower(redstone); } if (i == 2) { scene.idle(60); - scene.world.toggleRedstonePower(redstone); + scene.world().toggleRedstonePower(redstone); scene.idle(3); - scene.world.toggleRedstonePower(redstone); - scene.effects.indicateRedstone(leverPos); + scene.world().toggleRedstonePower(redstone); + scene.effects().indicateRedstone(leverPos); } - scene.world.instructArm(armPos, Phase.MOVE_TO_INPUT, ItemStack.EMPTY, 0); + scene.world().instructArm(armPos, Phase.MOVE_TO_INPUT, ItemStack.EMPTY, 0); scene.idle(18); - scene.world.instructArm(armPos, Phase.SEARCH_OUTPUTS, item, -1); - scene.world.removeItemsFromBelt(util.grid.at(3, 1, 1)); + scene.world().instructArm(armPos, Phase.SEARCH_OUTPUTS, item, -1); + scene.world().removeItemsFromBelt(util.grid().at(3, 1, 1)); scene.idle(5); if (i == 1) { - scene.world.toggleRedstonePower(redstone); - scene.effects.indicateRedstone(leverPos); - scene.overlay.showText(60) - .pointAt(util.vector.topOf(armPos)) + scene.world().toggleRedstonePower(redstone); + scene.effects().indicateRedstone(leverPos); + scene.overlay().showText(60) + .pointAt(util.vector().topOf(armPos)) .placeNearTarget() .text("Before stopping, it will finish any started cycles"); } @@ -598,19 +598,19 @@ public class ArmScenes { scene.idle(10); if (i == 2) { - scene.overlay.showText(100) + scene.overlay().showText(100) .colored(PonderPalette.GREEN) .attachKeyFrame() - .pointAt(util.vector.topOf(armPos)) + .pointAt(util.vector().topOf(armPos)) .placeNearTarget() .text("Thus, a negative pulse can be used to trigger exactly one activation cycle"); } - scene.world.instructArm(armPos, Phase.MOVE_TO_OUTPUT, item, 0); - scene.world.createItemOnBeltLike(util.grid.at(4, 1, 1), Direction.SOUTH, item); + scene.world().instructArm(armPos, Phase.MOVE_TO_OUTPUT, item, 0); + scene.world().createItemOnBeltLike(util.grid().at(4, 1, 1), Direction.SOUTH, item); scene.idle(18); - scene.world.instructArm(armPos, Phase.SEARCH_INPUTS, ItemStack.EMPTY, -1); - scene.world.createItemOnBelt(util.grid.at(3, 1, 3), Direction.UP, item); + scene.world().instructArm(armPos, Phase.SEARCH_INPUTS, ItemStack.EMPTY, -1); + scene.world().createItemOnBelt(util.grid().at(3, 1, 3), Direction.UP, item); } scene.idle(5); diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/BearingScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/BearingScenes.java index e59502cbcb..a6084e9109 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/BearingScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/BearingScenes.java @@ -9,10 +9,10 @@ import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Iterate; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; import net.createmod.ponder.foundation.ElementLink; import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.SceneBuilder; -import net.createmod.ponder.foundation.SceneBuildingUtil; import net.createmod.ponder.foundation.Selection; import net.createmod.ponder.foundation.element.InputWindowElement; import net.createmod.ponder.foundation.element.WorldSectionElement; @@ -38,85 +38,85 @@ public class BearingScenes { scene.setSceneOffsetY(-1); scene.scaleSceneView(.9f); - scene.world.showSection(util.select.fromTo(1, 0, 1, 5, 0, 5), Direction.UP); - scene.world.setBlock(util.grid.at(2, -1, 0), AllBlocks.SAIL.getDefaultState() + scene.world().showSection(util.select().fromTo(1, 0, 1, 5, 0, 5), Direction.UP); + scene.world().setBlock(util.grid().at(2, -1, 0), AllBlocks.SAIL.getDefaultState() .setValue(SailBlock.FACING, Direction.NORTH), false); scene.idle(5); - Selection kinetics = util.select.fromTo(3, 1, 1, 4, 1, 4); - Selection largeCog = util.select.position(3, 2, 2); - BlockPos windmill = util.grid.at(3, 2, 1); - scene.world.showSection(kinetics.add(largeCog), Direction.DOWN); + Selection kinetics = util.select().fromTo(3, 1, 1, 4, 1, 4); + Selection largeCog = util.select().position(3, 2, 2); + BlockPos windmill = util.grid().at(3, 2, 1); + scene.world().showSection(kinetics.add(largeCog), Direction.DOWN); scene.idle(10); - scene.world.showSection(util.select.position(windmill), Direction.DOWN); + scene.world().showSection(util.select().position(windmill), Direction.DOWN); scene.idle(10); BlockPos anchorPos = windmill.north(); - scene.overlay.showSelectionWithText(util.select.position(anchorPos), 60) + scene.overlay().showSelectionWithText(util.select().position(anchorPos), 60) .colored(PonderPalette.GREEN) - .pointAt(util.vector.blockSurface(windmill, Direction.WEST)) + .pointAt(util.vector().blockSurface(windmill, Direction.WEST)) .attachKeyFrame() .placeNearTarget() .text("Windmill Bearings attach to the block in front of them"); scene.idle(50); ElementLink structure = - scene.world.showIndependentSection(util.select.position(anchorPos), Direction.SOUTH); + scene.world().showIndependentSection(util.select().position(anchorPos), Direction.SOUTH); scene.idle(10); for (Direction d : Iterate.directions) if (d.getAxis() != Axis.Z) - scene.world.showSectionAndMerge(util.select.fromTo(anchorPos.relative(d, 1), anchorPos.relative(d, 2)), - d.getOpposite(), structure); + scene.world().showSectionAndMerge(util.select().fromTo(anchorPos.relative(d, 1), anchorPos.relative(d, 2)), + d.getOpposite(), structure); scene.idle(10); - scene.world.showSectionAndMerge(util.select.fromTo(anchorPos.above() + scene.world().showSectionAndMerge(util.select().fromTo(anchorPos.above() .east(), - anchorPos.above(3) + anchorPos.above(3) .east()), - Direction.WEST, structure); - scene.world.showSectionAndMerge(util.select.fromTo(anchorPos.below() + Direction.WEST, structure); + scene.world().showSectionAndMerge(util.select().fromTo(anchorPos.below() .west(), - anchorPos.below(3) + anchorPos.below(3) .west()), - Direction.EAST, structure); - scene.world.showSectionAndMerge(util.select.fromTo(anchorPos.east() + Direction.EAST, structure); + scene.world().showSectionAndMerge(util.select().fromTo(anchorPos.east() .below(), - anchorPos.east(3) + anchorPos.east(3) .below()), - Direction.UP, structure); - scene.world.showSectionAndMerge(util.select.fromTo(anchorPos.west() + Direction.UP, structure); + scene.world().showSectionAndMerge(util.select().fromTo(anchorPos.west() .above(), - anchorPos.west(3) + anchorPos.west(3) .above()), - Direction.DOWN, structure); + Direction.DOWN, structure); scene.idle(5); for (Direction d : Iterate.directions) if (d.getAxis() != Axis.Z) - scene.effects.superGlue(anchorPos.relative(d, 1), d.getOpposite(), false); + scene.effects().superGlue(anchorPos.relative(d, 1), d.getOpposite(), false); scene.idle(10); - AABB bb1 = new AABB(util.grid.at(5, 2, 0)); - AABB bb2 = new AABB(util.grid.at(3, 4, 0)); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, bb1, bb1, 1); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, bb1, bb1.expandTowards(-4, 0, 0), 75); + AABB bb1 = new AABB(util.grid().at(5, 2, 0)); + AABB bb2 = new AABB(util.grid().at(3, 4, 0)); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, bb1, bb1, 1); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, bb1, bb1.expandTowards(-4, 0, 0), 75); scene.idle(5); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, bb2, bb2, 1); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, bb2, bb2.expandTowards(0, -4, 0), 80); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, bb2, bb2, 1); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, bb2, bb2.expandTowards(0, -4, 0), 80); scene.idle(10); - scene.overlay.showControls(new InputWindowElement(util.vector.centerOf(util.grid.at(5, 2, 0)), Pointing.RIGHT) + scene.overlay().showControls(new InputWindowElement(util.vector().centerOf(util.grid().at(5, 2, 0)), Pointing.RIGHT) .withItem(AllItems.SUPER_GLUE.asStack()), 40); scene.idle(15); - scene.overlay.showText(60) - .pointAt(util.vector.blockSurface(util.grid.at(1, 2, 0), Direction.NORTH)) + scene.overlay().showText(60) + .pointAt(util.vector().blockSurface(util.grid().at(1, 2, 0), Direction.NORTH)) .attachKeyFrame() .placeNearTarget() .text("Create a movable structure with the help of Super Glue"); scene.idle(70); - scene.overlay.showText(80) - .pointAt(util.vector.centerOf(1, 3, 0)) + scene.overlay().showText(80) + .pointAt(util.vector().centerOf(1, 3, 0)) .attachKeyFrame() .placeNearTarget() .text("If enough Sail-like blocks are included, this can act as a Windmill"); @@ -125,61 +125,61 @@ public class BearingScenes { scene.rotateCameraY(-90); scene.idle(20); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(windmill) + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(windmill) .subtract(.5, 0, 0), Pointing.DOWN).rightClick(), 60); scene.idle(7); - scene.world.rotateBearing(windmill, 360, 200); - scene.world.rotateSection(structure, 0, 0, 360, 200); - scene.world.setKineticSpeed(largeCog, 4); - scene.world.setKineticSpeed(kinetics, -8); - scene.effects.rotationDirectionIndicator(windmill.south()); - BlockPos gaugePos = util.grid.at(4, 1, 4); - scene.effects.indicateSuccess(gaugePos); + scene.world().rotateBearing(windmill, 360, 200); + scene.world().rotateSection(structure, 0, 0, 360, 200); + scene.world().setKineticSpeed(largeCog, 4); + scene.world().setKineticSpeed(kinetics, -8); + scene.effects().rotationDirectionIndicator(windmill.south()); + BlockPos gaugePos = util.grid().at(4, 1, 4); + scene.effects().indicateSuccess(gaugePos); scene.idle(10); - scene.overlay.showText(60) - .pointAt(util.vector.topOf(windmill) + scene.overlay().showText(60) + .pointAt(util.vector().topOf(windmill) .subtract(.5, 0, 0)) .placeNearTarget() .attachKeyFrame() .text("Activated with Right-Click, the Windmill Bearing will start providing Rotational Force"); scene.idle(70); - scene.overlay.showText(60) - .pointAt(util.vector.blockSurface(gaugePos, Direction.WEST)) + scene.overlay().showText(60) + .pointAt(util.vector().blockSurface(gaugePos, Direction.WEST)) .colored(PonderPalette.SLOW) .placeNearTarget() .text("The Amount of Sail Blocks determine its Rotation Speed"); scene.idle(90); - Vec3 surface = util.vector.blockSurface(windmill, Direction.WEST) + Vec3 surface = util.vector().blockSurface(windmill, Direction.WEST) .add(0, 0, 2 / 16f); - scene.overlay.showControls(new InputWindowElement(surface, Pointing.DOWN).rightClick(), 60); - scene.overlay.showFilterSlotInput(surface, Direction.WEST, 50); - scene.overlay.showText(60) + scene.overlay().showControls(new InputWindowElement(surface, Pointing.DOWN).rightClick(), 60); + scene.overlay().showFilterSlotInput(surface, Direction.WEST, 50); + scene.overlay().showText(60) .pointAt(surface) .attachKeyFrame() .placeNearTarget() .text("Use the value panel to configure its rotation direction"); scene.idle(36); - scene.world.rotateBearing(windmill, -90 - 45, 75); - scene.world.rotateSection(structure, 0, 0, -90 - 45, 75); - scene.world.modifyKineticSpeed(largeCog, f -> -f); - scene.world.modifyKineticSpeed(kinetics, f -> -f); - scene.effects.rotationDirectionIndicator(windmill.south()); + scene.world().rotateBearing(windmill, -90 - 45, 75); + scene.world().rotateSection(structure, 0, 0, -90 - 45, 75); + scene.world().modifyKineticSpeed(largeCog, f -> -f); + scene.world().modifyKineticSpeed(kinetics, f -> -f); + scene.effects().rotationDirectionIndicator(windmill.south()); scene.idle(69); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(windmill) + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(windmill) .subtract(.5, 0, 0), Pointing.DOWN).rightClick(), 60); scene.idle(7); - scene.world.rotateBearing(windmill, -45, 0); - scene.world.rotateSection(structure, 0, 0, -45, 0); - scene.world.setKineticSpeed(largeCog, 0); - scene.world.setKineticSpeed(kinetics, 0); + scene.world().rotateBearing(windmill, -45, 0); + scene.world().rotateSection(structure, 0, 0, -45, 0); + scene.world().setKineticSpeed(largeCog, 0); + scene.world().setKineticSpeed(kinetics, 0); scene.idle(10); - scene.overlay.showText(60) - .pointAt(util.vector.topOf(windmill) + scene.overlay().showText(60) + .pointAt(util.vector().topOf(windmill) .subtract(.5, 0, 0)) .placeNearTarget() .text("Right-click the Bearing anytime to stop and edit the Structure again"); @@ -192,51 +192,51 @@ public class BearingScenes { scene.title("windmill_structure", "Windmill Contraptions"); scene.configureBasePlate(1, 1, 5); scene.setSceneOffsetY(-1); - scene.world.modifyEntities(SuperGlueEntity.class, Entity::discard); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().modifyEntities(SuperGlueEntity.class, Entity::discard); + scene.world().showSection(util.select().layer(0), Direction.UP); scene.idle(5); - BlockPos bearingPos = util.grid.at(3, 1, 3); - scene.world.showSection(util.select.position(bearingPos), Direction.DOWN); + BlockPos bearingPos = util.grid().at(3, 1, 3); + scene.world().showSection(util.select().position(bearingPos), Direction.DOWN); scene.idle(10); ElementLink contraption = - scene.world.showIndependentSection(util.select.position(bearingPos.above()), Direction.DOWN); + scene.world().showIndependentSection(util.select().position(bearingPos.above()), Direction.DOWN); scene.idle(10); - scene.world.showSectionAndMerge(util.select.fromTo(3, 2, 2, 3, 3, 1), Direction.SOUTH, contraption); - scene.world.showSectionAndMerge(util.select.fromTo(3, 2, 4, 3, 3, 5), Direction.NORTH, contraption); + scene.world().showSectionAndMerge(util.select().fromTo(3, 2, 2, 3, 3, 1), Direction.SOUTH, contraption); + scene.world().showSectionAndMerge(util.select().fromTo(3, 2, 4, 3, 3, 5), Direction.NORTH, contraption); scene.idle(5); - scene.world.showSectionAndMerge(util.select.position(3, 1, 5), Direction.NORTH, contraption); - scene.world.showSectionAndMerge(util.select.position(3, 4, 2), Direction.DOWN, contraption); + scene.world().showSectionAndMerge(util.select().position(3, 1, 5), Direction.NORTH, contraption); + scene.world().showSectionAndMerge(util.select().position(3, 4, 2), Direction.DOWN, contraption); scene.idle(5); - scene.world.showSectionAndMerge(util.select.position(2, 1, 5), Direction.EAST, contraption); - scene.world.showSectionAndMerge(util.select.position(3, 3, 3), Direction.DOWN, contraption); + scene.world().showSectionAndMerge(util.select().position(2, 1, 5), Direction.EAST, contraption); + scene.world().showSectionAndMerge(util.select().position(3, 3, 3), Direction.DOWN, contraption); scene.idle(5); - scene.effects.superGlue(bearingPos.above(), Direction.SOUTH, true); - scene.effects.superGlue(bearingPos.above(), Direction.NORTH, true); + scene.effects().superGlue(bearingPos.above(), Direction.SOUTH, true); + scene.effects().superGlue(bearingPos.above(), Direction.NORTH, true); scene.idle(5); - scene.effects.superGlue(util.grid.at(3, 1, 5), Direction.UP, true); + scene.effects().superGlue(util.grid().at(3, 1, 5), Direction.UP, true); scene.idle(5); - scene.effects.superGlue(util.grid.at(3, 3, 3), Direction.DOWN, true); + scene.effects().superGlue(util.grid().at(3, 3, 3), Direction.DOWN, true); scene.idle(10); - scene.overlay.showOutline(PonderPalette.BLUE, bearingPos, util.select.fromTo(3, 2, 1, 3, 3, 2), 80); - scene.overlay.showSelectionWithText(util.select.fromTo(3, 2, 4, 3, 3, 5), 80) + scene.overlay().showOutline(PonderPalette.BLUE, bearingPos, util.select().fromTo(3, 2, 1, 3, 3, 2), 80); + scene.overlay().showSelectionWithText(util.select().fromTo(3, 2, 4, 3, 3, 5), 80) .colored(PonderPalette.BLUE) .attachKeyFrame() .text("Any Structure can count as a valid Windmill, as long as it contains at least 8 sail-like Blocks."); scene.idle(90); - scene.overlay.showControls( - new InputWindowElement(util.vector.blockSurface(bearingPos, Direction.WEST), Pointing.LEFT).rightClick(), + scene.overlay().showControls( + new InputWindowElement(util.vector().blockSurface(bearingPos, Direction.WEST), Pointing.LEFT).rightClick(), 40); scene.idle(7); scene.markAsFinished(); - scene.world.rotateBearing(bearingPos, -720, 400); - scene.world.rotateSection(contraption, 0, -720, 0, 400); - scene.world.modifyBlockEntity(util.grid.at(2, 1, 5), HarvesterBlockEntity.class, + scene.world().rotateBearing(bearingPos, -720, 400); + scene.world().rotateSection(contraption, 0, -720, 0, 400); + scene.world().modifyBlockEntity(util.grid().at(2, 1, 5), HarvesterBlockEntity.class, hte -> hte.setAnimatedSpeed(-150)); scene.idle(400); - scene.world.modifyBlockEntity(util.grid.at(2, 1, 5), HarvesterBlockEntity.class, + scene.world().modifyBlockEntity(util.grid().at(2, 1, 5), HarvesterBlockEntity.class, hte -> hte.setAnimatedSpeed(0)); } @@ -245,91 +245,91 @@ public class BearingScenes { scene.title("mechanical_bearing", "Movings Structures using the Mechanical Bearing"); scene.configureBasePlate(1, 1, 5); scene.setSceneOffsetY(-1); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); scene.idle(5); - scene.world.showSection(util.select.layer(1), Direction.DOWN); + scene.world().showSection(util.select().layer(1), Direction.DOWN); scene.idle(10); - scene.world.showSection(util.select.layer(2), Direction.DOWN); + scene.world().showSection(util.select().layer(2), Direction.DOWN); scene.idle(10); - Selection cog1 = util.select.position(6, 0, 4); - Selection cog2 = util.select.position(5, 1, 4); - Selection cog3 = util.select.position(4, 1, 3); - Selection cog4 = util.select.position(3, 1, 3); + Selection cog1 = util.select().position(6, 0, 4); + Selection cog2 = util.select().position(5, 1, 4); + Selection cog3 = util.select().position(4, 1, 3); + Selection cog4 = util.select().position(3, 1, 3); Selection all = cog1.copy() .add(cog2) .add(cog3) .add(cog4); - BlockPos bearingPos = util.grid.at(3, 2, 3); - scene.overlay.showSelectionWithText(util.select.position(bearingPos.above()), 60) + BlockPos bearingPos = util.grid().at(3, 2, 3); + scene.overlay().showSelectionWithText(util.select().position(bearingPos.above()), 60) .colored(PonderPalette.GREEN) - .pointAt(util.vector.blockSurface(bearingPos, Direction.WEST)) + .pointAt(util.vector().blockSurface(bearingPos, Direction.WEST)) .placeNearTarget() .attachKeyFrame() .text("Mechanical Bearings attach to the block in front of them"); scene.idle(50); ElementLink plank = - scene.world.showIndependentSection(util.select.position(bearingPos.above() + scene.world().showIndependentSection(util.select().position(bearingPos.above() .east() .north()), Direction.DOWN); - scene.world.moveSection(plank, util.vector.of(-1, 0, 1), 0); + scene.world().moveSection(plank, util.vector().of(-1, 0, 1), 0); scene.idle(20); - scene.world.setKineticSpeed(cog1, -8); - scene.world.setKineticSpeed(cog2, 8); - scene.world.setKineticSpeed(cog3, -16); - scene.world.setKineticSpeed(cog4, 16); - scene.effects.rotationSpeedIndicator(bearingPos.below()); - scene.world.rotateBearing(bearingPos, 360, 37 * 2); - scene.world.rotateSection(plank, 0, 360, 0, 37 * 2); + scene.world().setKineticSpeed(cog1, -8); + scene.world().setKineticSpeed(cog2, 8); + scene.world().setKineticSpeed(cog3, -16); + scene.world().setKineticSpeed(cog4, 16); + scene.effects().rotationSpeedIndicator(bearingPos.below()); + scene.world().rotateBearing(bearingPos, 360, 37 * 2); + scene.world().rotateSection(plank, 0, 360, 0, 37 * 2); - scene.overlay.showText(80) - .pointAt(util.vector.topOf(bearingPos.above())) + scene.overlay().showText(80) + .pointAt(util.vector().topOf(bearingPos.above())) .placeNearTarget() .attachKeyFrame() .text("Upon receiving Rotational Force, it will assemble it into a Rotating Contraption"); scene.idle(37 * 2); - scene.world.setKineticSpeed(all, 0); + scene.world().setKineticSpeed(all, 0); scene.idle(20); - scene.world.hideIndependentSection(plank, Direction.UP); + scene.world().hideIndependentSection(plank, Direction.UP); scene.idle(15); - Selection plank2 = util.select.position(4, 3, 2); - ElementLink contraption = scene.world.showIndependentSection(util.select.layersFrom(3) + Selection plank2 = util.select().position(4, 3, 2); + ElementLink contraption = scene.world().showIndependentSection(util.select().layersFrom(3) .substract(plank2), Direction.DOWN); - scene.world.replaceBlocks(util.select.fromTo(2, 4, 3, 4, 3, 3), Blocks.OAK_PLANKS.defaultBlockState(), false); + scene.world().replaceBlocks(util.select().fromTo(2, 4, 3, 4, 3, 3), Blocks.OAK_PLANKS.defaultBlockState(), false); scene.idle(10); - scene.overlay.showOutline(PonderPalette.GREEN, "glue", util.select.position(2, 4, 3) - .add(util.select.fromTo(4, 3, 3, 2, 3, 3)) - .add(util.select.position(4, 3, 2)), 40); - scene.overlay.showControls(new InputWindowElement(util.vector.centerOf(util.grid.at(4, 3, 3)), Pointing.RIGHT) + scene.overlay().showOutline(PonderPalette.GREEN, "glue", util.select().position(2, 4, 3) + .add(util.select().fromTo(4, 3, 3, 2, 3, 3)) + .add(util.select().position(4, 3, 2)), 40); + scene.overlay().showControls(new InputWindowElement(util.vector().centerOf(util.grid().at(4, 3, 3)), Pointing.RIGHT) .withItem(AllItems.SUPER_GLUE.asStack()), 40); scene.idle(10); - scene.world.showSectionAndMerge(plank2, Direction.SOUTH, contraption); + scene.world().showSectionAndMerge(plank2, Direction.SOUTH, contraption); scene.idle(15); - scene.effects.superGlue(util.grid.at(4, 3, 2), Direction.SOUTH, true); - scene.overlay.showText(120) - .pointAt(util.vector.topOf(bearingPos.above())) + scene.effects().superGlue(util.grid().at(4, 3, 2), Direction.SOUTH, true); + scene.overlay().showText(120) + .pointAt(util.vector().topOf(bearingPos.above())) .placeNearTarget() .attachKeyFrame() .sharedText("movement_anchors"); scene.idle(25); - scene.world.configureCenterOfRotation(contraption, util.vector.topOf(bearingPos)); - scene.world.setKineticSpeed(cog1, -8); - scene.world.setKineticSpeed(cog2, 8); - scene.world.setKineticSpeed(cog3, -16); - scene.world.setKineticSpeed(cog4, 16); - scene.effects.rotationSpeedIndicator(bearingPos.below()); - scene.world.rotateBearing(bearingPos, 360 * 2, 37 * 4); - scene.world.rotateSection(contraption, 0, 360 * 2, 0, 37 * 4); + scene.world().configureCenterOfRotation(contraption, util.vector().topOf(bearingPos)); + scene.world().setKineticSpeed(cog1, -8); + scene.world().setKineticSpeed(cog2, 8); + scene.world().setKineticSpeed(cog3, -16); + scene.world().setKineticSpeed(cog4, 16); + scene.effects().rotationSpeedIndicator(bearingPos.below()); + scene.world().rotateBearing(bearingPos, 360 * 2, 37 * 4); + scene.world().rotateSection(contraption, 0, 360 * 2, 0, 37 * 4); scene.idle(37 * 4); - scene.world.setKineticSpeed(all, 0); + scene.world().setKineticSpeed(all, 0); } public static void bearingModes(SceneBuilder builder, SceneBuildingUtil util) { @@ -338,85 +338,85 @@ public class BearingScenes { scene.configureBasePlate(1, 1, 6); scene.setSceneOffsetY(-1); - Selection sideCog = util.select.position(util.grid.at(7, 0, 3)); - Selection cogColumn = util.select.fromTo(6, 1, 3, 6, 4, 3); - Selection cogAndClutch = util.select.fromTo(5, 3, 1, 5, 4, 2); - BlockPos leverPos = util.grid.at(5, 3, 1); + Selection sideCog = util.select().position(util.grid().at(7, 0, 3)); + Selection cogColumn = util.select().fromTo(6, 1, 3, 6, 4, 3); + Selection cogAndClutch = util.select().fromTo(5, 3, 1, 5, 4, 2); + BlockPos leverPos = util.grid().at(5, 3, 1); - scene.world.setKineticSpeed(sideCog, 4); - scene.world.setKineticSpeed(cogColumn, -4); - scene.world.setKineticSpeed(cogAndClutch, 8); - scene.world.toggleRedstonePower(cogAndClutch); + scene.world().setKineticSpeed(sideCog, 4); + scene.world().setKineticSpeed(cogColumn, -4); + scene.world().setKineticSpeed(cogAndClutch, 8); + scene.world().toggleRedstonePower(cogAndClutch); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); scene.idle(5); - scene.world.showSection(cogColumn, Direction.DOWN); + scene.world().showSection(cogColumn, Direction.DOWN); scene.idle(5); - scene.world.showSection(cogAndClutch, Direction.DOWN); + scene.world().showSection(cogAndClutch, Direction.DOWN); scene.idle(10); - BlockPos bearingPos = util.grid.at(5, 2, 2); - scene.world.showSection(util.select.position(bearingPos), Direction.UP); + BlockPos bearingPos = util.grid().at(5, 2, 2); + scene.world().showSection(util.select().position(bearingPos), Direction.UP); scene.idle(10); ElementLink contraption = - scene.world.showIndependentSection(util.select.fromTo(5, 1, 2, 2, 1, 2), Direction.EAST); - scene.world.configureCenterOfRotation(contraption, util.vector.centerOf(bearingPos)); + scene.world().showIndependentSection(util.select().fromTo(5, 1, 2, 2, 1, 2), Direction.EAST); + scene.world().configureCenterOfRotation(contraption, util.vector().centerOf(bearingPos)); scene.idle(20); - scene.world.toggleRedstonePower(cogAndClutch); - scene.effects.indicateRedstone(leverPos); - scene.world.rotateSection(contraption, 0, 55, 0, 23); - scene.world.rotateBearing(bearingPos, 55, 23); + scene.world().toggleRedstonePower(cogAndClutch); + scene.effects().indicateRedstone(leverPos); + scene.world().rotateSection(contraption, 0, 55, 0, 23); + scene.world().rotateBearing(bearingPos, 55, 23); scene.idle(24); - scene.world.toggleRedstonePower(cogAndClutch); - scene.effects.indicateRedstone(leverPos); - scene.world.rotateSection(contraption, 0, 35, 0, 0); - scene.world.rotateBearing(bearingPos, 35, 0); + scene.world().toggleRedstonePower(cogAndClutch); + scene.effects().indicateRedstone(leverPos); + scene.world().rotateSection(contraption, 0, 35, 0, 0); + scene.world().rotateBearing(bearingPos, 35, 0); - Vec3 target = util.vector.topOf(bearingPos.below()); - scene.overlay.showLine(PonderPalette.RED, target.add(-2.5, 0, 3.5), target, 50); - scene.overlay.showLine(PonderPalette.GREEN, target.add(0, 0, 4.5), target, 50); + Vec3 target = util.vector().topOf(bearingPos.below()); + scene.overlay().showLine(PonderPalette.RED, target.add(-2.5, 0, 3.5), target, 50); + scene.overlay().showLine(PonderPalette.GREEN, target.add(0, 0, 4.5), target, 50); scene.idle(50); - scene.overlay.showText(100) - .pointAt(util.vector.topOf(util.grid.at(5, 0, 4))) + scene.overlay().showText(100) + .pointAt(util.vector().topOf(util.grid().at(5, 0, 4))) .placeNearTarget() .colored(PonderPalette.RED) .attachKeyFrame() .text("When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle"); scene.idle(110); - Vec3 blockSurface = util.vector.blockSurface(bearingPos, Direction.NORTH) + Vec3 blockSurface = util.vector().blockSurface(bearingPos, Direction.NORTH) .add(0, 2 / 16f, 0); - scene.overlay.showFilterSlotInput(blockSurface, Direction.NORTH, 60); - scene.overlay.showControls(new InputWindowElement(blockSurface, Pointing.DOWN).scroll() + scene.overlay().showFilterSlotInput(blockSurface, Direction.NORTH, 60); + scene.overlay().showControls(new InputWindowElement(blockSurface, Pointing.DOWN).scroll() .withItem(AllItems.WRENCH.asStack()), 60); scene.idle(10); - scene.overlay.showText(60) + scene.overlay().showText(60) .pointAt(blockSurface) .placeNearTarget() .attachKeyFrame() .sharedText("behaviour_modify_value_panel"); scene.idle(70); - scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); - scene.world.toggleRedstonePower(cogAndClutch); - scene.effects.indicateRedstone(leverPos); - scene.world.rotateSection(contraption, 0, -55, 0, 23); - scene.world.rotateBearing(bearingPos, -55, 23); + scene.world().modifyKineticSpeed(util.select().everywhere(), f -> -f); + scene.world().toggleRedstonePower(cogAndClutch); + scene.effects().indicateRedstone(leverPos); + scene.world().rotateSection(contraption, 0, -55, 0, 23); + scene.world().rotateBearing(bearingPos, -55, 23); scene.idle(24); - scene.world.toggleRedstonePower(cogAndClutch); - scene.effects.indicateRedstone(leverPos); + scene.world().toggleRedstonePower(cogAndClutch); + scene.effects().indicateRedstone(leverPos); scene.idle(40); - scene.overlay.showText(120) + scene.overlay().showText(120) .colored(PonderPalette.GREEN) .placeNearTarget() - .pointAt(util.vector.blockSurface(util.grid.at(3, 1, 3), Direction.UP)) + .pointAt(util.vector().blockSurface(util.grid().at(3, 1, 3), Direction.UP)) .text("It can be configured never to revert to solid blocks, or only near the angle it started at"); scene.idle(90); @@ -428,46 +428,46 @@ public class BearingScenes { scene.configureBasePlate(1, 1, 5); scene.setSceneOffsetY(-1); - Selection beltAndBearing = util.select.fromTo(3, 3, 4, 3, 1, 6); - Selection largeCog = util.select.position(2, 0, 6); - BlockPos parentBearingPos = util.grid.at(3, 3, 4); - BlockPos bearingPos = util.grid.at(3, 4, 2); + Selection beltAndBearing = util.select().fromTo(3, 3, 4, 3, 1, 6); + Selection largeCog = util.select().position(2, 0, 6); + BlockPos parentBearingPos = util.grid().at(3, 3, 4); + BlockPos bearingPos = util.grid().at(3, 4, 2); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); scene.idle(5); - scene.world.showSection(beltAndBearing, Direction.DOWN); + scene.world().showSection(beltAndBearing, Direction.DOWN); scene.idle(10); ElementLink contraption = - scene.world.showIndependentSection(util.select.fromTo(3, 3, 3, 3, 4, 3), Direction.SOUTH); - scene.world.configureCenterOfRotation(contraption, util.vector.centerOf(parentBearingPos)); + scene.world().showIndependentSection(util.select().fromTo(3, 3, 3, 3, 4, 3), Direction.SOUTH); + scene.world().configureCenterOfRotation(contraption, util.vector().centerOf(parentBearingPos)); scene.idle(20); - scene.world.glueBlockOnto(bearingPos, Direction.SOUTH, contraption); + scene.world().glueBlockOnto(bearingPos, Direction.SOUTH, contraption); scene.idle(15); - scene.overlay.showSelectionWithText(util.select.position(bearingPos), 60) + scene.overlay().showSelectionWithText(util.select().position(bearingPos), 60) .text("Whenever Mechanical Bearings are themselves part of a moving Structure..") .attachKeyFrame() .placeNearTarget(); scene.idle(70); - scene.world.setKineticSpeed(largeCog, -8); - scene.world.setKineticSpeed(beltAndBearing, 16); - scene.world.rotateBearing(parentBearingPos, 360, 74); - scene.world.rotateSection(contraption, 0, 0, 360, 74); - scene.world.rotateBearing(bearingPos, -360, 74); + scene.world().setKineticSpeed(largeCog, -8); + scene.world().setKineticSpeed(beltAndBearing, 16); + scene.world().rotateBearing(parentBearingPos, 360, 74); + scene.world().rotateSection(contraption, 0, 0, 360, 74); + scene.world().rotateBearing(bearingPos, -360, 74); scene.idle(74); - scene.world.setKineticSpeed(largeCog, 0); - scene.world.setKineticSpeed(beltAndBearing, 0); - scene.overlay.showText(60) + scene.world().setKineticSpeed(largeCog, 0); + scene.world().setKineticSpeed(beltAndBearing, 0); + scene.overlay().showText(60) .text("..they will attempt to keep themselves upright") - .pointAt(util.vector.blockSurface(bearingPos, Direction.NORTH)) + .pointAt(util.vector().blockSurface(bearingPos, Direction.NORTH)) .placeNearTarget(); scene.idle(70); - scene.overlay.showSelectionWithText(util.select.position(bearingPos.north()), 60) + scene.overlay().showSelectionWithText(util.select().position(bearingPos.north()), 60) .colored(PonderPalette.GREEN) .text("Once again, the bearing will attach to the block in front of it") .attachKeyFrame() @@ -475,25 +475,25 @@ public class BearingScenes { scene.idle(70); ElementLink subContraption = - scene.world.showIndependentSection(util.select.fromTo(4, 4, 1, 2, 4, 1), Direction.SOUTH); - scene.world.configureCenterOfRotation(subContraption, util.vector.centerOf(parentBearingPos)); - scene.world.configureStabilization(subContraption, util.vector.centerOf(bearingPos)); + scene.world().showIndependentSection(util.select().fromTo(4, 4, 1, 2, 4, 1), Direction.SOUTH); + scene.world().configureCenterOfRotation(subContraption, util.vector().centerOf(parentBearingPos)); + scene.world().configureStabilization(subContraption, util.vector().centerOf(bearingPos)); scene.idle(20); - scene.overlay.showText(80) + scene.overlay().showText(80) .text("As a result, the entire sub-Contraption will stay upright"); - scene.world.setKineticSpeed(largeCog, -8); - scene.world.setKineticSpeed(beltAndBearing, 16); - scene.world.rotateBearing(parentBearingPos, 360 * 2, 74 * 2); - scene.world.rotateSection(contraption, 0, 0, 360 * 2, 74 * 2); - scene.world.rotateBearing(bearingPos, -360 * 2, 74 * 2); - scene.world.rotateSection(subContraption, 0, 0, 360 * 2, 74 * 2); + scene.world().setKineticSpeed(largeCog, -8); + scene.world().setKineticSpeed(beltAndBearing, 16); + scene.world().rotateBearing(parentBearingPos, 360 * 2, 74 * 2); + scene.world().rotateSection(contraption, 0, 0, 360 * 2, 74 * 2); + scene.world().rotateBearing(bearingPos, -360 * 2, 74 * 2); + scene.world().rotateSection(subContraption, 0, 0, 360 * 2, 74 * 2); scene.markAsFinished(); scene.idle(74 * 2); - scene.world.setKineticSpeed(largeCog, 0); - scene.world.setKineticSpeed(beltAndBearing, 0); + scene.world().setKineticSpeed(largeCog, 0); + scene.world().setKineticSpeed(beltAndBearing, 0); } public static void clockwork(SceneBuilder builder, SceneBuildingUtil util) { @@ -502,143 +502,143 @@ public class BearingScenes { scene.configureBasePlate(1, 1, 5); scene.setSceneOffsetY(-1); - Selection kinetics = util.select.fromTo(3, 3, 4, 3, 1, 6); - Selection largeCog = util.select.position(2, 0, 6); - BlockPos bearingPos = util.grid.at(3, 3, 3); + Selection kinetics = util.select().fromTo(3, 3, 4, 3, 1, 6); + Selection largeCog = util.select().position(2, 0, 6); + BlockPos bearingPos = util.grid().at(3, 3, 3); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); scene.idle(5); - scene.world.showSection(kinetics, Direction.DOWN); + scene.world().showSection(kinetics, Direction.DOWN); scene.idle(10); - scene.world.showSection(util.select.position(bearingPos), Direction.DOWN); + scene.world().showSection(util.select().position(bearingPos), Direction.DOWN); scene.idle(10); - scene.overlay.showSelectionWithText(util.select.position(bearingPos.north()), 60) + scene.overlay().showSelectionWithText(util.select().position(bearingPos.north()), 60) .colored(PonderPalette.GREEN) - .pointAt(util.vector.blockSurface(bearingPos, Direction.WEST)) + .pointAt(util.vector().blockSurface(bearingPos, Direction.WEST)) .placeNearTarget() .attachKeyFrame() .text("Clockwork Bearings attach to blocks in front of them"); scene.idle(50); ElementLink plank = - scene.world.showIndependentSection(util.select.position(2, 3, 2), Direction.SOUTH); - scene.world.moveSection(plank, util.vector.of(1, 0, 0), 0); + scene.world().showIndependentSection(util.select().position(2, 3, 2), Direction.SOUTH); + scene.world().moveSection(plank, util.vector().of(1, 0, 0), 0); scene.idle(20); - scene.world.rotateSection(plank, 0, 0, 60, 25); - scene.world.rotateBearing(bearingPos, 60, 25); - scene.world.setKineticSpeed(kinetics, 8); - scene.world.setKineticSpeed(largeCog, -4); + scene.world().rotateSection(plank, 0, 0, 60, 25); + scene.world().rotateBearing(bearingPos, 60, 25); + scene.world().setKineticSpeed(kinetics, 8); + scene.world().setKineticSpeed(largeCog, -4); scene.idle(25); - scene.overlay.showText(80) - .pointAt(util.vector.blockSurface(bearingPos.north(), Direction.NORTH)) + scene.overlay().showText(80) + .pointAt(util.vector().blockSurface(bearingPos.north(), Direction.NORTH)) .placeNearTarget() .attachKeyFrame() .text("Upon receiving Rotational Force, the structure will be rotated according to the hour of the day"); scene.idle(90); - scene.overlay.showText(30) - .pointAt(util.vector.blockSurface(bearingPos.north(), Direction.NORTH)) + scene.overlay().showText(30) + .pointAt(util.vector().blockSurface(bearingPos.north(), Direction.NORTH)) .placeNearTarget() .text("3:00"); - scene.world.rotateSection(plank, 0, 0, 30, 12); - scene.world.rotateBearing(bearingPos, 30, 12); + scene.world().rotateSection(plank, 0, 0, 30, 12); + scene.world().rotateBearing(bearingPos, 30, 12); scene.idle(42); - scene.overlay.showText(30) - .pointAt(util.vector.blockSurface(bearingPos.north(), Direction.NORTH)) + scene.overlay().showText(30) + .pointAt(util.vector().blockSurface(bearingPos.north(), Direction.NORTH)) .placeNearTarget() .text("4:00"); - scene.world.rotateSection(plank, 0, 0, 30, 12); - scene.world.rotateBearing(bearingPos, 30, 12); + scene.world().rotateSection(plank, 0, 0, 30, 12); + scene.world().rotateBearing(bearingPos, 30, 12); scene.idle(42); - InputWindowElement clickTheBearing = new InputWindowElement(util.vector.topOf(bearingPos), Pointing.DOWN); + InputWindowElement clickTheBearing = new InputWindowElement(util.vector().topOf(bearingPos), Pointing.DOWN); InputWindowElement clickTheBearingSide = - new InputWindowElement(util.vector.blockSurface(bearingPos, Direction.WEST), Pointing.LEFT); + new InputWindowElement(util.vector().blockSurface(bearingPos, Direction.WEST), Pointing.LEFT); - scene.overlay.showControls(clickTheBearing.rightClick(), 60); + scene.overlay().showControls(clickTheBearing.rightClick(), 60); scene.idle(7); - scene.world.rotateSection(plank, 0, 0, -120, 0); - scene.world.rotateBearing(bearingPos, -120, 0); - scene.overlay.showText(60) - .pointAt(util.vector.blockSurface(bearingPos, Direction.WEST)) + scene.world().rotateSection(plank, 0, 0, -120, 0); + scene.world().rotateBearing(bearingPos, -120, 0); + scene.overlay().showText(60) + .pointAt(util.vector().blockSurface(bearingPos, Direction.WEST)) .placeNearTarget() .attachKeyFrame() .text("Right-Click the bearing to start or stop animating the structure"); scene.idle(70); - scene.world.hideIndependentSection(plank, Direction.NORTH); + scene.world().hideIndependentSection(plank, Direction.NORTH); scene.idle(15); - scene.world.replaceBlocks(util.select.fromTo(3, 3, 1, 3, 4, 2), Blocks.OAK_PLANKS.defaultBlockState(), false); + scene.world().replaceBlocks(util.select().fromTo(3, 3, 1, 3, 4, 2), Blocks.OAK_PLANKS.defaultBlockState(), false); ElementLink hourHand = - scene.world.showIndependentSection(util.select.fromTo(3, 3, 1, 3, 5, 2), Direction.SOUTH); - scene.world.configureCenterOfRotation(hourHand, util.vector.centerOf(bearingPos)); + scene.world().showIndependentSection(util.select().fromTo(3, 3, 1, 3, 5, 2), Direction.SOUTH); + scene.world().configureCenterOfRotation(hourHand, util.vector().centerOf(bearingPos)); scene.idle(15); - scene.overlay.showControls(new InputWindowElement(util.vector.centerOf(util.grid.at(3, 4, 1)), Pointing.RIGHT) + scene.overlay().showControls(new InputWindowElement(util.vector().centerOf(util.grid().at(3, 4, 1)), Pointing.RIGHT) .withItem(AllItems.SUPER_GLUE.asStack()), 40); - scene.overlay.showSelectionWithText(util.select.fromTo(3, 3, 1, 3, 4, 2), 80) + scene.overlay().showSelectionWithText(util.select().fromTo(3, 3, 1, 3, 4, 2), 80) .placeNearTarget() .attachKeyFrame() .colored(PonderPalette.GREEN) .sharedText("movement_anchors"); scene.idle(90); - scene.overlay.showControls(clickTheBearingSide.rightClick(), 20); + scene.overlay().showControls(clickTheBearingSide.rightClick(), 20); scene.idle(7); - scene.world.rotateSection(hourHand, 0, 0, 120, 50); - scene.world.rotateBearing(bearingPos, 120, 50); + scene.world().rotateSection(hourHand, 0, 0, 120, 50); + scene.world().rotateBearing(bearingPos, 120, 50); scene.idle(60); - scene.overlay.showSelectionWithText(util.select.position(bearingPos.north(3)), 80) + scene.overlay().showSelectionWithText(util.select().position(bearingPos.north(3)), 80) .placeNearTarget() .colored(PonderPalette.BLUE) .attachKeyFrame() .text("In front of the Hour Hand, a second structure can be added"); scene.idle(90); - scene.overlay.showControls(clickTheBearingSide.rightClick(), 20); + scene.overlay().showControls(clickTheBearingSide.rightClick(), 20); scene.idle(7); - scene.world.rotateSection(hourHand, 0, 0, -120, 0); - scene.world.rotateBearing(bearingPos, -120, 0); + scene.world().rotateSection(hourHand, 0, 0, -120, 0); + scene.world().rotateBearing(bearingPos, -120, 0); scene.idle(10); - scene.world.setBlock(util.grid.at(3, 3, 0), Blocks.STONE_BRICK_WALL.defaultBlockState() + scene.world().setBlock(util.grid().at(3, 3, 0), Blocks.STONE_BRICK_WALL.defaultBlockState() .setValue(WallBlock.SOUTH_WALL, WallSide.TALL), false); ElementLink minuteHand = - scene.world.showIndependentSection(util.select.fromTo(3, 3, 0, 3, 6, 0), Direction.SOUTH); - scene.world.configureCenterOfRotation(minuteHand, util.vector.centerOf(bearingPos)); + scene.world().showIndependentSection(util.select().fromTo(3, 3, 0, 3, 6, 0), Direction.SOUTH); + scene.world().configureCenterOfRotation(minuteHand, util.vector().centerOf(bearingPos)); scene.idle(30); - scene.overlay.showOutline(PonderPalette.BLUE, minuteHand, util.select.fromTo(3, 3, 0, 3, 6, 0), 85); - scene.overlay.showSelectionWithText(util.select.fromTo(3, 3, 1, 3, 4, 2), 80) + scene.overlay().showOutline(PonderPalette.BLUE, minuteHand, util.select().fromTo(3, 3, 0, 3, 6, 0), 85); + scene.overlay().showSelectionWithText(util.select().fromTo(3, 3, 1, 3, 4, 2), 80) .placeNearTarget() .colored(PonderPalette.GREEN) .text("Ensure that the two Structures are not glued to each other"); scene.idle(90); - scene.overlay.showControls(clickTheBearingSide.rightClick(), 20); + scene.overlay().showControls(clickTheBearingSide.rightClick(), 20); scene.idle(7); - scene.world.rotateSection(hourHand, 0, 0, 120, 50); - scene.world.rotateSection(minuteHand, 0, 0, 180, 75); - scene.world.rotateBearing(bearingPos, 120, 50); + scene.world().rotateSection(hourHand, 0, 0, 120, 50); + scene.world().rotateSection(minuteHand, 0, 0, 180, 75); + scene.world().rotateBearing(bearingPos, 120, 50); scene.idle(90); - scene.world.rotateSection(minuteHand, 0, 0, 6, 3); + scene.world().rotateSection(minuteHand, 0, 0, 6, 3); - scene.overlay.showText(80) + scene.overlay().showText(80) .placeNearTarget() - .pointAt(util.vector.blockSurface(bearingPos.north(3), Direction.NORTH)) + .pointAt(util.vector().blockSurface(bearingPos.north(3), Direction.NORTH)) .colored(PonderPalette.GREEN) .text("The Second Structure will now rotate as the Minute Hand"); scene.markAsFinished(); for (int i = 0; i < 40; i++) { scene.idle(23); - scene.world.rotateSection(minuteHand, 0, 0, 6, 3); + scene.world().rotateSection(minuteHand, 0, 0, 6, 3); if (i == 29) - scene.world.rotateSection(hourHand, 0, 0, 30, 20); + scene.world().rotateSection(hourHand, 0, 0, 30, 20); } } @@ -656,14 +656,14 @@ public class BearingScenes { scene.title(frame ? "sail_frame" : "sail", "Assembling Windmills using " + plural); scene.configureBasePlate(0, 0, 5); scene.scaleSceneView(0.9f); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); scene.idle(5); - BlockPos bearingPos = util.grid.at(2, 1, 2); - scene.world.showSection(util.select.position(bearingPos), Direction.DOWN); + BlockPos bearingPos = util.grid().at(2, 1, 2); + scene.world().showSection(util.select().position(bearingPos), Direction.DOWN); scene.idle(5); ElementLink plank = - scene.world.showIndependentSection(util.select.position(bearingPos.above()), Direction.DOWN); + scene.world().showIndependentSection(util.select().position(bearingPos.above()), Direction.DOWN); scene.idle(10); for (int i = 0; i < 3; i++) { @@ -671,87 +671,87 @@ public class BearingScenes { BlockPos location = bearingPos.above(i + 1) .relative(d); if (frame) - scene.world.modifyBlock(location, s -> AllBlocks.SAIL_FRAME.getDefaultState() + scene.world().modifyBlock(location, s -> AllBlocks.SAIL_FRAME.getDefaultState() .setValue(SailBlock.FACING, s.getValue(SailBlock.FACING)), false); - scene.world.showSectionAndMerge(util.select.position(location), d.getOpposite(), plank); + scene.world().showSectionAndMerge(util.select().position(location), d.getOpposite(), plank); scene.idle(2); } } - scene.overlay.showText(70) + scene.overlay().showText(70) .text(plural + " are handy blocks to create Windmills with") - .pointAt(util.vector.blockSurface(util.grid.at(1, 3, 2), Direction.WEST)) + .pointAt(util.vector().blockSurface(util.grid().at(1, 3, 2), Direction.WEST)) .placeNearTarget() .attachKeyFrame(); scene.idle(80); - scene.overlay.showSelectionWithText(util.select.position(bearingPos.above()), 80) + scene.overlay().showSelectionWithText(util.select().position(bearingPos.above()), 80) .colored(PonderPalette.GREEN) .text("They will attach to blocks and each other without the need of Super Glue or Chassis Blocks") .attachKeyFrame() .placeNearTarget(); scene.idle(40); - scene.world.configureCenterOfRotation(plank, util.vector.centerOf(bearingPos)); + scene.world().configureCenterOfRotation(plank, util.vector().centerOf(bearingPos)); if (!frame) { - scene.world.rotateBearing(bearingPos, 180, 75); - scene.world.rotateSection(plank, 0, 180, 0, 75); + scene.world().rotateBearing(bearingPos, 180, 75); + scene.world().rotateSection(plank, 0, 180, 0, 75); scene.idle(76); - scene.world.rotateBearing(bearingPos, 180, 0); - scene.world.rotateSection(plank, 0, 180, 0, 0); + scene.world().rotateBearing(bearingPos, 180, 0); + scene.world().rotateSection(plank, 0, 180, 0, 0); scene.rotateCameraY(-30); scene.idle(10); InputWindowElement input = - new InputWindowElement(util.vector.blockSurface(util.grid.at(2, 3, 1), Direction.NORTH), Pointing.RIGHT) + new InputWindowElement(util.vector().blockSurface(util.grid().at(2, 3, 1), Direction.NORTH), Pointing.RIGHT) .withItem(new ItemStack(Items.BLUE_DYE)); - scene.overlay.showControls(input, 30); + scene.overlay().showControls(input, 30); scene.idle(7); - scene.world.setBlock(util.grid.at(2, 3, 1), AllBlocks.DYED_SAILS.get(DyeColor.BLUE) + scene.world().setBlock(util.grid().at(2, 3, 1), AllBlocks.DYED_SAILS.get(DyeColor.BLUE) .getDefaultState() .setValue(SailBlock.FACING, Direction.WEST), false); scene.idle(10); - scene.overlay.showText(40) + scene.overlay().showText(40) .colored(PonderPalette.BLUE) .text("Right-Click with Dye to paint them") .attachKeyFrame() - .pointAt(util.vector.blockSurface(util.grid.at(2, 3, 1), Direction.WEST)) + .pointAt(util.vector().blockSurface(util.grid().at(2, 3, 1), Direction.WEST)) .placeNearTarget(); scene.idle(20); - scene.overlay.showControls(input, 30); + scene.overlay().showControls(input, 30); scene.idle(7); - scene.world.replaceBlocks(util.select.fromTo(2, 2, 1, 2, 4, 1), AllBlocks.DYED_SAILS.get(DyeColor.BLUE) + scene.world().replaceBlocks(util.select().fromTo(2, 2, 1, 2, 4, 1), AllBlocks.DYED_SAILS.get(DyeColor.BLUE) .getDefaultState() .setValue(SailBlock.FACING, Direction.WEST), false); scene.idle(20); - scene.world.rotateBearing(bearingPos, 90, 33); - scene.world.rotateSection(plank, 0, 90, 0, 33); + scene.world().rotateBearing(bearingPos, 90, 33); + scene.world().rotateSection(plank, 0, 90, 0, 33); scene.idle(40); input = - new InputWindowElement(util.vector.blockSurface(util.grid.at(2, 3, 1), Direction.NORTH), Pointing.RIGHT) + new InputWindowElement(util.vector().blockSurface(util.grid().at(2, 3, 1), Direction.NORTH), Pointing.RIGHT) .withItem(new ItemStack(Items.SHEARS)); - scene.overlay.showControls(input, 30); + scene.overlay().showControls(input, 30); scene.idle(7); - scene.world.setBlock(util.grid.at(3, 3, 2), AllBlocks.SAIL_FRAME.getDefaultState() + scene.world().setBlock(util.grid().at(3, 3, 2), AllBlocks.SAIL_FRAME.getDefaultState() .setValue(SailBlock.FACING, Direction.NORTH), false); scene.idle(10); - scene.overlay.showText(40) + scene.overlay().showText(40) .text("Right-Click with Shears to turn them back into frames") .attachKeyFrame() - .pointAt(util.vector.blockSurface(util.grid.at(2, 3, 1), Direction.WEST)) + .pointAt(util.vector().blockSurface(util.grid().at(2, 3, 1), Direction.WEST)) .placeNearTarget(); scene.idle(20); - scene.overlay.showControls(input, 30); + scene.overlay().showControls(input, 30); scene.idle(7); - scene.world.replaceBlocks(util.select.fromTo(3, 2, 2, 3, 4, 2), AllBlocks.SAIL_FRAME.getDefaultState() + scene.world().replaceBlocks(util.select().fromTo(3, 2, 2, 3, 4, 2), AllBlocks.SAIL_FRAME.getDefaultState() .setValue(SailBlock.FACING, Direction.NORTH), false); scene.idle(20); } - scene.world.rotateBearing(bearingPos, 720, 300); - scene.world.rotateSection(plank, 0, 720, 0, 300); + scene.world().rotateBearing(bearingPos, 720, 300); + scene.world().rotateSection(plank, 0, 720, 0, 300); } diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/BeltScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/BeltScenes.java index 8258012c64..82f070b82b 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/BeltScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/BeltScenes.java @@ -18,10 +18,10 @@ import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.NBTHelper; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; import net.createmod.ponder.foundation.ElementLink; import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.SceneBuilder; -import net.createmod.ponder.foundation.SceneBuildingUtil; import net.createmod.ponder.foundation.Selection; import net.createmod.ponder.foundation.element.EntityElement; import net.createmod.ponder.foundation.element.InputWindowElement; @@ -46,128 +46,128 @@ public class BeltScenes { scene.title("belt_connector", "Using Mechanical Belts"); scene.configureBasePlate(0, 0, 5); scene.showBasePlate(); - scene.world.showSection(util.select.position(3, 0, 5), Direction.UP); + scene.world().showSection(util.select().position(3, 0, 5), Direction.UP); scene.idle(5); - scene.world.showSection(util.select.fromTo(4, 1, 3, 4, 1, 5), Direction.DOWN); + scene.world().showSection(util.select().fromTo(4, 1, 3, 4, 1, 5), Direction.DOWN); ElementLink shafts = - scene.world.showIndependentSection(util.select.fromTo(0, 1, 3, 4, 1, 3), Direction.DOWN); - scene.world.moveSection(shafts, util.vector.of(0, 0, -1), 0); - scene.world.setKineticSpeed(util.select.position(0, 1, 3), 0); + scene.world().showIndependentSection(util.select().fromTo(0, 1, 3, 4, 1, 3), Direction.DOWN); + scene.world().moveSection(shafts, util.vector().of(0, 0, -1), 0); + scene.world().setKineticSpeed(util.select().position(0, 1, 3), 0); scene.idle(20); - BlockPos backEnd = util.grid.at(4, 1, 2); - BlockPos frontEnd = util.grid.at(0, 1, 2); + BlockPos backEnd = util.grid().at(4, 1, 2); + BlockPos frontEnd = util.grid().at(0, 1, 2); ItemStack beltItem = AllItems.BELT_CONNECTOR.asStack(); - Vec3 backEndCenter = util.vector.centerOf(backEnd); + Vec3 backEndCenter = util.vector().centerOf(backEnd); AABB connectBB = new AABB(backEndCenter, backEndCenter); AABB shaftBB = AllBlocks.SHAFT.getDefaultState() .setValue(ShaftBlock.AXIS, Axis.Z) .getShape(null, null) .bounds(); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(backEnd), Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(backEnd), Pointing.DOWN).rightClick() .withItem(beltItem), 57); scene.idle(7); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, backEnd, shaftBB.move(backEnd), 42); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.BLACK, backEndCenter, connectBB, 50); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, backEnd, shaftBB.move(backEnd), 42); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.BLACK, backEndCenter, connectBB, 50); scene.idle(20); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(frontEnd), Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(frontEnd), Pointing.DOWN).rightClick() .withItem(beltItem), 37); scene.idle(7); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, frontEnd, shaftBB.move(frontEnd), 17); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.BLACK, backEndCenter, connectBB.expandTowards(-4, 0, 0), - 20); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, frontEnd, shaftBB.move(frontEnd), 17); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.BLACK, backEndCenter, connectBB.expandTowards(-4, 0, 0), + 20); scene.idle(20); - scene.world.moveSection(shafts, util.vector.of(0, -2, 0), 0); - scene.world.showSection(util.select.fromTo(0, 1, 2, 4, 1, 2), Direction.SOUTH); + scene.world().moveSection(shafts, util.vector().of(0, -2, 0), 0); + scene.world().showSection(util.select().fromTo(0, 1, 2, 4, 1, 2), Direction.SOUTH); scene.idle(20); - scene.overlay.showText(80) + scene.overlay().showText(80) .text("Right-Clicking two shafts with a belt item will connect them together") .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.topOf(2, 1, 2)); + .pointAt(util.vector().topOf(2, 1, 2)); scene.idle(90); - Vec3 falseSelection = util.vector.topOf(backEnd.south(1)); - scene.overlay.showControls(new InputWindowElement(falseSelection, Pointing.DOWN).rightClick() + Vec3 falseSelection = util.vector().topOf(backEnd.south(1)); + scene.overlay().showControls(new InputWindowElement(falseSelection, Pointing.DOWN).rightClick() .withItem(beltItem), 37); scene.idle(7); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, backEnd, shaftBB.move(backEnd.south(1)), 50); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.RED, backEnd, shaftBB.move(backEnd.south(1)), 50); - scene.overlay.showText(80) + scene.overlay().showText(80) .colored(PonderPalette.RED) .text("Accidental selections can be canceled with Right-Click while Sneaking") .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.centerOf(backEnd.south(1))); + .pointAt(util.vector().centerOf(backEnd.south(1))); scene.idle(43); - scene.overlay.showControls(new InputWindowElement(falseSelection, Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(falseSelection, Pointing.DOWN).rightClick() .withItem(beltItem) .whileSneaking(), 20); scene.idle(60); BlockPos shaftLocation = frontEnd.east(); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(shaftLocation), Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(shaftLocation), Pointing.DOWN).rightClick() .withItem(AllBlocks.SHAFT.asStack()), 50); scene.idle(7); - scene.world.modifyBlock(shaftLocation, s -> s.setValue(BeltBlock.PART, BeltPart.PULLEY), true); + scene.world().modifyBlock(shaftLocation, s -> s.setValue(BeltBlock.PART, BeltPart.PULLEY), true); scene.idle(10); - scene.overlay.showText(43) + scene.overlay().showText(43) .text("Additional Shafts can be added throughout the Belt") .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.blockSurface(shaftLocation, Direction.NORTH)); + .pointAt(util.vector().blockSurface(shaftLocation, Direction.NORTH)); scene.idle(50); - Selection attachedShafts = util.select.fromTo(0, 1, 1, 1, 1, 1); - scene.world.showSection(attachedShafts, Direction.SOUTH); - scene.world.setKineticSpeed(attachedShafts, 32); + Selection attachedShafts = util.select().fromTo(0, 1, 1, 1, 1, 1); + scene.world().showSection(attachedShafts, Direction.SOUTH); + scene.world().setKineticSpeed(attachedShafts, 32); scene.idle(10); - scene.effects.rotationDirectionIndicator(util.grid.at(0, 1, 1)); - scene.effects.rotationDirectionIndicator(util.grid.at(1, 1, 1)); + scene.effects().rotationDirectionIndicator(util.grid().at(0, 1, 1)); + scene.effects().rotationDirectionIndicator(util.grid().at(1, 1, 1)); scene.idle(20); - scene.overlay.showText(50) + scene.overlay().showText(50) .text("Shafts connected via Belts will rotate with Identical Speed and Direction") .placeNearTarget() - .pointAt(util.vector.blockSurface(util.grid.at(0, 1, 1), Direction.NORTH)); + .pointAt(util.vector().blockSurface(util.grid().at(0, 1, 1), Direction.NORTH)); scene.idle(60); - scene.world.hideSection(attachedShafts, Direction.NORTH); + scene.world().hideSection(attachedShafts, Direction.NORTH); scene.idle(20); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(shaftLocation), Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(shaftLocation), Pointing.DOWN).rightClick() .withItem(AllItems.WRENCH.asStack()), 50); scene.idle(7); - scene.world.modifyBlock(shaftLocation, s -> s.setValue(BeltBlock.PART, BeltPart.MIDDLE), true); + scene.world().modifyBlock(shaftLocation, s -> s.setValue(BeltBlock.PART, BeltPart.MIDDLE), true); scene.idle(10); - scene.overlay.showText(50) + scene.overlay().showText(50) .text("Added shafts can be removed using the wrench") .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.blockSurface(shaftLocation, Direction.NORTH)); + .pointAt(util.vector().blockSurface(shaftLocation, Direction.NORTH)); scene.idle(70); - scene.overlay - .showControls(new InputWindowElement(util.vector.topOf(shaftLocation.east()), Pointing.DOWN).rightClick() + scene.overlay() + .showControls(new InputWindowElement(util.vector().topOf(shaftLocation.east()), Pointing.DOWN).rightClick() .withItem(new ItemStack(Items.BLUE_DYE)), 50); scene.idle(7); - scene.world.modifyBlockEntityNBT(util.select.fromTo(0, 1, 2, 4, 1, 2), BeltBlockEntity.class, + scene.world().modifyBlockEntityNBT(util.select().fromTo(0, 1, 2, 4, 1, 2), BeltBlockEntity.class, nbt -> NBTHelper.writeEnum(nbt, "Dye", DyeColor.BLUE)); scene.idle(20); - scene.overlay.showText(80) + scene.overlay().showText(80) .colored(PonderPalette.BLUE) .text("Mechanical Belts can be dyed for aesthetic purposes") .placeNearTarget() - .pointAt(util.vector.topOf(shaftLocation.east())); + .pointAt(util.vector().topOf(shaftLocation.east())); scene.idle(50); } @@ -180,43 +180,43 @@ public class BeltScenes { scene.idle(5); ElementLink leftShaft = - scene.world.showIndependentSection(util.select.position(4, 1, 0), Direction.DOWN); + scene.world().showIndependentSection(util.select().position(4, 1, 0), Direction.DOWN); ElementLink rightShaft = - scene.world.showIndependentSection(util.select.position(0, 1, 0), Direction.DOWN); + scene.world().showIndependentSection(util.select().position(0, 1, 0), Direction.DOWN); - scene.world.moveSection(leftShaft, util.vector.of(0, 0, 2), 0); - scene.world.moveSection(rightShaft, util.vector.of(0, 0, 2), 0); + scene.world().moveSection(leftShaft, util.vector().of(0, 0, 2), 0); + scene.world().moveSection(rightShaft, util.vector().of(0, 0, 2), 0); scene.idle(1); - scene.world.moveSection(leftShaft, util.vector.of(-1, 0, 0), 10); - scene.world.moveSection(rightShaft, util.vector.of(1, 1, 0), 10); + scene.world().moveSection(leftShaft, util.vector().of(-1, 0, 0), 10); + scene.world().moveSection(rightShaft, util.vector().of(1, 1, 0), 10); scene.idle(20); - Vec3 from = util.vector.centerOf(3, 1, 2); - Vec3 to = util.vector.centerOf(1, 2, 2); + Vec3 from = util.vector().centerOf(3, 1, 2); + Vec3 to = util.vector().centerOf(1, 2, 2); - scene.overlay.showLine(PonderPalette.RED, from, to, 70); + scene.overlay().showLine(PonderPalette.RED, from, to, 70); scene.idle(10); - scene.overlay.showLine(PonderPalette.GREEN, to.add(-1, -1, 0), from, 60); - scene.overlay.showLine(PonderPalette.GREEN, from.add(0, 3, 0), from, 60); + scene.overlay().showLine(PonderPalette.GREEN, to.add(-1, -1, 0), from, 60); + scene.overlay().showLine(PonderPalette.GREEN, from.add(0, 3, 0), from, 60); scene.idle(20); - scene.overlay.showText(60) + scene.overlay().showText(60) .colored(PonderPalette.RED) .placeNearTarget() .pointAt(to) .text("Belts cannot connect in arbitrary directions"); scene.idle(70); - from = util.vector.centerOf(4, 1, 2); - to = util.vector.centerOf(0, 1, 2); + from = util.vector().centerOf(4, 1, 2); + to = util.vector().centerOf(0, 1, 2); - scene.world.moveSection(leftShaft, util.vector.of(1, 0, 0), 10); - scene.world.moveSection(rightShaft, util.vector.of(-1, -1, 0), 10); + scene.world().moveSection(leftShaft, util.vector().of(1, 0, 0), 10); + scene.world().moveSection(rightShaft, util.vector().of(-1, -1, 0), 10); scene.idle(10); - scene.overlay.showLine(PonderPalette.GREEN, from, to, 40); + scene.overlay().showLine(PonderPalette.GREEN, from, to, 40); scene.idle(10); - scene.overlay.showText(40) + scene.overlay().showText(40) .colored(PonderPalette.GREEN) .placeNearTarget() .pointAt(to) @@ -224,24 +224,24 @@ public class BeltScenes { .text("1. They can connect horizontally"); scene.idle(20); - Selection firstBelt = util.select.fromTo(4, 1, 1, 0, 1, 1); - ElementLink belt = scene.world.showIndependentSection(firstBelt, Direction.SOUTH); - scene.world.moveSection(belt, util.vector.of(0, 0, 1), 0); + Selection firstBelt = util.select().fromTo(4, 1, 1, 0, 1, 1); + ElementLink belt = scene.world().showIndependentSection(firstBelt, Direction.SOUTH); + scene.world().moveSection(belt, util.vector().of(0, 0, 1), 0); scene.idle(20); - scene.world.hideIndependentSection(belt, Direction.SOUTH); + scene.world().hideIndependentSection(belt, Direction.SOUTH); scene.idle(15); - from = util.vector.centerOf(3, 3, 2); - to = util.vector.centerOf(1, 1, 2); + from = util.vector().centerOf(3, 3, 2); + to = util.vector().centerOf(1, 1, 2); - scene.world.moveSection(leftShaft, util.vector.of(-1, 2, 0), 10); - scene.world.moveSection(rightShaft, util.vector.of(1, 0, 0), 10); + scene.world().moveSection(leftShaft, util.vector().of(-1, 2, 0), 10); + scene.world().moveSection(rightShaft, util.vector().of(1, 0, 0), 10); scene.idle(10); - scene.world.rotateSection(leftShaft, 0, 0, 25, 5); - scene.world.rotateSection(rightShaft, 0, 0, 25, 5); - scene.overlay.showLine(PonderPalette.GREEN, from, to, 40); + scene.world().rotateSection(leftShaft, 0, 0, 25, 5); + scene.world().rotateSection(rightShaft, 0, 0, 25, 5); + scene.overlay().showLine(PonderPalette.GREEN, from, to, 40); scene.idle(10); - scene.overlay.showText(40) + scene.overlay().showText(40) .colored(PonderPalette.GREEN) .placeNearTarget() .pointAt(to) @@ -249,22 +249,22 @@ public class BeltScenes { .text("2. They can connect diagonally"); scene.idle(20); - Selection secondBelt = util.select.fromTo(3, 3, 2, 1, 1, 2); - belt = scene.world.showIndependentSection(secondBelt, Direction.SOUTH); + Selection secondBelt = util.select().fromTo(3, 3, 2, 1, 1, 2); + belt = scene.world().showIndependentSection(secondBelt, Direction.SOUTH); scene.idle(20); - scene.world.hideIndependentSection(belt, Direction.SOUTH); + scene.world().hideIndependentSection(belt, Direction.SOUTH); scene.idle(15); - from = util.vector.centerOf(2, 4, 2); - to = util.vector.centerOf(2, 1, 2); + from = util.vector().centerOf(2, 4, 2); + to = util.vector().centerOf(2, 1, 2); - scene.world.moveSection(leftShaft, util.vector.of(-1, 1, 0), 10); - scene.world.moveSection(rightShaft, util.vector.of(1, 0, 0), 10); + scene.world().moveSection(leftShaft, util.vector().of(-1, 1, 0), 10); + scene.world().moveSection(rightShaft, util.vector().of(1, 0, 0), 10); scene.idle(10); - scene.world.rotateSection(rightShaft, 0, 0, -25, 5); - scene.overlay.showLine(PonderPalette.GREEN, from, to, 40); + scene.world().rotateSection(rightShaft, 0, 0, -25, 5); + scene.overlay().showLine(PonderPalette.GREEN, from, to, 40); scene.idle(10); - scene.overlay.showText(40) + scene.overlay().showText(40) .colored(PonderPalette.GREEN) .placeNearTarget() .pointAt(to) @@ -272,24 +272,24 @@ public class BeltScenes { .text("3. They can connect vertically"); scene.idle(20); - Selection thirdBelt = util.select.fromTo(2, 1, 3, 2, 4, 3); - belt = scene.world.showIndependentSection(thirdBelt, Direction.SOUTH); - scene.world.moveSection(belt, util.vector.of(0, 0, -1), 0); + Selection thirdBelt = util.select().fromTo(2, 1, 3, 2, 4, 3); + belt = scene.world().showIndependentSection(thirdBelt, Direction.SOUTH); + scene.world().moveSection(belt, util.vector().of(0, 0, -1), 0); scene.idle(20); - scene.world.hideIndependentSection(belt, Direction.SOUTH); + scene.world().hideIndependentSection(belt, Direction.SOUTH); scene.idle(15); - from = util.vector.centerOf(4, 1, 2); - to = util.vector.centerOf(0, 1, 2); + from = util.vector().centerOf(4, 1, 2); + to = util.vector().centerOf(0, 1, 2); - scene.world.moveSection(leftShaft, util.vector.of(2, -3, 0), 10); - scene.world.moveSection(rightShaft, util.vector.of(-2, 0, 0), 10); + scene.world().moveSection(leftShaft, util.vector().of(2, -3, 0), 10); + scene.world().moveSection(rightShaft, util.vector().of(-2, 0, 0), 10); scene.idle(10); - scene.world.rotateSection(rightShaft, 90, 0, -25, 5); - scene.world.rotateSection(leftShaft, 90, 0, -50, 5); - scene.overlay.showLine(PonderPalette.GREEN, from, to, 60); + scene.world().rotateSection(rightShaft, 90, 0, -25, 5); + scene.world().rotateSection(leftShaft, 90, 0, -50, 5); + scene.overlay().showLine(PonderPalette.GREEN, from, to, 60); scene.idle(10); - scene.overlay.showText(60) + scene.overlay().showText(60) .colored(PonderPalette.GREEN) .placeNearTarget() .pointAt(to) @@ -297,26 +297,26 @@ public class BeltScenes { .text("4. And they can connect vertical shafts horizontally"); scene.idle(20); - Selection fourthBelt = util.select.fromTo(4, 1, 4, 0, 1, 4); - belt = scene.world.showIndependentSection(fourthBelt, Direction.DOWN); - scene.world.moveSection(belt, util.vector.of(0, 1 / 512f, -2), 0); + Selection fourthBelt = util.select().fromTo(4, 1, 4, 0, 1, 4); + belt = scene.world().showIndependentSection(fourthBelt, Direction.DOWN); + scene.world().moveSection(belt, util.vector().of(0, 1 / 512f, -2), 0); scene.idle(40); - scene.world.hideIndependentSection(belt, Direction.UP); + scene.world().hideIndependentSection(belt, Direction.UP); scene.idle(15); - scene.world.hideIndependentSection(leftShaft, Direction.UP); - scene.world.hideIndependentSection(rightShaft, Direction.UP); + scene.world().hideIndependentSection(leftShaft, Direction.UP); + scene.world().hideIndependentSection(rightShaft, Direction.UP); scene.idle(15); - scene.world.showSection(firstBelt, Direction.DOWN); + scene.world().showSection(firstBelt, Direction.DOWN); scene.idle(5); - scene.world.showSection(secondBelt, Direction.DOWN); + scene.world().showSection(secondBelt, Direction.DOWN); scene.idle(5); - scene.world.showSection(thirdBelt, Direction.DOWN); + scene.world().showSection(thirdBelt, Direction.DOWN); scene.idle(5); - scene.world.showSection(fourthBelt, Direction.DOWN); + scene.world().showSection(fourthBelt, Direction.DOWN); scene.idle(10); - scene.overlay.showText(160) + scene.overlay().showText(160) .text("These are all possible directions. Belts can span any Length between 2 and 20 blocks"); scene.markAsFinished(); } @@ -326,76 +326,76 @@ public class BeltScenes { scene.title("belt_transport", "Using Mechanical Belts for Logistics"); scene.configureBasePlate(0, 0, 5); scene.setSceneOffsetY(-1); - scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -.6f * f); + scene.world().modifyKineticSpeed(util.select().everywhere(), f -> -.6f * f); scene.showBasePlate(); scene.idle(5); - scene.world.showSection(util.select.fromTo(1, 1, 3, 2, 1, 5), Direction.DOWN); + scene.world().showSection(util.select().fromTo(1, 1, 3, 2, 1, 5), Direction.DOWN); scene.idle(20); - scene.world.showSection(util.select.fromTo(2, 1, 2, 4, 3, 2), Direction.SOUTH); + scene.world().showSection(util.select().fromTo(2, 1, 2, 4, 3, 2), Direction.SOUTH); scene.idle(5); - scene.world.showSection(util.select.fromTo(1, 1, 2, 0, 1, 2), Direction.SOUTH); + scene.world().showSection(util.select().fromTo(1, 1, 2, 0, 1, 2), Direction.SOUTH); scene.idle(10); - scene.special.movePointOfInterest(util.grid.at(2, 2, 0)); + scene.special().movePointOfInterest(util.grid().at(2, 2, 0)); ItemStack stack = new ItemStack(Items.COPPER_BLOCK); ElementLink item = - scene.world.createItemEntity(util.vector.centerOf(0, 4, 2), util.vector.of(0, 0, 0), stack); + scene.world().createItemEntity(util.vector().centerOf(0, 4, 2), util.vector().of(0, 0, 0), stack); scene.idle(13); - scene.world.modifyEntity(item, Entity::discard); - BlockPos beltEnd = util.grid.at(0, 1, 2); - scene.world.createItemOnBelt(beltEnd, Direction.DOWN, stack); + scene.world().modifyEntity(item, Entity::discard); + BlockPos beltEnd = util.grid().at(0, 1, 2); + scene.world().createItemOnBelt(beltEnd, Direction.DOWN, stack); scene.idle(20); - ElementLink parrot = scene.special.createBirb(util.vector.topOf(0, 1, 2) + ElementLink parrot = scene.special().createBirb(util.vector().topOf(0, 1, 2) .add(0, -3 / 16f, 0), ParrotElement.FacePointOfInterestPose::new); - scene.special.moveParrot(parrot, util.vector.of(1.78, 0, 0), 40); - scene.special.movePointOfInterest(util.grid.at(1, 1, 3)); + scene.special().moveParrot(parrot, util.vector().of(1.78, 0, 0), 40); + scene.special().movePointOfInterest(util.grid().at(1, 1, 3)); - scene.overlay.showText(60) + scene.overlay().showText(60) .placeNearTarget() - .pointAt(util.vector.topOf(beltEnd)) + .pointAt(util.vector().topOf(beltEnd)) .text("Moving belts will transport Items and other Entities"); scene.idle(20); - item = scene.world.createItemEntity(util.vector.centerOf(0, 4, 2), util.vector.of(0, 0, 0), stack); - scene.special.movePointOfInterest(util.grid.at(0, 3, 2)); + item = scene.world().createItemEntity(util.vector().centerOf(0, 4, 2), util.vector().of(0, 0, 0), stack); + scene.special().movePointOfInterest(util.grid().at(0, 3, 2)); scene.idle(10); - scene.special.movePointOfInterest(beltEnd); + scene.special().movePointOfInterest(beltEnd); scene.idle(3); - scene.world.modifyEntity(item, Entity::discard); - scene.world.createItemOnBelt(beltEnd, Direction.DOWN, stack); + scene.world().modifyEntity(item, Entity::discard); + scene.world().createItemOnBelt(beltEnd, Direction.DOWN, stack); scene.idle(8); - scene.special.movePointOfInterest(util.grid.at(3, 2, 1)); - scene.special.moveParrot(parrot, util.vector.of(2.1, 2.1, 0), 60); + scene.special().movePointOfInterest(util.grid().at(3, 2, 1)); + scene.special().moveParrot(parrot, util.vector().of(2.1, 2.1, 0), 60); scene.idle(20); - scene.special.movePointOfInterest(util.grid.at(5, 5, 2)); + scene.special().movePointOfInterest(util.grid().at(5, 5, 2)); scene.idle(30); - scene.special.movePointOfInterest(util.grid.at(2, 1, 5)); + scene.special().movePointOfInterest(util.grid().at(2, 1, 5)); scene.idle(10); - scene.special.moveParrot(parrot, util.vector.of(.23, 0, 0), 5); + scene.special().moveParrot(parrot, util.vector().of(.23, 0, 0), 5); scene.idle(5); - scene.world.setKineticSpeed(util.select.everywhere(), 0f); + scene.world().setKineticSpeed(util.select().everywhere(), 0f); scene.idle(10); - scene.world.modifyEntities(ItemEntity.class, Entity::discard); - scene.special.movePointOfInterest(util.grid.at(2, 5, 4)); + scene.world().modifyEntities(ItemEntity.class, Entity::discard); + scene.special().movePointOfInterest(util.grid().at(2, 5, 4)); - Vec3 topOf = util.vector.topOf(util.grid.at(3, 2, 2)) + Vec3 topOf = util.vector().topOf(util.grid().at(3, 2, 2)) .add(-0.1, 0.3, 0); - scene.overlay.showControls(new InputWindowElement(topOf, Pointing.DOWN).rightClick(), 60); + scene.overlay().showControls(new InputWindowElement(topOf, Pointing.DOWN).rightClick(), 60); scene.idle(10); - scene.overlay.showText(60) + scene.overlay().showText(60) .placeNearTarget() .pointAt(topOf.subtract(0, 0.1, 0)) .attachKeyFrame() .text("Right-Click with an empty hand to take items off a belt"); scene.idle(20); - scene.world.removeItemsFromBelt(util.grid.at(3, 2, 2)); - scene.effects.indicateSuccess(util.grid.at(3, 2, 2)); + scene.world().removeItemsFromBelt(util.grid().at(3, 2, 2)); + scene.effects().indicateSuccess(util.grid().at(3, 2, 2)); scene.idle(20); - scene.special.changeBirbPose(parrot, ParrotElement.FaceCursorPose::new); + scene.special().changeBirbPose(parrot, ParrotElement.FaceCursorPose::new); } public static void beltsCanBeEncased(SceneBuilder builder, SceneBuildingUtil util) { @@ -405,43 +405,43 @@ public class BeltScenes { scene.setSceneOffsetY(-1); scene.showBasePlate(); scene.idle(5); - scene.world.showSection(util.select.layersFrom(1), Direction.DOWN); + scene.world().showSection(util.select().layersFrom(1), Direction.DOWN); scene.idle(20); ItemStack brassCasingItem = AllBlocks.BRASS_CASING.asStack(); ItemStack andesiteCasingItem = AllBlocks.ANDESITE_CASING.asStack(); - BlockPos beltPos = util.grid.at(3, 1, 0); - BlockPos beltPos2 = util.grid.at(0, 2, 3); - BlockPos beltPos3 = util.grid.at(1, 4, 4); + BlockPos beltPos = util.grid().at(3, 1, 0); + BlockPos beltPos2 = util.grid().at(0, 2, 3); + BlockPos beltPos3 = util.grid().at(1, 4, 4); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(beltPos), Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(beltPos), Pointing.DOWN).rightClick() .withItem(brassCasingItem), 20); scene.idle(7); - scene.world.modifyBlock(beltPos, s -> s.setValue(BeltBlock.CASING, true), true); + scene.world().modifyBlock(beltPos, s -> s.setValue(BeltBlock.CASING, true), true); scene.idle(20); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(beltPos2), Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(beltPos2), Pointing.DOWN).rightClick() .withItem(andesiteCasingItem), 20); scene.idle(7); - scene.world.modifyBlock(beltPos2, s -> s.setValue(BeltBlock.CASING, true), true); - scene.world.modifyBlockEntityNBT(util.select.position(beltPos2), BeltBlockEntity.class, nbt -> { + scene.world().modifyBlock(beltPos2, s -> s.setValue(BeltBlock.CASING, true), true); + scene.world().modifyBlockEntityNBT(util.select().position(beltPos2), BeltBlockEntity.class, nbt -> { NBTHelper.writeEnum(nbt, "Casing", BeltBlockEntity.CasingType.ANDESITE); }); scene.idle(20); - scene.overlay.showControls( - new InputWindowElement(util.vector.blockSurface(beltPos3, Direction.EAST), Pointing.RIGHT).rightClick() + scene.overlay().showControls( + new InputWindowElement(util.vector().blockSurface(beltPos3, Direction.EAST), Pointing.RIGHT).rightClick() .withItem(brassCasingItem), 20); scene.idle(7); - scene.world.modifyBlock(beltPos3, s -> s.setValue(BeltBlock.CASING, true), true); + scene.world().modifyBlock(beltPos3, s -> s.setValue(BeltBlock.CASING, true), true); scene.idle(20); - scene.overlay.showText(80) + scene.overlay().showText(80) .text("Brass or Andesite Casing can be used to decorate Mechanical Belts") .attachKeyFrame() - .pointAt(util.vector.centerOf(beltPos2)); + .pointAt(util.vector().centerOf(beltPos2)); scene.idle(40); @@ -461,27 +461,27 @@ public class BeltScenes { for (BlockPos pos : andesiteBelts) { scene.idle(4); - scene.world.modifyBlock(pos, s -> s.setValue(BeltBlock.CASING, true), true); - scene.world.modifyBlockEntityNBT(util.select.position(pos), BeltBlockEntity.class, nbt -> { + scene.world().modifyBlock(pos, s -> s.setValue(BeltBlock.CASING, true), true); + scene.world().modifyBlockEntityNBT(util.select().position(pos), BeltBlockEntity.class, nbt -> { NBTHelper.writeEnum(nbt, "Casing", BeltBlockEntity.CasingType.ANDESITE); }); } for (BlockPos pos : brassBelts) { scene.idle(4); - scene.world.modifyBlock(pos, s -> s.setValue(BeltBlock.CASING, true), true); + scene.world().modifyBlock(pos, s -> s.setValue(BeltBlock.CASING, true), true); } scene.idle(30); scene.addKeyframe(); - scene.overlay - .showControls(new InputWindowElement(util.vector.topOf(beltPos.south()), Pointing.DOWN).rightClick() + scene.overlay() + .showControls(new InputWindowElement(util.vector().topOf(beltPos.south()), Pointing.DOWN).rightClick() .withItem(AllItems.WRENCH.asStack()), 40); scene.idle(7); - scene.world.modifyBlock(beltPos.south(), s -> s.setValue(BeltBlock.CASING, false), true); - scene.overlay.showText(80) + scene.world().modifyBlock(beltPos.south(), s -> s.setValue(BeltBlock.CASING, false), true); + scene.overlay().showText(80) .text("A wrench can be used to remove the casing") .placeNearTarget() - .pointAt(util.vector.blockSurface(beltPos.south(), Direction.WEST)); + .pointAt(util.vector().blockSurface(beltPos.south(), Direction.WEST)); } public static void depot(SceneBuilder builder, SceneBuildingUtil util) { @@ -490,109 +490,109 @@ public class BeltScenes { scene.configureBasePlate(0, 0, 5); scene.showBasePlate(); scene.idle(5); - scene.world.setBlock(util.grid.at(3, 2, 2), Blocks.WATER.defaultBlockState(), false); + scene.world().setBlock(util.grid().at(3, 2, 2), Blocks.WATER.defaultBlockState(), false); - BlockPos depotPos = util.grid.at(2, 1, 2); - scene.world.showSection(util.select.position(2, 1, 2), Direction.DOWN); - Vec3 topOf = util.vector.topOf(depotPos); - scene.overlay.showText(60) + BlockPos depotPos = util.grid().at(2, 1, 2); + scene.world().showSection(util.select().position(2, 1, 2), Direction.DOWN); + Vec3 topOf = util.vector().topOf(depotPos); + scene.overlay().showText(60) .attachKeyFrame() .text("Depots can serve as 'stationary' belt elements") .placeNearTarget() .pointAt(topOf); scene.idle(70); - scene.overlay.showControls(new InputWindowElement(topOf, Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(topOf, Pointing.DOWN).rightClick() .withItem(new ItemStack(Items.COPPER_BLOCK)), 20); scene.idle(7); - scene.world.createItemOnBeltLike(depotPos, Direction.NORTH, new ItemStack(Items.COPPER_BLOCK)); + scene.world().createItemOnBeltLike(depotPos, Direction.NORTH, new ItemStack(Items.COPPER_BLOCK)); scene.idle(10); - scene.overlay.showText(70) + scene.overlay().showText(70) .attachKeyFrame() .text("Right-Click to manually place or remove Items from it") .placeNearTarget() .pointAt(topOf); scene.idle(80); - scene.overlay.showControls(new InputWindowElement(topOf, Pointing.DOWN).rightClick(), 20); + scene.overlay().showControls(new InputWindowElement(topOf, Pointing.DOWN).rightClick(), 20); scene.idle(7); - scene.world.removeItemsFromBelt(depotPos); - scene.effects.indicateSuccess(depotPos); + scene.world().removeItemsFromBelt(depotPos); + scene.effects().indicateSuccess(depotPos); scene.idle(20); - scene.world.showSection(util.select.position(depotPos.above(2)), Direction.SOUTH); - scene.overlay.showText(70) + scene.world().showSection(util.select().position(depotPos.above(2)), Direction.SOUTH); + scene.overlay().showText(70) .attachKeyFrame() .text("Just like Mechanical Belts, it can provide items to processing") .placeNearTarget() - .pointAt(util.vector.blockSurface(depotPos.above(2), Direction.WEST)); + .pointAt(util.vector().blockSurface(depotPos.above(2), Direction.WEST)); ItemStack bottle = new ItemStack(Items.BUCKET); - scene.world.createItemOnBeltLike(depotPos, Direction.NORTH, bottle); + scene.world().createItemOnBeltLike(depotPos, Direction.NORTH, bottle); scene.idle(20); - scene.world.modifyBlockEntityNBT(util.select.position(depotPos.above(2)), SpoutBlockEntity.class, + scene.world().modifyBlockEntityNBT(util.select().position(depotPos.above(2)), SpoutBlockEntity.class, nbt -> nbt.putInt("ProcessingTicks", 20)); scene.idle(20); - scene.world.removeItemsFromBelt(depotPos); - scene.world.createItemOnBeltLike(depotPos, Direction.UP, new ItemStack(Items.WATER_BUCKET)); - scene.world.modifyBlockEntityNBT(util.select.position(depotPos.above(2)), SpoutBlockEntity.class, + scene.world().removeItemsFromBelt(depotPos); + scene.world().createItemOnBeltLike(depotPos, Direction.UP, new ItemStack(Items.WATER_BUCKET)); + scene.world().modifyBlockEntityNBT(util.select().position(depotPos.above(2)), SpoutBlockEntity.class, nbt -> nbt.putBoolean("Splash", true)); scene.idle(30); - scene.world.removeItemsFromBelt(depotPos); - scene.world.hideSection(util.select.position(depotPos.above(2)), Direction.SOUTH); + scene.world().removeItemsFromBelt(depotPos); + scene.world().hideSection(util.select().position(depotPos.above(2)), Direction.SOUTH); scene.idle(20); ElementLink spout = - scene.world.showIndependentSection(util.select.position(depotPos.above(2) + scene.world().showIndependentSection(util.select().position(depotPos.above(2) .west()), Direction.SOUTH); - scene.world.moveSection(spout, util.vector.of(1, 0, 0), 0); + scene.world().moveSection(spout, util.vector().of(1, 0, 0), 0); BlockPos pressPos = depotPos.above(2) .west(); ItemStack copper = new ItemStack(Items.COPPER_INGOT); - scene.world.createItemOnBeltLike(depotPos, Direction.NORTH, copper); - Vec3 depotCenter = util.vector.centerOf(depotPos); + scene.world().createItemOnBeltLike(depotPos, Direction.NORTH, copper); + Vec3 depotCenter = util.vector().centerOf(depotPos); scene.idle(10); Class type = MechanicalPressBlockEntity.class; - scene.world.modifyBlockEntity(pressPos, type, pte -> pte.getPressingBehaviour() + scene.world().modifyBlockEntity(pressPos, type, pte -> pte.getPressingBehaviour() .start(Mode.BELT)); scene.idle(15); - scene.world.modifyBlockEntity(pressPos, type, pte -> pte.getPressingBehaviour() + scene.world().modifyBlockEntity(pressPos, type, pte -> pte.getPressingBehaviour() .makePressingParticleEffect(depotCenter.add(0, 8 / 16f, 0), copper)); - scene.world.removeItemsFromBelt(depotPos); + scene.world().removeItemsFromBelt(depotPos); ItemStack sheet = AllItems.COPPER_SHEET.asStack(); - scene.world.createItemOnBeltLike(depotPos, Direction.UP, sheet); + scene.world().createItemOnBeltLike(depotPos, Direction.UP, sheet); scene.idle(20); - scene.world.hideIndependentSection(spout, Direction.SOUTH); + scene.world().hideIndependentSection(spout, Direction.SOUTH); scene.idle(10); - Selection fanSelect = util.select.fromTo(4, 1, 3, 5, 2, 2) - .add(util.select.position(3, 1, 2)) - .add(util.select.position(5, 0, 2)); - scene.world.showSection(fanSelect, Direction.SOUTH); + Selection fanSelect = util.select().fromTo(4, 1, 3, 5, 2, 2) + .add(util.select().position(3, 1, 2)) + .add(util.select().position(5, 0, 2)); + scene.world().showSection(fanSelect, Direction.SOUTH); ElementLink water = - scene.world.showIndependentSection(util.select.position(3, 1, 0), Direction.SOUTH); - scene.world.moveSection(water, util.vector.of(0, 1, 2), 0); + scene.world().showIndependentSection(util.select().position(3, 1, 0), Direction.SOUTH); + scene.world().moveSection(water, util.vector().of(0, 1, 2), 0); scene.idle(30); - scene.world.hideSection(fanSelect, Direction.SOUTH); - scene.world.hideIndependentSection(water, Direction.SOUTH); + scene.world().hideSection(fanSelect, Direction.SOUTH); + scene.world().hideIndependentSection(water, Direction.SOUTH); scene.idle(30); - scene.world.showSection(util.select.fromTo(2, 1, 4, 2, 1, 5) - .add(util.select.position(2, 0, 5)), Direction.DOWN); - BlockPos armPos = util.grid.at(2, 1, 4); - scene.overlay.showText(70) + scene.world().showSection(util.select().fromTo(2, 1, 4, 2, 1, 5) + .add(util.select().position(2, 0, 5)), Direction.DOWN); + BlockPos armPos = util.grid().at(2, 1, 4); + scene.overlay().showText(70) .attachKeyFrame() .text("...as well as provide Items to Mechanical Arms") .placeNearTarget() - .pointAt(util.vector.blockSurface(armPos, Direction.WEST)); + .pointAt(util.vector().blockSurface(armPos, Direction.WEST)); scene.idle(20); - scene.world.instructArm(armPos, Phase.MOVE_TO_INPUT, ItemStack.EMPTY, 0); + scene.world().instructArm(armPos, Phase.MOVE_TO_INPUT, ItemStack.EMPTY, 0); scene.idle(37); - scene.world.removeItemsFromBelt(depotPos); - scene.world.instructArm(armPos, Phase.SEARCH_OUTPUTS, sheet, -1); + scene.world().removeItemsFromBelt(depotPos); + scene.world().instructArm(armPos, Phase.SEARCH_OUTPUTS, sheet, -1); } } diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/CartAssemblerScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/CartAssemblerScenes.java index 7ebe820c25..e4873fe0a6 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/CartAssemblerScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/CartAssemblerScenes.java @@ -7,10 +7,10 @@ import com.simibubi.create.content.contraptions.mounted.CartAssemblerBlock; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; import net.createmod.ponder.foundation.ElementLink; import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.SceneBuilder; -import net.createmod.ponder.foundation.SceneBuildingUtil; import net.createmod.ponder.foundation.Selection; import net.createmod.ponder.foundation.element.EntityElement; import net.createmod.ponder.foundation.element.InputWindowElement; @@ -37,268 +37,268 @@ public class CartAssemblerScenes { scene.title("cart_assembler", "Moving Structures using Cart Assemblers"); scene.configureBasePlate(0, 0, 5); scene.scaleSceneView(.9f); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); scene.idle(5); - BlockPos assemblerPos = util.grid.at(2, 1, 2); - scene.world.setBlock(assemblerPos, Blocks.RAIL.defaultBlockState(), false); + BlockPos assemblerPos = util.grid().at(2, 1, 2); + scene.world().setBlock(assemblerPos, Blocks.RAIL.defaultBlockState(), false); for (int z = 0; z < 5; z++) { - scene.world.showSection(util.select.position(2, 1, z), Direction.DOWN); + scene.world().showSection(util.select().position(2, 1, z), Direction.DOWN); scene.idle(2); } - BlockPos leverPos = util.grid.at(0, 1, 2); - Selection toggle = util.select.fromTo(assemblerPos, leverPos); + BlockPos leverPos = util.grid().at(0, 1, 2); + Selection toggle = util.select().fromTo(assemblerPos, leverPos); scene.idle(10); - scene.overlay - .showControls(new InputWindowElement(util.vector.centerOf(assemblerPos), Pointing.DOWN).rightClick() + scene.overlay() + .showControls(new InputWindowElement(util.vector().centerOf(assemblerPos), Pointing.DOWN).rightClick() .withItem(AllBlocks.CART_ASSEMBLER.asStack()), 30); scene.idle(7); - scene.world.setBlock(assemblerPos, AllBlocks.CART_ASSEMBLER.getDefaultState() + scene.world().setBlock(assemblerPos, AllBlocks.CART_ASSEMBLER.getDefaultState() .setValue(CartAssemblerBlock.RAIL_SHAPE, RailShape.NORTH_SOUTH) .setValue(CartAssemblerBlock.RAIL_TYPE, CartAssembleRailType.REGULAR), true); scene.idle(20); - scene.world.showSection(util.select.fromTo(0, 1, 2, 1, 1, 2), Direction.EAST); + scene.world().showSection(util.select().fromTo(0, 1, 2, 1, 1, 2), Direction.EAST); scene.idle(20); - scene.world.toggleRedstonePower(toggle); - scene.effects.indicateRedstone(leverPos); + scene.world().toggleRedstonePower(toggle); + scene.effects().indicateRedstone(leverPos); scene.idle(10); - scene.overlay.showText(70) + scene.overlay().showText(70) .text("Powered Cart Assemblers mount attached structures to passing Minecarts") .attachKeyFrame() - .pointAt(util.vector.topOf(assemblerPos)) + .pointAt(util.vector().topOf(assemblerPos)) .placeNearTarget(); scene.idle(80); - ElementLink cart = scene.special.createCart(util.vector.topOf(2, 0, 4), 90, Minecart::new); - scene.world.showSection(util.select.position(assemblerPos.above()), Direction.DOWN); + ElementLink cart = scene.special().createCart(util.vector().topOf(2, 0, 4), 90, Minecart::new); + scene.world().showSection(util.select().position(assemblerPos.above()), Direction.DOWN); scene.idle(10); - scene.special.moveCart(cart, util.vector.of(0, 0, -2), 20); + scene.special().moveCart(cart, util.vector().of(0, 0, -2), 20); scene.idle(20); ElementLink plank = - scene.world.makeSectionIndependent(util.select.position(assemblerPos.above())); + scene.world().makeSectionIndependent(util.select().position(assemblerPos.above())); ElementLink anchor = - scene.world.showIndependentSectionImmediately(util.select.position(assemblerPos.east())); - scene.world.moveSection(anchor, util.vector.of(-1, 0, 0), 0); - scene.effects.indicateSuccess(assemblerPos); + scene.world().showIndependentSectionImmediately(util.select().position(assemblerPos.east())); + scene.world().moveSection(anchor, util.vector().of(-1, 0, 0), 0); + scene.effects().indicateSuccess(assemblerPos); scene.idle(1); - scene.world.moveSection(anchor, util.vector.of(0, 0, -2), 20); - scene.world.moveSection(plank, util.vector.of(0, 0, -2), 20); - scene.special.moveCart(cart, util.vector.of(0, 0, -2), 20); + scene.world().moveSection(anchor, util.vector().of(0, 0, -2), 20); + scene.world().moveSection(plank, util.vector().of(0, 0, -2), 20); + scene.special().moveCart(cart, util.vector().of(0, 0, -2), 20); scene.idle(20); - scene.world.toggleRedstonePower(toggle); + scene.world().toggleRedstonePower(toggle); scene.idle(10); - scene.overlay.showText(70) + scene.overlay().showText(70) .text("Without a redstone signal, it disassembles passing cart contraptions back into blocks") .colored(PonderPalette.RED) .attachKeyFrame() - .pointAt(util.vector.topOf(assemblerPos)) + .pointAt(util.vector().topOf(assemblerPos)) .placeNearTarget(); scene.idle(80); - scene.world.rotateSection(anchor, 0, 180, 0, 6); - scene.world.rotateSection(plank, 0, 180, 0, 6); + scene.world().rotateSection(anchor, 0, 180, 0, 6); + scene.world().rotateSection(plank, 0, 180, 0, 6); scene.idle(3); - scene.world.moveSection(anchor, util.vector.of(0, 0, 2), 20); - scene.world.moveSection(plank, util.vector.of(0, 0, 2), 20); - scene.special.moveCart(cart, util.vector.of(0, 0, 2), 20); + scene.world().moveSection(anchor, util.vector().of(0, 0, 2), 20); + scene.world().moveSection(plank, util.vector().of(0, 0, 2), 20); + scene.special().moveCart(cart, util.vector().of(0, 0, 2), 20); scene.idle(21); - scene.world.moveSection(anchor, util.vector.of(0, -2, 0), 0); - scene.special.moveCart(cart, util.vector.of(0, 0, 2), 20); + scene.world().moveSection(anchor, util.vector().of(0, -2, 0), 0); + scene.special().moveCart(cart, util.vector().of(0, 0, 2), 20); scene.idle(30); - scene.world.destroyBlock(assemblerPos.above()); + scene.world().destroyBlock(assemblerPos.above()); scene.idle(5); - scene.world.replaceBlocks(util.select.fromTo(3, 3, 2, 1, 4, 2), Blocks.OAK_PLANKS.defaultBlockState(), false); + scene.world().replaceBlocks(util.select().fromTo(3, 3, 2, 1, 4, 2), Blocks.OAK_PLANKS.defaultBlockState(), false); ElementLink contraption = - scene.world.showIndependentSection(util.select.fromTo(1, 4, 2, 3, 3, 2), Direction.DOWN); - scene.world.moveSection(contraption, util.vector.of(0, -1, 0), 0); + scene.world().showIndependentSection(util.select().fromTo(1, 4, 2, 3, 3, 2), Direction.DOWN); + scene.world().moveSection(contraption, util.vector().of(0, -1, 0), 0); scene.idle(10); - scene.world.showSectionAndMerge(util.select.position(3, 3, 1), Direction.SOUTH, contraption); + scene.world().showSectionAndMerge(util.select().position(3, 3, 1), Direction.SOUTH, contraption); scene.idle(15); - scene.overlay.showOutline(PonderPalette.GREEN, "glue", util.select.position(1, 3, 2) - .add(util.select.fromTo(3, 2, 2, 1, 2, 2)) - .add(util.select.position(3, 2, 1)), 40); - scene.overlay.showControls(new InputWindowElement(util.vector.centerOf(util.grid.at(3, 2, 2)), Pointing.RIGHT) + scene.overlay().showOutline(PonderPalette.GREEN, "glue", util.select().position(1, 3, 2) + .add(util.select().fromTo(3, 2, 2, 1, 2, 2)) + .add(util.select().position(3, 2, 1)), 40); + scene.overlay().showControls(new InputWindowElement(util.vector().centerOf(util.grid().at(3, 2, 2)), Pointing.RIGHT) .withItem(AllItems.SUPER_GLUE.asStack()), 40); - scene.effects.superGlue(util.grid.at(3, 2, 1), Direction.SOUTH, true); - scene.overlay.showText(80) + scene.effects().superGlue(util.grid().at(3, 2, 1), Direction.SOUTH, true); + scene.overlay().showText(80) .attachKeyFrame() .sharedText("movement_anchors") - .pointAt(util.vector.blockSurface(util.grid.at(1, 3, 2), Direction.NORTH)) + .pointAt(util.vector().blockSurface(util.grid().at(1, 3, 2), Direction.NORTH)) .placeNearTarget(); scene.idle(80); - scene.world.toggleRedstonePower(toggle); - scene.effects.indicateRedstone(leverPos); + scene.world().toggleRedstonePower(toggle); + scene.effects().indicateRedstone(leverPos); - scene.special.moveCart(cart, util.vector.of(0, 0, -2), 20); + scene.special().moveCart(cart, util.vector().of(0, 0, -2), 20); scene.idle(20); - scene.world.moveSection(anchor, util.vector.of(0, 2, 0), 0); + scene.world().moveSection(anchor, util.vector().of(0, 2, 0), 0); scene.idle(1); - scene.world.moveSection(anchor, util.vector.of(0, 0, -2), 20); - scene.world.moveSection(contraption, util.vector.of(0, 0, -2), 20); - scene.special.moveCart(cart, util.vector.of(0, 0, -2), 20); + scene.world().moveSection(anchor, util.vector().of(0, 0, -2), 20); + scene.world().moveSection(contraption, util.vector().of(0, 0, -2), 20); + scene.special().moveCart(cart, util.vector().of(0, 0, -2), 20); scene.idle(25); - Vec3 cartCenter = util.vector.centerOf(assemblerPos.north(2)); - scene.overlay.showControls(new InputWindowElement(cartCenter, Pointing.LEFT).rightClick() + Vec3 cartCenter = util.vector().centerOf(assemblerPos.north(2)); + scene.overlay().showControls(new InputWindowElement(cartCenter, Pointing.LEFT).rightClick() .withItem(AllItems.WRENCH.asStack()), 40); scene.idle(7); - scene.special.moveCart(cart, util.vector.of(0, -100, 4), 0); - scene.world.moveSection(anchor, util.vector.of(0, -100, 4), 0); - scene.world.moveSection(contraption, util.vector.of(0, -100, 4), 0); + scene.special().moveCart(cart, util.vector().of(0, -100, 4), 0); + scene.world().moveSection(anchor, util.vector().of(0, -100, 4), 0); + scene.world().moveSection(contraption, util.vector().of(0, -100, 4), 0); ItemStack asStack = AllItems.MINECART_CONTRAPTION.asStack(); ElementLink itemEntity = - scene.world.createItemEntity(cartCenter, util.vector.of(0, .1, 0), asStack); + scene.world().createItemEntity(cartCenter, util.vector().of(0, .1, 0), asStack); scene.idle(40); - scene.overlay.showText(80) + scene.overlay().showText(80) .attachKeyFrame() .text("Using a Wrench on the Minecart will let you carry the Contraption elsewhere") .pointAt(cartCenter) .placeNearTarget(); scene.idle(80); - scene.world.modifyEntity(itemEntity, Entity::discard); + scene.world().modifyEntity(itemEntity, Entity::discard); - scene.overlay.showControls(new InputWindowElement(cartCenter.add(0, 0, 4), Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(cartCenter.add(0, 0, 4), Pointing.DOWN).rightClick() .withItem(asStack), 20); scene.idle(20); - scene.special.moveCart(cart, util.vector.of(0, 100.5, 0), 0); - scene.world.moveSection(anchor, util.vector.of(0, 100.5, 0), 0); - scene.world.moveSection(contraption, util.vector.of(0, 100.5, 0), 0); + scene.special().moveCart(cart, util.vector().of(0, 100.5, 0), 0); + scene.world().moveSection(anchor, util.vector().of(0, 100.5, 0), 0); + scene.world().moveSection(contraption, util.vector().of(0, 100.5, 0), 0); scene.idle(1); - scene.special.moveCart(cart, util.vector.of(0, -.5, 0), 5); - scene.world.moveSection(anchor, util.vector.of(0, -.5, 0), 5); - scene.world.moveSection(contraption, util.vector.of(0, -.5, 0), 5); + scene.special().moveCart(cart, util.vector().of(0, -.5, 0), 5); + scene.world().moveSection(anchor, util.vector().of(0, -.5, 0), 5); + scene.world().moveSection(contraption, util.vector().of(0, -.5, 0), 5); } public static void modes(SceneBuilder builder, SceneBuildingUtil util) { CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("cart_assembler_modes", "Orientation Settings for Minecart Contraptions"); scene.configureBasePlate(0, 0, 5); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); scene.idle(5); for (int z = 0; z < 4; z++) { - scene.world.showSection(util.select.position(1, 1, z), Direction.DOWN); + scene.world().showSection(util.select().position(1, 1, z), Direction.DOWN); scene.idle(2); } for (int x = 2; x < 5; x++) { - scene.world.showSection(util.select.position(x, 1, 3), Direction.DOWN); + scene.world().showSection(util.select().position(x, 1, 3), Direction.DOWN); scene.idle(2); } - BlockPos assemblerPos = util.grid.at(3, 1, 3); + BlockPos assemblerPos = util.grid().at(3, 1, 3); scene.idle(5); - scene.world.setBlock(assemblerPos, AllBlocks.CART_ASSEMBLER.getDefaultState() + scene.world().setBlock(assemblerPos, AllBlocks.CART_ASSEMBLER.getDefaultState() .setValue(CartAssemblerBlock.RAIL_SHAPE, RailShape.EAST_WEST) .setValue(CartAssemblerBlock.RAIL_TYPE, CartAssembleRailType.REGULAR), true); scene.idle(5); - scene.world.showSection(util.select.fromTo(3, 1, 1, 3, 1, 2), Direction.SOUTH); + scene.world().showSection(util.select().fromTo(3, 1, 1, 3, 1, 2), Direction.SOUTH); ElementLink contraption = - scene.world.showIndependentSection(util.select.position(3, 2, 3), Direction.DOWN); + scene.world().showIndependentSection(util.select().position(3, 2, 3), Direction.DOWN); scene.idle(10); - scene.world.glueBlockOnto(util.grid.at(2, 2, 3), Direction.EAST, contraption); - scene.world.toggleRedstonePower(util.select.fromTo(3, 1, 1, 3, 1, 3)); - scene.effects.indicateRedstone(util.grid.at(3, 1, 1)); + scene.world().glueBlockOnto(util.grid().at(2, 2, 3), Direction.EAST, contraption); + scene.world().toggleRedstonePower(util.select().fromTo(3, 1, 1, 3, 1, 3)); + scene.effects().indicateRedstone(util.grid().at(3, 1, 1)); scene.idle(10); ElementLink cart = - scene.special.createCart(util.vector.topOf(util.grid.at(4, 0, 3)), 0, Minecart::new); + scene.special().createCart(util.vector().topOf(util.grid().at(4, 0, 3)), 0, Minecart::new); scene.idle(20); - scene.special.moveCart(cart, util.vector.of(-1, 0, 0), 10); + scene.special().moveCart(cart, util.vector().of(-1, 0, 0), 10); scene.idle(10); ElementLink anchor = - scene.world.showIndependentSectionImmediately(util.select.position(assemblerPos.south())); - scene.world.moveSection(anchor, util.vector.of(0, 0, -1), 0); + scene.world().showIndependentSectionImmediately(util.select().position(assemblerPos.south())); + scene.world().moveSection(anchor, util.vector().of(0, 0, -1), 0); scene.idle(1); - scene.world.setKineticSpeed(util.select.position(2, 2, 3), 32); - scene.special.moveCart(cart, util.vector.of(-1.5, 0, 0), 15); - scene.world.moveSection(anchor, util.vector.of(-1.5, 0, 0), 15); - scene.world.moveSection(contraption, util.vector.of(-1.5, 0, 0), 15); + scene.world().setKineticSpeed(util.select().position(2, 2, 3), 32); + scene.special().moveCart(cart, util.vector().of(-1.5, 0, 0), 15); + scene.world().moveSection(anchor, util.vector().of(-1.5, 0, 0), 15); + scene.world().moveSection(contraption, util.vector().of(-1.5, 0, 0), 15); scene.idle(16); - scene.special.rotateCart(cart, -45, 2); - scene.special.moveCart(cart, util.vector.of(-.5, 0, -.5), 8); - scene.world.moveSection(anchor, util.vector.of(-.5, 0, -.5), 8); - scene.world.moveSection(contraption, util.vector.of(-.5, 0, -.5), 8); - scene.world.rotateSection(anchor, 0, -90, 0, 12); - scene.world.rotateSection(contraption, 0, -90, 0, 12); + scene.special().rotateCart(cart, -45, 2); + scene.special().moveCart(cart, util.vector().of(-.5, 0, -.5), 8); + scene.world().moveSection(anchor, util.vector().of(-.5, 0, -.5), 8); + scene.world().moveSection(contraption, util.vector().of(-.5, 0, -.5), 8); + scene.world().rotateSection(anchor, 0, -90, 0, 12); + scene.world().rotateSection(contraption, 0, -90, 0, 12); scene.idle(9); - scene.special.rotateCart(cart, -45, 2); - scene.special.moveCart(cart, util.vector.of(0, 0, -1.5), 15); - scene.world.moveSection(anchor, util.vector.of(0, 0, -1.5), 15); - scene.world.moveSection(contraption, util.vector.of(0, 0, -1.5), 15); + scene.special().rotateCart(cart, -45, 2); + scene.special().moveCart(cart, util.vector().of(0, 0, -1.5), 15); + scene.world().moveSection(anchor, util.vector().of(0, 0, -1.5), 15); + scene.world().moveSection(contraption, util.vector().of(0, 0, -1.5), 15); scene.idle(15); - scene.world.setKineticSpeed(util.select.position(2, 2, 3), 0); + scene.world().setKineticSpeed(util.select().position(2, 2, 3), 0); - scene.overlay.showText(80) + scene.overlay().showText(80) .attachKeyFrame() .text("Cart Contraptions will rotate to face towards their carts' motion") - .pointAt(util.vector.of(1.5, 2.5, 0)) + .pointAt(util.vector().of(1.5, 2.5, 0)) .placeNearTarget(); scene.idle(90); - scene.overlay.showText(80) + scene.overlay().showText(80) .attachKeyFrame() .text("This Arrow indicates which side of the Structure will be considered the front") - .pointAt(util.vector.topOf(assemblerPos)) + .pointAt(util.vector().topOf(assemblerPos)) .placeNearTarget(); scene.idle(90); - scene.world.hideIndependentSection(contraption, Direction.UP); - scene.world.hideIndependentSection(anchor, Direction.UP); - scene.special.hideElement(cart, Direction.UP); + scene.world().hideIndependentSection(contraption, Direction.UP); + scene.world().hideIndependentSection(anchor, Direction.UP); + scene.special().hideElement(cart, Direction.UP); scene.idle(25); - Vec3 blockSurface = util.vector.blockSurface(assemblerPos, Direction.NORTH) + Vec3 blockSurface = util.vector().blockSurface(assemblerPos, Direction.NORTH) .add(0, -1 / 16f, -2 / 16f); - scene.overlay.showFilterSlotInput(blockSurface, Direction.NORTH, 60); - scene.overlay.showControls(new InputWindowElement(blockSurface, Pointing.DOWN).rightClick(), 60); + scene.overlay().showFilterSlotInput(blockSurface, Direction.NORTH, 60); + scene.overlay().showControls(new InputWindowElement(blockSurface, Pointing.DOWN).rightClick(), 60); scene.idle(10); - scene.overlay.showText(60) - .pointAt(util.vector.of(3, 1.5, 3)) + scene.overlay().showText(60) + .pointAt(util.vector().of(3, 1.5, 3)) .placeNearTarget() .sharedText("behaviour_modify_value_panel"); scene.idle(70); - contraption = scene.world.showIndependentSection(util.select.fromTo(3, 2, 3, 2, 2, 3), Direction.DOWN); - cart = scene.special.createCart(util.vector.topOf(util.grid.at(4, 0, 3)), 0, Minecart::new); + contraption = scene.world().showIndependentSection(util.select().fromTo(3, 2, 3, 2, 2, 3), Direction.DOWN); + cart = scene.special().createCart(util.vector().topOf(util.grid().at(4, 0, 3)), 0, Minecart::new); scene.idle(10); - scene.special.moveCart(cart, util.vector.of(-1, 0, 0), 10); + scene.special().moveCart(cart, util.vector().of(-1, 0, 0), 10); scene.idle(10); - anchor = scene.world.showIndependentSectionImmediately(util.select.position(assemblerPos.south())); - scene.world.moveSection(anchor, util.vector.of(0, 0, -1), 0); + anchor = scene.world().showIndependentSectionImmediately(util.select().position(assemblerPos.south())); + scene.world().moveSection(anchor, util.vector().of(0, 0, -1), 0); scene.idle(1); - scene.world.setKineticSpeed(util.select.position(2, 2, 3), 32); - scene.special.moveCart(cart, util.vector.of(-1.5, 0, 0), 15); - scene.world.moveSection(anchor, util.vector.of(-1.5, 0, 0), 15); - scene.world.moveSection(contraption, util.vector.of(-1.5, 0, 0), 15); + scene.world().setKineticSpeed(util.select().position(2, 2, 3), 32); + scene.special().moveCart(cart, util.vector().of(-1.5, 0, 0), 15); + scene.world().moveSection(anchor, util.vector().of(-1.5, 0, 0), 15); + scene.world().moveSection(contraption, util.vector().of(-1.5, 0, 0), 15); scene.idle(16); - scene.special.rotateCart(cart, -45, 2); - scene.special.moveCart(cart, util.vector.of(-.5, 0, -.5), 8); - scene.world.moveSection(anchor, util.vector.of(-.5, 0, -.5), 8); - scene.world.moveSection(contraption, util.vector.of(-.5, 0, -.5), 8); + scene.special().rotateCart(cart, -45, 2); + scene.special().moveCart(cart, util.vector().of(-.5, 0, -.5), 8); + scene.world().moveSection(anchor, util.vector().of(-.5, 0, -.5), 8); + scene.world().moveSection(contraption, util.vector().of(-.5, 0, -.5), 8); scene.idle(9); - scene.special.rotateCart(cart, -45, 2); - scene.special.moveCart(cart, util.vector.of(0, 0, -1.5), 15); - scene.world.moveSection(anchor, util.vector.of(0, 0, -1.5), 15); - scene.world.moveSection(contraption, util.vector.of(0, 0, -1.5), 15); + scene.special().rotateCart(cart, -45, 2); + scene.special().moveCart(cart, util.vector().of(0, 0, -1.5), 15); + scene.world().moveSection(anchor, util.vector().of(0, 0, -1.5), 15); + scene.world().moveSection(contraption, util.vector().of(0, 0, -1.5), 15); scene.idle(15); - scene.world.setKineticSpeed(util.select.position(2, 2, 3), 0); + scene.world().setKineticSpeed(util.select().position(2, 2, 3), 0); - scene.overlay.showText(80) + scene.overlay().showText(80) .attachKeyFrame() .text("If the Assembler is set to Lock Rotation, the contraptions' orientation will never change") - .pointAt(util.vector.of(0, 2.5, 1.5)) + .pointAt(util.vector().of(0, 2.5, 1.5)) .placeNearTarget(); scene.idle(90); } @@ -308,108 +308,108 @@ public class CartAssemblerScenes { scene.title("cart_assembler_dual", "Assembling Carriage Contraptions"); scene.configureBasePlate(0, 0, 6); scene.scaleSceneView(.9f); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); scene.idle(5); for (int z = 0; z < 5; z++) { - scene.world.showSection(util.select.position(1, 1, z), Direction.DOWN); + scene.world().showSection(util.select().position(1, 1, z), Direction.DOWN); scene.idle(2); } for (int x = 2; x < 6; x++) { - scene.world.showSection(util.select.position(x, 1, 4), Direction.DOWN); + scene.world().showSection(util.select().position(x, 1, 4), Direction.DOWN); scene.idle(2); } - BlockPos assembler1 = util.grid.at(2, 1, 4); - BlockPos assembler2 = util.grid.at(5, 1, 4); - Selection chassis = util.select.fromTo(5, 2, 4, 2, 2, 4); + BlockPos assembler1 = util.grid().at(2, 1, 4); + BlockPos assembler2 = util.grid().at(5, 1, 4); + Selection chassis = util.select().fromTo(5, 2, 4, 2, 2, 4); scene.idle(5); - scene.world.showSection(util.select.fromTo(2, 1, 3, 2, 1, 2), Direction.SOUTH); + scene.world().showSection(util.select().fromTo(2, 1, 3, 2, 1, 2), Direction.SOUTH); scene.idle(5); ElementLink cart = - scene.special.createCart(util.vector.topOf(assembler1.below()), 0, Minecart::new); + scene.special().createCart(util.vector().topOf(assembler1.below()), 0, Minecart::new); ElementLink cart2 = - scene.special.createCart(util.vector.topOf(assembler2.below()), 0, MinecartChest::new); + scene.special().createCart(util.vector().topOf(assembler2.below()), 0, MinecartChest::new); scene.idle(15); - scene.world.setBlock(assembler1, AllBlocks.CART_ASSEMBLER.getDefaultState() + scene.world().setBlock(assembler1, AllBlocks.CART_ASSEMBLER.getDefaultState() .setValue(CartAssemblerBlock.RAIL_SHAPE, RailShape.EAST_WEST) .setValue(CartAssemblerBlock.RAIL_TYPE, CartAssembleRailType.CONTROLLER_RAIL), true); scene.idle(5); - scene.world.setBlock(assembler2, AllBlocks.CART_ASSEMBLER.getDefaultState() + scene.world().setBlock(assembler2, AllBlocks.CART_ASSEMBLER.getDefaultState() .setValue(CartAssemblerBlock.RAIL_SHAPE, RailShape.EAST_WEST) .setValue(CartAssemblerBlock.RAIL_TYPE, CartAssembleRailType.REGULAR), true); scene.idle(5); - ElementLink contraption = scene.world.showIndependentSection(chassis, Direction.DOWN); + ElementLink contraption = scene.world().showIndependentSection(chassis, Direction.DOWN); scene.idle(15); - scene.overlay.showOutline(PonderPalette.GREEN, new Object(), util.select.position(assembler2), 60); - scene.overlay.showSelectionWithText(util.select.position(assembler1), 60) + scene.overlay().showOutline(PonderPalette.GREEN, new Object(), util.select().position(assembler2), 60); + scene.overlay().showSelectionWithText(util.select().position(assembler1), 60) .colored(PonderPalette.GREEN) - .pointAt(util.vector.blockSurface(util.grid.at(2, 2, 4), Direction.NORTH)) + .pointAt(util.vector().blockSurface(util.grid().at(2, 2, 4), Direction.NORTH)) .placeNearTarget() .text("Whenever two Cart Assembers share an attached structure...") .attachKeyFrame(); scene.idle(70); - scene.overlay.showText(60) - .pointAt(util.vector.blockSurface(util.grid.at(2, 1, 4), Direction.NORTH)) + scene.overlay().showText(60) + .pointAt(util.vector().blockSurface(util.grid().at(2, 1, 4), Direction.NORTH)) .placeNearTarget() .text("Powering either of them will create a Carriage Contraption"); scene.idle(70); - scene.effects.indicateRedstone(util.grid.at(2, 1, 2)); - scene.world.toggleRedstonePower(util.select.fromTo(2, 1, 2, 2, 1, 4)); + scene.effects().indicateRedstone(util.grid().at(2, 1, 2)); + scene.world().toggleRedstonePower(util.select().fromTo(2, 1, 2, 2, 1, 4)); ElementLink anchors = - scene.world.showIndependentSectionImmediately(util.select.fromTo(assembler1.south(), assembler2.south())); - scene.world.moveSection(anchors, util.vector.of(0, 0, -1), 0); - scene.world.configureCenterOfRotation(anchors, util.vector.centerOf(util.grid.at(2, 2, 5))); - scene.world.configureCenterOfRotation(contraption, util.vector.centerOf(util.grid.at(2, 2, 4))); + scene.world().showIndependentSectionImmediately(util.select().fromTo(assembler1.south(), assembler2.south())); + scene.world().moveSection(anchors, util.vector().of(0, 0, -1), 0); + scene.world().configureCenterOfRotation(anchors, util.vector().centerOf(util.grid().at(2, 2, 5))); + scene.world().configureCenterOfRotation(contraption, util.vector().centerOf(util.grid().at(2, 2, 4))); scene.idle(5); - Vec3 m = util.vector.of(-0.5, 0, 0); - scene.special.moveCart(cart, m, 5); - scene.special.moveCart(cart2, m, 5); - scene.world.moveSection(contraption, m, 5); - scene.world.moveSection(anchors, m, 5); + Vec3 m = util.vector().of(-0.5, 0, 0); + scene.special().moveCart(cart, m, 5); + scene.special().moveCart(cart2, m, 5); + scene.world().moveSection(contraption, m, 5); + scene.world().moveSection(anchors, m, 5); scene.idle(5); - scene.special.rotateCart(cart, -45, 2); - scene.special.moveCart(cart2, util.vector.of(-.3, 0, 0), 8); - m = util.vector.of(-.5, 0, -.5); - scene.special.moveCart(cart, m, 8); - scene.world.moveSection(anchors, m, 8); - scene.world.moveSection(contraption, m, 8); - scene.world.rotateSection(anchors, 0, -10, 0, 8); - scene.world.rotateSection(contraption, 0, -10, 0, 8); + scene.special().rotateCart(cart, -45, 2); + scene.special().moveCart(cart2, util.vector().of(-.3, 0, 0), 8); + m = util.vector().of(-.5, 0, -.5); + scene.special().moveCart(cart, m, 8); + scene.world().moveSection(anchors, m, 8); + scene.world().moveSection(contraption, m, 8); + scene.world().rotateSection(anchors, 0, -10, 0, 8); + scene.world().rotateSection(contraption, 0, -10, 0, 8); scene.idle(8); - scene.special.rotateCart(cart, -45, 2); - scene.special.moveCart(cart2, util.vector.of(-.4, 0, 0), 5); - m = util.vector.of(0, 0, -3.5); - scene.special.moveCart(cart, m, 25); - scene.world.moveSection(anchors, m, 25); - scene.world.moveSection(contraption, m, 25); - scene.world.rotateSection(anchors, 0, -33, 0, 10); - scene.world.rotateSection(contraption, 0, -33, 0, 10); + scene.special().rotateCart(cart, -45, 2); + scene.special().moveCart(cart2, util.vector().of(-.4, 0, 0), 5); + m = util.vector().of(0, 0, -3.5); + scene.special().moveCart(cart, m, 25); + scene.world().moveSection(anchors, m, 25); + scene.world().moveSection(contraption, m, 25); + scene.world().rotateSection(anchors, 0, -33, 0, 10); + scene.world().rotateSection(contraption, 0, -33, 0, 10); scene.idle(5); - scene.special.moveCart(cart2, util.vector.of(-0.8, 0, 0), 5); + scene.special().moveCart(cart2, util.vector().of(-0.8, 0, 0), 5); scene.idle(5); - scene.special.moveCart(cart2, util.vector.of(-1.5, 0, 0), 9); - scene.world.rotateSection(anchors, 0, -42, 0, 9); - scene.world.rotateSection(contraption, 0, -42, 0, 9); + scene.special().moveCart(cart2, util.vector().of(-1.5, 0, 0), 9); + scene.world().rotateSection(anchors, 0, -42, 0, 9); + scene.world().rotateSection(contraption, 0, -42, 0, 9); scene.idle(9); - m = util.vector.of(-.5, 0, -.5); - scene.special.moveCart(cart2, m, 2); - scene.special.rotateCart(cart2, -45, 2); - scene.world.rotateSection(anchors, 0, -5, 0, 5); - scene.world.rotateSection(contraption, 0, -5, 0, 5); + m = util.vector().of(-.5, 0, -.5); + scene.special().moveCart(cart2, m, 2); + scene.special().rotateCart(cart2, -45, 2); + scene.world().rotateSection(anchors, 0, -5, 0, 5); + scene.world().rotateSection(contraption, 0, -5, 0, 5); scene.idle(2); - scene.special.moveCart(cart2, util.vector.of(0, 0, -.5), 5); - scene.special.rotateCart(cart2, -45, 2); + scene.special().moveCart(cart2, util.vector().of(0, 0, -.5), 5); + scene.special().rotateCart(cart2, -45, 2); scene.idle(10); - scene.overlay.showText(70) + scene.overlay().showText(70) .attachKeyFrame() - .pointAt(util.vector.blockSurface(util.grid.at(1, 1, 3), Direction.WEST)) + .pointAt(util.vector().blockSurface(util.grid().at(1, 1, 3), Direction.WEST)) .placeNearTarget() .text("The carts will behave like those connected via Minecart Coupling"); scene.idle(80); @@ -421,133 +421,133 @@ public class CartAssemblerScenes { scene.title("cart_assembler_rails", "Other types of Minecarts and Rails"); scene.configureBasePlate(0, 0, 6); scene.scaleSceneView(.9f); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); scene.idle(5); for (int x = 0; x < 6; x++) { - scene.world.showSection(util.select.position(x, 1, 3), Direction.DOWN); + scene.world().showSection(util.select().position(x, 1, 3), Direction.DOWN); scene.idle(2); } - BlockPos assembler = util.grid.at(3, 1, 3); + BlockPos assembler = util.grid().at(3, 1, 3); - Selection chassis = util.select.fromTo(4, 2, 3, 2, 2, 3); + Selection chassis = util.select().fromTo(4, 2, 3, 2, 2, 3); scene.idle(5); - scene.overlay.showText(70) + scene.overlay().showText(70) .attachKeyFrame() - .pointAt(util.vector.blockSurface(assembler, Direction.DOWN)) + .pointAt(util.vector().blockSurface(assembler, Direction.DOWN)) .placeNearTarget() .text("Cart Assemblers on Regular Tracks will not affect the passing carts' motion"); scene.idle(10); - scene.world.setBlock(assembler, AllBlocks.CART_ASSEMBLER.getDefaultState() + scene.world().setBlock(assembler, AllBlocks.CART_ASSEMBLER.getDefaultState() .setValue(CartAssemblerBlock.RAIL_SHAPE, RailShape.EAST_WEST) .setValue(CartAssemblerBlock.RAIL_TYPE, CartAssembleRailType.REGULAR), true); scene.idle(70); - ElementLink cart = scene.special.createCart(util.vector.topOf(assembler.east(2) + ElementLink cart = scene.special().createCart(util.vector().topOf(assembler.east(2) .below()), 0, Minecart::new); ElementLink anchor = - scene.world.showIndependentSection(util.select.position(assembler.south()), Direction.DOWN); + scene.world().showIndependentSection(util.select().position(assembler.south()), Direction.DOWN); ElementLink contraption = - scene.world.showIndependentSection(util.select.position(assembler.south() + scene.world().showIndependentSection(util.select().position(assembler.south() .above()), Direction.DOWN); - scene.world.moveSection(contraption, util.vector.of(2, 0, -1), 0); - scene.world.moveSection(anchor, util.vector.of(2, 0, -1), 0); + scene.world().moveSection(contraption, util.vector().of(2, 0, -1), 0); + scene.world().moveSection(anchor, util.vector().of(2, 0, -1), 0); scene.idle(10); - scene.world.moveSection(contraption, util.vector.of(-2, 0, 0), 10); - scene.world.moveSection(anchor, util.vector.of(-2, 0, 0), 10); - scene.special.moveCart(cart, util.vector.of(-5, 0, 0), 25); + scene.world().moveSection(contraption, util.vector().of(-2, 0, 0), 10); + scene.world().moveSection(anchor, util.vector().of(-2, 0, 0), 10); + scene.special().moveCart(cart, util.vector().of(-5, 0, 0), 25); scene.idle(30); - scene.special.hideElement(cart, Direction.UP); - scene.world.hideIndependentSection(contraption, Direction.UP); - scene.world.moveSection(anchor, util.vector.of(0, -3, 0), 0); + scene.special().hideElement(cart, Direction.UP); + scene.world().hideIndependentSection(contraption, Direction.UP); + scene.world().moveSection(anchor, util.vector().of(0, -3, 0), 0); scene.idle(30); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(assembler), Pointing.DOWN) + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(assembler), Pointing.DOWN) .withItem(new ItemStack(Items.POWERED_RAIL)), 50); scene.idle(7); - scene.world.setBlock(assembler, AllBlocks.CART_ASSEMBLER.getDefaultState() + scene.world().setBlock(assembler, AllBlocks.CART_ASSEMBLER.getDefaultState() .setValue(CartAssemblerBlock.RAIL_SHAPE, RailShape.EAST_WEST) .setValue(CartAssemblerBlock.RAIL_TYPE, CartAssembleRailType.POWERED_RAIL), true); - scene.overlay.showText(100) + scene.overlay().showText(100) .attachKeyFrame() - .pointAt(util.vector.topOf(assembler)) + .pointAt(util.vector().topOf(assembler)) .placeNearTarget() .text("When on Powered or Controller Rail, the carts will be held in place until it's Powered"); scene.idle(110); - scene.world.hideIndependentSection(anchor, Direction.DOWN); - cart = scene.special.createCart(util.vector.topOf(assembler.east(2) + scene.world().hideIndependentSection(anchor, Direction.DOWN); + cart = scene.special().createCart(util.vector().topOf(assembler.east(2) .below()), 0, Minecart::new); - anchor = scene.world.showIndependentSection(util.select.position(assembler.south()), Direction.DOWN); - contraption = scene.world.showIndependentSection(util.select.position(assembler.south() + anchor = scene.world().showIndependentSection(util.select().position(assembler.south()), Direction.DOWN); + contraption = scene.world().showIndependentSection(util.select().position(assembler.south() .above()), Direction.DOWN); - scene.world.moveSection(contraption, util.vector.of(2, 0, -1), 0); - scene.world.moveSection(anchor, util.vector.of(2, 0, -1), 0); + scene.world().moveSection(contraption, util.vector().of(2, 0, -1), 0); + scene.world().moveSection(anchor, util.vector().of(2, 0, -1), 0); scene.idle(10); - scene.world.moveSection(contraption, util.vector.of(-2, 0, 0), 10); - scene.world.moveSection(anchor, util.vector.of(-2, 0, 0), 10); - scene.special.moveCart(cart, util.vector.of(-2, 0, 0), 10); - scene.world.showSection(util.select.fromTo(3, 1, 1, 3, 1, 2), Direction.SOUTH); + scene.world().moveSection(contraption, util.vector().of(-2, 0, 0), 10); + scene.world().moveSection(anchor, util.vector().of(-2, 0, 0), 10); + scene.special().moveCart(cart, util.vector().of(-2, 0, 0), 10); + scene.world().showSection(util.select().fromTo(3, 1, 1, 3, 1, 2), Direction.SOUTH); scene.idle(30); - scene.world.toggleRedstonePower(util.select.fromTo(3, 1, 1, 3, 1, 3)); - scene.effects.indicateRedstone(util.grid.at(3, 1, 1)); + scene.world().toggleRedstonePower(util.select().fromTo(3, 1, 1, 3, 1, 3)); + scene.effects().indicateRedstone(util.grid().at(3, 1, 1)); scene.idle(5); - scene.world.moveSection(contraption, util.vector.of(-3, 0, 0), 15); - scene.world.moveSection(anchor, util.vector.of(-3, 0, 0), 15); - scene.special.moveCart(cart, util.vector.of(-3, 0, 0), 15); + scene.world().moveSection(contraption, util.vector().of(-3, 0, 0), 15); + scene.world().moveSection(anchor, util.vector().of(-3, 0, 0), 15); + scene.special().moveCart(cart, util.vector().of(-3, 0, 0), 15); scene.idle(30); - scene.special.hideElement(cart, Direction.UP); - scene.world.hideIndependentSection(anchor, Direction.UP); - scene.world.hideIndependentSection(contraption, Direction.UP); + scene.special().hideElement(cart, Direction.UP); + scene.world().hideIndependentSection(anchor, Direction.UP); + scene.world().hideIndependentSection(contraption, Direction.UP); scene.idle(20); - cart = scene.special.createCart(util.vector.topOf(assembler.east(2) + cart = scene.special().createCart(util.vector().topOf(assembler.east(2) .below()), 0, MinecartFurnace::new); scene.idle(10); - scene.overlay.showText(50) + scene.overlay().showText(50) .attachKeyFrame() - .pointAt(util.vector.topOf(assembler.east(2))) + .pointAt(util.vector().topOf(assembler.east(2))) .placeNearTarget() .text("Other types of Minecarts can be used as the anchor"); scene.idle(50); - contraption = scene.world.showIndependentSection(chassis, Direction.DOWN); + contraption = scene.world().showIndependentSection(chassis, Direction.DOWN); scene.idle(5); - scene.world.glueBlockOnto(assembler.above(2), Direction.DOWN, contraption); + scene.world().glueBlockOnto(assembler.above(2), Direction.DOWN, contraption); scene.idle(15); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(assembler.above()), Pointing.UP) + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(assembler.above()), Pointing.UP) .withItem(new ItemStack(Items.CHARCOAL)), 40); scene.idle(7); - scene.overlay.showText(80) - .pointAt(util.vector.blockSurface(assembler.above(2), Direction.WEST)) + scene.overlay().showText(80) + .pointAt(util.vector().blockSurface(assembler.above(2), Direction.WEST)) .placeNearTarget() .text("Furnace Carts will keep themselves powered, pulling fuel from any attached inventories"); scene.idle(85); - Emitter smoke = Emitter.simple(ParticleTypes.LARGE_SMOKE, util.vector.of(0, 0, 0)); + Emitter smoke = Emitter.simple(ParticleTypes.LARGE_SMOKE, util.vector().of(0, 0, 0)); - scene.special.moveCart(cart, util.vector.of(-5, 0, 0), 50); + scene.special().moveCart(cart, util.vector().of(-5, 0, 0), 50); scene.idle(20); - anchor = scene.world.showIndependentSectionImmediately(util.select.position(assembler.south())); - scene.world.moveSection(anchor, util.vector.of(0, 0, -1), 0); + anchor = scene.world().showIndependentSectionImmediately(util.select().position(assembler.south())); + scene.world().moveSection(anchor, util.vector().of(0, 0, -1), 0); scene.idle(1); - scene.world.setKineticSpeed(util.select.position(2, 2, 3), 32); - scene.world.moveSection(contraption, util.vector.of(-3, 0, 0), 30); - scene.world.moveSection(anchor, util.vector.of(-3, 0, 0), 30); + scene.world().setKineticSpeed(util.select().position(2, 2, 3), 32); + scene.world().moveSection(contraption, util.vector().of(-3, 0, 0), 30); + scene.world().moveSection(anchor, util.vector().of(-3, 0, 0), 30); - Vec3 vec = util.vector.centerOf(assembler) + Vec3 vec = util.vector().centerOf(assembler) .add(.25, .25, -0.5); for (int i = 0; i < 7; i++) { - scene.effects.emitParticles(vec = vec.add(-.5, 0, 0), smoke, 2, 1); + scene.effects().emitParticles(vec = vec.add(-.5, 0, 0), smoke, 2, 1); scene.idle(5); } - scene.world.setKineticSpeed(util.select.position(2, 2, 3), 0); + scene.world().setKineticSpeed(util.select().position(2, 2, 3), 0); } } diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ChainDriveScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ChainDriveScenes.java index 8527be3bc9..3b1584dd78 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ChainDriveScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ChainDriveScenes.java @@ -6,10 +6,10 @@ import com.simibubi.create.content.redstone.analogLever.AnalogLeverBlockEntity; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; import net.createmod.ponder.foundation.ElementLink; import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.SceneBuilder; -import net.createmod.ponder.foundation.SceneBuildingUtil; import net.createmod.ponder.foundation.Selection; import net.createmod.ponder.foundation.element.InputWindowElement; import net.createmod.ponder.foundation.element.TextWindowElement.Builder; @@ -26,73 +26,73 @@ public class ChainDriveScenes { CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("chain_drive", "Relaying rotational force with Chain Drives"); scene.configureBasePlate(0, 0, 5); - scene.world.showSection(util.select.layer(0), Direction.UP); - BlockPos gaugePos = util.grid.at(0, 1, 3); - Selection gauge = util.select.position(gaugePos); - scene.world.showSection(gauge, Direction.UP); - scene.world.setKineticSpeed(gauge, 0); + scene.world().showSection(util.select().layer(0), Direction.UP); + BlockPos gaugePos = util.grid().at(0, 1, 3); + Selection gauge = util.select().position(gaugePos); + scene.world().showSection(gauge, Direction.UP); + scene.world().setKineticSpeed(gauge, 0); scene.idle(5); - scene.world.showSection(util.select.fromTo(5, 1, 2, 4, 1, 2), Direction.DOWN); + scene.world().showSection(util.select().fromTo(5, 1, 2, 4, 1, 2), Direction.DOWN); scene.idle(10); for (int i = 0; i < 3; i++) { scene.idle(5); - scene.world.showSection(util.select.position(3, 1, 2 - i), Direction.DOWN); + scene.world().showSection(util.select().position(3, 1, 2 - i), Direction.DOWN); if (i != 0) - scene.world.showSection(util.select.position(3, 1, 2 + i), Direction.DOWN); + scene.world().showSection(util.select().position(3, 1, 2 + i), Direction.DOWN); } scene.idle(10); - scene.world.showSection(util.select.position(gaugePos.east(2)), Direction.DOWN); + scene.world().showSection(util.select().position(gaugePos.east(2)), Direction.DOWN); scene.idle(5); - scene.world.showSection(util.select.position(gaugePos.east()), Direction.DOWN); + scene.world().showSection(util.select().position(gaugePos.east()), Direction.DOWN); scene.idle(5); - scene.world.setKineticSpeed(gauge, 64); - scene.effects.indicateSuccess(gaugePos); + scene.world().setKineticSpeed(gauge, 64); + scene.effects().indicateSuccess(gaugePos); scene.idle(20); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("Chain Drives relay rotation to each other in a row") .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.blockSurface(util.grid.at(3, 1, 4), Direction.WEST)); + .pointAt(util.vector().blockSurface(util.grid().at(3, 1, 4), Direction.WEST)); scene.idle(60); - Selection shafts = util.select.fromTo(2, 1, 0, 2, 1, 1); - BlockPos rotatedECD = util.grid.at(3, 1, 0); - Selection verticalShaft = util.select.fromTo(rotatedECD.above(), rotatedECD.above(2)); + Selection shafts = util.select().fromTo(2, 1, 0, 2, 1, 1); + BlockPos rotatedECD = util.grid().at(3, 1, 0); + Selection verticalShaft = util.select().fromTo(rotatedECD.above(), rotatedECD.above(2)); - scene.world.showSection(shafts, Direction.EAST); + scene.world().showSection(shafts, Direction.EAST); scene.idle(10); - scene.effects.rotationDirectionIndicator(util.grid.at(2, 1, 0)); - scene.effects.rotationDirectionIndicator(util.grid.at(2, 1, 1)); + scene.effects().rotationDirectionIndicator(util.grid().at(2, 1, 0)); + scene.effects().rotationDirectionIndicator(util.grid().at(2, 1, 1)); scene.idle(20); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("All shafts connected like this will rotate in the same direction") .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.blockSurface(util.grid.at(2, 1, 1), Direction.WEST)); + .pointAt(util.vector().blockSurface(util.grid().at(2, 1, 1), Direction.WEST)); scene.idle(50); - scene.world.hideSection(shafts, Direction.WEST); + scene.world().hideSection(shafts, Direction.WEST); scene.idle(25); scene.addKeyframe(); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(rotatedECD), Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(rotatedECD), Pointing.DOWN).rightClick() .withItem(AllItems.WRENCH.asStack()), 30); scene.idle(7); - scene.world.modifyBlock(rotatedECD, s -> s.setValue(ChainDriveBlock.AXIS, Axis.Y), true); + scene.world().modifyBlock(rotatedECD, s -> s.setValue(ChainDriveBlock.AXIS, Axis.Y), true); scene.idle(40); - scene.world.showSection(verticalShaft, Direction.DOWN); + scene.world().showSection(verticalShaft, Direction.DOWN); scene.idle(10); - scene.effects.rotationDirectionIndicator(util.grid.at(3, 3, 0)); + scene.effects().rotationDirectionIndicator(util.grid().at(3, 3, 0)); scene.idle(10); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("Any part of the row can be rotated by 90 degrees") .placeNearTarget() - .pointAt(util.vector.centerOf(3, 2, 0)); + .pointAt(util.vector().centerOf(3, 2, 0)); scene.markAsFinished(); } @@ -102,10 +102,10 @@ public class ChainDriveScenes { scene.title("chain_gearshift", "Controlling rotational speed with Chain Gearshifts"); scene.configureBasePlate(0, 0, 5); scene.setSceneOffsetY(-1); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); - BlockPos leverPos = util.grid.at(3, 1, 0); - BlockPos eastDrive = util.grid.at(3, 1, 2); + BlockPos leverPos = util.grid().at(3, 1, 0); + BlockPos eastDrive = util.grid().at(3, 1, 2); BlockPos eastGauge = eastDrive.above(3); BlockPos middleGauge = eastGauge.west() @@ -114,155 +114,155 @@ public class ChainDriveScenes { .below(2); ElementLink lever = - scene.world.showIndependentSection(util.select.fromTo(leverPos, leverPos.south()), Direction.UP); + scene.world().showIndependentSection(util.select().fromTo(leverPos, leverPos.south()), Direction.UP); scene.idle(5); - scene.world.showSection(util.select.fromTo(4, 1, 3, 4, 2, 3), Direction.DOWN); + scene.world().showSection(util.select().fromTo(4, 1, 3, 4, 2, 3), Direction.DOWN); scene.idle(10); - scene.world.showSection(util.select.fromTo(eastDrive, eastDrive.west(2)) - .add(util.select.position(eastDrive.above())), Direction.DOWN); + scene.world().showSection(util.select().fromTo(eastDrive, eastDrive.west(2)) + .add(util.select().position(eastDrive.above())), Direction.DOWN); scene.idle(10); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("Unpowered Chain Gearshifts behave exactly like Chain Drives") .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.blockSurface(eastDrive, Direction.NORTH)); + .pointAt(util.vector().blockSurface(eastDrive, Direction.NORTH)); scene.idle(60); - scene.world.showSection(util.select.fromTo(eastGauge, eastGauge.below()), Direction.DOWN); + scene.world().showSection(util.select().fromTo(eastGauge, eastGauge.below()), Direction.DOWN); scene.idle(5); - scene.world.showSection(util.select.fromTo(middleGauge, middleGauge.below()), Direction.DOWN); + scene.world().showSection(util.select().fromTo(middleGauge, middleGauge.below()), Direction.DOWN); scene.idle(5); - scene.world.showSection(util.select.position(westGauge), Direction.DOWN); + scene.world().showSection(util.select().position(westGauge), Direction.DOWN); scene.idle(5); for (BlockPos gauge : new BlockPos[] { eastGauge, middleGauge, westGauge }) { scene.idle(5); - scene.overlay.showText(50) + scene.overlay().showText(50) .sharedText(gauge == eastGauge ? "rpm16_source" : "rpm16") .colored(PonderPalette.MEDIUM) .placeNearTarget() - .pointAt(util.vector.blockSurface(gauge, Direction.NORTH)); + .pointAt(util.vector().blockSurface(gauge, Direction.NORTH)); } scene.idle(60); - scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.south(2))); - scene.effects.indicateRedstone(leverPos); - scene.world.modifyKineticSpeed(util.select.fromTo(westGauge.below(), middleGauge), f -> 2 * f); + scene.world().toggleRedstonePower(util.select().fromTo(leverPos, leverPos.south(2))); + scene.effects().indicateRedstone(leverPos); + scene.world().modifyKineticSpeed(util.select().fromTo(westGauge.below(), middleGauge), f -> 2 * f); scene.idle(10); AABB bb = new AABB(eastDrive); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, eastDrive, bb, 160); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.FAST, eastDrive.west(), bb.move(-2, 0, 0) + scene.overlay().chaseBoundingBoxOutline(PonderPalette.MEDIUM, eastDrive, bb, 160); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.FAST, eastDrive.west(), bb.move(-2, 0, 0) .expandTowards(15 / 16f, 0, 0), 160); scene.idle(20); - scene.overlay.showText(80) + scene.overlay().showText(80) .text("When Powered, the speed transmitted to other Chain Drives in the row is doubled") .attachKeyFrame() .placeNearTarget() .colored(PonderPalette.FAST) - .pointAt(util.vector.blockSurface(eastDrive.west(2), Direction.WEST)); + .pointAt(util.vector().blockSurface(eastDrive.west(2), Direction.WEST)); scene.idle(80); for (BlockPos gauge : new BlockPos[] { eastGauge, middleGauge, westGauge }) { scene.idle(5); - scene.overlay.showText(70) + scene.overlay().showText(70) .sharedText(gauge == eastGauge ? "rpm16_source" : "rpm32") .colored(gauge == eastGauge ? PonderPalette.MEDIUM : PonderPalette.FAST) .placeNearTarget() - .pointAt(util.vector.blockSurface(gauge, Direction.NORTH)); + .pointAt(util.vector().blockSurface(gauge, Direction.NORTH)); } scene.idle(80); - scene.world.hideSection(util.select.fromTo(eastDrive, eastDrive.west(2)), Direction.SOUTH); + scene.world().hideSection(util.select().fromTo(eastDrive, eastDrive.west(2)), Direction.SOUTH); scene.idle(15); - scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.south(2))); - Selection newDriveSelect = util.select.fromTo(eastDrive.south(2), eastDrive.south(2) + scene.world().toggleRedstonePower(util.select().fromTo(leverPos, leverPos.south(2))); + Selection newDriveSelect = util.select().fromTo(eastDrive.south(2), eastDrive.south(2) .west(2)); - ElementLink drives = scene.world.showIndependentSection(newDriveSelect, Direction.NORTH); - scene.world.modifyKineticSpeed(util.select.fromTo(westGauge.below(), middleGauge), f -> .5f * f); - scene.world.setKineticSpeed(newDriveSelect, -32); - scene.world.moveSection(drives, util.vector.of(0, 0, -2), 0); - scene.world.moveSection(lever, util.vector.of(-2, 0, 0), 10); + ElementLink drives = scene.world().showIndependentSection(newDriveSelect, Direction.NORTH); + scene.world().modifyKineticSpeed(util.select().fromTo(westGauge.below(), middleGauge), f -> .5f * f); + scene.world().setKineticSpeed(newDriveSelect, -32); + scene.world().moveSection(drives, util.vector().of(0, 0, -2), 0); + scene.world().moveSection(lever, util.vector().of(-2, 0, 0), 10); scene.idle(40); - scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.south(1))); - scene.world.toggleRedstonePower(util.select.position(1, 1, 4)); + scene.world().toggleRedstonePower(util.select().fromTo(leverPos, leverPos.south(1))); + scene.world().toggleRedstonePower(util.select().position(1, 1, 4)); BlockPos analogPos = leverPos.west(2); - scene.effects.indicateRedstone(analogPos); - scene.world.modifyKineticSpeed(util.select.position(westGauge), f -> .5f * f); + scene.effects().indicateRedstone(analogPos); + scene.world().modifyKineticSpeed(util.select().position(westGauge), f -> .5f * f); scene.idle(10); bb = new AABB(eastDrive); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, eastDrive, bb.expandTowards(-15 / 16f, 0, 0), 160); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.SLOW, eastDrive.west(), bb.move(-2, 0, 0), 160); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.MEDIUM, eastDrive, bb.expandTowards(-15 / 16f, 0, 0), 160); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.SLOW, eastDrive.west(), bb.move(-2, 0, 0), 160); scene.idle(20); - scene.overlay.showText(80) + scene.overlay().showText(80) .text("Whenever the Powered Gearshift is not at the source, its speed will be halved instead") .attachKeyFrame() .placeNearTarget() .colored(PonderPalette.SLOW) - .pointAt(util.vector.blockSurface(eastDrive.west(2), Direction.WEST)); + .pointAt(util.vector().blockSurface(eastDrive.west(2), Direction.WEST)); scene.idle(80); for (BlockPos gauge : new BlockPos[] { eastGauge, middleGauge, westGauge }) { scene.idle(5); - scene.overlay.showText(180) + scene.overlay().showText(180) .sharedText(gauge == westGauge ? "rpm8" : gauge == eastGauge ? "rpm16_source" : "rpm16") .colored(gauge == westGauge ? PonderPalette.SLOW : PonderPalette.MEDIUM) .placeNearTarget() - .pointAt(util.vector.blockSurface(gauge, Direction.NORTH)); + .pointAt(util.vector().blockSurface(gauge, Direction.NORTH)); } scene.idle(80); - scene.overlay.showText(100) + scene.overlay().showText(100) .text("In both cases, Chain Drives in the row always run at 2x the speed of the Powered Gearshift") .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.blockSurface(eastDrive.west(2), Direction.WEST)); + .pointAt(util.vector().blockSurface(eastDrive.west(2), Direction.WEST)); scene.idle(100); - scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.south(2))); - scene.world.toggleRedstonePower(util.select.position(1, 1, 4)); - scene.world.modifyKineticSpeed(util.select.position(westGauge), f -> 2f * f); - scene.world.hideIndependentSection(lever, Direction.UP); + scene.world().toggleRedstonePower(util.select().fromTo(leverPos, leverPos.south(2))); + scene.world().toggleRedstonePower(util.select().position(1, 1, 4)); + scene.world().modifyKineticSpeed(util.select().position(westGauge), f -> 2f * f); + scene.world().hideIndependentSection(lever, Direction.UP); scene.idle(15); - scene.world.showSection(util.select.fromTo(analogPos, analogPos.south()), Direction.DOWN); + scene.world().showSection(util.select().fromTo(analogPos, analogPos.south()), Direction.DOWN); scene.idle(15); - scene.world.modifyBlockEntityNBT(util.select.position(analogPos), AnalogLeverBlockEntity.class, nbt -> { + scene.world().modifyBlockEntityNBT(util.select().position(analogPos), AnalogLeverBlockEntity.class, nbt -> { nbt.putInt("State", 8); }); - scene.world.modifyBlock(analogPos.south(), s -> s.setValue(RedStoneWireBlock.POWER, 8), false); - scene.world.toggleRedstonePower(util.select.position(1, 1, 4)); - scene.world.modifyKineticSpeed(util.select.position(westGauge), f -> .75f * f); - scene.effects.indicateRedstone(analogPos); + scene.world().modifyBlock(analogPos.south(), s -> s.setValue(RedStoneWireBlock.POWER, 8), false); + scene.world().toggleRedstonePower(util.select().position(1, 1, 4)); + scene.world().modifyKineticSpeed(util.select().position(westGauge), f -> .75f * f); + scene.effects().indicateRedstone(analogPos); scene.idle(20); - scene.overlay.showText(100) + scene.overlay().showText(100) .text("Using analog signals, the ratio can be adjusted more precisely between 1 and 2") .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.blockSurface(eastDrive.west(2), Direction.WEST)); + .pointAt(util.vector().blockSurface(eastDrive.west(2), Direction.WEST)); scene.idle(40); for (BlockPos gauge : new BlockPos[] { eastGauge, middleGauge, westGauge }) { scene.idle(5); - Builder textBuilder = scene.overlay.showText(180) + Builder textBuilder = scene.overlay().showText(180) .colored(gauge == westGauge ? PonderPalette.SLOW : PonderPalette.MEDIUM) .placeNearTarget() - .pointAt(util.vector.blockSurface(gauge, Direction.NORTH)); + .pointAt(util.vector().blockSurface(gauge, Direction.NORTH)); if (gauge == westGauge) textBuilder.text("12 RPM"); else diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ChassisScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ChassisScenes.java index fd572be4b2..8678761706 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ChassisScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ChassisScenes.java @@ -8,10 +8,10 @@ import com.simibubi.create.content.contraptions.chassis.RadialChassisBlock; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; import net.createmod.ponder.foundation.ElementLink; import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.SceneBuilder; -import net.createmod.ponder.foundation.SceneBuildingUtil; import net.createmod.ponder.foundation.Selection; import net.createmod.ponder.foundation.element.InputWindowElement; import net.createmod.ponder.foundation.element.WorldSectionElement; @@ -29,65 +29,65 @@ public class ChassisScenes { CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("linear_chassis_group", "Moving Linear Chassis in groups"); scene.configureBasePlate(0, 0, 5); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); scene.idle(5); - scene.world.showSection(util.select.layer(1), Direction.DOWN); + scene.world().showSection(util.select().layer(1), Direction.DOWN); scene.idle(10); - BlockPos centralChassis = util.grid.at(2, 2, 2); + BlockPos centralChassis = util.grid().at(2, 2, 2); ElementLink chassis = - scene.world.showIndependentSection(util.select.position(centralChassis), Direction.DOWN); + scene.world().showIndependentSection(util.select().position(centralChassis), Direction.DOWN); scene.idle(10); - scene.world.showSectionAndMerge(util.select.position(centralChassis.west()), Direction.EAST, chassis); + scene.world().showSectionAndMerge(util.select().position(centralChassis.west()), Direction.EAST, chassis); scene.idle(5); - scene.world.showSectionAndMerge(util.select.position(centralChassis.east()), Direction.WEST, chassis); + scene.world().showSectionAndMerge(util.select().position(centralChassis.east()), Direction.WEST, chassis); scene.idle(4); - scene.world.showSectionAndMerge(util.select.position(centralChassis.east() + scene.world().showSectionAndMerge(util.select().position(centralChassis.east() .north()), Direction.SOUTH, chassis); scene.idle(3); - scene.world.showSectionAndMerge(util.select.position(centralChassis.above()), Direction.DOWN, chassis); + scene.world().showSectionAndMerge(util.select().position(centralChassis.above()), Direction.DOWN, chassis); scene.idle(2); - scene.world.showSectionAndMerge(util.select.position(centralChassis.above() + scene.world().showSectionAndMerge(util.select().position(centralChassis.above() .east()), Direction.DOWN, chassis); scene.idle(10); - scene.overlay.showText(80) + scene.overlay().showText(80) .attachKeyFrame() .placeNearTarget() .text("Linear Chassis connect to identical Chassis blocks next to them") - .pointAt(util.vector.topOf(util.grid.at(2, 3, 2))); + .pointAt(util.vector().topOf(util.grid().at(2, 3, 2))); scene.idle(90); - BlockPos bearingPos = util.grid.at(2, 1, 2); - scene.world.moveSection(chassis, util.vector.of(0, -1 / 1024f, 0), 0); - scene.world.configureCenterOfRotation(chassis, util.vector.centerOf(bearingPos)); - scene.world.rotateBearing(bearingPos, 360, 80); - scene.world.rotateSection(chassis, 0, 360, 0, 80); + BlockPos bearingPos = util.grid().at(2, 1, 2); + scene.world().moveSection(chassis, util.vector().of(0, -1 / 1024f, 0), 0); + scene.world().configureCenterOfRotation(chassis, util.vector().centerOf(bearingPos)); + scene.world().rotateBearing(bearingPos, 360, 80); + scene.world().rotateSection(chassis, 0, 360, 0, 80); scene.idle(20); - scene.overlay.showText(80) + scene.overlay().showText(80) .placeNearTarget() .text("When one is moved by a Contraption, the others are dragged with it") - .pointAt(util.vector.topOf(util.grid.at(2, 3, 2))); + .pointAt(util.vector().topOf(util.grid().at(2, 3, 2))); scene.idle(90); - Selection wrong1 = util.select.position(2, 4, 2); - Selection wrong2 = util.select.position(0, 2, 2); + Selection wrong1 = util.select().position(2, 4, 2); + Selection wrong2 = util.select().position(0, 2, 2); scene.addKeyframe(); - scene.world.showSection(wrong2, Direction.EAST); + scene.world().showSection(wrong2, Direction.EAST); scene.idle(10); - scene.world.showSection(wrong1, Direction.DOWN); + scene.world().showSection(wrong1, Direction.DOWN); scene.idle(10); - scene.overlay.showOutline(PonderPalette.RED, wrong2, wrong2, 80); - scene.overlay.showSelectionWithText(wrong1, 80) + scene.overlay().showOutline(PonderPalette.RED, wrong2, wrong2, 80); + scene.overlay().showSelectionWithText(wrong1, 80) .colored(PonderPalette.RED) .placeNearTarget() .text("Chassis of a different type or facing another direction will not attach"); scene.idle(40); - scene.world.rotateBearing(bearingPos, 360, 80); - scene.world.rotateSection(chassis, 0, 360, 0, 80); + scene.world().rotateBearing(bearingPos, 360, 80); + scene.world().rotateSection(chassis, 0, 360, 0, 80); scene.idle(50); } @@ -96,202 +96,202 @@ public class ChassisScenes { scene.title("linear_chassis_attachment", "Attaching blocks using Linear Chassis"); scene.configureBasePlate(0, 0, 5); scene.setSceneOffsetY(-1); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); scene.idle(5); - BlockPos chassisPos = util.grid.at(2, 2, 2); - Selection chassis = util.select.position(chassisPos); + BlockPos chassisPos = util.grid().at(2, 2, 2); + Selection chassis = util.select().position(chassisPos); - scene.world.showSection(util.select.layer(1), Direction.DOWN); - scene.world.showSection(chassis, Direction.DOWN); + scene.world().showSection(util.select().layer(1), Direction.DOWN); + scene.world().showSection(chassis, Direction.DOWN); scene.idle(10); InputWindowElement input = - new InputWindowElement(util.vector.blockSurface(chassisPos, Direction.WEST), Pointing.LEFT).rightClick() + new InputWindowElement(util.vector().blockSurface(chassisPos, Direction.WEST), Pointing.LEFT).rightClick() .withItem(new ItemStack(Items.SLIME_BALL)); - scene.overlay.showControls(input, 30); + scene.overlay().showControls(input, 30); scene.idle(7); - scene.world.modifyBlock(chassisPos, s -> s.setValue(LinearChassisBlock.STICKY_BOTTOM, true), false); - scene.effects.superGlue(chassisPos, Direction.WEST, false); + scene.world().modifyBlock(chassisPos, s -> s.setValue(LinearChassisBlock.STICKY_BOTTOM, true), false); + scene.effects().superGlue(chassisPos, Direction.WEST, false); scene.idle(30); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("The open faces of a Linear Chassis can be made Sticky") .placeNearTarget() - .pointAt(util.vector.blockSurface(chassisPos, Direction.WEST)); + .pointAt(util.vector().blockSurface(chassisPos, Direction.WEST)); scene.idle(70); - scene.overlay.showControls(input, 15); + scene.overlay().showControls(input, 15); scene.idle(7); - scene.world.modifyBlock(chassisPos, s -> s.setValue(LinearChassisBlock.STICKY_TOP, true), false); - scene.effects.superGlue(chassisPos, Direction.EAST, false); + scene.world().modifyBlock(chassisPos, s -> s.setValue(LinearChassisBlock.STICKY_TOP, true), false); + scene.effects().superGlue(chassisPos, Direction.EAST, false); scene.idle(15); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("Click again to make the opposite side sticky") .placeNearTarget() - .pointAt(util.vector.topOf(chassisPos)); + .pointAt(util.vector().topOf(chassisPos)); scene.idle(10); scene.rotateCameraY(60); scene.idle(35); scene.rotateCameraY(-60); scene.idle(25); - scene.overlay.showControls( - new InputWindowElement(util.vector.blockSurface(chassisPos, Direction.WEST), Pointing.LEFT).rightClick() + scene.overlay().showControls( + new InputWindowElement(util.vector().blockSurface(chassisPos, Direction.WEST), Pointing.LEFT).rightClick() .whileSneaking(), 30); scene.idle(7); - scene.world.modifyBlock(chassisPos, s -> s.setValue(LinearChassisBlock.STICKY_BOTTOM, false), false); - scene.effects.superGlue(chassisPos, Direction.WEST, false); + scene.world().modifyBlock(chassisPos, s -> s.setValue(LinearChassisBlock.STICKY_BOTTOM, false), false); + scene.effects().superGlue(chassisPos, Direction.WEST, false); scene.idle(30); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("Sneak and Right-Click with an empty hand to remove the slime") .placeNearTarget() - .pointAt(util.vector.blockSurface(chassisPos, Direction.WEST)); + .pointAt(util.vector().blockSurface(chassisPos, Direction.WEST)); scene.idle(70); - scene.world.hideSection(chassis, Direction.UP); + scene.world().hideSection(chassis, Direction.UP); scene.idle(20); ElementLink glassSection = - scene.world.showIndependentSection(util.select.position(chassisPos.above()), Direction.DOWN); - scene.world.moveSection(glassSection, util.vector.of(0, -1, 0), 0); + scene.world().showIndependentSection(util.select().position(chassisPos.above()), Direction.DOWN); + scene.world().moveSection(glassSection, util.vector().of(0, -1, 0), 0); scene.idle(25); scene.addKeyframe(); - scene.world.showSectionAndMerge(util.select.fromTo(2, 4, 2, 2, 5, 2), Direction.DOWN, glassSection); + scene.world().showSectionAndMerge(util.select().fromTo(2, 4, 2, 2, 5, 2), Direction.DOWN, glassSection); ElementLink topGlassSection = - scene.world.showIndependentSection(util.select.position(2, 6, 2), Direction.DOWN); - scene.world.moveSection(topGlassSection, util.vector.of(0, -1, 0), 0); + scene.world().showIndependentSection(util.select().position(2, 6, 2), Direction.DOWN); + scene.world().moveSection(topGlassSection, util.vector().of(0, -1, 0), 0); scene.idle(30); - Selection column1 = util.select.fromTo(2, 3, 2, 2, 3, 2); - Selection column2 = util.select.fromTo(2, 3, 2, 2, 4, 2); - Selection column3 = util.select.fromTo(2, 3, 2, 2, 5, 2); + Selection column1 = util.select().fromTo(2, 3, 2, 2, 3, 2); + Selection column2 = util.select().fromTo(2, 3, 2, 2, 4, 2); + Selection column3 = util.select().fromTo(2, 3, 2, 2, 5, 2); - scene.overlay.showSelectionWithText(column3, 80) + scene.overlay().showSelectionWithText(column3, 80) .colored(PonderPalette.GREEN) .text("Stickied faces of the Linear Chassis will attach a line of blocks in front of it") .placeNearTarget(); scene.idle(90); - BlockPos bearingPos = util.grid.at(2, 1, 2); - scene.world.configureCenterOfRotation(glassSection, util.vector.centerOf(bearingPos)); - scene.world.rotateBearing(bearingPos, 180, 40); - scene.world.rotateSection(glassSection, 0, 180, 0, 40); - scene.world.rotateSection(topGlassSection, 0, 180, 0, 40); + BlockPos bearingPos = util.grid().at(2, 1, 2); + scene.world().configureCenterOfRotation(glassSection, util.vector().centerOf(bearingPos)); + scene.world().rotateBearing(bearingPos, 180, 40); + scene.world().rotateSection(glassSection, 0, 180, 0, 40); + scene.world().rotateSection(topGlassSection, 0, 180, 0, 40); scene.idle(50); - Vec3 blockSurface = util.vector.blockSurface(chassisPos, Direction.NORTH); - scene.overlay.showCenteredScrollInput(chassisPos, Direction.NORTH, 50); - scene.overlay.showControls(new InputWindowElement(blockSurface, Pointing.UP).rightClick() + Vec3 blockSurface = util.vector().blockSurface(chassisPos, Direction.NORTH); + scene.overlay().showCenteredScrollInput(chassisPos, Direction.NORTH, 50); + scene.overlay().showControls(new InputWindowElement(blockSurface, Pointing.UP).rightClick() .withItem(AllItems.WRENCH.asStack()), 50); scene.idle(10); - scene.overlay.showOutline(PonderPalette.WHITE, chassis, column3, 20); + scene.overlay().showOutline(PonderPalette.WHITE, chassis, column3, 20); scene.idle(10); - scene.overlay.showOutline(PonderPalette.WHITE, chassis, column2, 20); + scene.overlay().showOutline(PonderPalette.WHITE, chassis, column2, 20); scene.idle(10); - scene.overlay.showOutline(PonderPalette.WHITE, chassis, column1, 20); + scene.overlay().showOutline(PonderPalette.WHITE, chassis, column1, 20); scene.idle(10); - scene.overlay.showOutline(PonderPalette.WHITE, chassis, column2, 15); + scene.overlay().showOutline(PonderPalette.WHITE, chassis, column2, 15); scene.idle(10); - scene.overlay.showText(60) + scene.overlay().showText(60) .pointAt(blockSurface) .text("Using a Wrench, a precise Range can be specified for this chassis") .placeNearTarget(); scene.idle(70); - scene.world.rotateBearing(bearingPos, 180, 40); - scene.world.rotateSection(glassSection, 0, 180, 0, 40); + scene.world().rotateBearing(bearingPos, 180, 40); + scene.world().rotateSection(glassSection, 0, 180, 0, 40); scene.idle(50); - scene.world.rotateSection(topGlassSection, 0, 180, 0, 0); - scene.world.showSectionAndMerge(util.select.position(1, 3, 2), Direction.UP, glassSection); - scene.world.showSectionAndMerge(util.select.position(3, 3, 2), Direction.UP, glassSection); - scene.world.showSectionAndMerge(util.select.fromTo(1, 4, 2, 1, 6, 2), Direction.DOWN, glassSection); - scene.world.showSectionAndMerge(util.select.fromTo(3, 4, 2, 3, 6, 2), Direction.DOWN, glassSection); + scene.world().rotateSection(topGlassSection, 0, 180, 0, 0); + scene.world().showSectionAndMerge(util.select().position(1, 3, 2), Direction.UP, glassSection); + scene.world().showSectionAndMerge(util.select().position(3, 3, 2), Direction.UP, glassSection); + scene.world().showSectionAndMerge(util.select().fromTo(1, 4, 2, 1, 6, 2), Direction.DOWN, glassSection); + scene.world().showSectionAndMerge(util.select().fromTo(3, 4, 2, 3, 6, 2), Direction.DOWN, glassSection); scene.addKeyframe(); scene.idle(20); - scene.overlay.showCenteredScrollInput(chassisPos, Direction.NORTH, 50); - scene.overlay.showControls(new InputWindowElement(blockSurface, Pointing.UP).whileCTRL() + scene.overlay().showCenteredScrollInput(chassisPos, Direction.NORTH, 50); + scene.overlay().showControls(new InputWindowElement(blockSurface, Pointing.UP).whileCTRL() .rightClick() .withItem(AllItems.WRENCH.asStack()), 50); - column1 = util.select.fromTo(1, 3, 2, 3, 3, 2); - column2 = util.select.fromTo(1, 3, 2, 3, 4, 2); - column3 = util.select.fromTo(1, 3, 2, 3, 5, 2); + column1 = util.select().fromTo(1, 3, 2, 3, 3, 2); + column2 = util.select().fromTo(1, 3, 2, 3, 4, 2); + column3 = util.select().fromTo(1, 3, 2, 3, 5, 2); scene.idle(10); - scene.overlay.showOutline(PonderPalette.WHITE, chassis, column2, 20); + scene.overlay().showOutline(PonderPalette.WHITE, chassis, column2, 20); scene.idle(10); - scene.overlay.showOutline(PonderPalette.WHITE, chassis, column1, 20); + scene.overlay().showOutline(PonderPalette.WHITE, chassis, column1, 20); scene.idle(10); - scene.overlay.showOutline(PonderPalette.WHITE, chassis, column2, 20); + scene.overlay().showOutline(PonderPalette.WHITE, chassis, column2, 20); scene.idle(10); - scene.overlay.showOutline(PonderPalette.WHITE, chassis, column3, 15); + scene.overlay().showOutline(PonderPalette.WHITE, chassis, column3, 15); scene.idle(10); - scene.overlay.showText(80) + scene.overlay().showText(80) .pointAt(blockSurface) .text("Holding CTRL adjusts the range of all connected Chassis Blocks") .placeNearTarget(); scene.idle(90); - scene.world.rotateBearing(bearingPos, 180, 40); - scene.world.rotateSection(glassSection, 0, 180, 0, 40); - scene.world.rotateSection(topGlassSection, 0, 180, 0, 40); + scene.world().rotateBearing(bearingPos, 180, 40); + scene.world().rotateSection(glassSection, 0, 180, 0, 40); + scene.world().rotateSection(topGlassSection, 0, 180, 0, 40); scene.idle(50); - Vec3 glueSurface = util.vector.blockSurface(chassisPos.west(), Direction.NORTH); - scene.overlay.showText(80) + Vec3 glueSurface = util.vector().blockSurface(chassisPos.west(), Direction.NORTH); + scene.overlay().showText(80) .attachKeyFrame() .pointAt(glueSurface) .text("Attaching blocks to any other side requires the use of Super Glue") .placeNearTarget(); scene.idle(90); - scene.overlay.showControls(new InputWindowElement(glueSurface, Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(glueSurface, Pointing.DOWN).rightClick() .withItem(AllItems.SUPER_GLUE.asStack()), 30); scene.idle(7); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, glueSurface, - new AABB(util.grid.at(1, 2, 2)).expandTowards(0, 0, -1), 40); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, glueSurface, + new AABB(util.grid().at(1, 2, 2)).expandTowards(0, 0, -1), 40); scene.idle(20); ElementLink gluedPlank = - scene.world.showIndependentSection(util.select.position(3, 3, 1), Direction.SOUTH); - scene.world.moveSection(gluedPlank, util.vector.of(-2, -1, 0), 0); + scene.world().showIndependentSection(util.select().position(3, 3, 1), Direction.SOUTH); + scene.world().moveSection(gluedPlank, util.vector().of(-2, -1, 0), 0); scene.idle(15); - scene.effects.superGlue(chassisPos.west(), Direction.NORTH, true); + scene.effects().superGlue(chassisPos.west(), Direction.NORTH, true); scene.idle(20); - scene.world.hideIndependentSection(glassSection, Direction.UP); - scene.world.hideIndependentSection(gluedPlank, Direction.UP); - scene.world.hideIndependentSection(topGlassSection, Direction.UP); + scene.world().hideIndependentSection(glassSection, Direction.UP); + scene.world().hideIndependentSection(gluedPlank, Direction.UP); + scene.world().hideIndependentSection(topGlassSection, Direction.UP); scene.idle(15); scene.addKeyframe(); ElementLink chain = - scene.world.showIndependentSection(util.select.position(2, 7, 2), Direction.DOWN); - scene.world.configureCenterOfRotation(chain, util.vector.centerOf(bearingPos)); - scene.world.moveSection(chain, util.vector.of(0, -5, 0), 0); + scene.world().showIndependentSection(util.select().position(2, 7, 2), Direction.DOWN); + scene.world().configureCenterOfRotation(chain, util.vector().centerOf(bearingPos)); + scene.world().moveSection(chain, util.vector().of(0, -5, 0), 0); scene.idle(10); - scene.world.showSectionAndMerge(util.select.fromTo(2, 8, 2, 3, 9, 2), Direction.DOWN, chain); + scene.world().showSectionAndMerge(util.select().fromTo(2, 8, 2, 3, 9, 2), Direction.DOWN, chain); scene.idle(10); - scene.world.showSectionAndMerge(util.select.fromTo(3, 9, 1, 3, 9, 0), Direction.SOUTH, chain); + scene.world().showSectionAndMerge(util.select().fromTo(3, 9, 1, 3, 9, 0), Direction.SOUTH, chain); scene.idle(10); - scene.world.showSectionAndMerge(util.select.fromTo(2, 9, 0, 1, 9, 0), Direction.EAST, chain); + scene.world().showSectionAndMerge(util.select().fromTo(2, 9, 0, 1, 9, 0), Direction.EAST, chain); scene.idle(20); - scene.overlay.showText(80) - .pointAt(util.vector.topOf(chassisPos.above(2))) + scene.overlay().showText(80) + .pointAt(util.vector().topOf(chassisPos.above(2))) .text("Using these mechanics, structures of any shape can move as a Contraption") .placeNearTarget(); scene.idle(30); - scene.world.rotateBearing(bearingPos, 720, 160); - scene.world.rotateSection(chain, 0, 720, 0, 160); + scene.world().rotateBearing(bearingPos, 720, 160); + scene.world().rotateSection(chain, 0, 720, 0, 160); } public static void radial(SceneBuilder builder, SceneBuildingUtil util) { @@ -299,123 +299,123 @@ public class ChassisScenes { scene.title("radial_chassis", "Attaching blocks using Radial Chassis"); scene.configureBasePlate(0, 0, 5); scene.setSceneOffsetY(-1); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); scene.idle(5); - util.select.position(2, 4, 2); + util.select().position(2, 4, 2); - BlockPos chassisPos = util.grid.at(2, 2, 2); - Selection chassis = util.select.position(chassisPos); + BlockPos chassisPos = util.grid().at(2, 2, 2); + Selection chassis = util.select().position(chassisPos); - scene.world.showSection(util.select.layer(1), Direction.DOWN); + scene.world().showSection(util.select().layer(1), Direction.DOWN); scene.idle(10); - ElementLink contraption = scene.world.showIndependentSection(chassis, Direction.DOWN); + ElementLink contraption = scene.world().showIndependentSection(chassis, Direction.DOWN); scene.idle(5); ElementLink top = - scene.world.showIndependentSection(util.select.position(chassisPos.above()), Direction.DOWN); + scene.world().showIndependentSection(util.select().position(chassisPos.above()), Direction.DOWN); scene.idle(10); - scene.overlay.showText(50) + scene.overlay().showText(50) .attachKeyFrame() .placeNearTarget() .text("Radial Chassis connect to identical Chassis blocks in a row") - .pointAt(util.vector.topOf(chassisPos.above())); + .pointAt(util.vector().topOf(chassisPos.above())); scene.idle(60); - BlockPos bearingPos = util.grid.at(2, 1, 2); - scene.world.moveSection(contraption, util.vector.of(0, -1 / 1024f, 0), 0); - scene.world.configureCenterOfRotation(contraption, util.vector.centerOf(bearingPos)); - scene.world.rotateBearing(bearingPos, 360, 80); - scene.world.rotateSection(contraption, 0, 360, 0, 80); - scene.world.rotateSection(top, 0, 360, 0, 80); + BlockPos bearingPos = util.grid().at(2, 1, 2); + scene.world().moveSection(contraption, util.vector().of(0, -1 / 1024f, 0), 0); + scene.world().configureCenterOfRotation(contraption, util.vector().centerOf(bearingPos)); + scene.world().rotateBearing(bearingPos, 360, 80); + scene.world().rotateSection(contraption, 0, 360, 0, 80); + scene.world().rotateSection(top, 0, 360, 0, 80); scene.idle(20); - scene.overlay.showText(70) + scene.overlay().showText(70) .placeNearTarget() .text("When one is moved by a Contraption, the others are dragged with it") - .pointAt(util.vector.topOf(util.grid.at(2, 3, 2))); + .pointAt(util.vector().topOf(util.grid().at(2, 3, 2))); scene.idle(80); - scene.world.hideIndependentSection(top, Direction.UP); + scene.world().hideIndependentSection(top, Direction.UP); scene.idle(15); scene.addKeyframe(); InputWindowElement input = - new InputWindowElement(util.vector.blockSurface(chassisPos, Direction.WEST), Pointing.LEFT).rightClick() + new InputWindowElement(util.vector().blockSurface(chassisPos, Direction.WEST), Pointing.LEFT).rightClick() .withItem(new ItemStack(Items.SLIME_BALL)); - scene.overlay.showControls(input, 30); + scene.overlay().showControls(input, 30); scene.idle(7); - scene.world.modifyBlock(chassisPos, s -> s.setValue(RadialChassisBlock.STICKY_WEST, true), false); - scene.effects.superGlue(chassisPos, Direction.WEST, false); + scene.world().modifyBlock(chassisPos, s -> s.setValue(RadialChassisBlock.STICKY_WEST, true), false); + scene.effects().superGlue(chassisPos, Direction.WEST, false); scene.idle(30); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("The side faces of a Radial Chassis can be made Sticky") .placeNearTarget() - .pointAt(util.vector.blockSurface(chassisPos, Direction.WEST)); + .pointAt(util.vector().blockSurface(chassisPos, Direction.WEST)); scene.idle(70); - scene.overlay.showControls(input, 15); + scene.overlay().showControls(input, 15); scene.idle(7); - scene.world.modifyBlock(chassisPos, s -> s.setValue(RadialChassisBlock.STICKY_EAST, true) + scene.world().modifyBlock(chassisPos, s -> s.setValue(RadialChassisBlock.STICKY_EAST, true) .setValue(RadialChassisBlock.STICKY_NORTH, true) .setValue(RadialChassisBlock.STICKY_SOUTH, true), false); - scene.effects.superGlue(chassisPos, Direction.EAST, false); - scene.effects.superGlue(chassisPos, Direction.SOUTH, false); - scene.effects.superGlue(chassisPos, Direction.NORTH, false); + scene.effects().superGlue(chassisPos, Direction.EAST, false); + scene.effects().superGlue(chassisPos, Direction.SOUTH, false); + scene.effects().superGlue(chassisPos, Direction.NORTH, false); scene.idle(15); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("Click again to make all other sides sticky") .placeNearTarget() - .pointAt(util.vector.topOf(chassisPos)); + .pointAt(util.vector().topOf(chassisPos)); scene.idle(10); scene.rotateCameraY(60); scene.idle(35); scene.rotateCameraY(-60); scene.idle(25); - scene.overlay.showControls( - new InputWindowElement(util.vector.blockSurface(chassisPos, Direction.WEST), Pointing.LEFT).rightClick() + scene.overlay().showControls( + new InputWindowElement(util.vector().blockSurface(chassisPos, Direction.WEST), Pointing.LEFT).rightClick() .whileSneaking(), 30); scene.idle(7); - scene.world.modifyBlock(chassisPos, s -> s.setValue(RadialChassisBlock.STICKY_WEST, false), false); - scene.effects.superGlue(chassisPos, Direction.WEST, false); + scene.world().modifyBlock(chassisPos, s -> s.setValue(RadialChassisBlock.STICKY_WEST, false), false); + scene.effects().superGlue(chassisPos, Direction.WEST, false); scene.idle(30); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("Sneak and Right-Click with an empty hand to remove the slime") .placeNearTarget() - .pointAt(util.vector.blockSurface(chassisPos, Direction.WEST)); + .pointAt(util.vector().blockSurface(chassisPos, Direction.WEST)); scene.idle(70); - Selection s = util.select.position(chassisPos.north()); + Selection s = util.select().position(chassisPos.north()); Selection growing = s.copy(); - Selection r1 = util.select.fromTo(1, 2, 1, 3, 2, 3) + Selection r1 = util.select().fromTo(1, 2, 1, 3, 2, 3) .substract(chassis); Selection r2 = r1.copy() - .add(util.select.fromTo(0, 2, 1, 0, 2, 3)) - .add(util.select.fromTo(1, 2, 0, 3, 2, 0)) - .add(util.select.fromTo(1, 2, 4, 3, 2, 4)) - .add(util.select.fromTo(4, 2, 1, 4, 2, 3)); - Selection r3 = util.select.layer(2) - .add(util.select.fromTo(-1, 2, 1, 5, 2, 3)) - .add(util.select.fromTo(1, 2, -1, 3, 2, 5)) + .add(util.select().fromTo(0, 2, 1, 0, 2, 3)) + .add(util.select().fromTo(1, 2, 0, 3, 2, 0)) + .add(util.select().fromTo(1, 2, 4, 3, 2, 4)) + .add(util.select().fromTo(4, 2, 1, 4, 2, 3)); + Selection r3 = util.select().layer(2) + .add(util.select().fromTo(-1, 2, 1, 5, 2, 3)) + .add(util.select().fromTo(1, 2, -1, 3, 2, 5)) .substract(chassis); scene.addKeyframe(); - scene.world.showSectionAndMerge(r1, Direction.DOWN, contraption); - ElementLink outer = scene.world.showIndependentSection(util.select.layer(2) + scene.world().showSectionAndMerge(r1, Direction.DOWN, contraption); + ElementLink outer = scene.world().showIndependentSection(util.select().layer(2) .substract(chassis) .substract(r1), Direction.DOWN); - scene.world.showSection(util.select.fromTo(0, 3, 3, 1, 3, 4), Direction.DOWN); + scene.world().showSection(util.select().fromTo(0, 3, 3, 1, 3, 4), Direction.DOWN); scene.idle(10); - Vec3 blockSurface = util.vector.blockSurface(chassisPos, Direction.NORTH); + Vec3 blockSurface = util.vector().blockSurface(chassisPos, Direction.NORTH); AABB bb = new AABB(blockSurface, blockSurface).inflate(.501, .501, 0); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, bb, bb, 60); - scene.overlay.showOutline(PonderPalette.WHITE, s, s, 80); - scene.overlay.showText(40) + scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, bb, bb, 60); + scene.overlay().showOutline(PonderPalette.WHITE, s, s, 80); + scene.overlay().showText(40) .text("Whenever a Block is next to a sticky face...") .placeNearTarget() .pointAt(blockSurface.add(0, .5, 0)); @@ -426,63 +426,63 @@ public class ChassisScenes { scene.idle(1); Selection add = obj.getValue() .copy() - .add(util.select.position(pos)); - scene.overlay.showOutline(PonderPalette.WHITE, s, add, 3); + .add(util.select().position(pos)); + scene.overlay().showOutline(PonderPalette.WHITE, s, add, 3); obj.setValue(add); }); - scene.overlay.showSelectionWithText(obj.getValue(), 60) + scene.overlay().showSelectionWithText(obj.getValue(), 60) .colored(PonderPalette.GREEN) .text("...it will attach all reachable blocks within a radius on that layer"); scene.idle(70); - scene.world.configureCenterOfRotation(outer, util.vector.centerOf(bearingPos)); - scene.world.rotateBearing(bearingPos, 360, 80); - scene.world.rotateSection(contraption, 0, 360, 0, 80); - scene.world.rotateSection(outer, 0, 360, 0, 80); + scene.world().configureCenterOfRotation(outer, util.vector().centerOf(bearingPos)); + scene.world().rotateBearing(bearingPos, 360, 80); + scene.world().rotateSection(contraption, 0, 360, 0, 80); + scene.world().rotateSection(outer, 0, 360, 0, 80); scene.idle(90); scene.addKeyframe(); - blockSurface = util.vector.topOf(chassisPos); - scene.overlay.showCenteredScrollInput(chassisPos, Direction.UP, 50); - scene.overlay.showControls(new InputWindowElement(blockSurface, Pointing.DOWN).rightClick() + blockSurface = util.vector().topOf(chassisPos); + scene.overlay().showCenteredScrollInput(chassisPos, Direction.UP, 50); + scene.overlay().showControls(new InputWindowElement(blockSurface, Pointing.DOWN).rightClick() .withItem(AllItems.WRENCH.asStack()), 50); scene.idle(10); - scene.overlay.showOutline(PonderPalette.WHITE, chassis, r2, 20); + scene.overlay().showOutline(PonderPalette.WHITE, chassis, r2, 20); scene.idle(10); - scene.overlay.showOutline(PonderPalette.WHITE, chassis, r3, 20); + scene.overlay().showOutline(PonderPalette.WHITE, chassis, r3, 20); scene.idle(10); - scene.overlay.showOutline(PonderPalette.WHITE, chassis, r2, 20); + scene.overlay().showOutline(PonderPalette.WHITE, chassis, r2, 20); scene.idle(10); - scene.overlay.showOutline(PonderPalette.WHITE, chassis, r1, 15); + scene.overlay().showOutline(PonderPalette.WHITE, chassis, r1, 15); scene.idle(10); - scene.overlay.showText(60) + scene.overlay().showText(60) .pointAt(blockSurface) .text("Using a Wrench, a precise Radius can be specified for this chassis") .placeNearTarget(); scene.idle(70); - scene.world.rotateBearing(bearingPos, 360, 80); - scene.world.rotateSection(contraption, 0, 360, 0, 80); + scene.world().rotateBearing(bearingPos, 360, 80); + scene.world().rotateSection(contraption, 0, 360, 0, 80); scene.idle(90); - scene.world.destroyBlock(util.grid.at(1, 2, 0)); + scene.world().destroyBlock(util.grid().at(1, 2, 0)); scene.idle(1); - scene.world.destroyBlock(util.grid.at(1, 2, 1)); + scene.world().destroyBlock(util.grid().at(1, 2, 1)); scene.idle(1); - scene.world.destroyBlock(util.grid.at(1, 2, 3)); + scene.world().destroyBlock(util.grid().at(1, 2, 3)); scene.idle(1); - scene.world.destroyBlock(util.grid.at(1, 2, 4)); + scene.world().destroyBlock(util.grid().at(1, 2, 4)); scene.idle(10); - Selection ignored = util.select.fromTo(0, 2, 1, 0, 2, 3) - .add(util.select.position(1, 2, 2)); - scene.overlay.showOutline(PonderPalette.GREEN, r2, r2.copy() - .substract(util.select.fromTo(0, 2, 0, 1, 2, 4)), 80); + Selection ignored = util.select().fromTo(0, 2, 1, 0, 2, 3) + .add(util.select().position(1, 2, 2)); + scene.overlay().showOutline(PonderPalette.GREEN, r2, r2.copy() + .substract(util.select().fromTo(0, 2, 0, 1, 2, 4)), 80); scene.markAsFinished(); - scene.overlay.showSelectionWithText(ignored, 80) + scene.overlay().showSelectionWithText(ignored, 80) .colored(PonderPalette.RED) .text("Blocks not reachable by any sticky face will not attach"); } @@ -495,163 +495,164 @@ public class ChassisScenes { scene.setSceneOffsetY(-1); scene.idle(15); - Selection slab = util.select.fromTo(0, 2, 2, 1, 2, 2); - Selection pulley = util.select.fromTo(2, 2, 2, 2, 4, 2); - BlockPos pulleyPos = util.grid.at(2, 4, 2); - Selection kinetics = util.select.fromTo(1, 4, 2, 2, 4, 2); - BlockPos crankPos = util.grid.at(1, 4, 2); - Selection torch = util.select.position(1, 2, 3); - Selection harvester = util.select.position(3, 2, 3); - Selection lever = util.select.position(1, 1, 1); + Selection slab = util.select().fromTo(0, 2, 2, 1, 2, 2); + Selection pulley = util.select().fromTo(2, 2, 2, 2, 4, 2); + BlockPos pulleyPos = util.grid().at(2, 4, 2); + Selection kinetics = util.select().fromTo(1, 4, 2, 2, 4, 2); + BlockPos crankPos = util.grid().at(1, 4, 2); + Selection torch = util.select().position(1, 2, 3); + Selection harvester = util.select().position(3, 2, 3); + Selection lever = util.select().position(1, 1, 1); - scene.world.setBlocks(util.select.fromTo(2, 2, 2, 2, 3, 2), Blocks.AIR.defaultBlockState(), false); + scene.world().setBlocks(util.select().fromTo(2, 2, 2, 2, 3, 2), Blocks.AIR.defaultBlockState(), false); - scene.world.showSection(util.select.fromTo(1, 1, 2, 2, 1, 2), Direction.DOWN); - scene.world.showSection(util.select.fromTo(2, 2, 3, 2, 1, 3), Direction.DOWN); + scene.world().showSection(util.select().fromTo(1, 1, 2, 2, 1, 2), Direction.DOWN); + scene.world().showSection(util.select().fromTo(2, 2, 3, 2, 1, 3), Direction.DOWN); scene.idle(5); - scene.world.showSection(util.select.fromTo(4, 1, 2, 3, 1, 2), Direction.WEST); + scene.world().showSection(util.select().fromTo(4, 1, 2, 3, 1, 2), Direction.WEST); scene.idle(20); - scene.overlay.showText(80) + scene.overlay().showText(80) .text("Super Glue groups blocks together into moving contraptions") .placeNearTarget() .attachKeyFrame() - .pointAt(util.vector.topOf(util.grid.at(2, 1, 2))); + .pointAt(util.vector().topOf(util.grid().at(2, 1, 2))); scene.idle(70); - scene.overlay.showControls( - new InputWindowElement(util.vector.topOf(2, 2, 3), Pointing.DOWN).withItem(AllItems.SUPER_GLUE.asStack()) + scene.overlay().showControls( + new InputWindowElement(util.vector().topOf(2, 2, 3), Pointing.DOWN).withItem(AllItems.SUPER_GLUE.asStack()) .rightClick(), 40); scene.idle(6); - scene.effects.indicateSuccess(util.grid.at(2, 2, 3)); + scene.effects().indicateSuccess(util.grid().at(2, 2, 3)); scene.idle(45); - scene.overlay.showControls( - new InputWindowElement(util.vector.blockSurface(util.grid.at(1, 1, 2), Direction.DOWN), Pointing.UP) + scene.overlay().showControls( + new InputWindowElement(util.vector().blockSurface(util.grid().at(1, 1, 2), Direction.DOWN), Pointing.UP) .withItem(AllItems.SUPER_GLUE.asStack()) .rightClick(), 40); scene.idle(6); - AABB bb = new AABB(util.grid.at(2, 2, 3)); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, lever, bb, 1); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, lever, bb.expandTowards(-1, -1, -1), 285); + AABB bb = new AABB(util.grid().at(2, 2, 3)); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, lever, bb, 1); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, lever, bb.expandTowards(-1, -1, -1), 285); scene.idle(25); - scene.overlay.showText(70) + scene.overlay().showText(70) .text("Clicking two endpoints creates a new 'glued' area") .placeNearTarget() .colored(PonderPalette.GREEN) .attachKeyFrame() - .pointAt(util.vector.blockSurface(util.grid.at(1, 1, 2), Direction.WEST)); + .pointAt(util.vector().blockSurface(util.grid().at(1, 1, 2), Direction.WEST)); scene.idle(80); - bb = new AABB(util.grid.at(3, 1, 3)); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, crankPos, bb, 1); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, crankPos, bb.expandTowards(0, 0, -2), 66); + bb = new AABB(util.grid().at(3, 1, 3)); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, crankPos, bb, 1); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, crankPos, bb.expandTowards(0, 0, -2), 66); scene.idle(20); - scene.overlay.showText(70) + scene.overlay().showText(70) .text("To remove a box, punch it with the glue item in hand") .placeNearTarget() .attachKeyFrame() - .pointAt(util.vector.blockSurface(util.grid.at(3, 1, 1), Direction.WEST)); + .pointAt(util.vector().blockSurface(util.grid().at(3, 1, 1), Direction.WEST)); scene.idle(40); - scene.overlay.showControls( - new InputWindowElement(util.vector.blockSurface(util.grid.at(3, 1, 1), Direction.UP), Pointing.DOWN) + scene.overlay().showControls( + new InputWindowElement(util.vector().blockSurface(util.grid().at(3, 1, 1), Direction.UP), Pointing.DOWN) .withItem(AllItems.SUPER_GLUE.asStack()) .leftClick(), 40); scene.idle(50); - Selection toMove = util.select.fromTo(1, 1, 2, 2, 1, 2) - .add(util.select.fromTo(2, 2, 3, 2, 1, 3)); - scene.overlay.showSelectionWithText(toMove, 70) + Selection toMove = util.select().fromTo(1, 1, 2, 2, 1, 2) + .add(util.select().fromTo(2, 2, 3, 2, 1, 3)); + scene.overlay().showSelectionWithText(toMove, 70) .text("Adjacent blocks sharing an area will pull each other along") .placeNearTarget() .attachKeyFrame() - .pointAt(util.vector.blockSurface(util.grid.at(1, 1, 2), Direction.WEST)); + .pointAt(util.vector().blockSurface(util.grid().at(1, 1, 2), Direction.WEST)); scene.idle(50); - scene.world.showSection(pulley, Direction.DOWN); + scene.world().showSection(pulley, Direction.DOWN); scene.idle(10); - scene.world.showSection(util.select.position(crankPos), Direction.EAST); + scene.world().showSection(util.select().position(crankPos), Direction.EAST); scene.idle(20); - scene.world.movePulley(pulleyPos, -1, 20); - scene.world.setKineticSpeed(kinetics, -24); - ElementLink contraption = scene.world.makeSectionIndependent(toMove); - scene.world.moveSection(contraption, util.vector.of(0, 1, 0), 20); + scene.world().movePulley(pulleyPos, -1, 20); + scene.world().setKineticSpeed(kinetics, -24); + ElementLink contraption = scene.world().makeSectionIndependent(toMove); + scene.world().moveSection(contraption, util.vector().of(0, 1, 0), 20); scene.idle(20); - scene.world.setKineticSpeed(kinetics, 0); + scene.world().setKineticSpeed(kinetics, 0); scene.idle(10); - scene.world.movePulley(pulleyPos, 1, 20); - scene.world.setKineticSpeed(kinetics, 24); - scene.world.moveSection(contraption, util.vector.of(0, -1, 0), 20); + scene.world().movePulley(pulleyPos, 1, 20); + scene.world().setKineticSpeed(kinetics, 24); + scene.world().moveSection(contraption, util.vector().of(0, -1, 0), 20); scene.idle(20); - scene.world.setKineticSpeed(kinetics, 0); + scene.world().setKineticSpeed(kinetics, 0); scene.idle(10); - bb = new AABB(util.grid.at(2, 2, 3)); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, "0", bb.expandTowards(-1, -1, -1), 70); + bb = new AABB(util.grid().at(2, 2, 3)); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, "0", bb.expandTowards(-1, -1, -1), 70); scene.idle(15); - scene.world.showSection(slab, Direction.DOWN); - bb = new AABB(util.grid.at(2, 1, 2)); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, "1", bb, 1); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, "1", bb.expandTowards(2, 0, 0), 55); + scene.world().showSection(slab, Direction.DOWN); + bb = new AABB(util.grid().at(2, 1, 2)); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, "1", bb, 1); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, "1", bb.expandTowards(2, 0, 0), 55); scene.idle(15); - bb = new AABB(util.grid.at(1, 2, 2)); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, "2", bb, 1); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, "2", bb.expandTowards(-1, 0, 0), 40); + bb = new AABB(util.grid().at(1, 2, 2)); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, "2", bb, 1); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, "2", bb.expandTowards(-1, 0, 0), 40); - scene.overlay.showText(70) + scene.overlay().showText(70) .text("Overlapping glue volumes will move together") .placeNearTarget() .colored(PonderPalette.GREEN) .attachKeyFrame() - .pointAt(util.vector.blockSurface(util.grid.at(0, 2, 2), Direction.WEST)); + .pointAt(util.vector().blockSurface(util.grid().at(0, 2, 2), Direction.WEST)); scene.idle(40); - ElementLink cogs = scene.world.makeSectionIndependent(util.select.fromTo(4, 1, 2, 3, 1, 2) - .add(util.select.fromTo(1, 2, 2, 0, 2, 2))); + ElementLink cogs = scene.world().makeSectionIndependent( + util.select().fromTo(4, 1, 2, 3, 1, 2) + .add(util.select().fromTo(1, 2, 2, 0, 2, 2))); - scene.world.movePulley(pulleyPos, -1, 20); - scene.world.setKineticSpeed(kinetics, -24); - scene.world.moveSection(contraption, util.vector.of(0, 1, 0), 20); - scene.world.moveSection(cogs, util.vector.of(0, 1, 0), 20); + scene.world().movePulley(pulleyPos, -1, 20); + scene.world().setKineticSpeed(kinetics, -24); + scene.world().moveSection(contraption, util.vector().of(0, 1, 0), 20); + scene.world().moveSection(cogs, util.vector().of(0, 1, 0), 20); scene.idle(20); - scene.world.setKineticSpeed(kinetics, 0); + scene.world().setKineticSpeed(kinetics, 0); scene.idle(10); - scene.overlay.showOutline(PonderPalette.GREEN, cogs, util.select.fromTo(4, 2, 2, 1, 2, 2) - .add(util.select.fromTo(2, 3, 3, 2, 2, 3)) - .add(util.select.fromTo(1, 3, 2, 0, 3, 2)), 70); - ElementLink brittles = scene.world.showIndependentSection(lever, Direction.SOUTH); - scene.world.moveSection(brittles, util.vector.of(0, 1, 0), 0); + scene.overlay().showOutline(PonderPalette.GREEN, cogs, util.select().fromTo(4, 2, 2, 1, 2, 2) + .add(util.select().fromTo(2, 3, 3, 2, 2, 3)) + .add(util.select().fromTo(1, 3, 2, 0, 3, 2)), 70); + ElementLink brittles = scene.world().showIndependentSection(lever, Direction.SOUTH); + scene.world().moveSection(brittles, util.vector().of(0, 1, 0), 0); scene.idle(5); - scene.world.showSectionAndMerge(harvester, Direction.WEST, brittles); + scene.world().showSectionAndMerge(harvester, Direction.WEST, brittles); scene.idle(5); - scene.world.showSectionAndMerge(torch, Direction.EAST, brittles); + scene.world().showSectionAndMerge(torch, Direction.EAST, brittles); scene.idle(25); - scene.overlay.showText(80) + scene.overlay().showText(80) .text("Blocks hanging on others usually do not require glue") .placeNearTarget() .colored(PonderPalette.BLUE) .attachKeyFrame() - .pointAt(util.vector.blockSurface(util.grid.at(1, 2, 2), Direction.NORTH)); + .pointAt(util.vector().blockSurface(util.grid().at(1, 2, 2), Direction.NORTH)); scene.idle(80); - scene.world.movePulley(pulleyPos, 1, 20); - scene.world.setKineticSpeed(kinetics, 24); - scene.world.moveSection(cogs, util.vector.of(0, -1, 0), 20); - scene.world.moveSection(brittles, util.vector.of(0, -1, 0), 20); - scene.world.moveSection(contraption, util.vector.of(0, -1, 0), 20); + scene.world().movePulley(pulleyPos, 1, 20); + scene.world().setKineticSpeed(kinetics, 24); + scene.world().moveSection(cogs, util.vector().of(0, -1, 0), 20); + scene.world().moveSection(brittles, util.vector().of(0, -1, 0), 20); + scene.world().moveSection(contraption, util.vector().of(0, -1, 0), 20); scene.idle(20); - scene.world.setKineticSpeed(kinetics, 0); + scene.world().setKineticSpeed(kinetics, 0); scene.idle(10); } diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ChuteScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ChuteScenes.java index 539357727e..4c0e064a2e 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ChuteScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ChuteScenes.java @@ -10,10 +10,10 @@ import com.simibubi.create.content.logistics.chute.SmartChuteBlockEntity; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; import net.createmod.ponder.foundation.ElementLink; import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.SceneBuilder; -import net.createmod.ponder.foundation.SceneBuildingUtil; import net.createmod.ponder.foundation.Selection; import net.createmod.ponder.foundation.element.EntityElement; import net.createmod.ponder.foundation.element.InputWindowElement; @@ -34,59 +34,59 @@ public class ChuteScenes { scene.title("chute", "Transporting Items downward via Chutes"); scene.configureBasePlate(0, 0, 5); scene.scaleSceneView(.9f); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); ElementLink top = - scene.world.showIndependentSection(util.select.fromTo(3, 3, 3, 3, 4, 3), Direction.DOWN); + scene.world().showIndependentSection(util.select().fromTo(3, 3, 3, 3, 4, 3), Direction.DOWN); ElementLink bottom = - scene.world.showIndependentSection(util.select.fromTo(3, 2, 3, 3, 1, 3), Direction.DOWN); - scene.world.moveSection(bottom, util.vector.of(-2, 0, -1), 0); - scene.world.moveSection(top, util.vector.of(0, 0, -1), 0); + scene.world().showIndependentSection(util.select().fromTo(3, 2, 3, 3, 1, 3), Direction.DOWN); + scene.world().moveSection(bottom, util.vector().of(-2, 0, -1), 0); + scene.world().moveSection(top, util.vector().of(0, 0, -1), 0); scene.idle(20); ItemStack stack = new ItemStack(Items.COPPER_BLOCK); - scene.world.createItemEntity(util.vector.centerOf(util.grid.at(3, 3, 2)), util.vector.of(0, -0.1, 0), stack); + scene.world().createItemEntity(util.vector().centerOf(util.grid().at(3, 3, 2)), util.vector().of(0, -0.1, 0), stack); scene.idle(20); ElementLink remove = - scene.world.createItemEntity(util.vector.centerOf(util.grid.at(1, 5, 2)), util.vector.of(0, 0.1, 0), stack); + scene.world().createItemEntity(util.vector().centerOf(util.grid().at(1, 5, 2)), util.vector().of(0, 0.1, 0), stack); scene.idle(15); - scene.world.modifyEntity(remove, Entity::discard); + scene.world().modifyEntity(remove, Entity::discard); - scene.overlay.showText(60) + scene.overlay().showText(60) .attachKeyFrame() - .pointAt(util.vector.topOf(util.grid.at(1, 2, 2))) + .pointAt(util.vector().topOf(util.grid().at(1, 2, 2))) .placeNearTarget() .text("Chutes can transport items vertically from and to inventories"); scene.idle(70); - scene.world.modifyEntities(ItemEntity.class, Entity::discard); - scene.world.moveSection(bottom, util.vector.of(1, 0, 0), 10); - scene.world.moveSection(top, util.vector.of(-1, 0, 0), 10); + scene.world().modifyEntities(ItemEntity.class, Entity::discard); + scene.world().moveSection(bottom, util.vector().of(1, 0, 0), 10); + scene.world().moveSection(top, util.vector().of(-1, 0, 0), 10); scene.idle(20); - scene.overlay.showControls( - new InputWindowElement(util.vector.blockSurface(util.grid.at(2, 3, 2), Direction.NORTH), Pointing.RIGHT) + scene.overlay().showControls( + new InputWindowElement(util.vector().blockSurface(util.grid().at(2, 3, 2), Direction.NORTH), Pointing.RIGHT) .rightClick() .withItem(AllItems.WRENCH.asStack()), 40); scene.idle(7); - scene.world.modifyBlock(util.grid.at(3, 3, 3), s -> s.setValue(ChuteBlock.SHAPE, ChuteBlock.Shape.WINDOW), - false); - scene.overlay.showText(50) + scene.world().modifyBlock(util.grid().at(3, 3, 3), s -> s.setValue(ChuteBlock.SHAPE, ChuteBlock.Shape.WINDOW), + false); + scene.overlay().showText(50) .attachKeyFrame() - .pointAt(util.vector.blockSurface(util.grid.at(2, 3, 2), Direction.WEST)) + .pointAt(util.vector().blockSurface(util.grid().at(2, 3, 2), Direction.WEST)) .placeNearTarget() .text("Using the Wrench, a window can be created"); scene.idle(60); - scene.overlay.showControls( - new InputWindowElement(util.vector.blockSurface(util.grid.at(2, 2, 2), Direction.NORTH), Pointing.RIGHT) + scene.overlay().showControls( + new InputWindowElement(util.vector().blockSurface(util.grid().at(2, 2, 2), Direction.NORTH), Pointing.RIGHT) .rightClick() .withItem(AllBlocks.INDUSTRIAL_IRON_BLOCK.asStack()), 40); scene.idle(7); - scene.world.modifyBlock(util.grid.at(3, 2, 3), s -> s.setValue(ChuteBlock.SHAPE, ChuteBlock.Shape.ENCASED), - false); - scene.overlay.showText(50) - .pointAt(util.vector.blockSurface(util.grid.at(2, 2, 2), Direction.WEST)) + scene.world().modifyBlock(util.grid().at(3, 2, 3), s -> s.setValue(ChuteBlock.SHAPE, ChuteBlock.Shape.ENCASED), + false); + scene.overlay().showText(50) + .pointAt(util.vector().blockSurface(util.grid().at(2, 2, 2), Direction.WEST)) .placeNearTarget() .text("Using Industrial Iron Blocks, chutes can be encased"); @@ -94,44 +94,44 @@ public class ChuteScenes { for (int i = 0; i < 8; i++) { scene.idle(10); - scene.world.createItemOnBeltLike(util.grid.at(3, 3, 3), Direction.UP, stack); + scene.world().createItemOnBeltLike(util.grid().at(3, 3, 3), Direction.UP, stack); } scene.idle(20); - scene.world.hideIndependentSection(bottom, Direction.EAST); - scene.world.hideIndependentSection(top, Direction.EAST); + scene.world().hideIndependentSection(bottom, Direction.EAST); + scene.world().hideIndependentSection(top, Direction.EAST); scene.idle(15); scene.addKeyframe(); scene.rotateCameraY(-90); - scene.world.modifyBlock(util.grid.at(2, 2, 1), s -> s.setValue(SHAPE, Shape.NORMAL), false); - scene.world.modifyBlock(util.grid.at(2, 3, 2), s -> s.setValue(SHAPE, Shape.INTERSECTION), false); - scene.world.showSection(util.select.fromTo(2, 1, 1, 2, 2, 1), Direction.DOWN); + scene.world().modifyBlock(util.grid().at(2, 2, 1), s -> s.setValue(SHAPE, Shape.NORMAL), false); + scene.world().modifyBlock(util.grid().at(2, 3, 2), s -> s.setValue(SHAPE, Shape.INTERSECTION), false); + scene.world().showSection(util.select().fromTo(2, 1, 1, 2, 2, 1), Direction.DOWN); scene.idle(30); ItemStack chuteItem = AllBlocks.CHUTE.asStack(); - scene.overlay.showControls( - new InputWindowElement(util.vector.blockSurface(util.grid.at(2, 2, 1), Direction.SOUTH), Pointing.LEFT) + scene.overlay().showControls( + new InputWindowElement(util.vector().blockSurface(util.grid().at(2, 2, 1), Direction.SOUTH), Pointing.LEFT) .rightClick() .withItem(chuteItem), 30); scene.idle(7); - scene.world.showSection(util.select.position(2, 3, 2), Direction.NORTH); - scene.world.restoreBlocks(util.select.position(2, 2, 1)); + scene.world().showSection(util.select().position(2, 3, 2), Direction.NORTH); + scene.world().restoreBlocks(util.select().position(2, 2, 1)); scene.idle(15); scene.idle(20); - scene.overlay.showControls( - new InputWindowElement(util.vector.blockSurface(util.grid.at(2, 3, 2), Direction.SOUTH), Pointing.LEFT) + scene.overlay().showControls( + new InputWindowElement(util.vector().blockSurface(util.grid().at(2, 3, 2), Direction.SOUTH), Pointing.LEFT) .rightClick() .withItem(chuteItem), 30); scene.idle(7); - scene.world.showSection(util.select.position(2, 4, 3), Direction.NORTH); + scene.world().showSection(util.select().position(2, 4, 3), Direction.NORTH); scene.idle(10); - scene.world.restoreBlocks(util.select.position(2, 3, 2)); + scene.world().restoreBlocks(util.select().position(2, 3, 2)); scene.idle(25); - scene.overlay.showText(70) + scene.overlay().showText(70) .attachKeyFrame() - .pointAt(util.vector.blockSurface(util.grid.at(2, 4, 3), Direction.WEST)) + .pointAt(util.vector().blockSurface(util.grid().at(2, 4, 3), Direction.WEST)) .placeNearTarget() .text("Placing chutes targeting the side faces of another will make it diagonal"); scene.idle(15); @@ -141,21 +141,21 @@ public class ChuteScenes { Direction offset = Direction.NORTH; for (int i = 0; i < 3; i++) { - remove = scene.world.createItemEntity(util.vector.centerOf(util.grid.at(2, 6, 3) - .relative(offset)), util.vector.of(0, 0.1, 0) + remove = scene.world().createItemEntity(util.vector().centerOf(util.grid().at(2, 6, 3) + .relative(offset)), util.vector().of(0, 0.1, 0) .add(Vec3.atLowerCornerOf(offset.getNormal()) .scale(-.1)), - stack); + stack); scene.idle(12); - scene.world.createItemOnBeltLike(util.grid.at(2, 4, 3), Direction.UP, stack); - scene.world.modifyEntity(remove, Entity::discard); + scene.world().createItemOnBeltLike(util.grid().at(2, 4, 3), Direction.UP, stack); + scene.world().modifyEntity(remove, Entity::discard); scene.idle(3); offset = offset.getClockWise(); } scene.idle(10); - scene.overlay.showControls( - new InputWindowElement(util.vector.blockSurface(util.grid.at(2, 1, 1), Direction.NORTH), Pointing.RIGHT) + scene.overlay().showControls( + new InputWindowElement(util.vector().blockSurface(util.grid().at(2, 1, 1), Direction.NORTH), Pointing.RIGHT) .withItem(stack), 50); scene.markAsFinished(); @@ -167,49 +167,49 @@ public class ChuteScenes { scene.configureBasePlate(0, 0, 5); scene.scaleSceneView(.9f); scene.showBasePlate(); - Selection chute = util.select.fromTo(1, 2, 2, 1, 4, 2); - scene.world.setBlocks(chute, Blocks.AIR.defaultBlockState(), false); - scene.world.showSection(util.select.position(1, 1, 2), Direction.UP); + Selection chute = util.select().fromTo(1, 2, 2, 1, 4, 2); + scene.world().setBlocks(chute, Blocks.AIR.defaultBlockState(), false); + scene.world().showSection(util.select().position(1, 1, 2), Direction.UP); scene.idle(20); - scene.world.restoreBlocks(chute); - scene.world.showSection(chute, Direction.DOWN); + scene.world().restoreBlocks(chute); + scene.world().showSection(chute, Direction.DOWN); scene.idle(20); - scene.world.setKineticSpeed(util.select.position(1, 1, 2), 0); - Vec3 surface = util.vector.blockSurface(util.grid.at(1, 2, 2), Direction.WEST); - scene.overlay.showText(70) + scene.world().setKineticSpeed(util.select().position(1, 1, 2), 0); + Vec3 surface = util.vector().blockSurface(util.grid().at(1, 2, 2), Direction.WEST); + scene.overlay().showText(70) .text("Using Encased Fans at the top or bottom, a Chute can move items upward") .attachKeyFrame() .pointAt(surface) .placeNearTarget(); scene.idle(80); - scene.overlay.showControls( - new InputWindowElement(util.vector.blockSurface(util.grid.at(1, 2, 2), Direction.NORTH), Pointing.RIGHT) + scene.overlay().showControls( + new InputWindowElement(util.vector().blockSurface(util.grid().at(1, 2, 2), Direction.NORTH), Pointing.RIGHT) .withItem(AllItems.GOGGLES.asStack()), 50); - scene.overlay.showText(70) + scene.overlay().showText(70) .text("Inspecting chutes with Engineers' Goggles reveals information about the movement direction") .attachKeyFrame() .pointAt(surface) .placeNearTarget(); scene.idle(80); - scene.world.showSection(util.select.fromTo(2, 2, 2, 4, 1, 5) - .add(util.select.position(3, 0, 5)), Direction.DOWN); + scene.world().showSection(util.select().fromTo(2, 2, 2, 4, 1, 5) + .add(util.select().position(3, 0, 5)), Direction.DOWN); ItemStack stack = new ItemStack(Items.COPPER_BLOCK); - scene.world.createItemOnBelt(util.grid.at(4, 1, 2), Direction.EAST, stack); + scene.world().createItemOnBelt(util.grid().at(4, 1, 2), Direction.EAST, stack); scene.idle(10); scene.rotateCameraY(60); - scene.overlay.showText(70) + scene.overlay().showText(70) .text("On the 'blocked' end, items will have to be inserted/taken from the sides") .attachKeyFrame() - .pointAt(util.vector.centerOf(util.grid.at(3, 1, 2)) + .pointAt(util.vector().centerOf(util.grid().at(3, 1, 2)) .add(0, 3 / 16f, 0)) .placeNearTarget(); scene.idle(32); - scene.world.flapFunnel(util.grid.at(2, 2, 2), false); - scene.world.removeItemsFromBelt(util.grid.at(2, 1, 2)); - scene.world.createItemOnBeltLike(util.grid.at(1, 2, 2), Direction.EAST, stack); + scene.world().flapFunnel(util.grid().at(2, 2, 2), false); + scene.world().removeItemsFromBelt(util.grid().at(2, 1, 2)); + scene.world().createItemOnBeltLike(util.grid().at(1, 2, 2), Direction.EAST, stack); } public static void smart(SceneBuilder builder, SceneBuildingUtil util) { @@ -218,75 +218,75 @@ public class ChuteScenes { scene.configureBasePlate(0, 0, 5); scene.scaleSceneView(.9f); - Selection lever = util.select.fromTo(0, 1, 2, 1, 3, 2); - BlockPos smarty = util.grid.at(2, 3, 2); + Selection lever = util.select().fromTo(0, 1, 2, 1, 3, 2); + BlockPos smarty = util.grid().at(2, 3, 2); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); scene.idle(5); - scene.world.showSection(util.select.fromTo(2, 1, 2, 2, 2, 2), Direction.DOWN); + scene.world().showSection(util.select().fromTo(2, 1, 2, 2, 2, 2), Direction.DOWN); scene.idle(10); - scene.world.showSection(util.select.position(2, 3, 2), Direction.DOWN); + scene.world().showSection(util.select().position(2, 3, 2), Direction.DOWN); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("Smart Chutes are vertical chutes with additional control") .attachKeyFrame() - .pointAt(util.vector.blockSurface(smarty, Direction.WEST)) + .pointAt(util.vector().blockSurface(smarty, Direction.WEST)) .placeNearTarget(); scene.idle(70); - Vec3 filter = util.vector.blockSurface(smarty, Direction.NORTH) + Vec3 filter = util.vector().blockSurface(smarty, Direction.NORTH) .add(0, 3 / 16f, 0); - scene.overlay.showFilterSlotInput(filter, Direction.NORTH, 70); + scene.overlay().showFilterSlotInput(filter, Direction.NORTH, 70); scene.idle(10); scene.rotateCameraY(20); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("Items in the filter slot specify what to extract or transfer") .attachKeyFrame() .pointAt(filter.add(0, 0, 0.125)) .placeNearTarget(); scene.idle(60); - scene.world.showSection(util.select.position(2, 4, 2), Direction.DOWN); + scene.world().showSection(util.select().position(2, 4, 2), Direction.DOWN); scene.idle(15); ItemStack copper = new ItemStack(Items.IRON_INGOT); - scene.overlay.showControls(new InputWindowElement(filter.add(0, 0.125, 0), Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(filter.add(0, 0.125, 0), Pointing.DOWN).rightClick() .withItem(copper), 40); scene.idle(7); - scene.world.setFilterData(util.select.position(smarty), SmartChuteBlockEntity.class, copper); + scene.world().setFilterData(util.select().position(smarty), SmartChuteBlockEntity.class, copper); for (int i = 0; i < 18; i++) { scene.idle(10); - scene.world.createItemOnBeltLike(util.grid.at(2, 2, 2), Direction.UP, copper); + scene.world().createItemOnBeltLike(util.grid().at(2, 2, 2), Direction.UP, copper); if (i == 8) { scene.rotateCameraY(-20); - scene.overlay.showControls(new InputWindowElement(filter.add(0, 0.125, 0), Pointing.DOWN).rightClick(), - 40); - scene.overlay.showText(50) + scene.overlay().showControls(new InputWindowElement(filter.add(0, 0.125, 0), Pointing.DOWN).rightClick(), + 40); + scene.overlay().showText(50) .text("Use the value panel to specify the extracted stack size") .attachKeyFrame() .pointAt(filter.add(0, 0, 0.125)) .placeNearTarget(); } if (i == 13) - scene.world.showSection(lever, Direction.NORTH); + scene.world().showSection(lever, Direction.NORTH); } - scene.world.toggleRedstonePower(lever.add(util.select.position(smarty))); - scene.effects.indicateRedstone(util.grid.at(0, 3, 2)); - scene.overlay.showText(50) + scene.world().toggleRedstonePower(lever.add(util.select().position(smarty))); + scene.effects().indicateRedstone(util.grid().at(0, 3, 2)); + scene.overlay().showText(50) .text("Redstone power will prevent Smart Chutes from acting.") .attachKeyFrame() .colored(PonderPalette.RED) - .pointAt(util.vector.blockSurface(util.grid.at(0, 2, 2), Direction.UP)) + .pointAt(util.vector().blockSurface(util.grid().at(0, 2, 2), Direction.UP)) .placeNearTarget(); scene.idle(70); - scene.world.toggleRedstonePower(lever.add(util.select.position(smarty))); + scene.world().toggleRedstonePower(lever.add(util.select().position(smarty))); scene.markAsFinished(); for (int i = 0; i < 8; i++) { scene.idle(10); - scene.world.createItemOnBeltLike(util.grid.at(2, 2, 2), Direction.UP, copper); + scene.world().createItemOnBeltLike(util.grid().at(2, 2, 2), Direction.UP, copper); } } diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/CrafterScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/CrafterScenes.java index c999361c43..0e6ff8b57f 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/CrafterScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/CrafterScenes.java @@ -10,10 +10,10 @@ import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Couple; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; import net.createmod.ponder.foundation.ElementLink; import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.SceneBuilder; -import net.createmod.ponder.foundation.SceneBuildingUtil; import net.createmod.ponder.foundation.Selection; import net.createmod.ponder.foundation.element.EntityElement; import net.createmod.ponder.foundation.element.InputWindowElement; @@ -33,61 +33,61 @@ public class CrafterScenes { CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("mechanical_crafter", "Setting up Mechanical Crafters"); scene.configureBasePlate(0, 0, 5); - scene.world.showSection(util.select.layer(0), Direction.UP); - scene.world.modifyKineticSpeed(util.select.everywhere(), f -> 1.5f * f); + scene.world().showSection(util.select().layer(0), Direction.UP); + scene.world().modifyKineticSpeed(util.select().everywhere(), f -> 1.5f * f); - Selection redstone = util.select.fromTo(3, 1, 0, 3, 1, 1); - Selection kinetics = util.select.fromTo(4, 1, 2, 4, 1, 5); - BlockPos depotPos = util.grid.at(0, 1, 2); - Selection crafters = util.select.fromTo(1, 1, 2, 3, 3, 2); + Selection redstone = util.select().fromTo(3, 1, 0, 3, 1, 1); + Selection kinetics = util.select().fromTo(4, 1, 2, 4, 1, 5); + BlockPos depotPos = util.grid().at(0, 1, 2); + Selection crafters = util.select().fromTo(1, 1, 2, 3, 3, 2); - scene.world.modifyBlocks(crafters, s -> s.setValue(MechanicalCrafterBlock.POINTING, Pointing.DOWN), false); - scene.world.setKineticSpeed(crafters, 0); + scene.world().modifyBlocks(crafters, s -> s.setValue(MechanicalCrafterBlock.POINTING, Pointing.DOWN), false); + scene.world().setKineticSpeed(crafters, 0); for (int y = 0; y < 3; y++) { for (int x = 0; x < 3; x++) { - scene.world.showSection(util.select.position(y == 1 ? x + 1 : 3 - x, y + 1, 2), Direction.DOWN); + scene.world().showSection(util.select().position(y == 1 ? x + 1 : 3 - x, y + 1, 2), Direction.DOWN); scene.idle(2); } } - scene.overlay.showText(70) + scene.overlay().showText(70) .text("An array of Mechanical Crafters can be used to automate any Crafting Recipe") - .pointAt(util.vector.blockSurface(util.grid.at(1, 2, 2), Direction.WEST)) + .pointAt(util.vector().blockSurface(util.grid().at(1, 2, 2), Direction.WEST)) .attachKeyFrame() .placeNearTarget(); scene.idle(80); - scene.overlay.showControls( - new InputWindowElement(util.vector.blockSurface(util.grid.at(2, 3, 2), Direction.NORTH), Pointing.RIGHT) + scene.overlay().showControls( + new InputWindowElement(util.vector().blockSurface(util.grid().at(2, 3, 2), Direction.NORTH), Pointing.RIGHT) .rightClick() .withItem(AllItems.WRENCH.asStack()), 40); scene.idle(7); - scene.world.cycleBlockProperty(util.grid.at(2, 3, 2), MechanicalCrafterBlock.POINTING); + scene.world().cycleBlockProperty(util.grid().at(2, 3, 2), MechanicalCrafterBlock.POINTING); scene.idle(10); - scene.overlay.showText(50) + scene.overlay().showText(50) .text("Using a Wrench, the Crafters' paths can be arranged") - .pointAt(util.vector.blockSurface(util.grid.at(2, 3, 2), Direction.NORTH)) + .pointAt(util.vector().blockSurface(util.grid().at(2, 3, 2), Direction.NORTH)) .attachKeyFrame() .placeNearTarget(); scene.idle(60); - BlockPos[] positions = new BlockPos[] { util.grid.at(3, 1, 2), util.grid.at(2, 1, 2), util.grid.at(1, 1, 2) }; + BlockPos[] positions = new BlockPos[] { util.grid().at(3, 1, 2), util.grid().at(2, 1, 2), util.grid().at(1, 1, 2) }; for (BlockPos pos : positions) { - scene.overlay.showControls( - new InputWindowElement(util.vector.blockSurface(pos, Direction.NORTH), Pointing.RIGHT).rightClick() + scene.overlay().showControls( + new InputWindowElement(util.vector().blockSurface(pos, Direction.NORTH), Pointing.RIGHT).rightClick() .withItem(AllItems.WRENCH.asStack()), 10); scene.idle(7); - scene.world.cycleBlockProperty(pos, MechanicalCrafterBlock.POINTING); + scene.world().cycleBlockProperty(pos, MechanicalCrafterBlock.POINTING); scene.idle(15); } - scene.overlay.showText(100) + scene.overlay().showText(100) .text("For a valid setup, all paths have to converge into one exit at any side") - .pointAt(util.vector.blockSurface(util.grid.at(1, 1, 2), Direction.WEST) + .pointAt(util.vector().blockSurface(util.grid().at(1, 1, 2), Direction.WEST) .add(0, 0, -.5f)) .colored(PonderPalette.GREEN) .attachKeyFrame() @@ -95,70 +95,70 @@ public class CrafterScenes { scene.idle(60); Collection> couples = - ImmutableList.of(Couple.create(util.grid.at(3, 3, 2), util.grid.at(3, 2, 2)), - Couple.create(util.grid.at(3, 2, 2), util.grid.at(3, 1, 2)), - Couple.create(util.grid.at(2, 3, 2), util.grid.at(1, 3, 2)), - Couple.create(util.grid.at(3, 1, 2), util.grid.at(2, 1, 2)), - Couple.create(util.grid.at(1, 3, 2), util.grid.at(1, 2, 2)), - Couple.create(util.grid.at(2, 2, 2), util.grid.at(2, 1, 2)), - Couple.create(util.grid.at(1, 2, 2), util.grid.at(1, 1, 2)), - Couple.create(util.grid.at(2, 1, 2), util.grid.at(1, 1, 2)), - Couple.create(util.grid.at(1, 1, 2), util.grid.at(0, 1, 2))); + ImmutableList.of(Couple.create(util.grid().at(3, 3, 2), util.grid().at(3, 2, 2)), + Couple.create(util.grid().at(3, 2, 2), util.grid().at(3, 1, 2)), + Couple.create(util.grid().at(2, 3, 2), util.grid().at(1, 3, 2)), + Couple.create(util.grid().at(3, 1, 2), util.grid().at(2, 1, 2)), + Couple.create(util.grid().at(1, 3, 2), util.grid().at(1, 2, 2)), + Couple.create(util.grid().at(2, 2, 2), util.grid().at(2, 1, 2)), + Couple.create(util.grid().at(1, 2, 2), util.grid().at(1, 1, 2)), + Couple.create(util.grid().at(2, 1, 2), util.grid().at(1, 1, 2)), + Couple.create(util.grid().at(1, 1, 2), util.grid().at(0, 1, 2))); for (Couple c : couples) { scene.idle(5); - Vec3 p1 = util.vector.blockSurface(c.getFirst(), Direction.NORTH) + Vec3 p1 = util.vector().blockSurface(c.getFirst(), Direction.NORTH) .add(0, 0, -0.125); - Vec3 p2 = util.vector.blockSurface(c.getSecond(), Direction.NORTH) + Vec3 p2 = util.vector().blockSurface(c.getSecond(), Direction.NORTH) .add(0, 0, -0.125); AABB point = new AABB(p1, p1); AABB line = new AABB(p1, p2); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, p1, point, 2); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, p1, point, 2); scene.idle(1); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, p1, line, 30); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, p1, line, 30); } - scene.world.showSection(util.select.position(depotPos), Direction.EAST); + scene.world().showSection(util.select().position(depotPos), Direction.EAST); scene.idle(20); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("The outputs will be placed into the inventory at the exit") - .pointAt(util.vector.blockSurface(util.grid.at(0, 1, 2), Direction.NORTH)) + .pointAt(util.vector().blockSurface(util.grid().at(0, 1, 2), Direction.NORTH)) .placeNearTarget(); scene.idle(70); scene.rotateCameraY(60); scene.idle(20); - scene.world.showSection(kinetics, Direction.NORTH); - scene.overlay.showText(60) + scene.world().showSection(kinetics, Direction.NORTH); + scene.overlay().showText(60) .text("Mechanical Crafters require Rotational Force to operate") - .pointAt(util.vector.blockSurface(util.grid.at(4, 1, 2), Direction.NORTH)) + .pointAt(util.vector().blockSurface(util.grid().at(4, 1, 2), Direction.NORTH)) .attachKeyFrame() .placeNearTarget(); scene.idle(8); - scene.world.setKineticSpeed(crafters, -48); - scene.world.multiplyKineticSpeed(util.select.position(3, 2, 2) - .add(util.select.position(2, 3, 2)) - .add(util.select.position(1, 2, 2)) - .add(util.select.position(2, 1, 2)), -1); + scene.world().setKineticSpeed(crafters, -48); + scene.world().multiplyKineticSpeed(util.select().position(3, 2, 2) + .add(util.select().position(2, 3, 2)) + .add(util.select().position(1, 2, 2)) + .add(util.select().position(2, 1, 2)), -1); scene.idle(55); scene.rotateCameraY(-60); scene.idle(40); ItemStack planks = new ItemStack(Items.OAK_PLANKS); - scene.overlay.showControls( - new InputWindowElement(util.vector.blockSurface(util.grid.at(1, 3, 2), Direction.NORTH), Pointing.RIGHT) + scene.overlay().showControls( + new InputWindowElement(util.vector().blockSurface(util.grid().at(1, 3, 2), Direction.NORTH), Pointing.RIGHT) .rightClick() .withItem(planks), 40); scene.idle(7); Class type = MechanicalCrafterBlockEntity.class; - scene.world.modifyBlockEntity(util.grid.at(1, 3, 2), type, mct -> mct.getInventory() + scene.world().modifyBlockEntity(util.grid().at(1, 3, 2), type, mct -> mct.getInventory() .insertItem(0, planks.copy(), false)); scene.idle(10); - scene.overlay.showText(50) + scene.overlay().showText(50) .text("Right-Click the front to insert Items manually") - .pointAt(util.vector.blockSurface(util.grid.at(1, 3, 2), Direction.NORTH)) + .pointAt(util.vector().blockSurface(util.grid().at(1, 3, 2), Direction.NORTH)) .attachKeyFrame() .placeNearTarget(); scene.idle(60); @@ -167,179 +167,179 @@ public class CrafterScenes { ItemStack iron = new ItemStack(Items.IRON_INGOT); ItemStack cobble = new ItemStack(Items.COBBLESTONE); - scene.world.setCraftingResult(util.grid.at(1, 1, 2), new ItemStack(Items.PISTON)); + scene.world().setCraftingResult(util.grid().at(1, 1, 2), new ItemStack(Items.PISTON)); - scene.world.modifyBlockEntity(util.grid.at(2, 3, 2), type, mct -> mct.getInventory() + scene.world().modifyBlockEntity(util.grid().at(2, 3, 2), type, mct -> mct.getInventory() .insertItem(0, planks.copy(), false)); scene.idle(5); - scene.world.modifyBlockEntity(util.grid.at(3, 3, 2), type, mct -> mct.getInventory() + scene.world().modifyBlockEntity(util.grid().at(3, 3, 2), type, mct -> mct.getInventory() .insertItem(0, planks.copy(), false)); scene.idle(5); - scene.world.modifyBlockEntity(util.grid.at(3, 2, 2), type, mct -> mct.getInventory() + scene.world().modifyBlockEntity(util.grid().at(3, 2, 2), type, mct -> mct.getInventory() .insertItem(0, cobble.copy(), false)); scene.idle(5); - scene.world.modifyBlockEntity(util.grid.at(2, 2, 2), type, mct -> mct.getInventory() + scene.world().modifyBlockEntity(util.grid().at(2, 2, 2), type, mct -> mct.getInventory() .insertItem(0, iron.copy(), false)); scene.idle(5); - scene.world.modifyBlockEntity(util.grid.at(1, 2, 2), type, mct -> mct.getInventory() + scene.world().modifyBlockEntity(util.grid().at(1, 2, 2), type, mct -> mct.getInventory() .insertItem(0, cobble.copy(), false)); scene.idle(5); - scene.world.modifyBlockEntity(util.grid.at(1, 1, 2), type, mct -> mct.getInventory() + scene.world().modifyBlockEntity(util.grid().at(1, 1, 2), type, mct -> mct.getInventory() .insertItem(0, cobble.copy(), false)); scene.idle(5); - scene.world.modifyBlockEntity(util.grid.at(2, 1, 2), type, mct -> mct.getInventory() + scene.world().modifyBlockEntity(util.grid().at(2, 1, 2), type, mct -> mct.getInventory() .insertItem(0, redstoneDust.copy(), false)); scene.idle(5); - scene.world.modifyBlockEntity(util.grid.at(3, 1, 2), type, mct -> mct.getInventory() + scene.world().modifyBlockEntity(util.grid().at(3, 1, 2), type, mct -> mct.getInventory() .insertItem(0, cobble.copy(), false)); - scene.overlay.showText(80) + scene.overlay().showText(80) .attachKeyFrame() .text("Once every slot of a path contains an Item, the crafting process will begin") - .pointAt(util.vector.blockSurface(util.grid.at(1, 3, 2), Direction.WEST)) + .pointAt(util.vector().blockSurface(util.grid().at(1, 3, 2), Direction.WEST)) .placeNearTarget(); scene.idle(180); - scene.world.removeItemsFromBelt(depotPos); + scene.world().removeItemsFromBelt(depotPos); ItemStack stick = new ItemStack(Items.STICK); - scene.world.setCraftingResult(util.grid.at(1, 1, 2), new ItemStack(Items.IRON_PICKAXE)); + scene.world().setCraftingResult(util.grid().at(1, 1, 2), new ItemStack(Items.IRON_PICKAXE)); - scene.world.modifyBlockEntity(util.grid.at(1, 3, 2), type, mct -> mct.getInventory() + scene.world().modifyBlockEntity(util.grid().at(1, 3, 2), type, mct -> mct.getInventory() .insertItem(0, iron.copy(), false)); scene.idle(2); - scene.world.modifyBlockEntity(util.grid.at(2, 3, 2), type, mct -> mct.getInventory() + scene.world().modifyBlockEntity(util.grid().at(2, 3, 2), type, mct -> mct.getInventory() .insertItem(0, iron.copy(), false)); scene.idle(2); - scene.world.modifyBlockEntity(util.grid.at(3, 3, 2), type, mct -> mct.getInventory() + scene.world().modifyBlockEntity(util.grid().at(3, 3, 2), type, mct -> mct.getInventory() .insertItem(0, iron.copy(), false)); scene.idle(2); - scene.world.modifyBlockEntity(util.grid.at(2, 2, 2), type, mct -> mct.getInventory() + scene.world().modifyBlockEntity(util.grid().at(2, 2, 2), type, mct -> mct.getInventory() .insertItem(0, stick.copy(), false)); scene.idle(2); - scene.world.modifyBlockEntity(util.grid.at(2, 1, 2), type, mct -> mct.getInventory() + scene.world().modifyBlockEntity(util.grid().at(2, 1, 2), type, mct -> mct.getInventory() .insertItem(0, stick.copy(), false)); - scene.world.showSection(redstone, Direction.SOUTH); + scene.world().showSection(redstone, Direction.SOUTH); scene.idle(10); - scene.overlay.showText(90) + scene.overlay().showText(90) .attachKeyFrame() .colored(PonderPalette.RED) .text("For recipes not fully occupying the crafter setup, the start can be forced using a Redstone Pulse") - .pointAt(util.vector.blockSurface(util.grid.at(1, 2, 2), Direction.NORTH)) + .pointAt(util.vector().blockSurface(util.grid().at(1, 2, 2), Direction.NORTH)) .placeNearTarget(); scene.idle(100); - scene.effects.indicateRedstone(util.grid.at(3, 1, 0)); - scene.world.toggleRedstonePower(redstone); + scene.effects().indicateRedstone(util.grid().at(3, 1, 0)); + scene.world().toggleRedstonePower(redstone); scene.idle(20); - scene.world.toggleRedstonePower(redstone); + scene.world().toggleRedstonePower(redstone); } public static void connect(SceneBuilder builder, SceneBuildingUtil util) { CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("mechanical_crafter_connect", "Connecting Inventories of Crafters"); scene.configureBasePlate(0, 0, 5); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); for (int y = 0; y < 3; y++) { for (int x = 0; x < 2; x++) { - scene.world.showSection(util.select.position(y == 1 ? x + 1 : 2 - x, y + 1, 2), Direction.DOWN); + scene.world().showSection(util.select().position(y == 1 ? x + 1 : 2 - x, y + 1, 2), Direction.DOWN); scene.idle(2); } } Class type = MechanicalCrafterBlockEntity.class; - BlockPos depotPos = util.grid.at(0, 1, 2); - Selection funnel = util.select.fromTo(4, 1, 5, 4, 1, 2) - .add(util.select.fromTo(3, 2, 2, 3, 1, 2)); - Selection kinetics = util.select.position(3, 3, 2) - .add(util.select.fromTo(3, 3, 3, 3, 1, 3)); + BlockPos depotPos = util.grid().at(0, 1, 2); + Selection funnel = util.select().fromTo(4, 1, 5, 4, 1, 2) + .add(util.select().fromTo(3, 2, 2, 3, 1, 2)); + Selection kinetics = util.select().position(3, 3, 2) + .add(util.select().fromTo(3, 3, 3, 3, 1, 3)); scene.idle(5); - scene.world.showSection(kinetics, Direction.NORTH); + scene.world().showSection(kinetics, Direction.NORTH); scene.idle(5); - scene.world.showSection(util.select.position(depotPos), Direction.EAST); + scene.world().showSection(util.select().position(depotPos), Direction.EAST); scene.idle(10); - scene.world.showSection(funnel, Direction.WEST); + scene.world().showSection(funnel, Direction.WEST); scene.rotateCameraY(60); ItemStack planks = new ItemStack(Items.OAK_PLANKS); - scene.world.createItemOnBelt(util.grid.at(4, 1, 2), Direction.EAST, planks.copy()); + scene.world().createItemOnBelt(util.grid().at(4, 1, 2), Direction.EAST, planks.copy()); scene.idle(22); - scene.world.modifyBlockEntity(util.grid.at(2, 2, 2), type, mct -> mct.getInventory() + scene.world().modifyBlockEntity(util.grid().at(2, 2, 2), type, mct -> mct.getInventory() .insertItem(0, planks.copy(), false)); - scene.world.removeItemsFromBelt(util.grid.at(3, 1, 2)); - scene.world.flapFunnel(util.grid.at(3, 2, 2), false); + scene.world().removeItemsFromBelt(util.grid().at(3, 1, 2)); + scene.world().flapFunnel(util.grid().at(3, 2, 2), false); - scene.overlay.showSelectionWithText(util.select.position(2, 2, 2), 70) + scene.overlay().showSelectionWithText(util.select().position(2, 2, 2), 70) .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.blockSurface(util.grid.at(2, 2, 2), Direction.NORTH)) + .pointAt(util.vector().blockSurface(util.grid().at(2, 2, 2), Direction.NORTH)) .text("Items can be inserted to Crafters automatically"); scene.idle(80); scene.rotateCameraY(-60 - 90 - 30); scene.idle(40); - Vec3 v = util.vector.blockSurface(util.grid.at(2, 2, 2), Direction.WEST); + Vec3 v = util.vector().blockSurface(util.grid().at(2, 2, 2), Direction.WEST); AABB bb = new AABB(v, v).inflate(.125f, .5, .5); v = v.add(0, 0, .5); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.WHITE, new Object(), bb, 45); - scene.overlay.showControls(new InputWindowElement(v, Pointing.LEFT).rightClick() + scene.overlay().chaseBoundingBoxOutline(PonderPalette.WHITE, new Object(), bb, 45); + scene.overlay().showControls(new InputWindowElement(v, Pointing.LEFT).rightClick() .withItem(AllItems.WRENCH.asStack()), 40); scene.idle(7); - scene.world.connectCrafterInvs(util.grid.at(2, 2, 2), util.grid.at(1, 2, 2)); + scene.world().connectCrafterInvs(util.grid().at(2, 2, 2), util.grid().at(1, 2, 2)); scene.idle(40); - scene.overlay.showSelectionWithText(util.select.fromTo(2, 2, 2, 1, 2, 2), 70) + scene.overlay().showSelectionWithText(util.select().fromTo(2, 2, 2, 1, 2, 2), 70) .attachKeyFrame() .placeNearTarget() .pointAt(v) .text("Using the Wrench at their backs, Mechanical Crafter inputs can be combined"); scene.idle(80); - scene.overlay.showControls(new InputWindowElement(v.add(0, 1, 0), Pointing.LEFT).rightClick() + scene.overlay().showControls(new InputWindowElement(v.add(0, 1, 0), Pointing.LEFT).rightClick() .withItem(AllItems.WRENCH.asStack()), 20); scene.idle(7); - scene.world.connectCrafterInvs(util.grid.at(2, 3, 2), util.grid.at(1, 3, 2)); + scene.world().connectCrafterInvs(util.grid().at(2, 3, 2), util.grid().at(1, 3, 2)); scene.idle(20); - scene.overlay.showControls(new InputWindowElement(v.add(0, -1, 0), Pointing.LEFT).rightClick() + scene.overlay().showControls(new InputWindowElement(v.add(0, -1, 0), Pointing.LEFT).rightClick() .withItem(AllItems.WRENCH.asStack()), 20); scene.idle(7); - scene.world.connectCrafterInvs(util.grid.at(2, 1, 2), util.grid.at(1, 1, 2)); + scene.world().connectCrafterInvs(util.grid().at(2, 1, 2), util.grid().at(1, 1, 2)); scene.idle(20); - scene.overlay.showControls(new InputWindowElement(v.add(.5, -.5, 0), Pointing.LEFT).rightClick() + scene.overlay().showControls(new InputWindowElement(v.add(.5, -.5, 0), Pointing.LEFT).rightClick() .withItem(AllItems.WRENCH.asStack()), 20); scene.idle(7); - scene.world.connectCrafterInvs(util.grid.at(2, 1, 2), util.grid.at(2, 2, 2)); + scene.world().connectCrafterInvs(util.grid().at(2, 1, 2), util.grid().at(2, 2, 2)); scene.idle(10); - scene.overlay.showControls(new InputWindowElement(v.add(.5, .5, 0), Pointing.LEFT).rightClick() + scene.overlay().showControls(new InputWindowElement(v.add(.5, .5, 0), Pointing.LEFT).rightClick() .withItem(AllItems.WRENCH.asStack()), 20); scene.idle(7); - scene.world.connectCrafterInvs(util.grid.at(2, 2, 2), util.grid.at(2, 3, 2)); + scene.world().connectCrafterInvs(util.grid().at(2, 2, 2), util.grid().at(2, 3, 2)); scene.idle(20); scene.rotateCameraY(90 + 30); scene.idle(40); - scene.overlay.showSelectionWithText(util.select.fromTo(1, 1, 2, 2, 3, 2), 70) + scene.overlay().showSelectionWithText(util.select().fromTo(1, 1, 2, 2, 3, 2), 70) .attachKeyFrame() .placeNearTarget() .text("All connected Crafters can now be accessed by the same input location"); scene.idle(60); - scene.overlay.showControls( - new InputWindowElement(util.vector.centerOf(util.grid.at(4, 2, 2)), Pointing.DOWN).withItem(planks), 40); + scene.overlay().showControls( + new InputWindowElement(util.vector().centerOf(util.grid().at(4, 2, 2)), Pointing.DOWN).withItem(planks), 40); scene.idle(7); - scene.world.createItemOnBelt(util.grid.at(4, 1, 2), Direction.EAST, - ItemHandlerHelper.copyStackWithSize(planks, 16)); + scene.world().createItemOnBelt(util.grid().at(4, 1, 2), Direction.EAST, + ItemHandlerHelper.copyStackWithSize(planks, 16)); scene.idle(22); - scene.world.removeItemsFromBelt(util.grid.at(3, 1, 2)); - BlockPos[] positions = new BlockPos[] { util.grid.at(2, 3, 2), util.grid.at(1, 3, 2), util.grid.at(1, 2, 2), - util.grid.at(2, 1, 2), util.grid.at(1, 1, 2) }; + scene.world().removeItemsFromBelt(util.grid().at(3, 1, 2)); + BlockPos[] positions = new BlockPos[] { util.grid().at(2, 3, 2), util.grid().at(1, 3, 2), util.grid().at(1, 2, 2), + util.grid().at(2, 1, 2), util.grid().at(1, 1, 2) }; - scene.world.setCraftingResult(util.grid.at(1, 1, 2), new ItemStack(Items.OAK_DOOR, 3)); + scene.world().setCraftingResult(util.grid().at(1, 1, 2), new ItemStack(Items.OAK_DOOR, 3)); for (BlockPos pos : positions) { - scene.world.modifyBlockEntity(pos, type, mct -> mct.getInventory() + scene.world().modifyBlockEntity(pos, type, mct -> mct.getInventory() .insertItem(0, planks.copy(), false)); scene.idle(1); } @@ -350,106 +350,106 @@ public class CrafterScenes { CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("mechanical_crafter_covers", "Covering slots of Mechanical Crafters"); scene.configureBasePlate(0, 0, 5); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); - scene.world.setBlock(util.grid.at(2, 2, 2), Blocks.AIR.defaultBlockState(), false); + scene.world().setBlock(util.grid().at(2, 2, 2), Blocks.AIR.defaultBlockState(), false); - Selection kinetics = util.select.fromTo(3, 1, 2, 3, 1, 5); - scene.world.setKineticSpeed(util.select.fromTo(1, 2, 2, 3, 1, 2), 0); + Selection kinetics = util.select().fromTo(3, 1, 2, 3, 1, 5); + scene.world().setKineticSpeed(util.select().fromTo(1, 2, 2, 3, 1, 2), 0); - scene.world.showSection(util.select.position(3, 2, 2), Direction.EAST); + scene.world().showSection(util.select().position(3, 2, 2), Direction.EAST); scene.idle(5); - scene.world.showSection(util.select.position(2, 1, 2), Direction.DOWN); + scene.world().showSection(util.select().position(2, 1, 2), Direction.DOWN); scene.idle(5); - scene.world.showSection(util.select.position(1, 2, 2), Direction.WEST); + scene.world().showSection(util.select().position(1, 2, 2), Direction.WEST); scene.idle(5); ItemStack iron = new ItemStack(Items.IRON_INGOT); Class type = MechanicalCrafterBlockEntity.class; - scene.world.modifyBlockEntity(util.grid.at(3, 2, 2), type, mct -> mct.getInventory() + scene.world().modifyBlockEntity(util.grid().at(3, 2, 2), type, mct -> mct.getInventory() .insertItem(0, iron.copy(), false)); scene.idle(5); - scene.world.modifyBlockEntity(util.grid.at(2, 1, 2), type, mct -> mct.getInventory() + scene.world().modifyBlockEntity(util.grid().at(2, 1, 2), type, mct -> mct.getInventory() .insertItem(0, iron.copy(), false)); scene.idle(5); - scene.world.modifyBlockEntity(util.grid.at(1, 2, 2), type, mct -> mct.getInventory() + scene.world().modifyBlockEntity(util.grid().at(1, 2, 2), type, mct -> mct.getInventory() .insertItem(0, iron.copy(), false)); scene.idle(5); - Selection emptyCrafter = util.select.position(2, 2, 2); - scene.overlay.showSelectionWithText(emptyCrafter, 90) + Selection emptyCrafter = util.select().position(2, 2, 2); + scene.overlay().showSelectionWithText(emptyCrafter, 90) .attachKeyFrame() .colored(PonderPalette.RED) .text("Some recipes will require additional Crafters to bridge gaps in the path") .placeNearTarget(); scene.idle(70); - scene.world.restoreBlocks(emptyCrafter); - scene.world.setCraftingResult(util.grid.at(2, 2, 2), new ItemStack(Items.BUCKET)); - scene.world.showSection(emptyCrafter, Direction.DOWN); + scene.world().restoreBlocks(emptyCrafter); + scene.world().setCraftingResult(util.grid().at(2, 2, 2), new ItemStack(Items.BUCKET)); + scene.world().showSection(emptyCrafter, Direction.DOWN); scene.idle(10); - scene.world.showSection(util.select.position(2, 3, 2), Direction.DOWN); - scene.world.showSection(kinetics, Direction.NORTH); + scene.world().showSection(util.select().position(2, 3, 2), Direction.DOWN); + scene.world().showSection(kinetics, Direction.NORTH); scene.idle(5); - scene.world.setKineticSpeed(util.select.fromTo(3, 1, 2, 1, 2, 2), -32); - scene.world.setKineticSpeed(util.select.position(3, 1, 2) + scene.world().setKineticSpeed(util.select().fromTo(3, 1, 2, 1, 2, 2), -32); + scene.world().setKineticSpeed(util.select().position(3, 1, 2) .add(emptyCrafter), 32); scene.idle(20); - scene.overlay.showText(90) + scene.overlay().showText(90) .attachKeyFrame() .colored(PonderPalette.GREEN) - .pointAt(util.vector.blockSurface(util.grid.at(2, 2, 2), Direction.NORTH)) + .pointAt(util.vector().blockSurface(util.grid().at(2, 2, 2), Direction.NORTH)) .text("Using Slot Covers, Crafters can be set to act as an Empty Slot in the arrangement") .placeNearTarget(); scene.idle(100); - scene.overlay - .showControls(new InputWindowElement(util.vector.blockSurface(util.grid.at(2, 2, 2), Direction.NORTH) + scene.overlay() + .showControls(new InputWindowElement(util.vector().blockSurface(util.grid().at(2, 2, 2), Direction.NORTH) .add(0.5, 0, 0), Pointing.RIGHT).withItem(AllItems.CRAFTER_SLOT_COVER.asStack()) .rightClick(), 50); scene.idle(7); - scene.world.modifyBlockEntityNBT(emptyCrafter, type, compound -> compound.putBoolean("Cover", true)); + scene.world().modifyBlockEntityNBT(emptyCrafter, type, compound -> compound.putBoolean("Cover", true)); scene.idle(130); - scene.overlay.showControls( - new InputWindowElement(util.vector.blockSurface(util.grid.at(2, 3, 2), Direction.WEST), Pointing.LEFT) + scene.overlay().showControls( + new InputWindowElement(util.vector().blockSurface(util.grid().at(2, 3, 2), Direction.WEST), Pointing.LEFT) .withItem(new ItemStack(Items.BUCKET)), 40); scene.idle(50); - scene.world.showSection(util.select.position(4, 2, 2), Direction.DOWN); + scene.world().showSection(util.select().position(4, 2, 2), Direction.DOWN); - scene.world.connectCrafterInvs(util.grid.at(3, 2, 2), util.grid.at(2, 2, 2)); + scene.world().connectCrafterInvs(util.grid().at(3, 2, 2), util.grid().at(2, 2, 2)); scene.idle(5); - scene.world.connectCrafterInvs(util.grid.at(2, 1, 2), util.grid.at(2, 2, 2)); + scene.world().connectCrafterInvs(util.grid().at(2, 1, 2), util.grid().at(2, 2, 2)); scene.idle(5); - scene.world.connectCrafterInvs(util.grid.at(1, 2, 2), util.grid.at(2, 2, 2)); + scene.world().connectCrafterInvs(util.grid().at(1, 2, 2), util.grid().at(2, 2, 2)); scene.idle(10); - scene.overlay.showSelectionWithText(util.select.fromTo(3, 2, 2, 1, 2, 2) - .add(util.select.position(2, 1, 2)), 80) + scene.overlay().showSelectionWithText(util.select().fromTo(3, 2, 2, 1, 2, 2) + .add(util.select().position(2, 1, 2)), 80) .attachKeyFrame() - .pointAt(util.vector.blockSurface(util.grid.at(2, 2, 2), Direction.NORTH)) + .pointAt(util.vector().blockSurface(util.grid().at(2, 2, 2), Direction.NORTH)) .text("Shared Inputs created with the Wrench at the back can also reach across covered Crafters") .placeNearTarget(); scene.idle(60); ElementLink ingot = - scene.world.createItemEntity(util.vector.centerOf(4, 4, 2), util.vector.of(0, 0.2, 0), iron); + scene.world().createItemEntity(util.vector().centerOf(4, 4, 2), util.vector().of(0, 0.2, 0), iron); scene.idle(17); - scene.world.modifyEntity(ingot, Entity::discard); - scene.world.modifyBlockEntity(util.grid.at(3, 2, 2), type, mct -> mct.getInventory() + scene.world().modifyEntity(ingot, Entity::discard); + scene.world().modifyBlockEntity(util.grid().at(3, 2, 2), type, mct -> mct.getInventory() .insertItem(0, iron.copy(), false)); - ingot = scene.world.createItemEntity(util.vector.centerOf(4, 4, 2), util.vector.of(0, 0.2, 0), iron); + ingot = scene.world().createItemEntity(util.vector().centerOf(4, 4, 2), util.vector().of(0, 0.2, 0), iron); scene.idle(17); - scene.world.modifyEntity(ingot, Entity::discard); - scene.world.modifyBlockEntity(util.grid.at(2, 1, 2), type, mct -> mct.getInventory() + scene.world().modifyEntity(ingot, Entity::discard); + scene.world().modifyBlockEntity(util.grid().at(2, 1, 2), type, mct -> mct.getInventory() .insertItem(0, iron.copy(), false)); - ingot = scene.world.createItemEntity(util.vector.centerOf(4, 4, 2), util.vector.of(0, 0.2, 0), iron); + ingot = scene.world().createItemEntity(util.vector().centerOf(4, 4, 2), util.vector().of(0, 0.2, 0), iron); scene.idle(17); - scene.world.modifyEntity(ingot, Entity::discard); - scene.world.modifyBlockEntity(util.grid.at(1, 2, 2), type, mct -> mct.getInventory() + scene.world().modifyEntity(ingot, Entity::discard); + scene.world().modifyBlockEntity(util.grid().at(1, 2, 2), type, mct -> mct.getInventory() .insertItem(0, iron.copy(), false)); } diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/DeployerScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/DeployerScenes.java index 5c1095097f..c627a4d6d1 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/DeployerScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/DeployerScenes.java @@ -8,10 +8,10 @@ import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import com.simibubi.create.foundation.ponder.element.BeltItemElement; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; import net.createmod.ponder.foundation.ElementLink; import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.SceneBuilder; -import net.createmod.ponder.foundation.SceneBuildingUtil; import net.createmod.ponder.foundation.Selection; import net.createmod.ponder.foundation.element.EntityElement; import net.createmod.ponder.foundation.element.InputWindowElement; @@ -37,57 +37,57 @@ public class DeployerScenes { scene.title("deployer", "Using the Deployer"); scene.configureBasePlate(0, 0, 5); - BlockPos potPosition = util.grid.at(1, 1, 2); - BlockPos deployerPos = util.grid.at(3, 1, 2); - Selection deployerSelection = util.select.position(deployerPos); + BlockPos potPosition = util.grid().at(1, 1, 2); + BlockPos deployerPos = util.grid().at(3, 1, 2); + Selection deployerSelection = util.select().position(deployerPos); - scene.world.setBlock(potPosition, Blocks.AIR.defaultBlockState(), false); - scene.world.showSection(util.select.layer(0) - .add(util.select.position(1, 1, 2)), Direction.UP); + scene.world().setBlock(potPosition, Blocks.AIR.defaultBlockState(), false); + scene.world().showSection(util.select().layer(0) + .add(util.select().position(1, 1, 2)), Direction.UP); scene.idle(5); - scene.world.showSection(util.select.fromTo(3, 1, 3, 3, 1, 5), Direction.DOWN); + scene.world().showSection(util.select().fromTo(3, 1, 3, 3, 1, 5), Direction.DOWN); scene.idle(10); - scene.world.showSection(deployerSelection, Direction.SOUTH); + scene.world().showSection(deployerSelection, Direction.SOUTH); scene.idle(10); - scene.overlay.showText(60) + scene.overlay().showText(60) .placeNearTarget() - .pointAt(util.vector.topOf(deployerPos)) + .pointAt(util.vector().topOf(deployerPos)) .text("Given Rotational Force, a Deployer can imitate player interactions"); - scene.world.moveDeployer(deployerPos, 1, 25); + scene.world().moveDeployer(deployerPos, 1, 25); scene.idle(26); - scene.world.moveDeployer(deployerPos, -1, 25); + scene.world().moveDeployer(deployerPos, -1, 25); scene.idle(44); - scene.overlay.showSelectionWithText(util.select.position(deployerPos.west(2)), 60) + scene.overlay().showSelectionWithText(util.select().position(deployerPos.west(2)), 60) .text("It will always interact with the position 2 blocks in front of itself") .attachKeyFrame() .placeNearTarget() .colored(PonderPalette.GREEN) .attachKeyFrame(); - scene.world.moveDeployer(deployerPos, 1, 25); + scene.world().moveDeployer(deployerPos, 1, 25); scene.idle(26); - scene.world.moveDeployer(deployerPos, -1, 25); + scene.world().moveDeployer(deployerPos, -1, 25); scene.idle(20); - scene.world.showSection(util.select.fromTo(2, 1, 3, 2, 1, 1), Direction.DOWN); + scene.world().showSection(util.select().fromTo(2, 1, 3, 2, 1, 1), Direction.DOWN); scene.idle(24); - scene.overlay.showText(50) - .pointAt(util.vector.topOf(deployerPos.west())) + scene.overlay().showText(50) + .pointAt(util.vector().topOf(deployerPos.west())) .text("Blocks directly in front will not obstruct it") .placeNearTarget(); - scene.world.moveDeployer(deployerPos, 1, 25); + scene.world().moveDeployer(deployerPos, 1, 25); scene.idle(26); - scene.world.moveDeployer(deployerPos, -1, 25); + scene.world().moveDeployer(deployerPos, -1, 25); scene.idle(34); - scene.world.hideSection(util.select.fromTo(2, 1, 3, 2, 1, 1), Direction.UP); + scene.world().hideSection(util.select().fromTo(2, 1, 3, 2, 1, 1), Direction.UP); scene.idle(20); String[] actions = new String[] { "Place Blocks,", "Use Items,", "Activate Blocks,", "Harvest blocks", "and Attack Mobs" }; - scene.overlay.showText(80) + scene.overlay().showText(80) .attachKeyFrame() .independent(40) .placeNearTarget() @@ -96,7 +96,7 @@ public class DeployerScenes { int y = 60; for (String s : actions) { scene.idle(15); - scene.overlay.showText(50) + scene.overlay().showText(50) .colored(PonderPalette.MEDIUM) .placeNearTarget() .independent(y) @@ -106,61 +106,61 @@ public class DeployerScenes { scene.idle(50); ItemStack pot = new ItemStack(Items.FLOWER_POT); - Vec3 frontVec = util.vector.blockSurface(deployerPos, Direction.WEST) + Vec3 frontVec = util.vector().blockSurface(deployerPos, Direction.WEST) .add(-.125, 0, 0); - scene.overlay.showControls(new InputWindowElement(frontVec, Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(frontVec, Pointing.DOWN).rightClick() .withItem(pot), 40); scene.idle(7); Class teType = DeployerBlockEntity.class; - scene.world.modifyBlockEntityNBT(deployerSelection, teType, nbt -> nbt.put("HeldItem", pot.serializeNBT())); + scene.world().modifyBlockEntityNBT(deployerSelection, teType, nbt -> nbt.put("HeldItem", pot.serializeNBT())); scene.idle(10); - scene.overlay.showText(40) + scene.overlay().showText(40) .attachKeyFrame() .placeNearTarget() .pointAt(frontVec) .text("Right-click the front to give it an Item to use"); scene.idle(40); - scene.world.moveDeployer(deployerPos, 1, 25); + scene.world().moveDeployer(deployerPos, 1, 25); scene.idle(26); - scene.world.restoreBlocks(util.select.position(potPosition)); - scene.world.modifyBlockEntityNBT(deployerSelection, teType, + scene.world().restoreBlocks(util.select().position(potPosition)); + scene.world().modifyBlockEntityNBT(deployerSelection, teType, nbt -> nbt.put("HeldItem", ItemStack.EMPTY.serializeNBT())); - scene.world.moveDeployer(deployerPos, -1, 25); + scene.world().moveDeployer(deployerPos, -1, 25); scene.idle(20); - scene.world.showSection(util.select.position(deployerPos.above()), Direction.DOWN); + scene.world().showSection(util.select().position(deployerPos.above()), Direction.DOWN); ItemStack tulip = new ItemStack(Items.RED_TULIP); - Vec3 entitySpawn = util.vector.topOf(deployerPos.above(3)); + Vec3 entitySpawn = util.vector().topOf(deployerPos.above(3)); ElementLink entity1 = - scene.world.createItemEntity(entitySpawn, util.vector.of(0, 0.2, 0), tulip); + scene.world().createItemEntity(entitySpawn, util.vector().of(0, 0.2, 0), tulip); scene.idle(17); - scene.world.modifyEntity(entity1, Entity::discard); - scene.world.modifyBlockEntityNBT(deployerSelection, teType, nbt -> nbt.put("HeldItem", tulip.serializeNBT())); + scene.world().modifyEntity(entity1, Entity::discard); + scene.world().modifyBlockEntityNBT(deployerSelection, teType, nbt -> nbt.put("HeldItem", tulip.serializeNBT())); scene.idle(10); - scene.overlay.showText(40) + scene.overlay().showText(40) .placeNearTarget() - .pointAt(util.vector.of(3, 2.5, 3)) + .pointAt(util.vector().of(3, 2.5, 3)) .text("Items can also be inserted automatically"); scene.idle(30); - scene.world.moveDeployer(deployerPos, 1, 25); + scene.world().moveDeployer(deployerPos, 1, 25); scene.idle(26); - scene.world.setBlock(potPosition, Blocks.POTTED_RED_TULIP.defaultBlockState(), false); - scene.world.modifyBlockEntityNBT(deployerSelection, teType, + scene.world().setBlock(potPosition, Blocks.POTTED_RED_TULIP.defaultBlockState(), false); + scene.world().modifyBlockEntityNBT(deployerSelection, teType, nbt -> nbt.put("HeldItem", ItemStack.EMPTY.serializeNBT())); - scene.world.moveDeployer(deployerPos, -1, 25); + scene.world().moveDeployer(deployerPos, -1, 25); scene.idle(25); - scene.world.hideSection(util.select.position(potPosition), Direction.UP); - scene.world.hideSection(util.select.position(deployerPos.above()), Direction.EAST); + scene.world().hideSection(util.select().position(potPosition), Direction.UP); + scene.world().hideSection(util.select().position(deployerPos.above()), Direction.EAST); scene.idle(20); - Vec3 filterSlot = util.vector.topOf(deployerPos) + Vec3 filterSlot = util.vector().topOf(deployerPos) .add(2 / 16f, 0, 0); - scene.overlay.showFilterSlotInput(filterSlot, Direction.UP, 80); - scene.overlay.showText(40) + scene.overlay().showFilterSlotInput(filterSlot, Direction.UP, 80); + scene.overlay().showText(40) .attachKeyFrame() .placeNearTarget() .pointAt(filterSlot) @@ -169,20 +169,20 @@ public class DeployerScenes { ItemStack shears = new ItemStack(Items.SHEARS); - scene.overlay.showControls(new InputWindowElement(filterSlot, Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(filterSlot, Pointing.DOWN).rightClick() .withItem(shears), 40); scene.idle(7); - scene.world.setFilterData(deployerSelection, teType, shears); - scene.overlay.showText(60) + scene.world().setFilterData(deployerSelection, teType, shears); + scene.overlay().showText(60) .placeNearTarget() .pointAt(filterSlot) .text("When a filter is set, it activates only while holding a matching item"); scene.idle(70); - ElementLink sheep = scene.world.createEntity(w -> { + ElementLink sheep = scene.world().createEntity(w -> { Sheep entity = EntityType.SHEEP.create(w); entity.setColor(DyeColor.PINK); - Vec3 p = util.vector.topOf(util.grid.at(1, 0, 2)); + Vec3 p = util.vector().topOf(util.grid().at(1, 0, 2)); entity.setPos(p.x, p.y, p.z); entity.xo = p.x; entity.yo = p.y; @@ -195,45 +195,45 @@ public class DeployerScenes { return entity; }); scene.idle(20); - scene.world.showSection(util.select.position(deployerPos.above()), Direction.WEST); - entity1 = scene.world.createItemEntity(entitySpawn, util.vector.of(0, 0.2, 0), shears); + scene.world().showSection(util.select().position(deployerPos.above()), Direction.WEST); + entity1 = scene.world().createItemEntity(entitySpawn, util.vector().of(0, 0.2, 0), shears); scene.idle(17); - scene.world.modifyEntity(entity1, Entity::discard); - scene.world.modifyBlockEntityNBT(deployerSelection, teType, nbt -> nbt.put("HeldItem", shears.serializeNBT())); + scene.world().modifyEntity(entity1, Entity::discard); + scene.world().modifyBlockEntityNBT(deployerSelection, teType, nbt -> nbt.put("HeldItem", shears.serializeNBT())); scene.idle(10); - scene.overlay.showText(60) + scene.overlay().showText(60) .placeNearTarget() - .pointAt(util.vector.of(3, 2.5, 3)) + .pointAt(util.vector().of(3, 2.5, 3)) .text("Only items matching the filter can now be inserted..."); scene.idle(70); - scene.world.moveDeployer(deployerPos, 1, 25); + scene.world().moveDeployer(deployerPos, 1, 25); scene.idle(26); - scene.world.modifyEntity(sheep, e -> ((Sheep) e).setSheared(true)); - scene.effects.emitParticles(util.vector.topOf(deployerPos.west(2)) + scene.world().modifyEntity(sheep, e -> ((Sheep) e).setSheared(true)); + scene.effects().emitParticles(util.vector().topOf(deployerPos.west(2)) .add(0, -.25, 0), - Emitter.withinBlockSpace(new BlockParticleOption(ParticleTypes.BLOCK, Blocks.PINK_WOOL.defaultBlockState()), - util.vector.of(0, 0, 0)), - 25, 1); - scene.world.moveDeployer(deployerPos, -1, 25); - scene.world.showSection(util.select.position(deployerPos.north()), Direction.SOUTH); + Emitter.withinBlockSpace(new BlockParticleOption(ParticleTypes.BLOCK, Blocks.PINK_WOOL.defaultBlockState()), + util.vector().of(0, 0, 0)), + 25, 1); + scene.world().moveDeployer(deployerPos, -1, 25); + scene.world().showSection(util.select().position(deployerPos.north()), Direction.SOUTH); scene.idle(25); - scene.overlay.showText(80) + scene.overlay().showText(80) .placeNearTarget() - .pointAt(util.vector.of(3.5, 1.25, 1.25)) + .pointAt(util.vector().of(3.5, 1.25, 1.25)) .text("...and only non-matching items will be extracted"); - scene.world.flapFunnel(deployerPos.north(), true); - scene.world.createItemEntity(util.vector.centerOf(deployerPos.north()) - .subtract(0, .45, 0), util.vector.of(0, 0, -0.1), new ItemStack(Items.PINK_WOOL)); + scene.world().flapFunnel(deployerPos.north(), true); + scene.world().createItemEntity(util.vector().centerOf(deployerPos.north()) + .subtract(0, .45, 0), util.vector().of(0, 0, -0.1), new ItemStack(Items.PINK_WOOL)); scene.markAsFinished(); for (int i = 0; i < 10; i++) { scene.idle(26); - scene.world.moveDeployer(deployerPos, 1, 25); + scene.world().moveDeployer(deployerPos, 1, 25); scene.idle(26); - scene.world.moveDeployer(deployerPos, -1, 25); + scene.world().moveDeployer(deployerPos, -1, 25); scene.idle(26); } } @@ -242,70 +242,70 @@ public class DeployerScenes { CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("deployer_modes", "Modes of the Deployer"); scene.configureBasePlate(0, 0, 5); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); scene.idle(5); - scene.world.showSection(util.select.fromTo(3, 1, 3, 3, 1, 5), Direction.DOWN); + scene.world().showSection(util.select().fromTo(3, 1, 3, 3, 1, 5), Direction.DOWN); scene.idle(10); - BlockPos deployerPos = util.grid.at(3, 1, 2); - Vec3 frontVec = util.vector.blockSurface(deployerPos, Direction.WEST) + BlockPos deployerPos = util.grid().at(3, 1, 2); + Vec3 frontVec = util.vector().blockSurface(deployerPos, Direction.WEST) .add(-.125, 0, 0); - Selection grassBlock = util.select.position(1, 1, 2); + Selection grassBlock = util.select().position(1, 1, 2); - Selection deployerSelection = util.select.position(deployerPos); - scene.world.showSection(deployerSelection, Direction.DOWN); + Selection deployerSelection = util.select().position(deployerPos); + scene.world().showSection(deployerSelection, Direction.DOWN); scene.idle(10); - scene.world.showSection(grassBlock, Direction.DOWN); + scene.world().showSection(grassBlock, Direction.DOWN); scene.idle(10); ItemStack tool = new ItemStack(Items.GOLDEN_HOE); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(deployerPos), Pointing.DOWN).withItem(tool), - 30); + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(deployerPos), Pointing.DOWN).withItem(tool), + 30); scene.idle(7); - scene.world.modifyBlockEntityNBT(deployerSelection, DeployerBlockEntity.class, + scene.world().modifyBlockEntityNBT(deployerSelection, DeployerBlockEntity.class, nbt -> nbt.put("HeldItem", tool.serializeNBT())); scene.idle(45); - scene.world.setKineticSpeed(util.select.position(2, 0, 5), 16); - scene.world.setKineticSpeed(util.select.layer(1), -32); - scene.world.moveDeployer(deployerPos, 1, 25); + scene.world().setKineticSpeed(util.select().position(2, 0, 5), 16); + scene.world().setKineticSpeed(util.select().layer(1), -32); + scene.world().moveDeployer(deployerPos, 1, 25); - scene.overlay.showText(60) + scene.overlay().showText(60) .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.topOf(1, 1, 2)) + .pointAt(util.vector().topOf(1, 1, 2)) .text("By default, a Deployer imitates a Right-click interaction"); scene.idle(26); - scene.world.replaceBlocks(grassBlock, Blocks.FARMLAND.defaultBlockState(), false); - scene.world.moveDeployer(deployerPos, -1, 25); + scene.world().replaceBlocks(grassBlock, Blocks.FARMLAND.defaultBlockState(), false); + scene.world().moveDeployer(deployerPos, -1, 25); scene.idle(46); - scene.overlay.showControls(new InputWindowElement(frontVec, Pointing.LEFT).rightClick() + scene.overlay().showControls(new InputWindowElement(frontVec, Pointing.LEFT).rightClick() .withItem(AllItems.WRENCH.asStack()), 40); scene.idle(7); - scene.world.modifyBlockEntityNBT(deployerSelection, DeployerBlockEntity.class, + scene.world().modifyBlockEntityNBT(deployerSelection, DeployerBlockEntity.class, nbt -> nbt.putString("Mode", "PUNCH")); scene.idle(45); - scene.overlay.showText(60) + scene.overlay().showText(60) .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.topOf(1, 1, 2)) + .pointAt(util.vector().topOf(1, 1, 2)) .text("Using a Wrench, it can be set to imitate a Left-click instead"); BlockPos breakingPos = deployerPos.west(2); for (int i = 0; i < 4; i++) { scene.idle(26); - scene.world.moveDeployer(deployerPos, 1, 25); + scene.world().moveDeployer(deployerPos, 1, 25); scene.idle(26); - scene.world.incrementBlockBreakingProgress(breakingPos); - scene.world.incrementBlockBreakingProgress(breakingPos); - scene.world.incrementBlockBreakingProgress(breakingPos); - scene.world.moveDeployer(deployerPos, -1, 25); + scene.world().incrementBlockBreakingProgress(breakingPos); + scene.world().incrementBlockBreakingProgress(breakingPos); + scene.world().incrementBlockBreakingProgress(breakingPos); + scene.world().moveDeployer(deployerPos, -1, 25); if (i == 3) - scene.world.createItemEntity(util.vector.centerOf(breakingPos), util.vector.of(0, 0, 0), - new ItemStack(Blocks.DIRT)); + scene.world().createItemEntity(util.vector().centerOf(breakingPos), util.vector().of(0, 0, 0), + new ItemStack(Blocks.DIRT)); scene.idle(26); if (i == 0) @@ -317,183 +317,183 @@ public class DeployerScenes { CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("deployer_processing", "Processing Items using Deployers"); scene.configureBasePlate(0, 0, 5); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); scene.idle(5); ElementLink depot = - scene.world.showIndependentSection(util.select.position(2, 1, 1), Direction.DOWN); - scene.world.moveSection(depot, util.vector.of(0, 0, 1), 0); + scene.world().showIndependentSection(util.select().position(2, 1, 1), Direction.DOWN); + scene.world().moveSection(depot, util.vector().of(0, 0, 1), 0); scene.idle(10); - Selection pressS = util.select.position(2, 3, 2); - BlockPos pressPos = util.grid.at(2, 3, 2); - BlockPos depotPos = util.grid.at(2, 1, 1); - scene.world.setKineticSpeed(pressS, 0); - scene.world.showSection(pressS, Direction.DOWN); + Selection pressS = util.select().position(2, 3, 2); + BlockPos pressPos = util.grid().at(2, 3, 2); + BlockPos depotPos = util.grid().at(2, 1, 1); + scene.world().setKineticSpeed(pressS, 0); + scene.world().showSection(pressS, Direction.DOWN); scene.idle(10); - scene.world.showSection(util.select.fromTo(2, 1, 3, 2, 1, 5), Direction.NORTH); + scene.world().showSection(util.select().fromTo(2, 1, 3, 2, 1, 5), Direction.NORTH); scene.idle(3); - scene.world.showSection(util.select.position(2, 2, 3), Direction.SOUTH); + scene.world().showSection(util.select().position(2, 2, 3), Direction.SOUTH); scene.idle(3); - scene.world.showSection(util.select.position(2, 3, 3), Direction.NORTH); - scene.world.setKineticSpeed(pressS, -32); - scene.effects.indicateSuccess(pressPos); + scene.world().showSection(util.select().position(2, 3, 3), Direction.NORTH); + scene.world().setKineticSpeed(pressS, -32); + scene.effects().indicateSuccess(pressPos); scene.idle(10); ItemStack tool = AllItems.SAND_PAPER.asStack(); - scene.overlay.showControls(new InputWindowElement(util.vector.blockSurface(pressPos.below(), Direction.EAST) + scene.overlay().showControls(new InputWindowElement(util.vector().blockSurface(pressPos.below(), Direction.EAST) .add(0, 0.15, 0), Pointing.RIGHT).withItem(tool), 30); scene.idle(7); - scene.world.modifyBlockEntityNBT(pressS, DeployerBlockEntity.class, + scene.world().modifyBlockEntityNBT(pressS, DeployerBlockEntity.class, nbt -> nbt.put("HeldItem", tool.serializeNBT())); scene.idle(25); - Vec3 pressSide = util.vector.blockSurface(pressPos, Direction.WEST); - scene.overlay.showText(60) + Vec3 pressSide = util.vector().blockSurface(pressPos, Direction.WEST); + scene.overlay().showText(60) .pointAt(pressSide) .placeNearTarget() .attachKeyFrame() .text("With a fitting held item, Deployers can process items provided beneath them"); scene.idle(80); - scene.overlay.showText(60) + scene.overlay().showText(60) .pointAt(pressSide.subtract(0, 2, 0)) .placeNearTarget() .text("The Input items can be dropped or placed on a Depot under the Deployer"); scene.idle(50); ItemStack quartz = AllItems.ROSE_QUARTZ.asStack(); - scene.world.createItemOnBeltLike(depotPos, Direction.NORTH, quartz); - Vec3 depotCenter = util.vector.centerOf(depotPos.south()); - scene.overlay.showControls(new InputWindowElement(depotCenter, Pointing.UP).withItem(quartz), 30); + scene.world().createItemOnBeltLike(depotPos, Direction.NORTH, quartz); + Vec3 depotCenter = util.vector().centerOf(depotPos.south()); + scene.overlay().showControls(new InputWindowElement(depotCenter, Pointing.UP).withItem(quartz), 30); scene.idle(10); - Vec3 targetV = util.vector.centerOf(pressPos) + Vec3 targetV = util.vector().centerOf(pressPos) .subtract(0, 1.65, 0); - scene.world.moveDeployer(pressPos, 1, 30); + scene.world().moveDeployer(pressPos, 1, 30); scene.idle(30); - scene.world.moveDeployer(pressPos, -1, 30); - scene.debug.enqueueCallback(s -> SandPaperItem.spawnParticles(targetV, quartz, s.getWorld())); + scene.world().moveDeployer(pressPos, -1, 30); + scene.debug().enqueueCallback(s -> SandPaperItem.spawnParticles(targetV, quartz, s.getWorld())); // particle - scene.world.removeItemsFromBelt(depotPos); + scene.world().removeItemsFromBelt(depotPos); ItemStack polished = AllItems.POLISHED_ROSE_QUARTZ.asStack(); - scene.world.createItemOnBeltLike(depotPos, Direction.UP, polished); + scene.world().createItemOnBeltLike(depotPos, Direction.UP, polished); scene.idle(10); - scene.overlay.showControls(new InputWindowElement(depotCenter, Pointing.UP).withItem(polished), 50); + scene.overlay().showControls(new InputWindowElement(depotCenter, Pointing.UP).withItem(polished), 50); scene.idle(60); - scene.world.hideIndependentSection(depot, Direction.NORTH); + scene.world().hideIndependentSection(depot, Direction.NORTH); scene.idle(5); - scene.world.showSection(util.select.fromTo(0, 1, 3, 0, 2, 3), Direction.DOWN); + scene.world().showSection(util.select().fromTo(0, 1, 3, 0, 2, 3), Direction.DOWN); scene.idle(10); - scene.world.showSection(util.select.fromTo(4, 1, 2, 0, 2, 2), Direction.SOUTH); + scene.world().showSection(util.select().fromTo(4, 1, 2, 0, 2, 2), Direction.SOUTH); scene.idle(20); - BlockPos beltPos = util.grid.at(0, 1, 2); - scene.overlay.showText(40) - .pointAt(util.vector.blockSurface(beltPos, Direction.WEST)) + BlockPos beltPos = util.grid().at(0, 1, 2); + scene.overlay().showText(40) + .pointAt(util.vector().blockSurface(beltPos, Direction.WEST)) .placeNearTarget() .attachKeyFrame() .text("When items are provided on a belt..."); scene.idle(30); - ElementLink ingot = scene.world.createItemOnBelt(beltPos, Direction.SOUTH, quartz); + ElementLink ingot = scene.world().createItemOnBelt(beltPos, Direction.SOUTH, quartz); scene.idle(15); - ElementLink ingot2 = scene.world.createItemOnBelt(beltPos, Direction.SOUTH, quartz); + ElementLink ingot2 = scene.world().createItemOnBelt(beltPos, Direction.SOUTH, quartz); scene.idle(15); - scene.world.stallBeltItem(ingot, true); - scene.world.moveDeployer(pressPos, 1, 30); + scene.world().stallBeltItem(ingot, true); + scene.world().moveDeployer(pressPos, 1, 30); - scene.overlay.showText(50) + scene.overlay().showText(50) .pointAt(pressSide) .placeNearTarget() .attachKeyFrame() .text("The Deployer will hold and process them automatically"); scene.idle(30); - scene.world.moveDeployer(pressPos, -1, 30); - scene.debug.enqueueCallback(s -> SandPaperItem.spawnParticles(targetV, quartz, s.getWorld())); - scene.world.removeItemsFromBelt(pressPos.below(2)); - ingot = scene.world.createItemOnBelt(pressPos.below(2), Direction.UP, polished); - scene.world.stallBeltItem(ingot, true); + scene.world().moveDeployer(pressPos, -1, 30); + scene.debug().enqueueCallback(s -> SandPaperItem.spawnParticles(targetV, quartz, s.getWorld())); + scene.world().removeItemsFromBelt(pressPos.below(2)); + ingot = scene.world().createItemOnBelt(pressPos.below(2), Direction.UP, polished); + scene.world().stallBeltItem(ingot, true); scene.idle(15); - scene.world.stallBeltItem(ingot, false); + scene.world().stallBeltItem(ingot, false); scene.idle(15); - scene.world.stallBeltItem(ingot2, true); - scene.world.moveDeployer(pressPos, 1, 30); + scene.world().stallBeltItem(ingot2, true); + scene.world().moveDeployer(pressPos, 1, 30); scene.idle(30); - scene.world.moveDeployer(pressPos, -1, 30); - scene.debug.enqueueCallback(s -> SandPaperItem.spawnParticles(targetV, quartz, s.getWorld())); - scene.world.removeItemsFromBelt(pressPos.below(2)); - ingot2 = scene.world.createItemOnBelt(pressPos.below(2), Direction.UP, polished); - scene.world.stallBeltItem(ingot2, true); + scene.world().moveDeployer(pressPos, -1, 30); + scene.debug().enqueueCallback(s -> SandPaperItem.spawnParticles(targetV, quartz, s.getWorld())); + scene.world().removeItemsFromBelt(pressPos.below(2)); + ingot2 = scene.world().createItemOnBelt(pressPos.below(2), Direction.UP, polished); + scene.world().stallBeltItem(ingot2, true); scene.idle(15); - scene.world.stallBeltItem(ingot2, false); + scene.world().stallBeltItem(ingot2, false); } public static void redstone(SceneBuilder builder, SceneBuildingUtil util) { CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("deployer_redstone", "Controlling Deployers with Redstone"); scene.configureBasePlate(0, 0, 5); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); scene.idle(5); - scene.world.showSection(util.select.fromTo(3, 1, 5, 3, 1, 3), Direction.DOWN); + scene.world().showSection(util.select().fromTo(3, 1, 5, 3, 1, 3), Direction.DOWN); - BlockPos deployerPos = util.grid.at(3, 1, 3); - Selection redstone = util.select.fromTo(3, 1, 1, 3, 1, 2); - BlockPos leverPos = util.grid.at(3, 1, 1); + BlockPos deployerPos = util.grid().at(3, 1, 3); + Selection redstone = util.select().fromTo(3, 1, 1, 3, 1, 2); + BlockPos leverPos = util.grid().at(3, 1, 1); - scene.world.toggleRedstonePower(redstone); + scene.world().toggleRedstonePower(redstone); scene.idle(26); - scene.world.moveDeployer(deployerPos, 1, 30); + scene.world().moveDeployer(deployerPos, 1, 30); scene.idle(31); - scene.world.moveDeployer(deployerPos, -1, 30); - scene.world.showSection(redstone, Direction.SOUTH); + scene.world().moveDeployer(deployerPos, -1, 30); + scene.world().showSection(redstone, Direction.SOUTH); scene.idle(31); - scene.world.toggleRedstonePower(redstone); - scene.effects.indicateRedstone(leverPos); + scene.world().toggleRedstonePower(redstone); + scene.effects().indicateRedstone(leverPos); scene.idle(10); - scene.overlay.showText(60) + scene.overlay().showText(60) .colored(PonderPalette.RED) .attachKeyFrame() - .pointAt(util.vector.topOf(deployerPos)) + .pointAt(util.vector().topOf(deployerPos)) .placeNearTarget() .text("When powered by Redstone, Deployers will not activate"); scene.idle(70); - scene.world.toggleRedstonePower(redstone); + scene.world().toggleRedstonePower(redstone); scene.idle(10); - scene.world.moveDeployer(deployerPos, 1f, 30); + scene.world().moveDeployer(deployerPos, 1f, 30); scene.idle(10); - scene.world.toggleRedstonePower(redstone); - scene.effects.indicateRedstone(leverPos); + scene.world().toggleRedstonePower(redstone); + scene.effects().indicateRedstone(leverPos); scene.idle(21); - scene.overlay.showText(60) - .pointAt(util.vector.topOf(deployerPos)) + scene.overlay().showText(60) + .pointAt(util.vector().topOf(deployerPos)) .placeNearTarget() .text("Before stopping, the Deployer will finish any started cycles"); - scene.world.moveDeployer(deployerPos, -1f, 30); + scene.world().moveDeployer(deployerPos, -1f, 30); scene.idle(70); - scene.world.toggleRedstonePower(redstone); + scene.world().toggleRedstonePower(redstone); scene.idle(3); - scene.world.toggleRedstonePower(redstone); - scene.effects.indicateRedstone(leverPos); - scene.world.moveDeployer(deployerPos, 1, 30); - scene.overlay.showText(100) + scene.world().toggleRedstonePower(redstone); + scene.effects().indicateRedstone(leverPos); + scene.world().moveDeployer(deployerPos, 1, 30); + scene.overlay().showText(100) .colored(PonderPalette.GREEN) .attachKeyFrame() - .pointAt(util.vector.topOf(deployerPos)) + .pointAt(util.vector().topOf(deployerPos)) .placeNearTarget() .text("Thus, a negative pulse can be used to trigger exactly one activation cycle"); scene.idle(31); - scene.world.moveDeployer(deployerPos, -1, 30); + scene.world().moveDeployer(deployerPos, -1, 30); scene.idle(40); } @@ -503,65 +503,65 @@ public class DeployerScenes { scene.title("deployer_contraption", "Using Deployers on Contraptions"); scene.configureBasePlate(0, 0, 6); scene.scaleSceneView(.9f); - Selection flowers = util.select.fromTo(4, 1, 1, 1, 1, 1); - scene.world.replaceBlocks(flowers, Blocks.AIR.defaultBlockState(), false); + Selection flowers = util.select().fromTo(4, 1, 1, 1, 1, 1); + scene.world().replaceBlocks(flowers, Blocks.AIR.defaultBlockState(), false); - Selection kinetics = util.select.fromTo(5, 1, 6, 5, 1, 3); - BlockPos deployerPos = util.grid.at(4, 1, 3); - Selection deployerSelection = util.select.position(deployerPos); + Selection kinetics = util.select().fromTo(5, 1, 6, 5, 1, 3); + BlockPos deployerPos = util.grid().at(4, 1, 3); + Selection deployerSelection = util.select().position(deployerPos); - scene.world.cycleBlockProperty(deployerPos, DeployerBlock.AXIS_ALONG_FIRST_COORDINATE); + scene.world().cycleBlockProperty(deployerPos, DeployerBlock.AXIS_ALONG_FIRST_COORDINATE); - scene.world.showSection(util.select.layer(0) + scene.world().showSection(util.select().layer(0) .add(flowers), Direction.UP); scene.idle(5); ElementLink pistonHead = - scene.world.showIndependentSection(util.select.fromTo(5, 1, 2, 8, 1, 2), Direction.DOWN); - scene.world.moveSection(pistonHead, util.vector.of(0, 0, 1), 0); - scene.world.showSection(kinetics, Direction.DOWN); + scene.world().showIndependentSection(util.select().fromTo(5, 1, 2, 8, 1, 2), Direction.DOWN); + scene.world().moveSection(pistonHead, util.vector().of(0, 0, 1), 0); + scene.world().showSection(kinetics, Direction.DOWN); scene.idle(5); ElementLink contraption = - scene.world.showIndependentSection(deployerSelection, Direction.DOWN); + scene.world().showIndependentSection(deployerSelection, Direction.DOWN); scene.idle(5); - scene.world.glueBlockOnto(util.grid.at(4, 2, 3), Direction.DOWN, contraption); + scene.world().glueBlockOnto(util.grid().at(4, 2, 3), Direction.DOWN, contraption); - scene.overlay.showText(60) + scene.overlay().showText(60) .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.blockSurface(deployerPos, Direction.WEST)) + .pointAt(util.vector().blockSurface(deployerPos, Direction.WEST)) .text("Whenever Deployers are moved as part of an animated Contraption..."); scene.idle(70); - scene.world.setKineticSpeed(util.select.position(4, 0, 6), -8); - scene.world.setKineticSpeed(kinetics, 16); - scene.world.moveSection(pistonHead, util.vector.of(-3, 0, 0), 100); - scene.world.moveSection(contraption, util.vector.of(-3, 0, 0), 100); + scene.world().setKineticSpeed(util.select().position(4, 0, 6), -8); + scene.world().setKineticSpeed(kinetics, 16); + scene.world().moveSection(pistonHead, util.vector().of(-3, 0, 0), 100); + scene.world().moveSection(contraption, util.vector().of(-3, 0, 0), 100); for (int x = 0; x < 4; x++) { - scene.world.moveDeployer(deployerPos, 1, 9); + scene.world().moveDeployer(deployerPos, 1, 9); scene.idle(10); - scene.world.moveDeployer(deployerPos, -1, 9); - scene.world.restoreBlocks(util.select.position(4 - x, 1, 1)); + scene.world().moveDeployer(deployerPos, -1, 9); + scene.world().restoreBlocks(util.select().position(4 - x, 1, 1)); scene.idle(18); } - scene.overlay.showSelectionWithText(flowers, 90) + scene.overlay().showSelectionWithText(flowers, 90) .attachKeyFrame() .colored(PonderPalette.GREEN) .text("They activate at each visited location, using items from inventories anywhere on the contraption"); scene.idle(100); - scene.world.hideSection(flowers, Direction.UP); + scene.world().hideSection(flowers, Direction.UP); scene.idle(15); - scene.world.replaceBlocks(flowers, Blocks.AIR.defaultBlockState(), false); - scene.world.showSection(flowers, Direction.UP); + scene.world().replaceBlocks(flowers, Blocks.AIR.defaultBlockState(), false); + scene.world().showSection(flowers, Direction.UP); - Vec3 filterSlot = util.vector.blockSurface(deployerPos.west(3), Direction.WEST) + Vec3 filterSlot = util.vector().blockSurface(deployerPos.west(3), Direction.WEST) .add(0, 0, 2 / 16f); - scene.overlay.showFilterSlotInput(filterSlot, Direction.WEST, 80); - scene.overlay.showText(60) + scene.overlay().showFilterSlotInput(filterSlot, Direction.WEST, 80); + scene.overlay().showText(60) .attachKeyFrame() .placeNearTarget() .pointAt(filterSlot) @@ -569,21 +569,21 @@ public class DeployerScenes { scene.idle(70); ItemStack poppy = new ItemStack(Items.POPPY); - scene.overlay.showControls(new InputWindowElement(filterSlot, Pointing.DOWN).withItem(poppy), 30); + scene.overlay().showControls(new InputWindowElement(filterSlot, Pointing.DOWN).withItem(poppy), 30); scene.idle(7); - scene.world.setFilterData(deployerSelection, DeployerBlockEntity.class, poppy); + scene.world().setFilterData(deployerSelection, DeployerBlockEntity.class, poppy); scene.idle(25); - scene.world.setKineticSpeed(util.select.position(4, 0, 6), 8); - scene.world.setKineticSpeed(kinetics, -16); - scene.world.moveSection(pistonHead, util.vector.of(3, 0, 0), 100); - scene.world.moveSection(contraption, util.vector.of(3, 0, 0), 100); + scene.world().setKineticSpeed(util.select().position(4, 0, 6), 8); + scene.world().setKineticSpeed(kinetics, -16); + scene.world().moveSection(pistonHead, util.vector().of(3, 0, 0), 100); + scene.world().moveSection(contraption, util.vector().of(3, 0, 0), 100); for (int x = 0; x < 4; x++) { - scene.world.moveDeployer(deployerPos, 1, 9); + scene.world().moveDeployer(deployerPos, 1, 9); scene.idle(10); - scene.world.moveDeployer(deployerPos, -1, 9); - scene.world.setBlock(util.grid.at(1 + x, 1, 1), Blocks.POPPY.defaultBlockState(), false); + scene.world().moveDeployer(deployerPos, -1, 9); + scene.world().setBlock(util.grid().at(1 + x, 1, 1), Blocks.POPPY.defaultBlockState(), false); scene.idle(18); } diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/DetectorScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/DetectorScenes.java index 00769090ba..5c0c8f74ff 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/DetectorScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/DetectorScenes.java @@ -5,10 +5,10 @@ import com.simibubi.create.content.redstone.thresholdSwitch.ThresholdSwitchBlock import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; import net.createmod.ponder.foundation.ElementLink; import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.SceneBuilder; -import net.createmod.ponder.foundation.SceneBuildingUtil; import net.createmod.ponder.foundation.Selection; import net.createmod.ponder.foundation.element.InputWindowElement; import net.createmod.ponder.foundation.element.WorldSectionElement; @@ -28,158 +28,158 @@ public class DetectorScenes { scene.showBasePlate(); scene.idle(5); - Selection chuteObserver = util.select.fromTo(0, 1, 4, 0, 2, 4); - Selection chute = util.select.fromTo(1, 1, 4, 1, 3, 4); - Selection pipe = util.select.fromTo(3, 1, 4, 3, 3, 4); - Selection pipeObserver = util.select.fromTo(4, 1, 4, 4, 2, 4); - Selection redstoneDust = util.select.fromTo(1, 1, 2, 0, 1, 2); - Selection belt = util.select.fromTo(1, 1, 1, 3, 1, 1); - Selection chest = util.select.position(2, 1, 0); - Selection amethyst = util.select.position(3, 1, 0); - Selection largeCog = util.select.position(5, 0, 2); - Selection smallCogs = util.select.fromTo(3, 1, 2, 4, 1, 2); - BlockPos observerPos = util.grid.at(2, 1, 2); - BlockPos funnelPos = util.grid.at(3, 2, 1); - Selection funnelChest = util.select.fromTo(4, 1, 1, 4, 2, 1); + Selection chuteObserver = util.select().fromTo(0, 1, 4, 0, 2, 4); + Selection chute = util.select().fromTo(1, 1, 4, 1, 3, 4); + Selection pipe = util.select().fromTo(3, 1, 4, 3, 3, 4); + Selection pipeObserver = util.select().fromTo(4, 1, 4, 4, 2, 4); + Selection redstoneDust = util.select().fromTo(1, 1, 2, 0, 1, 2); + Selection belt = util.select().fromTo(1, 1, 1, 3, 1, 1); + Selection chest = util.select().position(2, 1, 0); + Selection amethyst = util.select().position(3, 1, 0); + Selection largeCog = util.select().position(5, 0, 2); + Selection smallCogs = util.select().fromTo(3, 1, 2, 4, 1, 2); + BlockPos observerPos = util.grid().at(2, 1, 2); + BlockPos funnelPos = util.grid().at(3, 2, 1); + Selection funnelChest = util.select().fromTo(4, 1, 1, 4, 2, 1); - scene.world.showSection(util.select.position(observerPos), Direction.DOWN); + scene.world().showSection(util.select().position(observerPos), Direction.DOWN); scene.idle(10); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("Smart Observers can be used to detect a variety of events") - .pointAt(util.vector.blockSurface(observerPos, Direction.WEST)) + .pointAt(util.vector().blockSurface(observerPos, Direction.WEST)) .placeNearTarget(); scene.idle(50); - scene.world.showSection(redstoneDust, Direction.EAST); + scene.world().showSection(redstoneDust, Direction.EAST); scene.idle(5); - ElementLink chestLink = scene.world.showIndependentSection(chest, Direction.SOUTH); - scene.world.moveSection(chestLink, util.vector.of(0, 0, 1), 0); + ElementLink chestLink = scene.world().showIndependentSection(chest, Direction.SOUTH); + scene.world().moveSection(chestLink, util.vector().of(0, 0, 1), 0); scene.idle(15); ItemStack copperIngot = new ItemStack(Items.COPPER_INGOT); ItemStack amethystItem = new ItemStack(Blocks.AMETHYST_BLOCK); - scene.overlay.showControls( - new InputWindowElement(util.vector.blockSurface(observerPos.north(), Direction.NORTH), Pointing.RIGHT) + scene.overlay().showControls( + new InputWindowElement(util.vector().blockSurface(observerPos.north(), Direction.NORTH), Pointing.RIGHT) .withItem(copperIngot), 40); scene.idle(7); - scene.world.toggleRedstonePower(util.select.position(observerPos)); - scene.world.toggleRedstonePower(redstoneDust); - scene.effects.indicateRedstone(observerPos); + scene.world().toggleRedstonePower(util.select().position(observerPos)); + scene.world().toggleRedstonePower(redstoneDust); + scene.effects().indicateRedstone(observerPos); scene.idle(15); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("It can detect items or fluids inside of generic containers") .attachKeyFrame() - .pointAt(util.vector.blockSurface(observerPos, Direction.WEST)) + .pointAt(util.vector().blockSurface(observerPos, Direction.WEST)) .placeNearTarget(); scene.idle(65); - scene.overlay.showCenteredScrollInput(observerPos, Direction.UP, 10); + scene.overlay().showCenteredScrollInput(observerPos, Direction.UP, 10); scene.idle(5); - scene.overlay.showControls( - new InputWindowElement(util.vector.blockSurface(observerPos, Direction.UP), Pointing.DOWN).rightClick() + scene.overlay().showControls( + new InputWindowElement(util.vector().blockSurface(observerPos, Direction.UP), Pointing.DOWN).rightClick() .withItem(amethystItem), 60); scene.idle(7); - scene.world.setFilterData(util.select.position(observerPos), SmartObserverBlockEntity.class, amethystItem); - scene.world.toggleRedstonePower(util.select.position(observerPos)); - scene.world.toggleRedstonePower(redstoneDust); + scene.world().setFilterData(util.select().position(observerPos), SmartObserverBlockEntity.class, amethystItem); + scene.world().toggleRedstonePower(util.select().position(observerPos)); + scene.world().toggleRedstonePower(redstoneDust); scene.idle(25); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("The filter slot can be used to look for specific contents only") .attachKeyFrame() - .pointAt(util.vector.blockSurface(observerPos, Direction.UP)) + .pointAt(util.vector().blockSurface(observerPos, Direction.UP)) .placeNearTarget(); scene.idle(50); - scene.world.hideIndependentSection(chestLink, Direction.EAST); + scene.world().hideIndependentSection(chestLink, Direction.EAST); scene.idle(10); - ElementLink amethystLink = scene.world.showIndependentSection(amethyst, Direction.EAST); - scene.world.moveSection(amethystLink, util.vector.of(-1, 0, 1), 0); + ElementLink amethystLink = scene.world().showIndependentSection(amethyst, Direction.EAST); + scene.world().moveSection(amethystLink, util.vector().of(-1, 0, 1), 0); scene.idle(15); - scene.world.toggleRedstonePower(util.select.position(observerPos)); - scene.world.toggleRedstonePower(redstoneDust); - scene.effects.indicateRedstone(observerPos); + scene.world().toggleRedstonePower(util.select().position(observerPos)); + scene.world().toggleRedstonePower(redstoneDust); + scene.effects().indicateRedstone(observerPos); scene.idle(15); - scene.overlay.showText(50) + scene.overlay().showText(50) .text("It also activates when the block itself matches the filter") .attachKeyFrame() - .pointAt(util.vector.blockSurface(observerPos.north(), Direction.WEST)) + .pointAt(util.vector().blockSurface(observerPos.north(), Direction.WEST)) .placeNearTarget(); scene.idle(45); - scene.world.hideIndependentSection(amethystLink, Direction.EAST); - scene.world.toggleRedstonePower(util.select.position(observerPos)); - scene.world.toggleRedstonePower(redstoneDust); + scene.world().hideIndependentSection(amethystLink, Direction.EAST); + scene.world().toggleRedstonePower(util.select().position(observerPos)); + scene.world().toggleRedstonePower(redstoneDust); scene.idle(15); - scene.world.showSection(largeCog, Direction.UP); + scene.world().showSection(largeCog, Direction.UP); scene.idle(5); - scene.world.showSection(smallCogs, Direction.DOWN); - scene.world.showSection(belt, Direction.SOUTH); + scene.world().showSection(smallCogs, Direction.DOWN); + scene.world().showSection(belt, Direction.SOUTH); scene.idle(15); - scene.world.setFilterData(util.select.position(0, 2, 4), SmartObserverBlockEntity.class, copperIngot); - scene.world.showSection(chuteObserver, Direction.DOWN); + scene.world().setFilterData(util.select().position(0, 2, 4), SmartObserverBlockEntity.class, copperIngot); + scene.world().showSection(chuteObserver, Direction.DOWN); scene.idle(2); - scene.world.setFilterData(util.select.position(4, 2, 4), SmartObserverBlockEntity.class, - new ItemStack(Items.LAVA_BUCKET)); - scene.world.showSection(pipeObserver, Direction.DOWN); + scene.world().setFilterData(util.select().position(4, 2, 4), SmartObserverBlockEntity.class, + new ItemStack(Items.LAVA_BUCKET)); + scene.world().showSection(pipeObserver, Direction.DOWN); scene.idle(5); - scene.world.showSection(chute, Direction.WEST); + scene.world().showSection(chute, Direction.WEST); scene.idle(2); - scene.world.showSection(pipe, Direction.EAST); + scene.world().showSection(pipe, Direction.EAST); scene.idle(10); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("Additionally, smart observers can monitor belts, chutes and pipes") .attachKeyFrame() - .pointAt(util.vector.blockSurface(observerPos, Direction.UP)) + .pointAt(util.vector().blockSurface(observerPos, Direction.UP)) .placeNearTarget(); scene.idle(60); - scene.world.createItemOnBelt(util.grid.at(3, 1, 1), Direction.EAST, amethystItem); + scene.world().createItemOnBelt(util.grid().at(3, 1, 1), Direction.EAST, amethystItem); scene.idle(15); - scene.world.toggleRedstonePower(util.select.position(observerPos)); - scene.world.toggleRedstonePower(redstoneDust); - scene.effects.indicateRedstone(observerPos); + scene.world().toggleRedstonePower(util.select().position(observerPos)); + scene.world().toggleRedstonePower(redstoneDust); + scene.effects().indicateRedstone(observerPos); scene.idle(13); - scene.world.toggleRedstonePower(util.select.position(observerPos)); - scene.world.toggleRedstonePower(redstoneDust); + scene.world().toggleRedstonePower(util.select().position(observerPos)); + scene.world().toggleRedstonePower(redstoneDust); scene.idle(25); - scene.world.showSection(funnelChest, Direction.WEST); + scene.world().showSection(funnelChest, Direction.WEST); scene.idle(5); - scene.world.showSection(util.select.position(funnelPos), Direction.DOWN); + scene.world().showSection(util.select().position(funnelPos), Direction.DOWN); scene.idle(5); ElementLink observerLink = - scene.world.makeSectionIndependent(util.select.position(observerPos)); - scene.world.moveSection(observerLink, util.vector.of(1, 1, 0), 10); - scene.world.hideSection(redstoneDust, Direction.EAST); + scene.world().makeSectionIndependent(util.select().position(observerPos)); + scene.world().moveSection(observerLink, util.vector().of(1, 1, 0), 10); + scene.world().hideSection(redstoneDust, Direction.EAST); scene.idle(20); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("...and will emit a pulse, if an item enters or exits a funnel") .attachKeyFrame() - .pointAt(util.vector.blockSurface(observerPos.above() + .pointAt(util.vector().blockSurface(observerPos.above() .east(), Direction.WEST)) .placeNearTarget(); scene.idle(60); for (int i = 0; i < 3; i++) { - scene.world.createItemOnBelt(util.grid.at(3, 1, 1), Direction.EAST, amethystItem); + scene.world().createItemOnBelt(util.grid().at(3, 1, 1), Direction.EAST, amethystItem); - scene.world.toggleRedstonePower(util.select.position(observerPos)); - scene.effects.indicateRedstone(observerPos.above() + scene.world().toggleRedstonePower(util.select().position(observerPos)); + scene.effects().indicateRedstone(observerPos.above() .east()); scene.idle(5); - scene.world.toggleRedstonePower(util.select.position(observerPos)); + scene.world().toggleRedstonePower(util.select().position(observerPos)); scene.idle(25); } @@ -190,106 +190,106 @@ public class DetectorScenes { scene.title("threshold_switch", "Monitoring with the Threshold Switch"); scene.configureBasePlate(0, 1, 5); - Selection fluidTank = util.select.fromTo(1, 1, 5, 1, 3, 5); - Selection pulley = util.select.fromTo(3, 2, 3, 2, 2, 3); - BlockPos pulleyPos = util.grid.at(2, 2, 3); - BlockPos switchPos = util.grid.at(1, 1, 3); - Selection redstone = util.select.fromTo(1, 1, 2, 1, 1, 1); - Selection chest = util.select.fromTo(3, 1, 3, 2, 1, 3); - Selection belt = util.select.fromTo(3, 0, 0, 3, 0, 6); - Selection cogs = util.select.fromTo(4, 0, 6, 5, 0, 6) - .add(util.select.position(5, 0, 5)); - Selection inFunnel = util.select.position(3, 1, 2); - Selection outFunnel = util.select.position(3, 1, 4); - Selection baseStrip = util.select.fromTo(1, 0, 1, 1, 0, 5); - Selection basePlate = util.select.fromTo(0, 0, 1, 2, 0, 5) - .add(util.select.fromTo(4, 0, 5, 4, 0, 1)); + Selection fluidTank = util.select().fromTo(1, 1, 5, 1, 3, 5); + Selection pulley = util.select().fromTo(3, 2, 3, 2, 2, 3); + BlockPos pulleyPos = util.grid().at(2, 2, 3); + BlockPos switchPos = util.grid().at(1, 1, 3); + Selection redstone = util.select().fromTo(1, 1, 2, 1, 1, 1); + Selection chest = util.select().fromTo(3, 1, 3, 2, 1, 3); + Selection belt = util.select().fromTo(3, 0, 0, 3, 0, 6); + Selection cogs = util.select().fromTo(4, 0, 6, 5, 0, 6) + .add(util.select().position(5, 0, 5)); + Selection inFunnel = util.select().position(3, 1, 2); + Selection outFunnel = util.select().position(3, 1, 4); + Selection baseStrip = util.select().fromTo(1, 0, 1, 1, 0, 5); + Selection basePlate = util.select().fromTo(0, 0, 1, 2, 0, 5) + .add(util.select().fromTo(4, 0, 5, 4, 0, 1)); - scene.world.showSection(basePlate, Direction.UP); - ElementLink stripLink = scene.world.showIndependentSection(baseStrip, Direction.UP); - scene.world.moveSection(stripLink, util.vector.of(2, 0, 0), 0); + scene.world().showSection(basePlate, Direction.UP); + ElementLink stripLink = scene.world().showIndependentSection(baseStrip, Direction.UP); + scene.world().moveSection(stripLink, util.vector().of(2, 0, 0), 0); scene.idle(5); - scene.world.showSection(util.select.position(switchPos), Direction.DOWN); + scene.world().showSection(util.select().position(switchPos), Direction.DOWN); scene.idle(10); - scene.world.showSection(chest, Direction.WEST); + scene.world().showSection(chest, Direction.WEST); scene.idle(10); - scene.world.cycleBlockProperty(switchPos, ThresholdSwitchBlock.LEVEL); + scene.world().cycleBlockProperty(switchPos, ThresholdSwitchBlock.LEVEL); scene.idle(5); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("Threshold Switches monitor the fill level of containers") - .pointAt(util.vector.blockSurface(switchPos, Direction.NORTH)) + .pointAt(util.vector().blockSurface(switchPos, Direction.NORTH)) .placeNearTarget(); scene.idle(60); - scene.world.hideIndependentSection(stripLink, Direction.DOWN); + scene.world().hideIndependentSection(stripLink, Direction.DOWN); scene.idle(15); - scene.world.showSection(cogs, Direction.WEST); - scene.world.showSection(belt, Direction.NORTH); + scene.world().showSection(cogs, Direction.WEST); + scene.world().showSection(belt, Direction.NORTH); scene.idle(5); - scene.world.showSection(inFunnel, Direction.DOWN); + scene.world().showSection(inFunnel, Direction.DOWN); scene.idle(10); - scene.world.showSection(redstone, Direction.SOUTH); + scene.world().showSection(redstone, Direction.SOUTH); ItemStack ironIngot = new ItemStack(Items.IRON_INGOT, 32); for (int i = 0; i < 5; i++) { - scene.world.createItemOnBelt(util.grid.at(3, 0, 0), Direction.NORTH, ironIngot); + scene.world().createItemOnBelt(util.grid().at(3, 0, 0), Direction.NORTH, ironIngot); scene.idle(10); - scene.world.removeItemsFromBelt(util.grid.at(3, 0, 2)); - scene.world.flapFunnel(util.grid.at(3, 1, 2), false); + scene.world().removeItemsFromBelt(util.grid().at(3, 0, 2)); + scene.world().flapFunnel(util.grid().at(3, 1, 2), false); if (i % 2 == 1) - scene.world.cycleBlockProperty(switchPos, ThresholdSwitchBlock.LEVEL); + scene.world().cycleBlockProperty(switchPos, ThresholdSwitchBlock.LEVEL); } scene.addLazyKeyframe(); - scene.world.createItemOnBelt(util.grid.at(3, 0, 0), Direction.NORTH, ironIngot); - scene.world.removeItemsFromBelt(util.grid.at(3, 0, 2)); - scene.world.multiplyKineticSpeed(util.select.everywhere(), 1 / 8f); + scene.world().createItemOnBelt(util.grid().at(3, 0, 0), Direction.NORTH, ironIngot); + scene.world().removeItemsFromBelt(util.grid().at(3, 0, 2)); + scene.world().multiplyKineticSpeed(util.select().everywhere(), 1 / 8f); scene.idle(10); - Vec3 upper = util.vector.blockSurface(switchPos, Direction.NORTH) + Vec3 upper = util.vector().blockSurface(switchPos, Direction.NORTH) .add(0, 3 / 16f, 0); - scene.overlay.showLine(PonderPalette.RED, upper.add(2 / 16f, 0, 0), upper.subtract(2 / 16f, 0, 0), 60); - scene.overlay.showText(70) + scene.overlay().showLine(PonderPalette.RED, upper.add(2 / 16f, 0, 0), upper.subtract(2 / 16f, 0, 0), 60); + scene.overlay().showText(70) .text("When the inventory content exceeds the upper threshold...") .colored(PonderPalette.RED) .pointAt(upper.subtract(2 / 16f, 0, 0)) .placeNearTarget(); scene.idle(60); - scene.world.removeItemsFromBelt(util.grid.at(3, 0, 2)); - scene.world.flapFunnel(util.grid.at(3, 1, 2), false); - scene.world.cycleBlockProperty(switchPos, ThresholdSwitchBlock.LEVEL); - scene.effects.indicateRedstone(switchPos); - scene.world.toggleRedstonePower(redstone); + scene.world().removeItemsFromBelt(util.grid().at(3, 0, 2)); + scene.world().flapFunnel(util.grid().at(3, 1, 2), false); + scene.world().cycleBlockProperty(switchPos, ThresholdSwitchBlock.LEVEL); + scene.effects().indicateRedstone(switchPos); + scene.world().toggleRedstonePower(redstone); scene.idle(20); - scene.overlay.showText(50) + scene.overlay().showText(50) .text("...the switch will change its redstone output") - .pointAt(util.vector.blockSurface(switchPos.north(), Direction.DOWN)) + .pointAt(util.vector().blockSurface(switchPos.north(), Direction.DOWN)) .placeNearTarget(); scene.idle(50); - scene.world.showSection(outFunnel, Direction.DOWN); - scene.world.toggleRedstonePower(outFunnel); + scene.world().showSection(outFunnel, Direction.DOWN); + scene.world().toggleRedstonePower(outFunnel); scene.idle(15); - scene.world.multiplyKineticSpeed(util.select.everywhere(), 8f); + scene.world().multiplyKineticSpeed(util.select().everywhere(), 8f); for (int i = 0; i < 5; i++) { scene.idle(10); - scene.world.createItemOnBelt(util.grid.at(3, 0, 4), Direction.NORTH, ironIngot); + scene.world().createItemOnBelt(util.grid().at(3, 0, 4), Direction.NORTH, ironIngot); if (i % 3 == 1) - scene.world.modifyBlock(switchPos, + scene.world().modifyBlock(switchPos, s -> s.setValue(ThresholdSwitchBlock.LEVEL, s.getValue(ThresholdSwitchBlock.LEVEL) - 1), false); } - scene.world.multiplyKineticSpeed(util.select.everywhere(), 1 / 8f); + scene.world().multiplyKineticSpeed(util.select().everywhere(), 1 / 8f); - Vec3 lower = util.vector.blockSurface(switchPos, Direction.NORTH) + Vec3 lower = util.vector().blockSurface(switchPos, Direction.NORTH) .add(0, -3 / 16f, 0); - scene.overlay.showLine(PonderPalette.GREEN, lower.add(2 / 16f, 0, 0), lower.subtract(2 / 16f, 0, 0), 60); - scene.overlay.showText(70) + scene.overlay().showLine(PonderPalette.GREEN, lower.add(2 / 16f, 0, 0), lower.subtract(2 / 16f, 0, 0), 60); + scene.overlay().showText(70) .text("The signal stays until the lower threshold is reached") .attachKeyFrame() .colored(PonderPalette.GREEN) @@ -299,105 +299,105 @@ public class DetectorScenes { for (int i = 0; i < 3; i++) { scene.idle(10); - scene.world.createItemOnBelt(util.grid.at(3, 0, 4), Direction.NORTH, ironIngot); + scene.world().createItemOnBelt(util.grid().at(3, 0, 4), Direction.NORTH, ironIngot); if (i % 3 == 2) - scene.world.modifyBlock(switchPos, + scene.world().modifyBlock(switchPos, s -> s.setValue(ThresholdSwitchBlock.LEVEL, s.getValue(ThresholdSwitchBlock.LEVEL) - 1), false); } - scene.world.toggleRedstonePower(redstone); + scene.world().toggleRedstonePower(redstone); scene.idle(40); - scene.overlay.showText(90) + scene.overlay().showText(90) .text("The redstone output can now be used to control item supply, keeping the buffer filled") - .pointAt(util.vector.blockSurface(switchPos.north(), Direction.DOWN)) + .pointAt(util.vector().blockSurface(switchPos.north(), Direction.DOWN)) .attachKeyFrame() .placeNearTarget(); scene.idle(100); scene.addKeyframe(); - scene.overlay.showLine(PonderPalette.GREEN, lower.add(2 / 16f, 0, 0), lower.subtract(2 / 16f, 0, 0), 105); + scene.overlay().showLine(PonderPalette.GREEN, lower.add(2 / 16f, 0, 0), lower.subtract(2 / 16f, 0, 0), 105); scene.idle(5); - scene.overlay.showLine(PonderPalette.RED, upper.add(2 / 16f, 0, 0), upper.subtract(2 / 16f, 0, 0), 100); + scene.overlay().showLine(PonderPalette.RED, upper.add(2 / 16f, 0, 0), upper.subtract(2 / 16f, 0, 0), 100); scene.idle(15); - scene.overlay.showControls( - new InputWindowElement(util.vector.blockSurface(switchPos, Direction.UP), Pointing.DOWN).rightClick(), 60); + scene.overlay().showControls( + new InputWindowElement(util.vector().blockSurface(switchPos, Direction.UP), Pointing.DOWN).rightClick(), 60); scene.idle(7); - scene.overlay.showText(70) + scene.overlay().showText(70) .text("The specific thresholds can be changed in the UI") .pointAt(upper.subtract(2 / 16f, 0, 0)) .placeNearTarget(); scene.idle(80); - scene.overlay.showCenteredScrollInput(switchPos, Direction.UP, 70); - scene.overlay.showText(70) + scene.overlay().showCenteredScrollInput(switchPos, Direction.UP, 70); + scene.overlay().showText(70) .text("A filter can help to only count specific contents toward the total") - .pointAt(util.vector.blockSurface(switchPos, Direction.UP)) + .pointAt(util.vector().blockSurface(switchPos, Direction.UP)) .attachKeyFrame() .placeNearTarget(); scene.idle(80); - scene.world.hideSection(belt, Direction.SOUTH); - scene.world.hideSection(cogs, Direction.EAST); + scene.world().hideSection(belt, Direction.SOUTH); + scene.world().hideSection(cogs, Direction.EAST); scene.idle(2); - scene.world.hideSection(inFunnel, Direction.EAST); + scene.world().hideSection(inFunnel, Direction.EAST); scene.idle(2); - scene.world.hideSection(chest, Direction.EAST); + scene.world().hideSection(chest, Direction.EAST); scene.idle(2); - scene.world.hideSection(outFunnel, Direction.EAST); + scene.world().hideSection(outFunnel, Direction.EAST); scene.idle(9); - stripLink = scene.world.showIndependentSection(baseStrip, Direction.UP); - scene.world.moveSection(stripLink, util.vector.of(2, 0, 0), 0); + stripLink = scene.world().showIndependentSection(baseStrip, Direction.UP); + scene.world().moveSection(stripLink, util.vector().of(2, 0, 0), 0); scene.idle(5); - ElementLink tankLink = scene.world.showIndependentSection(fluidTank, Direction.DOWN); - scene.world.moveSection(tankLink, util.vector.of(1, 0, -2), 0); + ElementLink tankLink = scene.world().showIndependentSection(fluidTank, Direction.DOWN); + scene.world().moveSection(tankLink, util.vector().of(1, 0, -2), 0); scene.idle(10); - scene.world.cycleBlockProperty(switchPos, ThresholdSwitchBlock.LEVEL); - scene.world.cycleBlockProperty(switchPos, ThresholdSwitchBlock.LEVEL); + scene.world().cycleBlockProperty(switchPos, ThresholdSwitchBlock.LEVEL); + scene.world().cycleBlockProperty(switchPos, ThresholdSwitchBlock.LEVEL); scene.idle(15); - scene.overlay.showText(70) + scene.overlay().showText(70) .text("Fluid buffers can be monitored in a similar fashion") - .pointAt(util.vector.blockSurface(switchPos, Direction.NORTH)) + .pointAt(util.vector().blockSurface(switchPos, Direction.NORTH)) .attachKeyFrame() .placeNearTarget(); scene.idle(80); - scene.world.hideIndependentSection(tankLink, Direction.SOUTH); - scene.world.hideSection(redstone, Direction.NORTH); + scene.world().hideIndependentSection(tankLink, Direction.SOUTH); + scene.world().hideSection(redstone, Direction.NORTH); ElementLink switchLink = - scene.world.makeSectionIndependent(util.select.position(switchPos)); + scene.world().makeSectionIndependent(util.select().position(switchPos)); scene.idle(10); - scene.world.moveSection(switchLink, util.vector.of(0, 1, 0), 15); - scene.world.modifyBlock(switchPos, s -> s.setValue(ThresholdSwitchBlock.LEVEL, 0), false); + scene.world().moveSection(switchLink, util.vector().of(0, 1, 0), 15); + scene.world().modifyBlock(switchPos, s -> s.setValue(ThresholdSwitchBlock.LEVEL, 0), false); scene.idle(5); - scene.world.showSection(pulley, Direction.DOWN); + scene.world().showSection(pulley, Direction.DOWN); scene.idle(15); - ElementLink hole = scene.world.makeSectionIndependent(util.select.position(2, 0, 3)); - scene.world.hideIndependentSection(hole, Direction.DOWN); + ElementLink hole = scene.world().makeSectionIndependent(util.select().position(2, 0, 3)); + scene.world().hideIndependentSection(hole, Direction.DOWN); - scene.overlay.showText(70) + scene.overlay().showText(70) .text("...as well as, curiously, the length of an extended rope pulley") - .pointAt(util.vector.blockSurface(switchPos.above(), Direction.NORTH)) + .pointAt(util.vector().blockSurface(switchPos.above(), Direction.NORTH)) .attachKeyFrame() .placeNearTarget(); scene.idle(10); - scene.world.setKineticSpeed(pulley, 32); - scene.world.movePulley(pulleyPos, 15, 205); + scene.world().setKineticSpeed(pulley, 32); + scene.world().movePulley(pulleyPos, 15, 205); for (int i = 0; i < 4; i++) { scene.idle(5); - scene.world.cycleBlockProperty(switchPos, ThresholdSwitchBlock.LEVEL); + scene.world().cycleBlockProperty(switchPos, ThresholdSwitchBlock.LEVEL); scene.idle(45); if (i == 1) scene.markAsFinished(); } scene.idle(5); - scene.world.cycleBlockProperty(switchPos, ThresholdSwitchBlock.LEVEL); - scene.world.setKineticSpeed(pulley, 0); + scene.world().cycleBlockProperty(switchPos, ThresholdSwitchBlock.LEVEL); + scene.world().setKineticSpeed(pulley, 0); } diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/DisplayScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/DisplayScenes.java index b9cbc3aa4c..06da6fc9b4 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/DisplayScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/DisplayScenes.java @@ -9,10 +9,10 @@ import com.simibubi.create.foundation.utility.CreateLang; import net.createmod.catnip.utility.Pointing; import net.createmod.catnip.utility.lang.Components; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; import net.createmod.ponder.foundation.ElementLink; import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.SceneBuilder; -import net.createmod.ponder.foundation.SceneBuildingUtil; import net.createmod.ponder.foundation.Selection; import net.createmod.ponder.foundation.element.InputWindowElement; import net.createmod.ponder.foundation.element.WorldSectionElement; @@ -33,54 +33,54 @@ public class DisplayScenes { scene.configureBasePlate(0, 0, 5); scene.showBasePlate(); - BlockPos depotPos = util.grid.at(3, 1, 1); - Selection depot = util.select.position(3, 1, 1); - BlockPos linkPos = util.grid.at(2, 1, 1); - Selection link = util.select.position(linkPos); - BlockPos board = util.grid.at(3, 2, 3); - Selection fullBoard = util.select.fromTo(3, 2, 3, 1, 1, 3); - Selection largeCog = util.select.position(3, 0, 5); - Selection smallCog = util.select.fromTo(4, 1, 5, 4, 1, 3); + BlockPos depotPos = util.grid().at(3, 1, 1); + Selection depot = util.select().position(3, 1, 1); + BlockPos linkPos = util.grid().at(2, 1, 1); + Selection link = util.select().position(linkPos); + BlockPos board = util.grid().at(3, 2, 3); + Selection fullBoard = util.select().fromTo(3, 2, 3, 1, 1, 3); + Selection largeCog = util.select().position(3, 0, 5); + Selection smallCog = util.select().fromTo(4, 1, 5, 4, 1, 3); - Selection cuckoo = util.select.position(3, 2, 1); - Selection stresso = util.select.position(3, 3, 1); - Selection content = util.select.fromTo(4, 4, 1, 3, 4, 1); - Selection dirt = util.select.position(3, 5, 1); + Selection cuckoo = util.select().position(3, 2, 1); + Selection stresso = util.select().position(3, 3, 1); + Selection content = util.select().fromTo(4, 4, 1, 3, 4, 1); + Selection dirt = util.select().position(3, 5, 1); - Selection lectern = util.select.position(2, 2, 4); - Selection sign = util.select.position(2, 1, 4); - Selection nixies = util.select.fromTo(3, 3, 4, 1, 3, 4); + Selection lectern = util.select().position(2, 2, 4); + Selection sign = util.select().position(2, 1, 4); + Selection nixies = util.select().fromTo(3, 3, 4, 1, 3, 4); scene.idle(15); - scene.world.showSection(util.select.position(2, 1, 2), Direction.DOWN); + scene.world().showSection(util.select().position(2, 1, 2), Direction.DOWN); scene.idle(10); - scene.overlay.showText(70) + scene.overlay().showText(70) .attachKeyFrame() .text("Display Links can be used to visualise dynamic information") - .pointAt(util.vector.blockSurface(util.grid.at(2, 1, 2), Direction.WEST)) + .pointAt(util.vector().blockSurface(util.grid().at(2, 1, 2), Direction.WEST)) .placeNearTarget(); scene.idle(60); - scene.world.hideSection(util.select.position(2, 1, 2), Direction.UP); + scene.world().hideSection(util.select().position(2, 1, 2), Direction.UP); scene.idle(5); - scene.world.showSection(largeCog, Direction.UP); - scene.world.showSection(smallCog, Direction.WEST); + scene.world().showSection(largeCog, Direction.UP); + scene.world().showSection(smallCog, Direction.WEST); scene.idle(5); - scene.world.showSection(fullBoard, Direction.NORTH); + scene.world().showSection(fullBoard, Direction.NORTH); scene.idle(25); - Vec3 target = util.vector.of(3.5, 2.75, 3.25); - scene.overlay + Vec3 target = util.vector().of(3.5, 2.75, 3.25); + scene.overlay() .showControls(new InputWindowElement(target, Pointing.RIGHT).withItem(AllBlocks.DISPLAY_LINK.asStack()) .rightClick(), 60); scene.idle(6); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, link, new AABB(board).expandTowards(-2, -1, 0) + scene.overlay().chaseBoundingBoxOutline(PonderPalette.OUTPUT, link, new AABB(board).expandTowards(-2, -1, 0) .deflate(0, 0, 3 / 16f), 60); scene.idle(35); - scene.overlay.showText(70) + scene.overlay().showText(70) .text("First, right-click the target display...") .pointAt(target.add(-1, 0, 0)) .colored(PonderPalette.OUTPUT) @@ -88,144 +88,144 @@ public class DisplayScenes { .placeNearTarget(); scene.idle(60); - scene.world.showSection(depot, Direction.DOWN); + scene.world().showSection(depot, Direction.DOWN); scene.idle(10); - scene.world.showSection(link, Direction.EAST); + scene.world().showSection(link, Direction.EAST); scene.idle(20); - scene.overlay.showSelectionWithText(depot, 70) + scene.overlay().showSelectionWithText(depot, 70) .text("...then attach it to the block to read from") - .pointAt(util.vector.centerOf(linkPos)) + .pointAt(util.vector().centerOf(linkPos)) .colored(PonderPalette.INPUT) .placeNearTarget(); scene.idle(60); ItemStack item = AllItems.PROPELLER.asStack(); - scene.world.createItemOnBeltLike(depotPos, Direction.SOUTH, item); + scene.world().createItemOnBeltLike(depotPos, Direction.SOUTH, item); scene.idle(20); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(linkPos), Pointing.DOWN).rightClick(), 60); + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(linkPos), Pointing.DOWN).rightClick(), 60); scene.idle(20); - scene.overlay.showText(80) + scene.overlay().showText(80) .text("Open the Interface to select and configure what is sent") - .pointAt(util.vector.centerOf(linkPos)) + .pointAt(util.vector().centerOf(linkPos)) .attachKeyFrame() .placeNearTarget(); scene.idle(80); - scene.effects.indicateSuccess(linkPos); - scene.world.setDisplayBoardText(board, 1, item.getHoverName()); - scene.world.flashDisplayLink(linkPos); + scene.effects().indicateSuccess(linkPos); + scene.world().setDisplayBoardText(board, 1, item.getHoverName()); + scene.world().flashDisplayLink(linkPos); scene.idle(50); - scene.world.removeItemsFromBelt(depotPos); + scene.world().removeItemsFromBelt(depotPos); item = AllItems.BLAZE_CAKE.asStack(); - scene.world.createItemOnBeltLike(depotPos, Direction.SOUTH, item); - scene.world.setDisplayBoardText(board, 1, item.getHoverName()); - scene.world.flashDisplayLink(linkPos); + scene.world().createItemOnBeltLike(depotPos, Direction.SOUTH, item); + scene.world().setDisplayBoardText(board, 1, item.getHoverName()); + scene.world().flashDisplayLink(linkPos); scene.idle(20); - scene.overlay.showText(80) + scene.overlay().showText(80) .text("The display will now receive information from the link") .pointAt(target.add(-2.45f, -.5f, 0)) .attachKeyFrame() .placeNearTarget(); scene.idle(30); - scene.world.removeItemsFromBelt(depotPos); + scene.world().removeItemsFromBelt(depotPos); item = AllBlocks.DISPLAY_BOARD.asStack(); - scene.world.createItemOnBeltLike(depotPos, Direction.SOUTH, item); - scene.world.setDisplayBoardText(board, 1, item.getHoverName()); - scene.world.flashDisplayLink(linkPos); + scene.world().createItemOnBeltLike(depotPos, Direction.SOUTH, item); + scene.world().setDisplayBoardText(board, 1, item.getHoverName()); + scene.world().flashDisplayLink(linkPos); scene.idle(50); - scene.world.hideSection(depot, Direction.SOUTH); + scene.world().hideSection(depot, Direction.SOUTH); scene.idle(5); - scene.world.setDisplayBoardText(board, 1, Components.immutableEmpty()); - scene.world.flashDisplayLink(linkPos); + scene.world().setDisplayBoardText(board, 1, Components.immutableEmpty()); + scene.world().flashDisplayLink(linkPos); scene.idle(5); - ElementLink dirtElement = scene.world.showIndependentSection(dirt, Direction.SOUTH); - scene.world.moveSection(dirtElement, util.vector.of(0, -4, 0), 0); + ElementLink dirtElement = scene.world().showIndependentSection(dirt, Direction.SOUTH); + scene.world().moveSection(dirtElement, util.vector().of(0, -4, 0), 0); scene.idle(25); - scene.overlay.showSelectionWithText(depot, 50) + scene.overlay().showSelectionWithText(depot, 50) .text("Not every block can act as a source") - .pointAt(util.vector.topOf(depotPos)) + .pointAt(util.vector().topOf(depotPos)) .attachKeyFrame() .colored(PonderPalette.RED) .placeNearTarget(); scene.idle(60); - scene.world.hideIndependentSection(dirtElement, Direction.SOUTH); + scene.world().hideIndependentSection(dirtElement, Direction.SOUTH); scene.idle(10); - ElementLink stressElement = scene.world.showIndependentSection(stresso, Direction.SOUTH); - scene.world.moveSection(stressElement, util.vector.of(0, -2, 0), 0); + ElementLink stressElement = scene.world().showIndependentSection(stresso, Direction.SOUTH); + scene.world().moveSection(stressElement, util.vector().of(0, -2, 0), 0); scene.idle(10); - scene.world.setDisplayBoardText(board, 1, - Components.literal(1024 + " ").append(CreateLang.translateDirect("generic.unit.stress"))); - scene.world.flashDisplayLink(linkPos); + scene.world().setDisplayBoardText(board, 1, + Components.literal(1024 + " ").append(CreateLang.translateDirect("generic.unit.stress"))); + scene.world().flashDisplayLink(linkPos); scene.idle(40); - scene.world.hideIndependentSection(stressElement, Direction.SOUTH); + scene.world().hideIndependentSection(stressElement, Direction.SOUTH); scene.idle(10); - ElementLink chestElement = scene.world.showIndependentSection(content, Direction.SOUTH); - scene.world.moveSection(chestElement, util.vector.of(0, -3, 0), 0); + ElementLink chestElement = scene.world().showIndependentSection(content, Direction.SOUTH); + scene.world().moveSection(chestElement, util.vector().of(0, -3, 0), 0); scene.idle(10); - scene.world.setDisplayBoardText(board, 1, - Components.literal(418 + " ").append(new ItemStack(Items.DEEPSLATE).getHoverName())); - scene.world.setDisplayBoardText(board, 2, Components.literal(14 + " ").append(AllBlocks.COGWHEEL.asStack() + scene.world().setDisplayBoardText(board, 1, + Components.literal(418 + " ").append(new ItemStack(Items.DEEPSLATE).getHoverName())); + scene.world().setDisplayBoardText(board, 2, Components.literal(14 + " ").append(AllBlocks.COGWHEEL.asStack() .getHoverName())); - scene.world.flashDisplayLink(linkPos); + scene.world().flashDisplayLink(linkPos); scene.idle(40); - scene.world.hideIndependentSection(chestElement, Direction.SOUTH); + scene.world().hideIndependentSection(chestElement, Direction.SOUTH); scene.idle(10); - scene.overlay.showText(90) + scene.overlay().showText(90) .text("Each compatible block provides unique information") - .pointAt(util.vector.topOf(depotPos)) + .pointAt(util.vector().topOf(depotPos)) .attachKeyFrame() .colored(PonderPalette.GREEN) .placeNearTarget(); - ElementLink cuckooElement = scene.world.showIndependentSection(cuckoo, Direction.SOUTH); - scene.world.moveSection(cuckooElement, util.vector.of(0, -1, 0), 0); + ElementLink cuckooElement = scene.world().showIndependentSection(cuckoo, Direction.SOUTH); + scene.world().moveSection(cuckooElement, util.vector().of(0, -1, 0), 0); scene.idle(10); - scene.world.setDisplayBoardText(board, 1, - Components.literal("6:00 ").append(CreateLang.translateDirect("generic.daytime.pm"))); - scene.world.setDisplayBoardText(board, 2, Components.immutableEmpty()); - scene.world.flashDisplayLink(linkPos); + scene.world().setDisplayBoardText(board, 1, + Components.literal("6:00 ").append(CreateLang.translateDirect("generic.daytime.pm"))); + scene.world().setDisplayBoardText(board, 2, Components.immutableEmpty()); + scene.world().flashDisplayLink(linkPos); scene.idle(90); - scene.world.hideSection(fullBoard, Direction.SOUTH); - scene.world.hideSection(largeCog, Direction.DOWN); - scene.world.hideSection(smallCog, Direction.EAST); + scene.world().hideSection(fullBoard, Direction.SOUTH); + scene.world().hideSection(largeCog, Direction.DOWN); + scene.world().hideSection(smallCog, Direction.EAST); scene.idle(10); - ElementLink signElement = scene.world.showIndependentSection(sign, Direction.SOUTH); - scene.world.moveSection(signElement, util.vector.of(0, 0, -1), 0); + ElementLink signElement = scene.world().showIndependentSection(sign, Direction.SOUTH); + scene.world().moveSection(signElement, util.vector().of(0, 0, -1), 0); scene.idle(10); - scene.world.flashDisplayLink(linkPos); + scene.world().flashDisplayLink(linkPos); scene.idle(5); - scene.world.hideIndependentSection(signElement, Direction.SOUTH); + scene.world().hideIndependentSection(signElement, Direction.SOUTH); scene.idle(10); - ElementLink lecternElement = scene.world.showIndependentSection(lectern, Direction.SOUTH); - scene.world.moveSection(lecternElement, util.vector.of(0, -1, -1), 0); + ElementLink lecternElement = scene.world().showIndependentSection(lectern, Direction.SOUTH); + scene.world().moveSection(lecternElement, util.vector().of(0, -1, -1), 0); scene.idle(10); - scene.world.flashDisplayLink(linkPos); + scene.world().flashDisplayLink(linkPos); scene.idle(5); - scene.world.hideIndependentSection(lecternElement, Direction.SOUTH); + scene.world().hideIndependentSection(lecternElement, Direction.SOUTH); scene.idle(10); - scene.overlay.showText(90) + scene.overlay().showText(90) .text("The Display Link can work with several different displays") - .pointAt(util.vector.blockSurface(util.grid.at(1, 1, 3), Direction.WEST)) + .pointAt(util.vector().blockSurface(util.grid().at(1, 1, 3), Direction.WEST)) .attachKeyFrame() .colored(PonderPalette.GREEN) .placeNearTarget(); - ElementLink nixieElement = scene.world.showIndependentSection(nixies, Direction.SOUTH); - scene.world.moveSection(nixieElement, util.vector.of(0, -2, -1), 0); + ElementLink nixieElement = scene.world().showIndependentSection(nixies, Direction.SOUTH); + scene.world().moveSection(nixieElement, util.vector().of(0, -2, -1), 0); scene.idle(10); - scene.world.flashDisplayLink(linkPos); + scene.world().flashDisplayLink(linkPos); scene.idle(60); } @@ -235,21 +235,21 @@ public class DisplayScenes { scene.configureBasePlate(0, 0, 5); scene.showBasePlate(); - Selection largeCog = util.select.position(5, 0, 1); - Selection cogs = util.select.fromTo(4, 1, 1, 4, 1, 3); - BlockPos depotPos = util.grid.at(3, 1, 1); - Selection depot = util.select.position(3, 1, 1); - BlockPos linkPos = util.grid.at(2, 1, 1); - Selection link = util.select.position(linkPos); - BlockPos board = util.grid.at(3, 2, 3); - Selection fullBoard = util.select.fromTo(3, 2, 3, 1, 1, 3); + Selection largeCog = util.select().position(5, 0, 1); + Selection cogs = util.select().fromTo(4, 1, 1, 4, 1, 3); + BlockPos depotPos = util.grid().at(3, 1, 1); + Selection depot = util.select().position(3, 1, 1); + BlockPos linkPos = util.grid().at(2, 1, 1); + Selection link = util.select().position(linkPos); + BlockPos board = util.grid().at(3, 2, 3); + Selection fullBoard = util.select().fromTo(3, 2, 3, 1, 1, 3); - scene.world.setKineticSpeed(fullBoard, 0); + scene.world().setKineticSpeed(fullBoard, 0); scene.idle(15); for (int y = 1; y <= 2; y++) { for (int x = 3; x >= 1; x--) { - scene.world.showSection(util.select.position(x, y, 3), Direction.DOWN); + scene.world().showSection(util.select().position(x, y, 3), Direction.DOWN); scene.idle(2); } scene.idle(2); @@ -257,59 +257,59 @@ public class DisplayScenes { scene.idle(10); - scene.overlay.showText(70) + scene.overlay().showText(70) .attachKeyFrame() .text("Display Boards are a scalable alternative to the sign") - .pointAt(util.vector.blockSurface(util.grid.at(1, 2, 3), Direction.WEST)) + .pointAt(util.vector().blockSurface(util.grid().at(1, 2, 3), Direction.WEST)) .placeNearTarget(); scene.idle(80); scene.rotateCameraY(60); scene.idle(20); - scene.world.showSection(cogs, Direction.DOWN); - scene.world.showSection(largeCog, Direction.UP); + scene.world().showSection(cogs, Direction.DOWN); + scene.world().showSection(largeCog, Direction.UP); scene.idle(10); - scene.world.setKineticSpeed(fullBoard, 32); - scene.world.multiplyKineticSpeed(util.select.position(3, 1, 3), -1); - scene.world.multiplyKineticSpeed(util.select.position(2, 2, 3), -1); - scene.world.multiplyKineticSpeed(util.select.position(1, 1, 3), -1); + scene.world().setKineticSpeed(fullBoard, 32); + scene.world().multiplyKineticSpeed(util.select().position(3, 1, 3), -1); + scene.world().multiplyKineticSpeed(util.select().position(2, 2, 3), -1); + scene.world().multiplyKineticSpeed(util.select().position(1, 1, 3), -1); - scene.overlay.showText(50) + scene.overlay().showText(50) .text("They require Rotational Force to operate") - .pointAt(util.vector.blockSurface(util.grid.at(3, 1, 3), Direction.EAST)) + .pointAt(util.vector().blockSurface(util.grid().at(3, 1, 3), Direction.EAST)) .attachKeyFrame() .placeNearTarget(); scene.idle(40); scene.rotateCameraY(-60); scene.idle(20); - Vec3 target = util.vector.of(3.95, 2.75, 3.25); + Vec3 target = util.vector().of(3.95, 2.75, 3.25); ItemStack clipboard = AllBlocks.CLIPBOARD.asStack(); ClipboardOverrides.switchTo(ClipboardType.WRITTEN, clipboard); - scene.overlay.showControls(new InputWindowElement(target, Pointing.RIGHT).withItem(clipboard) + scene.overlay().showControls(new InputWindowElement(target, Pointing.RIGHT).withItem(clipboard) .rightClick(), 40); scene.idle(6); - scene.world.setDisplayBoardText(board, 0, Components.literal("Create")); + scene.world().setDisplayBoardText(board, 0, Components.literal("Create")); scene.idle(25); - scene.overlay.showText(50) + scene.overlay().showText(50) .text("Static text can be applied using written Clipboards") .pointAt(target.add(-2, 0, 0)) .attachKeyFrame() .placeNearTarget(); scene.idle(80); - scene.world.showSection(depot, Direction.DOWN); + scene.world().showSection(depot, Direction.DOWN); scene.idle(10); - scene.world.showSection(link, Direction.EAST); + scene.world().showSection(link, Direction.EAST); scene.idle(15); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.INPUT, depot, new AABB(linkPos).contract(-.5f, 0, 0), 60); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.INPUT, depot, new AABB(linkPos).contract(-.5f, 0, 0), 60); scene.idle(5); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, link, new AABB(board).expandTowards(-2, -1, 0) + scene.overlay().chaseBoundingBoxOutline(PonderPalette.OUTPUT, link, new AABB(board).expandTowards(-2, -1, 0) .deflate(0, 0, 3 / 16f), 60); scene.idle(20); - scene.overlay.showText(70) + scene.overlay().showText(70) .text("And dynamic text through the use of Display Links") .pointAt(target.add(-2, 0, 0)) .attachKeyFrame() @@ -318,53 +318,53 @@ public class DisplayScenes { scene.idle(50); ItemStack item = AllItems.PROPELLER.asStack(); - scene.world.createItemOnBeltLike(depotPos, Direction.SOUTH, item); - scene.world.setDisplayBoardText(board, 1, item.getHoverName()); - scene.world.flashDisplayLink(linkPos); + scene.world().createItemOnBeltLike(depotPos, Direction.SOUTH, item); + scene.world().setDisplayBoardText(board, 1, item.getHoverName()); + scene.world().flashDisplayLink(linkPos); scene.idle(50); - scene.world.removeItemsFromBelt(depotPos); + scene.world().removeItemsFromBelt(depotPos); item = AllItems.BLAZE_CAKE.asStack(); - scene.world.createItemOnBeltLike(depotPos, Direction.SOUTH, item); - scene.world.setDisplayBoardText(board, 1, item.getHoverName()); - scene.world.flashDisplayLink(linkPos); + scene.world().createItemOnBeltLike(depotPos, Direction.SOUTH, item); + scene.world().setDisplayBoardText(board, 1, item.getHoverName()); + scene.world().flashDisplayLink(linkPos); scene.idle(50); - scene.world.removeItemsFromBelt(depotPos); + scene.world().removeItemsFromBelt(depotPos); item = AllBlocks.DISPLAY_BOARD.asStack(); - scene.world.createItemOnBeltLike(depotPos, Direction.SOUTH, item); - scene.world.setDisplayBoardText(board, 1, item.getHoverName()); - scene.world.flashDisplayLink(linkPos); + scene.world().createItemOnBeltLike(depotPos, Direction.SOUTH, item); + scene.world().setDisplayBoardText(board, 1, item.getHoverName()); + scene.world().flashDisplayLink(linkPos); scene.idle(50); - scene.overlay + scene.overlay() .showControls(new InputWindowElement(target, Pointing.RIGHT).withItem(new ItemStack(Items.PINK_DYE)) .rightClick(), 40); scene.idle(6); - scene.world.dyeDisplayBoard(board, 0, DyeColor.PINK); + scene.world().dyeDisplayBoard(board, 0, DyeColor.PINK); scene.idle(25); - scene.overlay.showText(70) + scene.overlay().showText(70) .text("Dyes can be applied to individual lines of the board") .pointAt(target.add(-2, 0, 0)) .attachKeyFrame() .placeNearTarget(); scene.idle(25); - scene.overlay.showControls( + scene.overlay().showControls( new InputWindowElement(target.add(0, -.5f, 0), Pointing.RIGHT).withItem(new ItemStack(Items.LIME_DYE)) .rightClick(), 40); scene.idle(6); - scene.world.dyeDisplayBoard(board, 1, DyeColor.LIME); + scene.world().dyeDisplayBoard(board, 1, DyeColor.LIME); scene.idle(55); - scene.overlay.showControls(new InputWindowElement(target, Pointing.RIGHT).rightClick(), 40); + scene.overlay().showControls(new InputWindowElement(target, Pointing.RIGHT).rightClick(), 40); scene.idle(6); - scene.world.setDisplayBoardText(board, 0, Components.immutableEmpty()); + scene.world().setDisplayBoardText(board, 0, Components.immutableEmpty()); scene.idle(25); - scene.overlay.showText(70) + scene.overlay().showText(70) .text("Lines can be reset by clicking them with an empty hand") .pointAt(target.add(-2, 0, 0)) .attachKeyFrame() @@ -379,66 +379,66 @@ public class DisplayScenes { scene.configureBasePlate(0, 0, 5); scene.showBasePlate(); - BlockPos depotPos = util.grid.at(3, 1, 1); - Selection depot = util.select.position(3, 1, 1); - BlockPos linkPos = util.grid.at(2, 1, 1); - Selection link = util.select.position(linkPos); - BlockPos board = util.grid.at(3, 2, 3); - Selection fullBoard = util.select.fromTo(3, 2, 3, 1, 1, 3); - Selection largeCog = util.select.position(3, 0, 5); - Selection smallCog = util.select.fromTo(4, 1, 5, 4, 1, 3); - Selection redstone = util.select.fromTo(1, 1, 1, 0, 1, 1); - BlockPos leverPos = util.grid.at(0, 1, 1); + BlockPos depotPos = util.grid().at(3, 1, 1); + Selection depot = util.select().position(3, 1, 1); + BlockPos linkPos = util.grid().at(2, 1, 1); + Selection link = util.select().position(linkPos); + BlockPos board = util.grid().at(3, 2, 3); + Selection fullBoard = util.select().fromTo(3, 2, 3, 1, 1, 3); + Selection largeCog = util.select().position(3, 0, 5); + Selection smallCog = util.select().fromTo(4, 1, 5, 4, 1, 3); + Selection redstone = util.select().fromTo(1, 1, 1, 0, 1, 1); + BlockPos leverPos = util.grid().at(0, 1, 1); - scene.world.showSection(largeCog, Direction.UP); - scene.world.showSection(smallCog, Direction.WEST); + scene.world().showSection(largeCog, Direction.UP); + scene.world().showSection(smallCog, Direction.WEST); scene.idle(5); - scene.world.showSection(fullBoard, Direction.NORTH); + scene.world().showSection(fullBoard, Direction.NORTH); scene.idle(25); - Vec3 target = util.vector.of(3.5, 2.75, 3.25); - scene.world.showSection(depot, Direction.DOWN); + Vec3 target = util.vector().of(3.5, 2.75, 3.25); + scene.world().showSection(depot, Direction.DOWN); scene.idle(10); - scene.world.showSection(link, Direction.EAST); + scene.world().showSection(link, Direction.EAST); scene.idle(10); - scene.world.flashDisplayLink(linkPos); - scene.world.setDisplayBoardText(board, 1, new ItemStack(Items.CALCITE).getHoverName()); + scene.world().flashDisplayLink(linkPos); + scene.world().setDisplayBoardText(board, 1, new ItemStack(Items.CALCITE).getHoverName()); scene.idle(10); - scene.world.showSection(redstone, Direction.EAST); + scene.world().showSection(redstone, Direction.EAST); scene.idle(20); - scene.world.toggleRedstonePower(redstone); - scene.world.toggleRedstonePower(link); - scene.effects.indicateRedstone(leverPos); + scene.world().toggleRedstonePower(redstone); + scene.world().toggleRedstonePower(link); + scene.effects().indicateRedstone(leverPos); scene.idle(20); - scene.overlay.showText(80) + scene.overlay().showText(80) .colored(PonderPalette.RED) .attachKeyFrame() - .pointAt(util.vector.topOf(linkPos)) + .pointAt(util.vector().topOf(linkPos)) .placeNearTarget() .text("When powered by Redstone, Display Links stop sending updates"); scene.idle(50); - scene.world.removeItemsFromBelt(depotPos); + scene.world().removeItemsFromBelt(depotPos); ItemStack item = new ItemStack(Items.AMETHYST_BLOCK); - scene.world.createItemOnBeltLike(depotPos, Direction.SOUTH, item); + scene.world().createItemOnBeltLike(depotPos, Direction.SOUTH, item); scene.idle(20); scene.idle(30); - scene.world.removeItemsFromBelt(depotPos); + scene.world().removeItemsFromBelt(depotPos); item = new ItemStack(Items.GOLD_BLOCK); - scene.world.createItemOnBeltLike(depotPos, Direction.SOUTH, item); + scene.world().createItemOnBeltLike(depotPos, Direction.SOUTH, item); scene.idle(50); - scene.world.toggleRedstonePower(redstone); - scene.world.toggleRedstonePower(link); - scene.effects.indicateRedstone(leverPos); + scene.world().toggleRedstonePower(redstone); + scene.world().toggleRedstonePower(link); + scene.effects().indicateRedstone(leverPos); scene.idle(1); - scene.world.flashDisplayLink(linkPos); - scene.world.setDisplayBoardText(board, 1, item.getHoverName()); + scene.world().flashDisplayLink(linkPos); + scene.world().setDisplayBoardText(board, 1, item.getHoverName()); scene.idle(15); - scene.overlay.showText(100) + scene.overlay().showText(100) .colored(PonderPalette.GREEN) .attachKeyFrame() .pointAt(target.add(-2.45, -0.5, 0)) @@ -446,21 +446,21 @@ public class DisplayScenes { .text("Once unpowered, the Timer is reset and new info is sent immediately"); scene.idle(100); - scene.world.hideSection(depot, Direction.SOUTH); - scene.world.setBlock(util.grid.at(4, 1, 0), Blocks.REDSTONE_BLOCK.defaultBlockState(), false); + scene.world().hideSection(depot, Direction.SOUTH); + scene.world().setBlock(util.grid().at(4, 1, 0), Blocks.REDSTONE_BLOCK.defaultBlockState(), false); scene.idle(10); ElementLink redstoneBlock = - scene.world.showIndependentSection(util.select.position(4, 1, 0), Direction.SOUTH); - scene.world.moveSection(redstoneBlock, util.vector.of(-1, 0, 1), 0); + scene.world().showIndependentSection(util.select().position(4, 1, 0), Direction.SOUTH); + scene.world().moveSection(redstoneBlock, util.vector().of(-1, 0, 1), 0); scene.idle(10); - scene.world.flashDisplayLink(linkPos); - scene.world.setDisplayBoardText(board, 1, Components.immutableEmpty()); + scene.world().flashDisplayLink(linkPos); + scene.world().setDisplayBoardText(board, 1, Components.immutableEmpty()); scene.idle(25); - scene.overlay.showSelectionWithText(depot, 80) + scene.overlay().showSelectionWithText(depot, 80) .colored(PonderPalette.RED) .attachKeyFrame() - .pointAt(util.vector.topOf(linkPos)) + .pointAt(util.vector().topOf(linkPos)) .placeNearTarget() .text("Signals emitted from the source do not affect the Link"); scene.idle(70); diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/EjectorScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/EjectorScenes.java index 7f94dded3f..17aa99eed2 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/EjectorScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/EjectorScenes.java @@ -7,10 +7,10 @@ import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.NBTHelper; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; import net.createmod.ponder.foundation.ElementLink; import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.SceneBuilder; -import net.createmod.ponder.foundation.SceneBuildingUtil; import net.createmod.ponder.foundation.Selection; import net.createmod.ponder.foundation.element.InputWindowElement; import net.createmod.ponder.foundation.element.ParrotElement; @@ -33,183 +33,183 @@ public class EjectorScenes { scene.configureBasePlate(0, 0, 5); scene.showBasePlate(); - BlockPos ejectorPos = util.grid.at(4, 1, 2); - Selection ejectorS = util.select.position(ejectorPos); - BlockPos targetPos = util.grid.at(0, 1, 2); - Selection targetS = util.select.position(targetPos); + BlockPos ejectorPos = util.grid().at(4, 1, 2); + Selection ejectorS = util.select().position(ejectorPos); + BlockPos targetPos = util.grid().at(0, 1, 2); + Selection targetS = util.select().position(targetPos); - scene.world.setBlock(targetPos, AllBlocks.ANDESITE_CASING.getDefaultState(), false); + scene.world().setBlock(targetPos, AllBlocks.ANDESITE_CASING.getDefaultState(), false); scene.idle(5); - scene.world.showSection(targetS, Direction.DOWN); + scene.world().showSection(targetS, Direction.DOWN); scene.idle(10); ItemStack asStack = AllBlocks.WEIGHTED_EJECTOR.asStack(); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(targetPos), Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(targetPos), Pointing.DOWN).rightClick() .whileSneaking() .withItem(asStack), 50); scene.idle(7); Object slot = new Object(); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, slot, new AABB(targetPos), 160); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.OUTPUT, slot, new AABB(targetPos), 160); - scene.overlay.showText(70) + scene.overlay().showText(70) .attachKeyFrame() .colored(PonderPalette.OUTPUT) .text("Sneak and Right-Click holding an Ejector to select its target location") - .pointAt(util.vector.blockSurface(targetPos, Direction.WEST)) + .pointAt(util.vector().blockSurface(targetPos, Direction.WEST)) .placeNearTarget(); scene.idle(80); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(ejectorPos), Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(ejectorPos), Pointing.DOWN).rightClick() .withItem(asStack), 50); scene.idle(7); - scene.world.setKineticSpeed(ejectorS, 0); - scene.world.modifyBlockEntityNBT(ejectorS, EjectorBlockEntity.class, nbt -> { + scene.world().setKineticSpeed(ejectorS, 0); + scene.world().modifyBlockEntityNBT(ejectorS, EjectorBlockEntity.class, nbt -> { NBTHelper.writeEnum(nbt, "State", EjectorBlockEntity.State.RETRACTING); nbt.putFloat("ForceAngle", 1); }); - scene.world.showSection(ejectorS, Direction.DOWN); + scene.world().showSection(ejectorS, Direction.DOWN); scene.idle(10); - scene.overlay.showText(60) + scene.overlay().showText(60) .colored(PonderPalette.OUTPUT) .text("The placed ejector will now launch objects to the marked location") - .pointAt(util.vector.blockSurface(ejectorPos, Direction.WEST)) + .pointAt(util.vector().blockSurface(ejectorPos, Direction.WEST)) .placeNearTarget(); scene.idle(70); slot = new Object(); AABB bb = new AABB(ejectorPos.west()); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, slot, bb, 20); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.OUTPUT, slot, bb, 20); scene.idle(10); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, slot, bb.expandTowards(-15, 15, 0), 100); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, slot, bb.expandTowards(-15, 15, 0), 100); scene.idle(10); - scene.overlay.showText(60) + scene.overlay().showText(60) .attachKeyFrame() .colored(PonderPalette.GREEN) .text("A valid target can be at any height or distance within range") - .pointAt(util.vector.blockSurface(targetPos, Direction.WEST)) + .pointAt(util.vector().blockSurface(targetPos, Direction.WEST)) .placeNearTarget(); scene.idle(70); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, new Object(), bb.move(-2, 0, -1), 60); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.RED, new Object(), bb.move(-2, 0, -1), 60); scene.idle(10); - scene.overlay.showText(50) + scene.overlay().showText(50) .colored(PonderPalette.RED) .text("They cannot however be off to a side") - .pointAt(util.vector.blockSurface(targetPos.north() + .pointAt(util.vector().blockSurface(targetPos.north() .east(), Direction.WEST)) .placeNearTarget(); scene.idle(70); - scene.overlay.showSelectionWithText(util.select.position(ejectorPos.west()), 70) + scene.overlay().showSelectionWithText(util.select().position(ejectorPos.west()), 70) .colored(PonderPalette.OUTPUT) .text("If no valid Target was selected, it will simply target the block directly in front") .placeNearTarget(); scene.idle(80); - scene.world.showSection(util.select.position(3, 0, 5), Direction.UP); - scene.world.showSection(util.select.fromTo(4, 1, 5, 4, 1, 3), Direction.DOWN); + scene.world().showSection(util.select().position(3, 0, 5), Direction.UP); + scene.world().showSection(util.select().fromTo(4, 1, 5, 4, 1, 3), Direction.DOWN); scene.idle(12); - scene.world.setKineticSpeed(ejectorS, 32); + scene.world().setKineticSpeed(ejectorS, 32); scene.idle(10); - scene.overlay.showText(50) + scene.overlay().showText(50) .attachKeyFrame() .text("Supply Rotational Force in order to charge it up") - .pointAt(util.vector.topOf(4, 1, 3)) + .pointAt(util.vector().topOf(4, 1, 3)) .placeNearTarget(); scene.idle(60); ItemStack copperBlock = new ItemStack(Items.COPPER_BLOCK); ItemStack copperIngot = new ItemStack(Items.COPPER_INGOT); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(ejectorPos) + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(ejectorPos) .add(0.5, 0, 0), Pointing.RIGHT).withItem(copperBlock), 30); scene.idle(7); - scene.world.createItemOnBeltLike(ejectorPos, Direction.NORTH, copperBlock); + scene.world().createItemOnBeltLike(ejectorPos, Direction.NORTH, copperBlock); scene.idle(20); - scene.overlay.showText(50) + scene.overlay().showText(50) .text("Items placed on the ejector cause it to trigger") - .pointAt(util.vector.topOf(ejectorPos)) + .pointAt(util.vector().topOf(ejectorPos)) .placeNearTarget(); scene.idle(60); - scene.world.modifyEntities(ItemEntity.class, Entity::discard); - scene.world.hideSection(targetS, Direction.SOUTH); + scene.world().modifyEntities(ItemEntity.class, Entity::discard); + scene.world().hideSection(targetS, Direction.SOUTH); scene.idle(15); - scene.world.restoreBlocks(targetS); - scene.world.showSection(targetS, Direction.SOUTH); + scene.world().restoreBlocks(targetS); + scene.world().showSection(targetS, Direction.SOUTH); scene.idle(10); - scene.world.createItemOnBeltLike(targetPos, Direction.SOUTH, copperIngot); + scene.world().createItemOnBeltLike(targetPos, Direction.SOUTH, copperIngot); scene.idle(20); - scene.world.createItemOnBeltLike(ejectorPos, Direction.SOUTH, copperBlock); - scene.overlay.showText(60) + scene.world().createItemOnBeltLike(ejectorPos, Direction.SOUTH, copperBlock); + scene.overlay().showText(60) .attachKeyFrame() .text("If Inventories are targeted, the ejector will wait until there is space") - .pointAt(util.vector.topOf(targetPos)) + .pointAt(util.vector().topOf(targetPos)) .placeNearTarget(); scene.idle(70); - scene.effects.indicateSuccess(targetPos); - scene.world.removeItemsFromBelt(targetPos); + scene.effects().indicateSuccess(targetPos); + scene.world().removeItemsFromBelt(targetPos); scene.idle(40); - scene.world.hideSection(targetS, Direction.NORTH); + scene.world().hideSection(targetS, Direction.NORTH); scene.idle(15); - scene.world.setBlock(targetPos, AllBlocks.ANDESITE_CASING.getDefaultState(), false); - scene.world.showSection(targetS, Direction.NORTH); + scene.world().setBlock(targetPos, AllBlocks.ANDESITE_CASING.getDefaultState(), false); + scene.world().showSection(targetS, Direction.NORTH); - Vec3 input = util.vector.blockSurface(ejectorPos, Direction.WEST) + Vec3 input = util.vector().blockSurface(ejectorPos, Direction.WEST) .add(0, -2 / 16f, 0); Vec3 topOfSlot = input.add(0, 2 / 16f, 0); - scene.overlay.showControls(new InputWindowElement(topOfSlot, Pointing.DOWN).rightClick(), 60); - scene.overlay.showFilterSlotInput(input, Direction.WEST, 80); + scene.overlay().showControls(new InputWindowElement(topOfSlot, Pointing.DOWN).rightClick(), 60); + scene.overlay().showFilterSlotInput(input, Direction.WEST, 80); scene.idle(10); - scene.overlay.showText(80) + scene.overlay().showText(80) .attachKeyFrame() .text("Using the value panel, a required Stack Size can be configured") .pointAt(input.add(0, 0, 0.125)) .placeNearTarget(); - scene.world.modifyBlockEntityNBT(ejectorS, EjectorBlockEntity.class, nbt -> { + scene.world().modifyBlockEntityNBT(ejectorS, EjectorBlockEntity.class, nbt -> { nbt.putInt("ScrollValue", 10); }); scene.idle(90); - scene.world.showSection(util.select.fromTo(5, 1, 0, 4, 1, 1), Direction.DOWN); - scene.world.showSection(util.select.position(5, 0, 1), Direction.UP); + scene.world().showSection(util.select().fromTo(5, 1, 0, 4, 1, 1), Direction.DOWN); + scene.world().showSection(util.select().position(5, 0, 1), Direction.UP); scene.idle(15); - BlockPos beltPos = util.grid.at(4, 1, 0); - scene.world.createItemOnBeltLike(beltPos, Direction.UP, copperBlock); - scene.overlay.showText(100) + BlockPos beltPos = util.grid().at(4, 1, 0); + scene.world().createItemOnBeltLike(beltPos, Direction.UP, copperBlock); + scene.overlay().showText(100) .text("It is now limited to this stack size, and only activates when its held stack reaches this amount") - .pointAt(util.vector.topOf(ejectorPos)) + .pointAt(util.vector().topOf(ejectorPos)) .placeNearTarget(); for (int i = 0; i < 4; i++) { scene.idle(20); - scene.world.createItemOnBeltLike(beltPos, Direction.UP, copperBlock); + scene.world().createItemOnBeltLike(beltPos, Direction.UP, copperBlock); } scene.idle(20); - scene.world.createItemOnBeltLike(beltPos, Direction.UP, ItemHandlerHelper.copyStackWithSize(copperBlock, 15)); + scene.world().createItemOnBeltLike(beltPos, Direction.UP, ItemHandlerHelper.copyStackWithSize(copperBlock, 15)); scene.idle(80); - scene.world.hideSection(util.select.fromTo(5, 1, 0, 4, 1, 1), Direction.UP); - scene.world.hideSection(util.select.position(5, 0, 1), Direction.DOWN); + scene.world().hideSection(util.select().fromTo(5, 1, 0, 4, 1, 1), Direction.UP); + scene.world().hideSection(util.select().position(5, 0, 1), Direction.DOWN); scene.idle(30); - scene.world.modifyEntities(ItemEntity.class, Entity::discard); + scene.world().modifyEntities(ItemEntity.class, Entity::discard); scene.addKeyframe(); - ElementLink birb = scene.special.createBirb(util.vector.topOf(ejectorPos) + ElementLink birb = scene.special().createBirb(util.vector().topOf(ejectorPos) .add(0, -3 / 16f, 0), ParrotElement.FlappyPose::new); scene.idle(15); - scene.world.modifyBlockEntity(ejectorPos, EjectorBlockEntity.class, ejector -> ejector.activateDeferred()); - scene.special.moveParrot(birb, util.vector.of(-2, 3, 0), 5); - scene.special.rotateParrot(birb, 0, 360 * 2, 0, 21); + scene.world().modifyBlockEntity(ejectorPos, EjectorBlockEntity.class, ejector -> ejector.activateDeferred()); + scene.special().moveParrot(birb, util.vector().of(-2, 3, 0), 5); + scene.special().rotateParrot(birb, 0, 360 * 2, 0, 21); scene.idle(5); - scene.special.moveParrot(birb, util.vector.of(-1, 0, 0), 3); + scene.special().moveParrot(birb, util.vector().of(-1, 0, 0), 3); scene.idle(3); - scene.special.moveParrot(birb, util.vector.of(-0.75, -1, 0), 6); + scene.special().moveParrot(birb, util.vector().of(-0.75, -1, 0), 6); scene.idle(6); - scene.special.moveParrot(birb, util.vector.of(-0.25, -2 + 3 / 16f, 0), 12); + scene.special().moveParrot(birb, util.vector().of(-0.25, -2 + 3 / 16f, 0), 12); scene.idle(15); - scene.special.changeBirbPose(birb, ParrotElement.FaceCursorPose::new); - scene.overlay.showText(80) + scene.special().changeBirbPose(birb, ParrotElement.FaceCursorPose::new); + scene.overlay().showText(80) .text("Mobs and Players will always trigger an Ejector when stepping on it") - .pointAt(util.vector.topOf(targetPos)) + .pointAt(util.vector().topOf(targetPos)) .placeNearTarget(); scene.idle(50); @@ -218,156 +218,156 @@ public class EjectorScenes { public static void splitY(SceneBuilder builder, SceneBuildingUtil util) { CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("weighted_ejector_tunnel", "Splitting item stacks using Weighted Ejectors"); - Selection coverbelt = util.select.fromTo(3, 1, 1, 2, 1, 0); + Selection coverbelt = util.select().fromTo(3, 1, 1, 2, 1, 0); scene.configureBasePlate(0, 0, 5); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); scene.idle(5); - scene.world.showSection(util.select.fromTo(4, 1, 5, 0, 1, 3), Direction.DOWN); + scene.world().showSection(util.select().fromTo(4, 1, 5, 0, 1, 3), Direction.DOWN); scene.idle(5); - scene.world.showSection(util.select.position(2, 2, 3), Direction.DOWN); + scene.world().showSection(util.select().position(2, 2, 3), Direction.DOWN); scene.idle(10); - scene.world.showSection(util.select.position(2, 1, 2), Direction.SOUTH); + scene.world().showSection(util.select().position(2, 1, 2), Direction.SOUTH); scene.idle(5); - scene.world.showSection(util.select.fromTo(4, 1, 2, 3, 1, 2), Direction.SOUTH); + scene.world().showSection(util.select().fromTo(4, 1, 2, 3, 1, 2), Direction.SOUTH); scene.idle(10); - BlockPos ejectorPos = util.grid.at(2, 1, 2); + BlockPos ejectorPos = util.grid().at(2, 1, 2); - scene.overlay.showText(80) + scene.overlay().showText(80) .attachKeyFrame() .text("Combined with Brass Tunnels, Ejectors can split item stacks by specific amounts") - .pointAt(util.vector.topOf(ejectorPos)) + .pointAt(util.vector().topOf(ejectorPos)) .placeNearTarget(); scene.idle(90); - BlockPos tunnel = util.grid.at(2, 2, 3); - scene.overlay.showControls( - new InputWindowElement(util.vector.topOf(tunnel), Pointing.DOWN).showing(AllIcons.I_TUNNEL_PREFER_NEAREST), + BlockPos tunnel = util.grid().at(2, 2, 3); + scene.overlay().showControls( + new InputWindowElement(util.vector().topOf(tunnel), Pointing.DOWN).showing(AllIcons.I_TUNNEL_PREFER_NEAREST), 80); scene.idle(10); - scene.overlay.showCenteredScrollInput(tunnel, Direction.UP, 100); + scene.overlay().showCenteredScrollInput(tunnel, Direction.UP, 100); scene.idle(10); - scene.overlay.showText(100) + scene.overlay().showText(100) .attachKeyFrame() .colored(PonderPalette.BLUE) .text("First, configure the Brass Tunnel to 'Prefer Nearest', in order to prioritize its side output") - .pointAt(util.vector.topOf(tunnel)) + .pointAt(util.vector().topOf(tunnel)) .placeNearTarget(); scene.idle(110); - Vec3 input = util.vector.blockSurface(ejectorPos, Direction.NORTH) + Vec3 input = util.vector().blockSurface(ejectorPos, Direction.NORTH) .subtract(0, 2 / 16f, 0); Vec3 topOfSlot = input.add(0, 2 / 16f, 0); - scene.overlay.showFilterSlotInput(input, Direction.NORTH, 80); + scene.overlay().showFilterSlotInput(input, Direction.NORTH, 80); scene.idle(10); - scene.overlay.showText(80) + scene.overlay().showText(80) .attachKeyFrame() .text("The Stack Size set on the Ejector now determines the amount to be split off") .pointAt(topOfSlot) .placeNearTarget(); - scene.world.modifyBlockEntityNBT(util.select.position(2, 1, 2), EjectorBlockEntity.class, nbt -> { + scene.world().modifyBlockEntityNBT(util.select().position(2, 1, 2), EjectorBlockEntity.class, nbt -> { nbt.putInt("ScrollValue", 10); }); scene.idle(90); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(util.grid.at(4, 1, 3)), Pointing.DOWN) + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(util.grid().at(4, 1, 3)), Pointing.DOWN) .withItem(new ItemStack(Items.COPPER_INGOT)), 20); - scene.world.showSection(coverbelt, Direction.SOUTH); + scene.world().showSection(coverbelt, Direction.SOUTH); scene.idle(7); - scene.world.createItemOnBelt(util.grid.at(4, 1, 3), Direction.UP, new ItemStack(Items.COPPER_INGOT, 64)); + scene.world().createItemOnBelt(util.grid().at(4, 1, 3), Direction.UP, new ItemStack(Items.COPPER_INGOT, 64)); scene.idle(40); - scene.world.multiplyKineticSpeed(util.select.everywhere(), 1 / 16f); - scene.overlay.showText(80) + scene.world().multiplyKineticSpeed(util.select().everywhere(), 1 / 16f); + scene.overlay().showText(80) .attachKeyFrame() .text("While a new stack of the configured size exits the side output...") - .pointAt(util.vector.blockSurface(util.grid.at(2, 1, 1), Direction.WEST)) + .pointAt(util.vector().blockSurface(util.grid().at(2, 1, 1), Direction.WEST)) .placeNearTarget(); scene.idle(90); - scene.overlay.showText(80) + scene.overlay().showText(80) .text("...the remainder will continue on its path") - .pointAt(util.vector.blockSurface(util.grid.at(0, 1, 3), Direction.UP)) + .pointAt(util.vector().blockSurface(util.grid().at(0, 1, 3), Direction.UP)) .placeNearTarget(); scene.idle(90); - scene.world.multiplyKineticSpeed(util.select.everywhere(), 16f); + scene.world().multiplyKineticSpeed(util.select().everywhere(), 16f); } public static void redstone(SceneBuilder builder, SceneBuildingUtil util) { CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("weighted_ejector_redstone", "Controlling Weighted Ejectors with Redstone"); scene.configureBasePlate(0, 0, 5); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); scene.idle(5); - scene.world.showSection(util.select.fromTo(4, 1, 3, 4, 1, 5), Direction.DOWN); + scene.world().showSection(util.select().fromTo(4, 1, 3, 4, 1, 5), Direction.DOWN); scene.idle(5); - scene.world.showSection(util.select.fromTo(0, 1, 2, 0, 2, 2), Direction.DOWN); + scene.world().showSection(util.select().fromTo(0, 1, 2, 0, 2, 2), Direction.DOWN); scene.idle(10); - scene.world.showSection(util.select.position(4, 1, 2), Direction.SOUTH); + scene.world().showSection(util.select().position(4, 1, 2), Direction.SOUTH); scene.idle(5); - Selection redstone = util.select.fromTo(3, 1, 2, 2, 1, 2); - scene.world.showSection(redstone, Direction.EAST); + Selection redstone = util.select().fromTo(3, 1, 2, 2, 1, 2); + scene.world().showSection(redstone, Direction.EAST); - BlockPos ejectorPos = util.grid.at(4, 1, 2); - Vec3 topOf = util.vector.topOf(ejectorPos.above(2)); + BlockPos ejectorPos = util.grid().at(4, 1, 2); + Vec3 topOf = util.vector().topOf(ejectorPos.above(2)); ItemStack copper = new ItemStack(Items.COPPER_INGOT); for (int i = 0; i < 3; i++) { - scene.world.createItemEntity(topOf, util.vector.of(0, 0.1, 0), copper); + scene.world().createItemEntity(topOf, util.vector().of(0, 0.1, 0), copper); scene.idle(12); - scene.world.modifyEntities(ItemEntity.class, Entity::discard); - scene.world.createItemOnBeltLike(ejectorPos, Direction.UP, copper); + scene.world().modifyEntities(ItemEntity.class, Entity::discard); + scene.world().createItemOnBeltLike(ejectorPos, Direction.UP, copper); scene.idle(20); if (i == 1) { - scene.world.toggleRedstonePower(redstone); - scene.effects.indicateRedstone(util.grid.at(2, 1, 2)); - scene.world.modifyBlockEntityNBT(util.select.position(4, 1, 2), EjectorBlockEntity.class, + scene.world().toggleRedstonePower(redstone); + scene.effects().indicateRedstone(util.grid().at(2, 1, 2)); + scene.world().modifyBlockEntityNBT(util.select().position(4, 1, 2), EjectorBlockEntity.class, nbt -> nbt.putBoolean("Powered", true)); } } scene.idle(10); - scene.overlay.showText(60) + scene.overlay().showText(60) .colored(PonderPalette.RED) .attachKeyFrame() - .pointAt(util.vector.topOf(ejectorPos)) + .pointAt(util.vector().topOf(ejectorPos)) .placeNearTarget() .text("When powered by Redstone, Ejectors will not activate"); scene.idle(70); - scene.world.toggleRedstonePower(redstone); + scene.world().toggleRedstonePower(redstone); scene.idle(2); - scene.world.modifyBlockEntityNBT(util.select.position(4, 1, 2), EjectorBlockEntity.class, + scene.world().modifyBlockEntityNBT(util.select().position(4, 1, 2), EjectorBlockEntity.class, nbt -> nbt.putBoolean("Powered", false)); scene.idle(5); - scene.world.hideSection(redstone, Direction.WEST); + scene.world().hideSection(redstone, Direction.WEST); scene.idle(30); ElementLink observer = - scene.world.showIndependentSection(util.select.position(4, 1, 1), Direction.SOUTH); - scene.world.moveSection(observer, util.vector.of(0.5, 1.5, -0.5), 0); - scene.world.rotateSection(observer, 0, 30 - 180, 0, 0); + scene.world().showIndependentSection(util.select().position(4, 1, 1), Direction.SOUTH); + scene.world().moveSection(observer, util.vector().of(0.5, 1.5, -0.5), 0); + scene.world().rotateSection(observer, 0, 30 - 180, 0, 0); scene.idle(20); - scene.world.moveSection(observer, util.vector.of(-0.5, -1.5, 0.5), 10); - scene.world.rotateSection(observer, 0, -30 + 180, 0, 10); - scene.world.showSection(util.select.position(4, 1, 0), Direction.SOUTH); + scene.world().moveSection(observer, util.vector().of(-0.5, -1.5, 0.5), 10); + scene.world().rotateSection(observer, 0, -30 + 180, 0, 10); + scene.world().showSection(util.select().position(4, 1, 0), Direction.SOUTH); - Selection observerRedstone = util.select.fromTo(4, 1, 1, 4, 1, 0); + Selection observerRedstone = util.select().fromTo(4, 1, 1, 4, 1, 0); for (int i = 0; i < 6; i++) { - scene.world.createItemEntity(topOf, util.vector.of(0, 0.1, 0), copper); + scene.world().createItemEntity(topOf, util.vector().of(0, 0.1, 0), copper); scene.idle(12); - scene.world.modifyEntities(ItemEntity.class, Entity::discard); - scene.world.createItemOnBeltLike(ejectorPos, Direction.UP, copper); + scene.world().modifyEntities(ItemEntity.class, Entity::discard); + scene.world().createItemOnBeltLike(ejectorPos, Direction.UP, copper); scene.idle(1); - scene.world.toggleRedstonePower(observerRedstone); - scene.effects.indicateRedstone(util.grid.at(4, 1, 1)); + scene.world().toggleRedstonePower(observerRedstone); + scene.effects().indicateRedstone(util.grid().at(4, 1, 1)); scene.idle(3); - scene.world.toggleRedstonePower(observerRedstone); + scene.world().toggleRedstonePower(observerRedstone); scene.idle(16); if (i == 3) scene.markAsFinished(); if (i == 1) { - scene.overlay.showText(60) + scene.overlay().showText(60) .attachKeyFrame() - .pointAt(util.vector.blockSurface(util.grid.at(4, 1, 1), Direction.NORTH)) + .pointAt(util.vector().blockSurface(util.grid().at(4, 1, 1), Direction.NORTH)) .placeNearTarget() .text("Observers can detect when Ejectors activate"); } diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ElevatorScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ElevatorScenes.java index f979e88112..3946596061 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ElevatorScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ElevatorScenes.java @@ -10,10 +10,10 @@ import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; import net.createmod.catnip.utility.lang.Components; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; import net.createmod.ponder.foundation.ElementLink; import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.SceneBuilder; -import net.createmod.ponder.foundation.SceneBuildingUtil; import net.createmod.ponder.foundation.Selection; import net.createmod.ponder.foundation.element.InputWindowElement; import net.createmod.ponder.foundation.element.WorldSectionElement; @@ -34,386 +34,386 @@ public class ElevatorScenes { scene.removeShadow(); scene.setSceneOffsetY(-1.5f); - Selection topFloor = util.select.fromTo(5, 12, 0, 1, 12, 4); - Selection midFloor = util.select.fromTo(5, 6, 0, 1, 6, 4); - Selection botFloor = util.select.fromTo(5, 0, 0, 1, 0, 4); - Selection topCutout = util.select.fromTo(4, 12, 3, 2, 12, 1); - Selection midCutout = util.select.fromTo(4, 6, 3, 2, 6, 1); - Selection botCutout = util.select.fromTo(4, 0, 3, 2, 0, 1); - BlockPos topContact = util.grid.at(1, 13, 2); - BlockPos midContact = util.grid.at(1, 7, 2); - BlockPos botContact = util.grid.at(1, 1, 2); - Selection outputRedstone = util.select.fromTo(0, 0, 2, 0, 1, 2); - Selection topInput = util.select.fromTo(1, 13, 0, 1, 13, 1); - Selection midInput = util.select.fromTo(1, 7, 0, 1, 7, 1); - Selection botInput = util.select.fromTo(1, 1, 0, 1, 1, 1); - Selection pole = util.select.fromTo(6, 0, 3, 6, 17, 3) - .add(util.select.position(5, 17, 3)); - Selection cog = util.select.fromTo(5, 18, 2, 4, 18, 2); - BlockPos nixiePos = util.grid.at(4, 13, 0); - BlockPos linkPos = util.grid.at(1, 14, 2); - BlockPos doorPos = util.grid.at(3, 14, 1); - Selection controls = util.select.position(4, 14, 2); - BlockPos pulleyPos = util.grid.at(3, 18, 2); + Selection topFloor = util.select().fromTo(5, 12, 0, 1, 12, 4); + Selection midFloor = util.select().fromTo(5, 6, 0, 1, 6, 4); + Selection botFloor = util.select().fromTo(5, 0, 0, 1, 0, 4); + Selection topCutout = util.select().fromTo(4, 12, 3, 2, 12, 1); + Selection midCutout = util.select().fromTo(4, 6, 3, 2, 6, 1); + Selection botCutout = util.select().fromTo(4, 0, 3, 2, 0, 1); + BlockPos topContact = util.grid().at(1, 13, 2); + BlockPos midContact = util.grid().at(1, 7, 2); + BlockPos botContact = util.grid().at(1, 1, 2); + Selection outputRedstone = util.select().fromTo(0, 0, 2, 0, 1, 2); + Selection topInput = util.select().fromTo(1, 13, 0, 1, 13, 1); + Selection midInput = util.select().fromTo(1, 7, 0, 1, 7, 1); + Selection botInput = util.select().fromTo(1, 1, 0, 1, 1, 1); + Selection pole = util.select().fromTo(6, 0, 3, 6, 17, 3) + .add(util.select().position(5, 17, 3)); + Selection cog = util.select().fromTo(5, 18, 2, 4, 18, 2); + BlockPos nixiePos = util.grid().at(4, 13, 0); + BlockPos linkPos = util.grid().at(1, 14, 2); + BlockPos doorPos = util.grid().at(3, 14, 1); + Selection controls = util.select().position(4, 14, 2); + BlockPos pulleyPos = util.grid().at(3, 18, 2); - ElementLink camLink = scene.world.showIndependentSection(topFloor, Direction.UP); - scene.world.moveSection(camLink, util.vector.of(0, -12, 0), 0); - scene.world.setKineticSpeed(util.select.position(pulleyPos), 0); + ElementLink camLink = scene.world().showIndependentSection(topFloor, Direction.UP); + scene.world().moveSection(camLink, util.vector().of(0, -12, 0), 0); + scene.world().setKineticSpeed(util.select().position(pulleyPos), 0); scene.idle(5); ElementLink pulleyLink = - scene.world.showIndependentSection(util.select.position(pulleyPos), Direction.DOWN); - scene.world.moveSection(pulleyLink, util.vector.of(0, -16, 0), 0); + scene.world().showIndependentSection(util.select().position(pulleyPos), Direction.DOWN); + scene.world().moveSection(pulleyLink, util.vector().of(0, -16, 0), 0); scene.idle(15); - scene.overlay.showText(60) + scene.overlay().showText(60) .placeNearTarget() - .pointAt(util.vector.blockSurface(util.grid.at(3, 2, 2), Direction.WEST)) + .pointAt(util.vector().blockSurface(util.grid().at(3, 2, 2), Direction.WEST)) .text("Elevator Pulleys can move structures vertically between marked locations"); scene.idle(60); - scene.world.moveSection(pulleyLink, util.vector.of(0, 4, 0), 20); - scene.world.setBlocks(topCutout, Blocks.AIR.defaultBlockState(), false); + scene.world().moveSection(pulleyLink, util.vector().of(0, 4, 0), 20); + scene.world().setBlocks(topCutout, Blocks.AIR.defaultBlockState(), false); scene.idle(5); ElementLink elevatorLink = - scene.world.showIndependentSection(util.select.fromTo(4, 13, 3, 2, 13, 1), Direction.DOWN); - scene.world.moveSection(elevatorLink, util.vector.of(0, -13, 0), 0); + scene.world().showIndependentSection(util.select().fromTo(4, 13, 3, 2, 13, 1), Direction.DOWN); + scene.world().moveSection(elevatorLink, util.vector().of(0, -13, 0), 0); scene.idle(10); - scene.world.showSectionAndMerge(util.select.fromTo(4, 14, 1, 4, 16, 1), Direction.DOWN, elevatorLink); + scene.world().showSectionAndMerge(util.select().fromTo(4, 14, 1, 4, 16, 1), Direction.DOWN, elevatorLink); scene.idle(2); - scene.world.showSectionAndMerge(util.select.fromTo(2, 14, 1, 2, 16, 1), Direction.DOWN, elevatorLink); + scene.world().showSectionAndMerge(util.select().fromTo(2, 14, 1, 2, 16, 1), Direction.DOWN, elevatorLink); scene.idle(2); - scene.world.showSectionAndMerge(util.select.fromTo(4, 14, 3, 4, 16, 3), Direction.DOWN, elevatorLink); + scene.world().showSectionAndMerge(util.select().fromTo(4, 14, 3, 4, 16, 3), Direction.DOWN, elevatorLink); scene.idle(2); - scene.world.showSectionAndMerge(util.select.fromTo(2, 14, 3, 2, 16, 3), Direction.DOWN, elevatorLink); + scene.world().showSectionAndMerge(util.select().fromTo(2, 14, 3, 2, 16, 3), Direction.DOWN, elevatorLink); scene.idle(10); - scene.world.showSectionAndMerge(util.select.fromTo(4, 17, 1, 2, 17, 3), Direction.DOWN, elevatorLink); + scene.world().showSectionAndMerge(util.select().fromTo(4, 17, 1, 2, 17, 3), Direction.DOWN, elevatorLink); - scene.overlay.showText(40) + scene.overlay().showText(40) .placeNearTarget() .attachKeyFrame() - .pointAt(util.vector.blockSurface(util.grid.at(2, 2, 1), Direction.UP)) + .pointAt(util.vector().blockSurface(util.grid().at(2, 2, 1), Direction.UP)) .text("Start by constructing a cabin"); scene.idle(30); - scene.world.showSectionAndMerge(util.select.position(2, 14, 2), Direction.WEST, elevatorLink); + scene.world().showSectionAndMerge(util.select().position(2, 14, 2), Direction.WEST, elevatorLink); scene.idle(2); - scene.world.showSectionAndMerge(util.select.position(1, 13, 2), Direction.EAST, camLink); + scene.world().showSectionAndMerge(util.select().position(1, 13, 2), Direction.EAST, camLink); scene.idle(15); - scene.world.toggleRedstonePower(util.select.fromTo(2, 14, 2, 1, 13, 2)); + scene.world().toggleRedstonePower(util.select().fromTo(2, 14, 2, 1, 13, 2)); scene.idle(15); - scene.overlay.showText(60) + scene.overlay().showText(60) .placeNearTarget() - .pointAt(util.vector.blockSurface(util.grid.at(1, 2, 1), Direction.UP)) + .pointAt(util.vector().blockSurface(util.grid().at(1, 2, 1), Direction.UP)) .text("Place a pair of Redstone Contacts facing each other..."); scene.idle(55); - AABB glue1 = new AABB(util.grid.at(3, 4, 2)); + AABB glue1 = new AABB(util.grid().at(3, 4, 2)); AABB glue2 = glue1.inflate(1, 0, 1) .expandTowards(0, -4, 0); - scene.overlay.showControls(new InputWindowElement(util.vector.centerOf(4, 3, 1), Pointing.RIGHT) + scene.overlay().showControls(new InputWindowElement(util.vector().centerOf(4, 3, 1), Pointing.RIGHT) .withItem(AllItems.SUPER_GLUE.asStack()), 60); scene.idle(7); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, glue1, glue1, 5); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, glue1, glue1, 5); scene.idle(1); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, glue1, glue2, 90); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, glue1, glue2, 90); scene.idle(10); - scene.overlay.showSelectionWithText(util.select.position(2, 1, 2), 80) + scene.overlay().showSelectionWithText(util.select().position(2, 1, 2), 80) .placeNearTarget() .colored(PonderPalette.GREEN) - .pointAt(util.vector.blockSurface(util.grid.at(1, 2, 1), Direction.UP)) + .pointAt(util.vector().blockSurface(util.grid().at(1, 2, 1), Direction.UP)) .text("...and glue one of them to your moving structure"); scene.idle(70); - scene.world.showSectionAndMerge(controls, Direction.DOWN, elevatorLink); + scene.world().showSectionAndMerge(controls, Direction.DOWN, elevatorLink); scene.idle(15); - scene.effects.superGlue(util.grid.at(4, 1, 2), Direction.DOWN, true); + scene.effects().superGlue(util.grid().at(4, 1, 2), Direction.DOWN, true); - scene.overlay.showText(80) + scene.overlay().showText(80) .placeNearTarget() .attachKeyFrame() - .pointAt(util.vector.blockSurface(util.grid.at(4, 1, 2), Direction.UP)) + .pointAt(util.vector().blockSurface(util.grid().at(4, 1, 2), Direction.UP)) .text("Contraption Controls can be attached to make floor selection easier"); scene.idle(70); - scene.world.showSectionAndMerge(cog, Direction.DOWN, camLink); - scene.world.showSectionAndMerge(pole, Direction.UP, camLink); + scene.world().showSectionAndMerge(cog, Direction.DOWN, camLink); + scene.world().showSectionAndMerge(pole, Direction.UP, camLink); scene.idle(10); - scene.world.setKineticSpeed(util.select.position(pulleyPos), 64); + scene.world().setKineticSpeed(util.select().position(pulleyPos), 64); scene.idle(5); - scene.overlay.showText(60) + scene.overlay().showText(60) .placeNearTarget() - .pointAt(util.vector.blockSurface(util.grid.at(3, 6, 2), Direction.WEST)) + .pointAt(util.vector().blockSurface(util.grid().at(3, 6, 2), Direction.WEST)) .text("Ensure that the pulley is supplied with Rotational Power"); scene.idle(75); - scene.overlay.showControls( - new InputWindowElement(util.vector.blockSurface(util.grid.at(3, 6, 2), Direction.NORTH), Pointing.RIGHT) + scene.overlay().showControls( + new InputWindowElement(util.vector().blockSurface(util.grid().at(3, 6, 2), Direction.NORTH), Pointing.RIGHT) .rightClick(), 60); scene.idle(7); - scene.effects.indicateSuccess(util.grid.at(3, 6, 2)); - scene.world.toggleRedstonePower(util.select.position(1, 13, 2)); - scene.world.setBlock(topContact, AllBlocks.ELEVATOR_CONTACT.getDefaultState() + scene.effects().indicateSuccess(util.grid().at(3, 6, 2)); + scene.world().toggleRedstonePower(util.select().position(1, 13, 2)); + scene.world().setBlock(topContact, AllBlocks.ELEVATOR_CONTACT.getDefaultState() .setValue(ElevatorContactBlock.FACING, Direction.EAST) .setValue(ElevatorContactBlock.POWERING, true), false); - scene.world.movePulley(pulleyPos, 1, 0); + scene.world().movePulley(pulleyPos, 1, 0); - scene.overlay.showText(50) + scene.overlay().showText(50) .placeNearTarget() .attachKeyFrame() - .pointAt(util.vector.blockSurface(util.grid.at(3, 6, 2), Direction.WEST)) + .pointAt(util.vector().blockSurface(util.grid().at(3, 6, 2), Direction.WEST)) .text("Right-Clicking the pulley assembles the elevator"); scene.idle(60); - scene.overlay.showText(70) + scene.overlay().showText(70) .placeNearTarget() - .pointAt(util.vector.blockSurface(util.grid.at(1, 1, 2), Direction.UP)) + .pointAt(util.vector().blockSurface(util.grid().at(1, 1, 2), Direction.UP)) .text("The stationary contact now turns into an Elevator Contact"); scene.idle(80); - scene.overlay.showControls( - new InputWindowElement(util.vector.blockSurface(util.grid.at(1, 1, 2), Direction.UP), Pointing.DOWN) + scene.overlay().showControls( + new InputWindowElement(util.vector().blockSurface(util.grid().at(1, 1, 2), Direction.UP), Pointing.DOWN) .rightClick(), 60); scene.idle(7); - scene.overlay.showSelectionWithText(util.select.position(1, 1, 2), 60) + scene.overlay().showSelectionWithText(util.select().position(1, 1, 2), 60) .placeNearTarget() .colored(PonderPalette.BLUE) - .pointAt(util.vector.blockSurface(util.grid.at(1, 1, 2), Direction.UP)) + .pointAt(util.vector().blockSurface(util.grid().at(1, 1, 2), Direction.UP)) .text("Elevator Contacts represent a 'floor' and can be configured"); scene.idle(75); - scene.world.moveSection(elevatorLink, util.vector.of(0, 7, 0), 15); - scene.world.moveSection(camLink, util.vector.of(0, 7, 0), 15); - scene.world.moveSection(pulleyLink, util.vector.of(0, 7, 0), 15); + scene.world().moveSection(elevatorLink, util.vector().of(0, 7, 0), 15); + scene.world().moveSection(camLink, util.vector().of(0, 7, 0), 15); + scene.world().moveSection(pulleyLink, util.vector().of(0, 7, 0), 15); scene.addLazyKeyframe(); - scene.world.setBlocks(midCutout, Blocks.AIR.defaultBlockState(), false); + scene.world().setBlocks(midCutout, Blocks.AIR.defaultBlockState(), false); scene.idle(15); - scene.world.showSectionAndMerge(midFloor, Direction.EAST, camLink); + scene.world().showSectionAndMerge(midFloor, Direction.EAST, camLink); scene.idle(5); - scene.world.showSectionAndMerge(util.select.position(midContact), Direction.DOWN, camLink); + scene.world().showSectionAndMerge(util.select().position(midContact), Direction.DOWN, camLink); scene.idle(10); - scene.effects.indicateSuccess(util.grid.at(1, 2, 2)); - scene.world.setBlock(midContact, AllBlocks.ELEVATOR_CONTACT.getDefaultState() + scene.effects().indicateSuccess(util.grid().at(1, 2, 2)); + scene.world().setBlock(midContact, AllBlocks.ELEVATOR_CONTACT.getDefaultState() .setValue(ElevatorContactBlock.FACING, Direction.EAST), false); scene.idle(15); - AABB bb = new AABB(util.grid.at(1, 8, 2)); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.WHITE, bb, bb, 5); + AABB bb = new AABB(util.grid().at(1, 8, 2)); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.WHITE, bb, bb, 5); scene.idle(1); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.WHITE, bb, bb.expandTowards(0, -6, 0), 90); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.WHITE, bb, bb.expandTowards(0, -6, 0), 90); scene.idle(10); - scene.overlay.showText(60) + scene.overlay().showText(60) .placeNearTarget() - .pointAt(util.vector.blockSurface(util.grid.at(1, 2, 2), Direction.UP)) + .pointAt(util.vector().blockSurface(util.grid().at(1, 2, 2), Direction.UP)) .text("Any redstone contact sharing this column will be converted"); scene.idle(50); - scene.world.showSectionAndMerge(midInput, Direction.SOUTH, camLink); + scene.world().showSectionAndMerge(midInput, Direction.SOUTH, camLink); scene.idle(15); - scene.world.toggleRedstonePower(midInput); - scene.effects.indicateRedstone(util.grid.at(1, 2, 0)); - scene.world.cycleBlockProperty(midContact, ElevatorContactBlock.CALLING); - scene.world.cycleBlockProperty(topContact, ElevatorContactBlock.POWERING); - scene.world.moveSection(elevatorLink, util.vector.of(0, -6, 0), 60); - scene.world.movePulley(pulleyPos, 6, 60); + scene.world().toggleRedstonePower(midInput); + scene.effects().indicateRedstone(util.grid().at(1, 2, 0)); + scene.world().cycleBlockProperty(midContact, ElevatorContactBlock.CALLING); + scene.world().cycleBlockProperty(topContact, ElevatorContactBlock.POWERING); + scene.world().moveSection(elevatorLink, util.vector().of(0, -6, 0), 60); + scene.world().movePulley(pulleyPos, 6, 60); scene.idle(20); - scene.world.toggleRedstonePower(midInput); + scene.world().toggleRedstonePower(midInput); scene.idle(10); - scene.overlay.showText(60) + scene.overlay().showText(60) .placeNearTarget() - .pointAt(util.vector.blockSurface(util.grid.at(1, 1, 0), Direction.UP)) + .pointAt(util.vector().blockSurface(util.grid().at(1, 1, 0), Direction.UP)) .text("Supply a redstone pulse to call the elevator to the contact"); scene.idle(30); - scene.world.cycleBlockProperty(midContact, ElevatorContactBlock.CALLING); - scene.world.cycleBlockProperty(midContact, ElevatorContactBlock.POWERING); - scene.world.toggleRedstonePower(util.select.position(1, 7, 1)); + scene.world().cycleBlockProperty(midContact, ElevatorContactBlock.CALLING); + scene.world().cycleBlockProperty(midContact, ElevatorContactBlock.POWERING); + scene.world().toggleRedstonePower(util.select().position(1, 7, 1)); scene.idle(40); - scene.overlay.showText(70) + scene.overlay().showText(70) .placeNearTarget() - .pointAt(util.vector.centerOf(util.grid.at(2, 3, 3))) + .pointAt(util.vector().centerOf(util.grid().at(2, 3, 3))) .text("The movement speed depends on the rotation input on the pulley"); scene.idle(80); scene.addLazyKeyframe(); scene.idle(10); - scene.overlay.showControls( - new InputWindowElement(util.vector.blockSurface(util.grid.at(4, 2, 2), Direction.UP), Pointing.DOWN) + scene.overlay().showControls( + new InputWindowElement(util.vector().blockSurface(util.grid().at(4, 2, 2), Direction.UP), Pointing.DOWN) .scroll(), 60); scene.idle(15); - scene.overlay.showText(90) + scene.overlay().showText(90) .placeNearTarget() - .pointAt(util.vector.blockSurface(util.grid.at(4, 2, 2), Direction.UP)) + .pointAt(util.vector().blockSurface(util.grid().at(4, 2, 2), Direction.UP)) .text("Scroll and click on the controls block to choose a floor while on-board"); scene.idle(85); - scene.overlay.showControls( - new InputWindowElement(util.vector.blockSurface(util.grid.at(4, 2, 2), Direction.UP), Pointing.DOWN) + scene.overlay().showControls( + new InputWindowElement(util.vector().blockSurface(util.grid().at(4, 2, 2), Direction.UP), Pointing.DOWN) .rightClick(), 10); scene.idle(7); - scene.world.cycleBlockProperty(midContact, ElevatorContactBlock.POWERING); - scene.world.cycleBlockProperty(topContact, ElevatorContactBlock.CALLING); - scene.world.toggleRedstonePower(util.select.position(1, 7, 1)); - scene.world.moveSection(camLink, util.vector.of(0, -7, 0), 60); - scene.world.moveSection(pulleyLink, util.vector.of(0, -7, 0), 60); - scene.world.moveSection(elevatorLink, util.vector.of(0, -1, 0), 60); - scene.world.movePulley(pulleyPos, -6, 60); + scene.world().cycleBlockProperty(midContact, ElevatorContactBlock.POWERING); + scene.world().cycleBlockProperty(topContact, ElevatorContactBlock.CALLING); + scene.world().toggleRedstonePower(util.select().position(1, 7, 1)); + scene.world().moveSection(camLink, util.vector().of(0, -7, 0), 60); + scene.world().moveSection(pulleyLink, util.vector().of(0, -7, 0), 60); + scene.world().moveSection(elevatorLink, util.vector().of(0, -1, 0), 60); + scene.world().movePulley(pulleyPos, -6, 60); scene.idle(60); - scene.world.cycleBlockProperty(topContact, ElevatorContactBlock.POWERING); - scene.world.cycleBlockProperty(topContact, ElevatorContactBlock.CALLING); + scene.world().cycleBlockProperty(topContact, ElevatorContactBlock.POWERING); + scene.world().cycleBlockProperty(topContact, ElevatorContactBlock.CALLING); scene.idle(15); - scene.overlay.showControls( - new InputWindowElement(util.vector.blockSurface(util.grid.at(3, 6, 2), Direction.NORTH), Pointing.RIGHT) + scene.overlay().showControls( + new InputWindowElement(util.vector().blockSurface(util.grid().at(3, 6, 2), Direction.NORTH), Pointing.RIGHT) .rightClick(), 60); scene.idle(7); - scene.effects.indicateSuccess(util.grid.at(3, 6, 2)); - scene.world.movePulley(pulleyPos, -1, 0); + scene.effects().indicateSuccess(util.grid().at(3, 6, 2)); + scene.world().movePulley(pulleyPos, -1, 0); - scene.overlay.showText(80) + scene.overlay().showText(80) .placeNearTarget() .attachKeyFrame() - .pointAt(util.vector.blockSurface(util.grid.at(3, 6, 2), Direction.WEST)) + .pointAt(util.vector().blockSurface(util.grid().at(3, 6, 2), Direction.WEST)) .text("Right-Clicking the assembled pulley will turn the cabin back into blocks"); scene.idle(90); - scene.world.showSectionAndMerge(util.select.fromTo(doorPos, doorPos.above()), Direction.DOWN, elevatorLink); + scene.world().showSectionAndMerge(util.select().fromTo(doorPos, doorPos.above()), Direction.DOWN, elevatorLink); scene.idle(20); - scene.overlay.showControls( - new InputWindowElement(util.vector.blockSurface(util.grid.at(3, 6, 2), Direction.NORTH), Pointing.RIGHT) + scene.overlay().showControls( + new InputWindowElement(util.vector().blockSurface(util.grid().at(3, 6, 2), Direction.NORTH), Pointing.RIGHT) .rightClick(), 60); scene.idle(7); - scene.effects.indicateSuccess(util.grid.at(3, 6, 2)); - scene.world.movePulley(pulleyPos, 1, 0); - scene.world.cycleBlockProperty(doorPos, SlidingDoorBlock.OPEN); - scene.world.cycleBlockProperty(doorPos, SlidingDoorBlock.VISIBLE); - scene.world.cycleBlockProperty(doorPos.above(), SlidingDoorBlock.VISIBLE); + scene.effects().indicateSuccess(util.grid().at(3, 6, 2)); + scene.world().movePulley(pulleyPos, 1, 0); + scene.world().cycleBlockProperty(doorPos, SlidingDoorBlock.OPEN); + scene.world().cycleBlockProperty(doorPos, SlidingDoorBlock.VISIBLE); + scene.world().cycleBlockProperty(doorPos.above(), SlidingDoorBlock.VISIBLE); - scene.overlay.showText(80) + scene.overlay().showText(80) .placeNearTarget() .attachKeyFrame() - .pointAt(util.vector.blockSurface(util.grid.at(3, 1, 1), Direction.NORTH)) + .pointAt(util.vector().blockSurface(util.grid().at(3, 1, 1), Direction.NORTH)) .text("Sliding doors attached to the cabin will open and close automatically"); scene.idle(90); - scene.world.moveSection(elevatorLink, util.vector.of(0, 13, 0), 15); - scene.world.moveSection(camLink, util.vector.of(0, 13, 0), 15); - scene.world.moveSection(pulleyLink, util.vector.of(0, 13, 0), 15); - scene.world.setBlocks(botCutout, Blocks.AIR.defaultBlockState(), false); + scene.world().moveSection(elevatorLink, util.vector().of(0, 13, 0), 15); + scene.world().moveSection(camLink, util.vector().of(0, 13, 0), 15); + scene.world().moveSection(pulleyLink, util.vector().of(0, 13, 0), 15); + scene.world().setBlocks(botCutout, Blocks.AIR.defaultBlockState(), false); scene.idle(15); - scene.world.showSectionAndMerge(botFloor, Direction.EAST, camLink); + scene.world().showSectionAndMerge(botFloor, Direction.EAST, camLink); scene.idle(5); - scene.world.showSectionAndMerge(util.select.position(botContact), Direction.DOWN, camLink); + scene.world().showSectionAndMerge(util.select().position(botContact), Direction.DOWN, camLink); scene.idle(10); - scene.effects.indicateSuccess(util.grid.at(1, 2, 2)); - scene.world.setBlock(botContact, AllBlocks.ELEVATOR_CONTACT.getDefaultState() + scene.effects().indicateSuccess(util.grid().at(1, 2, 2)); + scene.world().setBlock(botContact, AllBlocks.ELEVATOR_CONTACT.getDefaultState() .setValue(ElevatorContactBlock.FACING, Direction.EAST), false); scene.idle(5); - scene.world.showSectionAndMerge(botInput, Direction.SOUTH, camLink); + scene.world().showSectionAndMerge(botInput, Direction.SOUTH, camLink); scene.idle(15); - scene.world.toggleRedstonePower(botInput); - scene.effects.indicateRedstone(util.grid.at(1, 2, 0)); - scene.world.cycleBlockProperty(botContact, ElevatorContactBlock.CALLING); - scene.world.cycleBlockProperty(topContact, ElevatorContactBlock.POWERING); - scene.world.moveSection(elevatorLink, util.vector.of(0, -12, 0), 50); - scene.world.movePulley(pulleyPos, 12, 50); - scene.world.cycleBlockProperty(doorPos, SlidingDoorBlock.OPEN); - scene.world.cycleBlockProperty(doorPos, SlidingDoorBlock.VISIBLE); - scene.world.cycleBlockProperty(doorPos.above(), SlidingDoorBlock.VISIBLE); + scene.world().toggleRedstonePower(botInput); + scene.effects().indicateRedstone(util.grid().at(1, 2, 0)); + scene.world().cycleBlockProperty(botContact, ElevatorContactBlock.CALLING); + scene.world().cycleBlockProperty(topContact, ElevatorContactBlock.POWERING); + scene.world().moveSection(elevatorLink, util.vector().of(0, -12, 0), 50); + scene.world().movePulley(pulleyPos, 12, 50); + scene.world().cycleBlockProperty(doorPos, SlidingDoorBlock.OPEN); + scene.world().cycleBlockProperty(doorPos, SlidingDoorBlock.VISIBLE); + scene.world().cycleBlockProperty(doorPos.above(), SlidingDoorBlock.VISIBLE); scene.idle(20); - scene.world.toggleRedstonePower(botInput); - scene.world.showSectionAndMerge(outputRedstone, Direction.EAST, camLink); + scene.world().toggleRedstonePower(botInput); + scene.world().showSectionAndMerge(outputRedstone, Direction.EAST, camLink); scene.idle(30); - scene.world.cycleBlockProperty(botContact, ElevatorContactBlock.CALLING); - scene.world.cycleBlockProperty(botContact, ElevatorContactBlock.POWERING); - scene.world.toggleRedstonePower(util.select.position(1, 1, 1)); - scene.world.toggleRedstonePower(outputRedstone); - scene.world.cycleBlockProperty(doorPos, SlidingDoorBlock.OPEN); - scene.world.cycleBlockProperty(doorPos, SlidingDoorBlock.VISIBLE); - scene.world.cycleBlockProperty(doorPos.above(), SlidingDoorBlock.VISIBLE); + scene.world().cycleBlockProperty(botContact, ElevatorContactBlock.CALLING); + scene.world().cycleBlockProperty(botContact, ElevatorContactBlock.POWERING); + scene.world().toggleRedstonePower(util.select().position(1, 1, 1)); + scene.world().toggleRedstonePower(outputRedstone); + scene.world().cycleBlockProperty(doorPos, SlidingDoorBlock.OPEN); + scene.world().cycleBlockProperty(doorPos, SlidingDoorBlock.VISIBLE); + scene.world().cycleBlockProperty(doorPos.above(), SlidingDoorBlock.VISIBLE); scene.idle(15); - scene.overlay.showText(80) + scene.overlay().showText(80) .placeNearTarget() .attachKeyFrame() - .pointAt(util.vector.topOf(0, 1, 2)) + .pointAt(util.vector().topOf(0, 1, 2)) .text("Elevator Contacts emit a signal while the cabin is on their floor"); scene.idle(90); - scene.overlay.showText(80) + scene.overlay().showText(80) .placeNearTarget() - .pointAt(util.vector.topOf(0, 1, 2)) + .pointAt(util.vector().topOf(0, 1, 2)) .text("This can be useful to trigger doors or special effects upon arrival"); scene.idle(90); - scene.world.setBlock(nixiePos, AllBlocks.NIXIE_TUBES.get(DyeColor.GREEN) + scene.world().setBlock(nixiePos, AllBlocks.NIXIE_TUBES.get(DyeColor.GREEN) .getDefaultState() .setValue(NixieTubeBlock.FACING, Direction.WEST), false); - scene.world.moveSection(camLink, util.vector.of(0, -13, 0), 20); - scene.world.moveSection(pulleyLink, util.vector.of(0, -13, 0), 20); - scene.world.moveSection(elevatorLink, util.vector.of(0, -13, 0), 20); + scene.world().moveSection(camLink, util.vector().of(0, -13, 0), 20); + scene.world().moveSection(pulleyLink, util.vector().of(0, -13, 0), 20); + scene.world().moveSection(elevatorLink, util.vector().of(0, -13, 0), 20); scene.idle(30); - scene.world.showSectionAndMerge(util.select.position(nixiePos), Direction.DOWN, camLink); + scene.world().showSectionAndMerge(util.select().position(nixiePos), Direction.DOWN, camLink); scene.idle(15); - scene.overlay.showControls( - new InputWindowElement(util.vector.blockSurface(util.grid.at(4, 1, 0), Direction.UP), Pointing.DOWN) + scene.overlay().showControls( + new InputWindowElement(util.vector().blockSurface(util.grid().at(4, 1, 0), Direction.UP), Pointing.DOWN) .rightClick() .withItem(AllBlocks.DISPLAY_LINK.asStack()), 15); - scene.world.toggleRedstonePower(util.select.position(1, 14, 2)); + scene.world().toggleRedstonePower(util.select().position(1, 14, 2)); scene.idle(15); - scene.world.showSectionAndMerge(util.select.position(linkPos), Direction.DOWN, camLink); - scene.world.flashDisplayLink(linkPos); - scene.world.modifyBlockEntityNBT(util.select.position(nixiePos), NixieTubeBlockEntity.class, nbt -> { + scene.world().showSectionAndMerge(util.select().position(linkPos), Direction.DOWN, camLink); + scene.world().flashDisplayLink(linkPos); + scene.world().modifyBlockEntityNBT(util.select().position(nixiePos), NixieTubeBlockEntity.class, nbt -> { Component component = Components.literal("0F"); nbt.putString("RawCustomText", component.getString()); nbt.putString("CustomText", Component.Serializer.toJson(component)); }); - scene.overlay.showText(90) + scene.overlay().showText(90) .placeNearTarget() .attachKeyFrame() - .pointAt(util.vector.centerOf(1, 2, 2)) + .pointAt(util.vector().centerOf(1, 2, 2)) .text("Display Links on any of the contacts can show the current floor of the elevator"); scene.idle(90); - scene.world.showSectionAndMerge(topInput, Direction.SOUTH, camLink); + scene.world().showSectionAndMerge(topInput, Direction.SOUTH, camLink); scene.idle(15); - scene.world.toggleRedstonePower(topInput); - scene.effects.indicateRedstone(util.grid.at(1, 2, 0)); - scene.world.cycleBlockProperty(topContact, ElevatorContactBlock.CALLING); - scene.world.cycleBlockProperty(botContact, ElevatorContactBlock.POWERING); - scene.world.moveSection(elevatorLink, util.vector.of(0, 12, 0), 70); - scene.world.movePulley(pulleyPos, -12, 70); - scene.world.cycleBlockProperty(doorPos, SlidingDoorBlock.OPEN); - scene.world.cycleBlockProperty(doorPos, SlidingDoorBlock.VISIBLE); - scene.world.cycleBlockProperty(doorPos.above(), SlidingDoorBlock.VISIBLE); + scene.world().toggleRedstonePower(topInput); + scene.effects().indicateRedstone(util.grid().at(1, 2, 0)); + scene.world().cycleBlockProperty(topContact, ElevatorContactBlock.CALLING); + scene.world().cycleBlockProperty(botContact, ElevatorContactBlock.POWERING); + scene.world().moveSection(elevatorLink, util.vector().of(0, 12, 0), 70); + scene.world().movePulley(pulleyPos, -12, 70); + scene.world().cycleBlockProperty(doorPos, SlidingDoorBlock.OPEN); + scene.world().cycleBlockProperty(doorPos, SlidingDoorBlock.VISIBLE); + scene.world().cycleBlockProperty(doorPos.above(), SlidingDoorBlock.VISIBLE); scene.idle(20); - scene.world.toggleRedstonePower(topInput); + scene.world().toggleRedstonePower(topInput); scene.idle(10); - scene.world.flashDisplayLink(linkPos); - scene.world.modifyBlockEntityNBT(util.select.position(nixiePos), NixieTubeBlockEntity.class, nbt -> { + scene.world().flashDisplayLink(linkPos); + scene.world().modifyBlockEntityNBT(util.select().position(nixiePos), NixieTubeBlockEntity.class, nbt -> { Component component = Components.literal("1F"); nbt.putString("RawCustomText", component.getString()); nbt.putString("CustomText", Component.Serializer.toJson(component)); @@ -421,15 +421,15 @@ public class ElevatorScenes { scene.idle(40); - scene.world.cycleBlockProperty(topContact, ElevatorContactBlock.CALLING); - scene.world.cycleBlockProperty(topContact, ElevatorContactBlock.POWERING); - scene.world.toggleRedstonePower(util.select.position(1, 13, 1)); - scene.world.cycleBlockProperty(doorPos, SlidingDoorBlock.OPEN); - scene.world.cycleBlockProperty(doorPos, SlidingDoorBlock.VISIBLE); - scene.world.cycleBlockProperty(doorPos.above(), SlidingDoorBlock.VISIBLE); + scene.world().cycleBlockProperty(topContact, ElevatorContactBlock.CALLING); + scene.world().cycleBlockProperty(topContact, ElevatorContactBlock.POWERING); + scene.world().toggleRedstonePower(util.select().position(1, 13, 1)); + scene.world().cycleBlockProperty(doorPos, SlidingDoorBlock.OPEN); + scene.world().cycleBlockProperty(doorPos, SlidingDoorBlock.VISIBLE); + scene.world().cycleBlockProperty(doorPos.above(), SlidingDoorBlock.VISIBLE); - scene.world.flashDisplayLink(linkPos); - scene.world.modifyBlockEntityNBT(util.select.position(nixiePos), NixieTubeBlockEntity.class, nbt -> { + scene.world().flashDisplayLink(linkPos); + scene.world().modifyBlockEntityNBT(util.select().position(nixiePos), NixieTubeBlockEntity.class, nbt -> { Component component = Components.literal("2F"); nbt.putString("RawCustomText", component.getString()); nbt.putString("CustomText", Component.Serializer.toJson(component)); @@ -445,69 +445,69 @@ public class ElevatorScenes { scene.showBasePlate(); scene.idle(5); - Selection mainPulley = util.select.fromTo(5, 0, 1, 5, 4, 1) - .add(util.select.fromTo(4, 4, 1, 3, 4, 1)); - BlockPos pulley1 = util.grid.at(3, 4, 1); - BlockPos pulley2 = util.grid.at(3, 4, 3); - BlockPos pulley3 = util.grid.at(1, 4, 3); - Selection contraption = util.select.fromTo(3, 1, 3, 1, 1, 1); + Selection mainPulley = util.select().fromTo(5, 0, 1, 5, 4, 1) + .add(util.select().fromTo(4, 4, 1, 3, 4, 1)); + BlockPos pulley1 = util.grid().at(3, 4, 1); + BlockPos pulley2 = util.grid().at(3, 4, 3); + BlockPos pulley3 = util.grid().at(1, 4, 3); + Selection contraption = util.select().fromTo(3, 1, 3, 1, 1, 1); - ElementLink planksLink = scene.world.showIndependentSection(contraption, Direction.DOWN); + ElementLink planksLink = scene.world().showIndependentSection(contraption, Direction.DOWN); scene.idle(10); - scene.world.showSection(mainPulley, Direction.WEST); + scene.world().showSection(mainPulley, Direction.WEST); scene.idle(4); - scene.world.showSection(util.select.position(pulley2), Direction.DOWN); + scene.world().showSection(util.select().position(pulley2), Direction.DOWN); scene.idle(4); - scene.world.showSection(util.select.position(pulley3), Direction.DOWN); + scene.world().showSection(util.select().position(pulley3), Direction.DOWN); scene.idle(15); - scene.world.movePulley(pulley1, 2, 20); + scene.world().movePulley(pulley1, 2, 20); scene.idle(20); - scene.overlay.showText(60) - .pointAt(util.vector.topOf(util.grid.at(3, 1, 1))) + scene.overlay().showText(60) + .pointAt(util.vector().topOf(util.grid().at(3, 1, 1))) .placeNearTarget() .text("Whenever a pulley assembles a contraption..."); scene.idle(70); - scene.world.movePulley(pulley2, 2, 0); - scene.world.movePulley(pulley3, 2, 0); + scene.world().movePulley(pulley2, 2, 0); + scene.world().movePulley(pulley3, 2, 0); scene.idle(1); - scene.world.movePulley(pulley1, -2, 20); - scene.world.movePulley(pulley2, -2, 20); - scene.world.movePulley(pulley3, -2, 20); - scene.world.moveSection(planksLink, util.vector.of(0, 2, 0), 20); + scene.world().movePulley(pulley1, -2, 20); + scene.world().movePulley(pulley2, -2, 20); + scene.world().movePulley(pulley3, -2, 20); + scene.world().moveSection(planksLink, util.vector().of(0, 2, 0), 20); scene.idle(20); - scene.overlay.showText(80) - .pointAt(util.vector.blockSurface(util.grid.at(1, 4, 3), Direction.WEST)) + scene.overlay().showText(80) + .pointAt(util.vector().blockSurface(util.grid().at(1, 4, 3), Direction.WEST)) .placeNearTarget() .text("...other pulleys on the same layer will connect to the structure"); scene.idle(60); - scene.world.movePulley(pulley1, 2, 20); - scene.world.movePulley(pulley2, 2, 20); - scene.world.movePulley(pulley3, 2, 20); - scene.world.moveSection(planksLink, util.vector.of(0, -2, 0), 20); + scene.world().movePulley(pulley1, 2, 20); + scene.world().movePulley(pulley2, 2, 20); + scene.world().movePulley(pulley3, 2, 20); + scene.world().moveSection(planksLink, util.vector().of(0, -2, 0), 20); scene.idle(20); scene.idle(20); - scene.world.movePulley(pulley1, -2, 20); - scene.world.movePulley(pulley2, -2, 20); - scene.world.movePulley(pulley3, -2, 20); - scene.world.moveSection(planksLink, util.vector.of(0, 2, 0), 20); + scene.world().movePulley(pulley1, -2, 20); + scene.world().movePulley(pulley2, -2, 20); + scene.world().movePulley(pulley3, -2, 20); + scene.world().moveSection(planksLink, util.vector().of(0, 2, 0), 20); scene.idle(20); - scene.overlay.showText(80) - .pointAt(util.vector.blockSurface(util.grid.at(1, 4, 3), Direction.WEST)) + scene.overlay().showText(80) + .pointAt(util.vector().blockSurface(util.grid().at(1, 4, 3), Direction.WEST)) .placeNearTarget() .text("They do not require to be powered, the effect is purely cosmetic"); scene.idle(60); - scene.world.movePulley(pulley1, 2, 20); - scene.world.movePulley(pulley2, 2, 20); - scene.world.movePulley(pulley3, 2, 20); - scene.world.moveSection(planksLink, util.vector.of(0, -2, 0), 20); + scene.world().movePulley(pulley1, 2, 20); + scene.world().movePulley(pulley2, 2, 20); + scene.world().movePulley(pulley3, 2, 20); + scene.world().moveSection(planksLink, util.vector().of(0, -2, 0), 20); scene.idle(20); } diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/FanScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/FanScenes.java index 250a5069a0..288f1d03c1 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/FanScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/FanScenes.java @@ -6,10 +6,10 @@ import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import com.simibubi.create.foundation.ponder.element.BeltItemElement; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; import net.createmod.ponder.foundation.ElementLink; import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.SceneBuilder; -import net.createmod.ponder.foundation.SceneBuildingUtil; import net.createmod.ponder.foundation.Selection; import net.createmod.ponder.foundation.element.EntityElement; import net.createmod.ponder.foundation.element.InputWindowElement; @@ -33,57 +33,57 @@ public class FanScenes { CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("fan_direction", "Air flow of Encased Fans"); scene.configureBasePlate(0, 1, 5); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); scene.idle(5); - scene.world.showSection(util.select.fromTo(3, 1, 0, 3, 1, 5) - .add(util.select.position(3, 2, 4)), Direction.DOWN); - scene.world.showSection(util.select.fromTo(2, 1, 5, 1, 1, 5), Direction.DOWN); + scene.world().showSection(util.select().fromTo(3, 1, 0, 3, 1, 5) + .add(util.select().position(3, 2, 4)), Direction.DOWN); + scene.world().showSection(util.select().fromTo(2, 1, 5, 1, 1, 5), Direction.DOWN); scene.idle(10); - BlockPos fanPos = util.grid.at(1, 1, 4); - scene.world.showSection(util.select.position(fanPos), Direction.SOUTH); + BlockPos fanPos = util.grid().at(1, 1, 4); + scene.world().showSection(util.select().position(fanPos), Direction.SOUTH); scene.idle(40); - scene.effects.rotationDirectionIndicator(fanPos.south()); + scene.effects().rotationDirectionIndicator(fanPos.south()); - ElementLink flappyBirb = scene.special.createBirb(util.vector.topOf(1, 0, 3), ParrotElement.FlappyPose::new); + ElementLink flappyBirb = scene.special().createBirb(util.vector().topOf(1, 0, 3), ParrotElement.FlappyPose::new); scene.idle(2); - scene.special.rotateParrot(flappyBirb, 0, 235, 0, 30); - scene.special.moveParrot(flappyBirb, util.vector.of(0, 0, -2.5), 30); + scene.special().rotateParrot(flappyBirb, 0, 235, 0, 30); + scene.special().moveParrot(flappyBirb, util.vector().of(0, 0, -2.5), 30); scene.idle(20); - scene.overlay.showText(80) + scene.overlay().showText(80) .text("Encased Fans use Rotational Force to create an Air Current") .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.topOf(fanPos)); + .pointAt(util.vector().topOf(fanPos)); scene.idle(90); - BlockPos leverPos = util.grid.at(3, 2, 4); - Selection reverse = util.select.fromTo(3, 1, 5, 1, 1, 4); - scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.below())); - scene.effects.indicateRedstone(leverPos); + BlockPos leverPos = util.grid().at(3, 2, 4); + Selection reverse = util.select().fromTo(3, 1, 5, 1, 1, 4); + scene.world().toggleRedstonePower(util.select().fromTo(leverPos, leverPos.below())); + scene.effects().indicateRedstone(leverPos); scene.addKeyframe(); - scene.world.modifyKineticSpeed(reverse, f -> -f); - scene.effects.rotationDirectionIndicator(fanPos.south()); - scene.special.rotateParrot(flappyBirb, 0, 215 * 2, 0, 30); - scene.special.moveParrot(flappyBirb, util.vector.of(0, 0, 2.5), 30); + scene.world().modifyKineticSpeed(reverse, f -> -f); + scene.effects().rotationDirectionIndicator(fanPos.south()); + scene.special().rotateParrot(flappyBirb, 0, 215 * 2, 0, 30); + scene.special().moveParrot(flappyBirb, util.vector().of(0, 0, 2.5), 30); scene.idle(31); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("Strength and Direction of Flow depends on the Rotational Input") .placeNearTarget() - .pointAt(util.vector.topOf(fanPos)); + .pointAt(util.vector().topOf(fanPos)); scene.markAsFinished(); scene.idle(70); - scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.below())); - scene.effects.indicateRedstone(leverPos); - scene.world.modifyKineticSpeed(reverse, f -> -f); - scene.world.modifyKineticSpeed(util.select.everywhere(), f -> 4 * f); - scene.effects.rotationSpeedIndicator(fanPos.south()); - scene.special.rotateParrot(flappyBirb, 0, 245 * 4, 0, 30); - scene.special.moveParrot(flappyBirb, util.vector.of(0, 0, -20), 30); + scene.world().toggleRedstonePower(util.select().fromTo(leverPos, leverPos.below())); + scene.effects().indicateRedstone(leverPos); + scene.world().modifyKineticSpeed(reverse, f -> -f); + scene.world().modifyKineticSpeed(util.select().everywhere(), f -> 4 * f); + scene.effects().rotationSpeedIndicator(fanPos.south()); + scene.special().rotateParrot(flappyBirb, 0, 245 * 4, 0, 30); + scene.special().moveParrot(flappyBirb, util.vector().of(0, 0, -20), 30); } @@ -91,24 +91,24 @@ public class FanScenes { CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("fan_processing", "Processing Items using Encased Fans"); scene.configureBasePlate(1, 0, 5); - scene.world.showSection(util.select.layer(0) - .substract(util.select.position(0, 0, 4)), Direction.UP); + scene.world().showSection(util.select().layer(0) + .substract(util.select().position(0, 0, 4)), Direction.UP); scene.idle(5); - scene.world.showSection(util.select.fromTo(6, 1, 2, 5, 1, 2) - .add(util.select.position(1, 1, 2)), Direction.DOWN); + scene.world().showSection(util.select().fromTo(6, 1, 2, 5, 1, 2) + .add(util.select().position(1, 1, 2)), Direction.DOWN); scene.idle(25); - BlockPos blockPos = util.grid.at(4, 1, 2); + BlockPos blockPos = util.grid().at(4, 1, 2); // blasting start ElementLink blockInFront = - scene.world.showIndependentSection(util.select.position(3, 1, 0), Direction.SOUTH); - scene.world.moveSection(blockInFront, util.vector.of(1, 0, 2), 0); - scene.world.setBlock(blockPos, Blocks.LAVA.defaultBlockState(), false); + scene.world().showIndependentSection(util.select().position(3, 1, 0), Direction.SOUTH); + scene.world().moveSection(blockInFront, util.vector().of(1, 0, 2), 0); + scene.world().setBlock(blockPos, Blocks.LAVA.defaultBlockState(), false); scene.idle(10); - scene.overlay.showSelectionWithText(util.select.fromTo(blockPos, blockPos.west(2)), 80) + scene.overlay().showSelectionWithText(util.select().fromTo(blockPos, blockPos.west(2)), 80) .colored(PonderPalette.RED) .text("When passing through lava, the Air Flow becomes Heated"); scene.idle(80); @@ -116,18 +116,18 @@ public class FanScenes { ItemStack stack = new ItemStack(Items.GOLD_ORE); ItemStack smelted = new ItemStack(Items.GOLD_INGOT); - ElementLink entityLink = scene.world.createItemEntity(util.vector.centerOf(blockPos.west(2) - .above(2)), util.vector.of(0, 0.1, 0), stack); + ElementLink entityLink = scene.world().createItemEntity(util.vector().centerOf(blockPos.west(2) + .above(2)), util.vector().of(0, 0.1, 0), stack); scene.idle(15); - scene.world.modifyEntity(entityLink, e -> e.setDeltaMovement(-0.2f, 0, 0)); - Vec3 itemVec = util.vector.blockSurface(util.grid.at(1, 1, 2), Direction.EAST) + scene.world().modifyEntity(entityLink, e -> e.setDeltaMovement(-0.2f, 0, 0)); + Vec3 itemVec = util.vector().blockSurface(util.grid().at(1, 1, 2), Direction.EAST) .add(0.1, 0, 0); - scene.overlay.showControls(new InputWindowElement(itemVec, Pointing.DOWN).withItem(stack), 20); + scene.overlay().showControls(new InputWindowElement(itemVec, Pointing.DOWN).withItem(stack), 20); scene.idle(20); - scene.effects.emitParticles(itemVec.add(0, 0.2f, 0), Emitter.simple(ParticleTypes.LARGE_SMOKE, Vec3.ZERO), 1, - 60); + scene.effects().emitParticles(itemVec.add(0, 0.2f, 0), Emitter.simple(ParticleTypes.LARGE_SMOKE, Vec3.ZERO), 1, + 60); - scene.overlay.showText(80) + scene.overlay().showText(80) .colored(PonderPalette.WHITE) .pointAt(itemVec) .placeNearTarget() @@ -135,14 +135,14 @@ public class FanScenes { .text("Items caught in the area will be smelted"); scene.idle(60); - scene.world.modifyEntities(ItemEntity.class, ie -> ie.setItem(smelted)); + scene.world().modifyEntities(ItemEntity.class, ie -> ie.setItem(smelted)); scene.idle(40); - scene.overlay.showControls(new InputWindowElement(itemVec, Pointing.DOWN).withItem(smelted), 20); + scene.overlay().showControls(new InputWindowElement(itemVec, Pointing.DOWN).withItem(smelted), 20); scene.idle(20); - scene.world.modifyEntities(ItemEntity.class, Entity::discard); + scene.world().modifyEntities(ItemEntity.class, Entity::discard); scene.idle(20); - scene.overlay.showText(80) + scene.overlay().showText(80) .colored(PonderPalette.RED) .pointAt(itemVec) .placeNearTarget() @@ -152,15 +152,15 @@ public class FanScenes { // smoking start BlockState campfire = Blocks.FIRE.defaultBlockState(); - scene.world.hideIndependentSection(blockInFront, Direction.NORTH); + scene.world().hideIndependentSection(blockInFront, Direction.NORTH); scene.idle(15); - scene.world.setBlock(util.grid.at(3, 1, 0), campfire, false); - scene.world.setBlock(blockPos, campfire, true); - blockInFront = scene.world.showIndependentSection(util.select.position(3, 1, 0), Direction.NORTH); - scene.world.moveSection(blockInFront, util.vector.of(1, 0, 2), 0); + scene.world().setBlock(util.grid().at(3, 1, 0), campfire, false); + scene.world().setBlock(blockPos, campfire, true); + blockInFront = scene.world().showIndependentSection(util.select().position(3, 1, 0), Direction.NORTH); + scene.world().moveSection(blockInFront, util.vector().of(1, 0, 2), 0); scene.idle(50); - scene.overlay.showSelectionWithText(util.select.fromTo(blockPos, blockPos.west(2)), 60) + scene.overlay().showSelectionWithText(util.select().fromTo(blockPos, blockPos.west(2)), 60) .colored(PonderPalette.BLACK) .attachKeyFrame() .text("Instead, a setup for Smoking using Fire should be used for them"); @@ -169,15 +169,15 @@ public class FanScenes { // washing start BlockState water = Blocks.WATER.defaultBlockState(); - scene.world.hideIndependentSection(blockInFront, Direction.NORTH); + scene.world().hideIndependentSection(blockInFront, Direction.NORTH); scene.idle(15); - scene.world.setBlock(util.grid.at(3, 1, 0), water, false); - scene.world.setBlock(blockPos, water, true); - blockInFront = scene.world.showIndependentSection(util.select.position(3, 1, 0), Direction.NORTH); - scene.world.moveSection(blockInFront, util.vector.of(1, 0, 2), 0); + scene.world().setBlock(util.grid().at(3, 1, 0), water, false); + scene.world().setBlock(blockPos, water, true); + blockInFront = scene.world().showIndependentSection(util.select().position(3, 1, 0), Direction.NORTH); + scene.world().moveSection(blockInFront, util.vector().of(1, 0, 2), 0); scene.idle(20); - scene.overlay.showSelectionWithText(util.select.fromTo(blockPos, blockPos.west(2)), 60) + scene.overlay().showSelectionWithText(util.select().fromTo(blockPos, blockPos.west(2)), 60) .colored(PonderPalette.MEDIUM) .attachKeyFrame() .text("Air Flows passing through water create a Washing Setup"); @@ -186,88 +186,89 @@ public class FanScenes { stack = new ItemStack(Items.RED_SAND, 16); ItemStack washed = new ItemStack(Items.GOLD_NUGGET, 16); - entityLink = scene.world.createItemEntity(util.vector.centerOf(blockPos.west(2) - .above(2)), util.vector.of(0, 0.1, 0), stack); + entityLink = scene.world().createItemEntity(util.vector().centerOf(blockPos.west(2) + .above(2)), util.vector().of(0, 0.1, 0), stack); scene.idle(15); - scene.world.modifyEntity(entityLink, e -> e.setDeltaMovement(-0.2f, 0, 0)); - scene.overlay.showControls(new InputWindowElement(itemVec, Pointing.DOWN).withItem(stack), 20); + scene.world().modifyEntity(entityLink, e -> e.setDeltaMovement(-0.2f, 0, 0)); + scene.overlay().showControls(new InputWindowElement(itemVec, Pointing.DOWN).withItem(stack), 20); scene.idle(20); - scene.effects.emitParticles(itemVec.add(0, 0.2f, 0), Emitter.simple(ParticleTypes.SPIT, Vec3.ZERO), 1, 60); + scene.effects().emitParticles(itemVec.add(0, 0.2f, 0), Emitter.simple(ParticleTypes.SPIT, Vec3.ZERO), 1, 60); - scene.overlay.showText(50) + scene.overlay().showText(50) .colored(PonderPalette.WHITE) .pointAt(itemVec) .placeNearTarget() .text("Some interesting new processing can be done with it"); scene.idle(60); - scene.world.modifyEntities(ItemEntity.class, ie -> ie.setItem(washed)); - scene.overlay.showControls(new InputWindowElement(itemVec, Pointing.DOWN).withItem(washed), 20); + scene.world().modifyEntities(ItemEntity.class, ie -> ie.setItem(washed)); + scene.overlay().showControls(new InputWindowElement(itemVec, Pointing.DOWN).withItem(washed), 20); scene.idle(20); - scene.world.modifyEntities(ItemEntity.class, Entity::discard); + scene.world().modifyEntities(ItemEntity.class, Entity::discard); scene.idle(20); - scene.overlay.showText(100) + scene.overlay().showText(100) .colored(PonderPalette.RED) - .pointAt(util.vector.topOf(blockPos.east())) + .pointAt(util.vector().topOf(blockPos.east())) .placeNearTarget() .attachKeyFrame() .text("The Speed of the Fan does NOT affect the processing speed, only its range"); - scene.world.destroyBlock(util.grid.at(1, 1, 2)); + scene.world().destroyBlock(util.grid().at(1, 1, 2)); scene.idle(110); - ElementLink cogs = scene.world.makeSectionIndependent(util.select.fromTo(6, 1, 2, 6, 0, 3) - .add(util.select.fromTo(4, 0, 2, 5, 0, 2))); - scene.world.modifyKineticSpeed(util.select.position(5, 2, 2), f -> f / 3f); - scene.world.moveSection(cogs, util.vector.of(0, 1, 0), 15); - scene.world.moveSection(blockInFront, util.vector.of(0, 1, 0), 15); - scene.world.destroyBlock(blockPos.east()); - scene.world.showSection(util.select.position(blockPos.east() + ElementLink cogs = scene.world().makeSectionIndependent( + util.select().fromTo(6, 1, 2, 6, 0, 3) + .add(util.select().fromTo(4, 0, 2, 5, 0, 2))); + scene.world().modifyKineticSpeed(util.select().position(5, 2, 2), f -> f / 3f); + scene.world().moveSection(cogs, util.vector().of(0, 1, 0), 15); + scene.world().moveSection(blockInFront, util.vector().of(0, 1, 0), 15); + scene.world().destroyBlock(blockPos.east()); + scene.world().showSection(util.select().position(blockPos.east() .above()), Direction.DOWN); - scene.world.setBlock(blockPos.above(), Blocks.WATER.defaultBlockState(), false); + scene.world().setBlock(blockPos.above(), Blocks.WATER.defaultBlockState(), false); ItemStack sand = new ItemStack(Items.SAND); ItemStack clay = new ItemStack(Items.CLAY_BALL); scene.idle(20); - BlockPos depos = util.grid.at(3, 4, 2); + BlockPos depos = util.grid().at(3, 4, 2); ElementLink depot = - scene.world.showIndependentSection(util.select.position(depos), Direction.DOWN); - scene.world.moveSection(depot, util.vector.of(-1, -3, 0), 0); - scene.world.createItemOnBeltLike(depos, Direction.NORTH, sand); + scene.world().showIndependentSection(util.select().position(depos), Direction.DOWN); + scene.world().moveSection(depot, util.vector().of(-1, -3, 0), 0); + scene.world().createItemOnBeltLike(depos, Direction.NORTH, sand); scene.idle(10); - Vec3 depotTop = util.vector.topOf(2, 1, 2) + Vec3 depotTop = util.vector().topOf(2, 1, 2) .add(0, 0.25, 0); - scene.effects.emitParticles(depotTop, Emitter.simple(ParticleTypes.SPIT, Vec3.ZERO), .5f, 30); + scene.effects().emitParticles(depotTop, Emitter.simple(ParticleTypes.SPIT, Vec3.ZERO), .5f, 30); scene.idle(30); - scene.world.modifyBlockEntityNBT(util.select.position(depos), DepotBlockEntity.class, + scene.world().modifyBlockEntityNBT(util.select().position(depos), DepotBlockEntity.class, nbt -> nbt.put("HeldItem", new TransportedItemStack(clay).serializeNBT())); - scene.effects.emitParticles(depotTop, Emitter.simple(ParticleTypes.SPIT, Vec3.ZERO), .5f, 30); - scene.overlay.showText(90) + scene.effects().emitParticles(depotTop, Emitter.simple(ParticleTypes.SPIT, Vec3.ZERO), .5f, 30); + scene.overlay().showText(90) .pointAt(depotTop) .attachKeyFrame() .text("Fan Processing can also be applied to Items on Depots and Belts"); scene.idle(100); - scene.world.moveSection(depot, util.vector.of(-1, 0, 0), 15); + scene.world().moveSection(depot, util.vector().of(-1, 0, 0), 15); scene.idle(15); ElementLink largeCog = - scene.world.showIndependentSection(util.select.position(1, 2, 4), Direction.UP); + scene.world().showIndependentSection(util.select().position(1, 2, 4), Direction.UP); ElementLink belt = - scene.world.showIndependentSection(util.select.fromTo(3, 3, 1, 1, 3, 3), Direction.DOWN); - scene.world.moveSection(largeCog, util.vector.of(-1, -2, 0), 0); - scene.world.moveSection(belt, util.vector.of(-1, -2, 0), 0); + scene.world().showIndependentSection(util.select().fromTo(3, 3, 1, 1, 3, 3), Direction.DOWN); + scene.world().moveSection(largeCog, util.vector().of(-1, -2, 0), 0); + scene.world().moveSection(belt, util.vector().of(-1, -2, 0), 0); ElementLink transported = - scene.world.createItemOnBelt(util.grid.at(3, 3, 3), Direction.SOUTH, sand); + scene.world().createItemOnBelt(util.grid().at(3, 3, 3), Direction.SOUTH, sand); scene.idle(60); - scene.effects.emitParticles(depotTop, Emitter.simple(ParticleTypes.SPIT, Vec3.ZERO), .5f, 25); + scene.effects().emitParticles(depotTop, Emitter.simple(ParticleTypes.SPIT, Vec3.ZERO), .5f, 25); scene.idle(25); - scene.world.changeBeltItemTo(transported, new ItemStack(Items.CLAY_BALL)); - scene.effects.emitParticles(depotTop, Emitter.simple(ParticleTypes.SPIT, Vec3.ZERO), .5f, 25); + scene.world().changeBeltItemTo(transported, new ItemStack(Items.CLAY_BALL)); + scene.effects().emitParticles(depotTop, Emitter.simple(ParticleTypes.SPIT, Vec3.ZERO), .5f, 25); scene.idle(60); - scene.world.setKineticSpeed(util.select.position(1, 2, 4) - .add(util.select.fromTo(3, 3, 1, 1, 3, 3)), 0); + scene.world().setKineticSpeed(util.select().position(1, 2, 4) + .add(util.select().fromTo(3, 3, 1, 1, 3, 3)), 0); } diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/FunnelScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/FunnelScenes.java index 21b10e89f2..4090e8524a 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/FunnelScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/FunnelScenes.java @@ -8,10 +8,10 @@ import com.simibubi.create.content.logistics.funnel.FunnelBlockEntity; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; import net.createmod.ponder.foundation.ElementLink; import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.SceneBuilder; -import net.createmod.ponder.foundation.SceneBuildingUtil; import net.createmod.ponder.foundation.Selection; import net.createmod.ponder.foundation.element.EntityElement; import net.createmod.ponder.foundation.element.InputWindowElement; @@ -36,72 +36,72 @@ public class FunnelScenes { CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("funnel_intro", "Using funnels"); scene.configureBasePlate(0, 1, 5); - scene.world.showSection(util.select.layer(0), Direction.UP); - scene.world.modifyKineticSpeed(util.select.everywhere(), f -> f / 2f); + scene.world().showSection(util.select().layer(0), Direction.UP); + scene.world().modifyKineticSpeed(util.select().everywhere(), f -> f / 2f); scene.idle(10); - Selection verticalFunnel = util.select.fromTo(2, -1, 4, 2, 4, 4) - .add(util.select.fromTo(1, 1, 4, 1, 4, 4)); - Selection beltFunnels = util.select.fromTo(1, 2, 2, 3, 2, 2); - Selection beltFunnelEnv = util.select.fromTo(0, 1, 0, 5, 2, 2) + Selection verticalFunnel = util.select().fromTo(2, -1, 4, 2, 4, 4) + .add(util.select().fromTo(1, 1, 4, 1, 4, 4)); + Selection beltFunnels = util.select().fromTo(1, 2, 2, 3, 2, 2); + Selection beltFunnelEnv = util.select().fromTo(0, 1, 0, 5, 2, 2) .substract(beltFunnels); - scene.world.showSection(beltFunnelEnv, Direction.DOWN); + scene.world().showSection(beltFunnelEnv, Direction.DOWN); scene.idle(20); - scene.world.showSection(beltFunnels, Direction.DOWN); + scene.world().showSection(beltFunnels, Direction.DOWN); - BlockPos entryBeltPos = util.grid.at(3, 1, 2); - BlockPos exitBeltPos = util.grid.at(1, 1, 2); + BlockPos entryBeltPos = util.grid().at(3, 1, 2); + BlockPos exitBeltPos = util.grid().at(1, 1, 2); ItemStack itemStack = AllBlocks.BRASS_BLOCK.asStack(); for (int i = 0; i < 8; i++) { scene.idle(8); - scene.world.removeItemsFromBelt(exitBeltPos); - scene.world.flapFunnel(exitBeltPos.above(), false); + scene.world().removeItemsFromBelt(exitBeltPos); + scene.world().flapFunnel(exitBeltPos.above(), false); if (i == 2) scene.rotateCameraY(70); if (i < 6) - scene.world.createItemOnBelt(entryBeltPos, Direction.EAST, itemStack); + scene.world().createItemOnBelt(entryBeltPos, Direction.EAST, itemStack); } scene.rotateCameraY(-70); scene.idle(10); - Selection outputFunnel = util.select.position(1, 2, 4); - scene.world.setBlocks(outputFunnel, Blocks.AIR.defaultBlockState(), false); - scene.world.setBlocks(util.select.fromTo(2, -1, 4, 2, 0, 4), AllBlocks.ANDESITE_CASING.getDefaultState(), true); + Selection outputFunnel = util.select().position(1, 2, 4); + scene.world().setBlocks(outputFunnel, Blocks.AIR.defaultBlockState(), false); + scene.world().setBlocks(util.select().fromTo(2, -1, 4, 2, 0, 4), AllBlocks.ANDESITE_CASING.getDefaultState(), true); ElementLink independentSection = - scene.world.showIndependentSection(verticalFunnel, Direction.UP); + scene.world().showIndependentSection(verticalFunnel, Direction.UP); - Vec3 topItemSpawn = util.vector.centerOf(2, 6, 4); - Vec3 sideItemSpawn = util.vector.centerOf(1, 3, 4) + Vec3 topItemSpawn = util.vector().centerOf(2, 6, 4); + Vec3 sideItemSpawn = util.vector().centerOf(1, 3, 4) .add(0.15f, -0.45f, 0); ElementLink lastItemEntity = null; for (int i = 0; i < 4; i++) { if (lastItemEntity != null) - scene.world.modifyEntity(lastItemEntity, Entity::discard); + scene.world().modifyEntity(lastItemEntity, Entity::discard); if (i < 3) - lastItemEntity = scene.world.createItemEntity(topItemSpawn, util.vector.of(0, -0.4, 0), itemStack); + lastItemEntity = scene.world().createItemEntity(topItemSpawn, util.vector().of(0, -0.4, 0), itemStack); scene.idle(8); } - scene.world.moveSection(independentSection, util.vector.of(0, 1, 0), 15); + scene.world().moveSection(independentSection, util.vector().of(0, 1, 0), 15); scene.idle(10); - scene.world.setBlocks(outputFunnel, AllBlocks.ANDESITE_FUNNEL.getDefaultState() + scene.world().setBlocks(outputFunnel, AllBlocks.ANDESITE_FUNNEL.getDefaultState() .setValue(FunnelBlock.FACING, Direction.WEST) .setValue(FunnelBlock.EXTRACTING, true), false); for (int i = 0; i < 3; i++) { scene.idle(8); - scene.world.flapFunnel(util.grid.at(1, 2, 4), false); - scene.world.createItemEntity(sideItemSpawn, util.vector.of(-.05, 0, 0), itemStack); + scene.world().flapFunnel(util.grid().at(1, 2, 4), false); + scene.world().createItemEntity(sideItemSpawn, util.vector().of(-.05, 0, 0), itemStack); } scene.idle(8); - scene.overlay.showText(360) + scene.overlay().showText(360) .text("Funnels are ideal for transferring items from and to inventories.") .independent(); scene.markAsFinished(); @@ -111,28 +111,28 @@ public class FunnelScenes { CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("funnel_direction", "Direction of Transfer"); scene.configureBasePlate(0, 0, 5); - scene.world.showSection(util.select.layer(0), Direction.UP); - scene.world.modifyKineticSpeed(util.select.everywhere(), f -> f / 2f); - scene.world.setBlocks(util.select.position(3, 1, 1), AllBlocks.ANDESITE_CASING.getDefaultState(), false); + scene.world().showSection(util.select().layer(0), Direction.UP); + scene.world().modifyKineticSpeed(util.select().everywhere(), f -> f / 2f); + scene.world().setBlocks(util.select().position(3, 1, 1), AllBlocks.ANDESITE_CASING.getDefaultState(), false); - BlockPos topFunnel = util.grid.at(3, 3, 2); - Selection topFunnelSelection = util.select.position(topFunnel); - Selection firstShow = util.select.fromTo(3, 1, 2, 3, 2, 2); + BlockPos topFunnel = util.grid().at(3, 3, 2); + Selection topFunnelSelection = util.select().position(topFunnel); + Selection firstShow = util.select().fromTo(3, 1, 2, 3, 2, 2); scene.idle(5); - scene.world.showSection(firstShow, Direction.DOWN); + scene.world().showSection(firstShow, Direction.DOWN); scene.idle(15); ItemStack itemStack = AllBlocks.BRASS_BLOCK.asStack(); - Vec3 topCenter = util.vector.centerOf(topFunnel); - Vec3 topSide = util.vector.blockSurface(topFunnel, Direction.EAST); + Vec3 topCenter = util.vector().centerOf(topFunnel); + Vec3 topSide = util.vector().blockSurface(topFunnel, Direction.EAST); InputWindowElement controlsSneak = new InputWindowElement(topCenter, Pointing.DOWN).rightClick() .whileSneaking(); // Placing funnels without sneak - scene.world.showSection(topFunnelSelection, Direction.DOWN); - scene.overlay.showText(80) + scene.world().showSection(topFunnelSelection, Direction.DOWN); + scene.overlay().showText(80) .text("Placed normally, it pulls items from the inventory.") .attachKeyFrame() .pointAt(topCenter) @@ -140,88 +140,88 @@ public class FunnelScenes { scene.idle(45); ElementLink itemLink = - scene.world.createItemEntity(topCenter, util.vector.of(0, 4 / 16f, 0), itemStack); + scene.world().createItemEntity(topCenter, util.vector().of(0, 4 / 16f, 0), itemStack); scene.idle(40); - scene.world.modifyEntity(itemLink, Entity::discard); - scene.world.hideSection(topFunnelSelection, Direction.UP); + scene.world().modifyEntity(itemLink, Entity::discard); + scene.world().hideSection(topFunnelSelection, Direction.UP); scene.idle(20); // Placing funnels with sneak - scene.world.modifyBlock(topFunnel, s -> s.setValue(FunnelBlock.EXTRACTING, false), false); + scene.world().modifyBlock(topFunnel, s -> s.setValue(FunnelBlock.EXTRACTING, false), false); scene.idle(5); - scene.world.showSection(topFunnelSelection, Direction.DOWN); - scene.overlay.showControls(controlsSneak, 35); - scene.overlay.showText(80) + scene.world().showSection(topFunnelSelection, Direction.DOWN); + scene.overlay().showControls(controlsSneak, 35); + scene.overlay().showText(80) .text("Placed while sneaking, it puts items into the inventory.") .attachKeyFrame() .pointAt(topCenter) .placeNearTarget(); scene.idle(45); - itemLink = scene.world.createItemEntity(topCenter.add(0, 3, 0), util.vector.of(0, -0.2, 0), itemStack); + itemLink = scene.world().createItemEntity(topCenter.add(0, 3, 0), util.vector().of(0, -0.2, 0), itemStack); scene.idle(10); - scene.world.modifyEntity(itemLink, Entity::discard); + scene.world().modifyEntity(itemLink, Entity::discard); scene.idle(45); // Wrench interaction InputWindowElement wrenchControls = new InputWindowElement(topSide, Pointing.RIGHT).rightClick() .withItem(AllItems.WRENCH.asStack()); - scene.overlay.showControls(wrenchControls, 40); + scene.overlay().showControls(wrenchControls, 40); scene.idle(10); - scene.world.modifyBlock(topFunnel, s -> s.cycle(FunnelBlock.EXTRACTING), true); + scene.world().modifyBlock(topFunnel, s -> s.cycle(FunnelBlock.EXTRACTING), true); scene.idle(10); - scene.overlay.showText(80) + scene.overlay().showText(80) .text("Using a wrench, the funnel can be flipped after placement.") .attachKeyFrame() .pointAt(topCenter) .placeNearTarget(); - itemLink = scene.world.createItemEntity(topCenter, util.vector.of(0, 4 / 16f, 0), itemStack); + itemLink = scene.world().createItemEntity(topCenter, util.vector().of(0, 4 / 16f, 0), itemStack); scene.idle(30); - scene.overlay.showControls(wrenchControls, 40); + scene.overlay().showControls(wrenchControls, 40); scene.idle(10); - scene.world.modifyBlock(topFunnel, s -> s.cycle(FunnelBlock.EXTRACTING), true); + scene.world().modifyBlock(topFunnel, s -> s.cycle(FunnelBlock.EXTRACTING), true); scene.idle(10); - scene.world.modifyEntity(itemLink, Entity::discard); + scene.world().modifyEntity(itemLink, Entity::discard); scene.idle(20); // Side funnel - BlockPos sideFunnel = util.grid.at(3, 2, 1); - Selection sideFunnelSelection = util.select.fromTo(sideFunnel.below(), sideFunnel); - Vec3 sideCenter = util.vector.centerOf(sideFunnel); + BlockPos sideFunnel = util.grid().at(3, 2, 1); + Selection sideFunnelSelection = util.select().fromTo(sideFunnel.below(), sideFunnel); + Vec3 sideCenter = util.vector().centerOf(sideFunnel); - scene.world.modifyBlock(sideFunnel, s -> s.cycle(FunnelBlock.EXTRACTING), false); - scene.world.showSection(sideFunnelSelection, Direction.DOWN); - scene.overlay.showText(70) + scene.world().modifyBlock(sideFunnel, s -> s.cycle(FunnelBlock.EXTRACTING), false); + scene.world().showSection(sideFunnelSelection, Direction.DOWN); + scene.overlay().showText(70) .text("Same rules will apply for most orientations.") .pointAt(sideCenter) .placeNearTarget(); scene.idle(20); - scene.world.flapFunnel(sideFunnel, true); - itemLink = scene.world.createItemEntity(sideCenter.subtract(0, .45, 0), util.vector.of(0, 0, -0.1), itemStack); + scene.world().flapFunnel(sideFunnel, true); + itemLink = scene.world().createItemEntity(sideCenter.subtract(0, .45, 0), util.vector().of(0, 0, -0.1), itemStack); scene.idle(60); - scene.world.hideSection(sideFunnelSelection, Direction.UP); - scene.world.hideSection(topFunnelSelection, Direction.UP); - scene.world.modifyEntity(itemLink, Entity::discard); + scene.world().hideSection(sideFunnelSelection, Direction.UP); + scene.world().hideSection(topFunnelSelection, Direction.UP); + scene.world().modifyEntity(itemLink, Entity::discard); scene.idle(20); // Belt funnel - Selection beltFunnelSetup = util.select.fromTo(0, 1, 0, 2, 2, 5); - Selection gearshiftAndLever = util.select.fromTo(1, 1, 4, 1, 2, 4); - Selection gearshiftedKinetics = util.select.fromTo(1, 1, 2, 2, 1, 4); - Vec3 topOfBeltFunnel = util.vector.topOf(2, 2, 2); - BlockPos beltPos = util.grid.at(2, 1, 2); - BlockPos cogPos = util.grid.at(1, 1, 3); + Selection beltFunnelSetup = util.select().fromTo(0, 1, 0, 2, 2, 5); + Selection gearshiftAndLever = util.select().fromTo(1, 1, 4, 1, 2, 4); + Selection gearshiftedKinetics = util.select().fromTo(1, 1, 2, 2, 1, 4); + Vec3 topOfBeltFunnel = util.vector().topOf(2, 2, 2); + BlockPos beltPos = util.grid().at(2, 1, 2); + BlockPos cogPos = util.grid().at(1, 1, 3); - scene.world.showSection(beltFunnelSetup, Direction.DOWN); - scene.overlay.showText(140) + scene.world().showSection(beltFunnelSetup, Direction.DOWN); + scene.overlay().showText(140) .text("Funnels on belts will extract/insert depending on its movement direction.") .attachKeyFrame() .pointAt(topOfBeltFunnel); @@ -229,24 +229,24 @@ public class FunnelScenes { scene.idle(15); for (int i = 0; i < 2; i++) { - scene.world.createItemOnBelt(beltPos, Direction.EAST, itemStack); - scene.effects.rotationDirectionIndicator(cogPos); + scene.world().createItemOnBelt(beltPos, Direction.EAST, itemStack); + scene.effects().rotationDirectionIndicator(cogPos); scene.idle(50); - scene.world.modifyBlocks(gearshiftAndLever, s -> s.cycle(BlockStateProperties.POWERED), false); - scene.world.modifyKineticSpeed(gearshiftedKinetics, f -> -f); - scene.effects.indicateRedstone(util.grid.at(1, 2, 4)); - scene.effects.rotationDirectionIndicator(cogPos); + scene.world().modifyBlocks(gearshiftAndLever, s -> s.cycle(BlockStateProperties.POWERED), false); + scene.world().modifyKineticSpeed(gearshiftedKinetics, f -> -f); + scene.effects().indicateRedstone(util.grid().at(1, 2, 4)); + scene.effects().rotationDirectionIndicator(cogPos); scene.idle(35); - scene.world.removeItemsFromBelt(beltPos); - scene.world.flapFunnel(util.grid.at(2, 2, 2), false); + scene.world().removeItemsFromBelt(beltPos); + scene.world().flapFunnel(util.grid().at(2, 2, 2), false); if (i == 0) { scene.idle(50); - scene.world.modifyBlocks(gearshiftAndLever, s -> s.cycle(BlockStateProperties.POWERED), false); - scene.world.modifyKineticSpeed(gearshiftedKinetics, f -> -f); - scene.effects.indicateRedstone(util.grid.at(1, 2, 4)); + scene.world().modifyBlocks(gearshiftAndLever, s -> s.cycle(BlockStateProperties.POWERED), false); + scene.world().modifyKineticSpeed(gearshiftedKinetics, f -> -f); + scene.effects().indicateRedstone(util.grid().at(1, 2, 4)); } } } @@ -256,54 +256,54 @@ public class FunnelScenes { scene.title("funnel_compat", "Funnel compatibility"); scene.configureBasePlate(0, 0, 5); - BlockPos sawFunnel = util.grid.at(4, 2, 1); - BlockPos depotFunnel = util.grid.at(2, 2, 2); - BlockPos drainFunnel = util.grid.at(0, 2, 3); + BlockPos sawFunnel = util.grid().at(4, 2, 1); + BlockPos depotFunnel = util.grid().at(2, 2, 2); + BlockPos drainFunnel = util.grid().at(0, 2, 3); - scene.world.showSection(util.select.layer(0), Direction.UP); - Selection firstShow = util.select.layer(1) - .add(util.select.position(sawFunnel.south())) - .add(util.select.position(depotFunnel.south())) - .add(util.select.position(drainFunnel.south())); + scene.world().showSection(util.select().layer(0), Direction.UP); + Selection firstShow = util.select().layer(1) + .add(util.select().position(sawFunnel.south())) + .add(util.select().position(depotFunnel.south())) + .add(util.select().position(drainFunnel.south())); scene.idle(5); - scene.world.showSection(firstShow, Direction.DOWN); + scene.world().showSection(firstShow, Direction.DOWN); scene.idle(8); - scene.overlay.showText(360) + scene.overlay().showText(360) .text("Funnels should also interact nicely with a handful of other components.") .attachKeyFrame() .independent(0); scene.idle(40); - scene.world.showSection(util.select.position(sawFunnel), Direction.DOWN); - scene.overlay.showText(40) + scene.world().showSection(util.select().position(sawFunnel), Direction.DOWN); + scene.overlay().showText(40) .text("Vertical Saws") .colored(PonderPalette.BLUE) .placeNearTarget() - .pointAt(util.vector.centerOf(sawFunnel.below())); + .pointAt(util.vector().centerOf(sawFunnel.below())); scene.idle(8); - scene.world.createItemOnBeltLike(sawFunnel.below(), Direction.SOUTH, new ItemStack(Blocks.OAK_LOG)); + scene.world().createItemOnBeltLike(sawFunnel.below(), Direction.SOUTH, new ItemStack(Blocks.OAK_LOG)); scene.idle(40); - scene.world.showSection(util.select.position(depotFunnel), Direction.DOWN); - scene.overlay.showText(40) + scene.world().showSection(util.select().position(depotFunnel), Direction.DOWN); + scene.overlay().showText(40) .text("Depots") .colored(PonderPalette.BLUE) .placeNearTarget() - .pointAt(util.vector.centerOf(depotFunnel.below())); + .pointAt(util.vector().centerOf(depotFunnel.below())); scene.idle(8); - scene.world.createItemOnBeltLike(depotFunnel.below(), Direction.SOUTH, new ItemStack(Items.GOLDEN_PICKAXE)); + scene.world().createItemOnBeltLike(depotFunnel.below(), Direction.SOUTH, new ItemStack(Items.GOLDEN_PICKAXE)); scene.idle(40); - scene.world.showSection(util.select.position(drainFunnel), Direction.DOWN); - scene.overlay.showText(40) + scene.world().showSection(util.select().position(drainFunnel), Direction.DOWN); + scene.overlay().showText(40) .text("Item Drains") .colored(PonderPalette.BLUE) .placeNearTarget() - .pointAt(util.vector.centerOf(drainFunnel.below())); + .pointAt(util.vector().centerOf(drainFunnel.below())); scene.idle(8); - scene.world.createItemOnBeltLike(drainFunnel.below(), Direction.SOUTH, new ItemStack(Items.WATER_BUCKET)); + scene.world().createItemOnBeltLike(drainFunnel.below(), Direction.SOUTH, new ItemStack(Items.WATER_BUCKET)); scene.idle(40); scene.markAsFinished(); @@ -313,38 +313,38 @@ public class FunnelScenes { CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("funnel_redstone", "Redstone control"); scene.configureBasePlate(0, 0, 5); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); scene.idle(5); - scene.world.showSection(util.select.layersFrom(1), Direction.DOWN); + scene.world().showSection(util.select().layersFrom(1), Direction.DOWN); ItemStack itemStack = AllBlocks.BRASS_BLOCK.asStack(); - Vec3 topItemSpawn = util.vector.centerOf(3, 6, 2); + Vec3 topItemSpawn = util.vector().centerOf(3, 6, 2); ElementLink lastItemEntity = null; - BlockPos lever = util.grid.at(1, 2, 2); - BlockPos redstone = util.grid.at(2, 2, 2); - BlockPos funnel = util.grid.at(3, 2, 2); + BlockPos lever = util.grid().at(1, 2, 2); + BlockPos redstone = util.grid().at(2, 2, 2); + BlockPos funnel = util.grid().at(3, 2, 2); AABB redstoneBB = new AABB(funnel).inflate(-1 / 16f, -6 / 16f, -1 / 16f) .move(0, -5 / 16f, 0); for (int i = 0; i < 4; i++) { if (lastItemEntity != null) - scene.world.modifyEntity(lastItemEntity, Entity::discard); - lastItemEntity = scene.world.createItemEntity(topItemSpawn, util.vector.of(0, -0.2, 0), itemStack); + scene.world().modifyEntity(lastItemEntity, Entity::discard); + lastItemEntity = scene.world().createItemEntity(topItemSpawn, util.vector().of(0, -0.2, 0), itemStack); scene.idle(8); if (i == 3) { - scene.world.modifyBlock(lever, s -> s.cycle(LeverBlock.POWERED), false); - scene.world.modifyBlock(redstone, s -> s.setValue(RedStoneWireBlock.POWER, 15), false); - scene.world.modifyBlock(funnel, s -> s.cycle(FunnelBlock.POWERED), false); - scene.effects.indicateRedstone(lever); + scene.world().modifyBlock(lever, s -> s.cycle(LeverBlock.POWERED), false); + scene.world().modifyBlock(redstone, s -> s.setValue(RedStoneWireBlock.POWER, 15), false); + scene.world().modifyBlock(funnel, s -> s.cycle(FunnelBlock.POWERED), false); + scene.effects().indicateRedstone(lever); scene.idle(4); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, funnel, redstoneBB, 80); - scene.overlay.showText(80) + scene.overlay().chaseBoundingBoxOutline(PonderPalette.RED, funnel, redstoneBB, 80); + scene.overlay().showText(80) .colored(PonderPalette.RED) .text("Redstone power will prevent any funnel from acting") - .pointAt(util.vector.blockSurface(funnel, Direction.DOWN)); + .pointAt(util.vector().blockSurface(funnel, Direction.DOWN)); } else { scene.idle(4); } @@ -357,56 +357,56 @@ public class FunnelScenes { CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("brass_funnel", "The Brass Funnel"); scene.configureBasePlate(0, 0, 5); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); scene.idle(5); - BlockPos firstDepot = util.grid.at(3, 1, 1); - BlockPos secondDepot = util.grid.at(1, 1, 1); - Selection depots = util.select.fromTo(firstDepot, secondDepot); - Selection beltAndStuff = util.select.fromTo(0, 1, 2, 4, 1, 2) - .add(util.select.fromTo(0, 1, 3, 0, 2, 5)); - Selection withoutBelt = util.select.layersFrom(1) + BlockPos firstDepot = util.grid().at(3, 1, 1); + BlockPos secondDepot = util.grid().at(1, 1, 1); + Selection depots = util.select().fromTo(firstDepot, secondDepot); + Selection beltAndStuff = util.select().fromTo(0, 1, 2, 4, 1, 2) + .add(util.select().fromTo(0, 1, 3, 0, 2, 5)); + Selection withoutBelt = util.select().layersFrom(1) .substract(beltAndStuff) .substract(depots); - scene.world.showSection(withoutBelt, Direction.DOWN); + scene.world().showSection(withoutBelt, Direction.DOWN); ElementLink independentSection = - scene.world.showIndependentSection(depots, Direction.DOWN); - scene.world.moveSection(independentSection, util.vector.of(0, 0, 1), 0); + scene.world().showIndependentSection(depots, Direction.DOWN); + scene.world().moveSection(independentSection, util.vector().of(0, 0, 1), 0); - BlockPos andesiteFunnel = util.grid.at(3, 2, 2); - BlockPos brassFunnel = util.grid.at(1, 2, 2); + BlockPos andesiteFunnel = util.grid().at(3, 2, 2); + BlockPos brassFunnel = util.grid().at(1, 2, 2); ItemStack itemStack = AllItems.BRASS_INGOT.asStack(); scene.idle(10); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("Andesite Funnels can only ever extract single items.") .attachKeyFrame() - .pointAt(util.vector.topOf(andesiteFunnel)) + .pointAt(util.vector().topOf(andesiteFunnel)) .placeNearTarget(); scene.idle(10); - scene.world.createItemOnBeltLike(andesiteFunnel.below() + scene.world().createItemOnBeltLike(andesiteFunnel.below() .north(), Direction.SOUTH, itemStack); - scene.world.flapFunnel(andesiteFunnel, true); + scene.world().flapFunnel(andesiteFunnel, true); scene.idle(60); - Vec3 filter = util.vector.topOf(brassFunnel); - scene.overlay.showText(60) + Vec3 filter = util.vector().topOf(brassFunnel); + scene.overlay().showText(60) .text("Brass Funnels can extract up to a full stack.") .attachKeyFrame() .pointAt(filter) .placeNearTarget(); scene.idle(10); - scene.world.createItemOnBeltLike(brassFunnel.below() + scene.world().createItemOnBeltLike(brassFunnel.below() .north(), Direction.SOUTH, ItemHandlerHelper.copyStackWithSize(itemStack, 64)); - scene.world.flapFunnel(brassFunnel, true); + scene.world().flapFunnel(brassFunnel, true); scene.idle(60); filter = filter.add(0, -5 / 16f, -1.5 / 16f); - scene.overlay.showFilterSlotInput(filter, Direction.NORTH, 80); - scene.overlay.showControls(new InputWindowElement(filter, Pointing.DOWN).rightClick(), 60); + scene.overlay().showFilterSlotInput(filter, Direction.NORTH, 80); + scene.overlay().showControls(new InputWindowElement(filter, Pointing.DOWN).rightClick(), 60); scene.idle(10); - scene.overlay.showText(80) + scene.overlay().showText(80) .text("The value panel allows for precise control over the extracted stack size.") .attachKeyFrame() .pointAt(filter) @@ -414,13 +414,13 @@ public class FunnelScenes { scene.idle(90); // belt - scene.world.hideIndependentSection(independentSection, Direction.NORTH); - scene.world.hideSection(util.select.position(brassFunnel), Direction.UP); + scene.world().hideIndependentSection(independentSection, Direction.NORTH); + scene.world().hideSection(util.select().position(brassFunnel), Direction.UP); scene.idle(20); - scene.world.modifyBlock(brassFunnel, s -> s.cycle(BeltFunnelBlock.SHAPE), false); - scene.world.showSection(util.select.position(brassFunnel), Direction.DOWN); - scene.world.showSection(beltAndStuff, Direction.SOUTH); + scene.world().modifyBlock(brassFunnel, s -> s.cycle(BeltFunnelBlock.SHAPE), false); + scene.world().showSection(util.select().position(brassFunnel), Direction.DOWN); + scene.world().showSection(beltAndStuff, Direction.SOUTH); scene.idle(10); ItemStack dirt = new ItemStack(Items.DIRT); @@ -430,31 +430,31 @@ public class FunnelScenes { for (int i = 0; i < 14; i++) { if (i < 12) - scene.world.createItemOnBelt(andesiteFunnel.below(), Direction.SOUTH, - i % 3 == 0 ? dirt : i % 3 == 1 ? gravel : emerald); + scene.world().createItemOnBelt(andesiteFunnel.below(), Direction.SOUTH, + i % 3 == 0 ? dirt : i % 3 == 1 ? gravel : emerald); scene.idle(10); if (i > 0 && (i < 3 || i % 3 == 0)) { - scene.world.removeItemsFromBelt(brassFunnel.below()); - scene.world.flapFunnel(brassFunnel, false); + scene.world().removeItemsFromBelt(brassFunnel.below()); + scene.world().flapFunnel(brassFunnel, false); } - scene.world.modifyEntities(ItemEntity.class, e -> { + scene.world().modifyEntities(ItemEntity.class, e -> { if (e.getY() < 1) e.discard(); }); if (i == 2) { - scene.overlay.showFilterSlotInput(filter, Direction.NORTH, 40); - scene.overlay.showControls(new InputWindowElement(filter, Pointing.DOWN).rightClick() + scene.overlay().showFilterSlotInput(filter, Direction.NORTH, 40); + scene.overlay().showControls(new InputWindowElement(filter, Pointing.DOWN).rightClick() .withItem(emerald), 60); scene.idle(10); - scene.overlay.showText(80) + scene.overlay().showText(80) .text("Using items on the filter slot will restrict the funnel to only transfer matching stacks.") .attachKeyFrame() .pointAt(filter) .placeNearTarget(); - scene.world.setFilterData(util.select.position(brassFunnel), FunnelBlockEntity.class, emerald); + scene.world().setFilterData(util.select().position(brassFunnel), FunnelBlockEntity.class, emerald); } else scene.idle(10); @@ -467,58 +467,58 @@ public class FunnelScenes { CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("funnel_transfer", "Direct transfer"); scene.configureBasePlate(0, 0, 5); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); scene.idle(5); - BlockPos funnelPos = util.grid.at(2, 2, 2); - Selection funnelSelect = util.select.position(funnelPos); + BlockPos funnelPos = util.grid().at(2, 2, 2); + Selection funnelSelect = util.select().position(funnelPos); ElementLink rightChest = - scene.world.showIndependentSection(util.select.position(0, 2, 2), Direction.DOWN); + scene.world().showIndependentSection(util.select().position(0, 2, 2), Direction.DOWN); ElementLink leftChest = - scene.world.showIndependentSection(util.select.position(4, 2, 2), Direction.DOWN); - scene.world.moveSection(rightChest, util.vector.of(2, 1, 0), 0); - scene.world.moveSection(leftChest, util.vector.of(-2, -1, 0), 0); + scene.world().showIndependentSection(util.select().position(4, 2, 2), Direction.DOWN); + scene.world().moveSection(rightChest, util.vector().of(2, 1, 0), 0); + scene.world().moveSection(leftChest, util.vector().of(-2, -1, 0), 0); scene.idle(5); - scene.world.showSection(funnelSelect, Direction.DOWN); + scene.world().showSection(funnelSelect, Direction.DOWN); scene.idle(20); - scene.overlay.showSelectionWithText(funnelSelect, 40) + scene.overlay().showSelectionWithText(funnelSelect, 40) .colored(PonderPalette.RED) .text("Funnels cannot ever transfer between closed inventories directly.") .attachKeyFrame() .placeNearTarget(); scene.idle(50); - scene.world.hideSection(funnelSelect, Direction.SOUTH); + scene.world().hideSection(funnelSelect, Direction.SOUTH); scene.idle(20); - scene.world.setBlocks(funnelSelect, AllBlocks.CHUTE.getDefaultState(), false); - scene.world.showSection(funnelSelect, Direction.NORTH); + scene.world().setBlocks(funnelSelect, AllBlocks.CHUTE.getDefaultState(), false); + scene.world().showSection(funnelSelect, Direction.NORTH); scene.idle(10); - scene.overlay.showText(40) + scene.overlay().showText(40) .colored(PonderPalette.GREEN) .text("Chutes or Smart chutes might be more suitable for such purposes.") .attachKeyFrame() - .pointAt(util.vector.centerOf(funnelPos)) + .pointAt(util.vector().centerOf(funnelPos)) .placeNearTarget(); scene.idle(50); - scene.world.hideSection(funnelSelect, Direction.UP); - scene.world.hideIndependentSection(leftChest, Direction.UP); - scene.world.hideIndependentSection(rightChest, Direction.UP); + scene.world().hideSection(funnelSelect, Direction.UP); + scene.world().hideIndependentSection(leftChest, Direction.UP); + scene.world().hideIndependentSection(rightChest, Direction.UP); scene.idle(20); - Selection belt = util.select.layer(1); - scene.world.setBlocks(funnelSelect, Blocks.AIR.defaultBlockState(), false); - scene.world.showSection(belt, Direction.DOWN); - scene.world.showSection(util.select.fromTo(0, 2, 2, 4, 2, 2), Direction.DOWN); - scene.overlay.showText(120) + Selection belt = util.select().layer(1); + scene.world().setBlocks(funnelSelect, Blocks.AIR.defaultBlockState(), false); + scene.world().showSection(belt, Direction.DOWN); + scene.world().showSection(util.select().fromTo(0, 2, 2, 4, 2, 2), Direction.DOWN); + scene.overlay().showText(120) .colored(PonderPalette.GREEN) .text("Same applies for horizontal movement. A mechanical belt should help here.") - .pointAt(util.vector.topOf(1, 2, 2)) + .pointAt(util.vector().topOf(1, 2, 2)) .placeNearTarget(); scene.markAsFinished(); diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/GantryScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/GantryScenes.java index b30de48387..adc7a953a0 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/GantryScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/GantryScenes.java @@ -5,10 +5,10 @@ import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Iterate; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; import net.createmod.ponder.foundation.ElementLink; import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.SceneBuilder; -import net.createmod.ponder.foundation.SceneBuildingUtil; import net.createmod.ponder.foundation.Selection; import net.createmod.ponder.foundation.element.InputWindowElement; import net.createmod.ponder.foundation.element.WorldSectionElement; @@ -35,68 +35,68 @@ public class GantryScenes { String title = "Using Gantry " + (pinion ? "Carriages" : "Shafts"); scene.title(id, title); - scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -2 * f); + scene.world().modifyKineticSpeed(util.select().everywhere(), f -> -2 * f); scene.configureBasePlate(0, 0, 5); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); scene.idle(10); - scene.world.showSection(util.select.layer(1), Direction.DOWN); + scene.world().showSection(util.select().layer(1), Direction.DOWN); scene.idle(10); ElementLink gantry = - scene.world.showIndependentSection(util.select.layer(2), Direction.DOWN); + scene.world().showIndependentSection(util.select().layer(2), Direction.DOWN); scene.idle(10); - BlockPos centralShaft = util.grid.at(2, 1, 2); + BlockPos centralShaft = util.grid().at(2, 1, 2); - scene.world.moveSection(gantry, util.vector.of(-4, 0, 0), 60); + scene.world().moveSection(gantry, util.vector().of(-4, 0, 0), 60); String text = pinion ? "Gantry Carriages can mount to and slide along a Gantry Shaft." : "Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them."; - scene.overlay.showText(80) + scene.overlay().showText(80) .attachKeyFrame() .text(text) - .pointAt(util.vector.centerOf(centralShaft)); + .pointAt(util.vector().centerOf(centralShaft)); scene.idle(80); - scene.world.hideIndependentSection(gantry, Direction.UP); + scene.world().hideIndependentSection(gantry, Direction.UP); scene.idle(10); - gantry = scene.world.showIndependentSection(util.select.layer(2), Direction.DOWN); - Vec3 gantryTop = util.vector.topOf(4, 2, 2); - scene.world.modifyKineticSpeed(util.select.everywhere(), f -> 0f); - scene.overlay.showText(40) + gantry = scene.world().showIndependentSection(util.select().layer(2), Direction.DOWN); + Vec3 gantryTop = util.vector().topOf(4, 2, 2); + scene.world().modifyKineticSpeed(util.select().everywhere(), f -> 0f); + scene.overlay().showText(40) .attachKeyFrame() .text("Gantry setups can move attached Blocks.") .pointAt(gantryTop) .placeNearTarget(); scene.idle(30); - Selection planks = util.select.position(5, 3, 1); + Selection planks = util.select().position(5, 3, 1); - scene.world.showSectionAndMerge(util.select.layersFrom(3) + scene.world().showSectionAndMerge(util.select().layersFrom(3) .substract(planks), Direction.DOWN, gantry); - scene.world.replaceBlocks(util.select.fromTo(5, 3, 2, 3, 4, 2), Blocks.OAK_PLANKS.defaultBlockState(), false); + scene.world().replaceBlocks(util.select().fromTo(5, 3, 2, 3, 4, 2), Blocks.OAK_PLANKS.defaultBlockState(), false); scene.idle(10); - scene.world.showSectionAndMerge(planks, Direction.SOUTH, gantry); + scene.world().showSectionAndMerge(planks, Direction.SOUTH, gantry); scene.idle(10); - scene.overlay.showOutline(PonderPalette.GREEN, "glue", util.select.position(3, 4, 2) - .add(util.select.fromTo(3, 3, 2, 5, 3, 2)) - .add(util.select.position(5, 3, 1)), 40); - scene.overlay.showControls(new InputWindowElement(util.vector.centerOf(util.grid.at(3, 3, 2)), Pointing.UP) + scene.overlay().showOutline(PonderPalette.GREEN, "glue", util.select().position(3, 4, 2) + .add(util.select().fromTo(3, 3, 2, 5, 3, 2)) + .add(util.select().position(5, 3, 1)), 40); + scene.overlay().showControls(new InputWindowElement(util.vector().centerOf(util.grid().at(3, 3, 2)), Pointing.UP) .withItem(AllItems.SUPER_GLUE.asStack()), 40); - scene.effects.superGlue(util.grid.at(5, 3, 1), Direction.SOUTH, true); + scene.effects().superGlue(util.grid().at(5, 3, 1), Direction.SOUTH, true); scene.idle(20); - scene.overlay.showText(80) + scene.overlay().showText(80) .attachKeyFrame() .sharedText("movement_anchors") - .pointAt(util.vector.blockSurface(util.grid.at(3, 3, 2), Direction.WEST)) + .pointAt(util.vector().blockSurface(util.grid().at(3, 3, 2), Direction.WEST)) .placeNearTarget(); scene.idle(80); - scene.world.modifyKineticSpeed(util.select.layer(0), f -> 32f); - scene.world.modifyKineticSpeed(util.select.layer(1), f -> -64f); + scene.world().modifyKineticSpeed(util.select().layer(0), f -> 32f); + scene.world().modifyKineticSpeed(util.select().layer(1), f -> -64f); - scene.world.moveSection(gantry, util.vector.of(-4, 0, 0), 60); + scene.world().moveSection(gantry, util.vector().of(-4, 0, 0), 60); scene.idle(20); scene.markAsFinished(); } @@ -104,55 +104,55 @@ public class GantryScenes { public static void redstone(SceneBuilder builder, SceneBuildingUtil util) { CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("gantry_redstone", "Gantry Power Propagation"); - scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); + scene.world().modifyKineticSpeed(util.select().everywhere(), f -> -f); - Selection leverRedstone = util.select.fromTo(3, 1, 0, 3, 1, 1); - Selection shaft = util.select.fromTo(0, 1, 2, 4, 1, 2); - Selection shaftAndCog = util.select.fromTo(0, 1, 2, 5, 1, 2); + Selection leverRedstone = util.select().fromTo(3, 1, 0, 3, 1, 1); + Selection shaft = util.select().fromTo(0, 1, 2, 4, 1, 2); + Selection shaftAndCog = util.select().fromTo(0, 1, 2, 5, 1, 2); scene.configureBasePlate(0, 0, 5); - scene.world.showSection(util.select.layer(0) + scene.world().showSection(util.select().layer(0) .add(leverRedstone), Direction.UP); scene.idle(10); - scene.world.showSection(shaftAndCog, Direction.DOWN); + scene.world().showSection(shaftAndCog, Direction.DOWN); scene.idle(10); - BlockPos gantryPos = util.grid.at(4, 2, 2); + BlockPos gantryPos = util.grid().at(4, 2, 2); ElementLink gantry = - scene.world.showIndependentSection(util.select.position(gantryPos), Direction.DOWN); + scene.world().showIndependentSection(util.select().position(gantryPos), Direction.DOWN); scene.idle(15); - scene.world.moveSection(gantry, util.vector.of(-3, 0, 0), 40); + scene.world().moveSection(gantry, util.vector().of(-3, 0, 0), 40); scene.idle(40); - scene.world.toggleRedstonePower(shaft); - scene.world.toggleRedstonePower(util.select.position(3, 1, 0)); - scene.world.toggleRedstonePower(util.select.position(3, 1, 1)); - scene.effects.indicateRedstone(util.grid.at(3, 1, 0)); - scene.world.modifyKineticSpeed(util.select.position(gantryPos), f -> 32f); + scene.world().toggleRedstonePower(shaft); + scene.world().toggleRedstonePower(util.select().position(3, 1, 0)); + scene.world().toggleRedstonePower(util.select().position(3, 1, 1)); + scene.effects().indicateRedstone(util.grid().at(3, 1, 0)); + scene.world().modifyKineticSpeed(util.select().position(gantryPos), f -> 32f); scene.idle(40); - BlockPos cogPos = util.grid.at(1, 2, 1); - scene.overlay.showText(60) + BlockPos cogPos = util.grid().at(1, 2, 1); + scene.overlay().showText(60) .attachKeyFrame() .colored(PonderPalette.RED) - .pointAt(util.vector.centerOf(cogPos.below() + .pointAt(util.vector().centerOf(cogPos.below() .south())) .text("Redstone-powered gantry shafts stop moving their carriages") .placeNearTarget(); scene.idle(70); - Selection cogSelection = util.select.position(cogPos); - scene.world.showSection(cogSelection, Direction.SOUTH); - scene.world.modifyKineticSpeed(cogSelection, f -> 32f); - scene.overlay.showText(180) + Selection cogSelection = util.select().position(cogPos); + scene.world().showSection(cogSelection, Direction.SOUTH); + scene.world().modifyKineticSpeed(cogSelection, f -> 32f); + scene.overlay().showText(180) .colored(PonderPalette.GREEN) - .pointAt(util.vector.blockSurface(cogPos, Direction.NORTH)) + .pointAt(util.vector().blockSurface(cogPos, Direction.NORTH)) .text("Instead, its rotational force is relayed to the carriages' output shaft") .placeNearTarget(); scene.idle(10); - scene.effects.rotationSpeedIndicator(cogPos); + scene.effects().rotationSpeedIndicator(cogPos); scene.markAsFinished(); } @@ -160,54 +160,54 @@ public class GantryScenes { CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("gantry_direction", "Gantry Movement Direction"); scene.configureBasePlate(0, 0, 5); - scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().modifyKineticSpeed(util.select().everywhere(), f -> -f); + scene.world().showSection(util.select().layer(0), Direction.UP); scene.idle(10); - Selection shaftAndGearshiftAndLever = util.select.fromTo(0, 1, 2, 5, 2, 2); - Selection shafts = util.select.fromTo(0, 1, 2, 3, 1, 2); + Selection shaftAndGearshiftAndLever = util.select().fromTo(0, 1, 2, 5, 2, 2); + Selection shafts = util.select().fromTo(0, 1, 2, 3, 1, 2); - scene.world.showSection(shaftAndGearshiftAndLever, Direction.DOWN); - scene.overlay.showText(60) + scene.world().showSection(shaftAndGearshiftAndLever, Direction.DOWN); + scene.overlay().showText(60) .text("Gantry Shafts can have opposite orientations") - .pointAt(util.vector.of(2, 1.5, 2.5)) + .pointAt(util.vector().of(2, 1.5, 2.5)) .placeNearTarget(); scene.idle(60); ElementLink gantry1 = - scene.world.showIndependentSection(util.select.position(0, 1, 3), Direction.NORTH); + scene.world().showIndependentSection(util.select().position(0, 1, 3), Direction.NORTH); ElementLink gantry2 = - scene.world.showIndependentSection(util.select.position(3, 1, 3), Direction.NORTH); + scene.world().showIndependentSection(util.select().position(3, 1, 3), Direction.NORTH); scene.idle(10); - scene.world.moveSection(gantry1, util.vector.of(1, 0, 0), 20); - scene.world.moveSection(gantry2, util.vector.of(-1, 0, 0), 20); + scene.world().moveSection(gantry1, util.vector().of(1, 0, 0), 20); + scene.world().moveSection(gantry2, util.vector().of(-1, 0, 0), 20); - scene.overlay.showText(80) + scene.overlay().showText(80) .attachKeyFrame() .text("The movement direction of carriages depend on their shafts' orientation") - .pointAt(util.vector.topOf(1, 1, 3)) + .pointAt(util.vector().topOf(1, 1, 3)) .placeNearTarget(); scene.idle(80); - BlockPos lastShaft = util.grid.at(0, 1, 2); + BlockPos lastShaft = util.grid().at(0, 1, 2); boolean flip = true; for (int i = 0; i < 3; i++) { - scene.world.modifyBlocks(util.select.fromTo(4, 1, 2, 4, 2, 2), s -> s.cycle(BlockStateProperties.POWERED), - false); - scene.effects.indicateRedstone(util.grid.at(4, 2, 2)); - scene.world.moveSection(gantry1, util.vector.of(flip ? -1 : 1, 0, 0), 20); - scene.world.moveSection(gantry2, util.vector.of(flip ? 1 : -1, 0, 0), 20); - scene.world.modifyKineticSpeed(shafts, f -> -f); - scene.effects.rotationDirectionIndicator(lastShaft.east(flip ? 1 : 0)); + scene.world().modifyBlocks(util.select().fromTo(4, 1, 2, 4, 2, 2), s -> s.cycle(BlockStateProperties.POWERED), + false); + scene.effects().indicateRedstone(util.grid().at(4, 2, 2)); + scene.world().moveSection(gantry1, util.vector().of(flip ? -1 : 1, 0, 0), 20); + scene.world().moveSection(gantry2, util.vector().of(flip ? 1 : -1, 0, 0), 20); + scene.world().modifyKineticSpeed(shafts, f -> -f); + scene.effects().rotationDirectionIndicator(lastShaft.east(flip ? 1 : 0)); scene.idle(20); if (i == 0) { - scene.overlay.showText(80) + scene.overlay().showText(80) .attachKeyFrame() .text("...as well as the rotation direction of the shaft") - .pointAt(util.vector.blockSurface(lastShaft, Direction.WEST)) + .pointAt(util.vector().blockSurface(lastShaft, Direction.WEST)) .placeNearTarget(); } @@ -215,45 +215,45 @@ public class GantryScenes { flip = !flip; } - Selection kinetics = util.select.fromTo(0, 2, 3, 3, 3, 3); - Selection gears1 = util.select.fromTo(0, 1, 3, 0, 3, 3); - Selection gears2 = util.select.fromTo(3, 1, 3, 3, 3, 3); + Selection kinetics = util.select().fromTo(0, 2, 3, 3, 3, 3); + Selection gears1 = util.select().fromTo(0, 1, 3, 0, 3, 3); + Selection gears2 = util.select().fromTo(3, 1, 3, 3, 3, 3); - scene.world.showSection(kinetics, Direction.DOWN); - scene.world.showSection(util.select.fromTo(0, 1, 0, 4, 1, 1), Direction.SOUTH); + scene.world().showSection(kinetics, Direction.DOWN); + scene.world().showSection(util.select().fromTo(0, 1, 0, 4, 1, 1), Direction.SOUTH); scene.idle(20); - BlockPos leverPos = util.grid.at(4, 1, 0); - scene.world.modifyBlocks(util.select.fromTo(1, 1, 0, 3, 1, 1), + BlockPos leverPos = util.grid().at(4, 1, 0); + scene.world().modifyBlocks(util.select().fromTo(1, 1, 0, 3, 1, 1), s -> s.hasProperty(RedStoneWireBlock.POWER) ? s.setValue(RedStoneWireBlock.POWER, 15) : s, false); - scene.world.toggleRedstonePower(util.select.position(leverPos)); - scene.world.toggleRedstonePower(shafts); - scene.effects.indicateRedstone(leverPos); - scene.world.modifyKineticSpeed(gears1, f -> -32f); - scene.world.modifyKineticSpeed(gears2, f -> 32f); + scene.world().toggleRedstonePower(util.select().position(leverPos)); + scene.world().toggleRedstonePower(shafts); + scene.effects().indicateRedstone(leverPos); + scene.world().modifyKineticSpeed(gears1, f -> -32f); + scene.world().modifyKineticSpeed(gears2, f -> 32f); scene.idle(20); - scene.overlay.showText(120) + scene.overlay().showText(120) .attachKeyFrame() .text("Same rules apply for the propagated rotation") - .pointAt(util.vector.topOf(0, 3, 3)) + .pointAt(util.vector().topOf(0, 3, 3)) .placeNearTarget(); scene.idle(20); for (boolean flip2 : Iterate.trueAndFalse) { - scene.effects.rotationDirectionIndicator(util.grid.at(0, 3, 3)); - scene.effects.rotationDirectionIndicator(util.grid.at(3, 3, 3)); + scene.effects().rotationDirectionIndicator(util.grid().at(0, 3, 3)); + scene.effects().rotationDirectionIndicator(util.grid().at(3, 3, 3)); scene.idle(60); - scene.world.modifyBlocks(util.select.fromTo(4, 1, 2, 4, 2, 2), s -> s.cycle(BlockStateProperties.POWERED), - false); - scene.effects.indicateRedstone(util.grid.at(4, 2, 2)); - scene.world.modifyKineticSpeed(gears1, f -> -f); - scene.world.modifyKineticSpeed(gears2, f -> -f); + scene.world().modifyBlocks(util.select().fromTo(4, 1, 2, 4, 2, 2), s -> s.cycle(BlockStateProperties.POWERED), + false); + scene.effects().indicateRedstone(util.grid().at(4, 2, 2)); + scene.world().modifyKineticSpeed(gears1, f -> -f); + scene.world().modifyKineticSpeed(gears2, f -> -f); if (!flip2) { - scene.effects.rotationDirectionIndicator(util.grid.at(0, 3, 3)); - scene.effects.rotationDirectionIndicator(util.grid.at(3, 3, 3)); + scene.effects().rotationDirectionIndicator(util.grid().at(0, 3, 3)); + scene.effects().rotationDirectionIndicator(util.grid().at(3, 3, 3)); scene.markAsFinished(); } } @@ -265,55 +265,55 @@ public class GantryScenes { scene.title("gantry_cascaded", "Cascaded Gantries"); scene.configureBasePlate(0, 0, 5); scene.setSceneOffsetY(-1); - scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -2 * f); - scene.world.showSection(util.select.layer(0) - .add(util.select.column(5, 3)) - .add(util.select.fromTo(2, 1, 3, 4, 1, 3)), Direction.UP); + scene.world().modifyKineticSpeed(util.select().everywhere(), f -> -2 * f); + scene.world().showSection(util.select().layer(0) + .add(util.select().column(5, 3)) + .add(util.select().fromTo(2, 1, 3, 4, 1, 3)), Direction.UP); scene.idle(10); - BlockPos gantryPos = util.grid.at(5, 1, 2); - BlockPos gantryPos2 = util.grid.at(3, 2, 2); + BlockPos gantryPos = util.grid().at(5, 1, 2); + BlockPos gantryPos2 = util.grid().at(3, 2, 2); ElementLink gantry = - scene.world.showIndependentSection(util.select.position(gantryPos), Direction.SOUTH); + scene.world().showIndependentSection(util.select().position(gantryPos), Direction.SOUTH); scene.idle(5); - scene.world.showSectionAndMerge(util.select.fromTo(0, 1, 2, 4, 1, 2), Direction.EAST, gantry); + scene.world().showSectionAndMerge(util.select().fromTo(0, 1, 2, 4, 1, 2), Direction.EAST, gantry); scene.idle(15); - scene.world.moveSection(gantry, util.vector.of(0, 2, 0), 40); - scene.overlay.showText(60) + scene.world().moveSection(gantry, util.vector().of(0, 2, 0), 40); + scene.overlay().showText(60) .attachKeyFrame() .text("Gantry shafts attach to a carriage without the need of super glue") .independent(20); scene.idle(40); - scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); - scene.world.moveSection(gantry, util.vector.of(0, -2, 0), 40); + scene.world().modifyKineticSpeed(util.select().everywhere(), f -> -f); + scene.world().moveSection(gantry, util.vector().of(0, -2, 0), 40); scene.idle(40); ElementLink secondGantry = - scene.world.showIndependentSection(util.select.position(gantryPos2), Direction.DOWN); + scene.world().showIndependentSection(util.select().position(gantryPos2), Direction.DOWN); scene.idle(15); - scene.overlay.showText(60) + scene.overlay().showText(60) .attachKeyFrame() .text("Same applies for carriages on moved Gantry Shafts") .independent(20); scene.idle(15); - scene.world.moveSection(gantry, util.vector.of(0, 2, 0), 40); - scene.world.moveSection(secondGantry, util.vector.of(0, 2, 0), 40); + scene.world().moveSection(gantry, util.vector().of(0, 2, 0), 40); + scene.world().moveSection(secondGantry, util.vector().of(0, 2, 0), 40); scene.idle(40); - BlockPos leverPos = util.grid.at(2, 1, 3); - scene.world.toggleRedstonePower(util.select.position(leverPos)); - scene.world.toggleRedstonePower(util.select.fromTo(3, 1, 3, 4, 1, 3)); - scene.world.toggleRedstonePower(util.select.fromTo(5, 1, 3, 5, 4, 3)); - scene.world.modifyKineticSpeed(util.select.fromTo(0, 1, 2, 5, 1, 2), f -> -32f); - scene.effects.indicateRedstone(leverPos); - scene.world.moveSection(secondGantry, util.vector.of(-3, 0, 0), 60); + BlockPos leverPos = util.grid().at(2, 1, 3); + scene.world().toggleRedstonePower(util.select().position(leverPos)); + scene.world().toggleRedstonePower(util.select().fromTo(3, 1, 3, 4, 1, 3)); + scene.world().toggleRedstonePower(util.select().fromTo(5, 1, 3, 5, 4, 3)); + scene.world().modifyKineticSpeed(util.select().fromTo(0, 1, 2, 5, 1, 2), f -> -32f); + scene.effects().indicateRedstone(leverPos); + scene.world().moveSection(secondGantry, util.vector().of(-3, 0, 0), 60); scene.idle(20); - scene.overlay.showText(120) + scene.overlay().showText(120) .text("Thus, a gantry system can be cascaded to cover multiple axes of movement") .independent(20); } diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ItemVaultScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ItemVaultScenes.java index 03aefd468e..f7f61879c2 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ItemVaultScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ItemVaultScenes.java @@ -5,10 +5,10 @@ import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; import net.createmod.ponder.foundation.ElementLink; import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.SceneBuilder; -import net.createmod.ponder.foundation.SceneBuildingUtil; import net.createmod.ponder.foundation.Selection; import net.createmod.ponder.foundation.element.InputWindowElement; import net.createmod.ponder.foundation.element.WorldSectionElement; @@ -27,64 +27,64 @@ public class ItemVaultScenes { scene.showBasePlate(); scene.idle(5); - Selection chests = util.select.fromTo(4, 3, 2, 3, 4, 3); - Selection largeCog = util.select.position(3, 0, 5); - Selection belt1 = util.select.fromTo(0, 2, 3, 2, 1, 5); - Selection gearbox = util.select.position(2, 1, 2); - Selection belt2 = util.select.fromTo(0, 1, 1, 2, 2, 1); - Selection vault = util.select.fromTo(3, 2, 3, 4, 1, 1); + Selection chests = util.select().fromTo(4, 3, 2, 3, 4, 3); + Selection largeCog = util.select().position(3, 0, 5); + Selection belt1 = util.select().fromTo(0, 2, 3, 2, 1, 5); + Selection gearbox = util.select().position(2, 1, 2); + Selection belt2 = util.select().fromTo(0, 1, 1, 2, 2, 1); + Selection vault = util.select().fromTo(3, 2, 3, 4, 1, 1); - scene.world.showSection(vault, Direction.NORTH); + scene.world().showSection(vault, Direction.NORTH); scene.idle(5); - ElementLink chestLink = scene.world.showIndependentSection(chests, Direction.NORTH); - scene.world.moveSection(chestLink, util.vector.of(-3, -2, 0), 0); + ElementLink chestLink = scene.world().showIndependentSection(chests, Direction.NORTH); + scene.world().moveSection(chestLink, util.vector().of(-3, -2, 0), 0); scene.idle(10); - scene.overlay.showOutline(PonderPalette.GREEN, "chestOutline", util.select.fromTo(1, 1, 2, 0, 2, 3), 40); + scene.overlay().showOutline(PonderPalette.GREEN, "chestOutline", util.select().fromTo(1, 1, 2, 0, 2, 3), 40); scene.idle(10); - scene.overlay.showLine(PonderPalette.GREEN, util.vector.of(2, 1, 2), util.vector.of(3, 1, 1), 30); - scene.overlay.showLine(PonderPalette.GREEN, util.vector.of(2, 3, 2), util.vector.of(3, 3, 1), 30); - scene.overlay.showLine(PonderPalette.GREEN, util.vector.of(2, 3, 4), util.vector.of(3, 3, 4), 30); - scene.overlay.showOutline(PonderPalette.GREEN, "vaultOutline", vault, 40); + scene.overlay().showLine(PonderPalette.GREEN, util.vector().of(2, 1, 2), util.vector().of(3, 1, 1), 30); + scene.overlay().showLine(PonderPalette.GREEN, util.vector().of(2, 3, 2), util.vector().of(3, 3, 1), 30); + scene.overlay().showLine(PonderPalette.GREEN, util.vector().of(2, 3, 4), util.vector().of(3, 3, 4), 30); + scene.overlay().showOutline(PonderPalette.GREEN, "vaultOutline", vault, 40); scene.idle(10); - BlockPos frontVault = util.grid.at(3, 2, 1); - scene.overlay.showText(60) + BlockPos frontVault = util.grid().at(3, 2, 1); + scene.overlay().showText(60) .text("Item Vaults can be used to store large amounts of items") .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.blockSurface(frontVault, Direction.NORTH)); + .pointAt(util.vector().blockSurface(frontVault, Direction.NORTH)); scene.idle(70); - scene.world.hideIndependentSection(chestLink, Direction.DOWN); + scene.world().hideIndependentSection(chestLink, Direction.DOWN); scene.idle(15); ItemStack hand = AllItems.BRASS_HAND.asStack(); - scene.overlay - .showControls(new InputWindowElement(util.vector.blockSurface(frontVault, Direction.NORTH), Pointing.RIGHT) + scene.overlay() + .showControls(new InputWindowElement(util.vector().blockSurface(frontVault, Direction.NORTH), Pointing.RIGHT) .showing(AllIcons.I_MTD_CLOSE) .withItem(hand), 40); scene.idle(7); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("However, contents cannot be added or taken manually") .attachKeyFrame() .colored(PonderPalette.RED) .placeNearTarget() - .pointAt(util.vector.blockSurface(frontVault, Direction.WEST)); + .pointAt(util.vector().blockSurface(frontVault, Direction.WEST)); scene.idle(70); - scene.world.showSection(largeCog, Direction.UP); + scene.world().showSection(largeCog, Direction.UP); scene.idle(5); - scene.world.showSection(belt1, Direction.EAST); + scene.world().showSection(belt1, Direction.EAST); scene.idle(20); - scene.overlay.showText(80) + scene.overlay().showText(80) .text("Any components for item transfer can both insert...") .attachKeyFrame() .colored(PonderPalette.GREEN) .placeNearTarget() - .pointAt(util.vector.topOf(2, 2, 3)); + .pointAt(util.vector().topOf(2, 2, 3)); ItemStack[] junk = { new ItemStack(Items.APPLE), new ItemStack(Items.GOLD_INGOT, 8), new ItemStack(Items.TUFF, 32) }; @@ -92,29 +92,29 @@ public class ItemVaultScenes { scene.idle(4); if (i > 1) { - scene.world.removeItemsFromBelt(util.grid.at(2, 1, 3)); - scene.world.flapFunnel(util.grid.at(2, 2, 3), false); + scene.world().removeItemsFromBelt(util.grid().at(2, 1, 3)); + scene.world().flapFunnel(util.grid().at(2, 2, 3), false); } scene.idle(5); if (i < junk.length) - scene.world.createItemOnBeltLike(util.grid.at(0, 1, 3), Direction.SOUTH, junk[i]); + scene.world().createItemOnBeltLike(util.grid().at(0, 1, 3), Direction.SOUTH, junk[i]); scene.idle(9); } - scene.world.showSection(gearbox, Direction.SOUTH); + scene.world().showSection(gearbox, Direction.SOUTH); scene.idle(5); - scene.world.showSection(belt2, Direction.EAST); + scene.world().showSection(belt2, Direction.EAST); scene.idle(15); - scene.overlay.showText(80) + scene.overlay().showText(80) .text("...and take contents from this container") .colored(PonderPalette.GREEN) .placeNearTarget() - .pointAt(util.vector.topOf(2, 1, 1)); + .pointAt(util.vector().topOf(2, 1, 1)); for (int i = 0; i < junk.length; i++) { - scene.world.createItemOnBeltLike(util.grid.at(2, 1, 1), Direction.EAST, junk[i]); + scene.world().createItemOnBeltLike(util.grid().at(2, 1, 1), Direction.EAST, junk[i]); scene.idle(18); } @@ -128,109 +128,109 @@ public class ItemVaultScenes { scene.showBasePlate(); scene.idle(5); - Selection single = util.select.position(2, 4, 2); - Selection single2 = util.select.fromTo(2, 4, 3, 3, 5, 3); - Selection single3 = util.select.fromTo(2, 4, 4, 4, 6, 4); + Selection single = util.select().position(2, 4, 2); + Selection single2 = util.select().fromTo(2, 4, 3, 3, 5, 3); + Selection single3 = util.select().fromTo(2, 4, 4, 4, 6, 4); - ElementLink s1 = scene.world.showIndependentSection(single, Direction.DOWN); - scene.world.moveSection(s1, util.vector.of(0, -3, 0), 0); + ElementLink s1 = scene.world().showIndependentSection(single, Direction.DOWN); + scene.world().moveSection(s1, util.vector().of(0, -3, 0), 0); scene.idle(10); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("Item Vaults can be combined to increase the total capacity") .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.topOf(2, 1, 2)); + .pointAt(util.vector().topOf(2, 1, 2)); scene.idle(40); - ElementLink s2 = scene.world.showIndependentSection(single, Direction.DOWN); - scene.world.moveSection(s2, util.vector.of(1, -3, 0), 0); + ElementLink s2 = scene.world().showIndependentSection(single, Direction.DOWN); + scene.world().moveSection(s2, util.vector().of(1, -3, 0), 0); scene.idle(5); - ElementLink s3 = scene.world.showIndependentSection(single, Direction.DOWN); - scene.world.moveSection(s3, util.vector.of(1, -2, 0), 0); + ElementLink s3 = scene.world().showIndependentSection(single, Direction.DOWN); + scene.world().moveSection(s3, util.vector().of(1, -2, 0), 0); scene.idle(5); - ElementLink s4 = scene.world.showIndependentSection(single, Direction.DOWN); - scene.world.moveSection(s4, util.vector.of(0, -2, 0), 0); + ElementLink s4 = scene.world().showIndependentSection(single, Direction.DOWN); + scene.world().moveSection(s4, util.vector().of(0, -2, 0), 0); scene.idle(10); - scene.world.moveSection(s1, util.vector.of(0, -100, 0), 0); - scene.world.moveSection(s2, util.vector.of(0, -100, 0), 0); - scene.world.moveSection(s3, util.vector.of(0, -100, 0), 0); - scene.world.moveSection(s4, util.vector.of(0, -100, 0), 0); + scene.world().moveSection(s1, util.vector().of(0, -100, 0), 0); + scene.world().moveSection(s2, util.vector().of(0, -100, 0), 0); + scene.world().moveSection(s3, util.vector().of(0, -100, 0), 0); + scene.world().moveSection(s4, util.vector().of(0, -100, 0), 0); - ElementLink d = scene.world.showIndependentSectionImmediately(single2); - scene.world.moveSection(d, util.vector.of(0, -3, -1), 0); - scene.effects.indicateSuccess(util.grid.at(2, 1, 2)); - scene.effects.indicateSuccess(util.grid.at(2, 2, 2)); - scene.effects.indicateSuccess(util.grid.at(3, 2, 2)); - scene.effects.indicateSuccess(util.grid.at(3, 1, 2)); - scene.world.hideIndependentSection(s1, Direction.DOWN); - scene.world.hideIndependentSection(s2, Direction.DOWN); - scene.world.hideIndependentSection(s3, Direction.DOWN); - scene.world.hideIndependentSection(s4, Direction.DOWN); + ElementLink d = scene.world().showIndependentSectionImmediately(single2); + scene.world().moveSection(d, util.vector().of(0, -3, -1), 0); + scene.effects().indicateSuccess(util.grid().at(2, 1, 2)); + scene.effects().indicateSuccess(util.grid().at(2, 2, 2)); + scene.effects().indicateSuccess(util.grid().at(3, 2, 2)); + scene.effects().indicateSuccess(util.grid().at(3, 1, 2)); + scene.world().hideIndependentSection(s1, Direction.DOWN); + scene.world().hideIndependentSection(s2, Direction.DOWN); + scene.world().hideIndependentSection(s3, Direction.DOWN); + scene.world().hideIndependentSection(s4, Direction.DOWN); scene.idle(25); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("Their base square can be up to 3 blocks wide...") .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.blockSurface(util.grid.at(2, 2, 2), Direction.NORTH)); + .pointAt(util.vector().blockSurface(util.grid().at(2, 2, 2), Direction.NORTH)); scene.idle(40); - s1 = scene.world.showIndependentSection(single, Direction.DOWN); - scene.world.moveSection(s1, util.vector.of(2, -3, 0), 0); + s1 = scene.world().showIndependentSection(single, Direction.DOWN); + scene.world().moveSection(s1, util.vector().of(2, -3, 0), 0); scene.idle(3); - s2 = scene.world.showIndependentSection(single, Direction.DOWN); - scene.world.moveSection(s2, util.vector.of(2, -2, 0), 0); + s2 = scene.world().showIndependentSection(single, Direction.DOWN); + scene.world().moveSection(s2, util.vector().of(2, -2, 0), 0); scene.idle(3); - s3 = scene.world.showIndependentSection(single, Direction.DOWN); - scene.world.moveSection(s3, util.vector.of(2, -1, 0), 0); + s3 = scene.world().showIndependentSection(single, Direction.DOWN); + scene.world().moveSection(s3, util.vector().of(2, -1, 0), 0); scene.idle(3); - s4 = scene.world.showIndependentSection(single, Direction.DOWN); - scene.world.moveSection(s4, util.vector.of(1, -1, 0), 0); + s4 = scene.world().showIndependentSection(single, Direction.DOWN); + scene.world().moveSection(s4, util.vector().of(1, -1, 0), 0); scene.idle(3); - ElementLink s5 = scene.world.showIndependentSection(single, Direction.DOWN); - scene.world.moveSection(s5, util.vector.of(0, -1, 0), 0); + ElementLink s5 = scene.world().showIndependentSection(single, Direction.DOWN); + scene.world().moveSection(s5, util.vector().of(0, -1, 0), 0); scene.idle(10); - scene.world.moveSection(d, util.vector.of(0, -100, 0), 0); - scene.world.moveSection(s1, util.vector.of(0, -100, 0), 0); - scene.world.moveSection(s2, util.vector.of(0, -100, 0), 0); - scene.world.moveSection(s3, util.vector.of(0, -100, 0), 0); - scene.world.moveSection(s4, util.vector.of(0, -100, 0), 0); - scene.world.moveSection(s5, util.vector.of(0, -100, 0), 0); + scene.world().moveSection(d, util.vector().of(0, -100, 0), 0); + scene.world().moveSection(s1, util.vector().of(0, -100, 0), 0); + scene.world().moveSection(s2, util.vector().of(0, -100, 0), 0); + scene.world().moveSection(s3, util.vector().of(0, -100, 0), 0); + scene.world().moveSection(s4, util.vector().of(0, -100, 0), 0); + scene.world().moveSection(s5, util.vector().of(0, -100, 0), 0); - ElementLink t = scene.world.showIndependentSectionImmediately(single3); - scene.world.moveSection(t, util.vector.of(0, -3, -2), 0); + ElementLink t = scene.world().showIndependentSectionImmediately(single3); + scene.world().moveSection(t, util.vector().of(0, -3, -2), 0); for (int i = 1; i < 4; i++) for (int j = 2; j < 5; j++) - scene.effects.indicateSuccess(util.grid.at(j, i, 2)); + scene.effects().indicateSuccess(util.grid().at(j, i, 2)); - scene.world.hideIndependentSection(d, Direction.DOWN); - scene.world.hideIndependentSection(s1, Direction.DOWN); - scene.world.hideIndependentSection(s2, Direction.DOWN); - scene.world.hideIndependentSection(s3, Direction.DOWN); - scene.world.hideIndependentSection(s4, Direction.DOWN); - scene.world.hideIndependentSection(s5, Direction.DOWN); + scene.world().hideIndependentSection(d, Direction.DOWN); + scene.world().hideIndependentSection(s1, Direction.DOWN); + scene.world().hideIndependentSection(s2, Direction.DOWN); + scene.world().hideIndependentSection(s3, Direction.DOWN); + scene.world().hideIndependentSection(s4, Direction.DOWN); + scene.world().hideIndependentSection(s5, Direction.DOWN); scene.idle(25); - scene.world.hideIndependentSection(t, Direction.DOWN); + scene.world().hideIndependentSection(t, Direction.DOWN); scene.idle(15); - Selection full1 = util.select.fromTo(2, 1, 0, 4, 1, 0); - Selection full2 = util.select.fromTo(0, 1, 1, 3, 2, 2); - Selection full3 = util.select.fromTo(1, 1, 5, 5, 3, 3); + Selection full1 = util.select().fromTo(2, 1, 0, 4, 1, 0); + Selection full2 = util.select().fromTo(0, 1, 1, 3, 2, 2); + Selection full3 = util.select().fromTo(1, 1, 5, 5, 3, 3); - scene.world.showSection(full3, Direction.WEST); + scene.world().showSection(full3, Direction.WEST); scene.idle(5); - scene.world.showSection(full2, Direction.EAST); + scene.world().showSection(full2, Direction.EAST); scene.idle(5); - scene.world.showSection(full1, Direction.WEST); + scene.world().showSection(full1, Direction.WEST); scene.idle(10); - Vec3 blockSurface = util.vector.blockSurface(util.grid.at(1, 3, 3), Direction.NORTH); - scene.overlay.showText(60) + Vec3 blockSurface = util.vector().blockSurface(util.grid().at(1, 3, 3), Direction.NORTH); + scene.overlay().showText(60) .text("...and grow in length up to 3x their diameter") .attachKeyFrame() .placeNearTarget() diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/KineticsScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/KineticsScenes.java index 726d8ab4da..b2531c61ac 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/KineticsScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/KineticsScenes.java @@ -18,10 +18,10 @@ import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import com.tterrag.registrate.util.entry.BlockEntry; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; import net.createmod.ponder.foundation.ElementLink; import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.SceneBuilder; -import net.createmod.ponder.foundation.SceneBuildingUtil; import net.createmod.ponder.foundation.Selection; import net.createmod.ponder.foundation.element.InputWindowElement; import net.createmod.ponder.foundation.element.WorldSectionElement; @@ -43,31 +43,31 @@ public class KineticsScenes { CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("shaft", "Relaying rotational force using Shafts"); scene.configureBasePlate(0, 0, 5); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); - BlockPos gaugePos = util.grid.at(0, 1, 2); - Selection gauge = util.select.position(gaugePos); - scene.world.showSection(gauge, Direction.UP); - scene.world.setKineticSpeed(gauge, 0); + BlockPos gaugePos = util.grid().at(0, 1, 2); + Selection gauge = util.select().position(gaugePos); + scene.world().showSection(gauge, Direction.UP); + scene.world().setKineticSpeed(gauge, 0); scene.idle(5); - scene.world.showSection(util.select.position(5, 1, 2), Direction.DOWN); + scene.world().showSection(util.select().position(5, 1, 2), Direction.DOWN); scene.idle(10); for (int i = 4; i >= 1; i--) { if (i == 2) scene.rotateCameraY(70); scene.idle(5); - scene.world.showSection(util.select.position(i, 1, 2), Direction.DOWN); + scene.world().showSection(util.select().position(i, 1, 2), Direction.DOWN); } - scene.world.setKineticSpeed(gauge, 64); - scene.effects.indicateSuccess(gaugePos); + scene.world().setKineticSpeed(gauge, 64); + scene.effects().indicateSuccess(gaugePos); scene.idle(10); - scene.overlay.showText(1000) + scene.overlay().showText(1000) .placeNearTarget() .text("Shafts will relay rotation in a straight line.") - .pointAt(util.vector.of(3, 1.5, 2.5)); + .pointAt(util.vector().of(3, 1.5, 2.5)); scene.idle(20); scene.markAsFinished(); @@ -77,41 +77,41 @@ public class KineticsScenes { CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("shaft_casing", "Encasing Shafts"); scene.configureBasePlate(0, 0, 5); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); - Selection shaft = util.select.cuboid(new BlockPos(0, 1, 2), new Vec3i(5, 0, 2)); - Selection andesite = util.select.position(3, 1, 2); - Selection brass = util.select.position(1, 1, 2); + Selection shaft = util.select().cuboid(new BlockPos(0, 1, 2), new Vec3i(5, 0, 2)); + Selection andesite = util.select().position(3, 1, 2); + Selection brass = util.select().position(1, 1, 2); - scene.world.showSection(shaft, Direction.DOWN); + scene.world().showSection(shaft, Direction.DOWN); scene.idle(20); BlockEntry andesiteEncased = AllBlocks.ANDESITE_ENCASED_SHAFT; ItemStack andesiteCasingItem = AllBlocks.ANDESITE_CASING.asStack(); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(3, 1, 2), Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(3, 1, 2), Pointing.DOWN).rightClick() .withItem(andesiteCasingItem), 60); scene.idle(7); - scene.world.setBlocks(andesite, andesiteEncased.getDefaultState() + scene.world().setBlocks(andesite, andesiteEncased.getDefaultState() .setValue(EncasedShaftBlock.AXIS, Axis.X), true); - scene.world.setKineticSpeed(shaft, 32); + scene.world().setKineticSpeed(shaft, 32); scene.idle(10); BlockEntry brassEncased = AllBlocks.BRASS_ENCASED_SHAFT; ItemStack brassCasingItem = AllBlocks.BRASS_CASING.asStack(); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(1, 0, 2), Pointing.UP).rightClick() + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(1, 0, 2), Pointing.UP).rightClick() .withItem(brassCasingItem), 60); scene.idle(7); - scene.world.setBlocks(brass, brassEncased.getDefaultState() + scene.world().setBlocks(brass, brassEncased.getDefaultState() .setValue(EncasedShaftBlock.AXIS, Axis.X), true); - scene.world.setKineticSpeed(shaft, 32); + scene.world().setKineticSpeed(shaft, 32); scene.idle(10); - scene.overlay.showText(100) + scene.overlay().showText(100) .placeNearTarget() .text("Brass or Andesite Casing can be used to decorate Shafts") - .pointAt(util.vector.topOf(1, 1, 2)); + .pointAt(util.vector().topOf(1, 1, 2)); scene.idle(70); } @@ -119,40 +119,40 @@ public class KineticsScenes { CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("cogwheel", "Relaying rotational force using Cogwheels"); scene.configureBasePlate(0, 0, 5); - BlockPos gauge = util.grid.at(4, 1, 1); - Selection gaugeSelect = util.select.position(gauge); - scene.world.showSection(util.select.layer(0), Direction.UP); - scene.world.showSection(gaugeSelect, Direction.UP); - scene.world.setKineticSpeed(gaugeSelect, 0); + BlockPos gauge = util.grid().at(4, 1, 1); + Selection gaugeSelect = util.select().position(gauge); + scene.world().showSection(util.select().layer(0), Direction.UP); + scene.world().showSection(gaugeSelect, Direction.UP); + scene.world().setKineticSpeed(gaugeSelect, 0); scene.idle(5); - scene.world.showSection(util.select.fromTo(1, 1, 3, 1, 1, 5), Direction.DOWN); + scene.world().showSection(util.select().fromTo(1, 1, 3, 1, 1, 5), Direction.DOWN); scene.idle(10); for (int i = 1; i <= 4; i++) { scene.idle(5); if (i == 2) - scene.world.showSection(util.select.position(0, 1, 2), Direction.DOWN); - scene.world.showSection(util.select.position(i, 1, 2), Direction.DOWN); + scene.world().showSection(util.select().position(0, 1, 2), Direction.DOWN); + scene.world().showSection(util.select().position(i, 1, 2), Direction.DOWN); } - scene.world.setKineticSpeed(gaugeSelect, 64); - scene.effects.indicateSuccess(gauge); + scene.world().setKineticSpeed(gaugeSelect, 64); + scene.effects().indicateSuccess(gauge); scene.idle(10); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("Cogwheels will relay rotation to other adjacent cogwheels") - .pointAt(util.vector.blockSurface(util.grid.at(0, 1, 2), Direction.EAST)); + .pointAt(util.vector().blockSurface(util.grid().at(0, 1, 2), Direction.EAST)); scene.idle(60); - scene.world.showSection(util.select.fromTo(1, 1, 1, 2, 1, 1), Direction.SOUTH); + scene.world().showSection(util.select().fromTo(1, 1, 1, 2, 1, 1), Direction.SOUTH); scene.idle(10); - scene.effects.rotationDirectionIndicator(util.grid.at(1, 1, 1)); - scene.effects.rotationDirectionIndicator(util.grid.at(2, 1, 1)); + scene.effects().rotationDirectionIndicator(util.grid().at(1, 1, 1)); + scene.effects().rotationDirectionIndicator(util.grid().at(2, 1, 1)); scene.idle(20); - scene.overlay.showText(100) + scene.overlay().showText(100) .text("Neighbouring shafts connected like this will rotate in opposite directions") .placeNearTarget() .attachKeyFrame() - .pointAt(util.vector.blockSurface(util.grid.at(1, 1, 2), Direction.NORTH)); + .pointAt(util.vector().blockSurface(util.grid().at(1, 1, 2), Direction.NORTH)); scene.idle(70); } @@ -161,48 +161,48 @@ public class KineticsScenes { CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("large_cogwheel", "Relaying rotational force using Large Cogwheels"); scene.configureBasePlate(1, 1, 5); - scene.world.setBlock(util.grid.at(4, 2, 3), AllBlocks.LARGE_COGWHEEL.getDefaultState() + scene.world().setBlock(util.grid().at(4, 2, 3), AllBlocks.LARGE_COGWHEEL.getDefaultState() .setValue(CogWheelBlock.AXIS, Axis.X), false); scene.showBasePlate(); scene.idle(5); - scene.world.showSection(util.select.layer(1), Direction.DOWN); + scene.world().showSection(util.select().layer(1), Direction.DOWN); scene.idle(5); - scene.world.showSection(util.select.position(3, 2, 4), Direction.NORTH); + scene.world().showSection(util.select().position(3, 2, 4), Direction.NORTH); for (int i = 3; i >= 1; i--) { scene.idle(5); if (i == 3) - scene.world.showSection(util.select.position(3, 2, 5), Direction.DOWN); - scene.world.showSection(util.select.position(3, 2, i), Direction.DOWN); + scene.world().showSection(util.select().position(3, 2, 5), Direction.DOWN); + scene.world().showSection(util.select().position(3, 2, i), Direction.DOWN); } - scene.overlay.showText(70) + scene.overlay().showText(70) .text("Large cogwheels can connect to each other at right angles") .placeNearTarget() - .pointAt(util.vector.centerOf(3, 1, 4)); + .pointAt(util.vector().centerOf(3, 1, 4)); scene.idle(70); - scene.world.hideSection(util.select.fromTo(3, 2, 1, 3, 2, 5), Direction.SOUTH); + scene.world().hideSection(util.select().fromTo(3, 2, 1, 3, 2, 5), Direction.SOUTH); scene.idle(15); - scene.world.modifyBlock(util.grid.at(3, 2, 3), s -> s.setValue(ShaftBlock.AXIS, Axis.X), false); - scene.world.setKineticSpeed(util.select.fromTo(1, 2, 3, 5, 2, 3), 16); - scene.world.showSection(util.select.position(4, 2, 3), Direction.WEST); + scene.world().modifyBlock(util.grid().at(3, 2, 3), s -> s.setValue(ShaftBlock.AXIS, Axis.X), false); + scene.world().setKineticSpeed(util.select().fromTo(1, 2, 3, 5, 2, 3), 16); + scene.world().showSection(util.select().position(4, 2, 3), Direction.WEST); for (int i = 3; i >= 1; i--) { scene.idle(5); if (i == 3) - scene.world.showSection(util.select.position(5, 2, 3), Direction.DOWN); - scene.world.showSection(util.select.position(i, 2, 3), Direction.DOWN); + scene.world().showSection(util.select().position(5, 2, 3), Direction.DOWN); + scene.world().showSection(util.select().position(i, 2, 3), Direction.DOWN); } scene.idle(5); - scene.overlay.showText(90) + scene.overlay().showText(90) .text("It will help relaying conveyed speed to other axes of rotation") .placeNearTarget() - .pointAt(util.vector.blockSurface(util.grid.at(1, 2, 3), Direction.WEST)); - scene.effects.rotationSpeedIndicator(util.grid.at(3, 1, 3)); - scene.effects.rotationSpeedIndicator(util.grid.at(4, 2, 3)); + .pointAt(util.vector().blockSurface(util.grid().at(1, 2, 3), Direction.WEST)); + scene.effects().rotationSpeedIndicator(util.grid().at(3, 1, 3)); + scene.effects().rotationSpeedIndicator(util.grid().at(4, 2, 3)); scene.idle(60); } @@ -211,93 +211,93 @@ public class KineticsScenes { CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("cog_speedup", "Gearshifting with Cogs"); scene.configureBasePlate(0, 0, 5); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); scene.idle(5); - scene.world.showSection(util.select.fromTo(5, 1, 2, 4, 1, 2), Direction.DOWN); + scene.world().showSection(util.select().fromTo(5, 1, 2, 4, 1, 2), Direction.DOWN); scene.idle(10); - BlockPos lowerCog = util.grid.at(3, 1, 2); - BlockPos upperCog = util.grid.at(3, 2, 3); + BlockPos lowerCog = util.grid().at(3, 1, 2); + BlockPos upperCog = util.grid().at(3, 2, 3); BlockState largeCogState = AllBlocks.LARGE_COGWHEEL.getDefaultState() .setValue(CogWheelBlock.AXIS, Axis.X); BlockState smallCogState = AllBlocks.COGWHEEL.getDefaultState() .setValue(CogWheelBlock.AXIS, Axis.X); - scene.world.setBlock(lowerCog, largeCogState, false); - scene.world.setBlock(upperCog, smallCogState, false); + scene.world().setBlock(lowerCog, largeCogState, false); + scene.world().setBlock(upperCog, smallCogState, false); BlockPos upperShaftEnd = upperCog.west(3); BlockPos lowerShaftEnd = lowerCog.west(3); - scene.world.setKineticSpeed(util.select.fromTo(upperCog, upperShaftEnd), -64); - scene.world.showSection(util.select.fromTo(lowerCog, upperCog), Direction.EAST); - scene.overlay.showText(60) + scene.world().setKineticSpeed(util.select().fromTo(upperCog, upperShaftEnd), -64); + scene.world().showSection(util.select().fromTo(lowerCog, upperCog), Direction.EAST); + scene.overlay().showText(60) .text("Large and Small cogs can be connected diagonally") .placeNearTarget() - .pointAt(util.vector.blockSurface(upperCog, Direction.WEST)); + .pointAt(util.vector().blockSurface(upperCog, Direction.WEST)); scene.idle(80); - Selection gaugesSelect = util.select.fromTo(0, 1, 2, 2, 2, 3); - scene.world.showSection(gaugesSelect, Direction.DOWN); - scene.overlay.showText(80) + Selection gaugesSelect = util.select().fromTo(0, 1, 2, 2, 2, 3); + scene.world().showSection(gaugesSelect, Direction.DOWN); + scene.overlay().showText(80) .text("Shifting from large to small cogs, the conveyed speed will be doubled") .colored(PonderPalette.GREEN) .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.blockSurface(util.grid.at(1, 2, 3), Direction.NORTH)); + .pointAt(util.vector().blockSurface(util.grid().at(1, 2, 3), Direction.NORTH)); scene.idle(30); - scene.effects.rotationSpeedIndicator(upperCog); + scene.effects().rotationSpeedIndicator(upperCog); scene.idle(60); - scene.overlay.showText(30) + scene.overlay().showText(30) .sharedText("rpm32") .colored(PonderPalette.FAST) .placeNearTarget() - .pointAt(util.vector.blockSurface(upperShaftEnd, Direction.WEST)); + .pointAt(util.vector().blockSurface(upperShaftEnd, Direction.WEST)); scene.idle(5); - scene.overlay.showText(30) + scene.overlay().showText(30) .sharedText("rpm16") .colored(PonderPalette.MEDIUM) .placeNearTarget() - .pointAt(util.vector.blockSurface(lowerShaftEnd, Direction.WEST)); + .pointAt(util.vector().blockSurface(lowerShaftEnd, Direction.WEST)); scene.idle(45); - scene.world.setKineticSpeed(util.select.fromTo(lowerCog, upperShaftEnd), 0); + scene.world().setKineticSpeed(util.select().fromTo(lowerCog, upperShaftEnd), 0); ElementLink cogs = - scene.world.makeSectionIndependent(util.select.fromTo(lowerCog, upperCog)); - scene.world.moveSection(cogs, util.vector.of(0, 1, 0), 5); + scene.world().makeSectionIndependent(util.select().fromTo(lowerCog, upperCog)); + scene.world().moveSection(cogs, util.vector().of(0, 1, 0), 5); scene.idle(5); - scene.world.rotateSection(cogs, 180, 0, 0, 10); + scene.world().rotateSection(cogs, 180, 0, 0, 10); scene.idle(10); - scene.world.setBlock(lowerCog, smallCogState, false); - scene.world.setBlock(upperCog, largeCogState, false); - scene.world.rotateSection(cogs, 180, 0, 0, 0); - scene.world.moveSection(cogs, util.vector.of(0, -1, 0), 5); + scene.world().setBlock(lowerCog, smallCogState, false); + scene.world().setBlock(upperCog, largeCogState, false); + scene.world().rotateSection(cogs, 180, 0, 0, 0); + scene.world().moveSection(cogs, util.vector().of(0, -1, 0), 5); scene.idle(5); - scene.world.setKineticSpeed(util.select.fromTo(lowerCog, lowerShaftEnd), 32); - scene.world.setKineticSpeed(util.select.fromTo(upperCog, upperShaftEnd), -16); + scene.world().setKineticSpeed(util.select().fromTo(lowerCog, lowerShaftEnd), 32); + scene.world().setKineticSpeed(util.select().fromTo(upperCog, upperShaftEnd), -16); - scene.overlay.showText(80) + scene.overlay().showText(80) .text("Shifting the opposite way, the conveyed speed will be halved") .colored(PonderPalette.RED) .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.blockSurface(util.grid.at(1, 2, 3), Direction.NORTH)); + .pointAt(util.vector().blockSurface(util.grid().at(1, 2, 3), Direction.NORTH)); scene.idle(10); - scene.effects.rotationSpeedIndicator(upperCog); + scene.effects().rotationSpeedIndicator(upperCog); scene.idle(80); - scene.overlay.showText(60) + scene.overlay().showText(60) .sharedText("rpm8") .colored(PonderPalette.SLOW) .placeNearTarget() - .pointAt(util.vector.blockSurface(upperShaftEnd, Direction.WEST)); + .pointAt(util.vector().blockSurface(upperShaftEnd, Direction.WEST)); scene.idle(5); - scene.overlay.showText(60) + scene.overlay().showText(60) .sharedText("rpm16") .colored(PonderPalette.MEDIUM) .placeNearTarget() - .pointAt(util.vector.blockSurface(lowerShaftEnd, Direction.WEST)); + .pointAt(util.vector().blockSurface(lowerShaftEnd, Direction.WEST)); scene.idle(40); } @@ -305,102 +305,102 @@ public class KineticsScenes { CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("cogwheel_casing", "Encasing Cogwheels"); scene.configureBasePlate(0, 0, 5); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); - Selection large1 = util.select.position(4, 1, 3); - Selection small1 = util.select.fromTo(3, 1, 2, 3, 2, 2); - Selection small2 = util.select.position(2, 1, 2); - Selection large2 = util.select.fromTo(1, 1, 3, 1, 1, 4); - Selection shaft2 = util.select.position(2, 2, 2); + Selection large1 = util.select().position(4, 1, 3); + Selection small1 = util.select().fromTo(3, 1, 2, 3, 2, 2); + Selection small2 = util.select().position(2, 1, 2); + Selection large2 = util.select().fromTo(1, 1, 3, 1, 1, 4); + Selection shaft2 = util.select().position(2, 2, 2); - scene.world.setKineticSpeed(shaft2, 0); + scene.world().setKineticSpeed(shaft2, 0); scene.idle(10); - scene.world.showSection(large1, Direction.DOWN); + scene.world().showSection(large1, Direction.DOWN); scene.idle(5); - scene.world.showSection(small1, Direction.DOWN); - scene.world.showSection(small2, Direction.DOWN); + scene.world().showSection(small1, Direction.DOWN); + scene.world().showSection(small2, Direction.DOWN); scene.idle(5); - scene.world.showSection(large2, Direction.EAST); + scene.world().showSection(large2, Direction.EAST); scene.idle(20); BlockEntry andesiteEncased = AllBlocks.ANDESITE_ENCASED_COGWHEEL; ItemStack andesiteCasingItem = AllBlocks.ANDESITE_CASING.asStack(); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(3, 0, 2), Pointing.UP).rightClick() + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(3, 0, 2), Pointing.UP).rightClick() .withItem(andesiteCasingItem), 100); scene.idle(7); - scene.world.setBlocks(util.select.position(3, 1, 2), andesiteEncased.getDefaultState() + scene.world().setBlocks(util.select().position(3, 1, 2), andesiteEncased.getDefaultState() .setValue(EncasedCogwheelBlock.AXIS, Axis.Y) .setValue(EncasedCogwheelBlock.TOP_SHAFT, true), true); - scene.world.setKineticSpeed(util.select.position(3, 1, 2), -32); + scene.world().setKineticSpeed(util.select().position(3, 1, 2), -32); scene.idle(15); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(2, 1, 2), Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(2, 1, 2), Pointing.DOWN).rightClick() .withItem(andesiteCasingItem), 30); scene.idle(7); - scene.world.setBlocks(small2, andesiteEncased.getDefaultState() + scene.world().setBlocks(small2, andesiteEncased.getDefaultState() .setValue(EncasedCogwheelBlock.AXIS, Axis.Y), true); - scene.world.setKineticSpeed(small2, 32); + scene.world().setKineticSpeed(small2, 32); scene.idle(15); BlockEntry brassEncased = AllBlocks.BRASS_ENCASED_LARGE_COGWHEEL; ItemStack brassCasingItem = AllBlocks.BRASS_CASING.asStack(); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(1, 0, 3), Pointing.UP).rightClick() + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(1, 0, 3), Pointing.UP).rightClick() .withItem(brassCasingItem), 60); scene.idle(7); - scene.world.setBlocks(util.select.position(1, 1, 3), brassEncased.getDefaultState() + scene.world().setBlocks(util.select().position(1, 1, 3), brassEncased.getDefaultState() .setValue(EncasedCogwheelBlock.AXIS, Axis.Y), true); - scene.world.setKineticSpeed(util.select.position(1, 1, 3), -16); + scene.world().setKineticSpeed(util.select().position(1, 1, 3), -16); scene.idle(10); - scene.overlay.showText(70) + scene.overlay().showText(70) .placeNearTarget() .attachKeyFrame() .text("Brass or Andesite Casing can be used to decorate Cogwheels") - .pointAt(util.vector.topOf(1, 1, 3)); + .pointAt(util.vector().topOf(1, 1, 3)); scene.idle(80); - ElementLink shaftLink = scene.world.showIndependentSection(shaft2, Direction.DOWN); + ElementLink shaftLink = scene.world().showIndependentSection(shaft2, Direction.DOWN); scene.idle(15); - scene.overlay.showText(90) + scene.overlay().showText(90) .placeNearTarget() .colored(PonderPalette.RED) .attachKeyFrame() .text("Components added after encasing will not connect to the shaft outputs") - .pointAt(util.vector.centerOf(2, 2, 2)); + .pointAt(util.vector().centerOf(2, 2, 2)); scene.idle(90); - scene.world.moveSection(shaftLink, new Vec3(0, .5f, 0), 10); + scene.world().moveSection(shaftLink, new Vec3(0, .5f, 0), 10); scene.idle(10); scene.addKeyframe(); - Vec3 wrenchHere = util.vector.topOf(2, 1, 2) + Vec3 wrenchHere = util.vector().topOf(2, 1, 2) .add(.25, 0, -.25); - scene.overlay.showControls(new InputWindowElement(wrenchHere, Pointing.RIGHT).rightClick() + scene.overlay().showControls(new InputWindowElement(wrenchHere, Pointing.RIGHT).rightClick() .withItem(AllItems.WRENCH.asStack()), 25); scene.idle(7); - scene.world.cycleBlockProperty(util.grid.at(2, 1, 2), EncasedCogwheelBlock.TOP_SHAFT); + scene.world().cycleBlockProperty(util.grid().at(2, 1, 2), EncasedCogwheelBlock.TOP_SHAFT); scene.idle(15); - scene.world.moveSection(shaftLink, new Vec3(0, -.5f, 0), 10); + scene.world().moveSection(shaftLink, new Vec3(0, -.5f, 0), 10); scene.idle(10); - scene.world.setKineticSpeed(shaft2, 32); - scene.effects.rotationDirectionIndicator(util.grid.at(2, 2, 2)); + scene.world().setKineticSpeed(shaft2, 32); + scene.effects().rotationDirectionIndicator(util.grid().at(2, 2, 2)); scene.idle(20); - scene.overlay.showText(90) + scene.overlay().showText(90) .placeNearTarget() .colored(PonderPalette.GREEN) .text("The Wrench can be used to toggle connections") .pointAt(wrenchHere.add(-.5, 0, .5)); scene.idle(40); - scene.overlay.showControls(new InputWindowElement(wrenchHere, Pointing.RIGHT).rightClick() + scene.overlay().showControls(new InputWindowElement(wrenchHere, Pointing.RIGHT).rightClick() .withItem(AllItems.WRENCH.asStack()), 25); scene.idle(7); - scene.world.cycleBlockProperty(util.grid.at(2, 1, 2), EncasedCogwheelBlock.TOP_SHAFT); - scene.world.setKineticSpeed(shaft2, 0); + scene.world().cycleBlockProperty(util.grid().at(2, 1, 2), EncasedCogwheelBlock.TOP_SHAFT); + scene.world().setKineticSpeed(shaft2, 0); } public static void gearbox(SceneBuilder builder, SceneBuildingUtil util) { @@ -409,78 +409,78 @@ public class KineticsScenes { scene.configureBasePlate(1, 1, 5); scene.setSceneOffsetY(-1); - scene.world.showSection(util.select.layer(0), Direction.UP); - scene.world.showSection(util.select.fromTo(4, 1, 6, 3, 2, 5), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); + scene.world().showSection(util.select().fromTo(4, 1, 6, 3, 2, 5), Direction.UP); scene.idle(10); - BlockPos largeCogBack = util.grid.at(3, 2, 4); - BlockPos largeCogLeft = util.grid.at(4, 2, 3); - BlockPos largeCogFront = util.grid.at(3, 2, 2); - BlockPos largeCogRight = util.grid.at(2, 2, 3); + BlockPos largeCogBack = util.grid().at(3, 2, 4); + BlockPos largeCogLeft = util.grid().at(4, 2, 3); + BlockPos largeCogFront = util.grid().at(3, 2, 2); + BlockPos largeCogRight = util.grid().at(2, 2, 3); - scene.world.showSection(util.select.position(largeCogBack), Direction.SOUTH); + scene.world().showSection(util.select().position(largeCogBack), Direction.SOUTH); scene.idle(5); - scene.world.showSection(util.select.position(largeCogLeft), Direction.WEST); - scene.world.showSection(util.select.position(largeCogLeft.east()), Direction.WEST); - scene.world.showSection(util.select.position(largeCogRight), Direction.EAST); - scene.world.showSection(util.select.position(largeCogRight.west()), Direction.EAST); + scene.world().showSection(util.select().position(largeCogLeft), Direction.WEST); + scene.world().showSection(util.select().position(largeCogLeft.east()), Direction.WEST); + scene.world().showSection(util.select().position(largeCogRight), Direction.EAST); + scene.world().showSection(util.select().position(largeCogRight.west()), Direction.EAST); scene.idle(5); - scene.world.showSection(util.select.position(largeCogFront), Direction.SOUTH); - scene.world.showSection(util.select.position(largeCogFront.north()), Direction.SOUTH); + scene.world().showSection(util.select().position(largeCogFront), Direction.SOUTH); + scene.world().showSection(util.select().position(largeCogFront.north()), Direction.SOUTH); scene.idle(10); - scene.overlay.showText(80) + scene.overlay().showText(80) .colored(PonderPalette.RED) - .pointAt(util.vector.blockSurface(largeCogRight.west(), Direction.WEST)) + .pointAt(util.vector().blockSurface(largeCogRight.west(), Direction.WEST)) .placeNearTarget() .text("Jumping between axes of rotation can get bulky quickly"); scene.idle(80); - Selection gearbox = util.select.position(3, 2, 3); - scene.world.hideSection(util.select.fromTo(4, 2, 2, 2, 2, 4) + Selection gearbox = util.select().position(3, 2, 3); + scene.world().hideSection(util.select().fromTo(4, 2, 2, 2, 2, 4) .substract(gearbox), Direction.UP); scene.idle(20); BlockState defaultState = AllBlocks.SHAFT.getDefaultState(); BlockState cogState = AllBlocks.COGWHEEL.getDefaultState(); - scene.world.setBlock(largeCogBack, defaultState.setValue(CogWheelBlock.AXIS, Axis.Z), false); - scene.world.setBlock(largeCogFront, defaultState.setValue(CogWheelBlock.AXIS, Axis.Z), false); - scene.world.setBlock(largeCogRight, defaultState.setValue(CogWheelBlock.AXIS, Axis.X), false); - scene.world.setBlock(largeCogLeft, defaultState.setValue(CogWheelBlock.AXIS, Axis.X), false); - scene.world.showSection(util.select.fromTo(4, 2, 2, 2, 2, 4), Direction.DOWN); + scene.world().setBlock(largeCogBack, defaultState.setValue(CogWheelBlock.AXIS, Axis.Z), false); + scene.world().setBlock(largeCogFront, defaultState.setValue(CogWheelBlock.AXIS, Axis.Z), false); + scene.world().setBlock(largeCogRight, defaultState.setValue(CogWheelBlock.AXIS, Axis.X), false); + scene.world().setBlock(largeCogLeft, defaultState.setValue(CogWheelBlock.AXIS, Axis.X), false); + scene.world().showSection(util.select().fromTo(4, 2, 2, 2, 2, 4), Direction.DOWN); scene.idle(20); - scene.overlay.showText(80) + scene.overlay().showText(80) .colored(PonderPalette.GREEN) - .pointAt(util.vector.topOf(3, 2, 3)) + .pointAt(util.vector().topOf(3, 2, 3)) .placeNearTarget() .attachKeyFrame() .text("A gearbox is the more compact equivalent of this setup"); scene.idle(90); - scene.world.setBlock(largeCogFront.north(), cogState.setValue(CogWheelBlock.AXIS, Axis.Z), true); - scene.world.setBlock(largeCogRight.west(), cogState.setValue(CogWheelBlock.AXIS, Axis.X), true); + scene.world().setBlock(largeCogFront.north(), cogState.setValue(CogWheelBlock.AXIS, Axis.Z), true); + scene.world().setBlock(largeCogRight.west(), cogState.setValue(CogWheelBlock.AXIS, Axis.X), true); scene.idle(10); - scene.effects.rotationDirectionIndicator(largeCogFront.north()); - scene.effects.rotationDirectionIndicator(largeCogRight.west()); + scene.effects().rotationDirectionIndicator(largeCogFront.north()); + scene.effects().rotationDirectionIndicator(largeCogRight.west()); scene.idle(15); - scene.overlay.showText(60) - .pointAt(util.vector.of(3, 2.5, 3)) + scene.overlay().showText(60) + .pointAt(util.vector().of(3, 2.5, 3)) .placeNearTarget() .text("Shafts around corners rotate in mirrored directions"); scene.idle(70); - scene.world.hideSection(util.select.fromTo(1, 2, 3, 2, 2, 3), Direction.WEST); - scene.world.hideSection(util.select.fromTo(4, 2, 3, 5, 2, 3), Direction.EAST); - scene.world.setBlock(largeCogBack.south(), cogState.setValue(CogWheelBlock.AXIS, Axis.Z), true); + scene.world().hideSection(util.select().fromTo(1, 2, 3, 2, 2, 3), Direction.WEST); + scene.world().hideSection(util.select().fromTo(4, 2, 3, 5, 2, 3), Direction.EAST); + scene.world().setBlock(largeCogBack.south(), cogState.setValue(CogWheelBlock.AXIS, Axis.Z), true); scene.idle(10); - scene.effects.rotationDirectionIndicator(largeCogFront.north()); - scene.effects.rotationDirectionIndicator(largeCogBack.south()); + scene.effects().rotationDirectionIndicator(largeCogFront.north()); + scene.effects().rotationDirectionIndicator(largeCogBack.south()); scene.idle(15); - scene.overlay.showText(60) - .pointAt(util.vector.centerOf(3, 2, 5)) + scene.overlay().showText(60) + .pointAt(util.vector().centerOf(3, 2, 5)) .placeNearTarget() .text("Straight connections will be reversed"); @@ -490,101 +490,101 @@ public class KineticsScenes { CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("clutch", "Controlling rotational force using a Clutch"); scene.configureBasePlate(0, 0, 5); - scene.world.showSection(util.select.layer(0), Direction.UP); - BlockPos leverPos = util.grid.at(3, 1, 0); - scene.world.showSection(util.select.fromTo(leverPos, leverPos.south()), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); + BlockPos leverPos = util.grid().at(3, 1, 0); + scene.world().showSection(util.select().fromTo(leverPos, leverPos.south()), Direction.UP); - BlockPos gaugePos = util.grid.at(0, 1, 2); - Selection gauge = util.select.position(gaugePos); - scene.world.showSection(gauge, Direction.UP); - scene.world.setKineticSpeed(gauge, 0); + BlockPos gaugePos = util.grid().at(0, 1, 2); + Selection gauge = util.select().position(gaugePos); + scene.world().showSection(gauge, Direction.UP); + scene.world().setKineticSpeed(gauge, 0); scene.idle(5); - scene.world.showSection(util.select.position(5, 1, 2), Direction.DOWN); + scene.world().showSection(util.select().position(5, 1, 2), Direction.DOWN); scene.idle(10); for (int i = 4; i >= 1; i--) { scene.idle(5); - scene.world.showSection(util.select.position(i, 1, 2), Direction.DOWN); + scene.world().showSection(util.select().position(i, 1, 2), Direction.DOWN); } - BlockPos clutch = util.grid.at(3, 1, 2); + BlockPos clutch = util.grid().at(3, 1, 2); - scene.world.setKineticSpeed(gauge, 32); - scene.effects.indicateSuccess(gaugePos); + scene.world().setKineticSpeed(gauge, 32); + scene.effects().indicateSuccess(gaugePos); scene.idle(10); - scene.overlay.showText(50) + scene.overlay().showText(50) .text("Clutches will relay rotation in a straight line") .placeNearTarget() - .pointAt(util.vector.topOf(clutch)); + .pointAt(util.vector().topOf(clutch)); scene.idle(60); - scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.south(2))); - scene.effects.indicateRedstone(leverPos); - scene.world.setKineticSpeed(util.select.fromTo(0, 1, 2, 2, 1, 2), 0); + scene.world().toggleRedstonePower(util.select().fromTo(leverPos, leverPos.south(2))); + scene.effects().indicateRedstone(leverPos); + scene.world().setKineticSpeed(util.select().fromTo(0, 1, 2, 2, 1, 2), 0); scene.idle(10); scene.idle(10); - scene.overlay.showText(50) + scene.overlay().showText(50) .colored(PonderPalette.RED) .text("When powered by Redstone, it breaks the connection") .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.topOf(clutch)); + .pointAt(util.vector().topOf(clutch)); scene.idle(70); - scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.south(2))); - scene.effects.indicateRedstone(leverPos); - scene.world.setKineticSpeed(util.select.fromTo(0, 1, 2, 2, 1, 2), 32); - scene.effects.indicateSuccess(gaugePos); + scene.world().toggleRedstonePower(util.select().fromTo(leverPos, leverPos.south(2))); + scene.effects().indicateRedstone(leverPos); + scene.world().setKineticSpeed(util.select().fromTo(0, 1, 2, 2, 1, 2), 32); + scene.effects().indicateSuccess(gaugePos); } public static void gearshift(SceneBuilder builder, SceneBuildingUtil util) { CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("gearshift", "Controlling rotational force using a Gearshift"); scene.configureBasePlate(0, 0, 5); - scene.world.showSection(util.select.layer(0), Direction.UP); - BlockPos leverPos = util.grid.at(3, 1, 0); - scene.world.showSection(util.select.fromTo(leverPos, leverPos.south()), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); + BlockPos leverPos = util.grid().at(3, 1, 0); + scene.world().showSection(util.select().fromTo(leverPos, leverPos.south()), Direction.UP); scene.idle(5); - scene.world.showSection(util.select.position(5, 1, 2), Direction.DOWN); + scene.world().showSection(util.select().position(5, 1, 2), Direction.DOWN); scene.idle(10); for (int i = 4; i >= 1; i--) { scene.idle(5); - scene.world.showSection(util.select.position(i, 1, 2), Direction.DOWN); + scene.world().showSection(util.select().position(i, 1, 2), Direction.DOWN); } - BlockPos gearshift = util.grid.at(3, 1, 2); + BlockPos gearshift = util.grid().at(3, 1, 2); scene.idle(10); - scene.overlay.showText(50) + scene.overlay().showText(50) .placeNearTarget() .text("Gearshifts will relay rotation in a straight line") - .pointAt(util.vector.topOf(gearshift)); + .pointAt(util.vector().topOf(gearshift)); scene.idle(60); - scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.south(2))); - scene.effects.indicateRedstone(leverPos); - scene.world.modifyKineticSpeed(util.select.fromTo(0, 1, 2, 2, 2, 2), f -> -f); - scene.effects.rotationDirectionIndicator(gearshift.east(2)); - scene.effects.rotationDirectionIndicator(gearshift.west(2)); + scene.world().toggleRedstonePower(util.select().fromTo(leverPos, leverPos.south(2))); + scene.effects().indicateRedstone(leverPos); + scene.world().modifyKineticSpeed(util.select().fromTo(0, 1, 2, 2, 2, 2), f -> -f); + scene.effects().rotationDirectionIndicator(gearshift.east(2)); + scene.effects().rotationDirectionIndicator(gearshift.west(2)); scene.idle(30); - scene.overlay.showText(50) + scene.overlay().showText(50) .colored(PonderPalette.RED) .placeNearTarget() .text("When powered by Redstone, it reverses the transmission") .attachKeyFrame() - .pointAt(util.vector.topOf(gearshift)); + .pointAt(util.vector().topOf(gearshift)); for (int i = 0; i < 3; i++) { scene.idle(60); - scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.south(2))); - scene.effects.indicateRedstone(leverPos); - scene.world.modifyKineticSpeed(util.select.fromTo(0, 1, 2, 2, 2, 2), f -> -f); - scene.effects.rotationDirectionIndicator(gearshift.east(2)); - scene.effects.rotationDirectionIndicator(gearshift.west(2)); + scene.world().toggleRedstonePower(util.select().fromTo(leverPos, leverPos.south(2))); + scene.effects().indicateRedstone(leverPos); + scene.world().modifyKineticSpeed(util.select().fromTo(0, 1, 2, 2, 2, 2), f -> -f); + scene.effects().rotationDirectionIndicator(gearshift.east(2)); + scene.effects().rotationDirectionIndicator(gearshift.west(2)); } } @@ -592,56 +592,56 @@ public class KineticsScenes { CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("creative_motor", "Generating Rotational Force using Creative Motors"); scene.configureBasePlate(0, 0, 5); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); - BlockPos motor = util.grid.at(3, 1, 2); + BlockPos motor = util.grid().at(3, 1, 2); for (int i = 0; i < 3; i++) { scene.idle(5); - scene.world.showSection(util.select.position(1 + i, 1, 2), Direction.DOWN); + scene.world().showSection(util.select().position(1 + i, 1, 2), Direction.DOWN); } scene.idle(10); - scene.effects.rotationSpeedIndicator(motor); - scene.overlay.showText(50) + scene.effects().rotationSpeedIndicator(motor); + scene.overlay().showText(50) .text("Creative motors are a compact and configurable source of Rotational Force") .placeNearTarget() - .pointAt(util.vector.topOf(motor)); + .pointAt(util.vector().topOf(motor)); scene.idle(70); - Vec3 blockSurface = util.vector.blockSurface(motor, Direction.NORTH) + Vec3 blockSurface = util.vector().blockSurface(motor, Direction.NORTH) .add(1 / 16f, 0, 3 / 16f); - scene.overlay.showFilterSlotInput(blockSurface, Direction.NORTH, 80); - scene.overlay.showControls(new InputWindowElement(blockSurface, Pointing.DOWN).rightClick(), 60); + scene.overlay().showFilterSlotInput(blockSurface, Direction.NORTH, 80); + scene.overlay().showControls(new InputWindowElement(blockSurface, Pointing.DOWN).rightClick(), 60); scene.idle(20); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("The generated speed can be configured on its input panels") .attachKeyFrame() .placeNearTarget() .pointAt(blockSurface); scene.idle(10); scene.idle(50); - scene.world.modifyKineticSpeed(util.select.fromTo(1, 1, 2, 3, 1, 2), f -> 4 * f); + scene.world().modifyKineticSpeed(util.select().fromTo(1, 1, 2, 3, 1, 2), f -> 4 * f); scene.idle(10); - scene.effects.rotationSpeedIndicator(motor); + scene.effects().rotationSpeedIndicator(motor); } public static void waterWheel(SceneBuilder builder, SceneBuildingUtil util) { CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("water_wheel", "Generating Rotational Force using Water Wheels"); scene.configureBasePlate(0, 0, 5); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); scene.idle(5); - scene.world.showSection(util.select.fromTo(3, 1, 3, 3, 2, 3), Direction.DOWN); - scene.world.setKineticSpeed(util.select.everywhere(), 0); + scene.world().showSection(util.select().fromTo(3, 1, 3, 3, 2, 3), Direction.DOWN); + scene.world().setKineticSpeed(util.select().everywhere(), 0); - BlockPos gaugePos = util.grid.at(1, 2, 2); + BlockPos gaugePos = util.grid().at(1, 2, 2); for (int i = 0; i < 4; i++) { scene.idle(5); - scene.world.showSection(util.select.fromTo(gaugePos.east(i) + scene.world().showSection(util.select().fromTo(gaugePos.east(i) .below(), gaugePos.east(i)), Direction.DOWN); } @@ -649,279 +649,281 @@ public class KineticsScenes { for (int i = 0; i < 2; i++) { scene.idle(5); - scene.world.showSection(util.select.position(3, 3, 3 - i), Direction.DOWN); + scene.world().showSection(util.select().position(3, 3, 3 - i), Direction.DOWN); } - scene.world.setKineticSpeed(util.select.everywhere(), -8); - scene.effects.indicateSuccess(gaugePos); + scene.world().setKineticSpeed(util.select().everywhere(), -8); + scene.effects().indicateSuccess(gaugePos); - BlockPos wheel = util.grid.at(3, 2, 2); - scene.effects.rotationSpeedIndicator(wheel); - scene.overlay.showText(60) + BlockPos wheel = util.grid().at(3, 2, 2); + scene.effects().rotationSpeedIndicator(wheel); + scene.overlay().showText(60) .text("Water Wheels draw force from adjacent Water Currents") .placeNearTarget() - .pointAt(util.vector.topOf(wheel)); + .pointAt(util.vector().topOf(wheel)); scene.idle(10); AABB bb = new AABB(wheel).inflate(1 / 16f, 0, 0); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, new Object(), bb.move(0, 1, 0) + scene.overlay().chaseBoundingBoxOutline(PonderPalette.MEDIUM, new Object(), bb.move(0, 1, 0) .contract(0, .75, 0), 80); scene.idle(5); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, new Object(), bb.move(0, 0, -1) + scene.overlay().chaseBoundingBoxOutline(PonderPalette.MEDIUM, new Object(), bb.move(0, 0, -1) .contract(0, 0, -.75), 75); scene.idle(5); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, new Object(), bb.move(0, -1, 0) + scene.overlay().chaseBoundingBoxOutline(PonderPalette.MEDIUM, new Object(), bb.move(0, -1, 0) .contract(0, -.75, 0), 70); scene.idle(5); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, new Object(), bb.move(0, 0, 1) + scene.overlay().chaseBoundingBoxOutline(PonderPalette.MEDIUM, new Object(), bb.move(0, 0, 1) .contract(0, 0, .75), 65); scene.idle(75); scene.addKeyframe(); - scene.world.showSection(util.select.position(3, 3, 1), Direction.DOWN); + scene.world().showSection(util.select().position(3, 3, 1), Direction.DOWN); for (int i = 0; i < 2; i++) { scene.idle(5); - scene.world.showSection(util.select.position(3, 2 - i, 1), Direction.DOWN); + scene.world().showSection(util.select().position(3, 2 - i, 1), Direction.DOWN); } scene.idle(10); - scene.overlay.showText(50) + scene.overlay().showText(50) .text("Covering additional sides will not improve its kinetic output further") .colored(PonderPalette.RED) .placeNearTarget() - .pointAt(util.vector.blockSurface(wheel, Direction.NORTH)); + .pointAt(util.vector().blockSurface(wheel, Direction.NORTH)); scene.idle(80); scene.addKeyframe(); - ElementLink water = scene.world.makeSectionIndependent(util.select.fromTo(3, 1, 1, 3, 3, 1) - .add(util.select.fromTo(3, 3, 2, 3, 3, 3))); - scene.world.moveSection(water, util.vector.of(1, 0.5, -0.5), 15); + ElementLink water = scene.world() + .makeSectionIndependent(util.select().fromTo(3, 1, 1, 3, 3, 1) + .add(util.select().fromTo(3, 3, 2, 3, 3, 3))); + scene.world().moveSection(water, util.vector().of(1, 0.5, -0.5), 15); scene.idle(5); - scene.world.setKineticSpeed(util.select.everywhere(), 0); + scene.world().setKineticSpeed(util.select().everywhere(), 0); scene.idle(5); ItemStack crimsonPlanks = new ItemStack(Items.CRIMSON_PLANKS); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(wheel), Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(wheel), Pointing.DOWN).rightClick() .withItem(crimsonPlanks), 20); scene.idle(7); - scene.world.modifyBlockEntity(wheel, WaterWheelBlockEntity.class, be -> be.applyMaterialIfValid(crimsonPlanks)); - scene.overlay.showText(50) + scene.world().modifyBlockEntity(wheel, WaterWheelBlockEntity.class, be -> be.applyMaterialIfValid(crimsonPlanks)); + scene.overlay().showText(50) .text("Use wood planks on the wheel to change its appearance") .colored(PonderPalette.BLUE) .placeNearTarget() - .pointAt(util.vector.blockSurface(wheel, Direction.WEST)); + .pointAt(util.vector().blockSurface(wheel, Direction.WEST)); scene.idle(40); ItemStack birchPlanks = new ItemStack(Items.BIRCH_PLANKS); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(wheel), Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(wheel), Pointing.DOWN).rightClick() .withItem(birchPlanks), 20); scene.idle(7); - scene.world.modifyBlockEntity(wheel, WaterWheelBlockEntity.class, be -> be.applyMaterialIfValid(birchPlanks)); + scene.world().modifyBlockEntity(wheel, WaterWheelBlockEntity.class, be -> be.applyMaterialIfValid(birchPlanks)); scene.idle(40); ItemStack junglePlanks = new ItemStack(Items.JUNGLE_PLANKS); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(wheel), Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(wheel), Pointing.DOWN).rightClick() .withItem(junglePlanks), 20); scene.idle(7); - scene.world.modifyBlockEntity(wheel, WaterWheelBlockEntity.class, be -> be.applyMaterialIfValid(junglePlanks)); + scene.world().modifyBlockEntity(wheel, WaterWheelBlockEntity.class, be -> be.applyMaterialIfValid(junglePlanks)); scene.idle(20); - scene.world.moveSection(water, util.vector.of(-1, -0.5, 0.5), 15); + scene.world().moveSection(water, util.vector().of(-1, -0.5, 0.5), 15); scene.idle(10); - scene.world.setKineticSpeed(util.select.everywhere(), -8); - scene.effects.indicateSuccess(gaugePos); + scene.world().setKineticSpeed(util.select().everywhere(), -8); + scene.effects().indicateSuccess(gaugePos); } public static void largeWaterWheel(SceneBuilder builder, SceneBuildingUtil util) { CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("large_water_wheel", "Generating Rotational Force using Large Water Wheels"); scene.configureBasePlate(0, 0, 5); - scene.world.showSection(util.select.layer(0) - .substract(util.select.position(3, 0, 0)), Direction.UP); + scene.world().showSection(util.select().layer(0) + .substract(util.select().position(3, 0, 0)), Direction.UP); ElementLink strip = - scene.world.showIndependentSection(util.select.fromTo(1, 0, 0, 1, 0, 4), Direction.UP); - scene.world.moveSection(strip, util.vector.of(2, 0, 0), 0); + scene.world().showIndependentSection(util.select().fromTo(1, 0, 0, 1, 0, 4), Direction.UP); + scene.world().moveSection(strip, util.vector().of(2, 0, 0), 0); scene.idle(10); - scene.world.showSection(util.select.fromTo(3, 1, 3, 3, 2, 3), Direction.DOWN); - scene.world.setKineticSpeed(util.select.everywhere(), 0); + scene.world().showSection(util.select().fromTo(3, 1, 3, 3, 2, 3), Direction.DOWN); + scene.world().setKineticSpeed(util.select().everywhere(), 0); - BlockPos gaugePos = util.grid.at(1, 1, 2); + BlockPos gaugePos = util.grid().at(1, 1, 2); for (int i = 0; i < 4; i++) { scene.idle(5); if (i == 0) - scene.world.hideIndependentSection(strip, Direction.DOWN); - scene.world.showSection(util.select.position(gaugePos.east(i)), Direction.DOWN); + scene.world().hideIndependentSection(strip, Direction.DOWN); + scene.world().showSection(util.select().position(gaugePos.east(i)), Direction.DOWN); } scene.idle(10); for (int i = 0; i < 3; i++) { scene.idle(5); - scene.world.showSection(util.select.position(3, 3, 3 - i), Direction.DOWN); + scene.world().showSection(util.select().position(3, 3, 3 - i), Direction.DOWN); } - scene.world.setKineticSpeed(util.select.everywhere(), -4); - scene.effects.indicateSuccess(gaugePos); + scene.world().setKineticSpeed(util.select().everywhere(), -4); + scene.effects().indicateSuccess(gaugePos); - BlockPos wheel = util.grid.at(3, 1, 2); - scene.effects.rotationSpeedIndicator(wheel); - scene.overlay.showText(60) + BlockPos wheel = util.grid().at(3, 1, 2); + scene.effects().rotationSpeedIndicator(wheel); + scene.overlay().showText(60) .text("Large Water Wheels draw force from adjacent Water Currents") .placeNearTarget() - .pointAt(util.vector.topOf(wheel)); + .pointAt(util.vector().topOf(wheel)); scene.idle(10); AABB bb = new AABB(wheel).inflate(.125, 1, 1); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, new Object(), bb.move(0, 3, 0) + scene.overlay().chaseBoundingBoxOutline(PonderPalette.MEDIUM, new Object(), bb.move(0, 3, 0) .contract(0, 2.75, 0), 80); scene.idle(5); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, new Object(), bb.move(0, 0, -3) + scene.overlay().chaseBoundingBoxOutline(PonderPalette.MEDIUM, new Object(), bb.move(0, 0, -3) .contract(0, 0, -2.75), 75); scene.idle(5); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, new Object(), bb.move(0, -3, 0) + scene.overlay().chaseBoundingBoxOutline(PonderPalette.MEDIUM, new Object(), bb.move(0, -3, 0) .contract(0, -2.75, 0), 70); scene.idle(5); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, new Object(), bb.move(0, 0, 3) + scene.overlay().chaseBoundingBoxOutline(PonderPalette.MEDIUM, new Object(), bb.move(0, 0, 3) .contract(0, 0, 2.75), 65); scene.idle(75); scene.addKeyframe(); - scene.world.showSection(util.select.position(3, 3, 0), Direction.DOWN); + scene.world().showSection(util.select().position(3, 3, 0), Direction.DOWN); for (int i = 0; i < 3; i++) { scene.idle(5); - scene.world.showSection(util.select.position(3, 2 - i, 0), Direction.DOWN); + scene.world().showSection(util.select().position(3, 2 - i, 0), Direction.DOWN); } scene.idle(10); - scene.overlay.showText(50) + scene.overlay().showText(50) .text("Covering additional sides will not improve its kinetic output further") .colored(PonderPalette.RED) .placeNearTarget() - .pointAt(util.vector.blockSurface(wheel, Direction.NORTH)); + .pointAt(util.vector().blockSurface(wheel, Direction.NORTH)); scene.idle(80); scene.idle(10); - scene.overlay.showText(70) + scene.overlay().showText(70) .attachKeyFrame() .text("These rotate only at half the speed of regular water wheels...") .colored(PonderPalette.WHITE) .placeNearTarget() - .pointAt(util.vector.blockSurface(gaugePos, Direction.NORTH)); + .pointAt(util.vector().blockSurface(gaugePos, Direction.NORTH)); scene.idle(78); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("...but provide a substantially higher stress capacity") .colored(PonderPalette.WHITE) .placeNearTarget() - .pointAt(util.vector.blockSurface(gaugePos, Direction.WEST)); + .pointAt(util.vector().blockSurface(gaugePos, Direction.WEST)); scene.idle(80); scene.addKeyframe(); - ElementLink water = scene.world.makeSectionIndependent(util.select.fromTo(3, 0, 0, 3, 3, 0) - .add(util.select.fromTo(3, 3, 1, 3, 3, 3))); - scene.world.moveSection(water, util.vector.of(1, 0.5, -0.5), 15); + ElementLink water = scene.world() + .makeSectionIndependent(util.select().fromTo(3, 0, 0, 3, 3, 0) + .add(util.select().fromTo(3, 3, 1, 3, 3, 3))); + scene.world().moveSection(water, util.vector().of(1, 0.5, -0.5), 15); scene.idle(5); - scene.world.setKineticSpeed(util.select.everywhere(), 0); + scene.world().setKineticSpeed(util.select().everywhere(), 0); BlockPos target = wheel.south() .above(); scene.idle(5); ItemStack crimsonPlanks = new ItemStack(Items.CRIMSON_PLANKS); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(target), Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(target), Pointing.DOWN).rightClick() .withItem(crimsonPlanks), 20); scene.idle(7); - scene.world.modifyBlockEntity(wheel, WaterWheelBlockEntity.class, be -> be.applyMaterialIfValid(crimsonPlanks)); - scene.overlay.showText(50) + scene.world().modifyBlockEntity(wheel, WaterWheelBlockEntity.class, be -> be.applyMaterialIfValid(crimsonPlanks)); + scene.overlay().showText(50) .text("Use wood planks on the wheel to change its appearance") .colored(PonderPalette.BLUE) .placeNearTarget() - .pointAt(util.vector.blockSurface(target, Direction.WEST)); + .pointAt(util.vector().blockSurface(target, Direction.WEST)); scene.idle(40); ItemStack birchPlanks = new ItemStack(Items.BIRCH_PLANKS); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(target), Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(target), Pointing.DOWN).rightClick() .withItem(birchPlanks), 20); scene.idle(7); - scene.world.modifyBlockEntity(wheel, WaterWheelBlockEntity.class, be -> be.applyMaterialIfValid(birchPlanks)); + scene.world().modifyBlockEntity(wheel, WaterWheelBlockEntity.class, be -> be.applyMaterialIfValid(birchPlanks)); scene.idle(40); ItemStack junglePlanks = new ItemStack(Items.JUNGLE_PLANKS); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(target), Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(target), Pointing.DOWN).rightClick() .withItem(junglePlanks), 20); scene.idle(7); - scene.world.modifyBlockEntity(wheel, WaterWheelBlockEntity.class, be -> be.applyMaterialIfValid(junglePlanks)); + scene.world().modifyBlockEntity(wheel, WaterWheelBlockEntity.class, be -> be.applyMaterialIfValid(junglePlanks)); scene.idle(20); - scene.world.moveSection(water, util.vector.of(-1, -0.5, 0.5), 15); + scene.world().moveSection(water, util.vector().of(-1, -0.5, 0.5), 15); scene.idle(10); - scene.world.setKineticSpeed(util.select.everywhere(), -4); - scene.effects.indicateSuccess(gaugePos); + scene.world().setKineticSpeed(util.select().everywhere(), -4); + scene.effects().indicateSuccess(gaugePos); } public static void handCrank(SceneBuilder builder, SceneBuildingUtil util) { CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("hand_crank", "Generating Rotational Force using Hand Cranks"); scene.configureBasePlate(0, 0, 5); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); scene.idle(5); - BlockPos gaugePos = util.grid.at(1, 3, 3); - BlockPos handlePos = util.grid.at(2, 2, 2); - Selection handleSelect = util.select.position(handlePos); + BlockPos gaugePos = util.grid().at(1, 3, 3); + BlockPos handlePos = util.grid().at(2, 2, 2); + Selection handleSelect = util.select().position(handlePos); - scene.world.showSection(util.select.layersFrom(1) + scene.world().showSection(util.select().layersFrom(1) .substract(handleSelect), Direction.DOWN); scene.idle(10); - scene.world.showSection(handleSelect, Direction.DOWN); + scene.world().showSection(handleSelect, Direction.DOWN); scene.idle(20); - Vec3 centerOf = util.vector.centerOf(handlePos); + Vec3 centerOf = util.vector().centerOf(handlePos); Vec3 sideOf = centerOf.add(-0.5, 0, 0); - scene.overlay.showText(70) + scene.overlay().showText(70) .text("Hand Cranks can be used by players to apply rotational force manually") .placeNearTarget() .pointAt(sideOf); scene.idle(80); - scene.overlay.showControls(new InputWindowElement(centerOf, Pointing.DOWN).rightClick(), 40); + scene.overlay().showControls(new InputWindowElement(centerOf, Pointing.DOWN).rightClick(), 40); scene.idle(7); - scene.world.setKineticSpeed(util.select.everywhere(), 32); - scene.world.modifyKineticSpeed(util.select.column(1, 3), f -> f * -2); - scene.effects.rotationDirectionIndicator(handlePos); - scene.effects.indicateSuccess(gaugePos); + scene.world().setKineticSpeed(util.select().everywhere(), 32); + scene.world().modifyKineticSpeed(util.select().column(1, 3), f -> f * -2); + scene.effects().rotationDirectionIndicator(handlePos); + scene.effects().indicateSuccess(gaugePos); scene.idle(10); - scene.overlay.showText(50) + scene.overlay().showText(50) .text("Hold Right-Click to rotate it Counter-Clockwise") .attachKeyFrame() .placeNearTarget() .pointAt(sideOf); scene.idle(35); - scene.world.setKineticSpeed(util.select.everywhere(), 0); + scene.world().setKineticSpeed(util.select().everywhere(), 0); scene.idle(15); - scene.overlay.showControls(new InputWindowElement(centerOf, Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(centerOf, Pointing.DOWN).rightClick() .whileSneaking(), 40); scene.idle(7); - scene.world.setKineticSpeed(util.select.everywhere(), -32); - scene.world.modifyKineticSpeed(util.select.column(1, 3), f -> f * -2); - scene.effects.rotationDirectionIndicator(handlePos); - scene.effects.indicateSuccess(gaugePos); + scene.world().setKineticSpeed(util.select().everywhere(), -32); + scene.world().modifyKineticSpeed(util.select().column(1, 3), f -> f * -2); + scene.effects().rotationDirectionIndicator(handlePos); + scene.effects().indicateSuccess(gaugePos); scene.idle(10); - scene.overlay.showText(90) + scene.overlay().showText(90) .text("Sneak and Hold Right-Click to rotate it Clockwise") .attachKeyFrame() .placeNearTarget() .pointAt(sideOf); scene.idle(35); - scene.world.setKineticSpeed(util.select.everywhere(), 0); + scene.world().setKineticSpeed(util.select().everywhere(), 0); scene.idle(45); } @@ -929,103 +931,103 @@ public class KineticsScenes { CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("valve_handle", "Precise rotation using Valve Handles"); scene.configureBasePlate(0, 0, 5); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); scene.idle(5); - Selection armS = util.select.fromTo(3, 2, 3, 1, 2, 3); - BlockPos bearing = util.grid.at(2, 2, 2); - BlockPos valvePos = util.grid.at(2, 2, 1); - Vec3 centerOf = util.vector.centerOf(valvePos); + Selection armS = util.select().fromTo(3, 2, 3, 1, 2, 3); + BlockPos bearing = util.grid().at(2, 2, 2); + BlockPos valvePos = util.grid().at(2, 2, 1); + Vec3 centerOf = util.vector().centerOf(valvePos); Vec3 sideOf = centerOf.add(-0.5, 0, 0); Vec3 topOf = centerOf.add(0, 0.5, 0); - scene.world.showSection(util.select.fromTo(bearing, bearing.below()), Direction.DOWN); + scene.world().showSection(util.select().fromTo(bearing, bearing.below()), Direction.DOWN); scene.idle(3); - ElementLink contraption = scene.world.showIndependentSection(armS, Direction.NORTH); + ElementLink contraption = scene.world().showIndependentSection(armS, Direction.NORTH); scene.idle(3); ElementLink valve = - scene.world.showIndependentSection(util.select.position(valvePos), Direction.SOUTH); - scene.world.rotateSection(valve, 0, 0, 45, 0); + scene.world().showIndependentSection(util.select().position(valvePos), Direction.SOUTH); + scene.world().rotateSection(valve, 0, 0, 45, 0); scene.idle(20); - scene.overlay.showText(70) + scene.overlay().showText(70) .text("Valve handles can be used to rotate components by a precise angle") .placeNearTarget() .pointAt(sideOf); scene.idle(20); - scene.world.rotateSection(valve, 0, 0, 45, 15); - scene.world.rotateSection(contraption, 0, 0, 45, 15); - scene.world.rotateBearing(bearing, 45, 15); - scene.world.setKineticSpeed(util.select.everywhere(), 16); + scene.world().rotateSection(valve, 0, 0, 45, 15); + scene.world().rotateSection(contraption, 0, 0, 45, 15); + scene.world().rotateBearing(bearing, 45, 15); + scene.world().setKineticSpeed(util.select().everywhere(), 16); scene.idle(15); - scene.world.setKineticSpeed(util.select.everywhere(), 0); + scene.world().setKineticSpeed(util.select().everywhere(), 0); scene.idle(60); - Vec3 blockSurface = util.vector.centerOf(valvePos) + Vec3 blockSurface = util.vector().centerOf(valvePos) .add(0, 0, 4 / 16f); AABB point = new AABB(blockSurface, blockSurface); AABB expanded = point.inflate(1 / 8f, 1 / 8f, 1 / 16f); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.WHITE, blockSurface, point, 1); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.WHITE, blockSurface, point, 1); scene.idle(1); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.WHITE, blockSurface, expanded, 80); - scene.overlay.showControls(new InputWindowElement(blockSurface, Pointing.DOWN).rightClick(), 60); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.WHITE, blockSurface, expanded, 80); + scene.overlay().showControls(new InputWindowElement(blockSurface, Pointing.DOWN).rightClick(), 60); scene.idle(10); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("The angle can be configured on the input panel") .attachKeyFrame() .placeNearTarget() .pointAt(blockSurface); scene.idle(70); - scene.overlay.showControls(new InputWindowElement(topOf, Pointing.DOWN).rightClick(), 40); + scene.overlay().showControls(new InputWindowElement(topOf, Pointing.DOWN).rightClick(), 40); scene.idle(7); - scene.world.rotateSection(valve, 0, 0, 90, 30); - scene.world.rotateSection(contraption, 0, 0, 90, 30); - scene.world.rotateBearing(bearing, 90, 30); - scene.world.setKineticSpeed(util.select.everywhere(), 16); + scene.world().rotateSection(valve, 0, 0, 90, 30); + scene.world().rotateSection(contraption, 0, 0, 90, 30); + scene.world().rotateBearing(bearing, 90, 30); + scene.world().setKineticSpeed(util.select().everywhere(), 16); scene.idle(10); - scene.overlay.showText(40) + scene.overlay().showText(40) .text("Right-Click to activate one rotation") .attachKeyFrame() .placeNearTarget() .pointAt(sideOf); scene.idle(20); - scene.world.setKineticSpeed(util.select.everywhere(), 0); + scene.world().setKineticSpeed(util.select().everywhere(), 0); scene.idle(25); - scene.overlay.showControls(new InputWindowElement(topOf, Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(topOf, Pointing.DOWN).rightClick() .whileSneaking(), 40); scene.idle(7); - scene.world.rotateSection(valve, 0, 0, -90, 30); - scene.world.rotateSection(contraption, 0, 0, -90, 30); - scene.world.rotateBearing(bearing, -90, 30); - scene.world.setKineticSpeed(util.select.everywhere(), -16); + scene.world().rotateSection(valve, 0, 0, -90, 30); + scene.world().rotateSection(contraption, 0, 0, -90, 30); + scene.world().rotateBearing(bearing, -90, 30); + scene.world().setKineticSpeed(util.select().everywhere(), -16); scene.idle(10); - scene.overlay.showText(50) + scene.overlay().showText(50) .text("Sneak-Right-Click to activate it in the opposite direction") .placeNearTarget() .pointAt(sideOf); scene.idle(15); - scene.world.setKineticSpeed(util.select.everywhere(), 0); + scene.world().setKineticSpeed(util.select().everywhere(), 0); scene.idle(40); - blockSurface = util.vector.topOf(bearing) + blockSurface = util.vector().topOf(bearing) .add(0, 0, -1 / 8f); point = new AABB(blockSurface, blockSurface); expanded = point.inflate(1 / 8f, 0, 1 / 8f); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.WHITE, blockSurface, point, 1); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.WHITE, blockSurface, point, 1); scene.idle(1); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.WHITE, blockSurface, expanded, 80); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.WHITE, blockSurface, expanded, 80); scene.idle(10); - scene.overlay.showText(70) + scene.overlay().showText(70) .text("Mind that Bearings have to be specifically told not to disassemble") .placeNearTarget() .pointAt(blockSurface); @@ -1033,14 +1035,14 @@ public class KineticsScenes { scene.idle(90); scene.addKeyframe(); - scene.overlay.showControls(new InputWindowElement(topOf, Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(topOf, Pointing.DOWN).rightClick() .withItem(new ItemStack(Items.BLUE_DYE)), 40); scene.idle(7); - scene.world.modifyBlock(valvePos, s -> AllBlocks.DYED_VALVE_HANDLES.get(DyeColor.BLUE) + scene.world().modifyBlock(valvePos, s -> AllBlocks.DYED_VALVE_HANDLES.get(DyeColor.BLUE) .getDefaultState() .setValue(ValveHandleBlock.FACING, Direction.NORTH), true); scene.idle(10); - scene.overlay.showText(70) + scene.overlay().showText(70) .text("Valve handles can be dyed for aesthetic purposes") .placeNearTarget() .colored(PonderPalette.BLUE) @@ -1054,39 +1056,39 @@ public class KineticsScenes { scene.configureBasePlate(1, 0, 5); scene.showBasePlate(); - Selection redstone = util.select.fromTo(3, 1, 0, 3, 1, 1); + Selection redstone = util.select().fromTo(3, 1, 0, 3, 1, 1); - scene.world.showSection(util.select.position(6, 0, 3) + scene.world().showSection(util.select().position(6, 0, 3) .add(redstone), Direction.UP); scene.idle(5); - scene.world.showSection(util.select.fromTo(6, 1, 2, 4, 1, 2), Direction.DOWN); + scene.world().showSection(util.select().fromTo(6, 1, 2, 4, 1, 2), Direction.DOWN); - BlockPos gearshiftPos = util.grid.at(3, 1, 2); - Selection gearshiftSelection = util.select.position(gearshiftPos); - BlockPos bearingPos = util.grid.at(1, 1, 2); - BlockPos buttonPos = util.grid.at(3, 1, 0); - Selection outputKinetics = util.select.fromTo(3, 1, 2, 1, 1, 2); + BlockPos gearshiftPos = util.grid().at(3, 1, 2); + Selection gearshiftSelection = util.select().position(gearshiftPos); + BlockPos bearingPos = util.grid().at(1, 1, 2); + BlockPos buttonPos = util.grid().at(3, 1, 0); + Selection outputKinetics = util.select().fromTo(3, 1, 2, 1, 1, 2); - scene.world.setKineticSpeed(gearshiftSelection, 0); + scene.world().setKineticSpeed(gearshiftSelection, 0); scene.idle(10); - scene.world.showSection(gearshiftSelection, Direction.DOWN); + scene.world().showSection(gearshiftSelection, Direction.DOWN); scene.idle(10); - scene.world.showSection(util.select.fromTo(2, 1, 2, 1, 1, 2), Direction.EAST); + scene.world().showSection(util.select().fromTo(2, 1, 2, 1, 1, 2), Direction.EAST); scene.idle(10); - Vec3 top = util.vector.topOf(gearshiftPos); - scene.overlay.showText(60) + Vec3 top = util.vector().topOf(gearshiftPos); + scene.overlay().showText(60) .text("Seq. Gearshifts relay rotation by following a timed list of instructions") .attachKeyFrame() .pointAt(top) .placeNearTarget(); scene.idle(80); - scene.overlay.showControls(new InputWindowElement(top, Pointing.DOWN).rightClick(), 40); + scene.overlay().showControls(new InputWindowElement(top, Pointing.DOWN).rightClick(), 40); scene.idle(7); - scene.overlay.showSelectionWithText(gearshiftSelection, 50) + scene.overlay().showSelectionWithText(gearshiftSelection, 50) .colored(PonderPalette.BLUE) .text("Right-click it to open the Configuration UI") .pointAt(top) @@ -1094,163 +1096,163 @@ public class KineticsScenes { scene.idle(60); ElementLink contraption = - scene.world.showIndependentSection(util.select.fromTo(0, 3, 2, 0, 0, 2), Direction.EAST); - scene.world.configureCenterOfRotation(contraption, util.vector.centerOf(bearingPos)); + scene.world().showIndependentSection(util.select().fromTo(0, 3, 2, 0, 0, 2), Direction.EAST); + scene.world().configureCenterOfRotation(contraption, util.vector().centerOf(bearingPos)); scene.idle(20); - scene.world.toggleRedstonePower(redstone); - scene.effects.indicateRedstone(buttonPos); - scene.world.cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); - scene.world.setKineticSpeed(outputKinetics, 16); - scene.world.rotateBearing(bearingPos, 90, 40); - scene.world.rotateSection(contraption, 90, 0, 0, 40); - scene.effects.rotationDirectionIndicator(gearshiftPos.west()); + scene.world().toggleRedstonePower(redstone); + scene.effects().indicateRedstone(buttonPos); + scene.world().cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); + scene.world().setKineticSpeed(outputKinetics, 16); + scene.world().rotateBearing(bearingPos, 90, 40); + scene.world().rotateSection(contraption, 90, 0, 0, 40); + scene.effects().rotationDirectionIndicator(gearshiftPos.west()); scene.idle(20); - scene.world.toggleRedstonePower(redstone); + scene.world().toggleRedstonePower(redstone); scene.idle(20); - scene.overlay.showText(80) + scene.overlay().showText(80) .text("Upon receiving a Redstone Signal, it will start running its configured sequence") .attachKeyFrame() .pointAt(top); - scene.world.cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); - scene.world.setKineticSpeed(outputKinetics, -32); - scene.world.rotateBearing(bearingPos, -180, 40); - scene.world.rotateSection(contraption, -180, 0, 0, 40); - scene.effects.rotationDirectionIndicator(gearshiftPos.west()); + scene.world().cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); + scene.world().setKineticSpeed(outputKinetics, -32); + scene.world().rotateBearing(bearingPos, -180, 40); + scene.world().rotateSection(contraption, -180, 0, 0, 40); + scene.effects().rotationDirectionIndicator(gearshiftPos.west()); scene.idle(40); - scene.world.cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); - scene.world.setKineticSpeed(outputKinetics, 0); + scene.world().cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); + scene.world().setKineticSpeed(outputKinetics, 0); scene.idle(20); - scene.world.cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); - scene.world.setKineticSpeed(outputKinetics, 16); - scene.world.rotateBearing(bearingPos, 90, 40); - scene.world.rotateSection(contraption, 90, 0, 0, 40); - scene.effects.rotationDirectionIndicator(gearshiftPos.west()); + scene.world().cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); + scene.world().setKineticSpeed(outputKinetics, 16); + scene.world().rotateBearing(bearingPos, 90, 40); + scene.world().rotateSection(contraption, 90, 0, 0, 40); + scene.effects().rotationDirectionIndicator(gearshiftPos.west()); scene.idle(40); - scene.world.cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); - scene.world.cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); - scene.world.setKineticSpeed(outputKinetics, 0); + scene.world().cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); + scene.world().cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); + scene.world().setKineticSpeed(outputKinetics, 0); scene.idle(20); - scene.overlay.showText(70) + scene.overlay().showText(70) .text("Once finished, it waits for the next Redstone Signal and starts over") - .pointAt(util.vector.topOf(util.grid.at(3, 0, 1))); + .pointAt(util.vector().topOf(util.grid().at(3, 0, 1))); scene.idle(80); scene.idle(20); - scene.world.toggleRedstonePower(redstone); - scene.effects.indicateRedstone(buttonPos); + scene.world().toggleRedstonePower(redstone); + scene.effects().indicateRedstone(buttonPos); - scene.world.cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); - scene.world.setKineticSpeed(outputKinetics, 16); - scene.world.rotateBearing(bearingPos, 90, 40); - scene.world.rotateSection(contraption, 90, 0, 0, 40); - scene.effects.rotationDirectionIndicator(gearshiftPos.west()); + scene.world().cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); + scene.world().setKineticSpeed(outputKinetics, 16); + scene.world().rotateBearing(bearingPos, 90, 40); + scene.world().rotateSection(contraption, 90, 0, 0, 40); + scene.effects().rotationDirectionIndicator(gearshiftPos.west()); scene.idle(20); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("A redstone comparator can be used to read the current progress") .attachKeyFrame() - .pointAt(util.vector.topOf(util.grid.at(3, 0, 1))); + .pointAt(util.vector().topOf(util.grid().at(3, 0, 1))); - scene.world.hideSection(redstone, Direction.NORTH); + scene.world().hideSection(redstone, Direction.NORTH); scene.idle(15); - BlockPos wire = util.grid.at(5, 1, 0); - Selection nixie = util.select.position(4, 1, 0); - scene.world.cycleBlockProperty(util.grid.at(4, 1, 0), NixieTubeBlock.FACING); - scene.world.cycleBlockProperty(util.grid.at(4, 1, 0), NixieTubeBlock.FACING); + BlockPos wire = util.grid().at(5, 1, 0); + Selection nixie = util.select().position(4, 1, 0); + scene.world().cycleBlockProperty(util.grid().at(4, 1, 0), NixieTubeBlock.FACING); + scene.world().cycleBlockProperty(util.grid().at(4, 1, 0), NixieTubeBlock.FACING); ElementLink comparator = - scene.world.showIndependentSection(util.select.fromTo(5, 1, 1, 4, 1, 0), Direction.SOUTH); - scene.world.moveSection(comparator, util.vector.of(-2, 0, 0), 0); - scene.world.toggleRedstonePower(util.select.position(5, 1, 1)); - scene.world.cycleBlockProperty(wire, RedStoneWireBlock.POWER); - scene.world.modifyBlockEntityNBT(nixie, NixieTubeBlockEntity.class, nbt -> nbt.putInt("RedstoneStrength", 1)); + scene.world().showIndependentSection(util.select().fromTo(5, 1, 1, 4, 1, 0), Direction.SOUTH); + scene.world().moveSection(comparator, util.vector().of(-2, 0, 0), 0); + scene.world().toggleRedstonePower(util.select().position(5, 1, 1)); + scene.world().cycleBlockProperty(wire, RedStoneWireBlock.POWER); + scene.world().modifyBlockEntityNBT(nixie, NixieTubeBlockEntity.class, nbt -> nbt.putInt("RedstoneStrength", 1)); scene.idle(5); - scene.world.cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); - scene.world.setKineticSpeed(outputKinetics, -32); - scene.world.rotateBearing(bearingPos, -180, 40); - scene.world.rotateSection(contraption, -180, 0, 0, 40); - scene.effects.rotationDirectionIndicator(gearshiftPos.west()); - scene.world.cycleBlockProperty(wire, RedStoneWireBlock.POWER); - scene.world.modifyBlockEntityNBT(nixie, NixieTubeBlockEntity.class, nbt -> nbt.putInt("RedstoneStrength", 2)); + scene.world().cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); + scene.world().setKineticSpeed(outputKinetics, -32); + scene.world().rotateBearing(bearingPos, -180, 40); + scene.world().rotateSection(contraption, -180, 0, 0, 40); + scene.effects().rotationDirectionIndicator(gearshiftPos.west()); + scene.world().cycleBlockProperty(wire, RedStoneWireBlock.POWER); + scene.world().modifyBlockEntityNBT(nixie, NixieTubeBlockEntity.class, nbt -> nbt.putInt("RedstoneStrength", 2)); scene.idle(40); - scene.world.cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); - scene.world.setKineticSpeed(outputKinetics, 0); - scene.world.cycleBlockProperty(wire, RedStoneWireBlock.POWER); - scene.world.modifyBlockEntityNBT(nixie, NixieTubeBlockEntity.class, nbt -> nbt.putInt("RedstoneStrength", 3)); + scene.world().cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); + scene.world().setKineticSpeed(outputKinetics, 0); + scene.world().cycleBlockProperty(wire, RedStoneWireBlock.POWER); + scene.world().modifyBlockEntityNBT(nixie, NixieTubeBlockEntity.class, nbt -> nbt.putInt("RedstoneStrength", 3)); scene.idle(20); - scene.world.cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); - scene.world.setKineticSpeed(outputKinetics, 16); - scene.world.rotateBearing(bearingPos, 90, 40); - scene.world.rotateSection(contraption, 90, 0, 0, 40); - scene.effects.rotationDirectionIndicator(gearshiftPos.west()); - scene.world.cycleBlockProperty(wire, RedStoneWireBlock.POWER); - scene.world.modifyBlockEntityNBT(nixie, NixieTubeBlockEntity.class, nbt -> nbt.putInt("RedstoneStrength", 4)); + scene.world().cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); + scene.world().setKineticSpeed(outputKinetics, 16); + scene.world().rotateBearing(bearingPos, 90, 40); + scene.world().rotateSection(contraption, 90, 0, 0, 40); + scene.effects().rotationDirectionIndicator(gearshiftPos.west()); + scene.world().cycleBlockProperty(wire, RedStoneWireBlock.POWER); + scene.world().modifyBlockEntityNBT(nixie, NixieTubeBlockEntity.class, nbt -> nbt.putInt("RedstoneStrength", 4)); scene.idle(40); - scene.world.cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); - scene.world.cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); - scene.world.modifyBlock(wire, s -> s.setValue(RedStoneWireBlock.POWER, 0), false); - scene.world.toggleRedstonePower(util.select.position(5, 1, 1)); - scene.world.modifyBlockEntityNBT(nixie, NixieTubeBlockEntity.class, nbt -> nbt.putInt("RedstoneStrength", 0)); - scene.world.setKineticSpeed(outputKinetics, 0); + scene.world().cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); + scene.world().cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); + scene.world().modifyBlock(wire, s -> s.setValue(RedStoneWireBlock.POWER, 0), false); + scene.world().toggleRedstonePower(util.select().position(5, 1, 1)); + scene.world().modifyBlockEntityNBT(nixie, NixieTubeBlockEntity.class, nbt -> nbt.putInt("RedstoneStrength", 0)); + scene.world().setKineticSpeed(outputKinetics, 0); } public static void speedController(SceneBuilder builder, SceneBuildingUtil util) { CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("rotation_speed_controller", "Using the Rotational Speed Controller"); scene.configureBasePlate(0, 0, 5); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); scene.idle(5); - BlockPos cogPos = util.grid.at(1, 2, 1); - Selection gaugeSelect = util.select.position(1, 2, 3); + BlockPos cogPos = util.grid().at(1, 2, 1); + Selection gaugeSelect = util.select().position(1, 2, 3); - scene.world.multiplyKineticSpeed(util.select.everywhere(), 0.5f); - scene.world.setKineticSpeed(gaugeSelect, 0); - scene.world.showSection(util.select.fromTo(5, 1, 1, 2, 1, 1), Direction.DOWN); - scene.world.showSection(util.select.fromTo(1, 1, 3, 1, 2, 3), Direction.DOWN); + scene.world().multiplyKineticSpeed(util.select().everywhere(), 0.5f); + scene.world().setKineticSpeed(gaugeSelect, 0); + scene.world().showSection(util.select().fromTo(5, 1, 1, 2, 1, 1), Direction.DOWN); + scene.world().showSection(util.select().fromTo(1, 1, 3, 1, 2, 3), Direction.DOWN); scene.idle(10); ElementLink rsc = - scene.world.showIndependentSection(util.select.position(0, 1, 1), Direction.DOWN); - scene.world.moveSection(rsc, util.vector.of(1, 0, 0), 0); + scene.world().showIndependentSection(util.select().position(0, 1, 1), Direction.DOWN); + scene.world().moveSection(rsc, util.vector().of(1, 0, 0), 0); ElementLink rsc2 = - scene.world.showIndependentSection(util.select.position(1, 1, 1), Direction.DOWN); - scene.world.moveSection(rsc2, util.vector.of(0, -100, 0), 0); + scene.world().showIndependentSection(util.select().position(1, 1, 1), Direction.DOWN); + scene.world().moveSection(rsc2, util.vector().of(0, -100, 0), 0); scene.idle(10); - scene.world.showSection(util.select.position(1, 2, 1), Direction.DOWN); + scene.world().showSection(util.select().position(1, 2, 1), Direction.DOWN); scene.idle(15); - scene.effects.indicateSuccess(cogPos); - scene.world.moveSection(rsc2, util.vector.of(0, 100, 0), 0); - scene.world.moveSection(rsc, util.vector.of(0, -100, 0), 0); + scene.effects().indicateSuccess(cogPos); + scene.world().moveSection(rsc2, util.vector().of(0, 100, 0), 0); + scene.world().moveSection(rsc, util.vector().of(0, -100, 0), 0); scene.idle(5); - scene.world.showSection(util.select.position(1, 2, 2), Direction.DOWN); + scene.world().showSection(util.select().position(1, 2, 2), Direction.DOWN); scene.idle(10); - scene.world.setKineticSpeed(gaugeSelect, 8); - scene.effects.indicateSuccess(util.grid.at(1, 2, 3)); + scene.world().setKineticSpeed(gaugeSelect, 8); + scene.effects().indicateSuccess(util.grid().at(1, 2, 3)); - scene.overlay.showText(90) + scene.overlay().showText(90) .placeNearTarget() .attachKeyFrame() - .pointAt(util.vector.blockSurface(cogPos, Direction.NORTH)) + .pointAt(util.vector().blockSurface(cogPos, Direction.NORTH)) .text("Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them"); scene.idle(100); - Vec3 inputVec = util.vector.of(1.5, 1.75 - 1 / 16f, 1); - scene.overlay.showFilterSlotInput(inputVec, Direction.NORTH, 60); + Vec3 inputVec = util.vector().of(1.5, 1.75 - 1 / 16f, 1); + scene.overlay().showFilterSlotInput(inputVec, Direction.NORTH, 60); - scene.overlay.showText(70) + scene.overlay().showText(70) .placeNearTarget() .attachKeyFrame() .pointAt(inputVec) @@ -1258,23 +1260,23 @@ public class KineticsScenes { scene.idle(80); InputWindowElement input = new InputWindowElement(inputVec, Pointing.UP).rightClick(); - scene.overlay.showControls(input, 40); + scene.overlay().showControls(input, 40); scene.idle(15); - scene.world.multiplyKineticSpeed(util.select.fromTo(1, 2, 1, 1, 2, 3), 4); - scene.effects.rotationSpeedIndicator(cogPos); + scene.world().multiplyKineticSpeed(util.select().fromTo(1, 2, 1, 1, 2, 3), 4); + scene.effects().rotationSpeedIndicator(cogPos); scene.idle(55); scene.markAsFinished(); - scene.overlay.showControls(input, 30); + scene.overlay().showControls(input, 30); scene.idle(15); - scene.world.multiplyKineticSpeed(util.select.fromTo(1, 2, 1, 1, 2, 3), 4); - scene.effects.rotationSpeedIndicator(cogPos); + scene.world().multiplyKineticSpeed(util.select().fromTo(1, 2, 1, 1, 2, 3), 4); + scene.effects().rotationSpeedIndicator(cogPos); scene.idle(55); - scene.overlay.showControls(input, 30); + scene.overlay().showControls(input, 30); scene.idle(15); - scene.world.multiplyKineticSpeed(util.select.fromTo(1, 2, 1, 1, 2, 3), -.05f); - scene.effects.rotationSpeedIndicator(cogPos); + scene.world().multiplyKineticSpeed(util.select().fromTo(1, 2, 1, 1, 2, 3), -.05f); + scene.effects().rotationSpeedIndicator(cogPos); scene.idle(35); } @@ -1293,60 +1295,60 @@ public class KineticsScenes { scene.title(speed ? "speedometer" : "stressometer", title); scene.configureBasePlate(1, 0, 5); - BlockPos gaugePos = util.grid.at(2, 1, 3); + BlockPos gaugePos = util.grid().at(2, 1, 3); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); scene.idle(5); for (int x = 6; x >= 0; x--) { scene.idle(2); - scene.world.showSection(util.select.position(x, 1, 3), Direction.DOWN); + scene.world().showSection(util.select().position(x, 1, 3), Direction.DOWN); } scene.idle(10); - scene.world.setBlock(gaugePos, (speed ? AllBlocks.SPEEDOMETER : AllBlocks.STRESSOMETER).getDefaultState() + scene.world().setBlock(gaugePos, (speed ? AllBlocks.SPEEDOMETER : AllBlocks.STRESSOMETER).getDefaultState() .setValue(GaugeBlock.FACING, Direction.UP), true); - scene.world.setKineticSpeed(util.select.position(gaugePos), 32); + scene.world().setKineticSpeed(util.select().position(gaugePos), 32); scene.idle(10); - scene.overlay.showText(80) + scene.overlay().showText(80) .text("The " + component + " displays the current " + (speed ? "Speed" : "Stress Capacity") + (speed ? " of attached components" : " of the attached kinetic network")) .attachKeyFrame() - .pointAt(util.vector.topOf(gaugePos)) + .pointAt(util.vector().topOf(gaugePos)) .placeNearTarget(); scene.idle(90); if (speed) { - scene.world.multiplyKineticSpeed(util.select.everywhere(), 4); - scene.effects.rotationSpeedIndicator(util.grid.at(6, 1, 3)); + scene.world().multiplyKineticSpeed(util.select().everywhere(), 4); + scene.effects().rotationSpeedIndicator(util.grid().at(6, 1, 3)); scene.idle(5); - scene.effects.indicateSuccess(gaugePos); + scene.effects().indicateSuccess(gaugePos); } else { BlockState state = AllBlocks.CRUSHING_WHEEL.getDefaultState() .setValue(CrushingWheelBlock.AXIS, Axis.X); - scene.world.setBlock(util.grid.at(5, 1, 3), state, true); - scene.world.setKineticSpeed(util.select.position(5, 1, 3), 32); - scene.world.modifyBlockEntityNBT(util.select.position(gaugePos), StressGaugeBlockEntity.class, + scene.world().setBlock(util.grid().at(5, 1, 3), state, true); + scene.world().setKineticSpeed(util.select().position(5, 1, 3), 32); + scene.world().modifyBlockEntityNBT(util.select().position(gaugePos), StressGaugeBlockEntity.class, nbt -> nbt.putFloat("Value", .5f)); - scene.effects.indicateRedstone(gaugePos); + scene.effects().indicateRedstone(gaugePos); scene.idle(20); - scene.world.setBlock(util.grid.at(4, 1, 3), state, true); - scene.world.setKineticSpeed(util.select.position(4, 1, 3), 32); - scene.world.modifyBlockEntityNBT(util.select.position(gaugePos), StressGaugeBlockEntity.class, + scene.world().setBlock(util.grid().at(4, 1, 3), state, true); + scene.world().setKineticSpeed(util.select().position(4, 1, 3), 32); + scene.world().modifyBlockEntityNBT(util.select().position(gaugePos), StressGaugeBlockEntity.class, nbt -> nbt.putFloat("Value", .9f)); - scene.effects.indicateRedstone(gaugePos); + scene.effects().indicateRedstone(gaugePos); scene.idle(10); } scene.idle(30); - Vec3 blockSurface = util.vector.blockSurface(gaugePos, Direction.NORTH); - scene.overlay.showControls( + Vec3 blockSurface = util.vector().blockSurface(gaugePos, Direction.NORTH); + scene.overlay().showControls( new InputWindowElement(blockSurface, Pointing.RIGHT).withItem(AllItems.GOGGLES.asStack()), 80); scene.idle(7); - scene.overlay.showText(80) + scene.overlay().showText(80) .text("When wearing Engineers' Goggles, the player can get more detailed information from the Gauge") .attachKeyFrame() .colored(PonderPalette.MEDIUM) @@ -1354,18 +1356,18 @@ public class KineticsScenes { .placeNearTarget(); scene.idle(100); - Selection comparator = util.select.fromTo(2, 1, 1, 2, 1, 2); - scene.world.showSection(comparator, Direction.SOUTH); + Selection comparator = util.select().fromTo(2, 1, 1, 2, 1, 2); + scene.world().showSection(comparator, Direction.SOUTH); scene.idle(10); - scene.world.toggleRedstonePower(comparator); - scene.effects.indicateRedstone(util.grid.at(2, 1, 2)); + scene.world().toggleRedstonePower(comparator); + scene.effects().indicateRedstone(util.grid().at(2, 1, 2)); scene.idle(20); - scene.overlay.showText(120) + scene.overlay().showText(120) .text("Comparators can emit analog Restone Signals relative to the " + component + "'s measurements") .attachKeyFrame() .colored(PonderPalette.RED) - .pointAt(util.vector.centerOf(2, 1, 2) + .pointAt(util.vector().centerOf(2, 1, 2) .add(0, -0.35, 0)) .placeNearTarget(); scene.idle(130); @@ -1374,57 +1376,58 @@ public class KineticsScenes { public static void creativeMotorMojang(SceneBuilder scene, SceneBuildingUtil util) { scene.title("creative_motor_mojang", "Mojang's Enigma"); + scene.setNextUpEnabled(false); scene.configureBasePlate(0, 0, 15); scene.scaleSceneView(.55f); scene.showBasePlate(); scene.idle(15); - scene.world.showSection(util.select.fromTo(12, 1, 7, 12, 1, 2), Direction.WEST); + scene.world().showSection(util.select().fromTo(12, 1, 7, 12, 1, 2), Direction.WEST); scene.idle(3); - scene.world.showSection(util.select.fromTo(5, 1, 2, 7, 2, 1), Direction.EAST); + scene.world().showSection(util.select().fromTo(5, 1, 2, 7, 2, 1), Direction.EAST); scene.idle(3); - scene.world.showSection(util.select.fromTo(7, 1, 3, 7, 1, 8), Direction.NORTH); + scene.world().showSection(util.select().fromTo(7, 1, 3, 7, 1, 8), Direction.NORTH); scene.idle(3); - scene.world.showSection(util.select.position(7, 2, 8), Direction.DOWN); + scene.world().showSection(util.select().position(7, 2, 8), Direction.DOWN); scene.idle(3); - scene.world.showSection(util.select.position(4, 1, 4), Direction.DOWN); + scene.world().showSection(util.select().position(4, 1, 4), Direction.DOWN); scene.idle(3); - scene.world.showSection(util.select.position(4, 1, 6), Direction.DOWN); + scene.world().showSection(util.select().position(4, 1, 6), Direction.DOWN); scene.idle(3); - scene.world.showSection(util.select.position(3, 1, 10), Direction.SOUTH); + scene.world().showSection(util.select().position(3, 1, 10), Direction.SOUTH); scene.idle(3); - scene.world.showSection(util.select.position(1, 1, 11), Direction.EAST); + scene.world().showSection(util.select().position(1, 1, 11), Direction.EAST); scene.idle(3); - scene.world.showSection(util.select.position(11, 1, 3), Direction.DOWN); + scene.world().showSection(util.select().position(11, 1, 3), Direction.DOWN); scene.idle(3); - scene.world.showSection(util.select.fromTo(11, 2, 3, 11, 2, 7), Direction.NORTH); + scene.world().showSection(util.select().fromTo(11, 2, 3, 11, 2, 7), Direction.NORTH); scene.idle(3); - scene.world.showSection(util.select.fromTo(8, 1, 2, 10, 1, 2), Direction.DOWN); + scene.world().showSection(util.select().fromTo(8, 1, 2, 10, 1, 2), Direction.DOWN); scene.idle(3); - scene.world.showSection(util.select.position(11, 1, 2), Direction.SOUTH); + scene.world().showSection(util.select().position(11, 1, 2), Direction.SOUTH); scene.idle(3); - scene.world.showSection(util.select.fromTo(6, 1, 8, 5, 1, 8), Direction.EAST); + scene.world().showSection(util.select().fromTo(6, 1, 8, 5, 1, 8), Direction.EAST); scene.rotateCameraY(-90); scene.idle(3); - scene.world.showSection(util.select.position(12, 1, 10), Direction.DOWN); + scene.world().showSection(util.select().position(12, 1, 10), Direction.DOWN); scene.idle(3); - scene.world.showSection(util.select.position(11, 1, 12), Direction.DOWN); + scene.world().showSection(util.select().position(11, 1, 12), Direction.DOWN); scene.idle(3); - scene.world.showSection(util.select.fromTo(8, 1, 8, 11, 1, 8), Direction.WEST); + scene.world().showSection(util.select().fromTo(8, 1, 8, 11, 1, 8), Direction.WEST); scene.idle(3); - scene.world.showSection(util.select.fromTo(5, 2, 8, 5, 3, 8), Direction.DOWN); + scene.world().showSection(util.select().fromTo(5, 2, 8, 5, 3, 8), Direction.DOWN); scene.idle(3); - scene.world.showSection(util.select.fromTo(8, 1, 5, 8, 2, 7), Direction.WEST); + scene.world().showSection(util.select().fromTo(8, 1, 5, 8, 2, 7), Direction.WEST); scene.idle(3); - scene.world.showSection(util.select.fromTo(7, 3, 9, 8, 3, 8), Direction.UP); + scene.world().showSection(util.select().fromTo(7, 3, 9, 8, 3, 8), Direction.UP); scene.idle(3); - scene.world.showSection(util.select.fromTo(6, 3, 7, 9, 3, 7) - .add(util.select.fromTo(6, 3, 8, 6, 3, 10)) - .add(util.select.fromTo(7, 3, 10, 9, 3, 10)) - .add(util.select.fromTo(9, 3, 7, 9, 3, 9)), Direction.DOWN); + scene.world().showSection(util.select().fromTo(6, 3, 7, 9, 3, 7) + .add(util.select().fromTo(6, 3, 8, 6, 3, 10)) + .add(util.select().fromTo(7, 3, 10, 9, 3, 10)) + .add(util.select().fromTo(9, 3, 7, 9, 3, 9)), Direction.DOWN); scene.idle(3); - scene.world.showSection(util.select.fromTo(10, 4, 7, 6, 4, 10), Direction.DOWN); + scene.world().showSection(util.select().fromTo(10, 4, 7, 6, 4, 10), Direction.DOWN); scene.idle(3); - scene.world.showSection(util.select.fromTo(8, 1, 13, 8, 2, 11), Direction.NORTH); + scene.world().showSection(util.select().fromTo(8, 1, 13, 8, 2, 11), Direction.NORTH); scene.idle(3); scene.idle(20); } diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/MechanicalDrillScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/MechanicalDrillScenes.java index f875310234..4e95a70250 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/MechanicalDrillScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/MechanicalDrillScenes.java @@ -3,9 +3,9 @@ package com.simibubi.create.infrastructure.ponder.scenes; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; import net.createmod.ponder.foundation.ElementLink; -import net.createmod.ponder.foundation.SceneBuilder; -import net.createmod.ponder.foundation.SceneBuildingUtil; import net.createmod.ponder.foundation.Selection; import net.createmod.ponder.foundation.element.EntityElement; import net.createmod.ponder.foundation.element.InputWindowElement; @@ -26,60 +26,60 @@ public class MechanicalDrillScenes { scene.title("mechanical_drill", "Breaking Blocks with the Mechanical Drill"); scene.configureBasePlate(0, 0, 5); - scene.world.setKineticSpeed(util.select.layer(0), -8); - scene.world.setKineticSpeed(util.select.layer(1), 16); + scene.world().setKineticSpeed(util.select().layer(0), -8); + scene.world().setKineticSpeed(util.select().layer(1), 16); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); scene.idle(5); - scene.world.showSection(util.select.fromTo(4, 1, 2, 5, 1, 2), Direction.DOWN); + scene.world().showSection(util.select().fromTo(4, 1, 2, 5, 1, 2), Direction.DOWN); scene.idle(10); - scene.world.showSection(util.select.position(3, 1, 2), Direction.EAST); + scene.world().showSection(util.select().position(3, 1, 2), Direction.EAST); scene.idle(20); - BlockPos breakingPos = util.grid.at(2, 1, 2); + BlockPos breakingPos = util.grid().at(2, 1, 2); - scene.world.showSection(util.select.position(2, 1, 2), Direction.DOWN); + scene.world().showSection(util.select().position(2, 1, 2), Direction.DOWN); scene.idle(5); for (int i = 0; i < 10; i++) { scene.idle(10); - scene.world.incrementBlockBreakingProgress(breakingPos); + scene.world().incrementBlockBreakingProgress(breakingPos); if (i == 1) { - scene.overlay.showText(80) + scene.overlay().showText(80) .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.topOf(breakingPos)) + .pointAt(util.vector().topOf(breakingPos)) .text("When given Rotational Force, a Mechanical Drill will break blocks directly in front of it"); } } - scene.world.hideSection(util.select.position(breakingPos), Direction.UP); - ElementLink plankEntity = scene.world.createItemEntity(util.vector.centerOf(breakingPos), - util.vector.of(0, .1f, 0), new ItemStack(Items.OAK_PLANKS)); + scene.world().hideSection(util.select().position(breakingPos), Direction.UP); + ElementLink plankEntity = scene.world().createItemEntity(util.vector().centerOf(breakingPos), + util.vector().of(0, .1f, 0), new ItemStack(Items.OAK_PLANKS)); scene.idle(20); scene.idle(15); - scene.world.modifyEntity(plankEntity, Entity::discard); - scene.world.modifyKineticSpeed(util.select.everywhere(), f -> 4 * f); - scene.effects.rotationSpeedIndicator(breakingPos.east(3)); + scene.world().modifyEntity(plankEntity, Entity::discard); + scene.world().modifyKineticSpeed(util.select().everywhere(), f -> 4 * f); + scene.effects().rotationSpeedIndicator(breakingPos.east(3)); scene.idle(5); - scene.world.setBlock(breakingPos, Blocks.OAK_PLANKS.defaultBlockState(), false); - scene.world.showSection(util.select.position(breakingPos), Direction.DOWN); + scene.world().setBlock(breakingPos, Blocks.OAK_PLANKS.defaultBlockState(), false); + scene.world().showSection(util.select().position(breakingPos), Direction.DOWN); scene.idle(5); for (int i = 0; i < 10; i++) { scene.idle(3); - scene.world.incrementBlockBreakingProgress(breakingPos); + scene.world().incrementBlockBreakingProgress(breakingPos); if (i == 2) { - scene.overlay.showText(80) + scene.overlay().showText(80) .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.topOf(breakingPos.east())) + .pointAt(util.vector().topOf(breakingPos.east())) .text("Its mining speed depends on the Rotational Input"); } } - scene.world.createItemEntity(util.vector.centerOf(breakingPos), util.vector.of(0, .1f, 0), - new ItemStack(Items.OAK_PLANKS)); + scene.world().createItemEntity(util.vector().centerOf(breakingPos), util.vector().of(0, .1f, 0), + new ItemStack(Items.OAK_PLANKS)); scene.idle(50); } @@ -87,119 +87,119 @@ public class MechanicalDrillScenes { CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("mechanical_drill_contraption", "Using Mechanical Drills on Contraptions"); scene.configureBasePlate(0, 0, 6); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); - Selection kinetics = util.select.fromTo(5, 1, 2, 5, 1, 6); + Selection kinetics = util.select().fromTo(5, 1, 2, 5, 1, 6); scene.idle(5); ElementLink pistonHead = - scene.world.showIndependentSection(util.select.fromTo(5, 1, 1, 7, 1, 1), Direction.DOWN); - scene.world.moveSection(pistonHead, util.vector.of(0, 0, 1), 0); - scene.world.showSection(kinetics, Direction.DOWN); + scene.world().showIndependentSection(util.select().fromTo(5, 1, 1, 7, 1, 1), Direction.DOWN); + scene.world().moveSection(pistonHead, util.vector().of(0, 0, 1), 0); + scene.world().showSection(kinetics, Direction.DOWN); scene.idle(5); ElementLink contraption = - scene.world.showIndependentSection(util.select.fromTo(4, 2, 3, 4, 1, 2), Direction.DOWN); + scene.world().showIndependentSection(util.select().fromTo(4, 2, 3, 4, 1, 2), Direction.DOWN); scene.idle(5); - scene.world.showSectionAndMerge(util.select.position(3, 1, 3), Direction.EAST, contraption); + scene.world().showSectionAndMerge(util.select().position(3, 1, 3), Direction.EAST, contraption); scene.idle(5); - scene.world.showSectionAndMerge(util.select.position(3, 1, 2), Direction.EAST, contraption); - scene.world.showSectionAndMerge(util.select.position(3, 2, 3), Direction.EAST, contraption); + scene.world().showSectionAndMerge(util.select().position(3, 1, 2), Direction.EAST, contraption); + scene.world().showSectionAndMerge(util.select().position(3, 2, 3), Direction.EAST, contraption); scene.idle(5); - scene.world.showSectionAndMerge(util.select.position(3, 2, 2), Direction.EAST, contraption); + scene.world().showSectionAndMerge(util.select().position(3, 2, 2), Direction.EAST, contraption); - scene.overlay.showText(60) + scene.overlay().showText(60) .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.topOf(util.grid.at(3, 2, 3))) + .pointAt(util.vector().topOf(util.grid().at(3, 2, 3))) .text("Whenever Drills are moved as part of an animated Contraption..."); scene.idle(70); - Selection drills = util.select.fromTo(3, 1, 2, 3, 2, 3); + Selection drills = util.select().fromTo(3, 1, 2, 3, 2, 3); - Selection planks = util.select.fromTo(1, 1, 2, 1, 2, 3); - scene.world.showSection(planks, Direction.DOWN); - scene.world.setKineticSpeed(util.select.position(4, 0, 6), -8); - scene.world.setKineticSpeed(kinetics, 16); - scene.world.setKineticSpeed(drills, 16); - scene.world.moveSection(pistonHead, util.vector.of(-1, 0, 0), 20); - scene.world.moveSection(contraption, util.vector.of(-1, 0, 0), 20); + Selection planks = util.select().fromTo(1, 1, 2, 1, 2, 3); + scene.world().showSection(planks, Direction.DOWN); + scene.world().setKineticSpeed(util.select().position(4, 0, 6), -8); + scene.world().setKineticSpeed(kinetics, 16); + scene.world().setKineticSpeed(drills, 16); + scene.world().moveSection(pistonHead, util.vector().of(-1, 0, 0), 20); + scene.world().moveSection(contraption, util.vector().of(-1, 0, 0), 20); scene.idle(20); - scene.world.setKineticSpeed(drills, 64); + scene.world().setKineticSpeed(drills, 64); - BlockPos p1 = util.grid.at(1, 1, 2); - BlockPos p2 = util.grid.at(1, 1, 3); - BlockPos p3 = util.grid.at(1, 2, 2); - BlockPos p4 = util.grid.at(1, 2, 3); + BlockPos p1 = util.grid().at(1, 1, 2); + BlockPos p2 = util.grid().at(1, 1, 3); + BlockPos p3 = util.grid().at(1, 2, 2); + BlockPos p4 = util.grid().at(1, 2, 3); for (int i = 0; i < 10; i++) { scene.idle(3); - scene.world.incrementBlockBreakingProgress(p1); - scene.world.incrementBlockBreakingProgress(p2); - scene.world.incrementBlockBreakingProgress(p3); - scene.world.incrementBlockBreakingProgress(p4); + scene.world().incrementBlockBreakingProgress(p1); + scene.world().incrementBlockBreakingProgress(p2); + scene.world().incrementBlockBreakingProgress(p3); + scene.world().incrementBlockBreakingProgress(p4); if (i == 2) { - scene.overlay.showText(80) + scene.overlay().showText(80) .placeNearTarget() - .pointAt(util.vector.topOf(p3)) + .pointAt(util.vector().topOf(p3)) .text("...they will break blocks the contraption runs them into"); } } - Vec3 m = util.vector.of(-.1, 0, 0); + Vec3 m = util.vector().of(-.1, 0, 0); ItemStack item = new ItemStack(Items.OAK_PLANKS); - scene.world.createItemEntity(util.vector.centerOf(p1), m, item); - scene.world.createItemEntity(util.vector.centerOf(p2), m, item); - scene.world.createItemEntity(util.vector.centerOf(p3), m, item); - scene.world.createItemEntity(util.vector.centerOf(p4), m, item); + scene.world().createItemEntity(util.vector().centerOf(p1), m, item); + scene.world().createItemEntity(util.vector().centerOf(p2), m, item); + scene.world().createItemEntity(util.vector().centerOf(p3), m, item); + scene.world().createItemEntity(util.vector().centerOf(p4), m, item); - scene.world.setKineticSpeed(drills, 16); - scene.world.moveSection(pistonHead, util.vector.of(-1, 0, 0), 20); - scene.world.moveSection(contraption, util.vector.of(-1, 0, 0), 20); + scene.world().setKineticSpeed(drills, 16); + scene.world().moveSection(pistonHead, util.vector().of(-1, 0, 0), 20); + scene.world().moveSection(contraption, util.vector().of(-1, 0, 0), 20); scene.idle(20); - scene.world.setKineticSpeed(drills, 0); + scene.world().setKineticSpeed(drills, 0); scene.idle(20); - scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); - scene.world.moveSection(pistonHead, util.vector.of(2, 0, 0), 40); - scene.world.moveSection(contraption, util.vector.of(2, 0, 0), 40); - scene.world.hideSection(planks, Direction.UP); + scene.world().modifyKineticSpeed(util.select().everywhere(), f -> -f); + scene.world().moveSection(pistonHead, util.vector().of(2, 0, 0), 40); + scene.world().moveSection(contraption, util.vector().of(2, 0, 0), 40); + scene.world().hideSection(planks, Direction.UP); scene.idle(40); - scene.world.setBlocks(planks, Blocks.OAK_PLANKS.defaultBlockState(), false); - scene.world.modifyEntities(ItemEntity.class, Entity::discard); - scene.world.glueBlockOnto(util.grid.at(4, 3, 2), Direction.DOWN, contraption); + scene.world().setBlocks(planks, Blocks.OAK_PLANKS.defaultBlockState(), false); + scene.world().modifyEntities(ItemEntity.class, Entity::discard); + scene.world().glueBlockOnto(util.grid().at(4, 3, 2), Direction.DOWN, contraption); - scene.overlay.showText(60) + scene.overlay().showText(60) .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.blockSurface(util.grid.at(4, 3, 2), Direction.WEST)) + .pointAt(util.vector().blockSurface(util.grid().at(4, 3, 2), Direction.WEST)) .sharedText("storage_on_contraption"); scene.idle(70); - scene.world.showSection(planks, Direction.DOWN); - scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); - scene.world.setKineticSpeed(drills, 16); - scene.world.moveSection(pistonHead, util.vector.of(-1, 0, 0), 20); - scene.world.moveSection(contraption, util.vector.of(-1, 0, 0), 20); + scene.world().showSection(planks, Direction.DOWN); + scene.world().modifyKineticSpeed(util.select().everywhere(), f -> -f); + scene.world().setKineticSpeed(drills, 16); + scene.world().moveSection(pistonHead, util.vector().of(-1, 0, 0), 20); + scene.world().moveSection(contraption, util.vector().of(-1, 0, 0), 20); scene.idle(20); - scene.world.setKineticSpeed(drills, 64); + scene.world().setKineticSpeed(drills, 64); for (int i = 0; i < 10; i++) { scene.idle(3); - scene.world.incrementBlockBreakingProgress(p1); - scene.world.incrementBlockBreakingProgress(p2); - scene.world.incrementBlockBreakingProgress(p3); - scene.world.incrementBlockBreakingProgress(p4); + scene.world().incrementBlockBreakingProgress(p1); + scene.world().incrementBlockBreakingProgress(p2); + scene.world().incrementBlockBreakingProgress(p3); + scene.world().incrementBlockBreakingProgress(p4); } - scene.world.setKineticSpeed(drills, 16); - scene.world.moveSection(pistonHead, util.vector.of(-1, 0, 0), 20); - scene.world.moveSection(contraption, util.vector.of(-1, 0, 0), 20); + scene.world().setKineticSpeed(drills, 16); + scene.world().moveSection(pistonHead, util.vector().of(-1, 0, 0), 20); + scene.world().moveSection(contraption, util.vector().of(-1, 0, 0), 20); scene.idle(20); - scene.world.setKineticSpeed(drills, 0); + scene.world().setKineticSpeed(drills, 0); scene.idle(10); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(2, 3, 2), Pointing.DOWN) + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(2, 3, 2), Pointing.DOWN) .withItem(new ItemStack(Blocks.OAK_PLANKS)), 60); scene.idle(20); } diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/MechanicalSawScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/MechanicalSawScenes.java index c7e0038210..6e111b4941 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/MechanicalSawScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/MechanicalSawScenes.java @@ -6,10 +6,10 @@ import com.simibubi.create.content.kinetics.simpleRelays.ShaftBlock; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; import net.createmod.ponder.foundation.ElementLink; import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.SceneBuilder; -import net.createmod.ponder.foundation.SceneBuildingUtil; import net.createmod.ponder.foundation.Selection; import net.createmod.ponder.foundation.element.EntityElement; import net.createmod.ponder.foundation.element.InputWindowElement; @@ -30,26 +30,26 @@ public class MechanicalSawScenes { CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("mechanical_saw_processing", "Processing Items on the Mechanical Saw"); scene.configureBasePlate(0, 0, 5); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); - BlockPos shaftPos = util.grid.at(2, 1, 3); - scene.world.setBlock(shaftPos, AllBlocks.SHAFT.getDefaultState() + BlockPos shaftPos = util.grid().at(2, 1, 3); + scene.world().setBlock(shaftPos, AllBlocks.SHAFT.getDefaultState() .setValue(ShaftBlock.AXIS, Axis.Z), false); - BlockPos sawPos = util.grid.at(2, 1, 2); - Selection sawSelect = util.select.position(sawPos); - scene.world.modifyBlockEntityNBT(sawSelect, SawBlockEntity.class, nbt -> nbt.putInt("RecipeIndex", 0)); + BlockPos sawPos = util.grid().at(2, 1, 2); + Selection sawSelect = util.select().position(sawPos); + scene.world().modifyBlockEntityNBT(sawSelect, SawBlockEntity.class, nbt -> nbt.putInt("RecipeIndex", 0)); scene.idle(5); - scene.world.showSection(util.select.fromTo(2, 1, 3, 2, 1, 5), Direction.DOWN); + scene.world().showSection(util.select().fromTo(2, 1, 3, 2, 1, 5), Direction.DOWN); scene.idle(10); - scene.effects.rotationDirectionIndicator(shaftPos); - scene.world.showSection(sawSelect, Direction.DOWN); + scene.effects().rotationDirectionIndicator(shaftPos); + scene.world().showSection(sawSelect, Direction.DOWN); scene.idle(10); - scene.overlay.showText(50) + scene.overlay().showText(50) .attachKeyFrame() .text("Upward facing Mechanical Saws can process a variety of items") - .pointAt(util.vector.blockSurface(sawPos, Direction.WEST)) + .pointAt(util.vector().blockSurface(sawPos, Direction.WEST)) .placeNearTarget(); scene.idle(45); @@ -57,96 +57,96 @@ public class MechanicalSawScenes { ItemStack strippedLog = new ItemStack(Items.STRIPPED_OAK_LOG); ItemStack planks = new ItemStack(Items.OAK_PLANKS); - Vec3 itemSpawn = util.vector.centerOf(sawPos.above() + Vec3 itemSpawn = util.vector().centerOf(sawPos.above() .west()); - ElementLink logItem = scene.world.createItemEntity(itemSpawn, util.vector.of(0, 0, 0), log); + ElementLink logItem = scene.world().createItemEntity(itemSpawn, util.vector().of(0, 0, 0), log); scene.idle(12); - scene.overlay.showControls(new InputWindowElement(itemSpawn, Pointing.DOWN).withItem(log), 20); + scene.overlay().showControls(new InputWindowElement(itemSpawn, Pointing.DOWN).withItem(log), 20); scene.idle(10); - scene.world.modifyEntity(logItem, e -> e.setDeltaMovement(util.vector.of(0.05, 0.2, 0))); + scene.world().modifyEntity(logItem, e -> e.setDeltaMovement(util.vector().of(0.05, 0.2, 0))); scene.idle(12); - scene.world.modifyEntity(logItem, Entity::discard); - scene.world.createItemOnBeltLike(sawPos, Direction.WEST, log); + scene.world().modifyEntity(logItem, Entity::discard); + scene.world().createItemOnBeltLike(sawPos, Direction.WEST, log); scene.idle(50); - logItem = scene.world.createItemEntity(util.vector.topOf(sawPos) - .add(0.5, -.1, 0), util.vector.of(0.05, 0.18, 0), strippedLog); + logItem = scene.world().createItemEntity(util.vector().topOf(sawPos) + .add(0.5, -.1, 0), util.vector().of(0.05, 0.18, 0), strippedLog); scene.idle(12); - scene.overlay.showControls(new InputWindowElement(itemSpawn.add(2, 0, 0), Pointing.DOWN).withItem(strippedLog), - 20); + scene.overlay().showControls(new InputWindowElement(itemSpawn.add(2, 0, 0), Pointing.DOWN).withItem(strippedLog), + 20); scene.idle(30); - scene.overlay.showText(60) + scene.overlay().showText(60) .attachKeyFrame() .text("The processed item always moves against the rotational input to the saw") - .pointAt(util.vector.blockSurface(sawPos, Direction.UP)) + .pointAt(util.vector().blockSurface(sawPos, Direction.UP)) .placeNearTarget(); scene.idle(70); - scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -2 * f); - scene.effects.rotationDirectionIndicator(shaftPos); - scene.world.modifyEntity(logItem, e -> e.setDeltaMovement(util.vector.of(-0.05, 0.2, 0))); + scene.world().modifyKineticSpeed(util.select().everywhere(), f -> -2 * f); + scene.effects().rotationDirectionIndicator(shaftPos); + scene.world().modifyEntity(logItem, e -> e.setDeltaMovement(util.vector().of(-0.05, 0.2, 0))); scene.idle(12); - scene.world.modifyEntity(logItem, Entity::discard); - scene.world.createItemOnBeltLike(sawPos, Direction.EAST, strippedLog); + scene.world().modifyEntity(logItem, Entity::discard); + scene.world().createItemOnBeltLike(sawPos, Direction.EAST, strippedLog); scene.idle(25); - logItem = scene.world.createItemEntity(util.vector.topOf(sawPos) - .add(-0.5, -.1, 0), util.vector.of(-0.05, 0.18, 0), planks); + logItem = scene.world().createItemEntity(util.vector().topOf(sawPos) + .add(-0.5, -.1, 0), util.vector().of(-0.05, 0.18, 0), planks); scene.idle(22); - Selection otherBelt = util.select.fromTo(3, 1, 3, 4, 1, 2); - Selection belt = util.select.fromTo(0, 1, 2, 1, 1, 3); + Selection otherBelt = util.select().fromTo(3, 1, 3, 4, 1, 2); + Selection belt = util.select().fromTo(0, 1, 2, 1, 1, 3); - scene.world.setKineticSpeed(otherBelt, 0); - scene.world.setKineticSpeed(belt, 0); - scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); - scene.world.modifyEntity(logItem, Entity::discard); - scene.world.setBlock(shaftPos, AllBlocks.COGWHEEL.getDefaultState() + scene.world().setKineticSpeed(otherBelt, 0); + scene.world().setKineticSpeed(belt, 0); + scene.world().modifyKineticSpeed(util.select().everywhere(), f -> -f); + scene.world().modifyEntity(logItem, Entity::discard); + scene.world().setBlock(shaftPos, AllBlocks.COGWHEEL.getDefaultState() .setValue(ShaftBlock.AXIS, Axis.Z), true); scene.idle(3); scene.addKeyframe(); - scene.world.multiplyKineticSpeed(util.select.everywhere(), .5f); + scene.world().multiplyKineticSpeed(util.select().everywhere(), .5f); - ElementLink beltSection = scene.world.showIndependentSection(belt, Direction.EAST); - scene.world.moveSection(beltSection, util.vector.of(0, 100, 0), 0); + ElementLink beltSection = scene.world().showIndependentSection(belt, Direction.EAST); + scene.world().moveSection(beltSection, util.vector().of(0, 100, 0), 0); scene.idle(1); - scene.world.removeItemsFromBelt(util.grid.at(1, 1, 2)); + scene.world().removeItemsFromBelt(util.grid().at(1, 1, 2)); scene.idle(1); - scene.world.setKineticSpeed(belt, -64); + scene.world().setKineticSpeed(belt, -64); scene.idle(1); - scene.world.moveSection(beltSection, util.vector.of(0, -100, 0), 0); + scene.world().moveSection(beltSection, util.vector().of(0, -100, 0), 0); scene.idle(3); ElementLink otherBeltSection = - scene.world.showIndependentSection(otherBelt, Direction.WEST); - scene.world.moveSection(otherBeltSection, util.vector.of(0, 100, 0), 0); + scene.world().showIndependentSection(otherBelt, Direction.WEST); + scene.world().moveSection(otherBeltSection, util.vector().of(0, 100, 0), 0); scene.idle(1); - scene.world.removeItemsFromBelt(util.grid.at(3, 1, 2)); + scene.world().removeItemsFromBelt(util.grid().at(3, 1, 2)); scene.idle(1); - scene.world.setKineticSpeed(otherBelt, -64); + scene.world().setKineticSpeed(otherBelt, -64); scene.idle(1); - scene.world.moveSection(otherBeltSection, util.vector.of(0, -100, 0), 0); + scene.world().moveSection(otherBeltSection, util.vector().of(0, -100, 0), 0); scene.idle(3); ItemStack stone = new ItemStack(Blocks.STONE); - BlockPos firstBelt = util.grid.at(0, 1, 2); - scene.overlay.showText(60) + BlockPos firstBelt = util.grid().at(0, 1, 2); + scene.overlay().showText(60) .text("Saws can work in-line with Mechanical Belts") - .pointAt(util.vector.blockSurface(firstBelt, Direction.WEST)) + .pointAt(util.vector().blockSurface(firstBelt, Direction.WEST)) .placeNearTarget(); scene.idle(40); - scene.world.createItemOnBelt(firstBelt, Direction.WEST, stone); + scene.world().createItemOnBelt(firstBelt, Direction.WEST, stone); scene.idle(40); - Vec3 filter = util.vector.of(2.5, 1 + 13 / 16f, 2 + 5 / 16f); - scene.overlay.showFilterSlotInput(filter, Direction.UP, 80); - scene.overlay.showText(80) + Vec3 filter = util.vector().of(2.5, 1 + 13 / 16f, 2 + 5 / 16f); + scene.overlay().showFilterSlotInput(filter, Direction.UP, 80); + scene.overlay().showText(80) .attachKeyFrame() .text("When an ingredient has multiple possible outcomes, the filter slot can specify it") .pointAt(filter) @@ -154,22 +154,22 @@ public class MechanicalSawScenes { scene.idle(90); ItemStack bricks = new ItemStack(Blocks.STONE_BRICKS); - scene.overlay.showControls(new InputWindowElement(filter, Pointing.DOWN).withItem(bricks), 30); - scene.world.modifyEntities(ItemEntity.class, Entity::discard); + scene.overlay().showControls(new InputWindowElement(filter, Pointing.DOWN).withItem(bricks), 30); + scene.world().modifyEntities(ItemEntity.class, Entity::discard); scene.idle(7); - scene.world.setFilterData(util.select.position(sawPos), SawBlockEntity.class, bricks); + scene.world().setFilterData(util.select().position(sawPos), SawBlockEntity.class, bricks); scene.idle(10); - scene.world.createItemOnBelt(firstBelt, Direction.WEST, stone); + scene.world().createItemOnBelt(firstBelt, Direction.WEST, stone); scene.idle(50); scene.markAsFinished(); - scene.overlay.showText(100) + scene.overlay().showText(100) .text("Without filter, the Saw would cycle through all outcomes instead") .colored(PonderPalette.RED) .pointAt(filter) .placeNearTarget(); scene.idle(65); - scene.world.modifyEntities(ItemEntity.class, Entity::discard); + scene.world().modifyEntities(ItemEntity.class, Entity::discard); } public static void treeCutting(SceneBuilder builder, SceneBuildingUtil util) { @@ -177,70 +177,70 @@ public class MechanicalSawScenes { scene.title("mechanical_saw_breaker", "Cutting Trees with the Mechanical Saw"); scene.configureBasePlate(0, 0, 5); scene.scaleSceneView(.9f); - scene.world.setBlock(util.grid.at(2, 0, 2), Blocks.GRASS_BLOCK.defaultBlockState(), false); - scene.world.showSection(util.select.layer(0) - .add(util.select.position(3, 1, 1)) - .add(util.select.position(1, 1, 2)), Direction.UP); + scene.world().setBlock(util.grid().at(2, 0, 2), Blocks.GRASS_BLOCK.defaultBlockState(), false); + scene.world().showSection(util.select().layer(0) + .add(util.select().position(3, 1, 1)) + .add(util.select().position(1, 1, 2)), Direction.UP); - scene.world.setKineticSpeed(util.select.position(5, 0, 1), -8); - scene.world.setKineticSpeed(util.select.fromTo(3, 1, 2, 5, 1, 2), 16); + scene.world().setKineticSpeed(util.select().position(5, 0, 1), -8); + scene.world().setKineticSpeed(util.select().fromTo(3, 1, 2, 5, 1, 2), 16); scene.idle(5); - scene.world.showSection(util.select.fromTo(4, 1, 2, 5, 1, 2), Direction.DOWN); + scene.world().showSection(util.select().fromTo(4, 1, 2, 5, 1, 2), Direction.DOWN); scene.idle(10); - scene.world.showSection(util.select.position(3, 1, 2), Direction.DOWN); + scene.world().showSection(util.select().position(3, 1, 2), Direction.DOWN); scene.idle(20); - scene.world.showSection(util.select.fromTo(2, 1, 2, 2, 3, 2), Direction.UP); - scene.world.showSection(util.select.layersFrom(4), Direction.UP); + scene.world().showSection(util.select().fromTo(2, 1, 2, 2, 3, 2), Direction.UP); + scene.world().showSection(util.select().layersFrom(4), Direction.UP); - BlockPos breakingPos = util.grid.at(2, 1, 2); + BlockPos breakingPos = util.grid().at(2, 1, 2); scene.idle(5); for (int i = 0; i < 10; i++) { scene.idle(10); - scene.world.incrementBlockBreakingProgress(breakingPos); + scene.world().incrementBlockBreakingProgress(breakingPos); if (i == 1) { - scene.overlay.showText(80) + scene.overlay().showText(80) .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.blockSurface(breakingPos, Direction.WEST)) + .pointAt(util.vector().blockSurface(breakingPos, Direction.WEST)) .text("When given Rotational Force, a Mechanical Saw will cut trees directly in front of it"); } } - scene.world.replaceBlocks(util.select.fromTo(2, 2, 2, 2, 6, 2), Blocks.AIR.defaultBlockState(), true); + scene.world().replaceBlocks(util.select().fromTo(2, 2, 2, 2, 6, 2), Blocks.AIR.defaultBlockState(), true); - scene.world.destroyBlock(util.grid.at(3, 5, 0)); - scene.world.destroyBlock(util.grid.at(0, 4, 1)); - scene.world.destroyBlock(util.grid.at(2, 6, 1)); - scene.world.destroyBlock(util.grid.at(1, 4, 0)); - scene.world.destroyBlock(util.grid.at(1, 6, 2)); - scene.world.destroyBlock(util.grid.at(1, 5, 3)); - scene.world.destroyBlock(util.grid.at(0, 4, 3)); + scene.world().destroyBlock(util.grid().at(3, 5, 0)); + scene.world().destroyBlock(util.grid().at(0, 4, 1)); + scene.world().destroyBlock(util.grid().at(2, 6, 1)); + scene.world().destroyBlock(util.grid().at(1, 4, 0)); + scene.world().destroyBlock(util.grid().at(1, 6, 2)); + scene.world().destroyBlock(util.grid().at(1, 5, 3)); + scene.world().destroyBlock(util.grid().at(0, 4, 3)); - scene.world.replaceBlocks(util.select.layersFrom(4), Blocks.AIR.defaultBlockState(), false); + scene.world().replaceBlocks(util.select().layersFrom(4), Blocks.AIR.defaultBlockState(), false); for (int i = 0; i < 5; i++) { - Vec3 dropPos = util.vector.centerOf(breakingPos.above(i)); - float distance = (float) dropPos.distanceTo(util.vector.centerOf(breakingPos)); - scene.world.createItemEntity(dropPos, util.vector.of(-distance / 20, 0, 0), new ItemStack(Items.OAK_LOG)); + Vec3 dropPos = util.vector().centerOf(breakingPos.above(i)); + float distance = (float) dropPos.distanceTo(util.vector().centerOf(breakingPos)); + scene.world().createItemEntity(dropPos, util.vector().of(-distance / 20, 0, 0), new ItemStack(Items.OAK_LOG)); } scene.idle(35); - scene.world.destroyBlock(util.grid.at(1, 1, 2)); - scene.world.hideSection(util.select.layersFrom(2) - .add(util.select.fromTo(2, 1, 2, 1, 1, 3)), Direction.UP); - scene.world.modifyEntities(ItemEntity.class, Entity::discard); + scene.world().destroyBlock(util.grid().at(1, 1, 2)); + scene.world().hideSection(util.select().layersFrom(2) + .add(util.select().fromTo(2, 1, 2, 1, 1, 3)), Direction.UP); + scene.world().modifyEntities(ItemEntity.class, Entity::discard); scene.idle(15); - scene.world.setBlocks(util.select.fromTo(2, 1, 2, 1, 20, 3), Blocks.JUNGLE_LOG.defaultBlockState(), false); - scene.world.showSection(util.select.layersFrom(2) - .add(util.select.fromTo(2, 1, 2, 1, 1, 3)), Direction.UP); + scene.world().setBlocks(util.select().fromTo(2, 1, 2, 1, 20, 3), Blocks.JUNGLE_LOG.defaultBlockState(), false); + scene.world().showSection(util.select().layersFrom(2) + .add(util.select().fromTo(2, 1, 2, 1, 1, 3)), Direction.UP); scene.idle(15); - scene.world.hideSection(util.select.fromTo(2, 1, 2, 1, 1, 3) - .substract(util.select.position(breakingPos)), Direction.WEST); + scene.world().hideSection(util.select().fromTo(2, 1, 2, 1, 1, 3) + .substract(util.select().position(breakingPos)), Direction.WEST); scene.idle(10); - scene.overlay.showSelectionWithText(util.select.position(breakingPos), 90) + scene.overlay().showSelectionWithText(util.select().position(breakingPos), 90) .attachKeyFrame() .colored(PonderPalette.GREEN) .placeNearTarget() @@ -249,18 +249,18 @@ public class MechanicalSawScenes { scene.idle(25); for (int i = 0; i < 10; i++) { scene.idle(10); - scene.world.incrementBlockBreakingProgress(breakingPos); + scene.world().incrementBlockBreakingProgress(breakingPos); } for (int i = 0; i < 30; i++) { - scene.world.replaceBlocks(util.select.fromTo(2, i + 1, 2, 1, i + 1, 3), Blocks.AIR.defaultBlockState(), - true); + scene.world().replaceBlocks(util.select().fromTo(2, i + 1, 2, 1, i + 1, 3), Blocks.AIR.defaultBlockState(), + true); for (int x = 1; x <= 2; x++) { for (int z = 2; z <= 3; z++) { - Vec3 dropPos = util.vector.centerOf(x, i + 1, z); - float distance = (float) dropPos.distanceTo(util.vector.centerOf(breakingPos)); - scene.world.createItemEntity(dropPos, util.vector.of(-distance / 20, 0, 0), - new ItemStack(Items.JUNGLE_LOG)); + Vec3 dropPos = util.vector().centerOf(x, i + 1, z); + float distance = (float) dropPos.distanceTo(util.vector().centerOf(breakingPos)); + scene.world().createItemEntity(dropPos, util.vector().of(-distance / 20, 0, 0), + new ItemStack(Items.JUNGLE_LOG)); } } scene.idle(1); @@ -272,128 +272,128 @@ public class MechanicalSawScenes { scene.title("mechanical_saw_contraption", "Using Mechanical Saws on Contraptions"); scene.configureBasePlate(1, 0, 6); scene.scaleSceneView(.9f); - scene.world.setBlock(util.grid.at(2, 0, 3), Blocks.GRASS_BLOCK.defaultBlockState(), false); - scene.world.showSection(util.select.layer(0) - .add(util.select.position(3, 1, 1)) - .add(util.select.position(1, 1, 2)) - .add(util.select.position(2, 1, 4)), Direction.UP); + scene.world().setBlock(util.grid().at(2, 0, 3), Blocks.GRASS_BLOCK.defaultBlockState(), false); + scene.world().showSection(util.select().layer(0) + .add(util.select().position(3, 1, 1)) + .add(util.select().position(1, 1, 2)) + .add(util.select().position(2, 1, 4)), Direction.UP); - Selection kinetics = util.select.fromTo(6, 1, 2, 6, 1, 6); + Selection kinetics = util.select().fromTo(6, 1, 2, 6, 1, 6); scene.idle(5); ElementLink pistonHead = - scene.world.showIndependentSection(util.select.fromTo(6, 1, 1, 8, 1, 1), Direction.DOWN); - scene.world.moveSection(pistonHead, util.vector.of(0, 0, 1), 0); - scene.world.showSection(kinetics, Direction.DOWN); + scene.world().showIndependentSection(util.select().fromTo(6, 1, 1, 8, 1, 1), Direction.DOWN); + scene.world().moveSection(pistonHead, util.vector().of(0, 0, 1), 0); + scene.world().showSection(kinetics, Direction.DOWN); scene.idle(5); ElementLink contraption = - scene.world.showIndependentSection(util.select.fromTo(5, 1, 3, 5, 1, 2), Direction.DOWN); + scene.world().showIndependentSection(util.select().fromTo(5, 1, 3, 5, 1, 2), Direction.DOWN); scene.idle(5); - scene.world.showSectionAndMerge(util.select.position(4, 1, 3), Direction.EAST, contraption); + scene.world().showSectionAndMerge(util.select().position(4, 1, 3), Direction.EAST, contraption); scene.idle(5); - scene.world.showSectionAndMerge(util.select.position(4, 1, 2), Direction.EAST, contraption); + scene.world().showSectionAndMerge(util.select().position(4, 1, 2), Direction.EAST, contraption); scene.idle(5); - scene.overlay.showText(60) + scene.overlay().showText(60) .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.topOf(util.grid.at(4, 1, 3))) + .pointAt(util.vector().topOf(util.grid().at(4, 1, 3))) .text("Whenever Saws are moved as part of an animated Contraption..."); scene.idle(70); - Selection saws = util.select.fromTo(4, 1, 2, 4, 1, 3); + Selection saws = util.select().fromTo(4, 1, 2, 4, 1, 3); - Selection tree = util.select.fromTo(2, 1, 3, 2, 7, 3) - .add(util.select.layersFrom(3)); - scene.world.showSection(tree, Direction.UP); - scene.world.setKineticSpeed(util.select.position(5, 0, 6), -8); - scene.world.setKineticSpeed(kinetics, 16); - scene.world.setKineticSpeed(saws, 16); - scene.world.moveSection(pistonHead, util.vector.of(-1, 0, 0), 20); - scene.world.moveSection(contraption, util.vector.of(-1, 0, 0), 20); + Selection tree = util.select().fromTo(2, 1, 3, 2, 7, 3) + .add(util.select().layersFrom(3)); + scene.world().showSection(tree, Direction.UP); + scene.world().setKineticSpeed(util.select().position(5, 0, 6), -8); + scene.world().setKineticSpeed(kinetics, 16); + scene.world().setKineticSpeed(saws, 16); + scene.world().moveSection(pistonHead, util.vector().of(-1, 0, 0), 20); + scene.world().moveSection(contraption, util.vector().of(-1, 0, 0), 20); scene.idle(20); - BlockPos breakingPos = util.grid.at(2, 1, 3); + BlockPos breakingPos = util.grid().at(2, 1, 3); for (int i = 0; i < 10; i++) { scene.idle(3); - scene.world.incrementBlockBreakingProgress(breakingPos); + scene.world().incrementBlockBreakingProgress(breakingPos); if (i == 2) { - scene.overlay.showText(80) + scene.overlay().showText(80) .placeNearTarget() - .pointAt(util.vector.blockSurface(breakingPos, Direction.WEST)) + .pointAt(util.vector().blockSurface(breakingPos, Direction.WEST)) .text("...they will cut any trees the contraption runs them into"); } } - scene.world.replaceBlocks(util.select.fromTo(2, 2, 3, 2, 6, 3), Blocks.AIR.defaultBlockState(), true); - scene.world.destroyBlock(util.grid.at(4, 5, 1)); - scene.world.destroyBlock(util.grid.at(1, 4, 2)); - scene.world.destroyBlock(util.grid.at(3, 6, 2)); - scene.world.destroyBlock(util.grid.at(2, 4, 1)); - scene.world.destroyBlock(util.grid.at(2, 6, 3)); - scene.world.destroyBlock(util.grid.at(2, 5, 2)); - scene.world.destroyBlock(util.grid.at(1, 4, 2)); - scene.world.replaceBlocks(util.select.layersFrom(4), Blocks.AIR.defaultBlockState(), false); + scene.world().replaceBlocks(util.select().fromTo(2, 2, 3, 2, 6, 3), Blocks.AIR.defaultBlockState(), true); + scene.world().destroyBlock(util.grid().at(4, 5, 1)); + scene.world().destroyBlock(util.grid().at(1, 4, 2)); + scene.world().destroyBlock(util.grid().at(3, 6, 2)); + scene.world().destroyBlock(util.grid().at(2, 4, 1)); + scene.world().destroyBlock(util.grid().at(2, 6, 3)); + scene.world().destroyBlock(util.grid().at(2, 5, 2)); + scene.world().destroyBlock(util.grid().at(1, 4, 2)); + scene.world().replaceBlocks(util.select().layersFrom(4), Blocks.AIR.defaultBlockState(), false); for (int i = 0; i < 5; i++) { - Vec3 dropPos = util.vector.centerOf(breakingPos.above(i)); - float distance = (float) dropPos.distanceTo(util.vector.centerOf(breakingPos)); - scene.world.createItemEntity(dropPos, util.vector.of(-distance / 20, 0, 0), new ItemStack(Items.OAK_LOG)); + Vec3 dropPos = util.vector().centerOf(breakingPos.above(i)); + float distance = (float) dropPos.distanceTo(util.vector().centerOf(breakingPos)); + scene.world().createItemEntity(dropPos, util.vector().of(-distance / 20, 0, 0), new ItemStack(Items.OAK_LOG)); } - scene.world.moveSection(pistonHead, util.vector.of(-1, 0, 0), 20); - scene.world.moveSection(contraption, util.vector.of(-1, 0, 0), 20); + scene.world().moveSection(pistonHead, util.vector().of(-1, 0, 0), 20); + scene.world().moveSection(contraption, util.vector().of(-1, 0, 0), 20); scene.idle(20); - scene.world.setKineticSpeed(saws, 0); + scene.world().setKineticSpeed(saws, 0); scene.idle(20); - scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); - scene.world.moveSection(pistonHead, util.vector.of(2, 0, 0), 40); - scene.world.moveSection(contraption, util.vector.of(2, 0, 0), 40); - scene.world.hideSection(tree, Direction.UP); + scene.world().modifyKineticSpeed(util.select().everywhere(), f -> -f); + scene.world().moveSection(pistonHead, util.vector().of(2, 0, 0), 40); + scene.world().moveSection(contraption, util.vector().of(2, 0, 0), 40); + scene.world().hideSection(tree, Direction.UP); scene.idle(40); - scene.world.restoreBlocks(tree); - scene.world.modifyEntities(ItemEntity.class, Entity::discard); - scene.world.glueBlockOnto(util.grid.at(5, 2, 2), Direction.DOWN, contraption); + scene.world().restoreBlocks(tree); + scene.world().modifyEntities(ItemEntity.class, Entity::discard); + scene.world().glueBlockOnto(util.grid().at(5, 2, 2), Direction.DOWN, contraption); - scene.overlay.showText(60) + scene.overlay().showText(60) .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.blockSurface(util.grid.at(5, 2, 2), Direction.WEST)) + .pointAt(util.vector().blockSurface(util.grid().at(5, 2, 2), Direction.WEST)) .sharedText("storage_on_contraption"); scene.idle(70); - scene.world.showSection(tree, Direction.DOWN); - scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); - scene.world.setKineticSpeed(saws, 16); - scene.world.moveSection(pistonHead, util.vector.of(-1, 0, 0), 20); - scene.world.moveSection(contraption, util.vector.of(-1, 0, 0), 20); + scene.world().showSection(tree, Direction.DOWN); + scene.world().modifyKineticSpeed(util.select().everywhere(), f -> -f); + scene.world().setKineticSpeed(saws, 16); + scene.world().moveSection(pistonHead, util.vector().of(-1, 0, 0), 20); + scene.world().moveSection(contraption, util.vector().of(-1, 0, 0), 20); scene.idle(20); for (int i = 0; i < 10; i++) { scene.idle(3); - scene.world.incrementBlockBreakingProgress(breakingPos); + scene.world().incrementBlockBreakingProgress(breakingPos); } - scene.world.replaceBlocks(util.select.fromTo(2, 2, 3, 2, 6, 3), Blocks.AIR.defaultBlockState(), true); - scene.world.destroyBlock(util.grid.at(4, 5, 1)); - scene.world.destroyBlock(util.grid.at(1, 4, 2)); - scene.world.destroyBlock(util.grid.at(3, 6, 2)); - scene.world.destroyBlock(util.grid.at(2, 4, 1)); - scene.world.destroyBlock(util.grid.at(2, 6, 3)); - scene.world.destroyBlock(util.grid.at(2, 5, 2)); - scene.world.destroyBlock(util.grid.at(1, 4, 2)); - scene.world.replaceBlocks(util.select.layersFrom(4), Blocks.AIR.defaultBlockState(), false); + scene.world().replaceBlocks(util.select().fromTo(2, 2, 3, 2, 6, 3), Blocks.AIR.defaultBlockState(), true); + scene.world().destroyBlock(util.grid().at(4, 5, 1)); + scene.world().destroyBlock(util.grid().at(1, 4, 2)); + scene.world().destroyBlock(util.grid().at(3, 6, 2)); + scene.world().destroyBlock(util.grid().at(2, 4, 1)); + scene.world().destroyBlock(util.grid().at(2, 6, 3)); + scene.world().destroyBlock(util.grid().at(2, 5, 2)); + scene.world().destroyBlock(util.grid().at(1, 4, 2)); + scene.world().replaceBlocks(util.select().layersFrom(4), Blocks.AIR.defaultBlockState(), false); - scene.world.moveSection(pistonHead, util.vector.of(-1, 0, 0), 20); - scene.world.moveSection(contraption, util.vector.of(-1, 0, 0), 20); + scene.world().moveSection(pistonHead, util.vector().of(-1, 0, 0), 20); + scene.world().moveSection(contraption, util.vector().of(-1, 0, 0), 20); scene.idle(20); - scene.world.setKineticSpeed(saws, 0); + scene.world().setKineticSpeed(saws, 0); scene.idle(10); - scene.overlay.showControls( - new InputWindowElement(util.vector.topOf(3, 2, 2), Pointing.DOWN).withItem(new ItemStack(Blocks.OAK_LOG)), + scene.overlay().showControls( + new InputWindowElement(util.vector().topOf(3, 2, 2), Pointing.DOWN).withItem(new ItemStack(Blocks.OAK_LOG)), 60); scene.idle(20); } diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/MovementActorScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/MovementActorScenes.java index 311120b90b..61fb3744dc 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/MovementActorScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/MovementActorScenes.java @@ -9,10 +9,10 @@ import com.simibubi.create.content.contraptions.chassis.LinearChassisBlock; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; import net.createmod.ponder.foundation.ElementLink; import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.SceneBuilder; -import net.createmod.ponder.foundation.SceneBuildingUtil; import net.createmod.ponder.foundation.Selection; import net.createmod.ponder.foundation.element.EntityElement; import net.createmod.ponder.foundation.element.InputWindowElement; @@ -37,33 +37,33 @@ public class MovementActorScenes { scene.configureBasePlate(0, 0, 6); scene.scaleSceneView(0.95f); scene.setSceneOffsetY(-1); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); scene.idle(5); - BlockPos bearing = util.grid.at(5, 1, 2); - scene.world.showSection(util.select.position(bearing), Direction.DOWN); + BlockPos bearing = util.grid().at(5, 1, 2); + scene.world().showSection(util.select().position(bearing), Direction.DOWN); scene.idle(5); ElementLink contraption = - scene.world.showIndependentSection(util.select.fromTo(5, 2, 2, 6, 3, 2), Direction.DOWN); - scene.world.configureCenterOfRotation(contraption, util.vector.centerOf(bearing)); + scene.world().showIndependentSection(util.select().fromTo(5, 2, 2, 6, 3, 2), Direction.DOWN); + scene.world().configureCenterOfRotation(contraption, util.vector().centerOf(bearing)); scene.idle(10); - scene.world.rotateBearing(bearing, 360, 70); - scene.world.rotateSection(contraption, 0, 360, 0, 70); - scene.overlay.showText(60) - .pointAt(util.vector.topOf(bearing.above(2))) + scene.world().rotateBearing(bearing, 360, 70); + scene.world().rotateSection(contraption, 0, 360, 0, 70); + scene.overlay().showText(60) + .pointAt(util.vector().topOf(bearing.above(2))) .colored(PonderPalette.RED) .placeNearTarget() .attachKeyFrame() .text("Moving inventories can be tricky to access with automation."); scene.idle(70); - BlockPos psi = util.grid.at(4, 2, 2); - scene.world.showSectionAndMerge(util.select.position(psi), Direction.EAST, contraption); + BlockPos psi = util.grid().at(4, 2, 2); + scene.world().showSectionAndMerge(util.select().position(psi), Direction.EAST, contraption); scene.idle(13); - scene.effects.superGlue(psi, Direction.EAST, true); + scene.effects().superGlue(psi, Direction.EAST, true); - scene.overlay.showText(80) - .pointAt(util.vector.topOf(psi)) + scene.overlay().showText(80) + .pointAt(util.vector().topOf(psi)) .colored(PonderPalette.GREEN) .placeNearTarget() .attachKeyFrame() @@ -71,37 +71,37 @@ public class MovementActorScenes { scene.idle(90); BlockPos psi2 = psi.west(2); - scene.world.showSection(util.select.position(psi2), Direction.DOWN); - scene.overlay.showSelectionWithText(util.select.position(psi.west()), 50) + scene.world().showSection(util.select().position(psi2), Direction.DOWN); + scene.overlay().showSelectionWithText(util.select().position(psi.west()), 50) .colored(PonderPalette.RED) .placeNearTarget() .attachKeyFrame() .text("Place a second one with a gap of 1 or 2 blocks inbetween"); scene.idle(55); - scene.world.rotateBearing(bearing, 360, 60); - scene.world.rotateSection(contraption, 0, 360, 0, 60); + scene.world().rotateBearing(bearing, 360, 60); + scene.world().rotateSection(contraption, 0, 360, 0, 60); scene.idle(20); - scene.overlay.showText(40) + scene.overlay().showText(40) .placeNearTarget() - .pointAt(util.vector.of(3, 3, 2.5)) + .pointAt(util.vector().of(3, 3, 2.5)) .text("Whenever they pass by each other, they will engage in a connection"); scene.idle(38); - Selection both = util.select.fromTo(2, 2, 2, 4, 2, 2); + Selection both = util.select().fromTo(2, 2, 2, 4, 2, 2); Class psiClass = PortableItemInterfaceBlockEntity.class; - scene.world.modifyBlockEntityNBT(both, psiClass, nbt -> { + scene.world().modifyBlockEntityNBT(both, psiClass, nbt -> { nbt.putFloat("Distance", 1); nbt.putFloat("Timer", 12); }); scene.idle(17); - scene.overlay.showOutline(PonderPalette.GREEN, psi, util.select.fromTo(5, 3, 2, 6, 3, 2), 80); + scene.overlay().showOutline(PonderPalette.GREEN, psi, util.select().fromTo(5, 3, 2, 6, 3, 2), 80); scene.idle(10); - scene.overlay.showSelectionWithText(util.select.position(psi2), 70) + scene.overlay().showSelectionWithText(util.select().position(psi2), 70) .placeNearTarget() .colored(PonderPalette.GREEN) .attachKeyFrame() @@ -109,60 +109,60 @@ public class MovementActorScenes { scene.idle(80); - BlockPos hopper = util.grid.at(2, 3, 2); - scene.world.showSection(util.select.position(hopper), Direction.DOWN); - scene.overlay.showText(70) + BlockPos hopper = util.grid().at(2, 3, 2); + scene.world().showSection(util.select().position(hopper), Direction.DOWN); + scene.overlay().showText(70) .placeNearTarget() - .pointAt(util.vector.topOf(hopper)) + .pointAt(util.vector().topOf(hopper)) .attachKeyFrame() .text("Items can now be inserted..."); ItemStack itemStack = new ItemStack(Items.COPPER_INGOT); - Vec3 entitySpawn = util.vector.topOf(hopper.above(3)); + Vec3 entitySpawn = util.vector().topOf(hopper.above(3)); ElementLink entity1 = - scene.world.createItemEntity(entitySpawn, util.vector.of(0, 0.2, 0), itemStack); + scene.world().createItemEntity(entitySpawn, util.vector().of(0, 0.2, 0), itemStack); scene.idle(10); ElementLink entity2 = - scene.world.createItemEntity(entitySpawn, util.vector.of(0, 0.2, 0), itemStack); + scene.world().createItemEntity(entitySpawn, util.vector().of(0, 0.2, 0), itemStack); scene.idle(10); - scene.world.modifyEntity(entity1, Entity::discard); + scene.world().modifyEntity(entity1, Entity::discard); scene.idle(10); - scene.world.modifyEntity(entity2, Entity::discard); + scene.world().modifyEntity(entity2, Entity::discard); - scene.overlay - .showControls(new InputWindowElement(util.vector.topOf(5, 3, 2), Pointing.DOWN).withItem(itemStack), 40); + scene.overlay() + .showControls(new InputWindowElement(util.vector().topOf(5, 3, 2), Pointing.DOWN).withItem(itemStack), 40); scene.idle(30); - scene.world.hideSection(util.select.position(hopper), Direction.UP); + scene.world().hideSection(util.select().position(hopper), Direction.UP); scene.idle(15); - BlockPos beltPos = util.grid.at(1, 1, 2); - scene.world.showSection(util.select.fromTo(0, 1, 0, 1, 2, 6), Direction.DOWN); + BlockPos beltPos = util.grid().at(1, 1, 2); + scene.world().showSection(util.select().fromTo(0, 1, 0, 1, 2, 6), Direction.DOWN); scene.idle(10); - scene.world.createItemOnBelt(beltPos, Direction.EAST, itemStack.copy()); - scene.overlay.showText(40) + scene.world().createItemOnBelt(beltPos, Direction.EAST, itemStack.copy()); + scene.overlay().showText(40) .placeNearTarget() - .pointAt(util.vector.topOf(beltPos.above())) + .pointAt(util.vector().topOf(beltPos.above())) .text("...or extracted from the contraption"); scene.idle(15); - scene.world.createItemOnBelt(beltPos, Direction.EAST, itemStack); + scene.world().createItemOnBelt(beltPos, Direction.EAST, itemStack); scene.idle(20); - scene.world.modifyEntities(ItemEntity.class, Entity::discard); + scene.world().modifyEntities(ItemEntity.class, Entity::discard); scene.idle(15); - scene.world.modifyEntities(ItemEntity.class, Entity::discard); + scene.world().modifyEntities(ItemEntity.class, Entity::discard); - scene.overlay.showText(120) + scene.overlay().showText(120) .placeNearTarget() - .pointAt(util.vector.topOf(psi2)) + .pointAt(util.vector().topOf(psi2)) .text("After no items have been exchanged for a while, the contraption will continue on its way"); - scene.world.modifyBlockEntityNBT(both, psiClass, nbt -> nbt.putFloat("Timer", 2)); + scene.world().modifyBlockEntityNBT(both, psiClass, nbt -> nbt.putFloat("Timer", 2)); scene.idle(15); scene.markAsFinished(); - scene.world.rotateBearing(bearing, 270, 120); - scene.world.rotateSection(contraption, 0, 270, 0, 120); + scene.world().rotateBearing(bearing, 270, 120); + scene.world().rotateSection(contraption, 0, 270, 0, 120); } public static void psiRedstone(SceneBuilder builder, SceneBuildingUtil util) { @@ -172,33 +172,33 @@ public class MovementActorScenes { scene.setSceneOffsetY(-1); Class psiClass = PortableStorageInterfaceBlockEntity.class; - Selection psis = util.select.fromTo(1, 1, 3, 1, 3, 3); - scene.world.modifyBlockEntityNBT(psis, psiClass, nbt -> { + Selection psis = util.select().fromTo(1, 1, 3, 1, 3, 3); + scene.world().modifyBlockEntityNBT(psis, psiClass, nbt -> { nbt.putFloat("Distance", 1); nbt.putFloat("Timer", 12); }); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); scene.idle(5); - scene.world.showSection(util.select.layer(1), Direction.DOWN); + scene.world().showSection(util.select().layer(1), Direction.DOWN); scene.idle(5); ElementLink contraption = - scene.world.showIndependentSection(util.select.layersFrom(2), Direction.DOWN); - BlockPos bearing = util.grid.at(3, 1, 3); - scene.world.configureCenterOfRotation(contraption, util.vector.topOf(bearing)); + scene.world().showIndependentSection(util.select().layersFrom(2), Direction.DOWN); + BlockPos bearing = util.grid().at(3, 1, 3); + scene.world().configureCenterOfRotation(contraption, util.vector().topOf(bearing)); scene.idle(20); - scene.world.modifyBlockEntityNBT(psis, psiClass, nbt -> nbt.putFloat("Timer", 2)); - scene.world.rotateBearing(bearing, 360 * 3 + 270, 240 + 60); - scene.world.rotateSection(contraption, 0, 360 * 3 + 270, 0, 240 + 60); + scene.world().modifyBlockEntityNBT(psis, psiClass, nbt -> nbt.putFloat("Timer", 2)); + scene.world().rotateBearing(bearing, 360 * 3 + 270, 240 + 60); + scene.world().rotateSection(contraption, 0, 360 * 3 + 270, 0, 240 + 60); scene.idle(20); - scene.world.toggleRedstonePower(util.select.fromTo(1, 1, 1, 1, 1, 2)); - scene.effects.indicateRedstone(util.grid.at(1, 1, 1)); + scene.world().toggleRedstonePower(util.select().fromTo(1, 1, 1, 1, 1, 2)); + scene.effects().indicateRedstone(util.grid().at(1, 1, 1)); scene.idle(10); - scene.overlay.showSelectionWithText(util.select.position(1, 1, 3), 120) + scene.overlay().showSelectionWithText(util.select().position(1, 1, 3), 120) .colored(PonderPalette.RED) .text("Redstone power will prevent the stationary interface from engaging"); @@ -212,129 +212,129 @@ public class MovementActorScenes { scene.configureBasePlate(0, 0, 6); scene.scaleSceneView(0.9f); - Selection crops = util.select.fromTo(4, 1, 2, 3, 1, 2) - .add(util.select.fromTo(3, 1, 1, 2, 1, 1) - .add(util.select.position(2, 1, 3)) - .add(util.select.position(1, 1, 2))); + Selection crops = util.select().fromTo(4, 1, 2, 3, 1, 2) + .add(util.select().fromTo(3, 1, 1, 2, 1, 1) + .add(util.select().position(2, 1, 3)) + .add(util.select().position(1, 1, 2))); - scene.world.setBlocks(crops, Blocks.WHEAT.defaultBlockState() + scene.world().setBlocks(crops, Blocks.WHEAT.defaultBlockState() .setValue(CropBlock.AGE, 7), false); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); - BlockPos bearingPos = util.grid.at(4, 1, 4); + BlockPos bearingPos = util.grid().at(4, 1, 4); scene.idle(5); - scene.world.showSection(crops, Direction.UP); - scene.world.showSection(util.select.position(bearingPos), Direction.DOWN); + scene.world().showSection(crops, Direction.UP); + scene.world().showSection(util.select().position(bearingPos), Direction.DOWN); scene.idle(5); ElementLink contraption = - scene.world.showIndependentSection(util.select.fromTo(4, 2, 4, 2, 2, 5) - .add(util.select.fromTo(2, 1, 5, 0, 1, 5)), Direction.DOWN); - scene.world.configureCenterOfRotation(contraption, util.vector.centerOf(bearingPos)); + scene.world().showIndependentSection(util.select().fromTo(4, 2, 4, 2, 2, 5) + .add(util.select().fromTo(2, 1, 5, 0, 1, 5)), Direction.DOWN); + scene.world().configureCenterOfRotation(contraption, util.vector().centerOf(bearingPos)); scene.idle(10); for (int i = 0; i < 3; i++) { - scene.world.showSectionAndMerge(util.select.position(i, 1, 4), Direction.SOUTH, contraption); + scene.world().showSectionAndMerge(util.select().position(i, 1, 4), Direction.SOUTH, contraption); scene.idle(5); } - scene.overlay.showText(60) + scene.overlay().showText(60) .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.blockSurface(util.grid.at(1, 1, 4), Direction.SOUTH)) + .pointAt(util.vector().blockSurface(util.grid().at(1, 1, 4), Direction.SOUTH)) .text("Whenever Harvesters are moved as part of an animated Contraption..."); scene.idle(70); for (int i = 0; i < 3; i++) - scene.world.modifyBlockEntity(util.grid.at(i, 1, 4), HarvesterBlockEntity.class, + scene.world().modifyBlockEntity(util.grid().at(i, 1, 4), HarvesterBlockEntity.class, hte -> hte.setAnimatedSpeed(-150)); - scene.world.rotateBearing(bearingPos, -360, 140); - scene.world.rotateSection(contraption, 0, -360, 0, 140); + scene.world().rotateBearing(bearingPos, -360, 140); + scene.world().rotateSection(contraption, 0, -360, 0, 140); BlockState harvested = Blocks.WHEAT.defaultBlockState(); ItemStack wheatItem = new ItemStack(Items.WHEAT); scene.idle(5); - BlockPos current = util.grid.at(2, 1, 3); - scene.world.setBlock(current, harvested, true); - scene.world.createItemEntity(util.vector.centerOf(current), util.vector.of(0, 0.3, -.2), wheatItem); + BlockPos current = util.grid().at(2, 1, 3); + scene.world().setBlock(current, harvested, true); + scene.world().createItemEntity(util.vector().centerOf(current), util.vector().of(0, 0.3, -.2), wheatItem); scene.idle(5); - current = util.grid.at(1, 1, 2); - scene.world.setBlock(current, harvested, true); - scene.world.createItemEntity(util.vector.centerOf(current), util.vector.of(0, 0.3, -.2), wheatItem); + current = util.grid().at(1, 1, 2); + scene.world().setBlock(current, harvested, true); + scene.world().createItemEntity(util.vector().centerOf(current), util.vector().of(0, 0.3, -.2), wheatItem); scene.idle(5); - current = util.grid.at(3, 1, 2); - scene.world.setBlock(current, harvested, true); - scene.world.createItemEntity(util.vector.centerOf(current), util.vector.of(.1, 0.3, -.1), wheatItem); - current = util.grid.at(2, 1, 1); - scene.world.setBlock(current, harvested, true); - scene.world.createItemEntity(util.vector.centerOf(current), util.vector.of(.1, 0.3, -.1), wheatItem); + current = util.grid().at(3, 1, 2); + scene.world().setBlock(current, harvested, true); + scene.world().createItemEntity(util.vector().centerOf(current), util.vector().of(.1, 0.3, -.1), wheatItem); + current = util.grid().at(2, 1, 1); + scene.world().setBlock(current, harvested, true); + scene.world().createItemEntity(util.vector().centerOf(current), util.vector().of(.1, 0.3, -.1), wheatItem); scene.idle(5); - current = util.grid.at(3, 1, 1); - scene.world.setBlock(current, harvested, true); - scene.world.createItemEntity(util.vector.centerOf(current), util.vector.of(.1, 0.3, -.1), wheatItem); + current = util.grid().at(3, 1, 1); + scene.world().setBlock(current, harvested, true); + scene.world().createItemEntity(util.vector().centerOf(current), util.vector().of(.1, 0.3, -.1), wheatItem); scene.idle(5); - current = util.grid.at(4, 1, 2); - scene.world.setBlock(current, harvested, true); - scene.world.createItemEntity(util.vector.centerOf(current), util.vector.of(.2, 0.3, 0), wheatItem); + current = util.grid().at(4, 1, 2); + scene.world().setBlock(current, harvested, true); + scene.world().createItemEntity(util.vector().centerOf(current), util.vector().of(.2, 0.3, 0), wheatItem); - scene.overlay.showText(80) - .pointAt(util.vector.topOf(1, 0, 2)) + scene.overlay().showText(80) + .pointAt(util.vector().topOf(1, 0, 2)) .text("They will harvest and reset any mature crops on their way") .placeNearTarget(); scene.idle(101); - scene.world.hideSection(crops, Direction.DOWN); + scene.world().hideSection(crops, Direction.DOWN); scene.idle(15); - scene.world.modifyEntities(ItemEntity.class, Entity::discard); - scene.world.setBlocks(crops, Blocks.WHEAT.defaultBlockState() + scene.world().modifyEntities(ItemEntity.class, Entity::discard); + scene.world().setBlocks(crops, Blocks.WHEAT.defaultBlockState() .setValue(CropBlock.AGE, 7), false); - scene.world.showSection(crops, Direction.UP); + scene.world().showSection(crops, Direction.UP); for (int i = 0; i < 3; i++) - scene.world.modifyBlockEntity(util.grid.at(i, 1, 4), HarvesterBlockEntity.class, + scene.world().modifyBlockEntity(util.grid().at(i, 1, 4), HarvesterBlockEntity.class, hte -> hte.setAnimatedSpeed(0)); scene.idle(10); - scene.world.cycleBlockProperty(util.grid.at(1, 1, 5), LinearChassisBlock.STICKY_TOP); - scene.world.glueBlockOnto(util.grid.at(1, 2, 5), Direction.DOWN, contraption); + scene.world().cycleBlockProperty(util.grid().at(1, 1, 5), LinearChassisBlock.STICKY_TOP); + scene.world().glueBlockOnto(util.grid().at(1, 2, 5), Direction.DOWN, contraption); - scene.overlay.showText(60) + scene.overlay().showText(60) .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.blockSurface(util.grid.at(1, 2, 5), Direction.WEST)) + .pointAt(util.vector().blockSurface(util.grid().at(1, 2, 5), Direction.WEST)) .sharedText("storage_on_contraption"); scene.idle(70); for (int i = 0; i < 3; i++) - scene.world.modifyBlockEntity(util.grid.at(i, 1, 4), HarvesterBlockEntity.class, + scene.world().modifyBlockEntity(util.grid().at(i, 1, 4), HarvesterBlockEntity.class, hte -> hte.setAnimatedSpeed(-150)); - scene.world.rotateBearing(bearingPos, -360, 140); - scene.world.rotateSection(contraption, 0, -360, 0, 140); + scene.world().rotateBearing(bearingPos, -360, 140); + scene.world().rotateSection(contraption, 0, -360, 0, 140); scene.idle(5); - current = util.grid.at(2, 1, 3); - scene.world.setBlock(current, harvested, true); + current = util.grid().at(2, 1, 3); + scene.world().setBlock(current, harvested, true); scene.idle(5); - current = util.grid.at(1, 1, 2); - scene.world.setBlock(current, harvested, true); + current = util.grid().at(1, 1, 2); + scene.world().setBlock(current, harvested, true); scene.idle(5); - current = util.grid.at(3, 1, 2); - scene.world.setBlock(current, harvested, true); - current = util.grid.at(2, 1, 1); - scene.world.setBlock(current, harvested, true); + current = util.grid().at(3, 1, 2); + scene.world().setBlock(current, harvested, true); + current = util.grid().at(2, 1, 1); + scene.world().setBlock(current, harvested, true); scene.idle(5); - current = util.grid.at(3, 1, 1); - scene.world.setBlock(current, harvested, true); + current = util.grid().at(3, 1, 1); + scene.world().setBlock(current, harvested, true); scene.idle(5); - current = util.grid.at(4, 1, 2); - scene.world.setBlock(current, harvested, true); + current = util.grid().at(4, 1, 2); + scene.world().setBlock(current, harvested, true); scene.idle(116); - scene.overlay - .showControls(new InputWindowElement(util.vector.topOf(1, 2, 5), Pointing.DOWN).withItem(wheatItem), 50); + scene.overlay() + .showControls(new InputWindowElement(util.vector().topOf(1, 2, 5), Pointing.DOWN).withItem(wheatItem), 50); for (int i = 0; i < 3; i++) - scene.world.modifyBlockEntity(util.grid.at(i, 1, 4), HarvesterBlockEntity.class, + scene.world().modifyBlockEntity(util.grid().at(i, 1, 4), HarvesterBlockEntity.class, hte -> hte.setAnimatedSpeed(0)); } @@ -344,175 +344,175 @@ public class MovementActorScenes { scene.configureBasePlate(0, 0, 6); scene.scaleSceneView(0.9f); - Selection garbage = util.select.fromTo(2, 1, 3, 1, 1, 2); - Selection kinetics = util.select.fromTo(5, 1, 6, 5, 1, 2); - Selection dynamic = util.select.fromTo(4, 0, 6, 5, 1, 6); + Selection garbage = util.select().fromTo(2, 1, 3, 1, 1, 2); + Selection kinetics = util.select().fromTo(5, 1, 6, 5, 1, 2); + Selection dynamic = util.select().fromTo(4, 0, 6, 5, 1, 6); scene.showBasePlate(); ElementLink cogs = - scene.world.showIndependentSection(util.select.fromTo(4, 0, 6, 5, 1, 6), Direction.UP); + scene.world().showIndependentSection(util.select().fromTo(4, 0, 6, 5, 1, 6), Direction.UP); scene.idle(5); - scene.world.showSection(kinetics.substract(dynamic), Direction.DOWN); + scene.world().showSection(kinetics.substract(dynamic), Direction.DOWN); ElementLink pistonHead = - scene.world.showIndependentSection(util.select.fromTo(5, 1, 1, 7, 1, 1), Direction.DOWN); - scene.world.moveSection(pistonHead, util.vector.of(0, 0, 1), 0); + scene.world().showIndependentSection(util.select().fromTo(5, 1, 1, 7, 1, 1), Direction.DOWN); + scene.world().moveSection(pistonHead, util.vector().of(0, 0, 1), 0); scene.idle(5); ElementLink contraption = - scene.world.showIndependentSection(util.select.fromTo(4, 1, 3, 4, 1, 2), Direction.DOWN); + scene.world().showIndependentSection(util.select().fromTo(4, 1, 3, 4, 1, 2), Direction.DOWN); scene.idle(10); - scene.world.showSectionAndMerge(util.select.position(3, 1, 3), Direction.EAST, contraption); + scene.world().showSectionAndMerge(util.select().position(3, 1, 3), Direction.EAST, contraption); scene.idle(5); - scene.world.showSectionAndMerge(util.select.position(3, 1, 2), Direction.EAST, contraption); + scene.world().showSectionAndMerge(util.select().position(3, 1, 2), Direction.EAST, contraption); scene.idle(20); - scene.overlay.showText(60) + scene.overlay().showText(60) .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.blockSurface(util.grid.at(3, 1, 3), Direction.EAST)) + .pointAt(util.vector().blockSurface(util.grid().at(3, 1, 3), Direction.EAST)) .text("Whenever Ploughs are moved as part of an animated Contraption..."); scene.idle(50); - scene.world.showSection(garbage, Direction.EAST); + scene.world().showSection(garbage, Direction.EAST); scene.idle(20); - scene.world.setKineticSpeed(util.select.position(4, 0, 6), -8); - scene.world.setKineticSpeed(kinetics, 16); - scene.world.moveSection(pistonHead, util.vector.of(-2, 0, 0), 60); - scene.world.moveSection(contraption, util.vector.of(-2, 0, 0), 60); + scene.world().setKineticSpeed(util.select().position(4, 0, 6), -8); + scene.world().setKineticSpeed(kinetics, 16); + scene.world().moveSection(pistonHead, util.vector().of(-2, 0, 0), 60); + scene.world().moveSection(contraption, util.vector().of(-2, 0, 0), 60); scene.idle(15); - Vec3 m = util.vector.of(-0.1, .2, 0); - scene.world.destroyBlock(util.grid.at(2, 1, 3)); - scene.world.createItemEntity(util.vector.centerOf(2, 1, 3), m, new ItemStack(Items.LEVER)); - scene.world.destroyBlock(util.grid.at(2, 1, 2)); - scene.world.createItemEntity(util.vector.centerOf(2, 1, 2), m, new ItemStack(Items.TORCH)); + Vec3 m = util.vector().of(-0.1, .2, 0); + scene.world().destroyBlock(util.grid().at(2, 1, 3)); + scene.world().createItemEntity(util.vector().centerOf(2, 1, 3), m, new ItemStack(Items.LEVER)); + scene.world().destroyBlock(util.grid().at(2, 1, 2)); + scene.world().createItemEntity(util.vector().centerOf(2, 1, 2), m, new ItemStack(Items.TORCH)); scene.idle(30); - scene.world.destroyBlock(util.grid.at(1, 1, 3)); - scene.world.createItemEntity(util.vector.centerOf(1, 1, 3), m, new ItemStack(Items.RAIL)); - scene.world.destroyBlock(util.grid.at(1, 1, 2)); - scene.world.createItemEntity(util.vector.centerOf(1, 1, 2), m, new ItemStack(Items.REDSTONE)); + scene.world().destroyBlock(util.grid().at(1, 1, 3)); + scene.world().createItemEntity(util.vector().centerOf(1, 1, 3), m, new ItemStack(Items.RAIL)); + scene.world().destroyBlock(util.grid().at(1, 1, 2)); + scene.world().createItemEntity(util.vector().centerOf(1, 1, 2), m, new ItemStack(Items.REDSTONE)); - scene.overlay.showText(60) + scene.overlay().showText(60) .placeNearTarget() - .pointAt(util.vector.blockSurface(util.grid.at(1, 1, 3), Direction.EAST)) + .pointAt(util.vector().blockSurface(util.grid().at(1, 1, 3), Direction.EAST)) .text("...they will break blocks without a solid collision hitbox"); scene.idle(50); - scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); - scene.world.moveSection(pistonHead, util.vector.of(2, 0, 0), 40); - scene.world.moveSection(contraption, util.vector.of(2, 0, 0), 40); - scene.world.hideSection(garbage, Direction.UP); + scene.world().modifyKineticSpeed(util.select().everywhere(), f -> -f); + scene.world().moveSection(pistonHead, util.vector().of(2, 0, 0), 40); + scene.world().moveSection(contraption, util.vector().of(2, 0, 0), 40); + scene.world().hideSection(garbage, Direction.UP); scene.idle(40); - scene.world.setBlocks(garbage, Blocks.SNOW.defaultBlockState(), false); - scene.world.modifyEntities(ItemEntity.class, Entity::discard); + scene.world().setBlocks(garbage, Blocks.SNOW.defaultBlockState(), false); + scene.world().modifyEntities(ItemEntity.class, Entity::discard); ElementLink chest = - scene.world.showIndependentSection(util.select.position(4, 2, 2), Direction.DOWN); + scene.world().showIndependentSection(util.select().position(4, 2, 2), Direction.DOWN); - scene.overlay.showText(60) + scene.overlay().showText(60) .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.blockSurface(util.grid.at(4, 2, 2), Direction.WEST)) + .pointAt(util.vector().blockSurface(util.grid().at(4, 2, 2), Direction.WEST)) .sharedText("storage_on_contraption"); scene.idle(15); - scene.effects.superGlue(util.grid.at(4, 2, 2), Direction.DOWN, true); + scene.effects().superGlue(util.grid().at(4, 2, 2), Direction.DOWN, true); scene.idle(45); - scene.world.showSection(garbage, Direction.EAST); + scene.world().showSection(garbage, Direction.EAST); scene.idle(20); - scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); - scene.world.moveSection(pistonHead, util.vector.of(-2, 0, 0), 60); - scene.world.moveSection(contraption, util.vector.of(-2, 0, 0), 60); - scene.world.moveSection(chest, util.vector.of(-2, 0, 0), 60); + scene.world().modifyKineticSpeed(util.select().everywhere(), f -> -f); + scene.world().moveSection(pistonHead, util.vector().of(-2, 0, 0), 60); + scene.world().moveSection(contraption, util.vector().of(-2, 0, 0), 60); + scene.world().moveSection(chest, util.vector().of(-2, 0, 0), 60); scene.idle(15); - scene.world.destroyBlock(util.grid.at(2, 1, 3)); - scene.world.destroyBlock(util.grid.at(2, 1, 2)); + scene.world().destroyBlock(util.grid().at(2, 1, 3)); + scene.world().destroyBlock(util.grid().at(2, 1, 2)); scene.idle(30); - scene.world.destroyBlock(util.grid.at(1, 1, 3)); - scene.world.destroyBlock(util.grid.at(1, 1, 2)); + scene.world().destroyBlock(util.grid().at(1, 1, 3)); + scene.world().destroyBlock(util.grid().at(1, 1, 2)); scene.idle(15); - scene.overlay.showControls( - new InputWindowElement(util.vector.topOf(2, 2, 2), Pointing.DOWN).withItem(new ItemStack(Items.SNOWBALL)), + scene.overlay().showControls( + new InputWindowElement(util.vector().topOf(2, 2, 2), Pointing.DOWN).withItem(new ItemStack(Items.SNOWBALL)), 40); scene.idle(40); - scene.world.hideIndependentSection(chest, Direction.UP); - scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); - scene.world.moveSection(pistonHead, util.vector.of(2, 0, 0), 40); - scene.world.moveSection(contraption, util.vector.of(2, 0, 0), 40); + scene.world().hideIndependentSection(chest, Direction.UP); + scene.world().modifyKineticSpeed(util.select().everywhere(), f -> -f); + scene.world().moveSection(pistonHead, util.vector().of(2, 0, 0), 40); + scene.world().moveSection(contraption, util.vector().of(2, 0, 0), 40); scene.idle(40); - Selection dirt = util.select.fromTo(2, 0, 3, 1, 0, 2); - scene.world.hideSection(dirt, Direction.DOWN); + Selection dirt = util.select().fromTo(2, 0, 3, 1, 0, 2); + scene.world().hideSection(dirt, Direction.DOWN); scene.idle(15); - scene.world.setBlocks(dirt, Blocks.GRASS_BLOCK.defaultBlockState(), false); - scene.world.showSection(dirt, Direction.UP); - scene.overlay.showText(60) + scene.world().setBlocks(dirt, Blocks.GRASS_BLOCK.defaultBlockState(), false); + scene.world().showSection(dirt, Direction.UP); + scene.overlay().showText(60) .placeNearTarget() .attachKeyFrame() - .pointAt(util.vector.blockSurface(util.grid.at(3, 1, 3), Direction.EAST)) + .pointAt(util.vector().blockSurface(util.grid().at(3, 1, 3), Direction.EAST)) .text("Additionally, ploughs can create farmland"); scene.idle(30); - scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); - scene.world.moveSection(pistonHead, util.vector.of(-2, 0, 0), 60); - scene.world.moveSection(contraption, util.vector.of(-2, 0, 0), 60); - scene.world.moveSection(chest, util.vector.of(-2, 0, 0), 60); + scene.world().modifyKineticSpeed(util.select().everywhere(), f -> -f); + scene.world().moveSection(pistonHead, util.vector().of(-2, 0, 0), 60); + scene.world().moveSection(contraption, util.vector().of(-2, 0, 0), 60); + scene.world().moveSection(chest, util.vector().of(-2, 0, 0), 60); scene.idle(15); - scene.world.setBlocks(util.select.fromTo(2, 0, 2, 2, 0, 3), Blocks.FARMLAND.defaultBlockState(), true); + scene.world().setBlocks(util.select().fromTo(2, 0, 2, 2, 0, 3), Blocks.FARMLAND.defaultBlockState(), true); scene.idle(30); - scene.world.setBlocks(util.select.fromTo(1, 0, 2, 1, 0, 3), Blocks.FARMLAND.defaultBlockState(), true); + scene.world().setBlocks(util.select().fromTo(1, 0, 2, 1, 0, 3), Blocks.FARMLAND.defaultBlockState(), true); scene.idle(20); - scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); - scene.world.moveSection(pistonHead, util.vector.of(2, 0, 0), 40); - scene.world.moveSection(contraption, util.vector.of(2, 0, 0), 40); + scene.world().modifyKineticSpeed(util.select().everywhere(), f -> -f); + scene.world().moveSection(pistonHead, util.vector().of(2, 0, 0), 40); + scene.world().moveSection(contraption, util.vector().of(2, 0, 0), 40); scene.idle(50); - scene.world.setKineticSpeed(util.select.everywhere(), 0); - scene.world.hideSection(kinetics.substract(dynamic), Direction.EAST); - scene.world.hideSection(dirt, Direction.DOWN); - scene.world.hideIndependentSection(pistonHead, Direction.EAST); - scene.world.moveSection(cogs, util.vector.of(-1, 0, 0), 15); + scene.world().setKineticSpeed(util.select().everywhere(), 0); + scene.world().hideSection(kinetics.substract(dynamic), Direction.EAST); + scene.world().hideSection(dirt, Direction.DOWN); + scene.world().hideIndependentSection(pistonHead, Direction.EAST); + scene.world().moveSection(cogs, util.vector().of(-1, 0, 0), 15); scene.idle(15); - scene.world.restoreBlocks(dirt); - scene.world.showSection(dirt, Direction.UP); - scene.world.showSection(util.select.fromTo(4, 1, 6, 4, 3, 4), Direction.NORTH); + scene.world().restoreBlocks(dirt); + scene.world().showSection(dirt, Direction.UP); + scene.world().showSection(util.select().fromTo(4, 1, 6, 4, 3, 4), Direction.NORTH); scene.idle(15); - scene.world.showSectionAndMerge(util.select.fromTo(4, 3, 3, 4, 2, 3), Direction.DOWN, contraption); + scene.world().showSectionAndMerge(util.select().fromTo(4, 3, 3, 4, 2, 3), Direction.DOWN, contraption); scene.idle(15); - BlockPos bearingPos = util.grid.at(4, 3, 4); + BlockPos bearingPos = util.grid().at(4, 3, 4); scene.addKeyframe(); - scene.world.setKineticSpeed(util.select.position(4, 0, 6), 8); - scene.world.setKineticSpeed(util.select.position(5, 1, 6), -16); - scene.world.setKineticSpeed(util.select.position(4, 3, 5), -16); - scene.world.setKineticSpeed(util.select.position(4, 1, 5), -16); - scene.world.setKineticSpeed(util.select.position(4, 2, 5), 16); - scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -2 * f); - scene.world.configureCenterOfRotation(contraption, util.vector.centerOf(bearingPos)); - scene.world.rotateSection(contraption, 0, 0, 90, 20); - scene.world.rotateBearing(bearingPos, 90, 20); + scene.world().setKineticSpeed(util.select().position(4, 0, 6), 8); + scene.world().setKineticSpeed(util.select().position(5, 1, 6), -16); + scene.world().setKineticSpeed(util.select().position(4, 3, 5), -16); + scene.world().setKineticSpeed(util.select().position(4, 1, 5), -16); + scene.world().setKineticSpeed(util.select().position(4, 2, 5), 16); + scene.world().modifyKineticSpeed(util.select().everywhere(), f -> -2 * f); + scene.world().configureCenterOfRotation(contraption, util.vector().centerOf(bearingPos)); + scene.world().rotateSection(contraption, 0, 0, 90, 20); + scene.world().rotateBearing(bearingPos, 90, 20); scene.idle(10); - ElementLink birb = scene.special.createBirb(util.vector.topOf(3, 0, 2) + ElementLink birb = scene.special().createBirb(util.vector().topOf(3, 0, 2) .add(0, 0, 0.5), ParrotElement.FlappyPose::new); scene.idle(11); - scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -2 * f); - scene.world.rotateSection(contraption, 0, 0, -135, 10); - scene.world.rotateBearing(bearingPos, -135, 10); + scene.world().modifyKineticSpeed(util.select().everywhere(), f -> -2 * f); + scene.world().rotateSection(contraption, 0, 0, -135, 10); + scene.world().rotateBearing(bearingPos, -135, 10); scene.idle(7); - scene.special.moveParrot(birb, util.vector.of(-20, 15, 0), 20); - scene.special.rotateParrot(birb, 0, 360, 0, 20); + scene.special().moveParrot(birb, util.vector().of(-20, 15, 0), 20); + scene.special().rotateParrot(birb, 0, 360, 0, 20); scene.idle(3); - scene.world.setKineticSpeed(util.select.everywhere(), 0); + scene.world().setKineticSpeed(util.select().everywhere(), 0); scene.idle(20); - scene.overlay.showText(60) + scene.overlay().showText(60) .placeNearTarget() - .pointAt(util.vector.centerOf(util.grid.at(1, 3, 2))) + .pointAt(util.vector().centerOf(util.grid().at(1, 3, 2))) .text("...they can also launch entities without hurting them"); scene.idle(30); } @@ -524,234 +524,234 @@ public class MovementActorScenes { scene.scaleSceneView(0.9f); scene.showBasePlate(); - BlockPos cobblePos = util.grid.at(3, 1, 2); - BlockPos wheatPos = util.grid.at(2, 1, 1); - BlockPos bearingPos = util.grid.at(5, 1, 4); - Selection contraption = util.select.fromTo(5, 2, 4, 3, 2, 5) - .add(util.select.fromTo(3, 1, 5, 1, 1, 4)); - BlockPos controlsPos1 = util.grid.at(1, 2, 5); - BlockPos controlsPos2 = util.grid.at(2, 2, 5); - BlockPos drillPos = util.grid.at(2, 1, 4); - BlockPos harvesterPos = util.grid.at(1, 1, 4); - Selection leverCol = util.select.fromTo(0, 0, 5, 0, 2, 5); - BlockPos leverPos = util.grid.at(0, 2, 5); + BlockPos cobblePos = util.grid().at(3, 1, 2); + BlockPos wheatPos = util.grid().at(2, 1, 1); + BlockPos bearingPos = util.grid().at(5, 1, 4); + Selection contraption = util.select().fromTo(5, 2, 4, 3, 2, 5) + .add(util.select().fromTo(3, 1, 5, 1, 1, 4)); + BlockPos controlsPos1 = util.grid().at(1, 2, 5); + BlockPos controlsPos2 = util.grid().at(2, 2, 5); + BlockPos drillPos = util.grid().at(2, 1, 4); + BlockPos harvesterPos = util.grid().at(1, 1, 4); + Selection leverCol = util.select().fromTo(0, 0, 5, 0, 2, 5); + BlockPos leverPos = util.grid().at(0, 2, 5); scene.idle(5); - scene.world.showSection(util.select.position(wheatPos), Direction.UP); - scene.world.showSection(util.select.position(cobblePos), Direction.UP); + scene.world().showSection(util.select().position(wheatPos), Direction.UP); + scene.world().showSection(util.select().position(cobblePos), Direction.UP); scene.idle(10); - scene.world.showSection(util.select.position(bearingPos), Direction.DOWN); + scene.world().showSection(util.select().position(bearingPos), Direction.DOWN); scene.idle(5); ElementLink contraptionLink = - scene.world.showIndependentSection(contraption, Direction.DOWN); - scene.world.configureCenterOfRotation(contraptionLink, util.vector.centerOf(bearingPos)); + scene.world().showIndependentSection(contraption, Direction.DOWN); + scene.world().configureCenterOfRotation(contraptionLink, util.vector().centerOf(bearingPos)); scene.idle(10); - scene.world.modifyBlockEntity(harvesterPos, HarvesterBlockEntity.class, hte -> hte.setAnimatedSpeed(-280)); - scene.world.setKineticSpeed(util.select.position(drillPos), 64); - scene.world.rotateBearing(bearingPos, -30, 20); - scene.world.rotateSection(contraptionLink, 0, -30, 0, 20); + scene.world().modifyBlockEntity(harvesterPos, HarvesterBlockEntity.class, hte -> hte.setAnimatedSpeed(-280)); + scene.world().setKineticSpeed(util.select().position(drillPos), 64); + scene.world().rotateBearing(bearingPos, -30, 20); + scene.world().rotateSection(contraptionLink, 0, -30, 0, 20); BlockState harvested = Blocks.WHEAT.defaultBlockState(); scene.idle(20); - scene.overlay.showText(60) + scene.overlay().showText(60) .placeNearTarget() - .pointAt(util.vector.topOf(cobblePos)) + .pointAt(util.vector().topOf(cobblePos)) .text("Actors on moving contraptions are always active by default"); for (int i = 0; i < 10; i++) { scene.idle(3); - scene.world.incrementBlockBreakingProgress(cobblePos); + scene.world().incrementBlockBreakingProgress(cobblePos); } - Vec3 m = util.vector.of(.1, 0, -.1); + Vec3 m = util.vector().of(.1, 0, -.1); ItemStack cobbleItem = new ItemStack(Items.COBBLESTONE); ItemStack wheatItem = new ItemStack(Items.WHEAT); - ElementLink item1 = scene.world.createItemEntity(util.vector.centerOf(cobblePos), m, cobbleItem); + ElementLink item1 = scene.world().createItemEntity(util.vector().centerOf(cobblePos), m, cobbleItem); scene.idle(5); - scene.world.rotateBearing(bearingPos, -60, 40); - scene.world.rotateSection(contraptionLink, 0, -60, 0, 40); + scene.world().rotateBearing(bearingPos, -60, 40); + scene.world().rotateSection(contraptionLink, 0, -60, 0, 40); scene.idle(5); - scene.world.setBlock(wheatPos, harvested, true); - ElementLink item2 = scene.world.createItemEntity(util.vector.centerOf(wheatPos), m, wheatItem); + scene.world().setBlock(wheatPos, harvested, true); + ElementLink item2 = scene.world().createItemEntity(util.vector().centerOf(wheatPos), m, wheatItem); scene.idle(35); - scene.world.modifyBlockEntity(harvesterPos, HarvesterBlockEntity.class, hte -> hte.setAnimatedSpeed(0)); - scene.world.setKineticSpeed(util.select.position(drillPos), 0); + scene.world().modifyBlockEntity(harvesterPos, HarvesterBlockEntity.class, hte -> hte.setAnimatedSpeed(0)); + scene.world().setKineticSpeed(util.select().position(drillPos), 0); scene.idle(5); - scene.world.modifyEntity(item1, Entity::discard); - scene.world.modifyEntity(item2, Entity::discard); - scene.world.hideIndependentSection(contraptionLink, Direction.UP); + scene.world().modifyEntity(item1, Entity::discard); + scene.world().modifyEntity(item2, Entity::discard); + scene.world().hideIndependentSection(contraptionLink, Direction.UP); scene.idle(15); - contraptionLink = scene.world.showIndependentSection(contraption, Direction.DOWN); - scene.world.configureCenterOfRotation(contraptionLink, util.vector.centerOf(bearingPos)); - scene.world.moveSection(contraptionLink, util.vector.of(0, 1 / 512f, 0), 0); + contraptionLink = scene.world().showIndependentSection(contraption, Direction.DOWN); + scene.world().configureCenterOfRotation(contraptionLink, util.vector().centerOf(bearingPos)); + scene.world().moveSection(contraptionLink, util.vector().of(0, 1 / 512f, 0), 0); - scene.world.restoreBlocks(util.select.position(wheatPos)); - scene.world.restoreBlocks(util.select.position(cobblePos)); + scene.world().restoreBlocks(util.select().position(wheatPos)); + scene.world().restoreBlocks(util.select().position(cobblePos)); scene.idle(10); - scene.world.showSectionAndMerge(util.select.position(controlsPos1), Direction.DOWN, contraptionLink); + scene.world().showSectionAndMerge(util.select().position(controlsPos1), Direction.DOWN, contraptionLink); scene.idle(15); - scene.effects.superGlue(controlsPos1, Direction.DOWN, true); + scene.effects().superGlue(controlsPos1, Direction.DOWN, true); - scene.overlay.showText(60) + scene.overlay().showText(60) .placeNearTarget() - .pointAt(util.vector.topOf(controlsPos1) + .pointAt(util.vector().topOf(controlsPos1) .add(0, -4 / 16f, 0)) .attachKeyFrame() .text("Contraption Controls can be used to toggle them on the fly"); scene.idle(55); - scene.world.rotateBearing(bearingPos, -15, 10); - scene.world.rotateSection(contraptionLink, 0, -15, 0, 10); - scene.world.modifyBlockEntity(harvesterPos, HarvesterBlockEntity.class, hte -> hte.setAnimatedSpeed(-280)); - scene.world.setKineticSpeed(util.select.position(drillPos), 64); + scene.world().rotateBearing(bearingPos, -15, 10); + scene.world().rotateSection(contraptionLink, 0, -15, 0, 10); + scene.world().modifyBlockEntity(harvesterPos, HarvesterBlockEntity.class, hte -> hte.setAnimatedSpeed(-280)); + scene.world().setKineticSpeed(util.select().position(drillPos), 64); scene.idle(10); - scene.world.modifyBlockEntity(harvesterPos, HarvesterBlockEntity.class, hte -> hte.setAnimatedSpeed(0)); - scene.world.setKineticSpeed(util.select.position(drillPos), 0); - scene.overlay.showControls(new InputWindowElement(util.vector.of(1.5, 2.75, 4.5), Pointing.DOWN).rightClick(), - 15); + scene.world().modifyBlockEntity(harvesterPos, HarvesterBlockEntity.class, hte -> hte.setAnimatedSpeed(0)); + scene.world().setKineticSpeed(util.select().position(drillPos), 0); + scene.overlay().showControls(new InputWindowElement(util.vector().of(1.5, 2.75, 4.5), Pointing.DOWN).rightClick(), + 15); scene.idle(7); - scene.world.modifyBlockEntity(controlsPos1, ContraptionControlsBlockEntity.class, ccte -> ccte.disabled = true); - scene.effects.indicateRedstone(util.grid.at(1, 2, 4)); + scene.world().modifyBlockEntity(controlsPos1, ContraptionControlsBlockEntity.class, ccte -> ccte.disabled = true); + scene.effects().indicateRedstone(util.grid().at(1, 2, 4)); scene.idle(10); - scene.world.rotateBearing(bearingPos, -60, 40); - scene.world.rotateSection(contraptionLink, 0, -60, 0, 40); + scene.world().rotateBearing(bearingPos, -60, 40); + scene.world().rotateSection(contraptionLink, 0, -60, 0, 40); scene.idle(40); - scene.overlay.showControls(new InputWindowElement(util.vector.of(3.5, 2.75, 1), Pointing.DOWN).rightClick(), - 15); + scene.overlay().showControls(new InputWindowElement(util.vector().of(3.5, 2.75, 1), Pointing.DOWN).rightClick(), + 15); scene.idle(7); - scene.world.modifyBlockEntity(controlsPos1, ContraptionControlsBlockEntity.class, + scene.world().modifyBlockEntity(controlsPos1, ContraptionControlsBlockEntity.class, ccte -> ccte.disabled = false); - scene.effects.indicateRedstone(util.grid.at(3, 2, 0)); + scene.effects().indicateRedstone(util.grid().at(3, 2, 0)); scene.idle(10); - scene.world.modifyBlockEntity(harvesterPos, HarvesterBlockEntity.class, hte -> hte.setAnimatedSpeed(-280)); - scene.world.setKineticSpeed(util.select.position(drillPos), 64); - scene.world.rotateBearing(bearingPos, -15, 10); - scene.world.rotateSection(contraptionLink, 0, -15, 0, 10); + scene.world().modifyBlockEntity(harvesterPos, HarvesterBlockEntity.class, hte -> hte.setAnimatedSpeed(-280)); + scene.world().setKineticSpeed(util.select().position(drillPos), 64); + scene.world().rotateBearing(bearingPos, -15, 10); + scene.world().rotateSection(contraptionLink, 0, -15, 0, 10); scene.idle(10); - scene.world.modifyBlockEntity(harvesterPos, HarvesterBlockEntity.class, hte -> hte.setAnimatedSpeed(0)); - scene.world.setKineticSpeed(util.select.position(drillPos), 0); + scene.world().modifyBlockEntity(harvesterPos, HarvesterBlockEntity.class, hte -> hte.setAnimatedSpeed(0)); + scene.world().setKineticSpeed(util.select().position(drillPos), 0); scene.idle(5); - scene.world.hideIndependentSection(contraptionLink, Direction.UP); + scene.world().hideIndependentSection(contraptionLink, Direction.UP); scene.idle(15); - contraptionLink = scene.world.showIndependentSection(contraption, Direction.DOWN); - scene.world.showSectionAndMerge(util.select.position(controlsPos1), Direction.DOWN, contraptionLink); - scene.world.configureCenterOfRotation(contraptionLink, util.vector.centerOf(bearingPos)); - scene.world.moveSection(contraptionLink, util.vector.of(0, 1 / 512f, 0), 0); + contraptionLink = scene.world().showIndependentSection(contraption, Direction.DOWN); + scene.world().showSectionAndMerge(util.select().position(controlsPos1), Direction.DOWN, contraptionLink); + scene.world().configureCenterOfRotation(contraptionLink, util.vector().centerOf(bearingPos)); + scene.world().moveSection(contraptionLink, util.vector().of(0, 1 / 512f, 0), 0); scene.idle(15); - scene.world.showSectionAndMerge(util.select.position(controlsPos2), Direction.DOWN, contraptionLink); + scene.world().showSectionAndMerge(util.select().position(controlsPos2), Direction.DOWN, contraptionLink); scene.idle(15); - scene.effects.superGlue(controlsPos2, Direction.DOWN, true); + scene.effects().superGlue(controlsPos2, Direction.DOWN, true); - scene.overlay.showText(60) + scene.overlay().showText(60) .placeNearTarget() - .pointAt(util.vector.topOf(controlsPos2) + .pointAt(util.vector().topOf(controlsPos2) .add(0, -4 / 16f, 0)) .attachKeyFrame() .text("They can be attached anywhere on the contraption"); scene.idle(75); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(controlsPos2), Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(controlsPos2), Pointing.DOWN).rightClick() .withItem(AllBlocks.MECHANICAL_DRILL.asStack()), 30); scene.idle(5); - scene.overlay.showControls(new InputWindowElement(util.vector.centerOf(controlsPos1), Pointing.UP).rightClick() + scene.overlay().showControls(new InputWindowElement(util.vector().centerOf(controlsPos1), Pointing.UP).rightClick() .withItem(AllBlocks.MECHANICAL_HARVESTER.asStack()), 25); scene.idle(2); - scene.world.setFilterData(util.select.position(controlsPos2), ContraptionControlsBlockEntity.class, - AllBlocks.MECHANICAL_DRILL.asStack()); + scene.world().setFilterData(util.select().position(controlsPos2), ContraptionControlsBlockEntity.class, + AllBlocks.MECHANICAL_DRILL.asStack()); scene.idle(5); - scene.world.setFilterData(util.select.position(controlsPos1), ContraptionControlsBlockEntity.class, - AllBlocks.MECHANICAL_HARVESTER.asStack()); + scene.world().setFilterData(util.select().position(controlsPos1), ContraptionControlsBlockEntity.class, + AllBlocks.MECHANICAL_HARVESTER.asStack()); scene.idle(30); - scene.overlay.showText(90) + scene.overlay().showText(90) .placeNearTarget() .independent(80) .attachKeyFrame() .text("While disassembled, the filter can be changed to target specific types of actors"); scene.idle(90); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(controlsPos2), Pointing.RIGHT).rightClick(), - 15); + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(controlsPos2), Pointing.RIGHT).rightClick(), + 15); scene.idle(7); - scene.world.modifyBlockEntity(controlsPos2, ContraptionControlsBlockEntity.class, ccte -> ccte.disabled = true); - scene.effects.indicateRedstone(controlsPos2); + scene.world().modifyBlockEntity(controlsPos2, ContraptionControlsBlockEntity.class, ccte -> ccte.disabled = true); + scene.effects().indicateRedstone(controlsPos2); scene.idle(10); - scene.world.modifyBlockEntity(harvesterPos, HarvesterBlockEntity.class, hte -> hte.setAnimatedSpeed(-280)); - scene.world.rotateBearing(bearingPos, -90, 60); - scene.world.rotateSection(contraptionLink, 0, -90, 0, 60); + scene.world().modifyBlockEntity(harvesterPos, HarvesterBlockEntity.class, hte -> hte.setAnimatedSpeed(-280)); + scene.world().rotateBearing(bearingPos, -90, 60); + scene.world().rotateSection(contraptionLink, 0, -90, 0, 60); scene.idle(25); - scene.world.setBlock(wheatPos, harvested, true); - ElementLink item3 = scene.world.createItemEntity(util.vector.centerOf(wheatPos), m, wheatItem); + scene.world().setBlock(wheatPos, harvested, true); + ElementLink item3 = scene.world().createItemEntity(util.vector().centerOf(wheatPos), m, wheatItem); scene.idle(35); - scene.world.modifyBlockEntity(harvesterPos, HarvesterBlockEntity.class, hte -> hte.setAnimatedSpeed(0)); + scene.world().modifyBlockEntity(harvesterPos, HarvesterBlockEntity.class, hte -> hte.setAnimatedSpeed(0)); scene.idle(5); - scene.world.modifyEntity(item3, Entity::discard); - scene.world.hideIndependentSection(contraptionLink, Direction.UP); + scene.world().modifyEntity(item3, Entity::discard); + scene.world().hideIndependentSection(contraptionLink, Direction.UP); scene.idle(15); - scene.world.modifyBlockEntity(controlsPos2, ContraptionControlsBlockEntity.class, + scene.world().modifyBlockEntity(controlsPos2, ContraptionControlsBlockEntity.class, ccte -> ccte.disabled = false); - contraptionLink = scene.world.showIndependentSection(contraption, Direction.DOWN); - scene.world.showSectionAndMerge(util.select.position(controlsPos1), Direction.DOWN, contraptionLink); - scene.world.showSectionAndMerge(util.select.position(controlsPos2), Direction.DOWN, contraptionLink); - scene.world.configureCenterOfRotation(contraptionLink, util.vector.centerOf(bearingPos)); - scene.world.moveSection(contraptionLink, util.vector.of(0, 1 / 512f, 0), 0); + contraptionLink = scene.world().showIndependentSection(contraption, Direction.DOWN); + scene.world().showSectionAndMerge(util.select().position(controlsPos1), Direction.DOWN, contraptionLink); + scene.world().showSectionAndMerge(util.select().position(controlsPos2), Direction.DOWN, contraptionLink); + scene.world().configureCenterOfRotation(contraptionLink, util.vector().centerOf(bearingPos)); + scene.world().moveSection(contraptionLink, util.vector().of(0, 1 / 512f, 0), 0); - scene.world.restoreBlocks(util.select.position(wheatPos)); + scene.world().restoreBlocks(util.select().position(wheatPos)); scene.idle(30); - scene.world.showSection(leverCol, Direction.EAST); + scene.world().showSection(leverCol, Direction.EAST); - scene.overlay.showText(50) + scene.overlay().showText(50) .placeNearTarget() .independent(100) .attachKeyFrame() .text("If it is redstone-activated during assembly..."); scene.idle(30); - scene.world.toggleRedstonePower(leverCol); - scene.effects.indicateRedstone(leverPos); - scene.world.modifyBlockEntity(controlsPos1, ContraptionControlsBlockEntity.class, ccte -> ccte.disabled = true); + scene.world().toggleRedstonePower(leverCol); + scene.effects().indicateRedstone(leverPos); + scene.world().modifyBlockEntity(controlsPos1, ContraptionControlsBlockEntity.class, ccte -> ccte.disabled = true); scene.idle(35); - scene.world.setKineticSpeed(util.select.position(drillPos), 64); - scene.world.rotateBearing(bearingPos, -30, 20); - scene.world.rotateSection(contraptionLink, 0, -30, 0, 20); + scene.world().setKineticSpeed(util.select().position(drillPos), 64); + scene.world().rotateBearing(bearingPos, -30, 20); + scene.world().rotateSection(contraptionLink, 0, -30, 0, 20); scene.idle(20); - scene.overlay.showText(60) + scene.overlay().showText(60) .placeNearTarget() - .pointAt(util.vector.centerOf(wheatPos)) + .pointAt(util.vector().centerOf(wheatPos)) .text("...targeted actors will be turned off from the start"); for (int i = 0; i < 10; i++) { scene.idle(3); - scene.world.incrementBlockBreakingProgress(cobblePos); + scene.world().incrementBlockBreakingProgress(cobblePos); } - ElementLink item4 = scene.world.createItemEntity(util.vector.centerOf(cobblePos), m, cobbleItem); + ElementLink item4 = scene.world().createItemEntity(util.vector().centerOf(cobblePos), m, cobbleItem); scene.idle(5); - scene.world.rotateBearing(bearingPos, -60, 40); - scene.world.rotateSection(contraptionLink, 0, -60, 0, 40); + scene.world().rotateBearing(bearingPos, -60, 40); + scene.world().rotateSection(contraptionLink, 0, -60, 0, 40); scene.idle(40); - scene.world.setKineticSpeed(util.select.position(drillPos), 0); + scene.world().setKineticSpeed(util.select().position(drillPos), 0); scene.idle(5); - scene.world.modifyEntity(item4, Entity::discard); + scene.world().modifyEntity(item4, Entity::discard); } } diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/PistonScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/PistonScenes.java index 51aa3179b3..36d3519fb8 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/PistonScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/PistonScenes.java @@ -5,10 +5,10 @@ import com.simibubi.create.content.contraptions.piston.MechanicalPistonHeadBlock import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; import net.createmod.ponder.foundation.ElementLink; import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.SceneBuilder; -import net.createmod.ponder.foundation.SceneBuildingUtil; import net.createmod.ponder.foundation.Selection; import net.createmod.ponder.foundation.element.InputWindowElement; import net.createmod.ponder.foundation.element.ParrotElement; @@ -29,184 +29,184 @@ public class PistonScenes { CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("mechanical_piston", "Moving Structures using Mechanical Pistons"); scene.configureBasePlate(0, 0, 5); - scene.world.showSection(util.select.layer(0) - .add(util.select.position(0, 1, 2)), Direction.UP); + scene.world().showSection(util.select().layer(0) + .add(util.select().position(0, 1, 2)), Direction.UP); - Selection kinetics = util.select.fromTo(3, 1, 3, 3, 1, 2); - BlockPos piston = util.grid.at(3, 1, 2); - BlockPos leverPos = util.grid.at(3, 2, 4); - BlockPos shaft = util.grid.at(3, 1, 3); + Selection kinetics = util.select().fromTo(3, 1, 3, 3, 1, 2); + BlockPos piston = util.grid().at(3, 1, 2); + BlockPos leverPos = util.grid().at(3, 2, 4); + BlockPos shaft = util.grid().at(3, 1, 3); scene.idle(5); - scene.world.showSection(util.select.fromTo(3, 1, 3, 3, 2, 5), Direction.DOWN); + scene.world().showSection(util.select().fromTo(3, 1, 3, 3, 2, 5), Direction.DOWN); scene.idle(10); - scene.world.showSection(util.select.position(piston), Direction.DOWN); + scene.world().showSection(util.select().position(piston), Direction.DOWN); ElementLink contraption = - scene.world.showIndependentSection(util.select.position(3, 1, 1), Direction.DOWN); - scene.world.moveSection(contraption, util.vector.of(0, 0, 1), 0); + scene.world().showIndependentSection(util.select().position(3, 1, 1), Direction.DOWN); + scene.world().moveSection(contraption, util.vector().of(0, 0, 1), 0); scene.idle(20); - scene.world.showSectionAndMerge(util.select.position(piston.north() + scene.world().showSectionAndMerge(util.select().position(piston.north() .east()), Direction.DOWN, contraption); scene.idle(5); - scene.world.showSectionAndMerge(util.select.position(piston.north() + scene.world().showSectionAndMerge(util.select().position(piston.north() .east(2)), Direction.DOWN, contraption); - scene.world.showSectionAndMerge(util.select.position(piston.north() + scene.world().showSectionAndMerge(util.select().position(piston.north() .west()), Direction.DOWN, contraption); scene.idle(15); - scene.effects.indicateRedstone(leverPos); - scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.below())); - scene.world.modifyKineticSpeed(kinetics, f -> -f); - scene.effects.rotationDirectionIndicator(shaft); - scene.world.moveSection(contraption, util.vector.of(-2, 0, 0), 40); - scene.overlay.showText(55) - .pointAt(util.vector.topOf(piston)) + scene.effects().indicateRedstone(leverPos); + scene.world().toggleRedstonePower(util.select().fromTo(leverPos, leverPos.below())); + scene.world().modifyKineticSpeed(kinetics, f -> -f); + scene.effects().rotationDirectionIndicator(shaft); + scene.world().moveSection(contraption, util.vector().of(-2, 0, 0), 40); + scene.overlay().showText(55) + .pointAt(util.vector().topOf(piston)) .placeNearTarget() .attachKeyFrame() .text("Mechanical Pistons can move blocks in front of them"); scene.idle(65); - scene.overlay.showText(45) - .pointAt(util.vector.blockSurface(shaft, Direction.SOUTH)) + scene.overlay().showText(45) + .pointAt(util.vector().blockSurface(shaft, Direction.SOUTH)) .placeNearTarget() .text("Speed and direction of movement depend on the Rotational Input"); - scene.world.setBlock(util.grid.at(2, 1, 1), Blocks.AIR.defaultBlockState(), false); - scene.world.setBlock(util.grid.at(0, 1, 2), Blocks.OAK_PLANKS.defaultBlockState(), false); - scene.effects.indicateRedstone(leverPos); - scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.below())); - scene.world.modifyKineticSpeed(kinetics, f -> -f); - scene.effects.rotationDirectionIndicator(shaft); - scene.world.moveSection(contraption, util.vector.of(2, 0, 0), 40); + scene.world().setBlock(util.grid().at(2, 1, 1), Blocks.AIR.defaultBlockState(), false); + scene.world().setBlock(util.grid().at(0, 1, 2), Blocks.OAK_PLANKS.defaultBlockState(), false); + scene.effects().indicateRedstone(leverPos); + scene.world().toggleRedstonePower(util.select().fromTo(leverPos, leverPos.below())); + scene.world().modifyKineticSpeed(kinetics, f -> -f); + scene.effects().rotationDirectionIndicator(shaft); + scene.world().moveSection(contraption, util.vector().of(2, 0, 0), 40); scene.idle(60); - scene.overlay.showControls( - new InputWindowElement(util.vector.blockSurface(piston, Direction.WEST), Pointing.DOWN).rightClick() + scene.overlay().showControls( + new InputWindowElement(util.vector().blockSurface(piston, Direction.WEST), Pointing.DOWN).rightClick() .withItem(new ItemStack(Items.SLIME_BALL)), 30); scene.idle(7); - scene.world.modifyBlock(piston.north(), s -> s.setValue(MechanicalPistonHeadBlock.TYPE, PistonType.STICKY), - false); - scene.effects.superGlue(piston, Direction.WEST, true); + scene.world().modifyBlock(piston.north(), s -> s.setValue(MechanicalPistonHeadBlock.TYPE, PistonType.STICKY), + false); + scene.effects().superGlue(piston, Direction.WEST, true); scene.idle(33); - scene.effects.indicateRedstone(leverPos); - scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.below())); - scene.world.modifyKineticSpeed(kinetics, f -> -f); - scene.effects.rotationDirectionIndicator(shaft); - scene.world.moveSection(contraption, util.vector.of(-2, 0, 0), 40); + scene.effects().indicateRedstone(leverPos); + scene.world().toggleRedstonePower(util.select().fromTo(leverPos, leverPos.below())); + scene.world().modifyKineticSpeed(kinetics, f -> -f); + scene.effects().rotationDirectionIndicator(shaft); + scene.world().moveSection(contraption, util.vector().of(-2, 0, 0), 40); scene.idle(25); - scene.overlay.showText(60) - .pointAt(util.vector.topOf(piston)) + scene.overlay().showText(60) + .pointAt(util.vector().topOf(piston)) .placeNearTarget() .attachKeyFrame() .text("Sticky Mechanical Pistons can pull the attached blocks back"); scene.idle(20); - scene.world.setBlock(util.grid.at(2, 1, 1), Blocks.OAK_PLANKS.defaultBlockState(), false); - scene.world.setBlock(util.grid.at(0, 1, 2), Blocks.AIR.defaultBlockState(), false); - scene.effects.indicateRedstone(leverPos); - scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.below())); - scene.world.modifyKineticSpeed(kinetics, f -> -f); - scene.effects.rotationDirectionIndicator(shaft); - scene.world.moveSection(contraption, util.vector.of(2, 0, 0), 40); + scene.world().setBlock(util.grid().at(2, 1, 1), Blocks.OAK_PLANKS.defaultBlockState(), false); + scene.world().setBlock(util.grid().at(0, 1, 2), Blocks.AIR.defaultBlockState(), false); + scene.effects().indicateRedstone(leverPos); + scene.world().toggleRedstonePower(util.select().fromTo(leverPos, leverPos.below())); + scene.world().modifyKineticSpeed(kinetics, f -> -f); + scene.effects().rotationDirectionIndicator(shaft); + scene.world().moveSection(contraption, util.vector().of(2, 0, 0), 40); scene.idle(50); - scene.world.setBlock(util.grid.at(2, 1, 1), Blocks.AIR.defaultBlockState(), false); + scene.world().setBlock(util.grid().at(2, 1, 1), Blocks.AIR.defaultBlockState(), false); - scene.world.replaceBlocks(util.select.fromTo(2, 3, 2, 2, 2, 0), Blocks.OAK_PLANKS.defaultBlockState(), false); - scene.overlay.showOutline(PonderPalette.GREEN, "glue", util.select.fromTo(2, 2, 3, 2, 1, 3) - .add(util.select.fromTo(2, 1, 3, 2, 1, 1)) - .add(util.select.position(1, 1, 1)), 40); - scene.overlay.showControls(new InputWindowElement(util.vector.centerOf(util.grid.at(2, 2, 0)), Pointing.RIGHT) + scene.world().replaceBlocks(util.select().fromTo(2, 3, 2, 2, 2, 0), Blocks.OAK_PLANKS.defaultBlockState(), false); + scene.overlay().showOutline(PonderPalette.GREEN, "glue", util.select().fromTo(2, 2, 3, 2, 1, 3) + .add(util.select().fromTo(2, 1, 3, 2, 1, 1)) + .add(util.select().position(1, 1, 1)), 40); + scene.overlay().showControls(new InputWindowElement(util.vector().centerOf(util.grid().at(2, 2, 0)), Pointing.RIGHT) .withItem(AllItems.SUPER_GLUE.asStack()), 40); ElementLink chassis = - scene.world.showIndependentSection(util.select.fromTo(2, 2, 0, 2, 3, 2), Direction.DOWN); - scene.world.moveSection(chassis, util.vector.of(0, -1, 1), 0); + scene.world().showIndependentSection(util.select().fromTo(2, 2, 0, 2, 3, 2), Direction.DOWN); + scene.world().moveSection(chassis, util.vector().of(0, -1, 1), 0); scene.addKeyframe(); scene.idle(5); - scene.world.showSectionAndMerge(util.select.position(1, 2, 0), Direction.EAST, chassis); + scene.world().showSectionAndMerge(util.select().position(1, 2, 0), Direction.EAST, chassis); scene.idle(15); - scene.effects.superGlue(piston.west() + scene.effects().superGlue(piston.west() .north(), Direction.WEST, true); - scene.overlay.showText(80) - .pointAt(util.vector.topOf(piston.west())) + scene.overlay().showText(80) + .pointAt(util.vector().topOf(piston.west())) .placeNearTarget() .sharedText("movement_anchors"); scene.idle(90); - scene.effects.indicateRedstone(leverPos); - scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.below())); - scene.world.modifyKineticSpeed(kinetics, f -> -f); - scene.effects.rotationDirectionIndicator(shaft); - scene.world.moveSection(contraption, util.vector.of(-2, 0, 0), 40); - scene.world.moveSection(chassis, util.vector.of(-2, 0, 0), 40); + scene.effects().indicateRedstone(leverPos); + scene.world().toggleRedstonePower(util.select().fromTo(leverPos, leverPos.below())); + scene.world().modifyKineticSpeed(kinetics, f -> -f); + scene.effects().rotationDirectionIndicator(shaft); + scene.world().moveSection(contraption, util.vector().of(-2, 0, 0), 40); + scene.world().moveSection(chassis, util.vector().of(-2, 0, 0), 40); } public static void poles(SceneBuilder builder, SceneBuildingUtil util) { CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("piston_pole", "Piston Extension Poles"); scene.configureBasePlate(0, 0, 5); - scene.world.showSection(util.select.layer(0), Direction.UP); - scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); + scene.world().showSection(util.select().layer(0), Direction.UP); + scene.world().modifyKineticSpeed(util.select().everywhere(), f -> -f); - Selection kinetics = util.select.fromTo(3, 1, 3, 3, 1, 2); - BlockPos piston = util.grid.at(3, 1, 2); + Selection kinetics = util.select().fromTo(3, 1, 3, 3, 1, 2); + BlockPos piston = util.grid().at(3, 1, 2); scene.idle(5); - scene.world.showSection(util.select.fromTo(3, 1, 3, 3, 2, 5), Direction.DOWN); + scene.world().showSection(util.select().fromTo(3, 1, 3, 3, 2, 5), Direction.DOWN); scene.idle(10); - scene.world.showSection(util.select.position(piston), Direction.DOWN); + scene.world().showSection(util.select().position(piston), Direction.DOWN); ElementLink contraption = - scene.world.showIndependentSection(util.select.position(3, 1, 1), Direction.DOWN); - scene.world.moveSection(contraption, util.vector.of(0, 0, 1), 0); + scene.world().showIndependentSection(util.select().position(3, 1, 1), Direction.DOWN); + scene.world().moveSection(contraption, util.vector().of(0, 0, 1), 0); scene.idle(20); - BlockPos leverPos = util.grid.at(3, 2, 4); - scene.effects.indicateRedstone(leverPos); - scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.below())); - scene.world.setKineticSpeed(kinetics, 16); + BlockPos leverPos = util.grid().at(3, 2, 4); + scene.effects().indicateRedstone(leverPos); + scene.world().toggleRedstonePower(util.select().fromTo(leverPos, leverPos.below())); + scene.world().setKineticSpeed(kinetics, 16); scene.idle(10); - scene.overlay.showSelectionWithText(util.select.position(piston), 50) + scene.overlay().showSelectionWithText(util.select().position(piston), 50) .colored(PonderPalette.RED) .placeNearTarget() .attachKeyFrame() .text("Without attached Poles, a Mechanical Piston cannot move"); scene.idle(60); - scene.effects.indicateRedstone(leverPos); - scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.below())); - scene.world.setKineticSpeed(kinetics, 0); + scene.effects().indicateRedstone(leverPos); + scene.world().toggleRedstonePower(util.select().fromTo(leverPos, leverPos.below())); + scene.world().setKineticSpeed(kinetics, 0); scene.idle(5); - scene.world.showSectionAndMerge(util.select.position(piston.north() + scene.world().showSectionAndMerge(util.select().position(piston.north() .east()), Direction.DOWN, contraption); scene.idle(5); - scene.world.showSectionAndMerge(util.select.position(piston.north() + scene.world().showSectionAndMerge(util.select().position(piston.north() .east(2)), Direction.DOWN, contraption); scene.idle(10); - scene.overlay.showOutline(PonderPalette.RED, new Object(), util.select.fromTo(piston.east(), piston.east(2)), - 100); - scene.overlay.showSelectionWithText(util.select.fromTo(piston.west(), piston.west(2)), 100) + scene.overlay().showOutline(PonderPalette.RED, new Object(), util.select().fromTo(piston.east(), piston.east(2)), + 100); + scene.overlay().showSelectionWithText(util.select().fromTo(piston.west(), piston.west(2)), 100) .text("The Length of pole added at its back determines the Extension Range") .attachKeyFrame() .placeNearTarget() .colored(PonderPalette.GREEN); scene.idle(110); - scene.world.showSectionAndMerge(util.select.position(piston.north() + scene.world().showSectionAndMerge(util.select().position(piston.north() .west()), Direction.EAST, contraption); scene.idle(10); ElementLink birb = - scene.special.createBirb(util.vector.topOf(piston.west()), ParrotElement.FaceCursorPose::new); + scene.special().createBirb(util.vector().topOf(piston.west()), ParrotElement.FaceCursorPose::new); scene.idle(15); - scene.effects.indicateRedstone(leverPos); - scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.below())); - scene.world.setKineticSpeed(kinetics, 16); - scene.world.moveSection(contraption, util.vector.of(-2, 0, 0), 40); - scene.special.moveParrot(birb, util.vector.of(-2, 0, 0), 40); + scene.effects().indicateRedstone(leverPos); + scene.world().toggleRedstonePower(util.select().fromTo(leverPos, leverPos.below())); + scene.world().setKineticSpeed(kinetics, 16); + scene.world().moveSection(contraption, util.vector().of(-2, 0, 0), 40); + scene.special().moveParrot(birb, util.vector().of(-2, 0, 0), 40); } @@ -214,86 +214,86 @@ public class PistonScenes { CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("mechanical_piston_modes", "Movement Modes of the Mechanical Piston"); scene.configureBasePlate(0, 0, 5); - Selection rose = util.select.fromTo(0, 2, 2, 0, 1, 2); - scene.world.showSection(util.select.layer(0) + Selection rose = util.select().fromTo(0, 2, 2, 0, 1, 2); + scene.world().showSection(util.select().layer(0) .add(rose), Direction.UP); - Selection kinetics = util.select.fromTo(3, 1, 3, 3, 1, 2); - BlockPos piston = util.grid.at(3, 1, 2); - BlockPos leverPos = util.grid.at(3, 2, 4); - BlockPos shaft = util.grid.at(3, 1, 3); + Selection kinetics = util.select().fromTo(3, 1, 3, 3, 1, 2); + BlockPos piston = util.grid().at(3, 1, 2); + BlockPos leverPos = util.grid().at(3, 2, 4); + BlockPos shaft = util.grid().at(3, 1, 3); scene.idle(5); - scene.world.showSection(util.select.fromTo(3, 1, 3, 3, 2, 5), Direction.DOWN); + scene.world().showSection(util.select().fromTo(3, 1, 3, 3, 2, 5), Direction.DOWN); scene.idle(10); - scene.world.showSection(util.select.position(piston), Direction.DOWN); + scene.world().showSection(util.select().position(piston), Direction.DOWN); ElementLink contraption = - scene.world.showIndependentSection(util.select.position(3, 1, 1), Direction.DOWN); - scene.world.moveSection(contraption, util.vector.of(0, 0, 1), 0); + scene.world().showIndependentSection(util.select().position(3, 1, 1), Direction.DOWN); + scene.world().moveSection(contraption, util.vector().of(0, 0, 1), 0); scene.idle(20); - scene.world.showSectionAndMerge(util.select.position(piston.north() + scene.world().showSectionAndMerge(util.select().position(piston.north() .east()), Direction.DOWN, contraption); scene.idle(5); - scene.world.showSectionAndMerge(util.select.position(piston.north() + scene.world().showSectionAndMerge(util.select().position(piston.north() .east(2)), Direction.DOWN, contraption); - scene.world.showSectionAndMerge(util.select.position(piston.north() + scene.world().showSectionAndMerge(util.select().position(piston.north() .west()), Direction.DOWN, contraption); scene.idle(5); - scene.world.showSectionAndMerge(util.select.position(piston.north() + scene.world().showSectionAndMerge(util.select().position(piston.north() .west() .above()), Direction.DOWN, contraption); scene.idle(15); - scene.effects.superGlue(piston.west(), Direction.UP, true); + scene.effects().superGlue(piston.west(), Direction.UP, true); scene.idle(10); - scene.effects.indicateRedstone(leverPos); - scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.below())); - scene.world.modifyKineticSpeed(kinetics, f -> -f); - scene.effects.rotationDirectionIndicator(shaft); - scene.world.moveSection(contraption, util.vector.of(-2, 0, 0), 40); + scene.effects().indicateRedstone(leverPos); + scene.world().toggleRedstonePower(util.select().fromTo(leverPos, leverPos.below())); + scene.world().modifyKineticSpeed(kinetics, f -> -f); + scene.effects().rotationDirectionIndicator(shaft); + scene.world().moveSection(contraption, util.vector().of(-2, 0, 0), 40); scene.idle(40); - scene.world.destroyBlock(util.grid.at(0, 1, 2)); - scene.world.destroyBlock(util.grid.at(0, 2, 2)); + scene.world().destroyBlock(util.grid().at(0, 1, 2)); + scene.world().destroyBlock(util.grid().at(0, 2, 2)); scene.idle(10); - scene.overlay.showSelectionWithText(rose, 70) + scene.overlay().showSelectionWithText(rose, 70) .text("Whenever Pistons stop moving, the moved structure reverts to blocks") .attachKeyFrame() .colored(PonderPalette.RED); scene.idle(80); - scene.effects.indicateRedstone(leverPos); - scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.below())); - scene.world.modifyKineticSpeed(kinetics, f -> -f); - scene.effects.rotationDirectionIndicator(shaft); - scene.world.moveSection(contraption, util.vector.of(2, 0, 0), 40); - scene.world.hideSection(rose, Direction.UP); + scene.effects().indicateRedstone(leverPos); + scene.world().toggleRedstonePower(util.select().fromTo(leverPos, leverPos.below())); + scene.world().modifyKineticSpeed(kinetics, f -> -f); + scene.effects().rotationDirectionIndicator(shaft); + scene.world().moveSection(contraption, util.vector().of(2, 0, 0), 40); + scene.world().hideSection(rose, Direction.UP); scene.idle(50); - scene.world.setBlock(util.grid.at(0, 1, 2), Blocks.ROSE_BUSH.defaultBlockState(), false); - scene.world.setBlock(util.grid.at(0, 2, 2), Blocks.ROSE_BUSH.defaultBlockState() + scene.world().setBlock(util.grid().at(0, 1, 2), Blocks.ROSE_BUSH.defaultBlockState(), false); + scene.world().setBlock(util.grid().at(0, 2, 2), Blocks.ROSE_BUSH.defaultBlockState() .setValue(DoublePlantBlock.HALF, DoubleBlockHalf.UPPER), false); - scene.world.showIndependentSection(rose, Direction.DOWN); - Vec3 filter = util.vector.topOf(piston) + scene.world().showIndependentSection(rose, Direction.DOWN); + Vec3 filter = util.vector().topOf(piston) .add(.125, 0, 0); - scene.overlay.showFilterSlotInput(filter, Direction.UP, 60); - scene.overlay.showControls(new InputWindowElement(filter.add(0, .125, 0), Pointing.DOWN).rightClick(), 60); - scene.overlay.showText(70) + scene.overlay().showFilterSlotInput(filter, Direction.UP, 60); + scene.overlay().showControls(new InputWindowElement(filter.add(0, .125, 0), Pointing.DOWN).rightClick(), 60); + scene.overlay().showText(70) .pointAt(filter.add(-.125, 0, 0)) .placeNearTarget() .attachKeyFrame() .sharedText("behaviour_modify_value_panel"); scene.idle(80); - scene.effects.indicateRedstone(leverPos); - scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.below())); - scene.world.modifyKineticSpeed(kinetics, f -> -f); - scene.effects.rotationDirectionIndicator(shaft); - scene.world.moveSection(contraption, util.vector.of(-2, 0, 0), 40); + scene.effects().indicateRedstone(leverPos); + scene.world().toggleRedstonePower(util.select().fromTo(leverPos, leverPos.below())); + scene.world().modifyKineticSpeed(kinetics, f -> -f); + scene.effects().rotationDirectionIndicator(shaft); + scene.world().moveSection(contraption, util.vector().of(-2, 0, 0), 40); scene.idle(50); - scene.overlay.showText(120) + scene.overlay().showText(120) .colored(PonderPalette.GREEN) - .pointAt(util.vector.blockSurface(util.grid.at(0, 1, 2), Direction.WEST)) + .pointAt(util.vector().blockSurface(util.grid().at(0, 1, 2), Direction.WEST)) .placeNearTarget() .text("It can be configured never to revert to solid blocks, or only at the location it started at"); diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ProcessingScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ProcessingScenes.java index faf2cc4b60..a10f2a09e8 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ProcessingScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ProcessingScenes.java @@ -20,10 +20,10 @@ import net.createmod.catnip.utility.IntAttached; import net.createmod.catnip.utility.Iterate; import net.createmod.catnip.utility.NBTHelper; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; import net.createmod.ponder.foundation.ElementLink; import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.SceneBuilder; -import net.createmod.ponder.foundation.SceneBuildingUtil; import net.createmod.ponder.foundation.Selection; import net.createmod.ponder.foundation.element.EntityElement; import net.createmod.ponder.foundation.element.InputWindowElement; @@ -49,96 +49,96 @@ public class ProcessingScenes { scene.title("millstone", "Processing Items in the Millstone"); scene.configureBasePlate(0, 0, 5); - Selection belt = util.select.fromTo(1, 1, 5, 0, 1, 2) - .add(util.select.position(1, 2, 2)); - Selection beltCog = util.select.position(2, 0, 5); + Selection belt = util.select().fromTo(1, 1, 5, 0, 1, 2) + .add(util.select().position(1, 2, 2)); + Selection beltCog = util.select().position(2, 0, 5); - scene.world.showSection(util.select.layer(0) + scene.world().showSection(util.select().layer(0) .substract(beltCog), Direction.UP); - BlockPos millstone = util.grid.at(2, 2, 2); - Selection millstoneSelect = util.select.position(2, 2, 2); - Selection cogs = util.select.fromTo(3, 1, 2, 3, 2, 2); - scene.world.setKineticSpeed(millstoneSelect, 0); + BlockPos millstone = util.grid().at(2, 2, 2); + Selection millstoneSelect = util.select().position(2, 2, 2); + Selection cogs = util.select().fromTo(3, 1, 2, 3, 2, 2); + scene.world().setKineticSpeed(millstoneSelect, 0); scene.idle(5); - scene.world.showSection(util.select.position(4, 1, 3), Direction.DOWN); - scene.world.showSection(util.select.position(2, 1, 2), Direction.DOWN); + scene.world().showSection(util.select().position(4, 1, 3), Direction.DOWN); + scene.world().showSection(util.select().position(2, 1, 2), Direction.DOWN); scene.idle(10); - scene.world.showSection(util.select.position(millstone), Direction.DOWN); + scene.world().showSection(util.select().position(millstone), Direction.DOWN); scene.idle(10); - Vec3 millstoneTop = util.vector.topOf(millstone); - scene.overlay.showText(60) + Vec3 millstoneTop = util.vector().topOf(millstone); + scene.overlay().showText(60) .attachKeyFrame() .text("Millstones process items by grinding them") .pointAt(millstoneTop) .placeNearTarget(); scene.idle(70); - scene.world.showSection(cogs, Direction.DOWN); + scene.world().showSection(cogs, Direction.DOWN); scene.idle(10); - scene.world.setKineticSpeed(millstoneSelect, 32); - scene.effects.indicateSuccess(millstone); + scene.world().setKineticSpeed(millstoneSelect, 32); + scene.effects().indicateSuccess(millstone); scene.idle(10); - scene.overlay.showText(60) + scene.overlay().showText(60) .attachKeyFrame() .colored(PonderPalette.GREEN) .text("They can be powered from the side using cogwheels") - .pointAt(util.vector.topOf(millstone.east())) + .pointAt(util.vector().topOf(millstone.east())) .placeNearTarget(); scene.idle(70); ItemStack itemStack = new ItemStack(Items.WHEAT); - Vec3 entitySpawn = util.vector.topOf(millstone.above(3)); + Vec3 entitySpawn = util.vector().topOf(millstone.above(3)); ElementLink entity1 = - scene.world.createItemEntity(entitySpawn, util.vector.of(0, 0.2, 0), itemStack); + scene.world().createItemEntity(entitySpawn, util.vector().of(0, 0.2, 0), itemStack); scene.idle(18); - scene.world.modifyEntity(entity1, Entity::discard); - scene.world.modifyBlockEntity(millstone, MillstoneBlockEntity.class, + scene.world().modifyEntity(entity1, Entity::discard); + scene.world().modifyBlockEntity(millstone, MillstoneBlockEntity.class, ms -> ms.inputInv.setStackInSlot(0, itemStack)); scene.idle(10); - scene.overlay.showControls(new InputWindowElement(millstoneTop, Pointing.DOWN).withItem(itemStack), 30); + scene.overlay().showControls(new InputWindowElement(millstoneTop, Pointing.DOWN).withItem(itemStack), 30); scene.idle(7); - scene.overlay.showText(40) + scene.overlay().showText(40) .attachKeyFrame() .text("Throw or Insert items at the top") .pointAt(millstoneTop) .placeNearTarget(); scene.idle(60); - scene.world.modifyBlockEntity(millstone, MillstoneBlockEntity.class, + scene.world().modifyBlockEntity(millstone, MillstoneBlockEntity.class, ms -> ms.inputInv.setStackInSlot(0, ItemStack.EMPTY)); - scene.overlay.showText(50) + scene.overlay().showText(50) .text("After some time, the result can be obtained via Right-click") - .pointAt(util.vector.blockSurface(millstone, Direction.WEST)) + .pointAt(util.vector().blockSurface(millstone, Direction.WEST)) .placeNearTarget(); scene.idle(60); ItemStack flour = AllItems.WHEAT_FLOUR.asStack(); - scene.overlay.showControls( - new InputWindowElement(util.vector.blockSurface(millstone, Direction.NORTH), Pointing.RIGHT).rightClick() + scene.overlay().showControls( + new InputWindowElement(util.vector().blockSurface(millstone, Direction.NORTH), Pointing.RIGHT).rightClick() .withItem(flour), 40); scene.idle(50); scene.addKeyframe(); - scene.world.showSection(beltCog, Direction.UP); - scene.world.showSection(belt, Direction.EAST); + scene.world().showSection(beltCog, Direction.UP); + scene.world().showSection(belt, Direction.EAST); scene.idle(15); - BlockPos beltPos = util.grid.at(1, 1, 2); - scene.world.createItemOnBelt(beltPos, Direction.EAST, flour); + BlockPos beltPos = util.grid().at(1, 1, 2); + scene.world().createItemOnBelt(beltPos, Direction.EAST, flour); scene.idle(15); - scene.world.createItemOnBelt(beltPos, Direction.EAST, new ItemStack(Items.WHEAT_SEEDS)); + scene.world().createItemOnBelt(beltPos, Direction.EAST, new ItemStack(Items.WHEAT_SEEDS)); scene.idle(20); - scene.overlay.showText(50) + scene.overlay().showText(50) .text("The outputs can also be extracted by automation") - .pointAt(util.vector.blockSurface(millstone, Direction.WEST) + .pointAt(util.vector().blockSurface(millstone, Direction.WEST) .add(-.5, .4, 0)) .placeNearTarget(); scene.idle(60); @@ -150,100 +150,100 @@ public class ProcessingScenes { scene.configureBasePlate(0, 0, 5); scene.scaleSceneView(.9f); - Selection wheels = util.select.fromTo(3, 2, 2, 1, 2, 2); - Selection kinetics = util.select.fromTo(0, 1, 5, 4, 1, 3); - Selection kinetics2 = util.select.fromTo(0, 2, 5, 4, 2, 3); - Selection beltCog = util.select.position(5, 0, 1); - scene.world.setKineticSpeed(wheels, 0); - scene.world.setBlock(util.grid.at(2, 3, 2), Blocks.AIR.defaultBlockState(), false); + Selection wheels = util.select().fromTo(3, 2, 2, 1, 2, 2); + Selection kinetics = util.select().fromTo(0, 1, 5, 4, 1, 3); + Selection kinetics2 = util.select().fromTo(0, 2, 5, 4, 2, 3); + Selection beltCog = util.select().position(5, 0, 1); + scene.world().setKineticSpeed(wheels, 0); + scene.world().setBlock(util.grid().at(2, 3, 2), Blocks.AIR.defaultBlockState(), false); - scene.world.showSection(util.select.layer(0) + scene.world().showSection(util.select().layer(0) .substract(beltCog), Direction.UP); scene.idle(5); - Selection belt = util.select.fromTo(4, 1, 2, 4, 4, 2) - .add(util.select.fromTo(4, 3, 3, 4, 4, 3)) - .add(util.select.position(3, 3, 2)) - .add(util.select.position(2, 3, 2)); - Selection bottomBelt = util.select.fromTo(5, 1, 0, 2, 1, 0) - .add(util.select.fromTo(2, 1, 2, 2, 1, 1)); + Selection belt = util.select().fromTo(4, 1, 2, 4, 4, 2) + .add(util.select().fromTo(4, 3, 3, 4, 4, 3)) + .add(util.select().position(3, 3, 2)) + .add(util.select().position(2, 3, 2)); + Selection bottomBelt = util.select().fromTo(5, 1, 0, 2, 1, 0) + .add(util.select().fromTo(2, 1, 2, 2, 1, 1)); - BlockPos center = util.grid.at(2, 2, 2); - Selection wWheel = util.select.position(center.west()); - Selection eWheel = util.select.position(center.east()); + BlockPos center = util.grid().at(2, 2, 2); + Selection wWheel = util.select().position(center.west()); + Selection eWheel = util.select().position(center.east()); - scene.world.showSection(wWheel, Direction.SOUTH); + scene.world().showSection(wWheel, Direction.SOUTH); scene.idle(3); - scene.world.showSection(eWheel, Direction.SOUTH); + scene.world().showSection(eWheel, Direction.SOUTH); scene.idle(10); - Vec3 centerTop = util.vector.topOf(center); - scene.overlay.showText(60) + Vec3 centerTop = util.vector().topOf(center); + scene.overlay().showText(60) .attachKeyFrame() .text("A pair of Crushing Wheels can grind items very effectively") .pointAt(centerTop) .placeNearTarget(); scene.idle(70); - scene.world.showSection(kinetics, Direction.DOWN); + scene.world().showSection(kinetics, Direction.DOWN); scene.idle(3); - scene.world.showSection(kinetics2, Direction.DOWN); - scene.world.setKineticSpeed(wWheel, -16); - scene.world.setKineticSpeed(eWheel, 16); + scene.world().showSection(kinetics2, Direction.DOWN); + scene.world().setKineticSpeed(wWheel, -16); + scene.world().setKineticSpeed(eWheel, 16); scene.idle(5); - scene.effects.rotationDirectionIndicator(center.west()); - scene.effects.rotationDirectionIndicator(center.east()); + scene.effects().rotationDirectionIndicator(center.west()); + scene.effects().rotationDirectionIndicator(center.east()); scene.idle(10); - scene.overlay.showText(60) + scene.overlay().showText(60) .attachKeyFrame() .text("Their Rotational Input has to make them spin into each other") - .pointAt(util.vector.blockSurface(center.west(), Direction.NORTH)) + .pointAt(util.vector().blockSurface(center.west(), Direction.NORTH)) .placeNearTarget(); scene.idle(40); - scene.effects.rotationDirectionIndicator(center.west()); - scene.effects.rotationDirectionIndicator(center.east()); + scene.effects().rotationDirectionIndicator(center.west()); + scene.effects().rotationDirectionIndicator(center.east()); scene.idle(30); ItemStack input = new ItemStack(Items.GOLD_ORE); ItemStack output = new ItemStack(Items.RAW_GOLD); - Vec3 entitySpawn = util.vector.topOf(center.above(2)); + Vec3 entitySpawn = util.vector().topOf(center.above(2)); ElementLink entity1 = - scene.world.createItemEntity(entitySpawn, util.vector.of(0, 0.2, 0), input); + scene.world().createItemEntity(entitySpawn, util.vector().of(0, 0.2, 0), input); scene.idle(18); - scene.world.modifyEntity(entity1, Entity::discard); + scene.world().modifyEntity(entity1, Entity::discard); Emitter blockSpace = - Emitter.withinBlockSpace(new ItemParticleOption(ParticleTypes.ITEM, input), util.vector.of(0, 0, 0)); - scene.effects.emitParticles(util.vector.centerOf(center) + Emitter.withinBlockSpace(new ItemParticleOption(ParticleTypes.ITEM, input), util.vector().of(0, 0, 0)); + scene.effects().emitParticles(util.vector().centerOf(center) .add(0, -0.2, 0), blockSpace, 3, 40); scene.idle(10); - scene.overlay.showControls(new InputWindowElement(centerTop, Pointing.DOWN).withItem(input), 30); + scene.overlay().showControls(new InputWindowElement(centerTop, Pointing.DOWN).withItem(input), 30); scene.idle(7); - scene.overlay.showText(50) + scene.overlay().showText(50) .attachKeyFrame() .text("Items thrown or inserted into the top will get processed") .pointAt(centerTop) .placeNearTarget(); scene.idle(60); - scene.world.createItemEntity(centerTop.add(0, -1.4, 0), util.vector.of(0, 0, 0), output); + scene.world().createItemEntity(centerTop.add(0, -1.4, 0), util.vector().of(0, 0, 0), output); scene.idle(10); - scene.world.createItemEntity(centerTop.add(0, -1.4, 0), util.vector.of(0, 0, 0), output); - scene.overlay.showControls(new InputWindowElement(centerTop.add(0, -2, 0), Pointing.UP).withItem(output), 30); + scene.world().createItemEntity(centerTop.add(0, -1.4, 0), util.vector().of(0, 0, 0), output); + scene.overlay().showControls(new InputWindowElement(centerTop.add(0, -2, 0), Pointing.UP).withItem(output), 30); scene.idle(40); - scene.world.restoreBlocks(util.select.position(2, 3, 2)); - scene.world.showSection(belt, Direction.DOWN); + scene.world().restoreBlocks(util.select().position(2, 3, 2)); + scene.world().showSection(belt, Direction.DOWN); scene.idle(5); - scene.world.showSection(beltCog, Direction.UP); + scene.world().showSection(beltCog, Direction.UP); scene.idle(5); - scene.world.modifyEntities(ItemEntity.class, Entity::discard); - scene.world.showSection(bottomBelt, Direction.SOUTH); + scene.world().modifyEntities(ItemEntity.class, Entity::discard); + scene.world().showSection(bottomBelt, Direction.SOUTH); scene.idle(5); - scene.overlay.showText(50) + scene.overlay().showText(50) .attachKeyFrame() .text("Items can be inserted and picked up through automated means as well") .pointAt(centerTop.add(0, .5, 0)) @@ -252,19 +252,19 @@ public class ProcessingScenes { for (int i = 0; i < 5; i++) { if (i < 4) - scene.world.createItemOnBelt(util.grid.at(4, 4, 2), Direction.EAST, input); + scene.world().createItemOnBelt(util.grid().at(4, 4, 2), Direction.EAST, input); scene.idle(15); if (i < 3) - scene.world.createItemOnBelt(util.grid.at(4, 4, 2), Direction.EAST, input); + scene.world().createItemOnBelt(util.grid().at(4, 4, 2), Direction.EAST, input); scene.idle(15); if (i > 0) { - scene.world.createItemOnBelt(center.below(), Direction.UP, output); + scene.world().createItemOnBelt(center.below(), Direction.UP, output); scene.idle(15); - scene.world.createItemOnBelt(center.below(), Direction.UP, output); + scene.world().createItemOnBelt(center.below(), Direction.UP, output); } - scene.world.removeItemsFromBelt(util.grid.at(3, 3, 2)); + scene.world().removeItemsFromBelt(util.grid().at(3, 3, 2)); if (i < 4) - scene.effects.emitParticles(util.vector.centerOf(center) + scene.effects().emitParticles(util.vector().centerOf(center) .add(0, -0.2, 0), blockSpace, 3, 28); if (i == 0) scene.markAsFinished(); @@ -275,109 +275,109 @@ public class ProcessingScenes { CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("mechanical_press", "Processing Items with the Mechanical Press"); scene.configureBasePlate(0, 0, 5); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); scene.idle(5); ElementLink depot = - scene.world.showIndependentSection(util.select.position(2, 1, 1), Direction.DOWN); - scene.world.moveSection(depot, util.vector.of(0, 0, 1), 0); + scene.world().showIndependentSection(util.select().position(2, 1, 1), Direction.DOWN); + scene.world().moveSection(depot, util.vector().of(0, 0, 1), 0); scene.idle(10); - Selection pressS = util.select.position(2, 3, 2); - BlockPos pressPos = util.grid.at(2, 3, 2); - BlockPos depotPos = util.grid.at(2, 1, 1); - scene.world.setKineticSpeed(pressS, 0); - scene.world.showSection(pressS, Direction.DOWN); + Selection pressS = util.select().position(2, 3, 2); + BlockPos pressPos = util.grid().at(2, 3, 2); + BlockPos depotPos = util.grid().at(2, 1, 1); + scene.world().setKineticSpeed(pressS, 0); + scene.world().showSection(pressS, Direction.DOWN); scene.idle(10); - scene.world.showSection(util.select.fromTo(2, 1, 3, 2, 1, 5), Direction.NORTH); + scene.world().showSection(util.select().fromTo(2, 1, 3, 2, 1, 5), Direction.NORTH); scene.idle(3); - scene.world.showSection(util.select.position(2, 2, 3), Direction.SOUTH); + scene.world().showSection(util.select().position(2, 2, 3), Direction.SOUTH); scene.idle(3); - scene.world.showSection(util.select.position(2, 3, 3), Direction.NORTH); - scene.world.setKineticSpeed(pressS, -32); - scene.effects.indicateSuccess(pressPos); + scene.world().showSection(util.select().position(2, 3, 3), Direction.NORTH); + scene.world().setKineticSpeed(pressS, -32); + scene.effects().indicateSuccess(pressPos); scene.idle(10); - Vec3 pressSide = util.vector.blockSurface(pressPos, Direction.WEST); - scene.overlay.showText(60) + Vec3 pressSide = util.vector().blockSurface(pressPos, Direction.WEST); + scene.overlay().showText(60) .pointAt(pressSide) .placeNearTarget() .attachKeyFrame() .text("The Mechanical Press can process items provided beneath it"); scene.idle(70); - scene.overlay.showText(60) + scene.overlay().showText(60) .pointAt(pressSide.subtract(0, 2, 0)) .placeNearTarget() .text("The Input items can be dropped or placed on a Depot under the Press"); scene.idle(50); ItemStack copper = new ItemStack(Items.COPPER_INGOT); - scene.world.createItemOnBeltLike(depotPos, Direction.NORTH, copper); - Vec3 depotCenter = util.vector.centerOf(depotPos.south()); - scene.overlay.showControls(new InputWindowElement(depotCenter, Pointing.UP).withItem(copper), 30); + scene.world().createItemOnBeltLike(depotPos, Direction.NORTH, copper); + Vec3 depotCenter = util.vector().centerOf(depotPos.south()); + scene.overlay().showControls(new InputWindowElement(depotCenter, Pointing.UP).withItem(copper), 30); scene.idle(10); Class type = MechanicalPressBlockEntity.class; - scene.world.modifyBlockEntity(pressPos, type, pte -> pte.getPressingBehaviour() + scene.world().modifyBlockEntity(pressPos, type, pte -> pte.getPressingBehaviour() .start(Mode.BELT)); scene.idle(30); - scene.world.modifyBlockEntity(pressPos, type, pte -> pte.getPressingBehaviour() + scene.world().modifyBlockEntity(pressPos, type, pte -> pte.getPressingBehaviour() .makePressingParticleEffect(depotCenter.add(0, 8 / 16f, 0), copper)); - scene.world.removeItemsFromBelt(depotPos); + scene.world().removeItemsFromBelt(depotPos); ItemStack sheet = AllItems.COPPER_SHEET.asStack(); - scene.world.createItemOnBeltLike(depotPos, Direction.UP, sheet); + scene.world().createItemOnBeltLike(depotPos, Direction.UP, sheet); scene.idle(10); - scene.overlay.showControls(new InputWindowElement(depotCenter, Pointing.UP).withItem(sheet), 50); + scene.overlay().showControls(new InputWindowElement(depotCenter, Pointing.UP).withItem(sheet), 50); scene.idle(60); - scene.world.hideIndependentSection(depot, Direction.NORTH); + scene.world().hideIndependentSection(depot, Direction.NORTH); scene.idle(5); - scene.world.showSection(util.select.fromTo(0, 1, 3, 0, 2, 3), Direction.DOWN); + scene.world().showSection(util.select().fromTo(0, 1, 3, 0, 2, 3), Direction.DOWN); scene.idle(10); - scene.world.showSection(util.select.fromTo(4, 1, 2, 0, 2, 2), Direction.SOUTH); + scene.world().showSection(util.select().fromTo(4, 1, 2, 0, 2, 2), Direction.SOUTH); scene.idle(20); - BlockPos beltPos = util.grid.at(0, 1, 2); - scene.overlay.showText(40) - .pointAt(util.vector.blockSurface(beltPos, Direction.WEST)) + BlockPos beltPos = util.grid().at(0, 1, 2); + scene.overlay().showText(40) + .pointAt(util.vector().blockSurface(beltPos, Direction.WEST)) .placeNearTarget() .attachKeyFrame() .text("When items are provided on a belt..."); scene.idle(30); - ElementLink ingot = scene.world.createItemOnBelt(beltPos, Direction.SOUTH, copper); + ElementLink ingot = scene.world().createItemOnBelt(beltPos, Direction.SOUTH, copper); scene.idle(15); - ElementLink ingot2 = scene.world.createItemOnBelt(beltPos, Direction.SOUTH, copper); + ElementLink ingot2 = scene.world().createItemOnBelt(beltPos, Direction.SOUTH, copper); scene.idle(15); - scene.world.stallBeltItem(ingot, true); - scene.world.modifyBlockEntity(pressPos, type, pte -> pte.getPressingBehaviour() + scene.world().stallBeltItem(ingot, true); + scene.world().modifyBlockEntity(pressPos, type, pte -> pte.getPressingBehaviour() .start(Mode.BELT)); - scene.overlay.showText(50) + scene.overlay().showText(50) .pointAt(pressSide) .placeNearTarget() .attachKeyFrame() .text("The Press will hold and process them automatically"); scene.idle(30); - scene.world.modifyBlockEntity(pressPos, type, pte -> pte.getPressingBehaviour() + scene.world().modifyBlockEntity(pressPos, type, pte -> pte.getPressingBehaviour() .makePressingParticleEffect(depotCenter.add(0, 8 / 16f, 0), copper)); - scene.world.removeItemsFromBelt(pressPos.below(2)); - ingot = scene.world.createItemOnBelt(pressPos.below(2), Direction.UP, sheet); - scene.world.stallBeltItem(ingot, true); + scene.world().removeItemsFromBelt(pressPos.below(2)); + ingot = scene.world().createItemOnBelt(pressPos.below(2), Direction.UP, sheet); + scene.world().stallBeltItem(ingot, true); scene.idle(15); - scene.world.stallBeltItem(ingot, false); + scene.world().stallBeltItem(ingot, false); scene.idle(15); - scene.world.stallBeltItem(ingot2, true); - scene.world.modifyBlockEntity(pressPos, type, pte -> pte.getPressingBehaviour() + scene.world().stallBeltItem(ingot2, true); + scene.world().modifyBlockEntity(pressPos, type, pte -> pte.getPressingBehaviour() .start(Mode.BELT)); scene.idle(30); - scene.world.modifyBlockEntity(pressPos, type, pte -> pte.getPressingBehaviour() + scene.world().modifyBlockEntity(pressPos, type, pte -> pte.getPressingBehaviour() .makePressingParticleEffect(depotCenter.add(0, 8 / 16f, 0), copper)); - scene.world.removeItemsFromBelt(pressPos.below(2)); - ingot2 = scene.world.createItemOnBelt(pressPos.below(2), Direction.UP, sheet); - scene.world.stallBeltItem(ingot2, true); + scene.world().removeItemsFromBelt(pressPos.below(2)); + ingot2 = scene.world().createItemOnBelt(pressPos.below(2), Direction.UP, sheet); + scene.world().stallBeltItem(ingot2, true); scene.idle(15); - scene.world.stallBeltItem(ingot2, false); + scene.world().stallBeltItem(ingot2, false); } @@ -385,54 +385,54 @@ public class ProcessingScenes { CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("mechanical_mixer", "Processing Items with the Mechanical Mixer"); scene.configureBasePlate(0, 0, 5); - scene.world.setBlock(util.grid.at(1, 1, 2), AllBlocks.ANDESITE_CASING.getDefaultState(), false); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().setBlock(util.grid().at(1, 1, 2), AllBlocks.ANDESITE_CASING.getDefaultState(), false); + scene.world().showSection(util.select().layer(0), Direction.UP); scene.idle(5); - scene.world.showSection(util.select.fromTo(1, 4, 3, 1, 1, 5), Direction.DOWN); + scene.world().showSection(util.select().fromTo(1, 4, 3, 1, 1, 5), Direction.DOWN); scene.idle(5); - scene.world.showSection(util.select.position(1, 1, 2), Direction.DOWN); + scene.world().showSection(util.select().position(1, 1, 2), Direction.DOWN); scene.idle(5); - scene.world.showSection(util.select.position(1, 2, 2), Direction.DOWN); + scene.world().showSection(util.select().position(1, 2, 2), Direction.DOWN); scene.idle(5); - scene.world.showSection(util.select.position(1, 4, 2), Direction.SOUTH); + scene.world().showSection(util.select().position(1, 4, 2), Direction.SOUTH); scene.idle(5); - scene.world.showSection(util.select.fromTo(3, 1, 1, 1, 1, 1), Direction.SOUTH); - scene.world.showSection(util.select.fromTo(3, 1, 5, 3, 1, 2), Direction.SOUTH); + scene.world().showSection(util.select().fromTo(3, 1, 1, 1, 1, 1), Direction.SOUTH); + scene.world().showSection(util.select().fromTo(3, 1, 5, 3, 1, 2), Direction.SOUTH); scene.idle(20); - BlockPos basin = util.grid.at(1, 2, 2); - BlockPos pressPos = util.grid.at(1, 4, 2); - Vec3 basinSide = util.vector.blockSurface(basin, Direction.WEST); + BlockPos basin = util.grid().at(1, 2, 2); + BlockPos pressPos = util.grid().at(1, 4, 2); + Vec3 basinSide = util.vector().blockSurface(basin, Direction.WEST); ItemStack blue = new ItemStack(Items.BLUE_DYE); ItemStack red = new ItemStack(Items.RED_DYE); ItemStack purple = new ItemStack(Items.PURPLE_DYE); - scene.overlay.showText(60) + scene.overlay().showText(60) .pointAt(basinSide) .placeNearTarget() .attachKeyFrame() .text("With a Mixer and Basin, some Crafting Recipes can be automated"); scene.idle(40); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(basin), Pointing.LEFT).withItem(blue), 30); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(basin), Pointing.RIGHT).withItem(red), 30); + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(basin), Pointing.LEFT).withItem(blue), 30); + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(basin), Pointing.RIGHT).withItem(red), 30); scene.idle(30); Class type = MechanicalMixerBlockEntity.class; - scene.world.modifyBlockEntity(pressPos, type, pte -> pte.startProcessingBasin()); - scene.world.createItemOnBeltLike(basin, Direction.UP, red); - scene.world.createItemOnBeltLike(basin, Direction.UP, blue); + scene.world().modifyBlockEntity(pressPos, type, pte -> pte.startProcessingBasin()); + scene.world().createItemOnBeltLike(basin, Direction.UP, red); + scene.world().createItemOnBeltLike(basin, Direction.UP, blue); scene.idle(80); - scene.world.modifyBlockEntityNBT(util.select.position(basin), BasinBlockEntity.class, nbt -> { + scene.world().modifyBlockEntityNBT(util.select().position(basin), BasinBlockEntity.class, nbt -> { nbt.put("VisualizedItems", NBTHelper.writeCompoundList(ImmutableList.of(IntAttached.with(1, purple)), ia -> ia.getValue() .serializeNBT())); }); scene.idle(4); - scene.world.createItemOnBelt(util.grid.at(1, 1, 1), Direction.UP, purple); + scene.world().createItemOnBelt(util.grid().at(1, 1, 1), Direction.UP, purple); scene.idle(30); - scene.overlay.showText(80) + scene.overlay().showText(80) .pointAt(basinSide) .placeNearTarget() .attachKeyFrame() @@ -441,11 +441,11 @@ public class ProcessingScenes { scene.rotateCameraY(-30); scene.idle(10); - scene.world.setBlock(util.grid.at(1, 1, 2), AllBlocks.BLAZE_BURNER.getDefaultState() + scene.world().setBlock(util.grid().at(1, 1, 2), AllBlocks.BLAZE_BURNER.getDefaultState() .setValue(BlazeBurnerBlock.HEAT_LEVEL, HeatLevel.KINDLED), true); scene.idle(10); - scene.overlay.showText(80) + scene.overlay().showText(80) .pointAt(basinSide.subtract(0, 1, 0)) .placeNearTarget() .text("Some of those recipes may require the heat of a Blaze Burner"); @@ -454,9 +454,9 @@ public class ProcessingScenes { scene.rotateCameraY(30); scene.idle(60); - Vec3 filterPos = util.vector.of(1, 2.75f, 2.5f); - scene.overlay.showFilterSlotInput(filterPos, Direction.WEST, 100); - scene.overlay.showText(100) + Vec3 filterPos = util.vector().of(1, 2.75f, 2.5f); + scene.overlay().showFilterSlotInput(filterPos, Direction.WEST, 100); + scene.overlay().showText(100) .pointAt(filterPos) .placeNearTarget() .attachKeyFrame() @@ -468,54 +468,54 @@ public class ProcessingScenes { CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("mechanical_press_compacting", "Compacting items with the Mechanical Press"); scene.configureBasePlate(0, 0, 5); - scene.world.setBlock(util.grid.at(1, 1, 2), AllBlocks.ANDESITE_CASING.getDefaultState(), false); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().setBlock(util.grid().at(1, 1, 2), AllBlocks.ANDESITE_CASING.getDefaultState(), false); + scene.world().showSection(util.select().layer(0), Direction.UP); scene.idle(5); - scene.world.showSection(util.select.fromTo(1, 4, 3, 1, 1, 5), Direction.DOWN); + scene.world().showSection(util.select().fromTo(1, 4, 3, 1, 1, 5), Direction.DOWN); scene.idle(5); - scene.world.showSection(util.select.position(1, 1, 2), Direction.DOWN); + scene.world().showSection(util.select().position(1, 1, 2), Direction.DOWN); scene.idle(5); - scene.world.showSection(util.select.position(1, 2, 2), Direction.DOWN); + scene.world().showSection(util.select().position(1, 2, 2), Direction.DOWN); scene.idle(5); - scene.world.showSection(util.select.position(1, 4, 2), Direction.SOUTH); + scene.world().showSection(util.select().position(1, 4, 2), Direction.SOUTH); scene.idle(5); - scene.world.showSection(util.select.fromTo(3, 1, 1, 1, 1, 1), Direction.SOUTH); - scene.world.showSection(util.select.fromTo(3, 1, 5, 3, 1, 2), Direction.SOUTH); + scene.world().showSection(util.select().fromTo(3, 1, 1, 1, 1, 1), Direction.SOUTH); + scene.world().showSection(util.select().fromTo(3, 1, 5, 3, 1, 2), Direction.SOUTH); scene.idle(20); - BlockPos basin = util.grid.at(1, 2, 2); - BlockPos pressPos = util.grid.at(1, 4, 2); - Vec3 basinSide = util.vector.blockSurface(basin, Direction.WEST); + BlockPos basin = util.grid().at(1, 2, 2); + BlockPos pressPos = util.grid().at(1, 4, 2); + Vec3 basinSide = util.vector().blockSurface(basin, Direction.WEST); ItemStack copper = new ItemStack(Items.COPPER_INGOT); ItemStack copperBlock = new ItemStack(Items.COPPER_BLOCK); - scene.overlay.showText(60) + scene.overlay().showText(60) .pointAt(basinSide) .placeNearTarget() .attachKeyFrame() .text("Pressing items held in a Basin will cause them to be Compacted"); scene.idle(40); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(basin), Pointing.DOWN).withItem(copper), - 30); + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(basin), Pointing.DOWN).withItem(copper), + 30); scene.idle(30); Class type = MechanicalPressBlockEntity.class; - scene.world.modifyBlockEntity(pressPos, type, pte -> pte.getPressingBehaviour() + scene.world().modifyBlockEntity(pressPos, type, pte -> pte.getPressingBehaviour() .start(Mode.BASIN)); scene.idle(30); - scene.world.modifyBlockEntity(pressPos, type, pte -> pte.getPressingBehaviour() - .makeCompactingParticleEffect(util.vector.centerOf(basin), copper)); - scene.world.modifyBlockEntityNBT(util.select.position(basin), BasinBlockEntity.class, nbt -> { + scene.world().modifyBlockEntity(pressPos, type, pte -> pte.getPressingBehaviour() + .makeCompactingParticleEffect(util.vector().centerOf(basin), copper)); + scene.world().modifyBlockEntityNBT(util.select().position(basin), BasinBlockEntity.class, nbt -> { nbt.put("VisualizedItems", NBTHelper.writeCompoundList(ImmutableList.of(IntAttached.with(1, copperBlock)), ia -> ia.getValue() .serializeNBT())); }); scene.idle(4); - scene.world.createItemOnBelt(util.grid.at(1, 1, 1), Direction.UP, copperBlock); + scene.world().createItemOnBelt(util.grid().at(1, 1, 1), Direction.UP, copperBlock); scene.idle(30); - scene.overlay.showText(80) + scene.overlay().showText(80) .pointAt(basinSide) .placeNearTarget() .attachKeyFrame() @@ -525,29 +525,29 @@ public class ProcessingScenes { ItemStack log = new ItemStack(Items.OAK_LOG); ItemStack bark = new ItemStack(Items.OAK_WOOD); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(basin), Pointing.DOWN).withItem(log), 30); + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(basin), Pointing.DOWN).withItem(log), 30); scene.idle(30); - scene.world.modifyBlockEntity(pressPos, type, pte -> pte.getPressingBehaviour() + scene.world().modifyBlockEntity(pressPos, type, pte -> pte.getPressingBehaviour() .start(Mode.BASIN)); scene.idle(30); - scene.world.modifyBlockEntity(pressPos, type, pte -> pte.getPressingBehaviour() - .makeCompactingParticleEffect(util.vector.centerOf(basin), log)); - scene.world.modifyBlockEntityNBT(util.select.position(basin), BasinBlockEntity.class, nbt -> { + scene.world().modifyBlockEntity(pressPos, type, pte -> pte.getPressingBehaviour() + .makeCompactingParticleEffect(util.vector().centerOf(basin), log)); + scene.world().modifyBlockEntityNBT(util.select().position(basin), BasinBlockEntity.class, nbt -> { nbt.put("VisualizedItems", NBTHelper.writeCompoundList(ImmutableList.of(IntAttached.with(1, bark)), ia -> ia.getValue() .serializeNBT())); }); scene.idle(4); - scene.world.createItemOnBelt(util.grid.at(1, 1, 1), Direction.UP, bark); + scene.world().createItemOnBelt(util.grid().at(1, 1, 1), Direction.UP, bark); scene.idle(30); scene.rotateCameraY(-30); scene.idle(10); - scene.world.setBlock(util.grid.at(1, 1, 2), AllBlocks.BLAZE_BURNER.getDefaultState() + scene.world().setBlock(util.grid().at(1, 1, 2), AllBlocks.BLAZE_BURNER.getDefaultState() .setValue(BlazeBurnerBlock.HEAT_LEVEL, HeatLevel.KINDLED), true); scene.idle(10); - scene.overlay.showText(80) + scene.overlay().showText(80) .pointAt(basinSide.subtract(0, 1, 0)) .placeNearTarget() .text("Some of those recipes may require the heat of a Blaze Burner"); @@ -556,9 +556,9 @@ public class ProcessingScenes { scene.rotateCameraY(30); scene.idle(60); - Vec3 filterPos = util.vector.of(1, 2.75f, 2.5f); - scene.overlay.showFilterSlotInput(filterPos, Direction.WEST, 100); - scene.overlay.showText(100) + Vec3 filterPos = util.vector().of(1, 2.75f, 2.5f); + scene.overlay().showFilterSlotInput(filterPos, Direction.WEST, 100); + scene.overlay().showText(100) .pointAt(filterPos) .placeNearTarget() .attachKeyFrame() @@ -569,92 +569,92 @@ public class ProcessingScenes { public static void emptyBlazeBurner(SceneBuilder scene, SceneBuildingUtil util) { scene.title("empty_blaze_burner", "Using Empty Blaze Burners"); scene.configureBasePlate(0, 0, 5); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); scene.idle(10); - BlockPos center = util.grid.at(2, 0, 2); + BlockPos center = util.grid().at(2, 0, 2); - scene.world.createEntity(w -> { + scene.world().createEntity(w -> { Blaze blazeEntity = EntityType.BLAZE.create(w); - Vec3 v = util.vector.topOf(center); + Vec3 v = util.vector().topOf(center); blazeEntity.setPosRaw(v.x, v.y, v.z); blazeEntity.setYRot(blazeEntity.yRotO = 180); return blazeEntity; }); scene.idle(20); - scene.overlay - .showControls(new InputWindowElement(util.vector.centerOf(center.above(2)), Pointing.DOWN).rightClick() + scene.overlay() + .showControls(new InputWindowElement(util.vector().centerOf(center.above(2)), Pointing.DOWN).rightClick() .withItem(AllItems.EMPTY_BLAZE_BURNER.asStack()), 40); scene.idle(10); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("Right-click a Blaze with the empty burner to capture it") .attachKeyFrame() - .pointAt(util.vector.blockSurface(center.above(2), Direction.WEST)) + .pointAt(util.vector().blockSurface(center.above(2), Direction.WEST)) .placeNearTarget(); scene.idle(50); - scene.world.modifyEntities(Blaze.class, Entity::discard); + scene.world().modifyEntities(Blaze.class, Entity::discard); scene.idle(20); - scene.world.showSection(util.select.position(2, 1, 2), Direction.DOWN); + scene.world().showSection(util.select().position(2, 1, 2), Direction.DOWN); scene.idle(20); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(center.above()), Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(center.above()), Pointing.DOWN).rightClick() .withItem(AllItems.EMPTY_BLAZE_BURNER.asStack()), 40); scene.idle(10); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("Alternatively, Blazes can be collected from their Spawners directly") .attachKeyFrame() - .pointAt(util.vector.blockSurface(center.above(), Direction.WEST)) + .pointAt(util.vector().blockSurface(center.above(), Direction.WEST)) .placeNearTarget(); scene.idle(50); - scene.world.hideSection(util.select.position(2, 1, 2), Direction.UP); + scene.world().hideSection(util.select().position(2, 1, 2), Direction.UP); scene.idle(20); - scene.world.showSection(util.select.position(1, 1, 2), Direction.DOWN); + scene.world().showSection(util.select().position(1, 1, 2), Direction.DOWN); scene.idle(20); - scene.world.modifyBlock(util.grid.at(1, 1, 2), s -> s.setValue(BlazeBurnerBlock.HEAT_LEVEL, HeatLevel.KINDLED), - false); - scene.overlay.showText(70) + scene.world().modifyBlock(util.grid().at(1, 1, 2), s -> s.setValue(BlazeBurnerBlock.HEAT_LEVEL, HeatLevel.KINDLED), + false); + scene.overlay().showText(70) .text("You now have an ideal heat source for various machines") .attachKeyFrame() - .pointAt(util.vector.blockSurface(center.west() + .pointAt(util.vector().blockSurface(center.west() .above(), Direction.WEST)) .placeNearTarget(); scene.idle(80); - scene.world.showSection(util.select.position(3, 1, 2), Direction.DOWN); + scene.world().showSection(util.select().position(3, 1, 2), Direction.DOWN); scene.idle(20); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(center.east() + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(center.east() .above()), Pointing.DOWN).rightClick() .withItem(new ItemStack(Items.FLINT_AND_STEEL)), - 40); + 40); scene.idle(7); - scene.world.setBlock(util.grid.at(3, 1, 2), AllBlocks.LIT_BLAZE_BURNER.getDefaultState(), false); + scene.world().setBlock(util.grid().at(3, 1, 2), AllBlocks.LIT_BLAZE_BURNER.getDefaultState(), false); scene.idle(10); - scene.overlay.showText(70) + scene.overlay().showText(70) .text("For Aesthetic purposes, Empty Blaze Burners can also be lit using Flint and Steel") .attachKeyFrame() - .pointAt(util.vector.blockSurface(center.east() + .pointAt(util.vector().blockSurface(center.east() .above(), Direction.UP)) .placeNearTarget(); scene.idle(80); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(center.east() + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(center.east() .above()), Pointing.DOWN).rightClick() .withItem(new ItemStack(Items.SOUL_SAND)), - 40); + 40); scene.idle(7); - scene.world.modifyBlock(util.grid.at(3, 1, 2), + scene.world().modifyBlock(util.grid().at(3, 1, 2), s -> s.setValue(LitBlazeBurnerBlock.FLAME_TYPE, LitBlazeBurnerBlock.FlameType.SOUL), false); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("The flame can be transformed using a soul-infused item") - .pointAt(util.vector.blockSurface(center.east() + .pointAt(util.vector().blockSurface(center.east() .above(), Direction.UP)) .placeNearTarget(); scene.idle(80); - scene.overlay.showText(90) + scene.overlay().showText(90) .colored(PonderPalette.RED) .text("However, without a blaze they are not suitable for industrial heating") - .pointAt(util.vector.blockSurface(center.east() + .pointAt(util.vector().blockSurface(center.east() .above(), Direction.UP)) .placeNearTarget(); scene.idle(70); @@ -666,66 +666,66 @@ public class ProcessingScenes { scene.showBasePlate(); scene.idle(10); - BlockPos burner = util.grid.at(2, 1, 2); - scene.world.showSection(util.select.position(burner), Direction.DOWN); + BlockPos burner = util.grid().at(2, 1, 2); + scene.world().showSection(util.select().position(burner), Direction.DOWN); scene.idle(10); - scene.world.showSection(util.select.position(burner.above()), Direction.DOWN); + scene.world().showSection(util.select().position(burner.above()), Direction.DOWN); scene.idle(10); - scene.overlay.showText(70) + scene.overlay().showText(70) .attachKeyFrame() .text("Blaze Burners can provide Heat to Items processed in a Basin") - .pointAt(util.vector.blockSurface(burner, Direction.WEST)) + .pointAt(util.vector().blockSurface(burner, Direction.WEST)) .placeNearTarget(); scene.idle(80); - scene.world.hideSection(util.select.position(burner.above()), Direction.UP); + scene.world().hideSection(util.select().position(burner.above()), Direction.UP); scene.idle(20); - scene.world.setBlock(burner.above(), Blocks.AIR.defaultBlockState(), false); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(burner), Pointing.DOWN).rightClick() + scene.world().setBlock(burner.above(), Blocks.AIR.defaultBlockState(), false); + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(burner), Pointing.DOWN).rightClick() .withItem(new ItemStack(Items.OAK_PLANKS)), 15); scene.idle(7); - scene.world.modifyBlock(burner, s -> s.setValue(BlazeBurnerBlock.HEAT_LEVEL, HeatLevel.KINDLED), false); + scene.world().modifyBlock(burner, s -> s.setValue(BlazeBurnerBlock.HEAT_LEVEL, HeatLevel.KINDLED), false); scene.idle(20); - scene.overlay.showText(70) + scene.overlay().showText(70) .attachKeyFrame() .text("For this, the Blaze has to be fed with flammable items") - .pointAt(util.vector.blockSurface(burner, Direction.WEST)) + .pointAt(util.vector().blockSurface(burner, Direction.WEST)) .placeNearTarget(); scene.idle(80); scene.idle(20); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(burner), Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(burner), Pointing.DOWN).rightClick() .withItem(AllItems.BLAZE_CAKE.asStack()), 30); scene.idle(7); - scene.world.modifyBlock(burner, s -> s.setValue(BlazeBurnerBlock.HEAT_LEVEL, HeatLevel.SEETHING), false); + scene.world().modifyBlock(burner, s -> s.setValue(BlazeBurnerBlock.HEAT_LEVEL, HeatLevel.SEETHING), false); scene.idle(20); - scene.overlay.showText(80) + scene.overlay().showText(80) .attachKeyFrame() .colored(PonderPalette.MEDIUM) .text("With a Blaze Cake, the Burner can reach an even stronger level of heat") - .pointAt(util.vector.blockSurface(burner, Direction.WEST)) + .pointAt(util.vector().blockSurface(burner, Direction.WEST)) .placeNearTarget(); scene.idle(90); Class teType = DeployerBlockEntity.class; - scene.world.modifyBlockEntityNBT(util.select.position(4, 1, 2), teType, + scene.world().modifyBlockEntityNBT(util.select().position(4, 1, 2), teType, nbt -> nbt.put("HeldItem", AllItems.BLAZE_CAKE.asStack() .serializeNBT())); - scene.world.showSection(util.select.fromTo(3, 0, 5, 2, 0, 5), Direction.UP); + scene.world().showSection(util.select().fromTo(3, 0, 5, 2, 0, 5), Direction.UP); scene.idle(5); - scene.world.showSection(util.select.fromTo(4, 1, 2, 4, 1, 5), Direction.DOWN); + scene.world().showSection(util.select().fromTo(4, 1, 2, 4, 1, 5), Direction.DOWN); scene.idle(5); - scene.world.showSection(util.select.fromTo(2, 1, 4, 2, 1, 5), Direction.DOWN); + scene.world().showSection(util.select().fromTo(2, 1, 4, 2, 1, 5), Direction.DOWN); scene.idle(10); - scene.overlay.showText(80) + scene.overlay().showText(80) .attachKeyFrame() .text("The feeding process can be automated using Deployers or Mechanical Arms") - .pointAt(util.vector.blockSurface(burner.east(2), Direction.UP)); + .pointAt(util.vector().blockSurface(burner.east(2), Direction.UP)); scene.idle(90); } @@ -733,17 +733,17 @@ public class ProcessingScenes { CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("basin", "Processing Items in the Basin"); scene.configureBasePlate(0, 0, 5); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); scene.idle(5); - scene.world.showSection(util.select.position(1, 1, 2), Direction.DOWN); + scene.world().showSection(util.select().position(1, 1, 2), Direction.DOWN); scene.idle(10); - BlockPos basinPos = util.grid.at(1, 2, 2); - scene.world.modifyBlock(basinPos, s -> s.setValue(BasinBlock.FACING, Direction.DOWN), false); - scene.world.showSection(util.select.position(basinPos), Direction.DOWN); + BlockPos basinPos = util.grid().at(1, 2, 2); + scene.world().modifyBlock(basinPos, s -> s.setValue(BasinBlock.FACING, Direction.DOWN), false); + scene.world().showSection(util.select().position(basinPos), Direction.DOWN); scene.idle(10); - Vec3 basinSide = util.vector.blockSurface(basinPos, Direction.WEST); - scene.overlay.showText(80) + Vec3 basinSide = util.vector().blockSurface(basinPos, Direction.WEST); + scene.overlay().showText(80) .attachKeyFrame() .text("A Basin can hold Items and Fluids for Processing") .pointAt(basinSide) @@ -752,21 +752,21 @@ public class ProcessingScenes { ItemStack stack = new ItemStack(Items.BRICK); for (int i = 0; i < 4; i++) { - scene.world.createItemEntity(util.vector.centerOf(basinPos.above(3)), util.vector.of(0, 0, 0), stack); + scene.world().createItemEntity(util.vector().centerOf(basinPos.above(3)), util.vector().of(0, 0, 0), stack); scene.idle(10); } scene.idle(10); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(basinPos), Pointing.DOWN).withItem(stack), - 30); + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(basinPos), Pointing.DOWN).withItem(stack), + 30); scene.idle(30); for (Direction d : Iterate.horizontalDirections) { - scene.overlay.showOutline(PonderPalette.GREEN, new Object(), util.select.position(basinPos.below() + scene.overlay().showOutline(PonderPalette.GREEN, new Object(), util.select().position(basinPos.below() .relative(d)), 60); scene.idle(4); } - scene.overlay.showText(80) + scene.overlay().showText(80) .attachKeyFrame() .colored(PonderPalette.GREEN) .text("After a processing step, basins try to output below to the side of them") @@ -775,13 +775,13 @@ public class ProcessingScenes { scene.idle(90); ElementLink depot = - scene.world.showIndependentSection(util.select.position(3, 1, 1), Direction.EAST); - scene.world.moveSection(depot, util.vector.of(-2, 0, 0), 0); + scene.world().showIndependentSection(util.select().position(3, 1, 1), Direction.EAST); + scene.world().moveSection(depot, util.vector().of(-2, 0, 0), 0); scene.idle(10); - scene.world.modifyBlock(basinPos, s -> s.setValue(BasinBlock.FACING, Direction.NORTH), false); + scene.world().modifyBlock(basinPos, s -> s.setValue(BasinBlock.FACING, Direction.NORTH), false); scene.idle(10); - scene.overlay.showText(80) + scene.overlay().showText(80) .attachKeyFrame() .colored(PonderPalette.GREEN) .text("When a valid component is present, the Basin will show an output faucet") @@ -789,61 +789,61 @@ public class ProcessingScenes { .placeNearTarget(); scene.idle(90); - scene.world.hideIndependentSection(depot, Direction.EAST); + scene.world().hideIndependentSection(depot, Direction.EAST); scene.idle(15); - depot = scene.world.showIndependentSection(util.select.position(0, 1, 1), Direction.EAST); - scene.world.moveSection(depot, util.vector.of(1, 0, 0), 0); + depot = scene.world().showIndependentSection(util.select().position(0, 1, 1), Direction.EAST); + scene.world().moveSection(depot, util.vector().of(1, 0, 0), 0); scene.idle(20); - scene.world.hideIndependentSection(depot, Direction.EAST); + scene.world().hideIndependentSection(depot, Direction.EAST); - scene.overlay.showText(80) + scene.overlay().showText(80) .text("A number of options are applicable here") - .pointAt(util.vector.centerOf(util.grid.at(1, 1, 1))) + .pointAt(util.vector().centerOf(util.grid().at(1, 1, 1))) .placeNearTarget(); scene.idle(15); - depot = scene.world.showIndependentSection(util.select.position(1, 1, 0), Direction.EAST); - scene.world.moveSection(depot, util.vector.of(0, 0, 1), 0); + depot = scene.world().showIndependentSection(util.select().position(1, 1, 0), Direction.EAST); + scene.world().moveSection(depot, util.vector().of(0, 0, 1), 0); scene.idle(20); - scene.world.hideIndependentSection(depot, Direction.EAST); + scene.world().hideIndependentSection(depot, Direction.EAST); scene.idle(15); - depot = scene.world.showIndependentSection(util.select.position(1, 1, 1), Direction.EAST); + depot = scene.world().showIndependentSection(util.select().position(1, 1, 1), Direction.EAST); scene.idle(20); - scene.world.hideIndependentSection(depot, Direction.EAST); + scene.world().hideIndependentSection(depot, Direction.EAST); scene.idle(15); - depot = scene.world.showIndependentSection(util.select.fromTo(3, 1, 0, 2, 1, 0), Direction.EAST); - scene.world.moveSection(depot, util.vector.of(-2, 0, 1), 0); + depot = scene.world().showIndependentSection(util.select().fromTo(3, 1, 0, 2, 1, 0), Direction.EAST); + scene.world().moveSection(depot, util.vector().of(-2, 0, 1), 0); scene.idle(20); - scene.world.hideIndependentSection(depot, Direction.EAST); + scene.world().hideIndependentSection(depot, Direction.EAST); scene.idle(15); - depot = scene.world.showIndependentSection(util.select.position(2, 1, 1), Direction.EAST); - scene.world.moveSection(depot, util.vector.of(-1, 0, 0), 0); + depot = scene.world().showIndependentSection(util.select().position(2, 1, 1), Direction.EAST); + scene.world().moveSection(depot, util.vector().of(-1, 0, 0), 0); scene.idle(25); - BlockPos pressPos = util.grid.at(1, 4, 2); - scene.world.showSection(util.select.position(pressPos), Direction.DOWN); + BlockPos pressPos = util.grid().at(1, 4, 2); + scene.world().showSection(util.select().position(pressPos), Direction.DOWN); scene.idle(5); - scene.world.showSection(util.select.fromTo(1, 4, 3, 1, 1, 5), Direction.NORTH); + scene.world().showSection(util.select().fromTo(1, 4, 3, 1, 1, 5), Direction.NORTH); scene.idle(10); Class type = MechanicalPressBlockEntity.class; - scene.world.modifyBlockEntity(pressPos, type, pte -> pte.getPressingBehaviour() + scene.world().modifyBlockEntity(pressPos, type, pte -> pte.getPressingBehaviour() .start(Mode.BASIN)); scene.idle(30); - scene.world.modifyBlockEntity(pressPos, type, pte -> pte.getPressingBehaviour() - .makeCompactingParticleEffect(util.vector.centerOf(basinPos), stack)); - scene.world.modifyBlockEntityNBT(util.select.position(basinPos), BasinBlockEntity.class, nbt -> { + scene.world().modifyBlockEntity(pressPos, type, pte -> pte.getPressingBehaviour() + .makeCompactingParticleEffect(util.vector().centerOf(basinPos), stack)); + scene.world().modifyBlockEntityNBT(util.select().position(basinPos), BasinBlockEntity.class, nbt -> { nbt.put("VisualizedItems", NBTHelper.writeCompoundList(ImmutableList.of(IntAttached.with(1, new ItemStack(Blocks.BRICKS))), ia -> ia.getValue() .serializeNBT())); }); scene.idle(4); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(basinPos.below() + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(basinPos.below() .north()), Pointing.RIGHT).withItem(new ItemStack(Items.BRICKS)), 30); - scene.overlay.showText(60) + scene.overlay().showText(60) .attachKeyFrame() .colored(PonderPalette.GREEN) .text("Outputs will be caught by the inventory below") @@ -851,12 +851,12 @@ public class ProcessingScenes { .placeNearTarget(); scene.idle(70); - scene.world.hideIndependentSection(depot, Direction.NORTH); + scene.world().hideIndependentSection(depot, Direction.NORTH); scene.idle(10); - scene.world.modifyBlock(basinPos, s -> s.setValue(BasinBlock.FACING, Direction.DOWN), false); + scene.world().modifyBlock(basinPos, s -> s.setValue(BasinBlock.FACING, Direction.DOWN), false); scene.idle(20); - scene.overlay.showText(80) + scene.overlay().showText(80) .attachKeyFrame() .text("Without output faucet, the Basin will retain items created in its processing") .pointAt(basinSide) @@ -864,31 +864,31 @@ public class ProcessingScenes { scene.idle(50); ItemStack nugget = AllItems.COPPER_NUGGET.asStack(); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(basinPos), Pointing.RIGHT).withItem(nugget), - 30); + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(basinPos), Pointing.RIGHT).withItem(nugget), + 30); scene.idle(30); - scene.world.modifyBlockEntity(pressPos, type, pte -> pte.getPressingBehaviour() + scene.world().modifyBlockEntity(pressPos, type, pte -> pte.getPressingBehaviour() .start(Mode.BASIN)); scene.idle(30); - scene.world.modifyBlockEntity(pressPos, type, pte -> pte.getPressingBehaviour() - .makeCompactingParticleEffect(util.vector.centerOf(basinPos), nugget)); + scene.world().modifyBlockEntity(pressPos, type, pte -> pte.getPressingBehaviour() + .makeCompactingParticleEffect(util.vector().centerOf(basinPos), nugget)); ItemStack ingot = new ItemStack(Items.COPPER_INGOT); scene.idle(30); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(basinPos), Pointing.RIGHT).withItem(ingot), - 30); + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(basinPos), Pointing.RIGHT).withItem(ingot), + 30); scene.idle(30); - scene.world.modifyBlockEntity(pressPos, type, pte -> pte.getPressingBehaviour() + scene.world().modifyBlockEntity(pressPos, type, pte -> pte.getPressingBehaviour() .start(Mode.BASIN)); scene.idle(30); - scene.world.modifyBlockEntity(pressPos, type, pte -> pte.getPressingBehaviour() - .makeCompactingParticleEffect(util.vector.centerOf(basinPos), ingot)); + scene.world().modifyBlockEntity(pressPos, type, pte -> pte.getPressingBehaviour() + .makeCompactingParticleEffect(util.vector().centerOf(basinPos), ingot)); ItemStack block = new ItemStack(Items.COPPER_BLOCK); scene.idle(30); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(basinPos), Pointing.RIGHT).withItem(block), - 30); - scene.overlay.showText(70) + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(basinPos), Pointing.RIGHT).withItem(block), + 30); + scene.overlay().showText(70) .attachKeyFrame() .colored(PonderPalette.GREEN) .text("This can be useful if outputs should be re-used as ingredients") @@ -896,20 +896,20 @@ public class ProcessingScenes { .placeNearTarget(); scene.idle(80); - scene.world.showSection(util.select.fromTo(2, 2, 5, 4, 1, 2), Direction.DOWN); + scene.world().showSection(util.select().fromTo(2, 2, 5, 4, 1, 2), Direction.DOWN); scene.rotateCameraY(70); - scene.world.createItemOnBelt(util.grid.at(2, 1, 2), Direction.WEST, block); + scene.world().createItemOnBelt(util.grid().at(2, 1, 2), Direction.WEST, block); scene.idle(40); - scene.overlay.showText(70) + scene.overlay().showText(70) .text("Desired outputs will then have to be extracted from the basin") - .pointAt(util.vector.topOf(util.grid.at(3, 1, 2)) + .pointAt(util.vector().topOf(util.grid().at(3, 1, 2)) .subtract(0, 3 / 16f, 0)) .placeNearTarget(); scene.idle(80); - Vec3 filter = util.vector.of(2.5, 2.825, 2.5); - scene.overlay.showFilterSlotInput(filter, Direction.EAST, 80); - scene.overlay.showText(70) + Vec3 filter = util.vector().of(2.5, 2.825, 2.5); + scene.overlay().showFilterSlotInput(filter, Direction.EAST, 80); + scene.overlay().showText(70) .text("A Filter might be necessary to avoid pulling out un-processed items") .pointAt(filter) .placeNearTarget(); diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/PulleyScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/PulleyScenes.java index 932c80c653..e33ab324de 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/PulleyScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/PulleyScenes.java @@ -4,10 +4,10 @@ import com.simibubi.create.AllItems; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; import net.createmod.ponder.foundation.ElementLink; import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.SceneBuilder; -import net.createmod.ponder.foundation.SceneBuildingUtil; import net.createmod.ponder.foundation.Selection; import net.createmod.ponder.foundation.element.InputWindowElement; import net.createmod.ponder.foundation.element.WorldSectionElement; @@ -24,93 +24,93 @@ public class PulleyScenes { scene.scaleSceneView(0.95f); scene.setSceneOffsetY(-1); - Selection reversable = util.select.fromTo(2, 3, 4, 2, 4, 2); - BlockPos leverPos = util.grid.at(1, 2, 4); - BlockPos pulleyPos = util.grid.at(2, 4, 2); - Selection redstoneStuff = util.select.fromTo(leverPos, leverPos.east()); + Selection reversable = util.select().fromTo(2, 3, 4, 2, 4, 2); + BlockPos leverPos = util.grid().at(1, 2, 4); + BlockPos pulleyPos = util.grid().at(2, 4, 2); + Selection redstoneStuff = util.select().fromTo(leverPos, leverPos.east()); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); ElementLink plank = - scene.world.showIndependentSection(util.select.position(2, 1, 2), Direction.UP); + scene.world().showIndependentSection(util.select().position(2, 1, 2), Direction.UP); scene.idle(5); - scene.world.showSection(util.select.fromTo(1, 4, 3, 2, 1, 4), Direction.DOWN); + scene.world().showSection(util.select().fromTo(1, 4, 3, 2, 1, 4), Direction.DOWN); scene.idle(10); - scene.world.showSection(util.select.position(pulleyPos), Direction.SOUTH); + scene.world().showSection(util.select().position(pulleyPos), Direction.SOUTH); scene.idle(20); - scene.world.toggleRedstonePower(redstoneStuff); - scene.effects.indicateRedstone(leverPos); - scene.world.modifyKineticSpeed(reversable, f -> -f); - scene.effects.rotationDirectionIndicator(pulleyPos.south()); - scene.world.movePulley(pulleyPos, 2, 40); + scene.world().toggleRedstonePower(redstoneStuff); + scene.effects().indicateRedstone(leverPos); + scene.world().modifyKineticSpeed(reversable, f -> -f); + scene.effects().rotationDirectionIndicator(pulleyPos.south()); + scene.world().movePulley(pulleyPos, 2, 40); scene.idle(45); - scene.overlay.showText(60) - .pointAt(util.vector.blockSurface(pulleyPos, Direction.WEST)) + scene.overlay().showText(60) + .pointAt(util.vector().blockSurface(pulleyPos, Direction.WEST)) .attachKeyFrame() .text("Rope Pulleys can move blocks vertically when given Rotational Force") .placeNearTarget(); scene.idle(70); - scene.world.toggleRedstonePower(redstoneStuff); - scene.effects.indicateRedstone(leverPos); - scene.world.modifyKineticSpeed(reversable, f -> -f); - scene.effects.rotationDirectionIndicator(pulleyPos.south()); - scene.world.movePulley(pulleyPos, -2, 40); - scene.world.moveSection(plank, util.vector.of(0, 2, 0), 40); + scene.world().toggleRedstonePower(redstoneStuff); + scene.effects().indicateRedstone(leverPos); + scene.world().modifyKineticSpeed(reversable, f -> -f); + scene.effects().rotationDirectionIndicator(pulleyPos.south()); + scene.world().movePulley(pulleyPos, -2, 40); + scene.world().moveSection(plank, util.vector().of(0, 2, 0), 40); scene.idle(60); - scene.overlay.showText(60) - .pointAt(util.vector.blockSurface(pulleyPos, Direction.SOUTH)) + scene.overlay().showText(60) + .pointAt(util.vector().blockSurface(pulleyPos, Direction.SOUTH)) .text("Direction and Speed of movement depend on the Rotational Input") .placeNearTarget(); - scene.world.toggleRedstonePower(redstoneStuff); - scene.effects.indicateRedstone(leverPos); - scene.world.modifyKineticSpeed(reversable, f -> -f); - scene.effects.rotationDirectionIndicator(pulleyPos.south()); - scene.world.movePulley(pulleyPos, 2, 40); - scene.world.moveSection(plank, util.vector.of(0, -2, 0), 40); + scene.world().toggleRedstonePower(redstoneStuff); + scene.effects().indicateRedstone(leverPos); + scene.world().modifyKineticSpeed(reversable, f -> -f); + scene.effects().rotationDirectionIndicator(pulleyPos.south()); + scene.world().movePulley(pulleyPos, 2, 40); + scene.world().moveSection(plank, util.vector().of(0, -2, 0), 40); scene.idle(50); - scene.world.hideIndependentSection(plank, Direction.NORTH); + scene.world().hideIndependentSection(plank, Direction.NORTH); scene.idle(15); ElementLink chassis = - scene.world.showIndependentSection(util.select.fromTo(2, 1, 1, 0, 2, 1), Direction.SOUTH); - scene.world.moveSection(chassis, util.vector.of(1, 0, 1), 0); - scene.world.replaceBlocks(util.select.fromTo(0, 2, 1, 2, 1, 1), Blocks.OAK_PLANKS.defaultBlockState(), false); + scene.world().showIndependentSection(util.select().fromTo(2, 1, 1, 0, 2, 1), Direction.SOUTH); + scene.world().moveSection(chassis, util.vector().of(1, 0, 1), 0); + scene.world().replaceBlocks(util.select().fromTo(0, 2, 1, 2, 1, 1), Blocks.OAK_PLANKS.defaultBlockState(), false); scene.idle(5); - scene.world.showSectionAndMerge(util.select.position(2, 1, 0), Direction.SOUTH, chassis); - scene.overlay.showOutline(PonderPalette.GREEN, "glue", util.select.position(3, 1, 1) - .add(util.select.fromTo(1, 1, 2, 3, 1, 2)) - .add(util.select.position(1, 2, 2)), 40); - scene.overlay.showControls(new InputWindowElement(util.vector.centerOf(util.grid.at(2, 2, 0)), Pointing.RIGHT) + scene.world().showSectionAndMerge(util.select().position(2, 1, 0), Direction.SOUTH, chassis); + scene.overlay().showOutline(PonderPalette.GREEN, "glue", util.select().position(3, 1, 1) + .add(util.select().fromTo(1, 1, 2, 3, 1, 2)) + .add(util.select().position(1, 2, 2)), 40); + scene.overlay().showControls(new InputWindowElement(util.vector().centerOf(util.grid().at(2, 2, 0)), Pointing.RIGHT) .withItem(AllItems.SUPER_GLUE.asStack()), 40); scene.idle(15); - scene.effects.superGlue(util.grid.at(3, 1, 1), Direction.SOUTH, true); - scene.overlay.showText(80) - .pointAt(util.vector.blockSurface(util.grid.at(1, 2, 2), Direction.NORTH)) + scene.effects().superGlue(util.grid().at(3, 1, 1), Direction.SOUTH, true); + scene.overlay().showText(80) + .pointAt(util.vector().blockSurface(util.grid().at(1, 2, 2), Direction.NORTH)) .placeNearTarget() .attachKeyFrame() .sharedText("movement_anchors"); scene.idle(90); - scene.world.toggleRedstonePower(redstoneStuff); - scene.effects.indicateRedstone(leverPos); - scene.world.modifyKineticSpeed(reversable, f -> -f); - scene.effects.rotationDirectionIndicator(pulleyPos.south()); - scene.world.movePulley(pulleyPos, -2, 40); - scene.world.moveSection(chassis, util.vector.of(0, 2, 0), 40); + scene.world().toggleRedstonePower(redstoneStuff); + scene.effects().indicateRedstone(leverPos); + scene.world().modifyKineticSpeed(reversable, f -> -f); + scene.effects().rotationDirectionIndicator(pulleyPos.south()); + scene.world().movePulley(pulleyPos, -2, 40); + scene.world().moveSection(chassis, util.vector().of(0, 2, 0), 40); scene.idle(50); - scene.world.toggleRedstonePower(redstoneStuff); - scene.effects.indicateRedstone(leverPos); - scene.world.modifyKineticSpeed(reversable, f -> -f); - scene.effects.rotationDirectionIndicator(pulleyPos.south()); - scene.world.movePulley(pulleyPos, 2, 40); - scene.world.moveSection(chassis, util.vector.of(0, -2, 0), 40); + scene.world().toggleRedstonePower(redstoneStuff); + scene.effects().indicateRedstone(leverPos); + scene.world().modifyKineticSpeed(reversable, f -> -f); + scene.effects().rotationDirectionIndicator(pulleyPos.south()); + scene.world().movePulley(pulleyPos, 2, 40); + scene.world().moveSection(chassis, util.vector().of(0, -2, 0), 40); scene.idle(50); } @@ -121,71 +121,71 @@ public class PulleyScenes { scene.scaleSceneView(0.95f); scene.setSceneOffsetY(-1); - Selection reversable = util.select.fromTo(2, 3, 4, 2, 4, 2); - BlockPos leverPos = util.grid.at(1, 2, 4); - BlockPos pulleyPos = util.grid.at(2, 4, 2); - Selection redstoneStuff = util.select.fromTo(leverPos, leverPos.east()); - BlockPos flowerPos = util.grid.at(2, 1, 2); + Selection reversable = util.select().fromTo(2, 3, 4, 2, 4, 2); + BlockPos leverPos = util.grid().at(1, 2, 4); + BlockPos pulleyPos = util.grid().at(2, 4, 2); + Selection redstoneStuff = util.select().fromTo(leverPos, leverPos.east()); + BlockPos flowerPos = util.grid().at(2, 1, 2); - scene.world.showSection(util.select.layer(0), Direction.UP); - scene.world.showSection(util.select.position(flowerPos), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); + scene.world().showSection(util.select().position(flowerPos), Direction.UP); scene.idle(5); - scene.world.showSection(util.select.fromTo(1, 4, 3, 2, 1, 4), Direction.DOWN); + scene.world().showSection(util.select().fromTo(1, 4, 3, 2, 1, 4), Direction.DOWN); scene.idle(10); - scene.world.showSection(util.select.position(pulleyPos), Direction.SOUTH); + scene.world().showSection(util.select().position(pulleyPos), Direction.SOUTH); ElementLink glass = - scene.world.showIndependentSection(util.select.position(pulleyPos.below()), Direction.UP); + scene.world().showIndependentSection(util.select().position(pulleyPos.below()), Direction.UP); scene.idle(20); - scene.world.toggleRedstonePower(redstoneStuff); - scene.effects.indicateRedstone(leverPos); - scene.world.modifyKineticSpeed(reversable, f -> -f); - scene.effects.rotationDirectionIndicator(pulleyPos.south()); - scene.world.movePulley(pulleyPos, 2, 40); - scene.world.moveSection(glass, util.vector.of(0, -2, 0), 40); + scene.world().toggleRedstonePower(redstoneStuff); + scene.effects().indicateRedstone(leverPos); + scene.world().modifyKineticSpeed(reversable, f -> -f); + scene.effects().rotationDirectionIndicator(pulleyPos.south()); + scene.world().movePulley(pulleyPos, 2, 40); + scene.world().moveSection(glass, util.vector().of(0, -2, 0), 40); scene.idle(40); - scene.world.destroyBlock(flowerPos); + scene.world().destroyBlock(flowerPos); scene.idle(10); - scene.overlay.showSelectionWithText(util.select.position(flowerPos), 70) + scene.overlay().showSelectionWithText(util.select().position(flowerPos), 70) .text("Whenever Pulleys stop moving, the moved structure reverts to blocks") .attachKeyFrame() .placeNearTarget() .colored(PonderPalette.RED); scene.idle(80); - scene.world.toggleRedstonePower(redstoneStuff); - scene.effects.indicateRedstone(leverPos); - scene.world.modifyKineticSpeed(reversable, f -> -f); - scene.effects.rotationDirectionIndicator(pulleyPos.south()); - scene.world.movePulley(pulleyPos, -2, 40); - scene.world.moveSection(glass, util.vector.of(0, 2, 0), 40); - scene.world.hideSection(util.select.position(flowerPos), Direction.DOWN); + scene.world().toggleRedstonePower(redstoneStuff); + scene.effects().indicateRedstone(leverPos); + scene.world().modifyKineticSpeed(reversable, f -> -f); + scene.effects().rotationDirectionIndicator(pulleyPos.south()); + scene.world().movePulley(pulleyPos, -2, 40); + scene.world().moveSection(glass, util.vector().of(0, 2, 0), 40); + scene.world().hideSection(util.select().position(flowerPos), Direction.DOWN); scene.idle(40); - scene.world.setBlock(flowerPos, Blocks.BLUE_ORCHID.defaultBlockState(), false); - scene.world.showSection(util.select.position(flowerPos), Direction.DOWN); - scene.overlay.showCenteredScrollInput(pulleyPos, Direction.UP, 60); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(pulleyPos), Pointing.DOWN).rightClick(), - 60); - scene.overlay.showText(70) - .pointAt(util.vector.topOf(pulleyPos)) + scene.world().setBlock(flowerPos, Blocks.BLUE_ORCHID.defaultBlockState(), false); + scene.world().showSection(util.select().position(flowerPos), Direction.DOWN); + scene.overlay().showCenteredScrollInput(pulleyPos, Direction.UP, 60); + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(pulleyPos), Pointing.DOWN).rightClick(), + 60); + scene.overlay().showText(70) + .pointAt(util.vector().topOf(pulleyPos)) .placeNearTarget() .attachKeyFrame() .sharedText("behaviour_modify_value_panel"); scene.idle(80); - scene.world.toggleRedstonePower(redstoneStuff); - scene.effects.indicateRedstone(leverPos); - scene.world.modifyKineticSpeed(reversable, f -> -f); - scene.effects.rotationDirectionIndicator(pulleyPos.south()); - scene.world.movePulley(pulleyPos, 2, 40); - scene.world.moveSection(glass, util.vector.of(0, -2, 0), 40); + scene.world().toggleRedstonePower(redstoneStuff); + scene.effects().indicateRedstone(leverPos); + scene.world().modifyKineticSpeed(reversable, f -> -f); + scene.effects().rotationDirectionIndicator(pulleyPos.south()); + scene.world().movePulley(pulleyPos, 2, 40); + scene.world().moveSection(glass, util.vector().of(0, -2, 0), 40); scene.idle(50); - scene.overlay.showText(120) + scene.overlay().showText(120) .colored(PonderPalette.GREEN) - .pointAt(util.vector.blockSurface(flowerPos, Direction.WEST)) + .pointAt(util.vector().blockSurface(flowerPos, Direction.WEST)) .placeNearTarget() .text("It can be configured never to revert to solid blocks, or only at the location it started at"); scene.idle(90); @@ -197,49 +197,49 @@ public class PulleyScenes { scene.configureBasePlate(0, 0, 5); scene.scaleSceneView(0.95f); scene.setSceneOffsetY(-1); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); scene.idle(5); - Selection kinetics = util.select.fromTo(4, 3, 2, 4, 1, 5); - Selection largeCog = util.select.position(3, 0, 5); + Selection kinetics = util.select().fromTo(4, 3, 2, 4, 1, 5); + Selection largeCog = util.select().position(3, 0, 5); - scene.world.showSection(kinetics, Direction.DOWN); + scene.world().showSection(kinetics, Direction.DOWN); ElementLink poles = - scene.world.showIndependentSection(util.select.fromTo(4, 4, 2, 6, 4, 2), Direction.DOWN); - scene.world.moveSection(poles, util.vector.of(0, -1, 0), 0); + scene.world().showIndependentSection(util.select().fromTo(4, 4, 2, 6, 4, 2), Direction.DOWN); + scene.world().moveSection(poles, util.vector().of(0, -1, 0), 0); scene.idle(10); - BlockPos pulleyPos = util.grid.at(3, 3, 2); + BlockPos pulleyPos = util.grid().at(3, 3, 2); ElementLink pulley = - scene.world.showIndependentSection(util.select.position(pulleyPos), Direction.EAST); + scene.world().showIndependentSection(util.select().position(pulleyPos), Direction.EAST); scene.idle(10); - scene.world.showSectionAndMerge(util.select.fromTo(3, 1, 1, 3, 1, 2) - .add(util.select.position(3, 2, 1)), Direction.SOUTH, pulley); + scene.world().showSectionAndMerge(util.select().fromTo(3, 1, 1, 3, 1, 2) + .add(util.select().position(3, 2, 1)), Direction.SOUTH, pulley); scene.idle(10); - scene.overlay.showText(50) - .pointAt(util.vector.blockSurface(pulleyPos, Direction.WEST)) + scene.overlay().showText(50) + .pointAt(util.vector().blockSurface(pulleyPos, Direction.WEST)) .placeNearTarget() .attachKeyFrame() .text("Whenever Pulleys are themselves being moved by a Contraption..."); scene.idle(60); - scene.world.setKineticSpeed(largeCog, -16); - scene.world.setKineticSpeed(kinetics, 32); - scene.effects.rotationDirectionIndicator(util.grid.at(4, 1, 5)); - scene.world.moveSection(poles, util.vector.of(-2, 0, 0), 40); - scene.world.moveSection(pulley, util.vector.of(-2, 0, 0), 40); + scene.world().setKineticSpeed(largeCog, -16); + scene.world().setKineticSpeed(kinetics, 32); + scene.effects().rotationDirectionIndicator(util.grid().at(4, 1, 5)); + scene.world().moveSection(poles, util.vector().of(-2, 0, 0), 40); + scene.world().moveSection(pulley, util.vector().of(-2, 0, 0), 40); scene.idle(40); - scene.overlay.showSelectionWithText(util.select.fromTo(1, 1, 1, 1, 1, 2), 50) + scene.overlay().showSelectionWithText(util.select().fromTo(1, 1, 1, 1, 1, 2), 50) .colored(PonderPalette.GREEN) .placeNearTarget() .attachKeyFrame() .text("...its attached structure will be dragged with it"); scene.idle(60); - scene.overlay.showText(80) + scene.overlay().showText(80) .colored(PonderPalette.RED) - .pointAt(util.vector.topOf(pulleyPos.west(2))) + .pointAt(util.vector().topOf(pulleyPos.west(2))) .placeNearTarget() .text("Mind that pulleys are only movable while stopped"); scene.idle(50); @@ -251,85 +251,85 @@ public class PulleyScenes { scene.configureBasePlate(0, 0, 5); scene.setSceneOffsetY(-1); scene.scaleSceneView(.95f); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); scene.idle(5); - Selection contraption = util.select.fromTo(3, 1, 1, 1, 1, 3); - BlockPos crankPos = util.grid.at(3, 4, 0); - BlockPos pulley1 = util.grid.at(3, 4, 1); - BlockPos pulley2 = util.grid.at(3, 4, 3); - BlockPos pulley3 = util.grid.at(1, 4, 3); - Selection kinetics = util.select.fromTo(3, 4, 0, 3, 4, 1); + Selection contraption = util.select().fromTo(3, 1, 1, 1, 1, 3); + BlockPos crankPos = util.grid().at(3, 4, 0); + BlockPos pulley1 = util.grid().at(3, 4, 1); + BlockPos pulley2 = util.grid().at(3, 4, 3); + BlockPos pulley3 = util.grid().at(1, 4, 3); + Selection kinetics = util.select().fromTo(3, 4, 0, 3, 4, 1); - ElementLink planksLink = scene.world.showIndependentSection(contraption, Direction.DOWN); + ElementLink planksLink = scene.world().showIndependentSection(contraption, Direction.DOWN); scene.idle(10); - scene.world.showSection(util.select.position(pulley1), Direction.DOWN); + scene.world().showSection(util.select().position(pulley1), Direction.DOWN); scene.idle(4); - scene.world.showSection(util.select.position(pulley2), Direction.DOWN); + scene.world().showSection(util.select().position(pulley2), Direction.DOWN); scene.idle(4); - scene.world.showSection(util.select.position(pulley3), Direction.DOWN); + scene.world().showSection(util.select().position(pulley3), Direction.DOWN); scene.idle(4); - scene.world.showSection(util.select.position(crankPos), Direction.SOUTH); + scene.world().showSection(util.select().position(crankPos), Direction.SOUTH); scene.idle(15); - scene.world.setKineticSpeed(kinetics, 32); - scene.world.movePulley(pulley1, 2, 20); + scene.world().setKineticSpeed(kinetics, 32); + scene.world().movePulley(pulley1, 2, 20); scene.idle(20); - scene.world.setKineticSpeed(kinetics, 0); - scene.overlay.showText(60) - .pointAt(util.vector.topOf(util.grid.at(3, 1, 1))) + scene.world().setKineticSpeed(kinetics, 0); + scene.overlay().showText(60) + .pointAt(util.vector().topOf(util.grid().at(3, 1, 1))) .placeNearTarget() .text("Whenever a pulley assembles a contraption..."); scene.idle(70); - scene.world.movePulley(pulley2, 2, 0); - scene.world.movePulley(pulley3, 2, 0); + scene.world().movePulley(pulley2, 2, 0); + scene.world().movePulley(pulley3, 2, 0); scene.idle(1); - scene.world.setKineticSpeed(kinetics, -32); - scene.world.movePulley(pulley1, -2, 20); - scene.world.movePulley(pulley2, -2, 20); - scene.world.movePulley(pulley3, -2, 20); - scene.world.moveSection(planksLink, util.vector.of(0, 2, 0), 20); + scene.world().setKineticSpeed(kinetics, -32); + scene.world().movePulley(pulley1, -2, 20); + scene.world().movePulley(pulley2, -2, 20); + scene.world().movePulley(pulley3, -2, 20); + scene.world().moveSection(planksLink, util.vector().of(0, 2, 0), 20); scene.idle(20); - scene.world.setKineticSpeed(kinetics, 0); + scene.world().setKineticSpeed(kinetics, 0); - scene.overlay.showText(80) - .pointAt(util.vector.blockSurface(util.grid.at(1, 4, 3), Direction.WEST)) + scene.overlay().showText(80) + .pointAt(util.vector().blockSurface(util.grid().at(1, 4, 3), Direction.WEST)) .placeNearTarget() .text("...other pulleys on the same layer will connect to the structure"); scene.idle(60); - scene.world.setKineticSpeed(kinetics, 32); - scene.world.movePulley(pulley1, 2, 20); - scene.world.movePulley(pulley2, 2, 20); - scene.world.movePulley(pulley3, 2, 20); - scene.world.moveSection(planksLink, util.vector.of(0, -2, 0), 20); + scene.world().setKineticSpeed(kinetics, 32); + scene.world().movePulley(pulley1, 2, 20); + scene.world().movePulley(pulley2, 2, 20); + scene.world().movePulley(pulley3, 2, 20); + scene.world().moveSection(planksLink, util.vector().of(0, -2, 0), 20); scene.idle(20); - scene.world.setKineticSpeed(kinetics, 0); + scene.world().setKineticSpeed(kinetics, 0); scene.idle(20); - scene.world.setKineticSpeed(kinetics, 32); - scene.world.movePulley(pulley1, -2, 20); - scene.world.movePulley(pulley2, -2, 20); - scene.world.movePulley(pulley3, -2, 20); - scene.world.moveSection(planksLink, util.vector.of(0, 2, 0), 20); + scene.world().setKineticSpeed(kinetics, 32); + scene.world().movePulley(pulley1, -2, 20); + scene.world().movePulley(pulley2, -2, 20); + scene.world().movePulley(pulley3, -2, 20); + scene.world().moveSection(planksLink, util.vector().of(0, 2, 0), 20); scene.idle(20); - scene.world.setKineticSpeed(kinetics, 0); + scene.world().setKineticSpeed(kinetics, 0); - scene.overlay.showText(80) - .pointAt(util.vector.blockSurface(util.grid.at(1, 4, 3), Direction.WEST)) + scene.overlay().showText(80) + .pointAt(util.vector().blockSurface(util.grid().at(1, 4, 3), Direction.WEST)) .placeNearTarget() .text("They do not require to be powered, the effect is purely cosmetic"); scene.idle(60); - scene.world.setKineticSpeed(kinetics, 32); - scene.world.movePulley(pulley1, 2, 20); - scene.world.movePulley(pulley2, 2, 20); - scene.world.movePulley(pulley3, 2, 20); - scene.world.moveSection(planksLink, util.vector.of(0, -2, 0), 20); + scene.world().setKineticSpeed(kinetics, 32); + scene.world().movePulley(pulley1, 2, 20); + scene.world().movePulley(pulley2, 2, 20); + scene.world().movePulley(pulley3, 2, 20); + scene.world().moveSection(planksLink, util.vector().of(0, -2, 0), 20); scene.idle(20); - scene.world.setKineticSpeed(kinetics, 0); + scene.world().setKineticSpeed(kinetics, 0); } } diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/RedstoneScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/RedstoneScenes.java index 22a9025223..3e71ceece6 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/RedstoneScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/RedstoneScenes.java @@ -20,10 +20,10 @@ import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; import net.createmod.catnip.utility.lang.Components; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; import net.createmod.ponder.foundation.ElementLink; import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.SceneBuilder; -import net.createmod.ponder.foundation.SceneBuildingUtil; import net.createmod.ponder.foundation.Selection; import net.createmod.ponder.foundation.element.InputWindowElement; import net.createmod.ponder.foundation.element.ParrotElement; @@ -49,72 +49,72 @@ public class RedstoneScenes { scene.showBasePlate(); scene.idle(5); - Selection redstone = util.select.fromTo(0, 2, 2, 2, 2, 2); - BlockPos stickerPos = util.grid.at(2, 2, 2); - Selection stickerSelect = util.select.position(stickerPos); - BlockPos buttonPos = util.grid.at(0, 2, 2); - BlockPos bearingPos = util.grid.at(2, 1, 2); + Selection redstone = util.select().fromTo(0, 2, 2, 2, 2, 2); + BlockPos stickerPos = util.grid().at(2, 2, 2); + Selection stickerSelect = util.select().position(stickerPos); + BlockPos buttonPos = util.grid().at(0, 2, 2); + BlockPos bearingPos = util.grid().at(2, 1, 2); - scene.world.showSection(util.select.fromTo(2, 1, 2, 0, 2, 2) + scene.world().showSection(util.select().fromTo(2, 1, 2, 0, 2, 2) .substract(stickerSelect), Direction.DOWN); scene.idle(10); - ElementLink sticker = scene.world.showIndependentSection(stickerSelect, Direction.DOWN); + ElementLink sticker = scene.world().showIndependentSection(stickerSelect, Direction.DOWN); scene.idle(10); ElementLink plank = - scene.world.showIndependentSection(util.select.position(2, 2, 1), Direction.SOUTH); - scene.world.configureCenterOfRotation(sticker, util.vector.centerOf(stickerPos)); - scene.world.configureCenterOfRotation(plank, util.vector.centerOf(stickerPos)); - scene.overlay.showText(60) + scene.world().showIndependentSection(util.select().position(2, 2, 1), Direction.SOUTH); + scene.world().configureCenterOfRotation(sticker, util.vector().centerOf(stickerPos)); + scene.world().configureCenterOfRotation(plank, util.vector().centerOf(stickerPos)); + scene.overlay().showText(60) .text("Stickers are ideal for Redstone-controlled block attachment") .attachKeyFrame() - .pointAt(util.vector.blockSurface(stickerPos, Direction.WEST)) + .pointAt(util.vector().blockSurface(stickerPos, Direction.WEST)) .placeNearTarget(); scene.idle(70); - scene.world.toggleRedstonePower(redstone); - scene.world.modifyBlock(stickerPos, s -> s.setValue(StickerBlock.EXTENDED, true), false); - scene.effects.indicateRedstone(buttonPos); - scene.world.modifyBlockEntityNBT(stickerSelect, StickerBlockEntity.class, nbt -> { + scene.world().toggleRedstonePower(redstone); + scene.world().modifyBlock(stickerPos, s -> s.setValue(StickerBlock.EXTENDED, true), false); + scene.effects().indicateRedstone(buttonPos); + scene.world().modifyBlockEntityNBT(stickerSelect, StickerBlockEntity.class, nbt -> { }); scene.idle(20); - scene.world.toggleRedstonePower(redstone); + scene.world().toggleRedstonePower(redstone); scene.idle(20); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("Upon receiving a signal, it will toggle its state") - .pointAt(util.vector.blockSurface(stickerPos, Direction.WEST)) + .pointAt(util.vector().blockSurface(stickerPos, Direction.WEST)) .placeNearTarget(); scene.idle(70); - scene.world.rotateBearing(bearingPos, 180 * 3, 80); - scene.world.rotateSection(sticker, 0, 180 * 3, 0, 80); - scene.world.rotateSection(plank, 0, 180 * 3, 0, 80); - scene.overlay.showText(70) + scene.world().rotateBearing(bearingPos, 180 * 3, 80); + scene.world().rotateSection(sticker, 0, 180 * 3, 0, 80); + scene.world().rotateSection(plank, 0, 180 * 3, 0, 80); + scene.overlay().showText(70) .text("If it is now moved in a contraption, the block will move with it") - .pointAt(util.vector.topOf(stickerPos)) + .pointAt(util.vector().topOf(stickerPos)) .placeNearTarget(); scene.idle(90); scene.addKeyframe(); - scene.world.toggleRedstonePower(redstone); - scene.world.modifyBlock(stickerPos, s -> s.setValue(StickerBlock.EXTENDED, false), false); - scene.effects.indicateRedstone(buttonPos); - scene.world.modifyBlockEntityNBT(stickerSelect, StickerBlockEntity.class, nbt -> { + scene.world().toggleRedstonePower(redstone); + scene.world().modifyBlock(stickerPos, s -> s.setValue(StickerBlock.EXTENDED, false), false); + scene.effects().indicateRedstone(buttonPos); + scene.world().modifyBlockEntityNBT(stickerSelect, StickerBlockEntity.class, nbt -> { }); scene.idle(20); - scene.world.toggleRedstonePower(redstone); + scene.world().toggleRedstonePower(redstone); scene.idle(20); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("Toggled once again, the block is no longer attached") - .pointAt(util.vector.blockSurface(stickerPos, Direction.WEST)) + .pointAt(util.vector().blockSurface(stickerPos, Direction.WEST)) .placeNearTarget(); scene.idle(70); - scene.world.rotateBearing(bearingPos, 180 * 3, 80); - scene.world.rotateSection(sticker, 0, 180 * 3, 0, 80); + scene.world().rotateBearing(bearingPos, 180 * 3, 80); + scene.world().rotateSection(sticker, 0, 180 * 3, 0, 80); } public static void contact(SceneBuilder builder, SceneBuildingUtil util) { @@ -123,161 +123,161 @@ public class RedstoneScenes { scene.configureBasePlate(0, 0, 5); scene.showBasePlate(); scene.idle(5); - Selection contactAndRedstone = util.select.fromTo(1, 1, 0, 1, 1, 2); - Selection topContact = util.select.position(1, 2, 2); + Selection contactAndRedstone = util.select().fromTo(1, 1, 0, 1, 1, 2); + Selection topContact = util.select().position(1, 2, 2); - scene.world.toggleRedstonePower(contactAndRedstone); - scene.world.toggleRedstonePower(topContact); - scene.world.showSection(contactAndRedstone, Direction.DOWN); + scene.world().toggleRedstonePower(contactAndRedstone); + scene.world().toggleRedstonePower(topContact); + scene.world().showSection(contactAndRedstone, Direction.DOWN); - BlockPos bearingPos = util.grid.at(3, 1, 2); + BlockPos bearingPos = util.grid().at(3, 1, 2); scene.idle(25); - ElementLink contact = scene.world.showIndependentSection(topContact, Direction.DOWN); + ElementLink contact = scene.world().showIndependentSection(topContact, Direction.DOWN); scene.idle(10); - scene.world.toggleRedstonePower(topContact); - scene.world.toggleRedstonePower(contactAndRedstone); - scene.effects.indicateRedstone(util.grid.at(1, 1, 2)); + scene.world().toggleRedstonePower(topContact); + scene.world().toggleRedstonePower(contactAndRedstone); + scene.effects().indicateRedstone(util.grid().at(1, 1, 2)); scene.idle(10); - scene.overlay.showText(60) + scene.overlay().showText(60) .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.of(1, 2, 2.5)) + .pointAt(util.vector().of(1, 2, 2.5)) .text("Redstone Contacts facing each other will emit a redstone signal"); scene.idle(70); - scene.world.showSection(util.select.position(bearingPos), Direction.DOWN); + scene.world().showSection(util.select().position(bearingPos), Direction.DOWN); scene.idle(10); - scene.world.showSectionAndMerge(util.select.fromTo(2, 2, 2, 4, 2, 2), Direction.DOWN, contact); + scene.world().showSectionAndMerge(util.select().fromTo(2, 2, 2, 4, 2, 2), Direction.DOWN, contact); scene.idle(10); - scene.effects.superGlue(util.grid.at(1, 2, 2), Direction.EAST, true); - scene.world.configureCenterOfRotation(contact, util.vector.centerOf(bearingPos)); + scene.effects().superGlue(util.grid().at(1, 2, 2), Direction.EAST, true); + scene.world().configureCenterOfRotation(contact, util.vector().centerOf(bearingPos)); int speed = 2; scene.idle(10); - scene.world.rotateBearing(bearingPos, 10, speed); - scene.world.rotateSection(contact, 0, 10, 0, speed); + scene.world().rotateBearing(bearingPos, 10, speed); + scene.world().rotateSection(contact, 0, 10, 0, speed); scene.idle(speed); - scene.world.toggleRedstonePower(topContact); - scene.world.toggleRedstonePower(contactAndRedstone); - scene.effects.indicateRedstone(util.grid.at(1, 1, 2)); - scene.world.rotateBearing(bearingPos, 340, 34 * speed); - scene.world.rotateSection(contact, 0, 340, 0, 34 * speed); + scene.world().toggleRedstonePower(topContact); + scene.world().toggleRedstonePower(contactAndRedstone); + scene.effects().indicateRedstone(util.grid().at(1, 1, 2)); + scene.world().rotateBearing(bearingPos, 340, 34 * speed); + scene.world().rotateSection(contact, 0, 340, 0, 34 * speed); scene.addKeyframe(); scene.idle(34 * speed); - scene.overlay.showText(100) + scene.overlay().showText(100) .placeNearTarget() - .pointAt(util.vector.of(1, 1.5, 2.5)) + .pointAt(util.vector().of(1, 1.5, 2.5)) .text("This still applies when one of them is part of a moving Contraption"); for (int i = 0; i < 5; i++) { - scene.world.toggleRedstonePower(topContact); - scene.world.toggleRedstonePower(contactAndRedstone); - scene.effects.indicateRedstone(util.grid.at(1, 1, 2)); - scene.world.rotateBearing(bearingPos, 20, 2 * speed); - scene.world.rotateSection(contact, 0, 20, 0, 2 * speed); + scene.world().toggleRedstonePower(topContact); + scene.world().toggleRedstonePower(contactAndRedstone); + scene.effects().indicateRedstone(util.grid().at(1, 1, 2)); + scene.world().rotateBearing(bearingPos, 20, 2 * speed); + scene.world().rotateSection(contact, 0, 20, 0, 2 * speed); scene.idle(2 * speed); - scene.world.toggleRedstonePower(topContact); - scene.world.toggleRedstonePower(contactAndRedstone); - scene.world.rotateBearing(bearingPos, 340, 34 * speed); - scene.world.rotateSection(contact, 0, 340, 0, 34 * speed); + scene.world().toggleRedstonePower(topContact); + scene.world().toggleRedstonePower(contactAndRedstone); + scene.world().rotateBearing(bearingPos, 340, 34 * speed); + scene.world().rotateSection(contact, 0, 340, 0, 34 * speed); scene.idle(34 * speed); if (i == 0) scene.markAsFinished(); } - scene.world.toggleRedstonePower(topContact); - scene.world.toggleRedstonePower(contactAndRedstone); - scene.world.rotateBearing(bearingPos, 10, speed); - scene.world.rotateSection(contact, 0, 10, 0, speed); + scene.world().toggleRedstonePower(topContact); + scene.world().toggleRedstonePower(contactAndRedstone); + scene.world().rotateBearing(bearingPos, 10, speed); + scene.world().rotateSection(contact, 0, 10, 0, speed); } public static void pulseExtender(SceneBuilder scene, SceneBuildingUtil util) { scene.title("pulse_extender", "Controlling signals using Pulse Extenders"); scene.configureBasePlate(0, 0, 5); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); - BlockPos circuitPos = util.grid.at(2, 1, 2); - BlockPos leverPos = util.grid.at(4, 1, 2); + BlockPos circuitPos = util.grid().at(2, 1, 2); + BlockPos leverPos = util.grid().at(4, 1, 2); - scene.world.modifyBlockEntityNBT(util.select.position(circuitPos), PulseExtenderBlockEntity.class, + scene.world().modifyBlockEntityNBT(util.select().position(circuitPos), PulseExtenderBlockEntity.class, nbt -> nbt.putInt("ScrollValue", 30)); - scene.world.showSection(util.select.layersFrom(1) - .substract(util.select.position(circuitPos)), Direction.UP); + scene.world().showSection(util.select().layersFrom(1) + .substract(util.select().position(circuitPos)), Direction.UP); scene.idle(10); - scene.world.showSection(util.select.position(circuitPos), Direction.DOWN); + scene.world().showSection(util.select().position(circuitPos), Direction.DOWN); scene.idle(20); - Vec3 circuitTop = util.vector.blockSurface(circuitPos, Direction.DOWN) + Vec3 circuitTop = util.vector().blockSurface(circuitPos, Direction.DOWN) .add(0, 3 / 16f, 0); - scene.overlay.showText(70) + scene.overlay().showText(70) .text("Pulse Extenders can lengthen a signal passing through") .attachKeyFrame() .placeNearTarget() .pointAt(circuitTop); scene.idle(60); - scene.effects.indicateRedstone(leverPos); - scene.world.toggleRedstonePower(util.select.fromTo(4, 1, 2, 2, 1, 2)); + scene.effects().indicateRedstone(leverPos); + scene.world().toggleRedstonePower(util.select().fromTo(4, 1, 2, 2, 1, 2)); scene.idle(2); - scene.world.toggleRedstonePower(util.select.fromTo(1, 1, 2, 0, 1, 2)); + scene.world().toggleRedstonePower(util.select().fromTo(1, 1, 2, 0, 1, 2)); scene.idle(15); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("They activate after a short delay...") .placeNearTarget() - .pointAt(util.vector.topOf(util.grid.at(0, 1, 2))); + .pointAt(util.vector().topOf(util.grid().at(0, 1, 2))); scene.idle(50); - scene.effects.indicateRedstone(leverPos); - scene.world.toggleRedstonePower(util.select.fromTo(4, 1, 2, 2, 1, 2)); + scene.effects().indicateRedstone(leverPos); + scene.world().toggleRedstonePower(util.select().fromTo(4, 1, 2, 2, 1, 2)); scene.idle(30); - scene.world.cycleBlockProperty(circuitPos, BrassDiodeBlock.POWERING); - scene.world.toggleRedstonePower(util.select.position(1, 1, 2)); + scene.world().cycleBlockProperty(circuitPos, BrassDiodeBlock.POWERING); + scene.world().toggleRedstonePower(util.select().position(1, 1, 2)); scene.idle(1); - scene.world.toggleRedstonePower(util.select.position(0, 1, 2)); + scene.world().toggleRedstonePower(util.select().position(0, 1, 2)); scene.idle(15); - scene.overlay.showText(40) + scene.overlay().showText(40) .text("...and cool down for the configured duration") .placeNearTarget() - .pointAt(util.vector.topOf(util.grid.at(0, 1, 2))); + .pointAt(util.vector().topOf(util.grid().at(0, 1, 2))); scene.idle(50); - scene.overlay.showRepeaterScrollInput(circuitPos, 60); - scene.overlay.showControls(new InputWindowElement(circuitTop, Pointing.DOWN).rightClick(), 60); + scene.overlay().showRepeaterScrollInput(circuitPos, 60); + scene.overlay().showControls(new InputWindowElement(circuitTop, Pointing.DOWN).rightClick(), 60); scene.idle(10); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("Using the value panel, the discharge time can be configured") .attachKeyFrame() .placeNearTarget() .pointAt(circuitTop); - scene.world.modifyBlockEntityNBT(util.select.position(circuitPos), PulseExtenderBlockEntity.class, + scene.world().modifyBlockEntityNBT(util.select().position(circuitPos), PulseExtenderBlockEntity.class, nbt -> nbt.putInt("ScrollValue", 120)); scene.idle(70); - scene.effects.indicateRedstone(leverPos); - scene.world.toggleRedstonePower(util.select.fromTo(4, 1, 2, 2, 1, 2)); + scene.effects().indicateRedstone(leverPos); + scene.world().toggleRedstonePower(util.select().fromTo(4, 1, 2, 2, 1, 2)); scene.idle(2); - scene.world.toggleRedstonePower(util.select.fromTo(1, 1, 2, 0, 1, 2)); + scene.world().toggleRedstonePower(util.select().fromTo(1, 1, 2, 0, 1, 2)); scene.idle(20); - scene.effects.indicateRedstone(leverPos); - scene.world.toggleRedstonePower(util.select.fromTo(4, 1, 2, 2, 1, 2)); + scene.effects().indicateRedstone(leverPos); + scene.world().toggleRedstonePower(util.select().fromTo(4, 1, 2, 2, 1, 2)); scene.idle(15); - scene.overlay.showText(50) + scene.overlay().showText(50) .text("The configured duration can range up to an hour") .placeNearTarget() .pointAt(circuitTop); scene.idle(70); - scene.world.cycleBlockProperty(circuitPos, BrassDiodeBlock.POWERING); - scene.world.toggleRedstonePower(util.select.position(1, 1, 2)); + scene.world().cycleBlockProperty(circuitPos, BrassDiodeBlock.POWERING); + scene.world().toggleRedstonePower(util.select().position(1, 1, 2)); scene.idle(1); - scene.world.toggleRedstonePower(util.select.position(0, 1, 2)); + scene.world().toggleRedstonePower(util.select().position(0, 1, 2)); scene.idle(15); } @@ -285,125 +285,125 @@ public class RedstoneScenes { public static void pulseRepeater(SceneBuilder scene, SceneBuildingUtil util) { scene.title("pulse_repeater", "Controlling signals using Pulse Repeaters"); scene.configureBasePlate(0, 0, 5); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); - BlockPos circuitPos = util.grid.at(2, 1, 2); - BlockPos leverPos = util.grid.at(4, 1, 2); + BlockPos circuitPos = util.grid().at(2, 1, 2); + BlockPos leverPos = util.grid().at(4, 1, 2); - scene.world.modifyBlockEntityNBT(util.select.position(circuitPos), PulseRepeaterBlockEntity.class, + scene.world().modifyBlockEntityNBT(util.select().position(circuitPos), PulseRepeaterBlockEntity.class, nbt -> nbt.putInt("ScrollValue", 30)); - scene.world.showSection(util.select.layersFrom(1) - .substract(util.select.position(circuitPos)), Direction.UP); + scene.world().showSection(util.select().layersFrom(1) + .substract(util.select().position(circuitPos)), Direction.UP); scene.idle(10); - scene.world.showSection(util.select.position(circuitPos), Direction.DOWN); + scene.world().showSection(util.select().position(circuitPos), Direction.DOWN); scene.idle(20); - Vec3 circuitTop = util.vector.blockSurface(circuitPos, Direction.DOWN) + Vec3 circuitTop = util.vector().blockSurface(circuitPos, Direction.DOWN) .add(0, 3 / 16f, 0); - scene.effects.indicateRedstone(leverPos); - scene.world.toggleRedstonePower(util.select.fromTo(4, 1, 2, 2, 1, 2)); + scene.effects().indicateRedstone(leverPos); + scene.world().toggleRedstonePower(util.select().fromTo(4, 1, 2, 2, 1, 2)); scene.idle(30); - scene.world.cycleBlockProperty(circuitPos, BrassDiodeBlock.POWERING); - scene.world.toggleRedstonePower(util.select.fromTo(1, 1, 2, 0, 1, 2)); + scene.world().cycleBlockProperty(circuitPos, BrassDiodeBlock.POWERING); + scene.world().toggleRedstonePower(util.select().fromTo(1, 1, 2, 0, 1, 2)); scene.idle(2); - scene.world.cycleBlockProperty(circuitPos, BrassDiodeBlock.POWERING); - scene.world.toggleRedstonePower(util.select.position(1, 1, 2)); + scene.world().cycleBlockProperty(circuitPos, BrassDiodeBlock.POWERING); + scene.world().toggleRedstonePower(util.select().position(1, 1, 2)); scene.idle(1); - scene.world.toggleRedstonePower(util.select.position(0, 1, 2)); + scene.world().toggleRedstonePower(util.select().position(0, 1, 2)); scene.idle(15); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("Pulse Repeaters emit a short pulse after a delay") .attachKeyFrame() .placeNearTarget() .pointAt(circuitTop); - scene.world.toggleRedstonePower(util.select.fromTo(4, 1, 2, 2, 1, 2)); + scene.world().toggleRedstonePower(util.select().fromTo(4, 1, 2, 2, 1, 2)); scene.idle(70); - scene.overlay.showRepeaterScrollInput(circuitPos, 60); - scene.overlay.showControls(new InputWindowElement(circuitTop, Pointing.DOWN).rightClick(), 60); + scene.overlay().showRepeaterScrollInput(circuitPos, 60); + scene.overlay().showControls(new InputWindowElement(circuitTop, Pointing.DOWN).rightClick(), 60); scene.idle(10); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("Using the value panel, the charge time can be configured") .attachKeyFrame() .placeNearTarget() .pointAt(circuitTop); - scene.world.modifyBlockEntityNBT(util.select.position(circuitPos), PulseRepeaterBlockEntity.class, + scene.world().modifyBlockEntityNBT(util.select().position(circuitPos), PulseRepeaterBlockEntity.class, nbt -> nbt.putInt("ScrollValue", 120)); scene.idle(70); - scene.effects.indicateRedstone(leverPos); - scene.world.toggleRedstonePower(util.select.fromTo(4, 1, 2, 2, 1, 2)); + scene.effects().indicateRedstone(leverPos); + scene.world().toggleRedstonePower(util.select().fromTo(4, 1, 2, 2, 1, 2)); scene.idle(60); - scene.overlay.showText(50) + scene.overlay().showText(50) .text("Configured delays can range up to an hour") .placeNearTarget() .pointAt(circuitTop); scene.idle(60); - scene.world.cycleBlockProperty(circuitPos, BrassDiodeBlock.POWERING); - scene.world.toggleRedstonePower(util.select.fromTo(1, 1, 2, 0, 1, 2)); + scene.world().cycleBlockProperty(circuitPos, BrassDiodeBlock.POWERING); + scene.world().toggleRedstonePower(util.select().fromTo(1, 1, 2, 0, 1, 2)); scene.idle(2); - scene.world.cycleBlockProperty(circuitPos, BrassDiodeBlock.POWERING); - scene.world.toggleRedstonePower(util.select.position(1, 1, 2)); + scene.world().cycleBlockProperty(circuitPos, BrassDiodeBlock.POWERING); + scene.world().toggleRedstonePower(util.select().position(1, 1, 2)); scene.idle(1); - scene.world.toggleRedstonePower(util.select.position(0, 1, 2)); + scene.world().toggleRedstonePower(util.select().position(0, 1, 2)); } public static void poweredLatch(SceneBuilder scene, SceneBuildingUtil util) { scene.title("powered_latch", "Controlling signals using the Powered Latch"); scene.configureBasePlate(0, 0, 5); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); - BlockPos circuitPos = util.grid.at(2, 1, 2); - BlockPos buttonPos = util.grid.at(4, 1, 2); - Vec3 circuitTop = util.vector.blockSurface(circuitPos, Direction.DOWN) + BlockPos circuitPos = util.grid().at(2, 1, 2); + BlockPos buttonPos = util.grid().at(4, 1, 2); + Vec3 circuitTop = util.vector().blockSurface(circuitPos, Direction.DOWN) .add(0, 3 / 16f, 0); - scene.world.showSection(util.select.layersFrom(1) - .substract(util.select.position(circuitPos)), Direction.UP); + scene.world().showSection(util.select().layersFrom(1) + .substract(util.select().position(circuitPos)), Direction.UP); scene.idle(10); - scene.world.showSection(util.select.position(circuitPos), Direction.DOWN); + scene.world().showSection(util.select().position(circuitPos), Direction.DOWN); scene.idle(20); - scene.overlay.showText(40) + scene.overlay().showText(40) .attachKeyFrame() .text("Powered Latches are redstone controllable Levers") .placeNearTarget() .pointAt(circuitTop); scene.idle(50); - scene.effects.indicateRedstone(buttonPos); - scene.world.toggleRedstonePower(util.select.fromTo(4, 1, 2, 0, 1, 2)); - scene.world.cycleBlockProperty(circuitPos, PoweredLatchBlock.POWERING); + scene.effects().indicateRedstone(buttonPos); + scene.world().toggleRedstonePower(util.select().fromTo(4, 1, 2, 0, 1, 2)); + scene.world().cycleBlockProperty(circuitPos, PoweredLatchBlock.POWERING); scene.idle(30); - scene.world.toggleRedstonePower(util.select.fromTo(4, 1, 2, 3, 1, 2)); + scene.world().toggleRedstonePower(util.select().fromTo(4, 1, 2, 3, 1, 2)); AABB bb = new AABB(circuitPos).inflate(-.48f, -.45f, -.05f) .move(.575, -.45, 0); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, bb, bb, 40); - scene.overlay.showText(40) + scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, bb, bb, 40); + scene.overlay().showText(40) .colored(PonderPalette.GREEN) .text("Signals at the back switch it on") .placeNearTarget() .pointAt(bb.getCenter()); scene.idle(60); - scene.effects.indicateRedstone(util.grid.at(2, 1, 0)); - scene.world.toggleRedstonePower(util.select.fromTo(2, 1, 0, 2, 1, 1)); - scene.world.toggleRedstonePower(util.select.fromTo(2, 1, 2, 0, 1, 2)); - scene.world.cycleBlockProperty(circuitPos, PoweredLatchBlock.POWERING); + scene.effects().indicateRedstone(util.grid().at(2, 1, 0)); + scene.world().toggleRedstonePower(util.select().fromTo(2, 1, 0, 2, 1, 1)); + scene.world().toggleRedstonePower(util.select().fromTo(2, 1, 2, 0, 1, 2)); + scene.world().cycleBlockProperty(circuitPos, PoweredLatchBlock.POWERING); scene.idle(30); - scene.world.toggleRedstonePower(util.select.fromTo(2, 1, 0, 2, 1, 1)); + scene.world().toggleRedstonePower(util.select().fromTo(2, 1, 0, 2, 1, 1)); bb = new AABB(circuitPos).inflate(-.05f, -.45f, -.48f) .move(0, -.45, .575); AABB bb2 = new AABB(circuitPos).inflate(-.05f, -.45f, -.48f) .move(0, -.45, -.575); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, bb, bb, 40); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, bb2, bb2, 40); - scene.overlay.showText(40) + scene.overlay().chaseBoundingBoxOutline(PonderPalette.RED, bb, bb, 40); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.RED, bb2, bb2, 40); + scene.overlay().showText(40) .colored(PonderPalette.RED) .text("Signals from the side switch it back off") .placeNearTarget() @@ -412,71 +412,71 @@ public class RedstoneScenes { scene.addKeyframe(); scene.idle(10); - scene.overlay.showControls(new InputWindowElement(circuitTop, Pointing.DOWN).rightClick(), 40); + scene.overlay().showControls(new InputWindowElement(circuitTop, Pointing.DOWN).rightClick(), 40); scene.idle(7); - scene.world.toggleRedstonePower(util.select.fromTo(2, 1, 2, 0, 1, 2)); - scene.world.cycleBlockProperty(circuitPos, PoweredLatchBlock.POWERING); + scene.world().toggleRedstonePower(util.select().fromTo(2, 1, 2, 0, 1, 2)); + scene.world().cycleBlockProperty(circuitPos, PoweredLatchBlock.POWERING); scene.idle(10); - scene.overlay.showText(50) + scene.overlay().showText(50) .text("Powered latches can also be toggled manually") .placeNearTarget() .pointAt(circuitTop); scene.idle(60); - scene.overlay.showControls(new InputWindowElement(circuitTop, Pointing.DOWN).rightClick(), 40); + scene.overlay().showControls(new InputWindowElement(circuitTop, Pointing.DOWN).rightClick(), 40); scene.idle(7); - scene.world.toggleRedstonePower(util.select.fromTo(2, 1, 2, 0, 1, 2)); - scene.world.cycleBlockProperty(circuitPos, PoweredLatchBlock.POWERING); + scene.world().toggleRedstonePower(util.select().fromTo(2, 1, 2, 0, 1, 2)); + scene.world().cycleBlockProperty(circuitPos, PoweredLatchBlock.POWERING); scene.idle(10); } public static void poweredToggleLatch(SceneBuilder scene, SceneBuildingUtil util) { scene.title("powered_toggle_latch", "Controlling signals using the Powered Toggle Latch"); scene.configureBasePlate(0, 0, 5); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); - BlockPos circuitPos = util.grid.at(2, 1, 2); - BlockPos buttonPos = util.grid.at(4, 1, 2); - Vec3 circuitTop = util.vector.blockSurface(circuitPos, Direction.DOWN) + BlockPos circuitPos = util.grid().at(2, 1, 2); + BlockPos buttonPos = util.grid().at(4, 1, 2); + Vec3 circuitTop = util.vector().blockSurface(circuitPos, Direction.DOWN) .add(0, 3 / 16f, 0); - scene.world.showSection(util.select.layersFrom(1) - .substract(util.select.position(circuitPos)), Direction.UP); + scene.world().showSection(util.select().layersFrom(1) + .substract(util.select().position(circuitPos)), Direction.UP); scene.idle(10); - scene.world.showSection(util.select.position(circuitPos), Direction.DOWN); + scene.world().showSection(util.select().position(circuitPos), Direction.DOWN); scene.idle(20); - scene.overlay.showText(40) + scene.overlay().showText(40) .attachKeyFrame() .text("Powered Toggle Latches are redstone controllable Levers") .placeNearTarget() .pointAt(circuitTop); scene.idle(50); - scene.effects.indicateRedstone(buttonPos); - scene.world.toggleRedstonePower(util.select.fromTo(4, 1, 2, 0, 1, 2)); - scene.world.cycleBlockProperty(circuitPos, ToggleLatchBlock.POWERING); + scene.effects().indicateRedstone(buttonPos); + scene.world().toggleRedstonePower(util.select().fromTo(4, 1, 2, 0, 1, 2)); + scene.world().cycleBlockProperty(circuitPos, ToggleLatchBlock.POWERING); scene.idle(30); - scene.world.toggleRedstonePower(util.select.fromTo(4, 1, 2, 3, 1, 2)); + scene.world().toggleRedstonePower(util.select().fromTo(4, 1, 2, 3, 1, 2)); AABB bb = new AABB(circuitPos).inflate(-.48f, -.45f, -.05f) .move(.575, -.45, 0); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, bb, bb, 40); - scene.overlay.showText(40) + scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, bb, bb, 40); + scene.overlay().showText(40) .colored(PonderPalette.GREEN) .text("Signals at the back will toggle its state") .placeNearTarget() .pointAt(bb.getCenter()); scene.idle(60); - scene.effects.indicateRedstone(buttonPos); - scene.world.toggleRedstonePower(util.select.fromTo(4, 1, 2, 0, 1, 2)); - scene.world.cycleBlockProperty(circuitPos, ToggleLatchBlock.POWERING); + scene.effects().indicateRedstone(buttonPos); + scene.world().toggleRedstonePower(util.select().fromTo(4, 1, 2, 0, 1, 2)); + scene.world().cycleBlockProperty(circuitPos, ToggleLatchBlock.POWERING); scene.idle(30); - scene.world.toggleRedstonePower(util.select.fromTo(4, 1, 2, 3, 1, 2)); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, bb, bb, 40); - scene.overlay.showText(30) + scene.world().toggleRedstonePower(util.select().fromTo(4, 1, 2, 3, 1, 2)); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.RED, bb, bb, 40); + scene.overlay().showText(30) .colored(PonderPalette.RED) .text("...on and back off") .placeNearTarget() @@ -485,22 +485,22 @@ public class RedstoneScenes { scene.addKeyframe(); scene.idle(10); - scene.overlay.showControls(new InputWindowElement(circuitTop, Pointing.DOWN).rightClick(), 40); + scene.overlay().showControls(new InputWindowElement(circuitTop, Pointing.DOWN).rightClick(), 40); scene.idle(7); - scene.world.toggleRedstonePower(util.select.fromTo(2, 1, 2, 0, 1, 2)); - scene.world.cycleBlockProperty(circuitPos, ToggleLatchBlock.POWERING); + scene.world().toggleRedstonePower(util.select().fromTo(2, 1, 2, 0, 1, 2)); + scene.world().cycleBlockProperty(circuitPos, ToggleLatchBlock.POWERING); scene.idle(10); - scene.overlay.showText(50) + scene.overlay().showText(50) .text("Powered toggle latches can also be toggled manually") .placeNearTarget() .pointAt(circuitTop); scene.idle(60); - scene.overlay.showControls(new InputWindowElement(circuitTop, Pointing.DOWN).rightClick(), 40); + scene.overlay().showControls(new InputWindowElement(circuitTop, Pointing.DOWN).rightClick(), 40); scene.idle(7); - scene.world.toggleRedstonePower(util.select.fromTo(2, 1, 2, 0, 1, 2)); - scene.world.cycleBlockProperty(circuitPos, ToggleLatchBlock.POWERING); + scene.world().toggleRedstonePower(util.select().fromTo(2, 1, 2, 0, 1, 2)); + scene.world().cycleBlockProperty(circuitPos, ToggleLatchBlock.POWERING); scene.idle(10); } @@ -508,28 +508,28 @@ public class RedstoneScenes { scene.title("analog_lever", "Controlling signals using the Analog Lever"); scene.configureBasePlate(0, 0, 5); - BlockPos[] wireLocations = new BlockPos[] { util.grid.at(2, 1, 1), util.grid.at(2, 1, 0), util.grid.at(1, 1, 0), - util.grid.at(0, 1, 0), util.grid.at(0, 1, 1), util.grid.at(0, 1, 2), util.grid.at(0, 1, 3), - util.grid.at(0, 1, 4), util.grid.at(1, 1, 4), util.grid.at(2, 1, 4), util.grid.at(3, 1, 4), - util.grid.at(4, 1, 4), util.grid.at(4, 1, 3), util.grid.at(4, 1, 2), util.grid.at(4, 1, 1) }; + BlockPos[] wireLocations = new BlockPos[] { util.grid().at(2, 1, 1), util.grid().at(2, 1, 0), util.grid().at(1, 1, 0), + util.grid().at(0, 1, 0), util.grid().at(0, 1, 1), util.grid().at(0, 1, 2), util.grid().at(0, 1, 3), + util.grid().at(0, 1, 4), util.grid().at(1, 1, 4), util.grid().at(2, 1, 4), util.grid().at(3, 1, 4), + util.grid().at(4, 1, 4), util.grid().at(4, 1, 3), util.grid().at(4, 1, 2), util.grid().at(4, 1, 1) }; - Selection leverSelection = util.select.fromTo(2, 1, 2, 2, 2, 2); - Selection lamp = util.select.position(4, 1, 0); - BlockPos leverPos = util.grid.at(2, 2, 2); - Vec3 leverVec = util.vector.centerOf(leverPos) + Selection leverSelection = util.select().fromTo(2, 1, 2, 2, 2, 2); + Selection lamp = util.select().position(4, 1, 0); + BlockPos leverPos = util.grid().at(2, 2, 2); + Vec3 leverVec = util.vector().centerOf(leverPos) .add(0, -.25, 0); - scene.world.showSection(util.select.layersFrom(0) + scene.world().showSection(util.select().layersFrom(0) .substract(lamp) .substract(leverSelection), Direction.UP); scene.idle(5); - scene.world.showSection(lamp, Direction.DOWN); + scene.world().showSection(lamp, Direction.DOWN); scene.idle(10); - scene.world.showSection(leverSelection, Direction.DOWN); + scene.world().showSection(leverSelection, Direction.DOWN); scene.idle(20); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("Analog Levers make for a compact and precise source of redstone power") .placeNearTarget() .attachKeyFrame() @@ -537,112 +537,112 @@ public class RedstoneScenes { scene.idle(70); IntegerProperty power = RedStoneWireBlock.POWER; - scene.overlay.showControls(new InputWindowElement(leverVec, Pointing.DOWN).rightClick(), 40); + scene.overlay().showControls(new InputWindowElement(leverVec, Pointing.DOWN).rightClick(), 40); scene.idle(7); for (int i = 0; i < 7; i++) { scene.idle(2); final int state = i + 1; - scene.world.modifyBlockEntityNBT(leverSelection, AnalogLeverBlockEntity.class, + scene.world().modifyBlockEntityNBT(leverSelection, AnalogLeverBlockEntity.class, nbt -> nbt.putInt("State", state)); - scene.world.modifyBlock(wireLocations[i], s -> s.setValue(power, 7 - state), false); - scene.effects.indicateRedstone(wireLocations[i]); + scene.world().modifyBlock(wireLocations[i], s -> s.setValue(power, 7 - state), false); + scene.effects().indicateRedstone(wireLocations[i]); } scene.idle(20); - scene.overlay.showText(60) + scene.overlay().showText(60) .attachKeyFrame() .text("Right-click to increase its analog power output") .placeNearTarget() .pointAt(leverVec); scene.idle(70); - scene.overlay.showControls(new InputWindowElement(leverVec, Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(leverVec, Pointing.DOWN).rightClick() .whileSneaking(), 40); scene.idle(7); for (int i = 7; i > 0; i--) { scene.idle(2); final int state = i - 1; if (i > 3) { - scene.world.modifyBlockEntityNBT(leverSelection, AnalogLeverBlockEntity.class, + scene.world().modifyBlockEntityNBT(leverSelection, AnalogLeverBlockEntity.class, nbt -> nbt.putInt("State", state)); - scene.effects.indicateRedstone(wireLocations[i]); + scene.effects().indicateRedstone(wireLocations[i]); } - scene.world.modifyBlock(wireLocations[i], s -> s.setValue(power, state > 2 ? 0 : 3 - state), false); + scene.world().modifyBlock(wireLocations[i], s -> s.setValue(power, state > 2 ? 0 : 3 - state), false); } - scene.world.modifyBlock(wireLocations[0], s -> s.setValue(power, 3), false); + scene.world().modifyBlock(wireLocations[0], s -> s.setValue(power, 3), false); scene.idle(20); - scene.overlay.showText(60) + scene.overlay().showText(60) .attachKeyFrame() .text("Right-click while Sneaking to decrease the power output again") .placeNearTarget() .pointAt(leverVec); scene.idle(70); - scene.overlay.showControls(new InputWindowElement(leverVec, Pointing.DOWN).rightClick(), 40); + scene.overlay().showControls(new InputWindowElement(leverVec, Pointing.DOWN).rightClick(), 40); scene.idle(7); for (int i = 0; i < 15; i++) { scene.idle(2); final int state = i + 1; if (i >= 4) { - scene.world.modifyBlockEntityNBT(leverSelection, AnalogLeverBlockEntity.class, + scene.world().modifyBlockEntityNBT(leverSelection, AnalogLeverBlockEntity.class, nbt -> nbt.putInt("State", state)); - scene.effects.indicateRedstone(wireLocations[i]); + scene.effects().indicateRedstone(wireLocations[i]); } - scene.world.modifyBlock(wireLocations[i], s -> s.setValue(power, 15 - state), false); + scene.world().modifyBlock(wireLocations[i], s -> s.setValue(power, 15 - state), false); } - scene.world.toggleRedstonePower(lamp); - scene.effects.indicateRedstone(leverPos); - scene.effects.indicateRedstone(util.grid.at(4, 1, 1)); + scene.world().toggleRedstonePower(lamp); + scene.effects().indicateRedstone(leverPos); + scene.effects().indicateRedstone(util.grid().at(4, 1, 1)); scene.idle(20); } public static void nixieTube(SceneBuilder scene, SceneBuildingUtil util) { scene.title("nixie_tube", "Using Nixie Tubes"); scene.configureBasePlate(0, 0, 5); - scene.world.showSection(util.select.layer(0) - .add(util.select.fromTo(2, 1, 1, 2, 1, 2)), Direction.UP); + scene.world().showSection(util.select().layer(0) + .add(util.select().fromTo(2, 1, 1, 2, 1, 2)), Direction.UP); scene.idle(10); - scene.world.showSection(util.select.position(2, 1, 3), Direction.DOWN); + scene.world().showSection(util.select().position(2, 1, 3), Direction.DOWN); scene.idle(20); - Selection tubes = util.select.fromTo(3, 1, 3, 1, 1, 3); + Selection tubes = util.select().fromTo(3, 1, 3, 1, 1, 3); - scene.effects.indicateRedstone(util.grid.at(2, 1, 1)); - scene.world.modifyBlockEntityNBT(util.select.position(2, 1, 1), AnalogLeverBlockEntity.class, + scene.effects().indicateRedstone(util.grid().at(2, 1, 1)); + scene.world().modifyBlockEntityNBT(util.select().position(2, 1, 1), AnalogLeverBlockEntity.class, nbt -> nbt.putInt("State", 11)); - scene.world.modifyBlock(util.grid.at(2, 1, 2), s -> s.setValue(RedStoneWireBlock.POWER, 11), false); - scene.world.modifyBlockEntityNBT(tubes, NixieTubeBlockEntity.class, nbt -> nbt.putInt("RedstoneStrength", 11)); + scene.world().modifyBlock(util.grid().at(2, 1, 2), s -> s.setValue(RedStoneWireBlock.POWER, 11), false); + scene.world().modifyBlockEntityNBT(tubes, NixieTubeBlockEntity.class, nbt -> nbt.putInt("RedstoneStrength", 11)); scene.idle(20); - Vec3 centerTube = util.vector.centerOf(2, 1, 3); + Vec3 centerTube = util.vector().centerOf(2, 1, 3); - scene.overlay.showText(60) + scene.overlay().showText(60) .attachKeyFrame() .text("When powered by Redstone, Nixie Tubes will display the signal strength") .placeNearTarget() - .pointAt(util.vector.blockSurface(util.grid.at(2, 1, 3), Direction.WEST)); + .pointAt(util.vector().blockSurface(util.grid().at(2, 1, 3), Direction.WEST)); scene.idle(70); - scene.world.hideSection(util.select.position(2, 1, 3), Direction.UP); + scene.world().hideSection(util.select().position(2, 1, 3), Direction.UP); scene.idle(5); - scene.world.hideSection(util.select.fromTo(2, 1, 1, 2, 1, 2), Direction.NORTH); + scene.world().hideSection(util.select().fromTo(2, 1, 1, 2, 1, 2), Direction.NORTH); scene.idle(10); - scene.world.modifyBlockEntityNBT(tubes, NixieTubeBlockEntity.class, nbt -> nbt.putInt("RedstoneStrength", 0)); - scene.world.showSection(tubes, Direction.DOWN); + scene.world().modifyBlockEntityNBT(tubes, NixieTubeBlockEntity.class, nbt -> nbt.putInt("RedstoneStrength", 0)); + scene.world().showSection(tubes, Direction.DOWN); scene.idle(20); ItemStack clipboard = AllBlocks.CLIPBOARD.asStack(); ClipboardOverrides.switchTo(ClipboardType.WRITTEN, clipboard); - scene.overlay.showControls(new InputWindowElement(centerTube.add(1, .35, 0), Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(centerTube.add(1, .35, 0), Pointing.DOWN).rightClick() .withItem(clipboard), 40); scene.idle(7); Component component = Components.literal("CREATE"); for (int i = 0; i < 3; i++) { final int index = i; - scene.world.modifyBlockEntityNBT(util.select.position(3 - i, 1, 3), NixieTubeBlockEntity.class, nbt -> { + scene.world().modifyBlockEntityNBT(util.select().position(3 - i, 1, 3), NixieTubeBlockEntity.class, nbt -> { nbt.putString("RawCustomText", component.getString()); nbt.putString("CustomText", Component.Serializer.toJson(component)); nbt.putInt("CustomTextIndex", index); @@ -650,33 +650,33 @@ public class RedstoneScenes { } scene.idle(10); - scene.world.showSection(util.select.position(4, 1, 3), Direction.DOWN); + scene.world().showSection(util.select().position(4, 1, 3), Direction.DOWN); scene.idle(10); - scene.special.createBirb(util.vector.topOf(util.grid.at(0, 0, 3)), ParrotElement.DancePose::new); + scene.special().createBirb(util.vector().topOf(util.grid().at(0, 0, 3)), ParrotElement.DancePose::new); scene.idle(20); - scene.overlay.showText(80) + scene.overlay().showText(80) .attachKeyFrame() .placeNearTarget() .text("Using written Clipboards, custom text can be displayed") - .pointAt(util.vector.topOf(util.grid.at(3, 1, 3)) + .pointAt(util.vector().topOf(util.grid().at(3, 1, 3)) .add(-.75, -.05f, 0)); scene.idle(90); InputWindowElement input = - new InputWindowElement(util.vector.blockSurface(util.grid.at(3, 1, 3), Direction.UP), Pointing.DOWN) + new InputWindowElement(util.vector().blockSurface(util.grid().at(3, 1, 3), Direction.UP), Pointing.DOWN) .withItem(new ItemStack(Items.BLUE_DYE)); - scene.overlay.showControls(input, 30); + scene.overlay().showControls(input, 30); scene.idle(7); - scene.world.setBlocks(util.select.fromTo(1, 1, 3, 3, 1, 3), AllBlocks.NIXIE_TUBES.get(DyeColor.BLUE) + scene.world().setBlocks(util.select().fromTo(1, 1, 3, 3, 1, 3), AllBlocks.NIXIE_TUBES.get(DyeColor.BLUE) .getDefaultState() .setValue(NixieTubeBlock.FACING, Direction.WEST), false); scene.idle(10); - scene.overlay.showText(80) + scene.overlay().showText(80) .colored(PonderPalette.BLUE) .text("Right-Click with Dye to change their display colour") .attachKeyFrame() - .pointAt(util.vector.topOf(util.grid.at(3, 1, 3)) + .pointAt(util.vector().topOf(util.grid().at(3, 1, 3)) .add(-.75, -.05f, 0)) .placeNearTarget(); scene.idle(60); @@ -685,58 +685,58 @@ public class RedstoneScenes { public static void redstoneLink(SceneBuilder scene, SceneBuildingUtil util) { scene.title("redstone_link", "Using Redstone Links"); scene.configureBasePlate(0, 0, 5); - scene.world.showSection(util.select.layer(0) - .add(util.select.fromTo(3, 1, 1, 2, 1, 1)), Direction.UP); + scene.world().showSection(util.select().layer(0) + .add(util.select().fromTo(3, 1, 1, 2, 1, 1)), Direction.UP); scene.idle(5); - scene.world.showSection(util.select.fromTo(4, 1, 3, 0, 2, 3), Direction.DOWN); + scene.world().showSection(util.select().fromTo(4, 1, 3, 0, 2, 3), Direction.DOWN); scene.idle(10); - Selection redstone = util.select.fromTo(3, 1, 1, 1, 1, 1); - BlockPos leverPos = util.grid.at(3, 1, 1); - BlockPos link1Pos = util.grid.at(1, 1, 1); - BlockPos link2Pos = util.grid.at(1, 2, 2); - BlockPos link3Pos = util.grid.at(3, 2, 2); - Selection link1Select = util.select.position(link1Pos); - Selection link2Select = util.select.position(link2Pos); - Selection link3Select = util.select.position(link3Pos); - Vec3 link1Vec = util.vector.blockSurface(link1Pos, Direction.DOWN) + Selection redstone = util.select().fromTo(3, 1, 1, 1, 1, 1); + BlockPos leverPos = util.grid().at(3, 1, 1); + BlockPos link1Pos = util.grid().at(1, 1, 1); + BlockPos link2Pos = util.grid().at(1, 2, 2); + BlockPos link3Pos = util.grid().at(3, 2, 2); + Selection link1Select = util.select().position(link1Pos); + Selection link2Select = util.select().position(link2Pos); + Selection link3Select = util.select().position(link3Pos); + Vec3 link1Vec = util.vector().blockSurface(link1Pos, Direction.DOWN) .add(0, 3 / 16f, 0); - Vec3 link2Vec = util.vector.blockSurface(link2Pos, Direction.SOUTH) + Vec3 link2Vec = util.vector().blockSurface(link2Pos, Direction.SOUTH) .add(0, 0, -3 / 16f); - Vec3 link3Vec = util.vector.blockSurface(link3Pos, Direction.SOUTH) + Vec3 link3Vec = util.vector().blockSurface(link3Pos, Direction.SOUTH) .add(0, 0, -3 / 16f); - scene.world.showSection(link1Select, Direction.DOWN); + scene.world().showSection(link1Select, Direction.DOWN); scene.idle(5); - scene.world.showSection(link2Select, Direction.DOWN); + scene.world().showSection(link2Select, Direction.DOWN); scene.idle(5); - scene.world.showSection(link3Select, Direction.DOWN); + scene.world().showSection(link3Select, Direction.DOWN); scene.idle(10); - scene.overlay.showText(50) + scene.overlay().showText(50) .attachKeyFrame() .text("Redstone Links can transmit redstone signals wirelessly") .placeNearTarget() .pointAt(link1Vec); scene.idle(60); - scene.overlay.showControls(new InputWindowElement(link2Vec, Pointing.UP).rightClick() + scene.overlay().showControls(new InputWindowElement(link2Vec, Pointing.UP).rightClick() .whileSneaking(), 40); scene.idle(7); - scene.world.modifyBlock(link2Pos, s -> s.cycle(RedstoneLinkBlock.RECEIVER), true); + scene.world().modifyBlock(link2Pos, s -> s.cycle(RedstoneLinkBlock.RECEIVER), true); scene.idle(10); - scene.overlay.showText(50) + scene.overlay().showText(50) .text("Right-click while Sneaking to toggle receive mode") .placeNearTarget() .pointAt(link2Vec); scene.idle(60); - scene.overlay.showControls(new InputWindowElement(link3Vec, Pointing.UP).rightClick() + scene.overlay().showControls(new InputWindowElement(link3Vec, Pointing.UP).rightClick() .withItem(AllItems.WRENCH.asStack()), 40); scene.idle(7); - scene.world.modifyBlock(link3Pos, s -> s.cycle(RedstoneLinkBlock.RECEIVER), true); + scene.world().modifyBlock(link3Pos, s -> s.cycle(RedstoneLinkBlock.RECEIVER), true); scene.idle(10); - scene.overlay.showText(50) + scene.overlay().showText(50) .text("A simple Right-click with a Wrench can do the same") .placeNearTarget() .pointAt(link3Vec); @@ -744,23 +744,23 @@ public class RedstoneScenes { scene.addKeyframe(); scene.idle(10); - scene.world.toggleRedstonePower(redstone); - scene.effects.indicateRedstone(leverPos); + scene.world().toggleRedstonePower(redstone); + scene.effects().indicateRedstone(leverPos); scene.idle(5); - scene.world.toggleRedstonePower(util.select.fromTo(3, 2, 3, 1, 2, 2)); - scene.effects.indicateRedstone(link2Pos); - scene.effects.indicateRedstone(link3Pos); + scene.world().toggleRedstonePower(util.select().fromTo(3, 2, 3, 1, 2, 2)); + scene.effects().indicateRedstone(link2Pos); + scene.effects().indicateRedstone(link3Pos); scene.idle(10); - scene.overlay.showText(70) + scene.overlay().showText(70) .colored(PonderPalette.GREEN) .text("Receivers emit the redstone power of transmitters within 128 blocks") .placeNearTarget() .pointAt(link2Vec); scene.idle(80); - scene.world.toggleRedstonePower(redstone); + scene.world().toggleRedstonePower(redstone); scene.idle(5); - scene.world.toggleRedstonePower(util.select.fromTo(3, 2, 3, 1, 2, 2)); + scene.world().toggleRedstonePower(util.select().fromTo(3, 2, 3, 1, 2, 2)); scene.idle(20); Vec3 frontSlot = link1Vec.add(0, .025, -.15); @@ -772,11 +772,11 @@ public class RedstoneScenes { scene.addKeyframe(); scene.idle(10); - scene.overlay.showFilterSlotInput(frontSlot, Direction.UP, 100); - scene.overlay.showFilterSlotInput(backSlot, Direction.UP, 100); + scene.overlay().showFilterSlotInput(frontSlot, Direction.UP, 100); + scene.overlay().showFilterSlotInput(backSlot, Direction.UP, 100); scene.idle(10); - scene.overlay.showText(50) + scene.overlay().showText(50) .text("Placing items in the two slots can specify a Frequency") .placeNearTarget() .pointAt(backSlot); @@ -786,41 +786,41 @@ public class RedstoneScenes { ItemStack gold = new ItemStack(Items.GOLD_INGOT); ItemStack sapling = new ItemStack(Items.OAK_SAPLING); - scene.overlay.showControls(new InputWindowElement(frontSlot, Pointing.UP).withItem(iron), 30); + scene.overlay().showControls(new InputWindowElement(frontSlot, Pointing.UP).withItem(iron), 30); scene.idle(7); - scene.overlay.showControls(new InputWindowElement(backSlot, Pointing.DOWN).withItem(sapling), 30); - scene.world.modifyBlockEntityNBT(link1Select, RedstoneLinkBlockEntity.class, + scene.overlay().showControls(new InputWindowElement(backSlot, Pointing.DOWN).withItem(sapling), 30); + scene.world().modifyBlockEntityNBT(link1Select, RedstoneLinkBlockEntity.class, nbt -> nbt.put("FrequencyLast", iron.save(new CompoundTag()))); scene.idle(7); - scene.world.modifyBlockEntityNBT(link1Select, RedstoneLinkBlockEntity.class, + scene.world().modifyBlockEntityNBT(link1Select, RedstoneLinkBlockEntity.class, nbt -> nbt.put("FrequencyFirst", sapling.save(new CompoundTag()))); scene.idle(20); - scene.overlay.showControls(new InputWindowElement(bottom2Slot, Pointing.UP).withItem(iron), 30); + scene.overlay().showControls(new InputWindowElement(bottom2Slot, Pointing.UP).withItem(iron), 30); scene.idle(7); - scene.overlay.showControls(new InputWindowElement(top2Slot, Pointing.DOWN).withItem(sapling), 30); - scene.world.modifyBlockEntityNBT(link2Select, RedstoneLinkBlockEntity.class, + scene.overlay().showControls(new InputWindowElement(top2Slot, Pointing.DOWN).withItem(sapling), 30); + scene.world().modifyBlockEntityNBT(link2Select, RedstoneLinkBlockEntity.class, nbt -> nbt.put("FrequencyLast", iron.save(new CompoundTag()))); scene.idle(7); - scene.world.modifyBlockEntityNBT(link2Select, RedstoneLinkBlockEntity.class, + scene.world().modifyBlockEntityNBT(link2Select, RedstoneLinkBlockEntity.class, nbt -> nbt.put("FrequencyFirst", sapling.save(new CompoundTag()))); scene.idle(20); - scene.overlay.showControls(new InputWindowElement(bottom3Slot, Pointing.UP).withItem(gold), 30); + scene.overlay().showControls(new InputWindowElement(bottom3Slot, Pointing.UP).withItem(gold), 30); scene.idle(7); - scene.overlay.showControls(new InputWindowElement(top3Slot, Pointing.DOWN).withItem(sapling), 30); - scene.world.modifyBlockEntityNBT(link3Select, RedstoneLinkBlockEntity.class, + scene.overlay().showControls(new InputWindowElement(top3Slot, Pointing.DOWN).withItem(sapling), 30); + scene.world().modifyBlockEntityNBT(link3Select, RedstoneLinkBlockEntity.class, nbt -> nbt.put("FrequencyLast", gold.save(new CompoundTag()))); scene.idle(7); - scene.world.modifyBlockEntityNBT(link3Select, RedstoneLinkBlockEntity.class, + scene.world().modifyBlockEntityNBT(link3Select, RedstoneLinkBlockEntity.class, nbt -> nbt.put("FrequencyFirst", sapling.save(new CompoundTag()))); scene.idle(20); - scene.world.toggleRedstonePower(redstone); - scene.effects.indicateRedstone(leverPos); + scene.world().toggleRedstonePower(redstone); + scene.effects().indicateRedstone(leverPos); scene.idle(2); - scene.world.toggleRedstonePower(util.select.fromTo(1, 2, 2, 1, 2, 3)); - scene.overlay.showText(90) + scene.world().toggleRedstonePower(util.select().fromTo(1, 2, 2, 1, 2, 3)); + scene.overlay().showText(90) .attachKeyFrame() .text("Only the links with matching Frequencies will communicate") .placeNearTarget() @@ -829,10 +829,10 @@ public class RedstoneScenes { scene.idle(30); for (int i = 0; i < 4; i++) { if (i % 2 == 1) - scene.effects.indicateRedstone(leverPos); - scene.world.toggleRedstonePower(redstone); + scene.effects().indicateRedstone(leverPos); + scene.world().toggleRedstonePower(redstone); scene.idle(2); - scene.world.toggleRedstonePower(util.select.fromTo(1, 2, 2, 1, 2, 3)); + scene.world().toggleRedstonePower(util.select().fromTo(1, 2, 2, 1, 2, 3)); scene.idle(20); } } diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/RedstoneScenes2.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/RedstoneScenes2.java index e864b52f68..e321ed16cf 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/RedstoneScenes2.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/RedstoneScenes2.java @@ -6,9 +6,9 @@ import com.simibubi.create.content.redstone.nixieTube.NixieTubeBlockEntity; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; import net.createmod.ponder.foundation.ElementLink; -import net.createmod.ponder.foundation.SceneBuilder; -import net.createmod.ponder.foundation.SceneBuildingUtil; import net.createmod.ponder.foundation.Selection; import net.createmod.ponder.foundation.element.InputWindowElement; import net.createmod.ponder.foundation.element.WorldSectionElement; @@ -22,118 +22,121 @@ public class RedstoneScenes2 { scene.title("rose_quartz_lamp", "Rose Quartz Lamps"); scene.configureBasePlate(0, 0, 7); - BlockPos centerLamp = util.grid.at(3, 1, 3); - Selection input = util.select.fromTo(3, 1, 1, 3, 1, 2); - Selection button = util.select.position(3, 1, 1); - Selection wire = util.select.position(3, 1, 2); - Selection output = util.select.fromTo(5, 1, 2, 5, 1, 1); - Selection comparator = util.select.fromTo(1, 1, 3, 0, 1, 3); + BlockPos centerLamp = util.grid().at(3, 1, 3); + Selection input = util.select().fromTo(3, 1, 1, 3, 1, 2); + Selection button = util.select().position(3, 1, 1); + Selection wire = util.select().position(3, 1, 2); + Selection output = util.select().fromTo(5, 1, 2, 5, 1, 1); + Selection comparator = util.select().fromTo(1, 1, 3, 0, 1, 3); scene.showBasePlate(); scene.idle(15); ElementLink rowElement = - scene.world.showIndependentSection(util.select.position(centerLamp), Direction.DOWN); + scene.world().showIndependentSection(util.select().position(centerLamp), Direction.DOWN); scene.idle(5); - scene.world.showSection(input, Direction.SOUTH); + scene.world().showSection(input, Direction.SOUTH); scene.idle(15); - scene.world.toggleRedstonePower(input); - scene.effects.indicateRedstone(util.grid.at(3, 1, 1)); - scene.world.cycleBlockProperty(centerLamp, RoseQuartzLampBlock.POWERING); + scene.world().toggleRedstonePower(input); + scene.effects().indicateRedstone(util.grid().at(3, 1, 1)); + scene.world().cycleBlockProperty(centerLamp, RoseQuartzLampBlock.POWERING); scene.idle(15); - scene.overlay.showText(70) - .pointAt(util.vector.blockSurface(centerLamp, Direction.WEST)) + scene.overlay().showText(70) + .pointAt(util.vector().blockSurface(centerLamp, Direction.WEST)) .placeNearTarget() .attachKeyFrame() .text("Rose Quartz Lamps activate on a Redstone signal"); scene.idle(5); - scene.world.toggleRedstonePower(button); + scene.world().toggleRedstonePower(button); scene.idle(55); - scene.world.hideSection(input, Direction.EAST); + scene.world().hideSection(input, Direction.EAST); scene.idle(10); - ElementLink outputElement = scene.world.showIndependentSection(output, Direction.EAST); - scene.world.moveSection(outputElement, util.vector.of(-2, 0, 0), 0); + ElementLink outputElement = scene.world().showIndependentSection(output, Direction.EAST); + scene.world().moveSection(outputElement, util.vector().of(-2, 0, 0), 0); scene.idle(10); - scene.world.toggleRedstonePower(wire); - scene.world.toggleRedstonePower(output); + scene.world().toggleRedstonePower(wire); + scene.world().toggleRedstonePower(output); scene.idle(5); - scene.overlay.showText(70) - .pointAt(util.vector.blockSurface(centerLamp, Direction.WEST)) + scene.overlay().showText(70) + .pointAt(util.vector().blockSurface(centerLamp, Direction.WEST)) .placeNearTarget() .text("They will continue to emit redstone power afterwards"); scene.idle(60); - scene.world.hideIndependentSection(outputElement, Direction.NORTH); - scene.world.showSectionAndMerge(util.select.position(centerLamp.west()), Direction.EAST, rowElement); + scene.world().hideIndependentSection(outputElement, Direction.NORTH); + scene.world().showSectionAndMerge(util.select().position(centerLamp.west()), Direction.EAST, rowElement); scene.idle(3); - scene.world.showSectionAndMerge(util.select.position(centerLamp.east()), Direction.WEST, rowElement); + scene.world().showSectionAndMerge(util.select().position(centerLamp.east()), Direction.WEST, rowElement); scene.idle(25); - scene.overlay.showText(50) - .pointAt(util.vector.blockSurface(util.grid.at(2, 1, 3), Direction.WEST)) + scene.overlay().showText(50) + .pointAt(util.vector().blockSurface(util.grid().at(2, 1, 3), Direction.WEST)) .placeNearTarget() .attachKeyFrame() .text("When multiple lamps are arranged in a group..."); scene.idle(40); - ElementLink inputElement = scene.world.showIndependentSection(input, Direction.SOUTH); - scene.world.moveSection(inputElement, util.vector.of(1, 0, 0), 0); + ElementLink inputElement = scene.world().showIndependentSection(input, Direction.SOUTH); + scene.world().moveSection(inputElement, util.vector().of(1, 0, 0), 0); scene.idle(15); - scene.world.toggleRedstonePower(input); - scene.effects.indicateRedstone(util.grid.at(4, 1, 1)); - scene.world.cycleBlockProperty(centerLamp, RoseQuartzLampBlock.POWERING); - scene.world.cycleBlockProperty(centerLamp.east(), RoseQuartzLampBlock.POWERING); + scene.world().toggleRedstonePower(input); + scene.effects().indicateRedstone(util.grid().at(4, 1, 1)); + scene.world().cycleBlockProperty(centerLamp, RoseQuartzLampBlock.POWERING); + scene.world().cycleBlockProperty(centerLamp.east(), RoseQuartzLampBlock.POWERING); scene.idle(15); - scene.overlay.showText(80) - .pointAt(util.vector.blockSurface(util.grid.at(4, 1, 3), Direction.UP)) + scene.overlay().showText(80) + .pointAt(util.vector().blockSurface(util.grid().at(4, 1, 3), Direction.UP)) .placeNearTarget() .text("...activating a Lamp will focus the signal to it, deactivating all others"); scene.idle(5); - scene.world.toggleRedstonePower(button); + scene.world().toggleRedstonePower(button); scene.idle(60); - scene.world.hideIndependentSection(inputElement, Direction.NORTH); - scene.world.moveSection(rowElement, util.vector.of(1, 0, 0), 10); + scene.world().hideIndependentSection(inputElement, Direction.NORTH); + scene.world().moveSection(rowElement, util.vector().of(1, 0, 0), 10); scene.idle(15); - scene.world.showSectionAndMerge(comparator, Direction.EAST, rowElement); + scene.world().showSectionAndMerge(comparator, Direction.EAST, rowElement); scene.idle(15); - scene.world.toggleRedstonePower(comparator); - scene.world.modifyBlockEntityNBT(comparator, NixieTubeBlockEntity.class, nbt -> nbt.putInt("RedstoneStrength", 13)); + scene.world().toggleRedstonePower(comparator); + scene.world() + .modifyBlockEntityNBT(comparator, NixieTubeBlockEntity.class, nbt -> nbt.putInt("RedstoneStrength", 13)); scene.idle(25); - scene.overlay.showText(80) - .pointAt(util.vector.blockSurface(util.grid.at(1, 1, 3), Direction.WEST)) + scene.overlay().showText(80) + .pointAt(util.vector().blockSurface(util.grid().at(1, 1, 3), Direction.WEST)) .placeNearTarget() .attachKeyFrame() .text("Comparators output based on the distance to a powered lamp"); scene.idle(90); - scene.overlay - .showControls(new InputWindowElement(util.vector.topOf(centerLamp.east(2)), Pointing.DOWN).rightClick() + scene.overlay() + .showControls(new InputWindowElement(util.vector().topOf(centerLamp.east(2)), Pointing.DOWN).rightClick() .withItem(AllItems.WRENCH.asStack()), 20); scene.idle(6); - scene.world.cycleBlockProperty(centerLamp.east(), RoseQuartzLampBlock.POWERING); - scene.world.toggleRedstonePower(comparator); - scene.world.modifyBlockEntityNBT(comparator, NixieTubeBlockEntity.class, nbt -> nbt.putInt("RedstoneStrength", 0)); + scene.world().cycleBlockProperty(centerLamp.east(), RoseQuartzLampBlock.POWERING); + scene.world().toggleRedstonePower(comparator); + scene.world() + .modifyBlockEntityNBT(comparator, NixieTubeBlockEntity.class, nbt -> nbt.putInt("RedstoneStrength", 0)); scene.idle(20); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(centerLamp), Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(centerLamp), Pointing.DOWN).rightClick() .withItem(AllItems.WRENCH.asStack()), 20); scene.idle(6); - scene.world.cycleBlockProperty(centerLamp.west(), RoseQuartzLampBlock.POWERING); - scene.world.toggleRedstonePower(comparator); - scene.world.modifyBlockEntityNBT(comparator, NixieTubeBlockEntity.class, nbt -> nbt.putInt("RedstoneStrength", 15)); + scene.world().cycleBlockProperty(centerLamp.west(), RoseQuartzLampBlock.POWERING); + scene.world().toggleRedstonePower(comparator); + scene.world() + .modifyBlockEntityNBT(comparator, NixieTubeBlockEntity.class, nbt -> nbt.putInt("RedstoneStrength", 15)); scene.idle(20); - scene.overlay.showText(80) - .pointAt(util.vector.blockSurface(util.grid.at(3, 1, 3), Direction.UP)) + scene.overlay().showText(80) + .pointAt(util.vector().blockSurface(util.grid().at(3, 1, 3), Direction.UP)) .placeNearTarget() .attachKeyFrame() .text("The Lamps can also be toggled manually using a Wrench"); diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/RollerScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/RollerScenes.java index e1738c6e8d..174cb4ddc6 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/RollerScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/RollerScenes.java @@ -6,10 +6,10 @@ import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; import net.createmod.ponder.foundation.ElementLink; import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.SceneBuilder; -import net.createmod.ponder.foundation.SceneBuildingUtil; import net.createmod.ponder.foundation.Selection; import net.createmod.ponder.foundation.element.InputWindowElement; import net.createmod.ponder.foundation.element.ParrotElement; @@ -32,120 +32,120 @@ public class RollerScenes { scene.showBasePlate(); scene.idle(5); - BlockPos stationPos = util.grid.at(7, 1, 1); - Selection gantryPole = util.select.fromTo(9, 5, 4, 1, 5, 4); - Selection cogs = util.select.fromTo(9, 0, 4, 9, 4, 4); - Selection gantryCar = util.select.fromTo(7, 2, 8, 7, 4, 8); - BlockPos bogeyPos = util.grid.at(7, 2, 4); - Selection someRubble = util.select.fromTo(2, 1, 3, 3, 2, 5) - .substract(util.select.fromTo(3, 1, 4, 2, 1, 4)); - Selection chest = util.select.fromTo(7, 2, 5, 8, 3, 5); - Selection rollers = util.select.fromTo(6, 2, 3, 6, 2, 5); - Selection train = util.select.fromTo(8, 3, 4, 7, 2, 4); - BlockPos controlsPos = util.grid.at(7, 3, 4); + BlockPos stationPos = util.grid().at(7, 1, 1); + Selection gantryPole = util.select().fromTo(9, 5, 4, 1, 5, 4); + Selection cogs = util.select().fromTo(9, 0, 4, 9, 4, 4); + Selection gantryCar = util.select().fromTo(7, 2, 8, 7, 4, 8); + BlockPos bogeyPos = util.grid().at(7, 2, 4); + Selection someRubble = util.select().fromTo(2, 1, 3, 3, 2, 5) + .substract(util.select().fromTo(3, 1, 4, 2, 1, 4)); + Selection chest = util.select().fromTo(7, 2, 5, 8, 3, 5); + Selection rollers = util.select().fromTo(6, 2, 3, 6, 2, 5); + Selection train = util.select().fromTo(8, 3, 4, 7, 2, 4); + BlockPos controlsPos = util.grid().at(7, 3, 4); for (int i = 8; i >= 0; i--) { - scene.world.showSection(util.select.position(i, 1, 4), Direction.DOWN); + scene.world().showSection(util.select().position(i, 1, 4), Direction.DOWN); scene.idle(1); } - scene.special.movePointOfInterest(util.grid.at(0, 3, 4)); + scene.special().movePointOfInterest(util.grid().at(0, 3, 4)); scene.idle(5); - scene.world.showSection(util.select.position(stationPos), Direction.DOWN); + scene.world().showSection(util.select().position(stationPos), Direction.DOWN); scene.idle(5); ElementLink birbLink = - scene.special.createBirb(util.vector.centerOf(8, 3, 4), ParrotElement.FacePointOfInterestPose::new); - ElementLink trainLink = scene.world.showIndependentSection(train, Direction.DOWN); + scene.special().createBirb(util.vector().centerOf(8, 3, 4), ParrotElement.FacePointOfInterestPose::new); + ElementLink trainLink = scene.world().showIndependentSection(train, Direction.DOWN); scene.idle(5); - scene.world.showSectionAndMerge(rollers, Direction.EAST, trainLink); + scene.world().showSectionAndMerge(rollers, Direction.EAST, trainLink); scene.idle(15); - scene.world.cycleBlockProperty(stationPos, StationBlock.ASSEMBLING); - scene.world.animateTrainStation(stationPos, true); + scene.world().cycleBlockProperty(stationPos, StationBlock.ASSEMBLING); + scene.world().animateTrainStation(stationPos, true); - scene.overlay.showText(60) - .pointAt(util.vector.topOf(util.grid.at(6, 2, 4))) + scene.overlay().showText(60) + .pointAt(util.vector().topOf(util.grid().at(6, 2, 4))) .attachKeyFrame() .text("Mechanical rollers help to clean up terrain around tracks or paths") .placeNearTarget(); scene.idle(70); - scene.world.cycleBlockProperty(stationPos, StationBlock.ASSEMBLING); - scene.world.animateTrainStation(stationPos, false); - scene.world.showSection(someRubble, Direction.DOWN); - scene.world.toggleControls(controlsPos); + scene.world().cycleBlockProperty(stationPos, StationBlock.ASSEMBLING); + scene.world().animateTrainStation(stationPos, false); + scene.world().showSection(someRubble, Direction.DOWN); + scene.world().toggleControls(controlsPos); - scene.world.moveSection(trainLink, util.vector.of(-1.5, 0, 0), 30); - scene.special.moveParrot(birbLink, util.vector.of(-1.5, 0, 0), 30); + scene.world().moveSection(trainLink, util.vector().of(-1.5, 0, 0), 30); + scene.special().moveParrot(birbLink, util.vector().of(-1.5, 0, 0), 30); for (int i = 0; i < 3; i++) - scene.world.modifyBlockEntity(util.grid.at(6, 2, 3 + i), RollerBlockEntity.class, + scene.world().modifyBlockEntity(util.grid().at(6, 2, 3 + i), RollerBlockEntity.class, rte -> rte.setAnimatedSpeed(-100)); - scene.world.animateBogey(bogeyPos, 1.5f, 30); + scene.world().animateBogey(bogeyPos, 1.5f, 30); scene.idle(30); for (int i = 0; i < 3; i++) - scene.world.modifyBlockEntity(util.grid.at(6, 2, 3 + i), RollerBlockEntity.class, + scene.world().modifyBlockEntity(util.grid().at(6, 2, 3 + i), RollerBlockEntity.class, rte -> rte.setAnimatedSpeed(0)); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(util.grid.at(2, 2, 4)), Pointing.DOWN) + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(util.grid().at(2, 2, 4)), Pointing.DOWN) .showing(AllIcons.I_ROLLER_PAVE), 70); - scene.overlay.showText(80) - .pointAt(util.vector.topOf(util.grid.at(2, 2, 4))) + scene.overlay().showText(80) + .pointAt(util.vector().topOf(util.grid().at(2, 2, 4))) .attachKeyFrame() .text("In its default mode, without a material set, it will simply clear blocks like a Drill") .placeNearTarget(); for (int i = 0; i < 10; i++) { scene.idle(3); - scene.world.incrementBlockBreakingProgress(util.grid.at(3, 1, 5)); - scene.world.incrementBlockBreakingProgress(util.grid.at(3, 1, 3)); - scene.world.incrementBlockBreakingProgress(util.grid.at(3, 2, 5)); + scene.world().incrementBlockBreakingProgress(util.grid().at(3, 1, 5)); + scene.world().incrementBlockBreakingProgress(util.grid().at(3, 1, 3)); + scene.world().incrementBlockBreakingProgress(util.grid().at(3, 2, 5)); } - scene.world.moveSection(trainLink, util.vector.of(-1, 0, 0), 20); - scene.special.moveParrot(birbLink, util.vector.of(-1, 0, 0), 20); + scene.world().moveSection(trainLink, util.vector().of(-1, 0, 0), 20); + scene.special().moveParrot(birbLink, util.vector().of(-1, 0, 0), 20); for (int i = 0; i < 3; i++) - scene.world.modifyBlockEntity(util.grid.at(6, 2, 3 + i), RollerBlockEntity.class, + scene.world().modifyBlockEntity(util.grid().at(6, 2, 3 + i), RollerBlockEntity.class, rte -> rte.setAnimatedSpeed(-100)); - scene.world.animateBogey(bogeyPos, 1f, 20); + scene.world().animateBogey(bogeyPos, 1f, 20); scene.idle(20); for (int i = 0; i < 3; i++) - scene.world.modifyBlockEntity(util.grid.at(6, 2, 3 + i), RollerBlockEntity.class, + scene.world().modifyBlockEntity(util.grid().at(6, 2, 3 + i), RollerBlockEntity.class, rte -> rte.setAnimatedSpeed(0)); for (int i = 0; i < 10; i++) { scene.idle(3); - scene.world.incrementBlockBreakingProgress(util.grid.at(2, 2, 4)); - scene.world.incrementBlockBreakingProgress(util.grid.at(2, 1, 3)); + scene.world().incrementBlockBreakingProgress(util.grid().at(2, 2, 4)); + scene.world().incrementBlockBreakingProgress(util.grid().at(2, 1, 3)); } - scene.world.moveSection(trainLink, util.vector.of(-2, 0, 0), 40); - scene.special.moveParrot(birbLink, util.vector.of(-2, 0, 0), 40); + scene.world().moveSection(trainLink, util.vector().of(-2, 0, 0), 40); + scene.special().moveParrot(birbLink, util.vector().of(-2, 0, 0), 40); for (int i = 0; i < 3; i++) - scene.world.modifyBlockEntity(util.grid.at(6, 2, 3 + i), RollerBlockEntity.class, + scene.world().modifyBlockEntity(util.grid().at(6, 2, 3 + i), RollerBlockEntity.class, rte -> rte.setAnimatedSpeed(-100)); - scene.world.animateBogey(bogeyPos, 2f, 40); + scene.world().animateBogey(bogeyPos, 2f, 40); scene.idle(40); for (int i = 0; i < 3; i++) - scene.world.modifyBlockEntity(util.grid.at(6, 2, 3 + i), RollerBlockEntity.class, + scene.world().modifyBlockEntity(util.grid().at(6, 2, 3 + i), RollerBlockEntity.class, rte -> rte.setAnimatedSpeed(0)); - scene.special.hideElement(birbLink, Direction.UP); - scene.world.hideIndependentSection(trainLink, Direction.UP); + scene.special().hideElement(birbLink, Direction.UP); + scene.world().hideIndependentSection(trainLink, Direction.UP); scene.idle(15); - birbLink = scene.special.createBirb(util.vector.centerOf(8, 3, 4), ParrotElement.FacePointOfInterestPose::new); - trainLink = scene.world.showIndependentSection(train, Direction.DOWN); - scene.world.toggleControls(controlsPos); + birbLink = scene.special().createBirb(util.vector().centerOf(8, 3, 4), ParrotElement.FacePointOfInterestPose::new); + trainLink = scene.world().showIndependentSection(train, Direction.DOWN); + scene.world().toggleControls(controlsPos); scene.idle(5); - scene.world.showSectionAndMerge(rollers, Direction.EAST, trainLink); + scene.world().showSectionAndMerge(rollers, Direction.EAST, trainLink); scene.idle(15); - scene.world.cycleBlockProperty(stationPos, StationBlock.ASSEMBLING); - scene.world.animateTrainStation(stationPos, true); - scene.world.hideSection(someRubble, Direction.DOWN); + scene.world().cycleBlockProperty(stationPos, StationBlock.ASSEMBLING); + scene.world().animateTrainStation(stationPos, true); + scene.world().hideSection(someRubble, Direction.DOWN); - Vec3 filterSlot = util.vector.of(6.75 - 1 / 16f, 3, 3.25 + 1 / 16f); - scene.overlay.showFilterSlotInput(filterSlot, Direction.UP, 60); - scene.overlay.showText(60) + Vec3 filterSlot = util.vector().of(6.75 - 1 / 16f, 3, 3.25 + 1 / 16f); + scene.overlay().showFilterSlotInput(filterSlot, Direction.UP, 60); + scene.overlay().showText(60) .pointAt(filterSlot.add(-.125, 0, 0)) .attachKeyFrame() .text("While disassembled, a suitable paving material can be specified") @@ -154,154 +154,154 @@ public class RollerScenes { Block paveMaterial = Blocks.TUFF; ItemStack paveItem = new ItemStack(paveMaterial); - scene.overlay.showControls(new InputWindowElement(filterSlot, Pointing.DOWN).withItem(paveItem), 40); + scene.overlay().showControls(new InputWindowElement(filterSlot, Pointing.DOWN).withItem(paveItem), 40); scene.idle(7); - scene.world.setFilterData(rollers, RollerBlockEntity.class, paveItem); + scene.world().setFilterData(rollers, RollerBlockEntity.class, paveItem); scene.idle(20); - scene.world.showSectionAndMerge(chest, Direction.DOWN, trainLink); + scene.world().showSectionAndMerge(chest, Direction.DOWN, trainLink); scene.idle(15); - scene.overlay.showText(70) - .pointAt(util.vector.topOf(util.grid.at(7, 3, 5))) + scene.overlay().showText(70) + .pointAt(util.vector().topOf(util.grid().at(7, 3, 5))) .text("Materials can be supplied via chests or barrels attached to the structure") .placeNearTarget(); scene.idle(60); - scene.world.restoreBlocks(someRubble); - scene.world.cycleBlockProperty(stationPos, StationBlock.ASSEMBLING); - scene.world.animateTrainStation(stationPos, false); - scene.world.showSection(someRubble, Direction.DOWN); - scene.world.toggleControls(controlsPos); - scene.world.showSection(someRubble, Direction.DOWN); + scene.world().restoreBlocks(someRubble); + scene.world().cycleBlockProperty(stationPos, StationBlock.ASSEMBLING); + scene.world().animateTrainStation(stationPos, false); + scene.world().showSection(someRubble, Direction.DOWN); + scene.world().toggleControls(controlsPos); + scene.world().showSection(someRubble, Direction.DOWN); - scene.world.moveSection(trainLink, util.vector.of(-1.5, 0, 0), 30); - scene.special.moveParrot(birbLink, util.vector.of(-1.5, 0, 0), 30); + scene.world().moveSection(trainLink, util.vector().of(-1.5, 0, 0), 30); + scene.special().moveParrot(birbLink, util.vector().of(-1.5, 0, 0), 30); for (int i = 0; i < 3; i++) - scene.world.modifyBlockEntity(util.grid.at(6, 2, 3 + i), RollerBlockEntity.class, + scene.world().modifyBlockEntity(util.grid().at(6, 2, 3 + i), RollerBlockEntity.class, rte -> rte.setAnimatedSpeed(-100)); - scene.world.animateBogey(bogeyPos, 1.5f, 30); + scene.world().animateBogey(bogeyPos, 1.5f, 30); - scene.world.replaceBlocks(util.select.fromTo(5, 0, 3, 5, 0, 5), paveMaterial.defaultBlockState(), true); + scene.world().replaceBlocks(util.select().fromTo(5, 0, 3, 5, 0, 5), paveMaterial.defaultBlockState(), true); scene.idle(20); - scene.world.replaceBlocks(util.select.fromTo(4, 0, 3, 4, 0, 5), paveMaterial.defaultBlockState(), true); + scene.world().replaceBlocks(util.select().fromTo(4, 0, 3, 4, 0, 5), paveMaterial.defaultBlockState(), true); scene.idle(10); for (int i = 0; i < 3; i++) - scene.world.modifyBlockEntity(util.grid.at(6, 2, 3 + i), RollerBlockEntity.class, + scene.world().modifyBlockEntity(util.grid().at(6, 2, 3 + i), RollerBlockEntity.class, rte -> rte.setAnimatedSpeed(0)); - scene.overlay.showText(80) - .pointAt(util.vector.topOf(util.grid.at(5, 0, 3))) + scene.overlay().showText(80) + .pointAt(util.vector().topOf(util.grid().at(5, 0, 3))) .attachKeyFrame() .text("In addition to breaking blocks, it will now replace the layer beneath them") .placeNearTarget(); for (int i = 0; i < 10; i++) { scene.idle(3); - scene.world.incrementBlockBreakingProgress(util.grid.at(3, 1, 5)); - scene.world.incrementBlockBreakingProgress(util.grid.at(3, 1, 3)); - scene.world.incrementBlockBreakingProgress(util.grid.at(3, 2, 5)); + scene.world().incrementBlockBreakingProgress(util.grid().at(3, 1, 5)); + scene.world().incrementBlockBreakingProgress(util.grid().at(3, 1, 3)); + scene.world().incrementBlockBreakingProgress(util.grid().at(3, 2, 5)); } - scene.world.moveSection(trainLink, util.vector.of(-1, 0, 0), 20); - scene.special.moveParrot(birbLink, util.vector.of(-1, 0, 0), 20); + scene.world().moveSection(trainLink, util.vector().of(-1, 0, 0), 20); + scene.special().moveParrot(birbLink, util.vector().of(-1, 0, 0), 20); for (int i = 0; i < 3; i++) - scene.world.modifyBlockEntity(util.grid.at(6, 2, 3 + i), RollerBlockEntity.class, + scene.world().modifyBlockEntity(util.grid().at(6, 2, 3 + i), RollerBlockEntity.class, rte -> rte.setAnimatedSpeed(-100)); - scene.world.animateBogey(bogeyPos, 1f, 20); + scene.world().animateBogey(bogeyPos, 1f, 20); scene.idle(10); - scene.world.replaceBlocks(util.select.fromTo(3, 0, 3, 3, 0, 5), paveMaterial.defaultBlockState(), true); + scene.world().replaceBlocks(util.select().fromTo(3, 0, 3, 3, 0, 5), paveMaterial.defaultBlockState(), true); scene.idle(10); for (int i = 0; i < 3; i++) - scene.world.modifyBlockEntity(util.grid.at(6, 2, 3 + i), RollerBlockEntity.class, + scene.world().modifyBlockEntity(util.grid().at(6, 2, 3 + i), RollerBlockEntity.class, rte -> rte.setAnimatedSpeed(0)); for (int i = 0; i < 10; i++) { scene.idle(3); - scene.world.incrementBlockBreakingProgress(util.grid.at(2, 2, 4)); - scene.world.incrementBlockBreakingProgress(util.grid.at(2, 1, 3)); + scene.world().incrementBlockBreakingProgress(util.grid().at(2, 2, 4)); + scene.world().incrementBlockBreakingProgress(util.grid().at(2, 1, 3)); } - scene.world.moveSection(trainLink, util.vector.of(-3, 0, 0), 60); - scene.special.moveParrot(birbLink, util.vector.of(-3, 0, 0), 60); + scene.world().moveSection(trainLink, util.vector().of(-3, 0, 0), 60); + scene.special().moveParrot(birbLink, util.vector().of(-3, 0, 0), 60); for (int i = 0; i < 3; i++) - scene.world.modifyBlockEntity(util.grid.at(6, 2, 3 + i), RollerBlockEntity.class, + scene.world().modifyBlockEntity(util.grid().at(6, 2, 3 + i), RollerBlockEntity.class, rte -> rte.setAnimatedSpeed(-100)); - scene.world.animateBogey(bogeyPos, 3f, 60); + scene.world().animateBogey(bogeyPos, 3f, 60); scene.idle(10); - scene.world.replaceBlocks(util.select.fromTo(2, 0, 3, 2, 0, 5), paveMaterial.defaultBlockState(), true); + scene.world().replaceBlocks(util.select().fromTo(2, 0, 3, 2, 0, 5), paveMaterial.defaultBlockState(), true); scene.idle(20); - scene.world.replaceBlocks(util.select.fromTo(1, 0, 3, 1, 0, 5), paveMaterial.defaultBlockState(), true); + scene.world().replaceBlocks(util.select().fromTo(1, 0, 3, 1, 0, 5), paveMaterial.defaultBlockState(), true); scene.idle(20); - scene.world.replaceBlocks(util.select.fromTo(0, 0, 3, 0, 0, 5), paveMaterial.defaultBlockState(), true); + scene.world().replaceBlocks(util.select().fromTo(0, 0, 3, 0, 0, 5), paveMaterial.defaultBlockState(), true); scene.idle(10); for (int i = 0; i < 3; i++) - scene.world.modifyBlockEntity(util.grid.at(6, 2, 3 + i), RollerBlockEntity.class, + scene.world().modifyBlockEntity(util.grid().at(6, 2, 3 + i), RollerBlockEntity.class, rte -> rte.setAnimatedSpeed(0)); - scene.special.hideElement(birbLink, Direction.UP); - scene.world.hideIndependentSection(trainLink, Direction.UP); + scene.special().hideElement(birbLink, Direction.UP); + scene.world().hideIndependentSection(trainLink, Direction.UP); scene.idle(5); - scene.world.hideSection(util.select.fromTo(8, 1, 4, 0, 1, 4), Direction.SOUTH); - scene.world.hideSection(util.select.position(stationPos), Direction.UP); + scene.world().hideSection(util.select().fromTo(8, 1, 4, 0, 1, 4), Direction.SOUTH); + scene.world().hideSection(util.select().position(stationPos), Direction.UP); scene.idle(10); - scene.overlay.showSelectionWithText(util.select.fromTo(5, 0, 3, 0, 0, 5), 90) - .pointAt(util.vector.topOf(util.grid.at(3, 0, 4))) + scene.overlay().showSelectionWithText(util.select().fromTo(5, 0, 3, 0, 0, 5), 90) + .pointAt(util.vector().topOf(util.grid().at(3, 0, 4))) .attachKeyFrame() .colored(PonderPalette.RED) .text("Note that any block destroyed by a roller has a chance not to yield drops") .placeNearTarget(); scene.idle(100); - scene.world.showSection(gantryPole, Direction.DOWN); - scene.world.showSection(cogs, Direction.WEST); + scene.world().showSection(gantryPole, Direction.DOWN); + scene.world().showSection(cogs, Direction.WEST); scene.idle(10); - ElementLink gantryLink = scene.world.showIndependentSection(gantryCar, Direction.UP); - scene.world.moveSection(gantryLink, util.vector.of(0, 0, -4), 0); + ElementLink gantryLink = scene.world().showIndependentSection(gantryCar, Direction.UP); + scene.world().moveSection(gantryLink, util.vector().of(0, 0, -4), 0); scene.idle(10); - ElementLink gantryLink2 = scene.world.showIndependentSection(rollers, Direction.EAST); + ElementLink gantryLink2 = scene.world().showIndependentSection(rollers, Direction.EAST); scene.idle(5); - ElementLink gantryLink3 = scene.world.showIndependentSection(chest, Direction.SOUTH); - scene.world.moveSection(gantryLink3, util.vector.of(0, 0, -2), 0); + ElementLink gantryLink3 = scene.world().showIndependentSection(chest, Direction.SOUTH); + scene.world().moveSection(gantryLink3, util.vector().of(0, 0, -2), 0); scene.idle(15); paveMaterial = Blocks.GRASS_BLOCK; paveItem = new ItemStack(paveMaterial); - scene.overlay.showControls(new InputWindowElement(filterSlot, Pointing.DOWN).withItem(paveItem), 40); + scene.overlay().showControls(new InputWindowElement(filterSlot, Pointing.DOWN).withItem(paveItem), 40); scene.idle(7); - scene.world.setFilterData(rollers, RollerBlockEntity.class, paveItem); + scene.world().setFilterData(rollers, RollerBlockEntity.class, paveItem); scene.idle(20); - scene.overlay.showText(110) + scene.overlay().showText(110) .independent() .attachKeyFrame() .text( "Rollers are especially useful on Trains, but can also be used on most other types of moving contraptions"); scene.idle(20); - scene.world.moveSection(gantryLink, util.vector.of(-5.5, 0, 0), 110); - scene.world.moveSection(gantryLink2, util.vector.of(-5.5, 0, 0), 110); - scene.world.moveSection(gantryLink3, util.vector.of(-5.5, 0, 0), 110); - scene.world.setKineticSpeed(gantryPole, 48); + scene.world().moveSection(gantryLink, util.vector().of(-5.5, 0, 0), 110); + scene.world().moveSection(gantryLink2, util.vector().of(-5.5, 0, 0), 110); + scene.world().moveSection(gantryLink3, util.vector().of(-5.5, 0, 0), 110); + scene.world().setKineticSpeed(gantryPole, 48); for (int i = 0; i < 5; i++) - scene.world.setKineticSpeed(util.select.position(9, i, 4), i % 2 == 0 ? -48 : 48); + scene.world().setKineticSpeed(util.select().position(9, i, 4), i % 2 == 0 ? -48 : 48); for (int i = 0; i < 3; i++) - scene.world.modifyBlockEntity(util.grid.at(6, 2, 3 + i), RollerBlockEntity.class, + scene.world().modifyBlockEntity(util.grid().at(6, 2, 3 + i), RollerBlockEntity.class, rte -> rte.setAnimatedSpeed(-100)); for (int i = 0; i < 5; i++) { - scene.world.replaceBlocks(util.select.fromTo(5 - i, 0, 3, 5 - i, 0, 5), paveMaterial.defaultBlockState(), - true); + scene.world().replaceBlocks(util.select().fromTo(5 - i, 0, 3, 5 - i, 0, 5), paveMaterial.defaultBlockState(), + true); scene.idle(20); } - scene.world.replaceBlocks(util.select.fromTo(0, 0, 3, 0, 0, 5), paveMaterial.defaultBlockState(), true); + scene.world().replaceBlocks(util.select().fromTo(0, 0, 3, 0, 0, 5), paveMaterial.defaultBlockState(), true); scene.idle(10); for (int i = 0; i < 3; i++) - scene.world.modifyBlockEntity(util.grid.at(6, 2, 3 + i), RollerBlockEntity.class, + scene.world().modifyBlockEntity(util.grid().at(6, 2, 3 + i), RollerBlockEntity.class, rte -> rte.setAnimatedSpeed(0)); - scene.world.setKineticSpeed(util.select.everywhere(), 0); + scene.world().setKineticSpeed(util.select().everywhere(), 0); } @@ -311,88 +311,88 @@ public class RollerScenes { scene.configureBasePlate(0, 0, 9); scene.scaleSceneView(.625f); scene.setSceneOffsetY(-3); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); scene.idle(5); - BlockPos stationPos = util.grid.at(7, 5, 1); - BlockPos controlsPos = util.grid.at(7, 7, 4); - BlockPos bogeyPos = util.grid.at(7, 6, 4); - Selection train = util.select.fromTo(8, 6, 4, 7, 7, 5); - Selection rollers = util.select.fromTo(6, 6, 3, 6, 6, 5); + BlockPos stationPos = util.grid().at(7, 5, 1); + BlockPos controlsPos = util.grid().at(7, 7, 4); + BlockPos bogeyPos = util.grid().at(7, 6, 4); + Selection train = util.select().fromTo(8, 6, 4, 7, 7, 5); + Selection rollers = util.select().fromTo(6, 6, 3, 6, 6, 5); - scene.special.movePointOfInterest(util.grid.at(0, 7, 4)); + scene.special().movePointOfInterest(util.grid().at(0, 7, 4)); for (int i = 8; i >= 0; i--) { - scene.world.showSection(util.select.fromTo(i, 4, 3, i, 5, 5), Direction.DOWN); + scene.world().showSection(util.select().fromTo(i, 4, 3, i, 5, 5), Direction.DOWN); scene.idle(1); } // 1 scene.idle(5); - scene.world.showSection(util.select.fromTo(8, 1, 2, 6, 4, 2), Direction.DOWN); - scene.world.showSection(util.select.fromTo(8, 1, 6, 6, 4, 6), Direction.DOWN); + scene.world().showSection(util.select().fromTo(8, 1, 2, 6, 4, 2), Direction.DOWN); + scene.world().showSection(util.select().fromTo(8, 1, 6, 6, 4, 6), Direction.DOWN); scene.idle(5); - scene.world.showSection(util.select.fromTo(7, 4, 1, 7, 5, 1), Direction.SOUTH); + scene.world().showSection(util.select().fromTo(7, 4, 1, 7, 5, 1), Direction.SOUTH); scene.idle(5); - ElementLink trainLink = scene.world.showIndependentSection(train, Direction.DOWN); + ElementLink trainLink = scene.world().showIndependentSection(train, Direction.DOWN); ElementLink birbLink = - scene.special.createBirb(util.vector.centerOf(8, 7, 4), ParrotElement.FacePointOfInterestPose::new); + scene.special().createBirb(util.vector().centerOf(8, 7, 4), ParrotElement.FacePointOfInterestPose::new); scene.idle(5); - scene.world.showSectionAndMerge(rollers, Direction.EAST, trainLink); + scene.world().showSectionAndMerge(rollers, Direction.EAST, trainLink); scene.idle(15); - Vec3 filterSlot = util.vector.of(6.75 - 1 / 16f, 7, 3.75 - 1 / 16f); - scene.overlay.showFilterSlotInput(filterSlot, Direction.UP, 60); - scene.overlay.showText(60) + Vec3 filterSlot = util.vector().of(6.75 - 1 / 16f, 7, 3.75 - 1 / 16f); + scene.overlay().showFilterSlotInput(filterSlot, Direction.UP, 60); + scene.overlay().showText(60) .pointAt(filterSlot.add(-.125, 0, 0)) .attachKeyFrame() .text("While disassembled, rollers can be set to other modes") .placeNearTarget(); scene.idle(70); - scene.overlay.showSelectionWithText(util.select.fromTo(5, 3, 3, 0, 1, 5), 90) + scene.overlay().showSelectionWithText(util.select().fromTo(5, 3, 3, 0, 1, 5), 90) .attachKeyFrame() .colored(PonderPalette.BLUE) .text("The 'fill' modes can help to bridge gaps between pavement and terrain") .placeNearTarget(); scene.idle(100); - scene.overlay.showControls(new InputWindowElement(filterSlot, Pointing.DOWN).showing(AllIcons.I_ROLLER_FILL), - 50); + scene.overlay().showControls(new InputWindowElement(filterSlot, Pointing.DOWN).showing(AllIcons.I_ROLLER_FILL), + 50); scene.idle(15); Block paveMaterial = Blocks.COARSE_DIRT; ItemStack paveItem = new ItemStack(paveMaterial); - scene.overlay + scene.overlay() .showControls(new InputWindowElement(filterSlot.add(0, 0, -6 / 16f), Pointing.UP).withItem(paveItem), 35); scene.idle(7); - scene.world.setFilterData(rollers, RollerBlockEntity.class, paveItem); + scene.world().setFilterData(rollers, RollerBlockEntity.class, paveItem); scene.idle(10); - scene.world.cycleBlockProperty(stationPos, StationBlock.ASSEMBLING); - scene.world.animateTrainStation(stationPos, false); - scene.world.toggleControls(controlsPos); + scene.world().cycleBlockProperty(stationPos, StationBlock.ASSEMBLING); + scene.world().animateTrainStation(stationPos, false); + scene.world().toggleControls(controlsPos); scene.idle(20); - scene.world.moveSection(trainLink, util.vector.of(-5.5, 0, 0), 110); - scene.special.moveParrot(birbLink, util.vector.of(-5.5, 0, 0), 110); - scene.world.animateBogey(bogeyPos, 5.5f, 110); + scene.world().moveSection(trainLink, util.vector().of(-5.5, 0, 0), 110); + scene.special().moveParrot(birbLink, util.vector().of(-5.5, 0, 0), 110); + scene.world().animateBogey(bogeyPos, 5.5f, 110); for (int i = 0; i < 3; i++) - scene.world.modifyBlockEntity(util.grid.at(6, 6, 3 + i), RollerBlockEntity.class, + scene.world().modifyBlockEntity(util.grid().at(6, 6, 3 + i), RollerBlockEntity.class, rte -> rte.setAnimatedSpeed(-100)); for (int j = 0; j < 5; j++) { for (int i = 0; i < 3; i++) { - scene.world.showSection(util.select.fromTo(5 - j, 3 - i, 3, 5 - j, 3 - i, 5), null); + scene.world().showSection(util.select().fromTo(5 - j, 3 - i, 3, 5 - j, 3 - i, 5), null); scene.idle(2); } if (j == 2) - scene.overlay.showText(90) + scene.overlay().showText(90) .attachKeyFrame() - .pointAt(util.vector.blockSurface(util.grid.at(3, 2, 3), Direction.NORTH)) + .pointAt(util.vector().blockSurface(util.grid().at(3, 2, 3), Direction.NORTH)) .text("On 'straight fill', they will place simple columns down to the surface") .placeNearTarget(); @@ -400,62 +400,62 @@ public class RollerScenes { } for (int i = 0; i < 3; i++) { - scene.world.showSection(util.select.fromTo(0, 3 - i, 3, 0, 3 - i, 5), null); + scene.world().showSection(util.select().fromTo(0, 3 - i, 3, 0, 3 - i, 5), null); scene.idle(2); } scene.idle(4); for (int i = 0; i < 3; i++) - scene.world.modifyBlockEntity(util.grid.at(6, 6, 3 + i), RollerBlockEntity.class, + scene.world().modifyBlockEntity(util.grid().at(6, 6, 3 + i), RollerBlockEntity.class, rte -> rte.setAnimatedSpeed(0)); scene.idle(15); - scene.world.hideSection(util.select.fromTo(5, 1, 3, 0, 3, 5), Direction.SOUTH); - scene.world.hideIndependentSection(trainLink, Direction.UP); - scene.special.hideElement(birbLink, Direction.UP); + scene.world().hideSection(util.select().fromTo(5, 1, 3, 0, 3, 5), Direction.SOUTH); + scene.world().hideIndependentSection(trainLink, Direction.UP); + scene.special().hideElement(birbLink, Direction.UP); scene.idle(15); - scene.world.toggleControls(controlsPos); + scene.world().toggleControls(controlsPos); scene.idle(15); // 2 - scene.world.cycleBlockProperty(stationPos, StationBlock.ASSEMBLING); - scene.world.animateTrainStation(stationPos, true); - birbLink = scene.special.createBirb(util.vector.centerOf(8, 7, 4), ParrotElement.FacePointOfInterestPose::new); - trainLink = scene.world.showIndependentSection(train, Direction.DOWN); + scene.world().cycleBlockProperty(stationPos, StationBlock.ASSEMBLING); + scene.world().animateTrainStation(stationPos, true); + birbLink = scene.special().createBirb(util.vector().centerOf(8, 7, 4), ParrotElement.FacePointOfInterestPose::new); + trainLink = scene.world().showIndependentSection(train, Direction.DOWN); scene.idle(5); - scene.world.showSectionAndMerge(rollers, Direction.EAST, trainLink); + scene.world().showSectionAndMerge(rollers, Direction.EAST, trainLink); scene.idle(25); - scene.overlay + scene.overlay() .showControls(new InputWindowElement(filterSlot, Pointing.DOWN).showing(AllIcons.I_ROLLER_WIDE_FILL), 40); scene.idle(45); - scene.world.cycleBlockProperty(stationPos, StationBlock.ASSEMBLING); - scene.world.animateTrainStation(stationPos, false); - scene.world.toggleControls(controlsPos); + scene.world().cycleBlockProperty(stationPos, StationBlock.ASSEMBLING); + scene.world().animateTrainStation(stationPos, false); + scene.world().toggleControls(controlsPos); scene.idle(20); - scene.world.moveSection(trainLink, util.vector.of(-5.5, 0, 0), 110); - scene.special.moveParrot(birbLink, util.vector.of(-5.5, 0, 0), 110); - scene.world.animateBogey(bogeyPos, 5.5f, 110); + scene.world().moveSection(trainLink, util.vector().of(-5.5, 0, 0), 110); + scene.special().moveParrot(birbLink, util.vector().of(-5.5, 0, 0), 110); + scene.world().animateBogey(bogeyPos, 5.5f, 110); for (int i = 0; i < 3; i++) - scene.world.modifyBlockEntity(util.grid.at(6, 6, 3 + i), RollerBlockEntity.class, + scene.world().modifyBlockEntity(util.grid().at(6, 6, 3 + i), RollerBlockEntity.class, rte -> rte.setAnimatedSpeed(-100)); for (int j = 0; j < 5; j++) { for (int i = 0; i < 3; i++) { - scene.world.showSection(util.select.fromTo(5 - j, 3 - i, 1, 5 - j, 3 - i, 7), null); + scene.world().showSection(util.select().fromTo(5 - j, 3 - i, 1, 5 - j, 3 - i, 7), null); scene.idle(2); } if (j == 2) - scene.overlay.showText(90) + scene.overlay().showText(90) .attachKeyFrame() - .pointAt(util.vector.blockSurface(util.grid.at(3, 2, 3), Direction.NORTH)) + .pointAt(util.vector().blockSurface(util.grid().at(3, 2, 3), Direction.NORTH)) .text("On 'sloped fill', layers placed further down will increase in size") .placeNearTarget(); @@ -463,51 +463,51 @@ public class RollerScenes { } for (int i = 0; i < 3; i++) { - scene.world.showSection(util.select.fromTo(0, 3 - i, 1, 0, 3 - i, 7), null); + scene.world().showSection(util.select().fromTo(0, 3 - i, 1, 0, 3 - i, 7), null); scene.idle(2); } scene.idle(4); for (int i = 0; i < 3; i++) - scene.world.modifyBlockEntity(util.grid.at(6, 6, 3 + i), RollerBlockEntity.class, + scene.world().modifyBlockEntity(util.grid().at(6, 6, 3 + i), RollerBlockEntity.class, rte -> rte.setAnimatedSpeed(0)); scene.idle(15); - scene.world.hideSection(util.select.fromTo(5, 1, 1, 0, 3, 7), Direction.SOUTH); - scene.world.hideIndependentSection(trainLink, Direction.UP); - scene.special.hideElement(birbLink, Direction.UP); + scene.world().hideSection(util.select().fromTo(5, 1, 1, 0, 3, 7), Direction.SOUTH); + scene.world().hideIndependentSection(trainLink, Direction.UP); + scene.special().hideElement(birbLink, Direction.UP); scene.idle(15); - scene.world.toggleControls(controlsPos); - scene.world.replaceBlocks(util.select.fromTo(5, 1, 3, 0, 3, 5), Blocks.COBBLESTONE.defaultBlockState(), false); + scene.world().toggleControls(controlsPos); + scene.world().replaceBlocks(util.select().fromTo(5, 1, 3, 0, 3, 5), Blocks.COBBLESTONE.defaultBlockState(), false); scene.idle(15); // 3 - scene.world.cycleBlockProperty(stationPos, StationBlock.ASSEMBLING); - scene.world.animateTrainStation(stationPos, true); - scene.world.showSection(util.select.fromTo(5, 1, 3, 0, 3, 5), Direction.NORTH); - birbLink = scene.special.createBirb(util.vector.centerOf(8, 7, 4), ParrotElement.FacePointOfInterestPose::new); - trainLink = scene.world.showIndependentSection(train, Direction.DOWN); + scene.world().cycleBlockProperty(stationPos, StationBlock.ASSEMBLING); + scene.world().animateTrainStation(stationPos, true); + scene.world().showSection(util.select().fromTo(5, 1, 3, 0, 3, 5), Direction.NORTH); + birbLink = scene.special().createBirb(util.vector().centerOf(8, 7, 4), ParrotElement.FacePointOfInterestPose::new); + trainLink = scene.world().showIndependentSection(train, Direction.DOWN); scene.idle(5); - scene.world.showSectionAndMerge(rollers, Direction.EAST, trainLink); + scene.world().showSectionAndMerge(rollers, Direction.EAST, trainLink); scene.idle(25); - scene.world.cycleBlockProperty(stationPos, StationBlock.ASSEMBLING); - scene.world.animateTrainStation(stationPos, false); - scene.world.toggleControls(controlsPos); + scene.world().cycleBlockProperty(stationPos, StationBlock.ASSEMBLING); + scene.world().animateTrainStation(stationPos, false); + scene.world().toggleControls(controlsPos); scene.idle(20); - scene.world.moveSection(trainLink, util.vector.of(-5.5, 0, 0), 110); - scene.special.moveParrot(birbLink, util.vector.of(-5.5, 0, 0), 110); - scene.world.animateBogey(bogeyPos, 5.5f, 110); + scene.world().moveSection(trainLink, util.vector().of(-5.5, 0, 0), 110); + scene.special().moveParrot(birbLink, util.vector().of(-5.5, 0, 0), 110); + scene.world().animateBogey(bogeyPos, 5.5f, 110); for (int i = 0; i < 3; i++) - scene.world.modifyBlockEntity(util.grid.at(6, 6, 3 + i), RollerBlockEntity.class, + scene.world().modifyBlockEntity(util.grid().at(6, 6, 3 + i), RollerBlockEntity.class, rte -> rte.setAnimatedSpeed(-100)); - scene.overlay.showText(110) + scene.overlay().showText(110) .attachKeyFrame() .independent() .text( @@ -516,7 +516,7 @@ public class RollerScenes { for (int j = 0; j < 5; j++) { for (int i = 0; i < 3; i++) { - scene.world.showSection(util.select.fromTo(5 - j, 3 - i, 1, 5 - j, 3 - i, 7), null); + scene.world().showSection(util.select().fromTo(5 - j, 3 - i, 1, 5 - j, 3 - i, 7), null); scene.idle(2); } @@ -524,7 +524,7 @@ public class RollerScenes { } for (int i = 0; i < 3; i++) { - scene.world.showSection(util.select.fromTo(0, 3 - i, 1, 0, 3 - i, 7), null); + scene.world().showSection(util.select().fromTo(0, 3 - i, 1, 0, 3 - i, 7), null); scene.idle(2); } @@ -533,7 +533,7 @@ public class RollerScenes { scene.idle(4); for (int i = 0; i < 3; i++) - scene.world.modifyBlockEntity(util.grid.at(6, 6, 3 + i), RollerBlockEntity.class, + scene.world().modifyBlockEntity(util.grid().at(6, 6, 3 + i), RollerBlockEntity.class, rte -> rte.setAnimatedSpeed(0)); } diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/SteamScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/SteamScenes.java index f468643781..f36d07cdff 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/SteamScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/SteamScenes.java @@ -12,10 +12,10 @@ import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Iterate; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; import net.createmod.ponder.foundation.ElementLink; import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.SceneBuilder; -import net.createmod.ponder.foundation.SceneBuildingUtil; import net.createmod.ponder.foundation.Selection; import net.createmod.ponder.foundation.element.InputWindowElement; import net.createmod.ponder.foundation.element.WorldSectionElement; @@ -35,159 +35,159 @@ public class SteamScenes { scene.configureBasePlate(0, 0, 5); scene.showBasePlate(); - Selection tank = util.select.fromTo(3, 1, 2, 3, 2, 2); - Selection boiler = util.select.fromTo(2, 2, 2, 2, 3, 2); - BlockPos leverPos = util.grid.at(1, 3, 2); - Selection lever = util.select.position(leverPos); - Selection whistleArea = util.select.fromTo(2, 3, 1, 2, 7, 1); - BlockPos whistlePos = util.grid.at(2, 3, 1); - Selection campfire = util.select.position(2, 1, 2); + Selection tank = util.select().fromTo(3, 1, 2, 3, 2, 2); + Selection boiler = util.select().fromTo(2, 2, 2, 2, 3, 2); + BlockPos leverPos = util.grid().at(1, 3, 2); + Selection lever = util.select().position(leverPos); + Selection whistleArea = util.select().fromTo(2, 3, 1, 2, 7, 1); + BlockPos whistlePos = util.grid().at(2, 3, 1); + Selection campfire = util.select().position(2, 1, 2); scene.idle(15); - ElementLink tankElement = scene.world.showIndependentSection(tank, Direction.DOWN); - scene.world.moveSection(tankElement, util.vector.of(-1, 0, 0), 0); + ElementLink tankElement = scene.world().showIndependentSection(tank, Direction.DOWN); + scene.world().moveSection(tankElement, util.vector().of(-1, 0, 0), 0); scene.idle(10); ElementLink whistleElement = - scene.world.showIndependentSection(whistleArea, Direction.SOUTH); - scene.world.moveSection(whistleElement, util.vector.of(0, -1, 0), 0); + scene.world().showIndependentSection(whistleArea, Direction.SOUTH); + scene.world().moveSection(whistleElement, util.vector().of(0, -1, 0), 0); scene.idle(15); - scene.world.moveSection(tankElement, util.vector.of(0, -1000, 0), 0); - scene.world.hideIndependentSection(tankElement, null); - ElementLink boilerElement = scene.world.showIndependentSectionImmediately(boiler); - scene.world.moveSection(boilerElement, util.vector.of(0, -1, 0), 0); - scene.effects.indicateSuccess(util.grid.at(2, 1, 2)); + scene.world().moveSection(tankElement, util.vector().of(0, -1000, 0), 0); + scene.world().hideIndependentSection(tankElement, null); + ElementLink boilerElement = scene.world().showIndependentSectionImmediately(boiler); + scene.world().moveSection(boilerElement, util.vector().of(0, -1, 0), 0); + scene.effects().indicateSuccess(util.grid().at(2, 1, 2)); scene.idle(25); - scene.overlay.showText(70) + scene.overlay().showText(70) .attachKeyFrame() .text("Steam Whistles can be placed on a Fluid Tank") - .pointAt(util.vector.blockSurface(util.grid.at(2, 2, 2), Direction.NORTH)) + .pointAt(util.vector().blockSurface(util.grid().at(2, 2, 2), Direction.NORTH)) .placeNearTarget(); scene.idle(60); - scene.world.moveSection(boilerElement, util.vector.of(0, 1, 0), 15); - scene.world.moveSection(whistleElement, util.vector.of(0, 1, 0), 15); + scene.world().moveSection(boilerElement, util.vector().of(0, 1, 0), 15); + scene.world().moveSection(whistleElement, util.vector().of(0, 1, 0), 15); scene.idle(10); - scene.world.showSection(campfire, Direction.NORTH); + scene.world().showSection(campfire, Direction.NORTH); scene.idle(15); - scene.overlay.showText(50) + scene.overlay().showText(50) .attachKeyFrame() .text("If the tank receives sufficient heat...") - .pointAt(util.vector.blockSurface(util.grid.at(2, 1, 2), Direction.WEST)) + .pointAt(util.vector().blockSurface(util.grid().at(2, 1, 2), Direction.WEST)) .placeNearTarget(); scene.idle(40); - scene.world.showSection(lever, Direction.DOWN); + scene.world().showSection(lever, Direction.DOWN); scene.idle(20); - scene.world.toggleRedstonePower(whistleArea); - scene.world.toggleRedstonePower(lever); - scene.effects.indicateRedstone(leverPos); + scene.world().toggleRedstonePower(whistleArea); + scene.world().toggleRedstonePower(lever); + scene.effects().indicateRedstone(leverPos); scene.idle(10); - scene.overlay.showText(70) + scene.overlay().showText(70) .attachKeyFrame() .text("...the Whistle will play a note when activated") - .pointAt(util.vector.blockSurface(util.grid.at(2, 3, 2), Direction.NORTH)) + .pointAt(util.vector().blockSurface(util.grid().at(2, 3, 2), Direction.NORTH)) .placeNearTarget(); scene.idle(10); - scene.world.toggleRedstonePower(whistleArea); - scene.world.toggleRedstonePower(lever); + scene.world().toggleRedstonePower(whistleArea); + scene.world().toggleRedstonePower(lever); scene.idle(20); - scene.world.toggleRedstonePower(whistleArea); - scene.world.toggleRedstonePower(lever); - scene.effects.indicateRedstone(leverPos); + scene.world().toggleRedstonePower(whistleArea); + scene.world().toggleRedstonePower(lever); + scene.effects().indicateRedstone(leverPos); scene.idle(20); - scene.world.toggleRedstonePower(whistleArea); - scene.world.toggleRedstonePower(lever); + scene.world().toggleRedstonePower(whistleArea); + scene.world().toggleRedstonePower(lever); scene.idle(40); InputWindowElement rightClick = - new InputWindowElement(util.vector.blockSurface(util.grid.at(2, 3, 1), Direction.EAST), Pointing.RIGHT) + new InputWindowElement(util.vector().blockSurface(util.grid().at(2, 3, 1), Direction.EAST), Pointing.RIGHT) .withItem(AllBlocks.STEAM_WHISTLE.asStack()) .rightClick(); - scene.overlay.showControls(rightClick, 50); + scene.overlay().showControls(rightClick, 50); scene.idle(6); BlockState extension = AllBlocks.STEAM_WHISTLE_EXTENSION.getDefaultState(); - scene.world.setBlock(whistlePos.above(), extension, false); + scene.world().setBlock(whistlePos.above(), extension, false); scene.idle(20); - scene.overlay.showText(70) + scene.overlay().showText(70) .attachKeyFrame() .text("Use a Whistle item on the block to lower its pitch") - .pointAt(util.vector.blockSurface(util.grid.at(2, 3, 2), Direction.NORTH)) + .pointAt(util.vector().blockSurface(util.grid().at(2, 3, 2), Direction.NORTH)) .placeNearTarget(); scene.idle(40); - scene.overlay.showControls(rightClick, 2); + scene.overlay().showControls(rightClick, 2); scene.idle(6); - scene.world.cycleBlockProperty(whistlePos.above(), WhistleExtenderBlock.SHAPE); + scene.world().cycleBlockProperty(whistlePos.above(), WhistleExtenderBlock.SHAPE); scene.idle(4); - scene.overlay.showControls(rightClick, 2); + scene.overlay().showControls(rightClick, 2); scene.idle(6); - scene.world.setBlock(whistlePos.above(2), extension, false); - scene.world.cycleBlockProperty(whistlePos.above(), WhistleExtenderBlock.SHAPE); + scene.world().setBlock(whistlePos.above(2), extension, false); + scene.world().cycleBlockProperty(whistlePos.above(), WhistleExtenderBlock.SHAPE); scene.idle(4); - scene.overlay.showControls(rightClick, 2); + scene.overlay().showControls(rightClick, 2); scene.idle(6); - scene.world.cycleBlockProperty(whistlePos.above(2), WhistleExtenderBlock.SHAPE); + scene.world().cycleBlockProperty(whistlePos.above(2), WhistleExtenderBlock.SHAPE); scene.idle(4); - scene.overlay.showControls(rightClick, 2); + scene.overlay().showControls(rightClick, 2); scene.idle(6); - scene.world.cycleBlockProperty(whistlePos.above(2), WhistleExtenderBlock.SHAPE); - scene.world.setBlock(whistlePos.above(3), extension, false); + scene.world().cycleBlockProperty(whistlePos.above(2), WhistleExtenderBlock.SHAPE); + scene.world().setBlock(whistlePos.above(3), extension, false); scene.idle(20); rightClick = - new InputWindowElement(util.vector.blockSurface(util.grid.at(2, 3, 1), Direction.EAST), Pointing.RIGHT) + new InputWindowElement(util.vector().blockSurface(util.grid().at(2, 3, 1), Direction.EAST), Pointing.RIGHT) .withItem(AllItems.WRENCH.asStack()) .rightClick(); - scene.overlay.showControls(rightClick, 50); + scene.overlay().showControls(rightClick, 50); scene.idle(6); for (int i = 0; i < 4; i++) { - scene.world.cycleBlockProperty(whistlePos.above(i), WhistleBlock.SIZE); + scene.world().cycleBlockProperty(whistlePos.above(i), WhistleBlock.SIZE); scene.idle(1); } scene.idle(20); - scene.overlay.showText(70) + scene.overlay().showText(70) .attachKeyFrame() .text("Cycle between three different octaves using a Wrench") - .pointAt(util.vector.blockSurface(util.grid.at(2, 3, 2), Direction.NORTH)) + .pointAt(util.vector().blockSurface(util.grid().at(2, 3, 2), Direction.NORTH)) .placeNearTarget(); scene.idle(40); - scene.overlay.showControls(rightClick, 4); + scene.overlay().showControls(rightClick, 4); scene.idle(6); for (int i = 0; i < 4; i++) { - scene.world.cycleBlockProperty(whistlePos.above(i), WhistleBlock.SIZE); + scene.world().cycleBlockProperty(whistlePos.above(i), WhistleBlock.SIZE); scene.idle(1); } scene.idle(20); - scene.world.toggleRedstonePower(whistleArea); - scene.world.toggleRedstonePower(lever); - scene.effects.indicateRedstone(leverPos); + scene.world().toggleRedstonePower(whistleArea); + scene.world().toggleRedstonePower(lever); + scene.effects().indicateRedstone(leverPos); scene.idle(20); - scene.world.toggleRedstonePower(whistleArea); - scene.world.toggleRedstonePower(lever); + scene.world().toggleRedstonePower(whistleArea); + scene.world().toggleRedstonePower(lever); scene.idle(20); - scene.overlay.showControls( - new InputWindowElement(util.vector.blockSurface(util.grid.at(2, 3, 1), Direction.DOWN), Pointing.UP) + scene.overlay().showControls( + new InputWindowElement(util.vector().blockSurface(util.grid().at(2, 3, 1), Direction.DOWN), Pointing.UP) .withItem(AllItems.GOGGLES.asStack()), 80); scene.idle(6); - scene.overlay.showText(70) + scene.overlay().showText(70) .attachKeyFrame() .colored(PonderPalette.BLUE) .text("Engineer's Goggles can help to find out the current pitch of a Whistle") - .pointAt(util.vector.blockSurface(util.grid.at(2, 3, 2), Direction.NORTH)) + .pointAt(util.vector().blockSurface(util.grid().at(2, 3, 2), Direction.NORTH)) .placeNearTarget(); scene.idle(40); } @@ -200,180 +200,180 @@ public class SteamScenes { scene.scaleSceneView(.9f); scene.showBasePlate(); - Selection fakeGround = util.select.fromTo(4, 0, 0, 2, 0, 0); + Selection fakeGround = util.select().fromTo(4, 0, 0, 2, 0, 0); ElementLink fakeGroundElement = - scene.world.showIndependentSection(fakeGround, Direction.UP); - scene.world.moveSection(fakeGroundElement, util.vector.of(1, 0, 1), 0); + scene.world().showIndependentSection(fakeGround, Direction.UP); + scene.world().moveSection(fakeGroundElement, util.vector().of(1, 0, 1), 0); - Selection campfires = util.select.fromTo(4, 1, 4, 5, 1, 3); - Selection burners = util.select.fromTo(3, 1, 3, 2, 1, 4); + Selection campfires = util.select().fromTo(4, 1, 4, 5, 1, 3); + Selection burners = util.select().fromTo(3, 1, 3, 2, 1, 4); - Selection tank = util.select.fromTo(4, 2, 3, 5, 2, 4); - Selection boiler1 = util.select.fromTo(5, 4, 2, 4, 4, 1); - Selection boiler2 = util.select.fromTo(5, 7, 6, 4, 4, 5); - Selection boiler3 = util.select.fromTo(5, 4, 3, 4, 11, 4); + Selection tank = util.select().fromTo(4, 2, 3, 5, 2, 4); + Selection boiler1 = util.select().fromTo(5, 4, 2, 4, 4, 1); + Selection boiler2 = util.select().fromTo(5, 7, 6, 4, 4, 5); + Selection boiler3 = util.select().fromTo(5, 4, 3, 4, 11, 4); - Selection engine = util.select.position(2, 2, 3); - Selection engine1 = util.select.fromTo(3, 4, 1, 2, 4, 1); - BlockPos engine1ShaftPos = util.grid.at(1, 4, 1); - Selection engine1Shaft = util.select.position(1, 4, 1); + Selection engine = util.select().position(2, 2, 3); + Selection engine1 = util.select().fromTo(3, 4, 1, 2, 4, 1); + BlockPos engine1ShaftPos = util.grid().at(1, 4, 1); + Selection engine1Shaft = util.select().position(1, 4, 1); - Selection pumpCogs = util.select.fromTo(6, 1, 7, 6, 1, 2); - Selection largeCog = util.select.position(5, 0, 7); + Selection pumpCogs = util.select().fromTo(6, 1, 7, 6, 1, 2); + Selection largeCog = util.select().position(5, 0, 7); - Selection pump1 = util.select.fromTo(5, 2, 2, 4, 1, 1); - Selection pump2 = util.select.fromTo(5, 2, 7, 4, 1, 6); - Selection pump3 = util.select.fromTo(2, 3, 7, 1, 1, 6); + Selection pump1 = util.select().fromTo(5, 2, 2, 4, 1, 1); + Selection pump2 = util.select().fromTo(5, 2, 7, 4, 1, 6); + Selection pump3 = util.select().fromTo(2, 3, 7, 1, 1, 6); - scene.world.modifyBlock(util.grid.at(4, 2, 7), s -> s.setValue(PumpBlock.FACING, Direction.SOUTH), false); - scene.world.modifyBlock(util.grid.at(1, 2, 7), s -> s.setValue(PumpBlock.FACING, Direction.SOUTH), false); - scene.world.modifyBlock(util.grid.at(2, 3, 7), s -> s.setValue(PumpBlock.FACING, Direction.SOUTH), false); + scene.world().modifyBlock(util.grid().at(4, 2, 7), s -> s.setValue(PumpBlock.FACING, Direction.SOUTH), false); + scene.world().modifyBlock(util.grid().at(1, 2, 7), s -> s.setValue(PumpBlock.FACING, Direction.SOUTH), false); + scene.world().modifyBlock(util.grid().at(2, 3, 7), s -> s.setValue(PumpBlock.FACING, Direction.SOUTH), false); scene.idle(15); - ElementLink tankElement = scene.world.showIndependentSection(tank, Direction.DOWN); - scene.world.moveSection(tankElement, util.vector.of(0, -1, 0), 0); + ElementLink tankElement = scene.world().showIndependentSection(tank, Direction.DOWN); + scene.world().moveSection(tankElement, util.vector().of(0, -1, 0), 0); scene.idle(10); - ElementLink engineElement = scene.world.showIndependentSection(engine, Direction.EAST); - scene.world.moveSection(engineElement, util.vector.of(1, -1, 0), 0); + ElementLink engineElement = scene.world().showIndependentSection(engine, Direction.EAST); + scene.world().moveSection(engineElement, util.vector().of(1, -1, 0), 0); scene.idle(15); - scene.world.moveSection(tankElement, util.vector.of(0, -1000, 0), 0); - scene.world.hideIndependentSection(tankElement, null); - ElementLink boilerElement = scene.world.showIndependentSectionImmediately(boiler1); - scene.world.moveSection(boilerElement, util.vector.of(0, -3, 2), 0); - scene.effects.indicateSuccess(util.grid.at(5, 1, 3)); - scene.effects.indicateSuccess(util.grid.at(4, 1, 3)); - scene.effects.indicateSuccess(util.grid.at(5, 1, 4)); - scene.effects.indicateSuccess(util.grid.at(4, 1, 4)); + scene.world().moveSection(tankElement, util.vector().of(0, -1000, 0), 0); + scene.world().hideIndependentSection(tankElement, null); + ElementLink boilerElement = scene.world().showIndependentSectionImmediately(boiler1); + scene.world().moveSection(boilerElement, util.vector().of(0, -3, 2), 0); + scene.effects().indicateSuccess(util.grid().at(5, 1, 3)); + scene.effects().indicateSuccess(util.grid().at(4, 1, 3)); + scene.effects().indicateSuccess(util.grid().at(5, 1, 4)); + scene.effects().indicateSuccess(util.grid().at(4, 1, 4)); scene.idle(25); - scene.overlay.showText(50) + scene.overlay().showText(50) .attachKeyFrame() .text("Steam Engines can be placed on a Fluid Tank") - .pointAt(util.vector.blockSurface(util.grid.at(3, 1, 3), Direction.WEST)) + .pointAt(util.vector().blockSurface(util.grid().at(3, 1, 3), Direction.WEST)) .placeNearTarget(); scene.idle(60); - scene.overlay.showControls( - new InputWindowElement(util.vector.blockSurface(util.grid.at(3, 1, 3), Direction.UP), Pointing.DOWN) + scene.overlay().showControls( + new InputWindowElement(util.vector().blockSurface(util.grid().at(3, 1, 3), Direction.UP), Pointing.DOWN) .withItem(AllBlocks.SHAFT.asStack()) .rightClick(), 60); scene.idle(10); - scene.world.setBlock(engine1ShaftPos, AllBlocks.SHAFT.getDefaultState() + scene.world().setBlock(engine1ShaftPos, AllBlocks.SHAFT.getDefaultState() .setValue(ShaftBlock.AXIS, Axis.Z), false); - ElementLink engineShaftElement = scene.world.showIndependentSection(engine1Shaft, null); - scene.world.moveSection(engineShaftElement, util.vector.of(0, -3, 2), 0); + ElementLink engineShaftElement = scene.world().showIndependentSection(engine1Shaft, null); + scene.world().moveSection(engineShaftElement, util.vector().of(0, -3, 2), 0); scene.idle(5); - scene.world.moveSection(engineElement, util.vector.of(0, -1000, 0), 0); - scene.world.hideIndependentSection(engineElement, null); - engineElement = scene.world.showIndependentSectionImmediately(engine1); - scene.world.moveSection(engineElement, util.vector.of(0, -3, 2), 0); - scene.world.setBlock(engine1ShaftPos, AllBlocks.POWERED_SHAFT.getDefaultState() + scene.world().moveSection(engineElement, util.vector().of(0, -1000, 0), 0); + scene.world().hideIndependentSection(engineElement, null); + engineElement = scene.world().showIndependentSectionImmediately(engine1); + scene.world().moveSection(engineElement, util.vector().of(0, -3, 2), 0); + scene.world().setBlock(engine1ShaftPos, AllBlocks.POWERED_SHAFT.getDefaultState() .setValue(ShaftBlock.AXIS, Axis.Z), false); - scene.effects.indicateSuccess(util.grid.at(1, 1, 3)); + scene.effects().indicateSuccess(util.grid().at(1, 1, 3)); scene.idle(40); - scene.overlay.showText(80) + scene.overlay().showText(80) .attachKeyFrame() .colored(PonderPalette.BLUE) .text("Clicking the engine with a Shaft creates the Kinetic Output") - .pointAt(util.vector.centerOf(util.grid.at(1, 1, 3))) + .pointAt(util.vector().centerOf(util.grid().at(1, 1, 3))) .placeNearTarget(); scene.idle(90); - scene.world.multiplyKineticSpeed(largeCog, -1); - scene.world.multiplyKineticSpeed(pumpCogs, -1); - scene.world.multiplyKineticSpeed(pump1, -1); - scene.world.multiplyKineticSpeed(pump2, -1); + scene.world().multiplyKineticSpeed(largeCog, -1); + scene.world().multiplyKineticSpeed(pumpCogs, -1); + scene.world().multiplyKineticSpeed(pump1, -1); + scene.world().multiplyKineticSpeed(pump2, -1); - scene.world.moveSection(boilerElement, util.vector.of(0, 1, 0), 15); - scene.world.moveSection(engineElement, util.vector.of(0, 1, 0), 15); - scene.world.moveSection(engineShaftElement, util.vector.of(0, 1, 0), 15); + scene.world().moveSection(boilerElement, util.vector().of(0, 1, 0), 15); + scene.world().moveSection(engineElement, util.vector().of(0, 1, 0), 15); + scene.world().moveSection(engineShaftElement, util.vector().of(0, 1, 0), 15); scene.idle(10); - scene.world.showSection(campfires, Direction.NORTH); + scene.world().showSection(campfires, Direction.NORTH); scene.idle(10); - scene.world.hideIndependentSection(fakeGroundElement, Direction.DOWN); - scene.world.showSection(largeCog, Direction.UP); + scene.world().hideIndependentSection(fakeGroundElement, Direction.DOWN); + scene.world().showSection(largeCog, Direction.UP); scene.idle(5); - scene.world.showSection(pump1, Direction.DOWN); + scene.world().showSection(pump1, Direction.DOWN); scene.idle(5); - scene.world.showSection(pumpCogs, Direction.WEST); + scene.world().showSection(pumpCogs, Direction.WEST); scene.idle(25); - scene.overlay.showText(60) + scene.overlay().showText(60) .attachKeyFrame() .text("With sufficient Heat, Water and Boiler space...") - .pointAt(util.vector.blockSurface(util.grid.at(4, 2, 4), Direction.UP)) + .pointAt(util.vector().blockSurface(util.grid().at(4, 2, 4), Direction.UP)) .placeNearTarget(); scene.idle(30); - scene.world.setKineticSpeed(engine1Shaft, 16); - scene.effects.createRedstoneParticles(util.grid.at(3, 2, 3), 0xFFFFFF, 10); + scene.world().setKineticSpeed(engine1Shaft, 16); + scene.effects().createRedstoneParticles(util.grid().at(3, 2, 3), 0xFFFFFF, 10); scene.idle(40); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("...they will generate Rotational Force") - .pointAt(util.vector.blockSurface(util.grid.at(1, 2, 3), Direction.NORTH)) + .pointAt(util.vector().blockSurface(util.grid().at(1, 2, 3), Direction.NORTH)) .placeNearTarget(); scene.idle(70); - scene.overlay.showSelectionWithText(util.select.fromTo(5, 2, 3, 4, 2, 4), 50) + scene.overlay().showSelectionWithText(util.select().fromTo(5, 2, 3, 4, 2, 4), 50) .attachKeyFrame() .text("The minimal setup requires 4 Fluid Tanks") - .pointAt(util.vector.blockSurface(util.grid.at(4, 2, 4), Direction.UP)) + .pointAt(util.vector().blockSurface(util.grid().at(4, 2, 4), Direction.UP)) .placeNearTarget(); scene.idle(60); - scene.world.hideSection(campfires, Direction.SOUTH); + scene.world().hideSection(campfires, Direction.SOUTH); scene.idle(15); - ElementLink burnersElement = scene.world.showIndependentSection(burners, Direction.SOUTH); - scene.world.moveSection(burnersElement, util.vector.of(2, 0, 0), 0); + ElementLink burnersElement = scene.world().showIndependentSection(burners, Direction.SOUTH); + scene.world().moveSection(burnersElement, util.vector().of(2, 0, 0), 0); scene.idle(25); - scene.overlay.showControls( - new InputWindowElement(util.vector.blockSurface(util.grid.at(4, 1, 3), Direction.EAST), Pointing.RIGHT) + scene.overlay().showControls( + new InputWindowElement(util.vector().blockSurface(util.grid().at(4, 1, 3), Direction.EAST), Pointing.RIGHT) .withItem(new ItemStack(Items.OAK_LOG)) .rightClick(), 60); scene.idle(10); - scene.world.setBlocks(burners, AllBlocks.BLAZE_BURNER.getDefaultState() + scene.world().setBlocks(burners, AllBlocks.BLAZE_BURNER.getDefaultState() .setValue(BlazeBurnerBlock.HEAT_LEVEL, HeatLevel.KINDLED), false); scene.idle(5); - scene.world.setKineticSpeed(engine1Shaft, 64); - scene.effects.createRedstoneParticles(util.grid.at(3, 2, 3), 0xFFFFFF, 10); + scene.world().setKineticSpeed(engine1Shaft, 64); + scene.effects().createRedstoneParticles(util.grid().at(3, 2, 3), 0xFFFFFF, 10); scene.idle(40); - scene.overlay.showText(80) + scene.overlay().showText(80) .text("With the help of Blaze Burners, the power output can be increased") .attachKeyFrame() - .pointAt(util.vector.blockSurface(util.grid.at(4, 1, 3), Direction.WEST)) + .pointAt(util.vector().blockSurface(util.grid().at(4, 1, 3), Direction.WEST)) .placeNearTarget(); scene.idle(90); - scene.world.hideSection(pump1, Direction.UP); + scene.world().hideSection(pump1, Direction.UP); scene.idle(5); - scene.world.hideIndependentSection(boilerElement, Direction.SOUTH); + scene.world().hideIndependentSection(boilerElement, Direction.SOUTH); scene.idle(10); - boilerElement = scene.world.showIndependentSection(boiler2, Direction.SOUTH); - scene.world.moveSection(boilerElement, util.vector.of(0, -2, -2), 0); + boilerElement = scene.world().showIndependentSection(boiler2, Direction.SOUTH); + scene.world().moveSection(boilerElement, util.vector().of(0, -2, -2), 0); scene.idle(10); - ElementLink pumpElement = scene.world.showIndependentSection(pump2, Direction.DOWN); - scene.world.moveSection(pumpElement, util.vector.of(0, 0, -5), 0); + ElementLink pumpElement = scene.world().showIndependentSection(pump2, Direction.DOWN); + scene.world().moveSection(pumpElement, util.vector().of(0, 0, -5), 0); scene.idle(20); - Vec3 target = util.vector.blockSurface(util.grid.at(4, 3, 3), Direction.WEST); - scene.overlay.showText(80) + Vec3 target = util.vector().blockSurface(util.grid().at(4, 3, 3), Direction.WEST); + scene.overlay().showText(80) .text("Higher power levels require more Water, Size and Heat") .attachKeyFrame() .pointAt(target) .placeNearTarget(); scene.idle(90); - scene.overlay.showControls( + scene.overlay().showControls( new InputWindowElement(target.add(0, 0, 0.5), Pointing.DOWN).withItem(AllItems.GOGGLES.asStack()), 60); scene.idle(6); - scene.overlay.showText(80) + scene.overlay().showText(80) .text("The boiler's current power level can be inspected with Engineer's Goggles") .attachKeyFrame() .colored(PonderPalette.BLUE) @@ -381,68 +381,68 @@ public class SteamScenes { .placeNearTarget(); scene.idle(90); - scene.world.showSectionAndMerge(util.select.fromTo(3, 4, 6, 1, 4, 6), Direction.EAST, boilerElement); + scene.world().showSectionAndMerge(util.select().fromTo(3, 4, 6, 1, 4, 6), Direction.EAST, boilerElement); scene.idle(5); - scene.world.setKineticSpeed(util.select.position(1, 4, 6), 64); - scene.world.showSectionAndMerge(util.select.fromTo(3, 5, 6, 1, 5, 6), Direction.EAST, boilerElement); + scene.world().setKineticSpeed(util.select().position(1, 4, 6), 64); + scene.world().showSectionAndMerge(util.select().fromTo(3, 5, 6, 1, 5, 6), Direction.EAST, boilerElement); scene.idle(5); - scene.world.setKineticSpeed(util.select.position(1, 5, 6), -64); - scene.world.showSectionAndMerge(util.select.fromTo(3, 5, 5, 1, 5, 5), Direction.EAST, boilerElement); + scene.world().setKineticSpeed(util.select().position(1, 5, 6), -64); + scene.world().showSectionAndMerge(util.select().fromTo(3, 5, 5, 1, 5, 5), Direction.EAST, boilerElement); scene.idle(5); - scene.world.setKineticSpeed(util.select.position(1, 5, 5), -64); - scene.world.showSectionAndMerge(util.select.fromTo(1, 4, 7, 1, 5, 7), Direction.NORTH, boilerElement); + scene.world().setKineticSpeed(util.select().position(1, 5, 5), -64); + scene.world().showSectionAndMerge(util.select().fromTo(1, 4, 7, 1, 5, 7), Direction.NORTH, boilerElement); scene.idle(5); - scene.world.setKineticSpeed(util.select.position(1, 5, 7), -64); - scene.world.setKineticSpeed(util.select.position(1, 4, 7), 64); + scene.world().setKineticSpeed(util.select().position(1, 5, 7), -64); + scene.world().setKineticSpeed(util.select().position(1, 4, 7), 64); scene.idle(20); - scene.overlay.showText(100) + scene.overlay().showText(100) .text("With each added power level, an additional Engine can output at full capacity") .attachKeyFrame() .colored(PonderPalette.GREEN) - .pointAt(util.vector.blockSurface(util.grid.at(1, 3, 3), Direction.NORTH)) + .pointAt(util.vector().blockSurface(util.grid().at(1, 3, 3), Direction.NORTH)) .placeNearTarget(); scene.idle(110); - scene.overlay.showText(30) + scene.overlay().showText(30) .text("Lvl 4") .colored(PonderPalette.BLUE) - .pointAt(util.vector.blockSurface(util.grid.at(4, 4, 4), Direction.WEST)) + .pointAt(util.vector().blockSurface(util.grid().at(4, 4, 4), Direction.WEST)) .placeNearTarget(); scene.idle(40); - scene.overlay.showSelectionWithText(util.select.fromTo(3, 2, 3, 3, 3, 4), 30) + scene.overlay().showSelectionWithText(util.select().fromTo(3, 2, 3, 3, 3, 4), 30) .text("4 Engines") .colored(PonderPalette.BLUE) - .pointAt(util.vector.blockSurface(util.grid.at(3, 3, 4), Direction.UP)) + .pointAt(util.vector().blockSurface(util.grid().at(3, 3, 4), Direction.UP)) .placeNearTarget(); scene.idle(30); - scene.world.hideIndependentSection(pumpElement, Direction.UP); + scene.world().hideIndependentSection(pumpElement, Direction.UP); scene.idle(5); - scene.world.hideIndependentSection(boilerElement, Direction.SOUTH); - scene.world.hideIndependentSection(engineElement, Direction.SOUTH); - scene.world.hideIndependentSection(engineShaftElement, Direction.SOUTH); + scene.world().hideIndependentSection(boilerElement, Direction.SOUTH); + scene.world().hideIndependentSection(engineElement, Direction.SOUTH); + scene.world().hideIndependentSection(engineShaftElement, Direction.SOUTH); scene.idle(20); - scene.overlay.showControls( - new InputWindowElement(util.vector.of(5, 2, 4), Pointing.DOWN).withItem(AllItems.BLAZE_CAKE.asStack()) + scene.overlay().showControls( + new InputWindowElement(util.vector().of(5, 2, 4), Pointing.DOWN).withItem(AllItems.BLAZE_CAKE.asStack()) .rightClick(), 10); scene.idle(6); - scene.world.setBlocks(burners, AllBlocks.BLAZE_BURNER.getDefaultState() + scene.world().setBlocks(burners, AllBlocks.BLAZE_BURNER.getDefaultState() .setValue(BlazeBurnerBlock.HEAT_LEVEL, HeatLevel.SEETHING), false); scene.idle(15); - boilerElement = scene.world.showIndependentSection(boiler3, Direction.SOUTH); - scene.world.moveSection(boilerElement, util.vector.of(0, -2, 0), 0); + boilerElement = scene.world().showIndependentSection(boiler3, Direction.SOUTH); + scene.world().moveSection(boilerElement, util.vector().of(0, -2, 0), 0); scene.idle(10); - pumpElement = scene.world.showIndependentSection(pump3, Direction.DOWN); - scene.world.moveSection(pumpElement, util.vector.of(3, 0, -5), 0); + pumpElement = scene.world().showIndependentSection(pump3, Direction.DOWN); + scene.world().moveSection(pumpElement, util.vector().of(3, 0, -5), 0); scene.idle(20); ElementLink cogsElement = - scene.world.showIndependentSection(util.select.position(1, 1, 7), Direction.NORTH); - scene.world.moveSection(cogsElement, util.vector.of(0, -2, -2), 0); + scene.world().showIndependentSection(util.select().position(1, 1, 7), Direction.NORTH); + scene.world().moveSection(cogsElement, util.vector().of(0, -2, -2), 0); Selection previous = null; boolean previousForward = false; @@ -451,29 +451,29 @@ public class SteamScenes { for (boolean left : Iterate.trueAndFalse) { int z = (left ^ y % 2 == 0) ? 3 : 4; if (previous != null) - scene.world.setKineticSpeed(previous, previousForward ? 64 : -64); - scene.world.showSectionAndMerge(previous = util.select.fromTo(3, y, z, 1, y, z), Direction.EAST, - boilerElement); + scene.world().setKineticSpeed(previous, previousForward ? 64 : -64); + scene.world().showSectionAndMerge(previous = util.select().fromTo(3, y, z, 1, y, z), Direction.EAST, + boilerElement); previousForward = y % 2 == 0; scene.idle(5); } - scene.world.showSectionAndMerge(util.select.position(1, y, 7), Direction.NORTH, cogsElement); - scene.world.setKineticSpeed(util.select.position(1, y, 7), y % 2 == 0 ? 64 : -64); + scene.world().showSectionAndMerge(util.select().position(1, y, 7), Direction.NORTH, cogsElement); + scene.world().setKineticSpeed(util.select().position(1, y, 7), y % 2 == 0 ? 64 : -64); } - scene.world.setKineticSpeed(previous, 64); + scene.world().setKineticSpeed(previous, 64); - scene.overlay.showText(30) + scene.overlay().showText(30) .text("Lvl 8") .colored(PonderPalette.BLUE) - .pointAt(util.vector.blockSurface(util.grid.at(4, 4, 3), Direction.NORTH)) + .pointAt(util.vector().blockSurface(util.grid().at(4, 4, 3), Direction.NORTH)) .placeNearTarget(); scene.idle(40); - scene.overlay.showSelectionWithText(util.select.fromTo(3, 2, 3, 3, 6, 4), 30) + scene.overlay().showSelectionWithText(util.select().fromTo(3, 2, 3, 3, 6, 4), 30) .text("8 Engines") .colored(PonderPalette.BLUE) - .pointAt(util.vector.blockSurface(util.grid.at(3, 3, 4), Direction.UP)) + .pointAt(util.vector().blockSurface(util.grid().at(3, 3, 4), Direction.UP)) .placeNearTarget(); scene.idle(30); diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/TemplateScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/TemplateScenes.java index 3f31b27113..4aece366d2 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/TemplateScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/TemplateScenes.java @@ -2,8 +2,8 @@ package com.simibubi.create.infrastructure.ponder.scenes; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; -import net.createmod.ponder.foundation.SceneBuilder; -import net.createmod.ponder.foundation.SceneBuildingUtil; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; import net.minecraft.core.Direction; public class TemplateScenes { @@ -12,9 +12,9 @@ public class TemplateScenes { CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("", ""); scene.configureBasePlate(0, 0, 5); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); scene.idle(5); - scene.world.showSection(util.select.layersFrom(1), Direction.DOWN); + scene.world().showSection(util.select().layersFrom(1), Direction.DOWN); } } diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/TunnelScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/TunnelScenes.java index 1dd7d69799..ff4e27581a 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/TunnelScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/TunnelScenes.java @@ -15,10 +15,10 @@ import net.createmod.catnip.utility.Iterate; import net.createmod.catnip.utility.NBTHelper; import net.createmod.catnip.utility.Pointing; import net.createmod.catnip.utility.VecHelper; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; import net.createmod.ponder.foundation.ElementLink; import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.SceneBuilder; -import net.createmod.ponder.foundation.SceneBuildingUtil; import net.createmod.ponder.foundation.element.InputWindowElement; import net.createmod.ponder.foundation.element.WorldSectionElement; import net.minecraft.core.BlockPos; @@ -38,132 +38,132 @@ public class TunnelScenes { scene.title("andesite_tunnel", "Using Andesite Tunnels"); scene.configureBasePlate(0, 0, 5); - scene.world.cycleBlockProperty(util.grid.at(2, 1, 2), BeltBlock.CASING); + scene.world().cycleBlockProperty(util.grid().at(2, 1, 2), BeltBlock.CASING); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); scene.idle(5); - scene.world.showSection(util.select.fromTo(4, 1, 5, 4, 1, 3), Direction.DOWN); + scene.world().showSection(util.select().fromTo(4, 1, 5, 4, 1, 3), Direction.DOWN); scene.idle(5); - scene.world.showSection(util.select.fromTo(4, 1, 2, 0, 1, 2), Direction.SOUTH); + scene.world().showSection(util.select().fromTo(4, 1, 2, 0, 1, 2), Direction.SOUTH); scene.idle(10); Vector> tunnels = new Vector<>(3); for (int i = 0; i < 3; i++) { - tunnels.add(scene.world.showIndependentSection(util.select.position(1 + i, 2, 4), Direction.DOWN)); - scene.world.moveSection(tunnels.get(i), util.vector.of(0, 0, -2), 0); + tunnels.add(scene.world().showIndependentSection(util.select().position(1 + i, 2, 4), Direction.DOWN)); + scene.world().moveSection(tunnels.get(i), util.vector().of(0, 0, -2), 0); scene.idle(4); } for (int i = 0; i < 3; i++) { - scene.world.cycleBlockProperty(util.grid.at(1 + i, 1, 2), BeltBlock.CASING); - scene.world.modifyBlockEntityNBT(util.select.position(1 + i, 1, 2), BeltBlockEntity.class, + scene.world().cycleBlockProperty(util.grid().at(1 + i, 1, 2), BeltBlock.CASING); + scene.world().modifyBlockEntityNBT(util.select().position(1 + i, 1, 2), BeltBlockEntity.class, nbt -> NBTHelper.writeEnum(nbt, "Casing", BeltBlockEntity.CasingType.ANDESITE), true); scene.idle(4); } - scene.overlay.showText(60) + scene.overlay().showText(60) .attachKeyFrame() - .pointAt(util.vector.topOf(util.grid.at(1, 2, 2))) + .pointAt(util.vector().topOf(util.grid().at(1, 2, 2))) .placeNearTarget() .text("Andesite Tunnels can be used to cover up your belts"); scene.idle(70); for (int i = 0; i < 3; i++) { - scene.world.cycleBlockProperty(util.grid.at(1 + i, 1, 2), BeltBlock.CASING); - scene.world.hideIndependentSection(tunnels.get(i), Direction.UP); + scene.world().cycleBlockProperty(util.grid().at(1 + i, 1, 2), BeltBlock.CASING); + scene.world().hideIndependentSection(tunnels.get(i), Direction.UP); scene.idle(4); } scene.idle(10); - scene.world.showSection(util.select.fromTo(2, 1, 0, 0, 1, 1), Direction.SOUTH); + scene.world().showSection(util.select().fromTo(2, 1, 0, 0, 1, 1), Direction.SOUTH); scene.idle(10); - scene.world.showSection(util.select.position(2, 2, 2), Direction.DOWN); + scene.world().showSection(util.select().position(2, 2, 2), Direction.DOWN); scene.idle(10); - scene.world.cycleBlockProperty(util.grid.at(2, 1, 2), BeltBlock.CASING); + scene.world().cycleBlockProperty(util.grid().at(2, 1, 2), BeltBlock.CASING); - scene.overlay.showText(60) + scene.overlay().showText(60) .attachKeyFrame() - .pointAt(util.vector.blockSurface(util.grid.at(2, 2, 2), Direction.NORTH)) + .pointAt(util.vector().blockSurface(util.grid().at(2, 2, 2), Direction.NORTH)) .placeNearTarget() .text("Whenever an Andesite Tunnel has connections to the sides..."); scene.idle(70); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(util.grid.at(4, 1, 2)), Pointing.DOWN) + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(util.grid().at(4, 1, 2)), Pointing.DOWN) .withItem(new ItemStack(Items.COPPER_INGOT)), 20); scene.idle(7); - scene.world.createItemOnBelt(util.grid.at(4, 1, 2), Direction.UP, new ItemStack(Items.COPPER_INGOT, 64)); + scene.world().createItemOnBelt(util.grid().at(4, 1, 2), Direction.UP, new ItemStack(Items.COPPER_INGOT, 64)); scene.idle(40); - scene.world.multiplyKineticSpeed(util.select.everywhere(), 1 / 16f); - scene.overlay.showText(80) + scene.world().multiplyKineticSpeed(util.select().everywhere(), 1 / 16f); + scene.overlay().showText(80) .attachKeyFrame() .text("...they will split exactly one item off of any passing stacks") - .pointAt(util.vector.blockSurface(util.grid.at(2, 1, 0), Direction.WEST)) + .pointAt(util.vector().blockSurface(util.grid().at(2, 1, 0), Direction.WEST)) .placeNearTarget(); scene.idle(90); - scene.overlay.showText(80) + scene.overlay().showText(80) .text("The remainder will continue on its path") - .pointAt(util.vector.blockSurface(util.grid.at(0, 1, 2), Direction.UP)) + .pointAt(util.vector().blockSurface(util.grid().at(0, 1, 2), Direction.UP)) .placeNearTarget(); scene.idle(90); - scene.world.multiplyKineticSpeed(util.select.everywhere(), 16f); + scene.world().multiplyKineticSpeed(util.select().everywhere(), 16f); } public static void brass(SceneBuilder builder, SceneBuildingUtil util) { CreateSceneBuilder scene = new CreateSceneBuilder(builder); scene.title("brass_tunnel", "Using Brass Tunnels"); scene.configureBasePlate(1, 0, 5); - scene.world.cycleBlockProperty(util.grid.at(3, 1, 2), BeltBlock.CASING); + scene.world().cycleBlockProperty(util.grid().at(3, 1, 2), BeltBlock.CASING); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().showSection(util.select().layer(0), Direction.UP); scene.idle(5); - scene.world.showSection(util.select.fromTo(5, 1, 5, 5, 1, 3), Direction.DOWN); + scene.world().showSection(util.select().fromTo(5, 1, 5, 5, 1, 3), Direction.DOWN); scene.idle(5); - scene.world.showSection(util.select.fromTo(5, 1, 2, 1, 1, 2), Direction.SOUTH); + scene.world().showSection(util.select().fromTo(5, 1, 2, 1, 1, 2), Direction.SOUTH); scene.idle(10); Vector> tunnels = new Vector<>(3); for (int i = 0; i < 3; i++) { - tunnels.add(scene.world.showIndependentSection(util.select.position(2 + i, 2, 4), Direction.DOWN)); - scene.world.moveSection(tunnels.get(i), util.vector.of(0, 0, -2), 0); + tunnels.add(scene.world().showIndependentSection(util.select().position(2 + i, 2, 4), Direction.DOWN)); + scene.world().moveSection(tunnels.get(i), util.vector().of(0, 0, -2), 0); scene.idle(4); } for (int i = 0; i < 3; i++) { - scene.world.cycleBlockProperty(util.grid.at(2 + i, 1, 2), BeltBlock.CASING); - scene.world.modifyBlockEntityNBT(util.select.position(2 + i, 1, 2), BeltBlockEntity.class, + scene.world().cycleBlockProperty(util.grid().at(2 + i, 1, 2), BeltBlock.CASING); + scene.world().modifyBlockEntityNBT(util.select().position(2 + i, 1, 2), BeltBlockEntity.class, nbt -> NBTHelper.writeEnum(nbt, "Casing", BeltBlockEntity.CasingType.BRASS), true); scene.idle(4); } - scene.overlay.showText(60) + scene.overlay().showText(60) .attachKeyFrame() - .pointAt(util.vector.topOf(util.grid.at(2, 2, 2))) + .pointAt(util.vector().topOf(util.grid().at(2, 2, 2))) .placeNearTarget() .text("Brass Tunnels can be used to cover up your belts"); scene.idle(70); for (int i = 0; i < 3; i++) { - scene.world.cycleBlockProperty(util.grid.at(2 + i, 1, 2), BeltBlock.CASING); - scene.world.hideIndependentSection(tunnels.get(i), Direction.UP); + scene.world().cycleBlockProperty(util.grid().at(2 + i, 1, 2), BeltBlock.CASING); + scene.world().hideIndependentSection(tunnels.get(i), Direction.UP); scene.idle(4); } scene.idle(10); - scene.world.showSection(util.select.fromTo(3, 1, 0, 1, 1, 1), Direction.SOUTH); + scene.world().showSection(util.select().fromTo(3, 1, 0, 1, 1, 1), Direction.SOUTH); scene.idle(10); - scene.world.showSection(util.select.position(3, 2, 2), Direction.DOWN); + scene.world().showSection(util.select().position(3, 2, 2), Direction.DOWN); scene.idle(10); - scene.world.cycleBlockProperty(util.grid.at(3, 1, 2), BeltBlock.CASING); + scene.world().cycleBlockProperty(util.grid().at(3, 1, 2), BeltBlock.CASING); scene.idle(10); - BlockPos tunnelPos = util.grid.at(3, 2, 2); + BlockPos tunnelPos = util.grid().at(3, 2, 2); for (Direction d : Iterate.horizontalDirections) { if (d == Direction.SOUTH) continue; Vec3 filter = getTunnelFilterVec(tunnelPos, d); - scene.overlay.showFilterSlotInput(filter, d, 40); + scene.overlay().showFilterSlotInput(filter, d, 40); scene.idle(3); } - scene.overlay.showText(60) + scene.overlay().showText(60) .attachKeyFrame() .pointAt(getTunnelFilterVec(tunnelPos, Direction.WEST)) .placeNearTarget() @@ -174,64 +174,64 @@ public class TunnelScenes { scene.idle(20); Vec3 tunnelFilterVec = getTunnelFilterVec(tunnelPos, Direction.EAST); - scene.overlay.showFilterSlotInput(tunnelFilterVec, Direction.EAST, 10); - scene.overlay.showText(60) + scene.overlay().showFilterSlotInput(tunnelFilterVec, Direction.EAST, 10); + scene.overlay().showText(60) .attachKeyFrame() .pointAt(tunnelFilterVec) .placeNearTarget() .text("Filters on inbound connections simply block non-matching items"); ItemStack copper = new ItemStack(Items.COPPER_INGOT); Class tunnelClass = BrassTunnelBlockEntity.class; - scene.world.modifyBlockEntity(tunnelPos, tunnelClass, be -> be.getBehaviour(SidedFilteringBehaviour.TYPE) + scene.world().modifyBlockEntity(tunnelPos, tunnelClass, be -> be.getBehaviour(SidedFilteringBehaviour.TYPE) .setFilter(Direction.EAST, copper)); - scene.overlay.showControls(new InputWindowElement(tunnelFilterVec, Pointing.DOWN).withItem(copper), 30); + scene.overlay().showControls(new InputWindowElement(tunnelFilterVec, Pointing.DOWN).withItem(copper), 30); ItemStack zinc = AllItems.ZINC_INGOT.asStack(); - scene.world.createItemOnBelt(util.grid.at(5, 1, 2), Direction.EAST, zinc); + scene.world().createItemOnBelt(util.grid().at(5, 1, 2), Direction.EAST, zinc); scene.idle(70); - scene.world.multiplyKineticSpeed(util.select.everywhere(), -2); + scene.world().multiplyKineticSpeed(util.select().everywhere(), -2); scene.idle(20); scene.rotateCameraY(-70); - scene.world.multiplyKineticSpeed(util.select.everywhere(), -.5f); + scene.world().multiplyKineticSpeed(util.select().everywhere(), -.5f); scene.idle(20); - scene.world.modifyBlockEntity(tunnelPos, tunnelClass, be -> be.getBehaviour(SidedFilteringBehaviour.TYPE) + scene.world().modifyBlockEntity(tunnelPos, tunnelClass, be -> be.getBehaviour(SidedFilteringBehaviour.TYPE) .setFilter(Direction.EAST, ItemStack.EMPTY)); tunnelFilterVec = getTunnelFilterVec(tunnelPos, Direction.NORTH); - scene.overlay.showFilterSlotInput(tunnelFilterVec, Direction.NORTH, 40); + scene.overlay().showFilterSlotInput(tunnelFilterVec, Direction.NORTH, 40); tunnelFilterVec = getTunnelFilterVec(tunnelPos, Direction.WEST); - scene.overlay.showFilterSlotInput(tunnelFilterVec, Direction.WEST, 40); - scene.overlay.showText(60) + scene.overlay().showFilterSlotInput(tunnelFilterVec, Direction.WEST, 40); + scene.overlay().showText(60) .attachKeyFrame() .pointAt(tunnelFilterVec) .placeNearTarget() .text("Filters on outbound connections can be used to sort items by type"); scene.idle(70); - scene.overlay.showControls(new InputWindowElement(tunnelFilterVec, Pointing.LEFT).withItem(copper), 30); - scene.world.modifyBlockEntity(tunnelPos, tunnelClass, be -> be.getBehaviour(SidedFilteringBehaviour.TYPE) + scene.overlay().showControls(new InputWindowElement(tunnelFilterVec, Pointing.LEFT).withItem(copper), 30); + scene.world().modifyBlockEntity(tunnelPos, tunnelClass, be -> be.getBehaviour(SidedFilteringBehaviour.TYPE) .setFilter(Direction.WEST, copper)); scene.idle(4); tunnelFilterVec = getTunnelFilterVec(tunnelPos, Direction.NORTH); - scene.overlay.showControls(new InputWindowElement(tunnelFilterVec, Pointing.RIGHT).withItem(zinc), 30); - scene.world.modifyBlockEntity(tunnelPos, tunnelClass, be -> be.getBehaviour(SidedFilteringBehaviour.TYPE) + scene.overlay().showControls(new InputWindowElement(tunnelFilterVec, Pointing.RIGHT).withItem(zinc), 30); + scene.world().modifyBlockEntity(tunnelPos, tunnelClass, be -> be.getBehaviour(SidedFilteringBehaviour.TYPE) .setFilter(Direction.NORTH, zinc)); - scene.world.multiplyKineticSpeed(util.select.everywhere(), 1.5f); + scene.world().multiplyKineticSpeed(util.select().everywhere(), 1.5f); for (int i = 0; i < 6; i++) { - scene.world.createItemOnBelt(util.grid.at(5, 1, 2), Direction.EAST, i % 2 == 0 ? zinc : copper); + scene.world().createItemOnBelt(util.grid().at(5, 1, 2), Direction.EAST, i % 2 == 0 ? zinc : copper); scene.idle(12); } scene.idle(30); - scene.world.modifyBlockEntity(tunnelPos, tunnelClass, be -> be.getBehaviour(SidedFilteringBehaviour.TYPE) + scene.world().modifyBlockEntity(tunnelPos, tunnelClass, be -> be.getBehaviour(SidedFilteringBehaviour.TYPE) .setFilter(Direction.NORTH, ItemStack.EMPTY)); - scene.world.modifyBlockEntity(tunnelPos, tunnelClass, be -> be.getBehaviour(SidedFilteringBehaviour.TYPE) + scene.world().modifyBlockEntity(tunnelPos, tunnelClass, be -> be.getBehaviour(SidedFilteringBehaviour.TYPE) .setFilter(Direction.WEST, ItemStack.EMPTY)); scene.idle(10); - Vec3 tunnelTop = util.vector.topOf(tunnelPos); - scene.overlay.showCenteredScrollInput(tunnelPos, Direction.UP, 120); - scene.overlay.showText(120) + Vec3 tunnelTop = util.vector().topOf(tunnelPos); + scene.overlay().showCenteredScrollInput(tunnelPos, Direction.UP, 120); + scene.overlay().showText(120) .attachKeyFrame() .pointAt(tunnelTop) .placeNearTarget() @@ -239,26 +239,26 @@ public class TunnelScenes { "Whenever a passing item has multiple valid exits, the distribution mode will decide how to handle it"); for (int i = 0; i < 3; i++) { scene.idle(40); - scene.world.createItemOnBelt(util.grid.at(5, 1, 2), Direction.EAST, AllItems.BRASS_INGOT.asStack(63)); + scene.world().createItemOnBelt(util.grid().at(5, 1, 2), Direction.EAST, AllItems.BRASS_INGOT.asStack(63)); } scene.idle(30); - scene.world.hideSection(util.select.position(3, 2, 2), Direction.UP); + scene.world().hideSection(util.select().position(3, 2, 2), Direction.UP); scene.idle(5); - scene.world.hideSection(util.select.fromTo(5, 1, 2, 1, 1, 0), Direction.UP); + scene.world().hideSection(util.select().fromTo(5, 1, 2, 1, 1, 0), Direction.UP); scene.idle(15); ElementLink newBelt = - scene.world.showIndependentSection(util.select.fromTo(3, 3, 2, 0, 3, 4) - .add(util.select.fromTo(5, 3, 3, 4, 3, 3)), Direction.DOWN); - scene.world.moveSection(newBelt, util.vector.of(0, -2, -1), 0); + scene.world().showIndependentSection(util.select().fromTo(3, 3, 2, 0, 3, 4) + .add(util.select().fromTo(5, 3, 3, 4, 3, 3)), Direction.DOWN); + scene.world().moveSection(newBelt, util.vector().of(0, -2, -1), 0); scene.idle(15); for (int i = 0; i < 3; i++) { scene.idle(4); - scene.world.showSectionAndMerge(util.select.position(3, 4, 2 + i), Direction.DOWN, newBelt); + scene.world().showSectionAndMerge(util.select().position(3, 4, 2 + i), Direction.DOWN, newBelt); } - scene.overlay.showSelectionWithText(util.select.fromTo(3, 1, 1, 3, 2, 3), 80) + scene.overlay().showSelectionWithText(util.select().fromTo(3, 1, 1, 3, 2, 3), 80) .attachKeyFrame() .placeNearTarget() .text("Brass Tunnels on parallel belts will form a group"); @@ -271,69 +271,69 @@ public class TunnelScenes { tunnelFilterVec = getTunnelFilterVec(tunnelPos, Direction.WEST); BlockPos newTunnelPos = tunnelPos.above(2) .south(); - scene.overlay + scene.overlay() .showControls(new InputWindowElement(tunnelFilterVec.add(0, 0, -1), Pointing.RIGHT).withItem(item1), 20); - scene.world.modifyBlockEntity(newTunnelPos.north(), tunnelClass, + scene.world().modifyBlockEntity(newTunnelPos.north(), tunnelClass, be -> be.getBehaviour(SidedFilteringBehaviour.TYPE) .setFilter(Direction.WEST, item1)); scene.idle(4); - scene.overlay.showControls(new InputWindowElement(tunnelFilterVec, Pointing.DOWN).withItem(item2), 20); - scene.world.modifyBlockEntity(newTunnelPos, tunnelClass, be -> be.getBehaviour(SidedFilteringBehaviour.TYPE) + scene.overlay().showControls(new InputWindowElement(tunnelFilterVec, Pointing.DOWN).withItem(item2), 20); + scene.world().modifyBlockEntity(newTunnelPos, tunnelClass, be -> be.getBehaviour(SidedFilteringBehaviour.TYPE) .setFilter(Direction.WEST, item2)); scene.idle(4); - scene.overlay.showControls(new InputWindowElement(tunnelFilterVec.add(0, 0, 1), Pointing.LEFT).withItem(item3), - 20); - scene.world.modifyBlockEntity(newTunnelPos.south(), tunnelClass, + scene.overlay().showControls(new InputWindowElement(tunnelFilterVec.add(0, 0, 1), Pointing.LEFT).withItem(item3), + 20); + scene.world().modifyBlockEntity(newTunnelPos.south(), tunnelClass, be -> be.getBehaviour(SidedFilteringBehaviour.TYPE) .setFilter(Direction.WEST, item3)); scene.idle(30); - scene.overlay.showText(80) + scene.overlay().showText(80) .pointAt(tunnelTop) .placeNearTarget() .text("Incoming Items will now be distributed across all connected exits"); scene.idle(90); - BlockPos beltPos = util.grid.at(5, 3, 3); - Vec3 m = util.vector.of(0, 0.1, 0); - Vec3 spawn = util.vector.centerOf(util.grid.at(5, 3, 2)); - scene.world.createItemEntity(spawn, m, item1); + BlockPos beltPos = util.grid().at(5, 3, 3); + Vec3 m = util.vector().of(0, 0.1, 0); + Vec3 spawn = util.vector().centerOf(util.grid().at(5, 3, 2)); + scene.world().createItemEntity(spawn, m, item1); scene.idle(12); - scene.world.createItemOnBelt(beltPos, Direction.UP, item1); - scene.world.modifyEntities(ItemEntity.class, Entity::discard); - scene.world.createItemEntity(spawn, m, item2); + scene.world().createItemOnBelt(beltPos, Direction.UP, item1); + scene.world().modifyEntities(ItemEntity.class, Entity::discard); + scene.world().createItemEntity(spawn, m, item2); scene.idle(12); - scene.world.createItemOnBelt(beltPos, Direction.UP, item2); - scene.world.modifyEntities(ItemEntity.class, Entity::discard); - scene.world.createItemEntity(spawn, m, item3); + scene.world().createItemOnBelt(beltPos, Direction.UP, item2); + scene.world().modifyEntities(ItemEntity.class, Entity::discard); + scene.world().createItemEntity(spawn, m, item3); scene.idle(12); - scene.world.createItemOnBelt(beltPos, Direction.UP, item3); - scene.world.modifyEntities(ItemEntity.class, Entity::discard); + scene.world().createItemOnBelt(beltPos, Direction.UP, item3); + scene.world().modifyEntities(ItemEntity.class, Entity::discard); scene.idle(50); - scene.world.showSectionAndMerge(util.select.position(3, 5, 2), Direction.DOWN, newBelt); + scene.world().showSectionAndMerge(util.select().position(3, 5, 2), Direction.DOWN, newBelt); - scene.overlay.showText(80) - .pointAt(util.vector.blockSurface(tunnelPos.above() + scene.overlay().showText(80) + .pointAt(util.vector().blockSurface(tunnelPos.above() .north(), Direction.WEST)) .placeNearTarget() .text("For this, items can also be inserted into the Tunnel block directly"); scene.idle(20); - beltPos = util.grid.at(3, 3, 3); - spawn = util.vector.centerOf(util.grid.at(3, 5, 1)); - scene.world.createItemEntity(spawn, m, item1); + beltPos = util.grid().at(3, 3, 3); + spawn = util.vector().centerOf(util.grid().at(3, 5, 1)); + scene.world().createItemEntity(spawn, m, item1); scene.idle(12); - scene.world.createItemOnBelt(beltPos, Direction.EAST, item1); - scene.world.modifyEntities(ItemEntity.class, Entity::discard); - scene.world.createItemEntity(spawn, m, item2); + scene.world().createItemOnBelt(beltPos, Direction.EAST, item1); + scene.world().modifyEntities(ItemEntity.class, Entity::discard); + scene.world().createItemEntity(spawn, m, item2); scene.idle(12); - scene.world.createItemOnBelt(beltPos, Direction.EAST, item2); - scene.world.modifyEntities(ItemEntity.class, Entity::discard); - scene.world.createItemEntity(spawn, m, item3); + scene.world().createItemOnBelt(beltPos, Direction.EAST, item2); + scene.world().modifyEntities(ItemEntity.class, Entity::discard); + scene.world().createItemEntity(spawn, m, item3); scene.idle(12); - scene.world.createItemOnBelt(beltPos, Direction.EAST, item3); - scene.world.modifyEntities(ItemEntity.class, Entity::discard); + scene.world().createItemOnBelt(beltPos, Direction.EAST, item3); + scene.world().modifyEntities(ItemEntity.class, Entity::discard); scene.idle(30); } @@ -350,22 +350,22 @@ public class TunnelScenes { scene.title("brass_tunnel_modes", "Distribution Modes of the Brass Tunnel"); scene.configureBasePlate(0, 1, 5); BlockState barrier = Blocks.BARRIER.defaultBlockState(); - scene.world.setBlock(util.grid.at(1, 1, 0), barrier, false); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world().setBlock(util.grid().at(1, 1, 0), barrier, false); + scene.world().showSection(util.select().layer(0), Direction.UP); scene.idle(5); - scene.world.showSection(util.select.fromTo(1, 1, 1, 5, 1, 5) - .add(util.select.fromTo(3, 2, 5, 1, 2, 5)), Direction.DOWN); + scene.world().showSection(util.select().fromTo(1, 1, 1, 5, 1, 5) + .add(util.select().fromTo(3, 2, 5, 1, 2, 5)), Direction.DOWN); scene.idle(10); for (int i = 0; i < 3; i++) { - scene.world.showSection(util.select.position(3 - i, 2, 3), Direction.DOWN); + scene.world().showSection(util.select().position(3 - i, 2, 3), Direction.DOWN); scene.idle(4); } - Vec3 tunnelTop = util.vector.topOf(util.grid.at(2, 2, 3)); - scene.overlay.showControls(new InputWindowElement(tunnelTop, Pointing.DOWN).rightClick(), 80); + Vec3 tunnelTop = util.vector().topOf(util.grid().at(2, 2, 3)); + scene.overlay().showControls(new InputWindowElement(tunnelTop, Pointing.DOWN).rightClick(), 80); scene.idle(7); - scene.overlay.showCenteredScrollInput(util.grid.at(2, 2, 3), Direction.UP, 120); - scene.overlay.showText(120) + scene.overlay().showCenteredScrollInput(util.grid().at(2, 2, 3), Direction.UP, 120); + scene.overlay().showText(120) .attachKeyFrame() .pointAt(tunnelTop) .placeNearTarget() @@ -374,22 +374,22 @@ public class TunnelScenes { Class tunnelClass = BrassTunnelBlockEntity.class; ElementLink blockage = - scene.world.showIndependentSection(util.select.position(4, 1, 0), Direction.UP); - scene.world.moveSection(blockage, util.vector.of(-3, 0, 0), 0); + scene.world().showIndependentSection(util.select().position(4, 1, 0), Direction.UP); + scene.world().moveSection(blockage, util.vector().of(-3, 0, 0), 0); - Vec3 modeVec = util.vector.of(4, 2.5, 3); - scene.overlay.showControls(new InputWindowElement(modeVec, Pointing.RIGHT).showing(AllIcons.I_TUNNEL_SPLIT), - 140); + Vec3 modeVec = util.vector().of(4, 2.5, 3); + scene.overlay().showControls(new InputWindowElement(modeVec, Pointing.RIGHT).showing(AllIcons.I_TUNNEL_SPLIT), + 140); ElementLink blockage2 = null; for (int i = 0; i < 32; i++) { if (i < 30) - scene.world.createItemOnBelt(util.grid.at(1, 1, 5), Direction.EAST, new ItemStack(Items.SNOWBALL, 12)); + scene.world().createItemOnBelt(util.grid().at(1, 1, 5), Direction.EAST, new ItemStack(Items.SNOWBALL, 12)); scene.idle(i > 8 ? 30 : 40); if (i == 0) { - scene.overlay.showText(80) + scene.overlay().showText(80) .attachKeyFrame() .pointAt(tunnelTop) .placeNearTarget() @@ -397,41 +397,41 @@ public class TunnelScenes { } if (i == 2) { - scene.overlay.showText(60) + scene.overlay().showText(60) .text("If an output is unable to take more items, it will be skipped") - .pointAt(util.vector.blockSurface(util.grid.at(1, 1, 2), Direction.UP)) + .pointAt(util.vector().blockSurface(util.grid().at(1, 1, 2), Direction.UP)) .placeNearTarget() .colored(PonderPalette.GREEN); } if (i == 4) { - scene.overlay.showControls( + scene.overlay().showControls( new InputWindowElement(modeVec, Pointing.RIGHT).showing(AllIcons.I_TUNNEL_FORCED_SPLIT), 140); - scene.world.modifyBlockEntity(util.grid.at(1, 2, 3), tunnelClass, + scene.world().modifyBlockEntity(util.grid().at(1, 2, 3), tunnelClass, be -> be.getBehaviour(ScrollOptionBehaviour.TYPE) .setValue(BrassTunnelBlockEntity.SelectionMode.FORCED_SPLIT.ordinal())); } if (i == 5) { - scene.overlay.showText(80) + scene.overlay().showText(80) .attachKeyFrame() .text("'Forced Split' will never skip outputs, and instead wait until they are free") - .pointAt(util.vector.blockSurface(util.grid.at(1, 1, 2), Direction.UP)) + .pointAt(util.vector().blockSurface(util.grid().at(1, 1, 2), Direction.UP)) .placeNearTarget() .colored(PonderPalette.RED); scene.idle(60); - scene.world.moveSection(blockage, util.vector.of(-1, 0, 0), 10); - scene.world.setBlock(util.grid.at(1, 1, 0), Blocks.AIR.defaultBlockState(), false); - scene.world.multiplyKineticSpeed(util.select.everywhere(), 1.5f); + scene.world().moveSection(blockage, util.vector().of(-1, 0, 0), 10); + scene.world().setBlock(util.grid().at(1, 1, 0), Blocks.AIR.defaultBlockState(), false); + scene.world().multiplyKineticSpeed(util.select().everywhere(), 1.5f); } if (i == 7) { - scene.world.modifyBlockEntity(util.grid.at(1, 2, 3), tunnelClass, + scene.world().modifyBlockEntity(util.grid().at(1, 2, 3), tunnelClass, be -> be.getBehaviour(ScrollOptionBehaviour.TYPE) .setValue(BrassTunnelBlockEntity.SelectionMode.ROUND_ROBIN.ordinal())); - scene.overlay.showControls( + scene.overlay().showControls( new InputWindowElement(modeVec, Pointing.RIGHT).showing(AllIcons.I_TUNNEL_ROUND_ROBIN), 140); - scene.overlay.showText(80) + scene.overlay().showText(80) .attachKeyFrame() .pointAt(tunnelTop) .placeNearTarget() @@ -439,77 +439,77 @@ public class TunnelScenes { } if (i == 7) { - scene.world.moveSection(blockage, util.vector.of(1, 0, 0), 10); - scene.world.setBlock(util.grid.at(1, 1, 0), barrier, false); + scene.world().moveSection(blockage, util.vector().of(1, 0, 0), 10); + scene.world().setBlock(util.grid().at(1, 1, 0), barrier, false); } if (i == 13) { - scene.overlay.showText(60) + scene.overlay().showText(60) .text("Once Again, if an output is unable to take more items, it will be skipped") .placeNearTarget() - .pointAt(util.vector.blockSurface(util.grid.at(1, 1, 2), Direction.UP)) + .pointAt(util.vector().blockSurface(util.grid().at(1, 1, 2), Direction.UP)) .colored(PonderPalette.GREEN); } if (i == 15) { - scene.overlay.showControls( + scene.overlay().showControls( new InputWindowElement(modeVec, Pointing.RIGHT).showing(AllIcons.I_TUNNEL_FORCED_ROUND_ROBIN), 140); - scene.world.modifyBlockEntity(util.grid.at(1, 2, 3), tunnelClass, + scene.world().modifyBlockEntity(util.grid().at(1, 2, 3), tunnelClass, be -> be.getBehaviour(ScrollOptionBehaviour.TYPE) .setValue(BrassTunnelBlockEntity.SelectionMode.FORCED_ROUND_ROBIN.ordinal())); } if (i == 16) { - scene.overlay.showText(50) + scene.overlay().showText(50) .attachKeyFrame() .placeNearTarget() .text("'Forced Round Robin' never skips outputs") - .pointAt(util.vector.blockSurface(util.grid.at(1, 1, 2), Direction.UP)) + .pointAt(util.vector().blockSurface(util.grid().at(1, 1, 2), Direction.UP)) .colored(PonderPalette.RED); scene.idle(30); - scene.world.moveSection(blockage, util.vector.of(-1, 0, 0), 10); - scene.world.setBlock(util.grid.at(1, 1, 0), Blocks.AIR.defaultBlockState(), false); + scene.world().moveSection(blockage, util.vector().of(-1, 0, 0), 10); + scene.world().setBlock(util.grid().at(1, 1, 0), Blocks.AIR.defaultBlockState(), false); } if (i == 19) { - scene.overlay.showControls( + scene.overlay().showControls( new InputWindowElement(modeVec, Pointing.RIGHT).showing(AllIcons.I_TUNNEL_PREFER_NEAREST), 140); - scene.world.modifyBlockEntity(util.grid.at(1, 2, 3), tunnelClass, + scene.world().modifyBlockEntity(util.grid().at(1, 2, 3), tunnelClass, be -> be.getBehaviour(ScrollOptionBehaviour.TYPE) .setValue(BrassTunnelBlockEntity.SelectionMode.PREFER_NEAREST.ordinal())); - scene.world.moveSection(blockage, util.vector.of(1, 0, 0), 10); - scene.world.setBlock(util.grid.at(1, 1, 0), barrier, false); - scene.overlay.showText(70) + scene.world().moveSection(blockage, util.vector().of(1, 0, 0), 10); + scene.world().setBlock(util.grid().at(1, 1, 0), barrier, false); + scene.overlay().showText(70) .attachKeyFrame() .text("'Prefer Nearest' prioritizes the outputs closest to the items' input location") - .pointAt(util.vector.blockSurface(util.grid.at(1, 1, 2), Direction.UP)) + .pointAt(util.vector().blockSurface(util.grid().at(1, 1, 2), Direction.UP)) .placeNearTarget() .colored(PonderPalette.GREEN); } if (i == 21) { - scene.world.setBlock(util.grid.at(2, 1, 0), Blocks.BARRIER.defaultBlockState(), false); - blockage2 = scene.world.showIndependentSection(util.select.position(4, 1, 0), Direction.UP); - scene.world.moveSection(blockage2, util.vector.of(-2, 0, 0), 0); + scene.world().setBlock(util.grid().at(2, 1, 0), Blocks.BARRIER.defaultBlockState(), false); + blockage2 = scene.world().showIndependentSection(util.select().position(4, 1, 0), Direction.UP); + scene.world().moveSection(blockage2, util.vector().of(-2, 0, 0), 0); } if (i == 25) { - scene.world.hideIndependentSection(blockage, Direction.DOWN); - scene.world.setBlock(util.grid.at(1, 1, 0), Blocks.AIR.defaultBlockState(), false); - scene.world.hideIndependentSection(blockage2, Direction.DOWN); - scene.world.setBlock(util.grid.at(2, 1, 0), Blocks.AIR.defaultBlockState(), false); + scene.world().hideIndependentSection(blockage, Direction.DOWN); + scene.world().setBlock(util.grid().at(1, 1, 0), Blocks.AIR.defaultBlockState(), false); + scene.world().hideIndependentSection(blockage2, Direction.DOWN); + scene.world().setBlock(util.grid().at(2, 1, 0), Blocks.AIR.defaultBlockState(), false); } if (i == 26) { - scene.overlay.showControls( + scene.overlay().showControls( new InputWindowElement(modeVec, Pointing.RIGHT).showing(AllIcons.I_TUNNEL_RANDOMIZE), 140); - scene.world.modifyBlockEntity(util.grid.at(1, 2, 3), tunnelClass, + scene.world().modifyBlockEntity(util.grid().at(1, 2, 3), tunnelClass, be -> be.getBehaviour(ScrollOptionBehaviour.TYPE) .setValue(BrassTunnelBlockEntity.SelectionMode.RANDOMIZE.ordinal())); } if (i == 27) { - scene.overlay.showText(70) + scene.overlay().showText(70) .attachKeyFrame() .text("'Randomize' will distribute whole stacks to randomly picked outputs") .pointAt(tunnelTop) @@ -517,15 +517,15 @@ public class TunnelScenes { } } - scene.world.hideSection(util.select.fromTo(3, 2, 5, 1, 2, 5), Direction.UP); + scene.world().hideSection(util.select().fromTo(3, 2, 5, 1, 2, 5), Direction.UP); scene.idle(10); - scene.overlay + scene.overlay() .showControls(new InputWindowElement(modeVec, Pointing.RIGHT).showing(AllIcons.I_TUNNEL_SYNCHRONIZE), 140); - scene.world.modifyBlockEntity(util.grid.at(1, 2, 3), tunnelClass, + scene.world().modifyBlockEntity(util.grid().at(1, 2, 3), tunnelClass, be -> be.getBehaviour(ScrollOptionBehaviour.TYPE) .setValue(BrassTunnelBlockEntity.SelectionMode.SYNCHRONIZE.ordinal())); scene.idle(30); - scene.overlay.showText(70) + scene.overlay().showText(70) .attachKeyFrame() .text("'Synchronize Inputs' is a unique setting for Brass Tunnels") .pointAt(tunnelTop) @@ -535,30 +535,30 @@ public class TunnelScenes { ItemStack item2 = new ItemStack(Items.HONEY_BOTTLE); ItemStack item3 = AllItems.POLISHED_ROSE_QUARTZ.asStack(); - scene.world.createItemOnBelt(util.grid.at(3, 1, 4), Direction.UP, item1); - scene.world.createItemOnBelt(util.grid.at(2, 1, 4), Direction.UP, item2); - scene.world.createItemOnBelt(util.grid.at(3, 1, 5), Direction.SOUTH, item1); - scene.world.createItemOnBelt(util.grid.at(2, 1, 5), Direction.SOUTH, item2); + scene.world().createItemOnBelt(util.grid().at(3, 1, 4), Direction.UP, item1); + scene.world().createItemOnBelt(util.grid().at(2, 1, 4), Direction.UP, item2); + scene.world().createItemOnBelt(util.grid().at(3, 1, 5), Direction.SOUTH, item1); + scene.world().createItemOnBelt(util.grid().at(2, 1, 5), Direction.SOUTH, item2); scene.idle(80); - scene.world.createItemOnBelt(util.grid.at(2, 1, 5), Direction.SOUTH, item2); + scene.world().createItemOnBelt(util.grid().at(2, 1, 5), Direction.SOUTH, item2); scene.rotateCameraY(-90); scene.idle(20); - scene.world.multiplyKineticSpeed(util.select.everywhere(), .5f); + scene.world().multiplyKineticSpeed(util.select().everywhere(), .5f); - scene.overlay.showText(70) + scene.overlay().showText(70) .text("Items are only allowed past if every tunnel in the group has one waiting") - .pointAt(util.vector.blockSurface(util.grid.at(2, 1, 4), Direction.UP)) + .pointAt(util.vector().blockSurface(util.grid().at(2, 1, 4), Direction.UP)) .placeNearTarget() .colored(PonderPalette.OUTPUT); scene.idle(60); - scene.world.createItemOnBelt(util.grid.at(1, 1, 5), Direction.SOUTH, item3); + scene.world().createItemOnBelt(util.grid().at(1, 1, 5), Direction.SOUTH, item3); scene.idle(90); scene.rotateCameraY(90); - scene.overlay.showText(100) + scene.overlay().showText(100) .text("This ensures that all affected belts supply items at the same rate") - .pointAt(util.vector.blockSurface(util.grid.at(1, 2, 3), Direction.WEST)) + .pointAt(util.vector().blockSurface(util.grid().at(1, 2, 3), Direction.WEST)) .placeNearTarget() .colored(PonderPalette.GREEN); } diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/DrainScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/DrainScenes.java index 015d215512..41ba8927c7 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/DrainScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/DrainScenes.java @@ -5,9 +5,9 @@ import com.simibubi.create.foundation.blockEntity.behaviour.fluid.SmartFluidTank import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; import net.createmod.ponder.foundation.ElementLink; -import net.createmod.ponder.foundation.SceneBuilder; -import net.createmod.ponder.foundation.SceneBuildingUtil; import net.createmod.ponder.foundation.Selection; import net.createmod.ponder.foundation.element.InputWindowElement; import net.createmod.ponder.foundation.element.WorldSectionElement; @@ -29,34 +29,34 @@ public class DrainScenes { scene.showBasePlate(); scene.idle(5); - Selection drain = util.select.position(3, 1, 2); - BlockPos drainPos = util.grid.at(3, 1, 2); - Selection pipes = util.select.fromTo(3, 1, 3, 3, 1, 4) - .add(util.select.fromTo(3, 2, 4, 2, 2, 4)); - Selection tank = util.select.fromTo(1, 1, 4, 1, 3, 4); - Selection largeCog = util.select.position(1, 0, 5); - Selection kinetics = util.select.fromTo(2, 1, 3, 2, 1, 5); - Selection belt = util.select.fromTo(2, 1, 2, 1, 1, 2); - BlockPos beltPos = util.grid.at(1, 1, 2); + Selection drain = util.select().position(3, 1, 2); + BlockPos drainPos = util.grid().at(3, 1, 2); + Selection pipes = util.select().fromTo(3, 1, 3, 3, 1, 4) + .add(util.select().fromTo(3, 2, 4, 2, 2, 4)); + Selection tank = util.select().fromTo(1, 1, 4, 1, 3, 4); + Selection largeCog = util.select().position(1, 0, 5); + Selection kinetics = util.select().fromTo(2, 1, 3, 2, 1, 5); + Selection belt = util.select().fromTo(2, 1, 2, 1, 1, 2); + BlockPos beltPos = util.grid().at(1, 1, 2); - ElementLink drainLink = scene.world.showIndependentSection(drain, Direction.DOWN); - scene.world.moveSection(drainLink, util.vector.of(-1, 0, 0), 0); + ElementLink drainLink = scene.world().showIndependentSection(drain, Direction.DOWN); + scene.world().moveSection(drainLink, util.vector().of(-1, 0, 0), 0); scene.idle(10); - scene.overlay.showText(40) + scene.overlay().showText(40) .text("Item Drains can extract fluids from items") .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.blockSurface(drainPos.west(), Direction.UP)); + .pointAt(util.vector().blockSurface(drainPos.west(), Direction.UP)); scene.idle(50); ItemStack lavaBucket = new ItemStack(Items.LAVA_BUCKET); - scene.overlay.showControls( - new InputWindowElement(util.vector.blockSurface(drainPos.west(), Direction.UP), Pointing.DOWN).rightClick() + scene.overlay().showControls( + new InputWindowElement(util.vector().blockSurface(drainPos.west(), Direction.UP), Pointing.DOWN).rightClick() .withItem(lavaBucket), 40); scene.idle(7); - scene.world.modifyBlockEntity(drainPos, ItemDrainBlockEntity.class, be -> { + scene.world().modifyBlockEntity(drainPos, ItemDrainBlockEntity.class, be -> { be.getBehaviour(SmartFluidTankBehaviour.TYPE) .allowInsertion(); be.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) @@ -64,61 +64,61 @@ public class DrainScenes { }); scene.idle(10); - scene.overlay.showText(50) + scene.overlay().showText(50) .text("Right-click it to pour fluids from your held item into it") .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.blockSurface(drainPos.west(), Direction.WEST)); + .pointAt(util.vector().blockSurface(drainPos.west(), Direction.WEST)); scene.idle(60); - scene.world.modifyBlockEntity(drainPos, ItemDrainBlockEntity.class, + scene.world().modifyBlockEntity(drainPos, ItemDrainBlockEntity.class, be -> be.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) .ifPresent(fh -> fh.drain(500, FluidAction.EXECUTE))); - scene.world.moveSection(drainLink, util.vector.of(1, 0, 0), 7); - scene.world.showSection(largeCog, Direction.UP); + scene.world().moveSection(drainLink, util.vector().of(1, 0, 0), 7); + scene.world().showSection(largeCog, Direction.UP); scene.idle(3); - scene.world.showSection(kinetics, Direction.NORTH); + scene.world().showSection(kinetics, Direction.NORTH); scene.idle(4); - scene.world.showSection(belt, Direction.SOUTH); + scene.world().showSection(belt, Direction.SOUTH); scene.idle(10); - scene.overlay.showText(40) + scene.overlay().showText(40) .text("When items are inserted from the side...") .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.topOf(util.grid.at(2, 1, 2))); + .pointAt(util.vector().topOf(util.grid().at(2, 1, 2))); scene.idle(40); - scene.overlay - .showControls(new InputWindowElement(util.vector.topOf(beltPos), Pointing.DOWN).withItem(lavaBucket), 20); + scene.overlay() + .showControls(new InputWindowElement(util.vector().topOf(beltPos), Pointing.DOWN).withItem(lavaBucket), 20); scene.idle(7); - scene.world.createItemOnBelt(beltPos, Direction.NORTH, lavaBucket); + scene.world().createItemOnBelt(beltPos, Direction.NORTH, lavaBucket); scene.idle(30); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("...they roll across, emptying out their contained fluid") .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.topOf(drainPos)); + .pointAt(util.vector().topOf(drainPos)); scene.idle(40); - scene.world.showSection(tank, Direction.DOWN); + scene.world().showSection(tank, Direction.DOWN); scene.idle(5); - scene.world.showSection(pipes, Direction.NORTH); + scene.world().showSection(pipes, Direction.NORTH); scene.idle(20); - scene.overlay.showText(90) + scene.overlay().showText(90) .text("Pipe Networks can now pull the fluid from the drains' internal buffer") .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.topOf(util.grid.at(3, 1, 3))); + .pointAt(util.vector().topOf(util.grid().at(3, 1, 3))); scene.idle(50); scene.markAsFinished(); scene.idle(50); for (int i = 0; i < 5; i++) { - scene.world.createItemOnBelt(beltPos, Direction.NORTH, lavaBucket); + scene.world().createItemOnBelt(beltPos, Direction.NORTH, lavaBucket); scene.idle(30); } diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/FluidMovementActorScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/FluidMovementActorScenes.java index 0dbea8d455..5b861c7a41 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/FluidMovementActorScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/FluidMovementActorScenes.java @@ -8,10 +8,10 @@ import com.simibubi.create.foundation.fluid.FluidHelper; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; import net.createmod.ponder.foundation.ElementLink; import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.SceneBuilder; -import net.createmod.ponder.foundation.SceneBuildingUtil; import net.createmod.ponder.foundation.Selection; import net.createmod.ponder.foundation.element.InputWindowElement; import net.createmod.ponder.foundation.element.WorldSectionElement; @@ -35,51 +35,51 @@ public class FluidMovementActorScenes { scene.showBasePlate(); scene.idle(5); - Selection pipes = util.select.fromTo(2, 1, 3, 0, 1, 3) - .add(util.select.position(0, 1, 4)); - BlockPos pumpPos = util.grid.at(0, 1, 4); - Selection kinetics = util.select.fromTo(1, 1, 7, 1, 1, 4); - Selection tank = util.select.fromTo(0, 1, 5, 0, 3, 5); - Selection largeCog = util.select.position(2, 0, 7); + Selection pipes = util.select().fromTo(2, 1, 3, 0, 1, 3) + .add(util.select().position(0, 1, 4)); + BlockPos pumpPos = util.grid().at(0, 1, 4); + Selection kinetics = util.select().fromTo(1, 1, 7, 1, 1, 4); + Selection tank = util.select().fromTo(0, 1, 5, 0, 3, 5); + Selection largeCog = util.select().position(2, 0, 7); FluidStack chocolate = new FluidStack(FluidHelper.convertToStill(AllFluids.CHOCOLATE.get()), 1000); - BlockPos ct1 = util.grid.at(5, 3, 2); - BlockPos ct2 = util.grid.at(6, 3, 2); - BlockPos st = util.grid.at(0, 1, 5); + BlockPos ct1 = util.grid().at(5, 3, 2); + BlockPos ct2 = util.grid().at(6, 3, 2); + BlockPos st = util.grid().at(0, 1, 5); Capability fhc = CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY; Class type = FluidTankBlockEntity.class; ItemStack bucket = AllFluids.CHOCOLATE.get() .getFluidType() .getBucket(chocolate); - scene.world.modifyBlock(pumpPos, s -> s.setValue(PumpBlock.FACING, Direction.NORTH), false); + scene.world().modifyBlock(pumpPos, s -> s.setValue(PumpBlock.FACING, Direction.NORTH), false); - scene.world.modifyBlockEntity(st, type, be -> be.getCapability(fhc) + scene.world().modifyBlockEntity(st, type, be -> be.getCapability(fhc) .ifPresent(ifh -> ifh.fill(FluidHelper.copyStackWithAmount(chocolate, 10000), FluidAction.EXECUTE))); - BlockPos bearing = util.grid.at(5, 1, 2); - scene.world.showSection(util.select.position(bearing), Direction.DOWN); + BlockPos bearing = util.grid().at(5, 1, 2); + scene.world().showSection(util.select().position(bearing), Direction.DOWN); scene.idle(5); ElementLink contraption = - scene.world.showIndependentSection(util.select.fromTo(5, 2, 2, 6, 4, 2), Direction.DOWN); - scene.world.configureCenterOfRotation(contraption, util.vector.centerOf(bearing)); + scene.world().showIndependentSection(util.select().fromTo(5, 2, 2, 6, 4, 2), Direction.DOWN); + scene.world().configureCenterOfRotation(contraption, util.vector().centerOf(bearing)); scene.idle(10); - scene.world.rotateBearing(bearing, 360, 70); - scene.world.rotateSection(contraption, 0, 360, 0, 70); - scene.overlay.showText(60) - .pointAt(util.vector.topOf(bearing.above(2))) + scene.world().rotateBearing(bearing, 360, 70); + scene.world().rotateSection(contraption, 0, 360, 0, 70); + scene.overlay().showText(60) + .pointAt(util.vector().topOf(bearing.above(2))) .colored(PonderPalette.RED) .placeNearTarget() .attachKeyFrame() .text("Fluid Tanks on moving contraptions cannot be accessed by any pipes"); scene.idle(70); - BlockPos psi = util.grid.at(4, 2, 2); - scene.world.showSectionAndMerge(util.select.position(psi), Direction.EAST, contraption); + BlockPos psi = util.grid().at(4, 2, 2); + scene.world().showSectionAndMerge(util.select().position(psi), Direction.EAST, contraption); scene.idle(13); - scene.effects.superGlue(psi, Direction.EAST, true); + scene.effects().superGlue(psi, Direction.EAST, true); - scene.overlay.showText(80) - .pointAt(util.vector.topOf(psi)) + scene.overlay().showText(80) + .pointAt(util.vector().topOf(psi)) .colored(PonderPalette.GREEN) .placeNearTarget() .attachKeyFrame() @@ -87,117 +87,117 @@ public class FluidMovementActorScenes { scene.idle(90); BlockPos psi2 = psi.west(2); - scene.world.showSection(util.select.position(psi2), Direction.DOWN); - scene.overlay.showSelectionWithText(util.select.position(psi.west()), 50) + scene.world().showSection(util.select().position(psi2), Direction.DOWN); + scene.overlay().showSelectionWithText(util.select().position(psi.west()), 50) .colored(PonderPalette.RED) .placeNearTarget() .attachKeyFrame() .text("Place a second one with a gap of 1 or 2 blocks inbetween"); scene.idle(55); - scene.world.rotateBearing(bearing, 360, 60); - scene.world.rotateSection(contraption, 0, 360, 0, 60); + scene.world().rotateBearing(bearing, 360, 60); + scene.world().rotateSection(contraption, 0, 360, 0, 60); scene.idle(20); - scene.overlay.showText(40) + scene.overlay().showText(40) .placeNearTarget() - .pointAt(util.vector.of(3, 3, 2.5)) + .pointAt(util.vector().of(3, 3, 2.5)) .text("Whenever they pass by each other, they will engage in a connection"); scene.idle(38); - Selection both = util.select.fromTo(2, 2, 2, 4, 2, 2); + Selection both = util.select().fromTo(2, 2, 2, 4, 2, 2); Class psiClass = PortableFluidInterfaceBlockEntity.class; - scene.world.modifyBlockEntityNBT(both, psiClass, nbt -> { + scene.world().modifyBlockEntityNBT(both, psiClass, nbt -> { nbt.putFloat("Distance", 1); nbt.putFloat("Timer", 14); }); scene.idle(17); - scene.overlay.showOutline(PonderPalette.GREEN, psi, util.select.fromTo(5, 3, 2, 6, 4, 2), 80); + scene.overlay().showOutline(PonderPalette.GREEN, psi, util.select().fromTo(5, 3, 2, 6, 4, 2), 80); scene.idle(10); - scene.overlay.showSelectionWithText(util.select.position(psi2), 70) + scene.overlay().showSelectionWithText(util.select().position(psi2), 70) .placeNearTarget() .colored(PonderPalette.GREEN) .attachKeyFrame() .text("While engaged, the stationary interface will represent ALL Tanks on the contraption"); scene.idle(80); - ElementLink p = scene.world.showIndependentSection(tank, Direction.DOWN); - scene.world.moveSection(p, util.vector.of(0, 0, -1), 0); + ElementLink p = scene.world().showIndependentSection(tank, Direction.DOWN); + scene.world().moveSection(p, util.vector().of(0, 0, -1), 0); scene.idle(5); - scene.world.showSectionAndMerge(pipes, Direction.EAST, p); + scene.world().showSectionAndMerge(pipes, Direction.EAST, p); scene.idle(5); - scene.world.showSectionAndMerge(largeCog, Direction.UP, p); - scene.world.showSectionAndMerge(kinetics, Direction.NORTH, p); + scene.world().showSectionAndMerge(largeCog, Direction.UP, p); + scene.world().showSectionAndMerge(kinetics, Direction.NORTH, p); scene.idle(10); - scene.overlay.showText(70) + scene.overlay().showText(70) .placeNearTarget() - .pointAt(util.vector.topOf(pumpPos)) + .pointAt(util.vector().topOf(pumpPos)) .attachKeyFrame() .text("Fluid can now be inserted..."); scene.idle(30); for (int i = 0; i < 16; i++) { if (i == 8) - scene.overlay - .showControls(new InputWindowElement(util.vector.blockSurface(util.grid.at(5, 3, 2), Direction.WEST) + scene.overlay() + .showControls(new InputWindowElement(util.vector().blockSurface(util.grid().at(5, 3, 2), Direction.WEST) .add(0, 0.5, 0), Pointing.LEFT).withItem(bucket), 30); - scene.world.modifyBlockEntity(st, type, be -> be.getCapability(fhc) + scene.world().modifyBlockEntity(st, type, be -> be.getCapability(fhc) .ifPresent(ifh -> ifh.drain(1000, FluidAction.EXECUTE))); - scene.world.modifyBlockEntity(ct1, type, be -> be.getCapability(fhc) + scene.world().modifyBlockEntity(ct1, type, be -> be.getCapability(fhc) .ifPresent(ifh -> ifh.fill(chocolate, FluidAction.EXECUTE))); scene.idle(2); } for (int i = 0; i < 8; i++) { - scene.world.modifyBlockEntity(st, type, be -> be.getCapability(fhc) + scene.world().modifyBlockEntity(st, type, be -> be.getCapability(fhc) .ifPresent(ifh -> ifh.drain(1000, FluidAction.EXECUTE))); - scene.world.modifyBlockEntity(ct2, type, be -> be.getCapability(fhc) + scene.world().modifyBlockEntity(ct2, type, be -> be.getCapability(fhc) .ifPresent(ifh -> ifh.fill(chocolate, FluidAction.EXECUTE))); scene.idle(2); } scene.idle(50); - scene.overlay.showText(40) + scene.overlay().showText(40) .placeNearTarget() - .pointAt(util.vector.topOf(pumpPos)) + .pointAt(util.vector().topOf(pumpPos)) .text("...or extracted from the contraption"); - scene.world.modifyBlock(pumpPos, s -> s.setValue(PumpBlock.FACING, Direction.SOUTH), true); - scene.world.propagatePipeChange(pumpPos); + scene.world().modifyBlock(pumpPos, s -> s.setValue(PumpBlock.FACING, Direction.SOUTH), true); + scene.world().propagatePipeChange(pumpPos); scene.idle(30); for (int i = 0; i < 8; i++) { - scene.world.modifyBlockEntity(ct2, type, be -> be.getCapability(fhc) + scene.world().modifyBlockEntity(ct2, type, be -> be.getCapability(fhc) .ifPresent(ifh -> ifh.drain(1000, FluidAction.EXECUTE))); - scene.world.modifyBlockEntity(st, type, be -> be.getCapability(fhc) + scene.world().modifyBlockEntity(st, type, be -> be.getCapability(fhc) .ifPresent(ifh -> ifh.fill(chocolate, FluidAction.EXECUTE))); scene.idle(2); } for (int i = 0; i < 16; i++) { - scene.world.modifyBlockEntity(ct1, type, be -> be.getCapability(fhc) + scene.world().modifyBlockEntity(ct1, type, be -> be.getCapability(fhc) .ifPresent(ifh -> ifh.drain(1000, FluidAction.EXECUTE))); - scene.world.modifyBlockEntity(st, type, be -> be.getCapability(fhc) + scene.world().modifyBlockEntity(st, type, be -> be.getCapability(fhc) .ifPresent(ifh -> ifh.fill(chocolate, FluidAction.EXECUTE))); scene.idle(2); } - scene.world.modifyBlockEntity(util.grid.at(2, 2, 3), type, be -> be.getCapability(fhc) + scene.world().modifyBlockEntity(util.grid().at(2, 2, 3), type, be -> be.getCapability(fhc) .ifPresent(ifh -> ifh.drain(8000, FluidAction.EXECUTE))); scene.idle(50); - scene.overlay.showText(120) + scene.overlay().showText(120) .placeNearTarget() .attachKeyFrame() - .pointAt(util.vector.topOf(psi2)) + .pointAt(util.vector().topOf(psi2)) .text("After no contents have been exchanged for a while, the contraption will continue on its way"); - scene.world.modifyBlockEntityNBT(both, psiClass, nbt -> nbt.putFloat("Timer", 2)); + scene.world().modifyBlockEntityNBT(both, psiClass, nbt -> nbt.putFloat("Timer", 2)); scene.idle(15); - scene.world.rotateBearing(bearing, 270, 120); - scene.world.rotateSection(contraption, 0, 270, 0, 120); + scene.world().rotateBearing(bearing, 270, 120); + scene.world().rotateSection(contraption, 0, 270, 0, 120); scene.idle(100); scene.markAsFinished(); diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/FluidTankScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/FluidTankScenes.java index 6f568c2630..90fad9128c 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/FluidTankScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/FluidTankScenes.java @@ -17,10 +17,10 @@ import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; import net.createmod.catnip.utility.VecHelper; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; import net.createmod.ponder.foundation.ElementLink; import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.SceneBuilder; -import net.createmod.ponder.foundation.SceneBuildingUtil; import net.createmod.ponder.foundation.Selection; import net.createmod.ponder.foundation.element.InputWindowElement; import net.createmod.ponder.foundation.element.WorldSectionElement; @@ -47,171 +47,171 @@ public class FluidTankScenes { scene.showBasePlate(); scene.idle(5); - BlockPos tankPos = util.grid.at(3, 1, 2); - Selection chocolate = util.select.fromTo(1, 5, 0, 0, 8, 1); - Selection tank = util.select.fromTo(3, 1, 2, 3, 2, 2); - Selection largeCog1 = util.select.position(3, 0, 5); - Selection kinetics1 = util.select.fromTo(2, 1, 5, 2, 1, 3) - .add(util.select.position(2, 2, 4)); - Selection largeCog2 = util.select.position(6, 0, 1); - Selection comparatorStuff = util.select.fromTo(2, 1, 1, 2, 1, 0); - Selection pump = util.select.position(1, 1, 3); - BlockPos pumpPos = util.grid.at(1, 1, 3); - Selection spoutstuff = util.select.fromTo(3, 1, 0, 5, 3, 2) + BlockPos tankPos = util.grid().at(3, 1, 2); + Selection chocolate = util.select().fromTo(1, 5, 0, 0, 8, 1); + Selection tank = util.select().fromTo(3, 1, 2, 3, 2, 2); + Selection largeCog1 = util.select().position(3, 0, 5); + Selection kinetics1 = util.select().fromTo(2, 1, 5, 2, 1, 3) + .add(util.select().position(2, 2, 4)); + Selection largeCog2 = util.select().position(6, 0, 1); + Selection comparatorStuff = util.select().fromTo(2, 1, 1, 2, 1, 0); + Selection pump = util.select().position(1, 1, 3); + BlockPos pumpPos = util.grid().at(1, 1, 3); + Selection spoutstuff = util.select().fromTo(3, 1, 0, 5, 3, 2) .substract(tank); - Selection pipe = util.select.fromTo(1, 1, 2, 1, 1, 5) - .add(util.select.position(1, 0, 5)) - .add(util.select.position(2, 1, 2)); + Selection pipe = util.select().fromTo(1, 1, 2, 1, 1, 5) + .add(util.select().position(1, 0, 5)) + .add(util.select().position(2, 1, 2)); - ElementLink tankLink = scene.world.showIndependentSection(tank, Direction.NORTH); - scene.world.moveSection(tankLink, util.vector.of(0, 0, -1), 0); + ElementLink tankLink = scene.world().showIndependentSection(tank, Direction.NORTH); + scene.world().moveSection(tankLink, util.vector().of(0, 0, -1), 0); scene.idle(5); - ElementLink chocLink = scene.world.showIndependentSection(chocolate, Direction.NORTH); - scene.world.moveSection(chocLink, util.vector.of(2, -4, 3), 0); + ElementLink chocLink = scene.world().showIndependentSection(chocolate, Direction.NORTH); + scene.world().moveSection(chocLink, util.vector().of(2, -4, 3), 0); scene.idle(10); - scene.overlay.showOutline(PonderPalette.GREEN, chocLink, util.select.fromTo(3, 1, 3, 2, 4, 4), 40); + scene.overlay().showOutline(PonderPalette.GREEN, chocLink, util.select().fromTo(3, 1, 3, 2, 4, 4), 40); scene.idle(10); - scene.overlay.showLine(PonderPalette.GREEN, util.vector.of(3, 1, 2), util.vector.of(2, 1, 3), 30); - scene.overlay.showLine(PonderPalette.GREEN, util.vector.of(3, 3, 2), util.vector.of(2, 5, 3), 30); - scene.overlay.showLine(PonderPalette.GREEN, util.vector.of(4, 3, 2), util.vector.of(4, 5, 3), 30); - scene.overlay.showOutline(PonderPalette.GREEN, tankLink, util.select.fromTo(3, 1, 1, 3, 2, 1), 40); + scene.overlay().showLine(PonderPalette.GREEN, util.vector().of(3, 1, 2), util.vector().of(2, 1, 3), 30); + scene.overlay().showLine(PonderPalette.GREEN, util.vector().of(3, 3, 2), util.vector().of(2, 5, 3), 30); + scene.overlay().showLine(PonderPalette.GREEN, util.vector().of(4, 3, 2), util.vector().of(4, 5, 3), 30); + scene.overlay().showOutline(PonderPalette.GREEN, tankLink, util.select().fromTo(3, 1, 1, 3, 2, 1), 40); scene.idle(10); - scene.overlay.showText(40) + scene.overlay().showText(40) .text("Fluid Tanks can be used to store large amounts of fluid") .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.blockSurface(util.grid.at(3, 2, 1), Direction.WEST)); + .pointAt(util.vector().blockSurface(util.grid().at(3, 2, 1), Direction.WEST)); scene.idle(50); - scene.world.hideIndependentSection(chocLink, Direction.DOWN); + scene.world().hideIndependentSection(chocLink, Direction.DOWN); scene.idle(5); FluidStack content = new FluidStack(AllFluids.CHOCOLATE.get() .getSource(), 16000); - scene.world.modifyBlockEntity(tankPos, FluidTankBlockEntity.class, be -> be.getTankInventory() + scene.world().modifyBlockEntity(tankPos, FluidTankBlockEntity.class, be -> be.getTankInventory() .fill(content, FluidAction.EXECUTE)); scene.idle(25); - scene.world.moveSection(tankLink, util.vector.of(0, 0, 1), 10); + scene.world().moveSection(tankLink, util.vector().of(0, 0, 1), 10); scene.idle(5); - scene.world.setKineticSpeed(pump, 0); - scene.world.showSection(pipe, Direction.EAST); - scene.world.modifyBlock(pumpPos, s -> s.setValue(PumpBlock.FACING, Direction.SOUTH), false); + scene.world().setKineticSpeed(pump, 0); + scene.world().showSection(pipe, Direction.EAST); + scene.world().modifyBlock(pumpPos, s -> s.setValue(PumpBlock.FACING, Direction.SOUTH), false); scene.idle(10); - scene.world.showSection(largeCog1, Direction.UP); - scene.world.showSection(kinetics1, Direction.WEST); + scene.world().showSection(largeCog1, Direction.UP); + scene.world().showSection(kinetics1, Direction.WEST); scene.idle(10); - scene.world.setBlock(util.grid.at(1, -1, 5), AllBlocks.FLUID_TANK.getDefaultState(), false); - scene.world.setKineticSpeed(pump, -32); + scene.world().setBlock(util.grid().at(1, -1, 5), AllBlocks.FLUID_TANK.getDefaultState(), false); + scene.world().setKineticSpeed(pump, -32); scene.idle(5); - scene.world.propagatePipeChange(pumpPos); - scene.world.modifyBlockEntity(util.grid.at(2, 0, 5), FluidTankBlockEntity.class, be -> be.getTankInventory() + scene.world().propagatePipeChange(pumpPos); + scene.world().modifyBlockEntity(util.grid().at(2, 0, 5), FluidTankBlockEntity.class, be -> be.getTankInventory() .fill(content, FluidAction.EXECUTE)); scene.idle(20); for (int i = 0; i < 4; i++) { - scene.world.modifyBlockEntity(tankPos, FluidTankBlockEntity.class, be -> be.getTankInventory() + scene.world().modifyBlockEntity(tankPos, FluidTankBlockEntity.class, be -> be.getTankInventory() .drain(2000, FluidAction.EXECUTE)); scene.idle(5); } - scene.overlay.showText(60) + scene.overlay().showText(60) .text("Pipe networks can push and pull fluids from any side") .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.centerOf(1, 1, 2)); + .pointAt(util.vector().centerOf(1, 1, 2)); scene.idle(40); - scene.world.modifyBlock(pumpPos, s -> s.setValue(PumpBlock.FACING, Direction.NORTH), true); - scene.world.propagatePipeChange(pumpPos); + scene.world().modifyBlock(pumpPos, s -> s.setValue(PumpBlock.FACING, Direction.NORTH), true); + scene.world().propagatePipeChange(pumpPos); for (int i = 0; i < 4; i++) { - scene.world.modifyBlockEntity(tankPos, FluidTankBlockEntity.class, be -> be.getTankInventory() + scene.world().modifyBlockEntity(tankPos, FluidTankBlockEntity.class, be -> be.getTankInventory() .fill(FluidHelper.copyStackWithAmount(content, 2000), FluidAction.EXECUTE)); scene.idle(5); } scene.idle(40); - scene.world.hideSection(largeCog1, Direction.DOWN); - scene.world.hideSection(kinetics1, Direction.SOUTH); - scene.world.hideSection(pipe, Direction.WEST); + scene.world().hideSection(largeCog1, Direction.DOWN); + scene.world().hideSection(kinetics1, Direction.SOUTH); + scene.world().hideSection(pipe, Direction.WEST); scene.idle(10); - scene.world.showSection(comparatorStuff, Direction.SOUTH); + scene.world().showSection(comparatorStuff, Direction.SOUTH); scene.idle(5); - scene.world.moveSection(tankLink, util.vector.of(-1, 0, 0), 10); + scene.world().moveSection(tankLink, util.vector().of(-1, 0, 0), 10); scene.idle(10); - scene.world.toggleRedstonePower(comparatorStuff); - scene.world.modifyBlockEntityNBT(util.select.position(2, 1, 0), NixieTubeBlockEntity.class, + scene.world().toggleRedstonePower(comparatorStuff); + scene.world().modifyBlockEntityNBT(util.select().position(2, 1, 0), NixieTubeBlockEntity.class, nbt -> nbt.putInt("RedstoneStrength", 15)); - scene.overlay.showText(50) + scene.overlay().showText(50) .text("The contained fluid can be measured by a Comparator") .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.blockSurface(util.grid.at(2, 1, 1), Direction.DOWN) + .pointAt(util.vector().blockSurface(util.grid().at(2, 1, 1), Direction.DOWN) .add(0, 1 / 8f, 0)); scene.idle(50); - scene.world.hideSection(comparatorStuff, Direction.EAST); + scene.world().hideSection(comparatorStuff, Direction.EAST); scene.idle(20); ItemStack bucket = new ItemStack(Items.BUCKET, 1); - scene.overlay.showControls( - new InputWindowElement(util.vector.blockSurface(util.grid.at(2, 2, 2), Direction.NORTH), Pointing.RIGHT) + scene.overlay().showControls( + new InputWindowElement(util.vector().blockSurface(util.grid().at(2, 2, 2), Direction.NORTH), Pointing.RIGHT) .showing(AllIcons.I_MTD_CLOSE) .withItem(bucket), 40); scene.idle(7); - scene.overlay.showSelectionWithText(util.select.fromTo(2, 1, 2, 2, 2, 2), 70) + scene.overlay().showSelectionWithText(util.select().fromTo(2, 1, 2, 2, 2, 2), 70) .text("However, in Survival Mode Fluids cannot be added or taken manually") .attachKeyFrame() .colored(PonderPalette.RED) .placeNearTarget() - .pointAt(util.vector.blockSurface(util.grid.at(2, 2, 2), Direction.WEST)); + .pointAt(util.vector().blockSurface(util.grid().at(2, 2, 2), Direction.WEST)); scene.idle(80); - scene.world.modifyBlockEntity(util.grid.at(4, 3, 0), SpoutBlockEntity.class, + scene.world().modifyBlockEntity(util.grid().at(4, 3, 0), SpoutBlockEntity.class, be -> be.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) .ifPresent(ifh -> ifh.fill(content, FluidAction.EXECUTE))); - scene.world.moveSection(tankLink, util.vector.of(0, 0, 1), 7); - scene.world.multiplyKineticSpeed(spoutstuff, -1); - scene.world.multiplyKineticSpeed(largeCog2, -1); + scene.world().moveSection(tankLink, util.vector().of(0, 0, 1), 7); + scene.world().multiplyKineticSpeed(spoutstuff, -1); + scene.world().multiplyKineticSpeed(largeCog2, -1); scene.idle(7); - ElementLink spoutLink = scene.world.showIndependentSection(spoutstuff, Direction.SOUTH); - ElementLink largeCogLink = scene.world.showIndependentSection(largeCog2, Direction.UP); - scene.world.moveSection(spoutLink, util.vector.of(-1, 0, 1), 0); - scene.world.moveSection(largeCogLink, util.vector.of(-1, 0, 1), 0); + ElementLink spoutLink = scene.world().showIndependentSection(spoutstuff, Direction.SOUTH); + ElementLink largeCogLink = scene.world().showIndependentSection(largeCog2, Direction.UP); + scene.world().moveSection(spoutLink, util.vector().of(-1, 0, 1), 0); + scene.world().moveSection(largeCogLink, util.vector().of(-1, 0, 1), 0); scene.idle(20); - scene.overlay.showOutline(PonderPalette.GREEN, new Object(), util.select.position(2, 1, 1), 50); + scene.overlay().showOutline(PonderPalette.GREEN, new Object(), util.select().position(2, 1, 1), 50); scene.idle(5); - scene.overlay.showOutline(PonderPalette.GREEN, new Object(), util.select.position(3, 3, 1), 50); + scene.overlay().showOutline(PonderPalette.GREEN, new Object(), util.select().position(3, 3, 1), 50); scene.idle(5); - scene.overlay.showText(80) + scene.overlay().showText(80) .text("You can use Basins, Item Drains and Spouts to drain or fill fluid containing items") .attachKeyFrame() .colored(PonderPalette.GREEN) .placeNearTarget() - .pointAt(util.vector.topOf(2, 1, 1)); + .pointAt(util.vector().topOf(2, 1, 1)); scene.idle(90); ItemStack chocBucket = AllFluids.CHOCOLATE.get() .getFluidType() .getBucket(new FluidStack(FluidHelper.convertToStill(AllFluids.CHOCOLATE.get()), 1000)); - scene.world.createItemOnBeltLike(util.grid.at(3, 1, 0), Direction.WEST, chocBucket); + scene.world().createItemOnBeltLike(util.grid().at(3, 1, 0), Direction.WEST, chocBucket); scene.idle(40); - scene.world.modifyBlockEntityNBT(util.select.position(util.grid.at(4, 3, 0)), SpoutBlockEntity.class, + scene.world().modifyBlockEntityNBT(util.select().position(util.grid().at(4, 3, 0)), SpoutBlockEntity.class, nbt -> nbt.putInt("ProcessingTicks", 20)); scene.idle(20); - scene.world.removeItemsFromBelt(util.grid.at(4, 1, 0)); - scene.world.createItemOnBeltLike(util.grid.at(4, 1, 0), Direction.UP, chocBucket); + scene.world().removeItemsFromBelt(util.grid().at(4, 1, 0)); + scene.world().createItemOnBeltLike(util.grid().at(4, 1, 0), Direction.UP, chocBucket); for (int i = 0; i < 10; i++) { - scene.effects.emitParticles(util.vector.topOf(3, 1, 1) + scene.effects().emitParticles(util.vector().topOf(3, 1, 1) .add(0, 1 / 16f, 0), - Emitter.simple(FluidFX.getFluidParticle(content), + Emitter.simple(FluidFX.getFluidParticle(content), VecHelper.offsetRandomly(Vec3.ZERO, random, .1f)), - 1, 1); + 1, 1); } } @@ -223,125 +223,125 @@ public class FluidTankScenes { scene.showBasePlate(); scene.idle(5); - Selection single = util.select.position(0, 3, 0); - Selection single2 = util.select.fromTo(1, 2, 1, 0, 2, 0); - Selection single3 = util.select.fromTo(2, 1, 0, 0, 1, 2); + Selection single = util.select().position(0, 3, 0); + Selection single2 = util.select().fromTo(1, 2, 1, 0, 2, 0); + Selection single3 = util.select().fromTo(2, 1, 0, 0, 1, 2); - ElementLink s1 = scene.world.showIndependentSection(single, Direction.DOWN); - scene.world.moveSection(s1, util.vector.of(2, -2, 2), 0); + ElementLink s1 = scene.world().showIndependentSection(single, Direction.DOWN); + scene.world().moveSection(s1, util.vector().of(2, -2, 2), 0); scene.idle(10); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("Fluid Tanks can be combined to increase the total capacity") .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.topOf(2, 1, 2)); + .pointAt(util.vector().topOf(2, 1, 2)); scene.idle(40); - ElementLink s2 = scene.world.showIndependentSection(single, Direction.DOWN); - scene.world.moveSection(s2, util.vector.of(2, -2, 3), 0); + ElementLink s2 = scene.world().showIndependentSection(single, Direction.DOWN); + scene.world().moveSection(s2, util.vector().of(2, -2, 3), 0); scene.idle(5); - ElementLink s3 = scene.world.showIndependentSection(single, Direction.DOWN); - scene.world.moveSection(s3, util.vector.of(3, -2, 3), 0); + ElementLink s3 = scene.world().showIndependentSection(single, Direction.DOWN); + scene.world().moveSection(s3, util.vector().of(3, -2, 3), 0); scene.idle(5); - ElementLink s4 = scene.world.showIndependentSection(single, Direction.DOWN); - scene.world.moveSection(s4, util.vector.of(3, -2, 2), 0); + ElementLink s4 = scene.world().showIndependentSection(single, Direction.DOWN); + scene.world().moveSection(s4, util.vector().of(3, -2, 2), 0); scene.idle(10); - scene.world.moveSection(s1, util.vector.of(0, -100, 0), 0); - scene.world.moveSection(s2, util.vector.of(0, -100, 0), 0); - scene.world.moveSection(s3, util.vector.of(0, -100, 0), 0); - scene.world.moveSection(s4, util.vector.of(0, -100, 0), 0); + scene.world().moveSection(s1, util.vector().of(0, -100, 0), 0); + scene.world().moveSection(s2, util.vector().of(0, -100, 0), 0); + scene.world().moveSection(s3, util.vector().of(0, -100, 0), 0); + scene.world().moveSection(s4, util.vector().of(0, -100, 0), 0); - ElementLink d = scene.world.showIndependentSectionImmediately(single2); - scene.world.moveSection(d, util.vector.of(2, -1, 2), 0); - scene.effects.indicateSuccess(util.grid.at(2, 1, 2)); - scene.effects.indicateSuccess(util.grid.at(3, 1, 2)); - scene.effects.indicateSuccess(util.grid.at(2, 1, 3)); - scene.effects.indicateSuccess(util.grid.at(3, 1, 3)); - scene.world.hideIndependentSection(s1, Direction.DOWN); - scene.world.hideIndependentSection(s2, Direction.DOWN); - scene.world.hideIndependentSection(s3, Direction.DOWN); - scene.world.hideIndependentSection(s4, Direction.DOWN); + ElementLink d = scene.world().showIndependentSectionImmediately(single2); + scene.world().moveSection(d, util.vector().of(2, -1, 2), 0); + scene.effects().indicateSuccess(util.grid().at(2, 1, 2)); + scene.effects().indicateSuccess(util.grid().at(3, 1, 2)); + scene.effects().indicateSuccess(util.grid().at(2, 1, 3)); + scene.effects().indicateSuccess(util.grid().at(3, 1, 3)); + scene.world().hideIndependentSection(s1, Direction.DOWN); + scene.world().hideIndependentSection(s2, Direction.DOWN); + scene.world().hideIndependentSection(s3, Direction.DOWN); + scene.world().hideIndependentSection(s4, Direction.DOWN); scene.idle(25); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("Their base square can be up to 3 blocks wide...") .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.topOf(2, 1, 2)); + .pointAt(util.vector().topOf(2, 1, 2)); scene.idle(40); - s1 = scene.world.showIndependentSection(single, Direction.DOWN); - scene.world.moveSection(s1, util.vector.of(2, -2, 4), 0); + s1 = scene.world().showIndependentSection(single, Direction.DOWN); + scene.world().moveSection(s1, util.vector().of(2, -2, 4), 0); scene.idle(3); - s2 = scene.world.showIndependentSection(single, Direction.DOWN); - scene.world.moveSection(s2, util.vector.of(3, -2, 4), 0); + s2 = scene.world().showIndependentSection(single, Direction.DOWN); + scene.world().moveSection(s2, util.vector().of(3, -2, 4), 0); scene.idle(3); - s3 = scene.world.showIndependentSection(single, Direction.DOWN); - scene.world.moveSection(s3, util.vector.of(4, -2, 4), 0); + s3 = scene.world().showIndependentSection(single, Direction.DOWN); + scene.world().moveSection(s3, util.vector().of(4, -2, 4), 0); scene.idle(3); - s4 = scene.world.showIndependentSection(single, Direction.DOWN); - scene.world.moveSection(s4, util.vector.of(4, -2, 3), 0); + s4 = scene.world().showIndependentSection(single, Direction.DOWN); + scene.world().moveSection(s4, util.vector().of(4, -2, 3), 0); scene.idle(3); - ElementLink s5 = scene.world.showIndependentSection(single, Direction.DOWN); - scene.world.moveSection(s5, util.vector.of(4, -2, 2), 0); + ElementLink s5 = scene.world().showIndependentSection(single, Direction.DOWN); + scene.world().moveSection(s5, util.vector().of(4, -2, 2), 0); scene.idle(10); - scene.world.moveSection(d, util.vector.of(0, -100, 0), 0); - scene.world.moveSection(s1, util.vector.of(0, -100, 0), 0); - scene.world.moveSection(s2, util.vector.of(0, -100, 0), 0); - scene.world.moveSection(s3, util.vector.of(0, -100, 0), 0); - scene.world.moveSection(s4, util.vector.of(0, -100, 0), 0); - scene.world.moveSection(s5, util.vector.of(0, -100, 0), 0); + scene.world().moveSection(d, util.vector().of(0, -100, 0), 0); + scene.world().moveSection(s1, util.vector().of(0, -100, 0), 0); + scene.world().moveSection(s2, util.vector().of(0, -100, 0), 0); + scene.world().moveSection(s3, util.vector().of(0, -100, 0), 0); + scene.world().moveSection(s4, util.vector().of(0, -100, 0), 0); + scene.world().moveSection(s5, util.vector().of(0, -100, 0), 0); - ElementLink t = scene.world.showIndependentSectionImmediately(single3); - scene.world.moveSection(t, util.vector.of(2, 0, 2), 0); + ElementLink t = scene.world().showIndependentSectionImmediately(single3); + scene.world().moveSection(t, util.vector().of(2, 0, 2), 0); for (int i = 2; i < 5; i++) for (int j = 2; j < 5; j++) - scene.effects.indicateSuccess(util.grid.at(i, 1, j)); + scene.effects().indicateSuccess(util.grid().at(i, 1, j)); - scene.world.hideIndependentSection(d, Direction.DOWN); - scene.world.hideIndependentSection(s1, Direction.DOWN); - scene.world.hideIndependentSection(s2, Direction.DOWN); - scene.world.hideIndependentSection(s3, Direction.DOWN); - scene.world.hideIndependentSection(s4, Direction.DOWN); - scene.world.hideIndependentSection(s5, Direction.DOWN); + scene.world().hideIndependentSection(d, Direction.DOWN); + scene.world().hideIndependentSection(s1, Direction.DOWN); + scene.world().hideIndependentSection(s2, Direction.DOWN); + scene.world().hideIndependentSection(s3, Direction.DOWN); + scene.world().hideIndependentSection(s4, Direction.DOWN); + scene.world().hideIndependentSection(s5, Direction.DOWN); scene.idle(25); - scene.world.hideIndependentSection(t, Direction.DOWN); + scene.world().hideIndependentSection(t, Direction.DOWN); scene.idle(10); - Selection full1 = util.select.fromTo(5, 1, 0, 5, 6, 0); - Selection full2 = util.select.fromTo(4, 1, 1, 3, 6, 2); - Selection full3 = util.select.fromTo(0, 6, 5, 2, 1, 3); + Selection full1 = util.select().fromTo(5, 1, 0, 5, 6, 0); + Selection full2 = util.select().fromTo(4, 1, 1, 3, 6, 2); + Selection full3 = util.select().fromTo(0, 6, 5, 2, 1, 3); - scene.world.showSection(full1, Direction.DOWN); + scene.world().showSection(full1, Direction.DOWN); scene.idle(5); - scene.world.showSection(full2, Direction.DOWN); + scene.world().showSection(full2, Direction.DOWN); scene.idle(5); - scene.world.showSection(full3, Direction.DOWN); + scene.world().showSection(full3, Direction.DOWN); scene.idle(10); - Vec3 blockSurface = util.vector.blockSurface(util.grid.at(3, 3, 1), Direction.WEST); - scene.overlay.showText(60) + Vec3 blockSurface = util.vector().blockSurface(util.grid().at(3, 3, 1), Direction.WEST); + scene.overlay().showText(60) .text("...and grow in height by more than 30 additional layers") .attachKeyFrame() .placeNearTarget() .pointAt(blockSurface); scene.idle(70); - scene.overlay.showControls( - new InputWindowElement(util.vector.blockSurface(util.grid.at(3, 3, 1), Direction.NORTH), Pointing.RIGHT) + scene.overlay().showControls( + new InputWindowElement(util.vector().blockSurface(util.grid().at(3, 3, 1), Direction.NORTH), Pointing.RIGHT) .rightClick() .withItem(AllItems.WRENCH.asStack()), 60); scene.idle(7); - scene.world.modifyBlocks(full2, s -> s.setValue(FluidTankBlock.SHAPE, FluidTankBlock.Shape.PLAIN), false); + scene.world().modifyBlocks(full2, s -> s.setValue(FluidTankBlock.SHAPE, FluidTankBlock.Shape.PLAIN), false); scene.idle(30); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("Using a Wrench, a tanks' window can be toggled") .attachKeyFrame() .placeNearTarget() @@ -356,71 +356,71 @@ public class FluidTankScenes { scene.showBasePlate(); scene.idle(5); - Selection largeCog = util.select.position(5, 0, 2); - Selection cTank = util.select.fromTo(3, 1, 1, 3, 2, 1); - Selection tank = util.select.fromTo(1, 1, 3, 1, 3, 3); - Selection pipes = util.select.fromTo(3, 1, 2, 2, 1, 3); - Selection cog = util.select.position(4, 1, 2); - BlockPos cTankPos = util.grid.at(3, 1, 1); - BlockPos pumpPos = util.grid.at(3, 1, 2); + Selection largeCog = util.select().position(5, 0, 2); + Selection cTank = util.select().fromTo(3, 1, 1, 3, 2, 1); + Selection tank = util.select().fromTo(1, 1, 3, 1, 3, 3); + Selection pipes = util.select().fromTo(3, 1, 2, 2, 1, 3); + Selection cog = util.select().position(4, 1, 2); + BlockPos cTankPos = util.grid().at(3, 1, 1); + BlockPos pumpPos = util.grid().at(3, 1, 2); - ElementLink cTankLink = scene.world.showIndependentSection(cTank, Direction.DOWN); - scene.world.moveSection(cTankLink, util.vector.of(-1, 0, 1), 0); + ElementLink cTankLink = scene.world().showIndependentSection(cTank, Direction.DOWN); + scene.world().moveSection(cTankLink, util.vector().of(-1, 0, 1), 0); - scene.overlay.showText(70) + scene.overlay().showText(70) .text("Creative Fluid Tanks can be used to provide a bottomless supply of fluid") .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.blockSurface(util.grid.at(2, 2, 2), Direction.WEST)); + .pointAt(util.vector().blockSurface(util.grid().at(2, 2, 2), Direction.WEST)); scene.idle(80); ItemStack bucket = new ItemStack(Items.LAVA_BUCKET); - scene.overlay.showControls( - new InputWindowElement(util.vector.blockSurface(util.grid.at(2, 2, 2), Direction.NORTH), Pointing.RIGHT) + scene.overlay().showControls( + new InputWindowElement(util.vector().blockSurface(util.grid().at(2, 2, 2), Direction.NORTH), Pointing.RIGHT) .rightClick() .withItem(bucket), 40); scene.idle(7); - scene.world.modifyBlockEntity(cTankPos, CreativeFluidTankBlockEntity.class, + scene.world().modifyBlockEntity(cTankPos, CreativeFluidTankBlockEntity.class, be -> ((CreativeSmartFluidTank) be.getTankInventory()) .setContainedFluid(new FluidStack(Fluids.FLOWING_LAVA, 1000))); scene.idle(5); - scene.overlay.showText(50) + scene.overlay().showText(50) .text("Right-Click with a fluid containing item to configure it") .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.blockSurface(util.grid.at(2, 2, 2), Direction.WEST)); + .pointAt(util.vector().blockSurface(util.grid().at(2, 2, 2), Direction.WEST)); scene.idle(60); - scene.world.moveSection(cTankLink, util.vector.of(1, 0, -1), 6); + scene.world().moveSection(cTankLink, util.vector().of(1, 0, -1), 6); scene.idle(7); - scene.world.showSection(tank, Direction.DOWN); + scene.world().showSection(tank, Direction.DOWN); scene.idle(5); scene.rotateCameraY(-30); - scene.world.showSection(largeCog, Direction.UP); - scene.world.showSection(cog, Direction.NORTH); - scene.world.showSection(pipes, Direction.NORTH); - scene.world.modifyBlock(pumpPos, s -> s.setValue(PumpBlock.FACING, Direction.SOUTH), false); - scene.world.propagatePipeChange(pumpPos); + scene.world().showSection(largeCog, Direction.UP); + scene.world().showSection(cog, Direction.NORTH); + scene.world().showSection(pipes, Direction.NORTH); + scene.world().modifyBlock(pumpPos, s -> s.setValue(PumpBlock.FACING, Direction.SOUTH), false); + scene.world().propagatePipeChange(pumpPos); scene.idle(40); - scene.overlay.showText(70) + scene.overlay().showText(70) .text("Pipe Networks can now endlessly draw the assigned fluid from the tank") .attachKeyFrame() - .pointAt(util.vector.blockSurface(util.grid.at(3, 1, 2), Direction.WEST)); + .pointAt(util.vector().blockSurface(util.grid().at(3, 1, 2), Direction.WEST)); scene.idle(120); - scene.world.modifyBlock(pumpPos, s -> s.setValue(PumpBlock.FACING, Direction.NORTH), true); - scene.world.propagatePipeChange(pumpPos); + scene.world().modifyBlock(pumpPos, s -> s.setValue(PumpBlock.FACING, Direction.NORTH), true); + scene.world().propagatePipeChange(pumpPos); scene.idle(40); - scene.overlay.showText(70) + scene.overlay().showText(70) .text("Any Fluids pushed back into a Creative Fluid Tank will be voided") .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.blockSurface(util.grid.at(3, 1, 2), Direction.WEST)); + .pointAt(util.vector().blockSurface(util.grid().at(3, 1, 2), Direction.WEST)); scene.idle(40); } diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/HosePulleyScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/HosePulleyScenes.java index e26889614c..b84a9bc3eb 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/HosePulleyScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/HosePulleyScenes.java @@ -10,10 +10,10 @@ import com.simibubi.create.content.fluids.pump.PumpBlock; import com.simibubi.create.content.fluids.tank.FluidTankBlockEntity; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; import net.createmod.ponder.foundation.ElementLink; import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.SceneBuilder; -import net.createmod.ponder.foundation.SceneBuildingUtil; import net.createmod.ponder.foundation.Selection; import net.createmod.ponder.foundation.element.WorldSectionElement; import net.minecraft.core.BlockPos; @@ -37,125 +37,125 @@ public class HosePulleyScenes { scene.showBasePlate(); scene.idle(5); - Selection cogs = util.select.fromTo(3, 1, 2, 3, 2, 2); - Selection pipes = util.select.fromTo(3, 1, 1, 3, 5, 1) - .add(util.select.position(2, 5, 1)); - BlockPos hosePos = util.grid.at(1, 5, 1); - Selection hose = util.select.position(1, 5, 1); - Selection crank = util.select.position(0, 5, 1); + Selection cogs = util.select().fromTo(3, 1, 2, 3, 2, 2); + Selection pipes = util.select().fromTo(3, 1, 1, 3, 5, 1) + .add(util.select().position(2, 5, 1)); + BlockPos hosePos = util.grid().at(1, 5, 1); + Selection hose = util.select().position(1, 5, 1); + Selection crank = util.select().position(0, 5, 1); - ElementLink hoselink = scene.world.showIndependentSection(hose, Direction.UP); - scene.world.moveSection(hoselink, util.vector.of(0, -1, 0), 0); + ElementLink hoselink = scene.world().showIndependentSection(hose, Direction.UP); + scene.world().moveSection(hoselink, util.vector().of(0, -1, 0), 0); scene.idle(10); - Vec3 shaftInput = util.vector.blockSurface(hosePos.below(), Direction.WEST); - scene.overlay.showText(70) + Vec3 shaftInput = util.vector().blockSurface(hosePos.below(), Direction.WEST); + scene.overlay().showText(70) .text("Hose Pulleys can be used to fill or drain large bodies of Fluid") .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.topOf(hosePos.below())); + .pointAt(util.vector().topOf(hosePos.below())); scene.idle(80); - scene.overlay.showText(80) + scene.overlay().showText(80) .text("With the Kinetic Input, the height of the pulleys' hose can be controlled") .attachKeyFrame() .placeNearTarget() .pointAt(shaftInput); scene.idle(40); - scene.world.showSectionAndMerge(crank, Direction.EAST, hoselink); + scene.world().showSectionAndMerge(crank, Direction.EAST, hoselink); scene.idle(20); - Selection kinetics = util.select.fromTo(1, 5, 1, 0, 5, 1); - scene.world.setKineticSpeed(kinetics, 32); + Selection kinetics = util.select().fromTo(1, 5, 1, 0, 5, 1); + scene.world().setKineticSpeed(kinetics, 32); scene.idle(50); - scene.world.setKineticSpeed(kinetics, 0); - scene.overlay.showText(80) + scene.world().setKineticSpeed(kinetics, 0); + scene.overlay().showText(80) .text("The Pulley retracts while the input rotation is inverted") .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.centerOf(hosePos.below(3))); + .pointAt(util.vector().centerOf(hosePos.below(3))); scene.idle(30); - scene.world.setKineticSpeed(kinetics, -32); + scene.world().setKineticSpeed(kinetics, -32); scene.idle(16); - scene.world.setKineticSpeed(kinetics, 0); + scene.world().setKineticSpeed(kinetics, 0); scene.idle(10); scene.rotateCameraY(70); scene.idle(40); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("On the opposite side, pipes can be connected") .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.blockSurface(hosePos.below(), Direction.EAST)); + .pointAt(util.vector().blockSurface(hosePos.below(), Direction.EAST)); scene.idle(70); scene.rotateCameraY(-70); scene.idle(10); - scene.world.showSectionAndMerge(cogs, Direction.NORTH, hoselink); - scene.world.showSectionAndMerge(pipes, Direction.WEST, hoselink); - scene.world.showSection(util.select.fromTo(0, 1, 0, 2, 2, 2), Direction.UP); + scene.world().showSectionAndMerge(cogs, Direction.NORTH, hoselink); + scene.world().showSectionAndMerge(pipes, Direction.WEST, hoselink); + scene.world().showSection(util.select().fromTo(0, 1, 0, 2, 2, 2), Direction.UP); scene.idle(10); - scene.overlay.showText(70) + scene.overlay().showText(70) .text("Attached pipe networks can either provide fluid to the hose...") .attachKeyFrame() - .pointAt(util.vector.centerOf(util.grid.at(3, 1, 1))); + .pointAt(util.vector().centerOf(util.grid().at(3, 1, 1))); scene.idle(40); List blocks = new LinkedList<>(); for (int y = 1; y < 3; y++) { - blocks.add(util.grid.at(1, y, 1)); - blocks.add(util.grid.at(0, y, 1)); - blocks.add(util.grid.at(1, y, 0)); - blocks.add(util.grid.at(2, y, 1)); - blocks.add(util.grid.at(1, y, 2)); - blocks.add(util.grid.at(0, y, 0)); - blocks.add(util.grid.at(2, y, 0)); - blocks.add(util.grid.at(2, y, 2)); - blocks.add(util.grid.at(0, y, 2)); + blocks.add(util.grid().at(1, y, 1)); + blocks.add(util.grid().at(0, y, 1)); + blocks.add(util.grid().at(1, y, 0)); + blocks.add(util.grid().at(2, y, 1)); + blocks.add(util.grid().at(1, y, 2)); + blocks.add(util.grid().at(0, y, 0)); + blocks.add(util.grid().at(2, y, 0)); + blocks.add(util.grid().at(2, y, 2)); + blocks.add(util.grid().at(0, y, 2)); } for (BlockPos blockPos : blocks) { - scene.world.setBlock(blockPos, Blocks.WATER.defaultBlockState(), false); + scene.world().setBlock(blockPos, Blocks.WATER.defaultBlockState(), false); scene.idle(3); } - scene.world.modifyBlockEntity(util.grid.at(1, 5, 1), HosePulleyBlockEntity.class, be -> be + scene.world().modifyBlockEntity(util.grid().at(1, 5, 1), HosePulleyBlockEntity.class, be -> be .getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) .ifPresent( ifh -> ((HosePulleyFluidHandler) ifh).fill(new FluidStack(Fluids.WATER, 100), FluidAction.EXECUTE))); scene.idle(20); - scene.world.modifyBlock(util.grid.at(3, 2, 1), s -> s.setValue(PumpBlock.FACING, Direction.DOWN), true); - scene.world.propagatePipeChange(util.grid.at(3, 2, 1)); + scene.world().modifyBlock(util.grid().at(3, 2, 1), s -> s.setValue(PumpBlock.FACING, Direction.DOWN), true); + scene.world().propagatePipeChange(util.grid().at(3, 2, 1)); scene.idle(20); - scene.world.setKineticSpeed(kinetics, 32); + scene.world().setKineticSpeed(kinetics, 32); scene.idle(16); - scene.world.setKineticSpeed(kinetics, 0); + scene.world().setKineticSpeed(kinetics, 0); scene.idle(5); - scene.overlay.showText(70) + scene.overlay().showText(70) .text("...or pull from it, draining the pool instead") .attachKeyFrame() - .pointAt(util.vector.centerOf(util.grid.at(3, 1, 1))); + .pointAt(util.vector().centerOf(util.grid().at(3, 1, 1))); scene.idle(40); Collections.reverse(blocks); for (BlockPos blockPos : blocks) { - scene.world.destroyBlock(blockPos); + scene.world().destroyBlock(blockPos); scene.idle(3); } scene.idle(20); - scene.overlay.showText(120) + scene.overlay().showText(120) .text("Fill and Drain speed of the pulley depends entirely on the fluid networks' throughput") .placeNearTarget() .colored(PonderPalette.MEDIUM) .attachKeyFrame() - .pointAt(util.vector.centerOf(util.grid.at(3, 1, 1))); + .pointAt(util.vector().centerOf(util.grid().at(3, 1, 1))); scene.idle(40); scene.markAsFinished(); @@ -171,74 +171,74 @@ public class HosePulleyScenes { List blocks = new LinkedList<>(); for (int y = 1; y < 4; y++) { - blocks.add(util.grid.at(1, y, 1)); - blocks.add(util.grid.at(0, y, 1)); - blocks.add(util.grid.at(1, y, 0)); - blocks.add(util.grid.at(2, y, 1)); - blocks.add(util.grid.at(1, y, 2)); - blocks.add(util.grid.at(0, y, 0)); - blocks.add(util.grid.at(2, y, 0)); - blocks.add(util.grid.at(2, y, 2)); - blocks.add(util.grid.at(0, y, 2)); + blocks.add(util.grid().at(1, y, 1)); + blocks.add(util.grid().at(0, y, 1)); + blocks.add(util.grid().at(1, y, 0)); + blocks.add(util.grid().at(2, y, 1)); + blocks.add(util.grid().at(1, y, 2)); + blocks.add(util.grid().at(0, y, 0)); + blocks.add(util.grid().at(2, y, 0)); + blocks.add(util.grid().at(2, y, 2)); + blocks.add(util.grid().at(0, y, 2)); } for (BlockPos blockPos : blocks) - scene.world.setBlock(blockPos, Blocks.WATER.defaultBlockState(), false); + scene.world().setBlock(blockPos, Blocks.WATER.defaultBlockState(), false); scene.idle(5); - Selection water = util.select.fromTo(2, 1, 0, 0, 4, 2); - scene.world.showSection(water, Direction.UP); + Selection water = util.select().fromTo(2, 1, 0, 0, 4, 2); + scene.world().showSection(water, Direction.UP); scene.idle(10); - Selection cogs = util.select.fromTo(3, 1, 2, 3, 2, 2); - Selection pipes = util.select.fromTo(3, 1, 1, 3, 6, 1) - .add(util.select.position(2, 6, 1)); - BlockPos hosePos = util.grid.at(1, 6, 1); - Selection hose = util.select.position(1, 6, 1); - Selection crank = util.select.position(0, 6, 1); + Selection cogs = util.select().fromTo(3, 1, 2, 3, 2, 2); + Selection pipes = util.select().fromTo(3, 1, 1, 3, 6, 1) + .add(util.select().position(2, 6, 1)); + BlockPos hosePos = util.grid().at(1, 6, 1); + Selection hose = util.select().position(1, 6, 1); + Selection crank = util.select().position(0, 6, 1); - ElementLink hoselink = scene.world.showIndependentSection(hose, Direction.DOWN); - scene.world.moveSection(hoselink, util.vector.of(0, -1, 0), 0); + ElementLink hoselink = scene.world().showIndependentSection(hose, Direction.DOWN); + scene.world().moveSection(hoselink, util.vector().of(0, -1, 0), 0); scene.idle(10); - scene.world.showSectionAndMerge(crank, Direction.EAST, hoselink); + scene.world().showSectionAndMerge(crank, Direction.EAST, hoselink); scene.idle(20); - scene.overlay.showSelectionWithText(util.select.position(hosePos.below()), 50) + scene.overlay().showSelectionWithText(util.select().position(hosePos.below()), 50) .text("While fully retracted, the Hose Pulley cannot operate") .placeNearTarget() .colored(PonderPalette.RED) .attachKeyFrame() - .pointAt(util.vector.blockSurface(hosePos.below(), Direction.UP)); + .pointAt(util.vector().blockSurface(hosePos.below(), Direction.UP)); scene.idle(55); - scene.world.modifyBlock(util.grid.at(3, 2, 1), s -> s.setValue(PumpBlock.FACING, Direction.DOWN), false); - Selection kinetics = util.select.fromTo(1, 6, 1, 0, 6, 1); - scene.world.setKineticSpeed(kinetics, 32); + scene.world().modifyBlock(util.grid().at(3, 2, 1), s -> s.setValue(PumpBlock.FACING, Direction.DOWN), false); + Selection kinetics = util.select().fromTo(1, 6, 1, 0, 6, 1); + scene.world().setKineticSpeed(kinetics, 32); scene.idle(50); - scene.world.setKineticSpeed(kinetics, 0); - scene.overlay.showText(40) + scene.world().setKineticSpeed(kinetics, 0); + scene.overlay().showText(40) .text("Draining runs from top to bottom") .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.centerOf(hosePos.below(3))); + .pointAt(util.vector().centerOf(hosePos.below(3))); scene.idle(10); - scene.world.showSectionAndMerge(cogs, Direction.NORTH, hoselink); - scene.world.showSectionAndMerge(pipes, Direction.WEST, hoselink); - scene.world.modifyBlockEntity(util.grid.at(1, 6, 1), HosePulleyBlockEntity.class, + scene.world().showSectionAndMerge(cogs, Direction.NORTH, hoselink); + scene.world().showSectionAndMerge(pipes, Direction.WEST, hoselink); + scene.world().modifyBlockEntity(util.grid().at(1, 6, 1), HosePulleyBlockEntity.class, be -> be.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) .ifPresent( fh -> ((HosePulleyFluidHandler) fh).fill(new FluidStack(Fluids.WATER, 100), FluidAction.EXECUTE))); - scene.world.propagatePipeChange(util.grid.at(3, 2, 1)); + scene.world().propagatePipeChange(util.grid().at(3, 2, 1)); - Vec3 surface = util.vector.topOf(1, 3, 1) + Vec3 surface = util.vector().topOf(1, 3, 1) .subtract(0, 2 / 8f, 0); AABB bb = new AABB(surface, surface).inflate(1.5, 0, 1.5); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, bb, bb, 3); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.MEDIUM, bb, bb, 3); scene.idle(3); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, bb, bb.expandTowards(0, -2, 0), 70); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.MEDIUM, bb, bb.expandTowards(0, -2, 0), 70); scene.idle(20); Collections.reverse(blocks); @@ -246,60 +246,60 @@ public class HosePulleyScenes { for (BlockPos blockPos : blocks) { if (i++ == 18) break; - scene.world.destroyBlock(blockPos); + scene.world().destroyBlock(blockPos); scene.idle(3); } - scene.overlay.chaseBoundingBoxOutline(PonderPalette.WHITE, bb, bb.move(0, -2, 0), 60); - scene.overlay.showText(60) + scene.overlay().chaseBoundingBoxOutline(PonderPalette.WHITE, bb, bb.move(0, -2, 0), 60); + scene.overlay().showText(60) .text("The surface level will end up just below where the hose ends") .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.of(0, 2 - 1 / 8f, 1.5f)); + .pointAt(util.vector().of(0, 2 - 1 / 8f, 1.5f)); scene.idle(30); scene.idle(30); - scene.world.hideSection(water, Direction.SOUTH); + scene.world().hideSection(water, Direction.SOUTH); scene.idle(15); for (BlockPos blockPos : blocks) - scene.world.destroyBlock(blockPos); - scene.world.showSection(water, Direction.UP); + scene.world().destroyBlock(blockPos); + scene.world().showSection(water, Direction.UP); scene.idle(15); - scene.world.setKineticSpeed(kinetics, -32); - scene.world.modifyBlock(util.grid.at(3, 2, 1), s -> s.setValue(PumpBlock.FACING, Direction.UP), true); - scene.world.propagatePipeChange(util.grid.at(3, 2, 1)); + scene.world().setKineticSpeed(kinetics, -32); + scene.world().modifyBlock(util.grid().at(3, 2, 1), s -> s.setValue(PumpBlock.FACING, Direction.UP), true); + scene.world().propagatePipeChange(util.grid().at(3, 2, 1)); scene.idle(16); - scene.world.setKineticSpeed(kinetics, 0); + scene.world().setKineticSpeed(kinetics, 0); - scene.overlay.showText(40) + scene.overlay().showText(40) .text("Filling runs from bottom to top") .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.centerOf(hosePos.below(3))); + .pointAt(util.vector().centerOf(hosePos.below(3))); scene.idle(10); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, bb, bb.move(0, -3 + 2 / 8f, 0), 3); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.MEDIUM, bb, bb.move(0, -3 + 2 / 8f, 0), 3); scene.idle(3); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, bb, bb.expandTowards(0, -3 + 2 / 8f, 0), 120); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.MEDIUM, bb, bb.expandTowards(0, -3 + 2 / 8f, 0), 120); scene.idle(20); - scene.world.setBlock(util.grid.at(1, 3, 1), Blocks.WATER.defaultBlockState(), false); + scene.world().setBlock(util.grid().at(1, 3, 1), Blocks.WATER.defaultBlockState(), false); scene.idle(3); - scene.world.setBlock(util.grid.at(1, 2, 1), Blocks.WATER.defaultBlockState(), false); + scene.world().setBlock(util.grid().at(1, 2, 1), Blocks.WATER.defaultBlockState(), false); scene.idle(3); Collections.reverse(blocks); for (BlockPos blockPos : blocks) { - scene.world.setBlock(blockPos, Blocks.WATER.defaultBlockState(), false); + scene.world().setBlock(blockPos, Blocks.WATER.defaultBlockState(), false); scene.idle(3); } - scene.overlay.chaseBoundingBoxOutline(PonderPalette.WHITE, bb, bb, 100); - scene.overlay.showText(100) + scene.overlay().chaseBoundingBoxOutline(PonderPalette.WHITE, bb, bb, 100); + scene.overlay().showText(100) .text("The filled pool will not grow beyond the layer above the hose end") .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.of(0, 4 - 1 / 8f, 1.5f)); + .pointAt(util.vector().of(0, 4 - 1 / 8f, 1.5f)); scene.idle(80); } @@ -312,65 +312,65 @@ public class HosePulleyScenes { scene.showBasePlate(); scene.idle(5); - Selection tank = util.select.fromTo(4, 1, 1, 4, 3, 1); - Selection pipes = util.select.fromTo(3, 1, 1, 2, 3, 2); - Selection kinetics = util.select.fromTo(5, 1, 2, 4, 2, 2) - .add(util.select.position(5, 0, 2)); - Selection hose = util.select.fromTo(1, 3, 2, 0, 3, 2); - BlockPos pumpPos = util.grid.at(3, 2, 2); + Selection tank = util.select().fromTo(4, 1, 1, 4, 3, 1); + Selection pipes = util.select().fromTo(3, 1, 1, 2, 3, 2); + Selection kinetics = util.select().fromTo(5, 1, 2, 4, 2, 2) + .add(util.select().position(5, 0, 2)); + Selection hose = util.select().fromTo(1, 3, 2, 0, 3, 2); + BlockPos pumpPos = util.grid().at(3, 2, 2); - scene.world.multiplyKineticSpeed(kinetics, 0.25f); - scene.world.multiplyKineticSpeed(util.select.position(pumpPos), 0.25f); + scene.world().multiplyKineticSpeed(kinetics, 0.25f); + scene.world().multiplyKineticSpeed(util.select().position(pumpPos), 0.25f); - scene.world.showSection(hose, Direction.UP); + scene.world().showSection(hose, Direction.UP); scene.idle(5); - scene.world.showSection(tank, Direction.DOWN); + scene.world().showSection(tank, Direction.DOWN); scene.idle(10); - scene.world.showSection(pipes, Direction.NORTH); + scene.world().showSection(pipes, Direction.NORTH); scene.idle(5); - scene.world.showSection(kinetics, Direction.DOWN); + scene.world().showSection(kinetics, Direction.DOWN); scene.idle(10); - scene.world.setKineticSpeed(hose, 32); + scene.world().setKineticSpeed(hose, 32); scene.idle(10); - Vec3 entryPoint = util.vector.topOf(1, 0, 2); - scene.overlay.showText(60) + Vec3 entryPoint = util.vector().topOf(1, 0, 2); + scene.overlay().showText(60) .text("When deploying the Hose Pulley into a large enough ocean...") .attachKeyFrame() .placeNearTarget() .pointAt(entryPoint); scene.idle(40); - scene.world.modifyBlockEntity(util.grid.at(1, 3, 2), HosePulleyBlockEntity.class, + scene.world().modifyBlockEntity(util.grid().at(1, 3, 2), HosePulleyBlockEntity.class, be -> be.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) .ifPresent( fh -> ((HosePulleyFluidHandler) fh).fill(new FluidStack(Fluids.WATER, 1000), FluidAction.EXECUTE))); - scene.world.setKineticSpeed(hose, 0); - scene.world.modifyBlock(pumpPos, s -> s.setValue(PumpBlock.FACING, Direction.DOWN), true); - scene.world.propagatePipeChange(pumpPos); + scene.world().setKineticSpeed(hose, 0); + scene.world().modifyBlock(pumpPos, s -> s.setValue(PumpBlock.FACING, Direction.DOWN), true); + scene.world().propagatePipeChange(pumpPos); scene.idle(30); - Selection pulleyPos = util.select.position(1, 3, 2); - scene.overlay.showSelectionWithText(pulleyPos, 60) + Selection pulleyPos = util.select().position(1, 3, 2); + scene.overlay().showSelectionWithText(pulleyPos, 60) .text("It will provide/dispose fluids without affecting the source") .attachKeyFrame() .colored(PonderPalette.BLUE) .placeNearTarget() - .pointAt(util.vector.topOf(util.grid.at(1, 3, 2))); + .pointAt(util.vector().topOf(util.grid().at(1, 3, 2))); scene.idle(60); - scene.world.modifyBlockEntity(util.grid.at(4, 1, 1), FluidTankBlockEntity.class, be -> be.getTankInventory() + scene.world().modifyBlockEntity(util.grid().at(4, 1, 1), FluidTankBlockEntity.class, be -> be.getTankInventory() .fill(new FluidStack(Fluids.WATER, 24000), FluidAction.EXECUTE)); scene.idle(20); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("Pipe networks can limitlessly take fluids from/to such pulleys") .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.blockSurface(util.grid.at(3, 2, 2), Direction.WEST)); + .pointAt(util.vector().blockSurface(util.grid().at(3, 2, 2), Direction.WEST)); scene.idle(40); } diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/PipeScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/PipeScenes.java index 1fdc2e2aa0..aefb138ba3 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/PipeScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/PipeScenes.java @@ -18,10 +18,10 @@ import com.simibubi.create.foundation.fluid.FluidHelper; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; import net.createmod.ponder.foundation.ElementLink; import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.SceneBuilder; -import net.createmod.ponder.foundation.SceneBuildingUtil; import net.createmod.ponder.foundation.Selection; import net.createmod.ponder.foundation.element.InputWindowElement; import net.createmod.ponder.foundation.element.WorldSectionElement; @@ -55,129 +55,129 @@ public class PipeScenes { .setValue(FluidPipeBlock.UP, false) .setValue(FluidPipeBlock.DOWN, false); - scene.world.setBlock(util.grid.at(2, 1, 1), pipeState.setValue(FluidPipeBlock.NORTH, false) + scene.world().setBlock(util.grid().at(2, 1, 1), pipeState.setValue(FluidPipeBlock.NORTH, false) .setValue(FluidPipeBlock.SOUTH, false), false); - scene.world.setBlock(util.grid.at(1, 1, 2), pipeState.setValue(FluidPipeBlock.WEST, false) + scene.world().setBlock(util.grid().at(1, 1, 2), pipeState.setValue(FluidPipeBlock.WEST, false) .setValue(FluidPipeBlock.EAST, false), false); - Selection largeCog = util.select.position(5, 0, 1); - Selection kinetics = util.select.fromTo(5, 1, 0, 3, 1, 0); - Selection tank = util.select.fromTo(4, 1, 2, 4, 2, 2); - Selection tank2 = util.select.fromTo(0, 1, 3, 0, 2, 3); + Selection largeCog = util.select().position(5, 0, 1); + Selection kinetics = util.select().fromTo(5, 1, 0, 3, 1, 0); + Selection tank = util.select().fromTo(4, 1, 2, 4, 2, 2); + Selection tank2 = util.select().fromTo(0, 1, 3, 0, 2, 3); - Selection strayPipes = util.select.fromTo(2, 1, 2, 2, 2, 2) - .add(util.select.fromTo(1, 2, 2, 1, 3, 2)); + Selection strayPipes = util.select().fromTo(2, 1, 2, 2, 2, 2) + .add(util.select().fromTo(1, 2, 2, 1, 3, 2)); - scene.world.showSection(tank, Direction.DOWN); + scene.world().showSection(tank, Direction.DOWN); scene.idle(5); - scene.world.showSection(tank2, Direction.DOWN); + scene.world().showSection(tank2, Direction.DOWN); FluidStack content = new FluidStack(Fluids.LAVA, 10000); - scene.world.modifyBlockEntity(util.grid.at(4, 1, 2), FluidTankBlockEntity.class, be -> be.getTankInventory() + scene.world().modifyBlockEntity(util.grid().at(4, 1, 2), FluidTankBlockEntity.class, be -> be.getTankInventory() .fill(content, FluidAction.EXECUTE)); scene.idle(10); for (int i = 4; i >= 1; i--) { - scene.world.showSection(util.select.position(i, 1, 1), i == 4 ? Direction.SOUTH : Direction.EAST); + scene.world().showSection(util.select().position(i, 1, 1), i == 4 ? Direction.SOUTH : Direction.EAST); scene.idle(3); } - scene.overlay.showText(60) + scene.overlay().showText(60) .text("Fluid Pipes can connect two or more fluid sources and targets") .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.topOf(1, 1, 1)); + .pointAt(util.vector().topOf(1, 1, 1)); for (int i = 2; i <= 3; i++) { - scene.world.showSection(util.select.position(1, 1, i), Direction.NORTH); + scene.world().showSection(util.select().position(1, 1, i), Direction.NORTH); scene.idle(3); } scene.idle(60); - scene.overlay.showControls(new InputWindowElement(util.vector.centerOf(2, 1, 1), Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(util.vector().centerOf(2, 1, 1), Pointing.DOWN).rightClick() .withItem(AllItems.WRENCH.asStack()), 40); scene.idle(7); - scene.world.restoreBlocks(util.select.position(2, 1, 1)); - scene.overlay.showText(70) + scene.world().restoreBlocks(util.select().position(2, 1, 1)); + scene.overlay().showText(70) .attachKeyFrame() - .pointAt(util.vector.centerOf(2, 1, 1)) + .pointAt(util.vector().centerOf(2, 1, 1)) .placeNearTarget() .text("Using a wrench, a straight pipe segment can be given a window"); scene.idle(40); - scene.overlay.showControls(new InputWindowElement(util.vector.centerOf(1, 1, 2), Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(util.vector().centerOf(1, 1, 2), Pointing.DOWN).rightClick() .withItem(AllItems.WRENCH.asStack()), 10); scene.idle(7); - scene.world.restoreBlocks(util.select.position(1, 1, 2)); + scene.world().restoreBlocks(util.select().position(1, 1, 2)); scene.idle(40); - Vec3 center = util.vector.centerOf(2, 1, 2); + Vec3 center = util.vector().centerOf(2, 1, 2); AABB bb = new AABB(center, center).inflate(1 / 6f); AABB bb1 = bb.move(-0.5, 0, 0); AABB bb2 = bb.move(0, 0, -0.5); - scene.world.showSection(strayPipes, Direction.DOWN); + scene.world().showSection(strayPipes, Direction.DOWN); scene.idle(10); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, bb1, bb, 1); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, bb2, bb, 1); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.RED, bb1, bb, 1); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.RED, bb2, bb, 1); scene.idle(1); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, bb1, bb1, 50); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, bb2, bb2, 50); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.RED, bb1, bb1, 50); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.RED, bb2, bb2, 50); scene.idle(10); - scene.overlay.showText(55) + scene.overlay().showText(55) .attachKeyFrame() - .pointAt(util.vector.centerOf(2, 1, 2)) + .pointAt(util.vector().centerOf(2, 1, 2)) .placeNearTarget() .colored(PonderPalette.RED) .text("Windowed pipes will not connect to any other adjacent pipe segments"); scene.idle(60); - scene.world.hideSection(strayPipes, Direction.UP); + scene.world().hideSection(strayPipes, Direction.UP); scene.idle(10); - BlockPos pumpPos = util.grid.at(3, 1, 1); - scene.world.setBlock(pumpPos, AllBlocks.MECHANICAL_PUMP.getDefaultState() + BlockPos pumpPos = util.grid().at(3, 1, 1); + scene.world().setBlock(pumpPos, AllBlocks.MECHANICAL_PUMP.getDefaultState() .setValue(PumpBlock.FACING, Direction.WEST), true); scene.idle(10); - scene.world.showSection(largeCog, Direction.UP); - scene.world.showSection(kinetics, Direction.SOUTH); + scene.world().showSection(largeCog, Direction.UP); + scene.world().showSection(kinetics, Direction.SOUTH); scene.idle(10); - scene.world.multiplyKineticSpeed(util.select.everywhere(), 0.25f); - scene.world.setKineticSpeed(util.select.position(pumpPos), 8); - scene.world.propagatePipeChange(pumpPos); + scene.world().multiplyKineticSpeed(util.select().everywhere(), 0.25f); + scene.world().setKineticSpeed(util.select().position(pumpPos), 8); + scene.world().propagatePipeChange(pumpPos); - scene.overlay.showText(70) + scene.overlay().showText(70) .attachKeyFrame() - .pointAt(util.vector.topOf(pumpPos)) + .pointAt(util.vector().topOf(pumpPos)) .placeNearTarget() .text("Powered by Mechanical Pumps, the Pipes can transport Fluids"); scene.idle(85); - scene.overlay.showSelectionWithText(tank, 40) + scene.overlay().showSelectionWithText(tank, 40) .colored(PonderPalette.RED) .placeNearTarget() .text("No fluid is being extracted at first"); scene.idle(70); - scene.overlay.showOutline(PonderPalette.GREEN, new Object(), tank, 100); + scene.overlay().showOutline(PonderPalette.GREEN, new Object(), tank, 100); scene.idle(5); - scene.overlay.showOutline(PonderPalette.GREEN, new Object(), tank2, 100); + scene.overlay().showOutline(PonderPalette.GREEN, new Object(), tank2, 100); scene.idle(5); - scene.overlay.showText(100) + scene.overlay().showText(100) .attachKeyFrame() .independent() .text("Once the flow connects them, the endpoints gradually transfer their contents"); - scene.overlay.showLine(PonderPalette.GREEN, util.vector.blockSurface(util.grid.at(4, 2, 2), Direction.WEST), - util.vector.blockSurface(util.grid.at(0, 2, 3), Direction.EAST), 80); + scene.overlay().showLine(PonderPalette.GREEN, util.vector().blockSurface(util.grid().at(4, 2, 2), Direction.WEST), + util.vector().blockSurface(util.grid().at(0, 2, 3), Direction.EAST), 80); - scene.world.multiplyKineticSpeed(util.select.everywhere(), 2); - scene.world.propagatePipeChange(pumpPos); - scene.effects.rotationSpeedIndicator(pumpPos); + scene.world().multiplyKineticSpeed(util.select().everywhere(), 2); + scene.world().propagatePipeChange(pumpPos); + scene.effects().rotationSpeedIndicator(pumpPos); scene.idle(120); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("Thus, the Pipe blocks themselves never 'physically' contain any fluid") .placeNearTarget() - .pointAt(util.vector.topOf(1, 1, 1)); + .pointAt(util.vector().topOf(1, 1, 1)); scene.idle(50); } @@ -188,123 +188,123 @@ public class PipeScenes { scene.showBasePlate(); scene.idle(5); - BlockPos pumpPos = util.grid.at(2, 1, 4); - Selection largeCog = util.select.position(5, 0, 4); - Selection kinetics = util.select.fromTo(5, 1, 5, 2, 1, 5); - Selection pipes = util.select.fromTo(1, 1, 4, 3, 1, 3) - .add(util.select.position(3, 1, 2)); - Selection tank = util.select.fromTo(4, 1, 3, 4, 2, 3); - Selection drain = util.select.position(1, 1, 2); - Selection basin = util.select.position(3, 1, 1); + BlockPos pumpPos = util.grid().at(2, 1, 4); + Selection largeCog = util.select().position(5, 0, 4); + Selection kinetics = util.select().fromTo(5, 1, 5, 2, 1, 5); + Selection pipes = util.select().fromTo(1, 1, 4, 3, 1, 3) + .add(util.select().position(3, 1, 2)); + Selection tank = util.select().fromTo(4, 1, 3, 4, 2, 3); + Selection drain = util.select().position(1, 1, 2); + Selection basin = util.select().position(3, 1, 1); - Selection waterSourceS = util.select.position(1, 1, 1); - Selection waterTargetS = util.select.position(4, 1, 1); - Selection waterTarget2S = util.select.fromTo(4, 0, 0, 4, 1, 0); + Selection waterSourceS = util.select().position(1, 1, 1); + Selection waterTargetS = util.select().position(4, 1, 1); + Selection waterTarget2S = util.select().fromTo(4, 0, 0, 4, 1, 0); - scene.world.setKineticSpeed(util.select.position(pumpPos), 0); + scene.world().setKineticSpeed(util.select().position(pumpPos), 0); - scene.world.showSection(pipes, Direction.DOWN); + scene.world().showSection(pipes, Direction.DOWN); scene.idle(10); - scene.world.showSection(basin, Direction.SOUTH); + scene.world().showSection(basin, Direction.SOUTH); scene.idle(5); - scene.world.showSection(drain, Direction.SOUTH); + scene.world().showSection(drain, Direction.SOUTH); scene.idle(5); - scene.world.showSection(tank, Direction.WEST); + scene.world().showSection(tank, Direction.WEST); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("Endpoints of a pipe network can interact with a variety of blocks") .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.blockSurface(util.grid.at(1, 1, 3), Direction.NORTH)); + .pointAt(util.vector().blockSurface(util.grid().at(1, 1, 3), Direction.NORTH)); scene.idle(60); - scene.world.showSection(largeCog, Direction.UP); + scene.world().showSection(largeCog, Direction.UP); scene.idle(5); - scene.world.showSection(kinetics, Direction.NORTH); + scene.world().showSection(kinetics, Direction.NORTH); scene.idle(10); - scene.world.multiplyKineticSpeed(util.select.everywhere(), 0.5f); - scene.world.setKineticSpeed(util.select.position(pumpPos), 32); - BlockPos drainPos = util.grid.at(1, 1, 2); - scene.world.modifyBlockEntity(drainPos, ItemDrainBlockEntity.class, + scene.world().multiplyKineticSpeed(util.select().everywhere(), 0.5f); + scene.world().setKineticSpeed(util.select().position(pumpPos), 32); + BlockPos drainPos = util.grid().at(1, 1, 2); + scene.world().modifyBlockEntity(drainPos, ItemDrainBlockEntity.class, be -> be.getBehaviour(SmartFluidTankBehaviour.TYPE) .allowInsertion() .getPrimaryHandler() .fill(new FluidStack(Fluids.WATER, 1500), FluidAction.EXECUTE)); scene.idle(50); - scene.overlay.showOutline(PonderPalette.MEDIUM, new Object(), drain, 40); + scene.overlay().showOutline(PonderPalette.MEDIUM, new Object(), drain, 40); scene.idle(5); - scene.overlay.showOutline(PonderPalette.MEDIUM, new Object(), tank, 40); + scene.overlay().showOutline(PonderPalette.MEDIUM, new Object(), tank, 40); scene.idle(5); - scene.overlay.showOutline(PonderPalette.MEDIUM, new Object(), basin, 40); + scene.overlay().showOutline(PonderPalette.MEDIUM, new Object(), basin, 40); scene.idle(5); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("Any block with fluid storage capabilities can be filled or drained") .attachKeyFrame() .colored(PonderPalette.MEDIUM) .placeNearTarget() - .pointAt(util.vector.blockSurface(drainPos, Direction.UP)); + .pointAt(util.vector().blockSurface(drainPos, Direction.UP)); scene.idle(100); - scene.world.hideSection(drain, Direction.NORTH); + scene.world().hideSection(drain, Direction.NORTH); scene.idle(5); - scene.world.hideSection(tank, Direction.EAST); + scene.world().hideSection(tank, Direction.EAST); scene.idle(5); - scene.world.setBlock(drainPos, Blocks.AIR.defaultBlockState(), false); - scene.world.propagatePipeChange(pumpPos); - scene.world.hideSection(basin, Direction.NORTH); + scene.world().setBlock(drainPos, Blocks.AIR.defaultBlockState(), false); + scene.world().propagatePipeChange(pumpPos); + scene.world().hideSection(basin, Direction.NORTH); scene.idle(5); - scene.world.setBlock(util.grid.at(3, 1, 1), Blocks.AIR.defaultBlockState(), false); + scene.world().setBlock(util.grid().at(3, 1, 1), Blocks.AIR.defaultBlockState(), false); scene.idle(5); - scene.world.setBlock(util.grid.at(3, 1, 3), AllBlocks.GLASS_FLUID_PIPE.getDefaultState() + scene.world().setBlock(util.grid().at(3, 1, 3), AllBlocks.GLASS_FLUID_PIPE.getDefaultState() .setValue(AxisPipeBlock.AXIS, Axis.Z), false); scene.idle(10); // scene.world.multiplyKineticSpeed(util.select.everywhere(), 2); - scene.world.propagatePipeChange(pumpPos); - ElementLink water = scene.world.showIndependentSection(waterSourceS, Direction.DOWN); - scene.world.moveSection(water, util.vector.of(0, 0, 1), 0); + scene.world().propagatePipeChange(pumpPos); + ElementLink water = scene.world().showIndependentSection(waterSourceS, Direction.DOWN); + scene.world().moveSection(water, util.vector().of(0, 0, 1), 0); scene.idle(10); - scene.world.setBlock(drainPos, Blocks.WATER.defaultBlockState(), false); + scene.world().setBlock(drainPos, Blocks.WATER.defaultBlockState(), false); scene.idle(20); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("Source blocks right in front of an open end can be picked up...") .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.blockSurface(drainPos, Direction.SOUTH)); + .pointAt(util.vector().blockSurface(drainPos, Direction.SOUTH)); scene.idle(40); - scene.world.setBlock(drainPos.north(), Blocks.AIR.defaultBlockState(), false); + scene.world().setBlock(drainPos.north(), Blocks.AIR.defaultBlockState(), false); scene.idle(40); - ElementLink target = scene.world.showIndependentSection(waterTargetS, Direction.UP); - scene.world.moveSection(target, util.vector.of(-1, 0, 0), 0); + ElementLink target = scene.world().showIndependentSection(waterTargetS, Direction.UP); + scene.world().moveSection(target, util.vector().of(-1, 0, 0), 0); scene.idle(5); - scene.world.showSectionAndMerge(waterTarget2S, Direction.UP, target); + scene.world().showSectionAndMerge(waterTarget2S, Direction.UP, target); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("...while spilling into empty spaces can create fluid sources") .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.blockSurface(util.grid.at(3, 1, 2), Direction.NORTH)); + .pointAt(util.vector().blockSurface(util.grid().at(3, 1, 2), Direction.NORTH)); scene.idle(80); - scene.world.hideIndependentSection(target, Direction.DOWN); + scene.world().hideIndependentSection(target, Direction.DOWN); scene.idle(5); - scene.world.setBlock(drainPos, Blocks.BEE_NEST.defaultBlockState() + scene.world().setBlock(drainPos, Blocks.BEE_NEST.defaultBlockState() .setValue(BeehiveBlock.HONEY_LEVEL, 5), false); - scene.world.showSection(drain, Direction.DOWN); - scene.world.setBlock(util.grid.at(3, 1, 2), AllBlocks.FLUID_TANK.getDefaultState(), false); - scene.world.propagatePipeChange(pumpPos); + scene.world().showSection(drain, Direction.DOWN); + scene.world().setBlock(util.grid().at(3, 1, 2), AllBlocks.FLUID_TANK.getDefaultState(), false); + scene.world().propagatePipeChange(pumpPos); scene.idle(15); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("Pipes can also extract fluids from a handful of other blocks directly") .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.topOf(drainPos)); + .pointAt(util.vector().topOf(drainPos)); scene.idle(60); - scene.world.setBlock(drainPos, Blocks.BEE_NEST.defaultBlockState() + scene.world().setBlock(drainPos, Blocks.BEE_NEST.defaultBlockState() .setValue(BeehiveBlock.HONEY_LEVEL, 0), false); } @@ -313,9 +313,9 @@ public class PipeScenes { scene.configureBasePlate(0, 0, 5); scene.showBasePlate(); scene.idle(5); - scene.world.showSection(util.select.position(2, 0, 5), Direction.UP); + scene.world().showSection(util.select().position(2, 0, 5), Direction.UP); scene.idle(5); - scene.world.showSection(util.select.layer(1), Direction.DOWN); + scene.world().showSection(util.select().layer(1), Direction.DOWN); scene.idle(15); BlockState copperEncased = AllBlocks.ENCASED_FLUID_PIPE.getDefaultState() @@ -323,57 +323,57 @@ public class PipeScenes { .setValue(FluidPipeBlock.WEST, true); ItemStack casingItem = AllBlocks.COPPER_CASING.asStack(); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(3, 1, 1), Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(3, 1, 1), Pointing.DOWN).rightClick() .withItem(casingItem), 60); scene.idle(7); - scene.world.setBlock(util.grid.at(3, 1, 1), copperEncased, true); + scene.world().setBlock(util.grid().at(3, 1, 1), copperEncased, true); scene.idle(10); - scene.overlay.showText(60) + scene.overlay().showText(60) .placeNearTarget() .text("Copper Casing can be used to decorate Fluid Pipes") .attachKeyFrame() - .pointAt(util.vector.topOf(3, 1, 1)); + .pointAt(util.vector().topOf(3, 1, 1)); scene.idle(70); - scene.world.destroyBlock(util.grid.at(2, 1, 1)); - scene.world.modifyBlock(util.grid.at(1, 1, 1), s -> s.setValue(FluidPipeBlock.EAST, false) + scene.world().destroyBlock(util.grid().at(2, 1, 1)); + scene.world().modifyBlock(util.grid().at(1, 1, 1), s -> s.setValue(FluidPipeBlock.EAST, false) .setValue(FluidPipeBlock.NORTH, true), false); scene.idle(5); - scene.overlay.showLine(PonderPalette.RED, util.vector.of(1.5, 1.75, 1), util.vector.of(1.5, 1.75, 2), 80); + scene.overlay().showLine(PonderPalette.RED, util.vector().of(1.5, 1.75, 1), util.vector().of(1.5, 1.75, 2), 80); scene.idle(5); scene.addKeyframe(); - scene.overlay.showLine(PonderPalette.GREEN, util.vector.of(3.5, 2, 1.5), util.vector.of(3.5, 2, 2), 80); - scene.overlay.showLine(PonderPalette.GREEN, util.vector.of(3, 2, 1.5), util.vector.of(3.5, 2, 1.5), 80); + scene.overlay().showLine(PonderPalette.GREEN, util.vector().of(3.5, 2, 1.5), util.vector().of(3.5, 2, 2), 80); + scene.overlay().showLine(PonderPalette.GREEN, util.vector().of(3, 2, 1.5), util.vector().of(3.5, 2, 1.5), 80); scene.idle(25); - scene.overlay.showText(60) + scene.overlay().showText(60) .placeNearTarget() .text("Aside from being concealed, Encased Pipes are locked into their connectivity state") - .pointAt(util.vector.blockSurface(util.grid.at(3, 1, 1), Direction.WEST)); + .pointAt(util.vector().blockSurface(util.grid().at(3, 1, 1), Direction.WEST)); scene.idle(70); BlockState defaultState = AllBlocks.FLUID_PIPE.getDefaultState(); for (BooleanProperty booleanProperty : FluidPipeBlock.PROPERTY_BY_DIRECTION.values()) defaultState = defaultState.setValue(booleanProperty, false); - scene.world.setBlock(util.grid.at(3, 2, 1), defaultState.setValue(FluidPipeBlock.EAST, true) + scene.world().setBlock(util.grid().at(3, 2, 1), defaultState.setValue(FluidPipeBlock.EAST, true) .setValue(FluidPipeBlock.WEST, true), false); - scene.world.setBlock(util.grid.at(1, 2, 1), defaultState.setValue(FluidPipeBlock.UP, true) + scene.world().setBlock(util.grid().at(1, 2, 1), defaultState.setValue(FluidPipeBlock.UP, true) .setValue(FluidPipeBlock.DOWN, true), false); - scene.world.showSection(util.select.layer(2), Direction.DOWN); + scene.world().showSection(util.select().layer(2), Direction.DOWN); scene.idle(10); - scene.world.modifyBlock(util.grid.at(1, 1, 1), s -> s.setValue(FluidPipeBlock.UP, true) + scene.world().modifyBlock(util.grid().at(1, 1, 1), s -> s.setValue(FluidPipeBlock.UP, true) .setValue(FluidPipeBlock.NORTH, false), false); scene.idle(20); - scene.overlay.showText(60) + scene.overlay().showText(60) .placeNearTarget() .colored(PonderPalette.RED) .text("It will no longer react to any neighbouring blocks being added or removed") .attachKeyFrame() - .pointAt(util.vector.centerOf(3, 2, 1)); + .pointAt(util.vector().centerOf(3, 2, 1)); scene.idle(20); } @@ -383,96 +383,96 @@ public class PipeScenes { scene.configureBasePlate(0, 0, 5); scene.showBasePlate(); - Selection cogs = util.select.fromTo(5, 0, 2, 5, 1, 2); - Selection tank1 = util.select.fromTo(3, 1, 3, 3, 2, 3); - Selection tank2 = util.select.fromTo(1, 1, 3, 1, 2, 3); - BlockPos valvePos = util.grid.at(2, 1, 1); - BlockPos handlePos = util.grid.at(2, 2, 1); - BlockPos pumpPos = util.grid.at(4, 1, 2); - Selection pipes1 = util.select.fromTo(4, 1, 3, 4, 1, 1); - Selection pipes2 = util.select.fromTo(3, 1, 1, 1, 1, 1); - Selection pipes3 = util.select.fromTo(0, 1, 1, 0, 1, 3); + Selection cogs = util.select().fromTo(5, 0, 2, 5, 1, 2); + Selection tank1 = util.select().fromTo(3, 1, 3, 3, 2, 3); + Selection tank2 = util.select().fromTo(1, 1, 3, 1, 2, 3); + BlockPos valvePos = util.grid().at(2, 1, 1); + BlockPos handlePos = util.grid().at(2, 2, 1); + BlockPos pumpPos = util.grid().at(4, 1, 2); + Selection pipes1 = util.select().fromTo(4, 1, 3, 4, 1, 1); + Selection pipes2 = util.select().fromTo(3, 1, 1, 1, 1, 1); + Selection pipes3 = util.select().fromTo(0, 1, 1, 0, 1, 3); - scene.world.setKineticSpeed(pipes1, 0); - scene.world.propagatePipeChange(pumpPos); - scene.world.setBlock(valvePos, AllBlocks.FLUID_PIPE.get() + scene.world().setKineticSpeed(pipes1, 0); + scene.world().propagatePipeChange(pumpPos); + scene.world().setBlock(valvePos, AllBlocks.FLUID_PIPE.get() .getAxisState(Axis.X), false); - scene.world.setBlock(util.grid.at(3, 1, 1), Blocks.AIR.defaultBlockState(), false); - scene.world.setBlock(util.grid.at(3, 1, 1), AllBlocks.GLASS_FLUID_PIPE.getDefaultState() + scene.world().setBlock(util.grid().at(3, 1, 1), Blocks.AIR.defaultBlockState(), false); + scene.world().setBlock(util.grid().at(3, 1, 1), AllBlocks.GLASS_FLUID_PIPE.getDefaultState() .setValue(GlassFluidPipeBlock.AXIS, Axis.X), false); scene.idle(5); - scene.world.showSection(tank1, Direction.NORTH); + scene.world().showSection(tank1, Direction.NORTH); scene.idle(5); - scene.world.showSection(tank2, Direction.NORTH); + scene.world().showSection(tank2, Direction.NORTH); scene.idle(10); - scene.world.showSection(pipes1, Direction.WEST); + scene.world().showSection(pipes1, Direction.WEST); scene.idle(5); - scene.world.showSection(pipes2, Direction.SOUTH); + scene.world().showSection(pipes2, Direction.SOUTH); scene.idle(5); - scene.world.showSection(pipes3, Direction.EAST); + scene.world().showSection(pipes3, Direction.EAST); scene.idle(15); - scene.world.destroyBlock(valvePos); - scene.world.restoreBlocks(util.select.position(valvePos)); + scene.world().destroyBlock(valvePos); + scene.world().restoreBlocks(util.select().position(valvePos)); - scene.overlay.showText(60) + scene.overlay().showText(60) .placeNearTarget() .text("Valve pipes help control fluids propagating through pipe networks") .attachKeyFrame() - .pointAt(util.vector.blockSurface(valvePos, Direction.WEST)); + .pointAt(util.vector().blockSurface(valvePos, Direction.WEST)); scene.idle(75); - scene.world.showSection(cogs, Direction.WEST); + scene.world().showSection(cogs, Direction.WEST); scene.idle(10); - scene.world.setKineticSpeed(util.select.position(pumpPos), 64); - scene.world.propagatePipeChange(pumpPos); + scene.world().setKineticSpeed(util.select().position(pumpPos), 64); + scene.world().propagatePipeChange(pumpPos); - scene.overlay.showText(60) + scene.overlay().showText(60) .placeNearTarget() .text("Their shaft input controls whether fluid is currently allowed through") .attachKeyFrame() - .pointAt(util.vector.topOf(valvePos)); + .pointAt(util.vector().topOf(valvePos)); scene.idle(60); ElementLink handleLink = - scene.world.showIndependentSection(util.select.position(handlePos), Direction.DOWN); + scene.world().showIndependentSection(util.select().position(handlePos), Direction.DOWN); scene.idle(15); - Selection valveKinetics = util.select.fromTo(2, 1, 1, 2, 2, 1); - scene.world.setKineticSpeed(valveKinetics, 16); - scene.world.rotateSection(handleLink, 0, 90, 0, 22); - scene.effects.rotationSpeedIndicator(handlePos); - scene.world.modifyBlockEntity(valvePos, FluidValveBlockEntity.class, be -> be.onSpeedChanged(0)); + Selection valveKinetics = util.select().fromTo(2, 1, 1, 2, 2, 1); + scene.world().setKineticSpeed(valveKinetics, 16); + scene.world().rotateSection(handleLink, 0, 90, 0, 22); + scene.effects().rotationSpeedIndicator(handlePos); + scene.world().modifyBlockEntity(valvePos, FluidValveBlockEntity.class, be -> be.onSpeedChanged(0)); scene.idle(22); - scene.world.modifyBlock(valvePos, s -> s.setValue(FluidValveBlock.ENABLED, true), false); - scene.effects.indicateSuccess(valvePos); + scene.world().modifyBlock(valvePos, s -> s.setValue(FluidValveBlock.ENABLED, true), false); + scene.effects().indicateSuccess(valvePos); scene.idle(5); - scene.world.setKineticSpeed(valveKinetics, 0); + scene.world().setKineticSpeed(valveKinetics, 0); - scene.overlay.showText(60) + scene.overlay().showText(60) .placeNearTarget() .text("Given Rotational Force in the opening direction, the valve will open up") .attachKeyFrame() - .pointAt(util.vector.blockSurface(valvePos, Direction.NORTH)); + .pointAt(util.vector().blockSurface(valvePos, Direction.NORTH)); scene.idle(90); - scene.overlay.showText(50) + scene.overlay().showText(50) .placeNearTarget() .text("It can be closed again by reversing the input rotation") .attachKeyFrame() - .pointAt(util.vector.blockSurface(valvePos, Direction.NORTH)); + .pointAt(util.vector().blockSurface(valvePos, Direction.NORTH)); scene.idle(40); - scene.world.setKineticSpeed(valveKinetics, -16); - scene.world.rotateSection(handleLink, 0, -90, 0, 22); - scene.effects.rotationSpeedIndicator(handlePos); - scene.world.modifyBlockEntity(valvePos, FluidValveBlockEntity.class, be -> be.onSpeedChanged(0)); + scene.world().setKineticSpeed(valveKinetics, -16); + scene.world().rotateSection(handleLink, 0, -90, 0, 22); + scene.effects().rotationSpeedIndicator(handlePos); + scene.world().modifyBlockEntity(valvePos, FluidValveBlockEntity.class, be -> be.onSpeedChanged(0)); scene.idle(22); - scene.world.modifyBlock(valvePos, s -> s.setValue(FluidValveBlock.ENABLED, false), false); - scene.effects.indicateRedstone(valvePos); - scene.world.propagatePipeChange(pumpPos); + scene.world().modifyBlock(valvePos, s -> s.setValue(FluidValveBlock.ENABLED, false), false); + scene.effects().indicateRedstone(valvePos); + scene.world().propagatePipeChange(pumpPos); scene.idle(5); - scene.world.setKineticSpeed(valveKinetics, 0); + scene.world().setKineticSpeed(valveKinetics, 0); } public static void smart(SceneBuilder builder, SceneBuildingUtil util) { @@ -482,52 +482,52 @@ public class PipeScenes { scene.showBasePlate(); scene.idle(5); - Selection tank1 = util.select.fromTo(4, 1, 3, 4, 2, 3); - Selection tank2 = util.select.fromTo(4, 1, 4, 4, 2, 4); - Selection additionalPipes = util.select.fromTo(3, 1, 4, 1, 1, 4); - Selection mainPipes = util.select.fromTo(3, 1, 3, 1, 1, 1); - Selection kinetics1 = util.select.fromTo(0, 0, 2, 0, 0, 5); - Selection kinetics2 = util.select.position(1, 0, 5); - BlockPos basinPos = util.grid.at(4, 1, 1); - BlockPos pumpPos = util.grid.at(1, 1, 2); - Selection pump = util.select.position(1, 1, 2); - Selection basin = util.select.position(basinPos); - BlockPos smartPos = util.grid.at(3, 1, 1); + Selection tank1 = util.select().fromTo(4, 1, 3, 4, 2, 3); + Selection tank2 = util.select().fromTo(4, 1, 4, 4, 2, 4); + Selection additionalPipes = util.select().fromTo(3, 1, 4, 1, 1, 4); + Selection mainPipes = util.select().fromTo(3, 1, 3, 1, 1, 1); + Selection kinetics1 = util.select().fromTo(0, 0, 2, 0, 0, 5); + Selection kinetics2 = util.select().position(1, 0, 5); + BlockPos basinPos = util.grid().at(4, 1, 1); + BlockPos pumpPos = util.grid().at(1, 1, 2); + Selection pump = util.select().position(1, 1, 2); + Selection basin = util.select().position(basinPos); + BlockPos smartPos = util.grid().at(3, 1, 1); - scene.world.modifyBlockEntity(basinPos, BasinBlockEntity.class, + scene.world().modifyBlockEntity(basinPos, BasinBlockEntity.class, be -> be.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) .ifPresent(fh -> fh.fill(new FluidStack(ForgeMod.MILK.get(), 1000), FluidAction.EXECUTE))); - scene.world.setBlock(util.grid.at(3, 1, 3), AllBlocks.FLUID_PIPE.get() + scene.world().setBlock(util.grid().at(3, 1, 3), AllBlocks.FLUID_PIPE.get() .getAxisState(Axis.X), false); - scene.world.setBlock(smartPos, AllBlocks.FLUID_PIPE.get() + scene.world().setBlock(smartPos, AllBlocks.FLUID_PIPE.get() .getAxisState(Axis.X), false); - scene.world.setBlock(util.grid.at(2, 1, 3), AllBlocks.GLASS_FLUID_PIPE.getDefaultState() + scene.world().setBlock(util.grid().at(2, 1, 3), AllBlocks.GLASS_FLUID_PIPE.getDefaultState() .setValue(GlassFluidPipeBlock.AXIS, Axis.X), false); - scene.world.setBlock(util.grid.at(1, 1, 3), AllBlocks.FLUID_PIPE.get() + scene.world().setBlock(util.grid().at(1, 1, 3), AllBlocks.FLUID_PIPE.get() .getAxisState(Axis.X) .setValue(FluidPipeBlock.NORTH, true) .setValue(FluidPipeBlock.WEST, false), false); - scene.world.showSection(basin, Direction.DOWN); + scene.world().showSection(basin, Direction.DOWN); scene.idle(5); - scene.world.showSection(tank1, Direction.DOWN); + scene.world().showSection(tank1, Direction.DOWN); scene.idle(5); - scene.world.showSection(mainPipes, Direction.EAST); + scene.world().showSection(mainPipes, Direction.EAST); scene.idle(15); - scene.world.destroyBlock(smartPos); - scene.world.restoreBlocks(util.select.position(smartPos)); + scene.world().destroyBlock(smartPos); + scene.world().restoreBlocks(util.select().position(smartPos)); - Vec3 filterVec = util.vector.topOf(smartPos) + Vec3 filterVec = util.vector().topOf(smartPos) .subtract(0.25, 0, 0); - scene.overlay.showText(50) + scene.overlay().showText(50) .placeNearTarget() .text("Smart pipes can help control flows by fluid type") .pointAt(filterVec); scene.idle(60); - scene.overlay.showSelectionWithText(util.select.position(basinPos), 80) + scene.overlay().showSelectionWithText(util.select().position(basinPos), 80) .placeNearTarget() .colored(PonderPalette.GREEN) .text("When placed directly at the source, they can specify the type of fluid to extract") @@ -540,48 +540,48 @@ public class PipeScenes { .getFluidType() .getBucket(chocolate); ItemStack milkBucket = new ItemStack(Items.MILK_BUCKET); - scene.overlay.showControls(new InputWindowElement(filterVec, Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(filterVec, Pointing.DOWN).rightClick() .withItem(bucket), 80); scene.idle(7); - scene.world.setFilterData(util.select.position(3, 1, 1), SmartFluidPipeBlockEntity.class, bucket); + scene.world().setFilterData(util.select().position(3, 1, 1), SmartFluidPipeBlockEntity.class, bucket); scene.idle(10); - scene.overlay.showText(60) + scene.overlay().showText(60) .placeNearTarget() .attachKeyFrame() .text("Simply Right-Click their filter slot with any item containing the desired fluid") .pointAt(filterVec); scene.idle(50); - scene.world.showSection(kinetics2, Direction.WEST); - scene.world.setKineticSpeed(kinetics2, 24); + scene.world().showSection(kinetics2, Direction.WEST); + scene.world().setKineticSpeed(kinetics2, 24); scene.idle(5); - scene.world.showSection(kinetics1, Direction.EAST); - scene.world.setKineticSpeed(kinetics1, -24); + scene.world().showSection(kinetics1, Direction.EAST); + scene.world().setKineticSpeed(kinetics1, -24); scene.idle(10); - scene.world.setKineticSpeed(pump, 48); - scene.world.propagatePipeChange(pumpPos); + scene.world().setKineticSpeed(pump, 48); + scene.world().propagatePipeChange(pumpPos); scene.idle(100); - scene.world.setKineticSpeed(util.select.everywhere(), 0); - scene.world.propagatePipeChange(pumpPos); + scene.world().setKineticSpeed(util.select().everywhere(), 0); + scene.world().propagatePipeChange(pumpPos); scene.idle(15); - scene.world.showSection(tank2, Direction.DOWN); - scene.world.showSection(additionalPipes, Direction.NORTH); - scene.world.setBlock(util.grid.at(3, 1, 1), AllBlocks.FLUID_PIPE.get() + scene.world().showSection(tank2, Direction.DOWN); + scene.world().showSection(additionalPipes, Direction.NORTH); + scene.world().setBlock(util.grid().at(3, 1, 1), AllBlocks.FLUID_PIPE.get() .getAxisState(Axis.X), true); scene.idle(10); for (int i = 0; i < 3; i++) { - BlockPos pos = util.grid.at(1 + i, 1, 3); - scene.world.destroyBlock(pos); - scene.world.restoreBlocks(util.select.position(pos)); + BlockPos pos = util.grid().at(1 + i, 1, 3); + scene.world().destroyBlock(pos); + scene.world().restoreBlocks(util.select().position(pos)); scene.idle(2); } scene.idle(15); - scene.world.modifyBlockEntity(basinPos, BasinBlockEntity.class, + scene.world().modifyBlockEntity(basinPos, BasinBlockEntity.class, be -> be.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) .ifPresent(fh -> fh.fill(chocolate, FluidAction.EXECUTE))); scene.idle(10); - scene.overlay.showText(80) + scene.overlay().showText(80) .placeNearTarget() .colored(PonderPalette.GREEN) .text("When placed further down a pipe network, smart pipes will only let matching fluids continue") @@ -589,23 +589,23 @@ public class PipeScenes { .pointAt(filterVec.add(-1, 0, 2)); scene.idle(90); - scene.overlay.showControls(new InputWindowElement(filterVec.add(-1, 0, 3), Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(filterVec.add(-1, 0, 3), Pointing.DOWN).rightClick() .withItem(milkBucket), 30); scene.idle(7); - scene.world.setFilterData(util.select.position(2, 1, 4), SmartFluidPipeBlockEntity.class, milkBucket); + scene.world().setFilterData(util.select().position(2, 1, 4), SmartFluidPipeBlockEntity.class, milkBucket); scene.idle(30); - scene.overlay.showControls(new InputWindowElement(filterVec.add(-1, 0, 2), Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(filterVec.add(-1, 0, 2), Pointing.DOWN).rightClick() .withItem(bucket), 30); scene.idle(7); - scene.world.setFilterData(util.select.position(2, 1, 3), SmartFluidPipeBlockEntity.class, bucket); + scene.world().setFilterData(util.select().position(2, 1, 3), SmartFluidPipeBlockEntity.class, bucket); scene.idle(30); - scene.world.setKineticSpeed(kinetics2, 24); - scene.world.setKineticSpeed(kinetics1, -24); - scene.world.setKineticSpeed(pump, 48); - scene.world.propagatePipeChange(pumpPos); - scene.effects.rotationSpeedIndicator(pumpPos); + scene.world().setKineticSpeed(kinetics2, 24); + scene.world().setKineticSpeed(kinetics1, -24); + scene.world().setKineticSpeed(pump, 48); + scene.world().propagatePipeChange(pumpPos); + scene.effects().rotationSpeedIndicator(pumpPos); scene.idle(40); } diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/PumpScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/PumpScenes.java index b069f18fd0..e9e0494c3d 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/PumpScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/PumpScenes.java @@ -10,10 +10,10 @@ import com.simibubi.create.content.kinetics.simpleRelays.CogWheelBlock; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; import net.createmod.ponder.foundation.ElementLink; import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.SceneBuilder; -import net.createmod.ponder.foundation.SceneBuildingUtil; import net.createmod.ponder.foundation.Selection; import net.createmod.ponder.foundation.element.InputWindowElement; import net.createmod.ponder.foundation.element.WorldSectionElement; @@ -33,56 +33,56 @@ public class PumpScenes { scene.title("mechanical_pump_flow", "Fluid Transportation using Mechanical Pumps"); scene.configureBasePlate(0, 0, 5); scene.showBasePlate(); - scene.world.multiplyKineticSpeed(util.select.everywhere(), -1); + scene.world().multiplyKineticSpeed(util.select().everywhere(), -1); scene.idle(5); - BlockPos pumpPos = util.grid.at(2, 1, 1); - Selection tank1 = util.select.fromTo(0, 2, 3, 0, 1, 3); - Selection tank2 = util.select.fromTo(4, 2, 3, 4, 1, 3); - Selection pipes = util.select.fromTo(3, 1, 3, 1, 1, 1); - Selection largeCog = util.select.position(5, 0, 1); - Selection kinetics = util.select.fromTo(5, 1, 0, 2, 1, 0); - BlockPos leverPos = util.grid.at(4, 2, 0); - Selection pump = util.select.position(pumpPos); + BlockPos pumpPos = util.grid().at(2, 1, 1); + Selection tank1 = util.select().fromTo(0, 2, 3, 0, 1, 3); + Selection tank2 = util.select().fromTo(4, 2, 3, 4, 1, 3); + Selection pipes = util.select().fromTo(3, 1, 3, 1, 1, 1); + Selection largeCog = util.select().position(5, 0, 1); + Selection kinetics = util.select().fromTo(5, 1, 0, 2, 1, 0); + BlockPos leverPos = util.grid().at(4, 2, 0); + Selection pump = util.select().position(pumpPos); - scene.world.setBlock(pumpPos, AllBlocks.FLUID_PIPE.get() + scene.world().setBlock(pumpPos, AllBlocks.FLUID_PIPE.get() .getAxisState(Axis.X), false); - scene.world.showSection(tank1, Direction.DOWN); + scene.world().showSection(tank1, Direction.DOWN); scene.idle(5); - scene.world.showSection(tank2, Direction.DOWN); + scene.world().showSection(tank2, Direction.DOWN); scene.idle(5); - scene.world.showSection(pipes, Direction.NORTH); + scene.world().showSection(pipes, Direction.NORTH); scene.idle(15); - scene.world.destroyBlock(pumpPos); - scene.world.restoreBlocks(pump); - scene.world.setKineticSpeed(pump, 0); + scene.world().destroyBlock(pumpPos); + scene.world().restoreBlocks(pump); + scene.world().setKineticSpeed(pump, 0); scene.idle(15); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("Mechanical Pumps govern the flow of their attached pipe networks") .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.topOf(pumpPos)); + .pointAt(util.vector().topOf(pumpPos)); scene.idle(70); - scene.world.showSection(largeCog, Direction.UP); + scene.world().showSection(largeCog, Direction.UP); scene.idle(5); - scene.world.showSection(kinetics, Direction.SOUTH); - scene.world.showSection(util.select.position(leverPos), Direction.SOUTH); + scene.world().showSection(kinetics, Direction.SOUTH); + scene.world().showSection(util.select().position(leverPos), Direction.SOUTH); scene.idle(10); - scene.world.setKineticSpeed(pump, 64); - scene.world.propagatePipeChange(pumpPos); - scene.effects.rotationDirectionIndicator(pumpPos.north()); + scene.world().setKineticSpeed(pump, 64); + scene.world().propagatePipeChange(pumpPos); + scene.effects().rotationDirectionIndicator(pumpPos.north()); scene.idle(15); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("Their arrow indicates the direction of flow") .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.topOf(pumpPos) + .pointAt(util.vector().topOf(pumpPos) .subtract(0.5f, 0.125f, 0)); AABB bb1 = new AABB(Vec3.ZERO, Vec3.ZERO).inflate(.25, .25, 0) @@ -93,72 +93,72 @@ public class PumpScenes { Object in = new Object(); Object out = new Object(); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.INPUT, in, bb1.move(util.vector.centerOf(3, 1, 3)), 3); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.INPUT, in, bb1.move(util.vector().centerOf(3, 1, 3)), 3); scene.idle(2); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.INPUT, in, bb2.move(util.vector.centerOf(3, 1, 2)), 50); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.INPUT, in, bb2.move(util.vector().centerOf(3, 1, 2)), 50); scene.idle(10); - scene.overlay.showText(50) + scene.overlay().showText(50) .text("The network behind is now pulling fluids...") .attachKeyFrame() .placeNearTarget() .colored(PonderPalette.INPUT) - .pointAt(util.vector.centerOf(3, 1, 2)); + .pointAt(util.vector().centerOf(3, 1, 2)); scene.idle(60); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, out, bb1.move(util.vector.centerOf(1, 1, 1) + scene.overlay().chaseBoundingBoxOutline(PonderPalette.OUTPUT, out, bb1.move(util.vector().centerOf(1, 1, 1) .add(0, 0, -.5)), 3); scene.idle(2); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, out, bb2.move(util.vector.centerOf(1, 1, 2)), 50); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.OUTPUT, out, bb2.move(util.vector().centerOf(1, 1, 2)), 50); scene.idle(10); - scene.overlay.showText(50) + scene.overlay().showText(50) .text("...while the network in front is transferring it outward") .placeNearTarget() .colored(PonderPalette.OUTPUT) - .pointAt(util.vector.centerOf(1, 1, 2)); + .pointAt(util.vector().centerOf(1, 1, 2)); scene.idle(70); - scene.world.toggleRedstonePower(util.select.fromTo(4, 2, 0, 4, 1, 0)); - scene.effects.indicateRedstone(leverPos); - scene.world.multiplyKineticSpeed(util.select.fromTo(3, 1, 0, 2, 1, 1), -1); - scene.effects.rotationDirectionIndicator(pumpPos.north()); - scene.world.propagatePipeChange(pumpPos); + scene.world().toggleRedstonePower(util.select().fromTo(4, 2, 0, 4, 1, 0)); + scene.effects().indicateRedstone(leverPos); + scene.world().multiplyKineticSpeed(util.select().fromTo(3, 1, 0, 2, 1, 1), -1); + scene.effects().rotationDirectionIndicator(pumpPos.north()); + scene.world().propagatePipeChange(pumpPos); scene.idle(15); - scene.overlay.showText(60) + scene.overlay().showText(60) .text("The pumps direction is unaffected by the input rotation") .colored(PonderPalette.RED) .placeNearTarget() .attachKeyFrame() - .pointAt(util.vector.topOf(pumpPos) + .pointAt(util.vector().topOf(pumpPos) .subtract(0.5f, 0.125f, 0)); scene.idle(25); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, in, new AABB(leverPos.below()), 30); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.RED, in, new AABB(leverPos.below()), 30); scene.idle(45); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(pumpPos), Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(pumpPos), Pointing.DOWN).rightClick() .withItem(AllItems.WRENCH.asStack()), 40); scene.idle(7); - scene.world.modifyBlock(pumpPos, s -> s.setValue(PumpBlock.FACING, Direction.EAST), true); - scene.overlay.showText(70) + scene.world().modifyBlock(pumpPos, s -> s.setValue(PumpBlock.FACING, Direction.EAST), true); + scene.overlay().showText(70) .attachKeyFrame() - .pointAt(util.vector.centerOf(2, 1, 1)) + .pointAt(util.vector().centerOf(2, 1, 1)) .placeNearTarget() .text("Instead, a Wrench can be used to reverse the direction"); - scene.world.propagatePipeChange(pumpPos); + scene.world().propagatePipeChange(pumpPos); scene.idle(40); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.INPUT, in, bb1.move(util.vector.centerOf(3, 1, 3)), 3); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.INPUT, in, bb1.move(util.vector().centerOf(3, 1, 3)), 3); scene.idle(2); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.INPUT, in, bb2.move(util.vector.centerOf(3, 1, 2)), 30); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.INPUT, in, bb2.move(util.vector().centerOf(3, 1, 2)), 30); scene.idle(15); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, out, bb1.move(util.vector.centerOf(1, 1, 1) + scene.overlay().chaseBoundingBoxOutline(PonderPalette.OUTPUT, out, bb1.move(util.vector().centerOf(1, 1, 1) .add(0, 0, -.5)), 3); scene.idle(2); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, out, bb2.move(util.vector.centerOf(1, 1, 2)), 30); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.OUTPUT, out, bb2.move(util.vector().centerOf(1, 1, 2)), 30); scene.idle(25); } @@ -171,85 +171,85 @@ public class PumpScenes { scene.idle(5); // scene.world.showSection(util.select.layersFrom(1), Direction.DOWN); - Selection largeCog = util.select.position(5, 0, 3); - Selection cogs = util.select.fromTo(5, 1, 4, 2, 1, 4) - .add(util.select.position(2, 1, 3)); - BlockPos pumpPos = util.grid.at(2, 1, 2); - Selection pump = util.select.position(pumpPos); - Selection tank1 = util.select.fromTo(4, 1, 2, 4, 2, 2); - Selection tank2 = util.select.fromTo(0, 1, 2, 0, 2, 2); - Selection megapipe1 = util.select.fromTo(0, 3, 5, 1, 4, 2); - Selection megapipe2 = util.select.fromTo(3, 3, 1, 5, 6, 2); + Selection largeCog = util.select().position(5, 0, 3); + Selection cogs = util.select().fromTo(5, 1, 4, 2, 1, 4) + .add(util.select().position(2, 1, 3)); + BlockPos pumpPos = util.grid().at(2, 1, 2); + Selection pump = util.select().position(pumpPos); + Selection tank1 = util.select().fromTo(4, 1, 2, 4, 2, 2); + Selection tank2 = util.select().fromTo(0, 1, 2, 0, 2, 2); + Selection megapipe1 = util.select().fromTo(0, 3, 5, 1, 4, 2); + Selection megapipe2 = util.select().fromTo(3, 3, 1, 5, 6, 2); - scene.world.modifyBlock(pumpPos, s -> s.setValue(PumpBlock.FACING, Direction.WEST), false); - scene.world.modifyBlockEntity(util.grid.at(0, 1, 2), FluidTankBlockEntity.class, be -> be.getTankInventory() + scene.world().modifyBlock(pumpPos, s -> s.setValue(PumpBlock.FACING, Direction.WEST), false); + scene.world().modifyBlockEntity(util.grid().at(0, 1, 2), FluidTankBlockEntity.class, be -> be.getTankInventory() .drain(3000, FluidAction.EXECUTE)); - scene.world.multiplyKineticSpeed(util.select.everywhere(), 0.125f); + scene.world().multiplyKineticSpeed(util.select().everywhere(), 0.125f); BlockPos east = pumpPos.east(); - scene.world.setBlock(east, Blocks.AIR.defaultBlockState(), false); - scene.world.setBlock(east, AllBlocks.GLASS_FLUID_PIPE.getDefaultState() + scene.world().setBlock(east, Blocks.AIR.defaultBlockState(), false); + scene.world().setBlock(east, AllBlocks.GLASS_FLUID_PIPE.getDefaultState() .setValue(GlassFluidPipeBlock.AXIS, Axis.X), false); - scene.world.setBlock(pumpPos.south(), AllBlocks.COGWHEEL.getDefaultState() + scene.world().setBlock(pumpPos.south(), AllBlocks.COGWHEEL.getDefaultState() .setValue(CogWheelBlock.AXIS, Axis.X), false); - Selection southPump = util.select.position(pumpPos.south()); - scene.world.setKineticSpeed(southPump, 4); + Selection southPump = util.select().position(pumpPos.south()); + scene.world().setKineticSpeed(southPump, 4); - scene.world.setKineticSpeed(pump, 0); - scene.world.showSection(pump, Direction.DOWN); + scene.world().setKineticSpeed(pump, 0); + scene.world().showSection(pump, Direction.DOWN); scene.idle(10); - ElementLink mp1 = scene.world.showIndependentSection(megapipe1, Direction.EAST); - scene.world.moveSection(mp1, util.vector.of(0, -3, 0), 0); + ElementLink mp1 = scene.world().showIndependentSection(megapipe1, Direction.EAST); + scene.world().moveSection(mp1, util.vector().of(0, -3, 0), 0); scene.idle(5); - ElementLink mp2 = scene.world.showIndependentSection(megapipe2, Direction.WEST); - scene.world.moveSection(mp2, util.vector.of(0, -3, 0), 0); + ElementLink mp2 = scene.world().showIndependentSection(megapipe2, Direction.WEST); + scene.world().moveSection(mp2, util.vector().of(0, -3, 0), 0); scene.idle(15); - scene.overlay.showText(70) + scene.overlay().showText(70) .attachKeyFrame() - .pointAt(util.vector.topOf(pumpPos)) + .pointAt(util.vector().topOf(pumpPos)) .placeNearTarget() .text("Regardless of speed, Mechanical Pumps affect pipes connected up to 16 blocks away"); scene.idle(75); - scene.world.hideIndependentSection(mp1, Direction.WEST); + scene.world().hideIndependentSection(mp1, Direction.WEST); scene.idle(5); - scene.world.hideIndependentSection(mp2, Direction.EAST); + scene.world().hideIndependentSection(mp2, Direction.EAST); scene.idle(15); - scene.world.showSection(tank1, Direction.DOWN); + scene.world().showSection(tank1, Direction.DOWN); scene.idle(2); - scene.world.showSection(util.select.position(east), Direction.DOWN); + scene.world().showSection(util.select().position(east), Direction.DOWN); scene.idle(5); BlockPos west = pumpPos.west(); - scene.world.showSection(util.select.position(west), Direction.DOWN); + scene.world().showSection(util.select().position(west), Direction.DOWN); scene.idle(2); - scene.world.showSection(tank2, Direction.DOWN); + scene.world().showSection(tank2, Direction.DOWN); scene.idle(5); - scene.world.showSection(largeCog, Direction.UP); - scene.world.showSection(cogs, Direction.SOUTH); + scene.world().showSection(largeCog, Direction.UP); + scene.world().showSection(cogs, Direction.SOUTH); scene.idle(10); - scene.world.setKineticSpeed(util.select.position(pumpPos), -4); - scene.effects.rotationSpeedIndicator(pumpPos); - scene.world.propagatePipeChange(pumpPos); + scene.world().setKineticSpeed(util.select().position(pumpPos), -4); + scene.effects().rotationSpeedIndicator(pumpPos); + scene.world().propagatePipeChange(pumpPos); scene.idle(40); - scene.world.multiplyKineticSpeed(util.select.everywhere(), 8); - scene.effects.rotationSpeedIndicator(pumpPos); - scene.world.propagatePipeChange(pumpPos); + scene.world().multiplyKineticSpeed(util.select().everywhere(), 8); + scene.effects().rotationSpeedIndicator(pumpPos); + scene.world().propagatePipeChange(pumpPos); scene.idle(20); - scene.overlay.showText(60) + scene.overlay().showText(60) .attachKeyFrame() - .pointAt(util.vector.topOf(pumpPos)) + .pointAt(util.vector().topOf(pumpPos)) .placeNearTarget() .text("Speeding up the input rotation changes the speed of flow propagation..."); scene.idle(70); - scene.overlay.showText(50) - .pointAt(util.vector.blockSurface(util.grid.at(0, 1, 2), Direction.WEST)) + scene.overlay().showText(50) + .pointAt(util.vector().blockSurface(util.grid().at(0, 1, 2), Direction.WEST)) .placeNearTarget() .text("...and the speed at which fluids are transferred"); scene.idle(60); @@ -257,80 +257,80 @@ public class PumpScenes { BlockState pipeState = AllBlocks.FLUID_PIPE.getDefaultState() .setValue(FluidPipeBlock.DOWN, false) .setValue(FluidPipeBlock.UP, false); - scene.world.setKineticSpeed(util.select.everywhere(), 0); + scene.world().setKineticSpeed(util.select().everywhere(), 0); scene.idle(10); - scene.world.setBlock(east, pipeState, true); - scene.world.setBlock(west, pipeState, true); + scene.world().setBlock(east, pipeState, true); + scene.world().setBlock(west, pipeState, true); - scene.world.setBlock(east.north(), pipeState.setValue(FluidPipeBlock.NORTH, false) + scene.world().setBlock(east.north(), pipeState.setValue(FluidPipeBlock.NORTH, false) .setValue(FluidPipeBlock.EAST, false), false); - scene.world.setBlock(east.south(), pipeState.setValue(FluidPipeBlock.SOUTH, false) + scene.world().setBlock(east.south(), pipeState.setValue(FluidPipeBlock.SOUTH, false) .setValue(FluidPipeBlock.EAST, false), false); - scene.world.showSection(util.select.position(east.north()), Direction.DOWN); - scene.world.showSection(util.select.position(east.south()), Direction.DOWN); - Selection northPump = util.select.position(pumpPos.north()); + scene.world().showSection(util.select().position(east.north()), Direction.DOWN); + scene.world().showSection(util.select().position(east.south()), Direction.DOWN); + Selection northPump = util.select().position(pumpPos.north()); - scene.world.setBlock(west.north(), pipeState.setValue(FluidPipeBlock.NORTH, false) + scene.world().setBlock(west.north(), pipeState.setValue(FluidPipeBlock.NORTH, false) .setValue(FluidPipeBlock.WEST, false), false); - scene.world.setBlock(west.south(), pipeState.setValue(FluidPipeBlock.SOUTH, false) + scene.world().setBlock(west.south(), pipeState.setValue(FluidPipeBlock.SOUTH, false) .setValue(FluidPipeBlock.WEST, false), false); - scene.world.showSection(util.select.position(west.north()), Direction.DOWN); - scene.world.showSection(util.select.position(west.south()), Direction.DOWN); + scene.world().showSection(util.select().position(west.north()), Direction.DOWN); + scene.world().showSection(util.select().position(west.south()), Direction.DOWN); - scene.world.restoreBlocks(southPump); - scene.world.modifyBlock(pumpPos.south(), s -> s.setValue(PumpBlock.FACING, Direction.WEST), true); - scene.world.setKineticSpeed(util.select.everywhere(), 0); - scene.world.showSection(northPump, Direction.DOWN); - scene.world.modifyBlock(pumpPos.north(), s -> s.setValue(PumpBlock.FACING, Direction.EAST), false); + scene.world().restoreBlocks(southPump); + scene.world().modifyBlock(pumpPos.south(), s -> s.setValue(PumpBlock.FACING, Direction.WEST), true); + scene.world().setKineticSpeed(util.select().everywhere(), 0); + scene.world().showSection(northPump, Direction.DOWN); + scene.world().modifyBlock(pumpPos.north(), s -> s.setValue(PumpBlock.FACING, Direction.EAST), false); scene.idle(4); - scene.world.setKineticSpeed(util.select.everywhere(), -16); - scene.world.setKineticSpeed(northPump, 16); - scene.world.setKineticSpeed(southPump, 16); - scene.world.setKineticSpeed(largeCog, 8); + scene.world().setKineticSpeed(util.select().everywhere(), -16); + scene.world().setKineticSpeed(northPump, 16); + scene.world().setKineticSpeed(southPump, 16); + scene.world().setKineticSpeed(largeCog, 8); scene.idle(20); - scene.overlay.showSelectionWithText(util.select.fromTo(2, 1, 1, 2, 1, 3), 60) + scene.overlay().showSelectionWithText(util.select().fromTo(2, 1, 1, 2, 1, 3), 60) .attachKeyFrame() .colored(PonderPalette.GREEN) - .pointAt(util.vector.topOf(pumpPos)) + .pointAt(util.vector().topOf(pumpPos)) .placeNearTarget() .text("Pumps can combine their throughputs within shared pipe networks"); scene.idle(70); scene.idle(30); - scene.overlay - .showControls(new InputWindowElement(util.vector.topOf(pumpPos.north()), Pointing.DOWN).rightClick() + scene.overlay() + .showControls(new InputWindowElement(util.vector().topOf(pumpPos.north()), Pointing.DOWN).rightClick() .withItem(AllItems.WRENCH.asStack()), 30); scene.idle(7); - scene.world.modifyBlock(pumpPos.north(), s -> s.setValue(PumpBlock.FACING, Direction.WEST), true); + scene.world().modifyBlock(pumpPos.north(), s -> s.setValue(PumpBlock.FACING, Direction.WEST), true); scene.idle(30); - scene.overlay.showText(70) + scene.overlay().showText(70) .attachKeyFrame() - .pointAt(util.vector.topOf(pumpPos.north()) + .pointAt(util.vector().topOf(pumpPos.north()) .subtract(0.5f, 0.125f, 0)) .placeNearTarget() .text("Ensure that all of them are facing in the same direction"); scene.idle(40); - scene.world.multiplyKineticSpeed(util.select.everywhere(), 4); - scene.effects.rotationSpeedIndicator(pumpPos); - scene.effects.rotationSpeedIndicator(pumpPos.north()); - scene.effects.rotationSpeedIndicator(pumpPos.south()); - scene.world.propagatePipeChange(pumpPos); - scene.world.propagatePipeChange(pumpPos.north()); - scene.world.propagatePipeChange(pumpPos.south()); + scene.world().multiplyKineticSpeed(util.select().everywhere(), 4); + scene.effects().rotationSpeedIndicator(pumpPos); + scene.effects().rotationSpeedIndicator(pumpPos.north()); + scene.effects().rotationSpeedIndicator(pumpPos.south()); + scene.world().propagatePipeChange(pumpPos); + scene.world().propagatePipeChange(pumpPos.north()); + scene.world().propagatePipeChange(pumpPos.south()); scene.idle(100); - scene.world.multiplyKineticSpeed(util.select.everywhere(), -1); - scene.effects.rotationSpeedIndicator(pumpPos); - scene.effects.rotationSpeedIndicator(pumpPos.north()); - scene.effects.rotationSpeedIndicator(pumpPos.south()); - scene.world.propagatePipeChange(pumpPos); - scene.world.propagatePipeChange(pumpPos.north()); - scene.world.propagatePipeChange(pumpPos.south()); + scene.world().multiplyKineticSpeed(util.select().everywhere(), -1); + scene.effects().rotationSpeedIndicator(pumpPos); + scene.effects().rotationSpeedIndicator(pumpPos.north()); + scene.effects().rotationSpeedIndicator(pumpPos.south()); + scene.world().propagatePipeChange(pumpPos); + scene.world().propagatePipeChange(pumpPos.north()); + scene.world().propagatePipeChange(pumpPos.south()); } } diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/SpoutScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/SpoutScenes.java index 984316bb6a..27bedac726 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/SpoutScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/SpoutScenes.java @@ -11,10 +11,10 @@ import com.simibubi.create.foundation.ponder.element.BeltItemElement; import net.createmod.catnip.utility.Pointing; import net.createmod.catnip.utility.VecHelper; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; import net.createmod.ponder.foundation.ElementLink; import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.SceneBuilder; -import net.createmod.ponder.foundation.SceneBuildingUtil; import net.createmod.ponder.foundation.Selection; import net.createmod.ponder.foundation.element.InputWindowElement; import net.createmod.ponder.foundation.element.WorldSectionElement; @@ -40,25 +40,25 @@ public class SpoutScenes { scene.idle(5); ElementLink depot = - scene.world.showIndependentSection(util.select.position(2, 1, 1), Direction.DOWN); - scene.world.moveSection(depot, util.vector.of(0, 0, 1), 0); + scene.world().showIndependentSection(util.select().position(2, 1, 1), Direction.DOWN); + scene.world().moveSection(depot, util.vector().of(0, 0, 1), 0); scene.idle(10); - scene.world.modifyBlock(util.grid.at(2, 3, 3), s -> s.setValue(PumpBlock.FACING, Direction.NORTH), false); + scene.world().modifyBlock(util.grid().at(2, 3, 3), s -> s.setValue(PumpBlock.FACING, Direction.NORTH), false); - Selection largeCog = util.select.position(3, 0, 5); - Selection kinetics = util.select.fromTo(2, 1, 5, 2, 2, 3); - Selection tank = util.select.fromTo(1, 1, 4, 1, 2, 4); - Selection pipes = util.select.fromTo(1, 3, 4, 2, 3, 3); + Selection largeCog = util.select().position(3, 0, 5); + Selection kinetics = util.select().fromTo(2, 1, 5, 2, 2, 3); + Selection tank = util.select().fromTo(1, 1, 4, 1, 2, 4); + Selection pipes = util.select().fromTo(1, 3, 4, 2, 3, 3); - Selection spoutS = util.select.position(2, 3, 2); - BlockPos spoutPos = util.grid.at(2, 3, 2); - BlockPos depotPos = util.grid.at(2, 1, 1); - scene.world.showSection(spoutS, Direction.DOWN); + Selection spoutS = util.select().position(2, 3, 2); + BlockPos spoutPos = util.grid().at(2, 3, 2); + BlockPos depotPos = util.grid().at(2, 1, 1); + scene.world().showSection(spoutS, Direction.DOWN); scene.idle(10); - Vec3 spoutSide = util.vector.blockSurface(spoutPos, Direction.WEST); - scene.overlay.showText(60) + Vec3 spoutSide = util.vector().blockSurface(spoutPos, Direction.WEST); + scene.overlay().showText(60) .pointAt(spoutSide) .placeNearTarget() .attachKeyFrame() @@ -66,87 +66,87 @@ public class SpoutScenes { scene.idle(50); - scene.world.showSection(tank, Direction.DOWN); + scene.world().showSection(tank, Direction.DOWN); scene.idle(5); - scene.world.showSection(largeCog, Direction.UP); - scene.world.showSection(kinetics, Direction.NORTH); - scene.world.showSection(pipes, Direction.NORTH); + scene.world().showSection(largeCog, Direction.UP); + scene.world().showSection(kinetics, Direction.NORTH); + scene.world().showSection(pipes, Direction.NORTH); scene.idle(20); FluidStack honey = new FluidStack(FluidHelper.convertToStill(AllFluids.HONEY.get()), 1000); ItemStack bucket = AllFluids.HONEY.get() .getFluidType() .getBucket(honey); - scene.overlay.showControls( - new InputWindowElement(util.vector.blockSurface(util.grid.at(2, 3, 2), Direction.NORTH), Pointing.RIGHT) + scene.overlay().showControls( + new InputWindowElement(util.vector().blockSurface(util.grid().at(2, 3, 2), Direction.NORTH), Pointing.RIGHT) .showing(AllIcons.I_MTD_CLOSE) .withItem(bucket), 40); scene.idle(7); - scene.overlay.showSelectionWithText(util.select.position(2, 3, 2), 50) - .pointAt(util.vector.blockSurface(util.grid.at(2, 3, 2), Direction.WEST)) + scene.overlay().showSelectionWithText(util.select().position(2, 3, 2), 50) + .pointAt(util.vector().blockSurface(util.grid().at(2, 3, 2), Direction.WEST)) .attachKeyFrame() .colored(PonderPalette.RED) .placeNearTarget() .text("The content of a Spout cannot be accessed manually"); scene.idle(60); - scene.overlay.showText(70) - .pointAt(util.vector.blockSurface(util.grid.at(2, 3, 3), Direction.WEST)) + scene.overlay().showText(70) + .pointAt(util.vector().blockSurface(util.grid().at(2, 3, 3), Direction.WEST)) .colored(PonderPalette.GREEN) .placeNearTarget() .text("Instead, Pipes can be used to supply it with fluids"); scene.idle(90); - scene.overlay.showText(60) + scene.overlay().showText(60) .pointAt(spoutSide.subtract(0, 2, 0)) .attachKeyFrame() .placeNearTarget() .text("The Input items can be placed on a Depot under the Spout"); scene.idle(50); ItemStack bottle = new ItemStack(Items.GLASS_BOTTLE); - scene.world.createItemOnBeltLike(depotPos, Direction.NORTH, bottle); - Vec3 depotCenter = util.vector.centerOf(depotPos.south()); - scene.overlay.showControls(new InputWindowElement(depotCenter, Pointing.UP).withItem(bottle), 30); + scene.world().createItemOnBeltLike(depotPos, Direction.NORTH, bottle); + Vec3 depotCenter = util.vector().centerOf(depotPos.south()); + scene.overlay().showControls(new InputWindowElement(depotCenter, Pointing.UP).withItem(bottle), 30); scene.idle(10); scene.idle(20); - scene.world.modifyBlockEntityNBT(spoutS, SpoutBlockEntity.class, nbt -> nbt.putInt("ProcessingTicks", 20)); + scene.world().modifyBlockEntityNBT(spoutS, SpoutBlockEntity.class, nbt -> nbt.putInt("ProcessingTicks", 20)); scene.idle(20); - scene.world.removeItemsFromBelt(depotPos); + scene.world().removeItemsFromBelt(depotPos); ItemStack potion = new ItemStack(Items.HONEY_BOTTLE); - scene.world.createItemOnBeltLike(depotPos, Direction.UP, potion); + scene.world().createItemOnBeltLike(depotPos, Direction.UP, potion); ParticleOptions fluidParticle = FluidFX.getFluidParticle(new FluidStack(AllFluids.HONEY.get(), 1000)); for (int i = 0; i < 10; i++) { - scene.effects.emitParticles(util.vector.topOf(depotPos.south()) + scene.effects().emitParticles(util.vector().topOf(depotPos.south()) .add(0, 1 / 16f, 0), - Emitter.simple(fluidParticle, VecHelper.offsetRandomly(Vec3.ZERO, random, .1f)), 1, 1); + Emitter.simple(fluidParticle, VecHelper.offsetRandomly(Vec3.ZERO, random, .1f)), 1, 1); } scene.idle(10); - scene.overlay.showControls(new InputWindowElement(depotCenter, Pointing.UP).withItem(potion), 50); + scene.overlay().showControls(new InputWindowElement(depotCenter, Pointing.UP).withItem(potion), 50); scene.idle(60); - scene.world.hideIndependentSection(depot, Direction.NORTH); + scene.world().hideIndependentSection(depot, Direction.NORTH); scene.idle(5); - scene.world.showSection(util.select.fromTo(0, 1, 3, 0, 2, 3), Direction.DOWN); + scene.world().showSection(util.select().fromTo(0, 1, 3, 0, 2, 3), Direction.DOWN); scene.idle(10); - scene.world.showSection(util.select.fromTo(4, 1, 2, 0, 2, 2), Direction.SOUTH); + scene.world().showSection(util.select().fromTo(4, 1, 2, 0, 2, 2), Direction.SOUTH); scene.idle(20); - BlockPos beltPos = util.grid.at(0, 1, 2); - scene.overlay.showText(40) - .pointAt(util.vector.blockSurface(beltPos, Direction.WEST)) + BlockPos beltPos = util.grid().at(0, 1, 2); + scene.overlay().showText(40) + .pointAt(util.vector().blockSurface(beltPos, Direction.WEST)) .placeNearTarget() .attachKeyFrame() .text("When items are provided on a belt..."); scene.idle(30); - ElementLink ingot = scene.world.createItemOnBelt(beltPos, Direction.SOUTH, bottle); + ElementLink ingot = scene.world().createItemOnBelt(beltPos, Direction.SOUTH, bottle); scene.idle(15); - ElementLink ingot2 = scene.world.createItemOnBelt(beltPos, Direction.SOUTH, bottle); + ElementLink ingot2 = scene.world().createItemOnBelt(beltPos, Direction.SOUTH, bottle); scene.idle(15); - scene.world.stallBeltItem(ingot, true); - scene.world.modifyBlockEntityNBT(spoutS, SpoutBlockEntity.class, nbt -> nbt.putInt("ProcessingTicks", 20)); + scene.world().stallBeltItem(ingot, true); + scene.world().modifyBlockEntityNBT(spoutS, SpoutBlockEntity.class, nbt -> nbt.putInt("ProcessingTicks", 20)); - scene.overlay.showText(50) + scene.overlay().showText(50) .pointAt(spoutSide) .placeNearTarget() .attachKeyFrame() @@ -154,29 +154,29 @@ public class SpoutScenes { scene.idle(20); for (int i = 0; i < 10; i++) { - scene.effects.emitParticles(util.vector.topOf(depotPos.south()) + scene.effects().emitParticles(util.vector().topOf(depotPos.south()) .add(0, 1 / 16f, 0), - Emitter.simple(fluidParticle, VecHelper.offsetRandomly(Vec3.ZERO, random, .1f)), 1, 1); + Emitter.simple(fluidParticle, VecHelper.offsetRandomly(Vec3.ZERO, random, .1f)), 1, 1); } - scene.world.removeItemsFromBelt(spoutPos.below(2)); - ingot = scene.world.createItemOnBelt(spoutPos.below(2), Direction.UP, potion); - scene.world.stallBeltItem(ingot, true); + scene.world().removeItemsFromBelt(spoutPos.below(2)); + ingot = scene.world().createItemOnBelt(spoutPos.below(2), Direction.UP, potion); + scene.world().stallBeltItem(ingot, true); scene.idle(5); - scene.world.stallBeltItem(ingot, false); + scene.world().stallBeltItem(ingot, false); scene.idle(15); - scene.world.stallBeltItem(ingot2, true); - scene.world.modifyBlockEntityNBT(spoutS, SpoutBlockEntity.class, nbt -> nbt.putInt("ProcessingTicks", 20)); + scene.world().stallBeltItem(ingot2, true); + scene.world().modifyBlockEntityNBT(spoutS, SpoutBlockEntity.class, nbt -> nbt.putInt("ProcessingTicks", 20)); scene.idle(20); for (int i = 0; i < 10; i++) { - scene.effects.emitParticles(util.vector.topOf(depotPos.south()) + scene.effects().emitParticles(util.vector().topOf(depotPos.south()) .add(0, 1 / 16f, 0), - Emitter.simple(fluidParticle, VecHelper.offsetRandomly(Vec3.ZERO, random, .1f)), 1, 1); + Emitter.simple(fluidParticle, VecHelper.offsetRandomly(Vec3.ZERO, random, .1f)), 1, 1); } - scene.world.removeItemsFromBelt(spoutPos.below(2)); - ingot2 = scene.world.createItemOnBelt(spoutPos.below(2), Direction.UP, potion); - scene.world.stallBeltItem(ingot2, true); + scene.world().removeItemsFromBelt(spoutPos.below(2)); + ingot2 = scene.world().createItemOnBelt(spoutPos.below(2), Direction.UP, potion); + scene.world().stallBeltItem(ingot2, true); scene.idle(5); - scene.world.stallBeltItem(ingot2, false); + scene.world().stallBeltItem(ingot2, false); } diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrackObserverScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrackObserverScenes.java index cfc57a6fc4..967cf04eb4 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrackObserverScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrackObserverScenes.java @@ -5,10 +5,10 @@ import com.simibubi.create.content.trains.observer.TrackObserverBlockEntity; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; import net.createmod.ponder.foundation.ElementLink; import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.SceneBuilder; -import net.createmod.ponder.foundation.SceneBuildingUtil; import net.createmod.ponder.foundation.Selection; import net.createmod.ponder.foundation.element.InputWindowElement; import net.createmod.ponder.foundation.element.ParrotElement; @@ -29,143 +29,143 @@ public class TrackObserverScenes { scene.setSceneOffsetY(-1); scene.showBasePlate(); - scene.world.toggleControls(util.grid.at(5, 3, 7)); - scene.special.movePointOfInterest(util.grid.at(-10, 2, 7)); + scene.world().toggleControls(util.grid().at(5, 3, 7)); + scene.special().movePointOfInterest(util.grid().at(-10, 2, 7)); - Selection observer = util.select.position(5, 1, 4); - Selection redstone = util.select.fromTo(5, 1, 3, 5, 1, 2); + Selection observer = util.select().position(5, 1, 4); + Selection redstone = util.select().fromTo(5, 1, 3, 5, 1, 2); - Selection train1 = util.select.fromTo(7, 2, 6, 3, 3, 8); - Selection train2 = util.select.fromTo(11, 2, 6, 8, 3, 8); - Selection train2a = util.select.fromTo(11, 2, 3, 8, 3, 5); - Selection train2b = util.select.fromTo(11, 2, 0, 8, 3, 2); + Selection train1 = util.select().fromTo(7, 2, 6, 3, 3, 8); + Selection train2 = util.select().fromTo(11, 2, 6, 8, 3, 8); + Selection train2a = util.select().fromTo(11, 2, 3, 8, 3, 5); + Selection train2b = util.select().fromTo(11, 2, 0, 8, 3, 2); for (int i = 10; i >= 0; i--) { - scene.world.showSection(util.select.position(i, 1, 7), Direction.DOWN); + scene.world().showSection(util.select().position(i, 1, 7), Direction.DOWN); scene.idle(1); } scene.idle(10); - Vec3 target = util.vector.topOf(5, 0, 7); + Vec3 target = util.vector().topOf(5, 0, 7); AABB bb = new AABB(target, target).move(0, 2 / 16f, 0); - scene.overlay.showControls(new InputWindowElement(target, Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(target, Pointing.DOWN).rightClick() .withItem(AllBlocks.TRACK_OBSERVER.asStack()), 40); scene.idle(6); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, bb, bb, 1); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, bb, bb.inflate(.45f, 1 / 16f, .45f), 60); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, bb, bb, 1); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, bb, bb.inflate(.45f, 1 / 16f, .45f), 60); scene.idle(10); - scene.overlay.showText(50) + scene.overlay().showText(50) .pointAt(target) .placeNearTarget() .colored(PonderPalette.GREEN) .text("Select a Train Track then place the Observer nearby"); scene.idle(20); - scene.world.showSection(observer, Direction.DOWN); + scene.world().showSection(observer, Direction.DOWN); scene.idle(15); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, bb, new AABB(util.grid.at(5, 1, 4)), 20); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, bb, new AABB(util.grid().at(5, 1, 4)), 20); scene.idle(25); - scene.overlay.showText(70) - .pointAt(util.vector.blockSurface(util.grid.at(5, 1, 4), Direction.WEST)) + scene.overlay().showText(70) + .pointAt(util.vector().blockSurface(util.grid().at(5, 1, 4), Direction.WEST)) .attachKeyFrame() .placeNearTarget() .text("The Observer will detect any Trains passing over the marker"); scene.idle(20); - scene.world.showSection(redstone, Direction.SOUTH); + scene.world().showSection(redstone, Direction.SOUTH); scene.idle(30); - ElementLink trainInstance1 = scene.world.showIndependentSection(train1, Direction.WEST); - scene.world.moveSection(trainInstance1, util.vector.of(6, 0, 0), 0); - scene.world.moveSection(trainInstance1, util.vector.of(-16, 0, 0), 80); - scene.world.animateBogey(util.grid.at(5, 2, 7), 16, 80); + ElementLink trainInstance1 = scene.world().showIndependentSection(train1, Direction.WEST); + scene.world().moveSection(trainInstance1, util.vector().of(6, 0, 0), 0); + scene.world().moveSection(trainInstance1, util.vector().of(-16, 0, 0), 80); + scene.world().animateBogey(util.grid().at(5, 2, 7), 16, 80); ElementLink birb = - scene.special.createBirb(util.vector.centerOf(12, 3, 7), ParrotElement.FacePointOfInterestPose::new); - scene.special.moveParrot(birb, util.vector.of(-16, 0, 0), 80); + scene.special().createBirb(util.vector().centerOf(12, 3, 7), ParrotElement.FacePointOfInterestPose::new); + scene.special().moveParrot(birb, util.vector().of(-16, 0, 0), 80); scene.idle(10); - ElementLink trainInstance2 = scene.world.showIndependentSection(train2, Direction.WEST); - scene.world.moveSection(trainInstance2, util.vector.of(4, 0, 0), 0); - scene.world.moveSection(trainInstance2, util.vector.of(-14, 0, 0), 70); - scene.world.animateBogey(util.grid.at(9, 2, 7), 14, 70); + ElementLink trainInstance2 = scene.world().showIndependentSection(train2, Direction.WEST); + scene.world().moveSection(trainInstance2, util.vector().of(4, 0, 0), 0); + scene.world().moveSection(trainInstance2, util.vector().of(-14, 0, 0), 70); + scene.world().animateBogey(util.grid().at(9, 2, 7), 14, 70); Selection add = redstone.add(observer); scene.idle(13); - scene.world.toggleRedstonePower(add); - scene.effects.indicateRedstone(util.grid.at(5, 1, 4)); + scene.world().toggleRedstonePower(add); + scene.effects().indicateRedstone(util.grid().at(5, 1, 4)); scene.idle(20); - scene.world.hideIndependentSection(trainInstance1, Direction.WEST); - scene.special.hideElement(birb, Direction.WEST); + scene.world().hideIndependentSection(trainInstance1, Direction.WEST); + scene.special().hideElement(birb, Direction.WEST); scene.idle(10); - scene.world.toggleRedstonePower(add); + scene.world().toggleRedstonePower(add); scene.idle(5); - scene.world.hideIndependentSection(trainInstance2, Direction.WEST); + scene.world().hideIndependentSection(trainInstance2, Direction.WEST); scene.idle(20); - target = util.vector.topOf(5, 1, 4); + target = util.vector().topOf(5, 1, 4); bb = new AABB(target, target); - scene.overlay.showCenteredScrollInput(util.grid.at(5, 1, 4), Direction.UP, 60); + scene.overlay().showCenteredScrollInput(util.grid().at(5, 1, 4), Direction.UP, 60); - scene.overlay.showText(80) - .pointAt(util.vector.topOf(5, 1, 4)) + scene.overlay().showText(80) + .pointAt(util.vector().topOf(5, 1, 4)) .attachKeyFrame() .placeNearTarget() .text("Observers can be filtered to activate for matching cargo"); scene.idle(40); ItemStack waterBucket = new ItemStack(Items.WATER_BUCKET); - scene.overlay.showControls(new InputWindowElement(target, Pointing.DOWN).withItem(waterBucket), 30); + scene.overlay().showControls(new InputWindowElement(target, Pointing.DOWN).withItem(waterBucket), 30); scene.idle(6); - scene.world.setFilterData(observer, TrackObserverBlockEntity.class, waterBucket); + scene.world().setFilterData(observer, TrackObserverBlockEntity.class, waterBucket); scene.idle(50); - trainInstance1 = scene.world.showIndependentSection(train1, Direction.WEST); - scene.world.moveSection(trainInstance1, util.vector.of(6, 0, 0), 0); - scene.world.moveSection(trainInstance1, util.vector.of(-16, 0, 0), 80); - scene.world.animateBogey(util.grid.at(5, 2, 7), 16, 80); - birb = scene.special.createBirb(util.vector.centerOf(12, 3, 7), ParrotElement.FacePointOfInterestPose::new); - scene.special.moveParrot(birb, util.vector.of(-16, 0, 0), 80); + trainInstance1 = scene.world().showIndependentSection(train1, Direction.WEST); + scene.world().moveSection(trainInstance1, util.vector().of(6, 0, 0), 0); + scene.world().moveSection(trainInstance1, util.vector().of(-16, 0, 0), 80); + scene.world().animateBogey(util.grid().at(5, 2, 7), 16, 80); + birb = scene.special().createBirb(util.vector().centerOf(12, 3, 7), ParrotElement.FacePointOfInterestPose::new); + scene.special().moveParrot(birb, util.vector().of(-16, 0, 0), 80); scene.idle(10); - trainInstance2 = scene.world.showIndependentSection(train2b, Direction.WEST); - scene.world.moveSection(trainInstance2, util.vector.of(4, 0, 6), 0); - scene.world.moveSection(trainInstance2, util.vector.of(-14, 0, 0), 70); - scene.world.animateBogey(util.grid.at(9, 2, 1), 14, 80); + trainInstance2 = scene.world().showIndependentSection(train2b, Direction.WEST); + scene.world().moveSection(trainInstance2, util.vector().of(4, 0, 6), 0); + scene.world().moveSection(trainInstance2, util.vector().of(-14, 0, 0), 70); + scene.world().animateBogey(util.grid().at(9, 2, 1), 14, 80); scene.idle(33); - scene.world.hideIndependentSection(trainInstance1, Direction.WEST); - scene.special.hideElement(birb, Direction.WEST); + scene.world().hideIndependentSection(trainInstance1, Direction.WEST); + scene.special().hideElement(birb, Direction.WEST); scene.idle(10); - scene.world.hideIndependentSection(trainInstance2, Direction.WEST); + scene.world().hideIndependentSection(trainInstance2, Direction.WEST); scene.idle(20); - trainInstance1 = scene.world.showIndependentSection(train1, Direction.WEST); - scene.world.moveSection(trainInstance1, util.vector.of(6, 0, 0), 0); - scene.world.moveSection(trainInstance1, util.vector.of(-16, 0, 0), 80); - scene.world.animateBogey(util.grid.at(5, 2, 7), 16, 80); - birb = scene.special.createBirb(util.vector.centerOf(12, 3, 7), ParrotElement.FacePointOfInterestPose::new); - scene.special.moveParrot(birb, util.vector.of(-16, 0, 0), 80); + trainInstance1 = scene.world().showIndependentSection(train1, Direction.WEST); + scene.world().moveSection(trainInstance1, util.vector().of(6, 0, 0), 0); + scene.world().moveSection(trainInstance1, util.vector().of(-16, 0, 0), 80); + scene.world().animateBogey(util.grid().at(5, 2, 7), 16, 80); + birb = scene.special().createBirb(util.vector().centerOf(12, 3, 7), ParrotElement.FacePointOfInterestPose::new); + scene.special().moveParrot(birb, util.vector().of(-16, 0, 0), 80); scene.idle(10); - trainInstance2 = scene.world.showIndependentSection(train2a, Direction.WEST); - scene.world.moveSection(trainInstance2, util.vector.of(4, 0, 3), 0); - scene.world.moveSection(trainInstance2, util.vector.of(-14, 0, 0), 70); - scene.world.animateBogey(util.grid.at(9, 2, 4), 14, 70); + trainInstance2 = scene.world().showIndependentSection(train2a, Direction.WEST); + scene.world().moveSection(trainInstance2, util.vector().of(4, 0, 3), 0); + scene.world().moveSection(trainInstance2, util.vector().of(-14, 0, 0), 70); + scene.world().animateBogey(util.grid().at(9, 2, 4), 14, 70); scene.idle(13); - scene.world.toggleRedstonePower(add); - scene.effects.indicateRedstone(util.grid.at(5, 1, 4)); + scene.world().toggleRedstonePower(add); + scene.effects().indicateRedstone(util.grid().at(5, 1, 4)); scene.idle(20); - scene.world.hideIndependentSection(trainInstance1, Direction.WEST); - scene.special.hideElement(birb, Direction.WEST); + scene.world().hideIndependentSection(trainInstance1, Direction.WEST); + scene.special().hideElement(birb, Direction.WEST); scene.idle(10); - scene.world.toggleRedstonePower(add); + scene.world().toggleRedstonePower(add); scene.idle(5); - scene.world.hideIndependentSection(trainInstance2, Direction.WEST); + scene.world().hideIndependentSection(trainInstance2, Direction.WEST); } diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrackScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrackScenes.java index 4656e925ea..25c5a12433 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrackScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrackScenes.java @@ -7,10 +7,10 @@ import com.simibubi.create.content.processing.burner.BlazeBurnerBlock; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; import net.createmod.ponder.foundation.ElementLink; import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.SceneBuilder; -import net.createmod.ponder.foundation.SceneBuildingUtil; import net.createmod.ponder.foundation.Selection; import net.createmod.ponder.foundation.element.InputWindowElement; import net.createmod.ponder.foundation.element.ParrotElement; @@ -31,29 +31,29 @@ public class TrackScenes { scene.idle(10); ElementLink bgTrack = - scene.world.showIndependentSection(util.select.position(11, 4, 9), Direction.DOWN); - scene.world.moveSection(bgTrack, util.vector.of(0, -2, 0), 0); + scene.world().showIndependentSection(util.select().position(11, 4, 9), Direction.DOWN); + scene.world().moveSection(bgTrack, util.vector().of(0, -2, 0), 0); for (int i = 11; i >= 2; i--) { - scene.world.showSectionAndMerge(util.select.position(i, 3, 9), Direction.DOWN, bgTrack); + scene.world().showSectionAndMerge(util.select().position(i, 3, 9), Direction.DOWN, bgTrack); if (i == 5) - scene.world.showSectionAndMerge(util.select.position(7, 4, 9), Direction.DOWN, bgTrack); + scene.world().showSectionAndMerge(util.select().position(7, 4, 9), Direction.DOWN, bgTrack); scene.idle(2); } - scene.overlay.showText(60) - .pointAt(util.vector.topOf(5, 0, 9)) + scene.overlay().showText(60) + .pointAt(util.vector().topOf(5, 0, 9)) .placeNearTarget() .text("A new type of rail designed for Train Contraptions"); scene.idle(50); ElementLink fgTrack = - scene.world.showIndependentSection(util.select.position(3, 3, 5), Direction.DOWN); - scene.world.moveSection(fgTrack, util.vector.of(0, -2, 0), 0); + scene.world().showIndependentSection(util.select().position(3, 3, 5), Direction.DOWN); + scene.world().moveSection(fgTrack, util.vector().of(0, -2, 0), 0); scene.idle(20); - Vec3 startTrack = util.vector.topOf(3, 0, 5); - scene.overlay.showText(70) + Vec3 startTrack = util.vector().topOf(3, 0, 5); + scene.overlay().showText(70) .pointAt(startTrack) .placeNearTarget() .colored(PonderPalette.GREEN) @@ -62,103 +62,103 @@ public class TrackScenes { scene.idle(30); ItemStack trackStack = AllBlocks.TRACK.asStack(); - scene.overlay.showControls(new InputWindowElement(startTrack, Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(startTrack, Pointing.DOWN).rightClick() .withItem(trackStack), 40); scene.idle(6); - AABB bb = new AABB(util.grid.at(3, 1, 5)).contract(0, .75f, 0) + AABB bb = new AABB(util.grid().at(3, 1, 5)).contract(0, .75f, 0) .inflate(0, 0, .85f); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, startTrack, bb, 32); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, startTrack, bb, 32); scene.idle(45); - scene.overlay.showControls(new InputWindowElement(startTrack.add(9, 0, 0), Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(startTrack.add(9, 0, 0), Pointing.DOWN).rightClick() .withItem(trackStack), 40); scene.idle(6); - scene.overlay.showText(40) - .pointAt(util.vector.topOf(12, 0, 5)) + scene.overlay().showText(40) + .pointAt(util.vector().topOf(12, 0, 5)) .placeNearTarget() .colored(PonderPalette.GREEN) .text("Then place or select a second track"); scene.idle(20); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, startTrack, bb.expandTowards(9, 0, 0), 30); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, startTrack, bb.expandTowards(9, 0, 0), 30); - scene.world.showSectionAndMerge(util.select.fromTo(12, 3, 5, 4, 3, 5), Direction.WEST, fgTrack); + scene.world().showSectionAndMerge(util.select().fromTo(12, 3, 5, 4, 3, 5), Direction.WEST, fgTrack); scene.idle(55); - scene.world.hideIndependentSection(bgTrack, Direction.UP); + scene.world().hideIndependentSection(bgTrack, Direction.UP); scene.idle(7); - scene.world.hideIndependentSection(fgTrack, Direction.UP); + scene.world().hideIndependentSection(fgTrack, Direction.UP); scene.idle(25); - scene.world.showSection(util.select.position(8, 1, 2), Direction.SOUTH); + scene.world().showSection(util.select().position(8, 1, 2), Direction.SOUTH); scene.idle(10); scene.addKeyframe(); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(8, 0, 2), Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(8, 0, 2), Pointing.DOWN).rightClick() .withItem(trackStack), 15); scene.idle(15); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(2, 0, 8), Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(2, 0, 8), Pointing.DOWN).rightClick() .withItem(trackStack), 15); scene.idle(7); - scene.world.showSection(util.select.position(2, 1, 8), Direction.DOWN); + scene.world().showSection(util.select().position(2, 1, 8), Direction.DOWN); scene.idle(25); - scene.overlay.showText(60) - .pointAt(util.vector.topOf(7, 0, 7)) + scene.overlay().showText(60) + .pointAt(util.vector().topOf(7, 0, 7)) .placeNearTarget() .text("Tracks can also be placed as turns or slopes"); scene.idle(40); - scene.world.showSection(util.select.position(12, 1, 2), Direction.SOUTH); + scene.world().showSection(util.select().position(12, 1, 2), Direction.SOUTH); scene.idle(10); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(12, 0, 2), Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(12, 0, 2), Pointing.DOWN).rightClick() .withItem(trackStack), 10); scene.idle(15); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(2, 0, 12), Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(2, 0, 12), Pointing.DOWN).rightClick() .withItem(trackStack), 10); scene.idle(7); - scene.world.showSection(util.select.fromTo(12, 1, 3, 12, 1, 5), Direction.DOWN); + scene.world().showSection(util.select().fromTo(12, 1, 3, 12, 1, 5), Direction.DOWN); scene.idle(3); - scene.world.showSection(util.select.fromTo(12, 1, 6, 6, 1, 12), Direction.DOWN); + scene.world().showSection(util.select().fromTo(12, 1, 6, 6, 1, 12), Direction.DOWN); scene.idle(3); - scene.world.showSection(util.select.fromTo(5, 1, 12, 2, 1, 12), Direction.DOWN); + scene.world().showSection(util.select().fromTo(5, 1, 12, 2, 1, 12), Direction.DOWN); scene.idle(25); - scene.overlay.showText(70) - .pointAt(util.vector.topOf(11, 0, 11)) + scene.overlay().showText(70) + .pointAt(util.vector().topOf(11, 0, 11)) .colored(PonderPalette.GREEN) .attachKeyFrame() .placeNearTarget() .text("When connecting, tracks will try to make each turn equally sized"); scene.idle(70); - scene.world.hideSection(util.select.fromTo(12, 1, 2, 12, 1, 5), Direction.NORTH); - scene.world.hideSection(util.select.fromTo(5, 1, 12, 2, 1, 12), Direction.WEST); + scene.world().hideSection(util.select().fromTo(12, 1, 2, 12, 1, 5), Direction.NORTH); + scene.world().hideSection(util.select().fromTo(5, 1, 12, 2, 1, 12), Direction.WEST); - bb = new AABB(util.grid.at(5, 1, 5)).contract(0, .75f, 0) + bb = new AABB(util.grid().at(5, 1, 5)).contract(0, .75f, 0) .inflate(3, 0, 3) .expandTowards(.85f, 0, .85f); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, startTrack, bb, 32); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, startTrack, bb, 32); scene.idle(20); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, startTrack, bb.move(4, 0, 4), 32); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, startTrack, bb.move(4, 0, 4), 32); scene.idle(30); - scene.world.hideSection(util.select.fromTo(12, 1, 6, 6, 1, 12), Direction.UP); + scene.world().hideSection(util.select().fromTo(12, 1, 6, 6, 1, 12), Direction.UP); scene.idle(5); - scene.world.showSection(util.select.position(12, 1, 2), Direction.SOUTH); + scene.world().showSection(util.select().position(12, 1, 2), Direction.SOUTH); scene.idle(20); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(12, 0, 2), Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(12, 0, 2), Pointing.DOWN).rightClick() .withItem(trackStack), 10); scene.idle(10); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(2, 0, 12), Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(2, 0, 12), Pointing.DOWN).rightClick() .withItem(trackStack) .whileCTRL(), 60); scene.idle(10); - scene.overlay.showText(60) - .pointAt(util.vector.topOf(2, 0, 12)) + scene.overlay().showText(60) + .pointAt(util.vector().topOf(2, 0, 12)) .colored(PonderPalette.GREEN) .attachKeyFrame() .placeNearTarget() @@ -166,95 +166,95 @@ public class TrackScenes { scene.idle(50); ElementLink longBend = - scene.world.showIndependentSection(util.select.position(2, 2, 12), Direction.DOWN); - scene.world.moveSection(longBend, util.vector.of(0, -1, 0), 0); + scene.world().showIndependentSection(util.select().position(2, 2, 12), Direction.DOWN); + scene.world().moveSection(longBend, util.vector().of(0, -1, 0), 0); scene.idle(30); - scene.overlay.showText(60) - .pointAt(util.vector.centerOf(9, 1, 9)) + scene.overlay().showText(60) + .pointAt(util.vector().centerOf(9, 1, 9)) .colored(PonderPalette.GREEN) .placeNearTarget() .text("...will create the longest fitting bend instead"); scene.idle(70); - scene.world.hideIndependentSection(longBend, Direction.UP); - scene.world.hideSection(util.select.position(12, 1, 2), Direction.UP); + scene.world().hideIndependentSection(longBend, Direction.UP); + scene.world().hideSection(util.select().position(12, 1, 2), Direction.UP); scene.idle(5); - scene.world.hideSection(util.select.fromTo(8, 1, 2, 2, 1, 8), Direction.UP); + scene.world().hideSection(util.select().fromTo(8, 1, 2, 2, 1, 8), Direction.UP); scene.idle(25); ElementLink slopeStart = - scene.world.showIndependentSection(util.select.fromTo(12, 6, 2, 12, 9, 12), Direction.DOWN); - scene.world.moveSection(slopeStart, util.vector.of(0, -5, 0), 0); + scene.world().showIndependentSection(util.select().fromTo(12, 6, 2, 12, 9, 12), Direction.DOWN); + scene.world().moveSection(slopeStart, util.vector().of(0, -5, 0), 0); scene.idle(10); - scene.world.showSectionAndMerge(util.select.fromTo(2, 6, 2, 2, 7, 4), Direction.DOWN, slopeStart); - scene.world.showSectionAndMerge(util.select.fromTo(2, 6, 6, 2, 9, 8), Direction.DOWN, slopeStart); - scene.world.showSectionAndMerge(util.select.fromTo(2, 6, 10, 2, 11, 12), Direction.DOWN, slopeStart); + scene.world().showSectionAndMerge(util.select().fromTo(2, 6, 2, 2, 7, 4), Direction.DOWN, slopeStart); + scene.world().showSectionAndMerge(util.select().fromTo(2, 6, 6, 2, 9, 8), Direction.DOWN, slopeStart); + scene.world().showSectionAndMerge(util.select().fromTo(2, 6, 10, 2, 11, 12), Direction.DOWN, slopeStart); scene.idle(20); - scene.overlay - .showControls(new InputWindowElement(util.vector.topOf(12, 3, 11), Pointing.LEFT).withItem(trackStack), 30); + scene.overlay() + .showControls(new InputWindowElement(util.vector().topOf(12, 3, 11), Pointing.LEFT).withItem(trackStack), 30); scene.idle(4); ItemStack smoothStone = new ItemStack(Blocks.SMOOTH_STONE); - scene.overlay.showControls( - new InputWindowElement(util.vector.topOf(12, 3, 11), Pointing.RIGHT).withItem(smoothStone), 26); + scene.overlay().showControls( + new InputWindowElement(util.vector().topOf(12, 3, 11), Pointing.RIGHT).withItem(smoothStone), 26); scene.idle(30); - scene.overlay - .showControls(new InputWindowElement(util.vector.topOf(2, 6, 11), Pointing.LEFT).withItem(trackStack), 30); + scene.overlay() + .showControls(new InputWindowElement(util.vector().topOf(2, 6, 11), Pointing.LEFT).withItem(trackStack), 30); scene.idle(4); - scene.overlay.showControls( - new InputWindowElement(util.vector.topOf(2, 6, 11), Pointing.RIGHT).withItem(smoothStone), 26); + scene.overlay().showControls( + new InputWindowElement(util.vector().topOf(2, 6, 11), Pointing.RIGHT).withItem(smoothStone), 26); scene.idle(10); - scene.world.showSectionAndMerge(util.select.position(2, 12, 11), Direction.DOWN, slopeStart); + scene.world().showSectionAndMerge(util.select().position(2, 12, 11), Direction.DOWN, slopeStart); scene.idle(2); - scene.world.showSectionAndMerge(util.select.fromTo(11, 8, 10, 3, 11, 12), Direction.UP, slopeStart); + scene.world().showSectionAndMerge(util.select().fromTo(11, 8, 10, 3, 11, 12), Direction.UP, slopeStart); scene.idle(20); - scene.overlay.showText(100) - .pointAt(util.vector.blockSurface(util.grid.at(9, 3, 10), Direction.NORTH)) + scene.overlay().showText(100) + .pointAt(util.vector().blockSurface(util.grid().at(9, 3, 10), Direction.NORTH)) .placeNearTarget() .attachKeyFrame() .text("Materials in the off-hand will be paved under tracks automatically"); scene.idle(80); - scene.overlay - .showControls(new InputWindowElement(util.vector.topOf(12, 2, 7), Pointing.LEFT).withItem(trackStack), 30); + scene.overlay() + .showControls(new InputWindowElement(util.vector().topOf(12, 2, 7), Pointing.LEFT).withItem(trackStack), 30); scene.idle(4); smoothStone = new ItemStack(Blocks.SMOOTH_STONE_SLAB); - scene.overlay.showControls( - new InputWindowElement(util.vector.topOf(12, 2, 7), Pointing.RIGHT).withItem(smoothStone), 26); + scene.overlay().showControls( + new InputWindowElement(util.vector().topOf(12, 2, 7), Pointing.RIGHT).withItem(smoothStone), 26); scene.idle(30); - scene.overlay - .showControls(new InputWindowElement(util.vector.topOf(2, 4, 7), Pointing.LEFT).withItem(trackStack), 30); + scene.overlay() + .showControls(new InputWindowElement(util.vector().topOf(2, 4, 7), Pointing.LEFT).withItem(trackStack), 30); scene.idle(4); - scene.overlay - .showControls(new InputWindowElement(util.vector.topOf(2, 4, 7), Pointing.RIGHT).withItem(smoothStone), 26); + scene.overlay() + .showControls(new InputWindowElement(util.vector().topOf(2, 4, 7), Pointing.RIGHT).withItem(smoothStone), 26); scene.idle(10); - scene.world.showSectionAndMerge(util.select.position(2, 10, 7), Direction.DOWN, slopeStart); + scene.world().showSectionAndMerge(util.select().position(2, 10, 7), Direction.DOWN, slopeStart); scene.idle(2); - scene.world.showSectionAndMerge(util.select.fromTo(11, 7, 6, 3, 11, 8), Direction.UP, slopeStart); + scene.world().showSectionAndMerge(util.select().fromTo(11, 7, 6, 3, 11, 8), Direction.UP, slopeStart); scene.idle(20); - scene.overlay - .showControls(new InputWindowElement(util.vector.topOf(12, 1, 3), Pointing.LEFT).withItem(trackStack), 30); + scene.overlay() + .showControls(new InputWindowElement(util.vector().topOf(12, 1, 3), Pointing.LEFT).withItem(trackStack), 30); scene.idle(4); smoothStone = AllBlocks.METAL_GIRDER.asStack(); - scene.overlay.showControls( - new InputWindowElement(util.vector.topOf(12, 1, 3), Pointing.RIGHT).withItem(smoothStone), 26); + scene.overlay().showControls( + new InputWindowElement(util.vector().topOf(12, 1, 3), Pointing.RIGHT).withItem(smoothStone), 26); scene.idle(30); - scene.overlay - .showControls(new InputWindowElement(util.vector.topOf(2, 2, 3), Pointing.LEFT).withItem(trackStack), 30); + scene.overlay() + .showControls(new InputWindowElement(util.vector().topOf(2, 2, 3), Pointing.LEFT).withItem(trackStack), 30); scene.idle(4); - scene.overlay - .showControls(new InputWindowElement(util.vector.topOf(2, 2, 3), Pointing.RIGHT).withItem(smoothStone), 26); + scene.overlay() + .showControls(new InputWindowElement(util.vector().topOf(2, 2, 3), Pointing.RIGHT).withItem(smoothStone), 26); scene.idle(10); - scene.world.showSectionAndMerge(util.select.position(2, 8, 3), Direction.DOWN, slopeStart); + scene.world().showSectionAndMerge(util.select().position(2, 8, 3), Direction.DOWN, slopeStart); } public static void portal(SceneBuilder builder, SceneBuildingUtil util) { @@ -264,79 +264,79 @@ public class TrackScenes { scene.scaleSceneView(.65f); scene.setSceneOffsetY(-1); scene.showBasePlate(); - scene.world.showSection(util.select.fromTo(2, 1, 7, 6, 6, 7), Direction.UP); + scene.world().showSection(util.select().fromTo(2, 1, 7, 6, 6, 7), Direction.UP); scene.idle(10); for (int i = 1; i <= 5; i++) { - scene.world.showSection(util.select.position(4, 1, i), Direction.DOWN); + scene.world().showSection(util.select().position(4, 1, i), Direction.DOWN); scene.idle(2); } - scene.world.toggleControls(util.grid.at(4, 3, 3)); + scene.world().toggleControls(util.grid().at(4, 3, 3)); scene.idle(15); - scene.overlay.showText(60) - .pointAt(util.vector.topOf(4, 0, 6)) + scene.overlay().showText(60) + .pointAt(util.vector().topOf(4, 0, 6)) .placeNearTarget() .attachKeyFrame() .text("Tracks placed up against a nether portal..."); scene.idle(50); - scene.world.showSection(util.select.position(4, 1, 6), Direction.DOWN); + scene.world().showSection(util.select().position(4, 1, 6), Direction.DOWN); scene.idle(20); - scene.overlay.showText(70) - .pointAt(util.vector.topOf(4, 0, 6)) + scene.overlay().showText(70) + .pointAt(util.vector().topOf(4, 0, 6)) .placeNearTarget() .text("...will attempt to create a paired track on the other side"); scene.idle(40); ElementLink t1 = - scene.world.showIndependentSection(util.select.fromTo(5, 2, 1, 3, 3, 2), Direction.DOWN); + scene.world().showIndependentSection(util.select().fromTo(5, 2, 1, 3, 3, 2), Direction.DOWN); ElementLink t2 = - scene.world.showIndependentSection(util.select.fromTo(5, 2, 3, 3, 3, 3), Direction.DOWN); + scene.world().showIndependentSection(util.select().fromTo(5, 2, 3, 3, 3, 3), Direction.DOWN); ElementLink t3 = - scene.world.showIndependentSection(util.select.fromTo(5, 2, 4, 3, 3, 5), Direction.DOWN); + scene.world().showIndependentSection(util.select().fromTo(5, 2, 4, 3, 3, 5), Direction.DOWN); ElementLink birb = - scene.special.createBirb(util.vector.centerOf(4, 3, 2), ParrotElement.FacePointOfInterestPose::new); - scene.special.conductorBirb(birb, true); - scene.special.movePointOfInterest(util.grid.at(4, 4, 10)); + scene.special().createBirb(util.vector().centerOf(4, 3, 2), ParrotElement.FacePointOfInterestPose::new); + scene.special().conductorBirb(birb, true); + scene.special().movePointOfInterest(util.grid().at(4, 4, 10)); scene.addKeyframe(); scene.idle(30); for (ElementLink e : List.of(t1, t2, t3)) - scene.world.moveSection(e, util.vector.of(0, 0, 6), 30); - scene.special.moveParrot(birb, util.vector.of(0, 0, 5.6), 28); - scene.world.animateBogey(util.grid.at(4, 2, 3), -6, 30); + scene.world().moveSection(e, util.vector().of(0, 0, 6), 30); + scene.special().moveParrot(birb, util.vector().of(0, 0, 5.6), 28); + scene.world().animateBogey(util.grid().at(4, 2, 3), -6, 30); for (ElementLink e : List.of(t3, t2, t1)) { scene.idle(2); - scene.world.hideIndependentSection(e, Direction.SOUTH); + scene.world().hideIndependentSection(e, Direction.SOUTH); } - scene.world.hideSection(util.select.layers(0, 1), Direction.UP); + scene.world().hideSection(util.select().layers(0, 1), Direction.UP); scene.rotateCameraY(360); scene.idle(15); - scene.special.movePointOfInterest(util.grid.at(4, 4, 0)); + scene.special().movePointOfInterest(util.grid().at(4, 4, 0)); ElementLink nether = - scene.world.showIndependentSection(util.select.layers(7, 1), Direction.UP); - scene.world.moveSection(nether, util.vector.of(0, -7, 0), 0); - scene.special.moveParrot(birb, util.vector.of(0, 0, -.1f), 1); + scene.world().showIndependentSection(util.select().layers(7, 1), Direction.UP); + scene.world().moveSection(nether, util.vector().of(0, -7, 0), 0); + scene.special().moveParrot(birb, util.vector().of(0, 0, -.1f), 1); scene.idle(25); ElementLink s1 = - scene.world.showIndependentSection(util.select.fromTo(5, 2, 1, 3, 3, 5), null); - scene.world.rotateSection(s1, 0, 180, 0, 0); - scene.world.moveSection(s1, util.vector.of(0, 0, 3.5f), 0); - scene.world.moveSection(s1, util.vector.of(0, 0, -3.5f), 18); - scene.special.moveParrot(birb, util.vector.of(0, 0, -3.5f), 18); - scene.world.animateBogey(util.grid.at(4, 2, 3), -3.5f, 18); + scene.world().showIndependentSection(util.select().fromTo(5, 2, 1, 3, 3, 5), null); + scene.world().rotateSection(s1, 0, 180, 0, 0); + scene.world().moveSection(s1, util.vector().of(0, 0, 3.5f), 0); + scene.world().moveSection(s1, util.vector().of(0, 0, -3.5f), 18); + scene.special().moveParrot(birb, util.vector().of(0, 0, -3.5f), 18); + scene.world().animateBogey(util.grid().at(4, 2, 3), -3.5f, 18); scene.idle(30); - scene.overlay.showText(70) - .pointAt(util.vector.topOf(util.grid.at(3, 2, 3))) + scene.overlay().showText(70) + .pointAt(util.vector().topOf(util.grid().at(3, 2, 3))) .attachKeyFrame() .placeNearTarget() .text("Trains on this track are now able to travel across dimensions"); @@ -351,119 +351,119 @@ public class TrackScenes { scene.scaleSceneView(.65f); scene.setSceneOffsetY(-1); - scene.world.cycleBlockProperty(util.grid.at(5, 3, 4), BlazeBurnerBlock.HEAT_LEVEL); + scene.world().cycleBlockProperty(util.grid().at(5, 3, 4), BlazeBurnerBlock.HEAT_LEVEL); ElementLink stationElement = - scene.world.showIndependentSection(util.select.fromTo(0, 0, 0, 8, 0, 8), Direction.UP); + scene.world().showIndependentSection(util.select().fromTo(0, 0, 0, 8, 0, 8), Direction.UP); ElementLink stationTrackElement = - scene.world.showIndependentSection(util.select.position(0, 2, 0), Direction.UP); - scene.world.showSection(util.select.position(0, 3, 0), Direction.DOWN); + scene.world().showIndependentSection(util.select().position(0, 2, 0), Direction.UP); + scene.world().showSection(util.select().position(0, 3, 0), Direction.DOWN); scene.idle(10); - Selection vPlatform = util.select.fromTo(7, 1, 6, 1, 2, 8); - Selection vStation = util.select.position(7, 1, 1); - Selection dPlatform = util.select.fromTo(7, 3, 6, 1, 4, 8); - Selection dStation = util.select.position(1, 1, 1); - Selection train = util.select.fromTo(6, 2, 3, 2, 3, 5); - Selection track = util.select.fromTo(7, 1, 4, 37, 1, 4); + Selection vPlatform = util.select().fromTo(7, 1, 6, 1, 2, 8); + Selection vStation = util.select().position(7, 1, 1); + Selection dPlatform = util.select().fromTo(7, 3, 6, 1, 4, 8); + Selection dStation = util.select().position(1, 1, 1); + Selection train = util.select().fromTo(6, 2, 3, 2, 3, 5); + Selection track = util.select().fromTo(7, 1, 4, 37, 1, 4); - scene.world.animateTrainStation(util.grid.at(7, 1, 1), true); - scene.world.toggleControls(util.grid.at(4, 3, 4)); + scene.world().animateTrainStation(util.grid().at(7, 1, 1), true); + scene.world().toggleControls(util.grid().at(4, 3, 4)); for (int i = 6; i >= 2; i--) { - scene.world.showSectionAndMerge(util.select.position(i, 1, 4), Direction.DOWN, stationTrackElement); + scene.world().showSectionAndMerge(util.select().position(i, 1, 4), Direction.DOWN, stationTrackElement); scene.idle(2); } - scene.world.showSectionAndMerge(vPlatform, Direction.NORTH, stationElement); + scene.world().showSectionAndMerge(vPlatform, Direction.NORTH, stationElement); scene.idle(5); - scene.world.showSectionAndMerge(vStation, Direction.DOWN, stationElement); + scene.world().showSectionAndMerge(vStation, Direction.DOWN, stationElement); ElementLink birb = - scene.special.createBirb(util.vector.centerOf(2, 2, 7), ParrotElement.FacePointOfInterestPose::new); - scene.special.movePointOfInterest(util.grid.at(4, 3, 4)); + scene.special().createBirb(util.vector().centerOf(2, 2, 7), ParrotElement.FacePointOfInterestPose::new); + scene.special().movePointOfInterest(util.grid().at(4, 3, 4)); scene.idle(5); - ElementLink trainElement = scene.world.showIndependentSection(train, Direction.DOWN); + ElementLink trainElement = scene.world().showIndependentSection(train, Direction.DOWN); scene.idle(10); - ElementLink trackElement = scene.world.showIndependentSection(track, Direction.EAST); - scene.world.moveSection(trackElement, util.vector.of(-36, 0, 0), 0); + ElementLink trackElement = scene.world().showIndependentSection(track, Direction.EAST); + scene.world().moveSection(trackElement, util.vector().of(-36, 0, 0), 0); scene.idle(15); - scene.overlay.showText(60) - .pointAt(util.vector.topOf(1, 0, 4)) + scene.overlay().showText(60) + .pointAt(util.vector().topOf(1, 0, 4)) .placeNearTarget() .attachKeyFrame() .text("Tracks stay functional outside of loaded chunks"); scene.idle(60); scene.idle(30); - scene.world.animateTrainStation(util.grid.at(7, 1, 1), false); - scene.world.moveSection(trackElement, util.vector.of(12, 0, 0), 120); - scene.world.moveSection(stationElement, util.vector.of(12, 0, 0), 120); - scene.world.moveSection(stationTrackElement, util.vector.of(12, 0, 0), 120); - scene.world.animateBogey(util.grid.at(4, 2, 4), 12f, 120); - scene.special.moveParrot(birb, util.vector.of(12, 0, 0), 120); + scene.world().animateTrainStation(util.grid().at(7, 1, 1), false); + scene.world().moveSection(trackElement, util.vector().of(12, 0, 0), 120); + scene.world().moveSection(stationElement, util.vector().of(12, 0, 0), 120); + scene.world().moveSection(stationTrackElement, util.vector().of(12, 0, 0), 120); + scene.world().animateBogey(util.grid().at(4, 2, 4), 12f, 120); + scene.special().moveParrot(birb, util.vector().of(12, 0, 0), 120); scene.idle(15); - scene.world.hideIndependentSection(stationElement, null); - scene.special.hideElement(birb, null); + scene.world().hideIndependentSection(stationElement, null); + scene.special().hideElement(birb, null); scene.idle(10); - scene.world.hideIndependentSection(trainElement, null); + scene.world().hideIndependentSection(trainElement, null); scene.idle(5); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.BLUE, trainElement, - new AABB(util.grid.at(4, 2, 4)).inflate(1, .75f, .5f), 280); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.BLUE, trainElement, + new AABB(util.grid().at(4, 2, 4)).inflate(1, .75f, .5f), 280); scene.idle(15); - scene.overlay.showText(60) - .pointAt(util.vector.blockSurface(util.grid.at(3, 2, 4), Direction.WEST)) + scene.overlay().showText(60) + .pointAt(util.vector().blockSurface(util.grid().at(3, 2, 4), Direction.WEST)) .placeNearTarget() .colored(PonderPalette.BLUE) .attachKeyFrame() .text("Trains will travel through inactive sections of the world without issue"); scene.idle(70); - scene.overlay.showText(60) - .pointAt(util.vector.blockSurface(util.grid.at(3, 2, 4), Direction.WEST)) + scene.overlay().showText(60) + .pointAt(util.vector().blockSurface(util.grid().at(3, 2, 4), Direction.WEST)) .placeNearTarget() .colored(PonderPalette.BLUE) .attachKeyFrame() .text("They will still stop at stations or red signals"); scene.idle(50); - scene.world.moveSection(trackElement, util.vector.of(19, 0, 0), 190); - scene.world.moveSection(stationTrackElement, util.vector.of(19, 0, 0), 190); - scene.world.animateBogey(util.grid.at(4, 2, 4), 19f, 190); + scene.world().moveSection(trackElement, util.vector().of(19, 0, 0), 190); + scene.world().moveSection(stationTrackElement, util.vector().of(19, 0, 0), 190); + scene.world().animateBogey(util.grid().at(4, 2, 4), 19f, 190); scene.idle(30); - scene.overlay.showText(90) - .pointAt(util.vector.blockSurface(util.grid.at(3, 2, 4), Direction.WEST)) + scene.overlay().showText(90) + .pointAt(util.vector().blockSurface(util.grid().at(3, 2, 4), Direction.WEST)) .placeNearTarget() .colored(PonderPalette.RED) .attachKeyFrame() .text("However, Drills and other on-board machines will not operate"); scene.idle(80); - stationElement = scene.world.showIndependentSection(util.select.fromTo(0, 0, 0, 8, 0, 8) + stationElement = scene.world().showIndependentSection(util.select().fromTo(0, 0, 0, 8, 0, 8) .add(dStation), null); ElementLink dPlatformElement = - scene.world.showIndependentSection(dPlatform, null); - birb = scene.special.createBirb(util.vector.centerOf(-2, 2, 7), ParrotElement.FacePointOfInterestPose::new); - scene.world.moveSection(dPlatformElement, util.vector.of(-8, -2, 0), 0); - scene.world.moveSection(stationElement, util.vector.of(-8, 0, 0), 0); - scene.world.moveSection(stationElement, util.vector.of(8, 0, 0), 80); - scene.world.moveSection(dPlatformElement, util.vector.of(8, 0, 0), 80); - scene.special.moveParrot(birb, util.vector.of(8, 0, 0), 80); + scene.world().showIndependentSection(dPlatform, null); + birb = scene.special().createBirb(util.vector().centerOf(-2, 2, 7), ParrotElement.FacePointOfInterestPose::new); + scene.world().moveSection(dPlatformElement, util.vector().of(-8, -2, 0), 0); + scene.world().moveSection(stationElement, util.vector().of(-8, 0, 0), 0); + scene.world().moveSection(stationElement, util.vector().of(8, 0, 0), 80); + scene.world().moveSection(dPlatformElement, util.vector().of(8, 0, 0), 80); + scene.special().moveParrot(birb, util.vector().of(8, 0, 0), 80); scene.idle(30); - trainElement = scene.world.showIndependentSection(train, null); + trainElement = scene.world().showIndependentSection(train, null); scene.idle(20); - scene.overlay.showText(90) - .pointAt(util.vector.blockSurface(util.grid.at(3, 2, 4), Direction.WEST)) + scene.overlay().showText(90) + .pointAt(util.vector().blockSurface(util.grid().at(3, 2, 4), Direction.WEST)) .placeNearTarget() .attachKeyFrame() .text("Once near a Player, the train will re-appear"); scene.idle(30); - scene.world.animateTrainStation(util.grid.at(1, 1, 1), true); + scene.world().animateTrainStation(util.grid().at(1, 1, 1), true); scene.idle(30); } diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrainScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrainScenes.java index 9175515a8e..5ab10aa486 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrainScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrainScenes.java @@ -6,10 +6,10 @@ import com.simibubi.create.content.trains.station.StationBlock; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; import net.createmod.ponder.foundation.ElementLink; import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.SceneBuilder; -import net.createmod.ponder.foundation.SceneBuildingUtil; import net.createmod.ponder.foundation.Selection; import net.createmod.ponder.foundation.element.InputWindowElement; import net.createmod.ponder.foundation.element.ParrotElement; @@ -32,128 +32,128 @@ public class TrainScenes { scene.showBasePlate(); for (int i = 10; i >= 0; i--) { - scene.world.showSection(util.select.position(i, 1, 4), Direction.DOWN); + scene.world().showSection(util.select().position(i, 1, 4), Direction.DOWN); scene.idle(1); } - BlockPos stationPos = util.grid.at(4, 1, 1); - Selection station = util.select.position(stationPos); - Selection whistle = util.select.fromTo(4, 3, 4, 4, 4, 4); - Selection train = util.select.fromTo(5, 2, 3, 1, 3, 5) + BlockPos stationPos = util.grid().at(4, 1, 1); + Selection station = util.select().position(stationPos); + Selection whistle = util.select().fromTo(4, 3, 4, 4, 4, 4); + Selection train = util.select().fromTo(5, 2, 3, 1, 3, 5) .substract(whistle); - scene.world.showSection(station, Direction.DOWN); + scene.world().showSection(station, Direction.DOWN); scene.idle(20); - ElementLink trainElement = scene.world.showIndependentSection(train, Direction.DOWN); - scene.world.cycleBlockProperty(stationPos, StationBlock.ASSEMBLING); + ElementLink trainElement = scene.world().showIndependentSection(train, Direction.DOWN); + scene.world().cycleBlockProperty(stationPos, StationBlock.ASSEMBLING); scene.idle(15); - BlockPos initialControlsPos = util.grid.at(3, 3, 4); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.WHITE, train, - new AABB(initialControlsPos).contract(-6 / 16f, 2 / 16f, 0), 85); + BlockPos initialControlsPos = util.grid().at(3, 3, 4); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.WHITE, train, + new AABB(initialControlsPos).contract(-6 / 16f, 2 / 16f, 0), 85); scene.idle(15); - scene.overlay.showText(70) - .pointAt(util.vector.of(3.35f, 3.75f, 5)) + scene.overlay().showText(70) + .pointAt(util.vector().of(3.35f, 3.75f, 5)) .placeNearTarget() .attachKeyFrame() .text("Train Controls are required on every train contraption"); scene.idle(60); - scene.world.cycleBlockProperty(stationPos, StationBlock.ASSEMBLING); - scene.effects.indicateSuccess(stationPos); - scene.world.animateTrainStation(stationPos, true); - scene.world.toggleControls(initialControlsPos); + scene.world().cycleBlockProperty(stationPos, StationBlock.ASSEMBLING); + scene.effects().indicateSuccess(stationPos); + scene.world().animateTrainStation(stationPos, true); + scene.world().toggleControls(initialControlsPos); scene.idle(20); - scene.overlay.showControls( - new InputWindowElement(util.vector.topOf(initialControlsPos), Pointing.DOWN).rightClick(), 70); + scene.overlay().showControls( + new InputWindowElement(util.vector().topOf(initialControlsPos), Pointing.DOWN).rightClick(), 70); scene.idle(20); - scene.overlay.showText(60) - .pointAt(util.vector.of(3.35f, 3.75f, 5)) + scene.overlay().showText(60) + .pointAt(util.vector().of(3.35f, 3.75f, 5)) .placeNearTarget() .attachKeyFrame() .text("Once assembled, right-click the block to start driving"); scene.idle(60); - scene.world.moveSection(trainElement, util.vector.of(4, 0, 0), 20); - scene.world.animateBogey(util.grid.at(3, 2, 4), -4f, 20); - scene.world.animateTrainStation(stationPos, false); + scene.world().moveSection(trainElement, util.vector().of(4, 0, 0), 20); + scene.world().animateBogey(util.grid().at(3, 2, 4), -4f, 20); + scene.world().animateTrainStation(stationPos, false); scene.idle(30); - scene.overlay.showText(60) - .pointAt(util.vector.of(7.35f, 3.75f, 5)) + scene.overlay().showText(60) + .pointAt(util.vector().of(7.35f, 3.75f, 5)) .placeNearTarget() .text("Accelerate and steer the Train using movement keybinds"); scene.idle(60); - scene.world.moveSection(trainElement, util.vector.of(-4, 0, 0), 30); - scene.world.animateBogey(util.grid.at(3, 2, 4), 4f, 30); + scene.world().moveSection(trainElement, util.vector().of(-4, 0, 0), 30); + scene.world().animateBogey(util.grid().at(3, 2, 4), 4f, 30); scene.idle(40); - scene.overlay - .showControls(new InputWindowElement(util.vector.topOf(initialControlsPos), Pointing.DOWN).scroll(), 70); + scene.overlay() + .showControls(new InputWindowElement(util.vector().topOf(initialControlsPos), Pointing.DOWN).scroll(), 70); scene.idle(20); - scene.overlay.showText(90) - .pointAt(util.vector.of(3.35f, 3.75f, 5)) + scene.overlay().showText(90) + .pointAt(util.vector().of(3.35f, 3.75f, 5)) .placeNearTarget() .text("If desired, the top speed can be fine-tuned using the mouse wheel"); scene.idle(90); - scene.world.moveSection(trainElement, util.vector.of(2, 0, 0), 30); - scene.world.animateBogey(util.grid.at(3, 2, 4), -2f, 30); + scene.world().moveSection(trainElement, util.vector().of(2, 0, 0), 30); + scene.world().animateBogey(util.grid().at(3, 2, 4), -2f, 30); scene.idle(40); - scene.world.moveSection(trainElement, util.vector.of(-3, 0, 0), 60); - scene.world.animateBogey(util.grid.at(3, 2, 4), 3f, 60); + scene.world().moveSection(trainElement, util.vector().of(-3, 0, 0), 60); + scene.world().animateBogey(util.grid().at(3, 2, 4), 3f, 60); scene.idle(70); - scene.overlay.showText(50) - .pointAt(util.vector.of(2.35f, 3.75f, 5)) + scene.overlay().showText(50) + .pointAt(util.vector().of(2.35f, 3.75f, 5)) .placeNearTarget() .attachKeyFrame() .text("Hold space to approach a nearby Station"); scene.idle(40); - scene.world.moveSection(trainElement, util.vector.of(1, 0, 0), 20); - scene.world.animateBogey(util.grid.at(3, 2, 4), -1f, 20); + scene.world().moveSection(trainElement, util.vector().of(1, 0, 0), 20); + scene.world().animateBogey(util.grid().at(3, 2, 4), -1f, 20); scene.idle(20); - scene.effects.indicateSuccess(stationPos); - scene.world.animateTrainStation(stationPos, true); + scene.effects().indicateSuccess(stationPos); + scene.world().animateTrainStation(stationPos, true); scene.idle(10); - scene.overlay.showText(80) - .pointAt(util.vector.topOf(stationPos)) + scene.overlay().showText(80) + .pointAt(util.vector().topOf(stationPos)) .placeNearTarget() .text("Trains can only be disassembled back into blocks at Stations"); scene.idle(40); - scene.world.cycleBlockProperty(stationPos, StationBlock.ASSEMBLING); - scene.world.toggleControls(initialControlsPos); + scene.world().cycleBlockProperty(stationPos, StationBlock.ASSEMBLING); + scene.world().toggleControls(initialControlsPos); scene.idle(20); - scene.world.showSectionAndMerge(whistle, Direction.DOWN, trainElement); + scene.world().showSectionAndMerge(whistle, Direction.DOWN, trainElement); scene.idle(20); - scene.world.cycleBlockProperty(stationPos, StationBlock.ASSEMBLING); - scene.effects.indicateSuccess(stationPos); - scene.world.toggleControls(initialControlsPos); + scene.world().cycleBlockProperty(stationPos, StationBlock.ASSEMBLING); + scene.effects().indicateSuccess(stationPos); + scene.world().toggleControls(initialControlsPos); scene.idle(20); - scene.overlay.showText(70) - .pointAt(util.vector.of(4.95f, 3.75f, 5)) + scene.overlay().showText(70) + .pointAt(util.vector().of(4.95f, 3.75f, 5)) .placeNearTarget() .attachKeyFrame() .text("Assembled Whistles can be activated with the sprint key"); scene.idle(40); - scene.world.toggleRedstonePower(whistle); + scene.world().toggleRedstonePower(whistle); scene.idle(20); - scene.world.toggleRedstonePower(whistle); + scene.world().toggleRedstonePower(whistle); scene.idle(20); - scene.overlay.showText(70) - .pointAt(util.vector.of(3.35f, 3.75f, 5)) + scene.overlay().showText(70) + .pointAt(util.vector().of(3.35f, 3.75f, 5)) .placeNearTarget() .attachKeyFrame() .text("Sneak or click again to stop controlling the Train"); @@ -168,40 +168,40 @@ public class TrainScenes { scene.setSceneOffsetY(-1); scene.showBasePlate(); - scene.world.cycleBlockProperty(util.grid.at(3, 3, 4), BlazeBurnerBlock.HEAT_LEVEL); + scene.world().cycleBlockProperty(util.grid().at(3, 3, 4), BlazeBurnerBlock.HEAT_LEVEL); for (int i = 10; i >= 0; i--) { - scene.world.showSection(util.select.position(i, 1, 4), Direction.DOWN); + scene.world().showSection(util.select().position(i, 1, 4), Direction.DOWN); scene.idle(1); } - scene.world.toggleControls(util.grid.at(4, 3, 4)); - scene.world.toggleControls(util.grid.at(4, 3, 7)); + scene.world().toggleControls(util.grid().at(4, 3, 4)); + scene.world().toggleControls(util.grid().at(4, 3, 7)); - BlockPos stationPos = util.grid.at(5, 1, 1); - Selection train1 = util.select.fromTo(6, 2, 3, 2, 3, 5); - Selection train2 = util.select.fromTo(6, 2, 6, 2, 3, 8); + BlockPos stationPos = util.grid().at(5, 1, 1); + Selection train1 = util.select().fromTo(6, 2, 3, 2, 3, 5); + Selection train2 = util.select().fromTo(6, 2, 6, 2, 3, 8); scene.idle(10); - scene.world.showSection(util.select.position(stationPos), Direction.DOWN); + scene.world().showSection(util.select().position(stationPos), Direction.DOWN); scene.idle(5); - ElementLink trainElement1 = scene.world.showIndependentSection(train1, Direction.DOWN); + ElementLink trainElement1 = scene.world().showIndependentSection(train1, Direction.DOWN); scene.idle(10); - scene.world.animateTrainStation(stationPos, true); + scene.world().animateTrainStation(stationPos, true); scene.idle(10); - scene.overlay.showText(70) - .pointAt(util.vector.blockSurface(util.grid.at(3, 3, 4), Direction.WEST)) + scene.overlay().showText(70) + .pointAt(util.vector().blockSurface(util.grid().at(3, 3, 4), Direction.WEST)) .placeNearTarget() .attachKeyFrame() .text("Schedules allow Trains to be controlled by other Drivers"); scene.idle(80); - Vec3 target = util.vector.topOf(util.grid.at(4, 0, 2)); - scene.overlay.showControls(new InputWindowElement(target, Pointing.RIGHT).rightClick() + Vec3 target = util.vector().topOf(util.grid().at(4, 0, 2)); + scene.overlay().showControls(new InputWindowElement(target, Pointing.RIGHT).rightClick() .withItem(AllItems.SCHEDULE.asStack()), 80); - scene.overlay.showText(80) + scene.overlay().showText(80) .pointAt(target) .placeNearTarget() .attachKeyFrame() @@ -209,51 +209,51 @@ public class TrainScenes { .text("Right-click with the item in hand to open its Interface"); scene.idle(100); - scene.overlay - .showControls(new InputWindowElement(util.vector.topOf(util.grid.at(3, 3, 4)), Pointing.DOWN).rightClick() + scene.overlay() + .showControls(new InputWindowElement(util.vector().topOf(util.grid().at(3, 3, 4)), Pointing.DOWN).rightClick() .withItem(AllItems.SCHEDULE.asStack()), 80); scene.idle(6); - scene.world.conductorBlaze(util.grid.at(3, 3, 4), true); - scene.overlay.showText(70) - .pointAt(util.vector.blockSurface(util.grid.at(3, 3, 4), Direction.WEST)) + scene.world().conductorBlaze(util.grid().at(3, 3, 4), true); + scene.overlay().showText(70) + .pointAt(util.vector().blockSurface(util.grid().at(3, 3, 4), Direction.WEST)) .placeNearTarget() .attachKeyFrame() .text("Once programmed, the Schedule can be handed off to a Train Driver"); scene.idle(80); - scene.world.moveSection(trainElement1, util.vector.of(12, 0, 0), 60); - scene.world.animateBogey(util.grid.at(4, 2, 4), -12f, 60); - scene.world.animateTrainStation(stationPos, false); + scene.world().moveSection(trainElement1, util.vector().of(12, 0, 0), 60); + scene.world().animateBogey(util.grid().at(4, 2, 4), -12f, 60); + scene.world().animateTrainStation(stationPos, false); scene.idle(20); - scene.world.hideIndependentSection(trainElement1, null); + scene.world().hideIndependentSection(trainElement1, null); scene.idle(25); - ElementLink trainElement2 = scene.world.showIndependentSection(train2, Direction.DOWN); - scene.world.moveSection(trainElement2, util.vector.of(0, 0, -3), 0); + ElementLink trainElement2 = scene.world().showIndependentSection(train2, Direction.DOWN); + scene.world().moveSection(trainElement2, util.vector().of(0, 0, -3), 0); scene.idle(10); - Vec3 birbVec = util.vector.topOf(util.grid.at(3, 0, 7)); - ElementLink birb = scene.special.createBirb(birbVec, ParrotElement.FacePointOfInterestPose::new); - scene.world.animateTrainStation(stationPos, true); + Vec3 birbVec = util.vector().topOf(util.grid().at(3, 0, 7)); + ElementLink birb = scene.special().createBirb(birbVec, ParrotElement.FacePointOfInterestPose::new); + scene.world().animateTrainStation(stationPos, true); - scene.overlay.showText(110) + scene.overlay().showText(110) .pointAt(birbVec) .placeNearTarget() .attachKeyFrame() .text("Any mob or blaze burner sitting in front of Train Controls is an eligible conductor"); scene.idle(80); - scene.overlay.showControls(new InputWindowElement(util.vector.centerOf(util.grid.at(3, 1, 7)), Pointing.DOWN) + scene.overlay().showControls(new InputWindowElement(util.vector().centerOf(util.grid().at(3, 1, 7)), Pointing.DOWN) .withItem(new ItemStack(Items.LEAD)), 30); scene.idle(40); - target = util.vector.centerOf(util.grid.at(3, 3, 4)); - scene.overlay.showControls(new InputWindowElement(target.add(0.5, 0, 0), Pointing.RIGHT).rightClick() + target = util.vector().centerOf(util.grid().at(3, 3, 4)); + scene.overlay().showControls(new InputWindowElement(target.add(0.5, 0, 0), Pointing.RIGHT).rightClick() .withItem(new ItemStack(Items.LEAD)), 30); scene.idle(6); - scene.special.moveParrot(birb, target.subtract(birbVec), 5); - scene.effects.indicateSuccess(util.grid.at(3, 3, 4)); + scene.special().moveParrot(birb, target.subtract(birbVec), 5); + scene.effects().indicateSuccess(util.grid().at(3, 3, 4)); scene.idle(15); - scene.overlay.showText(70) + scene.overlay().showText(70) .pointAt(target) .placeNearTarget() .colored(PonderPalette.BLUE) @@ -261,25 +261,25 @@ public class TrainScenes { .text("Creatures on a lead can be given their seat more conveniently"); scene.idle(80); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(util.grid.at(3, 3, 4)), Pointing.DOWN) + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(util.grid().at(3, 3, 4)), Pointing.DOWN) .withItem(AllItems.SCHEDULE.asStack()), 15); scene.idle(6); - scene.special.conductorBirb(birb, true); - scene.special.movePointOfInterest(util.grid.at(16, 4, 4)); + scene.special().conductorBirb(birb, true); + scene.special().movePointOfInterest(util.grid().at(16, 4, 4)); scene.idle(14); - scene.world.moveSection(trainElement2, util.vector.of(3, 0, 0), 30); - scene.world.animateBogey(util.grid.at(4, 2, 7), -3f, 30); - scene.special.moveParrot(birb, util.vector.of(3, 0, 0), 30); + scene.world().moveSection(trainElement2, util.vector().of(3, 0, 0), 30); + scene.world().animateBogey(util.grid().at(4, 2, 7), -3f, 30); + scene.special().moveParrot(birb, util.vector().of(3, 0, 0), 30); scene.idle(40); - scene.overlay.showControls( - new InputWindowElement(util.vector.topOf(util.grid.at(6, 3, 4)), Pointing.DOWN).rightClick(), 70); + scene.overlay().showControls( + new InputWindowElement(util.vector().topOf(util.grid().at(6, 3, 4)), Pointing.DOWN).rightClick(), 70); scene.idle(6); - scene.special.conductorBirb(birb, false); - scene.special.movePointOfInterest(util.grid.at(3, 4, 1)); + scene.special().conductorBirb(birb, false); + scene.special().movePointOfInterest(util.grid().at(3, 4, 1)); scene.idle(19); - scene.overlay.showText(70) + scene.overlay().showText(70) .pointAt(target.add(3, 0, 0)) .placeNearTarget() .colored(PonderPalette.BLUE) diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrainSignalScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrainSignalScenes.java index b597ff2147..9adbb8e667 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrainSignalScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrainSignalScenes.java @@ -7,10 +7,10 @@ import com.simibubi.create.content.trains.signal.SignalBlockEntity.SignalState; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; import net.createmod.ponder.foundation.ElementLink; import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.SceneBuilder; -import net.createmod.ponder.foundation.SceneBuildingUtil; import net.createmod.ponder.foundation.Selection; import net.createmod.ponder.foundation.element.InputWindowElement; import net.createmod.ponder.foundation.element.ParrotElement; @@ -31,70 +31,70 @@ public class TrainSignalScenes { scene.showBasePlate(); for (int i = 13; i >= 0; i--) { - scene.world.showSection(util.select.position(i, 1, 6), Direction.DOWN); + scene.world().showSection(util.select().position(i, 1, 6), Direction.DOWN); scene.idle(1); } scene.idle(10); - BlockPos stationPos = util.grid.at(11, 1, 3); - Selection station = util.select.position(stationPos); - BlockPos signalPos = util.grid.at(8, 1, 3); - Selection firstSignal = util.select.position(signalPos); - Selection fakeSignal = util.select.position(7, 1, 3); - Selection secondSignal = util.select.position(8, 1, 9); - Selection thirdSignal = util.select.fromTo(9, 1, 9, 9, 4, 9); - Selection firstNixie = util.select.position(8, 2, 3); - Selection secondNixie = util.select.position(8, 2, 9); - Selection thirdNixie = util.select.position(9, 4, 8); - Selection train = util.select.fromTo(5, 2, 5, 1, 3, 7); + BlockPos stationPos = util.grid().at(11, 1, 3); + Selection station = util.select().position(stationPos); + BlockPos signalPos = util.grid().at(8, 1, 3); + Selection firstSignal = util.select().position(signalPos); + Selection fakeSignal = util.select().position(7, 1, 3); + Selection secondSignal = util.select().position(8, 1, 9); + Selection thirdSignal = util.select().fromTo(9, 1, 9, 9, 4, 9); + Selection firstNixie = util.select().position(8, 2, 3); + Selection secondNixie = util.select().position(8, 2, 9); + Selection thirdNixie = util.select().position(9, 4, 8); + Selection train = util.select().fromTo(5, 2, 5, 1, 3, 7); - scene.world.toggleControls(util.grid.at(3, 3, 6)); + scene.world().toggleControls(util.grid().at(3, 3, 6)); - Vec3 marker = util.vector.topOf(8, 0, 6) + Vec3 marker = util.vector().topOf(8, 0, 6) .add(0, 3 / 16f, 0); AABB bb = new AABB(marker, marker); AABB bb3 = bb.move(3, 0, 0); - scene.overlay.showControls(new InputWindowElement(marker, Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(marker, Pointing.DOWN).rightClick() .withItem(AllBlocks.TRACK_SIGNAL.asStack()), 40); scene.idle(6); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, bb, bb.move(0, -1 / 16f, 0), 1); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, bb, bb.move(0, -1 / 16f, 0) + scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, bb, bb.move(0, -1 / 16f, 0), 1); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, bb, bb.move(0, -1 / 16f, 0) .inflate(.45f, 1 / 16f, .45f), 100); scene.idle(10); - scene.overlay.showText(70) + scene.overlay().showText(70) .pointAt(marker) .placeNearTarget() .colored(PonderPalette.GREEN) .text("Select a Train Track then place the Signal nearby"); scene.idle(60); - ElementLink signalElement = scene.world.showIndependentSection(fakeSignal, Direction.DOWN); - scene.world.moveSection(signalElement, util.vector.of(1, 0, 0), 0); + ElementLink signalElement = scene.world().showIndependentSection(fakeSignal, Direction.DOWN); + scene.world().moveSection(signalElement, util.vector().of(1, 0, 0), 0); scene.idle(15); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, bb, new AABB(signalPos), 20); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, bb, new AABB(signalPos), 20); scene.idle(25); - scene.overlay.showText(80) - .pointAt(util.vector.blockSurface(signalPos, Direction.WEST)) + scene.overlay().showText(80) + .pointAt(util.vector().blockSurface(signalPos, Direction.WEST)) .attachKeyFrame() .placeNearTarget() .text("Signals control the flow of Trains not driven by players"); scene.idle(70); - ElementLink trainElement = scene.world.showIndependentSection(train, Direction.DOWN); - Vec3 birbVec = util.vector.centerOf(util.grid.at(2, 3, 6)); - ElementLink birb = scene.special.createBirb(birbVec, ParrotElement.FacePointOfInterestPose::new); + ElementLink trainElement = scene.world().showIndependentSection(train, Direction.DOWN); + Vec3 birbVec = util.vector().centerOf(util.grid().at(2, 3, 6)); + ElementLink birb = scene.special().createBirb(birbVec, ParrotElement.FacePointOfInterestPose::new); scene.idle(10); - scene.world.showSection(station, Direction.DOWN); + scene.world().showSection(station, Direction.DOWN); scene.idle(10); - scene.overlay.showText(80) + scene.overlay().showText(80) .pointAt(marker.add(-.45, 0, 0)) .attachKeyFrame() .placeNearTarget() @@ -102,100 +102,100 @@ public class TrainSignalScenes { .text("Scheduled Trains will never cross signals in the opposite direction"); scene.idle(90); - scene.overlay.showControls( + scene.overlay().showControls( new InputWindowElement(birbVec.add(0, 0.5, 0), Pointing.DOWN).withItem(AllItems.SCHEDULE.asStack()), 40); scene.idle(6); - scene.special.movePointOfInterest(util.grid.at(19, 4, 6)); + scene.special().movePointOfInterest(util.grid().at(19, 4, 6)); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb3, bb3, 1); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb3, bb3.inflate(.45f, 0, .45f), 40); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb3, bb3, 1); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb3, bb3.inflate(.45f, 0, .45f), 40); scene.idle(15); AABB bb2 = new AABB(marker, marker).move(-.45, 0, 0); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb2, bb2.move(-4, 0, 0), 1); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb2, bb2.expandTowards(-4, 0, 0), 20); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb2, bb2.move(-4, 0, 0), 1); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb2, bb2.expandTowards(-4, 0, 0), 20); scene.idle(15); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, bb, bb, 1); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, bb, bb.inflate(.45f, 0, .45f), 40); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, bb3, bb3.inflate(.45f, 0, .45f), 45); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, bb2, bb2.expandTowards(-4, 0, 0), 45); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.RED, bb, bb, 1); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.RED, bb, bb.inflate(.45f, 0, .45f), 40); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.RED, bb3, bb3.inflate(.45f, 0, .45f), 45); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.RED, bb2, bb2.expandTowards(-4, 0, 0), 45); scene.idle(20); - scene.special.movePointOfInterest(util.grid.at(5, 1, 4)); + scene.special().movePointOfInterest(util.grid().at(5, 1, 4)); scene.idle(20); - scene.overlay.showControls(new InputWindowElement(marker, Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(marker, Pointing.DOWN).rightClick() .withItem(AllBlocks.TRACK_SIGNAL.asStack()), 40); scene.idle(6); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, bb, bb.move(0, -1 / 16f, 0), 1); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, bb, bb.move(0, -1 / 16f, 0) + scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, bb, bb.move(0, -1 / 16f, 0), 1); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, bb, bb.move(0, -1 / 16f, 0) .inflate(.45f, 1 / 16f, .45f), 70); scene.idle(30); - scene.world.showSection(secondSignal, Direction.DOWN); + scene.world().showSection(secondSignal, Direction.DOWN); scene.idle(10); - scene.world.moveSection(signalElement, util.vector.of(0, -1000, 0), 0); - scene.world.showIndependentSectionImmediately(firstSignal); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, bb, new AABB(util.grid.at(8, 1, 9)), 40); + scene.world().moveSection(signalElement, util.vector().of(0, -1000, 0), 0); + scene.world().showIndependentSectionImmediately(firstSignal); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, bb, new AABB(util.grid().at(8, 1, 9)), 40); - scene.overlay.showText(80) - .pointAt(util.vector.blockSurface(util.grid.at(8, 1, 9), Direction.WEST)) + scene.overlay().showText(80) + .pointAt(util.vector().blockSurface(util.grid().at(8, 1, 9), Direction.WEST)) .attachKeyFrame() .placeNearTarget() .text("...unless a second signal is added facing the opposite way."); scene.idle(90); - scene.world.hideIndependentSection(signalElement, null); + scene.world().hideIndependentSection(signalElement, null); - scene.overlay.showControls( + scene.overlay().showControls( new InputWindowElement(birbVec.add(0, 0.5, 0), Pointing.DOWN).withItem(AllItems.SCHEDULE.asStack()), 40); scene.idle(6); - scene.special.movePointOfInterest(util.grid.at(19, 4, 6)); + scene.special().movePointOfInterest(util.grid().at(19, 4, 6)); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb3, bb3, 1); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb3, bb3.inflate(.45f, 0, .45f), 40); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb3, bb3, 1); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb3, bb3.inflate(.45f, 0, .45f), 40); scene.idle(15); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb2, bb2.move(-4, 0, 0), 1); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb2, bb2.expandTowards(-4, 0, 0), 40); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb2, bb2.move(-4, 0, 0), 1); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb2, bb2.expandTowards(-4, 0, 0), 40); scene.idle(5); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb, bb, 1); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb, bb.inflate(.45f, 0, .45f), 30); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb, bb, 1); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb, bb.inflate(.45f, 0, .45f), 30); scene.idle(5); AABB bb4 = new AABB(marker, marker).move(.45, 0, 0); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb4, bb4, 1); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb4, bb4.expandTowards(2, 0, 0), 20); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb4, bb4, 1); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb4, bb4.expandTowards(2, 0, 0), 20); scene.idle(15); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, bb4, bb4.expandTowards(2, 0, 0), 25); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, bb3, bb3.inflate(.45f, 0, .45f), 25); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, bb2, bb2.expandTowards(-4, 0, 0), 25); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, bb, bb.inflate(.45f, 0, .45f), 25); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, bb4, bb4.expandTowards(2, 0, 0), 25); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, bb3, bb3.inflate(.45f, 0, .45f), 25); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, bb2, bb2.expandTowards(-4, 0, 0), 25); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, bb, bb.inflate(.45f, 0, .45f), 25); scene.idle(20); - scene.world.moveSection(trainElement, util.vector.of(7, 0, 0), 25); - scene.world.animateBogey(util.grid.at(3, 2, 6), -7f, 25); - scene.special.moveParrot(birb, util.vector.of(7, 0, 0), 25); + scene.world().moveSection(trainElement, util.vector().of(7, 0, 0), 25); + scene.world().animateBogey(util.grid().at(3, 2, 6), -7f, 25); + scene.special().moveParrot(birb, util.vector().of(7, 0, 0), 25); scene.idle(25); - scene.world.animateTrainStation(stationPos, true); - scene.world.changeSignalState(util.grid.at(8, 1, 9), SignalState.RED); - scene.world.changeSignalState(util.grid.at(9, 4, 9), SignalState.RED); + scene.world().animateTrainStation(stationPos, true); + scene.world().changeSignalState(util.grid().at(8, 1, 9), SignalState.RED); + scene.world().changeSignalState(util.grid().at(9, 4, 9), SignalState.RED); scene.idle(25); - scene.world.showSection(thirdSignal, Direction.DOWN); + scene.world().showSection(thirdSignal, Direction.DOWN); scene.rotateCameraY(-90); - scene.special.movePointOfInterest(util.grid.at(8, 2, 9)); + scene.special().movePointOfInterest(util.grid().at(8, 2, 9)); scene.idle(5); - scene.world.showSection(firstNixie, Direction.DOWN); + scene.world().showSection(firstNixie, Direction.DOWN); scene.idle(3); - scene.world.showSection(secondNixie, Direction.DOWN); + scene.world().showSection(secondNixie, Direction.DOWN); scene.idle(3); - scene.world.showSection(thirdNixie, Direction.SOUTH); + scene.world().showSection(thirdNixie, Direction.SOUTH); scene.idle(15); - scene.overlay.showText(100) - .pointAt(util.vector.blockSurface(util.grid.at(8, 2, 9), Direction.SOUTH)) + scene.overlay().showText(100) + .pointAt(util.vector().blockSurface(util.grid().at(8, 2, 9), Direction.SOUTH)) .attachKeyFrame() .placeNearTarget() .text("Nixie tubes can be attached to make a signal's lights more visible"); @@ -211,276 +211,276 @@ public class TrainSignalScenes { scene.rotateCameraY(55); for (int i = 16; i >= 0; i--) { - scene.world.showSection(util.select.position(i, 1, 7), Direction.DOWN); - scene.world.showSection(util.select.position(i, 1, 15 - i), Direction.DOWN); + scene.world().showSection(util.select().position(i, 1, 7), Direction.DOWN); + scene.world().showSection(util.select().position(i, 1, 15 - i), Direction.DOWN); scene.idle(1); } - scene.world.toggleControls(util.grid.at(13, 3, 7)); - scene.world.toggleControls(util.grid.at(13, 3, 1)); - scene.world.toggleControls(util.grid.at(13, 3, 4)); + scene.world().toggleControls(util.grid().at(13, 3, 7)); + scene.world().toggleControls(util.grid().at(13, 3, 1)); + scene.world().toggleControls(util.grid().at(13, 3, 4)); - Selection train1 = util.select.fromTo(11, 2, 6, 15, 3, 8); - Selection train2a = util.select.fromTo(15, 2, 3, 11, 3, 5); - Selection train2b = util.select.fromTo(19, 2, 3, 16, 3, 5); - Selection train3 = util.select.fromTo(11, 2, 0, 15, 3, 2); - BlockPos s1Pos = util.grid.at(11, 3, 9); - Selection s1 = util.select.fromTo(11, 1, 9, 11, 4, 9); - BlockPos s2Pos = util.grid.at(5, 1, 5); - Selection s2 = util.select.fromTo(5, 1, 5, 5, 2, 5); - BlockPos s3Pos = util.grid.at(9, 1, 2); - Selection s3 = util.select.fromTo(9, 1, 2, 10, 1, 2); - BlockPos s4Pos = util.grid.at(7, 1, 12); - Selection s4 = util.select.fromTo(7, 1, 12, 6, 1, 12); + Selection train1 = util.select().fromTo(11, 2, 6, 15, 3, 8); + Selection train2a = util.select().fromTo(15, 2, 3, 11, 3, 5); + Selection train2b = util.select().fromTo(19, 2, 3, 16, 3, 5); + Selection train3 = util.select().fromTo(11, 2, 0, 15, 3, 2); + BlockPos s1Pos = util.grid().at(11, 3, 9); + Selection s1 = util.select().fromTo(11, 1, 9, 11, 4, 9); + BlockPos s2Pos = util.grid().at(5, 1, 5); + Selection s2 = util.select().fromTo(5, 1, 5, 5, 2, 5); + BlockPos s3Pos = util.grid().at(9, 1, 2); + Selection s3 = util.select().fromTo(9, 1, 2, 10, 1, 2); + BlockPos s4Pos = util.grid().at(7, 1, 12); + Selection s4 = util.select().fromTo(7, 1, 12, 6, 1, 12); float pY = 3 / 16f; - Vec3 m1 = util.vector.topOf(11, 0, 7) + Vec3 m1 = util.vector().topOf(11, 0, 7) .add(0, pY, 0); - Vec3 m2 = util.vector.topOf(5, 0, 7) + Vec3 m2 = util.vector().topOf(5, 0, 7) .add(0, pY, 0); - Vec3 m3 = util.vector.topOf(12, 0, 3) + Vec3 m3 = util.vector().topOf(12, 0, 3) .add(0, pY, 0); - Vec3 m4 = util.vector.topOf(4, 0, 11) + Vec3 m4 = util.vector().topOf(4, 0, 11) .add(0, pY, 0); scene.idle(10); - scene.world.showSection(s1, Direction.DOWN); + scene.world().showSection(s1, Direction.DOWN); scene.idle(8); - Vec3 x1 = util.vector.of(17, 1 + pY, 7.5); - Vec3 x2 = util.vector.of(0, 1 + pY, 7.5); - Vec3 xz1 = util.vector.of(1, 1 + pY, 15); - Vec3 xz2 = util.vector.of(16, 1 + pY, 0); + Vec3 x1 = util.vector().of(17, 1 + pY, 7.5); + Vec3 x2 = util.vector().of(0, 1 + pY, 7.5); + Vec3 xz1 = util.vector().of(1, 1 + pY, 15); + Vec3 xz2 = util.vector().of(16, 1 + pY, 0); - scene.overlay.showBigLine(PonderPalette.OUTPUT, x1, m1.add(.45, 0, 0), 100); - scene.overlay.showBigLine(PonderPalette.RED, x2, m1.add(-.45, 0, 0), 100); - scene.overlay.showBigLine(PonderPalette.RED, xz1, xz2, 100); + scene.overlay().showBigLine(PonderPalette.OUTPUT, x1, m1.add(.45, 0, 0), 100); + scene.overlay().showBigLine(PonderPalette.RED, x2, m1.add(-.45, 0, 0), 100); + scene.overlay().showBigLine(PonderPalette.RED, xz1, xz2, 100); scene.idle(35); - scene.overlay.showText(60) + scene.overlay().showText(60) .pointAt(m1.add(-.45, 0, 0)) .attachKeyFrame() .placeNearTarget() .text("Train Signals divide a track into segments"); scene.idle(50); - scene.world.showSection(s2, Direction.DOWN); + scene.world().showSection(s2, Direction.DOWN); scene.idle(8); - scene.overlay.showBigLine(PonderPalette.OUTPUT, x1, m1.add(.45, 0, 0), 80); - scene.overlay.showBigLine(PonderPalette.BLUE, x2, m2.add(-.45, 0, 0), 75); - scene.overlay.showBigLine(PonderPalette.RED, m2.add(.45, 0, 0), m1.add(-.45, 0, 0), 75); - scene.overlay.showBigLine(PonderPalette.RED, xz1, xz2, 75); + scene.overlay().showBigLine(PonderPalette.OUTPUT, x1, m1.add(.45, 0, 0), 80); + scene.overlay().showBigLine(PonderPalette.BLUE, x2, m2.add(-.45, 0, 0), 75); + scene.overlay().showBigLine(PonderPalette.RED, m2.add(.45, 0, 0), m1.add(-.45, 0, 0), 75); + scene.overlay().showBigLine(PonderPalette.RED, xz1, xz2, 75); scene.idle(25); - scene.world.showSection(s3, Direction.DOWN); - scene.world.showSection(s4, Direction.DOWN); + scene.world().showSection(s3, Direction.DOWN); + scene.world().showSection(s4, Direction.DOWN); scene.idle(8); - scene.overlay.showBigLine(PonderPalette.OUTPUT, x1, m1.add(.45, 0, 0), 50); - scene.overlay.showBigLine(PonderPalette.BLUE, m2.add(-.45, 0, 0), x2, 50); - scene.overlay.showBigLine(PonderPalette.FAST, xz1, m4.add(-.45, 0, .45), 50); - scene.overlay.showBigLine(PonderPalette.RED, m2.add(.45, 0, 0), m1.add(-.45, 0, 0), 50); - scene.overlay.showBigLine(PonderPalette.RED, m4.add(.45, 0, -.45), m3.add(-.45, 0, .45), 50); - scene.overlay.showBigLine(PonderPalette.GREEN, m3.add(.45, 0, -.45), xz2, 50); + scene.overlay().showBigLine(PonderPalette.OUTPUT, x1, m1.add(.45, 0, 0), 50); + scene.overlay().showBigLine(PonderPalette.BLUE, m2.add(-.45, 0, 0), x2, 50); + scene.overlay().showBigLine(PonderPalette.FAST, xz1, m4.add(-.45, 0, .45), 50); + scene.overlay().showBigLine(PonderPalette.RED, m2.add(.45, 0, 0), m1.add(-.45, 0, 0), 50); + scene.overlay().showBigLine(PonderPalette.RED, m4.add(.45, 0, -.45), m3.add(-.45, 0, .45), 50); + scene.overlay().showBigLine(PonderPalette.GREEN, m3.add(.45, 0, -.45), xz2, 50); scene.idle(40); - ElementLink trainElement = scene.world.showIndependentSection(train1, null); + ElementLink trainElement = scene.world().showIndependentSection(train1, null); ElementLink birb1 = - scene.special.createBirb(util.vector.centerOf(18, 3, 7), ParrotElement.FacePointOfInterestPose::new); - scene.world.moveSection(trainElement, util.vector.of(4, 0, 0), 0); - scene.world.moveSection(trainElement, util.vector.of(-9, 0, 0), 45); - scene.world.animateBogey(util.grid.at(13, 2, 7), 9f, 45); - scene.special.moveParrot(birb1, util.vector.of(-9, 0, 0), 45); + scene.special().createBirb(util.vector().centerOf(18, 3, 7), ParrotElement.FacePointOfInterestPose::new); + scene.world().moveSection(trainElement, util.vector().of(4, 0, 0), 0); + scene.world().moveSection(trainElement, util.vector().of(-9, 0, 0), 45); + scene.world().animateBogey(util.grid().at(13, 2, 7), 9f, 45); + scene.special().moveParrot(birb1, util.vector().of(-9, 0, 0), 45); scene.idle(20); - scene.world.changeSignalState(s1Pos, SignalState.RED); - scene.effects.indicateRedstone(s1Pos.above()); - scene.world.changeSignalState(s3Pos, SignalState.RED); - scene.effects.indicateRedstone(s3Pos.east()); - scene.overlay.showBigLine(PonderPalette.RED, m2.add(.45, 0, 0), m1.add(-.45, 0, 0), 220); - scene.overlay.showBigLine(PonderPalette.RED, m4.add(.45, 0, -.45), m3.add(-.45, 0, .45), 220); + scene.world().changeSignalState(s1Pos, SignalState.RED); + scene.effects().indicateRedstone(s1Pos.above()); + scene.world().changeSignalState(s3Pos, SignalState.RED); + scene.effects().indicateRedstone(s3Pos.east()); + scene.overlay().showBigLine(PonderPalette.RED, m2.add(.45, 0, 0), m1.add(-.45, 0, 0), 220); + scene.overlay().showBigLine(PonderPalette.RED, m4.add(.45, 0, -.45), m3.add(-.45, 0, .45), 220); scene.idle(25); - scene.overlay.showText(80) - .pointAt(util.vector.blockSurface(s1Pos.above(), Direction.WEST)) + scene.overlay().showText(80) + .pointAt(util.vector().blockSurface(s1Pos.above(), Direction.WEST)) .attachKeyFrame() .placeNearTarget() .colored(PonderPalette.RED) .text("If a Segment is occupied, no other Trains will be allowed entry"); scene.idle(50); - ElementLink trainElement2 = scene.world.showIndependentSection(train3, null); + ElementLink trainElement2 = scene.world().showIndependentSection(train3, null); ElementLink birb2 = - scene.special.createBirb(util.vector.centerOf(18, 3, 7), ParrotElement.FacePointOfInterestPose::new); - scene.world.moveSection(trainElement2, util.vector.of(4, 0, 6), 0); - scene.world.moveSection(trainElement2, util.vector.of(-4.5, 0, 0), 35); - scene.world.animateBogey(util.grid.at(13, 2, 1), 4.5f, 35); - scene.special.moveParrot(birb2, util.vector.of(-4.5, 0, 0), 35); + scene.special().createBirb(util.vector().centerOf(18, 3, 7), ParrotElement.FacePointOfInterestPose::new); + scene.world().moveSection(trainElement2, util.vector().of(4, 0, 6), 0); + scene.world().moveSection(trainElement2, util.vector().of(-4.5, 0, 0), 35); + scene.world().animateBogey(util.grid().at(13, 2, 1), 4.5f, 35); + scene.special().moveParrot(birb2, util.vector().of(-4.5, 0, 0), 35); scene.idle(40); - scene.special.movePointOfInterest(s1Pos.above(2)); + scene.special().movePointOfInterest(s1Pos.above(2)); scene.idle(10); - scene.overlay.showText(80) - .pointAt(util.vector.topOf(util.grid.at(9, 0, 6))) + scene.overlay().showText(80) + .pointAt(util.vector().topOf(util.grid().at(9, 0, 6))) .attachKeyFrame() .placeNearTarget() .colored(PonderPalette.RED) .text("Thus, each Segment will contain only one Train at a time"); scene.idle(90); - scene.world.hideIndependentSection(trainElement, Direction.UP); - scene.special.hideElement(birb1, Direction.UP); + scene.world().hideIndependentSection(trainElement, Direction.UP); + scene.special().hideElement(birb1, Direction.UP); scene.idle(3); - scene.world.hideIndependentSection(trainElement2, Direction.UP); - scene.special.hideElement(birb2, Direction.UP); + scene.world().hideIndependentSection(trainElement2, Direction.UP); + scene.special().hideElement(birb2, Direction.UP); scene.idle(3); - scene.world.changeSignalState(s1Pos, SignalState.GREEN); - scene.world.changeSignalState(s3Pos, SignalState.GREEN); + scene.world().changeSignalState(s1Pos, SignalState.GREEN); + scene.world().changeSignalState(s3Pos, SignalState.GREEN); scene.idle(20); - scene.overlay.showControls( - new InputWindowElement(util.vector.blockSurface(s1Pos, Direction.EAST), Pointing.RIGHT).rightClick() + scene.overlay().showControls( + new InputWindowElement(util.vector().blockSurface(s1Pos, Direction.EAST), Pointing.RIGHT).rightClick() .withItem(AllItems.WRENCH.asStack()), 80); scene.idle(6); - scene.world.cycleBlockProperty(s1Pos, SignalBlock.TYPE); + scene.world().cycleBlockProperty(s1Pos, SignalBlock.TYPE); scene.idle(15); - scene.overlay.showText(60) - .pointAt(util.vector.blockSurface(s1Pos, Direction.WEST)) + scene.overlay().showText(60) + .pointAt(util.vector().blockSurface(s1Pos, Direction.WEST)) .attachKeyFrame() .placeNearTarget() .text("A second Signal mode is available via the Wrench"); scene.idle(70); AABB bb = new AABB(m1, m1); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb, bb, 1); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb, bb.inflate(.45f, 0, .45f), 140); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb, bb, 1); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb, bb.inflate(.45f, 0, .45f), 140); scene.idle(10); AABB bb2 = bb.move(-.45, 0, 0); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb2, bb2, 1); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb2, bb2.expandTowards(-5, 0, 0), 130); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb2, bb2, 1); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb2, bb2.expandTowards(-5, 0, 0), 130); scene.idle(10); AABB bb3 = bb.move(-6, 0, 0); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb3, bb3, 1); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb3, bb3.inflate(.45f, 0, .45f), 120); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb3, bb3, 1); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb3, bb3.inflate(.45f, 0, .45f), 120); scene.idle(10); - scene.overlay.showText(60) - .pointAt(util.vector.blockSurface(s2Pos, Direction.WEST)) + scene.overlay().showText(60) + .pointAt(util.vector().blockSurface(s2Pos, Direction.WEST)) .placeNearTarget() .colored(PonderPalette.BLUE) .text("Segments of a brass signal usually lead into standard signals"); scene.idle(70); - scene.overlay.showText(60) - .pointAt(util.vector.blockSurface(s1Pos, Direction.WEST)) + scene.overlay().showText(60) + .pointAt(util.vector().blockSurface(s1Pos, Direction.WEST)) .placeNearTarget() .attachKeyFrame() .text("This special Signal can stop trains under a second condition"); scene.idle(60); - trainElement = scene.world.showIndependentSection(train1, Direction.DOWN); - scene.world.moveSection(trainElement, util.vector.of(-10.5, 0, 0), 0); - birb1 = scene.special.createBirb(util.vector.centerOf(3, 3, 7) + trainElement = scene.world().showIndependentSection(train1, Direction.DOWN); + scene.world().moveSection(trainElement, util.vector().of(-10.5, 0, 0), 0); + birb1 = scene.special().createBirb(util.vector().centerOf(3, 3, 7) .add(.5, 0, 0), ParrotElement.DancePose::new); scene.idle(10); - scene.world.changeSignalState(s2Pos, SignalState.RED); - scene.effects.indicateRedstone(s2Pos.above()); - scene.overlay.showBigLine(PonderPalette.RED, m2.add(-.45, 0, 0), x2, 220); + scene.world().changeSignalState(s2Pos, SignalState.RED); + scene.effects().indicateRedstone(s2Pos.above()); + scene.overlay().showBigLine(PonderPalette.RED, m2.add(-.45, 0, 0), x2, 220); scene.idle(15); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb, bb, 1); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb, bb.inflate(.45f, 0, .45f), 140); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb, bb, 1); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb, bb.inflate(.45f, 0, .45f), 140); scene.idle(10); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb2, bb2, 1); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb2, bb2.expandTowards(-5, 0, 0), 130); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb2, bb2, 1); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb2, bb2.expandTowards(-5, 0, 0), 130); scene.idle(10); - trainElement2 = scene.world.showIndependentSection(train3, null); - birb2 = scene.special.createBirb(util.vector.centerOf(18, 3, 7), ParrotElement.FacePointOfInterestPose::new); + trainElement2 = scene.world().showIndependentSection(train3, null); + birb2 = scene.special().createBirb(util.vector().centerOf(18, 3, 7), ParrotElement.FacePointOfInterestPose::new); - scene.world.moveSection(trainElement2, util.vector.of(4, 0, 6), 0); - scene.world.moveSection(trainElement2, util.vector.of(-4.5, 0, 0), 35); - scene.world.animateBogey(util.grid.at(13, 2, 1), 4.5f, 35); - scene.special.moveParrot(birb2, util.vector.of(-4.5, 0, 0), 35); + scene.world().moveSection(trainElement2, util.vector().of(4, 0, 6), 0); + scene.world().moveSection(trainElement2, util.vector().of(-4.5, 0, 0), 35); + scene.world().animateBogey(util.grid().at(13, 2, 1), 4.5f, 35); + scene.special().moveParrot(birb2, util.vector().of(-4.5, 0, 0), 35); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, bb, bb.inflate(.45f, 0, .45f), 140); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, bb2, bb2.expandTowards(-5, 0, 0), 130); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, bb3, bb3, 1); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, bb3, bb3.inflate(.45f, 0, .45f), 120); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.RED, bb, bb.inflate(.45f, 0, .45f), 140); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.RED, bb2, bb2.expandTowards(-5, 0, 0), 130); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.RED, bb3, bb3, 1); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.RED, bb3, bb3.inflate(.45f, 0, .45f), 120); scene.idle(5); - scene.world.changeSignalState(s1Pos, SignalState.RED); - scene.effects.indicateRedstone(s1Pos.above()); + scene.world().changeSignalState(s1Pos, SignalState.RED); + scene.effects().indicateRedstone(s1Pos.above()); scene.idle(15); - scene.overlay.showText(50) - .pointAt(util.vector.blockSurface(s1Pos, Direction.WEST)) + scene.overlay().showText(50) + .pointAt(util.vector().blockSurface(s1Pos, Direction.WEST)) .placeNearTarget() .text("It will stop Trains, which, upon entering..."); scene.idle(50); - AABB trainBB = new AABB(util.grid.at(13, 2, 7)).inflate(1, 1, .25f); + AABB trainBB = new AABB(util.grid().at(13, 2, 7)).inflate(1, 1, .25f); for (int i = 1; i < 14; i++) { scene.idle(2); - scene.overlay.chaseBoundingBoxOutline(i == 13 ? PonderPalette.RED : PonderPalette.OUTPUT, trainBB, - trainBB.move(-i * .5, 0, 0), i == 13 ? 100 : 5); + scene.overlay().chaseBoundingBoxOutline(i == 13 ? PonderPalette.RED : PonderPalette.OUTPUT, trainBB, + trainBB.move(-i * .5, 0, 0), i == 13 ? 100 : 5); } - scene.special.movePointOfInterest(util.grid.at(5, 3, 7)); + scene.special().movePointOfInterest(util.grid().at(5, 3, 7)); scene.idle(20); - scene.overlay.showText(80) - .pointAt(util.vector.of(7, 4, 7)) + scene.overlay().showText(80) + .pointAt(util.vector().of(7, 4, 7)) .placeNearTarget() .colored(PonderPalette.RED) .text("...would not be able to leave the Segment immediately"); scene.idle(40); scene.idle(50); - ElementLink trainElement3a = scene.world.showIndependentSection(train2a, null); - scene.world.rotateSection(trainElement3a, 0, 45, 0, 0); - scene.world.moveSection(trainElement3a, util.vector.of(4, 0, -6), 0); - scene.world.moveSection(trainElement3a, util.vector.of(-20, 0, 20), 40); - scene.world.animateBogey(util.grid.at(13, 2, 4), -20f, 40); + ElementLink trainElement3a = scene.world().showIndependentSection(train2a, null); + scene.world().rotateSection(trainElement3a, 0, 45, 0, 0); + scene.world().moveSection(trainElement3a, util.vector().of(4, 0, -6), 0); + scene.world().moveSection(trainElement3a, util.vector().of(-20, 0, 20), 40); + scene.world().animateBogey(util.grid().at(13, 2, 4), -20f, 40); ElementLink birb3 = - scene.special.createBirb(util.vector.of(18, 3.5, -2), ParrotElement.FacePointOfInterestPose::new); - scene.special.moveParrot(birb3, util.vector.of(-20, 0, 20), 40); + scene.special().createBirb(util.vector().of(18, 3.5, -2), ParrotElement.FacePointOfInterestPose::new); + scene.special().moveParrot(birb3, util.vector().of(-20, 0, 20), 40); scene.idle(5); - scene.effects.indicateRedstone(s3Pos.east()); - scene.world.changeSignalState(s3Pos, SignalState.RED); + scene.effects().indicateRedstone(s3Pos.east()); + scene.world().changeSignalState(s3Pos, SignalState.RED); - ElementLink trainElement3b = scene.world.showIndependentSection(train2b, null); - scene.world.rotateSection(trainElement3b, 0, 45, 0, 0); - scene.world.moveSection(trainElement3b, util.vector.of(0.5, 0, -7), 0); - scene.world.moveSection(trainElement3b, util.vector.of(-20, 0, 20), 40); - scene.world.animateBogey(util.grid.at(17, 2, 4), -20f, 40); + ElementLink trainElement3b = scene.world().showIndependentSection(train2b, null); + scene.world().rotateSection(trainElement3b, 0, 45, 0, 0); + scene.world().moveSection(trainElement3b, util.vector().of(0.5, 0, -7), 0); + scene.world().moveSection(trainElement3b, util.vector().of(-20, 0, 20), 40); + scene.world().animateBogey(util.grid().at(17, 2, 4), -20f, 40); scene.idle(10); - scene.effects.indicateRedstone(s4Pos.west()); - scene.world.changeSignalState(s4Pos, SignalState.RED); + scene.effects().indicateRedstone(s4Pos.west()); + scene.world().changeSignalState(s4Pos, SignalState.RED); scene.idle(5); - scene.world.changeSignalState(s3Pos, SignalState.GREEN); - scene.world.hideIndependentSection(trainElement3a, null); - scene.special.hideElement(birb3, null); + scene.world().changeSignalState(s3Pos, SignalState.GREEN); + scene.world().hideIndependentSection(trainElement3a, null); + scene.special().hideElement(birb3, null); scene.idle(5); - scene.world.hideIndependentSection(trainElement3b, null); + scene.world().hideIndependentSection(trainElement3b, null); scene.idle(15); - scene.world.changeSignalState(s4Pos, SignalState.GREEN); + scene.world().changeSignalState(s4Pos, SignalState.GREEN); scene.idle(15); - scene.overlay.showBigLine(PonderPalette.GREEN, m2.add(.45, 0, 0), m1.add(-.45, 0, 0), 100); - scene.overlay.showBigLine(PonderPalette.GREEN, m4.add(.45, 0, -.45), m3.add(-.45, 0, .45), 100); + scene.overlay().showBigLine(PonderPalette.GREEN, m2.add(.45, 0, 0), m1.add(-.45, 0, 0), 100); + scene.overlay().showBigLine(PonderPalette.GREEN, m4.add(.45, 0, -.45), m3.add(-.45, 0, .45), 100); scene.idle(15); - scene.overlay.showText(80) - .pointAt(util.vector.topOf(util.grid.at(9, 0, 6))) + scene.overlay().showText(80) + .pointAt(util.vector().topOf(util.grid().at(9, 0, 6))) .placeNearTarget() .colored(PonderPalette.GREEN) .text("This helps keeping queued Trains out of a busy Segment"); @@ -496,61 +496,61 @@ public class TrainSignalScenes { scene.showBasePlate(); for (int i = 1; i <= 7; i++) { - scene.world.showSection(util.select.position(6, 1, i), Direction.DOWN); + scene.world().showSection(util.select().position(6, 1, i), Direction.DOWN); scene.idle(2); } scene.idle(10); - Selection train = util.select.fromTo(5, 2, 3, 7, 3, 7); - Selection lever = util.select.fromTo(2, 1, 3, 1, 1, 3); - Selection comparator = util.select.fromTo(2, 1, 1, 1, 1, 1); - Selection signal = util.select.fromTo(3, 1, 3, 3, 2, 3); - BlockPos signalPos = util.grid.at(3, 1, 3); + Selection train = util.select().fromTo(5, 2, 3, 7, 3, 7); + Selection lever = util.select().fromTo(2, 1, 3, 1, 1, 3); + Selection comparator = util.select().fromTo(2, 1, 1, 1, 1, 1); + Selection signal = util.select().fromTo(3, 1, 3, 3, 2, 3); + BlockPos signalPos = util.grid().at(3, 1, 3); - scene.world.showSection(signal, Direction.DOWN); + scene.world().showSection(signal, Direction.DOWN); scene.idle(10); - scene.world.showSection(lever, Direction.EAST); + scene.world().showSection(lever, Direction.EAST); scene.idle(15); - scene.overlay.showText(80) - .pointAt(util.vector.blockSurface(util.grid.at(3, 2, 3), Direction.WEST)) + scene.overlay().showText(80) + .pointAt(util.vector().blockSurface(util.grid().at(3, 2, 3), Direction.WEST)) .attachKeyFrame() .placeNearTarget() .text("Signals can be forced red by a redstone signal"); scene.idle(40); - scene.world.toggleRedstonePower(lever); - scene.effects.indicateRedstone(util.grid.at(1, 1, 3)); - scene.world.changeSignalState(signalPos, SignalState.RED); + scene.world().toggleRedstonePower(lever); + scene.effects().indicateRedstone(util.grid().at(1, 1, 3)); + scene.world().changeSignalState(signalPos, SignalState.RED); scene.idle(40); - scene.world.toggleRedstonePower(lever); - scene.effects.indicateRedstone(util.grid.at(1, 1, 3)); - scene.world.changeSignalState(signalPos, SignalState.GREEN); + scene.world().toggleRedstonePower(lever); + scene.effects().indicateRedstone(util.grid().at(1, 1, 3)); + scene.world().changeSignalState(signalPos, SignalState.GREEN); scene.idle(40); - scene.world.hideSection(lever, Direction.SOUTH); + scene.world().hideSection(lever, Direction.SOUTH); scene.idle(15); ElementLink comparatorElement = - scene.world.showIndependentSection(comparator, Direction.SOUTH); - scene.world.moveSection(comparatorElement, util.vector.of(0, 0, 2), 0); + scene.world().showIndependentSection(comparator, Direction.SOUTH); + scene.world().moveSection(comparatorElement, util.vector().of(0, 0, 2), 0); scene.idle(15); - scene.overlay.showText(80) - .pointAt(util.vector.blockSurface(util.grid.at(3, 2, 3), Direction.WEST)) + scene.overlay().showText(80) + .pointAt(util.vector().blockSurface(util.grid().at(3, 2, 3), Direction.WEST)) .attachKeyFrame() .placeNearTarget() .text("Conversely, red signals emit a comparator output"); scene.idle(40); - scene.world.toggleControls(util.grid.at(6, 3, 5)); - scene.world.showSection(train, Direction.DOWN); - scene.special.createBirb(util.vector.centerOf(util.grid.at(6, 3, 4)), ParrotElement.DancePose::new); + scene.world().toggleControls(util.grid().at(6, 3, 5)); + scene.world().showSection(train, Direction.DOWN); + scene.special().createBirb(util.vector().centerOf(util.grid().at(6, 3, 4)), ParrotElement.DancePose::new); scene.idle(10); - scene.world.toggleRedstonePower(comparator); - scene.effects.indicateRedstone(signalPos); - scene.world.changeSignalState(signalPos, SignalState.RED); + scene.world().toggleRedstonePower(comparator); + scene.effects().indicateRedstone(signalPos); + scene.world().changeSignalState(signalPos, SignalState.RED); } } diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrainStationScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrainStationScenes.java index b0a1d667fd..b6b7713105 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrainStationScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrainStationScenes.java @@ -6,10 +6,10 @@ import com.simibubi.create.content.trains.station.StationBlock; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; import net.createmod.ponder.foundation.ElementLink; import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.SceneBuilder; -import net.createmod.ponder.foundation.SceneBuildingUtil; import net.createmod.ponder.foundation.Selection; import net.createmod.ponder.foundation.element.InputWindowElement; import net.createmod.ponder.foundation.element.ParrotElement; @@ -34,80 +34,80 @@ public class TrainStationScenes { scene.showBasePlate(); for (int i = 13; i >= 0; i--) { - scene.world.showSection(util.select.position(i, 1, 6), Direction.DOWN); + scene.world().showSection(util.select().position(i, 1, 6), Direction.DOWN); scene.idle(1); } BlockState air = Blocks.AIR.defaultBlockState(); - scene.world.setBlock(util.grid.at(10, 2, 6), air, false); - scene.world.setBlock(util.grid.at(6, 2, 6), air, false); - scene.world.setBlock(util.grid.at(3, 2, 6), air, false); + scene.world().setBlock(util.grid().at(10, 2, 6), air, false); + scene.world().setBlock(util.grid().at(6, 2, 6), air, false); + scene.world().setBlock(util.grid().at(3, 2, 6), air, false); scene.idle(10); - Selection station = util.select.position(11, 1, 3); - Selection controls = util.select.fromTo(9, 3, 6, 10, 3, 6); - Selection train1 = util.select.fromTo(12, 2, 5, 8, 2, 7) - .substract(util.select.position(10, 2, 6)); - Selection train2 = util.select.fromTo(7, 2, 5, 2, 2, 7) - .substract(util.select.position(6, 2, 6)) - .substract(util.select.position(3, 2, 6)); - Selection train3 = util.select.fromTo(7, 2, 1, 3, 3, 3); + Selection station = util.select().position(11, 1, 3); + Selection controls = util.select().fromTo(9, 3, 6, 10, 3, 6); + Selection train1 = util.select().fromTo(12, 2, 5, 8, 2, 7) + .substract(util.select().position(10, 2, 6)); + Selection train2 = util.select().fromTo(7, 2, 5, 2, 2, 7) + .substract(util.select().position(6, 2, 6)) + .substract(util.select().position(3, 2, 6)); + Selection train3 = util.select().fromTo(7, 2, 1, 3, 3, 3); - BlockPos stationPos = util.grid.at(11, 1, 3); - Vec3 marker = util.vector.topOf(11, 0, 6) + BlockPos stationPos = util.grid().at(11, 1, 3); + Vec3 marker = util.vector().topOf(11, 0, 6) .add(0, 3 / 16f, 0); - Vec3 stationTop = util.vector.topOf(stationPos); + Vec3 stationTop = util.vector().topOf(stationPos); - AABB bb = new AABB(util.vector.topOf(11, 0, 6), util.vector.topOf(11, 0, 6)).move(0, 2 / 16f, 0); + AABB bb = new AABB(util.vector().topOf(11, 0, 6), util.vector().topOf(11, 0, 6)).move(0, 2 / 16f, 0); - scene.overlay.showControls(new InputWindowElement(marker, Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(marker, Pointing.DOWN).rightClick() .withItem(AllBlocks.TRACK_STATION.asStack()), 40); scene.idle(6); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, bb, bb, 1); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, bb, bb.inflate(.45f, 1 / 16f, .45f), 100); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, bb, bb, 1); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, bb, bb.inflate(.45f, 1 / 16f, .45f), 100); scene.idle(10); - scene.overlay.showText(70) + scene.overlay().showText(70) .pointAt(marker) .placeNearTarget() .colored(PonderPalette.GREEN) .text("Select a Train Track then place the Station nearby"); scene.idle(60); - scene.world.showSection(station, Direction.DOWN); + scene.world().showSection(station, Direction.DOWN); scene.idle(15); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, bb, - new AABB(stationPos).contract(1 / 16f, 2 / 16f, 1 / 16f), 20); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, bb, + new AABB(stationPos).contract(1 / 16f, 2 / 16f, 1 / 16f), 20); scene.idle(25); - scene.overlay.showText(80) + scene.overlay().showText(80) .pointAt(marker) .attachKeyFrame() .placeNearTarget() .text("Stations are the Waypoints of your Track Network"); scene.idle(90); - scene.overlay.showControls(new InputWindowElement(stationTop, Pointing.DOWN).rightClick(), 50); + scene.overlay().showControls(new InputWindowElement(stationTop, Pointing.DOWN).rightClick(), 50); scene.idle(16); - scene.overlay.showText(70) + scene.overlay().showText(70) .pointAt(stationTop) .placeNearTarget() .attachKeyFrame() .text("To create a new Train, open the UI and switch to Assembly Mode"); scene.idle(50); - scene.world.cycleBlockProperty(stationPos, StationBlock.ASSEMBLING); - scene.effects.indicateSuccess(stationPos); + scene.world().cycleBlockProperty(stationPos, StationBlock.ASSEMBLING); + scene.effects().indicateSuccess(stationPos); scene.idle(20); - scene.overlay.showControls(new InputWindowElement(marker, Pointing.DOWN).withItem(new ItemStack(Items.BARRIER)), - 60); + scene.overlay().showControls(new InputWindowElement(marker, Pointing.DOWN).withItem(new ItemStack(Items.BARRIER)), + 60); scene.idle(6); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, bb, bb, 1); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, bb, bb.inflate(.45f, 1 / 16f, .45f), 80); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.RED, bb, bb, 1); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.RED, bb, bb.inflate(.45f, 1 / 16f, .45f), 80); scene.idle(10); - scene.overlay.showText(70) + scene.overlay().showText(70) .pointAt(marker) .placeNearTarget() .colored(PonderPalette.RED) @@ -115,183 +115,183 @@ public class TrainStationScenes { scene.idle(85); ItemStack casing = AllBlocks.RAILWAY_CASING.asStack(); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(11, 0, 6), Pointing.RIGHT).rightClick() + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(11, 0, 6), Pointing.RIGHT).rightClick() .withItem(casing), 80); scene.idle(6); - scene.world.restoreBlocks(util.select.position(10, 2, 6)); + scene.world().restoreBlocks(util.select().position(10, 2, 6)); ElementLink trainElement1 = - scene.world.showIndependentSection(util.select.position(10, 2, 6), Direction.DOWN); + scene.world().showIndependentSection(util.select().position(10, 2, 6), Direction.DOWN); scene.idle(20); - scene.overlay.showText(70) - .pointAt(util.vector.blockSurface(util.grid.at(10, 2, 6), Direction.WEST)) + scene.overlay().showText(70) + .pointAt(util.vector().blockSurface(util.grid().at(10, 2, 6), Direction.WEST)) .placeNearTarget() .attachKeyFrame() .colored(PonderPalette.BLUE) .text("Create new bogeys by using Train Casing on Tracks"); scene.idle(55); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(4, 0, 6), Pointing.RIGHT).rightClick() + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(4, 0, 6), Pointing.RIGHT).rightClick() .withItem(casing), 15); scene.idle(6); - scene.world.setBlock(util.grid.at(3, 2, 6), AllBlocks.SMALL_BOGEY.getDefaultState(), false); + scene.world().setBlock(util.grid().at(3, 2, 6), AllBlocks.SMALL_BOGEY.getDefaultState(), false); ElementLink trainElement2 = - scene.world.showIndependentSection(util.select.position(3, 2, 6), Direction.DOWN); + scene.world().showIndependentSection(util.select().position(3, 2, 6), Direction.DOWN); scene.idle(20); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(7, 0, 6), Pointing.RIGHT).rightClick() + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(7, 0, 6), Pointing.RIGHT).rightClick() .withItem(casing), 15); scene.idle(6); - scene.world.setBlock(util.grid.at(6, 2, 6), AllBlocks.SMALL_BOGEY.getDefaultState(), false); - scene.world.showSectionAndMerge(util.select.position(6, 2, 6), Direction.DOWN, trainElement2); + scene.world().setBlock(util.grid().at(6, 2, 6), AllBlocks.SMALL_BOGEY.getDefaultState(), false); + scene.world().showSectionAndMerge(util.select().position(6, 2, 6), Direction.DOWN, trainElement2); scene.idle(30); - scene.overlay.showText(50) - .pointAt(util.vector.topOf(3, 0, 6)) + scene.overlay().showText(50) + .pointAt(util.vector().topOf(3, 0, 6)) .placeNearTarget() .attachKeyFrame() .colored(PonderPalette.BLUE) .text("Click the track again to cycle between bogey designs"); scene.idle(35); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(4, 0, 6), Pointing.RIGHT).rightClick(), 15); + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(4, 0, 6), Pointing.RIGHT).rightClick(), 15); scene.idle(6); - scene.world.restoreBlocks(util.select.position(3, 2, 6)); + scene.world().restoreBlocks(util.select().position(3, 2, 6)); scene.idle(20); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(7, 0, 6), Pointing.RIGHT).rightClick(), 15); + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(7, 0, 6), Pointing.RIGHT).rightClick(), 15); scene.idle(6); - scene.world.restoreBlocks(util.select.position(6, 2, 6)); + scene.world().restoreBlocks(util.select().position(6, 2, 6)); scene.idle(30); - scene.overlay.showOutline(PonderPalette.GREEN, casing, util.select.position(10, 2, 6) - .add(util.select.position(6, 2, 6)) - .add(util.select.position(3, 2, 6)), 40); + scene.overlay().showOutline(PonderPalette.GREEN, casing, util.select().position(10, 2, 6) + .add(util.select().position(6, 2, 6)) + .add(util.select().position(3, 2, 6)), 40); - scene.overlay.showText(70) - .pointAt(util.vector.topOf(3, 2, 6)) + scene.overlay().showText(70) + .pointAt(util.vector().topOf(3, 2, 6)) .placeNearTarget() .attachKeyFrame() .colored(PonderPalette.GREEN) .text("Attach blocks with the help of Super Glue"); scene.idle(35); - scene.world.showSectionAndMerge(train1, Direction.DOWN, trainElement1); + scene.world().showSectionAndMerge(train1, Direction.DOWN, trainElement1); scene.idle(10); - scene.world.showSectionAndMerge(train2, Direction.DOWN, trainElement2); + scene.world().showSectionAndMerge(train2, Direction.DOWN, trainElement2); scene.idle(5); - scene.world.showSectionAndMerge(util.select.fromTo(6, 4, 5, 6, 3, 7), Direction.WEST, trainElement2); + scene.world().showSectionAndMerge(util.select().fromTo(6, 4, 5, 6, 3, 7), Direction.WEST, trainElement2); scene.idle(3); - scene.world.showSectionAndMerge(util.select.fromTo(5, 3, 6, 4, 4, 7), Direction.NORTH, trainElement2); + scene.world().showSectionAndMerge(util.select().fromTo(5, 3, 6, 4, 4, 7), Direction.NORTH, trainElement2); scene.idle(3); - scene.world.showSectionAndMerge(util.select.fromTo(3, 3, 6, 3, 5, 6), Direction.DOWN, trainElement2); + scene.world().showSectionAndMerge(util.select().fromTo(3, 3, 6, 3, 5, 6), Direction.DOWN, trainElement2); scene.idle(3); - scene.world.showSectionAndMerge(util.select.fromTo(3, 5, 5, 3, 6, 5), Direction.SOUTH, trainElement2); + scene.world().showSectionAndMerge(util.select().fromTo(3, 5, 5, 3, 6, 5), Direction.SOUTH, trainElement2); scene.idle(3); - scene.world.showSectionAndMerge(util.select.position(3, 3, 5), Direction.EAST, trainElement2); + scene.world().showSectionAndMerge(util.select().position(3, 3, 5), Direction.EAST, trainElement2); scene.idle(3); - scene.world.showSectionAndMerge(util.select.position(5, 3, 5), Direction.SOUTH, trainElement2); + scene.world().showSectionAndMerge(util.select().position(5, 3, 5), Direction.SOUTH, trainElement2); scene.idle(10); - AABB glue1 = new AABB(util.grid.at(10, 2, 6)); - AABB glue2 = new AABB(util.grid.at(4, 2, 6)); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, glue2, glue2, 1); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, glue2, glue2.inflate(2, 0, 1) + AABB glue1 = new AABB(util.grid().at(10, 2, 6)); + AABB glue2 = new AABB(util.grid().at(4, 2, 6)); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, glue2, glue2, 1); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, glue2, glue2.inflate(2, 0, 1) .expandTowards(1, 3, 0), 60); scene.idle(5); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, glue1, glue1, 1); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, glue1, glue1.inflate(1.25, 0, .25) + scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, glue1, glue1, 1); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, glue1, glue1.inflate(1.25, 0, .25) .expandTowards(0, 1, 0), 60); scene.idle(15); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(util.grid.at(4, 2, 6)), Pointing.UP) + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(util.grid().at(4, 2, 6)), Pointing.UP) .withItem(AllItems.SUPER_GLUE.asStack()), 40); scene.idle(5); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(util.grid.at(10, 2, 6)), Pointing.UP) + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(util.grid().at(10, 2, 6)), Pointing.UP) .withItem(AllItems.SUPER_GLUE.asStack()), 40); scene.idle(55); - scene.overlay.showControls(new InputWindowElement(util.vector.topOf(util.grid.at(5, 3, 5)), Pointing.DOWN) + scene.overlay().showControls(new InputWindowElement(util.vector().topOf(util.grid().at(5, 3, 5)), Pointing.DOWN) .withItem(new ItemStack(Items.CHARCOAL)), 40); scene.idle(10); - scene.overlay.showText(90) - .pointAt(util.vector.blockSurface(util.grid.at(5, 3, 5), Direction.WEST)) + scene.overlay().showText(90) + .pointAt(util.vector().blockSurface(util.grid().at(5, 3, 5), Direction.WEST)) .placeNearTarget() .attachKeyFrame() .colored(PonderPalette.BLUE) .text("Assembled Trains will move faster if they can find fuel in assembled chests or barrels"); scene.idle(100); - scene.overlay.showSelectionWithText(util.select.fromTo(4, 3, 6, 5, 4, 7), 60) - .pointAt(util.vector.blockSurface(util.grid.at(5, 4, 6), Direction.UP)) + scene.overlay().showSelectionWithText(util.select().fromTo(4, 3, 6, 5, 4, 7), 60) + .pointAt(util.vector().blockSurface(util.grid().at(5, 4, 6), Direction.UP)) .colored(PonderPalette.RED) .placeNearTarget() .text("Fuel stored in Vaults will not be consumed by the train"); scene.idle(75); - ElementLink controlsElement = scene.world.showIndependentSection(controls, Direction.DOWN); + ElementLink controlsElement = scene.world().showIndependentSection(controls, Direction.DOWN); scene.idle(15); - scene.overlay.showText(60) - .pointAt(util.vector.topOf(10, 3, 6)) + scene.overlay().showText(60) + .pointAt(util.vector().topOf(10, 3, 6)) .placeNearTarget() .attachKeyFrame() .text("Every Train requires Train Controls on board"); scene.idle(55); - scene.world.showSectionAndMerge(util.select.position(8, 3, 6), Direction.DOWN, controlsElement); + scene.world().showSectionAndMerge(util.select().position(8, 3, 6), Direction.DOWN, controlsElement); scene.idle(15); - scene.world.moveSection(controlsElement, util.vector.of(1, 0, 0), 10); + scene.world().moveSection(controlsElement, util.vector().of(1, 0, 0), 10); scene.idle(15); - scene.overlay.showText(80) - .pointAt(util.vector.topOf(9, 3, 6)) + scene.overlay().showText(80) + .pointAt(util.vector().topOf(9, 3, 6)) .placeNearTarget() .text("An optional second one allows departure from Stations in both directions"); scene.idle(75); - scene.overlay.showControls(new InputWindowElement(stationTop, Pointing.DOWN).rightClick(), 50); + scene.overlay().showControls(new InputWindowElement(stationTop, Pointing.DOWN).rightClick(), 50); scene.idle(16); - scene.overlay.showText(60) + scene.overlay().showText(60) .pointAt(stationTop) .placeNearTarget() .attachKeyFrame() .text("Open the Station UI and confirm the Assembly process"); scene.idle(50); - scene.world.toggleControls(util.grid.at(10, 3, 6)); - scene.world.toggleControls(util.grid.at(8, 3, 6)); - scene.world.cycleBlockProperty(stationPos, StationBlock.ASSEMBLING); - scene.effects.indicateSuccess(stationPos); - scene.world.animateTrainStation(stationPos, true); + scene.world().toggleControls(util.grid().at(10, 3, 6)); + scene.world().toggleControls(util.grid().at(8, 3, 6)); + scene.world().cycleBlockProperty(stationPos, StationBlock.ASSEMBLING); + scene.effects().indicateSuccess(stationPos); + scene.world().animateTrainStation(stationPos, true); scene.idle(20); ElementLink birb = - scene.special.createBirb(util.vector.centerOf(10, 3, 6), ParrotElement.FacePointOfInterestPose::new); + scene.special().createBirb(util.vector().centerOf(10, 3, 6), ParrotElement.FacePointOfInterestPose::new); scene.idle(15); - scene.special.movePointOfInterest(util.grid.at(18, 3, 6)); + scene.special().movePointOfInterest(util.grid().at(18, 3, 6)); scene.idle(15); - scene.world.animateTrainStation(stationPos, false); - scene.world.moveSection(controlsElement, util.vector.of(18, 0, 0), 70); - scene.world.moveSection(trainElement1, util.vector.of(18, 0, 0), 70); - scene.world.moveSection(trainElement2, util.vector.of(18, 0, 0), 70); - scene.world.animateBogey(util.grid.at(10, 2, 6), -18f, 70); - scene.world.animateBogey(util.grid.at(6, 2, 6), -18f, 70); - scene.world.animateBogey(util.grid.at(3, 2, 6), -18f, 70); - scene.special.moveParrot(birb, util.vector.of(18, 0, 0), 70); + scene.world().animateTrainStation(stationPos, false); + scene.world().moveSection(controlsElement, util.vector().of(18, 0, 0), 70); + scene.world().moveSection(trainElement1, util.vector().of(18, 0, 0), 70); + scene.world().moveSection(trainElement2, util.vector().of(18, 0, 0), 70); + scene.world().animateBogey(util.grid().at(10, 2, 6), -18f, 70); + scene.world().animateBogey(util.grid().at(6, 2, 6), -18f, 70); + scene.world().animateBogey(util.grid().at(3, 2, 6), -18f, 70); + scene.special().moveParrot(birb, util.vector().of(18, 0, 0), 70); scene.idle(10); - scene.world.hideIndependentSection(controlsElement, null); - scene.world.hideIndependentSection(trainElement1, null); - scene.special.hideElement(birb, null); + scene.world().hideIndependentSection(controlsElement, null); + scene.world().hideIndependentSection(trainElement1, null); + scene.special().hideElement(birb, null); scene.idle(20); - scene.world.hideIndependentSection(trainElement2, null); + scene.world().hideIndependentSection(trainElement2, null); scene.idle(20); - scene.overlay.showText(70) + scene.overlay().showText(70) .pointAt(stationTop) .placeNearTarget() .attachKeyFrame() .text("Trains can be disassembled back into blocks at stations only"); scene.idle(85); - scene.overlay.showControls(new InputWindowElement(stationTop, Pointing.DOWN).rightClick() + scene.overlay().showControls(new InputWindowElement(stationTop, Pointing.DOWN).rightClick() .withItem(new ItemStack(Items.FILLED_MAP)), 75); scene.idle(15); - scene.overlay.showText(70) + scene.overlay().showText(70) .pointAt(stationTop) .placeNearTarget() .attachKeyFrame() @@ -300,22 +300,22 @@ public class TrainStationScenes { scene.idle(70); for (int i = 8; i >= 3; i--) { - scene.world.showSection(util.select.position(i, 1, 2), Direction.DOWN); + scene.world().showSection(util.select().position(i, 1, 2), Direction.DOWN); scene.idle(1); } - scene.world.toggleControls(util.grid.at(5, 3, 2)); + scene.world().toggleControls(util.grid().at(5, 3, 2)); scene.idle(10); - ElementLink trainElement3 = scene.world.showIndependentSection(train3, Direction.DOWN); - scene.world.moveSection(trainElement3, util.vector.of(0, 0, 4), 0); + ElementLink trainElement3 = scene.world().showIndependentSection(train3, Direction.DOWN); + scene.world().moveSection(trainElement3, util.vector().of(0, 0, 4), 0); scene.idle(15); - Vec3 target = util.vector.topOf(util.grid.at(5, 3, 6)); - scene.overlay.showControls(new InputWindowElement(target, Pointing.DOWN).rightClick() + Vec3 target = util.vector().topOf(util.grid().at(5, 3, 6)); + scene.overlay().showControls(new InputWindowElement(target, Pointing.DOWN).rightClick() .withItem(AllItems.WRENCH.asStack()), 75); scene.idle(15); - scene.overlay.showText(70) + scene.overlay().showText(70) .pointAt(target) .placeNearTarget() .attachKeyFrame() @@ -323,11 +323,11 @@ public class TrainStationScenes { .text("Assembled Trains can be relocated to nearby Tracks using the Wrench"); scene.idle(60); - scene.overlay - .showControls(new InputWindowElement(util.vector.topOf(util.grid.at(6, 0, 2)), Pointing.DOWN).rightClick() + scene.overlay() + .showControls(new InputWindowElement(util.vector().topOf(util.grid().at(6, 0, 2)), Pointing.DOWN).rightClick() .withItem(AllItems.WRENCH.asStack()), 15); scene.idle(15); - scene.world.moveSection(trainElement3, util.vector.of(0, 0, -4), 5); + scene.world().moveSection(trainElement3, util.vector().of(0, 0, -4), 5); } @@ -340,184 +340,184 @@ public class TrainStationScenes { scene.showBasePlate(); for (int i = 13; i >= 0; i--) { - scene.world.showSection(util.select.position(i, 1, 6), Direction.DOWN); + scene.world().showSection(util.select().position(i, 1, 6), Direction.DOWN); scene.idle(1); } - scene.world.toggleControls(util.grid.at(7, 3, 6)); + scene.world().toggleControls(util.grid().at(7, 3, 6)); scene.idle(4); - Selection redstone = util.select.fromTo(8, 1, 2, 8, 1, 1); - Selection belt = util.select.fromTo(9, 1, 3, 12, 1, 3); - Selection largeCog = util.select.position(13, 0, 4); - Selection cog = util.select.position(12, 1, 4); - BlockPos stationPos = util.grid.at(8, 1, 3); - Selection train = util.select.fromTo(9, 2, 5, 5, 3, 7); - Selection station = util.select.position(stationPos); + Selection redstone = util.select().fromTo(8, 1, 2, 8, 1, 1); + Selection belt = util.select().fromTo(9, 1, 3, 12, 1, 3); + Selection largeCog = util.select().position(13, 0, 4); + Selection cog = util.select().position(12, 1, 4); + BlockPos stationPos = util.grid().at(8, 1, 3); + Selection train = util.select().fromTo(9, 2, 5, 5, 3, 7); + Selection station = util.select().position(stationPos); - scene.world.showSection(station, Direction.DOWN); + scene.world().showSection(station, Direction.DOWN); scene.idle(10); - ElementLink trainElement = scene.world.showIndependentSection(train, Direction.DOWN); - scene.world.moveSection(trainElement, util.vector.of(-4, 0, 0), 0); - Vec3 target = util.vector.centerOf(2, 3, 6); - ElementLink birb = scene.special.createBirb(target, ParrotElement.FacePointOfInterestPose::new); + ElementLink trainElement = scene.world().showIndependentSection(train, Direction.DOWN); + scene.world().moveSection(trainElement, util.vector().of(-4, 0, 0), 0); + Vec3 target = util.vector().centerOf(2, 3, 6); + ElementLink birb = scene.special().createBirb(target, ParrotElement.FacePointOfInterestPose::new); scene.idle(10); - scene.overlay.showText(90) + scene.overlay().showText(90) .pointAt(target) .placeNearTarget() .attachKeyFrame() .text("Schedules can be used to provide drivers with a destination"); scene.idle(70); - scene.overlay.showControls( + scene.overlay().showControls( new InputWindowElement(target.add(0, 0.5, 0), Pointing.DOWN).withItem(AllItems.SCHEDULE.asStack()), 40); scene.idle(6); - scene.special.movePointOfInterest(util.grid.at(9, 4, 6)); + scene.special().movePointOfInterest(util.grid().at(9, 4, 6)); - Vec3 marker = util.vector.topOf(8, 0, 6) + Vec3 marker = util.vector().topOf(8, 0, 6) .add(0, 3 / 16f, 0); AABB bb = new AABB(marker, marker); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb, bb, 1); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb, bb.inflate(.45f, 0, .45f), 40); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb, bb, 1); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb, bb.inflate(.45f, 0, .45f), 40); scene.idle(15); AABB bb2 = new AABB(marker, marker).move(-.45, 0, 0); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb2, bb2.move(-4, 0, 0), 1); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb2, bb2.expandTowards(-4, 0, 0), 20); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb2, bb2.move(-4, 0, 0), 1); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb2, bb2.expandTowards(-4, 0, 0), 20); scene.idle(15); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, bb, bb.inflate(.45f, 0, .45f), 25); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, bb2, bb2.expandTowards(-4, 0, 0), 25); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, bb, bb.inflate(.45f, 0, .45f), 25); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, bb2, bb2.expandTowards(-4, 0, 0), 25); scene.idle(20); - scene.world.showSection(redstone, Direction.SOUTH); + scene.world().showSection(redstone, Direction.SOUTH); - scene.world.moveSection(trainElement, util.vector.of(4, 0, 0), 20); - scene.world.animateBogey(util.grid.at(7, 2, 6), -4f, 20); - scene.special.moveParrot(birb, util.vector.of(4, 0, 0), 20); + scene.world().moveSection(trainElement, util.vector().of(4, 0, 0), 20); + scene.world().animateBogey(util.grid().at(7, 2, 6), -4f, 20); + scene.special().moveParrot(birb, util.vector().of(4, 0, 0), 20); scene.idle(20); - scene.world.animateTrainStation(stationPos, true); - scene.world.toggleRedstonePower(redstone); - scene.effects.indicateRedstone(stationPos); + scene.world().animateTrainStation(stationPos, true); + scene.world().toggleRedstonePower(redstone); + scene.effects().indicateRedstone(stationPos); scene.idle(25); - scene.overlay.showText(80) - .pointAt(util.vector.topOf(stationPos.north()) + scene.overlay().showText(80) + .pointAt(util.vector().topOf(stationPos.north()) .subtract(0, 14 / 16f, 0)) .placeNearTarget() .attachKeyFrame() .text("Comparators will receive a signal whenever a Train is present"); scene.idle(90); - scene.world.hideSection(redstone, Direction.NORTH); - scene.world.animateTrainStation(stationPos, false); - scene.world.moveSection(trainElement, util.vector.of(0, 1, 0), 5); - scene.special.moveParrot(birb, util.vector.of(0, 2, 0), 5); + scene.world().hideSection(redstone, Direction.NORTH); + scene.world().animateTrainStation(stationPos, false); + scene.world().moveSection(trainElement, util.vector().of(0, 1, 0), 5); + scene.special().moveParrot(birb, util.vector().of(0, 2, 0), 5); scene.idle(7); - scene.world.moveSection(trainElement, util.vector.of(4, 0, 0), 10); - scene.world.rotateSection(trainElement, 0, 180, 0, 10); - scene.special.moveParrot(birb, util.vector.of(6, 0, 0), 10); + scene.world().moveSection(trainElement, util.vector().of(4, 0, 0), 10); + scene.world().rotateSection(trainElement, 0, 180, 0, 10); + scene.special().moveParrot(birb, util.vector().of(6, 0, 0), 10); scene.idle(12); - scene.world.moveSection(trainElement, util.vector.of(0, -1, 0), 5); - scene.special.moveParrot(birb, util.vector.of(0, -2, 0), 5); + scene.world().moveSection(trainElement, util.vector().of(0, -1, 0), 5); + scene.special().moveParrot(birb, util.vector().of(0, -2, 0), 5); scene.idle(25); target = target.add(10, 0, 0); - scene.overlay.showText(90) + scene.overlay().showText(90) .pointAt(marker.add(-.45, 0, 0)) .colored(PonderPalette.RED) .placeNearTarget() .attachKeyFrame() .text("Mind that a Station can only be approached from the indicated direction"); scene.idle(70); - scene.overlay.showControls( + scene.overlay().showControls( new InputWindowElement(target.add(0, 0.5, 0), Pointing.DOWN).withItem(AllItems.SCHEDULE.asStack()), 40); scene.idle(6); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb, bb, 1); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb, bb.inflate(.45f, 0, .45f), 40); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb, bb, 1); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb, bb.inflate(.45f, 0, .45f), 40); scene.idle(15); bb2 = new AABB(marker, marker).move(.45, 0, 0); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb2, bb2.move(4, 0, 0), 1); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb2, bb2.expandTowards(4, 0, 0), 20); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb2, bb2.move(4, 0, 0), 1); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb2, bb2.expandTowards(4, 0, 0), 20); scene.idle(15); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, bb, bb.inflate(.45f, 0, .45f), 45); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, bb2, bb2.expandTowards(4, 0, 0), 45); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.RED, bb, bb.inflate(.45f, 0, .45f), 45); + scene.overlay().chaseBoundingBoxOutline(PonderPalette.RED, bb2, bb2.expandTowards(4, 0, 0), 45); scene.idle(20); - scene.special.movePointOfInterest(util.grid.at(11, 2, 5)); + scene.special().movePointOfInterest(util.grid().at(11, 2, 5)); scene.idle(25); - scene.world.hideIndependentSection(trainElement, Direction.EAST); - scene.special.hideElement(birb, Direction.EAST); + scene.world().hideIndependentSection(trainElement, Direction.EAST); + scene.special().hideElement(birb, Direction.EAST); scene.idle(20); - scene.world.multiplyKineticSpeed(util.select.everywhere(), .75f); + scene.world().multiplyKineticSpeed(util.select().everywhere(), .75f); - scene.world.showSection(largeCog, Direction.UP); - scene.world.showSection(cog, Direction.DOWN); + scene.world().showSection(largeCog, Direction.UP); + scene.world().showSection(cog, Direction.DOWN); scene.idle(3); - scene.world.showSection(belt, Direction.SOUTH); + scene.world().showSection(belt, Direction.SOUTH); scene.idle(15); - scene.overlay.showText(70) - .pointAt(util.vector.topOf(stationPos) + scene.overlay().showText(70) + .pointAt(util.vector().topOf(stationPos) .add(-.5, 0, 0)) .placeNearTarget() .attachKeyFrame() .text("Stations can also be used to assign new Schedules automatically"); scene.idle(40); - trainElement = scene.world.showIndependentSection(train, Direction.DOWN); - scene.world.moveSection(trainElement, util.vector.of(-4, 0, 0), 0); - target = util.vector.centerOf(2, 3, 6); - birb = scene.special.createBirb(target, ParrotElement.FacePointOfInterestPose::new); + trainElement = scene.world().showIndependentSection(train, Direction.DOWN); + scene.world().moveSection(trainElement, util.vector().of(-4, 0, 0), 0); + target = util.vector().centerOf(2, 3, 6); + birb = scene.special().createBirb(target, ParrotElement.FacePointOfInterestPose::new); scene.idle(10); - scene.world.moveSection(trainElement, util.vector.of(4, 0, 0), 20); - scene.world.animateBogey(util.grid.at(7, 2, 6), -4f, 20); - scene.special.moveParrot(birb, util.vector.of(4, 0, 0), 20); + scene.world().moveSection(trainElement, util.vector().of(4, 0, 0), 20); + scene.world().animateBogey(util.grid().at(7, 2, 6), -4f, 20); + scene.special().moveParrot(birb, util.vector().of(4, 0, 0), 20); scene.idle(10); - scene.world.createItemOnBelt(util.grid.at(11, 1, 3), Direction.DOWN, AllItems.SCHEDULE.asStack()); + scene.world().createItemOnBelt(util.grid().at(11, 1, 3), Direction.DOWN, AllItems.SCHEDULE.asStack()); scene.idle(10); - scene.world.animateTrainStation(stationPos, true); + scene.world().animateTrainStation(stationPos, true); scene.idle(10); - scene.overlay.showControls( - new InputWindowElement(util.vector.topOf(stationPos), Pointing.DOWN).withItem(AllItems.SCHEDULE.asStack()), + scene.overlay().showControls( + new InputWindowElement(util.vector().topOf(stationPos), Pointing.DOWN).withItem(AllItems.SCHEDULE.asStack()), 20); scene.idle(30); - scene.effects.indicateSuccess(stationPos); + scene.effects().indicateSuccess(stationPos); scene.idle(10); - target = util.vector.centerOf(6, 3, 6); - scene.overlay.showLine(PonderPalette.GREEN, util.vector.topOf(stationPos) + target = util.vector().centerOf(6, 3, 6); + scene.overlay().showLine(PonderPalette.GREEN, util.vector().topOf(stationPos) .add(0, -.125, .45), target.add(0, 0, -.5), 40); scene.idle(10); - scene.effects.indicateSuccess(util.grid.at(6, 3, 6)); - scene.special.conductorBirb(birb, true); - scene.special.movePointOfInterest(util.grid.at(18, 4, 6)); + scene.effects().indicateSuccess(util.grid().at(6, 3, 6)); + scene.special().conductorBirb(birb, true); + scene.special().movePointOfInterest(util.grid().at(18, 4, 6)); scene.idle(25); - scene.overlay.showText(80) + scene.overlay().showText(80) .pointAt(target) .placeNearTarget() .attachKeyFrame() .text("The Schedule placed on a station will automatically copy itself to present trains"); scene.idle(90); - scene.world.moveSection(trainElement, util.vector.of(8, 0, 0), 30); - scene.special.moveParrot(birb, util.vector.of(8, 0, 0), 30); - scene.world.animateBogey(util.grid.at(7, 2, 6), -8f, 30); - scene.world.animateTrainStation(stationPos, false); + scene.world().moveSection(trainElement, util.vector().of(8, 0, 0), 30); + scene.special().moveParrot(birb, util.vector().of(8, 0, 0), 30); + scene.world().animateBogey(util.grid().at(7, 2, 6), -8f, 30); + scene.world().animateTrainStation(stationPos, false); scene.idle(10); - scene.world.hideIndependentSection(trainElement, null); - scene.special.hideElement(birb, null); + scene.world().hideIndependentSection(trainElement, null); + scene.special().hideElement(birb, null); scene.idle(25); - scene.overlay.showText(100) - .pointAt(util.vector.topOf(stationPos) + scene.overlay().showText(100) + .pointAt(util.vector().topOf(stationPos) .add(-.5, 0, 0)) .placeNearTarget() .colored(PonderPalette.BLUE) From 01b214b28d6293d193d13c6c2dbef8120257ee56 Mon Sep 17 00:00:00 2001 From: zelophed Date: Sun, 5 Nov 2023 15:21:23 +0100 Subject: [PATCH 016/515] all the elements - even more ponder API refactors --- .../content/kinetics/belt/BeltBlock.java | 2 +- .../trains/track/TrackTargetingBehaviour.java | 2 +- .../foundation/ponder/CreatePonderPlugin.java | 6 +- .../foundation/ponder/CreateSceneBuilder.java | 22 +++-- .../ponder/PonderWorldBlockEntityFix.java | 2 +- .../ponder/element/BeltItemElement.java | 4 +- .../ponder/element/ExpandedParrotElement.java | 5 +- .../AnimateBlockEntityInstruction.java | 6 +- .../ponder/scenes/ArmScenes.java | 52 +++++----- .../ponder/scenes/BearingScenes.java | 89 ++++++++--------- .../ponder/scenes/BeltScenes.java | 74 +++++++-------- .../ponder/scenes/CartAssemblerScenes.java | 44 ++++----- .../ponder/scenes/ChainDriveScenes.java | 21 ++-- .../ponder/scenes/ChassisScenes.java | 83 +++++++--------- .../ponder/scenes/ChuteScenes.java | 54 ++++------- .../ponder/scenes/CrafterScenes.java | 73 ++++++-------- .../ponder/scenes/DeployerScenes.java | 49 +++++----- .../ponder/scenes/DetectorScenes.java | 24 ++--- .../ponder/scenes/DisplayScenes.java | 39 ++++---- .../ponder/scenes/EjectorScenes.java | 39 ++++---- .../ponder/scenes/ElevatorScenes.java | 59 +++++------- .../ponder/scenes/FanScenes.java | 45 +++++---- .../ponder/scenes/FunnelScenes.java | 31 +++--- .../ponder/scenes/GantryScenes.java | 13 ++- .../ponder/scenes/ItemVaultScenes.java | 14 ++- .../ponder/scenes/KineticsScenes.java | 95 +++++++++---------- .../ponder/scenes/MechanicalDrillScenes.java | 13 ++- .../ponder/scenes/MechanicalSawScenes.java | 24 ++--- .../ponder/scenes/MovementActorScenes.java | 49 ++++------ .../ponder/scenes/PistonScenes.java | 32 +++---- .../ponder/scenes/ProcessingScenes.java | 86 +++++++---------- .../ponder/scenes/PulleyScenes.java | 20 ++-- .../ponder/scenes/RedstoneScenes.java | 63 ++++++------ .../ponder/scenes/RedstoneScenes2.java | 16 ++-- .../ponder/scenes/RollerScenes.java | 43 ++++----- .../ponder/scenes/SteamScenes.java | 80 ++++++++-------- .../ponder/scenes/TunnelScenes.java | 50 ++++------ .../ponder/scenes/fluid/DrainScenes.java | 16 ++-- .../fluid/FluidMovementActorScenes.java | 21 ++-- .../ponder/scenes/fluid/FluidTankScenes.java | 32 +++---- .../ponder/scenes/fluid/HosePulleyScenes.java | 12 +-- .../ponder/scenes/fluid/PipeScenes.java | 37 ++++---- .../ponder/scenes/fluid/PumpScenes.java | 20 ++-- .../ponder/scenes/fluid/SpoutScenes.java | 28 +++--- .../scenes/trains/TrackObserverScenes.java | 24 ++--- .../ponder/scenes/trains/TrackScenes.java | 91 ++++++++---------- .../ponder/scenes/trains/TrainScenes.java | 44 ++++----- .../scenes/trains/TrainSignalScenes.java | 46 ++++----- .../scenes/trains/TrainStationScenes.java | 82 ++++++++-------- 49 files changed, 839 insertions(+), 1037 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltBlock.java b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltBlock.java index aaceb916dd..74223662ed 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltBlock.java @@ -533,7 +533,7 @@ public class BeltBlock extends HorizontalKineticBlock ((BeltTunnelBlock) tunnelBlock).updateTunnel(world, pos); } - public static List getBeltChain(Level world, BlockPos controllerPos) { + public static List getBeltChain(LevelAccessor world, BlockPos controllerPos) { List positions = new LinkedList<>(); BlockState blockState = world.getBlockState(controllerPos); diff --git a/src/main/java/com/simibubi/create/content/trains/track/TrackTargetingBehaviour.java b/src/main/java/com/simibubi/create/content/trains/track/TrackTargetingBehaviour.java index 6d43c73669..e7887f51be 100644 --- a/src/main/java/com/simibubi/create/content/trains/track/TrackTargetingBehaviour.java +++ b/src/main/java/com/simibubi/create/content/trains/track/TrackTargetingBehaviour.java @@ -27,7 +27,7 @@ import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.utility.Iterate; import net.createmod.catnip.utility.VecHelper; import net.createmod.catnip.utility.levelWrappers.SchematicLevel; -import net.createmod.ponder.foundation.PonderLevel; +import net.createmod.ponder.api.level.PonderLevel; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; diff --git a/src/main/java/com/simibubi/create/foundation/ponder/CreatePonderPlugin.java b/src/main/java/com/simibubi/create/foundation/ponder/CreatePonderPlugin.java index 6d4961132b..6b7632bd3f 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/CreatePonderPlugin.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/CreatePonderPlugin.java @@ -6,12 +6,12 @@ import com.simibubi.create.content.kinetics.crank.ValveHandleBlock; import com.simibubi.create.infrastructure.ponder.AllCreatePonderScenes; import com.simibubi.create.infrastructure.ponder.AllCreatePonderTags; +import net.createmod.ponder.api.level.PonderLevel; import net.createmod.ponder.api.registration.IndexExclusionHelper; import net.createmod.ponder.api.registration.PonderPlugin; import net.createmod.ponder.api.registration.PonderSceneRegistrationHelper; import net.createmod.ponder.api.registration.PonderTagRegistrationHelper; import net.createmod.ponder.api.registration.SharedTextRegistrationHelper; -import net.createmod.ponder.foundation.PonderLevel; import net.minecraft.resources.ResourceLocation; public class CreatePonderPlugin implements PonderPlugin { @@ -44,8 +44,8 @@ public class CreatePonderPlugin implements PonderPlugin { } @Override - public void onPonderWorldRestore(PonderLevel world) { - PonderWorldBlockEntityFix.fixControllerBlockEntities(world); + public void onPonderLevelRestore(PonderLevel ponderLevel) { + PonderWorldBlockEntityFix.fixControllerBlockEntities(ponderLevel); } @Override diff --git a/src/main/java/com/simibubi/create/foundation/ponder/CreateSceneBuilder.java b/src/main/java/com/simibubi/create/foundation/ponder/CreateSceneBuilder.java index f357ad98ee..2c6a48a1b8 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/CreateSceneBuilder.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/CreateSceneBuilder.java @@ -31,14 +31,16 @@ import com.simibubi.create.foundation.ponder.instruction.AnimateBlockEntityInstr import net.createmod.catnip.utility.FunctionalHelper; import net.createmod.catnip.utility.NBTHelper; import net.createmod.catnip.utility.VecHelper; +import net.createmod.ponder.api.element.ElementLink; +import net.createmod.ponder.api.element.ParrotElement; +import net.createmod.ponder.api.element.ParrotPose; +import net.createmod.ponder.api.element.WorldSectionElement; +import net.createmod.ponder.api.level.PonderLevel; import net.createmod.ponder.api.scene.SceneBuilder; -import net.createmod.ponder.foundation.ElementLink; -import net.createmod.ponder.foundation.PonderLevel; +import net.createmod.ponder.api.scene.Selection; import net.createmod.ponder.foundation.PonderScene; import net.createmod.ponder.foundation.PonderSceneBuilder; -import net.createmod.ponder.foundation.Selection; -import net.createmod.ponder.foundation.element.ParrotElement; -import net.createmod.ponder.foundation.element.WorldSectionElement; +import net.createmod.ponder.foundation.element.ElementLinkImpl; import net.createmod.ponder.foundation.instruction.CreateParrotInstruction; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -159,7 +161,7 @@ public class CreateSceneBuilder extends PonderSceneBuilder { public ElementLink createItemOnBelt(BlockPos beltLocation, Direction insertionSide, ItemStack stack) { - ElementLink link = new ElementLink<>(BeltItemElement.class); + ElementLink link = new ElementLinkImpl<>(BeltItemElement.class); addInstruction(scene -> { PonderLevel world = scene.getWorld(); BlockEntity blockEntity = world.getBlockEntity(beltLocation); @@ -308,8 +310,8 @@ public class CreateSceneBuilder extends PonderSceneBuilder { public class SpecialInstructions extends PonderSpecialInstructions { @Override - public ElementLink createBirb(Vec3 location, Supplier pose) { - ElementLink link = new ElementLink<>(ParrotElement.class); + public ElementLink createBirb(Vec3 location, Supplier pose) { + ElementLink link = new ElementLinkImpl<>(ParrotElement.class); ParrotElement parrot = ExpandedParrotElement.create(location, pose); addInstruction(new CreateParrotInstruction(10, Direction.DOWN, parrot)); addInstruction(scene -> scene.linkElement(parrot, link)); @@ -331,7 +333,7 @@ public class CreateSceneBuilder extends PonderSceneBuilder { .ifPresent(expandedBirb -> expandedBirb.setConductor(conductor))); } - public static class ParrotSpinOnComponentPose extends ParrotElement.ParrotPose { + public static class ParrotSpinOnComponentPose extends ParrotPose { private final BlockPos componentPos; public ParrotSpinOnComponentPose(BlockPos componentPos) { @@ -339,7 +341,7 @@ public class CreateSceneBuilder extends PonderSceneBuilder { } @Override - protected void tick(PonderScene scene, Parrot entity, Vec3 location) { + public void tick(PonderScene scene, Parrot entity, Vec3 location) { BlockEntity blockEntity = scene.getWorld().getBlockEntity(componentPos); if (!(blockEntity instanceof KineticBlockEntity)) return; diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderWorldBlockEntityFix.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderWorldBlockEntityFix.java index 3ffac694ed..6802f16fb3 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderWorldBlockEntityFix.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderWorldBlockEntityFix.java @@ -4,7 +4,7 @@ import com.simibubi.create.content.kinetics.belt.BeltBlock; import com.simibubi.create.content.kinetics.belt.BeltBlockEntity; import com.simibubi.create.foundation.blockEntity.IMultiBlockEntityContainer; -import net.createmod.ponder.foundation.PonderLevel; +import net.createmod.ponder.api.level.PonderLevel; import net.minecraft.core.BlockPos; import net.minecraft.world.level.block.entity.BlockEntity; diff --git a/src/main/java/com/simibubi/create/foundation/ponder/element/BeltItemElement.java b/src/main/java/com/simibubi/create/foundation/ponder/element/BeltItemElement.java index 9a60cb9eda..4b5bf28c33 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/element/BeltItemElement.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/element/BeltItemElement.java @@ -2,9 +2,9 @@ package com.simibubi.create.foundation.ponder.element; import com.simibubi.create.content.kinetics.belt.transport.TransportedItemStack; -import net.createmod.ponder.foundation.element.TrackedElement; +import net.createmod.ponder.foundation.element.TrackedElementBase; -public class BeltItemElement extends TrackedElement { +public class BeltItemElement extends TrackedElementBase { public BeltItemElement(TransportedItemStack wrapped) { super(wrapped); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/element/ExpandedParrotElement.java b/src/main/java/com/simibubi/create/foundation/ponder/element/ExpandedParrotElement.java index fc3471588a..c95de858e9 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/element/ExpandedParrotElement.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/element/ExpandedParrotElement.java @@ -2,12 +2,13 @@ package com.simibubi.create.foundation.ponder.element; import java.util.function.Supplier; +import net.createmod.ponder.api.element.ParrotPose; import net.createmod.ponder.foundation.PonderScene; -import net.createmod.ponder.foundation.element.ParrotElement; +import net.createmod.ponder.foundation.element.ParrotElementImpl; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.phys.Vec3; -public class ExpandedParrotElement extends ParrotElement { +public class ExpandedParrotElement extends ParrotElementImpl { protected boolean deferConductor = false; diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instruction/AnimateBlockEntityInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instruction/AnimateBlockEntityInstruction.java index aebf5af0ce..466812dd91 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instruction/AnimateBlockEntityInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instruction/AnimateBlockEntityInstruction.java @@ -9,7 +9,7 @@ import com.simibubi.create.content.contraptions.pulley.PulleyBlockEntity; import com.simibubi.create.content.kinetics.deployer.DeployerBlockEntity; import com.simibubi.create.content.trains.bogey.AbstractBogeyBlockEntity; -import net.createmod.ponder.foundation.PonderLevel; +import net.createmod.ponder.api.level.PonderLevel; import net.createmod.ponder.foundation.PonderScene; import net.createmod.ponder.foundation.instruction.TickingInstruction; import net.minecraft.core.BlockPos; @@ -22,8 +22,8 @@ public class AnimateBlockEntityInstruction extends TickingInstruction { protected double target; protected final BlockPos location; - private BiConsumer setter; - private Function getter; + private final BiConsumer setter; + private final Function getter; public static AnimateBlockEntityInstruction bearing(BlockPos location, float totalDelta, int ticks) { return new AnimateBlockEntityInstruction(location, totalDelta, ticks, diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ArmScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ArmScenes.java index d6e2bb7239..0dcdf97e72 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ArmScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ArmScenes.java @@ -8,13 +8,12 @@ import com.simibubi.create.content.logistics.funnel.FunnelBlockEntity; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.PonderPalette; +import net.createmod.ponder.api.element.ElementLink; +import net.createmod.ponder.api.element.WorldSectionElement; import net.createmod.ponder.api.scene.SceneBuilder; import net.createmod.ponder.api.scene.SceneBuildingUtil; -import net.createmod.ponder.foundation.ElementLink; -import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.Selection; -import net.createmod.ponder.foundation.element.InputWindowElement; -import net.createmod.ponder.foundation.element.WorldSectionElement; +import net.createmod.ponder.api.scene.Selection; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.item.ItemStack; @@ -44,7 +43,7 @@ public class ArmScenes { scene.world().showSection(armSel, Direction.DOWN); scene.idle(10); scene.effects().indicateRedstone(armPos); - scene.overlay().showSelectionWithText(armSel, 70) + scene.overlay().showOutlineWithText(armSel, 70) .attachKeyFrame() .colored(PonderPalette.RED) .text("Mechanical Arms have to be assigned their in- and outputs before they are placed") @@ -55,8 +54,9 @@ public class ArmScenes { scene.world().showSection(util.select().fromTo(0, 1, 1, 0, 2, 1), Direction.DOWN); scene.world().hideSection(armSel, Direction.UP); scene.idle(20); - scene.overlay().showControls(new InputWindowElement(depotSurface, Pointing.RIGHT).rightClick() - .withItem(armItem), 50); + scene.overlay().showControls(depotSurface, Pointing.RIGHT, 50) + .rightClick() + .withItem(armItem); scene.idle(7); AABB depotBounds = AllShapes.CASING_13PX.get(Direction.UP) .bounds(); @@ -71,15 +71,14 @@ public class ArmScenes { scene.idle(80); BlockPos outputDepot = util.grid().at(0, 2, 1); - InputWindowElement input = - new InputWindowElement(util.vector().blockSurface(outputDepot, Direction.NORTH), Pointing.RIGHT).rightClick() - .withItem(armItem); - scene.overlay().showControls(input, 20); + scene.overlay().showControls(util.vector().blockSurface(outputDepot, Direction.NORTH), Pointing.RIGHT, 20).rightClick() + .withItem(armItem); scene.idle(7); Object second = new Object(); scene.overlay().chaseBoundingBoxOutline(PonderPalette.INPUT, second, depotBounds.move(0, 2, 1), 100); scene.idle(25); - scene.overlay().showControls(input, 30); + scene.overlay().showControls(util.vector().blockSurface(outputDepot, Direction.NORTH), Pointing.RIGHT, 30).rightClick() + .withItem(armItem); scene.idle(7); scene.overlay().chaseBoundingBoxOutline(PonderPalette.OUTPUT, second, depotBounds.move(0, 2, 1), 280); scene.overlay().showText(70) @@ -100,9 +99,8 @@ public class ArmScenes { .placeNearTarget(); scene.idle(35); - scene.overlay() - .showControls(new InputWindowElement(util.vector().topOf(util.grid().at(1, 1, 0)), Pointing.DOWN).leftClick() - .withItem(armItem), 30); + scene.overlay().showControls(util.vector().topOf(util.grid().at(1, 1, 0)), Pointing.DOWN, 30).leftClick() + .withItem(armItem); scene.idle(50); scene.world().showSection(armSel, Direction.DOWN); @@ -223,8 +221,7 @@ public class ArmScenes { scene.idle(70); ItemStack sword = new ItemStack(Items.GOLDEN_SWORD); inputDepot = util.grid().at(4, 1, 2); - scene.overlay() - .showControls(new InputWindowElement(util.vector().topOf(inputDepot), Pointing.RIGHT).withItem(sword), 30); + scene.overlay().showControls(util.vector().topOf(inputDepot), Pointing.RIGHT, 30).withItem(sword); scene.world().createItemOnBeltLike(inputDepot, Direction.SOUTH, sword); scene.idle(20); @@ -238,10 +235,8 @@ public class ArmScenes { scene.world().flapFunnel(util.grid().at(0, 2, 2), false); scene.world().instructArm(armPos, Phase.SEARCH_INPUTS, ItemStack.EMPTY, -1); scene.idle(5); - scene.overlay().showControls( - new InputWindowElement(util.vector().blockSurface(util.grid().at(0, 2, 3), Direction.WEST), Pointing.LEFT) - .withItem(sword), - 30); + scene.overlay().showControls(util.vector().blockSurface(util.grid().at(0, 2, 3), Direction.WEST), Pointing.LEFT, 30) + .withItem(sword); } @@ -276,12 +271,12 @@ public class ArmScenes { scene.world().createItemOnBeltLike(util.grid().at(2, 1, 4), Direction.SOUTH, sand); scene.world().createItemOnBeltLike(util.grid().at(1, 1, 4), Direction.SOUTH, sulphur); - scene.overlay().showSelectionWithText(util.select().fromTo(2, 1, 4, 1, 1, 4), 60) + scene.overlay().showOutlineWithText(util.select().fromTo(2, 1, 4, 1, 1, 4), 60) .text("Inputs") .placeNearTarget() .colored(PonderPalette.INPUT); scene.idle(50); - scene.overlay().showSelectionWithText(util.select().fromTo(5, 3, 1, 3, 1, 1), 40) + scene.overlay().showOutlineWithText(util.select().fromTo(5, 3, 1, 3, 1, 1), 40) .text("Outputs") .placeNearTarget() .colored(PonderPalette.OUTPUT); @@ -297,7 +292,7 @@ public class ArmScenes { scene.rotateCameraY(-90 - 30); scene.idle(20); - scene.overlay().showSelectionWithText(util.select().position(4, 1, 4), 80) + scene.overlay().showOutlineWithText(util.select().position(4, 1, 4), 80) .colored(PonderPalette.RED) .text("Mechanical Arms by themselves do not provide any options for filtering") .placeNearTarget(); @@ -322,9 +317,8 @@ public class ArmScenes { for (int y = 0; y < 3; y++) { for (int x = 0; x < 3; x++) { ItemStack item = (x + y) % 2 == 0 ? sulphur : sand; - scene.overlay() - .showControls(new InputWindowElement(filterSlot.add(2 - x, -y, 0), Pointing.LEFT).rightClick() - .withItem(item), 5); + scene.overlay().showControls(filterSlot.add(2 - x, -y, 0), Pointing.LEFT, 5).rightClick() + .withItem(item); scene.idle(7); scene.world().setFilterData(util.select().position(5 - x, 3 - y, 2), FunnelBlockEntity.class, item); scene.idle(4); @@ -440,7 +434,7 @@ public class ArmScenes { .placeNearTarget(); scene.idle(60); - scene.overlay().showControls(new InputWindowElement(scrollSlot, Pointing.RIGHT).rightClick(), 40); + scene.overlay().showControls(scrollSlot, Pointing.RIGHT, 40).rightClick(); scene.idle(10); scene.overlay().showText(50) .text("The value panel will allow you to configure it") diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/BearingScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/BearingScenes.java index a6084e9109..f36cfc2ea6 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/BearingScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/BearingScenes.java @@ -9,13 +9,12 @@ import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Iterate; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.PonderPalette; +import net.createmod.ponder.api.element.ElementLink; +import net.createmod.ponder.api.element.WorldSectionElement; import net.createmod.ponder.api.scene.SceneBuilder; import net.createmod.ponder.api.scene.SceneBuildingUtil; -import net.createmod.ponder.foundation.ElementLink; -import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.Selection; -import net.createmod.ponder.foundation.element.InputWindowElement; -import net.createmod.ponder.foundation.element.WorldSectionElement; +import net.createmod.ponder.api.scene.Selection; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -52,7 +51,7 @@ public class BearingScenes { scene.idle(10); BlockPos anchorPos = windmill.north(); - scene.overlay().showSelectionWithText(util.select().position(anchorPos), 60) + scene.overlay().showOutlineWithText(util.select().position(anchorPos), 60) .colored(PonderPalette.GREEN) .pointAt(util.vector().blockSurface(windmill, Direction.WEST)) .attachKeyFrame() @@ -104,8 +103,8 @@ public class BearingScenes { scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, bb2, bb2, 1); scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, bb2, bb2.expandTowards(0, -4, 0), 80); scene.idle(10); - scene.overlay().showControls(new InputWindowElement(util.vector().centerOf(util.grid().at(5, 2, 0)), Pointing.RIGHT) - .withItem(AllItems.SUPER_GLUE.asStack()), 40); + scene.overlay().showControls(util.vector().centerOf(util.grid().at(5, 2, 0)), Pointing.RIGHT, 40) + .withItem(AllItems.SUPER_GLUE.asStack()); scene.idle(15); scene.overlay().showText(60) @@ -125,8 +124,7 @@ public class BearingScenes { scene.rotateCameraY(-90); scene.idle(20); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(windmill) - .subtract(.5, 0, 0), Pointing.DOWN).rightClick(), 60); + scene.overlay().showControls(util.vector().topOf(windmill).subtract(.5, 0, 0), Pointing.DOWN, 60).rightClick(); scene.idle(7); scene.world().rotateBearing(windmill, 360, 200); scene.world().rotateSection(structure, 0, 0, 360, 200); @@ -154,7 +152,7 @@ public class BearingScenes { Vec3 surface = util.vector().blockSurface(windmill, Direction.WEST) .add(0, 0, 2 / 16f); - scene.overlay().showControls(new InputWindowElement(surface, Pointing.DOWN).rightClick(), 60); + scene.overlay().showControls(surface, Pointing.DOWN, 60).rightClick(); scene.overlay().showFilterSlotInput(surface, Direction.WEST, 50); scene.overlay().showText(60) .pointAt(surface) @@ -170,8 +168,8 @@ public class BearingScenes { scene.effects().rotationDirectionIndicator(windmill.south()); scene.idle(69); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(windmill) - .subtract(.5, 0, 0), Pointing.DOWN).rightClick(), 60); + scene.overlay().showControls(util.vector().topOf(windmill).subtract(.5, 0, 0), Pointing.DOWN, 60) + .rightClick(); scene.idle(7); scene.world().rotateBearing(windmill, -45, 0); scene.world().rotateSection(structure, 0, 0, -45, 0); @@ -220,15 +218,13 @@ public class BearingScenes { scene.idle(10); scene.overlay().showOutline(PonderPalette.BLUE, bearingPos, util.select().fromTo(3, 2, 1, 3, 3, 2), 80); - scene.overlay().showSelectionWithText(util.select().fromTo(3, 2, 4, 3, 3, 5), 80) + scene.overlay().showOutlineWithText(util.select().fromTo(3, 2, 4, 3, 3, 5), 80) .colored(PonderPalette.BLUE) .attachKeyFrame() .text("Any Structure can count as a valid Windmill, as long as it contains at least 8 sail-like Blocks."); scene.idle(90); - scene.overlay().showControls( - new InputWindowElement(util.vector().blockSurface(bearingPos, Direction.WEST), Pointing.LEFT).rightClick(), - 40); + scene.overlay().showControls(util.vector().blockSurface(bearingPos, Direction.WEST), Pointing.LEFT, 40).rightClick(); scene.idle(7); scene.markAsFinished(); scene.world().rotateBearing(bearingPos, -720, 400); @@ -262,7 +258,7 @@ public class BearingScenes { .add(cog4); BlockPos bearingPos = util.grid().at(3, 2, 3); - scene.overlay().showSelectionWithText(util.select().position(bearingPos.above()), 60) + scene.overlay().showOutlineWithText(util.select().position(bearingPos.above()), 60) .colored(PonderPalette.GREEN) .pointAt(util.vector().blockSurface(bearingPos, Direction.WEST)) .placeNearTarget() @@ -305,8 +301,8 @@ public class BearingScenes { scene.overlay().showOutline(PonderPalette.GREEN, "glue", util.select().position(2, 4, 3) .add(util.select().fromTo(4, 3, 3, 2, 3, 3)) .add(util.select().position(4, 3, 2)), 40); - scene.overlay().showControls(new InputWindowElement(util.vector().centerOf(util.grid().at(4, 3, 3)), Pointing.RIGHT) - .withItem(AllItems.SUPER_GLUE.asStack()), 40); + scene.overlay().showControls(util.vector().centerOf(util.grid().at(4, 3, 3)), Pointing.RIGHT, 40) + .withItem(AllItems.SUPER_GLUE.asStack()); scene.idle(10); scene.world().showSectionAndMerge(plank2, Direction.SOUTH, contraption); @@ -392,8 +388,8 @@ public class BearingScenes { Vec3 blockSurface = util.vector().blockSurface(bearingPos, Direction.NORTH) .add(0, 2 / 16f, 0); scene.overlay().showFilterSlotInput(blockSurface, Direction.NORTH, 60); - scene.overlay().showControls(new InputWindowElement(blockSurface, Pointing.DOWN).scroll() - .withItem(AllItems.WRENCH.asStack()), 60); + scene.overlay().showControls(blockSurface, Pointing.DOWN, 60).scroll() + .withItem(AllItems.WRENCH.asStack()); scene.idle(10); scene.overlay().showText(60) .pointAt(blockSurface) @@ -446,7 +442,7 @@ public class BearingScenes { scene.idle(15); - scene.overlay().showSelectionWithText(util.select().position(bearingPos), 60) + scene.overlay().showOutlineWithText(util.select().position(bearingPos), 60) .text("Whenever Mechanical Bearings are themselves part of a moving Structure..") .attachKeyFrame() .placeNearTarget(); @@ -467,7 +463,7 @@ public class BearingScenes { .placeNearTarget(); scene.idle(70); - scene.overlay().showSelectionWithText(util.select().position(bearingPos.north()), 60) + scene.overlay().showOutlineWithText(util.select().position(bearingPos.north()), 60) .colored(PonderPalette.GREEN) .text("Once again, the bearing will attach to the block in front of it") .attachKeyFrame() @@ -513,7 +509,7 @@ public class BearingScenes { scene.world().showSection(util.select().position(bearingPos), Direction.DOWN); scene.idle(10); - scene.overlay().showSelectionWithText(util.select().position(bearingPos.north()), 60) + scene.overlay().showOutlineWithText(util.select().position(bearingPos.north()), 60) .colored(PonderPalette.GREEN) .pointAt(util.vector().blockSurface(bearingPos, Direction.WEST)) .placeNearTarget() @@ -554,11 +550,7 @@ public class BearingScenes { scene.world().rotateBearing(bearingPos, 30, 12); scene.idle(42); - InputWindowElement clickTheBearing = new InputWindowElement(util.vector().topOf(bearingPos), Pointing.DOWN); - InputWindowElement clickTheBearingSide = - new InputWindowElement(util.vector().blockSurface(bearingPos, Direction.WEST), Pointing.LEFT); - - scene.overlay().showControls(clickTheBearing.rightClick(), 60); + scene.overlay().showControls(util.vector().topOf(bearingPos), Pointing.DOWN, 60).rightClick(); scene.idle(7); scene.world().rotateSection(plank, 0, 0, -120, 0); scene.world().rotateBearing(bearingPos, -120, 0); @@ -577,28 +569,28 @@ public class BearingScenes { scene.world().showIndependentSection(util.select().fromTo(3, 3, 1, 3, 5, 2), Direction.SOUTH); scene.world().configureCenterOfRotation(hourHand, util.vector().centerOf(bearingPos)); scene.idle(15); - scene.overlay().showControls(new InputWindowElement(util.vector().centerOf(util.grid().at(3, 4, 1)), Pointing.RIGHT) - .withItem(AllItems.SUPER_GLUE.asStack()), 40); - scene.overlay().showSelectionWithText(util.select().fromTo(3, 3, 1, 3, 4, 2), 80) + scene.overlay().showControls(util.vector().centerOf(util.grid().at(3, 4, 1)), Pointing.RIGHT, 40) + .withItem(AllItems.SUPER_GLUE.asStack()); + scene.overlay().showOutlineWithText(util.select().fromTo(3, 3, 1, 3, 4, 2), 80) .placeNearTarget() .attachKeyFrame() .colored(PonderPalette.GREEN) .sharedText("movement_anchors"); scene.idle(90); - scene.overlay().showControls(clickTheBearingSide.rightClick(), 20); + scene.overlay().showControls(util.vector().blockSurface(bearingPos, Direction.WEST), Pointing.LEFT, 20).rightClick(); scene.idle(7); scene.world().rotateSection(hourHand, 0, 0, 120, 50); scene.world().rotateBearing(bearingPos, 120, 50); scene.idle(60); - scene.overlay().showSelectionWithText(util.select().position(bearingPos.north(3)), 80) + scene.overlay().showOutlineWithText(util.select().position(bearingPos.north(3)), 80) .placeNearTarget() .colored(PonderPalette.BLUE) .attachKeyFrame() .text("In front of the Hour Hand, a second structure can be added"); scene.idle(90); - scene.overlay().showControls(clickTheBearingSide.rightClick(), 20); + scene.overlay().showControls(util.vector().blockSurface(bearingPos, Direction.WEST), Pointing.LEFT, 20).rightClick(); scene.idle(7); scene.world().rotateSection(hourHand, 0, 0, -120, 0); scene.world().rotateBearing(bearingPos, -120, 0); @@ -612,13 +604,13 @@ public class BearingScenes { scene.idle(30); scene.overlay().showOutline(PonderPalette.BLUE, minuteHand, util.select().fromTo(3, 3, 0, 3, 6, 0), 85); - scene.overlay().showSelectionWithText(util.select().fromTo(3, 3, 1, 3, 4, 2), 80) + scene.overlay().showOutlineWithText(util.select().fromTo(3, 3, 1, 3, 4, 2), 80) .placeNearTarget() .colored(PonderPalette.GREEN) .text("Ensure that the two Structures are not glued to each other"); scene.idle(90); - scene.overlay().showControls(clickTheBearingSide.rightClick(), 20); + scene.overlay().showControls(util.vector().blockSurface(bearingPos, Direction.WEST), Pointing.LEFT, 20).rightClick(); scene.idle(7); scene.world().rotateSection(hourHand, 0, 0, 120, 50); @@ -685,7 +677,7 @@ public class BearingScenes { .attachKeyFrame(); scene.idle(80); - scene.overlay().showSelectionWithText(util.select().position(bearingPos.above()), 80) + scene.overlay().showOutlineWithText(util.select().position(bearingPos.above()), 80) .colored(PonderPalette.GREEN) .text("They will attach to blocks and each other without the need of Super Glue or Chassis Blocks") .attachKeyFrame() @@ -701,10 +693,8 @@ public class BearingScenes { scene.world().rotateSection(plank, 0, 180, 0, 0); scene.rotateCameraY(-30); scene.idle(10); - InputWindowElement input = - new InputWindowElement(util.vector().blockSurface(util.grid().at(2, 3, 1), Direction.NORTH), Pointing.RIGHT) - .withItem(new ItemStack(Items.BLUE_DYE)); - scene.overlay().showControls(input, 30); + scene.overlay().showControls(util.vector().blockSurface(util.grid().at(2, 3, 1), Direction.NORTH), Pointing.RIGHT, 30) + .withItem(new ItemStack(Items.BLUE_DYE)); scene.idle(7); scene.world().setBlock(util.grid().at(2, 3, 1), AllBlocks.DYED_SAILS.get(DyeColor.BLUE) .getDefaultState() @@ -717,7 +707,8 @@ public class BearingScenes { .pointAt(util.vector().blockSurface(util.grid().at(2, 3, 1), Direction.WEST)) .placeNearTarget(); scene.idle(20); - scene.overlay().showControls(input, 30); + scene.overlay().showControls(util.vector().blockSurface(util.grid().at(2, 3, 1), Direction.NORTH), Pointing.RIGHT, 30) + .withItem(new ItemStack(Items.BLUE_DYE)); scene.idle(7); scene.world().replaceBlocks(util.select().fromTo(2, 2, 1, 2, 4, 1), AllBlocks.DYED_SAILS.get(DyeColor.BLUE) .getDefaultState() @@ -728,11 +719,8 @@ public class BearingScenes { scene.world().rotateSection(plank, 0, 90, 0, 33); scene.idle(40); - input = - new InputWindowElement(util.vector().blockSurface(util.grid().at(2, 3, 1), Direction.NORTH), Pointing.RIGHT) - .withItem(new ItemStack(Items.SHEARS)); - - scene.overlay().showControls(input, 30); + scene.overlay().showControls(util.vector().blockSurface(util.grid().at(2, 3, 1), Direction.NORTH), Pointing.RIGHT, 30) + .withItem(new ItemStack(Items.SHEARS)); scene.idle(7); scene.world().setBlock(util.grid().at(3, 3, 2), AllBlocks.SAIL_FRAME.getDefaultState() .setValue(SailBlock.FACING, Direction.NORTH), false); @@ -743,7 +731,8 @@ public class BearingScenes { .pointAt(util.vector().blockSurface(util.grid().at(2, 3, 1), Direction.WEST)) .placeNearTarget(); scene.idle(20); - scene.overlay().showControls(input, 30); + scene.overlay().showControls(util.vector().blockSurface(util.grid().at(2, 3, 1), Direction.NORTH), Pointing.RIGHT, 30) + .withItem(new ItemStack(Items.SHEARS)); scene.idle(7); scene.world().replaceBlocks(util.select().fromTo(3, 2, 2, 3, 4, 2), AllBlocks.SAIL_FRAME.getDefaultState() .setValue(SailBlock.FACING, Direction.NORTH), false); diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/BeltScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/BeltScenes.java index 82f070b82b..97e73d9432 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/BeltScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/BeltScenes.java @@ -18,15 +18,15 @@ import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.NBTHelper; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.PonderPalette; +import net.createmod.ponder.api.element.ElementLink; +import net.createmod.ponder.api.element.EntityElement; +import net.createmod.ponder.api.element.ParrotElement; +import net.createmod.ponder.api.element.ParrotPose; +import net.createmod.ponder.api.element.WorldSectionElement; import net.createmod.ponder.api.scene.SceneBuilder; import net.createmod.ponder.api.scene.SceneBuildingUtil; -import net.createmod.ponder.foundation.ElementLink; -import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.Selection; -import net.createmod.ponder.foundation.element.EntityElement; -import net.createmod.ponder.foundation.element.InputWindowElement; -import net.createmod.ponder.foundation.element.ParrotElement; -import net.createmod.ponder.foundation.element.WorldSectionElement; +import net.createmod.ponder.api.scene.Selection; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -66,16 +66,16 @@ public class BeltScenes { .getShape(null, null) .bounds(); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(backEnd), Pointing.DOWN).rightClick() - .withItem(beltItem), 57); + scene.overlay().showControls(util.vector().topOf(backEnd), Pointing.DOWN, 57).rightClick() + .withItem(beltItem); scene.idle(7); scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, backEnd, shaftBB.move(backEnd), 42); scene.overlay().chaseBoundingBoxOutline(PonderPalette.BLACK, backEndCenter, connectBB, 50); scene.idle(20); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(frontEnd), Pointing.DOWN).rightClick() - .withItem(beltItem), 37); + scene.overlay().showControls(util.vector().topOf(frontEnd), Pointing.DOWN, 37).rightClick() + .withItem(beltItem); scene.idle(7); scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, frontEnd, shaftBB.move(frontEnd), 17); @@ -95,8 +95,8 @@ public class BeltScenes { scene.idle(90); Vec3 falseSelection = util.vector().topOf(backEnd.south(1)); - scene.overlay().showControls(new InputWindowElement(falseSelection, Pointing.DOWN).rightClick() - .withItem(beltItem), 37); + scene.overlay().showControls(falseSelection, Pointing.DOWN, 37).rightClick() + .withItem(beltItem); scene.idle(7); scene.overlay().chaseBoundingBoxOutline(PonderPalette.RED, backEnd, shaftBB.move(backEnd.south(1)), 50); @@ -108,14 +108,14 @@ public class BeltScenes { .pointAt(util.vector().centerOf(backEnd.south(1))); scene.idle(43); - scene.overlay().showControls(new InputWindowElement(falseSelection, Pointing.DOWN).rightClick() + scene.overlay().showControls(falseSelection, Pointing.DOWN, 20).rightClick() .withItem(beltItem) - .whileSneaking(), 20); + .whileSneaking(); scene.idle(60); BlockPos shaftLocation = frontEnd.east(); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(shaftLocation), Pointing.DOWN).rightClick() - .withItem(AllBlocks.SHAFT.asStack()), 50); + scene.overlay().showControls(util.vector().topOf(shaftLocation), Pointing.DOWN, 50).rightClick() + .withItem(AllBlocks.SHAFT.asStack()); scene.idle(7); scene.world().modifyBlock(shaftLocation, s -> s.setValue(BeltBlock.PART, BeltPart.PULLEY), true); scene.idle(10); @@ -144,8 +144,8 @@ public class BeltScenes { scene.world().hideSection(attachedShafts, Direction.NORTH); scene.idle(20); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(shaftLocation), Pointing.DOWN).rightClick() - .withItem(AllItems.WRENCH.asStack()), 50); + scene.overlay().showControls(util.vector().topOf(shaftLocation), Pointing.DOWN, 50).rightClick() + .withItem(AllItems.WRENCH.asStack()); scene.idle(7); scene.world().modifyBlock(shaftLocation, s -> s.setValue(BeltBlock.PART, BeltPart.MIDDLE), true); scene.idle(10); @@ -156,9 +156,8 @@ public class BeltScenes { .pointAt(util.vector().blockSurface(shaftLocation, Direction.NORTH)); scene.idle(70); - scene.overlay() - .showControls(new InputWindowElement(util.vector().topOf(shaftLocation.east()), Pointing.DOWN).rightClick() - .withItem(new ItemStack(Items.BLUE_DYE)), 50); + scene.overlay().showControls(util.vector().topOf(shaftLocation.east()), Pointing.DOWN, 50).rightClick() + .withItem(new ItemStack(Items.BLUE_DYE)); scene.idle(7); scene.world().modifyBlockEntityNBT(util.select().fromTo(0, 1, 2, 4, 1, 2), BeltBlockEntity.class, nbt -> NBTHelper.writeEnum(nbt, "Dye", DyeColor.BLUE)); @@ -348,7 +347,7 @@ public class BeltScenes { scene.idle(20); ElementLink parrot = scene.special().createBirb(util.vector().topOf(0, 1, 2) - .add(0, -3 / 16f, 0), ParrotElement.FacePointOfInterestPose::new); + .add(0, -3 / 16f, 0), ParrotPose.FacePointOfInterestPose::new); scene.special().moveParrot(parrot, util.vector().of(1.78, 0, 0), 40); scene.special().movePointOfInterest(util.grid().at(1, 1, 3)); @@ -383,7 +382,7 @@ public class BeltScenes { Vec3 topOf = util.vector().topOf(util.grid().at(3, 2, 2)) .add(-0.1, 0.3, 0); - scene.overlay().showControls(new InputWindowElement(topOf, Pointing.DOWN).rightClick(), 60); + scene.overlay().showControls(topOf, Pointing.DOWN, 60).rightClick(); scene.idle(10); scene.overlay().showText(60) .placeNearTarget() @@ -395,7 +394,7 @@ public class BeltScenes { scene.effects().indicateSuccess(util.grid().at(3, 2, 2)); scene.idle(20); - scene.special().changeBirbPose(parrot, ParrotElement.FaceCursorPose::new); + scene.special().changeBirbPose(parrot, ParrotPose.FaceCursorPose::new); } public static void beltsCanBeEncased(SceneBuilder builder, SceneBuildingUtil util) { @@ -415,14 +414,14 @@ public class BeltScenes { BlockPos beltPos2 = util.grid().at(0, 2, 3); BlockPos beltPos3 = util.grid().at(1, 4, 4); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(beltPos), Pointing.DOWN).rightClick() - .withItem(brassCasingItem), 20); + scene.overlay().showControls(util.vector().topOf(beltPos), Pointing.DOWN, 20).rightClick() + .withItem(brassCasingItem); scene.idle(7); scene.world().modifyBlock(beltPos, s -> s.setValue(BeltBlock.CASING, true), true); scene.idle(20); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(beltPos2), Pointing.DOWN).rightClick() - .withItem(andesiteCasingItem), 20); + scene.overlay().showControls(util.vector().topOf(beltPos2), Pointing.DOWN, 20).rightClick() + .withItem(andesiteCasingItem); scene.idle(7); scene.world().modifyBlock(beltPos2, s -> s.setValue(BeltBlock.CASING, true), true); scene.world().modifyBlockEntityNBT(util.select().position(beltPos2), BeltBlockEntity.class, nbt -> { @@ -430,10 +429,8 @@ public class BeltScenes { }); scene.idle(20); - scene.overlay().showControls( - new InputWindowElement(util.vector().blockSurface(beltPos3, Direction.EAST), Pointing.RIGHT).rightClick() - .withItem(brassCasingItem), - 20); + scene.overlay().showControls(util.vector().blockSurface(beltPos3, Direction.EAST), Pointing.RIGHT, 20).rightClick() + .withItem(brassCasingItem); scene.idle(7); scene.world().modifyBlock(beltPos3, s -> s.setValue(BeltBlock.CASING, true), true); scene.idle(20); @@ -473,9 +470,8 @@ public class BeltScenes { scene.idle(30); scene.addKeyframe(); - scene.overlay() - .showControls(new InputWindowElement(util.vector().topOf(beltPos.south()), Pointing.DOWN).rightClick() - .withItem(AllItems.WRENCH.asStack()), 40); + scene.overlay().showControls(util.vector().topOf(beltPos.south()), Pointing.DOWN, 40).rightClick() + .withItem(AllItems.WRENCH.asStack()); scene.idle(7); scene.world().modifyBlock(beltPos.south(), s -> s.setValue(BeltBlock.CASING, false), true); scene.overlay().showText(80) @@ -502,8 +498,8 @@ public class BeltScenes { .pointAt(topOf); scene.idle(70); - scene.overlay().showControls(new InputWindowElement(topOf, Pointing.DOWN).rightClick() - .withItem(new ItemStack(Items.COPPER_BLOCK)), 20); + scene.overlay().showControls(topOf, Pointing.DOWN, 20).rightClick() + .withItem(new ItemStack(Items.COPPER_BLOCK)); scene.idle(7); scene.world().createItemOnBeltLike(depotPos, Direction.NORTH, new ItemStack(Items.COPPER_BLOCK)); scene.idle(10); @@ -514,7 +510,7 @@ public class BeltScenes { .pointAt(topOf); scene.idle(80); - scene.overlay().showControls(new InputWindowElement(topOf, Pointing.DOWN).rightClick(), 20); + scene.overlay().showControls(topOf, Pointing.DOWN, 20).rightClick(); scene.idle(7); scene.world().removeItemsFromBelt(depotPos); scene.effects().indicateSuccess(depotPos); diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/CartAssemblerScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/CartAssemblerScenes.java index e4873fe0a6..cd127c0056 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/CartAssemblerScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/CartAssemblerScenes.java @@ -7,16 +7,15 @@ import com.simibubi.create.content.contraptions.mounted.CartAssemblerBlock; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.ParticleEmitter; +import net.createmod.ponder.api.PonderPalette; +import net.createmod.ponder.api.element.ElementLink; +import net.createmod.ponder.api.element.EntityElement; +import net.createmod.ponder.api.element.WorldSectionElement; import net.createmod.ponder.api.scene.SceneBuilder; import net.createmod.ponder.api.scene.SceneBuildingUtil; -import net.createmod.ponder.foundation.ElementLink; -import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.Selection; -import net.createmod.ponder.foundation.element.EntityElement; -import net.createmod.ponder.foundation.element.InputWindowElement; +import net.createmod.ponder.api.scene.Selection; import net.createmod.ponder.foundation.element.MinecartElement; -import net.createmod.ponder.foundation.element.WorldSectionElement; -import net.createmod.ponder.foundation.instruction.EmitParticlesInstruction.Emitter; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.particles.ParticleTypes; @@ -52,9 +51,8 @@ public class CartAssemblerScenes { scene.idle(10); - scene.overlay() - .showControls(new InputWindowElement(util.vector().centerOf(assemblerPos), Pointing.DOWN).rightClick() - .withItem(AllBlocks.CART_ASSEMBLER.asStack()), 30); + scene.overlay().showControls(util.vector().centerOf(assemblerPos), Pointing.DOWN, 30).rightClick() + .withItem(AllBlocks.CART_ASSEMBLER.asStack()); scene.idle(7); scene.world().setBlock(assemblerPos, AllBlocks.CART_ASSEMBLER.getDefaultState() .setValue(CartAssemblerBlock.RAIL_SHAPE, RailShape.NORTH_SOUTH) @@ -126,8 +124,8 @@ public class CartAssemblerScenes { scene.overlay().showOutline(PonderPalette.GREEN, "glue", util.select().position(1, 3, 2) .add(util.select().fromTo(3, 2, 2, 1, 2, 2)) .add(util.select().position(3, 2, 1)), 40); - scene.overlay().showControls(new InputWindowElement(util.vector().centerOf(util.grid().at(3, 2, 2)), Pointing.RIGHT) - .withItem(AllItems.SUPER_GLUE.asStack()), 40); + scene.overlay().showControls(util.vector().centerOf(util.grid().at(3, 2, 2)), Pointing.RIGHT, 40) + .withItem(AllItems.SUPER_GLUE.asStack()); scene.effects().superGlue(util.grid().at(3, 2, 1), Direction.SOUTH, true); scene.overlay().showText(80) @@ -149,8 +147,8 @@ public class CartAssemblerScenes { scene.idle(25); Vec3 cartCenter = util.vector().centerOf(assemblerPos.north(2)); - scene.overlay().showControls(new InputWindowElement(cartCenter, Pointing.LEFT).rightClick() - .withItem(AllItems.WRENCH.asStack()), 40); + scene.overlay().showControls(cartCenter, Pointing.LEFT, 40).rightClick() + .withItem(AllItems.WRENCH.asStack()); scene.idle(7); scene.special().moveCart(cart, util.vector().of(0, -100, 4), 0); scene.world().moveSection(anchor, util.vector().of(0, -100, 4), 0); @@ -167,8 +165,8 @@ public class CartAssemblerScenes { scene.idle(80); scene.world().modifyEntity(itemEntity, Entity::discard); - scene.overlay().showControls(new InputWindowElement(cartCenter.add(0, 0, 4), Pointing.DOWN).rightClick() - .withItem(asStack), 20); + scene.overlay().showControls(cartCenter.add(0, 0, 4), Pointing.DOWN, 20).rightClick() + .withItem(asStack); scene.idle(20); scene.special().moveCart(cart, util.vector().of(0, 100.5, 0), 0); scene.world().moveSection(anchor, util.vector().of(0, 100.5, 0), 0); @@ -261,7 +259,7 @@ public class CartAssemblerScenes { Vec3 blockSurface = util.vector().blockSurface(assemblerPos, Direction.NORTH) .add(0, -1 / 16f, -2 / 16f); scene.overlay().showFilterSlotInput(blockSurface, Direction.NORTH, 60); - scene.overlay().showControls(new InputWindowElement(blockSurface, Pointing.DOWN).rightClick(), 60); + scene.overlay().showControls(blockSurface, Pointing.DOWN, 60).rightClick(); scene.idle(10); scene.overlay().showText(60) .pointAt(util.vector().of(3, 1.5, 3)) @@ -344,7 +342,7 @@ public class CartAssemblerScenes { ElementLink contraption = scene.world().showIndependentSection(chassis, Direction.DOWN); scene.idle(15); scene.overlay().showOutline(PonderPalette.GREEN, new Object(), util.select().position(assembler2), 60); - scene.overlay().showSelectionWithText(util.select().position(assembler1), 60) + scene.overlay().showOutlineWithText(util.select().position(assembler1), 60) .colored(PonderPalette.GREEN) .pointAt(util.vector().blockSurface(util.grid().at(2, 2, 4), Direction.NORTH)) .placeNearTarget() @@ -464,8 +462,8 @@ public class CartAssemblerScenes { scene.world().moveSection(anchor, util.vector().of(0, -3, 0), 0); scene.idle(30); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(assembler), Pointing.DOWN) - .withItem(new ItemStack(Items.POWERED_RAIL)), 50); + scene.overlay().showControls(util.vector().topOf(assembler), Pointing.DOWN, 50) + .withItem(new ItemStack(Items.POWERED_RAIL)); scene.idle(7); scene.world().setBlock(assembler, AllBlocks.CART_ASSEMBLER.getDefaultState() .setValue(CartAssemblerBlock.RAIL_SHAPE, RailShape.EAST_WEST) @@ -520,8 +518,8 @@ public class CartAssemblerScenes { scene.world().glueBlockOnto(assembler.above(2), Direction.DOWN, contraption); scene.idle(15); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(assembler.above()), Pointing.UP) - .withItem(new ItemStack(Items.CHARCOAL)), 40); + scene.overlay().showControls(util.vector().topOf(assembler.above()), Pointing.UP, 40) + .withItem(new ItemStack(Items.CHARCOAL)); scene.idle(7); scene.overlay().showText(80) .pointAt(util.vector().blockSurface(assembler.above(2), Direction.WEST)) @@ -529,7 +527,7 @@ public class CartAssemblerScenes { .text("Furnace Carts will keep themselves powered, pulling fuel from any attached inventories"); scene.idle(85); - Emitter smoke = Emitter.simple(ParticleTypes.LARGE_SMOKE, util.vector().of(0, 0, 0)); + ParticleEmitter smoke = scene.effects().simpleParticleEmitter(ParticleTypes.LARGE_SMOKE, util.vector().of(0, 0, 0)); scene.special().moveCart(cart, util.vector().of(-5, 0, 0), 50); scene.idle(20); diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ChainDriveScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ChainDriveScenes.java index 3b1584dd78..45fcb27292 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ChainDriveScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ChainDriveScenes.java @@ -6,14 +6,13 @@ import com.simibubi.create.content.redstone.analogLever.AnalogLeverBlockEntity; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.PonderPalette; +import net.createmod.ponder.api.element.ElementLink; +import net.createmod.ponder.api.element.TextElementBuilder; +import net.createmod.ponder.api.element.WorldSectionElement; import net.createmod.ponder.api.scene.SceneBuilder; import net.createmod.ponder.api.scene.SceneBuildingUtil; -import net.createmod.ponder.foundation.ElementLink; -import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.Selection; -import net.createmod.ponder.foundation.element.InputWindowElement; -import net.createmod.ponder.foundation.element.TextWindowElement.Builder; -import net.createmod.ponder.foundation.element.WorldSectionElement; +import net.createmod.ponder.api.scene.Selection; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -78,8 +77,8 @@ public class ChainDriveScenes { scene.idle(25); scene.addKeyframe(); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(rotatedECD), Pointing.DOWN).rightClick() - .withItem(AllItems.WRENCH.asStack()), 30); + scene.overlay().showControls(util.vector().topOf(rotatedECD), Pointing.DOWN, 30).rightClick() + .withItem(AllItems.WRENCH.asStack()); scene.idle(7); scene.world().modifyBlock(rotatedECD, s -> s.setValue(ChainDriveBlock.AXIS, Axis.Y), true); scene.idle(40); @@ -240,9 +239,7 @@ public class ChainDriveScenes { scene.world().showSection(util.select().fromTo(analogPos, analogPos.south()), Direction.DOWN); scene.idle(15); - scene.world().modifyBlockEntityNBT(util.select().position(analogPos), AnalogLeverBlockEntity.class, nbt -> { - nbt.putInt("State", 8); - }); + scene.world().modifyBlockEntityNBT(util.select().position(analogPos), AnalogLeverBlockEntity.class, nbt -> nbt.putInt("State", 8)); scene.world().modifyBlock(analogPos.south(), s -> s.setValue(RedStoneWireBlock.POWER, 8), false); scene.world().toggleRedstonePower(util.select().position(1, 1, 4)); scene.world().modifyKineticSpeed(util.select().position(westGauge), f -> .75f * f); @@ -259,7 +256,7 @@ public class ChainDriveScenes { for (BlockPos gauge : new BlockPos[] { eastGauge, middleGauge, westGauge }) { scene.idle(5); - Builder textBuilder = scene.overlay().showText(180) + TextElementBuilder textBuilder = scene.overlay().showText(180) .colored(gauge == westGauge ? PonderPalette.SLOW : PonderPalette.MEDIUM) .placeNearTarget() .pointAt(util.vector().blockSurface(gauge, Direction.NORTH)); diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ChassisScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ChassisScenes.java index 8678761706..0db35ab9dc 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ChassisScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ChassisScenes.java @@ -8,13 +8,12 @@ import com.simibubi.create.content.contraptions.chassis.RadialChassisBlock; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.PonderPalette; +import net.createmod.ponder.api.element.ElementLink; +import net.createmod.ponder.api.element.WorldSectionElement; import net.createmod.ponder.api.scene.SceneBuilder; import net.createmod.ponder.api.scene.SceneBuildingUtil; -import net.createmod.ponder.foundation.ElementLink; -import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.Selection; -import net.createmod.ponder.foundation.element.InputWindowElement; -import net.createmod.ponder.foundation.element.WorldSectionElement; +import net.createmod.ponder.api.scene.Selection; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.item.ItemStack; @@ -80,7 +79,7 @@ public class ChassisScenes { scene.world().showSection(wrong1, Direction.DOWN); scene.idle(10); scene.overlay().showOutline(PonderPalette.RED, wrong2, wrong2, 80); - scene.overlay().showSelectionWithText(wrong1, 80) + scene.overlay().showOutlineWithText(wrong1, 80) .colored(PonderPalette.RED) .placeNearTarget() .text("Chassis of a different type or facing another direction will not attach"); @@ -106,10 +105,8 @@ public class ChassisScenes { scene.world().showSection(chassis, Direction.DOWN); scene.idle(10); - InputWindowElement input = - new InputWindowElement(util.vector().blockSurface(chassisPos, Direction.WEST), Pointing.LEFT).rightClick() - .withItem(new ItemStack(Items.SLIME_BALL)); - scene.overlay().showControls(input, 30); + scene.overlay().showControls(util.vector().blockSurface(chassisPos, Direction.WEST), Pointing.LEFT, 30).rightClick() + .withItem(new ItemStack(Items.SLIME_BALL)); scene.idle(7); scene.world().modifyBlock(chassisPos, s -> s.setValue(LinearChassisBlock.STICKY_BOTTOM, true), false); scene.effects().superGlue(chassisPos, Direction.WEST, false); @@ -121,7 +118,8 @@ public class ChassisScenes { .pointAt(util.vector().blockSurface(chassisPos, Direction.WEST)); scene.idle(70); - scene.overlay().showControls(input, 15); + scene.overlay().showControls(util.vector().blockSurface(chassisPos, Direction.WEST), Pointing.LEFT, 15).rightClick() + .withItem(new ItemStack(Items.SLIME_BALL)); scene.idle(7); scene.world().modifyBlock(chassisPos, s -> s.setValue(LinearChassisBlock.STICKY_TOP, true), false); scene.effects().superGlue(chassisPos, Direction.EAST, false); @@ -137,10 +135,8 @@ public class ChassisScenes { scene.rotateCameraY(-60); scene.idle(25); - scene.overlay().showControls( - new InputWindowElement(util.vector().blockSurface(chassisPos, Direction.WEST), Pointing.LEFT).rightClick() - .whileSneaking(), - 30); + scene.overlay().showControls(util.vector().blockSurface(chassisPos, Direction.WEST), Pointing.LEFT, 30).rightClick() + .whileSneaking(); scene.idle(7); scene.world().modifyBlock(chassisPos, s -> s.setValue(LinearChassisBlock.STICKY_BOTTOM, false), false); scene.effects().superGlue(chassisPos, Direction.WEST, false); @@ -170,7 +166,7 @@ public class ChassisScenes { Selection column2 = util.select().fromTo(2, 3, 2, 2, 4, 2); Selection column3 = util.select().fromTo(2, 3, 2, 2, 5, 2); - scene.overlay().showSelectionWithText(column3, 80) + scene.overlay().showOutlineWithText(column3, 80) .colored(PonderPalette.GREEN) .text("Stickied faces of the Linear Chassis will attach a line of blocks in front of it") .placeNearTarget(); @@ -185,8 +181,8 @@ public class ChassisScenes { Vec3 blockSurface = util.vector().blockSurface(chassisPos, Direction.NORTH); scene.overlay().showCenteredScrollInput(chassisPos, Direction.NORTH, 50); - scene.overlay().showControls(new InputWindowElement(blockSurface, Pointing.UP).rightClick() - .withItem(AllItems.WRENCH.asStack()), 50); + scene.overlay().showControls(blockSurface, Pointing.UP, 50).rightClick() + .withItem(AllItems.WRENCH.asStack()); scene.idle(10); scene.overlay().showOutline(PonderPalette.WHITE, chassis, column3, 20); @@ -217,9 +213,9 @@ public class ChassisScenes { scene.idle(20); scene.overlay().showCenteredScrollInput(chassisPos, Direction.NORTH, 50); - scene.overlay().showControls(new InputWindowElement(blockSurface, Pointing.UP).whileCTRL() + scene.overlay().showControls(blockSurface, Pointing.UP, 50).whileCTRL() .rightClick() - .withItem(AllItems.WRENCH.asStack()), 50); + .withItem(AllItems.WRENCH.asStack()); column1 = util.select().fromTo(1, 3, 2, 3, 3, 2); column2 = util.select().fromTo(1, 3, 2, 3, 4, 2); @@ -253,8 +249,8 @@ public class ChassisScenes { .text("Attaching blocks to any other side requires the use of Super Glue") .placeNearTarget(); scene.idle(90); - scene.overlay().showControls(new InputWindowElement(glueSurface, Pointing.DOWN).rightClick() - .withItem(AllItems.SUPER_GLUE.asStack()), 30); + scene.overlay().showControls(glueSurface, Pointing.DOWN, 30).rightClick() + .withItem(AllItems.SUPER_GLUE.asStack()); scene.idle(7); scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, glueSurface, new AABB(util.grid().at(1, 2, 2)).expandTowards(0, 0, -1), 40); @@ -340,10 +336,8 @@ public class ChassisScenes { scene.idle(15); scene.addKeyframe(); - InputWindowElement input = - new InputWindowElement(util.vector().blockSurface(chassisPos, Direction.WEST), Pointing.LEFT).rightClick() - .withItem(new ItemStack(Items.SLIME_BALL)); - scene.overlay().showControls(input, 30); + scene.overlay().showControls(util.vector().blockSurface(chassisPos, Direction.WEST), Pointing.LEFT, 30).rightClick() + .withItem(new ItemStack(Items.SLIME_BALL)); scene.idle(7); scene.world().modifyBlock(chassisPos, s -> s.setValue(RadialChassisBlock.STICKY_WEST, true), false); scene.effects().superGlue(chassisPos, Direction.WEST, false); @@ -355,7 +349,8 @@ public class ChassisScenes { .pointAt(util.vector().blockSurface(chassisPos, Direction.WEST)); scene.idle(70); - scene.overlay().showControls(input, 15); + scene.overlay().showControls(util.vector().blockSurface(chassisPos, Direction.WEST), Pointing.LEFT, 15).rightClick() + .withItem(new ItemStack(Items.SLIME_BALL)); scene.idle(7); scene.world().modifyBlock(chassisPos, s -> s.setValue(RadialChassisBlock.STICKY_EAST, true) .setValue(RadialChassisBlock.STICKY_NORTH, true) @@ -375,10 +370,8 @@ public class ChassisScenes { scene.rotateCameraY(-60); scene.idle(25); - scene.overlay().showControls( - new InputWindowElement(util.vector().blockSurface(chassisPos, Direction.WEST), Pointing.LEFT).rightClick() - .whileSneaking(), - 30); + scene.overlay().showControls(util.vector().blockSurface(chassisPos, Direction.WEST), Pointing.LEFT, 30).rightClick() + .whileSneaking(); scene.idle(7); scene.world().modifyBlock(chassisPos, s -> s.setValue(RadialChassisBlock.STICKY_WEST, false), false); scene.effects().superGlue(chassisPos, Direction.WEST, false); @@ -431,7 +424,7 @@ public class ChassisScenes { obj.setValue(add); }); - scene.overlay().showSelectionWithText(obj.getValue(), 60) + scene.overlay().showOutlineWithText(obj.getValue(), 60) .colored(PonderPalette.GREEN) .text("...it will attach all reachable blocks within a radius on that layer"); scene.idle(70); @@ -445,8 +438,8 @@ public class ChassisScenes { scene.addKeyframe(); blockSurface = util.vector().topOf(chassisPos); scene.overlay().showCenteredScrollInput(chassisPos, Direction.UP, 50); - scene.overlay().showControls(new InputWindowElement(blockSurface, Pointing.DOWN).rightClick() - .withItem(AllItems.WRENCH.asStack()), 50); + scene.overlay().showControls(blockSurface, Pointing.DOWN, 50).rightClick() + .withItem(AllItems.WRENCH.asStack()); scene.idle(10); scene.overlay().showOutline(PonderPalette.WHITE, chassis, r2, 20); @@ -482,7 +475,7 @@ public class ChassisScenes { scene.overlay().showOutline(PonderPalette.GREEN, r2, r2.copy() .substract(util.select().fromTo(0, 2, 0, 1, 2, 4)), 80); scene.markAsFinished(); - scene.overlay().showSelectionWithText(ignored, 80) + scene.overlay().showOutlineWithText(ignored, 80) .colored(PonderPalette.RED) .text("Blocks not reachable by any sticky face will not attach"); } @@ -519,19 +512,15 @@ public class ChassisScenes { .pointAt(util.vector().topOf(util.grid().at(2, 1, 2))); scene.idle(70); - scene.overlay().showControls( - new InputWindowElement(util.vector().topOf(2, 2, 3), Pointing.DOWN).withItem(AllItems.SUPER_GLUE.asStack()) - .rightClick(), - 40); + scene.overlay().showControls(util.vector().topOf(2, 2, 3), Pointing.DOWN, 40).withItem(AllItems.SUPER_GLUE.asStack()) + .rightClick(); scene.idle(6); scene.effects().indicateSuccess(util.grid().at(2, 2, 3)); scene.idle(45); - scene.overlay().showControls( - new InputWindowElement(util.vector().blockSurface(util.grid().at(1, 1, 2), Direction.DOWN), Pointing.UP) + scene.overlay().showControls(util.vector().blockSurface(util.grid().at(1, 1, 2), Direction.DOWN), Pointing.UP, 40) .withItem(AllItems.SUPER_GLUE.asStack()) - .rightClick(), - 40); + .rightClick(); scene.idle(6); AABB bb = new AABB(util.grid().at(2, 2, 3)); @@ -559,16 +548,14 @@ public class ChassisScenes { .pointAt(util.vector().blockSurface(util.grid().at(3, 1, 1), Direction.WEST)); scene.idle(40); - scene.overlay().showControls( - new InputWindowElement(util.vector().blockSurface(util.grid().at(3, 1, 1), Direction.UP), Pointing.DOWN) + scene.overlay().showControls(util.vector().blockSurface(util.grid().at(3, 1, 1), Direction.UP), Pointing.DOWN, 40) .withItem(AllItems.SUPER_GLUE.asStack()) - .leftClick(), - 40); + .leftClick(); scene.idle(50); Selection toMove = util.select().fromTo(1, 1, 2, 2, 1, 2) .add(util.select().fromTo(2, 2, 3, 2, 1, 3)); - scene.overlay().showSelectionWithText(toMove, 70) + scene.overlay().showOutlineWithText(toMove, 70) .text("Adjacent blocks sharing an area will pull each other along") .placeNearTarget() .attachKeyFrame() diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ChuteScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ChuteScenes.java index 4c0e064a2e..91104d6c79 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ChuteScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ChuteScenes.java @@ -10,14 +10,13 @@ import com.simibubi.create.content.logistics.chute.SmartChuteBlockEntity; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.PonderPalette; +import net.createmod.ponder.api.element.ElementLink; +import net.createmod.ponder.api.element.EntityElement; +import net.createmod.ponder.api.element.WorldSectionElement; import net.createmod.ponder.api.scene.SceneBuilder; import net.createmod.ponder.api.scene.SceneBuildingUtil; -import net.createmod.ponder.foundation.ElementLink; -import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.Selection; -import net.createmod.ponder.foundation.element.EntityElement; -import net.createmod.ponder.foundation.element.InputWindowElement; -import net.createmod.ponder.foundation.element.WorldSectionElement; +import net.createmod.ponder.api.scene.Selection; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.entity.Entity; @@ -62,11 +61,9 @@ public class ChuteScenes { scene.world().moveSection(bottom, util.vector().of(1, 0, 0), 10); scene.world().moveSection(top, util.vector().of(-1, 0, 0), 10); scene.idle(20); - scene.overlay().showControls( - new InputWindowElement(util.vector().blockSurface(util.grid().at(2, 3, 2), Direction.NORTH), Pointing.RIGHT) + scene.overlay().showControls(util.vector().blockSurface(util.grid().at(2, 3, 2), Direction.NORTH), Pointing.RIGHT, 40) .rightClick() - .withItem(AllItems.WRENCH.asStack()), - 40); + .withItem(AllItems.WRENCH.asStack()); scene.idle(7); scene.world().modifyBlock(util.grid().at(3, 3, 3), s -> s.setValue(ChuteBlock.SHAPE, ChuteBlock.Shape.WINDOW), false); @@ -77,11 +74,9 @@ public class ChuteScenes { .text("Using the Wrench, a window can be created"); scene.idle(60); - scene.overlay().showControls( - new InputWindowElement(util.vector().blockSurface(util.grid().at(2, 2, 2), Direction.NORTH), Pointing.RIGHT) + scene.overlay().showControls(util.vector().blockSurface(util.grid().at(2, 2, 2), Direction.NORTH), Pointing.RIGHT, 40) .rightClick() - .withItem(AllBlocks.INDUSTRIAL_IRON_BLOCK.asStack()), - 40); + .withItem(AllBlocks.INDUSTRIAL_IRON_BLOCK.asStack()); scene.idle(7); scene.world().modifyBlock(util.grid().at(3, 2, 3), s -> s.setValue(ChuteBlock.SHAPE, ChuteBlock.Shape.ENCASED), false); @@ -108,21 +103,17 @@ public class ChuteScenes { scene.world().showSection(util.select().fromTo(2, 1, 1, 2, 2, 1), Direction.DOWN); scene.idle(30); ItemStack chuteItem = AllBlocks.CHUTE.asStack(); - scene.overlay().showControls( - new InputWindowElement(util.vector().blockSurface(util.grid().at(2, 2, 1), Direction.SOUTH), Pointing.LEFT) + scene.overlay().showControls(util.vector().blockSurface(util.grid().at(2, 2, 1), Direction.SOUTH), Pointing.LEFT, 30) .rightClick() - .withItem(chuteItem), - 30); + .withItem(chuteItem); scene.idle(7); scene.world().showSection(util.select().position(2, 3, 2), Direction.NORTH); scene.world().restoreBlocks(util.select().position(2, 2, 1)); scene.idle(15); scene.idle(20); - scene.overlay().showControls( - new InputWindowElement(util.vector().blockSurface(util.grid().at(2, 3, 2), Direction.SOUTH), Pointing.LEFT) + scene.overlay().showControls(util.vector().blockSurface(util.grid().at(2, 3, 2), Direction.SOUTH), Pointing.LEFT, 30) .rightClick() - .withItem(chuteItem), - 30); + .withItem(chuteItem); scene.idle(7); scene.world().showSection(util.select().position(2, 4, 3), Direction.NORTH); scene.idle(10); @@ -154,10 +145,8 @@ public class ChuteScenes { } scene.idle(10); - scene.overlay().showControls( - new InputWindowElement(util.vector().blockSurface(util.grid().at(2, 1, 1), Direction.NORTH), Pointing.RIGHT) - .withItem(stack), - 50); + scene.overlay().showControls(util.vector().blockSurface(util.grid().at(2, 1, 1), Direction.NORTH), Pointing.RIGHT, 50) + .withItem(stack); scene.markAsFinished(); } @@ -183,10 +172,8 @@ public class ChuteScenes { .pointAt(surface) .placeNearTarget(); scene.idle(80); - scene.overlay().showControls( - new InputWindowElement(util.vector().blockSurface(util.grid().at(1, 2, 2), Direction.NORTH), Pointing.RIGHT) - .withItem(AllItems.GOGGLES.asStack()), - 50); + scene.overlay().showControls(util.vector().blockSurface(util.grid().at(1, 2, 2), Direction.NORTH), Pointing.RIGHT, 50) + .withItem(AllItems.GOGGLES.asStack()); scene.overlay().showText(70) .text("Inspecting chutes with Engineers' Goggles reveals information about the movement direction") .attachKeyFrame() @@ -250,8 +237,8 @@ public class ChuteScenes { scene.idle(15); ItemStack copper = new ItemStack(Items.IRON_INGOT); - scene.overlay().showControls(new InputWindowElement(filter.add(0, 0.125, 0), Pointing.DOWN).rightClick() - .withItem(copper), 40); + scene.overlay().showControls(filter.add(0, 0.125, 0), Pointing.DOWN, 40).rightClick() + .withItem(copper); scene.idle(7); scene.world().setFilterData(util.select().position(smarty), SmartChuteBlockEntity.class, copper); @@ -260,8 +247,7 @@ public class ChuteScenes { scene.world().createItemOnBeltLike(util.grid().at(2, 2, 2), Direction.UP, copper); if (i == 8) { scene.rotateCameraY(-20); - scene.overlay().showControls(new InputWindowElement(filter.add(0, 0.125, 0), Pointing.DOWN).rightClick(), - 40); + scene.overlay().showControls(filter.add(0, 0.125, 0), Pointing.DOWN, 40).rightClick(); scene.overlay().showText(50) .text("Use the value panel to specify the extracted stack size") .attachKeyFrame() diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/CrafterScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/CrafterScenes.java index 0e6ff8b57f..507511dcaa 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/CrafterScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/CrafterScenes.java @@ -10,13 +10,12 @@ import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Couple; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.PonderPalette; +import net.createmod.ponder.api.element.ElementLink; +import net.createmod.ponder.api.element.EntityElement; import net.createmod.ponder.api.scene.SceneBuilder; import net.createmod.ponder.api.scene.SceneBuildingUtil; -import net.createmod.ponder.foundation.ElementLink; -import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.Selection; -import net.createmod.ponder.foundation.element.EntityElement; -import net.createmod.ponder.foundation.element.InputWindowElement; +import net.createmod.ponder.api.scene.Selection; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.entity.Entity; @@ -58,11 +57,9 @@ public class CrafterScenes { .placeNearTarget(); scene.idle(80); - scene.overlay().showControls( - new InputWindowElement(util.vector().blockSurface(util.grid().at(2, 3, 2), Direction.NORTH), Pointing.RIGHT) + scene.overlay().showControls(util.vector().blockSurface(util.grid().at(2, 3, 2), Direction.NORTH), Pointing.RIGHT, 40) .rightClick() - .withItem(AllItems.WRENCH.asStack()), - 40); + .withItem(AllItems.WRENCH.asStack()); scene.idle(7); scene.world().cycleBlockProperty(util.grid().at(2, 3, 2), MechanicalCrafterBlock.POINTING); scene.idle(10); @@ -76,10 +73,8 @@ public class CrafterScenes { BlockPos[] positions = new BlockPos[] { util.grid().at(3, 1, 2), util.grid().at(2, 1, 2), util.grid().at(1, 1, 2) }; for (BlockPos pos : positions) { - scene.overlay().showControls( - new InputWindowElement(util.vector().blockSurface(pos, Direction.NORTH), Pointing.RIGHT).rightClick() - .withItem(AllItems.WRENCH.asStack()), - 10); + scene.overlay().showControls(util.vector().blockSurface(pos, Direction.NORTH), Pointing.RIGHT, 10).rightClick() + .withItem(AllItems.WRENCH.asStack()); scene.idle(7); scene.world().cycleBlockProperty(pos, MechanicalCrafterBlock.POINTING); scene.idle(15); @@ -145,11 +140,9 @@ public class CrafterScenes { scene.idle(40); ItemStack planks = new ItemStack(Items.OAK_PLANKS); - scene.overlay().showControls( - new InputWindowElement(util.vector().blockSurface(util.grid().at(1, 3, 2), Direction.NORTH), Pointing.RIGHT) + scene.overlay().showControls(util.vector().blockSurface(util.grid().at(1, 3, 2), Direction.NORTH), Pointing.RIGHT, 40) .rightClick() - .withItem(planks), - 40); + .withItem(planks); scene.idle(7); Class type = MechanicalCrafterBlockEntity.class; scene.world().modifyBlockEntity(util.grid().at(1, 3, 2), type, mct -> mct.getInventory() @@ -272,7 +265,7 @@ public class CrafterScenes { scene.world().removeItemsFromBelt(util.grid().at(3, 1, 2)); scene.world().flapFunnel(util.grid().at(3, 2, 2), false); - scene.overlay().showSelectionWithText(util.select().position(2, 2, 2), 70) + scene.overlay().showOutlineWithText(util.select().position(2, 2, 2), 70) .attachKeyFrame() .placeNearTarget() .pointAt(util.vector().blockSurface(util.grid().at(2, 2, 2), Direction.NORTH)) @@ -287,47 +280,46 @@ public class CrafterScenes { v = v.add(0, 0, .5); scene.overlay().chaseBoundingBoxOutline(PonderPalette.WHITE, new Object(), bb, 45); - scene.overlay().showControls(new InputWindowElement(v, Pointing.LEFT).rightClick() - .withItem(AllItems.WRENCH.asStack()), 40); + scene.overlay().showControls(v, Pointing.LEFT, 40).rightClick() + .withItem(AllItems.WRENCH.asStack()); scene.idle(7); scene.world().connectCrafterInvs(util.grid().at(2, 2, 2), util.grid().at(1, 2, 2)); scene.idle(40); - scene.overlay().showSelectionWithText(util.select().fromTo(2, 2, 2, 1, 2, 2), 70) + scene.overlay().showOutlineWithText(util.select().fromTo(2, 2, 2, 1, 2, 2), 70) .attachKeyFrame() .placeNearTarget() .pointAt(v) .text("Using the Wrench at their backs, Mechanical Crafter inputs can be combined"); scene.idle(80); - scene.overlay().showControls(new InputWindowElement(v.add(0, 1, 0), Pointing.LEFT).rightClick() - .withItem(AllItems.WRENCH.asStack()), 20); + scene.overlay().showControls(v.add(0, 1, 0), Pointing.LEFT, 20).rightClick() + .withItem(AllItems.WRENCH.asStack()); scene.idle(7); scene.world().connectCrafterInvs(util.grid().at(2, 3, 2), util.grid().at(1, 3, 2)); scene.idle(20); - scene.overlay().showControls(new InputWindowElement(v.add(0, -1, 0), Pointing.LEFT).rightClick() - .withItem(AllItems.WRENCH.asStack()), 20); + scene.overlay().showControls(v.add(0, -1, 0), Pointing.LEFT, 20).rightClick() + .withItem(AllItems.WRENCH.asStack()); scene.idle(7); scene.world().connectCrafterInvs(util.grid().at(2, 1, 2), util.grid().at(1, 1, 2)); scene.idle(20); - scene.overlay().showControls(new InputWindowElement(v.add(.5, -.5, 0), Pointing.LEFT).rightClick() - .withItem(AllItems.WRENCH.asStack()), 20); + scene.overlay().showControls(v.add(.5, -.5, 0), Pointing.LEFT, 20).rightClick() + .withItem(AllItems.WRENCH.asStack()); scene.idle(7); scene.world().connectCrafterInvs(util.grid().at(2, 1, 2), util.grid().at(2, 2, 2)); scene.idle(10); - scene.overlay().showControls(new InputWindowElement(v.add(.5, .5, 0), Pointing.LEFT).rightClick() - .withItem(AllItems.WRENCH.asStack()), 20); + scene.overlay().showControls(v.add(.5, .5, 0), Pointing.LEFT, 20).rightClick() + .withItem(AllItems.WRENCH.asStack()); scene.idle(7); scene.world().connectCrafterInvs(util.grid().at(2, 2, 2), util.grid().at(2, 3, 2)); scene.idle(20); scene.rotateCameraY(90 + 30); scene.idle(40); - scene.overlay().showSelectionWithText(util.select().fromTo(1, 1, 2, 2, 3, 2), 70) + scene.overlay().showOutlineWithText(util.select().fromTo(1, 1, 2, 2, 3, 2), 70) .attachKeyFrame() .placeNearTarget() .text("All connected Crafters can now be accessed by the same input location"); scene.idle(60); - scene.overlay().showControls( - new InputWindowElement(util.vector().centerOf(util.grid().at(4, 2, 2)), Pointing.DOWN).withItem(planks), 40); + scene.overlay().showControls(util.vector().centerOf(util.grid().at(4, 2, 2)), Pointing.DOWN, 40).withItem(planks); scene.idle(7); scene.world().createItemOnBelt(util.grid().at(4, 1, 2), Direction.EAST, ItemHandlerHelper.copyStackWithSize(planks, 16)); @@ -378,7 +370,7 @@ public class CrafterScenes { scene.idle(5); Selection emptyCrafter = util.select().position(2, 2, 2); - scene.overlay().showSelectionWithText(emptyCrafter, 90) + scene.overlay().showOutlineWithText(emptyCrafter, 90) .attachKeyFrame() .colored(PonderPalette.RED) .text("Some recipes will require additional Crafters to bridge gaps in the path") @@ -404,19 +396,14 @@ public class CrafterScenes { .text("Using Slot Covers, Crafters can be set to act as an Empty Slot in the arrangement") .placeNearTarget(); scene.idle(100); - scene.overlay() - .showControls(new InputWindowElement(util.vector().blockSurface(util.grid().at(2, 2, 2), Direction.NORTH) - .add(0.5, 0, 0), Pointing.RIGHT).withItem(AllItems.CRAFTER_SLOT_COVER.asStack()) - .rightClick(), - 50); + scene.overlay().showControls(util.vector().blockSurface(util.grid().at(2, 2, 2), Direction.NORTH).add(0.5, 0, 0), Pointing.RIGHT, 50).withItem(AllItems.CRAFTER_SLOT_COVER.asStack()) + .rightClick(); scene.idle(7); scene.world().modifyBlockEntityNBT(emptyCrafter, type, compound -> compound.putBoolean("Cover", true)); scene.idle(130); - scene.overlay().showControls( - new InputWindowElement(util.vector().blockSurface(util.grid().at(2, 3, 2), Direction.WEST), Pointing.LEFT) - .withItem(new ItemStack(Items.BUCKET)), - 40); + scene.overlay().showControls(util.vector().blockSurface(util.grid().at(2, 3, 2), Direction.WEST), Pointing.LEFT, 40) + .withItem(new ItemStack(Items.BUCKET)); scene.idle(50); scene.world().showSection(util.select().position(4, 2, 2), Direction.DOWN); @@ -427,7 +414,7 @@ public class CrafterScenes { scene.world().connectCrafterInvs(util.grid().at(1, 2, 2), util.grid().at(2, 2, 2)); scene.idle(10); - scene.overlay().showSelectionWithText(util.select().fromTo(3, 2, 2, 1, 2, 2) + scene.overlay().showOutlineWithText(util.select().fromTo(3, 2, 2, 1, 2, 2) .add(util.select().position(2, 1, 2)), 80) .attachKeyFrame() .pointAt(util.vector().blockSurface(util.grid().at(2, 2, 2), Direction.NORTH)) diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/DeployerScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/DeployerScenes.java index c627a4d6d1..f5857c42f7 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/DeployerScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/DeployerScenes.java @@ -8,15 +8,13 @@ import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import com.simibubi.create.foundation.ponder.element.BeltItemElement; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.PonderPalette; +import net.createmod.ponder.api.element.ElementLink; +import net.createmod.ponder.api.element.EntityElement; +import net.createmod.ponder.api.element.WorldSectionElement; import net.createmod.ponder.api.scene.SceneBuilder; import net.createmod.ponder.api.scene.SceneBuildingUtil; -import net.createmod.ponder.foundation.ElementLink; -import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.Selection; -import net.createmod.ponder.foundation.element.EntityElement; -import net.createmod.ponder.foundation.element.InputWindowElement; -import net.createmod.ponder.foundation.element.WorldSectionElement; -import net.createmod.ponder.foundation.instruction.EmitParticlesInstruction.Emitter; +import net.createmod.ponder.api.scene.Selection; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.particles.BlockParticleOption; @@ -60,7 +58,7 @@ public class DeployerScenes { scene.world().moveDeployer(deployerPos, -1, 25); scene.idle(44); - scene.overlay().showSelectionWithText(util.select().position(deployerPos.west(2)), 60) + scene.overlay().showOutlineWithText(util.select().position(deployerPos.west(2)), 60) .text("It will always interact with the position 2 blocks in front of itself") .attachKeyFrame() .placeNearTarget() @@ -109,8 +107,8 @@ public class DeployerScenes { Vec3 frontVec = util.vector().blockSurface(deployerPos, Direction.WEST) .add(-.125, 0, 0); - scene.overlay().showControls(new InputWindowElement(frontVec, Pointing.DOWN).rightClick() - .withItem(pot), 40); + scene.overlay().showControls(frontVec, Pointing.DOWN, 40).rightClick() + .withItem(pot); scene.idle(7); Class teType = DeployerBlockEntity.class; scene.world().modifyBlockEntityNBT(deployerSelection, teType, nbt -> nbt.put("HeldItem", pot.serializeNBT())); @@ -169,8 +167,8 @@ public class DeployerScenes { ItemStack shears = new ItemStack(Items.SHEARS); - scene.overlay().showControls(new InputWindowElement(filterSlot, Pointing.DOWN).rightClick() - .withItem(shears), 40); + scene.overlay().showControls(filterSlot, Pointing.DOWN, 40).rightClick() + .withItem(shears); scene.idle(7); scene.world().setFilterData(deployerSelection, teType, shears); scene.overlay().showText(60) @@ -212,10 +210,10 @@ public class DeployerScenes { scene.idle(26); scene.world().modifyEntity(sheep, e -> ((Sheep) e).setSheared(true)); scene.effects().emitParticles(util.vector().topOf(deployerPos.west(2)) - .add(0, -.25, 0), - Emitter.withinBlockSpace(new BlockParticleOption(ParticleTypes.BLOCK, Blocks.PINK_WOOL.defaultBlockState()), - util.vector().of(0, 0, 0)), - 25, 1); + .add(0, -.25, 0), + scene.effects().particleEmitterWithinBlockSpace(new BlockParticleOption(ParticleTypes.BLOCK, Blocks.PINK_WOOL.defaultBlockState()), + util.vector().of(0, 0, 0)), + 25, 1); scene.world().moveDeployer(deployerPos, -1, 25); scene.world().showSection(util.select().position(deployerPos.north()), Direction.SOUTH); scene.idle(25); @@ -259,8 +257,7 @@ public class DeployerScenes { scene.idle(10); ItemStack tool = new ItemStack(Items.GOLDEN_HOE); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(deployerPos), Pointing.DOWN).withItem(tool), - 30); + scene.overlay().showControls(util.vector().topOf(deployerPos), Pointing.DOWN, 30).withItem(tool); scene.idle(7); scene.world().modifyBlockEntityNBT(deployerSelection, DeployerBlockEntity.class, nbt -> nbt.put("HeldItem", tool.serializeNBT())); @@ -281,8 +278,8 @@ public class DeployerScenes { scene.world().moveDeployer(deployerPos, -1, 25); scene.idle(46); - scene.overlay().showControls(new InputWindowElement(frontVec, Pointing.LEFT).rightClick() - .withItem(AllItems.WRENCH.asStack()), 40); + scene.overlay().showControls(frontVec, Pointing.LEFT, 40).rightClick() + .withItem(AllItems.WRENCH.asStack()); scene.idle(7); scene.world().modifyBlockEntityNBT(deployerSelection, DeployerBlockEntity.class, nbt -> nbt.putString("Mode", "PUNCH")); @@ -342,8 +339,8 @@ public class DeployerScenes { scene.idle(10); ItemStack tool = AllItems.SAND_PAPER.asStack(); - scene.overlay().showControls(new InputWindowElement(util.vector().blockSurface(pressPos.below(), Direction.EAST) - .add(0, 0.15, 0), Pointing.RIGHT).withItem(tool), 30); + scene.overlay().showControls(util.vector().blockSurface(pressPos.below(), Direction.EAST).add(0, 0.15, 0), Pointing.RIGHT, 30) + .withItem(tool); scene.idle(7); scene.world().modifyBlockEntityNBT(pressS, DeployerBlockEntity.class, nbt -> nbt.put("HeldItem", tool.serializeNBT())); @@ -365,7 +362,7 @@ public class DeployerScenes { ItemStack quartz = AllItems.ROSE_QUARTZ.asStack(); scene.world().createItemOnBeltLike(depotPos, Direction.NORTH, quartz); Vec3 depotCenter = util.vector().centerOf(depotPos.south()); - scene.overlay().showControls(new InputWindowElement(depotCenter, Pointing.UP).withItem(quartz), 30); + scene.overlay().showControls(depotCenter, Pointing.UP, 30).withItem(quartz); scene.idle(10); Vec3 targetV = util.vector().centerOf(pressPos) @@ -380,7 +377,7 @@ public class DeployerScenes { ItemStack polished = AllItems.POLISHED_ROSE_QUARTZ.asStack(); scene.world().createItemOnBeltLike(depotPos, Direction.UP, polished); scene.idle(10); - scene.overlay().showControls(new InputWindowElement(depotCenter, Pointing.UP).withItem(polished), 50); + scene.overlay().showControls(depotCenter, Pointing.UP, 50).withItem(polished); scene.idle(60); scene.world().hideIndependentSection(depot, Direction.NORTH); @@ -547,7 +544,7 @@ public class DeployerScenes { scene.idle(18); } - scene.overlay().showSelectionWithText(flowers, 90) + scene.overlay().showOutlineWithText(flowers, 90) .attachKeyFrame() .colored(PonderPalette.GREEN) .text("They activate at each visited location, using items from inventories anywhere on the contraption"); @@ -569,7 +566,7 @@ public class DeployerScenes { scene.idle(70); ItemStack poppy = new ItemStack(Items.POPPY); - scene.overlay().showControls(new InputWindowElement(filterSlot, Pointing.DOWN).withItem(poppy), 30); + scene.overlay().showControls(filterSlot, Pointing.DOWN, 30).withItem(poppy); scene.idle(7); scene.world().setFilterData(deployerSelection, DeployerBlockEntity.class, poppy); scene.idle(25); diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/DetectorScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/DetectorScenes.java index 5c0c8f74ff..d4828efd09 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/DetectorScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/DetectorScenes.java @@ -5,13 +5,12 @@ import com.simibubi.create.content.redstone.thresholdSwitch.ThresholdSwitchBlock import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.PonderPalette; +import net.createmod.ponder.api.element.ElementLink; +import net.createmod.ponder.api.element.WorldSectionElement; import net.createmod.ponder.api.scene.SceneBuilder; import net.createmod.ponder.api.scene.SceneBuildingUtil; -import net.createmod.ponder.foundation.ElementLink; -import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.Selection; -import net.createmod.ponder.foundation.element.InputWindowElement; -import net.createmod.ponder.foundation.element.WorldSectionElement; +import net.createmod.ponder.api.scene.Selection; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.item.ItemStack; @@ -60,10 +59,8 @@ public class DetectorScenes { ItemStack copperIngot = new ItemStack(Items.COPPER_INGOT); ItemStack amethystItem = new ItemStack(Blocks.AMETHYST_BLOCK); - scene.overlay().showControls( - new InputWindowElement(util.vector().blockSurface(observerPos.north(), Direction.NORTH), Pointing.RIGHT) - .withItem(copperIngot), - 40); + scene.overlay().showControls(util.vector().blockSurface(observerPos.north(), Direction.NORTH), Pointing.RIGHT, 40) + .withItem(copperIngot); scene.idle(7); scene.world().toggleRedstonePower(util.select().position(observerPos)); scene.world().toggleRedstonePower(redstoneDust); @@ -79,10 +76,8 @@ public class DetectorScenes { scene.overlay().showCenteredScrollInput(observerPos, Direction.UP, 10); scene.idle(5); - scene.overlay().showControls( - new InputWindowElement(util.vector().blockSurface(observerPos, Direction.UP), Pointing.DOWN).rightClick() - .withItem(amethystItem), - 60); + scene.overlay().showControls(util.vector().blockSurface(observerPos, Direction.UP), Pointing.DOWN, 60).rightClick() + .withItem(amethystItem); scene.idle(7); scene.world().setFilterData(util.select().position(observerPos), SmartObserverBlockEntity.class, amethystItem); scene.world().toggleRedstonePower(util.select().position(observerPos)); @@ -320,8 +315,7 @@ public class DetectorScenes { scene.idle(5); scene.overlay().showLine(PonderPalette.RED, upper.add(2 / 16f, 0, 0), upper.subtract(2 / 16f, 0, 0), 100); scene.idle(15); - scene.overlay().showControls( - new InputWindowElement(util.vector().blockSurface(switchPos, Direction.UP), Pointing.DOWN).rightClick(), 60); + scene.overlay().showControls(util.vector().blockSurface(switchPos, Direction.UP), Pointing.DOWN, 60).rightClick(); scene.idle(7); scene.overlay().showText(70) .text("The specific thresholds can be changed in the UI") diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/DisplayScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/DisplayScenes.java index 06da6fc9b4..29a475e6a7 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/DisplayScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/DisplayScenes.java @@ -9,13 +9,12 @@ import com.simibubi.create.foundation.utility.CreateLang; import net.createmod.catnip.utility.Pointing; import net.createmod.catnip.utility.lang.Components; +import net.createmod.ponder.api.PonderPalette; +import net.createmod.ponder.api.element.ElementLink; +import net.createmod.ponder.api.element.WorldSectionElement; import net.createmod.ponder.api.scene.SceneBuilder; import net.createmod.ponder.api.scene.SceneBuildingUtil; -import net.createmod.ponder.foundation.ElementLink; -import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.Selection; -import net.createmod.ponder.foundation.element.InputWindowElement; -import net.createmod.ponder.foundation.element.WorldSectionElement; +import net.createmod.ponder.api.scene.Selection; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.item.DyeColor; @@ -73,9 +72,8 @@ public class DisplayScenes { scene.idle(25); Vec3 target = util.vector().of(3.5, 2.75, 3.25); - scene.overlay() - .showControls(new InputWindowElement(target, Pointing.RIGHT).withItem(AllBlocks.DISPLAY_LINK.asStack()) - .rightClick(), 60); + scene.overlay().showControls(target, Pointing.RIGHT, 60).withItem(AllBlocks.DISPLAY_LINK.asStack()) + .rightClick(); scene.idle(6); scene.overlay().chaseBoundingBoxOutline(PonderPalette.OUTPUT, link, new AABB(board).expandTowards(-2, -1, 0) .deflate(0, 0, 3 / 16f), 60); @@ -92,7 +90,7 @@ public class DisplayScenes { scene.idle(10); scene.world().showSection(link, Direction.EAST); scene.idle(20); - scene.overlay().showSelectionWithText(depot, 70) + scene.overlay().showOutlineWithText(depot, 70) .text("...then attach it to the block to read from") .pointAt(util.vector().centerOf(linkPos)) .colored(PonderPalette.INPUT) @@ -103,7 +101,7 @@ public class DisplayScenes { scene.world().createItemOnBeltLike(depotPos, Direction.SOUTH, item); scene.idle(20); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(linkPos), Pointing.DOWN).rightClick(), 60); + scene.overlay().showControls(util.vector().topOf(linkPos), Pointing.DOWN, 60).rightClick(); scene.idle(20); scene.overlay().showText(80) .text("Open the Interface to select and configure what is sent") @@ -146,7 +144,7 @@ public class DisplayScenes { scene.world().moveSection(dirtElement, util.vector().of(0, -4, 0), 0); scene.idle(25); - scene.overlay().showSelectionWithText(depot, 50) + scene.overlay().showOutlineWithText(depot, 50) .text("Not every block can act as a source") .pointAt(util.vector().topOf(depotPos)) .attachKeyFrame() @@ -286,8 +284,8 @@ public class DisplayScenes { Vec3 target = util.vector().of(3.95, 2.75, 3.25); ItemStack clipboard = AllBlocks.CLIPBOARD.asStack(); ClipboardOverrides.switchTo(ClipboardType.WRITTEN, clipboard); - scene.overlay().showControls(new InputWindowElement(target, Pointing.RIGHT).withItem(clipboard) - .rightClick(), 40); + scene.overlay().showControls(target, Pointing.RIGHT, 40).withItem(clipboard) + .rightClick(); scene.idle(6); scene.world().setDisplayBoardText(board, 0, Components.literal("Create")); scene.idle(25); @@ -337,9 +335,8 @@ public class DisplayScenes { scene.world().flashDisplayLink(linkPos); scene.idle(50); - scene.overlay() - .showControls(new InputWindowElement(target, Pointing.RIGHT).withItem(new ItemStack(Items.PINK_DYE)) - .rightClick(), 40); + scene.overlay().showControls(target, Pointing.RIGHT, 40).withItem(new ItemStack(Items.PINK_DYE)) + .rightClick(); scene.idle(6); scene.world().dyeDisplayBoard(board, 0, DyeColor.PINK); scene.idle(25); @@ -351,15 +348,13 @@ public class DisplayScenes { .placeNearTarget(); scene.idle(25); - scene.overlay().showControls( - new InputWindowElement(target.add(0, -.5f, 0), Pointing.RIGHT).withItem(new ItemStack(Items.LIME_DYE)) - .rightClick(), - 40); + scene.overlay().showControls(target.add(0, -.5f, 0), Pointing.RIGHT, 40).withItem(new ItemStack(Items.LIME_DYE)) + .rightClick(); scene.idle(6); scene.world().dyeDisplayBoard(board, 1, DyeColor.LIME); scene.idle(55); - scene.overlay().showControls(new InputWindowElement(target, Pointing.RIGHT).rightClick(), 40); + scene.overlay().showControls(target, Pointing.RIGHT, 40).rightClick(); scene.idle(6); scene.world().setDisplayBoardText(board, 0, Components.immutableEmpty()); scene.idle(25); @@ -457,7 +452,7 @@ public class DisplayScenes { scene.world().setDisplayBoardText(board, 1, Components.immutableEmpty()); scene.idle(25); - scene.overlay().showSelectionWithText(depot, 80) + scene.overlay().showOutlineWithText(depot, 80) .colored(PonderPalette.RED) .attachKeyFrame() .pointAt(util.vector().topOf(linkPos)) diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/EjectorScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/EjectorScenes.java index 17aa99eed2..d4efb9cb50 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/EjectorScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/EjectorScenes.java @@ -7,14 +7,14 @@ import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.NBTHelper; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.PonderPalette; +import net.createmod.ponder.api.element.ElementLink; +import net.createmod.ponder.api.element.ParrotElement; +import net.createmod.ponder.api.element.ParrotPose; +import net.createmod.ponder.api.element.WorldSectionElement; import net.createmod.ponder.api.scene.SceneBuilder; import net.createmod.ponder.api.scene.SceneBuildingUtil; -import net.createmod.ponder.foundation.ElementLink; -import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.Selection; -import net.createmod.ponder.foundation.element.InputWindowElement; -import net.createmod.ponder.foundation.element.ParrotElement; -import net.createmod.ponder.foundation.element.WorldSectionElement; +import net.createmod.ponder.api.scene.Selection; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.entity.Entity; @@ -44,9 +44,9 @@ public class EjectorScenes { scene.idle(10); ItemStack asStack = AllBlocks.WEIGHTED_EJECTOR.asStack(); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(targetPos), Pointing.DOWN).rightClick() + scene.overlay().showControls(util.vector().topOf(targetPos), Pointing.DOWN, 50).rightClick() .whileSneaking() - .withItem(asStack), 50); + .withItem(asStack); scene.idle(7); Object slot = new Object(); scene.overlay().chaseBoundingBoxOutline(PonderPalette.OUTPUT, slot, new AABB(targetPos), 160); @@ -58,8 +58,8 @@ public class EjectorScenes { .pointAt(util.vector().blockSurface(targetPos, Direction.WEST)) .placeNearTarget(); scene.idle(80); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(ejectorPos), Pointing.DOWN).rightClick() - .withItem(asStack), 50); + scene.overlay().showControls(util.vector().topOf(ejectorPos), Pointing.DOWN, 50).rightClick() + .withItem(asStack); scene.idle(7); scene.world().setKineticSpeed(ejectorS, 0); scene.world().modifyBlockEntityNBT(ejectorS, EjectorBlockEntity.class, nbt -> { @@ -99,7 +99,7 @@ public class EjectorScenes { .east(), Direction.WEST)) .placeNearTarget(); scene.idle(70); - scene.overlay().showSelectionWithText(util.select().position(ejectorPos.west()), 70) + scene.overlay().showOutlineWithText(util.select().position(ejectorPos.west()), 70) .colored(PonderPalette.OUTPUT) .text("If no valid Target was selected, it will simply target the block directly in front") .placeNearTarget(); @@ -119,8 +119,7 @@ public class EjectorScenes { ItemStack copperBlock = new ItemStack(Items.COPPER_BLOCK); ItemStack copperIngot = new ItemStack(Items.COPPER_INGOT); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(ejectorPos) - .add(0.5, 0, 0), Pointing.RIGHT).withItem(copperBlock), 30); + scene.overlay().showControls(util.vector().topOf(ejectorPos).add(0.5, 0, 0), Pointing.RIGHT, 30).withItem(copperBlock); scene.idle(7); scene.world().createItemOnBeltLike(ejectorPos, Direction.NORTH, copperBlock); scene.idle(20); @@ -156,7 +155,7 @@ public class EjectorScenes { Vec3 input = util.vector().blockSurface(ejectorPos, Direction.WEST) .add(0, -2 / 16f, 0); Vec3 topOfSlot = input.add(0, 2 / 16f, 0); - scene.overlay().showControls(new InputWindowElement(topOfSlot, Pointing.DOWN).rightClick(), 60); + scene.overlay().showControls(topOfSlot, Pointing.DOWN, 60).rightClick(); scene.overlay().showFilterSlotInput(input, Direction.WEST, 80); scene.idle(10); scene.overlay().showText(80) @@ -194,7 +193,7 @@ public class EjectorScenes { scene.addKeyframe(); ElementLink birb = scene.special().createBirb(util.vector().topOf(ejectorPos) - .add(0, -3 / 16f, 0), ParrotElement.FlappyPose::new); + .add(0, -3 / 16f, 0), ParrotPose.FlappyPose::new); scene.idle(15); scene.world().modifyBlockEntity(ejectorPos, EjectorBlockEntity.class, ejector -> ejector.activateDeferred()); scene.special().moveParrot(birb, util.vector().of(-2, 3, 0), 5); @@ -206,7 +205,7 @@ public class EjectorScenes { scene.idle(6); scene.special().moveParrot(birb, util.vector().of(-0.25, -2 + 3 / 16f, 0), 12); scene.idle(15); - scene.special().changeBirbPose(birb, ParrotElement.FaceCursorPose::new); + scene.special().changeBirbPose(birb, ParrotPose.FaceCursorPose::new); scene.overlay().showText(80) .text("Mobs and Players will always trigger an Ejector when stepping on it") .pointAt(util.vector().topOf(targetPos)) @@ -241,9 +240,7 @@ public class EjectorScenes { scene.idle(90); BlockPos tunnel = util.grid().at(2, 2, 3); - scene.overlay().showControls( - new InputWindowElement(util.vector().topOf(tunnel), Pointing.DOWN).showing(AllIcons.I_TUNNEL_PREFER_NEAREST), - 80); + scene.overlay().showControls(util.vector().topOf(tunnel), Pointing.DOWN, 80).showing(AllIcons.I_TUNNEL_PREFER_NEAREST); scene.idle(10); scene.overlay().showCenteredScrollInput(tunnel, Direction.UP, 100); scene.idle(10); @@ -270,8 +267,8 @@ public class EjectorScenes { }); scene.idle(90); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(util.grid().at(4, 1, 3)), Pointing.DOWN) - .withItem(new ItemStack(Items.COPPER_INGOT)), 20); + scene.overlay().showControls(util.vector().topOf(util.grid().at(4, 1, 3)), Pointing.DOWN, 20) + .withItem(new ItemStack(Items.COPPER_INGOT)); scene.world().showSection(coverbelt, Direction.SOUTH); scene.idle(7); diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ElevatorScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ElevatorScenes.java index 3946596061..7f16873b40 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ElevatorScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ElevatorScenes.java @@ -10,13 +10,12 @@ import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; import net.createmod.catnip.utility.lang.Components; +import net.createmod.ponder.api.PonderPalette; +import net.createmod.ponder.api.element.ElementLink; +import net.createmod.ponder.api.element.WorldSectionElement; import net.createmod.ponder.api.scene.SceneBuilder; import net.createmod.ponder.api.scene.SceneBuildingUtil; -import net.createmod.ponder.foundation.ElementLink; -import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.Selection; -import net.createmod.ponder.foundation.element.InputWindowElement; -import net.createmod.ponder.foundation.element.WorldSectionElement; +import net.createmod.ponder.api.scene.Selection; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; @@ -112,15 +111,15 @@ public class ElevatorScenes { AABB glue2 = glue1.inflate(1, 0, 1) .expandTowards(0, -4, 0); - scene.overlay().showControls(new InputWindowElement(util.vector().centerOf(4, 3, 1), Pointing.RIGHT) - .withItem(AllItems.SUPER_GLUE.asStack()), 60); + scene.overlay().showControls(util.vector().centerOf(4, 3, 1), Pointing.RIGHT, 60) + .withItem(AllItems.SUPER_GLUE.asStack()); scene.idle(7); scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, glue1, glue1, 5); scene.idle(1); scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, glue1, glue2, 90); scene.idle(10); - scene.overlay().showSelectionWithText(util.select().position(2, 1, 2), 80) + scene.overlay().showOutlineWithText(util.select().position(2, 1, 2), 80) .placeNearTarget() .colored(PonderPalette.GREEN) .pointAt(util.vector().blockSurface(util.grid().at(1, 2, 1), Direction.UP)) @@ -150,10 +149,8 @@ public class ElevatorScenes { .text("Ensure that the pulley is supplied with Rotational Power"); scene.idle(75); - scene.overlay().showControls( - new InputWindowElement(util.vector().blockSurface(util.grid().at(3, 6, 2), Direction.NORTH), Pointing.RIGHT) - .rightClick(), - 60); + scene.overlay().showControls(util.vector().blockSurface(util.grid().at(3, 6, 2), Direction.NORTH), Pointing.RIGHT, 60) + .rightClick(); scene.idle(7); scene.effects().indicateSuccess(util.grid().at(3, 6, 2)); scene.world().toggleRedstonePower(util.select().position(1, 13, 2)); @@ -175,12 +172,10 @@ public class ElevatorScenes { .text("The stationary contact now turns into an Elevator Contact"); scene.idle(80); - scene.overlay().showControls( - new InputWindowElement(util.vector().blockSurface(util.grid().at(1, 1, 2), Direction.UP), Pointing.DOWN) - .rightClick(), - 60); + scene.overlay().showControls(util.vector().blockSurface(util.grid().at(1, 1, 2), Direction.UP), Pointing.DOWN, 60) + .rightClick(); scene.idle(7); - scene.overlay().showSelectionWithText(util.select().position(1, 1, 2), 60) + scene.overlay().showOutlineWithText(util.select().position(1, 1, 2), 60) .placeNearTarget() .colored(PonderPalette.BLUE) .pointAt(util.vector().blockSurface(util.grid().at(1, 1, 2), Direction.UP)) @@ -245,10 +240,8 @@ public class ElevatorScenes { scene.addLazyKeyframe(); scene.idle(10); - scene.overlay().showControls( - new InputWindowElement(util.vector().blockSurface(util.grid().at(4, 2, 2), Direction.UP), Pointing.DOWN) - .scroll(), - 60); + scene.overlay().showControls(util.vector().blockSurface(util.grid().at(4, 2, 2), Direction.UP), Pointing.DOWN, 60) + .scroll(); scene.idle(15); scene.overlay().showText(90) .placeNearTarget() @@ -256,10 +249,8 @@ public class ElevatorScenes { .text("Scroll and click on the controls block to choose a floor while on-board"); scene.idle(85); - scene.overlay().showControls( - new InputWindowElement(util.vector().blockSurface(util.grid().at(4, 2, 2), Direction.UP), Pointing.DOWN) - .rightClick(), - 10); + scene.overlay().showControls(util.vector().blockSurface(util.grid().at(4, 2, 2), Direction.UP), Pointing.DOWN, 10) + .rightClick(); scene.idle(7); scene.world().cycleBlockProperty(midContact, ElevatorContactBlock.POWERING); scene.world().cycleBlockProperty(topContact, ElevatorContactBlock.CALLING); @@ -274,10 +265,8 @@ public class ElevatorScenes { scene.world().cycleBlockProperty(topContact, ElevatorContactBlock.CALLING); scene.idle(15); - scene.overlay().showControls( - new InputWindowElement(util.vector().blockSurface(util.grid().at(3, 6, 2), Direction.NORTH), Pointing.RIGHT) - .rightClick(), - 60); + scene.overlay().showControls(util.vector().blockSurface(util.grid().at(3, 6, 2), Direction.NORTH), Pointing.RIGHT, 60) + .rightClick(); scene.idle(7); scene.effects().indicateSuccess(util.grid().at(3, 6, 2)); scene.world().movePulley(pulleyPos, -1, 0); @@ -292,10 +281,8 @@ public class ElevatorScenes { scene.world().showSectionAndMerge(util.select().fromTo(doorPos, doorPos.above()), Direction.DOWN, elevatorLink); scene.idle(20); - scene.overlay().showControls( - new InputWindowElement(util.vector().blockSurface(util.grid().at(3, 6, 2), Direction.NORTH), Pointing.RIGHT) - .rightClick(), - 60); + scene.overlay().showControls(util.vector().blockSurface(util.grid().at(3, 6, 2), Direction.NORTH), Pointing.RIGHT, 60) + .rightClick(); scene.idle(7); scene.effects().indicateSuccess(util.grid().at(3, 6, 2)); scene.world().movePulley(pulleyPos, 1, 0); @@ -373,11 +360,9 @@ public class ElevatorScenes { scene.idle(30); scene.world().showSectionAndMerge(util.select().position(nixiePos), Direction.DOWN, camLink); scene.idle(15); - scene.overlay().showControls( - new InputWindowElement(util.vector().blockSurface(util.grid().at(4, 1, 0), Direction.UP), Pointing.DOWN) + scene.overlay().showControls(util.vector().blockSurface(util.grid().at(4, 1, 0), Direction.UP), Pointing.DOWN, 15) .rightClick() - .withItem(AllBlocks.DISPLAY_LINK.asStack()), - 15); + .withItem(AllBlocks.DISPLAY_LINK.asStack()); scene.world().toggleRedstonePower(util.select().position(1, 14, 2)); scene.idle(15); scene.world().showSectionAndMerge(util.select().position(linkPos), Direction.DOWN, camLink); diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/FanScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/FanScenes.java index 288f1d03c1..8c0917317c 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/FanScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/FanScenes.java @@ -6,16 +6,15 @@ import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import com.simibubi.create.foundation.ponder.element.BeltItemElement; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.PonderPalette; +import net.createmod.ponder.api.element.ElementLink; +import net.createmod.ponder.api.element.EntityElement; +import net.createmod.ponder.api.element.ParrotElement; +import net.createmod.ponder.api.element.ParrotPose; +import net.createmod.ponder.api.element.WorldSectionElement; import net.createmod.ponder.api.scene.SceneBuilder; import net.createmod.ponder.api.scene.SceneBuildingUtil; -import net.createmod.ponder.foundation.ElementLink; -import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.Selection; -import net.createmod.ponder.foundation.element.EntityElement; -import net.createmod.ponder.foundation.element.InputWindowElement; -import net.createmod.ponder.foundation.element.ParrotElement; -import net.createmod.ponder.foundation.element.WorldSectionElement; -import net.createmod.ponder.foundation.instruction.EmitParticlesInstruction.Emitter; +import net.createmod.ponder.api.scene.Selection; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.particles.ParticleTypes; @@ -46,7 +45,7 @@ public class FanScenes { scene.idle(40); scene.effects().rotationDirectionIndicator(fanPos.south()); - ElementLink flappyBirb = scene.special().createBirb(util.vector().topOf(1, 0, 3), ParrotElement.FlappyPose::new); + ElementLink flappyBirb = scene.special().createBirb(util.vector().topOf(1, 0, 3), ParrotPose.FlappyPose::new); scene.idle(2); scene.special().rotateParrot(flappyBirb, 0, 235, 0, 30); scene.special().moveParrot(flappyBirb, util.vector().of(0, 0, -2.5), 30); @@ -108,7 +107,7 @@ public class FanScenes { scene.world().setBlock(blockPos, Blocks.LAVA.defaultBlockState(), false); scene.idle(10); - scene.overlay().showSelectionWithText(util.select().fromTo(blockPos, blockPos.west(2)), 80) + scene.overlay().showOutlineWithText(util.select().fromTo(blockPos, blockPos.west(2)), 80) .colored(PonderPalette.RED) .text("When passing through lava, the Air Flow becomes Heated"); scene.idle(80); @@ -122,10 +121,10 @@ public class FanScenes { scene.world().modifyEntity(entityLink, e -> e.setDeltaMovement(-0.2f, 0, 0)); Vec3 itemVec = util.vector().blockSurface(util.grid().at(1, 1, 2), Direction.EAST) .add(0.1, 0, 0); - scene.overlay().showControls(new InputWindowElement(itemVec, Pointing.DOWN).withItem(stack), 20); + scene.overlay().showControls(itemVec, Pointing.DOWN, 20).withItem(stack); scene.idle(20); - scene.effects().emitParticles(itemVec.add(0, 0.2f, 0), Emitter.simple(ParticleTypes.LARGE_SMOKE, Vec3.ZERO), 1, - 60); + scene.effects().emitParticles(itemVec.add(0, 0.2f, 0), scene.effects().simpleParticleEmitter(ParticleTypes.LARGE_SMOKE, Vec3.ZERO), 1, + 60); scene.overlay().showText(80) .colored(PonderPalette.WHITE) @@ -137,7 +136,7 @@ public class FanScenes { scene.idle(60); scene.world().modifyEntities(ItemEntity.class, ie -> ie.setItem(smelted)); scene.idle(40); - scene.overlay().showControls(new InputWindowElement(itemVec, Pointing.DOWN).withItem(smelted), 20); + scene.overlay().showControls(itemVec, Pointing.DOWN, 20).withItem(smelted); scene.idle(20); scene.world().modifyEntities(ItemEntity.class, Entity::discard); scene.idle(20); @@ -160,7 +159,7 @@ public class FanScenes { scene.world().moveSection(blockInFront, util.vector().of(1, 0, 2), 0); scene.idle(50); - scene.overlay().showSelectionWithText(util.select().fromTo(blockPos, blockPos.west(2)), 60) + scene.overlay().showOutlineWithText(util.select().fromTo(blockPos, blockPos.west(2)), 60) .colored(PonderPalette.BLACK) .attachKeyFrame() .text("Instead, a setup for Smoking using Fire should be used for them"); @@ -177,7 +176,7 @@ public class FanScenes { scene.world().moveSection(blockInFront, util.vector().of(1, 0, 2), 0); scene.idle(20); - scene.overlay().showSelectionWithText(util.select().fromTo(blockPos, blockPos.west(2)), 60) + scene.overlay().showOutlineWithText(util.select().fromTo(blockPos, blockPos.west(2)), 60) .colored(PonderPalette.MEDIUM) .attachKeyFrame() .text("Air Flows passing through water create a Washing Setup"); @@ -190,9 +189,9 @@ public class FanScenes { .above(2)), util.vector().of(0, 0.1, 0), stack); scene.idle(15); scene.world().modifyEntity(entityLink, e -> e.setDeltaMovement(-0.2f, 0, 0)); - scene.overlay().showControls(new InputWindowElement(itemVec, Pointing.DOWN).withItem(stack), 20); + scene.overlay().showControls(itemVec, Pointing.DOWN, 20).withItem(stack); scene.idle(20); - scene.effects().emitParticles(itemVec.add(0, 0.2f, 0), Emitter.simple(ParticleTypes.SPIT, Vec3.ZERO), 1, 60); + scene.effects().emitParticles(itemVec.add(0, 0.2f, 0), scene.effects().simpleParticleEmitter(ParticleTypes.SPIT, Vec3.ZERO), 1, 60); scene.overlay().showText(50) .colored(PonderPalette.WHITE) @@ -202,7 +201,7 @@ public class FanScenes { scene.idle(60); scene.world().modifyEntities(ItemEntity.class, ie -> ie.setItem(washed)); - scene.overlay().showControls(new InputWindowElement(itemVec, Pointing.DOWN).withItem(washed), 20); + scene.overlay().showControls(itemVec, Pointing.DOWN, 20).withItem(washed); scene.idle(20); scene.world().modifyEntities(ItemEntity.class, Entity::discard); scene.idle(20); @@ -239,11 +238,11 @@ public class FanScenes { scene.idle(10); Vec3 depotTop = util.vector().topOf(2, 1, 2) .add(0, 0.25, 0); - scene.effects().emitParticles(depotTop, Emitter.simple(ParticleTypes.SPIT, Vec3.ZERO), .5f, 30); + scene.effects().emitParticles(depotTop, scene.effects().simpleParticleEmitter(ParticleTypes.SPIT, Vec3.ZERO), .5f, 30); scene.idle(30); scene.world().modifyBlockEntityNBT(util.select().position(depos), DepotBlockEntity.class, nbt -> nbt.put("HeldItem", new TransportedItemStack(clay).serializeNBT())); - scene.effects().emitParticles(depotTop, Emitter.simple(ParticleTypes.SPIT, Vec3.ZERO), .5f, 30); + scene.effects().emitParticles(depotTop, scene.effects().simpleParticleEmitter(ParticleTypes.SPIT, Vec3.ZERO), .5f, 30); scene.overlay().showText(90) .pointAt(depotTop) .attachKeyFrame() @@ -261,10 +260,10 @@ public class FanScenes { ElementLink transported = scene.world().createItemOnBelt(util.grid().at(3, 3, 3), Direction.SOUTH, sand); scene.idle(60); - scene.effects().emitParticles(depotTop, Emitter.simple(ParticleTypes.SPIT, Vec3.ZERO), .5f, 25); + scene.effects().emitParticles(depotTop, scene.effects().simpleParticleEmitter(ParticleTypes.SPIT, Vec3.ZERO), .5f, 25); scene.idle(25); scene.world().changeBeltItemTo(transported, new ItemStack(Items.CLAY_BALL)); - scene.effects().emitParticles(depotTop, Emitter.simple(ParticleTypes.SPIT, Vec3.ZERO), .5f, 25); + scene.effects().emitParticles(depotTop, scene.effects().simpleParticleEmitter(ParticleTypes.SPIT, Vec3.ZERO), .5f, 25); scene.idle(60); scene.world().setKineticSpeed(util.select().position(1, 2, 4) diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/FunnelScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/FunnelScenes.java index 4090e8524a..82af5c1bb4 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/FunnelScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/FunnelScenes.java @@ -8,14 +8,13 @@ import com.simibubi.create.content.logistics.funnel.FunnelBlockEntity; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.PonderPalette; +import net.createmod.ponder.api.element.ElementLink; +import net.createmod.ponder.api.element.EntityElement; +import net.createmod.ponder.api.element.WorldSectionElement; import net.createmod.ponder.api.scene.SceneBuilder; import net.createmod.ponder.api.scene.SceneBuildingUtil; -import net.createmod.ponder.foundation.ElementLink; -import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.Selection; -import net.createmod.ponder.foundation.element.EntityElement; -import net.createmod.ponder.foundation.element.InputWindowElement; -import net.createmod.ponder.foundation.element.WorldSectionElement; +import net.createmod.ponder.api.scene.Selection; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.entity.Entity; @@ -127,9 +126,6 @@ public class FunnelScenes { Vec3 topCenter = util.vector().centerOf(topFunnel); Vec3 topSide = util.vector().blockSurface(topFunnel, Direction.EAST); - InputWindowElement controlsSneak = new InputWindowElement(topCenter, Pointing.DOWN).rightClick() - .whileSneaking(); - // Placing funnels without sneak scene.world().showSection(topFunnelSelection, Direction.DOWN); scene.overlay().showText(80) @@ -152,7 +148,8 @@ public class FunnelScenes { scene.idle(5); scene.world().showSection(topFunnelSelection, Direction.DOWN); - scene.overlay().showControls(controlsSneak, 35); + scene.overlay().showControls(topCenter, Pointing.DOWN, 35).rightClick() + .whileSneaking(); scene.overlay().showText(80) .text("Placed while sneaking, it puts items into the inventory.") .attachKeyFrame() @@ -167,9 +164,8 @@ public class FunnelScenes { scene.idle(45); // Wrench interaction - InputWindowElement wrenchControls = new InputWindowElement(topSide, Pointing.RIGHT).rightClick() + scene.overlay().showControls(topSide, Pointing.RIGHT, 40).rightClick() .withItem(AllItems.WRENCH.asStack()); - scene.overlay().showControls(wrenchControls, 40); scene.idle(10); scene.world().modifyBlock(topFunnel, s -> s.cycle(FunnelBlock.EXTRACTING), true); scene.idle(10); @@ -182,7 +178,8 @@ public class FunnelScenes { itemLink = scene.world().createItemEntity(topCenter, util.vector().of(0, 4 / 16f, 0), itemStack); scene.idle(30); - scene.overlay().showControls(wrenchControls, 40); + scene.overlay().showControls(topSide, Pointing.RIGHT, 40).rightClick() + .withItem(AllItems.WRENCH.asStack()); scene.idle(10); scene.world().modifyBlock(topFunnel, s -> s.cycle(FunnelBlock.EXTRACTING), true); scene.idle(10); @@ -404,7 +401,7 @@ public class FunnelScenes { filter = filter.add(0, -5 / 16f, -1.5 / 16f); scene.overlay().showFilterSlotInput(filter, Direction.NORTH, 80); - scene.overlay().showControls(new InputWindowElement(filter, Pointing.DOWN).rightClick(), 60); + scene.overlay().showControls(filter, Pointing.DOWN, 60).rightClick(); scene.idle(10); scene.overlay().showText(80) .text("The value panel allows for precise control over the extracted stack size.") @@ -446,8 +443,8 @@ public class FunnelScenes { if (i == 2) { scene.overlay().showFilterSlotInput(filter, Direction.NORTH, 40); - scene.overlay().showControls(new InputWindowElement(filter, Pointing.DOWN).rightClick() - .withItem(emerald), 60); + scene.overlay().showControls(filter, Pointing.DOWN, 60).rightClick() + .withItem(emerald); scene.idle(10); scene.overlay().showText(80) .text("Using items on the filter slot will restrict the funnel to only transfer matching stacks.") @@ -484,7 +481,7 @@ public class FunnelScenes { scene.world().showSection(funnelSelect, Direction.DOWN); scene.idle(20); - scene.overlay().showSelectionWithText(funnelSelect, 40) + scene.overlay().showOutlineWithText(funnelSelect, 40) .colored(PonderPalette.RED) .text("Funnels cannot ever transfer between closed inventories directly.") .attachKeyFrame() diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/GantryScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/GantryScenes.java index adc7a953a0..2f1464cfc9 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/GantryScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/GantryScenes.java @@ -5,13 +5,12 @@ import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Iterate; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.PonderPalette; +import net.createmod.ponder.api.element.ElementLink; +import net.createmod.ponder.api.element.WorldSectionElement; import net.createmod.ponder.api.scene.SceneBuilder; import net.createmod.ponder.api.scene.SceneBuildingUtil; -import net.createmod.ponder.foundation.ElementLink; -import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.Selection; -import net.createmod.ponder.foundation.element.InputWindowElement; -import net.createmod.ponder.foundation.element.WorldSectionElement; +import net.createmod.ponder.api.scene.Selection; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.block.Blocks; @@ -82,8 +81,8 @@ public class GantryScenes { scene.overlay().showOutline(PonderPalette.GREEN, "glue", util.select().position(3, 4, 2) .add(util.select().fromTo(3, 3, 2, 5, 3, 2)) .add(util.select().position(5, 3, 1)), 40); - scene.overlay().showControls(new InputWindowElement(util.vector().centerOf(util.grid().at(3, 3, 2)), Pointing.UP) - .withItem(AllItems.SUPER_GLUE.asStack()), 40); + scene.overlay().showControls(util.vector().centerOf(util.grid().at(3, 3, 2)), Pointing.UP, 40) + .withItem(AllItems.SUPER_GLUE.asStack()); scene.effects().superGlue(util.grid().at(5, 3, 1), Direction.SOUTH, true); scene.idle(20); scene.overlay().showText(80) diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ItemVaultScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ItemVaultScenes.java index f7f61879c2..8eeb84ba0c 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ItemVaultScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ItemVaultScenes.java @@ -5,13 +5,12 @@ import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.PonderPalette; +import net.createmod.ponder.api.element.ElementLink; +import net.createmod.ponder.api.element.WorldSectionElement; import net.createmod.ponder.api.scene.SceneBuilder; import net.createmod.ponder.api.scene.SceneBuildingUtil; -import net.createmod.ponder.foundation.ElementLink; -import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.Selection; -import net.createmod.ponder.foundation.element.InputWindowElement; -import net.createmod.ponder.foundation.element.WorldSectionElement; +import net.createmod.ponder.api.scene.Selection; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.item.ItemStack; @@ -60,10 +59,9 @@ public class ItemVaultScenes { scene.idle(15); ItemStack hand = AllItems.BRASS_HAND.asStack(); - scene.overlay() - .showControls(new InputWindowElement(util.vector().blockSurface(frontVault, Direction.NORTH), Pointing.RIGHT) + scene.overlay().showControls(util.vector().blockSurface(frontVault, Direction.NORTH), Pointing.RIGHT, 40) .showing(AllIcons.I_MTD_CLOSE) - .withItem(hand), 40); + .withItem(hand); scene.idle(7); scene.overlay().showText(60) diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/KineticsScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/KineticsScenes.java index b2531c61ac..6490e0ea59 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/KineticsScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/KineticsScenes.java @@ -18,13 +18,12 @@ import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import com.tterrag.registrate.util.entry.BlockEntry; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.PonderPalette; +import net.createmod.ponder.api.element.ElementLink; +import net.createmod.ponder.api.element.WorldSectionElement; import net.createmod.ponder.api.scene.SceneBuilder; import net.createmod.ponder.api.scene.SceneBuildingUtil; -import net.createmod.ponder.foundation.ElementLink; -import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.Selection; -import net.createmod.ponder.foundation.element.InputWindowElement; -import net.createmod.ponder.foundation.element.WorldSectionElement; +import net.createmod.ponder.api.scene.Selection; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -89,8 +88,8 @@ public class KineticsScenes { BlockEntry andesiteEncased = AllBlocks.ANDESITE_ENCASED_SHAFT; ItemStack andesiteCasingItem = AllBlocks.ANDESITE_CASING.asStack(); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(3, 1, 2), Pointing.DOWN).rightClick() - .withItem(andesiteCasingItem), 60); + scene.overlay().showControls(util.vector().topOf(3, 1, 2), Pointing.DOWN, 60).rightClick() + .withItem(andesiteCasingItem); scene.idle(7); scene.world().setBlocks(andesite, andesiteEncased.getDefaultState() .setValue(EncasedShaftBlock.AXIS, Axis.X), true); @@ -100,8 +99,8 @@ public class KineticsScenes { BlockEntry brassEncased = AllBlocks.BRASS_ENCASED_SHAFT; ItemStack brassCasingItem = AllBlocks.BRASS_CASING.asStack(); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(1, 0, 2), Pointing.UP).rightClick() - .withItem(brassCasingItem), 60); + scene.overlay().showControls(util.vector().topOf(1, 0, 2), Pointing.UP, 60).rightClick() + .withItem(brassCasingItem); scene.idle(7); scene.world().setBlocks(brass, brassEncased.getDefaultState() .setValue(EncasedShaftBlock.AXIS, Axis.X), true); @@ -327,8 +326,8 @@ public class KineticsScenes { BlockEntry andesiteEncased = AllBlocks.ANDESITE_ENCASED_COGWHEEL; ItemStack andesiteCasingItem = AllBlocks.ANDESITE_CASING.asStack(); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(3, 0, 2), Pointing.UP).rightClick() - .withItem(andesiteCasingItem), 100); + scene.overlay().showControls(util.vector().topOf(3, 0, 2), Pointing.UP, 100).rightClick() + .withItem(andesiteCasingItem); scene.idle(7); scene.world().setBlocks(util.select().position(3, 1, 2), andesiteEncased.getDefaultState() .setValue(EncasedCogwheelBlock.AXIS, Axis.Y) @@ -336,8 +335,8 @@ public class KineticsScenes { scene.world().setKineticSpeed(util.select().position(3, 1, 2), -32); scene.idle(15); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(2, 1, 2), Pointing.DOWN).rightClick() - .withItem(andesiteCasingItem), 30); + scene.overlay().showControls(util.vector().topOf(2, 1, 2), Pointing.DOWN, 30).rightClick() + .withItem(andesiteCasingItem); scene.idle(7); scene.world().setBlocks(small2, andesiteEncased.getDefaultState() .setValue(EncasedCogwheelBlock.AXIS, Axis.Y), true); @@ -347,8 +346,8 @@ public class KineticsScenes { BlockEntry brassEncased = AllBlocks.BRASS_ENCASED_LARGE_COGWHEEL; ItemStack brassCasingItem = AllBlocks.BRASS_CASING.asStack(); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(1, 0, 3), Pointing.UP).rightClick() - .withItem(brassCasingItem), 60); + scene.overlay().showControls(util.vector().topOf(1, 0, 3), Pointing.UP, 60).rightClick() + .withItem(brassCasingItem); scene.idle(7); scene.world().setBlocks(util.select().position(1, 1, 3), brassEncased.getDefaultState() .setValue(EncasedCogwheelBlock.AXIS, Axis.Y), true); @@ -378,8 +377,8 @@ public class KineticsScenes { scene.addKeyframe(); Vec3 wrenchHere = util.vector().topOf(2, 1, 2) .add(.25, 0, -.25); - scene.overlay().showControls(new InputWindowElement(wrenchHere, Pointing.RIGHT).rightClick() - .withItem(AllItems.WRENCH.asStack()), 25); + scene.overlay().showControls(wrenchHere, Pointing.RIGHT, 25).rightClick() + .withItem(AllItems.WRENCH.asStack()); scene.idle(7); scene.world().cycleBlockProperty(util.grid().at(2, 1, 2), EncasedCogwheelBlock.TOP_SHAFT); scene.idle(15); @@ -396,8 +395,8 @@ public class KineticsScenes { .pointAt(wrenchHere.add(-.5, 0, .5)); scene.idle(40); - scene.overlay().showControls(new InputWindowElement(wrenchHere, Pointing.RIGHT).rightClick() - .withItem(AllItems.WRENCH.asStack()), 25); + scene.overlay().showControls(wrenchHere, Pointing.RIGHT, 25).rightClick() + .withItem(AllItems.WRENCH.asStack()); scene.idle(7); scene.world().cycleBlockProperty(util.grid().at(2, 1, 2), EncasedCogwheelBlock.TOP_SHAFT); scene.world().setKineticSpeed(shaft2, 0); @@ -612,7 +611,7 @@ public class KineticsScenes { Vec3 blockSurface = util.vector().blockSurface(motor, Direction.NORTH) .add(1 / 16f, 0, 3 / 16f); scene.overlay().showFilterSlotInput(blockSurface, Direction.NORTH, 80); - scene.overlay().showControls(new InputWindowElement(blockSurface, Pointing.DOWN).rightClick(), 60); + scene.overlay().showControls(blockSurface, Pointing.DOWN, 60).rightClick(); scene.idle(20); scene.overlay().showText(60) @@ -703,8 +702,8 @@ public class KineticsScenes { scene.idle(5); ItemStack crimsonPlanks = new ItemStack(Items.CRIMSON_PLANKS); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(wheel), Pointing.DOWN).rightClick() - .withItem(crimsonPlanks), 20); + scene.overlay().showControls(util.vector().topOf(wheel), Pointing.DOWN, 20).rightClick() + .withItem(crimsonPlanks); scene.idle(7); scene.world().modifyBlockEntity(wheel, WaterWheelBlockEntity.class, be -> be.applyMaterialIfValid(crimsonPlanks)); scene.overlay().showText(50) @@ -715,15 +714,15 @@ public class KineticsScenes { scene.idle(40); ItemStack birchPlanks = new ItemStack(Items.BIRCH_PLANKS); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(wheel), Pointing.DOWN).rightClick() - .withItem(birchPlanks), 20); + scene.overlay().showControls(util.vector().topOf(wheel), Pointing.DOWN, 20).rightClick() + .withItem(birchPlanks); scene.idle(7); scene.world().modifyBlockEntity(wheel, WaterWheelBlockEntity.class, be -> be.applyMaterialIfValid(birchPlanks)); scene.idle(40); ItemStack junglePlanks = new ItemStack(Items.JUNGLE_PLANKS); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(wheel), Pointing.DOWN).rightClick() - .withItem(junglePlanks), 20); + scene.overlay().showControls(util.vector().topOf(wheel), Pointing.DOWN, 20).rightClick() + .withItem(junglePlanks); scene.idle(7); scene.world().modifyBlockEntity(wheel, WaterWheelBlockEntity.class, be -> be.applyMaterialIfValid(junglePlanks)); scene.idle(20); @@ -834,8 +833,8 @@ public class KineticsScenes { scene.idle(5); ItemStack crimsonPlanks = new ItemStack(Items.CRIMSON_PLANKS); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(target), Pointing.DOWN).rightClick() - .withItem(crimsonPlanks), 20); + scene.overlay().showControls(util.vector().topOf(target), Pointing.DOWN, 20).rightClick() + .withItem(crimsonPlanks); scene.idle(7); scene.world().modifyBlockEntity(wheel, WaterWheelBlockEntity.class, be -> be.applyMaterialIfValid(crimsonPlanks)); scene.overlay().showText(50) @@ -846,15 +845,15 @@ public class KineticsScenes { scene.idle(40); ItemStack birchPlanks = new ItemStack(Items.BIRCH_PLANKS); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(target), Pointing.DOWN).rightClick() - .withItem(birchPlanks), 20); + scene.overlay().showControls(util.vector().topOf(target), Pointing.DOWN, 20).rightClick() + .withItem(birchPlanks); scene.idle(7); scene.world().modifyBlockEntity(wheel, WaterWheelBlockEntity.class, be -> be.applyMaterialIfValid(birchPlanks)); scene.idle(40); ItemStack junglePlanks = new ItemStack(Items.JUNGLE_PLANKS); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(target), Pointing.DOWN).rightClick() - .withItem(junglePlanks), 20); + scene.overlay().showControls(util.vector().topOf(target), Pointing.DOWN, 20).rightClick() + .withItem(junglePlanks); scene.idle(7); scene.world().modifyBlockEntity(wheel, WaterWheelBlockEntity.class, be -> be.applyMaterialIfValid(junglePlanks)); scene.idle(20); @@ -891,7 +890,7 @@ public class KineticsScenes { .pointAt(sideOf); scene.idle(80); - scene.overlay().showControls(new InputWindowElement(centerOf, Pointing.DOWN).rightClick(), 40); + scene.overlay().showControls(centerOf, Pointing.DOWN, 40).rightClick(); scene.idle(7); scene.world().setKineticSpeed(util.select().everywhere(), 32); scene.world().modifyKineticSpeed(util.select().column(1, 3), f -> f * -2); @@ -908,8 +907,8 @@ public class KineticsScenes { scene.world().setKineticSpeed(util.select().everywhere(), 0); scene.idle(15); - scene.overlay().showControls(new InputWindowElement(centerOf, Pointing.DOWN).rightClick() - .whileSneaking(), 40); + scene.overlay().showControls(centerOf, Pointing.DOWN, 40).rightClick() + .whileSneaking(); scene.idle(7); scene.world().setKineticSpeed(util.select().everywhere(), -32); scene.world().modifyKineticSpeed(util.select().column(1, 3), f -> f * -2); @@ -972,7 +971,7 @@ public class KineticsScenes { scene.overlay().chaseBoundingBoxOutline(PonderPalette.WHITE, blockSurface, point, 1); scene.idle(1); scene.overlay().chaseBoundingBoxOutline(PonderPalette.WHITE, blockSurface, expanded, 80); - scene.overlay().showControls(new InputWindowElement(blockSurface, Pointing.DOWN).rightClick(), 60); + scene.overlay().showControls(blockSurface, Pointing.DOWN, 60).rightClick(); scene.idle(10); scene.overlay().showText(60) @@ -982,7 +981,7 @@ public class KineticsScenes { .pointAt(blockSurface); scene.idle(70); - scene.overlay().showControls(new InputWindowElement(topOf, Pointing.DOWN).rightClick(), 40); + scene.overlay().showControls(topOf, Pointing.DOWN, 40).rightClick(); scene.idle(7); scene.world().rotateSection(valve, 0, 0, 90, 30); scene.world().rotateSection(contraption, 0, 0, 90, 30); @@ -1000,8 +999,8 @@ public class KineticsScenes { scene.world().setKineticSpeed(util.select().everywhere(), 0); scene.idle(25); - scene.overlay().showControls(new InputWindowElement(topOf, Pointing.DOWN).rightClick() - .whileSneaking(), 40); + scene.overlay().showControls(topOf, Pointing.DOWN, 40).rightClick() + .whileSneaking(); scene.idle(7); scene.world().rotateSection(valve, 0, 0, -90, 30); scene.world().rotateSection(contraption, 0, 0, -90, 30); @@ -1035,8 +1034,8 @@ public class KineticsScenes { scene.idle(90); scene.addKeyframe(); - scene.overlay().showControls(new InputWindowElement(topOf, Pointing.DOWN).rightClick() - .withItem(new ItemStack(Items.BLUE_DYE)), 40); + scene.overlay().showControls(topOf, Pointing.DOWN, 40).rightClick() + .withItem(new ItemStack(Items.BLUE_DYE)); scene.idle(7); scene.world().modifyBlock(valvePos, s -> AllBlocks.DYED_VALVE_HANDLES.get(DyeColor.BLUE) .getDefaultState() @@ -1086,9 +1085,9 @@ public class KineticsScenes { .placeNearTarget(); scene.idle(80); - scene.overlay().showControls(new InputWindowElement(top, Pointing.DOWN).rightClick(), 40); + scene.overlay().showControls(top, Pointing.DOWN, 40).rightClick(); scene.idle(7); - scene.overlay().showSelectionWithText(gearshiftSelection, 50) + scene.overlay().showOutlineWithText(gearshiftSelection, 50) .colored(PonderPalette.BLUE) .text("Right-click it to open the Configuration UI") .pointAt(top) @@ -1259,21 +1258,20 @@ public class KineticsScenes { .text("Using the value panel on its side, the conveyed speed can be configured"); scene.idle(80); - InputWindowElement input = new InputWindowElement(inputVec, Pointing.UP).rightClick(); - scene.overlay().showControls(input, 40); + scene.overlay().showControls(inputVec, Pointing.UP, 40).rightClick(); scene.idle(15); scene.world().multiplyKineticSpeed(util.select().fromTo(1, 2, 1, 1, 2, 3), 4); scene.effects().rotationSpeedIndicator(cogPos); scene.idle(55); scene.markAsFinished(); - scene.overlay().showControls(input, 30); + scene.overlay().showControls(inputVec, Pointing.UP, 30).rightClick(); scene.idle(15); scene.world().multiplyKineticSpeed(util.select().fromTo(1, 2, 1, 1, 2, 3), 4); scene.effects().rotationSpeedIndicator(cogPos); scene.idle(55); - scene.overlay().showControls(input, 30); + scene.overlay().showControls(inputVec, Pointing.UP, 30).rightClick(); scene.idle(15); scene.world().multiplyKineticSpeed(util.select().fromTo(1, 2, 1, 1, 2, 3), -.05f); scene.effects().rotationSpeedIndicator(cogPos); @@ -1345,8 +1343,7 @@ public class KineticsScenes { scene.idle(30); Vec3 blockSurface = util.vector().blockSurface(gaugePos, Direction.NORTH); - scene.overlay().showControls( - new InputWindowElement(blockSurface, Pointing.RIGHT).withItem(AllItems.GOGGLES.asStack()), 80); + scene.overlay().showControls(blockSurface, Pointing.RIGHT, 80).withItem(AllItems.GOGGLES.asStack()); scene.idle(7); scene.overlay().showText(80) .text("When wearing Engineers' Goggles, the player can get more detailed information from the Gauge") diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/MechanicalDrillScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/MechanicalDrillScenes.java index 4e95a70250..74ebd73dff 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/MechanicalDrillScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/MechanicalDrillScenes.java @@ -3,13 +3,12 @@ package com.simibubi.create.infrastructure.ponder.scenes; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.element.ElementLink; +import net.createmod.ponder.api.element.EntityElement; +import net.createmod.ponder.api.element.WorldSectionElement; import net.createmod.ponder.api.scene.SceneBuilder; import net.createmod.ponder.api.scene.SceneBuildingUtil; -import net.createmod.ponder.foundation.ElementLink; -import net.createmod.ponder.foundation.Selection; -import net.createmod.ponder.foundation.element.EntityElement; -import net.createmod.ponder.foundation.element.InputWindowElement; -import net.createmod.ponder.foundation.element.WorldSectionElement; +import net.createmod.ponder.api.scene.Selection; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.entity.Entity; @@ -199,8 +198,8 @@ public class MechanicalDrillScenes { scene.idle(20); scene.world().setKineticSpeed(drills, 0); scene.idle(10); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(2, 3, 2), Pointing.DOWN) - .withItem(new ItemStack(Blocks.OAK_PLANKS)), 60); + scene.overlay().showControls(util.vector().topOf(2, 3, 2), Pointing.DOWN, 60) + .withItem(new ItemStack(Blocks.OAK_PLANKS)); scene.idle(20); } diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/MechanicalSawScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/MechanicalSawScenes.java index 6e111b4941..1a0cefd8e3 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/MechanicalSawScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/MechanicalSawScenes.java @@ -6,14 +6,13 @@ import com.simibubi.create.content.kinetics.simpleRelays.ShaftBlock; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.PonderPalette; +import net.createmod.ponder.api.element.ElementLink; +import net.createmod.ponder.api.element.EntityElement; +import net.createmod.ponder.api.element.WorldSectionElement; import net.createmod.ponder.api.scene.SceneBuilder; import net.createmod.ponder.api.scene.SceneBuildingUtil; -import net.createmod.ponder.foundation.ElementLink; -import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.Selection; -import net.createmod.ponder.foundation.element.EntityElement; -import net.createmod.ponder.foundation.element.InputWindowElement; -import net.createmod.ponder.foundation.element.WorldSectionElement; +import net.createmod.ponder.api.scene.Selection; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -62,7 +61,7 @@ public class MechanicalSawScenes { ElementLink logItem = scene.world().createItemEntity(itemSpawn, util.vector().of(0, 0, 0), log); scene.idle(12); - scene.overlay().showControls(new InputWindowElement(itemSpawn, Pointing.DOWN).withItem(log), 20); + scene.overlay().showControls(itemSpawn, Pointing.DOWN, 20).withItem(log); scene.idle(10); scene.world().modifyEntity(logItem, e -> e.setDeltaMovement(util.vector().of(0.05, 0.2, 0))); @@ -75,8 +74,7 @@ public class MechanicalSawScenes { logItem = scene.world().createItemEntity(util.vector().topOf(sawPos) .add(0.5, -.1, 0), util.vector().of(0.05, 0.18, 0), strippedLog); scene.idle(12); - scene.overlay().showControls(new InputWindowElement(itemSpawn.add(2, 0, 0), Pointing.DOWN).withItem(strippedLog), - 20); + scene.overlay().showControls(itemSpawn.add(2, 0, 0), Pointing.DOWN, 20).withItem(strippedLog); scene.idle(30); scene.overlay().showText(60) @@ -154,7 +152,7 @@ public class MechanicalSawScenes { scene.idle(90); ItemStack bricks = new ItemStack(Blocks.STONE_BRICKS); - scene.overlay().showControls(new InputWindowElement(filter, Pointing.DOWN).withItem(bricks), 30); + scene.overlay().showControls(filter, Pointing.DOWN, 30).withItem(bricks); scene.world().modifyEntities(ItemEntity.class, Entity::discard); scene.idle(7); scene.world().setFilterData(util.select().position(sawPos), SawBlockEntity.class, bricks); @@ -240,7 +238,7 @@ public class MechanicalSawScenes { scene.world().hideSection(util.select().fromTo(2, 1, 2, 1, 1, 3) .substract(util.select().position(breakingPos)), Direction.WEST); scene.idle(10); - scene.overlay().showSelectionWithText(util.select().position(breakingPos), 90) + scene.overlay().showOutlineWithText(util.select().position(breakingPos), 90) .attachKeyFrame() .colored(PonderPalette.GREEN) .placeNearTarget() @@ -392,9 +390,7 @@ public class MechanicalSawScenes { scene.idle(20); scene.world().setKineticSpeed(saws, 0); scene.idle(10); - scene.overlay().showControls( - new InputWindowElement(util.vector().topOf(3, 2, 2), Pointing.DOWN).withItem(new ItemStack(Blocks.OAK_LOG)), - 60); + scene.overlay().showControls(util.vector().topOf(3, 2, 2), Pointing.DOWN, 60).withItem(new ItemStack(Blocks.OAK_LOG)); scene.idle(20); } diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/MovementActorScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/MovementActorScenes.java index 61fb3744dc..100875d897 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/MovementActorScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/MovementActorScenes.java @@ -9,15 +9,15 @@ import com.simibubi.create.content.contraptions.chassis.LinearChassisBlock; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.PonderPalette; +import net.createmod.ponder.api.element.ElementLink; +import net.createmod.ponder.api.element.EntityElement; +import net.createmod.ponder.api.element.ParrotElement; +import net.createmod.ponder.api.element.ParrotPose; +import net.createmod.ponder.api.element.WorldSectionElement; import net.createmod.ponder.api.scene.SceneBuilder; import net.createmod.ponder.api.scene.SceneBuildingUtil; -import net.createmod.ponder.foundation.ElementLink; -import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.Selection; -import net.createmod.ponder.foundation.element.EntityElement; -import net.createmod.ponder.foundation.element.InputWindowElement; -import net.createmod.ponder.foundation.element.ParrotElement; -import net.createmod.ponder.foundation.element.WorldSectionElement; +import net.createmod.ponder.api.scene.Selection; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.entity.Entity; @@ -72,7 +72,7 @@ public class MovementActorScenes { BlockPos psi2 = psi.west(2); scene.world().showSection(util.select().position(psi2), Direction.DOWN); - scene.overlay().showSelectionWithText(util.select().position(psi.west()), 50) + scene.overlay().showOutlineWithText(util.select().position(psi.west()), 50) .colored(PonderPalette.RED) .placeNearTarget() .attachKeyFrame() @@ -101,7 +101,7 @@ public class MovementActorScenes { scene.overlay().showOutline(PonderPalette.GREEN, psi, util.select().fromTo(5, 3, 2, 6, 3, 2), 80); scene.idle(10); - scene.overlay().showSelectionWithText(util.select().position(psi2), 70) + scene.overlay().showOutlineWithText(util.select().position(psi2), 70) .placeNearTarget() .colored(PonderPalette.GREEN) .attachKeyFrame() @@ -130,8 +130,7 @@ public class MovementActorScenes { scene.idle(10); scene.world().modifyEntity(entity2, Entity::discard); - scene.overlay() - .showControls(new InputWindowElement(util.vector().topOf(5, 3, 2), Pointing.DOWN).withItem(itemStack), 40); + scene.overlay().showControls(util.vector().topOf(5, 3, 2), Pointing.DOWN, 40).withItem(itemStack); scene.idle(30); scene.world().hideSection(util.select().position(hopper), Direction.UP); @@ -198,7 +197,7 @@ public class MovementActorScenes { scene.idle(10); - scene.overlay().showSelectionWithText(util.select().position(1, 1, 3), 120) + scene.overlay().showOutlineWithText(util.select().position(1, 1, 3), 120) .colored(PonderPalette.RED) .text("Redstone power will prevent the stationary interface from engaging"); @@ -331,8 +330,7 @@ public class MovementActorScenes { scene.world().setBlock(current, harvested, true); scene.idle(116); - scene.overlay() - .showControls(new InputWindowElement(util.vector().topOf(1, 2, 5), Pointing.DOWN).withItem(wheatItem), 50); + scene.overlay().showControls(util.vector().topOf(1, 2, 5), Pointing.DOWN, 50).withItem(wheatItem); for (int i = 0; i < 3; i++) scene.world().modifyBlockEntity(util.grid().at(i, 1, 4), HarvesterBlockEntity.class, hte -> hte.setAnimatedSpeed(0)); @@ -432,9 +430,7 @@ public class MovementActorScenes { scene.world().destroyBlock(util.grid().at(1, 1, 2)); scene.idle(15); - scene.overlay().showControls( - new InputWindowElement(util.vector().topOf(2, 2, 2), Pointing.DOWN).withItem(new ItemStack(Items.SNOWBALL)), - 40); + scene.overlay().showControls(util.vector().topOf(2, 2, 2), Pointing.DOWN, 40).withItem(new ItemStack(Items.SNOWBALL)); scene.idle(40); scene.world().hideIndependentSection(chest, Direction.UP); scene.world().modifyKineticSpeed(util.select().everywhere(), f -> -f); @@ -497,7 +493,7 @@ public class MovementActorScenes { scene.idle(10); ElementLink birb = scene.special().createBirb(util.vector().topOf(3, 0, 2) - .add(0, 0, 0.5), ParrotElement.FlappyPose::new); + .add(0, 0, 0.5), ParrotPose.FlappyPose::new); scene.idle(11); scene.world().modifyKineticSpeed(util.select().everywhere(), f -> -2 * f); @@ -617,8 +613,7 @@ public class MovementActorScenes { scene.idle(10); scene.world().modifyBlockEntity(harvesterPos, HarvesterBlockEntity.class, hte -> hte.setAnimatedSpeed(0)); scene.world().setKineticSpeed(util.select().position(drillPos), 0); - scene.overlay().showControls(new InputWindowElement(util.vector().of(1.5, 2.75, 4.5), Pointing.DOWN).rightClick(), - 15); + scene.overlay().showControls(util.vector().of(1.5, 2.75, 4.5), Pointing.DOWN, 15).rightClick(); scene.idle(7); scene.world().modifyBlockEntity(controlsPos1, ContraptionControlsBlockEntity.class, ccte -> ccte.disabled = true); scene.effects().indicateRedstone(util.grid().at(1, 2, 4)); @@ -627,8 +622,7 @@ public class MovementActorScenes { scene.world().rotateSection(contraptionLink, 0, -60, 0, 40); scene.idle(40); - scene.overlay().showControls(new InputWindowElement(util.vector().of(3.5, 2.75, 1), Pointing.DOWN).rightClick(), - 15); + scene.overlay().showControls(util.vector().of(3.5, 2.75, 1), Pointing.DOWN, 15).rightClick(); scene.idle(7); scene.world().modifyBlockEntity(controlsPos1, ContraptionControlsBlockEntity.class, ccte -> ccte.disabled = false); @@ -663,11 +657,11 @@ public class MovementActorScenes { .text("They can be attached anywhere on the contraption"); scene.idle(75); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(controlsPos2), Pointing.DOWN).rightClick() - .withItem(AllBlocks.MECHANICAL_DRILL.asStack()), 30); + scene.overlay().showControls(util.vector().topOf(controlsPos2), Pointing.DOWN, 30).rightClick() + .withItem(AllBlocks.MECHANICAL_DRILL.asStack()); scene.idle(5); - scene.overlay().showControls(new InputWindowElement(util.vector().centerOf(controlsPos1), Pointing.UP).rightClick() - .withItem(AllBlocks.MECHANICAL_HARVESTER.asStack()), 25); + scene.overlay().showControls(util.vector().centerOf(controlsPos1), Pointing.UP, 25).rightClick() + .withItem(AllBlocks.MECHANICAL_HARVESTER.asStack()); scene.idle(2); scene.world().setFilterData(util.select().position(controlsPos2), ContraptionControlsBlockEntity.class, AllBlocks.MECHANICAL_DRILL.asStack()); @@ -683,8 +677,7 @@ public class MovementActorScenes { .text("While disassembled, the filter can be changed to target specific types of actors"); scene.idle(90); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(controlsPos2), Pointing.RIGHT).rightClick(), - 15); + scene.overlay().showControls(util.vector().topOf(controlsPos2), Pointing.RIGHT, 15).rightClick(); scene.idle(7); scene.world().modifyBlockEntity(controlsPos2, ContraptionControlsBlockEntity.class, ccte -> ccte.disabled = true); scene.effects().indicateRedstone(controlsPos2); diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/PistonScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/PistonScenes.java index 36d3519fb8..5ff861952c 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/PistonScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/PistonScenes.java @@ -5,14 +5,14 @@ import com.simibubi.create.content.contraptions.piston.MechanicalPistonHeadBlock import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.PonderPalette; +import net.createmod.ponder.api.element.ElementLink; +import net.createmod.ponder.api.element.ParrotElement; +import net.createmod.ponder.api.element.ParrotPose; +import net.createmod.ponder.api.element.WorldSectionElement; import net.createmod.ponder.api.scene.SceneBuilder; import net.createmod.ponder.api.scene.SceneBuildingUtil; -import net.createmod.ponder.foundation.ElementLink; -import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.Selection; -import net.createmod.ponder.foundation.element.InputWindowElement; -import net.createmod.ponder.foundation.element.ParrotElement; -import net.createmod.ponder.foundation.element.WorldSectionElement; +import net.createmod.ponder.api.scene.Selection; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.item.ItemStack; @@ -79,10 +79,8 @@ public class PistonScenes { scene.world().moveSection(contraption, util.vector().of(2, 0, 0), 40); scene.idle(60); - scene.overlay().showControls( - new InputWindowElement(util.vector().blockSurface(piston, Direction.WEST), Pointing.DOWN).rightClick() - .withItem(new ItemStack(Items.SLIME_BALL)), - 30); + scene.overlay().showControls(util.vector().blockSurface(piston, Direction.WEST), Pointing.DOWN, 30).rightClick() + .withItem(new ItemStack(Items.SLIME_BALL)); scene.idle(7); scene.world().modifyBlock(piston.north(), s -> s.setValue(MechanicalPistonHeadBlock.TYPE, PistonType.STICKY), false); @@ -117,8 +115,8 @@ public class PistonScenes { scene.overlay().showOutline(PonderPalette.GREEN, "glue", util.select().fromTo(2, 2, 3, 2, 1, 3) .add(util.select().fromTo(2, 1, 3, 2, 1, 1)) .add(util.select().position(1, 1, 1)), 40); - scene.overlay().showControls(new InputWindowElement(util.vector().centerOf(util.grid().at(2, 2, 0)), Pointing.RIGHT) - .withItem(AllItems.SUPER_GLUE.asStack()), 40); + scene.overlay().showControls(util.vector().centerOf(util.grid().at(2, 2, 0)), Pointing.RIGHT, 40) + .withItem(AllItems.SUPER_GLUE.asStack()); ElementLink chassis = scene.world().showIndependentSection(util.select().fromTo(2, 2, 0, 2, 3, 2), Direction.DOWN); @@ -168,7 +166,7 @@ public class PistonScenes { scene.world().setKineticSpeed(kinetics, 16); scene.idle(10); - scene.overlay().showSelectionWithText(util.select().position(piston), 50) + scene.overlay().showOutlineWithText(util.select().position(piston), 50) .colored(PonderPalette.RED) .placeNearTarget() .attachKeyFrame() @@ -188,7 +186,7 @@ public class PistonScenes { scene.overlay().showOutline(PonderPalette.RED, new Object(), util.select().fromTo(piston.east(), piston.east(2)), 100); - scene.overlay().showSelectionWithText(util.select().fromTo(piston.west(), piston.west(2)), 100) + scene.overlay().showOutlineWithText(util.select().fromTo(piston.west(), piston.west(2)), 100) .text("The Length of pole added at its back determines the Extension Range") .attachKeyFrame() .placeNearTarget() @@ -199,7 +197,7 @@ public class PistonScenes { .west()), Direction.EAST, contraption); scene.idle(10); ElementLink birb = - scene.special().createBirb(util.vector().topOf(piston.west()), ParrotElement.FaceCursorPose::new); + scene.special().createBirb(util.vector().topOf(piston.west()), ParrotPose.FaceCursorPose::new); scene.idle(15); scene.effects().indicateRedstone(leverPos); @@ -256,7 +254,7 @@ public class PistonScenes { scene.world().destroyBlock(util.grid().at(0, 1, 2)); scene.world().destroyBlock(util.grid().at(0, 2, 2)); scene.idle(10); - scene.overlay().showSelectionWithText(rose, 70) + scene.overlay().showOutlineWithText(rose, 70) .text("Whenever Pistons stop moving, the moved structure reverts to blocks") .attachKeyFrame() .colored(PonderPalette.RED); @@ -277,7 +275,7 @@ public class PistonScenes { Vec3 filter = util.vector().topOf(piston) .add(.125, 0, 0); scene.overlay().showFilterSlotInput(filter, Direction.UP, 60); - scene.overlay().showControls(new InputWindowElement(filter.add(0, .125, 0), Pointing.DOWN).rightClick(), 60); + scene.overlay().showControls(filter.add(0, .125, 0), Pointing.DOWN, 60).rightClick(); scene.overlay().showText(70) .pointAt(filter.add(-.125, 0, 0)) .placeNearTarget() diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ProcessingScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ProcessingScenes.java index a10f2a09e8..f564545af2 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ProcessingScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ProcessingScenes.java @@ -20,15 +20,14 @@ import net.createmod.catnip.utility.IntAttached; import net.createmod.catnip.utility.Iterate; import net.createmod.catnip.utility.NBTHelper; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.ParticleEmitter; +import net.createmod.ponder.api.PonderPalette; +import net.createmod.ponder.api.element.ElementLink; +import net.createmod.ponder.api.element.EntityElement; +import net.createmod.ponder.api.element.WorldSectionElement; import net.createmod.ponder.api.scene.SceneBuilder; import net.createmod.ponder.api.scene.SceneBuildingUtil; -import net.createmod.ponder.foundation.ElementLink; -import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.Selection; -import net.createmod.ponder.foundation.element.EntityElement; -import net.createmod.ponder.foundation.element.InputWindowElement; -import net.createmod.ponder.foundation.element.WorldSectionElement; -import net.createmod.ponder.foundation.instruction.EmitParticlesInstruction.Emitter; +import net.createmod.ponder.api.scene.Selection; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.particles.ItemParticleOption; @@ -99,7 +98,7 @@ public class ProcessingScenes { scene.world().modifyBlockEntity(millstone, MillstoneBlockEntity.class, ms -> ms.inputInv.setStackInSlot(0, itemStack)); scene.idle(10); - scene.overlay().showControls(new InputWindowElement(millstoneTop, Pointing.DOWN).withItem(itemStack), 30); + scene.overlay().showControls(millstoneTop, Pointing.DOWN, 30).withItem(itemStack); scene.idle(7); scene.overlay().showText(40) @@ -119,10 +118,8 @@ public class ProcessingScenes { scene.idle(60); ItemStack flour = AllItems.WHEAT_FLOUR.asStack(); - scene.overlay().showControls( - new InputWindowElement(util.vector().blockSurface(millstone, Direction.NORTH), Pointing.RIGHT).rightClick() - .withItem(flour), - 40); + scene.overlay().showControls(util.vector().blockSurface(millstone, Direction.NORTH), Pointing.RIGHT, 40).rightClick() + .withItem(flour); scene.idle(50); scene.addKeyframe(); @@ -213,12 +210,12 @@ public class ProcessingScenes { scene.world().createItemEntity(entitySpawn, util.vector().of(0, 0.2, 0), input); scene.idle(18); scene.world().modifyEntity(entity1, Entity::discard); - Emitter blockSpace = - Emitter.withinBlockSpace(new ItemParticleOption(ParticleTypes.ITEM, input), util.vector().of(0, 0, 0)); + ParticleEmitter blockSpace = + scene.effects().particleEmitterWithinBlockSpace(new ItemParticleOption(ParticleTypes.ITEM, input), util.vector().of(0, 0, 0)); scene.effects().emitParticles(util.vector().centerOf(center) .add(0, -0.2, 0), blockSpace, 3, 40); scene.idle(10); - scene.overlay().showControls(new InputWindowElement(centerTop, Pointing.DOWN).withItem(input), 30); + scene.overlay().showControls(centerTop, Pointing.DOWN, 30).withItem(input); scene.idle(7); scene.overlay().showText(50) @@ -231,7 +228,7 @@ public class ProcessingScenes { scene.world().createItemEntity(centerTop.add(0, -1.4, 0), util.vector().of(0, 0, 0), output); scene.idle(10); scene.world().createItemEntity(centerTop.add(0, -1.4, 0), util.vector().of(0, 0, 0), output); - scene.overlay().showControls(new InputWindowElement(centerTop.add(0, -2, 0), Pointing.UP).withItem(output), 30); + scene.overlay().showControls(centerTop.add(0, -2, 0), Pointing.UP, 30).withItem(output); scene.idle(40); scene.world().restoreBlocks(util.select().position(2, 3, 2)); @@ -314,7 +311,7 @@ public class ProcessingScenes { ItemStack copper = new ItemStack(Items.COPPER_INGOT); scene.world().createItemOnBeltLike(depotPos, Direction.NORTH, copper); Vec3 depotCenter = util.vector().centerOf(depotPos.south()); - scene.overlay().showControls(new InputWindowElement(depotCenter, Pointing.UP).withItem(copper), 30); + scene.overlay().showControls(depotCenter, Pointing.UP, 30).withItem(copper); scene.idle(10); Class type = MechanicalPressBlockEntity.class; @@ -327,7 +324,7 @@ public class ProcessingScenes { ItemStack sheet = AllItems.COPPER_SHEET.asStack(); scene.world().createItemOnBeltLike(depotPos, Direction.UP, sheet); scene.idle(10); - scene.overlay().showControls(new InputWindowElement(depotCenter, Pointing.UP).withItem(sheet), 50); + scene.overlay().showControls(depotCenter, Pointing.UP, 50).withItem(sheet); scene.idle(60); scene.world().hideIndependentSection(depot, Direction.NORTH); @@ -415,8 +412,8 @@ public class ProcessingScenes { .text("With a Mixer and Basin, some Crafting Recipes can be automated"); scene.idle(40); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(basin), Pointing.LEFT).withItem(blue), 30); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(basin), Pointing.RIGHT).withItem(red), 30); + scene.overlay().showControls(util.vector().topOf(basin), Pointing.LEFT, 30).withItem(blue); + scene.overlay().showControls(util.vector().topOf(basin), Pointing.RIGHT, 30).withItem(red); scene.idle(30); Class type = MechanicalMixerBlockEntity.class; scene.world().modifyBlockEntity(pressPos, type, pte -> pte.startProcessingBasin()); @@ -497,8 +494,7 @@ public class ProcessingScenes { .text("Pressing items held in a Basin will cause them to be Compacted"); scene.idle(40); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(basin), Pointing.DOWN).withItem(copper), - 30); + scene.overlay().showControls(util.vector().topOf(basin), Pointing.DOWN, 30).withItem(copper); scene.idle(30); Class type = MechanicalPressBlockEntity.class; scene.world().modifyBlockEntity(pressPos, type, pte -> pte.getPressingBehaviour() @@ -525,7 +521,7 @@ public class ProcessingScenes { ItemStack log = new ItemStack(Items.OAK_LOG); ItemStack bark = new ItemStack(Items.OAK_WOOD); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(basin), Pointing.DOWN).withItem(log), 30); + scene.overlay().showControls(util.vector().topOf(basin), Pointing.DOWN, 30).withItem(log); scene.idle(30); scene.world().modifyBlockEntity(pressPos, type, pte -> pte.getPressingBehaviour() .start(Mode.BASIN)); @@ -582,9 +578,8 @@ public class ProcessingScenes { }); scene.idle(20); - scene.overlay() - .showControls(new InputWindowElement(util.vector().centerOf(center.above(2)), Pointing.DOWN).rightClick() - .withItem(AllItems.EMPTY_BLAZE_BURNER.asStack()), 40); + scene.overlay().showControls(util.vector().centerOf(center.above(2)), Pointing.DOWN, 40).rightClick() + .withItem(AllItems.EMPTY_BLAZE_BURNER.asStack()); scene.idle(10); scene.overlay().showText(60) .text("Right-click a Blaze with the empty burner to capture it") @@ -598,8 +593,8 @@ public class ProcessingScenes { scene.world().showSection(util.select().position(2, 1, 2), Direction.DOWN); scene.idle(20); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(center.above()), Pointing.DOWN).rightClick() - .withItem(AllItems.EMPTY_BLAZE_BURNER.asStack()), 40); + scene.overlay().showControls(util.vector().topOf(center.above()), Pointing.DOWN, 40).rightClick() + .withItem(AllItems.EMPTY_BLAZE_BURNER.asStack()); scene.idle(10); scene.overlay().showText(60) .text("Alternatively, Blazes can be collected from their Spawners directly") @@ -624,10 +619,8 @@ public class ProcessingScenes { scene.world().showSection(util.select().position(3, 1, 2), Direction.DOWN); scene.idle(20); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(center.east() - .above()), Pointing.DOWN).rightClick() - .withItem(new ItemStack(Items.FLINT_AND_STEEL)), - 40); + scene.overlay().showControls(util.vector().topOf(center.east().above()), Pointing.DOWN, 40).rightClick() + .withItem(new ItemStack(Items.FLINT_AND_STEEL)); scene.idle(7); scene.world().setBlock(util.grid().at(3, 1, 2), AllBlocks.LIT_BLAZE_BURNER.getDefaultState(), false); scene.idle(10); @@ -638,10 +631,8 @@ public class ProcessingScenes { .above(), Direction.UP)) .placeNearTarget(); scene.idle(80); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(center.east() - .above()), Pointing.DOWN).rightClick() - .withItem(new ItemStack(Items.SOUL_SAND)), - 40); + scene.overlay().showControls(util.vector().topOf(center.east().above()), Pointing.DOWN, 40).rightClick() + .withItem(new ItemStack(Items.SOUL_SAND)); scene.idle(7); scene.world().modifyBlock(util.grid().at(3, 1, 2), s -> s.setValue(LitBlazeBurnerBlock.FLAME_TYPE, LitBlazeBurnerBlock.FlameType.SOUL), false); @@ -682,8 +673,8 @@ public class ProcessingScenes { scene.world().hideSection(util.select().position(burner.above()), Direction.UP); scene.idle(20); scene.world().setBlock(burner.above(), Blocks.AIR.defaultBlockState(), false); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(burner), Pointing.DOWN).rightClick() - .withItem(new ItemStack(Items.OAK_PLANKS)), 15); + scene.overlay().showControls(util.vector().topOf(burner), Pointing.DOWN, 15).rightClick() + .withItem(new ItemStack(Items.OAK_PLANKS)); scene.idle(7); scene.world().modifyBlock(burner, s -> s.setValue(BlazeBurnerBlock.HEAT_LEVEL, HeatLevel.KINDLED), false); scene.idle(20); @@ -696,8 +687,8 @@ public class ProcessingScenes { scene.idle(80); scene.idle(20); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(burner), Pointing.DOWN).rightClick() - .withItem(AllItems.BLAZE_CAKE.asStack()), 30); + scene.overlay().showControls(util.vector().topOf(burner), Pointing.DOWN, 30).rightClick() + .withItem(AllItems.BLAZE_CAKE.asStack()); scene.idle(7); scene.world().modifyBlock(burner, s -> s.setValue(BlazeBurnerBlock.HEAT_LEVEL, HeatLevel.SEETHING), false); scene.idle(20); @@ -756,8 +747,7 @@ public class ProcessingScenes { scene.idle(10); } scene.idle(10); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(basinPos), Pointing.DOWN).withItem(stack), - 30); + scene.overlay().showControls(util.vector().topOf(basinPos), Pointing.DOWN, 30).withItem(stack); scene.idle(30); for (Direction d : Iterate.horizontalDirections) { @@ -840,8 +830,7 @@ public class ProcessingScenes { .serializeNBT())); }); scene.idle(4); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(basinPos.below() - .north()), Pointing.RIGHT).withItem(new ItemStack(Items.BRICKS)), 30); + scene.overlay().showControls(util.vector().topOf(basinPos.below().north()), Pointing.RIGHT, 30).withItem(new ItemStack(Items.BRICKS)); scene.overlay().showText(60) .attachKeyFrame() @@ -864,8 +853,7 @@ public class ProcessingScenes { scene.idle(50); ItemStack nugget = AllItems.COPPER_NUGGET.asStack(); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(basinPos), Pointing.RIGHT).withItem(nugget), - 30); + scene.overlay().showControls(util.vector().topOf(basinPos), Pointing.RIGHT, 30).withItem(nugget); scene.idle(30); scene.world().modifyBlockEntity(pressPos, type, pte -> pte.getPressingBehaviour() .start(Mode.BASIN)); @@ -875,8 +863,7 @@ public class ProcessingScenes { ItemStack ingot = new ItemStack(Items.COPPER_INGOT); scene.idle(30); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(basinPos), Pointing.RIGHT).withItem(ingot), - 30); + scene.overlay().showControls(util.vector().topOf(basinPos), Pointing.RIGHT, 30).withItem(ingot); scene.idle(30); scene.world().modifyBlockEntity(pressPos, type, pte -> pte.getPressingBehaviour() .start(Mode.BASIN)); @@ -886,8 +873,7 @@ public class ProcessingScenes { ItemStack block = new ItemStack(Items.COPPER_BLOCK); scene.idle(30); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(basinPos), Pointing.RIGHT).withItem(block), - 30); + scene.overlay().showControls(util.vector().topOf(basinPos), Pointing.RIGHT, 30).withItem(block); scene.overlay().showText(70) .attachKeyFrame() .colored(PonderPalette.GREEN) diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/PulleyScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/PulleyScenes.java index e33ab324de..4435fd99fb 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/PulleyScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/PulleyScenes.java @@ -4,13 +4,12 @@ import com.simibubi.create.AllItems; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.PonderPalette; +import net.createmod.ponder.api.element.ElementLink; +import net.createmod.ponder.api.element.WorldSectionElement; import net.createmod.ponder.api.scene.SceneBuilder; import net.createmod.ponder.api.scene.SceneBuildingUtil; -import net.createmod.ponder.foundation.ElementLink; -import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.Selection; -import net.createmod.ponder.foundation.element.InputWindowElement; -import net.createmod.ponder.foundation.element.WorldSectionElement; +import net.createmod.ponder.api.scene.Selection; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.block.Blocks; @@ -86,8 +85,8 @@ public class PulleyScenes { scene.overlay().showOutline(PonderPalette.GREEN, "glue", util.select().position(3, 1, 1) .add(util.select().fromTo(1, 1, 2, 3, 1, 2)) .add(util.select().position(1, 2, 2)), 40); - scene.overlay().showControls(new InputWindowElement(util.vector().centerOf(util.grid().at(2, 2, 0)), Pointing.RIGHT) - .withItem(AllItems.SUPER_GLUE.asStack()), 40); + scene.overlay().showControls(util.vector().centerOf(util.grid().at(2, 2, 0)), Pointing.RIGHT, 40) + .withItem(AllItems.SUPER_GLUE.asStack()); scene.idle(15); scene.effects().superGlue(util.grid().at(3, 1, 1), Direction.SOUTH, true); scene.overlay().showText(80) @@ -148,7 +147,7 @@ public class PulleyScenes { scene.world().destroyBlock(flowerPos); scene.idle(10); - scene.overlay().showSelectionWithText(util.select().position(flowerPos), 70) + scene.overlay().showOutlineWithText(util.select().position(flowerPos), 70) .text("Whenever Pulleys stop moving, the moved structure reverts to blocks") .attachKeyFrame() .placeNearTarget() @@ -167,8 +166,7 @@ public class PulleyScenes { scene.world().setBlock(flowerPos, Blocks.BLUE_ORCHID.defaultBlockState(), false); scene.world().showSection(util.select().position(flowerPos), Direction.DOWN); scene.overlay().showCenteredScrollInput(pulleyPos, Direction.UP, 60); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(pulleyPos), Pointing.DOWN).rightClick(), - 60); + scene.overlay().showControls(util.vector().topOf(pulleyPos), Pointing.DOWN, 60).rightClick(); scene.overlay().showText(70) .pointAt(util.vector().topOf(pulleyPos)) .placeNearTarget() @@ -231,7 +229,7 @@ public class PulleyScenes { scene.world().moveSection(pulley, util.vector().of(-2, 0, 0), 40); scene.idle(40); - scene.overlay().showSelectionWithText(util.select().fromTo(1, 1, 1, 1, 1, 2), 50) + scene.overlay().showOutlineWithText(util.select().fromTo(1, 1, 1, 1, 1, 2), 50) .colored(PonderPalette.GREEN) .placeNearTarget() .attachKeyFrame() diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/RedstoneScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/RedstoneScenes.java index 3e71ceece6..a06088d656 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/RedstoneScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/RedstoneScenes.java @@ -20,14 +20,13 @@ import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; import net.createmod.catnip.utility.lang.Components; +import net.createmod.ponder.api.PonderPalette; +import net.createmod.ponder.api.element.ElementLink; +import net.createmod.ponder.api.element.ParrotPose; +import net.createmod.ponder.api.element.WorldSectionElement; import net.createmod.ponder.api.scene.SceneBuilder; import net.createmod.ponder.api.scene.SceneBuildingUtil; -import net.createmod.ponder.foundation.ElementLink; -import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.Selection; -import net.createmod.ponder.foundation.element.InputWindowElement; -import net.createmod.ponder.foundation.element.ParrotElement; -import net.createmod.ponder.foundation.element.WorldSectionElement; +import net.createmod.ponder.api.scene.Selection; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; @@ -250,7 +249,7 @@ public class RedstoneScenes { scene.idle(50); scene.overlay().showRepeaterScrollInput(circuitPos, 60); - scene.overlay().showControls(new InputWindowElement(circuitTop, Pointing.DOWN).rightClick(), 60); + scene.overlay().showControls(circuitTop, Pointing.DOWN, 60).rightClick(); scene.idle(10); scene.overlay().showText(60) .text("Using the value panel, the discharge time can be configured") @@ -323,7 +322,7 @@ public class RedstoneScenes { scene.idle(70); scene.overlay().showRepeaterScrollInput(circuitPos, 60); - scene.overlay().showControls(new InputWindowElement(circuitTop, Pointing.DOWN).rightClick(), 60); + scene.overlay().showControls(circuitTop, Pointing.DOWN, 60).rightClick(); scene.idle(10); scene.overlay().showText(60) .text("Using the value panel, the charge time can be configured") @@ -412,7 +411,7 @@ public class RedstoneScenes { scene.addKeyframe(); scene.idle(10); - scene.overlay().showControls(new InputWindowElement(circuitTop, Pointing.DOWN).rightClick(), 40); + scene.overlay().showControls(circuitTop, Pointing.DOWN, 40).rightClick(); scene.idle(7); scene.world().toggleRedstonePower(util.select().fromTo(2, 1, 2, 0, 1, 2)); scene.world().cycleBlockProperty(circuitPos, PoweredLatchBlock.POWERING); @@ -424,7 +423,7 @@ public class RedstoneScenes { .pointAt(circuitTop); scene.idle(60); - scene.overlay().showControls(new InputWindowElement(circuitTop, Pointing.DOWN).rightClick(), 40); + scene.overlay().showControls(circuitTop, Pointing.DOWN, 40).rightClick(); scene.idle(7); scene.world().toggleRedstonePower(util.select().fromTo(2, 1, 2, 0, 1, 2)); scene.world().cycleBlockProperty(circuitPos, PoweredLatchBlock.POWERING); @@ -485,7 +484,7 @@ public class RedstoneScenes { scene.addKeyframe(); scene.idle(10); - scene.overlay().showControls(new InputWindowElement(circuitTop, Pointing.DOWN).rightClick(), 40); + scene.overlay().showControls(circuitTop, Pointing.DOWN, 40).rightClick(); scene.idle(7); scene.world().toggleRedstonePower(util.select().fromTo(2, 1, 2, 0, 1, 2)); scene.world().cycleBlockProperty(circuitPos, ToggleLatchBlock.POWERING); @@ -497,7 +496,7 @@ public class RedstoneScenes { .pointAt(circuitTop); scene.idle(60); - scene.overlay().showControls(new InputWindowElement(circuitTop, Pointing.DOWN).rightClick(), 40); + scene.overlay().showControls(circuitTop, Pointing.DOWN, 40).rightClick(); scene.idle(7); scene.world().toggleRedstonePower(util.select().fromTo(2, 1, 2, 0, 1, 2)); scene.world().cycleBlockProperty(circuitPos, ToggleLatchBlock.POWERING); @@ -537,7 +536,7 @@ public class RedstoneScenes { scene.idle(70); IntegerProperty power = RedStoneWireBlock.POWER; - scene.overlay().showControls(new InputWindowElement(leverVec, Pointing.DOWN).rightClick(), 40); + scene.overlay().showControls(leverVec, Pointing.DOWN, 40).rightClick(); scene.idle(7); for (int i = 0; i < 7; i++) { scene.idle(2); @@ -556,8 +555,8 @@ public class RedstoneScenes { .pointAt(leverVec); scene.idle(70); - scene.overlay().showControls(new InputWindowElement(leverVec, Pointing.DOWN).rightClick() - .whileSneaking(), 40); + scene.overlay().showControls(leverVec, Pointing.DOWN, 40).rightClick() + .whileSneaking(); scene.idle(7); for (int i = 7; i > 0; i--) { scene.idle(2); @@ -579,7 +578,7 @@ public class RedstoneScenes { .pointAt(leverVec); scene.idle(70); - scene.overlay().showControls(new InputWindowElement(leverVec, Pointing.DOWN).rightClick(), 40); + scene.overlay().showControls(leverVec, Pointing.DOWN, 40).rightClick(); scene.idle(7); for (int i = 0; i < 15; i++) { scene.idle(2); @@ -635,8 +634,8 @@ public class RedstoneScenes { ItemStack clipboard = AllBlocks.CLIPBOARD.asStack(); ClipboardOverrides.switchTo(ClipboardType.WRITTEN, clipboard); - scene.overlay().showControls(new InputWindowElement(centerTube.add(1, .35, 0), Pointing.DOWN).rightClick() - .withItem(clipboard), 40); + scene.overlay().showControls(centerTube.add(1, .35, 0), Pointing.DOWN, 40).rightClick() + .withItem(clipboard); scene.idle(7); Component component = Components.literal("CREATE"); @@ -652,7 +651,7 @@ public class RedstoneScenes { scene.idle(10); scene.world().showSection(util.select().position(4, 1, 3), Direction.DOWN); scene.idle(10); - scene.special().createBirb(util.vector().topOf(util.grid().at(0, 0, 3)), ParrotElement.DancePose::new); + scene.special().createBirb(util.vector().topOf(util.grid().at(0, 0, 3)), ParrotPose.DancePose::new); scene.idle(20); scene.overlay().showText(80) @@ -663,10 +662,8 @@ public class RedstoneScenes { .add(-.75, -.05f, 0)); scene.idle(90); - InputWindowElement input = - new InputWindowElement(util.vector().blockSurface(util.grid().at(3, 1, 3), Direction.UP), Pointing.DOWN) - .withItem(new ItemStack(Items.BLUE_DYE)); - scene.overlay().showControls(input, 30); + scene.overlay().showControls(util.vector().blockSurface(util.grid().at(3, 1, 3), Direction.UP), Pointing.DOWN, 30) + .withItem(new ItemStack(Items.BLUE_DYE)); scene.idle(7); scene.world().setBlocks(util.select().fromTo(1, 1, 3, 3, 1, 3), AllBlocks.NIXIE_TUBES.get(DyeColor.BLUE) .getDefaultState() @@ -720,8 +717,8 @@ public class RedstoneScenes { .pointAt(link1Vec); scene.idle(60); - scene.overlay().showControls(new InputWindowElement(link2Vec, Pointing.UP).rightClick() - .whileSneaking(), 40); + scene.overlay().showControls(link2Vec, Pointing.UP, 40).rightClick() + .whileSneaking(); scene.idle(7); scene.world().modifyBlock(link2Pos, s -> s.cycle(RedstoneLinkBlock.RECEIVER), true); scene.idle(10); @@ -731,8 +728,8 @@ public class RedstoneScenes { .pointAt(link2Vec); scene.idle(60); - scene.overlay().showControls(new InputWindowElement(link3Vec, Pointing.UP).rightClick() - .withItem(AllItems.WRENCH.asStack()), 40); + scene.overlay().showControls(link3Vec, Pointing.UP, 40).rightClick() + .withItem(AllItems.WRENCH.asStack()); scene.idle(7); scene.world().modifyBlock(link3Pos, s -> s.cycle(RedstoneLinkBlock.RECEIVER), true); scene.idle(10); @@ -786,9 +783,9 @@ public class RedstoneScenes { ItemStack gold = new ItemStack(Items.GOLD_INGOT); ItemStack sapling = new ItemStack(Items.OAK_SAPLING); - scene.overlay().showControls(new InputWindowElement(frontSlot, Pointing.UP).withItem(iron), 30); + scene.overlay().showControls(frontSlot, Pointing.UP, 30).withItem(iron); scene.idle(7); - scene.overlay().showControls(new InputWindowElement(backSlot, Pointing.DOWN).withItem(sapling), 30); + scene.overlay().showControls(backSlot, Pointing.DOWN, 30).withItem(sapling); scene.world().modifyBlockEntityNBT(link1Select, RedstoneLinkBlockEntity.class, nbt -> nbt.put("FrequencyLast", iron.save(new CompoundTag()))); scene.idle(7); @@ -796,9 +793,9 @@ public class RedstoneScenes { nbt -> nbt.put("FrequencyFirst", sapling.save(new CompoundTag()))); scene.idle(20); - scene.overlay().showControls(new InputWindowElement(bottom2Slot, Pointing.UP).withItem(iron), 30); + scene.overlay().showControls(bottom2Slot, Pointing.UP, 30).withItem(iron); scene.idle(7); - scene.overlay().showControls(new InputWindowElement(top2Slot, Pointing.DOWN).withItem(sapling), 30); + scene.overlay().showControls(top2Slot, Pointing.DOWN, 30).withItem(sapling); scene.world().modifyBlockEntityNBT(link2Select, RedstoneLinkBlockEntity.class, nbt -> nbt.put("FrequencyLast", iron.save(new CompoundTag()))); scene.idle(7); @@ -806,9 +803,9 @@ public class RedstoneScenes { nbt -> nbt.put("FrequencyFirst", sapling.save(new CompoundTag()))); scene.idle(20); - scene.overlay().showControls(new InputWindowElement(bottom3Slot, Pointing.UP).withItem(gold), 30); + scene.overlay().showControls(bottom3Slot, Pointing.UP, 30).withItem(gold); scene.idle(7); - scene.overlay().showControls(new InputWindowElement(top3Slot, Pointing.DOWN).withItem(sapling), 30); + scene.overlay().showControls(top3Slot, Pointing.DOWN, 30).withItem(sapling); scene.world().modifyBlockEntityNBT(link3Select, RedstoneLinkBlockEntity.class, nbt -> nbt.put("FrequencyLast", gold.save(new CompoundTag()))); scene.idle(7); diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/RedstoneScenes2.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/RedstoneScenes2.java index e321ed16cf..e500120a8c 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/RedstoneScenes2.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/RedstoneScenes2.java @@ -6,12 +6,11 @@ import com.simibubi.create.content.redstone.nixieTube.NixieTubeBlockEntity; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.element.ElementLink; +import net.createmod.ponder.api.element.WorldSectionElement; import net.createmod.ponder.api.scene.SceneBuilder; import net.createmod.ponder.api.scene.SceneBuildingUtil; -import net.createmod.ponder.foundation.ElementLink; -import net.createmod.ponder.foundation.Selection; -import net.createmod.ponder.foundation.element.InputWindowElement; -import net.createmod.ponder.foundation.element.WorldSectionElement; +import net.createmod.ponder.api.scene.Selection; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -116,9 +115,8 @@ public class RedstoneScenes2 { .text("Comparators output based on the distance to a powered lamp"); scene.idle(90); - scene.overlay() - .showControls(new InputWindowElement(util.vector().topOf(centerLamp.east(2)), Pointing.DOWN).rightClick() - .withItem(AllItems.WRENCH.asStack()), 20); + scene.overlay().showControls(util.vector().topOf(centerLamp.east(2)), Pointing.DOWN, 20).rightClick() + .withItem(AllItems.WRENCH.asStack()); scene.idle(6); scene.world().cycleBlockProperty(centerLamp.east(), RoseQuartzLampBlock.POWERING); scene.world().toggleRedstonePower(comparator); @@ -126,8 +124,8 @@ public class RedstoneScenes2 { .modifyBlockEntityNBT(comparator, NixieTubeBlockEntity.class, nbt -> nbt.putInt("RedstoneStrength", 0)); scene.idle(20); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(centerLamp), Pointing.DOWN).rightClick() - .withItem(AllItems.WRENCH.asStack()), 20); + scene.overlay().showControls(util.vector().topOf(centerLamp), Pointing.DOWN, 20).rightClick() + .withItem(AllItems.WRENCH.asStack()); scene.idle(6); scene.world().cycleBlockProperty(centerLamp.west(), RoseQuartzLampBlock.POWERING); scene.world().toggleRedstonePower(comparator); diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/RollerScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/RollerScenes.java index 174cb4ddc6..7b04545e6c 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/RollerScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/RollerScenes.java @@ -6,14 +6,14 @@ import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.PonderPalette; +import net.createmod.ponder.api.element.ElementLink; +import net.createmod.ponder.api.element.ParrotElement; +import net.createmod.ponder.api.element.ParrotPose; +import net.createmod.ponder.api.element.WorldSectionElement; import net.createmod.ponder.api.scene.SceneBuilder; import net.createmod.ponder.api.scene.SceneBuildingUtil; -import net.createmod.ponder.foundation.ElementLink; -import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.Selection; -import net.createmod.ponder.foundation.element.InputWindowElement; -import net.createmod.ponder.foundation.element.ParrotElement; -import net.createmod.ponder.foundation.element.WorldSectionElement; +import net.createmod.ponder.api.scene.Selection; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.item.ItemStack; @@ -54,7 +54,7 @@ public class RollerScenes { scene.world().showSection(util.select().position(stationPos), Direction.DOWN); scene.idle(5); ElementLink birbLink = - scene.special().createBirb(util.vector().centerOf(8, 3, 4), ParrotElement.FacePointOfInterestPose::new); + scene.special().createBirb(util.vector().centerOf(8, 3, 4), ParrotPose.FacePointOfInterestPose::new); ElementLink trainLink = scene.world().showIndependentSection(train, Direction.DOWN); scene.idle(5); scene.world().showSectionAndMerge(rollers, Direction.EAST, trainLink); @@ -85,8 +85,8 @@ public class RollerScenes { scene.world().modifyBlockEntity(util.grid().at(6, 2, 3 + i), RollerBlockEntity.class, rte -> rte.setAnimatedSpeed(0)); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(util.grid().at(2, 2, 4)), Pointing.DOWN) - .showing(AllIcons.I_ROLLER_PAVE), 70); + scene.overlay().showControls(util.vector().topOf(util.grid().at(2, 2, 4)), Pointing.DOWN, 70) + .showing(AllIcons.I_ROLLER_PAVE); scene.overlay().showText(80) .pointAt(util.vector().topOf(util.grid().at(2, 2, 4))) @@ -133,7 +133,7 @@ public class RollerScenes { scene.world().hideIndependentSection(trainLink, Direction.UP); scene.idle(15); - birbLink = scene.special().createBirb(util.vector().centerOf(8, 3, 4), ParrotElement.FacePointOfInterestPose::new); + birbLink = scene.special().createBirb(util.vector().centerOf(8, 3, 4), ParrotPose.FacePointOfInterestPose::new); trainLink = scene.world().showIndependentSection(train, Direction.DOWN); scene.world().toggleControls(controlsPos); scene.idle(5); @@ -154,7 +154,7 @@ public class RollerScenes { Block paveMaterial = Blocks.TUFF; ItemStack paveItem = new ItemStack(paveMaterial); - scene.overlay().showControls(new InputWindowElement(filterSlot, Pointing.DOWN).withItem(paveItem), 40); + scene.overlay().showControls(filterSlot, Pointing.DOWN, 40).withItem(paveItem); scene.idle(7); scene.world().setFilterData(rollers, RollerBlockEntity.class, paveItem); scene.idle(20); @@ -246,7 +246,7 @@ public class RollerScenes { scene.world().hideSection(util.select().position(stationPos), Direction.UP); scene.idle(10); - scene.overlay().showSelectionWithText(util.select().fromTo(5, 0, 3, 0, 0, 5), 90) + scene.overlay().showOutlineWithText(util.select().fromTo(5, 0, 3, 0, 0, 5), 90) .pointAt(util.vector().topOf(util.grid().at(3, 0, 4))) .attachKeyFrame() .colored(PonderPalette.RED) @@ -268,7 +268,7 @@ public class RollerScenes { paveMaterial = Blocks.GRASS_BLOCK; paveItem = new ItemStack(paveMaterial); - scene.overlay().showControls(new InputWindowElement(filterSlot, Pointing.DOWN).withItem(paveItem), 40); + scene.overlay().showControls(filterSlot, Pointing.DOWN, 40).withItem(paveItem); scene.idle(7); scene.world().setFilterData(rollers, RollerBlockEntity.class, paveItem); scene.idle(20); @@ -339,7 +339,7 @@ public class RollerScenes { ElementLink trainLink = scene.world().showIndependentSection(train, Direction.DOWN); ElementLink birbLink = - scene.special().createBirb(util.vector().centerOf(8, 7, 4), ParrotElement.FacePointOfInterestPose::new); + scene.special().createBirb(util.vector().centerOf(8, 7, 4), ParrotPose.FacePointOfInterestPose::new); scene.idle(5); scene.world().showSectionAndMerge(rollers, Direction.EAST, trainLink); scene.idle(15); @@ -353,20 +353,18 @@ public class RollerScenes { .placeNearTarget(); scene.idle(70); - scene.overlay().showSelectionWithText(util.select().fromTo(5, 3, 3, 0, 1, 5), 90) + scene.overlay().showOutlineWithText(util.select().fromTo(5, 3, 3, 0, 1, 5), 90) .attachKeyFrame() .colored(PonderPalette.BLUE) .text("The 'fill' modes can help to bridge gaps between pavement and terrain") .placeNearTarget(); scene.idle(100); - scene.overlay().showControls(new InputWindowElement(filterSlot, Pointing.DOWN).showing(AllIcons.I_ROLLER_FILL), - 50); + scene.overlay().showControls(filterSlot, Pointing.DOWN, 50).showing(AllIcons.I_ROLLER_FILL); scene.idle(15); Block paveMaterial = Blocks.COARSE_DIRT; ItemStack paveItem = new ItemStack(paveMaterial); - scene.overlay() - .showControls(new InputWindowElement(filterSlot.add(0, 0, -6 / 16f), Pointing.UP).withItem(paveItem), 35); + scene.overlay().showControls(filterSlot.add(0, 0, -6 / 16f), Pointing.UP, 35).withItem(paveItem); scene.idle(7); scene.world().setFilterData(rollers, RollerBlockEntity.class, paveItem); scene.idle(10); @@ -423,14 +421,13 @@ public class RollerScenes { scene.world().cycleBlockProperty(stationPos, StationBlock.ASSEMBLING); scene.world().animateTrainStation(stationPos, true); - birbLink = scene.special().createBirb(util.vector().centerOf(8, 7, 4), ParrotElement.FacePointOfInterestPose::new); + birbLink = scene.special().createBirb(util.vector().centerOf(8, 7, 4), ParrotPose.FacePointOfInterestPose::new); trainLink = scene.world().showIndependentSection(train, Direction.DOWN); scene.idle(5); scene.world().showSectionAndMerge(rollers, Direction.EAST, trainLink); scene.idle(25); - scene.overlay() - .showControls(new InputWindowElement(filterSlot, Pointing.DOWN).showing(AllIcons.I_ROLLER_WIDE_FILL), 40); + scene.overlay().showControls(filterSlot, Pointing.DOWN, 40).showing(AllIcons.I_ROLLER_WIDE_FILL); scene.idle(45); scene.world().cycleBlockProperty(stationPos, StationBlock.ASSEMBLING); @@ -488,7 +485,7 @@ public class RollerScenes { scene.world().cycleBlockProperty(stationPos, StationBlock.ASSEMBLING); scene.world().animateTrainStation(stationPos, true); scene.world().showSection(util.select().fromTo(5, 1, 3, 0, 3, 5), Direction.NORTH); - birbLink = scene.special().createBirb(util.vector().centerOf(8, 7, 4), ParrotElement.FacePointOfInterestPose::new); + birbLink = scene.special().createBirb(util.vector().centerOf(8, 7, 4), ParrotPose.FacePointOfInterestPose::new); trainLink = scene.world().showIndependentSection(train, Direction.DOWN); scene.idle(5); scene.world().showSectionAndMerge(rollers, Direction.EAST, trainLink); diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/SteamScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/SteamScenes.java index f36d07cdff..37aba99e73 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/SteamScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/SteamScenes.java @@ -12,13 +12,12 @@ import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Iterate; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.PonderPalette; +import net.createmod.ponder.api.element.ElementLink; +import net.createmod.ponder.api.element.WorldSectionElement; import net.createmod.ponder.api.scene.SceneBuilder; import net.createmod.ponder.api.scene.SceneBuildingUtil; -import net.createmod.ponder.foundation.ElementLink; -import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.Selection; -import net.createmod.ponder.foundation.element.InputWindowElement; -import net.createmod.ponder.foundation.element.WorldSectionElement; +import net.createmod.ponder.api.scene.Selection; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -103,12 +102,9 @@ public class SteamScenes { scene.world().toggleRedstonePower(lever); scene.idle(40); - InputWindowElement rightClick = - new InputWindowElement(util.vector().blockSurface(util.grid().at(2, 3, 1), Direction.EAST), Pointing.RIGHT) - .withItem(AllBlocks.STEAM_WHISTLE.asStack()) - .rightClick(); - - scene.overlay().showControls(rightClick, 50); + scene.overlay().showControls(util.vector().blockSurface(util.grid().at(2, 3, 1), Direction.EAST), Pointing.RIGHT, 50) + .withItem(AllBlocks.STEAM_WHISTLE.asStack()) + .rightClick(); scene.idle(6); BlockState extension = AllBlocks.STEAM_WHISTLE_EXTENSION.getDefaultState(); scene.world().setBlock(whistlePos.above(), extension, false); @@ -122,31 +118,36 @@ public class SteamScenes { scene.idle(40); - scene.overlay().showControls(rightClick, 2); + scene.overlay().showControls(util.vector().blockSurface(util.grid().at(2, 3, 1), Direction.EAST), Pointing.RIGHT, 2) + .withItem(AllBlocks.STEAM_WHISTLE.asStack()) + .rightClick(); scene.idle(6); scene.world().cycleBlockProperty(whistlePos.above(), WhistleExtenderBlock.SHAPE); scene.idle(4); - scene.overlay().showControls(rightClick, 2); + scene.overlay().showControls(util.vector().blockSurface(util.grid().at(2, 3, 1), Direction.EAST), Pointing.RIGHT, 2) + .withItem(AllBlocks.STEAM_WHISTLE.asStack()) + .rightClick(); scene.idle(6); scene.world().setBlock(whistlePos.above(2), extension, false); scene.world().cycleBlockProperty(whistlePos.above(), WhistleExtenderBlock.SHAPE); scene.idle(4); - scene.overlay().showControls(rightClick, 2); + scene.overlay().showControls(util.vector().blockSurface(util.grid().at(2, 3, 1), Direction.EAST), Pointing.RIGHT, 2) + .withItem(AllBlocks.STEAM_WHISTLE.asStack()) + .rightClick(); scene.idle(6); scene.world().cycleBlockProperty(whistlePos.above(2), WhistleExtenderBlock.SHAPE); scene.idle(4); - scene.overlay().showControls(rightClick, 2); + scene.overlay().showControls(util.vector().blockSurface(util.grid().at(2, 3, 1), Direction.EAST), Pointing.RIGHT, 2) + .withItem(AllBlocks.STEAM_WHISTLE.asStack()) + .rightClick(); scene.idle(6); scene.world().cycleBlockProperty(whistlePos.above(2), WhistleExtenderBlock.SHAPE); scene.world().setBlock(whistlePos.above(3), extension, false); scene.idle(20); - rightClick = - new InputWindowElement(util.vector().blockSurface(util.grid().at(2, 3, 1), Direction.EAST), Pointing.RIGHT) - .withItem(AllItems.WRENCH.asStack()) - .rightClick(); - - scene.overlay().showControls(rightClick, 50); + scene.overlay().showControls(util.vector().blockSurface(util.grid().at(2, 3, 1), Direction.EAST), Pointing.RIGHT, 50) + .withItem(AllItems.WRENCH.asStack()) + .rightClick(); scene.idle(6); for (int i = 0; i < 4; i++) { scene.world().cycleBlockProperty(whistlePos.above(i), WhistleBlock.SIZE); @@ -161,7 +162,9 @@ public class SteamScenes { .placeNearTarget(); scene.idle(40); - scene.overlay().showControls(rightClick, 4); + scene.overlay().showControls(util.vector().blockSurface(util.grid().at(2, 3, 1), Direction.EAST), Pointing.RIGHT, 4) + .withItem(AllItems.WRENCH.asStack()) + .rightClick(); scene.idle(6); for (int i = 0; i < 4; i++) { scene.world().cycleBlockProperty(whistlePos.above(i), WhistleBlock.SIZE); @@ -177,10 +180,8 @@ public class SteamScenes { scene.world().toggleRedstonePower(lever); scene.idle(20); - scene.overlay().showControls( - new InputWindowElement(util.vector().blockSurface(util.grid().at(2, 3, 1), Direction.DOWN), Pointing.UP) - .withItem(AllItems.GOGGLES.asStack()), - 80); + scene.overlay().showControls(util.vector().blockSurface(util.grid().at(2, 3, 1), Direction.DOWN), Pointing.UP, 80) + .withItem(AllItems.GOGGLES.asStack()); scene.idle(6); scene.overlay().showText(70) @@ -253,11 +254,9 @@ public class SteamScenes { .placeNearTarget(); scene.idle(60); - scene.overlay().showControls( - new InputWindowElement(util.vector().blockSurface(util.grid().at(3, 1, 3), Direction.UP), Pointing.DOWN) + scene.overlay().showControls(util.vector().blockSurface(util.grid().at(3, 1, 3), Direction.UP), Pointing.DOWN, 60) .withItem(AllBlocks.SHAFT.asStack()) - .rightClick(), - 60); + .rightClick(); scene.idle(10); scene.world().setBlock(engine1ShaftPos, AllBlocks.SHAFT.getDefaultState() .setValue(ShaftBlock.AXIS, Axis.Z), false); @@ -317,7 +316,7 @@ public class SteamScenes { .placeNearTarget(); scene.idle(70); - scene.overlay().showSelectionWithText(util.select().fromTo(5, 2, 3, 4, 2, 4), 50) + scene.overlay().showOutlineWithText(util.select().fromTo(5, 2, 3, 4, 2, 4), 50) .attachKeyFrame() .text("The minimal setup requires 4 Fluid Tanks") .pointAt(util.vector().blockSurface(util.grid().at(4, 2, 4), Direction.UP)) @@ -330,11 +329,9 @@ public class SteamScenes { scene.world().moveSection(burnersElement, util.vector().of(2, 0, 0), 0); scene.idle(25); - scene.overlay().showControls( - new InputWindowElement(util.vector().blockSurface(util.grid().at(4, 1, 3), Direction.EAST), Pointing.RIGHT) + scene.overlay().showControls(util.vector().blockSurface(util.grid().at(4, 1, 3), Direction.EAST), Pointing.RIGHT, 60) .withItem(new ItemStack(Items.OAK_LOG)) - .rightClick(), - 60); + .rightClick(); scene.idle(10); scene.world().setBlocks(burners, AllBlocks.BLAZE_BURNER.getDefaultState() .setValue(BlazeBurnerBlock.HEAT_LEVEL, HeatLevel.KINDLED), false); @@ -370,8 +367,7 @@ public class SteamScenes { .placeNearTarget(); scene.idle(90); - scene.overlay().showControls( - new InputWindowElement(target.add(0, 0, 0.5), Pointing.DOWN).withItem(AllItems.GOGGLES.asStack()), 60); + scene.overlay().showControls(target.add(0, 0, 0.5), Pointing.DOWN, 60).withItem(AllItems.GOGGLES.asStack()); scene.idle(6); scene.overlay().showText(80) .text("The boiler's current power level can be inspected with Engineer's Goggles") @@ -410,7 +406,7 @@ public class SteamScenes { .pointAt(util.vector().blockSurface(util.grid().at(4, 4, 4), Direction.WEST)) .placeNearTarget(); scene.idle(40); - scene.overlay().showSelectionWithText(util.select().fromTo(3, 2, 3, 3, 3, 4), 30) + scene.overlay().showOutlineWithText(util.select().fromTo(3, 2, 3, 3, 3, 4), 30) .text("4 Engines") .colored(PonderPalette.BLUE) .pointAt(util.vector().blockSurface(util.grid().at(3, 3, 4), Direction.UP)) @@ -424,10 +420,8 @@ public class SteamScenes { scene.world().hideIndependentSection(engineShaftElement, Direction.SOUTH); scene.idle(20); - scene.overlay().showControls( - new InputWindowElement(util.vector().of(5, 2, 4), Pointing.DOWN).withItem(AllItems.BLAZE_CAKE.asStack()) - .rightClick(), - 10); + scene.overlay().showControls(util.vector().of(5, 2, 4), Pointing.DOWN, 10).withItem(AllItems.BLAZE_CAKE.asStack()) + .rightClick(); scene.idle(6); scene.world().setBlocks(burners, AllBlocks.BLAZE_BURNER.getDefaultState() .setValue(BlazeBurnerBlock.HEAT_LEVEL, HeatLevel.SEETHING), false); @@ -470,7 +464,7 @@ public class SteamScenes { .pointAt(util.vector().blockSurface(util.grid().at(4, 4, 3), Direction.NORTH)) .placeNearTarget(); scene.idle(40); - scene.overlay().showSelectionWithText(util.select().fromTo(3, 2, 3, 3, 6, 4), 30) + scene.overlay().showOutlineWithText(util.select().fromTo(3, 2, 3, 3, 6, 4), 30) .text("8 Engines") .colored(PonderPalette.BLUE) .pointAt(util.vector().blockSurface(util.grid().at(3, 3, 4), Direction.UP)) diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/TunnelScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/TunnelScenes.java index ff4e27581a..6c9c22d8f1 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/TunnelScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/TunnelScenes.java @@ -15,12 +15,11 @@ import net.createmod.catnip.utility.Iterate; import net.createmod.catnip.utility.NBTHelper; import net.createmod.catnip.utility.Pointing; import net.createmod.catnip.utility.VecHelper; +import net.createmod.ponder.api.PonderPalette; +import net.createmod.ponder.api.element.ElementLink; +import net.createmod.ponder.api.element.WorldSectionElement; import net.createmod.ponder.api.scene.SceneBuilder; import net.createmod.ponder.api.scene.SceneBuildingUtil; -import net.createmod.ponder.foundation.ElementLink; -import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.element.InputWindowElement; -import net.createmod.ponder.foundation.element.WorldSectionElement; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.entity.Entity; @@ -87,8 +86,8 @@ public class TunnelScenes { .text("Whenever an Andesite Tunnel has connections to the sides..."); scene.idle(70); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(util.grid().at(4, 1, 2)), Pointing.DOWN) - .withItem(new ItemStack(Items.COPPER_INGOT)), 20); + scene.overlay().showControls(util.vector().topOf(util.grid().at(4, 1, 2)), Pointing.DOWN, 20) + .withItem(new ItemStack(Items.COPPER_INGOT)); scene.idle(7); scene.world().createItemOnBelt(util.grid().at(4, 1, 2), Direction.UP, new ItemStack(Items.COPPER_INGOT, 64)); scene.idle(40); @@ -184,7 +183,7 @@ public class TunnelScenes { Class tunnelClass = BrassTunnelBlockEntity.class; scene.world().modifyBlockEntity(tunnelPos, tunnelClass, be -> be.getBehaviour(SidedFilteringBehaviour.TYPE) .setFilter(Direction.EAST, copper)); - scene.overlay().showControls(new InputWindowElement(tunnelFilterVec, Pointing.DOWN).withItem(copper), 30); + scene.overlay().showControls(tunnelFilterVec, Pointing.DOWN, 30).withItem(copper); ItemStack zinc = AllItems.ZINC_INGOT.asStack(); scene.world().createItemOnBelt(util.grid().at(5, 1, 2), Direction.EAST, zinc); scene.idle(70); @@ -207,12 +206,12 @@ public class TunnelScenes { .text("Filters on outbound connections can be used to sort items by type"); scene.idle(70); - scene.overlay().showControls(new InputWindowElement(tunnelFilterVec, Pointing.LEFT).withItem(copper), 30); + scene.overlay().showControls(tunnelFilterVec, Pointing.LEFT, 30).withItem(copper); scene.world().modifyBlockEntity(tunnelPos, tunnelClass, be -> be.getBehaviour(SidedFilteringBehaviour.TYPE) .setFilter(Direction.WEST, copper)); scene.idle(4); tunnelFilterVec = getTunnelFilterVec(tunnelPos, Direction.NORTH); - scene.overlay().showControls(new InputWindowElement(tunnelFilterVec, Pointing.RIGHT).withItem(zinc), 30); + scene.overlay().showControls(tunnelFilterVec, Pointing.RIGHT, 30).withItem(zinc); scene.world().modifyBlockEntity(tunnelPos, tunnelClass, be -> be.getBehaviour(SidedFilteringBehaviour.TYPE) .setFilter(Direction.NORTH, zinc)); @@ -258,7 +257,7 @@ public class TunnelScenes { scene.world().showSectionAndMerge(util.select().position(3, 4, 2 + i), Direction.DOWN, newBelt); } - scene.overlay().showSelectionWithText(util.select().fromTo(3, 1, 1, 3, 2, 3), 80) + scene.overlay().showOutlineWithText(util.select().fromTo(3, 1, 1, 3, 2, 3), 80) .attachKeyFrame() .placeNearTarget() .text("Brass Tunnels on parallel belts will form a group"); @@ -271,18 +270,16 @@ public class TunnelScenes { tunnelFilterVec = getTunnelFilterVec(tunnelPos, Direction.WEST); BlockPos newTunnelPos = tunnelPos.above(2) .south(); - scene.overlay() - .showControls(new InputWindowElement(tunnelFilterVec.add(0, 0, -1), Pointing.RIGHT).withItem(item1), 20); + scene.overlay().showControls(tunnelFilterVec.add(0, 0, -1), Pointing.RIGHT, 20).withItem(item1); scene.world().modifyBlockEntity(newTunnelPos.north(), tunnelClass, be -> be.getBehaviour(SidedFilteringBehaviour.TYPE) .setFilter(Direction.WEST, item1)); scene.idle(4); - scene.overlay().showControls(new InputWindowElement(tunnelFilterVec, Pointing.DOWN).withItem(item2), 20); + scene.overlay().showControls(tunnelFilterVec, Pointing.DOWN, 20).withItem(item2); scene.world().modifyBlockEntity(newTunnelPos, tunnelClass, be -> be.getBehaviour(SidedFilteringBehaviour.TYPE) .setFilter(Direction.WEST, item2)); scene.idle(4); - scene.overlay().showControls(new InputWindowElement(tunnelFilterVec.add(0, 0, 1), Pointing.LEFT).withItem(item3), - 20); + scene.overlay().showControls(tunnelFilterVec.add(0, 0, 1), Pointing.LEFT, 20).withItem(item3); scene.world().modifyBlockEntity(newTunnelPos.south(), tunnelClass, be -> be.getBehaviour(SidedFilteringBehaviour.TYPE) .setFilter(Direction.WEST, item3)); @@ -362,7 +359,7 @@ public class TunnelScenes { } Vec3 tunnelTop = util.vector().topOf(util.grid().at(2, 2, 3)); - scene.overlay().showControls(new InputWindowElement(tunnelTop, Pointing.DOWN).rightClick(), 80); + scene.overlay().showControls(tunnelTop, Pointing.DOWN, 80).rightClick(); scene.idle(7); scene.overlay().showCenteredScrollInput(util.grid().at(2, 2, 3), Direction.UP, 120); scene.overlay().showText(120) @@ -378,8 +375,7 @@ public class TunnelScenes { scene.world().moveSection(blockage, util.vector().of(-3, 0, 0), 0); Vec3 modeVec = util.vector().of(4, 2.5, 3); - scene.overlay().showControls(new InputWindowElement(modeVec, Pointing.RIGHT).showing(AllIcons.I_TUNNEL_SPLIT), - 140); + scene.overlay().showControls(modeVec, Pointing.RIGHT, 140).showing(AllIcons.I_TUNNEL_SPLIT); ElementLink blockage2 = null; @@ -405,8 +401,7 @@ public class TunnelScenes { } if (i == 4) { - scene.overlay().showControls( - new InputWindowElement(modeVec, Pointing.RIGHT).showing(AllIcons.I_TUNNEL_FORCED_SPLIT), 140); + scene.overlay().showControls(modeVec, Pointing.RIGHT, 140).showing(AllIcons.I_TUNNEL_FORCED_SPLIT); scene.world().modifyBlockEntity(util.grid().at(1, 2, 3), tunnelClass, be -> be.getBehaviour(ScrollOptionBehaviour.TYPE) .setValue(BrassTunnelBlockEntity.SelectionMode.FORCED_SPLIT.ordinal())); @@ -429,8 +424,7 @@ public class TunnelScenes { scene.world().modifyBlockEntity(util.grid().at(1, 2, 3), tunnelClass, be -> be.getBehaviour(ScrollOptionBehaviour.TYPE) .setValue(BrassTunnelBlockEntity.SelectionMode.ROUND_ROBIN.ordinal())); - scene.overlay().showControls( - new InputWindowElement(modeVec, Pointing.RIGHT).showing(AllIcons.I_TUNNEL_ROUND_ROBIN), 140); + scene.overlay().showControls(modeVec, Pointing.RIGHT, 140).showing(AllIcons.I_TUNNEL_ROUND_ROBIN); scene.overlay().showText(80) .attachKeyFrame() .pointAt(tunnelTop) @@ -452,8 +446,7 @@ public class TunnelScenes { } if (i == 15) { - scene.overlay().showControls( - new InputWindowElement(modeVec, Pointing.RIGHT).showing(AllIcons.I_TUNNEL_FORCED_ROUND_ROBIN), 140); + scene.overlay().showControls(modeVec, Pointing.RIGHT, 140).showing(AllIcons.I_TUNNEL_FORCED_ROUND_ROBIN); scene.world().modifyBlockEntity(util.grid().at(1, 2, 3), tunnelClass, be -> be.getBehaviour(ScrollOptionBehaviour.TYPE) .setValue(BrassTunnelBlockEntity.SelectionMode.FORCED_ROUND_ROBIN.ordinal())); @@ -472,8 +465,7 @@ public class TunnelScenes { } if (i == 19) { - scene.overlay().showControls( - new InputWindowElement(modeVec, Pointing.RIGHT).showing(AllIcons.I_TUNNEL_PREFER_NEAREST), 140); + scene.overlay().showControls(modeVec, Pointing.RIGHT, 140).showing(AllIcons.I_TUNNEL_PREFER_NEAREST); scene.world().modifyBlockEntity(util.grid().at(1, 2, 3), tunnelClass, be -> be.getBehaviour(ScrollOptionBehaviour.TYPE) .setValue(BrassTunnelBlockEntity.SelectionMode.PREFER_NEAREST.ordinal())); @@ -501,8 +493,7 @@ public class TunnelScenes { } if (i == 26) { - scene.overlay().showControls( - new InputWindowElement(modeVec, Pointing.RIGHT).showing(AllIcons.I_TUNNEL_RANDOMIZE), 140); + scene.overlay().showControls(modeVec, Pointing.RIGHT, 140).showing(AllIcons.I_TUNNEL_RANDOMIZE); scene.world().modifyBlockEntity(util.grid().at(1, 2, 3), tunnelClass, be -> be.getBehaviour(ScrollOptionBehaviour.TYPE) .setValue(BrassTunnelBlockEntity.SelectionMode.RANDOMIZE.ordinal())); @@ -519,8 +510,7 @@ public class TunnelScenes { scene.world().hideSection(util.select().fromTo(3, 2, 5, 1, 2, 5), Direction.UP); scene.idle(10); - scene.overlay() - .showControls(new InputWindowElement(modeVec, Pointing.RIGHT).showing(AllIcons.I_TUNNEL_SYNCHRONIZE), 140); + scene.overlay().showControls(modeVec, Pointing.RIGHT, 140).showing(AllIcons.I_TUNNEL_SYNCHRONIZE); scene.world().modifyBlockEntity(util.grid().at(1, 2, 3), tunnelClass, be -> be.getBehaviour(ScrollOptionBehaviour.TYPE) .setValue(BrassTunnelBlockEntity.SelectionMode.SYNCHRONIZE.ordinal())); diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/DrainScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/DrainScenes.java index 41ba8927c7..e12bc6c6a2 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/DrainScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/DrainScenes.java @@ -5,12 +5,11 @@ import com.simibubi.create.foundation.blockEntity.behaviour.fluid.SmartFluidTank import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.element.ElementLink; +import net.createmod.ponder.api.element.WorldSectionElement; import net.createmod.ponder.api.scene.SceneBuilder; import net.createmod.ponder.api.scene.SceneBuildingUtil; -import net.createmod.ponder.foundation.ElementLink; -import net.createmod.ponder.foundation.Selection; -import net.createmod.ponder.foundation.element.InputWindowElement; -import net.createmod.ponder.foundation.element.WorldSectionElement; +import net.createmod.ponder.api.scene.Selection; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.item.ItemStack; @@ -51,10 +50,8 @@ public class DrainScenes { scene.idle(50); ItemStack lavaBucket = new ItemStack(Items.LAVA_BUCKET); - scene.overlay().showControls( - new InputWindowElement(util.vector().blockSurface(drainPos.west(), Direction.UP), Pointing.DOWN).rightClick() - .withItem(lavaBucket), - 40); + scene.overlay().showControls(util.vector().blockSurface(drainPos.west(), Direction.UP), Pointing.DOWN, 40).rightClick() + .withItem(lavaBucket); scene.idle(7); scene.world().modifyBlockEntity(drainPos, ItemDrainBlockEntity.class, be -> { be.getBehaviour(SmartFluidTankBehaviour.TYPE) @@ -90,8 +87,7 @@ public class DrainScenes { .pointAt(util.vector().topOf(util.grid().at(2, 1, 2))); scene.idle(40); - scene.overlay() - .showControls(new InputWindowElement(util.vector().topOf(beltPos), Pointing.DOWN).withItem(lavaBucket), 20); + scene.overlay().showControls(util.vector().topOf(beltPos), Pointing.DOWN, 20).withItem(lavaBucket); scene.idle(7); scene.world().createItemOnBelt(beltPos, Direction.NORTH, lavaBucket); scene.idle(30); diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/FluidMovementActorScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/FluidMovementActorScenes.java index 5b861c7a41..514add3b23 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/FluidMovementActorScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/FluidMovementActorScenes.java @@ -8,13 +8,12 @@ import com.simibubi.create.foundation.fluid.FluidHelper; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.PonderPalette; +import net.createmod.ponder.api.element.ElementLink; +import net.createmod.ponder.api.element.WorldSectionElement; import net.createmod.ponder.api.scene.SceneBuilder; import net.createmod.ponder.api.scene.SceneBuildingUtil; -import net.createmod.ponder.foundation.ElementLink; -import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.Selection; -import net.createmod.ponder.foundation.element.InputWindowElement; -import net.createmod.ponder.foundation.element.WorldSectionElement; +import net.createmod.ponder.api.scene.Selection; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.item.ItemStack; @@ -88,7 +87,7 @@ public class FluidMovementActorScenes { BlockPos psi2 = psi.west(2); scene.world().showSection(util.select().position(psi2), Direction.DOWN); - scene.overlay().showSelectionWithText(util.select().position(psi.west()), 50) + scene.overlay().showOutlineWithText(util.select().position(psi.west()), 50) .colored(PonderPalette.RED) .placeNearTarget() .attachKeyFrame() @@ -117,7 +116,7 @@ public class FluidMovementActorScenes { scene.overlay().showOutline(PonderPalette.GREEN, psi, util.select().fromTo(5, 3, 2, 6, 4, 2), 80); scene.idle(10); - scene.overlay().showSelectionWithText(util.select().position(psi2), 70) + scene.overlay().showOutlineWithText(util.select().position(psi2), 70) .placeNearTarget() .colored(PonderPalette.GREEN) .attachKeyFrame() @@ -142,9 +141,11 @@ public class FluidMovementActorScenes { for (int i = 0; i < 16; i++) { if (i == 8) - scene.overlay() - .showControls(new InputWindowElement(util.vector().blockSurface(util.grid().at(5, 3, 2), Direction.WEST) - .add(0, 0.5, 0), Pointing.LEFT).withItem(bucket), 30); + scene.overlay().showControls(util.vector().blockSurface( + util.grid().at(5, 3, 2), Direction.WEST) + .add(0, 0.5, 0), Pointing.LEFT, 30) + .withItem(bucket); + scene.world().modifyBlockEntity(st, type, be -> be.getCapability(fhc) .ifPresent(ifh -> ifh.drain(1000, FluidAction.EXECUTE))); scene.world().modifyBlockEntity(ct1, type, be -> be.getCapability(fhc) diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/FluidTankScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/FluidTankScenes.java index 90fad9128c..4ce2556c4b 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/FluidTankScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/FluidTankScenes.java @@ -17,14 +17,12 @@ import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; import net.createmod.catnip.utility.VecHelper; +import net.createmod.ponder.api.PonderPalette; +import net.createmod.ponder.api.element.ElementLink; +import net.createmod.ponder.api.element.WorldSectionElement; import net.createmod.ponder.api.scene.SceneBuilder; import net.createmod.ponder.api.scene.SceneBuildingUtil; -import net.createmod.ponder.foundation.ElementLink; -import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.Selection; -import net.createmod.ponder.foundation.element.InputWindowElement; -import net.createmod.ponder.foundation.element.WorldSectionElement; -import net.createmod.ponder.foundation.instruction.EmitParticlesInstruction.Emitter; +import net.createmod.ponder.api.scene.Selection; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.util.RandomSource; @@ -157,13 +155,11 @@ public class FluidTankScenes { scene.idle(20); ItemStack bucket = new ItemStack(Items.BUCKET, 1); - scene.overlay().showControls( - new InputWindowElement(util.vector().blockSurface(util.grid().at(2, 2, 2), Direction.NORTH), Pointing.RIGHT) + scene.overlay().showControls(util.vector().blockSurface(util.grid().at(2, 2, 2), Direction.NORTH), Pointing.RIGHT, 40) .showing(AllIcons.I_MTD_CLOSE) - .withItem(bucket), - 40); + .withItem(bucket); scene.idle(7); - scene.overlay().showSelectionWithText(util.select().fromTo(2, 1, 2, 2, 2, 2), 70) + scene.overlay().showOutlineWithText(util.select().fromTo(2, 1, 2, 2, 2, 2), 70) .text("However, in Survival Mode Fluids cannot be added or taken manually") .attachKeyFrame() .colored(PonderPalette.RED) @@ -209,7 +205,7 @@ public class FluidTankScenes { for (int i = 0; i < 10; i++) { scene.effects().emitParticles(util.vector().topOf(3, 1, 1) .add(0, 1 / 16f, 0), - Emitter.simple(FluidFX.getFluidParticle(content), + scene.effects().simpleParticleEmitter(FluidFX.getFluidParticle(content), VecHelper.offsetRandomly(Vec3.ZERO, random, .1f)), 1, 1); } @@ -332,11 +328,9 @@ public class FluidTankScenes { .pointAt(blockSurface); scene.idle(70); - scene.overlay().showControls( - new InputWindowElement(util.vector().blockSurface(util.grid().at(3, 3, 1), Direction.NORTH), Pointing.RIGHT) + scene.overlay().showControls(util.vector().blockSurface(util.grid().at(3, 3, 1), Direction.NORTH), Pointing.RIGHT, 60) .rightClick() - .withItem(AllItems.WRENCH.asStack()), - 60); + .withItem(AllItems.WRENCH.asStack()); scene.idle(7); scene.world().modifyBlocks(full2, s -> s.setValue(FluidTankBlock.SHAPE, FluidTankBlock.Shape.PLAIN), false); scene.idle(30); @@ -375,11 +369,9 @@ public class FluidTankScenes { scene.idle(80); ItemStack bucket = new ItemStack(Items.LAVA_BUCKET); - scene.overlay().showControls( - new InputWindowElement(util.vector().blockSurface(util.grid().at(2, 2, 2), Direction.NORTH), Pointing.RIGHT) + scene.overlay().showControls(util.vector().blockSurface(util.grid().at(2, 2, 2), Direction.NORTH), Pointing.RIGHT, 40) .rightClick() - .withItem(bucket), - 40); + .withItem(bucket); scene.idle(7); scene.world().modifyBlockEntity(cTankPos, CreativeFluidTankBlockEntity.class, be -> ((CreativeSmartFluidTank) be.getTankInventory()) diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/HosePulleyScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/HosePulleyScenes.java index b84a9bc3eb..6974cb8320 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/HosePulleyScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/HosePulleyScenes.java @@ -10,12 +10,12 @@ import com.simibubi.create.content.fluids.pump.PumpBlock; import com.simibubi.create.content.fluids.tank.FluidTankBlockEntity; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; +import net.createmod.ponder.api.PonderPalette; +import net.createmod.ponder.api.element.ElementLink; +import net.createmod.ponder.api.element.WorldSectionElement; import net.createmod.ponder.api.scene.SceneBuilder; import net.createmod.ponder.api.scene.SceneBuildingUtil; -import net.createmod.ponder.foundation.ElementLink; -import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.Selection; -import net.createmod.ponder.foundation.element.WorldSectionElement; +import net.createmod.ponder.api.scene.Selection; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.block.Blocks; @@ -204,7 +204,7 @@ public class HosePulleyScenes { scene.world().showSectionAndMerge(crank, Direction.EAST, hoselink); scene.idle(20); - scene.overlay().showSelectionWithText(util.select().position(hosePos.below()), 50) + scene.overlay().showOutlineWithText(util.select().position(hosePos.below()), 50) .text("While fully retracted, the Hose Pulley cannot operate") .placeNearTarget() .colored(PonderPalette.RED) @@ -352,7 +352,7 @@ public class HosePulleyScenes { scene.idle(30); Selection pulleyPos = util.select().position(1, 3, 2); - scene.overlay().showSelectionWithText(pulleyPos, 60) + scene.overlay().showOutlineWithText(pulleyPos, 60) .text("It will provide/dispose fluids without affecting the source") .attachKeyFrame() .colored(PonderPalette.BLUE) diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/PipeScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/PipeScenes.java index aefb138ba3..bf0adbb020 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/PipeScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/PipeScenes.java @@ -18,13 +18,12 @@ import com.simibubi.create.foundation.fluid.FluidHelper; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.PonderPalette; +import net.createmod.ponder.api.element.ElementLink; +import net.createmod.ponder.api.element.WorldSectionElement; import net.createmod.ponder.api.scene.SceneBuilder; import net.createmod.ponder.api.scene.SceneBuildingUtil; -import net.createmod.ponder.foundation.ElementLink; -import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.Selection; -import net.createmod.ponder.foundation.element.InputWindowElement; -import net.createmod.ponder.foundation.element.WorldSectionElement; +import net.createmod.ponder.api.scene.Selection; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -94,8 +93,8 @@ public class PipeScenes { scene.idle(60); - scene.overlay().showControls(new InputWindowElement(util.vector().centerOf(2, 1, 1), Pointing.DOWN).rightClick() - .withItem(AllItems.WRENCH.asStack()), 40); + scene.overlay().showControls(util.vector().centerOf(2, 1, 1), Pointing.DOWN, 40).rightClick() + .withItem(AllItems.WRENCH.asStack()); scene.idle(7); scene.world().restoreBlocks(util.select().position(2, 1, 1)); scene.overlay().showText(70) @@ -105,8 +104,8 @@ public class PipeScenes { .text("Using a wrench, a straight pipe segment can be given a window"); scene.idle(40); - scene.overlay().showControls(new InputWindowElement(util.vector().centerOf(1, 1, 2), Pointing.DOWN).rightClick() - .withItem(AllItems.WRENCH.asStack()), 10); + scene.overlay().showControls(util.vector().centerOf(1, 1, 2), Pointing.DOWN, 10).rightClick() + .withItem(AllItems.WRENCH.asStack()); scene.idle(7); scene.world().restoreBlocks(util.select().position(1, 1, 2)); scene.idle(40); @@ -151,7 +150,7 @@ public class PipeScenes { .placeNearTarget() .text("Powered by Mechanical Pumps, the Pipes can transport Fluids"); scene.idle(85); - scene.overlay().showSelectionWithText(tank, 40) + scene.overlay().showOutlineWithText(tank, 40) .colored(PonderPalette.RED) .placeNearTarget() .text("No fluid is being extracted at first"); @@ -323,8 +322,8 @@ public class PipeScenes { .setValue(FluidPipeBlock.WEST, true); ItemStack casingItem = AllBlocks.COPPER_CASING.asStack(); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(3, 1, 1), Pointing.DOWN).rightClick() - .withItem(casingItem), 60); + scene.overlay().showControls(util.vector().topOf(3, 1, 1), Pointing.DOWN, 60).rightClick() + .withItem(casingItem); scene.idle(7); scene.world().setBlock(util.grid().at(3, 1, 1), copperEncased, true); scene.idle(10); @@ -527,7 +526,7 @@ public class PipeScenes { .pointAt(filterVec); scene.idle(60); - scene.overlay().showSelectionWithText(util.select().position(basinPos), 80) + scene.overlay().showOutlineWithText(util.select().position(basinPos), 80) .placeNearTarget() .colored(PonderPalette.GREEN) .text("When placed directly at the source, they can specify the type of fluid to extract") @@ -540,8 +539,8 @@ public class PipeScenes { .getFluidType() .getBucket(chocolate); ItemStack milkBucket = new ItemStack(Items.MILK_BUCKET); - scene.overlay().showControls(new InputWindowElement(filterVec, Pointing.DOWN).rightClick() - .withItem(bucket), 80); + scene.overlay().showControls(filterVec, Pointing.DOWN, 80).rightClick() + .withItem(bucket); scene.idle(7); scene.world().setFilterData(util.select().position(3, 1, 1), SmartFluidPipeBlockEntity.class, bucket); scene.idle(10); @@ -589,14 +588,14 @@ public class PipeScenes { .pointAt(filterVec.add(-1, 0, 2)); scene.idle(90); - scene.overlay().showControls(new InputWindowElement(filterVec.add(-1, 0, 3), Pointing.DOWN).rightClick() - .withItem(milkBucket), 30); + scene.overlay().showControls(filterVec.add(-1, 0, 3), Pointing.DOWN, 30).rightClick() + .withItem(milkBucket); scene.idle(7); scene.world().setFilterData(util.select().position(2, 1, 4), SmartFluidPipeBlockEntity.class, milkBucket); scene.idle(30); - scene.overlay().showControls(new InputWindowElement(filterVec.add(-1, 0, 2), Pointing.DOWN).rightClick() - .withItem(bucket), 30); + scene.overlay().showControls(filterVec.add(-1, 0, 2), Pointing.DOWN, 30).rightClick() + .withItem(bucket); scene.idle(7); scene.world().setFilterData(util.select().position(2, 1, 3), SmartFluidPipeBlockEntity.class, bucket); scene.idle(30); diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/PumpScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/PumpScenes.java index e9e0494c3d..90328d26bb 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/PumpScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/PumpScenes.java @@ -10,13 +10,12 @@ import com.simibubi.create.content.kinetics.simpleRelays.CogWheelBlock; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.PonderPalette; +import net.createmod.ponder.api.element.ElementLink; +import net.createmod.ponder.api.element.WorldSectionElement; import net.createmod.ponder.api.scene.SceneBuilder; import net.createmod.ponder.api.scene.SceneBuildingUtil; -import net.createmod.ponder.foundation.ElementLink; -import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.Selection; -import net.createmod.ponder.foundation.element.InputWindowElement; -import net.createmod.ponder.foundation.element.WorldSectionElement; +import net.createmod.ponder.api.scene.Selection; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -139,8 +138,8 @@ public class PumpScenes { scene.overlay().chaseBoundingBoxOutline(PonderPalette.RED, in, new AABB(leverPos.below()), 30); scene.idle(45); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(pumpPos), Pointing.DOWN).rightClick() - .withItem(AllItems.WRENCH.asStack()), 40); + scene.overlay().showControls(util.vector().topOf(pumpPos), Pointing.DOWN, 40).rightClick() + .withItem(AllItems.WRENCH.asStack()); scene.idle(7); scene.world().modifyBlock(pumpPos, s -> s.setValue(PumpBlock.FACING, Direction.EAST), true); scene.overlay().showText(70) @@ -291,7 +290,7 @@ public class PumpScenes { scene.world().setKineticSpeed(largeCog, 8); scene.idle(20); - scene.overlay().showSelectionWithText(util.select().fromTo(2, 1, 1, 2, 1, 3), 60) + scene.overlay().showOutlineWithText(util.select().fromTo(2, 1, 1, 2, 1, 3), 60) .attachKeyFrame() .colored(PonderPalette.GREEN) .pointAt(util.vector().topOf(pumpPos)) @@ -300,9 +299,8 @@ public class PumpScenes { scene.idle(70); scene.idle(30); - scene.overlay() - .showControls(new InputWindowElement(util.vector().topOf(pumpPos.north()), Pointing.DOWN).rightClick() - .withItem(AllItems.WRENCH.asStack()), 30); + scene.overlay().showControls(util.vector().topOf(pumpPos.north()), Pointing.DOWN, 30).rightClick() + .withItem(AllItems.WRENCH.asStack()); scene.idle(7); scene.world().modifyBlock(pumpPos.north(), s -> s.setValue(PumpBlock.FACING, Direction.WEST), true); scene.idle(30); diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/SpoutScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/SpoutScenes.java index 27bedac726..4cd6047e61 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/SpoutScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/SpoutScenes.java @@ -11,14 +11,12 @@ import com.simibubi.create.foundation.ponder.element.BeltItemElement; import net.createmod.catnip.utility.Pointing; import net.createmod.catnip.utility.VecHelper; +import net.createmod.ponder.api.PonderPalette; +import net.createmod.ponder.api.element.ElementLink; +import net.createmod.ponder.api.element.WorldSectionElement; import net.createmod.ponder.api.scene.SceneBuilder; import net.createmod.ponder.api.scene.SceneBuildingUtil; -import net.createmod.ponder.foundation.ElementLink; -import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.Selection; -import net.createmod.ponder.foundation.element.InputWindowElement; -import net.createmod.ponder.foundation.element.WorldSectionElement; -import net.createmod.ponder.foundation.instruction.EmitParticlesInstruction.Emitter; +import net.createmod.ponder.api.scene.Selection; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.particles.ParticleOptions; @@ -77,13 +75,11 @@ public class SpoutScenes { ItemStack bucket = AllFluids.HONEY.get() .getFluidType() .getBucket(honey); - scene.overlay().showControls( - new InputWindowElement(util.vector().blockSurface(util.grid().at(2, 3, 2), Direction.NORTH), Pointing.RIGHT) + scene.overlay().showControls(util.vector().blockSurface(util.grid().at(2, 3, 2), Direction.NORTH), Pointing.RIGHT, 40) .showing(AllIcons.I_MTD_CLOSE) - .withItem(bucket), - 40); + .withItem(bucket); scene.idle(7); - scene.overlay().showSelectionWithText(util.select().position(2, 3, 2), 50) + scene.overlay().showOutlineWithText(util.select().position(2, 3, 2), 50) .pointAt(util.vector().blockSurface(util.grid().at(2, 3, 2), Direction.WEST)) .attachKeyFrame() .colored(PonderPalette.RED) @@ -106,7 +102,7 @@ public class SpoutScenes { ItemStack bottle = new ItemStack(Items.GLASS_BOTTLE); scene.world().createItemOnBeltLike(depotPos, Direction.NORTH, bottle); Vec3 depotCenter = util.vector().centerOf(depotPos.south()); - scene.overlay().showControls(new InputWindowElement(depotCenter, Pointing.UP).withItem(bottle), 30); + scene.overlay().showControls(depotCenter, Pointing.UP, 30).withItem(bottle); scene.idle(10); scene.idle(20); @@ -119,10 +115,10 @@ public class SpoutScenes { for (int i = 0; i < 10; i++) { scene.effects().emitParticles(util.vector().topOf(depotPos.south()) .add(0, 1 / 16f, 0), - Emitter.simple(fluidParticle, VecHelper.offsetRandomly(Vec3.ZERO, random, .1f)), 1, 1); + scene.effects().simpleParticleEmitter(fluidParticle, VecHelper.offsetRandomly(Vec3.ZERO, random, .1f)), 1, 1); } scene.idle(10); - scene.overlay().showControls(new InputWindowElement(depotCenter, Pointing.UP).withItem(potion), 50); + scene.overlay().showControls(depotCenter, Pointing.UP, 50).withItem(potion); scene.idle(60); scene.world().hideIndependentSection(depot, Direction.NORTH); @@ -156,7 +152,7 @@ public class SpoutScenes { for (int i = 0; i < 10; i++) { scene.effects().emitParticles(util.vector().topOf(depotPos.south()) .add(0, 1 / 16f, 0), - Emitter.simple(fluidParticle, VecHelper.offsetRandomly(Vec3.ZERO, random, .1f)), 1, 1); + scene.effects().simpleParticleEmitter(fluidParticle, VecHelper.offsetRandomly(Vec3.ZERO, random, .1f)), 1, 1); } scene.world().removeItemsFromBelt(spoutPos.below(2)); ingot = scene.world().createItemOnBelt(spoutPos.below(2), Direction.UP, potion); @@ -170,7 +166,7 @@ public class SpoutScenes { for (int i = 0; i < 10; i++) { scene.effects().emitParticles(util.vector().topOf(depotPos.south()) .add(0, 1 / 16f, 0), - Emitter.simple(fluidParticle, VecHelper.offsetRandomly(Vec3.ZERO, random, .1f)), 1, 1); + scene.effects().simpleParticleEmitter(fluidParticle, VecHelper.offsetRandomly(Vec3.ZERO, random, .1f)), 1, 1); } scene.world().removeItemsFromBelt(spoutPos.below(2)); ingot2 = scene.world().createItemOnBelt(spoutPos.below(2), Direction.UP, potion); diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrackObserverScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrackObserverScenes.java index 967cf04eb4..c5c9f56135 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrackObserverScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrackObserverScenes.java @@ -5,14 +5,14 @@ import com.simibubi.create.content.trains.observer.TrackObserverBlockEntity; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.PonderPalette; +import net.createmod.ponder.api.element.ElementLink; +import net.createmod.ponder.api.element.ParrotElement; +import net.createmod.ponder.api.element.ParrotPose; +import net.createmod.ponder.api.element.WorldSectionElement; import net.createmod.ponder.api.scene.SceneBuilder; import net.createmod.ponder.api.scene.SceneBuildingUtil; -import net.createmod.ponder.foundation.ElementLink; -import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.Selection; -import net.createmod.ponder.foundation.element.InputWindowElement; -import net.createmod.ponder.foundation.element.ParrotElement; -import net.createmod.ponder.foundation.element.WorldSectionElement; +import net.createmod.ponder.api.scene.Selection; import net.minecraft.core.Direction; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; @@ -50,8 +50,8 @@ public class TrackObserverScenes { Vec3 target = util.vector().topOf(5, 0, 7); AABB bb = new AABB(target, target).move(0, 2 / 16f, 0); - scene.overlay().showControls(new InputWindowElement(target, Pointing.DOWN).rightClick() - .withItem(AllBlocks.TRACK_OBSERVER.asStack()), 40); + scene.overlay().showControls(target, Pointing.DOWN, 40).rightClick() + .withItem(AllBlocks.TRACK_OBSERVER.asStack()); scene.idle(6); scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, bb, bb, 1); scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, bb, bb.inflate(.45f, 1 / 16f, .45f), 60); @@ -83,7 +83,7 @@ public class TrackObserverScenes { scene.world().moveSection(trainInstance1, util.vector().of(-16, 0, 0), 80); scene.world().animateBogey(util.grid().at(5, 2, 7), 16, 80); ElementLink birb = - scene.special().createBirb(util.vector().centerOf(12, 3, 7), ParrotElement.FacePointOfInterestPose::new); + scene.special().createBirb(util.vector().centerOf(12, 3, 7), ParrotPose.FacePointOfInterestPose::new); scene.special().moveParrot(birb, util.vector().of(-16, 0, 0), 80); scene.idle(10); @@ -118,7 +118,7 @@ public class TrackObserverScenes { scene.idle(40); ItemStack waterBucket = new ItemStack(Items.WATER_BUCKET); - scene.overlay().showControls(new InputWindowElement(target, Pointing.DOWN).withItem(waterBucket), 30); + scene.overlay().showControls(target, Pointing.DOWN, 30).withItem(waterBucket); scene.idle(6); scene.world().setFilterData(observer, TrackObserverBlockEntity.class, waterBucket); scene.idle(50); @@ -127,7 +127,7 @@ public class TrackObserverScenes { scene.world().moveSection(trainInstance1, util.vector().of(6, 0, 0), 0); scene.world().moveSection(trainInstance1, util.vector().of(-16, 0, 0), 80); scene.world().animateBogey(util.grid().at(5, 2, 7), 16, 80); - birb = scene.special().createBirb(util.vector().centerOf(12, 3, 7), ParrotElement.FacePointOfInterestPose::new); + birb = scene.special().createBirb(util.vector().centerOf(12, 3, 7), ParrotPose.FacePointOfInterestPose::new); scene.special().moveParrot(birb, util.vector().of(-16, 0, 0), 80); scene.idle(10); @@ -147,7 +147,7 @@ public class TrackObserverScenes { scene.world().moveSection(trainInstance1, util.vector().of(6, 0, 0), 0); scene.world().moveSection(trainInstance1, util.vector().of(-16, 0, 0), 80); scene.world().animateBogey(util.grid().at(5, 2, 7), 16, 80); - birb = scene.special().createBirb(util.vector().centerOf(12, 3, 7), ParrotElement.FacePointOfInterestPose::new); + birb = scene.special().createBirb(util.vector().centerOf(12, 3, 7), ParrotPose.FacePointOfInterestPose::new); scene.special().moveParrot(birb, util.vector().of(-16, 0, 0), 80); scene.idle(10); diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrackScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrackScenes.java index 25c5a12433..a862eb35d1 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrackScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrackScenes.java @@ -7,14 +7,14 @@ import com.simibubi.create.content.processing.burner.BlazeBurnerBlock; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.PonderPalette; +import net.createmod.ponder.api.element.ElementLink; +import net.createmod.ponder.api.element.ParrotElement; +import net.createmod.ponder.api.element.ParrotPose; +import net.createmod.ponder.api.element.WorldSectionElement; import net.createmod.ponder.api.scene.SceneBuilder; import net.createmod.ponder.api.scene.SceneBuildingUtil; -import net.createmod.ponder.foundation.ElementLink; -import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.Selection; -import net.createmod.ponder.foundation.element.InputWindowElement; -import net.createmod.ponder.foundation.element.ParrotElement; -import net.createmod.ponder.foundation.element.WorldSectionElement; +import net.createmod.ponder.api.scene.Selection; import net.minecraft.core.Direction; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Blocks; @@ -62,16 +62,21 @@ public class TrackScenes { scene.idle(30); ItemStack trackStack = AllBlocks.TRACK.asStack(); - scene.overlay().showControls(new InputWindowElement(startTrack, Pointing.DOWN).rightClick() - .withItem(trackStack), 40); + + scene.overlay().showControls(startTrack, Pointing.DOWN, 40) + .rightClick() + .withItem(trackStack); + + scene.overlay().showControls(startTrack, Pointing.DOWN, 40).rightClick() + .withItem(trackStack); scene.idle(6); AABB bb = new AABB(util.grid().at(3, 1, 5)).contract(0, .75f, 0) .inflate(0, 0, .85f); scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, startTrack, bb, 32); scene.idle(45); - scene.overlay().showControls(new InputWindowElement(startTrack.add(9, 0, 0), Pointing.DOWN).rightClick() - .withItem(trackStack), 40); + scene.overlay().showControls(startTrack.add(9, 0, 0), Pointing.DOWN, 40).rightClick() + .withItem(trackStack); scene.idle(6); scene.overlay().showText(40) .pointAt(util.vector().topOf(12, 0, 5)) @@ -93,11 +98,11 @@ public class TrackScenes { scene.idle(10); scene.addKeyframe(); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(8, 0, 2), Pointing.DOWN).rightClick() - .withItem(trackStack), 15); + scene.overlay().showControls(util.vector().topOf(8, 0, 2), Pointing.DOWN, 15).rightClick() + .withItem(trackStack); scene.idle(15); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(2, 0, 8), Pointing.DOWN).rightClick() - .withItem(trackStack), 15); + scene.overlay().showControls(util.vector().topOf(2, 0, 8), Pointing.DOWN, 15).rightClick() + .withItem(trackStack); scene.idle(7); scene.world().showSection(util.select().position(2, 1, 8), Direction.DOWN); scene.idle(25); @@ -111,11 +116,11 @@ public class TrackScenes { scene.world().showSection(util.select().position(12, 1, 2), Direction.SOUTH); scene.idle(10); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(12, 0, 2), Pointing.DOWN).rightClick() - .withItem(trackStack), 10); + scene.overlay().showControls(util.vector().topOf(12, 0, 2), Pointing.DOWN, 10).rightClick() + .withItem(trackStack); scene.idle(15); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(2, 0, 12), Pointing.DOWN).rightClick() - .withItem(trackStack), 10); + scene.overlay().showControls(util.vector().topOf(2, 0, 12), Pointing.DOWN, 10).rightClick() + .withItem(trackStack); scene.idle(7); scene.world().showSection(util.select().fromTo(12, 1, 3, 12, 1, 5), Direction.DOWN); scene.idle(3); @@ -148,13 +153,13 @@ public class TrackScenes { scene.world().showSection(util.select().position(12, 1, 2), Direction.SOUTH); scene.idle(20); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(12, 0, 2), Pointing.DOWN).rightClick() - .withItem(trackStack), 10); + scene.overlay().showControls(util.vector().topOf(12, 0, 2), Pointing.DOWN, 10).rightClick() + .withItem(trackStack); scene.idle(10); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(2, 0, 12), Pointing.DOWN).rightClick() + scene.overlay().showControls(util.vector().topOf(2, 0, 12), Pointing.DOWN, 60).rightClick() .withItem(trackStack) - .whileCTRL(), 60); + .whileCTRL(); scene.idle(10); scene.overlay().showText(60) @@ -192,19 +197,15 @@ public class TrackScenes { scene.world().showSectionAndMerge(util.select().fromTo(2, 6, 10, 2, 11, 12), Direction.DOWN, slopeStart); scene.idle(20); - scene.overlay() - .showControls(new InputWindowElement(util.vector().topOf(12, 3, 11), Pointing.LEFT).withItem(trackStack), 30); + scene.overlay().showControls(util.vector().topOf(12, 3, 11), Pointing.LEFT, 30).withItem(trackStack); scene.idle(4); ItemStack smoothStone = new ItemStack(Blocks.SMOOTH_STONE); - scene.overlay().showControls( - new InputWindowElement(util.vector().topOf(12, 3, 11), Pointing.RIGHT).withItem(smoothStone), 26); + scene.overlay().showControls(util.vector().topOf(12, 3, 11), Pointing.RIGHT, 26).withItem(smoothStone); scene.idle(30); - scene.overlay() - .showControls(new InputWindowElement(util.vector().topOf(2, 6, 11), Pointing.LEFT).withItem(trackStack), 30); + scene.overlay().showControls(util.vector().topOf(2, 6, 11), Pointing.LEFT, 30).withItem(trackStack); scene.idle(4); - scene.overlay().showControls( - new InputWindowElement(util.vector().topOf(2, 6, 11), Pointing.RIGHT).withItem(smoothStone), 26); + scene.overlay().showControls(util.vector().topOf(2, 6, 11), Pointing.RIGHT, 26).withItem(smoothStone); scene.idle(10); scene.world().showSectionAndMerge(util.select().position(2, 12, 11), Direction.DOWN, slopeStart); @@ -219,19 +220,15 @@ public class TrackScenes { .text("Materials in the off-hand will be paved under tracks automatically"); scene.idle(80); - scene.overlay() - .showControls(new InputWindowElement(util.vector().topOf(12, 2, 7), Pointing.LEFT).withItem(trackStack), 30); + scene.overlay().showControls(util.vector().topOf(12, 2, 7), Pointing.LEFT, 30).withItem(trackStack); scene.idle(4); smoothStone = new ItemStack(Blocks.SMOOTH_STONE_SLAB); - scene.overlay().showControls( - new InputWindowElement(util.vector().topOf(12, 2, 7), Pointing.RIGHT).withItem(smoothStone), 26); + scene.overlay().showControls(util.vector().topOf(12, 2, 7), Pointing.RIGHT, 26).withItem(smoothStone); scene.idle(30); - scene.overlay() - .showControls(new InputWindowElement(util.vector().topOf(2, 4, 7), Pointing.LEFT).withItem(trackStack), 30); + scene.overlay().showControls(util.vector().topOf(2, 4, 7), Pointing.LEFT, 30).withItem(trackStack); scene.idle(4); - scene.overlay() - .showControls(new InputWindowElement(util.vector().topOf(2, 4, 7), Pointing.RIGHT).withItem(smoothStone), 26); + scene.overlay().showControls(util.vector().topOf(2, 4, 7), Pointing.RIGHT, 26).withItem(smoothStone); scene.idle(10); scene.world().showSectionAndMerge(util.select().position(2, 10, 7), Direction.DOWN, slopeStart); @@ -239,19 +236,15 @@ public class TrackScenes { scene.world().showSectionAndMerge(util.select().fromTo(11, 7, 6, 3, 11, 8), Direction.UP, slopeStart); scene.idle(20); - scene.overlay() - .showControls(new InputWindowElement(util.vector().topOf(12, 1, 3), Pointing.LEFT).withItem(trackStack), 30); + scene.overlay().showControls(util.vector().topOf(12, 1, 3), Pointing.LEFT, 30).withItem(trackStack); scene.idle(4); smoothStone = AllBlocks.METAL_GIRDER.asStack(); - scene.overlay().showControls( - new InputWindowElement(util.vector().topOf(12, 1, 3), Pointing.RIGHT).withItem(smoothStone), 26); + scene.overlay().showControls(util.vector().topOf(12, 1, 3), Pointing.RIGHT, 26).withItem(smoothStone); scene.idle(30); - scene.overlay() - .showControls(new InputWindowElement(util.vector().topOf(2, 2, 3), Pointing.LEFT).withItem(trackStack), 30); + scene.overlay().showControls(util.vector().topOf(2, 2, 3), Pointing.LEFT, 30).withItem(trackStack); scene.idle(4); - scene.overlay() - .showControls(new InputWindowElement(util.vector().topOf(2, 2, 3), Pointing.RIGHT).withItem(smoothStone), 26); + scene.overlay().showControls(util.vector().topOf(2, 2, 3), Pointing.RIGHT, 26).withItem(smoothStone); scene.idle(10); scene.world().showSectionAndMerge(util.select().position(2, 8, 3), Direction.DOWN, slopeStart); @@ -299,7 +292,7 @@ public class TrackScenes { scene.world().showIndependentSection(util.select().fromTo(5, 2, 4, 3, 3, 5), Direction.DOWN); ElementLink birb = - scene.special().createBirb(util.vector().centerOf(4, 3, 2), ParrotElement.FacePointOfInterestPose::new); + scene.special().createBirb(util.vector().centerOf(4, 3, 2), ParrotPose.FacePointOfInterestPose::new); scene.special().conductorBirb(birb, true); scene.special().movePointOfInterest(util.grid().at(4, 4, 10)); @@ -379,7 +372,7 @@ public class TrackScenes { scene.idle(5); scene.world().showSectionAndMerge(vStation, Direction.DOWN, stationElement); ElementLink birb = - scene.special().createBirb(util.vector().centerOf(2, 2, 7), ParrotElement.FacePointOfInterestPose::new); + scene.special().createBirb(util.vector().centerOf(2, 2, 7), ParrotPose.FacePointOfInterestPose::new); scene.special().movePointOfInterest(util.grid().at(4, 3, 4)); scene.idle(5); ElementLink trainElement = scene.world().showIndependentSection(train, Direction.DOWN); @@ -446,7 +439,7 @@ public class TrackScenes { .add(dStation), null); ElementLink dPlatformElement = scene.world().showIndependentSection(dPlatform, null); - birb = scene.special().createBirb(util.vector().centerOf(-2, 2, 7), ParrotElement.FacePointOfInterestPose::new); + birb = scene.special().createBirb(util.vector().centerOf(-2, 2, 7), ParrotPose.FacePointOfInterestPose::new); scene.world().moveSection(dPlatformElement, util.vector().of(-8, -2, 0), 0); scene.world().moveSection(stationElement, util.vector().of(-8, 0, 0), 0); scene.world().moveSection(stationElement, util.vector().of(8, 0, 0), 80); diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrainScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrainScenes.java index 5ab10aa486..efeff69d6e 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrainScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrainScenes.java @@ -6,14 +6,14 @@ import com.simibubi.create.content.trains.station.StationBlock; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.PonderPalette; +import net.createmod.ponder.api.element.ElementLink; +import net.createmod.ponder.api.element.ParrotElement; +import net.createmod.ponder.api.element.ParrotPose; +import net.createmod.ponder.api.element.WorldSectionElement; import net.createmod.ponder.api.scene.SceneBuilder; import net.createmod.ponder.api.scene.SceneBuildingUtil; -import net.createmod.ponder.foundation.ElementLink; -import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.Selection; -import net.createmod.ponder.foundation.element.InputWindowElement; -import net.createmod.ponder.foundation.element.ParrotElement; -import net.createmod.ponder.foundation.element.WorldSectionElement; +import net.createmod.ponder.api.scene.Selection; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.item.ItemStack; @@ -67,8 +67,7 @@ public class TrainScenes { scene.world().toggleControls(initialControlsPos); scene.idle(20); - scene.overlay().showControls( - new InputWindowElement(util.vector().topOf(initialControlsPos), Pointing.DOWN).rightClick(), 70); + scene.overlay().showControls(util.vector().topOf(initialControlsPos), Pointing.DOWN, 70).rightClick(); scene.idle(20); scene.overlay().showText(60) @@ -93,8 +92,7 @@ public class TrainScenes { scene.world().animateBogey(util.grid().at(3, 2, 4), 4f, 30); scene.idle(40); - scene.overlay() - .showControls(new InputWindowElement(util.vector().topOf(initialControlsPos), Pointing.DOWN).scroll(), 70); + scene.overlay().showControls(util.vector().topOf(initialControlsPos), Pointing.DOWN, 70).scroll(); scene.idle(20); scene.overlay().showText(90) @@ -199,8 +197,8 @@ public class TrainScenes { scene.idle(80); Vec3 target = util.vector().topOf(util.grid().at(4, 0, 2)); - scene.overlay().showControls(new InputWindowElement(target, Pointing.RIGHT).rightClick() - .withItem(AllItems.SCHEDULE.asStack()), 80); + scene.overlay().showControls(target, Pointing.RIGHT, 80).rightClick() + .withItem(AllItems.SCHEDULE.asStack()); scene.overlay().showText(80) .pointAt(target) .placeNearTarget() @@ -209,9 +207,8 @@ public class TrainScenes { .text("Right-click with the item in hand to open its Interface"); scene.idle(100); - scene.overlay() - .showControls(new InputWindowElement(util.vector().topOf(util.grid().at(3, 3, 4)), Pointing.DOWN).rightClick() - .withItem(AllItems.SCHEDULE.asStack()), 80); + scene.overlay().showControls(util.vector().topOf(util.grid().at(3, 3, 4)), Pointing.DOWN, 80).rightClick() + .withItem(AllItems.SCHEDULE.asStack()); scene.idle(6); scene.world().conductorBlaze(util.grid().at(3, 3, 4), true); scene.overlay().showText(70) @@ -232,7 +229,7 @@ public class TrainScenes { scene.world().moveSection(trainElement2, util.vector().of(0, 0, -3), 0); scene.idle(10); Vec3 birbVec = util.vector().topOf(util.grid().at(3, 0, 7)); - ElementLink birb = scene.special().createBirb(birbVec, ParrotElement.FacePointOfInterestPose::new); + ElementLink birb = scene.special().createBirb(birbVec, ParrotPose.FacePointOfInterestPose::new); scene.world().animateTrainStation(stationPos, true); scene.overlay().showText(110) @@ -242,12 +239,12 @@ public class TrainScenes { .text("Any mob or blaze burner sitting in front of Train Controls is an eligible conductor"); scene.idle(80); - scene.overlay().showControls(new InputWindowElement(util.vector().centerOf(util.grid().at(3, 1, 7)), Pointing.DOWN) - .withItem(new ItemStack(Items.LEAD)), 30); + scene.overlay().showControls(util.vector().centerOf(util.grid().at(3, 1, 7)), Pointing.DOWN, 30) + .withItem(new ItemStack(Items.LEAD)); scene.idle(40); target = util.vector().centerOf(util.grid().at(3, 3, 4)); - scene.overlay().showControls(new InputWindowElement(target.add(0.5, 0, 0), Pointing.RIGHT).rightClick() - .withItem(new ItemStack(Items.LEAD)), 30); + scene.overlay().showControls(target.add(0.5, 0, 0), Pointing.RIGHT, 30).rightClick() + .withItem(new ItemStack(Items.LEAD)); scene.idle(6); scene.special().moveParrot(birb, target.subtract(birbVec), 5); scene.effects().indicateSuccess(util.grid().at(3, 3, 4)); @@ -261,8 +258,8 @@ public class TrainScenes { .text("Creatures on a lead can be given their seat more conveniently"); scene.idle(80); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(util.grid().at(3, 3, 4)), Pointing.DOWN) - .withItem(AllItems.SCHEDULE.asStack()), 15); + scene.overlay().showControls(util.vector().topOf(util.grid().at(3, 3, 4)), Pointing.DOWN, 15) + .withItem(AllItems.SCHEDULE.asStack()); scene.idle(6); scene.special().conductorBirb(birb, true); scene.special().movePointOfInterest(util.grid().at(16, 4, 4)); @@ -273,8 +270,7 @@ public class TrainScenes { scene.special().moveParrot(birb, util.vector().of(3, 0, 0), 30); scene.idle(40); - scene.overlay().showControls( - new InputWindowElement(util.vector().topOf(util.grid().at(6, 3, 4)), Pointing.DOWN).rightClick(), 70); + scene.overlay().showControls(util.vector().topOf(util.grid().at(6, 3, 4)), Pointing.DOWN, 70).rightClick(); scene.idle(6); scene.special().conductorBirb(birb, false); scene.special().movePointOfInterest(util.grid().at(3, 4, 1)); diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrainSignalScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrainSignalScenes.java index 9adbb8e667..1a6f94cea8 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrainSignalScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrainSignalScenes.java @@ -7,14 +7,14 @@ import com.simibubi.create.content.trains.signal.SignalBlockEntity.SignalState; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.PonderPalette; +import net.createmod.ponder.api.element.ElementLink; +import net.createmod.ponder.api.element.ParrotElement; +import net.createmod.ponder.api.element.ParrotPose; +import net.createmod.ponder.api.element.WorldSectionElement; import net.createmod.ponder.api.scene.SceneBuilder; import net.createmod.ponder.api.scene.SceneBuildingUtil; -import net.createmod.ponder.foundation.ElementLink; -import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.Selection; -import net.createmod.ponder.foundation.element.InputWindowElement; -import net.createmod.ponder.foundation.element.ParrotElement; -import net.createmod.ponder.foundation.element.WorldSectionElement; +import net.createmod.ponder.api.scene.Selection; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.phys.AABB; @@ -57,8 +57,8 @@ public class TrainSignalScenes { AABB bb = new AABB(marker, marker); AABB bb3 = bb.move(3, 0, 0); - scene.overlay().showControls(new InputWindowElement(marker, Pointing.DOWN).rightClick() - .withItem(AllBlocks.TRACK_SIGNAL.asStack()), 40); + scene.overlay().showControls(marker, Pointing.DOWN, 40).rightClick() + .withItem(AllBlocks.TRACK_SIGNAL.asStack()); scene.idle(6); scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, bb, bb.move(0, -1 / 16f, 0), 1); scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, bb, bb.move(0, -1 / 16f, 0) @@ -87,7 +87,7 @@ public class TrainSignalScenes { ElementLink trainElement = scene.world().showIndependentSection(train, Direction.DOWN); Vec3 birbVec = util.vector().centerOf(util.grid().at(2, 3, 6)); - ElementLink birb = scene.special().createBirb(birbVec, ParrotElement.FacePointOfInterestPose::new); + ElementLink birb = scene.special().createBirb(birbVec, ParrotPose.FacePointOfInterestPose::new); scene.idle(10); scene.world().showSection(station, Direction.DOWN); @@ -102,8 +102,7 @@ public class TrainSignalScenes { .text("Scheduled Trains will never cross signals in the opposite direction"); scene.idle(90); - scene.overlay().showControls( - new InputWindowElement(birbVec.add(0, 0.5, 0), Pointing.DOWN).withItem(AllItems.SCHEDULE.asStack()), 40); + scene.overlay().showControls(birbVec.add(0, 0.5, 0), Pointing.DOWN, 40).withItem(AllItems.SCHEDULE.asStack()); scene.idle(6); scene.special().movePointOfInterest(util.grid().at(19, 4, 6)); @@ -124,8 +123,8 @@ public class TrainSignalScenes { scene.special().movePointOfInterest(util.grid().at(5, 1, 4)); scene.idle(20); - scene.overlay().showControls(new InputWindowElement(marker, Pointing.DOWN).rightClick() - .withItem(AllBlocks.TRACK_SIGNAL.asStack()), 40); + scene.overlay().showControls(marker, Pointing.DOWN, 40).rightClick() + .withItem(AllBlocks.TRACK_SIGNAL.asStack()); scene.idle(6); scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, bb, bb.move(0, -1 / 16f, 0), 1); scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, bb, bb.move(0, -1 / 16f, 0) @@ -145,8 +144,7 @@ public class TrainSignalScenes { scene.idle(90); scene.world().hideIndependentSection(signalElement, null); - scene.overlay().showControls( - new InputWindowElement(birbVec.add(0, 0.5, 0), Pointing.DOWN).withItem(AllItems.SCHEDULE.asStack()), 40); + scene.overlay().showControls(birbVec.add(0, 0.5, 0), Pointing.DOWN, 40).withItem(AllItems.SCHEDULE.asStack()); scene.idle(6); scene.special().movePointOfInterest(util.grid().at(19, 4, 6)); @@ -288,7 +286,7 @@ public class TrainSignalScenes { ElementLink trainElement = scene.world().showIndependentSection(train1, null); ElementLink birb1 = - scene.special().createBirb(util.vector().centerOf(18, 3, 7), ParrotElement.FacePointOfInterestPose::new); + scene.special().createBirb(util.vector().centerOf(18, 3, 7), ParrotPose.FacePointOfInterestPose::new); scene.world().moveSection(trainElement, util.vector().of(4, 0, 0), 0); scene.world().moveSection(trainElement, util.vector().of(-9, 0, 0), 45); scene.world().animateBogey(util.grid().at(13, 2, 7), 9f, 45); @@ -313,7 +311,7 @@ public class TrainSignalScenes { ElementLink trainElement2 = scene.world().showIndependentSection(train3, null); ElementLink birb2 = - scene.special().createBirb(util.vector().centerOf(18, 3, 7), ParrotElement.FacePointOfInterestPose::new); + scene.special().createBirb(util.vector().centerOf(18, 3, 7), ParrotPose.FacePointOfInterestPose::new); scene.world().moveSection(trainElement2, util.vector().of(4, 0, 6), 0); scene.world().moveSection(trainElement2, util.vector().of(-4.5, 0, 0), 35); scene.world().animateBogey(util.grid().at(13, 2, 1), 4.5f, 35); @@ -340,10 +338,8 @@ public class TrainSignalScenes { scene.world().changeSignalState(s3Pos, SignalState.GREEN); scene.idle(20); - scene.overlay().showControls( - new InputWindowElement(util.vector().blockSurface(s1Pos, Direction.EAST), Pointing.RIGHT).rightClick() - .withItem(AllItems.WRENCH.asStack()), - 80); + scene.overlay().showControls(util.vector().blockSurface(s1Pos, Direction.EAST), Pointing.RIGHT, 80).rightClick() + .withItem(AllItems.WRENCH.asStack()); scene.idle(6); scene.world().cycleBlockProperty(s1Pos, SignalBlock.TYPE); scene.idle(15); @@ -387,7 +383,7 @@ public class TrainSignalScenes { trainElement = scene.world().showIndependentSection(train1, Direction.DOWN); scene.world().moveSection(trainElement, util.vector().of(-10.5, 0, 0), 0); birb1 = scene.special().createBirb(util.vector().centerOf(3, 3, 7) - .add(.5, 0, 0), ParrotElement.DancePose::new); + .add(.5, 0, 0), ParrotPose.DancePose::new); scene.idle(10); scene.world().changeSignalState(s2Pos, SignalState.RED); scene.effects().indicateRedstone(s2Pos.above()); @@ -403,7 +399,7 @@ public class TrainSignalScenes { scene.idle(10); trainElement2 = scene.world().showIndependentSection(train3, null); - birb2 = scene.special().createBirb(util.vector().centerOf(18, 3, 7), ParrotElement.FacePointOfInterestPose::new); + birb2 = scene.special().createBirb(util.vector().centerOf(18, 3, 7), ParrotPose.FacePointOfInterestPose::new); scene.world().moveSection(trainElement2, util.vector().of(4, 0, 6), 0); scene.world().moveSection(trainElement2, util.vector().of(-4.5, 0, 0), 35); @@ -449,7 +445,7 @@ public class TrainSignalScenes { scene.world().moveSection(trainElement3a, util.vector().of(-20, 0, 20), 40); scene.world().animateBogey(util.grid().at(13, 2, 4), -20f, 40); ElementLink birb3 = - scene.special().createBirb(util.vector().of(18, 3.5, -2), ParrotElement.FacePointOfInterestPose::new); + scene.special().createBirb(util.vector().of(18, 3.5, -2), ParrotPose.FacePointOfInterestPose::new); scene.special().moveParrot(birb3, util.vector().of(-20, 0, 20), 40); scene.idle(5); @@ -546,7 +542,7 @@ public class TrainSignalScenes { scene.world().toggleControls(util.grid().at(6, 3, 5)); scene.world().showSection(train, Direction.DOWN); - scene.special().createBirb(util.vector().centerOf(util.grid().at(6, 3, 4)), ParrotElement.DancePose::new); + scene.special().createBirb(util.vector().centerOf(util.grid().at(6, 3, 4)), ParrotPose.DancePose::new); scene.idle(10); scene.world().toggleRedstonePower(comparator); scene.effects().indicateRedstone(signalPos); diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrainStationScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrainStationScenes.java index b6b7713105..5aff486fe7 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrainStationScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrainStationScenes.java @@ -6,14 +6,14 @@ import com.simibubi.create.content.trains.station.StationBlock; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.PonderPalette; +import net.createmod.ponder.api.element.ElementLink; +import net.createmod.ponder.api.element.ParrotElement; +import net.createmod.ponder.api.element.ParrotPose; +import net.createmod.ponder.api.element.WorldSectionElement; import net.createmod.ponder.api.scene.SceneBuilder; import net.createmod.ponder.api.scene.SceneBuildingUtil; -import net.createmod.ponder.foundation.ElementLink; -import net.createmod.ponder.foundation.PonderPalette; -import net.createmod.ponder.foundation.Selection; -import net.createmod.ponder.foundation.element.InputWindowElement; -import net.createmod.ponder.foundation.element.ParrotElement; -import net.createmod.ponder.foundation.element.WorldSectionElement; +import net.createmod.ponder.api.scene.Selection; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.item.ItemStack; @@ -61,8 +61,8 @@ public class TrainStationScenes { AABB bb = new AABB(util.vector().topOf(11, 0, 6), util.vector().topOf(11, 0, 6)).move(0, 2 / 16f, 0); - scene.overlay().showControls(new InputWindowElement(marker, Pointing.DOWN).rightClick() - .withItem(AllBlocks.TRACK_STATION.asStack()), 40); + scene.overlay().showControls(marker, Pointing.DOWN, 40).rightClick() + .withItem(AllBlocks.TRACK_STATION.asStack()); scene.idle(6); scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, bb, bb, 1); scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, bb, bb.inflate(.45f, 1 / 16f, .45f), 100); @@ -88,7 +88,7 @@ public class TrainStationScenes { .text("Stations are the Waypoints of your Track Network"); scene.idle(90); - scene.overlay().showControls(new InputWindowElement(stationTop, Pointing.DOWN).rightClick(), 50); + scene.overlay().showControls(stationTop, Pointing.DOWN, 50).rightClick(); scene.idle(16); scene.overlay().showText(70) .pointAt(stationTop) @@ -101,8 +101,7 @@ public class TrainStationScenes { scene.effects().indicateSuccess(stationPos); scene.idle(20); - scene.overlay().showControls(new InputWindowElement(marker, Pointing.DOWN).withItem(new ItemStack(Items.BARRIER)), - 60); + scene.overlay().showControls(marker, Pointing.DOWN, 60).withItem(new ItemStack(Items.BARRIER)); scene.idle(6); scene.overlay().chaseBoundingBoxOutline(PonderPalette.RED, bb, bb, 1); scene.overlay().chaseBoundingBoxOutline(PonderPalette.RED, bb, bb.inflate(.45f, 1 / 16f, .45f), 80); @@ -115,8 +114,8 @@ public class TrainStationScenes { scene.idle(85); ItemStack casing = AllBlocks.RAILWAY_CASING.asStack(); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(11, 0, 6), Pointing.RIGHT).rightClick() - .withItem(casing), 80); + scene.overlay().showControls(util.vector().topOf(11, 0, 6), Pointing.RIGHT, 80).rightClick() + .withItem(casing); scene.idle(6); scene.world().restoreBlocks(util.select().position(10, 2, 6)); ElementLink trainElement1 = @@ -130,15 +129,15 @@ public class TrainStationScenes { .text("Create new bogeys by using Train Casing on Tracks"); scene.idle(55); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(4, 0, 6), Pointing.RIGHT).rightClick() - .withItem(casing), 15); + scene.overlay().showControls(util.vector().topOf(4, 0, 6), Pointing.RIGHT, 15).rightClick() + .withItem(casing); scene.idle(6); scene.world().setBlock(util.grid().at(3, 2, 6), AllBlocks.SMALL_BOGEY.getDefaultState(), false); ElementLink trainElement2 = scene.world().showIndependentSection(util.select().position(3, 2, 6), Direction.DOWN); scene.idle(20); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(7, 0, 6), Pointing.RIGHT).rightClick() - .withItem(casing), 15); + scene.overlay().showControls(util.vector().topOf(7, 0, 6), Pointing.RIGHT, 15).rightClick() + .withItem(casing); scene.idle(6); scene.world().setBlock(util.grid().at(6, 2, 6), AllBlocks.SMALL_BOGEY.getDefaultState(), false); scene.world().showSectionAndMerge(util.select().position(6, 2, 6), Direction.DOWN, trainElement2); @@ -152,11 +151,11 @@ public class TrainStationScenes { .text("Click the track again to cycle between bogey designs"); scene.idle(35); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(4, 0, 6), Pointing.RIGHT).rightClick(), 15); + scene.overlay().showControls(util.vector().topOf(4, 0, 6), Pointing.RIGHT, 15).rightClick(); scene.idle(6); scene.world().restoreBlocks(util.select().position(3, 2, 6)); scene.idle(20); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(7, 0, 6), Pointing.RIGHT).rightClick(), 15); + scene.overlay().showControls(util.vector().topOf(7, 0, 6), Pointing.RIGHT, 15).rightClick(); scene.idle(6); scene.world().restoreBlocks(util.select().position(6, 2, 6)); scene.idle(30); @@ -200,15 +199,15 @@ public class TrainStationScenes { scene.overlay().chaseBoundingBoxOutline(PonderPalette.GREEN, glue1, glue1.inflate(1.25, 0, .25) .expandTowards(0, 1, 0), 60); scene.idle(15); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(util.grid().at(4, 2, 6)), Pointing.UP) - .withItem(AllItems.SUPER_GLUE.asStack()), 40); + scene.overlay().showControls(util.vector().topOf(util.grid().at(4, 2, 6)), Pointing.UP, 40) + .withItem(AllItems.SUPER_GLUE.asStack()); scene.idle(5); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(util.grid().at(10, 2, 6)), Pointing.UP) - .withItem(AllItems.SUPER_GLUE.asStack()), 40); + scene.overlay().showControls(util.vector().topOf(util.grid().at(10, 2, 6)), Pointing.UP, 40) + .withItem(AllItems.SUPER_GLUE.asStack()); scene.idle(55); - scene.overlay().showControls(new InputWindowElement(util.vector().topOf(util.grid().at(5, 3, 5)), Pointing.DOWN) - .withItem(new ItemStack(Items.CHARCOAL)), 40); + scene.overlay().showControls(util.vector().topOf(util.grid().at(5, 3, 5)), Pointing.DOWN, 40) + .withItem(new ItemStack(Items.CHARCOAL)); scene.idle(10); scene.overlay().showText(90) .pointAt(util.vector().blockSurface(util.grid().at(5, 3, 5), Direction.WEST)) @@ -217,7 +216,7 @@ public class TrainStationScenes { .colored(PonderPalette.BLUE) .text("Assembled Trains will move faster if they can find fuel in assembled chests or barrels"); scene.idle(100); - scene.overlay().showSelectionWithText(util.select().fromTo(4, 3, 6, 5, 4, 7), 60) + scene.overlay().showOutlineWithText(util.select().fromTo(4, 3, 6, 5, 4, 7), 60) .pointAt(util.vector().blockSurface(util.grid().at(5, 4, 6), Direction.UP)) .colored(PonderPalette.RED) .placeNearTarget() @@ -243,7 +242,7 @@ public class TrainStationScenes { .text("An optional second one allows departure from Stations in both directions"); scene.idle(75); - scene.overlay().showControls(new InputWindowElement(stationTop, Pointing.DOWN).rightClick(), 50); + scene.overlay().showControls(stationTop, Pointing.DOWN, 50).rightClick(); scene.idle(16); scene.overlay().showText(60) .pointAt(stationTop) @@ -260,7 +259,7 @@ public class TrainStationScenes { scene.idle(20); ElementLink birb = - scene.special().createBirb(util.vector().centerOf(10, 3, 6), ParrotElement.FacePointOfInterestPose::new); + scene.special().createBirb(util.vector().centerOf(10, 3, 6), ParrotPose.FacePointOfInterestPose::new); scene.idle(15); scene.special().movePointOfInterest(util.grid().at(18, 3, 6)); scene.idle(15); @@ -288,8 +287,8 @@ public class TrainStationScenes { .text("Trains can be disassembled back into blocks at stations only"); scene.idle(85); - scene.overlay().showControls(new InputWindowElement(stationTop, Pointing.DOWN).rightClick() - .withItem(new ItemStack(Items.FILLED_MAP)), 75); + scene.overlay().showControls(stationTop, Pointing.DOWN, 75).rightClick() + .withItem(new ItemStack(Items.FILLED_MAP)); scene.idle(15); scene.overlay().showText(70) .pointAt(stationTop) @@ -311,8 +310,8 @@ public class TrainStationScenes { scene.idle(15); Vec3 target = util.vector().topOf(util.grid().at(5, 3, 6)); - scene.overlay().showControls(new InputWindowElement(target, Pointing.DOWN).rightClick() - .withItem(AllItems.WRENCH.asStack()), 75); + scene.overlay().showControls(target, Pointing.DOWN, 75).rightClick() + .withItem(AllItems.WRENCH.asStack()); scene.idle(15); scene.overlay().showText(70) @@ -323,9 +322,8 @@ public class TrainStationScenes { .text("Assembled Trains can be relocated to nearby Tracks using the Wrench"); scene.idle(60); - scene.overlay() - .showControls(new InputWindowElement(util.vector().topOf(util.grid().at(6, 0, 2)), Pointing.DOWN).rightClick() - .withItem(AllItems.WRENCH.asStack()), 15); + scene.overlay().showControls(util.vector().topOf(util.grid().at(6, 0, 2)), Pointing.DOWN, 15).rightClick() + .withItem(AllItems.WRENCH.asStack()); scene.idle(15); scene.world().moveSection(trainElement3, util.vector().of(0, 0, -4), 5); @@ -361,7 +359,7 @@ public class TrainStationScenes { ElementLink trainElement = scene.world().showIndependentSection(train, Direction.DOWN); scene.world().moveSection(trainElement, util.vector().of(-4, 0, 0), 0); Vec3 target = util.vector().centerOf(2, 3, 6); - ElementLink birb = scene.special().createBirb(target, ParrotElement.FacePointOfInterestPose::new); + ElementLink birb = scene.special().createBirb(target, ParrotPose.FacePointOfInterestPose::new); scene.idle(10); scene.overlay().showText(90) @@ -370,8 +368,7 @@ public class TrainStationScenes { .attachKeyFrame() .text("Schedules can be used to provide drivers with a destination"); scene.idle(70); - scene.overlay().showControls( - new InputWindowElement(target.add(0, 0.5, 0), Pointing.DOWN).withItem(AllItems.SCHEDULE.asStack()), 40); + scene.overlay().showControls(target.add(0, 0.5, 0), Pointing.DOWN, 40).withItem(AllItems.SCHEDULE.asStack()); scene.idle(6); scene.special().movePointOfInterest(util.grid().at(9, 4, 6)); @@ -431,8 +428,7 @@ public class TrainStationScenes { .attachKeyFrame() .text("Mind that a Station can only be approached from the indicated direction"); scene.idle(70); - scene.overlay().showControls( - new InputWindowElement(target.add(0, 0.5, 0), Pointing.DOWN).withItem(AllItems.SCHEDULE.asStack()), 40); + scene.overlay().showControls(target.add(0, 0.5, 0), Pointing.DOWN, 40).withItem(AllItems.SCHEDULE.asStack()); scene.idle(6); scene.overlay().chaseBoundingBoxOutline(PonderPalette.OUTPUT, bb, bb, 1); @@ -474,7 +470,7 @@ public class TrainStationScenes { trainElement = scene.world().showIndependentSection(train, Direction.DOWN); scene.world().moveSection(trainElement, util.vector().of(-4, 0, 0), 0); target = util.vector().centerOf(2, 3, 6); - birb = scene.special().createBirb(target, ParrotElement.FacePointOfInterestPose::new); + birb = scene.special().createBirb(target, ParrotPose.FacePointOfInterestPose::new); scene.idle(10); scene.world().moveSection(trainElement, util.vector().of(4, 0, 0), 20); scene.world().animateBogey(util.grid().at(7, 2, 6), -4f, 20); @@ -485,9 +481,7 @@ public class TrainStationScenes { scene.idle(10); scene.world().animateTrainStation(stationPos, true); scene.idle(10); - scene.overlay().showControls( - new InputWindowElement(util.vector().topOf(stationPos), Pointing.DOWN).withItem(AllItems.SCHEDULE.asStack()), - 20); + scene.overlay().showControls(util.vector().topOf(stationPos), Pointing.DOWN, 20).withItem(AllItems.SCHEDULE.asStack()); scene.idle(30); scene.effects().indicateSuccess(stationPos); scene.idle(10); From 2bf08c8a1ac06bcdc7969472833e9442287e4007 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Sun, 12 Nov 2023 12:36:25 +0100 Subject: [PATCH 017/515] Surprise Logistics --- src/generated/resources/.cache/cache | 7 +- .../assets/create/blockstates/packager.json | 34 +++ .../resources/assets/create/lang/en_ud.json | 2 + .../resources/assets/create/lang/en_us.json | 2 + .../assets/create/models/item/packager.json | 3 + .../create/loot_tables/blocks/packager.json | 20 ++ .../simibubi/create/AllBlockEntityTypes.java | 8 + .../java/com/simibubi/create/AllBlocks.java | 12 + .../java/com/simibubi/create/AllItems.java | 4 + .../com/simibubi/create/AllMenuTypes.java | 5 + .../com/simibubi/create/AllPartialModels.java | 3 + .../relays/belt/BeltBlockEntity.java | 2 +- .../relays/belt/transport/BeltInventory.java | 2 +- .../block/packager/PackagerBlock.java | 105 ++++++++ .../block/packager/PackagerBlockEntity.java | 244 ++++++++++++++++++ .../block/packager/PackagerItemHandler.java | 68 +++++ .../block/packager/PackagerRenderer.java | 75 ++++++ .../logistics/item/box/PackageItem.java | 65 +++-- .../logistics/item/filter/FilterItem.java | 17 +- .../item/filter/PackageFilterMenu.java | 66 +++++ .../item/filter/PackageFilterScreen.java | 46 ++++ .../create/foundation/gui/AllGuiTextures.java | 1 + .../create/models/block/packager/block.json | 83 ++++++ .../models/block/packager/hatch_closed.json | 36 +++ .../models/block/packager/hatch_open.json | 37 +++ .../create/models/block/packager/item.json | 119 +++++++++ .../create/models/block/packager/tray.json | 28 ++ .../create/models/item/package_filter.json | 7 + .../assets/create/textures/block/packager.png | Bin 0 -> 1423 bytes .../textures/block/packager_hatch_closed.png | Bin 0 -> 994 bytes .../textures/block/packager_hatch_open.png | Bin 0 -> 865 bytes .../create/textures/block/packager_tray.png | Bin 0 -> 865 bytes .../assets/create/textures/block/ticker.png | Bin 0 -> 1732 bytes .../textures/entity/package/cardboard.png | Bin 1401 -> 1394 bytes .../create/textures/item/package_filter.png | Bin 0 -> 254 bytes 35 files changed, 1069 insertions(+), 32 deletions(-) create mode 100644 src/generated/resources/assets/create/blockstates/packager.json create mode 100644 src/generated/resources/assets/create/models/item/packager.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/packager.json create mode 100644 src/main/java/com/simibubi/create/content/logistics/block/packager/PackagerBlock.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/block/packager/PackagerBlockEntity.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/block/packager/PackagerItemHandler.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/block/packager/PackagerRenderer.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/item/filter/PackageFilterMenu.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/item/filter/PackageFilterScreen.java create mode 100644 src/main/resources/assets/create/models/block/packager/block.json create mode 100644 src/main/resources/assets/create/models/block/packager/hatch_closed.json create mode 100644 src/main/resources/assets/create/models/block/packager/hatch_open.json create mode 100644 src/main/resources/assets/create/models/block/packager/item.json create mode 100644 src/main/resources/assets/create/models/block/packager/tray.json create mode 100644 src/main/resources/assets/create/models/item/package_filter.json create mode 100644 src/main/resources/assets/create/textures/block/packager.png create mode 100644 src/main/resources/assets/create/textures/block/packager_hatch_closed.png create mode 100644 src/main/resources/assets/create/textures/block/packager_hatch_open.png create mode 100644 src/main/resources/assets/create/textures/block/packager_tray.png create mode 100644 src/main/resources/assets/create/textures/block/ticker.png create mode 100644 src/main/resources/assets/create/textures/item/package_filter.png diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index eeb46218c1..c41c0f1af6 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -328,6 +328,7 @@ ed1a1d7a8b47027a1fcac2014e80f4e061d0f983 assets/create/blockstates/oxidized_copp 836ceee0f1db4802b761cd2bc0b99dbc3daa5715 assets/create/blockstates/oxidized_copper_tile_slab.json 94761f4295416261080bc6a1b21a5790ac7104dc assets/create/blockstates/oxidized_copper_tile_stairs.json 9257b8d0d1edd9c707d1fc6c9819eca569d954e0 assets/create/blockstates/oxidized_copper_tiles.json +974dc3963db84cad9951372b1cb03a4ea2669436 assets/create/blockstates/packager.json 005cc195712aca252326ae8239ed0caf9a69a314 assets/create/blockstates/peculiar_bell.json 1286ad485c73b70714094bb9d5ad411021856399 assets/create/blockstates/pink_nixie_tube.json 30971f2f76fe56f144178c33ad6bde5fc9fb61c3 assets/create/blockstates/pink_sail.json @@ -566,8 +567,8 @@ bf2b0310500213ff853c748c236eb5d01f61658e assets/create/blockstates/yellow_toolbo 5616dda664dd106d576848124fc0fc1de18d0fd3 assets/create/blockstates/yellow_valve_handle.json 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json -c9b92d20967574614dbe75121c47b9d5b395235b assets/create/lang/en_ud.json -74fd63a753a9c0de2275ba4a0faa3d5fe94aed36 assets/create/lang/en_us.json +41e8bb7d761b345977c403f0f1694098787e9d46 assets/create/lang/en_ud.json +dd9b857b521e34ddbcdc05c641d5591b7ab0d331 assets/create/lang/en_us.json 487a511a01b2a4531fb672f917922312db78f958 assets/create/models/block/acacia_window.json b48060cba1a382f373a05bf0039054053eccf076 assets/create/models/block/acacia_window_pane_noside.json 3066db1bf03cffa1a9c7fbacf47ae586632f4eb3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -1960,6 +1961,7 @@ d7a18b43ce284e0a4bef4c0e05e718da0c25d5a3 assets/create/models/item/oxidized_copp 0ea3b3f13f620f7a1df57e4796df5594fa30bd09 assets/create/models/item/oxidized_copper_tile_slab.json 8dbee928bbdadcc032b7b6d0d31de56b596f79eb assets/create/models/item/oxidized_copper_tile_stairs.json df1a91a00fb5390d7a95d9e34cb7646b203291bd assets/create/models/item/oxidized_copper_tiles.json +15baa926f7208040c437c920ae0c159a06057073 assets/create/models/item/packager.json 477cf0b4dd4482353668f6307f3f94d0fd77dd62 assets/create/models/item/peculiar_bell.json 9664f171c7856661776c5c4ef0b6880a77db648e assets/create/models/item/pink_seat.json 1c95a98a6f55eb74626e6a51fb5a896f97741681 assets/create/models/item/pink_toolbox.json @@ -3705,6 +3707,7 @@ f347b600b3d5ba444fc715e6e5d445de63352224 data/create/loot_tables/blocks/ornate_i ee3a8e618891971e783ea0b348154e861128b4f1 data/create/loot_tables/blocks/oxidized_copper_tile_slab.json a642330259b86f5a686d86d5d6773e89adb021d5 data/create/loot_tables/blocks/oxidized_copper_tile_stairs.json a8fedc4caa72f8690fddc3c7ebaa809d2255f5b6 data/create/loot_tables/blocks/oxidized_copper_tiles.json +f4934c1e4a0a7f6f114556c5f8aa182b7677e73b data/create/loot_tables/blocks/packager.json f589c7b2fe51fb13a221b451563477c134ce6c1b data/create/loot_tables/blocks/peculiar_bell.json 2e21a06c0d671e543bffecb0b67d97b51fa83ddc data/create/loot_tables/blocks/pink_nixie_tube.json be99e48382ef8ccfb94c227c4dec7b627b4128e7 data/create/loot_tables/blocks/pink_sail.json diff --git a/src/generated/resources/assets/create/blockstates/packager.json b/src/generated/resources/assets/create/blockstates/packager.json new file mode 100644 index 0000000000..956a9d4734 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/packager.json @@ -0,0 +1,34 @@ +{ + "variants": { + "facing=north,powered=false": { + "model": "create:block/packager/block" + }, + "facing=south,powered=false": { + "model": "create:block/packager/block", + "y": 180 + }, + "facing=west,powered=false": { + "model": "create:block/packager/block", + "y": 270 + }, + "facing=east,powered=false": { + "model": "create:block/packager/block", + "y": 90 + }, + "facing=north,powered=true": { + "model": "create:block/packager/block" + }, + "facing=south,powered=true": { + "model": "create:block/packager/block", + "y": 180 + }, + "facing=west,powered=true": { + "model": "create:block/packager/block", + "y": 270 + }, + "facing=east,powered=true": { + "model": "create:block/packager/block", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index dd58fb6beb..b31faaa3b2 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -329,6 +329,7 @@ "block.create.oxidized_copper_tile_slab": "q\u0250\u05DFS \u01DD\u05DF\u0131\u27D8 \u0279\u01DDddo\u0186 p\u01DDz\u0131p\u0131xO", "block.create.oxidized_copper_tile_stairs": "s\u0279\u0131\u0250\u0287S \u01DD\u05DF\u0131\u27D8 \u0279\u01DDddo\u0186 p\u01DDz\u0131p\u0131xO", "block.create.oxidized_copper_tiles": "s\u01DD\u05DF\u0131\u27D8 \u0279\u01DDddo\u0186 p\u01DDz\u0131p\u0131xO", + "block.create.packager": "\u0279\u01DDb\u0250\u029E\u0254\u0250\u0500", "block.create.peculiar_bell": "\u05DF\u05DF\u01DD\u15FA \u0279\u0250\u0131\u05DFn\u0254\u01DD\u0500", "block.create.pink_nixie_tube": "\u01DDqn\u27D8 \u01DD\u0131x\u0131N \u029Eu\u0131\u0500", "block.create.pink_sail": "\u05DF\u0131\u0250S \u029Eu\u0131\u0500", @@ -645,6 +646,7 @@ "item.create.netherite_backtank_placeable": "\u01DD\u05DFq\u0250\u01DD\u0254\u0250\u05DF\u0500 \u029Eu\u0250\u0287\u029E\u0254\u0250\u15FA \u01DD\u0287\u0131\u0279\u01DD\u0265\u0287\u01DDN", "item.create.netherite_diving_boots": "s\u0287oo\u15FA bu\u0131\u028C\u0131\u15E1 \u01DD\u0287\u0131\u0279\u01DD\u0265\u0287\u01DDN", "item.create.netherite_diving_helmet": "\u0287\u01DD\u026F\u05DF\u01DDH bu\u0131\u028C\u0131\u15E1 \u01DD\u0287\u0131\u0279\u01DD\u0265\u0287\u01DDN", + "item.create.package_filter": "\u0279\u01DD\u0287\u05DF\u0131\u2132 \u01DDb\u0250\u029E\u0254\u0250\u0500", "item.create.polished_rose_quartz": "z\u0287\u0279\u0250n\u1F49 \u01DDso\u1D1A p\u01DD\u0265s\u0131\u05DFo\u0500", "item.create.potato_cannon": "uouu\u0250\u0186 o\u0287\u0250\u0287o\u0500", "item.create.powdered_obsidian": "u\u0250\u0131p\u0131sqO p\u01DD\u0279\u01DDp\u028Do\u0500", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 646d7f79a9..8c5b81b454 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -332,6 +332,7 @@ "block.create.oxidized_copper_tile_slab": "Oxidized Copper Tile Slab", "block.create.oxidized_copper_tile_stairs": "Oxidized Copper Tile Stairs", "block.create.oxidized_copper_tiles": "Oxidized Copper Tiles", + "block.create.packager": "Packager", "block.create.peculiar_bell": "Peculiar Bell", "block.create.pink_nixie_tube": "Pink Nixie Tube", "block.create.pink_sail": "Pink Sail", @@ -652,6 +653,7 @@ "item.create.netherite_backtank_placeable": "Netherite Backtank Placeable", "item.create.netherite_diving_boots": "Netherite Diving Boots", "item.create.netherite_diving_helmet": "Netherite Diving Helmet", + "item.create.package_filter": "Package Filter", "item.create.polished_rose_quartz": "Polished Rose Quartz", "item.create.potato_cannon": "Potato Cannon", "item.create.powdered_obsidian": "Powdered Obsidian", diff --git a/src/generated/resources/assets/create/models/item/packager.json b/src/generated/resources/assets/create/models/item/packager.json new file mode 100644 index 0000000000..18467506e5 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/packager.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/packager/item" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/packager.json b/src/generated/resources/data/create/loot_tables/blocks/packager.json new file mode 100644 index 0000000000..a127ae156f --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/packager.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1.0, + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "create:packager" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java index dc9fcc1fc4..3277a60f53 100644 --- a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java +++ b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java @@ -178,6 +178,8 @@ import com.simibubi.create.content.logistics.block.inventories.CreativeCrateBloc import com.simibubi.create.content.logistics.block.mechanicalArm.ArmBlockEntity; import com.simibubi.create.content.logistics.block.mechanicalArm.ArmInstance; import com.simibubi.create.content.logistics.block.mechanicalArm.ArmRenderer; +import com.simibubi.create.content.logistics.block.packager.PackagerBlockEntity; +import com.simibubi.create.content.logistics.block.packager.PackagerRenderer; import com.simibubi.create.content.logistics.block.redstone.AnalogLeverBlockEntity; import com.simibubi.create.content.logistics.block.redstone.AnalogLeverInstance; import com.simibubi.create.content.logistics.block.redstone.AnalogLeverRenderer; @@ -450,6 +452,12 @@ public class AllBlockEntityTypes { .blockEntity("item_vault", ItemVaultBlockEntity::new) .validBlocks(AllBlocks.ITEM_VAULT) .register(); + + public static final BlockEntityEntry PACKAGER = REGISTRATE + .blockEntity("packager", PackagerBlockEntity::new) + .validBlocks(AllBlocks.PACKAGER) + .renderer(() -> PackagerRenderer::new) + .register(); public static final BlockEntityEntry MECHANICAL_PISTON = REGISTRATE .blockEntity("mechanical_piston", MechanicalPistonBlockEntity::new) diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index ccd61d3b47..ea00aaf1d6 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -203,6 +203,7 @@ import com.simibubi.create.content.logistics.block.funnel.FunnelMovementBehaviou import com.simibubi.create.content.logistics.block.inventories.CreativeCrateBlock; import com.simibubi.create.content.logistics.block.mechanicalArm.ArmBlock; import com.simibubi.create.content.logistics.block.mechanicalArm.ArmItem; +import com.simibubi.create.content.logistics.block.packager.PackagerBlock; import com.simibubi.create.content.logistics.block.redstone.AnalogLeverBlock; import com.simibubi.create.content.logistics.block.redstone.ContactMovementBehaviour; import com.simibubi.create.content.logistics.block.redstone.ContentObserverBlock; @@ -1737,6 +1738,17 @@ public class AllBlocks { .build() .register(); + public static final BlockEntry PACKAGER = REGISTRATE.block("packager", PackagerBlock::new) + .initialProperties(SharedProperties::softMetal) + .properties(p -> p.noOcclusion()) + .addLayer(() -> RenderType::cutoutMipped) + .blockstate((c, p) -> p.horizontalBlock(c.get(), AssetLookup.partialBaseModel(c, p))) + .transform(BlockStressDefaults.setImpact(1.0)) + .item() + .model(AssetLookup::customItemModel) + .build() + .register(); + public static final BlockEntry ANDESITE_FUNNEL = REGISTRATE.block("andesite_funnel", AndesiteFunnelBlock::new) .initialProperties(SharedProperties::stone) diff --git a/src/main/java/com/simibubi/create/AllItems.java b/src/main/java/com/simibubi/create/AllItems.java index eb8defdf26..2935185b4c 100644 --- a/src/main/java/com/simibubi/create/AllItems.java +++ b/src/main/java/com/simibubi/create/AllItems.java @@ -359,6 +359,10 @@ public class AllItems { .model(AssetLookup.existingItemModel()) .register(); + public static final ItemEntry PACKAGE_FILTER = REGISTRATE.item("package_filter", FilterItem::address) + .model(AssetLookup.existingItemModel()) + .register(); + public static final ItemEntry SCHEDULE = REGISTRATE.item("schedule", ScheduleItem::new) .lang("Train Schedule") .register(); diff --git a/src/main/java/com/simibubi/create/AllMenuTypes.java b/src/main/java/com/simibubi/create/AllMenuTypes.java index bbd3278f4d..368696ac65 100644 --- a/src/main/java/com/simibubi/create/AllMenuTypes.java +++ b/src/main/java/com/simibubi/create/AllMenuTypes.java @@ -10,6 +10,8 @@ import com.simibubi.create.content.logistics.item.filter.AttributeFilterMenu; import com.simibubi.create.content.logistics.item.filter.AttributeFilterScreen; import com.simibubi.create.content.logistics.item.filter.FilterMenu; import com.simibubi.create.content.logistics.item.filter.FilterScreen; +import com.simibubi.create.content.logistics.item.filter.PackageFilterMenu; +import com.simibubi.create.content.logistics.item.filter.PackageFilterScreen; import com.simibubi.create.content.logistics.trains.management.schedule.ScheduleMenu; import com.simibubi.create.content.logistics.trains.management.schedule.ScheduleScreen; import com.simibubi.create.content.schematics.block.SchematicTableMenu; @@ -38,6 +40,9 @@ public class AllMenuTypes { public static final MenuEntry ATTRIBUTE_FILTER = register("attribute_filter", AttributeFilterMenu::new, () -> AttributeFilterScreen::new); + + public static final MenuEntry PACKAGE_FILTER = + register("package_filter", PackageFilterMenu::new, () -> PackageFilterScreen::new); public static final MenuEntry CRAFTING_BLUEPRINT = register("crafting_blueprint", BlueprintMenu::new, () -> BlueprintScreen::new); diff --git a/src/main/java/com/simibubi/create/AllPartialModels.java b/src/main/java/com/simibubi/create/AllPartialModels.java index 7a75ec4ce7..8b1e8fd3e9 100644 --- a/src/main/java/com/simibubi/create/AllPartialModels.java +++ b/src/main/java/com/simibubi/create/AllPartialModels.java @@ -108,6 +108,9 @@ public class AllPartialModels { EJECTOR_TOP = block("weighted_ejector/top"), + PACKAGER_TRAY = block("packager/tray"), PACKAGER_HATCH_OPEN = block("packager/hatch_open"), + PACKAGER_HATCH_CLOSED = block("packager/hatch_closed"), + COPPER_BACKTANK_SHAFT = block("copper_backtank/block_shaft_input"), COPPER_BACKTANK_COGS = block("copper_backtank/block_cogs"), diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlockEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlockEntity.java index 67a4aa1645..4cbd097df6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlockEntity.java @@ -503,7 +503,7 @@ public class BeltBlockEntity extends KineticBlockEntity { transportedStack.sideOffset *= -1; } else { float extraOffset = - BeltHelper.getSegmentBE(level, worldPosition.relative(movementFacing.getOpposite())) != null ? .275f + BeltHelper.getSegmentBE(level, worldPosition.relative(movementFacing.getOpposite())) != null ? .26f : 0; transportedStack.beltPosition = getDirectionAwareBeltMovementSpeed() > 0 ? index - extraOffset : index + 1 + extraOffset; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltInventory.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltInventory.java index 5b53c0557b..b4ec598883 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltInventory.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltInventory.java @@ -180,7 +180,7 @@ public class BeltInventory { // Apply Movement currentItem.beltPosition += limitedMovement; currentItem.sideOffset += - (currentItem.getTargetSideOffset() - currentItem.sideOffset) * Math.abs(limitedMovement) * 2f; + (currentItem.getTargetSideOffset() - currentItem.sideOffset) * Math.abs(limitedMovement) * 6f; currentPos = currentItem.beltPosition; // Movement successful diff --git a/src/main/java/com/simibubi/create/content/logistics/block/packager/PackagerBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/packager/PackagerBlock.java new file mode 100644 index 0000000000..09a6a4ea68 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/packager/PackagerBlock.java @@ -0,0 +1,105 @@ +package com.simibubi.create.content.logistics.block.packager; + +import com.simibubi.create.AllBlockEntityTypes; +import com.simibubi.create.AllItems; +import com.simibubi.create.content.contraptions.wrench.IWrenchable; +import com.simibubi.create.foundation.block.IBE; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.HorizontalDirectionalBlock; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition.Builder; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.phys.BlockHitResult; + +public class PackagerBlock extends HorizontalDirectionalBlock implements IBE, IWrenchable { + + public static final BooleanProperty POWERED = BlockStateProperties.POWERED; + + public PackagerBlock(Properties properties) { + super(properties); + registerDefaultState(defaultBlockState().setValue(POWERED, false)); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext context) { + return super.getStateForPlacement(context).setValue(POWERED, context.getLevel() + .hasNeighborSignal(context.getClickedPos())) + .setValue(FACING, context.getHorizontalDirection() + .getOpposite()); + } + + @Override + public InteractionResult use(BlockState state, Level worldIn, BlockPos pos, Player player, InteractionHand handIn, + BlockHitResult hit) { + if (player != null && AllItems.WRENCH.isIn(player.getItemInHand(handIn))) + return InteractionResult.PASS; + + if (onBlockEntityUse(worldIn, pos, be -> { + if (be.heldBox.isEmpty()) + return InteractionResult.PASS; + if (be.animationTicks > 0) + return InteractionResult.PASS; + if (!worldIn.isClientSide()) { + player.getInventory() + .placeItemBackInInventory(be.heldBox.copy()); + be.heldBox = ItemStack.EMPTY; + be.notifyUpdate(); + } + return InteractionResult.SUCCESS; + }).consumesAction()) + return InteractionResult.SUCCESS; + + return InteractionResult.PASS; + } + + @Override + protected void createBlockStateDefinition(Builder builder) { + super.createBlockStateDefinition(builder.add(POWERED, FACING)); + } + + @Override + public void neighborChanged(BlockState state, Level worldIn, BlockPos pos, Block blockIn, BlockPos fromPos, + boolean isMoving) { + if (worldIn.isClientSide) + return; + boolean previouslyPowered = state.getValue(POWERED); + if (previouslyPowered == worldIn.hasNeighborSignal(pos)) + return; + worldIn.setBlock(pos, state.cycle(POWERED), 2); + if (!previouslyPowered) + withBlockEntityDo(worldIn, pos, PackagerBlockEntity::activate); + } + + @Override + public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pIsMoving) { + IBE.onRemove(pState, pLevel, pPos, pNewState); + } + + @Override + public boolean shouldCheckWeakPower(BlockState state, LevelReader world, BlockPos pos, Direction side) { + return false; + } + + @Override + public Class getBlockEntityClass() { + return PackagerBlockEntity.class; + } + + @Override + public BlockEntityType getBlockEntityType() { + return AllBlockEntityTypes.PACKAGER.get(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/packager/PackagerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/packager/PackagerBlockEntity.java new file mode 100644 index 0000000000..1a1f2733e9 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/packager/PackagerBlockEntity.java @@ -0,0 +1,244 @@ +package com.simibubi.create.content.logistics.block.packager; + +import java.util.List; + +import com.simibubi.create.content.logistics.block.inventories.BottomlessItemHandler; +import com.simibubi.create.content.logistics.item.box.PackageItem; +import com.simibubi.create.foundation.blockEntity.BlockEntityBehaviour; +import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; +import com.simibubi.create.foundation.blockEntity.behaviour.inventory.CapManipulationBehaviourBase.InterfaceProvider; +import com.simibubi.create.foundation.blockEntity.behaviour.inventory.InvManipulationBehaviour; +import com.simibubi.create.foundation.item.ItemHelper; +import com.simibubi.create.foundation.utility.NBTHelper; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.Mth; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.items.CapabilityItemHandler; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.ItemHandlerHelper; +import net.minecraftforge.items.ItemStackHandler; + +public class PackagerBlockEntity extends SmartBlockEntity { + + enum RedstoneMode { + SEND_ONE, KEEP_SENDING + } + + public InvManipulationBehaviour targetInventory; + public RedstoneMode mode; + public boolean active; + public ItemStack heldBox; + public ItemStack previouslyUnwrapped; + + public PackagerItemHandler inventory; + private final LazyOptional invProvider; + + public static final int CYCLE = 30; + public int animationTicks; + public boolean animationInward; + + public PackagerBlockEntity(BlockEntityType typeIn, BlockPos pos, BlockState state) { + super(typeIn, pos, state); + mode = RedstoneMode.SEND_ONE; + active = state.getOptionalValue(PackagerBlock.POWERED) + .orElse(false); + heldBox = ItemStack.EMPTY; + previouslyUnwrapped = ItemStack.EMPTY; + inventory = new PackagerItemHandler(this); + invProvider = LazyOptional.of(() -> inventory); + animationTicks = 0; + animationInward = true; + } + + @Override + public void addBehaviours(List behaviours) { + behaviours.add(targetInventory = new InvManipulationBehaviour(this, InterfaceProvider.oppositeOfBlockFacing())); + } + + @Override + public void tick() { + super.tick(); + if (animationTicks == 0) { + previouslyUnwrapped = ItemStack.EMPTY; + return; + } + animationTicks--; + } + + @Override + public void lazyTick() { + super.lazyTick(); + if (!active || level.isClientSide()) + return; + attemptToSend(); + } + + public void activate() { + active = true; + setChanged(); + } + + public boolean unwrapBox(ItemStack box, boolean simulate) { + if (animationTicks > 0) + return false; + + ItemStackHandler contents = PackageItem.getContents(box); + IItemHandler targetInv = targetInventory.getInventory(); + if (targetInv == null) + return false; + + for (int slot = 0; slot < targetInv.getSlots(); slot++) { + ItemStack itemInSlot = targetInv.getStackInSlot(slot); + int itemsAddedToSlot = 0; + for (int boxSlot = 0; boxSlot < contents.getSlots(); boxSlot++) { + ItemStack toInsert = contents.getStackInSlot(boxSlot); + if (toInsert.isEmpty()) + continue; + if (targetInv.insertItem(slot, toInsert, true) + .getCount() == toInsert.getCount()) + continue; + if (itemInSlot.isEmpty()) { + itemInSlot = toInsert; + targetInv.insertItem(slot, toInsert, simulate); + contents.setStackInSlot(boxSlot, ItemStack.EMPTY); + continue; + } + if (!ItemHandlerHelper.canItemStacksStack(toInsert, itemInSlot)) + continue; + int insertedAmount = toInsert.getCount() - targetInv.insertItem(slot, toInsert, simulate) + .getCount(); + int slotLimit = (int) ((targetInv.getStackInSlot(slot) + .isEmpty() ? itemInSlot.getMaxStackSize() / 64f : 1) * targetInv.getSlotLimit(slot)); + int insertableAmountWithPreviousItems = + Math.min(toInsert.getCount(), slotLimit - itemInSlot.getCount() - itemsAddedToSlot); + int added = Math.min(insertedAmount, insertableAmountWithPreviousItems); + contents.setStackInSlot(boxSlot, + ItemHandlerHelper.copyStackWithSize(toInsert, toInsert.getCount() - added)); + } + } + + if (!(targetInv instanceof BottomlessItemHandler)) + for (int boxSlot = 0; boxSlot < contents.getSlots(); boxSlot++) + if (!contents.getStackInSlot(boxSlot) + .isEmpty()) + return false; + + if (simulate) + return true; + + previouslyUnwrapped = box; + animationInward = true; + animationTicks = CYCLE; + notifyUpdate(); + return true; + } + + public void attemptToSend() { + if (mode == RedstoneMode.SEND_ONE || !isBlockPowered()) + active = false; + if (!heldBox.isEmpty() || animationTicks != 0) + return; + IItemHandler targetInv = targetInventory.getInventory(); + if (targetInv == null) + return; + + boolean anyItemPresent = false; + ItemStackHandler extractedItems = new ItemStackHandler(PackageItem.SLOTS); + ItemStack extractedPackageItem = ItemStack.EMPTY; + + Outer: for (int i = 0; i < PackageItem.SLOTS; i++) + for (int slot = 0; slot < targetInv.getSlots(); slot++) { + ItemStack extracted = targetInv.extractItem(slot, 64, true); + if (extracted.isEmpty()) + continue; + + boolean bulky = !extracted.getItem() + .canFitInsideContainerItems(); + if (bulky && anyItemPresent) + continue; + + anyItemPresent = true; + int leftovers = ItemHandlerHelper.insertItemStacked(extractedItems, extracted, false) + .getCount(); + targetInv.extractItem(slot, extracted.getCount() - leftovers, false); + if (extracted.getItem() instanceof PackageItem) + extractedPackageItem = extracted; + if (bulky) + break Outer; + } + + if (!anyItemPresent) + return; + + heldBox = extractedPackageItem.isEmpty() ? PackageItem.containing(extractedItems) : extractedPackageItem.copy(); + animationInward = false; + animationTicks = CYCLE; + notifyUpdate(); + } + + @Override + protected void read(CompoundTag compound, boolean clientPacket) { + super.read(compound, clientPacket); + active = compound.getBoolean("Active"); + animationInward = compound.getBoolean("AnimationInward"); + animationTicks = compound.getInt("AnimationTicks"); + mode = NBTHelper.readEnum(compound, "Mode", RedstoneMode.class); + heldBox = ItemStack.of(compound.getCompound("HeldBox")); + previouslyUnwrapped = ItemStack.of(compound.getCompound("InsertedBox")); + } + + @Override + protected void write(CompoundTag compound, boolean clientPacket) { + super.write(compound, clientPacket); + compound.putBoolean("Active", active); + compound.putBoolean("AnimationInward", animationInward); + compound.putInt("AnimationTicks", animationTicks); + NBTHelper.writeEnum(compound, "Mode", mode); + compound.put("HeldBox", heldBox.serializeNBT()); + compound.put("InsertedBox", previouslyUnwrapped.serializeNBT()); + } + + @Override + public void invalidate() { + super.invalidate(); + invProvider.invalidate(); + } + + @Override + public void destroy() { + super.destroy(); + ItemHelper.dropContents(level, worldPosition, inventory); + } + + @Override + public LazyOptional getCapability(Capability cap, Direction side) { + if (cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY && side != Direction.DOWN) + return invProvider.cast(); + return super.getCapability(cap, side); + } + + private boolean isBlockPowered() { + return getBlockState().getOptionalValue(PackagerBlock.POWERED) + .orElse(false); + } + + public float getTrayOffset(float partialTicks) { + float progress = Mth.clamp(Math.max(0, animationTicks - 5 - partialTicks) / (CYCLE * .75f) * 2 - 1, -1, 1); + progress = 1 - progress * progress; + return progress * progress; + } + + public ItemStack getRenderedBox() { + if (animationInward) + return animationTicks <= CYCLE / 2 ? ItemStack.EMPTY : previouslyUnwrapped; + return animationTicks >= CYCLE / 2 ? ItemStack.EMPTY : heldBox; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/packager/PackagerItemHandler.java b/src/main/java/com/simibubi/create/content/logistics/block/packager/PackagerItemHandler.java new file mode 100644 index 0000000000..e372978a1a --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/packager/PackagerItemHandler.java @@ -0,0 +1,68 @@ +package com.simibubi.create.content.logistics.block.packager; + +import com.simibubi.create.content.logistics.item.box.PackageItem; + +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.items.IItemHandlerModifiable; +import net.minecraftforge.items.ItemHandlerHelper; + +public class PackagerItemHandler implements IItemHandlerModifiable { + + private PackagerBlockEntity blockEntity; + + public PackagerItemHandler(PackagerBlockEntity blockEntity) { + this.blockEntity = blockEntity; + } + + @Override + public int getSlots() { + return 1; + } + + @Override + public ItemStack getStackInSlot(int slot) { + return blockEntity.heldBox; + } + + @Override + public void setStackInSlot(int slot, ItemStack stack) { + if (slot != 0) + return; + blockEntity.heldBox = stack; + blockEntity.notifyUpdate(); + } + + @Override + public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) { + if (!blockEntity.heldBox.isEmpty()) + return stack; + if (!isItemValid(slot, stack)) + return stack; + if (!blockEntity.unwrapBox(stack, true)) + return stack; + if (!simulate) + blockEntity.unwrapBox(stack, false); + return ItemHandlerHelper.copyStackWithSize(stack, stack.getCount() - 1); + } + + @Override + public ItemStack extractItem(int slot, int amount, boolean simulate) { + if (blockEntity.animationTicks != 0) + return ItemStack.EMPTY; + ItemStack box = blockEntity.heldBox; + if (!simulate) + setStackInSlot(slot, ItemStack.EMPTY); + return box; + } + + @Override + public int getSlotLimit(int slot) { + return 1; + } + + @Override + public boolean isItemValid(int slot, ItemStack stack) { + return stack.getItem() instanceof PackageItem; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/packager/PackagerRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/packager/PackagerRenderer.java new file mode 100644 index 0000000000..25f671558f --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/packager/PackagerRenderer.java @@ -0,0 +1,75 @@ +package com.simibubi.create.content.logistics.block.packager; + +import com.jozufozu.flywheel.core.PartialModel; +import com.jozufozu.flywheel.util.transform.TransformStack; +import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.AllPartialModels; +import com.simibubi.create.foundation.blockEntity.renderer.SmartBlockEntityRenderer; +import com.simibubi.create.foundation.render.CachedBufferer; +import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.utility.AngleHelper; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.block.model.ItemTransforms.TransformType; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider.Context; +import net.minecraft.core.Direction; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; + +public class PackagerRenderer extends SmartBlockEntityRenderer { + + public PackagerRenderer(Context context) { + super(context); + } + + @Override + protected void renderSafe(PackagerBlockEntity be, float partialTicks, PoseStack ms, MultiBufferSource buffer, + int light, int overlay) { + super.renderSafe(be, partialTicks, ms, buffer, light, overlay); + + ItemStack renderedBox = be.getRenderedBox(); + float trayOffset = be.getTrayOffset(partialTicks); + boolean hatchOpen = be.animationTicks > 5 && be.animationTicks < PackagerBlockEntity.CYCLE - 5; + BlockState blockState = be.getBlockState(); + Direction facing = blockState.getValue(PackagerBlock.FACING) + .getOpposite(); + + PartialModel hatchModel = + hatchOpen ? AllPartialModels.PACKAGER_HATCH_OPEN : AllPartialModels.PACKAGER_HATCH_CLOSED; + + SuperByteBuffer sbb = CachedBufferer.partial(hatchModel, blockState); + sbb.translate(Vec3.atLowerCornerOf(facing.getNormal()) + .scale(.49999f)) + .rotateCentered(Direction.UP, AngleHelper.rad(AngleHelper.horizontalAngle(facing))) + .rotateCentered(Direction.EAST, AngleHelper.rad(AngleHelper.verticalAngle(facing))) + .light(light) + .renderInto(ms, buffer.getBuffer(RenderType.solid())); + + ms.pushPose(); + TransformStack msr = TransformStack.cast(ms); + msr.translate(Vec3.atLowerCornerOf(facing.getNormal()) + .scale(trayOffset)); + + sbb = CachedBufferer.partial(AllPartialModels.PACKAGER_TRAY, blockState); + sbb.rotateCentered(Direction.UP, AngleHelper.rad(facing.toYRot())) + .light(light) + .renderInto(ms, buffer.getBuffer(RenderType.cutoutMipped())); + + if (!renderedBox.isEmpty()) { + msr.translate(.5f, .5f, .5f) + .rotateY(facing.toYRot()) + .translate(0, 2 / 16f, 0) + .scale(1.49f, 1.49f, 1.49f); + Minecraft.getInstance() + .getItemRenderer() + .renderStatic(null, renderedBox, TransformType.FIXED, false, ms, buffer, be.getLevel(), light, overlay, + 0); + } + + ms.popPose(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/item/box/PackageItem.java b/src/main/java/com/simibubi/create/content/logistics/item/box/PackageItem.java index 0fa1f69a9e..31f4403cf5 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/box/PackageItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/box/PackageItem.java @@ -5,7 +5,6 @@ import java.util.List; import java.util.Random; import com.simibubi.create.AllEntityTypes; -import com.simibubi.create.AllItems; import com.simibubi.create.foundation.utility.Components; import net.minecraft.ChatFormatting; @@ -31,6 +30,7 @@ import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; +import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.ItemStackHandler; public class PackageItem extends Item { @@ -54,6 +54,11 @@ public class PackageItem extends Item { return FALLBACK_BOX; } + @Override + public boolean canFitInsideContainerItems() { + return false; + } + @Override public boolean hasCustomEntity(ItemStack stack) { return true; @@ -65,10 +70,15 @@ public class PackageItem extends Item { } public static ItemStack containing(List stacks) { + ItemStackHandler newInv = new ItemStackHandler(9); + stacks.forEach(s -> ItemHandlerHelper.insertItemStacked(newInv, s, false)); + return containing(newInv); + } + + public static ItemStack containing(ItemStackHandler stacks) { ItemStack box = new ItemStack(randomBox()); CompoundTag compound = new CompoundTag(); - ItemStackHandler newInv = new ItemStackHandler(9); - compound.put("Items", newInv.serializeNBT()); + compound.put("Items", stacks.serializeNBT()); box.setTag(compound); return box; } @@ -81,19 +91,14 @@ public class PackageItem extends Item { .putString("Address", address); } - public static boolean matchAddress(ItemStack box, String other) { - String address = box.getTag() + public static boolean matchAddress(ItemStack box, String address) { + String boxAddress = box.getTag() .getString("Address"); - if (address == null || address.isEmpty()) - return false; - if (address.equals("*")) + if (address.equals("*") || boxAddress.equals("*")) return true; - if (address.equals(other)) - return true; - if (address.endsWith("*") && other.startsWith(address.substring(0, address.length() - 1))) - return true; - - return false; + String matcher = "\\Q" + address.replace("*", "\\E.*\\Q") + "\\E"; + String boxMatcher = "\\Q" + boxAddress.replace("*", "\\E.*\\Q") + "\\E"; + return address.matches(boxMatcher) || boxAddress.matches(matcher); } public static float getWidth(ItemStack box) { @@ -113,7 +118,6 @@ public class PackageItem extends Item { CompoundTag invNBT = box.getOrCreateTagElement("Items"); if (!invNBT.isEmpty()) newInv.deserializeNBT(invNBT); - newInv.setStackInSlot(0, AllItems.BRASS_INGOT.asStack()); return newInv; } @@ -130,27 +134,32 @@ public class PackageItem extends Item { if (compoundnbt.contains("Address", Tag.TAG_STRING)) pTooltipComponents.add(Components.literal("-> " + compoundnbt.getString("Address")) .withStyle(ChatFormatting.GOLD)); - if (!compoundnbt.contains("Items", Tag.TAG_LIST)) + if (!compoundnbt.contains("Items", Tag.TAG_COMPOUND)) return; - int j = 0; + int visibleNames = 0; + int skippedNames = 0; ItemStackHandler contents = getContents(pStack); for (int i = 0; i < contents.getSlots(); i++) { ItemStack itemstack = contents.getStackInSlot(i); if (itemstack.isEmpty()) continue; - if (j > 4) { - pTooltipComponents.add(Components.translatable("container.shulkerBox.more", j - i) - .withStyle(ChatFormatting.ITALIC)); - break; + if (visibleNames > 2) { + skippedNames++; + continue; } - ++j; - pTooltipComponents.add(itemstack.getDisplayName() + + visibleNames++; + pTooltipComponents.add(itemstack.getHoverName() .copy() .append(" x") .append(String.valueOf(itemstack.getCount())) .withStyle(ChatFormatting.GRAY)); } + + if (skippedNames > 0) + pTooltipComponents.add(Components.translatable("container.shulkerBox.more", skippedNames) + .withStyle(ChatFormatting.ITALIC)); } // Throwing stuff @@ -175,8 +184,10 @@ public class PackageItem extends Item { playerIn.getInventory() .placeItemBackInInventory(itemstack); } - if (!playerIn.isCreative()) - box.shrink(1); + box.shrink(1); + if (box.isEmpty()) + playerIn.getInventory() + .removeItem(box); return new InteractionResultHolder<>(InteractionResult.SUCCESS, box); } @@ -242,8 +253,8 @@ public class PackageItem extends Item { SoundSource.NEUTRAL, 0.5F, 0.5F); ItemStack copy = stack.copy(); - if (!playerentity.isCreative()) - stack.shrink(1); + stack.shrink(1); + if (stack.isEmpty()) playerentity.getInventory() .removeItem(stack); diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterItem.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterItem.java index f927aaf475..3a24e01e75 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterItem.java @@ -9,6 +9,7 @@ import javax.annotation.Nonnull; import com.simibubi.create.AllItems; import com.simibubi.create.AllKeys; import com.simibubi.create.content.contraptions.processing.EmptyingByBasin; +import com.simibubi.create.content.logistics.item.box.PackageItem; import com.simibubi.create.content.logistics.item.filter.AttributeFilterMenu.WhitelistMode; import com.simibubi.create.foundation.utility.Components; import com.simibubi.create.foundation.utility.Lang; @@ -43,7 +44,7 @@ public class FilterItem extends Item implements MenuProvider { private FilterType type; private enum FilterType { - REGULAR, ATTRIBUTE; + REGULAR, ATTRIBUTE, ADDRESS; } public static FilterItem regular(Properties properties) { @@ -53,6 +54,10 @@ public class FilterItem extends Item implements MenuProvider { public static FilterItem attribute(Properties properties) { return new FilterItem(FilterType.ATTRIBUTE, properties); } + + public static FilterItem address(Properties properties) { + return new FilterItem(FilterType.ADDRESS, properties); + } private FilterItem(FilterType type, Properties properties) { super(properties); @@ -158,6 +163,8 @@ public class FilterItem extends Item implements MenuProvider { return FilterMenu.create(id, inv, heldItem); if (type == FilterType.ATTRIBUTE) return AttributeFilterMenu.create(id, inv, heldItem); + if (type == FilterType.ADDRESS) + return PackageFilterMenu.create(id, inv, heldItem); return null; } @@ -251,6 +258,14 @@ public class FilterItem extends Item implements MenuProvider { return false; } } + + if (AllItems.PACKAGE_FILTER.get() == filter.getItem()) { + if (!(stack.getItem() instanceof PackageItem)) + return false; + String filterString = filter.getOrCreateTag() + .getString("Address"); + PackageItem.matchAddress(stack, filterString.isBlank() ? "*" : filterString); + } return false; } diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/PackageFilterMenu.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/PackageFilterMenu.java new file mode 100644 index 0000000000..96ededa2ff --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/PackageFilterMenu.java @@ -0,0 +1,66 @@ +package com.simibubi.create.content.logistics.item.filter; + +import com.simibubi.create.AllMenuTypes; + +import net.minecraft.client.gui.components.EditBox; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.items.ItemStackHandler; + +public class PackageFilterMenu extends AbstractFilterMenu { + + String address; + EditBox addressInput; + + public PackageFilterMenu(MenuType type, int id, Inventory inv, FriendlyByteBuf extraData) { + super(type, id, inv, extraData); + } + + public PackageFilterMenu(MenuType type, int id, Inventory inv, ItemStack stack) { + super(type, id, inv, stack); + } + + public static PackageFilterMenu create(int id, Inventory inv, ItemStack stack) { + return new PackageFilterMenu(AllMenuTypes.PACKAGE_FILTER.get(), id, inv, stack); + } + + @Override + protected int getPlayerInventoryXOffset() { + return 51; + } + + @Override + protected int getPlayerInventoryYOffset() { + return 105; + } + + @Override + protected void addFilterSlots() {} + + @Override + protected ItemStackHandler createGhostInventory() { + return new ItemStackHandler(); + } + + @Override + public void clearContents() { + address = ""; + } + + @Override + protected void initAndReadInventory(ItemStack filterItem) { + super.initAndReadInventory(filterItem); + address = filterItem.getOrCreateTag() + .getString("Address"); + } + + @Override + protected void saveData(ItemStack filterItem) { + super.saveData(filterItem); + filterItem.getOrCreateTag() + .putString("Address", address); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/PackageFilterScreen.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/PackageFilterScreen.java new file mode 100644 index 0000000000..92281f8d54 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/PackageFilterScreen.java @@ -0,0 +1,46 @@ +package com.simibubi.create.content.logistics.item.filter; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.foundation.gui.AllGuiTextures; +import com.simibubi.create.foundation.gui.widget.IconButton; +import com.simibubi.create.foundation.gui.widget.Indicator; + +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Inventory; + +public class PackageFilterScreen extends AbstractFilterScreen { + + private static final String PREFIX = "gui.package_filter."; + + public PackageFilterScreen(PackageFilterMenu menu, Inventory inv, Component title) { + super(menu, inv, title, AllGuiTextures.PACKAGE_FILTER); + } + + @Override + protected void init() { + setWindowOffset(-11, 7); + super.init(); + + int x = leftPos; + int y = topPos; + } + + @Override + public void renderForeground(PoseStack matrixStack, int mouseX, int mouseY, float partialTicks) { + super.renderForeground(matrixStack, mouseX, mouseY, partialTicks); + } + + @Override + protected void contentsCleared() {} + + @Override + protected boolean isButtonEnabled(IconButton button) { + return false; + } + + @Override + protected boolean isIndicatorOn(Indicator indicator) { + return false; + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java index bcb832da5e..f92e3018fa 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java @@ -54,6 +54,7 @@ public enum AllGuiTextures implements ScreenElement { FILTER("filters", 214, 97), ATTRIBUTE_FILTER("filters", 0, 97, 241, 83), + PACKAGE_FILTER("packager", 0, 104, 218, 79), TOOLBOX("toolbox", 188, 171), TOOLBELT_SLOT("minecraft", "widgets", 24, 23, 22, 22), diff --git a/src/main/resources/assets/create/models/block/packager/block.json b/src/main/resources/assets/create/models/block/packager/block.json new file mode 100644 index 0000000000..83972d49a9 --- /dev/null +++ b/src/main/resources/assets/create/models/block/packager/block.json @@ -0,0 +1,83 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "2": "create:block/packager", + "4": "create:block/packager_tray", + "particle": "create:block/packager" + }, + "elements": [ + { + "from": [15.95, 15.95, 15.95], + "to": [0.05, 0.05, 0.05], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, -8]}, + "faces": { + "east": {"uv": [0, 0, 8, 8], "rotation": 180, "texture": "#2"}, + "south": {"uv": [0, 0, 8, 8], "rotation": 180, "texture": "#2"}, + "west": {"uv": [0, 0, 8, 8], "rotation": 180, "texture": "#2"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#2"}, + "down": {"uv": [0, 8, 8, 16], "texture": "#2"} + } + }, + { + "from": [0, 0, 0], + "to": [16, 1, 16], + "faces": { + "up": {"uv": [8, 0, 16, 8], "texture": "#2"} + } + }, + { + "from": [0, 0, 0], + "to": [16, 2, 16], + "faces": { + "up": {"uv": [0, 8, 8, 16], "texture": "#2"} + } + }, + { + "from": [0, 0, 0], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [0, 0, 8, 8], "texture": "#2"}, + "east": {"uv": [0, 0, 8, 8], "texture": "#2"}, + "south": {"uv": [8, 8, 16, 16], "texture": "#2"}, + "west": {"uv": [0, 0, 8, 8], "texture": "#2"}, + "up": {"uv": [0, 8, 8, 16], "texture": "#2"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#2"} + } + }, + { + "from": [10, 1, 0], + "to": [12, 3, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [11, 2, 8]}, + "faces": { + "east": {"uv": [0, 0, 2, 16], "rotation": 270, "texture": "#4"}, + "west": {"uv": [0, 0, 2, 16], "rotation": 90, "texture": "#4"}, + "up": {"uv": [0, 0, 2, 16], "texture": "#4"}, + "down": {"uv": [0, 0, 2, 16], "rotation": 180, "texture": "#4"} + } + }, + { + "from": [4, 1, 0], + "to": [6, 3, 16], + "faces": { + "east": {"uv": [0, 0, 2, 16], "rotation": 90, "texture": "#4"}, + "west": {"uv": [0, 0, 2, 16], "rotation": 270, "texture": "#4"}, + "up": {"uv": [0, 0, 2, 16], "rotation": 180, "texture": "#4"}, + "down": {"uv": [0, 0, 2, 16], "texture": "#4"} + } + } + ], + "groups": [ + { + "name": "Frame", + "origin": [0, 0, 0], + "color": 0, + "children": [0, 1, 2, 3] + }, + { + "name": "Guides Horizontal", + "origin": [0, 0, 0], + "color": 0, + "children": [4, 5] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/packager/hatch_closed.json b/src/main/resources/assets/create/models/block/packager/hatch_closed.json new file mode 100644 index 0000000000..08ce678388 --- /dev/null +++ b/src/main/resources/assets/create/models/block/packager/hatch_closed.json @@ -0,0 +1,36 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "1": "create:block/packager_hatch_closed", + "particle": "create:block/packager" + }, + "elements": [ + { + "from": [0, 0, 6], + "to": [16, 16, 8], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 0, 16, 16], "texture": "#1"} + } + }, + { + "from": [1.1, 1.1, 8], + "to": [14.9, 14.9, 9.95], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 8]}, + "faces": { + "east": {"uv": [14, 1, 16, 15], "texture": "#1"}, + "south": {"uv": [1, 1, 15, 15], "texture": "#1"}, + "west": {"uv": [0, 1, 2, 15], "texture": "#1"}, + "up": {"uv": [1, 0, 15, 2], "texture": "#1"}, + "down": {"uv": [1, 14, 15, 16], "texture": "#1"} + } + } + ], + "groups": [ + { + "name": "Frame", + "origin": [0, 0, 0], + "children": [0, 1] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/packager/hatch_open.json b/src/main/resources/assets/create/models/block/packager/hatch_open.json new file mode 100644 index 0000000000..ff86b61d8a --- /dev/null +++ b/src/main/resources/assets/create/models/block/packager/hatch_open.json @@ -0,0 +1,37 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "1": "create:block/packager_hatch_closed", + "3": "create:block/packager_hatch_open", + "particle": "create:block/packager" + }, + "elements": [ + { + "from": [0, 0, 6], + "to": [16, 16, 8], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 0, 16, 16], "texture": "#3"} + } + }, + { + "from": [1.1, 1.1, 8], + "to": [14.9, 14.9, 9.95], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 8]}, + "faces": { + "east": {"uv": [14, 1, 16, 15], "texture": "#1"}, + "south": {"uv": [1, 1, 15, 15], "texture": "#3"}, + "west": {"uv": [0, 1, 2, 15], "texture": "#1"}, + "up": {"uv": [1, 0, 15, 2], "texture": "#1"}, + "down": {"uv": [1, 14, 15, 16], "texture": "#1"} + } + } + ], + "groups": [ + { + "name": "Frame", + "origin": [0, 0, 0], + "children": [0, 1] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/packager/item.json b/src/main/resources/assets/create/models/block/packager/item.json new file mode 100644 index 0000000000..243e588256 --- /dev/null +++ b/src/main/resources/assets/create/models/block/packager/item.json @@ -0,0 +1,119 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "1": "create:block/packager_hatch_closed", + "2": "create:block/packager", + "4": "create:block/packager_tray", + "particle": "create:block/packager_hatch_closed" + }, + "elements": [ + { + "from": [0, 0, 14], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [0, 0, 16, 16], "texture": "#1"} + } + }, + { + "from": [16, 16, 16], + "to": [0, 0, 0], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, -8]}, + "faces": { + "north": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#1"}, + "east": {"uv": [0, 0, 8, 8], "rotation": 180, "texture": "#2"}, + "south": {"uv": [0, 0, 8, 8], "rotation": 180, "texture": "#2"}, + "west": {"uv": [0, 0, 8, 8], "rotation": 180, "texture": "#2"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#2"}, + "down": {"uv": [0, 8, 8, 16], "texture": "#2"} + } + }, + { + "from": [0, 0, 0], + "to": [16, 1, 16], + "faces": { + "up": {"uv": [8, 0, 16, 8], "texture": "#2"} + } + }, + { + "from": [0, 0, 0], + "to": [16, 2, 16], + "faces": { + "up": {"uv": [0, 8, 8, 16], "texture": "#2"} + } + }, + { + "from": [0, 0, 0], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [0, 0, 8, 8], "texture": "#2"}, + "east": {"uv": [0, 0, 8, 8], "texture": "#2"}, + "south": {"uv": [8, 8, 16, 16], "texture": "#2"}, + "west": {"uv": [0, 0, 8, 8], "texture": "#2"}, + "up": {"uv": [0, 8, 8, 16], "texture": "#2"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#2"} + } + }, + { + "from": [1.1, 1.1, 16], + "to": [14.9, 14.9, 18], + "faces": { + "east": {"uv": [14, 1, 16, 15], "texture": "#1"}, + "south": {"uv": [1, 1, 15, 15], "texture": "#1"}, + "west": {"uv": [0, 1, 2, 15], "texture": "#1"}, + "up": {"uv": [1, 0, 15, 2], "texture": "#1"}, + "down": {"uv": [1, 14, 15, 16], "texture": "#1"} + } + }, + { + "from": [2, 2, 1], + "to": [14, 4, 14], + "faces": { + "north": {"uv": [2, 14, 14, 16], "texture": "#4"}, + "east": {"uv": [13, 2, 15, 15], "rotation": 90, "texture": "#4"}, + "south": {"uv": [2, 14, 14, 16], "texture": "#4"}, + "west": {"uv": [13, 2, 15, 15], "rotation": 90, "texture": "#4"}, + "up": {"uv": [2, 2, 14, 15], "texture": "#4"}, + "down": {"uv": [2, 2, 14, 15], "texture": "#4"} + } + }, + { + "from": [10, 1, 0], + "to": [12, 3, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [11, 2, 8]}, + "faces": { + "east": {"uv": [0, 0, 2, 16], "rotation": 270, "texture": "#4"}, + "west": {"uv": [0, 0, 2, 16], "rotation": 90, "texture": "#4"}, + "up": {"uv": [0, 0, 2, 16], "texture": "#4"}, + "down": {"uv": [0, 0, 2, 16], "rotation": 180, "texture": "#4"} + } + }, + { + "from": [4, 1, 0], + "to": [6, 3, 16], + "faces": { + "east": {"uv": [0, 0, 2, 16], "rotation": 90, "texture": "#4"}, + "west": {"uv": [0, 0, 2, 16], "rotation": 270, "texture": "#4"}, + "up": {"uv": [0, 0, 2, 16], "rotation": 180, "texture": "#4"}, + "down": {"uv": [0, 0, 2, 16], "texture": "#4"} + } + } + ], + "groups": [ + { + "name": "Frame", + "origin": [0, 0, 0], + "children": [0, 1, 2, 3, 4, 5] + }, + { + "name": "Tray", + "origin": [0, 0, 0], + "children": [6] + }, + { + "name": "Guides Horizontal", + "origin": [0, 0, 0], + "children": [7, 8] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/packager/tray.json b/src/main/resources/assets/create/models/block/packager/tray.json new file mode 100644 index 0000000000..4177485039 --- /dev/null +++ b/src/main/resources/assets/create/models/block/packager/tray.json @@ -0,0 +1,28 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "4": "create:block/packager_tray", + "particle": "create:block/packager" + }, + "elements": [ + { + "from": [2, 2, 1.5], + "to": [14, 4, 14.5], + "faces": { + "north": {"uv": [2, 14, 14, 16], "texture": "#4"}, + "east": {"uv": [13, 2, 15, 15], "rotation": 90, "texture": "#4"}, + "south": {"uv": [2, 14, 14, 16], "texture": "#4"}, + "west": {"uv": [13, 2, 15, 15], "rotation": 90, "texture": "#4"}, + "up": {"uv": [2, 2, 14, 15], "texture": "#4"}, + "down": {"uv": [2, 2, 14, 15], "texture": "#4"} + } + } + ], + "groups": [ + { + "name": "Tray", + "origin": [0, 0, 0], + "children": [0] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/package_filter.json b/src/main/resources/assets/create/models/item/package_filter.json new file mode 100644 index 0000000000..2d09bdcab7 --- /dev/null +++ b/src/main/resources/assets/create/models/item/package_filter.json @@ -0,0 +1,7 @@ +{ + "parent": "create:item/filter", + "textures": { + "0": "create:item/package_filter", + "particle": "create:item/package_filter" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/block/packager.png b/src/main/resources/assets/create/textures/block/packager.png new file mode 100644 index 0000000000000000000000000000000000000000..ac93e265c5186f93f30d2231e5d5d694b207d6f5 GIT binary patch literal 1423 zcmV;A1#tR_P)EX>4Tx04R}tkv&MmKpe$iQ%glEf)){R2vVIah>AE$6^me@v=v%)FuC+YXws0R zxHt-~1qVMCs}3&Cx;nTDg5U>;o12rOi`{MF9Qi#V`bknR+6jGx_(bAarW+RVI`Q*kx9)Fhl#~v8_R9XN`^{2MI2F7jq-)8 z%L?Z$&T6^Jn)l={4CS@uG}mbkA&x~Pkc0>sRcxRP3sG7%QcR?1Kjz^dbo@zj$>iDq zBgZ@{P$4;f@IUz7ty!3yaFaqYAn;<_A0t3;7iiRM`}^3o8z+GO8Mx9~{z@H~`6Rv8 z(jrGd&o*#z-O}Ve;Bp5Tc+w?9awI=Zp-=$c&*+y{D4^000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2jvA86A=QGc=)#f000?uMObu0Z*6U5Zgc=ca%Ew3 zWn>_CX>@2HM@dakSAh-}000AKNkl<|^q4eBS51}8RU!agvX$~RZppX=LSeh-Al!h$57%z3S?n;*Q zB)=Y<_iXLDjcujPfZ&ZZqnS7Je}9dvJGXb#_NK=w^5j`U7>@9f0Mr{|u3b9H=RSWv zvJl&w9-VV%SnmdGwA%{>J{Sx*>V-Ucmf$0~_-4Sh>z4pH>V?K`y&IJDB$j4993|}U z^%2@|quu82gNK9z`(J|x?J*y|x61(lhX6D^mybWY4}kC101%EvE)~MDPQ4?SiZ4F7 zI(d{`+KZH=E^bXxwx!L)5U$_)mz$b5_=Y!hrYuudwMYKnnn z0>2cTH4C>k>3x(IH0!leE3_V``RNMuhw;LJ`ooycxii!of_OAN+lMkW<;|rcPVQA!|6GWPhLrsvXXczC{ZsxnbplzNX+$U-6W7dTJ~ zcjkGC2TtA6l|7KGWjAj=96c)r7WHvr(mOhx7;sBOcfM&L=F z|5fn8yO)*%Y&e);!@6^OM}^^Nu2Ggu$;tKXm)fkv9{@Yo&aN~IXsI$!h@d^@*3Gw< zcD{8JzWMe?wl_U~c=YE=33R&6DF*I7c(|1Fjor(yhQjq32l({spB9=2zW?eS1M~g8 zK2TdJcoq(^tL~t)wYEBS2d(M}RGlYQPGFWJs>o}tK;;Coa9AmLI?A!D&I48bZD8Ra zl2EX>4Tx04R}tkv&MmKpe$iQ%glEf)){R2vVIah>AE$6^me@v=v%)FuC+YXws0R zxHt-~1qVMCs}3&Cx;nTDg5U>;o12rOi`{MF9Qi#V`bknR+6jGx_(bAarW+RVI`Q*kx9)Fhl#~v8_R9XN`^{2MI2F7jq-)8 z%L?Z$&T6^Jn)l={4CS@uG}mbkA&x~Pkc0>sRcxRP3sG7%QcR?1Kjz^dbo@zj$>iDq zBgZ@{P$4;f@IUz7ty!3yaFaqYAn;<_A0t3;7iiRM`}^3o8z+GO8Mx9~{z@H~`6Rv8 z(jrGd&o*#z-O}Ve;Bp5Tc+w?9awI=Zp-=$c&*+y{D4^000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2jvA85-J!}YJ|c7000?uMObu0Z*6U5Zgc=ca%Ew3 zWn>_CX>@2HM@dakSAh-}0005GNklD1{QKqE3hQd)K3IwqtA5Bb79D7lOjqk%0<~BLSASKg` zH1E!<(X%s^7fvMeLdb8ED-?GXSFQhD`kYic6F+m8viZr&hCQO0V+?@Rj*lZAZO+UDK&RcHs#K|2ISv3z^?Io}NmGOnblQzG1GlB^$mhe= zi|l>+jMf*K6r99W=u0Vyho)>GrL&gA8Uo<)eN{T9;;#Y5zY=N-3cnW;M3L1h&mV3~{{?F@K0BalZT`;v0n7E$Dl6(o QX#fBK07*qoM6N<$g2)cJIsgCw literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/packager_hatch_open.png b/src/main/resources/assets/create/textures/block/packager_hatch_open.png new file mode 100644 index 0000000000000000000000000000000000000000..a3f4f37afa46a7469ca7e041e8995b9f171ff385 GIT binary patch literal 865 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 Hu0mjf>*gHD delta 1193 zcmV;a1Xla<3i%3?PLLNp{%IwHEBez%!X z;kJ#DmqG|oYq3uN001(P;WU5$01Z%>?*IS*32;bRa{vGi!vFvd!vV){sAK>D1TINL zK~z{rwN{H#+b|GxpeNZ0Atr94*0}TqX$yps|Npt}oz9Z%$WCXN?u3koSgYH;hg2Nj zi2q7Z^jP5U;_}@Ep7f`PSpqVatfjJA60NS**F+orDPo?WCZMLOAbWpf*4xHb`cuRl z!Lp{>T6{?a?>}4{$`N>(0@k|oVp(lb8i2^U!qUy|<0mq$E{gyGkugnUj5WNI7i(E< zaeK=@+}=V$xwY#XYdT#PQ5>;Iy(%}*+K5=gYA-wh4cQf~ud$8^41NDmmX^*Cz-!5Zcbmj+ ziC`HB?jQEm&tJbE9`1EnM8RG+Fq_nE61x!%OF)7UlW`k(`?!C7%$G94>%?sDwh_CD z{e}ljjg%JDJOcSrR;L;4w()k4>L7^GWf4*bp%OV7aSPFm>cERRSBXP{`yNl1L5wbo z;6kz*AG_V#&3-?(?ZF*hUS9qzx=wt`rxBggFhBsez1`AG_pLjCqitXHW zfSXC|mSBb8aA<$sUSG~ZO!N*R_o*BZIOmvy2{ccP;neV1@D5pYW0V6A4j}08#{@~P z22*2HiBS%^@ww|-*TMx5OiqoHO6=tz$N;x~_wd$O12t z2nZ2?KTM56v)yXGTc2>r_|yJ%zu&*&iz6`9fB`(iseyk8#Aq?Rd@o)HDhoh`ZIzPfoe&ohDt~(4r;yK>~=U2hjS~L z8Y01gfK>>=vQIeYJDiAVwG5^POOS%qijxRDfke=sh-tM9njQpPZ{7z_0I#`fq%OmW z=xq@!Mg)ISZxTiDKqE*`#IzCzQ-cXmZ>S$%af1kw6EW?D!PF>xz41pX4zJdnaeT4c z;Y3U$7)*`R3x>})-wNP%I1!iFUnj+8Ff}p+;Z^{%!ht4@j?fWyB{NK)GX&U|`w{z& z3D8bnLVV_K90SX=AJY>NU8Miy-zwdLr_Fc~?Y_ z|A%Mp#xas!NKV9YFNC?3jiB!Zgo@2r=}9kyxs@RZ`|=zVuRx$vlkuc4dSnQ~zG(#M zNS%G}@0G|-orVtHnErWF}cApOBcE;)y`Dj;ER9KkXRD|d*uCchhKKjUXZ=hP! zBK2?}#aj~O7yKUyFxb9OY6D7e7I;J!GcfQS24TkI`72U@g6^I!jv*SsTYC(J8WaSW zm8Ezm{NEpbu8EP$Nz=+-!Fe=% Date: Sun, 12 Nov 2023 12:39:15 +0100 Subject: [PATCH 018/515] Bump version --- gradle.properties | 2 +- src/main/java/com/simibubi/create/Create.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index e20117fbc1..55b7fea459 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ org.gradle.jvmargs = -Xmx3G org.gradle.daemon = false # mod version info -mod_version = 0.5.1.f +mod_version = 0.6.0 artifact_minecraft_version = 1.20.1 minecraft_version = 1.20.1 diff --git a/src/main/java/com/simibubi/create/Create.java b/src/main/java/com/simibubi/create/Create.java index 9f9cc46e74..82cb6b340d 100644 --- a/src/main/java/com/simibubi/create/Create.java +++ b/src/main/java/com/simibubi/create/Create.java @@ -58,7 +58,7 @@ public class Create { public static final String ID = "create"; public static final String NAME = "Create"; - public static final String VERSION = "0.5.1f"; + public static final String VERSION = "0.6-experimental"; public static final Logger LOGGER = LogUtils.getLogger(); From 28e35a33e66f09bc5c8ece31a308a7cbcf186d3b Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Sun, 12 Nov 2023 14:13:56 +0100 Subject: [PATCH 019/515] Port features --- .../12afe0d97856fb2040b8407470e6d13529994eaa | 2 +- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 11 ++-- .../455c485c9c8ef171bbc1ce4d435b3110ba1557ba | 2 +- .../6ec3b5a261c9ae3df674f7595dc66530ce54feb9 | 2 +- .../82992cbf8f2794d83ac94034835eac0acd7915b9 | 2 +- .../ad9bf59631726a3f24738ebf1a6cd44c7f88ba0f | 2 +- .../b256105d8411632b0d585496ea8944a751a08034 | 2 +- .../c24b4d2b8d15abff51c78bd94f4403d9eae6c139 | 2 +- .../e0a39a97205b7149114f15de91b614248d05fd95 | 2 +- .../eaed56ca9d9781c7626be345dd9f2c9a1fad638e | 2 +- .../assets/create/blockstates/packager.json | 30 +++++------ .../resources/assets/create/lang/en_ud.json | 7 +++ .../resources/assets/create/lang/en_us.json | 7 +++ .../create/models/item/package_filter.json | 6 +++ .../create/loot_tables/blocks/packager.json | 15 +++--- .../java/com/simibubi/create/AllItems.java | 14 ++--- .../block/packager/PackagerBlock.java | 6 +-- .../block/packager/PackagerBlockEntity.java | 8 +-- .../block/packager/PackagerRenderer.java | 6 +-- .../logistics/filter/FilterItemStack.java | 38 +++++++++++--- .../logistics/filter/PackageFilterMenu.java | 2 +- .../logistics/filter/PackageFilterScreen.java | 8 +-- .../item/box/PackageDestroyPacket.java | 6 ++- .../logistics/item/box/PackageEntity.java | 49 ++++++++---------- .../logistics/item/box/PackageItem.java | 5 -- .../logistics/item/box/PackageRenderer.java | 4 +- .../models/item/cardboard_package_10x12.json | 4 +- .../models/item/cardboard_package_10x8.json | 4 +- .../models/item/cardboard_package_12x10.json | 4 +- .../models/item/cardboard_package_12x12.json | 4 +- .../create/models/item/package_filter.json | 7 --- .../{entity => block}/package/cardboard.png | Bin .../package/cardboard_particle.png | Bin .../create/textures/item/package_filter.png | Bin 254 -> 301 bytes 34 files changed, 148 insertions(+), 115 deletions(-) create mode 100644 src/generated/resources/assets/create/models/item/package_filter.json delete mode 100644 src/main/resources/assets/create/models/item/package_filter.json rename src/main/resources/assets/create/textures/{entity => block}/package/cardboard.png (100%) rename src/main/resources/assets/create/textures/{entity => block}/package/cardboard_particle.png (100%) diff --git a/src/generated/resources/.cache/12afe0d97856fb2040b8407470e6d13529994eaa b/src/generated/resources/.cache/12afe0d97856fb2040b8407470e6d13529994eaa index 68c4ca9734..384bd24620 100644 --- a/src/generated/resources/.cache/12afe0d97856fb2040b8407470e6d13529994eaa +++ b/src/generated/resources/.cache/12afe0d97856fb2040b8407470e6d13529994eaa @@ -1,4 +1,4 @@ -// 1.20.1 2023-09-20T19:40:25.4471912 Create's Sequenced Assembly Recipes +// 1.20.1 2023-11-12T13:36:18.9926524 Create's Sequenced Assembly Recipes dbaca5a5aa312f3bc7b826e51e665d32e798a5d7 data/create/recipes/sequenced_assembly/precision_mechanism.json 0cdbd4f583aa0a2aa8f3ca2827199bede1732722 data/create/recipes/sequenced_assembly/sturdy_sheet.json 1274315b5c570722d6f5b2ed7f5e53fe01b6288a data/create/recipes/sequenced_assembly/track.json diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 2afe4ee912..45518658df 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2023-09-20T19:40:25.374215 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2023-11-12T14:08:50.9829798 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -346,6 +346,7 @@ ac536ae742c12e97bfd0b2483c87ff29f3935eaf assets/create/blockstates/oxidized_copp 110a6c19bcc9f044e5e982ac6e4b295b03ec0145 assets/create/blockstates/oxidized_copper_tiles.json 3f3924f0f0e368edfa04f4fdd6d6c2319276ddfe assets/create/blockstates/oxidized_copper_tile_slab.json 5e634cfb9abb06d8b29f39d751fc56b28ea5a9cd assets/create/blockstates/oxidized_copper_tile_stairs.json +9e6d155ff36bc48ade92a5bf83e0a3b77bcd1651 assets/create/blockstates/packager.json 36742cc6ce052ead143366d31b11e828a525c1b8 assets/create/blockstates/peculiar_bell.json 53d102e706d53cb2c0dbc0bc11da828084a43519 assets/create/blockstates/pink_nixie_tube.json 213da5c04a33ae8ae7c0a4dec9844bbb6d670e33 assets/create/blockstates/pink_sail.json @@ -585,8 +586,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -79a43e6c997dbfa078c6aa8e4ab0c4386aaf4dd9 assets/create/lang/en_ud.json -d8d0f395ae53d72ea0d5047b9167569fe87c870d assets/create/lang/en_us.json +6792ed0dbd8b9edaf755a914a7c00cdd75f2d424 assets/create/lang/en_ud.json +93ae8f40bc247303f6264f6ca60f701545e58a5b assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -2037,6 +2038,8 @@ c9c7ccdb68de2e77cd9f7053fab19493dd30a985 assets/create/models/item/oxidized_copp 1c3428e2aed32a013631db012642a34d4eaf0785 assets/create/models/item/oxidized_copper_tiles.json f1af7c5f3840efc3ae07940ee6719eb3417a0e1a assets/create/models/item/oxidized_copper_tile_slab.json ef2fe68d407a03bf1ed8f2d2f3e7323777d061bb assets/create/models/item/oxidized_copper_tile_stairs.json +b21a1f3ee7de3e17f69d27fd13ae6b23b62aa22c assets/create/models/item/packager.json +5b974e55caffdbfc2156eb8b59dd99db12243bd3 assets/create/models/item/package_filter.json 76aeceb41bb7df873dbafe1bd5e26deb24abf93f assets/create/models/item/peculiar_bell.json df13d4281dc45041ecd93504d45daef61d070581 assets/create/models/item/pink_seat.json 842afb2a345dbaba857e90f7dffa724841ef7b2d assets/create/models/item/pink_toolbox.json @@ -3288,6 +3291,7 @@ f47a01824093455030fca66e7b8a39bcfc61d219 data/create/loot_tables/blocks/oxidized 4d2a2863697664b3b71f02aa703c3504cd5cc826 data/create/loot_tables/blocks/oxidized_copper_tiles.json 4d815b361af81bd0c0e14c853ca54ad3cde66a57 data/create/loot_tables/blocks/oxidized_copper_tile_slab.json d599ef03d1b69e4367ec0dea78f52c1964c99f9b data/create/loot_tables/blocks/oxidized_copper_tile_stairs.json +ab8cee7abd7dd92428bf7d8f0f5edd35082401a4 data/create/loot_tables/blocks/packager.json 58bd9fe9d6706998bfbda3b077cfd0a740972091 data/create/loot_tables/blocks/peculiar_bell.json 4d7724df6fefee4512c4f7886d0e103d1dc39510 data/create/loot_tables/blocks/pink_nixie_tube.json 85811771fbc36f645fdb9f510639715399503c99 data/create/loot_tables/blocks/pink_sail.json @@ -4189,6 +4193,7 @@ a5874f73c7dc0a3ae12999e6ae8abf45bc7fb9be data/create/tags/blocks/passive_boiler_ da739ad2160e7df4e0e5cc89587670ce5e9450c3 data/create/tags/blocks/valve_handles.json 72143286fb5cb372a0696550e2eac76ca50e6fbc data/create/tags/blocks/windmill_sails.json 58987ea71d488cc48192ceb00c00aa2903e51304 data/create/tags/blocks/wrench_pickup.json +76c0522664726c09461ad4565b6fba80b4f816b2 data/create/tags/entity_types/blaze_burner_capturable.json 35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/create/tags/entity_types/ignore_seat.json 894e1e4fd1e32712abdda18ec64ab13750d3c039 data/create/tags/fluids/bottomless/allow.json 35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/create/tags/fluids/bottomless/deny.json diff --git a/src/generated/resources/.cache/455c485c9c8ef171bbc1ce4d435b3110ba1557ba b/src/generated/resources/.cache/455c485c9c8ef171bbc1ce4d435b3110ba1557ba index 8e85fcbb89..1a6e5fbccb 100644 --- a/src/generated/resources/.cache/455c485c9c8ef171bbc1ce4d435b3110ba1557ba +++ b/src/generated/resources/.cache/455c485c9c8ef171bbc1ce4d435b3110ba1557ba @@ -1,4 +1,4 @@ -// 1.20.1 2023-09-20T19:40:25.3622264 Create's Advancements +// 1.20.1 2023-11-12T13:36:18.9088754 Create's Advancements 2661a689fdcf729494f46e3c719f71c62e31582e data/create/advancements/andesite_alloy.json fa16c4afe0496edc3f157858a6e0ff177a1622ff data/create/advancements/andesite_casing.json 5a694002d0a663bc869b09d15924a10c43dc522f data/create/advancements/anvil_plough.json diff --git a/src/generated/resources/.cache/6ec3b5a261c9ae3df674f7595dc66530ce54feb9 b/src/generated/resources/.cache/6ec3b5a261c9ae3df674f7595dc66530ce54feb9 index 5f77451274..a29054df2b 100644 --- a/src/generated/resources/.cache/6ec3b5a261c9ae3df674f7595dc66530ce54feb9 +++ b/src/generated/resources/.cache/6ec3b5a261c9ae3df674f7595dc66530ce54feb9 @@ -1,4 +1,4 @@ -// 1.20.1 2023-09-20T19:40:25.4511802 Create's Mechanical Crafting Recipes +// 1.20.1 2023-11-12T13:36:18.9986366 Create's Mechanical Crafting Recipes f076d64d9f30709bed34775136c9241097b28aa9 data/create/recipes/mechanical_crafting/crushing_wheel.json 694dca9dcff246bb7f560b3304fcc244c53217d5 data/create/recipes/mechanical_crafting/extendo_grip.json 3b2837b08607c1ca466fa3eb418209b2e55da6ba data/create/recipes/mechanical_crafting/potato_cannon.json diff --git a/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 b/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 index 115b975275..86f0f9bd56 100644 --- a/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 +++ b/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 @@ -1,4 +1,4 @@ -// 1.20.1 2023-09-20T19:40:25.4471912 Create's Standard Recipes +// 1.20.1 2023-11-12T13:36:18.9936504 Create's Standard Recipes a8cc4af26f6c7c45a9eef12e92af1452fe042454 data/create/advancements/recipes/combat/crafting/appliances/netherite_backtank.json 2c2639c7b307ee7c7a4e97e5efebf496788998ad data/create/advancements/recipes/combat/crafting/appliances/netherite_backtank_from_netherite.json 81dcf0cb1aa99e39bc7d1a386e07cad4cee7d8b9 data/create/advancements/recipes/combat/crafting/appliances/netherite_diving_boots.json diff --git a/src/generated/resources/.cache/ad9bf59631726a3f24738ebf1a6cd44c7f88ba0f b/src/generated/resources/.cache/ad9bf59631726a3f24738ebf1a6cd44c7f88ba0f index f273a75fb4..cbf20eb778 100644 --- a/src/generated/resources/.cache/ad9bf59631726a3f24738ebf1a6cd44c7f88ba0f +++ b/src/generated/resources/.cache/ad9bf59631726a3f24738ebf1a6cd44c7f88ba0f @@ -1,4 +1,4 @@ -// 1.20.1 2023-09-20T19:47:44.9018689 Create's Damage Type Tags +// 1.20.1 2023-11-12T13:36:18.9916549 Create's Damage Type Tags 7884716b2f4bb1330ff215366bb4bab06e4728c2 data/minecraft/tags/damage_type/bypasses_armor.json 1fcad1f89265fba8bdb05b03a1dfcc88d7b7a550 data/minecraft/tags/damage_type/is_explosion.json 08324c61115b72bb8a6370d7f34d84d9a31afd16 data/minecraft/tags/damage_type/is_fire.json diff --git a/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 b/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 index d38f48fa9a..256023d181 100644 --- a/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 +++ b/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 @@ -1,4 +1,4 @@ -// 1.20.1 2023-09-20T19:40:25.3652491 Create's Processing Recipes +// 1.20.1 2023-11-12T13:36:18.9138626 Create's Processing Recipes 3c94326fb730f68c1e44fe1e2ef09c9db6ffd92b data/create/recipes/compacting/andesite_from_flint.json 8d3d5b31f3601b9f681ff710e0545a483a1494c6 data/create/recipes/compacting/blaze_cake.json 8bd7f4e3a686ab520b2d55594d2018d0e9a50c91 data/create/recipes/compacting/chocolate.json diff --git a/src/generated/resources/.cache/c24b4d2b8d15abff51c78bd94f4403d9eae6c139 b/src/generated/resources/.cache/c24b4d2b8d15abff51c78bd94f4403d9eae6c139 index 202508a62f..ea9688ac06 100644 --- a/src/generated/resources/.cache/c24b4d2b8d15abff51c78bd94f4403d9eae6c139 +++ b/src/generated/resources/.cache/c24b4d2b8d15abff51c78bd94f4403d9eae6c139 @@ -1,2 +1,2 @@ -// 1.20.1 2023-09-20T19:40:25.3732177 Create's Custom Sounds +// 1.20.1 2023-11-12T13:36:18.9248334 Create's Custom Sounds 043955db25ffe58e7debb9a4f11e41a9571376e6 assets/create/sounds.json diff --git a/src/generated/resources/.cache/e0a39a97205b7149114f15de91b614248d05fd95 b/src/generated/resources/.cache/e0a39a97205b7149114f15de91b614248d05fd95 index 776c791168..1f85bee920 100644 --- a/src/generated/resources/.cache/e0a39a97205b7149114f15de91b614248d05fd95 +++ b/src/generated/resources/.cache/e0a39a97205b7149114f15de91b614248d05fd95 @@ -1,2 +1,2 @@ -// 1.20.1 2023-09-20T19:40:25.4461939 Create's Recipe Serializer Tags +// 1.20.1 2023-11-12T13:36:18.9906575 Create's Recipe Serializer Tags 0d8718f7383761bc5d7bc45306ed266ebf25dc1d data/create/tags/recipe_serializer/automation_ignore.json diff --git a/src/generated/resources/.cache/eaed56ca9d9781c7626be345dd9f2c9a1fad638e b/src/generated/resources/.cache/eaed56ca9d9781c7626be345dd9f2c9a1fad638e index 4eb5d0fa08..c6170772e3 100644 --- a/src/generated/resources/.cache/eaed56ca9d9781c7626be345dd9f2c9a1fad638e +++ b/src/generated/resources/.cache/eaed56ca9d9781c7626be345dd9f2c9a1fad638e @@ -1,4 +1,4 @@ -// 1.20.1 2023-09-20T19:47:44.9028659 Create's Generated Registry Entries +// 1.20.1 2023-11-12T13:36:18.9926524 Create's Generated Registry Entries 030ede1044384c4117ac1e491bf5c78bbd2842f5 data/create/damage_type/crush.json 92b0416950ffeb3ba68811e587177c2f8811c2c5 data/create/damage_type/cuckoo_surprise.json d2a4fdb64f4ba817e13a7b20c73fd1ca34b825fc data/create/damage_type/fan_fire.json diff --git a/src/generated/resources/assets/create/blockstates/packager.json b/src/generated/resources/assets/create/blockstates/packager.json index 956a9d4734..bdb9b2338c 100644 --- a/src/generated/resources/assets/create/blockstates/packager.json +++ b/src/generated/resources/assets/create/blockstates/packager.json @@ -1,34 +1,34 @@ { "variants": { + "facing=east,powered=false": { + "model": "create:block/packager/block", + "y": 90 + }, + "facing=east,powered=true": { + "model": "create:block/packager/block", + "y": 90 + }, "facing=north,powered=false": { "model": "create:block/packager/block" }, + "facing=north,powered=true": { + "model": "create:block/packager/block" + }, "facing=south,powered=false": { "model": "create:block/packager/block", "y": 180 }, + "facing=south,powered=true": { + "model": "create:block/packager/block", + "y": 180 + }, "facing=west,powered=false": { "model": "create:block/packager/block", "y": 270 }, - "facing=east,powered=false": { - "model": "create:block/packager/block", - "y": 90 - }, - "facing=north,powered=true": { - "model": "create:block/packager/block" - }, - "facing=south,powered=true": { - "model": "create:block/packager/block", - "y": 180 - }, "facing=west,powered=true": { "model": "create:block/packager/block", "y": 270 - }, - "facing=east,powered=true": { - "model": "create:block/packager/block", - "y": 90 } } } \ No newline at end of file diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index bc06587c06..e5dfe3d955 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -560,6 +560,7 @@ "block.create.oxidized_copper_tile_slab": "qɐןS ǝןı⟘ ɹǝddoƆ pǝzıpıxO", "block.create.oxidized_copper_tile_stairs": "sɹıɐʇS ǝןı⟘ ɹǝddoƆ pǝzıpıxO", "block.create.oxidized_copper_tiles": "sǝןı⟘ ɹǝddoƆ pǝzıpıxO", + "block.create.packager": "ɹǝbɐʞɔɐԀ", "block.create.peculiar_bell": "ןןǝᗺ ɹɐıןnɔǝԀ", "block.create.peculiar_bell.tooltip.summary": "˙˙˙sʇɔǝɟɟǝ-ǝpıs ǝʌɐɥ ʎɐɯ ‾ǝɹıℲ ןnoS‾ uǝdo ǝʌoqɐ ʇɥbıɹ ʇı buıɔɐןԀ ˙‾ןןǝᗺ ssɐɹᗺ‾ ǝʌıʇɐɹoɔǝp Ɐ", "block.create.pink_nixie_tube": "ǝqn⟘ ǝıxıN ʞuıԀ", @@ -2684,6 +2685,7 @@ "entity.create.contraption": "uoıʇdɐɹʇuoƆ", "entity.create.crafting_blueprint": "ʇuıɹdǝnןᗺ buıʇɟɐɹƆ", "entity.create.gantry_contraption": "uoıʇdɐɹʇuoƆ ʎɹʇuɐ⅁", + "entity.create.package": "ǝbɐʞɔɐԀ", "entity.create.potato_projectile": "ǝןıʇɔǝظoɹԀ oʇɐʇoԀ", "entity.create.seat": "ʇɐǝS", "entity.create.stationary_contraption": "uoıʇdɐɹʇuoƆ ʎɹɐuoıʇɐʇS", @@ -2708,6 +2710,10 @@ "item.create.brass_sheet": "ʇǝǝɥS ssɐɹᗺ", "item.create.builders_tea": "ɐǝ⟘ s,ɹǝpןınᗺ", "item.create.builders_tea.tooltip.summary": "‾˙buıʇɐɹnʇɐS‾ puɐ ‾buıʇɐʌıʇoW‾ -pǝʇɹɐʇs ʎɐp ǝɥʇ ʇǝb oʇ ʞuıɹp ʇɔǝɟɹǝd ǝɥ⟘", + "item.create.cardboard_package_10x12": "ǝbɐʞɔɐԀ pɹɐoqpɹɐƆ", + "item.create.cardboard_package_10x8": "ǝbɐʞɔɐԀ pɹɐoqpɹɐƆ", + "item.create.cardboard_package_12x10": "ǝbɐʞɔɐԀ pɹɐoqpɹɐƆ", + "item.create.cardboard_package_12x12": "ǝbɐʞɔɐԀ pɹɐoqpɹɐƆ", "item.create.chest_minecart_contraption": "uoıʇdɐɹʇuoƆ ʇɹɐɔǝuıW ʇsǝɥƆ", "item.create.chocolate_bucket": "ʇǝʞɔnᗺ ǝʇɐןoɔoɥƆ", "item.create.chocolate_glazed_berries": "sǝıɹɹǝᗺ pǝzɐן⅁ ǝʇɐןoɔoɥƆ", @@ -2820,6 +2826,7 @@ "item.create.netherite_diving_helmet.tooltip.behaviour1": "ɐʌɐꞀ uı ‾uoısıʌ pǝʌoɹdɯı‾ sʇuɐɹb osןⱯ ˙ʞuɐʇʞɔɐᗺ ǝɥʇ ɯoɹɟ ‾ǝɹnssǝɹԀ ɹıⱯ‾ buıuıɐɹp ʎןʍoןs '‾ɐʌɐꞀ‾ puɐ ‾ǝɹıℲ‾ oʇ ʎʇıunɯɯı sǝpıʌoɹԀ", "item.create.netherite_diving_helmet.tooltip.condition1": ")ʇǝs ןןnℲ( uɹoM uǝɥM", "item.create.netherite_diving_helmet.tooltip.summary": "˙ooʇ '‾ǝʇıɹǝɥʇǝN‾ uı pǝɹǝʌoɔ ǝq oʇ ǝʌɐɥ ‾ʇǝǝℲ puɐ sbǝꞀ‾ 'ǝʌıʇɔǝɟɟǝ ǝq o⟘ ˙‾ʇɐǝɥ ǝɯǝɹʇxǝ‾ ɯoɹɟ noʎ ʇɔǝʇoɹd uɐɔ sıɥʇ '‾ʞuɐʇʞɔɐᗺ ǝʇıɹǝɥʇǝN‾ ɐ ɥʇıʍ ɹǝɥʇǝbo⟘", + "item.create.package_filter": "ɹǝʇןıℲ ǝbɐʞɔɐԀ", "item.create.polished_rose_quartz": "zʇɹɐnὉ ǝsoᴚ pǝɥsıןoԀ", "item.create.potato_cannon": "uouuɐƆ oʇɐʇoԀ", "item.create.potato_cannon.tooltip.behaviour1": "˙‾ʎɹoʇuǝʌuI‾ ɹnoʎ ɯoɹɟ ɯǝʇı ǝןqɐʇıns ɐ ‾sʇooɥS‾", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index ea53d6371d..14e14320cb 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -560,6 +560,7 @@ "block.create.oxidized_copper_tile_slab": "Oxidized Copper Tile Slab", "block.create.oxidized_copper_tile_stairs": "Oxidized Copper Tile Stairs", "block.create.oxidized_copper_tiles": "Oxidized Copper Tiles", + "block.create.packager": "Packager", "block.create.peculiar_bell": "Peculiar Bell", "block.create.peculiar_bell.tooltip.summary": "A decorative _Brass Bell_. Placing it right above open _Soul Fire_ may have side-effects...", "block.create.pink_nixie_tube": "Pink Nixie Tube", @@ -2684,6 +2685,7 @@ "entity.create.contraption": "Contraption", "entity.create.crafting_blueprint": "Crafting Blueprint", "entity.create.gantry_contraption": "Gantry Contraption", + "entity.create.package": "Package", "entity.create.potato_projectile": "Potato Projectile", "entity.create.seat": "Seat", "entity.create.stationary_contraption": "Stationary Contraption", @@ -2708,6 +2710,10 @@ "item.create.brass_sheet": "Brass Sheet", "item.create.builders_tea": "Builder's Tea", "item.create.builders_tea.tooltip.summary": "The perfect drink to get the day started- _Motivating_ and _Saturating._", + "item.create.cardboard_package_10x12": "Cardboard Package", + "item.create.cardboard_package_10x8": "Cardboard Package", + "item.create.cardboard_package_12x10": "Cardboard Package", + "item.create.cardboard_package_12x12": "Cardboard Package", "item.create.chest_minecart_contraption": "Chest Minecart Contraption", "item.create.chocolate_bucket": "Chocolate Bucket", "item.create.chocolate_glazed_berries": "Chocolate Glazed Berries", @@ -2820,6 +2826,7 @@ "item.create.netherite_diving_helmet.tooltip.behaviour1": "Provides immunity to _Fire_ and _Lava_, slowly draining _Air Pressure_ from the Backtank. Also grants _improved vision_ in Lava", "item.create.netherite_diving_helmet.tooltip.condition1": "When Worn (Full set)", "item.create.netherite_diving_helmet.tooltip.summary": "Together with a _Netherite Backtank_, this can protect you from _extreme heat_. To be effective, _Legs and Feet_ have to be covered in _Netherite_, too.", + "item.create.package_filter": "Package Filter", "item.create.polished_rose_quartz": "Polished Rose Quartz", "item.create.potato_cannon": "Potato Cannon", "item.create.potato_cannon.tooltip.behaviour1": "_Shoots_ a suitable item from your _Inventory_.", diff --git a/src/generated/resources/assets/create/models/item/package_filter.json b/src/generated/resources/assets/create/models/item/package_filter.json new file mode 100644 index 0000000000..43b4b3213e --- /dev/null +++ b/src/generated/resources/assets/create/models/item/package_filter.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/package_filter" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/packager.json b/src/generated/resources/data/create/loot_tables/blocks/packager.json index a127ae156f..d72df3d122 100644 --- a/src/generated/resources/data/create/loot_tables/blocks/packager.json +++ b/src/generated/resources/data/create/loot_tables/blocks/packager.json @@ -2,19 +2,20 @@ "type": "minecraft:block", "pools": [ { - "rolls": 1.0, "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], "entries": [ { "type": "minecraft:item", "name": "create:packager" } ], - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ] + "rolls": 1.0 } - ] + ], + "random_sequence": "create:blocks/packager" } \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllItems.java b/src/main/java/com/simibubi/create/AllItems.java index 205fa8811f..3fcbea2c6c 100644 --- a/src/main/java/com/simibubi/create/AllItems.java +++ b/src/main/java/com/simibubi/create/AllItems.java @@ -374,16 +374,16 @@ public class AllItems { CARDBOARD_PACKAGE_12x10 = REGISTRATE.item("cardboard_package_12x10", p -> new PackageItem(p, 12, 10)) .transform(BuilderTransformers.packageItem("cardboard", 12, 10)) .register(); - + public static final ItemEntry FILTER = REGISTRATE.item("filter", FilterItem::regular) .lang("List Filter") - .register(), ATTRIBUTE_FILTER = - REGISTRATE.item("attribute_filter", FilterItem::attribute) - .register(); + .register(), - public static final ItemEntry PACKAGE_FILTER = REGISTRATE.item("package_filter", FilterItem::address) - .model(AssetLookup.existingItemModel()) - .register(); + ATTRIBUTE_FILTER = REGISTRATE.item("attribute_filter", FilterItem::attribute) + .register(), + + PACKAGE_FILTER = REGISTRATE.item("package_filter", FilterItem::address) + .register(); public static final ItemEntry SCHEDULE = REGISTRATE.item("schedule", ScheduleItem::new) .lang("Train Schedule") diff --git a/src/main/java/com/simibubi/create/content/logistics/block/packager/PackagerBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/packager/PackagerBlock.java index 09a6a4ea68..739e0cc6e1 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/packager/PackagerBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/packager/PackagerBlock.java @@ -2,7 +2,7 @@ package com.simibubi.create.content.logistics.block.packager; import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllItems; -import com.simibubi.create.content.contraptions.wrench.IWrenchable; +import com.simibubi.create.content.equipment.wrench.IWrenchable; import com.simibubi.create.foundation.block.IBE; import net.minecraft.core.BlockPos; @@ -13,7 +13,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.Level; -import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.SignalGetter; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.HorizontalDirectionalBlock; import net.minecraft.world.level.block.entity.BlockEntityType; @@ -88,7 +88,7 @@ public class PackagerBlock extends HorizontalDirectionalBlock implements IBE LazyOptional getCapability(Capability cap, Direction side) { - if (cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY && side != Direction.DOWN) + if (cap == ForgeCapabilities.ITEM_HANDLER && side != Direction.DOWN) return invProvider.cast(); return super.getCapability(cap, side); } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/packager/PackagerRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/packager/PackagerRenderer.java index 25f671558f..a0af4b0f17 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/packager/PackagerRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/packager/PackagerRenderer.java @@ -12,9 +12,9 @@ import com.simibubi.create.foundation.utility.AngleHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.block.model.ItemTransforms.TransformType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider.Context; import net.minecraft.core.Direction; +import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; @@ -65,8 +65,8 @@ public class PackagerRenderer extends SmartBlockEntityRenderer int y = topPos; } - @Override - public void renderForeground(PoseStack matrixStack, int mouseX, int mouseY, float partialTicks) { - super.renderForeground(matrixStack, mouseX, mouseY, partialTicks); - } - @Override protected void contentsCleared() {} diff --git a/src/main/java/com/simibubi/create/content/logistics/item/box/PackageDestroyPacket.java b/src/main/java/com/simibubi/create/content/logistics/item/box/PackageDestroyPacket.java index 32744d0f11..3086fa0e4f 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/box/PackageDestroyPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/box/PackageDestroyPacket.java @@ -5,6 +5,7 @@ import com.simibubi.create.foundation.networking.SimplePacketBase; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.core.particles.ItemParticleOption; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.network.FriendlyByteBuf; @@ -40,9 +41,10 @@ public class PackageDestroyPacket extends SimplePacketBase { public boolean handle(Context ctx) { ctx.enqueueWork(() -> { for (int i = 0; i < 20; i++) { - Vec3 pos = VecHelper.offsetRandomly(location, Create.RANDOM, .5f); + ClientLevel level = Minecraft.getInstance().level; + Vec3 pos = VecHelper.offsetRandomly(location, level.getRandom(), .5f); Vec3 motion = Vec3.ZERO; - Minecraft.getInstance().level.addParticle(new ItemParticleOption(ParticleTypes.ITEM, box), pos.x, pos.y, + level.addParticle(new ItemParticleOption(ParticleTypes.ITEM, box), pos.x, pos.y, pos.z, motion.x, motion.y, motion.z); } }); diff --git a/src/main/java/com/simibubi/create/content/logistics/item/box/PackageEntity.java b/src/main/java/com/simibubi/create/content/logistics/item/box/PackageEntity.java index 22c3a6a5da..50454d59d1 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/box/PackageEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/box/PackageEntity.java @@ -6,9 +6,9 @@ import java.util.List; import javax.annotation.Nullable; import com.simibubi.create.AllEntityTypes; +import com.simibubi.create.AllPackets; import com.simibubi.create.Create; -import com.simibubi.create.content.logistics.block.chute.ChuteBlock; -import com.simibubi.create.foundation.networking.AllPackets; +import com.simibubi.create.content.logistics.chute.ChuteBlock; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.VecHelper; @@ -17,9 +17,11 @@ import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientGamePacketListener; import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; +import net.minecraft.tags.DamageTypeTags; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.damagesource.DamageSource; @@ -86,7 +88,7 @@ public class PackageEntity extends LivingEntity implements IEntityAdditionalSpaw packageEntity.originalEntity = originalEntity; if (world != null && !world.isClientSide) - if (ChuteBlock.isChute(world.getBlockState(new BlockPos(position.x, position.y + .5f, position.z)))) + if (ChuteBlock.isChute(world.getBlockState(BlockPos.containing(position.x, position.y + .5f, position.z)))) packageEntity.setYRot(((int) packageEntity.getYRot()) / 90 * 90); return packageEntity; @@ -113,7 +115,7 @@ public class PackageEntity extends LivingEntity implements IEntityAdditionalSpaw @Override public void travel(Vec3 p_213352_1_) { super.travel(p_213352_1_); - if (!level.isClientSide) + if (!level().isClientSide) return; if (getDeltaMovement().length() < 1 / 128f) return; @@ -122,8 +124,8 @@ public class PackageEntity extends LivingEntity implements IEntityAdditionalSpaw Vec3 motion = getDeltaMovement().scale(.75f); AABB bb = getBoundingBox(); - List entityStream = level.getEntityCollisions(this, bb.expandTowards(motion)); - motion = collideBoundingBox(this, motion, bb, level, entityStream); + List entityStream = level().getEntityCollisions(this, bb.expandTowards(motion)); + motion = collideBoundingBox(this, motion, bb, level(), entityStream); Vec3 clientPos = position().add(motion); if (lerpSteps != 0) @@ -201,7 +203,7 @@ public class PackageEntity extends LivingEntity implements IEntityAdditionalSpaw } public boolean decreaseInsertionTimer(@Nullable Vec3 targetSpot) { - if (level.isClientSide) + if (level().isClientSide) return true; if (targetSpot != null) { setDeltaMovement(getDeltaMovement().scale(.75f) @@ -242,7 +244,7 @@ public class PackageEntity extends LivingEntity implements IEntityAdditionalSpaw .isEmpty()) return super.interact(pPlayer, pHand); pPlayer.setItemInHand(pHand, box); - level.playSound(null, blockPosition(), SoundEvents.ITEM_PICKUP, SoundSource.PLAYERS, .2f, + level().playSound(null, blockPosition(), SoundEvents.ITEM_PICKUP, SoundSource.PLAYERS, .2f, .75f + Create.RANDOM.nextFloat()); remove(RemovalReason.DISCARDED); return InteractionResult.SUCCESS; @@ -269,37 +271,37 @@ public class PackageEntity extends LivingEntity implements IEntityAdditionalSpaw if (!isAlive()) return; if (state.getBlock() == Blocks.WATER) { - destroy(DamageSource.DROWN); + destroy(damageSources().drown()); remove(RemovalReason.KILLED); } } @Override public boolean hurt(DamageSource source, float amount) { - if (level.isClientSide || !this.isAlive()) + if (level().isClientSide || !this.isAlive()) return false; - if (DamageSource.OUT_OF_WORLD.equals(source)) { - this.remove(RemovalReason.DISCARDED); + if (source.is(DamageTypeTags.BYPASSES_INVULNERABILITY)) { + this.kill(); return false; } - if (DamageSource.IN_WALL.equals(source) && (isPassenger() || insertionDelay < 20)) + if (source.equals(damageSources().inWall()) && (isPassenger() || insertionDelay < 20)) return false; - if (DamageSource.FALL.equals(source)) + if (source.is(DamageTypeTags.IS_FALL)) return false; if (this.isInvulnerableTo(source)) return false; - if (source.isExplosion()) { + if (source.is(DamageTypeTags.IS_EXPLOSION)) { this.destroy(source); this.remove(RemovalReason.KILLED); return false; } - if (DamageSource.IN_FIRE.equals(source)) { + if (source.is(DamageTypeTags.IS_FIRE)) { if (this.isOnFire()) { this.takeDamage(source, 0.15F); } else { @@ -308,11 +310,6 @@ public class PackageEntity extends LivingEntity implements IEntityAdditionalSpaw return false; } - if (DamageSource.ON_FIRE.equals(source) && this.getHealth() > 0.5F) { - this.takeDamage(source, 4.0F); - return false; - } - boolean wasShot = source.getDirectEntity() instanceof AbstractArrow; boolean shotCanPierce = wasShot && ((AbstractArrow) source.getDirectEntity()).getPierceLevel() > 0; @@ -338,8 +335,8 @@ public class PackageEntity extends LivingEntity implements IEntityAdditionalSpaw private void destroy(DamageSource source) { AllPackets.getChannel() .send(PacketDistributor.TRACKING_ENTITY.with(() -> this), new PackageDestroyPacket(position(), box)); - this.level.playSound((Player) null, getX(), getY(), getZ(), SoundEvents.ARMOR_STAND_BREAK, - this.getSoundSource(), 1.0F, 1.0F); + level().playSound((Player) null, getX(), getY(), getZ(), SoundEvents.ARMOR_STAND_BREAK, this.getSoundSource(), + 1.0F, 1.0F); this.dropAllDeathLoot(source); } @@ -351,8 +348,8 @@ public class PackageEntity extends LivingEntity implements IEntityAdditionalSpaw ItemStack itemstack = contents.getStackInSlot(i); if (itemstack.isEmpty()) continue; - ItemEntity entityIn = new ItemEntity(level, getX(), getY(), getZ(), itemstack); - level.addFreshEntity(entityIn); + ItemEntity entityIn = new ItemEntity(level(), getX(), getY(), getZ(), itemstack); + level().addFreshEntity(entityIn); } } @@ -369,7 +366,7 @@ public class PackageEntity extends LivingEntity implements IEntityAdditionalSpaw } @Override - public Packet getAddEntityPacket() { + public Packet getAddEntityPacket() { return NetworkHooks.getEntitySpawningPacket(this); } diff --git a/src/main/java/com/simibubi/create/content/logistics/item/box/PackageItem.java b/src/main/java/com/simibubi/create/content/logistics/item/box/PackageItem.java index 31f4403cf5..92c62cd2f5 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/box/PackageItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/box/PackageItem.java @@ -9,7 +9,6 @@ import com.simibubi.create.foundation.utility.Components; import net.minecraft.ChatFormatting; import net.minecraft.core.Direction; -import net.minecraft.core.NonNullList; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; @@ -21,7 +20,6 @@ import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; @@ -83,9 +81,6 @@ public class PackageItem extends Item { return box; } - @Override - public void fillItemCategory(CreativeModeTab pCategory, NonNullList pItems) {} - public static void addAddress(ItemStack box, String address) { box.getOrCreateTag() .putString("Address", address); diff --git a/src/main/java/com/simibubi/create/content/logistics/item/box/PackageRenderer.java b/src/main/java/com/simibubi/create/content/logistics/item/box/PackageRenderer.java index f9afc19d5a..77742c8f5e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/box/PackageRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/box/PackageRenderer.java @@ -15,6 +15,7 @@ import net.minecraft.core.Direction; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Blocks; +import net.minecraftforge.registries.ForgeRegistries; public class PackageRenderer extends EntityRenderer { @@ -27,8 +28,7 @@ public class PackageRenderer extends EntityRenderer { ItemStack box = entity.box; if (box.isEmpty()) box = PackageItem.getFallbackBox(); - PartialModel model = AllPartialModels.PACKAGES.get(box.getItem() - .getRegistryName()); + PartialModel model = AllPartialModels.PACKAGES.get(ForgeRegistries.ITEMS.getKey(box.getItem())); SuperByteBuffer sbb = CachedBufferer.partial(model, Blocks.AIR.defaultBlockState()); sbb.translate(-.5, 0, -.5) .rotateCentered(Direction.UP, AngleHelper.rad(yaw)) diff --git a/src/main/resources/assets/create/models/item/cardboard_package_10x12.json b/src/main/resources/assets/create/models/item/cardboard_package_10x12.json index 2c909f0368..1764c61f2e 100644 --- a/src/main/resources/assets/create/models/item/cardboard_package_10x12.json +++ b/src/main/resources/assets/create/models/item/cardboard_package_10x12.json @@ -2,8 +2,8 @@ "credit": "Made with Blockbench", "parent": "create:item/package_transforms", "textures": { - "0": "create:entity/package/cardboard", - "particle": "create:entity/package/cardboard_particle" + "0": "create:block/package/cardboard", + "particle": "create:block/package/cardboard_particle" }, "elements": [ { diff --git a/src/main/resources/assets/create/models/item/cardboard_package_10x8.json b/src/main/resources/assets/create/models/item/cardboard_package_10x8.json index fd38cbdbdc..595d675ad8 100644 --- a/src/main/resources/assets/create/models/item/cardboard_package_10x8.json +++ b/src/main/resources/assets/create/models/item/cardboard_package_10x8.json @@ -2,8 +2,8 @@ "credit": "Made with Blockbench", "parent": "create:item/package_transforms", "textures": { - "0": "create:entity/package/cardboard", - "particle": "create:entity/package/cardboard_particle" + "0": "create:block/package/cardboard", + "particle": "create:block/package/cardboard_particle" }, "elements": [ { diff --git a/src/main/resources/assets/create/models/item/cardboard_package_12x10.json b/src/main/resources/assets/create/models/item/cardboard_package_12x10.json index a5253293f5..e9e11661e3 100644 --- a/src/main/resources/assets/create/models/item/cardboard_package_12x10.json +++ b/src/main/resources/assets/create/models/item/cardboard_package_12x10.json @@ -2,8 +2,8 @@ "credit": "Made with Blockbench", "parent": "create:item/package_transforms", "textures": { - "0": "create:entity/package/cardboard", - "particle": "create:entity/package/cardboard_particle" + "0": "create:block/package/cardboard", + "particle": "create:block/package/cardboard_particle" }, "elements": [ { diff --git a/src/main/resources/assets/create/models/item/cardboard_package_12x12.json b/src/main/resources/assets/create/models/item/cardboard_package_12x12.json index c052f0582b..3a542e91c5 100644 --- a/src/main/resources/assets/create/models/item/cardboard_package_12x12.json +++ b/src/main/resources/assets/create/models/item/cardboard_package_12x12.json @@ -2,8 +2,8 @@ "credit": "Made with Blockbench", "parent": "create:item/package_transforms", "textures": { - "0": "create:entity/package/cardboard", - "particle": "create:entity/package/cardboard_particle" + "0": "create:block/package/cardboard", + "particle": "create:block/package/cardboard_particle" }, "elements": [ { diff --git a/src/main/resources/assets/create/models/item/package_filter.json b/src/main/resources/assets/create/models/item/package_filter.json deleted file mode 100644 index 2d09bdcab7..0000000000 --- a/src/main/resources/assets/create/models/item/package_filter.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "create:item/filter", - "textures": { - "0": "create:item/package_filter", - "particle": "create:item/package_filter" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/entity/package/cardboard.png b/src/main/resources/assets/create/textures/block/package/cardboard.png similarity index 100% rename from src/main/resources/assets/create/textures/entity/package/cardboard.png rename to src/main/resources/assets/create/textures/block/package/cardboard.png diff --git a/src/main/resources/assets/create/textures/entity/package/cardboard_particle.png b/src/main/resources/assets/create/textures/block/package/cardboard_particle.png similarity index 100% rename from src/main/resources/assets/create/textures/entity/package/cardboard_particle.png rename to src/main/resources/assets/create/textures/block/package/cardboard_particle.png diff --git a/src/main/resources/assets/create/textures/item/package_filter.png b/src/main/resources/assets/create/textures/item/package_filter.png index 9a2c24211278e60251523e4d405cbf743c94b2a2..e0e02c6a4e75dd129729f16da50d05de632b2748 100644 GIT binary patch delta 244 zcmeyzxRz;xW4&&GPl#(vQ+Z})()`(zZEZZZu3vcO*!Df!*132@-MMzu(J^4@{7Ek! zoHaGEH8e11U|@KCEB^O>_%)r2R7=#&*=dVZs3g&sb zIEH8hxAq6}9Z=wK4s^Vz`Q83q?uuQyk<-@v%h2>!sD61^f$Mi(^pA0ZW4(HSPl#(%h=#V7!MYZ^PX}{5V|9vrv@0qqEX-{xLUb3`SX^EoePp^f z0|SF;k$O0g;w=gC3;vG;7;IlCwE-nK3p^r=85sBugD~Uq{1qucL3d9V#}JL+tv!Z9 z4GIFx%2K=&{_hVz*Tl$Wr62y*E{ExWd;jIm?(dgBGv@ZnB$yOM_A;H3K6@d9WrkT$ lFPCdjmi&R!e;MA0KYPrv`mWZSsX#LsJYD@<);T3K0RR+=PGA54 From 74ca28f86d9a9513dbe7d69dd4cd8dbc1d705b45 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Mon, 13 Nov 2023 15:02:54 +0100 Subject: [PATCH 020/515] Storage Insights - Added logistical link and stock ticker - Entities tending a stock ticker show combined item list of linked packagers --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 16 +- .../create/blockstates/logistical_link.json | 56 +++++ .../create/blockstates/stock_ticker.json | 19 ++ .../resources/assets/create/lang/en_ud.json | 7 + .../resources/assets/create/lang/en_us.json | 7 + .../create/models/item/logistical_link.json | 3 + .../create/models/item/stock_ticker.json | 3 + .../loot_tables/blocks/logistical_link.json | 21 ++ .../loot_tables/blocks/stock_ticker.json | 21 ++ .../minecraft/tags/blocks/mineable/axe.json | 1 + .../tags/blocks/mineable/pickaxe.json | 1 + .../simibubi/create/AllBlockEntityTypes.java | 21 +- .../java/com/simibubi/create/AllBlocks.java | 25 ++- .../com/simibubi/create/AllEntityTypes.java | 4 +- .../java/com/simibubi/create/AllItems.java | 2 +- .../java/com/simibubi/create/AllPackets.java | 10 +- .../com/simibubi/create/AllPartialModels.java | 1 + .../java/com/simibubi/create/AllShapes.java | 2 + .../contraptions/actors/seat/SeatEntity.java | 2 +- .../hats/CreateHatArmorLayer.java} | 54 +---- .../content/equipment/hats/EntityHats.java | 91 ++++++++ .../content/kinetics/belt/BeltBlock.java | 4 +- .../content/kinetics/belt/BeltRenderer.java | 2 +- .../belt/transport/BeltInventory.java | 6 +- .../belt/transport/TransportedItemStack.java | 2 +- .../{item => }/box/PackageDestroyPacket.java | 2 +- .../{item => }/box/PackageEntity.java | 2 +- .../logistics/{item => }/box/PackageItem.java | 2 +- .../{item => }/box/PackageRenderer.java | 2 +- .../logistics/chute/AbstractChuteBlock.java | 2 +- .../logistics/chute/ChuteRenderer.java | 2 +- .../logistics/depot/DepotRenderer.java | 2 +- .../logistics/depot/EjectorBlockEntity.java | 2 +- .../logistics/depot/EjectorRenderer.java | 2 +- .../depot/SharedDepotBlockMethods.java | 2 +- .../logistics/filter/FilterItemStack.java | 2 +- .../content/logistics/funnel/FunnelBlock.java | 2 +- .../logistics/funnel/FunnelBlockEntity.java | 2 +- .../logisticalLink/LogisticalLinkBlock.java | 99 +++++++++ .../LogisticalLinkBlockEntity.java | 118 +++++++++++ .../LogisticalLinkBlockItem.java | 33 +++ .../logistics/packager/InventorySummary.java | 100 +++++++++ .../{block => }/packager/PackagerBlock.java | 2 +- .../packager/PackagerBlockEntity.java | 25 ++- .../packager/PackagerItemHandler.java | 4 +- .../packager/PackagerRenderer.java | 2 +- .../LogisticalStockRequestPacket.java | 34 +++ .../LogisticalStockResponsePacket.java | 61 ++++++ .../LogisticalWorkstationBlock.java | 19 ++ .../LogisticalWorkstationBlockEntity.java | 82 ++++++++ .../stockTicker/StockTickerBlock.java | 55 +++++ .../stockTicker/StockTickerBlockEntity.java | 46 +++++ .../StockTickerInteractionHandler.java | 74 +++++++ .../stockTicker/StockTickerRequestScreen.java | 194 ++++++++++++++++++ .../displayLink/ClickToLinkBlockItem.java | 161 +++++++++++++++ .../displayLink/DisplayLinkBlockEntity.java | 30 +-- .../displayLink/DisplayLinkBlockItem.java | 134 ++---------- ...inkRenderer.java => LinkBulbRenderer.java} | 8 +- .../displayLink/LinkWithBulbBlockEntity.java | 60 ++++++ .../foundation/data/BuilderTransformers.java | 2 +- .../foundation/events/ClientEvents.java | 8 +- .../create/foundation/item/ItemHelper.java | 2 +- .../foundation/ponder/SceneBuilder.java | 6 +- .../infrastructure/config/CLogistics.java | 5 +- .../assets/create/lang/default/interface.json | 6 + .../models/block/display_link/block.json | 2 - .../block/display_link/block_powered.json | 121 ++++++++++- .../models/block/logistical_link/block.json | 123 +++++++++++ .../block/logistical_link/block_powered.json | 123 +++++++++++ .../create/models/block/stock_ticker.json | 142 +++++++++++++ .../create/models/entity/logistics_hat.json | 7 + .../models/item/cardboard_package_10x12.json | 4 +- .../models/item/cardboard_package_10x8.json | 4 +- .../models/item/cardboard_package_12x10.json | 4 +- .../models/item/cardboard_package_12x12.json | 4 +- .../create/textures/block/logistical_link.png | Bin 0 -> 1265 bytes .../textures/block/logistical_link_side.png | Bin 0 -> 278 bytes .../block/logistical_link_side_powered.png | Bin 0 -> 277 bytes .../block/{ticker.png => stock_ticker.png} | Bin .../create/textures/entity/logistics_hat.png | Bin 0 -> 351 bytes .../{block => entity}/package/cardboard.png | Bin .../package/cardboard_particle.png | Bin .../assets/minecraft/atlases/blocks.json | 12 ++ 83 files changed, 2063 insertions(+), 260 deletions(-) create mode 100644 src/generated/resources/assets/create/blockstates/logistical_link.json create mode 100644 src/generated/resources/assets/create/blockstates/stock_ticker.json create mode 100644 src/generated/resources/assets/create/models/item/logistical_link.json create mode 100644 src/generated/resources/assets/create/models/item/stock_ticker.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/logistical_link.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/stock_ticker.json rename src/main/java/com/simibubi/create/content/{trains/schedule/TrainHatArmorLayer.java => equipment/hats/CreateHatArmorLayer.java} (73%) create mode 100644 src/main/java/com/simibubi/create/content/equipment/hats/EntityHats.java rename src/main/java/com/simibubi/create/content/logistics/{item => }/box/PackageDestroyPacket.java (96%) rename src/main/java/com/simibubi/create/content/logistics/{item => }/box/PackageEntity.java (99%) rename src/main/java/com/simibubi/create/content/logistics/{item => }/box/PackageItem.java (99%) rename src/main/java/com/simibubi/create/content/logistics/{item => }/box/PackageRenderer.java (96%) create mode 100644 src/main/java/com/simibubi/create/content/logistics/logisticalLink/LogisticalLinkBlock.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/logisticalLink/LogisticalLinkBlockEntity.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/logisticalLink/LogisticalLinkBlockItem.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/packager/InventorySummary.java rename src/main/java/com/simibubi/create/content/logistics/{block => }/packager/PackagerBlock.java (98%) rename src/main/java/com/simibubi/create/content/logistics/{block => }/packager/PackagerBlockEntity.java (89%) rename src/main/java/com/simibubi/create/content/logistics/{block => }/packager/PackagerItemHandler.java (92%) rename src/main/java/com/simibubi/create/content/logistics/{block => }/packager/PackagerRenderer.java (97%) create mode 100644 src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalStockRequestPacket.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalStockResponsePacket.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalWorkstationBlock.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalWorkstationBlockEntity.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlock.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java create mode 100644 src/main/java/com/simibubi/create/content/redstone/displayLink/ClickToLinkBlockItem.java rename src/main/java/com/simibubi/create/content/redstone/displayLink/{DisplayLinkRenderer.java => LinkBulbRenderer.java} (85%) create mode 100644 src/main/java/com/simibubi/create/content/redstone/displayLink/LinkWithBulbBlockEntity.java create mode 100644 src/main/resources/assets/create/models/block/logistical_link/block.json create mode 100644 src/main/resources/assets/create/models/block/logistical_link/block_powered.json create mode 100644 src/main/resources/assets/create/models/block/stock_ticker.json create mode 100644 src/main/resources/assets/create/models/entity/logistics_hat.json create mode 100644 src/main/resources/assets/create/textures/block/logistical_link.png create mode 100644 src/main/resources/assets/create/textures/block/logistical_link_side.png create mode 100644 src/main/resources/assets/create/textures/block/logistical_link_side_powered.png rename src/main/resources/assets/create/textures/block/{ticker.png => stock_ticker.png} (100%) create mode 100644 src/main/resources/assets/create/textures/entity/logistics_hat.png rename src/main/resources/assets/create/textures/{block => entity}/package/cardboard.png (100%) rename src/main/resources/assets/create/textures/{block => entity}/package/cardboard_particle.png (100%) diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 45518658df..47907ead11 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2023-11-12T14:08:50.9829798 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2023-11-12T23:42:04.0326022 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -301,6 +301,7 @@ b9934a558e1b495403dc2c71ffb43cce7d396013 assets/create/blockstates/lime_seat.jso ba181485f219d3ae23509a7edf28e25d9edb10f4 assets/create/blockstates/lime_valve_handle.json 654e845cebed82b7afbcf81380921e0a475b01e9 assets/create/blockstates/linear_chassis.json e195e82e4d0c1fc20474535bc9068cbb77a5e175 assets/create/blockstates/lit_blaze_burner.json +2b61a97b3ef9a35067e5ab31045ff4a07f6ac660 assets/create/blockstates/logistical_link.json 296186b196af94e1ab3f7e8a3254f6d31ae47a5c assets/create/blockstates/magenta_nixie_tube.json f150922cbed1c05fb3892d4ac91eb471234252e2 assets/create/blockstates/magenta_sail.json bb1ab5c70647933400b3a99ef9d166ba5e3d4709 assets/create/blockstates/magenta_seat.json @@ -522,6 +523,7 @@ a60c9c8241e40c2e28f5760c0ca6e80cfe9d59f3 assets/create/blockstates/steam_whistle 8865500bcd2e4d467e74edb3509850fa92a5809f assets/create/blockstates/sticker.json bed0534e618105184bc877b104230403ca85bb58 assets/create/blockstates/sticky_mechanical_piston.json bab242ab794e6d439645c2d5a0242ae7c81942ff assets/create/blockstates/stockpile_switch.json +9989bda294fbffc5f659d2e608e01dea424c7694 assets/create/blockstates/stock_ticker.json a70c025de5d85180f371ff05bbdc531d8bdfaab1 assets/create/blockstates/stressometer.json 8086f80c532fad42b37fcdc590b890ed7e8c3fe9 assets/create/blockstates/tiled_glass.json 1143ab7223c655764a81ed72ac385ea179664072 assets/create/blockstates/tiled_glass_pane.json @@ -586,8 +588,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -6792ed0dbd8b9edaf755a914a7c00cdd75f2d424 assets/create/lang/en_ud.json -93ae8f40bc247303f6264f6ca60f701545e58a5b assets/create/lang/en_us.json +f0ca10f5367eccbf7d31f37cef2f1ba7f3e94e5b assets/create/lang/en_ud.json +ba79e9c4273466b7861e5220351e608d6b0fcae6 assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -1994,6 +1996,7 @@ fba1e7d1cad39c89976b427db62544d80f47ad5d assets/create/models/item/limestone_pil d0f4148bdb0a905e68f54b5dfd829fd47e528fea assets/create/models/item/lime_valve_handle.json 1d30f9b525e8e9736b34a92f848e235c71fd6bd8 assets/create/models/item/linear_chassis.json 8f622f5f79446f6060d9e8815205fce919c8c829 assets/create/models/item/linked_controller.json +b517f437b0f59c5b7d551f515433371be5b9327b assets/create/models/item/logistical_link.json ad6fd371ee989c9c3c21e762273e8a4e903f0af8 assets/create/models/item/magenta_seat.json 7c0e3f91e5ab029473736deffb2b2aab9d4763c7 assets/create/models/item/magenta_toolbox.json 6d82582e5afea919927606b20a74cbda5223956f assets/create/models/item/magenta_valve_handle.json @@ -2218,6 +2221,7 @@ b82ab0c69df330f6f938ed1beee7b4add67d2e50 assets/create/models/item/steam_engine. 54f200be903e056e5cf9e2186f0a0a51f8f0f84e assets/create/models/item/sticker.json 0f88de164439640cc175ceef2017f7416b5a7018 assets/create/models/item/sticky_mechanical_piston.json 4b640b66765b206f8c2884b7c1a1ef860b81d841 assets/create/models/item/stockpile_switch.json +67c98c6c7f2122850acfbee34688572934fdd226 assets/create/models/item/stock_ticker.json 6ee792277b9fd980c40e18e841afa63fc500ed0b assets/create/models/item/stressometer.json 8d4ce1ccf180016506292f63188c10d0dabe0ee3 assets/create/models/item/sturdy_sheet.json a10bb4d6d1a4483a806e3aaa086d48c0e20aaefe assets/create/models/item/super_glue.json @@ -3246,6 +3250,7 @@ c6bb0877c537dda15469934383dc45c608bfd1a4 data/create/loot_tables/blocks/limeston 1a3ed7cd5660d7ea014956ea642e0b07d89bc297 data/create/loot_tables/blocks/lime_valve_handle.json baf70f9eb579f20b232a2af4e6b00a54f84844e6 data/create/loot_tables/blocks/linear_chassis.json e4c0f8ca822cf7555bd011825b430c3c735160d4 data/create/loot_tables/blocks/lit_blaze_burner.json +d854675ced4276a477b3ec6cbd02cda1de6485b3 data/create/loot_tables/blocks/logistical_link.json 6bd8b044cc9c69a5268372e5436f556da2c1bf21 data/create/loot_tables/blocks/magenta_nixie_tube.json b4d06c9ce7fbec0f23bb6dbc446b77d070f06775 data/create/loot_tables/blocks/magenta_sail.json 300e480d8e43e3a4ca19a92ae1360c02f7c5accd data/create/loot_tables/blocks/magenta_seat.json @@ -3467,6 +3472,7 @@ cae1bd9100b62841e260880faa80e2442f44a141 data/create/loot_tables/blocks/steam_wh 0bc3fdde351129e3a261a2420aff9d3f063c235e data/create/loot_tables/blocks/sticker.json 074f526902cb5fcff2129614428aba1ea05a6649 data/create/loot_tables/blocks/sticky_mechanical_piston.json a7332324e63f7d28621ddfbd54eb3d091461d890 data/create/loot_tables/blocks/stockpile_switch.json +f4fa9bb255348dc79dcc0468b3beb9ad075eb036 data/create/loot_tables/blocks/stock_ticker.json b13496b1b4bc0be30605832e23894fb374dd796e data/create/loot_tables/blocks/stressometer.json 2d397c2a37e0d5a6c0028367cc0bdabd75f0c752 data/create/loot_tables/blocks/tiled_glass.json 0ad584e41780dc0183af1fa1e49e126730dfdbab data/create/loot_tables/blocks/tiled_glass_pane.json @@ -4292,8 +4298,8 @@ c741ba83b562ae3459d7c4f2db69537f549ea411 data/forge/tags/items/tools/wrench.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/dripstone_replaceable_blocks.json e3321ff14704c031a2c16953b7e391f4f24dd70b data/minecraft/tags/blocks/impermeable.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/lush_ground_replaceable.json -5a030817b2322e363edc8f5376f7c9de73df8b48 data/minecraft/tags/blocks/mineable/axe.json -d794a156fdc9ec9e7c935b3b8962206b7b82eb79 data/minecraft/tags/blocks/mineable/pickaxe.json +045e46b606c38fa41a2457dcf5c20c78e1f5a4a9 data/minecraft/tags/blocks/mineable/axe.json +b986b07ea27f750608501b410eae7b1dca04d833 data/minecraft/tags/blocks/mineable/pickaxe.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/moss_replaceable.json 0c13aae0eeb99e89febe8dbe5e002af2ff843a9e data/minecraft/tags/blocks/needs_iron_tool.json 3cb2a92cbdf32ed5978f740dc378d363306c3e84 data/minecraft/tags/blocks/needs_stone_tool.json diff --git a/src/generated/resources/assets/create/blockstates/logistical_link.json b/src/generated/resources/assets/create/blockstates/logistical_link.json new file mode 100644 index 0000000000..aee776fb2a --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/logistical_link.json @@ -0,0 +1,56 @@ +{ + "variants": { + "facing=down,powered=false": { + "model": "create:block/logistical_link/block", + "x": 180 + }, + "facing=down,powered=true": { + "model": "create:block/logistical_link/block_powered", + "x": 180 + }, + "facing=east,powered=false": { + "model": "create:block/logistical_link/block", + "x": 90, + "y": 90 + }, + "facing=east,powered=true": { + "model": "create:block/logistical_link/block_powered", + "x": 90, + "y": 90 + }, + "facing=north,powered=false": { + "model": "create:block/logistical_link/block", + "x": 90 + }, + "facing=north,powered=true": { + "model": "create:block/logistical_link/block_powered", + "x": 90 + }, + "facing=south,powered=false": { + "model": "create:block/logistical_link/block", + "x": 90, + "y": 180 + }, + "facing=south,powered=true": { + "model": "create:block/logistical_link/block_powered", + "x": 90, + "y": 180 + }, + "facing=up,powered=false": { + "model": "create:block/logistical_link/block" + }, + "facing=up,powered=true": { + "model": "create:block/logistical_link/block_powered" + }, + "facing=west,powered=false": { + "model": "create:block/logistical_link/block", + "x": 90, + "y": 270 + }, + "facing=west,powered=true": { + "model": "create:block/logistical_link/block_powered", + "x": 90, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/stock_ticker.json b/src/generated/resources/assets/create/blockstates/stock_ticker.json new file mode 100644 index 0000000000..5e7770d38f --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/stock_ticker.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "create:block/stock_ticker", + "y": 90 + }, + "facing=north": { + "model": "create:block/stock_ticker" + }, + "facing=south": { + "model": "create:block/stock_ticker", + "y": 180 + }, + "facing=west": { + "model": "create:block/stock_ticker", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index e5dfe3d955..de6713fc1c 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -513,6 +513,7 @@ "block.create.limestone_pillar": "ɹɐןןıԀ ǝuoʇsǝɯıꞀ", "block.create.linear_chassis": "sıssɐɥƆ ɹɐǝuıꞀ", "block.create.lit_blaze_burner": "ɹǝuɹnᗺ ǝzɐןᗺ ʇıꞀ", + "block.create.logistical_link": "ʞuıꞀ ןɐɔıʇsıboꞀ", "block.create.magenta_nixie_tube": "ǝqn⟘ ǝıxıN ɐʇuǝbɐW", "block.create.magenta_sail": "ןıɐS ɐʇuǝbɐW", "block.create.magenta_seat": "ʇɐǝS ɐʇuǝbɐW", @@ -750,6 +751,7 @@ "block.create.steam_whistle_extension": "uoısuǝʇxƎ ǝןʇsıɥM ɯɐǝʇS", "block.create.sticker": "ɹǝʞɔıʇS", "block.create.sticky_mechanical_piston": "uoʇsıԀ ןɐɔıuɐɥɔǝW ʎʞɔıʇS", + "block.create.stock_ticker": "ɹǝʞɔı⟘ ʞɔoʇS", "block.create.stockpile_switch": "ɥɔʇıʍS pןoɥsǝɹɥ⟘", "block.create.stressometer": "ɹǝʇǝɯossǝɹʇS", "block.create.tiled_glass": "ssɐן⅁ pǝןı⟘", @@ -1298,6 +1300,11 @@ "create.linked_controller.frequency_slot_2": "ᄅ# ˙bǝɹℲ '%1$s :puıqʎǝʞ", "create.linked_controller.key_bound": "%1$s oʇ punoq ʎɔuǝnbǝɹℲ", "create.linked_controller.press_keybind": "ʎǝʞ ǝʌıʇɔǝdsǝɹ ǝɥʇ oʇ ʎɔuǝnbǝɹɟ sıɥʇ puıq oʇ '%6$s ɹo %5$s '%4$s '%3$s '%2$s '%1$s ssǝɹԀ", + "create.logistical_link.clear": "uoıʇɔǝןǝs pǝɹɐǝןƆ", + "create.logistical_link.invalid": "buıɔɐןd ǝɹoɟǝq ɹǝʇsıbǝᴚ ɥsɐƆ ɹo ɹǝʞɔı⟘ ʞɔoʇS ɐ ubıssⱯ", + "create.logistical_link.set": "pǝʇɔǝןǝs uoıʇɐʇsʞɹoʍ pǝʇǝbɹɐ⟘", + "create.logistical_link.success": "ʇǝbɹɐʇ ןɐɔıʇsıboן oʇ punoq ʎןןnɟssǝɔɔnS", + "create.logistical_link.too_far": "ǝɹǝɥ ɯoɹɟ ɹɐɟ ooʇ sı uoıʇɐʇsʞɹoʍ pǝʇǝbɹɐ⟘", "create.logistics.crafter.click_to_merge": "sǝıɹoʇuǝʌuI ǝbɹǝɯ oʇ ʞɔıןƆ", "create.logistics.crafter.click_to_separate": "sǝıɹoʇuǝʌuI ǝʇɐɹɐdǝs oʇ ʞɔıןƆ", "create.logistics.crafter.connected": "sɹǝʇɟɐɹƆ pǝʇɔǝuuoƆ", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 14e14320cb..bc4a5aaed5 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -513,6 +513,7 @@ "block.create.limestone_pillar": "Limestone Pillar", "block.create.linear_chassis": "Linear Chassis", "block.create.lit_blaze_burner": "Lit Blaze Burner", + "block.create.logistical_link": "Logistical Link", "block.create.magenta_nixie_tube": "Magenta Nixie Tube", "block.create.magenta_sail": "Magenta Sail", "block.create.magenta_seat": "Magenta Seat", @@ -750,6 +751,7 @@ "block.create.steam_whistle_extension": "Steam Whistle Extension", "block.create.sticker": "Sticker", "block.create.sticky_mechanical_piston": "Sticky Mechanical Piston", + "block.create.stock_ticker": "Stock Ticker", "block.create.stockpile_switch": "Threshold Switch", "block.create.stressometer": "Stressometer", "block.create.tiled_glass": "Tiled Glass", @@ -1298,6 +1300,11 @@ "create.linked_controller.frequency_slot_2": "Keybind: %1$s, Freq. #2", "create.linked_controller.key_bound": "Frequency bound to %1$s", "create.linked_controller.press_keybind": "Press %1$s, %2$s, %3$s, %4$s, %5$s or %6$s, to bind this frequency to the respective key", + "create.logistical_link.clear": "Cleared selection", + "create.logistical_link.invalid": "Assign a Stock Ticker or Cash Register before placing", + "create.logistical_link.set": "Targeted workstation selected", + "create.logistical_link.success": "Successfully bound to logistical target", + "create.logistical_link.too_far": "Targeted workstation is too far from here", "create.logistics.crafter.click_to_merge": "Click to merge Inventories", "create.logistics.crafter.click_to_separate": "Click to separate Inventories", "create.logistics.crafter.connected": "Connected Crafters", diff --git a/src/generated/resources/assets/create/models/item/logistical_link.json b/src/generated/resources/assets/create/models/item/logistical_link.json new file mode 100644 index 0000000000..b9f45f0371 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/logistical_link.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/logistical_link/block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/stock_ticker.json b/src/generated/resources/assets/create/models/item/stock_ticker.json new file mode 100644 index 0000000000..923a047f25 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/stock_ticker.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/stock_ticker" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/logistical_link.json b/src/generated/resources/data/create/loot_tables/blocks/logistical_link.json new file mode 100644 index 0000000000..6dc3436a98 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/logistical_link.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:logistical_link" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/logistical_link" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/stock_ticker.json b/src/generated/resources/data/create/loot_tables/blocks/stock_ticker.json new file mode 100644 index 0000000000..033168cdcc --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/stock_ticker.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:stock_ticker" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/stock_ticker" +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json b/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json index 488344a68c..3be7a8f751 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json @@ -86,6 +86,7 @@ "create:rotation_speed_controller", "create:mechanical_arm", "create:railway_casing", + "create:logistical_link", "create:content_observer", "create:stockpile_switch", "create:creative_crate", diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json index 82f9abcb25..dc65ae2e8b 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json @@ -121,6 +121,7 @@ "create:large_bogey", "create:controls", "create:item_vault", + "create:logistical_link", "create:andesite_funnel", "create:andesite_belt_funnel", "create:brass_funnel", diff --git a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java index fd1cde1d18..5a8b0f0e92 100644 --- a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java +++ b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java @@ -154,8 +154,6 @@ import com.simibubi.create.content.kinetics.waterwheel.LargeWaterWheelBlockEntit import com.simibubi.create.content.kinetics.waterwheel.WaterWheelBlockEntity; import com.simibubi.create.content.kinetics.waterwheel.WaterWheelInstance; import com.simibubi.create.content.kinetics.waterwheel.WaterWheelRenderer; -import com.simibubi.create.content.logistics.block.packager.PackagerBlockEntity; -import com.simibubi.create.content.logistics.block.packager.PackagerRenderer; import com.simibubi.create.content.logistics.chute.ChuteBlockEntity; import com.simibubi.create.content.logistics.chute.ChuteRenderer; import com.simibubi.create.content.logistics.chute.SmartChuteBlockEntity; @@ -169,6 +167,10 @@ import com.simibubi.create.content.logistics.depot.EjectorRenderer; import com.simibubi.create.content.logistics.funnel.FunnelBlockEntity; import com.simibubi.create.content.logistics.funnel.FunnelInstance; import com.simibubi.create.content.logistics.funnel.FunnelRenderer; +import com.simibubi.create.content.logistics.logisticalLink.LogisticalLinkBlockEntity; +import com.simibubi.create.content.logistics.packager.PackagerBlockEntity; +import com.simibubi.create.content.logistics.packager.PackagerRenderer; +import com.simibubi.create.content.logistics.stockTicker.StockTickerBlockEntity; import com.simibubi.create.content.logistics.tunnel.BeltTunnelBlockEntity; import com.simibubi.create.content.logistics.tunnel.BeltTunnelInstance; import com.simibubi.create.content.logistics.tunnel.BeltTunnelRenderer; @@ -186,7 +188,7 @@ import com.simibubi.create.content.redstone.diodes.BrassDiodeRenderer; import com.simibubi.create.content.redstone.diodes.PulseExtenderBlockEntity; import com.simibubi.create.content.redstone.diodes.PulseRepeaterBlockEntity; import com.simibubi.create.content.redstone.displayLink.DisplayLinkBlockEntity; -import com.simibubi.create.content.redstone.displayLink.DisplayLinkRenderer; +import com.simibubi.create.content.redstone.displayLink.LinkBulbRenderer; import com.simibubi.create.content.redstone.displayLink.source.NixieTubeDisplaySource; import com.simibubi.create.content.redstone.displayLink.target.NixieTubeDisplayTarget; import com.simibubi.create.content.redstone.link.RedstoneLinkBlockEntity; @@ -471,6 +473,17 @@ public class AllBlockEntityTypes { .validBlocks(AllBlocks.PACKAGER) .renderer(() -> PackagerRenderer::new) .register(); + + public static final BlockEntityEntry LOGISTICAL_LINK = REGISTRATE + .blockEntity("logistical_link", LogisticalLinkBlockEntity::new) + .validBlocks(AllBlocks.LOGISTICAL_LINK) + .renderer(() -> LinkBulbRenderer::new) + .register(); + + public static final BlockEntityEntry STOCK_TICKER = REGISTRATE + .blockEntity("stock_ticker", StockTickerBlockEntity::new) + .validBlocks(AllBlocks.STOCK_TICKER) + .register(); public static final BlockEntityEntry MECHANICAL_PISTON = REGISTRATE .blockEntity("mechanical_piston", MechanicalPistonBlockEntity::new) @@ -748,7 +761,7 @@ public class AllBlockEntityTypes { public static final BlockEntityEntry DISPLAY_LINK = REGISTRATE .blockEntity("display_link", DisplayLinkBlockEntity::new) .validBlocks(AllBlocks.DISPLAY_LINK) - .renderer(() -> DisplayLinkRenderer::new) + .renderer(() -> LinkBulbRenderer::new) .register(); public static final BlockEntityEntry THRESHOLD_SWITCH = REGISTRATE diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 88bd6c070b..6c265cfc1a 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -157,7 +157,6 @@ import com.simibubi.create.content.kinetics.waterwheel.LargeWaterWheelBlock; import com.simibubi.create.content.kinetics.waterwheel.LargeWaterWheelBlockItem; import com.simibubi.create.content.kinetics.waterwheel.WaterWheelBlock; import com.simibubi.create.content.kinetics.waterwheel.WaterWheelStructuralBlock; -import com.simibubi.create.content.logistics.block.packager.PackagerBlock; import com.simibubi.create.content.logistics.chute.ChuteBlock; import com.simibubi.create.content.logistics.chute.ChuteGenerator; import com.simibubi.create.content.logistics.chute.ChuteItem; @@ -173,6 +172,10 @@ import com.simibubi.create.content.logistics.funnel.BrassFunnelBlock; import com.simibubi.create.content.logistics.funnel.FunnelGenerator; import com.simibubi.create.content.logistics.funnel.FunnelItem; import com.simibubi.create.content.logistics.funnel.FunnelMovementBehaviour; +import com.simibubi.create.content.logistics.logisticalLink.LogisticalLinkBlock; +import com.simibubi.create.content.logistics.logisticalLink.LogisticalLinkBlockItem; +import com.simibubi.create.content.logistics.packager.PackagerBlock; +import com.simibubi.create.content.logistics.stockTicker.StockTickerBlock; import com.simibubi.create.content.logistics.tunnel.BeltTunnelBlock; import com.simibubi.create.content.logistics.tunnel.BrassTunnelBlock; import com.simibubi.create.content.logistics.tunnel.BrassTunnelCTBehaviour; @@ -1655,6 +1658,26 @@ public class AllBlocks { .build() .register(); + public static final BlockEntry STOCK_TICKER = + REGISTRATE.block("stock_ticker", StockTickerBlock::new) + .initialProperties(SharedProperties::softMetal) + .properties(p -> p.sound(SoundType.GLASS)) + .addLayer(() -> RenderType::cutoutMipped) + .blockstate((c, p) -> p.horizontalBlock(c.get(), AssetLookup.standardModel(c, p))) + .simpleItem() + .register(); + + public static final BlockEntry LOGISTICAL_LINK = + REGISTRATE.block("logistical_link", LogisticalLinkBlock::new) + .initialProperties(SharedProperties::softMetal) + .properties(p -> p.mapColor(MapColor.TERRACOTTA_BROWN)) + .addLayer(() -> RenderType::translucent) + .transform(axeOrPickaxe()) + .blockstate((c, p) -> p.directionalBlock(c.get(), AssetLookup.forPowered(c, p))) + .item(LogisticalLinkBlockItem::new) + .transform(customItemModel("_", "block")) + .register(); + public static final BlockEntry ANDESITE_FUNNEL = REGISTRATE.block("andesite_funnel", AndesiteFunnelBlock::new) .addLayer(() -> RenderType::cutoutMipped) diff --git a/src/main/java/com/simibubi/create/AllEntityTypes.java b/src/main/java/com/simibubi/create/AllEntityTypes.java index 6ed321edfe..ef4da75752 100644 --- a/src/main/java/com/simibubi/create/AllEntityTypes.java +++ b/src/main/java/com/simibubi/create/AllEntityTypes.java @@ -13,8 +13,8 @@ import com.simibubi.create.content.equipment.blueprint.BlueprintEntity; import com.simibubi.create.content.equipment.blueprint.BlueprintRenderer; import com.simibubi.create.content.equipment.potatoCannon.PotatoProjectileEntity; import com.simibubi.create.content.equipment.potatoCannon.PotatoProjectileRenderer; -import com.simibubi.create.content.logistics.item.box.PackageEntity; -import com.simibubi.create.content.logistics.item.box.PackageRenderer; +import com.simibubi.create.content.logistics.box.PackageEntity; +import com.simibubi.create.content.logistics.box.PackageRenderer; import com.simibubi.create.content.trains.entity.CarriageContraptionEntity; import com.simibubi.create.content.trains.entity.CarriageContraptionEntityRenderer; import com.simibubi.create.content.trains.entity.CarriageContraptionInstance; diff --git a/src/main/java/com/simibubi/create/AllItems.java b/src/main/java/com/simibubi/create/AllItems.java index 3fcbea2c6c..6baee89e46 100644 --- a/src/main/java/com/simibubi/create/AllItems.java +++ b/src/main/java/com/simibubi/create/AllItems.java @@ -41,8 +41,8 @@ import com.simibubi.create.content.legacy.ChromaticCompoundColor; import com.simibubi.create.content.legacy.ChromaticCompoundItem; import com.simibubi.create.content.legacy.RefinedRadianceItem; import com.simibubi.create.content.legacy.ShadowSteelItem; +import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.content.logistics.filter.FilterItem; -import com.simibubi.create.content.logistics.item.box.PackageItem; import com.simibubi.create.content.materials.ExperienceNuggetItem; import com.simibubi.create.content.processing.burner.BlazeBurnerBlockItem; import com.simibubi.create.content.processing.sequenced.SequencedAssemblyItem; diff --git a/src/main/java/com/simibubi/create/AllPackets.java b/src/main/java/com/simibubi/create/AllPackets.java index 3ac4c4b4ab..d56b0afe8b 100644 --- a/src/main/java/com/simibubi/create/AllPackets.java +++ b/src/main/java/com/simibubi/create/AllPackets.java @@ -32,7 +32,6 @@ import com.simibubi.create.content.contraptions.sync.ContraptionFluidPacket; import com.simibubi.create.content.contraptions.sync.ContraptionInteractionPacket; import com.simibubi.create.content.contraptions.sync.ContraptionSeatMappingPacket; import com.simibubi.create.content.contraptions.sync.LimbSwingUpdatePacket; -import com.simibubi.create.content.equipment.armor.NetheriteDivingHandler; import com.simibubi.create.content.equipment.bell.SoulPulseEffectPacket; import com.simibubi.create.content.equipment.blueprint.BlueprintAssignCompleteRecipePacket; import com.simibubi.create.content.equipment.clipboard.ClipboardEditPacket; @@ -49,13 +48,15 @@ import com.simibubi.create.content.fluids.transfer.FluidSplashPacket; import com.simibubi.create.content.kinetics.gauge.GaugeObservedPacket; import com.simibubi.create.content.kinetics.mechanicalArm.ArmPlacementPacket; import com.simibubi.create.content.kinetics.transmission.sequencer.ConfigureSequencedGearshiftPacket; +import com.simibubi.create.content.logistics.box.PackageDestroyPacket; import com.simibubi.create.content.logistics.depot.EjectorAwardPacket; import com.simibubi.create.content.logistics.depot.EjectorElytraPacket; import com.simibubi.create.content.logistics.depot.EjectorPlacementPacket; import com.simibubi.create.content.logistics.depot.EjectorTriggerPacket; import com.simibubi.create.content.logistics.filter.FilterScreenPacket; import com.simibubi.create.content.logistics.funnel.FunnelFlapPacket; -import com.simibubi.create.content.logistics.item.box.PackageDestroyPacket; +import com.simibubi.create.content.logistics.stockTicker.LogisticalStockRequestPacket; +import com.simibubi.create.content.logistics.stockTicker.LogisticalStockResponsePacket; import com.simibubi.create.content.logistics.tunnel.TunnelFlapPacket; import com.simibubi.create.content.redstone.displayLink.DisplayLinkConfigurationPacket; import com.simibubi.create.content.redstone.link.controller.LinkedControllerBindPacket; @@ -166,6 +167,7 @@ public enum AllPackets { CLIPBOARD_EDIT(ClipboardEditPacket.class, ClipboardEditPacket::new, PLAY_TO_SERVER), CONTRAPTION_COLLIDER_LOCK_REQUEST(ContraptionColliderLockPacketRequest.class, ContraptionColliderLockPacketRequest::new, PLAY_TO_SERVER), + LOGISTICS_STOCK_REQUEST(LogisticalStockRequestPacket.class, LogisticalStockRequestPacket::new, PLAY_TO_SERVER), // Server to Client SYMMETRY_EFFECT(SymmetryEffectPacket.class, SymmetryEffectPacket::new, PLAY_TO_CLIENT), @@ -211,8 +213,8 @@ public enum AllPackets { CONTRAPTION_COLLIDER_LOCK(ContraptionColliderLockPacket.class, ContraptionColliderLockPacket::new, PLAY_TO_CLIENT), ATTACHED_COMPUTER(AttachedComputerPacket.class, AttachedComputerPacket::new, PLAY_TO_CLIENT), SERVER_DEBUG_INFO(ServerDebugInfoPacket.class, ServerDebugInfoPacket::new, PLAY_TO_CLIENT), - PACKAGE_DESTROYED(PackageDestroyPacket.class, PackageDestroyPacket::new, PLAY_TO_CLIENT) - ; + PACKAGE_DESTROYED(PackageDestroyPacket.class, PackageDestroyPacket::new, PLAY_TO_CLIENT), + LOGISTICS_STOCK_RESPONSE(LogisticalStockResponsePacket.class, LogisticalStockResponsePacket::new, PLAY_TO_CLIENT); public static final ResourceLocation CHANNEL_NAME = Create.asResource("main"); public static final int NETWORK_VERSION = 3; diff --git a/src/main/java/com/simibubi/create/AllPartialModels.java b/src/main/java/com/simibubi/create/AllPartialModels.java index 862337eb27..eccb8ee598 100644 --- a/src/main/java/com/simibubi/create/AllPartialModels.java +++ b/src/main/java/com/simibubi/create/AllPartialModels.java @@ -182,6 +182,7 @@ public class AllPartialModels { CRAFTING_BLUEPRINT_3x3 = entity("crafting_blueprint_large"), TRAIN_HAT = entity("train_hat"), + LOGISTICS_HAT = entity("logistics_hat"), COUPLING_ATTACHMENT = entity("minecart_coupling/attachment"), COUPLING_RING = entity("minecart_coupling/ring"), COUPLING_CONNECTOR = entity("minecart_coupling/connector") diff --git a/src/main/java/com/simibubi/create/AllShapes.java b/src/main/java/com/simibubi/create/AllShapes.java index 8f3e065683..891830a9bb 100644 --- a/src/main/java/com/simibubi/create/AllShapes.java +++ b/src/main/java/com/simibubi/create/AllShapes.java @@ -281,6 +281,8 @@ public class AllShapes { .build(), STATION = shape(0, 0, 0, 16, 2, 16).add(1, 0, 1, 15, 13, 15) .build(), + STOCK_TICKER = shape(1, 0, 1, 15, 4, 15).add(2, 0, 2, 14, 16, 14) + .build(), WHISTLE_SMALL_FLOOR = shape(WHISTLE_SMALL).add(WHISTLE_BASE.get(UP)) .build(), diff --git a/src/main/java/com/simibubi/create/content/contraptions/actors/seat/SeatEntity.java b/src/main/java/com/simibubi/create/content/contraptions/actors/seat/SeatEntity.java index dcdad7aed6..fb9a258fa9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/actors/seat/SeatEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/actors/seat/SeatEntity.java @@ -1,7 +1,7 @@ package com.simibubi.create.content.contraptions.actors.seat; import com.simibubi.create.AllEntityTypes; -import com.simibubi.create.content.logistics.item.box.PackageEntity; +import com.simibubi.create.content.logistics.box.PackageEntity; import net.minecraft.client.renderer.culling.Frustum; import net.minecraft.client.renderer.entity.EntityRenderer; diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/TrainHatArmorLayer.java b/src/main/java/com/simibubi/create/content/equipment/hats/CreateHatArmorLayer.java similarity index 73% rename from src/main/java/com/simibubi/create/content/trains/schedule/TrainHatArmorLayer.java rename to src/main/java/com/simibubi/create/content/equipment/hats/CreateHatArmorLayer.java index 6bd8c4a023..823aab3b88 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/TrainHatArmorLayer.java +++ b/src/main/java/com/simibubi/create/content/equipment/hats/CreateHatArmorLayer.java @@ -1,14 +1,11 @@ -package com.simibubi.create.content.trains.schedule; +package com.simibubi.create.content.equipment.hats; +import com.jozufozu.flywheel.core.PartialModel; import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.AllPartialModels; -import com.simibubi.create.content.contraptions.Contraption; -import com.simibubi.create.content.trains.entity.CarriageContraption; -import com.simibubi.create.content.trains.entity.CarriageContraptionEntity; +import com.simibubi.create.content.trains.schedule.TrainHatOffsets; import com.simibubi.create.foundation.mixin.accessor.AgeableListModelAccessor; import com.simibubi.create.foundation.render.CachedBufferer; -import com.simibubi.create.foundation.utility.Couple; import net.minecraft.client.model.AgeableListModel; import net.minecraft.client.model.AxolotlModel; @@ -29,21 +26,17 @@ import net.minecraft.client.renderer.entity.EntityRenderer; import net.minecraft.client.renderer.entity.LivingEntityRenderer; import net.minecraft.client.renderer.entity.RenderLayerParent; import net.minecraft.client.renderer.entity.layers.RenderLayer; -import net.minecraft.core.BlockPos; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; -public class TrainHatArmorLayer> extends RenderLayer { +public class CreateHatArmorLayer> extends RenderLayer { private Vec3 offset; - public TrainHatArmorLayer(RenderLayerParent renderer, Vec3 offset) { + public CreateHatArmorLayer(RenderLayerParent renderer, Vec3 offset) { super(renderer); this.offset = offset; } @@ -51,7 +44,8 @@ public class TrainHatArmorLayer @Override public void render(PoseStack ms, MultiBufferSource buffer, int light, LivingEntity entity, float yaw, float pitch, float pt, float p_225628_8_, float p_225628_9_, float p_225628_10_) { - if (!shouldRenderOn(entity)) + PartialModel hat = EntityHats.getHatFor(entity); + if (hat == null) return; M entityModel = getParentModel(); @@ -124,7 +118,7 @@ public class TrainHatArmorLayer ms.translate(0, -2.25f / 16f, 0); msr.rotateX(-8.5f); BlockState air = Blocks.AIR.defaultBlockState(); - CachedBufferer.partial(AllPartialModels.TRAIN_HAT, air) + CachedBufferer.partial(hat, air) .forEntityRender() .light(light) .renderInto(ms, buffer.getBuffer(renderType)); @@ -133,34 +127,6 @@ public class TrainHatArmorLayer ms.popPose(); } - private boolean shouldRenderOn(LivingEntity entity) { - if (entity == null) - return false; - if (entity.getPersistentData() - .contains("TrainHat")) - return true; - if (!entity.isPassenger()) - return false; - if (entity instanceof Player p) { - ItemStack headItem = p.getItemBySlot(EquipmentSlot.HEAD); - if (!headItem.isEmpty()) - return false; - } - Entity vehicle = entity.getVehicle(); - if (!(vehicle instanceof CarriageContraptionEntity cce)) - return false; - if (!cce.hasSchedule() && !(entity instanceof Player)) - return false; - Contraption contraption = cce.getContraption(); - if (!(contraption instanceof CarriageContraption cc)) - return false; - BlockPos seatOf = cc.getSeatOf(entity.getUUID()); - if (seatOf == null) - return false; - Couple validSides = cc.conductorSeats.get(seatOf); - return validSides != null; - } - public static void registerOnAll(EntityRenderDispatcher renderManager) { for (EntityRenderer renderer : renderManager.getSkinMap() .values()) @@ -180,8 +146,8 @@ public class TrainHatArmorLayer return; Vec3 offset = TrainHatOffsets.getOffset(model); - TrainHatArmorLayer layer = new TrainHatArmorLayer<>(livingRenderer, offset); - livingRenderer.addLayer((TrainHatArmorLayer) layer); + CreateHatArmorLayer layer = new CreateHatArmorLayer<>(livingRenderer, offset); + livingRenderer.addLayer((CreateHatArmorLayer) layer); } private static ModelPart getHeadPart(AgeableListModel model) { diff --git a/src/main/java/com/simibubi/create/content/equipment/hats/EntityHats.java b/src/main/java/com/simibubi/create/content/equipment/hats/EntityHats.java new file mode 100644 index 0000000000..930d8f4a58 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/equipment/hats/EntityHats.java @@ -0,0 +1,91 @@ +package com.simibubi.create.content.equipment.hats; + +import javax.annotation.Nullable; + +import com.jozufozu.flywheel.core.PartialModel; +import com.simibubi.create.AllPartialModels; +import com.simibubi.create.content.contraptions.Contraption; +import com.simibubi.create.content.contraptions.actors.seat.SeatEntity; +import com.simibubi.create.content.logistics.stockTicker.LogisticalWorkstationBlock; +import com.simibubi.create.content.trains.entity.CarriageContraption; +import com.simibubi.create.content.trains.entity.CarriageContraptionEntity; +import com.simibubi.create.foundation.utility.Couple; +import com.simibubi.create.foundation.utility.Iterate; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; + +// TODO: Behavioural Registry? +public class EntityHats { + + @Nullable + public static PartialModel getHatFor(LivingEntity entity) { + if (entity == null) + return null; + ItemStack headItem = entity.getItemBySlot(EquipmentSlot.HEAD); + if (!headItem.isEmpty()) + return null; + + if (shouldRenderTrainHat(entity)) + return AllPartialModels.TRAIN_HAT; + + return getLogisticsHatFor(entity); + } + + public static PartialModel getLogisticsHatFor(LivingEntity entity) { + if (!entity.isPassenger()) + return null; + if (!(entity.getVehicle() instanceof SeatEntity cce)) + return null; + + int stations = 0; + Level level = entity.level(); + BlockPos pos = entity.blockPosition(); + PartialModel hat = null; + + for (Direction d : Iterate.horizontalDirections) { + for (int y : Iterate.zeroAndOne) { + if (!(level.getBlockState(pos.relative(d) + .above(y)) + .getBlock() instanceof LogisticalWorkstationBlock lw)) + continue; + PartialModel hatOfStation = lw.getHat(level, pos, entity); + if (hatOfStation == null) + continue; + hat = hatOfStation; + stations++; + } + } + + if (stations == 1) + return hat; + + return null; + } + + public static boolean shouldRenderTrainHat(LivingEntity entity) { + if (entity.getPersistentData() + .contains("TrainHat")) + return true; + if (!entity.isPassenger()) + return false; + if (!(entity.getVehicle() instanceof CarriageContraptionEntity cce)) + return false; + if (!cce.hasSchedule() && !(entity instanceof Player)) + return false; + Contraption contraption = cce.getContraption(); + if (!(contraption instanceof CarriageContraption cc)) + return false; + BlockPos seatOf = cc.getSeatOf(entity.getUUID()); + if (seatOf == null) + return false; + Couple validSides = cc.conductorSeats.get(seatOf); + return validSides != null; + } + +} diff --git a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltBlock.java b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltBlock.java index 8ce7e831d0..8af4a473fd 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltBlock.java @@ -24,9 +24,9 @@ import com.simibubi.create.content.kinetics.belt.BeltSlicer.Feedback; import com.simibubi.create.content.kinetics.belt.behaviour.TransportedItemStackHandlerBehaviour.TransportedResult; import com.simibubi.create.content.kinetics.belt.transport.BeltMovementHandler.TransportedEntityInfo; import com.simibubi.create.content.kinetics.belt.transport.BeltTunnelInteractionHandler; +import com.simibubi.create.content.logistics.box.PackageEntity; +import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.content.logistics.funnel.FunnelBlock; -import com.simibubi.create.content.logistics.item.box.PackageEntity; -import com.simibubi.create.content.logistics.item.box.PackageItem; import com.simibubi.create.content.logistics.tunnel.BeltTunnelBlock; import com.simibubi.create.content.schematics.requirement.ISpecialBlockItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement; diff --git a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltRenderer.java b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltRenderer.java index 7bff9dc192..f02b6f7f59 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltRenderer.java +++ b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltRenderer.java @@ -15,7 +15,7 @@ import com.simibubi.create.AllSpriteShifts; import com.simibubi.create.content.kinetics.base.KineticBlockEntityRenderer; import com.simibubi.create.content.kinetics.belt.transport.BeltInventory; import com.simibubi.create.content.kinetics.belt.transport.TransportedItemStack; -import com.simibubi.create.content.logistics.item.box.PackageItem; +import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.foundation.block.render.SpriteShiftEntry; import com.simibubi.create.foundation.blockEntity.renderer.SafeBlockEntityRenderer; import com.simibubi.create.foundation.render.CachedBufferer; diff --git a/src/main/java/com/simibubi/create/content/kinetics/belt/transport/BeltInventory.java b/src/main/java/com/simibubi/create/content/kinetics/belt/transport/BeltInventory.java index 950a58ae93..28732929ee 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/belt/transport/BeltInventory.java +++ b/src/main/java/com/simibubi/create/content/kinetics/belt/transport/BeltInventory.java @@ -28,6 +28,7 @@ import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; +import net.minecraft.util.Mth; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; @@ -179,8 +180,9 @@ public class BeltInventory { // Apply Movement currentItem.beltPosition += limitedMovement; - currentItem.sideOffset += - (currentItem.getTargetSideOffset() - currentItem.sideOffset) * Math.abs(limitedMovement) * 6f; + float diffToMiddle = currentItem.getTargetSideOffset() - currentItem.sideOffset; + currentItem.sideOffset += Mth.clamp(diffToMiddle * Math.abs(limitedMovement) * 6f, -Math.abs(diffToMiddle), + Math.abs(diffToMiddle)); currentPos = currentItem.beltPosition; // Movement successful diff --git a/src/main/java/com/simibubi/create/content/kinetics/belt/transport/TransportedItemStack.java b/src/main/java/com/simibubi/create/content/kinetics/belt/transport/TransportedItemStack.java index 069a72e193..6f454c6f90 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/belt/transport/TransportedItemStack.java +++ b/src/main/java/com/simibubi/create/content/kinetics/belt/transport/TransportedItemStack.java @@ -4,7 +4,7 @@ import java.util.Random; import com.simibubi.create.content.kinetics.belt.BeltHelper; import com.simibubi.create.content.kinetics.fan.processing.FanProcessingType; -import com.simibubi.create.content.logistics.item.box.PackageItem; +import com.simibubi.create.content.logistics.box.PackageItem; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/logistics/item/box/PackageDestroyPacket.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageDestroyPacket.java similarity index 96% rename from src/main/java/com/simibubi/create/content/logistics/item/box/PackageDestroyPacket.java rename to src/main/java/com/simibubi/create/content/logistics/box/PackageDestroyPacket.java index 3086fa0e4f..f58813c6b0 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/box/PackageDestroyPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageDestroyPacket.java @@ -1,4 +1,4 @@ -package com.simibubi.create.content.logistics.item.box; +package com.simibubi.create.content.logistics.box; import com.simibubi.create.Create; import com.simibubi.create.foundation.networking.SimplePacketBase; diff --git a/src/main/java/com/simibubi/create/content/logistics/item/box/PackageEntity.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java similarity index 99% rename from src/main/java/com/simibubi/create/content/logistics/item/box/PackageEntity.java rename to src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java index 50454d59d1..b891f59be5 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/box/PackageEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java @@ -1,4 +1,4 @@ -package com.simibubi.create.content.logistics.item.box; +package com.simibubi.create.content.logistics.box; import java.util.Collections; import java.util.List; diff --git a/src/main/java/com/simibubi/create/content/logistics/item/box/PackageItem.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java similarity index 99% rename from src/main/java/com/simibubi/create/content/logistics/item/box/PackageItem.java rename to src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java index 92c62cd2f5..97cbb31c86 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/box/PackageItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java @@ -1,4 +1,4 @@ -package com.simibubi.create.content.logistics.item.box; +package com.simibubi.create.content.logistics.box; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/com/simibubi/create/content/logistics/item/box/PackageRenderer.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageRenderer.java similarity index 96% rename from src/main/java/com/simibubi/create/content/logistics/item/box/PackageRenderer.java rename to src/main/java/com/simibubi/create/content/logistics/box/PackageRenderer.java index 77742c8f5e..77a964d985 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/box/PackageRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageRenderer.java @@ -1,4 +1,4 @@ -package com.simibubi.create.content.logistics.item.box; +package com.simibubi.create.content.logistics.box; import com.jozufozu.flywheel.core.PartialModel; import com.mojang.blaze3d.vertex.PoseStack; diff --git a/src/main/java/com/simibubi/create/content/logistics/chute/AbstractChuteBlock.java b/src/main/java/com/simibubi/create/content/logistics/chute/AbstractChuteBlock.java index 46ba299809..3730061bb6 100644 --- a/src/main/java/com/simibubi/create/content/logistics/chute/AbstractChuteBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/chute/AbstractChuteBlock.java @@ -6,7 +6,7 @@ import javax.annotation.Nullable; import com.simibubi.create.content.equipment.wrench.IWrenchable; import com.simibubi.create.content.kinetics.belt.behaviour.DirectBeltInputBehaviour; -import com.simibubi.create.content.logistics.item.box.PackageEntity; +import com.simibubi.create.content.logistics.box.PackageEntity; import com.simibubi.create.foundation.advancement.AdvancementBehaviour; import com.simibubi.create.foundation.block.IBE; import com.simibubi.create.foundation.block.render.ReducedDestroyEffects; diff --git a/src/main/java/com/simibubi/create/content/logistics/chute/ChuteRenderer.java b/src/main/java/com/simibubi/create/content/logistics/chute/ChuteRenderer.java index 4d8a703aa0..cced817423 100644 --- a/src/main/java/com/simibubi/create/content/logistics/chute/ChuteRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/chute/ChuteRenderer.java @@ -2,8 +2,8 @@ package com.simibubi.create.content.logistics.chute; import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.content.logistics.chute.ChuteBlock.Shape; -import com.simibubi.create.content.logistics.item.box.PackageItem; import com.simibubi.create.foundation.blockEntity.renderer.SafeBlockEntityRenderer; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/simibubi/create/content/logistics/depot/DepotRenderer.java b/src/main/java/com/simibubi/create/content/logistics/depot/DepotRenderer.java index 432a52a6d2..26e803576c 100644 --- a/src/main/java/com/simibubi/create/content/logistics/depot/DepotRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/depot/DepotRenderer.java @@ -7,7 +7,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Axis; import com.simibubi.create.content.kinetics.belt.BeltHelper; import com.simibubi.create.content.kinetics.belt.transport.TransportedItemStack; -import com.simibubi.create.content.logistics.item.box.PackageItem; +import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.renderer.SafeBlockEntityRenderer; import com.simibubi.create.foundation.utility.VecHelper; diff --git a/src/main/java/com/simibubi/create/content/logistics/depot/EjectorBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/depot/EjectorBlockEntity.java index 2b613d2a67..fe535d10cb 100644 --- a/src/main/java/com/simibubi/create/content/logistics/depot/EjectorBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/depot/EjectorBlockEntity.java @@ -13,9 +13,9 @@ import com.simibubi.create.AllPackets; import com.simibubi.create.content.kinetics.base.KineticBlockEntity; import com.simibubi.create.content.kinetics.belt.behaviour.DirectBeltInputBehaviour; import com.simibubi.create.content.kinetics.belt.transport.TransportedItemStack; +import com.simibubi.create.content.logistics.box.PackageEntity; import com.simibubi.create.content.logistics.funnel.AbstractFunnelBlock; import com.simibubi.create.content.logistics.funnel.FunnelBlock; -import com.simibubi.create.content.logistics.item.box.PackageEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform; import com.simibubi.create.foundation.blockEntity.behaviour.scrollValue.ScrollValueBehaviour; diff --git a/src/main/java/com/simibubi/create/content/logistics/depot/EjectorRenderer.java b/src/main/java/com/simibubi/create/content/logistics/depot/EjectorRenderer.java index 5dbb0b150c..bf787d1944 100644 --- a/src/main/java/com/simibubi/create/content/logistics/depot/EjectorRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/depot/EjectorRenderer.java @@ -9,7 +9,7 @@ import com.mojang.blaze3d.vertex.VertexConsumer; import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.kinetics.base.KineticBlockEntity; import com.simibubi.create.content.kinetics.base.ShaftRenderer; -import com.simibubi.create.content.logistics.item.box.PackageItem; +import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.AngleHelper; diff --git a/src/main/java/com/simibubi/create/content/logistics/depot/SharedDepotBlockMethods.java b/src/main/java/com/simibubi/create/content/logistics/depot/SharedDepotBlockMethods.java index 1361e0f2c0..a702735acf 100644 --- a/src/main/java/com/simibubi/create/content/logistics/depot/SharedDepotBlockMethods.java +++ b/src/main/java/com/simibubi/create/content/logistics/depot/SharedDepotBlockMethods.java @@ -5,7 +5,7 @@ import com.simibubi.create.AllSoundEvents; import com.simibubi.create.Create; import com.simibubi.create.content.kinetics.belt.behaviour.DirectBeltInputBehaviour; import com.simibubi.create.content.kinetics.belt.transport.TransportedItemStack; -import com.simibubi.create.content.logistics.item.box.PackageEntity; +import com.simibubi.create.content.logistics.box.PackageEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import com.simibubi.create.foundation.item.ItemHelper; import com.simibubi.create.foundation.utility.VecHelper; diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/FilterItemStack.java b/src/main/java/com/simibubi/create/content/logistics/filter/FilterItemStack.java index ccef212bd0..86ad1bd419 100644 --- a/src/main/java/com/simibubi/create/content/logistics/filter/FilterItemStack.java +++ b/src/main/java/com/simibubi/create/content/logistics/filter/FilterItemStack.java @@ -5,7 +5,7 @@ import java.util.List; import com.simibubi.create.AllItems; import com.simibubi.create.content.fluids.transfer.GenericItemEmptying; -import com.simibubi.create.content.logistics.item.box.PackageItem; +import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.foundation.utility.Pair; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelBlock.java index 9e186bf3d5..a34a0d1f97 100644 --- a/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelBlock.java @@ -3,7 +3,7 @@ package com.simibubi.create.content.logistics.funnel; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.AllShapes; -import com.simibubi.create.content.logistics.item.box.PackageEntity; +import com.simibubi.create.content.logistics.box.PackageEntity; import com.simibubi.create.foundation.advancement.AdvancementBehaviour; import com.simibubi.create.foundation.block.ProperWaterloggedBlock; import com.simibubi.create.foundation.item.ItemHelper; diff --git a/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelBlockEntity.java index 92028233d6..6c172efbef 100644 --- a/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelBlockEntity.java @@ -14,8 +14,8 @@ import com.simibubi.create.content.kinetics.belt.BeltBlockEntity; import com.simibubi.create.content.kinetics.belt.BeltHelper; import com.simibubi.create.content.kinetics.belt.behaviour.DirectBeltInputBehaviour; import com.simibubi.create.content.kinetics.belt.transport.TransportedItemStack; +import com.simibubi.create.content.logistics.box.PackageEntity; import com.simibubi.create.content.logistics.funnel.BeltFunnelBlock.Shape; -import com.simibubi.create.content.logistics.item.box.PackageEntity; import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; diff --git a/src/main/java/com/simibubi/create/content/logistics/logisticalLink/LogisticalLinkBlock.java b/src/main/java/com/simibubi/create/content/logistics/logisticalLink/LogisticalLinkBlock.java new file mode 100644 index 0000000000..67af2f6cc9 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/logisticalLink/LogisticalLinkBlock.java @@ -0,0 +1,99 @@ +package com.simibubi.create.content.logistics.logisticalLink; + +import com.simibubi.create.AllBlockEntityTypes; +import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllShapes; +import com.simibubi.create.foundation.block.IBE; +import com.simibubi.create.foundation.block.WrenchableDirectionalBlock; +import com.simibubi.create.foundation.utility.Iterate; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition.Builder; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.pathfinder.PathComputationType; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; + +public class LogisticalLinkBlock extends WrenchableDirectionalBlock implements IBE { + + public static final BooleanProperty POWERED = BlockStateProperties.POWERED; + + public LogisticalLinkBlock(Properties properties) { + super(properties); + registerDefaultState(defaultBlockState().setValue(POWERED, false)); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext context) { + BlockPos pos = context.getClickedPos(); + Direction face = context.getClickedFace(); + BlockState placed = super.getStateForPlacement(context).setValue(FACING, face); + BlockState placedOn = context.getLevel() + .getBlockState(pos.relative(face.getOpposite())); + if (!AllBlocks.PACKAGER.has(placedOn)) + return null; + return placed.setValue(POWERED, shouldBePowered(placed, context.getLevel(), pos)); + } + + @Override + public void neighborChanged(BlockState state, Level worldIn, BlockPos pos, Block blockIn, BlockPos fromPos, + boolean isMoving) { + if (worldIn.isClientSide) + return; + + boolean powered = shouldBePowered(state, worldIn, pos); + boolean previouslyPowered = state.getValue(POWERED); + if (previouslyPowered != powered) { + worldIn.setBlock(pos, state.cycle(POWERED), 2); + if (!powered) + withBlockEntityDo(worldIn, pos, LogisticalLinkBlockEntity::onNoLongerPowered); + } + } + + private boolean shouldBePowered(BlockState state, Level worldIn, BlockPos pos) { + boolean powered = false; + for (Direction d : Iterate.directions) { + if (d.getOpposite() == state.getValue(FACING)) + continue; + if (worldIn.getSignal(pos.relative(d), d) == 0) + continue; + powered = true; + break; + } + return powered; + } + + @Override + public VoxelShape getShape(BlockState pState, BlockGetter pLevel, BlockPos pPos, CollisionContext pContext) { + return AllShapes.DATA_GATHERER.get(pState.getValue(FACING)); + } + + @Override + protected void createBlockStateDefinition(Builder builder) { + super.createBlockStateDefinition(builder.add(POWERED)); + } + + @Override + public boolean isPathfindable(BlockState pState, BlockGetter pLevel, BlockPos pPos, PathComputationType pType) { + return false; + } + + @Override + public Class getBlockEntityClass() { + return LogisticalLinkBlockEntity.class; + } + + @Override + public BlockEntityType getBlockEntityType() { + return AllBlockEntityTypes.LOGISTICAL_LINK.get(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/logisticalLink/LogisticalLinkBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/logisticalLink/LogisticalLinkBlockEntity.java new file mode 100644 index 0000000000..3c717e70a8 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/logisticalLink/LogisticalLinkBlockEntity.java @@ -0,0 +1,118 @@ +package com.simibubi.create.content.logistics.logisticalLink; + +import java.lang.ref.WeakReference; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +import javax.annotation.Nullable; + +import com.simibubi.create.content.logistics.packager.InventorySummary; +import com.simibubi.create.content.logistics.packager.PackagerBlockEntity; +import com.simibubi.create.content.logistics.stockTicker.LogisticalWorkstationBlockEntity; +import com.simibubi.create.content.redstone.displayLink.LinkWithBulbBlockEntity; +import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; + +public class LogisticalLinkBlockEntity extends LinkWithBulbBlockEntity { + + public static final AtomicInteger linkIdGenerator = new AtomicInteger(); + + public int linkId; + + protected BlockPos targetOffset; + + private WeakReference target; + + public LogisticalLinkBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { + super(type, pos, state); + targetOffset = BlockPos.ZERO; + linkId = linkIdGenerator.getAndIncrement(); + setLazyTickRate(10); + } + + public InventorySummary fetchSummaryFromPackager() { + BlockState blockState = getBlockState(); + if (blockState.getOptionalValue(LogisticalLinkBlock.POWERED) + .orElse(true)) + return InventorySummary.EMPTY; + BlockPos source = worldPosition.relative(blockState.getOptionalValue(LogisticalLinkBlock.FACING) + .orElse(Direction.UP) + .getOpposite()); + if (!(level.getBlockEntity(source) instanceof PackagerBlockEntity packager)) + return InventorySummary.EMPTY; + sendPulseNextSync(); + sendData(); + return packager.getAvailableItems(); + } + + @Override + public void addBehaviours(List behaviours) {} + + public void onNoLongerPowered() {} + + @Override + public void initialize() { + super.initialize(); + } + + @Override + public void lazyTick() { + if (level.isClientSide()) + return; + LogisticalWorkstationBlockEntity target = getTarget(); + if (target != null) + target.keepConnected(this); + } + + @Nullable + public LogisticalWorkstationBlockEntity getTarget() { + if (target != null) { + LogisticalWorkstationBlockEntity workstationBlockEntity = target.get(); + if (workstationBlockEntity != null && !workstationBlockEntity.isRemoved() + && !workstationBlockEntity.isChunkUnloaded()) + return workstationBlockEntity; + target = null; + } + BlockPos targetPos = worldPosition.offset(targetOffset); + if (level.isLoaded(targetPos) + && level.getBlockEntity(targetPos) instanceof LogisticalWorkstationBlockEntity lwbe) { + target = new WeakReference(lwbe); + return lwbe; + } + return null; + } + + @Override + public void tick() { + super.tick(); + } + + @Override + public void writeSafe(CompoundTag tag) { + super.writeSafe(tag); + writeOffset(tag); + } + + @Override + protected void write(CompoundTag tag, boolean clientPacket) { + super.write(tag, clientPacket); + writeOffset(tag); + } + + private void writeOffset(CompoundTag tag) { + tag.put("TargetOffset", NbtUtils.writeBlockPos(targetOffset)); + } + + @Override + protected void read(CompoundTag tag, boolean clientPacket) { + super.read(tag, clientPacket); + targetOffset = NbtUtils.readBlockPos(tag.getCompound("TargetOffset")); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/logisticalLink/LogisticalLinkBlockItem.java b/src/main/java/com/simibubi/create/content/logistics/logisticalLink/LogisticalLinkBlockItem.java new file mode 100644 index 0000000000..23a80fb965 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/logisticalLink/LogisticalLinkBlockItem.java @@ -0,0 +1,33 @@ +package com.simibubi.create.content.logistics.logisticalLink; + +import com.simibubi.create.content.logistics.stockTicker.LogisticalWorkstationBlock; +import com.simibubi.create.content.redstone.displayLink.ClickToLinkBlockItem; +import com.simibubi.create.infrastructure.config.AllConfigs; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; + +public class LogisticalLinkBlockItem extends ClickToLinkBlockItem { + + public LogisticalLinkBlockItem(Block pBlock, Properties pProperties) { + super(pBlock, pProperties); + } + + @Override + public boolean isValidTarget(LevelAccessor level, BlockPos pos) { + return level.getBlockState(pos) + .getBlock() instanceof LogisticalWorkstationBlock; + } + + @Override + public int getMaxDistanceFromSelection() { + return AllConfigs.server().logistics.logisticalLinkRange.get(); + } + + @Override + public String getMessageTranslationKey() { + return "logistical_link"; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/InventorySummary.java b/src/main/java/com/simibubi/create/content/logistics/packager/InventorySummary.java new file mode 100644 index 0000000000..175d547708 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/packager/InventorySummary.java @@ -0,0 +1,100 @@ +package com.simibubi.create.content.logistics.packager; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.IdentityHashMap; +import java.util.List; +import java.util.Map; + +import com.google.common.collect.Lists; +import com.simibubi.create.AllPackets; +import com.simibubi.create.content.logistics.stockTicker.LogisticalStockResponsePacket; +import com.simibubi.create.foundation.utility.IntAttached; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.items.ItemHandlerHelper; +import net.minecraftforge.network.PacketDistributor; +import net.minecraftforge.network.PacketDistributor.PacketTarget; + +public class InventorySummary { + + public static final InventorySummary EMPTY = new InventorySummary(); + + private Map>> items = new IdentityHashMap<>(); + private List> stacksByCount; + + public void add(InventorySummary summary) { + summary.items.forEach((i, list) -> list.forEach(this::add)); + } + + public void add(ItemStack stack) { + add(stack, stack.getCount()); + } + + public void add(IntAttached entry) { + add(entry.getSecond(), entry.getFirst()); + } + + public void add(ItemStack stack, int count) { + if (count == 0 || stack.isEmpty()) + return; + + List> stacks = items.computeIfAbsent(stack.getItem(), $ -> Lists.newArrayList()); + for (IntAttached existing : stacks) { + ItemStack existingStack = existing.getSecond(); + if (ItemHandlerHelper.canItemStacksStack(existingStack, stack)) { + existing.setFirst(existing.getFirst() + count); + return; + } + } + + IntAttached newEntry = IntAttached.with(count, stack); + stacks.add(newEntry); + } + + public List> getStacksByCount() { + if (stacksByCount == null) { + stacksByCount = new ArrayList<>(); + items.forEach((i, list) -> list.forEach(stacksByCount::add)); + Collections.sort(stacksByCount, IntAttached.comparator()); + } + return stacksByCount; + } + + public void divideAndSendTo(ServerPlayer player, BlockPos pos) { + List> stacks = getStacksByCount(); + int remaining = stacks.size(); + + List> currentList = null; + PacketTarget target = PacketDistributor.PLAYER.with(() -> player); + + if (stacks.isEmpty()) + AllPackets.getChannel() + .send(target, new LogisticalStockResponsePacket(true, pos, Collections.emptyList())); + + for (IntAttached entry : stacks) { + if (currentList == null) + currentList = new ArrayList<>(Math.min(100, remaining)); + + currentList.add(entry); + remaining--; + + if (remaining == 0) + break; + if (currentList.size() < 100) + continue; + + AllPackets.getChannel() + .send(target, new LogisticalStockResponsePacket(false, pos, currentList)); + currentList = null; + } + + if (currentList != null) + AllPackets.getChannel() + .send(target, new LogisticalStockResponsePacket(true, pos, currentList)); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/packager/PackagerBlock.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java similarity index 98% rename from src/main/java/com/simibubi/create/content/logistics/block/packager/PackagerBlock.java rename to src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java index 739e0cc6e1..f0ffb8bf7d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/packager/PackagerBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java @@ -1,4 +1,4 @@ -package com.simibubi.create.content.logistics.block.packager; +package com.simibubi.create.content.logistics.packager; import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllItems; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/packager/PackagerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java similarity index 89% rename from src/main/java/com/simibubi/create/content/logistics/block/packager/PackagerBlockEntity.java rename to src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java index 8f9d498016..10a38f7596 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/packager/PackagerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java @@ -1,13 +1,14 @@ -package com.simibubi.create.content.logistics.block.packager; +package com.simibubi.create.content.logistics.packager; import java.util.List; +import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.content.logistics.crate.BottomlessItemHandler; -import com.simibubi.create.content.logistics.item.box.PackageItem; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import com.simibubi.create.foundation.blockEntity.behaviour.inventory.CapManipulationBehaviourBase.InterfaceProvider; import com.simibubi.create.foundation.blockEntity.behaviour.inventory.InvManipulationBehaviour; +import com.simibubi.create.foundation.blockEntity.behaviour.inventory.VersionedInventoryTrackerBehaviour; import com.simibubi.create.foundation.item.ItemHelper; import com.simibubi.create.foundation.utility.NBTHelper; @@ -43,6 +44,9 @@ public class PackagerBlockEntity extends SmartBlockEntity { public static final int CYCLE = 30; public int animationTicks; public boolean animationInward; + + private InventorySummary availableItems; + private VersionedInventoryTrackerBehaviour invVersionTracker; public PackagerBlockEntity(BlockEntityType typeIn, BlockPos pos, BlockState state) { super(typeIn, pos, state); @@ -60,6 +64,7 @@ public class PackagerBlockEntity extends SmartBlockEntity { @Override public void addBehaviours(List behaviours) { behaviours.add(targetInventory = new InvManipulationBehaviour(this, InterfaceProvider.oppositeOfBlockFacing())); + behaviours.add(invVersionTracker = new VersionedInventoryTrackerBehaviour(this)); } @Override @@ -71,6 +76,22 @@ public class PackagerBlockEntity extends SmartBlockEntity { } animationTicks--; } + + public InventorySummary getAvailableItems() { + if (availableItems != null && invVersionTracker.stillWaiting(targetInventory.getInventory())) + return availableItems; + availableItems = new InventorySummary(); + + IItemHandler targetInv = targetInventory.getInventory(); + if (targetInv == null) + return availableItems; + + for (int slot = 0; slot < targetInv.getSlots(); slot++) + availableItems.add(targetInv.getStackInSlot(slot)); + + invVersionTracker.awaitNewVersion(targetInventory.getInventory()); + return availableItems; + } @Override public void lazyTick() { diff --git a/src/main/java/com/simibubi/create/content/logistics/block/packager/PackagerItemHandler.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerItemHandler.java similarity index 92% rename from src/main/java/com/simibubi/create/content/logistics/block/packager/PackagerItemHandler.java rename to src/main/java/com/simibubi/create/content/logistics/packager/PackagerItemHandler.java index e372978a1a..95f7bd0e0e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/packager/PackagerItemHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerItemHandler.java @@ -1,6 +1,6 @@ -package com.simibubi.create.content.logistics.block.packager; +package com.simibubi.create.content.logistics.packager; -import com.simibubi.create.content.logistics.item.box.PackageItem; +import com.simibubi.create.content.logistics.box.PackageItem; import net.minecraft.world.item.ItemStack; import net.minecraftforge.items.IItemHandlerModifiable; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/packager/PackagerRenderer.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerRenderer.java similarity index 97% rename from src/main/java/com/simibubi/create/content/logistics/block/packager/PackagerRenderer.java rename to src/main/java/com/simibubi/create/content/logistics/packager/PackagerRenderer.java index a0af4b0f17..b4750e21dd 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/packager/PackagerRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerRenderer.java @@ -1,4 +1,4 @@ -package com.simibubi.create.content.logistics.block.packager; +package com.simibubi.create.content.logistics.packager; import com.jozufozu.flywheel.core.PartialModel; import com.jozufozu.flywheel.util.transform.TransformStack; diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalStockRequestPacket.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalStockRequestPacket.java new file mode 100644 index 0000000000..7a11206f73 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalStockRequestPacket.java @@ -0,0 +1,34 @@ +package com.simibubi.create.content.logistics.stockTicker; + +import com.simibubi.create.foundation.networking.BlockEntityConfigurationPacket; + +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.level.ServerPlayer; + +public class LogisticalStockRequestPacket extends BlockEntityConfigurationPacket { + + public LogisticalStockRequestPacket(BlockPos pos) { + super(pos); + } + + public LogisticalStockRequestPacket(FriendlyByteBuf buffer) { + super(buffer); + } + + @Override + protected void writeSettings(FriendlyByteBuf buffer) {} + + @Override + protected void readSettings(FriendlyByteBuf buffer) {} + + @Override + protected void applySettings(LogisticalWorkstationBlockEntity be) {} + + @Override + protected void applySettings(ServerPlayer player, LogisticalWorkstationBlockEntity be) { + be.getRecentSummary() + .divideAndSendTo(player, pos); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalStockResponsePacket.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalStockResponsePacket.java new file mode 100644 index 0000000000..591ffe26ba --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalStockResponsePacket.java @@ -0,0 +1,61 @@ +package com.simibubi.create.content.logistics.stockTicker; + +import java.util.ArrayList; +import java.util.List; + +import com.simibubi.create.foundation.networking.SimplePacketBase; +import com.simibubi.create.foundation.utility.IntAttached; + +import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.network.NetworkEvent.Context; + +public class LogisticalStockResponsePacket extends SimplePacketBase { + + private BlockPos pos; + private List> items; + private boolean lastPacket; + + public LogisticalStockResponsePacket(boolean lastPacket, BlockPos pos, List> items) { + this.lastPacket = lastPacket; + this.pos = pos; + this.items = items; + } + + public LogisticalStockResponsePacket(FriendlyByteBuf buffer) { + lastPacket = buffer.readBoolean(); + pos = buffer.readBlockPos(); + int count = buffer.readVarInt(); + items = new ArrayList<>(count); + for (int i = 0; i < count; i++) + items.add(IntAttached.with(buffer.readVarInt(), buffer.readItem())); + } + + @Override + public void write(FriendlyByteBuf buffer) { + buffer.writeBoolean(lastPacket); + buffer.writeBlockPos(pos); + buffer.writeVarInt(items.size()); + for (IntAttached entry : items) { + buffer.writeVarInt(entry.getFirst()); + buffer.writeItem(entry.getSecond()); + } + } + + @Override + public boolean handle(Context context) { + handleClient(); + return true; + } + + @OnlyIn(Dist.CLIENT) + public void handleClient() { + if (Minecraft.getInstance().level.getBlockEntity(pos) instanceof StockTickerBlockEntity stbe) + stbe.receiveStockPacket(items, lastPacket); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalWorkstationBlock.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalWorkstationBlock.java new file mode 100644 index 0000000000..8bc5919633 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalWorkstationBlock.java @@ -0,0 +1,19 @@ +package com.simibubi.create.content.logistics.stockTicker; + +import javax.annotation.Nullable; + +import com.jozufozu.flywheel.core.PartialModel; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.level.LevelAccessor; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +public interface LogisticalWorkstationBlock { + + @Nullable + @OnlyIn(Dist.CLIENT) + public PartialModel getHat(LevelAccessor level, BlockPos pos, LivingEntity keeper); + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalWorkstationBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalWorkstationBlockEntity.java new file mode 100644 index 0000000000..df7d77c188 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalWorkstationBlockEntity.java @@ -0,0 +1,82 @@ +package com.simibubi.create.content.logistics.stockTicker; + +import java.lang.ref.WeakReference; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import com.simibubi.create.content.logistics.logisticalLink.LogisticalLinkBlockEntity; +import com.simibubi.create.content.logistics.packager.InventorySummary; +import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; +import com.simibubi.create.foundation.utility.IntAttached; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; + +public abstract class LogisticalWorkstationBlockEntity extends SmartBlockEntity { + + private Map>> connectedLinks = new HashMap<>(); + private InventorySummary summaryOfLinks; + private int ticksSinceLastSummary; + + public LogisticalWorkstationBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { + super(type, pos, state); + setLazyTickRate(10); + ticksSinceLastSummary = 15; + } + + @Override + public void tick() { + super.tick(); + if (level.isClientSide()) + return; + if (ticksSinceLastSummary < 15) + ticksSinceLastSummary++; + } + + public InventorySummary getRecentSummary() { + if (summaryOfLinks == null || ticksSinceLastSummary >= 15) + refreshInventorySummary(); + return summaryOfLinks; + } + + protected void refreshInventorySummary() { + ticksSinceLastSummary = 0; + summaryOfLinks = new InventorySummary(); + connectedLinks.forEach(($, entry) -> { + LogisticalLinkBlockEntity link = entry.getSecond() + .get(); + if (link != null && !link.isRemoved() && !link.isChunkUnloaded()) + summaryOfLinks.add(link.fetchSummaryFromPackager()); + }); + } + + @Override + public void lazyTick() { + if (level.isClientSide()) + return; + for (Iterator iterator = connectedLinks.keySet() + .iterator(); iterator.hasNext();) { + Integer id = iterator.next(); + IntAttached> entry = connectedLinks.get(id); + entry.decrement(); + if (entry.isOrBelowZero()) { + iterator.remove(); + continue; + } + LogisticalLinkBlockEntity link = entry.getSecond() + .get(); + if (link == null || link.isRemoved() || link.isChunkUnloaded()) { + iterator.remove(); + continue; + } + } + } + + public void keepConnected(LogisticalLinkBlockEntity link) { + connectedLinks.computeIfAbsent(link.linkId, $ -> IntAttached.withZero(new WeakReference<>(link))) + .setFirst(3); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlock.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlock.java new file mode 100644 index 0000000000..39c0c74fed --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlock.java @@ -0,0 +1,55 @@ +package com.simibubi.create.content.logistics.stockTicker; + +import com.jozufozu.flywheel.core.PartialModel; +import com.simibubi.create.AllBlockEntityTypes; +import com.simibubi.create.AllPartialModels; +import com.simibubi.create.AllShapes; +import com.simibubi.create.foundation.block.IBE; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.HorizontalDirectionalBlock; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition.Builder; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +public class StockTickerBlock extends HorizontalDirectionalBlock implements LogisticalWorkstationBlock, IBE { + + public StockTickerBlock(Properties pProperties) { + super(pProperties); + } + + @Override + protected void createBlockStateDefinition(Builder pBuilder) { + super.createBlockStateDefinition(pBuilder.add(FACING)); + } + + @Override + public VoxelShape getShape(BlockState pState, BlockGetter pLevel, BlockPos pPos, CollisionContext pContext) { + return AllShapes.STOCK_TICKER; + } + + @Override + @OnlyIn(Dist.CLIENT) + public PartialModel getHat(LevelAccessor level, BlockPos pos, LivingEntity keeper) { + return AllPartialModels.LOGISTICS_HAT; + } + + @Override + public Class getBlockEntityClass() { + return StockTickerBlockEntity.class; + } + + @Override + public BlockEntityType getBlockEntityType() { + return AllBlockEntityTypes.STOCK_TICKER.get(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java new file mode 100644 index 0000000000..5400861237 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java @@ -0,0 +1,46 @@ +package com.simibubi.create.content.logistics.stockTicker; + +import java.util.ArrayList; +import java.util.List; + +import com.simibubi.create.AllPackets; +import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; +import com.simibubi.create.foundation.utility.IntAttached; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; + +public class StockTickerBlockEntity extends LogisticalWorkstationBlockEntity { + + protected List> lastClientsideStockSnapshot; + protected List> newlyReceivedStockSnapshot; + + public StockTickerBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { + super(type, pos, state); + } + + @Override + public void addBehaviours(List behaviours) {} + + public void refreshClientStockSnapshot() { + AllPackets.getChannel() + .sendToServer(new LogisticalStockRequestPacket(worldPosition)); + } + + public List> getClientStockSnapshot() { + return lastClientsideStockSnapshot; + } + + public void receiveStockPacket(List> stacks, boolean endOfTransmission) { + if (newlyReceivedStockSnapshot == null) + newlyReceivedStockSnapshot = new ArrayList<>(); + newlyReceivedStockSnapshot.addAll(stacks); + if (!endOfTransmission) + return; + lastClientsideStockSnapshot = newlyReceivedStockSnapshot; + newlyReceivedStockSnapshot = null; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java new file mode 100644 index 0000000000..f4dd687a8e --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java @@ -0,0 +1,74 @@ +package com.simibubi.create.content.logistics.stockTicker; + +import com.simibubi.create.content.contraptions.actors.seat.SeatEntity; +import com.simibubi.create.foundation.gui.ScreenOpener; +import com.simibubi.create.foundation.utility.Iterate; + +import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.event.entity.player.PlayerInteractEvent.EntityInteractSpecific; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.DistExecutor; +import net.minecraftforge.fml.common.Mod.EventBusSubscriber; + +@EventBusSubscriber +public class StockTickerInteractionHandler { + + @SubscribeEvent + public static void interactWithLogisticsManager(EntityInteractSpecific event) { + Entity entity = event.getTarget(); + Player player = event.getEntity(); + if (player == null || entity == null) + return; + if (player.isSpectator()) + return; + Entity rootVehicle = entity.getRootVehicle(); + if (!(rootVehicle instanceof SeatEntity)) + return; + if (!(entity instanceof LivingEntity living)) + return; + + BlockPos pos = entity.blockPosition(); + int stations = 0; + Level level = event.getLevel(); + BlockPos targetPos = null; + + for (Direction d : Iterate.horizontalDirections) { + for (int y : Iterate.zeroAndOne) { + BlockPos workstationPos = pos.relative(d) + .above(y); + if (!(level.getBlockState(workstationPos) + .getBlock() instanceof LogisticalWorkstationBlock lw)) + continue; + targetPos = workstationPos; + stations++; + } + } + + if (stations != 1) + return; + + final BlockPos posForUI = targetPos; + if (level.isClientSide()) + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> displayScreen(posForUI)); + + event.setCancellationResult(InteractionResult.SUCCESS); + event.setCanceled(true); + return; + } + + @OnlyIn(Dist.CLIENT) + private static void displayScreen(BlockPos tickerPos) { + if (Minecraft.getInstance().level.getBlockEntity(tickerPos) instanceof StockTickerBlockEntity be) + ScreenOpener.open(new StockTickerRequestScreen(be)); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java new file mode 100644 index 0000000000..3ed1477d4c --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java @@ -0,0 +1,194 @@ +package com.simibubi.create.content.logistics.stockTicker; + +import java.util.List; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.foundation.gui.AbstractSimiScreen; +import com.simibubi.create.foundation.gui.element.GuiGameElement; +import com.simibubi.create.foundation.utility.Color; +import com.simibubi.create.foundation.utility.IntAttached; +import com.simibubi.create.foundation.utility.Iterate; +import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.animation.LerpedFloat; +import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; + +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.util.Mth; +import net.minecraft.world.item.ItemStack; + +public class StockTickerRequestScreen extends AbstractSimiScreen { + + private StockTickerBlockEntity blockEntity; + + private int ticksSinceLastUpdate = 0; + + private LerpedFloat itemScroll = LerpedFloat.linear() + .startWithValue(0); + + public StockTickerRequestScreen(StockTickerBlockEntity be) { + super(be.getBlockState() + .getBlock() + .getName()); + this.blockEntity = be; + be.lastClientsideStockSnapshot = null; + ticksSinceLastUpdate = 15; + } + + @Override + public void tick() { + super.tick(); + + itemScroll.tickChaser(); + if (Math.abs(itemScroll.getValue() - itemScroll.getChaseTarget()) < 1 / 16f) + itemScroll.setValue(itemScroll.getChaseTarget()); + + if (ticksSinceLastUpdate < 15) { + ticksSinceLastUpdate++; + return; + } + ticksSinceLastUpdate = 0; + blockEntity.refreshClientStockSnapshot(); + } + + @Override + public boolean mouseScrolled(double mouseX, double mouseY, double delta) { + List> items = blockEntity.getClientStockSnapshot(); + int size = items == null ? 0 : items.size(); + + int rows = 8; + int cols = 8; + + float newTarget = itemScroll.getChaseTarget() + (int) Math.signum(-delta); + newTarget = Mth.clamp(newTarget, 0, Math.max(0, Mth.ceil(size / (1.0 * cols)) - rows)); + itemScroll.chase(newTarget, 0.5, Chaser.EXP); + + return true; + } + + @Override + protected void init() { + setWindowSize(256, 256); + super.init(); + } + + private int getHoveredSlot(int x, int y) { + List> items = blockEntity.getClientStockSnapshot(); + + int rows = 8; + int cols = 8; + int rowHeight = 18; + int colWidth = 26; + int itemsX = guiLeft + (windowWidth - cols * colWidth) / 2; + int itemsY = guiTop + 45; + + if (items == null) + return -1; + if (x < itemsX || x >= itemsX + cols * colWidth) + return -1; + if (y < itemsY || y >= itemsY + rows * rowHeight) + return -1; + if (!itemScroll.settled()) + return -1; + int row = (y - itemsY) / rowHeight + (int) itemScroll.getChaseTarget(); + int col = (x - itemsX) / colWidth; + int slot = row * cols + col; + if (items.size() <= slot) + return -1; + return slot; + } + + @Override + protected void renderWindow(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + List> items = blockEntity.getClientStockSnapshot(); + PoseStack ms = graphics.pose(); + + int rows = 8; + int cols = 8; + int rowHeight = 18; + int colWidth = 26; + int x = guiLeft + (windowWidth - cols * colWidth) / 2; + int y = guiTop + 45; + + float currentScroll = itemScroll.getValue(minecraft.getDeltaFrameTime()); + int startRow = Math.max(0, Mth.floor(currentScroll) - 1); + + ms.pushPose(); + ms.translate(0, -currentScroll * rowHeight, 0); + int hoveredSlot = getHoveredSlot(mouseX, mouseY); + + if (items == null) { + return; + } + + for (int row = startRow; row < startRow + rows + 2; row++) { + float scale = 1; + if (row < currentScroll) + scale = Mth.clamp(1 - (currentScroll - row), 0, 1); + if (row > currentScroll + (rows - 1)) + scale = Mth.clamp((currentScroll + rows) - row, 0, 1); + scale *= scale; + if (scale < 0.1) + continue; + + for (int col = 0; col < cols; col++) { + int index = row * cols + col; + if (items.size() <= index) + break; + ms.pushPose(); + ms.translate(x + col * colWidth, y + row * rowHeight, 0); + float scaleFromHover = 1; + ms.translate(0, 0, 200); + + IntAttached entry = items.get(index); + int count = entry.getFirst(); + if (count > 1) { + String text = count >= 1000000 ? (count / 1000000) + "m" + : count >= 10000 ? (count / 1000) + "k" + : count >= 1000 ? ((count * 10) / 1000) / 10f + "k" : count >= 100 ? count + "" : " " + count; + for (int xi : Iterate.positiveAndNegative) + graphics.drawString(font, Lang.text(text) + .component(), 11 + xi, 10, xi < 0 ? 0x555555 : 0x333333, false); + for (int yi : Iterate.positiveAndNegative) + graphics.drawString(font, Lang.text(text) + .component(), 11, 10 + yi, yi < 0 ? 0x555555 : 0x333333, false); + graphics.drawString(font, Lang.text(text) + .component(), 11, 10, 0xffffff, false); + } + + ms.translate(0, 0, -200); + + if (index == hoveredSlot) { + Color color2 = new Color(255, 255, 255, 50); + ms.translate(-.5f, -.5f, 0); + graphics.renderOutline(0, 0, colWidth - 1, rowHeight - 1, color2.getRGB()); + ms.translate(.5f, .5f, 0); + scaleFromHover += .05f; + } + + ms.translate((colWidth - 18) / 2.0, (rowHeight - 18) / 2.0, 0); + ms.translate(18 / 2.0, 18 / 2.0, 0); + ms.scale(scale, scale, scale); + ms.scale(scaleFromHover, scaleFromHover, scaleFromHover); + ms.translate(-18 / 2.0, -18 / 2.0, 0); + GuiGameElement.of(entry.getSecond()) + .render(graphics); + ms.popPose(); + } + } + + ms.popPose(); + + int totalHeight = rows * rowHeight; + int allRows = Mth.ceil(items.size() / (1.0 * cols)); + int barSize = Mth.floor(1f * totalHeight * rows / allRows); + if (barSize < totalHeight) { + ms.pushPose(); + ms.translate(0, currentScroll * (totalHeight - barSize) / Math.max(1, allRows - rows), 0); + Color color = new Color(255, 255, 255, 50); + graphics.renderOutline(x + cols * colWidth + 3, y, 1, barSize, color.getRGB()); + ms.popPose(); + } + + } + +} diff --git a/src/main/java/com/simibubi/create/content/redstone/displayLink/ClickToLinkBlockItem.java b/src/main/java/com/simibubi/create/content/redstone/displayLink/ClickToLinkBlockItem.java new file mode 100644 index 0000000000..2464a08321 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/redstone/displayLink/ClickToLinkBlockItem.java @@ -0,0 +1,161 @@ +package com.simibubi.create.content.redstone.displayLink; + +import com.simibubi.create.AllSoundEvents; +import com.simibubi.create.CreateClient; +import com.simibubi.create.foundation.utility.Lang; + +import net.minecraft.ChatFormatting; +import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.shapes.VoxelShape; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.event.entity.player.PlayerInteractEvent; +import net.minecraftforge.eventbus.api.Event.Result; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod.EventBusSubscriber; + +@EventBusSubscriber +public abstract class ClickToLinkBlockItem extends BlockItem { + + public ClickToLinkBlockItem(Block pBlock, Properties pProperties) { + super(pBlock, pProperties); + } + + @SubscribeEvent + public static void linkableItemAlwaysPlacesWhenUsed(PlayerInteractEvent.RightClickBlock event) { + ItemStack usedItem = event.getItemStack(); + if (!(usedItem.getItem() instanceof ClickToLinkBlockItem blockItem)) + return; + if (event.getLevel() + .getBlockState(event.getPos()) + .is(blockItem.getBlock())) + return; + event.setUseBlock(Result.DENY); + } + + @Override + public InteractionResult useOn(UseOnContext pContext) { + ItemStack stack = pContext.getItemInHand(); + BlockPos pos = pContext.getClickedPos(); + Level level = pContext.getLevel(); + BlockState state = level.getBlockState(pos); + Player player = pContext.getPlayer(); + String msgKey = getMessageTranslationKey(); + int maxDistance = getMaxDistanceFromSelection(); + + if (player == null) + return InteractionResult.FAIL; + + if (player.isShiftKeyDown() && stack.hasTag()) { + if (level.isClientSide) + return InteractionResult.SUCCESS; + player.displayClientMessage(Lang.translateDirect(msgKey + ".clear"), true); + stack.setTag(null); + return InteractionResult.SUCCESS; + } + + if (!stack.hasTag()) { + if (!isValidTarget(level, pos)) { + if (level.isClientSide) + AllSoundEvents.DENY.playFrom(player); + player.displayClientMessage(Lang.translateDirect(msgKey + ".invalid"), true); + return InteractionResult.FAIL; + } + + if (level.isClientSide) + return InteractionResult.SUCCESS; + CompoundTag stackTag = stack.getOrCreateTag(); + stackTag.put("SelectedPos", NbtUtils.writeBlockPos(pos)); + player.displayClientMessage(Lang.translateDirect(msgKey + ".set"), true); + stack.setTag(stackTag); + return InteractionResult.SUCCESS; + } + + CompoundTag tag = stack.getTag(); + CompoundTag teTag = new CompoundTag(); + + BlockPos selectedPos = NbtUtils.readBlockPos(tag.getCompound("SelectedPos")); + BlockPos placedPos = pos.relative(pContext.getClickedFace(), state.canBeReplaced() ? 0 : 1); + + if (!selectedPos.closerThan(placedPos, maxDistance)) { + player.displayClientMessage(Lang.translateDirect(msgKey + ".too_far") + .withStyle(ChatFormatting.RED), true); + return InteractionResult.FAIL; + } + + teTag.put("TargetOffset", NbtUtils.writeBlockPos(selectedPos.subtract(placedPos))); + tag.put("BlockEntityTag", teTag); + + InteractionResult useOn = super.useOn(pContext); + if (level.isClientSide || useOn == InteractionResult.FAIL) + return useOn; + + ItemStack itemInHand = player.getItemInHand(pContext.getHand()); + if (!itemInHand.isEmpty()) + itemInHand.setTag(null); + player.displayClientMessage(Lang.translateDirect(msgKey + ".success") + .withStyle(ChatFormatting.GREEN), true); + return useOn; + } + + private static BlockPos lastShownPos = null; + private static AABB lastShownAABB = null; + + @OnlyIn(Dist.CLIENT) + public static void clientTick() { + Player player = Minecraft.getInstance().player; + if (player == null) + return; + ItemStack heldItemMainhand = player.getMainHandItem(); + if (!(heldItemMainhand.getItem() instanceof ClickToLinkBlockItem blockItem)) + return; + if (!heldItemMainhand.hasTag()) + return; + CompoundTag stackTag = heldItemMainhand.getOrCreateTag(); + if (!stackTag.contains("SelectedPos")) + return; + + BlockPos selectedPos = NbtUtils.readBlockPos(stackTag.getCompound("SelectedPos")); + + if (!selectedPos.equals(lastShownPos)) { + lastShownAABB = blockItem.getSelectionBounds(selectedPos); + lastShownPos = selectedPos; + } + + CreateClient.OUTLINER.showAABB("target", lastShownAABB) + .colored(0xffcb74) + .lineWidth(1 / 16f); + } + + public abstract int getMaxDistanceFromSelection(); + + public abstract String getMessageTranslationKey(); + + public boolean isValidTarget(LevelAccessor level, BlockPos pos) { + return true; + } + + @OnlyIn(Dist.CLIENT) + public AABB getSelectionBounds(BlockPos pos) { + Level world = Minecraft.getInstance().level; + BlockState state = world.getBlockState(pos); + VoxelShape shape = state.getShape(world, pos); + return shape.isEmpty() ? new AABB(BlockPos.ZERO) + : shape.bounds() + .move(pos); + } + +} diff --git a/src/main/java/com/simibubi/create/content/redstone/displayLink/DisplayLinkBlockEntity.java b/src/main/java/com/simibubi/create/content/redstone/displayLink/DisplayLinkBlockEntity.java index 26771c9424..97abe38bc8 100644 --- a/src/main/java/com/simibubi/create/content/redstone/displayLink/DisplayLinkBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/redstone/displayLink/DisplayLinkBlockEntity.java @@ -10,11 +10,7 @@ import com.simibubi.create.compat.computercraft.ComputerCraftProxy; import com.simibubi.create.content.redstone.displayLink.source.DisplaySource; import com.simibubi.create.content.redstone.displayLink.target.DisplayTarget; import com.simibubi.create.foundation.advancement.AllAdvancements; -import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; -import com.simibubi.create.foundation.utility.NBTHelper; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; -import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -26,7 +22,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.LazyOptional; -public class DisplayLinkBlockEntity extends SmartBlockEntity { +public class DisplayLinkBlockEntity extends LinkWithBulbBlockEntity { protected BlockPos targetOffset; @@ -36,9 +32,6 @@ public class DisplayLinkBlockEntity extends SmartBlockEntity { public DisplayTarget activeTarget; public int targetLine; - public LerpedFloat glow; - private boolean sendPulse; - public int refreshTicks; public AbstractComputerBehaviour computerBehaviour; @@ -47,9 +40,6 @@ public class DisplayLinkBlockEntity extends SmartBlockEntity { targetOffset = BlockPos.ZERO; sourceConfig = new CompoundTag(); targetLine = 0; - glow = LerpedFloat.linear() - .startWithValue(0); - glow.chase(0, 0.5f, Chaser.EXP); } @Override @@ -62,17 +52,12 @@ public class DisplayLinkBlockEntity extends SmartBlockEntity { public void tick() { super.tick(); - if (isVirtual()) { - glow.tickChaser(); + if (isVirtual()) return; - } - if (activeSource == null) return; - if (level.isClientSide) { - glow.tickChaser(); + if (level.isClientSide) return; - } refreshTicks++; if (refreshTicks < activeSource.getPassiveRefreshTicks() || !activeSource.shouldPassiveReset()) @@ -126,7 +111,7 @@ public class DisplayLinkBlockEntity extends SmartBlockEntity { DisplayLinkContext context = new DisplayLinkContext(level, this); activeSource.transferData(context, activeTarget, targetLine); - sendPulse = true; + sendPulseNextSync(); sendData(); award(AllAdvancements.DISPLAY_LINK); @@ -144,10 +129,6 @@ public class DisplayLinkBlockEntity extends SmartBlockEntity { writeGatheredData(tag); if (clientPacket && activeTarget != null) tag.putString("TargetType", activeTarget.id.toString()); - if (clientPacket && sendPulse) { - sendPulse = false; - NBTHelper.putMarker(tag, "Pulse"); - } } private void writeGatheredData(CompoundTag tag) { @@ -169,9 +150,6 @@ public class DisplayLinkBlockEntity extends SmartBlockEntity { if (clientPacket && tag.contains("TargetType")) activeTarget = AllDisplayBehaviours.getTarget(new ResourceLocation(tag.getString("TargetType"))); - if (clientPacket && tag.contains("Pulse")) - glow.setValue(2); - if (!tag.contains("Source")) return; diff --git a/src/main/java/com/simibubi/create/content/redstone/displayLink/DisplayLinkBlockItem.java b/src/main/java/com/simibubi/create/content/redstone/displayLink/DisplayLinkBlockItem.java index 50d24a8ff7..a17cad3019 100644 --- a/src/main/java/com/simibubi/create/content/redstone/displayLink/DisplayLinkBlockItem.java +++ b/src/main/java/com/simibubi/create/content/redstone/displayLink/DisplayLinkBlockItem.java @@ -1,149 +1,41 @@ package com.simibubi.create.content.redstone.displayLink; -import com.simibubi.create.AllBlocks; -import com.simibubi.create.CreateClient; import com.simibubi.create.content.redstone.displayLink.target.DisplayTarget; -import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.infrastructure.config.AllConfigs; -import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.NbtUtils; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.BlockItem; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; -import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.event.entity.player.PlayerInteractEvent; -import net.minecraftforge.eventbus.api.Event.Result; -import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; @EventBusSubscriber -public class DisplayLinkBlockItem extends BlockItem { +public class DisplayLinkBlockItem extends ClickToLinkBlockItem { public DisplayLinkBlockItem(Block pBlock, Properties pProperties) { super(pBlock, pProperties); } - @SubscribeEvent - public static void gathererItemAlwaysPlacesWhenUsed(PlayerInteractEvent.RightClickBlock event) { - ItemStack usedItem = event.getItemStack(); - if (usedItem.getItem() instanceof DisplayLinkBlockItem) { - if (AllBlocks.DISPLAY_LINK.has(event.getLevel() - .getBlockState(event.getPos()))) - return; - event.setUseBlock(Result.DENY); - } + @OnlyIn(Dist.CLIENT) + public AABB getSelectionBounds(BlockPos pos) { + Level world = Minecraft.getInstance().level; + DisplayTarget target = AllDisplayBehaviours.targetOf(world, pos); + if (target != null) + return target.getMultiblockBounds(world, pos); + return super.getSelectionBounds(pos); } @Override - public InteractionResult useOn(UseOnContext pContext) { - ItemStack stack = pContext.getItemInHand(); - BlockPos pos = pContext.getClickedPos(); - Level level = pContext.getLevel(); - BlockState state = level.getBlockState(pos); - Player player = pContext.getPlayer(); - - if (player == null) - return InteractionResult.FAIL; - - if (player.isShiftKeyDown() && stack.hasTag()) { - if (level.isClientSide) - return InteractionResult.SUCCESS; - player.displayClientMessage(Lang.translateDirect("display_link.clear"), true); - stack.setTag(null); - return InteractionResult.SUCCESS; - } - - if (!stack.hasTag()) { - if (level.isClientSide) - return InteractionResult.SUCCESS; - CompoundTag stackTag = stack.getOrCreateTag(); - stackTag.put("SelectedPos", NbtUtils.writeBlockPos(pos)); - player.displayClientMessage(Lang.translateDirect("display_link.set"), true); - stack.setTag(stackTag); - return InteractionResult.SUCCESS; - } - - CompoundTag tag = stack.getTag(); - CompoundTag teTag = new CompoundTag(); - - BlockPos selectedPos = NbtUtils.readBlockPos(tag.getCompound("SelectedPos")); - BlockPos placedPos = pos.relative(pContext.getClickedFace(), state.canBeReplaced() ? 0 : 1); - - if (!selectedPos.closerThan(placedPos, AllConfigs.server().logistics.displayLinkRange.get())) { - player.displayClientMessage(Lang.translateDirect("display_link.too_far") - .withStyle(ChatFormatting.RED), true); - return InteractionResult.FAIL; - } - - teTag.put("TargetOffset", NbtUtils.writeBlockPos(selectedPos.subtract(placedPos))); - tag.put("BlockEntityTag", teTag); - - InteractionResult useOn = super.useOn(pContext); - if (level.isClientSide || useOn == InteractionResult.FAIL) - return useOn; - - ItemStack itemInHand = player.getItemInHand(pContext.getHand()); - if (!itemInHand.isEmpty()) - itemInHand.setTag(null); - player.displayClientMessage(Lang.translateDirect("display_link.success") - .withStyle(ChatFormatting.GREEN), true); - return useOn; + public int getMaxDistanceFromSelection() { + return AllConfigs.server().logistics.displayLinkRange.get(); } - private static BlockPos lastShownPos = null; - private static AABB lastShownAABB = null; - - @OnlyIn(Dist.CLIENT) - public static void clientTick() { - Player player = Minecraft.getInstance().player; - if (player == null) - return; - ItemStack heldItemMainhand = player.getMainHandItem(); - if (!(heldItemMainhand.getItem() instanceof DisplayLinkBlockItem)) - return; - if (!heldItemMainhand.hasTag()) - return; - CompoundTag stackTag = heldItemMainhand.getOrCreateTag(); - if (!stackTag.contains("SelectedPos")) - return; - - BlockPos selectedPos = NbtUtils.readBlockPos(stackTag.getCompound("SelectedPos")); - - if (!selectedPos.equals(lastShownPos)) { - lastShownAABB = getBounds(selectedPos); - lastShownPos = selectedPos; - } - - CreateClient.OUTLINER.showAABB("target", lastShownAABB) - .colored(0xffcb74) - .lineWidth(1 / 16f); - } - - @OnlyIn(Dist.CLIENT) - private static AABB getBounds(BlockPos pos) { - Level world = Minecraft.getInstance().level; - DisplayTarget target = AllDisplayBehaviours.targetOf(world, pos); - - if (target != null) - return target.getMultiblockBounds(world, pos); - - BlockState state = world.getBlockState(pos); - VoxelShape shape = state.getShape(world, pos); - return shape.isEmpty() ? new AABB(BlockPos.ZERO) - : shape.bounds() - .move(pos); + @Override + public String getMessageTranslationKey() { + return "display_link"; } } diff --git a/src/main/java/com/simibubi/create/content/redstone/displayLink/DisplayLinkRenderer.java b/src/main/java/com/simibubi/create/content/redstone/displayLink/LinkBulbRenderer.java similarity index 85% rename from src/main/java/com/simibubi/create/content/redstone/displayLink/DisplayLinkRenderer.java rename to src/main/java/com/simibubi/create/content/redstone/displayLink/LinkBulbRenderer.java index c53bb68e8d..21cd200bde 100644 --- a/src/main/java/com/simibubi/create/content/redstone/displayLink/DisplayLinkRenderer.java +++ b/src/main/java/com/simibubi/create/content/redstone/displayLink/LinkBulbRenderer.java @@ -16,14 +16,14 @@ import net.minecraft.core.Direction; import net.minecraft.util.Mth; import net.minecraft.world.level.block.state.BlockState; -public class DisplayLinkRenderer extends SafeBlockEntityRenderer { +public class LinkBulbRenderer extends SafeBlockEntityRenderer { - public DisplayLinkRenderer(BlockEntityRendererProvider.Context context) {} + public LinkBulbRenderer(BlockEntityRendererProvider.Context context) {} @Override - protected void renderSafe(DisplayLinkBlockEntity be, float partialTicks, PoseStack ms, MultiBufferSource buffer, + protected void renderSafe(LinkWithBulbBlockEntity be, float partialTicks, PoseStack ms, MultiBufferSource buffer, int light, int overlay) { - float glow = be.glow.getValue(partialTicks); + float glow = be.getGlow(partialTicks); if (glow < .125f) return; diff --git a/src/main/java/com/simibubi/create/content/redstone/displayLink/LinkWithBulbBlockEntity.java b/src/main/java/com/simibubi/create/content/redstone/displayLink/LinkWithBulbBlockEntity.java new file mode 100644 index 0000000000..673c714317 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/redstone/displayLink/LinkWithBulbBlockEntity.java @@ -0,0 +1,60 @@ +package com.simibubi.create.content.redstone.displayLink; + +import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; +import com.simibubi.create.foundation.utility.NBTHelper; +import com.simibubi.create.foundation.utility.animation.LerpedFloat; +import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; + +public abstract class LinkWithBulbBlockEntity extends SmartBlockEntity { + + private LerpedFloat glow; + private boolean sendPulse; + + public LinkWithBulbBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { + super(type, pos, state); + glow = LerpedFloat.linear() + .startWithValue(0); + glow.chase(0, 0.5f, Chaser.EXP); + } + + @Override + public void tick() { + super.tick(); + if (isVirtual() || level.isClientSide()) + glow.tickChaser(); + } + + public float getGlow(float partialTicks) { + return glow.getValue(partialTicks); + } + + public void sendPulseNextSync() { + sendPulse = true; + } + + public void pulse() { + glow.setValue(2); + } + + @Override + protected void write(CompoundTag tag, boolean clientPacket) { + super.write(tag, clientPacket); + if (clientPacket && sendPulse) { + sendPulse = false; + NBTHelper.putMarker(tag, "Pulse"); + } + } + + @Override + protected void read(CompoundTag tag, boolean clientPacket) { + super.read(tag, clientPacket); + if (clientPacket && tag.contains("Pulse")) + pulse(); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java b/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java index 8c80c4f238..075127060f 100644 --- a/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java +++ b/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java @@ -36,7 +36,7 @@ import com.simibubi.create.content.kinetics.crank.ValveHandleBlock; import com.simibubi.create.content.kinetics.simpleRelays.encased.EncasedCogCTBehaviour; import com.simibubi.create.content.kinetics.simpleRelays.encased.EncasedCogwheelBlock; import com.simibubi.create.content.kinetics.simpleRelays.encased.EncasedShaftBlock; -import com.simibubi.create.content.logistics.item.box.PackageItem; +import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.content.logistics.tunnel.BeltTunnelBlock; import com.simibubi.create.content.logistics.tunnel.BeltTunnelBlock.Shape; import com.simibubi.create.content.logistics.tunnel.BeltTunnelItem; diff --git a/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java b/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java index c18d60f4fb..75c818ad9b 100644 --- a/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java @@ -23,6 +23,7 @@ import com.simibubi.create.content.equipment.blueprint.BlueprintOverlayRenderer; import com.simibubi.create.content.equipment.clipboard.ClipboardValueSettingsHandler; import com.simibubi.create.content.equipment.extendoGrip.ExtendoGripRenderHandler; import com.simibubi.create.content.equipment.goggles.GoggleOverlayRenderer; +import com.simibubi.create.content.equipment.hats.CreateHatArmorLayer; import com.simibubi.create.content.equipment.toolbox.ToolboxHandlerClient; import com.simibubi.create.content.equipment.zapper.ZapperItem; import com.simibubi.create.content.equipment.zapper.terrainzapper.WorldshaperRenderHandler; @@ -33,7 +34,7 @@ import com.simibubi.create.content.kinetics.mechanicalArm.ArmInteractionPointHan import com.simibubi.create.content.kinetics.turntable.TurntableHandler; import com.simibubi.create.content.logistics.depot.EjectorTargetHandler; import com.simibubi.create.content.processing.sequenced.SequencedAssemblyRecipe; -import com.simibubi.create.content.redstone.displayLink.DisplayLinkBlockItem; +import com.simibubi.create.content.redstone.displayLink.ClickToLinkBlockItem; import com.simibubi.create.content.redstone.link.LinkRenderer; import com.simibubi.create.content.redstone.link.controller.LinkedControllerClientHandler; import com.simibubi.create.content.trains.CameraDistanceModifier; @@ -41,7 +42,6 @@ import com.simibubi.create.content.trains.TrainHUD; import com.simibubi.create.content.trains.entity.CarriageContraptionEntity; import com.simibubi.create.content.trains.entity.CarriageCouplingRenderer; import com.simibubi.create.content.trains.entity.TrainRelocator; -import com.simibubi.create.content.trains.schedule.TrainHatArmorLayer; import com.simibubi.create.content.trains.track.CurvedTrackInteraction; import com.simibubi.create.content.trains.track.TrackBlockOutline; import com.simibubi.create.content.trains.track.TrackPlacement; @@ -162,7 +162,7 @@ public class ClientEvents { TrackTargetingClient.clientTick(); TrackPlacement.clientTick(); TrainRelocator.clientTick(); - DisplayLinkBlockItem.clientTick(); + ClickToLinkBlockItem.clientTick(); CurvedTrackInteraction.clientTick(); CameraDistanceModifier.tick(); CameraAngleAnimationService.tick(); @@ -340,7 +340,7 @@ public class ClientEvents { EntityRenderDispatcher dispatcher = Minecraft.getInstance() .getEntityRenderDispatcher(); BacktankArmorLayer.registerOnAll(dispatcher); - TrainHatArmorLayer.registerOnAll(dispatcher); + CreateHatArmorLayer.registerOnAll(dispatcher); } @SubscribeEvent diff --git a/src/main/java/com/simibubi/create/foundation/item/ItemHelper.java b/src/main/java/com/simibubi/create/foundation/item/ItemHelper.java index 237be16649..658826e16e 100644 --- a/src/main/java/com/simibubi/create/foundation/item/ItemHelper.java +++ b/src/main/java/com/simibubi/create/foundation/item/ItemHelper.java @@ -9,7 +9,7 @@ import javax.annotation.Nullable; import org.apache.commons.lang3.mutable.MutableInt; -import com.simibubi.create.content.logistics.item.box.PackageEntity; +import com.simibubi.create.content.logistics.box.PackageEntity; import com.simibubi.create.foundation.utility.Pair; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java index 8c0bf98267..61a2e8f200 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java @@ -26,7 +26,7 @@ import com.simibubi.create.content.kinetics.gauge.SpeedGaugeBlockEntity; import com.simibubi.create.content.kinetics.mechanicalArm.ArmBlockEntity; import com.simibubi.create.content.logistics.funnel.FunnelBlockEntity; import com.simibubi.create.content.processing.burner.BlazeBurnerBlockEntity; -import com.simibubi.create.content.redstone.displayLink.DisplayLinkBlockEntity; +import com.simibubi.create.content.redstone.displayLink.LinkWithBulbBlockEntity; import com.simibubi.create.content.trains.display.FlapDisplayBlockEntity; import com.simibubi.create.content.trains.signal.SignalBlockEntity; import com.simibubi.create.content.trains.signal.SignalBlockEntity.SignalState; @@ -899,8 +899,8 @@ public class SceneBuilder { } public void flashDisplayLink(BlockPos position) { - modifyBlockEntity(position, DisplayLinkBlockEntity.class, - linkBlockEntity -> linkBlockEntity.glow.setValue(2)); + modifyBlockEntity(position, LinkWithBulbBlockEntity.class, + linkBlockEntity -> linkBlockEntity.pulse()); } } diff --git a/src/main/java/com/simibubi/create/infrastructure/config/CLogistics.java b/src/main/java/com/simibubi/create/infrastructure/config/CLogistics.java index 3cff341ab2..572611526f 100644 --- a/src/main/java/com/simibubi/create/infrastructure/config/CLogistics.java +++ b/src/main/java/com/simibubi/create/infrastructure/config/CLogistics.java @@ -9,6 +9,7 @@ public class CLogistics extends ConfigBase { public final ConfigInt mechanicalArmRange = i(5, 1, "mechanicalArmRange", Comments.mechanicalArmRange); public final ConfigInt linkRange = i(256, 1, "linkRange", Comments.linkRange); public final ConfigInt displayLinkRange = i(64, 1, "displayLinkRange", Comments.displayLinkRange); + public final ConfigInt logisticalLinkRange = i(256, 1, "logisticalLinkRange", Comments.logisticalLinkRange); public final ConfigInt vaultCapacity = i(20, 1, "vaultCapacity", Comments.vaultCapacity); public final ConfigInt brassTunnelTimer = i(10, 1, 10, "brassTunnelTimer", Comments.brassTunnelTimer); public final ConfigBool seatHostileMobs = b(true, "seatHostileMobs", Comments.seatHostileMobs); @@ -23,7 +24,9 @@ public class CLogistics extends ConfigBase { "The amount of ticks a funnel waits between item transferrals, when it is not re-activated by redstone."; static String linkRange = "Maximum possible range in blocks of redstone link connections."; static String displayLinkRange = - "Maximum possible distance in blocks between data gatherers and their target."; + "Maximum possible distance in blocks between display links and their target."; + static String logisticalLinkRange = + "Maximum possible distance in blocks between logistical links and their target."; static String psiTimeout = "The amount of ticks a portable storage interface waits for transfers until letting contraptions move along."; static String mechanicalArmRange = "Maximum distance in blocks a Mechanical Arm can reach across."; diff --git a/src/main/resources/assets/create/lang/default/interface.json b/src/main/resources/assets/create/lang/default/interface.json index 127de5b202..13d3d354bb 100644 --- a/src/main/resources/assets/create/lang/default/interface.json +++ b/src/main/resources/assets/create/lang/default/interface.json @@ -885,6 +885,12 @@ "create.contraption.door_control.none.short": "None", "create.contraption.door_control.player_facing": "You are facing: %1$s", + "create.logistical_link.set": "Targeted workstation selected", + "create.logistical_link.success": "Successfully bound to logistical target", + "create.logistical_link.clear": "Cleared selection", + "create.logistical_link.too_far": "Targeted workstation is too far from here", + "create.logistical_link.invalid": "Assign a Stock Ticker or Cash Register before placing", + "create.display_link.set": "Targeted position selected", "create.display_link.success": "Successfully bound to targeted position", "create.display_link.clear": "Cleared position selection", diff --git a/src/main/resources/assets/create/models/block/display_link/block.json b/src/main/resources/assets/create/models/block/display_link/block.json index 70d6993d86..94b13ae24c 100644 --- a/src/main/resources/assets/create/models/block/display_link/block.json +++ b/src/main/resources/assets/create/models/block/display_link/block.json @@ -3,8 +3,6 @@ "loader": "forge:composite", "parent": "block/block", "textures": { - "0": "create:block/display_link", - "3": "create:block/display_link_side", "particle": "create:block/brass_casing" }, "children": { diff --git a/src/main/resources/assets/create/models/block/display_link/block_powered.json b/src/main/resources/assets/create/models/block/display_link/block_powered.json index 5deb185475..19922ca1a2 100644 --- a/src/main/resources/assets/create/models/block/display_link/block_powered.json +++ b/src/main/resources/assets/create/models/block/display_link/block_powered.json @@ -1,6 +1,123 @@ { - "parent": "create:block/display_link/block", + "credit": "Made with Blockbench", + "loader": "forge:composite", + "parent": "block/block", "textures": { - "3": "create:block/display_link_side_powered" + "particle": "create:block/brass_casing" + }, + "children": { + "base": { + "render_type": "minecraft:solid", + "textures": { + "0": "create:block/display_link", + "3": "create:block/display_link_side_powered" + }, + "elements": [ + { + "from": [9, 6, 3.5], + "to": [13, 9, 12.5], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "faces": { + "north": {"uv": [14.5, 0, 12.5, 1.5], "texture": "#0"}, + "east": {"uv": [14.5, 6, 16, 1.5], "rotation": 90, "texture": "#0"}, + "south": {"uv": [12.5, 0, 14.5, 1.5], "texture": "#0"}, + "west": {"uv": [14.5, 6, 16, 1.5], "rotation": 90, "texture": "#0"}, + "up": {"uv": [14.5, 1.5, 12.5, 6], "rotation": 180, "texture": "#0"} + } + }, + { + "from": [1, 1, 1], + "to": [15, 6, 15], + "faces": { + "north": {"uv": [0, 0, 14, 5], "texture": "#3"}, + "east": {"uv": [7.5, 9, 10, 16], "rotation": 90, "texture": "#0"}, + "south": {"uv": [0, 0, 14, 5], "texture": "#3"}, + "west": {"uv": [7.5, 9, 10, 16], "rotation": 90, "texture": "#0"}, + "up": {"uv": [0, 9, 7, 16], "texture": "#0"}, + "down": {"uv": [0, 1.5, 7, 8.5], "texture": "#0"} + } + }, + { + "from": [2, -1, 2], + "to": [14, 1, 14], + "faces": { + "north": {"uv": [0.5, 0, 6.5, 1], "texture": "#0"}, + "east": {"uv": [0.5, 0, 6.5, 1], "texture": "#0"}, + "south": {"uv": [0.5, 0, 6.5, 1], "texture": "#0"}, + "west": {"uv": [0.5, 0, 6.5, 1], "texture": "#0"}, + "down": {"uv": [0.5, 2, 6.5, 8], "texture": "#0"} + } + }, + { + "from": [3, 5, 3], + "to": [7, 7, 7], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "faces": { + "north": {"uv": [13.5, 10, 11.5, 11], "texture": "#0"}, + "east": {"uv": [13.5, 10, 11.5, 11], "texture": "#0"}, + "south": {"uv": [13.5, 10, 11.5, 11], "texture": "#0"}, + "west": {"uv": [13.5, 10, 11.5, 11], "texture": "#0"}, + "up": {"uv": [13.5, 8, 11.5, 10], "texture": "#0"} + } + }, + { + "from": [3, 6, 8], + "to": [7, 8, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "faces": { + "north": {"uv": [13.5, 8, 11.5, 9], "texture": "#0"}, + "east": {"uv": [13.5, 8, 11.5, 9], "texture": "#0"}, + "south": {"uv": [13.5, 8, 11.5, 9], "texture": "#0"}, + "west": {"uv": [13.5, 8, 11.5, 9], "texture": "#0"}, + "up": {"uv": [13.5, 6, 11.5, 8], "texture": "#0"} + } + } + ] + }, + "bulb_inner": { + "render_type": "minecraft:cutout", + "textures": { + "0": "create:block/display_link" + }, + "elements": [ + { + "from": [2.5, 8, 9], + "to": [7.5, 13, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [6, 7.5, 19]}, + "faces": { + "south": {"uv": [16, 13.5, 13.5, 16], "texture": "#0"} + } + }, + { + "from": [2.5, 8, 10], + "to": [7.5, 13, 11], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "faces": { + "north": {"uv": [16, 13.5, 13.5, 16], "texture": "#0"} + } + } + ] + }, + "bulb": { + "render_type": "minecraft:translucent", + "textures": { + "0": "create:block/display_link" + }, + "elements": [ + { + "from": [2.5, 8, 7.5], + "to": [7.5, 13, 12.5], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "faces": { + "north": {"uv": [16, 8.5, 13.5, 11], "texture": "#0"}, + "east": {"uv": [16, 8.5, 13.5, 11], "texture": "#0"}, + "south": {"uv": [16, 8.5, 13.5, 11], "texture": "#0"}, + "west": {"uv": [16, 8.5, 13.5, 11], "texture": "#0"}, + "up": {"uv": [16, 6, 13.5, 8.5], "texture": "#0"}, + "down": {"uv": [16, 11, 13.5, 13.5], "texture": "#0"} + } + } + ] + } } } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/logistical_link/block.json b/src/main/resources/assets/create/models/block/logistical_link/block.json new file mode 100644 index 0000000000..8f87eddbbe --- /dev/null +++ b/src/main/resources/assets/create/models/block/logistical_link/block.json @@ -0,0 +1,123 @@ +{ + "credit": "Made with Blockbench", + "loader": "forge:composite", + "parent": "block/block", + "textures": { + "particle": "create:block/vault/vault_front_small" + }, + "children": { + "base": { + "render_type": "minecraft:solid", + "textures": { + "0": "create:block/logistical_link", + "3": "create:block/logistical_link_side" + }, + "elements": [ + { + "from": [9, 6, 3.5], + "to": [13, 9, 12.5], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "faces": { + "north": {"uv": [14.5, 0, 12.5, 1.5], "texture": "#0"}, + "east": {"uv": [14.5, 6, 16, 1.5], "rotation": 90, "texture": "#0"}, + "south": {"uv": [12.5, 0, 14.5, 1.5], "texture": "#0"}, + "west": {"uv": [14.5, 6, 16, 1.5], "rotation": 90, "texture": "#0"}, + "up": {"uv": [14.5, 1.5, 12.5, 6], "rotation": 180, "texture": "#0"} + } + }, + { + "from": [1, 1, 1], + "to": [15, 6, 15], + "faces": { + "north": {"uv": [0, 0, 14, 5], "texture": "#3"}, + "east": {"uv": [7.5, 9, 10, 16], "rotation": 90, "texture": "#0"}, + "south": {"uv": [0, 0, 14, 5], "texture": "#3"}, + "west": {"uv": [7.5, 9, 10, 16], "rotation": 90, "texture": "#0"}, + "up": {"uv": [0, 9, 7, 16], "texture": "#0"}, + "down": {"uv": [0, 1.5, 7, 8.5], "texture": "#0"} + } + }, + { + "from": [2, -1, 2], + "to": [14, 1, 14], + "faces": { + "north": {"uv": [0.5, 0, 6.5, 1], "texture": "#0"}, + "east": {"uv": [0.5, 0, 6.5, 1], "texture": "#0"}, + "south": {"uv": [0.5, 0, 6.5, 1], "texture": "#0"}, + "west": {"uv": [0.5, 0, 6.5, 1], "texture": "#0"}, + "down": {"uv": [0.5, 2, 6.5, 8], "texture": "#0"} + } + }, + { + "from": [3, 5, 3], + "to": [7, 7, 7], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "faces": { + "north": {"uv": [13.5, 10, 11.5, 11], "texture": "#0"}, + "east": {"uv": [13.5, 10, 11.5, 11], "texture": "#0"}, + "south": {"uv": [13.5, 10, 11.5, 11], "texture": "#0"}, + "west": {"uv": [13.5, 10, 11.5, 11], "texture": "#0"}, + "up": {"uv": [13.5, 8, 11.5, 10], "texture": "#0"} + } + }, + { + "from": [3, 6, 8], + "to": [7, 8, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "faces": { + "north": {"uv": [13.5, 8, 11.5, 9], "texture": "#0"}, + "east": {"uv": [13.5, 8, 11.5, 9], "texture": "#0"}, + "south": {"uv": [13.5, 8, 11.5, 9], "texture": "#0"}, + "west": {"uv": [13.5, 8, 11.5, 9], "texture": "#0"}, + "up": {"uv": [13.5, 6, 11.5, 8], "texture": "#0"} + } + } + ] + }, + "bulb_inner": { + "render_type": "minecraft:cutout", + "textures": { + "0": "create:block/logistical_link" + }, + "elements": [ + { + "from": [2.5, 8, 9], + "to": [7.5, 13, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [6, 7.5, 19]}, + "faces": { + "south": {"uv": [16, 13.5, 13.5, 16], "texture": "#0"} + } + }, + { + "from": [2.5, 8, 10], + "to": [7.5, 13, 11], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "faces": { + "north": {"uv": [16, 13.5, 13.5, 16], "texture": "#0"} + } + } + ] + }, + "bulb": { + "render_type": "minecraft:translucent", + "textures": { + "0": "create:block/logistical_link" + }, + "elements": [ + { + "from": [2.5, 8, 7.5], + "to": [7.5, 13, 12.5], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "faces": { + "north": {"uv": [16, 8.5, 13.5, 11], "texture": "#0"}, + "east": {"uv": [16, 8.5, 13.5, 11], "texture": "#0"}, + "south": {"uv": [16, 8.5, 13.5, 11], "texture": "#0"}, + "west": {"uv": [16, 8.5, 13.5, 11], "texture": "#0"}, + "up": {"uv": [16, 6, 13.5, 8.5], "texture": "#0"}, + "down": {"uv": [16, 11, 13.5, 13.5], "texture": "#0"} + } + } + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/logistical_link/block_powered.json b/src/main/resources/assets/create/models/block/logistical_link/block_powered.json new file mode 100644 index 0000000000..e0b3f6ef0f --- /dev/null +++ b/src/main/resources/assets/create/models/block/logistical_link/block_powered.json @@ -0,0 +1,123 @@ +{ + "credit": "Made with Blockbench", + "loader": "forge:composite", + "parent": "block/block", + "textures": { + "particle": "create:block/vault/vault_front_small" + }, + "children": { + "base": { + "render_type": "minecraft:solid", + "textures": { + "0": "create:block/logistical_link", + "3": "create:block/logistical_link_side_powered" + }, + "elements": [ + { + "from": [9, 6, 3.5], + "to": [13, 9, 12.5], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "faces": { + "north": {"uv": [14.5, 0, 12.5, 1.5], "texture": "#0"}, + "east": {"uv": [14.5, 6, 16, 1.5], "rotation": 90, "texture": "#0"}, + "south": {"uv": [12.5, 0, 14.5, 1.5], "texture": "#0"}, + "west": {"uv": [14.5, 6, 16, 1.5], "rotation": 90, "texture": "#0"}, + "up": {"uv": [14.5, 1.5, 12.5, 6], "rotation": 180, "texture": "#0"} + } + }, + { + "from": [1, 1, 1], + "to": [15, 6, 15], + "faces": { + "north": {"uv": [0, 0, 14, 5], "texture": "#3"}, + "east": {"uv": [7.5, 9, 10, 16], "rotation": 90, "texture": "#0"}, + "south": {"uv": [0, 0, 14, 5], "texture": "#3"}, + "west": {"uv": [7.5, 9, 10, 16], "rotation": 90, "texture": "#0"}, + "up": {"uv": [0, 9, 7, 16], "texture": "#0"}, + "down": {"uv": [0, 1.5, 7, 8.5], "texture": "#0"} + } + }, + { + "from": [2, -1, 2], + "to": [14, 1, 14], + "faces": { + "north": {"uv": [0.5, 0, 6.5, 1], "texture": "#0"}, + "east": {"uv": [0.5, 0, 6.5, 1], "texture": "#0"}, + "south": {"uv": [0.5, 0, 6.5, 1], "texture": "#0"}, + "west": {"uv": [0.5, 0, 6.5, 1], "texture": "#0"}, + "down": {"uv": [0.5, 2, 6.5, 8], "texture": "#0"} + } + }, + { + "from": [3, 5, 3], + "to": [7, 7, 7], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "faces": { + "north": {"uv": [13.5, 10, 11.5, 11], "texture": "#0"}, + "east": {"uv": [13.5, 10, 11.5, 11], "texture": "#0"}, + "south": {"uv": [13.5, 10, 11.5, 11], "texture": "#0"}, + "west": {"uv": [13.5, 10, 11.5, 11], "texture": "#0"}, + "up": {"uv": [13.5, 8, 11.5, 10], "texture": "#0"} + } + }, + { + "from": [3, 6, 8], + "to": [7, 8, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "faces": { + "north": {"uv": [13.5, 8, 11.5, 9], "texture": "#0"}, + "east": {"uv": [13.5, 8, 11.5, 9], "texture": "#0"}, + "south": {"uv": [13.5, 8, 11.5, 9], "texture": "#0"}, + "west": {"uv": [13.5, 8, 11.5, 9], "texture": "#0"}, + "up": {"uv": [13.5, 6, 11.5, 8], "texture": "#0"} + } + } + ] + }, + "bulb_inner": { + "render_type": "minecraft:cutout", + "textures": { + "0": "create:block/logistical_link" + }, + "elements": [ + { + "from": [2.5, 8, 9], + "to": [7.5, 13, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [6, 7.5, 19]}, + "faces": { + "south": {"uv": [16, 13.5, 13.5, 16], "texture": "#0"} + } + }, + { + "from": [2.5, 8, 10], + "to": [7.5, 13, 11], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "faces": { + "north": {"uv": [16, 13.5, 13.5, 16], "texture": "#0"} + } + } + ] + }, + "bulb": { + "render_type": "minecraft:translucent", + "textures": { + "0": "create:block/logistical_link" + }, + "elements": [ + { + "from": [2.5, 8, 7.5], + "to": [7.5, 13, 12.5], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "faces": { + "north": {"uv": [16, 8.5, 13.5, 11], "texture": "#0"}, + "east": {"uv": [16, 8.5, 13.5, 11], "texture": "#0"}, + "south": {"uv": [16, 8.5, 13.5, 11], "texture": "#0"}, + "west": {"uv": [16, 8.5, 13.5, 11], "texture": "#0"}, + "up": {"uv": [16, 6, 13.5, 8.5], "texture": "#0"}, + "down": {"uv": [16, 11, 13.5, 13.5], "texture": "#0"} + } + } + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/stock_ticker.json b/src/main/resources/assets/create/models/block/stock_ticker.json new file mode 100644 index 0000000000..f0ab07bc05 --- /dev/null +++ b/src/main/resources/assets/create/models/block/stock_ticker.json @@ -0,0 +1,142 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "0": "create:block/stock_ticker", + "particle": "block/glass" + }, + "elements": [ + { + "from": [1, 0, 1], + "to": [15, 4, 15], + "faces": { + "north": {"uv": [8.5, 8, 15.5, 10], "texture": "#0"}, + "east": {"uv": [8.5, 8, 15.5, 10], "texture": "#0"}, + "south": {"uv": [8.5, 8, 15.5, 10], "texture": "#0"}, + "west": {"uv": [8.5, 8, 15.5, 10], "texture": "#0"}, + "up": {"uv": [8.5, 0.5, 15.5, 7.5], "texture": "#0"}, + "down": {"uv": [0.5, 8.5, 7.5, 15.5], "texture": "#0"} + } + }, + { + "from": [2, 4, 2], + "to": [14, 16, 14], + "faces": { + "north": {"uv": [10, 10, 16, 16], "texture": "#0"}, + "east": {"uv": [10, 10, 16, 16], "texture": "#0"}, + "south": {"uv": [10, 10, 16, 16], "texture": "#0"}, + "west": {"uv": [10, 10, 16, 16], "texture": "#0"}, + "up": {"uv": [10, 10, 16, 16], "rotation": 90, "texture": "#0"} + } + }, + { + "from": [6, 4, 3], + "to": [10, 11, 11], + "faces": { + "east": {"uv": [4, 0, 0, 3.5], "texture": "#0"}, + "west": {"uv": [0, 0, 4, 3.5], "texture": "#0"} + } + }, + { + "from": [10, 4, 3], + "to": [6, 11, 11], + "faces": { + "east": {"uv": [4, 0, 0, 3.5], "texture": "#0"}, + "west": {"uv": [0, 0, 4, 3.5], "texture": "#0"} + } + }, + { + "from": [5.5, 1, 0], + "to": [10.5, 4, 1], + "faces": { + "north": {"uv": [4, 1, 6.5, 2.5], "texture": "#0"}, + "east": {"uv": [4, 1, 4.5, 2.5], "texture": "#0"}, + "west": {"uv": [6, 1, 6.5, 2.5], "texture": "#0"}, + "up": {"uv": [4, 0.5, 6.5, 1], "texture": "#0"}, + "down": {"uv": [2.5, 3.5, 3, 4], "texture": "#0"} + } + }, + { + "from": [6.5, 7, 7], + "to": [9.5, 13, 13], + "faces": { + "north": {"uv": [4.5, 4.5, 6, 7.5], "texture": "#0"}, + "east": {"uv": [0.5, 4.5, 3.5, 7.5], "texture": "#0"}, + "south": {"uv": [4.5, 4.5, 6, 7.5], "texture": "#0"}, + "west": {"uv": [0.5, 4.5, 3.5, 7.5], "texture": "#0"}, + "up": {"uv": [4.5, 4.5, 6, 7.5], "texture": "#0"}, + "down": {"uv": [4.5, 4.5, 6, 7.5], "texture": "#0"} + } + }, + { + "from": [6.5, 4, 4], + "to": [9.5, 7, 7], + "faces": { + "north": {"uv": [4.5, 4.5, 6, 6], "texture": "#0"}, + "up": {"uv": [4.5, 4.5, 6, 6], "texture": "#0"} + } + }, + { + "from": [9.5, 7, 7], + "to": [6.5, 4, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [5, 14.5, 2.5]}, + "faces": { + "south": {"uv": [4.5, 4.5, 6, 6], "rotation": 180, "texture": "#0"}, + "down": {"uv": [4.5, 4.5, 6, 6], "texture": "#0"} + } + }, + { + "from": [6.5, -3.5, -0.1], + "to": [9.5, 2.5, 2.9], + "faces": { + "north": {"uv": [4.5, 4.5, 6, 7.5], "texture": "#0"}, + "up": {"uv": [4.5, 4.5, 6, 6], "texture": "#0"} + } + }, + { + "from": [9.5, 2.5, 2.9], + "to": [6.5, -3.5, -0.1], + "rotation": {"angle": 0, "axis": "y", "origin": [5, -13.75, -1.6]}, + "faces": { + "south": {"uv": [4.5, 4.5, 6, 7.5], "rotation": 180, "texture": "#0"}, + "down": {"uv": [4.5, 4.5, 6, 6], "texture": "#0"} + } + }, + { + "from": [5, 6.1, 4.1], + "to": [11, 6.9, 4.9], + "faces": { + "north": {"uv": [1.5, 3.5, 2, 4], "texture": "#0"}, + "east": {"uv": [1, 3.5, 1.5, 4], "texture": "#0"}, + "south": {"uv": [1.5, 3.5, 2, 4], "texture": "#0"}, + "west": {"uv": [1, 3.5, 1.5, 4], "texture": "#0"}, + "up": {"uv": [1, 3.5, 1.5, 4], "texture": "#0"}, + "down": {"uv": [2.5, 3.5, 3, 4], "texture": "#0"} + } + }, + { + "from": [5, 7.1, 6.1], + "to": [11, 7.9, 6.9], + "faces": { + "north": {"uv": [1.5, 3.5, 2, 4], "texture": "#0"}, + "east": {"uv": [1, 3.5, 1.5, 4], "texture": "#0"}, + "south": {"uv": [1.5, 3.5, 2, 4], "texture": "#0"}, + "west": {"uv": [1, 3.5, 1.5, 4], "texture": "#0"}, + "up": {"uv": [1, 3.5, 1.5, 4], "texture": "#0"}, + "down": {"uv": [2.5, 3.5, 3, 4], "texture": "#0"} + } + }, + { + "from": [5, 9.6, 9.6], + "to": [11, 10.4, 10.4], + "faces": { + "north": {"uv": [1.5, 3.5, 2, 4], "texture": "#0"}, + "east": {"uv": [1, 3.5, 1.5, 4], "texture": "#0"}, + "south": {"uv": [1.5, 3.5, 2, 4], "texture": "#0"}, + "west": {"uv": [1, 3.5, 1.5, 4], "texture": "#0"}, + "up": {"uv": [1, 3.5, 1.5, 4], "texture": "#0"}, + "down": {"uv": [2.5, 3.5, 3, 4], "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/entity/logistics_hat.json b/src/main/resources/assets/create/models/entity/logistics_hat.json new file mode 100644 index 0000000000..2fc5062932 --- /dev/null +++ b/src/main/resources/assets/create/models/entity/logistics_hat.json @@ -0,0 +1,7 @@ +{ + "parent": "create:entity/train_hat", + "textures": { + "0": "create:entity/logistics_hat", + "particle": "create:entity/logistics_hat" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/cardboard_package_10x12.json b/src/main/resources/assets/create/models/item/cardboard_package_10x12.json index 1764c61f2e..2c909f0368 100644 --- a/src/main/resources/assets/create/models/item/cardboard_package_10x12.json +++ b/src/main/resources/assets/create/models/item/cardboard_package_10x12.json @@ -2,8 +2,8 @@ "credit": "Made with Blockbench", "parent": "create:item/package_transforms", "textures": { - "0": "create:block/package/cardboard", - "particle": "create:block/package/cardboard_particle" + "0": "create:entity/package/cardboard", + "particle": "create:entity/package/cardboard_particle" }, "elements": [ { diff --git a/src/main/resources/assets/create/models/item/cardboard_package_10x8.json b/src/main/resources/assets/create/models/item/cardboard_package_10x8.json index 595d675ad8..fd38cbdbdc 100644 --- a/src/main/resources/assets/create/models/item/cardboard_package_10x8.json +++ b/src/main/resources/assets/create/models/item/cardboard_package_10x8.json @@ -2,8 +2,8 @@ "credit": "Made with Blockbench", "parent": "create:item/package_transforms", "textures": { - "0": "create:block/package/cardboard", - "particle": "create:block/package/cardboard_particle" + "0": "create:entity/package/cardboard", + "particle": "create:entity/package/cardboard_particle" }, "elements": [ { diff --git a/src/main/resources/assets/create/models/item/cardboard_package_12x10.json b/src/main/resources/assets/create/models/item/cardboard_package_12x10.json index e9e11661e3..a5253293f5 100644 --- a/src/main/resources/assets/create/models/item/cardboard_package_12x10.json +++ b/src/main/resources/assets/create/models/item/cardboard_package_12x10.json @@ -2,8 +2,8 @@ "credit": "Made with Blockbench", "parent": "create:item/package_transforms", "textures": { - "0": "create:block/package/cardboard", - "particle": "create:block/package/cardboard_particle" + "0": "create:entity/package/cardboard", + "particle": "create:entity/package/cardboard_particle" }, "elements": [ { diff --git a/src/main/resources/assets/create/models/item/cardboard_package_12x12.json b/src/main/resources/assets/create/models/item/cardboard_package_12x12.json index 3a542e91c5..c052f0582b 100644 --- a/src/main/resources/assets/create/models/item/cardboard_package_12x12.json +++ b/src/main/resources/assets/create/models/item/cardboard_package_12x12.json @@ -2,8 +2,8 @@ "credit": "Made with Blockbench", "parent": "create:item/package_transforms", "textures": { - "0": "create:block/package/cardboard", - "particle": "create:block/package/cardboard_particle" + "0": "create:entity/package/cardboard", + "particle": "create:entity/package/cardboard_particle" }, "elements": [ { diff --git a/src/main/resources/assets/create/textures/block/logistical_link.png b/src/main/resources/assets/create/textures/block/logistical_link.png new file mode 100644 index 0000000000000000000000000000000000000000..ace6a9a50dde9602280e60d39344a84c85c7bd2d GIT binary patch literal 1265 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1cpgOK~z{rwU=Fp z8&wp?&&C)_MsnwT5GpUS6U%!VY^+8vAgbUl1Va?&vE`YIpf_VCX*I_aB}aRoRj;% z=YCBTa@qIZUgz5rQxpt^(OgBjWY@}a(X|rYH@<}q95^K6{1V@@+v&TbpLz!av@)|y zqx-+{;#GXaqPL4iPhd@xX?jrD&4A87nJv-Vr^a}!i`De17E~+ zLu{yzqFW<0{?ZtYj1PNll*&U7?r`MJ_3&CzZ={q-Q>Bm>bxh0mKTP_bf>Y1$bOzSw zqHg9(qC^{Yu?s-E&H=vTOms`T40r-S#kPetf@jFUjly$2b?9RA8sPNHun<|0+8YoC zTE(=(cLu7(LcQirNiZmk!FTfa-Ox4z@;>Jg0(ta6{!WhZ1CMyq1JVE91%4M8c7oqs zaBSbh&X!n+t{Vn@wm~n6L{M5P9gT=AoS8i7UFDIr19WR-9W5FwboB6XZ%`-qKkjhnD4#iMol8l<Q>A-I@&@G zzml~&>Ey!*urFZoiR2P}{>5>^d!@``Chv(r-6^YDwWMgpENMMzkA}7oupt%`0pPi( zwu!RwBxGb?06{Ys=c#XSebYwQw9L9g;rT;oPwK02uLLV5Dmb)0JO?Nqu6s7eqMEOb&C)nuk22DzAP4SEY1jD zLPFIs&s>@^Ak#{WEEXWv@8z^Gc_!RwLV(O86B|UwFrEsTR$}p=(Y7+ag&h3&L+_eg zB>-tWdhEM;tMhaiY10+7L_43J5F%imc>kR}&MU9KrM&sti$a9TKf>Iy{?2->MxzM$ zB8I{Fk7xMT4C_QXWr)(q)qYoG06)SDh+jU~z}5LYrIu^|8{x~~T80>0PHdgvj#o_F bEkyqSLG8{T70KXl00000NkvXXu0mjfT^efe literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/logistical_link_side.png b/src/main/resources/assets/create/textures/block/logistical_link_side.png new file mode 100644 index 0000000000000000000000000000000000000000..6f4079a5a403ccdcff30c017a63ebaf6dd5f70d3 GIT binary patch literal 278 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}50G|+7M-P|a@IXroCr8HsTN@8k6Wf-iau<&%TSf+NM#eBkMgt~>%*-U9 za=s%^d_h!6kYDhBWWeBh;LZu43}=ByWHC^|VGw3Kp1&dmC>ZVO;uxY4y!4DC-(d$1 z=fGsAgtSM$Um2H#vkN+pXgnw5LS4-ixshfb-FnGH9xvXNS%G}50G|+7M-P|a@IXroCr8HsTN@8k6Wf-iau<)N=?n~87#PknFqASdWM(D- zm0wicHUUWSl?3?(|3?N4t_SX%0LpL{ctjQh6&wa(#^d=bQhH~gNX}c!> zE@kRI{?}PQK;D>p%hs8!r{+X1=$QHR@ypZy9jzGlxO26gH1~A@+QQ)J>gTe~DWM4f D6INr7 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/ticker.png b/src/main/resources/assets/create/textures/block/stock_ticker.png similarity index 100% rename from src/main/resources/assets/create/textures/block/ticker.png rename to src/main/resources/assets/create/textures/block/stock_ticker.png diff --git a/src/main/resources/assets/create/textures/entity/logistics_hat.png b/src/main/resources/assets/create/textures/entity/logistics_hat.png new file mode 100644 index 0000000000000000000000000000000000000000..34e817fd33a92a6ac40ab8d432a30fc9743fedff GIT binary patch literal 351 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}l0G|+76-@(OQ%grLA9H(W8F{t%tn_{R_Ged?7c|yix^$_!zyHaTC%13i zF6(IbaCe)za8v7qIfae&U%q^K{P=N4N5}g0>wzZm$xDU-De;mZzu^B^0mCzgXK_F! zoCO|{#Xt>*L74G){)!Z!V1uWNV~9quZ-2PZVFeym)H4smFT1KtGY2=HuD^8cOY^=0x4*wwW9Nk5mpE0K+4zO|tQ6OC UX~E4Cfo@^&boFyt=akR{0B;D9bpQYW literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/package/cardboard.png b/src/main/resources/assets/create/textures/entity/package/cardboard.png similarity index 100% rename from src/main/resources/assets/create/textures/block/package/cardboard.png rename to src/main/resources/assets/create/textures/entity/package/cardboard.png diff --git a/src/main/resources/assets/create/textures/block/package/cardboard_particle.png b/src/main/resources/assets/create/textures/entity/package/cardboard_particle.png similarity index 100% rename from src/main/resources/assets/create/textures/block/package/cardboard_particle.png rename to src/main/resources/assets/create/textures/entity/package/cardboard_particle.png diff --git a/src/main/resources/assets/minecraft/atlases/blocks.json b/src/main/resources/assets/minecraft/atlases/blocks.json index 62070df2a1..9c4f27da03 100644 --- a/src/main/resources/assets/minecraft/atlases/blocks.json +++ b/src/main/resources/assets/minecraft/atlases/blocks.json @@ -20,6 +20,18 @@ "type": "single", "resource": "create:entity/train_hat" }, + { + "type": "single", + "resource": "create:entity/logistics_hat" + }, + { + "type": "single", + "resource": "create:entity/package/cardboard" + }, + { + "type": "single", + "resource": "create:entity/package/cardboard_particle" + }, { "type": "single", "resource": "create:fluid/chocolate_flow" From ad42b341f8958aff8413372a72bf0c07fa8af994 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Tue, 14 Nov 2023 02:56:27 +0100 Subject: [PATCH 021/515] Special Delivery - Stock ticker screen can now send out instructions to packagers - Updated assets by Kryppers --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 6 +- .../resources/assets/create/lang/en_ud.json | 4 + .../resources/assets/create/lang/en_us.json | 4 + .../java/com/simibubi/create/AllPackets.java | 2 + .../logistics/box/PackageDestroyPacket.java | 5 +- .../content/logistics/box/PackageEntity.java | 3 +- .../LogisticalLinkBlockEntity.java | 42 +- .../logistics/packager/InventorySummary.java | 10 + .../packager/PackagerBlockEntity.java | 61 +- .../LogisticalWorkstationBlockEntity.java | 37 +- .../PackageOrderRequestPacket.java | 52 ++ .../stockTicker/StockTickerBlockEntity.java | 15 + .../stockTicker/StockTickerRequestScreen.java | 522 ++++++++++++++---- .../assets/create/lang/default/interface.json | 5 + .../create/models/block/packager/block.json | 91 ++- .../models/block/packager/hatch_closed.json | 34 +- .../models/block/packager/hatch_open.json | 37 +- .../create/models/block/packager/item.json | 143 +++-- .../create/models/block/stock_ticker.json | 133 ++--- .../assets/create/textures/block/packager.png | Bin 1423 -> 0 bytes .../create/textures/block/packager_block.png | Bin 0 -> 2324 bytes .../textures/block/packager_door_closed.png | Bin 0 -> 675 bytes .../textures/block/packager_door_open.png | Bin 0 -> 376 bytes .../textures/block/packager_hatch_closed.png | Bin 994 -> 0 bytes .../textures/block/packager_hatch_open.png | Bin 865 -> 0 bytes .../create/textures/block/packager_tray.png | Bin 865 -> 672 bytes .../create/textures/block/stock_ticker.png | Bin 1732 -> 1122 bytes 27 files changed, 819 insertions(+), 387 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrderRequestPacket.java delete mode 100644 src/main/resources/assets/create/textures/block/packager.png create mode 100644 src/main/resources/assets/create/textures/block/packager_block.png create mode 100644 src/main/resources/assets/create/textures/block/packager_door_closed.png create mode 100644 src/main/resources/assets/create/textures/block/packager_door_open.png delete mode 100644 src/main/resources/assets/create/textures/block/packager_hatch_closed.png delete mode 100644 src/main/resources/assets/create/textures/block/packager_hatch_open.png diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 47907ead11..2e624c0bc8 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2023-11-12T23:42:04.0326022 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2023-11-14T01:09:47.7683331 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -588,8 +588,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -f0ca10f5367eccbf7d31f37cef2f1ba7f3e94e5b assets/create/lang/en_ud.json -ba79e9c4273466b7861e5220351e608d6b0fcae6 assets/create/lang/en_us.json +338262f86608006c8325313afa0fb6858eaefdda assets/create/lang/en_ud.json +2ab3eaf01b70fef2c15557d6678b9b8410c06b6e assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index de6713fc1c..c32ba89285 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -1163,6 +1163,10 @@ "create.gui.sequenced_gearshift.speed.forward_fast": "spɹɐʍɹoℲ 'pǝǝds ǝןqnoᗡ", "create.gui.sequenced_gearshift.title": "ʇɟıɥsɹɐǝ⅁ pǝɔuǝnbǝS", "create.gui.speedometer.title": "pǝǝdS uoıʇɐʇoᴚ", + "create.gui.stock_ticker.checking_stocks": "˙˙˙sʞɔoʇs buıʞɔǝɥƆ", + "create.gui.stock_ticker.inventories_empty": "ʎʇdɯƎ ǝɹɐ sǝıɹoʇuǝʌuI pǝʞuıꞀ", + "create.gui.stock_ticker.no_packagers_linked": "pǝʞuıꞀ sɹǝbɐʞɔɐԀ oN", + "create.gui.stock_ticker.no_search_results": "punoɟ sɯǝʇı buıɥɔʇɐɯ oN", "create.gui.stressometer.capacity": "ʎʇıɔɐdɐƆ buıuıɐɯǝᴚ", "create.gui.stressometer.no_rotation": "uoıʇɐʇoᴚ oN", "create.gui.stressometer.overstressed": "pǝssǝɹʇsɹǝʌO", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index bc4a5aaed5..c893cf1ed9 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1163,6 +1163,10 @@ "create.gui.sequenced_gearshift.speed.forward_fast": "Double speed, Forwards", "create.gui.sequenced_gearshift.title": "Sequenced Gearshift", "create.gui.speedometer.title": "Rotation Speed", + "create.gui.stock_ticker.checking_stocks": "Checking stocks...", + "create.gui.stock_ticker.inventories_empty": "Linked Inventories are Empty", + "create.gui.stock_ticker.no_packagers_linked": "No Packagers Linked", + "create.gui.stock_ticker.no_search_results": "No matching items found", "create.gui.stressometer.capacity": "Remaining Capacity", "create.gui.stressometer.no_rotation": "No Rotation", "create.gui.stressometer.overstressed": "Overstressed", diff --git a/src/main/java/com/simibubi/create/AllPackets.java b/src/main/java/com/simibubi/create/AllPackets.java index d56b0afe8b..5065472ec8 100644 --- a/src/main/java/com/simibubi/create/AllPackets.java +++ b/src/main/java/com/simibubi/create/AllPackets.java @@ -57,6 +57,7 @@ import com.simibubi.create.content.logistics.filter.FilterScreenPacket; import com.simibubi.create.content.logistics.funnel.FunnelFlapPacket; import com.simibubi.create.content.logistics.stockTicker.LogisticalStockRequestPacket; import com.simibubi.create.content.logistics.stockTicker.LogisticalStockResponsePacket; +import com.simibubi.create.content.logistics.stockTicker.PackageOrderRequestPacket; import com.simibubi.create.content.logistics.tunnel.TunnelFlapPacket; import com.simibubi.create.content.redstone.displayLink.DisplayLinkConfigurationPacket; import com.simibubi.create.content.redstone.link.controller.LinkedControllerBindPacket; @@ -168,6 +169,7 @@ public enum AllPackets { CONTRAPTION_COLLIDER_LOCK_REQUEST(ContraptionColliderLockPacketRequest.class, ContraptionColliderLockPacketRequest::new, PLAY_TO_SERVER), LOGISTICS_STOCK_REQUEST(LogisticalStockRequestPacket.class, LogisticalStockRequestPacket::new, PLAY_TO_SERVER), + LOGISTICS_PACKAGE_REQUEST(PackageOrderRequestPacket.class, PackageOrderRequestPacket::new, PLAY_TO_SERVER), // Server to Client SYMMETRY_EFFECT(SymmetryEffectPacket.class, SymmetryEffectPacket::new, PLAY_TO_CLIENT), diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageDestroyPacket.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageDestroyPacket.java index f58813c6b0..9fe90c4340 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageDestroyPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageDestroyPacket.java @@ -1,6 +1,5 @@ package com.simibubi.create.content.logistics.box; -import com.simibubi.create.Create; import com.simibubi.create.foundation.networking.SimplePacketBase; import com.simibubi.create.foundation.utility.VecHelper; @@ -42,8 +41,8 @@ public class PackageDestroyPacket extends SimplePacketBase { ctx.enqueueWork(() -> { for (int i = 0; i < 20; i++) { ClientLevel level = Minecraft.getInstance().level; - Vec3 pos = VecHelper.offsetRandomly(location, level.getRandom(), .5f); - Vec3 motion = Vec3.ZERO; + Vec3 motion = VecHelper.offsetRandomly(Vec3.ZERO, level.getRandom(), .125f); + Vec3 pos = location.add(motion.scale(4)); level.addParticle(new ItemParticleOption(ParticleTypes.ITEM, box), pos.x, pos.y, pos.z, motion.x, motion.y, motion.z); } diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java index b891f59be5..811806c4f1 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java @@ -334,7 +334,8 @@ public class PackageEntity extends LivingEntity implements IEntityAdditionalSpaw private void destroy(DamageSource source) { AllPackets.getChannel() - .send(PacketDistributor.TRACKING_ENTITY.with(() -> this), new PackageDestroyPacket(position(), box)); + .send(PacketDistributor.TRACKING_ENTITY.with(() -> this), + new PackageDestroyPacket(getBoundingBox().getCenter(), box)); level().playSound((Player) null, getX(), getY(), getZ(), SoundEvents.ARMOR_STAND_BREAK, this.getSoundSource(), 1.0F, 1.0F); this.dropAllDeathLoot(source); diff --git a/src/main/java/com/simibubi/create/content/logistics/logisticalLink/LogisticalLinkBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/logisticalLink/LogisticalLinkBlockEntity.java index 3c717e70a8..b0a74b1da6 100644 --- a/src/main/java/com/simibubi/create/content/logistics/logisticalLink/LogisticalLinkBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/logisticalLink/LogisticalLinkBlockEntity.java @@ -11,11 +11,13 @@ import com.simibubi.create.content.logistics.packager.PackagerBlockEntity; import com.simibubi.create.content.logistics.stockTicker.LogisticalWorkstationBlockEntity; import com.simibubi.create.content.redstone.displayLink.LinkWithBulbBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; +import com.simibubi.create.foundation.utility.IntAttached; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; @@ -37,19 +39,29 @@ public class LogisticalLinkBlockEntity extends LinkWithBulbBlockEntity { } public InventorySummary fetchSummaryFromPackager() { - BlockState blockState = getBlockState(); - if (blockState.getOptionalValue(LogisticalLinkBlock.POWERED) - .orElse(true)) - return InventorySummary.EMPTY; - BlockPos source = worldPosition.relative(blockState.getOptionalValue(LogisticalLinkBlock.FACING) - .orElse(Direction.UP) - .getOpposite()); - if (!(level.getBlockEntity(source) instanceof PackagerBlockEntity packager)) + PackagerBlockEntity packager = getSource(); + if (packager == null) return InventorySummary.EMPTY; sendPulseNextSync(); sendData(); return packager.getAvailableItems(); } + + public int processRequest(ItemStack stack, int amount) { + PackagerBlockEntity packager = getSource(); + if (packager == null) + return 0; + + InventorySummary summary = packager.getAvailableItems(); + int availableCount = summary.getCountOf(stack); + int toWithdraw = Math.min(amount, availableCount); + + packager.queueRequest(IntAttached.with(toWithdraw, stack)); + sendPulseNextSync(); + sendData(); + + return toWithdraw; + } @Override public void addBehaviours(List behaviours) {} @@ -87,6 +99,20 @@ public class LogisticalLinkBlockEntity extends LinkWithBulbBlockEntity { } return null; } + + @Nullable + public PackagerBlockEntity getSource() { + BlockState blockState = getBlockState(); + if (blockState.getOptionalValue(LogisticalLinkBlock.POWERED) + .orElse(true)) + return null; + BlockPos source = worldPosition.relative(blockState.getOptionalValue(LogisticalLinkBlock.FACING) + .orElse(Direction.UP) + .getOpposite()); + if (!(level.getBlockEntity(source) instanceof PackagerBlockEntity packager)) + return null; + return packager; + } @Override public void tick() { diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/InventorySummary.java b/src/main/java/com/simibubi/create/content/logistics/packager/InventorySummary.java index 175d547708..10a0f75c85 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/InventorySummary.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/InventorySummary.java @@ -54,6 +54,16 @@ public class InventorySummary { IntAttached newEntry = IntAttached.with(count, stack); stacks.add(newEntry); } + + public int getCountOf(ItemStack stack) { + List> list = items.get(stack.getItem()); + if (list == null) + return 0; + for (IntAttached entry : list) + if (ItemHandlerHelper.canItemStacksStack(entry.getSecond(), stack)) + return entry.getFirst(); + return 0; + } public List> getStacksByCount() { if (stacksByCount == null) { diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java index 10a38f7596..9e5e4dad8c 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java @@ -1,5 +1,6 @@ package com.simibubi.create.content.logistics.packager; +import java.util.LinkedList; import java.util.List; import com.simibubi.create.content.logistics.box.PackageItem; @@ -10,6 +11,7 @@ import com.simibubi.create.foundation.blockEntity.behaviour.inventory.CapManipul import com.simibubi.create.foundation.blockEntity.behaviour.inventory.InvManipulationBehaviour; import com.simibubi.create.foundation.blockEntity.behaviour.inventory.VersionedInventoryTrackerBehaviour; import com.simibubi.create.foundation.item.ItemHelper; +import com.simibubi.create.foundation.utility.IntAttached; import com.simibubi.create.foundation.utility.NBTHelper; import net.minecraft.core.BlockPos; @@ -38,13 +40,15 @@ public class PackagerBlockEntity extends SmartBlockEntity { public ItemStack heldBox; public ItemStack previouslyUnwrapped; + public List> queuedRequests; // TODO: needs to be saved to disk + public PackagerItemHandler inventory; private final LazyOptional invProvider; public static final int CYCLE = 30; public int animationTicks; public boolean animationInward; - + private InventorySummary availableItems; private VersionedInventoryTrackerBehaviour invVersionTracker; @@ -59,6 +63,7 @@ public class PackagerBlockEntity extends SmartBlockEntity { invProvider = LazyOptional.of(() -> inventory); animationTicks = 0; animationInward = true; + queuedRequests = new LinkedList<>(); } @Override @@ -70,25 +75,32 @@ public class PackagerBlockEntity extends SmartBlockEntity { @Override public void tick() { super.tick(); + if (!level.isClientSide() && !queuedRequests.isEmpty()) + attemptToSend(true); if (animationTicks == 0) { previouslyUnwrapped = ItemStack.EMPTY; return; } animationTicks--; } - + + public void queueRequest(IntAttached requestedItem) { + queuedRequests.add(requestedItem); + level.blockEntityChanged(worldPosition); + } + public InventorySummary getAvailableItems() { if (availableItems != null && invVersionTracker.stillWaiting(targetInventory.getInventory())) return availableItems; availableItems = new InventorySummary(); - + IItemHandler targetInv = targetInventory.getInventory(); if (targetInv == null) return availableItems; - + for (int slot = 0; slot < targetInv.getSlots(); slot++) availableItems.add(targetInv.getStackInSlot(slot)); - + invVersionTracker.awaitNewVersion(targetInventory.getInventory()); return availableItems; } @@ -98,7 +110,7 @@ public class PackagerBlockEntity extends SmartBlockEntity { super.lazyTick(); if (!active || level.isClientSide()) return; - attemptToSend(); + attemptToSend(false); } public void activate() { @@ -161,8 +173,8 @@ public class PackagerBlockEntity extends SmartBlockEntity { return true; } - public void attemptToSend() { - if (mode == RedstoneMode.SEND_ONE || !isBlockPowered()) + public void attemptToSend(boolean requestQueue) { + if (!requestQueue && (mode == RedstoneMode.SEND_ONE || !isBlockPowered())) active = false; if (!heldBox.isEmpty() || animationTicks != 0) return; @@ -173,12 +185,19 @@ public class PackagerBlockEntity extends SmartBlockEntity { boolean anyItemPresent = false; ItemStackHandler extractedItems = new ItemStackHandler(PackageItem.SLOTS); ItemStack extractedPackageItem = ItemStack.EMPTY; + IntAttached nextRequest = null; + + if (requestQueue && !queuedRequests.isEmpty()) + nextRequest = queuedRequests.get(0); Outer: for (int i = 0; i < PackageItem.SLOTS; i++) for (int slot = 0; slot < targetInv.getSlots(); slot++) { - ItemStack extracted = targetInv.extractItem(slot, 64, true); + int initialCount = requestQueue ? Math.min(64, nextRequest.getFirst()) : 64; + ItemStack extracted = targetInv.extractItem(slot, initialCount, true); if (extracted.isEmpty()) continue; + if (requestQueue && !ItemHandlerHelper.canItemStacksStack(extracted, nextRequest.getSecond())) + continue; boolean bulky = !extracted.getItem() .canFitInsideContainerItems(); @@ -186,17 +205,33 @@ public class PackagerBlockEntity extends SmartBlockEntity { continue; anyItemPresent = true; - int leftovers = ItemHandlerHelper.insertItemStacked(extractedItems, extracted, false) + int leftovers = ItemHandlerHelper.insertItemStacked(extractedItems, extracted.copy(), false) .getCount(); - targetInv.extractItem(slot, extracted.getCount() - leftovers, false); + int transferred = extracted.getCount() - leftovers; + targetInv.extractItem(slot, transferred, false); + + if (requestQueue) { + nextRequest.setFirst(nextRequest.getFirst() - transferred); + if (nextRequest.isZero()) { + queuedRequests.remove(0); + if (queuedRequests.isEmpty()) + break Outer; + nextRequest = queuedRequests.get(0); + break; + } + } + if (extracted.getItem() instanceof PackageItem) extractedPackageItem = extracted; if (bulky) break Outer; } - if (!anyItemPresent) + if (!anyItemPresent) { + if (nextRequest != null) + queuedRequests.remove(0); return; + } heldBox = extractedPackageItem.isEmpty() ? PackageItem.containing(extractedItems) : extractedPackageItem.copy(); animationInward = false; @@ -240,7 +275,7 @@ public class PackagerBlockEntity extends SmartBlockEntity { @Override public LazyOptional getCapability(Capability cap, Direction side) { - if (cap == ForgeCapabilities.ITEM_HANDLER && side != Direction.DOWN) + if (cap == ForgeCapabilities.ITEM_HANDLER) return invProvider.cast(); return super.getCapability(cap, side); } diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalWorkstationBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalWorkstationBlockEntity.java index df7d77c188..d867ff67f9 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalWorkstationBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalWorkstationBlockEntity.java @@ -1,8 +1,10 @@ package com.simibubi.create.content.logistics.stockTicker; import java.lang.ref.WeakReference; +import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; +import java.util.List; import java.util.Map; import com.simibubi.create.content.logistics.logisticalLink.LogisticalLinkBlockEntity; @@ -11,6 +13,7 @@ import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.utility.IntAttached; import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; @@ -20,10 +23,13 @@ public abstract class LogisticalWorkstationBlockEntity extends SmartBlockEntity private InventorySummary summaryOfLinks; private int ticksSinceLastSummary; + protected int activeLinks; + public LogisticalWorkstationBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); setLazyTickRate(10); ticksSinceLastSummary = 15; + activeLinks = 0; } @Override @@ -31,10 +37,39 @@ public abstract class LogisticalWorkstationBlockEntity extends SmartBlockEntity super.tick(); if (level.isClientSide()) return; + if (activeLinks != connectedLinks.size() && !isRemoved()) { + activeLinks = connectedLinks.size(); + sendData(); + } if (ticksSinceLastSummary < 15) ticksSinceLastSummary++; } - + + protected List getAvailableLinks() { + List links = new ArrayList<>(); + connectedLinks.forEach(($, entry) -> { + LogisticalLinkBlockEntity blockEntity = entry.getSecond() + .get(); + if (blockEntity != null && !blockEntity.isRemoved() && !blockEntity.isChunkUnloaded()) + links.add(blockEntity); + }); + return links; + } + + @Override + protected void write(CompoundTag tag, boolean clientPacket) { + super.write(tag, clientPacket); + if (clientPacket) + tag.putInt("ActiveLinks", activeLinks); + } + + @Override + protected void read(CompoundTag tag, boolean clientPacket) { + super.read(tag, clientPacket); + if (clientPacket) + activeLinks = tag.getInt("ActiveLinks"); + } + public InventorySummary getRecentSummary() { if (summaryOfLinks == null || ticksSinceLastSummary >= 15) refreshInventorySummary(); diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrderRequestPacket.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrderRequestPacket.java new file mode 100644 index 0000000000..b019abdf36 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrderRequestPacket.java @@ -0,0 +1,52 @@ +package com.simibubi.create.content.logistics.stockTicker; + +import java.util.ArrayList; +import java.util.List; + +import com.simibubi.create.foundation.networking.BlockEntityConfigurationPacket; +import com.simibubi.create.foundation.utility.IntAttached; + +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.item.ItemStack; + +public class PackageOrderRequestPacket extends BlockEntityConfigurationPacket { + + private List> items; + + public PackageOrderRequestPacket(BlockPos pos, List> items) { + super(pos); + this.items = items; + } + + public PackageOrderRequestPacket(FriendlyByteBuf buffer) { + super(buffer); + } + + @Override + protected void writeSettings(FriendlyByteBuf buffer) { + buffer.writeVarInt(items.size()); + for (IntAttached entry : items) { + buffer.writeVarInt(entry.getFirst()); + buffer.writeItem(entry.getSecond()); + } + } + + @Override + protected void readSettings(FriendlyByteBuf buffer) { + int size = buffer.readVarInt(); + items = new ArrayList<>(); + for (int i = 0; i < size; i++) + items.add(IntAttached.with(buffer.readVarInt(), buffer.readItem())); + } + + @Override + protected void applySettings(StockTickerBlockEntity be) {} + + @Override + protected void applySettings(ServerPlayer player, StockTickerBlockEntity be) { + be.receivePackageRequest(items, player); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java index 5400861237..b07b87ac6e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java @@ -4,10 +4,12 @@ import java.util.ArrayList; import java.util.List; import com.simibubi.create.AllPackets; +import com.simibubi.create.content.logistics.logisticalLink.LogisticalLinkBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import com.simibubi.create.foundation.utility.IntAttached; import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; @@ -42,5 +44,18 @@ public class StockTickerBlockEntity extends LogisticalWorkstationBlockEntity { lastClientsideStockSnapshot = newlyReceivedStockSnapshot; newlyReceivedStockSnapshot = null; } + + public void receivePackageRequest(List> stacks, Player player) { + List availableLinks = getAvailableLinks(); + for (IntAttached entry : stacks) { + int remainingCount = entry.getFirst(); + ItemStack requestedItem = entry.getSecond(); + for (LogisticalLinkBlockEntity link : availableLinks) { + remainingCount -= link.processRequest(requestedItem, remainingCount); + if (remainingCount == 0) + break; + } + } + } } diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java index 3ed1477d4c..68537bd3a3 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java @@ -1,8 +1,19 @@ package com.simibubi.create.content.logistics.stockTicker; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; import java.util.List; +import java.util.Objects; +import java.util.Set; + +import javax.annotation.Nullable; + +import org.lwjgl.glfw.GLFW; import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.AllItems; +import com.simibubi.create.AllPackets; import com.simibubi.create.foundation.gui.AbstractSimiScreen; import com.simibubi.create.foundation.gui.element.GuiGameElement; import com.simibubi.create.foundation.utility.Color; @@ -13,31 +24,150 @@ import com.simibubi.create.foundation.utility.animation.LerpedFloat; import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.EditBox; +import net.minecraft.network.chat.Component; import net.minecraft.util.Mth; import net.minecraft.world.item.ItemStack; +import net.minecraftforge.items.ItemHandlerHelper; +import net.minecraftforge.registries.ForgeRegistries; public class StockTickerRequestScreen extends AbstractSimiScreen { - private StockTickerBlockEntity blockEntity; + StockTickerBlockEntity blockEntity; + int ticksSinceLastUpdate = 0; + LerpedFloat itemScroll; - private int ticksSinceLastUpdate = 0; + final int rows = 8; + final int cols = 8; + final int rowHeight = 18; + final int colWidth = 26; + final int noneHovered = -1; + int itemsX; + int itemsY; + int orderY; - private LerpedFloat itemScroll = LerpedFloat.linear() - .startWithValue(0); + EditBox searchBox; + boolean ignoreTextInput; + int mouseDownTicks; + + int emptyTicks = 0; + + List> currentItemSource; + List> displayedItems; + List> itemsToOrder; public StockTickerRequestScreen(StockTickerBlockEntity be) { super(be.getBlockState() .getBlock() .getName()); - this.blockEntity = be; - be.lastClientsideStockSnapshot = null; + displayedItems = new ArrayList<>(); + itemsToOrder = new ArrayList<>(); + blockEntity = be; + blockEntity.lastClientsideStockSnapshot = null; ticksSinceLastUpdate = 15; + emptyTicks = 0; + itemScroll = LerpedFloat.linear() + .startWithValue(0); + } + + @Override + protected void init() { + setWindowSize(256, 256); + super.init(); + + itemsX = guiLeft + (windowWidth - cols * colWidth) / 2; + itemsY = guiTop + 45; + orderY = itemsY + rows * rowHeight + 10; + + searchBox = new EditBox(this.font, itemsX + 1, itemsY - 18, 120, 9, Component.translatable("itemGroup.search")); + searchBox.setValue(""); + searchBox.setMaxLength(50); + searchBox.setBordered(false); + searchBox.setVisible(true); + searchBox.setTextColor(16777215); + addRenderableWidget(searchBox); + } + + private void refreshSearchResults(boolean scrollBackUp) { + displayedItems = Collections.emptyList(); + if (scrollBackUp) + itemScroll.startWithValue(0); + + if (currentItemSource == null) { + clampScrollBar(); + return; + } + + String valueWithPrefix = searchBox.getValue(); + if (valueWithPrefix.isBlank()) { + displayedItems = currentItemSource; + clampScrollBar(); + return; + } + + boolean modSearch = false; + boolean tagSearch = false; + if ((modSearch = valueWithPrefix.startsWith("@")) || (tagSearch = valueWithPrefix.startsWith("#"))) + valueWithPrefix = valueWithPrefix.substring(1); + final String value = valueWithPrefix; + + displayedItems = new ArrayList<>(); + for (IntAttached entry : currentItemSource) { + ItemStack stack = entry.getValue(); + + if (modSearch) { + if (ForgeRegistries.ITEMS.getKey(stack.getItem()) + .getNamespace() + .contains(value)) { + displayedItems.add(entry); + } + continue; + } + + if (tagSearch) { + if (stack.getTags() + .anyMatch(key -> key.location() + .toString() + .contains(value))) + displayedItems.add(entry); + continue; + } + + if (stack.getHoverName() + .getString() + .contains(value) + || ForgeRegistries.ITEMS.getKey(stack.getItem()) + .getPath() + .contains(value)) { + displayedItems.add(entry); + continue; + } + } + + clampScrollBar(); } @Override public void tick() { super.tick(); + if (displayedItems.isEmpty()) + emptyTicks++; + else + emptyTicks = 0; + + if (minecraft.mouseHandler.isLeftPressed()) + mouseDownTicks++; + else + mouseDownTicks = 0; + + List> clientStockSnapshot = blockEntity.getClientStockSnapshot(); + if (clientStockSnapshot != currentItemSource) { + currentItemSource = clientStockSnapshot; + refreshSearchResults(false); + revalidateOrders(); + } + itemScroll.tickChaser(); if (Math.abs(itemScroll.getValue() - itemScroll.getChaseTarget()) < 1 / 16f) itemScroll.setValue(itemScroll.getChaseTarget()); @@ -46,80 +176,59 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { ticksSinceLastUpdate++; return; } + ticksSinceLastUpdate = 0; blockEntity.refreshClientStockSnapshot(); } - @Override - public boolean mouseScrolled(double mouseX, double mouseY, double delta) { - List> items = blockEntity.getClientStockSnapshot(); - int size = items == null ? 0 : items.size(); - - int rows = 8; - int cols = 8; - - float newTarget = itemScroll.getChaseTarget() + (int) Math.signum(-delta); - newTarget = Mth.clamp(newTarget, 0, Math.max(0, Mth.ceil(size / (1.0 * cols)) - rows)); - itemScroll.chase(newTarget, 0.5, Chaser.EXP); - - return true; - } - - @Override - protected void init() { - setWindowSize(256, 256); - super.init(); - } - - private int getHoveredSlot(int x, int y) { - List> items = blockEntity.getClientStockSnapshot(); - - int rows = 8; - int cols = 8; - int rowHeight = 18; - int colWidth = 26; - int itemsX = guiLeft + (windowWidth - cols * colWidth) / 2; - int itemsY = guiTop + 45; - - if (items == null) - return -1; - if (x < itemsX || x >= itemsX + cols * colWidth) - return -1; - if (y < itemsY || y >= itemsY + rows * rowHeight) - return -1; - if (!itemScroll.settled()) - return -1; - int row = (y - itemsY) / rowHeight + (int) itemScroll.getChaseTarget(); - int col = (x - itemsX) / colWidth; - int slot = row * cols + col; - if (items.size() <= slot) - return -1; - return slot; - } - @Override protected void renderWindow(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { - List> items = blockEntity.getClientStockSnapshot(); PoseStack ms = graphics.pose(); - - int rows = 8; - int cols = 8; - int rowHeight = 18; - int colWidth = 26; - int x = guiLeft + (windowWidth - cols * colWidth) / 2; - int y = guiTop + 45; - + Color color = new Color(255, 255, 255, 50); float currentScroll = itemScroll.getValue(minecraft.getDeltaFrameTime()); int startRow = Math.max(0, Mth.floor(currentScroll) - 1); + int hoveredSlot = getHoveredSlot(mouseX, mouseY, true); + + // Render some boxes + graphics.renderOutline(searchBox.getX() - 4, searchBox.getY() - 4, searchBox.getWidth() + 12, + searchBox.getHeight() + 7, color.getRGB()); + graphics.renderOutline(itemsX - 3, itemsY - 4, cols * colWidth + 6, rows * rowHeight + 8, color.getRGB()); + graphics.renderOutline(itemsX - 3, orderY - 4, cols * colWidth + 6, rowHeight + 8, color.getRGB()); + + ms.pushPose(); + ms.translate(itemsX + cols * colWidth + 3, orderY - 8, 0); + ms.scale(2f, 2f, 2f); + GuiGameElement.of(AllItems.CARDBOARD_PACKAGE_10x12.asStack()) + .render(graphics); + ms.popPose(); + + // Render ordered items + for (int index = 0; index < cols; index++) { + if (itemsToOrder.size() <= index) + break; + + IntAttached entry = itemsToOrder.get(index); + boolean isStackHovered = index == hoveredSlot; + + ms.pushPose(); + ms.translate(itemsX + index * colWidth, orderY, 0); + renderItemEntry(graphics, 1, entry, isStackHovered, true); + ms.popPose(); + } + + if (displayedItems.isEmpty()) { + Component msg = getTroubleshootingMessage(); + float alpha = Mth.clamp((emptyTicks - 10f) / 20f, 0f, 1f); + if (alpha > 0) + graphics.drawString(font, msg, itemsX + 1, itemsY, new Color(.5f, .5f, .5f, alpha).getRGB()); + } + + hoveredSlot = getHoveredSlot(mouseX, mouseY, false); ms.pushPose(); ms.translate(0, -currentScroll * rowHeight, 0); - int hoveredSlot = getHoveredSlot(mouseX, mouseY); - - if (items == null) { - return; - } + // Render item pool for (int row = startRow; row < startRow + rows + 2; row++) { float scale = 1; if (row < currentScroll) @@ -132,63 +241,260 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { for (int col = 0; col < cols; col++) { int index = row * cols + col; - if (items.size() <= index) + if (displayedItems.size() <= index) break; + + IntAttached entry = displayedItems.get(index); + boolean isStackHovered = index == hoveredSlot; + ms.pushPose(); - ms.translate(x + col * colWidth, y + row * rowHeight, 0); - float scaleFromHover = 1; - ms.translate(0, 0, 200); - - IntAttached entry = items.get(index); - int count = entry.getFirst(); - if (count > 1) { - String text = count >= 1000000 ? (count / 1000000) + "m" - : count >= 10000 ? (count / 1000) + "k" - : count >= 1000 ? ((count * 10) / 1000) / 10f + "k" : count >= 100 ? count + "" : " " + count; - for (int xi : Iterate.positiveAndNegative) - graphics.drawString(font, Lang.text(text) - .component(), 11 + xi, 10, xi < 0 ? 0x555555 : 0x333333, false); - for (int yi : Iterate.positiveAndNegative) - graphics.drawString(font, Lang.text(text) - .component(), 11, 10 + yi, yi < 0 ? 0x555555 : 0x333333, false); - graphics.drawString(font, Lang.text(text) - .component(), 11, 10, 0xffffff, false); - } - - ms.translate(0, 0, -200); - - if (index == hoveredSlot) { - Color color2 = new Color(255, 255, 255, 50); - ms.translate(-.5f, -.5f, 0); - graphics.renderOutline(0, 0, colWidth - 1, rowHeight - 1, color2.getRGB()); - ms.translate(.5f, .5f, 0); - scaleFromHover += .05f; - } - - ms.translate((colWidth - 18) / 2.0, (rowHeight - 18) / 2.0, 0); - ms.translate(18 / 2.0, 18 / 2.0, 0); - ms.scale(scale, scale, scale); - ms.scale(scaleFromHover, scaleFromHover, scaleFromHover); - ms.translate(-18 / 2.0, -18 / 2.0, 0); - GuiGameElement.of(entry.getSecond()) - .render(graphics); + ms.translate(itemsX + col * colWidth, itemsY + row * rowHeight, 0); + renderItemEntry(graphics, scale, entry, isStackHovered, false); ms.popPose(); } } ms.popPose(); + // Scroll bar int totalHeight = rows * rowHeight; - int allRows = Mth.ceil(items.size() / (1.0 * cols)); + int allRows = Mth.ceil(displayedItems.size() / (1.0 * cols)); int barSize = Mth.floor(1f * totalHeight * rows / allRows); if (barSize < totalHeight) { ms.pushPose(); ms.translate(0, currentScroll * (totalHeight - barSize) / Math.max(1, allRows - rows), 0); - Color color = new Color(255, 255, 255, 50); - graphics.renderOutline(x + cols * colWidth + 3, y, 1, barSize, color.getRGB()); + graphics.renderOutline(itemsX + cols * colWidth + 2, itemsY, 1, barSize, color.getRGB()); ms.popPose(); } + // Render tooltip of hovered item + if (hoveredSlot != noneHovered) + graphics.renderTooltip(font, displayedItems.get(hoveredSlot) + .getValue(), mouseX, mouseY); + hoveredSlot = getHoveredSlot(mouseX, mouseY, true); + if (hoveredSlot != noneHovered) + graphics.renderTooltip(font, itemsToOrder.get(hoveredSlot) + .getValue(), mouseX, mouseY); + } + + private void renderItemEntry(GuiGraphics graphics, float scale, IntAttached entry, + boolean isStackHovered, boolean isRenderingOrders) { + PoseStack ms = graphics.pose(); + ms.pushPose(); + ms.translate(0, 0, 200); + + int customCount = entry.getFirst(); + if (!isRenderingOrders) { + IntAttached order = getOrderForItem(entry.getSecond()); + if (order != null) + customCount -= order.getFirst(); + } + + drawItemCount(graphics, entry.getFirst(), customCount); + ms.translate(0, 0, -200); + + float scaleFromHover = 1; + if (isStackHovered) + scaleFromHover += .075f; + + ms.translate((colWidth - 18) / 2.0, (rowHeight - 18) / 2.0, 0); + ms.translate(18 / 2.0, 18 / 2.0, 0); + ms.scale(scale, scale, scale); + ms.scale(scaleFromHover, scaleFromHover, scaleFromHover); + ms.translate(-18 / 2.0, -18 / 2.0, 0); + GuiGameElement.of(entry.getSecond()) + .render(graphics); + ms.popPose(); + } + + private void drawItemCount(GuiGraphics graphics, int count, int customCount) { + boolean special = customCount != count; + if (!special && count == 1) + return; + + count = customCount; + String text = count >= 1000000 ? (count / 1000000) + "m" + : count >= 10000 ? (count / 1000) + "k" + : count >= 1000 ? ((count * 10) / 1000) / 10f + "k" + : count >= 100 ? count + "" : count > 0 ? " " + count : " \u2714"; + + int lightOutline = 0x444444; + int darkOutline = 0x222222; + int middleColor = special ? 0xaaffaa : 0xdddddd; + + for (int xi : Iterate.positiveAndNegative) + graphics.drawString(font, Lang.text(text) + .component(), 11 + xi, 10, xi < 0 ? lightOutline : darkOutline, false); + for (int yi : Iterate.positiveAndNegative) + graphics.drawString(font, Lang.text(text) + .component(), 11, 10 + yi, yi < 0 ? lightOutline : darkOutline, false); + graphics.drawString(font, Lang.text(text) + .component(), 11, 10, middleColor, false); + } + + @Nullable + private IntAttached getOrderForItem(ItemStack stack) { + for (IntAttached entry : itemsToOrder) + if (ItemHandlerHelper.canItemStacksStack(stack, entry.getValue())) + return entry; + return null; + } + + private void revalidateOrders() { + Set> invalid = new HashSet<>(itemsToOrder); + if (currentItemSource == null) { + itemsToOrder.removeAll(invalid); + return; + } + for (IntAttached entry : itemsToOrder) + for (IntAttached available : currentItemSource) + if (ItemHandlerHelper.canItemStacksStack(entry.getValue(), available.getValue())) { + entry.setFirst(Math.min(available.getFirst(), entry.getFirst())); + invalid.remove(entry); + break; + } + itemsToOrder.removeAll(invalid); + } + + private int getHoveredSlot(int x, int y, boolean order) { + if (x < itemsX || x >= itemsX + cols * colWidth) + return noneHovered; + if (!order && (y < itemsY || y >= itemsY + rows * rowHeight)) + return noneHovered; + if (order && (y < orderY || y >= orderY + rowHeight)) + return noneHovered; + if (!order && !itemScroll.settled()) + return noneHovered; + + int row = (y - itemsY) / rowHeight + (int) itemScroll.getChaseTarget(); + int col = (x - itemsX) / colWidth; + int slot = row * cols + col; + + if (order && itemsToOrder.size() <= col) + return noneHovered; + if (!order && displayedItems.size() <= slot) + return noneHovered; + return order ? col : slot; + } + + private Component getTroubleshootingMessage() { + if (currentItemSource == null) + return Lang.translate("gui.stock_ticker.checking_stocks") + .component(); + if (blockEntity.activeLinks == 0) + return Lang.translate("gui.stock_ticker.no_packagers_linked") + .component(); + if (currentItemSource.isEmpty()) + return Lang.translate("gui.stock_ticker.inventories_empty") + .component(); + return Lang.translate("gui.stock_ticker.no_search_results") + .component(); + } + + @Override + public boolean mouseClicked(double pMouseX, double pMouseY, int pButton) { + boolean orderClicked = false; + int hoveredSlot = getHoveredSlot((int) pMouseX, (int) pMouseY, false); + if (hoveredSlot == noneHovered) { + hoveredSlot = getHoveredSlot((int) pMouseX, (int) pMouseY, true); + orderClicked = true; + } + + boolean lmb = pButton == 0; + boolean rmb = pButton == 1; + + if (rmb && searchBox.isMouseOver(pMouseX, pMouseY)) { + searchBox.setValue(""); + refreshSearchResults(true); + searchBox.setFocused(true); + return true; + } + + if (hoveredSlot == noneHovered || !lmb && !rmb) + return super.mouseClicked(pMouseX, pMouseY, pButton); + + IntAttached entry = orderClicked ? itemsToOrder.get(hoveredSlot) : displayedItems.get(hoveredSlot); + ItemStack itemStack = entry.getValue(); + IntAttached existingOrder = getOrderForItem(itemStack); + if (existingOrder == null) { + if (itemsToOrder.size() >= cols || rmb) + return true; + itemsToOrder.add(existingOrder = IntAttached.withZero(itemStack)); + } + + int transfer = hasShiftDown() ? itemStack.getMaxStackSize() : 1; + int current = existingOrder.getFirst(); + + if (rmb) { + existingOrder.setFirst(current - transfer); + if (existingOrder.getFirst() <= 0) + itemsToOrder.remove(existingOrder); + return true; + } + + existingOrder.setFirst(current + Math.min(transfer, entry.getFirst() - current)); + return true; + } + + @Override + public boolean mouseReleased(double pMouseX, double pMouseY, int pButton) { + return super.mouseReleased(pMouseX, pMouseY, pButton); + } + + @Override + public boolean mouseScrolled(double mouseX, double mouseY, double delta) { + int maxScroll = Math.max(0, Mth.ceil(displayedItems.size() / (1.0 * cols)) - rows); + int direction = (int) Math.signum(-delta); + float newTarget = Mth.clamp(itemScroll.getChaseTarget() + direction, 0, maxScroll); + itemScroll.chase(newTarget, 0.5, Chaser.EXP); + return true; + } + + private void clampScrollBar() { + int maxScroll = Math.max(0, Mth.ceil(displayedItems.size() / (1.0 * cols)) - rows); + float prevTarget = itemScroll.getChaseTarget(); + float newTarget = Mth.clamp(prevTarget, 0, maxScroll); + if (prevTarget != newTarget) + itemScroll.startWithValue(newTarget); + } + + @Override + public boolean charTyped(char pCodePoint, int pModifiers) { + if (ignoreTextInput) + return false; + String s = searchBox.getValue(); + if (!searchBox.charTyped(pCodePoint, pModifiers)) + return false; + if (!Objects.equals(s, searchBox.getValue())) + refreshSearchResults(true); + return true; + } + + @Override + public boolean keyPressed(int pKeyCode, int pScanCode, int pModifiers) { + if (pKeyCode == GLFW.GLFW_KEY_ENTER && hasShiftDown()) { + revalidateOrders(); + if (!itemsToOrder.isEmpty()) { + AllPackets.getChannel() + .sendToServer(new PackageOrderRequestPacket(blockEntity.getBlockPos(), itemsToOrder)); + minecraft.setScreen(null); + } + } + + ignoreTextInput = false; + String s = searchBox.getValue(); + if (!searchBox.keyPressed(pKeyCode, pScanCode, pModifiers)) + return searchBox.isFocused() && searchBox.isVisible() && pKeyCode != 256 ? true + : super.keyPressed(pKeyCode, pScanCode, pModifiers); + if (!Objects.equals(s, searchBox.getValue())) + refreshSearchResults(true); + return true; + } + + @Override + public boolean keyReleased(int pKeyCode, int pScanCode, int pModifiers) { + ignoreTextInput = false; + return super.keyReleased(pKeyCode, pScanCode, pModifiers); } } diff --git a/src/main/resources/assets/create/lang/default/interface.json b/src/main/resources/assets/create/lang/default/interface.json index 13d3d354bb..e7992f1278 100644 --- a/src/main/resources/assets/create/lang/default/interface.json +++ b/src/main/resources/assets/create/lang/default/interface.json @@ -307,6 +307,11 @@ "create.gui.clipboard.erase_checked": "Erase checked items", + "create.gui.stock_ticker.checking_stocks": "Checking stocks...", + "create.gui.stock_ticker.no_packagers_linked": "No Packagers Linked", + "create.gui.stock_ticker.inventories_empty": "Linked Inventories are Empty", + "create.gui.stock_ticker.no_search_results": "No matching items found", + "create.clipboard.actions": "Clipboard Actions", "create.clipboard.to_copy": "%1$s to Copy settings", "create.clipboard.to_paste": "%1$s to Paste settings", diff --git a/src/main/resources/assets/create/models/block/packager/block.json b/src/main/resources/assets/create/models/block/packager/block.json index 83972d49a9..df95c4b8ba 100644 --- a/src/main/resources/assets/create/models/block/packager/block.json +++ b/src/main/resources/assets/create/models/block/packager/block.json @@ -1,83 +1,74 @@ { "credit": "Made with Blockbench", "textures": { - "2": "create:block/packager", - "4": "create:block/packager_tray", - "particle": "create:block/packager" + "0": "create:block/packager_block", + "3": "create:block/axis", + "particle": "create:block/packager_block" }, "elements": [ { - "from": [15.95, 15.95, 15.95], - "to": [0.05, 0.05, 0.05], - "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, -8]}, - "faces": { - "east": {"uv": [0, 0, 8, 8], "rotation": 180, "texture": "#2"}, - "south": {"uv": [0, 0, 8, 8], "rotation": 180, "texture": "#2"}, - "west": {"uv": [0, 0, 8, 8], "rotation": 180, "texture": "#2"}, - "up": {"uv": [8, 0, 16, 8], "texture": "#2"}, - "down": {"uv": [0, 8, 8, 16], "texture": "#2"} - } - }, - { - "from": [0, 0, 0], - "to": [16, 1, 16], - "faces": { - "up": {"uv": [8, 0, 16, 8], "texture": "#2"} - } - }, - { - "from": [0, 0, 0], - "to": [16, 2, 16], - "faces": { - "up": {"uv": [0, 8, 8, 16], "texture": "#2"} - } - }, - { + "name": "exterior", "from": [0, 0, 0], "to": [16, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [0, 0, 8, 8], "texture": "#2"}, - "east": {"uv": [0, 0, 8, 8], "texture": "#2"}, - "south": {"uv": [8, 8, 16, 16], "texture": "#2"}, - "west": {"uv": [0, 0, 8, 8], "texture": "#2"}, - "up": {"uv": [0, 8, 8, 16], "texture": "#2"}, - "down": {"uv": [8, 0, 16, 8], "texture": "#2"} + "north": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "east": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "south": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "west": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "up": {"uv": [0, 0, 8, 8], "texture": "#0"}, + "down": {"uv": [0, 8, 8, 16], "texture": "#0"} } }, { - "from": [10, 1, 0], - "to": [12, 3, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [11, 2, 8]}, + "name": "interior", + "from": [16, 0, 0], + "to": [0, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "east": {"uv": [0, 0, 2, 16], "rotation": 270, "texture": "#4"}, - "west": {"uv": [0, 0, 2, 16], "rotation": 90, "texture": "#4"}, - "up": {"uv": [0, 0, 2, 16], "texture": "#4"}, - "down": {"uv": [0, 0, 2, 16], "rotation": 180, "texture": "#4"} + "north": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "east": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "south": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "west": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "up": {"uv": [0, 0, 8, 8], "texture": "#0"}, + "down": {"uv": [0, 8, 8, 16], "texture": "#0"} } }, { "from": [4, 1, 0], "to": [6, 3, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "east": {"uv": [0, 0, 2, 16], "rotation": 90, "texture": "#4"}, - "west": {"uv": [0, 0, 2, 16], "rotation": 270, "texture": "#4"}, - "up": {"uv": [0, 0, 2, 16], "rotation": 180, "texture": "#4"}, - "down": {"uv": [0, 0, 2, 16], "texture": "#4"} + "east": {"uv": [7, 0, 9, 16], "rotation": 90, "texture": "#3"}, + "west": {"uv": [7, 0, 9, 16], "rotation": 270, "texture": "#3"}, + "up": {"uv": [7, 0, 9, 16], "texture": "#3"}, + "down": {"uv": [9, 0, 7, 16], "texture": "#3"} + } + }, + { + "from": [10, 1, 0], + "to": [12, 3, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "east": {"uv": [7, 0, 9, 16], "rotation": 90, "texture": "#3"}, + "west": {"uv": [7, 0, 9, 16], "rotation": 270, "texture": "#3"}, + "up": {"uv": [7, 0, 9, 16], "texture": "#3"}, + "down": {"uv": [9, 0, 7, 16], "texture": "#3"} } } ], "groups": [ { - "name": "Frame", + "name": "Main Block", "origin": [0, 0, 0], "color": 0, - "children": [0, 1, 2, 3] + "children": [0, 1] }, { - "name": "Guides Horizontal", + "name": "Rails Horizontal", "origin": [0, 0, 0], "color": 0, - "children": [4, 5] + "children": [2, 3] } ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/packager/hatch_closed.json b/src/main/resources/assets/create/models/block/packager/hatch_closed.json index 08ce678388..87d068bbc8 100644 --- a/src/main/resources/assets/create/models/block/packager/hatch_closed.json +++ b/src/main/resources/assets/create/models/block/packager/hatch_closed.json @@ -1,36 +1,30 @@ { "credit": "Made with Blockbench", "textures": { - "1": "create:block/packager_hatch_closed", - "particle": "create:block/packager" + "0": "create:block/packager_block", + "1": "create:block/packager_door_closed" }, "elements": [ { - "from": [0, 0, 6], - "to": [16, 16, 8], - "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 8]}, + "from": [1, 1, 7], + "to": [15, 15, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [0, 0, 16, 16], "texture": "#1"} - } - }, - { - "from": [1.1, 1.1, 8], - "to": [14.9, 14.9, 9.95], - "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 8]}, - "faces": { - "east": {"uv": [14, 1, 16, 15], "texture": "#1"}, - "south": {"uv": [1, 1, 15, 15], "texture": "#1"}, - "west": {"uv": [0, 1, 2, 15], "texture": "#1"}, - "up": {"uv": [1, 0, 15, 2], "texture": "#1"}, - "down": {"uv": [1, 14, 15, 16], "texture": "#1"} + "north": {"uv": [1, 1, 15, 15], "texture": "#1"}, + "east": {"uv": [8, 15.5, 9.5, 8.5], "texture": "#0"}, + "south": {"uv": [15, 1, 1, 15], "texture": "#1"}, + "west": {"uv": [8, 15.5, 9.5, 8.5], "texture": "#0"}, + "up": {"uv": [8, 15.5, 9.5, 8.5], "rotation": 90, "texture": "#0"}, + "down": {"uv": [8, 15.5, 9.5, 8.5], "rotation": 90, "texture": "#0"} } } ], "groups": [ { - "name": "Frame", + "name": "Door", "origin": [0, 0, 0], - "children": [0, 1] + "color": 0, + "children": [0] } ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/packager/hatch_open.json b/src/main/resources/assets/create/models/block/packager/hatch_open.json index ff86b61d8a..4c8f540e07 100644 --- a/src/main/resources/assets/create/models/block/packager/hatch_open.json +++ b/src/main/resources/assets/create/models/block/packager/hatch_open.json @@ -1,37 +1,6 @@ { - "credit": "Made with Blockbench", + "parent": "create:block/packager/hatch_closed", "textures": { - "1": "create:block/packager_hatch_closed", - "3": "create:block/packager_hatch_open", - "particle": "create:block/packager" - }, - "elements": [ - { - "from": [0, 0, 6], - "to": [16, 16, 8], - "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [0, 0, 16, 16], "texture": "#3"} - } - }, - { - "from": [1.1, 1.1, 8], - "to": [14.9, 14.9, 9.95], - "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 8]}, - "faces": { - "east": {"uv": [14, 1, 16, 15], "texture": "#1"}, - "south": {"uv": [1, 1, 15, 15], "texture": "#3"}, - "west": {"uv": [0, 1, 2, 15], "texture": "#1"}, - "up": {"uv": [1, 0, 15, 2], "texture": "#1"}, - "down": {"uv": [1, 14, 15, 16], "texture": "#1"} - } - } - ], - "groups": [ - { - "name": "Frame", - "origin": [0, 0, 0], - "children": [0, 1] - } - ] + "1": "create:block/packager_door_open" + } } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/packager/item.json b/src/main/resources/assets/create/models/block/packager/item.json index 243e588256..80b422fe53 100644 --- a/src/main/resources/assets/create/models/block/packager/item.json +++ b/src/main/resources/assets/create/models/block/packager/item.json @@ -2,118 +2,115 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "1": "create:block/packager_hatch_closed", - "2": "create:block/packager", - "4": "create:block/packager_tray", - "particle": "create:block/packager_hatch_closed" + "0": "create:block/packager_block", + "1": "create:block/packager_door_closed", + "2": "create:block/packager_tray", + "3": "create:block/axis", + "particle": "create:block/packager_block" }, "elements": [ { - "from": [0, 0, 14], - "to": [16, 16, 16], - "faces": { - "north": {"uv": [0, 0, 16, 16], "texture": "#1"} - } - }, - { - "from": [16, 16, 16], - "to": [0, 0, 0], - "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, -8]}, - "faces": { - "north": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#1"}, - "east": {"uv": [0, 0, 8, 8], "rotation": 180, "texture": "#2"}, - "south": {"uv": [0, 0, 8, 8], "rotation": 180, "texture": "#2"}, - "west": {"uv": [0, 0, 8, 8], "rotation": 180, "texture": "#2"}, - "up": {"uv": [8, 0, 16, 8], "texture": "#2"}, - "down": {"uv": [0, 8, 8, 16], "texture": "#2"} - } - }, - { - "from": [0, 0, 0], - "to": [16, 1, 16], - "faces": { - "up": {"uv": [8, 0, 16, 8], "texture": "#2"} - } - }, - { - "from": [0, 0, 0], - "to": [16, 2, 16], - "faces": { - "up": {"uv": [0, 8, 8, 16], "texture": "#2"} - } - }, - { + "name": "exterior", "from": [0, 0, 0], "to": [16, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [0, 0, 8, 8], "texture": "#2"}, - "east": {"uv": [0, 0, 8, 8], "texture": "#2"}, - "south": {"uv": [8, 8, 16, 16], "texture": "#2"}, - "west": {"uv": [0, 0, 8, 8], "texture": "#2"}, - "up": {"uv": [0, 8, 8, 16], "texture": "#2"}, - "down": {"uv": [8, 0, 16, 8], "texture": "#2"} + "north": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "east": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "south": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "west": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "up": {"uv": [0, 0, 8, 8], "rotation": 180, "texture": "#0"}, + "down": {"uv": [0, 8, 8, 16], "rotation": 180, "texture": "#0"} } }, { - "from": [1.1, 1.1, 16], - "to": [14.9, 14.9, 18], + "name": "interior", + "from": [16, 0, 0], + "to": [0, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "east": {"uv": [14, 1, 16, 15], "texture": "#1"}, - "south": {"uv": [1, 1, 15, 15], "texture": "#1"}, - "west": {"uv": [0, 1, 2, 15], "texture": "#1"}, - "up": {"uv": [1, 0, 15, 2], "texture": "#1"}, - "down": {"uv": [1, 14, 15, 16], "texture": "#1"} + "north": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "east": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "south": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "west": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "up": {"uv": [0, 0, 8, 8], "rotation": 180, "texture": "#0"}, + "down": {"uv": [0, 8, 8, 16], "rotation": 180, "texture": "#0"} } }, { - "from": [2, 2, 1], - "to": [14, 4, 14], + "name": "tray", + "from": [2, 2, 1.5], + "to": [14, 4, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 16]}, "faces": { - "north": {"uv": [2, 14, 14, 16], "texture": "#4"}, - "east": {"uv": [13, 2, 15, 15], "rotation": 90, "texture": "#4"}, - "south": {"uv": [2, 14, 14, 16], "texture": "#4"}, - "west": {"uv": [13, 2, 15, 15], "rotation": 90, "texture": "#4"}, - "up": {"uv": [2, 2, 14, 15], "texture": "#4"}, - "down": {"uv": [2, 2, 14, 15], "texture": "#4"} + "north": {"uv": [2, 14, 14, 16], "texture": "#2"}, + "east": {"uv": [13, 2, 15, 15], "rotation": 90, "texture": "#2"}, + "south": {"uv": [2, 14, 14, 16], "texture": "#2"}, + "west": {"uv": [13, 2, 15, 15], "rotation": 90, "texture": "#2"}, + "up": {"uv": [2, 2, 14, 15], "rotation": 180, "texture": "#2"}, + "down": {"uv": [2, 2, 14, 15], "rotation": 180, "texture": "#2"} } }, { "from": [10, 1, 0], "to": [12, 3, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [11, 2, 8]}, + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "east": {"uv": [0, 0, 2, 16], "rotation": 270, "texture": "#4"}, - "west": {"uv": [0, 0, 2, 16], "rotation": 90, "texture": "#4"}, - "up": {"uv": [0, 0, 2, 16], "texture": "#4"}, - "down": {"uv": [0, 0, 2, 16], "rotation": 180, "texture": "#4"} + "east": {"uv": [7, 0, 9, 16], "rotation": 270, "texture": "#3"}, + "west": {"uv": [7, 0, 9, 16], "rotation": 90, "texture": "#3"}, + "up": {"uv": [7, 0, 9, 16], "rotation": 180, "texture": "#3"}, + "down": {"uv": [9, 0, 7, 16], "rotation": 180, "texture": "#3"} } }, { "from": [4, 1, 0], "to": [6, 3, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "east": {"uv": [0, 0, 2, 16], "rotation": 90, "texture": "#4"}, - "west": {"uv": [0, 0, 2, 16], "rotation": 270, "texture": "#4"}, - "up": {"uv": [0, 0, 2, 16], "rotation": 180, "texture": "#4"}, - "down": {"uv": [0, 0, 2, 16], "texture": "#4"} + "east": {"uv": [7, 0, 9, 16], "rotation": 270, "texture": "#3"}, + "west": {"uv": [7, 0, 9, 16], "rotation": 90, "texture": "#3"}, + "up": {"uv": [7, 0, 9, 16], "rotation": 180, "texture": "#3"}, + "down": {"uv": [9, 0, 7, 16], "rotation": 180, "texture": "#3"} + } + }, + { + "from": [1, 1, 15], + "to": [15, 15, 18], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [15, 1, 1, 15], "texture": "#1"}, + "east": {"uv": [8, 15.5, 9.5, 8.5], "texture": "#0"}, + "south": {"uv": [1, 1, 15, 15], "texture": "#1"}, + "west": {"uv": [8, 15.5, 9.5, 8.5], "texture": "#0"}, + "up": {"uv": [8, 15.5, 9.5, 8.5], "rotation": 270, "texture": "#0"}, + "down": {"uv": [8, 15.5, 9.5, 8.5], "rotation": 270, "texture": "#0"} } } ], "groups": [ { - "name": "Frame", + "name": "Main Block", "origin": [0, 0, 0], - "children": [0, 1, 2, 3, 4, 5] + "color": 0, + "children": [0, 1] }, { "name": "Tray", "origin": [0, 0, 0], - "children": [6] + "color": 0, + "children": [2] }, { - "name": "Guides Horizontal", + "name": "Rails Horizontal", "origin": [0, 0, 0], - "children": [7, 8] + "color": 0, + "children": [3, 4] + }, + { + "name": "Door", + "origin": [0, 0, 0], + "color": 0, + "children": [5] } ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/stock_ticker.json b/src/main/resources/assets/create/models/block/stock_ticker.json index f0ab07bc05..9ead23d295 100644 --- a/src/main/resources/assets/create/models/block/stock_ticker.json +++ b/src/main/resources/assets/create/models/block/stock_ticker.json @@ -3,7 +3,7 @@ "parent": "block/block", "textures": { "0": "create:block/stock_ticker", - "particle": "block/glass" + "particle": "create:block/stock_ticker" }, "elements": [ { @@ -18,124 +18,111 @@ "down": {"uv": [0.5, 8.5, 7.5, 15.5], "texture": "#0"} } }, - { - "from": [2, 4, 2], - "to": [14, 16, 14], - "faces": { - "north": {"uv": [10, 10, 16, 16], "texture": "#0"}, - "east": {"uv": [10, 10, 16, 16], "texture": "#0"}, - "south": {"uv": [10, 10, 16, 16], "texture": "#0"}, - "west": {"uv": [10, 10, 16, 16], "texture": "#0"}, - "up": {"uv": [10, 10, 16, 16], "rotation": 90, "texture": "#0"} - } - }, { "from": [6, 4, 3], "to": [10, 11, 11], "faces": { - "east": {"uv": [4, 0, 0, 3.5], "texture": "#0"}, - "west": {"uv": [0, 0, 4, 3.5], "texture": "#0"} + "east": {"uv": [4.5, 0.5, 0.5, 4], "texture": "#0"}, + "west": {"uv": [0.5, 0.5, 4.5, 4], "texture": "#0"} } }, { "from": [10, 4, 3], "to": [6, 11, 11], "faces": { - "east": {"uv": [4, 0, 0, 3.5], "texture": "#0"}, - "west": {"uv": [0, 0, 4, 3.5], "texture": "#0"} - } - }, - { - "from": [5.5, 1, 0], - "to": [10.5, 4, 1], - "faces": { - "north": {"uv": [4, 1, 6.5, 2.5], "texture": "#0"}, - "east": {"uv": [4, 1, 4.5, 2.5], "texture": "#0"}, - "west": {"uv": [6, 1, 6.5, 2.5], "texture": "#0"}, - "up": {"uv": [4, 0.5, 6.5, 1], "texture": "#0"}, - "down": {"uv": [2.5, 3.5, 3, 4], "texture": "#0"} + "east": {"uv": [4.5, 0.5, 0.5, 4], "texture": "#0"}, + "west": {"uv": [0.5, 0.5, 4.5, 4], "texture": "#0"} } }, { "from": [6.5, 7, 7], "to": [9.5, 13, 13], "faces": { - "north": {"uv": [4.5, 4.5, 6, 7.5], "texture": "#0"}, - "east": {"uv": [0.5, 4.5, 3.5, 7.5], "texture": "#0"}, - "south": {"uv": [4.5, 4.5, 6, 7.5], "texture": "#0"}, - "west": {"uv": [0.5, 4.5, 3.5, 7.5], "texture": "#0"}, - "up": {"uv": [4.5, 4.5, 6, 7.5], "texture": "#0"}, - "down": {"uv": [4.5, 4.5, 6, 7.5], "texture": "#0"} + "north": {"uv": [5.5, 4.5, 7, 7.5], "texture": "#0"}, + "east": {"uv": [1.5, 4.5, 4.5, 7.5], "texture": "#0"}, + "south": {"uv": [5.5, 4.5, 7, 7.5], "texture": "#0"}, + "west": {"uv": [1.5, 4.5, 4.5, 7.5], "texture": "#0"}, + "up": {"uv": [5.5, 4.5, 7, 7.5], "texture": "#0"}, + "down": {"uv": [5.5, 4.5, 7, 7.5], "texture": "#0"} } }, { "from": [6.5, 4, 4], "to": [9.5, 7, 7], "faces": { - "north": {"uv": [4.5, 4.5, 6, 6], "texture": "#0"}, - "up": {"uv": [4.5, 4.5, 6, 6], "texture": "#0"} + "north": {"uv": [5.5, 4.5, 7, 6], "texture": "#0"}, + "up": {"uv": [5.5, 4.5, 7, 6], "texture": "#0"} } }, { - "from": [9.5, 7, 7], - "to": [6.5, 4, 4], - "rotation": {"angle": 0, "axis": "y", "origin": [5, 14.5, 2.5]}, + "from": [6.5, 4, 7], + "to": [9.5, 7, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 5.5, -6.5]}, "faces": { - "south": {"uv": [4.5, 4.5, 6, 6], "rotation": 180, "texture": "#0"}, - "down": {"uv": [4.5, 4.5, 6, 6], "texture": "#0"} + "south": {"uv": [5.5, 4.5, 7, 6], "texture": "#0"}, + "up": {"uv": [5.5, 4.5, 7, 6], "rotation": 180, "texture": "#0"} } }, { - "from": [6.5, -3.5, -0.1], - "to": [9.5, 2.5, 2.9], + "from": [6.5, -3.5, -0.05], + "to": [9.5, 2.5, 2.95], "faces": { - "north": {"uv": [4.5, 4.5, 6, 7.5], "texture": "#0"}, - "up": {"uv": [4.5, 4.5, 6, 6], "texture": "#0"} + "north": {"uv": [5.5, 4.5, 7, 7.5], "texture": "#0"}, + "up": {"uv": [5.5, 4.5, 7, 6], "texture": "#0"} } }, { - "from": [9.5, 2.5, 2.9], - "to": [6.5, -3.5, -0.1], - "rotation": {"angle": 0, "axis": "y", "origin": [5, -13.75, -1.6]}, + "from": [5.5, 1, 0.1], + "to": [10.5, 4, 1], "faces": { - "south": {"uv": [4.5, 4.5, 6, 7.5], "rotation": 180, "texture": "#0"}, - "down": {"uv": [4.5, 4.5, 6, 6], "texture": "#0"} + "north": {"uv": [5, 1, 7.5, 2.5], "texture": "#0"}, + "east": {"uv": [5, 1, 5.5, 2.5], "texture": "#0"}, + "west": {"uv": [7, 1, 7.5, 2.5], "texture": "#0"}, + "up": {"uv": [5, 0.5, 7.5, 1], "texture": "#0"}, + "down": {"uv": [5, 2, 7.5, 2.5], "texture": "#0"} } }, { - "from": [5, 6.1, 4.1], - "to": [11, 6.9, 4.9], + "from": [6, 6.1, 4.1], + "to": [10, 6.9, 4.9], "faces": { - "north": {"uv": [1.5, 3.5, 2, 4], "texture": "#0"}, - "east": {"uv": [1, 3.5, 1.5, 4], "texture": "#0"}, - "south": {"uv": [1.5, 3.5, 2, 4], "texture": "#0"}, - "west": {"uv": [1, 3.5, 1.5, 4], "texture": "#0"}, - "up": {"uv": [1, 3.5, 1.5, 4], "texture": "#0"}, - "down": {"uv": [2.5, 3.5, 3, 4], "texture": "#0"} + "north": {"uv": [2, 4, 2.5, 4.5], "texture": "#0"}, + "south": {"uv": [2, 4, 2.5, 4.5], "texture": "#0"}, + "up": {"uv": [1.5, 4, 2, 4.5], "texture": "#0"}, + "down": {"uv": [2.5, 4, 3, 4.5], "texture": "#0"} } }, { - "from": [5, 7.1, 6.1], - "to": [11, 7.9, 6.9], + "from": [6, 7.1, 6.1], + "to": [10, 7.9, 6.9], "faces": { - "north": {"uv": [1.5, 3.5, 2, 4], "texture": "#0"}, - "east": {"uv": [1, 3.5, 1.5, 4], "texture": "#0"}, - "south": {"uv": [1.5, 3.5, 2, 4], "texture": "#0"}, - "west": {"uv": [1, 3.5, 1.5, 4], "texture": "#0"}, - "up": {"uv": [1, 3.5, 1.5, 4], "texture": "#0"}, - "down": {"uv": [2.5, 3.5, 3, 4], "texture": "#0"} + "north": {"uv": [2, 4, 2.5, 4.5], "texture": "#0"}, + "south": {"uv": [2, 4, 2.5, 4.5], "texture": "#0"}, + "up": {"uv": [1.5, 4, 2, 4.5], "texture": "#0"}, + "down": {"uv": [2.5, 4, 3, 4.5], "texture": "#0"} } }, { - "from": [5, 9.6, 9.6], - "to": [11, 10.4, 10.4], + "from": [5.9, 9.5, 9.5], + "to": [10.1, 10.5, 10.5], "faces": { - "north": {"uv": [1.5, 3.5, 2, 4], "texture": "#0"}, - "east": {"uv": [1, 3.5, 1.5, 4], "texture": "#0"}, - "south": {"uv": [1.5, 3.5, 2, 4], "texture": "#0"}, - "west": {"uv": [1, 3.5, 1.5, 4], "texture": "#0"}, - "up": {"uv": [1, 3.5, 1.5, 4], "texture": "#0"}, - "down": {"uv": [2.5, 3.5, 3, 4], "texture": "#0"} + "north": {"uv": [2, 4, 2.5, 4.5], "texture": "#0"}, + "east": {"uv": [3, 4, 3.5, 4.5], "texture": "#0"}, + "south": {"uv": [2, 4, 2.5, 4.5], "texture": "#0"}, + "west": {"uv": [3, 4, 3.5, 4.5], "texture": "#0"}, + "up": {"uv": [1.5, 4, 2, 4.5], "texture": "#0"}, + "down": {"uv": [2.5, 4, 3, 4.5], "texture": "#0"} + } + }, + { + "from": [2, 4, 2], + "to": [14, 16, 14], + "faces": { + "north": {"uv": [9, 10, 15, 16], "texture": "#0"}, + "east": {"uv": [9, 10, 15, 16], "texture": "#0"}, + "south": {"uv": [9, 10, 15, 16], "texture": "#0"}, + "west": {"uv": [9, 10, 15, 16], "texture": "#0"}, + "up": {"uv": [9, 10, 15, 16], "texture": "#0"} } } ] diff --git a/src/main/resources/assets/create/textures/block/packager.png b/src/main/resources/assets/create/textures/block/packager.png deleted file mode 100644 index ac93e265c5186f93f30d2231e5d5d694b207d6f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1423 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 ZQ+-J4pcS^{|HEGZpo&e5X|JE0qy_* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/packager_door_closed.png b/src/main/resources/assets/create/textures/block/packager_door_closed.png new file mode 100644 index 0000000000000000000000000000000000000000..42909a1d0ae2e0999871bce9ffac15737afaa7a5 GIT binary patch literal 675 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`VW|Fdh=oSR2bOyNLda5m7~ zOivfb5DUSz!Kb|r2MEknnLjrA`PX321}lKCdJ@8Yv#Qmqd?%(4zY6mYzmQ8dTT zZ1KT{)pz6i7e85+sb#>ohT(oVPjkVF1AMd2y5DQmc-_m%dYENXpyEu?RQ4uMjUQ+E zTpD+=Pv2^#f8sl{DuejSrxvf2R=U*)u=*(ExVQh_vU{(wH5 rEnjlub$PF5(|fK1f4XZKZ?aBq*wkNg0vHdpPZJEDu6{1-oD!Mz_Q!oa}D>gnPbVsZNHiT?nbNv6Nv-dXKT=Y`GFX-86(a%r2zGUvY%JWF&ssAI{XLd>M UZmPK_fnmhp>FVdQ&MBb@0IRN>cK`qY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/packager_hatch_closed.png b/src/main/resources/assets/create/textures/block/packager_hatch_closed.png deleted file mode 100644 index bc2f9b7796e8992b1a087d070a249e4cf95b0d27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 994 zcmV<810DQ{P)EX>4Tx04R}tkv&MmKpe$iQ%glEf)){R2vVIah>AE$6^me@v=v%)FuC+YXws0R zxHt-~1qVMCs}3&Cx;nTDg5U>;o12rOi`{MF9Qi#V`bknR+6jGx_(bAarW+RVI`Q*kx9)Fhl#~v8_R9XN`^{2MI2F7jq-)8 z%L?Z$&T6^Jn)l={4CS@uG}mbkA&x~Pkc0>sRcxRP3sG7%QcR?1Kjz^dbo@zj$>iDq zBgZ@{P$4;f@IUz7ty!3yaFaqYAn;<_A0t3;7iiRM`}^3o8z+GO8Mx9~{z@H~`6Rv8 z(jrGd&o*#z-O}Ve;Bp5Tc+w?9awI=Zp-=$c&*+y{D4^000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2jvA85-J!}YJ|c7000?uMObu0Z*6U5Zgc=ca%Ew3 zWn>_CX>@2HM@dakSAh-}0005GNklD1{QKqE3hQd)K3IwqtA5Bb79D7lOjqk%0<~BLSASKg` zH1E!<(X%s^7fvMeLdb8ED-?GXSFQhD`kYic6F+m8viZr&hCQO0V+?@Rj*lZAZO+UDK&RcHs#K|2ISv3z^?Io}NmGOnblQzG1GlB^$mhe= zi|l>+jMf*K6r99W=u0Vyho)>GrL&gA8Uo<)eN{T9;;#Y5zY=N-3cnW;M3L1h&mV3~{{?F@K0BalZT`;v0n7E$Dl6(o QX#fBK07*qoM6N<$g2)cJIsgCw diff --git a/src/main/resources/assets/create/textures/block/packager_hatch_open.png b/src/main/resources/assets/create/textures/block/packager_hatch_open.png deleted file mode 100644 index a3f4f37afa46a7469ca7e041e8995b9f171ff385..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 865 zcmV-n1D^beP)EX>4Tx04R}tkv&MmKpe$iQ%glEf)){R2vVIah>AE$6^me@v=v%)FuC+YXws0R zxHt-~1qVMCs}3&Cx;nTDg5U>;o12rOi`{MF9Qi#V`bknR+6jGx_(bAarW+RVI`Q*kx9)Fhl#~v8_R9XN`^{2MI2F7jq-)8 z%L?Z$&T6^Jn)l={4CS@uG}mbkA&x~Pkc0>sRcxRP3sG7%QcR?1Kjz^dbo@zj$>iDq zBgZ@{P$4;f@IUz7ty!3yaFaqYAn;<_A0t3;7iiRM`}^3o8z+GO8Mx9~{z@H~`6Rv8 z(jrGd&o*#z-O}Ve;Bp5Tc+w?9awI=Zp-=$c&*+y{D4^000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2jvA85-SS6$i&M4000?uMObu0Z*6U5Zgc=ca%Ew3 zWn>_CX>@2HM@dakSAh-}0003vNklky7&Q%i@S@v37Y8oSTM{Xz)Tf!-EcMm zF;HS_FtW7^N6kfixo!%P>mA*(yLj!-}0x z4*@C8d^fjZ5FZR~X>B_PWN;REL;?l%ltGxWVyS%@P>{XE)7O>#DXWNxqK?Hn*;b&C zWQl7;iF1B#Zfaf$gL6@8Vo7R>LV0FMhJw4NZ$Nk>pE%HRM^6{W5DUS%lMVe2I|#U5 z=ip>zHVR+RV8<%!Sim@6QMCL6W0B~kUrdfIeM+_>GK|X2o;#oD{<$cy`;^DEp7j6! zer~pwPTL&0W|dZ(Y;OMX+HJY<7w?ux-TrD-lfUoqMUBd}52qfUpJTV-`{&9u7L~ZT z`O*AHL&IN$y^=3{>e2@lY3suE1lt}t9M@U+A1{h@Z+M1NgX2o>+=5HjabhrxX`JM zE5BKn!$4*Bw<-Deq8%r{->R@OZd-o(?pC?R7khK=^S#!XB+2OcE^7JPRAKG&x)sJu zd~J>o?=j|VUvOKpU;ps~MK3XiXN_L3rZ+2JQ{nPf3_ehk?ZOyvbaqk21|#JQ&X+n) kad&*TloQ%1zwPBYk4UlE6M-R4`vk$@>FVdQ&MBb@0C#ZHlmGw# delta 766 zcmVpveBYy#eX+uL$Nkc;*aB^>EX>4Tx04R}tkv&MmKpe$iQ%glE9hyPJ zAwzYtAS&W0RV;#q(pG5I!Q|2}Xws6TxHt-~1qVMCs}3&Cx;nTDg5U>;o12rOis^dzd7t}p45|f_0X~U%j@1o|c!PLm)2egcCl*;*R*BDv#|^q5@gvt2m)|&-92R({ zXk^p##3Hd&>S3jaS=rEtr-`Ggrc=IazC#dTLx_JGSBVCbnX8?qz$X$r+6 z@P0<$lm{ZWz`&Z@TW24q4?vc>TD}1e4uP=}Wv_d@yCc81w|~!c`uhPsY;uy|ZckMJ z000JJOGiWibO3AsVUB5@`jMDWe>q7+K~y-)rBgd@!axvx8zDvGHOO2cMbcBG!w4?0 zXQ0X*IDoH$TP}bV(^0rjiW~u>1+(R($*lZYq$qjKj^2)D-%mJkEUrxhe*k!Se)11^ z3qn-YQI&^6Y5j=uP;}y|Ix5L+eu|CS5@W4ljNx;AL6Rg`q$^IQV?;!rXJ$l1!yX8B zyPX06V+_BSdj$ZCbmil8zU1H(`b|667au3napx{*K@gH15qZ8o+3*+zA=zy^eG8*| z3(}U|wj&K66o`mW!vtv)L=(-2+L8wFWbLzxBx?oiAB7 wF=$~zESK9We2vyC>l&2t3+-?r(_NMo@aw*UYD07*qoM6N<$f?jiCGynhq diff --git a/src/main/resources/assets/create/textures/block/stock_ticker.png b/src/main/resources/assets/create/textures/block/stock_ticker.png index b0fb612124650f161779b08107210c23c003875c..97f59289ffd1996c2b8df8af27a24ca84091e034 100644 GIT binary patch delta 1102 zcmV-U1hMFFM5U4Q(q8>uE z7pWp5c&UgMDK)o<^`b%#qKF3twHJlnTJaD)v(>-hSgXtKR zIbQngmI9Dn&wnua{dH&i(=VKH*5c-U9U%g$4}fbwUOnF4ba~mpl{$v)tcjxXe$7Pe2LY6YSFU^xQfk<`Q^%E{Q;-C&K+d=Lm;wV?JNx#KQxQ{di|Luv~r0Skuc=udn|4hh(px1D+88 z2!~sU^h5yA5?X^JFKoo)91AsZ{J|gr)kjdZkAF2vm4@|N)*xFbkzCn=z<$sijiQ%K z3WiCOY1N9*vdHGjfL#N+UO^4`&`TzrT^=a_JM7}-`FwF#1jJNJ<&3RIaZXNwX9To_ zCgogw6Ie|yvyjLG%hI0NnGAQXp9AdNiUM=Lr&C3eD@8iHT1c)GnffKYtIPf8*mIwI z;eX2bv)0IHyK_5{-+I(XVC?cu<-mFl@Wj9|tG)xEu?qmH6K>C~+5ZCv(Q{#I=m3zr zz;6fJ-3d@FLN7fR%nP{^fuQ}(OV0t`eEuZ+OhK&+>h)YN+KN@KY(kZ-ThHAXyL?lb z`e4OM0X`t*>Aq(B>+f~O&Yw`62#7Gc^?!V)6o^sk#z<$^u8R7TTlbv*ODO_wJr_kI z;H0Fg=k8v2V=B2~?L=ffopjdHAad)ukj|QnmL-|>iU8~`3a#y(-UOhg=Wb_W?bh?d zf<(Zr=LN%b^c$dLT9TfNS$=2)>h(ON`q7PA9n=@$R;{)#0teCaLm{vqJ>L(!I!DBb z0PIcA55u`bz)R0Xo4LoQbl@KK-0i&gXxRCFC~^$&&D4EsDVyJMpK$*2h&_t`1;3_> UExc;=s{jB107*qoM6N<$f?%8|f&c&j delta 1717 zcmV;m21@zj2*eGLBYy#eX+uL$Nkc;*aB^>EX>4Tx04R}tkv&MmKpe$iQ;Q-M2Q!E$ zWT;LSL`58>ibb$c+6t{Ym|Xe=O&XFE7e~Rh;NZt%)xpJCR|i)?5c~jfb8}L3krMxx z6k5c1aNLh~_a1le0HIM~n$gQ(SFRwKjiw8nN#U3cIB z000JJOGiWibO3AsVUB5@`Tzg`32;bRa{vG?BLDy{BLR4&KXw2B00(qQO+^Rg1r!ey z7dz*Ah5!Hn8FWQhbVF}#ZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X4i^9b1e{4kK~z}7 z&6ZDS9DijP#(%RrJK1zLn?{prx(%T=5^Wn;QL13+Nd&bBQ4zIRN)7?Nw2*p>J+uW6 zHRwSQdT1fi(t~ZSie7rDNW~OkV`{Jv2uXGto77~J-Pu3$C!dGue3|_dlO_>-FFP~) z&G$av^FHtU46G38n;(i_zdR`Tk3#_v;<_Mr3x8u|ibPi%#>f=L@FWvsS%ykaRK4`+ z7w47W{a5`jh~%@o09g1dBcC@uzP0SWn78HiVxhGIYIaa|a{T#+Yk?`SAnypWmW z`hT~V<^4;qzquli_U0{Eu0RVbd~@R{#>f-^iLN$YeepB2a0q}|yM$S^JOJcwar5#Y zw0AUAB?p)@OJzyt%u>}FvuMea`|-@4PiSta<9^m#-`r3KijeI1p&BDoH52=B?)*h% zEn-q53bTt|vb^Q;?*1-zwt5vFpLV!5G=B;K?55>B0PukN${3$^)~sYbs^QpzmUtbO zD`<%;>}*v72g}kDuaoP2paAOgAAGL>oa*lr3z<3Q%o6k23|GJYL3x;VQX>kM>rw3g zmX)dG5>Z3dCGamkK0TnUx0iiE0ocxxOcacW8p3v#WEYeH`1!{(BC#V;_JWZ%*nj`Z zM+(6B$VD-c&e6Uj#?G$yRs^br6|`_TP{M3kIrTd4zkJCl2awp2;Le|8#A5Z{SjZLV ze5yk(YT4EbOh5Ro9gZ!SwM&xTYeS=Dbo-~yTP|^3tu8?XkH<{16y!G;~hXS3MQ}|!Rrogyz`ha+HPusfe zSlOtb0~~nz5fSVF*$Hk%Cj>;gU|QT9oA^Y!KrFyg@VXhebTA_%1AlQ{<=oXflK$Yd^2g`r7jCm?I>dEV`gyHLZhLG^;y!cZ zH=zdoJorgP{j!i+;>-Ir)oW#bzEY%S?upfaWd5F6)szLsDS1{Cp!UY<+aw zvIZ*sJg8*+sPuEk7UWCLs(!xF2!Ht^%v&z+yw<_7 zLwmg*)-@V+4J{N#3x!c53dfIh(bL_@qUmfd0Du#{N$wg&%%bHb5JKufuM4wiI+#U^ zyGD@{y~zzF4bF;?FG7F94GfNYeQrDCOAe-GGheWX>na0-qjF+yBzdqyRNv3HC!(Zh z3-ok%{_6(m*#g@W(JpoSc`$ifV~kDzD!7!oBc>K|tFCKn^ak@k?A~3G2Rv{H00000 LNkvXXu0mjfc>6h| From 2bfbb837bf581f64d3a72639990f30adf7a0bdbc Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Tue, 14 Nov 2023 17:36:35 +0100 Subject: [PATCH 022/515] Basic Routing - Stock ticker ui can now specify an address - Added ui for package (address) filters - Packagers can now have the target inventory above or below them - Logistical Link -> Packager Link - Updated assets by Kryppers --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 18 +-- .../assets/create/blockstates/packager.json | 32 +++-- ...ogistical_link.json => packager_link.json} | 24 ++-- .../resources/assets/create/lang/en_ud.json | 15 ++- .../resources/assets/create/lang/en_us.json | 15 ++- .../create/models/item/logistical_link.json | 3 - .../create/models/item/packager_link.json | 3 + ...ogistical_link.json => packager_link.json} | 4 +- .../minecraft/tags/blocks/mineable/axe.json | 2 +- .../tags/blocks/mineable/pickaxe.json | 2 +- .../simibubi/create/AllBlockEntityTypes.java | 8 +- .../java/com/simibubi/create/AllBlocks.java | 29 +++-- .../box/PackageClientInteractionHandler.java | 34 +++++ .../content/logistics/box/PackageItem.java | 31 ++++- .../filter/AbstractFilterScreen.java | 4 +- .../content/logistics/filter/FilterItem.java | 33 +++-- .../logistics/filter/FilterItemStack.java | 11 +- .../logistics/filter/FilterScreenPacket.java | 13 +- .../logistics/filter/PackageFilterMenu.java | 4 +- .../logistics/filter/PackageFilterScreen.java | 74 ++++++++++- .../logistics/packager/PackagerBlock.java | 50 ++++++- .../packager/PackagerBlockEntity.java | 96 +++++++++----- .../logistics/packager/PackagerGenerator.java | 33 +++++ .../logistics/packager/PackagingRequest.java | 38 ++++++ .../PackagerLinkBlock.java} | 17 ++- .../PackagerLinkBlockEntity.java} | 51 ++++++-- .../PackagerLinkBlockItem.java} | 10 +- .../LogisticalWorkstationBlockEntity.java | 22 ++-- .../PackageOrderRequestPacket.java | 8 +- .../stockTicker/StockTickerBlockEntity.java | 27 +++- .../stockTicker/StockTickerRequestScreen.java | 117 +++++++++++++---- .../create/foundation/gui/AllGuiTextures.java | 2 +- .../infrastructure/config/CLogistics.java | 6 +- .../assets/create/lang/default/interface.json | 13 +- .../models/block/logistical_link/block.json | 123 ------------------ .../block/logistical_link/block_powered.json | 123 ------------------ .../create/models/block/packager/block.json | 4 +- .../models/block/packager/block_vertical.json | 96 ++++++++++++++ .../models/block/packager/hatch_closed.json | 4 +- .../create/models/block/packager/tray.json | 3 +- .../models/block/packager_link/block.json | 123 ++++++++++++++++++ .../block/packager_link/block_powered.json | 123 ++++++++++++++++++ .../create/textures/block/logistical_link.png | Bin 1265 -> 0 bytes .../textures/block/logistical_link_side.png | Bin 278 -> 0 bytes .../block/logistical_link_side_powered.png | Bin 277 -> 0 bytes .../create/textures/block/packager_link.png | Bin 0 -> 3988 bytes .../textures/block/packager_link_side.png | Bin 0 -> 278 bytes .../block/packager_link_side_powered.png | Bin 0 -> 276 bytes .../assets/create/textures/gui/filters_2.png | Bin 0 -> 1049 bytes 49 files changed, 983 insertions(+), 465 deletions(-) rename src/generated/resources/assets/create/blockstates/{logistical_link.json => packager_link.json} (52%) delete mode 100644 src/generated/resources/assets/create/models/item/logistical_link.json create mode 100644 src/generated/resources/assets/create/models/item/packager_link.json rename src/generated/resources/data/create/loot_tables/blocks/{logistical_link.json => packager_link.json} (75%) create mode 100644 src/main/java/com/simibubi/create/content/logistics/box/PackageClientInteractionHandler.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/packager/PackagerGenerator.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/packager/PackagingRequest.java rename src/main/java/com/simibubi/create/content/logistics/{logisticalLink/LogisticalLinkBlock.java => packagerLink/PackagerLinkBlock.java} (84%) rename src/main/java/com/simibubi/create/content/logistics/{logisticalLink/LogisticalLinkBlockEntity.java => packagerLink/PackagerLinkBlockEntity.java} (77%) rename src/main/java/com/simibubi/create/content/logistics/{logisticalLink/LogisticalLinkBlockItem.java => packagerLink/PackagerLinkBlockItem.java} (69%) delete mode 100644 src/main/resources/assets/create/models/block/logistical_link/block.json delete mode 100644 src/main/resources/assets/create/models/block/logistical_link/block_powered.json create mode 100644 src/main/resources/assets/create/models/block/packager/block_vertical.json create mode 100644 src/main/resources/assets/create/models/block/packager_link/block.json create mode 100644 src/main/resources/assets/create/models/block/packager_link/block_powered.json delete mode 100644 src/main/resources/assets/create/textures/block/logistical_link.png delete mode 100644 src/main/resources/assets/create/textures/block/logistical_link_side.png delete mode 100644 src/main/resources/assets/create/textures/block/logistical_link_side_powered.png create mode 100644 src/main/resources/assets/create/textures/block/packager_link.png create mode 100644 src/main/resources/assets/create/textures/block/packager_link_side.png create mode 100644 src/main/resources/assets/create/textures/block/packager_link_side_powered.png create mode 100644 src/main/resources/assets/create/textures/gui/filters_2.png diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 2e624c0bc8..e12e060bd0 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2023-11-14T01:09:47.7683331 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2023-11-14T17:22:08.2034016 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -301,7 +301,6 @@ b9934a558e1b495403dc2c71ffb43cce7d396013 assets/create/blockstates/lime_seat.jso ba181485f219d3ae23509a7edf28e25d9edb10f4 assets/create/blockstates/lime_valve_handle.json 654e845cebed82b7afbcf81380921e0a475b01e9 assets/create/blockstates/linear_chassis.json e195e82e4d0c1fc20474535bc9068cbb77a5e175 assets/create/blockstates/lit_blaze_burner.json -2b61a97b3ef9a35067e5ab31045ff4a07f6ac660 assets/create/blockstates/logistical_link.json 296186b196af94e1ab3f7e8a3254f6d31ae47a5c assets/create/blockstates/magenta_nixie_tube.json f150922cbed1c05fb3892d4ac91eb471234252e2 assets/create/blockstates/magenta_sail.json bb1ab5c70647933400b3a99ef9d166ba5e3d4709 assets/create/blockstates/magenta_seat.json @@ -347,7 +346,8 @@ ac536ae742c12e97bfd0b2483c87ff29f3935eaf assets/create/blockstates/oxidized_copp 110a6c19bcc9f044e5e982ac6e4b295b03ec0145 assets/create/blockstates/oxidized_copper_tiles.json 3f3924f0f0e368edfa04f4fdd6d6c2319276ddfe assets/create/blockstates/oxidized_copper_tile_slab.json 5e634cfb9abb06d8b29f39d751fc56b28ea5a9cd assets/create/blockstates/oxidized_copper_tile_stairs.json -9e6d155ff36bc48ade92a5bf83e0a3b77bcd1651 assets/create/blockstates/packager.json +9cb7470bcf22eb84f296730b9727f5c01c174e22 assets/create/blockstates/packager.json +0f204afc6712a08d2db84bb07a0a49927f3127a6 assets/create/blockstates/packager_link.json 36742cc6ce052ead143366d31b11e828a525c1b8 assets/create/blockstates/peculiar_bell.json 53d102e706d53cb2c0dbc0bc11da828084a43519 assets/create/blockstates/pink_nixie_tube.json 213da5c04a33ae8ae7c0a4dec9844bbb6d670e33 assets/create/blockstates/pink_sail.json @@ -588,8 +588,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -338262f86608006c8325313afa0fb6858eaefdda assets/create/lang/en_ud.json -2ab3eaf01b70fef2c15557d6678b9b8410c06b6e assets/create/lang/en_us.json +711da58b5b20fb40868de441134f5875d1231b38 assets/create/lang/en_ud.json +7c5765fe164103972a783ec113aa637d7bcd1911 assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -1996,7 +1996,6 @@ fba1e7d1cad39c89976b427db62544d80f47ad5d assets/create/models/item/limestone_pil d0f4148bdb0a905e68f54b5dfd829fd47e528fea assets/create/models/item/lime_valve_handle.json 1d30f9b525e8e9736b34a92f848e235c71fd6bd8 assets/create/models/item/linear_chassis.json 8f622f5f79446f6060d9e8815205fce919c8c829 assets/create/models/item/linked_controller.json -b517f437b0f59c5b7d551f515433371be5b9327b assets/create/models/item/logistical_link.json ad6fd371ee989c9c3c21e762273e8a4e903f0af8 assets/create/models/item/magenta_seat.json 7c0e3f91e5ab029473736deffb2b2aab9d4763c7 assets/create/models/item/magenta_toolbox.json 6d82582e5afea919927606b20a74cbda5223956f assets/create/models/item/magenta_valve_handle.json @@ -2042,6 +2041,7 @@ c9c7ccdb68de2e77cd9f7053fab19493dd30a985 assets/create/models/item/oxidized_copp f1af7c5f3840efc3ae07940ee6719eb3417a0e1a assets/create/models/item/oxidized_copper_tile_slab.json ef2fe68d407a03bf1ed8f2d2f3e7323777d061bb assets/create/models/item/oxidized_copper_tile_stairs.json b21a1f3ee7de3e17f69d27fd13ae6b23b62aa22c assets/create/models/item/packager.json +a8538df19e47fe37401c9fbedbb867b5d612a51b assets/create/models/item/packager_link.json 5b974e55caffdbfc2156eb8b59dd99db12243bd3 assets/create/models/item/package_filter.json 76aeceb41bb7df873dbafe1bd5e26deb24abf93f assets/create/models/item/peculiar_bell.json df13d4281dc45041ecd93504d45daef61d070581 assets/create/models/item/pink_seat.json @@ -3250,7 +3250,6 @@ c6bb0877c537dda15469934383dc45c608bfd1a4 data/create/loot_tables/blocks/limeston 1a3ed7cd5660d7ea014956ea642e0b07d89bc297 data/create/loot_tables/blocks/lime_valve_handle.json baf70f9eb579f20b232a2af4e6b00a54f84844e6 data/create/loot_tables/blocks/linear_chassis.json e4c0f8ca822cf7555bd011825b430c3c735160d4 data/create/loot_tables/blocks/lit_blaze_burner.json -d854675ced4276a477b3ec6cbd02cda1de6485b3 data/create/loot_tables/blocks/logistical_link.json 6bd8b044cc9c69a5268372e5436f556da2c1bf21 data/create/loot_tables/blocks/magenta_nixie_tube.json b4d06c9ce7fbec0f23bb6dbc446b77d070f06775 data/create/loot_tables/blocks/magenta_sail.json 300e480d8e43e3a4ca19a92ae1360c02f7c5accd data/create/loot_tables/blocks/magenta_seat.json @@ -3297,6 +3296,7 @@ f47a01824093455030fca66e7b8a39bcfc61d219 data/create/loot_tables/blocks/oxidized 4d815b361af81bd0c0e14c853ca54ad3cde66a57 data/create/loot_tables/blocks/oxidized_copper_tile_slab.json d599ef03d1b69e4367ec0dea78f52c1964c99f9b data/create/loot_tables/blocks/oxidized_copper_tile_stairs.json ab8cee7abd7dd92428bf7d8f0f5edd35082401a4 data/create/loot_tables/blocks/packager.json +e5df1b8ead9e575ed06f2040a7c9cc72c7a71b49 data/create/loot_tables/blocks/packager_link.json 58bd9fe9d6706998bfbda3b077cfd0a740972091 data/create/loot_tables/blocks/peculiar_bell.json 4d7724df6fefee4512c4f7886d0e103d1dc39510 data/create/loot_tables/blocks/pink_nixie_tube.json 85811771fbc36f645fdb9f510639715399503c99 data/create/loot_tables/blocks/pink_sail.json @@ -4298,8 +4298,8 @@ c741ba83b562ae3459d7c4f2db69537f549ea411 data/forge/tags/items/tools/wrench.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/dripstone_replaceable_blocks.json e3321ff14704c031a2c16953b7e391f4f24dd70b data/minecraft/tags/blocks/impermeable.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/lush_ground_replaceable.json -045e46b606c38fa41a2457dcf5c20c78e1f5a4a9 data/minecraft/tags/blocks/mineable/axe.json -b986b07ea27f750608501b410eae7b1dca04d833 data/minecraft/tags/blocks/mineable/pickaxe.json +048aac62c140e80fdf697ac3c69c491a885a1fa2 data/minecraft/tags/blocks/mineable/axe.json +3e4ab40c4ba66211e508e3aaceaede2e020527a2 data/minecraft/tags/blocks/mineable/pickaxe.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/moss_replaceable.json 0c13aae0eeb99e89febe8dbe5e002af2ff843a9e data/minecraft/tags/blocks/needs_iron_tool.json 3cb2a92cbdf32ed5978f740dc378d363306c3e84 data/minecraft/tags/blocks/needs_stone_tool.json diff --git a/src/generated/resources/assets/create/blockstates/packager.json b/src/generated/resources/assets/create/blockstates/packager.json index bdb9b2338c..7994be8eca 100644 --- a/src/generated/resources/assets/create/blockstates/packager.json +++ b/src/generated/resources/assets/create/blockstates/packager.json @@ -1,34 +1,46 @@ { "variants": { + "facing=down,powered=false": { + "model": "create:block/packager/block_vertical" + }, + "facing=down,powered=true": { + "model": "create:block/packager/block_vertical" + }, "facing=east,powered=false": { "model": "create:block/packager/block", - "y": 90 + "y": 270 }, "facing=east,powered=true": { "model": "create:block/packager/block", - "y": 90 + "y": 270 }, "facing=north,powered=false": { - "model": "create:block/packager/block" + "model": "create:block/packager/block", + "y": 180 }, "facing=north,powered=true": { - "model": "create:block/packager/block" + "model": "create:block/packager/block", + "y": 180 }, "facing=south,powered=false": { - "model": "create:block/packager/block", - "y": 180 + "model": "create:block/packager/block" }, "facing=south,powered=true": { - "model": "create:block/packager/block", - "y": 180 + "model": "create:block/packager/block" + }, + "facing=up,powered=false": { + "model": "create:block/packager/block_vertical" + }, + "facing=up,powered=true": { + "model": "create:block/packager/block_vertical" }, "facing=west,powered=false": { "model": "create:block/packager/block", - "y": 270 + "y": 90 }, "facing=west,powered=true": { "model": "create:block/packager/block", - "y": 270 + "y": 90 } } } \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/logistical_link.json b/src/generated/resources/assets/create/blockstates/packager_link.json similarity index 52% rename from src/generated/resources/assets/create/blockstates/logistical_link.json rename to src/generated/resources/assets/create/blockstates/packager_link.json index aee776fb2a..e0d5a89a8c 100644 --- a/src/generated/resources/assets/create/blockstates/logistical_link.json +++ b/src/generated/resources/assets/create/blockstates/packager_link.json @@ -1,54 +1,54 @@ { "variants": { "facing=down,powered=false": { - "model": "create:block/logistical_link/block", + "model": "create:block/packager_link/block", "x": 180 }, "facing=down,powered=true": { - "model": "create:block/logistical_link/block_powered", + "model": "create:block/packager_link/block_powered", "x": 180 }, "facing=east,powered=false": { - "model": "create:block/logistical_link/block", + "model": "create:block/packager_link/block", "x": 90, "y": 90 }, "facing=east,powered=true": { - "model": "create:block/logistical_link/block_powered", + "model": "create:block/packager_link/block_powered", "x": 90, "y": 90 }, "facing=north,powered=false": { - "model": "create:block/logistical_link/block", + "model": "create:block/packager_link/block", "x": 90 }, "facing=north,powered=true": { - "model": "create:block/logistical_link/block_powered", + "model": "create:block/packager_link/block_powered", "x": 90 }, "facing=south,powered=false": { - "model": "create:block/logistical_link/block", + "model": "create:block/packager_link/block", "x": 90, "y": 180 }, "facing=south,powered=true": { - "model": "create:block/logistical_link/block_powered", + "model": "create:block/packager_link/block_powered", "x": 90, "y": 180 }, "facing=up,powered=false": { - "model": "create:block/logistical_link/block" + "model": "create:block/packager_link/block" }, "facing=up,powered=true": { - "model": "create:block/logistical_link/block_powered" + "model": "create:block/packager_link/block_powered" }, "facing=west,powered=false": { - "model": "create:block/logistical_link/block", + "model": "create:block/packager_link/block", "x": 90, "y": 270 }, "facing=west,powered=true": { - "model": "create:block/logistical_link/block_powered", + "model": "create:block/packager_link/block_powered", "x": 90, "y": 270 } diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index c32ba89285..4b20b926ec 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -513,7 +513,6 @@ "block.create.limestone_pillar": "ɹɐןןıԀ ǝuoʇsǝɯıꞀ", "block.create.linear_chassis": "sıssɐɥƆ ɹɐǝuıꞀ", "block.create.lit_blaze_burner": "ɹǝuɹnᗺ ǝzɐןᗺ ʇıꞀ", - "block.create.logistical_link": "ʞuıꞀ ןɐɔıʇsıboꞀ", "block.create.magenta_nixie_tube": "ǝqn⟘ ǝıxıN ɐʇuǝbɐW", "block.create.magenta_sail": "ןıɐS ɐʇuǝbɐW", "block.create.magenta_seat": "ʇɐǝS ɐʇuǝbɐW", @@ -562,6 +561,7 @@ "block.create.oxidized_copper_tile_stairs": "sɹıɐʇS ǝןı⟘ ɹǝddoƆ pǝzıpıxO", "block.create.oxidized_copper_tiles": "sǝןı⟘ ɹǝddoƆ pǝzıpıxO", "block.create.packager": "ɹǝbɐʞɔɐԀ", + "block.create.packager_link": "ʞuıꞀ ɹǝbɐʞɔɐԀ", "block.create.peculiar_bell": "ןןǝᗺ ɹɐıןnɔǝԀ", "block.create.peculiar_bell.tooltip.summary": "˙˙˙sʇɔǝɟɟǝ-ǝpıs ǝʌɐɥ ʎɐɯ ‾ǝɹıℲ ןnoS‾ uǝdo ǝʌoqɐ ʇɥbıɹ ʇı buıɔɐןԀ ˙‾ןןǝᗺ ssɐɹᗺ‾ ǝʌıʇɐɹoɔǝp Ɐ", "block.create.pink_nixie_tube": "ǝqn⟘ ǝıxıN ʞuıԀ", @@ -1164,9 +1164,12 @@ "create.gui.sequenced_gearshift.title": "ʇɟıɥsɹɐǝ⅁ pǝɔuǝnbǝS", "create.gui.speedometer.title": "pǝǝdS uoıʇɐʇoᴚ", "create.gui.stock_ticker.checking_stocks": "˙˙˙sʞɔoʇs buıʞɔǝɥƆ", + "create.gui.stock_ticker.confirm_order": "ɹǝpɹO ɯɹıɟuoƆ", "create.gui.stock_ticker.inventories_empty": "ʎʇdɯƎ ǝɹɐ sǝıɹoʇuǝʌuI pǝʞuıꞀ", "create.gui.stock_ticker.no_packagers_linked": "pǝʞuıꞀ sɹǝbɐʞɔɐԀ oN", "create.gui.stock_ticker.no_search_results": "punoɟ sɯǝʇı buıɥɔʇɐɯ oN", + "create.gui.stock_ticker.package_adress": "ssǝɹppⱯ ǝbɐʞɔɐԀ", + "create.gui.stock_ticker.search_items": "sɯǝʇI ɥɔɹɐǝS", "create.gui.stressometer.capacity": "ʎʇıɔɐdɐƆ buıuıɐɯǝᴚ", "create.gui.stressometer.no_rotation": "uoıʇɐʇoᴚ oN", "create.gui.stressometer.overstressed": "pǝssǝɹʇsɹǝʌO", @@ -1304,11 +1307,6 @@ "create.linked_controller.frequency_slot_2": "ᄅ# ˙bǝɹℲ '%1$s :puıqʎǝʞ", "create.linked_controller.key_bound": "%1$s oʇ punoq ʎɔuǝnbǝɹℲ", "create.linked_controller.press_keybind": "ʎǝʞ ǝʌıʇɔǝdsǝɹ ǝɥʇ oʇ ʎɔuǝnbǝɹɟ sıɥʇ puıq oʇ '%6$s ɹo %5$s '%4$s '%3$s '%2$s '%1$s ssǝɹԀ", - "create.logistical_link.clear": "uoıʇɔǝןǝs pǝɹɐǝןƆ", - "create.logistical_link.invalid": "buıɔɐןd ǝɹoɟǝq ɹǝʇsıbǝᴚ ɥsɐƆ ɹo ɹǝʞɔı⟘ ʞɔoʇS ɐ ubıssⱯ", - "create.logistical_link.set": "pǝʇɔǝןǝs uoıʇɐʇsʞɹoʍ pǝʇǝbɹɐ⟘", - "create.logistical_link.success": "ʇǝbɹɐʇ ןɐɔıʇsıboן oʇ punoq ʎןןnɟssǝɔɔnS", - "create.logistical_link.too_far": "ǝɹǝɥ ɯoɹɟ ɹɐɟ ooʇ sı uoıʇɐʇsʞɹoʍ pǝʇǝbɹɐ⟘", "create.logistics.crafter.click_to_merge": "sǝıɹoʇuǝʌuI ǝbɹǝɯ oʇ ʞɔıןƆ", "create.logistics.crafter.click_to_separate": "sǝıɹoʇuǝʌuI ǝʇɐɹɐdǝs oʇ ʞɔıןƆ", "create.logistics.crafter.connected": "sɹǝʇɟɐɹƆ pǝʇɔǝuuoƆ", @@ -1355,6 +1353,11 @@ "create.orientation.diagonal": "ןɐuobɐıᗡ", "create.orientation.horizontal": "ןɐʇuozıɹoH", "create.orientation.orthogonal": "ןɐuoboɥʇɹO", + "create.packager_link.clear": "uoıʇɔǝןǝs pǝɹɐǝןƆ", + "create.packager_link.invalid": "buıɔɐןd ǝɹoɟǝq ɹǝʇsıbǝᴚ ɥsɐƆ ɹo ɹǝʞɔı⟘ ʞɔoʇS ɐ ubıssⱯ", + "create.packager_link.set": "pǝʇɔǝןǝs uoıʇɐʇsʞɹoʍ pǝʇǝbɹɐ⟘", + "create.packager_link.success": "ʇǝbɹɐʇ oʇ punoq ʎןןnɟssǝɔɔnS", + "create.packager_link.too_far": "ǝɹǝɥ ɯoɹɟ ɹɐɟ ooʇ sı uoıʇɐʇsʞɹoʍ pǝʇǝbɹɐ⟘", "create.ponder.analog_lever.header": "ɹǝʌǝꞀ boןɐuⱯ ǝɥʇ buısn sןɐubıs buıןןoɹʇuoƆ", "create.ponder.analog_lever.text_1": "ɹǝʍod ǝuoʇspǝɹ ɟo ǝɔɹnos ǝsıɔǝɹd puɐ ʇɔɐdɯoɔ ɐ ɹoɟ ǝʞɐɯ sɹǝʌǝꞀ boןɐuⱯ", "create.ponder.analog_lever.text_2": "ʇndʇno ɹǝʍod boןɐuɐ sʇı ǝsɐǝɹɔuı oʇ ʞɔıןɔ-ʇɥbıᴚ", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index c893cf1ed9..d0e5123a99 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -513,7 +513,6 @@ "block.create.limestone_pillar": "Limestone Pillar", "block.create.linear_chassis": "Linear Chassis", "block.create.lit_blaze_burner": "Lit Blaze Burner", - "block.create.logistical_link": "Logistical Link", "block.create.magenta_nixie_tube": "Magenta Nixie Tube", "block.create.magenta_sail": "Magenta Sail", "block.create.magenta_seat": "Magenta Seat", @@ -562,6 +561,7 @@ "block.create.oxidized_copper_tile_stairs": "Oxidized Copper Tile Stairs", "block.create.oxidized_copper_tiles": "Oxidized Copper Tiles", "block.create.packager": "Packager", + "block.create.packager_link": "Packager Link", "block.create.peculiar_bell": "Peculiar Bell", "block.create.peculiar_bell.tooltip.summary": "A decorative _Brass Bell_. Placing it right above open _Soul Fire_ may have side-effects...", "block.create.pink_nixie_tube": "Pink Nixie Tube", @@ -1164,9 +1164,12 @@ "create.gui.sequenced_gearshift.title": "Sequenced Gearshift", "create.gui.speedometer.title": "Rotation Speed", "create.gui.stock_ticker.checking_stocks": "Checking stocks...", + "create.gui.stock_ticker.confirm_order": "Confirm Order", "create.gui.stock_ticker.inventories_empty": "Linked Inventories are Empty", "create.gui.stock_ticker.no_packagers_linked": "No Packagers Linked", "create.gui.stock_ticker.no_search_results": "No matching items found", + "create.gui.stock_ticker.package_adress": "Package Address", + "create.gui.stock_ticker.search_items": "Search Items", "create.gui.stressometer.capacity": "Remaining Capacity", "create.gui.stressometer.no_rotation": "No Rotation", "create.gui.stressometer.overstressed": "Overstressed", @@ -1304,11 +1307,6 @@ "create.linked_controller.frequency_slot_2": "Keybind: %1$s, Freq. #2", "create.linked_controller.key_bound": "Frequency bound to %1$s", "create.linked_controller.press_keybind": "Press %1$s, %2$s, %3$s, %4$s, %5$s or %6$s, to bind this frequency to the respective key", - "create.logistical_link.clear": "Cleared selection", - "create.logistical_link.invalid": "Assign a Stock Ticker or Cash Register before placing", - "create.logistical_link.set": "Targeted workstation selected", - "create.logistical_link.success": "Successfully bound to logistical target", - "create.logistical_link.too_far": "Targeted workstation is too far from here", "create.logistics.crafter.click_to_merge": "Click to merge Inventories", "create.logistics.crafter.click_to_separate": "Click to separate Inventories", "create.logistics.crafter.connected": "Connected Crafters", @@ -1355,6 +1353,11 @@ "create.orientation.diagonal": "Diagonal", "create.orientation.horizontal": "Horizontal", "create.orientation.orthogonal": "Orthogonal", + "create.packager_link.clear": "Cleared selection", + "create.packager_link.invalid": "Assign a Stock Ticker or Cash Register before placing", + "create.packager_link.set": "Targeted workstation selected", + "create.packager_link.success": "Successfully bound to target", + "create.packager_link.too_far": "Targeted workstation is too far from here", "create.ponder.analog_lever.header": "Controlling signals using the Analog Lever", "create.ponder.analog_lever.text_1": "Analog Levers make for a compact and precise source of redstone power", "create.ponder.analog_lever.text_2": "Right-click to increase its analog power output", diff --git a/src/generated/resources/assets/create/models/item/logistical_link.json b/src/generated/resources/assets/create/models/item/logistical_link.json deleted file mode 100644 index b9f45f0371..0000000000 --- a/src/generated/resources/assets/create/models/item/logistical_link.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "create:block/logistical_link/block" -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/packager_link.json b/src/generated/resources/assets/create/models/item/packager_link.json new file mode 100644 index 0000000000..ac0ea65870 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/packager_link.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/packager_link/block" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/logistical_link.json b/src/generated/resources/data/create/loot_tables/blocks/packager_link.json similarity index 75% rename from src/generated/resources/data/create/loot_tables/blocks/logistical_link.json rename to src/generated/resources/data/create/loot_tables/blocks/packager_link.json index 6dc3436a98..9d3e886eb6 100644 --- a/src/generated/resources/data/create/loot_tables/blocks/logistical_link.json +++ b/src/generated/resources/data/create/loot_tables/blocks/packager_link.json @@ -11,11 +11,11 @@ "entries": [ { "type": "minecraft:item", - "name": "create:logistical_link" + "name": "create:packager_link" } ], "rolls": 1.0 } ], - "random_sequence": "create:blocks/logistical_link" + "random_sequence": "create:blocks/packager_link" } \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json b/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json index 3be7a8f751..85876778c6 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json @@ -86,7 +86,7 @@ "create:rotation_speed_controller", "create:mechanical_arm", "create:railway_casing", - "create:logistical_link", + "create:packager_link", "create:content_observer", "create:stockpile_switch", "create:creative_crate", diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json index dc65ae2e8b..7606b9e634 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json @@ -121,7 +121,7 @@ "create:large_bogey", "create:controls", "create:item_vault", - "create:logistical_link", + "create:packager_link", "create:andesite_funnel", "create:andesite_belt_funnel", "create:brass_funnel", diff --git a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java index 5a8b0f0e92..af9f8a0cdd 100644 --- a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java +++ b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java @@ -167,9 +167,9 @@ import com.simibubi.create.content.logistics.depot.EjectorRenderer; import com.simibubi.create.content.logistics.funnel.FunnelBlockEntity; import com.simibubi.create.content.logistics.funnel.FunnelInstance; import com.simibubi.create.content.logistics.funnel.FunnelRenderer; -import com.simibubi.create.content.logistics.logisticalLink.LogisticalLinkBlockEntity; import com.simibubi.create.content.logistics.packager.PackagerBlockEntity; import com.simibubi.create.content.logistics.packager.PackagerRenderer; +import com.simibubi.create.content.logistics.packagerLink.PackagerLinkBlockEntity; import com.simibubi.create.content.logistics.stockTicker.StockTickerBlockEntity; import com.simibubi.create.content.logistics.tunnel.BeltTunnelBlockEntity; import com.simibubi.create.content.logistics.tunnel.BeltTunnelInstance; @@ -474,9 +474,9 @@ public class AllBlockEntityTypes { .renderer(() -> PackagerRenderer::new) .register(); - public static final BlockEntityEntry LOGISTICAL_LINK = REGISTRATE - .blockEntity("logistical_link", LogisticalLinkBlockEntity::new) - .validBlocks(AllBlocks.LOGISTICAL_LINK) + public static final BlockEntityEntry PACKAGER_LINK = REGISTRATE + .blockEntity("packager_link", PackagerLinkBlockEntity::new) + .validBlocks(AllBlocks.PACKAGER_LINK) .renderer(() -> LinkBulbRenderer::new) .register(); diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 6c265cfc1a..ac365a6145 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -172,9 +172,10 @@ import com.simibubi.create.content.logistics.funnel.BrassFunnelBlock; import com.simibubi.create.content.logistics.funnel.FunnelGenerator; import com.simibubi.create.content.logistics.funnel.FunnelItem; import com.simibubi.create.content.logistics.funnel.FunnelMovementBehaviour; -import com.simibubi.create.content.logistics.logisticalLink.LogisticalLinkBlock; -import com.simibubi.create.content.logistics.logisticalLink.LogisticalLinkBlockItem; import com.simibubi.create.content.logistics.packager.PackagerBlock; +import com.simibubi.create.content.logistics.packager.PackagerGenerator; +import com.simibubi.create.content.logistics.packagerLink.PackagerLinkBlock; +import com.simibubi.create.content.logistics.packagerLink.PackagerLinkBlockItem; import com.simibubi.create.content.logistics.stockTicker.StockTickerBlock; import com.simibubi.create.content.logistics.tunnel.BeltTunnelBlock; import com.simibubi.create.content.logistics.tunnel.BrassTunnelBlock; @@ -1651,13 +1652,24 @@ public class AllBlocks { .initialProperties(SharedProperties::softMetal) .properties(p -> p.noOcclusion()) .addLayer(() -> RenderType::cutoutMipped) - .blockstate((c, p) -> p.horizontalBlock(c.get(), AssetLookup.partialBaseModel(c, p))) + .blockstate(new PackagerGenerator()::generate) .transform(BlockStressDefaults.setImpact(1.0)) .item() .model(AssetLookup::customItemModel) .build() .register(); + public static final BlockEntry PACKAGER_LINK = + REGISTRATE.block("packager_link", PackagerLinkBlock::new) + .initialProperties(SharedProperties::softMetal) + .properties(p -> p.mapColor(MapColor.TERRACOTTA_BROWN)) + .addLayer(() -> RenderType::translucent) + .transform(axeOrPickaxe()) + .blockstate((c, p) -> p.directionalBlock(c.get(), AssetLookup.forPowered(c, p))) + .item(PackagerLinkBlockItem::new) + .transform(customItemModel("_", "block")) + .register(); + public static final BlockEntry STOCK_TICKER = REGISTRATE.block("stock_ticker", StockTickerBlock::new) .initialProperties(SharedProperties::softMetal) @@ -1666,17 +1678,6 @@ public class AllBlocks { .blockstate((c, p) -> p.horizontalBlock(c.get(), AssetLookup.standardModel(c, p))) .simpleItem() .register(); - - public static final BlockEntry LOGISTICAL_LINK = - REGISTRATE.block("logistical_link", LogisticalLinkBlock::new) - .initialProperties(SharedProperties::softMetal) - .properties(p -> p.mapColor(MapColor.TERRACOTTA_BROWN)) - .addLayer(() -> RenderType::translucent) - .transform(axeOrPickaxe()) - .blockstate((c, p) -> p.directionalBlock(c.get(), AssetLookup.forPowered(c, p))) - .item(LogisticalLinkBlockItem::new) - .transform(customItemModel("_", "block")) - .register(); public static final BlockEntry ANDESITE_FUNNEL = REGISTRATE.block("andesite_funnel", AndesiteFunnelBlock::new) diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageClientInteractionHandler.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageClientInteractionHandler.java new file mode 100644 index 0000000000..8ed57dce67 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageClientInteractionHandler.java @@ -0,0 +1,34 @@ +package com.simibubi.create.content.logistics.box; + +import net.minecraft.client.Minecraft; +import net.minecraft.world.entity.player.Player; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.event.entity.player.AttackEntityEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod.EventBusSubscriber; +import net.minecraftforge.fml.util.ObfuscationReflectionHelper; + +@EventBusSubscriber(value = Dist.CLIENT) +public class PackageClientInteractionHandler { + + // In vanilla, punching an entity doesnt reset the attack timer. This leads to + // accidentally breaking blocks behind an armorstand or package when punching it + // in creative mode + + @SubscribeEvent + @OnlyIn(Dist.CLIENT) + public static void onPlayerPunchPackage(AttackEntityEvent event) { + Player attacker = event.getEntity(); + if (!attacker.level() + .isClientSide()) + return; + Minecraft mc = Minecraft.getInstance(); + if (attacker != mc.player) + return; + if (!(event.getTarget() instanceof PackageEntity)) + return; + ObfuscationReflectionHelper.setPrivateValue(Minecraft.class, mc, 10, "f_91078_"); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java index 97cbb31c86..0e3dfbb910 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java @@ -6,9 +6,12 @@ import java.util.Random; import com.simibubi.create.AllEntityTypes; import com.simibubi.create.foundation.utility.Components; +import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.ChatFormatting; import net.minecraft.core.Direction; +import net.minecraft.core.particles.ItemParticleOption; +import net.minecraft.core.particles.ParticleTypes; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; @@ -172,6 +175,14 @@ public class PackageItem extends Item { public InteractionResultHolder open(Level worldIn, Player playerIn, InteractionHand handIn) { ItemStack box = playerIn.getItemInHand(handIn); ItemStackHandler contents = getContents(box); + + ItemStack particle = box.copy(); + + box.shrink(1); + if (box.isEmpty()) + playerIn.getInventory() + .removeItem(box); + for (int i = 0; i < contents.getSlots(); i++) { ItemStack itemstack = contents.getStackInSlot(i); if (itemstack.isEmpty()) @@ -179,10 +190,22 @@ public class PackageItem extends Item { playerIn.getInventory() .placeItemBackInInventory(itemstack); } - box.shrink(1); - if (box.isEmpty()) - playerIn.getInventory() - .removeItem(box); + + Vec3 position = playerIn.position(); + worldIn.playSound((Player) null, position.x, position.y, position.z, SoundEvents.ARMOR_STAND_BREAK, + SoundSource.PLAYERS, 0.5F, 1.0F); + + if (worldIn.isClientSide()) + for (int i = 0; i < 10; i++) { + Vec3 motion = VecHelper.offsetRandomly(Vec3.ZERO, worldIn.getRandom(), .125f); + Vec3 pos = position.add(0, 0.5, 0) + .add(playerIn.getLookAngle() + .scale(.5)) + .add(motion.scale(4)); + worldIn.addParticle(new ItemParticleOption(ParticleTypes.ITEM, particle), pos.x, pos.y, pos.z, motion.x, + motion.y, motion.z); + } + return new InteractionResultHolder<>(InteractionResult.SUCCESS, box); } diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/AbstractFilterScreen.java b/src/main/java/com/simibubi/create/content/logistics/filter/AbstractFilterScreen.java index d25f5b180d..96fafe6ee2 100644 --- a/src/main/java/com/simibubi/create/content/logistics/filter/AbstractFilterScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/filter/AbstractFilterScreen.java @@ -75,7 +75,9 @@ public abstract class AbstractFilterScreen extends background.render(graphics, x, y); graphics.drawString(font, title, x + (background.width - 8) / 2 - font.width(title) / 2, y + 4, - AllItems.FILTER.isIn(menu.contentHolder) ? 0x303030 : 0x592424, false); + AllItems.PACKAGE_FILTER.isIn(menu.contentHolder) ? 0x3D3C48 + : AllItems.FILTER.isIn(menu.contentHolder) ? 0x303030 : 0x592424, + false); GuiGameElement.of(menu.contentHolder).at(x + background.width + 8, y + background.height - 52, -200) diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/FilterItem.java b/src/main/java/com/simibubi/create/content/logistics/filter/FilterItem.java index 0f7a59603d..faa04eb623 100644 --- a/src/main/java/com/simibubi/create/content/logistics/filter/FilterItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/filter/FilterItem.java @@ -42,7 +42,7 @@ public class FilterItem extends Item implements MenuProvider { private FilterType type; private enum FilterType { - REGULAR, ATTRIBUTE, ADDRESS; + REGULAR, ATTRIBUTE, PACKAGE; } public static FilterItem regular(Properties properties) { @@ -52,9 +52,9 @@ public class FilterItem extends Item implements MenuProvider { public static FilterItem attribute(Properties properties) { return new FilterItem(FilterType.ATTRIBUTE, properties); } - + public static FilterItem address(Properties properties) { - return new FilterItem(FilterType.ADDRESS, properties); + return new FilterItem(FilterType.PACKAGE, properties); } private FilterItem(FilterType type, Properties properties) { @@ -73,13 +73,13 @@ public class FilterItem extends Item implements MenuProvider { @Override @OnlyIn(Dist.CLIENT) public void appendHoverText(ItemStack stack, Level worldIn, List tooltip, TooltipFlag flagIn) { - if (!AllKeys.shiftDown()) { - List makeSummary = makeSummary(stack); - if (makeSummary.isEmpty()) - return; - tooltip.add(Components.literal(" ")); - tooltip.addAll(makeSummary); - } + if (AllKeys.shiftDown()) + return; + List makeSummary = makeSummary(stack); + if (makeSummary.isEmpty()) + return; + tooltip.add(Components.literal(" ")); + tooltip.addAll(makeSummary); } private List makeSummary(ItemStack filter) { @@ -147,6 +147,17 @@ public class FilterItem extends Item implements MenuProvider { return Collections.emptyList(); } + if (type == FilterType.PACKAGE) { + String address = filter.getOrCreateTag() + .getString("Address"); + if (!address.isBlank()) + list.add(Lang.text("-> ") + .style(ChatFormatting.GRAY) + .add(Lang.text(address) + .style(ChatFormatting.GOLD)) + .component()); + } + return list; } @@ -171,7 +182,7 @@ public class FilterItem extends Item implements MenuProvider { return FilterMenu.create(id, inv, heldItem); if (type == FilterType.ATTRIBUTE) return AttributeFilterMenu.create(id, inv, heldItem); - if (type == FilterType.ADDRESS) + if (type == FilterType.PACKAGE) return PackageFilterMenu.create(id, inv, heldItem); return null; } diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/FilterItemStack.java b/src/main/java/com/simibubi/create/content/logistics/filter/FilterItemStack.java index 86ad1bd419..e3211c1968 100644 --- a/src/main/java/com/simibubi/create/content/logistics/filter/FilterItemStack.java +++ b/src/main/java/com/simibubi/create/content/logistics/filter/FilterItemStack.java @@ -29,7 +29,7 @@ public class FilterItemStack { if (AllItems.ATTRIBUTE_FILTER.isIn(filter)) return new AttributeFilterItemStack(filter); if (AllItems.PACKAGE_FILTER.isIn(filter)) - return new AdressFilterItemStack(filter); + return new PackageFilterItemStack(filter); } return new FilterItemStack(filter); @@ -237,11 +237,11 @@ public class FilterItemStack { } - public static class AdressFilterItemStack extends FilterItemStack { + public static class PackageFilterItemStack extends FilterItemStack { public String filterString; - protected AdressFilterItemStack(ItemStack filter) { + protected PackageFilterItemStack(ItemStack filter) { super(filter); filterString = filter.getOrCreateTag() .getString("Address"); @@ -249,8 +249,9 @@ public class FilterItemStack { @Override public boolean test(Level world, ItemStack stack, boolean matchNBT) { - return stack.getItem() instanceof PackageItem - && PackageItem.matchAddress(stack, filterString.isBlank() ? "*" : filterString); + return (filterString.isBlank() && super.test(world, stack, matchNBT)) + || stack.getItem() instanceof PackageItem + && PackageItem.matchAddress(stack, filterString.isBlank() ? "*" : filterString); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/FilterScreenPacket.java b/src/main/java/com/simibubi/create/content/logistics/filter/FilterScreenPacket.java index 2896d8abc9..79caca9f9a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/filter/FilterScreenPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/filter/FilterScreenPacket.java @@ -11,7 +11,7 @@ import net.minecraftforge.network.NetworkEvent.Context; public class FilterScreenPacket extends SimplePacketBase { public enum Option { - WHITELIST, WHITELIST2, BLACKLIST, RESPECT_DATA, IGNORE_DATA, UPDATE_FILTER_ITEM, ADD_TAG, ADD_INVERTED_TAG; + WHITELIST, WHITELIST2, BLACKLIST, RESPECT_DATA, IGNORE_DATA, UPDATE_FILTER_ITEM, ADD_TAG, ADD_INVERTED_TAG, UPDATE_ADDRESS; } private final Option option; @@ -44,8 +44,7 @@ public class FilterScreenPacket extends SimplePacketBase { if (player == null) return; - if (player.containerMenu instanceof FilterMenu) { - FilterMenu c = (FilterMenu) player.containerMenu; + if (player.containerMenu instanceof FilterMenu c) { if (option == Option.WHITELIST) c.blacklist = false; if (option == Option.BLACKLIST) @@ -60,8 +59,7 @@ public class FilterScreenPacket extends SimplePacketBase { net.minecraft.world.item.ItemStack.of(data.getCompound("Item"))); } - if (player.containerMenu instanceof AttributeFilterMenu) { - AttributeFilterMenu c = (AttributeFilterMenu) player.containerMenu; + if (player.containerMenu instanceof AttributeFilterMenu c) { if (option == Option.WHITELIST) c.whitelistMode = WhitelistMode.WHITELIST_DISJ; if (option == Option.WHITELIST2) @@ -73,6 +71,11 @@ public class FilterScreenPacket extends SimplePacketBase { if (option == Option.ADD_INVERTED_TAG) c.appendSelectedAttribute(ItemAttribute.fromNBT(data), true); } + + if (player.containerMenu instanceof PackageFilterMenu c) { + if (option == Option.UPDATE_ADDRESS) + c.address = data.getString("Address"); + } }); return true; diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/PackageFilterMenu.java b/src/main/java/com/simibubi/create/content/logistics/filter/PackageFilterMenu.java index 0bd0e04bec..cd1a0364d4 100644 --- a/src/main/java/com/simibubi/create/content/logistics/filter/PackageFilterMenu.java +++ b/src/main/java/com/simibubi/create/content/logistics/filter/PackageFilterMenu.java @@ -28,12 +28,12 @@ public class PackageFilterMenu extends AbstractFilterMenu { @Override protected int getPlayerInventoryXOffset() { - return 51; + return 40; } @Override protected int getPlayerInventoryYOffset() { - return 105; + return 101; } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/PackageFilterScreen.java b/src/main/java/com/simibubi/create/content/logistics/filter/PackageFilterScreen.java index 0d205efc28..f44d574e74 100644 --- a/src/main/java/com/simibubi/create/content/logistics/filter/PackageFilterScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/filter/PackageFilterScreen.java @@ -1,20 +1,40 @@ package com.simibubi.create.content.logistics.filter; +import org.lwjgl.glfw.GLFW; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.AllItems; +import com.simibubi.create.AllPackets; +import com.simibubi.create.content.logistics.filter.FilterScreenPacket.Option; import com.simibubi.create.foundation.gui.AllGuiTextures; +import com.simibubi.create.foundation.gui.element.GuiGameElement; import com.simibubi.create.foundation.gui.widget.IconButton; import com.simibubi.create.foundation.gui.widget.Indicator; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.EditBox; +import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Inventory; public class PackageFilterScreen extends AbstractFilterScreen { - private static final String PREFIX = "gui.package_filter."; + private EditBox addressBox; + private boolean deferFocus; public PackageFilterScreen(PackageFilterMenu menu, Inventory inv, Component title) { super(menu, inv, title, AllGuiTextures.PACKAGE_FILTER); } + @Override + protected void containerTick() { + super.containerTick(); + if (deferFocus) { + deferFocus = false; + setFocused(addressBox); + } + } + @Override protected void init() { setWindowOffset(-11, 7); @@ -22,10 +42,60 @@ public class PackageFilterScreen extends AbstractFilterScreen int x = leftPos; int y = topPos; + + addressBox = new EditBox(this.font, x + 44, y + 28, 140, 9, Component.empty()); + addressBox.setMaxLength(50); + addressBox.setBordered(false); + addressBox.setTextColor(0xffffff); + addressBox.setValue(menu.address); + addressBox.setResponder(this::onAddressEdited); + addRenderableWidget(addressBox); + + setFocused(addressBox); } @Override - protected void contentsCleared() {} + public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.render(graphics, mouseX, mouseY, partialTicks); + + PoseStack ms = graphics.pose(); + ms.pushPose(); + ms.translate(leftPos + 16, topPos + 23, 0); + GuiGameElement.of(AllItems.CARDBOARD_PACKAGE_12x12.asStack()) + .render(graphics); + ms.popPose(); + } + + public void onAddressEdited(String s) { + menu.address = s; + CompoundTag tag = new CompoundTag(); + tag.putString("Address", s); + AllPackets.getChannel() + .sendToServer(new FilterScreenPacket(Option.UPDATE_ADDRESS, tag)); + } + + @Override + public boolean mouseClicked(double pMouseX, double pMouseY, int pButton) { + return super.mouseClicked(pMouseX, pMouseY, pButton); + } + + @Override + public boolean keyPressed(int pKeyCode, int pScanCode, int pModifiers) { + if (pKeyCode == GLFW.GLFW_KEY_ENTER) + setFocused(null); + return super.keyPressed(pKeyCode, pScanCode, pModifiers); + } + + @Override + public boolean charTyped(char pCodePoint, int pModifiers) { + return super.charTyped(pCodePoint, pModifiers); + } + + @Override + protected void contentsCleared() { + addressBox.setValue(""); + deferFocus = true; + } @Override protected boolean isButtonEnabled(IconButton button) { diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java index f0ffb8bf7d..94cf43443a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java @@ -3,7 +3,9 @@ package com.simibubi.create.content.logistics.packager; import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllItems; import com.simibubi.create.content.equipment.wrench.IWrenchable; +import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.foundation.block.IBE; +import com.simibubi.create.foundation.block.WrenchableDirectionalBlock; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -15,15 +17,18 @@ import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.Level; import net.minecraft.world.level.SignalGetter; import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.HorizontalDirectionalBlock; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition.Builder; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.block.state.properties.BooleanProperty; import net.minecraft.world.phys.BlockHitResult; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.minecraftforge.items.IItemHandler; -public class PackagerBlock extends HorizontalDirectionalBlock implements IBE, IWrenchable { +public class PackagerBlock extends WrenchableDirectionalBlock implements IBE, IWrenchable { public static final BooleanProperty POWERED = BlockStateProperties.POWERED; @@ -34,10 +39,28 @@ public class PackagerBlock extends HorizontalDirectionalBlock implements IBE itemCap = ForgeCapabilities.ITEM_HANDLER; + Direction preferredFacing = null; + for (Direction face : context.getNearestLookingDirections()) { + BlockEntity be = context.getLevel() + .getBlockEntity(context.getClickedPos() + .relative(face)); + if (be != null && (be.getCapability(itemCap) + .isPresent())) { + preferredFacing = face.getOpposite(); + break; + } + } + + if (preferredFacing == null) { + Direction facing = context.getNearestLookingDirection(); + preferredFacing = context.getPlayer() != null && context.getPlayer() + .isShiftKeyDown() ? facing : facing.getOpposite(); + } + return super.getStateForPlacement(context).setValue(POWERED, context.getLevel() .hasNeighborSignal(context.getClickedPos())) - .setValue(FACING, context.getHorizontalDirection() - .getOpposite()); + .setValue(FACING, preferredFacing); } @Override @@ -47,8 +70,23 @@ public class PackagerBlock extends HorizontalDirectionalBlock implements IBE { - if (be.heldBox.isEmpty()) + if (be.heldBox.isEmpty()) { + if (be.animationTicks > 0) + return InteractionResult.SUCCESS; + ItemStack heldItem = player.getItemInHand(handIn); + if (heldItem.getItem() instanceof PackageItem) { + if (worldIn.isClientSide()) + return InteractionResult.SUCCESS; + if (!be.unwrapBox(heldItem.copy(), true)) + return InteractionResult.SUCCESS; + be.unwrapBox(heldItem.copy(), false); + heldItem.shrink(1); + if (heldItem.isEmpty()) + player.setItemInHand(handIn, ItemStack.EMPTY); + return InteractionResult.SUCCESS; + } return InteractionResult.PASS; + } if (be.animationTicks > 0) return InteractionResult.PASS; if (!worldIn.isClientSide()) { @@ -66,7 +104,7 @@ public class PackagerBlock extends HorizontalDirectionalBlock implements IBE builder) { - super.createBlockStateDefinition(builder.add(POWERED, FACING)); + super.createBlockStateDefinition(builder.add(POWERED)); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java index 9e5e4dad8c..ee27229203 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java @@ -3,20 +3,23 @@ package com.simibubi.create.content.logistics.packager; import java.util.LinkedList; import java.util.List; +import com.simibubi.create.AllBlocks; import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.content.logistics.crate.BottomlessItemHandler; +import com.simibubi.create.content.logistics.packagerLink.PackagerLinkBlock; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import com.simibubi.create.foundation.blockEntity.behaviour.inventory.CapManipulationBehaviourBase.InterfaceProvider; import com.simibubi.create.foundation.blockEntity.behaviour.inventory.InvManipulationBehaviour; import com.simibubi.create.foundation.blockEntity.behaviour.inventory.VersionedInventoryTrackerBehaviour; import com.simibubi.create.foundation.item.ItemHelper; -import com.simibubi.create.foundation.utility.IntAttached; +import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.NBTHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; import net.minecraft.util.Mth; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntityType; @@ -30,17 +33,14 @@ import net.minecraftforge.items.ItemStackHandler; public class PackagerBlockEntity extends SmartBlockEntity { - enum RedstoneMode { - SEND_ONE, KEEP_SENDING - } + public boolean redstoneModeActive; + public boolean redstonePowered; public InvManipulationBehaviour targetInventory; - public RedstoneMode mode; - public boolean active; public ItemStack heldBox; public ItemStack previouslyUnwrapped; - public List> queuedRequests; // TODO: needs to be saved to disk + public List queuedRequests; public PackagerItemHandler inventory; private final LazyOptional invProvider; @@ -54,9 +54,9 @@ public class PackagerBlockEntity extends SmartBlockEntity { public PackagerBlockEntity(BlockEntityType typeIn, BlockPos pos, BlockState state) { super(typeIn, pos, state); - mode = RedstoneMode.SEND_ONE; - active = state.getOptionalValue(PackagerBlock.POWERED) + redstonePowered = state.getOptionalValue(PackagerBlock.POWERED) .orElse(false); + redstoneModeActive = true; heldBox = ItemStack.EMPTY; previouslyUnwrapped = ItemStack.EMPTY; inventory = new PackagerItemHandler(this); @@ -72,6 +72,12 @@ public class PackagerBlockEntity extends SmartBlockEntity { behaviours.add(invVersionTracker = new VersionedInventoryTrackerBehaviour(this)); } + @Override + public void initialize() { + super.initialize(); + recheckIfLinksPresent(); + } + @Override public void tick() { super.tick(); @@ -84,8 +90,8 @@ public class PackagerBlockEntity extends SmartBlockEntity { animationTicks--; } - public void queueRequest(IntAttached requestedItem) { - queuedRequests.add(requestedItem); + public void queueRequest(PackagingRequest packagingRequest) { + queuedRequests.add(packagingRequest); level.blockEntityChanged(worldPosition); } @@ -108,13 +114,33 @@ public class PackagerBlockEntity extends SmartBlockEntity { @Override public void lazyTick() { super.lazyTick(); - if (!active || level.isClientSide()) + if (!redstonePowered || level.isClientSide()) + return; + redstonePowered = getBlockState().getOptionalValue(PackagerBlock.POWERED) + .orElse(false); + if (!redstonePowered) + return; + recheckIfLinksPresent(); + if (!redstoneModeActive) return; attemptToSend(false); } + public void recheckIfLinksPresent() { + redstoneModeActive = true; + for (Direction d : Iterate.directions) { + BlockState adjacentState = level.getBlockState(worldPosition.relative(d)); + if (!AllBlocks.PACKAGER_LINK.has(adjacentState)) + continue; + if (adjacentState.getValue(PackagerLinkBlock.FACING) != d) + continue; + redstoneModeActive = false; + return; + } + } + public void activate() { - active = true; + redstonePowered = true; setChanged(); } @@ -174,8 +200,6 @@ public class PackagerBlockEntity extends SmartBlockEntity { } public void attemptToSend(boolean requestQueue) { - if (!requestQueue && (mode == RedstoneMode.SEND_ONE || !isBlockPowered())) - active = false; if (!heldBox.isEmpty() || animationTicks != 0) return; IItemHandler targetInv = targetInventory.getInventory(); @@ -185,18 +209,21 @@ public class PackagerBlockEntity extends SmartBlockEntity { boolean anyItemPresent = false; ItemStackHandler extractedItems = new ItemStackHandler(PackageItem.SLOTS); ItemStack extractedPackageItem = ItemStack.EMPTY; - IntAttached nextRequest = null; + PackagingRequest nextRequest = null; + String fixedAddress = null; - if (requestQueue && !queuedRequests.isEmpty()) + if (requestQueue && !queuedRequests.isEmpty()) { nextRequest = queuedRequests.get(0); + fixedAddress = nextRequest.address(); + } Outer: for (int i = 0; i < PackageItem.SLOTS; i++) for (int slot = 0; slot < targetInv.getSlots(); slot++) { - int initialCount = requestQueue ? Math.min(64, nextRequest.getFirst()) : 64; + int initialCount = requestQueue ? Math.min(64, nextRequest.getCount()) : 64; ItemStack extracted = targetInv.extractItem(slot, initialCount, true); if (extracted.isEmpty()) continue; - if (requestQueue && !ItemHandlerHelper.canItemStacksStack(extracted, nextRequest.getSecond())) + if (requestQueue && !ItemHandlerHelper.canItemStacksStack(extracted, nextRequest.item())) continue; boolean bulky = !extracted.getItem() @@ -210,19 +237,22 @@ public class PackagerBlockEntity extends SmartBlockEntity { int transferred = extracted.getCount() - leftovers; targetInv.extractItem(slot, transferred, false); + if (extracted.getItem() instanceof PackageItem) + extractedPackageItem = extracted; + if (requestQueue) { - nextRequest.setFirst(nextRequest.getFirst() - transferred); - if (nextRequest.isZero()) { + nextRequest.subtract(transferred); + if (nextRequest.isEmpty()) { queuedRequests.remove(0); if (queuedRequests.isEmpty()) break Outer; nextRequest = queuedRequests.get(0); + if (!fixedAddress.equals(nextRequest.address())) + break Outer; break; } } - if (extracted.getItem() instanceof PackageItem) - extractedPackageItem = extracted; if (bulky) break Outer; } @@ -234,6 +264,8 @@ public class PackagerBlockEntity extends SmartBlockEntity { } heldBox = extractedPackageItem.isEmpty() ? PackageItem.containing(extractedItems) : extractedPackageItem.copy(); + if (fixedAddress != null) + PackageItem.addAddress(heldBox, fixedAddress); animationInward = false; animationTicks = CYCLE; notifyUpdate(); @@ -242,23 +274,28 @@ public class PackagerBlockEntity extends SmartBlockEntity { @Override protected void read(CompoundTag compound, boolean clientPacket) { super.read(compound, clientPacket); - active = compound.getBoolean("Active"); + redstonePowered = compound.getBoolean("Active"); animationInward = compound.getBoolean("AnimationInward"); animationTicks = compound.getInt("AnimationTicks"); - mode = NBTHelper.readEnum(compound, "Mode", RedstoneMode.class); heldBox = ItemStack.of(compound.getCompound("HeldBox")); previouslyUnwrapped = ItemStack.of(compound.getCompound("InsertedBox")); + if (clientPacket) + return; + queuedRequests = + NBTHelper.readCompoundList(compound.getList("QueuedRequests", Tag.TAG_COMPOUND), PackagingRequest::fromNBT); } @Override protected void write(CompoundTag compound, boolean clientPacket) { super.write(compound, clientPacket); - compound.putBoolean("Active", active); + compound.putBoolean("Active", redstonePowered); compound.putBoolean("AnimationInward", animationInward); compound.putInt("AnimationTicks", animationTicks); - NBTHelper.writeEnum(compound, "Mode", mode); compound.put("HeldBox", heldBox.serializeNBT()); compound.put("InsertedBox", previouslyUnwrapped.serializeNBT()); + if (clientPacket) + return; + compound.put("QueuedRequests", NBTHelper.writeCompoundList(queuedRequests, PackagingRequest::toNBT)); } @Override @@ -280,11 +317,6 @@ public class PackagerBlockEntity extends SmartBlockEntity { return super.getCapability(cap, side); } - private boolean isBlockPowered() { - return getBlockState().getOptionalValue(PackagerBlock.POWERED) - .orElse(false); - } - public float getTrayOffset(float partialTicks) { float progress = Mth.clamp(Math.max(0, animationTicks - 5 - partialTicks) / (CYCLE * .75f) * 2 - 1, -1, 1); progress = 1 - progress * progress; diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerGenerator.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerGenerator.java new file mode 100644 index 0000000000..825d261727 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerGenerator.java @@ -0,0 +1,33 @@ +package com.simibubi.create.content.logistics.packager; + +import com.simibubi.create.foundation.data.AssetLookup; +import com.simibubi.create.foundation.data.SpecialBlockStateGen; +import com.tterrag.registrate.providers.DataGenContext; +import com.tterrag.registrate.providers.RegistrateBlockstateProvider; + +import net.minecraft.core.Direction.Axis; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.client.model.generators.ModelFile; + +public class PackagerGenerator extends SpecialBlockStateGen { + + @Override + protected int getXRotation(BlockState state) { + return 0; + } + + @Override + protected int getYRotation(BlockState state) { + return horizontalAngle(state.getValue(PackagerBlock.FACING)); + } + + @Override + public ModelFile getModel(DataGenContext ctx, RegistrateBlockstateProvider prov, + BlockState state) { + return state.getValue(PackagerBlock.FACING) + .getAxis() == Axis.Y ? AssetLookup.partialBaseModel(ctx, prov, "vertical") + : AssetLookup.partialBaseModel(ctx, prov); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagingRequest.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagingRequest.java new file mode 100644 index 0000000000..b0e852a180 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagingRequest.java @@ -0,0 +1,38 @@ +package com.simibubi.create.content.logistics.packager; + +import org.apache.commons.lang3.mutable.MutableInt; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.item.ItemStack; + +public record PackagingRequest(ItemStack item, MutableInt count, String address) { + + public static PackagingRequest create(ItemStack item, int count, String address) { + return new PackagingRequest(item, new MutableInt(count), address); + } + + public static PackagingRequest fromNBT(CompoundTag tag) { + return create(ItemStack.of(tag.getCompound("Item")), tag.getInt("Count"), tag.getString("Address")); + } + + public int getCount() { + return count.intValue(); + } + + public void subtract(int toSubtract) { + count.setValue(getCount() - toSubtract); + } + + public boolean isEmpty() { + return getCount() == 0; + } + + public CompoundTag toNBT() { + CompoundTag tag = new CompoundTag(); + tag.putInt("Count", count.intValue()); + tag.put("Item", item.serializeNBT()); + tag.putString("Address", address); + return tag; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/logisticalLink/LogisticalLinkBlock.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlock.java similarity index 84% rename from src/main/java/com/simibubi/create/content/logistics/logisticalLink/LogisticalLinkBlock.java rename to src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlock.java index 67af2f6cc9..527adca7b4 100644 --- a/src/main/java/com/simibubi/create/content/logistics/logisticalLink/LogisticalLinkBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlock.java @@ -1,4 +1,4 @@ -package com.simibubi.create.content.logistics.logisticalLink; +package com.simibubi.create.content.logistics.packagerLink; import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllBlocks; @@ -22,11 +22,11 @@ import net.minecraft.world.level.pathfinder.PathComputationType; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; -public class LogisticalLinkBlock extends WrenchableDirectionalBlock implements IBE { +public class PackagerLinkBlock extends WrenchableDirectionalBlock implements IBE { public static final BooleanProperty POWERED = BlockStateProperties.POWERED; - public LogisticalLinkBlock(Properties properties) { + public PackagerLinkBlock(Properties properties) { super(properties); registerDefaultState(defaultBlockState().setValue(POWERED, false)); } @@ -53,8 +53,7 @@ public class LogisticalLinkBlock extends WrenchableDirectionalBlock implements I boolean previouslyPowered = state.getValue(POWERED); if (previouslyPowered != powered) { worldIn.setBlock(pos, state.cycle(POWERED), 2); - if (!powered) - withBlockEntityDo(worldIn, pos, LogisticalLinkBlockEntity::onNoLongerPowered); + withBlockEntityDo(worldIn, pos, link -> link.redstonePowerChanged(powered)); } } @@ -87,13 +86,13 @@ public class LogisticalLinkBlock extends WrenchableDirectionalBlock implements I } @Override - public Class getBlockEntityClass() { - return LogisticalLinkBlockEntity.class; + public Class getBlockEntityClass() { + return PackagerLinkBlockEntity.class; } @Override - public BlockEntityType getBlockEntityType() { - return AllBlockEntityTypes.LOGISTICAL_LINK.get(); + public BlockEntityType getBlockEntityType() { + return AllBlockEntityTypes.PACKAGER_LINK.get(); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/logisticalLink/LogisticalLinkBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java similarity index 77% rename from src/main/java/com/simibubi/create/content/logistics/logisticalLink/LogisticalLinkBlockEntity.java rename to src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java index b0a74b1da6..f96032f5e4 100644 --- a/src/main/java/com/simibubi/create/content/logistics/logisticalLink/LogisticalLinkBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java @@ -1,4 +1,4 @@ -package com.simibubi.create.content.logistics.logisticalLink; +package com.simibubi.create.content.logistics.packagerLink; import java.lang.ref.WeakReference; import java.util.List; @@ -8,10 +8,10 @@ import javax.annotation.Nullable; import com.simibubi.create.content.logistics.packager.InventorySummary; import com.simibubi.create.content.logistics.packager.PackagerBlockEntity; +import com.simibubi.create.content.logistics.packager.PackagingRequest; import com.simibubi.create.content.logistics.stockTicker.LogisticalWorkstationBlockEntity; import com.simibubi.create.content.redstone.displayLink.LinkWithBulbBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; -import com.simibubi.create.foundation.utility.IntAttached; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -21,7 +21,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -public class LogisticalLinkBlockEntity extends LinkWithBulbBlockEntity { +public class PackagerLinkBlockEntity extends LinkWithBulbBlockEntity { public static final AtomicInteger linkIdGenerator = new AtomicInteger(); @@ -31,7 +31,7 @@ public class LogisticalLinkBlockEntity extends LinkWithBulbBlockEntity { private WeakReference target; - public LogisticalLinkBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { + public PackagerLinkBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); targetOffset = BlockPos.ZERO; linkId = linkIdGenerator.getAndIncrement(); @@ -46,31 +46,54 @@ public class LogisticalLinkBlockEntity extends LinkWithBulbBlockEntity { sendData(); return packager.getAvailableItems(); } - - public int processRequest(ItemStack stack, int amount) { + + public int processRequest(ItemStack stack, int amount, String address) { PackagerBlockEntity packager = getSource(); if (packager == null) return 0; - + InventorySummary summary = packager.getAvailableItems(); int availableCount = summary.getCountOf(stack); int toWithdraw = Math.min(amount, availableCount); - - packager.queueRequest(IntAttached.with(toWithdraw, stack)); + + PackagingRequest packagingRequest = PackagingRequest.create(stack, toWithdraw, address); + packager.queueRequest(packagingRequest); sendPulseNextSync(); sendData(); - + return toWithdraw; } @Override public void addBehaviours(List behaviours) {} - public void onNoLongerPowered() {} + public void redstonePowerChanged(boolean powered) { + if (powered) { + invalidateLink(); + return; + } + lazyTick(); + } @Override public void initialize() { super.initialize(); + PackagerBlockEntity source = getSource(); + if (source != null) + source.recheckIfLinksPresent(); + } + + @Override + public void invalidate() { + super.invalidate(); + invalidateLink(); + } + + private void invalidateLink() { + LogisticalWorkstationBlockEntity target = getTarget(); + if (target == null) + return; + target.invalidateLink(this); } @Override @@ -99,14 +122,14 @@ public class LogisticalLinkBlockEntity extends LinkWithBulbBlockEntity { } return null; } - + @Nullable public PackagerBlockEntity getSource() { BlockState blockState = getBlockState(); - if (blockState.getOptionalValue(LogisticalLinkBlock.POWERED) + if (blockState.getOptionalValue(PackagerLinkBlock.POWERED) .orElse(true)) return null; - BlockPos source = worldPosition.relative(blockState.getOptionalValue(LogisticalLinkBlock.FACING) + BlockPos source = worldPosition.relative(blockState.getOptionalValue(PackagerLinkBlock.FACING) .orElse(Direction.UP) .getOpposite()); if (!(level.getBlockEntity(source) instanceof PackagerBlockEntity packager)) diff --git a/src/main/java/com/simibubi/create/content/logistics/logisticalLink/LogisticalLinkBlockItem.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockItem.java similarity index 69% rename from src/main/java/com/simibubi/create/content/logistics/logisticalLink/LogisticalLinkBlockItem.java rename to src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockItem.java index 23a80fb965..88bccd5643 100644 --- a/src/main/java/com/simibubi/create/content/logistics/logisticalLink/LogisticalLinkBlockItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockItem.java @@ -1,4 +1,4 @@ -package com.simibubi.create.content.logistics.logisticalLink; +package com.simibubi.create.content.logistics.packagerLink; import com.simibubi.create.content.logistics.stockTicker.LogisticalWorkstationBlock; import com.simibubi.create.content.redstone.displayLink.ClickToLinkBlockItem; @@ -8,9 +8,9 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.Block; -public class LogisticalLinkBlockItem extends ClickToLinkBlockItem { +public class PackagerLinkBlockItem extends ClickToLinkBlockItem { - public LogisticalLinkBlockItem(Block pBlock, Properties pProperties) { + public PackagerLinkBlockItem(Block pBlock, Properties pProperties) { super(pBlock, pProperties); } @@ -22,12 +22,12 @@ public class LogisticalLinkBlockItem extends ClickToLinkBlockItem { @Override public int getMaxDistanceFromSelection() { - return AllConfigs.server().logistics.logisticalLinkRange.get(); + return AllConfigs.server().logistics.packagerLinkRange.get(); } @Override public String getMessageTranslationKey() { - return "logistical_link"; + return "packager_link"; } } diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalWorkstationBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalWorkstationBlockEntity.java index d867ff67f9..d738763ef0 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalWorkstationBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalWorkstationBlockEntity.java @@ -7,8 +7,8 @@ import java.util.Iterator; import java.util.List; import java.util.Map; -import com.simibubi.create.content.logistics.logisticalLink.LogisticalLinkBlockEntity; import com.simibubi.create.content.logistics.packager.InventorySummary; +import com.simibubi.create.content.logistics.packagerLink.PackagerLinkBlockEntity; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.utility.IntAttached; @@ -19,7 +19,7 @@ import net.minecraft.world.level.block.state.BlockState; public abstract class LogisticalWorkstationBlockEntity extends SmartBlockEntity { - private Map>> connectedLinks = new HashMap<>(); + private Map>> connectedLinks = new HashMap<>(); private InventorySummary summaryOfLinks; private int ticksSinceLastSummary; @@ -45,10 +45,10 @@ public abstract class LogisticalWorkstationBlockEntity extends SmartBlockEntity ticksSinceLastSummary++; } - protected List getAvailableLinks() { - List links = new ArrayList<>(); + protected List getAvailableLinks() { + List links = new ArrayList<>(); connectedLinks.forEach(($, entry) -> { - LogisticalLinkBlockEntity blockEntity = entry.getSecond() + PackagerLinkBlockEntity blockEntity = entry.getSecond() .get(); if (blockEntity != null && !blockEntity.isRemoved() && !blockEntity.isChunkUnloaded()) links.add(blockEntity); @@ -80,7 +80,7 @@ public abstract class LogisticalWorkstationBlockEntity extends SmartBlockEntity ticksSinceLastSummary = 0; summaryOfLinks = new InventorySummary(); connectedLinks.forEach(($, entry) -> { - LogisticalLinkBlockEntity link = entry.getSecond() + PackagerLinkBlockEntity link = entry.getSecond() .get(); if (link != null && !link.isRemoved() && !link.isChunkUnloaded()) summaryOfLinks.add(link.fetchSummaryFromPackager()); @@ -94,13 +94,13 @@ public abstract class LogisticalWorkstationBlockEntity extends SmartBlockEntity for (Iterator iterator = connectedLinks.keySet() .iterator(); iterator.hasNext();) { Integer id = iterator.next(); - IntAttached> entry = connectedLinks.get(id); + IntAttached> entry = connectedLinks.get(id); entry.decrement(); if (entry.isOrBelowZero()) { iterator.remove(); continue; } - LogisticalLinkBlockEntity link = entry.getSecond() + PackagerLinkBlockEntity link = entry.getSecond() .get(); if (link == null || link.isRemoved() || link.isChunkUnloaded()) { iterator.remove(); @@ -109,9 +109,13 @@ public abstract class LogisticalWorkstationBlockEntity extends SmartBlockEntity } } - public void keepConnected(LogisticalLinkBlockEntity link) { + public void keepConnected(PackagerLinkBlockEntity link) { connectedLinks.computeIfAbsent(link.linkId, $ -> IntAttached.withZero(new WeakReference<>(link))) .setFirst(3); } + public void invalidateLink(PackagerLinkBlockEntity link) { + connectedLinks.remove(link.linkId); + } + } diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrderRequestPacket.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrderRequestPacket.java index b019abdf36..250169d7e4 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrderRequestPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrderRequestPacket.java @@ -14,10 +14,12 @@ import net.minecraft.world.item.ItemStack; public class PackageOrderRequestPacket extends BlockEntityConfigurationPacket { private List> items; + private String address; - public PackageOrderRequestPacket(BlockPos pos, List> items) { + public PackageOrderRequestPacket(BlockPos pos, List> items, String address) { super(pos); this.items = items; + this.address = address; } public PackageOrderRequestPacket(FriendlyByteBuf buffer) { @@ -26,6 +28,7 @@ public class PackageOrderRequestPacket extends BlockEntityConfigurationPacket entry : items) { buffer.writeVarInt(entry.getFirst()); @@ -35,6 +38,7 @@ public class PackageOrderRequestPacket extends BlockEntityConfigurationPacket(); for (int i = 0; i < size; i++) @@ -46,7 +50,7 @@ public class PackageOrderRequestPacket extends BlockEntityConfigurationPacket> lastClientsideStockSnapshot; protected List> newlyReceivedStockSnapshot; + + protected String previouslyUsedAddress; public StockTickerBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); @@ -34,6 +37,18 @@ public class StockTickerBlockEntity extends LogisticalWorkstationBlockEntity { public List> getClientStockSnapshot() { return lastClientsideStockSnapshot; } + + @Override + protected void write(CompoundTag tag, boolean clientPacket) { + super.write(tag, clientPacket); + tag.putString("PreviousAddress", previouslyUsedAddress); + } + + @Override + protected void read(CompoundTag tag, boolean clientPacket) { + super.read(tag, clientPacket); + previouslyUsedAddress = tag.getString("PreviousAddress"); + } public void receiveStockPacket(List> stacks, boolean endOfTransmission) { if (newlyReceivedStockSnapshot == null) @@ -45,17 +60,19 @@ public class StockTickerBlockEntity extends LogisticalWorkstationBlockEntity { newlyReceivedStockSnapshot = null; } - public void receivePackageRequest(List> stacks, Player player) { - List availableLinks = getAvailableLinks(); + public void receivePackageRequest(List> stacks, Player player, String address) { + List availableLinks = getAvailableLinks(); for (IntAttached entry : stacks) { int remainingCount = entry.getFirst(); ItemStack requestedItem = entry.getSecond(); - for (LogisticalLinkBlockEntity link : availableLinks) { - remainingCount -= link.processRequest(requestedItem, remainingCount); + for (PackagerLinkBlockEntity link : availableLinks) { + remainingCount -= link.processRequest(requestedItem, remainingCount, address); if (remainingCount == 0) break; } } + previouslyUsedAddress = address; + notifyUpdate(); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java index 68537bd3a3..4f89d7b222 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java @@ -12,6 +12,7 @@ import javax.annotation.Nullable; import org.lwjgl.glfw.GLFW; import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.AllPackets; import com.simibubi.create.foundation.gui.AbstractSimiScreen; @@ -26,6 +27,7 @@ import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.EditBox; import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; import net.minecraft.util.Mth; import net.minecraft.world.item.ItemStack; import net.minecraftforge.items.ItemHandlerHelper; @@ -47,8 +49,7 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { int orderY; EditBox searchBox; - boolean ignoreTextInput; - int mouseDownTicks; + EditBox addressBox; int emptyTicks = 0; @@ -76,16 +77,25 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { super.init(); itemsX = guiLeft + (windowWidth - cols * colWidth) / 2; - itemsY = guiTop + 45; + itemsY = guiTop + 35; orderY = itemsY + rows * rowHeight + 10; - searchBox = new EditBox(this.font, itemsX + 1, itemsY - 18, 120, 9, Component.translatable("itemGroup.search")); - searchBox.setValue(""); + MutableComponent searchLabel = Lang.translateDirect("gui.stock_ticker.search_items"); + searchBox = new EditBox(this.font, itemsX + 1, itemsY - 18, 120, 9, searchLabel); searchBox.setMaxLength(50); searchBox.setBordered(false); - searchBox.setVisible(true); - searchBox.setTextColor(16777215); + searchBox.setTextColor(0xffffff); addRenderableWidget(searchBox); + + MutableComponent addressLabel = Lang.translateDirect("gui.stock_ticker.package_adress"); + boolean initial = addressBox == null; + addressBox = new EditBox(this.font, itemsX + 1, orderY + rowHeight + 10, 120, 9, addressLabel); + addressBox.setMaxLength(50); + addressBox.setBordered(false); + addressBox.setTextColor(0xffffff); + if (initial) + addressBox.setValue(blockEntity.previouslyUsedAddress); + addRenderableWidget(addressBox); } private void refreshSearchResults(boolean scrollBackUp) { @@ -156,11 +166,6 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { else emptyTicks = 0; - if (minecraft.mouseHandler.isLeftPressed()) - mouseDownTicks++; - else - mouseDownTicks = 0; - List> clientStockSnapshot = blockEntity.getClientStockSnapshot(); if (clientStockSnapshot != currentItemSource) { currentItemSource = clientStockSnapshot; @@ -192,9 +197,21 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { // Render some boxes graphics.renderOutline(searchBox.getX() - 4, searchBox.getY() - 4, searchBox.getWidth() + 12, searchBox.getHeight() + 7, color.getRGB()); + graphics.renderOutline(addressBox.getX() - 4, addressBox.getY() - 4, addressBox.getWidth() + 12, + addressBox.getHeight() + 7, color.getRGB()); graphics.renderOutline(itemsX - 3, itemsY - 4, cols * colWidth + 6, rows * rowHeight + 8, color.getRGB()); graphics.renderOutline(itemsX - 3, orderY - 4, cols * colWidth + 6, rowHeight + 8, color.getRGB()); + drawConfirmBox(graphics, color, mouseX, mouseY); + // Render text input hints + if (searchBox.getValue() + .isBlank()) + graphics.drawString(font, searchBox.getMessage(), searchBox.getX(), searchBox.getY(), 0x88dddddd); + if (addressBox.getValue() + .isBlank()) + graphics.drawString(font, addressBox.getMessage(), addressBox.getX(), addressBox.getY(), 0x88dddddd); + + // Render static item icons ms.pushPose(); ms.translate(itemsX + cols * colWidth + 3, orderY - 8, 0); ms.scale(2f, 2f, 2f); @@ -202,6 +219,18 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { .render(graphics); ms.popPose(); + ms.pushPose(); + ms.translate(itemsX + cols * colWidth + 8, itemsY, 0); + ms.scale(1.5f, 1.5f, 1.5f); + GuiGameElement.of(AllBlocks.PACKAGER.asStack()) + .render(graphics); + ms.translate(0, -9, 15); + GuiGameElement.of(AllBlocks.PACKAGER_LINK.asStack()) + .render(graphics); + ms.popPose(); + graphics.drawString(font, Lang.text(blockEntity.activeLinks + "") + .component(), itemsX + cols * colWidth + 33, itemsY + 11, 0x88dddddd); + // Render ordered items for (int index = 0; index < cols; index++) { if (itemsToOrder.size() <= index) @@ -377,6 +406,34 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { return order ? col : slot; } + private void drawConfirmBox(GuiGraphics graphics, Color defaultColor, int mouseX, int mouseY) { + int confirmX = addressBox.getX() + addressBox.getWidth() + 10; + int confirmY = addressBox.getY() - 4; + int confirmW = (cols * colWidth) - addressBox.getWidth() - 8; + int confirmH = addressBox.getHeight() + 7; + + boolean hovered = isConfirmHovered(mouseX, mouseY); + boolean inactive = itemsToOrder.isEmpty(); + int color = inactive ? defaultColor.darker() + .getRGB() : hovered ? 0xeeffffff : 0x99ffffff; + graphics.renderOutline(confirmX, confirmY, confirmW, confirmH, color); + graphics.drawCenteredString(font, Lang.translateDirect("gui.stock_ticker.confirm_order"), + confirmX + (confirmW / 2), confirmY + 4, color); + } + + private boolean isConfirmHovered(int mouseX, int mouseY) { + int confirmX = addressBox.getX() + addressBox.getWidth() + 10; + int confirmY = addressBox.getY() - 4; + int confirmW = (cols * colWidth) - addressBox.getWidth() - 8; + int confirmH = addressBox.getHeight() + 7; + + if (mouseX < confirmX || mouseX >= confirmX + confirmW) + return false; + if (mouseY < confirmY || mouseY >= confirmY + confirmH) + return false; + return true; + } + private Component getTroubleshootingMessage() { if (currentItemSource == null) return Lang.translate("gui.stock_ticker.checking_stocks") @@ -402,7 +459,7 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { boolean lmb = pButton == 0; boolean rmb = pButton == 1; - + if (rmb && searchBox.isMouseOver(pMouseX, pMouseY)) { searchBox.setValue(""); refreshSearchResults(true); @@ -410,6 +467,11 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { return true; } + if (lmb && isConfirmHovered((int) pMouseX, (int) pMouseY)) { + sendIt(); + return true; + } + if (hoveredSlot == noneHovered || !lmb && !rmb) return super.mouseClicked(pMouseX, pMouseY, pButton); @@ -425,7 +487,7 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { int transfer = hasShiftDown() ? itemStack.getMaxStackSize() : 1; int current = existingOrder.getFirst(); - if (rmb) { + if (rmb || orderClicked) { existingOrder.setFirst(current - transfer); if (existingOrder.getFirst() <= 0) itemsToOrder.remove(existingOrder); @@ -460,8 +522,8 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { @Override public boolean charTyped(char pCodePoint, int pModifiers) { - if (ignoreTextInput) - return false; + if (addressBox.isFocused() && addressBox.charTyped(pCodePoint, pModifiers)) + return true; String s = searchBox.getValue(); if (!searchBox.charTyped(pCodePoint, pModifiers)) return false; @@ -473,15 +535,13 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { @Override public boolean keyPressed(int pKeyCode, int pScanCode, int pModifiers) { if (pKeyCode == GLFW.GLFW_KEY_ENTER && hasShiftDown()) { - revalidateOrders(); - if (!itemsToOrder.isEmpty()) { - AllPackets.getChannel() - .sendToServer(new PackageOrderRequestPacket(blockEntity.getBlockPos(), itemsToOrder)); - minecraft.setScreen(null); - } + sendIt(); + return true; } - ignoreTextInput = false; + if (addressBox.isFocused() && addressBox.keyPressed(pKeyCode, pScanCode, pModifiers)) + return true; + String s = searchBox.getValue(); if (!searchBox.keyPressed(pKeyCode, pScanCode, pModifiers)) return searchBox.isFocused() && searchBox.isVisible() && pKeyCode != 256 ? true @@ -491,9 +551,18 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { return true; } + private void sendIt() { + revalidateOrders(); + if (itemsToOrder.isEmpty()) + return; + AllPackets.getChannel() + .sendToServer( + new PackageOrderRequestPacket(blockEntity.getBlockPos(), itemsToOrder, addressBox.getValue())); + minecraft.setScreen(null); + } + @Override public boolean keyReleased(int pKeyCode, int pScanCode, int pModifiers) { - ignoreTextInput = false; return super.keyReleased(pKeyCode, pScanCode, pModifiers); } diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java index 3975ed508a..1fd48da812 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java @@ -49,7 +49,7 @@ public enum AllGuiTextures implements ScreenElement { FILTER("filters", 214, 99), ATTRIBUTE_FILTER("filters", 0, 99, 241, 85), - PACKAGE_FILTER("packager", 0, 104, 218, 79), + PACKAGE_FILTER("filters_2", 0, 0, 218, 79), TOOLBOX("toolbox", 188, 171), TOOLBELT_SLOT("minecraft", "widgets", 24, 23, 22, 22), diff --git a/src/main/java/com/simibubi/create/infrastructure/config/CLogistics.java b/src/main/java/com/simibubi/create/infrastructure/config/CLogistics.java index 572611526f..86a696065e 100644 --- a/src/main/java/com/simibubi/create/infrastructure/config/CLogistics.java +++ b/src/main/java/com/simibubi/create/infrastructure/config/CLogistics.java @@ -9,7 +9,7 @@ public class CLogistics extends ConfigBase { public final ConfigInt mechanicalArmRange = i(5, 1, "mechanicalArmRange", Comments.mechanicalArmRange); public final ConfigInt linkRange = i(256, 1, "linkRange", Comments.linkRange); public final ConfigInt displayLinkRange = i(64, 1, "displayLinkRange", Comments.displayLinkRange); - public final ConfigInt logisticalLinkRange = i(256, 1, "logisticalLinkRange", Comments.logisticalLinkRange); + public final ConfigInt packagerLinkRange = i(256, 1, "packagerLinkRange", Comments.packagerLinkRange); public final ConfigInt vaultCapacity = i(20, 1, "vaultCapacity", Comments.vaultCapacity); public final ConfigInt brassTunnelTimer = i(10, 1, 10, "brassTunnelTimer", Comments.brassTunnelTimer); public final ConfigBool seatHostileMobs = b(true, "seatHostileMobs", Comments.seatHostileMobs); @@ -25,8 +25,8 @@ public class CLogistics extends ConfigBase { static String linkRange = "Maximum possible range in blocks of redstone link connections."; static String displayLinkRange = "Maximum possible distance in blocks between display links and their target."; - static String logisticalLinkRange = - "Maximum possible distance in blocks between logistical links and their target."; + static String packagerLinkRange = + "Maximum possible distance in blocks between packager links and their target."; static String psiTimeout = "The amount of ticks a portable storage interface waits for transfers until letting contraptions move along."; static String mechanicalArmRange = "Maximum distance in blocks a Mechanical Arm can reach across."; diff --git a/src/main/resources/assets/create/lang/default/interface.json b/src/main/resources/assets/create/lang/default/interface.json index e7992f1278..383214f760 100644 --- a/src/main/resources/assets/create/lang/default/interface.json +++ b/src/main/resources/assets/create/lang/default/interface.json @@ -311,6 +311,9 @@ "create.gui.stock_ticker.no_packagers_linked": "No Packagers Linked", "create.gui.stock_ticker.inventories_empty": "Linked Inventories are Empty", "create.gui.stock_ticker.no_search_results": "No matching items found", + "create.gui.stock_ticker.search_items": "Search Items", + "create.gui.stock_ticker.package_adress": "Package Address", + "create.gui.stock_ticker.confirm_order": "Confirm Order", "create.clipboard.actions": "Clipboard Actions", "create.clipboard.to_copy": "%1$s to Copy settings", @@ -890,11 +893,11 @@ "create.contraption.door_control.none.short": "None", "create.contraption.door_control.player_facing": "You are facing: %1$s", - "create.logistical_link.set": "Targeted workstation selected", - "create.logistical_link.success": "Successfully bound to logistical target", - "create.logistical_link.clear": "Cleared selection", - "create.logistical_link.too_far": "Targeted workstation is too far from here", - "create.logistical_link.invalid": "Assign a Stock Ticker or Cash Register before placing", + "create.packager_link.set": "Targeted workstation selected", + "create.packager_link.success": "Successfully bound to target", + "create.packager_link.clear": "Cleared selection", + "create.packager_link.too_far": "Targeted workstation is too far from here", + "create.packager_link.invalid": "Assign a Stock Ticker or Cash Register before placing", "create.display_link.set": "Targeted position selected", "create.display_link.success": "Successfully bound to targeted position", diff --git a/src/main/resources/assets/create/models/block/logistical_link/block.json b/src/main/resources/assets/create/models/block/logistical_link/block.json deleted file mode 100644 index 8f87eddbbe..0000000000 --- a/src/main/resources/assets/create/models/block/logistical_link/block.json +++ /dev/null @@ -1,123 +0,0 @@ -{ - "credit": "Made with Blockbench", - "loader": "forge:composite", - "parent": "block/block", - "textures": { - "particle": "create:block/vault/vault_front_small" - }, - "children": { - "base": { - "render_type": "minecraft:solid", - "textures": { - "0": "create:block/logistical_link", - "3": "create:block/logistical_link_side" - }, - "elements": [ - { - "from": [9, 6, 3.5], - "to": [13, 9, 12.5], - "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, - "faces": { - "north": {"uv": [14.5, 0, 12.5, 1.5], "texture": "#0"}, - "east": {"uv": [14.5, 6, 16, 1.5], "rotation": 90, "texture": "#0"}, - "south": {"uv": [12.5, 0, 14.5, 1.5], "texture": "#0"}, - "west": {"uv": [14.5, 6, 16, 1.5], "rotation": 90, "texture": "#0"}, - "up": {"uv": [14.5, 1.5, 12.5, 6], "rotation": 180, "texture": "#0"} - } - }, - { - "from": [1, 1, 1], - "to": [15, 6, 15], - "faces": { - "north": {"uv": [0, 0, 14, 5], "texture": "#3"}, - "east": {"uv": [7.5, 9, 10, 16], "rotation": 90, "texture": "#0"}, - "south": {"uv": [0, 0, 14, 5], "texture": "#3"}, - "west": {"uv": [7.5, 9, 10, 16], "rotation": 90, "texture": "#0"}, - "up": {"uv": [0, 9, 7, 16], "texture": "#0"}, - "down": {"uv": [0, 1.5, 7, 8.5], "texture": "#0"} - } - }, - { - "from": [2, -1, 2], - "to": [14, 1, 14], - "faces": { - "north": {"uv": [0.5, 0, 6.5, 1], "texture": "#0"}, - "east": {"uv": [0.5, 0, 6.5, 1], "texture": "#0"}, - "south": {"uv": [0.5, 0, 6.5, 1], "texture": "#0"}, - "west": {"uv": [0.5, 0, 6.5, 1], "texture": "#0"}, - "down": {"uv": [0.5, 2, 6.5, 8], "texture": "#0"} - } - }, - { - "from": [3, 5, 3], - "to": [7, 7, 7], - "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, - "faces": { - "north": {"uv": [13.5, 10, 11.5, 11], "texture": "#0"}, - "east": {"uv": [13.5, 10, 11.5, 11], "texture": "#0"}, - "south": {"uv": [13.5, 10, 11.5, 11], "texture": "#0"}, - "west": {"uv": [13.5, 10, 11.5, 11], "texture": "#0"}, - "up": {"uv": [13.5, 8, 11.5, 10], "texture": "#0"} - } - }, - { - "from": [3, 6, 8], - "to": [7, 8, 12], - "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, - "faces": { - "north": {"uv": [13.5, 8, 11.5, 9], "texture": "#0"}, - "east": {"uv": [13.5, 8, 11.5, 9], "texture": "#0"}, - "south": {"uv": [13.5, 8, 11.5, 9], "texture": "#0"}, - "west": {"uv": [13.5, 8, 11.5, 9], "texture": "#0"}, - "up": {"uv": [13.5, 6, 11.5, 8], "texture": "#0"} - } - } - ] - }, - "bulb_inner": { - "render_type": "minecraft:cutout", - "textures": { - "0": "create:block/logistical_link" - }, - "elements": [ - { - "from": [2.5, 8, 9], - "to": [7.5, 13, 10], - "rotation": {"angle": 0, "axis": "y", "origin": [6, 7.5, 19]}, - "faces": { - "south": {"uv": [16, 13.5, 13.5, 16], "texture": "#0"} - } - }, - { - "from": [2.5, 8, 10], - "to": [7.5, 13, 11], - "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, - "faces": { - "north": {"uv": [16, 13.5, 13.5, 16], "texture": "#0"} - } - } - ] - }, - "bulb": { - "render_type": "minecraft:translucent", - "textures": { - "0": "create:block/logistical_link" - }, - "elements": [ - { - "from": [2.5, 8, 7.5], - "to": [7.5, 13, 12.5], - "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, - "faces": { - "north": {"uv": [16, 8.5, 13.5, 11], "texture": "#0"}, - "east": {"uv": [16, 8.5, 13.5, 11], "texture": "#0"}, - "south": {"uv": [16, 8.5, 13.5, 11], "texture": "#0"}, - "west": {"uv": [16, 8.5, 13.5, 11], "texture": "#0"}, - "up": {"uv": [16, 6, 13.5, 8.5], "texture": "#0"}, - "down": {"uv": [16, 11, 13.5, 13.5], "texture": "#0"} - } - } - ] - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/logistical_link/block_powered.json b/src/main/resources/assets/create/models/block/logistical_link/block_powered.json deleted file mode 100644 index e0b3f6ef0f..0000000000 --- a/src/main/resources/assets/create/models/block/logistical_link/block_powered.json +++ /dev/null @@ -1,123 +0,0 @@ -{ - "credit": "Made with Blockbench", - "loader": "forge:composite", - "parent": "block/block", - "textures": { - "particle": "create:block/vault/vault_front_small" - }, - "children": { - "base": { - "render_type": "minecraft:solid", - "textures": { - "0": "create:block/logistical_link", - "3": "create:block/logistical_link_side_powered" - }, - "elements": [ - { - "from": [9, 6, 3.5], - "to": [13, 9, 12.5], - "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, - "faces": { - "north": {"uv": [14.5, 0, 12.5, 1.5], "texture": "#0"}, - "east": {"uv": [14.5, 6, 16, 1.5], "rotation": 90, "texture": "#0"}, - "south": {"uv": [12.5, 0, 14.5, 1.5], "texture": "#0"}, - "west": {"uv": [14.5, 6, 16, 1.5], "rotation": 90, "texture": "#0"}, - "up": {"uv": [14.5, 1.5, 12.5, 6], "rotation": 180, "texture": "#0"} - } - }, - { - "from": [1, 1, 1], - "to": [15, 6, 15], - "faces": { - "north": {"uv": [0, 0, 14, 5], "texture": "#3"}, - "east": {"uv": [7.5, 9, 10, 16], "rotation": 90, "texture": "#0"}, - "south": {"uv": [0, 0, 14, 5], "texture": "#3"}, - "west": {"uv": [7.5, 9, 10, 16], "rotation": 90, "texture": "#0"}, - "up": {"uv": [0, 9, 7, 16], "texture": "#0"}, - "down": {"uv": [0, 1.5, 7, 8.5], "texture": "#0"} - } - }, - { - "from": [2, -1, 2], - "to": [14, 1, 14], - "faces": { - "north": {"uv": [0.5, 0, 6.5, 1], "texture": "#0"}, - "east": {"uv": [0.5, 0, 6.5, 1], "texture": "#0"}, - "south": {"uv": [0.5, 0, 6.5, 1], "texture": "#0"}, - "west": {"uv": [0.5, 0, 6.5, 1], "texture": "#0"}, - "down": {"uv": [0.5, 2, 6.5, 8], "texture": "#0"} - } - }, - { - "from": [3, 5, 3], - "to": [7, 7, 7], - "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, - "faces": { - "north": {"uv": [13.5, 10, 11.5, 11], "texture": "#0"}, - "east": {"uv": [13.5, 10, 11.5, 11], "texture": "#0"}, - "south": {"uv": [13.5, 10, 11.5, 11], "texture": "#0"}, - "west": {"uv": [13.5, 10, 11.5, 11], "texture": "#0"}, - "up": {"uv": [13.5, 8, 11.5, 10], "texture": "#0"} - } - }, - { - "from": [3, 6, 8], - "to": [7, 8, 12], - "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, - "faces": { - "north": {"uv": [13.5, 8, 11.5, 9], "texture": "#0"}, - "east": {"uv": [13.5, 8, 11.5, 9], "texture": "#0"}, - "south": {"uv": [13.5, 8, 11.5, 9], "texture": "#0"}, - "west": {"uv": [13.5, 8, 11.5, 9], "texture": "#0"}, - "up": {"uv": [13.5, 6, 11.5, 8], "texture": "#0"} - } - } - ] - }, - "bulb_inner": { - "render_type": "minecraft:cutout", - "textures": { - "0": "create:block/logistical_link" - }, - "elements": [ - { - "from": [2.5, 8, 9], - "to": [7.5, 13, 10], - "rotation": {"angle": 0, "axis": "y", "origin": [6, 7.5, 19]}, - "faces": { - "south": {"uv": [16, 13.5, 13.5, 16], "texture": "#0"} - } - }, - { - "from": [2.5, 8, 10], - "to": [7.5, 13, 11], - "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, - "faces": { - "north": {"uv": [16, 13.5, 13.5, 16], "texture": "#0"} - } - } - ] - }, - "bulb": { - "render_type": "minecraft:translucent", - "textures": { - "0": "create:block/logistical_link" - }, - "elements": [ - { - "from": [2.5, 8, 7.5], - "to": [7.5, 13, 12.5], - "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, - "faces": { - "north": {"uv": [16, 8.5, 13.5, 11], "texture": "#0"}, - "east": {"uv": [16, 8.5, 13.5, 11], "texture": "#0"}, - "south": {"uv": [16, 8.5, 13.5, 11], "texture": "#0"}, - "west": {"uv": [16, 8.5, 13.5, 11], "texture": "#0"}, - "up": {"uv": [16, 6, 13.5, 8.5], "texture": "#0"}, - "down": {"uv": [16, 11, 13.5, 13.5], "texture": "#0"} - } - } - ] - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/packager/block.json b/src/main/resources/assets/create/models/block/packager/block.json index df95c4b8ba..0dc6dbfeb3 100644 --- a/src/main/resources/assets/create/models/block/packager/block.json +++ b/src/main/resources/assets/create/models/block/packager/block.json @@ -22,8 +22,8 @@ }, { "name": "interior", - "from": [16, 0, 0], - "to": [0, 16, 16], + "from": [15.95, 0.05, 0.05], + "to": [0.05, 15.95, 15.95], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { "north": {"uv": [8, 0, 16, 8], "texture": "#0"}, diff --git a/src/main/resources/assets/create/models/block/packager/block_vertical.json b/src/main/resources/assets/create/models/block/packager/block_vertical.json new file mode 100644 index 0000000000..9433ce5e21 --- /dev/null +++ b/src/main/resources/assets/create/models/block/packager/block_vertical.json @@ -0,0 +1,96 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/packager_block", + "3": "create:block/axis", + "particle": "create:block/packager_block" + }, + "elements": [ + { + "name": "exterior", + "from": [0, 0, 0], + "to": [16, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "east": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "south": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "west": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "up": {"uv": [0, 0, 8, 8], "texture": "#0"}, + "down": {"uv": [0, 8, 8, 16], "texture": "#0"} + } + }, + { + "name": "interior", + "from": [15.95, 0.05, 0.05], + "to": [0.05, 15.95, 15.95], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "east": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "south": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "west": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "up": {"uv": [0, 0, 8, 8], "texture": "#0"}, + "down": {"uv": [0, 8, 8, 16], "texture": "#0"} + } + }, + { + "from": [13.5, 0, 0.5], + "to": [15.5, 16, 2.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [9, 0, 7, 16], "rotation": 180, "texture": "#3"}, + "east": {"uv": [7, 0, 9, 16], "texture": "#3"}, + "south": {"uv": [7, 0, 9, 16], "texture": "#3"}, + "west": {"uv": [7, 0, 9, 16], "texture": "#3"} + } + }, + { + "from": [0.5, 0, 0.5], + "to": [2.5, 16, 2.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [9, 0, 7, 16], "rotation": 180, "texture": "#3"}, + "east": {"uv": [7, 0, 9, 16], "texture": "#3"}, + "south": {"uv": [7, 0, 9, 16], "texture": "#3"}, + "west": {"uv": [7, 0, 9, 16], "texture": "#3"} + } + }, + { + "from": [13.5, 0, 13.5], + "to": [15.5, 16, 15.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [9, 0, 7, 16], "rotation": 180, "texture": "#3"}, + "east": {"uv": [7, 0, 9, 16], "texture": "#3"}, + "south": {"uv": [7, 0, 9, 16], "texture": "#3"}, + "west": {"uv": [7, 0, 9, 16], "texture": "#3"} + } + }, + { + "from": [0.5, 0, 13.5], + "to": [2.5, 16, 15.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [9, 0, 7, 16], "rotation": 180, "texture": "#3"}, + "east": {"uv": [7, 0, 9, 16], "texture": "#3"}, + "south": {"uv": [7, 0, 9, 16], "texture": "#3"}, + "west": {"uv": [7, 0, 9, 16], "texture": "#3"} + } + } + ], + "groups": [ + { + "name": "Main Block", + "origin": [0, 0, 0], + "color": 0, + "children": [0, 1] + }, + { + "name": "Rails vertical", + "origin": [0, 0, 0], + "color": 0, + "children": [2, 3, 4, 5] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/packager/hatch_closed.json b/src/main/resources/assets/create/models/block/packager/hatch_closed.json index 87d068bbc8..355858bf2d 100644 --- a/src/main/resources/assets/create/models/block/packager/hatch_closed.json +++ b/src/main/resources/assets/create/models/block/packager/hatch_closed.json @@ -6,8 +6,8 @@ }, "elements": [ { - "from": [1, 1, 7], - "to": [15, 15, 10], + "from": [1.05, 1.05, 7], + "to": [14.95, 14.95, 10.05], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { "north": {"uv": [1, 1, 15, 15], "texture": "#1"}, diff --git a/src/main/resources/assets/create/models/block/packager/tray.json b/src/main/resources/assets/create/models/block/packager/tray.json index 4177485039..08847e1415 100644 --- a/src/main/resources/assets/create/models/block/packager/tray.json +++ b/src/main/resources/assets/create/models/block/packager/tray.json @@ -1,8 +1,7 @@ { "credit": "Made with Blockbench", "textures": { - "4": "create:block/packager_tray", - "particle": "create:block/packager" + "4": "create:block/packager_tray" }, "elements": [ { diff --git a/src/main/resources/assets/create/models/block/packager_link/block.json b/src/main/resources/assets/create/models/block/packager_link/block.json new file mode 100644 index 0000000000..b71481b1bc --- /dev/null +++ b/src/main/resources/assets/create/models/block/packager_link/block.json @@ -0,0 +1,123 @@ +{ + "credit": "Made with Blockbench", + "loader": "forge:composite", + "parent": "block/block", + "textures": { + "particle": "create:block/vault/vault_front_small" + }, + "children": { + "base": { + "render_type": "minecraft:solid", + "textures": { + "1": "create:block/packager_link", + "2": "create:block/packager_link_side" + }, + "elements": [ + { + "from": [9, 6, 3.5], + "to": [13, 9, 12.5], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "faces": { + "north": {"uv": [14.5, 0, 12.5, 1.5], "texture": "#1"}, + "east": {"uv": [14.5, 6, 16, 1.5], "rotation": 90, "texture": "#1"}, + "south": {"uv": [12.5, 0, 14.5, 1.5], "texture": "#1"}, + "west": {"uv": [14.5, 6, 16, 1.5], "rotation": 90, "texture": "#1"}, + "up": {"uv": [14.5, 1.5, 12.5, 6], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [1, 1, 1], + "to": [15, 6, 15], + "faces": { + "north": {"uv": [0, 0, 14, 5], "texture": "#2"}, + "east": {"uv": [7.5, 9, 10, 16], "rotation": 90, "texture": "#1"}, + "south": {"uv": [0, 0, 14, 5], "texture": "#2"}, + "west": {"uv": [7.5, 9, 10, 16], "rotation": 90, "texture": "#1"}, + "up": {"uv": [0, 9, 7, 16], "texture": "#1"}, + "down": {"uv": [0, 1.5, 7, 8.5], "texture": "#1"} + } + }, + { + "from": [2, -1, 2], + "to": [14, 1, 14], + "faces": { + "north": {"uv": [0.5, 0, 6.5, 1], "texture": "#1"}, + "east": {"uv": [0.5, 0, 6.5, 1], "texture": "#1"}, + "south": {"uv": [0.5, 0, 6.5, 1], "texture": "#1"}, + "west": {"uv": [0.5, 0, 6.5, 1], "texture": "#1"}, + "down": {"uv": [0.5, 2, 6.5, 8], "texture": "#1"} + } + }, + { + "from": [3, 5, 2], + "to": [7, 7, 7], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "faces": { + "north": {"uv": [13.5, 11.5, 11.5, 12], "texture": "#1"}, + "east": {"uv": [11, 11.5, 11.5, 9], "rotation": 90, "texture": "#1"}, + "south": {"uv": [13.5, 11.5, 11.5, 12], "texture": "#1"}, + "west": {"uv": [11, 11.5, 11.5, 9], "rotation": 90, "texture": "#1"}, + "up": {"uv": [13.5, 9, 11.5, 11.5], "texture": "#1"} + } + }, + { + "from": [3, 6, 8], + "to": [7, 8, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "faces": { + "north": {"uv": [13.5, 7.5, 11.5, 8.5], "texture": "#1"}, + "east": {"uv": [13.5, 7.5, 11.5, 8.5], "texture": "#1"}, + "south": {"uv": [13.5, 7.5, 11.5, 8.5], "texture": "#1"}, + "west": {"uv": [13.5, 7.5, 11.5, 8.5], "texture": "#1"}, + "up": {"uv": [13.5, 6, 11.5, 8], "texture": "#1"} + } + } + ] + }, + "bulb_inner": { + "render_type": "minecraft:cutout", + "textures": { + "1": "create:block/packager_link" + }, + "elements": [ + { + "from": [2.5, 8, 9], + "to": [7.5, 13, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [6, 7.5, 19]}, + "faces": { + "south": {"uv": [16, 13.5, 13.5, 16], "texture": "#1"} + } + }, + { + "from": [2.5, 8, 10], + "to": [7.5, 13, 11], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "faces": { + "north": {"uv": [16, 13.5, 13.5, 16], "texture": "#1"} + } + } + ] + }, + "bulb": { + "render_type": "minecraft:translucent", + "textures": { + "1": "create:block/packager_link" + }, + "elements": [ + { + "from": [2.5, 8, 7.5], + "to": [7.5, 13, 12.5], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "faces": { + "north": {"uv": [16, 8.5, 13.5, 11], "texture": "#1"}, + "east": {"uv": [16, 8.5, 13.5, 11], "texture": "#1"}, + "south": {"uv": [16, 8.5, 13.5, 11], "texture": "#1"}, + "west": {"uv": [16, 8.5, 13.5, 11], "texture": "#1"}, + "up": {"uv": [16, 6, 13.5, 8.5], "texture": "#1"}, + "down": {"uv": [16, 11, 13.5, 13.5], "texture": "#1"} + } + } + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/packager_link/block_powered.json b/src/main/resources/assets/create/models/block/packager_link/block_powered.json new file mode 100644 index 0000000000..751d5cf377 --- /dev/null +++ b/src/main/resources/assets/create/models/block/packager_link/block_powered.json @@ -0,0 +1,123 @@ +{ + "credit": "Made with Blockbench", + "loader": "forge:composite", + "parent": "block/block", + "textures": { + "particle": "create:block/vault/vault_front_small" + }, + "children": { + "base": { + "render_type": "minecraft:solid", + "textures": { + "1": "create:block/packager_link", + "2": "create:block/packager_link_side_powered" + }, + "elements": [ + { + "from": [9, 6, 3.5], + "to": [13, 9, 12.5], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "faces": { + "north": {"uv": [14.5, 0, 12.5, 1.5], "texture": "#1"}, + "east": {"uv": [14.5, 6, 16, 1.5], "rotation": 90, "texture": "#1"}, + "south": {"uv": [12.5, 0, 14.5, 1.5], "texture": "#1"}, + "west": {"uv": [14.5, 6, 16, 1.5], "rotation": 90, "texture": "#1"}, + "up": {"uv": [14.5, 1.5, 12.5, 6], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [1, 1, 1], + "to": [15, 6, 15], + "faces": { + "north": {"uv": [0, 0, 14, 5], "texture": "#2"}, + "east": {"uv": [7.5, 9, 10, 16], "rotation": 90, "texture": "#1"}, + "south": {"uv": [0, 0, 14, 5], "texture": "#2"}, + "west": {"uv": [7.5, 9, 10, 16], "rotation": 90, "texture": "#1"}, + "up": {"uv": [0, 9, 7, 16], "texture": "#1"}, + "down": {"uv": [0, 1.5, 7, 8.5], "texture": "#1"} + } + }, + { + "from": [2, -1, 2], + "to": [14, 1, 14], + "faces": { + "north": {"uv": [0.5, 0, 6.5, 1], "texture": "#1"}, + "east": {"uv": [0.5, 0, 6.5, 1], "texture": "#1"}, + "south": {"uv": [0.5, 0, 6.5, 1], "texture": "#1"}, + "west": {"uv": [0.5, 0, 6.5, 1], "texture": "#1"}, + "down": {"uv": [0.5, 2, 6.5, 8], "texture": "#1"} + } + }, + { + "from": [3, 5, 2], + "to": [7, 7, 7], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "faces": { + "north": {"uv": [13.5, 11.5, 11.5, 12], "texture": "#1"}, + "east": {"uv": [11, 11.5, 11.5, 9], "rotation": 90, "texture": "#1"}, + "south": {"uv": [13.5, 11.5, 11.5, 12], "texture": "#1"}, + "west": {"uv": [11, 11.5, 11.5, 9], "rotation": 90, "texture": "#1"}, + "up": {"uv": [13.5, 9, 11.5, 11.5], "texture": "#1"} + } + }, + { + "from": [3, 6, 8], + "to": [7, 8, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "faces": { + "north": {"uv": [13.5, 7.5, 11.5, 8.5], "texture": "#1"}, + "east": {"uv": [13.5, 7.5, 11.5, 8.5], "texture": "#1"}, + "south": {"uv": [13.5, 7.5, 11.5, 8.5], "texture": "#1"}, + "west": {"uv": [13.5, 7.5, 11.5, 8.5], "texture": "#1"}, + "up": {"uv": [13.5, 6, 11.5, 8], "texture": "#1"} + } + } + ] + }, + "bulb_inner": { + "render_type": "minecraft:cutout", + "textures": { + "1": "create:block/packager_link" + }, + "elements": [ + { + "from": [2.5, 8, 9], + "to": [7.5, 13, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [6, 7.5, 19]}, + "faces": { + "south": {"uv": [16, 13.5, 13.5, 16], "texture": "#1"} + } + }, + { + "from": [2.5, 8, 10], + "to": [7.5, 13, 11], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "faces": { + "north": {"uv": [16, 13.5, 13.5, 16], "texture": "#1"} + } + } + ] + }, + "bulb": { + "render_type": "minecraft:translucent", + "textures": { + "1": "create:block/packager_link" + }, + "elements": [ + { + "from": [2.5, 8, 7.5], + "to": [7.5, 13, 12.5], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "faces": { + "north": {"uv": [16, 8.5, 13.5, 11], "texture": "#1"}, + "east": {"uv": [16, 8.5, 13.5, 11], "texture": "#1"}, + "south": {"uv": [16, 8.5, 13.5, 11], "texture": "#1"}, + "west": {"uv": [16, 8.5, 13.5, 11], "texture": "#1"}, + "up": {"uv": [16, 6, 13.5, 8.5], "texture": "#1"}, + "down": {"uv": [16, 11, 13.5, 13.5], "texture": "#1"} + } + } + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/block/logistical_link.png b/src/main/resources/assets/create/textures/block/logistical_link.png deleted file mode 100644 index ace6a9a50dde9602280e60d39344a84c85c7bd2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1265 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1cpgOK~z{rwU=Fp z8&wp?&&C)_MsnwT5GpUS6U%!VY^+8vAgbUl1Va?&vE`YIpf_VCX*I_aB}aRoRj;% z=YCBTa@qIZUgz5rQxpt^(OgBjWY@}a(X|rYH@<}q95^K6{1V@@+v&TbpLz!av@)|y zqx-+{;#GXaqPL4iPhd@xX?jrD&4A87nJv-Vr^a}!i`De17E~+ zLu{yzqFW<0{?ZtYj1PNll*&U7?r`MJ_3&CzZ={q-Q>Bm>bxh0mKTP_bf>Y1$bOzSw zqHg9(qC^{Yu?s-E&H=vTOms`T40r-S#kPetf@jFUjly$2b?9RA8sPNHun<|0+8YoC zTE(=(cLu7(LcQirNiZmk!FTfa-Ox4z@;>Jg0(ta6{!WhZ1CMyq1JVE91%4M8c7oqs zaBSbh&X!n+t{Vn@wm~n6L{M5P9gT=AoS8i7UFDIr19WR-9W5FwboB6XZ%`-qKkjhnD4#iMol8l<Q>A-I@&@G zzml~&>Ey!*urFZoiR2P}{>5>^d!@``Chv(r-6^YDwWMgpENMMzkA}7oupt%`0pPi( zwu!RwBxGb?06{Ys=c#XSebYwQw9L9g;rT;oPwK02uLLV5Dmb)0JO?Nqu6s7eqMEOb&C)nuk22DzAP4SEY1jD zLPFIs&s>@^Ak#{WEEXWv@8z^Gc_!RwLV(O86B|UwFrEsTR$}p=(Y7+ag&h3&L+_eg zB>-tWdhEM;tMhaiY10+7L_43J5F%imc>kR}&MU9KrM&sti$a9TKf>Iy{?2->MxzM$ zB8I{Fk7xMT4C_QXWr)(q)qYoG06)SDh+jU~z}5LYrIu^|8{x~~T80>0PHdgvj#o_F bEkyqSLG8{T70KXl00000NkvXXu0mjfT^efe diff --git a/src/main/resources/assets/create/textures/block/logistical_link_side.png b/src/main/resources/assets/create/textures/block/logistical_link_side.png deleted file mode 100644 index 6f4079a5a403ccdcff30c017a63ebaf6dd5f70d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 278 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}50G|+7M-P|a@IXroCr8HsTN@8k6Wf-iau<&%TSf+NM#eBkMgt~>%*-U9 za=s%^d_h!6kYDhBWWeBh;LZu43}=ByWHC^|VGw3Kp1&dmC>ZVO;uxY4y!4DC-(d$1 z=fGsAgtSM$Um2H#vkN+pXgnw5LS4-ixshfb-FnGH9xvXNS%G}50G|+7M-P|a@IXroCr8HsTN@8k6Wf-iau<)N=?n~87#PknFqASdWM(D- zm0wicHUUWSl?3?(|3?N4t_SX%0LpL{ctjQh6&wa(#^d=bQhH~gNX}c!> zE@kRI{?}PQK;D>p%hs8!r{+X1=$QHR@ypZy9jzGlxO26gH1~A@+QQ)J>gTe~DWM4f D6INr7 diff --git a/src/main/resources/assets/create/textures/block/packager_link.png b/src/main/resources/assets/create/textures/block/packager_link.png new file mode 100644 index 0000000000000000000000000000000000000000..c98a911671bdae7a02fc2ef62883f6a42be20d33 GIT binary patch literal 3988 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/packager_link_side_powered.png b/src/main/resources/assets/create/textures/block/packager_link_side_powered.png new file mode 100644 index 0000000000000000000000000000000000000000..b6139f8fdd86494f3d2a4748a289519323c87780 GIT binary patch literal 276 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}B0G|+711k$h4;M$r0MD>YH@`#|kEqPdB=5LFLj!Y53#Z`lz?P=+=?n~8 z7#PknFwCDlxfH08fx*ZB;&~t?R1)MD{2v`KJlels2q?>0;1OBOz`%DHgc*38$lZxy-8q?;Kn_c~qpu?a z!^VE@KZ&eBzH5L_h%1oZcKTu6#3i;i9%;pGhYlTDwQAL?SFgIeyB9BBoS&a>Zf;&u zQu6=*|6|9Fg@%TvrKLT3^ytQon>TLUxPJZmk|j%kCOr6T>kFjBOM?7@fhw^8hG!1X z;($sx3p^r=85sBugD~Uq{1qt-49r%ZE{-7;ac^gJ2T3`Ku$o_VafuUr^55Q+N!H=W z6+RAA>*dv}b0VJ>-hQ1GS@w3L-lEraCdXJA>&%WEZf2aZMxD)|fsyAx?d$^#Yz7RI zzaC+@`}nbQun2nwpW18B?eFUT=5@rke$HpI>794ma-JS%LCODv^5U!(yZ%4mH$T9e zuwma0MtSpunzr@l!jJs>8o!tE@$_J~+wT8s_9>~|UVri3jwuGPyesw`cx(RP&d;tLhuN;w%I-PO_8~hRWJ1LzsgF`0=1LpP znz!k8!};ghkF3of@Wjtu-|_eL{wij+`k38}&GvT~%o`5=dc?Ma@#TMoi*i2KCa-(E zeP!AXg#$SWXa0Zg66a<%i1g=4XjsVhqxe)xv6<$9CoOr!Wg9DWwJ$_9+k^Ttens*8md{QtxJU#vpD&i;R3L(|XpI$n!e{{9rs2|0cA11j@dx>H?87YnH!#mR4vDrUukYQvw|)+9pv(eG zV5GLrzbD6bV50=X@gxSBZpH$gQ4VStXuSR!AELZ=U26U2E@0MT@O1TaS?83{1OURc BxfK8a literal 0 HcmV?d00001 From 82b1a61049020ead8a6c1a46208f31b1d4682a64 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Tue, 14 Nov 2023 17:57:06 +0100 Subject: [PATCH 023/515] Packaged Packages from Packagers - Assorted fixes --- .../logistics/packager/PackagerBlock.java | 2 ++ .../logistics/packager/PackagerBlockEntity.java | 4 ++-- .../logistics/stockTicker/StockTickerBlock.java | 16 ++++++++++++++-- .../stockTicker/StockTickerBlockEntity.java | 1 + 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java index 94cf43443a..bd418243f5 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java @@ -45,6 +45,8 @@ public class PackagerBlock extends WrenchableDirectionalBlock implements IBE { +public class StockTickerBlock extends HorizontalDirectionalBlock + implements LogisticalWorkstationBlock, IBE { public StockTickerBlock(Properties pProperties) { super(pProperties); } - + + @Override + public BlockState getStateForPlacement(BlockPlaceContext pContext) { + Direction facing = pContext.getHorizontalDirection() + .getOpposite(); + boolean reverse = pContext.getPlayer() != null && pContext.getPlayer() + .isShiftKeyDown(); + return super.getStateForPlacement(pContext).setValue(FACING, reverse ? facing.getOpposite() : facing); + } + @Override protected void createBlockStateDefinition(Builder pBuilder) { super.createBlockStateDefinition(pBuilder.add(FACING)); diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java index 045c329190..3b393cbc41 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java @@ -24,6 +24,7 @@ public class StockTickerBlockEntity extends LogisticalWorkstationBlockEntity { public StockTickerBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); + previouslyUsedAddress = ""; } @Override From 5e235db2fc20d852c5f87c8fa5709165f467cfae Mon Sep 17 00:00:00 2001 From: zelophed Date: Wed, 15 Nov 2023 21:26:46 +0100 Subject: [PATCH 024/515] merge new changes to 1.20.1 --- gradle.properties | 4 ++-- .../infrastructure/ponder/scenes/CartAssemblerScenes.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/gradle.properties b/gradle.properties index 2c37d9e821..79813fa0dc 100644 --- a/gradle.properties +++ b/gradle.properties @@ -28,8 +28,8 @@ jei_minecraft_version = 1.20.1 jei_version = 15.2.0.22 curios_minecraft_version = 1.20.1 curios_version = 5.2.0-beta.3 -catnip_version = 0.7.3 -ponder_version = 0.7.3 +catnip_version = 0.7.4 +ponder_version = 0.7.4 cc_tweaked_enable = true cc_tweaked_minecraft_version = 1.20.1 diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/CartAssemblerScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/CartAssemblerScenes.java index cd127c0056..79dcb784cc 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/CartAssemblerScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/CartAssemblerScenes.java @@ -11,11 +11,11 @@ import net.createmod.ponder.api.ParticleEmitter; import net.createmod.ponder.api.PonderPalette; import net.createmod.ponder.api.element.ElementLink; import net.createmod.ponder.api.element.EntityElement; +import net.createmod.ponder.api.element.MinecartElement; import net.createmod.ponder.api.element.WorldSectionElement; import net.createmod.ponder.api.scene.SceneBuilder; import net.createmod.ponder.api.scene.SceneBuildingUtil; import net.createmod.ponder.api.scene.Selection; -import net.createmod.ponder.foundation.element.MinecartElement; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.particles.ParticleTypes; From 2fe0f7894b1622309e030b777edfe78837d5a4af Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 9 Feb 2024 11:12:53 +0100 Subject: [PATCH 025/515] Request screen fixups --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 32 +++++++++++++---- .../resources/assets/create/lang/en_ud.json | 1 + .../resources/assets/create/lang/en_us.json | 1 + .../content/logistics/box/PackageItem.java | 13 +++++-- .../logistics/filter/FilterItemStack.java | 3 +- .../packager/PackagerBlockEntity.java | 1 + .../stockTicker/StockTickerRequestScreen.java | 34 +++++++++++++++++-- .../assets/create/lang/default/interface.json | 1 + 8 files changed, 72 insertions(+), 14 deletions(-) diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index e12e060bd0..d1d4b7cc78 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2023-11-14T17:22:08.2034016 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2023-11-15T17:03:30.7508565 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -52,6 +52,8 @@ debf33346bf410216f21082e1e8d07aa6250b84c assets/create/blockstates/brown_nixie_t 440b29e1dffa4374ddc1aed444bff18a485bc1cb assets/create/blockstates/brown_valve_handle.json 2064534de4791b339fdcd4ef3a8129a2e233ec50 assets/create/blockstates/calcite_pillar.json 060c957b28afed9f4e0954cbef7e80cbf4b99f58 assets/create/blockstates/cart_assembler.json +eeffe640493e7989b05126fa39d239d406627e3d assets/create/blockstates/charged_contact.json +582b1c5bebe0e94fed65eca11b5534b0e283d8c9 assets/create/blockstates/charge_relay.json c7eca70054241944171b1d4ffcba0376b071ec62 assets/create/blockstates/chocolate.json 9eb989b0a0545af9efd052d1f127b2ec28a972d1 assets/create/blockstates/chute.json b5170d754ce5f07ea2b4646eb07c099c50bae249 assets/create/blockstates/clipboard.json @@ -65,6 +67,7 @@ b5170d754ce5f07ea2b4646eb07c099c50bae249 assets/create/blockstates/clipboard.jso 134c62bbd8ea43ff54c8edb2da5ea707f0a228fe assets/create/blockstates/copper_backtank.json 1b1e311efecc45ce7a3f69c8a1c2c53c6559b995 assets/create/blockstates/copper_bars.json 33175a9b530554e42e2ac68a9761d55f7f8623cf assets/create/blockstates/copper_casing.json +761120a063b09562a407ce27a7326664dffa9a7b assets/create/blockstates/copper_coil.json f7254f20f91e2f1295e36d2e70390d43f3952d07 assets/create/blockstates/copper_door.json 736777de0eb038ff1ef9e8fe9d04c23d80239eda assets/create/blockstates/copper_ladder.json df3103dfc1c3ba7a9573229d009cb0de4925df16 assets/create/blockstates/copper_scaffolding.json @@ -587,9 +590,11 @@ d688e80dfbd5b17970814887c3698fc721981caa assets/create/blockstates/wooden_bracke b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbox.json fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json +c9b71aef4eeca024f63f1c4a3cf4564726bf860c assets/create/blockstates/zinc_casing.json +d44ad16b315bbd2fa226b367d51777184c018258 assets/create/blockstates/zinc_coil.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -711da58b5b20fb40868de441134f5875d1231b38 assets/create/lang/en_ud.json -7c5765fe164103972a783ec113aa637d7bcd1911 assets/create/lang/en_us.json +2a0fae4dc61478f02f3ab0141c9ea6233ef511e0 assets/create/lang/en_ud.json +47574ab81a7607ad0923be4874a41390c4195067 assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -724,6 +729,7 @@ d8339ab47ffa828985c7da27c37794a95aba8b42 assets/create/models/block/clockwork_be 8afe6afaff33b94c1fcee68fdaf842d525eec212 assets/create/models/block/copper_cap.json 58e6ed1f765ba67ca5d8a446af357f311587e431 assets/create/models/block/copper_cap_alt.json d8053f194ee9331288aadac94bc23fff5a63ae9c assets/create/models/block/copper_casing.json +ceaa622d3ad11f249f9278ac03d49a941a106a79 assets/create/models/block/copper_coil.json 2606721928394e80b24b5f0ff7011c1c552cfe7c assets/create/models/block/copper_ladder.json d063df8e9b974c11fc7810ce176b02d7d924e15b assets/create/models/block/copper_post.json 2b5aed4a917694beb33d9b0ecbc800dcbc143ee9 assets/create/models/block/copper_post_ends.json @@ -1669,6 +1675,8 @@ cf8477d6c7558ceba38416fae755567086a856a6 assets/create/models/block/yellow_sail. 21bb6e0b43984214c496e531e16dd60aeb619a42 assets/create/models/block/yellow_toolbox.json 467109ede866fb030d2cdc46c832643630d982b5 assets/create/models/block/yellow_valve_handle.json 23d6852eca1bf1480dc74ed51d15c098e26a520f assets/create/models/block/zinc_block.json +cd3a393d9668e7e2ff353ef6b9d30628732f0bd9 assets/create/models/block/zinc_casing.json +c64796e26eb256938fa6c386b94fa0d0c09be4f1 assets/create/models/block/zinc_coil.json 617330267f01a08062b05b8516082d7ebdab3d0b assets/create/models/block/zinc_ore.json 86b835fa8d2264feb2159262b069c6c2cf68e818 assets/create/models/item/acacia_window.json 697eda24a3a1c79401d7d073a503804cb589e2f5 assets/create/models/item/acacia_window_pane.json @@ -1725,6 +1733,8 @@ fce64539b36fc8a5ffa39d7a3f73765818437cbf assets/create/models/item/brown_seat.js 1db479848369140bb913ba09f3f1d994e4ac864c assets/create/models/item/builders_tea.json f5ff4e2ed2ea2e43b6d02f6a95ba02b2e4b611dc assets/create/models/item/calcite_pillar.json 1cdb2b8801551c1540bb9b2a9cc3d725a2b433e7 assets/create/models/item/cart_assembler.json +9bf9831d1341f41c885280356ba2212c9da71e6a assets/create/models/item/charged_contact.json +8ab2a7a0fff23e72810673d8c863269664b83119 assets/create/models/item/charge_relay.json a197d08618f4035182c91a6b16031eb681ab8a7c assets/create/models/item/chest_minecart_contraption.json 293cfa8b1073f8641a2c623b73a90907576c36ed assets/create/models/item/chocolate_bucket.json 77654cbd16cdfa95181ea3f85fcfa3cd352b69fd assets/create/models/item/chocolate_glazed_berries.json @@ -1745,6 +1755,7 @@ de48f4b6fa26928ebc7d5d60e6a0767093430d65 assets/create/models/item/contraption_c 6c53b1a6ed28929b7a0a090edf6101e610f842fc assets/create/models/item/copper_backtank_placeable.json 2a0b31d76ab8a74c458475640d17de15ad314fcd assets/create/models/item/copper_bars.json 688e4dee99126b7507761de618d6788c18f17153 assets/create/models/item/copper_casing.json +21d59aa4de7bbb978b21065124c0dfd13dcbdf4d assets/create/models/item/copper_coil.json 68890c027cd6a094b484a237d3ff5daeb09622af assets/create/models/item/copper_diving_boots.json 23499699c6ea6a30673835056f5d0039519413fa assets/create/models/item/copper_diving_helmet.json 0e394c50a977eae45d3d8e6a62e256a5408ac994 assets/create/models/item/copper_door.json @@ -2291,6 +2302,8 @@ ac59f141cd3c3f7e57a794e542d6e22bf8ebb8f9 assets/create/models/item/yellow_seat.j 532a429d58a177f61b4d67180db7676fa7536052 assets/create/models/item/yellow_toolbox.json 2c87ef8a26a01a17b2f3799d62cb27cf1107d061 assets/create/models/item/yellow_valve_handle.json bcf63b7198d31d3a94b2566171b7e3e84464601c assets/create/models/item/zinc_block.json +df6b2facd5807b68d5ebac55934b9ed2acafdb33 assets/create/models/item/zinc_casing.json +0a9e2af4b6cde7e17e83ec919df68cfbf442a63a assets/create/models/item/zinc_coil.json d4a3290393c1c659f3d4dd4e267a87d287bd49a6 assets/create/models/item/zinc_ingot.json 1e9656f81ec01a89796b175cf029d1de45b758fe assets/create/models/item/zinc_nugget.json f3719d4d3a8d1e0d9f36db5d1317894ecacf3bf3 assets/create/models/item/zinc_ore.json @@ -3004,6 +3017,8 @@ d391cff5b741fd6ddf5b6fa64e05526eb3a9f0d9 data/create/loot_tables/blocks/brown_ni 7c7cf4c30786f6e0a699e2b3f9120343e53107f4 data/create/loot_tables/blocks/brown_valve_handle.json 06d1c478e4236210aa12b5911691868fef33bb5f data/create/loot_tables/blocks/calcite_pillar.json 515c839deea520b07b03f7ba65c4a7b22fdf5ba3 data/create/loot_tables/blocks/cart_assembler.json +3b3781f8766d5d23f8c8778263c6baf2f81f59fc data/create/loot_tables/blocks/charged_contact.json +815e28cf0f41cd8024d291339cad3f8cdcd000a8 data/create/loot_tables/blocks/charge_relay.json fb4877d45df15be1a74378ab28f23fbf9d0657ef data/create/loot_tables/blocks/chute.json ace9255cbdd1af5e5068916d2a6bed2f861f81f1 data/create/loot_tables/blocks/clipboard.json bfd871acdde6c239098ead188a5aad7636d11bc0 data/create/loot_tables/blocks/clockwork_bearing.json @@ -3016,6 +3031,7 @@ f2058ad809606d54123c7efbad2a6b995ed1defe data/create/loot_tables/blocks/controls e069fbd8c2331ef76611a33c6d66fd025b65d3b6 data/create/loot_tables/blocks/copper_backtank.json fa0856e11351ad0882de2066569807e782071881 data/create/loot_tables/blocks/copper_bars.json 5f48b688829ca7849997d88697cff2de1ede4804 data/create/loot_tables/blocks/copper_casing.json +880ccd1ac5188dd35d00414de4374ecb6d11d8c8 data/create/loot_tables/blocks/copper_coil.json 0937b9f634b86dbe41e07eda52c69993fce60fb5 data/create/loot_tables/blocks/copper_door.json 8ed70d812f38adfa147db07a4f2bbe206a69ad20 data/create/loot_tables/blocks/copper_ladder.json ac621731ca23e6fbb1003be59edacdf837dbc37e data/create/loot_tables/blocks/copper_scaffolding.json @@ -3536,6 +3552,8 @@ d9f853e662b004b6ffdbb82af99ad7e774698178 data/create/loot_tables/blocks/yellow_n 11b10beba7a6842ce3d01ea4210bff7d3aa6ab94 data/create/loot_tables/blocks/yellow_toolbox.json b9648ec56e55fe2b9d54adf172405519a46bfa66 data/create/loot_tables/blocks/yellow_valve_handle.json 8be474a69469561dfe759159a40fb135a6ad5de6 data/create/loot_tables/blocks/zinc_block.json +11b555a6eb588caaffbfe8deb7cfa7f10ab38e90 data/create/loot_tables/blocks/zinc_casing.json +59bc464d9bc1dcb50d0ca8fab5314fbef5a0968e data/create/loot_tables/blocks/zinc_coil.json 4ab95e007dd1ad1401800116e785ce85607907f8 data/create/loot_tables/blocks/zinc_ore.json 8af7629e400e2447e672796724ebcf20b9e327f1 data/create/recipes/acacia_window.json 16af9663aaaa3eaec11a6de9fde8df946fbec529 data/create/recipes/acacia_window_pane.json @@ -4177,7 +4195,7 @@ fdd28fc956dbec71ba24cdea5adfc049d6eb31e3 data/create/recipes/tuff_pillar_from_st 8a32b955b4320eddff017378785d1c95e1434229 data/create/recipes/weathered_copper_tile_stairs.json f1a03ac86925e26cbec6aeeada2eafb40008fc8e data/create/recipes/weathered_copper_tile_stairs_from_weathered_copper_tiles_stonecutting.json 8b98a671e80724e815a3af0c3764d760e4170e02 data/create/tags/blocks/brittle.json -8b6c0b444b15f7fb2d55b9cbcb68537c1269f877 data/create/tags/blocks/casing.json +6aa1b027fbeb41d04edc14868d6b69324f505b76 data/create/tags/blocks/casing.json 35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/create/tags/blocks/contraption_inventory_deny.json c7ec0dbc18e9c1b58e568ed925287b89df11a136 data/create/tags/blocks/copycat_allow.json 876eb9210f4a14898a2fe6d225699c66b5bdfeef data/create/tags/blocks/copycat_deny.json @@ -4209,7 +4227,7 @@ e191d5f912e05091b3a0b1df17f4c4181e04d96f data/create/tags/fluids/fan_processing_ c9ae54a7510073b17edf82f7591e14bdb2c51837 data/create/tags/fluids/fan_processing_catalysts/splashing.json 35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/create/tags/items/blaze_burner_fuel/regular.json 8ba98bf390a326abeebfd5d84be5f740c935a8b6 data/create/tags/items/blaze_burner_fuel/special.json -8b6c0b444b15f7fb2d55b9cbcb68537c1269f877 data/create/tags/items/casing.json +6aa1b027fbeb41d04edc14868d6b69324f505b76 data/create/tags/items/casing.json f43cac8216e2a9347e48cf93a43de95dd810ca20 data/create/tags/items/contraption_controlled.json d371dfd35e49a7bef19f59c03e7f4ae20992f03d data/create/tags/items/create_ingots.json 910d0f5ccbc4c84b224eca1f1588b1695f41447b data/create/tags/items/crushed_raw_materials.json @@ -4298,8 +4316,8 @@ c741ba83b562ae3459d7c4f2db69537f549ea411 data/forge/tags/items/tools/wrench.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/dripstone_replaceable_blocks.json e3321ff14704c031a2c16953b7e391f4f24dd70b data/minecraft/tags/blocks/impermeable.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/lush_ground_replaceable.json -048aac62c140e80fdf697ac3c69c491a885a1fa2 data/minecraft/tags/blocks/mineable/axe.json -3e4ab40c4ba66211e508e3aaceaede2e020527a2 data/minecraft/tags/blocks/mineable/pickaxe.json +eada9d497e6a4cfec442b3b0e8e6ba58b2d26324 data/minecraft/tags/blocks/mineable/axe.json +c8318db42c70456b12d9781c1f3f4c6490fe2349 data/minecraft/tags/blocks/mineable/pickaxe.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/moss_replaceable.json 0c13aae0eeb99e89febe8dbe5e002af2ff843a9e data/minecraft/tags/blocks/needs_iron_tool.json 3cb2a92cbdf32ed5978f740dc378d363306c3e84 data/minecraft/tags/blocks/needs_stone_tool.json diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 4b20b926ec..4046c21b60 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -1169,6 +1169,7 @@ "create.gui.stock_ticker.no_packagers_linked": "pǝʞuıꞀ sɹǝbɐʞɔɐԀ oN", "create.gui.stock_ticker.no_search_results": "punoɟ sɯǝʇı buıɥɔʇɐɯ oN", "create.gui.stock_ticker.package_adress": "ssǝɹppⱯ ǝbɐʞɔɐԀ", + "create.gui.stock_ticker.request_sent": "¡ʇuǝS ʇsǝnbǝᴚ", "create.gui.stock_ticker.search_items": "sɯǝʇI ɥɔɹɐǝS", "create.gui.stressometer.capacity": "ʎʇıɔɐdɐƆ buıuıɐɯǝᴚ", "create.gui.stressometer.no_rotation": "uoıʇɐʇoᴚ oN", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index d0e5123a99..b93d7d773d 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1169,6 +1169,7 @@ "create.gui.stock_ticker.no_packagers_linked": "No Packagers Linked", "create.gui.stock_ticker.no_search_results": "No matching items found", "create.gui.stock_ticker.package_adress": "Package Address", + "create.gui.stock_ticker.request_sent": "Request Sent!", "create.gui.stock_ticker.search_items": "Search Items", "create.gui.stressometer.capacity": "Remaining Capacity", "create.gui.stressometer.no_rotation": "No Rotation", diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java index 0e3dfbb910..3bfb1f12b9 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java @@ -84,14 +84,23 @@ public class PackageItem extends Item { return box; } + public static void clearAddress(ItemStack box) { + if (box.hasTag()) + box.getTag() + .remove("Address"); + } + public static void addAddress(ItemStack box, String address) { box.getOrCreateTag() .putString("Address", address); } public static boolean matchAddress(ItemStack box, String address) { - String boxAddress = box.getTag() - .getString("Address"); + String boxAddress = !box.hasTag() ? "" + : box.getTag() + .getString("Address"); + if (address.isBlank()) + return boxAddress.isBlank(); if (address.equals("*") || boxAddress.equals("*")) return true; String matcher = "\\Q" + address.replace("*", "\\E.*\\Q") + "\\E"; diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/FilterItemStack.java b/src/main/java/com/simibubi/create/content/logistics/filter/FilterItemStack.java index e3211c1968..212173a606 100644 --- a/src/main/java/com/simibubi/create/content/logistics/filter/FilterItemStack.java +++ b/src/main/java/com/simibubi/create/content/logistics/filter/FilterItemStack.java @@ -250,8 +250,7 @@ public class FilterItemStack { @Override public boolean test(Level world, ItemStack stack, boolean matchNBT) { return (filterString.isBlank() && super.test(world, stack, matchNBT)) - || stack.getItem() instanceof PackageItem - && PackageItem.matchAddress(stack, filterString.isBlank() ? "*" : filterString); + || stack.getItem() instanceof PackageItem && PackageItem.matchAddress(stack, filterString); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java index 144e230cc8..677ed87d2a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java @@ -264,6 +264,7 @@ public class PackagerBlockEntity extends SmartBlockEntity { } heldBox = extractedPackageItem.isEmpty() ? PackageItem.containing(extractedItems) : extractedPackageItem.copy(); + PackageItem.clearAddress(heldBox); if (fixedAddress != null) PackageItem.addAddress(heldBox, fixedAddress); animationInward = false; diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java index 4f89d7b222..91727cde5d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java @@ -52,6 +52,7 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { EditBox addressBox; int emptyTicks = 0; + int successTicks = 0; List> currentItemSource; List> displayedItems; @@ -67,6 +68,7 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { blockEntity.lastClientsideStockSnapshot = null; ticksSinceLastUpdate = 15; emptyTicks = 0; + successTicks = 0; itemScroll = LerpedFloat.linear() .startWithValue(0); } @@ -165,6 +167,11 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { emptyTicks++; else emptyTicks = 0; + + if (successTicks > 0 && itemsToOrder.isEmpty()) + successTicks++; + else + successTicks = 0; List> clientStockSnapshot = blockEntity.getClientStockSnapshot(); if (clientStockSnapshot != currentItemSource) { @@ -190,7 +197,7 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { protected void renderWindow(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { PoseStack ms = graphics.pose(); Color color = new Color(255, 255, 255, 50); - float currentScroll = itemScroll.getValue(minecraft.getDeltaFrameTime()); + float currentScroll = itemScroll.getValue(partialTicks); int startRow = Math.max(0, Mth.floor(currentScroll) - 1); int hoveredSlot = getHoveredSlot(mouseX, mouseY, true); @@ -245,12 +252,21 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { ms.popPose(); } + // Something isnt right if (displayedItems.isEmpty()) { Component msg = getTroubleshootingMessage(); - float alpha = Mth.clamp((emptyTicks - 10f) / 20f, 0f, 1f); + float alpha = Mth.clamp((emptyTicks - 10f) / 5f, 0f, 1f); if (alpha > 0) graphics.drawString(font, msg, itemsX + 1, itemsY, new Color(.5f, .5f, .5f, alpha).getRGB()); } + + // Request just sent + if (itemsToOrder.isEmpty() && successTicks > 0) { + Component msg = Lang.translateDirect("gui.stock_ticker.request_sent"); + float alpha = Mth.clamp((successTicks - 10f) / 5f, 0f, 1f); + if (alpha > 0) + graphics.drawCenteredString(font, msg, itemsX + cols * colWidth / 2, orderY + 4, new Color(.75f, .95f, .75f, alpha).getRGB()); + } hoveredSlot = getHoveredSlot(mouseX, mouseY, false); @@ -551,14 +567,26 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { return true; } + @Override + public void removed() { + AllPackets.getChannel() + .sendToServer(new PackageOrderRequestPacket(blockEntity.getBlockPos(), Collections.emptyList(), + addressBox.getValue())); + super.removed(); + } + private void sendIt() { revalidateOrders(); if (itemsToOrder.isEmpty()) return; + AllPackets.getChannel() .sendToServer( new PackageOrderRequestPacket(blockEntity.getBlockPos(), itemsToOrder, addressBox.getValue())); - minecraft.setScreen(null); + + itemsToOrder = new ArrayList<>(); + ticksSinceLastUpdate = 10; + successTicks = 1; } @Override diff --git a/src/main/resources/assets/create/lang/default/interface.json b/src/main/resources/assets/create/lang/default/interface.json index 383214f760..cd79d4fee4 100644 --- a/src/main/resources/assets/create/lang/default/interface.json +++ b/src/main/resources/assets/create/lang/default/interface.json @@ -314,6 +314,7 @@ "create.gui.stock_ticker.search_items": "Search Items", "create.gui.stock_ticker.package_adress": "Package Address", "create.gui.stock_ticker.confirm_order": "Confirm Order", + "create.gui.stock_ticker.request_sent": "Request Sent!", "create.clipboard.actions": "Clipboard Actions", "create.clipboard.to_copy": "%1$s to Copy settings", From 4c387a7b13a22c5973dbed8d89da143907b14a88 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 9 Feb 2024 16:20:20 +0100 Subject: [PATCH 026/515] Remove url templates from mods.toml - Fixes startup crash in Eclipse IDE --- gradle.properties | 3 --- src/main/resources/META-INF/mods.toml | 4 ++-- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/gradle.properties b/gradle.properties index 3941e88eb3..b5378ea520 100644 --- a/gradle.properties +++ b/gradle.properties @@ -39,9 +39,6 @@ cc_tweaked_version = 1.105.0 mod_id = create mod_name = Create mod_author = simibubi -mod_homepage = https://www.curseforge.com/minecraft/mc-mods/create -mod_source = https://github.com/Creators-of-Create/Create -mod_issues = https://github.com/Creators-of-Create/Create/issues mod_description = Technology that empowers the player. mod_license = MIT diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index e2dbabcd64..5c7726d143 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -1,13 +1,13 @@ modLoader="javafml" loaderVersion="[47,)" -issueTrackerURL="${mod_issues}" +issueTrackerURL="https://github.com/Creators-of-Create/Create/issues" license="${mod_license}" [[mods]] modId="create" version="${file.jarVersion}" displayName="${mod_name}" -displayURL="${mod_homepage}" +displayURL="https://www.curseforge.com/minecraft/mc-mods/create" logoFile="logo.png" #credits="" authors="${mod_author}" From 30e9457c6e7c9bfd8ceb8cd0dd833104e803a215 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 9 Feb 2024 16:42:20 +0100 Subject: [PATCH 027/515] Catnip in a box --- .../content/equipment/hats/EntityHats.java | 4 +- .../logistics/box/PackageDestroyPacket.java | 2 +- .../content/logistics/box/PackageEntity.java | 4 +- .../content/logistics/box/PackageItem.java | 4 +- .../logistics/box/PackageRenderer.java | 8 ++-- .../depot/SharedDepotBlockMethods.java | 2 +- .../content/logistics/filter/FilterItem.java | 4 +- .../logistics/filter/PackageFilterScreen.java | 2 +- .../logistics/packager/InventorySummary.java | 2 +- .../packager/PackagerBlockEntity.java | 4 +- .../logistics/packager/PackagerRenderer.java | 10 ++--- .../packagerLink/PackagerLinkBlock.java | 2 +- .../LogisticalStockResponsePacket.java | 2 +- .../LogisticalWorkstationBlockEntity.java | 2 +- .../PackageOrderRequestPacket.java | 2 +- .../stockTicker/StockTickerBlockEntity.java | 2 +- .../StockTickerInteractionHandler.java | 4 +- .../stockTicker/StockTickerRequestScreen.java | 40 +++++++++---------- .../displayLink/ClickToLinkBlockItem.java | 16 ++++---- .../displayLink/LinkWithBulbBlockEntity.java | 6 +-- .../foundation/ponder/CreateSceneBuilder.java | 6 +-- 21 files changed, 64 insertions(+), 64 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/equipment/hats/EntityHats.java b/src/main/java/com/simibubi/create/content/equipment/hats/EntityHats.java index 930d8f4a58..f079c6ba0c 100644 --- a/src/main/java/com/simibubi/create/content/equipment/hats/EntityHats.java +++ b/src/main/java/com/simibubi/create/content/equipment/hats/EntityHats.java @@ -9,9 +9,9 @@ import com.simibubi.create.content.contraptions.actors.seat.SeatEntity; import com.simibubi.create.content.logistics.stockTicker.LogisticalWorkstationBlock; import com.simibubi.create.content.trains.entity.CarriageContraption; import com.simibubi.create.content.trains.entity.CarriageContraptionEntity; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.entity.EquipmentSlot; diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageDestroyPacket.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageDestroyPacket.java index 9fe90c4340..f445553019 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageDestroyPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageDestroyPacket.java @@ -1,8 +1,8 @@ package com.simibubi.create.content.logistics.box; import com.simibubi.create.foundation.networking.SimplePacketBase; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.core.particles.ItemParticleOption; diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java index 811806c4f1..e6da337530 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java @@ -9,9 +9,9 @@ import com.simibubi.create.AllEntityTypes; import com.simibubi.create.AllPackets; import com.simibubi.create.Create; import com.simibubi.create.content.logistics.chute.ChuteBlock; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java index 3bfb1f12b9..2bd9c2c811 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java @@ -5,9 +5,9 @@ import java.util.List; import java.util.Random; import com.simibubi.create.AllEntityTypes; -import com.simibubi.create.foundation.utility.Components; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.core.Direction; import net.minecraft.core.particles.ItemParticleOption; diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageRenderer.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageRenderer.java index 77a964d985..53501204fa 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageRenderer.java @@ -3,10 +3,10 @@ package com.simibubi.create.content.logistics.box; import com.jozufozu.flywheel.core.PartialModel; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllPartialModels; -import com.simibubi.create.foundation.render.CachedBufferer; -import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.utility.AngleHelper; +import net.createmod.catnip.render.CachedBuffers; +import net.createmod.catnip.render.SuperByteBuffer; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.entity.EntityRenderer; @@ -29,7 +29,7 @@ public class PackageRenderer extends EntityRenderer { if (box.isEmpty()) box = PackageItem.getFallbackBox(); PartialModel model = AllPartialModels.PACKAGES.get(ForgeRegistries.ITEMS.getKey(box.getItem())); - SuperByteBuffer sbb = CachedBufferer.partial(model, Blocks.AIR.defaultBlockState()); + SuperByteBuffer sbb = CachedBuffers.partial(model, Blocks.AIR.defaultBlockState()); sbb.translate(-.5, 0, -.5) .rotateCentered(Direction.UP, AngleHelper.rad(yaw)) .light(light) diff --git a/src/main/java/com/simibubi/create/content/logistics/depot/SharedDepotBlockMethods.java b/src/main/java/com/simibubi/create/content/logistics/depot/SharedDepotBlockMethods.java index a702735acf..ee68abd0fe 100644 --- a/src/main/java/com/simibubi/create/content/logistics/depot/SharedDepotBlockMethods.java +++ b/src/main/java/com/simibubi/create/content/logistics/depot/SharedDepotBlockMethods.java @@ -8,8 +8,8 @@ import com.simibubi.create.content.kinetics.belt.transport.TransportedItemStack; import com.simibubi.create.content.logistics.box.PackageEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import com.simibubi.create.foundation.item.ItemHelper; -import com.simibubi.create.foundation.utility.VecHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.sounds.SoundEvents; diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/FilterItem.java b/src/main/java/com/simibubi/create/content/logistics/filter/FilterItem.java index 10857ea00a..844c39aee2 100644 --- a/src/main/java/com/simibubi/create/content/logistics/filter/FilterItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/filter/FilterItem.java @@ -151,9 +151,9 @@ public class FilterItem extends Item implements MenuProvider { String address = filter.getOrCreateTag() .getString("Address"); if (!address.isBlank()) - list.add(Lang.text("-> ") + list.add(CreateLang.text("-> ") .style(ChatFormatting.GRAY) - .add(Lang.text(address) + .add(CreateLang.text(address) .style(ChatFormatting.GOLD)) .component()); } diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/PackageFilterScreen.java b/src/main/java/com/simibubi/create/content/logistics/filter/PackageFilterScreen.java index f44d574e74..d70ccebd4a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/filter/PackageFilterScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/filter/PackageFilterScreen.java @@ -7,10 +7,10 @@ import com.simibubi.create.AllItems; import com.simibubi.create.AllPackets; import com.simibubi.create.content.logistics.filter.FilterScreenPacket.Option; import com.simibubi.create.foundation.gui.AllGuiTextures; -import com.simibubi.create.foundation.gui.element.GuiGameElement; import com.simibubi.create.foundation.gui.widget.IconButton; import com.simibubi.create.foundation.gui.widget.Indicator; +import net.createmod.catnip.gui.element.GuiGameElement; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.EditBox; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/InventorySummary.java b/src/main/java/com/simibubi/create/content/logistics/packager/InventorySummary.java index 10a0f75c85..2412548a5f 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/InventorySummary.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/InventorySummary.java @@ -9,8 +9,8 @@ import java.util.Map; import com.google.common.collect.Lists; import com.simibubi.create.AllPackets; import com.simibubi.create.content.logistics.stockTicker.LogisticalStockResponsePacket; -import com.simibubi.create.foundation.utility.IntAttached; +import net.createmod.catnip.utility.IntAttached; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.Item; diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java index 677ed87d2a..75b9f4b3a7 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java @@ -13,9 +13,9 @@ import com.simibubi.create.foundation.blockEntity.behaviour.inventory.CapManipul import com.simibubi.create.foundation.blockEntity.behaviour.inventory.InvManipulationBehaviour; import com.simibubi.create.foundation.blockEntity.behaviour.inventory.VersionedInventoryTrackerBehaviour; import com.simibubi.create.foundation.item.ItemHelper; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.NBTHelper; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.NBTHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerRenderer.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerRenderer.java index b4750e21dd..8cf967ca4b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerRenderer.java @@ -5,10 +5,10 @@ import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllPartialModels; import com.simibubi.create.foundation.blockEntity.renderer.SmartBlockEntityRenderer; -import com.simibubi.create.foundation.render.CachedBufferer; -import com.simibubi.create.foundation.render.SuperByteBuffer; -import com.simibubi.create.foundation.utility.AngleHelper; +import net.createmod.catnip.render.CachedBuffers; +import net.createmod.catnip.render.SuperByteBuffer; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; @@ -40,7 +40,7 @@ public class PackagerRenderer extends SmartBlockEntityRenderer 0) { - Component msg = Lang.translateDirect("gui.stock_ticker.request_sent"); + Component msg = CreateLang.translateDirect("gui.stock_ticker.request_sent"); float alpha = Mth.clamp((successTicks - 10f) / 5f, 0f, 1f); if (alpha > 0) graphics.drawCenteredString(font, msg, itemsX + cols * colWidth / 2, orderY + 4, new Color(.75f, .95f, .75f, alpha).getRGB()); @@ -368,12 +368,12 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { int middleColor = special ? 0xaaffaa : 0xdddddd; for (int xi : Iterate.positiveAndNegative) - graphics.drawString(font, Lang.text(text) + graphics.drawString(font, CreateLang.text(text) .component(), 11 + xi, 10, xi < 0 ? lightOutline : darkOutline, false); for (int yi : Iterate.positiveAndNegative) - graphics.drawString(font, Lang.text(text) + graphics.drawString(font, CreateLang.text(text) .component(), 11, 10 + yi, yi < 0 ? lightOutline : darkOutline, false); - graphics.drawString(font, Lang.text(text) + graphics.drawString(font, CreateLang.text(text) .component(), 11, 10, middleColor, false); } @@ -433,7 +433,7 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { int color = inactive ? defaultColor.darker() .getRGB() : hovered ? 0xeeffffff : 0x99ffffff; graphics.renderOutline(confirmX, confirmY, confirmW, confirmH, color); - graphics.drawCenteredString(font, Lang.translateDirect("gui.stock_ticker.confirm_order"), + graphics.drawCenteredString(font, CreateLang.translateDirect("gui.stock_ticker.confirm_order"), confirmX + (confirmW / 2), confirmY + 4, color); } @@ -452,15 +452,15 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { private Component getTroubleshootingMessage() { if (currentItemSource == null) - return Lang.translate("gui.stock_ticker.checking_stocks") + return CreateLang.translate("gui.stock_ticker.checking_stocks") .component(); if (blockEntity.activeLinks == 0) - return Lang.translate("gui.stock_ticker.no_packagers_linked") + return CreateLang.translate("gui.stock_ticker.no_packagers_linked") .component(); if (currentItemSource.isEmpty()) - return Lang.translate("gui.stock_ticker.inventories_empty") + return CreateLang.translate("gui.stock_ticker.inventories_empty") .component(); - return Lang.translate("gui.stock_ticker.no_search_results") + return CreateLang.translate("gui.stock_ticker.no_search_results") .component(); } diff --git a/src/main/java/com/simibubi/create/content/redstone/displayLink/ClickToLinkBlockItem.java b/src/main/java/com/simibubi/create/content/redstone/displayLink/ClickToLinkBlockItem.java index 2464a08321..e19fd72b18 100644 --- a/src/main/java/com/simibubi/create/content/redstone/displayLink/ClickToLinkBlockItem.java +++ b/src/main/java/com/simibubi/create/content/redstone/displayLink/ClickToLinkBlockItem.java @@ -1,9 +1,9 @@ package com.simibubi.create.content.redstone.displayLink; import com.simibubi.create.AllSoundEvents; -import com.simibubi.create.CreateClient; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.CatnipClient; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; @@ -62,7 +62,7 @@ public abstract class ClickToLinkBlockItem extends BlockItem { if (player.isShiftKeyDown() && stack.hasTag()) { if (level.isClientSide) return InteractionResult.SUCCESS; - player.displayClientMessage(Lang.translateDirect(msgKey + ".clear"), true); + player.displayClientMessage(CreateLang.translateDirect(msgKey + ".clear"), true); stack.setTag(null); return InteractionResult.SUCCESS; } @@ -71,7 +71,7 @@ public abstract class ClickToLinkBlockItem extends BlockItem { if (!isValidTarget(level, pos)) { if (level.isClientSide) AllSoundEvents.DENY.playFrom(player); - player.displayClientMessage(Lang.translateDirect(msgKey + ".invalid"), true); + player.displayClientMessage(CreateLang.translateDirect(msgKey + ".invalid"), true); return InteractionResult.FAIL; } @@ -79,7 +79,7 @@ public abstract class ClickToLinkBlockItem extends BlockItem { return InteractionResult.SUCCESS; CompoundTag stackTag = stack.getOrCreateTag(); stackTag.put("SelectedPos", NbtUtils.writeBlockPos(pos)); - player.displayClientMessage(Lang.translateDirect(msgKey + ".set"), true); + player.displayClientMessage(CreateLang.translateDirect(msgKey + ".set"), true); stack.setTag(stackTag); return InteractionResult.SUCCESS; } @@ -91,7 +91,7 @@ public abstract class ClickToLinkBlockItem extends BlockItem { BlockPos placedPos = pos.relative(pContext.getClickedFace(), state.canBeReplaced() ? 0 : 1); if (!selectedPos.closerThan(placedPos, maxDistance)) { - player.displayClientMessage(Lang.translateDirect(msgKey + ".too_far") + player.displayClientMessage(CreateLang.translateDirect(msgKey + ".too_far") .withStyle(ChatFormatting.RED), true); return InteractionResult.FAIL; } @@ -106,7 +106,7 @@ public abstract class ClickToLinkBlockItem extends BlockItem { ItemStack itemInHand = player.getItemInHand(pContext.getHand()); if (!itemInHand.isEmpty()) itemInHand.setTag(null); - player.displayClientMessage(Lang.translateDirect(msgKey + ".success") + player.displayClientMessage(CreateLang.translateDirect(msgKey + ".success") .withStyle(ChatFormatting.GREEN), true); return useOn; } @@ -135,7 +135,7 @@ public abstract class ClickToLinkBlockItem extends BlockItem { lastShownPos = selectedPos; } - CreateClient.OUTLINER.showAABB("target", lastShownAABB) + CatnipClient.OUTLINER.showAABB("target", lastShownAABB) .colored(0xffcb74) .lineWidth(1 / 16f); } diff --git a/src/main/java/com/simibubi/create/content/redstone/displayLink/LinkWithBulbBlockEntity.java b/src/main/java/com/simibubi/create/content/redstone/displayLink/LinkWithBulbBlockEntity.java index 673c714317..5319c006e0 100644 --- a/src/main/java/com/simibubi/create/content/redstone/displayLink/LinkWithBulbBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/redstone/displayLink/LinkWithBulbBlockEntity.java @@ -1,10 +1,10 @@ package com.simibubi.create.content.redstone.displayLink; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; -import com.simibubi.create.foundation.utility.NBTHelper; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; -import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.block.entity.BlockEntityType; diff --git a/src/main/java/com/simibubi/create/foundation/ponder/CreateSceneBuilder.java b/src/main/java/com/simibubi/create/foundation/ponder/CreateSceneBuilder.java index 2c6a48a1b8..fc52bed1be 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/CreateSceneBuilder.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/CreateSceneBuilder.java @@ -19,7 +19,7 @@ import com.simibubi.create.content.kinetics.gauge.SpeedGaugeBlockEntity; import com.simibubi.create.content.kinetics.mechanicalArm.ArmBlockEntity; import com.simibubi.create.content.logistics.funnel.FunnelBlockEntity; import com.simibubi.create.content.processing.burner.BlazeBurnerBlockEntity; -import com.simibubi.create.content.redstone.displayLink.DisplayLinkBlockEntity; +import com.simibubi.create.content.redstone.displayLink.LinkWithBulbBlockEntity; import com.simibubi.create.content.trains.display.FlapDisplayBlockEntity; import com.simibubi.create.content.trains.signal.SignalBlockEntity; import com.simibubi.create.content.trains.station.StationBlockEntity; @@ -301,8 +301,8 @@ public class CreateSceneBuilder extends PonderSceneBuilder { } public void flashDisplayLink(BlockPos position) { - modifyBlockEntity(position, DisplayLinkBlockEntity.class, - linkBlockEntity -> linkBlockEntity.glow.setValue(2)); + modifyBlockEntity(position, LinkWithBulbBlockEntity.class, + linkBlockEntity -> linkBlockEntity.pulse()); } } From 75c8d558a59a785e8a6cfd05699f7c7e9bf05f3d Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Sat, 10 Feb 2024 21:50:40 +0100 Subject: [PATCH 028/515] TEDx: I solved 100 edge cases, so you don't have to - Packages originating from a request now carry contextual information about the order and how it got fragmented - Added the Order Collector, for restoring correct item order in packages at the destination - Fixed packagers not interacting with crafters correctly --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 35 +- .../create/blockstates/order_collector.json | 19 + .../resources/assets/create/lang/en_ud.json | 1 + .../resources/assets/create/lang/en_us.json | 1 + .../create/models/item/order_collector.json | 3 + .../loot_tables/blocks/order_collector.json | 21 ++ .../minecraft/tags/blocks/mineable/axe.json | 2 +- .../tags/blocks/mineable/pickaxe.json | 3 + .../simibubi/create/AllBlockEntityTypes.java | 9 + .../java/com/simibubi/create/AllBlocks.java | 23 +- .../content/logistics/box/PackageItem.java | 52 ++- .../logistics/depot/EjectorInstance.java | 3 +- .../orderCollector/OrderCollectorBlock.java | 57 +++ .../OrderCollectorBlockEntity.java | 342 ++++++++++++++++++ .../OrderCollectorRenderer.java | 70 ++++ .../packager/PackagerBlockEntity.java | 113 ++++-- .../logistics/packager/PackagingRequest.java | 35 +- .../packagerLink/PackagerLinkBlockEntity.java | 13 +- .../logistics/stockTicker/PackageOrder.java | 53 +++ .../PackageOrderRequestPacket.java | 24 +- .../stockTicker/StockTickerBlockEntity.java | 53 ++- .../stockTicker/StockTickerRequestScreen.java | 32 +- .../models/block/order_collector/block.json | 57 +++ .../models/block/order_collector/item.json | 72 ++++ .../create/textures/block/order_collector.png | Bin 0 -> 518 bytes 25 files changed, 977 insertions(+), 116 deletions(-) create mode 100644 src/generated/resources/assets/create/blockstates/order_collector.json create mode 100644 src/generated/resources/assets/create/models/item/order_collector.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/order_collector.json create mode 100644 src/main/java/com/simibubi/create/content/logistics/orderCollector/OrderCollectorBlock.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/orderCollector/OrderCollectorBlockEntity.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/orderCollector/OrderCollectorRenderer.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrder.java create mode 100644 src/main/resources/assets/create/models/block/order_collector/block.json create mode 100644 src/main/resources/assets/create/models/block/order_collector/item.json create mode 100644 src/main/resources/assets/create/textures/block/order_collector.png diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index d1d4b7cc78..59d422689f 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2023-11-15T17:03:30.7508565 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-02-09T22:58:24.5307206 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -52,8 +52,6 @@ debf33346bf410216f21082e1e8d07aa6250b84c assets/create/blockstates/brown_nixie_t 440b29e1dffa4374ddc1aed444bff18a485bc1cb assets/create/blockstates/brown_valve_handle.json 2064534de4791b339fdcd4ef3a8129a2e233ec50 assets/create/blockstates/calcite_pillar.json 060c957b28afed9f4e0954cbef7e80cbf4b99f58 assets/create/blockstates/cart_assembler.json -eeffe640493e7989b05126fa39d239d406627e3d assets/create/blockstates/charged_contact.json -582b1c5bebe0e94fed65eca11b5534b0e283d8c9 assets/create/blockstates/charge_relay.json c7eca70054241944171b1d4ffcba0376b071ec62 assets/create/blockstates/chocolate.json 9eb989b0a0545af9efd052d1f127b2ec28a972d1 assets/create/blockstates/chute.json b5170d754ce5f07ea2b4646eb07c099c50bae249 assets/create/blockstates/clipboard.json @@ -67,7 +65,6 @@ b5170d754ce5f07ea2b4646eb07c099c50bae249 assets/create/blockstates/clipboard.jso 134c62bbd8ea43ff54c8edb2da5ea707f0a228fe assets/create/blockstates/copper_backtank.json 1b1e311efecc45ce7a3f69c8a1c2c53c6559b995 assets/create/blockstates/copper_bars.json 33175a9b530554e42e2ac68a9761d55f7f8623cf assets/create/blockstates/copper_casing.json -761120a063b09562a407ce27a7326664dffa9a7b assets/create/blockstates/copper_coil.json f7254f20f91e2f1295e36d2e70390d43f3952d07 assets/create/blockstates/copper_door.json 736777de0eb038ff1ef9e8fe9d04c23d80239eda assets/create/blockstates/copper_ladder.json df3103dfc1c3ba7a9573229d009cb0de4925df16 assets/create/blockstates/copper_scaffolding.json @@ -341,6 +338,7 @@ af4c2c4861d1410e1b7371a5bf3fe09ed3ab0077 assets/create/blockstates/orange_sail.j aab812cecf7d10d4e7587f4dead8a98238a15f41 assets/create/blockstates/orange_seat.json 2bc30ed9907230271b4e2d0786f106f3e1e25029 assets/create/blockstates/orange_toolbox.json 2af63a4768f84fc93c7e7d67fa9a64438433e59f assets/create/blockstates/orange_valve_handle.json +91b52260e2537dedcd31663638cc60a1583aebdb assets/create/blockstates/order_collector.json 515ed7dae09b052f289419ba09998a23e0d7083d assets/create/blockstates/ornate_iron_window.json 8118444f37536b9104ef4818d374b0c8a7c987bf assets/create/blockstates/ornate_iron_window_pane.json 97cd78453af94f44cef1187988966626574b29d5 assets/create/blockstates/oxidized_copper_shingles.json @@ -590,11 +588,9 @@ d688e80dfbd5b17970814887c3698fc721981caa assets/create/blockstates/wooden_bracke b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbox.json fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json -c9b71aef4eeca024f63f1c4a3cf4564726bf860c assets/create/blockstates/zinc_casing.json -d44ad16b315bbd2fa226b367d51777184c018258 assets/create/blockstates/zinc_coil.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -2a0fae4dc61478f02f3ab0141c9ea6233ef511e0 assets/create/lang/en_ud.json -47574ab81a7607ad0923be4874a41390c4195067 assets/create/lang/en_us.json +d720e39c164625704769a422438f0d48a9088c4e assets/create/lang/en_ud.json +00171a3b1c176865a31a8b18297719f7ee610e21 assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -729,7 +725,6 @@ d8339ab47ffa828985c7da27c37794a95aba8b42 assets/create/models/block/clockwork_be 8afe6afaff33b94c1fcee68fdaf842d525eec212 assets/create/models/block/copper_cap.json 58e6ed1f765ba67ca5d8a446af357f311587e431 assets/create/models/block/copper_cap_alt.json d8053f194ee9331288aadac94bc23fff5a63ae9c assets/create/models/block/copper_casing.json -ceaa622d3ad11f249f9278ac03d49a941a106a79 assets/create/models/block/copper_coil.json 2606721928394e80b24b5f0ff7011c1c552cfe7c assets/create/models/block/copper_ladder.json d063df8e9b974c11fc7810ce176b02d7d924e15b assets/create/models/block/copper_post.json 2b5aed4a917694beb33d9b0ecbc800dcbc143ee9 assets/create/models/block/copper_post_ends.json @@ -1675,8 +1670,6 @@ cf8477d6c7558ceba38416fae755567086a856a6 assets/create/models/block/yellow_sail. 21bb6e0b43984214c496e531e16dd60aeb619a42 assets/create/models/block/yellow_toolbox.json 467109ede866fb030d2cdc46c832643630d982b5 assets/create/models/block/yellow_valve_handle.json 23d6852eca1bf1480dc74ed51d15c098e26a520f assets/create/models/block/zinc_block.json -cd3a393d9668e7e2ff353ef6b9d30628732f0bd9 assets/create/models/block/zinc_casing.json -c64796e26eb256938fa6c386b94fa0d0c09be4f1 assets/create/models/block/zinc_coil.json 617330267f01a08062b05b8516082d7ebdab3d0b assets/create/models/block/zinc_ore.json 86b835fa8d2264feb2159262b069c6c2cf68e818 assets/create/models/item/acacia_window.json 697eda24a3a1c79401d7d073a503804cb589e2f5 assets/create/models/item/acacia_window_pane.json @@ -1733,8 +1726,6 @@ fce64539b36fc8a5ffa39d7a3f73765818437cbf assets/create/models/item/brown_seat.js 1db479848369140bb913ba09f3f1d994e4ac864c assets/create/models/item/builders_tea.json f5ff4e2ed2ea2e43b6d02f6a95ba02b2e4b611dc assets/create/models/item/calcite_pillar.json 1cdb2b8801551c1540bb9b2a9cc3d725a2b433e7 assets/create/models/item/cart_assembler.json -9bf9831d1341f41c885280356ba2212c9da71e6a assets/create/models/item/charged_contact.json -8ab2a7a0fff23e72810673d8c863269664b83119 assets/create/models/item/charge_relay.json a197d08618f4035182c91a6b16031eb681ab8a7c assets/create/models/item/chest_minecart_contraption.json 293cfa8b1073f8641a2c623b73a90907576c36ed assets/create/models/item/chocolate_bucket.json 77654cbd16cdfa95181ea3f85fcfa3cd352b69fd assets/create/models/item/chocolate_glazed_berries.json @@ -1755,7 +1746,6 @@ de48f4b6fa26928ebc7d5d60e6a0767093430d65 assets/create/models/item/contraption_c 6c53b1a6ed28929b7a0a090edf6101e610f842fc assets/create/models/item/copper_backtank_placeable.json 2a0b31d76ab8a74c458475640d17de15ad314fcd assets/create/models/item/copper_bars.json 688e4dee99126b7507761de618d6788c18f17153 assets/create/models/item/copper_casing.json -21d59aa4de7bbb978b21065124c0dfd13dcbdf4d assets/create/models/item/copper_coil.json 68890c027cd6a094b484a237d3ff5daeb09622af assets/create/models/item/copper_diving_boots.json 23499699c6ea6a30673835056f5d0039519413fa assets/create/models/item/copper_diving_helmet.json 0e394c50a977eae45d3d8e6a62e256a5408ac994 assets/create/models/item/copper_door.json @@ -2043,6 +2033,7 @@ af50363d603d61340b336569d58c1febde253665 assets/create/models/item/ochrum.json 56e7d28824d3fc566b5f551babbe423a550ef08c assets/create/models/item/orange_seat.json 96cc543d5afed90a022ece7b8671cd47a9b6fb68 assets/create/models/item/orange_toolbox.json 7e767ca9e0ddb769b38fabd9289648ac63f5413d assets/create/models/item/orange_valve_handle.json +e0885ba7be7bf55f3b2ccabff764fca8cada2a92 assets/create/models/item/order_collector.json 82152bca4310111d91584a2a78f05e158bb4bd90 assets/create/models/item/ornate_iron_window.json f9064c1f199bcd8db321078e2363ed91cb2acc09 assets/create/models/item/ornate_iron_window_pane.json 09b3cd8ff7b29a6dd59f739a95bb708646d23537 assets/create/models/item/oxidized_copper_shingles.json @@ -2302,8 +2293,6 @@ ac59f141cd3c3f7e57a794e542d6e22bf8ebb8f9 assets/create/models/item/yellow_seat.j 532a429d58a177f61b4d67180db7676fa7536052 assets/create/models/item/yellow_toolbox.json 2c87ef8a26a01a17b2f3799d62cb27cf1107d061 assets/create/models/item/yellow_valve_handle.json bcf63b7198d31d3a94b2566171b7e3e84464601c assets/create/models/item/zinc_block.json -df6b2facd5807b68d5ebac55934b9ed2acafdb33 assets/create/models/item/zinc_casing.json -0a9e2af4b6cde7e17e83ec919df68cfbf442a63a assets/create/models/item/zinc_coil.json d4a3290393c1c659f3d4dd4e267a87d287bd49a6 assets/create/models/item/zinc_ingot.json 1e9656f81ec01a89796b175cf029d1de45b758fe assets/create/models/item/zinc_nugget.json f3719d4d3a8d1e0d9f36db5d1317894ecacf3bf3 assets/create/models/item/zinc_ore.json @@ -3017,8 +3006,6 @@ d391cff5b741fd6ddf5b6fa64e05526eb3a9f0d9 data/create/loot_tables/blocks/brown_ni 7c7cf4c30786f6e0a699e2b3f9120343e53107f4 data/create/loot_tables/blocks/brown_valve_handle.json 06d1c478e4236210aa12b5911691868fef33bb5f data/create/loot_tables/blocks/calcite_pillar.json 515c839deea520b07b03f7ba65c4a7b22fdf5ba3 data/create/loot_tables/blocks/cart_assembler.json -3b3781f8766d5d23f8c8778263c6baf2f81f59fc data/create/loot_tables/blocks/charged_contact.json -815e28cf0f41cd8024d291339cad3f8cdcd000a8 data/create/loot_tables/blocks/charge_relay.json fb4877d45df15be1a74378ab28f23fbf9d0657ef data/create/loot_tables/blocks/chute.json ace9255cbdd1af5e5068916d2a6bed2f861f81f1 data/create/loot_tables/blocks/clipboard.json bfd871acdde6c239098ead188a5aad7636d11bc0 data/create/loot_tables/blocks/clockwork_bearing.json @@ -3031,7 +3018,6 @@ f2058ad809606d54123c7efbad2a6b995ed1defe data/create/loot_tables/blocks/controls e069fbd8c2331ef76611a33c6d66fd025b65d3b6 data/create/loot_tables/blocks/copper_backtank.json fa0856e11351ad0882de2066569807e782071881 data/create/loot_tables/blocks/copper_bars.json 5f48b688829ca7849997d88697cff2de1ede4804 data/create/loot_tables/blocks/copper_casing.json -880ccd1ac5188dd35d00414de4374ecb6d11d8c8 data/create/loot_tables/blocks/copper_coil.json 0937b9f634b86dbe41e07eda52c69993fce60fb5 data/create/loot_tables/blocks/copper_door.json 8ed70d812f38adfa147db07a4f2bbe206a69ad20 data/create/loot_tables/blocks/copper_ladder.json ac621731ca23e6fbb1003be59edacdf837dbc37e data/create/loot_tables/blocks/copper_scaffolding.json @@ -3303,6 +3289,7 @@ d6323d4b30faa87cd4b5b8b815cb16f78296f203 data/create/loot_tables/blocks/orange_s 119fc4c3055c09c7958ac405925a6b7be2081c6b data/create/loot_tables/blocks/orange_seat.json 54ac8c8166c23f24a8a0870c981ef8ffa64c0b89 data/create/loot_tables/blocks/orange_toolbox.json 30aef2df782b6b35cd16b4c205bb15de85bc0664 data/create/loot_tables/blocks/orange_valve_handle.json +ff5b22187101d0c90f995694afbe6fbb99f088da data/create/loot_tables/blocks/order_collector.json f4004c6d16754fc8867ed6618dace8e8f6dcc412 data/create/loot_tables/blocks/ornate_iron_window.json 6f14500e07c6d342804f9127e7b66047ffaeef1e data/create/loot_tables/blocks/ornate_iron_window_pane.json 3e54d3c4755a43d837a1d9b2005ea1dee4d02555 data/create/loot_tables/blocks/oxidized_copper_shingles.json @@ -3552,8 +3539,6 @@ d9f853e662b004b6ffdbb82af99ad7e774698178 data/create/loot_tables/blocks/yellow_n 11b10beba7a6842ce3d01ea4210bff7d3aa6ab94 data/create/loot_tables/blocks/yellow_toolbox.json b9648ec56e55fe2b9d54adf172405519a46bfa66 data/create/loot_tables/blocks/yellow_valve_handle.json 8be474a69469561dfe759159a40fb135a6ad5de6 data/create/loot_tables/blocks/zinc_block.json -11b555a6eb588caaffbfe8deb7cfa7f10ab38e90 data/create/loot_tables/blocks/zinc_casing.json -59bc464d9bc1dcb50d0ca8fab5314fbef5a0968e data/create/loot_tables/blocks/zinc_coil.json 4ab95e007dd1ad1401800116e785ce85607907f8 data/create/loot_tables/blocks/zinc_ore.json 8af7629e400e2447e672796724ebcf20b9e327f1 data/create/recipes/acacia_window.json 16af9663aaaa3eaec11a6de9fde8df946fbec529 data/create/recipes/acacia_window_pane.json @@ -4195,7 +4180,7 @@ fdd28fc956dbec71ba24cdea5adfc049d6eb31e3 data/create/recipes/tuff_pillar_from_st 8a32b955b4320eddff017378785d1c95e1434229 data/create/recipes/weathered_copper_tile_stairs.json f1a03ac86925e26cbec6aeeada2eafb40008fc8e data/create/recipes/weathered_copper_tile_stairs_from_weathered_copper_tiles_stonecutting.json 8b98a671e80724e815a3af0c3764d760e4170e02 data/create/tags/blocks/brittle.json -6aa1b027fbeb41d04edc14868d6b69324f505b76 data/create/tags/blocks/casing.json +8b6c0b444b15f7fb2d55b9cbcb68537c1269f877 data/create/tags/blocks/casing.json 35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/create/tags/blocks/contraption_inventory_deny.json c7ec0dbc18e9c1b58e568ed925287b89df11a136 data/create/tags/blocks/copycat_allow.json 876eb9210f4a14898a2fe6d225699c66b5bdfeef data/create/tags/blocks/copycat_deny.json @@ -4227,7 +4212,7 @@ e191d5f912e05091b3a0b1df17f4c4181e04d96f data/create/tags/fluids/fan_processing_ c9ae54a7510073b17edf82f7591e14bdb2c51837 data/create/tags/fluids/fan_processing_catalysts/splashing.json 35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/create/tags/items/blaze_burner_fuel/regular.json 8ba98bf390a326abeebfd5d84be5f740c935a8b6 data/create/tags/items/blaze_burner_fuel/special.json -6aa1b027fbeb41d04edc14868d6b69324f505b76 data/create/tags/items/casing.json +8b6c0b444b15f7fb2d55b9cbcb68537c1269f877 data/create/tags/items/casing.json f43cac8216e2a9347e48cf93a43de95dd810ca20 data/create/tags/items/contraption_controlled.json d371dfd35e49a7bef19f59c03e7f4ae20992f03d data/create/tags/items/create_ingots.json 910d0f5ccbc4c84b224eca1f1588b1695f41447b data/create/tags/items/crushed_raw_materials.json @@ -4316,8 +4301,8 @@ c741ba83b562ae3459d7c4f2db69537f549ea411 data/forge/tags/items/tools/wrench.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/dripstone_replaceable_blocks.json e3321ff14704c031a2c16953b7e391f4f24dd70b data/minecraft/tags/blocks/impermeable.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/lush_ground_replaceable.json -eada9d497e6a4cfec442b3b0e8e6ba58b2d26324 data/minecraft/tags/blocks/mineable/axe.json -c8318db42c70456b12d9781c1f3f4c6490fe2349 data/minecraft/tags/blocks/mineable/pickaxe.json +76f109bda7d27fa1ebc8cbe6f7eb930e3cacd329 data/minecraft/tags/blocks/mineable/axe.json +73c0b71e13af2f2db15684075a96b0884a3ccab1 data/minecraft/tags/blocks/mineable/pickaxe.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/moss_replaceable.json 0c13aae0eeb99e89febe8dbe5e002af2ff843a9e data/minecraft/tags/blocks/needs_iron_tool.json 3cb2a92cbdf32ed5978f740dc378d363306c3e84 data/minecraft/tags/blocks/needs_stone_tool.json diff --git a/src/generated/resources/assets/create/blockstates/order_collector.json b/src/generated/resources/assets/create/blockstates/order_collector.json new file mode 100644 index 0000000000..8b2f14c1f8 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/order_collector.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "create:block/order_collector/block", + "y": 90 + }, + "facing=north": { + "model": "create:block/order_collector/block" + }, + "facing=south": { + "model": "create:block/order_collector/block", + "y": 180 + }, + "facing=west": { + "model": "create:block/order_collector/block", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 20cc944c88..6f31bdd8c6 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -552,6 +552,7 @@ "block.create.orange_seat": "ʇɐǝS ǝbuɐɹO", "block.create.orange_toolbox": "xoqןoo⟘ ǝbuɐɹO", "block.create.orange_valve_handle": "ǝןpuɐH ǝʌןɐΛ ǝbuɐɹO", + "block.create.order_collector": "ɹoʇɔǝןןoƆ ɹǝpɹO", "block.create.ornate_iron_window": "ʍopuıM uoɹI ǝʇɐuɹO", "block.create.ornate_iron_window_pane": "ǝuɐԀ ʍopuıM uoɹI ǝʇɐuɹO", "block.create.oxidized_copper_shingle_slab": "qɐןS ǝןbuıɥS ɹǝddoƆ pǝzıpıxO", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index f795fecce0..3327c1285f 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -552,6 +552,7 @@ "block.create.orange_seat": "Orange Seat", "block.create.orange_toolbox": "Orange Toolbox", "block.create.orange_valve_handle": "Orange Valve Handle", + "block.create.order_collector": "Order Collector", "block.create.ornate_iron_window": "Ornate Iron Window", "block.create.ornate_iron_window_pane": "Ornate Iron Window Pane", "block.create.oxidized_copper_shingle_slab": "Oxidized Copper Shingle Slab", diff --git a/src/generated/resources/assets/create/models/item/order_collector.json b/src/generated/resources/assets/create/models/item/order_collector.json new file mode 100644 index 0000000000..a0b3a0ee66 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/order_collector.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/order_collector/item" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/order_collector.json b/src/generated/resources/data/create/loot_tables/blocks/order_collector.json new file mode 100644 index 0000000000..956b16b965 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/order_collector.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:order_collector" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/order_collector" +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json b/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json index 85876778c6..f58a51663e 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json @@ -86,7 +86,7 @@ "create:rotation_speed_controller", "create:mechanical_arm", "create:railway_casing", - "create:packager_link", + "create:stock_ticker", "create:content_observer", "create:stockpile_switch", "create:creative_crate", diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json index 7606b9e634..d4cd84f164 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json @@ -121,7 +121,10 @@ "create:large_bogey", "create:controls", "create:item_vault", + "create:packager", "create:packager_link", + "create:stock_ticker", + "create:order_collector", "create:andesite_funnel", "create:andesite_belt_funnel", "create:brass_funnel", diff --git a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java index af9f8a0cdd..c4536b25e1 100644 --- a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java +++ b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java @@ -167,6 +167,8 @@ import com.simibubi.create.content.logistics.depot.EjectorRenderer; import com.simibubi.create.content.logistics.funnel.FunnelBlockEntity; import com.simibubi.create.content.logistics.funnel.FunnelInstance; import com.simibubi.create.content.logistics.funnel.FunnelRenderer; +import com.simibubi.create.content.logistics.orderCollector.OrderCollectorBlockEntity; +import com.simibubi.create.content.logistics.orderCollector.OrderCollectorRenderer; import com.simibubi.create.content.logistics.packager.PackagerBlockEntity; import com.simibubi.create.content.logistics.packager.PackagerRenderer; import com.simibubi.create.content.logistics.packagerLink.PackagerLinkBlockEntity; @@ -484,6 +486,13 @@ public class AllBlockEntityTypes { .blockEntity("stock_ticker", StockTickerBlockEntity::new) .validBlocks(AllBlocks.STOCK_TICKER) .register(); + + public static final BlockEntityEntry ORDER_COLLECTOR = REGISTRATE + .blockEntity("order_collector", OrderCollectorBlockEntity::new) + .instance(() -> ShaftInstance::new) + .validBlocks(AllBlocks.ORDER_COLLECTOR) + .renderer(() -> OrderCollectorRenderer::new) + .register(); public static final BlockEntityEntry MECHANICAL_PISTON = REGISTRATE .blockEntity("mechanical_piston", MechanicalPistonBlockEntity::new) diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index dd6ea03adc..9b0c6ff3d9 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -172,6 +172,7 @@ import com.simibubi.create.content.logistics.funnel.BrassFunnelBlock; import com.simibubi.create.content.logistics.funnel.FunnelGenerator; import com.simibubi.create.content.logistics.funnel.FunnelItem; import com.simibubi.create.content.logistics.funnel.FunnelMovementBehaviour; +import com.simibubi.create.content.logistics.orderCollector.OrderCollectorBlock; import com.simibubi.create.content.logistics.packager.PackagerBlock; import com.simibubi.create.content.logistics.packager.PackagerGenerator; import com.simibubi.create.content.logistics.packagerLink.PackagerLinkBlock; @@ -1651,6 +1652,9 @@ public class AllBlocks { public static final BlockEntry PACKAGER = REGISTRATE.block("packager", PackagerBlock::new) .initialProperties(SharedProperties::softMetal) .properties(p -> p.noOcclusion()) + .properties(p -> p.mapColor(MapColor.TERRACOTTA_BLUE) + .sound(SoundType.NETHERITE_BLOCK)) + .transform(pickaxeOnly()) .addLayer(() -> RenderType::cutoutMipped) .blockstate(new PackagerGenerator()::generate) .transform(BlockStressDefaults.setImpact(1.0)) @@ -1662,9 +1666,10 @@ public class AllBlocks { public static final BlockEntry PACKAGER_LINK = REGISTRATE.block("packager_link", PackagerLinkBlock::new) .initialProperties(SharedProperties::softMetal) - .properties(p -> p.mapColor(MapColor.TERRACOTTA_BROWN)) + .properties(p -> p.mapColor(MapColor.TERRACOTTA_BLUE) + .sound(SoundType.NETHERITE_BLOCK)) .addLayer(() -> RenderType::translucent) - .transform(axeOrPickaxe()) + .transform(pickaxeOnly()) .blockstate((c, p) -> p.directionalBlock(c.get(), AssetLookup.forPowered(c, p))) .item(PackagerLinkBlockItem::new) .transform(customItemModel("_", "block")) @@ -1674,11 +1679,25 @@ public class AllBlocks { REGISTRATE.block("stock_ticker", StockTickerBlock::new) .initialProperties(SharedProperties::softMetal) .properties(p -> p.sound(SoundType.GLASS)) + .transform(axeOrPickaxe()) .addLayer(() -> RenderType::cutoutMipped) .blockstate((c, p) -> p.horizontalBlock(c.get(), AssetLookup.standardModel(c, p))) .simpleItem() .register(); + public static final BlockEntry ORDER_COLLECTOR = + REGISTRATE.block("order_collector", OrderCollectorBlock::new) + .initialProperties(SharedProperties::softMetal) + .properties(p -> p.mapColor(MapColor.TERRACOTTA_BLUE) + .sound(SoundType.NETHERITE_BLOCK)) + .properties(p -> p.noOcclusion()) + .transform(pickaxeOnly()) + .blockstate(BlockStateGen.horizontalBlockProvider(true)) + .transform(BlockStressDefaults.setImpact(2.0)) + .item(AssemblyOperatorBlockItem::new) + .transform(customItemModel()) + .register(); + public static final BlockEntry ANDESITE_FUNNEL = REGISTRATE.block("andesite_funnel", AndesiteFunnelBlock::new) .addLayer(() -> RenderType::cutoutMipped) diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java index 2bd9c2c811..e7e6473cd6 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java @@ -4,7 +4,10 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; +import javax.annotation.Nullable; + import com.simibubi.create.AllEntityTypes; +import com.simibubi.create.content.logistics.stockTicker.PackageOrder; import net.createmod.catnip.utility.VecHelper; import net.createmod.catnip.utility.lang.Components; @@ -95,10 +98,30 @@ public class PackageItem extends Item { .putString("Address", address); } + public static void setOrder(ItemStack box, int orderId, int linkIndex, boolean isFinalLink, int fragmentIndex, + boolean isFinal, @Nullable PackageOrder orderContext) { + CompoundTag tag = new CompoundTag(); + tag.putInt("OrderId", orderId); + tag.putInt("LinkIndex", linkIndex); + tag.putBoolean("IsFinalLink", isFinalLink); + tag.putInt("Index", fragmentIndex); + tag.putBoolean("IsFinal", isFinal); + if (orderContext != null) + tag.put("OrderContext", orderContext.write()); + box.getOrCreateTag() + .put("Fragment", tag); + } + + public static int getOrderId(ItemStack box) { + CompoundTag tag = box.getTag(); + if (tag == null || !tag.contains("Fragment")) + return -1; + return tag.getCompound("Fragment") + .getInt("OrderId"); + } + public static boolean matchAddress(ItemStack box, String address) { - String boxAddress = !box.hasTag() ? "" - : box.getTag() - .getString("Address"); + String boxAddress = getAddress(box); if (address.isBlank()) return boxAddress.isBlank(); if (address.equals("*") || boxAddress.equals("*")) @@ -108,6 +131,13 @@ public class PackageItem extends Item { return address.matches(boxMatcher) || boxAddress.matches(matcher); } + public static String getAddress(ItemStack box) { + String boxAddress = !box.hasTag() ? "" + : box.getTag() + .getString("Address"); + return boxAddress; + } + public static float getWidth(ItemStack box) { if (box.getItem() instanceof PackageItem) return ((PackageItem) box.getItem()).width / 16f; @@ -141,6 +171,22 @@ public class PackageItem extends Item { if (compoundnbt.contains("Address", Tag.TAG_STRING)) pTooltipComponents.add(Components.literal("-> " + compoundnbt.getString("Address")) .withStyle(ChatFormatting.GOLD)); + + // TEMPORARY + if (compoundnbt.contains("Fragment")) { + CompoundTag fragTag = compoundnbt.getCompound("Fragment"); + pTooltipComponents.add(Components.literal("Order Information (Temporary)") + .withStyle(ChatFormatting.GREEN)); + pTooltipComponents.add(Components + .literal(" Link " + fragTag.getInt("LinkIndex") + (fragTag.getBoolean("IsFinalLink") ? " Final" : "") + + " | Fragment " + fragTag.getInt("Index") + (fragTag.getBoolean("IsFinal") ? " Final" : "")) + .withStyle(ChatFormatting.DARK_GREEN)); + if (fragTag.contains("OrderContext")) + pTooltipComponents.add(Components.literal("Has Context!") + .withStyle(ChatFormatting.DARK_GREEN)); + } + // + if (!compoundnbt.contains("Items", Tag.TAG_COMPOUND)) return; diff --git a/src/main/java/com/simibubi/create/content/logistics/depot/EjectorInstance.java b/src/main/java/com/simibubi/create/content/logistics/depot/EjectorInstance.java index 84b03a10e1..d0ddf476be 100644 --- a/src/main/java/com/simibubi/create/content/logistics/depot/EjectorInstance.java +++ b/src/main/java/com/simibubi/create/content/logistics/depot/EjectorInstance.java @@ -55,7 +55,6 @@ public class EjectorInstance extends ShaftInstance implement private void pivotPlate(float lidProgress) { float angle = lidProgress * 70; - - //EjectorRenderer.applyLidAngle(blockEntity, angle, plate.loadIdentity().translate(getInstancePosition()));//TODO flw + EjectorRenderer.applyLidAngle(blockEntity, angle, plate.loadIdentity().translate(getInstancePosition())); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/orderCollector/OrderCollectorBlock.java b/src/main/java/com/simibubi/create/content/logistics/orderCollector/OrderCollectorBlock.java new file mode 100644 index 0000000000..7ef91108be --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/orderCollector/OrderCollectorBlock.java @@ -0,0 +1,57 @@ +package com.simibubi.create.content.logistics.orderCollector; + +import com.simibubi.create.AllBlockEntityTypes; +import com.simibubi.create.content.kinetics.base.HorizontalKineticBlock; +import com.simibubi.create.foundation.block.IBE; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Direction.Axis; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; + +public class OrderCollectorBlock extends HorizontalKineticBlock implements IBE { + + public OrderCollectorBlock(Properties properties) { + super(properties); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext context) { + Direction prefferedSide = getPreferredHorizontalFacing(context); + if (prefferedSide != null) + return defaultBlockState().setValue(HORIZONTAL_FACING, prefferedSide); + return super.getStateForPlacement(context); + } + + @Override + public Axis getRotationAxis(BlockState state) { + return state.getValue(HORIZONTAL_FACING) + .getAxis(); + } + + @Override + public boolean hasShaftTowards(LevelReader world, BlockPos pos, BlockState state, Direction face) { + return face.getAxis() == state.getValue(HORIZONTAL_FACING) + .getAxis(); + } + + @Override + public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pIsMoving) { + IBE.onRemove(pState, pLevel, pPos, pNewState); + } + + @Override + public Class getBlockEntityClass() { + return OrderCollectorBlockEntity.class; + } + + @Override + public BlockEntityType getBlockEntityType() { + return AllBlockEntityTypes.ORDER_COLLECTOR.get(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/orderCollector/OrderCollectorBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/orderCollector/OrderCollectorBlockEntity.java new file mode 100644 index 0000000000..14a5f484a6 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/orderCollector/OrderCollectorBlockEntity.java @@ -0,0 +1,342 @@ +package com.simibubi.create.content.logistics.orderCollector; + +import static com.simibubi.create.content.kinetics.belt.behaviour.BeltProcessingBehaviour.ProcessingResult.HOLD; +import static com.simibubi.create.content.kinetics.belt.behaviour.BeltProcessingBehaviour.ProcessingResult.PASS; +import static com.simibubi.create.content.kinetics.belt.behaviour.BeltProcessingBehaviour.ProcessingResult.REMOVE; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import org.apache.commons.compress.utils.Lists; +import org.apache.commons.lang3.mutable.MutableBoolean; + +import com.simibubi.create.content.kinetics.base.KineticBlockEntity; +import com.simibubi.create.content.kinetics.belt.behaviour.BeltProcessingBehaviour; +import com.simibubi.create.content.kinetics.belt.behaviour.BeltProcessingBehaviour.ProcessingResult; +import com.simibubi.create.content.kinetics.belt.behaviour.DirectBeltInputBehaviour; +import com.simibubi.create.content.kinetics.belt.behaviour.TransportedItemStackHandlerBehaviour; +import com.simibubi.create.content.kinetics.belt.behaviour.TransportedItemStackHandlerBehaviour.TransportedResult; +import com.simibubi.create.content.kinetics.belt.transport.TransportedItemStack; +import com.simibubi.create.content.logistics.box.PackageItem; +import com.simibubi.create.content.logistics.stockTicker.PackageOrder; +import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; + +import net.createmod.catnip.utility.IntAttached; +import net.createmod.catnip.utility.NBTHelper; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; +import net.minecraftforge.items.ItemHandlerHelper; +import net.minecraftforge.items.ItemStackHandler; + +public class OrderCollectorBlockEntity extends KineticBlockEntity { + + protected Map> collectedPackages = new HashMap<>(); + protected List exportingPackages = new ArrayList<>(); + + protected ItemStack visuallyCollectingPackage = ItemStack.EMPTY; + protected int collectingAnimationTicks = 0; + protected ItemStack visuallyDeployingPackage = ItemStack.EMPTY; + protected int deployingAnimationTicks = 0; + + private int exportCooldown = 0; + + public OrderCollectorBlockEntity(BlockEntityType typeIn, BlockPos pos, BlockState state) { + super(typeIn, pos, state); + } + + @Override + protected AABB createRenderBoundingBox() { + return super.createRenderBoundingBox().expandTowards(0, -2, 0); + } + + @Override + public void addBehaviours(List behaviours) { + behaviours.add(new BeltProcessingBehaviour(this).whenItemEnters(this::onItemReceived) + .whileItemHeld(this::whenItemHeld)); + } + + protected ProcessingResult onItemReceived(TransportedItemStack transported, + TransportedItemStackHandlerBehaviour handler) { + if (handler.blockEntity.isVirtual()) + return PASS; + if (getSpeed() == 0) + return PASS; + if (!(transported.stack.getItem() instanceof PackageItem)) + return PASS; + + int orderId = PackageItem.getOrderId(transported.stack); + if (orderId == -1) + return PASS; + return HOLD; + } + + protected ProcessingResult whenItemHeld(TransportedItemStack transported, + TransportedItemStackHandlerBehaviour handler) { + if (!visuallyCollectingPackage.isEmpty()) + return HOLD; + if (!visuallyDeployingPackage.isEmpty()) + return HOLD; + + ItemStack box = transported.stack.copy(); + addPackageFragment(box); + + visuallyCollectingPackage = box; + collectingAnimationTicks = 0; + + handler.handleProcessingOnItem(transported, TransportedResult.removeItem()); + + return REMOVE; + } + + @Override + protected void read(CompoundTag compound, boolean clientPacket) { + super.read(compound, clientPacket); + + boolean wasCollecting = !visuallyCollectingPackage.isEmpty(); + visuallyCollectingPackage = ItemStack.of(compound.getCompound("CollectingItem")); + if (!wasCollecting) + collectingAnimationTicks = 0; + + boolean wasDeploying = !visuallyDeployingPackage.isEmpty(); + visuallyDeployingPackage = ItemStack.of(compound.getCompound("DeployingItem")); + if (!wasDeploying) + deployingAnimationTicks = 0; + + if (clientPacket) + return; + + collectedPackages.clear(); + NBTHelper.iterateCompoundList(compound.getList("CollectedOrders", Tag.TAG_COMPOUND), tag -> collectedPackages + .put(tag.getInt("Id"), NBTHelper.readItemList(tag.getList("Boxes", Tag.TAG_COMPOUND)))); + + exportingPackages = NBTHelper.readItemList(compound.getList("ExportingItems", Tag.TAG_COMPOUND)); + exportCooldown = compound.getInt("ExportCooldown"); + } + + @Override + protected void write(CompoundTag compound, boolean clientPacket) { + super.write(compound, clientPacket); + + compound.put("CollectingItem", visuallyCollectingPackage.serializeNBT()); + compound.put("DeployingItem", visuallyDeployingPackage.serializeNBT()); + + if (clientPacket) + return; + + ListTag collectedNbt = new ListTag(); + for (Entry> entry : collectedPackages.entrySet()) { + CompoundTag tag = new CompoundTag(); + tag.putInt("Id", entry.getKey()); + tag.put("Boxes", NBTHelper.writeItemList(entry.getValue())); + collectedNbt.add(tag); + } + compound.put("CollectedOrders", collectedNbt); + + compound.put("ExportingItems", NBTHelper.writeItemList(exportingPackages)); + compound.putInt("ExportCooldown", exportCooldown); + } + + @Override + public void destroy() { + super.destroy(); + collectedPackages.values() + .forEach(exportingPackages::addAll); + exportingPackages.add(visuallyDeployingPackage); + for (ItemStack box : exportingPackages) + Block.popResource(level, worldPosition, box); + } + + @Override + public void tick() { + super.tick(); + + if (!visuallyCollectingPackage.isEmpty()) { + collectingAnimationTicks++; + if (collectingAnimationTicks == 20) + visuallyCollectingPackage = ItemStack.EMPTY; + exportCooldown = 1; + } + + if (!visuallyDeployingPackage.isEmpty()) { + deployingAnimationTicks++; + if (deployingAnimationTicks == 10) { + if (!level.isClientSide()) { + DirectBeltInputBehaviour directBeltInputBehaviour = + BlockEntityBehaviour.get(level, worldPosition.below(2), DirectBeltInputBehaviour.TYPE); + if (directBeltInputBehaviour != null) { + ItemStack remainder = + directBeltInputBehaviour.handleInsertion(visuallyDeployingPackage, Direction.DOWN, false); + if (!remainder.isEmpty()) + Block.popResource(level, worldPosition.below(), remainder); + } + } + visuallyDeployingPackage = ItemStack.EMPTY; + } + exportCooldown = 1; + } + + if (level.isClientSide()) + return; + if (getSpeed() == 0) + return; + if (exportCooldown > 0) { + exportCooldown--; + return; + } + if (exportingPackages.isEmpty()) + return; + + exportCooldown = 10; + + TransportedItemStackHandlerBehaviour transporter = + BlockEntityBehaviour.get(level, worldPosition.below(2), TransportedItemStackHandlerBehaviour.TYPE); + MutableBoolean hasSpace = new MutableBoolean(true); + if (transporter != null) + transporter.handleCenteredProcessingOnAllItems(0.51f, $ -> { + hasSpace.setFalse(); + return TransportedResult.doNothing(); + }); + + visuallyDeployingPackage = exportingPackages.get(0); + deployingAnimationTicks = 0; + exportingPackages.remove(0); + notifyUpdate(); + } + + private void addPackageFragment(ItemStack box) { + int collectedOrderId = PackageItem.getOrderId(box); + List collectedOrder = collectedPackages.computeIfAbsent(collectedOrderId, $ -> Lists.newArrayList()); + collectedOrder.add(box); + + if (!isOrderComplete(collectedOrderId)) { + notifyUpdate(); + return; + } + + repack(collectedOrderId); + exportCooldown = 1; + } + + private void repack(int orderId) { + String address = ""; + PackageOrder order = null; + List> allItems = new ArrayList<>(); + + for (ItemStack box : collectedPackages.get(orderId)) { + address = PackageItem.getAddress(box); + if (box.hasTag() && box.getTag() + .getCompound("Fragment") + .contains("OrderContext")) + order = PackageOrder.read(box.getTag() + .getCompound("Fragment") + .getCompound("OrderContext")); + ItemStackHandler contents = PackageItem.getContents(box); + Slots: for (int slot = 0; slot < contents.getSlots(); slot++) { + ItemStack stackInSlot = contents.getStackInSlot(slot); + for (IntAttached existing : allItems) { + if (!ItemHandlerHelper.canItemStacksStack(stackInSlot, existing.getValue())) + continue; + existing.setFirst(existing.getFirst() + stackInSlot.getCount()); + continue Slots; + } + allItems.add(IntAttached.with(stackInSlot.getCount(), stackInSlot)); + } + } + + List> orderedStacks = order == null ? Collections.emptyList() : order.stacks(); + List outputSlots = new ArrayList<>(); + + Repack: while (true) { + allItems.removeIf(e -> e.getFirst() == 0); + if (allItems.isEmpty()) + break; + + IntAttached targetedEntry = null; + if (!orderedStacks.isEmpty()) + targetedEntry = orderedStacks.remove(0); + + ItemSearch: for (IntAttached entry : allItems) { + int targetAmount = entry.getFirst(); + if (targetAmount == 0) + continue; + if (targetedEntry != null) { + targetAmount = targetedEntry.getFirst(); + if (!ItemHandlerHelper.canItemStacksStack(entry.getSecond(), targetedEntry.getSecond())) + continue; + } + + while (targetAmount > 0) { + int removedAmount = Math.min(Math.min(targetAmount, entry.getSecond() + .getMaxStackSize()), entry.getFirst()); + if (removedAmount == 0) + continue ItemSearch; + + ItemStack output = ItemHandlerHelper.copyStackWithSize(entry.getSecond(), removedAmount); + targetAmount -= removedAmount; + targetedEntry.setFirst(targetAmount); + entry.setFirst(entry.getFirst() - removedAmount); + outputSlots.add(output); + } + + continue Repack; + } + } + + int currentSlot = 0; + ItemStackHandler target = new ItemStackHandler(PackageItem.SLOTS); + + for (ItemStack item : outputSlots) { + target.setStackInSlot(currentSlot++, item); + if (currentSlot < PackageItem.SLOTS) + continue; + exportingPackages.add(PackageItem.containing(target)); + target = new ItemStackHandler(PackageItem.SLOTS); + currentSlot = 0; + } + + exportingPackages.add(PackageItem.containing(target)); + + for (ItemStack box : exportingPackages) + PackageItem.addAddress(box, address); + + collectedPackages.remove(orderId); + notifyUpdate(); + } + + private boolean isOrderComplete(int orderId) { + boolean finalLinkReached = false; + Links: for (int linkCounter = 0; linkCounter < 1000; linkCounter++) { + if (finalLinkReached) + break; + Packages: for (int packageCounter = 0; packageCounter < 1000; packageCounter++) { + for (ItemStack box : collectedPackages.get(orderId)) { + CompoundTag tag = box.getOrCreateTag() + .getCompound("Fragment"); + if (linkCounter != tag.getInt("LinkIndex")) + continue; + if (packageCounter != tag.getInt("Index")) + continue; + finalLinkReached = tag.getBoolean("IsFinalLink"); + if (tag.getBoolean("IsFinal")) + continue Links; + continue Packages; + } + return false; + } + } + return true; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/orderCollector/OrderCollectorRenderer.java b/src/main/java/com/simibubi/create/content/logistics/orderCollector/OrderCollectorRenderer.java new file mode 100644 index 0000000000..d6302643f5 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/orderCollector/OrderCollectorRenderer.java @@ -0,0 +1,70 @@ +package com.simibubi.create.content.logistics.orderCollector; + +import com.jozufozu.flywheel.util.transform.TransformStack; +import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.content.kinetics.base.KineticBlockEntityRenderer; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider.Context; +import net.minecraft.client.renderer.entity.ItemRenderer; +import net.minecraft.util.Mth; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.state.BlockState; + +public class OrderCollectorRenderer extends KineticBlockEntityRenderer { + + public OrderCollectorRenderer(Context context) { + super(context); + } + + @Override + public boolean shouldRenderOffScreen(OrderCollectorBlockEntity be) { + return true; + } + + @Override + protected void renderSafe(OrderCollectorBlockEntity be, float partialTicks, PoseStack ms, MultiBufferSource buffer, + int light, int overlay) { + super.renderSafe(be, partialTicks, ms, buffer, light, overlay); + + ItemStack box = be.visuallyCollectingPackage; + boolean collecting = !box.isEmpty(); + if (!collecting) { + box = be.visuallyDeployingPackage; + if (box.isEmpty()) + return; + } + + double progress = 0; + + if (collecting) + progress = Mth.clamp((be.collectingAnimationTicks + partialTicks) / 20f, 0, 1); + else + progress = 1 - Mth.clamp((be.deployingAnimationTicks + partialTicks) / 10f, 0, 1); + + double offset = Mth.lerp(1 - Math.pow(1 - progress, 4), -1.5, -0.26); + float scale = (float) Mth.lerp(1 - Math.pow(1 - progress, 2), 2, 1.5); + + TransformStack msr = TransformStack.cast(ms); + ItemRenderer itemRenderer = Minecraft.getInstance() + .getItemRenderer(); + ms.pushPose(); + msr.centre(); + ms.translate(0, 6 / 16f, 0); + ms.translate(0, offset, 0); + ms.scale(scale, scale, scale); + + itemRenderer.renderStatic(box, ItemDisplayContext.FIXED, light, overlay, ms, buffer, be.getLevel(), 0); + + ms.popPose(); + + } + + @Override + protected BlockState getRenderedBlockState(OrderCollectorBlockEntity be) { + return shaft(getRotationAxisOf(be)); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java index 75b9f4b3a7..809cab498e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java @@ -7,6 +7,7 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.content.logistics.crate.BottomlessItemHandler; import com.simibubi.create.content.logistics.packagerLink.PackagerLinkBlock; +import com.simibubi.create.content.logistics.stockTicker.PackageOrder; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import com.simibubi.create.foundation.blockEntity.behaviour.inventory.CapManipulationBehaviourBase.InterfaceProvider; @@ -164,9 +165,14 @@ public class PackagerBlockEntity extends SmartBlockEntity { .getCount() == toInsert.getCount()) continue; if (itemInSlot.isEmpty()) { + int maxStackSize = targetInv.getSlotLimit(slot); + if (maxStackSize < toInsert.getCount()) { + toInsert.shrink(maxStackSize); + toInsert = ItemHandlerHelper.copyStackWithSize(toInsert, maxStackSize); + } else + contents.setStackInSlot(boxSlot, ItemStack.EMPTY); itemInSlot = toInsert; targetInv.insertItem(slot, toInsert, simulate); - contents.setStackInSlot(boxSlot, ItemStack.EMPTY); continue; } if (!ItemHandlerHelper.canItemStacksStack(toInsert, itemInSlot)) @@ -211,51 +217,91 @@ public class PackagerBlockEntity extends SmartBlockEntity { ItemStack extractedPackageItem = ItemStack.EMPTY; PackagingRequest nextRequest = null; String fixedAddress = null; + int fixedOrderId = 0; + + boolean continuePacking = true; + + // Data written to packages for defrags + int linkIndexInOrder = 0; + boolean finalLinkInOrder = false; + int packageIndexAtLink = 0; + boolean finalPackageAtLink = false; + PackageOrder orderContext = null; if (requestQueue && !queuedRequests.isEmpty()) { nextRequest = queuedRequests.get(0); fixedAddress = nextRequest.address(); + fixedOrderId = nextRequest.orderId(); + linkIndexInOrder = nextRequest.linkIndex(); + finalLinkInOrder = nextRequest.finalLink() + .booleanValue(); + packageIndexAtLink = nextRequest.packageCounter() + .getAndIncrement(); + orderContext = nextRequest.context(); } - Outer: for (int i = 0; i < PackageItem.SLOTS; i++) - for (int slot = 0; slot < targetInv.getSlots(); slot++) { - int initialCount = requestQueue ? Math.min(64, nextRequest.getCount()) : 64; - ItemStack extracted = targetInv.extractItem(slot, initialCount, true); - if (extracted.isEmpty()) - continue; - if (requestQueue && !ItemHandlerHelper.canItemStacksStack(extracted, nextRequest.item())) - continue; + Outer: for (int i = 0; i < PackageItem.SLOTS; i++) { + while (continuePacking) { + continuePacking = false; - boolean bulky = !extracted.getItem() - .canFitInsideContainerItems(); - if (bulky && anyItemPresent) - continue; + for (int slot = 0; slot < targetInv.getSlots(); slot++) { + int initialCount = requestQueue ? Math.min(64, nextRequest.getCount()) : 64; + ItemStack extracted = targetInv.extractItem(slot, initialCount, true); + if (extracted.isEmpty()) + continue; + if (requestQueue && !ItemHandlerHelper.canItemStacksStack(extracted, nextRequest.item())) + continue; - anyItemPresent = true; - int leftovers = ItemHandlerHelper.insertItemStacked(extractedItems, extracted.copy(), false) - .getCount(); - int transferred = extracted.getCount() - leftovers; - targetInv.extractItem(slot, transferred, false); + boolean bulky = !extracted.getItem() + .canFitInsideContainerItems(); + if (bulky && anyItemPresent) + continue; - if (extracted.getItem() instanceof PackageItem) - extractedPackageItem = extracted; + anyItemPresent = true; + int leftovers = ItemHandlerHelper.insertItemStacked(extractedItems, extracted.copy(), false) + .getCount(); + int transferred = extracted.getCount() - leftovers; + targetInv.extractItem(slot, transferred, false); - if (requestQueue) { - nextRequest.subtract(transferred); - if (nextRequest.isEmpty()) { - queuedRequests.remove(0); - if (queuedRequests.isEmpty()) + if (extracted.getItem() instanceof PackageItem) + extractedPackageItem = extracted; + + if (!requestQueue) { + if (bulky) break Outer; - nextRequest = queuedRequests.get(0); - if (!fixedAddress.equals(nextRequest.address())) - break Outer; - break; + continue; } - } - if (bulky) - break Outer; + nextRequest.subtract(transferred); + + if (!nextRequest.isEmpty()) { + if (bulky) + break Outer; + continue; + } + + finalPackageAtLink = true; + queuedRequests.remove(0); + if (queuedRequests.isEmpty()) + break Outer; + int previousCount = nextRequest.packageCounter() + .intValue(); + nextRequest = queuedRequests.get(0); + if (!fixedAddress.equals(nextRequest.address())) + break Outer; + if (fixedOrderId != nextRequest.orderId()) + break Outer; + + nextRequest.packageCounter() + .setValue(previousCount); + finalPackageAtLink = false; + continuePacking = true; + if (bulky) + break Outer; + break; + } } + } if (!anyItemPresent) { if (nextRequest != null) @@ -267,6 +313,9 @@ public class PackagerBlockEntity extends SmartBlockEntity { PackageItem.clearAddress(heldBox); if (fixedAddress != null) PackageItem.addAddress(heldBox, fixedAddress); + if (requestQueue) + PackageItem.setOrder(heldBox, fixedOrderId, linkIndexInOrder, finalLinkInOrder, packageIndexAtLink, + finalPackageAtLink, orderContext); animationInward = false; animationTicks = CYCLE; notifyUpdate(); diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagingRequest.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagingRequest.java index b0e852a180..adb84d4691 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagingRequest.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagingRequest.java @@ -1,18 +1,22 @@ package com.simibubi.create.content.logistics.packager; +import javax.annotation.Nullable; + +import org.apache.commons.lang3.mutable.MutableBoolean; import org.apache.commons.lang3.mutable.MutableInt; +import com.simibubi.create.content.logistics.stockTicker.PackageOrder; + import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.ItemStack; -public record PackagingRequest(ItemStack item, MutableInt count, String address) { +public record PackagingRequest(ItemStack item, MutableInt count, String address, int linkIndex, + MutableBoolean finalLink, MutableInt packageCounter, int orderId, @Nullable PackageOrder context) { - public static PackagingRequest create(ItemStack item, int count, String address) { - return new PackagingRequest(item, new MutableInt(count), address); - } - - public static PackagingRequest fromNBT(CompoundTag tag) { - return create(ItemStack.of(tag.getCompound("Item")), tag.getInt("Count"), tag.getString("Address")); + public static PackagingRequest create(ItemStack item, int count, String address, int linkIndex, + MutableBoolean finalLink, int packageCount, int orderId, @Nullable PackageOrder context) { + return new PackagingRequest(item, new MutableInt(count), address, linkIndex, finalLink, + new MutableInt(packageCount), orderId, context); } public int getCount() { @@ -27,11 +31,28 @@ public record PackagingRequest(ItemStack item, MutableInt count, String address) return getCount() == 0; } + public static PackagingRequest fromNBT(CompoundTag tag) { + ItemStack item = ItemStack.of(tag.getCompound("Item")); + int count = tag.getInt("Count"); + String address = tag.getString("Address"); + int linkIndex = tag.getInt("LinkIndex"); + MutableBoolean finalLink = new MutableBoolean(tag.getBoolean("FinalLink")); + int packageCount = tag.getInt("PackageCount"); + int orderId = tag.getInt("OrderId"); + PackageOrder orderContext = + tag.contains("OrderContext") ? PackageOrder.read(tag.getCompound("OrderContext")) : null; + return create(item, count, address, linkIndex, finalLink, packageCount, orderId, orderContext); + } + public CompoundTag toNBT() { CompoundTag tag = new CompoundTag(); tag.putInt("Count", count.intValue()); tag.put("Item", item.serializeNBT()); tag.putString("Address", address); + tag.putInt("LinkIndex", linkIndex); + tag.putBoolean("FinalLink", finalLink.booleanValue()); + tag.putInt("PackageCount", packageCounter.intValue()); + tag.putInt("OrderId", orderId); return tag; } diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java index f96032f5e4..35ce09981b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java @@ -6,10 +6,13 @@ import java.util.concurrent.atomic.AtomicInteger; import javax.annotation.Nullable; +import org.apache.commons.lang3.mutable.MutableBoolean; + import com.simibubi.create.content.logistics.packager.InventorySummary; import com.simibubi.create.content.logistics.packager.PackagerBlockEntity; import com.simibubi.create.content.logistics.packager.PackagingRequest; import com.simibubi.create.content.logistics.stockTicker.LogisticalWorkstationBlockEntity; +import com.simibubi.create.content.logistics.stockTicker.PackageOrder; import com.simibubi.create.content.redstone.displayLink.LinkWithBulbBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; @@ -47,16 +50,20 @@ public class PackagerLinkBlockEntity extends LinkWithBulbBlockEntity { return packager.getAvailableItems(); } - public int processRequest(ItemStack stack, int amount, String address) { + public int processRequest(ItemStack stack, int amount, String address, int linkIndex, MutableBoolean finalLink, + int orderId, @Nullable PackageOrder orderContext) { PackagerBlockEntity packager = getSource(); if (packager == null) return 0; InventorySummary summary = packager.getAvailableItems(); int availableCount = summary.getCountOf(stack); - int toWithdraw = Math.min(amount, availableCount); + if (availableCount == 0) + return 0; - PackagingRequest packagingRequest = PackagingRequest.create(stack, toWithdraw, address); + int toWithdraw = Math.min(amount, availableCount); + PackagingRequest packagingRequest = + PackagingRequest.create(stack, toWithdraw, address, linkIndex, finalLink, 0, orderId, orderContext); packager.queueRequest(packagingRequest); sendPulseNextSync(); sendData(); diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrder.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrder.java new file mode 100644 index 0000000000..43fd4b5773 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrder.java @@ -0,0 +1,53 @@ +package com.simibubi.create.content.logistics.stockTicker; + +import java.util.ArrayList; +import java.util.List; + +import net.createmod.catnip.utility.IntAttached; +import net.createmod.catnip.utility.NBTHelper; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.item.ItemStack; + +public record PackageOrder(List> stacks) { + + public CompoundTag write() { + CompoundTag tag = new CompoundTag(); + ListTag list = new ListTag(); + for (IntAttached entry : stacks) { + CompoundTag entryTag = new CompoundTag(); + entryTag.putInt("Quantity", entry.getFirst()); + entryTag.put("Item", entry.getSecond() + .serializeNBT()); + list.add(entryTag); + } + tag.put("Entries", list); + return tag; + } + + public static PackageOrder read(CompoundTag tag) { + List> stacks = new ArrayList<>(); + NBTHelper.iterateCompoundList(tag.getList("Entries", Tag.TAG_COMPOUND), entryTag -> stacks + .add(IntAttached.with(entryTag.getInt("Quantity"), ItemStack.of(entryTag.getCompound("Item"))))); + return new PackageOrder(stacks); + } + + public void write(FriendlyByteBuf buffer) { + buffer.writeVarInt(stacks.size()); + for (IntAttached entry : stacks) { + buffer.writeVarInt(entry.getFirst()); + buffer.writeItem(entry.getSecond()); + } + } + + public static PackageOrder read(FriendlyByteBuf buffer) { + int size = buffer.readVarInt(); + List> stacks = new ArrayList<>(); + for (int i = 0; i < size; i++) + stacks.add(IntAttached.with(buffer.readVarInt(), buffer.readItem())); + return new PackageOrder(stacks); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrderRequestPacket.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrderRequestPacket.java index cf5ff0dd20..8891553ea4 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrderRequestPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrderRequestPacket.java @@ -1,24 +1,19 @@ package com.simibubi.create.content.logistics.stockTicker; -import java.util.ArrayList; -import java.util.List; - import com.simibubi.create.foundation.networking.BlockEntityConfigurationPacket; -import net.createmod.catnip.utility.IntAttached; import net.minecraft.core.BlockPos; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.item.ItemStack; public class PackageOrderRequestPacket extends BlockEntityConfigurationPacket { - private List> items; + private PackageOrder order; private String address; - public PackageOrderRequestPacket(BlockPos pos, List> items, String address) { + public PackageOrderRequestPacket(BlockPos pos, PackageOrder order, String address) { super(pos); - this.items = items; + this.order = order; this.address = address; } @@ -29,20 +24,13 @@ public class PackageOrderRequestPacket extends BlockEntityConfigurationPacket entry : items) { - buffer.writeVarInt(entry.getFirst()); - buffer.writeItem(entry.getSecond()); - } + order.write(buffer); } @Override protected void readSettings(FriendlyByteBuf buffer) { address = buffer.readUtf(); - int size = buffer.readVarInt(); - items = new ArrayList<>(); - for (int i = 0; i < size; i++) - items.add(IntAttached.with(buffer.readVarInt(), buffer.readItem())); + order = PackageOrder.read(buffer); } @Override @@ -50,7 +38,7 @@ public class PackageOrderRequestPacket extends BlockEntityConfigurationPacket> lastClientsideStockSnapshot; protected List> newlyReceivedStockSnapshot; - + protected String previouslyUsedAddress; public StockTickerBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { @@ -38,13 +41,13 @@ public class StockTickerBlockEntity extends LogisticalWorkstationBlockEntity { public List> getClientStockSnapshot() { return lastClientsideStockSnapshot; } - + @Override protected void write(CompoundTag tag, boolean clientPacket) { super.write(tag, clientPacket); tag.putString("PreviousAddress", previouslyUsedAddress); } - + @Override protected void read(CompoundTag tag, boolean clientPacket) { super.read(tag, clientPacket); @@ -60,18 +63,50 @@ public class StockTickerBlockEntity extends LogisticalWorkstationBlockEntity { lastClientsideStockSnapshot = newlyReceivedStockSnapshot; newlyReceivedStockSnapshot = null; } - - public void receivePackageRequest(List> stacks, Player player, String address) { + + public void receivePackageRequest(PackageOrder order, Player player, String address) { + List> stacks = order.stacks(); + + // Packages need to track their index and successors for successful defrag List availableLinks = getAvailableLinks(); - for (IntAttached entry : stacks) { + List usedLinks = new ArrayList<>(); + MutableBoolean finalLinkTracker = new MutableBoolean(false); + + // First box needs to carry the order specifics for successful defrag + PackageOrder contextToSend = order; + + // Packages from future orders should not be merged in the packager queue + int orderId = Create.RANDOM.nextInt(); + + for (int i = 0; i < stacks.size(); i++) { + IntAttached entry = stacks.get(i); int remainingCount = entry.getFirst(); + boolean finalEntry = i == stacks.size() - 1; ItemStack requestedItem = entry.getSecond(); + for (PackagerLinkBlockEntity link : availableLinks) { - remainingCount -= link.processRequest(requestedItem, remainingCount, address); - if (remainingCount == 0) - break; + int usedIndex = usedLinks.indexOf(link); + int linkIndex = usedIndex == -1 ? usedLinks.size() : usedIndex; + MutableBoolean isFinalLink = new MutableBoolean(false); + if (linkIndex == usedLinks.size() - 1) + isFinalLink = finalLinkTracker; + + int processedCount = link.processRequest(requestedItem, remainingCount, address, linkIndex, isFinalLink, + orderId, contextToSend); + if (processedCount > 0 && usedIndex == -1) { + contextToSend = null; + usedLinks.add(link); + finalLinkTracker = isFinalLink; + } + remainingCount -= processedCount; + if (remainingCount > 0) + continue; + if (finalEntry) + finalLinkTracker.setTrue(); + break; } } + previouslyUsedAddress = address; notifyUpdate(); } diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java index 29d6d2fce0..a3844fc329 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java @@ -167,7 +167,7 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { emptyTicks++; else emptyTicks = 0; - + if (successTicks > 0 && itemsToOrder.isEmpty()) successTicks++; else @@ -259,13 +259,14 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { if (alpha > 0) graphics.drawString(font, msg, itemsX + 1, itemsY, new Color(.5f, .5f, .5f, alpha).getRGB()); } - + // Request just sent if (itemsToOrder.isEmpty() && successTicks > 0) { Component msg = CreateLang.translateDirect("gui.stock_ticker.request_sent"); float alpha = Mth.clamp((successTicks - 10f) / 5f, 0f, 1f); if (alpha > 0) - graphics.drawCenteredString(font, msg, itemsX + cols * colWidth / 2, orderY + 4, new Color(.75f, .95f, .75f, alpha).getRGB()); + graphics.drawCenteredString(font, msg, itemsX + cols * colWidth / 2, orderY + 4, + new Color(.75f, .95f, .75f, alpha).getRGB()); } hoveredSlot = getHoveredSlot(mouseX, mouseY, false); @@ -521,10 +522,13 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { @Override public boolean mouseScrolled(double mouseX, double mouseY, double delta) { - int maxScroll = Math.max(0, Mth.ceil(displayedItems.size() / (1.0 * cols)) - rows); - int direction = (int) Math.signum(-delta); - float newTarget = Mth.clamp(itemScroll.getChaseTarget() + direction, 0, maxScroll); - itemScroll.chase(newTarget, 0.5, Chaser.EXP); + int hoveredOrderSlot = getHoveredSlot((int) mouseX, (int) mouseY, true); + if (hoveredOrderSlot == noneHovered) { + int maxScroll = Math.max(0, Mth.ceil(displayedItems.size() / (1.0 * cols)) - rows); + int direction = (int) Math.signum(-delta); + float newTarget = Mth.clamp(itemScroll.getChaseTarget() + direction, 0, maxScroll); + itemScroll.chase(newTarget, 0.5, Chaser.EXP); + } return true; } @@ -570,20 +574,20 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { @Override public void removed() { AllPackets.getChannel() - .sendToServer(new PackageOrderRequestPacket(blockEntity.getBlockPos(), Collections.emptyList(), - addressBox.getValue())); + .sendToServer(new PackageOrderRequestPacket(blockEntity.getBlockPos(), + new PackageOrder(Collections.emptyList()), addressBox.getValue())); super.removed(); } - + private void sendIt() { revalidateOrders(); if (itemsToOrder.isEmpty()) return; - + AllPackets.getChannel() - .sendToServer( - new PackageOrderRequestPacket(blockEntity.getBlockPos(), itemsToOrder, addressBox.getValue())); - + .sendToServer(new PackageOrderRequestPacket(blockEntity.getBlockPos(), new PackageOrder(itemsToOrder), + addressBox.getValue())); + itemsToOrder = new ArrayList<>(); ticksSinceLastUpdate = 10; successTicks = 1; diff --git a/src/main/resources/assets/create/models/block/order_collector/block.json b/src/main/resources/assets/create/models/block/order_collector/block.json new file mode 100644 index 0000000000..335b9419d9 --- /dev/null +++ b/src/main/resources/assets/create/models/block/order_collector/block.json @@ -0,0 +1,57 @@ +{ + "credit": "Made with Blockbench", + "texture_size": [32, 32], + "textures": { + "0": "create:block/order_collector", + "particle": "create:block/order_collector" + }, + "elements": [ + { + "name": "Top", + "from": [0, 14, 0], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [8, 0, 16, 1], "texture": "#0"}, + "east": {"uv": [8, 8, 16, 9], "texture": "#0"}, + "south": {"uv": [8, 0, 16, 1], "texture": "#0"}, + "west": {"uv": [8, 8, 16, 9], "texture": "#0"}, + "up": {"uv": [0, 0, 8, 8], "texture": "#0"}, + "down": {"uv": [0, 0, 8, 8], "texture": "#0"} + } + }, + { + "name": "Core", + "from": [2, 2, 0.95], + "to": [14, 14, 15.05], + "faces": { + "north": {"uv": [9, 1, 15, 7], "texture": "#0"}, + "south": {"uv": [9, 1, 15, 7], "texture": "#0"}, + "down": {"uv": [1, 8.5, 7, 15.55], "texture": "#0"} + } + }, + { + "name": "Side", + "from": [14, 0, 0], + "to": [16, 14, 16], + "faces": { + "north": {"uv": [8, 1, 9, 8], "texture": "#0"}, + "east": {"uv": [8, 9, 16, 16], "texture": "#0"}, + "south": {"uv": [15, 1, 16, 8], "texture": "#0"}, + "west": {"uv": [8, 9, 16, 16], "texture": "#0"}, + "down": {"uv": [0, 8, 1, 16], "rotation": 180, "texture": "#0"} + } + }, + { + "name": "Side", + "from": [0, 0, 0], + "to": [2, 14, 16], + "faces": { + "north": {"uv": [15, 1, 16, 8], "texture": "#0"}, + "east": {"uv": [8, 9, 16, 16], "texture": "#0"}, + "south": {"uv": [8, 1, 9, 8], "texture": "#0"}, + "west": {"uv": [8, 9, 16, 16], "texture": "#0"}, + "down": {"uv": [0, 8, 1, 16], "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/order_collector/item.json b/src/main/resources/assets/create/models/block/order_collector/item.json new file mode 100644 index 0000000000..d87f3f6bf8 --- /dev/null +++ b/src/main/resources/assets/create/models/block/order_collector/item.json @@ -0,0 +1,72 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "texture_size": [32, 32], + "textures": { + "0": "create:block/order_collector", + "2": "create:block/axis_top", + "3": "create:block/axis", + "particle": "create:block/order_collector" + }, + "elements": [ + { + "name": "Top", + "from": [0, 14, 0], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [8, 0, 16, 1], "texture": "#0"}, + "east": {"uv": [8, 8, 16, 9], "texture": "#0"}, + "south": {"uv": [8, 0, 16, 1], "texture": "#0"}, + "west": {"uv": [8, 8, 16, 9], "texture": "#0"}, + "up": {"uv": [0, 0, 8, 8], "texture": "#0"}, + "down": {"uv": [0, 0, 8, 8], "texture": "#0"} + } + }, + { + "name": "Core", + "from": [2, 2, 0.95], + "to": [14, 14, 15.05], + "faces": { + "north": {"uv": [9, 1, 15, 7], "texture": "#0"}, + "south": {"uv": [9, 1, 15, 7], "texture": "#0"}, + "down": {"uv": [1, 8.5, 7, 15.55], "texture": "#0"} + } + }, + { + "name": "Side", + "from": [14, 0, 0], + "to": [16, 14, 16], + "faces": { + "north": {"uv": [8, 1, 9, 8], "texture": "#0"}, + "east": {"uv": [8, 9, 16, 16], "texture": "#0"}, + "south": {"uv": [15, 1, 16, 8], "texture": "#0"}, + "west": {"uv": [8, 9, 16, 16], "texture": "#0"}, + "down": {"uv": [0, 8, 1, 16], "rotation": 180, "texture": "#0"} + } + }, + { + "name": "Side", + "from": [0, 0, 0], + "to": [2, 14, 16], + "faces": { + "north": {"uv": [15, 1, 16, 8], "texture": "#0"}, + "east": {"uv": [8, 9, 16, 16], "texture": "#0"}, + "south": {"uv": [8, 1, 9, 8], "texture": "#0"}, + "west": {"uv": [8, 9, 16, 16], "texture": "#0"}, + "down": {"uv": [0, 8, 1, 16], "texture": "#0"} + } + }, + { + "from": [6, 6, 0], + "to": [10, 10, 16], + "faces": { + "north": {"uv": [6, 6, 10, 10], "texture": "#2"}, + "east": {"uv": [6, 0, 10, 16], "rotation": 90, "texture": "#3"}, + "south": {"uv": [6, 6, 10, 10], "texture": "#2"}, + "west": {"uv": [6, 0, 10, 16], "rotation": 90, "texture": "#3"}, + "up": {"uv": [6, 0, 10, 16], "rotation": 180, "texture": "#3"}, + "down": {"uv": [6, 0, 10, 16], "rotation": 180, "texture": "#3"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/block/order_collector.png b/src/main/resources/assets/create/textures/block/order_collector.png new file mode 100644 index 0000000000000000000000000000000000000000..20b7d4ac94a413f7cc672de3279cf3d4fae59625 GIT binary patch literal 518 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCilW1AIbU4Xi92JzRpr12Z#|TAIq|&z`(z+d3DIC~a*+QxjWT8xKdvfY7Ld zw48QhLqjJZCm_Jp#l_0PLP}DSnHgl2g}J${jg6n5pRTTvc<)*>b>p&~4Tr4mZ;N%fU6n5Saq-Lcx&zzu<$R9)(z`VK zT=e1-rh97+U9?aNlwV$1*LSJ4#b8bgBg^4?{ik>3zBZ~lzmzGe!C-CtfnPS9QxEOo zOq|Wnw7kVxQGJSY(}tR;gcCjoCoaoAk^eq1WTgVzu8+^l=eZS5(O$g8t2b!t)g{5J zP3N9|RBYL|HMMbSSM1if?s6X%wJi@1vQ`E>V{~7`5EE8;K)U`nXJ+6t$IEgx!fW(1 zrc^R0#xW~&6y+%H=Q*T(k7?0?Ol}=*SUet%|#7XOA{qP=`!;guTGL!T~;DWAu_>Az!(QsU92(O$rSW$<+Mb6Mw< G&;$VAHpp23 literal 0 HcmV?d00001 From 936fcd996a30a0f49bb95038e349ca46aa3606a9 Mon Sep 17 00:00:00 2001 From: zelophed Date: Sun, 11 Feb 2024 22:06:09 +0100 Subject: [PATCH 029/515] Precision Rotation --- gradle.properties | 4 +- .../java/com/simibubi/create/AllPackets.java | 3 + .../com/simibubi/create/CreateClient.java | 2 + .../wrench/RadialWrenchHandler.java | 25 +- .../contraptions/wrench/RadialWrenchMenu.java | 363 +++++++++++++++--- .../wrench/RadialWrenchMenuSubmitPacket.java | 45 +++ .../equipment/toolbox/RadialToolboxMenu.java | 8 +- .../foundation/events/ClientEvents.java | 2 + .../create/foundation/events/InputEvents.java | 2 + .../create/foundation/gui/CreateTheme.java | 2 + 10 files changed, 391 insertions(+), 65 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchMenuSubmitPacket.java diff --git a/gradle.properties b/gradle.properties index b5378ea520..2fdbd44f22 100644 --- a/gradle.properties +++ b/gradle.properties @@ -28,8 +28,8 @@ jei_minecraft_version = 1.20.1 jei_version = 15.2.0.22 curios_minecraft_version = 1.20.1 curios_version = 5.3.1 -catnip_version = 0.7.5 -ponder_version = 0.7.5 +catnip_version = 0.7.7 +ponder_version = 0.7.6 cc_tweaked_enable = true cc_tweaked_minecraft_version = 1.20.1 diff --git a/src/main/java/com/simibubi/create/AllPackets.java b/src/main/java/com/simibubi/create/AllPackets.java index 471de8395d..df34b49e82 100644 --- a/src/main/java/com/simibubi/create/AllPackets.java +++ b/src/main/java/com/simibubi/create/AllPackets.java @@ -32,6 +32,7 @@ import com.simibubi.create.content.contraptions.sync.ContraptionFluidPacket; import com.simibubi.create.content.contraptions.sync.ContraptionInteractionPacket; import com.simibubi.create.content.contraptions.sync.ContraptionSeatMappingPacket; import com.simibubi.create.content.contraptions.sync.LimbSwingUpdatePacket; +import com.simibubi.create.content.contraptions.wrench.RadialWrenchMenuSubmitPacket; import com.simibubi.create.content.equipment.bell.SoulPulseEffectPacket; import com.simibubi.create.content.equipment.blueprint.BlueprintAssignCompleteRecipePacket; import com.simibubi.create.content.equipment.clipboard.ClipboardEditPacket; @@ -163,6 +164,8 @@ public enum AllPackets { CLIPBOARD_EDIT(ClipboardEditPacket.class, ClipboardEditPacket::new, PLAY_TO_SERVER), CONTRAPTION_COLLIDER_LOCK_REQUEST(ContraptionColliderLockPacketRequest.class, ContraptionColliderLockPacketRequest::new, PLAY_TO_SERVER), + RADIAL_WRENCH_MENU_SUBMIT(RadialWrenchMenuSubmitPacket.class, RadialWrenchMenuSubmitPacket::new, + PLAY_TO_SERVER), // Server to Client SYMMETRY_EFFECT(SymmetryEffectPacket.class, SymmetryEffectPacket::new, PLAY_TO_CLIENT), diff --git a/src/main/java/com/simibubi/create/CreateClient.java b/src/main/java/com/simibubi/create/CreateClient.java index 7b20e24195..79065937fb 100644 --- a/src/main/java/com/simibubi/create/CreateClient.java +++ b/src/main/java/com/simibubi/create/CreateClient.java @@ -18,6 +18,7 @@ import com.simibubi.create.content.schematics.client.SchematicHandler; import com.simibubi.create.content.trains.GlobalRailwayManager; import com.simibubi.create.foundation.ClientResourceReloadListener; import com.simibubi.create.foundation.blockEntity.behaviour.ValueSettingsClient; +import com.simibubi.create.foundation.gui.CreateTheme; import com.simibubi.create.foundation.ponder.CreatePonderPlugin; import com.simibubi.create.foundation.render.CreateContexts; import com.simibubi.create.foundation.utility.ModelSwapper; @@ -92,6 +93,7 @@ public class CreateClient { //AllPonderTags.register(); //PonderIndex.register(); PonderIndex.addPlugin(new CreatePonderPlugin()); + CreateTheme.loadClass(); setupConfigUIBackground(); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchHandler.java b/src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchHandler.java index 2ad07f5c93..b25a2318d1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchHandler.java @@ -2,7 +2,7 @@ package com.simibubi.create.content.contraptions.wrench; import com.simibubi.create.AllItems; import com.simibubi.create.AllKeys; -import com.simibubi.create.content.equipment.wrench.IWrenchable; + import net.createmod.catnip.gui.ScreenOpener; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; @@ -15,14 +15,27 @@ import net.minecraft.world.phys.HitResult; public class RadialWrenchHandler { + public static int COOLDOWN = 0; + + public static void clientTick() { + if (COOLDOWN > 0 && !AllKeys.ROTATE_MENU.isPressed()) + COOLDOWN--; + } + public static void onKeyInput(int key, boolean pressed) { - Minecraft mc = Minecraft.getInstance(); - if (mc.gameMode == null || mc.gameMode.getPlayerMode() == GameType.SPECTATOR) + if (!pressed) return; if (key != AllKeys.ROTATE_MENU.getBoundCode()) return; + if (COOLDOWN > 0) + return; + + Minecraft mc = Minecraft.getInstance(); + if (mc.gameMode == null || mc.gameMode.getPlayerMode() == GameType.SPECTATOR) + return; + LocalPlayer player = mc.player; if (player == null) return; @@ -39,11 +52,7 @@ public class RadialWrenchHandler { BlockState state = level.getBlockState(blockHitResult.getBlockPos()); - if (!(state.getBlock() instanceof IWrenchable)) - return; - - ScreenOpener.open(new RadialWrenchMenu(state)); - + RadialWrenchMenu.tryCreateFor(state, blockHitResult.getBlockPos(), level).ifPresent(ScreenOpener::open); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchMenu.java b/src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchMenu.java index 1fb7b6228c..526df2bb68 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchMenu.java +++ b/src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchMenu.java @@ -1,67 +1,143 @@ package com.simibubi.create.content.contraptions.wrench; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; + +import javax.annotation.Nullable; + +import org.joml.Matrix4f; + +import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.platform.InputConstants; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.Tesselator; +import com.mojang.blaze3d.vertex.VertexFormat; +import com.simibubi.create.AllBlocks; import com.simibubi.create.AllKeys; -import com.simibubi.create.content.equipment.wrench.IWrenchable; +import com.simibubi.create.AllPackets; +import com.simibubi.create.Create; import com.simibubi.create.content.kinetics.base.DirectionalKineticBlock; import com.simibubi.create.content.kinetics.base.HorizontalAxisKineticBlock; import com.simibubi.create.content.kinetics.base.HorizontalKineticBlock; import com.simibubi.create.content.kinetics.base.RotatedPillarKineticBlock; +import com.simibubi.create.content.kinetics.transmission.sequencer.SequencedGearshiftBlock; +import com.simibubi.create.foundation.gui.AllIcons; +import com.simibubi.create.foundation.gui.CreateTheme; + import net.createmod.catnip.gui.AbstractSimiScreen; -import net.createmod.catnip.gui.RadialMenu; +import net.createmod.catnip.gui.UIRenderHelper; import net.createmod.catnip.gui.element.GuiGameElement; +import net.createmod.catnip.gui.element.RenderElement; +import net.createmod.catnip.platform.CatnipServices; import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.math.AngleHelper; import net.createmod.catnip.utility.theme.Color; +import net.createmod.catnip.utility.theme.Theme; +import net.createmod.ponder.enums.PonderGuiTextures; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.player.LocalPlayer; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.HopperBlock; +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 java.util.ArrayList; -import java.util.List; - public class RadialWrenchMenu extends AbstractSimiScreen { - private static final List> properties = List.of( - RotatedPillarKineticBlock.AXIS, - DirectionalKineticBlock.FACING, - HorizontalAxisKineticBlock.HORIZONTAL_AXIS, - HorizontalKineticBlock.HORIZONTAL_FACING - ); + public static final Map, String> VALID_PROPERTIES = new HashMap<>(); - private final BlockState state; - private List allStates = List.of(); - private RadialMenu radialMenu; - private int ticksOpen; + static { + registerRotationProperty(RotatedPillarKineticBlock.AXIS, "Axis"); + registerRotationProperty(DirectionalKineticBlock.FACING, "Facing"); + registerRotationProperty(HorizontalAxisKineticBlock.HORIZONTAL_AXIS, "Axis"); + registerRotationProperty(HorizontalKineticBlock.HORIZONTAL_FACING, "Facing"); + registerRotationProperty(HopperBlock.FACING, "Facing"); - public RadialWrenchMenu(BlockState state) { - this.state = state; - - if (!(state.getBlock() instanceof IWrenchable wrenchable)) - return; - - allStates = getRotatedStates(state); - /*allStates = Stream.concat(Arrays.stream(Iterate.directions) - .map(dir -> wrenchable.getRotatedBlockState(state, dir)), - Stream.of(state) - ).distinct().toList();*/ - - radialMenu = new RadialMenu(allStates.size()); + registerRotationProperty(SequencedGearshiftBlock.VERTICAL, "Vertical"); } - public static List getRotatedStates(BlockState state) { - List states = new ArrayList<>(); - states.add(state); + public static final Set BLOCK_BLACKLIST = new HashSet<>(); - for (Property property : properties) { - if (state.hasProperty(property)) { - cycleAllPropertyValues(property, states); - } - } + static { + registerBlacklistedBlock(AllBlocks.LARGE_WATER_WHEEL.getId()); + registerBlacklistedBlock(AllBlocks.WATER_WHEEL_STRUCTURAL.getId()); + } - return states; + public static void registerRotationProperty(Property property, String label) { + if (VALID_PROPERTIES.containsKey(property)) + return; + + VALID_PROPERTIES.put(property, label); + } + + public static void registerBlacklistedBlock(ResourceLocation location) { + if (BLOCK_BLACKLIST.contains(location)) + return; + + BLOCK_BLACKLIST.add(location); + } + + private final BlockState state; + private final BlockPos pos; + private final BlockEntity blockEntity; + @Nullable private final Level level; + private final List, String>> propertiesForState; + private final int innerRadius = 50; + private final int outerRadius = 110; + + private int selectedPropertyIndex = 0; + private List allStates = List.of(); + private String propertyLabel = ""; + private int ticksOpen; + private int selectedStateIndex = 0; + + private RenderElement iconScroll = RenderElement.of(PonderGuiTextures.ICON_SCROLL); + private RenderElement iconUp = RenderElement.of(AllIcons.I_PRIORITY_HIGH); + private RenderElement iconDown = RenderElement.of(AllIcons.I_PRIORITY_LOW); + + public static Optional tryCreateFor(BlockState state, BlockPos pos, @Nullable Level level) { + if (BLOCK_BLACKLIST.contains(CatnipServices.REGISTRIES.getKeyOrThrow(state.getBlock()))) + return Optional.empty(); + + var propertiesForState = VALID_PROPERTIES.entrySet().stream().filter(entry -> state.hasProperty(entry.getKey())).toList(); + + if (propertiesForState.isEmpty()) + return Optional.empty(); + + return Optional.of(new RadialWrenchMenu(state, pos, level, propertiesForState)); + } + + private RadialWrenchMenu(BlockState state, BlockPos pos, @Nullable Level level, List, String>> properties) { + this.state = state; + this.pos = pos; + this.level = level; + this.blockEntity = level.getBlockEntity(pos); + this.propertiesForState = properties; + + initForSelectedProperty(); + } + + private void initForSelectedProperty() { + Map.Entry, String> entry = propertiesForState.get(selectedPropertyIndex); + + allStates = new ArrayList<>(); + allStates.add(state); + cycleAllPropertyValues(entry.getKey(), allStates); + + propertyLabel = entry.getValue(); } private static void cycleAllPropertyValues(Property property, List states) { @@ -95,32 +171,174 @@ public class RadialWrenchMenu extends AbstractSimiScreen { ms.pushPose(); ms.translate(x, y, 0); - ms.pushPose(); + RenderSystem.enableBlend(); + RenderSystem.defaultBlendFunc(); - radialMenu.draw(graphics, allStates - .stream() - .map(state -> GuiGameElement.of(state) - .rotateBlock(player.getXRot(), player.getYRot() + 180, 0f) - .scale(24) - ).toList() - ); + int mouseOffsetX = mouseX - this.width / 2; + int mouseOffsetY = mouseY - this.height / 2; - ms.popPose(); + if (Mth.length(mouseOffsetX, mouseOffsetY) > innerRadius - 5) { + double theta = Mth.atan2(mouseOffsetX, mouseOffsetY); - if (allStates.size() <= 1) { - GuiGameElement.of(state) - .rotateBlock(player.getXRot(), player.getYRot(), 0f) - .scale(24) - .render(graphics); + float sectorSize = 360f / allStates.size(); + + selectedStateIndex = (int) Math.floor( + ((-AngleHelper.deg(Mth.atan2(mouseOffsetX, mouseOffsetY)) + 180 + sectorSize / 2) % 360) + / sectorSize + ); + + renderDirectionIndicator(graphics, theta); } + renderRadialSectors(graphics); + + UIRenderHelper.streak(graphics, 0, 0, 0, 32, 65, Color.BLACK.setAlpha(0.8f)); + UIRenderHelper.streak(graphics, 180, 0, 0, 32, 65, Color.BLACK.setAlpha(0.8f)); + + if (selectedPropertyIndex > 0) { + iconScroll.at(-14, -46).render(graphics); + iconUp.at(-1, -46).render(graphics); + graphics.drawCenteredString(font, propertiesForState.get(selectedPropertyIndex - 1).getValue(), 0, -30, Theme.Key.TEXT.i()); + } + + if (selectedPropertyIndex < propertiesForState.size() - 1) { + iconScroll.at(-14, 30).render(graphics); + iconDown.at(-1, 30).render(graphics); + graphics.drawCenteredString(font, propertiesForState.get(selectedPropertyIndex + 1).getValue(), 0, 22, Theme.Key.TEXT.i()); + } + + graphics.drawCenteredString(font, "Currently", 0, -13, Theme.Key.TEXT.i()); + graphics.drawCenteredString(font, "Changing:", 0, -3, Theme.Key.TEXT.i()); + graphics.drawCenteredString(font, propertyLabel, 0, 7, Theme.Key.TEXT.i()); + ms.popPose(); } + private void renderRadialSectors(GuiGraphics graphics) { + int sectors = allStates.size(); + if (sectors < 2) + return; + + PoseStack poseStack = graphics.pose(); + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) + return; + + float sectorAngle = 360f / sectors; + int sectorWidth = outerRadius - innerRadius; + + poseStack.pushPose(); + + for (int i = 0; i < sectors; i++) { + Color innerColor = Color.WHITE.setAlpha(0.05f); + Color outerColor = Color.WHITE.setAlpha(0.3f); + BlockState blockState = allStates.get(i); + Property property = propertiesForState.get(selectedPropertyIndex).getKey(); + + poseStack.pushPose(); + + if (i == selectedStateIndex) { + innerColor.mixWith(new Color(0.8f, 0.8f, 0.2f, 0.2f), 0.5f); + outerColor.mixWith(new Color(0.8f, 0.8f, 0.2f, 0.6f), 0.5f); + + UIRenderHelper.drawRadialSector(graphics, outerRadius + 2, outerRadius + 3, -(sectorAngle / 2 + 90), sectorAngle, outerColor, outerColor); + } + + UIRenderHelper.drawRadialSector(graphics, innerRadius, outerRadius, -(sectorAngle / 2 + 90), sectorAngle, innerColor, outerColor); + Color c = innerColor.copy().setAlpha(0.5f); + UIRenderHelper.drawRadialSector(graphics, innerRadius - 3, innerRadius - 2, -(sectorAngle / 2 + 90), sectorAngle, c, c); + + TransformStack.cast(poseStack) + .translateY(-(sectorWidth / 2f + innerRadius)) + .rotateZ(-i * sectorAngle); + + try { + GuiGameElement.of(blockState, blockEntity) + .rotateBlock(player.getXRot(), player.getYRot() + 180, 0f) + .scale(24) + .at(-12, 12) + .render(graphics); + } catch (Exception e) { + Create.LOGGER.warn("Failed to render blockstate in RadialWrenchMenu", e); + allStates.remove(i); + selectedStateIndex = 0; + return; + } + + poseStack.translate(0, 0, 50); + + if (i == selectedStateIndex) { + graphics.drawCenteredString(font, blockState.getValue(property).toString(), 0, 15, Theme.Key.TEXT.i()); + } + + poseStack.popPose(); + + poseStack.pushPose(); + + TransformStack.cast(poseStack) + .rotateZ(sectorAngle / 2); + + poseStack.translate(0, -innerRadius - 20, 10); + + UIRenderHelper.angledGradient(graphics, -90, 0, 0, 0.5f, sectorWidth - 10, Color.WHITE.setAlpha(0.5f), Color.WHITE.setAlpha(0.15f)); + UIRenderHelper.angledGradient(graphics, 90, 0, 0, 0.5f, 25 , Color.WHITE.setAlpha(0.5f), Color.WHITE.setAlpha(0.15f)); + poseStack.popPose(); + + TransformStack.cast(poseStack) + .rotateZ(sectorAngle); + } + + poseStack.popPose(); + + } + + private void renderDirectionIndicator(GuiGraphics graphics, double theta) { + PoseStack poseStack = graphics.pose(); + + float r = 0.8f; + float g = 0.8f; + float b = 0.8f; + + poseStack.pushPose(); + TransformStack.cast(poseStack) + .rotateZRadians(-theta) + .translateY(innerRadius + 3) + .translateZ(15); + + RenderSystem.setShader(GameRenderer::getPositionColorShader); + + Tesselator tesselator = Tesselator.getInstance(); + BufferBuilder bufferbuilder = tesselator.getBuilder(); + bufferbuilder.begin(VertexFormat.Mode.TRIANGLE_FAN, DefaultVertexFormat.POSITION_COLOR); + + Matrix4f mat = poseStack.last().pose(); + + bufferbuilder.vertex(mat, 0, 0, 0).color(r, g, b, 0.75f).endVertex(); + + bufferbuilder.vertex(mat, 5, -5, 0).color(r, g, b, 0.4f).endVertex(); + bufferbuilder.vertex(mat, 3, -4.5f, 0).color(r, g, b, 0.4f).endVertex(); + bufferbuilder.vertex(mat, 0, -4.2f, 0).color(r, g, b, 0.4f).endVertex(); + bufferbuilder.vertex(mat, -3, -4.5f, 0).color(r, g, b, 0.4f).endVertex(); + bufferbuilder.vertex(mat, -5, -5, 0).color(r, g, b, 0.4f).endVertex(); + + tesselator.end(); + + poseStack.popPose(); + } + + private void submitChange() { + BlockState selectedState = allStates.get(selectedStateIndex); + if (selectedState != state) { + AllPackets.getChannel().sendToServer(new RadialWrenchMenuSubmitPacket(pos, selectedState)); + } + + onClose(); + } + @Override public void renderBackground(GuiGraphics graphics) { - Color color = new Color(0x50_101010) + Color color = CreateTheme.Key.RADIAL_BACKGROUND.c() .scaleAlpha(Math.min(1, (ticksOpen + AnimationTickHolder.getPartialTicks()) / 20f)); graphics.fillGradient(0, 0, this.width, this.height, color.getRGB(), color.getRGB()); @@ -130,10 +348,49 @@ public class RadialWrenchMenu extends AbstractSimiScreen { public boolean keyReleased(int code, int scanCode, int modifiers) { InputConstants.Key mouseKey = InputConstants.getKey(code, scanCode); if (AllKeys.ROTATE_MENU.getKeybind().isActiveAndMatches(mouseKey)) { - onClose(); + submitChange(); return true; } return super.keyReleased(code, scanCode, modifiers); } + @Override + public boolean mouseClicked(double pMouseX, double pMouseY, int pButton) { + if (pButton == InputConstants.MOUSE_BUTTON_LEFT) { + submitChange(); + return true; + } else if (pButton == InputConstants.MOUSE_BUTTON_RIGHT) { + onClose(); + return true; + } + + return super.mouseClicked(pMouseX, pMouseY, pButton); + } + + @Override + public boolean mouseScrolled(double pMouseX, double pMouseY, double pDelta) { + if (propertiesForState.size() < 2) + return super.mouseScrolled(pMouseX, pMouseY, pDelta); + + int indexDelta = (int) Math.round(Math.signum(-pDelta)); + + int newIndex = selectedPropertyIndex + indexDelta; + if (newIndex < 0) + return false; + + if (newIndex >= propertiesForState.size()) + return false; + + selectedPropertyIndex = newIndex; + initForSelectedProperty(); + + return true; + } + + @Override + public void removed() { + RadialWrenchHandler.COOLDOWN = 2; + + super.removed(); + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchMenuSubmitPacket.java b/src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchMenuSubmitPacket.java new file mode 100644 index 0000000000..8b5b9611de --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchMenuSubmitPacket.java @@ -0,0 +1,45 @@ +package com.simibubi.create.content.contraptions.wrench; + +import com.simibubi.create.content.kinetics.base.KineticBlockEntity; +import com.simibubi.create.foundation.networking.SimplePacketBase; + +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.network.NetworkEvent; +import net.minecraftforge.registries.GameData; + +public class RadialWrenchMenuSubmitPacket extends SimplePacketBase { + + private final BlockPos blockPos; + private final BlockState newState; + + public RadialWrenchMenuSubmitPacket(BlockPos blockPos, BlockState newState) { + this.blockPos = blockPos; + this.newState = newState; + } + + public RadialWrenchMenuSubmitPacket(FriendlyByteBuf buffer) { + this.blockPos = buffer.readBlockPos(); + this.newState = buffer.readById(GameData.getBlockStateIDMap()); + } + + @Override + public void write(FriendlyByteBuf buffer) { + buffer.writeBlockPos(blockPos); + buffer.writeId(GameData.getBlockStateIDMap(), newState); + } + + @Override + public boolean handle(NetworkEvent.Context context) { + context.enqueueWork(() -> { + ServerPlayer player = context.getSender(); + Level level = player.level(); + + KineticBlockEntity.switchToBlockState(level, blockPos, newState); + }); + return true; + } +} diff --git a/src/main/java/com/simibubi/create/content/equipment/toolbox/RadialToolboxMenu.java b/src/main/java/com/simibubi/create/content/equipment/toolbox/RadialToolboxMenu.java index b8c8f0e843..04669d60c8 100644 --- a/src/main/java/com/simibubi/create/content/equipment/toolbox/RadialToolboxMenu.java +++ b/src/main/java/com/simibubi/create/content/equipment/toolbox/RadialToolboxMenu.java @@ -16,12 +16,14 @@ import com.simibubi.create.AllKeys; import com.simibubi.create.AllPackets; import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllIcons; +import com.simibubi.create.foundation.gui.CreateTheme; import com.simibubi.create.foundation.utility.CreateLang; import net.createmod.catnip.gui.AbstractSimiScreen; import net.createmod.catnip.gui.element.GuiGameElement; import net.createmod.catnip.utility.AnimationTickHolder; import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.utility.theme.Color; import net.minecraft.ChatFormatting; import net.minecraft.client.KeyMapping; import net.minecraft.client.gui.GuiGraphics; @@ -213,8 +215,10 @@ public class RadialToolboxMenu extends AbstractSimiScreen { @Override public void renderBackground(GuiGraphics graphics) { - int a = ((int) (0x50 * Math.min(1, (ticksOpen + AnimationTickHolder.getPartialTicks()) / 20f))) << 24; - graphics.fillGradient(0, 0, this.width, this.height, 0x101010 | a, 0x101010 | a); + Color color = CreateTheme.Key.RADIAL_BACKGROUND.c() + .scaleAlpha(Math.min(1, (ticksOpen + AnimationTickHolder.getPartialTicks()) / 20f)); + + graphics.fillGradient(0, 0, this.width, this.height, color.getRGB(), color.getRGB()); } @Override diff --git a/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java b/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java index 73e9472b5e..a4b4a4fe7b 100644 --- a/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java @@ -13,6 +13,7 @@ import com.simibubi.create.content.contraptions.minecart.CouplingPhysics; import com.simibubi.create.content.contraptions.minecart.CouplingRenderer; import com.simibubi.create.content.contraptions.minecart.capability.CapabilityMinecartController; import com.simibubi.create.content.contraptions.render.ContraptionRenderDispatcher; +import com.simibubi.create.content.contraptions.wrench.RadialWrenchHandler; import com.simibubi.create.content.decoration.girder.GirderWrenchBehavior; import com.simibubi.create.content.equipment.armor.BacktankArmorLayer; import com.simibubi.create.content.equipment.armor.DivingHelmetItem; @@ -155,6 +156,7 @@ public class ClientEvents { ContraptionRenderDispatcher.tick(world); BlueprintOverlayRenderer.tick(); ToolboxHandlerClient.clientTick(); + RadialWrenchHandler.clientTick(); TrackTargetingClient.clientTick(); TrackPlacement.clientTick(); TrainRelocator.clientTick(); diff --git a/src/main/java/com/simibubi/create/foundation/events/InputEvents.java b/src/main/java/com/simibubi/create/foundation/events/InputEvents.java index f5a524fcb9..7ee9d2297b 100644 --- a/src/main/java/com/simibubi/create/foundation/events/InputEvents.java +++ b/src/main/java/com/simibubi/create/foundation/events/InputEvents.java @@ -2,6 +2,7 @@ package com.simibubi.create.foundation.events; import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.elevator.ElevatorControlsHandler; +import com.simibubi.create.content.contraptions.wrench.RadialWrenchHandler; import com.simibubi.create.content.equipment.toolbox.ToolboxHandlerClient; import com.simibubi.create.content.redstone.link.controller.LinkedControllerClientHandler; import com.simibubi.create.content.trains.TrainHUD; @@ -28,6 +29,7 @@ public class InputEvents { CreateClient.SCHEMATIC_HANDLER.onKeyInput(key, pressed); ToolboxHandlerClient.onKeyInput(key, pressed); + RadialWrenchHandler.onKeyInput(key, pressed); } @SubscribeEvent diff --git a/src/main/java/com/simibubi/create/foundation/gui/CreateTheme.java b/src/main/java/com/simibubi/create/foundation/gui/CreateTheme.java index d6d5e97f48..d39b86dcee 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/CreateTheme.java +++ b/src/main/java/com/simibubi/create/foundation/gui/CreateTheme.java @@ -11,6 +11,7 @@ public class CreateTheme extends Theme { protected void init() { put(Key.STANDARD_TOOLTIP, new Color(0xff_c9974c), new Color(0xff_f1dd79)); + put(Key.RADIAL_BACKGROUND, new Color(0x50_101010, true)); } @@ -19,6 +20,7 @@ public class CreateTheme extends Theme { public static class Key { public static final Theme.Key STANDARD_TOOLTIP = new Theme.Key(); + public static final Theme.Key RADIAL_BACKGROUND = new Theme.Key(); } } From 72cc98203ed8d43a6c2deb384dce6b4754a9734d Mon Sep 17 00:00:00 2001 From: zelophed Date: Thu, 29 Feb 2024 18:01:05 +0100 Subject: [PATCH 030/515] can't stop the c-train - added train location info to /create trains and the crash messages - added command to teleport players to a train - set default keybind of rotation menu to unbound --- .editorconfig | 2 +- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 6 +- .../resources/assets/create/lang/en_ud.json | 1 + .../resources/assets/create/lang/en_us.json | 1 + .../java/com/simibubi/create/AllKeys.java | 2 +- .../content/trains/entity/Carriage.java | 9 ++ .../create/content/trains/entity/Train.java | 17 ++- .../content/trains/entity/TrainStatus.java | 45 +++++++- .../infrastructure/command/AllCommands.java | 2 +- .../command/DumpRailwaysCommand.java | 78 ++++++++++---- .../command/KillTrainCommand.java | 40 ------- .../infrastructure/command/TrainCommand.java | 102 ++++++++++++++++++ .../assets/create/lang/default/interface.json | 23 ++-- 13 files changed, 243 insertions(+), 85 deletions(-) delete mode 100644 src/main/java/com/simibubi/create/infrastructure/command/KillTrainCommand.java create mode 100644 src/main/java/com/simibubi/create/infrastructure/command/TrainCommand.java diff --git a/.editorconfig b/.editorconfig index 8fcc41721e..53048c7d9a 100644 --- a/.editorconfig +++ b/.editorconfig @@ -15,7 +15,7 @@ indent_size = 2 [*.java] indent_style = tab -ij_continuation_indent_size = 8 +ij_continuation_indent_size = 4 ij_java_class_count_to_use_import_on_demand = 99 ij_java_names_count_to_use_import_on_demand = 99 ij_java_imports_layout = $*,|,java.**,|,javax.**,|,org.**,|,com.**,|,* diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 1e8e1a5bc1..fb11cf48b3 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2023-11-17T16:06:13.2756739 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-02-29T14:59:32.1927352 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -585,8 +585,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -807ea2be63882ed9e2d14267abf902a4c9313027 assets/create/lang/en_ud.json -50e19fb11134116092d9f05811ff63bc116a997c assets/create/lang/en_us.json +39f8802f6bb711dc22a40ff3399c3a1a37858673 assets/create/lang/en_ud.json +484bde55e2a72fedb4495445bb8e7eaeb57600f7 assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 1c7cbdd7b9..d637abe1cb 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -2605,6 +2605,7 @@ "create.train.status": "%1$s :uıɐɹ⟘ ʇnoqɐ uoıʇɐɯɹoɟuI >ı<", "create.train.status.back_on_track": "ʞɔɐɹ⟘ uo ʞɔɐq sı uıɐɹ⟘", "create.train.status.collision": "uıɐɹ⟘ ɹǝɥʇo ɥʇıʍ uoısıןןoƆ", + "create.train.status.collision.where": "]%2$s[ ɹɐǝu %1$s uI", "create.train.status.coupling_stress": "sbuıןdnoƆ uo ssǝɹʇS oʇ ǝnp doʇs pǝɔɹoℲ", "create.train.status.double_portal": "ɹǝɥʇouɐ buıʌɐǝן ʇsןıɥʍ ןɐʇɹod ɐ ɹǝʇuǝ ʇouuɐɔ ǝbɐıɹɹɐƆ Ɐ", "create.train.status.end_of_track": "ʞɔɐɹ⟘ sʇı ɟo puǝ ǝɥʇ pǝɥɔɐǝɹ sɐɥ ǝbɐıɹɹɐƆ Ɐ", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index ad4512b5c8..79ca2feac3 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -2605,6 +2605,7 @@ "create.train.status": " Information about Train: %1$s", "create.train.status.back_on_track": "Train is back on Track", "create.train.status.collision": "Collision with other Train", + "create.train.status.collision.where": "In %1$s near [%2$s]", "create.train.status.coupling_stress": "Forced stop due to Stress on Couplings", "create.train.status.double_portal": "A Carriage cannot enter a portal whilst leaving another", "create.train.status.end_of_track": "A Carriage has reached the end of its Track", diff --git a/src/main/java/com/simibubi/create/AllKeys.java b/src/main/java/com/simibubi/create/AllKeys.java index 786f151408..0b1f1338be 100644 --- a/src/main/java/com/simibubi/create/AllKeys.java +++ b/src/main/java/com/simibubi/create/AllKeys.java @@ -18,7 +18,7 @@ public enum AllKeys { TOOL_MENU("toolmenu", GLFW.GLFW_KEY_LEFT_ALT), ACTIVATE_TOOL("", GLFW.GLFW_KEY_LEFT_CONTROL), TOOLBELT("toolbelt", GLFW.GLFW_KEY_LEFT_ALT), - ROTATE_MENU("rotate_menu", GLFW.GLFW_KEY_B), + ROTATE_MENU("rotate_menu", GLFW.GLFW_KEY_UNKNOWN), ; diff --git a/src/main/java/com/simibubi/create/content/trains/entity/Carriage.java b/src/main/java/com/simibubi/create/content/trains/entity/Carriage.java index 5aa7fbb1f7..edbdf70d48 100644 --- a/src/main/java/com/simibubi/create/content/trains/entity/Carriage.java +++ b/src/main/java/com/simibubi/create/content/trains/entity/Carriage.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Objects; +import java.util.Optional; import java.util.Set; import java.util.UUID; import java.util.concurrent.atomic.AtomicInteger; @@ -98,6 +99,14 @@ public class Carriage { return entities.size() > 1; } + public List> getPresentDimensions() { + return entities.keySet().stream().distinct().toList(); + } + + public Optional getPositionInDimension(ResourceKey dimension) { + return Optional.ofNullable(entities.get(dimension)).map(carriage -> BlockPos.containing(carriage.positionAnchor)); + } + public void setContraption(Level level, CarriageContraption contraption) { this.storage = null; CarriageContraptionEntity entity = CarriageContraptionEntity.create(level, contraption); diff --git a/src/main/java/com/simibubi/create/content/trains/entity/Train.java b/src/main/java/com/simibubi/create/content/trains/entity/Train.java index 72fe53f5f3..caaede2a47 100644 --- a/src/main/java/com/simibubi/create/content/trains/entity/Train.java +++ b/src/main/java/com/simibubi/create/content/trains/entity/Train.java @@ -619,7 +619,7 @@ public class Train { public Pair findCollidingTrain(Level level, Vec3 start, Vec3 end, ResourceKey dimension) { Vec3 diff = end.subtract(start); double maxDistanceSqr = Math.pow(AllConfigs.server().trains.maxAssemblyLength.get(), 2.0); - + Trains: for (Train train : Create.RAILWAYS.sided(level).trains.values()) { if (train == this) continue; @@ -1246,4 +1246,19 @@ public class Train { return distance; } + public List> getPresentDimensions() { + return carriages.stream() + .flatMap((Carriage carriage) -> carriage.getPresentDimensions().stream()) + .distinct() + .toList(); + } + + public Optional getPositionInDimension(ResourceKey dimension) { + return carriages.stream() + .map(carriage -> carriage.getPositionInDimension(dimension)) + .filter(Optional::isPresent) + .map(Optional::get) + .findFirst(); + } + } diff --git a/src/main/java/com/simibubi/create/content/trains/entity/TrainStatus.java b/src/main/java/com/simibubi/create/content/trains/entity/TrainStatus.java index 1c57f23e11..9b7d75e3e0 100644 --- a/src/main/java/com/simibubi/create/content/trains/entity/TrainStatus.java +++ b/src/main/java/com/simibubi/create/content/trains/entity/TrainStatus.java @@ -1,13 +1,18 @@ package com.simibubi.create.content.trains.entity; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import java.util.stream.Stream; +import com.google.common.collect.Streams; import com.simibubi.create.foundation.utility.CreateLang; import net.createmod.catnip.utility.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.resources.ResourceKey; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; @@ -20,7 +25,7 @@ public class TrainStatus { boolean track; boolean conductor; - List queued = new ArrayList<>(); + List queued = new ArrayList<>(); public TrainStatus(Train train) { this.train = train; @@ -101,7 +106,24 @@ public class TrainStatus { } public void crash() { - displayInformation("collision", false); + Component component = + Components.literal(" - ").withStyle(ChatFormatting.GRAY) + .append( + CreateLang.translateDirect("train.status.collision").withStyle(st -> st.withColor(0xFFD3B4)) + ); + List> presentDimensions = train.getPresentDimensions(); + Stream locationComponents = presentDimensions.stream().map(key -> + Components.literal(" - ").withStyle(ChatFormatting.GRAY) + .append( + CreateLang.translateDirect( + "train.status.collision.where", + key.location(), + train.getPositionInDimension(key).get().toShortString() + ).withStyle(style -> style.withColor(0xFFD3B4)) + ) + ); + addMessage(new StatusMessage(Streams.concat(Stream.of(component), locationComponents).toArray(Component[]::new))); + } public void successfulMigration() { @@ -124,15 +146,21 @@ public class TrainStatus { if (owner instanceof Player player) { player.displayClientMessage(CreateLang.translateDirect("train.status", train.name) .withStyle(ChatFormatting.GOLD), false); - queued.forEach(c -> player.displayClientMessage(c, false)); + queued.forEach(message -> message.displayToPlayer(player)); } queued.clear(); } public void displayInformation(String key, boolean itsAGoodThing, Object... args) { - queued.add(Components.literal(" - ").withStyle(ChatFormatting.GRAY) + MutableComponent component = Components.literal(" - ").withStyle(ChatFormatting.GRAY) .append(CreateLang.translateDirect("train.status." + key, args) - .withStyle(st -> st.withColor(itsAGoodThing ? 0xD5ECC2 : 0xFFD3B4)))); + .withStyle(st -> st.withColor(itsAGoodThing ? 0xD5ECC2 : 0xFFD3B4))); + addMessage(new StatusMessage(component)); + } + + public void addMessage(StatusMessage message) { + queued.add(message); + if (queued.size() > 3) queued.remove(0); } @@ -142,4 +170,11 @@ public class TrainStatus { conductor = false; } + public record StatusMessage(Component... messages) { + public void displayToPlayer(Player player) { + Arrays.stream(messages).forEach(messages -> player.displayClientMessage(messages, false)); + } + + }; + } diff --git a/src/main/java/com/simibubi/create/infrastructure/command/AllCommands.java b/src/main/java/com/simibubi/create/infrastructure/command/AllCommands.java index 7ae3dd9335..d30753e9eb 100644 --- a/src/main/java/com/simibubi/create/infrastructure/command/AllCommands.java +++ b/src/main/java/com/simibubi/create/infrastructure/command/AllCommands.java @@ -31,10 +31,10 @@ public class AllCommands { .then(FixLightingCommand.register()) .then(DebugInfoCommand.register()) .then(HighlightCommand.register()) - .then(KillTrainCommand.register()) .then(PassengerCommand.register()) .then(CouplingCommand.register()) .then(CloneCommand.register()) + .then(TrainCommand.register()) .then(GlueCommand.register()) diff --git a/src/main/java/com/simibubi/create/infrastructure/command/DumpRailwaysCommand.java b/src/main/java/com/simibubi/create/infrastructure/command/DumpRailwaysCommand.java index 79bc8e58ca..cb9d32d2a5 100644 --- a/src/main/java/com/simibubi/create/infrastructure/command/DumpRailwaysCommand.java +++ b/src/main/java/com/simibubi/create/infrastructure/command/DumpRailwaysCommand.java @@ -23,13 +23,25 @@ import net.minecraft.network.chat.ClickEvent; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.ComponentUtils; import net.minecraft.network.chat.HoverEvent; +import net.minecraft.resources.ResourceKey; import net.minecraft.server.level.ServerLevel; import net.minecraft.util.Mth; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; public class DumpRailwaysCommand { + private static final int white = ChatFormatting.WHITE.getColor(); + private static final int blue = 0xaac8e0; + //private static final int blue = 0xD3DEDC; + private static final int darkBlue = 0x88a5b7; + //private static final int darkBlue = 0x92A9BD; + private static final int darkerBlue = 0x6b8694; + private static final int darkestBlue = 0x536b75; + private static final int bright = 0xFFEFEF; + private static final int orange = 0xFFAD60; + static ArgumentBuilder register() { return Commands.literal("trains") .requires(cs -> cs.hasPermission(2)) @@ -42,14 +54,11 @@ public class DumpRailwaysCommand { }); } + // https://www.compart.com/en/unicode/search?q=box+drawings+light#characters ┬ ├ └ ─ static void fillReport(ServerLevel level, Vec3 location, BiConsumer chat, Consumer chatRaw) { GlobalRailwayManager railways = Create.RAILWAYS; - int white = ChatFormatting.WHITE.getColor(); - int blue = 0xD3DEDC; - int darkBlue = 0x92A9BD; - int bright = 0xFFEFEF; - int orange = 0xFFAD60; + chat.accept("", white); chat.accept("-+------<< Train Summary: >>------+-", white); @@ -101,33 +110,44 @@ public class DumpRailwaysCommand { chat.accept("Nearest Trains: ", orange); chat.accept("", white); for (Train train : nearestTrains) { - chat.accept(train.id.toString() - .substring(0, 5) + ": " + train.name.getString() + ", " + train.carriages.size() + " Wagons", - bright); + chat.accept(String.format("┬%1$s: %2$s, %3$d Wagons", + train.id.toString().substring(0, 5), + train.name.getString(), + train.carriages.size() + ), bright); if (train.derailed) - chat.accept(" -> Derailed", orange); + chat.accept("├─Derailed", orange); else if (train.graph != null) - chat.accept(" -> On Track: " + train.graph.id.toString() + chat.accept("├─On Track: " + train.graph.id.toString() .substring(0, 5), blue); LivingEntity owner = train.getOwner(level); if (owner != null) - chat.accept(" -> Owned by " + owner.getName() + chat.accept("├─Owned by " + owner.getName() .getString(), blue); GlobalStation currentStation = train.getCurrentStation(); if (currentStation != null) { - chat.accept(" -> Waiting at: " + currentStation.name, blue); + chat.accept("├─Waiting at: " + currentStation.name, blue); } else if (train.navigation.destination != null) - chat.accept(" -> Travelling to " + train.navigation.destination.name + " (" + chat.accept("├─Travelling to " + train.navigation.destination.name + " (" + Mth.floor(train.navigation.distanceToDestination) + "m away)", darkBlue); ScheduleRuntime runtime = train.runtime; if (runtime.getSchedule() != null) { - chat.accept(" -> Schedule, Entry " + runtime.currentEntry + ", " + chat.accept("├─Schedule, Entry " + runtime.currentEntry + ", " + (runtime.paused ? "Paused" : runtime.state.name() .replaceAll("_", " ")), runtime.paused ? darkBlue : blue); } else - chat.accept(" -> Idle, No Schedule", darkBlue); + chat.accept("├─Idle, No Schedule", darkBlue); + + List> presentDimensions = train.getPresentDimensions(); + if (presentDimensions.size() > 1) + chat.accept("├─Travelling between Dimensions:", darkerBlue); + presentDimensions.forEach(key -> + chat.accept("├─In %1$s near [%2$s]".formatted(key.location(), train.getPositionInDimension(key).get().toShortString()), darkerBlue) + ); + chatRaw.accept(createTeleportButton(train)); + chatRaw.accept(createDeleteButton(train)); chat.accept("", white); } @@ -141,13 +161,27 @@ public class DumpRailwaysCommand { } private static Component createDeleteButton(Train train) { - return ComponentUtils.wrapInSquareBrackets((Components.literal("Remove")).withStyle((p_180514_) -> { - return p_180514_.withColor(0xFFAD60) - .withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/c killTrain " + train.id.toString())) - .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, - Components.literal("Click to remove ").append(train.name))) - .withInsertion("/c killTrain " + train.id.toString()); - })); + return Components.literal("└─").withStyle(style -> style.withColor(blue)).append( + ComponentUtils.wrapInSquareBrackets( + Components.literal("Remove").withStyle(style -> style.withColor(orange)) + ).withStyle(style -> style + .withColor(blue) + .withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/c train kill " + train.id.toString())) + .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Components.literal("Click to remove ").append(train.name))) + ) + ); + } + + private static Component createTeleportButton(Train train) { + return Components.literal("├─").withStyle(style -> style.withColor(darkBlue)).append( + ComponentUtils.wrapInSquareBrackets( + Components.literal("Teleport").withStyle(style -> style.withColor(orange)) + ).withStyle(style -> style + .withColor(darkBlue) + .withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/c train tp " + train.id.toString())) + .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Components.literal("Click to teleport to ").append(train.name))) + ) + ); } } diff --git a/src/main/java/com/simibubi/create/infrastructure/command/KillTrainCommand.java b/src/main/java/com/simibubi/create/infrastructure/command/KillTrainCommand.java deleted file mode 100644 index 1b0debe2dc..0000000000 --- a/src/main/java/com/simibubi/create/infrastructure/command/KillTrainCommand.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.simibubi.create.infrastructure.command; - -import java.util.UUID; - -import com.mojang.brigadier.builder.ArgumentBuilder; -import com.simibubi.create.Create; -import com.simibubi.create.content.trains.entity.Train; - -import net.createmod.catnip.utility.lang.Components; -import net.minecraft.commands.CommandSourceStack; -import net.minecraft.commands.Commands; -import net.minecraft.commands.arguments.UuidArgument; - -public class KillTrainCommand { - - static ArgumentBuilder register() { - return Commands.literal("killTrain") - .requires(cs -> cs.hasPermission(2)) - .then(Commands.argument("train", UuidArgument.uuid()) - .executes(ctx -> { - CommandSourceStack source = ctx.getSource(); - run(source, UuidArgument.getUuid(ctx, "train")); - return 1; - })); - } - - private static void run(CommandSourceStack source, UUID argument) { - Train train = Create.RAILWAYS.trains.get(argument); - if (train == null) { - source.sendFailure(Components.literal("No Train with id " + argument.toString() - .substring(0, 5) + "[...] was found")); - return; - } - - train.invalid = true; - source.sendSuccess(() -> Components.literal("Train '").append(train.name) - .append("' removed successfully"), true); - } - -} diff --git a/src/main/java/com/simibubi/create/infrastructure/command/TrainCommand.java b/src/main/java/com/simibubi/create/infrastructure/command/TrainCommand.java new file mode 100644 index 0000000000..a474586001 --- /dev/null +++ b/src/main/java/com/simibubi/create/infrastructure/command/TrainCommand.java @@ -0,0 +1,102 @@ +package com.simibubi.create.infrastructure.command; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +import com.mojang.brigadier.Command; +import com.mojang.brigadier.builder.ArgumentBuilder; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.simibubi.create.Create; +import com.simibubi.create.content.trains.entity.Train; + +import net.createmod.catnip.utility.lang.Components; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.Commands; +import net.minecraft.commands.arguments.UuidArgument; +import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceKey; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.level.GameType; +import net.minecraft.world.level.Level; + +public class TrainCommand { + + static ArgumentBuilder register() { + return Commands.literal("train") + .requires(cs -> cs.hasPermission(2)) + .then(Commands.literal("remove") + .then(Commands.argument("train", UuidArgument.uuid()) + .executes(ctx -> runDelete(ctx.getSource(), UuidArgument.getUuid(ctx, "train"))) + ) + ).then(Commands.literal("tp") + .then(Commands.argument("train", UuidArgument.uuid()) + .requires(CommandSourceStack::isPlayer) + .executes(ctx -> runTeleport(ctx.getSource(), UuidArgument.getUuid(ctx, "train"))) + ) + ); + } + + private static int runDelete(CommandSourceStack source, UUID argument) { + Train train = Create.RAILWAYS.trains.get(argument); + if (train == null) { + source.sendFailure(Components.literal("No Train with id " + argument.toString() + .substring(0, 5) + "[...] was found")); + return 0; + } + + train.invalid = true; + source.sendSuccess(() -> Components.literal("Train '").append(train.name) + .append("' removed successfully"), true); + return Command.SINGLE_SUCCESS; + } + + private static int runTeleport(CommandSourceStack source, UUID argument) throws CommandSyntaxException { + ServerPlayer serverPlayer = source.getPlayerOrException(); + GameType gameMode = serverPlayer.gameMode.getGameModeForPlayer(); + if (gameMode != GameType.CREATIVE && gameMode != GameType.SPECTATOR) { + source.sendFailure(Components.literal("Can only teleport to train when in Creative or Spectator Mode!")); + return 0; + } + + Train train = Create.RAILWAYS.trains.get(argument); + if (train == null) { + source.sendFailure(Components.literal("No Train with id " + argument.toString() + .substring(0, 5) + "[...] was found")); + return 0; + } + + List> presentDimensions = train.getPresentDimensions(); + + if (presentDimensions.isEmpty()) { + source.sendFailure(Components.literal("Unable to teleport to Train. No valid location found")); + return 0; + } + + ResourceKey levelKey = presentDimensions.get(0); + ServerLevel serverLevel = serverPlayer.getServer().getLevel(levelKey); + Optional positionInDimension = train.getPositionInDimension(levelKey); + + if (positionInDimension.isEmpty() || serverLevel == null) { + source.sendFailure(Components.literal("Unable to teleport to Train. No valid location found")); + return 0; + } + + BlockPos pos = positionInDimension.get(); + + serverPlayer.teleportTo( + serverLevel, + pos.getX(), + pos.getY() + 5, + pos.getZ(), + serverPlayer.getViewYRot(0), + serverPlayer.getViewXRot(0) + ); + + source.sendSuccess(() -> Components.literal("Teleported to Train '").append(train.name) + .append("' successfully"), true); + return Command.SINGLE_SUCCESS; + } + +} diff --git a/src/main/resources/assets/create/lang/default/interface.json b/src/main/resources/assets/create/lang/default/interface.json index c0ca2b6a88..d802761e1a 100644 --- a/src/main/resources/assets/create/lang/default/interface.json +++ b/src/main/resources/assets/create/lang/default/interface.json @@ -178,7 +178,7 @@ "create.terrainzapper.leftClickToSet": "Left-Click a Block to set Material", "create.large_water_wheel.not_enough_space": "Clear Blocks for Placement", - + "create.minecart_coupling.two_couplings_max": "Minecarts cannot have more than two couplings each", "create.minecart_coupling.unloaded": "Parts of your train seem to be in unloaded chunks", "create.minecart_coupling.no_loops": "Couplings cannot form a loop", @@ -218,7 +218,7 @@ "create.logistics.fluid_filter": "Fluid Filter", "create.logistics.firstFrequency": "Frequency #1", "create.logistics.secondFrequency": "Frequency #2", - + "create.logistics.filter.click_to_set": "Click with item to set", "create.logistics.filter.click_to_replace": "Click with item to replace", "create.logistics.filter.hold_to_set_amount": "Click and hold for amount", @@ -229,26 +229,26 @@ "create.logistics.filter.up_to": "Up to", "create.logistics.filter.exactly": "Exactly", "create.logistics.filter.requires_item_in_inventory": "Requires %1$s item in Inventory", - + "create.logistics.creative_crate.supply": "Infinite Supply", "create.logistics.train_observer.cargo_filter": "Cargo Filter", - + "create.kinetics.creative_motor.rotation_speed": "Generated Speed in RPM", "create.kinetics.speed_controller.rotation_speed": "Targeted Speed in RPM", "create.kinetics.valve_handle.rotated_angle": "Rotation when used", - + "create.logistics.redstone_interval": "Redstone Interval", - + "create.contraptions.contoller.target": "Targeted Component", "create.contraptions.mechanical_roller.pave_material": "Paving Material", - + "create.contraptions.chassis.radius": "Radius when Sticky", "create.contraptions.chassis.range": "Range of Sticky Sides", "create.contraptions.chassis.distance": "Distance", - + "create.gui.value_settings.hold_to_edit": "Click and hold to edit", "create.gui.value_settings.release_to_confirm": "Release %1$s to Confirm", - + "create.gui.goggles.generator_stats": "Generator Stats:", "create.gui.goggles.kinetic_stats": "Kinetic Stats:", "create.gui.goggles.at_current_speed": "at current speed", @@ -308,7 +308,7 @@ "create.gui.sequenced_gearshift.speed.back_fast": "Double speed, Reversed", "create.gui.clipboard.erase_checked": "Erase checked items", - + "create.clipboard.actions": "Clipboard Actions", "create.clipboard.to_copy": "%1$s to Copy settings", "create.clipboard.to_paste": "%1$s to Paste settings", @@ -846,6 +846,7 @@ "create.train.status": " Information about Train: %1$s", "create.train.status.back_on_track": "Train is back on Track", "create.train.status.collision": "Collision with other Train", + "create.train.status.collision.where": "In %1$s near [%2$s]", "create.train.status.end_of_track": "A Carriage has reached the end of its Track", "create.train.status.double_portal": "A Carriage cannot enter a portal whilst leaving another", "create.train.status.coupling_stress": "Forced stop due to Stress on Couplings", @@ -871,7 +872,7 @@ "create.contraption.controls.actor_toggle.on": "On", "create.contraption.controls.actor_toggle.off": "Off", "create.contraption.controls.floor_unreachable": "Unreachable", - + "create.contraption.door_control": "Onboard Door Control", "create.contraption.door_control.all": "Open All Doors", "create.contraption.door_control.all.short": "Open All", From 65ba241e22b0ad81d7ee8f0ba86b80d1d587e3b9 Mon Sep 17 00:00:00 2001 From: zelophed Date: Fri, 1 Mar 2024 13:10:14 +0100 Subject: [PATCH 031/515] no need to fight - fixed some commonly visible z-fighting between hoppers and deployers, presses and mixers --- .../assets/create/models/block/deployer/pole.json | 10 +++++----- .../create/models/block/mechanical_mixer/pole.json | 10 +++++----- .../create/models/block/mechanical_press/head.json | 14 +++++++------- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/main/resources/assets/create/models/block/deployer/pole.json b/src/main/resources/assets/create/models/block/deployer/pole.json index 1da1b7ffc1..e060a522cb 100644 --- a/src/main/resources/assets/create/models/block/deployer/pole.json +++ b/src/main/resources/assets/create/models/block/deployer/pole.json @@ -8,8 +8,8 @@ "elements": [ { "name": "Pole1Core", - "from": [6, 6, 4], - "to": [10, 10, 12], + "from": [5.995, 5.995, 4], + "to": [10.005, 10.005, 12], "rotation": {"angle": 0, "axis": "z", "origin": [8, 8, 10]}, "faces": { "east": {"uv": [1, 6, 5, 14], "rotation": 90, "texture": "#mechanical_press_pole"}, @@ -20,8 +20,8 @@ }, { "name": "Pole2Core", - "from": [6, 6, -9], - "to": [10, 10, 4], + "from": [5.995, 5.995, -9], + "to": [10.005, 10.005, 4], "rotation": {"angle": 0, "axis": "z", "origin": [8, 8, 10]}, "faces": { "north": {"uv": [11, 6, 15, 10], "rotation": 270, "texture": "#mechanical_press_pole"}, @@ -39,4 +39,4 @@ "children": [0, 1] } ] -} \ No newline at end of file +} diff --git a/src/main/resources/assets/create/models/block/mechanical_mixer/pole.json b/src/main/resources/assets/create/models/block/mechanical_mixer/pole.json index 28a7bc3fe5..2c34251e94 100644 --- a/src/main/resources/assets/create/models/block/mechanical_mixer/pole.json +++ b/src/main/resources/assets/create/models/block/mechanical_mixer/pole.json @@ -24,8 +24,8 @@ }, { "name": "Pole1Core", - "from": [6, 9, 6], - "to": [10, 19, 10], + "from": [5.995, 9, 6], + "to": [10.005, 19, 10], "rotation": {"angle": 0, "axis": "y", "origin": [8, 16, 8]}, "faces": { "east": {"uv": [6, 6, 10, 16], "texture": "#mechanical_press_pole"}, @@ -61,8 +61,8 @@ }, { "name": "Pole2Core", - "from": [6, 19, 6], - "to": [10, 32, 10], + "from": [5.995, 19, 6], + "to": [10.005, 32, 10], "rotation": {"angle": 0, "axis": "y", "origin": [8, 13, 8]}, "faces": { "east": {"uv": [6, 0, 10, 13], "texture": "#mechanical_press_pole"}, @@ -97,4 +97,4 @@ } } ] -} \ No newline at end of file +} diff --git a/src/main/resources/assets/create/models/block/mechanical_press/head.json b/src/main/resources/assets/create/models/block/mechanical_press/head.json index 43b0ebca31..ff518b2503 100644 --- a/src/main/resources/assets/create/models/block/mechanical_press/head.json +++ b/src/main/resources/assets/create/models/block/mechanical_press/head.json @@ -7,8 +7,8 @@ "elements": [ { "name": "Pole1Core", - "from": [5.95, 4, 6], - "to": [10.05, 14, 10], + "from": [5.995, 4, 6], + "to": [10.005, 14, 10], "faces": { "east": {"uv": [6, 6, 10, 16], "texture": "#mechanical_press_pole"}, "west": {"uv": [6, 6, 10, 16], "texture": "#mechanical_press_pole"} @@ -16,8 +16,8 @@ }, { "name": "Pole2Core", - "from": [5.95, 14, 6], - "to": [10.05, 27, 10], + "from": [5.995, 14, 6], + "to": [10.005, 26.995, 10], "faces": { "east": {"uv": [6, 0, 10, 13], "texture": "#mechanical_press_pole"}, "west": {"uv": [6, 0, 10, 13], "texture": "#mechanical_press_pole"}, @@ -49,7 +49,7 @@ { "name": "Pole2Side", "from": [5, 14, 10], - "to": [11, 27, 11], + "to": [11, 26.995, 11], "faces": { "north": {"uv": [0, 0, 6, 13], "texture": "#mechanical_press_pole"}, "east": {"uv": [0, 0, 1, 13], "texture": "#mechanical_press_pole"}, @@ -61,7 +61,7 @@ { "name": "Pole2Side", "from": [5, 14, 5], - "to": [11, 27, 6], + "to": [11, 26.995, 6], "faces": { "north": {"uv": [0, 0, 6, 13], "texture": "#mechanical_press_pole"}, "east": {"uv": [0, 0, 1, 13], "texture": "#mechanical_press_pole"}, @@ -84,4 +84,4 @@ } } ] -} \ No newline at end of file +} From 31ac4436f130eaecb42017f5a487bdfd9147c64e Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Tue, 4 Jun 2024 11:39:26 +0200 Subject: [PATCH 032/515] Not a pipe - Added Chain Wheels and Package Ports --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 16 +- .../assets/create/blockstates/chain_lift.json | 7 + .../create/blockstates/package_port.json | 7 + .../resources/assets/create/lang/en_ud.json | 2 + .../resources/assets/create/lang/en_us.json | 2 + .../assets/create/models/item/chain_lift.json | 3 + .../create/models/item/package_port.json | 3 + .../create/loot_tables/blocks/chain_lift.json | 21 + .../loot_tables/blocks/package_port.json | 21 + .../minecraft/tags/blocks/mineable/axe.json | 1 + .../tags/blocks/mineable/pickaxe.json | 2 + .../simibubi/create/AllBlockEntityTypes.java | 17 + .../java/com/simibubi/create/AllBlocks.java | 27 + .../java/com/simibubi/create/AllPackets.java | 8 + .../com/simibubi/create/AllPartialModels.java | 5 + .../kinetics/chainLift/ChainLiftBlock.java | 101 ++++ .../chainLift/ChainLiftBlockEntity.java | 480 ++++++++++++++++++ .../chainLift/ChainLiftConnectionHandler.java | 78 +++ .../chainLift/ChainLiftConnectionPacket.java | 56 ++ .../ChainLiftInteractionHandler.java | 118 +++++ .../kinetics/chainLift/ChainLiftPackage.java | 105 ++++ .../kinetics/chainLift/ChainLiftRenderer.java | 150 ++++++ .../chainLift/ChainLiftRidingHandler.java | 154 ++++++ .../chainLift/ChainLiftRidingPacket.java | 35 ++ .../chainLift/ChainLiftRoutingTable.java | 97 ++++ .../kinetics/chainLift/ChainLiftShape.java | 158 ++++++ .../content/logistics/box/PackageEntity.java | 11 +- .../content/logistics/box/PackageItem.java | 5 +- .../packagePort/PackagePortBlock.java | 26 + .../packagePort/PackagePortBlockEntity.java | 92 ++++ .../PackagePortFilterSlotPositioning.java | 33 ++ .../packagePort/PackagePortInventory.java | 49 ++ .../packagePort/PackagePortItem.java | 30 ++ .../PackagePortPlacementPacket.java | 80 +++ .../packagePort/PackagePortRenderer.java | 40 ++ .../packagePort/PackagePortTarget.java | 183 +++++++ .../PackagePortTargetSelectionHandler.java | 22 + .../foundation/events/ClientEvents.java | 5 +- .../create/foundation/events/InputEvents.java | 4 + .../create/models/block/chain_lift/block.json | 226 +++++++++ .../create/models/block/chain_lift/guard.json | 62 +++ .../create/models/block/chain_lift/item.json | 362 +++++++++++++ .../models/block/package_port/block.json | 22 + .../create/models/block/package_port/cap.json | 21 + .../models/block/package_port/item.json | 78 +++ .../models/block/package_port/tube.json | 24 + .../create/textures/block/order_collector.png | Bin 518 -> 518 bytes .../create/textures/block/package_port.png | Bin 0 -> 263 bytes 48 files changed, 3040 insertions(+), 9 deletions(-) create mode 100644 src/generated/resources/assets/create/blockstates/chain_lift.json create mode 100644 src/generated/resources/assets/create/blockstates/package_port.json create mode 100644 src/generated/resources/assets/create/models/item/chain_lift.json create mode 100644 src/generated/resources/assets/create/models/item/package_port.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/chain_lift.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/package_port.json create mode 100644 src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftBlock.java create mode 100644 src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftBlockEntity.java create mode 100644 src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftConnectionHandler.java create mode 100644 src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftConnectionPacket.java create mode 100644 src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftInteractionHandler.java create mode 100644 src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftPackage.java create mode 100644 src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftRenderer.java create mode 100644 src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftRidingHandler.java create mode 100644 src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftRidingPacket.java create mode 100644 src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftRoutingTable.java create mode 100644 src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftShape.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlock.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortFilterSlotPositioning.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortInventory.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortItem.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortPlacementPacket.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortRenderer.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTarget.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTargetSelectionHandler.java create mode 100644 src/main/resources/assets/create/models/block/chain_lift/block.json create mode 100644 src/main/resources/assets/create/models/block/chain_lift/guard.json create mode 100644 src/main/resources/assets/create/models/block/chain_lift/item.json create mode 100644 src/main/resources/assets/create/models/block/package_port/block.json create mode 100644 src/main/resources/assets/create/models/block/package_port/cap.json create mode 100644 src/main/resources/assets/create/models/block/package_port/item.json create mode 100644 src/main/resources/assets/create/models/block/package_port/tube.json create mode 100644 src/main/resources/assets/create/textures/block/package_port.png diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 59d422689f..345a189157 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-02-09T22:58:24.5307206 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-05-23T17:42:17.3367493 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -52,6 +52,7 @@ debf33346bf410216f21082e1e8d07aa6250b84c assets/create/blockstates/brown_nixie_t 440b29e1dffa4374ddc1aed444bff18a485bc1cb assets/create/blockstates/brown_valve_handle.json 2064534de4791b339fdcd4ef3a8129a2e233ec50 assets/create/blockstates/calcite_pillar.json 060c957b28afed9f4e0954cbef7e80cbf4b99f58 assets/create/blockstates/cart_assembler.json +01e41e44d1515fa6efd024764084866830d4412a assets/create/blockstates/chain_lift.json c7eca70054241944171b1d4ffcba0376b071ec62 assets/create/blockstates/chocolate.json 9eb989b0a0545af9efd052d1f127b2ec28a972d1 assets/create/blockstates/chute.json b5170d754ce5f07ea2b4646eb07c099c50bae249 assets/create/blockstates/clipboard.json @@ -349,6 +350,7 @@ ac536ae742c12e97bfd0b2483c87ff29f3935eaf assets/create/blockstates/oxidized_copp 5e634cfb9abb06d8b29f39d751fc56b28ea5a9cd assets/create/blockstates/oxidized_copper_tile_stairs.json 9cb7470bcf22eb84f296730b9727f5c01c174e22 assets/create/blockstates/packager.json 0f204afc6712a08d2db84bb07a0a49927f3127a6 assets/create/blockstates/packager_link.json +67b8514a21363257a514f870633b7b1cff16b147 assets/create/blockstates/package_port.json 36742cc6ce052ead143366d31b11e828a525c1b8 assets/create/blockstates/peculiar_bell.json 53d102e706d53cb2c0dbc0bc11da828084a43519 assets/create/blockstates/pink_nixie_tube.json 213da5c04a33ae8ae7c0a4dec9844bbb6d670e33 assets/create/blockstates/pink_sail.json @@ -589,8 +591,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -d720e39c164625704769a422438f0d48a9088c4e assets/create/lang/en_ud.json -00171a3b1c176865a31a8b18297719f7ee610e21 assets/create/lang/en_us.json +a205066e3861e46a4c39f5f94077eb66f1adad8d assets/create/lang/en_ud.json +d867862b6f18493c9a7ac21f9c36e7db42d5d117 assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -1726,6 +1728,7 @@ fce64539b36fc8a5ffa39d7a3f73765818437cbf assets/create/models/item/brown_seat.js 1db479848369140bb913ba09f3f1d994e4ac864c assets/create/models/item/builders_tea.json f5ff4e2ed2ea2e43b6d02f6a95ba02b2e4b611dc assets/create/models/item/calcite_pillar.json 1cdb2b8801551c1540bb9b2a9cc3d725a2b433e7 assets/create/models/item/cart_assembler.json +9a29b1b49f3afd2ee63828b00b94ebb1ff2dba84 assets/create/models/item/chain_lift.json a197d08618f4035182c91a6b16031eb681ab8a7c assets/create/models/item/chest_minecart_contraption.json 293cfa8b1073f8641a2c623b73a90907576c36ed assets/create/models/item/chocolate_bucket.json 77654cbd16cdfa95181ea3f85fcfa3cd352b69fd assets/create/models/item/chocolate_glazed_berries.json @@ -2045,6 +2048,7 @@ ef2fe68d407a03bf1ed8f2d2f3e7323777d061bb assets/create/models/item/oxidized_copp b21a1f3ee7de3e17f69d27fd13ae6b23b62aa22c assets/create/models/item/packager.json a8538df19e47fe37401c9fbedbb867b5d612a51b assets/create/models/item/packager_link.json 5b974e55caffdbfc2156eb8b59dd99db12243bd3 assets/create/models/item/package_filter.json +f29585eba4ab07cb69faaaba3359b09032f2c638 assets/create/models/item/package_port.json 76aeceb41bb7df873dbafe1bd5e26deb24abf93f assets/create/models/item/peculiar_bell.json df13d4281dc45041ecd93504d45daef61d070581 assets/create/models/item/pink_seat.json 842afb2a345dbaba857e90f7dffa724841ef7b2d assets/create/models/item/pink_toolbox.json @@ -3006,6 +3010,7 @@ d391cff5b741fd6ddf5b6fa64e05526eb3a9f0d9 data/create/loot_tables/blocks/brown_ni 7c7cf4c30786f6e0a699e2b3f9120343e53107f4 data/create/loot_tables/blocks/brown_valve_handle.json 06d1c478e4236210aa12b5911691868fef33bb5f data/create/loot_tables/blocks/calcite_pillar.json 515c839deea520b07b03f7ba65c4a7b22fdf5ba3 data/create/loot_tables/blocks/cart_assembler.json +73cc13242e9765f44c756e92fe911beba8820467 data/create/loot_tables/blocks/chain_lift.json fb4877d45df15be1a74378ab28f23fbf9d0657ef data/create/loot_tables/blocks/chute.json ace9255cbdd1af5e5068916d2a6bed2f861f81f1 data/create/loot_tables/blocks/clipboard.json bfd871acdde6c239098ead188a5aad7636d11bc0 data/create/loot_tables/blocks/clockwork_bearing.json @@ -3300,6 +3305,7 @@ f47a01824093455030fca66e7b8a39bcfc61d219 data/create/loot_tables/blocks/oxidized d599ef03d1b69e4367ec0dea78f52c1964c99f9b data/create/loot_tables/blocks/oxidized_copper_tile_stairs.json ab8cee7abd7dd92428bf7d8f0f5edd35082401a4 data/create/loot_tables/blocks/packager.json e5df1b8ead9e575ed06f2040a7c9cc72c7a71b49 data/create/loot_tables/blocks/packager_link.json +b4f54d54d561d8c6997546f689f12453e01ae480 data/create/loot_tables/blocks/package_port.json 58bd9fe9d6706998bfbda3b077cfd0a740972091 data/create/loot_tables/blocks/peculiar_bell.json 4d7724df6fefee4512c4f7886d0e103d1dc39510 data/create/loot_tables/blocks/pink_nixie_tube.json 85811771fbc36f645fdb9f510639715399503c99 data/create/loot_tables/blocks/pink_sail.json @@ -4301,8 +4307,8 @@ c741ba83b562ae3459d7c4f2db69537f549ea411 data/forge/tags/items/tools/wrench.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/dripstone_replaceable_blocks.json e3321ff14704c031a2c16953b7e391f4f24dd70b data/minecraft/tags/blocks/impermeable.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/lush_ground_replaceable.json -76f109bda7d27fa1ebc8cbe6f7eb930e3cacd329 data/minecraft/tags/blocks/mineable/axe.json -73c0b71e13af2f2db15684075a96b0884a3ccab1 data/minecraft/tags/blocks/mineable/pickaxe.json +0d48e55143607d9de428bd357fc7f4b8c4ce5cba data/minecraft/tags/blocks/mineable/axe.json +211a870c1cc6f2b2867c8462a79ae6cbe5cc9732 data/minecraft/tags/blocks/mineable/pickaxe.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/moss_replaceable.json 0c13aae0eeb99e89febe8dbe5e002af2ff843a9e data/minecraft/tags/blocks/needs_iron_tool.json 3cb2a92cbdf32ed5978f740dc378d363306c3e84 data/minecraft/tags/blocks/needs_stone_tool.json diff --git a/src/generated/resources/assets/create/blockstates/chain_lift.json b/src/generated/resources/assets/create/blockstates/chain_lift.json new file mode 100644 index 0000000000..198e057b63 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/chain_lift.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/chain_lift/block" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/package_port.json b/src/generated/resources/assets/create/blockstates/package_port.json new file mode 100644 index 0000000000..bc1cfe6bea --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/package_port.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/package_port/block" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 6f31bdd8c6..4aa4407dd5 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -238,6 +238,7 @@ "block.create.brown_valve_handle": "ǝןpuɐH ǝʌןɐΛ uʍoɹᗺ", "block.create.calcite_pillar": "ɹɐןןıԀ ǝʇıɔןɐƆ", "block.create.cart_assembler": "ɹǝןqɯǝssⱯ ʇɹɐƆ", + "block.create.chain_lift": "ʇɟıꞀ uıɐɥƆ", "block.create.chocolate": "ǝʇɐןoɔoɥƆ", "block.create.chute": "ǝʇnɥƆ", "block.create.clipboard": "pɹɐoqdıןƆ", @@ -561,6 +562,7 @@ "block.create.oxidized_copper_tile_slab": "qɐןS ǝןı⟘ ɹǝddoƆ pǝzıpıxO", "block.create.oxidized_copper_tile_stairs": "sɹıɐʇS ǝןı⟘ ɹǝddoƆ pǝzıpıxO", "block.create.oxidized_copper_tiles": "sǝןı⟘ ɹǝddoƆ pǝzıpıxO", + "block.create.package_port": "ʇɹoԀ ǝbɐʞɔɐԀ", "block.create.packager": "ɹǝbɐʞɔɐԀ", "block.create.packager_link": "ʞuıꞀ ɹǝbɐʞɔɐԀ", "block.create.peculiar_bell": "ןןǝᗺ ɹɐıןnɔǝԀ", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 3327c1285f..c63d778804 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -238,6 +238,7 @@ "block.create.brown_valve_handle": "Brown Valve Handle", "block.create.calcite_pillar": "Calcite Pillar", "block.create.cart_assembler": "Cart Assembler", + "block.create.chain_lift": "Chain Lift", "block.create.chocolate": "Chocolate", "block.create.chute": "Chute", "block.create.clipboard": "Clipboard", @@ -561,6 +562,7 @@ "block.create.oxidized_copper_tile_slab": "Oxidized Copper Tile Slab", "block.create.oxidized_copper_tile_stairs": "Oxidized Copper Tile Stairs", "block.create.oxidized_copper_tiles": "Oxidized Copper Tiles", + "block.create.package_port": "Package Port", "block.create.packager": "Packager", "block.create.packager_link": "Packager Link", "block.create.peculiar_bell": "Peculiar Bell", diff --git a/src/generated/resources/assets/create/models/item/chain_lift.json b/src/generated/resources/assets/create/models/item/chain_lift.json new file mode 100644 index 0000000000..b21edebe7b --- /dev/null +++ b/src/generated/resources/assets/create/models/item/chain_lift.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/chain_lift/item" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/package_port.json b/src/generated/resources/assets/create/models/item/package_port.json new file mode 100644 index 0000000000..c814579a62 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/package_port.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/package_port/item" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/chain_lift.json b/src/generated/resources/data/create/loot_tables/blocks/chain_lift.json new file mode 100644 index 0000000000..f3799d002d --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/chain_lift.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:chain_lift" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/chain_lift" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/package_port.json b/src/generated/resources/data/create/loot_tables/blocks/package_port.json new file mode 100644 index 0000000000..f7b4121150 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/package_port.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:package_port" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/package_port" +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json b/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json index f58a51663e..6e236adc59 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json @@ -15,6 +15,7 @@ "create:encased_chain_drive", "create:adjustable_chain_gearshift", "create:belt", + "create:chain_lift", "create:water_wheel", "create:large_water_wheel", "create:water_wheel_structure", diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json index d4cd84f164..fd573f0110 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json @@ -17,6 +17,7 @@ "create:encased_chain_drive", "create:adjustable_chain_gearshift", "create:belt", + "create:chain_lift", "create:creative_motor", "create:water_wheel", "create:large_water_wheel", @@ -122,6 +123,7 @@ "create:controls", "create:item_vault", "create:packager", + "create:package_port", "create:packager_link", "create:stock_ticker", "create:order_collector", diff --git a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java index c4536b25e1..3293727a37 100644 --- a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java +++ b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java @@ -83,6 +83,8 @@ import com.simibubi.create.content.kinetics.belt.BeltBlockEntity; import com.simibubi.create.content.kinetics.belt.BeltInstance; import com.simibubi.create.content.kinetics.belt.BeltRenderer; import com.simibubi.create.content.kinetics.chainDrive.ChainGearshiftBlockEntity; +import com.simibubi.create.content.kinetics.chainLift.ChainLiftBlockEntity; +import com.simibubi.create.content.kinetics.chainLift.ChainLiftRenderer; import com.simibubi.create.content.kinetics.clock.CuckooClockBlockEntity; import com.simibubi.create.content.kinetics.clock.CuckooClockRenderer; import com.simibubi.create.content.kinetics.crafter.MechanicalCrafterBlockEntity; @@ -169,6 +171,8 @@ import com.simibubi.create.content.logistics.funnel.FunnelInstance; import com.simibubi.create.content.logistics.funnel.FunnelRenderer; import com.simibubi.create.content.logistics.orderCollector.OrderCollectorBlockEntity; import com.simibubi.create.content.logistics.orderCollector.OrderCollectorRenderer; +import com.simibubi.create.content.logistics.packagePort.PackagePortBlockEntity; +import com.simibubi.create.content.logistics.packagePort.PackagePortRenderer; import com.simibubi.create.content.logistics.packager.PackagerBlockEntity; import com.simibubi.create.content.logistics.packager.PackagerRenderer; import com.simibubi.create.content.logistics.packagerLink.PackagerLinkBlockEntity; @@ -357,6 +361,13 @@ public class AllBlockEntityTypes { .validBlocks(AllBlocks.GANTRY_CARRIAGE) .renderer(() -> GantryCarriageRenderer::new) .register(); + + public static final BlockEntityEntry CHAIN_LIFT = REGISTRATE + .blockEntity("chain_lift", ChainLiftBlockEntity::new) + .instance(() -> ShaftInstance::new) + .validBlocks(AllBlocks.CHAIN_LIFT) + .renderer(() -> ChainLiftRenderer::new) + .register(); public static final BlockEntityEntry MECHANICAL_PUMP = REGISTRATE .blockEntity("mechanical_pump", PumpBlockEntity::new) @@ -476,6 +487,12 @@ public class AllBlockEntityTypes { .renderer(() -> PackagerRenderer::new) .register(); + public static final BlockEntityEntry PACKAGE_PORT = REGISTRATE + .blockEntity("package_port", PackagePortBlockEntity::new) + .validBlocks(AllBlocks.PACKAGE_PORT) + .renderer(() -> PackagePortRenderer::new) + .register(); + public static final BlockEntityEntry PACKAGER_LINK = REGISTRATE .blockEntity("packager_link", PackagerLinkBlockEntity::new) .validBlocks(AllBlocks.PACKAGER_LINK) diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 9b0c6ff3d9..cd97d1a271 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -109,6 +109,7 @@ import com.simibubi.create.content.kinetics.belt.BeltModel; import com.simibubi.create.content.kinetics.chainDrive.ChainDriveBlock; import com.simibubi.create.content.kinetics.chainDrive.ChainDriveGenerator; import com.simibubi.create.content.kinetics.chainDrive.ChainGearshiftBlock; +import com.simibubi.create.content.kinetics.chainLift.ChainLiftBlock; import com.simibubi.create.content.kinetics.clock.CuckooClockBlock; import com.simibubi.create.content.kinetics.crafter.CrafterCTBehaviour; import com.simibubi.create.content.kinetics.crafter.MechanicalCrafterBlock; @@ -173,6 +174,8 @@ import com.simibubi.create.content.logistics.funnel.FunnelGenerator; import com.simibubi.create.content.logistics.funnel.FunnelItem; import com.simibubi.create.content.logistics.funnel.FunnelMovementBehaviour; import com.simibubi.create.content.logistics.orderCollector.OrderCollectorBlock; +import com.simibubi.create.content.logistics.packagePort.PackagePortBlock; +import com.simibubi.create.content.logistics.packagePort.PackagePortItem; import com.simibubi.create.content.logistics.packager.PackagerBlock; import com.simibubi.create.content.logistics.packager.PackagerGenerator; import com.simibubi.create.content.logistics.packagerLink.PackagerLinkBlock; @@ -522,6 +525,17 @@ public class AllBlocks { .onRegister(CreateRegistrate.blockModel(() -> BeltModel::new)) .register(); + public static final BlockEntry CHAIN_LIFT = + REGISTRATE.block("chain_lift", ChainLiftBlock::new) + .initialProperties(SharedProperties::stone) + .properties(p -> p.noOcclusion().mapColor(MapColor.PODZOL)) + .transform(axeOrPickaxe()) + .transform(BlockStressDefaults.setNoImpact()) + .blockstate((c, p) -> p.simpleBlock(c.getEntry(), AssetLookup.partialBaseModel(c, p))) + .item() + .transform(customItemModel()) + .register(); + public static final BlockEntry CREATIVE_MOTOR = REGISTRATE.block("creative_motor", CreativeMotorBlock::new) .initialProperties(SharedProperties::stone) @@ -1662,6 +1676,19 @@ public class AllBlocks { .model(AssetLookup::customItemModel) .build() .register(); + + public static final BlockEntry PACKAGE_PORT = REGISTRATE.block("package_port", PackagePortBlock::new) + .initialProperties(SharedProperties::softMetal) + .properties(p -> p.noOcclusion()) + .properties(p -> p.mapColor(MapColor.TERRACOTTA_BLUE) + .sound(SoundType.NETHERITE_BLOCK)) + .transform(pickaxeOnly()) + .addLayer(() -> RenderType::cutoutMipped) + .blockstate((c, p) -> p.simpleBlock(c.getEntry(), AssetLookup.partialBaseModel(c, p))) + .item(PackagePortItem::new) + .model(AssetLookup::customItemModel) + .build() + .register(); public static final BlockEntry PACKAGER_LINK = REGISTRATE.block("packager_link", PackagerLinkBlock::new) diff --git a/src/main/java/com/simibubi/create/AllPackets.java b/src/main/java/com/simibubi/create/AllPackets.java index 50ab661b57..e36b924658 100644 --- a/src/main/java/com/simibubi/create/AllPackets.java +++ b/src/main/java/com/simibubi/create/AllPackets.java @@ -45,6 +45,8 @@ import com.simibubi.create.content.equipment.toolbox.ToolboxEquipPacket; import com.simibubi.create.content.equipment.zapper.ZapperBeamPacket; import com.simibubi.create.content.equipment.zapper.terrainzapper.ConfigureWorldshaperPacket; import com.simibubi.create.content.fluids.transfer.FluidSplashPacket; +import com.simibubi.create.content.kinetics.chainLift.ChainLiftConnectionPacket; +import com.simibubi.create.content.kinetics.chainLift.ChainLiftRidingPacket; import com.simibubi.create.content.kinetics.gauge.GaugeObservedPacket; import com.simibubi.create.content.kinetics.mechanicalArm.ArmPlacementPacket; import com.simibubi.create.content.kinetics.transmission.sequencer.ConfigureSequencedGearshiftPacket; @@ -55,6 +57,7 @@ import com.simibubi.create.content.logistics.depot.EjectorPlacementPacket; import com.simibubi.create.content.logistics.depot.EjectorTriggerPacket; import com.simibubi.create.content.logistics.filter.FilterScreenPacket; import com.simibubi.create.content.logistics.funnel.FunnelFlapPacket; +import com.simibubi.create.content.logistics.packagePort.PackagePortPlacementPacket; import com.simibubi.create.content.logistics.stockTicker.LogisticalStockRequestPacket; import com.simibubi.create.content.logistics.stockTicker.LogisticalStockResponsePacket; import com.simibubi.create.content.logistics.stockTicker.PackageOrderRequestPacket; @@ -124,6 +127,7 @@ public enum AllPackets { CONTRAPTION_INTERACT(ContraptionInteractionPacket.class, ContraptionInteractionPacket::new, PLAY_TO_SERVER), CLIENT_MOTION(ClientMotionPacket.class, ClientMotionPacket::new, PLAY_TO_SERVER), PLACE_ARM(ArmPlacementPacket.class, ArmPlacementPacket::new, PLAY_TO_SERVER), + PLACE_PACKAGE_PORT(PackagePortPlacementPacket.class, PackagePortPlacementPacket::new, PLAY_TO_SERVER), MINECART_COUPLING_CREATION(CouplingCreationPacket.class, CouplingCreationPacket::new, PLAY_TO_SERVER), INSTANT_SCHEMATIC(InstantSchematicPacket.class, InstantSchematicPacket::new, PLAY_TO_SERVER), SYNC_SCHEMATIC(SchematicSyncPacket.class, SchematicSyncPacket::new, PLAY_TO_SERVER), @@ -169,6 +173,8 @@ public enum AllPackets { ContraptionColliderLockPacketRequest::new, PLAY_TO_SERVER), LOGISTICS_STOCK_REQUEST(LogisticalStockRequestPacket.class, LogisticalStockRequestPacket::new, PLAY_TO_SERVER), LOGISTICS_PACKAGE_REQUEST(PackageOrderRequestPacket.class, PackageOrderRequestPacket::new, PLAY_TO_SERVER), + CHAIN_LIFT_CONNECT(ChainLiftConnectionPacket.class, ChainLiftConnectionPacket::new, PLAY_TO_SERVER), + CHAIN_LIFT_RIDING(ChainLiftRidingPacket.class, ChainLiftRidingPacket::new, PLAY_TO_SERVER), // Server to Client SYMMETRY_EFFECT(SymmetryEffectPacket.class, SymmetryEffectPacket::new, PLAY_TO_CLIENT), @@ -208,6 +214,8 @@ public enum AllPackets { PLAY_TO_CLIENT), S_PLACE_ARM(EjectorPlacementPacket.ClientBoundRequest.class, EjectorPlacementPacket.ClientBoundRequest::new, PLAY_TO_CLIENT), + S_PLACE_PACKAGE_PORT(PackagePortPlacementPacket.ClientBoundRequest.class, PackagePortPlacementPacket.ClientBoundRequest::new, + PLAY_TO_CLIENT), UPDATE_ELEVATOR_FLOORS(ElevatorFloorListPacket.class, ElevatorFloorListPacket::new, PLAY_TO_CLIENT), CONTRAPTION_ACTOR_TOGGLE(ContraptionDisableActorPacket.class, ContraptionDisableActorPacket::new, PLAY_TO_CLIENT), CONTRAPTION_COLLIDER_LOCK(ContraptionColliderLockPacket.class, ContraptionColliderLockPacket::new, PLAY_TO_CLIENT), diff --git a/src/main/java/com/simibubi/create/AllPartialModels.java b/src/main/java/com/simibubi/create/AllPartialModels.java index 70eaf6e9e8..51022b8372 100644 --- a/src/main/java/com/simibubi/create/AllPartialModels.java +++ b/src/main/java/com/simibubi/create/AllPartialModels.java @@ -114,6 +114,11 @@ public class AllPartialModels { GOGGLES = block("goggles"), EJECTOR_TOP = block("weighted_ejector/top"), + + CHAIN_LIFT_GUARD = block("chain_lift/guard"), + + PACKAGE_PORT_TUBE = block("package_port/tube"), + PACKAGE_PORT_CAP = block("package_port/cap"), PACKAGER_TRAY = block("packager/tray"), PACKAGER_HATCH_OPEN = block("packager/hatch_open"), PACKAGER_HATCH_CLOSED = block("packager/hatch_closed"), diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftBlock.java b/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftBlock.java new file mode 100644 index 0000000000..81ec9f2667 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftBlock.java @@ -0,0 +1,101 @@ +package com.simibubi.create.content.kinetics.chainLift; + +import com.simibubi.create.AllBlockEntityTypes; +import com.simibubi.create.content.kinetics.base.KineticBlock; +import com.simibubi.create.content.logistics.box.PackageItem; +import com.simibubi.create.foundation.block.IBE; + +import net.createmod.catnip.utility.math.AngleHelper; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Direction.Axis; +import net.minecraft.util.Mth; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; + +public class ChainLiftBlock extends KineticBlock implements IBE { + + public ChainLiftBlock(Properties properties) { + super(properties); + } + + @Override + public Axis getRotationAxis(BlockState state) { + return Axis.Y; + } + + @Override + public InteractionResult use(BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, + BlockHitResult pHit) { + ItemStack itemInHand = pPlayer.getItemInHand(pHand); + if (!(itemInHand.getItem() instanceof PackageItem) && !itemInHand.isEmpty()) + return InteractionResult.PASS; + if (pLevel.isClientSide()) + return InteractionResult.CONSUME; + + Vec3 diff = Vec3.atBottomCenterOf(pPos) + .subtract(pPlayer.position()); + float angle = (float) (Mth.RAD_TO_DEG * Mth.atan2(diff.x, diff.z) + 360 + 180) % 360; + + if (itemInHand.isEmpty()) { + withBlockEntityDo(pLevel, pPos, be -> { + float bestDiff = Float.POSITIVE_INFINITY; + ChainLiftPackage best = null; + for (ChainLiftPackage liftPackage : be.loopingPackages) { + float angleDiff = Math.abs(AngleHelper.getShortestAngleDiff(liftPackage.chainPosition, angle)); + if (angleDiff > bestDiff) + continue; + bestDiff = angleDiff; + best = liftPackage; + } + + if (best == null) + return; + + pPlayer.setItemInHand(pHand, best.item.copy()); + be.loopingPackages.remove(best); + be.sendData(); + }); + + return InteractionResult.CONSUME; + } + + withBlockEntityDo(pLevel, pPos, be -> { + be.addLoopingPackage(new ChainLiftPackage(angle, itemInHand.copyWithCount(1))); + itemInHand.shrink(1); + if (itemInHand.isEmpty()) + pPlayer.setItemInHand(pHand, ItemStack.EMPTY); + }); + + return InteractionResult.CONSUME; + } + + @Override + public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pIsMoving) { + IBE.onRemove(pState, pLevel, pPos, pNewState); + } + + @Override + public boolean hasShaftTowards(LevelReader world, BlockPos pos, BlockState state, Direction face) { + return face.getAxis() == getRotationAxis(state); + } + + @Override + public Class getBlockEntityClass() { + return ChainLiftBlockEntity.class; + } + + @Override + public BlockEntityType getBlockEntityType() { + return AllBlockEntityTypes.CHAIN_LIFT.get(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftBlockEntity.java new file mode 100644 index 0000000000..4a01885e09 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftBlockEntity.java @@ -0,0 +1,480 @@ +package com.simibubi.create.content.kinetics.chainLift; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import com.simibubi.create.content.kinetics.base.IRotate; +import com.simibubi.create.content.kinetics.base.KineticBlockEntity; +import com.simibubi.create.content.kinetics.chainLift.ChainLiftPackage.ChainLiftPackagePhysicsData; +import com.simibubi.create.content.kinetics.chainLift.ChainLiftShape.ChainLiftBB; +import com.simibubi.create.content.kinetics.chainLift.ChainLiftShape.ChainLiftOBB; +import com.simibubi.create.content.logistics.box.PackageEntity; +import com.simibubi.create.content.logistics.box.PackageItem; +import com.simibubi.create.content.logistics.packagePort.PackagePortBlockEntity; +import com.simibubi.create.foundation.utility.ServerSpeedProvider; + +import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.utility.math.AngleHelper; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction.Axis; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.nbt.Tag; +import net.minecraft.network.chat.Component; +import net.minecraft.util.Mth; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.items.ItemHandlerHelper; + +public class ChainLiftBlockEntity extends KineticBlockEntity { + + public record ConnectionStats(float tangentAngle, float chainLength, Vec3 start, Vec3 end) { + } + + public record ConnectedPort(float chainPosition, BlockPos connection, String filter) { + } + + public Set connections = new HashSet<>(); + public Map connectionStats; + + public Map loopPorts = new HashMap<>(); + public Map travelPorts = new HashMap<>(); + public ChainLiftRoutingTable routingTable = new ChainLiftRoutingTable(); + + List loopingPackages = new ArrayList<>(); + Map> travellingPackages = new HashMap<>(); + + public boolean reversed; + + public ChainLiftBlockEntity(BlockEntityType typeIn, BlockPos pos, BlockState state) { + super(typeIn, pos, state); + } + + @Override + protected AABB createRenderBoundingBox() { + return INFINITE_EXTENT_AABB; // TODO: compute smallest possible from connection data + } + + @Override + public void lazyTick() { + super.lazyTick(); + updateChainShapes(); + } + + @Override + public boolean addToTooltip(List tooltip, boolean isPlayerSneaking) { + super.addToTooltip(tooltip, isPlayerSneaking); + tooltip.addAll(routingTable.createSummary()); + if (!loopPorts.isEmpty()) + tooltip.add(Components.literal(loopPorts.size() + " Loop ports")); + if (!travelPorts.isEmpty()) + tooltip.add(Components.literal(travelPorts.size() + " Travel ports")); + return true; + } + + @Override + public void tick() { + super.tick(); + + float serverSpeed = ServerSpeedProvider.get(); + float speed = getSpeed() / 180f; + float radius = 1.5f; + float distancePerTick = Math.abs(speed); + float degreesPerTick = (speed / (Mth.PI * radius)) * 360f; + boolean reversedPreviously = reversed; + + prepareStats(); + + if (level.isClientSide()) { + for (ChainLiftPackage box : loopingPackages) + tickBoxVisuals(box); + for (Entry> entry : travellingPackages.entrySet()) + for (ChainLiftPackage box : entry.getValue()) + tickBoxVisuals(box); + } + + /* if serverside */ { + routingTable.tick(); + if (routingTable.shouldAdvertise()) { + if (level.isClientSide()) + level.addParticle(ParticleTypes.CRIT, worldPosition.getX() + .5, worldPosition.getY() + 1.5, + worldPosition.getZ() + .5, 0, 0, 0); + for (BlockPos pos : connections) + if (level.getBlockEntity(worldPosition.offset(pos)) instanceof ChainLiftBlockEntity clbe) + routingTable.advertiseTo(pos, clbe.routingTable); + routingTable.changed = false; + routingTable.lastUpdate = 0; + } + } + + if (speed == 0) { + updateBoxWorldPositions(); + return; + } + + if (reversedPreviously != reversed) { + for (Entry> entry : travellingPackages.entrySet()) { + BlockPos offset = entry.getKey(); + if (!(level.getBlockEntity(worldPosition.offset(offset)) instanceof ChainLiftBlockEntity otherLift)) + continue; + for (Iterator iterator = entry.getValue() + .iterator(); iterator.hasNext();) { + ChainLiftPackage box = iterator.next(); + if (box.justFlipped) + continue; + box.justFlipped = true; + float length = (float) Vec3.atLowerCornerOf(offset) + .length() - 22 / 16f; + box.chainPosition = length - box.chainPosition; + otherLift.addTravellingPackage(box, offset.multiply(-1)); + iterator.remove(); + } + } + notifyUpdate(); + } + + for (Entry> entry : travellingPackages.entrySet()) { + BlockPos target = entry.getKey(); + ConnectionStats stats = connectionStats.get(target); + + Travelling: for (Iterator iterator = entry.getValue() + .iterator(); iterator.hasNext();) { + ChainLiftPackage box = iterator.next(); + + float prevChainPosition = box.chainPosition; + box.chainPosition += serverSpeed * distancePerTick; + box.chainPosition = Math.min(stats.chainLength, box.chainPosition); + box.justFlipped = false; + + if (level.isClientSide()) + continue; + + for (Entry portEntry : travelPorts.entrySet()) { + ConnectedPort port = portEntry.getValue(); + float chainPosition = port.chainPosition(); + + if (prevChainPosition > chainPosition || box.chainPosition < chainPosition) + continue; + if (!PackageItem.matchAddress(box.item, port.filter())) + continue; + if (!exportToPort(box, portEntry.getKey())) + continue; + + iterator.remove(); + notifyUpdate(); + continue Travelling; + } + + if (box.chainPosition < stats.chainLength) + continue; + + // transfer to other + if (level.getBlockEntity(worldPosition.offset(target)) instanceof ChainLiftBlockEntity clbe) { + box.chainPosition = wrapAngle(stats.tangentAngle + 180 + 2 * 49 * (reversed ? -1 : 1)); + clbe.addLoopingPackage(box); + iterator.remove(); + notifyUpdate(); + } + } + } + + Looping: for (Iterator iterator = loopingPackages.iterator(); iterator.hasNext();) { + ChainLiftPackage box = iterator.next(); + + float prevChainPosition = box.chainPosition; + box.chainPosition += serverSpeed * degreesPerTick; + box.chainPosition = wrapAngle(box.chainPosition); + box.justFlipped = false; + + if (level.isClientSide()) + continue; + + for (Entry portEntry : loopPorts.entrySet()) { + ConnectedPort port = portEntry.getValue(); + float offBranchAngle = port.chainPosition(); + + if (!loopThresholdCrossed(box.chainPosition, prevChainPosition, offBranchAngle)) + continue; + if (!PackageItem.matchAddress(box.item, port.filter())) + continue; + if (!exportToPort(box, portEntry.getKey())) + continue; + + iterator.remove(); + notifyUpdate(); + continue Looping; + } + + for (BlockPos connection : connections) { + float offBranchAngle = connectionStats.get(connection).tangentAngle; + + if (!loopThresholdCrossed(box.chainPosition, prevChainPosition, offBranchAngle)) + continue; + if (!routingTable.getExitFor(box.item) + .equals(connection)) + continue; + + box.chainPosition = 0; + addTravellingPackage(box, connection); + iterator.remove(); + continue Looping; + } + } + + updateBoxWorldPositions(); + } + + public boolean loopThresholdCrossed(float chainPosition, float prevChainPosition, float offBranchAngle) { + int sign1 = Mth.sign(AngleHelper.getShortestAngleDiff(offBranchAngle, prevChainPosition)); + int sign2 = Mth.sign(AngleHelper.getShortestAngleDiff(offBranchAngle, chainPosition)); + boolean notCrossed = sign1 >= sign2 && !reversed || sign1 <= sign2 && reversed; + return !notCrossed; + } + + private boolean exportToPort(ChainLiftPackage box, BlockPos offset) { + BlockPos globalPos = worldPosition.offset(offset); + if (!(level.getBlockEntity(globalPos) instanceof PackagePortBlockEntity ppbe)) + return false; + + ppbe.inventory.receiveMode(true); + ItemStack remainder = ItemHandlerHelper.insertItem(ppbe.inventory, box.item.copy(), false); + ppbe.inventory.receiveMode(false); + + return remainder.isEmpty(); + } + + public boolean addTravellingPackage(ChainLiftPackage box, BlockPos connection) { + if (!connections.contains(connection)) + return false; + travellingPackages.computeIfAbsent(connection, $ -> new ArrayList<>()) + .add(box); + notifyUpdate(); + return true; + } + + @Override + public void notifyUpdate() { + level.blockEntityChanged(worldPosition); + sendData(); + } + + public boolean addLoopingPackage(ChainLiftPackage box) { + loopingPackages.add(box); + notifyUpdate(); + return true; + } + + public void prepareStats() { + float speed = getSpeed(); + if (reversed != speed < 0 && speed != 0) { + reversed = speed < 0; + connectionStats = null; + } + if (connectionStats == null) { + connectionStats = new HashMap<>(); + connections.forEach(this::calculateConnectionStats); + } + } + + public void updateBoxWorldPositions() { + prepareStats(); + + for (Entry> entry : travellingPackages.entrySet()) { + BlockPos target = entry.getKey(); + ConnectionStats stats = connectionStats.get(target); + for (ChainLiftPackage box : entry.getValue()) + box.worldPosition = stats.start.add((stats.end.subtract(stats.start)).normalize() + .scale(Math.min(stats.chainLength, box.chainPosition))); + } + + for (ChainLiftPackage box : loopingPackages) + box.worldPosition = Vec3.atBottomCenterOf(worldPosition) + .add(VecHelper.rotate(new Vec3(0, 0.25, 1), box.chainPosition, Axis.Y)); + } + + private void tickBoxVisuals(ChainLiftPackage box) { + if (box.worldPosition == null) + return; + + ChainLiftPackagePhysicsData physicsData = box.physicsData(level); + if (!physicsData.shouldTick()) + return; + + physicsData.prevPos = physicsData.pos; + if (physicsData.pos.distanceToSqr(box.worldPosition) > 1.5f * 1.5f) + physicsData.pos = box.worldPosition.add(physicsData.pos.subtract(box.worldPosition) + .normalize() + .scale(1.5)); + physicsData.motion = physicsData.motion.add(0, -0.1, 0) + .scale(0.85) + .add((box.worldPosition.subtract(physicsData.pos)).scale(0.15)); + physicsData.pos = physicsData.pos.add(physicsData.motion); + } + + private void calculateConnectionStats(BlockPos connection) { + boolean reversed = getSpeed() < 0; + float offBranchDistance = 49f; + float direction = Mth.RAD_TO_DEG * (float) Mth.atan2(connection.getX(), connection.getZ()); + float angle = wrapAngle(direction - offBranchDistance * (reversed ? -1 : 1)); + float oppositeAngle = wrapAngle(angle + 180 + 2 * 49 * (reversed ? -1 : 1)); + Vec3 start = Vec3.atBottomCenterOf(worldPosition) + .add(VecHelper.rotate(new Vec3(0, 0, 1), angle, Axis.Y)) + .add(0, 4 / 16f, 0); + Vec3 end = Vec3.atBottomCenterOf(worldPosition.offset(connection)) + .add(VecHelper.rotate(new Vec3(0, 0, 1), oppositeAngle, Axis.Y)) + .add(0, 4 / 16f, 0); + float length = (float) start.distanceTo(end); + connectionStats.put(connection, new ConnectionStats(angle, length, start, end)); + } + + public boolean addConnectionTo(BlockPos target) { + BlockPos localTarget = target.subtract(worldPosition); + boolean added = connections.add(localTarget); + if (added) { + notifyUpdate(); + calculateConnectionStats(localTarget); + updateChainShapes(); + } + + detachKinetics(); + updateSpeed = true; + + return added; + } + + public boolean removeConnectionTo(BlockPos target) { + BlockPos localTarget = target.subtract(worldPosition); + boolean removed = connections.remove(localTarget); + if (removed) { + connectionStats.remove(localTarget); + List packages = travellingPackages.remove(localTarget); + if (packages != null) + for (ChainLiftPackage box : packages) + drop(box); + notifyUpdate(); + updateChainShapes(); + } + + detachKinetics(); + updateSpeed = true; + + return removed; + } + + private void updateChainShapes() { + List shapes = new ArrayList<>(); + shapes.add(new ChainLiftBB(Vec3.atBottomCenterOf(BlockPos.ZERO))); + for (BlockPos target : connections) { + ConnectionStats stats = connectionStats.get(target); + if (stats == null) + continue; + Vec3 localStart = stats.start.subtract(Vec3.atLowerCornerOf(worldPosition)); + Vec3 localEnd = stats.end.subtract(Vec3.atLowerCornerOf(worldPosition)); + shapes.add(new ChainLiftOBB(target, localStart, localEnd)); + } + ChainLiftInteractionHandler.loadedChains.get(level) + .put(worldPosition, shapes); + } + + @Override + public void destroy() { + super.destroy(); + ChainLiftInteractionHandler.loadedChains.get(level) + .invalidate(worldPosition); + + if (level.isClientSide()) + return; + + for (BlockPos blockPos : connections) + if (level.getBlockEntity(worldPosition.offset(blockPos)) instanceof ChainLiftBlockEntity clbe) + clbe.removeConnectionTo(worldPosition); + + for (ChainLiftPackage box : loopingPackages) + drop(box); + for (Entry> entry : travellingPackages.entrySet()) + for (ChainLiftPackage box : entry.getValue()) + drop(box); + } + + private void drop(ChainLiftPackage box) { + level.addFreshEntity(PackageEntity.fromItemStack(level, box.worldPosition.subtract(0, 0.5, 0), box.item)); + } + + @Override + public List addPropagationLocations(IRotate block, BlockState state, List neighbours) { + connections.forEach(p -> neighbours.add(worldPosition.offset(p))); + return super.addPropagationLocations(block, state, neighbours); + } + + @Override + public float propagateRotationTo(KineticBlockEntity target, BlockState stateFrom, BlockState stateTo, BlockPos diff, + boolean connectedViaAxes, boolean connectedViaCogs) { + if (connections.contains(target.getBlockPos() + .subtract(worldPosition))) { + if (!(target instanceof ChainLiftBlockEntity clbe)) + return 0; + return 1; + } + return super.propagateRotationTo(target, stateFrom, stateTo, diff, connectedViaAxes, connectedViaCogs); + } + + @Override + protected void write(CompoundTag compound, boolean clientPacket) { + super.write(compound, clientPacket); + compound.put("Connections", NBTHelper.writeCompoundList(connections, NbtUtils::writeBlockPos)); + compound.put("TravellingPackages", NBTHelper.writeCompoundList(travellingPackages.entrySet(), entry -> { + CompoundTag compoundTag = new CompoundTag(); + compoundTag.put("Target", NbtUtils.writeBlockPos(entry.getKey())); + compoundTag.put("Packages", NBTHelper.writeCompoundList(entry.getValue(), + clientPacket ? ChainLiftPackage::writeToClient : ChainLiftPackage::write)); + return compoundTag; + })); + compound.put("LoopingPackages", NBTHelper.writeCompoundList(loopingPackages, + clientPacket ? ChainLiftPackage::writeToClient : ChainLiftPackage::write)); + } + + @Override + protected void read(CompoundTag compound, boolean clientPacket) { + super.read(compound, clientPacket); + connections.clear(); + NBTHelper.iterateCompoundList(compound.getList("Connections", Tag.TAG_COMPOUND), + c -> connections.add(NbtUtils.readBlockPos(c))); + travellingPackages.clear(); + NBTHelper.iterateCompoundList(compound.getList("TravellingPackages", Tag.TAG_COMPOUND), + c -> travellingPackages.put(NbtUtils.readBlockPos(c.getCompound("Target")), + NBTHelper.readCompoundList(c.getList("Packages", Tag.TAG_COMPOUND), ChainLiftPackage::read))); + loopingPackages = + NBTHelper.readCompoundList(compound.getList("LoopingPackages", Tag.TAG_COMPOUND), ChainLiftPackage::read); + connectionStats = null; + updateBoxWorldPositions(); + updateChainShapes(); + } + + public float wrapAngle(float angle) { + angle %= 360; + if (angle < 0) + angle += 360; + return angle; + } + + public List getLoopingPackages() { + return loopingPackages; + } + + public Map> getTravellingPackages() { + return travellingPackages; + } + +} diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftConnectionHandler.java b/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftConnectionHandler.java new file mode 100644 index 0000000000..8ebc1258d4 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftConnectionHandler.java @@ -0,0 +1,78 @@ +package com.simibubi.create.content.kinetics.chainLift; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllPackets; +import com.simibubi.create.foundation.utility.CreateLang; + +import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.common.util.FakePlayer; +import net.minecraftforge.event.entity.player.PlayerInteractEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod.EventBusSubscriber; + +@EventBusSubscriber(Dist.CLIENT) +public class ChainLiftConnectionHandler { + + private static BlockPos firstPos; + private static ResourceKey firstDim; + + @SubscribeEvent + public static void onItemUsedOnBlock(PlayerInteractEvent.RightClickBlock event) { + ItemStack itemStack = event.getItemStack(); + BlockPos pos = event.getPos(); + Level level = event.getLevel(); + Player player = event.getEntity(); + BlockState blockState = level.getBlockState(pos); + + if (!AllBlocks.CHAIN_LIFT.has(blockState)) + return; + if (!itemStack.is(Items.CHAIN)) // Replace with tag? generic renderer? + return; + if (!player.mayBuild() || player instanceof FakePlayer) + return; + + event.setCanceled(true); + event.setCancellationResult(InteractionResult.CONSUME); + + if (!level.isClientSide()) + return; + + if (firstPos == null || firstDim != level.dimension()) { + firstPos = pos; + firstDim = level.dimension(); + CreateLang.text("First position selected") // TODO localisation entry + .sendStatus(player); + return; + } + + // TODO max distance config + + ChainLiftBlock chainLiftBlock = AllBlocks.CHAIN_LIFT.get(); + ChainLiftBlockEntity sourceLift = chainLiftBlock.getBlockEntity(level, firstPos); + ChainLiftBlockEntity targetLift = chainLiftBlock.getBlockEntity(level, pos); + + if (sourceLift == null || targetLift == null) { + firstPos = null; + CreateLang.text("Connection failed") // TODO localisation entry + .sendStatus(player); + return; + } + + AllPackets.getChannel() + .sendToServer(new ChainLiftConnectionPacket(firstPos, pos, true)); + + CreateLang.text("Chain added") // TODO localisation entry + .sendStatus(player); + firstPos = null; + firstDim = null; + } + +} diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftConnectionPacket.java b/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftConnectionPacket.java new file mode 100644 index 0000000000..57b679ac00 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftConnectionPacket.java @@ -0,0 +1,56 @@ +package com.simibubi.create.content.kinetics.chainLift; + +import com.simibubi.create.foundation.networking.BlockEntityConfigurationPacket; + +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; + +public class ChainLiftConnectionPacket extends BlockEntityConfigurationPacket { + + private BlockPos targetPos; + private boolean connect; + + public ChainLiftConnectionPacket(BlockPos pos, BlockPos targetPos, boolean connect) { + super(pos); + this.targetPos = targetPos; + this.connect = connect; + } + + public ChainLiftConnectionPacket(FriendlyByteBuf buffer) { + super(buffer); + } + + @Override + protected void writeSettings(FriendlyByteBuf buffer) { + buffer.writeBlockPos(targetPos); + buffer.writeBoolean(connect); + } + + @Override + protected void readSettings(FriendlyByteBuf buffer) { + targetPos = buffer.readBlockPos(); + connect = buffer.readBoolean(); + } + + @Override + protected void applySettings(ChainLiftBlockEntity be) { + // TODO max size config check + + if (!(be.getLevel() + .getBlockEntity(targetPos) instanceof ChainLiftBlockEntity clbe)) + return; + + if (connect) { + if (!clbe.addConnectionTo(be.getBlockPos())) + return; + } else + clbe.removeConnectionTo(be.getBlockPos()); + + if (connect) { + if (!be.addConnectionTo(targetPos)) + clbe.removeConnectionTo(be.getBlockPos()); + } else + be.removeConnectionTo(targetPos); + } + +} diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftInteractionHandler.java b/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftInteractionHandler.java new file mode 100644 index 0000000000..ee54600636 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftInteractionHandler.java @@ -0,0 +1,118 @@ +package com.simibubi.create.content.kinetics.chainLift; + +import java.util.List; +import java.util.Map.Entry; +import java.util.concurrent.TimeUnit; + +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllTags.AllItemTags; +import com.simibubi.create.content.logistics.packagePort.PackagePortTarget; +import com.simibubi.create.content.logistics.packagePort.PackagePortTargetSelectionHandler; +import com.simibubi.create.foundation.utility.RaycastHelper; + +import net.createmod.catnip.utility.WorldAttached; +import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.phys.HitResult; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.common.ForgeMod; + +public class ChainLiftInteractionHandler { + + public static WorldAttached>> loadedChains = + new WorldAttached<>($ -> CacheBuilder.newBuilder() + .expireAfterAccess(3, TimeUnit.SECONDS) + .build()); + + public static BlockPos selectedLift; + public static float selectedChainPosition; + public static BlockPos selectedConnection; + + public static void clientTick() { + if (!isActive()) { + selectedLift = null; + return; + } + + Minecraft mc = Minecraft.getInstance(); + double range = mc.player.getAttribute(ForgeMod.BLOCK_REACH.get()) + .getValue() + 1; + Vec3 from = RaycastHelper.getTraceOrigin(mc.player); + Vec3 to = RaycastHelper.getTraceTarget(mc.player, range, from); + HitResult hitResult = mc.hitResult; + + double bestDiff = Float.MAX_VALUE; + if (hitResult != null) + bestDiff = hitResult.getLocation() + .distanceToSqr(from); + + BlockPos bestLift = null; + ChainLiftShape bestShape = null; + selectedConnection = null; + + for (Entry> entry : loadedChains.get(Minecraft.getInstance().level) + .asMap() + .entrySet()) { + BlockPos liftPos = entry.getKey(); + for (ChainLiftShape chainLiftShape : entry.getValue()) { + Vec3 liftVec = Vec3.atLowerCornerOf(liftPos); + Vec3 intersect = chainLiftShape.intersect(from.subtract(liftVec), to.subtract(liftVec)); + if (intersect == null) + continue; + + double distanceToSqr = intersect.add(liftVec) + .distanceToSqr(from); + if (distanceToSqr > bestDiff) + continue; + bestDiff = distanceToSqr; + bestLift = liftPos; + bestShape = chainLiftShape; + selectedChainPosition = chainLiftShape.getChainPosition(intersect); + if (chainLiftShape instanceof ChainLiftShape.ChainLiftOBB obb) + selectedConnection = obb.connection; + } + } + + selectedLift = bestLift; + if (bestLift == null) + return; + + bestShape.drawOutline(bestLift); + bestShape.drawPoint(bestLift, selectedChainPosition); + } + + private static boolean isActive() { + Minecraft mc = Minecraft.getInstance(); + ItemStack mainHandItem = mc.player.getMainHandItem(); + return AllItemTags.WRENCH.matches(mainHandItem) || AllBlocks.PACKAGE_PORT.isIn(mainHandItem); + } + + public static boolean onUse() { + if (selectedLift == null) + return false; + + Minecraft mc = Minecraft.getInstance(); + ItemStack mainHandItem = mc.player.getMainHandItem(); + + if (AllItemTags.WRENCH.matches(mainHandItem)) { + if (!mc.player.isCrouching()) { + ChainLiftRidingHandler.embark(selectedLift, selectedChainPosition, selectedConnection); + return true; + } + // dismantle or start riding + return true; + } + + if (AllBlocks.PACKAGE_PORT.isIn(mainHandItem)) { + PackagePortTargetSelectionHandler.activePackageTarget = + new PackagePortTarget.ChainLiftPortTarget(selectedLift, selectedChainPosition, selectedConnection); + return true; + } + + return false; + } + +} diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftPackage.java b/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftPackage.java new file mode 100644 index 0000000000..9da6e4fc9c --- /dev/null +++ b/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftPackage.java @@ -0,0 +1,105 @@ +package com.simibubi.create.content.kinetics.chainLift; + +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; + +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; + +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.WorldAttached; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.phys.Vec3; + +public class ChainLiftPackage { + + // Server creates unique ids for chain boxes + public static final AtomicInteger netIdGenerator = new AtomicInteger(); + + // Client tracks physics data by id so it can travel between BEs + private static final int ticksUntilExpired = 30; + public static final WorldAttached> physicsDataCache = + new WorldAttached<>($ -> CacheBuilder.newBuilder() + .expireAfterAccess(ticksUntilExpired * 50, TimeUnit.MILLISECONDS) + .build()); + + public class ChainLiftPackagePhysicsData { + public Vec3 prevPos; + public Vec3 pos; + public Vec3 motion; + public int lastTick; + + public ChainLiftPackagePhysicsData(Vec3 serverPosition) { + this.prevPos = serverPosition; + this.pos = serverPosition; + this.motion = Vec3.ZERO; + this.lastTick = AnimationTickHolder.getTicks(); + } + + public boolean shouldTick() { + if (lastTick == AnimationTickHolder.getTicks()) + return false; + lastTick = AnimationTickHolder.getTicks(); + return true; + } + } + + public float chainPosition; + public ItemStack item; + public int netId; + public boolean justFlipped; + + public Vec3 worldPosition; + + private ChainLiftPackagePhysicsData physicsData; + + public ChainLiftPackage(float chainPosition, ItemStack item) { + this(chainPosition, item, netIdGenerator.incrementAndGet()); + } + + public ChainLiftPackage(float chainPosition, ItemStack item, int netId) { + this.chainPosition = chainPosition; + this.item = item; + this.netId = netId; + this.physicsData = null; + } + + public CompoundTag writeToClient() { + CompoundTag tag = write(); + tag.putInt("NetID", netId); + return tag; + } + + public CompoundTag write() { + CompoundTag compoundTag = new CompoundTag(); + compoundTag.putFloat("Position", chainPosition); + compoundTag.put("Item", item.serializeNBT()); + return compoundTag; + } + + public static ChainLiftPackage read(CompoundTag compoundTag) { + float pos = compoundTag.getFloat("Position"); + ItemStack item = ItemStack.of(compoundTag.getCompound("Item")); + if (compoundTag.contains("NetID")) + return new ChainLiftPackage(pos, item, compoundTag.getInt("NetID")); + return new ChainLiftPackage(pos, item); + } + + public ChainLiftPackagePhysicsData physicsData(LevelAccessor level) { + if (physicsData == null) { + try { + return physicsData = physicsDataCache.get(level) + .get(netId, () -> new ChainLiftPackagePhysicsData(worldPosition)); + } catch (ExecutionException e) { + e.printStackTrace(); + } + } + physicsDataCache.get(level) + .getIfPresent(netId); + return physicsData; + } + +} diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftRenderer.java b/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftRenderer.java new file mode 100644 index 0000000000..204420ef5b --- /dev/null +++ b/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftRenderer.java @@ -0,0 +1,150 @@ +package com.simibubi.create.content.kinetics.chainLift; + +import java.util.List; +import java.util.Map.Entry; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.AllPartialModels; +import com.simibubi.create.content.kinetics.base.KineticBlockEntityRenderer; +import com.simibubi.create.content.kinetics.chainLift.ChainLiftBlockEntity.ConnectionStats; +import com.simibubi.create.content.kinetics.chainLift.ChainLiftPackage.ChainLiftPackagePhysicsData; + +import net.createmod.catnip.render.CachedBuffers; +import net.createmod.catnip.render.SuperByteBuffer; +import net.createmod.ponder.utility.LevelTickHolder; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.LightTexture; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider.Context; +import net.minecraft.client.renderer.entity.ItemRenderer; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction.Axis; +import net.minecraft.util.Mth; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LightLayer; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; + +public class ChainLiftRenderer extends KineticBlockEntityRenderer { + + public ChainLiftRenderer(Context context) { + super(context); + } + + @Override + protected void renderSafe(ChainLiftBlockEntity be, float partialTicks, PoseStack ms, MultiBufferSource buffer, + int light, int overlay) { + super.renderSafe(be, partialTicks, ms, buffer, light, overlay); + BlockPos pos = be.getBlockPos(); + + renderChains(be, ms, buffer, light, overlay); + + for (ChainLiftPackage box : be.loopingPackages) + renderBox(be, ms, buffer, overlay, pos, box, partialTicks); + for (Entry> entry : be.travellingPackages.entrySet()) + for (ChainLiftPackage box : entry.getValue()) + renderBox(be, ms, buffer, overlay, pos, box, partialTicks); + } + + private void renderBox(ChainLiftBlockEntity be, PoseStack ms, MultiBufferSource buffer, int overlay, BlockPos pos, + ChainLiftPackage box, float partialTicks) { + if (box.worldPosition == null) + return; + + ChainLiftPackagePhysicsData physicsData = box.physicsData(be.getLevel()); + + ms.pushPose(); + + ItemRenderer itemRenderer = Minecraft.getInstance() + .getItemRenderer(); + Vec3 position = physicsData.prevPos.lerp(physicsData.pos, partialTicks); + ms.translate(position.x - pos.getX(), position.y - pos.getY(), position.z - pos.getZ()); + ms.scale(2f, 2f, 2f); + + BlockPos containingPos = BlockPos.containing(position); + Level level = be.getLevel(); + itemRenderer.renderStatic(null, box.item, ItemDisplayContext.FIXED, false, ms, buffer, level, + LightTexture.pack(level.getBrightness(LightLayer.BLOCK, containingPos), + level.getBrightness(LightLayer.SKY, containingPos)), + overlay, 0); + + ms.popPose(); + } + + private void renderChains(ChainLiftBlockEntity be, PoseStack ms, MultiBufferSource buffer, int light, int overlay) { + float time = LevelTickHolder.getRenderTime(be.getLevel()) / (180f / Math.abs(be.getSpeed())); + time %= 1; + if (time < 0) + time += 1; + + float animation = time - 0.5f; + + for (BlockPos blockPos : be.connections) { + ConnectionStats stats = be.connectionStats.get(blockPos); + if (stats == null) + continue; + + Vec3 diff = stats.end() + .subtract(stats.start()); + double yaw = (float) Mth.RAD_TO_DEG * Mth.atan2(diff.x, diff.z); + double pitch = (float) Mth.RAD_TO_DEG * Mth.atan2(diff.y, diff.multiply(1, 0, 1) + .length()); + + ms.pushPose(); + + Vec3 startOffset = stats.start() + .subtract(Vec3.atCenterOf(be.getBlockPos())); + + SuperByteBuffer guard = CachedBuffers.partial(AllPartialModels.CHAIN_LIFT_GUARD, be.getBlockState()); + guard.translate(startOffset.multiply(0, 1, 0)); + guard.translate(0.5, 0.5, 0.5); + guard.rotateY(yaw); + + guard.translate(0, 0, 11 / 16f); + guard.rotateX(-pitch); + guard.translate(0, 0, -11 / 16f); + + guard.translate(-0.5, 0, -.25); + guard.light(light) + .nudge((int) blockPos.asLong()) + .overlay(overlay) + .renderInto(ms, buffer.getBuffer(RenderType.cutoutMipped())); + + double segments = stats.chainLength(); + int roundedSegments = (int) Math.round(segments); + float scale = (float) (segments / roundedSegments); + + for (int i = 0; i < roundedSegments; i++) { + SuperByteBuffer chain = CachedBuffers.block(Blocks.CHAIN.defaultBlockState()); + chain.centre(); + chain.translate(startOffset); + chain.rotateY(yaw); + chain.rotateX(90 - pitch); + chain.translate(0, 8 / 16f, 0); + chain.unCentre(); + chain.scale(1, scale, 1); + chain.translate(0, i + animation, 0); + + chain.light(light) + .overlay(overlay) + .renderInto(ms, buffer.getBuffer(RenderType.cutoutMipped())); + } + + ms.popPose(); + } + } + + @Override + public boolean shouldRenderOffScreen(ChainLiftBlockEntity be) { + return !be.connections.isEmpty(); + } + + @Override + protected BlockState getRenderedBlockState(ChainLiftBlockEntity be) { + return shaft(Axis.Y); + } + +} diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftRidingHandler.java b/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftRidingHandler.java new file mode 100644 index 0000000000..63aaa5cefe --- /dev/null +++ b/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftRidingHandler.java @@ -0,0 +1,154 @@ +package com.simibubi.create.content.kinetics.chainLift; + +import com.simibubi.create.AllPackets; +import com.simibubi.create.content.kinetics.chainLift.ChainLiftBlockEntity.ConnectionStats; +import com.simibubi.create.foundation.utility.ServerSpeedProvider; + +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.VecHelper; +import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction.Axis; +import net.minecraft.util.Mth; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.phys.Vec3; + +public class ChainLiftRidingHandler { + + public static BlockPos ridingChainLift; + public static float chainPosition; + public static BlockPos ridingConnection; + public static boolean flipped; + + public static void embark(BlockPos lift, float position, BlockPos connection) { + ridingChainLift = lift; + chainPosition = position; + ridingConnection = connection; + if (Minecraft.getInstance().level.getBlockEntity(ridingChainLift) instanceof ChainLiftBlockEntity clbe) + flipped = clbe.getSpeed() < 0; + } + + public static void clientTick() { + if (ridingChainLift == null) + return; + Minecraft mc = Minecraft.getInstance(); + BlockEntity blockEntity = mc.level.getBlockEntity(ridingChainLift); + if (mc.player.isCrouching() || !(blockEntity instanceof ChainLiftBlockEntity clbe)) { + ridingChainLift = null; + ridingConnection = null; + return; + } + if (ridingConnection != null && !clbe.connections.contains(ridingConnection)) { + ridingChainLift = null; + ridingConnection = null; + return; + } + + clbe.prepareStats(); + + Vec3 playerPosition = mc.player.position() + .add(0, mc.player.getBoundingBox() + .getYsize() + 0.75, 0); + + updateTargetPosition(mc, clbe); + + blockEntity = mc.level.getBlockEntity(ridingChainLift); + if (!(blockEntity instanceof ChainLiftBlockEntity)) + return; + + clbe = (ChainLiftBlockEntity) blockEntity; + clbe.prepareStats(); + + Vec3 targetPosition = playerPosition; + + if (ridingConnection != null) { + ConnectionStats stats = clbe.connectionStats.get(ridingConnection); + targetPosition = stats.start() + .add((stats.end() + .subtract(stats.start())).normalize() + .scale(Math.min(stats.chainLength(), chainPosition))); + } else { + targetPosition = Vec3.atBottomCenterOf(ridingChainLift) + .add(VecHelper.rotate(new Vec3(0, 0.25, 1), chainPosition, Axis.Y)); + } + + Vec3 diff = targetPosition.subtract(playerPosition); + if (diff.length() > 3) { + ridingChainLift = null; + ridingConnection = null; + return; + } + + mc.player.setDeltaMovement(mc.player.getDeltaMovement() + .scale(0.75) + .add(diff.scale(0.25))); + if (AnimationTickHolder.getTicks() % 10 == 0) + AllPackets.getChannel() + .sendToServer(new ChainLiftRidingPacket(ridingChainLift)); + } + + private static void updateTargetPosition(Minecraft mc, ChainLiftBlockEntity clbe) { + float serverSpeed = ServerSpeedProvider.get(); + float speed = clbe.getSpeed() / 180f; + float radius = 1.5f; + float distancePerTick = Math.abs(speed); + float degreesPerTick = (speed / (Mth.PI * radius)) * 360f; + + if (ridingConnection != null) { + ConnectionStats stats = clbe.connectionStats.get(ridingConnection); + + if (flipped != clbe.getSpeed() < 0) { + flipped = clbe.getSpeed() < 0; + ridingChainLift = clbe.getBlockPos() + .offset(ridingConnection); + chainPosition = stats.chainLength() - chainPosition; + ridingConnection = ridingConnection.multiply(-1); + return; + } + + chainPosition += serverSpeed * distancePerTick; + chainPosition = Math.min(stats.chainLength(), chainPosition); + if (chainPosition < stats.chainLength()) + return; + + // transfer to other + if (mc.level.getBlockEntity(clbe.getBlockPos() + .offset(ridingConnection)) instanceof ChainLiftBlockEntity clbe2) { + chainPosition = clbe.wrapAngle(stats.tangentAngle() + 180 + 2 * 49 * (clbe.reversed ? -1 : 1)); + ridingChainLift = clbe2.getBlockPos(); + ridingConnection = null; + } + + return; + } + + float prevChainPosition = chainPosition; + chainPosition += serverSpeed * degreesPerTick; + chainPosition = clbe.wrapAngle(chainPosition); + + BlockPos nearestLooking = BlockPos.ZERO; + double bestDiff = Double.MAX_VALUE; + for (BlockPos connection : clbe.connections) { + double diff = Vec3.atLowerCornerOf(connection) + .normalize() + .distanceToSqr(mc.player.getLookAngle() + .normalize()); + if (diff > bestDiff) + continue; + nearestLooking = connection; + bestDiff = diff; + } + + if (nearestLooking == BlockPos.ZERO) + return; + + float offBranchAngle = clbe.connectionStats.get(nearestLooking) + .tangentAngle(); + if (!clbe.loopThresholdCrossed(chainPosition, prevChainPosition, offBranchAngle)) + return; + + chainPosition = 0; + ridingConnection = nearestLooking; + } + +} diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftRidingPacket.java b/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftRidingPacket.java new file mode 100644 index 0000000000..e42bd22029 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftRidingPacket.java @@ -0,0 +1,35 @@ +package com.simibubi.create.content.kinetics.chainLift; + +import com.simibubi.create.foundation.networking.BlockEntityConfigurationPacket; + +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.level.ServerPlayer; + +public class ChainLiftRidingPacket extends BlockEntityConfigurationPacket { + + public ChainLiftRidingPacket(BlockPos pos) { + super(pos); + } + + public ChainLiftRidingPacket(FriendlyByteBuf buffer) { + super(buffer); + } + + @Override + protected void writeSettings(FriendlyByteBuf buffer) {} + + @Override + protected void readSettings(FriendlyByteBuf buffer) {} + + @Override + protected void applySettings(ChainLiftBlockEntity be) {} + + @Override + protected void applySettings(ServerPlayer sender, ChainLiftBlockEntity be) { + sender.fallDistance = 0; + sender.connection.aboveGroundTickCount = 0; + sender.connection.aboveGroundVehicleTickCount = 0; + } + +} diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftRoutingTable.java b/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftRoutingTable.java new file mode 100644 index 0000000000..e7ceb17480 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftRoutingTable.java @@ -0,0 +1,97 @@ +package com.simibubi.create.content.kinetics.chainLift; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import org.apache.commons.lang3.mutable.MutableInt; + +import com.simibubi.create.content.logistics.box.PackageItem; + +import net.createmod.catnip.utility.lang.Components; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; + +public class ChainLiftRoutingTable { + + public static final int ENTRY_TIMEOUT = 100; + public static final int PORT_ENTRY_TIMEOUT = 20; + + public record RoutingTableEntry(String port, int distance, BlockPos nextConnection, MutableInt timeout, + boolean endOfRoute) { + + public void tick() { + timeout.decrement(); + } + + public boolean invalid() { + return timeout.intValue() <= 0; + } + + public RoutingTableEntry copyForNeighbour(BlockPos connection) { + return new RoutingTableEntry(port, distance + 1, connection.multiply(-1), new MutableInt(ENTRY_TIMEOUT), + false); + } + + } + + public List entriesByDistance = new ArrayList<>(); + public int lastUpdate; + public boolean changed; + + public void tick() { + entriesByDistance.forEach(RoutingTableEntry::tick); + changed |= entriesByDistance.removeIf(RoutingTableEntry::invalid); + lastUpdate++; + } + + public boolean shouldAdvertise() { + return changed || lastUpdate > ENTRY_TIMEOUT - 20; + } + + public void receivePortInfo(String filter, BlockPos connection) { + insert(new RoutingTableEntry(filter, 0, connection, new MutableInt(PORT_ENTRY_TIMEOUT), true)); + } + + public BlockPos getExitFor(ItemStack box) { + for (RoutingTableEntry entry : entriesByDistance) + if (PackageItem.matchAddress(box, entry.port())) + return entry.nextConnection(); + return BlockPos.ZERO; + } + + public void advertiseTo(BlockPos connection, ChainLiftRoutingTable otherTable) { + BlockPos backConnection = connection.multiply(-1); + for (RoutingTableEntry entry : entriesByDistance) + if (entry.endOfRoute() || !connection.equals(entry.nextConnection())) + otherTable.insert(entry.copyForNeighbour(connection)); + otherTable.entriesByDistance.removeIf(e -> e.timeout() + .intValue() < ENTRY_TIMEOUT && !e.endOfRoute() && backConnection.equals(e.nextConnection())); + } + + private void insert(RoutingTableEntry entry) { + int targetIndex = 0; + for (int i = 0; i < entriesByDistance.size(); i++) { + RoutingTableEntry otherEntry = entriesByDistance.get(i); + if (otherEntry.distance() > entry.distance()) + break; + if (otherEntry.port() + .equals(entry.port())) { + otherEntry.timeout.setValue(ENTRY_TIMEOUT); + return; + } + targetIndex = i + 1; + } + entriesByDistance.add(targetIndex, entry); + changed = true; + } + + public Collection createSummary() { + ArrayList list = new ArrayList<>(); + for (RoutingTableEntry entry : entriesByDistance) + list.add(Components.literal(" [" + entry.distance() + "] " + entry.port())); + return list; + } + +} diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftShape.java b/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftShape.java new file mode 100644 index 0000000000..66b111232f --- /dev/null +++ b/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftShape.java @@ -0,0 +1,158 @@ +package com.simibubi.create.content.kinetics.chainLift; + +import javax.annotation.Nullable; + +import net.createmod.catnip.CatnipClient; +import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.theme.Color; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction.Axis; +import net.minecraft.util.Mth; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; + +public abstract class ChainLiftShape { + + @Nullable + public abstract Vec3 intersect(Vec3 from, Vec3 to); + + public abstract float getChainPosition(Vec3 intersection); + + public abstract void drawOutline(BlockPos anchor); + + public abstract void drawPoint(BlockPos anchor, float position); + + public static class ChainLiftOBB extends ChainLiftShape { + + BlockPos connection; + double yaw, pitch; + AABB bounds; + Vec3 pivot; + final double radius = 0.25; + + Vec3[] linePoints; + + public ChainLiftOBB(BlockPos connection, Vec3 start, Vec3 end) { + this.connection = connection; + Vec3 diff = end.subtract(start); + double d = diff.length(); + double dxz = diff.multiply(1, 0, 1) + .length(); + yaw = Mth.RAD_TO_DEG * Mth.atan2(diff.x, diff.z); + pitch = Mth.RAD_TO_DEG * Mth.atan2(-diff.y, dxz); + bounds = new AABB(start, start).expandTowards(new Vec3(0, 0, d)) + .inflate(radius, radius, 0); + pivot = start; + } + + @Override + public Vec3 intersect(Vec3 from, Vec3 to) { + from = counterTransform(from); + to = counterTransform(to); + + Vec3 result = bounds.clip(from, to) + .orElse(null); + if (result == null) + return null; + + result = transform(result); + return result; + } + + private Vec3 counterTransform(Vec3 from) { + from = from.subtract(pivot); + from = VecHelper.rotate(from, -yaw, Axis.Y); + from = VecHelper.rotate(from, -pitch, Axis.X); + from = from.add(pivot); + return from; + } + + private Vec3 transform(Vec3 result) { + result = result.subtract(pivot); + result = VecHelper.rotate(result, pitch, Axis.X); + result = VecHelper.rotate(result, yaw, Axis.Y); + result = result.add(pivot); + return result; + } + + @Override + public void drawOutline(BlockPos anchor) { + int key = 0; + for (double x : new double[] { bounds.minX, bounds.maxX }) { + for (double y : new double[] { bounds.minY, bounds.maxY }) { + Vec3 from = transform(new Vec3(x, y, bounds.minZ)); + Vec3 to = transform(new Vec3(x, y, bounds.maxZ)); + from = from.add(Vec3.atLowerCornerOf(anchor)); + to = to.add(Vec3.atLowerCornerOf(anchor)); + CatnipClient.OUTLINER.showLine(Pair.of(Pair.of(anchor, bounds), "c" + key++), from, to) + .colored(Color.WHITE); + } + } + } + + @Override + public float getChainPosition(Vec3 intersection) { + return (float) Math.min(bounds.getZsize(), intersection.distanceTo(pivot)); + } + + @Override + public void drawPoint(BlockPos anchor, float position) { + float x = (float) bounds.getCenter().x; + float y = (float) bounds.getCenter().y; + Vec3 from = new Vec3(x, y, bounds.minZ); + Vec3 to = new Vec3(x, y, bounds.maxZ); + Vec3 point = from.lerp(to, Mth.clamp(position / from.distanceTo(to), 0, 1)); + point = transform(point); + CatnipClient.OUTLINER.chaseAABB("ChainPointSelection", new AABB(point, point).move(anchor) + .inflate(0, .175, 0)) + .colored(Color.WHITE) + .lineWidth(1 / 8f); + } + } + + public static class ChainLiftBB extends ChainLiftShape { + + Vec3 lb, rb; + final double radius = 1; + AABB bounds; + + public ChainLiftBB(Vec3 center) { + lb = center.add(0, 0, 0); + rb = center.add(0, 0.5, 0); + bounds = new AABB(lb, rb).inflate(radius, 0, radius); + } + + @Override + public Vec3 intersect(Vec3 from, Vec3 to) { + return bounds.clip(from, to) + .orElse(null); + } + + @Override + public void drawOutline(BlockPos anchor) { + CatnipClient.OUTLINER.showAABB(anchor, bounds.move(anchor)) + .colored(Color.WHITE); + } + + @Override + public float getChainPosition(Vec3 intersection) { + Vec3 diff = bounds.getCenter() + .subtract(intersection); + float angle = (float) (Mth.RAD_TO_DEG * Mth.atan2(diff.x, diff.z) + 360 + 180) % 360; + return angle; + } + + @Override + public void drawPoint(BlockPos anchor, float position) { + Vec3 point = bounds.getCenter(); + point = point.add(VecHelper.rotate(new Vec3(0, 0, radius), position, Axis.Y)); + CatnipClient.OUTLINER.chaseAABB("ChainPointSelection", new AABB(point, point).move(anchor) + .inflate(0, .175, 0)) + .colored(Color.WHITE) + .lineWidth(1 / 8f); + } + + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java index e6da337530..204f842619 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java @@ -7,7 +7,6 @@ import javax.annotation.Nullable; import com.simibubi.create.AllEntityTypes; import com.simibubi.create.AllPackets; -import com.simibubi.create.Create; import com.simibubi.create.content.logistics.chute.ChuteBlock; import net.createmod.catnip.utility.VecHelper; @@ -94,6 +93,14 @@ public class PackageEntity extends LivingEntity implements IEntityAdditionalSpaw return packageEntity; } + public static PackageEntity fromItemStack(Level world, Vec3 position, ItemStack itemstack) { + PackageEntity packageEntity = AllEntityTypes.PACKAGE.get() + .create(world); + packageEntity.setPos(position); + packageEntity.setBox(itemstack); + return packageEntity; + } + @Override public ItemStack getPickedResult(HitResult target) { return box.copy(); @@ -245,7 +252,7 @@ public class PackageEntity extends LivingEntity implements IEntityAdditionalSpaw return super.interact(pPlayer, pHand); pPlayer.setItemInHand(pHand, box); level().playSound(null, blockPosition(), SoundEvents.ITEM_PICKUP, SoundSource.PLAYERS, .2f, - .75f + Create.RANDOM.nextFloat()); + .75f + level().random.nextFloat()); remove(RemovalReason.DISCARDED); return InteractionResult.SUCCESS; } diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java index e7e6473cd6..e910145def 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java @@ -121,7 +121,10 @@ public class PackageItem extends Item { } public static boolean matchAddress(ItemStack box, String address) { - String boxAddress = getAddress(box); + return matchAddress(getAddress(box), address); + } + + public static boolean matchAddress(String boxAddress, String address) { if (address.isBlank()) return boxAddress.isBlank(); if (address.equals("*") || boxAddress.equals("*")) diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlock.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlock.java new file mode 100644 index 0000000000..0fc8f497f4 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlock.java @@ -0,0 +1,26 @@ +package com.simibubi.create.content.logistics.packagePort; + +import com.simibubi.create.AllBlockEntityTypes; +import com.simibubi.create.content.equipment.wrench.IWrenchable; +import com.simibubi.create.foundation.block.IBE; + +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntityType; + +public class PackagePortBlock extends Block implements IBE, IWrenchable { + + public PackagePortBlock(Properties pProperties) { + super(pProperties); + } + + @Override + public Class getBlockEntityClass() { + return PackagePortBlockEntity.class; + } + + @Override + public BlockEntityType getBlockEntityType() { + return AllBlockEntityTypes.PACKAGE_PORT.get(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java new file mode 100644 index 0000000000..4a8fe45acc --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java @@ -0,0 +1,92 @@ +package com.simibubi.create.content.logistics.packagePort; + +import java.util.List; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import com.simibubi.create.AllItems; +import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; +import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; +import com.simibubi.create.foundation.blockEntity.behaviour.filtering.FilteringBehaviour; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.items.IItemHandler; + +public class PackagePortBlockEntity extends SmartBlockEntity { + + public FilteringBehaviour filtering; + public PackagePortTarget target; + public PackagePortInventory inventory; + private LazyOptional itemHandler; + + public PackagePortBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { + super(type, pos, state); + inventory = new PackagePortInventory(this); + itemHandler = LazyOptional.of(() -> inventory); + } + + @Override + public void addBehaviours(List behaviours) { + behaviours.add(filtering = new FilteringBehaviour(this, new PackagePortFilterSlotPositioning()) + .withPredicate(AllItems.PACKAGE_FILTER::isIn) + .withCallback(this::filterChanged)); + } + + @Override + public AABB getRenderBoundingBox() { + return super.getRenderBoundingBox().expandTowards(0, 1, 0); + } + + @Override + public @NotNull LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction side) { + if (isItemHandlerCap(cap)) + return itemHandler.cast(); + return super.getCapability(cap, side); + } + + private void filterChanged(ItemStack filter) { + if (target != null) { + target.deregister(this, level, worldPosition); + target.register(this, level, worldPosition); + } + } + + @Override + public void lazyTick() { + super.lazyTick(); + if (target != null) + target.register(this, level, worldPosition); + } + + @Override + public void destroy() { + super.destroy(); + if (target != null) + target.deregister(this, level, worldPosition); + } + + @Override + protected void write(CompoundTag tag, boolean clientPacket) { + super.write(tag, clientPacket); + if (target != null) + tag.put("Target", target.write()); + tag.put("Inventory", inventory.serializeNBT()); + } + + @Override + protected void read(CompoundTag tag, boolean clientPacket) { + super.read(tag, clientPacket); + target = PackagePortTarget.read(tag.getCompound("Target")); + inventory.deserializeNBT(tag.getCompound("Inventory")); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortFilterSlotPositioning.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortFilterSlotPositioning.java new file mode 100644 index 0000000000..544309a1d7 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortFilterSlotPositioning.java @@ -0,0 +1,33 @@ +package com.simibubi.create.content.logistics.packagePort; + +import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform; + +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.math.AngleHelper; +import net.minecraft.core.Direction; +import net.minecraft.core.Direction.Axis; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; + +public class PackagePortFilterSlotPositioning extends ValueBoxTransform.Sided { + + @Override + public Vec3 getLocalOffset(BlockState state) { + Direction side = getSide(); + float horizontalAngle = AngleHelper.horizontalAngle(side); + Vec3 southLocation = VecHelper.voxelSpace(8, 4, 15.5f); + return VecHelper.rotateCentered(southLocation, horizontalAngle, Axis.Y); + } + + @Override + protected boolean isSideActive(BlockState state, Direction direction) { + return direction.getAxis() + .isHorizontal(); + } + + @Override + protected Vec3 getSouthLocation() { + return Vec3.ZERO; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortInventory.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortInventory.java new file mode 100644 index 0000000000..adaf67f1af --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortInventory.java @@ -0,0 +1,49 @@ +package com.simibubi.create.content.logistics.packagePort; + +import org.jetbrains.annotations.NotNull; + +import com.simibubi.create.content.logistics.box.PackageItem; + +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.items.ItemStackHandler; + +public class PackagePortInventory extends ItemStackHandler { + + private boolean receiveMode; + private PackagePortBlockEntity port; + + public PackagePortInventory(PackagePortBlockEntity port) { + super(9); + this.port = port; + receiveMode = false; + } + + public void receiveMode(boolean enable) { + receiveMode = enable; + } + + @Override + public @NotNull ItemStack insertItem(int slot, @NotNull ItemStack stack, boolean simulate) { + if (!(stack.getItem() instanceof PackageItem)) + return stack; + if (receiveMode) + return super.insertItem(slot, stack, simulate); + + PackagePortTarget target = port.target; + if (target == null) + return stack; + if (!target.export(port.getLevel(), port.getBlockPos(), stack, simulate)) + return stack; + + return ItemStack.EMPTY; + } + + @Override + public @NotNull ItemStack extractItem(int slot, int amount, boolean simulate) { + ItemStack extractItem = super.extractItem(slot, amount, simulate); + if (!simulate && !extractItem.isEmpty()) + port.notifyUpdate(); + return extractItem; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortItem.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortItem.java new file mode 100644 index 0000000000..07a107e49f --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortItem.java @@ -0,0 +1,30 @@ +package com.simibubi.create.content.logistics.packagePort; + +import com.simibubi.create.AllPackets; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.network.PacketDistributor; + +public class PackagePortItem extends BlockItem { + + public PackagePortItem(Block pBlock, Properties pProperties) { + super(pBlock, pProperties); + } + + @Override + protected boolean updateCustomBlockEntityTag(BlockPos pos, Level world, Player player, ItemStack p_195943_4_, + BlockState p_195943_5_) { + if (!world.isClientSide && player instanceof ServerPlayer sp) + AllPackets.getChannel() + .send(PacketDistributor.PLAYER.with(() -> sp), new PackagePortPlacementPacket.ClientBoundRequest(pos)); + return super.updateCustomBlockEntityTag(pos, world, player, p_195943_4_, p_195943_5_); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortPlacementPacket.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortPlacementPacket.java new file mode 100644 index 0000000000..83c08c38a7 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortPlacementPacket.java @@ -0,0 +1,80 @@ +package com.simibubi.create.content.logistics.packagePort; + +import com.simibubi.create.foundation.networking.SimplePacketBase; + +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.DistExecutor; +import net.minecraftforge.network.NetworkEvent.Context; + +public class PackagePortPlacementPacket extends SimplePacketBase { + + private PackagePortTarget target; + private BlockPos pos; + + public PackagePortPlacementPacket(PackagePortTarget target, BlockPos pos) { + this.target = target; + this.pos = pos; + } + + public PackagePortPlacementPacket(FriendlyByteBuf buffer) { + target = PackagePortTarget.read(buffer.readNbt()); + pos = buffer.readBlockPos(); + } + + @Override + public void write(FriendlyByteBuf buffer) { + buffer.writeNbt(target.write()); + buffer.writeBlockPos(pos); + } + + @Override + public boolean handle(Context context) { + context.enqueueWork(() -> { + ServerPlayer player = context.getSender(); + if (player == null) + return; + Level world = player.level(); + if (world == null || !world.isLoaded(pos)) + return; + BlockEntity blockEntity = world.getBlockEntity(pos); + if (!(blockEntity instanceof PackagePortBlockEntity ppbe)) + return; + target.setup(ppbe, world, pos); + ppbe.target = target; + ppbe.notifyUpdate(); + }); + return true; + } + + public static class ClientBoundRequest extends SimplePacketBase { + + BlockPos pos; + + public ClientBoundRequest(BlockPos pos) { + this.pos = pos; + } + + public ClientBoundRequest(FriendlyByteBuf buffer) { + this.pos = buffer.readBlockPos(); + } + + @Override + public void write(FriendlyByteBuf buffer) { + buffer.writeBlockPos(pos); + } + + @Override + public boolean handle(Context context) { + context.enqueueWork(() -> DistExecutor.unsafeRunWhenOn(Dist.CLIENT, + () -> () -> PackagePortTargetSelectionHandler.flushSettings(pos))); + return true; + } + + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortRenderer.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortRenderer.java new file mode 100644 index 0000000000..d53e9b5277 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortRenderer.java @@ -0,0 +1,40 @@ +package com.simibubi.create.content.logistics.packagePort; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.AllPartialModels; +import com.simibubi.create.foundation.blockEntity.renderer.SmartBlockEntityRenderer; + +import net.createmod.catnip.render.CachedBuffers; +import net.createmod.catnip.render.SuperByteBuffer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider.Context; + +public class PackagePortRenderer extends SmartBlockEntityRenderer { + + public PackagePortRenderer(Context context) { + super(context); + } + + @Override + protected void renderSafe(PackagePortBlockEntity blockEntity, float partialTicks, PoseStack ms, + MultiBufferSource buffer, int light, int overlay) { + super.renderSafe(blockEntity, partialTicks, ms, buffer, light, overlay); + + for (int i = 0; i < 3; i++) { + SuperByteBuffer tube = + CachedBuffers.partial(AllPartialModels.PACKAGE_PORT_TUBE, blockEntity.getBlockState()); + tube.light(light) + .translate(0, (i * 3 + 8.5f) / 16f, 0) + .overlay(overlay) + .renderInto(ms, buffer.getBuffer(RenderType.solid())); + } + + SuperByteBuffer cap = CachedBuffers.partial(AllPartialModels.PACKAGE_PORT_CAP, blockEntity.getBlockState()); + cap.light(light) + .translate(0, 15 / 16f, 0) + .overlay(overlay) + .renderInto(ms, buffer.getBuffer(RenderType.cutoutMipped())); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTarget.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTarget.java new file mode 100644 index 0000000000..888452f56c --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTarget.java @@ -0,0 +1,183 @@ +package com.simibubi.create.content.logistics.packagePort; + +import java.util.Map; + +import javax.annotation.Nullable; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllItems; +import com.simibubi.create.content.kinetics.chainLift.ChainLiftBlockEntity; +import com.simibubi.create.content.kinetics.chainLift.ChainLiftBlockEntity.ConnectedPort; +import com.simibubi.create.content.kinetics.chainLift.ChainLiftBlockEntity.ConnectionStats; +import com.simibubi.create.content.kinetics.chainLift.ChainLiftPackage; +import com.simibubi.create.content.logistics.filter.FilterItemStack; +import com.simibubi.create.content.logistics.filter.FilterItemStack.PackageFilterItemStack; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.entity.BlockEntity; + +public abstract class PackagePortTarget { + + public BlockPos relativePos; + private String typeKey; + + public PackagePortTarget(String typeKey, BlockPos relativePos) { + this.typeKey = typeKey; + this.relativePos = relativePos; + } + + public abstract boolean export(LevelAccessor level, BlockPos portPos, ItemStack box, boolean simulate); + + public void setup(PackagePortBlockEntity ppbe, LevelAccessor level, BlockPos portPos) {} + + public void register(PackagePortBlockEntity ppbe, LevelAccessor level, BlockPos portPos) {} + + public void deregister(PackagePortBlockEntity ppbe, LevelAccessor level, BlockPos portPos) {} + + public CompoundTag write() { + CompoundTag compoundTag = new CompoundTag(); + writeInternal(compoundTag); + compoundTag.putString("Type", typeKey); + compoundTag.put("RelativePos", NbtUtils.writeBlockPos(relativePos)); + return compoundTag; + } + + public static PackagePortTarget read(CompoundTag tag) { + if (tag.isEmpty()) + return null; + + BlockPos relativePos = NbtUtils.readBlockPos(tag.getCompound("RelativePos")); + PackagePortTarget target = switch (tag.getString("Type")) { + + case "ChainLift" -> new ChainLiftPortTarget(relativePos, 0, null); + + default -> null; + }; + target.readInternal(tag); + return target; + } + + protected abstract void writeInternal(CompoundTag tag); + + protected abstract void readInternal(CompoundTag tag); + + protected BlockEntity be(LevelAccessor level, BlockPos portPos) { + return level.getBlockEntity(portPos.offset(relativePos)); + } + + public static class ChainLiftPortTarget extends PackagePortTarget { + + public float chainPos; + public BlockPos connection; + public boolean flipped; + + public ChainLiftPortTarget(BlockPos relativePos, float chainPos, @Nullable BlockPos connection) { + super("ChainLift", relativePos); + this.chainPos = chainPos; + this.connection = connection; + } + + @Override + public void setup(PackagePortBlockEntity ppbe, LevelAccessor level, BlockPos portPos) { + if (be(level, portPos) instanceof ChainLiftBlockEntity clbe) + flipped = clbe.getSpeed() < 0; + } + + @Override + public boolean export(LevelAccessor level, BlockPos portPos, ItemStack box, boolean simulate) { + if (!(be(level, portPos) instanceof ChainLiftBlockEntity clbe)) + return false; + if (simulate) + return true; + ChainLiftPackage box2 = new ChainLiftPackage(chainPos, box.copy()); + if (connection == null) + return clbe.addLoopingPackage(box2); + return clbe.addTravellingPackage(box2, connection); + } + + @Override + public void register(PackagePortBlockEntity ppbe, LevelAccessor level, BlockPos portPos) { + if (!(be(level, portPos) instanceof ChainLiftBlockEntity clbe)) + return; + ChainLiftBlockEntity actualBe = clbe; + + // Jump to opposite chain if motion reversed + if (connection != null && clbe.getSpeed() < 0 != flipped) { + deregister(ppbe, level, portPos); + actualBe = AllBlocks.CHAIN_LIFT.get() + .getBlockEntity(level, clbe.getBlockPos() + .offset(connection)); + if (actualBe == null) + return; + clbe.prepareStats(); + ConnectionStats stats = clbe.connectionStats.get(connection); + if (stats != null) + chainPos = stats.chainLength() - chainPos; + connection = connection.multiply(-1); + flipped = !flipped; + relativePos = actualBe.getBlockPos() + .subtract(portPos); + ppbe.notifyUpdate(); + } + + if (connection != null && !actualBe.connections.contains(connection)) + return; + String portFilter = getFilterString(ppbe); + if (portFilter == null) + return; + actualBe.routingTable.receivePortInfo(portFilter, connection == null ? BlockPos.ZERO : connection); + Map portMap = connection == null ? actualBe.loopPorts : actualBe.travelPorts; + portMap.put(relativePos.multiply(-1), new ConnectedPort(chainPos, connection, portFilter)); + } + + @Override + public void deregister(PackagePortBlockEntity ppbe, LevelAccessor level, BlockPos portPos) { + if (!(be(level, portPos) instanceof ChainLiftBlockEntity clbe)) + return; + clbe.loopPorts.remove(relativePos.multiply(-1)); + clbe.travelPorts.remove(relativePos.multiply(-1)); + String portFilter = getFilterString(ppbe); + if (portFilter == null) + return; + clbe.routingTable.entriesByDistance.removeIf(e -> e.endOfRoute() && e.port() + .equals(portFilter)); + clbe.routingTable.changed = true; + } + + private String getFilterString(PackagePortBlockEntity ppbe) { + ItemStack filter = ppbe.filtering.getFilter(); + String portFilter = null; + FilterItemStack filterStack = FilterItemStack.of(filter); + if (AllItems.PACKAGE_FILTER.isIn(filter)) { + if (!(filterStack instanceof PackageFilterItemStack pfis)) + return ""; + portFilter = pfis.filterString; + } + return portFilter; + } + + @Override + protected void writeInternal(CompoundTag tag) { + tag.putFloat("ChainPos", chainPos); + if (connection != null) { + tag.put("Connection", NbtUtils.writeBlockPos(connection)); + tag.putBoolean("Flipped", flipped); + } + } + + @Override + protected void readInternal(CompoundTag tag) { + chainPos = tag.getFloat("ChainPos"); + if (tag.contains("Connection")) { + connection = NbtUtils.readBlockPos(tag.getCompound("Connection")); + flipped = tag.getBoolean("Flipped"); + } + } + + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTargetSelectionHandler.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTargetSelectionHandler.java new file mode 100644 index 0000000000..6ea6d5d4e7 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTargetSelectionHandler.java @@ -0,0 +1,22 @@ +package com.simibubi.create.content.logistics.packagePort; + +import com.simibubi.create.AllPackets; + +import net.minecraft.core.BlockPos; + +public class PackagePortTargetSelectionHandler { + + public static PackagePortTarget activePackageTarget; + + public static void flushSettings(BlockPos pos) { + if (activePackageTarget == null) + return; + + activePackageTarget.relativePos = activePackageTarget.relativePos.subtract(pos); + AllPackets.getChannel() + .sendToServer(new PackagePortPlacementPacket(activePackageTarget, pos)); + activePackageTarget = null; + return; + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java b/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java index 09b81a3ce2..05481992a8 100644 --- a/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java @@ -29,6 +29,8 @@ import com.simibubi.create.content.equipment.zapper.ZapperItem; import com.simibubi.create.content.equipment.zapper.terrainzapper.WorldshaperRenderHandler; import com.simibubi.create.content.kinetics.KineticDebugger; import com.simibubi.create.content.kinetics.belt.item.BeltConnectorHandler; +import com.simibubi.create.content.kinetics.chainLift.ChainLiftInteractionHandler; +import com.simibubi.create.content.kinetics.chainLift.ChainLiftRidingHandler; import com.simibubi.create.content.kinetics.fan.AirCurrent; import com.simibubi.create.content.kinetics.mechanicalArm.ArmInteractionPointHandler; import com.simibubi.create.content.kinetics.turntable.TurntableHandler; @@ -118,7 +120,6 @@ public class ClientEvents { } SoundScapes.tick(); - AnimationTickHolder.tick(); CreateClient.SCHEMATIC_SENDER.tick(); CreateClient.SCHEMATIC_AND_QUILL_HANDLER.tick(); @@ -167,6 +168,8 @@ public class ClientEvents { CreateClient.VALUE_SETTINGS_HANDLER.tick(); ScrollValueHandler.tick(); NetheriteBacktankFirstPersonRenderer.clientTick(); + ChainLiftInteractionHandler.clientTick(); + ChainLiftRidingHandler.clientTick(); } @SubscribeEvent diff --git a/src/main/java/com/simibubi/create/foundation/events/InputEvents.java b/src/main/java/com/simibubi/create/foundation/events/InputEvents.java index f5a524fcb9..e1a967804c 100644 --- a/src/main/java/com/simibubi/create/foundation/events/InputEvents.java +++ b/src/main/java/com/simibubi/create/foundation/events/InputEvents.java @@ -3,6 +3,7 @@ package com.simibubi.create.foundation.events; import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.elevator.ElevatorControlsHandler; import com.simibubi.create.content.equipment.toolbox.ToolboxHandlerClient; +import com.simibubi.create.content.kinetics.chainLift.ChainLiftInteractionHandler; import com.simibubi.create.content.redstone.link.controller.LinkedControllerClientHandler; import com.simibubi.create.content.trains.TrainHUD; import com.simibubi.create.content.trains.entity.TrainRelocator; @@ -86,6 +87,9 @@ public class InputEvents { LinkedControllerClientHandler.deactivateInLectern(); TrainRelocator.onClicked(event); + + if (ChainLiftInteractionHandler.onUse()) + event.setCanceled(true); } } diff --git a/src/main/resources/assets/create/models/block/chain_lift/block.json b/src/main/resources/assets/create/models/block/chain_lift/block.json new file mode 100644 index 0000000000..78c3956758 --- /dev/null +++ b/src/main/resources/assets/create/models/block/chain_lift/block.json @@ -0,0 +1,226 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "4": "create:block/gearbox", + "5": "create:block/secondary_linear_chassis_side", + "particle": "create:block/andesite_casing", + "casing": "create:block/andesite_casing", + "side": "create:block/andesite_encased_cogwheel_side" + }, + "elements": [ + { + "from": [0, 1, 0], + "to": [16, 6, 16], + "faces": { + "north": {"uv": [0, 10, 16, 15], "texture": "#5"}, + "east": {"uv": [0, 10, 16, 15], "texture": "#5"}, + "south": {"uv": [0, 10, 16, 15], "texture": "#5"}, + "west": {"uv": [0, 10, 16, 15], "texture": "#5"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#4"} + } + }, + { + "from": [0, 10, 0], + "to": [16, 15, 16], + "faces": { + "north": {"uv": [0, 1, 16, 6], "texture": "#side"}, + "east": {"uv": [0, 1, 16, 6], "texture": "#side"}, + "south": {"uv": [0, 1, 16, 6], "texture": "#side"}, + "west": {"uv": [0, 1, 16, 6], "texture": "#side"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#4"} + } + }, + { + "from": [0, 15, 0], + "to": [16, 16, 2], + "faces": { + "north": {"uv": [0, 0, 16, 1], "texture": "#side"}, + "east": {"uv": [14, 0, 16, 1], "texture": "#side"}, + "south": {"uv": [0, 0, 16, 1], "texture": "#casing"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#side"}, + "up": {"uv": [0, 0, 16, 2], "texture": "#casing"} + } + }, + { + "from": [0, 15, 14], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [0, 0, 16, 1], "texture": "#casing"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#side"}, + "south": {"uv": [0, 0, 16, 1], "texture": "#side"}, + "west": {"uv": [14, 0, 16, 1], "texture": "#side"}, + "up": {"uv": [0, 14, 16, 16], "texture": "#casing"} + } + }, + { + "from": [0, 15, 2], + "to": [2, 16, 14], + "faces": { + "east": {"uv": [2, 0, 14, 1], "texture": "#casing"}, + "west": {"uv": [2, 0, 14, 1], "texture": "#side"}, + "up": {"uv": [0, 2, 2, 14], "texture": "#casing"} + } + }, + { + "from": [14, 15, 2], + "to": [16, 16, 14], + "faces": { + "east": {"uv": [2, 0, 14, 1], "texture": "#side"}, + "west": {"uv": [2, 0, 14, 1], "texture": "#casing"}, + "up": {"uv": [14, 2, 16, 14], "texture": "#casing"} + } + }, + { + "from": [0, 0, 0], + "to": [16, 1, 2], + "faces": { + "north": {"uv": [0, 15, 16, 16], "texture": "#side"}, + "east": {"uv": [14, 15, 16, 16], "texture": "#side"}, + "south": {"uv": [0, 0, 16, 1], "texture": "#casing"}, + "west": {"uv": [0, 15, 2, 16], "texture": "#side"}, + "down": {"uv": [0, 14, 16, 16], "texture": "#casing"} + } + }, + { + "from": [14, 0, 2], + "to": [16, 1, 14], + "faces": { + "east": {"uv": [2, 15, 14, 16], "texture": "#side"}, + "west": {"uv": [2, 0, 14, 1], "texture": "#casing"}, + "down": {"uv": [14, 2, 16, 14], "texture": "#casing"} + } + }, + { + "from": [0, 0, 14], + "to": [16, 1, 16], + "faces": { + "north": {"uv": [0, 0, 16, 1], "texture": "#casing"}, + "east": {"uv": [0, 15, 2, 16], "texture": "#side"}, + "south": {"uv": [0, 15, 16, 16], "texture": "#side"}, + "west": {"uv": [14, 15, 16, 16], "texture": "#side"}, + "down": {"uv": [0, 0, 16, 2], "texture": "#casing"} + } + }, + { + "from": [0, 0, 2], + "to": [2, 1, 14], + "faces": { + "east": {"uv": [2, 0, 14, 1], "texture": "#casing"}, + "west": {"uv": [2, 15, 14, 16], "texture": "#side"}, + "down": {"uv": [0, 2, 2, 14], "texture": "#casing"} + } + }, + { + "from": [1, 1.95, 8], + "to": [15, 14.05, 26], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "east": {"uv": [0, 2, 16, 14], "texture": "#5"}, + "south": {"uv": [2, 2, 16, 14], "texture": "#5"}, + "west": {"uv": [0, 2, 16, 14], "texture": "#5"}, + "up": {"uv": [0, 15, 16, 1], "rotation": 270, "texture": "#casing"}, + "down": {"uv": [0, 15, 16, 1], "rotation": 270, "texture": "#casing"} + } + }, + { + "from": [-10, 1.95, 1], + "to": [8, 14.05, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 2, 16, 14], "texture": "#5"}, + "south": {"uv": [0, 2, 16, 14], "texture": "#5"}, + "west": {"uv": [2, 2, 16, 14], "texture": "#5"}, + "up": {"uv": [0, 15, 16, 1], "texture": "#casing"}, + "down": {"uv": [0, 15, 16, 1], "rotation": 180, "texture": "#casing"} + } + }, + { + "from": [1, 1.95, -10], + "to": [15, 14.05, 8], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [2, 2, 16, 14], "texture": "#5"}, + "east": {"uv": [0, 2, 16, 14], "texture": "#5"}, + "west": {"uv": [0, 2, 16, 14], "texture": "#5"}, + "up": {"uv": [0, 15, 16, 1], "rotation": 90, "texture": "#casing"}, + "down": {"uv": [0, 15, 16, 1], "rotation": 90, "texture": "#casing"} + } + }, + { + "from": [8, 1.95, 1], + "to": [26, 14.05, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 2, 16, 14], "texture": "#5"}, + "east": {"uv": [2, 2, 16, 14], "texture": "#5"}, + "south": {"uv": [0, 2, 16, 14], "texture": "#5"}, + "up": {"uv": [0, 15, 16, 1], "rotation": 180, "texture": "#casing"}, + "down": {"uv": [0, 15, 16, 1], "texture": "#casing"} + } + }, + { + "from": [1, 2, 8], + "to": [15, 14, 26], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "east": {"uv": [0, 2, 16, 14], "texture": "#5"}, + "south": {"uv": [2, 2, 16, 14], "texture": "#5"}, + "west": {"uv": [0, 2, 16, 14], "texture": "#5"}, + "up": {"uv": [0, 15, 16, 1], "rotation": 270, "texture": "#casing"}, + "down": {"uv": [0, 15, 16, 1], "rotation": 270, "texture": "#casing"} + } + }, + { + "from": [-10, 2, 1], + "to": [8, 14, 15], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 2, 16, 14], "texture": "#5"}, + "south": {"uv": [0, 2, 16, 14], "texture": "#5"}, + "west": {"uv": [2, 2, 16, 14], "texture": "#5"}, + "up": {"uv": [0, 15, 16, 1], "texture": "#casing"}, + "down": {"uv": [0, 15, 16, 1], "rotation": 180, "texture": "#casing"} + } + }, + { + "from": [1, 2, -10], + "to": [15, 14, 8], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [2, 2, 16, 14], "texture": "#5"}, + "east": {"uv": [0, 2, 16, 14], "texture": "#5"}, + "west": {"uv": [0, 2, 16, 14], "texture": "#5"}, + "up": {"uv": [0, 15, 16, 1], "rotation": 90, "texture": "#casing"}, + "down": {"uv": [0, 15, 16, 1], "rotation": 90, "texture": "#casing"} + } + }, + { + "from": [8, 2, 1], + "to": [26, 14, 15], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 2, 16, 14], "texture": "#5"}, + "east": {"uv": [2, 2, 16, 14], "texture": "#5"}, + "south": {"uv": [0, 2, 16, 14], "texture": "#5"}, + "up": {"uv": [0, 15, 16, 1], "rotation": 180, "texture": "#casing"}, + "down": {"uv": [0, 15, 16, 1], "texture": "#casing"} + } + } + ], + "groups": [ + { + "name": "block_top_bottom", + "origin": [8, 8, 8], + "color": 0, + "children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] + }, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17 + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/chain_lift/guard.json b/src/main/resources/assets/create/models/block/chain_lift/guard.json new file mode 100644 index 0000000000..c70e91f9fb --- /dev/null +++ b/src/main/resources/assets/create/models/block/chain_lift/guard.json @@ -0,0 +1,62 @@ +{ + "credit": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)", + "parent": "block/block", + "textures": { + "7": "create:block/girder_pole", + "particle": "create:block/axis" + }, + "elements": [ + { + "from": [18, -2.55, 4], + "to": [22.05, 5.5, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 4]}, + "faces": { + "north": {"uv": [8, 12, 0, 8], "rotation": 90, "texture": "#7"}, + "east": {"uv": [8, 12, 0, 0], "rotation": 90, "texture": "#7"}, + "south": {"uv": [8, 12, 0, 8], "rotation": 90, "texture": "#7"}, + "west": {"uv": [8, 0, 0, 12], "rotation": 90, "texture": "#7"}, + "up": {"uv": [1, 12, 0, 0], "texture": "#7"}, + "down": {"uv": [1, 12, 0, 0], "rotation": 180, "texture": "#7"} + } + }, + { + "from": [17, -3, 12], + "to": [23, 3, 20], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 5]}, + "faces": { + "north": {"uv": [15, 1, 9, 7], "texture": "#7"}, + "east": {"uv": [7, 12, 1, 4], "rotation": 90, "texture": "#7"}, + "south": {"uv": [9, 1, 15, 7], "rotation": 180, "texture": "#7"}, + "west": {"uv": [1, 12, 7, 4], "rotation": 270, "texture": "#7"}, + "up": {"uv": [7, 4, 1, 12], "rotation": 180, "texture": "#7"}, + "down": {"uv": [7, 4, 1, 12], "texture": "#7"} + } + }, + { + "from": [-6.05, -2.55, 4], + "to": [-2, 5.5, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 4]}, + "faces": { + "north": {"uv": [8, 8, 0, 12], "rotation": 90, "texture": "#7"}, + "east": {"uv": [8, 12, 0, 0], "rotation": 90, "texture": "#7"}, + "south": {"uv": [8, 8, 0, 12], "rotation": 90, "texture": "#7"}, + "west": {"uv": [8, 0, 0, 12], "rotation": 90, "texture": "#7"}, + "up": {"uv": [0, 12, 1, 0], "texture": "#7"}, + "down": {"uv": [0, 12, 1, 0], "rotation": 180, "texture": "#7"} + } + }, + { + "from": [-7, -3, 12], + "to": [-1, 3, 20], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 5]}, + "faces": { + "north": {"uv": [9, 1, 15, 7], "texture": "#7"}, + "east": {"uv": [1, 4, 7, 12], "rotation": 270, "texture": "#7"}, + "south": {"uv": [15, 1, 9, 7], "rotation": 180, "texture": "#7"}, + "west": {"uv": [7, 4, 1, 12], "rotation": 90, "texture": "#7"}, + "up": {"uv": [1, 4, 7, 12], "rotation": 180, "texture": "#7"}, + "down": {"uv": [1, 4, 7, 12], "texture": "#7"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/chain_lift/item.json b/src/main/resources/assets/create/models/block/chain_lift/item.json new file mode 100644 index 0000000000..834be48e40 --- /dev/null +++ b/src/main/resources/assets/create/models/block/chain_lift/item.json @@ -0,0 +1,362 @@ +{ + "parent": "create:block/large_wheels", + "textures": { + "0": "create:block/axis", + "1": "create:block/axis_top", + "4": "create:block/gearbox", + "5": "create:block/secondary_linear_chassis_side", + "casing": "create:block/andesite_casing", + "side": "create:block/andesite_encased_cogwheel_side", + "1_7": "create:block/girder_pole", + "particle": "create:block/axis" + }, + "elements": [ + { + "from": [0, 1, 0], + "to": [16, 6, 16], + "faces": { + "north": {"uv": [0, 10, 16, 15], "texture": "#5"}, + "east": {"uv": [0, 10, 16, 15], "texture": "#5"}, + "south": {"uv": [0, 10, 16, 15], "texture": "#5"}, + "west": {"uv": [0, 10, 16, 15], "texture": "#5"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#4"} + } + }, + { + "from": [0, 10, 0], + "to": [16, 15, 16], + "faces": { + "north": {"uv": [0, 1, 16, 6], "texture": "#side"}, + "east": {"uv": [0, 1, 16, 6], "texture": "#side"}, + "south": {"uv": [0, 1, 16, 6], "texture": "#side"}, + "west": {"uv": [0, 1, 16, 6], "texture": "#side"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#4"} + } + }, + { + "from": [0, 15, 0], + "to": [16, 16, 2], + "faces": { + "north": {"uv": [0, 0, 16, 1], "texture": "#side"}, + "east": {"uv": [14, 0, 16, 1], "texture": "#side"}, + "south": {"uv": [0, 0, 16, 1], "texture": "#casing"}, + "west": {"uv": [0, 0, 2, 1], "texture": "#side"}, + "up": {"uv": [0, 0, 16, 2], "texture": "#casing"} + } + }, + { + "from": [0, 15, 14], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [0, 0, 16, 1], "texture": "#casing"}, + "east": {"uv": [0, 0, 2, 1], "texture": "#side"}, + "south": {"uv": [0, 0, 16, 1], "texture": "#side"}, + "west": {"uv": [14, 0, 16, 1], "texture": "#side"}, + "up": {"uv": [0, 14, 16, 16], "texture": "#casing"} + } + }, + { + "from": [0, 15, 2], + "to": [2, 16, 14], + "faces": { + "east": {"uv": [2, 0, 14, 1], "texture": "#casing"}, + "west": {"uv": [2, 0, 14, 1], "texture": "#side"}, + "up": {"uv": [0, 2, 2, 14], "texture": "#casing"} + } + }, + { + "from": [14, 15, 2], + "to": [16, 16, 14], + "faces": { + "east": {"uv": [2, 0, 14, 1], "texture": "#side"}, + "west": {"uv": [2, 0, 14, 1], "texture": "#casing"}, + "up": {"uv": [14, 2, 16, 14], "texture": "#casing"} + } + }, + { + "from": [0, 0, 0], + "to": [16, 1, 2], + "faces": { + "north": {"uv": [0, 15, 16, 16], "texture": "#side"}, + "east": {"uv": [14, 15, 16, 16], "texture": "#side"}, + "south": {"uv": [0, 0, 16, 1], "texture": "#casing"}, + "west": {"uv": [0, 15, 2, 16], "texture": "#side"}, + "down": {"uv": [0, 14, 16, 16], "texture": "#casing"} + } + }, + { + "from": [14, 0, 2], + "to": [16, 1, 14], + "faces": { + "east": {"uv": [2, 15, 14, 16], "texture": "#side"}, + "west": {"uv": [2, 0, 14, 1], "texture": "#casing"}, + "down": {"uv": [14, 2, 16, 14], "texture": "#casing"} + } + }, + { + "from": [0, 0, 14], + "to": [16, 1, 16], + "faces": { + "north": {"uv": [0, 0, 16, 1], "texture": "#casing"}, + "east": {"uv": [0, 15, 2, 16], "texture": "#side"}, + "south": {"uv": [0, 15, 16, 16], "texture": "#side"}, + "west": {"uv": [14, 15, 16, 16], "texture": "#side"}, + "down": {"uv": [0, 0, 16, 2], "texture": "#casing"} + } + }, + { + "from": [0, 0, 2], + "to": [2, 1, 14], + "faces": { + "east": {"uv": [2, 0, 14, 1], "texture": "#casing"}, + "west": {"uv": [2, 15, 14, 16], "texture": "#side"}, + "down": {"uv": [0, 2, 2, 14], "texture": "#casing"} + } + }, + { + "from": [1, 1.95, 8], + "to": [15, 14.05, 26], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "east": {"uv": [0, 2, 16, 14], "texture": "#5"}, + "south": {"uv": [2, 2, 16, 14], "texture": "#5"}, + "west": {"uv": [0, 2, 16, 14], "texture": "#5"}, + "up": {"uv": [0, 15, 16, 1], "rotation": 270, "texture": "#casing"}, + "down": {"uv": [0, 15, 16, 1], "rotation": 270, "texture": "#casing"} + } + }, + { + "from": [-10, 1.95, 1], + "to": [8, 14.05, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 2, 16, 14], "texture": "#5"}, + "south": {"uv": [0, 2, 16, 14], "texture": "#5"}, + "west": {"uv": [2, 2, 16, 14], "texture": "#5"}, + "up": {"uv": [0, 15, 16, 1], "texture": "#casing"}, + "down": {"uv": [0, 15, 16, 1], "rotation": 180, "texture": "#casing"} + } + }, + { + "from": [1, 1.95, -10], + "to": [15, 14.05, 8], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [2, 2, 16, 14], "texture": "#5"}, + "east": {"uv": [0, 2, 16, 14], "texture": "#5"}, + "west": {"uv": [0, 2, 16, 14], "texture": "#5"}, + "up": {"uv": [0, 15, 16, 1], "rotation": 90, "texture": "#casing"}, + "down": {"uv": [0, 15, 16, 1], "rotation": 90, "texture": "#casing"} + } + }, + { + "from": [8, 1.95, 1], + "to": [26, 14.05, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 2, 16, 14], "texture": "#5"}, + "east": {"uv": [2, 2, 16, 14], "texture": "#5"}, + "south": {"uv": [0, 2, 16, 14], "texture": "#5"}, + "up": {"uv": [0, 15, 16, 1], "rotation": 180, "texture": "#casing"}, + "down": {"uv": [0, 15, 16, 1], "texture": "#casing"} + } + }, + { + "from": [1, 2, 8], + "to": [15, 14, 26], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "east": {"uv": [0, 2, 16, 14], "texture": "#5"}, + "south": {"uv": [2, 2, 16, 14], "texture": "#5"}, + "west": {"uv": [0, 2, 16, 14], "texture": "#5"}, + "up": {"uv": [0, 15, 16, 1], "rotation": 270, "texture": "#casing"}, + "down": {"uv": [0, 15, 16, 1], "rotation": 270, "texture": "#casing"} + } + }, + { + "from": [-10, 2, 1], + "to": [8, 14, 15], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 2, 16, 14], "texture": "#5"}, + "south": {"uv": [0, 2, 16, 14], "texture": "#5"}, + "west": {"uv": [2, 2, 16, 14], "texture": "#5"}, + "up": {"uv": [0, 15, 16, 1], "texture": "#casing"}, + "down": {"uv": [0, 15, 16, 1], "rotation": 180, "texture": "#casing"} + } + }, + { + "from": [1, 2, -10], + "to": [15, 14, 8], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [2, 2, 16, 14], "texture": "#5"}, + "east": {"uv": [0, 2, 16, 14], "texture": "#5"}, + "west": {"uv": [0, 2, 16, 14], "texture": "#5"}, + "up": {"uv": [0, 15, 16, 1], "rotation": 90, "texture": "#casing"}, + "down": {"uv": [0, 15, 16, 1], "rotation": 90, "texture": "#casing"} + } + }, + { + "from": [8, 2, 1], + "to": [26, 14, 15], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 2, 16, 14], "texture": "#5"}, + "east": {"uv": [2, 2, 16, 14], "texture": "#5"}, + "south": {"uv": [0, 2, 16, 14], "texture": "#5"}, + "up": {"uv": [0, 15, 16, 1], "rotation": 180, "texture": "#casing"}, + "down": {"uv": [0, 15, 16, 1], "texture": "#casing"} + } + }, + { + "from": [-7, 0, -7], + "to": [1, 6, -1], + "faces": { + "north": {"uv": [7, 4, 1, 12], "rotation": 90, "texture": "#1_7"}, + "east": {"uv": [9, 1, 15, 7], "texture": "#1_7"}, + "south": {"uv": [1, 4, 7, 12], "rotation": 270, "texture": "#1_7"}, + "west": {"uv": [9, 1, 15, 7], "rotation": 180, "texture": "#1_7"}, + "up": {"uv": [1, 4, 7, 12], "rotation": 270, "texture": "#1_7"}, + "down": {"uv": [1, 4, 7, 12], "rotation": 270, "texture": "#1_7"} + } + }, + { + "from": [1, 0.95, -6.05], + "to": [9, 6, -1], + "faces": { + "north": {"uv": [6, 4, 1, 12], "rotation": 90, "texture": "#1_7"}, + "east": {"uv": [1, 5, 6.05, 10.05], "texture": "#1_7"}, + "south": {"uv": [1, 4, 6, 12], "rotation": 90, "texture": "#1_7"}, + "west": {"uv": [9, 1, 15, 7], "rotation": 180, "texture": "#1_7"}, + "up": {"uv": [6, 4, 1, 12], "rotation": 90, "texture": "#1_7"}, + "down": {"uv": [6, 4, 1, 12], "rotation": 90, "texture": "#1_7"} + } + }, + { + "from": [1, 0.95, 17], + "to": [9, 6, 22.05], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 16]}, + "faces": { + "north": {"uv": [1, 12, 6, 4], "rotation": 90, "texture": "#1_7"}, + "east": {"uv": [1, 5, 6.05, 10.05], "texture": "#1_7"}, + "south": {"uv": [6, 12, 1, 4], "rotation": 90, "texture": "#1_7"}, + "west": {"uv": [15, 1, 9, 7], "rotation": 180, "texture": "#1_7"}, + "up": {"uv": [1, 4, 6, 12], "rotation": 90, "texture": "#1_7"}, + "down": {"uv": [1, 4, 6, 12], "rotation": 90, "texture": "#1_7"} + } + }, + { + "from": [-7, 0, 17], + "to": [1, 6, 23], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 16]}, + "faces": { + "north": {"uv": [1, 12, 7, 4], "rotation": 270, "texture": "#1_7"}, + "east": {"uv": [15, 1, 9, 7], "texture": "#1_7"}, + "south": {"uv": [7, 12, 1, 4], "rotation": 90, "texture": "#1_7"}, + "west": {"uv": [9, 1, 15, 7], "rotation": 180, "texture": "#1_7"}, + "up": {"uv": [7, 4, 1, 12], "rotation": 270, "texture": "#1_7"}, + "down": {"uv": [7, 4, 1, 12], "rotation": 270, "texture": "#1_7"} + } + }, + { + "from": [15, 0, -7], + "to": [23, 6, -1], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "faces": { + "north": {"uv": [7, 12, 1, 4], "rotation": 90, "texture": "#1_7"}, + "east": {"uv": [15, 1, 9, 7], "rotation": 180, "texture": "#1_7"}, + "south": {"uv": [1, 12, 7, 4], "rotation": 270, "texture": "#1_7"}, + "west": {"uv": [15, 1, 9, 7], "texture": "#1_7"}, + "up": {"uv": [1, 12, 7, 4], "rotation": 270, "texture": "#1_7"}, + "down": {"uv": [1, 12, 7, 4], "rotation": 270, "texture": "#1_7"} + } + }, + { + "from": [7, 0.95, -6.05], + "to": [15, 6, -1], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "faces": { + "north": {"uv": [6, 12, 1, 4], "rotation": 90, "texture": "#1_7"}, + "east": {"uv": [15, 1, 9, 7], "rotation": 180, "texture": "#1_7"}, + "south": {"uv": [1, 12, 6, 4], "rotation": 90, "texture": "#1_7"}, + "west": {"uv": [6.05, 5, 1, 10.05], "texture": "#1_7"}, + "up": {"uv": [6, 12, 1, 4], "rotation": 90, "texture": "#1_7"}, + "down": {"uv": [6, 12, 1, 4], "rotation": 90, "texture": "#1_7"} + } + }, + { + "from": [7, 0.95, 17], + "to": [15, 6, 22.05], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 16]}, + "faces": { + "north": {"uv": [1, 4, 6, 12], "rotation": 90, "texture": "#1_7"}, + "east": {"uv": [9, 1, 15, 7], "rotation": 180, "texture": "#1_7"}, + "south": {"uv": [6, 4, 1, 12], "rotation": 90, "texture": "#1_7"}, + "west": {"uv": [6.05, 5, 1, 10.05], "texture": "#1_7"}, + "up": {"uv": [1, 12, 6, 4], "rotation": 90, "texture": "#1_7"}, + "down": {"uv": [1, 12, 6, 4], "rotation": 90, "texture": "#1_7"} + } + }, + { + "from": [15, 0, 17], + "to": [23, 6, 23], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 16]}, + "faces": { + "north": {"uv": [1, 4, 7, 12], "rotation": 270, "texture": "#1_7"}, + "east": {"uv": [15, 1, 9, 7], "rotation": 180, "texture": "#1_7"}, + "south": {"uv": [7, 4, 1, 12], "rotation": 90, "texture": "#1_7"}, + "west": {"uv": [9, 1, 15, 7], "texture": "#1_7"}, + "up": {"uv": [7, 12, 1, 4], "rotation": 270, "texture": "#1_7"}, + "down": {"uv": [7, 12, 1, 4], "rotation": 270, "texture": "#1_7"} + } + }, + { + "name": "Axis", + "from": [6, 0, 6], + "to": [10, 16, 10], + "faces": { + "north": {"uv": [6, 0, 10, 16], "texture": "#0"}, + "east": {"uv": [6, 0, 10, 16], "texture": "#0"}, + "south": {"uv": [6, 0, 10, 16], "texture": "#0"}, + "west": {"uv": [6, 0, 10, 16], "texture": "#0"}, + "up": {"uv": [6, 6, 10, 10], "texture": "#1"}, + "down": {"uv": [6, 6, 10, 10], "texture": "#1"} + } + } + ], + "groups": [ + { + "name": "block_top_bottom", + "origin": [8, 8, 8], + "color": 0, + "children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] + }, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + { + "name": "guard", + "origin": [8, 8, 8], + "color": 0, + "children": [18, 19, 20, 21] + }, + { + "name": "guard", + "origin": [8, 8, 8], + "color": 0, + "children": [22, 23, 24, 25] + }, + { + "name": "shaft", + "origin": [8, 8, 8], + "color": 0, + "children": [26] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/package_port/block.json b/src/main/resources/assets/create/models/block/package_port/block.json new file mode 100644 index 0000000000..5675dd8bd1 --- /dev/null +++ b/src/main/resources/assets/create/models/block/package_port/block.json @@ -0,0 +1,22 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "7": "create:block/order_collector", + "9": "create:block/package_port", + "particle": "create:block/andesite_casing_short" + }, + "elements": [ + { + "from": [0, 0, 0], + "to": [16, 7, 16], + "faces": { + "north": {"uv": [0, 9, 16, 16], "texture": "#9"}, + "east": {"uv": [0, 9, 16, 16], "texture": "#9"}, + "south": {"uv": [0, 9, 16, 16], "texture": "#9"}, + "west": {"uv": [0, 9, 16, 16], "texture": "#9"}, + "up": {"uv": [0, 0, 8, 8], "texture": "#7"}, + "down": {"uv": [0, 0, 8, 8], "texture": "#7"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/package_port/cap.json b/src/main/resources/assets/create/models/block/package_port/cap.json new file mode 100644 index 0000000000..4777dd9402 --- /dev/null +++ b/src/main/resources/assets/create/models/block/package_port/cap.json @@ -0,0 +1,21 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "8": "create:block/packager_block", + "particle": "create:block/andesite_casing_short" + }, + "elements": [ + { + "from": [0, 0, 0], + "to": [16, 2, 16], + "faces": { + "north": {"uv": [8, 0, 16, 1], "texture": "#8"}, + "east": {"uv": [8, 0, 16, 1], "texture": "#8"}, + "south": {"uv": [8, 0, 16, 1], "texture": "#8"}, + "west": {"uv": [8, 0, 16, 1], "texture": "#8"}, + "up": {"uv": [0, 0, 8, 8], "texture": "#8"}, + "down": {"uv": [0, 0, 8, 8], "texture": "#8"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/package_port/item.json b/src/main/resources/assets/create/models/block/package_port/item.json new file mode 100644 index 0000000000..aacb6becc4 --- /dev/null +++ b/src/main/resources/assets/create/models/block/package_port/item.json @@ -0,0 +1,78 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "5": "create:block/funnel/brass_funnel", + "6": "create:block/funnel/funnel_back", + "7": "create:block/order_collector", + "8": "create:block/packager_block", + "9": "create:block/package_port", + "particle": "create:block/andesite_casing_short" + }, + "elements": [ + { + "from": [0, 0, 0], + "to": [16, 7, 16], + "faces": { + "north": {"uv": [0, 9, 16, 16], "texture": "#9"}, + "east": {"uv": [0, 9, 16, 16], "texture": "#9"}, + "south": {"uv": [0, 9, 16, 16], "texture": "#9"}, + "west": {"uv": [0, 9, 16, 16], "texture": "#9"}, + "up": {"uv": [0, 0, 8, 8], "texture": "#7"}, + "down": {"uv": [0, 0, 8, 8], "texture": "#7"} + } + }, + { + "from": [0, 15, 0], + "to": [16, 17, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 15, 0]}, + "faces": { + "north": {"uv": [8, 0, 16, 1], "texture": "#8"}, + "east": {"uv": [8, 0, 16, 1], "texture": "#8"}, + "south": {"uv": [8, 0, 16, 1], "texture": "#8"}, + "west": {"uv": [8, 0, 16, 1], "texture": "#8"}, + "up": {"uv": [0, 0, 8, 8], "texture": "#8"}, + "down": {"uv": [0, 0, 8, 8], "texture": "#8"} + } + }, + { + "from": [1, 13, 1], + "to": [15, 16, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 13, 0]}, + "faces": { + "north": {"uv": [0, 5.5, 7, 7], "texture": "#6"}, + "east": {"uv": [0, 5.5, 7, 7], "texture": "#6"}, + "south": {"uv": [0, 5.5, 7, 7], "texture": "#6"}, + "west": {"uv": [0, 5.5, 7, 7], "texture": "#6"}, + "up": {"uv": [0.5, 8.5, 7.5, 15.5], "texture": "#7"}, + "down": {"uv": [0, 0, 6, 6], "texture": "#5"} + } + }, + { + "from": [1, 10, 1], + "to": [15, 13, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 10, 0]}, + "faces": { + "north": {"uv": [0, 5.5, 7, 7], "texture": "#6"}, + "east": {"uv": [0, 5.5, 7, 7], "texture": "#6"}, + "south": {"uv": [0, 5.5, 7, 7], "texture": "#6"}, + "west": {"uv": [0, 5.5, 7, 7], "texture": "#6"}, + "up": {"uv": [0, 0, 6, 6], "texture": "#5"}, + "down": {"uv": [0, 0, 6, 6], "texture": "#5"} + } + }, + { + "from": [1, 7, 1], + "to": [15, 10, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 7, 0]}, + "faces": { + "north": {"uv": [0, 5.5, 7, 7], "texture": "#6"}, + "east": {"uv": [0, 5.5, 7, 7], "texture": "#6"}, + "south": {"uv": [0, 5.5, 7, 7], "texture": "#6"}, + "west": {"uv": [0, 5.5, 7, 7], "texture": "#6"}, + "up": {"uv": [0, 0, 6, 6], "texture": "#5"}, + "down": {"uv": [0, 0, 6, 6], "texture": "#5"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/package_port/tube.json b/src/main/resources/assets/create/models/block/package_port/tube.json new file mode 100644 index 0000000000..a893e78cf3 --- /dev/null +++ b/src/main/resources/assets/create/models/block/package_port/tube.json @@ -0,0 +1,24 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "5": "create:block/funnel/brass_funnel", + "6": "create:block/funnel/funnel_back", + "7": "create:block/order_collector", + "particle": "create:block/andesite_casing_short" + }, + "elements": [ + { + "from": [1, -1.5, 1], + "to": [15, 1.5, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [0, -1.5, 0]}, + "faces": { + "north": {"uv": [0, 5.5, 7, 7], "texture": "#6"}, + "east": {"uv": [0, 5.5, 7, 7], "texture": "#6"}, + "south": {"uv": [0, 5.5, 7, 7], "texture": "#6"}, + "west": {"uv": [0, 5.5, 7, 7], "texture": "#6"}, + "up": {"uv": [0.5, 8.5, 7.5, 15.5], "texture": "#7"}, + "down": {"uv": [0, 0, 6, 6], "texture": "#5"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/block/order_collector.png b/src/main/resources/assets/create/textures/block/order_collector.png index 20b7d4ac94a413f7cc672de3279cf3d4fae59625..237e8d9760260cfc44589baef922d671438ab09b 100644 GIT binary patch delta 21 ccmZo;X=9nNhD(uwK~Is9J^Ii8joShk0Ybe7;Q#;t delta 21 dcmZo;X=9nNhD(WoK~ITs)uX$UHf{@G1OQ0G2Y~

NS%G|&0G|+711k$h50~KZz|72~mZtLgvnTJ_woY5y(A31%*2crdBMPW+4p;LF zAjMM>=PdAuEM{QfI}E~%$MaXD00l!lT^vI+f{*rkay2mUFz;Tn z`v3p+f-VR7E!v&hmQ8(pINs^XpMz6w3eI%2c&OF(>gKCgbM*pT&gL1v@oT-?6#bVg r?8b`KP7@dI;hJP4saasRFR*ZqNG*p%@xOkcMGOp{u6{1-oD!M Date: Thu, 20 Jun 2024 13:51:17 +0200 Subject: [PATCH 033/515] Chain Reaction - Frog ports animation - New package assets - Chain lift refinements --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 6 +- .../models/item/cardboard_package_10x12.json | 3 + .../models/item/cardboard_package_10x8.json | 3 + .../models/item/cardboard_package_12x10.json | 3 + .../models/item/cardboard_package_12x12.json | 3 + .../simibubi/create/AllBlockEntityTypes.java | 3 +- .../java/com/simibubi/create/AllItems.java | 10 +- .../com/simibubi/create/AllPartialModels.java | 16 +- .../java/com/simibubi/create/AllShapes.java | 2 + .../chainLift/ChainLiftBlockEntity.java | 105 ++-- .../kinetics/chainLift/ChainLiftInstance.java | 28 ++ .../kinetics/chainLift/ChainLiftPackage.java | 16 +- .../kinetics/chainLift/ChainLiftRenderer.java | 201 ++++++-- .../chainLift/ChainLiftRidingHandler.java | 6 +- .../content/logistics/box/PackageItem.java | 22 +- .../packagePort/PackagePortBlock.java | 32 +- .../packagePort/PackagePortBlockEntity.java | 183 +++++++ .../packagePort/PackagePortInventory.java | 22 +- .../packagePort/PackagePortRenderer.java | 135 +++++- .../packagePort/PackagePortTarget.java | 31 +- .../packager/PackagerBlockEntity.java | 57 +++ .../stockTicker/StockTickerRequestScreen.java | 4 +- .../create/foundation/block/BigOutlines.java | 7 +- .../foundation/data/BuilderTransformers.java | 3 +- .../create/foundation/render/RenderTypes.java | 66 ++- .../create/models/block/chain_lift/block.json | 228 +-------- .../block/chain_lift/conveyor_casing.mtl | 5 + .../block/chain_lift/conveyor_casing.obj | 355 ++++++++++++++ .../block/chain_lift/conveyor_ports.mtl | 5 + .../block/chain_lift/conveyor_ports.obj | 64 +++ .../block/chain_lift/conveyor_shaft.mtl | 17 + .../block/chain_lift/conveyor_shaft.obj | 45 ++ .../create/models/block/chain_lift/guard.json | 64 +-- .../create/models/block/chain_lift/item.json | 376 +------------- .../create/models/block/chain_lift/item.mtl | 17 + .../create/models/block/chain_lift/item.obj | 459 ++++++++++++++++++ .../create/models/block/chain_lift/shaft.json | 6 + .../models/block/chain_lift/textures.json | 12 + .../models/block/package_port/block.json | 27 +- .../models/block/package_port/body.json | 143 ++++++ .../create/models/block/package_port/cap.json | 21 - .../models/block/package_port/head.json | 76 +++ .../models/block/package_port/item.json | 261 ++++++++-- .../models/block/package_port/tongue.json | 26 + .../models/block/package_port/tube.json | 24 - .../models/item/cardboard_package_10x12.json | 22 - .../models/item/cardboard_package_10x8.json | 22 - .../models/item/cardboard_package_12x10.json | 22 - .../models/item/cardboard_package_12x12.json | 22 - .../models/item/packages/cardboard_10x12.json | 32 ++ .../packages/cardboard_10x12_rigging.json | 124 +++++ .../models/item/packages/cardboard_10x8.json | 32 ++ .../item/packages/cardboard_10x8_rigging.json | 124 +++++ .../models/item/packages/cardboard_12x10.json | 32 ++ .../packages/cardboard_12x10_rigging.json | 124 +++++ .../models/item/packages/cardboard_12x12.json | 32 ++ .../packages/cardboard_12x12_rigging.json | 124 +++++ .../create/textures/block/bullwheel.png | Bin 0 -> 601 bytes .../create/textures/block/conveyor_casing.png | Bin 0 -> 1704 bytes .../create/textures/block/conveyor_port.png | Bin 0 -> 498 bytes .../assets/create/textures/block/port.png | Bin 0 -> 1611 bytes .../assets/create/textures/block/port2.png | Bin 0 -> 1163 bytes .../textures/entity/package/cardboard.png | Bin 1394 -> 1377 bytes .../entity/package/cardboard_particle.png | Bin 375 -> 291 bytes 64 files changed, 2917 insertions(+), 993 deletions(-) create mode 100644 src/generated/resources/assets/create/models/item/cardboard_package_10x12.json create mode 100644 src/generated/resources/assets/create/models/item/cardboard_package_10x8.json create mode 100644 src/generated/resources/assets/create/models/item/cardboard_package_12x10.json create mode 100644 src/generated/resources/assets/create/models/item/cardboard_package_12x12.json create mode 100644 src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftInstance.java create mode 100644 src/main/resources/assets/create/models/block/chain_lift/conveyor_casing.mtl create mode 100644 src/main/resources/assets/create/models/block/chain_lift/conveyor_casing.obj create mode 100644 src/main/resources/assets/create/models/block/chain_lift/conveyor_ports.mtl create mode 100644 src/main/resources/assets/create/models/block/chain_lift/conveyor_ports.obj create mode 100644 src/main/resources/assets/create/models/block/chain_lift/conveyor_shaft.mtl create mode 100644 src/main/resources/assets/create/models/block/chain_lift/conveyor_shaft.obj create mode 100644 src/main/resources/assets/create/models/block/chain_lift/item.mtl create mode 100644 src/main/resources/assets/create/models/block/chain_lift/item.obj create mode 100644 src/main/resources/assets/create/models/block/chain_lift/shaft.json create mode 100644 src/main/resources/assets/create/models/block/chain_lift/textures.json create mode 100644 src/main/resources/assets/create/models/block/package_port/body.json delete mode 100644 src/main/resources/assets/create/models/block/package_port/cap.json create mode 100644 src/main/resources/assets/create/models/block/package_port/head.json create mode 100644 src/main/resources/assets/create/models/block/package_port/tongue.json delete mode 100644 src/main/resources/assets/create/models/block/package_port/tube.json delete mode 100644 src/main/resources/assets/create/models/item/cardboard_package_10x12.json delete mode 100644 src/main/resources/assets/create/models/item/cardboard_package_10x8.json delete mode 100644 src/main/resources/assets/create/models/item/cardboard_package_12x10.json delete mode 100644 src/main/resources/assets/create/models/item/cardboard_package_12x12.json create mode 100644 src/main/resources/assets/create/models/item/packages/cardboard_10x12.json create mode 100644 src/main/resources/assets/create/models/item/packages/cardboard_10x12_rigging.json create mode 100644 src/main/resources/assets/create/models/item/packages/cardboard_10x8.json create mode 100644 src/main/resources/assets/create/models/item/packages/cardboard_10x8_rigging.json create mode 100644 src/main/resources/assets/create/models/item/packages/cardboard_12x10.json create mode 100644 src/main/resources/assets/create/models/item/packages/cardboard_12x10_rigging.json create mode 100644 src/main/resources/assets/create/models/item/packages/cardboard_12x12.json create mode 100644 src/main/resources/assets/create/models/item/packages/cardboard_12x12_rigging.json create mode 100644 src/main/resources/assets/create/textures/block/bullwheel.png create mode 100644 src/main/resources/assets/create/textures/block/conveyor_casing.png create mode 100644 src/main/resources/assets/create/textures/block/conveyor_port.png create mode 100644 src/main/resources/assets/create/textures/block/port.png create mode 100644 src/main/resources/assets/create/textures/block/port2.png diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 345a189157..daf4334270 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-05-23T17:42:17.3367493 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-06-19T14:00:03.9832322 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -1727,6 +1727,10 @@ fce64539b36fc8a5ffa39d7a3f73765818437cbf assets/create/models/item/brown_seat.js 9477ab491586f1314bebf4d58387425ae56d0bad assets/create/models/item/brown_valve_handle.json 1db479848369140bb913ba09f3f1d994e4ac864c assets/create/models/item/builders_tea.json f5ff4e2ed2ea2e43b6d02f6a95ba02b2e4b611dc assets/create/models/item/calcite_pillar.json +45d7fa87d102a0373a06a13592f58baafa4e5a33 assets/create/models/item/cardboard_package_10x12.json +f998f36d9a6f469bbd3822a17b2b45f81e6810c6 assets/create/models/item/cardboard_package_10x8.json +b7a24a7dd21a464815b2fd8cd6037e854be3f485 assets/create/models/item/cardboard_package_12x10.json +d5396690e7813c67ee3600555d7e47d0097b1f56 assets/create/models/item/cardboard_package_12x12.json 1cdb2b8801551c1540bb9b2a9cc3d725a2b433e7 assets/create/models/item/cart_assembler.json 9a29b1b49f3afd2ee63828b00b94ebb1ff2dba84 assets/create/models/item/chain_lift.json a197d08618f4035182c91a6b16031eb681ab8a7c assets/create/models/item/chest_minecart_contraption.json diff --git a/src/generated/resources/assets/create/models/item/cardboard_package_10x12.json b/src/generated/resources/assets/create/models/item/cardboard_package_10x12.json new file mode 100644 index 0000000000..ec8db3c943 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard_package_10x12.json @@ -0,0 +1,3 @@ +{ + "parent": "create:item/packages/cardboard_10x12" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_package_10x8.json b/src/generated/resources/assets/create/models/item/cardboard_package_10x8.json new file mode 100644 index 0000000000..573d55b468 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard_package_10x8.json @@ -0,0 +1,3 @@ +{ + "parent": "create:item/packages/cardboard_10x8" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_package_12x10.json b/src/generated/resources/assets/create/models/item/cardboard_package_12x10.json new file mode 100644 index 0000000000..7dbbc45d1f --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard_package_12x10.json @@ -0,0 +1,3 @@ +{ + "parent": "create:item/packages/cardboard_12x10" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_package_12x12.json b/src/generated/resources/assets/create/models/item/cardboard_package_12x12.json new file mode 100644 index 0000000000..8d9337ae86 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard_package_12x12.json @@ -0,0 +1,3 @@ +{ + "parent": "create:item/packages/cardboard_12x12" +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java index 3293727a37..dd2dfc77f6 100644 --- a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java +++ b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java @@ -84,6 +84,7 @@ import com.simibubi.create.content.kinetics.belt.BeltInstance; import com.simibubi.create.content.kinetics.belt.BeltRenderer; import com.simibubi.create.content.kinetics.chainDrive.ChainGearshiftBlockEntity; import com.simibubi.create.content.kinetics.chainLift.ChainLiftBlockEntity; +import com.simibubi.create.content.kinetics.chainLift.ChainLiftInstance; import com.simibubi.create.content.kinetics.chainLift.ChainLiftRenderer; import com.simibubi.create.content.kinetics.clock.CuckooClockBlockEntity; import com.simibubi.create.content.kinetics.clock.CuckooClockRenderer; @@ -364,7 +365,7 @@ public class AllBlockEntityTypes { public static final BlockEntityEntry CHAIN_LIFT = REGISTRATE .blockEntity("chain_lift", ChainLiftBlockEntity::new) - .instance(() -> ShaftInstance::new) + .instance(() -> ChainLiftInstance::new) .validBlocks(AllBlocks.CHAIN_LIFT) .renderer(() -> ChainLiftRenderer::new) .register(); diff --git a/src/main/java/com/simibubi/create/AllItems.java b/src/main/java/com/simibubi/create/AllItems.java index e82dc6b294..227fd36215 100644 --- a/src/main/java/com/simibubi/create/AllItems.java +++ b/src/main/java/com/simibubi/create/AllItems.java @@ -1,9 +1,9 @@ package com.simibubi.create; +import static com.simibubi.create.AllTags.forgeItemTag; import static com.simibubi.create.AllTags.AllItemTags.CREATE_INGOTS; import static com.simibubi.create.AllTags.AllItemTags.CRUSHED_RAW_MATERIALS; import static com.simibubi.create.AllTags.AllItemTags.PLATES; -import static com.simibubi.create.AllTags.forgeItemTag; import static com.simibubi.create.Create.REGISTRATE; import static com.simibubi.create.foundation.data.recipe.CompatMetals.ALUMINUM; import static com.simibubi.create.foundation.data.recipe.CompatMetals.LEAD; @@ -362,16 +362,16 @@ public class AllItems { // Logistics public static final ItemEntry CARDBOARD_PACKAGE_12x12 = - REGISTRATE.item("cardboard_package_12x12", p -> new PackageItem(p, 12, 12)) + REGISTRATE.item("cardboard_package_12x12", p -> new PackageItem(p, 12, 12, 23f)) .transform(BuilderTransformers.packageItem("cardboard", 12, 12)) .register(), - CARDBOARD_PACKAGE_10x12 = REGISTRATE.item("cardboard_package_10x12", p -> new PackageItem(p, 10, 12)) + CARDBOARD_PACKAGE_10x12 = REGISTRATE.item("cardboard_package_10x12", p -> new PackageItem(p, 10, 12, 22f)) .transform(BuilderTransformers.packageItem("cardboard", 10, 12)) .register(), - CARDBOARD_PACKAGE_10x8 = REGISTRATE.item("cardboard_package_10x8", p -> new PackageItem(p, 10, 8)) + CARDBOARD_PACKAGE_10x8 = REGISTRATE.item("cardboard_package_10x8", p -> new PackageItem(p, 10, 8, 18f)) .transform(BuilderTransformers.packageItem("cardboard", 10, 8)) .register(), - CARDBOARD_PACKAGE_12x10 = REGISTRATE.item("cardboard_package_12x10", p -> new PackageItem(p, 12, 10)) + CARDBOARD_PACKAGE_12x10 = REGISTRATE.item("cardboard_package_12x10", p -> new PackageItem(p, 12, 10, 21f)) .transform(BuilderTransformers.packageItem("cardboard", 12, 10)) .register(); diff --git a/src/main/java/com/simibubi/create/AllPartialModels.java b/src/main/java/com/simibubi/create/AllPartialModels.java index 51022b8372..7f165b2fcc 100644 --- a/src/main/java/com/simibubi/create/AllPartialModels.java +++ b/src/main/java/com/simibubi/create/AllPartialModels.java @@ -116,9 +116,11 @@ public class AllPartialModels { EJECTOR_TOP = block("weighted_ejector/top"), CHAIN_LIFT_GUARD = block("chain_lift/guard"), + CHAIN_LIFT_SHAFT = block("chain_lift/shaft"), - PACKAGE_PORT_TUBE = block("package_port/tube"), - PACKAGE_PORT_CAP = block("package_port/cap"), + PACKAGE_PORT_BODY = block("package_port/body"), + PACKAGE_PORT_HEAD = block("package_port/head"), + PACKAGE_PORT_TONGUE = block("package_port/tongue"), PACKAGER_TRAY = block("packager/tray"), PACKAGER_HATCH_OPEN = block("packager/hatch_open"), PACKAGER_HATCH_CLOSED = block("packager/hatch_closed"), @@ -201,7 +203,9 @@ public class AllPartialModels { public static final Map TOOLBOX_LIDS = new EnumMap<>(DyeColor.class); public static final Map> FOLDING_DOORS = new HashMap<>(); public static final List CONTRAPTION_CONTROLS_INDICATOR = new ArrayList<>(); + public static final Map PACKAGES = new HashMap<>(); + public static final Map PACKAGE_RIGGING = new HashMap<>(); static { for (FluidTransportBehaviour.AttachmentTypes.ComponentPartials type : FluidTransportBehaviour.AttachmentTypes.ComponentPartials.values()) { @@ -222,9 +226,11 @@ public class AllPartialModels { putFoldingDoor("andesite_door"); putFoldingDoor("copper_door"); - for (String size : new String[] { "12x12", "10x12", "12x10", "10x8" }) - PACKAGES.put(Create.asResource("cardboard_package_" + size), - new PartialModel(new ResourceLocation(Create.ID, "item/cardboard_package_" + size))); + for (String size : new String[] { "12x12", "10x12", "12x10", "10x8" }) { + ResourceLocation key = Create.asResource("cardboard_package_" + size); + PACKAGES.put(key, new PartialModel(Create.asResource("item/packages/cardboard_" + size))); + PACKAGE_RIGGING.put(key, new PartialModel(Create.asResource("item/packages/cardboard_" + size + "_rigging"))); + } } private static void putFoldingDoor(String path) { diff --git a/src/main/java/com/simibubi/create/AllShapes.java b/src/main/java/com/simibubi/create/AllShapes.java index 6eedb01e58..34c9e4f7bc 100644 --- a/src/main/java/com/simibubi/create/AllShapes.java +++ b/src/main/java/com/simibubi/create/AllShapes.java @@ -216,6 +216,8 @@ public class AllShapes { .build(), TRACK_COLLISION = shape(0, 0, 0, 16, 2, 16).build(), + + PACKAGE_PORT = shape(0, 0, 0, 16, 4, 16).add(2, 2, 2, 14, 14, 14).build(), TRACK_FALLBACK = shape(0, 0, 0, 16, 4, 16).build(), diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftBlockEntity.java index 4a01885e09..c9cbedd059 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftBlockEntity.java @@ -9,6 +9,8 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import javax.annotation.Nullable; + import com.simibubi.create.content.kinetics.base.IRotate; import com.simibubi.create.content.kinetics.base.KineticBlockEntity; import com.simibubi.create.content.kinetics.chainLift.ChainLiftPackage.ChainLiftPackagePhysicsData; @@ -31,12 +33,10 @@ import net.minecraft.nbt.NbtUtils; import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; import net.minecraft.util.Mth; -import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.items.ItemHandlerHelper; public class ChainLiftBlockEntity extends KineticBlockEntity { @@ -52,15 +52,15 @@ public class ChainLiftBlockEntity extends KineticBlockEntity { public Map loopPorts = new HashMap<>(); public Map travelPorts = new HashMap<>(); public ChainLiftRoutingTable routingTable = new ChainLiftRoutingTable(); - + List loopingPackages = new ArrayList<>(); Map> travellingPackages = new HashMap<>(); - + public boolean reversed; public ChainLiftBlockEntity(BlockEntityType typeIn, BlockPos pos, BlockState state) { super(typeIn, pos, state); - } + } @Override protected AABB createRenderBoundingBox() { @@ -89,7 +89,7 @@ public class ChainLiftBlockEntity extends KineticBlockEntity { super.tick(); float serverSpeed = ServerSpeedProvider.get(); - float speed = getSpeed() / 180f; + float speed = getSpeed() / 360f; float radius = 1.5f; float distancePerTick = Math.abs(speed); float degreesPerTick = (speed / (Mth.PI * radius)) * 360f; @@ -182,7 +182,7 @@ public class ChainLiftBlockEntity extends KineticBlockEntity { // transfer to other if (level.getBlockEntity(worldPosition.offset(target)) instanceof ChainLiftBlockEntity clbe) { - box.chainPosition = wrapAngle(stats.tangentAngle + 180 + 2 * 49 * (reversed ? -1 : 1)); + box.chainPosition = wrapAngle(stats.tangentAngle + 180 + 2 * 35 * (reversed ? -1 : 1)); clbe.addLoopingPackage(box); iterator.remove(); notifyUpdate(); @@ -248,11 +248,13 @@ public class ChainLiftBlockEntity extends KineticBlockEntity { if (!(level.getBlockEntity(globalPos) instanceof PackagePortBlockEntity ppbe)) return false; - ppbe.inventory.receiveMode(true); - ItemStack remainder = ItemHandlerHelper.insertItem(ppbe.inventory, box.item.copy(), false); - ppbe.inventory.receiveMode(false); + if (ppbe.isAnimationInProgress()) + return false; + if (ppbe.inventory.isBackedUp()) + return false; - return remainder.isEmpty(); + ppbe.startAnimation(box.item, false); + return true; } public boolean addTravellingPackage(ChainLiftPackage box, BlockPos connection) { @@ -294,14 +296,34 @@ public class ChainLiftBlockEntity extends KineticBlockEntity { for (Entry> entry : travellingPackages.entrySet()) { BlockPos target = entry.getKey(); ConnectionStats stats = connectionStats.get(target); - for (ChainLiftPackage box : entry.getValue()) - box.worldPosition = stats.start.add((stats.end.subtract(stats.start)).normalize() - .scale(Math.min(stats.chainLength, box.chainPosition))); + for (ChainLiftPackage box : entry.getValue()) { + box.worldPosition = getPackagePosition(box.chainPosition, target); + if (level == null || !level.isClientSide()) + continue; + Vec3 diff = stats.end.subtract(stats.start) + .normalize(); + box.yaw = Mth.wrapDegrees((float) Mth.atan2(diff.x, diff.z) * Mth.RAD_TO_DEG - 90); + } } - for (ChainLiftPackage box : loopingPackages) - box.worldPosition = Vec3.atBottomCenterOf(worldPosition) - .add(VecHelper.rotate(new Vec3(0, 0.25, 1), box.chainPosition, Axis.Y)); + for (ChainLiftPackage box : loopingPackages) { + box.worldPosition = getPackagePosition(box.chainPosition, null); + box.yaw = Mth.wrapDegrees(box.chainPosition); + if (reversed) + box.yaw += 180; + } + } + + public Vec3 getPackagePosition(float chainPosition, @Nullable BlockPos travelTarget) { + if (travelTarget == null) + return Vec3.atBottomCenterOf(worldPosition) + .add(VecHelper.rotate(new Vec3(0, 6 / 16f, 0.875), chainPosition, Axis.Y)); + ConnectionStats stats = connectionStats.get(travelTarget); + if (stats == null) + return Vec3.ZERO; + Vec3 diff = stats.end.subtract(stats.start) + .normalize(); + return stats.start.add(diff.scale(Math.min(stats.chainLength, chainPosition))); } private void tickBoxVisuals(ChainLiftPackage box) { @@ -312,29 +334,48 @@ public class ChainLiftBlockEntity extends KineticBlockEntity { if (!physicsData.shouldTick()) return; + physicsData.prevTargetPos = physicsData.targetPos; physicsData.prevPos = physicsData.pos; - if (physicsData.pos.distanceToSqr(box.worldPosition) > 1.5f * 1.5f) - physicsData.pos = box.worldPosition.add(physicsData.pos.subtract(box.worldPosition) - .normalize() - .scale(1.5)); - physicsData.motion = physicsData.motion.add(0, -0.1, 0) - .scale(0.85) - .add((box.worldPosition.subtract(physicsData.pos)).scale(0.15)); - physicsData.pos = physicsData.pos.add(physicsData.motion); + physicsData.prevYaw = physicsData.yaw; + physicsData.flipped = reversed; + + if (physicsData.pos != null) { + if (physicsData.pos.distanceToSqr(box.worldPosition) > 1.5f * 1.5f) + physicsData.pos = box.worldPosition.add(physicsData.pos.subtract(box.worldPosition) + .normalize() + .scale(1.5)); + physicsData.motion = physicsData.motion.add(0, -0.25, 0) + .scale(0.75) + .add((box.worldPosition.subtract(physicsData.pos)).scale(0.25)); + physicsData.pos = physicsData.pos.add(physicsData.motion); + } + + physicsData.targetPos = box.worldPosition.subtract(0, 9 / 16f, 0); + + if (physicsData.pos == null) { + physicsData.pos = physicsData.targetPos; + physicsData.prevPos = physicsData.targetPos; + physicsData.prevTargetPos = physicsData.targetPos; + } + + physicsData.yaw = AngleHelper.angleLerp(.25, physicsData.yaw, box.yaw); } private void calculateConnectionStats(BlockPos connection) { boolean reversed = getSpeed() < 0; - float offBranchDistance = 49f; + float offBranchDistance = 35f; float direction = Mth.RAD_TO_DEG * (float) Mth.atan2(connection.getX(), connection.getZ()); float angle = wrapAngle(direction - offBranchDistance * (reversed ? -1 : 1)); - float oppositeAngle = wrapAngle(angle + 180 + 2 * 49 * (reversed ? -1 : 1)); + float oppositeAngle = wrapAngle(angle + 180 + 2 * offBranchDistance * (reversed ? -1 : 1)); + Vec3 start = Vec3.atBottomCenterOf(worldPosition) - .add(VecHelper.rotate(new Vec3(0, 0, 1), angle, Axis.Y)) - .add(0, 4 / 16f, 0); + .add(VecHelper.rotate(new Vec3(0, 0, 1.25), angle, Axis.Y)) + .add(0, 6 / 16f, 0); + Vec3 end = Vec3.atBottomCenterOf(worldPosition.offset(connection)) - .add(VecHelper.rotate(new Vec3(0, 0, 1), oppositeAngle, Axis.Y)) - .add(0, 4 / 16f, 0); + .add(VecHelper.rotate(new Vec3(0, 0, 1.25), oppositeAngle, Axis.Y)) + .add(0, 6 / 16f, 0); + float length = (float) start.distanceTo(end); connectionStats.put(connection, new ConnectionStats(angle, length, start, end)); } @@ -374,6 +415,8 @@ public class ChainLiftBlockEntity extends KineticBlockEntity { } private void updateChainShapes() { + prepareStats(); + List shapes = new ArrayList<>(); shapes.add(new ChainLiftBB(Vec3.atBottomCenterOf(BlockPos.ZERO))); for (BlockPos target : connections) { diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftInstance.java b/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftInstance.java new file mode 100644 index 0000000000..b0745063ce --- /dev/null +++ b/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftInstance.java @@ -0,0 +1,28 @@ +package com.simibubi.create.content.kinetics.chainLift; + +import com.jozufozu.flywheel.api.Instancer; +import com.jozufozu.flywheel.api.Material; +import com.jozufozu.flywheel.api.MaterialManager; +import com.simibubi.create.AllPartialModels; +import com.simibubi.create.content.kinetics.base.SingleRotatingInstance; +import com.simibubi.create.content.kinetics.base.flwdata.RotatingData; +import com.simibubi.create.foundation.render.AllMaterialSpecs; + +public class ChainLiftInstance extends SingleRotatingInstance { + + public ChainLiftInstance(MaterialManager materialManager, ChainLiftBlockEntity blockEntity) { + super(materialManager, blockEntity); + } + + @Override + protected Instancer getModel() { + return getRotatingMaterial().getModel(AllPartialModels.CHAIN_LIFT_SHAFT, blockEntity.getBlockState()); + } + + @Override + protected Material getRotatingMaterial() { + return materialManager.defaultCutout() + .material(AllMaterialSpecs.ROTATING); + } + +} diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftPackage.java b/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftPackage.java index 9da6e4fc9c..c179d90411 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftPackage.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftPackage.java @@ -10,6 +10,7 @@ import com.google.common.cache.CacheBuilder; import net.createmod.catnip.utility.AnimationTickHolder; import net.createmod.catnip.utility.WorldAttached; import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.phys.Vec3; @@ -27,14 +28,24 @@ public class ChainLiftPackage { .build()); public class ChainLiftPackagePhysicsData { + public Vec3 targetPos; + public Vec3 prevTargetPos; public Vec3 prevPos; public Vec3 pos; + public Vec3 motion; public int lastTick; + public float yaw; + public float prevYaw; + public boolean flipped; + public ResourceLocation modelKey; public ChainLiftPackagePhysicsData(Vec3 serverPosition) { - this.prevPos = serverPosition; - this.pos = serverPosition; + this.targetPos = null; + this.prevTargetPos = null; + this.pos = null; + this.prevPos = null; + this.motion = Vec3.ZERO; this.lastTick = AnimationTickHolder.getTicks(); } @@ -53,6 +64,7 @@ public class ChainLiftPackage { public boolean justFlipped; public Vec3 worldPosition; + public float yaw; private ChainLiftPackagePhysicsData physicsData; diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftRenderer.java b/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftRenderer.java index 204420ef5b..d29df1efe7 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftRenderer.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftRenderer.java @@ -3,33 +3,45 @@ package com.simibubi.create.content.kinetics.chainLift; import java.util.List; import java.util.Map.Entry; +import org.joml.Matrix3f; +import org.joml.Matrix4f; + +import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.kinetics.base.KineticBlockEntityRenderer; import com.simibubi.create.content.kinetics.chainLift.ChainLiftBlockEntity.ConnectionStats; import com.simibubi.create.content.kinetics.chainLift.ChainLiftPackage.ChainLiftPackagePhysicsData; +import com.simibubi.create.content.logistics.box.PackageItem; +import com.simibubi.create.foundation.render.RenderTypes; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.math.AngleHelper; import net.createmod.ponder.utility.LevelTickHolder; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider.Context; -import net.minecraft.client.renderer.entity.ItemRenderer; +import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction.Axis; +import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; -import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.level.Level; import net.minecraft.world.level.LightLayer; -import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; +import net.minecraftforge.registries.ForgeRegistries; public class ChainLiftRenderer extends KineticBlockEntityRenderer { + public static final ResourceLocation CHAIN_LOCATION = new ResourceLocation("textures/block/chain.png"); + public static final int MIP_DISTANCE = 48; + public ChainLiftRenderer(Context context) { super(context); } @@ -53,29 +65,66 @@ public class ChainLiftRenderer extends KineticBlockEntityRenderer, IWrenchable { @@ -13,6 +25,24 @@ public class PackagePortBlock extends Block implements IBE { + Vec3 diff = VecHelper.getCenterOf(pPos) + .subtract(pPlacer.position()); + be.passiveYaw = (float) (Mth.atan2(diff.x, diff.z) * Mth.RAD_TO_DEG); + be.notifyUpdate(); + }); + } + @Override public Class getBlockEntityClass() { return PackagePortBlockEntity.class; @@ -21,6 +51,6 @@ public class PackagePortBlock extends Block implements IBE getBlockEntityType() { return AllBlockEntityTypes.PACKAGE_PORT.get(); - } + } } diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java index 4a8fe45acc..4b6ca6f7ff 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java @@ -5,21 +5,37 @@ import java.util.List; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; +import com.simibubi.create.content.logistics.box.PackageEntity; +import com.simibubi.create.content.logistics.box.PackageItem; +import com.simibubi.create.content.logistics.filter.FilterItemStack; +import com.simibubi.create.content.logistics.filter.FilterItemStack.PackageFilterItemStack; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import com.simibubi.create.foundation.blockEntity.behaviour.filtering.FilteringBehaviour; +import com.simibubi.create.foundation.item.ItemHelper; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.core.particles.BlockParticleOption; +import net.minecraft.core.particles.ParticleTypes; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.ForgeCapabilities; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.ItemHandlerHelper; public class PackagePortBlockEntity extends SmartBlockEntity { @@ -28,10 +44,17 @@ public class PackagePortBlockEntity extends SmartBlockEntity { public PackagePortInventory inventory; private LazyOptional itemHandler; + public ItemStack animatedPackage; + public LerpedFloat animationProgress; + public boolean currentlyDepositing; + + public float passiveYaw; + public PackagePortBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); inventory = new PackagePortInventory(this); itemHandler = LazyOptional.of(() -> inventory); + animationProgress = LerpedFloat.linear(); } @Override @@ -41,6 +64,10 @@ public class PackagePortBlockEntity extends SmartBlockEntity { .withCallback(this::filterChanged)); } + public boolean isAnimationInProgress() { + return animationProgress.getChaseTarget() == 1; + } + @Override public AABB getRenderBoundingBox() { return super.getRenderBoundingBox().expandTowards(0, 1, 0); @@ -65,6 +92,10 @@ public class PackagePortBlockEntity extends SmartBlockEntity { super.lazyTick(); if (target != null) target.register(this, level, worldPosition); + if (level.isClientSide() || isAnimationInProgress()) + return; + tryPushingToAdjacentInventories(); + tryPullingFromAdjacentInventories(); } @Override @@ -72,6 +103,136 @@ public class PackagePortBlockEntity extends SmartBlockEntity { super.destroy(); if (target != null) target.deregister(this, level, worldPosition); + for (int i = 0; i < inventory.getSlots(); i++) + drop(inventory.getStackInSlot(i)); + } + + @Override + public void tick() { + super.tick(); + if (!isAnimationInProgress()) + return; + + animationProgress.tickChaser(); + + if (currentlyDepositing) { + if (!level.isClientSide()) { + if (animationProgress.getValue() > 0.5 && animatedPackage != null) { + if (target == null || !target.export(level, worldPosition, animatedPackage, false)) + drop(animatedPackage); + animatedPackage = null; + } + } else { + if (animationProgress.getValue() > 0.7) + animatedPackage = null; + } + } + + if (animationProgress.getValue() < 1) + return; + + animationProgress.startWithValue(0); + if (level.isClientSide()) { + animatedPackage = null; + return; + } + + if (!currentlyDepositing) { + inventory.receiveMode(true); + if (!ItemHandlerHelper.insertItem(inventory, animatedPackage.copy(), false) + .isEmpty()) + drop(animatedPackage); + inventory.receiveMode(false); + } + + animatedPackage = null; + } + + public void drop(ItemStack box) { + if (box.isEmpty()) + return; + level.addFreshEntity(PackageEntity.fromItemStack(level, VecHelper.getCenterOf(worldPosition), box)); + } + + public void startAnimation(ItemStack box, boolean deposit) { + if (!(box.getItem() instanceof PackageItem)) + return; + + animationProgress.startWithValue(0); + animationProgress.chase(1, 0.1, Chaser.LINEAR); + animatedPackage = box; + currentlyDepositing = deposit; + + if (level != null && level.isClientSide() && !currentlyDepositing) { + Vec3 vec = target.getExactTargetLocation(this, level, worldPosition); + if (vec != null) { + for (int i = 0; i < 5; i++) { + level.addParticle(new BlockParticleOption(ParticleTypes.BLOCK, AllBlocks.ROPE.getDefaultState()), + vec.x, vec.y - level.random.nextFloat() * 0.25, vec.z, 0, 0, 0); + } + } + } + + if (level != null && !level.isClientSide()) { + level.blockEntityChanged(worldPosition); + sendData(); + } + } + + protected void tryPushingToAdjacentInventories() { + if (inventory.isEmpty()) + return; + for (Direction side : Iterate.directions) { + if (side == Direction.UP) + continue; + IItemHandler handler = getAdjacentInventory(side); + if (handler == null) + continue; + boolean anyLeft = false; + for (int i = 0; i < inventory.getSlots(); i++) { + ItemStack stackInSlot = inventory.getStackInSlot(i); + if (stackInSlot.isEmpty()) + continue; + ItemStack remainder = ItemHandlerHelper.insertItemStacked(handler, stackInSlot, false); + if (remainder.isEmpty()) { + inventory.setStackInSlot(i, ItemStack.EMPTY); + level.blockEntityChanged(worldPosition); + } else + anyLeft = true; + } + if (!anyLeft) + break; + } + } + + public void tryPullingFromAdjacentInventories() { + if (target == null || !target.export(level, worldPosition, AllItems.CARDBOARD_PACKAGE_10x12.asStack(), true)) + return; + for (Direction side : Iterate.directions) { + if (side == Direction.UP) + continue; + IItemHandler handler = getAdjacentInventory(side); + if (handler == null) + continue; + ItemStack extract = ItemHelper.extract(handler, stack -> { + if (!PackageItem.isPackage(stack)) + return false; + String filterString = getFilterString(); + return filterString == null || !PackageItem.matchAddress(stack, filterString); + }, false); + if (extract.isEmpty()) + continue; + startAnimation(extract, true); + return; + } + } + + protected IItemHandler getAdjacentInventory(Direction side) { + BlockEntity blockEntity = level.getBlockEntity(worldPosition.relative(side)); + if (blockEntity == null || blockEntity instanceof PackagePortBlockEntity) + return null; + return blockEntity.getCapability(ForgeCapabilities.ITEM_HANDLER, side.getOpposite()) + .orElse(null); } @Override @@ -80,6 +241,11 @@ public class PackagePortBlockEntity extends SmartBlockEntity { if (target != null) tag.put("Target", target.write()); tag.put("Inventory", inventory.serializeNBT()); + tag.putFloat("PlacedYaw", passiveYaw); + if (animatedPackage != null) { + tag.put("AnimatedPackage", animatedPackage.serializeNBT()); + tag.putBoolean("Deposit", currentlyDepositing); + } } @Override @@ -87,6 +253,23 @@ public class PackagePortBlockEntity extends SmartBlockEntity { super.read(tag, clientPacket); target = PackagePortTarget.read(tag.getCompound("Target")); inventory.deserializeNBT(tag.getCompound("Inventory")); + passiveYaw = tag.getFloat("PlacedYaw"); + if (!clientPacket) + animatedPackage = null; + if (tag.contains("AnimatedPackage")) + startAnimation(ItemStack.of(tag.getCompound("AnimatedPackage")), tag.getBoolean("Deposit")); + } + + public String getFilterString() { + ItemStack filter = filtering.getFilter(); + String portFilter = null; + FilterItemStack filterStack = FilterItemStack.of(filter); + if (AllItems.PACKAGE_FILTER.isIn(filter)) { + if (!(filterStack instanceof PackageFilterItemStack pfis)) + return ""; + portFilter = pfis.filterString; + } + return portFilter; } } diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortInventory.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortInventory.java index adaf67f1af..cb3c9cefe7 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortInventory.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortInventory.java @@ -22,6 +22,20 @@ public class PackagePortInventory extends ItemStackHandler { receiveMode = enable; } + public boolean isBackedUp() { + for (int i = 0; i < getSlots(); i++) + if (getStackInSlot(i).isEmpty()) + return false; + return true; + } + + public boolean isEmpty() { + for (int i = 0; i < getSlots(); i++) + if (!getStackInSlot(i).isEmpty()) + return false; + return true; + } + @Override public @NotNull ItemStack insertItem(int slot, @NotNull ItemStack stack, boolean simulate) { if (!(stack.getItem() instanceof PackageItem)) @@ -29,12 +43,12 @@ public class PackagePortInventory extends ItemStackHandler { if (receiveMode) return super.insertItem(slot, stack, simulate); - PackagePortTarget target = port.target; - if (target == null) + if (port.isAnimationInProgress()) return stack; - if (!target.export(port.getLevel(), port.getBlockPos(), stack, simulate)) + if (port.target == null || !port.target.export(port.getLevel(), port.getBlockPos(), stack, true)) return stack; - + if (!simulate) + port.startAnimation(stack.copy(), true); return ItemStack.EMPTY; } diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortRenderer.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortRenderer.java index d53e9b5277..e8b1a431be 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortRenderer.java @@ -9,6 +9,10 @@ import net.createmod.catnip.render.SuperByteBuffer; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider.Context; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.registries.ForgeRegistries; public class PackagePortRenderer extends SmartBlockEntityRenderer { @@ -21,20 +25,131 @@ public class PackagePortRenderer extends SmartBlockEntityRenderer e.endOfRoute() && e.port() @@ -148,18 +150,6 @@ public abstract class PackagePortTarget { clbe.routingTable.changed = true; } - private String getFilterString(PackagePortBlockEntity ppbe) { - ItemStack filter = ppbe.filtering.getFilter(); - String portFilter = null; - FilterItemStack filterStack = FilterItemStack.of(filter); - if (AllItems.PACKAGE_FILTER.isIn(filter)) { - if (!(filterStack instanceof PackageFilterItemStack pfis)) - return ""; - portFilter = pfis.filterString; - } - return portFilter; - } - @Override protected void writeInternal(CompoundTag tag) { tag.putFloat("ChainPos", chainPos); @@ -178,6 +168,13 @@ public abstract class PackagePortTarget { } } + @Override + public Vec3 getExactTargetLocation(PackagePortBlockEntity ppbe, LevelAccessor level, BlockPos portPos) { + if (!(be(level, portPos) instanceof ChainLiftBlockEntity clbe)) + return Vec3.ZERO; + return clbe.getPackagePosition(chainPos, connection); + } + } } diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java index 809cab498e..c50ec84694 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java @@ -6,6 +6,7 @@ import java.util.List; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.content.logistics.crate.BottomlessItemHandler; +import com.simibubi.create.content.logistics.packagePort.PackagePortBlockEntity; import com.simibubi.create.content.logistics.packagerLink.PackagerLinkBlock; import com.simibubi.create.content.logistics.stockTicker.PackageOrder; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; @@ -21,9 +22,13 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; +import net.minecraft.network.chat.Component; import net.minecraft.util.Mth; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.entity.SignBlockEntity; +import net.minecraft.world.level.block.entity.SignText; import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.ForgeCapabilities; @@ -36,6 +41,7 @@ public class PackagerBlockEntity extends SmartBlockEntity { public boolean redstoneModeActive; public boolean redstonePowered; + public String signBasedAddress; public InvManipulationBehaviour targetInventory; public ItemStack heldBox; @@ -65,6 +71,7 @@ public class PackagerBlockEntity extends SmartBlockEntity { animationTicks = 0; animationInward = true; queuedRequests = new LinkedList<>(); + signBasedAddress = ""; } @Override @@ -88,7 +95,11 @@ public class PackagerBlockEntity extends SmartBlockEntity { previouslyUnwrapped = ItemStack.EMPTY; return; } + animationTicks--; + + if (animationTicks == 0 && !level.isClientSide()) + wakeTheFrogs(); } public void queueRequest(PackagingRequest packagingRequest) { @@ -124,6 +135,7 @@ public class PackagerBlockEntity extends SmartBlockEntity { recheckIfLinksPresent(); if (!redstoneModeActive) return; + updateSignAddress(); attemptToSend(false); } @@ -267,6 +279,10 @@ public class PackagerBlockEntity extends SmartBlockEntity { extractedPackageItem = extracted; if (!requestQueue) { + if (targetInv instanceof BottomlessItemHandler) { + continuePacking = true; + continue Outer; + } if (bulky) break Outer; continue; @@ -311,22 +327,62 @@ public class PackagerBlockEntity extends SmartBlockEntity { heldBox = extractedPackageItem.isEmpty() ? PackageItem.containing(extractedItems) : extractedPackageItem.copy(); PackageItem.clearAddress(heldBox); + if (fixedAddress != null) PackageItem.addAddress(heldBox, fixedAddress); if (requestQueue) PackageItem.setOrder(heldBox, fixedOrderId, linkIndexInOrder, finalLinkInOrder, packageIndexAtLink, finalPackageAtLink, orderContext); + if (!requestQueue && !signBasedAddress.isBlank()) + PackageItem.addAddress(heldBox, signBasedAddress); + animationInward = false; animationTicks = CYCLE; + notifyUpdate(); } + protected void updateSignAddress() { + signBasedAddress = ""; + for (Direction side : Iterate.directions) { + String address = getSign(side); + if (address == null || address.isBlank()) + continue; + signBasedAddress = address; + } + } + + protected String getSign(Direction side) { + BlockEntity blockEntity = level.getBlockEntity(worldPosition.relative(side)); + if (!(blockEntity instanceof SignBlockEntity sign)) + return null; + for (boolean front : Iterate.trueAndFalse) { + SignText text = sign.getText(front); + for (Component component : text.getMessages(false)) { + String address = component.getString(); + if (!address.isBlank()) + return address; + } + } + return null; + } + + protected void wakeTheFrogs() { + for (Direction side : Iterate.directions) { + if (side == Direction.DOWN) + continue; + if (level.getBlockEntity(worldPosition.relative(side)) instanceof PackagePortBlockEntity port) + port.tryPullingFromAdjacentInventories(); + } + } + @Override protected void read(CompoundTag compound, boolean clientPacket) { super.read(compound, clientPacket); redstonePowered = compound.getBoolean("Active"); animationInward = compound.getBoolean("AnimationInward"); animationTicks = compound.getInt("AnimationTicks"); + signBasedAddress = compound.getString("SignAddress"); heldBox = ItemStack.of(compound.getCompound("HeldBox")); previouslyUnwrapped = ItemStack.of(compound.getCompound("InsertedBox")); if (clientPacket) @@ -341,6 +397,7 @@ public class PackagerBlockEntity extends SmartBlockEntity { compound.putBoolean("Active", redstonePowered); compound.putBoolean("AnimationInward", animationInward); compound.putInt("AnimationTicks", animationTicks); + compound.putString("SignAddress", signBasedAddress); compound.put("HeldBox", heldBox.serializeNBT()); compound.put("InsertedBox", previouslyUnwrapped.serializeNBT()); if (clientPacket) diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java index a3844fc329..16f6e1203e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java @@ -282,7 +282,7 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { if (row > currentScroll + (rows - 1)) scale = Mth.clamp((currentScroll + rows) - row, 0, 1); scale *= scale; - if (scale < 0.1) + if (scale < 0.5) continue; for (int col = 0; col < cols; col++) { @@ -295,7 +295,7 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { ms.pushPose(); ms.translate(itemsX + col * colWidth, itemsY + row * rowHeight, 0); - renderItemEntry(graphics, scale, entry, isStackHovered, false); + renderItemEntry(graphics, 1, entry, isStackHovered, false); ms.popPose(); } } diff --git a/src/main/java/com/simibubi/create/foundation/block/BigOutlines.java b/src/main/java/com/simibubi/create/foundation/block/BigOutlines.java index a61a8c9bd2..47c1a7a9e0 100644 --- a/src/main/java/com/simibubi/create/foundation/block/BigOutlines.java +++ b/src/main/java/com/simibubi/create/foundation/block/BigOutlines.java @@ -1,6 +1,7 @@ package com.simibubi.create.foundation.block; import com.simibubi.create.content.decoration.slidingDoor.SlidingDoorBlock; +import com.simibubi.create.content.kinetics.chainLift.ChainLiftBlock; import com.simibubi.create.content.trains.track.TrackBlock; import com.simibubi.create.foundation.utility.RaycastHelper; @@ -12,6 +13,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.entity.ai.attributes.AttributeInstance; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.Vec3; @@ -46,10 +48,11 @@ public class BigOutlines { for (int z = -1; z <= 1; z++) { p.set(pos.getX() + x, pos.getY(), pos.getZ() + z); BlockState blockState = mc.level.getBlockState(p); + Block block = blockState.getBlock(); // Could be a dedicated interface for big blocks - if (!(blockState.getBlock() instanceof TrackBlock) - && !(blockState.getBlock() instanceof SlidingDoorBlock)) + if (!(block instanceof TrackBlock) && !(block instanceof SlidingDoorBlock) + && !(block instanceof ChainLiftBlock)) continue; BlockHitResult hit = blockState.getInteractionShape(mc.level, p) diff --git a/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java b/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java index 83091093d8..9645b83cc4 100644 --- a/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java +++ b/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java @@ -467,7 +467,8 @@ public class BuilderTransformers { public static NonNullUnaryOperator> packageItem( String material, int diameter, int height) { return b -> b.properties(p -> p.stacksTo(1)) - .model((c, p) -> p.getExistingFile(p.modLoc(c.getName()))) + .model((c, p) -> p.withExistingParent(c.getName(), + p.modLoc("item/packages/" + material + "_" + diameter + "x" + height))) .lang(material.substring(0, 1) .toUpperCase(Locale.ROOT) + material.substring(1) + " Package"); } diff --git a/src/main/java/com/simibubi/create/foundation/render/RenderTypes.java b/src/main/java/com/simibubi/create/foundation/render/RenderTypes.java index 757e92b649..990c82c60b 100644 --- a/src/main/java/com/simibubi/create/foundation/render/RenderTypes.java +++ b/src/main/java/com/simibubi/create/foundation/render/RenderTypes.java @@ -1,11 +1,13 @@ package com.simibubi.create.foundation.render; import java.io.IOException; +import java.util.function.Function; import com.mojang.blaze3d.vertex.DefaultVertexFormat; import com.mojang.blaze3d.vertex.VertexFormat; import com.simibubi.create.Create; +import net.minecraft.Util; import net.minecraft.client.renderer.RenderStateShard; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.ShaderInstance; @@ -20,11 +22,12 @@ import net.minecraftforge.fml.common.Mod.EventBusSubscriber; // TODO 1.17: use custom shaders instead of vanilla ones public class RenderTypes extends RenderStateShard { - public static final RenderStateShard.ShaderStateShard GLOWING_SHADER = new RenderStateShard.ShaderStateShard(() -> Shaders.glowingShader); + public static final RenderStateShard.ShaderStateShard GLOWING_SHADER = + new RenderStateShard.ShaderStateShard(() -> Shaders.glowingShader); public static RenderType getGlowingSolid(ResourceLocation texture) { - return RenderType.create(createLayerName("glowing_solid"), DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, - true, false, RenderType.CompositeState.builder() + return RenderType.create(createLayerName("glowing_solid"), DefaultVertexFormat.NEW_ENTITY, + VertexFormat.Mode.QUADS, 256, true, false, RenderType.CompositeState.builder() .setShaderState(GLOWING_SHADER) .setTextureState(new RenderStateShard.TextureStateShard(texture, false, false)) .setCullState(CULL) @@ -40,8 +43,8 @@ public class RenderTypes extends RenderStateShard { } public static RenderType getGlowingTranslucent(ResourceLocation texture) { - return RenderType.create(createLayerName("glowing_translucent"), DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, - 256, true, true, RenderType.CompositeState.builder() + return RenderType.create(createLayerName("glowing_translucent"), DefaultVertexFormat.NEW_ENTITY, + VertexFormat.Mode.QUADS, 256, true, true, RenderType.CompositeState.builder() .setShaderState(GLOWING_SHADER) .setTextureState(new RenderStateShard.TextureStateShard(texture, false, false)) .setTransparencyState(TRANSLUCENT_TRANSPARENCY) @@ -64,34 +67,50 @@ public class RenderTypes extends RenderStateShard { return ADDITIVE; } + private static final Function CHAIN = Util.memoize((p_234330_) -> { + return RenderType.create("chain_lift_chain", DefaultVertexFormat.BLOCK, VertexFormat.Mode.QUADS, 256, false, + true, RenderType.CompositeState.builder() + .setShaderState(RENDERTYPE_CUTOUT_MIPPED_SHADER) + .setTextureState(new RenderStateShard.TextureStateShard(p_234330_, false, true)) + .setTransparencyState(NO_TRANSPARENCY) + .setWriteMaskState(COLOR_DEPTH_WRITE) + .setLightmapState(LIGHTMAP) + .setOverlayState(OVERLAY) + .createCompositeState(false)); + }); + + public static RenderType chain(ResourceLocation pLocation) { + return CHAIN.apply(pLocation); + } + private static final RenderType GLOWING_TRANSLUCENT_DEFAULT = getGlowingTranslucent(InventoryMenu.BLOCK_ATLAS); public static RenderType getGlowingTranslucent() { return GLOWING_TRANSLUCENT_DEFAULT; } - private static final RenderType ITEM_PARTIAL_SOLID = - RenderType.create(createLayerName("item_partial_solid"), DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, true, - false, RenderType.CompositeState.builder() - .setShaderState(RENDERTYPE_ENTITY_SOLID_SHADER) - .setTextureState(BLOCK_SHEET) - .setCullState(CULL) - .setLightmapState(LIGHTMAP) - .setOverlayState(OVERLAY) - .createCompositeState(true)); + private static final RenderType ITEM_PARTIAL_SOLID = RenderType.create(createLayerName("item_partial_solid"), + DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, true, false, RenderType.CompositeState.builder() + .setShaderState(RENDERTYPE_ENTITY_SOLID_SHADER) + .setTextureState(BLOCK_SHEET) + .setCullState(CULL) + .setLightmapState(LIGHTMAP) + .setOverlayState(OVERLAY) + .createCompositeState(true)); public static RenderType getItemPartialSolid() { return ITEM_PARTIAL_SOLID; } - private static final RenderType ITEM_PARTIAL_TRANSLUCENT = RenderType.create(createLayerName("item_partial_translucent"), - DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, true, true, RenderType.CompositeState.builder() - .setShaderState(RENDERTYPE_ENTITY_TRANSLUCENT_CULL_SHADER) - .setTextureState(BLOCK_SHEET) - .setTransparencyState(TRANSLUCENT_TRANSPARENCY) - .setLightmapState(LIGHTMAP) - .setOverlayState(OVERLAY) - .createCompositeState(true)); + private static final RenderType ITEM_PARTIAL_TRANSLUCENT = + RenderType.create(createLayerName("item_partial_translucent"), DefaultVertexFormat.NEW_ENTITY, + VertexFormat.Mode.QUADS, 256, true, true, RenderType.CompositeState.builder() + .setShaderState(RENDERTYPE_ENTITY_TRANSLUCENT_CULL_SHADER) + .setTextureState(BLOCK_SHEET) + .setTransparencyState(TRANSLUCENT_TRANSPARENCY) + .setLightmapState(LIGHTMAP) + .setOverlayState(OVERLAY) + .createCompositeState(true)); public static RenderType getItemPartialTranslucent() { return ITEM_PARTIAL_TRANSLUCENT; @@ -113,7 +132,8 @@ public class RenderTypes extends RenderStateShard { @SubscribeEvent public static void onRegisterShaders(RegisterShadersEvent event) throws IOException { ResourceProvider resourceProvider = event.getResourceProvider(); - event.registerShader(new ShaderInstance(resourceProvider, Create.asResource("glowing_shader"), DefaultVertexFormat.NEW_ENTITY), shader -> glowingShader = shader); + event.registerShader(new ShaderInstance(resourceProvider, Create.asResource("glowing_shader"), + DefaultVertexFormat.NEW_ENTITY), shader -> glowingShader = shader); } } diff --git a/src/main/resources/assets/create/models/block/chain_lift/block.json b/src/main/resources/assets/create/models/block/chain_lift/block.json index 78c3956758..b53996608b 100644 --- a/src/main/resources/assets/create/models/block/chain_lift/block.json +++ b/src/main/resources/assets/create/models/block/chain_lift/block.json @@ -1,226 +1,6 @@ { - "credit": "Made with Blockbench", - "textures": { - "4": "create:block/gearbox", - "5": "create:block/secondary_linear_chassis_side", - "particle": "create:block/andesite_casing", - "casing": "create:block/andesite_casing", - "side": "create:block/andesite_encased_cogwheel_side" - }, - "elements": [ - { - "from": [0, 1, 0], - "to": [16, 6, 16], - "faces": { - "north": {"uv": [0, 10, 16, 15], "texture": "#5"}, - "east": {"uv": [0, 10, 16, 15], "texture": "#5"}, - "south": {"uv": [0, 10, 16, 15], "texture": "#5"}, - "west": {"uv": [0, 10, 16, 15], "texture": "#5"}, - "down": {"uv": [0, 0, 16, 16], "texture": "#4"} - } - }, - { - "from": [0, 10, 0], - "to": [16, 15, 16], - "faces": { - "north": {"uv": [0, 1, 16, 6], "texture": "#side"}, - "east": {"uv": [0, 1, 16, 6], "texture": "#side"}, - "south": {"uv": [0, 1, 16, 6], "texture": "#side"}, - "west": {"uv": [0, 1, 16, 6], "texture": "#side"}, - "up": {"uv": [0, 0, 16, 16], "texture": "#4"} - } - }, - { - "from": [0, 15, 0], - "to": [16, 16, 2], - "faces": { - "north": {"uv": [0, 0, 16, 1], "texture": "#side"}, - "east": {"uv": [14, 0, 16, 1], "texture": "#side"}, - "south": {"uv": [0, 0, 16, 1], "texture": "#casing"}, - "west": {"uv": [0, 0, 2, 1], "texture": "#side"}, - "up": {"uv": [0, 0, 16, 2], "texture": "#casing"} - } - }, - { - "from": [0, 15, 14], - "to": [16, 16, 16], - "faces": { - "north": {"uv": [0, 0, 16, 1], "texture": "#casing"}, - "east": {"uv": [0, 0, 2, 1], "texture": "#side"}, - "south": {"uv": [0, 0, 16, 1], "texture": "#side"}, - "west": {"uv": [14, 0, 16, 1], "texture": "#side"}, - "up": {"uv": [0, 14, 16, 16], "texture": "#casing"} - } - }, - { - "from": [0, 15, 2], - "to": [2, 16, 14], - "faces": { - "east": {"uv": [2, 0, 14, 1], "texture": "#casing"}, - "west": {"uv": [2, 0, 14, 1], "texture": "#side"}, - "up": {"uv": [0, 2, 2, 14], "texture": "#casing"} - } - }, - { - "from": [14, 15, 2], - "to": [16, 16, 14], - "faces": { - "east": {"uv": [2, 0, 14, 1], "texture": "#side"}, - "west": {"uv": [2, 0, 14, 1], "texture": "#casing"}, - "up": {"uv": [14, 2, 16, 14], "texture": "#casing"} - } - }, - { - "from": [0, 0, 0], - "to": [16, 1, 2], - "faces": { - "north": {"uv": [0, 15, 16, 16], "texture": "#side"}, - "east": {"uv": [14, 15, 16, 16], "texture": "#side"}, - "south": {"uv": [0, 0, 16, 1], "texture": "#casing"}, - "west": {"uv": [0, 15, 2, 16], "texture": "#side"}, - "down": {"uv": [0, 14, 16, 16], "texture": "#casing"} - } - }, - { - "from": [14, 0, 2], - "to": [16, 1, 14], - "faces": { - "east": {"uv": [2, 15, 14, 16], "texture": "#side"}, - "west": {"uv": [2, 0, 14, 1], "texture": "#casing"}, - "down": {"uv": [14, 2, 16, 14], "texture": "#casing"} - } - }, - { - "from": [0, 0, 14], - "to": [16, 1, 16], - "faces": { - "north": {"uv": [0, 0, 16, 1], "texture": "#casing"}, - "east": {"uv": [0, 15, 2, 16], "texture": "#side"}, - "south": {"uv": [0, 15, 16, 16], "texture": "#side"}, - "west": {"uv": [14, 15, 16, 16], "texture": "#side"}, - "down": {"uv": [0, 0, 16, 2], "texture": "#casing"} - } - }, - { - "from": [0, 0, 2], - "to": [2, 1, 14], - "faces": { - "east": {"uv": [2, 0, 14, 1], "texture": "#casing"}, - "west": {"uv": [2, 15, 14, 16], "texture": "#side"}, - "down": {"uv": [0, 2, 2, 14], "texture": "#casing"} - } - }, - { - "from": [1, 1.95, 8], - "to": [15, 14.05, 26], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "east": {"uv": [0, 2, 16, 14], "texture": "#5"}, - "south": {"uv": [2, 2, 16, 14], "texture": "#5"}, - "west": {"uv": [0, 2, 16, 14], "texture": "#5"}, - "up": {"uv": [0, 15, 16, 1], "rotation": 270, "texture": "#casing"}, - "down": {"uv": [0, 15, 16, 1], "rotation": 270, "texture": "#casing"} - } - }, - { - "from": [-10, 1.95, 1], - "to": [8, 14.05, 15], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [0, 2, 16, 14], "texture": "#5"}, - "south": {"uv": [0, 2, 16, 14], "texture": "#5"}, - "west": {"uv": [2, 2, 16, 14], "texture": "#5"}, - "up": {"uv": [0, 15, 16, 1], "texture": "#casing"}, - "down": {"uv": [0, 15, 16, 1], "rotation": 180, "texture": "#casing"} - } - }, - { - "from": [1, 1.95, -10], - "to": [15, 14.05, 8], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [2, 2, 16, 14], "texture": "#5"}, - "east": {"uv": [0, 2, 16, 14], "texture": "#5"}, - "west": {"uv": [0, 2, 16, 14], "texture": "#5"}, - "up": {"uv": [0, 15, 16, 1], "rotation": 90, "texture": "#casing"}, - "down": {"uv": [0, 15, 16, 1], "rotation": 90, "texture": "#casing"} - } - }, - { - "from": [8, 1.95, 1], - "to": [26, 14.05, 15], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [0, 2, 16, 14], "texture": "#5"}, - "east": {"uv": [2, 2, 16, 14], "texture": "#5"}, - "south": {"uv": [0, 2, 16, 14], "texture": "#5"}, - "up": {"uv": [0, 15, 16, 1], "rotation": 180, "texture": "#casing"}, - "down": {"uv": [0, 15, 16, 1], "texture": "#casing"} - } - }, - { - "from": [1, 2, 8], - "to": [15, 14, 26], - "rotation": {"angle": -45, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "east": {"uv": [0, 2, 16, 14], "texture": "#5"}, - "south": {"uv": [2, 2, 16, 14], "texture": "#5"}, - "west": {"uv": [0, 2, 16, 14], "texture": "#5"}, - "up": {"uv": [0, 15, 16, 1], "rotation": 270, "texture": "#casing"}, - "down": {"uv": [0, 15, 16, 1], "rotation": 270, "texture": "#casing"} - } - }, - { - "from": [-10, 2, 1], - "to": [8, 14, 15], - "rotation": {"angle": -45, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [0, 2, 16, 14], "texture": "#5"}, - "south": {"uv": [0, 2, 16, 14], "texture": "#5"}, - "west": {"uv": [2, 2, 16, 14], "texture": "#5"}, - "up": {"uv": [0, 15, 16, 1], "texture": "#casing"}, - "down": {"uv": [0, 15, 16, 1], "rotation": 180, "texture": "#casing"} - } - }, - { - "from": [1, 2, -10], - "to": [15, 14, 8], - "rotation": {"angle": -45, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [2, 2, 16, 14], "texture": "#5"}, - "east": {"uv": [0, 2, 16, 14], "texture": "#5"}, - "west": {"uv": [0, 2, 16, 14], "texture": "#5"}, - "up": {"uv": [0, 15, 16, 1], "rotation": 90, "texture": "#casing"}, - "down": {"uv": [0, 15, 16, 1], "rotation": 90, "texture": "#casing"} - } - }, - { - "from": [8, 2, 1], - "to": [26, 14, 15], - "rotation": {"angle": -45, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [0, 2, 16, 14], "texture": "#5"}, - "east": {"uv": [2, 2, 16, 14], "texture": "#5"}, - "south": {"uv": [0, 2, 16, 14], "texture": "#5"}, - "up": {"uv": [0, 15, 16, 1], "rotation": 180, "texture": "#casing"}, - "down": {"uv": [0, 15, 16, 1], "texture": "#casing"} - } - } - ], - "groups": [ - { - "name": "block_top_bottom", - "origin": [8, 8, 8], - "color": 0, - "children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] - }, - 10, - 11, - 12, - 13, - 14, - 15, - 16, - 17 - ] + "parent": "create:block/chain_lift/textures", + "loader": "forge:obj", + "flip_v": true, + "model": "create:models/block/chain_lift/conveyor_casing.obj" } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/chain_lift/conveyor_casing.mtl b/src/main/resources/assets/create/models/block/chain_lift/conveyor_casing.mtl new file mode 100644 index 0000000000..347b6bd961 --- /dev/null +++ b/src/main/resources/assets/create/models/block/chain_lift/conveyor_casing.mtl @@ -0,0 +1,5 @@ +# Blender 4.1.1 MTL File: 'conveyor.blend' +# www.blender.org + +newmtl casing +map_Kd #conveyor_casing diff --git a/src/main/resources/assets/create/models/block/chain_lift/conveyor_casing.obj b/src/main/resources/assets/create/models/block/chain_lift/conveyor_casing.obj new file mode 100644 index 0000000000..f9034f7d16 --- /dev/null +++ b/src/main/resources/assets/create/models/block/chain_lift/conveyor_casing.obj @@ -0,0 +1,355 @@ +# Blender 4.1.1 +# www.blender.org +mtllib conveyor_casing.mtl +o Cube.002 +v 0.965990 0.875000 -0.625000 +v 0.965990 0.125000 -0.625000 +v 0.034010 0.875000 -0.624999 +v 0.034010 0.125000 -0.624999 +v 0.000000 0.875000 0.000000 +v 0.062500 0.875000 0.000000 +v 0.937500 0.875000 0.000000 +v 1.000000 0.875000 0.000000 +v 0.062500 0.875000 -0.476712 +v 0.062500 0.875000 -0.556218 +v 0.937500 0.875000 -0.556218 +v 0.937500 0.875000 -0.476713 +v -0.295495 0.875000 -0.295494 +v -0.295495 0.125000 -0.295494 +v -0.207106 0.875000 -0.207106 +v 1.625000 0.875000 0.965990 +v 1.625000 0.125000 0.965990 +v 1.624999 0.875000 0.034010 +v 1.624999 0.125000 0.034010 +v 1.000000 0.875000 0.062500 +v 1.000000 0.875000 0.937500 +v 1.000000 0.875000 1.000000 +v 1.476712 0.875000 0.062500 +v 1.556218 0.875000 0.062500 +v 1.556218 0.875000 0.937500 +v 1.476713 0.875000 0.937500 +v 1.295495 0.125000 1.295495 +v 1.295494 0.875000 -0.295495 +v 1.295494 0.125000 -0.295495 +v 1.207106 0.875000 -0.207106 +v 0.034010 0.875000 1.625000 +v 0.034010 0.125000 1.625000 +v 0.965990 0.875000 1.624999 +v 0.965990 0.125000 1.624999 +v 0.937500 0.875000 1.000000 +v 0.062500 0.875000 1.000000 +v 0.000000 0.875000 1.000000 +v 0.937500 0.875000 1.476712 +v 0.937500 0.875000 1.556218 +v 0.062500 0.875000 1.556218 +v 0.062500 0.875000 1.476713 +v -0.295495 0.125000 1.295495 +v 1.295494 0.875000 1.295494 +v 1.207106 0.875000 1.207106 +v -0.625000 0.875000 0.034010 +v -0.625000 0.125000 0.034010 +v -0.624999 0.875000 0.965990 +v -0.624999 0.125000 0.965990 +v 0.000000 0.875000 0.937500 +v 0.000000 0.875000 0.062500 +v -0.476712 0.875000 0.937500 +v -0.556218 0.875000 0.937500 +v -0.556218 0.875000 0.062500 +v -0.476713 0.875000 0.062500 +v -0.295494 0.875000 1.295494 +v -0.207106 0.875000 1.207106 +v 0.125000 1.000000 0.875000 +v 0.125000 1.000000 0.125000 +v 0.875000 1.000000 0.875000 +v 0.875000 1.000000 0.125000 +v 0.000000 1.000000 1.000000 +v 0.000000 1.000000 0.000000 +v 1.000000 1.000000 0.000000 +v 1.000000 1.000000 1.000000 +v 0.500000 0.875000 0.500000 +v 0.125000 0.937500 0.875000 +v 0.125000 0.937500 0.125000 +v 0.875000 0.937500 0.125000 +v 0.875000 0.937500 0.875000 +v -0.246859 0.875000 -0.246859 +v -0.246859 0.875000 1.246859 +v 1.246859 0.875000 1.246859 +v 1.246859 0.875000 -0.246859 +v -0.499999 0.125000 0.914213 +v 0.085787 0.125000 -0.499999 +v 1.207106 0.125000 -0.207106 +v -0.207106 0.125000 -0.207106 +v 1.499999 0.125000 0.085787 +v 1.207107 0.125000 1.207107 +v 0.914213 0.125000 1.499999 +v -0.207107 0.125000 1.207106 +v -0.500000 0.125000 0.085787 +v 0.914213 0.125000 -0.500000 +v 1.500000 0.125000 0.914213 +v 0.085787 0.125000 1.500000 +v 0.500000 0.112500 0.500000 +v -0.499999 0.112500 0.914213 +v 0.085787 0.112500 -0.499999 +v 1.207106 0.112500 -0.207106 +v -0.207106 0.112500 -0.207106 +v 1.499999 0.112500 0.085787 +v 1.207107 0.112500 1.207107 +v 0.914213 0.112500 1.499999 +v -0.207107 0.112500 1.207106 +v -0.500000 0.112500 0.085787 +v 0.914213 0.112500 -0.500000 +v 1.500000 0.112500 0.914213 +v 0.085787 0.112500 1.500000 +v 0.250000 0.000000 0.750000 +v 0.250000 0.000000 0.250000 +v 0.750000 0.000000 0.750000 +v 0.750000 0.000000 0.250000 +v 0.125000 0.125000 0.875000 +v 0.125000 0.125000 0.125000 +v 0.875000 0.125000 0.125000 +v 0.875000 0.125000 0.875000 +v 0.125000 0.000000 0.125000 +v 0.125000 0.000000 0.875000 +v 0.875000 0.000000 0.125000 +v 0.875000 0.000000 0.875000 +v 0.250000 0.062500 0.250000 +v 0.250000 0.062500 0.750000 +v 0.750000 0.062500 0.250000 +v 0.750000 0.062500 0.750000 +vn -0.7071 -0.0000 -0.7071 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 -0.0000 -1.0000 +vn 0.7071 -0.0000 -0.7071 +vn 1.0000 -0.0000 -0.0000 +vn 0.7071 -0.0000 0.7071 +vn -0.0000 -0.0000 1.0000 +vn -0.7071 -0.0000 0.7071 +vn -1.0000 -0.0000 -0.0000 +vn -0.0000 -1.0000 -0.0000 +vt 0.750000 0.375000 +vt 0.750000 0.750000 +vt 0.517005 0.750000 +vt 0.517005 0.375000 +vt 0.031250 0.965610 +vt 0.468750 0.965609 +vt 0.482995 1.000000 +vt 0.017005 1.000000 +vt 0.750000 0.965610 +vt 0.750000 0.937500 +vt 0.940640 0.937500 +vt 0.968750 0.965610 +vt 0.031250 0.925857 +vt 0.468750 0.925857 +vt 0.982995 0.750000 +vt 0.982995 0.375000 +vt 0.750000 0.937500 +vt 0.559359 0.937500 +vt 0.727903 0.768956 +vt 0.750000 0.791054 +vt 0.531250 0.965609 +vt 0.750000 0.965610 +vt 0.772097 0.768957 +vt 0.750000 0.791054 +vt 0.031250 0.925857 +vt 0.031250 0.687500 +vt 0.468750 0.687500 +vt 0.468750 0.925857 +vt 0.968750 0.965609 +vt 0.940641 0.937500 +vt 0.750000 0.937500 +vt 0.750000 0.965610 +vt 0.559360 0.937500 +vt 0.531250 0.965610 +vt 0.750000 0.965610 +vt 0.000000 0.500000 +vt 0.000000 0.000000 +vt 0.062500 0.062500 +vt 0.062500 0.437500 +vt 0.500000 0.000000 +vt 0.500000 0.500000 +vt 0.437500 0.437500 +vt 0.437500 0.062500 +vt 0.437500 0.593750 +vt 0.062500 0.593750 +vt 0.062500 0.562500 +vt 0.437500 0.562500 +vt 0.000689 0.562694 +vt 0.031930 0.500212 +vt 0.469307 0.500212 +vt 0.500548 0.562694 +vt 0.000689 0.562818 +vt 0.031930 0.500336 +vt 0.469307 0.500336 +vt 0.500548 0.562818 +vt 0.031930 0.500460 +vt 0.469307 0.500459 +vt 0.500548 0.562942 +vt 0.000689 0.562942 +vt 0.000689 0.562571 +vt 0.031930 0.500088 +vt 0.469307 0.500088 +vt 0.500548 0.562571 +vt 0.437500 0.437500 +vt 0.062500 0.437500 +vt 0.062500 0.062500 +vt 0.437500 0.062500 +vt 0.000689 0.500088 +vt 0.500548 0.500336 +vt 0.500548 0.500088 +vt 0.000689 0.500212 +vt 0.500548 0.500212 +vt 0.000689 0.500460 +vt 0.500548 0.500459 +vt 0.000689 0.500336 +vt 0.517005 1.000000 +vt 0.750000 1.000000 +vt 0.982995 1.000000 +vt 0.017005 0.687500 +vt 0.042893 0.625000 +vt 0.250000 0.625000 +vt 0.250000 0.687500 +vt 0.000000 0.593750 +vt 0.031250 0.593750 +vt 0.031250 0.625000 +vt 0.000000 0.625000 +vt 0.482995 0.687500 +vt 0.042893 0.625000 +vt 0.457107 0.625000 +vt 0.500000 0.609375 +vt 0.000000 0.609375 +vt 0.937500 0.312500 +vt 0.937500 0.062500 +vt 0.968750 0.062500 +vt 0.968750 0.312500 +vt 0.875000 0.000000 +vt 0.937500 0.000000 +vt 0.937500 0.375000 +vt 0.875000 0.375000 +vt 0.562500 0.062500 +vt 0.562500 0.312500 +vt 0.500000 0.375000 +vt 0.500000 0.000000 +vt 0.812500 0.062500 +vt 0.875000 0.000000 +vt 0.812500 0.312500 +vt 0.875000 0.375000 +s 0 +usemtl casing +f 14/1/1 13/2/1 3/3/1 4/4/1 +f 10/5/2 11/6/2 1/7/2 3/8/2 +f 70/9/2 15/10/2 9/11/2 10/12/2 +f 10/5/2 9/13/2 12/14/2 11/6/2 +f 3/15/3 1/3/3 2/4/3 4/16/3 +f 2/16/4 1/15/4 28/2/4 29/1/4 +f 30/17/2 12/18/2 7/19/2 8/20/2 +f 11/21/2 12/18/2 30/17/2 73/22/2 +f 6/23/2 9/11/2 15/10/2 5/24/2 +f 9/25/2 6/26/2 7/27/2 12/28/2 +f 29/1/4 28/2/4 18/3/4 19/4/4 +f 24/5/2 25/6/2 16/7/2 18/8/2 +f 73/9/2 30/10/2 23/11/2 24/12/2 +f 24/5/2 23/13/2 26/14/2 25/6/2 +f 18/15/5 16/3/5 17/4/5 19/16/5 +f 17/16/6 16/15/6 43/2/6 27/1/6 +f 44/17/2 26/18/2 21/19/2 22/20/2 +f 25/29/2 26/30/2 44/31/2 72/32/2 +f 20/23/2 23/11/2 30/10/2 8/24/2 +f 23/25/2 20/26/2 21/27/2 26/28/2 +f 27/1/6 43/2/6 33/3/6 34/4/6 +f 39/5/2 40/6/2 31/7/2 33/8/2 +f 72/32/2 44/10/2 38/33/2 39/34/2 +f 39/5/2 38/13/2 41/14/2 40/6/2 +f 33/15/7 31/3/7 32/4/7 34/16/7 +f 32/16/8 31/15/8 55/2/8 42/1/8 +f 56/17/2 41/18/2 36/19/2 37/20/2 +f 40/21/2 41/18/2 56/17/2 71/35/2 +f 35/23/2 38/11/2 44/10/2 22/24/2 +f 38/25/2 35/26/2 36/27/2 41/28/2 +f 42/1/8 55/2/8 47/3/8 48/4/8 +f 52/5/2 53/6/2 45/7/2 47/8/2 +f 71/35/2 56/10/2 51/11/2 52/12/2 +f 52/5/2 51/13/2 54/14/2 53/6/2 +f 47/15/9 45/3/9 46/4/9 48/16/9 +f 46/16/1 45/15/1 13/2/1 14/1/1 +f 15/17/2 54/18/2 50/19/2 5/20/2 +f 53/21/2 54/18/2 15/17/2 70/9/2 +f 49/23/2 51/11/2 56/10/2 37/24/2 +f 51/25/2 49/26/2 50/27/2 54/28/2 +f 62/36/2 61/37/2 57/38/2 58/39/2 +f 64/40/2 63/41/2 60/42/2 59/43/2 +f 57/38/2 61/37/2 64/40/2 59/43/2 +f 57/44/3 59/45/3 69/46/3 66/47/3 +f 64/48/5 21/49/5 20/50/5 63/51/5 +f 62/52/9 50/53/9 49/54/9 61/55/9 +f 7/56/3 6/57/3 62/58/3 63/59/3 +f 63/41/2 62/36/2 58/39/2 60/42/2 +f 61/60/7 36/61/7 35/62/7 64/63/7 +f 68/64/2 67/65/2 66/66/2 69/67/2 +f 60/44/7 58/45/7 67/46/7 68/47/7 +f 59/44/9 60/45/9 68/46/9 69/47/9 +f 58/44/5 57/45/5 66/46/5 67/47/5 +f 37/68/7 36/61/7 61/60/7 +f 37/69/9 61/55/9 49/54/9 +f 22/70/7 64/63/7 35/62/7 +f 22/71/5 21/49/5 64/48/5 +f 8/72/5 63/51/5 20/50/5 +f 8/73/3 7/56/3 63/59/3 +f 5/74/3 62/58/3 6/57/3 +f 5/75/9 50/53/9 62/52/9 +f 45/76/2 53/21/2 70/9/2 13/77/2 +f 13/77/2 70/9/2 10/12/2 3/78/2 +f 55/77/2 71/35/2 52/12/2 47/78/2 +f 31/76/2 40/21/2 71/35/2 55/77/2 +f 43/77/2 72/32/2 39/34/2 33/76/2 +f 16/78/2 25/29/2 72/32/2 43/77/2 +f 28/77/2 73/9/2 24/12/2 18/78/2 +f 1/76/2 11/21/2 73/22/2 28/77/2 +f 4/79/10 75/80/10 77/81/10 14/82/10 +f 75/83/3 83/84/3 96/85/3 88/86/3 +f 19/87/10 17/79/10 84/88/10 78/89/10 +f 84/83/6 79/84/6 92/85/6 97/86/6 +f 19/79/10 78/80/10 76/81/10 29/82/10 +f 76/83/4 78/84/4 91/85/4 89/86/4 +f 34/87/10 32/79/10 85/88/10 80/89/10 +f 74/83/9 82/84/9 95/85/9 87/86/9 +f 34/79/10 80/80/10 79/81/10 27/82/10 +f 85/83/8 81/84/8 94/85/8 98/86/8 +f 48/87/10 46/79/10 82/88/10 74/89/10 +f 78/83/5 84/84/5 97/85/5 91/86/5 +f 48/79/10 74/80/10 81/81/10 42/82/10 +f 79/83/6 80/84/6 93/85/6 92/86/6 +f 82/83/1 77/84/1 90/85/1 95/86/1 +f 77/83/1 75/84/1 88/85/1 90/86/1 +f 82/89/10 46/87/10 14/82/10 77/81/10 +f 83/83/4 76/84/4 89/85/4 96/86/4 +f 85/89/10 32/87/10 42/82/10 81/81/10 +f 80/83/7 85/84/7 98/85/7 93/86/7 +f 84/89/10 17/87/10 27/82/10 79/81/10 +f 81/83/8 74/84/8 87/85/8 94/86/8 +f 83/89/10 2/87/10 29/82/10 76/81/10 +f 4/87/10 2/79/10 83/88/10 75/89/10 +f 88/83/10 96/86/10 86/90/10 +f 88/86/10 86/90/10 90/91/10 +f 91/83/10 97/86/10 86/90/10 +f 91/86/10 86/90/10 89/91/10 +f 93/83/10 98/86/10 86/90/10 +f 93/86/10 86/90/10 92/91/10 +f 87/83/10 95/86/10 86/90/10 +f 87/86/10 86/90/10 94/91/10 +f 86/90/10 95/83/10 90/91/10 +f 86/90/10 98/83/10 94/91/10 +f 86/90/10 97/83/10 92/91/10 +f 86/90/10 96/83/10 89/91/10 +f 101/92/3 99/93/3 112/94/3 114/95/3 +f 110/96/7 106/97/7 103/98/7 108/99/7 +f 109/96/5 105/97/5 106/98/5 110/99/5 +f 107/96/3 104/97/3 105/98/3 109/99/3 +f 108/96/9 103/97/9 104/98/9 107/99/9 +f 100/100/10 99/101/10 108/102/10 107/103/10 +f 102/104/10 100/100/10 107/103/10 109/105/10 +f 101/106/10 102/104/10 109/105/10 110/107/10 +f 99/101/10 101/106/10 110/107/10 108/102/10 +f 111/100/10 113/104/10 114/106/10 112/101/10 +f 100/92/7 102/93/7 113/94/7 111/95/7 +f 102/92/9 101/93/9 114/94/9 113/95/9 +f 99/92/5 100/93/5 111/94/5 112/95/5 diff --git a/src/main/resources/assets/create/models/block/chain_lift/conveyor_ports.mtl b/src/main/resources/assets/create/models/block/chain_lift/conveyor_ports.mtl new file mode 100644 index 0000000000..c3d88b9a08 --- /dev/null +++ b/src/main/resources/assets/create/models/block/chain_lift/conveyor_ports.mtl @@ -0,0 +1,5 @@ +# Blender 4.1.1 MTL File: 'conveyor.blend' +# www.blender.org + +newmtl port +map_Kd #conveyor_port \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/chain_lift/conveyor_ports.obj b/src/main/resources/assets/create/models/block/chain_lift/conveyor_ports.obj new file mode 100644 index 0000000000..7f3e7cb4f6 --- /dev/null +++ b/src/main/resources/assets/create/models/block/chain_lift/conveyor_ports.obj @@ -0,0 +1,64 @@ +# Blender 4.1.1 +# www.blender.org +mtllib conveyor_ports.mtl +o Axis.003 +v 1.437500 0.750000 0.937500 +v 1.437500 0.125000 0.937500 +v 1.437500 0.750000 1.625000 +v 1.437500 0.125000 1.625000 +v 1.000000 0.743750 0.937500 +v 1.000000 0.743750 1.625000 +v 1.000000 0.125000 0.937500 +v 1.000000 0.125000 1.625000 +v 1.437500 0.118750 0.937500 +v 1.437500 0.118750 1.625000 +v -0.437500 0.750000 0.937500 +v -0.437500 0.125000 0.937500 +v -0.437500 0.750000 1.625000 +v -0.437500 0.125000 1.625000 +v 0.000000 0.743750 0.937500 +v 0.000000 0.743750 1.625000 +v 0.000000 0.125000 0.937500 +v 0.000000 0.125000 1.625000 +v -0.437500 0.118750 0.937500 +v -0.437500 0.118750 1.625000 +vn -0.0000 -0.0000 -1.0000 +vn -0.0143 0.9999 -0.0000 +vn -1.0000 -0.0000 -0.0000 +vn -0.0000 -0.0000 1.0000 +vn 1.0000 -0.0000 -0.0000 +vn -0.0000 -1.0000 -0.0000 +vn 0.0143 0.9999 -0.0000 +vt 0.000000 0.000000 +vt 1.000000 0.687500 +vt 1.000000 0.000000 +vt 0.562500 0.000000 +vt 0.562500 0.687500 +vt 0.375000 0.000000 +vt 0.375000 0.687500 +vt 0.437500 0.375000 +vt 0.437500 1.000000 +vt 0.000000 1.000000 +vt -0.000000 0.375000 +vt 0.437500 0.000000 +vt 0.437500 0.687500 +vt -0.000000 0.687500 +vt 0.437500 0.437500 +s 0 +usemtl port +f 7/1/1 2/1/1 9/1/1 +f 3/2/2 1/3/2 5/4/2 6/5/2 +f 6/2/3 5/3/3 7/6/3 8/7/3 +f 4/8/4 3/9/4 6/10/4 8/11/4 +f 3/2/5 4/7/5 2/6/5 1/3/5 +f 7/1/6 9/12/6 10/13/6 8/14/6 +f 4/15/4 8/11/4 10/8/4 +f 2/12/5 4/13/5 10/7/5 9/6/5 +f 17/1/1 19/1/1 12/1/1 +f 13/2/7 16/5/7 15/4/7 11/3/7 +f 16/2/5 18/7/5 17/6/5 15/3/5 +f 14/8/4 18/11/4 16/10/4 13/9/4 +f 13/2/3 11/3/3 12/6/3 14/7/3 +f 17/1/6 18/14/6 20/13/6 19/12/6 +f 14/15/4 20/8/4 18/11/4 +f 12/12/3 19/6/3 20/7/3 14/13/3 diff --git a/src/main/resources/assets/create/models/block/chain_lift/conveyor_shaft.mtl b/src/main/resources/assets/create/models/block/chain_lift/conveyor_shaft.mtl new file mode 100644 index 0000000000..39ded82a13 --- /dev/null +++ b/src/main/resources/assets/create/models/block/chain_lift/conveyor_shaft.mtl @@ -0,0 +1,17 @@ +# Blender 4.1.1 MTL File: 'conveyor.blend' +# www.blender.org + +newmtl axis +map_Kd #axis + +newmtl axis_top +map_Kd #axis_top + +newmtl bullwheel +map_Kd #bullwheel + +newmtl casing +map_Kd #conveyor_casing + +newmtl shadow +map_Kd #conveyor_port diff --git a/src/main/resources/assets/create/models/block/chain_lift/conveyor_shaft.obj b/src/main/resources/assets/create/models/block/chain_lift/conveyor_shaft.obj new file mode 100644 index 0000000000..9de7402029 --- /dev/null +++ b/src/main/resources/assets/create/models/block/chain_lift/conveyor_shaft.obj @@ -0,0 +1,45 @@ +# Blender 4.1.1 +# www.blender.org +mtllib conveyor_shaft.mtl +o Axis.005 +v 0.625000 1.000000 0.375000 +v 0.375000 1.000000 0.375000 +v 0.625000 -0.000000 0.375000 +v 0.375000 -0.000000 0.375000 +v 0.375000 1.000000 0.625000 +v 0.625000 1.000000 0.625000 +v 0.375000 -0.000000 0.625000 +v 0.625000 -0.000000 0.625000 +v -0.500000 0.106250 1.500000 +v -0.500000 0.106250 -0.500000 +v 1.500000 0.106250 -0.500000 +v 1.500000 0.106250 1.500000 +vn -1.0000 -0.0000 -0.0000 +vn -0.0000 -0.0000 -1.0000 +vn 1.0000 -0.0000 -0.0000 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 -1.0000 -0.0000 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.625000 1.000000 +vt 0.375000 1.000000 +vt 0.375000 0.375000 +vt 0.625000 0.375000 +vt 0.625000 0.625000 +vt 0.375000 0.625000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +s 0 +usemtl axis +f 4/1/1 7/2/1 5/3/1 2/4/1 +f 3/1/2 4/2/2 2/3/2 1/4/2 +f 8/1/3 3/2/3 1/3/3 6/4/3 +f 7/1/4 8/2/4 6/3/4 5/4/4 +usemtl axis_top +f 6/5/5 1/6/5 2/7/5 5/8/5 +f 7/5/6 4/6/6 3/7/6 8/8/6 +usemtl bullwheel +f 12/9/6 9/10/6 10/11/6 11/12/6 diff --git a/src/main/resources/assets/create/models/block/chain_lift/guard.json b/src/main/resources/assets/create/models/block/chain_lift/guard.json index c70e91f9fb..b3c7a4c3e4 100644 --- a/src/main/resources/assets/create/models/block/chain_lift/guard.json +++ b/src/main/resources/assets/create/models/block/chain_lift/guard.json @@ -1,62 +1,6 @@ { - "credit": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)", - "parent": "block/block", - "textures": { - "7": "create:block/girder_pole", - "particle": "create:block/axis" - }, - "elements": [ - { - "from": [18, -2.55, 4], - "to": [22.05, 5.5, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 4]}, - "faces": { - "north": {"uv": [8, 12, 0, 8], "rotation": 90, "texture": "#7"}, - "east": {"uv": [8, 12, 0, 0], "rotation": 90, "texture": "#7"}, - "south": {"uv": [8, 12, 0, 8], "rotation": 90, "texture": "#7"}, - "west": {"uv": [8, 0, 0, 12], "rotation": 90, "texture": "#7"}, - "up": {"uv": [1, 12, 0, 0], "texture": "#7"}, - "down": {"uv": [1, 12, 0, 0], "rotation": 180, "texture": "#7"} - } - }, - { - "from": [17, -3, 12], - "to": [23, 3, 20], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 5]}, - "faces": { - "north": {"uv": [15, 1, 9, 7], "texture": "#7"}, - "east": {"uv": [7, 12, 1, 4], "rotation": 90, "texture": "#7"}, - "south": {"uv": [9, 1, 15, 7], "rotation": 180, "texture": "#7"}, - "west": {"uv": [1, 12, 7, 4], "rotation": 270, "texture": "#7"}, - "up": {"uv": [7, 4, 1, 12], "rotation": 180, "texture": "#7"}, - "down": {"uv": [7, 4, 1, 12], "texture": "#7"} - } - }, - { - "from": [-6.05, -2.55, 4], - "to": [-2, 5.5, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 4]}, - "faces": { - "north": {"uv": [8, 8, 0, 12], "rotation": 90, "texture": "#7"}, - "east": {"uv": [8, 12, 0, 0], "rotation": 90, "texture": "#7"}, - "south": {"uv": [8, 8, 0, 12], "rotation": 90, "texture": "#7"}, - "west": {"uv": [8, 0, 0, 12], "rotation": 90, "texture": "#7"}, - "up": {"uv": [0, 12, 1, 0], "texture": "#7"}, - "down": {"uv": [0, 12, 1, 0], "rotation": 180, "texture": "#7"} - } - }, - { - "from": [-7, -3, 12], - "to": [-1, 3, 20], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 5]}, - "faces": { - "north": {"uv": [9, 1, 15, 7], "texture": "#7"}, - "east": {"uv": [1, 4, 7, 12], "rotation": 270, "texture": "#7"}, - "south": {"uv": [15, 1, 9, 7], "rotation": 180, "texture": "#7"}, - "west": {"uv": [7, 4, 1, 12], "rotation": 90, "texture": "#7"}, - "up": {"uv": [1, 4, 7, 12], "rotation": 180, "texture": "#7"}, - "down": {"uv": [1, 4, 7, 12], "texture": "#7"} - } - } - ] + "parent": "create:block/chain_lift/textures", + "loader": "forge:obj", + "flip_v": true, + "model": "create:models/block/chain_lift/conveyor_ports.obj" } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/chain_lift/item.json b/src/main/resources/assets/create/models/block/chain_lift/item.json index 834be48e40..10b8a74483 100644 --- a/src/main/resources/assets/create/models/block/chain_lift/item.json +++ b/src/main/resources/assets/create/models/block/chain_lift/item.json @@ -1,362 +1,18 @@ { - "parent": "create:block/large_wheels", - "textures": { - "0": "create:block/axis", - "1": "create:block/axis_top", - "4": "create:block/gearbox", - "5": "create:block/secondary_linear_chassis_side", - "casing": "create:block/andesite_casing", - "side": "create:block/andesite_encased_cogwheel_side", - "1_7": "create:block/girder_pole", - "particle": "create:block/axis" - }, - "elements": [ - { - "from": [0, 1, 0], - "to": [16, 6, 16], - "faces": { - "north": {"uv": [0, 10, 16, 15], "texture": "#5"}, - "east": {"uv": [0, 10, 16, 15], "texture": "#5"}, - "south": {"uv": [0, 10, 16, 15], "texture": "#5"}, - "west": {"uv": [0, 10, 16, 15], "texture": "#5"}, - "down": {"uv": [0, 0, 16, 16], "texture": "#4"} - } - }, - { - "from": [0, 10, 0], - "to": [16, 15, 16], - "faces": { - "north": {"uv": [0, 1, 16, 6], "texture": "#side"}, - "east": {"uv": [0, 1, 16, 6], "texture": "#side"}, - "south": {"uv": [0, 1, 16, 6], "texture": "#side"}, - "west": {"uv": [0, 1, 16, 6], "texture": "#side"}, - "up": {"uv": [0, 0, 16, 16], "texture": "#4"} - } - }, - { - "from": [0, 15, 0], - "to": [16, 16, 2], - "faces": { - "north": {"uv": [0, 0, 16, 1], "texture": "#side"}, - "east": {"uv": [14, 0, 16, 1], "texture": "#side"}, - "south": {"uv": [0, 0, 16, 1], "texture": "#casing"}, - "west": {"uv": [0, 0, 2, 1], "texture": "#side"}, - "up": {"uv": [0, 0, 16, 2], "texture": "#casing"} - } - }, - { - "from": [0, 15, 14], - "to": [16, 16, 16], - "faces": { - "north": {"uv": [0, 0, 16, 1], "texture": "#casing"}, - "east": {"uv": [0, 0, 2, 1], "texture": "#side"}, - "south": {"uv": [0, 0, 16, 1], "texture": "#side"}, - "west": {"uv": [14, 0, 16, 1], "texture": "#side"}, - "up": {"uv": [0, 14, 16, 16], "texture": "#casing"} - } - }, - { - "from": [0, 15, 2], - "to": [2, 16, 14], - "faces": { - "east": {"uv": [2, 0, 14, 1], "texture": "#casing"}, - "west": {"uv": [2, 0, 14, 1], "texture": "#side"}, - "up": {"uv": [0, 2, 2, 14], "texture": "#casing"} - } - }, - { - "from": [14, 15, 2], - "to": [16, 16, 14], - "faces": { - "east": {"uv": [2, 0, 14, 1], "texture": "#side"}, - "west": {"uv": [2, 0, 14, 1], "texture": "#casing"}, - "up": {"uv": [14, 2, 16, 14], "texture": "#casing"} - } - }, - { - "from": [0, 0, 0], - "to": [16, 1, 2], - "faces": { - "north": {"uv": [0, 15, 16, 16], "texture": "#side"}, - "east": {"uv": [14, 15, 16, 16], "texture": "#side"}, - "south": {"uv": [0, 0, 16, 1], "texture": "#casing"}, - "west": {"uv": [0, 15, 2, 16], "texture": "#side"}, - "down": {"uv": [0, 14, 16, 16], "texture": "#casing"} - } - }, - { - "from": [14, 0, 2], - "to": [16, 1, 14], - "faces": { - "east": {"uv": [2, 15, 14, 16], "texture": "#side"}, - "west": {"uv": [2, 0, 14, 1], "texture": "#casing"}, - "down": {"uv": [14, 2, 16, 14], "texture": "#casing"} - } - }, - { - "from": [0, 0, 14], - "to": [16, 1, 16], - "faces": { - "north": {"uv": [0, 0, 16, 1], "texture": "#casing"}, - "east": {"uv": [0, 15, 2, 16], "texture": "#side"}, - "south": {"uv": [0, 15, 16, 16], "texture": "#side"}, - "west": {"uv": [14, 15, 16, 16], "texture": "#side"}, - "down": {"uv": [0, 0, 16, 2], "texture": "#casing"} - } - }, - { - "from": [0, 0, 2], - "to": [2, 1, 14], - "faces": { - "east": {"uv": [2, 0, 14, 1], "texture": "#casing"}, - "west": {"uv": [2, 15, 14, 16], "texture": "#side"}, - "down": {"uv": [0, 2, 2, 14], "texture": "#casing"} - } - }, - { - "from": [1, 1.95, 8], - "to": [15, 14.05, 26], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "east": {"uv": [0, 2, 16, 14], "texture": "#5"}, - "south": {"uv": [2, 2, 16, 14], "texture": "#5"}, - "west": {"uv": [0, 2, 16, 14], "texture": "#5"}, - "up": {"uv": [0, 15, 16, 1], "rotation": 270, "texture": "#casing"}, - "down": {"uv": [0, 15, 16, 1], "rotation": 270, "texture": "#casing"} - } - }, - { - "from": [-10, 1.95, 1], - "to": [8, 14.05, 15], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [0, 2, 16, 14], "texture": "#5"}, - "south": {"uv": [0, 2, 16, 14], "texture": "#5"}, - "west": {"uv": [2, 2, 16, 14], "texture": "#5"}, - "up": {"uv": [0, 15, 16, 1], "texture": "#casing"}, - "down": {"uv": [0, 15, 16, 1], "rotation": 180, "texture": "#casing"} - } - }, - { - "from": [1, 1.95, -10], - "to": [15, 14.05, 8], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [2, 2, 16, 14], "texture": "#5"}, - "east": {"uv": [0, 2, 16, 14], "texture": "#5"}, - "west": {"uv": [0, 2, 16, 14], "texture": "#5"}, - "up": {"uv": [0, 15, 16, 1], "rotation": 90, "texture": "#casing"}, - "down": {"uv": [0, 15, 16, 1], "rotation": 90, "texture": "#casing"} - } - }, - { - "from": [8, 1.95, 1], - "to": [26, 14.05, 15], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [0, 2, 16, 14], "texture": "#5"}, - "east": {"uv": [2, 2, 16, 14], "texture": "#5"}, - "south": {"uv": [0, 2, 16, 14], "texture": "#5"}, - "up": {"uv": [0, 15, 16, 1], "rotation": 180, "texture": "#casing"}, - "down": {"uv": [0, 15, 16, 1], "texture": "#casing"} - } - }, - { - "from": [1, 2, 8], - "to": [15, 14, 26], - "rotation": {"angle": -45, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "east": {"uv": [0, 2, 16, 14], "texture": "#5"}, - "south": {"uv": [2, 2, 16, 14], "texture": "#5"}, - "west": {"uv": [0, 2, 16, 14], "texture": "#5"}, - "up": {"uv": [0, 15, 16, 1], "rotation": 270, "texture": "#casing"}, - "down": {"uv": [0, 15, 16, 1], "rotation": 270, "texture": "#casing"} - } - }, - { - "from": [-10, 2, 1], - "to": [8, 14, 15], - "rotation": {"angle": -45, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [0, 2, 16, 14], "texture": "#5"}, - "south": {"uv": [0, 2, 16, 14], "texture": "#5"}, - "west": {"uv": [2, 2, 16, 14], "texture": "#5"}, - "up": {"uv": [0, 15, 16, 1], "texture": "#casing"}, - "down": {"uv": [0, 15, 16, 1], "rotation": 180, "texture": "#casing"} - } - }, - { - "from": [1, 2, -10], - "to": [15, 14, 8], - "rotation": {"angle": -45, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [2, 2, 16, 14], "texture": "#5"}, - "east": {"uv": [0, 2, 16, 14], "texture": "#5"}, - "west": {"uv": [0, 2, 16, 14], "texture": "#5"}, - "up": {"uv": [0, 15, 16, 1], "rotation": 90, "texture": "#casing"}, - "down": {"uv": [0, 15, 16, 1], "rotation": 90, "texture": "#casing"} - } - }, - { - "from": [8, 2, 1], - "to": [26, 14, 15], - "rotation": {"angle": -45, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [0, 2, 16, 14], "texture": "#5"}, - "east": {"uv": [2, 2, 16, 14], "texture": "#5"}, - "south": {"uv": [0, 2, 16, 14], "texture": "#5"}, - "up": {"uv": [0, 15, 16, 1], "rotation": 180, "texture": "#casing"}, - "down": {"uv": [0, 15, 16, 1], "texture": "#casing"} - } - }, - { - "from": [-7, 0, -7], - "to": [1, 6, -1], - "faces": { - "north": {"uv": [7, 4, 1, 12], "rotation": 90, "texture": "#1_7"}, - "east": {"uv": [9, 1, 15, 7], "texture": "#1_7"}, - "south": {"uv": [1, 4, 7, 12], "rotation": 270, "texture": "#1_7"}, - "west": {"uv": [9, 1, 15, 7], "rotation": 180, "texture": "#1_7"}, - "up": {"uv": [1, 4, 7, 12], "rotation": 270, "texture": "#1_7"}, - "down": {"uv": [1, 4, 7, 12], "rotation": 270, "texture": "#1_7"} - } - }, - { - "from": [1, 0.95, -6.05], - "to": [9, 6, -1], - "faces": { - "north": {"uv": [6, 4, 1, 12], "rotation": 90, "texture": "#1_7"}, - "east": {"uv": [1, 5, 6.05, 10.05], "texture": "#1_7"}, - "south": {"uv": [1, 4, 6, 12], "rotation": 90, "texture": "#1_7"}, - "west": {"uv": [9, 1, 15, 7], "rotation": 180, "texture": "#1_7"}, - "up": {"uv": [6, 4, 1, 12], "rotation": 90, "texture": "#1_7"}, - "down": {"uv": [6, 4, 1, 12], "rotation": 90, "texture": "#1_7"} - } - }, - { - "from": [1, 0.95, 17], - "to": [9, 6, 22.05], - "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 16]}, - "faces": { - "north": {"uv": [1, 12, 6, 4], "rotation": 90, "texture": "#1_7"}, - "east": {"uv": [1, 5, 6.05, 10.05], "texture": "#1_7"}, - "south": {"uv": [6, 12, 1, 4], "rotation": 90, "texture": "#1_7"}, - "west": {"uv": [15, 1, 9, 7], "rotation": 180, "texture": "#1_7"}, - "up": {"uv": [1, 4, 6, 12], "rotation": 90, "texture": "#1_7"}, - "down": {"uv": [1, 4, 6, 12], "rotation": 90, "texture": "#1_7"} - } - }, - { - "from": [-7, 0, 17], - "to": [1, 6, 23], - "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 16]}, - "faces": { - "north": {"uv": [1, 12, 7, 4], "rotation": 270, "texture": "#1_7"}, - "east": {"uv": [15, 1, 9, 7], "texture": "#1_7"}, - "south": {"uv": [7, 12, 1, 4], "rotation": 90, "texture": "#1_7"}, - "west": {"uv": [9, 1, 15, 7], "rotation": 180, "texture": "#1_7"}, - "up": {"uv": [7, 4, 1, 12], "rotation": 270, "texture": "#1_7"}, - "down": {"uv": [7, 4, 1, 12], "rotation": 270, "texture": "#1_7"} - } - }, - { - "from": [15, 0, -7], - "to": [23, 6, -1], - "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, - "faces": { - "north": {"uv": [7, 12, 1, 4], "rotation": 90, "texture": "#1_7"}, - "east": {"uv": [15, 1, 9, 7], "rotation": 180, "texture": "#1_7"}, - "south": {"uv": [1, 12, 7, 4], "rotation": 270, "texture": "#1_7"}, - "west": {"uv": [15, 1, 9, 7], "texture": "#1_7"}, - "up": {"uv": [1, 12, 7, 4], "rotation": 270, "texture": "#1_7"}, - "down": {"uv": [1, 12, 7, 4], "rotation": 270, "texture": "#1_7"} - } - }, - { - "from": [7, 0.95, -6.05], - "to": [15, 6, -1], - "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, - "faces": { - "north": {"uv": [6, 12, 1, 4], "rotation": 90, "texture": "#1_7"}, - "east": {"uv": [15, 1, 9, 7], "rotation": 180, "texture": "#1_7"}, - "south": {"uv": [1, 12, 6, 4], "rotation": 90, "texture": "#1_7"}, - "west": {"uv": [6.05, 5, 1, 10.05], "texture": "#1_7"}, - "up": {"uv": [6, 12, 1, 4], "rotation": 90, "texture": "#1_7"}, - "down": {"uv": [6, 12, 1, 4], "rotation": 90, "texture": "#1_7"} - } - }, - { - "from": [7, 0.95, 17], - "to": [15, 6, 22.05], - "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 16]}, - "faces": { - "north": {"uv": [1, 4, 6, 12], "rotation": 90, "texture": "#1_7"}, - "east": {"uv": [9, 1, 15, 7], "rotation": 180, "texture": "#1_7"}, - "south": {"uv": [6, 4, 1, 12], "rotation": 90, "texture": "#1_7"}, - "west": {"uv": [6.05, 5, 1, 10.05], "texture": "#1_7"}, - "up": {"uv": [1, 12, 6, 4], "rotation": 90, "texture": "#1_7"}, - "down": {"uv": [1, 12, 6, 4], "rotation": 90, "texture": "#1_7"} - } - }, - { - "from": [15, 0, 17], - "to": [23, 6, 23], - "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 16]}, - "faces": { - "north": {"uv": [1, 4, 7, 12], "rotation": 270, "texture": "#1_7"}, - "east": {"uv": [15, 1, 9, 7], "rotation": 180, "texture": "#1_7"}, - "south": {"uv": [7, 4, 1, 12], "rotation": 90, "texture": "#1_7"}, - "west": {"uv": [9, 1, 15, 7], "texture": "#1_7"}, - "up": {"uv": [7, 12, 1, 4], "rotation": 270, "texture": "#1_7"}, - "down": {"uv": [7, 12, 1, 4], "rotation": 270, "texture": "#1_7"} - } - }, - { - "name": "Axis", - "from": [6, 0, 6], - "to": [10, 16, 10], - "faces": { - "north": {"uv": [6, 0, 10, 16], "texture": "#0"}, - "east": {"uv": [6, 0, 10, 16], "texture": "#0"}, - "south": {"uv": [6, 0, 10, 16], "texture": "#0"}, - "west": {"uv": [6, 0, 10, 16], "texture": "#0"}, - "up": {"uv": [6, 6, 10, 10], "texture": "#1"}, - "down": {"uv": [6, 6, 10, 10], "texture": "#1"} - } - } - ], - "groups": [ - { - "name": "block_top_bottom", - "origin": [8, 8, 8], - "color": 0, - "children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] - }, - 10, - 11, - 12, - 13, - 14, - 15, - 16, - 17, - { - "name": "guard", - "origin": [8, 8, 8], - "color": 0, - "children": [18, 19, 20, 21] - }, - { - "name": "guard", - "origin": [8, 8, 8], - "color": 0, - "children": [22, 23, 24, 25] - }, - { - "name": "shaft", - "origin": [8, 8, 8], - "color": 0, - "children": [26] - } - ] + "parent": "create:block/chain_lift/textures", + "loader": "forge:obj", + "flip_v": true, + "model": "create:models/block/chain_lift/item.obj", + "display": { + "gui": { + "rotation": [ 30, 225, 0 ], + "translation": [ 0, 0, 0], + "scale":[ 0.5, 0.5, 0.5 ] + }, + "fixed": { + "rotation": [ 90, 0, 0 ], + "translation": [ 0, 0, 0], + "scale":[ 0.5, 0.5, 0.5 ] + } + } } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/chain_lift/item.mtl b/src/main/resources/assets/create/models/block/chain_lift/item.mtl new file mode 100644 index 0000000000..95b39dfdd3 --- /dev/null +++ b/src/main/resources/assets/create/models/block/chain_lift/item.mtl @@ -0,0 +1,17 @@ +# Blender 4.1.1 MTL File: 'conveyor.blend' +# www.blender.org + +newmtl axis +map_Kd #axis + +newmtl axis_top +map_Kd #axis_top + +newmtl bullwheel +map_Kd #bullwheel + +newmtl casing +map_Kd #conveyor_casing + +newmtl port +map_Kd #conveyor_port diff --git a/src/main/resources/assets/create/models/block/chain_lift/item.obj b/src/main/resources/assets/create/models/block/chain_lift/item.obj new file mode 100644 index 0000000000..6d61ae261a --- /dev/null +++ b/src/main/resources/assets/create/models/block/chain_lift/item.obj @@ -0,0 +1,459 @@ +# Blender 4.1.1 +# www.blender.org +mtllib item.mtl +o Axis.003 +v 1.437500 0.750000 0.937500 +v 1.437500 0.125000 0.937500 +v 1.437500 0.750000 1.625000 +v 1.437500 0.125000 1.625000 +v 1.000000 0.743750 0.937500 +v 1.000000 0.743750 1.625000 +v 1.000000 0.125000 0.937500 +v 1.000000 0.125000 1.625000 +v 1.437500 0.118750 0.937500 +v 1.437500 0.118750 1.625000 +v -0.437500 0.750000 0.937500 +v -0.437500 0.125000 0.937500 +v -0.437500 0.750000 1.625000 +v -0.437500 0.125000 1.625000 +v 0.000000 0.743750 0.937500 +v 0.000000 0.743750 1.625000 +v 0.000000 0.125000 0.937500 +v 0.000000 0.125000 1.625000 +v -0.437500 0.118750 0.937500 +v -0.437500 0.118750 1.625000 +vn -0.0000 -0.0000 -1.0000 +vn -0.0143 0.9999 -0.0000 +vn 1.0000 -0.0000 -0.0000 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 -1.0000 -0.0000 +vn 0.0143 0.9999 -0.0000 +vn -1.0000 -0.0000 -0.0000 +vt 0.000000 0.000000 +vt 1.000000 0.687500 +vt 1.000000 0.000000 +vt 0.562500 0.000000 +vt 0.562500 0.687500 +vt 0.375000 0.687500 +vt 0.375000 0.000000 +vt 0.437500 0.375000 +vt 0.437500 1.000000 +vt 0.000000 1.000000 +vt -0.000000 0.375000 +vt 0.437500 0.000000 +vt 0.437500 0.687500 +vt -0.000000 0.687500 +vt 0.437500 0.437500 +s 0 +usemtl port +f 7/1/1 2/1/1 9/1/1 +f 3/2/2 1/3/2 5/4/2 6/5/2 +f 6/2/3 8/6/3 7/7/3 5/3/3 +f 4/8/4 3/9/4 6/10/4 8/11/4 +f 3/2/3 4/6/3 2/7/3 1/3/3 +f 7/1/5 9/12/5 10/13/5 8/14/5 +f 4/15/4 8/11/4 10/8/4 +f 2/12/3 4/13/3 10/6/3 9/7/3 +f 17/1/1 19/1/1 12/1/1 +f 13/2/6 16/5/6 15/4/6 11/3/6 +f 16/2/7 15/3/7 17/7/7 18/6/7 +f 14/8/4 18/11/4 16/10/4 13/9/4 +f 13/2/7 11/3/7 12/7/7 14/6/7 +f 17/1/5 18/14/5 20/13/5 19/12/5 +f 14/15/4 20/8/4 18/11/4 +f 12/12/7 19/7/7 20/6/7 14/13/7 +o Axis.004 +o Axis.005 +v 0.625000 1.000000 0.375000 +v 0.375000 1.000000 0.375000 +v 0.625000 -0.000000 0.375000 +v 0.375000 -0.000000 0.375000 +v 0.375000 1.000000 0.625000 +v 0.625000 1.000000 0.625000 +v 0.375000 -0.000000 0.625000 +v 0.625000 -0.000000 0.625000 +v -0.500000 0.106250 1.500000 +v -0.500000 0.106250 -0.500000 +v 1.500000 0.106250 -0.500000 +v 1.500000 0.106250 1.500000 +vn -1.0000 -0.0000 -0.0000 +vn -0.0000 -0.0000 -1.0000 +vn 1.0000 -0.0000 -0.0000 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 -1.0000 -0.0000 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.625000 1.000000 +vt 0.375000 1.000000 +vt 0.375000 0.375000 +vt 0.625000 0.375000 +vt 0.625000 0.625000 +vt 0.375000 0.625000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +s 0 +usemtl axis +f 24/16/8 27/17/8 25/18/8 22/19/8 +f 23/16/9 24/17/9 22/18/9 21/19/9 +f 28/16/10 23/17/10 21/18/10 26/19/10 +f 27/16/11 28/17/11 26/18/11 25/19/11 +usemtl axis_top +f 26/20/12 21/21/12 22/22/12 25/23/12 +f 27/20/13 24/21/13 23/22/13 28/23/13 +usemtl bullwheel +f 32/24/13 29/25/13 30/26/13 31/27/13 +o Cube.002 +v 0.965990 0.875000 -0.625000 +v 0.965990 0.125000 -0.625000 +v 0.034010 0.875000 -0.624999 +v 0.034010 0.125000 -0.624999 +v 0.000000 0.875000 0.000000 +v 0.062500 0.875000 0.000000 +v 0.937500 0.875000 0.000000 +v 1.000000 0.875000 0.000000 +v 0.062500 0.875000 -0.476712 +v 0.062500 0.875000 -0.556218 +v 0.937500 0.875000 -0.556218 +v 0.937500 0.875000 -0.476713 +v -0.295495 0.875000 -0.295494 +v -0.295495 0.125000 -0.295494 +v -0.207106 0.875000 -0.207106 +v 1.625000 0.875000 0.965990 +v 1.625000 0.125000 0.965990 +v 1.624999 0.875000 0.034010 +v 1.624999 0.125000 0.034010 +v 1.000000 0.875000 0.062500 +v 1.000000 0.875000 0.937500 +v 1.000000 0.875000 1.000000 +v 1.476712 0.875000 0.062500 +v 1.556218 0.875000 0.062500 +v 1.556218 0.875000 0.937500 +v 1.476713 0.875000 0.937500 +v 1.295495 0.125000 1.295495 +v 1.295494 0.875000 -0.295495 +v 1.295494 0.125000 -0.295495 +v 1.207106 0.875000 -0.207106 +v 0.034010 0.875000 1.625000 +v 0.034010 0.125000 1.625000 +v 0.965990 0.875000 1.624999 +v 0.965990 0.125000 1.624999 +v 0.937500 0.875000 1.000000 +v 0.062500 0.875000 1.000000 +v 0.000000 0.875000 1.000000 +v 0.937500 0.875000 1.476712 +v 0.937500 0.875000 1.556218 +v 0.062500 0.875000 1.556218 +v 0.062500 0.875000 1.476713 +v -0.295495 0.125000 1.295495 +v 1.295494 0.875000 1.295494 +v 1.207106 0.875000 1.207106 +v -0.625000 0.875000 0.034010 +v -0.625000 0.125000 0.034010 +v -0.624999 0.875000 0.965990 +v -0.624999 0.125000 0.965990 +v 0.000000 0.875000 0.937500 +v 0.000000 0.875000 0.062500 +v -0.476712 0.875000 0.937500 +v -0.556218 0.875000 0.937500 +v -0.556218 0.875000 0.062500 +v -0.476713 0.875000 0.062500 +v -0.295494 0.875000 1.295494 +v -0.207106 0.875000 1.207106 +v 0.125000 1.000000 0.875000 +v 0.125000 1.000000 0.125000 +v 0.875000 1.000000 0.875000 +v 0.875000 1.000000 0.125000 +v 0.000000 1.000000 1.000000 +v 0.000000 1.000000 0.000000 +v 1.000000 1.000000 0.000000 +v 1.000000 1.000000 1.000000 +v 0.500000 0.875000 0.500000 +v 0.125000 0.937500 0.875000 +v 0.125000 0.937500 0.125000 +v 0.875000 0.937500 0.125000 +v 0.875000 0.937500 0.875000 +v -0.246859 0.875000 -0.246859 +v -0.246859 0.875000 1.246859 +v 1.246859 0.875000 1.246859 +v 1.246859 0.875000 -0.246859 +v -0.499999 0.125000 0.914213 +v 0.085787 0.125000 -0.499999 +v 1.207106 0.125000 -0.207106 +v -0.207106 0.125000 -0.207106 +v 1.499999 0.125000 0.085787 +v 1.207107 0.125000 1.207107 +v 0.914213 0.125000 1.499999 +v -0.207107 0.125000 1.207106 +v -0.500000 0.125000 0.085787 +v 0.914213 0.125000 -0.500000 +v 1.500000 0.125000 0.914213 +v 0.085787 0.125000 1.500000 +v 0.500000 0.112500 0.500000 +v -0.499999 0.112500 0.914213 +v 0.085787 0.112500 -0.499999 +v 1.207106 0.112500 -0.207106 +v -0.207106 0.112500 -0.207106 +v 1.499999 0.112500 0.085787 +v 1.207107 0.112500 1.207107 +v 0.914213 0.112500 1.499999 +v -0.207107 0.112500 1.207106 +v -0.500000 0.112500 0.085787 +v 0.914213 0.112500 -0.500000 +v 1.500000 0.112500 0.914213 +v 0.085787 0.112500 1.500000 +v 0.250000 0.000000 0.750000 +v 0.250000 0.000000 0.250000 +v 0.750000 0.000000 0.750000 +v 0.750000 0.000000 0.250000 +v 0.125000 0.125000 0.875000 +v 0.125000 0.125000 0.125000 +v 0.875000 0.125000 0.125000 +v 0.875000 0.125000 0.875000 +v 0.125000 0.000000 0.125000 +v 0.125000 0.000000 0.875000 +v 0.875000 0.000000 0.125000 +v 0.875000 0.000000 0.875000 +v 0.250000 0.062500 0.250000 +v 0.250000 0.062500 0.750000 +v 0.750000 0.062500 0.250000 +v 0.750000 0.062500 0.750000 +vn -0.7071 -0.0000 -0.7071 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 -0.0000 -1.0000 +vn 0.7071 -0.0000 -0.7071 +vn 1.0000 -0.0000 -0.0000 +vn 0.7071 -0.0000 0.7071 +vn -0.0000 -0.0000 1.0000 +vn -0.7071 -0.0000 0.7071 +vn -1.0000 -0.0000 -0.0000 +vn -0.0000 -1.0000 -0.0000 +vt 0.750000 0.375000 +vt 0.750000 0.750000 +vt 0.517005 0.750000 +vt 0.517005 0.375000 +vt 0.031250 0.965610 +vt 0.468750 0.965609 +vt 0.482995 1.000000 +vt 0.017005 1.000000 +vt 0.750000 0.965610 +vt 0.750000 0.937500 +vt 0.940640 0.937500 +vt 0.968750 0.965610 +vt 0.031250 0.925857 +vt 0.468750 0.925857 +vt 0.982995 0.750000 +vt 0.982995 0.375000 +vt 0.750000 0.937500 +vt 0.559359 0.937500 +vt 0.727903 0.768956 +vt 0.750000 0.791054 +vt 0.531250 0.965609 +vt 0.750000 0.965610 +vt 0.772097 0.768957 +vt 0.750000 0.791054 +vt 0.031250 0.925857 +vt 0.031250 0.687500 +vt 0.468750 0.687500 +vt 0.468750 0.925857 +vt 0.968750 0.965609 +vt 0.940641 0.937500 +vt 0.750000 0.937500 +vt 0.750000 0.965610 +vt 0.559360 0.937500 +vt 0.531250 0.965610 +vt 0.750000 0.965610 +vt 0.000000 0.500000 +vt 0.000000 0.000000 +vt 0.062500 0.062500 +vt 0.062500 0.437500 +vt 0.500000 0.000000 +vt 0.500000 0.500000 +vt 0.437500 0.437500 +vt 0.437500 0.062500 +vt 0.437500 0.593750 +vt 0.062500 0.593750 +vt 0.062500 0.562500 +vt 0.437500 0.562500 +vt 0.000689 0.562694 +vt 0.031930 0.500212 +vt 0.469307 0.500212 +vt 0.500548 0.562694 +vt 0.000689 0.562818 +vt 0.031930 0.500336 +vt 0.469307 0.500336 +vt 0.500548 0.562818 +vt 0.031930 0.500460 +vt 0.469307 0.500459 +vt 0.500548 0.562942 +vt 0.000689 0.562942 +vt 0.000689 0.562571 +vt 0.031930 0.500088 +vt 0.469307 0.500088 +vt 0.500548 0.562571 +vt 0.437500 0.437500 +vt 0.062500 0.437500 +vt 0.062500 0.062500 +vt 0.437500 0.062500 +vt 0.000689 0.500088 +vt 0.500548 0.500336 +vt 0.500548 0.500088 +vt 0.000689 0.500212 +vt 0.500548 0.500212 +vt 0.000689 0.500460 +vt 0.500548 0.500459 +vt 0.000689 0.500336 +vt 0.517005 1.000000 +vt 0.750000 1.000000 +vt 0.982995 1.000000 +vt 0.017005 0.687500 +vt 0.042893 0.625000 +vt 0.250000 0.625000 +vt 0.250000 0.687500 +vt 0.000000 0.593750 +vt 0.031250 0.593750 +vt 0.031250 0.625000 +vt 0.000000 0.625000 +vt 0.482995 0.687500 +vt 0.042893 0.625000 +vt 0.457107 0.625000 +vt 0.500000 0.609375 +vt 0.000000 0.609375 +vt 0.937500 0.312500 +vt 0.937500 0.062500 +vt 0.968750 0.062500 +vt 0.968750 0.312500 +vt 0.875000 0.000000 +vt 0.937500 0.000000 +vt 0.937500 0.375000 +vt 0.875000 0.375000 +vt 0.562500 0.062500 +vt 0.562500 0.312500 +vt 0.500000 0.375000 +vt 0.500000 0.000000 +vt 0.812500 0.062500 +vt 0.875000 0.000000 +vt 0.812500 0.312500 +vt 0.875000 0.375000 +s 0 +usemtl casing +f 46/28/14 45/29/14 35/30/14 36/31/14 +f 42/32/15 43/33/15 33/34/15 35/35/15 +f 102/36/15 47/37/15 41/38/15 42/39/15 +f 42/32/15 41/40/15 44/41/15 43/33/15 +f 35/42/16 33/30/16 34/31/16 36/43/16 +f 34/43/17 33/42/17 60/29/17 61/28/17 +f 62/44/15 44/45/15 39/46/15 40/47/15 +f 43/48/15 44/45/15 62/44/15 105/49/15 +f 38/50/15 41/38/15 47/37/15 37/51/15 +f 41/52/15 38/53/15 39/54/15 44/55/15 +f 61/28/17 60/29/17 50/30/17 51/31/17 +f 56/32/15 57/33/15 48/34/15 50/35/15 +f 105/36/15 62/37/15 55/38/15 56/39/15 +f 56/32/15 55/40/15 58/41/15 57/33/15 +f 50/42/18 48/30/18 49/31/18 51/43/18 +f 49/43/19 48/42/19 75/29/19 59/28/19 +f 76/44/15 58/45/15 53/46/15 54/47/15 +f 57/56/15 58/57/15 76/58/15 104/59/15 +f 52/50/15 55/38/15 62/37/15 40/51/15 +f 55/52/15 52/53/15 53/54/15 58/55/15 +f 59/28/19 75/29/19 65/30/19 66/31/19 +f 71/32/15 72/33/15 63/34/15 65/35/15 +f 104/59/15 76/37/15 70/60/15 71/61/15 +f 71/32/15 70/40/15 73/41/15 72/33/15 +f 65/42/20 63/30/20 64/31/20 66/43/20 +f 64/43/21 63/42/21 87/29/21 74/28/21 +f 88/44/15 73/45/15 68/46/15 69/47/15 +f 72/48/15 73/45/15 88/44/15 103/62/15 +f 67/50/15 70/38/15 76/37/15 54/51/15 +f 70/52/15 67/53/15 68/54/15 73/55/15 +f 74/28/21 87/29/21 79/30/21 80/31/21 +f 84/32/15 85/33/15 77/34/15 79/35/15 +f 103/62/15 88/37/15 83/38/15 84/39/15 +f 84/32/15 83/40/15 86/41/15 85/33/15 +f 79/42/22 77/30/22 78/31/22 80/43/22 +f 78/43/14 77/42/14 45/29/14 46/28/14 +f 47/44/15 86/45/15 82/46/15 37/47/15 +f 85/48/15 86/45/15 47/44/15 102/36/15 +f 81/50/15 83/38/15 88/37/15 69/51/15 +f 83/52/15 81/53/15 82/54/15 86/55/15 +f 94/63/15 93/64/15 89/65/15 90/66/15 +f 96/67/15 95/68/15 92/69/15 91/70/15 +f 89/65/15 93/64/15 96/67/15 91/70/15 +f 89/71/16 91/72/16 101/73/16 98/74/16 +f 96/75/18 53/76/18 52/77/18 95/78/18 +f 94/79/22 82/80/22 81/81/22 93/82/22 +f 39/83/16 38/84/16 94/85/16 95/86/16 +f 95/68/15 94/63/15 90/66/15 92/69/15 +f 93/87/20 68/88/20 67/89/20 96/90/20 +f 100/91/15 99/92/15 98/93/15 101/94/15 +f 92/71/20 90/72/20 99/73/20 100/74/20 +f 91/71/22 92/72/22 100/73/22 101/74/22 +f 90/71/18 89/72/18 98/73/18 99/74/18 +f 69/95/20 68/88/20 93/87/20 +f 69/96/22 93/82/22 81/81/22 +f 54/97/20 96/90/20 67/89/20 +f 54/98/18 53/76/18 96/75/18 +f 40/99/18 95/78/18 52/77/18 +f 40/100/16 39/83/16 95/86/16 +f 37/101/16 94/85/16 38/84/16 +f 37/102/22 82/80/22 94/79/22 +f 77/103/15 85/48/15 102/36/15 45/104/15 +f 45/104/15 102/36/15 42/39/15 35/105/15 +f 87/104/15 103/62/15 84/39/15 79/105/15 +f 63/103/15 72/48/15 103/62/15 87/104/15 +f 75/104/15 104/59/15 71/61/15 65/103/15 +f 48/105/15 57/56/15 104/59/15 75/104/15 +f 60/104/15 105/36/15 56/39/15 50/105/15 +f 33/103/15 43/48/15 105/49/15 60/104/15 +f 36/106/23 107/107/23 109/108/23 46/109/23 +f 107/110/16 115/111/16 128/112/16 120/113/16 +f 51/114/23 49/106/23 116/115/23 110/116/23 +f 116/110/19 111/111/19 124/112/19 129/113/19 +f 51/106/23 110/107/23 108/108/23 61/109/23 +f 108/110/17 110/111/17 123/112/17 121/113/17 +f 66/114/23 64/106/23 117/115/23 112/116/23 +f 106/110/22 114/111/22 127/112/22 119/113/22 +f 66/106/23 112/107/23 111/108/23 59/109/23 +f 117/110/21 113/111/21 126/112/21 130/113/21 +f 80/114/23 78/106/23 114/115/23 106/116/23 +f 110/110/18 116/111/18 129/112/18 123/113/18 +f 80/106/23 106/107/23 113/108/23 74/109/23 +f 111/110/19 112/111/19 125/112/19 124/113/19 +f 114/110/14 109/111/14 122/112/14 127/113/14 +f 109/110/14 107/111/14 120/112/14 122/113/14 +f 114/116/23 78/114/23 46/109/23 109/108/23 +f 115/110/17 108/111/17 121/112/17 128/113/17 +f 117/116/23 64/114/23 74/109/23 113/108/23 +f 112/110/20 117/111/20 130/112/20 125/113/20 +f 116/116/23 49/114/23 59/109/23 111/108/23 +f 113/110/21 106/111/21 119/112/21 126/113/21 +f 115/116/23 34/114/23 61/109/23 108/108/23 +f 36/114/23 34/106/23 115/115/23 107/116/23 +f 120/110/23 128/113/23 118/117/23 +f 120/113/23 118/117/23 122/118/23 +f 123/110/23 129/113/23 118/117/23 +f 123/113/23 118/117/23 121/118/23 +f 125/110/23 130/113/23 118/117/23 +f 125/113/23 118/117/23 124/118/23 +f 119/110/23 127/113/23 118/117/23 +f 119/113/23 118/117/23 126/118/23 +f 118/117/23 127/110/23 122/118/23 +f 118/117/23 130/110/23 126/118/23 +f 118/117/23 129/110/23 124/118/23 +f 118/117/23 128/110/23 121/118/23 +f 133/119/16 131/120/16 144/121/16 146/122/16 +f 142/123/20 138/124/20 135/125/20 140/126/20 +f 141/123/18 137/124/18 138/125/18 142/126/18 +f 139/123/16 136/124/16 137/125/16 141/126/16 +f 140/123/22 135/124/22 136/125/22 139/126/22 +f 132/127/23 131/128/23 140/129/23 139/130/23 +f 134/131/23 132/127/23 139/130/23 141/132/23 +f 133/133/23 134/131/23 141/132/23 142/134/23 +f 131/128/23 133/133/23 142/134/23 140/129/23 +f 143/127/23 145/131/23 146/133/23 144/128/23 +f 132/119/20 134/120/20 145/121/20 143/122/20 +f 134/119/22 133/120/22 146/121/22 145/122/22 +f 131/119/18 132/120/18 143/121/18 144/122/18 diff --git a/src/main/resources/assets/create/models/block/chain_lift/shaft.json b/src/main/resources/assets/create/models/block/chain_lift/shaft.json new file mode 100644 index 0000000000..2319b59ca1 --- /dev/null +++ b/src/main/resources/assets/create/models/block/chain_lift/shaft.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/chain_lift/textures", + "loader": "forge:obj", + "flip_v": true, + "model": "create:models/block/chain_lift/conveyor_shaft.obj" +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/chain_lift/textures.json b/src/main/resources/assets/create/models/block/chain_lift/textures.json new file mode 100644 index 0000000000..e74df32927 --- /dev/null +++ b/src/main/resources/assets/create/models/block/chain_lift/textures.json @@ -0,0 +1,12 @@ +{ + "parent": "block/block", + "ambientocclusion": false, + "textures": { + "axis": "create:block/axis", + "axis_top": "create:block/axis_top", + "conveyor_casing": "create:block/conveyor_casing", + "conveyor_port": "create:block/conveyor_port", + "bullwheel": "create:block/bullwheel", + "particle": "create:block/andesite_casing" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/package_port/block.json b/src/main/resources/assets/create/models/block/package_port/block.json index 5675dd8bd1..2193c26069 100644 --- a/src/main/resources/assets/create/models/block/package_port/block.json +++ b/src/main/resources/assets/create/models/block/package_port/block.json @@ -1,22 +1,29 @@ { "credit": "Made with Blockbench", "textures": { - "7": "create:block/order_collector", - "9": "create:block/package_port", - "particle": "create:block/andesite_casing_short" + "0": "create:block/port2", + "particle": "create:block/port2" }, "elements": [ { "from": [0, 0, 0], - "to": [16, 7, 16], + "to": [16, 4, 16], "faces": { - "north": {"uv": [0, 9, 16, 16], "texture": "#9"}, - "east": {"uv": [0, 9, 16, 16], "texture": "#9"}, - "south": {"uv": [0, 9, 16, 16], "texture": "#9"}, - "west": {"uv": [0, 9, 16, 16], "texture": "#9"}, - "up": {"uv": [0, 0, 8, 8], "texture": "#7"}, - "down": {"uv": [0, 0, 8, 8], "texture": "#7"} + "north": {"uv": [0, 14, 8, 16], "texture": "#0"}, + "east": {"uv": [0, 14, 8, 16], "texture": "#0"}, + "south": {"uv": [0, 14, 8, 16], "texture": "#0"}, + "west": {"uv": [0, 14, 8, 16], "texture": "#0"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "down": {"uv": [8, 8, 16, 16], "texture": "#0"} } } + ], + "groups": [ + { + "name": "base", + "origin": [8, 8, 8], + "color": 0, + "children": [0] + } ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/package_port/body.json b/src/main/resources/assets/create/models/block/package_port/body.json new file mode 100644 index 0000000000..d169ed55c0 --- /dev/null +++ b/src/main/resources/assets/create/models/block/package_port/body.json @@ -0,0 +1,143 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/port2", + "1": "create:block/port", + "particle": "create:block/port2" + }, + "elements": [ + { + "from": [2, 4, 2], + "to": [14, 10, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 4, 2]}, + "faces": { + "north": {"uv": [0, 2.5, 6, 5.5], "texture": "#1"}, + "east": {"uv": [12, 2.5, 6, 5.5], "texture": "#1"}, + "south": {"uv": [6, 13, 12, 16], "texture": "#1"}, + "west": {"uv": [6, 2.5, 12, 5.5], "texture": "#1"} + } + }, + { + "from": [14, 4, 2], + "to": [2, 10, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [14, 4, 2]}, + "faces": { + "north": {"uv": [0, 2.5, 6, 5.5], "texture": "#1"}, + "east": {"uv": [12, 2.5, 6, 5.5], "texture": "#1"}, + "south": {"uv": [6, 13, 12, 16], "texture": "#1"}, + "west": {"uv": [6, 2.5, 12, 5.5], "texture": "#1"} + } + }, + { + "from": [1, 4.1, 1], + "to": [4, 7.1, 7], + "rotation": {"angle": 0, "axis": "y", "origin": [1, 4, 1]}, + "faces": { + "north": {"uv": [0, 8.5, 1.5, 10], "texture": "#1"}, + "east": {"uv": [9, 8.5, 12, 10], "texture": "#1"}, + "south": {"uv": [4.5, 8.5, 6, 10], "texture": "#1"}, + "west": {"uv": [1.5, 8.5, 5, 10], "texture": "#1"}, + "up": {"uv": [6, 8.5, 9, 10], "rotation": 90, "texture": "#1"}, + "down": {"uv": [0, 0, 3, 6], "texture": "#1"} + } + }, + { + "from": [12, 4.1, 1], + "to": [15, 7.1, 7], + "rotation": {"angle": 0, "axis": "y", "origin": [12, 4, 1]}, + "faces": { + "north": {"uv": [1.5, 8.5, 0, 10], "texture": "#1"}, + "east": {"uv": [4.5, 8.5, 1.5, 10], "texture": "#1"}, + "south": {"uv": [6, 8.5, 4.5, 10], "texture": "#1"}, + "west": {"uv": [12, 8.5, 9, 10], "texture": "#1"}, + "up": {"uv": [6, 10, 9, 8.5], "rotation": 90, "texture": "#1"}, + "down": {"uv": [0, 0, 3, 6], "texture": "#1"} + } + }, + { + "from": [3, 4.1, 1.5], + "to": [13, 8.1, 1.5], + "rotation": {"angle": 0, "axis": "y", "origin": [3, 4, 1]}, + "faces": { + "north": {"uv": [1.5, 5.5, 6.5, 7.5], "texture": "#1"} + } + }, + { + "from": [-1, 5, 9], + "to": [2, 10, 15], + "rotation": {"angle": 22.5, "axis": "z", "origin": [2, 10, 9]}, + "faces": { + "north": {"uv": [12, 5, 13.5, 7.5], "texture": "#1"}, + "east": {"uv": [12, 2.5, 15, 5], "texture": "#1"}, + "south": {"uv": [13.5, 5, 15, 7.5], "texture": "#1"}, + "west": {"uv": [12, 0, 15, 2.5], "texture": "#1"}, + "up": {"uv": [12, 7.5, 15, 9], "rotation": 90, "texture": "#1"}, + "down": {"uv": [12, 9, 15, 10.5], "rotation": 90, "texture": "#1"} + } + }, + { + "from": [14, 5, 9], + "to": [17, 10, 15], + "rotation": {"angle": -22.5, "axis": "z", "origin": [14, 10, 9]}, + "faces": { + "north": {"uv": [13.5, 5, 12, 7.5], "texture": "#1"}, + "east": {"uv": [12, 0, 15, 2.5], "texture": "#1"}, + "south": {"uv": [15, 5, 13.5, 7.5], "texture": "#1"}, + "west": {"uv": [15, 2.5, 12, 5], "texture": "#1"}, + "up": {"uv": [12, 9, 15, 7.5], "rotation": 90, "texture": "#1"}, + "down": {"uv": [12, 9, 15, 10.5], "rotation": 90, "texture": "#1"} + } + }, + { + "from": [2, 10, 2], + "to": [14, 8, 11], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 10, 2]}, + "faces": { + "south": {"uv": [0, 5, 6, 6], "texture": "#0"}, + "up": {"uv": [0, 6, 6, 10], "rotation": 180, "texture": "#0"}, + "down": {"uv": [0, 0, 12, 9], "texture": "#1"} + } + }, + { + "from": [1, 8.5, 9.5], + "to": [3, 11.5, 12.5], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 10, 11]}, + "faces": { + "north": {"uv": [12, 12, 13, 13.5], "texture": "#1"}, + "east": {"uv": [13.5, 10.5, 15, 12], "texture": "#1"}, + "south": {"uv": [12, 12, 13, 13.5], "rotation": 180, "texture": "#1"}, + "west": {"uv": [12, 10.5, 13.5, 12], "texture": "#1"}, + "up": {"uv": [12, 12, 13, 13.5], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [13, 8.5, 9.5], + "to": [15, 11.5, 12.5], + "rotation": {"angle": 0, "axis": "y", "origin": [14, 10, 11]}, + "faces": { + "north": {"uv": [12, 12, 13, 13.5], "rotation": 180, "texture": "#1"}, + "east": {"uv": [12, 10.5, 13.5, 12], "texture": "#1"}, + "south": {"uv": [12, 12, 13, 13.5], "texture": "#1"}, + "west": {"uv": [13.5, 10.5, 15, 12], "texture": "#1"}, + "up": {"uv": [12, 12, 13, 13.5], "texture": "#1"} + } + }, + { + "from": [0, 4, 7], + "to": [16, 4.1, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 4, 7]}, + "faces": { + "up": {"uv": [0, 5.5, 8, 8.5], "rotation": 180, "texture": "#1"}, + "down": {"uv": [0, 5.5, 8, 8.5], "texture": "#1"} + } + } + ], + "groups": [ + { + "name": "port_body", + "origin": [8, 8, 8], + "color": 0, + "children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/package_port/cap.json b/src/main/resources/assets/create/models/block/package_port/cap.json deleted file mode 100644 index 4777dd9402..0000000000 --- a/src/main/resources/assets/create/models/block/package_port/cap.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "credit": "Made with Blockbench", - "textures": { - "8": "create:block/packager_block", - "particle": "create:block/andesite_casing_short" - }, - "elements": [ - { - "from": [0, 0, 0], - "to": [16, 2, 16], - "faces": { - "north": {"uv": [8, 0, 16, 1], "texture": "#8"}, - "east": {"uv": [8, 0, 16, 1], "texture": "#8"}, - "south": {"uv": [8, 0, 16, 1], "texture": "#8"}, - "west": {"uv": [8, 0, 16, 1], "texture": "#8"}, - "up": {"uv": [0, 0, 8, 8], "texture": "#8"}, - "down": {"uv": [0, 0, 8, 8], "texture": "#8"} - } - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/package_port/head.json b/src/main/resources/assets/create/models/block/package_port/head.json new file mode 100644 index 0000000000..ae8e9366c4 --- /dev/null +++ b/src/main/resources/assets/create/models/block/package_port/head.json @@ -0,0 +1,76 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/port2", + "1": "create:block/port", + "particle": "create:block/port2" + }, + "elements": [ + { + "from": [2, 9, 2], + "to": [14, 14, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 9, 11]}, + "faces": { + "north": {"uv": [0, 0, 6, 2.5], "texture": "#1"}, + "east": {"uv": [12, 0, 6, 2.5], "texture": "#1"}, + "south": {"uv": [6, 10, 12, 12.5], "texture": "#1"}, + "west": {"uv": [6, 0, 12, 2.5], "texture": "#1"}, + "up": {"uv": [0, 10, 6, 16], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [14, 9, 2], + "to": [2, 14, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [20, 10, 11]}, + "faces": { + "north": {"uv": [0, 0, 6, 2.5], "texture": "#1"}, + "east": {"uv": [12, 0, 6, 2.5], "texture": "#1"}, + "south": {"uv": [6, 10, 12, 12.5], "texture": "#1"}, + "west": {"uv": [6, 0, 12, 2.5], "texture": "#1"}, + "up": {"uv": [0, 10, 6, 16], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [2, 10, 2], + "to": [14, 10, 11], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 11]}, + "faces": { + "down": {"uv": [0, 0, 6, 4.5], "rotation": 180, "texture": "#0"} + } + }, + { + "from": [1.8, 11, 1.8], + "to": [5, 14.2, 5], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 11, 2]}, + "faces": { + "north": {"uv": [4.5, 0, 6, 1.5], "texture": "#1"}, + "east": {"uv": [8, 5.5, 9.5, 7], "texture": "#1"}, + "south": {"uv": [8, 5.5, 9.5, 7], "texture": "#1"}, + "west": {"uv": [6, 0, 7.5, 1.5], "texture": "#1"}, + "up": {"uv": [4.5, 14.5, 6, 16], "rotation": 180, "texture": "#1"}, + "down": {"uv": [8, 5.5, 9.5, 7], "texture": "#1"} + } + }, + { + "from": [11, 11, 1.8], + "to": [14.2, 14.2, 5], + "rotation": {"angle": 0, "axis": "y", "origin": [11, 11, 2]}, + "faces": { + "north": {"uv": [6, 0, 4.5, 1.5], "texture": "#1"}, + "east": {"uv": [7.5, 0, 6, 1.5], "texture": "#1"}, + "south": {"uv": [8, 5.5, 9.5, 7], "texture": "#1"}, + "west": {"uv": [8, 5.5, 9.5, 7], "texture": "#1"}, + "up": {"uv": [4.5, 14.5, 6, 16], "rotation": 270, "texture": "#1"}, + "down": {"uv": [8, 5.5, 9.5, 7], "texture": "#1"} + } + } + ], + "groups": [ + { + "name": "port_head", + "origin": [8, 8, 8], + "color": 0, + "children": [0, 1, 2, 3, 4] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/package_port/item.json b/src/main/resources/assets/create/models/block/package_port/item.json index aacb6becc4..a702e87c80 100644 --- a/src/main/resources/assets/create/models/block/package_port/item.json +++ b/src/main/resources/assets/create/models/block/package_port/item.json @@ -2,77 +2,240 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "5": "create:block/funnel/brass_funnel", - "6": "create:block/funnel/funnel_back", - "7": "create:block/order_collector", - "8": "create:block/packager_block", - "9": "create:block/package_port", - "particle": "create:block/andesite_casing_short" + "0": "create:block/port2", + "1": "create:block/port", + "particle": "create:block/port2" }, "elements": [ + { + "from": [2, 4, 2], + "to": [14, 10, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 4, 2]}, + "faces": { + "north": {"uv": [0, 2.5, 6, 5.5], "texture": "#1"}, + "east": {"uv": [12, 2.5, 6, 5.5], "texture": "#1"}, + "south": {"uv": [6, 13, 12, 16], "texture": "#1"}, + "west": {"uv": [6, 2.5, 12, 5.5], "texture": "#1"} + } + }, + { + "from": [14, 4, 2], + "to": [2, 10, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [14, 4, 2]}, + "faces": { + "north": {"uv": [0, 2.5, 6, 5.5], "texture": "#1"}, + "east": {"uv": [12, 2.5, 6, 5.5], "texture": "#1"}, + "south": {"uv": [6, 13, 12, 16], "texture": "#1"}, + "west": {"uv": [6, 2.5, 12, 5.5], "texture": "#1"} + } + }, + { + "from": [1, 4.1, 1], + "to": [4, 7.1, 7], + "rotation": {"angle": 0, "axis": "y", "origin": [1, 4, 1]}, + "faces": { + "north": {"uv": [0, 8.5, 1.5, 10], "texture": "#1"}, + "east": {"uv": [9, 8.5, 12, 10], "texture": "#1"}, + "south": {"uv": [4.5, 8.5, 6, 10], "texture": "#1"}, + "west": {"uv": [1.5, 8.5, 5, 10], "texture": "#1"}, + "up": {"uv": [6, 8.5, 9, 10], "rotation": 90, "texture": "#1"}, + "down": {"uv": [0, 0, 3, 6], "texture": "#1"} + } + }, + { + "from": [12, 4.1, 1], + "to": [15, 7.1, 7], + "rotation": {"angle": 0, "axis": "y", "origin": [12, 4, 1]}, + "faces": { + "north": {"uv": [1.5, 8.5, 0, 10], "texture": "#1"}, + "east": {"uv": [4.5, 8.5, 1.5, 10], "texture": "#1"}, + "south": {"uv": [6, 8.5, 4.5, 10], "texture": "#1"}, + "west": {"uv": [12, 8.5, 9, 10], "texture": "#1"}, + "up": {"uv": [6, 10, 9, 8.5], "rotation": 90, "texture": "#1"}, + "down": {"uv": [0, 0, 3, 6], "texture": "#1"} + } + }, + { + "from": [3, 4.1, 1.5], + "to": [13, 8.1, 1.5], + "rotation": {"angle": 0, "axis": "y", "origin": [3, 4, 1]}, + "faces": { + "north": {"uv": [1.5, 5.5, 6.5, 7.5], "texture": "#1"} + } + }, + { + "from": [-1, 5, 9], + "to": [2, 10, 15], + "rotation": {"angle": 22.5, "axis": "z", "origin": [2, 10, 9]}, + "faces": { + "north": {"uv": [12, 5, 13.5, 7.5], "texture": "#1"}, + "east": {"uv": [12, 2.5, 15, 5], "texture": "#1"}, + "south": {"uv": [13.5, 5, 15, 7.5], "texture": "#1"}, + "west": {"uv": [12, 0, 15, 2.5], "texture": "#1"}, + "up": {"uv": [12, 7.5, 15, 9], "rotation": 90, "texture": "#1"}, + "down": {"uv": [12, 9, 15, 10.5], "rotation": 90, "texture": "#1"} + } + }, + { + "from": [14, 5, 9], + "to": [17, 10, 15], + "rotation": {"angle": -22.5, "axis": "z", "origin": [14, 10, 9]}, + "faces": { + "north": {"uv": [13.5, 5, 12, 7.5], "texture": "#1"}, + "east": {"uv": [12, 0, 15, 2.5], "texture": "#1"}, + "south": {"uv": [15, 5, 13.5, 7.5], "texture": "#1"}, + "west": {"uv": [15, 2.5, 12, 5], "texture": "#1"}, + "up": {"uv": [12, 9, 15, 7.5], "rotation": 90, "texture": "#1"}, + "down": {"uv": [12, 9, 15, 10.5], "rotation": 90, "texture": "#1"} + } + }, + { + "from": [2, 10, 2], + "to": [14, 8, 11], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 10, 2]}, + "faces": { + "south": {"uv": [0, 5, 6, 6], "texture": "#0"}, + "up": {"uv": [0, 6, 6, 10], "rotation": 180, "texture": "#0"}, + "down": {"uv": [0, 0, 12, 9], "texture": "#1"} + } + }, + { + "from": [1, 8.5, 9.5], + "to": [3, 11.5, 12.5], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 10, 11]}, + "faces": { + "north": {"uv": [12, 12, 13, 13.5], "texture": "#1"}, + "east": {"uv": [13.5, 10.5, 15, 12], "texture": "#1"}, + "south": {"uv": [12, 12, 13, 13.5], "rotation": 180, "texture": "#1"}, + "west": {"uv": [12, 10.5, 13.5, 12], "texture": "#1"}, + "up": {"uv": [12, 12, 13, 13.5], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [13, 8.5, 9.5], + "to": [15, 11.5, 12.5], + "rotation": {"angle": 0, "axis": "y", "origin": [14, 10, 11]}, + "faces": { + "north": {"uv": [12, 12, 13, 13.5], "rotation": 180, "texture": "#1"}, + "east": {"uv": [12, 10.5, 13.5, 12], "texture": "#1"}, + "south": {"uv": [12, 12, 13, 13.5], "texture": "#1"}, + "west": {"uv": [13.5, 10.5, 15, 12], "texture": "#1"}, + "up": {"uv": [12, 12, 13, 13.5], "texture": "#1"} + } + }, + { + "from": [0, 4, 7], + "to": [16, 4.1, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 4, 7]}, + "faces": { + "up": {"uv": [0, 5.5, 8, 8.5], "rotation": 180, "texture": "#1"}, + "down": {"uv": [0, 5.5, 8, 8.5], "texture": "#1"} + } + }, { "from": [0, 0, 0], - "to": [16, 7, 16], + "to": [16, 4, 16], "faces": { - "north": {"uv": [0, 9, 16, 16], "texture": "#9"}, - "east": {"uv": [0, 9, 16, 16], "texture": "#9"}, - "south": {"uv": [0, 9, 16, 16], "texture": "#9"}, - "west": {"uv": [0, 9, 16, 16], "texture": "#9"}, - "up": {"uv": [0, 0, 8, 8], "texture": "#7"}, - "down": {"uv": [0, 0, 8, 8], "texture": "#7"} + "north": {"uv": [0, 14, 8, 16], "texture": "#0"}, + "east": {"uv": [0, 14, 8, 16], "texture": "#0"}, + "south": {"uv": [0, 14, 8, 16], "texture": "#0"}, + "west": {"uv": [0, 14, 8, 16], "texture": "#0"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "down": {"uv": [8, 8, 16, 16], "texture": "#0"} } }, { - "from": [0, 15, 0], - "to": [16, 17, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [0, 15, 0]}, + "from": [2, 9, 2], + "to": [14, 14, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 9, 11]}, "faces": { - "north": {"uv": [8, 0, 16, 1], "texture": "#8"}, - "east": {"uv": [8, 0, 16, 1], "texture": "#8"}, - "south": {"uv": [8, 0, 16, 1], "texture": "#8"}, - "west": {"uv": [8, 0, 16, 1], "texture": "#8"}, - "up": {"uv": [0, 0, 8, 8], "texture": "#8"}, - "down": {"uv": [0, 0, 8, 8], "texture": "#8"} + "north": {"uv": [0, 0, 6, 2.5], "texture": "#1"}, + "east": {"uv": [12, 0, 6, 2.5], "texture": "#1"}, + "south": {"uv": [6, 10, 12, 12.5], "texture": "#1"}, + "west": {"uv": [6, 0, 12, 2.5], "texture": "#1"}, + "up": {"uv": [0, 10, 6, 16], "rotation": 180, "texture": "#1"} } }, { - "from": [1, 13, 1], - "to": [15, 16, 15], - "rotation": {"angle": 0, "axis": "y", "origin": [0, 13, 0]}, + "from": [14, 9, 2], + "to": [2, 14, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [20, 10, 11]}, "faces": { - "north": {"uv": [0, 5.5, 7, 7], "texture": "#6"}, - "east": {"uv": [0, 5.5, 7, 7], "texture": "#6"}, - "south": {"uv": [0, 5.5, 7, 7], "texture": "#6"}, - "west": {"uv": [0, 5.5, 7, 7], "texture": "#6"}, - "up": {"uv": [0.5, 8.5, 7.5, 15.5], "texture": "#7"}, - "down": {"uv": [0, 0, 6, 6], "texture": "#5"} + "north": {"uv": [0, 0, 6, 2.5], "texture": "#1"}, + "east": {"uv": [12, 0, 6, 2.5], "texture": "#1"}, + "south": {"uv": [6, 10, 12, 12.5], "texture": "#1"}, + "west": {"uv": [6, 0, 12, 2.5], "texture": "#1"}, + "up": {"uv": [0, 10, 6, 16], "rotation": 180, "texture": "#1"} } }, { - "from": [1, 10, 1], - "to": [15, 13, 15], - "rotation": {"angle": 0, "axis": "y", "origin": [0, 10, 0]}, + "from": [2, 10, 2], + "to": [14, 10, 11], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 11]}, "faces": { - "north": {"uv": [0, 5.5, 7, 7], "texture": "#6"}, - "east": {"uv": [0, 5.5, 7, 7], "texture": "#6"}, - "south": {"uv": [0, 5.5, 7, 7], "texture": "#6"}, - "west": {"uv": [0, 5.5, 7, 7], "texture": "#6"}, - "up": {"uv": [0, 0, 6, 6], "texture": "#5"}, - "down": {"uv": [0, 0, 6, 6], "texture": "#5"} + "down": {"uv": [0, 0, 6, 4.5], "rotation": 180, "texture": "#0"} } }, { - "from": [1, 7, 1], - "to": [15, 10, 15], - "rotation": {"angle": 0, "axis": "y", "origin": [0, 7, 0]}, + "from": [1.8, 11, 1.8], + "to": [5, 14.2, 5], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 11, 2]}, "faces": { - "north": {"uv": [0, 5.5, 7, 7], "texture": "#6"}, - "east": {"uv": [0, 5.5, 7, 7], "texture": "#6"}, - "south": {"uv": [0, 5.5, 7, 7], "texture": "#6"}, - "west": {"uv": [0, 5.5, 7, 7], "texture": "#6"}, - "up": {"uv": [0, 0, 6, 6], "texture": "#5"}, - "down": {"uv": [0, 0, 6, 6], "texture": "#5"} + "north": {"uv": [4.5, 0, 6, 1.5], "texture": "#1"}, + "east": {"uv": [8, 5.5, 9.5, 7], "texture": "#1"}, + "south": {"uv": [8, 5.5, 9.5, 7], "texture": "#1"}, + "west": {"uv": [6, 0, 7.5, 1.5], "texture": "#1"}, + "up": {"uv": [4.5, 14.5, 6, 16], "rotation": 180, "texture": "#1"}, + "down": {"uv": [8, 5.5, 9.5, 7], "texture": "#1"} } + }, + { + "from": [11, 11, 1.8], + "to": [14.2, 14.2, 5], + "rotation": {"angle": 0, "axis": "y", "origin": [11, 11, 2]}, + "faces": { + "north": {"uv": [6, 0, 4.5, 1.5], "texture": "#1"}, + "east": {"uv": [7.5, 0, 6, 1.5], "texture": "#1"}, + "south": {"uv": [8, 5.5, 9.5, 7], "texture": "#1"}, + "west": {"uv": [8, 5.5, 9.5, 7], "texture": "#1"}, + "up": {"uv": [4.5, 14.5, 6, 16], "rotation": 270, "texture": "#1"}, + "down": {"uv": [8, 5.5, 9.5, 7], "texture": "#1"} + } + }, + { + "from": [6, 10, 4], + "to": [10, 10, 11], + "rotation": {"angle": 0, "axis": "y", "origin": [6, 10, 4]}, + "faces": { + "up": {"uv": [6, 0, 8, 3.5], "rotation": 180, "texture": "#0"}, + "down": {"uv": [6, 0, 8, 3.5], "texture": "#0"} + } + } + ], + "groups": [ + { + "name": "port_body", + "origin": [8, 8, 8], + "color": 0, + "children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] + }, + { + "name": "base", + "origin": [8, 8, 8], + "color": 0, + "children": [11] + }, + { + "name": "port_head", + "origin": [8, 8, 8], + "color": 0, + "children": [12, 13, 14, 15, 16] + }, + { + "name": "port_tongue", + "origin": [8, 8, 8], + "color": 0, + "children": [17] } ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/package_port/tongue.json b/src/main/resources/assets/create/models/block/package_port/tongue.json new file mode 100644 index 0000000000..40a5d61bfd --- /dev/null +++ b/src/main/resources/assets/create/models/block/package_port/tongue.json @@ -0,0 +1,26 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/port2", + "particle": "create:block/port2" + }, + "elements": [ + { + "from": [6, 10, 4], + "to": [10, 10, 11], + "rotation": {"angle": 0, "axis": "y", "origin": [6, 10, 4]}, + "faces": { + "up": {"uv": [6, 0, 8, 3.5], "rotation": 180, "texture": "#0"}, + "down": {"uv": [6, 0, 8, 3.5], "texture": "#0"} + } + } + ], + "groups": [ + { + "name": "port_tongue", + "origin": [8, 8, 8], + "color": 0, + "children": [0] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/package_port/tube.json b/src/main/resources/assets/create/models/block/package_port/tube.json deleted file mode 100644 index a893e78cf3..0000000000 --- a/src/main/resources/assets/create/models/block/package_port/tube.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "credit": "Made with Blockbench", - "textures": { - "5": "create:block/funnel/brass_funnel", - "6": "create:block/funnel/funnel_back", - "7": "create:block/order_collector", - "particle": "create:block/andesite_casing_short" - }, - "elements": [ - { - "from": [1, -1.5, 1], - "to": [15, 1.5, 15], - "rotation": {"angle": 0, "axis": "y", "origin": [0, -1.5, 0]}, - "faces": { - "north": {"uv": [0, 5.5, 7, 7], "texture": "#6"}, - "east": {"uv": [0, 5.5, 7, 7], "texture": "#6"}, - "south": {"uv": [0, 5.5, 7, 7], "texture": "#6"}, - "west": {"uv": [0, 5.5, 7, 7], "texture": "#6"}, - "up": {"uv": [0.5, 8.5, 7.5, 15.5], "texture": "#7"}, - "down": {"uv": [0, 0, 6, 6], "texture": "#5"} - } - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/cardboard_package_10x12.json b/src/main/resources/assets/create/models/item/cardboard_package_10x12.json deleted file mode 100644 index 2c909f0368..0000000000 --- a/src/main/resources/assets/create/models/item/cardboard_package_10x12.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "credit": "Made with Blockbench", - "parent": "create:item/package_transforms", - "textures": { - "0": "create:entity/package/cardboard", - "particle": "create:entity/package/cardboard_particle" - }, - "elements": [ - { - "from": [3, 0, 3], - "to": [13, 12, 13], - "faces": { - "north": {"uv": [6.75, 10, 9.25, 13], "texture": "#0"}, - "east": {"uv": [4.25, 7.5, 6.75, 10.5], "texture": "#0"}, - "south": {"uv": [6.75, 10, 9.25, 13], "texture": "#0"}, - "west": {"uv": [4.25, 10.5, 6.75, 13.5], "texture": "#0"}, - "up": {"uv": [6.75, 7.5, 9.25, 10], "texture": "#0"}, - "down": {"uv": [6.75, 13, 9.25, 15.5], "texture": "#0"} - } - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/cardboard_package_10x8.json b/src/main/resources/assets/create/models/item/cardboard_package_10x8.json deleted file mode 100644 index fd38cbdbdc..0000000000 --- a/src/main/resources/assets/create/models/item/cardboard_package_10x8.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "credit": "Made with Blockbench", - "parent": "create:item/package_transforms", - "textures": { - "0": "create:entity/package/cardboard", - "particle": "create:entity/package/cardboard_particle" - }, - "elements": [ - { - "from": [3, 0, 3], - "to": [13, 8, 13], - "faces": { - "north": {"uv": [9.25, 3, 11.75, 5], "texture": "#0"}, - "east": {"uv": [6.75, 0.5, 9.25, 2.5], "texture": "#0"}, - "south": {"uv": [9.25, 3, 11.75, 5], "texture": "#0"}, - "west": {"uv": [6.75, 2.5, 9.25, 4.5], "texture": "#0"}, - "up": {"uv": [9.25, 0.5, 11.75, 3], "texture": "#0"}, - "down": {"uv": [6.75, 4.5, 9.25, 7], "texture": "#0"} - } - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/cardboard_package_12x10.json b/src/main/resources/assets/create/models/item/cardboard_package_12x10.json deleted file mode 100644 index a5253293f5..0000000000 --- a/src/main/resources/assets/create/models/item/cardboard_package_12x10.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "credit": "Made with Blockbench", - "parent": "create:item/package_transforms", - "textures": { - "0": "create:entity/package/cardboard", - "particle": "create:entity/package/cardboard_particle" - }, - "elements": [ - { - "from": [2, 0, 2], - "to": [14, 10, 14], - "faces": { - "north": {"uv": [3.25, 4.5, 6.25, 7], "texture": "#0"}, - "east": {"uv": [0.25, 1.5, 3.25, 4], "texture": "#0"}, - "south": {"uv": [3.25, 4.5, 6.25, 7], "texture": "#0"}, - "west": {"uv": [0.25, 4, 3.25, 6.5], "texture": "#0"}, - "up": {"uv": [3.25, 1.5, 6.25, 4.5], "texture": "#0"}, - "down": {"uv": [0.25, 6.5, 3.25, 9.5], "texture": "#0"} - } - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/cardboard_package_12x12.json b/src/main/resources/assets/create/models/item/cardboard_package_12x12.json deleted file mode 100644 index c052f0582b..0000000000 --- a/src/main/resources/assets/create/models/item/cardboard_package_12x12.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "credit": "Made with Blockbench", - "parent": "create:item/package_transforms", - "textures": { - "0": "create:entity/package/cardboard", - "particle": "create:entity/package/cardboard_particle" - }, - "elements": [ - { - "from": [2, 0, 2], - "to": [14, 12, 14], - "faces": { - "north": {"uv": [12.75, 8.5, 15.75, 11.5], "texture": "#0"}, - "east": {"uv": [9.75, 5.5, 12.75, 8.5], "texture": "#0"}, - "south": {"uv": [12.75, 8.5, 15.75, 11.5], "texture": "#0"}, - "west": {"uv": [9.75, 8.5, 12.75, 11.5], "texture": "#0"}, - "up": {"uv": [12.75, 5.5, 15.75, 8.5], "texture": "#0"}, - "down": {"uv": [9.75, 11.5, 12.75, 14.5], "texture": "#0"} - } - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/packages/cardboard_10x12.json b/src/main/resources/assets/create/models/item/packages/cardboard_10x12.json new file mode 100644 index 0000000000..c6d3e90b3c --- /dev/null +++ b/src/main/resources/assets/create/models/item/packages/cardboard_10x12.json @@ -0,0 +1,32 @@ +{ + "credit": "Made with Blockbench", + "parent": "create:item/package_transforms", + "textures": { + "0": "create:entity/package/cardboard", + "particle": "create:entity/package/cardboard_particle" + }, + "elements": [ + { + "name": "box", + "from": [3, 0, 3], + "to": [13, 12, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 6, 8]}, + "faces": { + "north": {"uv": [6.25, 6.25, 8.75, 9.25], "texture": "#0"}, + "east": {"uv": [6.25, 0.25, 8.75, 3.25], "texture": "#0"}, + "south": {"uv": [8.75, 6.25, 6.25, 9.25], "texture": "#0"}, + "west": {"uv": [6.25, 3.25, 8.75, 6.25], "texture": "#0"}, + "up": {"uv": [6.25, 9.25, 8.75, 11.75], "rotation": 180, "texture": "#0"}, + "down": {"uv": [6.25, 11.75, 8.75, 14.25], "rotation": 270, "texture": "#0"} + } + } + ], + "groups": [ + { + "name": "package_3", + "origin": [8, 8, 8], + "color": 0, + "children": [0] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/packages/cardboard_10x12_rigging.json b/src/main/resources/assets/create/models/item/packages/cardboard_10x12_rigging.json new file mode 100644 index 0000000000..bd0436849e --- /dev/null +++ b/src/main/resources/assets/create/models/item/packages/cardboard_10x12_rigging.json @@ -0,0 +1,124 @@ +{ + "credit": "Made with Blockbench", + "parent": "create:item/package_transforms", + "textures": { + "0": "create:entity/package/cardboard", + "particle": "create:entity/package/cardboard_particle" + }, + "elements": [ + { + "name": "rope_1", + "from": [2.8, 12, 1.8], + "to": [2.8, 19, 14.2], + "rotation": {"angle": -45, "axis": "z", "origin": [2.8, 12, 8]}, + "faces": { + "east": {"uv": [12.5, 2, 15.5, 4], "texture": "#0"}, + "west": {"uv": [12.5, 1.5, 15.5, 3.25], "texture": "#0"} + } + }, + { + "name": "rope_2", + "from": [1.8, 12, 13.2], + "to": [14.2, 19, 13.2], + "rotation": {"angle": -45, "axis": "x", "origin": [8, 12, 13.2]}, + "faces": { + "north": {"uv": [12.5, 2, 15.5, 4], "texture": "#0"}, + "south": {"uv": [12.5, 1.5, 15.5, 3.25], "texture": "#0"} + } + }, + { + "name": "rope_3", + "from": [13.2, 12, 1.8], + "to": [13.2, 19, 14.2], + "rotation": {"angle": 45, "axis": "z", "origin": [13.2, 12, 8]}, + "faces": { + "east": {"uv": [12.5, 1.5, 15.5, 3.25], "texture": "#0"}, + "west": {"uv": [12.5, 2, 15.5, 4], "texture": "#0"} + } + }, + { + "name": "rope_4", + "from": [1.8, 12, 2.8], + "to": [14.2, 19, 2.8], + "rotation": {"angle": 45, "axis": "x", "origin": [8, 12, 2.8]}, + "faces": { + "north": {"uv": [12.5, 1.5, 15.5, 3.25], "texture": "#0"}, + "south": {"uv": [12.5, 2, 15.5, 4], "texture": "#0"} + } + }, + { + "name": "knot", + "from": [6.5, 16, 6.5], + "to": [9.5, 19, 9.5], + "rotation": {"angle": 0, "axis": "y", "origin": [6, 12, 6]}, + "faces": { + "north": {"uv": [13.5, 8, 14.25, 8.75], "texture": "#0"}, + "east": {"uv": [13.5, 8, 14.25, 8.75], "texture": "#0"}, + "south": {"uv": [13.5, 8, 14.25, 8.75], "texture": "#0"}, + "west": {"uv": [13.5, 8, 14.25, 8.75], "texture": "#0"}, + "up": {"uv": [13.5, 9.5, 14.25, 10.25], "texture": "#0"}, + "down": {"uv": [13.5, 8.75, 14.25, 9.5], "texture": "#0"} + } + }, + { + "name": "hook", + "from": [8, 17, 6], + "to": [8, 24, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 13, 6]}, + "faces": { + "east": {"uv": [14.5, 11, 13.5, 12.75], "texture": "#0"}, + "west": {"uv": [13.5, 11, 14.5, 12.75], "texture": "#0"} + } + }, + { + "name": "box_section", + "from": [2.8, -0.2, 2.8], + "to": [13.2, 12, 13.2], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 0, 2]}, + "faces": { + "north": {"uv": [12.75, 1.25, 15.25, 4.25], "texture": "#0"}, + "east": {"uv": [12.75, 1.25, 15.25, 4.25], "texture": "#0"}, + "south": {"uv": [12.75, 1.25, 15.25, 4.25], "texture": "#0"}, + "west": {"uv": [12.75, 1.25, 15.25, 4.25], "texture": "#0"}, + "down": {"uv": [12.75, 4.75, 15.25, 7.25], "rotation": 90, "texture": "#0"} + } + }, + { + "name": "box_section_interior", + "from": [2.8, 12, 2.8], + "to": [13.2, -0.2, 13.2], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 0, 8]}, + "faces": { + "north": {"uv": [12.75, 1.25, 15.25, 4.25], "texture": "#0"}, + "east": {"uv": [12.75, 1.25, 15.25, 4.25], "texture": "#0"}, + "south": {"uv": [12.75, 1.25, 15.25, 4.25], "texture": "#0"}, + "west": {"uv": [12.75, 1.25, 15.25, 4.25], "texture": "#0"}, + "up": {"uv": [12.75, 4.75, 15.25, 7.25], "rotation": 270, "texture": "#0"} + } + } + ], + "groups": [ + { + "name": "package_3", + "origin": [8, 8, 8], + "color": 0, + "children": [ + { + "name": "rigging", + "origin": [2, 0, 2], + "color": 0, + "children": [ + { + "name": "top_section", + "origin": [2, 0, 2], + "color": 0, + "children": [0, 1, 2, 3, 4, 5] + }, + 6, + 7 + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/packages/cardboard_10x8.json b/src/main/resources/assets/create/models/item/packages/cardboard_10x8.json new file mode 100644 index 0000000000..f0873badd1 --- /dev/null +++ b/src/main/resources/assets/create/models/item/packages/cardboard_10x8.json @@ -0,0 +1,32 @@ +{ + "credit": "Made with Blockbench", + "parent": "create:item/package_transforms", + "textures": { + "0": "create:entity/package/cardboard", + "particle": "create:entity/package/cardboard_particle" + }, + "elements": [ + { + "name": "box", + "from": [3, 0, 3], + "to": [13, 8, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 8]}, + "faces": { + "north": {"uv": [0.25, 4.25, 2.75, 6.25], "texture": "#0"}, + "east": {"uv": [0.25, 0.25, 2.75, 2.25], "texture": "#0"}, + "south": {"uv": [2.75, 4.25, 0.25, 6.25], "texture": "#0"}, + "west": {"uv": [0.25, 2.25, 2.75, 4.25], "texture": "#0"}, + "up": {"uv": [0.25, 6.25, 2.75, 8.75], "rotation": 180, "texture": "#0"}, + "down": {"uv": [0.25, 8.75, 2.75, 11.25], "rotation": 180, "texture": "#0"} + } + } + ], + "groups": [ + { + "name": "package_1", + "origin": [8, 8, 8], + "color": 0, + "children": [0] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/packages/cardboard_10x8_rigging.json b/src/main/resources/assets/create/models/item/packages/cardboard_10x8_rigging.json new file mode 100644 index 0000000000..d24f5a0904 --- /dev/null +++ b/src/main/resources/assets/create/models/item/packages/cardboard_10x8_rigging.json @@ -0,0 +1,124 @@ +{ + "credit": "Made with Blockbench", + "parent": "create:item/package_transforms", + "textures": { + "0": "create:entity/package/cardboard", + "particle": "create:entity/package/cardboard_particle" + }, + "elements": [ + { + "name": "rope_1", + "from": [2.8, 8, 1.8], + "to": [2.8, 15, 14.2], + "rotation": {"angle": -45, "axis": "z", "origin": [2.8, 8, 8]}, + "faces": { + "east": {"uv": [12.5, 2, 15.5, 4], "texture": "#0"}, + "west": {"uv": [12.5, 1.5, 15.5, 3.25], "texture": "#0"} + } + }, + { + "name": "rope_2", + "from": [1.8, 8, 13.2], + "to": [14.2, 15, 13.2], + "rotation": {"angle": -45, "axis": "x", "origin": [8, 8, 13.2]}, + "faces": { + "north": {"uv": [12.5, 2, 15.5, 4], "texture": "#0"}, + "south": {"uv": [12.5, 1.5, 15.5, 3.25], "texture": "#0"} + } + }, + { + "name": "rope_3", + "from": [13.2, 8, 1.8], + "to": [13.2, 15, 14.2], + "rotation": {"angle": 45, "axis": "z", "origin": [13.2, 8, 8]}, + "faces": { + "east": {"uv": [12.5, 1.5, 15.5, 3.25], "texture": "#0"}, + "west": {"uv": [12.5, 2, 15.5, 4], "texture": "#0"} + } + }, + { + "name": "rope_4", + "from": [1.8, 8, 2.8], + "to": [14.2, 15, 2.8], + "rotation": {"angle": 45, "axis": "x", "origin": [8, 8, 2.8]}, + "faces": { + "north": {"uv": [12.5, 1.5, 15.5, 3.25], "texture": "#0"}, + "south": {"uv": [12.5, 2, 15.5, 4], "texture": "#0"} + } + }, + { + "name": "knot", + "from": [6.5, 12, 6.5], + "to": [9.5, 15, 9.5], + "rotation": {"angle": 0, "axis": "y", "origin": [6, 12, 6]}, + "faces": { + "north": {"uv": [13.5, 8, 14.25, 8.75], "texture": "#0"}, + "east": {"uv": [13.5, 8, 14.25, 8.75], "texture": "#0"}, + "south": {"uv": [13.5, 8, 14.25, 8.75], "texture": "#0"}, + "west": {"uv": [13.5, 8, 14.25, 8.75], "texture": "#0"}, + "up": {"uv": [13.5, 9.5, 14.25, 10.25], "texture": "#0"}, + "down": {"uv": [13.5, 8.75, 14.25, 9.5], "texture": "#0"} + } + }, + { + "name": "hook", + "from": [8, 13, 6], + "to": [8, 20, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 13, 6]}, + "faces": { + "east": {"uv": [14.5, 11, 13.5, 12.75], "texture": "#0"}, + "west": {"uv": [13.5, 11, 14.5, 12.75], "texture": "#0"} + } + }, + { + "name": "box_section", + "from": [2.8, -0.2, 2.8], + "to": [13.2, 8, 13.2], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 0, 2]}, + "faces": { + "north": {"uv": [12.75, 2.25, 15.25, 4.25], "texture": "#0"}, + "east": {"uv": [12.75, 2.25, 15.25, 4.25], "texture": "#0"}, + "south": {"uv": [12.75, 2.25, 15.25, 4.25], "texture": "#0"}, + "west": {"uv": [12.75, 2.25, 15.25, 4.25], "texture": "#0"}, + "down": {"uv": [12.75, 4.75, 15.25, 7.25], "rotation": 90, "texture": "#0"} + } + }, + { + "name": "box_section_interior", + "from": [2.8, 8, 2.8], + "to": [13.2, 0, 13.2], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 16, 9]}, + "faces": { + "north": {"uv": [12.75, 2.25, 15.25, 4.25], "texture": "#0"}, + "east": {"uv": [12.75, 2.25, 15.25, 4.25], "texture": "#0"}, + "south": {"uv": [12.75, 2.25, 15.25, 4.25], "texture": "#0"}, + "west": {"uv": [12.75, 2.25, 15.25, 4.25], "texture": "#0"}, + "up": {"uv": [12.75, 4.75, 15.25, 7.25], "rotation": 270, "texture": "#0"} + } + } + ], + "groups": [ + { + "name": "package_1", + "origin": [8, 8, 8], + "color": 0, + "children": [ + { + "name": "rigging", + "origin": [2, 0, 2], + "color": 0, + "children": [ + { + "name": "top_section", + "origin": [2, 0, 2], + "color": 0, + "children": [0, 1, 2, 3, 4, 5] + }, + 6, + 7 + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/packages/cardboard_12x10.json b/src/main/resources/assets/create/models/item/packages/cardboard_12x10.json new file mode 100644 index 0000000000..00a4cb1281 --- /dev/null +++ b/src/main/resources/assets/create/models/item/packages/cardboard_12x10.json @@ -0,0 +1,32 @@ +{ + "credit": "Made with Blockbench", + "parent": "create:item/package_transforms", + "textures": { + "0": "create:entity/package/cardboard", + "particle": "create:entity/package/cardboard_particle" + }, + "elements": [ + { + "name": "box", + "from": [2, 0, 2], + "to": [14, 10, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 5, 8]}, + "faces": { + "north": {"uv": [3, 5.25, 6, 7.75], "texture": "#0"}, + "east": {"uv": [3, 0.25, 6, 2.75], "texture": "#0"}, + "south": {"uv": [6, 5.25, 3, 7.75], "texture": "#0"}, + "west": {"uv": [3, 2.75, 6, 5.25], "texture": "#0"}, + "up": {"uv": [3, 7.75, 6, 10.75], "rotation": 180, "texture": "#0"}, + "down": {"uv": [3, 10.75, 6, 13.75], "rotation": 270, "texture": "#0"} + } + } + ], + "groups": [ + { + "name": "package_2", + "origin": [8, 8, 8], + "color": 0, + "children": [0] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/packages/cardboard_12x10_rigging.json b/src/main/resources/assets/create/models/item/packages/cardboard_12x10_rigging.json new file mode 100644 index 0000000000..b62e31d58c --- /dev/null +++ b/src/main/resources/assets/create/models/item/packages/cardboard_12x10_rigging.json @@ -0,0 +1,124 @@ +{ + "credit": "Made with Blockbench", + "parent": "create:item/package_transforms", + "textures": { + "0": "create:entity/package/cardboard", + "particle": "create:entity/package/cardboard_particle" + }, + "elements": [ + { + "name": "rope_2", + "from": [1.8, 10, 1.8], + "to": [1.8, 18, 14.2], + "rotation": {"angle": -45, "axis": "z", "origin": [1.8, 10, 8]}, + "faces": { + "east": {"uv": [12.5, 2, 15.5, 4], "texture": "#0"}, + "west": {"uv": [12.5, 2, 15.5, 4], "texture": "#0"} + } + }, + { + "name": "rope_3", + "from": [1.8, 10, 14.2], + "to": [14.2, 18, 14.2], + "rotation": {"angle": -45, "axis": "x", "origin": [8, 10, 14.2]}, + "faces": { + "north": {"uv": [12.5, 2, 15.5, 4], "texture": "#0"}, + "south": {"uv": [12.5, 2, 15.5, 4], "texture": "#0"} + } + }, + { + "name": "rope_4", + "from": [14.2, 10, 1.8], + "to": [14.2, 18, 14.2], + "rotation": {"angle": 45, "axis": "z", "origin": [14.2, 10, 8]}, + "faces": { + "east": {"uv": [12.5, 2, 15.5, 4], "texture": "#0"}, + "west": {"uv": [12.5, 2, 15.5, 4], "texture": "#0"} + } + }, + { + "name": "rope_5", + "from": [1.8, 10, 1.8], + "to": [14.2, 18, 1.8], + "rotation": {"angle": 45, "axis": "x", "origin": [8, 10, 1.8]}, + "faces": { + "north": {"uv": [12.5, 2, 15.5, 4], "texture": "#0"}, + "south": {"uv": [12.5, 2, 15.5, 4], "texture": "#0"} + } + }, + { + "name": "knot", + "from": [6.5, 15, 6.5], + "to": [9.5, 18, 9.5], + "rotation": {"angle": 0, "axis": "y", "origin": [6, 15, 6]}, + "faces": { + "north": {"uv": [13.5, 8, 14.25, 8.75], "texture": "#0"}, + "east": {"uv": [13.5, 8, 14.25, 8.75], "texture": "#0"}, + "south": {"uv": [13.5, 8, 14.25, 8.75], "texture": "#0"}, + "west": {"uv": [13.5, 8, 14.25, 8.75], "texture": "#0"}, + "up": {"uv": [13.5, 9.5, 14.25, 10.25], "texture": "#0"}, + "down": {"uv": [13.5, 8.75, 14.25, 9.5], "texture": "#0"} + } + }, + { + "name": "hook", + "from": [8, 16, 6], + "to": [8, 23, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 16, 6]}, + "faces": { + "east": {"uv": [14.5, 11, 13.5, 12.75], "texture": "#0"}, + "west": {"uv": [13.5, 11, 14.5, 12.75], "texture": "#0"} + } + }, + { + "name": "box_section", + "from": [1.8, -0.2, 1.8], + "to": [14.2, 10, 14.2], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 0, 2]}, + "faces": { + "north": {"uv": [12.5, 2, 15.5, 4.5], "texture": "#0"}, + "east": {"uv": [12.5, 2, 15.5, 4.5], "texture": "#0"}, + "south": {"uv": [12.5, 2, 15.5, 4.5], "texture": "#0"}, + "west": {"uv": [12.5, 2, 15.5, 4.5], "texture": "#0"}, + "down": {"uv": [12.5, 4.5, 15.5, 7.5], "rotation": 90, "texture": "#0"} + } + }, + { + "name": "box_section_interior", + "from": [1.8, 10.4, 1.8], + "to": [14.2, 0.2, 14.2], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 0, 8]}, + "faces": { + "north": {"uv": [12.5, 2, 15.5, 4.5], "rotation": 180, "texture": "#0"}, + "east": {"uv": [12.5, 2, 15.5, 4.5], "rotation": 180, "texture": "#0"}, + "south": {"uv": [12.5, 2, 15.5, 4.5], "rotation": 180, "texture": "#0"}, + "west": {"uv": [12.5, 2, 15.5, 4.5], "rotation": 180, "texture": "#0"}, + "up": {"uv": [12.5, 4.5, 15.5, 7.5], "rotation": 270, "texture": "#0"} + } + } + ], + "groups": [ + { + "name": "package_2", + "origin": [8, 8, 8], + "color": 0, + "children": [ + { + "name": "rigging", + "origin": [2, 0, 2], + "color": 0, + "children": [ + { + "name": "top_section", + "origin": [2, 0, 2], + "color": 0, + "children": [0, 1, 2, 3, 4, 5] + }, + 6, + 7 + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/packages/cardboard_12x12.json b/src/main/resources/assets/create/models/item/packages/cardboard_12x12.json new file mode 100644 index 0000000000..5c8abece06 --- /dev/null +++ b/src/main/resources/assets/create/models/item/packages/cardboard_12x12.json @@ -0,0 +1,32 @@ +{ + "credit": "Made with Blockbench", + "parent": "create:item/package_transforms", + "textures": { + "0": "create:entity/package/cardboard", + "particle": "create:entity/package/cardboard_particle" + }, + "elements": [ + { + "name": "box", + "from": [2, 0, 2], + "to": [14, 12, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [9, 6.25, 12, 9.25], "texture": "#0"}, + "east": {"uv": [9, 0.25, 12, 3.25], "texture": "#0"}, + "south": {"uv": [12, 6.25, 9, 9.25], "texture": "#0"}, + "west": {"uv": [9, 3.25, 12, 6.25], "texture": "#0"}, + "up": {"uv": [9, 9.25, 12, 12.25], "rotation": 180, "texture": "#0"}, + "down": {"uv": [9, 12.25, 12, 15.25], "rotation": 270, "texture": "#0"} + } + } + ], + "groups": [ + { + "name": "package_4", + "origin": [8, 8, 8], + "color": 0, + "children": [0] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/packages/cardboard_12x12_rigging.json b/src/main/resources/assets/create/models/item/packages/cardboard_12x12_rigging.json new file mode 100644 index 0000000000..bb760dfddd --- /dev/null +++ b/src/main/resources/assets/create/models/item/packages/cardboard_12x12_rigging.json @@ -0,0 +1,124 @@ +{ + "credit": "Made with Blockbench", + "parent": "create:item/package_transforms", + "textures": { + "0": "create:entity/package/cardboard", + "particle": "create:entity/package/cardboard_particle" + }, + "elements": [ + { + "name": "rope_4", + "from": [1.8, 12, 1.8], + "to": [1.8, 20, 14.2], + "rotation": {"angle": -45, "axis": "z", "origin": [1.8, 12, 8]}, + "faces": { + "east": {"uv": [12.5, 2, 15.5, 4], "texture": "#0"}, + "west": {"uv": [12.5, 2, 15.5, 4], "texture": "#0"} + } + }, + { + "name": "rope_5", + "from": [1.8, 12, 14.2], + "to": [14.2, 20, 14.2], + "rotation": {"angle": -45, "axis": "x", "origin": [8, 12, 14.2]}, + "faces": { + "north": {"uv": [12.5, 2, 15.5, 4], "texture": "#0"}, + "south": {"uv": [12.5, 2, 15.5, 4], "texture": "#0"} + } + }, + { + "name": "rope_6", + "from": [14.2, 12, 1.8], + "to": [14.2, 20, 14.2], + "rotation": {"angle": 45, "axis": "z", "origin": [14.2, 12, 8]}, + "faces": { + "east": {"uv": [12.5, 2, 15.5, 4], "texture": "#0"}, + "west": {"uv": [12.5, 2, 15.5, 4], "texture": "#0"} + } + }, + { + "name": "rope_7", + "from": [1.8, 12, 1.8], + "to": [14.2, 20, 1.8], + "rotation": {"angle": 45, "axis": "x", "origin": [8, 12, 1.8]}, + "faces": { + "north": {"uv": [12.5, 2, 15.5, 4], "texture": "#0"}, + "south": {"uv": [12.5, 2, 15.5, 4], "texture": "#0"} + } + }, + { + "name": "knot", + "from": [6.5, 17, 6.5], + "to": [9.5, 20, 9.5], + "rotation": {"angle": 0, "axis": "y", "origin": [6, 15, 6]}, + "faces": { + "north": {"uv": [13.5, 8, 14.25, 8.75], "texture": "#0"}, + "east": {"uv": [13.5, 8, 14.25, 8.75], "texture": "#0"}, + "south": {"uv": [13.5, 8, 14.25, 8.75], "texture": "#0"}, + "west": {"uv": [13.5, 8, 14.25, 8.75], "texture": "#0"}, + "up": {"uv": [13.5, 9.5, 14.25, 10.25], "texture": "#0"}, + "down": {"uv": [13.5, 8.75, 14.25, 9.5], "texture": "#0"} + } + }, + { + "name": "hook", + "from": [8, 18, 6], + "to": [8, 25, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 16, 6]}, + "faces": { + "east": {"uv": [14.5, 11, 13.5, 12.75], "texture": "#0"}, + "west": {"uv": [13.5, 11, 14.5, 12.75], "texture": "#0"} + } + }, + { + "name": "box_section", + "from": [1.8, -0.2, 1.8], + "to": [14.2, 12, 14.2], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 0, 2]}, + "faces": { + "north": {"uv": [12.5, 1.5, 15.5, 4.5], "texture": "#0"}, + "east": {"uv": [12.5, 1.5, 15.5, 4.5], "texture": "#0"}, + "south": {"uv": [12.5, 1.5, 15.5, 4.5], "texture": "#0"}, + "west": {"uv": [12.5, 1.5, 15.5, 4.5], "texture": "#0"}, + "down": {"uv": [12.5, 4.5, 15.5, 7.5], "rotation": 90, "texture": "#0"} + } + }, + { + "name": "box_section_interior", + "from": [1.8, 12, 1.8], + "to": [14.2, -0.2, 14.2], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 0, 8]}, + "faces": { + "north": {"uv": [12.5, 1.5, 15.5, 4.5], "texture": "#0"}, + "east": {"uv": [12.5, 1.5, 15.5, 4.5], "texture": "#0"}, + "south": {"uv": [12.5, 1.5, 15.5, 4.5], "texture": "#0"}, + "west": {"uv": [12.5, 1.5, 15.5, 4.5], "texture": "#0"}, + "up": {"uv": [12.5, 4.5, 15.5, 7.5], "rotation": 270, "texture": "#0"} + } + } + ], + "groups": [ + { + "name": "package_4", + "origin": [8, 8, 8], + "color": 0, + "children": [ + { + "name": "rigging", + "origin": [2, 0, 2], + "color": 0, + "children": [ + { + "name": "top_section", + "origin": [2, 0, 2], + "color": 0, + "children": [0, 1, 2, 3, 4, 5] + }, + 6, + 7 + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/block/bullwheel.png b/src/main/resources/assets/create/textures/block/bullwheel.png new file mode 100644 index 0000000000000000000000000000000000000000..c3156b0be4ab9a806f7f206d72944d190dc48b56 GIT binary patch literal 601 zcmV-f0;c_mP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00F^CL_t(o!|hkgPQpMGJu_2V z2z~;vP~#(#5`qik|A(-^7zoBkfQ9-A5Nu&u7v_?-v}GO`V#3|DX?xE(b7$_EDR2yn zXg2C`vr&(2F!-Sd;n*afc&@bo{#T_{#pAmY%ig<{D%?sHHW;}AK0dz~090xl-7YR@+yuM62z`)!HclU^j@Tln`(5P9J}@4R7!ms2PGKedZYL%|l(RP@N&=Dy*Yn_dUh0_+ zIRG%-mF;&sF_C5?3<8WEpP01~l|>nWE_tc~WEj-9WH8ibG`B^gPgVf{qO}A7NcnpW zzn1`jRS>3H^Wd8iGfBF8xXAc8OmQllO8`i$mYSA?>Fq{Go_ z4}$>faJAI|I=0Pq$fLE~YPBeiQf)}9Usc3T0m)r0>u}LpZrUyHn`Ew$00LMp=34eT z9*)>@F;^17RZcQRyPA}8V>H=F=9Ha^cp3RB2$iT04HjYc#25#{0Ty_%7= z#7++g&AoHay=T7PbH3;1&R@JR1t^yt0L)^McrZ}^(#&EJK+Sc#0clJ7r`H{{r}WoP zo&GAdr|LMaL*NJWgAm&((GNm;eot+(>@H(FB>=UywbKOnzx;E+^w+=p4S)I7&sb!6 zE1wyUq7eWu{pb=ueEluXo%#|0uBjd9llGJE_Pkgi0MHLY@>U+huy76V6L1aTXqg27 zqId{^Z$S8oPd^9&_~4${=m+1~5O5n}eVh!5;vtq=)=B>Qqv)SHL?|$*e_xbKO)(JV-et%;-GtN*@bu21wDFY$Sj0Q=C zpP&+O(E&gC-s#MjOaIGPZa%bLmlPO=m4Qh*M)7dQe?lg!53;w8MuCDp z-5<}QPLfCky>WD1BwS^M+EaC<1G3gZ(3RGK)=m@86SMI{?$~)n(@Mou6(g(4H8orV96PUa%QZFhyE`H~-~RF2JdVBd z%XjvlTs0^2C2ess#Idu|Tsvgb>hwhtp1*j3a@kSY`KaCS&9~m5arYkisSuW+Kgt{= zzcPwN0FryT&N2(+tvq_U>~QqUPxH*lXCJGZeRS(Xkq16X^M~WyOg)`hDa(0jtxjKw zliuwHY<+y2t&eX%76Jg>ARr%&u&RZOfTh(>{>z}|WnLk$sHZ!wLv!c8LPFNLRL^cV z!0$}B-S}Uo1^e-YM!Wk^8Rmls_Iu5!<%=qi8~@?wKNVlPFHP}+0x)$kZ|ZRL+phv} z__-G!sf>@$m2uP!u%r??uE1t}wS;Zz^y4wpDfA-&scjXoiyBcp!7?@Ow?itG6&hRH z{Acqc4id7))^=W@0a&e8 z*;rra`kjPtZA>uo8a=;43FWfGvb)T+KmD2ZZc`xV3gr4>h}Y>*U8{5M zm6uh(0Iz-jHLkvUHJbzD@uxTySABWf9<65{?}^#_2O>SXx>l@O}Jlm$OGEj7BqEkK+XCFOf@A zkVbBvg3O&zDqk*_V?3U6sx|-y#9>PaRM{XhCyYiq$!JV2m&vUZ*1} zEuP(KWiaYiZ0g|oeKZZm`@w_*=`dkD&H+P4lL-ZVmID%j>RO%lZgU}W)iu#WBxU_5 zQo-m_pHE-NUP$KkdtT?$H1zx)=U#dFbA>34z}0uJ3gLa>r5C4V$59v1MVHd~IcdAC y7Pe(kt3IjZR!Xu&N6K>?C;Ydujcr*ODgF#oRHDkLNN;8U0000 z$lwBwy_3A!U4u*kx0rxAr2N%tW_ITP|C!d_{_eD!^~ka%YMh<^1>oDxHW%kZM(39l z#TB}^LF)=#Rg8_nS&QgqJx)%3GsyGMU~O}gt*s6I93S9sTUh78dRh*YGjz;^*xq4{ zLFnR!L7o!{5gH8goYgO%IXwDF6NJ_kkr1>a@hqWr#e2}^KOvlRFQ&I6fpd<%{atE< z`zs$=UilPiYIB8@^3~2#O1fE(Uq8N+C`Fn?&+=t$ViUzgDZZ}vG1jA!IK++h3`fy} zgxBDlBg>Y;@~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/port.png b/src/main/resources/assets/create/textures/block/port.png new file mode 100644 index 0000000000000000000000000000000000000000..4840aea635f2408c41b345c3538aac6428c272ab GIT binary patch literal 1611 zcmV-R2DJH!P)iHB1ro@@hsow7!3YT|i_37D5SthxI-@Z)F@|X3 z4dKG*1$yCy7bJQ?oH4{j5D^4nfy8M{gg{gvi-^N@XO#|m`mwgBJME4a-FZ1(yHR|S z<~@DS`|&@|^MC)(^EyVpKWYNRRF%WuUBaa(I28qeIbEl$>%8zxH{nnSyV=Lz%bW|w z%;`FBzr2G_PyT`Q&ifw%@YdjNw5h*X@z6%*bX^SArv3uDvBm+kws_gI>sgGfhD!+o zP`1qx8_gDRHo1xHSkLg;YXC%ctmp7|mx!q8W67&I-k!evcv7VERj$ZC`f9k(|i`ie720CJg|qR+p)6PLTWYHqohr?WG_4b?<4 zvKr^lA9K)vZQuT!>2f#YY;q&}T9M~LS{qxI&g3vkB>-GacTkM#@aTGuMAE_BtOp0c z`|rJLhJqb6M6(l4jZd;~|ABh}HRoF~u6JP2Jahbz7_jy6rvZ?>B`A84M!r94S{s}g zIY%;`ty(eQ_tCXs9idx37_rsm0orv{J%go?&N=PwPohQ{a zZGl$0Hms`}sK%#JD*WLsm8hxdP>2?tN z_8(Z(@6qThRsV0?jEUzpYx8yIYJl|b*=ri96hT*H{bJ^TNrYj~zz# zE*E59E8h0ijp!HUVjd%_iC?)`A!e~yM4FizuLy&z2%YYWM9ovf2dhBzMWSX|*ReoY zx_@f^>@Q^{Ll-2qdnA>aLGre*7V$ZA{LrHDw*%@O7&K*QC>85^4zF)H-uW=wy-m4@ zbZYpZYy+Qr!tl95SQ((QcbLhZH)^MB09YG_k;7JWZ!l#q%u z$r=^2h*D48oQgvKp1n0*vS&Oy`IfRmp@_o@!BX|x{nmSSyZ!f-y7Mkv9Oc1PD=Hz_ zy=x1@XRl#o(jpXg)skEMM0Tv_%Ok&3RYxvGsSB`d3+EfJM+k>P#8j1`Bi|D6`-H^* zd+Rom+~OAnqqE7)ww^YTkkt4jKVD1#FnsnJa*Lmtsc|G(!R2mVG}l|)DH%H9P>6${ ze?j!67YX=%+=#_l6TVwVN_JNonKYqb2Pa0((H3ZBb9WbWvoYjl%fy%FGBF4t*jCt zCMM&K`#FmJfmSmV>_ClAV{e5AEE0Y_`Zq3jGar03RJDLrQrk&*KbA;psPV~~)-p$5 zBx*Vv&~z&lx5my_IG{AfflI%SExBez2{UP-c*@FP^@8(Zu{?3V9JrTByLW8?;MYr+ z85>Jd*7d5Z89--efX&@q01OrLBBL#q4Xt@bR%2rF*wO&(myzq^wJ~SykGF2gW#x~2VWuGf{{cD|95bDlYE1wD002ov JPDHLkV1hg83poG) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/port2.png b/src/main/resources/assets/create/textures/block/port2.png new file mode 100644 index 0000000000000000000000000000000000000000..cbe74b02160595a9f572ac58e8ac4e1573d2585f GIT binary patch literal 1163 zcmV;61a$j}P)ania8YTC@H)@eW|C_8N8f`9{1i342NVJARBTzVS+1b@Il z;=%!`w;n3A^Wd_>#IJ3jc2%=cHC^I4b+jZ-6UTO1!ojiIbk&-yMR4Fby?*^X@B8@s zeBbB$I`Y<=?{@(lr^T~OmJO(vZ}%T9#TMO{ZXO5w98ba7o9NTA3f zw&S75B4(qGEG2PV4<->;1X=PE0O;5q0BpxY zk`&f%Ewctb0>hY=oq+j0wAHf!q^$99VZCgjmn{HR^7>P;!JIawqNsk{&H~ zKDULLE0J6WSrU;Y5xs0th@5?9{7iR?sTX`cdApI}6UfPvoO|&C`9IeIFf0$(t%nc~ zVt4L8CZ@!YBxU#nRyPWGa?D5L_a;*kA)F5jm4ViHZB|1Ry3bdF#m{f_J%91h#gJ&j zSfka!c05Kn1yf{^w3-~)ziKtZq=l1izE7y(5)Mwzi4({_ZsEH2P$YaZHm>>iYa0FHYK2so~X;}X_%rn@x|2ZA!3IDvv$4_mP|rIJ>YtmJiGnwh|MypWtL zd7aCzo}v7th2?_T@Z*GzIC$-j@}0kW4c#cQc56B82QekqhtOCe7S092^vc^;(6Tv3 zQe%T3pQC)IH4QDB>)S98rhw@ILf&rVfTra3<@hA_8z4c! z08l7ZT#V%#r^A835{U$9b#x%#TB8|`g|s?K31gtZqc$iR+awbHG0d-S01%HWy>ht7 zk`(&3+deFUs!(e*X|-BD0v9j6Ox4;MdUJqWc9OI@N`7^NRJy0}LX>DUinHx9kxBcV z((_QqeGZikli9iRRIMF^<)!aWr3CS~f+UIk_sHJYd!EPM-X6QVdwmE2rz1vzxvq!n z`kMi$<4G!J6;Tw4Mx#iQ_*9a@X(n)Z@q=~{fqyIkw|C66sMa~-?GU(=V!q*MHG``54)?^^c2 ztr+lI@s$rhps4FCF7NQ}8<+c}H89;Mp=EREMhV@hu)g_-Pu_cnX-#8&^HC@;vvcPM zD%D2OAT^dGHI_v9>9?QJjS96!lOJ#2A+0_*GU(p@2fgdm4z)&;U+&)P`zvm>TF2_i dLEqqR@i$}x`S7A5mr4Kt002ovPDHLkV1lP#Er|dC literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/entity/package/cardboard.png b/src/main/resources/assets/create/textures/entity/package/cardboard.png index ea610f3cc903fd8c1696deb0570c520c443a4141..fe102da04b2a49f30f0c4fc1887aba458e4edf44 100644 GIT binary patch delta 1286 zcmV+h1^N2&3gHTnL4SczOjJeFtAE_IhnHn8druyYUMazuZOo*2%cFP3o^j8pd}cux zvW#R_IvHCx6LClz-@%{PxtV@kHN2E+$DecO%&yF^k(qBpsDM+(sfXmnqTRoq)VG&? zSu>${OQU;Ew86M=b#Q`*gqozCd479fV_#5HQD|&vKt)3}I}bT7Gcf=F0Gs|3rvLx| zE0N(Ye*h!Nr_cZZ010qNS#tmY4#5Bb4#5Gqk!$S$00c5gL_t(oN2Qkyd)hbur>(T7mNkaU?2r=AwRKsR+cK%*@lLvhe zFb$m@Qw;yYktZ`8U6|Pr1Di~g_s|07DaVItf5IGR@%)^Ch4LPZBS62zH}hrBh5eEX zm;Ia*%h6EDMq4Rwvet(H!^rQ)K?|3>K8Ob3;bQ!ldfxid1MRijaJXr*Y-n;apz@%1 zhh{w%4kMS1gJtzy=mqFEQnukfEh-QC>8I(GF9NuX*ZPdC%@SG5<%TQ{=X_6q%7d!j zeP2Q^iu-VeZXYPNq|<)*}Y(K;eoo;nooz(bT@G5yWt{>vp&!k>oO{fzG34AkOLLq zW*@kQ1i*&J^avf3{L`mgZ{`%bT2Gcf2+lM zGT{d(?1S9q6tfRIJXC5!crUm!oS*R(GaN$wSuo(kFNmWUVs8DW=V2EI5Zp6?}b&>2k0`3f2}+q0Ag8^ zT#(D(3k~3KI3AA2L}h-Ko8_-V=k+s^NQMot*(DONCC@8fYr2= z7p*LB65xJff2>_7;FaisT{bls!R%In6^#P-;FtiEniLcO!9_udMnPj1Xxf5%z%lB2 z4WJUpgWM9<6cyln3niLHf68LKB*lZIK!9&Co?c&12~Y*>kQ=EfRK^S#65#I`U-iRi z0e*Re45{xCs_`vY>Q#W(141f8WJlnG*Q;RS|Izz93T{;=#y9+&PB%P|0F~rcbz=NC z#_y-ocgy)D1H(CBR27&1mS#)|J!Pdk0|(IY^yCUJTMoeKn@(J zKw9`F1x+-7#;n^4nrHw`q>>an`1TusTldIW+y+#kmM}*?2=L1zt^m@*?VTvqx#mIo wqxYRSYvm?_|0nw42>zewhvSz_yd5$A1f^DLj=d)`hyVZp07*qoM6N<$f|k`|ga7~l delta 1300 zcmV+v1?&3Z3i1k&L4T7_OjJdsh-a30Si7EmqlRU(mUW+jVWER#o`7JTfM1h!Ri=n& zxSD#Vhi0peZMvL%m3LRVo_@EPd7^}5Q92^4jBK%!bEk=Ek#ke4jcm4Xl5|wE zlyj|+Z@Qg)x}JZji))>KUYmVge_}y$R5Wx}HjZ&pnR{E8dLdc5pMQ8-I)P(Dj&V?q za8PzwICWPy00012fO^~j001$O&n}Vh27dq_noc1A000SaNLh0L01mEqqVtYw+r9VY16DXRB?6ukMT7TQ< zPZ3K5>kj){qD~@s|KZY5iNMPgu+|$dmep3Z0f?-tEM4Dx{6wbLWf34CGNx^fv4(f@ zVlAt!HvWeVB-A^*y|!l1Wf9dY7O7YD6|}Y@*09=h(1Cz#gIG578GKHcMMwl46LdBC z2t+KaT@8KXhNc-D-nqQE{bEef1AhYoFm&v;B_m=js})}uE5!1ZZa0WUmqkFr+JXQP z*a2FJuIud%JWw0!0I}Q*^|xUtN~p1)Y4M_QH!ax>Z7;Eo2@HMzQP-AE5Nt-X#cdM1 zC4zMzxVzssKY#tczrWLE5fyvg!faBvN$f^6ECC5ZOvYWo+lSplxs(y!Ab)0iw~g3M z>^D4MYNWKH_5moDvO3LRw~eF z!G&ZsK6ZPwoBe+3`-3|?KR^Fj4TJbpP9r*}Wq<%~d%LBX?s|6sN8i8b%OyYpl8)u# z0XLJ_Ex`)G;n2IizFdNs=zkqT?o&A+aLzFY6KI|o)2ZRJ;2pB)#wZ6K96&JOj|q}o zO{PXxiBS%^@o5-(*TV%6%ubD?N*v`NKE z;2cMQ&l15JOJ#0#TrJ7efCQ}cDm;PYnlU*M{TacDK((Y(LnR~?2esaAb~~Ji)47#Q z4UynLz$%1bJtmy<9ZtlwS~yo>YOn+;SgkmTz!OLW+J?e!pw+aMdU!H^F6$o@{G9L9sj{-s1 zH;v#anVkBfM@hoCuTa5G?#9{4Suio|t5njBvy*d10`H4nP_tP=HaP=kC7@)}TR}cK z1C9yezUsR8o@GzYfMbH#3*LF}dpjtL?pZ1p{#oB<~ZRCPW%0~QIA8%jPo1C|KV z8%jPo0~QIA8_FzBco1$VvsfmGHO>_%)r2R5QG_bOw4`@ z6io1RaSYK2&OO`B*Py_`8W13mY~1_*|80*jJFzo6t3z1szT#&PbmmF9Jvqd(^NF(i z#3OtG4MuZCPjPdk^fJFWv*;_A=&OoLj~nEksn;bl$^Wdq%~O+;$ya0eyC@=?`Kt8B Xd``w|3BfWz%NRUe{an^LB{Ts54>D>3 delta 319 zcmV-F0l@yF0`~%tL4R6MOjJdccUPZ*VV;0sxSD#poP4*Ld7Xe?rif^caZ++rG;vfj zlXX>>dRdu!TXa@7rHE&ugk-v&e!8E3wwQRKgJYe4UYmVgqlIOUa#50WRHKGvk#ke0 ziD{O3SOW2yivR!s32;bRa{vGi!T Date: Thu, 20 Jun 2024 14:25:18 +0200 Subject: [PATCH 034/515] Rename to Chain Conveyor --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 16 +-- .../create/blockstates/chain_conveyor.json | 7 + .../assets/create/blockstates/chain_lift.json | 7 - .../resources/assets/create/lang/en_ud.json | 2 +- .../resources/assets/create/lang/en_us.json | 2 +- .../create/models/item/chain_conveyor.json | 3 + .../assets/create/models/item/chain_lift.json | 3 - .../{chain_lift.json => chain_conveyor.json} | 4 +- .../minecraft/tags/blocks/mineable/axe.json | 2 +- .../tags/blocks/mineable/pickaxe.json | 2 +- .../simibubi/create/AllBlockEntityTypes.java | 16 +-- .../java/com/simibubi/create/AllBlocks.java | 6 +- .../java/com/simibubi/create/AllPackets.java | 8 +- .../com/simibubi/create/AllPartialModels.java | 4 +- .../ChainConveyorBlock.java} | 20 +-- .../ChainConveyorBlockEntity.java} | 124 +++++++++--------- .../ChainConveyorConnectionHandler.java} | 14 +- .../ChainConveyorConnectionPacket.java} | 12 +- .../ChainConveyorInstance.java} | 8 +- .../ChainConveyorInteractionHandler.java} | 24 ++-- .../ChainConveyorPackage.java} | 26 ++-- .../ChainConveyorRenderer.java} | 36 ++--- .../ChainConveyorRidingHandler.java} | 42 +++--- .../ChainConveyorRidingPacket.java} | 12 +- .../ChainConveyorRoutingTable.java} | 6 +- .../ChainConveyorShape.java} | 12 +- .../packagePort/PackagePortTarget.java | 36 ++--- .../create/foundation/block/BigOutlines.java | 4 +- .../foundation/events/ClientEvents.java | 8 +- .../create/foundation/events/InputEvents.java | 4 +- .../create/foundation/render/RenderTypes.java | 2 +- .../models/block/chain_conveyor/block.json | 6 + .../conveyor_casing.mtl | 0 .../conveyor_casing.obj | 0 .../conveyor_ports.mtl | 0 .../conveyor_ports.obj | 0 .../conveyor_shaft.mtl | 0 .../conveyor_shaft.obj | 0 .../models/block/chain_conveyor/guard.json | 6 + .../{chain_lift => chain_conveyor}/item.json | 10 +- .../{chain_lift => chain_conveyor}/item.mtl | 0 .../{chain_lift => chain_conveyor}/item.obj | 0 .../models/block/chain_conveyor/shaft.json | 6 + .../textures.json | 0 .../create/models/block/chain_lift/block.json | 6 - .../create/models/block/chain_lift/guard.json | 6 - .../create/models/block/chain_lift/shaft.json | 6 - 47 files changed, 260 insertions(+), 258 deletions(-) create mode 100644 src/generated/resources/assets/create/blockstates/chain_conveyor.json delete mode 100644 src/generated/resources/assets/create/blockstates/chain_lift.json create mode 100644 src/generated/resources/assets/create/models/item/chain_conveyor.json delete mode 100644 src/generated/resources/assets/create/models/item/chain_lift.json rename src/generated/resources/data/create/loot_tables/blocks/{chain_lift.json => chain_conveyor.json} (75%) rename src/main/java/com/simibubi/create/content/kinetics/{chainLift/ChainLiftBlock.java => chainConveyor/ChainConveyorBlock.java} (80%) rename src/main/java/com/simibubi/create/content/kinetics/{chainLift/ChainLiftBlockEntity.java => chainConveyor/ChainConveyorBlockEntity.java} (78%) rename src/main/java/com/simibubi/create/content/kinetics/{chainLift/ChainLiftConnectionHandler.java => chainConveyor/ChainConveyorConnectionHandler.java} (81%) rename src/main/java/com/simibubi/create/content/kinetics/{chainLift/ChainLiftConnectionPacket.java => chainConveyor/ChainConveyorConnectionPacket.java} (67%) rename src/main/java/com/simibubi/create/content/kinetics/{chainLift/ChainLiftInstance.java => chainConveyor/ChainConveyorInstance.java} (64%) rename src/main/java/com/simibubi/create/content/kinetics/{chainLift/ChainLiftInteractionHandler.java => chainConveyor/ChainConveyorInteractionHandler.java} (76%) rename src/main/java/com/simibubi/create/content/kinetics/{chainLift/ChainLiftPackage.java => chainConveyor/ChainConveyorPackage.java} (75%) rename src/main/java/com/simibubi/create/content/kinetics/{chainLift/ChainLiftRenderer.java => chainConveyor/ChainConveyorRenderer.java} (85%) rename src/main/java/com/simibubi/create/content/kinetics/{chainLift/ChainLiftRidingHandler.java => chainConveyor/ChainConveyorRidingHandler.java} (74%) rename src/main/java/com/simibubi/create/content/kinetics/{chainLift/ChainLiftRidingPacket.java => chainConveyor/ChainConveyorRidingPacket.java} (56%) rename src/main/java/com/simibubi/create/content/kinetics/{chainLift/ChainLiftRoutingTable.java => chainConveyor/ChainConveyorRoutingTable.java} (93%) rename src/main/java/com/simibubi/create/content/kinetics/{chainLift/ChainLiftShape.java => chainConveyor/ChainConveyorShape.java} (92%) create mode 100644 src/main/resources/assets/create/models/block/chain_conveyor/block.json rename src/main/resources/assets/create/models/block/{chain_lift => chain_conveyor}/conveyor_casing.mtl (100%) rename src/main/resources/assets/create/models/block/{chain_lift => chain_conveyor}/conveyor_casing.obj (100%) rename src/main/resources/assets/create/models/block/{chain_lift => chain_conveyor}/conveyor_ports.mtl (100%) rename src/main/resources/assets/create/models/block/{chain_lift => chain_conveyor}/conveyor_ports.obj (100%) rename src/main/resources/assets/create/models/block/{chain_lift => chain_conveyor}/conveyor_shaft.mtl (100%) rename src/main/resources/assets/create/models/block/{chain_lift => chain_conveyor}/conveyor_shaft.obj (100%) create mode 100644 src/main/resources/assets/create/models/block/chain_conveyor/guard.json rename src/main/resources/assets/create/models/block/{chain_lift => chain_conveyor}/item.json (50%) rename src/main/resources/assets/create/models/block/{chain_lift => chain_conveyor}/item.mtl (100%) rename src/main/resources/assets/create/models/block/{chain_lift => chain_conveyor}/item.obj (100%) create mode 100644 src/main/resources/assets/create/models/block/chain_conveyor/shaft.json rename src/main/resources/assets/create/models/block/{chain_lift => chain_conveyor}/textures.json (100%) delete mode 100644 src/main/resources/assets/create/models/block/chain_lift/block.json delete mode 100644 src/main/resources/assets/create/models/block/chain_lift/guard.json delete mode 100644 src/main/resources/assets/create/models/block/chain_lift/shaft.json diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index daf4334270..c42be01984 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-06-19T14:00:03.9832322 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-06-20T14:09:01.5542264 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -52,7 +52,7 @@ debf33346bf410216f21082e1e8d07aa6250b84c assets/create/blockstates/brown_nixie_t 440b29e1dffa4374ddc1aed444bff18a485bc1cb assets/create/blockstates/brown_valve_handle.json 2064534de4791b339fdcd4ef3a8129a2e233ec50 assets/create/blockstates/calcite_pillar.json 060c957b28afed9f4e0954cbef7e80cbf4b99f58 assets/create/blockstates/cart_assembler.json -01e41e44d1515fa6efd024764084866830d4412a assets/create/blockstates/chain_lift.json +fab98b93ad9b78312742daca83c2575db40fce98 assets/create/blockstates/chain_conveyor.json c7eca70054241944171b1d4ffcba0376b071ec62 assets/create/blockstates/chocolate.json 9eb989b0a0545af9efd052d1f127b2ec28a972d1 assets/create/blockstates/chute.json b5170d754ce5f07ea2b4646eb07c099c50bae249 assets/create/blockstates/clipboard.json @@ -591,8 +591,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -a205066e3861e46a4c39f5f94077eb66f1adad8d assets/create/lang/en_ud.json -d867862b6f18493c9a7ac21f9c36e7db42d5d117 assets/create/lang/en_us.json +5ebc4aaf865dc3a0435d7f4ca5f8b9f391a079a5 assets/create/lang/en_ud.json +73a9325cbf84d8d7c74c9fab568691fd90fbeebc assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -1732,7 +1732,7 @@ f998f36d9a6f469bbd3822a17b2b45f81e6810c6 assets/create/models/item/cardboard_pac b7a24a7dd21a464815b2fd8cd6037e854be3f485 assets/create/models/item/cardboard_package_12x10.json d5396690e7813c67ee3600555d7e47d0097b1f56 assets/create/models/item/cardboard_package_12x12.json 1cdb2b8801551c1540bb9b2a9cc3d725a2b433e7 assets/create/models/item/cart_assembler.json -9a29b1b49f3afd2ee63828b00b94ebb1ff2dba84 assets/create/models/item/chain_lift.json +390a06d81c8c2a0ff83196bd0154dd292206e3b6 assets/create/models/item/chain_conveyor.json a197d08618f4035182c91a6b16031eb681ab8a7c assets/create/models/item/chest_minecart_contraption.json 293cfa8b1073f8641a2c623b73a90907576c36ed assets/create/models/item/chocolate_bucket.json 77654cbd16cdfa95181ea3f85fcfa3cd352b69fd assets/create/models/item/chocolate_glazed_berries.json @@ -3014,7 +3014,7 @@ d391cff5b741fd6ddf5b6fa64e05526eb3a9f0d9 data/create/loot_tables/blocks/brown_ni 7c7cf4c30786f6e0a699e2b3f9120343e53107f4 data/create/loot_tables/blocks/brown_valve_handle.json 06d1c478e4236210aa12b5911691868fef33bb5f data/create/loot_tables/blocks/calcite_pillar.json 515c839deea520b07b03f7ba65c4a7b22fdf5ba3 data/create/loot_tables/blocks/cart_assembler.json -73cc13242e9765f44c756e92fe911beba8820467 data/create/loot_tables/blocks/chain_lift.json +aadd8aa7f8433896bd4fea56f43e496cbc5be25a data/create/loot_tables/blocks/chain_conveyor.json fb4877d45df15be1a74378ab28f23fbf9d0657ef data/create/loot_tables/blocks/chute.json ace9255cbdd1af5e5068916d2a6bed2f861f81f1 data/create/loot_tables/blocks/clipboard.json bfd871acdde6c239098ead188a5aad7636d11bc0 data/create/loot_tables/blocks/clockwork_bearing.json @@ -4311,8 +4311,8 @@ c741ba83b562ae3459d7c4f2db69537f549ea411 data/forge/tags/items/tools/wrench.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/dripstone_replaceable_blocks.json e3321ff14704c031a2c16953b7e391f4f24dd70b data/minecraft/tags/blocks/impermeable.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/lush_ground_replaceable.json -0d48e55143607d9de428bd357fc7f4b8c4ce5cba data/minecraft/tags/blocks/mineable/axe.json -211a870c1cc6f2b2867c8462a79ae6cbe5cc9732 data/minecraft/tags/blocks/mineable/pickaxe.json +97e4fca52c0fc5c8c06d376bd69b7d9fd45f1df0 data/minecraft/tags/blocks/mineable/axe.json +a0520e45e917a59925c859790f631b1cf583f775 data/minecraft/tags/blocks/mineable/pickaxe.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/moss_replaceable.json 0c13aae0eeb99e89febe8dbe5e002af2ff843a9e data/minecraft/tags/blocks/needs_iron_tool.json 3cb2a92cbdf32ed5978f740dc378d363306c3e84 data/minecraft/tags/blocks/needs_stone_tool.json diff --git a/src/generated/resources/assets/create/blockstates/chain_conveyor.json b/src/generated/resources/assets/create/blockstates/chain_conveyor.json new file mode 100644 index 0000000000..164b69102f --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/chain_conveyor.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/chain_conveyor/block" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/chain_lift.json b/src/generated/resources/assets/create/blockstates/chain_lift.json deleted file mode 100644 index 198e057b63..0000000000 --- a/src/generated/resources/assets/create/blockstates/chain_lift.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "create:block/chain_lift/block" - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 4aa4407dd5..636fdef570 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -238,7 +238,7 @@ "block.create.brown_valve_handle": "ǝןpuɐH ǝʌןɐΛ uʍoɹᗺ", "block.create.calcite_pillar": "ɹɐןןıԀ ǝʇıɔןɐƆ", "block.create.cart_assembler": "ɹǝןqɯǝssⱯ ʇɹɐƆ", - "block.create.chain_lift": "ʇɟıꞀ uıɐɥƆ", + "block.create.chain_conveyor": "ɹoʎǝʌuoƆ uıɐɥƆ", "block.create.chocolate": "ǝʇɐןoɔoɥƆ", "block.create.chute": "ǝʇnɥƆ", "block.create.clipboard": "pɹɐoqdıןƆ", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index c63d778804..bfa9c0d719 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -238,7 +238,7 @@ "block.create.brown_valve_handle": "Brown Valve Handle", "block.create.calcite_pillar": "Calcite Pillar", "block.create.cart_assembler": "Cart Assembler", - "block.create.chain_lift": "Chain Lift", + "block.create.chain_conveyor": "Chain Conveyor", "block.create.chocolate": "Chocolate", "block.create.chute": "Chute", "block.create.clipboard": "Clipboard", diff --git a/src/generated/resources/assets/create/models/item/chain_conveyor.json b/src/generated/resources/assets/create/models/item/chain_conveyor.json new file mode 100644 index 0000000000..6cd1930f7c --- /dev/null +++ b/src/generated/resources/assets/create/models/item/chain_conveyor.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/chain_conveyor/item" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/chain_lift.json b/src/generated/resources/assets/create/models/item/chain_lift.json deleted file mode 100644 index b21edebe7b..0000000000 --- a/src/generated/resources/assets/create/models/item/chain_lift.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "create:block/chain_lift/item" -} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/chain_lift.json b/src/generated/resources/data/create/loot_tables/blocks/chain_conveyor.json similarity index 75% rename from src/generated/resources/data/create/loot_tables/blocks/chain_lift.json rename to src/generated/resources/data/create/loot_tables/blocks/chain_conveyor.json index f3799d002d..2f5a7f326e 100644 --- a/src/generated/resources/data/create/loot_tables/blocks/chain_lift.json +++ b/src/generated/resources/data/create/loot_tables/blocks/chain_conveyor.json @@ -11,11 +11,11 @@ "entries": [ { "type": "minecraft:item", - "name": "create:chain_lift" + "name": "create:chain_conveyor" } ], "rolls": 1.0 } ], - "random_sequence": "create:blocks/chain_lift" + "random_sequence": "create:blocks/chain_conveyor" } \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json b/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json index 6e236adc59..07e5415dc1 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json @@ -15,7 +15,7 @@ "create:encased_chain_drive", "create:adjustable_chain_gearshift", "create:belt", - "create:chain_lift", + "create:chain_conveyor", "create:water_wheel", "create:large_water_wheel", "create:water_wheel_structure", diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json index fd573f0110..ff37b21a6b 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json @@ -17,7 +17,7 @@ "create:encased_chain_drive", "create:adjustable_chain_gearshift", "create:belt", - "create:chain_lift", + "create:chain_conveyor", "create:creative_motor", "create:water_wheel", "create:large_water_wheel", diff --git a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java index dd2dfc77f6..3552dff332 100644 --- a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java +++ b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java @@ -82,10 +82,10 @@ import com.simibubi.create.content.kinetics.base.SingleRotatingInstance; import com.simibubi.create.content.kinetics.belt.BeltBlockEntity; import com.simibubi.create.content.kinetics.belt.BeltInstance; import com.simibubi.create.content.kinetics.belt.BeltRenderer; +import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorBlockEntity; +import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorInstance; +import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorRenderer; import com.simibubi.create.content.kinetics.chainDrive.ChainGearshiftBlockEntity; -import com.simibubi.create.content.kinetics.chainLift.ChainLiftBlockEntity; -import com.simibubi.create.content.kinetics.chainLift.ChainLiftInstance; -import com.simibubi.create.content.kinetics.chainLift.ChainLiftRenderer; import com.simibubi.create.content.kinetics.clock.CuckooClockBlockEntity; import com.simibubi.create.content.kinetics.clock.CuckooClockRenderer; import com.simibubi.create.content.kinetics.crafter.MechanicalCrafterBlockEntity; @@ -363,11 +363,11 @@ public class AllBlockEntityTypes { .renderer(() -> GantryCarriageRenderer::new) .register(); - public static final BlockEntityEntry CHAIN_LIFT = REGISTRATE - .blockEntity("chain_lift", ChainLiftBlockEntity::new) - .instance(() -> ChainLiftInstance::new) - .validBlocks(AllBlocks.CHAIN_LIFT) - .renderer(() -> ChainLiftRenderer::new) + public static final BlockEntityEntry CHAIN_CONVEYOR = REGISTRATE + .blockEntity("chain_conveyor", ChainConveyorBlockEntity::new) + .instance(() -> ChainConveyorInstance::new) + .validBlocks(AllBlocks.CHAIN_CONVEYOR) + .renderer(() -> ChainConveyorRenderer::new) .register(); public static final BlockEntityEntry MECHANICAL_PUMP = REGISTRATE diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index cd97d1a271..5a64d6a738 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -106,10 +106,10 @@ import com.simibubi.create.content.kinetics.BlockStressDefaults; import com.simibubi.create.content.kinetics.belt.BeltBlock; import com.simibubi.create.content.kinetics.belt.BeltGenerator; import com.simibubi.create.content.kinetics.belt.BeltModel; +import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorBlock; import com.simibubi.create.content.kinetics.chainDrive.ChainDriveBlock; import com.simibubi.create.content.kinetics.chainDrive.ChainDriveGenerator; import com.simibubi.create.content.kinetics.chainDrive.ChainGearshiftBlock; -import com.simibubi.create.content.kinetics.chainLift.ChainLiftBlock; import com.simibubi.create.content.kinetics.clock.CuckooClockBlock; import com.simibubi.create.content.kinetics.crafter.CrafterCTBehaviour; import com.simibubi.create.content.kinetics.crafter.MechanicalCrafterBlock; @@ -525,8 +525,8 @@ public class AllBlocks { .onRegister(CreateRegistrate.blockModel(() -> BeltModel::new)) .register(); - public static final BlockEntry CHAIN_LIFT = - REGISTRATE.block("chain_lift", ChainLiftBlock::new) + public static final BlockEntry CHAIN_CONVEYOR = + REGISTRATE.block("chain_conveyor", ChainConveyorBlock::new) .initialProperties(SharedProperties::stone) .properties(p -> p.noOcclusion().mapColor(MapColor.PODZOL)) .transform(axeOrPickaxe()) diff --git a/src/main/java/com/simibubi/create/AllPackets.java b/src/main/java/com/simibubi/create/AllPackets.java index e36b924658..5d2088d002 100644 --- a/src/main/java/com/simibubi/create/AllPackets.java +++ b/src/main/java/com/simibubi/create/AllPackets.java @@ -45,8 +45,8 @@ import com.simibubi.create.content.equipment.toolbox.ToolboxEquipPacket; import com.simibubi.create.content.equipment.zapper.ZapperBeamPacket; import com.simibubi.create.content.equipment.zapper.terrainzapper.ConfigureWorldshaperPacket; import com.simibubi.create.content.fluids.transfer.FluidSplashPacket; -import com.simibubi.create.content.kinetics.chainLift.ChainLiftConnectionPacket; -import com.simibubi.create.content.kinetics.chainLift.ChainLiftRidingPacket; +import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorConnectionPacket; +import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorRidingPacket; import com.simibubi.create.content.kinetics.gauge.GaugeObservedPacket; import com.simibubi.create.content.kinetics.mechanicalArm.ArmPlacementPacket; import com.simibubi.create.content.kinetics.transmission.sequencer.ConfigureSequencedGearshiftPacket; @@ -173,8 +173,8 @@ public enum AllPackets { ContraptionColliderLockPacketRequest::new, PLAY_TO_SERVER), LOGISTICS_STOCK_REQUEST(LogisticalStockRequestPacket.class, LogisticalStockRequestPacket::new, PLAY_TO_SERVER), LOGISTICS_PACKAGE_REQUEST(PackageOrderRequestPacket.class, PackageOrderRequestPacket::new, PLAY_TO_SERVER), - CHAIN_LIFT_CONNECT(ChainLiftConnectionPacket.class, ChainLiftConnectionPacket::new, PLAY_TO_SERVER), - CHAIN_LIFT_RIDING(ChainLiftRidingPacket.class, ChainLiftRidingPacket::new, PLAY_TO_SERVER), + CHAIN_CONVEYOR_CONNECT(ChainConveyorConnectionPacket.class, ChainConveyorConnectionPacket::new, PLAY_TO_SERVER), + CHAIN_CONVEYOR_RIDING(ChainConveyorRidingPacket.class, ChainConveyorRidingPacket::new, PLAY_TO_SERVER), // Server to Client SYMMETRY_EFFECT(SymmetryEffectPacket.class, SymmetryEffectPacket::new, PLAY_TO_CLIENT), diff --git a/src/main/java/com/simibubi/create/AllPartialModels.java b/src/main/java/com/simibubi/create/AllPartialModels.java index 7f165b2fcc..76ebc8c49a 100644 --- a/src/main/java/com/simibubi/create/AllPartialModels.java +++ b/src/main/java/com/simibubi/create/AllPartialModels.java @@ -115,8 +115,8 @@ public class AllPartialModels { EJECTOR_TOP = block("weighted_ejector/top"), - CHAIN_LIFT_GUARD = block("chain_lift/guard"), - CHAIN_LIFT_SHAFT = block("chain_lift/shaft"), + CHAIN_CONVEYOR_GUARD = block("chain_conveyor/guard"), + CHAIN_CONVEYOR_SHAFT = block("chain_conveyor/shaft"), PACKAGE_PORT_BODY = block("package_port/body"), PACKAGE_PORT_HEAD = block("package_port/head"), diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftBlock.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlock.java similarity index 80% rename from src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftBlock.java rename to src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlock.java index 81ec9f2667..abfda7d275 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlock.java @@ -1,4 +1,4 @@ -package com.simibubi.create.content.kinetics.chainLift; +package com.simibubi.create.content.kinetics.chainConveyor; import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.content.kinetics.base.KineticBlock; @@ -21,9 +21,9 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.Vec3; -public class ChainLiftBlock extends KineticBlock implements IBE { +public class ChainConveyorBlock extends KineticBlock implements IBE { - public ChainLiftBlock(Properties properties) { + public ChainConveyorBlock(Properties properties) { super(properties); } @@ -48,8 +48,8 @@ public class ChainLiftBlock extends KineticBlock implements IBE { float bestDiff = Float.POSITIVE_INFINITY; - ChainLiftPackage best = null; - for (ChainLiftPackage liftPackage : be.loopingPackages) { + ChainConveyorPackage best = null; + for (ChainConveyorPackage liftPackage : be.loopingPackages) { float angleDiff = Math.abs(AngleHelper.getShortestAngleDiff(liftPackage.chainPosition, angle)); if (angleDiff > bestDiff) continue; @@ -69,7 +69,7 @@ public class ChainLiftBlock extends KineticBlock implements IBE { - be.addLoopingPackage(new ChainLiftPackage(angle, itemInHand.copyWithCount(1))); + be.addLoopingPackage(new ChainConveyorPackage(angle, itemInHand.copyWithCount(1))); itemInHand.shrink(1); if (itemInHand.isEmpty()) pPlayer.setItemInHand(pHand, ItemStack.EMPTY); @@ -89,13 +89,13 @@ public class ChainLiftBlock extends KineticBlock implements IBE getBlockEntityClass() { - return ChainLiftBlockEntity.class; + public Class getBlockEntityClass() { + return ChainConveyorBlockEntity.class; } @Override - public BlockEntityType getBlockEntityType() { - return AllBlockEntityTypes.CHAIN_LIFT.get(); + public BlockEntityType getBlockEntityType() { + return AllBlockEntityTypes.CHAIN_CONVEYOR.get(); } } diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java similarity index 78% rename from src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftBlockEntity.java rename to src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java index c9cbedd059..5d38add822 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java @@ -1,4 +1,4 @@ -package com.simibubi.create.content.kinetics.chainLift; +package com.simibubi.create.content.kinetics.chainConveyor; import java.util.ArrayList; import java.util.HashMap; @@ -13,9 +13,9 @@ import javax.annotation.Nullable; import com.simibubi.create.content.kinetics.base.IRotate; import com.simibubi.create.content.kinetics.base.KineticBlockEntity; -import com.simibubi.create.content.kinetics.chainLift.ChainLiftPackage.ChainLiftPackagePhysicsData; -import com.simibubi.create.content.kinetics.chainLift.ChainLiftShape.ChainLiftBB; -import com.simibubi.create.content.kinetics.chainLift.ChainLiftShape.ChainLiftOBB; +import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorPackage.ChainConveyorPackagePhysicsData; +import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorShape.ChainConveyorBB; +import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorShape.ChainConveyorOBB; import com.simibubi.create.content.logistics.box.PackageEntity; import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.content.logistics.packagePort.PackagePortBlockEntity; @@ -27,7 +27,6 @@ import net.createmod.catnip.utility.lang.Components; import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction.Axis; -import net.minecraft.core.particles.ParticleTypes; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; import net.minecraft.nbt.Tag; @@ -38,7 +37,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; -public class ChainLiftBlockEntity extends KineticBlockEntity { +public class ChainConveyorBlockEntity extends KineticBlockEntity { public record ConnectionStats(float tangentAngle, float chainLength, Vec3 start, Vec3 end) { } @@ -51,14 +50,14 @@ public class ChainLiftBlockEntity extends KineticBlockEntity { public Map loopPorts = new HashMap<>(); public Map travelPorts = new HashMap<>(); - public ChainLiftRoutingTable routingTable = new ChainLiftRoutingTable(); + public ChainConveyorRoutingTable routingTable = new ChainConveyorRoutingTable(); - List loopingPackages = new ArrayList<>(); - Map> travellingPackages = new HashMap<>(); + List loopingPackages = new ArrayList<>(); + Map> travellingPackages = new HashMap<>(); public boolean reversed; - public ChainLiftBlockEntity(BlockEntityType typeIn, BlockPos pos, BlockState state) { + public ChainConveyorBlockEntity(BlockEntityType typeIn, BlockPos pos, BlockState state) { super(typeIn, pos, state); } @@ -75,13 +74,15 @@ public class ChainLiftBlockEntity extends KineticBlockEntity { @Override public boolean addToTooltip(List tooltip, boolean isPlayerSneaking) { - super.addToTooltip(tooltip, isPlayerSneaking); - tooltip.addAll(routingTable.createSummary()); - if (!loopPorts.isEmpty()) - tooltip.add(Components.literal(loopPorts.size() + " Loop ports")); - if (!travelPorts.isEmpty()) - tooltip.add(Components.literal(travelPorts.size() + " Travel ports")); - return true; + return super.addToTooltip(tooltip, isPlayerSneaking); + +// // debug routing info +// tooltip.addAll(routingTable.createSummary()); +// if (!loopPorts.isEmpty()) +// tooltip.add(Components.literal(loopPorts.size() + " Loop ports")); +// if (!travelPorts.isEmpty()) +// tooltip.add(Components.literal(travelPorts.size() + " Travel ports")); +// return true; } @Override @@ -98,21 +99,18 @@ public class ChainLiftBlockEntity extends KineticBlockEntity { prepareStats(); if (level.isClientSide()) { - for (ChainLiftPackage box : loopingPackages) + for (ChainConveyorPackage box : loopingPackages) tickBoxVisuals(box); - for (Entry> entry : travellingPackages.entrySet()) - for (ChainLiftPackage box : entry.getValue()) + for (Entry> entry : travellingPackages.entrySet()) + for (ChainConveyorPackage box : entry.getValue()) tickBoxVisuals(box); } - /* if serverside */ { + if (!level.isClientSide()) { routingTable.tick(); if (routingTable.shouldAdvertise()) { - if (level.isClientSide()) - level.addParticle(ParticleTypes.CRIT, worldPosition.getX() + .5, worldPosition.getY() + 1.5, - worldPosition.getZ() + .5, 0, 0, 0); for (BlockPos pos : connections) - if (level.getBlockEntity(worldPosition.offset(pos)) instanceof ChainLiftBlockEntity clbe) + if (level.getBlockEntity(worldPosition.offset(pos)) instanceof ChainConveyorBlockEntity clbe) routingTable.advertiseTo(pos, clbe.routingTable); routingTable.changed = false; routingTable.lastUpdate = 0; @@ -125,13 +123,13 @@ public class ChainLiftBlockEntity extends KineticBlockEntity { } if (reversedPreviously != reversed) { - for (Entry> entry : travellingPackages.entrySet()) { + for (Entry> entry : travellingPackages.entrySet()) { BlockPos offset = entry.getKey(); - if (!(level.getBlockEntity(worldPosition.offset(offset)) instanceof ChainLiftBlockEntity otherLift)) + if (!(level.getBlockEntity(worldPosition.offset(offset)) instanceof ChainConveyorBlockEntity otherLift)) continue; - for (Iterator iterator = entry.getValue() + for (Iterator iterator = entry.getValue() .iterator(); iterator.hasNext();) { - ChainLiftPackage box = iterator.next(); + ChainConveyorPackage box = iterator.next(); if (box.justFlipped) continue; box.justFlipped = true; @@ -145,13 +143,13 @@ public class ChainLiftBlockEntity extends KineticBlockEntity { notifyUpdate(); } - for (Entry> entry : travellingPackages.entrySet()) { + for (Entry> entry : travellingPackages.entrySet()) { BlockPos target = entry.getKey(); ConnectionStats stats = connectionStats.get(target); - Travelling: for (Iterator iterator = entry.getValue() + Travelling: for (Iterator iterator = entry.getValue() .iterator(); iterator.hasNext();) { - ChainLiftPackage box = iterator.next(); + ChainConveyorPackage box = iterator.next(); float prevChainPosition = box.chainPosition; box.chainPosition += serverSpeed * distancePerTick; @@ -181,7 +179,7 @@ public class ChainLiftBlockEntity extends KineticBlockEntity { continue; // transfer to other - if (level.getBlockEntity(worldPosition.offset(target)) instanceof ChainLiftBlockEntity clbe) { + if (level.getBlockEntity(worldPosition.offset(target)) instanceof ChainConveyorBlockEntity clbe) { box.chainPosition = wrapAngle(stats.tangentAngle + 180 + 2 * 35 * (reversed ? -1 : 1)); clbe.addLoopingPackage(box); iterator.remove(); @@ -190,8 +188,8 @@ public class ChainLiftBlockEntity extends KineticBlockEntity { } } - Looping: for (Iterator iterator = loopingPackages.iterator(); iterator.hasNext();) { - ChainLiftPackage box = iterator.next(); + Looping: for (Iterator iterator = loopingPackages.iterator(); iterator.hasNext();) { + ChainConveyorPackage box = iterator.next(); float prevChainPosition = box.chainPosition; box.chainPosition += serverSpeed * degreesPerTick; @@ -243,7 +241,7 @@ public class ChainLiftBlockEntity extends KineticBlockEntity { return !notCrossed; } - private boolean exportToPort(ChainLiftPackage box, BlockPos offset) { + private boolean exportToPort(ChainConveyorPackage box, BlockPos offset) { BlockPos globalPos = worldPosition.offset(offset); if (!(level.getBlockEntity(globalPos) instanceof PackagePortBlockEntity ppbe)) return false; @@ -257,7 +255,7 @@ public class ChainLiftBlockEntity extends KineticBlockEntity { return true; } - public boolean addTravellingPackage(ChainLiftPackage box, BlockPos connection) { + public boolean addTravellingPackage(ChainConveyorPackage box, BlockPos connection) { if (!connections.contains(connection)) return false; travellingPackages.computeIfAbsent(connection, $ -> new ArrayList<>()) @@ -272,7 +270,7 @@ public class ChainLiftBlockEntity extends KineticBlockEntity { sendData(); } - public boolean addLoopingPackage(ChainLiftPackage box) { + public boolean addLoopingPackage(ChainConveyorPackage box) { loopingPackages.add(box); notifyUpdate(); return true; @@ -293,10 +291,10 @@ public class ChainLiftBlockEntity extends KineticBlockEntity { public void updateBoxWorldPositions() { prepareStats(); - for (Entry> entry : travellingPackages.entrySet()) { + for (Entry> entry : travellingPackages.entrySet()) { BlockPos target = entry.getKey(); ConnectionStats stats = connectionStats.get(target); - for (ChainLiftPackage box : entry.getValue()) { + for (ChainConveyorPackage box : entry.getValue()) { box.worldPosition = getPackagePosition(box.chainPosition, target); if (level == null || !level.isClientSide()) continue; @@ -306,7 +304,7 @@ public class ChainLiftBlockEntity extends KineticBlockEntity { } } - for (ChainLiftPackage box : loopingPackages) { + for (ChainConveyorPackage box : loopingPackages) { box.worldPosition = getPackagePosition(box.chainPosition, null); box.yaw = Mth.wrapDegrees(box.chainPosition); if (reversed) @@ -326,11 +324,11 @@ public class ChainLiftBlockEntity extends KineticBlockEntity { return stats.start.add(diff.scale(Math.min(stats.chainLength, chainPosition))); } - private void tickBoxVisuals(ChainLiftPackage box) { + private void tickBoxVisuals(ChainConveyorPackage box) { if (box.worldPosition == null) return; - ChainLiftPackagePhysicsData physicsData = box.physicsData(level); + ChainConveyorPackagePhysicsData physicsData = box.physicsData(level); if (!physicsData.shouldTick()) return; @@ -400,9 +398,9 @@ public class ChainLiftBlockEntity extends KineticBlockEntity { boolean removed = connections.remove(localTarget); if (removed) { connectionStats.remove(localTarget); - List packages = travellingPackages.remove(localTarget); + List packages = travellingPackages.remove(localTarget); if (packages != null) - for (ChainLiftPackage box : packages) + for (ChainConveyorPackage box : packages) drop(box); notifyUpdate(); updateChainShapes(); @@ -417,41 +415,41 @@ public class ChainLiftBlockEntity extends KineticBlockEntity { private void updateChainShapes() { prepareStats(); - List shapes = new ArrayList<>(); - shapes.add(new ChainLiftBB(Vec3.atBottomCenterOf(BlockPos.ZERO))); + List shapes = new ArrayList<>(); + shapes.add(new ChainConveyorBB(Vec3.atBottomCenterOf(BlockPos.ZERO))); for (BlockPos target : connections) { ConnectionStats stats = connectionStats.get(target); if (stats == null) continue; Vec3 localStart = stats.start.subtract(Vec3.atLowerCornerOf(worldPosition)); Vec3 localEnd = stats.end.subtract(Vec3.atLowerCornerOf(worldPosition)); - shapes.add(new ChainLiftOBB(target, localStart, localEnd)); + shapes.add(new ChainConveyorOBB(target, localStart, localEnd)); } - ChainLiftInteractionHandler.loadedChains.get(level) + ChainConveyorInteractionHandler.loadedChains.get(level) .put(worldPosition, shapes); } @Override public void destroy() { super.destroy(); - ChainLiftInteractionHandler.loadedChains.get(level) + ChainConveyorInteractionHandler.loadedChains.get(level) .invalidate(worldPosition); if (level.isClientSide()) return; for (BlockPos blockPos : connections) - if (level.getBlockEntity(worldPosition.offset(blockPos)) instanceof ChainLiftBlockEntity clbe) + if (level.getBlockEntity(worldPosition.offset(blockPos)) instanceof ChainConveyorBlockEntity clbe) clbe.removeConnectionTo(worldPosition); - for (ChainLiftPackage box : loopingPackages) + for (ChainConveyorPackage box : loopingPackages) drop(box); - for (Entry> entry : travellingPackages.entrySet()) - for (ChainLiftPackage box : entry.getValue()) + for (Entry> entry : travellingPackages.entrySet()) + for (ChainConveyorPackage box : entry.getValue()) drop(box); } - private void drop(ChainLiftPackage box) { + private void drop(ChainConveyorPackage box) { level.addFreshEntity(PackageEntity.fromItemStack(level, box.worldPosition.subtract(0, 0.5, 0), box.item)); } @@ -466,7 +464,7 @@ public class ChainLiftBlockEntity extends KineticBlockEntity { boolean connectedViaAxes, boolean connectedViaCogs) { if (connections.contains(target.getBlockPos() .subtract(worldPosition))) { - if (!(target instanceof ChainLiftBlockEntity clbe)) + if (!(target instanceof ChainConveyorBlockEntity clbe)) return 0; return 1; } @@ -481,11 +479,11 @@ public class ChainLiftBlockEntity extends KineticBlockEntity { CompoundTag compoundTag = new CompoundTag(); compoundTag.put("Target", NbtUtils.writeBlockPos(entry.getKey())); compoundTag.put("Packages", NBTHelper.writeCompoundList(entry.getValue(), - clientPacket ? ChainLiftPackage::writeToClient : ChainLiftPackage::write)); + clientPacket ? ChainConveyorPackage::writeToClient : ChainConveyorPackage::write)); return compoundTag; })); compound.put("LoopingPackages", NBTHelper.writeCompoundList(loopingPackages, - clientPacket ? ChainLiftPackage::writeToClient : ChainLiftPackage::write)); + clientPacket ? ChainConveyorPackage::writeToClient : ChainConveyorPackage::write)); } @Override @@ -497,9 +495,9 @@ public class ChainLiftBlockEntity extends KineticBlockEntity { travellingPackages.clear(); NBTHelper.iterateCompoundList(compound.getList("TravellingPackages", Tag.TAG_COMPOUND), c -> travellingPackages.put(NbtUtils.readBlockPos(c.getCompound("Target")), - NBTHelper.readCompoundList(c.getList("Packages", Tag.TAG_COMPOUND), ChainLiftPackage::read))); - loopingPackages = - NBTHelper.readCompoundList(compound.getList("LoopingPackages", Tag.TAG_COMPOUND), ChainLiftPackage::read); + NBTHelper.readCompoundList(c.getList("Packages", Tag.TAG_COMPOUND), ChainConveyorPackage::read))); + loopingPackages = NBTHelper.readCompoundList(compound.getList("LoopingPackages", Tag.TAG_COMPOUND), + ChainConveyorPackage::read); connectionStats = null; updateBoxWorldPositions(); updateChainShapes(); @@ -512,11 +510,11 @@ public class ChainLiftBlockEntity extends KineticBlockEntity { return angle; } - public List getLoopingPackages() { + public List getLoopingPackages() { return loopingPackages; } - public Map> getTravellingPackages() { + public Map> getTravellingPackages() { return travellingPackages; } diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftConnectionHandler.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorConnectionHandler.java similarity index 81% rename from src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftConnectionHandler.java rename to src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorConnectionHandler.java index 8ebc1258d4..7807a41b5e 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftConnectionHandler.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorConnectionHandler.java @@ -1,4 +1,4 @@ -package com.simibubi.create.content.kinetics.chainLift; +package com.simibubi.create.content.kinetics.chainConveyor; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllPackets; @@ -19,7 +19,7 @@ import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; @EventBusSubscriber(Dist.CLIENT) -public class ChainLiftConnectionHandler { +public class ChainConveyorConnectionHandler { private static BlockPos firstPos; private static ResourceKey firstDim; @@ -32,7 +32,7 @@ public class ChainLiftConnectionHandler { Player player = event.getEntity(); BlockState blockState = level.getBlockState(pos); - if (!AllBlocks.CHAIN_LIFT.has(blockState)) + if (!AllBlocks.CHAIN_CONVEYOR.has(blockState)) return; if (!itemStack.is(Items.CHAIN)) // Replace with tag? generic renderer? return; @@ -55,9 +55,9 @@ public class ChainLiftConnectionHandler { // TODO max distance config - ChainLiftBlock chainLiftBlock = AllBlocks.CHAIN_LIFT.get(); - ChainLiftBlockEntity sourceLift = chainLiftBlock.getBlockEntity(level, firstPos); - ChainLiftBlockEntity targetLift = chainLiftBlock.getBlockEntity(level, pos); + ChainConveyorBlock chainConveyorBlock = AllBlocks.CHAIN_CONVEYOR.get(); + ChainConveyorBlockEntity sourceLift = chainConveyorBlock.getBlockEntity(level, firstPos); + ChainConveyorBlockEntity targetLift = chainConveyorBlock.getBlockEntity(level, pos); if (sourceLift == null || targetLift == null) { firstPos = null; @@ -67,7 +67,7 @@ public class ChainLiftConnectionHandler { } AllPackets.getChannel() - .sendToServer(new ChainLiftConnectionPacket(firstPos, pos, true)); + .sendToServer(new ChainConveyorConnectionPacket(firstPos, pos, true)); CreateLang.text("Chain added") // TODO localisation entry .sendStatus(player); diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftConnectionPacket.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorConnectionPacket.java similarity index 67% rename from src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftConnectionPacket.java rename to src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorConnectionPacket.java index 57b679ac00..a5f7a82b2b 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftConnectionPacket.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorConnectionPacket.java @@ -1,22 +1,22 @@ -package com.simibubi.create.content.kinetics.chainLift; +package com.simibubi.create.content.kinetics.chainConveyor; import com.simibubi.create.foundation.networking.BlockEntityConfigurationPacket; import net.minecraft.core.BlockPos; import net.minecraft.network.FriendlyByteBuf; -public class ChainLiftConnectionPacket extends BlockEntityConfigurationPacket { +public class ChainConveyorConnectionPacket extends BlockEntityConfigurationPacket { private BlockPos targetPos; private boolean connect; - public ChainLiftConnectionPacket(BlockPos pos, BlockPos targetPos, boolean connect) { + public ChainConveyorConnectionPacket(BlockPos pos, BlockPos targetPos, boolean connect) { super(pos); this.targetPos = targetPos; this.connect = connect; } - public ChainLiftConnectionPacket(FriendlyByteBuf buffer) { + public ChainConveyorConnectionPacket(FriendlyByteBuf buffer) { super(buffer); } @@ -33,11 +33,11 @@ public class ChainLiftConnectionPacket extends BlockEntityConfigurationPacket { +public class ChainConveyorInstance extends SingleRotatingInstance { - public ChainLiftInstance(MaterialManager materialManager, ChainLiftBlockEntity blockEntity) { + public ChainConveyorInstance(MaterialManager materialManager, ChainConveyorBlockEntity blockEntity) { super(materialManager, blockEntity); } @Override protected Instancer getModel() { - return getRotatingMaterial().getModel(AllPartialModels.CHAIN_LIFT_SHAFT, blockEntity.getBlockState()); + return getRotatingMaterial().getModel(AllPartialModels.CHAIN_CONVEYOR_SHAFT, blockEntity.getBlockState()); } @Override diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftInteractionHandler.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorInteractionHandler.java similarity index 76% rename from src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftInteractionHandler.java rename to src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorInteractionHandler.java index ee54600636..32e9d2d2c1 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftInteractionHandler.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorInteractionHandler.java @@ -1,4 +1,4 @@ -package com.simibubi.create.content.kinetics.chainLift; +package com.simibubi.create.content.kinetics.chainConveyor; import java.util.List; import java.util.Map.Entry; @@ -20,9 +20,9 @@ import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; import net.minecraftforge.common.ForgeMod; -public class ChainLiftInteractionHandler { +public class ChainConveyorInteractionHandler { - public static WorldAttached>> loadedChains = + public static WorldAttached>> loadedChains = new WorldAttached<>($ -> CacheBuilder.newBuilder() .expireAfterAccess(3, TimeUnit.SECONDS) .build()); @@ -50,16 +50,16 @@ public class ChainLiftInteractionHandler { .distanceToSqr(from); BlockPos bestLift = null; - ChainLiftShape bestShape = null; + ChainConveyorShape bestShape = null; selectedConnection = null; - for (Entry> entry : loadedChains.get(Minecraft.getInstance().level) + for (Entry> entry : loadedChains.get(Minecraft.getInstance().level) .asMap() .entrySet()) { BlockPos liftPos = entry.getKey(); - for (ChainLiftShape chainLiftShape : entry.getValue()) { + for (ChainConveyorShape chainConveyorShape : entry.getValue()) { Vec3 liftVec = Vec3.atLowerCornerOf(liftPos); - Vec3 intersect = chainLiftShape.intersect(from.subtract(liftVec), to.subtract(liftVec)); + Vec3 intersect = chainConveyorShape.intersect(from.subtract(liftVec), to.subtract(liftVec)); if (intersect == null) continue; @@ -69,9 +69,9 @@ public class ChainLiftInteractionHandler { continue; bestDiff = distanceToSqr; bestLift = liftPos; - bestShape = chainLiftShape; - selectedChainPosition = chainLiftShape.getChainPosition(intersect); - if (chainLiftShape instanceof ChainLiftShape.ChainLiftOBB obb) + bestShape = chainConveyorShape; + selectedChainPosition = chainConveyorShape.getChainPosition(intersect); + if (chainConveyorShape instanceof ChainConveyorShape.ChainConveyorOBB obb) selectedConnection = obb.connection; } } @@ -99,7 +99,7 @@ public class ChainLiftInteractionHandler { if (AllItemTags.WRENCH.matches(mainHandItem)) { if (!mc.player.isCrouching()) { - ChainLiftRidingHandler.embark(selectedLift, selectedChainPosition, selectedConnection); + ChainConveyorRidingHandler.embark(selectedLift, selectedChainPosition, selectedConnection); return true; } // dismantle or start riding @@ -108,7 +108,7 @@ public class ChainLiftInteractionHandler { if (AllBlocks.PACKAGE_PORT.isIn(mainHandItem)) { PackagePortTargetSelectionHandler.activePackageTarget = - new PackagePortTarget.ChainLiftPortTarget(selectedLift, selectedChainPosition, selectedConnection); + new PackagePortTarget.ChainConveyorPortTarget(selectedLift, selectedChainPosition, selectedConnection); return true; } diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftPackage.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorPackage.java similarity index 75% rename from src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftPackage.java rename to src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorPackage.java index c179d90411..ae6ee0f3c0 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftPackage.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorPackage.java @@ -1,4 +1,4 @@ -package com.simibubi.create.content.kinetics.chainLift; +package com.simibubi.create.content.kinetics.chainConveyor; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; @@ -15,19 +15,19 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.phys.Vec3; -public class ChainLiftPackage { +public class ChainConveyorPackage { // Server creates unique ids for chain boxes public static final AtomicInteger netIdGenerator = new AtomicInteger(); // Client tracks physics data by id so it can travel between BEs private static final int ticksUntilExpired = 30; - public static final WorldAttached> physicsDataCache = + public static final WorldAttached> physicsDataCache = new WorldAttached<>($ -> CacheBuilder.newBuilder() .expireAfterAccess(ticksUntilExpired * 50, TimeUnit.MILLISECONDS) .build()); - public class ChainLiftPackagePhysicsData { + public class ChainConveyorPackagePhysicsData { public Vec3 targetPos; public Vec3 prevTargetPos; public Vec3 prevPos; @@ -40,7 +40,7 @@ public class ChainLiftPackage { public boolean flipped; public ResourceLocation modelKey; - public ChainLiftPackagePhysicsData(Vec3 serverPosition) { + public ChainConveyorPackagePhysicsData(Vec3 serverPosition) { this.targetPos = null; this.prevTargetPos = null; this.pos = null; @@ -66,13 +66,13 @@ public class ChainLiftPackage { public Vec3 worldPosition; public float yaw; - private ChainLiftPackagePhysicsData physicsData; + private ChainConveyorPackagePhysicsData physicsData; - public ChainLiftPackage(float chainPosition, ItemStack item) { + public ChainConveyorPackage(float chainPosition, ItemStack item) { this(chainPosition, item, netIdGenerator.incrementAndGet()); } - public ChainLiftPackage(float chainPosition, ItemStack item, int netId) { + public ChainConveyorPackage(float chainPosition, ItemStack item, int netId) { this.chainPosition = chainPosition; this.item = item; this.netId = netId; @@ -92,19 +92,19 @@ public class ChainLiftPackage { return compoundTag; } - public static ChainLiftPackage read(CompoundTag compoundTag) { + public static ChainConveyorPackage read(CompoundTag compoundTag) { float pos = compoundTag.getFloat("Position"); ItemStack item = ItemStack.of(compoundTag.getCompound("Item")); if (compoundTag.contains("NetID")) - return new ChainLiftPackage(pos, item, compoundTag.getInt("NetID")); - return new ChainLiftPackage(pos, item); + return new ChainConveyorPackage(pos, item, compoundTag.getInt("NetID")); + return new ChainConveyorPackage(pos, item); } - public ChainLiftPackagePhysicsData physicsData(LevelAccessor level) { + public ChainConveyorPackagePhysicsData physicsData(LevelAccessor level) { if (physicsData == null) { try { return physicsData = physicsDataCache.get(level) - .get(netId, () -> new ChainLiftPackagePhysicsData(worldPosition)); + .get(netId, () -> new ChainConveyorPackagePhysicsData(worldPosition)); } catch (ExecutionException e) { e.printStackTrace(); } diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftRenderer.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRenderer.java similarity index 85% rename from src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftRenderer.java rename to src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRenderer.java index d29df1efe7..49eaccb862 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftRenderer.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRenderer.java @@ -1,4 +1,4 @@ -package com.simibubi.create.content.kinetics.chainLift; +package com.simibubi.create.content.kinetics.chainConveyor; import java.util.List; import java.util.Map.Entry; @@ -11,8 +11,8 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.kinetics.base.KineticBlockEntityRenderer; -import com.simibubi.create.content.kinetics.chainLift.ChainLiftBlockEntity.ConnectionStats; -import com.simibubi.create.content.kinetics.chainLift.ChainLiftPackage.ChainLiftPackagePhysicsData; +import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorBlockEntity.ConnectionStats; +import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorPackage.ChainConveyorPackagePhysicsData; import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.foundation.render.RenderTypes; @@ -37,38 +37,38 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; import net.minecraftforge.registries.ForgeRegistries; -public class ChainLiftRenderer extends KineticBlockEntityRenderer { +public class ChainConveyorRenderer extends KineticBlockEntityRenderer { public static final ResourceLocation CHAIN_LOCATION = new ResourceLocation("textures/block/chain.png"); public static final int MIP_DISTANCE = 48; - public ChainLiftRenderer(Context context) { + public ChainConveyorRenderer(Context context) { super(context); } @Override - protected void renderSafe(ChainLiftBlockEntity be, float partialTicks, PoseStack ms, MultiBufferSource buffer, + protected void renderSafe(ChainConveyorBlockEntity be, float partialTicks, PoseStack ms, MultiBufferSource buffer, int light, int overlay) { super.renderSafe(be, partialTicks, ms, buffer, light, overlay); BlockPos pos = be.getBlockPos(); renderChains(be, ms, buffer, light, overlay); - for (ChainLiftPackage box : be.loopingPackages) + for (ChainConveyorPackage box : be.loopingPackages) renderBox(be, ms, buffer, overlay, pos, box, partialTicks); - for (Entry> entry : be.travellingPackages.entrySet()) - for (ChainLiftPackage box : entry.getValue()) + for (Entry> entry : be.travellingPackages.entrySet()) + for (ChainConveyorPackage box : entry.getValue()) renderBox(be, ms, buffer, overlay, pos, box, partialTicks); } - private void renderBox(ChainLiftBlockEntity be, PoseStack ms, MultiBufferSource buffer, int overlay, BlockPos pos, - ChainLiftPackage box, float partialTicks) { + private void renderBox(ChainConveyorBlockEntity be, PoseStack ms, MultiBufferSource buffer, int overlay, BlockPos pos, + ChainConveyorPackage box, float partialTicks) { if (box.worldPosition == null) return; if (box.item == null || box.item.isEmpty()) return; - ChainLiftPackagePhysicsData physicsData = box.physicsData(be.getLevel()); + ChainConveyorPackagePhysicsData physicsData = box.physicsData(be.getLevel()); if (physicsData.prevPos == null) return; @@ -123,7 +123,7 @@ public class ChainLiftRenderer extends KineticBlockEntityRenderer 3) { - ridingChainLift = null; + ridingChainConveyor = null; ridingConnection = null; return; } @@ -84,10 +84,10 @@ public class ChainLiftRidingHandler { .add(diff.scale(0.25))); if (AnimationTickHolder.getTicks() % 10 == 0) AllPackets.getChannel() - .sendToServer(new ChainLiftRidingPacket(ridingChainLift)); + .sendToServer(new ChainConveyorRidingPacket(ridingChainConveyor)); } - private static void updateTargetPosition(Minecraft mc, ChainLiftBlockEntity clbe) { + private static void updateTargetPosition(Minecraft mc, ChainConveyorBlockEntity clbe) { float serverSpeed = ServerSpeedProvider.get(); float speed = clbe.getSpeed() / 360f; float radius = 1.5f; @@ -99,7 +99,7 @@ public class ChainLiftRidingHandler { if (flipped != clbe.getSpeed() < 0) { flipped = clbe.getSpeed() < 0; - ridingChainLift = clbe.getBlockPos() + ridingChainConveyor = clbe.getBlockPos() .offset(ridingConnection); chainPosition = stats.chainLength() - chainPosition; ridingConnection = ridingConnection.multiply(-1); @@ -113,9 +113,9 @@ public class ChainLiftRidingHandler { // transfer to other if (mc.level.getBlockEntity(clbe.getBlockPos() - .offset(ridingConnection)) instanceof ChainLiftBlockEntity clbe2) { + .offset(ridingConnection)) instanceof ChainConveyorBlockEntity clbe2) { chainPosition = clbe.wrapAngle(stats.tangentAngle() + 180 + 2 * 35 * (clbe.reversed ? -1 : 1)); - ridingChainLift = clbe2.getBlockPos(); + ridingChainConveyor = clbe2.getBlockPos(); ridingConnection = null; } diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftRidingPacket.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRidingPacket.java similarity index 56% rename from src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftRidingPacket.java rename to src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRidingPacket.java index e42bd22029..b286ae1502 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainLift/ChainLiftRidingPacket.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRidingPacket.java @@ -1,4 +1,4 @@ -package com.simibubi.create.content.kinetics.chainLift; +package com.simibubi.create.content.kinetics.chainConveyor; import com.simibubi.create.foundation.networking.BlockEntityConfigurationPacket; @@ -6,13 +6,13 @@ import net.minecraft.core.BlockPos; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.level.ServerPlayer; -public class ChainLiftRidingPacket extends BlockEntityConfigurationPacket { +public class ChainConveyorRidingPacket extends BlockEntityConfigurationPacket { - public ChainLiftRidingPacket(BlockPos pos) { + public ChainConveyorRidingPacket(BlockPos pos) { super(pos); } - public ChainLiftRidingPacket(FriendlyByteBuf buffer) { + public ChainConveyorRidingPacket(FriendlyByteBuf buffer) { super(buffer); } @@ -23,10 +23,10 @@ public class ChainLiftRidingPacket extends BlockEntityConfigurationPacket new ChainLiftPortTarget(relativePos, 0, null); + case "ChainConveyor" -> new ChainConveyorPortTarget(relativePos, 0, null); default -> null; }; + + if (target == null) + return null; + target.readInternal(tag); return target; } @@ -69,33 +73,33 @@ public abstract class PackagePortTarget { return level.getBlockEntity(portPos.offset(relativePos)); } - public static class ChainLiftPortTarget extends PackagePortTarget { + public static class ChainConveyorPortTarget extends PackagePortTarget { public float chainPos; public BlockPos connection; public boolean flipped; - public ChainLiftPortTarget(BlockPos relativePos, float chainPos, @Nullable BlockPos connection) { - super("ChainLift", relativePos); + public ChainConveyorPortTarget(BlockPos relativePos, float chainPos, @Nullable BlockPos connection) { + super("ChainConveyor", relativePos); this.chainPos = chainPos; this.connection = connection; } @Override public void setup(PackagePortBlockEntity ppbe, LevelAccessor level, BlockPos portPos) { - if (be(level, portPos) instanceof ChainLiftBlockEntity clbe) + if (be(level, portPos) instanceof ChainConveyorBlockEntity clbe) flipped = clbe.getSpeed() < 0; } @Override public boolean export(LevelAccessor level, BlockPos portPos, ItemStack box, boolean simulate) { - if (!(be(level, portPos) instanceof ChainLiftBlockEntity clbe)) + if (!(be(level, portPos) instanceof ChainConveyorBlockEntity clbe)) return false; if (connection != null && !clbe.connections.contains(connection)) return false; if (simulate) return true; - ChainLiftPackage box2 = new ChainLiftPackage(chainPos, box.copy()); + ChainConveyorPackage box2 = new ChainConveyorPackage(chainPos, box.copy()); if (connection == null) return clbe.addLoopingPackage(box2); return clbe.addTravellingPackage(box2, connection); @@ -103,14 +107,14 @@ public abstract class PackagePortTarget { @Override public void register(PackagePortBlockEntity ppbe, LevelAccessor level, BlockPos portPos) { - if (!(be(level, portPos) instanceof ChainLiftBlockEntity clbe)) + if (!(be(level, portPos) instanceof ChainConveyorBlockEntity clbe)) return; - ChainLiftBlockEntity actualBe = clbe; + ChainConveyorBlockEntity actualBe = clbe; // Jump to opposite chain if motion reversed if (connection != null && clbe.getSpeed() < 0 != flipped) { deregister(ppbe, level, portPos); - actualBe = AllBlocks.CHAIN_LIFT.get() + actualBe = AllBlocks.CHAIN_CONVEYOR.get() .getBlockEntity(level, clbe.getBlockPos() .offset(connection)); if (actualBe == null) @@ -138,7 +142,7 @@ public abstract class PackagePortTarget { @Override public void deregister(PackagePortBlockEntity ppbe, LevelAccessor level, BlockPos portPos) { - if (!(be(level, portPos) instanceof ChainLiftBlockEntity clbe)) + if (!(be(level, portPos) instanceof ChainConveyorBlockEntity clbe)) return; clbe.loopPorts.remove(relativePos.multiply(-1)); clbe.travelPorts.remove(relativePos.multiply(-1)); @@ -170,7 +174,7 @@ public abstract class PackagePortTarget { @Override public Vec3 getExactTargetLocation(PackagePortBlockEntity ppbe, LevelAccessor level, BlockPos portPos) { - if (!(be(level, portPos) instanceof ChainLiftBlockEntity clbe)) + if (!(be(level, portPos) instanceof ChainConveyorBlockEntity clbe)) return Vec3.ZERO; return clbe.getPackagePosition(chainPos, connection); } diff --git a/src/main/java/com/simibubi/create/foundation/block/BigOutlines.java b/src/main/java/com/simibubi/create/foundation/block/BigOutlines.java index 47c1a7a9e0..fb6b002aa1 100644 --- a/src/main/java/com/simibubi/create/foundation/block/BigOutlines.java +++ b/src/main/java/com/simibubi/create/foundation/block/BigOutlines.java @@ -1,7 +1,7 @@ package com.simibubi.create.foundation.block; import com.simibubi.create.content.decoration.slidingDoor.SlidingDoorBlock; -import com.simibubi.create.content.kinetics.chainLift.ChainLiftBlock; +import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorBlock; import com.simibubi.create.content.trains.track.TrackBlock; import com.simibubi.create.foundation.utility.RaycastHelper; @@ -52,7 +52,7 @@ public class BigOutlines { // Could be a dedicated interface for big blocks if (!(block instanceof TrackBlock) && !(block instanceof SlidingDoorBlock) - && !(block instanceof ChainLiftBlock)) + && !(block instanceof ChainConveyorBlock)) continue; BlockHitResult hit = blockState.getInteractionShape(mc.level, p) diff --git a/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java b/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java index 05481992a8..0345c073c4 100644 --- a/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java @@ -29,8 +29,8 @@ import com.simibubi.create.content.equipment.zapper.ZapperItem; import com.simibubi.create.content.equipment.zapper.terrainzapper.WorldshaperRenderHandler; import com.simibubi.create.content.kinetics.KineticDebugger; import com.simibubi.create.content.kinetics.belt.item.BeltConnectorHandler; -import com.simibubi.create.content.kinetics.chainLift.ChainLiftInteractionHandler; -import com.simibubi.create.content.kinetics.chainLift.ChainLiftRidingHandler; +import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorInteractionHandler; +import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorRidingHandler; import com.simibubi.create.content.kinetics.fan.AirCurrent; import com.simibubi.create.content.kinetics.mechanicalArm.ArmInteractionPointHandler; import com.simibubi.create.content.kinetics.turntable.TurntableHandler; @@ -168,8 +168,8 @@ public class ClientEvents { CreateClient.VALUE_SETTINGS_HANDLER.tick(); ScrollValueHandler.tick(); NetheriteBacktankFirstPersonRenderer.clientTick(); - ChainLiftInteractionHandler.clientTick(); - ChainLiftRidingHandler.clientTick(); + ChainConveyorInteractionHandler.clientTick(); + ChainConveyorRidingHandler.clientTick(); } @SubscribeEvent diff --git a/src/main/java/com/simibubi/create/foundation/events/InputEvents.java b/src/main/java/com/simibubi/create/foundation/events/InputEvents.java index e1a967804c..541bc4fd0a 100644 --- a/src/main/java/com/simibubi/create/foundation/events/InputEvents.java +++ b/src/main/java/com/simibubi/create/foundation/events/InputEvents.java @@ -3,7 +3,7 @@ package com.simibubi.create.foundation.events; import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.elevator.ElevatorControlsHandler; import com.simibubi.create.content.equipment.toolbox.ToolboxHandlerClient; -import com.simibubi.create.content.kinetics.chainLift.ChainLiftInteractionHandler; +import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorInteractionHandler; import com.simibubi.create.content.redstone.link.controller.LinkedControllerClientHandler; import com.simibubi.create.content.trains.TrainHUD; import com.simibubi.create.content.trains.entity.TrainRelocator; @@ -88,7 +88,7 @@ public class InputEvents { LinkedControllerClientHandler.deactivateInLectern(); TrainRelocator.onClicked(event); - if (ChainLiftInteractionHandler.onUse()) + if (ChainConveyorInteractionHandler.onUse()) event.setCanceled(true); } diff --git a/src/main/java/com/simibubi/create/foundation/render/RenderTypes.java b/src/main/java/com/simibubi/create/foundation/render/RenderTypes.java index 990c82c60b..7b63a05160 100644 --- a/src/main/java/com/simibubi/create/foundation/render/RenderTypes.java +++ b/src/main/java/com/simibubi/create/foundation/render/RenderTypes.java @@ -68,7 +68,7 @@ public class RenderTypes extends RenderStateShard { } private static final Function CHAIN = Util.memoize((p_234330_) -> { - return RenderType.create("chain_lift_chain", DefaultVertexFormat.BLOCK, VertexFormat.Mode.QUADS, 256, false, + return RenderType.create("chain_conveyor_chain", DefaultVertexFormat.BLOCK, VertexFormat.Mode.QUADS, 256, false, true, RenderType.CompositeState.builder() .setShaderState(RENDERTYPE_CUTOUT_MIPPED_SHADER) .setTextureState(new RenderStateShard.TextureStateShard(p_234330_, false, true)) diff --git a/src/main/resources/assets/create/models/block/chain_conveyor/block.json b/src/main/resources/assets/create/models/block/chain_conveyor/block.json new file mode 100644 index 0000000000..07fa03a967 --- /dev/null +++ b/src/main/resources/assets/create/models/block/chain_conveyor/block.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/chain_conveyor/textures", + "loader": "forge:obj", + "flip_v": true, + "model": "create:models/block/chain_conveyor/conveyor_casing.obj" +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/chain_lift/conveyor_casing.mtl b/src/main/resources/assets/create/models/block/chain_conveyor/conveyor_casing.mtl similarity index 100% rename from src/main/resources/assets/create/models/block/chain_lift/conveyor_casing.mtl rename to src/main/resources/assets/create/models/block/chain_conveyor/conveyor_casing.mtl diff --git a/src/main/resources/assets/create/models/block/chain_lift/conveyor_casing.obj b/src/main/resources/assets/create/models/block/chain_conveyor/conveyor_casing.obj similarity index 100% rename from src/main/resources/assets/create/models/block/chain_lift/conveyor_casing.obj rename to src/main/resources/assets/create/models/block/chain_conveyor/conveyor_casing.obj diff --git a/src/main/resources/assets/create/models/block/chain_lift/conveyor_ports.mtl b/src/main/resources/assets/create/models/block/chain_conveyor/conveyor_ports.mtl similarity index 100% rename from src/main/resources/assets/create/models/block/chain_lift/conveyor_ports.mtl rename to src/main/resources/assets/create/models/block/chain_conveyor/conveyor_ports.mtl diff --git a/src/main/resources/assets/create/models/block/chain_lift/conveyor_ports.obj b/src/main/resources/assets/create/models/block/chain_conveyor/conveyor_ports.obj similarity index 100% rename from src/main/resources/assets/create/models/block/chain_lift/conveyor_ports.obj rename to src/main/resources/assets/create/models/block/chain_conveyor/conveyor_ports.obj diff --git a/src/main/resources/assets/create/models/block/chain_lift/conveyor_shaft.mtl b/src/main/resources/assets/create/models/block/chain_conveyor/conveyor_shaft.mtl similarity index 100% rename from src/main/resources/assets/create/models/block/chain_lift/conveyor_shaft.mtl rename to src/main/resources/assets/create/models/block/chain_conveyor/conveyor_shaft.mtl diff --git a/src/main/resources/assets/create/models/block/chain_lift/conveyor_shaft.obj b/src/main/resources/assets/create/models/block/chain_conveyor/conveyor_shaft.obj similarity index 100% rename from src/main/resources/assets/create/models/block/chain_lift/conveyor_shaft.obj rename to src/main/resources/assets/create/models/block/chain_conveyor/conveyor_shaft.obj diff --git a/src/main/resources/assets/create/models/block/chain_conveyor/guard.json b/src/main/resources/assets/create/models/block/chain_conveyor/guard.json new file mode 100644 index 0000000000..2a3f2b6492 --- /dev/null +++ b/src/main/resources/assets/create/models/block/chain_conveyor/guard.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/chain_conveyor/textures", + "loader": "forge:obj", + "flip_v": true, + "model": "create:models/block/chain_conveyor/conveyor_ports.obj" +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/chain_lift/item.json b/src/main/resources/assets/create/models/block/chain_conveyor/item.json similarity index 50% rename from src/main/resources/assets/create/models/block/chain_lift/item.json rename to src/main/resources/assets/create/models/block/chain_conveyor/item.json index 10b8a74483..20cb590207 100644 --- a/src/main/resources/assets/create/models/block/chain_lift/item.json +++ b/src/main/resources/assets/create/models/block/chain_conveyor/item.json @@ -1,13 +1,13 @@ { - "parent": "create:block/chain_lift/textures", + "parent": "create:block/chain_conveyor/textures", "loader": "forge:obj", "flip_v": true, - "model": "create:models/block/chain_lift/item.obj", + "model": "create:models/block/chain_conveyor/item.obj", "display": { "gui": { - "rotation": [ 30, 225, 0 ], - "translation": [ 0, 0, 0], - "scale":[ 0.5, 0.5, 0.5 ] + "rotation": [ 30, 45, 0 ], + "translation": [ -1, 0, 0], + "scale":[ 0.4, 0.4, 0.4 ] }, "fixed": { "rotation": [ 90, 0, 0 ], diff --git a/src/main/resources/assets/create/models/block/chain_lift/item.mtl b/src/main/resources/assets/create/models/block/chain_conveyor/item.mtl similarity index 100% rename from src/main/resources/assets/create/models/block/chain_lift/item.mtl rename to src/main/resources/assets/create/models/block/chain_conveyor/item.mtl diff --git a/src/main/resources/assets/create/models/block/chain_lift/item.obj b/src/main/resources/assets/create/models/block/chain_conveyor/item.obj similarity index 100% rename from src/main/resources/assets/create/models/block/chain_lift/item.obj rename to src/main/resources/assets/create/models/block/chain_conveyor/item.obj diff --git a/src/main/resources/assets/create/models/block/chain_conveyor/shaft.json b/src/main/resources/assets/create/models/block/chain_conveyor/shaft.json new file mode 100644 index 0000000000..a0a601bb80 --- /dev/null +++ b/src/main/resources/assets/create/models/block/chain_conveyor/shaft.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/chain_conveyor/textures", + "loader": "forge:obj", + "flip_v": true, + "model": "create:models/block/chain_conveyor/conveyor_shaft.obj" +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/chain_lift/textures.json b/src/main/resources/assets/create/models/block/chain_conveyor/textures.json similarity index 100% rename from src/main/resources/assets/create/models/block/chain_lift/textures.json rename to src/main/resources/assets/create/models/block/chain_conveyor/textures.json diff --git a/src/main/resources/assets/create/models/block/chain_lift/block.json b/src/main/resources/assets/create/models/block/chain_lift/block.json deleted file mode 100644 index b53996608b..0000000000 --- a/src/main/resources/assets/create/models/block/chain_lift/block.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/chain_lift/textures", - "loader": "forge:obj", - "flip_v": true, - "model": "create:models/block/chain_lift/conveyor_casing.obj" -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/chain_lift/guard.json b/src/main/resources/assets/create/models/block/chain_lift/guard.json deleted file mode 100644 index b3c7a4c3e4..0000000000 --- a/src/main/resources/assets/create/models/block/chain_lift/guard.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/chain_lift/textures", - "loader": "forge:obj", - "flip_v": true, - "model": "create:models/block/chain_lift/conveyor_ports.obj" -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/chain_lift/shaft.json b/src/main/resources/assets/create/models/block/chain_lift/shaft.json deleted file mode 100644 index 2319b59ca1..0000000000 --- a/src/main/resources/assets/create/models/block/chain_lift/shaft.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/chain_lift/textures", - "loader": "forge:obj", - "flip_v": true, - "model": "create:models/block/chain_lift/conveyor_shaft.obj" -} \ No newline at end of file From 073e9579d2a2a2c97a93300760e0b28086f54b2b Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Sat, 29 Jun 2024 15:18:52 +0200 Subject: [PATCH 035/515] Can it frog - Placement restrictions, chain costs - Chain conveyor general polish --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 6 +- .../resources/assets/create/lang/en_ud.json | 14 ++ .../resources/assets/create/lang/en_us.json | 14 ++ .../java/com/simibubi/create/AllShapes.java | 10 +- .../blueprint/BlueprintOverlayRenderer.java | 34 ++- .../chainConveyor/ChainConveyorBlock.java | 76 ++++++- .../ChainConveyorBlockEntity.java | 203 +++++++++++++++-- .../ChainConveyorConnectionHandler.java | 215 ++++++++++++++++-- .../ChainConveyorConnectionPacket.java | 43 +++- .../ChainConveyorInteractionHandler.java | 62 ++++- .../ChainConveyorRidingHandler.java | 18 +- .../chainConveyor/ChainConveyorShape.java | 76 ++++--- .../packagePort/PackagePortBlockEntity.java | 37 ++- .../PackagePortPlacementPacket.java | 8 + .../packagePort/PackagePortRenderer.java | 37 ++- .../packagePort/PackagePortTarget.java | 12 +- .../PackagePortTargetSelectionHandler.java | 101 +++++++- .../create/foundation/block/BigOutlines.java | 2 +- .../foundation/events/ClientEvents.java | 6 +- .../infrastructure/config/CKinetics.java | 4 + .../infrastructure/config/CLogistics.java | 4 + .../assets/create/lang/default/interface.json | 16 ++ 22 files changed, 888 insertions(+), 110 deletions(-) diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index c42be01984..59ec042622 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-06-20T14:09:01.5542264 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-06-29T15:11:09.8697391 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -591,8 +591,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -5ebc4aaf865dc3a0435d7f4ca5f8b9f391a079a5 assets/create/lang/en_ud.json -73a9325cbf84d8d7c74c9fab568691fd90fbeebc assets/create/lang/en_us.json +9d34b0928f515132c80fa9119198be9ef5c16fc8 assets/create/lang/en_ud.json +5203b3702a70c2c3424bf7e43a7fa01ed759efaf assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 636fdef570..0b415a6ced 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -859,6 +859,17 @@ "create.boiler.water": "ɹǝʇɐM", "create.boiler.water_dots": " ˙˙˙", "create.boiler.water_input_rate": "ǝʇɐɹ ʇnduı ɹǝʇɐM", + "create.chain_conveyor.already_connected": "pǝʇɔǝuuoɔ ʎpɐǝɹןɐ ǝɹɐ sɹoʎǝʌuoƆ", + "create.chain_conveyor.blocks_invalid": "ʇǝsǝɹ oʇ ʞɔıןɔ-ʞɐǝuS 'pıןɐʌuı sʞɔoןq ɹoʎǝʌuoƆ", + "create.chain_conveyor.cannot_add_more_connections": "ɹoʎǝʌuoƆ sıɥʇ oʇ suoıʇɔǝuuoɔ ǝɹoɯ ppɐ ʇouuɐƆ", + "create.chain_conveyor.cannot_connect_vertically": "ʎןןɐɔıʇɹǝʌ ʇɔǝuuoɔ ʇouuɐƆ", + "create.chain_conveyor.not_enough_chains": "suıɐɥɔ ɥbnouǝ buıpןoɥ ʇoN", + "create.chain_conveyor.select_second": "ʇɔǝuuoɔ oʇ ɹoʎǝʌuoɔ puoɔǝs ɐ ʇɔǝןǝS", + "create.chain_conveyor.selection_cleared": "pǝɹɐǝןƆ uoıʇɔǝןǝS", + "create.chain_conveyor.too_close": "ɹǝɥʇǝboʇ ǝsoןɔ oo⟘", + "create.chain_conveyor.too_far": "ʇɹɐdɐ ɹɐɟ oo⟘", + "create.chain_conveyor.too_steep": "dǝǝʇs ooʇ ǝdoןS", + "create.chain_conveyor.valid_connection": "✔ ʇɔǝuuoƆ uɐƆ", "create.clipboard.actions": "suoıʇɔⱯ pɹɐoqdıןƆ", "create.clipboard.copied_from": "%1$s ɯoɹɟ sbuıʇʇǝs buıʎdoƆ", "create.clipboard.pasted_to": "%1$s oʇ sbuıʇʇǝs pǝıןddⱯ", @@ -1357,6 +1368,9 @@ "create.orientation.diagonal": "ןɐuobɐıᗡ", "create.orientation.horizontal": "ןɐʇuozıɹoH", "create.orientation.orthogonal": "ןɐuoboɥʇɹO", + "create.package_port.cannot_reach_down": "pɹɐʍuʍop ʇɔǝuuoɔ ʇouuɐƆ", + "create.package_port.too_far": "ʎɐʍɐ ɹɐɟ oo⟘", + "create.package_port.valid": "✔ ʇɔǝuuoƆ uɐƆ", "create.packager_link.clear": "uoıʇɔǝןǝs pǝɹɐǝןƆ", "create.packager_link.invalid": "buıɔɐןd ǝɹoɟǝq ɹǝʇsıbǝᴚ ɥsɐƆ ɹo ɹǝʞɔı⟘ ʞɔoʇS ɐ ubıssⱯ", "create.packager_link.set": "pǝʇɔǝןǝs uoıʇɐʇsʞɹoʍ pǝʇǝbɹɐ⟘", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index bfa9c0d719..808c104781 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -859,6 +859,17 @@ "create.boiler.water": "Water", "create.boiler.water_dots": "... ", "create.boiler.water_input_rate": "Water input rate", + "create.chain_conveyor.already_connected": "Conveyors are already connected", + "create.chain_conveyor.blocks_invalid": "Conveyor blocks invalid, Sneak-click to reset", + "create.chain_conveyor.cannot_add_more_connections": "Cannot add more connections to this Conveyor", + "create.chain_conveyor.cannot_connect_vertically": "Cannot connect vertically", + "create.chain_conveyor.not_enough_chains": "Not holding enough chains", + "create.chain_conveyor.select_second": "Select a second conveyor to connect", + "create.chain_conveyor.selection_cleared": "Selection Cleared", + "create.chain_conveyor.too_close": "Too close together", + "create.chain_conveyor.too_far": "Too far apart", + "create.chain_conveyor.too_steep": "Slope too steep", + "create.chain_conveyor.valid_connection": "Can Connect ✔", "create.clipboard.actions": "Clipboard Actions", "create.clipboard.copied_from": "Copying settings from %1$s", "create.clipboard.pasted_to": "Applied settings to %1$s", @@ -1357,6 +1368,9 @@ "create.orientation.diagonal": "Diagonal", "create.orientation.horizontal": "Horizontal", "create.orientation.orthogonal": "Orthogonal", + "create.package_port.cannot_reach_down": "Cannot connect downward", + "create.package_port.too_far": "Too far away", + "create.package_port.valid": "Can Connect ✔", "create.packager_link.clear": "Cleared selection", "create.packager_link.invalid": "Assign a Stock Ticker or Cash Register before placing", "create.packager_link.set": "Targeted workstation selected", diff --git a/src/main/java/com/simibubi/create/AllShapes.java b/src/main/java/com/simibubi/create/AllShapes.java index 34c9e4f7bc..841f450d9e 100644 --- a/src/main/java/com/simibubi/create/AllShapes.java +++ b/src/main/java/com/simibubi/create/AllShapes.java @@ -216,8 +216,14 @@ public class AllShapes { .build(), TRACK_COLLISION = shape(0, 0, 0, 16, 2, 16).build(), - - PACKAGE_PORT = shape(0, 0, 0, 16, 4, 16).add(2, 2, 2, 14, 14, 14).build(), + + PACKAGE_PORT = shape(0, 0, 0, 16, 4, 16).add(2, 2, 2, 14, 14, 14) + .build(), + + CHAIN_CONVEYOR_INTERACTION = shape(-10, 2, 0, 26, 14, 16).add(0, 2, -10, 16, 14, 26) + .add(-5, 2, -5, 21, 14, 21) + .add(Shapes.block()) + .build(), TRACK_FALLBACK = shape(0, 0, 0, 16, 4, 16).build(), diff --git a/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintOverlayRenderer.java b/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintOverlayRenderer.java index 8c2c6fc01b..d858fc0453 100644 --- a/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintOverlayRenderer.java +++ b/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintOverlayRenderer.java @@ -99,15 +99,12 @@ public class BlueprintOverlayRenderer { public static void displayTrackRequirements(PlacementInfo info, ItemStack pavementItem) { if (active) return; - - active = true; - empty = false; - noOutput = true; - ingredients.clear(); + prepareCustomOverlay(); int tracks = info.requiredTracks; while (tracks > 0) { - ingredients.add(Pair.of(new ItemStack(info.trackMaterial.getBlock(), Math.min(64, tracks)), info.hasRequiredTracks)); + ingredients.add( + Pair.of(new ItemStack(info.trackMaterial.getBlock(), Math.min(64, tracks)), info.hasRequiredTracks)); tracks -= 64; } @@ -119,6 +116,25 @@ public class BlueprintOverlayRenderer { } } + private static void prepareCustomOverlay() { + active = true; + empty = false; + noOutput = true; + ingredients.clear(); + } + + public static void displayChainRequirements(Item chainItem, int count, boolean fulfilled) { + if (active) + return; + prepareCustomOverlay(); + + int chains = count; + while (chains > 0) { + ingredients.add(Pair.of(new ItemStack(chainItem, Math.min(64, chains)), fulfilled)); + chains -= 64; + } + } + public static void rebuild(BlueprintSection sectionAt, boolean sneak) { cachedRenderedFilters.clear(); ItemStackHandler items = sectionAt.getItems(); @@ -240,8 +256,7 @@ public class BlueprintOverlayRenderer { } } - public static void renderOverlay(ForgeGui gui, GuiGraphics graphics, float partialTicks, int width, - int height) { + public static void renderOverlay(ForgeGui gui, GuiGraphics graphics, float partialTicks, int width, int height) { Minecraft mc = Minecraft.getInstance(); if (mc.options.hideGui) return; @@ -287,7 +302,8 @@ public class BlueprintOverlayRenderer { RenderSystem.disableBlend(); } - public static void drawItemStack(GuiGraphics graphics, Minecraft mc, int x, int y, ItemStack itemStack, String count) { + public static void drawItemStack(GuiGraphics graphics, Minecraft mc, int x, int y, ItemStack itemStack, + String count) { if (itemStack.getItem() instanceof FilterItem) { int step = LevelTickHolder.getTicks(mc.level) / 10; ItemStack[] itemsMatchingFilter = getItemsMatchingFilter(itemStack); diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlock.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlock.java index abfda7d275..a21f27a781 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlock.java @@ -1,6 +1,7 @@ package com.simibubi.create.content.kinetics.chainConveyor; import com.simibubi.create.AllBlockEntityTypes; +import com.simibubi.create.AllShapes; import com.simibubi.create.content.kinetics.base.KineticBlock; import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.foundation.block.IBE; @@ -14,12 +15,19 @@ import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.Vec3; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; public class ChainConveyorBlock extends KineticBlock implements IBE { @@ -32,12 +40,74 @@ public class ChainConveyorBlock extends KineticBlock implements IBE be.cancelDrops = true); + } + + @Override + public InteractionResult onSneakWrenched(BlockState state, UseOnContext context) { + Player player = context.getPlayer(); + if (player == null) + return super.onSneakWrenched(state, context); + + withBlockEntityDo(context.getLevel(), context.getClickedPos(), be -> { + be.cancelDrops = true; + if (player.isCreative()) + return; + for (BlockPos targetPos : be.connections) { + int chainCost = ChainConveyorBlockEntity.getChainCost(targetPos); + while (chainCost > 0) { + player.getInventory() + .placeItemBackInInventory(new ItemStack(Items.CHAIN, Math.min(chainCost, 64))); + chainCost -= 64; + } + } + }); + + return super.onSneakWrenched(state, context); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext pContext) { + for (int x = -1; x <= 1; x++) + for (int z = -1; z <= 1; z++) + if (pContext.getLevel() + .getBlockState(pContext.getClickedPos() + .offset(x, 0, z)) + .getBlock() == this) + return null; + + return super.getStateForPlacement(pContext); + } + + @Override + public VoxelShape getCollisionShape(BlockState pState, BlockGetter pLevel, BlockPos pPos, + CollisionContext pContext) { + return Shapes.block(); + } + @Override public InteractionResult use(BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, BlockHitResult pHit) { ItemStack itemInHand = pPlayer.getItemInHand(pHand); if (!(itemInHand.getItem() instanceof PackageItem) && !itemInHand.isEmpty()) - return InteractionResult.PASS; + return InteractionResult.CONSUME; if (pLevel.isClientSide()) return InteractionResult.CONSUME; @@ -69,6 +139,8 @@ public class ChainConveyorBlock extends KineticBlock implements IBE { + if (!be.canAcceptMorePackages()) + return; be.addLoopingPackage(new ChainConveyorPackage(angle, itemInHand.copyWithCount(1))); itemInHand.shrink(1); if (itemInHand.isEmpty()) @@ -82,7 +154,7 @@ public class ChainConveyorBlock extends KineticBlock implements IBE> travellingPackages = new HashMap<>(); public boolean reversed; + public boolean cancelDrops; + + BlockPos chainDestroyedEffectToSend; public ChainConveyorBlockEntity(BlockEntityType typeIn, BlockPos pos, BlockState state) { super(typeIn, pos, state); @@ -72,10 +88,19 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity { updateChainShapes(); } + public boolean canAcceptMorePackages() { + return loopingPackages.size() + travellingPackages.size() < AllConfigs.server().logistics.chainConveyorCapacity + .get(); + } + + public boolean canAcceptMorePackagesFromOtherConveyor() { + return loopingPackages.size() < AllConfigs.server().logistics.chainConveyorCapacity.get(); + } + @Override public boolean addToTooltip(List tooltip, boolean isPlayerSneaking) { return super.addToTooltip(tooltip, isPlayerSneaking); - + // // debug routing info // tooltip.addAll(routingTable.createSummary()); // if (!loopPorts.isEmpty()) @@ -150,11 +175,15 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity { Travelling: for (Iterator iterator = entry.getValue() .iterator(); iterator.hasNext();) { ChainConveyorPackage box = iterator.next(); + box.justFlipped = false; float prevChainPosition = box.chainPosition; box.chainPosition += serverSpeed * distancePerTick; box.chainPosition = Math.min(stats.chainLength, box.chainPosition); - box.justFlipped = false; + + float anticipatePosition = box.chainPosition; + anticipatePosition += serverSpeed * distancePerTick * 4; + anticipatePosition = Math.min(stats.chainLength, anticipatePosition); if (level.isClientSide()) continue; @@ -163,10 +192,18 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity { ConnectedPort port = portEntry.getValue(); float chainPosition = port.chainPosition(); - if (prevChainPosition > chainPosition || box.chainPosition < chainPosition) + if (prevChainPosition > chainPosition) + continue; + boolean notAtPositionYet = box.chainPosition < chainPosition; + if (notAtPositionYet && anticipatePosition < chainPosition) continue; if (!PackageItem.matchAddress(box.item, port.filter())) continue; + if (notAtPositionYet) { + notifyPortToAnticipate(portEntry.getKey()); + continue; + } + if (!exportToPort(box, portEntry.getKey())) continue; @@ -190,11 +227,15 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity { Looping: for (Iterator iterator = loopingPackages.iterator(); iterator.hasNext();) { ChainConveyorPackage box = iterator.next(); + box.justFlipped = false; float prevChainPosition = box.chainPosition; box.chainPosition += serverSpeed * degreesPerTick; box.chainPosition = wrapAngle(box.chainPosition); - box.justFlipped = false; + + float anticipatePosition = box.chainPosition; + anticipatePosition += serverSpeed * degreesPerTick * 4; + anticipatePosition = wrapAngle(anticipatePosition); if (level.isClientSide()) continue; @@ -203,10 +244,16 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity { ConnectedPort port = portEntry.getValue(); float offBranchAngle = port.chainPosition(); - if (!loopThresholdCrossed(box.chainPosition, prevChainPosition, offBranchAngle)) + boolean notAtPositionYet = !loopThresholdCrossed(box.chainPosition, prevChainPosition, offBranchAngle); + if (notAtPositionYet && !loopThresholdCrossed(anticipatePosition, prevChainPosition, offBranchAngle)) continue; if (!PackageItem.matchAddress(box.item, port.filter())) continue; + if (notAtPositionYet) { + notifyPortToAnticipate(portEntry.getKey()); + continue; + } + if (!exportToPort(box, portEntry.getKey())) continue; @@ -216,6 +263,10 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity { } for (BlockPos connection : connections) { + if (level.getBlockEntity(worldPosition.offset(connection)) instanceof ChainConveyorBlockEntity ccbe + && !ccbe.canAcceptMorePackagesFromOtherConveyor()) + continue; + float offBranchAngle = connectionStats.get(connection).tangentAngle; if (!loopThresholdCrossed(box.chainPosition, prevChainPosition, offBranchAngle)) @@ -255,6 +306,11 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity { return true; } + private void notifyPortToAnticipate(BlockPos offset) { + if (level.getBlockEntity(worldPosition.offset(offset)) instanceof PackagePortBlockEntity ppbe) + ppbe.sendAnticipate(); + } + public boolean addTravellingPackage(ChainConveyorPackage box, BlockPos connection) { if (!connections.contains(connection)) return false; @@ -393,6 +449,24 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity { return added; } + public void chainDestroyed(BlockPos target, boolean spawnDrops, boolean sendEffect) { + int chainCount = getChainCost(target); + if (sendEffect) { + chainDestroyedEffectToSend = target; + sendData(); + } + if (!spawnDrops) + return; + + if (!forPointsAlongChains(target, chainCount, + vec -> level.addFreshEntity(new ItemEntity(level, vec.x, vec.y, vec.z, new ItemStack(Items.CHAIN))))) { + while (chainCount > 0) { + Block.popResource(level, worldPosition, new ItemStack(Blocks.CHAIN.asItem(), Math.min(chainCount, 64))); + chainCount -= 64; + } + } + } + public boolean removeConnectionTo(BlockPos target) { BlockPos localTarget = target.subtract(worldPosition); boolean removed = connections.remove(localTarget); @@ -425,22 +499,37 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity { Vec3 localEnd = stats.end.subtract(Vec3.atLowerCornerOf(worldPosition)); shapes.add(new ChainConveyorOBB(target, localStart, localEnd)); } - ChainConveyorInteractionHandler.loadedChains.get(level) - .put(worldPosition, shapes); + + if (level != null && level.isClientSide()) + ChainConveyorInteractionHandler.loadedChains.get(level) + .put(worldPosition, shapes); + } + + @Override + public void remove() { + super.remove(); + if (level == null || !level.isClientSide()) + return; + for (BlockPos blockPos : connections) + spawnDestroyParticles(blockPos); + } + + private void spawnDestroyParticles(BlockPos blockPos) { + forPointsAlongChains(blockPos, (int) Math.round(Vec3.atLowerCornerOf(blockPos) + .length() * 8), + vec -> level.addParticle(new BlockParticleOption(ParticleTypes.BLOCK, Blocks.CHAIN.defaultBlockState()), + vec.x, vec.y, vec.z, 0, 0, 0)); } @Override public void destroy() { super.destroy(); - ChainConveyorInteractionHandler.loadedChains.get(level) - .invalidate(worldPosition); - if (level.isClientSide()) - return; - - for (BlockPos blockPos : connections) + for (BlockPos blockPos : connections) { + chainDestroyed(blockPos, !cancelDrops, false); if (level.getBlockEntity(worldPosition.offset(blockPos)) instanceof ChainConveyorBlockEntity clbe) clbe.removeConnectionTo(worldPosition); + } for (ChainConveyorPackage box : loopingPackages) drop(box); @@ -449,6 +538,39 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity { drop(box); } + public boolean forPointsAlongChains(BlockPos connection, int positions, Consumer callback) { + prepareStats(); + ConnectionStats stats = connectionStats.get(connection); + if (stats == null) + return false; + + Vec3 start = stats.start; + Vec3 direction = stats.end.subtract(start); + Vec3 origin = Vec3.atCenterOf(worldPosition); + Vec3 normal = direction.cross(new Vec3(0, 1, 0)) + .normalize(); + Vec3 offset = start.subtract(origin); + Vec3 start2 = origin.add(offset.add(normal.scale(-2 * normal.dot(offset)))); + + for (boolean firstChain : Iterate.trueAndFalse) { + int steps = positions / 2; + if (firstChain) + steps += positions % 2; + for (int i = 0; i < steps; i++) + callback.accept((firstChain ? start : start2).add(direction.scale((0.5 + i) / steps))); + } + + return true; + } + + @Override + public void invalidate() { + super.invalidate(); + if (level != null && level.isClientSide()) + ChainConveyorInteractionHandler.loadedChains.get(level) + .invalidate(worldPosition); + } + private void drop(ChainConveyorPackage box) { level.addFreshEntity(PackageEntity.fromItemStack(level, box.worldPosition.subtract(0, 0.5, 0), box.item)); } @@ -474,6 +596,11 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity { @Override protected void write(CompoundTag compound, boolean clientPacket) { super.write(compound, clientPacket); + if (clientPacket && chainDestroyedEffectToSend != null) { + compound.put("DestroyEffect", NbtUtils.writeBlockPos(chainDestroyedEffectToSend)); + chainDestroyedEffectToSend = null; + } + compound.put("Connections", NBTHelper.writeCompoundList(connections, NbtUtils::writeBlockPos)); compound.put("TravellingPackages", NBTHelper.writeCompoundList(travellingPackages.entrySet(), entry -> { CompoundTag compoundTag = new CompoundTag(); @@ -489,6 +616,9 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity { @Override protected void read(CompoundTag compound, boolean clientPacket) { super.read(compound, clientPacket); + if (clientPacket && compound.contains("DestroyEffect") && level != null) + spawnDestroyParticles(NbtUtils.readBlockPos(compound.getCompound("DestroyEffect"))); + connections.clear(); NBTHelper.iterateCompoundList(compound.getList("Connections", Tag.TAG_COMPOUND), c -> connections.add(NbtUtils.readBlockPos(c))); @@ -510,6 +640,51 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity { return angle; } + public static int getChainCost(BlockPos connection) { + return (int) Math.max(Math.round(Vec3.atLowerCornerOf(connection) + .length() / 1.25), 1); + } + + public static boolean getChainsFromInventory(Player player, ItemStack chain, int cost, boolean simulate) { + int found = 0; + + Inventory inv = player.getInventory(); + int size = inv.items.size(); + for (int j = 0; j <= size + 1; j++) { + int i = j; + boolean offhand = j == size + 1; + if (j == size) + i = inv.selected; + else if (offhand) + i = 0; + else if (j == inv.selected) + continue; + + ItemStack stackInSlot = (offhand ? inv.offhand : inv.items).get(i); + if (!stackInSlot.is(chain.getItem())) + continue; + if (found >= cost) + continue; + + int count = stackInSlot.getCount(); + + if (!simulate) { + int remainingItems = count - Math.min(cost - found, count); + if (i == inv.selected) + stackInSlot.setTag(null); + ItemStack newItem = ItemHandlerHelper.copyStackWithSize(stackInSlot, remainingItems); + if (offhand) + player.setItemInHand(InteractionHand.OFF_HAND, newItem); + else + inv.setItem(i, newItem); + } + + found += count; + } + + return found >= cost; + } + public List getLoopingPackages() { return loopingPackages; } diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorConnectionHandler.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorConnectionHandler.java index 7807a41b5e..a3c457eb46 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorConnectionHandler.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorConnectionHandler.java @@ -2,16 +2,35 @@ package com.simibubi.create.content.kinetics.chainConveyor; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllPackets; +import com.simibubi.create.AllSoundEvents; +import com.simibubi.create.content.equipment.blueprint.BlueprintOverlayRenderer; import com.simibubi.create.foundation.utility.CreateLang; +import com.simibubi.create.infrastructure.config.AllConfigs; +import net.createmod.catnip.CatnipClient; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.VecHelper; +import net.minecraft.ChatFormatting; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction.Axis; import net.minecraft.resources.ResourceKey; +import net.minecraft.sounds.SoundSource; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.HitResult; +import net.minecraft.world.phys.HitResult.Type; +import net.minecraft.world.phys.Vec3; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.common.util.FakePlayer; import net.minecraftforge.event.entity.player.PlayerInteractEvent; @@ -34,7 +53,7 @@ public class ChainConveyorConnectionHandler { if (!AllBlocks.CHAIN_CONVEYOR.has(blockState)) return; - if (!itemStack.is(Items.CHAIN)) // Replace with tag? generic renderer? + if (!isChain(itemStack)) return; if (!player.mayBuild() || player instanceof FakePlayer) return; @@ -44,35 +63,201 @@ public class ChainConveyorConnectionHandler { if (!level.isClientSide()) return; - - if (firstPos == null || firstDim != level.dimension()) { - firstPos = pos; - firstDim = level.dimension(); - CreateLang.text("First position selected") // TODO localisation entry + if (level.getBlockEntity(pos) instanceof ChainConveyorBlockEntity ccbe + && ccbe.connections.size() >= AllConfigs.server().kinetics.maxChainConveyorConnections.get()) { + CreateLang.translate("chain_conveyor.cannot_add_more_connections") + .style(ChatFormatting.RED) .sendStatus(player); return; } - // TODO max distance config + if (firstPos == null || firstDim != level.dimension()) { + firstPos = pos; + firstDim = level.dimension(); + player.swing(event.getHand()); + return; + } + + boolean success = validateAndConnect(level, pos, player, itemStack, false); + firstPos = null; + + if (!success) { + AllSoundEvents.DENY.play(level, player, pos); + return; + } + + SoundType soundtype = Blocks.CHAIN.defaultBlockState() + .getSoundType(); + if (soundtype != null) + level.playSound(player, pos, soundtype.getPlaceSound(), SoundSource.BLOCKS, + (soundtype.getVolume() + 1.0F) / 2.0F, soundtype.getPitch() * 0.8F); + } + + private static boolean isChain(ItemStack itemStack) { + return itemStack.is(Items.CHAIN); // Replace with tag? generic renderer? + } + + public static void clientTick() { + if (firstPos == null) + return; + + LocalPlayer player = Minecraft.getInstance().player; + BlockEntity sourceLift = player.level() + .getBlockEntity(firstPos); + + if (firstDim != player.level() + .dimension() || !(sourceLift instanceof ChainConveyorBlockEntity)) { + firstPos = null; + CreateLang.translate("chain_conveyor.selection_cleared") + .sendStatus(player); + return; + } + + ItemStack stack = player.getMainHandItem(); + HitResult hitResult = Minecraft.getInstance().hitResult; + + if (!isChain(stack)) { + stack = player.getOffhandItem(); + if (!isChain(stack)) + return; + } + + if (hitResult == null || hitResult.getType() != Type.BLOCK) { + highlightConveyor(firstPos, 0xFFFFFF, "chain_connect"); + return; + } + + Level level = player.level(); + BlockHitResult bhr = (BlockHitResult) hitResult; + BlockPos pos = bhr.getBlockPos(); + BlockState hitState = level.getBlockState(pos); + + if (pos.equals(firstPos)) { + highlightConveyor(firstPos, 0xFFFFFF, "chain_connect"); + CreateLang.translate("chain_conveyor.select_second") + .sendStatus(player); + return; + } + + if (!(hitState.getBlock() instanceof ChainConveyorBlock)) { + highlightConveyor(firstPos, 0xFFFFFF, "chain_connect"); + return; + } + + boolean success = validateAndConnect(level, pos, player, stack, true); + + if (success) + CreateLang.translate("chain_conveyor.valid_connection") + .style(ChatFormatting.GREEN) + .sendStatus(player); + + int color = success ? 0x95CD41 : 0xEA5C2B; + + highlightConveyor(firstPos, color, "chain_connect"); + highlightConveyor(pos, color, "chain_connect_to"); + + Vec3 from = Vec3.atCenterOf(pos); + Vec3 to = Vec3.atCenterOf(firstPos); + Vec3 diff = from.subtract(to); + + if (diff.length() < 1) + return; + + from = from.subtract(diff.normalize() + .scale(.5)); + to = to.add(diff.normalize() + .scale(.5)); + + Vec3 normal = diff.cross(new Vec3(0, 1, 0)) + .normalize() + .scale(.875); + + CatnipClient.OUTLINER.showLine("chain_connect_line", from.add(normal), to.add(normal)) + .lineWidth(1 / 16f) + .colored(color); + CatnipClient.OUTLINER.showLine("chain_connect_line_1", from.subtract(normal), to.subtract(normal)) + .lineWidth(1 / 16f) + .colored(color); + + } + + private static void highlightConveyor(BlockPos pos, int color, String key) { + for (int y : Iterate.zeroAndOne) { + Vec3 prevV = VecHelper.rotate(new Vec3(0, .125 + y * .75, 1.25), -22.5, Axis.Y) + .add(Vec3.atBottomCenterOf(pos)); + for (int i = 0; i < 8; i++) { + Vec3 v = VecHelper.rotate(new Vec3(0, .125 + y * .75, 1.25), 22.5 + i * 45, Axis.Y) + .add(Vec3.atBottomCenterOf(pos)); + CatnipClient.OUTLINER.showLine(key + y + i, prevV, v) + .lineWidth(1 / 16f) + .colored(color); + prevV = v; + } + } + } + + public static boolean validateAndConnect(LevelAccessor level, BlockPos pos, Player player, ItemStack chain, + boolean simulate) { + if (!simulate && player.isShiftKeyDown()) { + CreateLang.translate("chain_conveyor.selection_cleared") + .sendStatus(player); + return false; + } + + if (pos.equals(firstPos)) + return false; + if (!pos.closerThan(firstPos, AllConfigs.server().kinetics.maxChainConveyorLength.get())) + return fail("chain_conveyor.too_far"); + if (pos.closerThan(firstPos, 2.5)) + return fail("chain_conveyor.too_close"); + + Vec3 diff = Vec3.atLowerCornerOf(pos.subtract(firstPos)); + double horizontalDistance = diff.multiply(1, 0, 1) + .length() - 1.5; + + if (horizontalDistance <= 0) + return fail("chain_conveyor.cannot_connect_vertically"); + if (Math.abs(diff.y) / horizontalDistance > 1) + return fail("chain_conveyor.too_steep"); ChainConveyorBlock chainConveyorBlock = AllBlocks.CHAIN_CONVEYOR.get(); ChainConveyorBlockEntity sourceLift = chainConveyorBlock.getBlockEntity(level, firstPos); ChainConveyorBlockEntity targetLift = chainConveyorBlock.getBlockEntity(level, pos); - if (sourceLift == null || targetLift == null) { - firstPos = null; - CreateLang.text("Connection failed") // TODO localisation entry - .sendStatus(player); - return; + if (targetLift.connections.size() >= AllConfigs.server().kinetics.maxChainConveyorConnections.get()) + return fail("chain_conveyor.cannot_add_more_connections"); + if (targetLift.connections.contains(firstPos.subtract(pos))) + return fail("chain_conveyor.already_connected"); + if (sourceLift == null || targetLift == null) + return fail("chain_conveyor.blocks_invalid"); + + if (!player.isCreative()) { + int chainCost = ChainConveyorBlockEntity.getChainCost(pos.subtract(firstPos)); + boolean hasEnough = ChainConveyorBlockEntity.getChainsFromInventory(player, chain, chainCost, true); + if (simulate) + BlueprintOverlayRenderer.displayChainRequirements(chain.getItem(), chainCost, hasEnough); + if (!hasEnough) + return fail("chain_conveyor.not_enough_chains"); } - AllPackets.getChannel() - .sendToServer(new ChainConveyorConnectionPacket(firstPos, pos, true)); + if (simulate) + return true; - CreateLang.text("Chain added") // TODO localisation entry + AllPackets.getChannel() + .sendToServer(new ChainConveyorConnectionPacket(firstPos, pos, chain, true)); + + CreateLang.text("") // Clear status message .sendStatus(player); firstPos = null; firstDim = null; + return true; + } + + private static boolean fail(String message) { + CreateLang.translate(message) + .style(ChatFormatting.RED) + .sendStatus(Minecraft.getInstance().player); + return false; } } diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorConnectionPacket.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorConnectionPacket.java index a5f7a82b2b..ee9910e796 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorConnectionPacket.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorConnectionPacket.java @@ -1,18 +1,24 @@ package com.simibubi.create.content.kinetics.chainConveyor; import com.simibubi.create.foundation.networking.BlockEntityConfigurationPacket; +import com.simibubi.create.infrastructure.config.AllConfigs; import net.minecraft.core.BlockPos; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; public class ChainConveyorConnectionPacket extends BlockEntityConfigurationPacket { private BlockPos targetPos; private boolean connect; + private ItemStack chain; - public ChainConveyorConnectionPacket(BlockPos pos, BlockPos targetPos, boolean connect) { + public ChainConveyorConnectionPacket(BlockPos pos, BlockPos targetPos, ItemStack chain, boolean connect) { super(pos); this.targetPos = targetPos; + this.chain = chain; this.connect = connect; } @@ -24,22 +30,50 @@ public class ChainConveyorConnectionPacket extends BlockEntityConfigurationPacke protected void writeSettings(FriendlyByteBuf buffer) { buffer.writeBlockPos(targetPos); buffer.writeBoolean(connect); + buffer.writeItem(chain); } @Override protected void readSettings(FriendlyByteBuf buffer) { targetPos = buffer.readBlockPos(); connect = buffer.readBoolean(); + chain = buffer.readItem(); } @Override - protected void applySettings(ChainConveyorBlockEntity be) { - // TODO max size config check + protected int maxRange() { + return AllConfigs.server().kinetics.maxChainConveyorLength.get() + 16; + } + @Override + protected void applySettings(ServerPlayer player, ChainConveyorBlockEntity be) { + if (!be.getBlockPos() + .closerThan(targetPos, maxRange() - 16 + 1)) + return; if (!(be.getLevel() .getBlockEntity(targetPos) instanceof ChainConveyorBlockEntity clbe)) return; + if (connect && !player.isCreative()) { + int chainCost = ChainConveyorBlockEntity.getChainCost(targetPos.subtract(be.getBlockPos())); + boolean hasEnough = ChainConveyorBlockEntity.getChainsFromInventory(player, chain, chainCost, true); + if (!hasEnough) + return; + ChainConveyorBlockEntity.getChainsFromInventory(player, chain, chainCost, false); + } + + if (!connect) { + if (!player.isCreative()) { + int chainCost = ChainConveyorBlockEntity.getChainCost(targetPos.subtract(pos)); + while (chainCost > 0) { + player.getInventory() + .placeItemBackInInventory(new ItemStack(Items.CHAIN, Math.min(chainCost, 64))); + chainCost -= 64; + } + } + be.chainDestroyed(targetPos.subtract(be.getBlockPos()), false, true); + } + if (connect) { if (!clbe.addConnectionTo(be.getBlockPos())) return; @@ -53,4 +87,7 @@ public class ChainConveyorConnectionPacket extends BlockEntityConfigurationPacke be.removeConnectionTo(targetPos); } + @Override + protected void applySettings(ChainConveyorBlockEntity be) {} + } diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorInteractionHandler.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorInteractionHandler.java index 32e9d2d2c1..2088868a5f 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorInteractionHandler.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorInteractionHandler.java @@ -6,20 +6,33 @@ import java.util.concurrent.TimeUnit; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllPackets; import com.simibubi.create.AllTags.AllItemTags; import com.simibubi.create.content.logistics.packagePort.PackagePortTarget; import com.simibubi.create.content.logistics.packagePort.PackagePortTargetSelectionHandler; import com.simibubi.create.foundation.utility.RaycastHelper; +import net.createmod.catnip.CatnipClient; import net.createmod.catnip.utility.WorldAttached; +import net.createmod.catnip.utility.theme.Color; import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; import net.minecraft.core.BlockPos; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.client.event.RenderHighlightEvent; import net.minecraftforge.common.ForgeMod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod.EventBusSubscriber; +@EventBusSubscriber(Dist.CLIENT) public class ChainConveyorInteractionHandler { public static WorldAttached>> loadedChains = @@ -30,6 +43,8 @@ public class ChainConveyorInteractionHandler { public static BlockPos selectedLift; public static float selectedChainPosition; public static BlockPos selectedConnection; + public static Vec3 selectedBakedPosition; + public static ChainConveyorShape selectedShape; public static void clientTick() { if (!isActive()) { @@ -38,8 +53,12 @@ public class ChainConveyorInteractionHandler { } Minecraft mc = Minecraft.getInstance(); + ItemStack mainHandItem = mc.player.getMainHandItem(); + boolean isWrench = AllItemTags.WRENCH.matches(mainHandItem); + boolean dismantling = isWrench && mc.player.isShiftKeyDown(); double range = mc.player.getAttribute(ForgeMod.BLOCK_REACH.get()) .getValue() + 1; + Vec3 from = RaycastHelper.getTraceOrigin(mc.player); Vec3 to = RaycastHelper.getTraceTarget(mc.player, range, from); HitResult hitResult = mc.hitResult; @@ -58,6 +77,8 @@ public class ChainConveyorInteractionHandler { .entrySet()) { BlockPos liftPos = entry.getKey(); for (ChainConveyorShape chainConveyorShape : entry.getValue()) { + if (chainConveyorShape instanceof ChainConveyorShape.ChainConveyorBB && dismantling) + continue; Vec3 liftVec = Vec3.atLowerCornerOf(liftPos); Vec3 intersect = chainConveyorShape.intersect(from.subtract(liftVec), to.subtract(liftVec)); if (intersect == null) @@ -80,8 +101,16 @@ public class ChainConveyorInteractionHandler { if (bestLift == null) return; - bestShape.drawOutline(bestLift); - bestShape.drawPoint(bestLift, selectedChainPosition); + selectedShape = bestShape; + selectedBakedPosition = bestShape.getVec(bestLift, selectedChainPosition); + + if (!isWrench) { + CatnipClient.OUTLINER + .chaseAABB("ChainPointSelection", new AABB(selectedBakedPosition, selectedBakedPosition)) + .colored(Color.WHITE) + .lineWidth(1 / 6f) + .disableLineNormals(); + } } private static boolean isActive() { @@ -98,21 +127,44 @@ public class ChainConveyorInteractionHandler { ItemStack mainHandItem = mc.player.getMainHandItem(); if (AllItemTags.WRENCH.matches(mainHandItem)) { - if (!mc.player.isCrouching()) { + if (!mc.player.isShiftKeyDown()) { ChainConveyorRidingHandler.embark(selectedLift, selectedChainPosition, selectedConnection); return true; } - // dismantle or start riding + + AllPackets.getChannel() + .sendToServer(new ChainConveyorConnectionPacket(selectedLift, selectedLift.offset(selectedConnection), + mainHandItem, false)); return true; } if (AllBlocks.PACKAGE_PORT.isIn(mainHandItem)) { + PackagePortTargetSelectionHandler.exactPositionOfTarget = selectedBakedPosition; PackagePortTargetSelectionHandler.activePackageTarget = new PackagePortTarget.ChainConveyorPortTarget(selectedLift, selectedChainPosition, selectedConnection); return true; } - return false; + return true; + } + + public static void drawCustomBlockSelection(PoseStack ms, MultiBufferSource buffer, Vec3 camera) { + if (selectedLift == null || selectedShape == null) + return; + + VertexConsumer vb = buffer.getBuffer(RenderType.lines()); + ms.pushPose(); + ms.translate(selectedLift.getX() - camera.x, selectedLift.getY() - camera.y, selectedLift.getZ() - camera.z); + selectedShape.drawOutline(selectedLift, ms, vb); + ms.popPose(); + } + + @SubscribeEvent + public static void hideVanillaBlockSelection(RenderHighlightEvent.Block event) { + if (selectedLift == null || selectedShape == null) + return; + + event.setCanceled(true); } } diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRidingHandler.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRidingHandler.java index 1a40097d8c..0210ec1b0c 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRidingHandler.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRidingHandler.java @@ -9,6 +9,7 @@ import net.createmod.catnip.utility.VecHelper; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction.Axis; +import net.minecraft.network.chat.Component; import net.minecraft.util.Mth; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.phys.Vec3; @@ -19,13 +20,19 @@ public class ChainConveyorRidingHandler { public static float chainPosition; public static BlockPos ridingConnection; public static boolean flipped; + public static int catchingUp; public static void embark(BlockPos lift, float position, BlockPos connection) { ridingChainConveyor = lift; chainPosition = position; ridingConnection = connection; - if (Minecraft.getInstance().level.getBlockEntity(ridingChainConveyor) instanceof ChainConveyorBlockEntity clbe) + catchingUp = 20; + Minecraft mc = Minecraft.getInstance(); + if (mc.level.getBlockEntity(ridingChainConveyor) instanceof ChainConveyorBlockEntity clbe) flipped = clbe.getSpeed() < 0; + + Component component = Component.translatable("mount.onboard", mc.options.keyShift.getTranslatedKeyMessage()); + mc.gui.setOverlayMessage(component, false); } public static void clientTick() { @@ -33,7 +40,7 @@ public class ChainConveyorRidingHandler { return; Minecraft mc = Minecraft.getInstance(); BlockEntity blockEntity = mc.level.getBlockEntity(ridingChainConveyor); - if (mc.player.isCrouching() || !(blockEntity instanceof ChainConveyorBlockEntity clbe)) { + if (mc.player.isShiftKeyDown() || !(blockEntity instanceof ChainConveyorBlockEntity clbe)) { ridingChainConveyor = null; ridingConnection = null; return; @@ -69,11 +76,14 @@ public class ChainConveyorRidingHandler { .scale(Math.min(stats.chainLength(), chainPosition))); } else { targetPosition = Vec3.atBottomCenterOf(ridingChainConveyor) - .add(VecHelper.rotate(new Vec3(0, 0.25, 0.875), chainPosition, Axis.Y)); + .add(VecHelper.rotate(new Vec3(0, 0.25, 1), chainPosition, Axis.Y)); } + + if (catchingUp > 0) + catchingUp--; Vec3 diff = targetPosition.subtract(playerPosition); - if (diff.length() > 3) { + if (catchingUp == 0 && diff.length() > 3) { ridingChainConveyor = null; ridingConnection = null; return; diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorShape.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorShape.java index e21c968221..6457010bb4 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorShape.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorShape.java @@ -2,15 +2,20 @@ package com.simibubi.create.content.kinetics.chainConveyor; import javax.annotation.Nullable; -import net.createmod.catnip.CatnipClient; -import net.createmod.catnip.utility.Pair; +import com.jozufozu.flywheel.util.transform.TransformStack; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.simibubi.create.AllShapes; +import com.simibubi.create.content.trains.track.TrackBlockOutline; + import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.theme.Color; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction.Axis; import net.minecraft.util.Mth; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; public abstract class ChainConveyorShape { @@ -19,9 +24,9 @@ public abstract class ChainConveyorShape { public abstract float getChainPosition(Vec3 intersection); - public abstract void drawOutline(BlockPos anchor); + protected abstract void drawOutline(BlockPos anchor, PoseStack ms, VertexConsumer vb); - public abstract void drawPoint(BlockPos anchor, float position); + public abstract Vec3 getVec(BlockPos anchor, float position); public static class ChainConveyorOBB extends ChainConveyorShape { @@ -29,7 +34,8 @@ public abstract class ChainConveyorShape { double yaw, pitch; AABB bounds; Vec3 pivot; - final double radius = 0.25; + final double radius = 0.175; + VoxelShape voxelShape; Vec3[] linePoints; @@ -44,6 +50,7 @@ public abstract class ChainConveyorShape { bounds = new AABB(start, start).expandTowards(new Vec3(0, 0, d)) .inflate(radius, radius, 0); pivot = start; + voxelShape = Shapes.create(bounds); } @Override @@ -77,50 +84,51 @@ public abstract class ChainConveyorShape { } @Override - public void drawOutline(BlockPos anchor) { - int key = 0; - for (double x : new double[] { bounds.minX, bounds.maxX }) { - for (double y : new double[] { bounds.minY, bounds.maxY }) { - Vec3 from = transform(new Vec3(x, y, bounds.minZ)); - Vec3 to = transform(new Vec3(x, y, bounds.maxZ)); - from = from.add(Vec3.atLowerCornerOf(anchor)); - to = to.add(Vec3.atLowerCornerOf(anchor)); - CatnipClient.OUTLINER.showLine(Pair.of(Pair.of(anchor, bounds), "c" + key++), from, to) - .colored(Color.WHITE); - } - } + public void drawOutline(BlockPos anchor, PoseStack ms, VertexConsumer vb) { + TransformStack.cast(ms) + .translate(pivot) + .rotateY(yaw) + .rotateX(pitch) + .translateBack(pivot); + TrackBlockOutline.renderShape(voxelShape, ms, vb, null); } @Override public float getChainPosition(Vec3 intersection) { - return (float) Math.min(bounds.getZsize(), intersection.distanceTo(pivot)); + int dots = (int) Math.round(Vec3.atLowerCornerOf(connection) + .length() - 3); + double length = bounds.getZsize(); + double selection = Math.min(bounds.getZsize(), intersection.distanceTo(pivot)); + + double margin = length - dots; + selection = Mth.clamp(selection - margin, 0, length - margin * 2); + selection = Math.round(selection); + + return (float) (selection + margin + 0.025); } @Override - public void drawPoint(BlockPos anchor, float position) { + public Vec3 getVec(BlockPos anchor, float position) { float x = (float) bounds.getCenter().x; float y = (float) bounds.getCenter().y; Vec3 from = new Vec3(x, y, bounds.minZ); Vec3 to = new Vec3(x, y, bounds.maxZ); Vec3 point = from.lerp(to, Mth.clamp(position / from.distanceTo(to), 0, 1)); point = transform(point); - CatnipClient.OUTLINER.chaseAABB("ChainPointSelection", new AABB(point, point).move(anchor) - .inflate(0, .175, 0)) - .colored(Color.WHITE) - .lineWidth(1 / 8f); + return point.add(Vec3.atLowerCornerOf(anchor)); } } public static class ChainConveyorBB extends ChainConveyorShape { Vec3 lb, rb; - final double radius = 1; + final double radius = 0.875; AABB bounds; public ChainConveyorBB(Vec3 center) { lb = center.add(0, 0, 0); rb = center.add(0, 0.5, 0); - bounds = new AABB(lb, rb).inflate(radius, 0, radius); + bounds = new AABB(lb, rb).inflate(1, 0, 1); } @Override @@ -130,9 +138,8 @@ public abstract class ChainConveyorShape { } @Override - public void drawOutline(BlockPos anchor) { - CatnipClient.OUTLINER.showAABB(anchor, bounds.move(anchor)) - .colored(Color.WHITE); + public void drawOutline(BlockPos anchor, PoseStack ms, VertexConsumer vb) { + TrackBlockOutline.renderShape(AllShapes.CHAIN_CONVEYOR_INTERACTION, ms, vb, null); } @Override @@ -140,17 +147,16 @@ public abstract class ChainConveyorShape { Vec3 diff = bounds.getCenter() .subtract(intersection); float angle = (float) (Mth.RAD_TO_DEG * Mth.atan2(diff.x, diff.z) + 360 + 180) % 360; - return angle; + float rounded = Math.round(angle / 45) * 45f; + return rounded; } @Override - public void drawPoint(BlockPos anchor, float position) { + public Vec3 getVec(BlockPos anchor, float position) { Vec3 point = bounds.getCenter(); point = point.add(VecHelper.rotate(new Vec3(0, 0, radius), position, Axis.Y)); - CatnipClient.OUTLINER.chaseAABB("ChainPointSelection", new AABB(point, point).move(anchor) - .inflate(0, .175, 0)) - .colored(Color.WHITE) - .lineWidth(1 / 8f); + return point.add(Vec3.atLowerCornerOf(anchor)) + .add(0, -.125, 0); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java index 4b6ca6f7ff..d0da9a0574 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java @@ -46,7 +46,10 @@ public class PackagePortBlockEntity extends SmartBlockEntity { public ItemStack animatedPackage; public LerpedFloat animationProgress; + public LerpedFloat anticipationProgress; public boolean currentlyDepositing; + + public boolean sendAnticipate; public float passiveYaw; @@ -55,6 +58,7 @@ public class PackagePortBlockEntity extends SmartBlockEntity { inventory = new PackagePortInventory(this); itemHandler = LazyOptional.of(() -> inventory); animationProgress = LerpedFloat.linear(); + anticipationProgress = LerpedFloat.linear(); } @Override @@ -70,7 +74,11 @@ public class PackagePortBlockEntity extends SmartBlockEntity { @Override public AABB getRenderBoundingBox() { - return super.getRenderBoundingBox().expandTowards(0, 1, 0); + AABB bb = super.getRenderBoundingBox().expandTowards(0, 1, 0); + if (target != null) + bb = bb.minmax(new AABB(BlockPos.containing(target.getExactTargetLocation(this, level, worldPosition)))) + .inflate(0.5); + return bb; } @Override @@ -106,10 +114,27 @@ public class PackagePortBlockEntity extends SmartBlockEntity { for (int i = 0; i < inventory.getSlots(); i++) drop(inventory.getStackInSlot(i)); } + + public void sendAnticipate() { + if (isAnimationInProgress()) + return; + sendAnticipate = true; + sendData(); + } + + public void anticipate() { + anticipationProgress.chase(1, 0.1, Chaser.LINEAR); + } @Override public void tick() { super.tick(); + + if (anticipationProgress.getValue() == 1) + anticipationProgress.updateChaseTarget(0); + + anticipationProgress.tickChaser(); + if (!isAnimationInProgress()) return; @@ -131,6 +156,7 @@ public class PackagePortBlockEntity extends SmartBlockEntity { if (animationProgress.getValue() < 1) return; + anticipationProgress.startWithValue(0); animationProgress.startWithValue(0); if (level.isClientSide()) { animatedPackage = null; @@ -246,11 +272,16 @@ public class PackagePortBlockEntity extends SmartBlockEntity { tag.put("AnimatedPackage", animatedPackage.serializeNBT()); tag.putBoolean("Deposit", currentlyDepositing); } + if (sendAnticipate) { + sendAnticipate = false; + tag.putBoolean("Anticipate", true); + } } @Override protected void read(CompoundTag tag, boolean clientPacket) { super.read(tag, clientPacket); + PackagePortTarget prevTarget = target; target = PackagePortTarget.read(tag.getCompound("Target")); inventory.deserializeNBT(tag.getCompound("Inventory")); passiveYaw = tag.getFloat("PlacedYaw"); @@ -258,6 +289,10 @@ public class PackagePortBlockEntity extends SmartBlockEntity { animatedPackage = null; if (tag.contains("AnimatedPackage")) startAnimation(ItemStack.of(tag.getCompound("AnimatedPackage")), tag.getBoolean("Deposit")); + if (clientPacket && tag.contains("Anticipate")) + anticipate(); + if (clientPacket && prevTarget != target) + invalidateRenderBoundingBox(); } public String getFilterString() { diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortPlacementPacket.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortPlacementPacket.java index 83c08c38a7..32759570a5 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortPlacementPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortPlacementPacket.java @@ -1,12 +1,14 @@ package com.simibubi.create.content.logistics.packagePort; import com.simibubi.create.foundation.networking.SimplePacketBase; +import com.simibubi.create.infrastructure.config.AllConfigs; import net.minecraft.core.BlockPos; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.phys.Vec3; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.network.NetworkEvent.Context; @@ -44,6 +46,12 @@ public class PackagePortPlacementPacket extends SimplePacketBase { BlockEntity blockEntity = world.getBlockEntity(pos); if (!(blockEntity instanceof PackagePortBlockEntity ppbe)) return; + + Vec3 targetLocation = target.getExactTargetLocation(ppbe, world, pos); + if (targetLocation == Vec3.ZERO || !targetLocation.closerThan(Vec3.atBottomCenterOf(pos), + AllConfigs.server().logistics.packagePortRange.get() + 2)) + return; + target.setup(ppbe, world, pos); ppbe.target = target; ppbe.notifyUpdate(); diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortRenderer.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortRenderer.java index e8b1a431be..de6ba23c38 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortRenderer.java @@ -31,13 +31,18 @@ public class PackagePortRenderer extends SmartBlockEntityRenderer 0 ? (float) Math.max(0, 1 - Math.pow((anticipation * 1.25) * 2 - 1, 4)) : 0; } + headPitch *= headPitchModifier; + body.centre() .rotateY(yaw) .unCentre() @@ -130,6 +140,8 @@ public class PackagePortRenderer extends SmartBlockEntityRenderer null; }; - + if (target == null) return null; - + target.readInternal(tag); return target; } @@ -97,6 +97,14 @@ public abstract class PackagePortTarget { return false; if (connection != null && !clbe.connections.contains(connection)) return false; + if (simulate) { + if (connection == null && !clbe.canAcceptMorePackages()) + return false; + if (connection != null && (!(level.getBlockEntity(clbe.getBlockPos() + .offset(connection)) instanceof ChainConveyorBlockEntity otherClbe) + || !otherClbe.canAcceptMorePackages())) + return false; + } if (simulate) return true; ChainConveyorPackage box2 = new ChainConveyorPackage(chainPos, box.copy()); diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTargetSelectionHandler.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTargetSelectionHandler.java index 6ea6d5d4e7..775976b813 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTargetSelectionHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTargetSelectionHandler.java @@ -1,22 +1,117 @@ package com.simibubi.create.content.logistics.packagePort; +import com.simibubi.create.AllBlocks; import com.simibubi.create.AllPackets; +import com.simibubi.create.foundation.utility.CreateLang; +import com.simibubi.create.infrastructure.config.AllConfigs; +import net.createmod.catnip.CatnipClient; +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.theme.Color; +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.player.LocalPlayer; import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.DustParticleOptions; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.HitResult; +import net.minecraft.world.phys.HitResult.Type; +import net.minecraft.world.phys.Vec3; public class PackagePortTargetSelectionHandler { public static PackagePortTarget activePackageTarget; + public static Vec3 exactPositionOfTarget; public static void flushSettings(BlockPos pos) { if (activePackageTarget == null) return; - activePackageTarget.relativePos = activePackageTarget.relativePos.subtract(pos); - AllPackets.getChannel() - .sendToServer(new PackagePortPlacementPacket(activePackageTarget, pos)); + if (validateDiff(exactPositionOfTarget, pos) == null) { + activePackageTarget.relativePos = activePackageTarget.relativePos.subtract(pos); + AllPackets.getChannel() + .sendToServer(new PackagePortPlacementPacket(activePackageTarget, pos)); + } + activePackageTarget = null; return; } + public static void tick() { + Minecraft mc = Minecraft.getInstance(); + LocalPlayer player = mc.player; + if (activePackageTarget == null) + return; + if (!AllBlocks.PACKAGE_PORT.isIn(player.getMainHandItem())) + return; + + HitResult objectMouseOver = mc.hitResult; + if (!(objectMouseOver instanceof BlockHitResult)) + return; + + Vec3 target = exactPositionOfTarget; + + BlockHitResult blockRayTraceResult = (BlockHitResult) objectMouseOver; + if (blockRayTraceResult.getType() == Type.MISS) { + CatnipClient.OUTLINER.chaseAABB("ChainPointSelected", new AABB(target, target)) + .colored(0x9ede73) + .lineWidth(1 / 5f) + .disableLineNormals(); + return; + } + + BlockPos pos = blockRayTraceResult.getBlockPos(); + if (!mc.level.getBlockState(pos) + .canBeReplaced()) + pos = pos.relative(blockRayTraceResult.getDirection()); + + String validateDiff = validateDiff(target, pos); + boolean valid = validateDiff == null; + Color color = new Color(valid ? 0x9ede73 : 0xff7171); + Vec3 source = Vec3.atBottomCenterOf(pos); + + CreateLang.translate(validateDiff != null ? validateDiff : "package_port.valid") + .color(color.getRGB()) + .sendStatus(player); + + CatnipClient.OUTLINER.chaseAABB("ChainPointSelected", new AABB(target, target)) + .colored(color) + .lineWidth(1 / 5f) + .disableLineNormals(); + + if (!mc.level.getBlockState(pos) + .canBeReplaced()) + return; + + CatnipClient.OUTLINER.chaseAABB("TargetedFrogPos", new AABB(pos).contract(0, 1, 0) + .deflate(0.125, 0, 0.125)) + .colored(color) + .lineWidth(1 / 16f) + .disableLineNormals(); + + DustParticleOptions data = new DustParticleOptions(color.asVectorF(), 1); + ClientLevel world = mc.level; + double totalFlyingTicks = 10; + int segments = (((int) totalFlyingTicks) / 3) + 1; + double tickOffset = totalFlyingTicks / segments; + + for (int i = 0; i < segments; i++) { + double ticks = ((AnimationTickHolder.getRenderTime() / 3) % tickOffset) + i * tickOffset; + Vec3 vec = source.lerp(target, ticks / totalFlyingTicks); + world.addParticle(data, vec.x, vec.y, vec.z, 0, 0, 0); + } + + } + + public static String validateDiff(Vec3 target, BlockPos placedPos) { + Vec3 source = Vec3.atBottomCenterOf(placedPos); + Vec3 diff = target.subtract(source); + if (diff.y < 0) + return "package_port.cannot_reach_down"; + if (diff.length() > AllConfigs.server().logistics.packagePortRange.get()) + return "package_port.too_far"; + return null; + } + } diff --git a/src/main/java/com/simibubi/create/foundation/block/BigOutlines.java b/src/main/java/com/simibubi/create/foundation/block/BigOutlines.java index fb6b002aa1..b2a6e88b5c 100644 --- a/src/main/java/com/simibubi/create/foundation/block/BigOutlines.java +++ b/src/main/java/com/simibubi/create/foundation/block/BigOutlines.java @@ -36,7 +36,7 @@ public class BigOutlines { double maxRange = mc.hitResult == null ? Double.MAX_VALUE : mc.hitResult.getLocation() - .distanceToSqr(origin); + .distanceToSqr(origin) + 0.5; AttributeInstance range = player.getAttribute(ForgeMod.BLOCK_REACH.get()); Vec3 target = RaycastHelper.getTraceTarget(player, Math.min(maxRange, range.getValue()) + 1, origin); diff --git a/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java b/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java index 0345c073c4..607b9db8af 100644 --- a/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java @@ -29,12 +29,14 @@ import com.simibubi.create.content.equipment.zapper.ZapperItem; import com.simibubi.create.content.equipment.zapper.terrainzapper.WorldshaperRenderHandler; import com.simibubi.create.content.kinetics.KineticDebugger; import com.simibubi.create.content.kinetics.belt.item.BeltConnectorHandler; +import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorConnectionHandler; import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorInteractionHandler; import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorRidingHandler; import com.simibubi.create.content.kinetics.fan.AirCurrent; import com.simibubi.create.content.kinetics.mechanicalArm.ArmInteractionPointHandler; import com.simibubi.create.content.kinetics.turntable.TurntableHandler; import com.simibubi.create.content.logistics.depot.EjectorTargetHandler; +import com.simibubi.create.content.logistics.packagePort.PackagePortTargetSelectionHandler; import com.simibubi.create.content.processing.sequenced.SequencedAssemblyRecipe; import com.simibubi.create.content.redstone.displayLink.ClickToLinkBlockItem; import com.simibubi.create.content.redstone.link.LinkRenderer; @@ -170,6 +172,8 @@ public class ClientEvents { NetheriteBacktankFirstPersonRenderer.clientTick(); ChainConveyorInteractionHandler.clientTick(); ChainConveyorRidingHandler.clientTick(); + ChainConveyorConnectionHandler.clientTick(); + PackagePortTargetSelectionHandler.tick(); } @SubscribeEvent @@ -210,7 +214,6 @@ public class ClientEvents { PoseStack ms = event.getPoseStack(); ms.pushPose(); SuperRenderTypeBuffer buffer = DefaultSuperRenderTypeBuffer.getInstance(); - float partialTicks = AnimationTickHolder.getPartialTicks(); Vec3 camera = Minecraft.getInstance().gameRenderer.getMainCamera() .getPosition(); @@ -219,6 +222,7 @@ public class ClientEvents { CouplingRenderer.renderAll(ms, buffer, camera); CarriageCouplingRenderer.renderAll(ms, buffer, camera); CreateClient.SCHEMATIC_HANDLER.render(ms, buffer, camera); + ChainConveyorInteractionHandler.drawCustomBlockSelection(ms, buffer, camera); buffer.draw(); RenderSystem.enableCull(); diff --git a/src/main/java/com/simibubi/create/infrastructure/config/CKinetics.java b/src/main/java/com/simibubi/create/infrastructure/config/CKinetics.java index e7e1f246c3..cf055ecbe5 100644 --- a/src/main/java/com/simibubi/create/infrastructure/config/CKinetics.java +++ b/src/main/java/com/simibubi/create/infrastructure/config/CKinetics.java @@ -9,6 +9,8 @@ public class CKinetics extends ConfigBase { public final ConfigBool disableStress = b(false, "disableStress", Comments.disableStress); public final ConfigInt maxBeltLength = i(20, 5, "maxBeltLength", Comments.maxBeltLength); + public final ConfigInt maxChainConveyorLength = i(32, 5, "maxChainConveyorLength", Comments.maxChainConveyorLength); + public final ConfigInt maxChainConveyorConnections = i(4, 1, "maxChainConveyorConnections", Comments.maxChainConveyorConnections); public final ConfigInt crushingDamage = i(4, 0, "crushingDamage", Comments.crushingDamage); public final ConfigInt maxRotationSpeed = i(256, 64, "maxRotationSpeed", Comments.rpm, Comments.maxRotationSpeed); public final ConfigEnum ignoreDeployerAttacks = @@ -70,6 +72,8 @@ public class CKinetics extends ConfigBase { private static class Comments { static String maxBeltLength = "Maximum length in blocks of mechanical belts."; + static String maxChainConveyorLength = "Maximum length in blocks of chain conveyor connections."; + static String maxChainConveyorConnections = "Maximum amount of connections each chain conveyor can have."; static String crushingDamage = "Damage dealt by active Crushing Wheels."; static String maxRotationSpeed = "Maximum allowed rotation speed for any Kinetic Block."; static String fanPushDistance = "Maximum distance in blocks Fans can push entities."; diff --git a/src/main/java/com/simibubi/create/infrastructure/config/CLogistics.java b/src/main/java/com/simibubi/create/infrastructure/config/CLogistics.java index c966e9bcf1..dff45a92eb 100644 --- a/src/main/java/com/simibubi/create/infrastructure/config/CLogistics.java +++ b/src/main/java/com/simibubi/create/infrastructure/config/CLogistics.java @@ -8,10 +8,12 @@ public class CLogistics extends ConfigBase { public final ConfigInt defaultExtractionTimer = i(8, 1, "defaultExtractionTimer", Comments.defaultExtractionTimer); public final ConfigInt psiTimeout = i(60, 1, "psiTimeout", Comments.psiTimeout); public final ConfigInt mechanicalArmRange = i(5, 1, "mechanicalArmRange", Comments.mechanicalArmRange); + public final ConfigInt packagePortRange = i(5, 1, "packagePortRange", Comments.packagePortRange); public final ConfigInt linkRange = i(256, 1, "linkRange", Comments.linkRange); public final ConfigInt displayLinkRange = i(64, 1, "displayLinkRange", Comments.displayLinkRange); public final ConfigInt packagerLinkRange = i(256, 1, "packagerLinkRange", Comments.packagerLinkRange); public final ConfigInt vaultCapacity = i(20, 1, "vaultCapacity", Comments.vaultCapacity); + public final ConfigInt chainConveyorCapacity = i(20, 1, "chainConveyorCapacity", Comments.chainConveyorCapacity); public final ConfigInt brassTunnelTimer = i(10, 1, 10, "brassTunnelTimer", Comments.brassTunnelTimer); public final ConfigBool seatHostileMobs = b(true, "seatHostileMobs", Comments.seatHostileMobs); @@ -31,7 +33,9 @@ public class CLogistics extends ConfigBase { static String psiTimeout = "The amount of ticks a portable storage interface waits for transfers until letting contraptions move along."; static String mechanicalArmRange = "Maximum distance in blocks a Mechanical Arm can reach across."; + static String packagePortRange = "Maximum distance in blocks a Package Port can be placed at from its target."; static String vaultCapacity = "The total amount of stacks a vault can hold per block in size."; + static String chainConveyorCapacity = "The amount of packages a chain conveyor can carry at a time."; static String brassTunnelTimer = "The amount of ticks a brass tunnel waits between distributions."; static String seatHostileMobs = "Whether hostile mobs walking near a seat will start riding it."; } diff --git a/src/main/resources/assets/create/lang/default/interface.json b/src/main/resources/assets/create/lang/default/interface.json index eed2923b79..5f45c1e7ff 100644 --- a/src/main/resources/assets/create/lang/default/interface.json +++ b/src/main/resources/assets/create/lang/default/interface.json @@ -663,6 +663,22 @@ "create.elevator_contact.floor_identifier": "Floor Identifier", "create.elevator_contact.floor_description": "Floor Description", + "create.package_port.valid": "Can Connect \u2714", + "create.package_port.too_far": "Too far away", + "create.package_port.cannot_reach_down": "Cannot connect downward", + + "create.chain_conveyor.select_second": "Select a second conveyor to connect", + "create.chain_conveyor.selection_cleared": "Selection Cleared", + "create.chain_conveyor.too_far": "Too far apart", + "create.chain_conveyor.too_close": "Too close together", + "create.chain_conveyor.not_enough_chains": "Not holding enough chains", + "create.chain_conveyor.cannot_connect_vertically": "Cannot connect vertically", + "create.chain_conveyor.too_steep": "Slope too steep", + "create.chain_conveyor.blocks_invalid": "Conveyor blocks invalid, Sneak-click to reset", + "create.chain_conveyor.already_connected": "Conveyors are already connected", + "create.chain_conveyor.valid_connection": "Can Connect \u2714", + "create.chain_conveyor.cannot_add_more_connections": "Cannot add more connections to this Conveyor", + "create.gui.schedule.lmb_edit": "Left-Click to Edit", "create.gui.schedule.rmb_remove": "Right-Click to Remove", "create.gui.schedule.duplicate": "Duplicate", From f2a08f825b2fc6639740b4f1d27a871ecbce3331 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Sun, 30 Jun 2024 10:47:56 +0200 Subject: [PATCH 036/515] Yoinkage Handling - Players can manually take and deposit chain packages - Ports drop backed up packages on destroy --- .../java/com/simibubi/create/AllPackets.java | 2 + .../chainConveyor/ChainConveyorBlock.java | 54 --------- .../ChainConveyorBlockEntity.java | 12 ++ .../ChainConveyorInteractionHandler.java | 11 +- .../chainConveyor/ChainConveyorPackage.java | 9 ++ .../ChainPackageInteractionHandler.java | 75 ++++++++++++ .../ChainPackageInteractionPacket.java | 112 ++++++++++++++++++ .../packagePort/PackagePortBlock.java | 5 + .../packagePort/PackagePortTarget.java | 12 +- .../create/foundation/events/InputEvents.java | 9 +- 10 files changed, 235 insertions(+), 66 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainPackageInteractionHandler.java create mode 100644 src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainPackageInteractionPacket.java diff --git a/src/main/java/com/simibubi/create/AllPackets.java b/src/main/java/com/simibubi/create/AllPackets.java index 5d2088d002..aac0004732 100644 --- a/src/main/java/com/simibubi/create/AllPackets.java +++ b/src/main/java/com/simibubi/create/AllPackets.java @@ -47,6 +47,7 @@ import com.simibubi.create.content.equipment.zapper.terrainzapper.ConfigureWorld import com.simibubi.create.content.fluids.transfer.FluidSplashPacket; import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorConnectionPacket; import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorRidingPacket; +import com.simibubi.create.content.kinetics.chainConveyor.ChainPackageInteractionPacket; import com.simibubi.create.content.kinetics.gauge.GaugeObservedPacket; import com.simibubi.create.content.kinetics.mechanicalArm.ArmPlacementPacket; import com.simibubi.create.content.kinetics.transmission.sequencer.ConfigureSequencedGearshiftPacket; @@ -175,6 +176,7 @@ public enum AllPackets { LOGISTICS_PACKAGE_REQUEST(PackageOrderRequestPacket.class, PackageOrderRequestPacket::new, PLAY_TO_SERVER), CHAIN_CONVEYOR_CONNECT(ChainConveyorConnectionPacket.class, ChainConveyorConnectionPacket::new, PLAY_TO_SERVER), CHAIN_CONVEYOR_RIDING(ChainConveyorRidingPacket.class, ChainConveyorRidingPacket::new, PLAY_TO_SERVER), + CHAIN_PACKAGE_INTERACTION(ChainPackageInteractionPacket.class, ChainPackageInteractionPacket::new, PLAY_TO_SERVER), // Server to Client SYMMETRY_EFFECT(SymmetryEffectPacket.class, SymmetryEffectPacket::new, PLAY_TO_CLIENT), diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlock.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlock.java index a21f27a781..29b27c29ed 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlock.java @@ -3,15 +3,11 @@ package com.simibubi.create.content.kinetics.chainConveyor; import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllShapes; import com.simibubi.create.content.kinetics.base.KineticBlock; -import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.foundation.block.IBE; -import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; -import net.minecraft.util.Mth; -import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -23,8 +19,6 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.BlockHitResult; -import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; @@ -102,54 +96,6 @@ public class ChainConveyorBlock extends KineticBlock implements IBE { - float bestDiff = Float.POSITIVE_INFINITY; - ChainConveyorPackage best = null; - for (ChainConveyorPackage liftPackage : be.loopingPackages) { - float angleDiff = Math.abs(AngleHelper.getShortestAngleDiff(liftPackage.chainPosition, angle)); - if (angleDiff > bestDiff) - continue; - bestDiff = angleDiff; - best = liftPackage; - } - - if (best == null) - return; - - pPlayer.setItemInHand(pHand, best.item.copy()); - be.loopingPackages.remove(best); - be.sendData(); - }); - - return InteractionResult.CONSUME; - } - - withBlockEntityDo(pLevel, pPos, be -> { - if (!be.canAcceptMorePackages()) - return; - be.addLoopingPackage(new ChainConveyorPackage(angle, itemInHand.copyWithCount(1))); - itemInHand.shrink(1); - if (itemInHand.isEmpty()) - pPlayer.setItemInHand(pHand, ItemStack.EMPTY); - }); - - return InteractionResult.CONSUME; - } - @Override public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pIsMoving) { IBE.onRemove(pState, pLevel, pPos, pNewState); diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java index 8bd0ee188d..b60c4da948 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java @@ -93,6 +93,16 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity { .get(); } + public boolean canAcceptPackagesFor(@Nullable BlockPos connection) { + if (connection == null && !canAcceptMorePackages()) + return false; + if (connection != null + && (!(level.getBlockEntity(worldPosition.offset(connection)) instanceof ChainConveyorBlockEntity otherClbe) + || !otherClbe.canAcceptMorePackages())) + return false; + return true; + } + public boolean canAcceptMorePackagesFromOtherConveyor() { return loopingPackages.size() < AllConfigs.server().logistics.chainConveyorCapacity.get(); } @@ -385,6 +395,8 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity { return; ChainConveyorPackagePhysicsData physicsData = box.physicsData(level); + physicsData.setBE(this); + if (!physicsData.shouldTick()) return; diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorInteractionHandler.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorInteractionHandler.java index 2088868a5f..2fac8095f4 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorInteractionHandler.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorInteractionHandler.java @@ -11,6 +11,7 @@ import com.mojang.blaze3d.vertex.VertexConsumer; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllPackets; import com.simibubi.create.AllTags.AllItemTags; +import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.content.logistics.packagePort.PackagePortTarget; import com.simibubi.create.content.logistics.packagePort.PackagePortTargetSelectionHandler; import com.simibubi.create.foundation.utility.RaycastHelper; @@ -116,7 +117,8 @@ public class ChainConveyorInteractionHandler { private static boolean isActive() { Minecraft mc = Minecraft.getInstance(); ItemStack mainHandItem = mc.player.getMainHandItem(); - return AllItemTags.WRENCH.matches(mainHandItem) || AllBlocks.PACKAGE_PORT.isIn(mainHandItem); + return AllItemTags.WRENCH.matches(mainHandItem) || AllBlocks.PACKAGE_PORT.isIn(mainHandItem) + || PackageItem.isPackage(mainHandItem); } public static boolean onUse() { @@ -145,6 +147,13 @@ public class ChainConveyorInteractionHandler { return true; } + if (PackageItem.isPackage(mainHandItem)) { + AllPackets.getChannel() + .sendToServer(new ChainPackageInteractionPacket(selectedLift, selectedConnection, selectedChainPosition, + mainHandItem)); + return true; + } + return true; } diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorPackage.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorPackage.java index ae6ee0f3c0..b7b0015bf5 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorPackage.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorPackage.java @@ -1,5 +1,6 @@ package com.simibubi.create.content.kinetics.chainConveyor; +import java.lang.ref.WeakReference; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; @@ -39,6 +40,8 @@ public class ChainConveyorPackage { public float prevYaw; public boolean flipped; public ResourceLocation modelKey; + + public WeakReference beReference; public ChainConveyorPackagePhysicsData(Vec3 serverPosition) { this.targetPos = null; @@ -56,6 +59,12 @@ public class ChainConveyorPackage { lastTick = AnimationTickHolder.getTicks(); return true; } + + public void setBE(ChainConveyorBlockEntity ccbe) { + if (beReference == null || beReference.get() != ccbe) + beReference = new WeakReference(ccbe); + } + } public float chainPosition; diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainPackageInteractionHandler.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainPackageInteractionHandler.java new file mode 100644 index 0000000000..19ced5bc68 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainPackageInteractionHandler.java @@ -0,0 +1,75 @@ +package com.simibubi.create.content.kinetics.chainConveyor; + +import java.util.List; + +import org.apache.commons.lang3.mutable.MutableBoolean; + +import com.simibubi.create.AllPackets; +import com.simibubi.create.foundation.utility.RaycastHelper; + +import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.common.ForgeMod; + +public class ChainPackageInteractionHandler { + + public static boolean onUse() { + Minecraft mc = Minecraft.getInstance(); + MutableBoolean success = new MutableBoolean(false); + + ChainConveyorPackage.physicsDataCache.get(mc.level) + .asMap() + .forEach((i, data) -> { + if (success.booleanValue()) + return; + if (data == null || data.targetPos == null || data.beReference == null) + return; + AABB bounds = new AABB(data.targetPos, data.targetPos).move(0, -.25, 0) + .inflate(0.45); + + double range = mc.player.getAttribute(ForgeMod.BLOCK_REACH.get()) + .getValue() + 1; + Vec3 from = RaycastHelper.getTraceOrigin(mc.player); + Vec3 to = RaycastHelper.getTraceTarget(mc.player, range, from); + + if (bounds.clip(from, to) + .isEmpty()) + return; + + ChainConveyorBlockEntity ccbe = data.beReference.get(); + if (ccbe == null || ccbe.isRemoved()) + return; + + for (ChainConveyorPackage pckg : ccbe.getLoopingPackages()) { + if (pckg.netId == i) { + AllPackets.getChannel() + .sendToServer( + new ChainPackageInteractionPacket(ccbe.getBlockPos(), null, pckg.chainPosition, null)); + success.setTrue(); + return; + } + } + + for (BlockPos connection : ccbe.connections) { + List list = ccbe.travellingPackages.get(connection); + if (list == null) + continue; + for (ChainConveyorPackage pckg : list) { + if (pckg.netId == i) { + AllPackets.getChannel() + .sendToServer(new ChainPackageInteractionPacket(ccbe.getBlockPos(), connection, + pckg.chainPosition, null)); + success.setTrue(); + return; + } + } + } + + }); + + return success.booleanValue(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainPackageInteractionPacket.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainPackageInteractionPacket.java new file mode 100644 index 0000000000..50366e6469 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainPackageInteractionPacket.java @@ -0,0 +1,112 @@ +package com.simibubi.create.content.kinetics.chainConveyor; + +import java.util.List; + +import com.simibubi.create.foundation.networking.BlockEntityConfigurationPacket; +import com.simibubi.create.infrastructure.config.AllConfigs; + +import net.createmod.catnip.utility.math.AngleHelper; +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.item.ItemStack; + +public class ChainPackageInteractionPacket extends BlockEntityConfigurationPacket { + + private BlockPos selectedConnection; + private float chainPosition; + private ItemStack insertedPackage; + + public ChainPackageInteractionPacket(BlockPos pos, BlockPos selectedConnection, float chainPosition, + ItemStack insertedPackage) { + super(pos); + this.selectedConnection = selectedConnection == null ? BlockPos.ZERO : selectedConnection; + this.chainPosition = chainPosition; + this.insertedPackage = insertedPackage == null ? ItemStack.EMPTY : insertedPackage; + } + + public ChainPackageInteractionPacket(FriendlyByteBuf buffer) { + super(buffer); + } + + @Override + protected void writeSettings(FriendlyByteBuf buffer) { + buffer.writeBlockPos(selectedConnection); + buffer.writeFloat(chainPosition); + buffer.writeItem(insertedPackage); + } + + @Override + protected void readSettings(FriendlyByteBuf buffer) { + selectedConnection = buffer.readBlockPos(); + chainPosition = buffer.readFloat(); + insertedPackage = buffer.readItem(); + } + + @Override + protected int maxRange() { + return AllConfigs.server().kinetics.maxChainConveyorLength.get() + 16; + } + + @Override + protected void applySettings(ChainConveyorBlockEntity be) {} + + @Override + protected void applySettings(ServerPlayer player, ChainConveyorBlockEntity be) { + if (insertedPackage.isEmpty()) { + + float bestDiff = Float.POSITIVE_INFINITY; + ChainConveyorPackage best = null; + List list = selectedConnection.equals(BlockPos.ZERO) ? be.loopingPackages + : be.travellingPackages.get(selectedConnection); + + if (list == null || list.isEmpty()) + return; + + for (ChainConveyorPackage liftPackage : list) { + float diff = Math.abs(selectedConnection == null + ? AngleHelper.getShortestAngleDiff(liftPackage.chainPosition, chainPosition) + : liftPackage.chainPosition - chainPosition); + if (diff > bestDiff) + continue; + bestDiff = diff; + best = liftPackage; + } + + if (best == null) + return; + + if (player.getMainHandItem() + .isEmpty()) + player.setItemInHand(InteractionHand.MAIN_HAND, best.item.copy()); + else + player.getInventory() + .placeItemBackInInventory(best.item.copy()); + + list.remove(best); + be.sendData(); + + return; + } + + ChainConveyorPackage chainConveyorPackage = new ChainConveyorPackage(chainPosition, insertedPackage); + if (!be.canAcceptPackagesFor(selectedConnection)) + return; + + if (!player.isCreative()) { + player.getMainHandItem() + .shrink(1); + if (player.getMainHandItem() + .isEmpty()) + player.setItemInHand(InteractionHand.MAIN_HAND, ItemStack.EMPTY); + } + + if (selectedConnection.equals(BlockPos.ZERO)) + be.addLoopingPackage(chainConveyorPackage); + else + be.addTravellingPackage(chainConveyorPackage, selectedConnection); + + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlock.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlock.java index 46763e91cc..e83badfc0d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlock.java @@ -52,5 +52,10 @@ public class PackagePortBlock extends Block implements IBE getBlockEntityType() { return AllBlockEntityTypes.PACKAGE_PORT.get(); } + + @Override + public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pMovedByPiston) { + IBE.onRemove(pState, pLevel, pPos, pNewState); + } } diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTarget.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTarget.java index f8823721a4..44268d3e5f 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTarget.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTarget.java @@ -6,9 +6,9 @@ import javax.annotation.Nullable; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorBlockEntity; -import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorPackage; import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorBlockEntity.ConnectedPort; import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorBlockEntity.ConnectionStats; +import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorPackage; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; @@ -97,16 +97,8 @@ public abstract class PackagePortTarget { return false; if (connection != null && !clbe.connections.contains(connection)) return false; - if (simulate) { - if (connection == null && !clbe.canAcceptMorePackages()) - return false; - if (connection != null && (!(level.getBlockEntity(clbe.getBlockPos() - .offset(connection)) instanceof ChainConveyorBlockEntity otherClbe) - || !otherClbe.canAcceptMorePackages())) - return false; - } if (simulate) - return true; + return clbe.getSpeed() != 0 && clbe.canAcceptPackagesFor(connection); ChainConveyorPackage box2 = new ChainConveyorPackage(chainPos, box.copy()); if (connection == null) return clbe.addLoopingPackage(box2); diff --git a/src/main/java/com/simibubi/create/foundation/events/InputEvents.java b/src/main/java/com/simibubi/create/foundation/events/InputEvents.java index 541bc4fd0a..cd3c522106 100644 --- a/src/main/java/com/simibubi/create/foundation/events/InputEvents.java +++ b/src/main/java/com/simibubi/create/foundation/events/InputEvents.java @@ -4,6 +4,7 @@ import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.elevator.ElevatorControlsHandler; import com.simibubi.create.content.equipment.toolbox.ToolboxHandlerClient; import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorInteractionHandler; +import com.simibubi.create.content.kinetics.chainConveyor.ChainPackageInteractionHandler; import com.simibubi.create.content.redstone.link.controller.LinkedControllerClientHandler; import com.simibubi.create.content.trains.TrainHUD; import com.simibubi.create.content.trains.entity.TrainRelocator; @@ -14,6 +15,7 @@ import net.minecraft.client.Minecraft; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.InputEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; @EventBusSubscriber(Dist.CLIENT) @@ -87,9 +89,14 @@ public class InputEvents { LinkedControllerClientHandler.deactivateInLectern(); TrainRelocator.onClicked(event); - + if (ChainConveyorInteractionHandler.onUse()) event.setCanceled(true); + + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { + if (ChainPackageInteractionHandler.onUse()) + event.setCanceled(true); + }); } } From f13cfcc3372c84b245be29a5174c00c625dbe102 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Mon, 1 Jul 2024 13:11:03 +0200 Subject: [PATCH 037/515] Defrackager - Defragmentation capabilities moved to a second blockstate of the packager --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 13 +- .../create/blockstates/order_collector.json | 19 - .../assets/create/blockstates/packager.json | 90 +++-- .../resources/assets/create/lang/en_ud.json | 3 +- .../resources/assets/create/lang/en_us.json | 3 +- .../create/models/item/order_collector.json | 3 - .../loot_tables/blocks/order_collector.json | 21 -- .../tags/blocks/mineable/pickaxe.json | 1 - .../simibubi/create/AllBlockEntityTypes.java | 9 - .../java/com/simibubi/create/AllBlocks.java | 14 - .../com/simibubi/create/AllPartialModels.java | 40 +- .../ChainPackageInteractionHandler.java | 1 + .../orderCollector/OrderCollectorBlock.java | 57 --- .../OrderCollectorBlockEntity.java | 342 ------------------ .../OrderCollectorRenderer.java | 70 ---- .../packagePort/PackagePortBlockEntity.java | 2 + .../packager/PackageDefragmenter.java | 164 +++++++++ .../logistics/packager/PackagerBlock.java | 43 ++- .../packager/PackagerBlockEntity.java | 166 +++++++-- .../logistics/packager/PackagerGenerator.java | 6 +- .../logistics/packager/PackagerRenderer.java | 6 +- .../packagerLink/PackagerLinkBlockEntity.java | 4 +- .../assets/create/lang/default/interface.json | 3 + .../models/block/order_collector/block.json | 57 --- .../models/block/order_collector/item.json | 72 ---- .../models/block/packager/block_defrag.json | 7 + .../block/packager/block_defrag_vertical.json | 7 + .../{block.json => block_regular.json} | 0 ...tical.json => block_regular_vertical.json} | 0 .../create/models/block/packager/item.json | 90 ++--- .../create/models/block/packager/tray.json | 27 -- .../models/block/packager/tray_defrag.json | 6 + .../models/block/packager/tray_regular.json | 30 ++ .../create/textures/block/order_collector.png | Bin 518 -> 0 bytes .../create/textures/block/package_port.png | Bin 263 -> 0 bytes .../textures/block/packager_block_defrag.png | Bin 0 -> 1131 bytes .../create/textures/block/packager_tray.png | Bin 672 -> 0 bytes 37 files changed, 539 insertions(+), 837 deletions(-) delete mode 100644 src/generated/resources/assets/create/blockstates/order_collector.json delete mode 100644 src/generated/resources/assets/create/models/item/order_collector.json delete mode 100644 src/generated/resources/data/create/loot_tables/blocks/order_collector.json delete mode 100644 src/main/java/com/simibubi/create/content/logistics/orderCollector/OrderCollectorBlock.java delete mode 100644 src/main/java/com/simibubi/create/content/logistics/orderCollector/OrderCollectorBlockEntity.java delete mode 100644 src/main/java/com/simibubi/create/content/logistics/orderCollector/OrderCollectorRenderer.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/packager/PackageDefragmenter.java delete mode 100644 src/main/resources/assets/create/models/block/order_collector/block.json delete mode 100644 src/main/resources/assets/create/models/block/order_collector/item.json create mode 100644 src/main/resources/assets/create/models/block/packager/block_defrag.json create mode 100644 src/main/resources/assets/create/models/block/packager/block_defrag_vertical.json rename src/main/resources/assets/create/models/block/packager/{block.json => block_regular.json} (100%) rename src/main/resources/assets/create/models/block/packager/{block_vertical.json => block_regular_vertical.json} (100%) delete mode 100644 src/main/resources/assets/create/models/block/packager/tray.json create mode 100644 src/main/resources/assets/create/models/block/packager/tray_defrag.json create mode 100644 src/main/resources/assets/create/models/block/packager/tray_regular.json delete mode 100644 src/main/resources/assets/create/textures/block/order_collector.png delete mode 100644 src/main/resources/assets/create/textures/block/package_port.png create mode 100644 src/main/resources/assets/create/textures/block/packager_block_defrag.png delete mode 100644 src/main/resources/assets/create/textures/block/packager_tray.png diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 59ec042622..7d41f61d6e 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-06-29T15:11:09.8697391 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-07-01T12:19:36.8328674 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -339,7 +339,6 @@ af4c2c4861d1410e1b7371a5bf3fe09ed3ab0077 assets/create/blockstates/orange_sail.j aab812cecf7d10d4e7587f4dead8a98238a15f41 assets/create/blockstates/orange_seat.json 2bc30ed9907230271b4e2d0786f106f3e1e25029 assets/create/blockstates/orange_toolbox.json 2af63a4768f84fc93c7e7d67fa9a64438433e59f assets/create/blockstates/orange_valve_handle.json -91b52260e2537dedcd31663638cc60a1583aebdb assets/create/blockstates/order_collector.json 515ed7dae09b052f289419ba09998a23e0d7083d assets/create/blockstates/ornate_iron_window.json 8118444f37536b9104ef4818d374b0c8a7c987bf assets/create/blockstates/ornate_iron_window_pane.json 97cd78453af94f44cef1187988966626574b29d5 assets/create/blockstates/oxidized_copper_shingles.json @@ -348,7 +347,7 @@ ac536ae742c12e97bfd0b2483c87ff29f3935eaf assets/create/blockstates/oxidized_copp 110a6c19bcc9f044e5e982ac6e4b295b03ec0145 assets/create/blockstates/oxidized_copper_tiles.json 3f3924f0f0e368edfa04f4fdd6d6c2319276ddfe assets/create/blockstates/oxidized_copper_tile_slab.json 5e634cfb9abb06d8b29f39d751fc56b28ea5a9cd assets/create/blockstates/oxidized_copper_tile_stairs.json -9cb7470bcf22eb84f296730b9727f5c01c174e22 assets/create/blockstates/packager.json +ef3af446b56c69e71a156d5998d9dc8e6d9ea4f5 assets/create/blockstates/packager.json 0f204afc6712a08d2db84bb07a0a49927f3127a6 assets/create/blockstates/packager_link.json 67b8514a21363257a514f870633b7b1cff16b147 assets/create/blockstates/package_port.json 36742cc6ce052ead143366d31b11e828a525c1b8 assets/create/blockstates/peculiar_bell.json @@ -591,8 +590,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -9d34b0928f515132c80fa9119198be9ef5c16fc8 assets/create/lang/en_ud.json -5203b3702a70c2c3424bf7e43a7fa01ed759efaf assets/create/lang/en_us.json +0f33619793869d4db13d881a565af6800247ea36 assets/create/lang/en_ud.json +e2797efc071b7c1f919922760a787f3d26bc0d39 assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -2040,7 +2039,6 @@ af50363d603d61340b336569d58c1febde253665 assets/create/models/item/ochrum.json 56e7d28824d3fc566b5f551babbe423a550ef08c assets/create/models/item/orange_seat.json 96cc543d5afed90a022ece7b8671cd47a9b6fb68 assets/create/models/item/orange_toolbox.json 7e767ca9e0ddb769b38fabd9289648ac63f5413d assets/create/models/item/orange_valve_handle.json -e0885ba7be7bf55f3b2ccabff764fca8cada2a92 assets/create/models/item/order_collector.json 82152bca4310111d91584a2a78f05e158bb4bd90 assets/create/models/item/ornate_iron_window.json f9064c1f199bcd8db321078e2363ed91cb2acc09 assets/create/models/item/ornate_iron_window_pane.json 09b3cd8ff7b29a6dd59f739a95bb708646d23537 assets/create/models/item/oxidized_copper_shingles.json @@ -3298,7 +3296,6 @@ d6323d4b30faa87cd4b5b8b815cb16f78296f203 data/create/loot_tables/blocks/orange_s 119fc4c3055c09c7958ac405925a6b7be2081c6b data/create/loot_tables/blocks/orange_seat.json 54ac8c8166c23f24a8a0870c981ef8ffa64c0b89 data/create/loot_tables/blocks/orange_toolbox.json 30aef2df782b6b35cd16b4c205bb15de85bc0664 data/create/loot_tables/blocks/orange_valve_handle.json -ff5b22187101d0c90f995694afbe6fbb99f088da data/create/loot_tables/blocks/order_collector.json f4004c6d16754fc8867ed6618dace8e8f6dcc412 data/create/loot_tables/blocks/ornate_iron_window.json 6f14500e07c6d342804f9127e7b66047ffaeef1e data/create/loot_tables/blocks/ornate_iron_window_pane.json 3e54d3c4755a43d837a1d9b2005ea1dee4d02555 data/create/loot_tables/blocks/oxidized_copper_shingles.json @@ -4312,7 +4309,7 @@ c741ba83b562ae3459d7c4f2db69537f549ea411 data/forge/tags/items/tools/wrench.json e3321ff14704c031a2c16953b7e391f4f24dd70b data/minecraft/tags/blocks/impermeable.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/lush_ground_replaceable.json 97e4fca52c0fc5c8c06d376bd69b7d9fd45f1df0 data/minecraft/tags/blocks/mineable/axe.json -a0520e45e917a59925c859790f631b1cf583f775 data/minecraft/tags/blocks/mineable/pickaxe.json +7957b975f7ffd01ade197418a70077a6dd61a40c data/minecraft/tags/blocks/mineable/pickaxe.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/moss_replaceable.json 0c13aae0eeb99e89febe8dbe5e002af2ff843a9e data/minecraft/tags/blocks/needs_iron_tool.json 3cb2a92cbdf32ed5978f740dc378d363306c3e84 data/minecraft/tags/blocks/needs_stone_tool.json diff --git a/src/generated/resources/assets/create/blockstates/order_collector.json b/src/generated/resources/assets/create/blockstates/order_collector.json deleted file mode 100644 index 8b2f14c1f8..0000000000 --- a/src/generated/resources/assets/create/blockstates/order_collector.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "variants": { - "facing=east": { - "model": "create:block/order_collector/block", - "y": 90 - }, - "facing=north": { - "model": "create:block/order_collector/block" - }, - "facing=south": { - "model": "create:block/order_collector/block", - "y": 180 - }, - "facing=west": { - "model": "create:block/order_collector/block", - "y": 270 - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/packager.json b/src/generated/resources/assets/create/blockstates/packager.json index 7994be8eca..6111c70071 100644 --- a/src/generated/resources/assets/create/blockstates/packager.json +++ b/src/generated/resources/assets/create/blockstates/packager.json @@ -1,45 +1,87 @@ { "variants": { - "facing=down,powered=false": { - "model": "create:block/packager/block_vertical" + "facing=down,powered=false,type=defrag": { + "model": "create:block/packager/block_defrag_vertical" }, - "facing=down,powered=true": { - "model": "create:block/packager/block_vertical" + "facing=down,powered=false,type=regular": { + "model": "create:block/packager/block_regular_vertical" }, - "facing=east,powered=false": { - "model": "create:block/packager/block", + "facing=down,powered=true,type=defrag": { + "model": "create:block/packager/block_defrag_vertical" + }, + "facing=down,powered=true,type=regular": { + "model": "create:block/packager/block_regular_vertical" + }, + "facing=east,powered=false,type=defrag": { + "model": "create:block/packager/block_defrag", "y": 270 }, - "facing=east,powered=true": { - "model": "create:block/packager/block", + "facing=east,powered=false,type=regular": { + "model": "create:block/packager/block_regular", "y": 270 }, - "facing=north,powered=false": { - "model": "create:block/packager/block", + "facing=east,powered=true,type=defrag": { + "model": "create:block/packager/block_defrag", + "y": 270 + }, + "facing=east,powered=true,type=regular": { + "model": "create:block/packager/block_regular", + "y": 270 + }, + "facing=north,powered=false,type=defrag": { + "model": "create:block/packager/block_defrag", "y": 180 }, - "facing=north,powered=true": { - "model": "create:block/packager/block", + "facing=north,powered=false,type=regular": { + "model": "create:block/packager/block_regular", "y": 180 }, - "facing=south,powered=false": { - "model": "create:block/packager/block" + "facing=north,powered=true,type=defrag": { + "model": "create:block/packager/block_defrag", + "y": 180 }, - "facing=south,powered=true": { - "model": "create:block/packager/block" + "facing=north,powered=true,type=regular": { + "model": "create:block/packager/block_regular", + "y": 180 }, - "facing=up,powered=false": { - "model": "create:block/packager/block_vertical" + "facing=south,powered=false,type=defrag": { + "model": "create:block/packager/block_defrag" }, - "facing=up,powered=true": { - "model": "create:block/packager/block_vertical" + "facing=south,powered=false,type=regular": { + "model": "create:block/packager/block_regular" }, - "facing=west,powered=false": { - "model": "create:block/packager/block", + "facing=south,powered=true,type=defrag": { + "model": "create:block/packager/block_defrag" + }, + "facing=south,powered=true,type=regular": { + "model": "create:block/packager/block_regular" + }, + "facing=up,powered=false,type=defrag": { + "model": "create:block/packager/block_defrag_vertical" + }, + "facing=up,powered=false,type=regular": { + "model": "create:block/packager/block_regular_vertical" + }, + "facing=up,powered=true,type=defrag": { + "model": "create:block/packager/block_defrag_vertical" + }, + "facing=up,powered=true,type=regular": { + "model": "create:block/packager/block_regular_vertical" + }, + "facing=west,powered=false,type=defrag": { + "model": "create:block/packager/block_defrag", "y": 90 }, - "facing=west,powered=true": { - "model": "create:block/packager/block", + "facing=west,powered=false,type=regular": { + "model": "create:block/packager/block_regular", + "y": 90 + }, + "facing=west,powered=true,type=defrag": { + "model": "create:block/packager/block_defrag", + "y": 90 + }, + "facing=west,powered=true,type=regular": { + "model": "create:block/packager/block_regular", "y": 90 } } diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 0b415a6ced..28c4a594db 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -553,7 +553,6 @@ "block.create.orange_seat": "ʇɐǝS ǝbuɐɹO", "block.create.orange_toolbox": "xoqןoo⟘ ǝbuɐɹO", "block.create.orange_valve_handle": "ǝןpuɐH ǝʌןɐΛ ǝbuɐɹO", - "block.create.order_collector": "ɹoʇɔǝןןoƆ ɹǝpɹO", "block.create.ornate_iron_window": "ʍopuıM uoɹI ǝʇɐuɹO", "block.create.ornate_iron_window_pane": "ǝuɐԀ ʍopuıM uoɹI ǝʇɐuɹO", "block.create.oxidized_copper_shingle_slab": "qɐןS ǝןbuıɥS ɹǝddoƆ pǝzıpıxO", @@ -1371,6 +1370,8 @@ "create.package_port.cannot_reach_down": "pɹɐʍuʍop ʇɔǝuuoɔ ʇouuɐƆ", "create.package_port.too_far": "ʎɐʍɐ ɹɐɟ oo⟘", "create.package_port.valid": "✔ ʇɔǝuuoƆ uɐƆ", + "create.packager.mode_change.defrag": "pǝʇǝןdɯoɔ ʇndʇno puɐ sʇuǝɯbɐɹɟ ʇɔǝןןoƆ >-", + "create.packager.mode_change.regular": "sɯǝʇı xoqun puɐ ǝbɐʞɔɐԀ >-", "create.packager_link.clear": "uoıʇɔǝןǝs pǝɹɐǝןƆ", "create.packager_link.invalid": "buıɔɐןd ǝɹoɟǝq ɹǝʇsıbǝᴚ ɥsɐƆ ɹo ɹǝʞɔı⟘ ʞɔoʇS ɐ ubıssⱯ", "create.packager_link.set": "pǝʇɔǝןǝs uoıʇɐʇsʞɹoʍ pǝʇǝbɹɐ⟘", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 808c104781..583750bc11 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -553,7 +553,6 @@ "block.create.orange_seat": "Orange Seat", "block.create.orange_toolbox": "Orange Toolbox", "block.create.orange_valve_handle": "Orange Valve Handle", - "block.create.order_collector": "Order Collector", "block.create.ornate_iron_window": "Ornate Iron Window", "block.create.ornate_iron_window_pane": "Ornate Iron Window Pane", "block.create.oxidized_copper_shingle_slab": "Oxidized Copper Shingle Slab", @@ -1371,6 +1370,8 @@ "create.package_port.cannot_reach_down": "Cannot connect downward", "create.package_port.too_far": "Too far away", "create.package_port.valid": "Can Connect ✔", + "create.packager.mode_change.defrag": "-> Collect fragments and output completed", + "create.packager.mode_change.regular": "-> Package and unbox items", "create.packager_link.clear": "Cleared selection", "create.packager_link.invalid": "Assign a Stock Ticker or Cash Register before placing", "create.packager_link.set": "Targeted workstation selected", diff --git a/src/generated/resources/assets/create/models/item/order_collector.json b/src/generated/resources/assets/create/models/item/order_collector.json deleted file mode 100644 index a0b3a0ee66..0000000000 --- a/src/generated/resources/assets/create/models/item/order_collector.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "create:block/order_collector/item" -} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/order_collector.json b/src/generated/resources/data/create/loot_tables/blocks/order_collector.json deleted file mode 100644 index 956b16b965..0000000000 --- a/src/generated/resources/data/create/loot_tables/blocks/order_collector.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "create:order_collector" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "create:blocks/order_collector" -} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json index ff37b21a6b..d258a6ed91 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json @@ -126,7 +126,6 @@ "create:package_port", "create:packager_link", "create:stock_ticker", - "create:order_collector", "create:andesite_funnel", "create:andesite_belt_funnel", "create:brass_funnel", diff --git a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java index 3552dff332..97f7209cde 100644 --- a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java +++ b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java @@ -170,8 +170,6 @@ import com.simibubi.create.content.logistics.depot.EjectorRenderer; import com.simibubi.create.content.logistics.funnel.FunnelBlockEntity; import com.simibubi.create.content.logistics.funnel.FunnelInstance; import com.simibubi.create.content.logistics.funnel.FunnelRenderer; -import com.simibubi.create.content.logistics.orderCollector.OrderCollectorBlockEntity; -import com.simibubi.create.content.logistics.orderCollector.OrderCollectorRenderer; import com.simibubi.create.content.logistics.packagePort.PackagePortBlockEntity; import com.simibubi.create.content.logistics.packagePort.PackagePortRenderer; import com.simibubi.create.content.logistics.packager.PackagerBlockEntity; @@ -504,13 +502,6 @@ public class AllBlockEntityTypes { .blockEntity("stock_ticker", StockTickerBlockEntity::new) .validBlocks(AllBlocks.STOCK_TICKER) .register(); - - public static final BlockEntityEntry ORDER_COLLECTOR = REGISTRATE - .blockEntity("order_collector", OrderCollectorBlockEntity::new) - .instance(() -> ShaftInstance::new) - .validBlocks(AllBlocks.ORDER_COLLECTOR) - .renderer(() -> OrderCollectorRenderer::new) - .register(); public static final BlockEntityEntry MECHANICAL_PISTON = REGISTRATE .blockEntity("mechanical_piston", MechanicalPistonBlockEntity::new) diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 5a64d6a738..461b805aa2 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -173,7 +173,6 @@ import com.simibubi.create.content.logistics.funnel.BrassFunnelBlock; import com.simibubi.create.content.logistics.funnel.FunnelGenerator; import com.simibubi.create.content.logistics.funnel.FunnelItem; import com.simibubi.create.content.logistics.funnel.FunnelMovementBehaviour; -import com.simibubi.create.content.logistics.orderCollector.OrderCollectorBlock; import com.simibubi.create.content.logistics.packagePort.PackagePortBlock; import com.simibubi.create.content.logistics.packagePort.PackagePortItem; import com.simibubi.create.content.logistics.packager.PackagerBlock; @@ -1712,19 +1711,6 @@ public class AllBlocks { .simpleItem() .register(); - public static final BlockEntry ORDER_COLLECTOR = - REGISTRATE.block("order_collector", OrderCollectorBlock::new) - .initialProperties(SharedProperties::softMetal) - .properties(p -> p.mapColor(MapColor.TERRACOTTA_BLUE) - .sound(SoundType.NETHERITE_BLOCK)) - .properties(p -> p.noOcclusion()) - .transform(pickaxeOnly()) - .blockstate(BlockStateGen.horizontalBlockProvider(true)) - .transform(BlockStressDefaults.setImpact(2.0)) - .item(AssemblyOperatorBlockItem::new) - .transform(customItemModel()) - .register(); - public static final BlockEntry ANDESITE_FUNNEL = REGISTRATE.block("andesite_funnel", AndesiteFunnelBlock::new) .addLayer(() -> RenderType::cutoutMipped) diff --git a/src/main/java/com/simibubi/create/AllPartialModels.java b/src/main/java/com/simibubi/create/AllPartialModels.java index 76ebc8c49a..6834c7183e 100644 --- a/src/main/java/com/simibubi/create/AllPartialModels.java +++ b/src/main/java/com/simibubi/create/AllPartialModels.java @@ -59,8 +59,7 @@ public class AllPartialModels { BELT_FUNNEL_FLAP = block("belt_funnel/flap"), BELT_TUNNEL_FLAP = block("belt_tunnel/flap"), FLEXPEATER_INDICATOR = block("diodes/indicator"), - ROLLER_WHEEL = block("mechanical_roller/wheel"), - ROLLER_FRAME = block("mechanical_roller/frame"), + ROLLER_WHEEL = block("mechanical_roller/wheel"), ROLLER_FRAME = block("mechanical_roller/frame"), CUCKOO_MINUTE_HAND = block("cuckoo_clock/minute_hand"), CUCKOO_HOUR_HAND = block("cuckoo_clock/hour_hand"), CUCKOO_LEFT_DOOR = block("cuckoo_clock/left_door"), CUCKOO_RIGHT_DOOR = block("cuckoo_clock/right_door"), @@ -100,8 +99,8 @@ public class AllPartialModels { ARM_CLAW_GRIP_UPPER = block("mechanical_arm/upper_claw_grip"), ARM_CLAW_GRIP_LOWER = block("mechanical_arm/lower_claw_grip"), - MECHANICAL_PUMP_COG = block("mechanical_pump/cog"), - FLUID_PIPE_CASING = block("fluid_pipe/casing"), FLUID_VALVE_POINTER = block("fluid_valve/pointer"), + MECHANICAL_PUMP_COG = block("mechanical_pump/cog"), FLUID_PIPE_CASING = block("fluid_pipe/casing"), + FLUID_VALVE_POINTER = block("fluid_valve/pointer"), SPOUT_TOP = block("spout/top"), SPOUT_MIDDLE = block("spout/middle"), SPOUT_BOTTOM = block("spout/bottom"), @@ -114,16 +113,14 @@ public class AllPartialModels { GOGGLES = block("goggles"), EJECTOR_TOP = block("weighted_ejector/top"), - - CHAIN_CONVEYOR_GUARD = block("chain_conveyor/guard"), - CHAIN_CONVEYOR_SHAFT = block("chain_conveyor/shaft"), - - PACKAGE_PORT_BODY = block("package_port/body"), - PACKAGE_PORT_HEAD = block("package_port/head"), + + CHAIN_CONVEYOR_GUARD = block("chain_conveyor/guard"), CHAIN_CONVEYOR_SHAFT = block("chain_conveyor/shaft"), + + PACKAGE_PORT_BODY = block("package_port/body"), PACKAGE_PORT_HEAD = block("package_port/head"), PACKAGE_PORT_TONGUE = block("package_port/tongue"), - PACKAGER_TRAY = block("packager/tray"), PACKAGER_HATCH_OPEN = block("packager/hatch_open"), - PACKAGER_HATCH_CLOSED = block("packager/hatch_closed"), + PACKAGER_TRAY_REGULAR = block("packager/tray_regular"), PACKAGER_TRAY_DEFRAG = block("packager/tray_defrag"), + PACKAGER_HATCH_OPEN = block("packager/hatch_open"), PACKAGER_HATCH_CLOSED = block("packager/hatch_closed"), COPPER_BACKTANK_SHAFT = block("copper_backtank/block_shaft_input"), COPPER_BACKTANK_COGS = block("copper_backtank/block_cogs"), @@ -171,8 +168,7 @@ public class AllPartialModels { BLAZE_GOGGLES = block("blaze_burner/goggles"), BLAZE_GOGGLES_SMALL = block("blaze_burner/goggles_small"), BLAZE_IDLE = block("blaze_burner/blaze/idle"), BLAZE_ACTIVE = block("blaze_burner/blaze/active"), BLAZE_SUPER = block("blaze_burner/blaze/super"), BLAZE_BURNER_FLAME = block("blaze_burner/flame"), - BLAZE_BURNER_RODS = block("blaze_burner/rods_small"), - BLAZE_BURNER_RODS_2 = block("blaze_burner/rods_large"), + BLAZE_BURNER_RODS = block("blaze_burner/rods_small"), BLAZE_BURNER_RODS_2 = block("blaze_burner/rods_large"), BLAZE_BURNER_SUPER_RODS = block("blaze_burner/superheated_rods_small"), BLAZE_BURNER_SUPER_RODS_2 = block("blaze_burner/superheated_rods_large"), @@ -180,16 +176,14 @@ public class AllPartialModels { WHISTLE_MOUTH_MEDIUM = block("steam_whistle/medium_mouth"), WHISTLE_MOUTH_SMALL = block("steam_whistle/small_mouth"), - WATER_WHEEL = block("water_wheel/wheel"), - LARGE_WATER_WHEEL = block("large_water_wheel/block"), + WATER_WHEEL = block("water_wheel/wheel"), LARGE_WATER_WHEEL = block("large_water_wheel/block"), LARGE_WATER_WHEEL_EXTENSION = block("large_water_wheel/block_extension"), CRAFTING_BLUEPRINT_1x1 = entity("crafting_blueprint_small"), CRAFTING_BLUEPRINT_2x2 = entity("crafting_blueprint_medium"), CRAFTING_BLUEPRINT_3x3 = entity("crafting_blueprint_large"), - TRAIN_HAT = entity("train_hat"), - LOGISTICS_HAT = entity("logistics_hat"), + TRAIN_HAT = entity("train_hat"), LOGISTICS_HAT = entity("logistics_hat"), COUPLING_ATTACHMENT = entity("minecart_coupling/attachment"), COUPLING_RING = entity("minecart_coupling/ring"), COUPLING_CONNECTOR = entity("minecart_coupling/connector") @@ -203,12 +197,13 @@ public class AllPartialModels { public static final Map TOOLBOX_LIDS = new EnumMap<>(DyeColor.class); public static final Map> FOLDING_DOORS = new HashMap<>(); public static final List CONTRAPTION_CONTROLS_INDICATOR = new ArrayList<>(); - + public static final Map PACKAGES = new HashMap<>(); public static final Map PACKAGE_RIGGING = new HashMap<>(); static { - for (FluidTransportBehaviour.AttachmentTypes.ComponentPartials type : FluidTransportBehaviour.AttachmentTypes.ComponentPartials.values()) { + for (FluidTransportBehaviour.AttachmentTypes.ComponentPartials type : FluidTransportBehaviour.AttachmentTypes.ComponentPartials + .values()) { Map map = new HashMap<>(); for (Direction d : Iterate.directions) { String asId = Lang.asId(type.name()); @@ -225,11 +220,12 @@ public class AllPartialModels { putFoldingDoor("andesite_door"); putFoldingDoor("copper_door"); - + for (String size : new String[] { "12x12", "10x12", "12x10", "10x8" }) { ResourceLocation key = Create.asResource("cardboard_package_" + size); PACKAGES.put(key, new PartialModel(Create.asResource("item/packages/cardboard_" + size))); - PACKAGE_RIGGING.put(key, new PartialModel(Create.asResource("item/packages/cardboard_" + size + "_rigging"))); + PACKAGE_RIGGING.put(key, + new PartialModel(Create.asResource("item/packages/cardboard_" + size + "_rigging"))); } } diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainPackageInteractionHandler.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainPackageInteractionHandler.java index 19ced5bc68..32796ed4de 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainPackageInteractionHandler.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainPackageInteractionHandler.java @@ -27,6 +27,7 @@ public class ChainPackageInteractionHandler { if (data == null || data.targetPos == null || data.beReference == null) return; AABB bounds = new AABB(data.targetPos, data.targetPos).move(0, -.25, 0) + .expandTowards(0, 0.5, 0) .inflate(0.45); double range = mc.player.getAttribute(ForgeMod.BLOCK_REACH.get()) diff --git a/src/main/java/com/simibubi/create/content/logistics/orderCollector/OrderCollectorBlock.java b/src/main/java/com/simibubi/create/content/logistics/orderCollector/OrderCollectorBlock.java deleted file mode 100644 index 7ef91108be..0000000000 --- a/src/main/java/com/simibubi/create/content/logistics/orderCollector/OrderCollectorBlock.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.simibubi.create.content.logistics.orderCollector; - -import com.simibubi.create.AllBlockEntityTypes; -import com.simibubi.create.content.kinetics.base.HorizontalKineticBlock; -import com.simibubi.create.foundation.block.IBE; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.core.Direction.Axis; -import net.minecraft.world.item.context.BlockPlaceContext; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.LevelReader; -import net.minecraft.world.level.block.entity.BlockEntityType; -import net.minecraft.world.level.block.state.BlockState; - -public class OrderCollectorBlock extends HorizontalKineticBlock implements IBE { - - public OrderCollectorBlock(Properties properties) { - super(properties); - } - - @Override - public BlockState getStateForPlacement(BlockPlaceContext context) { - Direction prefferedSide = getPreferredHorizontalFacing(context); - if (prefferedSide != null) - return defaultBlockState().setValue(HORIZONTAL_FACING, prefferedSide); - return super.getStateForPlacement(context); - } - - @Override - public Axis getRotationAxis(BlockState state) { - return state.getValue(HORIZONTAL_FACING) - .getAxis(); - } - - @Override - public boolean hasShaftTowards(LevelReader world, BlockPos pos, BlockState state, Direction face) { - return face.getAxis() == state.getValue(HORIZONTAL_FACING) - .getAxis(); - } - - @Override - public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pIsMoving) { - IBE.onRemove(pState, pLevel, pPos, pNewState); - } - - @Override - public Class getBlockEntityClass() { - return OrderCollectorBlockEntity.class; - } - - @Override - public BlockEntityType getBlockEntityType() { - return AllBlockEntityTypes.ORDER_COLLECTOR.get(); - } - -} diff --git a/src/main/java/com/simibubi/create/content/logistics/orderCollector/OrderCollectorBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/orderCollector/OrderCollectorBlockEntity.java deleted file mode 100644 index 14a5f484a6..0000000000 --- a/src/main/java/com/simibubi/create/content/logistics/orderCollector/OrderCollectorBlockEntity.java +++ /dev/null @@ -1,342 +0,0 @@ -package com.simibubi.create.content.logistics.orderCollector; - -import static com.simibubi.create.content.kinetics.belt.behaviour.BeltProcessingBehaviour.ProcessingResult.HOLD; -import static com.simibubi.create.content.kinetics.belt.behaviour.BeltProcessingBehaviour.ProcessingResult.PASS; -import static com.simibubi.create.content.kinetics.belt.behaviour.BeltProcessingBehaviour.ProcessingResult.REMOVE; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - -import org.apache.commons.compress.utils.Lists; -import org.apache.commons.lang3.mutable.MutableBoolean; - -import com.simibubi.create.content.kinetics.base.KineticBlockEntity; -import com.simibubi.create.content.kinetics.belt.behaviour.BeltProcessingBehaviour; -import com.simibubi.create.content.kinetics.belt.behaviour.BeltProcessingBehaviour.ProcessingResult; -import com.simibubi.create.content.kinetics.belt.behaviour.DirectBeltInputBehaviour; -import com.simibubi.create.content.kinetics.belt.behaviour.TransportedItemStackHandlerBehaviour; -import com.simibubi.create.content.kinetics.belt.behaviour.TransportedItemStackHandlerBehaviour.TransportedResult; -import com.simibubi.create.content.kinetics.belt.transport.TransportedItemStack; -import com.simibubi.create.content.logistics.box.PackageItem; -import com.simibubi.create.content.logistics.stockTicker.PackageOrder; -import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; - -import net.createmod.catnip.utility.IntAttached; -import net.createmod.catnip.utility.NBTHelper; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListTag; -import net.minecraft.nbt.Tag; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.entity.BlockEntityType; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.AABB; -import net.minecraftforge.items.ItemHandlerHelper; -import net.minecraftforge.items.ItemStackHandler; - -public class OrderCollectorBlockEntity extends KineticBlockEntity { - - protected Map> collectedPackages = new HashMap<>(); - protected List exportingPackages = new ArrayList<>(); - - protected ItemStack visuallyCollectingPackage = ItemStack.EMPTY; - protected int collectingAnimationTicks = 0; - protected ItemStack visuallyDeployingPackage = ItemStack.EMPTY; - protected int deployingAnimationTicks = 0; - - private int exportCooldown = 0; - - public OrderCollectorBlockEntity(BlockEntityType typeIn, BlockPos pos, BlockState state) { - super(typeIn, pos, state); - } - - @Override - protected AABB createRenderBoundingBox() { - return super.createRenderBoundingBox().expandTowards(0, -2, 0); - } - - @Override - public void addBehaviours(List behaviours) { - behaviours.add(new BeltProcessingBehaviour(this).whenItemEnters(this::onItemReceived) - .whileItemHeld(this::whenItemHeld)); - } - - protected ProcessingResult onItemReceived(TransportedItemStack transported, - TransportedItemStackHandlerBehaviour handler) { - if (handler.blockEntity.isVirtual()) - return PASS; - if (getSpeed() == 0) - return PASS; - if (!(transported.stack.getItem() instanceof PackageItem)) - return PASS; - - int orderId = PackageItem.getOrderId(transported.stack); - if (orderId == -1) - return PASS; - return HOLD; - } - - protected ProcessingResult whenItemHeld(TransportedItemStack transported, - TransportedItemStackHandlerBehaviour handler) { - if (!visuallyCollectingPackage.isEmpty()) - return HOLD; - if (!visuallyDeployingPackage.isEmpty()) - return HOLD; - - ItemStack box = transported.stack.copy(); - addPackageFragment(box); - - visuallyCollectingPackage = box; - collectingAnimationTicks = 0; - - handler.handleProcessingOnItem(transported, TransportedResult.removeItem()); - - return REMOVE; - } - - @Override - protected void read(CompoundTag compound, boolean clientPacket) { - super.read(compound, clientPacket); - - boolean wasCollecting = !visuallyCollectingPackage.isEmpty(); - visuallyCollectingPackage = ItemStack.of(compound.getCompound("CollectingItem")); - if (!wasCollecting) - collectingAnimationTicks = 0; - - boolean wasDeploying = !visuallyDeployingPackage.isEmpty(); - visuallyDeployingPackage = ItemStack.of(compound.getCompound("DeployingItem")); - if (!wasDeploying) - deployingAnimationTicks = 0; - - if (clientPacket) - return; - - collectedPackages.clear(); - NBTHelper.iterateCompoundList(compound.getList("CollectedOrders", Tag.TAG_COMPOUND), tag -> collectedPackages - .put(tag.getInt("Id"), NBTHelper.readItemList(tag.getList("Boxes", Tag.TAG_COMPOUND)))); - - exportingPackages = NBTHelper.readItemList(compound.getList("ExportingItems", Tag.TAG_COMPOUND)); - exportCooldown = compound.getInt("ExportCooldown"); - } - - @Override - protected void write(CompoundTag compound, boolean clientPacket) { - super.write(compound, clientPacket); - - compound.put("CollectingItem", visuallyCollectingPackage.serializeNBT()); - compound.put("DeployingItem", visuallyDeployingPackage.serializeNBT()); - - if (clientPacket) - return; - - ListTag collectedNbt = new ListTag(); - for (Entry> entry : collectedPackages.entrySet()) { - CompoundTag tag = new CompoundTag(); - tag.putInt("Id", entry.getKey()); - tag.put("Boxes", NBTHelper.writeItemList(entry.getValue())); - collectedNbt.add(tag); - } - compound.put("CollectedOrders", collectedNbt); - - compound.put("ExportingItems", NBTHelper.writeItemList(exportingPackages)); - compound.putInt("ExportCooldown", exportCooldown); - } - - @Override - public void destroy() { - super.destroy(); - collectedPackages.values() - .forEach(exportingPackages::addAll); - exportingPackages.add(visuallyDeployingPackage); - for (ItemStack box : exportingPackages) - Block.popResource(level, worldPosition, box); - } - - @Override - public void tick() { - super.tick(); - - if (!visuallyCollectingPackage.isEmpty()) { - collectingAnimationTicks++; - if (collectingAnimationTicks == 20) - visuallyCollectingPackage = ItemStack.EMPTY; - exportCooldown = 1; - } - - if (!visuallyDeployingPackage.isEmpty()) { - deployingAnimationTicks++; - if (deployingAnimationTicks == 10) { - if (!level.isClientSide()) { - DirectBeltInputBehaviour directBeltInputBehaviour = - BlockEntityBehaviour.get(level, worldPosition.below(2), DirectBeltInputBehaviour.TYPE); - if (directBeltInputBehaviour != null) { - ItemStack remainder = - directBeltInputBehaviour.handleInsertion(visuallyDeployingPackage, Direction.DOWN, false); - if (!remainder.isEmpty()) - Block.popResource(level, worldPosition.below(), remainder); - } - } - visuallyDeployingPackage = ItemStack.EMPTY; - } - exportCooldown = 1; - } - - if (level.isClientSide()) - return; - if (getSpeed() == 0) - return; - if (exportCooldown > 0) { - exportCooldown--; - return; - } - if (exportingPackages.isEmpty()) - return; - - exportCooldown = 10; - - TransportedItemStackHandlerBehaviour transporter = - BlockEntityBehaviour.get(level, worldPosition.below(2), TransportedItemStackHandlerBehaviour.TYPE); - MutableBoolean hasSpace = new MutableBoolean(true); - if (transporter != null) - transporter.handleCenteredProcessingOnAllItems(0.51f, $ -> { - hasSpace.setFalse(); - return TransportedResult.doNothing(); - }); - - visuallyDeployingPackage = exportingPackages.get(0); - deployingAnimationTicks = 0; - exportingPackages.remove(0); - notifyUpdate(); - } - - private void addPackageFragment(ItemStack box) { - int collectedOrderId = PackageItem.getOrderId(box); - List collectedOrder = collectedPackages.computeIfAbsent(collectedOrderId, $ -> Lists.newArrayList()); - collectedOrder.add(box); - - if (!isOrderComplete(collectedOrderId)) { - notifyUpdate(); - return; - } - - repack(collectedOrderId); - exportCooldown = 1; - } - - private void repack(int orderId) { - String address = ""; - PackageOrder order = null; - List> allItems = new ArrayList<>(); - - for (ItemStack box : collectedPackages.get(orderId)) { - address = PackageItem.getAddress(box); - if (box.hasTag() && box.getTag() - .getCompound("Fragment") - .contains("OrderContext")) - order = PackageOrder.read(box.getTag() - .getCompound("Fragment") - .getCompound("OrderContext")); - ItemStackHandler contents = PackageItem.getContents(box); - Slots: for (int slot = 0; slot < contents.getSlots(); slot++) { - ItemStack stackInSlot = contents.getStackInSlot(slot); - for (IntAttached existing : allItems) { - if (!ItemHandlerHelper.canItemStacksStack(stackInSlot, existing.getValue())) - continue; - existing.setFirst(existing.getFirst() + stackInSlot.getCount()); - continue Slots; - } - allItems.add(IntAttached.with(stackInSlot.getCount(), stackInSlot)); - } - } - - List> orderedStacks = order == null ? Collections.emptyList() : order.stacks(); - List outputSlots = new ArrayList<>(); - - Repack: while (true) { - allItems.removeIf(e -> e.getFirst() == 0); - if (allItems.isEmpty()) - break; - - IntAttached targetedEntry = null; - if (!orderedStacks.isEmpty()) - targetedEntry = orderedStacks.remove(0); - - ItemSearch: for (IntAttached entry : allItems) { - int targetAmount = entry.getFirst(); - if (targetAmount == 0) - continue; - if (targetedEntry != null) { - targetAmount = targetedEntry.getFirst(); - if (!ItemHandlerHelper.canItemStacksStack(entry.getSecond(), targetedEntry.getSecond())) - continue; - } - - while (targetAmount > 0) { - int removedAmount = Math.min(Math.min(targetAmount, entry.getSecond() - .getMaxStackSize()), entry.getFirst()); - if (removedAmount == 0) - continue ItemSearch; - - ItemStack output = ItemHandlerHelper.copyStackWithSize(entry.getSecond(), removedAmount); - targetAmount -= removedAmount; - targetedEntry.setFirst(targetAmount); - entry.setFirst(entry.getFirst() - removedAmount); - outputSlots.add(output); - } - - continue Repack; - } - } - - int currentSlot = 0; - ItemStackHandler target = new ItemStackHandler(PackageItem.SLOTS); - - for (ItemStack item : outputSlots) { - target.setStackInSlot(currentSlot++, item); - if (currentSlot < PackageItem.SLOTS) - continue; - exportingPackages.add(PackageItem.containing(target)); - target = new ItemStackHandler(PackageItem.SLOTS); - currentSlot = 0; - } - - exportingPackages.add(PackageItem.containing(target)); - - for (ItemStack box : exportingPackages) - PackageItem.addAddress(box, address); - - collectedPackages.remove(orderId); - notifyUpdate(); - } - - private boolean isOrderComplete(int orderId) { - boolean finalLinkReached = false; - Links: for (int linkCounter = 0; linkCounter < 1000; linkCounter++) { - if (finalLinkReached) - break; - Packages: for (int packageCounter = 0; packageCounter < 1000; packageCounter++) { - for (ItemStack box : collectedPackages.get(orderId)) { - CompoundTag tag = box.getOrCreateTag() - .getCompound("Fragment"); - if (linkCounter != tag.getInt("LinkIndex")) - continue; - if (packageCounter != tag.getInt("Index")) - continue; - finalLinkReached = tag.getBoolean("IsFinalLink"); - if (tag.getBoolean("IsFinal")) - continue Links; - continue Packages; - } - return false; - } - } - return true; - } - -} diff --git a/src/main/java/com/simibubi/create/content/logistics/orderCollector/OrderCollectorRenderer.java b/src/main/java/com/simibubi/create/content/logistics/orderCollector/OrderCollectorRenderer.java deleted file mode 100644 index d6302643f5..0000000000 --- a/src/main/java/com/simibubi/create/content/logistics/orderCollector/OrderCollectorRenderer.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.simibubi.create.content.logistics.orderCollector; - -import com.jozufozu.flywheel.util.transform.TransformStack; -import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.content.kinetics.base.KineticBlockEntityRenderer; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider.Context; -import net.minecraft.client.renderer.entity.ItemRenderer; -import net.minecraft.util.Mth; -import net.minecraft.world.item.ItemDisplayContext; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.state.BlockState; - -public class OrderCollectorRenderer extends KineticBlockEntityRenderer { - - public OrderCollectorRenderer(Context context) { - super(context); - } - - @Override - public boolean shouldRenderOffScreen(OrderCollectorBlockEntity be) { - return true; - } - - @Override - protected void renderSafe(OrderCollectorBlockEntity be, float partialTicks, PoseStack ms, MultiBufferSource buffer, - int light, int overlay) { - super.renderSafe(be, partialTicks, ms, buffer, light, overlay); - - ItemStack box = be.visuallyCollectingPackage; - boolean collecting = !box.isEmpty(); - if (!collecting) { - box = be.visuallyDeployingPackage; - if (box.isEmpty()) - return; - } - - double progress = 0; - - if (collecting) - progress = Mth.clamp((be.collectingAnimationTicks + partialTicks) / 20f, 0, 1); - else - progress = 1 - Mth.clamp((be.deployingAnimationTicks + partialTicks) / 10f, 0, 1); - - double offset = Mth.lerp(1 - Math.pow(1 - progress, 4), -1.5, -0.26); - float scale = (float) Mth.lerp(1 - Math.pow(1 - progress, 2), 2, 1.5); - - TransformStack msr = TransformStack.cast(ms); - ItemRenderer itemRenderer = Minecraft.getInstance() - .getItemRenderer(); - ms.pushPose(); - msr.centre(); - ms.translate(0, 6 / 16f, 0); - ms.translate(0, offset, 0); - ms.scale(scale, scale, scale); - - itemRenderer.renderStatic(box, ItemDisplayContext.FIXED, light, overlay, ms, buffer, be.getLevel(), 0); - - ms.popPose(); - - } - - @Override - protected BlockState getRenderedBlockState(OrderCollectorBlockEntity be) { - return shaft(getRotationAxisOf(be)); - } - -} diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java index d0da9a0574..c4f0cfb4fb 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java @@ -232,6 +232,8 @@ public class PackagePortBlockEntity extends SmartBlockEntity { } public void tryPullingFromAdjacentInventories() { + if (isAnimationInProgress()) + return; if (target == null || !target.export(level, worldPosition, AllItems.CARDBOARD_PACKAGE_10x12.asStack(), true)) return; for (Direction side : Iterate.directions) { diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackageDefragmenter.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackageDefragmenter.java new file mode 100644 index 0000000000..7863a084a5 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackageDefragmenter.java @@ -0,0 +1,164 @@ +package com.simibubi.create.content.logistics.packager; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.compress.utils.Lists; + +import com.simibubi.create.content.logistics.box.PackageItem; +import com.simibubi.create.content.logistics.stockTicker.PackageOrder; + +import net.createmod.catnip.utility.IntAttached; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.items.ItemHandlerHelper; +import net.minecraftforge.items.ItemStackHandler; + +public class PackageDefragmenter { + + protected Map> collectedPackages = new HashMap<>(); + + public void clear() { + collectedPackages.clear(); + } + + public boolean isFragmented(ItemStack box) { + if (!box.hasTag() || !box.getTag() + .contains("Fragment")) + return false; + + CompoundTag fragTag = box.getTag() + .getCompound("Fragment"); + + return !(fragTag.getInt("LinkIndex") == 0 && fragTag.getBoolean("IsFinalLink") && fragTag.getInt("Index") == 0 + && fragTag.getBoolean("IsFinal")); + } + + public int addPackageFragment(ItemStack box) { + int collectedOrderId = PackageItem.getOrderId(box); + if (collectedOrderId == -1) + return -1; + + List collectedOrder = collectedPackages.computeIfAbsent(collectedOrderId, $ -> Lists.newArrayList()); + collectedOrder.add(box); + + if (!isOrderComplete(collectedOrderId)) + return -1; + + return collectedOrderId; + } + + public List repack(int orderId) { + List exportingPackages = new ArrayList<>(); + String address = ""; + PackageOrder order = null; + List> allItems = new ArrayList<>(); + + for (ItemStack box : collectedPackages.get(orderId)) { + address = PackageItem.getAddress(box); + if (box.hasTag() && box.getTag() + .getCompound("Fragment") + .contains("OrderContext")) + order = PackageOrder.read(box.getTag() + .getCompound("Fragment") + .getCompound("OrderContext")); + ItemStackHandler contents = PackageItem.getContents(box); + Slots: for (int slot = 0; slot < contents.getSlots(); slot++) { + ItemStack stackInSlot = contents.getStackInSlot(slot); + for (IntAttached existing : allItems) { + if (!ItemHandlerHelper.canItemStacksStack(stackInSlot, existing.getValue())) + continue; + existing.setFirst(existing.getFirst() + stackInSlot.getCount()); + continue Slots; + } + allItems.add(IntAttached.with(stackInSlot.getCount(), stackInSlot)); + } + } + + List> orderedStacks = order == null ? Collections.emptyList() : order.stacks(); + List outputSlots = new ArrayList<>(); + + Repack: while (true) { + allItems.removeIf(e -> e.getFirst() == 0); + if (allItems.isEmpty()) + break; + + IntAttached targetedEntry = null; + if (!orderedStacks.isEmpty()) + targetedEntry = orderedStacks.remove(0); + + ItemSearch: for (IntAttached entry : allItems) { + int targetAmount = entry.getFirst(); + if (targetAmount == 0) + continue; + if (targetedEntry != null) { + targetAmount = targetedEntry.getFirst(); + if (!ItemHandlerHelper.canItemStacksStack(entry.getSecond(), targetedEntry.getSecond())) + continue; + } + + while (targetAmount > 0) { + int removedAmount = Math.min(Math.min(targetAmount, entry.getSecond() + .getMaxStackSize()), entry.getFirst()); + if (removedAmount == 0) + continue ItemSearch; + + ItemStack output = ItemHandlerHelper.copyStackWithSize(entry.getSecond(), removedAmount); + targetAmount -= removedAmount; + targetedEntry.setFirst(targetAmount); + entry.setFirst(entry.getFirst() - removedAmount); + outputSlots.add(output); + } + + continue Repack; + } + } + + int currentSlot = 0; + ItemStackHandler target = new ItemStackHandler(PackageItem.SLOTS); + + for (ItemStack item : outputSlots) { + target.setStackInSlot(currentSlot++, item); + if (currentSlot < PackageItem.SLOTS) + continue; + exportingPackages.add(PackageItem.containing(target)); + target = new ItemStackHandler(PackageItem.SLOTS); + currentSlot = 0; + } + + exportingPackages.add(PackageItem.containing(target)); + + for (ItemStack box : exportingPackages) + PackageItem.addAddress(box, address); + + return exportingPackages; + } + + private boolean isOrderComplete(int orderId) { + boolean finalLinkReached = false; + Links: for (int linkCounter = 0; linkCounter < 1000; linkCounter++) { + if (finalLinkReached) + break; + Packages: for (int packageCounter = 0; packageCounter < 1000; packageCounter++) { + for (ItemStack box : collectedPackages.get(orderId)) { + CompoundTag tag = box.getOrCreateTag() + .getCompound("Fragment"); + if (linkCounter != tag.getInt("LinkIndex")) + continue; + if (packageCounter != tag.getInt("Index")) + continue; + finalLinkReached = tag.getBoolean("IsFinalLink"); + if (tag.getBoolean("IsFinal")) + continue Links; + continue Packages; + } + return false; + } + } + return true; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java index bd418243f5..fc531b877b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java @@ -6,14 +6,18 @@ import com.simibubi.create.content.equipment.wrench.IWrenchable; import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.foundation.block.IBE; import com.simibubi.create.foundation.block.WrenchableDirectionalBlock; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.lang.Lang; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.util.StringRepresentable; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; import net.minecraft.world.level.SignalGetter; import net.minecraft.world.level.block.Block; @@ -23,6 +27,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition.Builder; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.EnumProperty; import net.minecraft.world.phys.BlockHitResult; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.ForgeCapabilities; @@ -30,11 +35,22 @@ import net.minecraftforge.items.IItemHandler; public class PackagerBlock extends WrenchableDirectionalBlock implements IBE, IWrenchable { + public static final EnumProperty TYPE = EnumProperty.create("type", PackagerType.class); public static final BooleanProperty POWERED = BlockStateProperties.POWERED; + public enum PackagerType implements StringRepresentable { + REGULAR, DEFRAG; + + @Override + public String getSerializedName() { + return Lang.asId(name()); + } + } + public PackagerBlock(Properties properties) { super(properties); - registerDefaultState(defaultBlockState().setValue(POWERED, false)); + registerDefaultState(defaultBlockState().setValue(TYPE, PackagerType.REGULAR) + .setValue(POWERED, false)); } @Override @@ -106,7 +122,30 @@ public class PackagerBlock extends WrenchableDirectionalBlock implements IBE builder) { - super.createBlockStateDefinition(builder.add(POWERED)); + super.createBlockStateDefinition(builder.add(POWERED, TYPE)); + } + + @Override + public InteractionResult onWrenched(BlockState state, UseOnContext context) { + Level level = context.getLevel(); + BlockPos pos = context.getClickedPos(); + if (level.isClientSide) + return InteractionResult.SUCCESS; + + level.setBlockAndUpdate(pos, state.cycle(TYPE)); + + withBlockEntityDo(level, pos, pte -> { + Player player = context.getPlayer(); + PackagerType value = state.cycle(TYPE) + .getValue(TYPE); + pte.defragmenterActive = value == PackagerType.DEFRAG; + + if (player != null) + player.displayClientMessage( + CreateLang.translateDirect("packager.mode_change." + value.getSerializedName()), true); + }); + + return InteractionResult.SUCCESS; } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java index c50ec84694..647a0f6a80 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java @@ -7,6 +7,7 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.content.logistics.crate.BottomlessItemHandler; import com.simibubi.create.content.logistics.packagePort.PackagePortBlockEntity; +import com.simibubi.create.content.logistics.packager.PackagerBlock.PackagerType; import com.simibubi.create.content.logistics.packagerLink.PackagerLinkBlock; import com.simibubi.create.content.logistics.stockTicker.PackageOrder; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; @@ -59,6 +60,11 @@ public class PackagerBlockEntity extends SmartBlockEntity { private InventorySummary availableItems; private VersionedInventoryTrackerBehaviour invVersionTracker; + // + + public boolean defragmenterActive; + public PackageDefragmenter defragmenter; + public PackagerBlockEntity(BlockEntityType typeIn, BlockPos pos, BlockState state) { super(typeIn, pos, state); redstonePowered = state.getOptionalValue(PackagerBlock.POWERED) @@ -72,6 +78,9 @@ public class PackagerBlockEntity extends SmartBlockEntity { animationInward = true; queuedRequests = new LinkedList<>(); signBasedAddress = ""; + if (AllBlocks.PACKAGER.has(state)) + defragmenterActive = state.getValue(PackagerBlock.TYPE) == PackagerType.DEFRAG; + defragmenter = new PackageDefragmenter(); } @Override @@ -89,15 +98,15 @@ public class PackagerBlockEntity extends SmartBlockEntity { @Override public void tick() { super.tick(); - if (!level.isClientSide() && !queuedRequests.isEmpty()) + if (!level.isClientSide() && !queuedRequests.isEmpty() && !defragmenterActive) attemptToSend(true); if (animationTicks == 0) { previouslyUnwrapped = ItemStack.EMPTY; return; } - + animationTicks--; - + if (animationTicks == 0 && !level.isClientSide()) wakeTheFrogs(); } @@ -141,6 +150,8 @@ public class PackagerBlockEntity extends SmartBlockEntity { public void recheckIfLinksPresent() { redstoneModeActive = true; + if (defragmenterActive) + return; for (Direction d : Iterate.directions) { BlockState adjacentState = level.getBlockState(worldPosition.relative(d)); if (!AllBlocks.PACKAGER_LINK.has(adjacentState)) @@ -166,46 +177,64 @@ public class PackagerBlockEntity extends SmartBlockEntity { if (targetInv == null) return false; - for (int slot = 0; slot < targetInv.getSlots(); slot++) { - ItemStack itemInSlot = targetInv.getStackInSlot(slot); - int itemsAddedToSlot = 0; - for (int boxSlot = 0; boxSlot < contents.getSlots(); boxSlot++) { - ItemStack toInsert = contents.getStackInSlot(boxSlot); - if (toInsert.isEmpty()) + boolean targetIsCreativeCrate = targetInv instanceof BottomlessItemHandler; + + if (defragmenterActive) { + boolean anySpace = false; + for (int slot = 0; slot < targetInv.getSlots(); slot++) { + ItemStack remainder = targetInv.insertItem(slot, box, simulate); + if (!remainder.isEmpty()) continue; - if (targetInv.insertItem(slot, toInsert, true) - .getCount() == toInsert.getCount()) - continue; - if (itemInSlot.isEmpty()) { - int maxStackSize = targetInv.getSlotLimit(slot); - if (maxStackSize < toInsert.getCount()) { - toInsert.shrink(maxStackSize); - toInsert = ItemHandlerHelper.copyStackWithSize(toInsert, maxStackSize); - } else - contents.setStackInSlot(boxSlot, ItemStack.EMPTY); - itemInSlot = toInsert; - targetInv.insertItem(slot, toInsert, simulate); - continue; - } - if (!ItemHandlerHelper.canItemStacksStack(toInsert, itemInSlot)) - continue; - int insertedAmount = toInsert.getCount() - targetInv.insertItem(slot, toInsert, simulate) - .getCount(); - int slotLimit = (int) ((targetInv.getStackInSlot(slot) - .isEmpty() ? itemInSlot.getMaxStackSize() / 64f : 1) * targetInv.getSlotLimit(slot)); - int insertableAmountWithPreviousItems = - Math.min(toInsert.getCount(), slotLimit - itemInSlot.getCount() - itemsAddedToSlot); - int added = Math.min(insertedAmount, insertableAmountWithPreviousItems); - contents.setStackInSlot(boxSlot, - ItemHandlerHelper.copyStackWithSize(toInsert, toInsert.getCount() - added)); + anySpace = true; + break; } + + if (!targetIsCreativeCrate && !anySpace) + return false; } - if (!(targetInv instanceof BottomlessItemHandler)) - for (int boxSlot = 0; boxSlot < contents.getSlots(); boxSlot++) - if (!contents.getStackInSlot(boxSlot) - .isEmpty()) - return false; + if (!defragmenterActive) { + for (int slot = 0; slot < targetInv.getSlots(); slot++) { + ItemStack itemInSlot = targetInv.getStackInSlot(slot); + int itemsAddedToSlot = 0; + for (int boxSlot = 0; boxSlot < contents.getSlots(); boxSlot++) { + ItemStack toInsert = contents.getStackInSlot(boxSlot); + if (toInsert.isEmpty()) + continue; + if (targetInv.insertItem(slot, toInsert, true) + .getCount() == toInsert.getCount()) + continue; + if (itemInSlot.isEmpty()) { + int maxStackSize = targetInv.getSlotLimit(slot); + if (maxStackSize < toInsert.getCount()) { + toInsert.shrink(maxStackSize); + toInsert = ItemHandlerHelper.copyStackWithSize(toInsert, maxStackSize); + } else + contents.setStackInSlot(boxSlot, ItemStack.EMPTY); + itemInSlot = toInsert; + targetInv.insertItem(slot, toInsert, simulate); + continue; + } + if (!ItemHandlerHelper.canItemStacksStack(toInsert, itemInSlot)) + continue; + int insertedAmount = toInsert.getCount() - targetInv.insertItem(slot, toInsert, simulate) + .getCount(); + int slotLimit = (int) ((targetInv.getStackInSlot(slot) + .isEmpty() ? itemInSlot.getMaxStackSize() / 64f : 1) * targetInv.getSlotLimit(slot)); + int insertableAmountWithPreviousItems = + Math.min(toInsert.getCount(), slotLimit - itemInSlot.getCount() - itemsAddedToSlot); + int added = Math.min(insertedAmount, insertableAmountWithPreviousItems); + contents.setStackInSlot(boxSlot, + ItemHandlerHelper.copyStackWithSize(toInsert, toInsert.getCount() - added)); + } + } + + if (!targetIsCreativeCrate) + for (int boxSlot = 0; boxSlot < contents.getSlots(); boxSlot++) + if (!contents.getStackInSlot(boxSlot) + .isEmpty()) + return false; + } if (simulate) return true; @@ -220,10 +249,16 @@ public class PackagerBlockEntity extends SmartBlockEntity { public void attemptToSend(boolean requestQueue) { if (!heldBox.isEmpty() || animationTicks != 0) return; + IItemHandler targetInv = targetInventory.getInventory(); if (targetInv == null || targetInv instanceof PackagerItemHandler) return; + if (defragmenterActive) { + attemptToDefrag(targetInv); + return; + } + boolean anyItemPresent = false; ItemStackHandler extractedItems = new ItemStackHandler(PackageItem.SLOTS); ItemStack extractedPackageItem = ItemStack.EMPTY; @@ -342,6 +377,57 @@ public class PackagerBlockEntity extends SmartBlockEntity { notifyUpdate(); } + protected void attemptToDefrag(IItemHandler targetInv) { + defragmenter.clear(); + int completedOrderId = -1; + + for (int slot = 0; slot < targetInv.getSlots(); slot++) { + ItemStack extracted = targetInv.extractItem(slot, 1, true); + if (extracted.isEmpty() || !PackageItem.isPackage(extracted)) + continue; + + if (!defragmenter.isFragmented(extracted)) { + targetInv.extractItem(slot, 1, false); + heldBox = extracted.copy(); + animationInward = false; + animationTicks = CYCLE; + notifyUpdate(); + return; + } + + completedOrderId = defragmenter.addPackageFragment(extracted); + if (completedOrderId != -1) + break; + } + + if (completedOrderId == -1) + return; + + List boxesToExport = defragmenter.repack(completedOrderId); + + for (int slot = 0; slot < targetInv.getSlots(); slot++) { + ItemStack extracted = targetInv.extractItem(slot, 1, true); + if (extracted.isEmpty() || !PackageItem.isPackage(extracted)) + continue; + if (PackageItem.getOrderId(extracted) != completedOrderId) + continue; + targetInv.extractItem(slot, 1, false); + } + + if (boxesToExport.isEmpty()) + return; + + heldBox = boxesToExport.get(0) + .copy(); + animationInward = false; + animationTicks = CYCLE; + + for (int i = 1; i < boxesToExport.size(); i++) + ItemHandlerHelper.insertItem(targetInv, boxesToExport.get(i), false); + + notifyUpdate(); + } + protected void updateSignAddress() { signBasedAddress = ""; for (Direction side : Iterate.directions) { @@ -385,6 +471,7 @@ public class PackagerBlockEntity extends SmartBlockEntity { signBasedAddress = compound.getString("SignAddress"); heldBox = ItemStack.of(compound.getCompound("HeldBox")); previouslyUnwrapped = ItemStack.of(compound.getCompound("InsertedBox")); + defragmenterActive = compound.getBoolean("Defrag"); if (clientPacket) return; queuedRequests = @@ -400,6 +487,7 @@ public class PackagerBlockEntity extends SmartBlockEntity { compound.putString("SignAddress", signBasedAddress); compound.put("HeldBox", heldBox.serializeNBT()); compound.put("InsertedBox", previouslyUnwrapped.serializeNBT()); + compound.putBoolean("Defrag", defragmenterActive); if (clientPacket) return; compound.put("QueuedRequests", NBTHelper.writeCompoundList(queuedRequests, PackagingRequest::toNBT)); diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerGenerator.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerGenerator.java index 825d261727..13d1b9c2c0 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerGenerator.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerGenerator.java @@ -25,9 +25,11 @@ public class PackagerGenerator extends SpecialBlockStateGen { @Override public ModelFile getModel(DataGenContext ctx, RegistrateBlockstateProvider prov, BlockState state) { + String type = state.getValue(PackagerBlock.TYPE) + .getSerializedName(); return state.getValue(PackagerBlock.FACING) - .getAxis() == Axis.Y ? AssetLookup.partialBaseModel(ctx, prov, "vertical") - : AssetLookup.partialBaseModel(ctx, prov); + .getAxis() == Axis.Y ? AssetLookup.partialBaseModel(ctx, prov, type, "vertical") + : AssetLookup.partialBaseModel(ctx, prov, type); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerRenderer.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerRenderer.java index 8cf967ca4b..ec1ed9aa97 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerRenderer.java @@ -4,6 +4,7 @@ import com.jozufozu.flywheel.core.PartialModel; import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllPartialModels; +import com.simibubi.create.content.logistics.packager.PackagerBlock.PackagerType; import com.simibubi.create.foundation.blockEntity.renderer.SmartBlockEntityRenderer; import net.createmod.catnip.render.CachedBuffers; @@ -53,7 +54,10 @@ public class PackagerRenderer extends SmartBlockEntityRenderer Package and unbox items", + "create.packager.mode_change.defrag": "-> Collect fragments and output completed", "create.display_link.set": "Targeted position selected", "create.display_link.success": "Successfully bound to targeted position", diff --git a/src/main/resources/assets/create/models/block/order_collector/block.json b/src/main/resources/assets/create/models/block/order_collector/block.json deleted file mode 100644 index 335b9419d9..0000000000 --- a/src/main/resources/assets/create/models/block/order_collector/block.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "credit": "Made with Blockbench", - "texture_size": [32, 32], - "textures": { - "0": "create:block/order_collector", - "particle": "create:block/order_collector" - }, - "elements": [ - { - "name": "Top", - "from": [0, 14, 0], - "to": [16, 16, 16], - "faces": { - "north": {"uv": [8, 0, 16, 1], "texture": "#0"}, - "east": {"uv": [8, 8, 16, 9], "texture": "#0"}, - "south": {"uv": [8, 0, 16, 1], "texture": "#0"}, - "west": {"uv": [8, 8, 16, 9], "texture": "#0"}, - "up": {"uv": [0, 0, 8, 8], "texture": "#0"}, - "down": {"uv": [0, 0, 8, 8], "texture": "#0"} - } - }, - { - "name": "Core", - "from": [2, 2, 0.95], - "to": [14, 14, 15.05], - "faces": { - "north": {"uv": [9, 1, 15, 7], "texture": "#0"}, - "south": {"uv": [9, 1, 15, 7], "texture": "#0"}, - "down": {"uv": [1, 8.5, 7, 15.55], "texture": "#0"} - } - }, - { - "name": "Side", - "from": [14, 0, 0], - "to": [16, 14, 16], - "faces": { - "north": {"uv": [8, 1, 9, 8], "texture": "#0"}, - "east": {"uv": [8, 9, 16, 16], "texture": "#0"}, - "south": {"uv": [15, 1, 16, 8], "texture": "#0"}, - "west": {"uv": [8, 9, 16, 16], "texture": "#0"}, - "down": {"uv": [0, 8, 1, 16], "rotation": 180, "texture": "#0"} - } - }, - { - "name": "Side", - "from": [0, 0, 0], - "to": [2, 14, 16], - "faces": { - "north": {"uv": [15, 1, 16, 8], "texture": "#0"}, - "east": {"uv": [8, 9, 16, 16], "texture": "#0"}, - "south": {"uv": [8, 1, 9, 8], "texture": "#0"}, - "west": {"uv": [8, 9, 16, 16], "texture": "#0"}, - "down": {"uv": [0, 8, 1, 16], "texture": "#0"} - } - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/order_collector/item.json b/src/main/resources/assets/create/models/block/order_collector/item.json deleted file mode 100644 index d87f3f6bf8..0000000000 --- a/src/main/resources/assets/create/models/block/order_collector/item.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "credit": "Made with Blockbench", - "parent": "block/block", - "texture_size": [32, 32], - "textures": { - "0": "create:block/order_collector", - "2": "create:block/axis_top", - "3": "create:block/axis", - "particle": "create:block/order_collector" - }, - "elements": [ - { - "name": "Top", - "from": [0, 14, 0], - "to": [16, 16, 16], - "faces": { - "north": {"uv": [8, 0, 16, 1], "texture": "#0"}, - "east": {"uv": [8, 8, 16, 9], "texture": "#0"}, - "south": {"uv": [8, 0, 16, 1], "texture": "#0"}, - "west": {"uv": [8, 8, 16, 9], "texture": "#0"}, - "up": {"uv": [0, 0, 8, 8], "texture": "#0"}, - "down": {"uv": [0, 0, 8, 8], "texture": "#0"} - } - }, - { - "name": "Core", - "from": [2, 2, 0.95], - "to": [14, 14, 15.05], - "faces": { - "north": {"uv": [9, 1, 15, 7], "texture": "#0"}, - "south": {"uv": [9, 1, 15, 7], "texture": "#0"}, - "down": {"uv": [1, 8.5, 7, 15.55], "texture": "#0"} - } - }, - { - "name": "Side", - "from": [14, 0, 0], - "to": [16, 14, 16], - "faces": { - "north": {"uv": [8, 1, 9, 8], "texture": "#0"}, - "east": {"uv": [8, 9, 16, 16], "texture": "#0"}, - "south": {"uv": [15, 1, 16, 8], "texture": "#0"}, - "west": {"uv": [8, 9, 16, 16], "texture": "#0"}, - "down": {"uv": [0, 8, 1, 16], "rotation": 180, "texture": "#0"} - } - }, - { - "name": "Side", - "from": [0, 0, 0], - "to": [2, 14, 16], - "faces": { - "north": {"uv": [15, 1, 16, 8], "texture": "#0"}, - "east": {"uv": [8, 9, 16, 16], "texture": "#0"}, - "south": {"uv": [8, 1, 9, 8], "texture": "#0"}, - "west": {"uv": [8, 9, 16, 16], "texture": "#0"}, - "down": {"uv": [0, 8, 1, 16], "texture": "#0"} - } - }, - { - "from": [6, 6, 0], - "to": [10, 10, 16], - "faces": { - "north": {"uv": [6, 6, 10, 10], "texture": "#2"}, - "east": {"uv": [6, 0, 10, 16], "rotation": 90, "texture": "#3"}, - "south": {"uv": [6, 6, 10, 10], "texture": "#2"}, - "west": {"uv": [6, 0, 10, 16], "rotation": 90, "texture": "#3"}, - "up": {"uv": [6, 0, 10, 16], "rotation": 180, "texture": "#3"}, - "down": {"uv": [6, 0, 10, 16], "rotation": 180, "texture": "#3"} - } - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/packager/block_defrag.json b/src/main/resources/assets/create/models/block/packager/block_defrag.json new file mode 100644 index 0000000000..305cabc9e4 --- /dev/null +++ b/src/main/resources/assets/create/models/block/packager/block_defrag.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/packager/block_regular", + "textures": { + "0": "create:block/packager_block_defrag", + "particle": "create:block/packager_block_defrag" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/packager/block_defrag_vertical.json b/src/main/resources/assets/create/models/block/packager/block_defrag_vertical.json new file mode 100644 index 0000000000..fc39fe031e --- /dev/null +++ b/src/main/resources/assets/create/models/block/packager/block_defrag_vertical.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/packager/block_regular_vertical", + "textures": { + "0": "create:block/packager_block_defrag", + "particle": "create:block/packager_block_defrag" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/packager/block.json b/src/main/resources/assets/create/models/block/packager/block_regular.json similarity index 100% rename from src/main/resources/assets/create/models/block/packager/block.json rename to src/main/resources/assets/create/models/block/packager/block_regular.json diff --git a/src/main/resources/assets/create/models/block/packager/block_vertical.json b/src/main/resources/assets/create/models/block/packager/block_regular_vertical.json similarity index 100% rename from src/main/resources/assets/create/models/block/packager/block_vertical.json rename to src/main/resources/assets/create/models/block/packager/block_regular_vertical.json diff --git a/src/main/resources/assets/create/models/block/packager/item.json b/src/main/resources/assets/create/models/block/packager/item.json index 80b422fe53..2a3af21094 100644 --- a/src/main/resources/assets/create/models/block/packager/item.json +++ b/src/main/resources/assets/create/models/block/packager/item.json @@ -2,9 +2,8 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "0": "create:block/packager_block", - "1": "create:block/packager_door_closed", - "2": "create:block/packager_tray", + "1": "create:block/packager_block", + "2": "create:block/packager_door_closed", "3": "create:block/axis", "particle": "create:block/packager_block" }, @@ -15,12 +14,12 @@ "to": [16, 16, 16], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [8, 0, 16, 8], "texture": "#0"}, - "east": {"uv": [8, 0, 16, 8], "texture": "#0"}, - "south": {"uv": [8, 0, 16, 8], "texture": "#0"}, - "west": {"uv": [8, 0, 16, 8], "texture": "#0"}, - "up": {"uv": [0, 0, 8, 8], "rotation": 180, "texture": "#0"}, - "down": {"uv": [0, 8, 8, 16], "rotation": 180, "texture": "#0"} + "north": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "up": {"uv": [0, 0, 8, 8], "rotation": 180, "texture": "#1"}, + "down": {"uv": [0, 8, 8, 16], "rotation": 180, "texture": "#1"} } }, { @@ -29,26 +28,12 @@ "to": [0, 16, 16], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [8, 0, 16, 8], "texture": "#0"}, - "east": {"uv": [8, 0, 16, 8], "texture": "#0"}, - "south": {"uv": [8, 0, 16, 8], "texture": "#0"}, - "west": {"uv": [8, 0, 16, 8], "texture": "#0"}, - "up": {"uv": [0, 0, 8, 8], "rotation": 180, "texture": "#0"}, - "down": {"uv": [0, 8, 8, 16], "rotation": 180, "texture": "#0"} - } - }, - { - "name": "tray", - "from": [2, 2, 1.5], - "to": [14, 4, 14.5], - "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 16]}, - "faces": { - "north": {"uv": [2, 14, 14, 16], "texture": "#2"}, - "east": {"uv": [13, 2, 15, 15], "rotation": 90, "texture": "#2"}, - "south": {"uv": [2, 14, 14, 16], "texture": "#2"}, - "west": {"uv": [13, 2, 15, 15], "rotation": 90, "texture": "#2"}, - "up": {"uv": [2, 2, 14, 15], "rotation": 180, "texture": "#2"}, - "down": {"uv": [2, 2, 14, 15], "rotation": 180, "texture": "#2"} + "north": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "up": {"uv": [0, 0, 8, 8], "rotation": 180, "texture": "#1"}, + "down": {"uv": [0, 8, 8, 16], "rotation": 180, "texture": "#1"} } }, { @@ -78,12 +63,24 @@ "to": [15, 15, 18], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [15, 1, 1, 15], "texture": "#1"}, - "east": {"uv": [8, 15.5, 9.5, 8.5], "texture": "#0"}, - "south": {"uv": [1, 1, 15, 15], "texture": "#1"}, - "west": {"uv": [8, 15.5, 9.5, 8.5], "texture": "#0"}, - "up": {"uv": [8, 15.5, 9.5, 8.5], "rotation": 270, "texture": "#0"}, - "down": {"uv": [8, 15.5, 9.5, 8.5], "rotation": 270, "texture": "#0"} + "north": {"uv": [15, 1, 1, 15], "texture": "#2"}, + "east": {"uv": [8, 15.5, 9.5, 8.5], "texture": "#1"}, + "south": {"uv": [1, 1, 15, 15], "texture": "#2"}, + "west": {"uv": [8, 15.5, 9.5, 8.5], "texture": "#1"}, + "up": {"uv": [8, 15.5, 9.5, 8.5], "rotation": 270, "texture": "#1"}, + "down": {"uv": [8, 15.5, 9.5, 8.5], "rotation": 270, "texture": "#1"} + } + }, + { + "from": [2, 2, 1.5], + "to": [14, 4, 14.5], + "faces": { + "north": {"uv": [9.5, 15, 15.5, 16], "texture": "#1"}, + "east": {"uv": [15, 9, 16, 15.5], "rotation": 90, "texture": "#1"}, + "south": {"uv": [9.5, 15, 15.5, 16], "texture": "#1"}, + "west": {"uv": [15, 9, 16, 15.5], "rotation": 90, "texture": "#1"}, + "up": {"uv": [9.5, 9, 15.5, 15.5], "texture": "#1"}, + "down": {"uv": [9.5, 9, 15.5, 15.5], "texture": "#1"} } } ], @@ -94,23 +91,30 @@ "color": 0, "children": [0, 1] }, - { - "name": "Tray", - "origin": [0, 0, 0], - "color": 0, - "children": [2] - }, { "name": "Rails Horizontal", "origin": [0, 0, 0], "color": 0, - "children": [3, 4] + "children": [2, 3] }, { "name": "Door", "origin": [0, 0, 0], "color": 0, - "children": [5] + "children": [4] + }, + { + "name": "tray_regular", + "origin": [8, 8, 8], + "color": 0, + "children": [ + { + "name": "Tray", + "origin": [0, 0, 0], + "color": 0, + "children": [5] + } + ] } ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/packager/tray.json b/src/main/resources/assets/create/models/block/packager/tray.json deleted file mode 100644 index 08847e1415..0000000000 --- a/src/main/resources/assets/create/models/block/packager/tray.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "credit": "Made with Blockbench", - "textures": { - "4": "create:block/packager_tray" - }, - "elements": [ - { - "from": [2, 2, 1.5], - "to": [14, 4, 14.5], - "faces": { - "north": {"uv": [2, 14, 14, 16], "texture": "#4"}, - "east": {"uv": [13, 2, 15, 15], "rotation": 90, "texture": "#4"}, - "south": {"uv": [2, 14, 14, 16], "texture": "#4"}, - "west": {"uv": [13, 2, 15, 15], "rotation": 90, "texture": "#4"}, - "up": {"uv": [2, 2, 14, 15], "texture": "#4"}, - "down": {"uv": [2, 2, 14, 15], "texture": "#4"} - } - } - ], - "groups": [ - { - "name": "Tray", - "origin": [0, 0, 0], - "children": [0] - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/packager/tray_defrag.json b/src/main/resources/assets/create/models/block/packager/tray_defrag.json new file mode 100644 index 0000000000..9f7cb24766 --- /dev/null +++ b/src/main/resources/assets/create/models/block/packager/tray_defrag.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/packager/tray_regular", + "textures": { + "1": "create:block/packager_block_defrag" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/packager/tray_regular.json b/src/main/resources/assets/create/models/block/packager/tray_regular.json new file mode 100644 index 0000000000..0c30ea499a --- /dev/null +++ b/src/main/resources/assets/create/models/block/packager/tray_regular.json @@ -0,0 +1,30 @@ +{ + "credit": "Made with Blockbench", + "texture_size": [32, 32], + "textures": { + "1": "create:block/packager_block", + "particle": "create:block/packager_block" + }, + "elements": [ + { + "from": [2, 2, 1.5], + "to": [14, 4, 14.5], + "faces": { + "north": {"uv": [9.5, 15, 15.5, 16], "texture": "#1"}, + "east": {"uv": [15, 9, 16, 15.5], "rotation": 90, "texture": "#1"}, + "south": {"uv": [9.5, 15, 15.5, 16], "texture": "#1"}, + "west": {"uv": [15, 9, 16, 15.5], "rotation": 90, "texture": "#1"}, + "up": {"uv": [9.5, 9, 15.5, 15.5], "texture": "#1"}, + "down": {"uv": [9.5, 9, 15.5, 15.5], "texture": "#1"} + } + } + ], + "groups": [ + { + "name": "Tray", + "origin": [0, 0, 0], + "color": 0, + "children": [0] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/block/order_collector.png b/src/main/resources/assets/create/textures/block/order_collector.png deleted file mode 100644 index 237e8d9760260cfc44589baef922d671438ab09b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 518 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCilW1AIbU4Xi92JzRpr12Z#|TAIq|&z`(z+d3DIC~a*+QxjWT8xKdvfY7Ld zw48QhLqjJZCm_Jp#l_0PLP}DSnHgl2g}J${jg6n5pRTTP@V?!fkZIiF*{^e)Xl z7rpp|>E4<{7cG*MqCd2WSMv=?vj>J8d@bxH7Q z)48V~6Lao6}vUAyWEFGZOg-htd#-J7~R(}#DrBIkgosDnHl)Z@v>Zv@EZM$ zDU}S0am)%GMLCN5c@AmcV_I||lUqky`Ay@5EgUW7dsz9LnyOn_%vqi&<|^(!!Fj^j zNTugg+K&IT-=A5b#lPW~XfIz_c%{bl(5DMy%IC3f`tR7Hlz4P$v==a789ZJ6T-G@y GGywn!u*bOo diff --git a/src/main/resources/assets/create/textures/block/package_port.png b/src/main/resources/assets/create/textures/block/package_port.png deleted file mode 100644 index ca22049ef191da25935010716503ad5a003f8cfe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 263 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G|&0G|+711k$h50~KZz|72~mZtLgvnTJ_woY5y(A31%*2crdBMPW+4p;LF zAjMM>=PdAuEM{QfI}E~%$MaXD00l!lT^vI+f{*rkay2mUFz;Tn z`v3p+f-VR7E!v&hmQ8(pINs^XpMz6w3eI%2c&OF(>gKCgbM*pT&gL1v@oT-?6#bVg r?8b`KP7@dI;hJP4saasRFR*ZqNG*p%@xOkcMGOp{u6{1-oD!Me zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00YxWL_t(o!?l-BXd`79#(ydK zQ?hBo1R4mF6ne0hEz&I(n%#qfdRUeftr6Fwq$&O@~ZoVLXg8o9s54e?FH?hVS{lXWsXn_jxCD;Znhs zk_pnO2{LJkUZCj)x_N?8ZvZe1KP)8^%uY`sXD5-fIr6gn5J3?lxUUF-P^$>FM!9kf zFcd$WPE8&8T1e z{L7x#h=$GQdvCpoA_T=-H(h`qzy5^rSd?hk1)z1$YcJ8TOa0X0sh8gkQdoTU>fjOZ zIUj%a1xCHWf@JZ;^KYPZcA?vjsqWJc@3%Fl~?b)3-O+GvY|e1Y??RAk-?w zm1Vcr!;34+u28FJy20%96jCxl!!QwQm4;zbRy6Kvf1%Yaw7L~sx3BR%D6E?&2(`w- z+zeN5eD1cV!#9y`W}=%XtiJXNiV%FY{v7~UUVr-`!9uMfXLAAXkK`k~T6~VYEE5{m zj$gd|BtosRwSO4c^1s37U7SCUoSh`}(TDH2?Hlxh_6>S<&~6B=u3mHfCz_p}>iN}c zkJ#4!As6S*bN%|4eT(TxL9dovTv>M8Q*e88m!~g1j!?wrv66SWd9V{N_jTQ^O`?q55W zLp1D?kW%DjnRIGmcmeGZXb*ckns$rixyYHk|0M!V+iSsoE4G@RfJi(->s|=kwu1FT z*FZN!{wc)xc(lWmMm7<3gKb-k$D$pF`@fFm(6n0}X&R}32VK<{Vl`WVJ^T0kwIdaf zmt|tHcyL(zf!%6nfn-8^B;s5dBAj{BYm%9Ue`dIOa8H$Z^(x2*sG002ovPDHLkV1f<>6ifgB literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/packager_tray.png b/src/main/resources/assets/create/textures/block/packager_tray.png deleted file mode 100644 index 4f9ed8f118d558d394636f81080aab686c34b9a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 672 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`VW|HS_FtW7^N6kfixo!%P>mA*(yLj!-}0x z4*@C8d^fjZ5FZR~X>B_PWN;REL;?l%ltGxWVyS%@P>{XE)7O>#DXWNxqK?Hn*;b&C zWQl7;iF1B#Zfaf$gL6@8Vo7R>LV0FMhJw4NZ$Nk>pE%HRM^6{W5DUS%lMVe2I|#U5 z=ip>zHVR+RV8<%!Sim@6QMCL6W0B~kUrdfIeM+_>GK|X2o;#oD{<$cy`;^DEp7j6! zer~pwPTL&0W|dZ(Y;OMX+HJY<7w?ux-TrD-lfUoqMUBd}52qfUpJTV-`{&9u7L~ZT z`O*AHL&IN$y^=3{>e2@lY3suE1lt}t9M@U+A1{h@Z+M1NgX2o>+=5HjabhrxX`JM zE5BKn!$4*Bw<-Deq8%r{->R@OZd-o(?pC?R7khK=^S#!XB+2OcE^7JPRAKG&x)sJu zd~J>o?=j|VUvOKpU;ps~MK3XiXN_L3rZ+2JQ{nPf3_ehk?ZOyvbaqk21|#JQ&X+n) kad&*TloQ%1zwPBYk4UlE6M-R4`vk$@>FVdQ&MBb@0C#ZHlmGw# From 81acc801de613f6022c49fe936e20ef08a7ce828 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 5 Jul 2024 11:45:50 +0200 Subject: [PATCH 038/515] Bugs in the box - Fixed some issues with the package entity - Package port filter slot is now on top --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 4 +- .../tags/blocks/relocation_not_supported.json | 1 + .../java/com/simibubi/create/AllBlocks.java | 2 + .../DirectionalExtenderScrollOptionSlot.java | 10 +++-- .../ContraptionControlsBlockEntity.java | 5 ++- .../actors/roller/RollerBlockEntity.java | 9 ++-- .../elevator/ElevatorControlsHandler.java | 17 ++++---- .../pipes/SmartFluidPipeBlockEntity.java | 5 ++- .../crank/ValveHandleBlockEntity.java | 5 ++- .../kinetics/deployer/DeployerFilterSlot.java | 6 ++- .../mechanicalArm/ArmBlockEntity.java | 3 +- .../motor/CreativeMotorBlockEntity.java | 9 ++-- .../content/kinetics/saw/SawFilterSlot.java | 6 ++- .../steamEngine/SteamEngineValueBox.java | 8 ++-- .../content/logistics/box/PackageEntity.java | 8 +--- .../logistics/chute/AbstractChuteBlock.java | 4 +- .../logistics/chute/SmartChuteBlock.java | 2 +- .../SmartChuteFilterSlotPositioning.java | 4 +- .../crate/CreativeCrateBlockEntity.java | 5 ++- .../logistics/depot/EjectorBlockEntity.java | 9 ++-- .../content/logistics/funnel/FunnelBlock.java | 4 +- .../funnel/FunnelFilterSlotPositioning.java | 12 +++--- .../packagePort/PackagePortBlock.java | 9 ++++ .../packagePort/PackagePortBlockEntity.java | 23 +++++++---- .../PackagePortFilterSlotPositioning.java | 41 ++++++++++++------- .../packagePort/PackagePortRenderer.java | 29 +++++++++++-- .../packager/PackagerBlockEntity.java | 8 +--- .../redstone/FilteredDetectorFilterSlot.java | 6 ++- .../redstone/diodes/BrassDiodeScrollSlot.java | 6 ++- .../content/redstone/link/LinkBehaviour.java | 2 +- .../content/redstone/link/LinkHandler.java | 4 +- .../content/redstone/link/LinkRenderer.java | 2 +- .../link/RedstoneLinkFrequencySlot.java | 6 ++- .../observer/TrackObserverBlockEntity.java | 5 ++- .../blockEntity/behaviour/ValueBox.java | 14 +++++-- .../behaviour/ValueBoxTransform.java | 37 +++++++++-------- .../EdgeInteractionRenderer.java | 7 ++-- .../filtering/FilteringBehaviour.java | 2 +- .../filtering/FilteringRenderer.java | 20 +++++---- .../filtering/SidedFilteringBehaviour.java | 20 ++++----- .../scrollValue/ScrollValueBehaviour.java | 2 +- 41 files changed, 237 insertions(+), 144 deletions(-) diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 7d41f61d6e..8f1725eebe 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-07-01T12:19:36.8328674 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-07-05T10:54:30.6312512 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -4255,7 +4255,7 @@ de1fc89be6a52473d526d3efe0204b9b8489058c data/forge/tags/blocks/glass_panes.json 81b107ada9c6ac5679a21f8c6a006bf230f69c39 data/forge/tags/blocks/ores/zinc.json e475ad1c52bffedfc544e5331a87c1f5c45149fd data/forge/tags/blocks/ores_in_ground/deepslate.json 2f6068972e364599b6849dc46fcb0724d4219d53 data/forge/tags/blocks/ores_in_ground/stone.json -2589b135c0e96ad29076569e144528fe32ea5b39 data/forge/tags/blocks/relocation_not_supported.json +8a5988e68f3a41341b486784c29d00e16d5272f7 data/forge/tags/blocks/relocation_not_supported.json b3af02a6fa3dc41bc3f4db933485f22b202deea3 data/forge/tags/blocks/storage_blocks.json 7d10cdf9e46a79753d4437c7bb958e3ab8bf0c89 data/forge/tags/blocks/storage_blocks/andesite_alloy.json 70bba470740dc7a77f51b4cb1747a105b62d4bde data/forge/tags/blocks/storage_blocks/brass.json diff --git a/src/generated/resources/data/forge/tags/blocks/relocation_not_supported.json b/src/generated/resources/data/forge/tags/blocks/relocation_not_supported.json index 259661af42..ce295fd976 100644 --- a/src/generated/resources/data/forge/tags/blocks/relocation_not_supported.json +++ b/src/generated/resources/data/forge/tags/blocks/relocation_not_supported.json @@ -1,5 +1,6 @@ { "values": [ + "create:chain_conveyor", "create:track" ] } \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 461b805aa2..09c251fa27 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -530,6 +530,7 @@ public class AllBlocks { .properties(p -> p.noOcclusion().mapColor(MapColor.PODZOL)) .transform(axeOrPickaxe()) .transform(BlockStressDefaults.setNoImpact()) + .tag(AllBlockTags.RELOCATION_NOT_SUPPORTED.tag) .blockstate((c, p) -> p.simpleBlock(c.getEntry(), AssetLookup.partialBaseModel(c, p))) .item() .transform(customItemModel()) @@ -788,6 +789,7 @@ public class AllBlocks { .properties(p -> p.mapColor(MapColor.COLOR_GRAY) .sound(SoundType.NETHERITE_BLOCK) .noOcclusion() + .isSuffocating((level, pos, state) -> false) .isRedstoneConductor((level, pos, state) -> false)) .addLayer(() -> RenderType::cutoutMipped) .transform(pickaxeOnly()) diff --git a/src/main/java/com/simibubi/create/content/contraptions/DirectionalExtenderScrollOptionSlot.java b/src/main/java/com/simibubi/create/content/contraptions/DirectionalExtenderScrollOptionSlot.java index 9b03187115..18fd03bdf9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/DirectionalExtenderScrollOptionSlot.java +++ b/src/main/java/com/simibubi/create/content/contraptions/DirectionalExtenderScrollOptionSlot.java @@ -7,7 +7,9 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.foundation.blockEntity.behaviour.CenteredSideValueBoxTransform; import net.createmod.catnip.utility.math.AngleHelper; +import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.phys.Vec3; @@ -19,16 +21,16 @@ public class DirectionalExtenderScrollOptionSlot extends CenteredSideValueBoxTra } @Override - public Vec3 getLocalOffset(BlockState state) { - return super.getLocalOffset(state) + public Vec3 getLocalOffset(LevelAccessor level, BlockPos pos, BlockState state) { + return super.getLocalOffset(level, pos, state) .add(Vec3.atLowerCornerOf(state.getValue(BlockStateProperties.FACING).getNormal()).scale(-2 / 16f)); } @Override - public void rotate(BlockState state, PoseStack ms) { + public void rotate(LevelAccessor level, BlockPos pos, BlockState state, PoseStack ms) { if (!getSide().getAxis().isHorizontal()) TransformStack.cast(ms) .rotateY(AngleHelper.horizontalAngle(state.getValue(BlockStateProperties.FACING)) + 180); - super.rotate(state, ms); + super.rotate(level, pos, state, ms); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/actors/contraptionControls/ContraptionControlsBlockEntity.java b/src/main/java/com/simibubi/create/content/contraptions/actors/contraptionControls/ContraptionControlsBlockEntity.java index 67550eeada..7cb5d3fd52 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/actors/contraptionControls/ContraptionControlsBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/actors/contraptionControls/ContraptionControlsBlockEntity.java @@ -25,6 +25,7 @@ import net.minecraft.network.chat.MutableComponent; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; @@ -125,14 +126,14 @@ public class ContraptionControlsBlockEntity extends SmartBlockEntity { public static class ControlsSlot extends ValueBoxTransform.Sided { @Override - public Vec3 getLocalOffset(BlockState state) { + public Vec3 getLocalOffset(LevelAccessor level, BlockPos pos, BlockState state) { Direction facing = state.getValue(ControlsBlock.FACING); float yRot = AngleHelper.horizontalAngle(facing); return VecHelper.rotateCentered(VecHelper.voxelSpace(8, 12f, 5.5f), yRot, Axis.Y); } @Override - public void rotate(BlockState state, PoseStack ms) { + public void rotate(LevelAccessor level, BlockPos pos, BlockState state, PoseStack ms) { Direction facing = state.getValue(ControlsBlock.FACING); float yRot = AngleHelper.horizontalAngle(facing); TransformStack.cast(ms) diff --git a/src/main/java/com/simibubi/create/content/contraptions/actors/roller/RollerBlockEntity.java b/src/main/java/com/simibubi/create/content/contraptions/actors/roller/RollerBlockEntity.java index fb56c00de3..2ca2794347 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/actors/roller/RollerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/actors/roller/RollerBlockEntity.java @@ -21,6 +21,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.EntityBlock; import net.minecraft.world.level.block.StairBlock; import net.minecraft.world.level.block.entity.BlockEntityType; @@ -180,7 +181,7 @@ public class RollerBlockEntity extends SmartBlockEntity { } @Override - public void rotate(BlockState state, PoseStack ms) { + public void rotate(LevelAccessor level, BlockPos pos, BlockState state, PoseStack ms) { Direction facing = state.getValue(RollerBlock.FACING); float yRot = AngleHelper.horizontalAngle(facing) + 180; TransformStack.cast(ms) @@ -189,15 +190,15 @@ public class RollerBlockEntity extends SmartBlockEntity { } @Override - public boolean testHit(BlockState state, Vec3 localHit) { - Vec3 offset = getLocalOffset(state); + public boolean testHit(LevelAccessor level, BlockPos pos, BlockState state, Vec3 localHit) { + Vec3 offset = getLocalOffset(level, pos, state); if (offset == null) return false; return localHit.distanceTo(offset) < scale / 3; } @Override - public Vec3 getLocalOffset(BlockState state) { + public Vec3 getLocalOffset(LevelAccessor level, BlockPos pos, BlockState state) { Direction facing = state.getValue(RollerBlock.FACING); float stateAngle = AngleHelper.horizontalAngle(facing) + 180; return VecHelper.rotateCentered(VecHelper.voxelSpace(8 + hOffset, 15.5f, 11), stateAngle, Axis.Y); diff --git a/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorControlsHandler.java b/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorControlsHandler.java index 04545231c3..1c55bcbde7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorControlsHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorControlsHandler.java @@ -1,5 +1,10 @@ package com.simibubi.create.content.contraptions.elevator; +import java.lang.ref.WeakReference; +import java.util.Collection; + +import org.apache.commons.lang3.tuple.MutablePair; + import com.simibubi.create.AllBlocks; import com.simibubi.create.AllSoundEvents; import com.simibubi.create.content.contraptions.AbstractContraptionEntity; @@ -11,11 +16,13 @@ import com.simibubi.create.content.contraptions.actors.contraptionControls.Contr import com.simibubi.create.content.contraptions.actors.contraptionControls.ContraptionControlsMovement; import com.simibubi.create.content.contraptions.actors.contraptionControls.ContraptionControlsMovement.ElevatorFloorSelection; import com.simibubi.create.content.contraptions.behaviour.MovementContext; + import net.createmod.catnip.utility.Couple; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; import net.minecraft.core.BlockPos; import net.minecraft.util.Mth; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate.StructureBlockInfo; import net.minecraft.world.phys.AABB; @@ -23,10 +30,6 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.Vec3; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -import org.apache.commons.lang3.tuple.MutablePair; - -import java.lang.ref.WeakReference; -import java.util.Collection; public class ElevatorControlsHandler { @@ -35,8 +38,8 @@ public class ElevatorControlsHandler { private static class ElevatorControlsSlot extends ContraptionControlsBlockEntity.ControlsSlot { @Override - public boolean testHit(BlockState state, Vec3 localHit) { - Vec3 offset = getLocalOffset(state); + public boolean testHit(LevelAccessor level, BlockPos pos, BlockState state, Vec3 localHit) { + Vec3 offset = getLocalOffset(level, pos, state); if (offset == null) return false; return localHit.distanceTo(offset) < scale * .85; @@ -92,7 +95,7 @@ public class ElevatorControlsHandler { if (!AllBlocks.CONTRAPTION_CONTROLS.has(info.state())) continue; - if (!slot.testHit(info.state(), rayTraceResult.getLocation() + if (!slot.testHit(mc.level, pos, info.state(), rayTraceResult.getLocation() .subtract(Vec3.atLowerCornerOf(pos)))) continue; diff --git a/src/main/java/com/simibubi/create/content/fluids/pipes/SmartFluidPipeBlockEntity.java b/src/main/java/com/simibubi/create/content/fluids/pipes/SmartFluidPipeBlockEntity.java index 9ba2710bfb..1bacad8d11 100644 --- a/src/main/java/com/simibubi/create/content/fluids/pipes/SmartFluidPipeBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/fluids/pipes/SmartFluidPipeBlockEntity.java @@ -17,6 +17,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.AttachFace; @@ -68,7 +69,7 @@ public class SmartFluidPipeBlockEntity extends SmartBlockEntity { class SmartPipeFilterSlot extends ValueBoxTransform { @Override - public Vec3 getLocalOffset(BlockState state) { + public Vec3 getLocalOffset(LevelAccessor level, BlockPos pos, BlockState state) { AttachFace face = state.getValue(SmartFluidPipeBlock.FACE); float y = face == AttachFace.CEILING ? 0.55f : face == AttachFace.WALL ? 11.4f : 15.45f; float z = face == AttachFace.CEILING ? 4.6f : face == AttachFace.WALL ? 0.55f : 4.625f; @@ -81,7 +82,7 @@ public class SmartFluidPipeBlockEntity extends SmartBlockEntity { } @Override - public void rotate(BlockState state, PoseStack ms) { + public void rotate(LevelAccessor level, BlockPos pos, BlockState state, PoseStack ms) { AttachFace face = state.getValue(SmartFluidPipeBlock.FACE); TransformStack.cast(ms) .rotateY(angleY(state)) diff --git a/src/main/java/com/simibubi/create/content/kinetics/crank/ValveHandleBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/crank/ValveHandleBlockEntity.java index e180f38172..a729563aec 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/crank/ValveHandleBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/crank/ValveHandleBlockEntity.java @@ -32,6 +32,7 @@ import net.minecraft.network.chat.MutableComponent; import net.minecraft.util.Mth; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; @@ -217,8 +218,8 @@ public class ValveHandleBlockEntity extends HandCrankBlockEntity { } @Override - public boolean testHit(BlockState state, Vec3 localHit) { - Vec3 offset = getLocalOffset(state); + public boolean testHit(LevelAccessor level, BlockPos pos, BlockState state, Vec3 localHit) { + Vec3 offset = getLocalOffset(level, pos, state); if (offset == null) return false; return localHit.distanceTo(offset) < scale / 1.5f; diff --git a/src/main/java/com/simibubi/create/content/kinetics/deployer/DeployerFilterSlot.java b/src/main/java/com/simibubi/create/content/kinetics/deployer/DeployerFilterSlot.java index efc746b76e..50c2c7c888 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/deployer/DeployerFilterSlot.java +++ b/src/main/java/com/simibubi/create/content/kinetics/deployer/DeployerFilterSlot.java @@ -6,15 +6,17 @@ import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform; import net.createmod.catnip.utility.VecHelper; import net.createmod.catnip.utility.math.AngleHelper; +import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; public class DeployerFilterSlot extends ValueBoxTransform.Sided { @Override - public Vec3 getLocalOffset(BlockState state) { + public Vec3 getLocalOffset(LevelAccessor level, BlockPos pos, BlockState state) { Direction facing = state.getValue(DeployerBlock.FACING); Vec3 vec = VecHelper.voxelSpace(8f, 8f, 15.5f); @@ -37,7 +39,7 @@ public class DeployerFilterSlot extends ValueBoxTransform.Sided { } @Override - public void rotate(BlockState state, PoseStack ms) { + public void rotate(LevelAccessor level, BlockPos pos, BlockState state, PoseStack ms) { Direction facing = getSide(); float xRot = facing == Direction.UP ? 90 : facing == Direction.DOWN ? 270 : 0; float yRot = AngleHelper.horizontalAngle(facing) + 180; diff --git a/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmBlockEntity.java index ea2ffae465..f6bc041b47 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmBlockEntity.java @@ -39,6 +39,7 @@ import net.minecraft.sounds.SoundSource; import net.minecraft.util.Mth; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.JukeboxBlock; import net.minecraft.world.level.block.entity.BlockEntityType; @@ -614,7 +615,7 @@ public class ArmBlockEntity extends KineticBlockEntity implements ITransformable } @Override - public Vec3 getLocalOffset(BlockState state) { + public Vec3 getLocalOffset(LevelAccessor level, BlockPos pos, BlockState state) { int yPos = state.getValue(ArmBlock.CEILING) ? 16 - 3 : 3; Vec3 location = VecHelper.voxelSpace(8, yPos, 15.5); location = VecHelper.rotateCentered(location, AngleHelper.horizontalAngle(getSide()), Direction.Axis.Y); diff --git a/src/main/java/com/simibubi/create/content/kinetics/motor/CreativeMotorBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/motor/CreativeMotorBlockEntity.java index c57b5231f3..b2fe0236d8 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/motor/CreativeMotorBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/motor/CreativeMotorBlockEntity.java @@ -16,6 +16,7 @@ import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; @@ -65,15 +66,15 @@ public class CreativeMotorBlockEntity extends GeneratingKineticBlockEntity { } @Override - public Vec3 getLocalOffset(BlockState state) { + public Vec3 getLocalOffset(LevelAccessor level, BlockPos pos, BlockState state) { Direction facing = state.getValue(CreativeMotorBlock.FACING); - return super.getLocalOffset(state).add(Vec3.atLowerCornerOf(facing.getNormal()) + return super.getLocalOffset(level, pos, state).add(Vec3.atLowerCornerOf(facing.getNormal()) .scale(-1 / 16f)); } @Override - public void rotate(BlockState state, PoseStack ms) { - super.rotate(state, ms); + public void rotate(LevelAccessor level, BlockPos pos, BlockState state, PoseStack ms) { + super.rotate(level, pos, state, ms); Direction facing = state.getValue(CreativeMotorBlock.FACING); if (facing.getAxis() == Axis.Y) return; diff --git a/src/main/java/com/simibubi/create/content/kinetics/saw/SawFilterSlot.java b/src/main/java/com/simibubi/create/content/kinetics/saw/SawFilterSlot.java index 3e3cfdd473..230b4387a1 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/saw/SawFilterSlot.java +++ b/src/main/java/com/simibubi/create/content/kinetics/saw/SawFilterSlot.java @@ -5,14 +5,16 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform; import net.createmod.catnip.utility.VecHelper; +import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; public class SawFilterSlot extends ValueBoxTransform { @Override - public Vec3 getLocalOffset(BlockState state) { + public Vec3 getLocalOffset(LevelAccessor level, BlockPos pos, BlockState state) { if (state.getValue(SawBlock.FACING) != Direction.UP) return null; int offset = state.getValue(SawBlock.FLIPPED) ? -3 : 3; @@ -22,7 +24,7 @@ public class SawFilterSlot extends ValueBoxTransform { } @Override - public void rotate(BlockState state, PoseStack ms) { + public void rotate(LevelAccessor level, BlockPos pos, BlockState state, PoseStack ms) { int yRot = (state.getValue(SawBlock.AXIS_ALONG_FIRST_COORDINATE) ? 90 : 0) + (state.getValue(SawBlock.FLIPPED) ? 0 : 180); TransformStack.cast(ms) diff --git a/src/main/java/com/simibubi/create/content/kinetics/steamEngine/SteamEngineValueBox.java b/src/main/java/com/simibubi/create/content/kinetics/steamEngine/SteamEngineValueBox.java index 58802b69be..82ac4491d3 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/steamEngine/SteamEngineValueBox.java +++ b/src/main/java/com/simibubi/create/content/kinetics/steamEngine/SteamEngineValueBox.java @@ -7,8 +7,10 @@ import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform; import net.createmod.catnip.utility.Pointing; import net.createmod.catnip.utility.VecHelper; import net.createmod.catnip.utility.math.AngleHelper; +import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; @@ -36,7 +38,7 @@ public class SteamEngineValueBox extends ValueBoxTransform.Sided { } @Override - public Vec3 getLocalOffset(BlockState state) { + public Vec3 getLocalOffset(LevelAccessor level, BlockPos pos, BlockState state) { Direction side = getSide(); Direction engineFacing = SteamEngineBlock.getFacing(state); @@ -59,11 +61,11 @@ public class SteamEngineValueBox extends ValueBoxTransform.Sided { } @Override - public void rotate(BlockState state, PoseStack ms) { + public void rotate(LevelAccessor level, BlockPos pos, BlockState state, PoseStack ms) { Direction facing = SteamEngineBlock.getFacing(state); if (facing.getAxis() == Axis.Y) { - super.rotate(state, ms); + super.rotate(level, pos, state, ms); return; } diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java index 204f842619..f1fb10c57b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java @@ -122,6 +122,7 @@ public class PackageEntity extends LivingEntity implements IEntityAdditionalSpaw @Override public void travel(Vec3 p_213352_1_) { super.travel(p_213352_1_); + if (!level().isClientSide) return; if (getDeltaMovement().length() < 1 / 128f) @@ -161,10 +162,6 @@ public class PackageEntity extends LivingEntity implements IEntityAdditionalSpaw originalEntity = null; } insertionDelay = Math.min(insertionDelay + 1, 30); - if (extractorAnimationProgress > -1) { - extractorAnimationProgress--; - return; - } super.tick(); } @@ -210,8 +207,6 @@ public class PackageEntity extends LivingEntity implements IEntityAdditionalSpaw } public boolean decreaseInsertionTimer(@Nullable Vec3 targetSpot) { - if (level().isClientSide) - return true; if (targetSpot != null) { setDeltaMovement(getDeltaMovement().scale(.75f) .multiply(1, .25f, 1)); @@ -365,6 +360,7 @@ public class PackageEntity extends LivingEntity implements IEntityAdditionalSpaw public void readAdditionalSaveData(CompoundTag compound) { super.readAdditionalSaveData(compound); box = ItemStack.of(compound.getCompound("Box")); + refreshDimensions(); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/chute/AbstractChuteBlock.java b/src/main/java/com/simibubi/create/content/logistics/chute/AbstractChuteBlock.java index a87030cd8a..9ddaad16de 100644 --- a/src/main/java/com/simibubi/create/content/logistics/chute/AbstractChuteBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/chute/AbstractChuteBlock.java @@ -14,7 +14,6 @@ import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour import com.simibubi.create.foundation.item.ItemHelper; import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; @@ -32,6 +31,7 @@ import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraftforge.api.distmarker.Dist; @@ -103,7 +103,7 @@ public abstract class AbstractChuteBlock extends Block implements IWrenchable, I return; if (!input.canInsertFromSide(Direction.UP)) return; - if (!PackageEntity.centerPackage(entityIn, VecHelper.getCenterOf(pos))) + if (!PackageEntity.centerPackage(entityIn, Vec3.atBottomCenterOf(pos.above()))) return; ItemStack remainder = input.handleInsertion(stack, Direction.UP, false); if (remainder.isEmpty()) diff --git a/src/main/java/com/simibubi/create/content/logistics/chute/SmartChuteBlock.java b/src/main/java/com/simibubi/create/content/logistics/chute/SmartChuteBlock.java index 5575d68837..fd0efdcb51 100644 --- a/src/main/java/com/simibubi/create/content/logistics/chute/SmartChuteBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/chute/SmartChuteBlock.java @@ -53,7 +53,7 @@ public class SmartChuteBlock extends AbstractChuteBlock { public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { return true; } - + @Override public BlockEntityType getBlockEntityType() { return AllBlockEntityTypes.SMART_CHUTE.get(); diff --git a/src/main/java/com/simibubi/create/content/logistics/chute/SmartChuteFilterSlotPositioning.java b/src/main/java/com/simibubi/create/content/logistics/chute/SmartChuteFilterSlotPositioning.java index 0828021158..016621b943 100644 --- a/src/main/java/com/simibubi/create/content/logistics/chute/SmartChuteFilterSlotPositioning.java +++ b/src/main/java/com/simibubi/create/content/logistics/chute/SmartChuteFilterSlotPositioning.java @@ -4,15 +4,17 @@ import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform; import net.createmod.catnip.utility.VecHelper; import net.createmod.catnip.utility.math.AngleHelper; +import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; public class SmartChuteFilterSlotPositioning extends ValueBoxTransform.Sided { @Override - public Vec3 getLocalOffset(BlockState state) { + public Vec3 getLocalOffset(LevelAccessor level, BlockPos pos, BlockState state) { Direction side = getSide(); float horizontalAngle = AngleHelper.horizontalAngle(side); Vec3 southLocation = VecHelper.voxelSpace(8, 11, 15.5f); diff --git a/src/main/java/com/simibubi/create/content/logistics/crate/CreativeCrateBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/crate/CreativeCrateBlockEntity.java index 4c267e5e53..c421d3206c 100644 --- a/src/main/java/com/simibubi/create/content/logistics/crate/CreativeCrateBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/crate/CreativeCrateBlockEntity.java @@ -11,6 +11,7 @@ import com.simibubi.create.foundation.utility.CreateLang; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; @@ -55,13 +56,13 @@ public class CreativeCrateBlockEntity extends CrateBlockEntity { return new FilteringBehaviour(this, new ValueBoxTransform() { @Override - public void rotate(BlockState state, PoseStack ms) { + public void rotate(LevelAccessor level, BlockPos pos, BlockState state, PoseStack ms) { TransformStack.cast(ms) .rotateX(90); } @Override - public Vec3 getLocalOffset(BlockState state) { + public Vec3 getLocalOffset(LevelAccessor level, BlockPos pos, BlockState state) { return new Vec3(0.5, 13.5 / 16d, 0.5); } diff --git a/src/main/java/com/simibubi/create/content/logistics/depot/EjectorBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/depot/EjectorBlockEntity.java index 96a91d0b26..251407ee14 100644 --- a/src/main/java/com/simibubi/create/content/logistics/depot/EjectorBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/depot/EjectorBlockEntity.java @@ -51,6 +51,7 @@ import net.minecraft.world.level.ClipContext; import net.minecraft.world.level.ClipContext.Block; import net.minecraft.world.level.ClipContext.Fluid; import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.ObserverBlock; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; @@ -621,16 +622,16 @@ public class EjectorBlockEntity extends KineticBlockEntity { private class EjectorSlot extends ValueBoxTransform.Sided { @Override - public Vec3 getLocalOffset(BlockState state) { + public Vec3 getLocalOffset(LevelAccessor level, BlockPos pos, BlockState state) { if (direction != Direction.UP) - return super.getLocalOffset(state); + return super.getLocalOffset(level, pos, state); return new Vec3(.5, 10.5 / 16f, .5).add(VecHelper.rotate(VecHelper.voxelSpace(0, 0, -5), angle(state), Axis.Y)); } @Override - public void rotate(BlockState state, PoseStack ms) { + public void rotate(LevelAccessor level, BlockPos pos, BlockState state, PoseStack ms) { if (direction != Direction.UP) { - super.rotate(state, ms); + super.rotate(level, pos, state, ms); return; } TransformStack.cast(ms) diff --git a/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelBlock.java index d4f7946ca5..105b9bd365 100644 --- a/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelBlock.java @@ -125,14 +125,14 @@ public abstract class FunnelBlock extends AbstractDirectionalFunnelBlock { Direction direction = getFunnelFacing(state); Vec3 openPos = VecHelper.getCenterOf(pos) .add(Vec3.atLowerCornerOf(direction.getNormal()) - .scale(-.25f)); + .scale(-.125f)); Vec3 diff = entityIn.position() .subtract(openPos); double projectedDiff = direction.getAxis() .choose(diff.x, diff.y, diff.z); if (projectedDiff < 0 == (direction.getAxisDirection() == AxisDirection.POSITIVE)) return; - float yOffset = direction == Direction.UP ? 0.075f : direction == Direction.DOWN ? -0.5f : -0.5f; + float yOffset = direction == Direction.UP ? 0.25f : direction == Direction.DOWN ? -0.5f : -0.5f; if (!PackageEntity.centerPackage(entityIn, openPos.add(0, yOffset, 0))) return; diff --git a/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelFilterSlotPositioning.java b/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelFilterSlotPositioning.java index e55b57f777..fe82311954 100644 --- a/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelFilterSlotPositioning.java +++ b/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelFilterSlotPositioning.java @@ -7,15 +7,17 @@ import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform; import net.createmod.catnip.utility.VecHelper; import net.createmod.catnip.utility.math.AngleHelper; +import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; public class FunnelFilterSlotPositioning extends ValueBoxTransform.Sided { @Override - public Vec3 getLocalOffset(BlockState state) { + public Vec3 getLocalOffset(LevelAccessor level, BlockPos pos, BlockState state) { Direction side = getSide(); float horizontalAngle = AngleHelper.horizontalAngle(side); Direction funnelFacing = FunnelBlock.getFunnelFacing(state); @@ -45,19 +47,19 @@ public class FunnelFilterSlotPositioning extends ValueBoxTransform.Sided { } @Override - public void rotate(BlockState state, PoseStack ms) { + public void rotate(LevelAccessor level, BlockPos pos, BlockState state, PoseStack ms) { Direction facing = FunnelBlock.getFunnelFacing(state); if (facing.getAxis() .isVertical()) { - super.rotate(state, ms); + super.rotate(level, pos, state, ms); return; } boolean isBeltFunnel = state.getBlock() instanceof BeltFunnelBlock; if (isBeltFunnel && state.getValue(BeltFunnelBlock.SHAPE) != Shape.EXTENDED) { Shape shape = state.getValue(BeltFunnelBlock.SHAPE); - super.rotate(state, ms); + super.rotate(level, pos, state, ms); if (shape == Shape.PULLING || shape == Shape.PUSHING) TransformStack.cast(ms) .rotateX(-22.5f); @@ -65,7 +67,7 @@ public class FunnelFilterSlotPositioning extends ValueBoxTransform.Sided { } if (state.getBlock() instanceof FunnelBlock) { - super.rotate(state, ms); + super.rotate(level, pos, state, ms); TransformStack.cast(ms) .rotateX(-22.5f); return; diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlock.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlock.java index e83badfc0d..443509f57c 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlock.java @@ -1,5 +1,7 @@ package com.simibubi.create.content.logistics.packagePort; +import org.jetbrains.annotations.Nullable; + import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllShapes; import com.simibubi.create.content.equipment.wrench.IWrenchable; @@ -15,6 +17,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.PushReaction; import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; @@ -29,6 +32,11 @@ public class PackagePortBlock extends Block implements IBE localHit - .distanceToSqr(behaviour.secondSlot.getLocalOffset(blockState)); + fakePlayerChoice = localHit.distanceToSqr(behaviour.firstSlot.getLocalOffset(world, pos, blockState)) > localHit + .distanceToSqr(behaviour.secondSlot.getLocalOffset(world, pos, blockState)); } for (boolean first : Arrays.asList(false, true)) { diff --git a/src/main/java/com/simibubi/create/content/redstone/link/LinkRenderer.java b/src/main/java/com/simibubi/create/content/redstone/link/LinkRenderer.java index 9a2d335fdd..cf1d20ad5f 100644 --- a/src/main/java/com/simibubi/create/content/redstone/link/LinkRenderer.java +++ b/src/main/java/com/simibubi/create/content/redstone/link/LinkRenderer.java @@ -99,7 +99,7 @@ public class LinkRenderer { ItemStack stack = first ? behaviour.frequencyFirst.getStack() : behaviour.frequencyLast.getStack(); ms.pushPose(); - transform.transform(be.getBlockState(), ms); + transform.transform(be.getLevel(), be.getBlockPos(), be.getBlockState(), ms); ValueBoxRenderer.renderItemIntoValueBox(stack, ms, buffer, light, overlay); ms.popPose(); } diff --git a/src/main/java/com/simibubi/create/content/redstone/link/RedstoneLinkFrequencySlot.java b/src/main/java/com/simibubi/create/content/redstone/link/RedstoneLinkFrequencySlot.java index 47d90514c6..1e226cfe8b 100644 --- a/src/main/java/com/simibubi/create/content/redstone/link/RedstoneLinkFrequencySlot.java +++ b/src/main/java/com/simibubi/create/content/redstone/link/RedstoneLinkFrequencySlot.java @@ -6,8 +6,10 @@ import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform; import net.createmod.catnip.utility.VecHelper; import net.createmod.catnip.utility.math.AngleHelper; +import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; @@ -21,7 +23,7 @@ public class RedstoneLinkFrequencySlot extends ValueBoxTransform.Dual { Vec3 vertical = VecHelper.voxelSpace(10f, 2.5f, 5.5f); @Override - public Vec3 getLocalOffset(BlockState state) { + public Vec3 getLocalOffset(LevelAccessor level, BlockPos pos, BlockState state) { Direction facing = state.getValue(RedstoneLinkBlock.FACING); Vec3 location = VecHelper.voxelSpace(8f, 3.01f, 5.5f); @@ -40,7 +42,7 @@ public class RedstoneLinkFrequencySlot extends ValueBoxTransform.Dual { } @Override - public void rotate(BlockState state, PoseStack ms) { + public void rotate(LevelAccessor level, BlockPos pos, BlockState state, PoseStack ms) { Direction facing = state.getValue(RedstoneLinkBlock.FACING); float yRot = facing.getAxis() .isVertical() ? 0 : AngleHelper.horizontalAngle(facing) + 180; diff --git a/src/main/java/com/simibubi/create/content/trains/observer/TrackObserverBlockEntity.java b/src/main/java/com/simibubi/create/content/trains/observer/TrackObserverBlockEntity.java index e8a026ce4b..a6c039a03d 100644 --- a/src/main/java/com/simibubi/create/content/trains/observer/TrackObserverBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/trains/observer/TrackObserverBlockEntity.java @@ -19,6 +19,7 @@ import com.simibubi.create.foundation.utility.CreateLang; import net.minecraft.core.BlockPos; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; @@ -97,13 +98,13 @@ public class TrackObserverBlockEntity extends SmartBlockEntity implements ITrans return new FilteringBehaviour(this, new ValueBoxTransform() { @Override - public void rotate(BlockState state, PoseStack ms) { + public void rotate(LevelAccessor level, BlockPos pos, BlockState state, PoseStack ms) { TransformStack.cast(ms) .rotateX(90); } @Override - public Vec3 getLocalOffset(BlockState state) { + public Vec3 getLocalOffset(LevelAccessor level, BlockPos pos, BlockState state) { return new Vec3(0.5, 15.5 / 16d, 0.5); } diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBox.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBox.java index 647f110b27..77a3dcac56 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBox.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBox.java @@ -1,5 +1,7 @@ package com.simibubi.create.foundation.blockEntity.behaviour; +import java.lang.ref.WeakReference; + import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.content.logistics.filter.FilterItem; import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform.Sided; @@ -18,6 +20,7 @@ import net.minecraft.client.resources.model.BakedModel; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; @@ -33,8 +36,10 @@ public class ValueBox extends ChasingAABBOutline { public boolean isPassive; - protected BlockPos pos; protected ValueBoxTransform transform; + + protected WeakReference level; + protected BlockPos pos; protected BlockState blockState; protected AllIcons outline = AllIcons.VALUE_BOX_HOVER_4PX; @@ -48,6 +53,7 @@ public class ValueBox extends ChasingAABBOutline { this.label = label; this.pos = pos; this.blockState = state; + this.level = new WeakReference(Minecraft.getInstance().level); } public ValueBox transform(ValueBoxTransform transform) { @@ -75,13 +81,15 @@ public class ValueBox extends ChasingAABBOutline { boolean hasTransform = transform != null; if (transform instanceof Sided && params.getHighlightedFace() != null) ((Sided) transform).fromSide(params.getHighlightedFace()); - if (hasTransform && !transform.shouldRender(blockState)) + + LevelAccessor levelAccessor = level.get(); + if (hasTransform && !transform.shouldRender(levelAccessor, pos, blockState)) return; ms.pushPose(); ms.translate(pos.getX() - camera.x, pos.getY() - camera.y, pos.getZ() - camera.z); if (hasTransform) - transform.transform(blockState, ms); + transform.transform(levelAccessor, pos, blockState, ms); if (!isPassive) { ms.pushPose(); diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBoxTransform.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBoxTransform.java index addbac1da2..2a1d7838ce 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBoxTransform.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBoxTransform.java @@ -9,8 +9,10 @@ import com.mojang.blaze3d.vertex.PoseStack; import net.createmod.catnip.utility.VecHelper; import net.createmod.catnip.utility.math.AngleHelper; +import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.phys.Vec3; @@ -19,28 +21,28 @@ public abstract class ValueBoxTransform { protected float scale = getScale(); - public abstract Vec3 getLocalOffset(BlockState state); + public abstract Vec3 getLocalOffset(LevelAccessor level, BlockPos pos, BlockState state); - public abstract void rotate(BlockState state, PoseStack ms); + public abstract void rotate(LevelAccessor level, BlockPos pos, BlockState state, PoseStack ms); - public boolean testHit(BlockState state, Vec3 localHit) { - Vec3 offset = getLocalOffset(state); + public boolean testHit(LevelAccessor level, BlockPos pos, BlockState state, Vec3 localHit) { + Vec3 offset = getLocalOffset(level, pos, state); if (offset == null) return false; return localHit.distanceTo(offset) < scale / 2; } - public void transform(BlockState state, PoseStack ms) { - Vec3 position = getLocalOffset(state); + public void transform(LevelAccessor level, BlockPos pos, BlockState state, PoseStack ms) { + Vec3 position = getLocalOffset(level, pos, state); if (position == null) return; ms.translate(position.x, position.y, position.z); - rotate(state, ms); + rotate(level, pos, state, ms); ms.scale(scale, scale, scale); } - public boolean shouldRender(BlockState state) { - return !state.isAir() && getLocalOffset(state) != null; + public boolean shouldRender(LevelAccessor level, BlockPos pos, BlockState state) { + return !state.isAir() && getLocalOffset(level, pos, state) != null; } public int getOverrideColor() { @@ -80,8 +82,9 @@ public abstract class ValueBoxTransform { return Pair.of(factory.apply(true), factory.apply(false)); } - public boolean testHit(BlockState state, Vec3 localHit) { - Vec3 offset = getLocalOffset(state); + @Override + public boolean testHit(LevelAccessor level, BlockPos pos, BlockState state, Vec3 localHit) { + Vec3 offset = getLocalOffset(level, pos, state); if (offset == null) return false; return localHit.distanceTo(offset) < scale / 3.5f; @@ -99,7 +102,7 @@ public abstract class ValueBoxTransform { } @Override - public Vec3 getLocalOffset(BlockState state) { + public Vec3 getLocalOffset(LevelAccessor level, BlockPos pos, BlockState state) { Vec3 location = getSouthLocation(); location = VecHelper.rotateCentered(location, AngleHelper.horizontalAngle(getSide()), Axis.Y); location = VecHelper.rotateCentered(location, AngleHelper.verticalAngle(getSide()), Axis.X); @@ -109,7 +112,7 @@ public abstract class ValueBoxTransform { protected abstract Vec3 getSouthLocation(); @Override - public void rotate(BlockState state, PoseStack ms) { + public void rotate(LevelAccessor level, BlockPos pos, BlockState state, PoseStack ms) { float yRot = AngleHelper.horizontalAngle(getSide()) + 180; float xRot = getSide() == Direction.UP ? 90 : getSide() == Direction.DOWN ? 270 : 0; TransformStack.cast(ms) @@ -118,13 +121,13 @@ public abstract class ValueBoxTransform { } @Override - public boolean shouldRender(BlockState state) { - return super.shouldRender(state) && isSideActive(state, getSide()); + public boolean shouldRender(LevelAccessor level, BlockPos pos, BlockState state) { + return super.shouldRender(level, pos, state) && isSideActive(state, getSide()); } @Override - public boolean testHit(BlockState state, Vec3 localHit) { - return isSideActive(state, getSide()) && super.testHit(state, localHit); + public boolean testHit(LevelAccessor level, BlockPos pos, BlockState state, Vec3 localHit) { + return isSideActive(state, getSide()) && super.testHit(level, pos, state, localHit); } protected boolean isSideActive(BlockState state, Direction direction) { diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/edgeInteraction/EdgeInteractionRenderer.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/edgeInteraction/EdgeInteractionRenderer.java index 1b31417490..fffc0bfa30 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/edgeInteraction/EdgeInteractionRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/edgeInteraction/EdgeInteractionRenderer.java @@ -21,6 +21,7 @@ import net.minecraft.core.Direction; import net.minecraft.network.chat.MutableComponent; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.BlockHitResult; @@ -107,13 +108,13 @@ public class EdgeInteractionRenderer { } @Override - public Vec3 getLocalOffset(BlockState state) { + public Vec3 getLocalOffset(LevelAccessor level, BlockPos pos, BlockState state) { return add; } @Override - public void rotate(BlockState state, PoseStack ms) { - super.rotate(state, ms); + public void rotate(LevelAccessor level, BlockPos pos, BlockState state, PoseStack ms) { + super.rotate(level, pos, state, ms); } } diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringBehaviour.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringBehaviour.java index ce728cd250..830a44cd73 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringBehaviour.java @@ -231,7 +231,7 @@ public class FilteringBehaviour extends BlockEntityBehaviour implements ValueSet public boolean testHit(Vec3 hit) { BlockState state = blockEntity.getBlockState(); Vec3 localHit = hit.subtract(Vec3.atLowerCornerOf(blockEntity.getBlockPos())); - return slotPositioning.testHit(state, localHit); + return slotPositioning.testHit(getWorld(), getPos(), state, localHit); } public int getAmount() { diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringRenderer.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringRenderer.java index 486d3e4407..27458b61e3 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringRenderer.java @@ -32,6 +32,7 @@ import net.minecraft.network.chat.MutableComponent; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.Entity; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.BlockHitResult; @@ -67,14 +68,14 @@ public class FilteringRenderer { return; if (behaviour.slotPositioning instanceof ValueBoxTransform.Sided) ((Sided) behaviour.slotPositioning).fromSide(result.getDirection()); - if (!behaviour.slotPositioning.shouldRender(state)) + if (!behaviour.slotPositioning.shouldRender(world, pos, state)) return; ItemStack filter = behaviour.getFilter(); boolean isFilterSlotted = filter.getItem() instanceof FilterItem; boolean showCount = behaviour.isCountVisible(); Component label = behaviour.getLabel(); - boolean hit = behaviour.slotPositioning.testHit(state, target.getLocation() + boolean hit = behaviour.slotPositioning.testHit(world, pos, state, target.getLocation() .subtract(Vec3.atLowerCornerOf(pos))); AABB emptyBB = new AABB(Vec3.ZERO, Vec3.ZERO); @@ -107,12 +108,15 @@ public class FilteringRenderer { if (be == null || be.isRemoved()) return; + Level level = be.getLevel(); + BlockPos blockPos = be.getBlockPos(); + if (!be.isVirtual()) { Entity cameraEntity = Minecraft.getInstance().cameraEntity; - if (cameraEntity != null && be.getLevel() == cameraEntity.level()) { + if (cameraEntity != null && level == cameraEntity.level()) { float max = AllConfigs.client().filterItemRenderDistance.getF(); if (cameraEntity.position() - .distanceToSqr(VecHelper.getCenterOf(be.getBlockPos())) > (max * max)) { + .distanceToSqr(VecHelper.getCenterOf(blockPos)) > (max * max)) { return; } } @@ -139,11 +143,11 @@ public class FilteringRenderer { continue; sided.fromSide(d); - if (!slotPositioning.shouldRender(blockState)) + if (!slotPositioning.shouldRender(level, blockPos, blockState)) continue; ms.pushPose(); - slotPositioning.transform(blockState, ms); + slotPositioning.transform(level, blockPos, blockState, ms); if (AllBlocks.CONTRAPTION_CONTROLS.has(blockState)) ValueBoxRenderer.renderFlatItemIntoValueBox(filter, ms, buffer, light, overlay); else @@ -152,9 +156,9 @@ public class FilteringRenderer { } sided.fromSide(side); return; - } else if (slotPositioning.shouldRender(blockState)) { + } else if (slotPositioning.shouldRender(level, blockPos, blockState)) { ms.pushPose(); - slotPositioning.transform(blockState, ms); + slotPositioning.transform(level, blockPos, blockState, ms); ValueBoxRenderer.renderItemIntoValueBox(behaviour.getFilter(), ms, buffer, light, overlay); ms.popPose(); } diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/SidedFilteringBehaviour.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/SidedFilteringBehaviour.java index 9ca8966153..4d740b3af7 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/SidedFilteringBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/SidedFilteringBehaviour.java @@ -14,10 +14,12 @@ import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform.Si import net.createmod.catnip.utility.Iterate; import net.createmod.catnip.utility.NBTHelper; +import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; @@ -111,38 +113,36 @@ public class SidedFilteringBehaviour extends FilteringBehaviour { if (!sidedFilters.containsKey(side)) return true; return sidedFilters.get(side) - .test(stack); + .test(stack); } @Override public void destroy() { sidedFilters.values() - .forEach(FilteringBehaviour::destroy); + .forEach(FilteringBehaviour::destroy); super.destroy(); } @Override public ItemRequirement getRequiredItems() { - return sidedFilters.values().stream().reduce( - ItemRequirement.NONE, - (a, b) -> a.union(b.getRequiredItems()), - (a, b) -> a.union(b) - ); + return sidedFilters.values() + .stream() + .reduce(ItemRequirement.NONE, (a, b) -> a.union(b.getRequiredItems()), (a, b) -> a.union(b)); } public void removeFilter(Direction side) { if (!sidedFilters.containsKey(side)) return; sidedFilters.remove(side) - .destroy(); + .destroy(); } - public boolean testHit(Direction direction, Vec3 hit) { + public boolean testHit(LevelAccessor level, BlockPos pos, Direction direction, Vec3 hit) { ValueBoxTransform.Sided sidedPositioning = (Sided) slotPositioning; BlockState state = blockEntity.getBlockState(); Vec3 localHit = hit.subtract(Vec3.atLowerCornerOf(blockEntity.getBlockPos())); return sidedPositioning.fromSide(direction) - .testHit(state, localHit); + .testHit(level, pos, state, localHit); } } diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/scrollValue/ScrollValueBehaviour.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/scrollValue/ScrollValueBehaviour.java index fa201ff676..e37d316746 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/scrollValue/ScrollValueBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/scrollValue/ScrollValueBehaviour.java @@ -136,7 +136,7 @@ public class ScrollValueBehaviour extends BlockEntityBehaviour implements ValueS public boolean testHit(Vec3 hit) { BlockState state = blockEntity.getBlockState(); Vec3 localHit = hit.subtract(Vec3.atLowerCornerOf(blockEntity.getBlockPos())); - return slotPositioning.testHit(state, localHit); + return slotPositioning.testHit(getWorld(), getPos(), state, localHit); } public void setLabel(Component label) { From 963eabf17b88a36737891bf3d118dd320d48841d Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 6 Sep 2024 08:36:41 +0200 Subject: [PATCH 039/515] Bugs in the box II --- build.gradle | 7 +++++++ .../kinetics/chainConveyor/ChainConveyorBlock.java | 11 +++++++++++ .../chainConveyor/ChainConveyorBlockEntity.java | 2 +- 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index d75de75a34..bfea920865 100644 --- a/build.gradle +++ b/build.gradle @@ -214,6 +214,13 @@ dependencies { jarJar("com.jozufozu.flywheel:flywheel-forge-${flywheel_minecraft_version}:${flywheel_version}") { jarJar.ranged(it, '[0.6.10,0.6.11)') } + + jarJar("net.createmod.catnip:Catnip-Forge-${minecraft_version}:${catnip_version}") { + jarJar.ranged(it, '[0.7.5,)') + } + jarJar("net.createmod.ponder:Ponder-Forge-${minecraft_version}:${ponder_version}") { + jarJar.ranged(it, '[0.7.5,)') + } implementation fg.deobf("com.tterrag.registrate:Registrate:${registrate_version}") diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlock.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlock.java index 29b27c29ed..32f492c1c3 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlock.java @@ -8,6 +8,7 @@ import com.simibubi.create.foundation.block.IBE; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; +import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -19,6 +20,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; @@ -44,6 +46,15 @@ public class ChainConveyorBlock extends KineticBlock implements IBE Date: Sun, 8 Sep 2024 19:04:31 +0200 Subject: [PATCH 040/515] Wrong import --- .../create/content/logistics/packager/PackageDefragmenter.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackageDefragmenter.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackageDefragmenter.java index 7863a084a5..fae5de8fae 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackageDefragmenter.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackageDefragmenter.java @@ -6,8 +6,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import org.apache.commons.compress.utils.Lists; - +import com.google.common.collect.Lists; import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.content.logistics.stockTicker.PackageOrder; From a51706633d105f105b3b2052f2c15289a568fcf4 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Thu, 12 Sep 2024 21:35:54 +0200 Subject: [PATCH 041/515] Link... - Packager links can now target each other and form a communication network --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 6 +- .../resources/assets/create/lang/en_ud.json | 4 +- .../resources/assets/create/lang/en_us.json | 4 +- .../java/com/simibubi/create/AllBlocks.java | 7 +- .../content/equipment/hats/EntityHats.java | 4 +- .../LogisticallyLinkedBehaviour.java | 233 ++++++++++++++++++ ....java => LogisticallyLinkedBlockItem.java} | 21 +- .../packagerLink/PackagerLinkBlock.java | 32 +-- .../packagerLink/PackagerLinkBlockEntity.java | 107 +------- .../LogisticalStockRequestPacket.java | 6 +- .../LogisticalWorkstationBlock.java | 19 -- .../LogisticalWorkstationBlockEntity.java | 121 --------- .../stockTicker/StockCheckingBlockEntity.java | 62 +++++ .../stockTicker/StockTickerBlock.java | 4 +- .../stockTicker/StockTickerBlockEntity.java | 33 ++- .../StockTickerInteractionHandler.java | 6 +- .../displayLink/ClickToLinkBlockItem.java | 33 ++- .../infrastructure/config/CLogistics.java | 3 - .../assets/create/lang/default/interface.json | 4 +- 19 files changed, 399 insertions(+), 310 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java rename src/main/java/com/simibubi/create/content/logistics/packagerLink/{PackagerLinkBlockItem.java => LogisticallyLinkedBlockItem.java} (50%) delete mode 100644 src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalWorkstationBlock.java delete mode 100644 src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalWorkstationBlockEntity.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/stockTicker/StockCheckingBlockEntity.java diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 8f1725eebe..2d0c07e687 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-07-05T10:54:30.6312512 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-09-12T18:35:03.2786801 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -590,8 +590,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -0f33619793869d4db13d881a565af6800247ea36 assets/create/lang/en_ud.json -e2797efc071b7c1f919922760a787f3d26bc0d39 assets/create/lang/en_us.json +20b568e230c8a0f35c3ffc21d76001e4832e606c assets/create/lang/en_ud.json +cdf84caeef5420a50ce11c5f7c931600436260b5 assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 28c4a594db..6d4da1b470 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -1373,10 +1373,8 @@ "create.packager.mode_change.defrag": "pǝʇǝןdɯoɔ ʇndʇno puɐ sʇuǝɯbɐɹɟ ʇɔǝןןoƆ >-", "create.packager.mode_change.regular": "sɯǝʇı xoqun puɐ ǝbɐʞɔɐԀ >-", "create.packager_link.clear": "uoıʇɔǝןǝs pǝɹɐǝןƆ", - "create.packager_link.invalid": "buıɔɐןd ǝɹoɟǝq ɹǝʇsıbǝᴚ ɥsɐƆ ɹo ɹǝʞɔı⟘ ʞɔoʇS ɐ ubıssⱯ", - "create.packager_link.set": "pǝʇɔǝןǝs uoıʇɐʇsʞɹoʍ pǝʇǝbɹɐ⟘", + "create.packager_link.set": "pǝʇɔǝןǝs ʇǝbɹɐ⟘", "create.packager_link.success": "ʇǝbɹɐʇ oʇ punoq ʎןןnɟssǝɔɔnS", - "create.packager_link.too_far": "ǝɹǝɥ ɯoɹɟ ɹɐɟ ooʇ sı uoıʇɐʇsʞɹoʍ pǝʇǝbɹɐ⟘", "create.ponder.analog_lever.header": "ɹǝʌǝꞀ boןɐuⱯ ǝɥʇ buısn sןɐubıs buıןןoɹʇuoƆ", "create.ponder.analog_lever.text_1": "ɹǝʍod ǝuoʇspǝɹ ɟo ǝɔɹnos ǝsıɔǝɹd puɐ ʇɔɐdɯoɔ ɐ ɹoɟ ǝʞɐɯ sɹǝʌǝꞀ boןɐuⱯ", "create.ponder.analog_lever.text_2": "ʇndʇno ɹǝʍod boןɐuɐ sʇı ǝsɐǝɹɔuı oʇ ʞɔıןɔ-ʇɥbıᴚ", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 583750bc11..8c043be41d 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1373,10 +1373,8 @@ "create.packager.mode_change.defrag": "-> Collect fragments and output completed", "create.packager.mode_change.regular": "-> Package and unbox items", "create.packager_link.clear": "Cleared selection", - "create.packager_link.invalid": "Assign a Stock Ticker or Cash Register before placing", - "create.packager_link.set": "Targeted workstation selected", + "create.packager_link.set": "Target selected", "create.packager_link.success": "Successfully bound to target", - "create.packager_link.too_far": "Targeted workstation is too far from here", "create.ponder.analog_lever.header": "Controlling signals using the Analog Lever", "create.ponder.analog_lever.text_1": "Analog Levers make for a compact and precise source of redstone power", "create.ponder.analog_lever.text_2": "Right-click to increase its analog power output", diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 09c251fa27..461b395ce7 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -178,7 +178,7 @@ import com.simibubi.create.content.logistics.packagePort.PackagePortItem; import com.simibubi.create.content.logistics.packager.PackagerBlock; import com.simibubi.create.content.logistics.packager.PackagerGenerator; import com.simibubi.create.content.logistics.packagerLink.PackagerLinkBlock; -import com.simibubi.create.content.logistics.packagerLink.PackagerLinkBlockItem; +import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedBlockItem; import com.simibubi.create.content.logistics.stockTicker.StockTickerBlock; import com.simibubi.create.content.logistics.tunnel.BeltTunnelBlock; import com.simibubi.create.content.logistics.tunnel.BrassTunnelBlock; @@ -1699,7 +1699,7 @@ public class AllBlocks { .addLayer(() -> RenderType::translucent) .transform(pickaxeOnly()) .blockstate((c, p) -> p.directionalBlock(c.get(), AssetLookup.forPowered(c, p))) - .item(PackagerLinkBlockItem::new) + .item(LogisticallyLinkedBlockItem::new) .transform(customItemModel("_", "block")) .register(); @@ -1710,7 +1710,8 @@ public class AllBlocks { .transform(axeOrPickaxe()) .addLayer(() -> RenderType::cutoutMipped) .blockstate((c, p) -> p.horizontalBlock(c.get(), AssetLookup.standardModel(c, p))) - .simpleItem() + .item(LogisticallyLinkedBlockItem::new) + .build() .register(); public static final BlockEntry ANDESITE_FUNNEL = diff --git a/src/main/java/com/simibubi/create/content/equipment/hats/EntityHats.java b/src/main/java/com/simibubi/create/content/equipment/hats/EntityHats.java index f079c6ba0c..af955036ed 100644 --- a/src/main/java/com/simibubi/create/content/equipment/hats/EntityHats.java +++ b/src/main/java/com/simibubi/create/content/equipment/hats/EntityHats.java @@ -6,7 +6,7 @@ import com.jozufozu.flywheel.core.PartialModel; import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.contraptions.Contraption; import com.simibubi.create.content.contraptions.actors.seat.SeatEntity; -import com.simibubi.create.content.logistics.stockTicker.LogisticalWorkstationBlock; +import com.simibubi.create.content.logistics.stockTicker.StockTickerBlock; import com.simibubi.create.content.trains.entity.CarriageContraption; import com.simibubi.create.content.trains.entity.CarriageContraptionEntity; @@ -52,7 +52,7 @@ public class EntityHats { for (int y : Iterate.zeroAndOne) { if (!(level.getBlockState(pos.relative(d) .above(y)) - .getBlock() instanceof LogisticalWorkstationBlock lw)) + .getBlock() instanceof StockTickerBlock lw)) continue; PartialModel hatOfStation = lw.getHat(level, pos, entity); if (hatOfStation == null) diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java new file mode 100644 index 0000000000..90eb7479ba --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java @@ -0,0 +1,233 @@ +package com.simibubi.create.content.logistics.packagerLink; + +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.IdentityHashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.concurrent.atomic.AtomicInteger; + +import javax.annotation.Nullable; + +import org.apache.commons.lang3.mutable.MutableBoolean; + +import com.simibubi.create.content.logistics.packager.InventorySummary; +import com.simibubi.create.content.logistics.stockTicker.PackageOrder; +import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; +import com.simibubi.create.foundation.blockEntity.behaviour.BehaviourType; +import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; + +import net.createmod.catnip.utility.IntAttached; +import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.Registries; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; + +public class LogisticallyLinkedBehaviour extends BlockEntityBehaviour { + + public static final BehaviourType TYPE = new BehaviourType<>(); + public static final AtomicInteger LINK_ID_GENERATOR = new AtomicInteger(); + + public int redstonePower; + + // To + public int linkId; + public BlockPos targetOffset; + public ResourceKey targetDim; + public WeakReference target; + + // From + private Map>> connectedLinks = new HashMap<>(); + + public LogisticallyLinkedBehaviour(SmartBlockEntity be) { + super(be); + targetOffset = BlockPos.ZERO; + linkId = LINK_ID_GENERATOR.getAndIncrement(); + } + + @Override + public void unload() { + super.unload(); + if (!getWorld().isClientSide()) + invalidateSelf(); + } + + public void invalidateSelf() { + if (getTarget() instanceof LogisticallyLinkedBehaviour target) + target.invalidateLink(this); + } + + @Nullable + public LogisticallyLinkedBehaviour getTarget() { + if (targetOffset.equals(BlockPos.ZERO)) + return null; + + if (target != null) { + LogisticallyLinkedBehaviour link = target.get(); + if (isValidLink(link)) + return link; + target = null; + } + + BlockPos targetPos = getPos().offset(targetOffset); + Level world = getWorld(); + + if (world instanceof ServerLevel sl) + world = sl.getServer() + .getLevel(targetDim); + if (world == null) + return null; + + if (world.isLoaded(targetPos) && get(world, targetPos, TYPE) instanceof LogisticallyLinkedBehaviour llb) { + target = new WeakReference(llb); + return llb; + } + + return null; + } + + @Override + public void lazyTick() { + if (getWorld().isClientSide()) + return; + + tickTargetConnection(); + + for (Iterator iterator = connectedLinks.keySet() + .iterator(); iterator.hasNext();) { + Integer id = iterator.next(); + IntAttached> entry = connectedLinks.get(id); + entry.decrement(); + if (entry.isOrBelowZero()) { + iterator.remove(); + continue; + } + LogisticallyLinkedBehaviour link = entry.getSecond() + .get(); + if (!isValidLink(link)) { + iterator.remove(); + continue; + } + } + } + + public void tickTargetConnection() { + if (getTarget() instanceof LogisticallyLinkedBehaviour target) + target.keepConnected(this); + } + + public void redstonePowerChanged(int power) { + if (power == redstonePower) + return; + redstonePower = power; + blockEntity.setChanged(); + + if (power == 15) + invalidateSelf(); + else + tickTargetConnection(); + } + + public List getAllConnectedAvailableLinks(boolean sortByPriority) { + Map links = new IdentityHashMap<>(); + appendAvailableLinksRecursive(links, 0); + + if (!sortByPriority) + return new ArrayList<>(links.keySet()); + + return new ArrayList<>(links.entrySet()).stream() + .sorted((e1, e2) -> e1.getValue() + .compareTo(e2.getValue())) + .map(Entry::getKey) + .toList(); + } + + private void appendAvailableLinksRecursive(Map links, int relativePower) { + if (redstonePower == 15) + return; + + int combinedPower = relativePower + redstonePower; + links.put(this, combinedPower); + + if (getTarget() instanceof LogisticallyLinkedBehaviour target && !links.containsKey(target)) + target.appendAvailableLinksRecursive(links, combinedPower); + + connectedLinks.forEach(($, entry) -> { + LogisticallyLinkedBehaviour link = entry.getSecond() + .get(); + if (isValidLink(link) && !links.containsKey(link)) + link.appendAvailableLinksRecursive(links, combinedPower); + }); + } + + public int processRequest(ItemStack stack, int amount, String address, int linkIndex, MutableBoolean finalLink, + int orderId, @Nullable PackageOrder orderContext) { + if (blockEntity instanceof PackagerLinkBlockEntity plbe) + return plbe.processRequest(stack, amount, address, linkIndex, finalLink, orderId, orderContext); + return 0; + } + + public InventorySummary getSummary() { + if (blockEntity instanceof PackagerLinkBlockEntity plbe) + return plbe.fetchSummaryFromPackager(); + return InventorySummary.EMPTY; + } + + // + + public static boolean isValidLink(LogisticallyLinkedBehaviour link) { + return link != null && !link.blockEntity.isRemoved() && !link.blockEntity.isChunkUnloaded(); + } + + @Override + public boolean isSafeNBT() { + return true; + } + + @Override + public void write(CompoundTag tag, boolean clientPacket) { + super.write(tag, clientPacket); + tag.put("TargetOffset", NbtUtils.writeBlockPos(targetOffset)); + if (targetDim != null) + tag.putString("TargetDimension", targetDim.location() + .toString()); + tag.putInt("Power", redstonePower); + } + + @Override + public void read(CompoundTag tag, boolean clientPacket) { + super.read(tag, clientPacket); + targetOffset = NbtUtils.readBlockPos(tag.getCompound("TargetOffset")); + redstonePower = tag.getInt("Power"); + + if (!tag.contains("TargetDimension")) { + targetDim = Level.OVERWORLD; + return; + } + + targetDim = ResourceKey.create(Registries.DIMENSION, new ResourceLocation(tag.getString("TargetDimension"))); + } + + public void keepConnected(LogisticallyLinkedBehaviour link) { + connectedLinks.computeIfAbsent(link.linkId, $ -> IntAttached.withZero(new WeakReference<>(link))) + .setFirst(3); + } + + public void invalidateLink(LogisticallyLinkedBehaviour link) { + connectedLinks.remove(link.linkId); + } + + @Override + public BehaviourType getType() { + return TYPE; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockItem.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBlockItem.java similarity index 50% rename from src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockItem.java rename to src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBlockItem.java index 88bccd5643..7d3e8d2b18 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBlockItem.java @@ -1,28 +1,35 @@ package com.simibubi.create.content.logistics.packagerLink; -import com.simibubi.create.content.logistics.stockTicker.LogisticalWorkstationBlock; +import com.simibubi.create.AllBlocks; +import com.simibubi.create.content.logistics.stockTicker.StockTickerBlock; import com.simibubi.create.content.redstone.displayLink.ClickToLinkBlockItem; -import com.simibubi.create.infrastructure.config.AllConfigs; import net.minecraft.core.BlockPos; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.Block; -public class PackagerLinkBlockItem extends ClickToLinkBlockItem { +public class LogisticallyLinkedBlockItem extends ClickToLinkBlockItem { - public PackagerLinkBlockItem(Block pBlock, Properties pProperties) { + public LogisticallyLinkedBlockItem(Block pBlock, Properties pProperties) { super(pBlock, pProperties); } @Override public boolean isValidTarget(LevelAccessor level, BlockPos pos) { - return level.getBlockState(pos) - .getBlock() instanceof LogisticalWorkstationBlock; + Block block = level.getBlockState(pos) + .getBlock(); + return (!AllBlocks.STOCK_TICKER.is(this) && block instanceof StockTickerBlock) + || block instanceof PackagerLinkBlock; + } + + @Override + public boolean placeWhenInvalid() { + return true; } @Override public int getMaxDistanceFromSelection() { - return AllConfigs.server().logistics.packagerLinkRange.get(); + return -1; } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlock.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlock.java index 916b94ceb6..a1c5fb1722 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlock.java @@ -1,7 +1,6 @@ package com.simibubi.create.content.logistics.packagerLink; import com.simibubi.create.AllBlockEntityTypes; -import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; import com.simibubi.create.foundation.block.IBE; import com.simibubi.create.foundation.block.WrenchableDirectionalBlock; @@ -36,11 +35,7 @@ public class PackagerLinkBlock extends WrenchableDirectionalBlock implements IBE BlockPos pos = context.getClickedPos(); Direction face = context.getClickedFace(); BlockState placed = super.getStateForPlacement(context).setValue(FACING, face); - BlockState placedOn = context.getLevel() - .getBlockState(pos.relative(face.getOpposite())); - if (!AllBlocks.PACKAGER.has(placedOn)) - return null; - return placed.setValue(POWERED, shouldBePowered(placed, context.getLevel(), pos)); + return placed.setValue(POWERED, getPower(placed, context.getLevel(), pos) > 0); } @Override @@ -49,25 +44,20 @@ public class PackagerLinkBlock extends WrenchableDirectionalBlock implements IBE if (worldIn.isClientSide) return; - boolean powered = shouldBePowered(state, worldIn, pos); + int power = getPower(state, worldIn, pos); + boolean powered = power > 0; boolean previouslyPowered = state.getValue(POWERED); - if (previouslyPowered != powered) { + if (previouslyPowered != powered) worldIn.setBlock(pos, state.cycle(POWERED), 2); - withBlockEntityDo(worldIn, pos, link -> link.redstonePowerChanged(powered)); - } + withBlockEntityDo(worldIn, pos, link -> link.behaviour.redstonePowerChanged(power)); } - private boolean shouldBePowered(BlockState state, Level worldIn, BlockPos pos) { - boolean powered = false; - for (Direction d : Iterate.directions) { - if (d.getOpposite() == state.getValue(FACING)) - continue; - if (worldIn.getSignal(pos.relative(d), d) == 0) - continue; - powered = true; - break; - } - return powered; + public static int getPower(BlockState state, Level worldIn, BlockPos pos) { + int power = 0; + for (Direction d : Iterate.directions) + if (d.getOpposite() != state.getValue(FACING)) + power = Math.max(power, worldIn.getSignal(pos.relative(d), d)); + return power; } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java index 9dc3a79b24..bdcb84cfad 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java @@ -1,8 +1,6 @@ package com.simibubi.create.content.logistics.packagerLink; -import java.lang.ref.WeakReference; import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; import javax.annotation.Nullable; @@ -11,38 +9,27 @@ import org.apache.commons.lang3.mutable.MutableBoolean; import com.simibubi.create.content.logistics.packager.InventorySummary; import com.simibubi.create.content.logistics.packager.PackagerBlockEntity; import com.simibubi.create.content.logistics.packager.PackagingRequest; -import com.simibubi.create.content.logistics.stockTicker.LogisticalWorkstationBlockEntity; import com.simibubi.create.content.logistics.stockTicker.PackageOrder; import com.simibubi.create.content.redstone.displayLink.LinkWithBulbBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.NbtUtils; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; public class PackagerLinkBlockEntity extends LinkWithBulbBlockEntity { - public static final AtomicInteger linkIdGenerator = new AtomicInteger(); - - public int linkId; - - protected BlockPos targetOffset; - - private WeakReference target; + public LogisticallyLinkedBehaviour behaviour; public PackagerLinkBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); - targetOffset = BlockPos.ZERO; - linkId = linkIdGenerator.getAndIncrement(); setLazyTickRate(10); } public InventorySummary fetchSummaryFromPackager() { - PackagerBlockEntity packager = getSource(); + PackagerBlockEntity packager = getPackager(); if (packager == null || packager.defragmenterActive) return InventorySummary.EMPTY; sendPulseNextSync(); @@ -52,7 +39,7 @@ public class PackagerLinkBlockEntity extends LinkWithBulbBlockEntity { public int processRequest(ItemStack stack, int amount, String address, int linkIndex, MutableBoolean finalLink, int orderId, @Nullable PackageOrder orderContext) { - PackagerBlockEntity packager = getSource(); + PackagerBlockEntity packager = getPackager(); if (packager == null || packager.defragmenterActive) return 0; @@ -72,69 +59,22 @@ public class PackagerLinkBlockEntity extends LinkWithBulbBlockEntity { } @Override - public void addBehaviours(List behaviours) {} - - public void redstonePowerChanged(boolean powered) { - if (powered) { - invalidateLink(); - return; - } - lazyTick(); + public void addBehaviours(List behaviours) { + behaviours.add(behaviour = new LogisticallyLinkedBehaviour(this)); } @Override public void initialize() { super.initialize(); - PackagerBlockEntity source = getSource(); - if (source != null) - source.recheckIfLinksPresent(); - } - - @Override - public void invalidate() { - super.invalidate(); - invalidateLink(); - } - - private void invalidateLink() { - LogisticalWorkstationBlockEntity target = getTarget(); - if (target == null) - return; - target.invalidateLink(this); - } - - @Override - public void lazyTick() { - if (level.isClientSide()) - return; - LogisticalWorkstationBlockEntity target = getTarget(); - if (target != null) - target.keepConnected(this); + behaviour.redstonePowerChanged(PackagerLinkBlock.getPower(getBlockState(), level, worldPosition)); + if (getPackager() instanceof PackagerBlockEntity packager) + packager.recheckIfLinksPresent(); } @Nullable - public LogisticalWorkstationBlockEntity getTarget() { - if (target != null) { - LogisticalWorkstationBlockEntity workstationBlockEntity = target.get(); - if (workstationBlockEntity != null && !workstationBlockEntity.isRemoved() - && !workstationBlockEntity.isChunkUnloaded()) - return workstationBlockEntity; - target = null; - } - BlockPos targetPos = worldPosition.offset(targetOffset); - if (level.isLoaded(targetPos) - && level.getBlockEntity(targetPos) instanceof LogisticalWorkstationBlockEntity lwbe) { - target = new WeakReference(lwbe); - return lwbe; - } - return null; - } - - @Nullable - public PackagerBlockEntity getSource() { + public PackagerBlockEntity getPackager() { BlockState blockState = getBlockState(); - if (blockState.getOptionalValue(PackagerLinkBlock.POWERED) - .orElse(true)) + if (behaviour.redstonePower == 15) return null; BlockPos source = worldPosition.relative(blockState.getOptionalValue(PackagerLinkBlock.FACING) .orElse(Direction.UP) @@ -144,31 +84,4 @@ public class PackagerLinkBlockEntity extends LinkWithBulbBlockEntity { return packager; } - @Override - public void tick() { - super.tick(); - } - - @Override - public void writeSafe(CompoundTag tag) { - super.writeSafe(tag); - writeOffset(tag); - } - - @Override - protected void write(CompoundTag tag, boolean clientPacket) { - super.write(tag, clientPacket); - writeOffset(tag); - } - - private void writeOffset(CompoundTag tag) { - tag.put("TargetOffset", NbtUtils.writeBlockPos(targetOffset)); - } - - @Override - protected void read(CompoundTag tag, boolean clientPacket) { - super.read(tag, clientPacket); - targetOffset = NbtUtils.readBlockPos(tag.getCompound("TargetOffset")); - } - } diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalStockRequestPacket.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalStockRequestPacket.java index 7a11206f73..bc6e15883f 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalStockRequestPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalStockRequestPacket.java @@ -6,7 +6,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.level.ServerPlayer; -public class LogisticalStockRequestPacket extends BlockEntityConfigurationPacket { +public class LogisticalStockRequestPacket extends BlockEntityConfigurationPacket { public LogisticalStockRequestPacket(BlockPos pos) { super(pos); @@ -23,10 +23,10 @@ public class LogisticalStockRequestPacket extends BlockEntityConfigurationPacket protected void readSettings(FriendlyByteBuf buffer) {} @Override - protected void applySettings(LogisticalWorkstationBlockEntity be) {} + protected void applySettings(StockCheckingBlockEntity be) {} @Override - protected void applySettings(ServerPlayer player, LogisticalWorkstationBlockEntity be) { + protected void applySettings(ServerPlayer player, StockCheckingBlockEntity be) { be.getRecentSummary() .divideAndSendTo(player, pos); } diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalWorkstationBlock.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalWorkstationBlock.java deleted file mode 100644 index 8bc5919633..0000000000 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalWorkstationBlock.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.simibubi.create.content.logistics.stockTicker; - -import javax.annotation.Nullable; - -import com.jozufozu.flywheel.core.PartialModel; - -import net.minecraft.core.BlockPos; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.level.LevelAccessor; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; - -public interface LogisticalWorkstationBlock { - - @Nullable - @OnlyIn(Dist.CLIENT) - public PartialModel getHat(LevelAccessor level, BlockPos pos, LivingEntity keeper); - -} diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalWorkstationBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalWorkstationBlockEntity.java deleted file mode 100644 index daeb0ad357..0000000000 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalWorkstationBlockEntity.java +++ /dev/null @@ -1,121 +0,0 @@ -package com.simibubi.create.content.logistics.stockTicker; - -import java.lang.ref.WeakReference; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -import com.simibubi.create.content.logistics.packager.InventorySummary; -import com.simibubi.create.content.logistics.packagerLink.PackagerLinkBlockEntity; -import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; - -import net.createmod.catnip.utility.IntAttached; -import net.minecraft.core.BlockPos; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.level.block.entity.BlockEntityType; -import net.minecraft.world.level.block.state.BlockState; - -public abstract class LogisticalWorkstationBlockEntity extends SmartBlockEntity { - - private Map>> connectedLinks = new HashMap<>(); - private InventorySummary summaryOfLinks; - private int ticksSinceLastSummary; - - protected int activeLinks; - - public LogisticalWorkstationBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { - super(type, pos, state); - setLazyTickRate(10); - ticksSinceLastSummary = 15; - activeLinks = 0; - } - - @Override - public void tick() { - super.tick(); - if (level.isClientSide()) - return; - if (activeLinks != connectedLinks.size() && !isRemoved()) { - activeLinks = connectedLinks.size(); - sendData(); - } - if (ticksSinceLastSummary < 15) - ticksSinceLastSummary++; - } - - protected List getAvailableLinks() { - List links = new ArrayList<>(); - connectedLinks.forEach(($, entry) -> { - PackagerLinkBlockEntity blockEntity = entry.getSecond() - .get(); - if (blockEntity != null && !blockEntity.isRemoved() && !blockEntity.isChunkUnloaded()) - links.add(blockEntity); - }); - return links; - } - - @Override - protected void write(CompoundTag tag, boolean clientPacket) { - super.write(tag, clientPacket); - if (clientPacket) - tag.putInt("ActiveLinks", activeLinks); - } - - @Override - protected void read(CompoundTag tag, boolean clientPacket) { - super.read(tag, clientPacket); - if (clientPacket) - activeLinks = tag.getInt("ActiveLinks"); - } - - public InventorySummary getRecentSummary() { - if (summaryOfLinks == null || ticksSinceLastSummary >= 15) - refreshInventorySummary(); - return summaryOfLinks; - } - - protected void refreshInventorySummary() { - ticksSinceLastSummary = 0; - summaryOfLinks = new InventorySummary(); - connectedLinks.forEach(($, entry) -> { - PackagerLinkBlockEntity link = entry.getSecond() - .get(); - if (link != null && !link.isRemoved() && !link.isChunkUnloaded()) - summaryOfLinks.add(link.fetchSummaryFromPackager()); - }); - } - - @Override - public void lazyTick() { - if (level.isClientSide()) - return; - for (Iterator iterator = connectedLinks.keySet() - .iterator(); iterator.hasNext();) { - Integer id = iterator.next(); - IntAttached> entry = connectedLinks.get(id); - entry.decrement(); - if (entry.isOrBelowZero()) { - iterator.remove(); - continue; - } - PackagerLinkBlockEntity link = entry.getSecond() - .get(); - if (link == null || link.isRemoved() || link.isChunkUnloaded()) { - iterator.remove(); - continue; - } - } - } - - public void keepConnected(PackagerLinkBlockEntity link) { - connectedLinks.computeIfAbsent(link.linkId, $ -> IntAttached.withZero(new WeakReference<>(link))) - .setFirst(3); - } - - public void invalidateLink(PackagerLinkBlockEntity link) { - connectedLinks.remove(link.linkId); - } - -} diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockCheckingBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockCheckingBlockEntity.java new file mode 100644 index 0000000000..bcc048acb8 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockCheckingBlockEntity.java @@ -0,0 +1,62 @@ +package com.simibubi.create.content.logistics.stockTicker; + +import java.util.List; + +import com.simibubi.create.content.logistics.packager.InventorySummary; +import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedBehaviour; +import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; +import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; + +public abstract class StockCheckingBlockEntity extends SmartBlockEntity { + + public LogisticallyLinkedBehaviour behaviour; + + protected InventorySummary summaryOfLinks; + protected int activeLinksLastSummary; + protected int ticksSinceLastSummary; + + public StockCheckingBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { + super(type, pos, state); + setLazyTickRate(10); + ticksSinceLastSummary = 15; + activeLinksLastSummary = 0; + } + + @Override + public void addBehaviours(List behaviours) { + behaviours.add(behaviour = new LogisticallyLinkedBehaviour(this)); + } + + @Override + public void tick() { + super.tick(); + if (level.isClientSide()) + return; + if (ticksSinceLastSummary < 15) + ticksSinceLastSummary++; + } + + public InventorySummary getRecentSummary() { + if (summaryOfLinks == null || ticksSinceLastSummary >= 15) + refreshInventorySummary(); + return summaryOfLinks; + } + + protected void refreshInventorySummary() { + ticksSinceLastSummary = 0; + activeLinksLastSummary = 0; + summaryOfLinks = new InventorySummary(); + behaviour.getAllConnectedAvailableLinks(false) + .forEach(link -> { + InventorySummary summary = link.getSummary(); + if (summary != InventorySummary.EMPTY) + activeLinksLastSummary++; + summaryOfLinks.add(summary); + }); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlock.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlock.java index 6fdbb748f5..31fb315306 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlock.java @@ -22,8 +22,7 @@ import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -public class StockTickerBlock extends HorizontalDirectionalBlock - implements LogisticalWorkstationBlock, IBE { +public class StockTickerBlock extends HorizontalDirectionalBlock implements IBE { public StockTickerBlock(Properties pProperties) { super(pProperties); @@ -48,7 +47,6 @@ public class StockTickerBlock extends HorizontalDirectionalBlock return AllShapes.STOCK_TICKER; } - @Override @OnlyIn(Dist.CLIENT) public PartialModel getHat(LevelAccessor level, BlockPos pos, LivingEntity keeper) { return AllPartialModels.LOGISTICS_HAT; diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java index 62d3a1904f..faa3b0d157 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java @@ -6,9 +6,7 @@ import java.util.List; import org.apache.commons.lang3.mutable.MutableBoolean; import com.simibubi.create.AllPackets; -import com.simibubi.create.Create; -import com.simibubi.create.content.logistics.packagerLink.PackagerLinkBlockEntity; -import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; +import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedBehaviour; import net.createmod.catnip.utility.IntAttached; import net.minecraft.core.BlockPos; @@ -18,21 +16,19 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -public class StockTickerBlockEntity extends LogisticalWorkstationBlockEntity { +public class StockTickerBlockEntity extends StockCheckingBlockEntity { protected List> lastClientsideStockSnapshot; protected List> newlyReceivedStockSnapshot; protected String previouslyUsedAddress; + protected int activeLinks; public StockTickerBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); previouslyUsedAddress = ""; } - @Override - public void addBehaviours(List behaviours) {} - public void refreshClientStockSnapshot() { AllPackets.getChannel() .sendToServer(new LogisticalStockRequestPacket(worldPosition)); @@ -42,16 +38,31 @@ public class StockTickerBlockEntity extends LogisticalWorkstationBlockEntity { return lastClientsideStockSnapshot; } + @Override + public void tick() { + super.tick(); + if (level.isClientSide()) + return; + if (activeLinks != activeLinksLastSummary && !isRemoved()) { + activeLinks = activeLinksLastSummary; + sendData(); + } + } + @Override protected void write(CompoundTag tag, boolean clientPacket) { super.write(tag, clientPacket); tag.putString("PreviousAddress", previouslyUsedAddress); + if (clientPacket) + tag.putInt("ActiveLinks", activeLinks); } @Override protected void read(CompoundTag tag, boolean clientPacket) { super.read(tag, clientPacket); previouslyUsedAddress = tag.getString("PreviousAddress"); + if (clientPacket) + activeLinks = tag.getInt("ActiveLinks"); } public void receiveStockPacket(List> stacks, boolean endOfTransmission) { @@ -68,15 +79,15 @@ public class StockTickerBlockEntity extends LogisticalWorkstationBlockEntity { List> stacks = order.stacks(); // Packages need to track their index and successors for successful defrag - List availableLinks = getAvailableLinks(); - List usedLinks = new ArrayList<>(); + List availableLinks = behaviour.getAllConnectedAvailableLinks(true); + List usedLinks = new ArrayList<>(); MutableBoolean finalLinkTracker = new MutableBoolean(false); // First box needs to carry the order specifics for successful defrag PackageOrder contextToSend = order; // Packages from future orders should not be merged in the packager queue - int orderId = Create.RANDOM.nextInt(); + int orderId = player.level().random.nextInt(); for (int i = 0; i < stacks.size(); i++) { IntAttached entry = stacks.get(i); @@ -84,7 +95,7 @@ public class StockTickerBlockEntity extends LogisticalWorkstationBlockEntity { boolean finalEntry = i == stacks.size() - 1; ItemStack requestedItem = entry.getSecond(); - for (PackagerLinkBlockEntity link : availableLinks) { + for (LogisticallyLinkedBehaviour link : availableLinks) { int usedIndex = usedLinks.indexOf(link); int linkIndex = usedIndex == -1 ? usedLinks.size() : usedIndex; MutableBoolean isFinalLink = new MutableBoolean(false); diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java index 4eb3331999..1cbbaed166 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java @@ -46,16 +46,16 @@ public class StockTickerInteractionHandler { BlockPos workstationPos = pos.relative(d) .above(y); if (!(level.getBlockState(workstationPos) - .getBlock() instanceof LogisticalWorkstationBlock lw)) + .getBlock() instanceof StockTickerBlock lw)) continue; targetPos = workstationPos; stations++; } } - + if (stations != 1) return; - + final BlockPos posForUI = targetPos; if (level.isClientSide()) DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> displayScreen(posForUI)); diff --git a/src/main/java/com/simibubi/create/content/redstone/displayLink/ClickToLinkBlockItem.java b/src/main/java/com/simibubi/create/content/redstone/displayLink/ClickToLinkBlockItem.java index e19fd72b18..5ab65126fd 100644 --- a/src/main/java/com/simibubi/create/content/redstone/displayLink/ClickToLinkBlockItem.java +++ b/src/main/java/com/simibubi/create/content/redstone/displayLink/ClickToLinkBlockItem.java @@ -67,18 +67,35 @@ public abstract class ClickToLinkBlockItem extends BlockItem { return InteractionResult.SUCCESS; } + String placedDim = level.dimension() + .location() + .toString(); + if (!stack.hasTag()) { if (!isValidTarget(level, pos)) { + if (placeWhenInvalid()) { + InteractionResult useOn = super.useOn(pContext); + if (level.isClientSide || useOn == InteractionResult.FAIL) + return useOn; + + ItemStack itemInHand = player.getItemInHand(pContext.getHand()); + if (!itemInHand.isEmpty()) + itemInHand.setTag(null); + return useOn; + } + if (level.isClientSide) AllSoundEvents.DENY.playFrom(player); player.displayClientMessage(CreateLang.translateDirect(msgKey + ".invalid"), true); return InteractionResult.FAIL; } - + if (level.isClientSide) return InteractionResult.SUCCESS; CompoundTag stackTag = stack.getOrCreateTag(); stackTag.put("SelectedPos", NbtUtils.writeBlockPos(pos)); + stackTag.putString("SelectedDimension", placedDim); + player.displayClientMessage(CreateLang.translateDirect(msgKey + ".set"), true); stack.setTag(stackTag); return InteractionResult.SUCCESS; @@ -88,15 +105,17 @@ public abstract class ClickToLinkBlockItem extends BlockItem { CompoundTag teTag = new CompoundTag(); BlockPos selectedPos = NbtUtils.readBlockPos(tag.getCompound("SelectedPos")); + String selectedDim = tag.getString("SelectedDimension"); BlockPos placedPos = pos.relative(pContext.getClickedFace(), state.canBeReplaced() ? 0 : 1); - if (!selectedPos.closerThan(placedPos, maxDistance)) { + if (maxDistance != -1 && (!selectedPos.closerThan(placedPos, maxDistance) || !selectedDim.equals(placedDim))) { player.displayClientMessage(CreateLang.translateDirect(msgKey + ".too_far") .withStyle(ChatFormatting.RED), true); return InteractionResult.FAIL; } teTag.put("TargetOffset", NbtUtils.writeBlockPos(selectedPos.subtract(placedPos))); + teTag.putString("TargetDimension", selectedDim); tag.put("BlockEntityTag", teTag); InteractionResult useOn = super.useOn(pContext); @@ -141,13 +160,17 @@ public abstract class ClickToLinkBlockItem extends BlockItem { } public abstract int getMaxDistanceFromSelection(); - + public abstract String getMessageTranslationKey(); - + + public boolean placeWhenInvalid() { + return false; + } + public boolean isValidTarget(LevelAccessor level, BlockPos pos) { return true; } - + @OnlyIn(Dist.CLIENT) public AABB getSelectionBounds(BlockPos pos) { Level world = Minecraft.getInstance().level; diff --git a/src/main/java/com/simibubi/create/infrastructure/config/CLogistics.java b/src/main/java/com/simibubi/create/infrastructure/config/CLogistics.java index dff45a92eb..b49b116864 100644 --- a/src/main/java/com/simibubi/create/infrastructure/config/CLogistics.java +++ b/src/main/java/com/simibubi/create/infrastructure/config/CLogistics.java @@ -11,7 +11,6 @@ public class CLogistics extends ConfigBase { public final ConfigInt packagePortRange = i(5, 1, "packagePortRange", Comments.packagePortRange); public final ConfigInt linkRange = i(256, 1, "linkRange", Comments.linkRange); public final ConfigInt displayLinkRange = i(64, 1, "displayLinkRange", Comments.displayLinkRange); - public final ConfigInt packagerLinkRange = i(256, 1, "packagerLinkRange", Comments.packagerLinkRange); public final ConfigInt vaultCapacity = i(20, 1, "vaultCapacity", Comments.vaultCapacity); public final ConfigInt chainConveyorCapacity = i(20, 1, "chainConveyorCapacity", Comments.chainConveyorCapacity); public final ConfigInt brassTunnelTimer = i(10, 1, 10, "brassTunnelTimer", Comments.brassTunnelTimer); @@ -28,8 +27,6 @@ public class CLogistics extends ConfigBase { static String linkRange = "Maximum possible range in blocks of redstone link connections."; static String displayLinkRange = "Maximum possible distance in blocks between display links and their target."; - static String packagerLinkRange = - "Maximum possible distance in blocks between packager links and their target."; static String psiTimeout = "The amount of ticks a portable storage interface waits for transfers until letting contraptions move along."; static String mechanicalArmRange = "Maximum distance in blocks a Mechanical Arm can reach across."; diff --git a/src/main/resources/assets/create/lang/default/interface.json b/src/main/resources/assets/create/lang/default/interface.json index e7ebf4b1cf..f2c29319a7 100644 --- a/src/main/resources/assets/create/lang/default/interface.json +++ b/src/main/resources/assets/create/lang/default/interface.json @@ -912,11 +912,9 @@ "create.contraption.door_control.none.short": "None", "create.contraption.door_control.player_facing": "You are facing: %1$s", - "create.packager_link.set": "Targeted workstation selected", + "create.packager_link.set": "Target selected", "create.packager_link.success": "Successfully bound to target", "create.packager_link.clear": "Cleared selection", - "create.packager_link.too_far": "Targeted workstation is too far from here", - "create.packager_link.invalid": "Assign a Stock Ticker or Cash Register before placing", "create.packager.mode_change.regular": "-> Package and unbox items", "create.packager.mode_change.defrag": "-> Collect fragments and output completed", From e0852c53f9158e7df2bb7503bac51add1358053d Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 13 Sep 2024 16:07:33 +0200 Subject: [PATCH 042/515] Restock o'Clock - The stock ticker block can now order packages to refill the inventory below it on a redstone pulse --- .../java/com/simibubi/create/AllPackets.java | 2 + .../packager/PackagerBlockEntity.java | 23 ++ .../LogisticallyLinkedBehaviour.java | 6 +- .../packagerLink/PackagerLinkBlockEntity.java | 5 +- .../PackageOrderRequestPacket.java | 2 +- .../StockTickerAutoRequestScreen.java | 197 ++++++++++++++++++ .../stockTicker/StockTickerBlock.java | 33 +++ .../stockTicker/StockTickerBlockEntity.java | 100 ++++++++- .../StockTickerConfigurationPacket.java | 62 ++++++ 9 files changed, 421 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerAutoRequestScreen.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerConfigurationPacket.java diff --git a/src/main/java/com/simibubi/create/AllPackets.java b/src/main/java/com/simibubi/create/AllPackets.java index aac0004732..45dafc873e 100644 --- a/src/main/java/com/simibubi/create/AllPackets.java +++ b/src/main/java/com/simibubi/create/AllPackets.java @@ -62,6 +62,7 @@ import com.simibubi.create.content.logistics.packagePort.PackagePortPlacementPac import com.simibubi.create.content.logistics.stockTicker.LogisticalStockRequestPacket; import com.simibubi.create.content.logistics.stockTicker.LogisticalStockResponsePacket; import com.simibubi.create.content.logistics.stockTicker.PackageOrderRequestPacket; +import com.simibubi.create.content.logistics.stockTicker.StockTickerConfigurationPacket; import com.simibubi.create.content.logistics.tunnel.TunnelFlapPacket; import com.simibubi.create.content.redstone.displayLink.DisplayLinkConfigurationPacket; import com.simibubi.create.content.redstone.link.controller.LinkedControllerBindPacket; @@ -177,6 +178,7 @@ public enum AllPackets { CHAIN_CONVEYOR_CONNECT(ChainConveyorConnectionPacket.class, ChainConveyorConnectionPacket::new, PLAY_TO_SERVER), CHAIN_CONVEYOR_RIDING(ChainConveyorRidingPacket.class, ChainConveyorRidingPacket::new, PLAY_TO_SERVER), CHAIN_PACKAGE_INTERACTION(ChainPackageInteractionPacket.class, ChainPackageInteractionPacket::new, PLAY_TO_SERVER), + STOCK_TICKER_CONFIGURATION(StockTickerConfigurationPacket.class, StockTickerConfigurationPacket::new, PLAY_TO_SERVER), // Server to Client SYMMETRY_EFFECT(SymmetryEffectPacket.class, SymmetryEffectPacket::new, PLAY_TO_CLIENT), diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java index 454108aa54..57b228109a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java @@ -520,4 +520,27 @@ public class PackagerBlockEntity extends SmartBlockEntity { return animationTicks >= CYCLE / 2 ? ItemStack.EMPTY : heldBox; } + public boolean isTargetingSameInventory(IItemHandler inventory) { + IItemHandler myInventory = targetInventory.getInventory(); + if (myInventory == null || inventory == null) + return false; + + if (myInventory == inventory) + return true; + + // If a contained ItemStack instance is the same, we can be pretty sure these + // inventories are the same (works for compound inventories) + for (int i = 0; i < inventory.getSlots(); i++) { + ItemStack stackInSlot = inventory.getStackInSlot(i); + if (stackInSlot.isEmpty()) + continue; + for (int j = 0; j < myInventory.getSlots(); j++) + if (stackInSlot == myInventory.getStackInSlot(j)) + return true; + break; + } + + return false; + } + } diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java index 90eb7479ba..ad5fc93304 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java @@ -30,6 +30,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; +import net.minecraftforge.items.IItemHandler; public class LogisticallyLinkedBehaviour extends BlockEntityBehaviour { @@ -169,9 +170,10 @@ public class LogisticallyLinkedBehaviour extends BlockEntityBehaviour { } public int processRequest(ItemStack stack, int amount, String address, int linkIndex, MutableBoolean finalLink, - int orderId, @Nullable PackageOrder orderContext) { + int orderId, @Nullable PackageOrder orderContext, @Nullable IItemHandler ignoredHandler) { if (blockEntity instanceof PackagerLinkBlockEntity plbe) - return plbe.processRequest(stack, amount, address, linkIndex, finalLink, orderId, orderContext); + return plbe.processRequest(stack, amount, address, linkIndex, finalLink, orderId, orderContext, + ignoredHandler); return 0; } diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java index bdcb84cfad..a7953d3580 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java @@ -18,6 +18,7 @@ import net.minecraft.core.Direction; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.items.IItemHandler; public class PackagerLinkBlockEntity extends LinkWithBulbBlockEntity { @@ -38,10 +39,12 @@ public class PackagerLinkBlockEntity extends LinkWithBulbBlockEntity { } public int processRequest(ItemStack stack, int amount, String address, int linkIndex, MutableBoolean finalLink, - int orderId, @Nullable PackageOrder orderContext) { + int orderId, @Nullable PackageOrder orderContext, @Nullable IItemHandler ignoredHandler) { PackagerBlockEntity packager = getPackager(); if (packager == null || packager.defragmenterActive) return 0; + if (packager.isTargetingSameInventory(ignoredHandler)) + return 0; InventorySummary summary = packager.getAvailableItems(); int availableCount = summary.getCountOf(stack); diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrderRequestPacket.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrderRequestPacket.java index 8891553ea4..43929f2591 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrderRequestPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrderRequestPacket.java @@ -38,7 +38,7 @@ public class PackageOrderRequestPacket extends BlockEntityConfigurationPacket modifiedAmounts; + + public StockTickerAutoRequestScreen(StockTickerBlockEntity be) { + super(be.getBlockState() + .getBlock() + .getName()); + blockEntity = be; + blockEntity.lastClientsideStockSnapshot = null; + modifiedAmounts = null; + } + + private void resetAmounts() { + modifiedAmounts = new ArrayList<>(); + for (IntAttached intAttached : blockEntity.restockAmounts) + modifiedAmounts.add(intAttached.getFirst()); + } + + @Override + protected void init() { + setWindowSize(256, 128); + super.init(); + + int x = guiLeft; + int y = guiTop; + + takeSnapshotButton = Button.builder(Components.literal("Take Snapshot"), this::onPress) + .bounds(x, y + 44, 100, 20) + .build(); + + MutableComponent addressLabel = CreateLang.translateDirect("gui.stock_ticker.package_adress"); + boolean initial = addressBox == null; + addressBox = new EditBox(this.font, x, y + 80, 120, 9, addressLabel); + addressBox.setMaxLength(50); + addressBox.setBordered(false); + addressBox.setTextColor(0xffffff); + if (initial) + addressBox.setValue(blockEntity.restockAddress); + addRenderableWidget(addressBox); + addRenderableWidget(takeSnapshotButton); + } + + private void onPress(Button button) { + if (button == takeSnapshotButton) { + AllPackets.getChannel() + .sendToServer( + new StockTickerConfigurationPacket(blockEntity.getBlockPos(), true, "", Collections.emptyList())); + modifiedAmounts = null; + } + } + + @Override + public void removed() { + if (modifiedAmounts != null) + for (int i = 0; i < blockEntity.restockAmounts.size(); i++) + blockEntity.restockAmounts.get(i) + .setFirst(modifiedAmounts.get(i)); + AllPackets.getChannel() + .sendToServer(new StockTickerConfigurationPacket(blockEntity.getBlockPos(), false, addressBox.getValue(), + blockEntity.restockAmounts)); + super.removed(); + } + + final int rows = 8; + final int cols = 8; + final int rowHeight = 18; + final int colWidth = 26; + + @Override + protected void renderWindow(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + if (modifiedAmounts != null && blockEntity.restockAmounts.size() != modifiedAmounts.size()) + resetAmounts(); + + Color color = new Color(255, 255, 255, 50); + int hoveredSlot = getHoveredSlot(mouseX, mouseY); + + // Render some boxes + graphics.renderOutline(addressBox.getX() - 4, addressBox.getY() - 4, addressBox.getWidth() + 12, + addressBox.getHeight() + 7, color.getRGB()); + graphics.renderOutline(guiLeft - 3, guiTop - 4 + 20, cols * colWidth + 6, rowHeight + 8, color.getRGB()); + + // Render text input hints + if (addressBox.getValue() + .isBlank()) + graphics.drawString(font, addressBox.getMessage(), addressBox.getX(), addressBox.getY(), 0x88dddddd); + + graphics.drawString(font, Components.literal("Target Amounts:"), guiLeft, guiTop, 0x88dddddd); + PoseStack ms = graphics.pose(); + + for (int i = 0; i < blockEntity.restockAmounts.size(); i++) { + IntAttached entry = blockEntity.restockAmounts.get(i); + ms.pushPose(); + + ms.translate(guiLeft + i % cols * colWidth, guiTop + 20 + i / cols * rowHeight, 200); + + int customCount = modifiedAmounts == null ? blockEntity.restockAmounts.get(i) + .getFirst() : modifiedAmounts.get(i); + drawItemCount(graphics, customCount, customCount); + ms.translate(0, 0, -200); + + float scaleFromHover = hoveredSlot == i ? 1.075f : 1; + ms.translate((colWidth - 18) / 2.0, (rowHeight - 18) / 2.0, 0); + ms.translate(18 / 2.0, 18 / 2.0, 0); + ms.scale(scaleFromHover, scaleFromHover, scaleFromHover); + ms.translate(-18 / 2.0, -18 / 2.0, 0); + GuiGameElement.of(entry.getSecond()) + .render(graphics); + ms.popPose(); + } + + if (hoveredSlot != -1) + graphics.renderTooltip(font, blockEntity.restockAmounts.get(hoveredSlot) + .getValue(), mouseX, mouseY); + } + + private int getHoveredSlot(int mouseX, int mouseY) { + if (mouseY < guiTop + 20 || mouseY > guiTop + 20 + rowHeight) + return -1; + int slot = (mouseX - guiLeft) / colWidth; + if (slot >= blockEntity.restockAmounts.size()) + return -1; + return Math.max(-1, slot); + } + + @Override + public boolean mouseScrolled(double pMouseX, double pMouseY, double pDelta) { + if (modifiedAmounts == null) + resetAmounts(); + int hoveredSlot = getHoveredSlot(Mth.floor(pMouseX), Mth.floor(pMouseY)); + if (hoveredSlot != -1) { + int amount = modifiedAmounts.get(hoveredSlot); + amount += (hasShiftDown() ? 64 : 1) * Math.signum(pDelta); + if (hasShiftDown()) + amount = 64 * (amount / 64); + amount = Math.max(amount, 1); + modifiedAmounts.set(hoveredSlot, amount); + return true; + } + + return super.mouseScrolled(pMouseX, pMouseY, pDelta); + } + + private void drawItemCount(GuiGraphics graphics, int count, int customCount) { + boolean special = customCount != count; + if (!special && count == 1) + return; + + count = customCount; + String text = count >= 1000000 ? (count / 1000000) + "m" + : count >= 10000 ? (count / 1000) + "k" + : count >= 1000 ? ((count * 10) / 1000) / 10f + "k" + : count >= 100 ? count + "" : count > 0 ? " " + count : " \u2714"; + + int lightOutline = 0x444444; + int darkOutline = 0x222222; + int middleColor = special ? 0xaaffaa : 0xdddddd; + + for (int xi : Iterate.positiveAndNegative) + graphics.drawString(font, CreateLang.text(text) + .component(), 11 + xi, 10, xi < 0 ? lightOutline : darkOutline, false); + for (int yi : Iterate.positiveAndNegative) + graphics.drawString(font, CreateLang.text(text) + .component(), 11, 10 + yi, yi < 0 ? lightOutline : darkOutline, false); + graphics.drawString(font, CreateLang.text(text) + .component(), 11, 10, middleColor, false); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlock.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlock.java index 31fb315306..859c8e3d52 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlock.java @@ -6,21 +6,29 @@ import com.simibubi.create.AllPartialModels; import com.simibubi.create.AllShapes; import com.simibubi.create.foundation.block.IBE; +import net.createmod.catnip.gui.ScreenOpener; +import net.minecraft.client.player.LocalPlayer; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.HorizontalDirectionalBlock; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition.Builder; +import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.fml.DistExecutor; public class StockTickerBlock extends HorizontalDirectionalBlock implements IBE { @@ -42,6 +50,31 @@ public class StockTickerBlock extends HorizontalDirectionalBlock implements IBE< super.createBlockStateDefinition(pBuilder.add(FACING)); } + @Override + public InteractionResult use(BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, + BlockHitResult pHit) { + return onBlockEntityUse(pLevel, pPos, stbe -> { + if (!stbe.observedInventory.hasInventory()) + return InteractionResult.PASS; + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> displayScreen(stbe, pPlayer)); + return InteractionResult.SUCCESS; + }); + } + + @Override + public void neighborChanged(BlockState pState, Level pLevel, BlockPos pPos, Block pNeighborBlock, + BlockPos pNeighborPos, boolean pMovedByPiston) { + if (pLevel.isClientSide()) + return; + withBlockEntityDo(pLevel, pPos, StockTickerBlockEntity::onRedstonePowerChanged); + } + + @OnlyIn(value = Dist.CLIENT) + protected void displayScreen(StockTickerBlockEntity be, Player player) { + if (player instanceof LocalPlayer) + ScreenOpener.open(new StockTickerAutoRequestScreen(be)); + } + @Override public VoxelShape getShape(BlockState pState, BlockGetter pLevel, BlockPos pPos, CollisionContext pContext) { return AllShapes.STOCK_TICKER; diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java index faa3b0d157..60f9b3c8a1 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java @@ -6,27 +6,49 @@ import java.util.List; import org.apache.commons.lang3.mutable.MutableBoolean; import com.simibubi.create.AllPackets; +import com.simibubi.create.content.logistics.packager.InventorySummary; import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedBehaviour; +import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; +import com.simibubi.create.foundation.blockEntity.behaviour.inventory.InvManipulationBehaviour; +import net.createmod.catnip.utility.BlockFace; import net.createmod.catnip.utility.IntAttached; +import net.createmod.catnip.utility.NBTHelper; import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.entity.player.Player; +import net.minecraft.nbt.Tag; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.items.IItemHandler; public class StockTickerBlockEntity extends StockCheckingBlockEntity { + // Player-interface Feature protected List> lastClientsideStockSnapshot; protected List> newlyReceivedStockSnapshot; - protected String previouslyUsedAddress; protected int activeLinks; + // Auto-restock Feature + protected InvManipulationBehaviour observedInventory; + protected List> restockAmounts; + protected String restockAddress; + protected boolean powered; + public StockTickerBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); previouslyUsedAddress = ""; + restockAddress = ""; + restockAmounts = new ArrayList<>(); + } + + @Override + public void addBehaviours(List behaviours) { + super.addBehaviours(behaviours); + behaviours + .add(observedInventory = new InvManipulationBehaviour(this, (w, p, s) -> new BlockFace(p, Direction.DOWN))); } public void refreshClientStockSnapshot() { @@ -53,6 +75,11 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity { protected void write(CompoundTag tag, boolean clientPacket) { super.write(tag, clientPacket); tag.putString("PreviousAddress", previouslyUsedAddress); + tag.put("RestockAmounts", + NBTHelper.writeCompoundList(restockAmounts, ia -> ia.serializeNBT(ItemStack::serializeNBT))); + tag.putString("RestockAddress", restockAddress); + tag.putBoolean("Powered", powered); + if (clientPacket) tag.putInt("ActiveLinks", activeLinks); } @@ -61,10 +88,73 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity { protected void read(CompoundTag tag, boolean clientPacket) { super.read(tag, clientPacket); previouslyUsedAddress = tag.getString("PreviousAddress"); + restockAmounts = NBTHelper.readCompoundList(tag.getList("RestockAmounts", Tag.TAG_COMPOUND), + c -> IntAttached.read(c, ItemStack::of)); + restockAddress = tag.getString("RestockAddress"); + powered = tag.getBoolean("Powered"); + if (clientPacket) activeLinks = tag.getInt("ActiveLinks"); } + protected void takeInventoryStockSnapshot() { + restockAmounts = new ArrayList<>(); + IItemHandler inventory = observedInventory.getInventory(); + if (inventory == null) + return; + restockAmounts = summariseObservedInventory().getStacksByCount(); + if (restockAmounts.size() > 8) + restockAmounts.subList(8, restockAmounts.size()) + .clear(); + notifyUpdate(); + } + + private InventorySummary summariseObservedInventory() { + IItemHandler inventory = observedInventory.getInventory(); + if (inventory == null) + return InventorySummary.EMPTY; + InventorySummary inventorySummary = new InventorySummary(); + for (int i = 0; i < inventory.getSlots(); i++) + inventorySummary.add(inventory.getStackInSlot(i)); + return inventorySummary; + } + + protected void onRedstonePowerChanged() { + boolean hasNeighborSignal = level.hasNeighborSignal(worldPosition); + if (powered == hasNeighborSignal) + return; + + if (hasNeighborSignal) + triggerRestock(); + + powered = hasNeighborSignal; + setChanged(); + } + + protected void triggerRestock() { + if (!observedInventory.hasInventory() || restockAmounts.isEmpty()) + return; + + InventorySummary presentStock = summariseObservedInventory(); + List> missingItems = new ArrayList<>(); + for (IntAttached required : restockAmounts) { + int diff = required.getFirst() - presentStock.getCountOf(required.getValue()); + if (diff > 0) + missingItems.add(IntAttached.with(diff, required.getValue())); + } + + if (missingItems.isEmpty()) + return; + + broadcastPackageRequest(new PackageOrder(missingItems), observedInventory.getInventory(), restockAddress); + } + + protected void updateAutoRestockSettings(String address, List> amounts) { + restockAmounts = amounts; + restockAddress = address; + notifyUpdate(); + } + public void receiveStockPacket(List> stacks, boolean endOfTransmission) { if (newlyReceivedStockSnapshot == null) newlyReceivedStockSnapshot = new ArrayList<>(); @@ -75,7 +165,7 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity { newlyReceivedStockSnapshot = null; } - public void receivePackageRequest(PackageOrder order, Player player, String address) { + public void broadcastPackageRequest(PackageOrder order, IItemHandler ignoredHandler, String address) { List> stacks = order.stacks(); // Packages need to track their index and successors for successful defrag @@ -87,7 +177,7 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity { PackageOrder contextToSend = order; // Packages from future orders should not be merged in the packager queue - int orderId = player.level().random.nextInt(); + int orderId = level.random.nextInt(); for (int i = 0; i < stacks.size(); i++) { IntAttached entry = stacks.get(i); @@ -103,7 +193,7 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity { isFinalLink = finalLinkTracker; int processedCount = link.processRequest(requestedItem, remainingCount, address, linkIndex, isFinalLink, - orderId, contextToSend); + orderId, contextToSend, ignoredHandler); if (processedCount > 0 && usedIndex == -1) { contextToSend = null; usedLinks.add(link); diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerConfigurationPacket.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerConfigurationPacket.java new file mode 100644 index 0000000000..60b72454a3 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerConfigurationPacket.java @@ -0,0 +1,62 @@ +package com.simibubi.create.content.logistics.stockTicker; + +import java.util.ArrayList; +import java.util.List; + +import com.simibubi.create.foundation.networking.BlockEntityConfigurationPacket; + +import net.createmod.catnip.utility.IntAttached; +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.item.ItemStack; + +public class StockTickerConfigurationPacket extends BlockEntityConfigurationPacket { + + private boolean takeSnapshot; + private String address; + private List> amounts; + + public StockTickerConfigurationPacket(BlockPos pos, boolean takeSnapshot, String address, + List> amounts) { + super(pos); + this.takeSnapshot = takeSnapshot; + this.address = address; + this.amounts = amounts; + } + + public StockTickerConfigurationPacket(FriendlyByteBuf buffer) { + super(buffer); + } + + @Override + protected void writeSettings(FriendlyByteBuf buffer) { + buffer.writeBoolean(takeSnapshot); + buffer.writeUtf(address); + buffer.writeVarInt(amounts.size()); + for (IntAttached intAttached : amounts) { + buffer.writeVarInt(intAttached.getFirst()); + buffer.writeItem(intAttached.getValue()); + } + } + + @Override + protected void readSettings(FriendlyByteBuf buffer) { + takeSnapshot = buffer.readBoolean(); + address = buffer.readUtf(); + int items = buffer.readVarInt(); + amounts = new ArrayList<>(); + for (int i = 0; i < items; i++) + amounts.add(IntAttached.with(buffer.readVarInt(), buffer.readItem())); + } + + @Override + protected void applySettings(StockTickerBlockEntity be) { + if (takeSnapshot) { + be.takeInventoryStockSnapshot(); + return; + } + + be.updateAutoRestockSettings(address, amounts); + } + +} From c4a5468f57b3cc2a1fe431dca35acba9e0b56f99 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 13 Sep 2024 17:22:36 +0200 Subject: [PATCH 043/515] Great timing - Added the pulse timer --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 14 +- .../create/blockstates/pulse_timer.json | 124 ++++++++++++++++++ .../resources/assets/create/lang/en_ud.json | 1 + .../resources/assets/create/lang/en_us.json | 1 + .../models/block/pulse_timer_powered.json | 6 + .../block/pulse_timer_powered_powering.json | 7 + .../models/block/pulse_timer_powering.json | 7 + .../create/models/item/pulse_timer.json | 6 + .../loot_tables/blocks/pulse_timer.json | 21 +++ .../data/create/tags/blocks/safe_nbt.json | 1 + .../simibubi/create/AllBlockEntityTypes.java | 8 ++ .../java/com/simibubi/create/AllBlocks.java | 12 +- .../redstone/diodes/BrassDiodeBlock.java | 5 +- .../diodes/BrassDiodeBlockEntity.java | 6 +- .../diodes/PulseTimerBlockEntity.java | 36 +++++ .../models/block/diodes/pulse_timer.json | 75 +++++++++++ .../block/diodes/amethyst_diode_base.png | Bin 0 -> 320 bytes .../block/diodes/pulse_timer/idle.png | Bin 0 -> 329 bytes .../block/diodes/pulse_timer/item.png | Bin 0 -> 329 bytes .../block/diodes/pulse_timer/powered.png | Bin 0 -> 336 bytes .../diodes/pulse_timer/powered_powering.png | Bin 0 -> 329 bytes .../block/diodes/pulse_timer/powering.png | Bin 0 -> 337 bytes 22 files changed, 322 insertions(+), 8 deletions(-) create mode 100644 src/generated/resources/assets/create/blockstates/pulse_timer.json create mode 100644 src/generated/resources/assets/create/models/block/pulse_timer_powered.json create mode 100644 src/generated/resources/assets/create/models/block/pulse_timer_powered_powering.json create mode 100644 src/generated/resources/assets/create/models/block/pulse_timer_powering.json create mode 100644 src/generated/resources/assets/create/models/item/pulse_timer.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/pulse_timer.json create mode 100644 src/main/java/com/simibubi/create/content/redstone/diodes/PulseTimerBlockEntity.java create mode 100644 src/main/resources/assets/create/models/block/diodes/pulse_timer.json create mode 100644 src/main/resources/assets/create/textures/block/diodes/amethyst_diode_base.png create mode 100644 src/main/resources/assets/create/textures/block/diodes/pulse_timer/idle.png create mode 100644 src/main/resources/assets/create/textures/block/diodes/pulse_timer/item.png create mode 100644 src/main/resources/assets/create/textures/block/diodes/pulse_timer/powered.png create mode 100644 src/main/resources/assets/create/textures/block/diodes/pulse_timer/powered_powering.png create mode 100644 src/main/resources/assets/create/textures/block/diodes/pulse_timer/powering.png diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 2d0c07e687..f62cb353a5 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-09-12T18:35:03.2786801 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-09-13T16:19:53.5157579 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -422,6 +422,7 @@ b1f5ad596067cb4c84eb53b2c7b359be76f1cfbe assets/create/blockstates/powered_shaft df7af1e49c53ae99ac3f0b2fca5d948b8ea91938 assets/create/blockstates/pulley_magnet.json 89d763258c53aa12a1e0c0e586ab701f3de5a1b5 assets/create/blockstates/pulse_extender.json 81281435b8d1eeb4f1e318c6d14d49fa1fd86820 assets/create/blockstates/pulse_repeater.json +65bfd8283749117663f7199204691758fd286e38 assets/create/blockstates/pulse_timer.json b658654aa97e8dd2c897f432a601835a3f8aca10 assets/create/blockstates/purple_nixie_tube.json f8f9802df9c0b4e39edeefc3b1abb38255d79801 assets/create/blockstates/purple_sail.json 91b5ab66d7ec5235d278ee2bed6ddd88f39ce81d assets/create/blockstates/purple_seat.json @@ -590,8 +591,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -20b568e230c8a0f35c3ffc21d76001e4832e606c assets/create/lang/en_ud.json -cdf84caeef5420a50ce11c5f7c931600436260b5 assets/create/lang/en_us.json +4eb67203a52afbfe4131617cc61d6da1ce5f4000 assets/create/lang/en_ud.json +454816b2ff679522f371744d93bc32d8292f9248 assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -1390,6 +1391,9 @@ b21ec7cde56398b65f44922ddb026d9adb7b6072 assets/create/models/block/polished_cut 66374fdc4d3d55f99b03e406f3b594f8b1bab94d assets/create/models/block/pulse_repeater_powered.json 6bd0d85ca18b468bee279e7bc398bc8395e33a8b assets/create/models/block/pulse_repeater_powered_powering.json de0cc956e7ff1510d0947ca8fd2b6e642944f0ee assets/create/models/block/pulse_repeater_powering.json +addbe93af945ff7ca2680a27225db804d3ac9b46 assets/create/models/block/pulse_timer_powered.json +ab3d7e10abcb53b835d6f5c406b7a777a942d6f7 assets/create/models/block/pulse_timer_powered_powering.json +7b425d9db8d914b52b7faad2f792c020b678f84d assets/create/models/block/pulse_timer_powering.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/purple_nixie_tube.json 356378a5839b0b400aa5e0a67740634113c09a38 assets/create/models/block/purple_sail.json bc8e473a5662b6180b00b85e5006241a283c9baa assets/create/models/block/purple_seat.json @@ -2124,6 +2128,7 @@ bd70b798ca9f73f4e5aabc30e286487f5363122e assets/create/models/item/precision_mec d9a736e7a6fc70e0848de3e318c739d58b1e563f assets/create/models/item/propeller.json 9b41eec5759887be9bae3d27654bf478a7eff676 assets/create/models/item/pulse_extender.json ea76bd3bd9e5bea4d64d91347d473b538e926b02 assets/create/models/item/pulse_repeater.json +6ff9ce0cc633ea39b779b2e873a1d0fd7cfe7119 assets/create/models/item/pulse_timer.json 7e165f83266edf34bb03fa3e8d2a83d44829c10a assets/create/models/item/purple_seat.json d75c4969334f2ee1ae4a3d8ac28b001735c76b97 assets/create/models/item/purple_toolbox.json ebffb05119f499fcec051a4337aadc47654baed2 assets/create/models/item/purple_valve_handle.json @@ -3379,6 +3384,7 @@ afe84b9468fba532acc447236a9a0cbdd02c4560 data/create/loot_tables/blocks/powered_ fbc433a7e8518860bc828a52b56dba92e4dff66c data/create/loot_tables/blocks/pulley_magnet.json e654e6cedc0373e97caea947e7e605bc4095da88 data/create/loot_tables/blocks/pulse_extender.json 422385f062dd63edaf246c42fb0e617e92e6cc44 data/create/loot_tables/blocks/pulse_repeater.json +93f0c41aedaa2b9baceda78b93a4b3198962e3f9 data/create/loot_tables/blocks/pulse_timer.json 6f453ea136098a5872aeb4e2ad1e5b78d2fd571f data/create/loot_tables/blocks/purple_nixie_tube.json c6b7a02db55cf0824a48156adf469c478dfd6a8d data/create/loot_tables/blocks/purple_sail.json 73cd7cc36fafb491666d2bccf1b4f24624b3c8f2 data/create/loot_tables/blocks/purple_seat.json @@ -4201,7 +4207,7 @@ a1e21c22f32354fd1a82a1b0a59dd786c0deaba0 data/create/tags/blocks/movable_empty_c 4970078b49ddac1b1d500ed0469cedf42bdc3d35 data/create/tags/blocks/non_movable.json 06e13efbb7b0d09ff7ecd1a7dc45a0760b91ad67 data/create/tags/blocks/ore_override_stone.json a5874f73c7dc0a3ae12999e6ae8abf45bc7fb9be data/create/tags/blocks/passive_boiler_heaters.json -3928cfdba3f941456bb05005fa0c36966a3aa880 data/create/tags/blocks/safe_nbt.json +4926993b3e8a853f6c32847bc31b13d9a4da0b8a data/create/tags/blocks/safe_nbt.json 79418bd729cef417b322cef9b491e7ae83317d61 data/create/tags/blocks/seats.json 5def5088f7fd31b80e6f28c1c4ea146aa9d7d15b data/create/tags/blocks/toolboxes.json 2589b135c0e96ad29076569e144528fe32ea5b39 data/create/tags/blocks/tracks.json diff --git a/src/generated/resources/assets/create/blockstates/pulse_timer.json b/src/generated/resources/assets/create/blockstates/pulse_timer.json new file mode 100644 index 0000000000..9bafc697fe --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/pulse_timer.json @@ -0,0 +1,124 @@ +{ + "variants": { + "facing=east,inverted=false,powered=false,powering=false": { + "model": "create:block/diodes/pulse_timer", + "y": 270 + }, + "facing=east,inverted=false,powered=false,powering=true": { + "model": "create:block/pulse_timer_powering", + "y": 270 + }, + "facing=east,inverted=false,powered=true,powering=false": { + "model": "create:block/pulse_timer_powered", + "y": 270 + }, + "facing=east,inverted=false,powered=true,powering=true": { + "model": "create:block/pulse_timer_powered_powering", + "y": 270 + }, + "facing=east,inverted=true,powered=false,powering=false": { + "model": "create:block/pulse_timer_powering", + "y": 270 + }, + "facing=east,inverted=true,powered=false,powering=true": { + "model": "create:block/diodes/pulse_timer", + "y": 270 + }, + "facing=east,inverted=true,powered=true,powering=false": { + "model": "create:block/pulse_timer_powered_powering", + "y": 270 + }, + "facing=east,inverted=true,powered=true,powering=true": { + "model": "create:block/pulse_timer_powered", + "y": 270 + }, + "facing=north,inverted=false,powered=false,powering=false": { + "model": "create:block/diodes/pulse_timer", + "y": 180 + }, + "facing=north,inverted=false,powered=false,powering=true": { + "model": "create:block/pulse_timer_powering", + "y": 180 + }, + "facing=north,inverted=false,powered=true,powering=false": { + "model": "create:block/pulse_timer_powered", + "y": 180 + }, + "facing=north,inverted=false,powered=true,powering=true": { + "model": "create:block/pulse_timer_powered_powering", + "y": 180 + }, + "facing=north,inverted=true,powered=false,powering=false": { + "model": "create:block/pulse_timer_powering", + "y": 180 + }, + "facing=north,inverted=true,powered=false,powering=true": { + "model": "create:block/diodes/pulse_timer", + "y": 180 + }, + "facing=north,inverted=true,powered=true,powering=false": { + "model": "create:block/pulse_timer_powered_powering", + "y": 180 + }, + "facing=north,inverted=true,powered=true,powering=true": { + "model": "create:block/pulse_timer_powered", + "y": 180 + }, + "facing=south,inverted=false,powered=false,powering=false": { + "model": "create:block/diodes/pulse_timer" + }, + "facing=south,inverted=false,powered=false,powering=true": { + "model": "create:block/pulse_timer_powering" + }, + "facing=south,inverted=false,powered=true,powering=false": { + "model": "create:block/pulse_timer_powered" + }, + "facing=south,inverted=false,powered=true,powering=true": { + "model": "create:block/pulse_timer_powered_powering" + }, + "facing=south,inverted=true,powered=false,powering=false": { + "model": "create:block/pulse_timer_powering" + }, + "facing=south,inverted=true,powered=false,powering=true": { + "model": "create:block/diodes/pulse_timer" + }, + "facing=south,inverted=true,powered=true,powering=false": { + "model": "create:block/pulse_timer_powered_powering" + }, + "facing=south,inverted=true,powered=true,powering=true": { + "model": "create:block/pulse_timer_powered" + }, + "facing=west,inverted=false,powered=false,powering=false": { + "model": "create:block/diodes/pulse_timer", + "y": 90 + }, + "facing=west,inverted=false,powered=false,powering=true": { + "model": "create:block/pulse_timer_powering", + "y": 90 + }, + "facing=west,inverted=false,powered=true,powering=false": { + "model": "create:block/pulse_timer_powered", + "y": 90 + }, + "facing=west,inverted=false,powered=true,powering=true": { + "model": "create:block/pulse_timer_powered_powering", + "y": 90 + }, + "facing=west,inverted=true,powered=false,powering=false": { + "model": "create:block/pulse_timer_powering", + "y": 90 + }, + "facing=west,inverted=true,powered=false,powering=true": { + "model": "create:block/diodes/pulse_timer", + "y": 90 + }, + "facing=west,inverted=true,powered=true,powering=false": { + "model": "create:block/pulse_timer_powered_powering", + "y": 90 + }, + "facing=west,inverted=true,powered=true,powering=true": { + "model": "create:block/pulse_timer_powered", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 6d4da1b470..d4d1fe9268 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -642,6 +642,7 @@ "block.create.pulley_magnet": "ʇǝubɐW ʎǝןןnԀ", "block.create.pulse_extender": "ɹǝpuǝʇxƎ ǝsןnԀ", "block.create.pulse_repeater": "ɹǝʇɐǝdǝᴚ ǝsןnԀ", + "block.create.pulse_timer": "ɹǝɯı⟘ ǝsןnԀ", "block.create.purple_nixie_tube": "ǝqn⟘ ǝıxıN ǝןdɹnԀ", "block.create.purple_sail": "ןıɐS ǝןdɹnԀ", "block.create.purple_seat": "ʇɐǝS ǝןdɹnԀ", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 8c043be41d..97efc7b076 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -642,6 +642,7 @@ "block.create.pulley_magnet": "Pulley Magnet", "block.create.pulse_extender": "Pulse Extender", "block.create.pulse_repeater": "Pulse Repeater", + "block.create.pulse_timer": "Pulse Timer", "block.create.purple_nixie_tube": "Purple Nixie Tube", "block.create.purple_sail": "Purple Sail", "block.create.purple_seat": "Purple Seat", diff --git a/src/generated/resources/assets/create/models/block/pulse_timer_powered.json b/src/generated/resources/assets/create/models/block/pulse_timer_powered.json new file mode 100644 index 0000000000..2a9436c93a --- /dev/null +++ b/src/generated/resources/assets/create/models/block/pulse_timer_powered.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/diodes/pulse_timer", + "textures": { + "top": "create:block/diodes/pulse_timer/powered" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/pulse_timer_powered_powering.json b/src/generated/resources/assets/create/models/block/pulse_timer_powered_powering.json new file mode 100644 index 0000000000..f70f3548bb --- /dev/null +++ b/src/generated/resources/assets/create/models/block/pulse_timer_powered_powering.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/diodes/pulse_timer", + "textures": { + "top": "create:block/diodes/pulse_timer/powered_powering", + "torch": "minecraft:block/redstone_torch" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/pulse_timer_powering.json b/src/generated/resources/assets/create/models/block/pulse_timer_powering.json new file mode 100644 index 0000000000..8d437e1e64 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/pulse_timer_powering.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/diodes/pulse_timer", + "textures": { + "top": "create:block/diodes/pulse_timer/powering", + "torch": "minecraft:block/redstone_torch" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/pulse_timer.json b/src/generated/resources/assets/create/models/item/pulse_timer.json new file mode 100644 index 0000000000..ddecb0a494 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/pulse_timer.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/diodes/pulse_timer", + "textures": { + "top": "create:block/diodes/pulse_timer/item" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/pulse_timer.json b/src/generated/resources/data/create/loot_tables/blocks/pulse_timer.json new file mode 100644 index 0000000000..fe56ca9642 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/pulse_timer.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:pulse_timer" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/pulse_timer" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/tags/blocks/safe_nbt.json b/src/generated/resources/data/create/tags/blocks/safe_nbt.json index 3db7d70241..5dd7f71217 100644 --- a/src/generated/resources/data/create/tags/blocks/safe_nbt.json +++ b/src/generated/resources/data/create/tags/blocks/safe_nbt.json @@ -22,6 +22,7 @@ "create:analog_lever", "create:pulse_repeater", "create:pulse_extender", + "create:pulse_timer", "create:clipboard", "#minecraft:banners", "#minecraft:signs" diff --git a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java index 97f7209cde..274c1106dc 100644 --- a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java +++ b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java @@ -192,6 +192,7 @@ import com.simibubi.create.content.redstone.diodes.BrassDiodeInstance; import com.simibubi.create.content.redstone.diodes.BrassDiodeRenderer; import com.simibubi.create.content.redstone.diodes.PulseExtenderBlockEntity; import com.simibubi.create.content.redstone.diodes.PulseRepeaterBlockEntity; +import com.simibubi.create.content.redstone.diodes.PulseTimerBlockEntity; import com.simibubi.create.content.redstone.displayLink.DisplayLinkBlockEntity; import com.simibubi.create.content.redstone.displayLink.LinkBulbRenderer; import com.simibubi.create.content.redstone.displayLink.source.NixieTubeDisplaySource; @@ -834,6 +835,13 @@ public class AllBlockEntityTypes { .validBlocks(AllBlocks.PULSE_REPEATER) .renderer(() -> BrassDiodeRenderer::new) .register(); + + public static final BlockEntityEntry PULSE_TIMER = REGISTRATE + .blockEntity("pulse_timer", PulseTimerBlockEntity::new) + .instance(() -> BrassDiodeInstance::new, false) + .validBlocks(AllBlocks.PULSE_TIMER) + .renderer(() -> BrassDiodeRenderer::new) + .register(); public static final BlockEntityEntry LECTERN_CONTROLLER = REGISTRATE .blockEntity("lectern_controller", LecternControllerBlockEntity::new) diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 461b395ce7..c53567da66 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -177,8 +177,8 @@ import com.simibubi.create.content.logistics.packagePort.PackagePortBlock; import com.simibubi.create.content.logistics.packagePort.PackagePortItem; import com.simibubi.create.content.logistics.packager.PackagerBlock; import com.simibubi.create.content.logistics.packager.PackagerGenerator; -import com.simibubi.create.content.logistics.packagerLink.PackagerLinkBlock; import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedBlockItem; +import com.simibubi.create.content.logistics.packagerLink.PackagerLinkBlock; import com.simibubi.create.content.logistics.stockTicker.StockTickerBlock; import com.simibubi.create.content.logistics.tunnel.BeltTunnelBlock; import com.simibubi.create.content.logistics.tunnel.BrassTunnelBlock; @@ -1934,6 +1934,16 @@ public class AllBlocks { .build() .register(); + public static final BlockEntry PULSE_TIMER = REGISTRATE.block("pulse_timer", BrassDiodeBlock::new) + .initialProperties(() -> Blocks.REPEATER) + .tag(AllBlockTags.SAFE_NBT.tag) + .blockstate(new BrassDiodeGenerator()::generate) + .addLayer(() -> RenderType::cutoutMipped) + .item() + .model(AbstractDiodeGenerator::diodeItemModel) + .build() + .register(); + public static final BlockEntry POWERED_LATCH = REGISTRATE.block("powered_latch", PoweredLatchBlock::new) .initialProperties(() -> Blocks.REPEATER) diff --git a/src/main/java/com/simibubi/create/content/redstone/diodes/BrassDiodeBlock.java b/src/main/java/com/simibubi/create/content/redstone/diodes/BrassDiodeBlock.java index c80c6a4a97..74510831a3 100644 --- a/src/main/java/com/simibubi/create/content/redstone/diodes/BrassDiodeBlock.java +++ b/src/main/java/com/simibubi/create/content/redstone/diodes/BrassDiodeBlock.java @@ -91,8 +91,9 @@ public class BrassDiodeBlock extends AbstractDiodeBlock implements IBE getBlockEntityType() { - return AllBlocks.PULSE_EXTENDER.is(this) ? AllBlockEntityTypes.PULSE_EXTENDER.get() - : AllBlockEntityTypes.PULSE_REPEATER.get(); + return AllBlocks.PULSE_TIMER.is(this) ? AllBlockEntityTypes.PULSE_TIMER.get() + : AllBlocks.PULSE_EXTENDER.is(this) ? AllBlockEntityTypes.PULSE_EXTENDER.get() + : AllBlockEntityTypes.PULSE_REPEATER.get(); } } diff --git a/src/main/java/com/simibubi/create/content/redstone/diodes/BrassDiodeBlockEntity.java b/src/main/java/com/simibubi/create/content/redstone/diodes/BrassDiodeBlockEntity.java index e3e09625b0..971ea3a50b 100644 --- a/src/main/java/com/simibubi/create/content/redstone/diodes/BrassDiodeBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/redstone/diodes/BrassDiodeBlockEntity.java @@ -34,10 +34,14 @@ public abstract class BrassDiodeBlockEntity extends SmartBlockEntity implements new BrassDiodeScrollSlot()).between(2, 60 * 20 * 60); maxState.withFormatter(this::format); maxState.withCallback(this::onMaxDelayChanged); - maxState.setValue(2); + maxState.setValue(defaultValue()); behaviours.add(maxState); } + protected int defaultValue() { + return 2; + } + public float getProgress() { int max = Math.max(2, maxState.getValue()); return Mth.clamp(state, 0, max) / (float) max; diff --git a/src/main/java/com/simibubi/create/content/redstone/diodes/PulseTimerBlockEntity.java b/src/main/java/com/simibubi/create/content/redstone/diodes/PulseTimerBlockEntity.java new file mode 100644 index 0000000000..4b6ad09289 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/redstone/diodes/PulseTimerBlockEntity.java @@ -0,0 +1,36 @@ +package com.simibubi.create.content.redstone.diodes; + +import static com.simibubi.create.content.redstone.diodes.BrassDiodeBlock.POWERING; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; + +public class PulseTimerBlockEntity extends BrassDiodeBlockEntity { + + public PulseTimerBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { + super(type, pos, state); + } + + @Override + protected int defaultValue() { + return 20; + } + + @Override + protected void updateState(boolean powered, boolean powering, boolean atMax, boolean atMin) { + if (powered || state >= maxState.getValue() - 1) + state = 0; + else + state++; + + if (level.isClientSide) + return; + + boolean shouldPower = !powered && (maxState.getValue() == 2 ? state == 0 : state <= 1); + BlockState blockState = getBlockState(); + if (blockState.getValue(POWERING) != shouldPower) + level.setBlockAndUpdate(worldPosition, blockState.setValue(POWERING, shouldPower)); + } + +} diff --git a/src/main/resources/assets/create/models/block/diodes/pulse_timer.json b/src/main/resources/assets/create/models/block/diodes/pulse_timer.json new file mode 100644 index 0000000000..afc6082c94 --- /dev/null +++ b/src/main/resources/assets/create/models/block/diodes/pulse_timer.json @@ -0,0 +1,75 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "4": "create:block/diodes/amethyst_diode_base", + "particle": "create:block/diodes/amethyst_diode_base", + "top": "create:block/diodes/pulse_timer/idle", + "torch": "block/redstone_torch_off" + }, + "elements": [ + { + "name": "Top", + "from": [5, 2.1, 5], + "to": [11, 3.1, 11], + "faces": { + "north": {"uv": [5, 5, 11, 6], "rotation": 180, "texture": "#top"}, + "east": {"uv": [10, 5, 11, 11], "rotation": 90, "texture": "#top"}, + "south": {"uv": [5, 10, 11, 11], "texture": "#top"}, + "west": {"uv": [5, 11, 6, 5], "rotation": 90, "texture": "#top"}, + "up": {"uv": [5, 5, 11, 11], "texture": "#top"} + } + }, + { + "name": "circuit", + "from": [0, 0, 0], + "to": [16, 2, 16], + "faces": { + "north": {"uv": [0, 14, 16, 16], "texture": "#4"}, + "east": {"uv": [0, 0, 2, 16], "rotation": 270, "texture": "#4"}, + "south": {"uv": [0, 0, 16, 2], "rotation": 180, "texture": "#4"}, + "west": {"uv": [14, 0, 16, 16], "rotation": 90, "texture": "#4"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#top"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#4"} + } + }, + { + "name": "Front Torch", + "from": [6, 2, 1], + "to": [10, 8, 3], + "faces": { + "north": {"uv": [6, 5, 10, 11], "texture": "#torch"}, + "south": {"uv": [6, 5, 10, 11], "texture": "#torch"} + } + }, + { + "name": "Front Torch", + "from": [7, 2, 0], + "to": [9, 8, 4], + "faces": { + "east": {"uv": [6, 5, 10, 11], "texture": "#torch"}, + "west": {"uv": [6, 5, 10, 11], "texture": "#torch"} + } + }, + { + "name": "Front Torch Top", + "from": [7, 6, 1], + "to": [9, 7, 3], + "faces": { + "up": {"uv": [7, 6, 9, 8], "texture": "#torch"} + } + } + ], + "display": { + "gui": { + "rotation": [30, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.625, 0.625, 0.625] + }, + "fixed": { + "rotation": [270, 0, 0], + "translation": [0, 0, -3], + "scale": [0.5, 0.5, 0.5] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/block/diodes/amethyst_diode_base.png b/src/main/resources/assets/create/textures/block/diodes/amethyst_diode_base.png new file mode 100644 index 0000000000000000000000000000000000000000..986daff9c2c5709734827c032600391b01e893d8 GIT binary patch literal 320 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G|;0G|-o`uh5kl9K-Z{uL`$EMB~L!-frW=gv)WpVymp=KJZK-*;;Noql$H z!RPC%;*L*`cy};kbKmDD+mp{Nh}z#5>bJ#mF3=p#0*}aI1_r*vAk26?e?Xx66Jo1{;ap9`F9d-P6rY5v($!o7Lj{m-s(OD(<4V^t_F3t|)IIZGPB$N0a4+R9;5=hqft(htH^dVce|6E?Q|Q7YcM3 NgQu&X%Q~loCIGplfMEat literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/diodes/pulse_timer/idle.png b/src/main/resources/assets/create/textures/block/diodes/pulse_timer/idle.png new file mode 100644 index 0000000000000000000000000000000000000000..b3e9dedeb0d42f238de77ca14fde0d292d3363c8 GIT binary patch literal 329 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G|~0G|-o>e}k=-tOJIcduEsrlO+4osmh0nc?WEqbct5db7^_{Q2|JrAz-# zKRdtR^Sn&=^_Bjc`#%4^Q~UjN&XeuQ=N3d2xf}j_{bd8tG|mE#$YKTtzC$3)D5~Mr z02G|y>Ealo5p3JfD0EnXgGErJ(@og-_y6_ZHf%F*esE6FLqs7ebGptUp~=VQ7;|T& zg#?;%6{lG+T%2&_u4Bg=i#0k|ADP~~x#kP^tE;zOKG;^&Yp8zUF2k(mpL^!Tz4>Qd zFyDTI%z2r^2lH0m{dzBd&Bm=&Yc^IJvhc<0aD=6MdTIZTH`<&LBp}Fszy9#6MIRWi X&1cu&?f(wwPzDB1S3j3^P6_8i literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/diodes/pulse_timer/item.png b/src/main/resources/assets/create/textures/block/diodes/pulse_timer/item.png new file mode 100644 index 0000000000000000000000000000000000000000..40e0a3e3ec1f53f801d6edd2f6ce9c028844c71f GIT binary patch literal 329 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G|~0G|-o>e}k=-tOJIcduEsrlO+4osmh0nc?WEqbct5db7@)Wnfs!!0_+% zv-1l+&&zaQU+KTO@AL0Fwck(YJlURnZb4L$yJ5lRh+?2=oCO|{K$`Cm2s4Umcr^e8 zCwRIzhG+!a_A?3{R^VU}6zOym_Wk{T{kIL<%$pyaQ}hr~h{~LK)rKs5@j4t~>7HKNzvGQIX9Nidvfr;i{A$q$#%uH0 U^>_Qf138$%)78&qol`;+08!0?OaK4? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/diodes/pulse_timer/powered.png b/src/main/resources/assets/create/textures/block/diodes/pulse_timer/powered.png new file mode 100644 index 0000000000000000000000000000000000000000..67a036e9f6a0c0e5e6ff7efa9524230f56d6432c GIT binary patch literal 336 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G|y0G|-o>e}k=-tOJIcduEsrlO+4osmh0nc?WEqbct5db7^_{Q2|JrAz-# zKRdtR^Sn&=^_Bjc`#%4^Q~UjN&XeuQ=N3d2xf`BkU|7n)a4Xi&6KE!9fk$L90|Vb7 z5M~tB@M-`GPV{tf4ABU-?PnA^tiZt{*dx^I<~#e(|K+x8-kw$1QOqG^*^w5d+P&e2 z?hgrN?u?WWI~M&j6CX0T92PtCw#DOn?Bx)@u*q_+!L|!$ZIxl0wQTcuLxw0u4Yp%n zcV%7rR{p@QF2QQu#odipC#`zVRMyHFV1r0y^ eHD9AvB>(6m`;>P{ldXY{WAJqKb6Mw<&;$TcVud&W literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/diodes/pulse_timer/powered_powering.png b/src/main/resources/assets/create/textures/block/diodes/pulse_timer/powered_powering.png new file mode 100644 index 0000000000000000000000000000000000000000..e478c536b48d2287aca6d3506f2ffe136ce9f5ad GIT binary patch literal 329 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G|~0G|-o>e}k=-tOJIcduEsrlO+aECa(*28N@jj;6TJ>&-gz^XJb?moEJ~ z{p|dL&+{_f*H`*)?)&`vPVM*8IZw7HpIZ=Bh)k@<0A;g3mIpgXVSPJZX!DT-mm>$h-`_CnL@mR$ XHg>&yhlVbo+Za4u{an^LB{Ts5NmGP> literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/diodes/pulse_timer/powering.png b/src/main/resources/assets/create/textures/block/diodes/pulse_timer/powering.png new file mode 100644 index 0000000000000000000000000000000000000000..8b7df5278aabe8db3ab29cd96c31224cab72d730 GIT binary patch literal 337 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G|y0G|-o>e}k=-tOJIcduEsrlO+aECa(*28N@jj;6TJ>&-gz^XJb?moEJ~ z{p|dL&+{_f*H`*)?)&`vPVM*8IZw7HpIZ=B=Ej9^PT`04J?cVT1 z_lJZscScHx9gF^%i4PfE4vU?6+v4#(_Hu|{*kn1^VB3YWw#u;0TDJMSAwv|S2HUZ( zyRt5QD}P{DmteK-;_k+)lUBdndv8W^@wOSs*ONG8w#^V;bFRqVWbRZgUl&>li#;{an^LB{Ts5_Kbqw literal 0 HcmV?d00001 From d82644bfba1d5a8ed0788f0fcd8062c9da86e4c8 Mon Sep 17 00:00:00 2001 From: zelophed Date: Sun, 15 Sep 2024 02:14:09 +0200 Subject: [PATCH 044/515] fix imports, adjust buildscripts --- build.gradle | 8 +- gradle.properties | 4 +- .../com/simibubi/create/CreateClient.java | 4 +- .../thresholdSwitch/FunctionalStorage.java | 4 +- .../thresholdSwitch/SophisticatedStorage.java | 4 +- .../OrientedContraptionEntity.java | 2 +- .../harvester/HarvesterMovementBehaviour.java | 2 + .../actors/psi/PSIActorVisual.java | 4 +- .../ContraptionPlayerPassengerRotation.java | 4 +- .../contraptions/bearing/BearingVisual.java | 2 +- .../bearing/StabilizedBearingVisual.java | 2 +- .../contraptions/chassis/StickerVisual.java | 2 +- .../contraptions/pulley/RopePulleyVisual.java | 2 +- .../render/ContraptionEntityRenderer.java | 3 +- .../render/ContraptionRenderInfo.java | 2 +- .../render/ContraptionRenderInfoManager.java | 2 +- .../contraptions/wrench/RadialWrenchMenu.java | 17 +-- .../equipment/toolbox/ToolBoxVisual.java | 2 +- .../fluids/pipes/valve/FluidValveVisual.java | 2 +- .../kinetics/base/KineticInstance.java | 2 +- .../content/kinetics/base/ShaftVisual.java | 2 +- .../kinetics/base/SingleRotatingVisual.java | 2 +- .../content/kinetics/belt/BeltVisual.java | 5 +- .../kinetics/crank/HandCrankVisual.java | 2 +- .../crank/ValveHandleBlockEntity.java | 2 +- .../deployer/DeployerActorVisual.java | 2 +- .../kinetics/flywheel/FlywheelVisual.java | 4 +- .../content/kinetics/gauge/GaugeVisual.java | 6 +- .../kinetics/mechanicalArm/ArmVisual.java | 8 +- .../content/kinetics/press/PressVisual.java | 2 +- .../content/kinetics/saw/SawVisual.java | 2 +- .../BracketedKineticBlockModel.java | 2 +- .../encased/EncasedCogVisual.java | 2 +- .../steamEngine/SteamEngineVisual.java | 2 +- .../transmission/SplitShaftVisual.java | 2 +- .../kinetics/waterwheel/WaterWheelVisual.java | 4 +- .../logistics/funnel/FunnelVisual.java | 2 +- .../logistics/tunnel/BeltTunnelVisual.java | 2 +- .../processing/burner/BlazeBurnerVisual.java | 11 +- .../analogLever/AnalogLeverVisual.java | 4 +- .../redstone/diodes/BrassDiodeVisual.java | 2 +- .../cannon/SchematicannonRenderer.java | 2 +- .../content/trains/bogey/BogeyRenderer.java | 2 +- .../content/trains/bogey/BogeyVisual.java | 2 +- .../render/BlockEntityRenderHelper.java | 2 +- .../render/ShadedBlockSbbBuilder.java | 126 ------------------ .../render/VirtualRenderHelper.java | 92 ------------- src/main/resources/META-INF/mods.toml | 4 +- 48 files changed, 80 insertions(+), 294 deletions(-) delete mode 100644 src/main/java/com/simibubi/create/foundation/render/ShadedBlockSbbBuilder.java delete mode 100644 src/main/java/com/simibubi/create/foundation/render/VirtualRenderHelper.java diff --git a/build.gradle b/build.gradle index 69b403108e..db26d929da 100644 --- a/build.gradle +++ b/build.gradle @@ -23,10 +23,6 @@ base { version = mod_version + (dev && buildNumber != null ? "-${buildNumber}" : '') } -// jozu: I use a gradle workspace with both projects. -// The project is named Flywheel-Forge, but sub-projects are named by folder. -boolean flywheelInWorkspace = findProject(':Flywheel') != null - boolean inMultiModWorkspace = rootProject.hasProperty('multiModWorkspace.enabled') boolean catnipInWorkspace = rootProject.hasProperty('multiModWorkspace.catnip') boolean ponderInWorkspace = rootProject.hasProperty('multiModWorkspace.ponder') @@ -39,8 +35,8 @@ if (ponderInWorkspace) { evaluationDependsOn(":ponder:Forge") } -project.logger.lifecycle("MultiModWorkspace ${inMultiModWorkspace || flywheelInWorkspace ? 'enabled' : 'disabled'} for project ${project.name}.") -project.logger.lifecycle("Dependencies included in Workspace: [Flywheel: ${flywheelInWorkspace}], [Catnip: ${catnipInWorkspace}], [Ponder: ${ponderInWorkspace}]") +project.logger.lifecycle("MultiModWorkspace ${inMultiModWorkspace ? 'enabled' : 'disabled'} for project ${project.name}.") +project.logger.lifecycle("Dependencies included in Workspace: [Catnip: ${catnipInWorkspace}], [Ponder: ${ponderInWorkspace}]") mixin { add sourceSets.main, 'create.refmap.json' diff --git a/gradle.properties b/gradle.properties index 573fcd9ecf..4749e91a69 100644 --- a/gradle.properties +++ b/gradle.properties @@ -28,8 +28,8 @@ jei_minecraft_version = 1.20.1 jei_version = 15.10.0.39 curios_minecraft_version = 1.20.1 curios_version = 5.3.1 -catnip_version = 0.7.7 -ponder_version = 0.7.6 +catnip_version = 0.8.11 +ponder_version = 0.8.8 cc_tweaked_enable = true cc_tweaked_minecraft_version = 1.20.1 diff --git a/src/main/java/com/simibubi/create/CreateClient.java b/src/main/java/com/simibubi/create/CreateClient.java index bfb5ce5975..a6d1b11a9e 100644 --- a/src/main/java/com/simibubi/create/CreateClient.java +++ b/src/main/java/com/simibubi/create/CreateClient.java @@ -21,8 +21,6 @@ import com.simibubi.create.foundation.blockEntity.behaviour.ValueSettingsClient; import com.simibubi.create.foundation.gui.CreateTheme; import com.simibubi.create.foundation.ponder.CreatePonderPlugin; import com.simibubi.create.foundation.render.AllInstanceTypes; -import com.simibubi.create.foundation.render.SuperByteBufferCache; -import com.simibubi.create.foundation.utility.Components; import com.simibubi.create.foundation.utility.ModelSwapper; import com.simibubi.create.infrastructure.config.AllConfigs; import com.simibubi.create.infrastructure.gui.CreateMainMenuScreen; @@ -30,6 +28,8 @@ import com.simibubi.create.infrastructure.gui.CreateMainMenuScreen; import net.createmod.catnip.config.ui.BaseConfigScreen; import net.createmod.catnip.config.ui.ConfigScreen; import net.createmod.catnip.render.CachedBuffers; +import net.createmod.catnip.render.SuperByteBufferCache; +import net.createmod.catnip.utility.lang.Components; import net.createmod.ponder.foundation.PonderIndex; import net.minecraft.ChatFormatting; import net.minecraft.client.GraphicsStatus; diff --git a/src/main/java/com/simibubi/create/compat/thresholdSwitch/FunctionalStorage.java b/src/main/java/com/simibubi/create/compat/thresholdSwitch/FunctionalStorage.java index a4421dbcd9..4441b2f022 100644 --- a/src/main/java/com/simibubi/create/compat/thresholdSwitch/FunctionalStorage.java +++ b/src/main/java/com/simibubi/create/compat/thresholdSwitch/FunctionalStorage.java @@ -1,8 +1,8 @@ package com.simibubi.create.compat.thresholdSwitch; import com.simibubi.create.compat.Mods; -import com.simibubi.create.foundation.utility.RegisteredObjects; +import net.createmod.catnip.platform.CatnipServices; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraftforge.items.IItemHandler; @@ -11,7 +11,7 @@ public class FunctionalStorage implements ThresholdSwitchCompat { @Override public boolean isFromThisMod(BlockEntity blockEntity) { return blockEntity != null && Mods.FUNCTIONALSTORAGE.id() - .equals(RegisteredObjects.getKeyOrThrow(blockEntity.getType()) + .equals(CatnipServices.REGISTRIES.getKeyOrThrow(blockEntity.getType()) .getNamespace()); } diff --git a/src/main/java/com/simibubi/create/compat/thresholdSwitch/SophisticatedStorage.java b/src/main/java/com/simibubi/create/compat/thresholdSwitch/SophisticatedStorage.java index f8d5652e18..7638c9a801 100644 --- a/src/main/java/com/simibubi/create/compat/thresholdSwitch/SophisticatedStorage.java +++ b/src/main/java/com/simibubi/create/compat/thresholdSwitch/SophisticatedStorage.java @@ -1,8 +1,8 @@ package com.simibubi.create.compat.thresholdSwitch; import com.simibubi.create.compat.Mods; -import com.simibubi.create.foundation.utility.RegisteredObjects; +import net.createmod.catnip.platform.CatnipServices; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraftforge.items.IItemHandler; @@ -13,7 +13,7 @@ public class SophisticatedStorage implements ThresholdSwitchCompat { if (be == null) return false; - String namespace = RegisteredObjects.getKeyOrThrow(be.getType()) + String namespace = CatnipServices.REGISTRIES.getKeyOrThrow(be.getType()) .getNamespace(); return diff --git a/src/main/java/com/simibubi/create/content/contraptions/OrientedContraptionEntity.java b/src/main/java/com/simibubi/create/content/contraptions/OrientedContraptionEntity.java index e34582a46d..cdd6c9be6c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/OrientedContraptionEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/OrientedContraptionEntity.java @@ -353,7 +353,7 @@ public class OrientedContraptionEntity extends AbstractContraptionEntity { return false; OrientedContraptionEntity parent = (OrientedContraptionEntity) riding; prevYaw = yaw; - yaw = wrapAngle180(getInitialYaw() - parent.getInitialYaw()) - parent.getViewYRot(1); + yaw = AngleHelper.wrapAngle180(getInitialYaw() - parent.getInitialYaw()) - parent.getViewYRot(1); return false; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/actors/harvester/HarvesterMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/actors/harvester/HarvesterMovementBehaviour.java index f3fb850625..018e16f14a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/actors/harvester/HarvesterMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/actors/harvester/HarvesterMovementBehaviour.java @@ -2,6 +2,8 @@ package com.simibubi.create.content.contraptions.actors.harvester; import javax.annotation.Nullable; +import com.simibubi.create.foundation.virtualWorld.VirtualRenderWorld; + import org.apache.commons.lang3.mutable.MutableBoolean; import com.simibubi.create.content.contraptions.behaviour.MovementBehaviour; diff --git a/src/main/java/com/simibubi/create/content/contraptions/actors/psi/PSIActorVisual.java b/src/main/java/com/simibubi/create/content/contraptions/actors/psi/PSIActorVisual.java index 130d8dc82a..6dc04fb5cc 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/actors/psi/PSIActorVisual.java +++ b/src/main/java/com/simibubi/create/content/contraptions/actors/psi/PSIActorVisual.java @@ -2,11 +2,11 @@ package com.simibubi.create.content.contraptions.actors.psi; import com.simibubi.create.content.contraptions.behaviour.MovementContext; import com.simibubi.create.content.contraptions.render.ActorVisual; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; import com.simibubi.create.foundation.virtualWorld.VirtualRenderWorld; import dev.engine_room.flywheel.api.visualization.VisualizationContext; +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.animation.LerpedFloat; public class PSIActorVisual extends ActorVisual { diff --git a/src/main/java/com/simibubi/create/content/contraptions/actors/seat/ContraptionPlayerPassengerRotation.java b/src/main/java/com/simibubi/create/content/contraptions/actors/seat/ContraptionPlayerPassengerRotation.java index d5c81643cc..b095a14026 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/actors/seat/ContraptionPlayerPassengerRotation.java +++ b/src/main/java/com/simibubi/create/content/contraptions/actors/seat/ContraptionPlayerPassengerRotation.java @@ -3,10 +3,10 @@ package com.simibubi.create.content.contraptions.actors.seat; import com.simibubi.create.content.contraptions.AbstractContraptionEntity; import com.simibubi.create.content.contraptions.AbstractContraptionEntity.ContraptionRotationState; import com.simibubi.create.content.trains.entity.CarriageContraptionEntity; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.infrastructure.config.AllConfigs; +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.Minecraft; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; diff --git a/src/main/java/com/simibubi/create/content/contraptions/bearing/BearingVisual.java b/src/main/java/com/simibubi/create/content/contraptions/bearing/BearingVisual.java index 67edcfe3db..4e6212a1c2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/bearing/BearingVisual.java +++ b/src/main/java/com/simibubi/create/content/contraptions/bearing/BearingVisual.java @@ -8,7 +8,7 @@ import com.mojang.math.Axis; import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.kinetics.base.BackHalfShaftVisual; import com.simibubi.create.content.kinetics.base.KineticBlockEntity; -import com.simibubi.create.foundation.utility.AngleHelper; +import net.createmod.catnip.utility.math.AngleHelper; import dev.engine_room.flywheel.api.instance.Instance; import dev.engine_room.flywheel.api.visual.DynamicVisual; diff --git a/src/main/java/com/simibubi/create/content/contraptions/bearing/StabilizedBearingVisual.java b/src/main/java/com/simibubi/create/content/contraptions/bearing/StabilizedBearingVisual.java index 81e11bfc65..30eef771ae 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/bearing/StabilizedBearingVisual.java +++ b/src/main/java/com/simibubi/create/content/contraptions/bearing/StabilizedBearingVisual.java @@ -8,7 +8,7 @@ import com.simibubi.create.content.contraptions.behaviour.MovementContext; import com.simibubi.create.content.contraptions.render.ActorVisual; import com.simibubi.create.content.kinetics.base.RotatingInstance; import com.simibubi.create.foundation.render.AllInstanceTypes; -import com.simibubi.create.foundation.utility.AnimationTickHolder; +import net.createmod.catnip.utility.AnimationTickHolder; import com.simibubi.create.foundation.virtualWorld.VirtualRenderWorld; import dev.engine_room.flywheel.api.visualization.VisualizationContext; diff --git a/src/main/java/com/simibubi/create/content/contraptions/chassis/StickerVisual.java b/src/main/java/com/simibubi/create/content/contraptions/chassis/StickerVisual.java index d44a3e95d7..2fa4ef6943 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/chassis/StickerVisual.java +++ b/src/main/java/com/simibubi/create/content/contraptions/chassis/StickerVisual.java @@ -3,7 +3,7 @@ package com.simibubi.create.content.contraptions.chassis; import java.util.function.Consumer; import com.simibubi.create.AllPartialModels; -import com.simibubi.create.foundation.utility.AngleHelper; +import net.createmod.catnip.utility.math.AngleHelper; import dev.engine_room.flywheel.api.instance.Instance; import dev.engine_room.flywheel.api.visual.DynamicVisual; diff --git a/src/main/java/com/simibubi/create/content/contraptions/pulley/RopePulleyVisual.java b/src/main/java/com/simibubi/create/content/contraptions/pulley/RopePulleyVisual.java index 6b13def27f..fcc8cfa571 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/pulley/RopePulleyVisual.java +++ b/src/main/java/com/simibubi/create/content/contraptions/pulley/RopePulleyVisual.java @@ -3,7 +3,7 @@ package com.simibubi.create.content.contraptions.pulley; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllPartialModels; -import com.simibubi.create.foundation.render.VirtualRenderHelper; +import net.createmod.catnip.render.VirtualRenderHelper; import dev.engine_room.flywheel.api.instance.Instancer; import dev.engine_room.flywheel.api.visualization.VisualizationContext; diff --git a/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionEntityRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionEntityRenderer.java index e19c50135b..5b02f446d0 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionEntityRenderer.java @@ -1,5 +1,7 @@ package com.simibubi.create.content.contraptions.render; +import net.createmod.catnip.render.SuperByteBuffer; + import org.apache.commons.lang3.tuple.Pair; import com.mojang.blaze3d.vertex.PoseStack; @@ -10,7 +12,6 @@ import com.simibubi.create.content.contraptions.Contraption; import com.simibubi.create.content.contraptions.behaviour.MovementBehaviour; import com.simibubi.create.content.contraptions.behaviour.MovementContext; import com.simibubi.create.foundation.render.BlockEntityRenderHelper; -import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.virtualWorld.VirtualRenderWorld; import dev.engine_room.flywheel.api.visualization.VisualizationManager; diff --git a/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionRenderInfo.java b/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionRenderInfo.java index 826e30a7a9..86dc1c41a7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionRenderInfo.java +++ b/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionRenderInfo.java @@ -138,6 +138,6 @@ public class ContraptionRenderInfo { private static class ThreadLocalObjects { public final PoseStack poseStack = new PoseStack(); public final RandomSource random = RandomSource.createNewThreadLocalInstance(); - public final ShadedBlockSbbBuilder sbbBuilder = new ShadedBlockSbbBuilder(); + public final ShadedBlockSbbBuilder sbbBuilder = ShadedBlockSbbBuilder.create(); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionRenderInfoManager.java b/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionRenderInfoManager.java index 81ab6c4b36..796744c49b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionRenderInfoManager.java +++ b/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionRenderInfoManager.java @@ -1,11 +1,11 @@ package com.simibubi.create.content.contraptions.render; import com.simibubi.create.content.contraptions.Contraption; -import com.simibubi.create.foundation.utility.WorldAttached; import dev.engine_room.flywheel.api.event.ReloadLevelRendererEvent; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +import net.createmod.catnip.utility.WorldAttached; import net.minecraft.client.Minecraft; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; diff --git a/src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchMenu.java b/src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchMenu.java index 526df2bb68..3c3d3640db 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchMenu.java +++ b/src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchMenu.java @@ -10,9 +10,10 @@ import java.util.Set; import javax.annotation.Nullable; +import dev.engine_room.flywheel.lib.transform.TransformStack; + import org.joml.Matrix4f; -import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.platform.InputConstants; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.BufferBuilder; @@ -249,7 +250,7 @@ public class RadialWrenchMenu extends AbstractSimiScreen { Color c = innerColor.copy().setAlpha(0.5f); UIRenderHelper.drawRadialSector(graphics, innerRadius - 3, innerRadius - 2, -(sectorAngle / 2 + 90), sectorAngle, c, c); - TransformStack.cast(poseStack) + TransformStack.of(poseStack) .translateY(-(sectorWidth / 2f + innerRadius)) .rotateZ(-i * sectorAngle); @@ -276,7 +277,7 @@ public class RadialWrenchMenu extends AbstractSimiScreen { poseStack.pushPose(); - TransformStack.cast(poseStack) + TransformStack.of(poseStack) .rotateZ(sectorAngle / 2); poseStack.translate(0, -innerRadius - 20, 10); @@ -285,7 +286,7 @@ public class RadialWrenchMenu extends AbstractSimiScreen { UIRenderHelper.angledGradient(graphics, 90, 0, 0, 0.5f, 25 , Color.WHITE.setAlpha(0.5f), Color.WHITE.setAlpha(0.15f)); poseStack.popPose(); - TransformStack.cast(poseStack) + TransformStack.of(poseStack) .rotateZ(sectorAngle); } @@ -301,10 +302,10 @@ public class RadialWrenchMenu extends AbstractSimiScreen { float b = 0.8f; poseStack.pushPose(); - TransformStack.cast(poseStack) - .rotateZRadians(-theta) - .translateY(innerRadius + 3) - .translateZ(15); + TransformStack.of(poseStack) + .rotateZ((float) -theta) + .translateY(innerRadius + 3) + .translateZ(15); RenderSystem.setShader(GameRenderer::getPositionColorShader); diff --git a/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolBoxVisual.java b/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolBoxVisual.java index c3d3557403..2562c7a6ab 100644 --- a/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolBoxVisual.java +++ b/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolBoxVisual.java @@ -3,7 +3,6 @@ package com.simibubi.create.content.equipment.toolbox; import java.util.function.Consumer; import com.simibubi.create.AllPartialModels; -import com.simibubi.create.foundation.utility.Iterate; import dev.engine_room.flywheel.api.instance.Instance; import dev.engine_room.flywheel.api.instance.Instancer; @@ -14,6 +13,7 @@ import dev.engine_room.flywheel.lib.instance.TransformedInstance; import dev.engine_room.flywheel.lib.model.Models; import dev.engine_room.flywheel.lib.visual.AbstractBlockEntityVisual; import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; +import net.createmod.catnip.utility.Iterate; import net.minecraft.core.Direction; public class ToolBoxVisual extends AbstractBlockEntityVisual implements SimpleDynamicVisual { diff --git a/src/main/java/com/simibubi/create/content/fluids/pipes/valve/FluidValveVisual.java b/src/main/java/com/simibubi/create/content/fluids/pipes/valve/FluidValveVisual.java index 1201365619..da17af8222 100644 --- a/src/main/java/com/simibubi/create/content/fluids/pipes/valve/FluidValveVisual.java +++ b/src/main/java/com/simibubi/create/content/fluids/pipes/valve/FluidValveVisual.java @@ -5,7 +5,7 @@ import java.util.function.Consumer; import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.kinetics.base.KineticBlockEntityRenderer; import com.simibubi.create.content.kinetics.base.ShaftVisual; -import com.simibubi.create.foundation.utility.AngleHelper; +import net.createmod.catnip.utility.math.AngleHelper; import dev.engine_room.flywheel.api.instance.Instance; import dev.engine_room.flywheel.api.visual.DynamicVisual; diff --git a/src/main/java/com/simibubi/create/content/kinetics/base/KineticInstance.java b/src/main/java/com/simibubi/create/content/kinetics/base/KineticInstance.java index f8b716dc82..e7356e4941 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/base/KineticInstance.java +++ b/src/main/java/com/simibubi/create/content/kinetics/base/KineticInstance.java @@ -2,7 +2,7 @@ package com.simibubi.create.content.kinetics.base; import org.joml.Vector3f; -import com.simibubi.create.foundation.utility.Color; +import net.createmod.catnip.utility.theme.Color; import dev.engine_room.flywheel.api.instance.InstanceHandle; import dev.engine_room.flywheel.api.instance.InstanceType; diff --git a/src/main/java/com/simibubi/create/content/kinetics/base/ShaftVisual.java b/src/main/java/com/simibubi/create/content/kinetics/base/ShaftVisual.java index 1c4666886e..dba4663fce 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/base/ShaftVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/base/ShaftVisual.java @@ -1,6 +1,6 @@ package com.simibubi.create.content.kinetics.base; -import com.simibubi.create.foundation.render.VirtualRenderHelper; +import net.createmod.catnip.render.VirtualRenderHelper; import dev.engine_room.flywheel.api.model.Model; import dev.engine_room.flywheel.api.visualization.VisualizationContext; diff --git a/src/main/java/com/simibubi/create/content/kinetics/base/SingleRotatingVisual.java b/src/main/java/com/simibubi/create/content/kinetics/base/SingleRotatingVisual.java index ba5ec60ec3..99cfb84d66 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/base/SingleRotatingVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/base/SingleRotatingVisual.java @@ -3,7 +3,7 @@ package com.simibubi.create.content.kinetics.base; import java.util.function.Consumer; import com.simibubi.create.foundation.render.AllInstanceTypes; -import com.simibubi.create.foundation.render.VirtualRenderHelper; +import net.createmod.catnip.render.VirtualRenderHelper; import dev.engine_room.flywheel.api.instance.Instance; import dev.engine_room.flywheel.api.model.Model; diff --git a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltVisual.java b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltVisual.java index 625c790927..b2f4505aaa 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltVisual.java @@ -3,15 +3,16 @@ package com.simibubi.create.content.kinetics.belt; import java.util.ArrayList; import java.util.function.Consumer; +import net.createmod.catnip.render.SpriteShiftEntry; + import org.joml.Quaternionf; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.kinetics.base.KineticBlockEntityVisual; import com.simibubi.create.content.kinetics.base.RotatingInstance; -import com.simibubi.create.foundation.block.render.SpriteShiftEntry; import com.simibubi.create.foundation.render.AllInstanceTypes; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Iterate; import dev.engine_room.flywheel.api.instance.Instance; import dev.engine_room.flywheel.api.instance.Instancer; diff --git a/src/main/java/com/simibubi/create/content/kinetics/crank/HandCrankVisual.java b/src/main/java/com/simibubi/create/content/kinetics/crank/HandCrankVisual.java index 1eebee84b6..3872685b9d 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/crank/HandCrankVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/crank/HandCrankVisual.java @@ -5,7 +5,7 @@ import java.util.function.Consumer; import com.simibubi.create.content.kinetics.base.KineticBlockEntityVisual; import com.simibubi.create.content.kinetics.base.RotatingInstance; import com.simibubi.create.foundation.render.AllInstanceTypes; -import com.simibubi.create.foundation.render.VirtualRenderHelper; +import net.createmod.catnip.render.VirtualRenderHelper; import dev.engine_room.flywheel.api.instance.Instance; import dev.engine_room.flywheel.api.model.Model; diff --git a/src/main/java/com/simibubi/create/content/kinetics/crank/ValveHandleBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/crank/ValveHandleBlockEntity.java index efadf65ec5..5313a18669 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/crank/ValveHandleBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/crank/ValveHandleBlockEntity.java @@ -14,7 +14,7 @@ import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform; import com.simibubi.create.foundation.blockEntity.behaviour.ValueSettingsBoard; import com.simibubi.create.foundation.blockEntity.behaviour.ValueSettingsFormatter; import com.simibubi.create.foundation.blockEntity.behaviour.scrollValue.ScrollValueBehaviour; -import com.simibubi.create.foundation.render.VirtualRenderHelper; +import net.createmod.catnip.render.VirtualRenderHelper; import com.simibubi.create.foundation.utility.CreateLang; import dev.engine_room.flywheel.api.model.Model; diff --git a/src/main/java/com/simibubi/create/content/kinetics/deployer/DeployerActorVisual.java b/src/main/java/com/simibubi/create/content/kinetics/deployer/DeployerActorVisual.java index 0ff2954436..d735b37018 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/deployer/DeployerActorVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/deployer/DeployerActorVisual.java @@ -11,7 +11,7 @@ import com.simibubi.create.content.kinetics.base.IRotate; import com.simibubi.create.content.kinetics.base.KineticBlockEntityVisual; import com.simibubi.create.content.kinetics.base.RotatingInstance; import com.simibubi.create.foundation.render.AllInstanceTypes; -import com.simibubi.create.foundation.render.VirtualRenderHelper; +import net.createmod.catnip.render.VirtualRenderHelper; import com.simibubi.create.foundation.virtualWorld.VirtualRenderWorld; import dev.engine_room.flywheel.api.visualization.VisualizationContext; diff --git a/src/main/java/com/simibubi/create/content/kinetics/flywheel/FlywheelVisual.java b/src/main/java/com/simibubi/create/content/kinetics/flywheel/FlywheelVisual.java index 930f952d19..5e87e837f0 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/flywheel/FlywheelVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/flywheel/FlywheelVisual.java @@ -6,8 +6,8 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.content.kinetics.base.KineticBlockEntityVisual; import com.simibubi.create.content.kinetics.base.RotatingInstance; import com.simibubi.create.foundation.render.AllInstanceTypes; -import com.simibubi.create.foundation.render.VirtualRenderHelper; -import com.simibubi.create.foundation.utility.AngleHelper; +import net.createmod.catnip.render.VirtualRenderHelper; +import net.createmod.catnip.utility.math.AngleHelper; import dev.engine_room.flywheel.api.instance.Instance; import dev.engine_room.flywheel.api.visual.DynamicVisual; diff --git a/src/main/java/com/simibubi/create/content/kinetics/gauge/GaugeVisual.java b/src/main/java/com/simibubi/create/content/kinetics/gauge/GaugeVisual.java index f758cd493d..97786a9262 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/gauge/GaugeVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/gauge/GaugeVisual.java @@ -6,9 +6,9 @@ import java.util.function.Consumer; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.kinetics.base.ShaftVisual; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.Iterate; import dev.engine_room.flywheel.api.instance.Instance; import dev.engine_room.flywheel.api.instance.Instancer; diff --git a/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmVisual.java b/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmVisual.java index 47e1e40e15..50ca62d6b7 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmVisual.java @@ -7,9 +7,6 @@ import com.google.common.collect.Lists; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.kinetics.base.SingleRotatingVisual; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.Color; -import com.simibubi.create.foundation.utility.Iterate; import dev.engine_room.flywheel.api.instance.Instance; import dev.engine_room.flywheel.api.model.Model; @@ -22,6 +19,9 @@ import dev.engine_room.flywheel.lib.instance.TransformedInstance; import dev.engine_room.flywheel.lib.model.Models; import dev.engine_room.flywheel.lib.transform.TransformStack; import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.theme.Color; +import net.createmod.ponder.utility.LevelTickHolder; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.entity.ItemRenderer; import net.minecraft.util.Mth; @@ -101,7 +101,7 @@ public class ArmVisual extends SingleRotatingVisual implements S } private void animateRave(float partialTick) { - var ticks = AnimationTickHolder.getTicks(blockEntity.getLevel()); + var ticks = LevelTickHolder.getTicks(blockEntity.getLevel()); float renderTick = ticks + partialTick + (blockEntity.hashCode() % 64); float baseAngle = (renderTick * 10) % 360; diff --git a/src/main/java/com/simibubi/create/content/kinetics/press/PressVisual.java b/src/main/java/com/simibubi/create/content/kinetics/press/PressVisual.java index e733943439..614f09af84 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/press/PressVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/press/PressVisual.java @@ -7,7 +7,7 @@ import org.joml.Quaternionf; import com.mojang.math.Axis; import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.kinetics.base.ShaftVisual; -import com.simibubi.create.foundation.utility.AngleHelper; +import net.createmod.catnip.utility.math.AngleHelper; import dev.engine_room.flywheel.api.instance.Instance; import dev.engine_room.flywheel.api.visual.DynamicVisual; diff --git a/src/main/java/com/simibubi/create/content/kinetics/saw/SawVisual.java b/src/main/java/com/simibubi/create/content/kinetics/saw/SawVisual.java index fc6a29aab7..10d2019042 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/saw/SawVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/saw/SawVisual.java @@ -2,7 +2,7 @@ package com.simibubi.create.content.kinetics.saw; import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.kinetics.base.SingleRotatingVisual; -import com.simibubi.create.foundation.render.VirtualRenderHelper; +import net.createmod.catnip.render.VirtualRenderHelper; import dev.engine_room.flywheel.api.model.Model; import dev.engine_room.flywheel.api.visualization.VisualizationContext; diff --git a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/BracketedKineticBlockModel.java b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/BracketedKineticBlockModel.java index de8c36df0e..e50d2d970f 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/BracketedKineticBlockModel.java +++ b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/BracketedKineticBlockModel.java @@ -5,7 +5,7 @@ import java.util.List; import com.simibubi.create.content.decoration.bracket.BracketedBlockEntityBehaviour; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; -import com.simibubi.create.foundation.render.VirtualRenderHelper; +import net.createmod.catnip.render.VirtualRenderHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.RenderType; diff --git a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogVisual.java b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogVisual.java index 4f571885dc..12fa117878 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogVisual.java @@ -13,7 +13,7 @@ import com.simibubi.create.content.kinetics.base.KineticBlockEntityVisual; import com.simibubi.create.content.kinetics.base.RotatingInstance; import com.simibubi.create.content.kinetics.simpleRelays.BracketedKineticBlockEntityRenderer; import com.simibubi.create.foundation.render.AllInstanceTypes; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Iterate; import dev.engine_room.flywheel.api.instance.Instance; import dev.engine_room.flywheel.api.model.Model; diff --git a/src/main/java/com/simibubi/create/content/kinetics/steamEngine/SteamEngineVisual.java b/src/main/java/com/simibubi/create/content/kinetics/steamEngine/SteamEngineVisual.java index ed592d1992..8c25e97a4c 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/steamEngine/SteamEngineVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/steamEngine/SteamEngineVisual.java @@ -4,7 +4,7 @@ import java.util.function.Consumer; import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.kinetics.base.KineticBlockEntityRenderer; -import com.simibubi.create.foundation.utility.AngleHelper; +import net.createmod.catnip.utility.math.AngleHelper; import dev.engine_room.flywheel.api.instance.Instance; import dev.engine_room.flywheel.api.visual.DynamicVisual; diff --git a/src/main/java/com/simibubi/create/content/kinetics/transmission/SplitShaftVisual.java b/src/main/java/com/simibubi/create/content/kinetics/transmission/SplitShaftVisual.java index 7290eebb7a..132136034f 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/transmission/SplitShaftVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/transmission/SplitShaftVisual.java @@ -8,7 +8,7 @@ import com.simibubi.create.content.kinetics.base.IRotate; import com.simibubi.create.content.kinetics.base.KineticBlockEntityVisual; import com.simibubi.create.content.kinetics.base.RotatingInstance; import com.simibubi.create.foundation.render.AllInstanceTypes; -import com.simibubi.create.foundation.utility.Iterate; +import net.createmod.catnip.utility.Iterate; import dev.engine_room.flywheel.api.instance.Instance; import dev.engine_room.flywheel.api.visualization.VisualizationContext; diff --git a/src/main/java/com/simibubi/create/content/kinetics/waterwheel/WaterWheelVisual.java b/src/main/java/com/simibubi/create/content/kinetics/waterwheel/WaterWheelVisual.java index 272357f72c..10baeeb058 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/waterwheel/WaterWheelVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/waterwheel/WaterWheelVisual.java @@ -6,13 +6,13 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.content.kinetics.base.KineticBlockEntityVisual; import com.simibubi.create.content.kinetics.base.RotatingInstance; import com.simibubi.create.foundation.render.AllInstanceTypes; -import com.simibubi.create.foundation.render.CachedBufferer; import dev.engine_room.flywheel.api.instance.Instance; import dev.engine_room.flywheel.api.model.Model; import dev.engine_room.flywheel.api.visualization.VisualizationContext; import dev.engine_room.flywheel.lib.model.ModelCache; import dev.engine_room.flywheel.lib.model.baked.BakedModelBuilder; +import net.createmod.catnip.render.CachedBuffers; import net.minecraft.client.resources.model.BakedModel; import net.minecraft.core.Direction; import net.minecraft.core.Direction.AxisDirection; @@ -81,7 +81,7 @@ public class WaterWheelVisual extends KineticBl } else { dir = state.getValue(WaterWheelBlock.FACING); } - PoseStack transform = CachedBufferer.rotateToFaceVertical(dir).get(); + PoseStack transform = CachedBuffers.rotateToFaceVertical(dir).get(); return BakedModelBuilder.create(model) .poseStack(transform) .build(); diff --git a/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelVisual.java b/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelVisual.java index 527d2d48bb..daafe788a1 100644 --- a/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelVisual.java +++ b/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelVisual.java @@ -6,7 +6,7 @@ import java.util.function.Consumer; import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.logistics.flwdata.FlapInstance; import com.simibubi.create.foundation.render.AllInstanceTypes; -import com.simibubi.create.foundation.utility.AnimationTickHolder; +import net.createmod.catnip.utility.AnimationTickHolder; import dev.engine_room.flywheel.api.instance.Instance; import dev.engine_room.flywheel.api.instance.Instancer; diff --git a/src/main/java/com/simibubi/create/content/logistics/tunnel/BeltTunnelVisual.java b/src/main/java/com/simibubi/create/content/logistics/tunnel/BeltTunnelVisual.java index 288dbf54dc..66180dadbf 100644 --- a/src/main/java/com/simibubi/create/content/logistics/tunnel/BeltTunnelVisual.java +++ b/src/main/java/com/simibubi/create/content/logistics/tunnel/BeltTunnelVisual.java @@ -9,7 +9,7 @@ import java.util.function.Consumer; import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.logistics.flwdata.FlapInstance; import com.simibubi.create.foundation.render.AllInstanceTypes; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.animation.LerpedFloat; import dev.engine_room.flywheel.api.instance.Instance; import dev.engine_room.flywheel.api.instance.Instancer; diff --git a/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerVisual.java b/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerVisual.java index 32f6971b91..42ada84d50 100644 --- a/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerVisual.java +++ b/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerVisual.java @@ -2,14 +2,17 @@ package com.simibubi.create.content.processing.burner; import java.util.function.Consumer; +import net.createmod.catnip.render.SpriteShiftEntry; + +import net.createmod.ponder.utility.LevelTickHolder; + import org.jetbrains.annotations.Nullable; import com.simibubi.create.AllPartialModels; import com.simibubi.create.AllSpriteShifts; -import com.simibubi.create.foundation.block.render.SpriteShiftEntry; import com.simibubi.create.foundation.render.AllInstanceTypes; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.AnimationTickHolder; +import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.utility.AnimationTickHolder; import dev.engine_room.flywheel.api.instance.Instance; import dev.engine_room.flywheel.api.visual.DynamicVisual; @@ -129,7 +132,7 @@ public class BlazeBurnerVisual extends AbstractBlockEntityVisual VIRTUAL_PROPERTY = new ModelProperty<>(); - public static final ModelData VIRTUAL_DATA = ModelData.builder().with(VIRTUAL_PROPERTY, true).build(); - - private static final ModelCache VIRTUAL_BLOCKS = new ModelCache<>(state -> new ForgeBakedModelBuilder(ModelUtil.VANILLA_RENDERER.getBlockModel(state)).modelData(VIRTUAL_DATA).build()); - private static final ThreadLocal THREAD_LOCAL_OBJECTS = ThreadLocal.withInitial(ThreadLocalObjects::new); - - public static boolean isVirtual(ModelData data) { - return data.has(VirtualRenderHelper.VIRTUAL_PROPERTY) && data.get(VirtualRenderHelper.VIRTUAL_PROPERTY); - } - - /** - * A copy of {@link dev.engine_room.flywheel.lib.model.Models#block(BlockState)}, but with virtual model data passed in. - * @param state The block state to get the model for. - * @return The model for the given block state. - */ - public static Model blockModel(BlockState state) { - return VIRTUAL_BLOCKS.get(state); - } - - public static SuperByteBuffer bufferBlock(BlockState state) { - return bufferModel(ModelUtil.VANILLA_RENDERER.getBlockModel(state), state); - } - - public static SuperByteBuffer bufferModel(BakedModel model, BlockState state) { - return bufferModel(model, state, null); - } - - public static SuperByteBuffer bufferModel(BakedModel model, BlockState state, @Nullable PoseStack poseStack) { - BlockRenderDispatcher dispatcher = ModelUtil.VANILLA_RENDERER; - ModelBlockRenderer renderer = dispatcher.getModelRenderer(); - ThreadLocalObjects objects = THREAD_LOCAL_OBJECTS.get(); - - if (poseStack == null) { - poseStack = objects.identityPoseStack; - } - RandomSource random = objects.random; - - ShadedBlockSbbBuilder sbbBuilder = objects.sbbBuilder; - sbbBuilder.begin(); - - ModelData modelData = model.getModelData(VirtualEmptyBlockGetter.FULL_DARK, BlockPos.ZERO, state, VIRTUAL_DATA); - poseStack.pushPose(); - renderer.tesselateBlock(VirtualEmptyBlockGetter.FULL_DARK, model, state, BlockPos.ZERO, poseStack, sbbBuilder, false, random, 42L, OverlayTexture.NO_OVERLAY, modelData, null); - poseStack.popPose(); - - return sbbBuilder.end(); - } - - public static void transferBlockVertexData(ByteBuffer vertexBuffer, int stride, int srcIndex, MutableTemplateMesh mutableMesh, int dstIndex, int vertexCount) { - for (int i = 0; i < vertexCount; i++) { - mutableMesh.x(dstIndex + i, vertexBuffer.getFloat(srcIndex + i * stride)); - mutableMesh.y(dstIndex + i, vertexBuffer.getFloat(srcIndex + i * stride + 4)); - mutableMesh.z(dstIndex + i, vertexBuffer.getFloat(srcIndex + i * stride + 8)); - mutableMesh.color(dstIndex + i, vertexBuffer.getInt(srcIndex + i * stride + 12)); - mutableMesh.u(dstIndex + i, vertexBuffer.getFloat(srcIndex + i * stride + 16)); - mutableMesh.v(dstIndex + i, vertexBuffer.getFloat(srcIndex + i * stride + 20)); - mutableMesh.overlay(dstIndex + i, OverlayTexture.NO_OVERLAY); - mutableMesh.light(dstIndex + i, vertexBuffer.getInt(srcIndex + i * stride + 24)); - mutableMesh.normal(dstIndex + i, vertexBuffer.getInt(srcIndex + i * stride + 28)); - } - } - - private static class ThreadLocalObjects { - public final PoseStack identityPoseStack = new PoseStack(); - public final RandomSource random = RandomSource.createNewThreadLocalInstance(); - public final ShadedBlockSbbBuilder sbbBuilder = new ShadedBlockSbbBuilder(); - } -} diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index 4ca7ba145b..1fc846d4a9 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -40,13 +40,13 @@ ${mod_description} [[dependencies.create]] modId="catnip" mandatory=true - versionRange="[0.6,)" + versionRange="[0.8,)" ordering="AFTER" side="BOTH" [[dependencies.create]] modId="ponder" mandatory=true - versionRange="[0.6,)" + versionRange="[0.8,)" ordering="AFTER" side="BOTH" From b5b2b64a39f5d55ad7fe790e439a0b65ccb8edce Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Mon, 16 Sep 2024 12:41:42 +0200 Subject: [PATCH 045/515] Amazon Button - Added the Redstone Requester --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 13 +- .../blockstates/redstone_requester.json | 7 + .../resources/assets/create/lang/en_ud.json | 4 + .../resources/assets/create/lang/en_us.json | 4 + .../models/item/redstone_requester.json | 3 + .../blocks/redstone_requester.json | 21 ++ .../minecraft/tags/blocks/mineable/axe.json | 1 + .../tags/blocks/mineable/pickaxe.json | 1 + .../simibubi/create/AllBlockEntityTypes.java | 6 + .../java/com/simibubi/create/AllBlocks.java | 217 ++++++++++++------ .../content/logistics/box/PackageItem.java | 4 +- .../RedstoneRequesterBlock.java | 167 ++++++++++++++ .../RedstoneRequesterBlockEntity.java | 83 +++++++ .../logistics/stockTicker/PackageOrder.java | 8 + .../PackageOrderRequestPacket.java | 13 +- .../StockTickerAutoRequestScreen.java | 25 +- .../stockTicker/StockTickerBlockEntity.java | 25 +- .../StockTickerConfigurationPacket.java | 23 +- .../StockTickerInteractionHandler.java | 8 +- .../stockTicker/StockTickerRequestScreen.java | 23 +- .../assets/create/lang/default/interface.json | 4 + .../models/block/redstone_requester.json | 47 ++++ 22 files changed, 574 insertions(+), 133 deletions(-) create mode 100644 src/generated/resources/assets/create/blockstates/redstone_requester.json create mode 100644 src/generated/resources/assets/create/models/item/redstone_requester.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/redstone_requester.json create mode 100644 src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlock.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlockEntity.java create mode 100644 src/main/resources/assets/create/models/block/redstone_requester.json diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index f62cb353a5..15fcde1fff 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-09-13T16:19:53.5157579 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-09-16T12:31:12.076124 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -433,6 +433,7 @@ f8f9802df9c0b4e39edeefc3b1abb38255d79801 assets/create/blockstates/purple_sail.j 7ce346fa18702f6fe6e2a939efcfa26eda63fe38 assets/create/blockstates/raw_zinc_block.json ec546afd3ec8036e4393b97d535f05a86f57dbc1 assets/create/blockstates/redstone_contact.json ff205f032b36486753dddb1f2029ef8d53e9c86f assets/create/blockstates/redstone_link.json +e3e0ea8069b354c29103948d0b5e79094587ef85 assets/create/blockstates/redstone_requester.json e3fd62e466e3e6e7bd6fc8661f764ba972a466fc assets/create/blockstates/red_nixie_tube.json 4c36b562da58ef2af57009da7cf2426059249228 assets/create/blockstates/red_sail.json 145f4e9ffaeff9be180e6c4e4989f2cf44cf0686 assets/create/blockstates/red_seat.json @@ -591,8 +592,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -4eb67203a52afbfe4131617cc61d6da1ce5f4000 assets/create/lang/en_ud.json -454816b2ff679522f371744d93bc32d8292f9248 assets/create/lang/en_us.json +0dd3aed78418732043d0f968962a386fc3418d27 assets/create/lang/en_ud.json +13509f1058315bd8fdd9fdf8d4dd988e66eeac74 assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -2138,6 +2139,7 @@ f91405b9aec1e0142c1b90582e03a1973251da05 assets/create/models/item/radial_chassi 4631d67976cef148c346a7016baaa6703e4f243e assets/create/models/item/raw_zinc_block.json 9dc6c52e258b00cac6ed23147983045c43218b5d assets/create/models/item/redstone_contact.json f8f733364bdd32b2ad597e81103bc02344ce63bd assets/create/models/item/redstone_link.json +f526dee8bc213b3d87cbc79350eb37b61b0eee79 assets/create/models/item/redstone_requester.json 8d00eb1a10055a802556eab10e13f522d12acd1c assets/create/models/item/red_sand_paper.json b64a054c92cbd2e055502d470f3921d1077e63a1 assets/create/models/item/red_seat.json ac4695cc465d094b4adba1a4e9efec42c916f37d assets/create/models/item/red_toolbox.json @@ -3395,6 +3397,7 @@ c6b7a02db55cf0824a48156adf469c478dfd6a8d data/create/loot_tables/blocks/purple_s f76e5a157d2aeab5708f464b1f3c8e47b3855f18 data/create/loot_tables/blocks/raw_zinc_block.json bbc2d61eeea335f8f011d799ef6a5484ca027640 data/create/loot_tables/blocks/redstone_contact.json 4fa70deeac7e56121e42fb602dfa27ee1727f749 data/create/loot_tables/blocks/redstone_link.json +efc3a5595e4daf67fa43f84c9869dfc76fd6fca4 data/create/loot_tables/blocks/redstone_requester.json a50e1c28af16e9f1b4f48aa974461167139768a7 data/create/loot_tables/blocks/red_nixie_tube.json 977d724cddf8eba053a3310ad0d30af15199bbed data/create/loot_tables/blocks/red_sail.json 9aedede893e2127a1cdd17695699397d8d5c6ce5 data/create/loot_tables/blocks/red_seat.json @@ -4314,8 +4317,8 @@ c741ba83b562ae3459d7c4f2db69537f549ea411 data/forge/tags/items/tools/wrench.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/dripstone_replaceable_blocks.json e3321ff14704c031a2c16953b7e391f4f24dd70b data/minecraft/tags/blocks/impermeable.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/lush_ground_replaceable.json -97e4fca52c0fc5c8c06d376bd69b7d9fd45f1df0 data/minecraft/tags/blocks/mineable/axe.json -7957b975f7ffd01ade197418a70077a6dd61a40c data/minecraft/tags/blocks/mineable/pickaxe.json +cb2f3843d82d0d56ecdb5333cf02fc1ea59b3792 data/minecraft/tags/blocks/mineable/axe.json +eee9635c6eced06eb4e6b487650bfcaf7bb56077 data/minecraft/tags/blocks/mineable/pickaxe.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/moss_replaceable.json 0c13aae0eeb99e89febe8dbe5e002af2ff843a9e data/minecraft/tags/blocks/needs_iron_tool.json 3cb2a92cbdf32ed5978f740dc378d363306c3e84 data/minecraft/tags/blocks/needs_stone_tool.json diff --git a/src/generated/resources/assets/create/blockstates/redstone_requester.json b/src/generated/resources/assets/create/blockstates/redstone_requester.json new file mode 100644 index 0000000000..c18ade96ef --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/redstone_requester.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/redstone_requester" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index d4d1fe9268..54ccc36da0 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -658,6 +658,7 @@ "block.create.red_valve_handle": "ǝןpuɐH ǝʌןɐΛ pǝᴚ", "block.create.redstone_contact": "ʇɔɐʇuoƆ ǝuoʇspǝᴚ", "block.create.redstone_link": "ʞuıꞀ ǝuoʇspǝᴚ", + "block.create.redstone_requester": "ɹǝʇsǝnbǝᴚ ǝuoʇspǝᴚ", "block.create.refined_radiance_casing": "buısɐƆ ʇuɐıpɐᴚ", "block.create.rope": "ǝdoᴚ", "block.create.rope_pulley": "ʎǝןןnԀ ǝdoᴚ", @@ -1183,6 +1184,7 @@ "create.gui.stock_ticker.no_packagers_linked": "pǝʞuıꞀ sɹǝbɐʞɔɐԀ oN", "create.gui.stock_ticker.no_search_results": "punoɟ sɯǝʇı buıɥɔʇɐɯ oN", "create.gui.stock_ticker.package_adress": "ssǝɹppⱯ ǝbɐʞɔɐԀ", + "create.gui.stock_ticker.program_requester": "ɹǝʇsǝnbǝᴚ ɯɐɹboɹԀ", "create.gui.stock_ticker.request_sent": "¡ʇuǝS ʇsǝnbǝᴚ", "create.gui.stock_ticker.search_items": "sɯǝʇI ɥɔɹɐǝS", "create.gui.stressometer.capacity": "ʎʇıɔɐdɐƆ buıuıɐɯǝᴚ", @@ -2302,6 +2304,8 @@ "create.recipe.sequenced_assembly": "ǝɔuǝnbǝS ǝdıɔǝᴚ", "create.recipe.spout_filling": "ʇnodS ʎq buıןןıℲ", "create.recipe.wood_cutting": "buıʇʇnƆ pooM", + "create.redstone_requester.keeper_connected": "ʎןןnɟssǝɔɔns ɹǝdǝǝʞ ʞɔoʇS oʇ pǝʇɔǝuuoƆ", + "create.redstone_requester.keeper_too_far_away": "ɹǝdǝǝʞ ʞɔoʇS ɯoɹɟ ʎɐʍɐ ɹɐɟ ooʇ ɹǝʇsǝnbǝᴚ", "create.schedule.applied_to_train": "ǝןnpǝɥɔS sıɥʇ buıʍoןןoɟ ʍou sı uıɐɹ⟘", "create.schedule.auto_removed_from_train": "pǝpɹɐɔsıp ǝןnpǝɥɔS-oʇnⱯ", "create.schedule.condition.delay": "ʎɐןǝᗡ pǝןnpǝɥɔS", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 97efc7b076..0a2e795f11 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -658,6 +658,7 @@ "block.create.red_valve_handle": "Red Valve Handle", "block.create.redstone_contact": "Redstone Contact", "block.create.redstone_link": "Redstone Link", + "block.create.redstone_requester": "Redstone Requester", "block.create.refined_radiance_casing": "Radiant Casing", "block.create.rope": "Rope", "block.create.rope_pulley": "Rope Pulley", @@ -1183,6 +1184,7 @@ "create.gui.stock_ticker.no_packagers_linked": "No Packagers Linked", "create.gui.stock_ticker.no_search_results": "No matching items found", "create.gui.stock_ticker.package_adress": "Package Address", + "create.gui.stock_ticker.program_requester": "Program Requester", "create.gui.stock_ticker.request_sent": "Request Sent!", "create.gui.stock_ticker.search_items": "Search Items", "create.gui.stressometer.capacity": "Remaining Capacity", @@ -2302,6 +2304,8 @@ "create.recipe.sequenced_assembly": "Recipe Sequence", "create.recipe.spout_filling": "Filling by Spout", "create.recipe.wood_cutting": "Wood Cutting", + "create.redstone_requester.keeper_connected": "Connected to Stock keeper successfully", + "create.redstone_requester.keeper_too_far_away": "Requester too far away from Stock keeper", "create.schedule.applied_to_train": "Train is now following this Schedule", "create.schedule.auto_removed_from_train": "Auto-Schedule discarded", "create.schedule.condition.delay": "Scheduled Delay", diff --git a/src/generated/resources/assets/create/models/item/redstone_requester.json b/src/generated/resources/assets/create/models/item/redstone_requester.json new file mode 100644 index 0000000000..c5c4f7a55a --- /dev/null +++ b/src/generated/resources/assets/create/models/item/redstone_requester.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/redstone_requester" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/redstone_requester.json b/src/generated/resources/data/create/loot_tables/blocks/redstone_requester.json new file mode 100644 index 0000000000..29fe85b8ec --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/redstone_requester.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:redstone_requester" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/redstone_requester" +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json b/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json index 07e5415dc1..fac1ed1d05 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json @@ -88,6 +88,7 @@ "create:mechanical_arm", "create:railway_casing", "create:stock_ticker", + "create:redstone_requester", "create:content_observer", "create:stockpile_switch", "create:creative_crate", diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json index d258a6ed91..6241fa8bef 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json @@ -126,6 +126,7 @@ "create:package_port", "create:packager_link", "create:stock_ticker", + "create:redstone_requester", "create:andesite_funnel", "create:andesite_belt_funnel", "create:brass_funnel", diff --git a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java index 274c1106dc..5e37134b32 100644 --- a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java +++ b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java @@ -175,6 +175,7 @@ import com.simibubi.create.content.logistics.packagePort.PackagePortRenderer; import com.simibubi.create.content.logistics.packager.PackagerBlockEntity; import com.simibubi.create.content.logistics.packager.PackagerRenderer; import com.simibubi.create.content.logistics.packagerLink.PackagerLinkBlockEntity; +import com.simibubi.create.content.logistics.redstoneRequester.RedstoneRequesterBlockEntity; import com.simibubi.create.content.logistics.stockTicker.StockTickerBlockEntity; import com.simibubi.create.content.logistics.tunnel.BeltTunnelBlockEntity; import com.simibubi.create.content.logistics.tunnel.BeltTunnelInstance; @@ -503,6 +504,11 @@ public class AllBlockEntityTypes { .blockEntity("stock_ticker", StockTickerBlockEntity::new) .validBlocks(AllBlocks.STOCK_TICKER) .register(); + + public static final BlockEntityEntry REDSTONE_REQUESTER = REGISTRATE + .blockEntity("redstone_requester", RedstoneRequesterBlockEntity::new) + .validBlocks(AllBlocks.REDSTONE_REQUESTER) + .register(); public static final BlockEntityEntry MECHANICAL_PISTON = REGISTRATE .blockEntity("mechanical_piston", MechanicalPistonBlockEntity::new) diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index c53567da66..3462450fe6 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -179,6 +179,7 @@ import com.simibubi.create.content.logistics.packager.PackagerBlock; import com.simibubi.create.content.logistics.packager.PackagerGenerator; import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedBlockItem; import com.simibubi.create.content.logistics.packagerLink.PackagerLinkBlock; +import com.simibubi.create.content.logistics.redstoneRequester.RedstoneRequesterBlock; import com.simibubi.create.content.logistics.stockTicker.StockTickerBlock; import com.simibubi.create.content.logistics.tunnel.BeltTunnelBlock; import com.simibubi.create.content.logistics.tunnel.BrassTunnelBlock; @@ -349,7 +350,8 @@ public class AllBlocks { public static final BlockEntry SCHEMATIC_TABLE = REGISTRATE.block("schematic_table", SchematicTableBlock::new) .initialProperties(() -> Blocks.LECTERN) - .properties(p -> p.mapColor(MapColor.PODZOL).forceSolidOn()) + .properties(p -> p.mapColor(MapColor.PODZOL) + .forceSolidOn()) .transform(axeOrPickaxe()) .blockstate((ctx, prov) -> prov.horizontalBlock(ctx.getEntry(), prov.models() .getExistingFile(ctx.getId()), 0)) @@ -360,7 +362,8 @@ public class AllBlocks { public static final BlockEntry SHAFT = REGISTRATE.block("shaft", ShaftBlock::new) .initialProperties(SharedProperties::stone) - .properties(p -> p.mapColor(MapColor.METAL).forceSolidOn()) + .properties(p -> p.mapColor(MapColor.METAL) + .forceSolidOn()) .transform(BlockStressDefaults.setNoImpact()) .transform(pickaxeOnly()) .blockstate(BlockStateGen.axisBlockProvider(false)) @@ -370,7 +373,8 @@ public class AllBlocks { public static final BlockEntry COGWHEEL = REGISTRATE.block("cogwheel", CogWheelBlock::small) .initialProperties(SharedProperties::stone) - .properties(p -> p.sound(SoundType.WOOD).mapColor(MapColor.DIRT)) + .properties(p -> p.sound(SoundType.WOOD) + .mapColor(MapColor.DIRT)) .transform(BlockStressDefaults.setNoImpact()) .transform(axeOrPickaxe()) .blockstate(BlockStateGen.axisBlockProvider(false)) @@ -382,7 +386,8 @@ public class AllBlocks { public static final BlockEntry LARGE_COGWHEEL = REGISTRATE.block("large_cogwheel", CogWheelBlock::large) .initialProperties(SharedProperties::stone) - .properties(p -> p.sound(SoundType.WOOD).mapColor(MapColor.DIRT)) + .properties(p -> p.sound(SoundType.WOOD) + .mapColor(MapColor.DIRT)) .transform(axeOrPickaxe()) .transform(BlockStressDefaults.setNoImpact()) .blockstate(BlockStateGen.axisBlockProvider(false)) @@ -448,7 +453,8 @@ public class AllBlocks { public static final BlockEntry GEARBOX = REGISTRATE.block("gearbox", GearboxBlock::new) .initialProperties(SharedProperties::stone) - .properties(p -> p.noOcclusion().mapColor(MapColor.PODZOL)) + .properties(p -> p.noOcclusion() + .mapColor(MapColor.PODZOL)) .transform(BlockStressDefaults.setNoImpact()) .transform(axeOrPickaxe()) .onRegister(CreateRegistrate.connectedTextures(() -> new EncasedCTBehaviour(AllSpriteShifts.ANDESITE_CASING))) @@ -461,7 +467,8 @@ public class AllBlocks { public static final BlockEntry CLUTCH = REGISTRATE.block("clutch", ClutchBlock::new) .initialProperties(SharedProperties::stone) - .properties(p -> p.noOcclusion().mapColor(MapColor.PODZOL)) + .properties(p -> p.noOcclusion() + .mapColor(MapColor.PODZOL)) .addLayer(() -> RenderType::cutoutMipped) .transform(BlockStressDefaults.setNoImpact()) .transform(axeOrPickaxe()) @@ -472,7 +479,8 @@ public class AllBlocks { public static final BlockEntry GEARSHIFT = REGISTRATE.block("gearshift", GearshiftBlock::new) .initialProperties(SharedProperties::stone) - .properties(p -> p.noOcclusion().mapColor(MapColor.PODZOL)) + .properties(p -> p.noOcclusion() + .mapColor(MapColor.PODZOL)) .addLayer(() -> RenderType::cutoutMipped) .transform(BlockStressDefaults.setNoImpact()) .transform(axeOrPickaxe()) @@ -484,7 +492,8 @@ public class AllBlocks { public static final BlockEntry ENCASED_CHAIN_DRIVE = REGISTRATE.block("encased_chain_drive", ChainDriveBlock::new) .initialProperties(SharedProperties::stone) - .properties(p -> p.noOcclusion().mapColor(MapColor.PODZOL)) + .properties(p -> p.noOcclusion() + .mapColor(MapColor.PODZOL)) .transform(BlockStressDefaults.setNoImpact()) .transform(axeOrPickaxe()) .blockstate((c, p) -> new ChainDriveGenerator((state, suffix) -> p.models() @@ -496,7 +505,8 @@ public class AllBlocks { public static final BlockEntry ADJUSTABLE_CHAIN_GEARSHIFT = REGISTRATE.block("adjustable_chain_gearshift", ChainGearshiftBlock::new) .initialProperties(SharedProperties::stone) - .properties(p -> p.noOcclusion().mapColor(MapColor.NETHER)) + .properties(p -> p.noOcclusion() + .mapColor(MapColor.NETHER)) .transform(BlockStressDefaults.setNoImpact()) .transform(axeOrPickaxe()) .blockstate((c, p) -> new ChainDriveGenerator((state, suffix) -> { @@ -527,7 +537,8 @@ public class AllBlocks { public static final BlockEntry CHAIN_CONVEYOR = REGISTRATE.block("chain_conveyor", ChainConveyorBlock::new) .initialProperties(SharedProperties::stone) - .properties(p -> p.noOcclusion().mapColor(MapColor.PODZOL)) + .properties(p -> p.noOcclusion() + .mapColor(MapColor.PODZOL)) .transform(axeOrPickaxe()) .transform(BlockStressDefaults.setNoImpact()) .tag(AllBlockTags.RELOCATION_NOT_SUPPORTED.tag) @@ -535,11 +546,12 @@ public class AllBlocks { .item() .transform(customItemModel()) .register(); - + public static final BlockEntry CREATIVE_MOTOR = REGISTRATE.block("creative_motor", CreativeMotorBlock::new) .initialProperties(SharedProperties::stone) - .properties(p -> p.mapColor(MapColor.COLOR_PURPLE).forceSolidOn()) + .properties(p -> p.mapColor(MapColor.COLOR_PURPLE) + .forceSolidOn()) .tag(AllBlockTags.SAFE_NBT.tag) .transform(pickaxeOnly()) .blockstate(new CreativeMotorGenerator()::generate) @@ -552,7 +564,8 @@ public class AllBlocks { public static final BlockEntry WATER_WHEEL = REGISTRATE.block("water_wheel", WaterWheelBlock::new) .initialProperties(SharedProperties::wooden) - .properties(p -> p.noOcclusion().mapColor(MapColor.DIRT)) + .properties(p -> p.noOcclusion() + .mapColor(MapColor.DIRT)) .transform(axeOrPickaxe()) .blockstate( (c, p) -> BlockStateGen.directionalBlockIgnoresWaterlogged(c, p, s -> AssetLookup.partialBaseModel(c, p))) @@ -566,7 +579,8 @@ public class AllBlocks { public static final BlockEntry LARGE_WATER_WHEEL = REGISTRATE.block("large_water_wheel", LargeWaterWheelBlock::new) .initialProperties(SharedProperties::wooden) - .properties(p -> p.noOcclusion().mapColor(MapColor.DIRT)) + .properties(p -> p.noOcclusion() + .mapColor(MapColor.DIRT)) .transform(axeOrPickaxe()) .blockstate((c, p) -> axisBlock(c, p, s -> s.getValue(LargeWaterWheelBlock.EXTENSION) ? AssetLookup.partialBaseModel(c, p, "extension") @@ -582,7 +596,8 @@ public class AllBlocks { .initialProperties(SharedProperties::wooden) .blockstate((c, p) -> p.getVariantBuilder(c.get()) .forAllStatesExcept(BlockStateGen.mapToAir(p), WaterWheelStructuralBlock.FACING)) - .properties(p -> p.noOcclusion().mapColor(MapColor.DIRT)) + .properties(p -> p.noOcclusion() + .mapColor(MapColor.DIRT)) .transform(axeOrPickaxe()) .lang("Large Water Wheel") .register(); @@ -687,7 +702,8 @@ public class AllBlocks { public static final BlockEntry MECHANICAL_PRESS = REGISTRATE.block("mechanical_press", MechanicalPressBlock::new) .initialProperties(SharedProperties::stone) - .properties(p -> p.noOcclusion().mapColor(MapColor.PODZOL)) + .properties(p -> p.noOcclusion() + .mapColor(MapColor.PODZOL)) .transform(axeOrPickaxe()) .blockstate(BlockStateGen.horizontalBlockProvider(true)) .transform(BlockStressDefaults.setImpact(8.0)) @@ -698,7 +714,8 @@ public class AllBlocks { public static final BlockEntry MECHANICAL_MIXER = REGISTRATE.block("mechanical_mixer", MechanicalMixerBlock::new) .initialProperties(SharedProperties::stone) - .properties(p -> p.noOcclusion().mapColor(MapColor.STONE)) + .properties(p -> p.noOcclusion() + .mapColor(MapColor.STONE)) .transform(axeOrPickaxe()) .blockstate((c, p) -> p.simpleBlock(c.getEntry(), AssetLookup.partialBaseModel(c, p))) .addLayer(() -> RenderType::cutoutMipped) @@ -709,7 +726,8 @@ public class AllBlocks { public static final BlockEntry BASIN = REGISTRATE.block("basin", BasinBlock::new) .initialProperties(SharedProperties::stone) - .properties(p -> p.mapColor(MapColor.COLOR_GRAY).sound(SoundType.NETHERITE_BLOCK)) + .properties(p -> p.mapColor(MapColor.COLOR_GRAY) + .sound(SoundType.NETHERITE_BLOCK)) .transform(pickaxeOnly()) .blockstate(new BasinGenerator()::generate) .addLayer(() -> RenderType::cutoutMipped) @@ -721,10 +739,12 @@ public class AllBlocks { public static final BlockEntry BLAZE_BURNER = REGISTRATE.block("blaze_burner", BlazeBurnerBlock::new) .initialProperties(SharedProperties::softMetal) - .properties(p -> p.mapColor(MapColor.COLOR_GRAY).lightLevel(BlazeBurnerBlock::getLight)) + .properties(p -> p.mapColor(MapColor.COLOR_GRAY) + .lightLevel(BlazeBurnerBlock::getLight)) .transform(pickaxeOnly()) .addLayer(() -> RenderType::cutoutMipped) - .tag(AllBlockTags.FAN_PROCESSING_CATALYSTS_BLASTING.tag, AllBlockTags.FAN_PROCESSING_CATALYSTS_SMOKING.tag, AllBlockTags.FAN_TRANSPARENT.tag, AllBlockTags.PASSIVE_BOILER_HEATERS.tag) + .tag(AllBlockTags.FAN_PROCESSING_CATALYSTS_BLASTING.tag, AllBlockTags.FAN_PROCESSING_CATALYSTS_SMOKING.tag, + AllBlockTags.FAN_TRANSPARENT.tag, AllBlockTags.PASSIVE_BOILER_HEATERS.tag) .loot((lt, block) -> lt.add(block, BlazeBurnerBlock.buildLootTable())) .blockstate((c, p) -> p.simpleBlock(c.getEntry(), AssetLookup.partialBaseModel(c, p))) .onRegister(movementBehaviour(new BlazeBurnerMovementBehaviour())) @@ -737,10 +757,12 @@ public class AllBlocks { public static final BlockEntry LIT_BLAZE_BURNER = REGISTRATE.block("lit_blaze_burner", LitBlazeBurnerBlock::new) .initialProperties(SharedProperties::softMetal) - .properties(p -> p.mapColor(MapColor.COLOR_LIGHT_GRAY).lightLevel(LitBlazeBurnerBlock::getLight)) + .properties(p -> p.mapColor(MapColor.COLOR_LIGHT_GRAY) + .lightLevel(LitBlazeBurnerBlock::getLight)) .transform(pickaxeOnly()) .addLayer(() -> RenderType::cutoutMipped) - .tag(AllBlockTags.FAN_PROCESSING_CATALYSTS_HAUNTING.tag, AllBlockTags.FAN_PROCESSING_CATALYSTS_SMOKING.tag, AllBlockTags.FAN_TRANSPARENT.tag, AllBlockTags.PASSIVE_BOILER_HEATERS.tag) + .tag(AllBlockTags.FAN_PROCESSING_CATALYSTS_HAUNTING.tag, AllBlockTags.FAN_PROCESSING_CATALYSTS_SMOKING.tag, + AllBlockTags.FAN_TRANSPARENT.tag, AllBlockTags.PASSIVE_BOILER_HEATERS.tag) .loot((lt, block) -> lt.dropOther(block, AllItems.EMPTY_BLAZE_BURNER.get())) .blockstate((c, p) -> p.getVariantBuilder(c.get()) .forAllStates(state -> ConfiguredModel.builder() @@ -765,7 +787,8 @@ public class AllBlocks { public static final BlockEntry WEIGHTED_EJECTOR = REGISTRATE.block("weighted_ejector", EjectorBlock::new) .initialProperties(SharedProperties::stone) - .properties(p -> p.noOcclusion().mapColor(MapColor.COLOR_GRAY)) + .properties(p -> p.noOcclusion() + .mapColor(MapColor.COLOR_GRAY)) .transform(axeOrPickaxe()) .blockstate((c, p) -> p.horizontalBlock(c.getEntry(), AssetLookup.partialBaseModel(c, p), 180)) .transform(BlockStressDefaults.setImpact(2.0)) @@ -776,7 +799,8 @@ public class AllBlocks { public static final BlockEntry CHUTE = REGISTRATE.block("chute", ChuteBlock::new) .initialProperties(SharedProperties::softMetal) - .properties(p -> p.mapColor(MapColor.COLOR_GRAY).sound(SoundType.NETHERITE_BLOCK)) + .properties(p -> p.mapColor(MapColor.COLOR_GRAY) + .sound(SoundType.NETHERITE_BLOCK)) .transform(pickaxeOnly()) .addLayer(() -> RenderType::cutoutMipped) .blockstate(new ChuteGenerator()::generate) @@ -851,7 +875,8 @@ public class AllBlocks { public static final BlockEntry ENCASED_FLUID_PIPE = REGISTRATE.block("encased_fluid_pipe", p -> new EncasedPipeBlock(p, AllBlocks.COPPER_CASING::get)) .initialProperties(SharedProperties::copperMetal) - .properties(p -> p.noOcclusion().mapColor(MapColor.TERRACOTTA_LIGHT_GRAY)) + .properties(p -> p.noOcclusion() + .mapColor(MapColor.TERRACOTTA_LIGHT_GRAY)) .transform(axeOrPickaxe()) .blockstate(BlockStateGen.encasedPipe()) .onRegister(CreateRegistrate.connectedTextures(() -> new EncasedCTBehaviour(AllSpriteShifts.COPPER_CASING))) @@ -941,7 +966,8 @@ public class AllBlocks { public static final BlockEntry FLUID_TANK = REGISTRATE.block("fluid_tank", FluidTankBlock::regular) .initialProperties(SharedProperties::copperMetal) - .properties(p -> p.noOcclusion().isRedstoneConductor((p1, p2, p3) -> true)) + .properties(p -> p.noOcclusion() + .isRedstoneConductor((p1, p2, p3) -> true)) .transform(pickaxeOnly()) .blockstate(new FluidTankGenerator()::generate) .onRegister(CreateRegistrate.blockModel(() -> FluidTankModel::standard)) @@ -955,7 +981,8 @@ public class AllBlocks { public static final BlockEntry CREATIVE_FLUID_TANK = REGISTRATE.block("creative_fluid_tank", FluidTankBlock::creative) .initialProperties(SharedProperties::copperMetal) - .properties(p -> p.noOcclusion().mapColor(MapColor.COLOR_PURPLE)) + .properties(p -> p.noOcclusion() + .mapColor(MapColor.COLOR_PURPLE)) .transform(pickaxeOnly()) .tag(AllBlockTags.SAFE_NBT.tag) .blockstate(new FluidTankGenerator("creative_")::generate) @@ -1034,7 +1061,8 @@ public class AllBlocks { public static final BlockEntry STEAM_WHISTLE_EXTENSION = REGISTRATE.block("steam_whistle_extension", WhistleExtenderBlock::new) .initialProperties(SharedProperties::copperMetal) - .properties(p -> p.mapColor(MapColor.GOLD).forceSolidOn()) + .properties(p -> p.mapColor(MapColor.GOLD) + .forceSolidOn()) .transform(pickaxeOnly()) .blockstate(BlockStateGen.whistleExtender()) .register(); @@ -1042,7 +1070,8 @@ public class AllBlocks { public static final BlockEntry POWERED_SHAFT = REGISTRATE.block("powered_shaft", PoweredShaftBlock::new) .initialProperties(SharedProperties::stone) - .properties(p -> p.mapColor(MapColor.METAL).forceSolidOn()) + .properties(p -> p.mapColor(MapColor.METAL) + .forceSolidOn()) .transform(pickaxeOnly()) .blockstate(BlockStateGen.axisBlockProvider(false)) .loot((lt, block) -> lt.dropOther(block, AllBlocks.SHAFT.get())) @@ -1069,7 +1098,9 @@ public class AllBlocks { public static final BlockEntry PISTON_EXTENSION_POLE = REGISTRATE.block("piston_extension_pole", PistonExtensionPoleBlock::new) .initialProperties(() -> Blocks.PISTON_HEAD) - .properties(p -> p.sound(SoundType.SCAFFOLDING).mapColor(MapColor.DIRT).forceSolidOn()) + .properties(p -> p.sound(SoundType.SCAFFOLDING) + .mapColor(MapColor.DIRT) + .forceSolidOn()) .transform(axeOrPickaxe()) .blockstate(BlockStateGen.directionalBlockProviderIgnoresWaterlogged(false)) .simpleItem() @@ -1089,7 +1120,8 @@ public class AllBlocks { public static final BlockEntry GANTRY_CARRIAGE = REGISTRATE.block("gantry_carriage", GantryCarriageBlock::new) .initialProperties(SharedProperties::stone) - .properties(p -> p.noOcclusion().mapColor(MapColor.PODZOL)) + .properties(p -> p.noOcclusion() + .mapColor(MapColor.PODZOL)) .transform(axeOrPickaxe()) .blockstate(BlockStateGen.directionalAxisBlockProvider()) .item() @@ -1099,7 +1131,8 @@ public class AllBlocks { public static final BlockEntry GANTRY_SHAFT = REGISTRATE.block("gantry_shaft", GantryShaftBlock::new) .initialProperties(SharedProperties::stone) - .properties(p -> p.mapColor(MapColor.NETHER).forceSolidOn()) + .properties(p -> p.mapColor(MapColor.NETHER) + .forceSolidOn()) .transform(axeOrPickaxe()) .blockstate((c, p) -> p.directionalBlock(c.get(), s -> { boolean isPowered = s.getValue(GantryShaftBlock.POWERED); @@ -1194,7 +1227,8 @@ public class AllBlocks { public static final BlockEntry CART_ASSEMBLER = REGISTRATE.block("cart_assembler", CartAssemblerBlock::new) .initialProperties(SharedProperties::stone) - .properties(p -> p.noOcclusion().mapColor(MapColor.COLOR_GRAY)) + .properties(p -> p.noOcclusion() + .mapColor(MapColor.COLOR_GRAY)) .transform(axeOrPickaxe()) .blockstate(BlockStateGen.cartAssembler()) .addLayer(() -> RenderType::cutoutMipped) @@ -1350,7 +1384,8 @@ public class AllBlocks { public static final BlockEntry ELEVATOR_CONTACT = REGISTRATE.block("elevator_contact", ElevatorContactBlock::new) .initialProperties(SharedProperties::softMetal) - .properties(p -> p.mapColor(MapColor.TERRACOTTA_YELLOW).lightLevel(ElevatorContactBlock::getLight)) + .properties(p -> p.mapColor(MapColor.TERRACOTTA_YELLOW) + .lightLevel(ElevatorContactBlock::getLight)) .transform(axeOrPickaxe()) .blockstate((c, p) -> p.directionalBlock(c.get(), state -> { Boolean calling = state.getValue(ElevatorContactBlock.CALLING); @@ -1367,7 +1402,8 @@ public class AllBlocks { public static final BlockEntry MECHANICAL_HARVESTER = REGISTRATE.block("mechanical_harvester", HarvesterBlock::new) .initialProperties(SharedProperties::stone) - .properties(p -> p.mapColor(MapColor.METAL).forceSolidOn()) + .properties(p -> p.mapColor(MapColor.METAL) + .forceSolidOn()) .transform(axeOrPickaxe()) .onRegister(movementBehaviour(new HarvesterMovementBehaviour())) .blockstate(BlockStateGen.horizontalBlockProvider(true)) @@ -1380,7 +1416,8 @@ public class AllBlocks { public static final BlockEntry MECHANICAL_PLOUGH = REGISTRATE.block("mechanical_plough", PloughBlock::new) .initialProperties(SharedProperties::stone) - .properties(p -> p.mapColor(MapColor.COLOR_GRAY).forceSolidOn()) + .properties(p -> p.mapColor(MapColor.COLOR_GRAY) + .forceSolidOn()) .transform(axeOrPickaxe()) .onRegister(movementBehaviour(new PloughMovementBehaviour())) .blockstate(BlockStateGen.horizontalBlockProvider(false)) @@ -1460,7 +1497,8 @@ public class AllBlocks { .register(); public static final BlockEntry COPPER_CASING = REGISTRATE.block("copper_casing", CasingBlock::new) - .properties(p -> p.mapColor(MapColor.TERRACOTTA_LIGHT_GRAY).sound(SoundType.COPPER)) + .properties(p -> p.mapColor(MapColor.TERRACOTTA_LIGHT_GRAY) + .sound(SoundType.COPPER)) .transform(BuilderTransformers.casing(() -> AllSpriteShifts.COPPER_CASING)) .register(); @@ -1482,7 +1520,8 @@ public class AllBlocks { public static final BlockEntry MECHANICAL_CRAFTER = REGISTRATE.block("mechanical_crafter", MechanicalCrafterBlock::new) .initialProperties(SharedProperties::softMetal) - .properties(p -> p.noOcclusion().mapColor(MapColor.TERRACOTTA_YELLOW)) + .properties(p -> p.noOcclusion() + .mapColor(MapColor.TERRACOTTA_YELLOW)) .transform(axeOrPickaxe()) .blockstate(BlockStateGen.horizontalBlockProvider(true)) .transform(BlockStressDefaults.setImpact(2.0)) @@ -1507,7 +1546,8 @@ public class AllBlocks { public static final BlockEntry FLYWHEEL = REGISTRATE.block("flywheel", FlywheelBlock::new) .initialProperties(SharedProperties::softMetal) - .properties(p -> p.noOcclusion().mapColor(MapColor.TERRACOTTA_YELLOW)) + .properties(p -> p.noOcclusion() + .mapColor(MapColor.TERRACOTTA_YELLOW)) .transform(axeOrPickaxe()) .transform(BlockStressDefaults.setNoImpact()) .blockstate(BlockStateGen.axisBlockProvider(true)) @@ -1576,13 +1616,15 @@ public class AllBlocks { public static final BlockEntry RAILWAY_CASING = REGISTRATE.block("railway_casing", CasingBlock::new) .transform(BuilderTransformers.layeredCasing(() -> AllSpriteShifts.RAILWAY_CASING_SIDE, () -> AllSpriteShifts.RAILWAY_CASING)) - .properties(p -> p.mapColor(MapColor.TERRACOTTA_CYAN).sound(SoundType.NETHERITE_BLOCK)) + .properties(p -> p.mapColor(MapColor.TERRACOTTA_CYAN) + .sound(SoundType.NETHERITE_BLOCK)) .lang("Train Casing") .register(); public static final BlockEntry TRACK_STATION = REGISTRATE.block("track_station", StationBlock::new) .initialProperties(SharedProperties::softMetal) - .properties(p -> p.mapColor(MapColor.PODZOL).sound(SoundType.NETHERITE_BLOCK)) + .properties(p -> p.mapColor(MapColor.PODZOL) + .sound(SoundType.NETHERITE_BLOCK)) .transform(pickaxeOnly()) .blockstate((c, p) -> p.simpleBlock(c.get(), AssetLookup.partialBaseModel(c, p))) .onRegister(assignDataBehaviour(new StationSummaryDisplaySource(), "station_summary")) @@ -1636,7 +1678,8 @@ public class AllBlocks { public static final BlockEntry TRAIN_CONTROLS = REGISTRATE.block("controls", ControlsBlock::new) .initialProperties(SharedProperties::softMetal) - .properties(p -> p.mapColor(MapColor.TERRACOTTA_BROWN).sound(SoundType.NETHERITE_BLOCK)) + .properties(p -> p.mapColor(MapColor.TERRACOTTA_BROWN) + .sound(SoundType.NETHERITE_BLOCK)) .addLayer(() -> RenderType::cutoutMipped) .transform(pickaxeOnly()) .blockstate((c, p) -> p.horizontalBlock(c.get(), @@ -1651,7 +1694,8 @@ public class AllBlocks { public static final BlockEntry ITEM_VAULT = REGISTRATE.block("item_vault", ItemVaultBlock::new) .initialProperties(SharedProperties::softMetal) - .properties(p -> p.mapColor(MapColor.TERRACOTTA_BLUE).sound(SoundType.NETHERITE_BLOCK) + .properties(p -> p.mapColor(MapColor.TERRACOTTA_BLUE) + .sound(SoundType.NETHERITE_BLOCK) .explosionResistance(1200)) .transform(pickaxeOnly()) .blockstate((c, p) -> p.getVariantBuilder(c.get()) @@ -1677,19 +1721,20 @@ public class AllBlocks { .model(AssetLookup::customItemModel) .build() .register(); - - public static final BlockEntry PACKAGE_PORT = REGISTRATE.block("package_port", PackagePortBlock::new) - .initialProperties(SharedProperties::softMetal) - .properties(p -> p.noOcclusion()) - .properties(p -> p.mapColor(MapColor.TERRACOTTA_BLUE) - .sound(SoundType.NETHERITE_BLOCK)) - .transform(pickaxeOnly()) - .addLayer(() -> RenderType::cutoutMipped) - .blockstate((c, p) -> p.simpleBlock(c.getEntry(), AssetLookup.partialBaseModel(c, p))) - .item(PackagePortItem::new) - .model(AssetLookup::customItemModel) - .build() - .register(); + + public static final BlockEntry PACKAGE_PORT = + REGISTRATE.block("package_port", PackagePortBlock::new) + .initialProperties(SharedProperties::softMetal) + .properties(p -> p.noOcclusion()) + .properties(p -> p.mapColor(MapColor.TERRACOTTA_BLUE) + .sound(SoundType.NETHERITE_BLOCK)) + .transform(pickaxeOnly()) + .addLayer(() -> RenderType::cutoutMipped) + .blockstate((c, p) -> p.simpleBlock(c.getEntry(), AssetLookup.partialBaseModel(c, p))) + .item(PackagePortItem::new) + .model(AssetLookup::customItemModel) + .build() + .register(); public static final BlockEntry PACKAGER_LINK = REGISTRATE.block("packager_link", PackagerLinkBlock::new) @@ -1714,6 +1759,15 @@ public class AllBlocks { .build() .register(); + public static final BlockEntry REDSTONE_REQUESTER = + REGISTRATE.block("redstone_requester", RedstoneRequesterBlock::new) + .initialProperties(SharedProperties::stone) + .properties(p -> p.sound(SoundType.WOOD)) + .transform(axeOrPickaxe()) + .blockstate((c, p) -> p.simpleBlock(c.get(), AssetLookup.standardModel(c, p))) + .simpleItem() + .register(); + public static final BlockEntry ANDESITE_FUNNEL = REGISTRATE.block("andesite_funnel", AndesiteFunnelBlock::new) .addLayer(() -> RenderType::cutoutMipped) @@ -1786,7 +1840,8 @@ public class AllBlocks { public static final BlockEntry SMART_OBSERVER = REGISTRATE.block("content_observer", SmartObserverBlock::new) .initialProperties(SharedProperties::stone) - .properties(p -> p.mapColor(MapColor.TERRACOTTA_BROWN).noOcclusion()) + .properties(p -> p.mapColor(MapColor.TERRACOTTA_BROWN) + .noOcclusion()) .transform(axeOrPickaxe()) .blockstate(new SmartObserverGenerator()::generate) .onRegister(assignDataBehaviour(new ItemCountDisplaySource(), "count_items")) @@ -1801,7 +1856,8 @@ public class AllBlocks { public static final BlockEntry THRESHOLD_SWITCH = REGISTRATE.block("stockpile_switch", ThresholdSwitchBlock::new) .initialProperties(SharedProperties::stone) - .properties(p -> p.mapColor(MapColor.TERRACOTTA_BROWN).noOcclusion()) + .properties(p -> p.mapColor(MapColor.TERRACOTTA_BROWN) + .noOcclusion()) .transform(axeOrPickaxe()) .blockstate(new ThresholdSwitchGenerator()::generate) .onRegister(assignDataBehaviour(new FillLevelDisplaySource(), "fill_level")) @@ -1844,7 +1900,9 @@ public class AllBlocks { public static final BlockEntry ORANGE_NIXIE_TUBE = REGISTRATE.block("nixie_tube", p -> new NixieTubeBlock(p, DyeColor.ORANGE)) .initialProperties(SharedProperties::softMetal) - .properties(p -> p.lightLevel($ -> 5).mapColor(DyeColor.ORANGE).forceSolidOn()) + .properties(p -> p.lightLevel($ -> 5) + .mapColor(DyeColor.ORANGE) + .forceSolidOn()) .transform(pickaxeOnly()) .blockstate(new NixieTubeGenerator()::generate) .addLayer(() -> RenderType::translucent) @@ -1858,7 +1916,9 @@ public class AllBlocks { String colourName = colour.getSerializedName(); return REGISTRATE.block(colourName + "_nixie_tube", p -> new NixieTubeBlock(p, colour)) .initialProperties(SharedProperties::softMetal) - .properties(p -> p.lightLevel($ -> 5).mapColor(colour).forceSolidOn()) + .properties(p -> p.lightLevel($ -> 5) + .mapColor(colour) + .forceSolidOn()) .transform(pickaxeOnly()) .blockstate(new NixieTubeGenerator()::generate) .loot((p, b) -> p.dropOther(b, ORANGE_NIXIE_TUBE.get())) @@ -1884,7 +1944,8 @@ public class AllBlocks { public static final BlockEntry REDSTONE_LINK = REGISTRATE.block("redstone_link", RedstoneLinkBlock::new) .initialProperties(SharedProperties::wooden) - .properties(p -> p.mapColor(MapColor.TERRACOTTA_BROWN).forceSolidOn()) + .properties(p -> p.mapColor(MapColor.TERRACOTTA_BROWN) + .forceSolidOn()) .transform(axeOrPickaxe()) .tag(AllBlockTags.BRITTLE.tag, AllBlockTags.SAFE_NBT.tag) .blockstate(new RedstoneLinkGenerator()::generate) @@ -1986,14 +2047,16 @@ public class AllBlocks { public static final BlockEntry PECULIAR_BELL = REGISTRATE.block("peculiar_bell", PeculiarBellBlock::new) - .properties(p -> p.mapColor(MapColor.GOLD).forceSolidOn()) + .properties(p -> p.mapColor(MapColor.GOLD) + .forceSolidOn()) .transform(BuilderTransformers.bell()) .onRegister(movementBehaviour(new BellMovementBehaviour())) .register(); public static final BlockEntry HAUNTED_BELL = REGISTRATE.block("haunted_bell", HauntedBellBlock::new) - .properties(p -> p.mapColor(MapColor.SAND).forceSolidOn()) + .properties(p -> p.mapColor(MapColor.SAND) + .forceSolidOn()) .transform(BuilderTransformers.bell()) .onRegister(movementBehaviour(new HauntedBellMovementBehaviour())) .register(); @@ -2002,7 +2065,9 @@ public class AllBlocks { String colourName = colour.getSerializedName(); return REGISTRATE.block(colourName + "_toolbox", p -> new ToolboxBlock(p, colour)) .initialProperties(SharedProperties::wooden) - .properties(p -> p.sound(SoundType.WOOD).mapColor(colour).forceSolidOn()) + .properties(p -> p.sound(SoundType.WOOD) + .mapColor(colour) + .forceSolidOn()) .addLayer(() -> RenderType::cutoutMipped) .loot((lt, block) -> { Builder builder = LootTable.lootTable(); @@ -2100,7 +2165,8 @@ public class AllBlocks { public static final BlockEntry METAL_GIRDER = REGISTRATE.block("metal_girder", GirderBlock::new) .initialProperties(SharedProperties::softMetal) - .properties(p -> p.mapColor(MapColor.COLOR_GRAY).sound(SoundType.NETHERITE_BLOCK)) + .properties(p -> p.mapColor(MapColor.COLOR_GRAY) + .sound(SoundType.NETHERITE_BLOCK)) .transform(pickaxeOnly()) .blockstate(GirderBlockStateGenerator::blockState) .onRegister(CreateRegistrate.blockModel(() -> ConnectedGirderModel::new)) @@ -2111,7 +2177,8 @@ public class AllBlocks { public static final BlockEntry METAL_GIRDER_ENCASED_SHAFT = REGISTRATE.block("metal_girder_encased_shaft", GirderEncasedShaftBlock::new) .initialProperties(SharedProperties::softMetal) - .properties(p -> p.mapColor(MapColor.COLOR_GRAY).sound(SoundType.NETHERITE_BLOCK)) + .properties(p -> p.mapColor(MapColor.COLOR_GRAY) + .sound(SoundType.NETHERITE_BLOCK)) .transform(pickaxeOnly()) .blockstate(GirderBlockStateGenerator::blockStateWithShaft) .loot((p, b) -> p.add(b, p.createSingleItemTable(METAL_GIRDER.get()) @@ -2289,7 +2356,8 @@ public class AllBlocks { public static final BlockEntry RAW_ZINC_BLOCK = REGISTRATE.block("raw_zinc_block", Block::new) .initialProperties(() -> Blocks.RAW_GOLD_BLOCK) - .properties(p -> p.mapColor(MapColor.GLOW_LICHEN).requiresCorrectToolForDrops()) + .properties(p -> p.mapColor(MapColor.GLOW_LICHEN) + .requiresCorrectToolForDrops()) .transform(pickaxeOnly()) .tag(Tags.Blocks.STORAGE_BLOCKS) .tag(BlockTags.NEEDS_IRON_TOOL) @@ -2301,7 +2369,8 @@ public class AllBlocks { public static final BlockEntry ZINC_BLOCK = REGISTRATE.block("zinc_block", Block::new) .initialProperties(() -> Blocks.IRON_BLOCK) - .properties(p -> p.mapColor(MapColor.GLOW_LICHEN).requiresCorrectToolForDrops()) + .properties(p -> p.mapColor(MapColor.GLOW_LICHEN) + .requiresCorrectToolForDrops()) .transform(pickaxeOnly()) .tag(BlockTags.NEEDS_IRON_TOOL) .tag(Tags.Blocks.STORAGE_BLOCKS) @@ -2314,7 +2383,8 @@ public class AllBlocks { public static final BlockEntry ANDESITE_ALLOY_BLOCK = REGISTRATE.block("andesite_alloy_block", Block::new) .initialProperties(() -> Blocks.ANDESITE) - .properties(p -> p.mapColor(MapColor.STONE).requiresCorrectToolForDrops()) + .properties(p -> p.mapColor(MapColor.STONE) + .requiresCorrectToolForDrops()) .transform(pickaxeOnly()) .blockstate(simpleCubeAll("andesite_block")) .tag(Tags.Blocks.STORAGE_BLOCKS) @@ -2342,7 +2412,8 @@ public class AllBlocks { public static final BlockEntry BRASS_BLOCK = REGISTRATE.block("brass_block", Block::new) .initialProperties(() -> Blocks.IRON_BLOCK) - .properties(p -> p.mapColor(MapColor.TERRACOTTA_YELLOW).requiresCorrectToolForDrops()) + .properties(p -> p.mapColor(MapColor.TERRACOTTA_YELLOW) + .requiresCorrectToolForDrops()) .transform(pickaxeOnly()) .blockstate(simpleCubeAll("brass_block")) .tag(BlockTags.NEEDS_IRON_TOOL) @@ -2391,7 +2462,8 @@ public class AllBlocks { public static final BlockEntry ROSE_QUARTZ_TILES = REGISTRATE.block("rose_quartz_tiles", Block::new) .initialProperties(() -> Blocks.DEEPSLATE) - .properties(p -> p.mapColor(MapColor.TERRACOTTA_PINK).requiresCorrectToolForDrops()) + .properties(p -> p.mapColor(MapColor.TERRACOTTA_PINK) + .requiresCorrectToolForDrops()) .transform(pickaxeOnly()) .blockstate(simpleCubeAll("palettes/rose_quartz_tiles")) .recipe((c, p) -> p.stonecutting(DataIngredient.items(AllItems.POLISHED_ROSE_QUARTZ.get()), @@ -2402,7 +2474,8 @@ public class AllBlocks { public static final BlockEntry SMALL_ROSE_QUARTZ_TILES = REGISTRATE.block("small_rose_quartz_tiles", Block::new) .initialProperties(() -> Blocks.DEEPSLATE) - .properties(p -> p.mapColor(MapColor.TERRACOTTA_PINK).requiresCorrectToolForDrops()) + .properties(p -> p.mapColor(MapColor.TERRACOTTA_PINK) + .requiresCorrectToolForDrops()) .transform(pickaxeOnly()) .blockstate(simpleCubeAll("palettes/small_rose_quartz_tiles")) .recipe((c, p) -> p.stonecutting(DataIngredient.items(AllItems.POLISHED_ROSE_QUARTZ.get()), diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java index 11476e7f3f..6f1980e0a6 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java @@ -187,7 +187,7 @@ public class PackageItem extends Item { pTooltipComponents.add(Components.literal("-> " + compoundnbt.getString("Address")) .withStyle(ChatFormatting.GOLD)); - // TEMPORARY + /* Debug Fragmentation Data if (compoundnbt.contains("Fragment")) { CompoundTag fragTag = compoundnbt.getCompound("Fragment"); pTooltipComponents.add(Components.literal("Order Information (Temporary)") @@ -200,7 +200,7 @@ public class PackageItem extends Item { pTooltipComponents.add(Components.literal("Has Context!") .withStyle(ChatFormatting.DARK_GREEN)); } - // + */ if (!compoundnbt.contains("Items", Tag.TAG_COMPOUND)) return; diff --git a/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlock.java b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlock.java new file mode 100644 index 0000000000..c086aca4e7 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlock.java @@ -0,0 +1,167 @@ +package com.simibubi.create.content.logistics.redstoneRequester; + +import java.util.List; + +import com.simibubi.create.AllBlockEntityTypes; +import com.simibubi.create.AllBlocks; +import com.simibubi.create.content.logistics.stockTicker.PackageOrder; +import com.simibubi.create.content.logistics.stockTicker.StockTickerBlockEntity; +import com.simibubi.create.foundation.block.IBE; +import com.simibubi.create.foundation.utility.CreateLang; + +import net.createmod.catnip.utility.IntAttached; +import net.createmod.catnip.utility.lang.Components; +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.nbt.Tag; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.SignalGetter; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootParams.Builder; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; + +public class RedstoneRequesterBlock extends Block implements IBE { + + public RedstoneRequesterBlock(Properties pProperties) { + super(pProperties); + } + + @Override + public boolean shouldCheckWeakPower(BlockState state, SignalGetter level, BlockPos pos, Direction side) { + return false; + } + + public static void programRequester(ServerPlayer player, StockTickerBlockEntity be, PackageOrder order, + String address) { + ItemStack stack = player.getMainHandItem(); + if (!AllBlocks.REDSTONE_REQUESTER.isIn(stack)) + return; + + CompoundTag tag = stack.getOrCreateTag(); + addBEtag(order, address, tag); + + tag.put("StockTickerPos", NbtUtils.writeBlockPos(be.getBlockPos())); + tag.putString("StockTickerDim", player.level() + .dimension() + .location() + .toString()); + + player.setItemInHand(InteractionHand.MAIN_HAND, stack); + } + + @Override + public void appendHoverText(ItemStack pStack, BlockGetter pLevel, List pTooltip, TooltipFlag pFlag) { + super.appendHoverText(pStack, pLevel, pTooltip, pFlag); + CompoundTag compoundnbt = pStack.getOrCreateTag(); + if (!compoundnbt.contains("BlockEntityTag", Tag.TAG_COMPOUND)) + return; + compoundnbt = compoundnbt.getCompound("BlockEntityTag"); + + if (compoundnbt.contains("EncodedAddress", Tag.TAG_STRING)) + pTooltip.add(Components.literal("-> " + compoundnbt.getString("EncodedAddress")) + .withStyle(ChatFormatting.GOLD)); + + if (!compoundnbt.contains("EncodedRequest", Tag.TAG_COMPOUND)) + return; + + PackageOrder contents = PackageOrder.read(compoundnbt.getCompound("EncodedRequest")); + for (IntAttached entry : contents.stacks()) { + pTooltip.add(entry.getSecond() + .getHoverName() + .copy() + .append(" x") + .append(String.valueOf(entry.getFirst())) + .withStyle(ChatFormatting.GRAY)); + } + } + + private static void addBEtag(PackageOrder order, String address, CompoundTag tag) { + CompoundTag teTag = new CompoundTag(); + teTag.put("EncodedRequest", order.write()); + teTag.putString("EncodedAddress", address); + tag.put("BlockEntityTag", teTag); + } + + @Override + public void setPlacedBy(Level pLevel, BlockPos requesterPos, BlockState pState, LivingEntity pPlacer, + ItemStack pStack) { + super.setPlacedBy(pLevel, requesterPos, pState, pPlacer, pStack); + + withBlockEntityDo(pLevel, requesterPos, rrbe -> { + CompoundTag tag = pStack.getTag(); + BlockPos tickerPos = NbtUtils.readBlockPos(tag.getCompound("StockTickerPos")); + String tickerDim = tag.getString("StockTickerDim"); + + rrbe.targetOffset = tickerPos.subtract(requesterPos); + rrbe.targetDim = tickerDim; + rrbe.isValid = tickerPos.closerThan(requesterPos, 128) && tickerDim.equals(pLevel.dimension() + .location() + .toString()); + + if (pPlacer instanceof Player player) + CreateLang + .translate( + rrbe.isValid ? "redstone_requester.keeper_connected" : "redstone_requester.keeper_too_far_away") + .style(rrbe.isValid ? ChatFormatting.WHITE : ChatFormatting.RED) + .sendStatus(player); + }); + + } + + @Override + public List getDrops(BlockState pState, Builder pParams) { + @SuppressWarnings("deprecation") + List drops = super.getDrops(pState, pParams); + BlockEntity blockEntity = pParams.getOptionalParameter(LootContextParams.BLOCK_ENTITY); + if (!(blockEntity instanceof RedstoneRequesterBlockEntity rrbe)) + return drops; + + for (ItemStack itemStack : drops) { + if (!itemStack.is(this.asItem())) + continue; + + CompoundTag tag = itemStack.getOrCreateTag(); + + addBEtag(rrbe.encodedRequest, rrbe.encodedTargetAdress, tag); + tag.put("StockTickerPos", NbtUtils.writeBlockPos(rrbe.getBlockPos() + .offset(rrbe.targetOffset))); + tag.putString("StockTickerDim", rrbe.targetDim); + itemStack.setTag(tag); + } + + return drops; + } + + @Override + public void neighborChanged(BlockState pState, Level pLevel, BlockPos pPos, Block pNeighborBlock, + BlockPos pNeighborPos, boolean pMovedByPiston) { + if (pLevel.isClientSide()) + return; + withBlockEntityDo(pLevel, pPos, RedstoneRequesterBlockEntity::onRedstonePowerChanged); + } + + @Override + public Class getBlockEntityClass() { + return RedstoneRequesterBlockEntity.class; + } + + @Override + public BlockEntityType getBlockEntityType() { + return AllBlockEntityTypes.REDSTONE_REQUESTER.get(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlockEntity.java new file mode 100644 index 0000000000..d66896c6b1 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlockEntity.java @@ -0,0 +1,83 @@ +package com.simibubi.create.content.logistics.redstoneRequester; + +import java.util.List; + +import com.simibubi.create.content.logistics.stockTicker.PackageOrder; +import com.simibubi.create.content.logistics.stockTicker.StockTickerBlockEntity; +import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; +import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; + +public class RedstoneRequesterBlockEntity extends SmartBlockEntity { + + protected PackageOrder encodedRequest; + protected String encodedTargetAdress; + protected boolean redstonePowered; + protected BlockPos targetOffset; + protected String targetDim; + protected boolean isValid; + + public RedstoneRequesterBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { + super(type, pos, state); + encodedRequest = PackageOrder.empty(); + encodedTargetAdress = ""; + targetOffset = BlockPos.ZERO; + targetDim = ""; + } + + @Override + public void addBehaviours(List behaviours) {} + + protected void onRedstonePowerChanged() { + boolean hasNeighborSignal = level.hasNeighborSignal(worldPosition); + if (redstonePowered == hasNeighborSignal) + return; + + if (hasNeighborSignal) + triggerRequest(); + + redstonePowered = hasNeighborSignal; + setChanged(); + } + + private void triggerRequest() { + BlockPos tickerPos = worldPosition.offset(targetOffset); + if (!level.isLoaded(tickerPos)) + return; + BlockEntity blockEntity = level.getBlockEntity(tickerPos); + if (blockEntity instanceof StockTickerBlockEntity stbe) + stbe.broadcastPackageRequest(encodedRequest, null, encodedTargetAdress); + } + + @Override + protected void read(CompoundTag tag, boolean clientPacket) { + super.read(tag, clientPacket); + redstonePowered = tag.getBoolean("Powered"); + targetOffset = NbtUtils.readBlockPos(tag.getCompound("TargetOffset")); + targetDim = tag.getString("TargetDim"); + isValid = tag.getBoolean("Valid"); + + encodedTargetAdress = tag.getString("EncodedAddress"); + encodedRequest = PackageOrder.read(tag.getCompound("EncodedRequest")); + } + + @Override + protected void write(CompoundTag tag, boolean clientPacket) { + super.write(tag, clientPacket); + tag.putBoolean("Powered", redstonePowered); + tag.put("TargetOffset", NbtUtils.writeBlockPos(targetOffset)); + tag.putString("TargetDim", targetDim); + tag.putBoolean("Valid", isValid); + + tag.putString("EncodedAddress", encodedTargetAdress); + tag.put("EncodedRequest", encodedRequest.write()); + + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrder.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrder.java index 43fd4b5773..3f11e5b132 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrder.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrder.java @@ -26,6 +26,14 @@ public record PackageOrder(List> stacks) { tag.put("Entries", list); return tag; } + + public static PackageOrder empty() { + return new PackageOrder(List.of()); + } + + public boolean isEmpty() { + return stacks.isEmpty(); + } public static PackageOrder read(CompoundTag tag) { List> stacks = new ArrayList<>(); diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrderRequestPacket.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrderRequestPacket.java index 43929f2591..7e89b4a29f 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrderRequestPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrderRequestPacket.java @@ -1,5 +1,6 @@ package com.simibubi.create.content.logistics.stockTicker; +import com.simibubi.create.content.logistics.redstoneRequester.RedstoneRequesterBlock; import com.simibubi.create.foundation.networking.BlockEntityConfigurationPacket; import net.minecraft.core.BlockPos; @@ -10,11 +11,13 @@ public class PackageOrderRequestPacket extends BlockEntityConfigurationPacket(); - for (IntAttached intAttached : blockEntity.restockAmounts) + for (IntAttached intAttached : currentStacks()) modifiedAmounts.add(intAttached.getFirst()); } @@ -73,7 +72,7 @@ public class StockTickerAutoRequestScreen extends AbstractSimiScreen { if (button == takeSnapshotButton) { AllPackets.getChannel() .sendToServer( - new StockTickerConfigurationPacket(blockEntity.getBlockPos(), true, "", Collections.emptyList())); + new StockTickerConfigurationPacket(blockEntity.getBlockPos(), true, "", PackageOrder.empty())); modifiedAmounts = null; } } @@ -81,8 +80,8 @@ public class StockTickerAutoRequestScreen extends AbstractSimiScreen { @Override public void removed() { if (modifiedAmounts != null) - for (int i = 0; i < blockEntity.restockAmounts.size(); i++) - blockEntity.restockAmounts.get(i) + for (int i = 0; i < currentStacks().size(); i++) + currentStacks().get(i) .setFirst(modifiedAmounts.get(i)); AllPackets.getChannel() .sendToServer(new StockTickerConfigurationPacket(blockEntity.getBlockPos(), false, addressBox.getValue(), @@ -97,7 +96,7 @@ public class StockTickerAutoRequestScreen extends AbstractSimiScreen { @Override protected void renderWindow(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { - if (modifiedAmounts != null && blockEntity.restockAmounts.size() != modifiedAmounts.size()) + if (modifiedAmounts != null && currentStacks().size() != modifiedAmounts.size()) resetAmounts(); Color color = new Color(255, 255, 255, 50); @@ -116,13 +115,13 @@ public class StockTickerAutoRequestScreen extends AbstractSimiScreen { graphics.drawString(font, Components.literal("Target Amounts:"), guiLeft, guiTop, 0x88dddddd); PoseStack ms = graphics.pose(); - for (int i = 0; i < blockEntity.restockAmounts.size(); i++) { - IntAttached entry = blockEntity.restockAmounts.get(i); + for (int i = 0; i < currentStacks().size(); i++) { + IntAttached entry = currentStacks().get(i); ms.pushPose(); ms.translate(guiLeft + i % cols * colWidth, guiTop + 20 + i / cols * rowHeight, 200); - int customCount = modifiedAmounts == null ? blockEntity.restockAmounts.get(i) + int customCount = modifiedAmounts == null ? currentStacks().get(i) .getFirst() : modifiedAmounts.get(i); drawItemCount(graphics, customCount, customCount); ms.translate(0, 0, -200); @@ -138,15 +137,19 @@ public class StockTickerAutoRequestScreen extends AbstractSimiScreen { } if (hoveredSlot != -1) - graphics.renderTooltip(font, blockEntity.restockAmounts.get(hoveredSlot) + graphics.renderTooltip(font, currentStacks().get(hoveredSlot) .getValue(), mouseX, mouseY); } + private List> currentStacks() { + return blockEntity.restockAmounts.stacks(); + } + private int getHoveredSlot(int mouseX, int mouseY) { if (mouseY < guiTop + 20 || mouseY > guiTop + 20 + rowHeight) return -1; int slot = (mouseX - guiLeft) / colWidth; - if (slot >= blockEntity.restockAmounts.size()) + if (slot >= currentStacks().size()) return -1; return Math.max(-1, slot); } diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java index 60f9b3c8a1..fa9a7b37af 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java @@ -13,11 +13,9 @@ import com.simibubi.create.foundation.blockEntity.behaviour.inventory.InvManipul import net.createmod.catnip.utility.BlockFace; import net.createmod.catnip.utility.IntAttached; -import net.createmod.catnip.utility.NBTHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.Tag; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; @@ -33,7 +31,7 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity { // Auto-restock Feature protected InvManipulationBehaviour observedInventory; - protected List> restockAmounts; + protected PackageOrder restockAmounts; protected String restockAddress; protected boolean powered; @@ -41,7 +39,7 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity { super(type, pos, state); previouslyUsedAddress = ""; restockAddress = ""; - restockAmounts = new ArrayList<>(); + restockAmounts = PackageOrder.empty(); } @Override @@ -75,8 +73,7 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity { protected void write(CompoundTag tag, boolean clientPacket) { super.write(tag, clientPacket); tag.putString("PreviousAddress", previouslyUsedAddress); - tag.put("RestockAmounts", - NBTHelper.writeCompoundList(restockAmounts, ia -> ia.serializeNBT(ItemStack::serializeNBT))); + tag.put("RestockAmounts", restockAmounts.write()); tag.putString("RestockAddress", restockAddress); tag.putBoolean("Powered", powered); @@ -88,8 +85,7 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity { protected void read(CompoundTag tag, boolean clientPacket) { super.read(tag, clientPacket); previouslyUsedAddress = tag.getString("PreviousAddress"); - restockAmounts = NBTHelper.readCompoundList(tag.getList("RestockAmounts", Tag.TAG_COMPOUND), - c -> IntAttached.read(c, ItemStack::of)); + restockAmounts = PackageOrder.read(tag.getCompound("RestockAmounts")); restockAddress = tag.getString("RestockAddress"); powered = tag.getBoolean("Powered"); @@ -98,13 +94,14 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity { } protected void takeInventoryStockSnapshot() { - restockAmounts = new ArrayList<>(); + restockAmounts = PackageOrder.empty(); IItemHandler inventory = observedInventory.getInventory(); if (inventory == null) return; - restockAmounts = summariseObservedInventory().getStacksByCount(); - if (restockAmounts.size() > 8) - restockAmounts.subList(8, restockAmounts.size()) + restockAmounts = new PackageOrder(summariseObservedInventory().getStacksByCount()); + List> stacks = restockAmounts.stacks(); + if (stacks.size() > 8) + stacks.subList(8, stacks.size()) .clear(); notifyUpdate(); } @@ -137,7 +134,7 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity { InventorySummary presentStock = summariseObservedInventory(); List> missingItems = new ArrayList<>(); - for (IntAttached required : restockAmounts) { + for (IntAttached required : restockAmounts.stacks()) { int diff = required.getFirst() - presentStock.getCountOf(required.getValue()); if (diff > 0) missingItems.add(IntAttached.with(diff, required.getValue())); @@ -149,7 +146,7 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity { broadcastPackageRequest(new PackageOrder(missingItems), observedInventory.getInventory(), restockAddress); } - protected void updateAutoRestockSettings(String address, List> amounts) { + protected void updateAutoRestockSettings(String address, PackageOrder amounts) { restockAmounts = amounts; restockAddress = address; notifyUpdate(); diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerConfigurationPacket.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerConfigurationPacket.java index 60b72454a3..ed7316b33d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerConfigurationPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerConfigurationPacket.java @@ -1,23 +1,17 @@ package com.simibubi.create.content.logistics.stockTicker; -import java.util.ArrayList; -import java.util.List; - import com.simibubi.create.foundation.networking.BlockEntityConfigurationPacket; -import net.createmod.catnip.utility.IntAttached; import net.minecraft.core.BlockPos; import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.world.item.ItemStack; public class StockTickerConfigurationPacket extends BlockEntityConfigurationPacket { private boolean takeSnapshot; private String address; - private List> amounts; + private PackageOrder amounts; - public StockTickerConfigurationPacket(BlockPos pos, boolean takeSnapshot, String address, - List> amounts) { + public StockTickerConfigurationPacket(BlockPos pos, boolean takeSnapshot, String address, PackageOrder amounts) { super(pos); this.takeSnapshot = takeSnapshot; this.address = address; @@ -32,21 +26,14 @@ public class StockTickerConfigurationPacket extends BlockEntityConfigurationPack protected void writeSettings(FriendlyByteBuf buffer) { buffer.writeBoolean(takeSnapshot); buffer.writeUtf(address); - buffer.writeVarInt(amounts.size()); - for (IntAttached intAttached : amounts) { - buffer.writeVarInt(intAttached.getFirst()); - buffer.writeItem(intAttached.getValue()); - } + amounts.write(buffer); } @Override protected void readSettings(FriendlyByteBuf buffer) { takeSnapshot = buffer.readBoolean(); address = buffer.readUtf(); - int items = buffer.readVarInt(); - amounts = new ArrayList<>(); - for (int i = 0; i < items; i++) - amounts.add(IntAttached.with(buffer.readVarInt(), buffer.readItem())); + amounts = PackageOrder.read(buffer); } @Override @@ -55,7 +42,7 @@ public class StockTickerConfigurationPacket extends BlockEntityConfigurationPack be.takeInventoryStockSnapshot(); return; } - + be.updateAutoRestockSettings(address, amounts); } diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java index 1cbbaed166..e98e5f5799 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java @@ -1,5 +1,6 @@ package com.simibubi.create.content.logistics.stockTicker; +import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.actors.seat.SeatEntity; import net.createmod.catnip.gui.ScreenOpener; @@ -58,7 +59,8 @@ public class StockTickerInteractionHandler { final BlockPos posForUI = targetPos; if (level.isClientSide()) - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> displayScreen(posForUI)); + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, + () -> () -> displayScreen(posForUI, AllBlocks.REDSTONE_REQUESTER.isIn(player.getMainHandItem()))); event.setCancellationResult(InteractionResult.SUCCESS); event.setCanceled(true); @@ -66,9 +68,9 @@ public class StockTickerInteractionHandler { } @OnlyIn(Dist.CLIENT) - private static void displayScreen(BlockPos tickerPos) { + private static void displayScreen(BlockPos tickerPos, boolean encodeRequester) { if (Minecraft.getInstance().level.getBlockEntity(tickerPos) instanceof StockTickerBlockEntity be) - ScreenOpener.open(new StockTickerRequestScreen(be)); + ScreenOpener.open(new StockTickerRequestScreen(be, encodeRequester)); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java index 16f6e1203e..fe3a8c4b01 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java @@ -58,10 +58,13 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { List> displayedItems; List> itemsToOrder; - public StockTickerRequestScreen(StockTickerBlockEntity be) { + boolean encodeRequester; // Redstone requesters + + public StockTickerRequestScreen(StockTickerBlockEntity be, boolean encodeRequester) { super(be.getBlockState() .getBlock() .getName()); + this.encodeRequester = encodeRequester; displayedItems = new ArrayList<>(); itemsToOrder = new ArrayList<>(); blockEntity = be; @@ -220,9 +223,10 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { // Render static item icons ms.pushPose(); - ms.translate(itemsX + cols * colWidth + 3, orderY - 8, 0); - ms.scale(2f, 2f, 2f); - GuiGameElement.of(AllItems.CARDBOARD_PACKAGE_10x12.asStack()) + ms.translate(itemsX + cols * colWidth + 8, orderY - 4, 0); + ms.scale(1.5f, 1.5f, 1.5f); + GuiGameElement + .of(encodeRequester ? AllBlocks.REDSTONE_REQUESTER.asStack() : AllItems.CARDBOARD_PACKAGE_10x12.asStack()) .render(graphics); ms.popPose(); @@ -434,7 +438,9 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { int color = inactive ? defaultColor.darker() .getRGB() : hovered ? 0xeeffffff : 0x99ffffff; graphics.renderOutline(confirmX, confirmY, confirmW, confirmH, color); - graphics.drawCenteredString(font, CreateLang.translateDirect("gui.stock_ticker.confirm_order"), + graphics.drawCenteredString(font, + CreateLang.translateDirect( + encodeRequester ? "gui.stock_ticker.program_requester" : "gui.stock_ticker.confirm_order"), confirmX + (confirmW / 2), confirmY + 4, color); } @@ -575,7 +581,7 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { public void removed() { AllPackets.getChannel() .sendToServer(new PackageOrderRequestPacket(blockEntity.getBlockPos(), - new PackageOrder(Collections.emptyList()), addressBox.getValue())); + new PackageOrder(Collections.emptyList()), addressBox.getValue(), false)); super.removed(); } @@ -586,11 +592,14 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { AllPackets.getChannel() .sendToServer(new PackageOrderRequestPacket(blockEntity.getBlockPos(), new PackageOrder(itemsToOrder), - addressBox.getValue())); + addressBox.getValue(), encodeRequester)); itemsToOrder = new ArrayList<>(); ticksSinceLastUpdate = 10; successTicks = 1; + + if (encodeRequester) + minecraft.setScreen(null); } @Override diff --git a/src/main/resources/assets/create/lang/default/interface.json b/src/main/resources/assets/create/lang/default/interface.json index f2c29319a7..8c3f03c827 100644 --- a/src/main/resources/assets/create/lang/default/interface.json +++ b/src/main/resources/assets/create/lang/default/interface.json @@ -317,6 +317,10 @@ "create.gui.stock_ticker.package_adress": "Package Address", "create.gui.stock_ticker.confirm_order": "Confirm Order", "create.gui.stock_ticker.request_sent": "Request Sent!", + "create.gui.stock_ticker.program_requester": "Program Requester", + + "create.redstone_requester.keeper_connected": "Connected to Stock keeper successfully", + "create.redstone_requester.keeper_too_far_away": "Requester too far away from Stock keeper", "create.clipboard.actions": "Clipboard Actions", "create.clipboard.to_copy": "%1$s to Copy settings", diff --git a/src/main/resources/assets/create/models/block/redstone_requester.json b/src/main/resources/assets/create/models/block/redstone_requester.json new file mode 100644 index 0000000000..da6f8d69fe --- /dev/null +++ b/src/main/resources/assets/create/models/block/redstone_requester.json @@ -0,0 +1,47 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "0": "block/note_block", + "1": "create:block/packager_block_defrag", + "2": "create:block/andesite_casing", + "particle": "block/note_block" + }, + "elements": [ + { + "from": [0, 0, 0], + "to": [16, 3, 16], + "faces": { + "north": {"uv": [8, 6.5, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6.5, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6.5, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6.5, 16, 8], "texture": "#1"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#2"} + } + }, + { + "from": [0, 14, 0], + "to": [16, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 14, 0]}, + "faces": { + "north": {"uv": [0, 0, 8, 1], "texture": "#1"}, + "east": {"uv": [0, 0, 8, 1], "texture": "#1"}, + "south": {"uv": [0, 0, 8, 1], "texture": "#1"}, + "west": {"uv": [0, 0, 8, 1], "texture": "#1"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#2"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#missing"} + } + }, + { + "from": [0, 3, 0], + "to": [16, 14, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 2, 0]}, + "faces": { + "north": {"uv": [0, 1, 16, 12], "texture": "#0"}, + "east": {"uv": [0, 1, 16, 12], "texture": "#0"}, + "south": {"uv": [0, 1, 16, 12], "texture": "#0"}, + "west": {"uv": [0, 1, 16, 12], "texture": "#0"} + } + } + ] +} \ No newline at end of file From 6e8afbaee28a335b935083a87d7fae639a50231e Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Tue, 17 Sep 2024 23:35:16 +0200 Subject: [PATCH 046/515] Fresh old switch - Threshold switch no longer measures in percentages - Threshold switches can now read from stock tickers - Added a ponder category for its supported blocks --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 6 +- .../resources/assets/create/lang/en_ud.json | 14 +- .../resources/assets/create/lang/en_us.json | 14 +- .../compat/storageDrawers/StorageDrawers.java | 29 +- .../pulley/PulleyBlockEntity.java | 35 ++- .../logistics/packager/InventorySummary.java | 24 +- .../source/FillLevelDisplaySource.java | 3 +- .../ConfigureThresholdSwitchPacket.java | 14 +- .../ThresholdSwitchBlockEntity.java | 146 +++++++--- .../ThresholdSwitchObservable.java | 10 +- .../ThresholdSwitchScreen.java | 275 ++++++++++++++---- .../create/foundation/gui/AllGuiTextures.java | 10 +- .../ponder/AllCreatePonderTags.java | 19 +- .../assets/create/lang/default/interface.json | 12 +- .../assets/create/textures/gui/logistics.png | Bin 1219 -> 0 bytes .../create/textures/gui/threshold_switch.png | Bin 0 -> 1482 bytes 16 files changed, 470 insertions(+), 141 deletions(-) delete mode 100644 src/main/resources/assets/create/textures/gui/logistics.png create mode 100644 src/main/resources/assets/create/textures/gui/threshold_switch.png diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 15fcde1fff..d1665d4038 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-09-16T12:31:12.076124 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-09-17T22:58:36.8292659 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -592,8 +592,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -0dd3aed78418732043d0f968962a386fc3418d27 assets/create/lang/en_ud.json -13509f1058315bd8fdd9fdf8d4dd988e66eeac74 assets/create/lang/en_us.json +fd2ddc392a777f4a6861cf0fc117f9e28996ce66 assets/create/lang/en_ud.json +6ede0f428e202dfe865afd3e637e2b22d169a69d assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 54ccc36da0..2ff4397c3a 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -1220,10 +1220,18 @@ "create.gui.terrainzapper.tool.overlay": "ʎɐןɹǝʌO", "create.gui.terrainzapper.tool.place": "ǝɔɐןԀ", "create.gui.terrainzapper.tool.replace": "ǝɔɐןdǝᴚ", + "create.gui.threshold_switch.currently": "%1$s ʎןʇuǝɹɹnƆ", + "create.gui.threshold_switch.incompatible": "ʞɔoןq ǝןqıʇɐdɯoɔuI", "create.gui.threshold_switch.invert_signal": "ןɐubıS ʇɹǝʌuI", - "create.gui.threshold_switch.move_to_lower_at": "%1$s%% ʇɐ ǝuɐן ɹǝʍoן oʇ ǝʌoW", - "create.gui.threshold_switch.move_to_upper_at": "%1$s%% ʇɐ ǝuɐן ɹǝddn oʇ ǝʌoW", + "create.gui.threshold_switch.lower_threshold": ":ʍoןǝq ɹo ʇɐ˙˙˙", + "create.gui.threshold_switch.not_attached": "ʞɔoןq ɐ oʇ pǝɥɔɐʇʇɐ ʇoN", + "create.gui.threshold_switch.power_off_when": "˙˙˙uǝɥʍ ɟɟo ɹǝʍoԀ", + "create.gui.threshold_switch.power_on_when": "˙˙˙uǝɥʍ uo ɹǝʍoԀ", + "create.gui.threshold_switch.pulley_y_level": "ʎ%1$s", + "create.gui.threshold_switch.range": ")%2$s oʇ %1$s(", + "create.gui.threshold_switch.range_max": ")%1$s ˙xɐɯ(", "create.gui.threshold_switch.title": "ɥɔʇıʍS pןoɥsǝɹɥ⟘", + "create.gui.threshold_switch.upper_threshold": ":ǝʌoqɐ ɹo ʇɐ˙˙˙", "create.gui.toolmenu.cycle": "ǝןɔʎƆ oʇ ]ꞀꞀOᴚƆS[", "create.gui.toolmenu.focusKey": "snɔoℲ oʇ ]%1$s[ pןoH", "create.gui.value_settings.hold_to_edit": "ʇıpǝ oʇ pןoɥ puɐ ʞɔıןƆ", @@ -2120,6 +2128,8 @@ "create.ponder.tag.recently_updated.description": "ǝʇɐǝɹƆ ɟo suoısɹǝʌ ʇsǝʇɐן ǝɥʇ uı ʎןʇuɐɔıɟıubıs pǝbuɐɥɔ ɹo pǝppɐ uǝǝq ǝʌɐɥ ʇɐɥʇ sʇuǝuodɯoƆ", "create.ponder.tag.redstone": "sʇuǝuodɯoƆ ɔıboꞀ", "create.ponder.tag.redstone.description": "buıɹǝǝuıbuǝ ǝuoʇspǝɹ ɥʇıʍ dןǝɥ ɥɔıɥʍ sʇuǝuodɯoƆ", + "create.ponder.tag.threshold_switch_targets": "sǝɥɔʇıʍS pןoɥsǝɹɥ⟘ ɹoɟ sʇǝbɹɐ⟘", + "create.ponder.tag.threshold_switch_targets.description": "˙sɹǝuıɐʇuoɔ pınןɟ puɐ ɯǝʇı ʇsoɯ sɐ ןןǝʍ sɐ 'sʞɔoןq ǝsǝɥʇ ɯoɹɟ pɐǝɹ uɐɔ sǝɥɔʇıʍS pןoɥsǝɹɥ⟘", "create.ponder.tag.train_related": "ʇuǝɯdınbƎ ʎɐʍןıɐᴚ", "create.ponder.tag.train_related.description": "suoıʇdɐɹʇuoƆ uıɐɹ⟘ ɟo ʇuǝɯǝbɐuɐɯ ɹo uoıʇɔnɹʇsuoɔ ǝɥʇ uı pǝsn sʇuǝuodɯoƆ", "create.ponder.tag.windmill_sails": "sbuıɹɐǝᗺ ןןıɯpuıM ɹoɟ sןıɐS", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 0a2e795f11..f8f28b8d29 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1220,10 +1220,18 @@ "create.gui.terrainzapper.tool.overlay": "Overlay", "create.gui.terrainzapper.tool.place": "Place", "create.gui.terrainzapper.tool.replace": "Replace", + "create.gui.threshold_switch.currently": "Currently %1$s", + "create.gui.threshold_switch.incompatible": "Incompatible block", "create.gui.threshold_switch.invert_signal": "Invert Signal", - "create.gui.threshold_switch.move_to_lower_at": "Move to lower lane at %1$s%%", - "create.gui.threshold_switch.move_to_upper_at": "Move to upper lane at %1$s%%", + "create.gui.threshold_switch.lower_threshold": "...at or below:", + "create.gui.threshold_switch.not_attached": "Not attached to a block", + "create.gui.threshold_switch.power_off_when": "Power off when...", + "create.gui.threshold_switch.power_on_when": "Power on when...", + "create.gui.threshold_switch.pulley_y_level": "%1$sy", + "create.gui.threshold_switch.range": "(%1$s to %2$s)", + "create.gui.threshold_switch.range_max": "(max. %1$s)", "create.gui.threshold_switch.title": "Threshold Switch", + "create.gui.threshold_switch.upper_threshold": "...at or above:", "create.gui.toolmenu.cycle": "[SCROLL] to Cycle", "create.gui.toolmenu.focusKey": "Hold [%1$s] to Focus", "create.gui.value_settings.hold_to_edit": "Click and hold to edit", @@ -2120,6 +2128,8 @@ "create.ponder.tag.recently_updated.description": "Components that have been added or changed significantly in the latest versions of Create", "create.ponder.tag.redstone": "Logic Components", "create.ponder.tag.redstone.description": "Components which help with redstone engineering", + "create.ponder.tag.threshold_switch_targets": "Targets for Threshold Switches", + "create.ponder.tag.threshold_switch_targets.description": "Threshold Switches can read from these blocks, as well as most item and fluid containers.", "create.ponder.tag.train_related": "Railway Equipment", "create.ponder.tag.train_related.description": "Components used in the construction or management of Train Contraptions", "create.ponder.tag.windmill_sails": "Sails for Windmill Bearings", diff --git a/src/main/java/com/simibubi/create/compat/storageDrawers/StorageDrawers.java b/src/main/java/com/simibubi/create/compat/storageDrawers/StorageDrawers.java index b35aaa2470..511c8240cd 100644 --- a/src/main/java/com/simibubi/create/compat/storageDrawers/StorageDrawers.java +++ b/src/main/java/com/simibubi/create/compat/storageDrawers/StorageDrawers.java @@ -11,27 +11,30 @@ import net.minecraftforge.items.IItemHandler; public class StorageDrawers { public static boolean isDrawer(BlockEntity be) { - return be != null && Mods.STORAGEDRAWERS.id().equals( - CatnipServices.REGISTRIES.getKeyOrThrow(be.getType()).getNamespace()); + return be != null && Mods.STORAGEDRAWERS.id() + .equals(CatnipServices.REGISTRIES.getKeyOrThrow(be.getType()) + .getNamespace()); } - public static float getTrueFillLevel(IItemHandler inv, FilteringBehaviour filtering) { - float occupied = 0; - float totalSpace = 0; + public static int getTotalStorageSpace(IItemHandler inv) { + int totalSpace = 0; + for (int slot = 1; slot < inv.getSlots(); slot++) + totalSpace += inv.getSlotLimit(slot); + return totalSpace; + } + public static int getItemCount(IItemHandler inv, FilteringBehaviour filtering) { + int occupied = 0; for (int slot = 1; slot < inv.getSlots(); slot++) { ItemStack stackInSlot = inv.getStackInSlot(slot); int space = inv.getSlotLimit(slot); int count = stackInSlot.getCount(); - if (space == 0) continue; - - totalSpace += 1; - if (filtering.test(stackInSlot)) occupied += count * (1f / space); + if (space == 0) + continue; + if (filtering.test(stackInSlot)) + occupied += count; } - - if (totalSpace == 0) return 0; - - return occupied / totalSpace; + return occupied; } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/pulley/PulleyBlockEntity.java b/src/main/java/com/simibubi/create/content/contraptions/pulley/PulleyBlockEntity.java index 43501c4043..4caa53dd5d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/pulley/PulleyBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/pulley/PulleyBlockEntity.java @@ -18,6 +18,7 @@ import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import com.simibubi.create.foundation.blockEntity.behaviour.CenteredSideValueBoxTransform; import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform; +import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.infrastructure.config.AllConfigs; import net.createmod.catnip.utility.NBTHelper; @@ -26,6 +27,7 @@ import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; import net.minecraft.nbt.Tag; +import net.minecraft.network.chat.MutableComponent; import net.minecraft.util.Mth; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; @@ -371,16 +373,31 @@ public class PulleyBlockEntity extends LinearActuatorBlockEntity implements Thre public void animateOffset(float forcedOffset) { offset = forcedOffset; } - - @Override - public float getPercent() { - int distance = worldPosition.getY() - level.getMinBuildHeight(); - if (distance <= 0) - return 100; - return 100 * getInterpolatedOffset(.5f) / distance; - } - + public BlockPos getMirrorParent() { return mirrorParent; } + + // Threshold switch + + @Override + public int getCurrentValue() { + return worldPosition.getY() - (int) getInterpolatedOffset(.5f); + } + + @Override + public int getMinValue() { + return level.getMinBuildHeight(); + } + + @Override + public int getMaxValue() { + return worldPosition.getY(); + } + + @Override + public MutableComponent format(int value) { + return CreateLang.translateDirect("gui.threshold_switch.pulley_y_level", value); + } + } diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/InventorySummary.java b/src/main/java/com/simibubi/create/content/logistics/packager/InventorySummary.java index 2412548a5f..5243833a11 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/InventorySummary.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/InventorySummary.java @@ -5,6 +5,9 @@ import java.util.Collections; import java.util.IdentityHashMap; import java.util.List; import java.util.Map; +import java.util.function.Predicate; + +import org.apache.commons.lang3.mutable.MutableInt; import com.google.common.collect.Lists; import com.simibubi.create.AllPackets; @@ -25,6 +28,7 @@ public class InventorySummary { private Map>> items = new IdentityHashMap<>(); private List> stacksByCount; + private int totalCount; public void add(InventorySummary summary) { summary.items.forEach((i, list) -> list.forEach(this::add)); @@ -42,6 +46,8 @@ public class InventorySummary { if (count == 0 || stack.isEmpty()) return; + totalCount += count; + List> stacks = items.computeIfAbsent(stack.getItem(), $ -> Lists.newArrayList()); for (IntAttached existing : stacks) { ItemStack existingStack = existing.getSecond(); @@ -54,7 +60,7 @@ public class InventorySummary { IntAttached newEntry = IntAttached.with(count, stack); stacks.add(newEntry); } - + public int getCountOf(ItemStack stack) { List> list = items.get(stack.getItem()); if (list == null) @@ -65,6 +71,16 @@ public class InventorySummary { return 0; } + public int getTotalOfMatching(Predicate filter) { + MutableInt sum = new MutableInt(); + items.forEach(($, list) -> { + for (IntAttached entry : list) + if (filter.test(entry.getSecond())) + sum.add(entry.getFirst()); + }); + return sum.getValue(); + } + public List> getStacksByCount() { if (stacksByCount == null) { stacksByCount = new ArrayList<>(); @@ -73,11 +89,15 @@ public class InventorySummary { } return stacksByCount; } + + public int getTotalCount() { + return totalCount; + } public void divideAndSendTo(ServerPlayer player, BlockPos pos) { List> stacks = getStacksByCount(); int remaining = stacks.size(); - + List> currentList = null; PacketTarget target = PacketDistributor.PLAYER.with(() -> player); diff --git a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/FillLevelDisplaySource.java b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/FillLevelDisplaySource.java index 96b8777de0..e02c865dfa 100644 --- a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/FillLevelDisplaySource.java +++ b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/FillLevelDisplaySource.java @@ -16,7 +16,8 @@ public class FillLevelDisplaySource extends PercentOrProgressBarDisplaySource { BlockEntity be = context.getSourceBlockEntity(); if (!(be instanceof ThresholdSwitchBlockEntity tsbe)) return null; - return tsbe.currentLevel; + return Math.max(0, + (float) (tsbe.currentLevel - tsbe.currentMinLevel) / (tsbe.currentMaxLevel - tsbe.currentMinLevel)); } @Override diff --git a/src/main/java/com/simibubi/create/content/redstone/thresholdSwitch/ConfigureThresholdSwitchPacket.java b/src/main/java/com/simibubi/create/content/redstone/thresholdSwitch/ConfigureThresholdSwitchPacket.java index 235023c7d9..5165578b4f 100644 --- a/src/main/java/com/simibubi/create/content/redstone/thresholdSwitch/ConfigureThresholdSwitchPacket.java +++ b/src/main/java/com/simibubi/create/content/redstone/thresholdSwitch/ConfigureThresholdSwitchPacket.java @@ -7,11 +7,11 @@ import net.minecraft.network.FriendlyByteBuf; public class ConfigureThresholdSwitchPacket extends BlockEntityConfigurationPacket { - private float offBelow; - private float onAbove; + private int offBelow; + private int onAbove; private boolean invert; - public ConfigureThresholdSwitchPacket(BlockPos pos, float offBelow, float onAbove, boolean invert) { + public ConfigureThresholdSwitchPacket(BlockPos pos, int offBelow, int onAbove, boolean invert) { super(pos); this.offBelow = offBelow; this.onAbove = onAbove; @@ -24,15 +24,15 @@ public class ConfigureThresholdSwitchPacket extends BlockEntityConfigurationPack @Override protected void readSettings(FriendlyByteBuf buffer) { - offBelow = buffer.readFloat(); - onAbove = buffer.readFloat(); + offBelow = buffer.readInt(); + onAbove = buffer.readInt(); invert = buffer.readBoolean(); } @Override protected void writeSettings(FriendlyByteBuf buffer) { - buffer.writeFloat(offBelow); - buffer.writeFloat(onAbove); + buffer.writeInt(offBelow); + buffer.writeInt(onAbove); buffer.writeBoolean(invert); } diff --git a/src/main/java/com/simibubi/create/content/redstone/thresholdSwitch/ThresholdSwitchBlockEntity.java b/src/main/java/com/simibubi/create/content/redstone/thresholdSwitch/ThresholdSwitchBlockEntity.java index 8784ec74e9..1cad880bce 100644 --- a/src/main/java/com/simibubi/create/content/redstone/thresholdSwitch/ThresholdSwitchBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/redstone/thresholdSwitch/ThresholdSwitchBlockEntity.java @@ -3,6 +3,9 @@ package com.simibubi.create.content.redstone.thresholdSwitch; import java.util.List; import com.simibubi.create.compat.storageDrawers.StorageDrawers; +import com.simibubi.create.content.logistics.filter.FilterItem; +import com.simibubi.create.content.logistics.packager.InventorySummary; +import com.simibubi.create.content.logistics.stockTicker.StockTickerBlockEntity; import com.simibubi.create.content.redstone.DirectedDirectionalBlock; import com.simibubi.create.content.redstone.FilteredDetectorFilterSlot; import com.simibubi.create.content.redstone.displayLink.DisplayLinkBlock; @@ -13,10 +16,12 @@ import com.simibubi.create.foundation.blockEntity.behaviour.inventory.CapManipul import com.simibubi.create.foundation.blockEntity.behaviour.inventory.InvManipulationBehaviour; import com.simibubi.create.foundation.blockEntity.behaviour.inventory.TankManipulationBehaviour; import com.simibubi.create.foundation.blockEntity.behaviour.inventory.VersionedInventoryTrackerBehaviour; +import com.simibubi.create.foundation.utility.CreateLang; import net.createmod.catnip.utility.BlockFace; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.MutableComponent; import net.minecraft.util.Mth; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Block; @@ -30,9 +35,13 @@ import net.minecraftforge.items.IItemHandler; public class ThresholdSwitchBlockEntity extends SmartBlockEntity { - public float onWhenAbove; - public float offWhenBelow; - public float currentLevel; + public int onWhenAbove; + public int offWhenBelow; + + public int currentMinLevel; + public int currentLevel; + public int currentMaxLevel; + private boolean redstoneState; private boolean inverted; private boolean poweredAfterDelay; @@ -44,8 +53,8 @@ public class ThresholdSwitchBlockEntity extends SmartBlockEntity { public ThresholdSwitchBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); - onWhenAbove = .75f; - offWhenBelow = .25f; + onWhenAbove = 128; + offWhenBelow = 64; currentLevel = -1; redstoneState = false; inverted = false; @@ -55,9 +64,11 @@ public class ThresholdSwitchBlockEntity extends SmartBlockEntity { @Override protected void read(CompoundTag compound, boolean clientPacket) { - onWhenAbove = compound.getFloat("OnAbove"); - offWhenBelow = compound.getFloat("OffBelow"); - currentLevel = compound.getFloat("Current"); + onWhenAbove = compound.getInt("OnAboveAmount"); + offWhenBelow = compound.getInt("OffBelowAmount"); + currentLevel = compound.getInt("CurrentAmount"); + currentMinLevel = compound.getInt("CurrentMinAmount"); + currentMaxLevel = compound.getInt("CurrentMaxAmount"); redstoneState = compound.getBoolean("Powered"); inverted = compound.getBoolean("Inverted"); poweredAfterDelay = compound.getBoolean("PoweredAfterDelay"); @@ -65,15 +76,17 @@ public class ThresholdSwitchBlockEntity extends SmartBlockEntity { } protected void writeCommon(CompoundTag compound) { - compound.putFloat("OnAbove", onWhenAbove); - compound.putFloat("OffBelow", offWhenBelow); + compound.putFloat("OnAboveAmount", onWhenAbove); + compound.putFloat("OffBelowAmount", offWhenBelow); compound.putBoolean("Inverted", inverted); } @Override public void write(CompoundTag compound, boolean clientPacket) { writeCommon(compound); - compound.putFloat("Current", currentLevel); + compound.putInt("CurrentAmount", currentLevel); + compound.putInt("CurrentMinAmount", currentMinLevel); + compound.putInt("CurrentMaxAmount", currentMaxLevel); compound.putBoolean("Powered", redstoneState); compound.putBoolean("PoweredAfterDelay", poweredAfterDelay); super.write(compound, clientPacket); @@ -85,49 +98,76 @@ public class ThresholdSwitchBlockEntity extends SmartBlockEntity { super.writeSafe(compound); } - public float getStockLevel() { + public int getMinLevel() { + return currentMinLevel; + } + + public int getStockLevel() { return currentLevel; } + public int getMaxLevel() { + return currentMaxLevel; + } + public void updateCurrentLevel() { boolean changed = false; - float occupied = 0; - float totalSpace = 0; - float prevLevel = currentLevel; + int prevLevel = currentLevel; + int prevMaxLevel = currentMaxLevel; observedInventory.findNewCapability(); observedTank.findNewCapability(); - BlockPos target = worldPosition.relative(ThresholdSwitchBlock.getTargetDirection(getBlockState())); + BlockPos target = getTargetPos(); BlockEntity targetBlockEntity = level.getBlockEntity(target); if (targetBlockEntity instanceof ThresholdSwitchObservable observable) { - currentLevel = observable.getPercent() / 100f; + currentMinLevel = observable.getMinValue(); + currentLevel = observable.getCurrentValue(); + currentMaxLevel = observable.getMaxValue(); } else if (StorageDrawers.isDrawer(targetBlockEntity) && observedInventory.hasInventory()) { - currentLevel = StorageDrawers.getTrueFillLevel(observedInventory.getInventory(), filtering); + currentMinLevel = 0; + currentLevel = StorageDrawers.getItemCount(observedInventory.getInventory(), filtering); + currentMaxLevel = StorageDrawers.getTotalStorageSpace(observedInventory.getInventory()); + + } else if (targetBlockEntity instanceof StockTickerBlockEntity stockTicker) { + currentMinLevel = 0; + currentMaxLevel = 64000; + InventorySummary recentSummary = stockTicker.getRecentSummary(); + ItemStack filter = filtering.getFilter(); + if (filter.isEmpty()) + currentLevel = recentSummary.getTotalCount(); + else if (filter.getItem() instanceof FilterItem) + currentLevel = recentSummary.getTotalOfMatching(filtering::test); + else + currentLevel = recentSummary.getCountOf(filter); } else if (observedInventory.hasInventory() || observedTank.hasInventory()) { + currentMinLevel = 0; + currentLevel = 0; + currentMaxLevel = 0; + if (observedInventory.hasInventory()) { // Item inventory IItemHandler inv = observedInventory.getInventory(); if (invVersionTracker.stillWaiting(inv)) { - occupied = prevLevel; - totalSpace = 1f; + currentLevel = prevLevel; + currentMaxLevel = prevMaxLevel; } else { invVersionTracker.awaitNewVersion(inv); for (int slot = 0; slot < inv.getSlots(); slot++) { ItemStack stackInSlot = inv.getStackInSlot(slot); - int space = Math.min(stackInSlot.getMaxStackSize(), inv.getSlotLimit(slot)); + int space = inv.getSlotLimit(slot); int count = stackInSlot.getCount(); if (space == 0) continue; - totalSpace += 1; + currentMaxLevel += space; if (filtering.test(stackInSlot)) - occupied += count * (1f / space); + currentLevel += count; } } } @@ -142,18 +182,19 @@ public class ThresholdSwitchBlockEntity extends SmartBlockEntity { if (space == 0) continue; - totalSpace += 1; + currentMaxLevel += space; if (filtering.test(stackInSlot)) - occupied += count * (1f / space); + currentLevel += count; } } - currentLevel = occupied / totalSpace; - } else { // No compatible inventories found + currentMinLevel = -1; + currentMaxLevel = -1; if (currentLevel == -1) return; + level.setBlock(worldPosition, getBlockState().setValue(ThresholdSwitchBlock.LEVEL, 0), 3); currentLevel = -1; redstoneState = false; @@ -162,7 +203,7 @@ public class ThresholdSwitchBlockEntity extends SmartBlockEntity { return; } - currentLevel = Mth.clamp(currentLevel, 0, 1); + currentLevel = Mth.clamp(currentLevel, currentMinLevel, currentMaxLevel); changed = currentLevel != prevLevel; boolean previouslyPowered = redstoneState; @@ -173,8 +214,9 @@ public class ThresholdSwitchBlockEntity extends SmartBlockEntity { boolean update = previouslyPowered != redstoneState; int displayLevel = 0; + float normedLevel = (float) (currentLevel - currentMinLevel) / (currentMaxLevel - currentMinLevel); if (currentLevel > 0) - displayLevel = (int) (1 + currentLevel * 4); + displayLevel = (int) (1 + normedLevel * 4); level.setBlock(worldPosition, getBlockState().setValue(ThresholdSwitchBlock.LEVEL, displayLevel), update ? 3 : 2); @@ -187,6 +229,44 @@ public class ThresholdSwitchBlockEntity extends SmartBlockEntity { } } + private BlockPos getTargetPos() { + return worldPosition.relative(ThresholdSwitchBlock.getTargetDirection(getBlockState())); + } + + public ItemStack getDisplayItemForScreen() { + BlockPos target = getTargetPos(); + return new ItemStack(level.getBlockState(target) + .getBlock()); + } + + public static enum ThresholdType { + UNSUPPORTED, ITEM, FLUID, CUSTOM; + } + + public MutableComponent format(int value, boolean stacks) { + ThresholdType type = getTypeOfCurrentTarget(); + if (type == ThresholdType.CUSTOM) + if (level.getBlockEntity(getTargetPos()) instanceof ThresholdSwitchObservable tso) + return tso.format(value); + + String suffix = type == ThresholdType.ITEM + ? stacks ? "schedule.condition.threshold.stacks" : "schedule.condition.threshold.items" + : "schedule.condition.threshold.buckets"; + return CreateLang.text(value + " ") + .add(CreateLang.translate(suffix)) + .component(); + } + + public ThresholdType getTypeOfCurrentTarget() { + if (observedInventory.hasInventory() || level.getBlockEntity(getTargetPos()) instanceof StockTickerBlockEntity) + return ThresholdType.ITEM; + if (observedTank.hasInventory()) + return ThresholdType.FLUID; + if (level.getBlockEntity(getTargetPos()) instanceof ThresholdSwitchObservable) + return ThresholdType.CUSTOM; + return ThresholdType.UNSUPPORTED; + } + protected void scheduleBlockTick() { Block block = getBlockState().getBlock(); if (!level.getBlockTicks() @@ -204,8 +284,8 @@ public class ThresholdSwitchBlockEntity extends SmartBlockEntity { @Override public void addBehaviours(List behaviours) { - behaviours.add(filtering = new FilteringBehaviour(this, new FilteredDetectorFilterSlot(true)) - .withCallback($ -> { + behaviours + .add(filtering = new FilteringBehaviour(this, new FilteredDetectorFilterSlot(true)).withCallback($ -> { this.updateCurrentLevel(); invVersionTracker.reset(); })); @@ -219,10 +299,6 @@ public class ThresholdSwitchBlockEntity extends SmartBlockEntity { behaviours.add(observedTank = new TankManipulationBehaviour(this, towardBlockFacing).bypassSidedness()); } - public float getLevelForDisplay() { - return currentLevel == -1 ? 0 : currentLevel; - } - public boolean getState() { return redstoneState; } diff --git a/src/main/java/com/simibubi/create/content/redstone/thresholdSwitch/ThresholdSwitchObservable.java b/src/main/java/com/simibubi/create/content/redstone/thresholdSwitch/ThresholdSwitchObservable.java index 039945c2a6..f304a33672 100644 --- a/src/main/java/com/simibubi/create/content/redstone/thresholdSwitch/ThresholdSwitchObservable.java +++ b/src/main/java/com/simibubi/create/content/redstone/thresholdSwitch/ThresholdSwitchObservable.java @@ -1,7 +1,15 @@ package com.simibubi.create.content.redstone.thresholdSwitch; +import net.minecraft.network.chat.MutableComponent; + public interface ThresholdSwitchObservable { - public float getPercent(); + public int getMaxValue(); + + public int getMinValue(); + + public int getCurrentValue(); + + public MutableComponent format(int value); } diff --git a/src/main/java/com/simibubi/create/content/redstone/thresholdSwitch/ThresholdSwitchScreen.java b/src/main/java/com/simibubi/create/content/redstone/thresholdSwitch/ThresholdSwitchScreen.java index d1acf3219c..8ca7bacbc0 100644 --- a/src/main/java/com/simibubi/create/content/redstone/thresholdSwitch/ThresholdSwitchScreen.java +++ b/src/main/java/com/simibubi/create/content/redstone/thresholdSwitch/ThresholdSwitchScreen.java @@ -1,27 +1,42 @@ package com.simibubi.create.content.redstone.thresholdSwitch; +import java.util.ArrayList; +import java.util.List; + +import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllPackets; +import com.simibubi.create.content.redstone.thresholdSwitch.ThresholdSwitchBlockEntity.ThresholdType; import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.widget.IconButton; import com.simibubi.create.foundation.gui.widget.ScrollInput; +import com.simibubi.create.foundation.gui.widget.SelectionScrollInput; import com.simibubi.create.foundation.utility.CreateLang; +import com.simibubi.create.infrastructure.ponder.AllCreatePonderTags; import net.createmod.catnip.gui.AbstractSimiScreen; +import net.createmod.catnip.gui.ScreenOpener; import net.createmod.catnip.gui.element.GuiGameElement; -import net.createmod.catnip.utility.animation.LerpedFloat; -import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.gui.widget.AbstractSimiWidget; +import net.createmod.catnip.utility.Iterate; import net.createmod.catnip.utility.lang.Components; +import net.createmod.ponder.foundation.ui.PonderTagScreen; +import net.minecraft.ChatFormatting; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.network.chat.Component; +import net.minecraft.util.Mth; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.RedstoneTorchBlock; public class ThresholdSwitchScreen extends AbstractSimiScreen { private ScrollInput offBelow; private ScrollInput onAbove; + private SelectionScrollInput inStacks; + private IconButton confirmButton; private IconButton flipSignals; @@ -32,12 +47,9 @@ public class ThresholdSwitchScreen extends AbstractSimiScreen { private ThresholdSwitchBlockEntity blockEntity; private int lastModification; - private LerpedFloat cursor; - private LerpedFloat cursorLane; - public ThresholdSwitchScreen(ThresholdSwitchBlockEntity be) { super(CreateLang.translateDirect("gui.threshold_switch.title")); - background = AllGuiTextures.STOCKSWITCH; + background = AllGuiTextures.THRESHOLD_SWITCH; this.blockEntity = be; lastModification = -1; } @@ -51,53 +63,71 @@ public class ThresholdSwitchScreen extends AbstractSimiScreen { int x = guiLeft; int y = guiTop; - cursor = LerpedFloat.linear() - .startWithValue(blockEntity.getLevelForDisplay()); - cursorLane = LerpedFloat.linear() - .startWithValue(blockEntity.getState() ? 1 : 0); + inStacks = (SelectionScrollInput) new SelectionScrollInput(x + 100, y + 23, 52, 42) + .forOptions(List.of(CreateLang.translateDirect("schedule.condition.threshold.items"), + CreateLang.translateDirect("schedule.condition.threshold.stacks"))) + .titled(CreateLang.translateDirect("schedule.condition.threshold.item_measure")) + .setState( + blockEntity.getTypeOfCurrentTarget() == ThresholdType.ITEM && blockEntity.onWhenAbove % 64 == 0 ? 1 + : 0); - offBelow = new ScrollInput(x + 36, y + 42, 102, 18).withRange(0, 100) - .titled(Components.empty()) + offBelow = new ScrollInput(x + 48, y + 47, 1, 18) + .withRange(blockEntity.getMinLevel(), blockEntity.getMaxLevel() + 1 - getValueStep()) + .titled(CreateLang.translateDirect("gui.threshold_switch.lower_threshold")) .calling(state -> { lastModification = 0; - offBelow.titled(CreateLang.translateDirect("gui.threshold_switch.move_to_upper_at", state)); - if (onAbove.getState() <= state) { - onAbove.setState(state + 1); + int valueStep = getValueStep(); + if (onAbove.getState() / valueStep <= state / valueStep) { + onAbove.setState((state + valueStep) / valueStep * valueStep); onAbove.onChanged(); } }) - .setState((int) (blockEntity.offWhenBelow * 100)); + .withStepFunction(sc -> sc.shift ? 10 * getValueStep() : getValueStep()) + .setState(blockEntity.offWhenBelow); - onAbove = new ScrollInput(x + 36, y + 20, 102, 18).withRange(1, 101) - .titled(Components.empty()) + onAbove = new ScrollInput(x + 48, y + 23, 1, 18) + .withRange(blockEntity.getMinLevel() + getValueStep(), blockEntity.getMaxLevel() + 1) + .titled(CreateLang.translateDirect("gui.threshold_switch.upper_threshold")) .calling(state -> { lastModification = 0; - onAbove.titled(CreateLang.translateDirect("gui.threshold_switch.move_to_lower_at", state)); - if (offBelow.getState() >= state) { - offBelow.setState(state - 1); + int valueStep = getValueStep(); + if (offBelow.getState() / valueStep >= state / valueStep) { + offBelow.setState((state - valueStep) / valueStep * valueStep); offBelow.onChanged(); } }) - .setState((int) (blockEntity.onWhenAbove * 100)); + .withStepFunction(sc -> sc.shift ? 10 * getValueStep() : getValueStep()) + .setState(blockEntity.onWhenAbove); onAbove.onChanged(); offBelow.onChanged(); addRenderableWidget(onAbove); addRenderableWidget(offBelow); + addRenderableWidget(inStacks); - confirmButton = new IconButton(x + background.getWidth() - 33, y + background.getHeight() - 24, AllIcons.I_CONFIRM); - confirmButton.withCallback(() -> { - onClose(); - }); + confirmButton = + new IconButton(x + background.getWidth() - 33, y + background.getHeight() - 24, AllIcons.I_CONFIRM); + confirmButton.withCallback(() -> onClose()); addRenderableWidget(confirmButton); flipSignals = new IconButton(x + background.getWidth() - 62, y + background.getHeight() - 24, AllIcons.I_FLIP); - flipSignals.withCallback(() -> { - send(!blockEntity.isInverted()); - }); + flipSignals.withCallback(() -> send(!blockEntity.isInverted())); flipSignals.setToolTip(invertSignal); addRenderableWidget(flipSignals); + + updateInputBoxes(); + } + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int pButton) { + int itemX = guiLeft + 13; + int itemY = guiTop + 80; + if (mouseX >= itemX && mouseX < itemX + 16 && mouseY >= itemY && mouseY < itemY + 16) { + ScreenOpener.open(new PonderTagScreen(AllCreatePonderTags.THRESHOLD_SWITCH_TARGETS)); + return true; + } + return super.mouseClicked(mouseX, mouseY, pButton); } @Override @@ -106,48 +136,140 @@ public class ThresholdSwitchScreen extends AbstractSimiScreen { int y = guiTop; background.render(graphics, x, y); + graphics.drawString(font, title, x + background.getWidth() / 2 - font.width(title) / 2, y + 4, 0x592424, false); - AllGuiTextures.STOCKSWITCH_POWERED_LANE.render(graphics, x + 37, y + (blockEntity.isInverted() ? 20 : 42)); - AllGuiTextures.STOCKSWITCH_UNPOWERED_LANE.render(graphics, x + 37, y + (blockEntity.isInverted() ? 42 : 20)); - graphics.drawString(font, title, x + (background.getWidth() - 8) / 2 - font.width(title) / 2, y + 4, 0x592424, false); + ThresholdType typeOfCurrentTarget = blockEntity.getTypeOfCurrentTarget(); + boolean forItems = typeOfCurrentTarget == ThresholdType.ITEM; + AllGuiTextures inputBg = + forItems ? AllGuiTextures.THRESHOLD_SWITCH_ITEMCOUNT_INPUTS : AllGuiTextures.THRESHOLD_SWITCH_MISC_INPUTS; - AllGuiTextures sprite = AllGuiTextures.STOCKSWITCH_INTERVAL; - float lowerBound = offBelow.getState(); - float upperBound = onAbove.getState(); + inputBg.render(graphics, x + 44, y + 21); + inputBg.render(graphics, x + 44, y + 21 + 24); - sprite.bind(); - graphics.blit(sprite.location, (int) (x + upperBound) + 37, y + 20, (int) (sprite.getStartX() + upperBound), sprite.getStartY(), - (int) (sprite.getWidth() - upperBound), sprite.getHeight()); - graphics.blit(sprite.location, x + 37, y + 42, sprite.getStartX(), sprite.getStartY(), (int) (lowerBound), sprite.getHeight()); + int valueStep = 1; + boolean stacks = inStacks.getState() == 1; + if (typeOfCurrentTarget == ThresholdType.FLUID) + valueStep = 1000; - AllGuiTextures.STOCKSWITCH_ARROW_UP.render(graphics, (int) (x + lowerBound + 36) - 2, y + 37); - AllGuiTextures.STOCKSWITCH_ARROW_DOWN.render(graphics, (int) (x + upperBound + 36) - 3, y + 19); + if (forItems) { + Component suffix = + inStacks.getState() == 0 ? CreateLang.translateDirect("schedule.condition.threshold.items") + : CreateLang.translateDirect("schedule.condition.threshold.stacks"); + valueStep = inStacks.getState() == 0 ? 1 : 64; + graphics.drawString(font, suffix, x + 105, y + 28, 0xFFFFFFFF, true); + graphics.drawString(font, suffix, x + 105, y + 28 + 24, 0xFFFFFFFF, true); - if (blockEntity.currentLevel != -1) { - AllGuiTextures cursor = AllGuiTextures.STOCKSWITCH_CURSOR; - PoseStack ms = graphics.pose(); - ms.pushPose(); - ms.translate(Math.min(99, this.cursor.getValue(partialTicks) * sprite.getWidth()), - cursorLane.getValue(partialTicks) * 22, 0); - cursor.render(graphics, x + 34, y + 21); - ms.popPose(); } + graphics.drawString(font, + Components.literal("\u2265 " + (forItems ? onAbove.getState() / valueStep + : blockEntity.format(onAbove.getState() / valueStep, stacks) + .getString())), + x + 53, y + 28, 0xFFFFFFFF, true); + graphics.drawString(font, + Components.literal("\u2264 " + (forItems ? offBelow.getState() / valueStep + : blockEntity.format(offBelow.getState() / valueStep, stacks) + .getString())), + x + 53, y + 28 + 24, 0xFFFFFFFF, true); + GuiGameElement.of(renderedItem).at(x + background.getWidth() + 6, y + background.getHeight() - 56, -200) .scale(5) .render(graphics); + + int itemX = x + 13; + int itemY = y + 80; + + ItemStack displayItem = blockEntity.getDisplayItemForScreen(); + GuiGameElement.of(displayItem).at(itemX, itemY, 0) + .render(graphics); + + int torchX = x + 23; + int torchY = y + 24; + + PoseStack ms = graphics.pose(); + ms.pushPose(); + ms.translate(torchX - 5, torchY + 14, 200); + TransformStack.cast(ms) + .rotateX(-22.5) + .rotateY(45); + + for (boolean power : Iterate.trueAndFalse) { + GuiGameElement.of(Blocks.REDSTONE_TORCH.defaultBlockState() + .setValue(RedstoneTorchBlock.LIT, blockEntity.isInverted() ^ power)) + .scale(20) + .render(graphics); + ms.translate(0, 26, 0); + } + + ms.popPose(); + + if (mouseX >= itemX && mouseX < itemX + 16 && mouseY >= itemY && mouseY < itemY + 16) { + ArrayList list = new ArrayList<>(); + if (displayItem.isEmpty()) { + list.add(CreateLang.translateDirect("gui.threshold_switch.not_attached")); + list.add(CreateLang.translateDirect("display_link.view_compatible") + .withStyle(ChatFormatting.DARK_GRAY)); + graphics.renderComponentTooltip(font, list, mouseX, mouseY); + return; + } + + list.add(displayItem.getHoverName()); + if (typeOfCurrentTarget == ThresholdType.UNSUPPORTED) { + list.add(CreateLang.translateDirect("gui.threshold_switch.incompatible") + .withStyle(ChatFormatting.GRAY)); + list.add(CreateLang.translateDirect("display_link.view_compatible") + .withStyle(ChatFormatting.DARK_GRAY)); + graphics.renderComponentTooltip(font, list, mouseX, mouseY); + return; + } + + CreateLang + .translate("gui.threshold_switch.currently", + blockEntity.format(blockEntity.currentLevel / valueStep, stacks)) + .style(ChatFormatting.DARK_AQUA) + .addTo(list); + + if (blockEntity.currentMinLevel / valueStep == 0) + CreateLang + .translate("gui.threshold_switch.range_max", + blockEntity.format(blockEntity.currentMaxLevel / valueStep, stacks)) + .style(ChatFormatting.GRAY) + .addTo(list); + else + CreateLang + .translate("gui.threshold_switch.range", blockEntity.currentMinLevel / valueStep, + blockEntity.format(blockEntity.currentMaxLevel / valueStep, stacks)) + .style(ChatFormatting.GRAY) + .addTo(list); + + list.add(CreateLang.translateDirect("display_link.view_compatible") + .withStyle(ChatFormatting.DARK_GRAY)); + + graphics.renderComponentTooltip(font, list, mouseX, mouseY); + return; + } + + for (boolean power : Iterate.trueAndFalse) { + int thisTorchY = power ? torchY : torchY + 26; + if (mouseX >= torchX && mouseX < torchX + 16 && mouseY >= thisTorchY && mouseY < thisTorchY + 16) { + graphics.renderComponentTooltip(font, + List.of(CreateLang + .translate(power ^ blockEntity.isInverted() ? "gui.threshold_switch.power_on_when" + : "gui.threshold_switch.power_off_when") + .color(AbstractSimiWidget.HEADER_RGB) + .component()), + mouseX, mouseY); + return; + } + } } @Override public void tick() { super.tick(); - cursor.chase(blockEntity.getLevelForDisplay(), 1 / 4f, Chaser.EXP); - cursor.tickChaser(); - cursorLane.chase(blockEntity.getState() ? 1 : 0, 1 / 4f, Chaser.EXP); - cursorLane.tickChaser(); - if (lastModification >= 0) lastModification++; @@ -155,6 +277,47 @@ public class ThresholdSwitchScreen extends AbstractSimiScreen { lastModification = -1; send(blockEntity.isInverted()); } + + if (inStacks == null) + return; + + updateInputBoxes(); + } + + private void updateInputBoxes() { + boolean forItems = blockEntity.getTypeOfCurrentTarget() == ThresholdType.ITEM; + final int valueStep = getValueStep(); + inStacks.active = inStacks.visible = forItems; + onAbove.setWidth(forItems ? 48 : 103); + offBelow.setWidth(forItems ? 48 : 103); + + int min = blockEntity.currentMinLevel + valueStep; + int max = blockEntity.currentMaxLevel; + onAbove.withRange(min, max + 1); + int roundedState = Mth.clamp((onAbove.getState() / valueStep) * valueStep, min, max); + if (roundedState != onAbove.getState()) { + onAbove.setState(roundedState); + onAbove.onChanged(); + } + + min = blockEntity.currentMinLevel; + max = blockEntity.currentMaxLevel - valueStep; + offBelow.withRange(min, max + 1); + roundedState = Mth.clamp((offBelow.getState() / valueStep) * valueStep, min, max); + if (roundedState != offBelow.getState()) { + offBelow.setState(roundedState); + offBelow.onChanged(); + } + } + + private int getValueStep() { + boolean stacks = inStacks.getState() == 1; + int valueStep = 1; + if (blockEntity.getTypeOfCurrentTarget() == ThresholdType.FLUID) + valueStep = 1000; + else if (stacks) + valueStep = 64; + return valueStep; } @Override @@ -164,8 +327,8 @@ public class ThresholdSwitchScreen extends AbstractSimiScreen { protected void send(boolean invert) { AllPackets.getChannel() - .sendToServer(new ConfigureThresholdSwitchPacket(blockEntity.getBlockPos(), offBelow.getState() / 100f, - onAbove.getState() / 100f, invert)); + .sendToServer(new ConfigureThresholdSwitchPacket(blockEntity.getBlockPos(), offBelow.getState(), + onAbove.getState(), invert)); } } diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java index 41f42dbfd1..1bd0a63228 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java @@ -40,13 +40,9 @@ public enum AllGuiTextures implements ScreenElement, TextureSheetSegment { SCHEMATICANNON_FUEL("schematics_2", 28, 222, 47, 16), SCHEMATICANNON_FUEL_CREATIVE("schematics_2", 28, 239, 47, 16), - STOCKSWITCH("logistics", 182, 95), - STOCKSWITCH_ARROW_UP("logistics", 191, 0, 7, 24), - STOCKSWITCH_ARROW_DOWN("logistics", 198, 0, 7, 24), - STOCKSWITCH_CURSOR("logistics", 206, 0, 7, 16), - STOCKSWITCH_INTERVAL("logistics", 0, 95, 100, 18), - STOCKSWITCH_UNPOWERED_LANE("logistics", 37, 20, 100, 18), - STOCKSWITCH_POWERED_LANE("logistics", 37, 42, 100, 18), + THRESHOLD_SWITCH("threshold_switch", 182, 103), + THRESHOLD_SWITCH_ITEMCOUNT_INPUTS("threshold_switch", 0, 105, 115, 22), + THRESHOLD_SWITCH_MISC_INPUTS("threshold_switch", 0, 129, 115, 22), FILTER("filters", 214, 99), ATTRIBUTE_FILTER("filters", 0, 99, 241, 85), diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderTags.java b/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderTags.java index 58ce971cad..455ddbf1b7 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderTags.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderTags.java @@ -36,7 +36,8 @@ public class AllCreatePonderTags { TRAIN_RELATED = loc("train_related"), RECENTLY_UPDATED = loc("recently_updated"), DISPLAY_SOURCES = loc("display_sources"), - DISPLAY_TARGETS = loc("display_targets"); + DISPLAY_TARGETS = loc("display_targets"), + THRESHOLD_SWITCH_TARGETS = loc("threshold_switch_targets"); /*public static final PonderTag @@ -226,6 +227,12 @@ public class AllCreatePonderTags { .description("Components or Blocks which can process and display the data received from a Display Link") .register(); + helper.registerTag(THRESHOLD_SWITCH_TARGETS) + .item(AllBlocks.THRESHOLD_SWITCH.get()) + .title("Targets for Threshold Switches") + .description("Threshold Switches can read from these blocks, as well as most item and fluid containers.") + .register(); + HELPER.addToTag(RECENTLY_UPDATED) .add(AllBlocks.WATER_WHEEL) .add(AllBlocks.LARGE_WATER_WHEEL) @@ -453,6 +460,16 @@ public class AllCreatePonderTags { .add(Blocks.COMMAND_BLOCK) .add(Blocks.TARGET); + HELPER.addToTag(THRESHOLD_SWITCH_TARGETS) + .add(AllBlocks.ROPE_PULLEY) + .add(AllBlocks.STOCK_TICKER) + .add(AllBlocks.ITEM_VAULT) + .add(AllBlocks.FLUID_TANK); + + itemHelper.addToTag(THRESHOLD_SWITCH_TARGETS) + .add(Blocks.CHEST) + .add(Blocks.BARREL); + Mods.COMPUTERCRAFT.executeIfInstalled(() -> () -> { Block computer = ForgeRegistries.BLOCKS.getValue(Mods.COMPUTERCRAFT.rl("computer_advanced")); if (computer != null) diff --git a/src/main/resources/assets/create/lang/default/interface.json b/src/main/resources/assets/create/lang/default/interface.json index 8c3f03c827..8a4a9eb74a 100644 --- a/src/main/resources/assets/create/lang/default/interface.json +++ b/src/main/resources/assets/create/lang/default/interface.json @@ -283,8 +283,16 @@ "create.gui.threshold_switch.title": "Threshold Switch", "create.gui.threshold_switch.invert_signal": "Invert Signal", - "create.gui.threshold_switch.move_to_lower_at": "Move to lower lane at %1$s%%", - "create.gui.threshold_switch.move_to_upper_at": "Move to upper lane at %1$s%%", + "create.gui.threshold_switch.power_on_when": "Power on when...", + "create.gui.threshold_switch.power_off_when": "Power off when...", + "create.gui.threshold_switch.upper_threshold": "...at or above:", + "create.gui.threshold_switch.lower_threshold": "...at or below:", + "create.gui.threshold_switch.currently": "Currently %1$s", + "create.gui.threshold_switch.range": "(%1$s to %2$s)", + "create.gui.threshold_switch.range_max": "(max. %1$s)", + "create.gui.threshold_switch.pulley_y_level": "%1$sy", + "create.gui.threshold_switch.not_attached": "Not attached to a block", + "create.gui.threshold_switch.incompatible": "Incompatible block", "create.gui.sequenced_gearshift.title": "Sequenced Gearshift", "create.gui.sequenced_gearshift.instruction": "Instruction", diff --git a/src/main/resources/assets/create/textures/gui/logistics.png b/src/main/resources/assets/create/textures/gui/logistics.png deleted file mode 100644 index 21a85f700b4130141ed0869b7d1766bc6ac1f94f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1219 zcmb7DTToL65Z#*_!t*LxF+e1Z3Kkg(iiB6Gi2_2DiBzNlBBBDKw!l!RX-(l4TU&`0 z1Vo|Jl4gQhR79YJi6aRhAT(eRorGs7AQ+OMXh95+^fI0Czx%Og_hVXe0uSMq|=m7#$r|srpnZ zl~So}Yinz6ZXTB$YiMYwtgIA^#RUZg0)c?X<7H-MCMPFHMMXvI-Bap8m#;#r9nhS0 zX4y20T&i_0)q>+mjd6DVnrb0J(XGqoS%{(m&a1Z2SJ3J7IDlw?aDXs?V1NJs9{?u6 zW&j$1JpdJeLZPe%Ff%hFlgT6!2|<=8`EJAOrv#vx`?!%{G`fW==ZLI<6TD+TuU|hP z$au`QKliuFJIVTSq&VeNlzZK}+x7Lass))xZPR={=W0gE#f9yq(Bf4zJ?YDec-kYI zjniHqNp5UxmHyK`(X`6QZ~A?boA*uo%fLrlokH=EqyG8?n@#<@ay?xJ@rMukMoU_$^;H`01Em_GVoFd~6`kxjGem zeB_vHjdadOuBS~;V=3hi>bh!M0_%G3$l_6c5w3kP43F|>6tyignE~DNi_;Z{bGjTx z?$wwMITkD;&6L3*wK|Evou^Ue+(phTrCS(kOg4@MLBNuHj!)|S&*@}k7;ms15%ps{ zRRhBLvKx*}+Sn=}8MfgLavNSN#kC@@6vd;aLfu*DbmPnBR^YfG& zB1hp)6O*x0ubLH{!tp@kA`KV%|0`aG3EalRKieKESkjjUYFf+kPcFzlv+YIN{ z$BLj=h7e{#$CXE;!>!Mrg|tona71TFGI)#}QV+%*=V#MP<_8k!2>*g3Lw8bsS&z-H zN&Amg0%Z$&6(LCCA7b+-&!APihwu*FK%&>r+)ceP>D>0s`R!w+{*m!l=J>Cetj->M zoE2$Z?liG}$?(=&_#kvU<~p+jO_8@@)l;l+9rwWQwMc_q;U|!`N35-i|A_SgkQjJB zSvVT7n%#L6L!UoLv1DZRkkfDIF}YvhXGGI2WnI_mnZS`tq1cM*@@=e{P~i~mgu9eStkXeyyF7Vhi;C#Q{w*s~1W zjhF2aTR;-+ kR@-H-ClN3Czm4s*h`5?pzrEixkhEOP3E>7;?M%r17rCDatN;K2 diff --git a/src/main/resources/assets/create/textures/gui/threshold_switch.png b/src/main/resources/assets/create/textures/gui/threshold_switch.png new file mode 100644 index 0000000000000000000000000000000000000000..ef1411b76a36bed65ae31a53fd94c0a2fb98eeff GIT binary patch literal 1482 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911MRQ8&P5D>38$lZxy-8q?;Kn_c~qpu?a z!^VE@KZ&eBet3XSh%1n0Wo2bzVq#-sV`OCf|GMYN_T)$v6&4nj2@@t%R8;KPvBOG5 z&{JRBK#s4wyZitD|K{fA$BrEf4Gm38OMCR_QAtV3jT<*_+_-W5`t>DCmMmVp7-(id zfKeilk}V1H3kGVz2^b>Vo@W6Sau#?*7BevL9RguSQ4OyKpnETSx;TbZ#J!!}S$4}n z!1b!mQqQPsZ=U|&zd1_IO+x*6*w!A~_pc5xvqbEY?AaKVTsK2HIq&V&vlZ`-CH<4O z)~kMdtUUX@%;w}Xe|rohO5M)f{rmU)%neb23~qA;xfU=0(VqPk8VyVu42#coSc@F{ z-JQO5*Wne$Nvvz0Id^jXNR57Q?%y4&*!X7`lJBRzpSC~7_H|A6isN_ru6xvT1NB(W zYCk^nLqNhmzXO-w+kejRU&`WgTi|XNXU8_hT^pGq7$r*lA{Y;gZje)WmwzcM?7**A z4<01SemBny)qaq9`LSmtD-TD<@7X3{4B8CM=T3%;e)!PQIsZZ!2~Y?Jyc-epZjsHD9eKzIp$Hq=*F zpU+DOWBT^~{Y~C8-VTh+#sUfDjdL6RutjkfJS_hl&(&ci`(D11*F@|=y7>8zUJez< zA`kp~{8)K;<20tYbD#eQIaIjmC~R(A#n>J=XpSm?MPxGJN}c-MHB zpZ~p|-76X@`kwbUytX}SFEpX@-`esf!CFRj`+0s2?|yoVCGh?zn8T7Xe}4v}pumLs zf1ibbiD9!)K+?bIOlB58tJq{&D~@))GX{DpVaMhpfAm>76gVW>n1G4S;8l;r=bxG1 z*BLMDXozeKOkZ*!`W!cx!>Xg42kcwsIGoDXNu0dt1Jec}i)p>W4Y!3WM0FVU*Sc-` z%2beU^Dgxh2h%@4C5{7gKL#`;Flt{Q__urE@PGSI9) z&BFN5eVzkz+OI#CwGRBBH5r(4bloiGZRu}tUexfog!%L@jvG6DOecgf8a+S1-cgR@ zCO3bpCWEWhBn5`@W6BW+zRr5^-GVVVK6#>cf|2I>jV->X4sizXvMOA4V*J(=8&Y{l zE%hPmgCn(x(>Ci(=y;;+D6?i-E7K1_j@eUOZ5g?v#66NcUo&ayWW_3Us;=c$QT*ED zaB7zWS2t89Qzs)*x|+!ogac5rcWvUqj^F!pnHR7qy^)ug$zrgG#FNj0fVQN kX+qXe Date: Wed, 18 Sep 2024 12:25:40 +0200 Subject: [PATCH 047/515] Frog chat - Changed configuration of package ports to a dedicated UI - Package Ports with '*' as their filter will always be routed to last --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 6 +- .../resources/assets/create/lang/en_ud.json | 8 + .../resources/assets/create/lang/en_us.json | 8 + .../java/com/simibubi/create/AllPackets.java | 2 + .../chainConveyor/ChainConveyorBlock.java | 3 + .../ChainConveyorRoutingTable.java | 2 +- .../packagePort/PackagePortBlock.java | 38 +++- .../packagePort/PackagePortBlockEntity.java | 35 ++-- .../PackagePortConfigurationPacket.java | 67 +++++++ .../packagePort/PackagePortRenderer.java | 30 +--- .../packagePort/PackagePortScreen.java | 164 ++++++++++++++++++ .../PackagePortTargetSelectionHandler.java | 11 +- .../renderer/SmartBlockEntityRenderer.java | 35 ++++ .../create/foundation/gui/AllGuiTextures.java | 1 + .../create/foundation/gui/AllIcons.java | 4 +- .../assets/create/lang/default/interface.json | 9 + .../assets/create/textures/block/port.png | Bin 1611 -> 718 bytes .../assets/create/textures/gui/filters_2.png | Bin 1049 -> 1049 bytes .../assets/create/textures/gui/icons.png | Bin 2434 -> 3773 bytes 19 files changed, 371 insertions(+), 52 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortConfigurationPacket.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortScreen.java diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index d1665d4038..a028064cff 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-09-17T22:58:36.8292659 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-09-18T12:03:46.9934018 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -592,8 +592,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -fd2ddc392a777f4a6861cf0fc117f9e28996ce66 assets/create/lang/en_ud.json -6ede0f428e202dfe865afd3e637e2b22d169a69d assets/create/lang/en_us.json +900c87600c733142927dd73ea59fa103dd3cefcc assets/create/lang/en_ud.json +5a9e60b4cf4c0baac0cad26707d653fd56635e04 assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 2ff4397c3a..b41ad94f52 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -1113,6 +1113,14 @@ "create.gui.goggles.generator_stats": ":sʇɐʇS ɹoʇɐɹǝuǝ⅁", "create.gui.goggles.kinetic_stats": ":sʇɐʇS ɔıʇǝuıʞ", "create.gui.goggles.pole_length": ":ɥʇbuǝꞀ ǝןoԀ", + "create.gui.package_port.accept_nothing": "ǝuou ʇdǝɔɔⱯ /", + "create.gui.package_port.catch_packages": "˙˙˙oʇ pǝssǝɹppɐ sǝbɐʞɔɐd ɥɔʇɐƆ", + "create.gui.package_port.catch_packages_empty": "pǝssǝɹppɐ-uou ɥɔʇɐɯ oʇ ʎʇdɯǝ ǝʌɐǝꞀ", + "create.gui.package_port.catch_packages_wildcard": "pɹɐɔpןıʍ ʇxǝʇ ɐ sɐ * ǝs∩", + "create.gui.package_port.eject_to_inventory": "ʎɹoʇuǝʌuI oʇ ʇɔǝظƎ", + "create.gui.package_port.not_targeting_anything": "buıɥʇʎuɐ buıʇǝbɹɐʇ ʇou sı ʇɹod ǝbɐʞɔɐԀ", + "create.gui.package_port.packages_backed_up": "dn pǝʞɔɐq )s(ǝbɐʞɔɐԀ %1$s", + "create.gui.package_port.send_only": "sǝbɐʞɔɐd puǝs ʎןuO", "create.gui.schedule.add_condition": "uoıʇıpuoƆ ppⱯ", "create.gui.schedule.add_entry": "uoıʇɔⱯ ppⱯ", "create.gui.schedule.alternative_condition": "uoıʇıpuoƆ ǝʌıʇɐuɹǝʇןⱯ", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index f8f28b8d29..cf30a90085 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1113,6 +1113,14 @@ "create.gui.goggles.generator_stats": "Generator Stats:", "create.gui.goggles.kinetic_stats": "Kinetic Stats:", "create.gui.goggles.pole_length": "Pole Length:", + "create.gui.package_port.accept_nothing": "/ Accept none", + "create.gui.package_port.catch_packages": "Catch packages addressed to...", + "create.gui.package_port.catch_packages_empty": "Leave empty to match non-addressed", + "create.gui.package_port.catch_packages_wildcard": "Use * as a text wildcard", + "create.gui.package_port.eject_to_inventory": "Eject to Inventory", + "create.gui.package_port.not_targeting_anything": "Package port is not targeting anything", + "create.gui.package_port.packages_backed_up": "%1$s Package(s) backed up", + "create.gui.package_port.send_only": "Only send packages", "create.gui.schedule.add_condition": "Add Condition", "create.gui.schedule.add_entry": "Add Action", "create.gui.schedule.alternative_condition": "Alternative Condition", diff --git a/src/main/java/com/simibubi/create/AllPackets.java b/src/main/java/com/simibubi/create/AllPackets.java index 45dafc873e..83083d2aba 100644 --- a/src/main/java/com/simibubi/create/AllPackets.java +++ b/src/main/java/com/simibubi/create/AllPackets.java @@ -58,6 +58,7 @@ import com.simibubi.create.content.logistics.depot.EjectorPlacementPacket; import com.simibubi.create.content.logistics.depot.EjectorTriggerPacket; import com.simibubi.create.content.logistics.filter.FilterScreenPacket; import com.simibubi.create.content.logistics.funnel.FunnelFlapPacket; +import com.simibubi.create.content.logistics.packagePort.PackagePortConfigurationPacket; import com.simibubi.create.content.logistics.packagePort.PackagePortPlacementPacket; import com.simibubi.create.content.logistics.stockTicker.LogisticalStockRequestPacket; import com.simibubi.create.content.logistics.stockTicker.LogisticalStockResponsePacket; @@ -179,6 +180,7 @@ public enum AllPackets { CHAIN_CONVEYOR_RIDING(ChainConveyorRidingPacket.class, ChainConveyorRidingPacket::new, PLAY_TO_SERVER), CHAIN_PACKAGE_INTERACTION(ChainPackageInteractionPacket.class, ChainPackageInteractionPacket::new, PLAY_TO_SERVER), STOCK_TICKER_CONFIGURATION(StockTickerConfigurationPacket.class, StockTickerConfigurationPacket::new, PLAY_TO_SERVER), + PACKAGE_PORT_CONFIGURATION(PackagePortConfigurationPacket.class, PackagePortConfigurationPacket::new, PLAY_TO_SERVER), // Server to Client SYMMETRY_EFFECT(SymmetryEffectPacket.class, SymmetryEffectPacket::new, PLAY_TO_CLIENT), diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlock.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlock.java index 32f492c1c3..af82836b14 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlock.java @@ -1,6 +1,7 @@ package com.simibubi.create.content.kinetics.chainConveyor; import com.simibubi.create.AllBlockEntityTypes; +import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; import com.simibubi.create.content.kinetics.base.KineticBlock; import com.simibubi.create.foundation.block.IBE; @@ -52,6 +53,8 @@ public class ChainConveyorBlock extends KineticBlock implements IBE, IWrenchable { @@ -32,7 +44,7 @@ public class PackagePortBlock extends Block implements IBE () -> withBlockEntityDo(worldIn, pos, be -> this.displayScreen(be, player))); + return InteractionResult.SUCCESS; + } + + @OnlyIn(value = Dist.CLIENT) + protected void displayScreen(PackagePortBlockEntity be, Player player) { + if (be.target == null) { + CreateLang.translate("gui.package_port.not_targeting_anything") + .style(ChatFormatting.RED) + .sendStatus(player); + return; + } + if (player instanceof LocalPlayer) + ScreenOpener.open(new PackagePortScreen(be)); + } + @Override public Class getBlockEntityClass() { return PackagePortBlockEntity.class; @@ -61,7 +95,7 @@ public class PackagePortBlock extends Block implements IBE getBlockEntityType() { return AllBlockEntityTypes.PACKAGE_PORT.get(); } - + @Override public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pMovedByPiston) { IBE.onRemove(pState, pLevel, pPos, pNewState); diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java index c92210b890..07228604f8 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java @@ -9,11 +9,9 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.content.logistics.box.PackageEntity; import com.simibubi.create.content.logistics.box.PackageItem; -import com.simibubi.create.content.logistics.filter.FilterItemStack; -import com.simibubi.create.content.logistics.filter.FilterItemStack.PackageFilterItemStack; +import com.simibubi.create.content.logistics.packager.PackagerItemHandler; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; -import com.simibubi.create.foundation.blockEntity.behaviour.filtering.FilteringBehaviour; import com.simibubi.create.foundation.item.ItemHelper; import net.createmod.catnip.utility.Iterate; @@ -40,7 +38,8 @@ import net.minecraftforge.items.ItemHandlerHelper; public class PackagePortBlockEntity extends SmartBlockEntity { - public FilteringBehaviour filtering; + public boolean acceptsPackages; + public String addressFilter; public PackagePortTarget target; public PackagePortInventory inventory; private LazyOptional itemHandler; @@ -60,14 +59,12 @@ public class PackagePortBlockEntity extends SmartBlockEntity { itemHandler = LazyOptional.of(() -> inventory); animationProgress = LerpedFloat.linear(); anticipationProgress = LerpedFloat.linear(); + addressFilter = ""; + acceptsPackages = true; } @Override - public void addBehaviours(List behaviours) { - behaviours.add(filtering = new FilteringBehaviour(this, new PackagePortFilterSlotPositioning()) - .withPredicate(AllItems.PACKAGE_FILTER::isIn) - .withCallback(this::filterChanged)); - } + public void addBehaviours(List behaviours) {} public boolean isAnimationInProgress() { return animationProgress.getChaseTarget() == 1; @@ -89,7 +86,7 @@ public class PackagePortBlockEntity extends SmartBlockEntity { return super.getCapability(cap, side); } - private void filterChanged(ItemStack filter) { + public void filterChanged() { if (target != null) { target.deregister(this, level, worldPosition); target.register(this, level, worldPosition); @@ -247,7 +244,9 @@ public class PackagePortBlockEntity extends SmartBlockEntity { if (!PackageItem.isPackage(stack)) return false; String filterString = getFilterString(); - return filterString == null || !PackageItem.matchAddress(stack, filterString); + boolean canAccept = + handler instanceof PackagerItemHandler || !PackageItem.matchAddress(stack, filterString); + return filterString == null || canAccept; }, false); if (extract.isEmpty()) continue; @@ -271,6 +270,8 @@ public class PackagePortBlockEntity extends SmartBlockEntity { tag.put("Target", target.write()); tag.put("Inventory", inventory.serializeNBT()); tag.putFloat("PlacedYaw", passiveYaw); + tag.putString("AddressFilter", addressFilter); + tag.putBoolean("AcceptsPackages", acceptsPackages); if (animatedPackage != null) { tag.put("AnimatedPackage", animatedPackage.serializeNBT()); tag.putBoolean("Deposit", currentlyDepositing); @@ -288,6 +289,8 @@ public class PackagePortBlockEntity extends SmartBlockEntity { target = PackagePortTarget.read(tag.getCompound("Target")); inventory.deserializeNBT(tag.getCompound("Inventory")); passiveYaw = tag.getFloat("PlacedYaw"); + addressFilter = tag.getString("AddressFilter"); + acceptsPackages = tag.getBoolean("AcceptsPackages"); if (!clientPacket) animatedPackage = null; if (tag.contains("AnimatedPackage")) @@ -299,15 +302,7 @@ public class PackagePortBlockEntity extends SmartBlockEntity { } public String getFilterString() { - ItemStack filter = filtering.getFilter(); - String portFilter = null; - FilterItemStack filterStack = FilterItemStack.of(filter); - if (AllItems.PACKAGE_FILTER.isIn(filter)) { - if (!(filterStack instanceof PackageFilterItemStack pfis)) - return ""; - portFilter = pfis.filterString; - } - return portFilter; + return acceptsPackages ? addressFilter : null; } public float getYaw() { diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortConfigurationPacket.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortConfigurationPacket.java new file mode 100644 index 0000000000..6b563ceaba --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortConfigurationPacket.java @@ -0,0 +1,67 @@ +package com.simibubi.create.content.logistics.packagePort; + +import com.simibubi.create.foundation.networking.BlockEntityConfigurationPacket; + +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.item.ItemStack; + +public class PackagePortConfigurationPacket extends BlockEntityConfigurationPacket { + + private String newFilter; + private boolean ejectPackages; + private boolean acceptPackages; + + public PackagePortConfigurationPacket(BlockPos pos, String newFilter, boolean acceptPackages, boolean ejectPackages) { + super(pos); + this.newFilter = newFilter; + this.ejectPackages = ejectPackages; + this.acceptPackages = acceptPackages; + } + + public PackagePortConfigurationPacket(FriendlyByteBuf buffer) { + super(buffer); + } + + @Override + protected void writeSettings(FriendlyByteBuf buffer) { + buffer.writeBoolean(ejectPackages); + buffer.writeBoolean(acceptPackages); + buffer.writeUtf(newFilter); + } + + @Override + protected void readSettings(FriendlyByteBuf buffer) { + ejectPackages = buffer.readBoolean(); + acceptPackages = buffer.readBoolean(); + newFilter = buffer.readUtf(); + } + + @Override + protected void applySettings(ServerPlayer player, PackagePortBlockEntity be) { + super.applySettings(player, be); + if (!ejectPackages) + return; + for (int i = 0; i < be.inventory.getSlots(); i++) { + ItemStack stackInSlot = be.inventory.getStackInSlot(i); + if (stackInSlot.isEmpty()) + continue; + player.getInventory() + .placeItemBackInInventory(stackInSlot); + be.inventory.setStackInSlot(i, ItemStack.EMPTY); + } + be.notifyUpdate(); + } + + @Override + protected void applySettings(PackagePortBlockEntity be) { + if (be.addressFilter.equals(newFilter) && be.acceptsPackages == acceptPackages) + return; + be.addressFilter = newFilter; + be.acceptsPackages = acceptPackages; + be.filterChanged(); + be.notifyUpdate(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortRenderer.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortRenderer.java index ffdd0ad4b0..1f8ab10bec 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortRenderer.java @@ -1,14 +1,12 @@ package com.simibubi.create.content.logistics.packagePort; -import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllPartialModels; -import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxRenderer; -import com.simibubi.create.foundation.blockEntity.behaviour.filtering.FilteringBehaviour; import com.simibubi.create.foundation.blockEntity.renderer.SmartBlockEntityRenderer; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; +import net.createmod.catnip.utility.lang.Components; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider.Context; @@ -42,6 +40,11 @@ public class PackagePortRenderer extends SmartBlockEntityRenderer minecraft.setScreen(null)); + addRenderableWidget(confirmButton); + + dumpPackagesButton = new IconButton(x + 156, y + background.getHeight() - 24, AllIcons.I_PRIORITY_LOW); + dumpPackagesButton.withCallback(() -> AllPackets.getChannel() + .sendToServer(new PackagePortConfigurationPacket(blockEntity.getBlockPos(), addressBox.getValue(), + !sendOnly(), true))); + dumpPackagesButton.setToolTip(CreateLang.translateDirect("gui.package_port.eject_to_inventory")); + addRenderableWidget(dumpPackagesButton); + + dontAcceptPackages = new IconButton(x + 15, y + background.getHeight() - 24, AllIcons.I_SEND_ONLY); + dontAcceptPackages.withCallback(() -> { + addressBox.setValue(CreateLang.translate("gui.package_port.accept_nothing") + .string()); + }); + dontAcceptPackages.setToolTip(CreateLang.translateDirect("gui.package_port.send_only")); + addRenderableWidget(dontAcceptPackages); + + setFocused(addressBox); + tick(); + } + + @Override + public void removed() { + AllPackets.getChannel() + .sendToServer(new PackagePortConfigurationPacket(blockEntity.getBlockPos(), addressBox.getValue(), + !sendOnly(), false)); + super.removed(); + } + + private boolean sendOnly() { + return CreateLang.translate("gui.package_port.accept_nothing") + .string() + .equals(addressBox.getValue()); + } + + @Override + public void tick() { + super.tick(); + dontAcceptPackages.active = !sendOnly(); + if (dumpPackagesButton.active != (getPackageCount() != 0)) { + dumpPackagesButton.active = !dumpPackagesButton.active; + dumpPackagesButton.getToolTip() + .clear(); + if (dumpPackagesButton.active) + dumpPackagesButton.setToolTip(CreateLang.translateDirect("gui.package_port.eject_to_inventory")); + } + } + + @Override + protected void renderWindow(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + int x = guiLeft; + int y = guiTop; + + background.render(graphics, x, y); + graphics.drawString(font, title, x + background.getWidth() / 2 - font.width(title) / 2, y + 4, 0x3D3C48, false); + + GuiGameElement.of(renderedItem).at(x + background.getWidth() + 6, y + background.getHeight() - 56, -200) + .scale(5) + .render(graphics); + + AllGuiTextures.PACKAGE_PORT_SLOT.render(graphics, x + 136, y + background.getHeight() - 24); + graphics.renderItem(renderedPackage, x + 16, y + 23); + + if (getPackageCount() > 0) { + graphics.renderItem(renderedPackage, x + 137, y + background.getHeight() - 24); + graphics.renderItemDecorations(font, renderedPackage, x + 137, y + background.getHeight() - 24, + String.valueOf(getPackageCount())); + + if (mouseX > x + 136 && mouseX < x + 136 + 18 && mouseY > y + background.getHeight() - 24 + && mouseY < y + background.getHeight() - 24 + 18) + graphics.renderComponentTooltip(font, + List.of(CreateLang.translate("gui.package_port.packages_backed_up", getPackageCount()) + .component()), + mouseX, mouseY); + } + + if (addressBox.isHovered()) { + graphics.renderComponentTooltip(font, List.of(CreateLang.translate("gui.package_port.catch_packages") + .color(AbstractSimiWidget.HEADER_RGB) + .component(), + CreateLang.translate("gui.package_port.catch_packages_wildcard") + .style(ChatFormatting.GRAY) + .component(), + CreateLang.translate("gui.package_port.catch_packages_empty") + .style(ChatFormatting.GRAY) + .component()), + mouseX, mouseY); + } + } + + private int getPackageCount() { + int packageCount = 0; + for (int i = 0; i < blockEntity.inventory.getSlots(); i++) + if (!blockEntity.inventory.getStackInSlot(i) + .isEmpty()) + packageCount++; + return packageCount; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTargetSelectionHandler.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTargetSelectionHandler.java index 775976b813..0d244ccbe2 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTargetSelectionHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTargetSelectionHandler.java @@ -6,6 +6,7 @@ import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.infrastructure.config.AllConfigs; import net.createmod.catnip.CatnipClient; +import net.createmod.catnip.gui.ScreenOpener; import net.createmod.catnip.utility.AnimationTickHolder; import net.createmod.catnip.utility.theme.Color; import net.minecraft.client.Minecraft; @@ -13,6 +14,7 @@ import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.player.LocalPlayer; import net.minecraft.core.BlockPos; import net.minecraft.core.particles.DustParticleOptions; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.HitResult; @@ -25,13 +27,20 @@ public class PackagePortTargetSelectionHandler { public static Vec3 exactPositionOfTarget; public static void flushSettings(BlockPos pos) { - if (activePackageTarget == null) + if (activePackageTarget == null) { + CreateLang.translate("gui.package_port.not_targeting_anything") + .sendStatus(Minecraft.getInstance().player); return; + } if (validateDiff(exactPositionOfTarget, pos) == null) { activePackageTarget.relativePos = activePackageTarget.relativePos.subtract(pos); AllPackets.getChannel() .sendToServer(new PackagePortPlacementPacket(activePackageTarget, pos)); + + BlockEntity blockEntity = Minecraft.getInstance().level.getBlockEntity(pos); + if (blockEntity instanceof PackagePortBlockEntity ppbe) + ScreenOpener.open(new PackagePortScreen(ppbe)); } activePackageTarget = null; diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/renderer/SmartBlockEntityRenderer.java b/src/main/java/com/simibubi/create/foundation/blockEntity/renderer/SmartBlockEntityRenderer.java index 041c97d170..e7c3903207 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/renderer/SmartBlockEntityRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/renderer/SmartBlockEntityRenderer.java @@ -1,12 +1,21 @@ package com.simibubi.create.foundation.blockEntity.renderer; +import org.joml.Matrix4f; + import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.content.redstone.link.LinkRenderer; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.filtering.FilteringRenderer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Font; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; +import net.minecraft.network.chat.Component; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.HitResult; +import net.minecraft.world.phys.HitResult.Type; +import net.minecraft.world.phys.Vec3; public class SmartBlockEntityRenderer extends SafeBlockEntityRenderer { @@ -20,4 +29,30 @@ public class SmartBlockEntityRenderer extends SafeBl LinkRenderer.renderOnBlockEntity(blockEntity, partialTicks, ms, buffer, light, overlay); } + protected void renderNameplateOnHover(T blockEntity, Component tag, float yOffset, PoseStack ms, + MultiBufferSource buffer, int light) { + Minecraft mc = Minecraft.getInstance(); + if (mc.player.distanceToSqr(Vec3.atCenterOf(blockEntity.getBlockPos())) > 4096.0f) + return; + HitResult hitResult = mc.hitResult; + if (!(hitResult instanceof BlockHitResult bhr) || bhr.getType() == Type.MISS || !bhr.getBlockPos() + .equals(blockEntity.getBlockPos())) + return; + + float f = yOffset + 0.25f; + ms.pushPose(); + ms.translate(0.5, f, 0.5); + ms.mulPose(mc.getEntityRenderDispatcher() + .cameraOrientation()); + ms.scale(-0.025F, -0.025F, 0.025F); + Matrix4f matrix4f = ms.last() + .pose(); + float f1 = mc.options.getBackgroundOpacity(0.25F); + int j = (int) (f1 * 255.0F) << 24; + float f2 = (float) (-mc.font.width(tag) / 2); + mc.font.drawInBatch(tag, f2, 0, 553648127, false, matrix4f, buffer, Font.DisplayMode.SEE_THROUGH, j, light); + mc.font.drawInBatch(tag, f2, 0, -1, false, matrix4f, buffer, Font.DisplayMode.NORMAL, 0, light); + ms.popPose(); + } + } diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java index 1bd0a63228..2b16769ba8 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java @@ -47,6 +47,7 @@ public enum AllGuiTextures implements ScreenElement, TextureSheetSegment { FILTER("filters", 214, 99), ATTRIBUTE_FILTER("filters", 0, 99, 241, 85), PACKAGE_FILTER("filters_2", 0, 0, 218, 79), + PACKAGE_PORT_SLOT("filters_2", 15, 23, 18, 18), TOOLBOX("toolbox", 188, 171), TOOLBELT_SLOT("minecraft", "widgets", 24, 23, 22, 22), diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java b/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java index 0068ca065d..140b5dfff1 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java @@ -161,7 +161,9 @@ public class AllIcons implements ScreenElement { I_FX_FIELD_OFF = next(), I_FX_FIELD_ON = next(), I_FX_BLEND = next(), - I_FX_BLEND_OFF = next(); + I_FX_BLEND_OFF = next(), + + I_SEND_ONLY = newRow(); ; public AllIcons(int x, int y) { diff --git a/src/main/resources/assets/create/lang/default/interface.json b/src/main/resources/assets/create/lang/default/interface.json index 8a4a9eb74a..d865aeb8d4 100644 --- a/src/main/resources/assets/create/lang/default/interface.json +++ b/src/main/resources/assets/create/lang/default/interface.json @@ -463,6 +463,15 @@ "create.gui.filter.ignore_data": "Ignore Data", "create.gui.filter.ignore_data.description": "Items match regardless of their attributes.", + "create.gui.package_port.accept_nothing": "/ Accept none", + "create.gui.package_port.packages_backed_up": "%1$s Package(s) backed up", + "create.gui.package_port.eject_to_inventory": "Eject to Inventory", + "create.gui.package_port.send_only": "Only send packages", + "create.gui.package_port.catch_packages": "Catch packages addressed to...", + "create.gui.package_port.catch_packages_wildcard": "Use * as a text wildcard", + "create.gui.package_port.catch_packages_empty": "Leave empty to match non-addressed", + "create.gui.package_port.not_targeting_anything": "Package port is not targeting anything", + "create.item_attributes.placeable": "is placeable", "create.item_attributes.placeable.inverted": "is not placeable", "create.item_attributes.consumable": "can be eaten", diff --git a/src/main/resources/assets/create/textures/block/port.png b/src/main/resources/assets/create/textures/block/port.png index 4840aea635f2408c41b345c3538aac6428c272ab..225af89fc6c60784a4a273856aff14672ac7c64a 100644 GIT binary patch delta 705 zcmX@jbB=X_WIZzj1B1(wu46!ou{g-xiDBJ2nU_EgOS+@4BLl<6e(pbstU!K3fKQ0) zo^9*q&z|h&m*^Rm=^a-XmfdJzWnpS!>*(R)=osMQ5!KREo|&0sYvW<0r=hGMD<>lv z93BYNt*Wmpt*Wf8ZK$fMostk55$F==W$S2T=vZ&5Woe?Lqp2bxE&^2d#$MF`NGX&A z`33*S4;W%%q~8M7au#?*7Bet#3xY6XeMx*H*JTiad2#x`Yom{en))HZgAy2wC2d3Tgl@kd^G@cZn7PQ* z`!R6oUER*yvduCvTaaDx_+iskxA@f^8sY`bql?^Is{^>?PhB}W|2a!>)ax@c?{n-u zxfeOkJfQnaB}4s>QsctIIy{s1a2!qC@42_7LhcGvB=ZKrv|GHQK|1_PRFv~2Uk7ip zFL^eRr^e@ku*uDLCVp&OGxtuL{ZrBDMw!&!b@c*YW(Mq%{HBmmXll1HPK!g(?M;*J zyxAo-$D2P)*K+3x{C2mA#c^uq^lb;SeApdb9?!At3R-M-c=JawzKMV9cHd{PDKq); zpX>VR$DbHJ?AUg-K3Rf6FOl`$E~B2i#jHvi-X#kjGH4=|QouW<~RPDYtun zLKff6F!fWjy7fHf`@!=$2kcv4u~;~-cywPr=hL|o7DlThoW~#Lemo}Q?mv4kbL3(D V%kxj#7y{#)!PC{xWt~$(69Br_E!6-3 delta 1605 zcmV-L2D z5d>j@#A!@~KvW=$h{JVfl@5CPv9_l>?T#1Sc{yFXQGAl-J$=vn@juV=fB(<(I!3-f zY68SmmBZg%!lfuU6$OAfU8k(;yzopn;ZO*>*~j0@oD0Ux={j$}yn|0q{(sgGfhD!+oP`1qx8_gDRHo1xHSkLg; zYXC%ctmp7|mx!q~*OAo_|kNdR)0o1)LZyc3tZxoU2?n5VNdzzx+zGO`-y&mVKpfNkIYoau5m z<7{#x`&yCbL0TJImd@lbN+keXO?Oa?>hS1#jzrSI+^h!&!29pLYleayHAJ%$PK{5p zZ~uXN0e>~;TQRP8V9-2s{E!&1_3@_xkh~=*dXYxHKWbVVoESMrGM%kjG2r*nwP78h zU)iiB^R=PHu3x{3)H^U(*({;a9Nxsqp^ukj zdVl|(y=Fc(E`-JBNePfgzWSzSyamdxlol~xeffE$LNbmdSCr34rRW_PH05Q>YJl|b z*=ri96hT*H{bJ^TNrYj~zz#E*E59E8h0ijp!HU zVjd%_iC?)`A!e~yM4FizuLy&z2%YYWM1Rdw!w0KC^hKg(S=X^ZSh{~|{_HPhB|{e^ zwRh;(ZBpySb=t>%S` zqYdQ)3uvQr{42tyl`HI-7C<+gNPUs03DCd3$6Q!6*x768d0!;Tso{fMxHxLp{(rjG zJ1~e#QE<1dqTbrY*%FeGNmtVCeCI;#wg~fo%*bkJQ+F19KWmhbiZjU?6|;y^Pu-k~ zLjRto$_y;ui&@ zv&qf2o;Hz?)c7PnUQ7TmeD)f0i=UaPaU@y6F4t*jCtCMM&K`#FmJ zfmSmV>_ClAV{e5AEE0Y_`hPbrcQYS+G*q>KRZ`nYct4g%YN+wan$|K$UnFWe8_;ws z6t~9CS2&uOf^CF`ymJO|WMpk2D^4QVotJ7&00000NkvXXu0mjf Dzh4lU diff --git a/src/main/resources/assets/create/textures/gui/filters_2.png b/src/main/resources/assets/create/textures/gui/filters_2.png index 4da0a7717fdb44b03f36761738f80f5ef1fff6ec..569a05fe21de87a55edaf2f14af9e2d9c76ff401 100644 GIT binary patch delta 21 dcmbQqF_UA$Uamt7419+eMK!z{HXaXR1^`X62LS*8 delta 21 dcmbQqF_UA$UarFo419+fkLRyQ*?2sN830!E2tEJ+ diff --git a/src/main/resources/assets/create/textures/gui/icons.png b/src/main/resources/assets/create/textures/gui/icons.png index f85cac3fcf8c5ec4e868d1e850113ddc4fa2cf15..0440d00043d5c18ea05075b52c33801d84e7c0f5 100644 GIT binary patch delta 3682 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 Z7W2PY&AT(Moqr;Mdv^>paT>_*{{dEM5%vH8 delta 2335 zcmcJQ`9G9>7stQXTr*>4EHfFBovg`Py`-sbS13y*N?9U98nTm84X!Jpp#`_ZQ$1Pg zZljDRo{=Skq#7}yl43^o%3m?_xaSQC(<)?Gj|wURE8X9i%kXm!W86;q%=^ONO3r-0D~@_P3MTZvU26{gt@4-;gN{bPH$ zJ|}X0EN^DNEyAyn8L0OkAqqt#3Qrh}7xY~ypUO7!Ya;TUW9R^#TN_FGxHa)gbc9mX zLA@V8bQo9|=*LZu5=uj<7ZVQ)RHv^QiOud4@_n}{I{~s5^wkjLCwP~+mMszi=+ei( z3y+EC8N84}Lh8%xk{s1#HujvctWC;o6VwRmswRB-#x9VJJ<*&or#%<*lQzn_vYfjA z^sIX^zVqg16k>#6Y~B3tdI5#%wX}hrLqHLL!e%CoqKWJk`9AQQ;)+KP1LI{&Y@V6$ z-}N}N_-aO66z4v5S-x;^SG3=!5;{^P3qr$AYQ8X-UYLg-mQOsC0#iSY-G&-!o;hM4 zPJ{dhQl#FdXbV_NdYzZLvE0k}*e|s{Tl9J5=mvJvBP@u;Pf_8X(~4OvH8;u2D!^xe za4HyVmjB2$HAmH;`rDqxM<2x1QWjqoAF$^JkAK@Z5{?L+g1tV4et364B5FXp zsN8^K+0i9}ud**Kx0rJ(zK&!1m!-a-W-TQ_U*OTcz{c)Ln?qP8bVb<(c;(8?vB^mu zh>HM|rJtSquvb3wh8(3z5kZNI*N@ENzCdNF zJ2$TE5w(ElGq*I<69R(+k&~xT%UmGOkA<)!=WrG40Z2hb_F(tlPmLOwMgPCfJcvh0M-i{bYu&tqP zfjm+8xiTe> zEdi|M#iNyJfY2$0$7N7n3i)-Oumm!kOY!Ka33x#P{Zn+wZxzekh3x3hB}9TdVOUSf z=4mjo*!c`KBvsLSAe0u(xV?JRGL#=)m-8V3Oy|I2jYw+wlqtYXTgw5%I6BqsEzCcW zjH;kC)1;m5>2;oC>iquvWrFk|PcWF6e7yHuTo=_|Qc2`%DoM4PHKS&Lx=sPH+;;{* ziLa>>}XYdW6#$ zoB4<{ok$vjim(L}MuHjeBv_70l!YbD*s4i?jc#vmGt^94irwx+{oeK-BAEcIP0}3) zx1%s%(9|L~_1_kj4rE$k*U(<1vw{3XAvYF0dqs!(8$l9SL=Qb#NFrz zi|umt8r}{=TXC&J*5i{QX>mQ2<@jt#QHa94y?8Nlp5v>s=aFs6aITFGdZE4cyDv?+ zpLBI~QDFDIb?(+m2`xlAg6rG>!n5eoyz~AileMmEz~IpqDNK z%QQTN00qD8eTeHWTSb``Uk8OdsdB5NeqX-)=t0?PJJ zYWx!#YE;mPXvWCa`-f8e(&?%hraPD=7xIWGKzajmZp&kaEaGOZ8LWQ68&|)m3&>Yq z;jjwpb!A4PSNcCZ19U)Vks07$xlB&oX)9eW*$bTcu|rLegB(9kBYo@ykz_R43RyuT z@^~(*J5CV^q61(mjc`1#dgJ-`I*;#F Date: Wed, 18 Sep 2024 18:21:28 +0200 Subject: [PATCH 048/515] Box on car - Package Ports can now interface with Train Stations --- .../packagePort/PackagePortScreen.java | 4 +- .../packagePort/PackagePortTarget.java | 69 ++++++++++ .../PackagePortTargetSelectionHandler.java | 27 ++++ .../LogisticallyLinkedBehaviour.java | 18 ++- .../packagerLink/PackagerLinkBlockEntity.java | 3 +- .../content/trains/station/GlobalStation.java | 100 ++++++++++++++ .../trains/station/StationBlockEntity.java | 125 ++++++++++++++---- .../create/foundation/events/InputEvents.java | 3 + 8 files changed, 317 insertions(+), 32 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortScreen.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortScreen.java index 3fff503cee..5eb1dbb1a4 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortScreen.java @@ -142,10 +142,10 @@ public class PackagePortScreen extends AbstractSimiScreen { graphics.renderComponentTooltip(font, List.of(CreateLang.translate("gui.package_port.catch_packages") .color(AbstractSimiWidget.HEADER_RGB) .component(), - CreateLang.translate("gui.package_port.catch_packages_wildcard") + CreateLang.translate("gui.package_port.catch_packages_empty") .style(ChatFormatting.GRAY) .component(), - CreateLang.translate("gui.package_port.catch_packages_empty") + CreateLang.translate("gui.package_port.catch_packages_wildcard") .style(ChatFormatting.GRAY) .component()), mouseX, mouseY); diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTarget.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTarget.java index 44268d3e5f..64473b35a9 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTarget.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTarget.java @@ -9,14 +9,21 @@ import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorBlockEnti import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorBlockEntity.ConnectedPort; import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorBlockEntity.ConnectionStats; import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorPackage; +import com.simibubi.create.content.trains.entity.Carriage; +import com.simibubi.create.content.trains.entity.Train; +import com.simibubi.create.content.trains.station.GlobalStation; +import com.simibubi.create.content.trains.station.StationBlockEntity; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.phys.Vec3; +import net.minecraftforge.items.IItemHandlerModifiable; +import net.minecraftforge.items.ItemHandlerHelper; public abstract class PackagePortTarget { @@ -54,6 +61,7 @@ public abstract class PackagePortTarget { PackagePortTarget target = switch (tag.getString("Type")) { case "ChainConveyor" -> new ChainConveyorPortTarget(relativePos, 0, null); + case "TrainStation" -> new TrainStationPortTarget(relativePos); default -> null; }; @@ -181,4 +189,65 @@ public abstract class PackagePortTarget { } + public static class TrainStationPortTarget extends PackagePortTarget { + + public TrainStationPortTarget(BlockPos relativePos) { + super("TrainStation", relativePos); + } + + @Override + public boolean export(LevelAccessor level, BlockPos portPos, ItemStack box, boolean simulate) { + if (!(be(level, portPos) instanceof StationBlockEntity sbe)) + return false; + + GlobalStation station = sbe.getStation(); + if (station == null) + return false; + + Train train = station.getPresentTrain(); + if (train == null) + return false; + if (!(level instanceof Level l)) + return false; + + for (Carriage carriage : train.carriages) { + IItemHandlerModifiable inventory = carriage.storage.getItems(); + if (inventory == null) + continue; + ItemStack insertItemStacked = ItemHandlerHelper.insertItemStacked(inventory, box, simulate); + if (insertItemStacked.isEmpty()) + return true; + } + + return false; + } + + @Override + public Vec3 getExactTargetLocation(PackagePortBlockEntity ppbe, LevelAccessor level, BlockPos portPos) { + if (!(be(level, portPos) instanceof StationBlockEntity sbe) || sbe.edgePoint == null) + return Vec3.atCenterOf(portPos); + return Vec3.atCenterOf(sbe.edgePoint.getPositionForMapMarker() + .above()); + } + + @Override + public void register(PackagePortBlockEntity ppbe, LevelAccessor level, BlockPos portPos) { + if (be(level, portPos) instanceof StationBlockEntity sbe) + sbe.attachPackagePort(ppbe); + } + + @Override + public void deregister(PackagePortBlockEntity ppbe, LevelAccessor level, BlockPos portPos) { + if (be(level, portPos) instanceof StationBlockEntity sbe) + sbe.removePackagePort(ppbe); + } + + @Override + protected void writeInternal(CompoundTag tag) {} + + @Override + protected void readInternal(CompoundTag tag) {} + + } + } diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTargetSelectionHandler.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTargetSelectionHandler.java index 0d244ccbe2..ac4ecb7895 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTargetSelectionHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTargetSelectionHandler.java @@ -2,6 +2,7 @@ package com.simibubi.create.content.logistics.packagePort; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllPackets; +import com.simibubi.create.content.trains.station.StationBlockEntity; import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.infrastructure.config.AllConfigs; @@ -14,6 +15,7 @@ import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.player.LocalPlayer; import net.minecraft.core.BlockPos; import net.minecraft.core.particles.DustParticleOptions; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.BlockHitResult; @@ -47,6 +49,31 @@ public class PackagePortTargetSelectionHandler { return; } + public static boolean onUse() { + Minecraft mc = Minecraft.getInstance(); + HitResult hitResult = mc.hitResult; + ItemStack mainHandItem = mc.player.getMainHandItem(); + + if (hitResult == null || hitResult.getType() == Type.MISS) + return false; + if (!(hitResult instanceof BlockHitResult bhr)) + return false; + + BlockPos pos = bhr.getBlockPos(); + if (!(mc.level.getBlockEntity(pos) instanceof StationBlockEntity sbe)) + return false; + if (sbe.edgePoint == null) + return false; + if (!AllBlocks.PACKAGE_PORT.isIn(mainHandItem)) + return false; + + PackagePortTargetSelectionHandler.exactPositionOfTarget = + Vec3.atCenterOf(sbe.edgePoint.getPositionForMapMarker() + .above()); + PackagePortTargetSelectionHandler.activePackageTarget = new PackagePortTarget.TrainStationPortTarget(pos); + return true; + } + public static void tick() { Minecraft mc = Minecraft.getInstance(); LocalPlayer player = mc.player; diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java index ad5fc93304..6805aaee21 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java @@ -62,7 +62,8 @@ public class LogisticallyLinkedBehaviour extends BlockEntityBehaviour { } public void invalidateSelf() { - if (getTarget() instanceof LogisticallyLinkedBehaviour target) + LogisticallyLinkedBehaviour target = getTarget(); + if (target != null) target.invalidateLink(this); } @@ -86,10 +87,13 @@ public class LogisticallyLinkedBehaviour extends BlockEntityBehaviour { .getLevel(targetDim); if (world == null) return null; + if (!world.isLoaded(targetPos)) + return null; - if (world.isLoaded(targetPos) && get(world, targetPos, TYPE) instanceof LogisticallyLinkedBehaviour llb) { - target = new WeakReference(llb); - return llb; + LogisticallyLinkedBehaviour logisticallyLinkedBehaviour = get(world, targetPos, TYPE); + if (logisticallyLinkedBehaviour != null) { + target = new WeakReference(logisticallyLinkedBehaviour); + return logisticallyLinkedBehaviour; } return null; @@ -121,7 +125,8 @@ public class LogisticallyLinkedBehaviour extends BlockEntityBehaviour { } public void tickTargetConnection() { - if (getTarget() instanceof LogisticallyLinkedBehaviour target) + LogisticallyLinkedBehaviour target = getTarget(); + if (target != null) target.keepConnected(this); } @@ -158,7 +163,8 @@ public class LogisticallyLinkedBehaviour extends BlockEntityBehaviour { int combinedPower = relativePower + redstonePower; links.put(this, combinedPower); - if (getTarget() instanceof LogisticallyLinkedBehaviour target && !links.containsKey(target)) + LogisticallyLinkedBehaviour target = getTarget(); + if (target != null && !links.containsKey(target)) target.appendAvailableLinksRecursive(links, combinedPower); connectedLinks.forEach(($, entry) -> { diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java index a7953d3580..f6ab6c5b97 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java @@ -70,7 +70,8 @@ public class PackagerLinkBlockEntity extends LinkWithBulbBlockEntity { public void initialize() { super.initialize(); behaviour.redstonePowerChanged(PackagerLinkBlock.getPower(getBlockState(), level, worldPosition)); - if (getPackager() instanceof PackagerBlockEntity packager) + PackagerBlockEntity packager = getPackager(); + if (packager != null) packager.recheckIfLinksPresent(); } diff --git a/src/main/java/com/simibubi/create/content/trains/station/GlobalStation.java b/src/main/java/com/simibubi/create/content/trains/station/GlobalStation.java index bc025316c6..e5eec23baf 100644 --- a/src/main/java/com/simibubi/create/content/trains/station/GlobalStation.java +++ b/src/main/java/com/simibubi/create/content/trains/station/GlobalStation.java @@ -1,18 +1,37 @@ package com.simibubi.create.content.trains.station; import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; import javax.annotation.Nullable; +import com.simibubi.create.Create; +import com.simibubi.create.content.logistics.box.PackageItem; +import com.simibubi.create.content.logistics.packagePort.PackagePortBlockEntity; +import com.simibubi.create.content.trains.entity.Carriage; +import com.simibubi.create.content.trains.entity.CarriageContraptionEntity; import com.simibubi.create.content.trains.entity.Train; import com.simibubi.create.content.trains.graph.DimensionPalette; +import com.simibubi.create.content.trains.graph.TrackGraph; import com.simibubi.create.content.trains.graph.TrackNode; import com.simibubi.create.content.trains.signal.SingleBlockEntityEdgePoint; +import net.createmod.catnip.utility.NBTHelper; +import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.nbt.Tag; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.items.IItemHandlerModifiable; public class GlobalStation extends SingleBlockEntityEdgePoint { @@ -20,9 +39,12 @@ public class GlobalStation extends SingleBlockEntityEdgePoint { public WeakReference nearestTrain; public boolean assembling; + public Map connectedPorts; + public GlobalStation() { name = "Track Station"; nearestTrain = new WeakReference(null); + connectedPorts = new HashMap<>(); } @Override @@ -39,6 +61,14 @@ public class GlobalStation extends SingleBlockEntityEdgePoint { name = nbt.getString("Name"); assembling = nbt.getBoolean("Assembling"); nearestTrain = new WeakReference(null); + + connectedPorts.clear(); + NBTHelper.iterateCompoundList(nbt.getList("Ports", Tag.TAG_LIST), c -> { + GlobalPackagePort port = new GlobalPackagePort(); + port.address = c.getString("Address"); + port.inBuffer = NBTHelper.readItemList(c.getList("InBuffer", Tag.TAG_LIST)); + connectedPorts.put(NbtUtils.readBlockPos(c.getCompound("Pos")), port); + }); } @Override @@ -55,6 +85,14 @@ public class GlobalStation extends SingleBlockEntityEdgePoint { super.write(nbt, dimensions); nbt.putString("Name", name); nbt.putBoolean("Assembling", assembling); + + nbt.put("Ports", NBTHelper.writeCompoundList(connectedPorts.entrySet(), e -> { + CompoundTag c = new CompoundTag(); + c.putString("Address", e.getValue().address); + c.put("InBuffer", NBTHelper.writeItemList(e.getValue().inBuffer)); + c.put("Pos", NbtUtils.writeBlockPos(e.getKey())); + return c; + })); } @Override @@ -119,4 +157,66 @@ public class GlobalStation extends SingleBlockEntityEdgePoint { return this.nearestTrain.get(); } + // Package Port integration + public static class GlobalPackagePort { + public String address = ""; + public List inBuffer = new ArrayList<>(); + } + + @Override + public void tick(TrackGraph graph, boolean preTrains) { + super.tick(graph, preTrains); + if (preTrains) + return; + Train train = getPresentTrain(); + if (train == null || connectedPorts.isEmpty()) + return; + + Level level = null; + + for (Carriage carriage : train.carriages) { + if (level == null) { + CarriageContraptionEntity entity = carriage.anyAvailableEntity(); + if (entity != null && entity.level() instanceof ServerLevel sl) + level = sl.getServer() + .getLevel(getBlockEntityDimension()); + } + + IItemHandlerModifiable inventory = carriage.storage.getItems(); + if (inventory == null) + continue; + + for (int slot = 0; slot < inventory.getSlots(); slot++) { + ItemStack stack = inventory.getStackInSlot(slot); + if (!PackageItem.isPackage(stack)) + continue; + for (Entry entry : connectedPorts.entrySet()) { + GlobalPackagePort port = entry.getValue(); + BlockPos pos = entry.getKey(); + + if (!PackageItem.matchAddress(stack, port.address)) + continue; + + if (level != null && level.isLoaded(pos) && level.getBlockEntity(pos) instanceof PackagePortBlockEntity ppbe) { + if (ppbe.isAnimationInProgress()) + continue; + if (ppbe.inventory.isBackedUp()) + continue; + ppbe.startAnimation(stack, false); + + } else { + if (port.inBuffer.size() >= 18) + continue; + port.inBuffer.add(stack); + Create.RAILWAYS.markTracksDirty(); + } + + inventory.setStackInSlot(slot, ItemStack.EMPTY); + break; + } + } + + } + } + } diff --git a/src/main/java/com/simibubi/create/content/trains/station/StationBlockEntity.java b/src/main/java/com/simibubi/create/content/trains/station/StationBlockEntity.java index 58ec370945..021467548a 100644 --- a/src/main/java/com/simibubi/create/content/trains/station/StationBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/trains/station/StationBlockEntity.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -27,6 +28,7 @@ import com.simibubi.create.content.contraptions.ITransformableBlockEntity; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.decoration.slidingDoor.DoorControlBehaviour; import com.simibubi.create.content.logistics.depot.DepotBehaviour; +import com.simibubi.create.content.logistics.packagePort.PackagePortBlockEntity; import com.simibubi.create.content.redstone.displayLink.DisplayLinkBlock; import com.simibubi.create.content.trains.bogey.AbstractBogeyBlock; import com.simibubi.create.content.trains.bogey.AbstractBogeyBlockEntity; @@ -46,6 +48,7 @@ import com.simibubi.create.content.trains.graph.TrackNodeLocation; import com.simibubi.create.content.trains.graph.TrackNodeLocation.DiscoveredLocation; import com.simibubi.create.content.trains.schedule.Schedule; import com.simibubi.create.content.trains.schedule.ScheduleItem; +import com.simibubi.create.content.trains.station.GlobalStation.GlobalPackagePort; import com.simibubi.create.content.trains.track.ITrackBlock; import com.simibubi.create.content.trains.track.TrackTargetingBehaviour; import com.simibubi.create.foundation.advancement.AllAdvancements; @@ -89,6 +92,7 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.network.PacketDistributor; public class StationBlockEntity extends SmartBlockEntity implements ITransformableBlockEntity { @@ -220,6 +224,8 @@ public class StationBlockEntity extends SmartBlockEntity implements ITransformab @Override public void tick() { + tickPackagePorts(); + if (isAssembling() && level.isClientSide) refreshAssemblyInfo(); super.tick(); @@ -285,7 +291,8 @@ public class StationBlockEntity extends SmartBlockEntity implements ITransformab return false; BlockPos up = BlockPos.containing(track.getUpNormal(level, pos, state)); - BlockPos down = BlockPos.containing(track.getUpNormal(level, pos, state).scale(-1)); + BlockPos down = BlockPos.containing(track.getUpNormal(level, pos, state) + .scale(-1)); int bogeyOffset = pos.distManhattan(edgePoint.getGlobalPosition()) - 1; if (!isValidBogeyOffset(bogeyOffset)) { @@ -323,7 +330,9 @@ public class StationBlockEntity extends SmartBlockEntity implements ITransformab return false; } - boolean upsideDown = (player.getViewXRot(1.0F) < 0 && (track.getBogeyAnchor(level, pos, state)).getBlock() instanceof AbstractBogeyBlock bogey && bogey.canBeUpsideDown()); + boolean upsideDown = (player.getViewXRot(1.0F) < 0 + && (track.getBogeyAnchor(level, pos, state)).getBlock() instanceof AbstractBogeyBlock bogey + && bogey.canBeUpsideDown()); BlockPos targetPos = upsideDown ? pos.offset(down) : pos.offset(up); if (level.getBlockState(targetPos) @@ -376,7 +385,8 @@ public class StationBlockEntity extends SmartBlockEntity implements ITransformab continue; DiscoveredPath preferredPath = train.runtime.startCurrentInstruction(); - train.navigation.startNavigation(preferredPath != null ? preferredPath : train.navigation.findPathTo(station, Double.MAX_VALUE)); + train.navigation.startNavigation( + preferredPath != null ? preferredPath : train.navigation.findPathTo(station, Double.MAX_VALUE)); } } @@ -451,9 +461,10 @@ public class StationBlockEntity extends SmartBlockEntity implements ITransformab ItemStack schedule = train.runtime.returnSchedule(); if (schedule.isEmpty()) return; - if (sender != null && sender.getMainHandItem().isEmpty()) { + if (sender != null && sender.getMainHandItem() + .isEmpty()) { sender.getInventory() - .placeItemBackInInventory(schedule); + .placeItemBackInInventory(schedule); return; } @@ -522,14 +533,17 @@ public class StationBlockEntity extends SmartBlockEntity implements ITransformab } BlockState potentialBogeyState = level.getBlockState(bogeyOffset.offset(currentPos)); - BlockPos upsideDownBogeyOffset = new BlockPos(bogeyOffset.getX(), bogeyOffset.getY()*-1, bogeyOffset.getZ()); + BlockPos upsideDownBogeyOffset = + new BlockPos(bogeyOffset.getX(), bogeyOffset.getY() * -1, bogeyOffset.getZ()); if (bogeyIndex < bogeyLocations.length) { - if (potentialBogeyState.getBlock() instanceof AbstractBogeyBlock bogey && !bogey.isUpsideDown(potentialBogeyState)) { + if (potentialBogeyState.getBlock() instanceof AbstractBogeyBlock bogey + && !bogey.isUpsideDown(potentialBogeyState)) { bogeyTypes[bogeyIndex] = bogey; bogeyLocations[bogeyIndex] = i; upsideDownBogeys[bogeyIndex] = false; bogeyIndex++; - } else if ((potentialBogeyState = level.getBlockState(upsideDownBogeyOffset.offset(currentPos))).getBlock() instanceof AbstractBogeyBlock bogey && bogey.isUpsideDown(potentialBogeyState)) { + } else if ((potentialBogeyState = level.getBlockState(upsideDownBogeyOffset.offset(currentPos))) + .getBlock() instanceof AbstractBogeyBlock bogey && bogey.isUpsideDown(potentialBogeyState)) { bogeyTypes[bogeyIndex] = bogey; bogeyLocations[bogeyIndex] = i; upsideDownBogeys[bogeyIndex] = true; @@ -605,7 +619,8 @@ public class StationBlockEntity extends SmartBlockEntity implements ITransformab return; if (bogeyLocations[0] != 0) { - exception(new AssemblyException(CreateLang.translateDirect("train_assembly.frontmost_bogey_at_station")), -1); + exception(new AssemblyException(CreateLang.translateDirect("train_assembly.frontmost_bogey_at_station")), + -1); return; } @@ -638,7 +653,8 @@ public class StationBlockEntity extends SmartBlockEntity implements ITransformab break; if (loc - iPrevious < 3) { - exception(new AssemblyException(CreateLang.translateDirect("train_assembly.bogeys_too_close", i, i + 1)), -1); + exception( + new AssemblyException(CreateLang.translateDirect("train_assembly.bogeys_too_close", i, i + 1)), -1); return; } @@ -729,16 +745,19 @@ public class StationBlockEntity extends SmartBlockEntity implements ITransformab spacing.add(bogeyLocations[bogeyIndex] - bogeyLocations[bogeyIndex - 1]); CarriageContraption contraption = new CarriageContraption(assemblyDirection); BlockPos bogeyPosOffset = trackPosition.offset(bogeyOffset); - BlockPos upsideDownBogeyPosOffset = trackPosition.offset(new BlockPos(bogeyOffset.getX(), bogeyOffset.getY() * -1, bogeyOffset.getZ())); + BlockPos upsideDownBogeyPosOffset = + trackPosition.offset(new BlockPos(bogeyOffset.getX(), bogeyOffset.getY() * -1, bogeyOffset.getZ())); try { int offset = bogeyLocations[bogeyIndex] + 1; - boolean success = contraption.assemble(level, upsideDownBogeys[bogeyIndex] ? upsideDownBogeyPosOffset.relative(assemblyDirection, offset) : bogeyPosOffset.relative(assemblyDirection, offset)); + boolean success = contraption.assemble(level, + upsideDownBogeys[bogeyIndex] ? upsideDownBogeyPosOffset.relative(assemblyDirection, offset) + : bogeyPosOffset.relative(assemblyDirection, offset)); atLeastOneForwardControls |= contraption.hasForwardControls(); contraption.setSoundQueueOffset(offset); if (!success) { - exception(new AssemblyException(CreateLang.translateDirect("train_assembly.nothing_attached", bogeyIndex + 1)), - -1); + exception(new AssemblyException( + CreateLang.translateDirect("train_assembly.nothing_attached", bogeyIndex + 1)), -1); return; } } catch (AssemblyException e) { @@ -749,25 +768,28 @@ public class StationBlockEntity extends SmartBlockEntity implements ITransformab AbstractBogeyBlock typeOfFirstBogey = bogeyTypes[bogeyIndex]; boolean firstBogeyIsUpsideDown = upsideDownBogeys[bogeyIndex]; BlockPos firstBogeyPos = contraption.anchor; - AbstractBogeyBlockEntity firstBogeyBlockEntity = (AbstractBogeyBlockEntity) level.getBlockEntity(firstBogeyPos); - CarriageBogey firstBogey = - new CarriageBogey(typeOfFirstBogey, firstBogeyIsUpsideDown, firstBogeyBlockEntity.getBogeyData(), points.get(pointIndex), points.get(pointIndex + 1)); + AbstractBogeyBlockEntity firstBogeyBlockEntity = + (AbstractBogeyBlockEntity) level.getBlockEntity(firstBogeyPos); + CarriageBogey firstBogey = new CarriageBogey(typeOfFirstBogey, firstBogeyIsUpsideDown, + firstBogeyBlockEntity.getBogeyData(), points.get(pointIndex), points.get(pointIndex + 1)); CarriageBogey secondBogey = null; BlockPos secondBogeyPos = contraption.getSecondBogeyPos(); int bogeySpacing = 0; if (secondBogeyPos != null) { if (bogeyIndex == bogeyCount - 1 || !secondBogeyPos - .equals((upsideDownBogeys[bogeyIndex + 1] ? upsideDownBogeyPosOffset : bogeyPosOffset).relative(assemblyDirection, bogeyLocations[bogeyIndex + 1] + 1))) { - exception(new AssemblyException(CreateLang.translateDirect("train_assembly.not_connected_in_order")), + .equals((upsideDownBogeys[bogeyIndex + 1] ? upsideDownBogeyPosOffset : bogeyPosOffset) + .relative(assemblyDirection, bogeyLocations[bogeyIndex + 1] + 1))) { + exception( + new AssemblyException(CreateLang.translateDirect("train_assembly.not_connected_in_order")), contraptions.size() + 1); return; } AbstractBogeyBlockEntity secondBogeyBlockEntity = - (AbstractBogeyBlockEntity) level.getBlockEntity(secondBogeyPos); + (AbstractBogeyBlockEntity) level.getBlockEntity(secondBogeyPos); bogeySpacing = bogeyLocations[bogeyIndex + 1] - bogeyLocations[bogeyIndex]; - secondBogey = new CarriageBogey(bogeyTypes[bogeyIndex + 1], upsideDownBogeys[bogeyIndex + 1], secondBogeyBlockEntity.getBogeyData(), - points.get(pointIndex + 2), points.get(pointIndex + 3)); + secondBogey = new CarriageBogey(bogeyTypes[bogeyIndex + 1], upsideDownBogeys[bogeyIndex + 1], + secondBogeyBlockEntity.getBogeyData(), points.get(pointIndex + 2), points.get(pointIndex + 3)); bogeyIndex++; } else if (!typeOfFirstBogey.allowsSingleBogeyCarriage()) { @@ -814,7 +836,8 @@ public class StationBlockEntity extends SmartBlockEntity implements ITransformab train.collectInitiallyOccupiedSignalBlocks(); Create.RAILWAYS.addTrain(train); - AllPackets.getChannel().send(PacketDistributor.ALL.noArg(), new TrainPacket(train, true)); + AllPackets.getChannel() + .send(PacketDistributor.ALL.noArg(), new TrainPacket(train, true)); clearException(); award(AllAdvancements.TRAIN); @@ -932,4 +955,60 @@ public class StationBlockEntity extends SmartBlockEntity implements ITransformab edgePoint.transform(transform); } + // Package port integration + + public void attachPackagePort(PackagePortBlockEntity ppbe) { + GlobalStation station = getStation(); + if (station == null) + return; + + GlobalPackagePort globalPackagePort = new GlobalPackagePort(); + globalPackagePort.address = ppbe.addressFilter; + station.connectedPorts.put(ppbe.getBlockPos(), globalPackagePort); + } + + public void removePackagePort(PackagePortBlockEntity ppbe) { + GlobalStation station = getStation(); + if (station == null) + return; + + station.connectedPorts.remove(ppbe.getBlockPos()); + } + + public void tickPackagePorts() { + GlobalStation station = getStation(); + if (station == null) + return; + + boolean changed = false; + + for (Iterator> iterator = station.connectedPorts.entrySet() + .iterator(); iterator.hasNext();) { + Entry entry = iterator.next(); + BlockPos pos = entry.getKey(); + GlobalPackagePort port = entry.getValue(); + if (!level.isLoaded(pos)) + continue; + if (!(level.getBlockEntity(pos) instanceof PackagePortBlockEntity ppbe)) { + iterator.remove(); + changed = true; + continue; + } + + while (!port.inBuffer.isEmpty()) { + ItemStack itemStack = port.inBuffer.get(0); + ppbe.inventory.receiveMode(true); + ItemStack insertItem = ItemHandlerHelper.insertItem(ppbe.inventory, itemStack, false); + ppbe.inventory.receiveMode(false); + if (!insertItem.isEmpty()) + break; + port.inBuffer.remove(0); + changed = true; + } + } + + if (changed) + Create.RAILWAYS.markTracksDirty(); + } + } diff --git a/src/main/java/com/simibubi/create/foundation/events/InputEvents.java b/src/main/java/com/simibubi/create/foundation/events/InputEvents.java index cd3c522106..cf324e370f 100644 --- a/src/main/java/com/simibubi/create/foundation/events/InputEvents.java +++ b/src/main/java/com/simibubi/create/foundation/events/InputEvents.java @@ -5,6 +5,7 @@ import com.simibubi.create.content.contraptions.elevator.ElevatorControlsHandler import com.simibubi.create.content.equipment.toolbox.ToolboxHandlerClient; import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorInteractionHandler; import com.simibubi.create.content.kinetics.chainConveyor.ChainPackageInteractionHandler; +import com.simibubi.create.content.logistics.packagePort.PackagePortTargetSelectionHandler; import com.simibubi.create.content.redstone.link.controller.LinkedControllerClientHandler; import com.simibubi.create.content.trains.TrainHUD; import com.simibubi.create.content.trains.entity.TrainRelocator; @@ -92,6 +93,8 @@ public class InputEvents { if (ChainConveyorInteractionHandler.onUse()) event.setCanceled(true); + else if (PackagePortTargetSelectionHandler.onUse()) + event.setCanceled(true); DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { if (ChainPackageInteractionHandler.onUse()) From f39e422d8ab383fad9689ffb8f8e832045935f96 Mon Sep 17 00:00:00 2001 From: zelophed Date: Wed, 18 Sep 2024 18:24:36 +0200 Subject: [PATCH 049/515] fix imports --- .../simibubi/create/AllBlockEntityTypes.java | 6 ++-- .../com/simibubi/create/AllPartialModels.java | 4 +-- .../content/equipment/hats/EntityHats.java | 2 +- .../chainConveyor/ChainConveyorInstance.java | 28 ------------------- .../chainConveyor/ChainConveyorRenderer.java | 26 ++++++++--------- .../chainConveyor/ChainConveyorShape.java | 8 +++--- .../chainConveyor/ChainConveyorVisual.java | 20 +++++++++++++ .../logistics/box/PackageRenderer.java | 6 ++-- .../PackagePortFilterSlotPositioning.java | 6 ++-- .../logistics/packager/PackagerRenderer.java | 12 ++++---- .../stockTicker/StockTickerBlock.java | 2 +- .../ThresholdSwitchScreen.java | 8 +++--- 12 files changed, 60 insertions(+), 68 deletions(-) delete mode 100644 src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorInstance.java create mode 100644 src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorVisual.java diff --git a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java index 2b44e6be67..69d0caaf00 100644 --- a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java +++ b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java @@ -82,8 +82,8 @@ import com.simibubi.create.content.kinetics.belt.BeltBlockEntity; import com.simibubi.create.content.kinetics.belt.BeltRenderer; import com.simibubi.create.content.kinetics.belt.BeltVisual; import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorBlockEntity; -import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorInstance; import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorRenderer; +import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorVisual; import com.simibubi.create.content.kinetics.chainDrive.ChainGearshiftBlockEntity; import com.simibubi.create.content.kinetics.clock.CuckooClockBlockEntity; import com.simibubi.create.content.kinetics.clock.CuckooClockRenderer; @@ -365,7 +365,7 @@ public class AllBlockEntityTypes { public static final BlockEntityEntry CHAIN_CONVEYOR = REGISTRATE .blockEntity("chain_conveyor", ChainConveyorBlockEntity::new) - .instance(() -> ChainConveyorInstance::new) + .visual(() -> ChainConveyorVisual::new) .validBlocks(AllBlocks.CHAIN_CONVEYOR) .renderer(() -> ChainConveyorRenderer::new) .register(); @@ -845,7 +845,7 @@ public class AllBlockEntityTypes { public static final BlockEntityEntry PULSE_TIMER = REGISTRATE .blockEntity("pulse_timer", PulseTimerBlockEntity::new) - .instance(() -> BrassDiodeInstance::new, false) + .visual(() -> BrassDiodeVisual::new, false) .validBlocks(AllBlocks.PULSE_TIMER) .renderer(() -> BrassDiodeRenderer::new) .register(); diff --git a/src/main/java/com/simibubi/create/AllPartialModels.java b/src/main/java/com/simibubi/create/AllPartialModels.java index 8c6b004de5..4930b52c47 100644 --- a/src/main/java/com/simibubi/create/AllPartialModels.java +++ b/src/main/java/com/simibubi/create/AllPartialModels.java @@ -223,9 +223,9 @@ public class AllPartialModels { for (String size : new String[] { "12x12", "10x12", "12x10", "10x8" }) { ResourceLocation key = Create.asResource("cardboard_package_" + size); - PACKAGES.put(key, new PartialModel(Create.asResource("item/packages/cardboard_" + size))); + PACKAGES.put(key, PartialModel.of(Create.asResource("item/packages/cardboard_" + size))); PACKAGE_RIGGING.put(key, - new PartialModel(Create.asResource("item/packages/cardboard_" + size + "_rigging"))); + PartialModel.of(Create.asResource("item/packages/cardboard_" + size + "_rigging"))); } } diff --git a/src/main/java/com/simibubi/create/content/equipment/hats/EntityHats.java b/src/main/java/com/simibubi/create/content/equipment/hats/EntityHats.java index af955036ed..fec601d616 100644 --- a/src/main/java/com/simibubi/create/content/equipment/hats/EntityHats.java +++ b/src/main/java/com/simibubi/create/content/equipment/hats/EntityHats.java @@ -2,7 +2,6 @@ package com.simibubi.create.content.equipment.hats; import javax.annotation.Nullable; -import com.jozufozu.flywheel.core.PartialModel; import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.contraptions.Contraption; import com.simibubi.create.content.contraptions.actors.seat.SeatEntity; @@ -10,6 +9,7 @@ import com.simibubi.create.content.logistics.stockTicker.StockTickerBlock; import com.simibubi.create.content.trains.entity.CarriageContraption; import com.simibubi.create.content.trains.entity.CarriageContraptionEntity; +import dev.engine_room.flywheel.lib.model.baked.PartialModel; import net.createmod.catnip.utility.Couple; import net.createmod.catnip.utility.Iterate; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorInstance.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorInstance.java deleted file mode 100644 index f3c87b2130..0000000000 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorInstance.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.simibubi.create.content.kinetics.chainConveyor; - -import com.jozufozu.flywheel.api.Instancer; -import com.jozufozu.flywheel.api.Material; -import com.jozufozu.flywheel.api.MaterialManager; -import com.simibubi.create.AllPartialModels; -import com.simibubi.create.content.kinetics.base.SingleRotatingInstance; -import com.simibubi.create.content.kinetics.base.flwdata.RotatingData; -import com.simibubi.create.foundation.render.AllMaterialSpecs; - -public class ChainConveyorInstance extends SingleRotatingInstance { - - public ChainConveyorInstance(MaterialManager materialManager, ChainConveyorBlockEntity blockEntity) { - super(materialManager, blockEntity); - } - - @Override - protected Instancer getModel() { - return getRotatingMaterial().getModel(AllPartialModels.CHAIN_CONVEYOR_SHAFT, blockEntity.getBlockState()); - } - - @Override - protected Material getRotatingMaterial() { - return materialManager.defaultCutout() - .material(AllMaterialSpecs.ROTATING); - } - -} diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRenderer.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRenderer.java index 49eaccb862..7bac8621e8 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRenderer.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRenderer.java @@ -6,7 +6,6 @@ import java.util.Map.Entry; import org.joml.Matrix3f; import org.joml.Matrix4f; -import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.simibubi.create.AllPartialModels; @@ -16,6 +15,7 @@ import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorPackage.C import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.foundation.render.RenderTypes; +import dev.engine_room.flywheel.lib.transform.TransformStack; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.VecHelper; @@ -102,7 +102,7 @@ public class ChainConveyorRenderer extends KineticBlockEntityRenderer { + + public ChainConveyorVisual(VisualizationContext context, ChainConveyorBlockEntity blockEntity, float partialTick) { + super(context, blockEntity, partialTick); + } + + @Override + protected Model model() { + return Models.partial(AllPartialModels.CHAIN_CONVEYOR_SHAFT); + } +} diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageRenderer.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageRenderer.java index 53501204fa..56ec1d703a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageRenderer.java @@ -1,9 +1,9 @@ package com.simibubi.create.content.logistics.box; -import com.jozufozu.flywheel.core.PartialModel; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllPartialModels; +import dev.engine_room.flywheel.lib.model.baked.PartialModel; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.math.AngleHelper; @@ -31,7 +31,7 @@ public class PackageRenderer extends EntityRenderer { PartialModel model = AllPartialModels.PACKAGES.get(ForgeRegistries.ITEMS.getKey(box.getItem())); SuperByteBuffer sbb = CachedBuffers.partial(model, Blocks.AIR.defaultBlockState()); sbb.translate(-.5, 0, -.5) - .rotateCentered(Direction.UP, AngleHelper.rad(yaw)) + .rotateCentered(AngleHelper.rad(yaw), Direction.UP) .light(light) .nudge(entity.getId()); sbb.renderInto(ms, buffer.getBuffer(RenderType.solid())); @@ -43,4 +43,4 @@ public class PackageRenderer extends EntityRenderer { return null; } -} \ No newline at end of file +} diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortFilterSlotPositioning.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortFilterSlotPositioning.java index aa54032cc3..8cd7d418a6 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortFilterSlotPositioning.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortFilterSlotPositioning.java @@ -1,9 +1,9 @@ package com.simibubi.create.content.logistics.packagePort; -import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform; +import dev.engine_room.flywheel.lib.transform.TransformStack; import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction.Axis; @@ -21,7 +21,7 @@ public class PackagePortFilterSlotPositioning extends ValueBoxTransform { return !ppbe.isAnimationInProgress(); return true; } - + @Override public Vec3 getLocalOffset(LevelAccessor level, BlockPos pos, BlockState state) { float horizontalAngle = 0; @@ -38,7 +38,7 @@ public class PackagePortFilterSlotPositioning extends ValueBoxTransform { if (level != null && level.getBlockEntity(pos) instanceof PackagePortBlockEntity ppbe) horizontalAngle = ppbe.getYaw(); - TransformStack.cast(ms) + TransformStack.of(ms) .rotateY(horizontalAngle) .rotateX(90); } diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerRenderer.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerRenderer.java index ec1ed9aa97..6ee5549bed 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerRenderer.java @@ -1,12 +1,12 @@ package com.simibubi.create.content.logistics.packager; -import com.jozufozu.flywheel.core.PartialModel; -import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.logistics.packager.PackagerBlock.PackagerType; import com.simibubi.create.foundation.blockEntity.renderer.SmartBlockEntityRenderer; +import dev.engine_room.flywheel.lib.model.baked.PartialModel; +import dev.engine_room.flywheel.lib.transform.TransformStack; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.math.AngleHelper; @@ -44,13 +44,13 @@ public class PackagerRenderer extends SmartBlockEntityRenderer Date: Wed, 18 Sep 2024 20:37:35 +0200 Subject: [PATCH 050/515] fiXDegrees --- gradle.properties | 4 +-- .../contraptions/wrench/RadialWrenchMenu.java | 6 ++-- .../chainConveyor/ChainConveyorRenderer.java | 8 +++--- .../PackagePortFilterSlotPositioning.java | 4 +-- .../packagePort/PackagePortRenderer.java | 28 +++++++++---------- .../logistics/packager/PackagerRenderer.java | 2 +- 6 files changed, 26 insertions(+), 26 deletions(-) diff --git a/gradle.properties b/gradle.properties index 4749e91a69..3406040cdb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -28,8 +28,8 @@ jei_minecraft_version = 1.20.1 jei_version = 15.10.0.39 curios_minecraft_version = 1.20.1 curios_version = 5.3.1 -catnip_version = 0.8.11 -ponder_version = 0.8.8 +catnip_version = 0.8.13 +ponder_version = 0.8.10 cc_tweaked_enable = true cc_tweaked_minecraft_version = 1.20.1 diff --git a/src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchMenu.java b/src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchMenu.java index 02a8f83150..ddbd931098 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchMenu.java +++ b/src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchMenu.java @@ -251,7 +251,7 @@ public class RadialWrenchMenu extends AbstractSimiScreen { TransformStack.of(poseStack) .translateY(-(sectorWidth / 2f + innerRadius)) - .rotateZ(-i * sectorAngle); + .rotateZDegrees(-i * sectorAngle); try { GuiGameElement.of(blockState, blockEntity) @@ -277,7 +277,7 @@ public class RadialWrenchMenu extends AbstractSimiScreen { poseStack.pushPose(); TransformStack.of(poseStack) - .rotateZ(sectorAngle / 2); + .rotateZDegrees(sectorAngle / 2); poseStack.translate(0, -innerRadius - 20, 10); @@ -286,7 +286,7 @@ public class RadialWrenchMenu extends AbstractSimiScreen { poseStack.popPose(); TransformStack.of(poseStack) - .rotateZ(sectorAngle); + .rotateZDegrees(sectorAngle); } poseStack.popPose(); diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRenderer.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRenderer.java index 7bac8621e8..621bec7ec8 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRenderer.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRenderer.java @@ -106,13 +106,13 @@ public class ChainConveyorRenderer extends KineticBlockEntityRenderer Date: Thu, 19 Sep 2024 08:24:33 +0200 Subject: [PATCH 051/515] What we could have hat - Revert frogport texture change - Re-add logistics hat condition after merge --- .../equipment/hats/CreateHatArmorLayer.java | 43 ++---------------- .../assets/create/textures/block/port.png | Bin 718 -> 733 bytes 2 files changed, 4 insertions(+), 39 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/equipment/hats/CreateHatArmorLayer.java b/src/main/java/com/simibubi/create/content/equipment/hats/CreateHatArmorLayer.java index 087dbc66ca..88e1349522 100644 --- a/src/main/java/com/simibubi/create/content/equipment/hats/CreateHatArmorLayer.java +++ b/src/main/java/com/simibubi/create/content/equipment/hats/CreateHatArmorLayer.java @@ -4,17 +4,13 @@ import java.util.ArrayList; import java.util.List; import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.AllPartialModels; -import com.simibubi.create.content.contraptions.Contraption; -import com.simibubi.create.content.trains.entity.CarriageContraption; -import com.simibubi.create.content.trains.entity.CarriageContraptionEntity; import com.simibubi.create.content.trains.schedule.hat.TrainHatInfo; import com.simibubi.create.content.trains.schedule.hat.TrainHatInfoReloadListener; import com.simibubi.create.foundation.mixin.accessor.AgeableListModelAccessor; +import dev.engine_room.flywheel.lib.model.baked.PartialModel; import dev.engine_room.flywheel.lib.transform.TransformStack; import net.createmod.catnip.render.CachedBuffers; -import net.createmod.catnip.utility.Couple; import net.minecraft.client.model.AgeableListModel; import net.minecraft.client.model.EntityModel; import net.minecraft.client.model.HierarchicalModel; @@ -27,13 +23,9 @@ import net.minecraft.client.renderer.entity.EntityRenderer; import net.minecraft.client.renderer.entity.LivingEntityRenderer; import net.minecraft.client.renderer.entity.RenderLayerParent; import net.minecraft.client.renderer.entity.layers.RenderLayer; -import net.minecraft.core.BlockPos; import net.minecraft.util.Mth; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; @@ -45,7 +37,8 @@ public class CreateHatArmorLayer validSides = cc.conductorSeats.get(seatOf); - return validSides != null; - } - public static void registerOnAll(EntityRenderDispatcher renderManager) { for (EntityRenderer renderer : renderManager.getSkinMap() .values()) diff --git a/src/main/resources/assets/create/textures/block/port.png b/src/main/resources/assets/create/textures/block/port.png index 225af89fc6c60784a4a273856aff14672ac7c64a..d9e2d93e7c0406cd498b3a31534aefdf618c3613 100644 GIT binary patch delta 518 zcmV+h0{Q*U1>FUZ;eQYS01FTSts}j40005nNklYiBHR0Yffh;m#FexUg$8l6lq_#x$e4{!CZq>{6T7P^jUFh5+JLI=d-f4zc zGBee!x}$GEA4IIw3`a;1Rwd@vb^vcA$(VqEBL?AnA+zaeusECmR6MFbZXopLgx13j zLW#k1RJET@Kmz`R-E1oZ0`-t7bg0Wn{yZ0m)B9kS_-6Y>T44>!0&dk8K?mVCWe7UO z!X)K4p*rjjsegya?gzCZtqI5oG3|~BDYgev%F}NJ`%|*Nbe8E1d@fKE6xkj$I|G5t z-rLQ*iD0&aW~~JYeI?W(hCK~L8x`|;$1J#%M-wG?Ymzi z0{V`qBEr-t(AX~!gcoQ~t1K+j7x;|e-!<@G4xt7BB`bcnoDoC5<}m%{U5#?1)aXo< z&$+IH_iVs_1#tqDAw+S_Ad^>SAPC4KJK=WovUp)`x8XMX0Iu0EDT;r%b^rhX07*qo IM6N<$g1o!+;{X5v delta 503 zcmV!0-4x4` zZYwjdilnM$O(o&K3V~efxFMt%sP6k-FsNlqRL&QQbC6cOTz{|GpSe{!*H8z2>)@Sc zxFs`FU5Y2#0<=!VOwF)G4Z^I%ylpFhJ47-DAYhA5_@2pZWHv+`P5=rn)wctLwmD&I z5eFg1!!@ef4<|r?UlBK3az}-GPzoQ))Wx6Y1an&J%pC7*KS>LsL7BiU`Xp#4{33y& z!z>Jvya>f%zkf-+gm@m*0$BsF5oX#A6;dn@q$DG68S7KBKXm4i417$`6ExZGG)@Kz znZ1^q`5{8sb{f5|5cHW)x*7H$XmK?@v0f?&5k~BSEuNcnJja9ZmnugLQTE+}1VNRF zm$txaOb0pS(GYF`aI)ZY6DfFu&l*PF{8XdeXf;kI+UH#N!Ov{KKZWW9I76u7 t-ydx9&U6F;I>ZUb;cfB897j)^y#rapFVmmNJTU+O002ovPDHLkV1iN( Date: Thu, 19 Sep 2024 17:10:25 +0200 Subject: [PATCH 052/515] Fix unbalanced pose stack in BeltRenderer --- .../content/kinetics/belt/BeltRenderer.java | 4 ---- .../ThresholdSwitchScreen.java | 23 ++++++++++++------- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltRenderer.java b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltRenderer.java index 6a100f4ab4..60d8b5e0dd 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltRenderer.java +++ b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltRenderer.java @@ -227,10 +227,6 @@ public class BeltRenderer extends SafeBlockEntityRenderer { private void renderItem(BeltBlockEntity be, float partialTicks, PoseStack ms, MultiBufferSource buffer, int light, int overlay, Direction beltFacing, Vec3i directionVec, BeltSlope slope, int verticality, boolean slopeAlongX, boolean onContraption, TransportedItemStack transported, Vec3 beltStartOffset) { - ms.pushPose(); - TransformStack.of(ms) - .nudge(transported.angle); - Minecraft mc = Minecraft.getInstance(); ItemRenderer itemRenderer = mc.getItemRenderer(); MutableBlockPos mutablePos = new MutableBlockPos(); diff --git a/src/main/java/com/simibubi/create/content/redstone/thresholdSwitch/ThresholdSwitchScreen.java b/src/main/java/com/simibubi/create/content/redstone/thresholdSwitch/ThresholdSwitchScreen.java index b780b8ab7b..849d7d2f7c 100644 --- a/src/main/java/com/simibubi/create/content/redstone/thresholdSwitch/ThresholdSwitchScreen.java +++ b/src/main/java/com/simibubi/create/content/redstone/thresholdSwitch/ThresholdSwitchScreen.java @@ -28,6 +28,7 @@ import net.minecraft.client.gui.GuiGraphics; import net.minecraft.network.chat.Component; import net.minecraft.util.Mth; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.RedstoneTorchBlock; @@ -162,14 +163,16 @@ public class ThresholdSwitchScreen extends AbstractSimiScreen { } graphics.drawString(font, - Components.literal("\u2265 " + (forItems ? onAbove.getState() / valueStep - : blockEntity.format(onAbove.getState() / valueStep, stacks) - .getString())), + Components.literal("\u2265 " + (typeOfCurrentTarget == ThresholdType.UNSUPPORTED ? "" + : forItems ? onAbove.getState() / valueStep + : blockEntity.format(onAbove.getState() / valueStep, stacks) + .getString())), x + 53, y + 28, 0xFFFFFFFF, true); graphics.drawString(font, - Components.literal("\u2264 " + (forItems ? offBelow.getState() / valueStep - : blockEntity.format(offBelow.getState() / valueStep, stacks) - .getString())), + Components.literal("\u2264 " + (typeOfCurrentTarget == ThresholdType.UNSUPPORTED ? "" + : forItems ? offBelow.getState() / valueStep + : blockEntity.format(offBelow.getState() / valueStep, stacks) + .getString())), x + 53, y + 28 + 24, 0xFFFFFFFF, true); GuiGameElement.of(renderedItem).at(itemX, itemY, 0) .render(graphics); @@ -285,12 +288,16 @@ public class ThresholdSwitchScreen extends AbstractSimiScreen { } private void updateInputBoxes() { - boolean forItems = blockEntity.getTypeOfCurrentTarget() == ThresholdType.ITEM; + ThresholdType typeOfCurrentTarget = blockEntity.getTypeOfCurrentTarget(); + boolean forItems = typeOfCurrentTarget == ThresholdType.ITEM; final int valueStep = getValueStep(); inStacks.active = inStacks.visible = forItems; onAbove.setWidth(forItems ? 48 : 103); offBelow.setWidth(forItems ? 48 : 103); + onAbove.visible = typeOfCurrentTarget != ThresholdType.UNSUPPORTED; + offBelow.visible = typeOfCurrentTarget != ThresholdType.UNSUPPORTED; + int min = blockEntity.currentMinLevel + valueStep; int max = blockEntity.currentMaxLevel; onAbove.withRange(min, max + 1); From b9a903e4cccb398a8b8b41d625bf6c2e4abadcf2 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 20 Sep 2024 11:17:49 +0200 Subject: [PATCH 053/515] For a dollar name a frog - Package Port -> Package Frogport --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 43 +- .../b256105d8411632b0d585496ea8944a751a08034 | 546 ++++++++++++++++-- .../create/blockstates/package_frogport.json | 7 + .../create/blockstates/package_port.json | 7 - .../resources/assets/create/lang/en_ud.json | 2 +- .../resources/assets/create/lang/en_us.json | 2 +- .../create/models/item/package_frogport.json | 3 + .../create/models/item/package_port.json | 3 - ...ackage_port.json => package_frogport.json} | 4 +- .../tags/blocks/mineable/pickaxe.json | 2 +- .../simibubi/create/AllBlockEntityTypes.java | 12 +- .../java/com/simibubi/create/AllBlocks.java | 10 +- .../java/com/simibubi/create/AllPackets.java | 10 +- .../com/simibubi/create/AllPartialModels.java | 4 +- .../chainConveyor/ChainConveyorBlock.java | 2 +- .../ChainConveyorBlockEntity.java | 6 +- .../ChainConveyorInteractionHandler.java | 14 +- .../FrogportBlock.java} | 18 +- .../FrogportBlockEntity.java} | 18 +- .../FrogportConfigurationPacket.java} | 12 +- .../FrogportInventory.java} | 8 +- .../FrogportItem.java} | 8 +- .../FrogportPlacementPacket.java} | 16 +- .../FrogportRenderer.java} | 16 +- .../FrogportScreen.java} | 16 +- .../FrogportTarget.java} | 44 +- .../FrogportTargetSelectionHandler.java} | 20 +- .../PackagePortFilterSlotPositioning.java | 46 -- .../packager/PackagerBlockEntity.java | 4 +- .../content/trains/station/GlobalStation.java | 4 +- .../trains/station/StationBlockEntity.java | 8 +- .../foundation/events/ClientEvents.java | 4 +- .../create/foundation/events/InputEvents.java | 4 +- .../block.json | 0 .../body.json | 0 .../head.json | 0 .../item.json | 0 .../tongue.json | 0 38 files changed, 681 insertions(+), 242 deletions(-) create mode 100644 src/generated/resources/assets/create/blockstates/package_frogport.json delete mode 100644 src/generated/resources/assets/create/blockstates/package_port.json create mode 100644 src/generated/resources/assets/create/models/item/package_frogport.json delete mode 100644 src/generated/resources/assets/create/models/item/package_port.json rename src/generated/resources/data/create/loot_tables/blocks/{package_port.json => package_frogport.json} (75%) rename src/main/java/com/simibubi/create/content/logistics/{packagePort/PackagePortBlock.java => frogport/FrogportBlock.java} (84%) rename src/main/java/com/simibubi/create/content/logistics/{packagePort/PackagePortBlockEntity.java => frogport/FrogportBlockEntity.java} (94%) rename src/main/java/com/simibubi/create/content/logistics/{packagePort/PackagePortConfigurationPacket.java => frogport/FrogportConfigurationPacket.java} (74%) rename src/main/java/com/simibubi/create/content/logistics/{packagePort/PackagePortInventory.java => frogport/FrogportInventory.java} (86%) rename src/main/java/com/simibubi/create/content/logistics/{packagePort/PackagePortItem.java => frogport/FrogportItem.java} (74%) rename src/main/java/com/simibubi/create/content/logistics/{packagePort/PackagePortPlacementPacket.java => frogport/FrogportPlacementPacket.java} (80%) rename src/main/java/com/simibubi/create/content/logistics/{packagePort/PackagePortRenderer.java => frogport/FrogportRenderer.java} (90%) rename src/main/java/com/simibubi/create/content/logistics/{packagePort/PackagePortScreen.java => frogport/FrogportScreen.java} (90%) rename src/main/java/com/simibubi/create/content/logistics/{packagePort/PackagePortTarget.java => frogport/FrogportTarget.java} (79%) rename src/main/java/com/simibubi/create/content/logistics/{packagePort/PackagePortTargetSelectionHandler.java => frogport/FrogportTargetSelectionHandler.java} (87%) delete mode 100644 src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortFilterSlotPositioning.java rename src/main/resources/assets/create/models/block/{package_port => package_frogport}/block.json (100%) rename src/main/resources/assets/create/models/block/{package_port => package_frogport}/body.json (100%) rename src/main/resources/assets/create/models/block/{package_port => package_frogport}/head.json (100%) rename src/main/resources/assets/create/models/block/{package_port => package_frogport}/item.json (100%) rename src/main/resources/assets/create/models/block/{package_port => package_frogport}/tongue.json (100%) diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index cbba15d147..7472774bbb 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-09-02T22:36:27.3056283 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-09-20T10:47:27.6079349 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -52,6 +52,7 @@ debf33346bf410216f21082e1e8d07aa6250b84c assets/create/blockstates/brown_nixie_t 440b29e1dffa4374ddc1aed444bff18a485bc1cb assets/create/blockstates/brown_valve_handle.json 2064534de4791b339fdcd4ef3a8129a2e233ec50 assets/create/blockstates/calcite_pillar.json 060c957b28afed9f4e0954cbef7e80cbf4b99f58 assets/create/blockstates/cart_assembler.json +fab98b93ad9b78312742daca83c2575db40fce98 assets/create/blockstates/chain_conveyor.json c7eca70054241944171b1d4ffcba0376b071ec62 assets/create/blockstates/chocolate.json 9eb989b0a0545af9efd052d1f127b2ec28a972d1 assets/create/blockstates/chute.json b5170d754ce5f07ea2b4646eb07c099c50bae249 assets/create/blockstates/clipboard.json @@ -346,6 +347,9 @@ ac536ae742c12e97bfd0b2483c87ff29f3935eaf assets/create/blockstates/oxidized_copp 110a6c19bcc9f044e5e982ac6e4b295b03ec0145 assets/create/blockstates/oxidized_copper_tiles.json 3f3924f0f0e368edfa04f4fdd6d6c2319276ddfe assets/create/blockstates/oxidized_copper_tile_slab.json 5e634cfb9abb06d8b29f39d751fc56b28ea5a9cd assets/create/blockstates/oxidized_copper_tile_stairs.json +ef3af446b56c69e71a156d5998d9dc8e6d9ea4f5 assets/create/blockstates/packager.json +0f204afc6712a08d2db84bb07a0a49927f3127a6 assets/create/blockstates/packager_link.json +887565a0f89f089d6be888c87394dde4878afda7 assets/create/blockstates/package_frogport.json 36742cc6ce052ead143366d31b11e828a525c1b8 assets/create/blockstates/peculiar_bell.json 53d102e706d53cb2c0dbc0bc11da828084a43519 assets/create/blockstates/pink_nixie_tube.json 213da5c04a33ae8ae7c0a4dec9844bbb6d670e33 assets/create/blockstates/pink_sail.json @@ -418,6 +422,7 @@ b1f5ad596067cb4c84eb53b2c7b359be76f1cfbe assets/create/blockstates/powered_shaft df7af1e49c53ae99ac3f0b2fca5d948b8ea91938 assets/create/blockstates/pulley_magnet.json 89d763258c53aa12a1e0c0e586ab701f3de5a1b5 assets/create/blockstates/pulse_extender.json 81281435b8d1eeb4f1e318c6d14d49fa1fd86820 assets/create/blockstates/pulse_repeater.json +65bfd8283749117663f7199204691758fd286e38 assets/create/blockstates/pulse_timer.json b658654aa97e8dd2c897f432a601835a3f8aca10 assets/create/blockstates/purple_nixie_tube.json f8f9802df9c0b4e39edeefc3b1abb38255d79801 assets/create/blockstates/purple_sail.json 91b5ab66d7ec5235d278ee2bed6ddd88f39ce81d assets/create/blockstates/purple_seat.json @@ -428,6 +433,7 @@ f8f9802df9c0b4e39edeefc3b1abb38255d79801 assets/create/blockstates/purple_sail.j 7ce346fa18702f6fe6e2a939efcfa26eda63fe38 assets/create/blockstates/raw_zinc_block.json ec546afd3ec8036e4393b97d535f05a86f57dbc1 assets/create/blockstates/redstone_contact.json ff205f032b36486753dddb1f2029ef8d53e9c86f assets/create/blockstates/redstone_link.json +e3e0ea8069b354c29103948d0b5e79094587ef85 assets/create/blockstates/redstone_requester.json e3fd62e466e3e6e7bd6fc8661f764ba972a466fc assets/create/blockstates/red_nixie_tube.json 4c36b562da58ef2af57009da7cf2426059249228 assets/create/blockstates/red_sail.json 145f4e9ffaeff9be180e6c4e4989f2cf44cf0686 assets/create/blockstates/red_seat.json @@ -521,6 +527,7 @@ a60c9c8241e40c2e28f5760c0ca6e80cfe9d59f3 assets/create/blockstates/steam_whistle 8865500bcd2e4d467e74edb3509850fa92a5809f assets/create/blockstates/sticker.json bed0534e618105184bc877b104230403ca85bb58 assets/create/blockstates/sticky_mechanical_piston.json bab242ab794e6d439645c2d5a0242ae7c81942ff assets/create/blockstates/stockpile_switch.json +9989bda294fbffc5f659d2e608e01dea424c7694 assets/create/blockstates/stock_ticker.json a70c025de5d85180f371ff05bbdc531d8bdfaab1 assets/create/blockstates/stressometer.json 8086f80c532fad42b37fcdc590b890ed7e8c3fe9 assets/create/blockstates/tiled_glass.json 1143ab7223c655764a81ed72ac385ea179664072 assets/create/blockstates/tiled_glass_pane.json @@ -585,8 +592,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -d3d30a92e4f63e8acb6aa3e3358b6e8340aa8cc1 assets/create/lang/en_ud.json -a50be2f8a02b0fdd2b5a8aae9cf8df1490015707 assets/create/lang/en_us.json +773a3d7251df0a088d1d7803e52c47d4af012ee9 assets/create/lang/en_ud.json +dbdd1e43e5ce8243cc2f202e69102e21771b6568 assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -1385,6 +1392,9 @@ b21ec7cde56398b65f44922ddb026d9adb7b6072 assets/create/models/block/polished_cut 66374fdc4d3d55f99b03e406f3b594f8b1bab94d assets/create/models/block/pulse_repeater_powered.json 6bd0d85ca18b468bee279e7bc398bc8395e33a8b assets/create/models/block/pulse_repeater_powered_powering.json de0cc956e7ff1510d0947ca8fd2b6e642944f0ee assets/create/models/block/pulse_repeater_powering.json +addbe93af945ff7ca2680a27225db804d3ac9b46 assets/create/models/block/pulse_timer_powered.json +ab3d7e10abcb53b835d6f5c406b7a777a942d6f7 assets/create/models/block/pulse_timer_powered_powering.json +7b425d9db8d914b52b7faad2f792c020b678f84d assets/create/models/block/pulse_timer_powering.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/purple_nixie_tube.json 356378a5839b0b400aa5e0a67740634113c09a38 assets/create/models/block/purple_sail.json bc8e473a5662b6180b00b85e5006241a283c9baa assets/create/models/block/purple_seat.json @@ -1721,7 +1731,12 @@ fce64539b36fc8a5ffa39d7a3f73765818437cbf assets/create/models/item/brown_seat.js 9477ab491586f1314bebf4d58387425ae56d0bad assets/create/models/item/brown_valve_handle.json 1db479848369140bb913ba09f3f1d994e4ac864c assets/create/models/item/builders_tea.json f5ff4e2ed2ea2e43b6d02f6a95ba02b2e4b611dc assets/create/models/item/calcite_pillar.json +45d7fa87d102a0373a06a13592f58baafa4e5a33 assets/create/models/item/cardboard_package_10x12.json +f998f36d9a6f469bbd3822a17b2b45f81e6810c6 assets/create/models/item/cardboard_package_10x8.json +b7a24a7dd21a464815b2fd8cd6037e854be3f485 assets/create/models/item/cardboard_package_12x10.json +d5396690e7813c67ee3600555d7e47d0097b1f56 assets/create/models/item/cardboard_package_12x12.json 1cdb2b8801551c1540bb9b2a9cc3d725a2b433e7 assets/create/models/item/cart_assembler.json +390a06d81c8c2a0ff83196bd0154dd292206e3b6 assets/create/models/item/chain_conveyor.json a197d08618f4035182c91a6b16031eb681ab8a7c assets/create/models/item/chest_minecart_contraption.json 293cfa8b1073f8641a2c623b73a90907576c36ed assets/create/models/item/chocolate_bucket.json 77654cbd16cdfa95181ea3f85fcfa3cd352b69fd assets/create/models/item/chocolate_glazed_berries.json @@ -2037,6 +2052,10 @@ c9c7ccdb68de2e77cd9f7053fab19493dd30a985 assets/create/models/item/oxidized_copp 1c3428e2aed32a013631db012642a34d4eaf0785 assets/create/models/item/oxidized_copper_tiles.json f1af7c5f3840efc3ae07940ee6719eb3417a0e1a assets/create/models/item/oxidized_copper_tile_slab.json ef2fe68d407a03bf1ed8f2d2f3e7323777d061bb assets/create/models/item/oxidized_copper_tile_stairs.json +b21a1f3ee7de3e17f69d27fd13ae6b23b62aa22c assets/create/models/item/packager.json +a8538df19e47fe37401c9fbedbb867b5d612a51b assets/create/models/item/packager_link.json +5b974e55caffdbfc2156eb8b59dd99db12243bd3 assets/create/models/item/package_filter.json +7fd76e7d2e6c6d94352f1fa08d096b63616ad01e assets/create/models/item/package_frogport.json 76aeceb41bb7df873dbafe1bd5e26deb24abf93f assets/create/models/item/peculiar_bell.json df13d4281dc45041ecd93504d45daef61d070581 assets/create/models/item/pink_seat.json 842afb2a345dbaba857e90f7dffa724841ef7b2d assets/create/models/item/pink_toolbox.json @@ -2110,6 +2129,7 @@ bd70b798ca9f73f4e5aabc30e286487f5363122e assets/create/models/item/precision_mec d9a736e7a6fc70e0848de3e318c739d58b1e563f assets/create/models/item/propeller.json 9b41eec5759887be9bae3d27654bf478a7eff676 assets/create/models/item/pulse_extender.json ea76bd3bd9e5bea4d64d91347d473b538e926b02 assets/create/models/item/pulse_repeater.json +6ff9ce0cc633ea39b779b2e873a1d0fd7cfe7119 assets/create/models/item/pulse_timer.json 7e165f83266edf34bb03fa3e8d2a83d44829c10a assets/create/models/item/purple_seat.json d75c4969334f2ee1ae4a3d8ac28b001735c76b97 assets/create/models/item/purple_toolbox.json ebffb05119f499fcec051a4337aadc47654baed2 assets/create/models/item/purple_valve_handle.json @@ -2119,6 +2139,7 @@ f91405b9aec1e0142c1b90582e03a1973251da05 assets/create/models/item/radial_chassi 4631d67976cef148c346a7016baaa6703e4f243e assets/create/models/item/raw_zinc_block.json 9dc6c52e258b00cac6ed23147983045c43218b5d assets/create/models/item/redstone_contact.json f8f733364bdd32b2ad597e81103bc02344ce63bd assets/create/models/item/redstone_link.json +f526dee8bc213b3d87cbc79350eb37b61b0eee79 assets/create/models/item/redstone_requester.json 8d00eb1a10055a802556eab10e13f522d12acd1c assets/create/models/item/red_sand_paper.json b64a054c92cbd2e055502d470f3921d1077e63a1 assets/create/models/item/red_seat.json ac4695cc465d094b4adba1a4e9efec42c916f37d assets/create/models/item/red_toolbox.json @@ -2215,6 +2236,7 @@ b82ab0c69df330f6f938ed1beee7b4add67d2e50 assets/create/models/item/steam_engine. 54f200be903e056e5cf9e2186f0a0a51f8f0f84e assets/create/models/item/sticker.json 0f88de164439640cc175ceef2017f7416b5a7018 assets/create/models/item/sticky_mechanical_piston.json 4b640b66765b206f8c2884b7c1a1ef860b81d841 assets/create/models/item/stockpile_switch.json +67c98c6c7f2122850acfbee34688572934fdd226 assets/create/models/item/stock_ticker.json 6ee792277b9fd980c40e18e841afa63fc500ed0b assets/create/models/item/stressometer.json 8d4ce1ccf180016506292f63188c10d0dabe0ee3 assets/create/models/item/sturdy_sheet.json a10bb4d6d1a4483a806e3aaa086d48c0e20aaefe assets/create/models/item/super_glue.json @@ -2997,6 +3019,7 @@ d391cff5b741fd6ddf5b6fa64e05526eb3a9f0d9 data/create/loot_tables/blocks/brown_ni 7c7cf4c30786f6e0a699e2b3f9120343e53107f4 data/create/loot_tables/blocks/brown_valve_handle.json 06d1c478e4236210aa12b5911691868fef33bb5f data/create/loot_tables/blocks/calcite_pillar.json 515c839deea520b07b03f7ba65c4a7b22fdf5ba3 data/create/loot_tables/blocks/cart_assembler.json +aadd8aa7f8433896bd4fea56f43e496cbc5be25a data/create/loot_tables/blocks/chain_conveyor.json fb4877d45df15be1a74378ab28f23fbf9d0657ef data/create/loot_tables/blocks/chute.json ace9255cbdd1af5e5068916d2a6bed2f861f81f1 data/create/loot_tables/blocks/clipboard.json bfd871acdde6c239098ead188a5aad7636d11bc0 data/create/loot_tables/blocks/clockwork_bearing.json @@ -3288,6 +3311,9 @@ f47a01824093455030fca66e7b8a39bcfc61d219 data/create/loot_tables/blocks/oxidized 4d2a2863697664b3b71f02aa703c3504cd5cc826 data/create/loot_tables/blocks/oxidized_copper_tiles.json 4d815b361af81bd0c0e14c853ca54ad3cde66a57 data/create/loot_tables/blocks/oxidized_copper_tile_slab.json d599ef03d1b69e4367ec0dea78f52c1964c99f9b data/create/loot_tables/blocks/oxidized_copper_tile_stairs.json +ab8cee7abd7dd92428bf7d8f0f5edd35082401a4 data/create/loot_tables/blocks/packager.json +e5df1b8ead9e575ed06f2040a7c9cc72c7a71b49 data/create/loot_tables/blocks/packager_link.json +54aa9700df601640b705d912abe773d5b6ee2b1f data/create/loot_tables/blocks/package_frogport.json 58bd9fe9d6706998bfbda3b077cfd0a740972091 data/create/loot_tables/blocks/peculiar_bell.json 4d7724df6fefee4512c4f7886d0e103d1dc39510 data/create/loot_tables/blocks/pink_nixie_tube.json 85811771fbc36f645fdb9f510639715399503c99 data/create/loot_tables/blocks/pink_sail.json @@ -3360,6 +3386,7 @@ afe84b9468fba532acc447236a9a0cbdd02c4560 data/create/loot_tables/blocks/powered_ fbc433a7e8518860bc828a52b56dba92e4dff66c data/create/loot_tables/blocks/pulley_magnet.json e654e6cedc0373e97caea947e7e605bc4095da88 data/create/loot_tables/blocks/pulse_extender.json 422385f062dd63edaf246c42fb0e617e92e6cc44 data/create/loot_tables/blocks/pulse_repeater.json +93f0c41aedaa2b9baceda78b93a4b3198962e3f9 data/create/loot_tables/blocks/pulse_timer.json 6f453ea136098a5872aeb4e2ad1e5b78d2fd571f data/create/loot_tables/blocks/purple_nixie_tube.json c6b7a02db55cf0824a48156adf469c478dfd6a8d data/create/loot_tables/blocks/purple_sail.json 73cd7cc36fafb491666d2bccf1b4f24624b3c8f2 data/create/loot_tables/blocks/purple_seat.json @@ -3370,6 +3397,7 @@ c6b7a02db55cf0824a48156adf469c478dfd6a8d data/create/loot_tables/blocks/purple_s f76e5a157d2aeab5708f464b1f3c8e47b3855f18 data/create/loot_tables/blocks/raw_zinc_block.json bbc2d61eeea335f8f011d799ef6a5484ca027640 data/create/loot_tables/blocks/redstone_contact.json 4fa70deeac7e56121e42fb602dfa27ee1727f749 data/create/loot_tables/blocks/redstone_link.json +efc3a5595e4daf67fa43f84c9869dfc76fd6fca4 data/create/loot_tables/blocks/redstone_requester.json a50e1c28af16e9f1b4f48aa974461167139768a7 data/create/loot_tables/blocks/red_nixie_tube.json 977d724cddf8eba053a3310ad0d30af15199bbed data/create/loot_tables/blocks/red_sail.json 9aedede893e2127a1cdd17695699397d8d5c6ce5 data/create/loot_tables/blocks/red_seat.json @@ -3463,6 +3491,7 @@ cae1bd9100b62841e260880faa80e2442f44a141 data/create/loot_tables/blocks/steam_wh 0bc3fdde351129e3a261a2420aff9d3f063c235e data/create/loot_tables/blocks/sticker.json 074f526902cb5fcff2129614428aba1ea05a6649 data/create/loot_tables/blocks/sticky_mechanical_piston.json a7332324e63f7d28621ddfbd54eb3d091461d890 data/create/loot_tables/blocks/stockpile_switch.json +f4fa9bb255348dc79dcc0468b3beb9ad075eb036 data/create/loot_tables/blocks/stock_ticker.json b13496b1b4bc0be30605832e23894fb374dd796e data/create/loot_tables/blocks/stressometer.json 6a7df4d2730d57ae6e404b4bc8e01367e5ddbf07 data/create/loot_tables/blocks/tiled_glass.json 0ad584e41780dc0183af1fa1e49e126730dfdbab data/create/loot_tables/blocks/tiled_glass_pane.json @@ -4183,7 +4212,7 @@ f675c20350ed60da4878b5d6301f02c8c05624bd data/create/tags/blocks/fan_processing_ 06e13efbb7b0d09ff7ecd1a7dc45a0760b91ad67 data/create/tags/blocks/ore_override_stone.json a5874f73c7dc0a3ae12999e6ae8abf45bc7fb9be data/create/tags/blocks/passive_boiler_heaters.json 9bc8c13fd80bdbe7f767b91ee1a1042e9aff02b0 data/create/tags/blocks/roots.json -79ed9149ee2ce143114db4ccafda8a2b6a293aac data/create/tags/blocks/safe_nbt.json +55dccb895bbdacfbd6ee9005486cd3fe9df01249 data/create/tags/blocks/safe_nbt.json 79418bd729cef417b322cef9b491e7ae83317d61 data/create/tags/blocks/seats.json 5def5088f7fd31b80e6f28c1c4ea146aa9d7d15b data/create/tags/blocks/toolboxes.json 2589b135c0e96ad29076569e144528fe32ea5b39 data/create/tags/blocks/tracks.json @@ -4243,7 +4272,7 @@ de1fc89be6a52473d526d3efe0204b9b8489058c data/forge/tags/blocks/glass_panes.json 81b107ada9c6ac5679a21f8c6a006bf230f69c39 data/forge/tags/blocks/ores/zinc.json e475ad1c52bffedfc544e5331a87c1f5c45149fd data/forge/tags/blocks/ores_in_ground/deepslate.json 2f6068972e364599b6849dc46fcb0724d4219d53 data/forge/tags/blocks/ores_in_ground/stone.json -2589b135c0e96ad29076569e144528fe32ea5b39 data/forge/tags/blocks/relocation_not_supported.json +8a5988e68f3a41341b486784c29d00e16d5272f7 data/forge/tags/blocks/relocation_not_supported.json b3af02a6fa3dc41bc3f4db933485f22b202deea3 data/forge/tags/blocks/storage_blocks.json 7d10cdf9e46a79753d4437c7bb958e3ab8bf0c89 data/forge/tags/blocks/storage_blocks/andesite_alloy.json 70bba470740dc7a77f51b4cb1747a105b62d4bde data/forge/tags/blocks/storage_blocks/brass.json @@ -4297,8 +4326,8 @@ c741ba83b562ae3459d7c4f2db69537f549ea411 data/forge/tags/items/tools/wrench.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/dripstone_replaceable_blocks.json e3321ff14704c031a2c16953b7e391f4f24dd70b data/minecraft/tags/blocks/impermeable.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/lush_ground_replaceable.json -5a030817b2322e363edc8f5376f7c9de73df8b48 data/minecraft/tags/blocks/mineable/axe.json -d794a156fdc9ec9e7c935b3b8962206b7b82eb79 data/minecraft/tags/blocks/mineable/pickaxe.json +cb2f3843d82d0d56ecdb5333cf02fc1ea59b3792 data/minecraft/tags/blocks/mineable/axe.json +e6871c129f1649792733aca364cf0a6c18104787 data/minecraft/tags/blocks/mineable/pickaxe.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/moss_replaceable.json 0c13aae0eeb99e89febe8dbe5e002af2ff843a9e data/minecraft/tags/blocks/needs_iron_tool.json 3cb2a92cbdf32ed5978f740dc378d363306c3e84 data/minecraft/tags/blocks/needs_stone_tool.json diff --git a/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 b/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 index 256023d181..9429f80248 100644 --- a/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 +++ b/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 @@ -1,10 +1,11 @@ -// 1.20.1 2023-11-12T13:36:18.9138626 Create's Processing Recipes +// 1.20.1 2024-09-20T10:47:27.5889856 Create's Processing Recipes 3c94326fb730f68c1e44fe1e2ef09c9db6ffd92b data/create/recipes/compacting/andesite_from_flint.json 8d3d5b31f3601b9f681ff710e0545a483a1494c6 data/create/recipes/compacting/blaze_cake.json 8bd7f4e3a686ab520b2d55594d2018d0e9a50c91 data/create/recipes/compacting/chocolate.json 5e2514e027cc0dbad48160e6b8e5bf0f25eba8f0 data/create/recipes/compacting/diorite_from_flint.json 54c94ae8d964dba1de2441088f6a312c687cbf71 data/create/recipes/compacting/granite_from_flint.json c558dddeacf6f8bfa29d74b68093ecfea619d43f data/create/recipes/compacting/honey.json +d4dc546ff711eae1a0621ede8b63897037a88bd1 data/create/recipes/compacting/ice.json e00be6905b6bcf72de937e3fe8bbceee6440a6b1 data/create/recipes/crushing/aluminum_ore.json 60262e911676a7f8309408fd15b373f1498493b9 data/create/recipes/crushing/amethyst_block.json 8e20ddc94fda889dbac25de59e7a3158984098c3 data/create/recipes/crushing/amethyst_cluster.json @@ -12,10 +13,75 @@ e00be6905b6bcf72de937e3fe8bbceee6440a6b1 data/create/recipes/crushing/aluminum_o c444abdd432670f6a2b508c513302e119cb07186 data/create/recipes/crushing/asurine_recycling.json 66b51fd1036641802667338a1d79a825a338077c data/create/recipes/crushing/blaze_rod.json 29e7e74108755e0a07b1d3d1e8d4dcaf2b401572 data/create/recipes/crushing/coal_ore.json +d9a48b3aa36cfe4f792a31fd3ee50b442c1177f9 data/create/recipes/crushing/compat/aether/ambrosium_ore.json +81bdb03461bec6f8ca1201caa93805a751d7cda6 data/create/recipes/crushing/compat/aether/zanite_ore.json +73914b149bbd72251c1bd9a54cf6d087f6b2ba0b data/create/recipes/crushing/compat/byg/ametrine_ore.json +d468d9fbd206bd78dc3cc37ce6fcccbc3a89bc5c data/create/recipes/crushing/compat/byg/anthracite_ore.json +3481a8838049addc6d3514615fccab01a7eda830 data/create/recipes/crushing/compat/byg/blue_nether_gold_ore.json +d7ad1072113e56e3efa572c3d7d1508499015818 data/create/recipes/crushing/compat/byg/blue_nether_quartz_ore.json +ea09b911ec971760574868ffc48da4dafd836d3d data/create/recipes/crushing/compat/byg/brimstone_nether_gold_ore.json +f9cf46d9d2fc78a3d4092ae0baf9cf90fb7f38ca data/create/recipes/crushing/compat/byg/brimstone_nether_quartz_ore.json +94274bdc8fd928576ea380dd90f33b79b507b647 data/create/recipes/crushing/compat/byg/cryptic_redstone_ore.json +b4e8eed87747da8dfdfe2ad3ffd8534b900b38ad data/create/recipes/crushing/compat/byg/emeraldite_ore.json +9c6b0c1f78c5027b4e781f3126a734b65cb40f46 data/create/recipes/crushing/compat/byg/lignite_ore.json +06bae2f87dfe431c1f5df9675de5ce2a6aac7802 data/create/recipes/crushing/compat/byg/pervaded_netherrack.json +a7177964fe7921dbca27197c6271d6d8c5264665 data/create/recipes/crushing/compat/byg/red_rock.json +808305f43b6a4d3fe2030ba55a86c510346ff164 data/create/recipes/crushing/compat/druidcraft/amber_ore.json +ae0691d4885a8b67c1ba1f7f3b4f8fc6db9de403 data/create/recipes/crushing/compat/druidcraft/fiery_glass_ore.json +375daf4d1a5d847a253ce817b8fe99d47526cbb5 data/create/recipes/crushing/compat/druidcraft/moonstone_ore.json +6a2927807d18873b9eccfe4e9eb915ea7d829cba data/create/recipes/crushing/compat/elementaryores/ore_coal_end.json +fb4bbcf76c49643f0e4afc1bcf343d1eb07e5236 data/create/recipes/crushing/compat/elementaryores/ore_coal_nether.json +e8c0e1258cf047b986693609b19d94c603d12d14 data/create/recipes/crushing/compat/elementaryores/ore_copper_end.json +f66bc876f13b7523917f60ef4cf0d9faa99883df data/create/recipes/crushing/compat/elementaryores/ore_copper_nether.json +e0b7f9cd217387dfacb9e6e3741ef226ee519d6c data/create/recipes/crushing/compat/elementaryores/ore_diamond_end.json +8e1898aeccb293ba69b19678576eabb870a22ad7 data/create/recipes/crushing/compat/elementaryores/ore_diamond_nether.json +fd27de35297f21376e9d1054409f6c2ed1fe68ed data/create/recipes/crushing/compat/elementaryores/ore_emerald_end.json +587cfb12b91ac731f9e9a9dd7ee387b221bd286c data/create/recipes/crushing/compat/elementaryores/ore_emerald_nether.json +f1303c38024d102c2885babd59f50fcfb2f20b8c data/create/recipes/crushing/compat/elementaryores/ore_ender_end.json +fa4af21ec7ca9d6bd96278135b2007ebca0f70cc data/create/recipes/crushing/compat/elementaryores/ore_ghast_nether.json +4222415db5c5c0cc8aafbfdbcebd295c377bb44b data/create/recipes/crushing/compat/elementaryores/ore_iron_nether.json +42a9c2ddfac196865694db470638c81f73c46bb9 data/create/recipes/crushing/compat/elementaryores/ore_lapis_end.json +eac0542063e8718c9788c8b60144e35bbfdfcb24 data/create/recipes/crushing/compat/elementaryores/ore_lapis_nether.json +afed14982eb85caf831e84a7e4309aa166f53823 data/create/recipes/crushing/compat/elementaryores/ore_redstone_end.json +d98fab5641d0b4245d27bf0e3ce60676fb1980eb data/create/recipes/crushing/compat/exnihilosequentia/andesite.json +4153b4d4aaa532f93af0b12b8c65c665687d7dcd data/create/recipes/crushing/compat/exnihilosequentia/crushed_diorite.json +dc2553cb5b88b17b50b39d4f1177b3985d7d2700 data/create/recipes/crushing/compat/exnihilosequentia/crushed_netherrack.json +b45d8a7aaad59c5168140f185c74555c1d78770f data/create/recipes/crushing/compat/exnihilosequentia/diorite.json +4fd1a7c2a564dd60b11688cfed12f9531bd7e0f1 data/create/recipes/crushing/compat/exnihilosequentia/dust.json +92b384f37ff0b4b95a4e0f0a9a373b8439c5c3cf data/create/recipes/crushing/compat/exnihilosequentia/end_stone.json +9ad3bd8dce2178bcda4990681a7845365fb30a77 data/create/recipes/crushing/compat/exnihilosequentia/granite.json +c9f6c53c34c4891a245dd9515eb573b40b4f3e0b data/create/recipes/crushing/compat/exnihilosequentia/netherrack.json +0fedb41388b4f04e544f45d7182d91b2e9230bc6 data/create/recipes/crushing/compat/galosphere/allurite.json +9e255904c7a3277d6084183c0921392df0c7918d data/create/recipes/crushing/compat/galosphere/amethyst.json +b04f95c02f37a0398c209a02ad08a8b0e9aaaaa9 data/create/recipes/crushing/compat/galosphere/lumiere.json +bea05bc584958f479078cd6c16a06c50eae859cc data/create/recipes/crushing/compat/neapolitan/ice.json +2358ce4b7a3acb08d3d0a3e64295fb97dea2ec02 data/create/recipes/crushing/compat/quark/moss_block.json +2631b2bdcf091f4d400e0a9d2be6f1f772edfdc9 data/create/recipes/crushing/compat/silentgems/alexandrite_ore.json +d11b5a993f5ed0105eb63361d8e9e8739d8a5273 data/create/recipes/crushing/compat/silentgems/ammolite_ore.json +3f60a2cdfec1d15ad4dd8ccc5fd4e7d14ccafc14 data/create/recipes/crushing/compat/silentgems/black_diamond_ore.json +21c0ee3b80c3c9b5612367b63a981fe526d5d996 data/create/recipes/crushing/compat/silentgems/carnelian_ore.json +1f5eaa337f7b3262b83d99b2d8e8179bbf20fc89 data/create/recipes/crushing/compat/silentgems/citrine_ore.json +f3257c0e08c4da373862ab9128df3a28fec17d26 data/create/recipes/crushing/compat/silentgems/iolite_ore.json +ea65f0bb86c444401491f2f020dc040d263f4def data/create/recipes/crushing/compat/silentgems/kyanite_ore.json +36f7fe4671a8ec1f8aa7a78260ce306033501691 data/create/recipes/crushing/compat/silentgems/moldavite_ore.json +466501f69b3c8b3ca7ad63f8db29f23136269e94 data/create/recipes/crushing/compat/silentgems/peridot_ore.json +ff54345899fa142839e496a737fa0a740b0d32db data/create/recipes/crushing/compat/silentgems/rose_quartz_ore.json +701ed26488cda81ee2ddd48e51f96890dee99899 data/create/recipes/crushing/compat/silentgems/ruby_ore.json +f71bbcece1d63299ccf5bf892883abc67bab1d7d data/create/recipes/crushing/compat/silentgems/sapphire_ore.json +7e65a919156d62f2316b91198477eb3745285711 data/create/recipes/crushing/compat/silentgems/topaz_ore.json +4fb0c49b9385436cd85445c1ff0d7c0a69121596 data/create/recipes/crushing/compat/silentgems/turquoise_ore.json +5198e4e42ba81b048e1c2512fff64ecd4f9afe70 data/create/recipes/crushing/compat/simplefarming/barley.json +7a3f91add5e9cbaafd5ab29acf2b26fa6f0f9eec data/create/recipes/crushing/compat/simplefarming/oat.json +4c344201ebf58640d386d68adf864446bd3d8389 data/create/recipes/crushing/compat/simplefarming/rice.json +a5537631def291e7da320d2bc8c6256db45ea622 data/create/recipes/crushing/compat/simplefarming/rye.json +4774b880ce6d1b0e4dc5fe95c65ce697253a43d7 data/create/recipes/crushing/compat/thermal/apatite_ore.json +ef8e75c897962c4bc4fa4ccaa42b374bbeb633e8 data/create/recipes/crushing/compat/thermal/cinnabar_ore.json +e16232b73076c46164a7b0352398e19db30af6c5 data/create/recipes/crushing/compat/thermal/niter_ore.json +05da2e5ca7871402b29ace6e543aeb008a78af80 data/create/recipes/crushing/compat/thermal/sulfur_ore.json ad91e6a560bdb8ef311862a0fee1f316529ed439 data/create/recipes/crushing/copper_ore.json 0ff7fa09b2ae808bc29c4d87985deccab5de2de5 data/create/recipes/crushing/crimsite.json 50c9a45e77d266852317fa1bac6c17443cfd986c data/create/recipes/crushing/crimsite_recycling.json -b6995978092ed3080efd49e52571ff59205f7c85 data/create/recipes/crushing/deepslate_coal_ore.json +091602442de918ea38482277fcdd98443111d585 data/create/recipes/crushing/deepslate_coal_ore.json 9aa9bcd71da7ebb25301211426e988e71c9bff97 data/create/recipes/crushing/deepslate_copper_ore.json 4afc9cc723bdee47ed2176f32323f1fca152765f data/create/recipes/crushing/deepslate_diamond_ore.json 94d706cac7779cf8dc3aa8822605a4ee9d0ba047 data/create/recipes/crushing/deepslate_emerald_ore.json @@ -26,9 +92,10 @@ e266d091252d692dcd0618f34754536fe0aa98b3 data/create/recipes/crushing/deepslate_ 64688579de20cbc0f4a7e4a589140fbbce408fcf data/create/recipes/crushing/deepslate_zinc_ore.json 69e0a401b424cb82ab3387a0b23bd7241f80f56e data/create/recipes/crushing/diamond_horse_armor.json 35cff9ebc59e837a2beafd2d4ec80e088459344c data/create/recipes/crushing/diamond_ore.json -a0511a15499653d983ad8b85b9f763643cca3aca data/create/recipes/crushing/diorite.json +5cc17c5a45855d82d471f96c1c82d8d031bd3e16 data/create/recipes/crushing/diorite.json df364151c75a7d84446b2c6213e339115bc9d298 data/create/recipes/crushing/diorite_recycling.json 9e89294e53a94a05af47948c21ad192ef18f7710 data/create/recipes/crushing/emerald_ore.json +9c3989fd9e72e21353803f475a08b8f199717c1f data/create/recipes/crushing/gilded_blackstone.json 3c4c78e3a7137022f8f6e90324af6c8f97050e80 data/create/recipes/crushing/glowstone.json 95b76da439260151355fff74b3b7398ce13d6968 data/create/recipes/crushing/golden_horse_armor.json b036b1654d2deec20aca95ff43b60c7d0b28b2fc data/create/recipes/crushing/gold_ore.json @@ -38,7 +105,7 @@ c9a47b29ba75ba29c8cb630fe32c4bf2f1f1d1ae data/create/recipes/crushing/iron_ore.j 855b6655dea911724ee68d07b993f17440ac422e data/create/recipes/crushing/lapis_ore.json 492827ab3d55ca3edfef5eb006b1f77d62e1b446 data/create/recipes/crushing/lead_ore.json e170bc17a796c73a05d2d77a85c086cfaac55c31 data/create/recipes/crushing/leather_horse_armor.json -4317165fc125d179cfbe66d15ba6368cdf1d7811 data/create/recipes/crushing/netherrack.json +606ccdf3119a62ab461028192d191ffb10332e21 data/create/recipes/crushing/netherrack.json 07e8991a2161aab4dd73bb74900fd0c70aad2847 data/create/recipes/crushing/nether_gold_ore.json c7c0d94707c2858a87d01cff6b284d7fb85acdbe data/create/recipes/crushing/nether_quartz_ore.json 0380b9416b263de2ee6a6cd1f4064df2e243c047 data/create/recipes/crushing/nether_wart_block.json @@ -50,32 +117,32 @@ d3534d606382ec7c1d34275c5f069543d0955906 data/create/recipes/crushing/nickel_ore d391ef171a3ece91ae72697ceba36b71b19f4fae data/create/recipes/crushing/platinum_ore.json acb785fd57d14ac337beacc0a0a0651d75dd45da data/create/recipes/crushing/prismarine_crystals.json 1126e9f29bf15c56917168d53e9f533c171ad2fb data/create/recipes/crushing/quicksilver_ore.json +00c7c3bc45245749ad7cc4ba3ae4b1958bd6bab7 data/create/recipes/crushing/raw_aluminum.json a0a9e118317e2aabdafc94d19dedb05ccc751630 data/create/recipes/crushing/raw_aluminum_block.json -00c7c3bc45245749ad7cc4ba3ae4b1958bd6bab7 data/create/recipes/crushing/raw_aluminum_ore.json -b490b3ef4f62e2d225c82693955f9a3e70a33e32 data/create/recipes/crushing/raw_copper.json -efa4c84119f0aa998a6b3f477884f81b28d8bd91 data/create/recipes/crushing/raw_copper_block.json -26577895a8ac3c61187171784c5aa30d334ddc17 data/create/recipes/crushing/raw_gold.json -94606b52a715c2118afa63d0df4791167ec78570 data/create/recipes/crushing/raw_gold_block.json -f48f8f1702697f04f420008a002561a96087d424 data/create/recipes/crushing/raw_iron.json -f77190f83190cb0491d77c79f618c7ecb1169dd9 data/create/recipes/crushing/raw_iron_block.json +b798b65bfd6cb36659d5a066207ccc8dfbb018f6 data/create/recipes/crushing/raw_copper.json +792c59071020e56c730f0c56d533be7e387aa8a0 data/create/recipes/crushing/raw_copper_block.json +d5e4dc9ffe659d36310e1a834b30d18fb7759ce4 data/create/recipes/crushing/raw_gold.json +2ece4b609f585dee6eaf68d50f242912bf8b5c63 data/create/recipes/crushing/raw_gold_block.json +5fe12a645e6a6ee296c90d81f02047251008a8ac data/create/recipes/crushing/raw_iron.json +26fb3284ca7c9241f309dc8b8cbdbda9ad8c8b3c data/create/recipes/crushing/raw_iron_block.json +8bcbe26c99259814cda03c7e702cb2b9cdb703be data/create/recipes/crushing/raw_lead.json bb958be3f923c7b921b1fe4e1fffaf612313bc3b data/create/recipes/crushing/raw_lead_block.json -8bcbe26c99259814cda03c7e702cb2b9cdb703be data/create/recipes/crushing/raw_lead_ore.json +fe4987e15391a89865021c8ffc39f552d972ce6c data/create/recipes/crushing/raw_nickel.json b32aeba202cb46ca597c45b321df087629b0d529 data/create/recipes/crushing/raw_nickel_block.json -fe4987e15391a89865021c8ffc39f552d972ce6c data/create/recipes/crushing/raw_nickel_ore.json +f170312878e061b588780f694b3069b07c6a9145 data/create/recipes/crushing/raw_osmium.json ba9ac5dac3bebb11ca29c31da6929c1e4bc42a82 data/create/recipes/crushing/raw_osmium_block.json -f170312878e061b588780f694b3069b07c6a9145 data/create/recipes/crushing/raw_osmium_ore.json +948c8d58b5ff186e1a6822ea30310f8fb2d04c0a data/create/recipes/crushing/raw_platinum.json 7862c43aeabec2ce7f9c57237f12cb1e57ba19f3 data/create/recipes/crushing/raw_platinum_block.json -948c8d58b5ff186e1a6822ea30310f8fb2d04c0a data/create/recipes/crushing/raw_platinum_ore.json +a47988609aa65204f28a08f92330947264bae99c data/create/recipes/crushing/raw_quicksilver.json 44f93dc5967c395116f2f88440b6551ae37492fd data/create/recipes/crushing/raw_quicksilver_block.json -a47988609aa65204f28a08f92330947264bae99c data/create/recipes/crushing/raw_quicksilver_ore.json +c76409d69a9639c32bd95988bc6ae937d2b9ab3d data/create/recipes/crushing/raw_silver.json edb7cd8356c53e9d6c26385e7daba2477d1c0fc3 data/create/recipes/crushing/raw_silver_block.json -c76409d69a9639c32bd95988bc6ae937d2b9ab3d data/create/recipes/crushing/raw_silver_ore.json +1416215d01c218bcf9138368237ad49a7e3401f7 data/create/recipes/crushing/raw_tin.json 7a7aebffec77b5735ff94b36ea7d624012129b36 data/create/recipes/crushing/raw_tin_block.json -1416215d01c218bcf9138368237ad49a7e3401f7 data/create/recipes/crushing/raw_tin_ore.json +4614b1f29655509da43e7b9bf0b2dc25c1a5968e data/create/recipes/crushing/raw_uranium.json 537963e4b7d514c6829091f80454d3722cdc1b66 data/create/recipes/crushing/raw_uranium_block.json -4614b1f29655509da43e7b9bf0b2dc25c1a5968e data/create/recipes/crushing/raw_uranium_ore.json -29b1755e48b902c1123eafa75a8fa00325bd3b8b data/create/recipes/crushing/raw_zinc.json -79775097db26ca297b8b1ab1b0f6a1666df0c39e data/create/recipes/crushing/raw_zinc_block.json +86b1ea5c26fa49af78d5fa38b7a29a451b862b0f data/create/recipes/crushing/raw_zinc.json +66c25b21126921863e4f6b28115ba3be00ae4ee0 data/create/recipes/crushing/raw_zinc_block.json 268f64d9d7f99e12d0a8228d3455c70e436ebd7f data/create/recipes/crushing/redstone_ore.json 6ae95e2551fe11bceea7f473c04b158c0518508e data/create/recipes/crushing/silver_ore.json caffc0003ad99160c866ee0e71a345dbe7f696b2 data/create/recipes/crushing/tin_ore.json @@ -115,8 +182,36 @@ af1ca00e05d554bba1d85c766e52560d5ea8fe4d data/create/recipes/cutting/compat/ars_ 1a66e7e6dfba9531bbb5a1d0bf014e16d6cbb6be data/create/recipes/cutting/compat/ars_nouveau/stripped_purple_archwood_wood.json 5c1c8275b2e30fdf387dcf358fd41e995e817c86 data/create/recipes/cutting/compat/ars_nouveau/stripped_red_archwood_log.json 9dc5bd8a1002b9d299d60a405720950eb0b4e9ab data/create/recipes/cutting/compat/ars_nouveau/stripped_red_archwood_wood.json -2469ee3ee07486d125fa476845533ef6bb1c9eb6 data/create/recipes/cutting/compat/biomesoplenty/cherry_log.json -0b80cdc4c48ce36d300aaa54be2f49fa684d2b41 data/create/recipes/cutting/compat/biomesoplenty/cherry_wood.json +08337ca1d46e04197fa31ccc21c3fcbbc0efde5a data/create/recipes/cutting/compat/atmospheric/aspen_log.json +1077e644ee8e83e39dbd695e5ed7b12591aedcfa data/create/recipes/cutting/compat/atmospheric/aspen_wood.json +339cc9026c5d89c8b78283baf5f21cb8b4471bad data/create/recipes/cutting/compat/atmospheric/grimwood.json +a8c2ff06f663881b1edbf7eab5e91083e59cf568 data/create/recipes/cutting/compat/atmospheric/grimwood_log.json +16640492eab4c22bf18e06fdf7a0469e1326f10b data/create/recipes/cutting/compat/atmospheric/kousa_log.json +0f2b8fa779cd3bc6e2ac04aa16596e08bda29578 data/create/recipes/cutting/compat/atmospheric/kousa_wood.json +0689201dddce046ef830ae791dc614ebcd6bb26d data/create/recipes/cutting/compat/atmospheric/morado_log.json +f3968dddde6ace179c0b6463aba17e212a93629a data/create/recipes/cutting/compat/atmospheric/morado_wood.json +41bb788e28c66d8a7415ec3731ca09f440864a9a data/create/recipes/cutting/compat/atmospheric/rosewood.json +4c49e3ac52fd466929a63e5009dce631040ba6ba data/create/recipes/cutting/compat/atmospheric/rosewood_log.json +a90a322d3acc2115e9a52c0e288215991c5ed143 data/create/recipes/cutting/compat/atmospheric/stripped_aspen_log.json +482e9a0464c877c21cf37925e20b6aeff633676c data/create/recipes/cutting/compat/atmospheric/stripped_aspen_wood.json +2d05a0460606960c7e73d2a67012b7dc55c00356 data/create/recipes/cutting/compat/atmospheric/stripped_grimwood.json +c2bfa5fa40905cb3bd2511d94907252e86afe7b8 data/create/recipes/cutting/compat/atmospheric/stripped_grimwood_log.json +092cae4bd9d8dd5626fd4b5c072520977dfa8a4e data/create/recipes/cutting/compat/atmospheric/stripped_kousa_log.json +cc69f0162e8fdd56e2e6a8d3423acd09a977f56d data/create/recipes/cutting/compat/atmospheric/stripped_kousa_wood.json +e9d88cf3cd60e6d43af7d1d16a174f88fcf1233d data/create/recipes/cutting/compat/atmospheric/stripped_morado_log.json +5f55e43d57c00b48c010609da73e7aa009f6c49a data/create/recipes/cutting/compat/atmospheric/stripped_morado_wood.json +ecfda5a9474fda3772c4cdfbe213c1350ed9ee38 data/create/recipes/cutting/compat/atmospheric/stripped_rosewood.json +c4e9a1327e2926f0517feaaf39c9629da8629312 data/create/recipes/cutting/compat/atmospheric/stripped_rosewood_log.json +924b4b9d24d2544aa04e7a713e6ce4674450b616 data/create/recipes/cutting/compat/atmospheric/stripped_yucca_log.json +ec6c644a9381526ea5c507a1968627fc880041ac data/create/recipes/cutting/compat/atmospheric/stripped_yucca_wood.json +c528538d50280aa575d642076b4d82e905cd5742 data/create/recipes/cutting/compat/atmospheric/yucca_log.json +fa41576ce1f7524bcd5c9d0bd755872c61594906 data/create/recipes/cutting/compat/atmospheric/yucca_wood.json +bca0cb14b60f7982d3e25f1fa082fc6c1d297cac data/create/recipes/cutting/compat/autumnity/maple_log.json +d95f86b26b21356ce3a9305d31143984489bd044 data/create/recipes/cutting/compat/autumnity/maple_wood.json +b66953dee0ea9804e22aa6f296c49e81f34d2d18 data/create/recipes/cutting/compat/autumnity/sappy_maple_log.json +bf5a4170f365901a3d850387ff6338e576f8e8eb data/create/recipes/cutting/compat/autumnity/sappy_maple_wood.json +598201da89849526cc316b63b297814bc52d75d1 data/create/recipes/cutting/compat/autumnity/stripped_maple_log.json +b93e929d2078211fd70d6df8d4eb065e6d4cc112 data/create/recipes/cutting/compat/autumnity/stripped_maple_wood.json 76872508fd1b302d4e94a2017ea72f7d38de6273 data/create/recipes/cutting/compat/biomesoplenty/dead_log.json 6bee03a37457acfc937c36ffb2d58ca97218c002 data/create/recipes/cutting/compat/biomesoplenty/dead_wood.json c62f06b79bdac37704f0fa31459f98aeb2d4f7ae data/create/recipes/cutting/compat/biomesoplenty/fir_log.json @@ -133,8 +228,6 @@ fa8a8440905213675dd769ae29509a1cbcabb1c1 data/create/recipes/cutting/compat/biom 184b9042633580815a6d1e2e1f1d3c543f26a3e4 data/create/recipes/cutting/compat/biomesoplenty/palm_wood.json 919a8fbf9f8e7f398a28a8af71ca4ad48ed8d6db data/create/recipes/cutting/compat/biomesoplenty/redwood_log.json 165e2642f98885734b3f815579ff589b8f0b870e data/create/recipes/cutting/compat/biomesoplenty/redwood_wood.json -e01b8ec89beb25e803d5c7a3cc02b8623065584c data/create/recipes/cutting/compat/biomesoplenty/stripped_cherry_log.json -c7290c1339ca052176a1907ae9264ad106cd0238 data/create/recipes/cutting/compat/biomesoplenty/stripped_cherry_wood.json 1a3f84111c5027304bfe8d037fa853125b2183c2 data/create/recipes/cutting/compat/biomesoplenty/stripped_dead_log.json 8f2c2015927767d627be865dc603530dd05328ee data/create/recipes/cutting/compat/biomesoplenty/stripped_dead_wood.json 822d84a550496c7f2c3ee127314a50512dfe5c8c data/create/recipes/cutting/compat/biomesoplenty/stripped_fir_log.json @@ -161,8 +254,6 @@ f3c630ba88419ea2fdf55b03eac22aac88acd56c data/create/recipes/cutting/compat/biom f661dc5faff7e08489ef6ac4996864b79e53804a data/create/recipes/cutting/compat/biomesoplenty/willow_wood.json c3c4999b33f2f29f31f1ac2cd0256694e530b6ab data/create/recipes/cutting/compat/blue_skies/bluebright_log.json 686bb3eab9fd2fc0439ffe7c31c08dee37eb17c3 data/create/recipes/cutting/compat/blue_skies/bluebright_wood.json -297eec4fefb378592eb2f74c082379cd93e5c2a9 data/create/recipes/cutting/compat/blue_skies/cherry_log.json -62b05ddc8d5d634d9fe0262490f3bf08435ba9ee data/create/recipes/cutting/compat/blue_skies/cherry_wood.json dfcee56f35b64e0b6d9a86a113f56de78f0ce6b3 data/create/recipes/cutting/compat/blue_skies/crystallized_log.json 0f6fa127bf9fd14a799985437eb1554a527f71c8 data/create/recipes/cutting/compat/blue_skies/crystallized_wood.json a0ca7db3a2a631be843c697347ad70501b4e700c data/create/recipes/cutting/compat/blue_skies/dusk_log.json @@ -177,8 +268,6 @@ a5ceee5b1c402dfcb06851a696c4ba4e3c15d790 data/create/recipes/cutting/compat/blue 1960934756be7cb82421e9428622eb853c96c451 data/create/recipes/cutting/compat/blue_skies/starlit_wood.json c96c5ecb3913b7611cea45dd45be447313a53278 data/create/recipes/cutting/compat/blue_skies/stripped_bluebright_log.json 26af6c6fc9e093d466b8a920de16e95aca9e0fe6 data/create/recipes/cutting/compat/blue_skies/stripped_bluebright_wood.json -92086d7f5a5090e934868726542173c0f4694cfe data/create/recipes/cutting/compat/blue_skies/stripped_cherry_log.json -5b0a7d97c604b80cd81f30c6c9baa02dce908f9b data/create/recipes/cutting/compat/blue_skies/stripped_cherry_wood.json 2ef370bdc202010ef3f3d28a3df050b785178966 data/create/recipes/cutting/compat/blue_skies/stripped_dusk_log.json e64dc0f1b77303152596c2c092783d06cfaed371 data/create/recipes/cutting/compat/blue_skies/stripped_dusk_wood.json 523239c7e97a4d0ea9a602324926ff8c7de21122 data/create/recipes/cutting/compat/blue_skies/stripped_frostbright_log.json @@ -213,8 +302,6 @@ cef520dc7a7c4ec257f2b4ab2b1b134ef29874f0 data/create/recipes/cutting/compat/byg/ 6b32af35555c83fee27c43858ebe03711c825d36 data/create/recipes/cutting/compat/byg/blue_enchanted_wood.json 2325864b4f7a80d466f5eef373f65cccb0557d55 data/create/recipes/cutting/compat/byg/bulbis_stem.json 52320312ae0aa6d957f841b430355d96afdbfe0b data/create/recipes/cutting/compat/byg/bulbis_wood.json -a1aae5af9bc5a95d90d7350330986743e6ddf408 data/create/recipes/cutting/compat/byg/cherry_log.json -82b41df50cfc394aa8e439bf259bba640bb375e8 data/create/recipes/cutting/compat/byg/cherry_wood.json 588ea2463640155d79724a694b5152574ea3f2a7 data/create/recipes/cutting/compat/byg/cika_log.json 880d0190030e3a70fd2a21ab4fc11604fbaac447 data/create/recipes/cutting/compat/byg/cika_wood.json 1fc63cafc946178443d1e362b9730455f2192b25 data/create/recipes/cutting/compat/byg/cypress_log.json @@ -263,8 +350,6 @@ fec45c1d4084c9de211876a3fd313313c18920b2 data/create/recipes/cutting/compat/byg/ 608a3d0bb5ca12e95141016099085821e47f4e98 data/create/recipes/cutting/compat/byg/stripped_blue_enchanted_wood.json 087dd3a1c516f9db9729974781bc68e13ff4b3de data/create/recipes/cutting/compat/byg/stripped_bulbis_stem.json f45c17bea93fc15f10b0c135ebf334a41a2e68d2 data/create/recipes/cutting/compat/byg/stripped_bulbis_wood.json -cb67e5541cef77a6dafdc825b39040ee95f86652 data/create/recipes/cutting/compat/byg/stripped_cherry_log.json -4fe4537e4e38cbf19e6a2d04481e6d849edc8374 data/create/recipes/cutting/compat/byg/stripped_cherry_wood.json 4187543812af8be22977b2b503ffb16ff82e38e6 data/create/recipes/cutting/compat/byg/stripped_cika_log.json 72c90971b638693cf7425ff59530672f37433b52 data/create/recipes/cutting/compat/byg/stripped_cika_wood.json c66c179d9989be618909104ba8e0f399ca34a630 data/create/recipes/cutting/compat/byg/stripped_cypress_log.json @@ -325,14 +410,32 @@ c6b1455c29d3bd0ff387edad10328ba4dd8b7f44 data/create/recipes/cutting/compat/ecol 0026f35ef1445df9c3bb83bdfe25898cceffd5e4 data/create/recipes/cutting/compat/ecologics/stripped_walnut_wood.json e4c5b799335a71a4259de6519ff9fe86fc014c85 data/create/recipes/cutting/compat/ecologics/walnut_log.json 45734ddd48ac17b25b88cf1f5b0d227431946cf7 data/create/recipes/cutting/compat/ecologics/walnut_wood.json -cbd3c2674078ba4966965990aaa51ee5afc2cf8f data/create/recipes/cutting/compat/forbidden_arcanus/cherrywood.json -17c1e13d1261454992c6063dcecf7e54d4a645a5 data/create/recipes/cutting/compat/forbidden_arcanus/cherrywood_log.json -e5c3b98a78aa3995654583f3ce1c70e7cf8c2130 data/create/recipes/cutting/compat/forbidden_arcanus/mysterywood.json -58166d1cdb0e04952667484b6568de9d081aeba3 data/create/recipes/cutting/compat/forbidden_arcanus/mysterywood_log.json -9cc60d3115f09eee286781905a1d0ca11976dbb5 data/create/recipes/cutting/compat/forbidden_arcanus/stripped_cherrywood.json -4b2e710b98a3fd0a883cf5be9ec75835f8e4631b data/create/recipes/cutting/compat/forbidden_arcanus/stripped_cherrywood_log.json -a3035cdad141574294844b8aaa41b92ac76dac2e data/create/recipes/cutting/compat/forbidden_arcanus/stripped_mysterywood.json -20e75208dcb1720de5bbf629911f52b95612227f data/create/recipes/cutting/compat/forbidden_arcanus/stripped_mysterywood_log.json +b0be23a2a268557b1ab26518a9d6ff1e492068fa data/create/recipes/cutting/compat/endergetic/poise_stem.json +1581ae3f152ba5784d6b737ed37e0fe8e6317a76 data/create/recipes/cutting/compat/endergetic/stripped_poise_stem.json +513c32af17004085c152de0c50ecdc0821ad5736 data/create/recipes/cutting/compat/environmental/cherry_log.json +dd7f392a18fa58dbcd02e1700a89d847ef912f6a data/create/recipes/cutting/compat/environmental/cherry_wood.json +bb5be6efdf3a134baed80179e9f65a5e9402e001 data/create/recipes/cutting/compat/environmental/stripped_cherry_log.json +8938bac54128e55540b9061333cebadb615c5531 data/create/recipes/cutting/compat/environmental/stripped_cherry_wood.json +962dd25663096fe3883f0aa5a89cea00c312625a data/create/recipes/cutting/compat/environmental/stripped_willow_log.json +ee28f2a0519c41df80647ec643d20b3ce05d5ca7 data/create/recipes/cutting/compat/environmental/stripped_willow_wood.json +bfa59f4024105be24f441ec9e1fe2394bb4c32ed data/create/recipes/cutting/compat/environmental/stripped_wisteria_log.json +15cb849317c8038750000708c93cce535d7662e5 data/create/recipes/cutting/compat/environmental/stripped_wisteria_wood.json +9c9b4b63d736e9bef583e3e3085df9547bee1ad3 data/create/recipes/cutting/compat/environmental/willow_log.json +6a6b47c7c058fe67ea0f0f479145e0e921fcd571 data/create/recipes/cutting/compat/environmental/willow_wood.json +590fa0d5dbc357c4d22f7e79f94365c50ca1c812 data/create/recipes/cutting/compat/environmental/wisteria_log.json +62b927056738fbbbb1ceb7b2b3f23e45c94cdd1b data/create/recipes/cutting/compat/environmental/wisteria_wood.json +97d07cbd21b147d93cbfea6534258f0b5faabbbb data/create/recipes/cutting/compat/forbidden_arcanus/aurum_log.json +b08980c7deb9a4de4983fdae188f0c5ac627c1e5 data/create/recipes/cutting/compat/forbidden_arcanus/aurum_wood.json +47902025354c45f34fa62402fc5f32db6648a7c3 data/create/recipes/cutting/compat/forbidden_arcanus/stripped_aurum_log.json +f8f97315cfcd7e76229b9856ca6b2942bd7754f5 data/create/recipes/cutting/compat/forbidden_arcanus/stripped_aurum_wood.json +c6e138b6adf0311deebeff7cacdcdb57337f41da data/create/recipes/cutting/compat/goodending/cypress_log.json +cac6d3d763a3909d9a1f3eebe83190013e323e8a data/create/recipes/cutting/compat/goodending/cypress_wood.json +a3664dc30807cbc7903f79944bfb9b7d08a91671 data/create/recipes/cutting/compat/goodending/muddy_oak_log.json +c0bde27c6ff867dbfe7bea538bce82ddd12d4fea data/create/recipes/cutting/compat/goodending/muddy_oak_wood.json +eb749011e1c688f2005a63eb9953d29c6287eae4 data/create/recipes/cutting/compat/goodending/stripped_cypress_log.json +228632291f42fb47b73a6e3058a27475d97c20f1 data/create/recipes/cutting/compat/goodending/stripped_cypress_wood.json +c9e3c6e1b591822283f4436c70a52ce27034e8cf data/create/recipes/cutting/compat/goodending/stripped_muddy_oak_log.json +f6cabdcbdb8aeffb03228bf65183bbec5aaba182 data/create/recipes/cutting/compat/goodending/stripped_muddy_oak_wood.json 3a9be23a966c2737c5059474c17a86566bc5505f data/create/recipes/cutting/compat/hexcasting/edified_log.json 3f3879c426acb1753f2985ed19f0a905bdbd3797 data/create/recipes/cutting/compat/hexcasting/edified_wood.json 68d80d00d15d6ad14100025eecbd76c1fa8e3a52 data/create/recipes/cutting/compat/hexcasting/stripped_edified_log.json @@ -341,14 +444,118 @@ f87872a26b790bd29abfc036486474c5db8ee518 data/create/recipes/cutting/compat/inte cd568df5168a0cfccbdaaf767ec63d71871ba3ba data/create/recipes/cutting/compat/integrateddynamics/menril_log_stripped.json b5573785c73cbf3b2c2bd096bb0a12b054819b74 data/create/recipes/cutting/compat/integrateddynamics/menril_wood.json ebca8e98bca0a5c8926c4aa5b197d5d436e2e00b data/create/recipes/cutting/compat/integrateddynamics/menril_wood_stripped.json +1b91f83f2c6e4c6087abc7a136478027b2c7092d data/create/recipes/cutting/compat/nethers_exoticism/jabuticaba_log.json +5f074e7d51d851e95469a234666485ae1f913731 data/create/recipes/cutting/compat/nethers_exoticism/ramboutan_log.json +d8ea31f8eac026d99a26ab200eeca6faee064d9c data/create/recipes/cutting/compat/nethers_exoticism/ramboutan_wood.json +536ed770010fcf8ba56f6333d58fa09b974b95c4 data/create/recipes/cutting/compat/nethers_exoticism/stripped_jabuticaba_log.json +8c84afc4870ff5c8d936dd1363e18531f27c6233 data/create/recipes/cutting/compat/nethers_exoticism/stripped_ramboutan_log.json +4119174e4e7126b66d05e78e7415558a31ba6540 data/create/recipes/cutting/compat/nethers_exoticism/stripped_ramboutan_wood.json +5a8b70f884741f155924174f8f8911574a782928 data/create/recipes/cutting/compat/quark/ancient_log.json +0b6953e5fd8f5d248f5327a8775e4e30a355ca49 data/create/recipes/cutting/compat/quark/ancient_wood.json a0194f77f72349786f6b87e641c9628f7fe46fdf data/create/recipes/cutting/compat/quark/azalea_log.json 17daa6e2505ae75e51def1f1523f9d6f120de696 data/create/recipes/cutting/compat/quark/azalea_wood.json 118122fbd3154c0090768d9103e802d2e68b3f06 data/create/recipes/cutting/compat/quark/blossom_log.json 57b23b572f4d75bb39f7f84277f0a0a4e6be992b data/create/recipes/cutting/compat/quark/blossom_wood.json +d36666b83bf934aabd20aac182c4863de693903e data/create/recipes/cutting/compat/quark/stripped_ancient_log.json +a666d4c2d54acfa924eeef535415b993d40ca015 data/create/recipes/cutting/compat/quark/stripped_ancient_wood.json e05b81a5609420153b3ecace758a153bd88a4bef data/create/recipes/cutting/compat/quark/stripped_azalea_log.json f820204e8d99f21203b001da23e8b44cf61e33e2 data/create/recipes/cutting/compat/quark/stripped_azalea_wood.json af71513af8de414036ff73fee0eaca4b823de99c data/create/recipes/cutting/compat/quark/stripped_blossom_log.json 071c8a562233a342875c9cdd392bbebfe719e321 data/create/recipes/cutting/compat/quark/stripped_blossom_wood.json +9fe1249c4b24d82699829f1e8f3dc19de791dbd1 data/create/recipes/cutting/compat/regions_unexplored/alpha_log.json +27585fe96d7e211e4469c437c82c89c1268cf0bf data/create/recipes/cutting/compat/regions_unexplored/ashen_log.json +bf04910ca9246aec3146eff28bc7d5d778c5d6d4 data/create/recipes/cutting/compat/regions_unexplored/ashen_wood.json +371e7f6a13a45006c21837847999e6e1b69e6320 data/create/recipes/cutting/compat/regions_unexplored/baobab_log.json +2cadb9f9d714f8668291122519a73458d6e6afdb data/create/recipes/cutting/compat/regions_unexplored/baobab_wood.json +f124b677daea80e9efdcb58451442403f79ecc59 data/create/recipes/cutting/compat/regions_unexplored/blackwood_log.json +809aba67a96fcf9766c4278697ddfbd89ff63db1 data/create/recipes/cutting/compat/regions_unexplored/blackwood_wood.json +d6263c38f2a54be9310530cfd5f23aaddda0dbca data/create/recipes/cutting/compat/regions_unexplored/blue_bioshroom_hyphae.json +3904212da6e2eb60c453520a44eb22d33fc1c128 data/create/recipes/cutting/compat/regions_unexplored/blue_bioshroom_stem.json +780ddd7800cc138177752ee965ccd7cad8e53c6e data/create/recipes/cutting/compat/regions_unexplored/brimwood_log.json +15ca75b81a207a347e06c730da7afa106714b9ed data/create/recipes/cutting/compat/regions_unexplored/brimwood_log_magma.json +44d643b1724377c9019436f6927b0e1c2de63a42 data/create/recipes/cutting/compat/regions_unexplored/brimwood_wood.json +d449dc8b30400627cb509b0bcdc6b63bbb595172 data/create/recipes/cutting/compat/regions_unexplored/cobalt_log.json +7ff17654f134c7c13f6008619b76b4e19751728c data/create/recipes/cutting/compat/regions_unexplored/cobalt_wood.json +8446d9a9b3ff0140c64d549e33f9f5718fdcceb6 data/create/recipes/cutting/compat/regions_unexplored/cypress_log.json +620d71dee83ac1aa16d30c1b4833e15f00a04208 data/create/recipes/cutting/compat/regions_unexplored/cypress_wood.json +0fa6e6ac5c19c8660111c07b13f0d82cf339910b data/create/recipes/cutting/compat/regions_unexplored/dead_log.json +30a08ae6222bebf4c6fbfc5801ccc30b5d01e417 data/create/recipes/cutting/compat/regions_unexplored/dead_wood.json +696b5f3eb788a5ab8dc35f91ffbc575d987af4b1 data/create/recipes/cutting/compat/regions_unexplored/eucalyptus_log.json +641e17384aa1ed504157ee8b4c3bf839f864199c data/create/recipes/cutting/compat/regions_unexplored/eucalyptus_wood.json +e8b754d24ae46631a97ffa6b15f4676768c4e219 data/create/recipes/cutting/compat/regions_unexplored/green_bioshroom_hyphae.json +3401ba3b7c8fa6023566e99532f035e4d78463ea data/create/recipes/cutting/compat/regions_unexplored/green_bioshroom_stem.json +0e2885c8819270dd0ea9b423eb17aabce17f50b6 data/create/recipes/cutting/compat/regions_unexplored/joshua_log.json +fd296307a65df37d2c952b3de9e79234b36c8bf8 data/create/recipes/cutting/compat/regions_unexplored/joshua_wood.json +b063c34700782af4ba8e5b353faa93a6af63e133 data/create/recipes/cutting/compat/regions_unexplored/kapok_log.json +44375fea18ff6312a05eb4948cf23916cad31bb7 data/create/recipes/cutting/compat/regions_unexplored/kapok_wood.json +74e328e600a2ce311638acf6b0cda2dca7e689bd data/create/recipes/cutting/compat/regions_unexplored/larch_log.json +519d0a467bafd51425e588c1452b326485ac504a data/create/recipes/cutting/compat/regions_unexplored/larch_wood.json +9d8f4845c835ba07d4f1f0f07b8d9ed39fb3514a data/create/recipes/cutting/compat/regions_unexplored/magnolia_log.json +4b367599792101bd5403aba96e973748fc91e8cf data/create/recipes/cutting/compat/regions_unexplored/magnolia_wood.json +caaefb19635f7fbec31d87d7ef40172c25e48b72 data/create/recipes/cutting/compat/regions_unexplored/maple_log.json +b8731d1b36bac59a519a496ce5253595be58ca57 data/create/recipes/cutting/compat/regions_unexplored/maple_wood.json +3cb94f34a0318442ea3a9225366587bf1aa0a01a data/create/recipes/cutting/compat/regions_unexplored/mauve_log.json +587727f7998dd25ee3441aa6f0ed1736262b8a55 data/create/recipes/cutting/compat/regions_unexplored/mauve_wood.json +aecbe7b08f8374331f976434daff89c4e4922efd data/create/recipes/cutting/compat/regions_unexplored/palm_log.json +3a83e8d7cac67638b76a8b30d469faaae71e9d6a data/create/recipes/cutting/compat/regions_unexplored/palm_wood.json +40b46cba392e02498406b90536b8da540df0eb76 data/create/recipes/cutting/compat/regions_unexplored/pine_log.json +9fe88b00cb4c42ed5677f46bccdf2c05fd085c5f data/create/recipes/cutting/compat/regions_unexplored/pine_wood.json +7a11eb2ede6e9d5f1284e6223c52465493901f79 data/create/recipes/cutting/compat/regions_unexplored/pink_bioshroom_hyphae.json +78fb2663e91d8f6494ff1348f2d83633e50713ee data/create/recipes/cutting/compat/regions_unexplored/pink_bioshroom_stem.json +eb7b75678cf8ae102eee91456bd8d4387acfb146 data/create/recipes/cutting/compat/regions_unexplored/redwood_log.json +d1da4369daa6c4fd16dfeff7551c218949e122d5 data/create/recipes/cutting/compat/regions_unexplored/redwood_wood.json +aa75d5f92d23fb24aece736145ac8372f6cff3f3 data/create/recipes/cutting/compat/regions_unexplored/silver_birch_log.json +3218231281a0afda1cef330a022e450efac18927 data/create/recipes/cutting/compat/regions_unexplored/silver_birch_wood.json +2002a66ac280b0a41679cb84422a591760fd88bc data/create/recipes/cutting/compat/regions_unexplored/socotra_log.json +de2954580e05806befc31b2d445577d3fae6ba47 data/create/recipes/cutting/compat/regions_unexplored/socotra_wood.json +7a3bf3bbdb5ff29682d60ac068ffa9f4bb423b34 data/create/recipes/cutting/compat/regions_unexplored/stripped_baobab_log.json +2c961586f828dca3a4107dc181e7e99ef7fecf7d data/create/recipes/cutting/compat/regions_unexplored/stripped_baobab_wood.json +497877a6e23c6f337f46e784e64f725e7507d98a data/create/recipes/cutting/compat/regions_unexplored/stripped_blackwood_log.json +092003ce37ad550040026e2913e9670f5c25169e data/create/recipes/cutting/compat/regions_unexplored/stripped_blackwood_wood.json +fa85fe2cf25bdfffb5bfcb0d7d2fc2733c8e2961 data/create/recipes/cutting/compat/regions_unexplored/stripped_blue_bioshroom_hyphae.json +68b7452484be51a5ca9e1f5daa5ef960e84c4a24 data/create/recipes/cutting/compat/regions_unexplored/stripped_blue_bioshroom_stem.json +25793b4b9d6bd7222da6e49c59a134f36c708d2b data/create/recipes/cutting/compat/regions_unexplored/stripped_brimwood_log.json +cec8ba2be437e8e50f18277dd7464cb5a51783c6 data/create/recipes/cutting/compat/regions_unexplored/stripped_brimwood_wood.json +d131167166b5eaabc2b116920693399624cc969c data/create/recipes/cutting/compat/regions_unexplored/stripped_cobalt_log.json +eb2300ca83bcffaf96fb192cd8f5f6be6ce4d1a5 data/create/recipes/cutting/compat/regions_unexplored/stripped_cobalt_wood.json +2bde40143b3b9e400f3e921dd74100f6e4c2febf data/create/recipes/cutting/compat/regions_unexplored/stripped_cypress_log.json +7dd7b4e0478e42f4141a384f5f5db3d24c6256ba data/create/recipes/cutting/compat/regions_unexplored/stripped_cypress_wood.json +55992382313212af1448785769cb98272736f913 data/create/recipes/cutting/compat/regions_unexplored/stripped_dead_log.json +b1808c9c2afea6f77cbc008d89a0d98c0baacb5b data/create/recipes/cutting/compat/regions_unexplored/stripped_dead_wood.json +4af8a646e1cda8e7cfb54d848af04bcd071cb742 data/create/recipes/cutting/compat/regions_unexplored/stripped_eucalyptus_log.json +892f2b15212cdd1ab5aa94bdced37c8ecd502fad data/create/recipes/cutting/compat/regions_unexplored/stripped_eucalyptus_wood.json +a0b555a70b9c45671175ea9d67c7f9bb6291ce39 data/create/recipes/cutting/compat/regions_unexplored/stripped_green_bioshroom_hyphae.json +0b361b9f1b0fffb0934f347e93e01f7f99c8c598 data/create/recipes/cutting/compat/regions_unexplored/stripped_green_bioshroom_stem.json +7887134005361356b59e3e8f79f747461aa90967 data/create/recipes/cutting/compat/regions_unexplored/stripped_joshua_log.json +12bcc42d67c110b7b57a2c15bfd184a7c8d5ced3 data/create/recipes/cutting/compat/regions_unexplored/stripped_joshua_wood.json +9c192bac86ada1020093ec7a38bae39f890f6867 data/create/recipes/cutting/compat/regions_unexplored/stripped_kapok_log.json +5cf8658dec167a5eae2555e231d86c6dee1e9f86 data/create/recipes/cutting/compat/regions_unexplored/stripped_kapok_wood.json +9b9d6b4ff28a9ee9d38e8ff7e2f66c5d741792d1 data/create/recipes/cutting/compat/regions_unexplored/stripped_larch_log.json +477187045049395be4b50747e70b8682bf627745 data/create/recipes/cutting/compat/regions_unexplored/stripped_larch_wood.json +9444611d488463cf40113a522c0125bcc901f59d data/create/recipes/cutting/compat/regions_unexplored/stripped_magnolia_log.json +c7093db236a350421fb1963233472c8d7b09407b data/create/recipes/cutting/compat/regions_unexplored/stripped_magnolia_wood.json +6ba2945063856e34dfde713c8b6caf9bcd0b59ad data/create/recipes/cutting/compat/regions_unexplored/stripped_maple_log.json +cb536b2a2638a6e378423c2ea2a3c8785f6fc7c7 data/create/recipes/cutting/compat/regions_unexplored/stripped_maple_wood.json +3ff0ebc63da709a8f4958b7439cf9a88c4f9a349 data/create/recipes/cutting/compat/regions_unexplored/stripped_mauve_log.json +a274dadaba1e1f489e7b531ac4eb02e808fc4f01 data/create/recipes/cutting/compat/regions_unexplored/stripped_mauve_wood.json +626e2bb1d62ab57bcadf3732491a6a1efd249035 data/create/recipes/cutting/compat/regions_unexplored/stripped_palm_log.json +50dee41bd5c412aa444a2fcc5c3d7638ab01133d data/create/recipes/cutting/compat/regions_unexplored/stripped_palm_wood.json +9270af6499ef6e5c0e097bee06637a518d3a83d7 data/create/recipes/cutting/compat/regions_unexplored/stripped_pine_log.json +58c10356ba51c77959e8f66f83e178d20cec097b data/create/recipes/cutting/compat/regions_unexplored/stripped_pine_wood.json +01b11c8a041883e21d5374b8afdef2fa47a55aee data/create/recipes/cutting/compat/regions_unexplored/stripped_pink_bioshroom_hyphae.json +0c4826e7e49e2cc704627235c2f1c8fab604019f data/create/recipes/cutting/compat/regions_unexplored/stripped_pink_bioshroom_stem.json +1177ce8821f01c08ab918ea24ea33b61cbd733cf data/create/recipes/cutting/compat/regions_unexplored/stripped_redwood_log.json +af8789a2a697cd2118d6809100a0c04d4c74794e data/create/recipes/cutting/compat/regions_unexplored/stripped_redwood_wood.json +4e441e9502ba4be4fc1c0da98bb53af30f366d1f data/create/recipes/cutting/compat/regions_unexplored/stripped_socotra_log.json +3f93dd9538e68c9b1482c41d531c359e6b144914 data/create/recipes/cutting/compat/regions_unexplored/stripped_socotra_wood.json +bcba754ec947af79701a5ffb0e64ff7a7ff92a09 data/create/recipes/cutting/compat/regions_unexplored/stripped_willow_log.json +f104dc175e416d675e358e6601442c09c356858e data/create/recipes/cutting/compat/regions_unexplored/stripped_willow_wood.json +6c4a98aa0396f330924d5be6a1fb7c1123c5d236 data/create/recipes/cutting/compat/regions_unexplored/stripped_yellow_bioshroom_hyphae.json +b1440d5254bf8dc5b619a7d871f2c51511498184 data/create/recipes/cutting/compat/regions_unexplored/stripped_yellow_bioshroom_stem.json +54ed3844da6abdf55939f1d3ed42394c55ce57c5 data/create/recipes/cutting/compat/regions_unexplored/willow_log.json +d0419337ab011df3685a6fea849c17904a03f2d7 data/create/recipes/cutting/compat/regions_unexplored/willow_wood.json +365f090b94466b7695e7beb7d0fc7b7e084e636c data/create/recipes/cutting/compat/regions_unexplored/yellow_bioshroom_hyphae.json +22d48a8e9cf5a566bbc566a92e6bf9762a33586a data/create/recipes/cutting/compat/regions_unexplored/yellow_bioshroom_stem.json 8a9e25c2c196ab94c9e7b5fcb2cf27bc161a8d1c data/create/recipes/cutting/compat/silentgear/netherwood_log.json 9e869a4b7bbb08fefa140292f0cb0806a795fc59 data/create/recipes/cutting/compat/silentgear/netherwood_wood.json d9cdc0eb674cdf08963ac8f97ee6a7ea2f99e779 data/create/recipes/cutting/compat/silentgear/stripped_netherwood_log.json @@ -365,6 +572,14 @@ e7f542ab1523379f218d47c7365f1d3be41036b4 data/create/recipes/cutting/compat/tcon aaa2b8cde03e0141fc4ccd3702fcb0d13966b391 data/create/recipes/cutting/compat/tconstruct/stripped_greenheart_wood.json dec7bfbdc2c974655110651365f701121370394a data/create/recipes/cutting/compat/tconstruct/stripped_skyroot_log.json 0486cee0f932eee89bb26c2fe5b0ed076d05d1be data/create/recipes/cutting/compat/tconstruct/stripped_skyroot_wood.json +0dcbd6c92adce8bc1fe8a1a6f4c21ad436d4852f data/create/recipes/cutting/compat/the_vault/chromatic_log.json +bb89e77d7cdb54b37434f65c1652112b14fcfcc7 data/create/recipes/cutting/compat/the_vault/driftwood_log.json +e7f497ec5ea4860147d5941df4b594526361886d data/create/recipes/cutting/compat/the_vault/overgrown_wooden_log.json +e04c07431e80d779b2bfdb1227d2b43896ead7f5 data/create/recipes/cutting/compat/the_vault/stripped_chromatic_log.json +e91c945669e5b838e28b73079be0218b7dbb438c data/create/recipes/cutting/compat/the_vault/stripped_driftwood_log.json +dcb888781e53a4bd13a39dc8dcf52d68c70daa11 data/create/recipes/cutting/compat/the_vault/stripped_overgrown_wooden_log.json +95824dae54de5c99be7f108882bb0add80d9f4f4 data/create/recipes/cutting/compat/the_vault/stripped_wooden_log.json +f43130d8c47dbfd21c89d519539e2d8b5437c108 data/create/recipes/cutting/compat/the_vault/wooden_log.json 9a2d7361718e64bf25c3660123ab9f506fad7dba data/create/recipes/cutting/compat/twilightforest/canopy_log.json 35f470c4fb8c1e651bcf8f161ebcaa0f9f888be2 data/create/recipes/cutting/compat/twilightforest/canopy_wood.json 02ef237d075e3033676e0229946c9c2bc9ae27e0 data/create/recipes/cutting/compat/twilightforest/dark_log.json @@ -397,6 +612,22 @@ d9ea151935b7257f9a799be5959d736a20eabf44 data/create/recipes/cutting/compat/twil 29649f4c23ddc00eebe7352dcca0d4c695807c62 data/create/recipes/cutting/compat/twilightforest/transformation_wood.json 10227f5cf8a9995f7e59c509ad20a33f907a1203 data/create/recipes/cutting/compat/twilightforest/twilight_oak_log.json 60c949a998c4ffe6f838faf729ef9a7a247a59df data/create/recipes/cutting/compat/twilightforest/twilight_oak_wood.json +b6c3111236dea7685ed893a2ddab6bacbb606170 data/create/recipes/cutting/compat/upgrade_aquatic/driftwood.json +b86b4710a31b8ab98d3f61972fd0e3a80d1cb788 data/create/recipes/cutting/compat/upgrade_aquatic/driftwood_log.json +1a155ced39a05ccbaa1fcd57052c8acced381860 data/create/recipes/cutting/compat/upgrade_aquatic/river_log.json +9b29505252b5c529d86e24c9c53d1190e73537d7 data/create/recipes/cutting/compat/upgrade_aquatic/river_wood.json +1104de0e8917d4fa8e51b036b573ef54bfbc7980 data/create/recipes/cutting/compat/upgrade_aquatic/stripped_driftwood.json +3fd253db6046bd5276cac5aea203f5293a49f843 data/create/recipes/cutting/compat/upgrade_aquatic/stripped_driftwood_log.json +ab08c98c58c2beab4805d0576cac3874c4774553 data/create/recipes/cutting/compat/upgrade_aquatic/stripped_river_log.json +b368756fa5ec34fa279f53fb99aea8f47757828a data/create/recipes/cutting/compat/upgrade_aquatic/stripped_river_wood.json +2619c5f3916147bf13a21f986f1889a67f885d1b data/create/recipes/cutting/compat/windswept/chestnut_log.json +40068203261db20d74bd84fa8c9e9a6fa9fc4ef5 data/create/recipes/cutting/compat/windswept/chestnut_wood.json +70a5cf4ac9996f9f424c064fc39fab8901f5c71c data/create/recipes/cutting/compat/windswept/holly_log.json +28833896273e3da215da3dee4da13e43ac56aecf data/create/recipes/cutting/compat/windswept/holly_wood.json +0e20d4166a792d5beba3e3ca17beb61253ceb162 data/create/recipes/cutting/compat/windswept/stripped_chestnut_log.json +33de028562009de6bdccd54f5b3835b7bbfe06a7 data/create/recipes/cutting/compat/windswept/stripped_chestnut_wood.json +68ddfcd839417094d75e889ed42ea244d07e2c0f data/create/recipes/cutting/compat/windswept/stripped_holly_log.json +a22e7839d935d0aca9de371ba50d956e0cbfa137 data/create/recipes/cutting/compat/windswept/stripped_holly_wood.json 0a3c2e35782d54a28c3c60eae10bdd6247d5977f data/create/recipes/cutting/crimson_hyphae.json cc4d09728d2407c0c972e696037d1b45db9a8bc2 data/create/recipes/cutting/crimson_stem.json ebdf404a6de7880a42527c35727fa4214eb8cff3 data/create/recipes/cutting/dark_oak_log.json @@ -475,12 +706,21 @@ d0fc937a3e7ae42fb1891b7b87adb2b57292e01d data/create/recipes/deploying/waxed_wea 733dd94b46186c19fdecced5d8231e46ea612cf2 data/create/recipes/deploying/waxed_weathered_cut_copper_slab_from_adding_wax.json cd4c050e6ad9227bf293768f2d8b965c0ecafeab data/create/recipes/deploying/waxed_weathered_cut_copper_stairs_from_adding_wax.json 6a9fa669a5cbdc2406ecc5eaf6992e0e8fa83b88 data/create/recipes/emptying/builders_tea.json +0b20bddac967edea53442c05c59ccf3306e9eb76 data/create/recipes/emptying/compat/alexsmobs/lava_bottle.json 5fb7e705b53ed84b607858be1db6a6d2765bea9c data/create/recipes/emptying/compat/farmersdelight/milk_bottle.json +054bd7804a710c498f605b82fd7d5055a4762829 data/create/recipes/emptying/compat/neapolitan/milk_bottle.json ab35f7d885d8f2c8ccf562938ac804f6cb4c38ad data/create/recipes/emptying/honey_bottle.json b4e78bf89677ff211c9a740231836ae0598cf0d8 data/create/recipes/filling/blaze_cake.json aea7837e33bfcbdd1e0b4386372b6595fd00ad1d data/create/recipes/filling/builders_tea.json 0c69ff301d149af8d36be10a1e49b0be53a21a49 data/create/recipes/filling/chocolate_glazed_berries.json +2d3b2d7c28fc0ea9f18be73d9523456b5c5946da data/create/recipes/filling/compat/aether/aether_grass_block.json +f158f5e509b43746871722edf802984e2b9cc024 data/create/recipes/filling/compat/alexsmobs/lava_bottle.json +5770b60bd7e89f2cac74df71b463a1101601d86f data/create/recipes/filling/compat/byg/lush_grass_block.json 1280689ba81877c6583c6941ed307ca35d4f00e4 data/create/recipes/filling/compat/farmersdelight/milk_bottle.json +fd578bb1e05901d0b959b1f445273619b55cde57 data/create/recipes/filling/compat/neapolitan/milk_bottle.json +3f0f458c0c044c7b1c4e203d7394d890ba286d86 data/create/recipes/filling/compat/regions_unexplored/peat_grass_block.json +ff16c74f09edbc67ed969f64270ca376bb8ea955 data/create/recipes/filling/compat/regions_unexplored/silt_grass_block.json +364eba8060e0d685dda6e88713a4a5c74f02ffbd data/create/recipes/filling/compat/vampirism/cursed_grass.json 12c19b46eec5bd371300dfcff5d2a9dd7169bb1b data/create/recipes/filling/glowstone.json afeb566e5f989c58d239a2f66084ce3d813d111a data/create/recipes/filling/grass_block.json 36d0f06ea9fa065ed85fc596e08725a2e6c8d4af data/create/recipes/filling/gunpowder.json @@ -489,6 +729,8 @@ c4e0373516bc98def80d0a13803cf980e3f905e0 data/create/recipes/filling/honey_bottl 3acf4a649751c23c8e39d649131939659c105a53 data/create/recipes/filling/redstone.json deab6ea169b756376d89ea2200e0387a865ed2fc data/create/recipes/filling/sweet_roll.json 788cce637f455ea33408e5be5b75ce0e4cc57c95 data/create/recipes/haunting/blackstone.json +798eaf3436e44fe388f9e37063dc5d1ee9f7fe43 data/create/recipes/haunting/compat/farmersdelight/rotten_tomato.json +eee126848cc68c4d9bd12f8ba8638133ad920da2 data/create/recipes/haunting/compat/hauntedharvest/rotten_apple.json 6f4039ea3aa482f15a18deba3d7d5fbd0e907c2e data/create/recipes/haunting/crimson_fungus.json 130d971b626bc871c23bd13d24b4fd23a954dbf2 data/create/recipes/haunting/glow_berries.json 4319a7d8ca417f1f2f1995b867c979e831a4de59 data/create/recipes/haunting/glow_ink_sac.json @@ -512,8 +754,8 @@ b18c81c17d395fb6e9291fc010576914000f069d data/create/recipes/haunting/warped_fun 4816a96aa0117b826ec01f9351c98eaec4e132fd data/create/recipes/item_application/andesite_casing_from_wood.json ac734bd72012ab3f0fd362fdcf237191874e1eae data/create/recipes/item_application/brass_casing_from_log.json df1d95a4e41fb01d0ac240f89dcf734e00d92853 data/create/recipes/item_application/brass_casing_from_wood.json -e9a1683091c56c762a5509c31658593cd4cf2b6b data/create/recipes/item_application/copper_casing_from_log.json -66589dac860c8f248f1ca3704698d984793763c6 data/create/recipes/item_application/copper_casing_from_wood.json +a9e164ba47552af7df82f011080d981420388bc6 data/create/recipes/item_application/copper_casing_from_log.json +92e97bf5e88f73d1320f30af95a90f58ceb58877 data/create/recipes/item_application/copper_casing_from_wood.json d8a741b87c14ab45d7f32a8f569c3f874b3a3076 data/create/recipes/item_application/railway_casing.json 9336b8b9f590ed993fd88c8707b57d845a5aa115 data/create/recipes/milling/allium.json d480b1b4c48440c6d6cb775321e95be7ea171aa5 data/create/recipes/milling/andesite.json @@ -529,6 +771,170 @@ d6073794b0be05fb52faf2d78d0daeb6ce3beab5 data/create/recipes/milling/calcite.jso a303570c10fc5ad55646555b1a72d2e2620fa34e data/create/recipes/milling/coal.json 9787581b978c78b40f92233556c6380c6ee9de53 data/create/recipes/milling/cobblestone.json 680b49ceb7d1052e5fe19e33f2eba6b7841ca817 data/create/recipes/milling/cocoa_beans.json +de5a7460348c3301381dd2635ac433a473bec04a data/create/recipes/milling/compat/ae2/certus_quartz.json +42151b6f50df8e05a7399eaa386369474a5a618c data/create/recipes/milling/compat/ae2/ender_pearl.json +b383c64d2559cd757b84fd5651f77c9ea95ebb00 data/create/recipes/milling/compat/ae2/fluix_crystal.json +880cfc22f510351e54a82242d6bc86acab4c3c92 data/create/recipes/milling/compat/ae2/sky_stone_block.json +d6c091225197381abae8bdba35318aa3a8bde1ad data/create/recipes/milling/compat/atmospheric/gilia.json +9dce11179bf92dc0519fad4b41c944a25226abff data/create/recipes/milling/compat/atmospheric/hot_monkey_brush.json +fd427a15577f3ea5612667e6b148ff253d2fd021 data/create/recipes/milling/compat/atmospheric/scalding_monkey_brush.json +80277c7f81e217740643c284f6c23b22373d5877 data/create/recipes/milling/compat/atmospheric/warm_monkey_brush.json +dd37341d15d8a6fdee096470a1eed7686bb40773 data/create/recipes/milling/compat/atmospheric/yucca_flower.json +5b05e3713b0e1e3bbf66cf87fcd8705c9b471ded data/create/recipes/milling/compat/autumnity/autumn_crocus.json +155b38f5087cadd93f268c272ad40ff5ae146a42 data/create/recipes/milling/compat/biomesoplenty/blue_hydrangea.json +b23f8cd24c43a995d11fe7eb8e639baf27556ca2 data/create/recipes/milling/compat/biomesoplenty/burning_blossom.json +8c6d77df0f70a7e46f4f1c8071dadc6388cc5798 data/create/recipes/milling/compat/biomesoplenty/glowflower.json +3eee4227b1ba4d5a27801a1cd7172698d5c9b9d2 data/create/recipes/milling/compat/biomesoplenty/lavender.json +ae27a8d0a76d911164a1dc23124a6b404b37b546 data/create/recipes/milling/compat/biomesoplenty/orange_cosmos.json +e383106ff8f877b5995e20c03af5e41e3db541d9 data/create/recipes/milling/compat/biomesoplenty/pink_daffodil.json +0de05838a8d236803379ea3766ef75883b3f1467 data/create/recipes/milling/compat/biomesoplenty/pink_hibiscus.json +7e69f8ff3f816e176670df7b4eb3340f5e7bc855 data/create/recipes/milling/compat/biomesoplenty/rose.json +213e079f32baa2879702b72bdf08f146877a0bb9 data/create/recipes/milling/compat/biomesoplenty/violet.json +b3f041e005491582f055da15871891357908d998 data/create/recipes/milling/compat/biomesoplenty/wildflower.json +d08c4fcebb79e2e02ac9cb4623124332a05ed661 data/create/recipes/milling/compat/biomesoplenty/wilted_lily.json +ca03746c39143de7867aeab2fb450fe0a67b69e3 data/create/recipes/milling/compat/botania/black_petal.json +3192777eeb363a55174a0eb58197ee686b2e02c7 data/create/recipes/milling/compat/botania/blue_petal.json +ee99c9bdcc4da8d160fc762ce7b394848d6a86d1 data/create/recipes/milling/compat/botania/brown_petal.json +1d8dab24913945268f819c24e132d8bb74f792c2 data/create/recipes/milling/compat/botania/cyan_petal.json +010a111f9810f142315bc94dfb1be03ee02508c4 data/create/recipes/milling/compat/botania/gray_petal.json +dee8b4c26d6b78aceeb8e5a264693dad4e81dbcb data/create/recipes/milling/compat/botania/green_petal.json +285a24e440d6a8cf34f2925a3eed7fa1d16e102b data/create/recipes/milling/compat/botania/light_blue_petal.json +3cc232966240394aaf5a3a5d16a3ceebd41597a0 data/create/recipes/milling/compat/botania/light_gray_petal.json +1225119a7dc1f69dfaf2cec32a0267b1d47ef72d data/create/recipes/milling/compat/botania/lime_petal.json +09e114685483329a78c3cecf8b312f16d26cd981 data/create/recipes/milling/compat/botania/magenta_petal.json +ae3e7eb55dda1846b8fd849ea1c8f1cbd37b9fca data/create/recipes/milling/compat/botania/orange_petal.json +bf13e9807a96efc1ef684f0129cc21110e44cc4c data/create/recipes/milling/compat/botania/pink_petal.json +7e0a167201b9c915579ede71ee7128bccdeee9c2 data/create/recipes/milling/compat/botania/purple_petal.json +4e7c1ae95f10bb3466dd542a2e04c726c599ecd9 data/create/recipes/milling/compat/botania/red_petal.json +28cbeb278022b2ac62cae2f3deaa65cb375c6456 data/create/recipes/milling/compat/botania/white_petal.json +dd1e35234c419b1576410a2590fd33d88c8bb9bd data/create/recipes/milling/compat/botania/yellow_petal.json +c7d2b07396448628123b81e1f34a8b131aa99c83 data/create/recipes/milling/compat/buzzier_bees/buttercup.json +0c4a3c7da1e151868740db2037504e35a02af3d0 data/create/recipes/milling/compat/buzzier_bees/pink_clover.json +355e89a3e003ae65ff06a9277c05699220eec569 data/create/recipes/milling/compat/buzzier_bees/white_clover.json +558968f56003e0e780549b0480baf188a97ab6be data/create/recipes/milling/compat/byg/allium_flower_bush.json +889ef537dc5f143f32c272a68f15c8c81c3f57a9 data/create/recipes/milling/compat/byg/alpine_bellflower.json +7c8697b5edc4dcb69eff85648fa3ae4488a5300f data/create/recipes/milling/compat/byg/amaranth.json +44017aa3e51f8ca54e308dc481386b537d520c1b data/create/recipes/milling/compat/byg/angelica.json +ad85f3711eb0d5ce4fab0bcd6d0cdad653e4917d data/create/recipes/milling/compat/byg/begonia.json +ae68d16d258c3cb7bd7d82ab56a3a923c8688c9a data/create/recipes/milling/compat/byg/bistort.json +ba50b69c307e21de6e2a3c3d7c27fc8be2f18f1b data/create/recipes/milling/compat/byg/black_rose.json +8e70425041f02cb6861baa07e980b709e932e402 data/create/recipes/milling/compat/byg/blue_sage.json +330c757a8405c7f2b100086c1caa2bcd4e7a8170 data/create/recipes/milling/compat/byg/california_poppy.json +307d7c6ad59f49b03f4c60d1c2608f199be0861e data/create/recipes/milling/compat/byg/compat/byg/white_sage.json +8c7dd6080ddf2523213dc4e95728153bef7da8df data/create/recipes/milling/compat/byg/compat/byg/winter_cyclamen.json +7d7ed065bca1702e20728ca7e4015bfbc52c18ce data/create/recipes/milling/compat/byg/crocus.json +16a9406c68544706b3e453a846d4887279ab754a data/create/recipes/milling/compat/byg/cyan_amaranth.json +64d05bb3b14de133bedcd40f3bdc148b424885fa data/create/recipes/milling/compat/byg/cyan_rose.json +2ec5e00a2a35592551a90df16a775230c13ee1f0 data/create/recipes/milling/compat/byg/cyan_tulip.json +d62aca5159ec5af5c8a96cebf4d88b883b46ba8e data/create/recipes/milling/compat/byg/daffodil.json +fc8b36b5e75f81abb96b69a8ae2f73d23614b285 data/create/recipes/milling/compat/byg/delphinium.json +0185737dcd02afe3c953d1785130503e3c56a846 data/create/recipes/milling/compat/byg/fairy_slipper.json +cd17f9e09d4b7e364eb57b3c3d16d4e4e89bcbc8 data/create/recipes/milling/compat/byg/firecracker_flower_bush.json +55032b5eb18a2f915478a8d443672c9c74bac5f7 data/create/recipes/milling/compat/byg/foxglove.json +85201db5be1ff83f242152fbc6f93c94d78943ff data/create/recipes/milling/compat/byg/green_tulip.json +de256ad24623760e3cce64ba8bf92022b23654cc data/create/recipes/milling/compat/byg/guzmania.json +6f0ed2a9f13757eb83b020cb15bea436a1471b79 data/create/recipes/milling/compat/byg/hydrangea_bush.json +81f4d5aa218f29d23e059392e1b38c8006a27734 data/create/recipes/milling/compat/byg/incan_lily.json +ccf127c5b9b737be1163386fef874902bba3b2d6 data/create/recipes/milling/compat/byg/iris.json +cdf0d447001fc2bd7e892eaf5cac44659e362ff7 data/create/recipes/milling/compat/byg/kovan_flower.json +c2e7bf878b81f08615439c8885ad4d87a5c5ef65 data/create/recipes/milling/compat/byg/lazarus_bellflower.json +5097b63f8a0b9f92f2b8c5c4cd455caae6f0e11b data/create/recipes/milling/compat/byg/lolipop_flower.json +1b14f57675eb8e7b993a4d61f7d033af3c02827f data/create/recipes/milling/compat/byg/magenta_amaranth.json +ab7c30e4e3ecbc7c12534ca217dd62f373a6dc9f data/create/recipes/milling/compat/byg/magenta_tulip.json +413ee06756e901592b8cdd860e9e6e4539bf604e data/create/recipes/milling/compat/byg/orange_amaranth.json +221cd8754c18e88ba6fa48b47efc7b707e05def8 data/create/recipes/milling/compat/byg/orange_daisy.json +3506478a12138ac9934c9075b31ac45f4900a4a0 data/create/recipes/milling/compat/byg/orchid.json +a31402be7db0a5a9c96cc021cf53056db5720a50 data/create/recipes/milling/compat/byg/osiria_rose.json +302eef96244c037f9c225ad4440e34b7d46617f3 data/create/recipes/milling/compat/byg/peach_leather_flower.json +784bcccb6e0625df90031dfed9849457c1446d93 data/create/recipes/milling/compat/byg/pink_allium.json +a3f0dbe453c147a72ef02d7b0201dec1cc4b6c91 data/create/recipes/milling/compat/byg/pink_allium_flower_bush.json +adb8e25f4d5492d2d7a6604fca87e1789d3c8d4d data/create/recipes/milling/compat/byg/pink_anemone.json +4b2e0f9ea1b05617a022eaf270561929a1b3d1e4 data/create/recipes/milling/compat/byg/pink_daffodil.json +f60a8fb4853223699d3378482588559062df5f70 data/create/recipes/milling/compat/byg/protea_flower.json +4eda34601212c933e61d8de9485331a35dadfb96 data/create/recipes/milling/compat/byg/purple_amaranth.json +03ccb7eb3bb917179eda10b8a85ee6b095614d60 data/create/recipes/milling/compat/byg/purple_rose.json +c25b26def2016a516b34bb2f37f49aa9f1de7d53 data/create/recipes/milling/compat/byg/purple_tulip.json +433af73467de5cda9658e96a3cc42d9637f7b0cc data/create/recipes/milling/compat/byg/richea.json +2e656dfe3b59617aa2de293338f3aad8bfeaeb2d data/create/recipes/milling/compat/byg/rose.json +a8ca6690e32dc594c03057b529e89d77385bc63b data/create/recipes/milling/compat/byg/silver_vase_flower.json +1fbd9af28ada2330f9f96cbbdd3a33f8cdd245f0 data/create/recipes/milling/compat/byg/snowdrops.json +0e32bf6c937d5773ad863c302da5ab563cbe954b data/create/recipes/milling/compat/byg/tall_allium.json +f16be0f6dbd6c3f4fbff36d7dcb4391b4cbbbe6a data/create/recipes/milling/compat/byg/tall_pink_allium.json +321b60d3b774e468f173a6c4afc520e46ae089c7 data/create/recipes/milling/compat/byg/torch_ginger.json +b50ae491f0732224ac10b005c1f2bfd05e8558b0 data/create/recipes/milling/compat/byg/violet_leather_flower.json +d0964f1cca07620383e41a9e43224a04694e009f data/create/recipes/milling/compat/byg/white_anemone.json +2b31edd1acc8487bd0e744a7f5394e13d1582a7f data/create/recipes/milling/compat/byg/white_puffball_cap.json +eb9606bbb2e4c6fb82b6607c8d5c23834d9e44a8 data/create/recipes/milling/compat/byg/winter_rose.json +1732969a11d677b825758f6c4af2cdbcdc365898 data/create/recipes/milling/compat/byg/winter_scilla.json +9266eaf6e2259fccb6e2aa57a9e19fc1faeb53fe data/create/recipes/milling/compat/byg/yellow_daffodil.json +fda00f49b9a5758ee7d24f2aeab81a3cc690544a data/create/recipes/milling/compat/byg/yellow_tulip.json +2e6a7a1b0e8ab1d6e514a30a21d47b404cfdcd45 data/create/recipes/milling/compat/druidcraft/lavender.json +5be32cdd48cf7d9e3f8273fc3479d559070b9872 data/create/recipes/milling/compat/environmental/bird_of_paradise.json +102130e75ea8f2b8c99ad9641d293a4e588912cf data/create/recipes/milling/compat/environmental/bluebell.json +50df88584dd6086c0dbb23fb16b7f36fee381534 data/create/recipes/milling/compat/environmental/blue_delphinium.json +a4beb691042be811eee8a130ff023065620b20b9 data/create/recipes/milling/compat/environmental/cartwheel.json +d1d388667f9c8a5666cc2a1ef2eb77716a0b18ed data/create/recipes/milling/compat/environmental/dianthus.json +ee3d1989d4a1069909aaeb99374602d0e92d6dfc data/create/recipes/milling/compat/environmental/magenta_hibiscus.json +e2226caf8677a0a63f93573e1d3443f0cc6c7294 data/create/recipes/milling/compat/environmental/orange_hibiscus.json +c5eda065f7f8d2b4e1b057896c96e097d0720e50 data/create/recipes/milling/compat/environmental/pink_delphinium.json +8a9c9d36d91a24f20a3be0d6fdd9c2858e886e0d data/create/recipes/milling/compat/environmental/pink_hibiscus.json +23c8b8a1cad79931bcb52562919108fbf5d114cd data/create/recipes/milling/compat/environmental/purple_delphinium.json +38370b0dd78f75b1d3ba2c11c248c4f17191c7e4 data/create/recipes/milling/compat/environmental/purple_hibiscus.json +b437fd46e7980897b66c285f65f9a2c3ee1213a0 data/create/recipes/milling/compat/environmental/red_hibiscus.json +72e67e7da9d0ad198106c33b34463ba5dd5c4e71 data/create/recipes/milling/compat/environmental/red_lotus_flower.json +c14ba9d30c2a111de9ffba9d3e6a6ca34f2e660c data/create/recipes/milling/compat/environmental/violet.json +15b94ea2ddabb3ac7cea57defae746d6c16e2932 data/create/recipes/milling/compat/environmental/white_delphinium.json +85fcaa71b40ff82c1ba73fc7a186a798af87c042 data/create/recipes/milling/compat/environmental/white_lotus_flower.json +ffa08663414289ab1e6b9af09ac992cc8f4b5571 data/create/recipes/milling/compat/environmental/yellow_hibiscus.json +582ed748a36073e5f6b2f20558a7d640ab204112 data/create/recipes/milling/compat/regions_unexplored/alpha_dandelion.json +08903c2ae46ed55b228f6e5d80e292832ed39996 data/create/recipes/milling/compat/regions_unexplored/alpha_rose.json +28a9a042217a6d2f33a8694a6765677a2d48acf1 data/create/recipes/milling/compat/regions_unexplored/aster.json +851e74bb923dadf08ec08892c807b927daeffd3c data/create/recipes/milling/compat/regions_unexplored/black_snowbelle.json +6b272b558750ccab8d21cf69e8feae4a1b322e3a data/create/recipes/milling/compat/regions_unexplored/bleeding_heart.json +2feb233a3a6a0115ec07177a872b1f212e44348f data/create/recipes/milling/compat/regions_unexplored/blue_lupine.json +0b890ba71a0fed340434e0eb4a18e9b1a94a7945 data/create/recipes/milling/compat/regions_unexplored/blue_snowbelle.json +4b533452bbcb67755c0862c1d9df7b84b51b2aba data/create/recipes/milling/compat/regions_unexplored/brown_snowbelle.json +8428053ea97f5a0b529ba313ede2d4bcfb0ce2d8 data/create/recipes/milling/compat/regions_unexplored/cactus_flower.json +01cd229ba66916d50721e5472393192d673ea879 data/create/recipes/milling/compat/regions_unexplored/cyan_snowbelle.json +ddaee3e58fd3cfdc121d68ea8065405f7c6a7117 data/create/recipes/milling/compat/regions_unexplored/daisy.json +fcc82dcddf53ab03ab0907a3c0a295e5a3c71eea data/create/recipes/milling/compat/regions_unexplored/day_lily.json +5c51e4387b56370ca79d30d41ceca8d693f9f6ed data/create/recipes/milling/compat/regions_unexplored/dorcel.json +7410412917b78ee0fb9a64da9b8aa416265f24ee data/create/recipes/milling/compat/regions_unexplored/felicia_daisy.json +f43ead46910959e5dafc1c685ed6845acf2bf57f data/create/recipes/milling/compat/regions_unexplored/fireweed.json +30101899ecbd9adaf8df2a3e9ca57074109febb4 data/create/recipes/milling/compat/regions_unexplored/glistering_bloom.json +3621368a53d8c4e2fb81456ee5b896e0c2aac944 data/create/recipes/milling/compat/regions_unexplored/gray_snowbelle.json +dee331f46908e076cd8bb016c71c5f2980e6018a data/create/recipes/milling/compat/regions_unexplored/green_snowbelle.json +f27484474c8bc06e9d3eaff6c3a79ee61cb0ee55 data/create/recipes/milling/compat/regions_unexplored/hibiscus.json +fcdb798450ca8d9272b1b08d1ae7061b6513907f data/create/recipes/milling/compat/regions_unexplored/hyssop.json +c8fb81b89bc53f1e1e3043b68d7b05ed9175a0f3 data/create/recipes/milling/compat/regions_unexplored/light_blue_snowbelle.json +f101f15d8344cdff67e982aae840db2b632df3aa data/create/recipes/milling/compat/regions_unexplored/light_gray_snowbelle.json +41dc49152f42ef1596e0b6e6ede5b53cd6bf9cc2 data/create/recipes/milling/compat/regions_unexplored/lime_snowbelle.json +9e7ce1ff212dba0f37e726b7ad1fd2762644de41 data/create/recipes/milling/compat/regions_unexplored/magenta_snowbelle.json +7617fa67342a7efc5529de17e6d90d1bd7bf8148 data/create/recipes/milling/compat/regions_unexplored/mallow.json +889318a4888a2fa9e5015f9f4420bf593c221cff data/create/recipes/milling/compat/regions_unexplored/orange_coneflower.json +75362911685159ba8abf805f942ecd23b1fdfe8b data/create/recipes/milling/compat/regions_unexplored/orange_snowbelle.json +5d912e85b826deed1f61534b594b0b5c869a812a data/create/recipes/milling/compat/regions_unexplored/pink_lupine.json +2c5b1bc633cfdad744a9cf5516cc540902f47d32 data/create/recipes/milling/compat/regions_unexplored/pink_snowbelle.json +ef2dfe9a86fde1e47de3f332277fceb55d360a92 data/create/recipes/milling/compat/regions_unexplored/poppy_bush.json +59b5ede608f6e69054e74d4e20336cd65593698a data/create/recipes/milling/compat/regions_unexplored/purple_coneflower.json +abf4d0179c515640cd99b294333f17f96c3c83c1 data/create/recipes/milling/compat/regions_unexplored/purple_lupine.json +8819da9d593f8f563a682e616ac4fbbacdb4005f data/create/recipes/milling/compat/regions_unexplored/purple_snowbelle.json +918c2d64867c04a7c08527c083e95d82ad239a0d data/create/recipes/milling/compat/regions_unexplored/red_lupine.json +9d45bcdca3599e1ceb46907b64a13202b0f6020d data/create/recipes/milling/compat/regions_unexplored/red_snowbelle.json +349435ceb05a93816e946bfe35ec8d7c92e57762 data/create/recipes/milling/compat/regions_unexplored/salmon_poppy_bush.json +02ce73fd74026ea7583e83c42b0cb30144443d61 data/create/recipes/milling/compat/regions_unexplored/tassel.json +237c432707f8a10ed1492ed6ae0358375e37772d data/create/recipes/milling/compat/regions_unexplored/tsubaki.json +0feba76fe40aa578326ff206ae343331fb382e30 data/create/recipes/milling/compat/regions_unexplored/waratah.json +b70cc5a3d35d438108b2c028f374d5ffb4f6b098 data/create/recipes/milling/compat/regions_unexplored/white_snowbelle.json +a31add17c6cffa1310f4fe3cf2049c75172fe60d data/create/recipes/milling/compat/regions_unexplored/white_trillium.json +e97397980c87cb73e81d4b27fbf7e05c68e473f4 data/create/recipes/milling/compat/regions_unexplored/wilting_trillium.json +a23c2973e496cc3cc6f294c5d06e547c6696b9cf data/create/recipes/milling/compat/regions_unexplored/yellow_lupine.json +ad68b82791487bde56dd7e60ad99da72a67abd68 data/create/recipes/milling/compat/regions_unexplored/yellow_snowbelle.json +e91fedfa7b5ae32a60ffb915b999e16de9f1ed66 data/create/recipes/milling/compat/supplementaries/flax.json +1476cbf643e972cb0c554081ada9b5d583aac6a9 data/create/recipes/milling/compat/tconstruct/nercotic_bone.json +ddc4dbfef080def2e5f0a3a7e22f16b82dadc99a data/create/recipes/milling/compat/upgrade_aquatic/flowering_rush.json +77c588e4860fe29912b13b8d221c559141379d8a data/create/recipes/milling/compat/upgrade_aquatic/pink_searocket.json +04e638f5116c962884ca48efe6c113eecd2cf519 data/create/recipes/milling/compat/upgrade_aquatic/white_searocket.json 0130258652f73a3cad7ec1b1c55aa34a4e2ad062 data/create/recipes/milling/cornflower.json 78eefaaebdcab5ded5bda2b87ecfacc0afa7de7a data/create/recipes/milling/dandelion.json 2833601a45709b33c60d49e5647831df542db7f3 data/create/recipes/milling/dripstone_block.json @@ -561,33 +967,78 @@ a91dae829938d3f69a7007d3cf8db02b70fe3a7f data/create/recipes/milling/white_tulip 74bb289e20e891112f4964761eb76c3ce4d3c8cd data/create/recipes/milling/wool.json 5f1b8a82af091cd4589ecfa5c13a4db6ad9c51b9 data/create/recipes/mixing/andesite_alloy.json 48604c2205b18fe1401eac58d14aa1677cbd9c2b data/create/recipes/mixing/andesite_alloy_from_zinc.json -b8dfa0e65b356e88f264ac4ee95672e0afc5961c data/create/recipes/mixing/brass_ingot.json +d06c1d0362dccc4e5f8b22f851dc8316b35c06b0 data/create/recipes/mixing/brass_ingot.json 840a9008d4531425beadfcf224d21e938acc4502 data/create/recipes/mixing/chocolate.json e7b86d4ca5de2df474794424d93b447e5f9dcdc3 data/create/recipes/mixing/chocolate_melting.json +39e832016fa5e360434271505d09ced17a40e7eb data/create/recipes/mixing/compat/ae2/fluix_crystal.json +f0648e6b963e1ac1c1756f769988e779963eb1a1 data/create/recipes/mixing/compat/regions_unexplored/peat_mud.json +a2cf143f409a26709ad119f151c611331dca960c data/create/recipes/mixing/compat/regions_unexplored/silt_mud.json 4cf9a0979fb6401c51c763d71f0bb53ea2c8c32b data/create/recipes/mixing/dough_by_mixing.json ac2a2456e2f0ccd74db6dc5ad029eb4e6781a25d data/create/recipes/mixing/honey.json 251c09ac25bb73e092fac483ceb5a9196a479919 data/create/recipes/mixing/lava_from_cobble.json 939c55202f06b50cec3c16e66e85f915f2272db2 data/create/recipes/mixing/mud_by_mixing.json 4454cb7a73571d90e19826ee394b0c9e52ac8620 data/create/recipes/mixing/tea.json +77de88a8d25b974a63a5d132dd5461523e798fe2 data/create/recipes/pressing/aether_dirt_path.json +92a1198c990660458565ca871520b7c32fb0e24b data/create/recipes/pressing/aether_dirt_path_from_grass.json 8bd950c78b4db3b7f5a9a1f42c116677049b77fc data/create/recipes/pressing/brass_ingot.json -8dee39f86784636639790b0ed1bbd5c845522952 data/create/recipes/pressing/copper_ingot.json +1fe1caaec87a1a7b3cd739c372829f48386d2f8a data/create/recipes/pressing/compat/atmospheric/crustose_path.json +4d4821506da8c82eabc6109d1cfcb4fa980e54c8 data/create/recipes/pressing/compat/betterendforge/amber_moss_path.json +16c653a9c8771662d060a6151fa77ab4ce8d2614 data/create/recipes/pressing/compat/betterendforge/cave_moss_path.json +e715dd1d3961de8a817ddcd6a1c411761966e57e data/create/recipes/pressing/compat/betterendforge/chorus_nylium_path.json +29a514bea64e7e3f7fe04c2d19749d174b4e42b3 data/create/recipes/pressing/compat/betterendforge/crystal_moss_path.json +7b377ce79e3e32a7b3fece940fb0b234d255e3fe data/create/recipes/pressing/compat/betterendforge/end_moss_path.json +17c68db229cef447679eeba25da1fe7de17be50d data/create/recipes/pressing/compat/betterendforge/end_myclium_path.json +fb6d54e0ee3c8831060a8573d16814217888ae0e data/create/recipes/pressing/compat/betterendforge/jungle_moss_path.json +77dbbdd01f36f1ede5018bc1feb3dff960988129 data/create/recipes/pressing/compat/betterendforge/pink_moss_path.json +200b0a7f459b4c5f5bd7d6fe46ad1959923b9cb0 data/create/recipes/pressing/compat/betterendforge/shadow_grass_path.json +8a53f6ea8dab59477d462eb929f7815f52b34095 data/create/recipes/pressing/compat/byg/lush_grass_path.json +4454d7dda6c2b5555227c5c147373df195adedb4 data/create/recipes/pressing/compat/environmental/mycelium_path.json +ed3edcf493402051fcff435a5840295b218a078c data/create/recipes/pressing/compat/environmental/podzol_path.json +0afcbaa527a8063982caf9a541d1af43fe6becbb data/create/recipes/pressing/compat/infernalexp/crimson_nylium_path.json +621f9c7eae4f6f5065ecd48ffe1b0c5c9e6147d3 data/create/recipes/pressing/compat/infernalexp/soul_soil_path.json +e049a1c6951c93a53122fc5adb27bee35ca62786 data/create/recipes/pressing/compat/infernalexp/warped_nylium_path.json +955613e743a216b10d54f94b89b23166adb49a40 data/create/recipes/pressing/compat/vampirism/cursed_earth_path.json +4ce4f4b71058d04be148cc2ad2318abe27a58359 data/create/recipes/pressing/copper_ingot.json +24bb356954866c69a279a9f0435035d8bafdddec data/create/recipes/pressing/cursed_earth_path_from_grass.json 744e1a66857f20a094ba02a3e3613210a815493e data/create/recipes/pressing/gold_ingot.json fb105ac920ce9dc0b883bfa40029b69709bceb38 data/create/recipes/pressing/iron_ingot.json daf5c0c9e3f13d2004d53c54f4c1c36ae098d1ae data/create/recipes/pressing/path.json +1c1224d02f5f9941d2e99620fa68767ba5578603 data/create/recipes/pressing/peat_dirt_path.json +3fbfc3b129748f2e5f1964f1e797812d331c8719 data/create/recipes/pressing/peat_dirt_path_from_grass.json +a2330ec4b822b3109efdf86a244ffa5b71e3a16c data/create/recipes/pressing/silt_dirt_path.json +0c654a6513d9aef7929f7520309626d93453c52d data/create/recipes/pressing/silt_dirt_path_from_grass.json 629f7feb2048319f575e08effa8f79c3910a7147 data/create/recipes/pressing/sugar_cane.json eaff1b1f905b1073366cb8b504f0ae68a59ad3a3 data/create/recipes/sandpaper_polishing/rose_quartz.json +fea41613d29e56d5995e15be6f0dbfb8578973d9 data/create/recipes/splashing/atmospheric/arid_sand.json +83f10d640ff21fab00fbae099791d84cb82b36d7 data/create/recipes/splashing/atmospheric/red_arid_sand.json 1eb8656f14fffd3e6c3791465e6880ab8c179765 data/create/recipes/splashing/black_concrete_powder.json 5215f9b283ba582e1029de2b21cac5986c1eadbd data/create/recipes/splashing/blue_concrete_powder.json 3ce6bc6cfbdeb52c2514f5620db9f0b95ee18d3a data/create/recipes/splashing/brown_concrete_powder.json +f2cda0bd0d012bd8443bfc7b317df2390acdacc5 data/create/recipes/splashing/byg/cryptic_magma_block.json 20fa6574bd8903f2cc0e352bcd8fd6580b598365 data/create/recipes/splashing/crushed_raw_copper.json 909331cf4a04345ad4be47848d2850f0133240bd data/create/recipes/splashing/crushed_raw_gold.json 7f516ebd70fd756ae6d0f07c625ab72bf1859cb2 data/create/recipes/splashing/crushed_raw_iron.json 84fa67d901de38656af11bbcf644361abf651ebb data/create/recipes/splashing/crushed_raw_zinc.json e0746e69dbfee5a7e226980d496490b534f848a9 data/create/recipes/splashing/cyan_concrete_powder.json +8218d04c2da1ab30e23e1fba6de1248cf8d7c96d data/create/recipes/splashing/endergetic/petrified_end_corrock.json +8ee0a11c90a626d9258d1545cf2f1b85f2049634 data/create/recipes/splashing/endergetic/petrified_end_corrock_block.json +812fd40cea41278148fed3bedafbf5f5ae29672a data/create/recipes/splashing/endergetic/petrified_end_corrock_crown.json +331b103e45442901dfdee8dd1848f5444dd49f26 data/create/recipes/splashing/endergetic/petrified_nether_corrock.json +b555d0a1355e7bef0c196fade709d713f65b551c data/create/recipes/splashing/endergetic/petrified_nether_corrock_block.json +2b51fd84596f9384c0c62a81940e601719a9941e data/create/recipes/splashing/endergetic/petrified_nether_corrock_crown.json +b12bb2d95b58e461da245f427bf2a85986069423 data/create/recipes/splashing/endergetic/petrified_overworld_corrock.json +70682b89453b54bc5bbfba86770443f45a19b8b5 data/create/recipes/splashing/endergetic/petrified_overworld_corrock_block.json +e3f12ec5d449caa54ebe1c453a89373492b8f48a data/create/recipes/splashing/endergetic/petrified_overworld_corrock_crown.json +05d3228c93b9d42489fbd79dd539a664f6206dba data/create/recipes/splashing/galosphere/crushed_raw_silver.json 64535aaa3a5d4b98791337b1a8ce50ad3d39a8ac data/create/recipes/splashing/gravel.json dd9508767f68cc8b5cc2f642690961e0c22c9985 data/create/recipes/splashing/gray_concrete_powder.json 8908b452e6bc1290ebb8cfefc2c066460de93bff data/create/recipes/splashing/green_concrete_powder.json +869a639fd7069495693fd2106165b57ce674201b data/create/recipes/splashing/ic2/crushed_raw_aluminum.json +6fd01478f838507f9e0daf7eb0a19e8315e03cb8 data/create/recipes/splashing/ic2/crushed_raw_silver.json +b5a0a0fc79bf310965aa16e78044b3f6a8a9998f data/create/recipes/splashing/ic2/crushed_raw_tin.json +00b8d0c2577cc36da1c862234b61fb7d1cfe3e65 data/create/recipes/splashing/ic2/crushed_raw_uranium.json 32d3cbf2d10b97a40c9f1f70b004c720782eabda data/create/recipes/splashing/ice.json +571631efe13837db49d24e10efc2a5de78cd84b9 data/create/recipes/splashing/iceandfire/crushed_raw_silver.json 856e240d49ecf0b722ed13f8310d93f388ffcede data/create/recipes/splashing/immersiveengineering/crushed_raw_aluminum.json 5dd083b9e4cf459b9567ee17f2ad71ca31161200 data/create/recipes/splashing/immersiveengineering/crushed_raw_lead.json 6707b4319280ce28e1edd594e58549f65cd8376c data/create/recipes/splashing/immersiveengineering/crushed_raw_nickel.json @@ -603,18 +1054,23 @@ ba674b07d9f6b288ab79917c21e435b7205cbf4f data/create/recipes/splashing/mekanism/ 44ffc1132df9ea418453dc580d8250107c34b1a2 data/create/recipes/splashing/mekanism/crushed_raw_tin.json 7960240bceacdbba1458e354823ae5b4e076d4d0 data/create/recipes/splashing/mekanism/crushed_raw_uranium.json 33010500d02167a49b9e697fdeba3c169a80dee3 data/create/recipes/splashing/orange_concrete_powder.json +5d8d7e3ee9c80e2eca12c1073f5b7ecfb2b60b53 data/create/recipes/splashing/oreganized/crushed_raw_lead.json +1f4e9a5766928ae2302c9736437d04272a305235 data/create/recipes/splashing/oreganized/crushed_raw_silver.json bead7ac4cb59e935f62bb87c077494fcbca6f18f data/create/recipes/splashing/pink_concrete_powder.json 2b2404f137bb0fac204abddd4259e916a0b1c7b5 data/create/recipes/splashing/purple_concrete_powder.json +c9778afebf604c27dfb69b1095e6d7e07c37008d data/create/recipes/splashing/quark/rusty_iron_plate.json 8ad27aeffbd10f19eb9e3e8c71c9851024056999 data/create/recipes/splashing/red_concrete_powder.json c4230c9499ced6d542f7ac2bf8601037f37ec7b5 data/create/recipes/splashing/red_sand.json cccf4ef0891992687dcb7ce5c644499d93210b8a data/create/recipes/splashing/sand.json 5f830a62c14cfa86fdc59d3405ac79fa626c53ea data/create/recipes/splashing/soul_sand.json 0ee6d52e8966b6189f2841bcdf41417df1ab072c data/create/recipes/splashing/stained_glass.json f241ec6a8ad063b28281c18e1fbb03c482d7af8b data/create/recipes/splashing/stained_glass_pane.json +712b367223067cc468346d2fa485779f1501d5ec data/create/recipes/splashing/supplementaries/blackboard.json 43bcc2f22cca830f11a48f4b48f699001f4ffbb5 data/create/recipes/splashing/thermal/crushed_raw_lead.json 4bc875e07f963f417e0a427ca7a6f9f9a40213ac data/create/recipes/splashing/thermal/crushed_raw_nickel.json 0ceeb253b478dde532e4de01d1ff60ed09819388 data/create/recipes/splashing/thermal/crushed_raw_silver.json 5fa818c04cb65048be0246ade3946cc1e01a0772 data/create/recipes/splashing/thermal/crushed_raw_tin.json +a8fd822419fbb47b37412742fe13a785ae147d21 data/create/recipes/splashing/the_vault/ornate_chain_rusty.json 23d70b869e50a1e11df264f3640becac4ec9100d data/create/recipes/splashing/wheat_flour.json a883796342143a5f2b5bc68d230b725964abdb8f data/create/recipes/splashing/white_concrete_powder.json d09bcaa2334e05e6cce37b7342c7de84ce954bb9 data/create/recipes/splashing/wool.json diff --git a/src/generated/resources/assets/create/blockstates/package_frogport.json b/src/generated/resources/assets/create/blockstates/package_frogport.json new file mode 100644 index 0000000000..36509ad6ed --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/package_frogport.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/package_frogport/block" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/package_port.json b/src/generated/resources/assets/create/blockstates/package_port.json deleted file mode 100644 index bc1cfe6bea..0000000000 --- a/src/generated/resources/assets/create/blockstates/package_port.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "create:block/package_port/block" - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 3ceb4c4341..f1d93662f4 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -561,7 +561,7 @@ "block.create.oxidized_copper_tile_slab": "qɐןS ǝןı⟘ ɹǝddoƆ pǝzıpıxO", "block.create.oxidized_copper_tile_stairs": "sɹıɐʇS ǝןı⟘ ɹǝddoƆ pǝzıpıxO", "block.create.oxidized_copper_tiles": "sǝןı⟘ ɹǝddoƆ pǝzıpıxO", - "block.create.package_port": "ʇɹoԀ ǝbɐʞɔɐԀ", + "block.create.package_frogport": "ʇɹodboɹℲ ǝbɐʞɔɐԀ", "block.create.packager": "ɹǝbɐʞɔɐԀ", "block.create.packager_link": "ʞuıꞀ ɹǝbɐʞɔɐԀ", "block.create.peculiar_bell": "ןןǝᗺ ɹɐıןnɔǝԀ", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index dd22dac578..de64b72f9e 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -561,7 +561,7 @@ "block.create.oxidized_copper_tile_slab": "Oxidized Copper Tile Slab", "block.create.oxidized_copper_tile_stairs": "Oxidized Copper Tile Stairs", "block.create.oxidized_copper_tiles": "Oxidized Copper Tiles", - "block.create.package_port": "Package Port", + "block.create.package_frogport": "Package Frogport", "block.create.packager": "Packager", "block.create.packager_link": "Packager Link", "block.create.peculiar_bell": "Peculiar Bell", diff --git a/src/generated/resources/assets/create/models/item/package_frogport.json b/src/generated/resources/assets/create/models/item/package_frogport.json new file mode 100644 index 0000000000..0598cfec30 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/package_frogport.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/package_frogport/item" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/package_port.json b/src/generated/resources/assets/create/models/item/package_port.json deleted file mode 100644 index c814579a62..0000000000 --- a/src/generated/resources/assets/create/models/item/package_port.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "create:block/package_port/item" -} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/package_port.json b/src/generated/resources/data/create/loot_tables/blocks/package_frogport.json similarity index 75% rename from src/generated/resources/data/create/loot_tables/blocks/package_port.json rename to src/generated/resources/data/create/loot_tables/blocks/package_frogport.json index f7b4121150..2ffb7daf2c 100644 --- a/src/generated/resources/data/create/loot_tables/blocks/package_port.json +++ b/src/generated/resources/data/create/loot_tables/blocks/package_frogport.json @@ -11,11 +11,11 @@ "entries": [ { "type": "minecraft:item", - "name": "create:package_port" + "name": "create:package_frogport" } ], "rolls": 1.0 } ], - "random_sequence": "create:blocks/package_port" + "random_sequence": "create:blocks/package_frogport" } \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json index 6241fa8bef..8182be960e 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json @@ -123,7 +123,7 @@ "create:controls", "create:item_vault", "create:packager", - "create:package_port", + "create:package_frogport", "create:packager_link", "create:stock_ticker", "create:redstone_requester", diff --git a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java index 69d0caaf00..7620801861 100644 --- a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java +++ b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java @@ -166,11 +166,11 @@ import com.simibubi.create.content.logistics.depot.DepotRenderer; import com.simibubi.create.content.logistics.depot.EjectorBlockEntity; import com.simibubi.create.content.logistics.depot.EjectorRenderer; import com.simibubi.create.content.logistics.depot.EjectorVisual; +import com.simibubi.create.content.logistics.frogport.FrogportBlockEntity; +import com.simibubi.create.content.logistics.frogport.FrogportRenderer; import com.simibubi.create.content.logistics.funnel.FunnelBlockEntity; import com.simibubi.create.content.logistics.funnel.FunnelRenderer; import com.simibubi.create.content.logistics.funnel.FunnelVisual; -import com.simibubi.create.content.logistics.packagePort.PackagePortBlockEntity; -import com.simibubi.create.content.logistics.packagePort.PackagePortRenderer; import com.simibubi.create.content.logistics.packager.PackagerBlockEntity; import com.simibubi.create.content.logistics.packager.PackagerRenderer; import com.simibubi.create.content.logistics.packagerLink.PackagerLinkBlockEntity; @@ -488,10 +488,10 @@ public class AllBlockEntityTypes { .renderer(() -> PackagerRenderer::new) .register(); - public static final BlockEntityEntry PACKAGE_PORT = REGISTRATE - .blockEntity("package_port", PackagePortBlockEntity::new) - .validBlocks(AllBlocks.PACKAGE_PORT) - .renderer(() -> PackagePortRenderer::new) + public static final BlockEntityEntry PACKAGE_FROGPORT = REGISTRATE + .blockEntity("package_frogport", FrogportBlockEntity::new) + .validBlocks(AllBlocks.PACKAGE_FROGPORT) + .renderer(() -> FrogportRenderer::new) .register(); public static final BlockEntityEntry PACKAGER_LINK = REGISTRATE diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index d1a9b30db3..4b68ad49dc 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -166,6 +166,8 @@ import com.simibubi.create.content.logistics.crate.CreativeCrateBlock; import com.simibubi.create.content.logistics.depot.DepotBlock; import com.simibubi.create.content.logistics.depot.EjectorBlock; import com.simibubi.create.content.logistics.depot.EjectorItem; +import com.simibubi.create.content.logistics.frogport.FrogportBlock; +import com.simibubi.create.content.logistics.frogport.FrogportItem; import com.simibubi.create.content.logistics.funnel.AndesiteFunnelBlock; import com.simibubi.create.content.logistics.funnel.BeltFunnelBlock; import com.simibubi.create.content.logistics.funnel.BeltFunnelGenerator; @@ -173,8 +175,6 @@ import com.simibubi.create.content.logistics.funnel.BrassFunnelBlock; import com.simibubi.create.content.logistics.funnel.FunnelGenerator; import com.simibubi.create.content.logistics.funnel.FunnelItem; import com.simibubi.create.content.logistics.funnel.FunnelMovementBehaviour; -import com.simibubi.create.content.logistics.packagePort.PackagePortBlock; -import com.simibubi.create.content.logistics.packagePort.PackagePortItem; import com.simibubi.create.content.logistics.packager.PackagerBlock; import com.simibubi.create.content.logistics.packager.PackagerGenerator; import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedBlockItem; @@ -1723,8 +1723,8 @@ public class AllBlocks { .build() .register(); - public static final BlockEntry PACKAGE_PORT = - REGISTRATE.block("package_port", PackagePortBlock::new) + public static final BlockEntry PACKAGE_FROGPORT = + REGISTRATE.block("package_frogport", FrogportBlock::new) .initialProperties(SharedProperties::softMetal) .properties(p -> p.noOcclusion()) .properties(p -> p.mapColor(MapColor.TERRACOTTA_BLUE) @@ -1732,7 +1732,7 @@ public class AllBlocks { .transform(pickaxeOnly()) .addLayer(() -> RenderType::cutoutMipped) .blockstate((c, p) -> p.simpleBlock(c.getEntry(), AssetLookup.partialBaseModel(c, p))) - .item(PackagePortItem::new) + .item(FrogportItem::new) .model(AssetLookup::customItemModel) .build() .register(); diff --git a/src/main/java/com/simibubi/create/AllPackets.java b/src/main/java/com/simibubi/create/AllPackets.java index 5a03ba2832..00b35d107f 100644 --- a/src/main/java/com/simibubi/create/AllPackets.java +++ b/src/main/java/com/simibubi/create/AllPackets.java @@ -58,9 +58,9 @@ import com.simibubi.create.content.logistics.depot.EjectorElytraPacket; import com.simibubi.create.content.logistics.depot.EjectorPlacementPacket; import com.simibubi.create.content.logistics.depot.EjectorTriggerPacket; import com.simibubi.create.content.logistics.filter.FilterScreenPacket; +import com.simibubi.create.content.logistics.frogport.FrogportConfigurationPacket; +import com.simibubi.create.content.logistics.frogport.FrogportPlacementPacket; import com.simibubi.create.content.logistics.funnel.FunnelFlapPacket; -import com.simibubi.create.content.logistics.packagePort.PackagePortConfigurationPacket; -import com.simibubi.create.content.logistics.packagePort.PackagePortPlacementPacket; import com.simibubi.create.content.logistics.stockTicker.LogisticalStockRequestPacket; import com.simibubi.create.content.logistics.stockTicker.LogisticalStockResponsePacket; import com.simibubi.create.content.logistics.stockTicker.PackageOrderRequestPacket; @@ -131,7 +131,7 @@ public enum AllPackets { CONTRAPTION_INTERACT(ContraptionInteractionPacket.class, ContraptionInteractionPacket::new, PLAY_TO_SERVER), CLIENT_MOTION(ClientMotionPacket.class, ClientMotionPacket::new, PLAY_TO_SERVER), PLACE_ARM(ArmPlacementPacket.class, ArmPlacementPacket::new, PLAY_TO_SERVER), - PLACE_PACKAGE_PORT(PackagePortPlacementPacket.class, PackagePortPlacementPacket::new, PLAY_TO_SERVER), + PLACE_PACKAGE_PORT(FrogportPlacementPacket.class, FrogportPlacementPacket::new, PLAY_TO_SERVER), MINECART_COUPLING_CREATION(CouplingCreationPacket.class, CouplingCreationPacket::new, PLAY_TO_SERVER), INSTANT_SCHEMATIC(InstantSchematicPacket.class, InstantSchematicPacket::new, PLAY_TO_SERVER), SYNC_SCHEMATIC(SchematicSyncPacket.class, SchematicSyncPacket::new, PLAY_TO_SERVER), @@ -183,7 +183,7 @@ public enum AllPackets { CHAIN_CONVEYOR_RIDING(ChainConveyorRidingPacket.class, ChainConveyorRidingPacket::new, PLAY_TO_SERVER), CHAIN_PACKAGE_INTERACTION(ChainPackageInteractionPacket.class, ChainPackageInteractionPacket::new, PLAY_TO_SERVER), STOCK_TICKER_CONFIGURATION(StockTickerConfigurationPacket.class, StockTickerConfigurationPacket::new, PLAY_TO_SERVER), - PACKAGE_PORT_CONFIGURATION(PackagePortConfigurationPacket.class, PackagePortConfigurationPacket::new, PLAY_TO_SERVER), + PACKAGE_PORT_CONFIGURATION(FrogportConfigurationPacket.class, FrogportConfigurationPacket::new, PLAY_TO_SERVER), // Server to Client SYMMETRY_EFFECT(SymmetryEffectPacket.class, SymmetryEffectPacket::new, PLAY_TO_CLIENT), @@ -223,7 +223,7 @@ public enum AllPackets { PLAY_TO_CLIENT), S_PLACE_ARM(EjectorPlacementPacket.ClientBoundRequest.class, EjectorPlacementPacket.ClientBoundRequest::new, PLAY_TO_CLIENT), - S_PLACE_PACKAGE_PORT(PackagePortPlacementPacket.ClientBoundRequest.class, PackagePortPlacementPacket.ClientBoundRequest::new, + S_PLACE_PACKAGE_PORT(FrogportPlacementPacket.ClientBoundRequest.class, FrogportPlacementPacket.ClientBoundRequest::new, PLAY_TO_CLIENT), UPDATE_ELEVATOR_FLOORS(ElevatorFloorListPacket.class, ElevatorFloorListPacket::new, PLAY_TO_CLIENT), CONTRAPTION_ACTOR_TOGGLE(ContraptionDisableActorPacket.class, ContraptionDisableActorPacket::new, PLAY_TO_CLIENT), diff --git a/src/main/java/com/simibubi/create/AllPartialModels.java b/src/main/java/com/simibubi/create/AllPartialModels.java index 4930b52c47..5181d0ca0a 100644 --- a/src/main/java/com/simibubi/create/AllPartialModels.java +++ b/src/main/java/com/simibubi/create/AllPartialModels.java @@ -116,8 +116,8 @@ public class AllPartialModels { CHAIN_CONVEYOR_GUARD = block("chain_conveyor/guard"), CHAIN_CONVEYOR_SHAFT = block("chain_conveyor/shaft"), - PACKAGE_PORT_BODY = block("package_port/body"), PACKAGE_PORT_HEAD = block("package_port/head"), - PACKAGE_PORT_TONGUE = block("package_port/tongue"), + FROGPORT_BODY = block("package_frogport/body"), FROGPORT_HEAD = block("package_frogport/head"), + FROGPORT_TONGUE = block("package_frogport/tongue"), PACKAGER_TRAY_REGULAR = block("packager/tray_regular"), PACKAGER_TRAY_DEFRAG = block("packager/tray_defrag"), PACKAGER_HATCH_OPEN = block("packager/hatch_open"), PACKAGER_HATCH_CLOSED = block("packager/hatch_closed"), diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlock.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlock.java index e04ddbae33..63bb3b00ff 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlock.java @@ -54,7 +54,7 @@ public class ChainConveyorBlock extends KineticBlock implements IBE, IWrenchable { +public class FrogportBlock extends Block implements IBE, IWrenchable { - public PackagePortBlock(Properties pProperties) { + public FrogportBlock(Properties pProperties) { super(pProperties); } @@ -75,7 +75,7 @@ public class PackagePortBlock extends Block implements IBE getBlockEntityClass() { - return PackagePortBlockEntity.class; + public Class getBlockEntityClass() { + return FrogportBlockEntity.class; } @Override - public BlockEntityType getBlockEntityType() { - return AllBlockEntityTypes.PACKAGE_PORT.get(); + public BlockEntityType getBlockEntityType() { + return AllBlockEntityTypes.PACKAGE_FROGPORT.get(); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportBlockEntity.java similarity index 94% rename from src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java rename to src/main/java/com/simibubi/create/content/logistics/frogport/FrogportBlockEntity.java index 07228604f8..1dc9bd8990 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportBlockEntity.java @@ -1,4 +1,4 @@ -package com.simibubi.create.content.logistics.packagePort; +package com.simibubi.create.content.logistics.frogport; import java.util.List; @@ -36,12 +36,12 @@ import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.ItemHandlerHelper; -public class PackagePortBlockEntity extends SmartBlockEntity { +public class FrogportBlockEntity extends SmartBlockEntity { public boolean acceptsPackages; public String addressFilter; - public PackagePortTarget target; - public PackagePortInventory inventory; + public FrogportTarget target; + public FrogportInventory inventory; private LazyOptional itemHandler; public ItemStack animatedPackage; @@ -53,9 +53,9 @@ public class PackagePortBlockEntity extends SmartBlockEntity { public float passiveYaw; - public PackagePortBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { + public FrogportBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); - inventory = new PackagePortInventory(this); + inventory = new FrogportInventory(this); itemHandler = LazyOptional.of(() -> inventory); animationProgress = LerpedFloat.linear(); anticipationProgress = LerpedFloat.linear(); @@ -257,7 +257,7 @@ public class PackagePortBlockEntity extends SmartBlockEntity { protected IItemHandler getAdjacentInventory(Direction side) { BlockEntity blockEntity = level.getBlockEntity(worldPosition.relative(side)); - if (blockEntity == null || blockEntity instanceof PackagePortBlockEntity) + if (blockEntity == null || blockEntity instanceof FrogportBlockEntity) return null; return blockEntity.getCapability(ForgeCapabilities.ITEM_HANDLER, side.getOpposite()) .orElse(null); @@ -285,8 +285,8 @@ public class PackagePortBlockEntity extends SmartBlockEntity { @Override protected void read(CompoundTag tag, boolean clientPacket) { super.read(tag, clientPacket); - PackagePortTarget prevTarget = target; - target = PackagePortTarget.read(tag.getCompound("Target")); + FrogportTarget prevTarget = target; + target = FrogportTarget.read(tag.getCompound("Target")); inventory.deserializeNBT(tag.getCompound("Inventory")); passiveYaw = tag.getFloat("PlacedYaw"); addressFilter = tag.getString("AddressFilter"); diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortConfigurationPacket.java b/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportConfigurationPacket.java similarity index 74% rename from src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortConfigurationPacket.java rename to src/main/java/com/simibubi/create/content/logistics/frogport/FrogportConfigurationPacket.java index 6b563ceaba..ec0b24c968 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortConfigurationPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportConfigurationPacket.java @@ -1,4 +1,4 @@ -package com.simibubi.create.content.logistics.packagePort; +package com.simibubi.create.content.logistics.frogport; import com.simibubi.create.foundation.networking.BlockEntityConfigurationPacket; @@ -7,20 +7,20 @@ import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.ItemStack; -public class PackagePortConfigurationPacket extends BlockEntityConfigurationPacket { +public class FrogportConfigurationPacket extends BlockEntityConfigurationPacket { private String newFilter; private boolean ejectPackages; private boolean acceptPackages; - public PackagePortConfigurationPacket(BlockPos pos, String newFilter, boolean acceptPackages, boolean ejectPackages) { + public FrogportConfigurationPacket(BlockPos pos, String newFilter, boolean acceptPackages, boolean ejectPackages) { super(pos); this.newFilter = newFilter; this.ejectPackages = ejectPackages; this.acceptPackages = acceptPackages; } - public PackagePortConfigurationPacket(FriendlyByteBuf buffer) { + public FrogportConfigurationPacket(FriendlyByteBuf buffer) { super(buffer); } @@ -39,7 +39,7 @@ public class PackagePortConfigurationPacket extends BlockEntityConfigurationPack } @Override - protected void applySettings(ServerPlayer player, PackagePortBlockEntity be) { + protected void applySettings(ServerPlayer player, FrogportBlockEntity be) { super.applySettings(player, be); if (!ejectPackages) return; @@ -55,7 +55,7 @@ public class PackagePortConfigurationPacket extends BlockEntityConfigurationPack } @Override - protected void applySettings(PackagePortBlockEntity be) { + protected void applySettings(FrogportBlockEntity be) { if (be.addressFilter.equals(newFilter) && be.acceptsPackages == acceptPackages) return; be.addressFilter = newFilter; diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortInventory.java b/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportInventory.java similarity index 86% rename from src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortInventory.java rename to src/main/java/com/simibubi/create/content/logistics/frogport/FrogportInventory.java index cb3c9cefe7..04b5bead6c 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortInventory.java +++ b/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportInventory.java @@ -1,4 +1,4 @@ -package com.simibubi.create.content.logistics.packagePort; +package com.simibubi.create.content.logistics.frogport; import org.jetbrains.annotations.NotNull; @@ -7,12 +7,12 @@ import com.simibubi.create.content.logistics.box.PackageItem; import net.minecraft.world.item.ItemStack; import net.minecraftforge.items.ItemStackHandler; -public class PackagePortInventory extends ItemStackHandler { +public class FrogportInventory extends ItemStackHandler { private boolean receiveMode; - private PackagePortBlockEntity port; + private FrogportBlockEntity port; - public PackagePortInventory(PackagePortBlockEntity port) { + public FrogportInventory(FrogportBlockEntity port) { super(9); this.port = port; receiveMode = false; diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortItem.java b/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportItem.java similarity index 74% rename from src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortItem.java rename to src/main/java/com/simibubi/create/content/logistics/frogport/FrogportItem.java index 07a107e49f..dc0440084f 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportItem.java @@ -1,4 +1,4 @@ -package com.simibubi.create.content.logistics.packagePort; +package com.simibubi.create.content.logistics.frogport; import com.simibubi.create.AllPackets; @@ -12,9 +12,9 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.network.PacketDistributor; -public class PackagePortItem extends BlockItem { +public class FrogportItem extends BlockItem { - public PackagePortItem(Block pBlock, Properties pProperties) { + public FrogportItem(Block pBlock, Properties pProperties) { super(pBlock, pProperties); } @@ -23,7 +23,7 @@ public class PackagePortItem extends BlockItem { BlockState p_195943_5_) { if (!world.isClientSide && player instanceof ServerPlayer sp) AllPackets.getChannel() - .send(PacketDistributor.PLAYER.with(() -> sp), new PackagePortPlacementPacket.ClientBoundRequest(pos)); + .send(PacketDistributor.PLAYER.with(() -> sp), new FrogportPlacementPacket.ClientBoundRequest(pos)); return super.updateCustomBlockEntityTag(pos, world, player, p_195943_4_, p_195943_5_); } diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortPlacementPacket.java b/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportPlacementPacket.java similarity index 80% rename from src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortPlacementPacket.java rename to src/main/java/com/simibubi/create/content/logistics/frogport/FrogportPlacementPacket.java index 32759570a5..073556f56f 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortPlacementPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportPlacementPacket.java @@ -1,4 +1,4 @@ -package com.simibubi.create.content.logistics.packagePort; +package com.simibubi.create.content.logistics.frogport; import com.simibubi.create.foundation.networking.SimplePacketBase; import com.simibubi.create.infrastructure.config.AllConfigs; @@ -13,18 +13,18 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.network.NetworkEvent.Context; -public class PackagePortPlacementPacket extends SimplePacketBase { +public class FrogportPlacementPacket extends SimplePacketBase { - private PackagePortTarget target; + private FrogportTarget target; private BlockPos pos; - public PackagePortPlacementPacket(PackagePortTarget target, BlockPos pos) { + public FrogportPlacementPacket(FrogportTarget target, BlockPos pos) { this.target = target; this.pos = pos; } - public PackagePortPlacementPacket(FriendlyByteBuf buffer) { - target = PackagePortTarget.read(buffer.readNbt()); + public FrogportPlacementPacket(FriendlyByteBuf buffer) { + target = FrogportTarget.read(buffer.readNbt()); pos = buffer.readBlockPos(); } @@ -44,7 +44,7 @@ public class PackagePortPlacementPacket extends SimplePacketBase { if (world == null || !world.isLoaded(pos)) return; BlockEntity blockEntity = world.getBlockEntity(pos); - if (!(blockEntity instanceof PackagePortBlockEntity ppbe)) + if (!(blockEntity instanceof FrogportBlockEntity ppbe)) return; Vec3 targetLocation = target.getExactTargetLocation(ppbe, world, pos); @@ -79,7 +79,7 @@ public class PackagePortPlacementPacket extends SimplePacketBase { @Override public boolean handle(Context context) { context.enqueueWork(() -> DistExecutor.unsafeRunWhenOn(Dist.CLIENT, - () -> () -> PackagePortTargetSelectionHandler.flushSettings(pos))); + () -> () -> FrogportTargetSelectionHandler.flushSettings(pos))); return true; } diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortRenderer.java b/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportRenderer.java similarity index 90% rename from src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortRenderer.java rename to src/main/java/com/simibubi/create/content/logistics/frogport/FrogportRenderer.java index caeacb0c87..79c38ddd5f 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportRenderer.java @@ -1,4 +1,4 @@ -package com.simibubi.create.content.logistics.packagePort; +package com.simibubi.create.content.logistics.frogport; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllPartialModels; @@ -15,16 +15,16 @@ import net.minecraft.util.Mth; import net.minecraft.world.phys.Vec3; import net.minecraftforge.registries.ForgeRegistries; -public class PackagePortRenderer extends SmartBlockEntityRenderer { +public class FrogportRenderer extends SmartBlockEntityRenderer { - public PackagePortRenderer(Context context) { + public FrogportRenderer(Context context) { super(context); } @Override - protected void renderSafe(PackagePortBlockEntity blockEntity, float partialTicks, PoseStack ms, + protected void renderSafe(FrogportBlockEntity blockEntity, float partialTicks, PoseStack ms, MultiBufferSource buffer, int light, int overlay) { - SuperByteBuffer body = CachedBuffers.partial(AllPartialModels.PACKAGE_PORT_BODY, blockEntity.getBlockState()); + SuperByteBuffer body = CachedBuffers.partial(AllPartialModels.FROGPORT_BODY, blockEntity.getBlockState()); float yaw = blockEntity.getYaw(); @@ -93,7 +93,7 @@ public class PackagePortRenderer extends SmartBlockEntityRenderer AllPackets.getChannel() - .sendToServer(new PackagePortConfigurationPacket(blockEntity.getBlockPos(), addressBox.getValue(), + .sendToServer(new FrogportConfigurationPacket(blockEntity.getBlockPos(), addressBox.getValue(), !sendOnly(), true))); dumpPackagesButton.setToolTip(CreateLang.translateDirect("gui.package_port.eject_to_inventory")); addRenderableWidget(dumpPackagesButton); @@ -85,7 +85,7 @@ public class PackagePortScreen extends AbstractSimiScreen { @Override public void removed() { AllPackets.getChannel() - .sendToServer(new PackagePortConfigurationPacket(blockEntity.getBlockPos(), addressBox.getValue(), + .sendToServer(new FrogportConfigurationPacket(blockEntity.getBlockPos(), addressBox.getValue(), !sendOnly(), false)); super.removed(); } diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTarget.java b/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportTarget.java similarity index 79% rename from src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTarget.java rename to src/main/java/com/simibubi/create/content/logistics/frogport/FrogportTarget.java index 64473b35a9..577f7fd303 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTarget.java +++ b/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportTarget.java @@ -1,4 +1,4 @@ -package com.simibubi.create.content.logistics.packagePort; +package com.simibubi.create.content.logistics.frogport; import java.util.Map; @@ -25,25 +25,25 @@ import net.minecraft.world.phys.Vec3; import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.ItemHandlerHelper; -public abstract class PackagePortTarget { +public abstract class FrogportTarget { public BlockPos relativePos; private String typeKey; - public PackagePortTarget(String typeKey, BlockPos relativePos) { + public FrogportTarget(String typeKey, BlockPos relativePos) { this.typeKey = typeKey; this.relativePos = relativePos; } public abstract boolean export(LevelAccessor level, BlockPos portPos, ItemStack box, boolean simulate); - public void setup(PackagePortBlockEntity ppbe, LevelAccessor level, BlockPos portPos) {} + public void setup(FrogportBlockEntity ppbe, LevelAccessor level, BlockPos portPos) {} - public void register(PackagePortBlockEntity ppbe, LevelAccessor level, BlockPos portPos) {} + public void register(FrogportBlockEntity ppbe, LevelAccessor level, BlockPos portPos) {} - public void deregister(PackagePortBlockEntity ppbe, LevelAccessor level, BlockPos portPos) {} + public void deregister(FrogportBlockEntity ppbe, LevelAccessor level, BlockPos portPos) {} - public abstract Vec3 getExactTargetLocation(PackagePortBlockEntity ppbe, LevelAccessor level, BlockPos portPos); + public abstract Vec3 getExactTargetLocation(FrogportBlockEntity ppbe, LevelAccessor level, BlockPos portPos); public CompoundTag write() { CompoundTag compoundTag = new CompoundTag(); @@ -53,15 +53,15 @@ public abstract class PackagePortTarget { return compoundTag; } - public static PackagePortTarget read(CompoundTag tag) { + public static FrogportTarget read(CompoundTag tag) { if (tag.isEmpty()) return null; BlockPos relativePos = NbtUtils.readBlockPos(tag.getCompound("RelativePos")); - PackagePortTarget target = switch (tag.getString("Type")) { + FrogportTarget target = switch (tag.getString("Type")) { - case "ChainConveyor" -> new ChainConveyorPortTarget(relativePos, 0, null); - case "TrainStation" -> new TrainStationPortTarget(relativePos); + case "ChainConveyor" -> new ChainConveyorFrogportTarget(relativePos, 0, null); + case "TrainStation" -> new TrainStationFrogportTarget(relativePos); default -> null; }; @@ -81,20 +81,20 @@ public abstract class PackagePortTarget { return level.getBlockEntity(portPos.offset(relativePos)); } - public static class ChainConveyorPortTarget extends PackagePortTarget { + public static class ChainConveyorFrogportTarget extends FrogportTarget { public float chainPos; public BlockPos connection; public boolean flipped; - public ChainConveyorPortTarget(BlockPos relativePos, float chainPos, @Nullable BlockPos connection) { + public ChainConveyorFrogportTarget(BlockPos relativePos, float chainPos, @Nullable BlockPos connection) { super("ChainConveyor", relativePos); this.chainPos = chainPos; this.connection = connection; } @Override - public void setup(PackagePortBlockEntity ppbe, LevelAccessor level, BlockPos portPos) { + public void setup(FrogportBlockEntity ppbe, LevelAccessor level, BlockPos portPos) { if (be(level, portPos) instanceof ChainConveyorBlockEntity clbe) flipped = clbe.getSpeed() < 0; } @@ -114,7 +114,7 @@ public abstract class PackagePortTarget { } @Override - public void register(PackagePortBlockEntity ppbe, LevelAccessor level, BlockPos portPos) { + public void register(FrogportBlockEntity ppbe, LevelAccessor level, BlockPos portPos) { if (!(be(level, portPos) instanceof ChainConveyorBlockEntity clbe)) return; ChainConveyorBlockEntity actualBe = clbe; @@ -149,7 +149,7 @@ public abstract class PackagePortTarget { } @Override - public void deregister(PackagePortBlockEntity ppbe, LevelAccessor level, BlockPos portPos) { + public void deregister(FrogportBlockEntity ppbe, LevelAccessor level, BlockPos portPos) { if (!(be(level, portPos) instanceof ChainConveyorBlockEntity clbe)) return; clbe.loopPorts.remove(relativePos.multiply(-1)); @@ -181,7 +181,7 @@ public abstract class PackagePortTarget { } @Override - public Vec3 getExactTargetLocation(PackagePortBlockEntity ppbe, LevelAccessor level, BlockPos portPos) { + public Vec3 getExactTargetLocation(FrogportBlockEntity ppbe, LevelAccessor level, BlockPos portPos) { if (!(be(level, portPos) instanceof ChainConveyorBlockEntity clbe)) return Vec3.ZERO; return clbe.getPackagePosition(chainPos, connection); @@ -189,9 +189,9 @@ public abstract class PackagePortTarget { } - public static class TrainStationPortTarget extends PackagePortTarget { + public static class TrainStationFrogportTarget extends FrogportTarget { - public TrainStationPortTarget(BlockPos relativePos) { + public TrainStationFrogportTarget(BlockPos relativePos) { super("TrainStation", relativePos); } @@ -223,7 +223,7 @@ public abstract class PackagePortTarget { } @Override - public Vec3 getExactTargetLocation(PackagePortBlockEntity ppbe, LevelAccessor level, BlockPos portPos) { + public Vec3 getExactTargetLocation(FrogportBlockEntity ppbe, LevelAccessor level, BlockPos portPos) { if (!(be(level, portPos) instanceof StationBlockEntity sbe) || sbe.edgePoint == null) return Vec3.atCenterOf(portPos); return Vec3.atCenterOf(sbe.edgePoint.getPositionForMapMarker() @@ -231,13 +231,13 @@ public abstract class PackagePortTarget { } @Override - public void register(PackagePortBlockEntity ppbe, LevelAccessor level, BlockPos portPos) { + public void register(FrogportBlockEntity ppbe, LevelAccessor level, BlockPos portPos) { if (be(level, portPos) instanceof StationBlockEntity sbe) sbe.attachPackagePort(ppbe); } @Override - public void deregister(PackagePortBlockEntity ppbe, LevelAccessor level, BlockPos portPos) { + public void deregister(FrogportBlockEntity ppbe, LevelAccessor level, BlockPos portPos) { if (be(level, portPos) instanceof StationBlockEntity sbe) sbe.removePackagePort(ppbe); } diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTargetSelectionHandler.java b/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportTargetSelectionHandler.java similarity index 87% rename from src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTargetSelectionHandler.java rename to src/main/java/com/simibubi/create/content/logistics/frogport/FrogportTargetSelectionHandler.java index ac4ecb7895..a9ba22d8d6 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTargetSelectionHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportTargetSelectionHandler.java @@ -1,4 +1,4 @@ -package com.simibubi.create.content.logistics.packagePort; +package com.simibubi.create.content.logistics.frogport; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllPackets; @@ -23,9 +23,9 @@ import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.HitResult.Type; import net.minecraft.world.phys.Vec3; -public class PackagePortTargetSelectionHandler { +public class FrogportTargetSelectionHandler { - public static PackagePortTarget activePackageTarget; + public static FrogportTarget activePackageTarget; public static Vec3 exactPositionOfTarget; public static void flushSettings(BlockPos pos) { @@ -38,11 +38,11 @@ public class PackagePortTargetSelectionHandler { if (validateDiff(exactPositionOfTarget, pos) == null) { activePackageTarget.relativePos = activePackageTarget.relativePos.subtract(pos); AllPackets.getChannel() - .sendToServer(new PackagePortPlacementPacket(activePackageTarget, pos)); + .sendToServer(new FrogportPlacementPacket(activePackageTarget, pos)); BlockEntity blockEntity = Minecraft.getInstance().level.getBlockEntity(pos); - if (blockEntity instanceof PackagePortBlockEntity ppbe) - ScreenOpener.open(new PackagePortScreen(ppbe)); + if (blockEntity instanceof FrogportBlockEntity ppbe) + ScreenOpener.open(new FrogportScreen(ppbe)); } activePackageTarget = null; @@ -64,13 +64,13 @@ public class PackagePortTargetSelectionHandler { return false; if (sbe.edgePoint == null) return false; - if (!AllBlocks.PACKAGE_PORT.isIn(mainHandItem)) + if (!AllBlocks.PACKAGE_FROGPORT.isIn(mainHandItem)) return false; - PackagePortTargetSelectionHandler.exactPositionOfTarget = + FrogportTargetSelectionHandler.exactPositionOfTarget = Vec3.atCenterOf(sbe.edgePoint.getPositionForMapMarker() .above()); - PackagePortTargetSelectionHandler.activePackageTarget = new PackagePortTarget.TrainStationPortTarget(pos); + FrogportTargetSelectionHandler.activePackageTarget = new FrogportTarget.TrainStationFrogportTarget(pos); return true; } @@ -79,7 +79,7 @@ public class PackagePortTargetSelectionHandler { LocalPlayer player = mc.player; if (activePackageTarget == null) return; - if (!AllBlocks.PACKAGE_PORT.isIn(player.getMainHandItem())) + if (!AllBlocks.PACKAGE_FROGPORT.isIn(player.getMainHandItem())) return; HitResult objectMouseOver = mc.hitResult; diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortFilterSlotPositioning.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortFilterSlotPositioning.java deleted file mode 100644 index 03f3a3e4ea..0000000000 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortFilterSlotPositioning.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.simibubi.create.content.logistics.packagePort; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform; - -import dev.engine_room.flywheel.lib.transform.TransformStack; -import net.createmod.catnip.utility.VecHelper; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction.Axis; -import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.Vec3; - -public class PackagePortFilterSlotPositioning extends ValueBoxTransform { - - @Override - public boolean shouldRender(LevelAccessor level, BlockPos pos, BlockState state) { - if (!super.shouldRender(level, pos, state)) - return false; - if (level != null && level.getBlockEntity(pos) instanceof PackagePortBlockEntity ppbe) - return !ppbe.isAnimationInProgress(); - return true; - } - - @Override - public Vec3 getLocalOffset(LevelAccessor level, BlockPos pos, BlockState state) { - float horizontalAngle = 0; - if (level != null && level.getBlockEntity(pos) instanceof PackagePortBlockEntity ppbe) - horizontalAngle = ppbe.getYaw(); - - Vec3 southLocation = VecHelper.voxelSpace(8, 13.5, 10); - return VecHelper.rotateCentered(southLocation, horizontalAngle, Axis.Y); - } - - @Override - public void rotate(LevelAccessor level, BlockPos pos, BlockState state, PoseStack ms) { - float horizontalAngle = 0; - if (level != null && level.getBlockEntity(pos) instanceof PackagePortBlockEntity ppbe) - horizontalAngle = ppbe.getYaw(); - - TransformStack.of(ms) - .rotateYDegrees(horizontalAngle) - .rotateXDegrees(90); - } - -} diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java index 57b228109a..b990f5cc34 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java @@ -6,7 +6,7 @@ import java.util.List; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.content.logistics.crate.BottomlessItemHandler; -import com.simibubi.create.content.logistics.packagePort.PackagePortBlockEntity; +import com.simibubi.create.content.logistics.frogport.FrogportBlockEntity; import com.simibubi.create.content.logistics.packager.PackagerBlock.PackagerType; import com.simibubi.create.content.logistics.packagerLink.PackagerLinkBlock; import com.simibubi.create.content.logistics.stockTicker.PackageOrder; @@ -454,7 +454,7 @@ public class PackagerBlockEntity extends SmartBlockEntity { } protected void wakeTheFrogs() { - if (level.getBlockEntity(worldPosition.relative(Direction.UP)) instanceof PackagePortBlockEntity port) + if (level.getBlockEntity(worldPosition.relative(Direction.UP)) instanceof FrogportBlockEntity port) port.tryPullingFromAdjacentInventories(); } diff --git a/src/main/java/com/simibubi/create/content/trains/station/GlobalStation.java b/src/main/java/com/simibubi/create/content/trains/station/GlobalStation.java index e5eec23baf..f3c005b76a 100644 --- a/src/main/java/com/simibubi/create/content/trains/station/GlobalStation.java +++ b/src/main/java/com/simibubi/create/content/trains/station/GlobalStation.java @@ -11,7 +11,7 @@ import javax.annotation.Nullable; import com.simibubi.create.Create; import com.simibubi.create.content.logistics.box.PackageItem; -import com.simibubi.create.content.logistics.packagePort.PackagePortBlockEntity; +import com.simibubi.create.content.logistics.frogport.FrogportBlockEntity; import com.simibubi.create.content.trains.entity.Carriage; import com.simibubi.create.content.trains.entity.CarriageContraptionEntity; import com.simibubi.create.content.trains.entity.Train; @@ -197,7 +197,7 @@ public class GlobalStation extends SingleBlockEntityEdgePoint { if (!PackageItem.matchAddress(stack, port.address)) continue; - if (level != null && level.isLoaded(pos) && level.getBlockEntity(pos) instanceof PackagePortBlockEntity ppbe) { + if (level != null && level.isLoaded(pos) && level.getBlockEntity(pos) instanceof FrogportBlockEntity ppbe) { if (ppbe.isAnimationInProgress()) continue; if (ppbe.inventory.isBackedUp()) diff --git a/src/main/java/com/simibubi/create/content/trains/station/StationBlockEntity.java b/src/main/java/com/simibubi/create/content/trains/station/StationBlockEntity.java index 810ba7defb..617d523980 100644 --- a/src/main/java/com/simibubi/create/content/trains/station/StationBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/trains/station/StationBlockEntity.java @@ -28,7 +28,7 @@ import com.simibubi.create.content.contraptions.ITransformableBlockEntity; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.decoration.slidingDoor.DoorControlBehaviour; import com.simibubi.create.content.logistics.depot.DepotBehaviour; -import com.simibubi.create.content.logistics.packagePort.PackagePortBlockEntity; +import com.simibubi.create.content.logistics.frogport.FrogportBlockEntity; import com.simibubi.create.content.redstone.displayLink.DisplayLinkBlock; import com.simibubi.create.content.trains.bogey.AbstractBogeyBlock; import com.simibubi.create.content.trains.bogey.AbstractBogeyBlockEntity; @@ -961,7 +961,7 @@ public class StationBlockEntity extends SmartBlockEntity implements ITransformab // Package port integration - public void attachPackagePort(PackagePortBlockEntity ppbe) { + public void attachPackagePort(FrogportBlockEntity ppbe) { GlobalStation station = getStation(); if (station == null) return; @@ -971,7 +971,7 @@ public class StationBlockEntity extends SmartBlockEntity implements ITransformab station.connectedPorts.put(ppbe.getBlockPos(), globalPackagePort); } - public void removePackagePort(PackagePortBlockEntity ppbe) { + public void removePackagePort(FrogportBlockEntity ppbe) { GlobalStation station = getStation(); if (station == null) return; @@ -993,7 +993,7 @@ public class StationBlockEntity extends SmartBlockEntity implements ITransformab GlobalPackagePort port = entry.getValue(); if (!level.isLoaded(pos)) continue; - if (!(level.getBlockEntity(pos) instanceof PackagePortBlockEntity ppbe)) { + if (!(level.getBlockEntity(pos) instanceof FrogportBlockEntity ppbe)) { iterator.remove(); changed = true; continue; diff --git a/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java b/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java index d696deddb8..acbcf6cc0f 100644 --- a/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java @@ -38,7 +38,7 @@ import com.simibubi.create.content.kinetics.fan.AirCurrent; import com.simibubi.create.content.kinetics.mechanicalArm.ArmInteractionPointHandler; import com.simibubi.create.content.kinetics.turntable.TurntableHandler; import com.simibubi.create.content.logistics.depot.EjectorTargetHandler; -import com.simibubi.create.content.logistics.packagePort.PackagePortTargetSelectionHandler; +import com.simibubi.create.content.logistics.frogport.FrogportTargetSelectionHandler; import com.simibubi.create.content.processing.sequenced.SequencedAssemblyRecipe; import com.simibubi.create.content.redstone.displayLink.ClickToLinkBlockItem; import com.simibubi.create.content.redstone.link.LinkRenderer; @@ -178,7 +178,7 @@ public class ClientEvents { ChainConveyorInteractionHandler.clientTick(); ChainConveyorRidingHandler.clientTick(); ChainConveyorConnectionHandler.clientTick(); - PackagePortTargetSelectionHandler.tick(); + FrogportTargetSelectionHandler.tick(); } @SubscribeEvent diff --git a/src/main/java/com/simibubi/create/foundation/events/InputEvents.java b/src/main/java/com/simibubi/create/foundation/events/InputEvents.java index c7049bb3fa..0601eeedcb 100644 --- a/src/main/java/com/simibubi/create/foundation/events/InputEvents.java +++ b/src/main/java/com/simibubi/create/foundation/events/InputEvents.java @@ -6,7 +6,7 @@ import com.simibubi.create.content.contraptions.wrench.RadialWrenchHandler; import com.simibubi.create.content.equipment.toolbox.ToolboxHandlerClient; import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorInteractionHandler; import com.simibubi.create.content.kinetics.chainConveyor.ChainPackageInteractionHandler; -import com.simibubi.create.content.logistics.packagePort.PackagePortTargetSelectionHandler; +import com.simibubi.create.content.logistics.frogport.FrogportTargetSelectionHandler; import com.simibubi.create.content.redstone.link.controller.LinkedControllerClientHandler; import com.simibubi.create.content.trains.TrainHUD; import com.simibubi.create.content.trains.entity.TrainRelocator; @@ -95,7 +95,7 @@ public class InputEvents { if (ChainConveyorInteractionHandler.onUse()) event.setCanceled(true); - else if (PackagePortTargetSelectionHandler.onUse()) + else if (FrogportTargetSelectionHandler.onUse()) event.setCanceled(true); DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { diff --git a/src/main/resources/assets/create/models/block/package_port/block.json b/src/main/resources/assets/create/models/block/package_frogport/block.json similarity index 100% rename from src/main/resources/assets/create/models/block/package_port/block.json rename to src/main/resources/assets/create/models/block/package_frogport/block.json diff --git a/src/main/resources/assets/create/models/block/package_port/body.json b/src/main/resources/assets/create/models/block/package_frogport/body.json similarity index 100% rename from src/main/resources/assets/create/models/block/package_port/body.json rename to src/main/resources/assets/create/models/block/package_frogport/body.json diff --git a/src/main/resources/assets/create/models/block/package_port/head.json b/src/main/resources/assets/create/models/block/package_frogport/head.json similarity index 100% rename from src/main/resources/assets/create/models/block/package_port/head.json rename to src/main/resources/assets/create/models/block/package_frogport/head.json diff --git a/src/main/resources/assets/create/models/block/package_port/item.json b/src/main/resources/assets/create/models/block/package_frogport/item.json similarity index 100% rename from src/main/resources/assets/create/models/block/package_port/item.json rename to src/main/resources/assets/create/models/block/package_frogport/item.json diff --git a/src/main/resources/assets/create/models/block/package_port/tongue.json b/src/main/resources/assets/create/models/block/package_frogport/tongue.json similarity index 100% rename from src/main/resources/assets/create/models/block/package_port/tongue.json rename to src/main/resources/assets/create/models/block/package_frogport/tongue.json From 8f71d9426d3b0585bf72517db5e6217bbaea0d4c Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Fri, 20 Sep 2024 16:17:23 -0700 Subject: [PATCH 054/515] Done - Uncomment flag transform line in station renderer --- .../simibubi/create/content/trains/station/StationRenderer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/simibubi/create/content/trains/station/StationRenderer.java b/src/main/java/com/simibubi/create/content/trains/station/StationRenderer.java index 57366f4081..a7516d3436 100644 --- a/src/main/java/com/simibubi/create/content/trains/station/StationRenderer.java +++ b/src/main/java/com/simibubi/create/content/trains/station/StationRenderer.java @@ -116,7 +116,7 @@ public class StationRenderer extends SafeBlockEntityRenderer if (!be.resolveFlagAngle()) return; SuperByteBuffer flagBB = CachedBuffers.partial(flag, be.getBlockState()); - //transformFlag(flagBB, be, partialTicks, be.flagYRot, be.flagFlipped);//TODO flw + transformFlag(flagBB, be, partialTicks, be.flagYRot, be.flagFlipped); flagBB.translate(0.5f / 16, 0, 0) .rotateYDegrees(be.flagFlipped ? 0 : 180) .translate(-0.5f / 16, 0, 0) From eb36ce41609fc77d6c738f8378e3c5df1b25bbec Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Fri, 20 Sep 2024 16:44:26 -0700 Subject: [PATCH 055/515] Handle with care - Prevent stack overflow when dropping packages into the void - Mark chain conveyor shaft as cutout so it doesn't render a black square --- .../simibubi/create/content/logistics/box/PackageEntity.java | 4 ++-- .../assets/create/models/block/chain_conveyor/shaft.json | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java index f1fb10c57b..381c634e93 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java @@ -284,7 +284,7 @@ public class PackageEntity extends LivingEntity implements IEntityAdditionalSpaw return false; if (source.is(DamageTypeTags.BYPASSES_INVULNERABILITY)) { - this.kill(); + this.remove(RemovalReason.KILLED); return false; } @@ -431,4 +431,4 @@ public class PackageEntity extends LivingEntity implements IEntityAdditionalSpaw return SoundEvents.ARMOR_STAND_BREAK; } -} \ No newline at end of file +} diff --git a/src/main/resources/assets/create/models/block/chain_conveyor/shaft.json b/src/main/resources/assets/create/models/block/chain_conveyor/shaft.json index a0a601bb80..b1dcdd3e22 100644 --- a/src/main/resources/assets/create/models/block/chain_conveyor/shaft.json +++ b/src/main/resources/assets/create/models/block/chain_conveyor/shaft.json @@ -2,5 +2,6 @@ "parent": "create:block/chain_conveyor/textures", "loader": "forge:obj", "flip_v": true, + "render_type": "minecraft:cutout", "model": "create:models/block/chain_conveyor/conveyor_shaft.obj" -} \ No newline at end of file +} From 2cd17f5f3b1cc5723834a2f3f3c8fe481fb751a7 Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Fri, 20 Sep 2024 19:35:16 -0700 Subject: [PATCH 056/515] A bump of catnip - Bump flywheel and catnip versions - Make all visuals use instancerProvider() method - Fix ModelCache usage - Use PosedInstance in BogeyRenderer --- gradle.properties | 4 ++-- .../contraptions/bearing/BearingVisual.java | 2 +- .../contraptions/chassis/StickerVisual.java | 2 +- .../gantry/GantryCarriageVisual.java | 2 +- .../contraptions/pulley/HosePulleyVisual.java | 10 +++++----- .../contraptions/pulley/RopePulleyVisual.java | 10 +++++----- .../contraptions/render/ContraptionVisual.java | 2 ++ .../equipment/toolbox/ToolBoxVisual.java | 4 ++-- .../fluids/pipes/valve/FluidValveVisual.java | 2 +- .../kinetics/base/SingleRotatingVisual.java | 2 +- .../content/kinetics/belt/BeltVisual.java | 4 ++-- .../kinetics/crank/HandCrankVisual.java | 4 ++-- .../kinetics/deployer/DeployerVisual.java | 6 +++--- .../create/content/kinetics/fan/FanVisual.java | 4 ++-- .../kinetics/flywheel/FlywheelVisual.java | 4 ++-- .../content/kinetics/gauge/GaugeVisual.java | 6 +++--- .../kinetics/gearbox/GearboxVisual.java | 2 +- .../kinetics/mechanicalArm/ArmVisual.java | 14 +++++++------- .../content/kinetics/mixer/MixerVisual.java | 4 ++-- .../content/kinetics/press/PressVisual.java | 2 +- .../BracketedKineticBlockEntityVisual.java | 2 +- .../simpleRelays/encased/EncasedCogVisual.java | 4 ++-- .../steamEngine/SteamEngineVisual.java | 6 +++--- .../transmission/SplitShaftVisual.java | 2 +- .../kinetics/waterwheel/WaterWheelVisual.java | 6 +++--- .../content/logistics/depot/EjectorVisual.java | 2 +- .../content/logistics/funnel/FunnelVisual.java | 2 +- .../logistics/tunnel/BeltTunnelVisual.java | 2 +- .../processing/burner/BlazeBurnerVisual.java | 14 +++++++------- .../analogLever/AnalogLeverVisual.java | 4 ++-- .../redstone/diodes/BrassDiodeVisual.java | 2 +- .../cannon/SchematicannonVisual.java | 4 ++-- .../content/trains/bogey/BogeyRenderer.java | 14 +++++++------- .../content/trains/track/TrackVisual.java | 18 +++++++++--------- 34 files changed, 87 insertions(+), 85 deletions(-) diff --git a/gradle.properties b/gradle.properties index 3406040cdb..6e507fc553 100644 --- a/gradle.properties +++ b/gradle.properties @@ -23,12 +23,12 @@ use_parchment = true # dependency versions registrate_version = MC1.20-1.3.3 flywheel_minecraft_version = 1.20.1 -flywheel_version = 1.0.0-beta-113 +flywheel_version = 1.0.0-beta-134 jei_minecraft_version = 1.20.1 jei_version = 15.10.0.39 curios_minecraft_version = 1.20.1 curios_version = 5.3.1 -catnip_version = 0.8.13 +catnip_version = 0.8.14 ponder_version = 0.8.10 cc_tweaked_enable = true diff --git a/src/main/java/com/simibubi/create/content/contraptions/bearing/BearingVisual.java b/src/main/java/com/simibubi/create/content/contraptions/bearing/BearingVisual.java index 94e9ebfefe..065b1a0aa4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/bearing/BearingVisual.java +++ b/src/main/java/com/simibubi/create/content/contraptions/bearing/BearingVisual.java @@ -38,7 +38,7 @@ public class BearingVisual e PartialModel top = blockEntity.isWoodenTop() ? AllPartialModels.BEARING_TOP_WOODEN : AllPartialModels.BEARING_TOP; - topInstance = instancerProvider.instancer(InstanceTypes.ORIENTED, Models.partial(top)) + topInstance = instancerProvider().instancer(InstanceTypes.ORIENTED, Models.partial(top)) .createInstance(); topInstance.position(getVisualPosition()) diff --git a/src/main/java/com/simibubi/create/content/contraptions/chassis/StickerVisual.java b/src/main/java/com/simibubi/create/content/contraptions/chassis/StickerVisual.java index 7467666cc0..dc1433db18 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/chassis/StickerVisual.java +++ b/src/main/java/com/simibubi/create/content/contraptions/chassis/StickerVisual.java @@ -29,7 +29,7 @@ public class StickerVisual extends AbstractBlockEntityVisual public StickerVisual(VisualizationContext context, StickerBlockEntity blockEntity, float partialTick) { super(context, blockEntity, partialTick); - head = instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.STICKER_HEAD)).createInstance(); + head = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.STICKER_HEAD)).createInstance(); fakeWorld = blockEntity.getLevel() != Minecraft.getInstance().level; facing = blockState.getValue(StickerBlock.FACING); diff --git a/src/main/java/com/simibubi/create/content/contraptions/gantry/GantryCarriageVisual.java b/src/main/java/com/simibubi/create/content/contraptions/gantry/GantryCarriageVisual.java index 5ecdce2b4b..c942275f9d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/gantry/GantryCarriageVisual.java +++ b/src/main/java/com/simibubi/create/content/contraptions/gantry/GantryCarriageVisual.java @@ -34,7 +34,7 @@ public class GantryCarriageVisual extends ShaftVisual public GantryCarriageVisual(VisualizationContext context, GantryCarriageBlockEntity blockEntity, float partialTick) { super(context, blockEntity, partialTick); - gantryCogs = instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.GANTRY_COGS)) + gantryCogs = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.GANTRY_COGS)) .createInstance(); facing = blockState.getValue(GantryCarriageBlock.FACING); diff --git a/src/main/java/com/simibubi/create/content/contraptions/pulley/HosePulleyVisual.java b/src/main/java/com/simibubi/create/content/contraptions/pulley/HosePulleyVisual.java index 7857e22dbe..d530c063f9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/pulley/HosePulleyVisual.java +++ b/src/main/java/com/simibubi/create/content/contraptions/pulley/HosePulleyVisual.java @@ -16,27 +16,27 @@ public class HosePulleyVisual extends AbstractPulleyVisual getRopeModel() { - return instancerProvider.instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.HOSE)); + return instancerProvider().instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.HOSE)); } @Override protected Instancer getMagnetModel() { - return instancerProvider.instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.HOSE_MAGNET)); + return instancerProvider().instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.HOSE_MAGNET)); } @Override protected Instancer getHalfMagnetModel() { - return instancerProvider.instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.HOSE_HALF_MAGNET)); + return instancerProvider().instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.HOSE_HALF_MAGNET)); } @Override protected Instancer getCoilModel() { - return instancerProvider.instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.HOSE_COIL, rotatingAbout)); + return instancerProvider().instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.HOSE_COIL, rotatingAbout)); } @Override protected Instancer getHalfRopeModel() { - return instancerProvider.instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.HOSE_HALF)); + return instancerProvider().instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.HOSE_HALF)); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/pulley/RopePulleyVisual.java b/src/main/java/com/simibubi/create/content/contraptions/pulley/RopePulleyVisual.java index bc35b32fd1..1ba4e792a9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/pulley/RopePulleyVisual.java +++ b/src/main/java/com/simibubi/create/content/contraptions/pulley/RopePulleyVisual.java @@ -18,27 +18,27 @@ public class RopePulleyVisual extends AbstractPulleyVisual { @Override protected Instancer getRopeModel() { - return instancerProvider.instancer(InstanceTypes.ORIENTED, VirtualRenderHelper.blockModel(AllBlocks.ROPE.getDefaultState())); + return instancerProvider().instancer(InstanceTypes.ORIENTED, VirtualRenderHelper.blockModel(AllBlocks.ROPE.getDefaultState())); } @Override protected Instancer getMagnetModel() { - return instancerProvider.instancer(InstanceTypes.ORIENTED, VirtualRenderHelper.blockModel(AllBlocks.PULLEY_MAGNET.getDefaultState())); + return instancerProvider().instancer(InstanceTypes.ORIENTED, VirtualRenderHelper.blockModel(AllBlocks.PULLEY_MAGNET.getDefaultState())); } @Override protected Instancer getHalfMagnetModel() { - return instancerProvider.instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.ROPE_HALF_MAGNET)); + return instancerProvider().instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.ROPE_HALF_MAGNET)); } @Override protected Instancer getCoilModel() { - return instancerProvider.instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.ROPE_COIL, rotatingAbout)); + return instancerProvider().instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.ROPE_COIL, rotatingAbout)); } @Override protected Instancer getHalfRopeModel() { - return instancerProvider.instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.ROPE_HALF)); + return instancerProvider().instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.ROPE_HALF)); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionVisual.java b/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionVisual.java index 6b3a038c98..b0d03ed6a3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionVisual.java +++ b/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionVisual.java @@ -93,6 +93,8 @@ public class ContraptionVisual extends Abst .instancer(InstanceTypes.TRANSFORMED, model) .createInstance(); + structure.setChanged(); + for (BlockEntity be : contraption.getRenderedBEs()) { setupVisualizer(be, partialTick); } diff --git a/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolBoxVisual.java b/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolBoxVisual.java index 2562c7a6ab..523e4d8622 100644 --- a/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolBoxVisual.java +++ b/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolBoxVisual.java @@ -28,10 +28,10 @@ public class ToolBoxVisual extends AbstractBlockEntityVisual facing = blockState.getValue(ToolboxBlock.FACING) .getOpposite(); - Instancer drawerModel = instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.TOOLBOX_DRAWER)); + Instancer drawerModel = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.TOOLBOX_DRAWER)); drawers = new TransformedInstance[]{drawerModel.createInstance(), drawerModel.createInstance()}; - lid = instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.TOOLBOX_LIDS.get(blockEntity.getColor()))) + lid = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.TOOLBOX_LIDS.get(blockEntity.getColor()))) .createInstance(); } diff --git a/src/main/java/com/simibubi/create/content/fluids/pipes/valve/FluidValveVisual.java b/src/main/java/com/simibubi/create/content/fluids/pipes/valve/FluidValveVisual.java index 7e3578851f..ce62d4af94 100644 --- a/src/main/java/com/simibubi/create/content/fluids/pipes/valve/FluidValveVisual.java +++ b/src/main/java/com/simibubi/create/content/fluids/pipes/valve/FluidValveVisual.java @@ -41,7 +41,7 @@ public class FluidValveVisual extends ShaftVisual impleme pointerRotationOffset = twist ? 90 : 0; settled = false; - pointer = instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.FLUID_VALVE_POINTER)).createInstance(); + pointer = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.FLUID_VALVE_POINTER)).createInstance(); transformPointer(partialTick); } diff --git a/src/main/java/com/simibubi/create/content/kinetics/base/SingleRotatingVisual.java b/src/main/java/com/simibubi/create/content/kinetics/base/SingleRotatingVisual.java index bc48a086a6..0a065eefdf 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/base/SingleRotatingVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/base/SingleRotatingVisual.java @@ -15,7 +15,7 @@ public class SingleRotatingVisual extends KineticB public SingleRotatingVisual(VisualizationContext context, T blockEntity, float partialTick) { super(context, blockEntity, partialTick); - rotatingModel = instancerProvider.instancer(AllInstanceTypes.ROTATING, model()) + rotatingModel = instancerProvider().instancer(AllInstanceTypes.ROTATING, model()) .createInstance(); setup(rotatingModel); } diff --git a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltVisual.java b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltVisual.java index edefb3b048..181618dd96 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltVisual.java @@ -65,7 +65,7 @@ public class BeltVisual extends KineticBlockEntityVisual { PartialModel beltPartial = BeltRenderer.getBeltPartial(diagonal, start, end, bottom); SpriteShiftEntry spriteShift = BeltRenderer.getSpriteShiftEntry(color, diagonal, bottom); - Instancer beltModel = instancerProvider.instancer(AllInstanceTypes.BELT, Models.partial(beltPartial)); + Instancer beltModel = instancerProvider().instancer(AllInstanceTypes.BELT, Models.partial(beltPartial)); keys.add(setup(beltModel.createInstance(), bottom, spriteShift)); @@ -138,7 +138,7 @@ public class BeltVisual extends KineticBlockEntityVisual { msr.uncenter(); }); - return instancerProvider.instancer(AllInstanceTypes.ROTATING, model); + return instancerProvider().instancer(AllInstanceTypes.ROTATING, model); } private Direction getOrientation() { diff --git a/src/main/java/com/simibubi/create/content/kinetics/crank/HandCrankVisual.java b/src/main/java/com/simibubi/create/content/kinetics/crank/HandCrankVisual.java index 41d9e9138e..00d3c1751d 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/crank/HandCrankVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/crank/HandCrankVisual.java @@ -27,13 +27,13 @@ public class HandCrankVisual extends KineticBlockEntityVisual implements xRot = facing == Direction.UP ? 270 : facing == Direction.DOWN ? 90 : 0; zRot = rotatePole ? 90 : 0; - pole = instancerProvider.instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.DEPLOYER_POLE)).createInstance(); + pole = instancerProvider().instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.DEPLOYER_POLE)).createInstance(); currentHand = this.blockEntity.getHandPose(); - hand = instancerProvider.instancer(InstanceTypes.ORIENTED, Models.partial(currentHand)).createInstance(); + hand = instancerProvider().instancer(InstanceTypes.ORIENTED, Models.partial(currentHand)).createInstance(); progress = getProgress(partialTick); updateRotation(pole, hand, yRot, xRot, zRot); @@ -69,7 +69,7 @@ public class DeployerVisual extends ShaftVisual implements if (currentHand != handPose) { currentHand = handPose; - instancerProvider.instancer(InstanceTypes.ORIENTED, Models.partial(currentHand)) + instancerProvider().instancer(InstanceTypes.ORIENTED, Models.partial(currentHand)) .stealInstance(hand); } } diff --git a/src/main/java/com/simibubi/create/content/kinetics/fan/FanVisual.java b/src/main/java/com/simibubi/create/content/kinetics/fan/FanVisual.java index 2a1a030f77..57aa69a525 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/fan/FanVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/fan/FanVisual.java @@ -29,8 +29,8 @@ public class FanVisual extends KineticBlockEntityVisual { direction = blockState.getValue(FACING); opposite = direction.getOpposite(); - shaft = instancerProvider.instancer(AllInstanceTypes.ROTATING, Models.partial(AllPartialModels.SHAFT_HALF, opposite)).createInstance(); - fan = instancerProvider.instancer(AllInstanceTypes.ROTATING, Models.partial(AllPartialModels.ENCASED_FAN_INNER, opposite)) + shaft = instancerProvider().instancer(AllInstanceTypes.ROTATING, Models.partial(AllPartialModels.SHAFT_HALF, opposite)).createInstance(); + fan = instancerProvider().instancer(AllInstanceTypes.ROTATING, Models.partial(AllPartialModels.ENCASED_FAN_INNER, opposite)) .createInstance(); setup(shaft); diff --git a/src/main/java/com/simibubi/create/content/kinetics/flywheel/FlywheelVisual.java b/src/main/java/com/simibubi/create/content/kinetics/flywheel/FlywheelVisual.java index 0f1adf8abc..16829f24f8 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/flywheel/FlywheelVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/flywheel/FlywheelVisual.java @@ -27,9 +27,9 @@ public class FlywheelVisual extends KineticBlockEntityVisual implemen GaugeBlock gaugeBlock = (GaugeBlock) blockState.getBlock(); - Instancer dialModel = instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.GAUGE_DIAL)); + Instancer dialModel = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.GAUGE_DIAL)); Instancer headModel = getHeadModel(); var msr = TransformStack.of(ms); @@ -157,7 +157,7 @@ public abstract class GaugeVisual extends ShaftVisual implemen @Override protected Instancer getHeadModel() { - return instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.GAUGE_HEAD_SPEED)); + return instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.GAUGE_HEAD_SPEED)); } } @@ -168,7 +168,7 @@ public abstract class GaugeVisual extends ShaftVisual implemen @Override protected Instancer getHeadModel() { - return instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.GAUGE_HEAD_STRESS)); + return instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.GAUGE_HEAD_STRESS)); } } } diff --git a/src/main/java/com/simibubi/create/content/kinetics/gearbox/GearboxVisual.java b/src/main/java/com/simibubi/create/content/kinetics/gearbox/GearboxVisual.java index bfed4f7c5b..b9ee456478 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/gearbox/GearboxVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/gearbox/GearboxVisual.java @@ -41,7 +41,7 @@ public class GearboxVisual extends KineticBlockEntityVisual if (boxAxis == axis) continue; - RotatingInstance key = instancerProvider.instancer(AllInstanceTypes.ROTATING, Models.partial(AllPartialModels.SHAFT_HALF, direction)) + RotatingInstance key = instancerProvider().instancer(AllInstanceTypes.ROTATING, Models.partial(AllPartialModels.SHAFT_HALF, direction)) .createInstance(); key.setRotationAxis(axis) diff --git a/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmVisual.java b/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmVisual.java index 50ca62d6b7..ef6f6554a5 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmVisual.java @@ -49,18 +49,18 @@ public class ArmVisual extends SingleRotatingVisual implements S public ArmVisual(VisualizationContext context, ArmBlockEntity blockEntity, float partialTick) { super(context, blockEntity, partialTick); - base = instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.ARM_BASE)) + base = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.ARM_BASE)) .createInstance(); - lowerBody = instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.ARM_LOWER_BODY)) + lowerBody = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.ARM_LOWER_BODY)) .createInstance(); - upperBody = instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.ARM_UPPER_BODY)) + upperBody = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.ARM_UPPER_BODY)) .createInstance(); - claw = instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(blockEntity.goggles ? AllPartialModels.ARM_CLAW_BASE_GOGGLES : AllPartialModels.ARM_CLAW_BASE)) + claw = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(blockEntity.goggles ? AllPartialModels.ARM_CLAW_BASE_GOGGLES : AllPartialModels.ARM_CLAW_BASE)) .createInstance(); - TransformedInstance clawGrip1 = instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.ARM_CLAW_GRIP_UPPER)) + TransformedInstance clawGrip1 = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.ARM_CLAW_GRIP_UPPER)) .createInstance(); - TransformedInstance clawGrip2 = instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.ARM_CLAW_GRIP_LOWER)) + TransformedInstance clawGrip2 = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.ARM_CLAW_GRIP_LOWER)) .createInstance(); clawGrips = Lists.newArrayList(clawGrip1, clawGrip2); @@ -175,7 +175,7 @@ public class ArmVisual extends SingleRotatingVisual implements S super.update(pt); models.remove(claw); claw.delete(); - claw = instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(blockEntity.goggles ? AllPartialModels.ARM_CLAW_BASE_GOGGLES : AllPartialModels.ARM_CLAW_BASE)) + claw = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(blockEntity.goggles ? AllPartialModels.ARM_CLAW_BASE_GOGGLES : AllPartialModels.ARM_CLAW_BASE)) .createInstance(); models.add(claw); updateLight(pt); diff --git a/src/main/java/com/simibubi/create/content/kinetics/mixer/MixerVisual.java b/src/main/java/com/simibubi/create/content/kinetics/mixer/MixerVisual.java index 74aeb1c4e4..f229d9d870 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/mixer/MixerVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/mixer/MixerVisual.java @@ -27,12 +27,12 @@ public class MixerVisual extends EncasedCogVisual implements SimpleDynamicVisual super(context, blockEntity, false, partialTick); this.mixer = blockEntity; - mixerHead = instancerProvider.instancer(AllInstanceTypes.ROTATING, Models.partial(AllPartialModels.MECHANICAL_MIXER_HEAD)) + mixerHead = instancerProvider().instancer(AllInstanceTypes.ROTATING, Models.partial(AllPartialModels.MECHANICAL_MIXER_HEAD)) .createInstance(); mixerHead.setRotationAxis(Direction.Axis.Y); - mixerPole = instancerProvider.instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.MECHANICAL_MIXER_POLE)) + mixerPole = instancerProvider().instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.MECHANICAL_MIXER_POLE)) .createInstance(); animate(partialTick); diff --git a/src/main/java/com/simibubi/create/content/kinetics/press/PressVisual.java b/src/main/java/com/simibubi/create/content/kinetics/press/PressVisual.java index 81244285b0..3f74a80518 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/press/PressVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/press/PressVisual.java @@ -24,7 +24,7 @@ public class PressVisual extends ShaftVisual impleme public PressVisual(VisualizationContext context, MechanicalPressBlockEntity blockEntity, float partialTick) { super(context, blockEntity, partialTick); - pressHead = instancerProvider.instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.MECHANICAL_PRESS_HEAD)) + pressHead = instancerProvider().instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.MECHANICAL_PRESS_HEAD)) .createInstance(); Quaternionf q = Axis.YP diff --git a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/BracketedKineticBlockEntityVisual.java b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/BracketedKineticBlockEntityVisual.java index 35af391de0..0b6b5b7fa0 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/BracketedKineticBlockEntityVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/BracketedKineticBlockEntityVisual.java @@ -39,7 +39,7 @@ public class BracketedKineticBlockEntityVisual extends SingleRotatingVisual half = instancerProvider.instancer(AllInstanceTypes.ROTATING, model); + Instancer half = instancerProvider().instancer(AllInstanceTypes.ROTATING, model); additionalShaft = setup(half.createInstance(), speed); additionalShaft.setRotationOffset(offset) diff --git a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogVisual.java b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogVisual.java index 38a5d07d3a..d0b1113919 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogVisual.java @@ -49,7 +49,7 @@ public class EncasedCogVisual extends KineticBlockEntityVisual extends KineticBlockEntityVisual { - private static final ModelCache MODEL_CACHE = new ModelCache<>(WaterWheelVisual::createModel); + private static final ResourceReloadCache MODEL_CACHE = new ResourceReloadCache<>(WaterWheelVisual::createModel); protected final boolean large; protected BlockState lastMaterial; @@ -42,7 +42,7 @@ public class WaterWheelVisual extends KineticBl private void setupInstance() { lastMaterial = blockEntity.material; - rotatingModel = instancerProvider.instancer(AllInstanceTypes.ROTATING, MODEL_CACHE.get(new WaterWheelModelKey(large, blockState, blockEntity.material))) + rotatingModel = instancerProvider().instancer(AllInstanceTypes.ROTATING, MODEL_CACHE.get(new WaterWheelModelKey(large, blockState, blockEntity.material))) .createInstance(); setup(rotatingModel); } diff --git a/src/main/java/com/simibubi/create/content/logistics/depot/EjectorVisual.java b/src/main/java/com/simibubi/create/content/logistics/depot/EjectorVisual.java index c1df29c359..c1bcae3c25 100644 --- a/src/main/java/com/simibubi/create/content/logistics/depot/EjectorVisual.java +++ b/src/main/java/com/simibubi/create/content/logistics/depot/EjectorVisual.java @@ -22,7 +22,7 @@ public class EjectorVisual extends ShaftVisual implements Si public EjectorVisual(VisualizationContext dispatcher, EjectorBlockEntity blockEntity, float partialTick) { super(dispatcher, blockEntity, partialTick); - plate = instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.EJECTOR_TOP)).createInstance(); + plate = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.EJECTOR_TOP)).createInstance(); pivotPlate(getLidProgress(partialTick)); } diff --git a/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelVisual.java b/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelVisual.java index 49df6dfd30..ed8ba99e29 100644 --- a/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelVisual.java +++ b/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelVisual.java @@ -34,7 +34,7 @@ public class FunnelVisual extends AbstractBlockEntityVisual i PartialModel flapPartial = (blockState.getBlock() instanceof FunnelBlock ? AllPartialModels.FUNNEL_FLAP : AllPartialModels.BELT_FUNNEL_FLAP); - Instancer model = instancerProvider.instancer(AllInstanceTypes.FLAP, Models.partial(flapPartial)); + Instancer model = instancerProvider().instancer(AllInstanceTypes.FLAP, Models.partial(flapPartial)); int blockLight = level.getBrightness(LightLayer.BLOCK, pos); int skyLight = level.getBrightness(LightLayer.SKY, pos); diff --git a/src/main/java/com/simibubi/create/content/logistics/tunnel/BeltTunnelVisual.java b/src/main/java/com/simibubi/create/content/logistics/tunnel/BeltTunnelVisual.java index 7be7f1b0eb..3e43718448 100644 --- a/src/main/java/com/simibubi/create/content/logistics/tunnel/BeltTunnelVisual.java +++ b/src/main/java/com/simibubi/create/content/logistics/tunnel/BeltTunnelVisual.java @@ -34,7 +34,7 @@ public class BeltTunnelVisual extends AbstractBlockEntityVisual model = instancerProvider.instancer(AllInstanceTypes.FLAP, Models.partial(AllPartialModels.BELT_TUNNEL_FLAP)); + Instancer model = instancerProvider().instancer(AllInstanceTypes.FLAP, Models.partial(AllPartialModels.BELT_TUNNEL_FLAP)); int blockLight = level.getBrightness(LightLayer.BLOCK, pos); int skyLight = level.getBrightness(LightLayer.SKY, pos); diff --git a/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerVisual.java b/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerVisual.java index 55fa5377da..70fa22609f 100644 --- a/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerVisual.java +++ b/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerVisual.java @@ -55,7 +55,7 @@ public class BlazeBurnerVisual extends AbstractBlockEntityVisual instancer.createInstance()) .map(BogeyModelData::new) @@ -212,7 +212,7 @@ public abstract class BogeyRenderer { */ public void createModelInstance(VisualizationContext context, BlockState state, int count) { var instancer = context.instancerProvider() - .instancer(InstanceTypes.TRANSFORMED, VirtualRenderHelper.blockModel(state)); + .instancer(InstanceTypes.POSED, VirtualRenderHelper.blockModel(state)); BogeyModelData[] modelData = IntStream.range(0, count) .mapToObj(i -> instancer.createInstance()) .map(BogeyModelData::new) @@ -340,27 +340,27 @@ public abstract class BogeyRenderer { } public BogeyModelData setTransform(PoseStack ms) { - if (this.transform instanceof TransformedInstance model) + if (this.transform instanceof PosedInstance model) model.setTransform(ms) .setChanged(); return this; } public BogeyModelData setEmptyTransform() { - if (this.transform instanceof TransformedInstance model) + if (this.transform instanceof PosedInstance model) model.setZeroTransform() .setChanged(); return this; } public BogeyModelData delete() { - if (this.transform instanceof TransformedInstance model) + if (this.transform instanceof PosedInstance model) model.delete(); return this; } public BogeyModelData updateLight(int blockLight, int skyLight) { - if (this.transform instanceof TransformedInstance model) + if (this.transform instanceof PosedInstance model) model.light(blockLight, skyLight) .setChanged(); return this; diff --git a/src/main/java/com/simibubi/create/content/trains/track/TrackVisual.java b/src/main/java/com/simibubi/create/content/trains/track/TrackVisual.java index 9c5aabdb27..8d531e2dda 100644 --- a/src/main/java/com/simibubi/create/content/trains/track/TrackVisual.java +++ b/src/main/java/com/simibubi/create/content/trains/track/TrackVisual.java @@ -138,11 +138,11 @@ public class TrackVisual extends AbstractBlockEntityVisual { TrackMaterial.TrackModelHolder modelHolder = bc.getMaterial().getModelHolder(); - instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(modelHolder.tie())) + instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(modelHolder.tie())) .createInstances(ties); - instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(modelHolder.leftSegment())) + instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(modelHolder.leftSegment())) .createInstances(left); - instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(modelHolder.rightSegment())) + instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(modelHolder.rightSegment())) .createInstances(right); SegmentAngles[] segments = bc.getBakedSegments(); @@ -151,14 +151,14 @@ public class TrackVisual extends AbstractBlockEntityVisual { var modelIndex = i - 1; ties[modelIndex].setTransform(pose) - .transform(segment.tieTransform) + .mul(segment.tieTransform) .setChanged(); tiesLightPos[modelIndex] = segment.lightPosition.offset(tePosition); for (boolean first : Iterate.trueAndFalse) { Pose transform = segment.railTransforms.get(first); (first ? this.left : this.right)[modelIndex].setTransform(pose) - .transform(transform) + .mul(transform) .setChanged(); (first ? leftLightPos : rightLightPos)[modelIndex] = segment.lightPosition.offset(tePosition); } @@ -218,10 +218,10 @@ public class TrackVisual extends AbstractBlockEntityVisual { beams = Couple.create(() -> new TransformedInstance[segCount]); beamCaps = Couple.create(() -> Couple.create(() -> new TransformedInstance[segCount])); lightPos = new BlockPos[segCount]; - beams.forEach(instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.GIRDER_SEGMENT_MIDDLE))::createInstances); + beams.forEach(instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.GIRDER_SEGMENT_MIDDLE))::createInstances); beamCaps.forEachWithContext((c, top) -> { var partialModel = Models.partial(top ? AllPartialModels.GIRDER_SEGMENT_TOP : AllPartialModels.GIRDER_SEGMENT_BOTTOM); - c.forEach(instancerProvider.instancer(InstanceTypes.TRANSFORMED, partialModel)::createInstances); + c.forEach(instancerProvider().instancer(InstanceTypes.TRANSFORMED, partialModel)::createInstances); }); GirderAngles[] bakedGirders = bc.getBakedGirders(); @@ -233,14 +233,14 @@ public class TrackVisual extends AbstractBlockEntityVisual { for (boolean first : Iterate.trueAndFalse) { Pose beamTransform = segment.beams.get(first); beams.get(first)[modelIndex].setTransform(pose) - .transform(beamTransform) + .mul(beamTransform) .setChanged(); for (boolean top : Iterate.trueAndFalse) { Pose beamCapTransform = segment.beamCaps.get(top) .get(first); beamCaps.get(top) .get(first)[modelIndex].setTransform(pose) - .transform(beamCapTransform) + .mul(beamCapTransform) .setChanged(); } } From a5038c6a6a8e9b61852ebb7b41cc26649b490d0a Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Sat, 21 Sep 2024 12:10:56 -0700 Subject: [PATCH 057/515] On track to stability - Fix track visuals not appearing when first placed - Fix blaze burner's heads appearing at 0,0,0 until you look at them - Bump flywheel version to fix crash when breaking blocks --- gradle.properties | 2 +- .../processing/burner/BlazeBurnerVisual.java | 10 +++++-- .../content/trains/track/TrackVisual.java | 27 ++++++++++--------- 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/gradle.properties b/gradle.properties index 6e507fc553..145e7631bf 100644 --- a/gradle.properties +++ b/gradle.properties @@ -23,7 +23,7 @@ use_parchment = true # dependency versions registrate_version = MC1.20-1.3.3 flywheel_minecraft_version = 1.20.1 -flywheel_version = 1.0.0-beta-134 +flywheel_version = 1.0.0-beta-136 jei_minecraft_version = 1.20.1 jei_version = 15.10.0.39 curios_minecraft_version = 1.20.1 diff --git a/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerVisual.java b/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerVisual.java index 70fa22609f..8d7b3202c0 100644 --- a/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerVisual.java +++ b/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerVisual.java @@ -77,6 +77,8 @@ public class BlazeBurnerVisual extends AbstractBlockEntityVisual 0.125f; @@ -135,7 +141,7 @@ public class BlazeBurnerVisual extends AbstractBlockEntityVisual { - private final List visuals; + private final List visuals = new ArrayList<>(); public TrackVisual(VisualizationContext context, TrackBlockEntity track, float partialTick) { super(context, track, partialTick); - visuals = blockEntity.connections.values() - .stream() - .map(this::createInstance) - .filter(Objects::nonNull) - .toList(); + collectConnections(); } @Override @@ -49,13 +46,22 @@ public class TrackVisual extends AbstractBlockEntityVisual { return; _delete(); + + collectConnections(); + lightSections.sections(collectLightSections()); } + private void collectConnections() { + blockEntity.connections.values() + .stream() + .map(this::createInstance) + .filter(Objects::nonNull) + .forEach(visuals::add); + } + @Override public void updateLight(float partialTick) { - if (visuals == null) - return; visuals.forEach(BezierTrackVisual::updateLight); } @@ -68,9 +74,8 @@ public class TrackVisual extends AbstractBlockEntityVisual { @Override public void _delete() { - if (visuals == null) - return; visuals.forEach(BezierTrackVisual::delete); + visuals.clear(); } public LongSet collectLightSections() { @@ -102,8 +107,6 @@ public class TrackVisual extends AbstractBlockEntityVisual { @Override public void collectCrumblingInstances(Consumer consumer) { - if (visuals == null) - return; for (BezierTrackVisual instance : visuals) { instance.collectCrumblingInstances(consumer); } From f28a62cf6a35818a2d329d4d202445569901f432 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Sun, 22 Sep 2024 16:09:08 +0200 Subject: [PATCH 058/515] QuickTweaks - Separate gui texture for frogport - Threshold switch remembers stacks/items setting - Packager reacts to pulses --- .../logistics/frogport/FrogportInventory.java | 6 +++ .../logistics/frogport/FrogportScreen.java | 45 +++++++++--------- .../packager/PackagerBlockEntity.java | 6 +++ .../ConfigureThresholdSwitchPacket.java | 7 ++- .../ThresholdSwitchBlockEntity.java | 3 ++ .../ThresholdSwitchScreen.java | 6 +-- .../create/foundation/gui/AllGuiTextures.java | 4 +- .../assets/create/textures/gui/frogport.png | Bin 0 -> 1099 bytes 8 files changed, 49 insertions(+), 28 deletions(-) create mode 100644 src/main/resources/assets/create/textures/gui/frogport.png diff --git a/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportInventory.java b/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportInventory.java index 04b5bead6c..8efed235a7 100644 --- a/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportInventory.java +++ b/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportInventory.java @@ -59,5 +59,11 @@ public class FrogportInventory extends ItemStackHandler { port.notifyUpdate(); return extractItem; } + + @Override + protected void onContentsChanged(int slot) { + super.onContentsChanged(slot); + port.setChanged(); + } } diff --git a/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportScreen.java b/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportScreen.java index 33ec02b541..f70647447e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportScreen.java @@ -33,19 +33,19 @@ public class FrogportScreen extends AbstractSimiScreen { public FrogportScreen(FrogportBlockEntity be) { super(AllBlocks.PACKAGE_FROGPORT.asStack() .getHoverName()); - background = AllGuiTextures.PACKAGE_FILTER; + background = AllGuiTextures.FROGPORT; this.blockEntity = be; } @Override protected void init() { setWindowSize(background.getWidth(), background.getHeight()); - setWindowOffset(-11, 7); + setWindowOffset(-11, -3); super.init(); clearWidgets(); - int x = guiLeft; - int y = guiTop; + int x = guiLeft + 10; + int y = guiTop + 10; addressBox = new EditBox(this.font, x + 44, y + 28, 140, 9, Component.empty()); addressBox.setMaxLength(50); @@ -59,18 +59,18 @@ public class FrogportScreen extends AbstractSimiScreen { addRenderableWidget(addressBox); confirmButton = - new IconButton(x + background.getWidth() - 33, y + background.getHeight() - 24, AllIcons.I_CONFIRM); + new IconButton(x + background.getWidth() - 53, y + background.getHeight() - 44, AllIcons.I_CONFIRM); confirmButton.withCallback(() -> minecraft.setScreen(null)); addRenderableWidget(confirmButton); - dumpPackagesButton = new IconButton(x + 156, y + background.getHeight() - 24, AllIcons.I_PRIORITY_LOW); + dumpPackagesButton = new IconButton(x + 156, y + background.getHeight() - 44, AllIcons.I_PRIORITY_LOW); dumpPackagesButton.withCallback(() -> AllPackets.getChannel() - .sendToServer(new FrogportConfigurationPacket(blockEntity.getBlockPos(), addressBox.getValue(), - !sendOnly(), true))); + .sendToServer( + new FrogportConfigurationPacket(blockEntity.getBlockPos(), addressBox.getValue(), !sendOnly(), true))); dumpPackagesButton.setToolTip(CreateLang.translateDirect("gui.package_port.eject_to_inventory")); addRenderableWidget(dumpPackagesButton); - dontAcceptPackages = new IconButton(x + 15, y + background.getHeight() - 24, AllIcons.I_SEND_ONLY); + dontAcceptPackages = new IconButton(x + 15, y + background.getHeight() - 44, AllIcons.I_SEND_ONLY); dontAcceptPackages.withCallback(() -> { addressBox.setValue(CreateLang.translate("gui.package_port.accept_nothing") .string()); @@ -85,8 +85,8 @@ public class FrogportScreen extends AbstractSimiScreen { @Override public void removed() { AllPackets.getChannel() - .sendToServer(new FrogportConfigurationPacket(blockEntity.getBlockPos(), addressBox.getValue(), - !sendOnly(), false)); + .sendToServer( + new FrogportConfigurationPacket(blockEntity.getBlockPos(), addressBox.getValue(), !sendOnly(), false)); super.removed(); } @@ -100,8 +100,8 @@ public class FrogportScreen extends AbstractSimiScreen { public void tick() { super.tick(); dontAcceptPackages.active = !sendOnly(); - if (dumpPackagesButton.active != (getPackageCount() != 0)) { - dumpPackagesButton.active = !dumpPackagesButton.active; + if (dumpPackagesButton.visible != (getPackageCount() != 0)) { + dumpPackagesButton.visible = !dumpPackagesButton.active; dumpPackagesButton.getToolTip() .clear(); if (dumpPackagesButton.active) @@ -111,27 +111,28 @@ public class FrogportScreen extends AbstractSimiScreen { @Override protected void renderWindow(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { - int x = guiLeft; - int y = guiTop; + int x = guiLeft + 10; + int y = guiTop + 10; - background.render(graphics, x, y); - graphics.drawString(font, title, x + background.getWidth() / 2 - font.width(title) / 2, y + 4, 0x3D3C48, false); + background.render(graphics, guiLeft, guiTop); + graphics.drawString(font, title, x + (background.getWidth() - 20) / 2 - font.width(title) / 2, y + 4, 0x3D3C48, + false); GuiGameElement.of(renderedItem).at(x + background.getWidth() + 6, y + background.getHeight() - 56, -200) .scale(5) .render(graphics); - AllGuiTextures.PACKAGE_PORT_SLOT.render(graphics, x + 136, y + background.getHeight() - 24); graphics.renderItem(renderedPackage, x + 16, y + 23); if (getPackageCount() > 0) { - graphics.renderItem(renderedPackage, x + 137, y + background.getHeight() - 24); - graphics.renderItemDecorations(font, renderedPackage, x + 137, y + background.getHeight() - 24, + AllGuiTextures.FROGPORT_SLOT.render(graphics, x + 136, y + background.getHeight() - 44); + graphics.renderItem(renderedPackage, x + 137, y + background.getHeight() - 44); + graphics.renderItemDecorations(font, renderedPackage, x + 137, y + background.getHeight() - 44, String.valueOf(getPackageCount())); - if (mouseX > x + 136 && mouseX < x + 136 + 18 && mouseY > y + background.getHeight() - 24 - && mouseY < y + background.getHeight() - 24 + 18) + if (mouseX > x + 136 && mouseX < x + 136 + 18 && mouseY > y + background.getHeight() - 44 + && mouseY < y + background.getHeight() - 44 + 18) graphics.renderComponentTooltip(font, List.of(CreateLang.translate("gui.package_port.packages_backed_up", getPackageCount()) .component()), diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java index b990f5cc34..2ed48b8498 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java @@ -166,6 +166,12 @@ public class PackagerBlockEntity extends SmartBlockEntity { public void activate() { redstonePowered = true; setChanged(); + + recheckIfLinksPresent(); + if (!redstoneModeActive) + return; + updateSignAddress(); + attemptToSend(false); } public boolean unwrapBox(ItemStack box, boolean simulate) { diff --git a/src/main/java/com/simibubi/create/content/redstone/thresholdSwitch/ConfigureThresholdSwitchPacket.java b/src/main/java/com/simibubi/create/content/redstone/thresholdSwitch/ConfigureThresholdSwitchPacket.java index 5165578b4f..9f5a9fe4ac 100644 --- a/src/main/java/com/simibubi/create/content/redstone/thresholdSwitch/ConfigureThresholdSwitchPacket.java +++ b/src/main/java/com/simibubi/create/content/redstone/thresholdSwitch/ConfigureThresholdSwitchPacket.java @@ -10,12 +10,14 @@ public class ConfigureThresholdSwitchPacket extends BlockEntityConfigurationPack private int offBelow; private int onAbove; private boolean invert; + private boolean inStacks; - public ConfigureThresholdSwitchPacket(BlockPos pos, int offBelow, int onAbove, boolean invert) { + public ConfigureThresholdSwitchPacket(BlockPos pos, int offBelow, int onAbove, boolean invert, boolean inStacks) { super(pos); this.offBelow = offBelow; this.onAbove = onAbove; this.invert = invert; + this.inStacks = inStacks; } public ConfigureThresholdSwitchPacket(FriendlyByteBuf buffer) { @@ -27,6 +29,7 @@ public class ConfigureThresholdSwitchPacket extends BlockEntityConfigurationPack offBelow = buffer.readInt(); onAbove = buffer.readInt(); invert = buffer.readBoolean(); + inStacks = buffer.readBoolean(); } @Override @@ -34,6 +37,7 @@ public class ConfigureThresholdSwitchPacket extends BlockEntityConfigurationPack buffer.writeInt(offBelow); buffer.writeInt(onAbove); buffer.writeBoolean(invert); + buffer.writeBoolean(inStacks); } @Override @@ -41,6 +45,7 @@ public class ConfigureThresholdSwitchPacket extends BlockEntityConfigurationPack be.offWhenBelow = offBelow; be.onWhenAbove = onAbove; be.setInverted(invert); + be.inStacks = inStacks; } } diff --git a/src/main/java/com/simibubi/create/content/redstone/thresholdSwitch/ThresholdSwitchBlockEntity.java b/src/main/java/com/simibubi/create/content/redstone/thresholdSwitch/ThresholdSwitchBlockEntity.java index abd5d0c114..3dfe2f9e1a 100644 --- a/src/main/java/com/simibubi/create/content/redstone/thresholdSwitch/ThresholdSwitchBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/redstone/thresholdSwitch/ThresholdSwitchBlockEntity.java @@ -44,6 +44,7 @@ public class ThresholdSwitchBlockEntity extends SmartBlockEntity { public int currentMinLevel; public int currentLevel; public int currentMaxLevel; + public boolean inStacks; private boolean redstoneState; private boolean inverted; @@ -78,6 +79,7 @@ public class ThresholdSwitchBlockEntity extends SmartBlockEntity { currentLevel = compound.getInt("CurrentAmount"); currentMinLevel = compound.getInt("CurrentMinAmount"); currentMaxLevel = compound.getInt("CurrentMaxAmount"); + inStacks = compound.getBoolean("InStacks"); redstoneState = compound.getBoolean("Powered"); inverted = compound.getBoolean("Inverted"); poweredAfterDelay = compound.getBoolean("PoweredAfterDelay"); @@ -96,6 +98,7 @@ public class ThresholdSwitchBlockEntity extends SmartBlockEntity { compound.putInt("CurrentAmount", currentLevel); compound.putInt("CurrentMinAmount", currentMinLevel); compound.putInt("CurrentMaxAmount", currentMaxLevel); + compound.putBoolean("InStacks", inStacks); compound.putBoolean("Powered", redstoneState); compound.putBoolean("PoweredAfterDelay", poweredAfterDelay); super.write(compound, clientPacket); diff --git a/src/main/java/com/simibubi/create/content/redstone/thresholdSwitch/ThresholdSwitchScreen.java b/src/main/java/com/simibubi/create/content/redstone/thresholdSwitch/ThresholdSwitchScreen.java index 849d7d2f7c..b58756df32 100644 --- a/src/main/java/com/simibubi/create/content/redstone/thresholdSwitch/ThresholdSwitchScreen.java +++ b/src/main/java/com/simibubi/create/content/redstone/thresholdSwitch/ThresholdSwitchScreen.java @@ -68,9 +68,7 @@ public class ThresholdSwitchScreen extends AbstractSimiScreen { .forOptions(List.of(CreateLang.translateDirect("schedule.condition.threshold.items"), CreateLang.translateDirect("schedule.condition.threshold.stacks"))) .titled(CreateLang.translateDirect("schedule.condition.threshold.item_measure")) - .setState( - blockEntity.getTypeOfCurrentTarget() == ThresholdType.ITEM && blockEntity.onWhenAbove % 64 == 0 ? 1 - : 0); + .setState(blockEntity.inStacks ? 1 : 0); offBelow = new ScrollInput(x + 48, y + 47, 1, 18) .withRange(blockEntity.getMinLevel(), blockEntity.getMaxLevel() + 1 - getValueStep()) @@ -335,7 +333,7 @@ public class ThresholdSwitchScreen extends AbstractSimiScreen { protected void send(boolean invert) { AllPackets.getChannel() .sendToServer(new ConfigureThresholdSwitchPacket(blockEntity.getBlockPos(), offBelow.getState(), - onAbove.getState(), invert)); + onAbove.getState(), invert, inStacks.getState() == 1)); } } diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java index 2b16769ba8..95d096bef5 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java @@ -47,7 +47,9 @@ public enum AllGuiTextures implements ScreenElement, TextureSheetSegment { FILTER("filters", 214, 99), ATTRIBUTE_FILTER("filters", 0, 99, 241, 85), PACKAGE_FILTER("filters_2", 0, 0, 218, 79), - PACKAGE_PORT_SLOT("filters_2", 15, 23, 18, 18), + + FROGPORT("frogport", 0, 0, 238, 99), + FROGPORT_SLOT("frogport", 25, 33, 18, 18), TOOLBOX("toolbox", 188, 171), TOOLBELT_SLOT("minecraft", "widgets", 24, 23, 22, 22), diff --git a/src/main/resources/assets/create/textures/gui/frogport.png b/src/main/resources/assets/create/textures/gui/frogport.png new file mode 100644 index 0000000000000000000000000000000000000000..12687c6f49bab08f30ceb2c5b97ec236de62ba4c GIT binary patch literal 1099 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911MRQ8&P5D>38$lZxy-8q?;Kn_c~qpu?a z!^VE@KZ&eBzDIyhi0glb{Xpin(+}$=F0r-oNGonTbm-8kRjXdTdezlTVym8~k_3PJ{ELj3H!TIpK8$e2;B*-rqs1h4s zI4i983aEy&z$3Dlfr0NJ2s7@OnEjT4fjPs|#WAEJ?(MAZyjuYRtlr*oEg!T5{{8pQ z{&3~Sv7HtTYfsNJo@VtVOrUI2;bN`*T6}?t`TVZsKL ztqkoaUq>s%RiC}j^TF${<@kFH`3%WRKe9bg?&Y0P{^4$= zTgdzW?|5g_Z<{$c?(ZiXWwGV!11s~s;c-Z|r>pBH!^xN4sYpI=}1#QUeI z*7}EL4gS-VALlU0KRaO|eW2aa=nz|q?SBsG3E%%5&UbkBnSVdyXVre=)F0Ij&sf{` zv!}!*{NR0Ib-qK;OyT|S2S7djb1jX|v3)pMbmV)3d)|SZo6GJroc`QX@r11e?xu=g zukZ0z{5mcDfHz@{$vuXeBhm{0xP|`2c`8Wgc-k`9`?fx8V_2=8Jh$Tb>|SPr2qE?Z ztb8BVF#g*XDdRttNhivuZ~5%A+x#1MFoxZJyUxAw0Atwh*nXyo%wMzw^c)Jg*D!t2 z6wp2J@qR;b!_~a{wGJB?mjBFV4Ez1pE>+jQr$%sf0(z` XFF*hD(TbbEjL6{W>gTe~DWM4fl?c@1 literal 0 HcmV?d00001 From b4d4c0a2be11ae61421ea424775b49795f9cc127 Mon Sep 17 00:00:00 2001 From: Kryppers <65094918+Kryppers@users.noreply.github.com> Date: Sun, 22 Sep 2024 15:29:44 +0100 Subject: [PATCH 059/515] visual adjustment: part 1 --- .../models/block/package_frogport/body.json | 12 ++++++------ .../create/models/entity/train_hat.json | 6 +++--- .../assets/create/textures/block/basin.png | Bin 436 -> 496 bytes .../assets/create/textures/block/port.png | Bin 733 -> 1632 bytes .../create/textures/entity/logistics_hat.png | Bin 351 -> 389 bytes .../assets/create/textures/gui/frogport.png | Bin 1099 -> 1443 bytes 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/resources/assets/create/models/block/package_frogport/body.json b/src/main/resources/assets/create/models/block/package_frogport/body.json index d169ed55c0..e56b44ed3c 100644 --- a/src/main/resources/assets/create/models/block/package_frogport/body.json +++ b/src/main/resources/assets/create/models/block/package_frogport/body.json @@ -14,7 +14,8 @@ "north": {"uv": [0, 2.5, 6, 5.5], "texture": "#1"}, "east": {"uv": [12, 2.5, 6, 5.5], "texture": "#1"}, "south": {"uv": [6, 13, 12, 16], "texture": "#1"}, - "west": {"uv": [6, 2.5, 12, 5.5], "texture": "#1"} + "west": {"uv": [6, 2.5, 12, 5.5], "texture": "#1"}, + "down": {"uv": [13, 9.5, 14, 10.5], "texture": "#1"} } }, { @@ -38,7 +39,7 @@ "south": {"uv": [4.5, 8.5, 6, 10], "texture": "#1"}, "west": {"uv": [1.5, 8.5, 5, 10], "texture": "#1"}, "up": {"uv": [6, 8.5, 9, 10], "rotation": 90, "texture": "#1"}, - "down": {"uv": [0, 0, 3, 6], "texture": "#1"} + "down": {"uv": [12, 9, 15, 10.5], "rotation": 90, "texture": "#1"} } }, { @@ -51,7 +52,7 @@ "south": {"uv": [6, 8.5, 4.5, 10], "texture": "#1"}, "west": {"uv": [12, 8.5, 9, 10], "texture": "#1"}, "up": {"uv": [6, 10, 9, 8.5], "rotation": 90, "texture": "#1"}, - "down": {"uv": [0, 0, 3, 6], "texture": "#1"} + "down": {"uv": [12, 9, 15, 10.5], "rotation": 90, "texture": "#1"} } }, { @@ -94,8 +95,7 @@ "rotation": {"angle": 0, "axis": "y", "origin": [2, 10, 2]}, "faces": { "south": {"uv": [0, 5, 6, 6], "texture": "#0"}, - "up": {"uv": [0, 6, 6, 10], "rotation": 180, "texture": "#0"}, - "down": {"uv": [0, 0, 12, 9], "texture": "#1"} + "up": {"uv": [0, 6, 6, 10], "rotation": 180, "texture": "#0"} } }, { @@ -123,7 +123,7 @@ } }, { - "from": [0, 4, 7], + "from": [0, 4.1, 7], "to": [16, 4.1, 13], "rotation": {"angle": 0, "axis": "y", "origin": [0, 4, 7]}, "faces": { diff --git a/src/main/resources/assets/create/models/entity/train_hat.json b/src/main/resources/assets/create/models/entity/train_hat.json index 09fd97ba83..c9b0ad4ba3 100644 --- a/src/main/resources/assets/create/models/entity/train_hat.json +++ b/src/main/resources/assets/create/models/entity/train_hat.json @@ -11,7 +11,7 @@ "rotation": {"angle": 0, "axis": "x", "origin": [0, 0, -1.5]}, "faces": { "north": {"uv": [12, 4, 15, 13], "rotation": 90, "texture": "#0"}, - "east": {"uv": [9, 4, 12, 13], "rotation": 270, "texture": "#0"}, + "east": {"uv": [12, 4, 9, 13], "rotation": 270, "texture": "#0"}, "south": {"uv": [0, 2, 9, 5], "rotation": 180, "texture": "#0"}, "west": {"uv": [9, 4, 12, 13], "rotation": 90, "texture": "#0"}, "up": {"uv": [0, 5, 9, 14], "rotation": 180, "texture": "#0"} @@ -23,7 +23,7 @@ "rotation": {"angle": 0, "axis": "x", "origin": [0, 0, -1.5]}, "faces": { "north": {"uv": [12, 4, 15, 13], "rotation": 90, "texture": "#0"}, - "east": {"uv": [9, 4, 12, 13], "rotation": 270, "texture": "#0"}, + "east": {"uv": [12, 4, 9, 13], "rotation": 270, "texture": "#0"}, "south": {"uv": [0, 2, 9, 5], "rotation": 180, "texture": "#0"}, "west": {"uv": [9, 4, 12, 13], "rotation": 90, "texture": "#0"}, "up": {"uv": [0, 5, 9, 14], "rotation": 180, "texture": "#0"} @@ -58,4 +58,4 @@ } } ] -} +} \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/block/basin.png b/src/main/resources/assets/create/textures/block/basin.png index b4a41be53cd2d6c7be69be318f07d7e7b7df599c..83b8bca696e336a623409f5f643ca49a80dbdc90 100644 GIT binary patch delta 438 zcmV;n0ZIO}1MmZo7!(Kt0000)q>9D>001*kOjJbxXIYUcFnBs;800DGTPE!Ct z=GbNc0004EOGiWihy@);00009a7bBm000XU000XU0RWnu7ytkO2XskIMF;2!77Hdd z*O~E~0003tNklQ{)3)Ka5p6rM z6d+G{oU#bB_HGse@6|bSB znbj+l)&`|Uy0zq`sW4E&jHgv^2`Gr?+!{0hfrpS70`L$e2w;j5t3pVy@Z5Vhn-bWe zfc_=B2F@cI9_mA(YMvr)QELwq7UyB1r_I2~<8)TrTYr00@HPpyZc}E3T){b>34D7Gb)0`VK%j+y z@1q4Uoghzw5C}*d09GgPJHZwD90h_^AqaPg{!fV?3H&4BtH}>-z7L9)L46(d*UK9J gXuoa0^%wQJU);GL^yrjRW&i*H07*qoM6N<$f?v(J?*IS* delta 377 zcmV-<0fzqY1GEE>7!d>m0001iRA5Qg^(gf4BmbPNup_ll&)a?%Hz^m&**56le^B^}ERY;M4Y z69i5Gx`MKSK}^PzZ$_HYr+=lDAZpZW^~QzDvQ)@2NFtS{k&5%-V3-XCITSRnoyo+D zQdlzFg_nP=w`risjPrbC2wwH=b?;sGOEJb!2?@3lUoa+<3zCSiljl8DT+ED_%vnmp zW)SGUPiRD?WH6B=h#}QU7-*f6866ViBtpb^#7mk@Xu)v)8O#3Tv?Mu{sDySw!u*Ms zg)Ak3&tWsf8??N~f@2cc9RZglTF3E8Bp66d;0;~er&>rqyy(E5p4(Vq=b&{I_M7?3 zI=DKBuG`u5+HM@EgNWRA%e-1i!i(RMlj#00)L&6Kv~sQQ^uae)X}$6|`SWHFqJRDm XF<20x|K5$z00000NkvXXu0mjf)c3C< diff --git a/src/main/resources/assets/create/textures/block/port.png b/src/main/resources/assets/create/textures/block/port.png index d9e2d93e7c0406cd498b3a31534aefdf618c3613..e7fc3b26ff8e5656f64dff34ec8e9fc71bb0e255 100644 GIT binary patch delta 1626 zcmV-g2BrDk1>g*j8Gi-<0047(dh`GQ00v@9M??U|0LB2ucrz<=00009a7bBm000XR z000XR0j(pwbpQYW2XskIMF;2!77iIZZZtGY000H;Nkl4lmUqQ7#w&4DQ&>2jf2j@Nn<-y!Xi@F;yj-N#WW5=4+N3pGA$&^WzV5_(EYC z6-8{CPsZ8$$4(;QYlwu`i_O*eEMFY^9$zRd=JLsS4Sxw=D2$oWko`db@qA}b2jBd- zfTwR@*mAN3XlU}X+?)+Fqg7PwZ5DIs%draa!n~LZ{GrPw15h$@bajQepjt>~Mq_O3 zkcU;^uDc$x>_eTKmW&(#in0!Xxyv({#bSkE(-jocZ600El1O?e7kqdCUU>eWRwTT> z#?hP(r+>z0dHR``evPQLGzz)Cfnn>|;r&9O_m2AjkXnjhv>=Us{-I?baB^~rL{f9@ z*bxc}``ZyyO>FA)ITC7~@vn~p(EX<_tJ)E(p)D-pZ;+7wHSzByr>fX(+m;($f@*wT ztf}$Yx|?-`f+W=ZRbN=h3KN7n>#Hi8%_7S((tpQ?zXhOY`=%OCcapH>>Y-=*CUiY3 z{$H4hiRX=*a&_Oy<#IGNNl5lYBB_x`YBdC=PM_oVplIsC?yiqIe}U#rTdopFrZa>B zeojtK)d(lknH3K?JADy=?LECUYr38#&>lr@4b)`G^XE?^1v_sLaoyN{6Z>9&c12Gg z+<)_&HGgJGBo@D~k~KpCKL_9cs7Br<<;;|}V?O@apONy(IFek+e5u$B{X=`Lb^bO+ zs)!8kdCtmaQlw%tf^gB)@ke|sYRAqE^{|-MXlUu&Aif5`NL;Ep9AM=2XFW#ZlK3zC zgS2#RSd|}?j2vc06F)m~8HRzhI5%BM41cnMnbAKhog~)G`*6qB1&3>t+Me{ew?h0R5YLTxqtt&fEF?-hcZZ zW%TH~oSGPS=Ki|q8yKchQSf$LThovL7=`>h-xDxVtqtcMrc5(J@qG&i&=Irxq`Fe25 zS6aGSoSGQtx@+5!$_0Z*c6Rf@_bQwu*4KQ;2jQE<{x3-Fcq{e6YYNE2?$ni7CtpOJ2 zrjcYt_=cHTxe!Go5%#_HHc$TbFN6YqF2v$&j9v{zsrsczcs-wvo}eQX%|iS8sE1bc=443t_|$&cW}pM;e=~JBB`Oq zXKO|qp8lb|u54B>44sJo=g69TVDi6bS0pIeC01m-sJq1GV$&{7tknm84btviw*qi- za*DHOlazH`gruENy1GJ35djB`9I`(sE}hl#_FPHVF*6z$XAiARz*Bh{IX_)%<3?{Y zw{&lFU0TeHM!C=o3+c*)JvyFOTSKJkJnyxGDm_ Y0K7sd718{Bp#T5?07*qoM6N<$f)Q;UDgXcg delta 720 zcmaFBbC-33WIZzj1B1(wu46!ou{g-xiDBJ2nU_EgOS+@4BLl<6e(pbstU!K3fKQ0) zo^9*q&z|h&m*^Rm=^a-XmfdJzWnpS!>*(R)=osMQ5!KREo|&0sYvW<0r=hGMD<>lv z93BYNt*Wmpt*Wf8ZK$fMostk55$F==W$S2T=vZ&5Woe?Lqp2bxE&^2d#$MF`NGX&A z`33*S4;W%%q~8M7au#?*7Bet#3xF`=TIIc^K%d<5ba4!^@DB~{ZhEZ1!E*MfhsxSJ zU*-0G`}DtlC-bd$_ns^~)RCg#a-?2U-`lTe<@xxC2A}&Gu{(e4`mk%A^z}KDorRvC z=@fsoS96*W_wtzxcOz~28%fi z^&vK^?DG`9JZrgjn9r&6U~$OS`F;*e|61rzbn0?G>+j%A z`%9+1ivwJ!dwl$}%W#z1|RlTCvX3M#=!ff9LK`oBNwzo~n zaqT>No=yJH-%|W#Qp&f>O)V`go!j?0X2ma>vwOG6uQP#Dt-gxR`Weo#ctO*FDohSfQ{XtE mZ2hq8^QMZ#yzLLoelx7QX`tCvzoQHo{S2P2elF{r5}E+t2|w}x diff --git a/src/main/resources/assets/create/textures/entity/logistics_hat.png b/src/main/resources/assets/create/textures/entity/logistics_hat.png index 34e817fd33a92a6ac40ab8d432a30fc9743fedff..9d3351a16041723503daa6ce767b42329b1eb1d7 100644 GIT binary patch delta 373 zcmV-*0gC?L0)+#R8Gi-<001BJ|6u?C00v@9M??Ss00000`9r&Z00009a7bBm000id z000id0mpBsWB>pF2XskIMF;2!6&3*>q)kV0}HT#h~E&NH#AZ@XssxETdlSz4A?x{F{x&? z*2os=NvYw($!NS%G}l0G|+76-@(OQ%grLA9H(W8F{t%tn_{R_Ged?7c|yix^$_!zyHaTC%13i zF6(IbaCe)za8v7qIfae&U%q^K{P=N4N5}g0>wzZm$xDU-De;mZzu^B^0mCzgXK_F! zoCO|{#Xt>*L74G){)!Z!V1uWNV~9quZ-2PZVFeym)H4smFT1KtGY2=HuD^8cOY^=0x4*wwW9Nk5mpE0K+4zO|tQ6OC UX~E4Cfo@^&boFyt=akR{0B;D9bpQYW diff --git a/src/main/resources/assets/create/textures/gui/frogport.png b/src/main/resources/assets/create/textures/gui/frogport.png index 12687c6f49bab08f30ceb2c5b97ec236de62ba4c..bf3a23f63b870cfe74f47c5848a3b9826a9d251c 100644 GIT binary patch literal 1443 zcmd5+`&ZI;82)?_MR8&mY*=FET)LW}SUPbi7O3O}Fz2O6E0&ioRz{*u^xJY}Omn$X zFqhOU_1L79iOWUm%v@%fb<)az{ ziQ>|OX{d3tb(nQ_oYs+e0E}JeRNt_ae$5ag&?XKCrpw$*?2KoIUHf$4x&xXlx__*` z`ha)SP4R{3QcwTL>7IRArZjSQU`3hi_9rnQF(iHa1%!`{K1TBQzLU zl=)uWh9R@6;z3pMycG1ZAQAv)3yNbFjkPQc?3u=zgcdyipE0O z2@XYj!QE1bKp=49;v8olO9wP(tESazHM7u?9?W1kK0Vjm+$=0Eel~hscHI_TbQ@7K zpoxF5moG7_+~hiP_3K@sTCH|Qulul*3&>V*bbrZ_2mQT*Dv6|JVq&7Rz%n7P***u# zDK)~Cekdq;hYy~qHFr6m+o5Q`)yDPOqWPJIlf=4}(>B%5xHE z&BKUG@$jfWimAld*$3%;QOq99f#hWO@Q4TwpFhOP#)xw`KmbT^eli%M4G#~?x(r+p z9!>@0;Js=Y0b?jAgKWbC0*C~!wt}nilm~n9eet@xg_egWKw6qZUso4Pnd{@}X+4hS z`J7MalwT-)xRJq&VMj%^sy}IJ2wK!{^l*1q4%P84dch)*NGKHIB5meoX|4%DX=~DF zN9m8!7m4;t+9nf-toaJdC%{gEScKretj{)Dmv_YrxkjHcgy!bvqDL0O*zZW*yK#$j zUU_I6QqAoK0hP~>`B8r#9AuC6XjncQkf~vkUe1XVC%$f(sf>^i>j;}|FwAH)Z~_!- z@;&q67==Q?Cvd*`#;c&901KY{tkGy1GBS@IoqT~fnLHN}wk3vVze|d+0=Rpsj*^yF zEirs2L>#LkjJOAx1IbL;`*nEf={N1|?e;|CuOSe8+3IYiSE12!Cj=V&btAlz_Di_@ z_-ZB)=Z(HCTRYAraR@7lXsLeCvvwacgu!SDM`8i))a=WL4GsDQZLI(vfTt<>JjVrb z{&LUQ*jS`=4+@xd%$*C-r`79cR63n5+x3|R6AZ7N+MF^UkjcuAf#58fIJ;E>C<1$C z^=O`psVVskf)p(gnws-9OLsnPL;&9B&d#qV61=xTz!)$A zeDD&ao|-ZQI5KjB>|f38$lZxy-8q?;Kn_c~qpu?a z!^VE@KZ&eBzDIyhi0glb{Xpin(+}$=F0r-oNGonTbm-8kRjXdTdezlTVym8~k_3PJ{ELj3H!TIpK8$e2;B*-rqs1h4s zI4i983aEy&z$3Dlfr0NJ2s7@OnEjT4fjPs|#WAEJ?(MAZyjuYRtlr*oEg!T5{{8pQ z{&3~Sv7HtTYfsNJo@VtVOrUI2;bN`*T6}?t`TVZsKL ztqkoaUq>s%RiC}j^TF${<@kFH`3%WRKe9bg?&Y0P{^4$= zTgdzW?|5g_Z<{$c?(ZiXWwGV!11s~s;c-Z|r>pBH!^xN4sYpI=}1#QUeI z*7}EL4gS-VALlU0KRaO|eW2aa=nz|q?SBsG3E%%5&UbkBnSVdyXVre=)F0Ij&sf{` zv!}!*{NR0Ib-qK;OyT|S2S7djb1jX|v3)pMbmV)3d)|SZo6GJroc`QX@r11e?xu=g zukZ0z{5mcDfHz@{$vuXeBhm{0xP|`2c`8Wgc-k`9`?fx8V_2=8Jh$Tb>|SPr2qE?Z ztb8BVF#g*XDdRttNhivuZ~5%A+x#1MFoxZJyUxAw0Atwh*nXyo%wMzw^c)Jg*D!t2 z6wp2J@qR;b!_~a{wGJB?mjBFV4Ez1pE>+jQr$%sf0(z` XFF*hD(TbbEjL6{W>gTe~DWM4fl?c@1 From f1c12bf6af3d7a7545a4c2bff77841a5ffbb2b38 Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Sun, 22 Sep 2024 13:30:30 -0700 Subject: [PATCH 060/515] Frog shader - Bump flywheel version - Implement FrogportVisual using fancy new instance hiding for the rig/box --- gradle.properties | 2 +- .../simibubi/create/AllBlockEntityTypes.java | 2 + .../logistics/frogport/FrogportVisual.java | 216 ++++++++++++++++++ .../models/block/package_frogport/body.json | 5 +- .../models/block/package_frogport/head.json | 5 +- .../packages/cardboard_10x12_rigging.json | 3 +- .../item/packages/cardboard_10x8_rigging.json | 3 +- .../packages/cardboard_12x10_rigging.json | 3 +- .../packages/cardboard_12x12_rigging.json | 3 +- 9 files changed, 233 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/logistics/frogport/FrogportVisual.java diff --git a/gradle.properties b/gradle.properties index 145e7631bf..d6dcd19647 100644 --- a/gradle.properties +++ b/gradle.properties @@ -23,7 +23,7 @@ use_parchment = true # dependency versions registrate_version = MC1.20-1.3.3 flywheel_minecraft_version = 1.20.1 -flywheel_version = 1.0.0-beta-136 +flywheel_version = 1.0.0-beta-139 jei_minecraft_version = 1.20.1 jei_version = 15.10.0.39 curios_minecraft_version = 1.20.1 diff --git a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java index 7620801861..1738699720 100644 --- a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java +++ b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java @@ -168,6 +168,7 @@ import com.simibubi.create.content.logistics.depot.EjectorRenderer; import com.simibubi.create.content.logistics.depot.EjectorVisual; import com.simibubi.create.content.logistics.frogport.FrogportBlockEntity; import com.simibubi.create.content.logistics.frogport.FrogportRenderer; +import com.simibubi.create.content.logistics.frogport.FrogportVisual; import com.simibubi.create.content.logistics.funnel.FunnelBlockEntity; import com.simibubi.create.content.logistics.funnel.FunnelRenderer; import com.simibubi.create.content.logistics.funnel.FunnelVisual; @@ -490,6 +491,7 @@ public class AllBlockEntityTypes { public static final BlockEntityEntry PACKAGE_FROGPORT = REGISTRATE .blockEntity("package_frogport", FrogportBlockEntity::new) + .visual(() -> FrogportVisual::new, false) .validBlocks(AllBlocks.PACKAGE_FROGPORT) .renderer(() -> FrogportRenderer::new) .register(); diff --git a/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportVisual.java b/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportVisual.java new file mode 100644 index 0000000000..e2a653a8a3 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportVisual.java @@ -0,0 +1,216 @@ +package com.simibubi.create.content.logistics.frogport; + +import java.util.function.Consumer; + +import org.jetbrains.annotations.Nullable; + +import com.simibubi.create.AllPartialModels; + +import dev.engine_room.flywheel.api.instance.Instance; +import dev.engine_room.flywheel.api.visualization.VisualizationContext; +import dev.engine_room.flywheel.lib.instance.InstanceTypes; +import dev.engine_room.flywheel.lib.instance.TransformedInstance; +import dev.engine_room.flywheel.lib.model.Models; +import dev.engine_room.flywheel.lib.visual.AbstractBlockEntityVisual; +import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.registries.ForgeRegistries; + +public class FrogportVisual extends AbstractBlockEntityVisual implements SimpleDynamicVisual { + private final TransformedInstance body; + private final TransformedInstance head; + private final TransformedInstance tongue; + private final TransformedInstance rig; + private final TransformedInstance box; + + public FrogportVisual(VisualizationContext ctx, FrogportBlockEntity blockEntity, float partialTick) { + super(ctx, blockEntity, partialTick); + + body = ctx.instancerProvider() + .instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.FROGPORT_BODY)) + .createInstance(); + + head = ctx.instancerProvider() + .instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.FROGPORT_HEAD)) + .createInstance(); + + tongue = ctx.instancerProvider() + .instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.FROGPORT_TONGUE)) + .createInstance(); + + rig = ctx.instancerProvider() + .instancer(InstanceTypes.TRANSFORMED, Models.block(Blocks.AIR.defaultBlockState())) + .createInstance(); + + box = ctx.instancerProvider() + .instancer(InstanceTypes.TRANSFORMED, Models.block(Blocks.AIR.defaultBlockState())) + .createInstance(); + + rig.handle().setVisible(false); + box.handle().setVisible(false); + + animate(partialTick); + } + + @Override + public void beginFrame(Context ctx) { + animate(ctx.partialTick()); + } + + private void animate(float partialTicks) { + float yaw = blockEntity.getYaw(); + + float headPitch = 80; + float tonguePitch = 0; + float tongueLength = 0; + float headPitchModifier = 1; + + boolean hasTarget = blockEntity.target != null; + boolean animating = blockEntity.isAnimationInProgress(); + boolean depositing = blockEntity.currentlyDepositing; + + Vec3 diff = Vec3.ZERO; + + if (hasTarget) { + diff = blockEntity.target + .getExactTargetLocation(blockEntity, blockEntity.getLevel(), blockEntity.getBlockPos()) + .subtract(0, animating && depositing ? 0 : 0.75, 0) + .subtract(Vec3.atCenterOf(blockEntity.getBlockPos())); + tonguePitch = (float) Mth.atan2(diff.y, diff.multiply(1, 0, 1) + .length() + (3 / 16f)) * Mth.RAD_TO_DEG; + tongueLength = Math.max((float) diff.length(), 1); + headPitch = Mth.clamp(tonguePitch * 2, 60, 100); + } + + if (animating) { + float progress = blockEntity.animationProgress.getValue(partialTicks); + float scale = 1; + float itemDistance = 0; + + if (depositing) { + double modifier = Math.max(0, 1 - Math.pow((progress - 0.25) * 4 - 1, 4)); + itemDistance = + (float) Math.max(tongueLength * Math.min(1, (progress - 0.25) * 3), tongueLength * modifier); + tongueLength *= Math.max(0, 1 - Math.pow((progress * 1.25 - 0.25) * 4 - 1, 4)); + headPitchModifier = (float) Math.max(0, 1 - Math.pow((progress * 1.25) * 2 - 1, 4)); + scale = 0.25f + progress * 3 / 4; + + } else { + tongueLength *= Math.pow(Math.max(0, 1 - progress * 1.25), 5); + headPitchModifier = 1 - (float) Math.min(1, Math.max(0, (Math.pow(progress * 1.5, 2) - 0.5) * 2)); + scale = (float) Math.max(0.5, 1 - progress * 1.25); + itemDistance = tongueLength; + } + + renderPackage(diff, scale, itemDistance); + + } else { + tongueLength = 0; + float anticipation = blockEntity.anticipationProgress.getValue(partialTicks); + headPitchModifier = + anticipation > 0 ? (float) Math.max(0, 1 - Math.pow((anticipation * 1.25) * 2 - 1, 4)) : 0; + } + + headPitch *= headPitchModifier; + + body.setIdentityTransform() + .translate(getVisualPosition()) + .center() + .rotateYDegrees(yaw) + .uncenter() + .setChanged(); + + head.setIdentityTransform() + .translate(getVisualPosition()) + .center() + .rotateYDegrees(yaw) + .uncenter() + .translate(8 / 16f, 10 / 16f, 11 / 16f) + .rotateXDegrees(headPitch) + .translateBack(8 / 16f, 10 / 16f, 11 / 16f) + .setChanged(); + + tongue.setIdentityTransform() + .translate(getVisualPosition()) + .center() + .rotateYDegrees(yaw) + .uncenter() + .translate(8 / 16f, 10 / 16f, 11 / 16f) + .rotateXDegrees(tonguePitch) + .scale(1f, 1f, tongueLength / (7 / 16f)) + .translateBack(8 / 16f, 10 / 16f, 11 / 16f) + .setChanged(); + } + + private void renderPackage(Vec3 diff, float scale, float itemDistance) { + if (blockEntity.animatedPackage == null || scale < 0.45) { + rig.handle() + .setVisible(false); + box.handle() + .setVisible(false); + return; + } + ResourceLocation key = ForgeRegistries.ITEMS.getKey(blockEntity.animatedPackage.getItem()); + if (key == null) { + rig.handle() + .setVisible(false); + box.handle() + .setVisible(false); + return; + } + + boolean animating = blockEntity.isAnimationInProgress(); + boolean depositing = blockEntity.currentlyDepositing; + + instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.PACKAGES.get(key))) + .stealInstance(box); + box.handle().setVisible(true); + + box.setIdentityTransform() + .translate(getVisualPosition()) + .translate(0, 3 / 16f, 0) + .translate(diff.normalize() + .scale(itemDistance) + .subtract(0, animating && depositing ? 0.75 : 0, 0)) + .center() + .scale(scale) + .uncenter() + .setChanged(); + + if (!depositing) { + rig.handle() + .setVisible(false); + return; + } + + instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.PACKAGE_RIGGING.get(key))) + .stealInstance(rig); + rig.handle().setVisible(true); + + rig.pose.set(box.pose); + rig.setChanged(); + } + + @Override + public void collectCrumblingInstances(Consumer<@Nullable Instance> consumer) { + consumer.accept(body); + consumer.accept(head); + } + + @Override + public void updateLight(float partialTick) { + relight(body, head, tongue, rig, box); + } + + @Override + protected void _delete() { + body.delete(); + head.delete(); + tongue.delete(); + rig.delete(); + box.delete(); + } +} diff --git a/src/main/resources/assets/create/models/block/package_frogport/body.json b/src/main/resources/assets/create/models/block/package_frogport/body.json index e56b44ed3c..d2747bc9a4 100644 --- a/src/main/resources/assets/create/models/block/package_frogport/body.json +++ b/src/main/resources/assets/create/models/block/package_frogport/body.json @@ -5,7 +5,8 @@ "1": "create:block/port", "particle": "create:block/port2" }, - "elements": [ + "render_type": "minecraft:cutout", + "elements": [ { "from": [2, 4, 2], "to": [14, 10, 14], @@ -140,4 +141,4 @@ "children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] } ] -} \ No newline at end of file +} diff --git a/src/main/resources/assets/create/models/block/package_frogport/head.json b/src/main/resources/assets/create/models/block/package_frogport/head.json index ae8e9366c4..84981f55ce 100644 --- a/src/main/resources/assets/create/models/block/package_frogport/head.json +++ b/src/main/resources/assets/create/models/block/package_frogport/head.json @@ -5,7 +5,8 @@ "1": "create:block/port", "particle": "create:block/port2" }, - "elements": [ + "render_type": "minecraft:cutout", + "elements": [ { "from": [2, 9, 2], "to": [14, 14, 14], @@ -73,4 +74,4 @@ "children": [0, 1, 2, 3, 4] } ] -} \ No newline at end of file +} diff --git a/src/main/resources/assets/create/models/item/packages/cardboard_10x12_rigging.json b/src/main/resources/assets/create/models/item/packages/cardboard_10x12_rigging.json index bd0436849e..45cda7e6be 100644 --- a/src/main/resources/assets/create/models/item/packages/cardboard_10x12_rigging.json +++ b/src/main/resources/assets/create/models/item/packages/cardboard_10x12_rigging.json @@ -5,6 +5,7 @@ "0": "create:entity/package/cardboard", "particle": "create:entity/package/cardboard_particle" }, + "render_type": "minecraft:cutout", "elements": [ { "name": "rope_1", @@ -121,4 +122,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/src/main/resources/assets/create/models/item/packages/cardboard_10x8_rigging.json b/src/main/resources/assets/create/models/item/packages/cardboard_10x8_rigging.json index d24f5a0904..4e777b6bcf 100644 --- a/src/main/resources/assets/create/models/item/packages/cardboard_10x8_rigging.json +++ b/src/main/resources/assets/create/models/item/packages/cardboard_10x8_rigging.json @@ -5,6 +5,7 @@ "0": "create:entity/package/cardboard", "particle": "create:entity/package/cardboard_particle" }, + "render_type": "minecraft:cutout", "elements": [ { "name": "rope_1", @@ -121,4 +122,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/src/main/resources/assets/create/models/item/packages/cardboard_12x10_rigging.json b/src/main/resources/assets/create/models/item/packages/cardboard_12x10_rigging.json index b62e31d58c..2072e61a06 100644 --- a/src/main/resources/assets/create/models/item/packages/cardboard_12x10_rigging.json +++ b/src/main/resources/assets/create/models/item/packages/cardboard_12x10_rigging.json @@ -5,6 +5,7 @@ "0": "create:entity/package/cardboard", "particle": "create:entity/package/cardboard_particle" }, + "render_type": "minecraft:cutout", "elements": [ { "name": "rope_2", @@ -121,4 +122,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/src/main/resources/assets/create/models/item/packages/cardboard_12x12_rigging.json b/src/main/resources/assets/create/models/item/packages/cardboard_12x12_rigging.json index bb760dfddd..4440967d4f 100644 --- a/src/main/resources/assets/create/models/item/packages/cardboard_12x12_rigging.json +++ b/src/main/resources/assets/create/models/item/packages/cardboard_12x12_rigging.json @@ -5,6 +5,7 @@ "0": "create:entity/package/cardboard", "particle": "create:entity/package/cardboard_particle" }, + "render_type": "minecraft:cutout", "elements": [ { "name": "rope_4", @@ -121,4 +122,4 @@ ] } ] -} \ No newline at end of file +} From 46ad8ebbd59ae16e38996947f137dcb8312cfac0 Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Sun, 22 Sep 2024 14:39:30 -0700 Subject: [PATCH 061/515] Conveyable performance - Make chain conveyor visual render packages and guards - Chain rendering is already pretty efficient - Tick box visuals in the ChainConveyorVisual if flywheel is enabled --- .../ChainConveyorBlockEntity.java | 26 ++- .../chainConveyor/ChainConveyorRenderer.java | 31 +-- .../chainConveyor/ChainConveyorVisual.java | 177 +++++++++++++++++- 3 files changed, 211 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java index 89e552f3db..8f9f422526 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java @@ -23,6 +23,7 @@ import com.simibubi.create.content.logistics.frogport.FrogportBlockEntity; import com.simibubi.create.foundation.utility.ServerSpeedProvider; import com.simibubi.create.infrastructure.config.AllConfigs; +import dev.engine_room.flywheel.api.backend.BackendManager; import net.createmod.catnip.utility.Iterate; import net.createmod.catnip.utility.NBTHelper; import net.createmod.catnip.utility.VecHelper; @@ -134,11 +135,10 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity { prepareStats(); if (level.isClientSide()) { - for (ChainConveyorPackage box : loopingPackages) - tickBoxVisuals(box); - for (Entry> entry : travellingPackages.entrySet()) - for (ChainConveyorPackage box : entry.getValue()) - tickBoxVisuals(box); + // We can use TickableVisuals if flywheel is enabled + if (!BackendManager.isBackendOn()) { + tickBoxVisuals(); + } } if (!level.isClientSide()) { @@ -213,7 +213,7 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity { notifyPortToAnticipate(portEntry.getKey()); continue; } - + if (!exportToPort(box, portEntry.getKey())) continue; @@ -242,7 +242,7 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity { float prevChainPosition = box.chainPosition; box.chainPosition += serverSpeed * degreesPerTick; box.chainPosition = wrapAngle(box.chainPosition); - + float anticipatePosition = box.chainPosition; anticipatePosition += serverSpeed * degreesPerTick * 4; anticipatePosition = wrapAngle(anticipatePosition); @@ -263,7 +263,7 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity { notifyPortToAnticipate(portEntry.getKey()); continue; } - + if (!exportToPort(box, portEntry.getKey())) continue; @@ -295,6 +295,14 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity { updateBoxWorldPositions(); } + public void tickBoxVisuals() { + for (ChainConveyorPackage box : loopingPackages) + tickBoxVisuals(box); + for (Entry> entry : travellingPackages.entrySet()) + for (ChainConveyorPackage box : entry.getValue()) + tickBoxVisuals(box); + } + public boolean loopThresholdCrossed(float chainPosition, float prevChainPosition, float offBranchAngle) { int sign1 = Mth.sign(AngleHelper.getShortestAngleDiff(offBranchAngle, prevChainPosition)); int sign2 = Mth.sign(AngleHelper.getShortestAngleDiff(offBranchAngle, chainPosition)); @@ -396,7 +404,7 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity { ChainConveyorPackagePhysicsData physicsData = box.physicsData(level); physicsData.setBE(this); - + if (!physicsData.shouldTick()) return; diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRenderer.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRenderer.java index 621bec7ec8..45ffcab14d 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRenderer.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRenderer.java @@ -15,6 +15,7 @@ import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorPackage.C import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.foundation.render.RenderTypes; +import dev.engine_room.flywheel.api.backend.BackendManager; import dev.engine_room.flywheel.lib.transform.TransformStack; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; @@ -54,11 +55,13 @@ public class ChainConveyorRenderer extends KineticBlockEntityRenderer> entry : be.travellingPackages.entrySet()) - for (ChainConveyorPackage box : entry.getValue()) + if (!BackendManager.isBackendOn()) { + for (ChainConveyorPackage box : be.loopingPackages) renderBox(be, ms, buffer, overlay, pos, box, partialTicks); + for (Entry> entry : be.travellingPackages.entrySet()) + for (ChainConveyorPackage box : entry.getValue()) + renderBox(be, ms, buffer, overlay, pos, box, partialTicks); + } } private void renderBox(ChainConveyorBlockEntity be, PoseStack ms, MultiBufferSource buffer, int overlay, BlockPos pos, @@ -147,16 +150,18 @@ public class ChainConveyorRenderer extends KineticBlockEntityRenderer { +public class ChainConveyorVisual extends SingleRotatingVisual implements SimpleDynamicVisual, SimpleTickableVisual { + + private final List guards = new ArrayList<>(); + + private final SmartRecycler boxes; + private final SmartRecycler rigging; public ChainConveyorVisual(VisualizationContext context, ChainConveyorBlockEntity blockEntity, float partialTick) { super(context, blockEntity, partialTick); + + setupGuards(); + + boxes = new SmartRecycler<>(key -> instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.PACKAGES.get(key))).createInstance()); + rigging = new SmartRecycler<>(key -> instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.PACKAGE_RIGGING.get(key))).createInstance()); + } + + @Override + public void update(float pt) { + super.update(pt); + + setupGuards(); + } + + @Override + public void tick(TickableVisual.Context context) { + blockEntity.tickBoxVisuals(); + } + + @Override + public void beginFrame(DynamicVisual.Context ctx) { + var partialTicks = ctx.partialTick(); + + boxes.resetCount(); + rigging.resetCount(); + + for (ChainConveyorPackage box : blockEntity.loopingPackages) + setupBoxVisual(blockEntity, box, partialTicks); + + for (Map.Entry> entry : blockEntity.travellingPackages.entrySet()) + for (ChainConveyorPackage box : entry.getValue()) + setupBoxVisual(blockEntity, box, partialTicks); + + boxes.discardExtra(); + rigging.discardExtra(); + } + + + private void setupBoxVisual(ChainConveyorBlockEntity be, ChainConveyorPackage box, float partialTicks) { + if (box.worldPosition == null) + return; + if (box.item == null || box.item.isEmpty()) + return; + + ChainConveyorPackage.ChainConveyorPackagePhysicsData physicsData = box.physicsData(be.getLevel()); + if (physicsData.prevPos == null) + return; + + Vec3 position = physicsData.prevPos.lerp(physicsData.pos, partialTicks); + Vec3 targetPosition = physicsData.prevTargetPos.lerp(physicsData.targetPos, partialTicks); + float yaw = AngleHelper.angleLerp(partialTicks, physicsData.prevYaw, physicsData.yaw); + Vec3 offset = + new Vec3(targetPosition.x - this.pos.getX(), targetPosition.y - this.pos.getY(), targetPosition.z - this.pos.getZ()); + + BlockPos containingPos = BlockPos.containing(position); + Level level = be.getLevel(); + int light = LightTexture.pack(level.getBrightness(LightLayer.BLOCK, containingPos), + level.getBrightness(LightLayer.SKY, containingPos)); + + if (physicsData.modelKey == null) { + ResourceLocation key = ForgeRegistries.ITEMS.getKey(box.item.getItem()); + if (key == null) + return; + physicsData.modelKey = key; + } + + TransformedInstance rigBuffer = rigging.get(physicsData.modelKey); + TransformedInstance boxBuffer = boxes.get(physicsData.modelKey); + + Vec3 dangleDiff = VecHelper.rotate(targetPosition.add(0, 0.5, 0) + .subtract(position), -yaw, Direction.Axis.Y); + float zRot = Mth.wrapDegrees((float) Mth.atan2(-dangleDiff.x, dangleDiff.y) * Mth.RAD_TO_DEG) / 2; + float xRot = Mth.wrapDegrees((float) Mth.atan2(dangleDiff.z, dangleDiff.y) * Mth.RAD_TO_DEG) / 2; + zRot = Mth.clamp(zRot, -25, 25); + xRot = Mth.clamp(xRot, -25, 25); + + for (TransformedInstance buf : new TransformedInstance[] { rigBuffer, boxBuffer }) { + buf.setIdentityTransform(); + buf.translate(getVisualPosition()); + buf.translate(offset); + buf.translate(0, 10 / 16f, 0); + buf.rotateYDegrees(yaw); + + buf.rotateZDegrees(zRot); + buf.rotateXDegrees(xRot); + + if (physicsData.flipped && buf == rigBuffer) + buf.rotateYDegrees(180); + + buf.uncenter(); + buf.translate(0, -PackageItem.getHookDistance(box.item) + 7 / 16f, 0); + + buf.light(light); + + buf.setChanged(); + } + } + + private void deleteGuards() { + for (TransformedInstance guard : guards) { + guard.delete(); + } + guards.clear(); + } + + private void setupGuards() { + deleteGuards(); + + var guardInstancer = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.CHAIN_CONVEYOR_GUARD)); + + for (BlockPos blockPos : blockEntity.connections) { + ChainConveyorBlockEntity.ConnectionStats stats = blockEntity.connectionStats.get(blockPos); + if (stats == null) { + continue; + } + + Vec3 diff = stats.end() + .subtract(stats.start()); + double yaw = Mth.RAD_TO_DEG * Mth.atan2(diff.x, diff.z); + + TransformedInstance guard = guardInstancer.createInstance(); + guard.translate(getVisualPosition()) + .center() + .rotateYDegrees((float) yaw) + .uncenter() + .nudge((int) blockPos.asLong()) + .light(rotatingModel.light) + .setChanged(); + + guards.add(guard); + } } @Override protected Model model() { return Models.partial(AllPartialModels.CHAIN_CONVEYOR_SHAFT); } + + @Override + public void updateLight(float partialTick) { + super.updateLight(partialTick); + for (TransformedInstance guard : guards) { + relight(guard); + } + } + + @Override + protected void _delete() { + super._delete(); + deleteGuards(); + boxes.delete(); + rigging.delete(); + } } From 794ef9440f9d840472441f2eccd7b7ca9667a2a8 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Tue, 24 Sep 2024 12:24:16 +0200 Subject: [PATCH 062/515] Feedback - Fixed train hat offset on wolves - Added indicator for current threshold switch state in UI - Can now open chests under packagers, observers and threshold switches - Fixed train frogports dropping packages into world - Frogport send-only mode looks less technical in UI - Fixed ghost power when removing chains between conveyors - Removed z-fight prevention on chain guards --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 6 ++-- .../499d9d953ee69b539ff4dd4c95a6cbd849f63f67 | 4 +-- .../resources/assets/create/lang/en_ud.json | 2 +- .../resources/assets/create/lang/en_us.json | 2 +- .../assets/minecraft/train_hat_info/wolf.json | 4 +-- .../java/com/simibubi/create/AllBlocks.java | 4 +++ .../ChainConveyorBlockEntity.java | 22 ++++++------ .../chainConveyor/ChainConveyorRenderer.java | 1 - .../chainConveyor/ChainConveyorVisual.java | 1 - .../frogport/FrogportBlockEntity.java | 7 +++- .../logistics/frogport/FrogportScreen.java | 33 ++++++++++++------ .../logistics/frogport/FrogportTarget.java | 9 +++++ .../ThresholdSwitchBlockEntity.java | 1 + .../ThresholdSwitchScreen.java | 4 +++ .../create/foundation/gui/AllGuiTextures.java | 2 ++ .../create/foundation/gui/AllIcons.java | 3 +- .../data/VanillaHatOffsetGenerator.java | 2 +- .../assets/create/lang/default/interface.json | 2 +- .../assets/create/textures/gui/frogport.png | Bin 1443 -> 1226 bytes .../assets/create/textures/gui/icons.png | Bin 3773 -> 3798 bytes .../create/textures/gui/threshold_switch.png | Bin 1482 -> 1555 bytes 21 files changed, 73 insertions(+), 36 deletions(-) diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 7472774bbb..79b68baf48 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-09-20T10:47:27.6079349 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-09-24T11:13:01.231414 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -592,8 +592,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -773a3d7251df0a088d1d7803e52c47d4af012ee9 assets/create/lang/en_ud.json -dbdd1e43e5ce8243cc2f202e69102e21771b6568 assets/create/lang/en_us.json +1890dab48b8c2506d9297e73f7033782935312b5 assets/create/lang/en_ud.json +5dd94319c3448c939943e84fa3c6ba968c5feee7 assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json diff --git a/src/generated/resources/.cache/499d9d953ee69b539ff4dd4c95a6cbd849f63f67 b/src/generated/resources/.cache/499d9d953ee69b539ff4dd4c95a6cbd849f63f67 index 65fda67ddf..38cfcd4145 100644 --- a/src/generated/resources/.cache/499d9d953ee69b539ff4dd4c95a6cbd849f63f67 +++ b/src/generated/resources/.cache/499d9d953ee69b539ff4dd4c95a6cbd849f63f67 @@ -1,4 +1,4 @@ -// 1.20.1 2024-09-02T22:36:27.2891201 Create Train Hat Information +// 1.20.1 2024-09-24T12:18:51.3002838 Create Train Hat Information be16d47aa64e673b1107a36ce06475016e316fca assets/minecraft/train_hat_info/axolotl.json b8ae6d9c8014439f4049622e0d6e79b9d6716260 assets/minecraft/train_hat_info/bat.json 5053a6c9fb412dfac1bf17eb0f57f9fd314198e4 assets/minecraft/train_hat_info/bee.json @@ -47,6 +47,6 @@ e524c61954660d3cb605f01395edb25572b59a1c assets/minecraft/train_hat_info/skeleto b8ae6d9c8014439f4049622e0d6e79b9d6716260 assets/minecraft/train_hat_info/turtle.json 78950a0bb66d28d1939049400a8cfd194f92f906 assets/minecraft/train_hat_info/warden.json 5ed6eccda89a6721f1b70eca7e7869cfc30aa612 assets/minecraft/train_hat_info/wither.json -0ac114bc3a5d0a0ab3153cae258a30fe970d4264 assets/minecraft/train_hat_info/wolf.json +0e92893e2b9d3e6586610e4e13c678e11beb1e64 assets/minecraft/train_hat_info/wolf.json daac75dcadb6e00db5cf1a5b30a450f137da54ae assets/minecraft/train_hat_info/zoglin.json e524c61954660d3cb605f01395edb25572b59a1c assets/minecraft/train_hat_info/zombie_horse.json diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index f1d93662f4..3c9f630631 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -1113,13 +1113,13 @@ "create.gui.goggles.generator_stats": ":sʇɐʇS ɹoʇɐɹǝuǝ⅁", "create.gui.goggles.kinetic_stats": ":sʇɐʇS ɔıʇǝuıʞ", "create.gui.goggles.pole_length": ":ɥʇbuǝꞀ ǝןoԀ", - "create.gui.package_port.accept_nothing": "ǝuou ʇdǝɔɔⱯ /", "create.gui.package_port.catch_packages": "˙˙˙oʇ pǝssǝɹppɐ sǝbɐʞɔɐd ɥɔʇɐƆ", "create.gui.package_port.catch_packages_empty": "pǝssǝɹppɐ-uou ɥɔʇɐɯ oʇ ʎʇdɯǝ ǝʌɐǝꞀ", "create.gui.package_port.catch_packages_wildcard": "pɹɐɔpןıʍ ʇxǝʇ ɐ sɐ * ǝs∩", "create.gui.package_port.eject_to_inventory": "ʎɹoʇuǝʌuI oʇ ʇɔǝظƎ", "create.gui.package_port.not_targeting_anything": "buıɥʇʎuɐ buıʇǝbɹɐʇ ʇou sı ʇɹod ǝbɐʞɔɐԀ", "create.gui.package_port.packages_backed_up": "dn pǝʞɔɐq )s(ǝbɐʞɔɐԀ %1$s", + "create.gui.package_port.send_and_receive": "sǝbɐʞɔɐd ǝʌıǝɔǝɹ puɐ puǝS", "create.gui.package_port.send_only": "sǝbɐʞɔɐd puǝs ʎןuO", "create.gui.schedule.add_condition": "uoıʇıpuoƆ ppⱯ", "create.gui.schedule.add_entry": "uoıʇɔⱯ ppⱯ", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index de64b72f9e..3b4ac82bc3 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1113,13 +1113,13 @@ "create.gui.goggles.generator_stats": "Generator Stats:", "create.gui.goggles.kinetic_stats": "Kinetic Stats:", "create.gui.goggles.pole_length": "Pole Length:", - "create.gui.package_port.accept_nothing": "/ Accept none", "create.gui.package_port.catch_packages": "Catch packages addressed to...", "create.gui.package_port.catch_packages_empty": "Leave empty to match non-addressed", "create.gui.package_port.catch_packages_wildcard": "Use * as a text wildcard", "create.gui.package_port.eject_to_inventory": "Eject to Inventory", "create.gui.package_port.not_targeting_anything": "Package port is not targeting anything", "create.gui.package_port.packages_backed_up": "%1$s Package(s) backed up", + "create.gui.package_port.send_and_receive": "Send and receive packages", "create.gui.package_port.send_only": "Only send packages", "create.gui.schedule.add_condition": "Add Condition", "create.gui.schedule.add_entry": "Add Action", diff --git a/src/generated/resources/assets/minecraft/train_hat_info/wolf.json b/src/generated/resources/assets/minecraft/train_hat_info/wolf.json index 048fa265ea..fb1300073d 100644 --- a/src/generated/resources/assets/minecraft/train_hat_info/wolf.json +++ b/src/generated/resources/assets/minecraft/train_hat_info/wolf.json @@ -1,8 +1,8 @@ { "model_part": "real_head", "offset": [ - 0.5, + 1.0, 2.5, - 0.25 + 1.0 ] } \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 4b68ad49dc..07f04821b5 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -298,6 +298,7 @@ import net.minecraft.world.level.block.IronBarsBlock; import net.minecraft.world.level.block.RotatedPillarBlock; import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockBehaviour.StatePredicate; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.block.state.properties.PistonType; import net.minecraft.world.level.material.MapColor; @@ -1712,6 +1713,7 @@ public class AllBlocks { public static final BlockEntry PACKAGER = REGISTRATE.block("packager", PackagerBlock::new) .initialProperties(SharedProperties::softMetal) .properties(p -> p.noOcclusion()) + .properties(p -> p.isRedstoneConductor(($1, $2, $3) -> false)) .properties(p -> p.mapColor(MapColor.TERRACOTTA_BLUE) .sound(SoundType.NETHERITE_BLOCK)) .transform(pickaxeOnly()) @@ -1843,6 +1845,7 @@ public class AllBlocks { .initialProperties(SharedProperties::stone) .properties(p -> p.mapColor(MapColor.TERRACOTTA_BROWN) .noOcclusion()) + .properties(p -> p.isRedstoneConductor(($1, $2, $3) -> false)) .transform(axeOrPickaxe()) .blockstate(new SmartObserverGenerator()::generate) .onRegister(assignDataBehaviour(new ItemCountDisplaySource(), "count_items")) @@ -1859,6 +1862,7 @@ public class AllBlocks { .initialProperties(SharedProperties::stone) .properties(p -> p.mapColor(MapColor.TERRACOTTA_BROWN) .noOcclusion()) + .properties(p -> p.isRedstoneConductor(($1, $2, $3) -> false)) .transform(axeOrPickaxe()) .blockstate(new ThresholdSwitchGenerator()::generate) .onRegister(assignDataBehaviour(new FillLevelDisplaySource(), "fill_level")) diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java index 8f9f422526..acf353c483 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java @@ -489,21 +489,21 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity { public boolean removeConnectionTo(BlockPos target) { BlockPos localTarget = target.subtract(worldPosition); - boolean removed = connections.remove(localTarget); - if (removed) { - connectionStats.remove(localTarget); - List packages = travellingPackages.remove(localTarget); - if (packages != null) - for (ChainConveyorPackage box : packages) - drop(box); - notifyUpdate(); - updateChainShapes(); - } + if (!connections.contains(localTarget)) + return false; detachKinetics(); + connections.remove(localTarget); + connectionStats.remove(localTarget); + List packages = travellingPackages.remove(localTarget); + if (packages != null) + for (ChainConveyorPackage box : packages) + drop(box); + notifyUpdate(); + updateChainShapes(); updateSpeed = true; - return removed; + return true; } private void updateChainShapes() { diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRenderer.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRenderer.java index 45ffcab14d..c8036e9d8b 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRenderer.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRenderer.java @@ -158,7 +158,6 @@ public class ChainConveyorRenderer extends KineticBlockEntityRenderer 0.5 && animatedPackage != null) { - if (target == null || !target.export(level, worldPosition, animatedPackage, false)) + if (target == null + || !target.depositImmediately() && !target.export(level, worldPosition, animatedPackage, false)) drop(animatedPackage); animatedPackage = null; } @@ -182,6 +183,10 @@ public class FrogportBlockEntity extends SmartBlockEntity { if (!(box.getItem() instanceof PackageItem)) return; + if (deposit && (target == null + || target.depositImmediately() && !target.export(level, worldPosition, box.copy(), false))) + return; + animationProgress.startWithValue(0); animationProgress.chase(1, 0.1, Chaser.LINEAR); animatedPackage = box; diff --git a/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportScreen.java b/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportScreen.java index f70647447e..3195980f3e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportScreen.java @@ -28,6 +28,7 @@ public class FrogportScreen extends AbstractSimiScreen { private EditBox addressBox; private IconButton confirmButton; private IconButton dontAcceptPackages; + private IconButton acceptPackages; private IconButton dumpPackagesButton; public FrogportScreen(FrogportBlockEntity be) { @@ -52,9 +53,9 @@ public class FrogportScreen extends AbstractSimiScreen { addressBox.setBordered(false); addressBox.setTextColor(0xffffff); addressBox.setValue(blockEntity.addressFilter); + if (!blockEntity.acceptsPackages) - addressBox.setValue(CreateLang.translate("gui.package_port.accept_nothing") - .string()); + addressBox.visible = false; addRenderableWidget(addressBox); @@ -70,11 +71,23 @@ public class FrogportScreen extends AbstractSimiScreen { dumpPackagesButton.setToolTip(CreateLang.translateDirect("gui.package_port.eject_to_inventory")); addRenderableWidget(dumpPackagesButton); - dontAcceptPackages = new IconButton(x + 15, y + background.getHeight() - 44, AllIcons.I_SEND_ONLY); - dontAcceptPackages.withCallback(() -> { - addressBox.setValue(CreateLang.translate("gui.package_port.accept_nothing") - .string()); + acceptPackages = new IconButton(x + 15, y + background.getHeight() - 44, AllIcons.I_SEND_AND_RECEIVE); + acceptPackages.withCallback(() -> { + addressBox.visible = true; + acceptPackages.active = false; + dontAcceptPackages.active = true; }); + acceptPackages.active = !blockEntity.acceptsPackages; + acceptPackages.setToolTip(CreateLang.translateDirect("gui.package_port.send_and_receive")); + addRenderableWidget(acceptPackages); + + dontAcceptPackages = new IconButton(x + 15 + 18, y + background.getHeight() - 44, AllIcons.I_SEND_ONLY); + dontAcceptPackages.withCallback(() -> { + addressBox.visible = false; + acceptPackages.active = true; + dontAcceptPackages.active = false; + }); + dontAcceptPackages.active = blockEntity.acceptsPackages; dontAcceptPackages.setToolTip(CreateLang.translateDirect("gui.package_port.send_only")); addRenderableWidget(dontAcceptPackages); @@ -91,15 +104,12 @@ public class FrogportScreen extends AbstractSimiScreen { } private boolean sendOnly() { - return CreateLang.translate("gui.package_port.accept_nothing") - .string() - .equals(addressBox.getValue()); + return !addressBox.visible; } @Override public void tick() { super.tick(); - dontAcceptPackages.active = !sendOnly(); if (dumpPackagesButton.visible != (getPackageCount() != 0)) { dumpPackagesButton.visible = !dumpPackagesButton.active; dumpPackagesButton.getToolTip() @@ -125,6 +135,9 @@ public class FrogportScreen extends AbstractSimiScreen { graphics.renderItem(renderedPackage, x + 16, y + 23); + if (!addressBox.visible) + AllGuiTextures.FROGPORT_INACTIVE_ADDRESS.render(graphics, x + 35, y + 22); + if (getPackageCount() > 0) { AllGuiTextures.FROGPORT_SLOT.render(graphics, x + 136, y + background.getHeight() - 44); graphics.renderItem(renderedPackage, x + 137, y + background.getHeight() - 44); diff --git a/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportTarget.java b/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportTarget.java index 577f7fd303..ec2b25be25 100644 --- a/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportTarget.java +++ b/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportTarget.java @@ -45,6 +45,10 @@ public abstract class FrogportTarget { public abstract Vec3 getExactTargetLocation(FrogportBlockEntity ppbe, LevelAccessor level, BlockPos portPos); + public boolean depositImmediately() { + return false; + } + public CompoundTag write() { CompoundTag compoundTag = new CompoundTag(); writeInternal(compoundTag); @@ -241,6 +245,11 @@ public abstract class FrogportTarget { if (be(level, portPos) instanceof StationBlockEntity sbe) sbe.removePackagePort(ppbe); } + + @Override + public boolean depositImmediately() { + return true; + } @Override protected void writeInternal(CompoundTag tag) {} diff --git a/src/main/java/com/simibubi/create/content/redstone/thresholdSwitch/ThresholdSwitchBlockEntity.java b/src/main/java/com/simibubi/create/content/redstone/thresholdSwitch/ThresholdSwitchBlockEntity.java index 3dfe2f9e1a..7fd6f7e0b5 100644 --- a/src/main/java/com/simibubi/create/content/redstone/thresholdSwitch/ThresholdSwitchBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/redstone/thresholdSwitch/ThresholdSwitchBlockEntity.java @@ -330,6 +330,7 @@ public class ThresholdSwitchBlockEntity extends SmartBlockEntity { public void updatePowerAfterDelay() { poweredAfterDelay = shouldBePowered(); level.blockUpdated(worldPosition, getBlockState().getBlock()); + sendData(); } public boolean isPowered() { diff --git a/src/main/java/com/simibubi/create/content/redstone/thresholdSwitch/ThresholdSwitchScreen.java b/src/main/java/com/simibubi/create/content/redstone/thresholdSwitch/ThresholdSwitchScreen.java index b58756df32..ae4c775384 100644 --- a/src/main/java/com/simibubi/create/content/redstone/thresholdSwitch/ThresholdSwitchScreen.java +++ b/src/main/java/com/simibubi/create/content/redstone/thresholdSwitch/ThresholdSwitchScreen.java @@ -189,6 +189,10 @@ public class ThresholdSwitchScreen extends AbstractSimiScreen { int torchX = x + 23; int torchY = y + 24; + boolean highlightTopRow = blockEntity.isInverted() ^ blockEntity.isPowered(); + AllGuiTextures.THRESHOLD_SWITCH_CURRENT_STATE.render(graphics, torchX - 3, + torchY - 4 + (highlightTopRow ? 0 : 24)); + PoseStack ms = graphics.pose(); ms.pushPose(); ms.translate(torchX - 5, torchY + 14, 200); diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java index 95d096bef5..8bb1199b2c 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java @@ -43,6 +43,7 @@ public enum AllGuiTextures implements ScreenElement, TextureSheetSegment { THRESHOLD_SWITCH("threshold_switch", 182, 103), THRESHOLD_SWITCH_ITEMCOUNT_INPUTS("threshold_switch", 0, 105, 115, 22), THRESHOLD_SWITCH_MISC_INPUTS("threshold_switch", 0, 129, 115, 22), + THRESHOLD_SWITCH_CURRENT_STATE("threshold_switch", 0, 153, 24, 24), FILTER("filters", 214, 99), ATTRIBUTE_FILTER("filters", 0, 99, 241, 85), @@ -50,6 +51,7 @@ public enum AllGuiTextures implements ScreenElement, TextureSheetSegment { FROGPORT("frogport", 0, 0, 238, 99), FROGPORT_SLOT("frogport", 25, 33, 18, 18), + FROGPORT_INACTIVE_ADDRESS("frogport", 45, 102, 162, 20), TOOLBOX("toolbox", 188, 171), TOOLBELT_SLOT("minecraft", "widgets", 24, 23, 22, 22), diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java b/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java index 140b5dfff1..c74bc4df70 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java @@ -163,7 +163,8 @@ public class AllIcons implements ScreenElement { I_FX_BLEND = next(), I_FX_BLEND_OFF = next(), - I_SEND_ONLY = newRow(); + I_SEND_ONLY = newRow(), + I_SEND_AND_RECEIVE = next(); ; public AllIcons(int x, int y) { diff --git a/src/main/java/com/simibubi/create/infrastructure/data/VanillaHatOffsetGenerator.java b/src/main/java/com/simibubi/create/infrastructure/data/VanillaHatOffsetGenerator.java index 9b5eb039c5..40145ed625 100644 --- a/src/main/java/com/simibubi/create/infrastructure/data/VanillaHatOffsetGenerator.java +++ b/src/main/java/com/simibubi/create/infrastructure/data/VanillaHatOffsetGenerator.java @@ -61,7 +61,7 @@ public class VanillaHatOffsetGenerator extends TrainHatInfoProvider { this.makeInfoFor(EntityType.TURTLE, new Vec3(0.0F, 3.0F, 0.0F)); this.makeInfoFor(EntityType.WARDEN, new Vec3(0.0F, 3.5F, 0.5F), "bone/body/head", 0.5F); this.makeInfoFor(EntityType.WITHER, new Vec3(0.0F, 3.0F, 0.0F), "center_head"); - this.makeInfoFor(EntityType.WOLF, new Vec3(0.5F, 2.5F, 0.25F), "real_head"); + this.makeInfoFor(EntityType.WOLF, new Vec3(1.0F, 2.5F, 1.0F), "real_head"); this.makeInfoFor(EntityType.ZOGLIN, new Vec3(0.0F, 0.0F, -4.5F), 0.5F); this.makeInfoFor(EntityType.ZOMBIE_HORSE, new Vec3(0.0F, 0.0F, 2.0F)); } diff --git a/src/main/resources/assets/create/lang/default/interface.json b/src/main/resources/assets/create/lang/default/interface.json index 57cf764e06..42af3f2b8b 100644 --- a/src/main/resources/assets/create/lang/default/interface.json +++ b/src/main/resources/assets/create/lang/default/interface.json @@ -464,10 +464,10 @@ "create.gui.filter.ignore_data": "Ignore Data", "create.gui.filter.ignore_data.description": "Items match regardless of their attributes.", - "create.gui.package_port.accept_nothing": "/ Accept none", "create.gui.package_port.packages_backed_up": "%1$s Package(s) backed up", "create.gui.package_port.eject_to_inventory": "Eject to Inventory", "create.gui.package_port.send_only": "Only send packages", + "create.gui.package_port.send_and_receive": "Send and receive packages", "create.gui.package_port.catch_packages": "Catch packages addressed to...", "create.gui.package_port.catch_packages_wildcard": "Use * as a text wildcard", "create.gui.package_port.catch_packages_empty": "Leave empty to match non-addressed", diff --git a/src/main/resources/assets/create/textures/gui/frogport.png b/src/main/resources/assets/create/textures/gui/frogport.png index bf3a23f63b870cfe74f47c5848a3b9826a9d251c..3d26b008f4190aa8e74487c3de4b5375ef532f80 100644 GIT binary patch literal 1226 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 diff --git a/src/main/resources/assets/create/textures/gui/threshold_switch.png b/src/main/resources/assets/create/textures/gui/threshold_switch.png index ef1411b76a36bed65ae31a53fd94c0a2fb98eeff..62b6b47b9324d42b21d7ae65dd8650dd459a66ac 100644 GIT binary patch delta 1359 zcmb_a{a2EA6#sr7eaes=iJ+}Fw3;ZCRA!knNs%m<#VN@2q*SCeo!ZJu*L)t!)Qpu_ zTg!=2ZR%NyW~Nq5aMrN0M4giw6&($&Oi5Il`7-R(AFy+F&;8+^&*#2<&b@c-PZM+7 zv3dX;>S3)k?ll1D?6ut0n-4|3mK{Ivh(!u+kGZfXqABm%^9j|}h`BtSn?`u;p;_TT zq^a}o>2$(bXGV(Z7|F%ubsM_VJYT9>I$Jwp4j&wO;NiQD&9pnlcjrD1@b_PwaX%Ab zz0BAMP^%lpe#%1V_$2V-w(Xb_GspW_T#^H;@cUmk@?pUKefn1oW#*w|B71n(Y<=a~ zmaB_v0@=puo4l$TYf;JR)RF6?!lhk_w*C_%ze$D*Lh%|&QKS!ivNS)T6bQi-nWKV`;_Y8@j2Hb2H=w^K+YgJsK}_oN!(^gu~W}&aO&z3Hjom39H49NxQQzuB z4s&K6nllhH?*L-bqJMAYfUvYdG4o_c4ZQm~5gsbl9H>(&i&s=EfLRvHsjey1g$C0b zsa{=aD`r&ym`c{!ha}3Y0l7D3ya<%HnckfHi?a**_yuUBz#=(;H*|N$uCrN=Dx(He z9%^=jbFPjffZvYCtaq_XI*!esU_edhUN*w>O+`jx2W3B0{j-7((@vfhs0Rzp7TX06 zRKq;&PP(C2(`p|g!|owfa27EZ-Z3Xe;8SgXZpOAEOS@Eb=sTdIYM*tzLidXe)7@`) z>9S;aQtZjma?~3qlQKX29DS(!)RP;FGnfb!<;ij}V&Zis9q^evFz(t#+!1wY?}>PO z23VH9>4gO73+p2rkfh#aQW*vJYg^(K_ldiqpIHF(=NwRPCJ0_N!yOzfn!iommlWTE zQ(1mz>Ci|k4z}?$UX_px4g;Th%Z=Uhw!q=tirWNTAM5uQx5|)ADq3Ki72e?~--n%x zqbZO_P3NPJ>Swe%_YpRMoc(TLpzn*~?Xc6gzI+K{tmCyQ@Q1gQyiV#vDi7a1xvrDk zOUHe#SyZ{G6cp4pH>Da;w>>EvNPd^C=T#sH(y#bo>Kr3_F}zL5AzsdR&fc-!jPR>c zd9;`)TBhK>J@-mcO8QDn=o+S;m?&=cC^JMQv`vXM~JSj|GXK`?s!KL`<^4|ZRo%$Cw#m;2s(*;j)aU#ykYu0;pqjmw+&zB+4k5B zB@9jmy+Hw`pT$w^Ml145zY`g<+QrjI6U*s`*YrpcItEfKA!O1@SGQ0O;3G%u9FuGY z%jbqkXgS9a((OR&{0o44Wh1y4{$4gtrxG|$_UQjbhy2Ix&ycWU%)}qnyr_LJ2CTL= LIEyFtbGLlI+JmU>ziJ)0cHqGEggf__gsx?f<4n3IyM`gm z0nBY^6jmy%pB%Q8i4ADwmRX_-o35^5nAj_Nfa}15;!m!u3HAHS9f3-LqU*RncnExc z_aL7Usu?I!5ZmyYDMtJSXUF`DOF}_vz#=os+51@{8G$Ar<605P7$d$z4eZy36JeW~ zT+ARod;C~=dE+#u zxO1QX2RT%@=_qV&T*kEP=Wc%|e~0=R7SHMx9~4;VxF5JGqs(~Mc$c65y`SAH8Y=pp z_cy$@J!>yCq4M9_@+QGrMs@pneh%+`dW$9S{wSEkk}`jP2BV|5qIoXXZooV@7+(*_}nX}!V?w}mT2br|;7x^4Q(RFH1-F7*=! z(?35YjstT)1~eovYFwJg!nng&?k&@{-_0(}VF#Y-7My9>2Gje)bO~3`Sh=PjvG6DOecgf8a+S1-cgR@CO3bpCWEWh zBn5`@W6BW+zRr5^-GVVVK6#>cf|2I>jV->X4sizXvMOA4V*J(=8&Y{lE%hPmgCn(x z(>Ci(=y;;+D6?i-E7K1_j@eUOZ5g?v#66NcUo&ayWW_3Us;=c$QT*EDaB7zWS2ska zo+(o&BUV9Bjw{&V#uA+$f*Yn!DgL8*LNuUzgJ+}# Date: Tue, 24 Sep 2024 21:16:54 +0200 Subject: [PATCH 063/515] Hatch me if you can - Added the Item Hatch - Tweaked frogport address bar --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 11 +- .../c24b4d2b8d15abff51c78bd94f4403d9eae6c139 | 4 +- .../assets/create/blockstates/item_hatch.json | 34 ++++ .../resources/assets/create/lang/en_ud.json | 2 + .../resources/assets/create/lang/en_us.json | 2 + .../assets/create/models/item/item_hatch.json | 3 + .../resources/assets/create/sounds.json | 17 ++ .../create/loot_tables/blocks/item_hatch.json | 21 +++ .../tags/blocks/mineable/pickaxe.json | 1 + .../simibubi/create/AllBlockEntityTypes.java | 7 + .../java/com/simibubi/create/AllBlocks.java | 14 +- .../java/com/simibubi/create/AllShapes.java | 7 +- .../com/simibubi/create/AllSoundEvents.java | 6 + .../logistics/itemHatch/HatchFilterSlot.java | 42 +++++ .../logistics/itemHatch/ItemHatchBlock.java | 153 ++++++++++++++++++ .../itemHatch/ItemHatchBlockEntity.java | 26 +++ .../models/block/item_hatch/block_closed.json | 81 ++++++++++ .../models/block/item_hatch/block_open.json | 8 + .../assets/create/textures/block/hatch.png | Bin 0 -> 1154 bytes .../create/textures/block/hatch_closed.png | Bin 0 -> 441 bytes .../create/textures/block/hatch_open.png | Bin 0 -> 308 bytes .../assets/create/textures/gui/frogport.png | Bin 1226 -> 1227 bytes 22 files changed, 431 insertions(+), 8 deletions(-) create mode 100644 src/generated/resources/assets/create/blockstates/item_hatch.json create mode 100644 src/generated/resources/assets/create/models/item/item_hatch.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/item_hatch.json create mode 100644 src/main/java/com/simibubi/create/content/logistics/itemHatch/HatchFilterSlot.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/itemHatch/ItemHatchBlock.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/itemHatch/ItemHatchBlockEntity.java create mode 100644 src/main/resources/assets/create/models/block/item_hatch/block_closed.json create mode 100644 src/main/resources/assets/create/models/block/item_hatch/block_open.json create mode 100644 src/main/resources/assets/create/textures/block/hatch.png create mode 100644 src/main/resources/assets/create/textures/block/hatch_closed.png create mode 100644 src/main/resources/assets/create/textures/block/hatch_open.png diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 79b68baf48..cb7ce133f6 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-09-24T11:13:01.231414 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-09-24T21:07:12.9308328 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -262,6 +262,7 @@ bffc2169f5fc3a8e22f8952a90767e0bb8d726b5 assets/create/blockstates/horizontal_fr 8ae52808eba950c36b75d62113e9cea9441a1a54 assets/create/blockstates/hose_pulley.json 87fa830c5d3541d096fab32d430c54516c197583 assets/create/blockstates/industrial_iron_block.json 2788ad2d29996076f7f18ab8d47e40c1ad10b348 assets/create/blockstates/item_drain.json +e840d746532f350ee2977c00036163f73c3f4147 assets/create/blockstates/item_hatch.json 3e99569e978c0fe17ec18b97881434a9da1a8421 assets/create/blockstates/item_vault.json 8680e9d2a94231f4bbad87b26ab2efdb714903d3 assets/create/blockstates/jungle_window.json ddcf1010e43c5d4a8c93aad37cc97a94343fd9f5 assets/create/blockstates/jungle_window_pane.json @@ -592,8 +593,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -1890dab48b8c2506d9297e73f7033782935312b5 assets/create/lang/en_ud.json -5dd94319c3448c939943e84fa3c6ba968c5feee7 assets/create/lang/en_us.json +6b33da4cc5f2c69c547e9ab578561a3acdb4d531 assets/create/lang/en_ud.json +53af792aff5d9618bdd9691d3727dc19fc4bab9f assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -1976,6 +1977,7 @@ ae5c5925ecf775a4f5c3dc3c79d9766d7dd34ab6 assets/create/models/item/incomplete_tr 43173d18384817288a9ba687da77a4fab31b1957 assets/create/models/item/industrial_iron_block.json c6e3e4ca8b3dfdaaa943faa3dc89c0b2e6f2b5c4 assets/create/models/item/iron_sheet.json d1fbf1be53208c3ab5384dfd6be4d980c858941c assets/create/models/item/item_drain.json +5adda29ca25d00eb41884d0b7ad4a471e250ae10 assets/create/models/item/item_hatch.json 908dd0a4eafd868d280e25cfb7721f20b649560f assets/create/models/item/item_vault.json 5fba1fa33e360c2744ec74d7ccb63f9baa295546 assets/create/models/item/jungle_window.json b3a0c9664465f49a2f53e4ded6c29710a357e6ca assets/create/models/item/jungle_window_pane.json @@ -3226,6 +3228,7 @@ a206598562bcbc9e3bc10dbe12fb22974ee58fcc data/create/loot_tables/blocks/horizont e65fae1b9b72cf2208696463fa20a82a4d64fb62 data/create/loot_tables/blocks/hose_pulley.json 34c239150baa92e03ca89430148560e1b7a1f02d data/create/loot_tables/blocks/industrial_iron_block.json c22dea1941471be65c811cdc2ce7b77d2247e9e1 data/create/loot_tables/blocks/item_drain.json +528078b0cf042236d2cb0701fb55f41f54aa932b data/create/loot_tables/blocks/item_hatch.json 72b5a7288f7f54694df5f456e4ab4433bd38dfff data/create/loot_tables/blocks/item_vault.json 13bd1033991eb65354a9b9406fe638c357fea409 data/create/loot_tables/blocks/jungle_window.json fe9c2629eb30393d2ae5a1f252b9732506ef9bef data/create/loot_tables/blocks/jungle_window_pane.json @@ -4327,7 +4330,7 @@ c741ba83b562ae3459d7c4f2db69537f549ea411 data/forge/tags/items/tools/wrench.json e3321ff14704c031a2c16953b7e391f4f24dd70b data/minecraft/tags/blocks/impermeable.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/lush_ground_replaceable.json cb2f3843d82d0d56ecdb5333cf02fc1ea59b3792 data/minecraft/tags/blocks/mineable/axe.json -e6871c129f1649792733aca364cf0a6c18104787 data/minecraft/tags/blocks/mineable/pickaxe.json +1f8802b85d179bbd7f74ec37c6ffceb59eb4856c data/minecraft/tags/blocks/mineable/pickaxe.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/moss_replaceable.json 0c13aae0eeb99e89febe8dbe5e002af2ff843a9e data/minecraft/tags/blocks/needs_iron_tool.json 3cb2a92cbdf32ed5978f740dc378d363306c3e84 data/minecraft/tags/blocks/needs_stone_tool.json diff --git a/src/generated/resources/.cache/c24b4d2b8d15abff51c78bd94f4403d9eae6c139 b/src/generated/resources/.cache/c24b4d2b8d15abff51c78bd94f4403d9eae6c139 index ac707e4715..a0253385ec 100644 --- a/src/generated/resources/.cache/c24b4d2b8d15abff51c78bd94f4403d9eae6c139 +++ b/src/generated/resources/.cache/c24b4d2b8d15abff51c78bd94f4403d9eae6c139 @@ -1,2 +1,2 @@ -// 1.20.1 2024-09-02T22:36:27.3041196 Create's Custom Sounds -bcfd9320f8ed54f3282b1757a41da0d1753e1754 assets/create/sounds.json +// 1.20.1 2024-09-24T21:07:12.9288376 Create's Custom Sounds +c8f92cda61fef77efb6ce0b61770368e8c074444 assets/create/sounds.json diff --git a/src/generated/resources/assets/create/blockstates/item_hatch.json b/src/generated/resources/assets/create/blockstates/item_hatch.json new file mode 100644 index 0000000000..5c806a8a23 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/item_hatch.json @@ -0,0 +1,34 @@ +{ + "variants": { + "facing=east,open=false": { + "model": "create:block/item_hatch/block_closed", + "y": 90 + }, + "facing=east,open=true": { + "model": "create:block/item_hatch/block_open", + "y": 90 + }, + "facing=north,open=false": { + "model": "create:block/item_hatch/block_closed" + }, + "facing=north,open=true": { + "model": "create:block/item_hatch/block_open" + }, + "facing=south,open=false": { + "model": "create:block/item_hatch/block_closed", + "y": 180 + }, + "facing=south,open=true": { + "model": "create:block/item_hatch/block_open", + "y": 180 + }, + "facing=west,open=false": { + "model": "create:block/item_hatch/block_closed", + "y": 270 + }, + "facing=west,open=true": { + "model": "create:block/item_hatch/block_open", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 3c9f630631..6136cab2e7 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -474,6 +474,7 @@ "block.create.hose_pulley": "ʎǝןןnԀ ǝsoH", "block.create.industrial_iron_block": "uoɹI ןɐıɹʇsnpuI ɟo ʞɔoןᗺ", "block.create.item_drain": "uıɐɹᗡ ɯǝʇI", + "block.create.item_hatch": "ɥɔʇɐH ɯǝʇI", "block.create.item_vault": "ʇןnɐΛ ɯǝʇI", "block.create.jungle_window": "ʍopuıM ǝןbunſ", "block.create.jungle_window_pane": "ǝuɐԀ ʍopuıM ǝןbunſ", @@ -2537,6 +2538,7 @@ "create.subtitle.fwoomp": "sdɯooʍɟ ɹǝɥɔunɐꞀ oʇɐʇoԀ", "create.subtitle.haunted_bell_convert": "suǝʞɐʍɐ ןןǝᗺ pǝʇunɐH", "create.subtitle.haunted_bell_use": "sןןoʇ ןןǝᗺ pǝʇunɐH", + "create.subtitle.item_hatch": "suǝdo ɥɔʇɐH ɯǝʇI", "create.subtitle.mechanical_press_activation": "sbuɐןɔ ssǝɹԀ ןɐɔıuɐɥɔǝW", "create.subtitle.mechanical_press_activation_belt": "sʞuoq ssǝɹԀ ןɐɔıuɐɥɔǝW", "create.subtitle.mixing": "sǝsıou buıxıW", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 3b4ac82bc3..1ebbb0111b 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -474,6 +474,7 @@ "block.create.hose_pulley": "Hose Pulley", "block.create.industrial_iron_block": "Block of Industrial Iron", "block.create.item_drain": "Item Drain", + "block.create.item_hatch": "Item Hatch", "block.create.item_vault": "Item Vault", "block.create.jungle_window": "Jungle Window", "block.create.jungle_window_pane": "Jungle Window Pane", @@ -2537,6 +2538,7 @@ "create.subtitle.fwoomp": "Potato Launcher fwoomps", "create.subtitle.haunted_bell_convert": "Haunted Bell awakens", "create.subtitle.haunted_bell_use": "Haunted Bell tolls", + "create.subtitle.item_hatch": "Item Hatch opens", "create.subtitle.mechanical_press_activation": "Mechanical Press clangs", "create.subtitle.mechanical_press_activation_belt": "Mechanical Press bonks", "create.subtitle.mixing": "Mixing noises", diff --git a/src/generated/resources/assets/create/models/item/item_hatch.json b/src/generated/resources/assets/create/models/item/item_hatch.json new file mode 100644 index 0000000000..4c509189fb --- /dev/null +++ b/src/generated/resources/assets/create/models/item/item_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/item_hatch/block_closed" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/sounds.json b/src/generated/resources/assets/create/sounds.json index dc904af682..32751d9ca5 100644 --- a/src/generated/resources/assets/create/sounds.json +++ b/src/generated/resources/assets/create/sounds.json @@ -251,6 +251,23 @@ ], "subtitle": "create.subtitle.haunted_bell_use" }, + "item_hatch": { + "sounds": [ + { + "type": "event", + "name": "minecraft:block.barrel.open" + } + ], + "subtitle": "create.subtitle.item_hatch" + }, + "item_hatch_compounded_1": { + "sounds": [ + { + "type": "event", + "name": "minecraft:block.netherite_block.place" + } + ] + }, "mechanical_press_activation": { "sounds": [ { diff --git a/src/generated/resources/data/create/loot_tables/blocks/item_hatch.json b/src/generated/resources/data/create/loot_tables/blocks/item_hatch.json new file mode 100644 index 0000000000..604fbaf760 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/item_hatch.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:item_hatch" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/item_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json index 8182be960e..32832091d9 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json @@ -122,6 +122,7 @@ "create:large_bogey", "create:controls", "create:item_vault", + "create:item_hatch", "create:packager", "create:package_frogport", "create:packager_link", diff --git a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java index 1738699720..7079549702 100644 --- a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java +++ b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java @@ -172,6 +172,7 @@ import com.simibubi.create.content.logistics.frogport.FrogportVisual; import com.simibubi.create.content.logistics.funnel.FunnelBlockEntity; import com.simibubi.create.content.logistics.funnel.FunnelRenderer; import com.simibubi.create.content.logistics.funnel.FunnelVisual; +import com.simibubi.create.content.logistics.itemHatch.ItemHatchBlockEntity; import com.simibubi.create.content.logistics.packager.PackagerBlockEntity; import com.simibubi.create.content.logistics.packager.PackagerRenderer; import com.simibubi.create.content.logistics.packagerLink.PackagerLinkBlockEntity; @@ -482,6 +483,12 @@ public class AllBlockEntityTypes { .blockEntity("item_vault", ItemVaultBlockEntity::new) .validBlocks(AllBlocks.ITEM_VAULT) .register(); + + public static final BlockEntityEntry ITEM_HATCH = REGISTRATE + .blockEntity("item_hatch", ItemHatchBlockEntity::new) + .validBlocks(AllBlocks.ITEM_HATCH) + .renderer(() -> SmartBlockEntityRenderer::new) + .register(); public static final BlockEntityEntry PACKAGER = REGISTRATE .blockEntity("packager", PackagerBlockEntity::new) diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 07f04821b5..12363256a5 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -175,6 +175,7 @@ import com.simibubi.create.content.logistics.funnel.BrassFunnelBlock; import com.simibubi.create.content.logistics.funnel.FunnelGenerator; import com.simibubi.create.content.logistics.funnel.FunnelItem; import com.simibubi.create.content.logistics.funnel.FunnelMovementBehaviour; +import com.simibubi.create.content.logistics.itemHatch.ItemHatchBlock; import com.simibubi.create.content.logistics.packager.PackagerBlock; import com.simibubi.create.content.logistics.packager.PackagerGenerator; import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedBlockItem; @@ -298,7 +299,6 @@ import net.minecraft.world.level.block.IronBarsBlock; import net.minecraft.world.level.block.RotatedPillarBlock; import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.state.BlockBehaviour; -import net.minecraft.world.level.block.state.BlockBehaviour.StatePredicate; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.block.state.properties.PistonType; import net.minecraft.world.level.material.MapColor; @@ -1710,6 +1710,18 @@ public class AllBlocks { .build() .register(); + public static final BlockEntry ITEM_HATCH = REGISTRATE.block("item_hatch", ItemHatchBlock::new) + .initialProperties(SharedProperties::softMetal) + .properties(p -> p.mapColor(MapColor.TERRACOTTA_BLUE) + .sound(SoundType.NETHERITE_BLOCK)) + .transform(pickaxeOnly()) + .addLayer(() -> RenderType::cutoutMipped) + .blockstate((c, p) -> p.horizontalBlock(c.get(), + s -> AssetLookup.partialBaseModel(c, p, s.getValue(ItemHatchBlock.OPEN) ? "open" : "closed"))) + .item() + .transform(customItemModel("_", "block_closed")) + .register(); + public static final BlockEntry PACKAGER = REGISTRATE.block("packager", PackagerBlock::new) .initialProperties(SharedProperties::softMetal) .properties(p -> p.noOcclusion()) diff --git a/src/main/java/com/simibubi/create/AllShapes.java b/src/main/java/com/simibubi/create/AllShapes.java index 841f450d9e..e75a0a3215 100644 --- a/src/main/java/com/simibubi/create/AllShapes.java +++ b/src/main/java/com/simibubi/create/AllShapes.java @@ -175,7 +175,12 @@ public class AllShapes { .forDirectional(UP), WHISTLE_BASE = shape(1, 0, 1, 15, 3, 15).add(5, 0, 5, 11, 8, 11) - .forDirectional(UP) + .forDirectional(UP), + + ITEM_HATCH = shape(1, 0, 0, 15, 16, 2).add(2, 2, 0, 14, 13, 3.8) + .add(2, 4, 0, 14, 11, 5.8) + .add(2, 6, 0, 14, 9, 7.8) + .forHorizontal(SOUTH) ; diff --git a/src/main/java/com/simibubi/create/AllSoundEvents.java b/src/main/java/com/simibubi/create/AllSoundEvents.java index 0c8cab1b1e..3f3bb0fd11 100644 --- a/src/main/java/com/simibubi/create/AllSoundEvents.java +++ b/src/main/java/com/simibubi/create/AllSoundEvents.java @@ -211,6 +211,12 @@ public class AllSoundEvents { .playExisting(SoundEvents.GENERIC_EAT, .5f, 1f) .category(SoundSource.BLOCKS) .build(), + + ITEM_HATCH = create("item_hatch").subtitle("Item Hatch opens") + .playExisting(SoundEvents.BARREL_OPEN, .25f, 1.4f) + .playExisting(SoundEvents.NETHERITE_BLOCK_PLACE, .75f, 1.15f) + .category(SoundSource.BLOCKS) + .build(), CRUSHING_1 = create("crushing_1").subtitle("Crushing noises") .playExisting(SoundEvents.NETHERRACK_HIT) diff --git a/src/main/java/com/simibubi/create/content/logistics/itemHatch/HatchFilterSlot.java b/src/main/java/com/simibubi/create/content/logistics/itemHatch/HatchFilterSlot.java new file mode 100644 index 0000000000..ac5c55fd5a --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/itemHatch/HatchFilterSlot.java @@ -0,0 +1,42 @@ +package com.simibubi.create.content.logistics.itemHatch; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; +import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform; + +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.math.AngleHelper; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; + +public class HatchFilterSlot extends ValueBoxTransform { + + @Override + public Vec3 getLocalOffset(LevelAccessor level, BlockPos pos, BlockState state) { + return VecHelper.rotateCentered(VecHelper.voxelSpace(8, 5.15, 9.5), angle(state), Direction.Axis.Y); + } + + @Override + public float getScale() { + return super.getScale() * 0.965f; + } + + public boolean testHit(LevelAccessor level, BlockPos pos, BlockState state, Vec3 localHit) { + return localHit.distanceTo(getLocalOffset(level, pos, state).subtract(0, 0.125, 0)) < scale / 2; + } + + @Override + public void rotate(LevelAccessor level, BlockPos pos, BlockState state, PoseStack ms) { + ms.mulPose(Axis.YP.rotationDegrees(angle(state))); + ms.mulPose(Axis.XP.rotationDegrees(-45)); + } + + private float angle(BlockState state) { + return AngleHelper.horizontalAngle(state.getOptionalValue(ItemHatchBlock.FACING) + .orElse(Direction.NORTH)); + } + +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/content/logistics/itemHatch/ItemHatchBlock.java b/src/main/java/com/simibubi/create/content/logistics/itemHatch/ItemHatchBlock.java new file mode 100644 index 0000000000..86fcff91fe --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/itemHatch/ItemHatchBlock.java @@ -0,0 +1,153 @@ +package com.simibubi.create.content.logistics.itemHatch; + +import java.util.ArrayList; +import java.util.List; + +import com.simibubi.create.AllBlockEntityTypes; +import com.simibubi.create.AllShapes; +import com.simibubi.create.AllSoundEvents; +import com.simibubi.create.content.equipment.wrench.IWrenchable; +import com.simibubi.create.content.logistics.box.PackageItem; +import com.simibubi.create.foundation.block.IBE; +import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; +import com.simibubi.create.foundation.blockEntity.behaviour.filtering.FilteringBehaviour; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.HorizontalDirectionalBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition.Builder; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.minecraftforge.common.util.FakePlayer; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.ItemHandlerHelper; + +public class ItemHatchBlock extends HorizontalDirectionalBlock implements IBE, IWrenchable { + + public static final BooleanProperty OPEN = BooleanProperty.create("open"); + + public ItemHatchBlock(Properties pProperties) { + super(pProperties); + } + + @Override + protected void createBlockStateDefinition(Builder pBuilder) { + super.createBlockStateDefinition(pBuilder.add(OPEN, FACING)); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext pContext) { + BlockState state = super.getStateForPlacement(pContext); + if (state == null) + return state; + if (pContext.getClickedFace() + .getAxis() + .isVertical()) + return null; + + return state.setValue(FACING, pContext.getClickedFace() + .getOpposite()) + .setValue(OPEN, false); + } + + @Override + public InteractionResult use(BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, + BlockHitResult pHit) { + if (pLevel.isClientSide()) + return InteractionResult.SUCCESS; + if (pPlayer instanceof FakePlayer) + return InteractionResult.SUCCESS; + + BlockEntity blockEntity = pLevel.getBlockEntity(pPos.relative(pState.getValue(FACING))); + if (blockEntity == null) + return InteractionResult.FAIL; + LazyOptional optional = blockEntity.getCapability(ForgeCapabilities.ITEM_HANDLER); + IItemHandler targetInv = optional.orElse(null); + if (targetInv == null) + return InteractionResult.FAIL; + + FilteringBehaviour filter = BlockEntityBehaviour.get(pLevel, pPos, FilteringBehaviour.TYPE); + if (filter == null) + return InteractionResult.FAIL; + + Inventory inventory = pPlayer.getInventory(); + List failedInsertions = new ArrayList<>(); + boolean anyInserted = false; + + for (int i = 0; i < inventory.items.size(); i++) { + if (Inventory.isHotbarSlot(i)) + continue; + ItemStack item = inventory.getItem(i); + if (item.isEmpty()) + continue; + if (!item.getItem() + .canFitInsideContainerItems() && !PackageItem.isPackage(item)) + continue; + if (!filter.getFilter() + .isEmpty() && !filter.test(item)) + continue; + + ItemStack remainder = ItemHandlerHelper.insertItemStacked(targetInv, item, true); + if (remainder.getCount() == item.getCount()) + continue; + + ItemStack extracted = inventory.removeItem(i, item.getCount() - remainder.getCount()); + remainder = ItemHandlerHelper.insertItemStacked(targetInv, extracted, false); + anyInserted = true; + + // remainder might not be empty in itemhandler edge cases + if (!remainder.isEmpty()) + failedInsertions.add(remainder); + } + + failedInsertions.forEach(inventory::placeItemBackInInventory); + + if (!anyInserted) + return InteractionResult.SUCCESS; + + AllSoundEvents.ITEM_HATCH.playOnServer(pLevel, pPos); + pLevel.setBlockAndUpdate(pPos, pState.setValue(OPEN, true)); + pLevel.scheduleTick(pPos, this, 10); + return InteractionResult.SUCCESS; + } + + @Override + public VoxelShape getShape(BlockState pState, BlockGetter pLevel, BlockPos pPos, CollisionContext pContext) { + return AllShapes.ITEM_HATCH.get(pState.getValue(FACING) + .getOpposite()); + } + + @Override + public void tick(BlockState pState, ServerLevel pLevel, BlockPos pPos, RandomSource pRandom) { + if (pState.getValue(OPEN)) + pLevel.setBlockAndUpdate(pPos, pState.setValue(OPEN, false)); + } + + @Override + public Class getBlockEntityClass() { + return ItemHatchBlockEntity.class; + } + + @Override + public BlockEntityType getBlockEntityType() { + return AllBlockEntityTypes.ITEM_HATCH.get(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/itemHatch/ItemHatchBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/itemHatch/ItemHatchBlockEntity.java new file mode 100644 index 0000000000..fcfa2022fe --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/itemHatch/ItemHatchBlockEntity.java @@ -0,0 +1,26 @@ +package com.simibubi.create.content.logistics.itemHatch; + +import java.util.List; + +import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; +import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; +import com.simibubi.create.foundation.blockEntity.behaviour.filtering.FilteringBehaviour; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; + +public class ItemHatchBlockEntity extends SmartBlockEntity { + + public FilteringBehaviour filtering; + + public ItemHatchBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { + super(type, pos, state); + } + + @Override + public void addBehaviours(List behaviours) { + behaviours.add(filtering = new FilteringBehaviour(this, new HatchFilterSlot())); + } + +} diff --git a/src/main/resources/assets/create/models/block/item_hatch/block_closed.json b/src/main/resources/assets/create/models/block/item_hatch/block_closed.json new file mode 100644 index 0000000000..5cc93cbb25 --- /dev/null +++ b/src/main/resources/assets/create/models/block/item_hatch/block_closed.json @@ -0,0 +1,81 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "0": "create:block/hatch", + "1": "create:block/hatch_closed", + "particle": "create:block/industrial_iron_block" + }, + "elements": [ + { + "from": [1, 0, 0], + "to": [15, 16, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [1, 0, 0]}, + "faces": { + "north": {"uv": [1, 1, 8, 9], "texture": "#0"}, + "east": {"uv": [1, 1, 0, 9], "texture": "#0"}, + "south": {"uv": [1, 1, 8, 9], "texture": "#0"}, + "west": {"uv": [0, 1, 1, 9], "texture": "#0"}, + "up": {"uv": [1, 0, 8, 1], "texture": "#0"}, + "down": {"uv": [1, 1, 8, 0], "texture": "#0"} + } + }, + { + "from": [2, 1, -2], + "to": [14, 15, 0], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 1, -2]}, + "faces": { + "north": {"uv": [1.5, 1.5, 7.5, 8.5], "texture": "#0"}, + "east": {"uv": [9, 1.5, 10, 8.5], "texture": "#0"}, + "west": {"uv": [10, 1.5, 9, 8.5], "texture": "#0"}, + "up": {"uv": [11.5, 2, 10.5, 8], "rotation": 90, "texture": "#0"}, + "down": {"uv": [10.5, 2, 11.5, 8], "rotation": 90, "texture": "#0"} + } + }, + { + "from": [2, 0, 2], + "to": [14, 10.6, 12.6], + "rotation": {"angle": -45, "axis": "x", "origin": [8, 0, 2]}, + "faces": { + "east": {"uv": [9.5, 15, 15, 9.5], "rotation": 90, "texture": "#0"}, + "south": {"uv": [2, 3, 14, 14], "texture": "#1"}, + "west": {"uv": [9.5, 9.5, 15, 15], "rotation": 90, "texture": "#0"}, + "down": {"uv": [1.5, 9.5, 7.5, 15.1], "texture": "#0"} + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "thirdperson_lefthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "firstperson_righthand": { + "rotation": [0, 45, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "scale": [0.4, 0.4, 0.4] + }, + "ground": { + "translation": [0, 3, 0], + "scale": [0.25, 0.25, 0.25] + }, + "gui": { + "rotation": [30, 45, 0], + "translation": [2.25, -1.75, 0], + "scale": [0.625, 0.625, 0.625] + }, + "fixed": { + "rotation": [0, 180, 0], + "translation": [0, 0, -2.5], + "scale": [0.5, 0.5, 0.5] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/item_hatch/block_open.json b/src/main/resources/assets/create/models/block/item_hatch/block_open.json new file mode 100644 index 0000000000..24bd343941 --- /dev/null +++ b/src/main/resources/assets/create/models/block/item_hatch/block_open.json @@ -0,0 +1,8 @@ +{ + "credit": "Made with Blockbench", + "parent": "create:block/item_hatch/block_closed", + "textures": { + "1": "create:block/hatch_open", + "particle": "create:block/industrial_iron_block" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/block/hatch.png b/src/main/resources/assets/create/textures/block/hatch.png new file mode 100644 index 0000000000000000000000000000000000000000..dc1e7e2ac2e4ab68f5a9479e533c27608136fd22 GIT binary patch literal 1154 zcmV-|1bzF7P)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00ZhtL_t(o!|hhjYui>F|0sA? zCF)EzZBkjuNTH|p(v4)89u^oID5p?b*lAAi{Fk2<5ejQz&c3Wb4|H4sPAj*PGL{BjSyj{hem^+T1*gHjKR_Hs#SBnNap8i2 zIEthgC}N;U8UJ92xAd*7fEWYfBV|>USnBtKLJNyrFbEIvUOcJ;$7Quwm<3`C=$Z!N z^(MNYh=HS{Bb5JEM=6b4dF9IGQ&AX45lZK@ z+(%pOrh@hfT3D5W9G>Y-`*^^AaUs-M>}+@N z`DZKXqd#svfqyW>SGU&FHv02c>qK@oHts2$iJcJ>on2RAATt$ns`#9z>t!iBh}TW2 zyn1a(x-bu|c2ili?SxlVUYbM3P*z!f5U$yF!nG5X;pptT5ceN%ZWa!pYqp(;4UJb* zE?de@LM%PBv)z%qWVMp%6GeEuxv8wLuP3~Ljmu`{0bSE@sa693yz>3raXgM9sYMsT zaU5mMwi9lcC_6Jg5d}ejSH6#Mq)Z$|X?wm@tKkFFgkcy{vA~(&bEPONG2puUQmq%G zmC}6#qaYO5r-9=*%F1#h5o<(l9Uxv8mbox-nzhV@iFKd|t#(tn^~KEu|6_!I0C*=d UNBQc;LI3~&07*qoM6N<$g0I{F9{>OV literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/hatch_closed.png b/src/main/resources/assets/create/textures/block/hatch_closed.png new file mode 100644 index 0000000000000000000000000000000000000000..2620fc82fbf3c629dfade9e7fd9a2f1e5e527616 GIT binary patch literal 441 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=De8Ak0{?)V>TT$X?><>&pIuQ*SDKRGz4ngQDuspC)~k;2H{3tS z7A?*ucBCQVhvkMthuFC8?q(NXc7^GrT4aKv;zG`(mdQFdukEcaKi^j0@3+y?-nwr8 zzRvp4E!(Z1J^8YTc|%Z)oAhjkmWKjY-zTkAjg`36dN8W{RXOM3#9r_Lq#h6s6{io$hj)6yl6NlXbc&GS{bDAn-XM0fFt^Xrc8RA>3j zwf&;w)R^ATHDT;mlU~aln{kVWYYU&@MJY|&9>a*)^`+Y@BUP5RPl+pL`TOO>#U~4D hzN>}&KXU&d`-hv=writaFatxB!PC{xWt~$(695F!uOa{d literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/hatch_open.png b/src/main/resources/assets/create/textures/block/hatch_open.png new file mode 100644 index 0000000000000000000000000000000000000000..3e772a55d8ef2429f46f270bb04293adaae41f62 GIT binary patch literal 308 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4!4xX<;GG*E=Iz$3Dl zfk96hgc&QA+Lr+Z*-JcqUD;o7it?&6^l@Ha3KWtoag8W(&d<$F%`0JWE=o--Nlj5G z&n(GMaQE~L2yf&Q2P&H5>Eak-aXL9c;!}g*v5ZWu|NE=YXD%|?xod{el`Ex2Mg|53 z8xF86RZW$Uknl6!Q~A5?;qUMBBTS2mHW_ztbUR#iVi4Y?6f>*vq+y^G+ZAJnu&7xX zz9+ICvf0%Anv%gh;cC!%))RrP+zFGD9m~YT#ig5Nri&cjp1*&C)PbW%+a9v+VDz7F upQv%pJGtV|7frwS2cG!Nv9#38$lZxy-8q?;Kn_c~qpu?a z!^VE@KZ&eBzH5L_h%1o(|NsB7W5+^6Lv3w5ww-=hH*rZ?aoeFohgPjx_3G8D?(Xiz zix=nT=bM|Gmz0#GrKLT3^ytQon>TLUxPJZmk|j%kCdl2|b{j~Emjw9*15LvM7@j#i zivud*EbxddW?if+t!eIwnw~w z#%GnDYi_{@)+FuwVO$jFH`zw(LFyA7IS~W>6K)QcJ**`n3jh5b;v8aUSF$nrO)e2J zh-7$g93_!_@uSlV3(dNwG#AB&gHan9HXUGk!n$W)(YF&V=a@D%AB@VZyZGd7zS|zv zv;RX6{4Sb$zN+5E;qlkS@%)?_d+NTN<}F~BSS@Sbp!4%m!&lzATXG$rKic1I`1)*C z>eqMox3ecj*Y>~qTEc90T69t-=+roWLt=)asy{oZ?^^Bd}H%>MqF@xLhg?XOnD4cXCW9kZi5b4m> zc!y<*J+mHD+V8`*%riMxJj>^pAC#;*^~{C7RD_qqCJ!Gd3p zy$;-c?rtm?z*j$Szv6>`pEvL1Siuu=S$qzwijDo8-iAXCqN?hQn&aS+zA`PW--~>cN?d>m55D{<+s9s+uevgWLO9r|{m0dFR2ueOa@~f}O_`R+lp#wF3ql zh@IWQ)-tai81D1-|7T;F4E91BsRYG6HuT{_}n)ZCKB87ph?b+mU~|Mlu;z zcclfS`Ap{KF&Q0U@`%)Fm~wQOQ?4-wKK_u;bnQ(M&*rKH76uHSu6{1-oD!M<3Jw`f delta 945 zcmX@jd5Uww-ueR!415O|v#xb=GB7Z|_H=O!sfc?!r#tMHgNSQo=-P$=$AABWXCF6n zIby&#xzzain>AO1mox3WeR)Qi;W@uY5e%B$tP?gtsX44?q#|bM^aLJo64zz?Jd2fo zp21m_o@=hr2Nosm{AFA?&rW@3_<_quBJXM@L{8{!D5{s>exd2`Z+*j_hFxZ-d01-v zE(IURVYNA*lGqb^UV7o>H9z=f3AQq@y*|Qpf{A;A_=i7dt||*xai8F0d%fhZ=jQ4A zB|lCw`5(@>{W zQF?6Bz^`oN$Na-UN!di<%O4=|?ayIzg&#m7!TR}kN6CLu0(TC4xZd!9tu6n+)~^md z7aDF{KUgSrAUECRSSEwMm|#3}-Dbw@d%5My@(z6e>hLFxdEJN0^;HV9J_8*(*IYZ-^}t}`y>a@o4O6VSNcS#bT*dzFurQgi zs-b@Rn^U2xjJvthp1!L4KQBokp0WG;cju(+Eiel3jlaO*al?L2Z^I!6QPufOLErqJD=%PW3VL=v(&5q{ zNp6qX_S}rt|HS|Jd`_EcYEvz*)BH`zHUg#>+TT85&yu|;MB)3B9 zMus3U6lz)>)3w|NW0eV5N~@ZFiMW3YQ6>lEIOy}5nDzR&yEHh3B;HFK|!I?(NU zgtvg%;$q1!GkEN9bJ+doV0yMED4=aW8;iNYA5(=LjSr Date: Wed, 25 Sep 2024 12:53:17 +0200 Subject: [PATCH 064/515] Freq out - Reworked Logistical links to connect as a group rather than a tree --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 6 +- .../82992cbf8f2794d83ac94034835eac0acd7915b9 | 6 +- .../resources/assets/create/lang/en_ud.json | 5 + .../resources/assets/create/lang/en_us.json | 5 + .../logistics/packager_link_clear.json | 35 +++ .../logistics/stock_ticker_clear.json | 35 +++ .../logistics/packager_link_clear.json | 12 + .../logistics/stock_ticker_clear.json | 12 + .../LogisticallyLinkedBehaviour.java | 220 ++++++------------ .../LogisticallyLinkedBlockItem.java | 89 +++++-- .../LogisticallyLinkedClientHandler.java | 41 ++++ .../stockTicker/StockTickerBlockEntity.java | 2 +- .../data/recipe/StandardRecipeGen.java | 8 + .../foundation/events/ClientEvents.java | 3 + .../assets/create/lang/default/interface.json | 6 + 15 files changed, 316 insertions(+), 169 deletions(-) create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/packager_link_clear.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/stock_ticker_clear.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/packager_link_clear.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/stock_ticker_clear.json create mode 100644 src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedClientHandler.java diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index cb7ce133f6..3eb8ee2960 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-09-24T21:07:12.9308328 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-09-25T12:48:56.6991439 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -593,8 +593,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -6b33da4cc5f2c69c547e9ab578561a3acdb4d531 assets/create/lang/en_ud.json -53af792aff5d9618bdd9691d3727dc19fc4bab9f assets/create/lang/en_us.json +1ec09657f3c9425729cb4554977f350ae331ff6a assets/create/lang/en_ud.json +6bc1528908d08a24a9a6a6923e96bd5bbbef28d7 assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json diff --git a/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 b/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 index 2380111ec2..85667da53b 100644 --- a/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 +++ b/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 @@ -1,4 +1,4 @@ -// 1.20.1 2024-09-02T22:36:27.358065 Create's Standard Recipes +// 1.20.1 2024-09-25T12:48:56.7958848 Create's Standard Recipes a8cc4af26f6c7c45a9eef12e92af1452fe042454 data/create/advancements/recipes/combat/crafting/appliances/netherite_backtank.json 2c2639c7b307ee7c7a4e97e5efebf496788998ad data/create/advancements/recipes/combat/crafting/appliances/netherite_backtank_from_netherite.json 81dcf0cb1aa99e39bc7d1a386e07cad4cee7d8b9 data/create/advancements/recipes/combat/crafting/appliances/netherite_diving_boots.json @@ -169,6 +169,7 @@ f3e387ae41a55cdb5ff745f40e2ddb5e2595e9b8 data/create/advancements/recipes/misc/c dc61a327753684a0d8a7bcc408d656b53ac633b1 data/create/advancements/recipes/misc/crafting/logistics/brass_tunnel.json 03c367840951af268047c407b15aad52f0b094b4 data/create/advancements/recipes/misc/crafting/logistics/content_observer.json 09454f1d4db813c89a0a2f3af966298fc5f7da7b data/create/advancements/recipes/misc/crafting/logistics/display_link.json +995aa09f4672405984988e445a1d97301c5c4389 data/create/advancements/recipes/misc/crafting/logistics/packager_link_clear.json 95b357cbac39acfbc68ac04d0d4681a4d91746ee data/create/advancements/recipes/misc/crafting/logistics/powered_latch.json ef84b382bd4f6ba9558574f2c8e63030813594e9 data/create/advancements/recipes/misc/crafting/logistics/powered_toggle_latch.json c443707391ce79dc1ec8cfacee74757b0c00bd3e data/create/advancements/recipes/misc/crafting/logistics/pulse_extender.json @@ -176,6 +177,7 @@ c443707391ce79dc1ec8cfacee74757b0c00bd3e data/create/advancements/recipes/misc/c 96b4998626e624fb79c79fb754c28b21ddc27254 data/create/advancements/recipes/misc/crafting/logistics/redstone_contact.json 1b50ed47c37e48d1112c76059574eed71ecea4e5 data/create/advancements/recipes/misc/crafting/logistics/redstone_link.json 831588b3f29411d5c4b358006051152eb2b23e6b data/create/advancements/recipes/misc/crafting/logistics/stockpile_switch.json +1e0fc9f4971286a69d9706006bd8358931382c9c data/create/advancements/recipes/misc/crafting/logistics/stock_ticker_clear.json cb416511a219d2bc5806c6880c01820a8b563b80 data/create/advancements/recipes/misc/crafting/materials/andesite_alloy.json 3b65a04da4e16442bfa8accfe209b7c5342b1db9 data/create/advancements/recipes/misc/crafting/materials/andesite_alloy_block.json 2715b888b6d96ee4c7208af21bb4dfb1a1bd544c data/create/advancements/recipes/misc/crafting/materials/andesite_alloy_from_block.json @@ -415,6 +417,7 @@ a24f11d979f40994b9f881b0f49fff5d93185296 data/create/recipes/crafting/logistics/ d994ef262b16357984d3ed62f6563d2f37266193 data/create/recipes/crafting/logistics/brass_tunnel.json 0b18d9964f2d580eb465cc72208f7a7fdba7b63e data/create/recipes/crafting/logistics/content_observer.json cc837e8b014c121ed9d959baddea134ebf669350 data/create/recipes/crafting/logistics/display_link.json +5db046b432f184c6590c8e6adaf95adac6f0dc9d data/create/recipes/crafting/logistics/packager_link_clear.json dd28b63ceb46a1e9071549c4f8ff32f520c667f6 data/create/recipes/crafting/logistics/powered_latch.json 9ee6e19644928dc78e6f8a5e59f30cd42ac3e454 data/create/recipes/crafting/logistics/powered_toggle_latch.json aa8a704ad643ff5f06db34f4047f7f740a556236 data/create/recipes/crafting/logistics/pulse_extender.json @@ -422,6 +425,7 @@ aa8a704ad643ff5f06db34f4047f7f740a556236 data/create/recipes/crafting/logistics/ c81f852f1d1514184ff235e790a6ca907f7b6ad4 data/create/recipes/crafting/logistics/redstone_contact.json 00877e6b56f28d8691080ef18b654f0a141835ce data/create/recipes/crafting/logistics/redstone_link.json eff0d37e98e8badd8d2c3c9de17ee5560b110dbd data/create/recipes/crafting/logistics/stockpile_switch.json +38aa7b9b3c4724ec8b8d94f00a98d684110ad5ca data/create/recipes/crafting/logistics/stock_ticker_clear.json ac524c110f66a7433208a888c5f3bb69e5e95743 data/create/recipes/crafting/materials/andesite_alloy.json e6bb68a1d2ed5a629c83f5a0eefb843bb890736d data/create/recipes/crafting/materials/andesite_alloy_block.json eebacb477bcce876622173289b06e1ad21424686 data/create/recipes/crafting/materials/andesite_alloy_from_block.json diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 6136cab2e7..61b26871ee 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -1342,6 +1342,11 @@ "create.linked_controller.frequency_slot_2": "ᄅ# ˙bǝɹℲ '%1$s :puıqʎǝʞ", "create.linked_controller.key_bound": "%1$s oʇ punoq ʎɔuǝnbǝɹℲ", "create.linked_controller.press_keybind": "ʎǝʞ ǝʌıʇɔǝdsǝɹ ǝɥʇ oʇ ʎɔuǝnbǝɹɟ sıɥʇ puıq oʇ '%6$s ɹo %5$s '%4$s '%3$s '%2$s '%1$s ssǝɹԀ", + "create.logistically_linked.connected": "ʎןןnɟssǝɔɔns sɹǝʇʇıɯsuɐɹ⟘ ɹǝɥʇo oʇ pǝʇɔǝuuoƆ", + "create.logistically_linked.new_network_started": "pǝʇɹɐʇs ʞɹoʍʇǝu ɹǝʇʇıɯsuɐɹʇ ʍǝN", + "create.logistically_linked.tooltip": "pǝɹnbıɟuoɔ ʎɔuǝnbǝɹℲ", + "create.logistically_linked.tooltip_clear": "ʇǝsǝɹ oʇ pıɹb buıʇɟɐɹɔ uı ǝɔɐןԀ", + "create.logistically_linked.tuned": "ɹǝʇʇıɯsuɐɹʇ sıɥʇ oʇ pǝun⟘", "create.logistics.crafter.click_to_merge": "sǝıɹoʇuǝʌuI ǝbɹǝɯ oʇ ʞɔıןƆ", "create.logistics.crafter.click_to_separate": "sǝıɹoʇuǝʌuI ǝʇɐɹɐdǝs oʇ ʞɔıןƆ", "create.logistics.crafter.connected": "sɹǝʇɟɐɹƆ pǝʇɔǝuuoƆ", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 1ebbb0111b..041cc43254 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1342,6 +1342,11 @@ "create.linked_controller.frequency_slot_2": "Keybind: %1$s, Freq. #2", "create.linked_controller.key_bound": "Frequency bound to %1$s", "create.linked_controller.press_keybind": "Press %1$s, %2$s, %3$s, %4$s, %5$s or %6$s, to bind this frequency to the respective key", + "create.logistically_linked.connected": "Connected to other Transmitters successfully", + "create.logistically_linked.new_network_started": "New transmitter network started", + "create.logistically_linked.tooltip": "Frequency configured", + "create.logistically_linked.tooltip_clear": "Place in crafting grid to reset", + "create.logistically_linked.tuned": "Tuned to this transmitter", "create.logistics.crafter.click_to_merge": "Click to merge Inventories", "create.logistics.crafter.click_to_separate": "Click to separate Inventories", "create.logistics.crafter.connected": "Connected Crafters", diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/packager_link_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/packager_link_clear.json new file mode 100644 index 0000000000..b997f1c451 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/packager_link_clear.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "create:packager_link" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/packager_link_clear" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/packager_link_clear" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/stock_ticker_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/stock_ticker_clear.json new file mode 100644 index 0000000000..fbdff1d2db --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/stock_ticker_clear.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "create:stock_ticker" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/stock_ticker_clear" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/stock_ticker_clear" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/packager_link_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/packager_link_clear.json new file mode 100644 index 0000000000..bf9a09cdb2 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/packager_link_clear.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "create:packager_link" + } + ], + "result": { + "item": "create:packager_link" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/stock_ticker_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/stock_ticker_clear.json new file mode 100644 index 0000000000..cdd6dcb113 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/stock_ticker_clear.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "create:stock_ticker" + } + ], + "result": { + "item": "create:stock_ticker" + } +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java index 6805aaee21..8f5d9ff35c 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java @@ -1,133 +1,108 @@ package com.simibubi.create.content.logistics.packagerLink; import java.lang.ref.WeakReference; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.IdentityHashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; +import java.util.Collection; +import java.util.Collections; +import java.util.LinkedList; +import java.util.UUID; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Stream; import javax.annotation.Nullable; import org.apache.commons.lang3.mutable.MutableBoolean; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; import com.simibubi.create.content.logistics.packager.InventorySummary; import com.simibubi.create.content.logistics.stockTicker.PackageOrder; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BehaviourType; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; -import net.createmod.catnip.utility.IntAttached; -import net.minecraft.core.BlockPos; -import net.minecraft.core.registries.Registries; import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.NbtUtils; -import net.minecraft.resources.ResourceKey; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.level.ServerLevel; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Level; import net.minecraftforge.items.IItemHandler; public class LogisticallyLinkedBehaviour extends BlockEntityBehaviour { public static final BehaviourType TYPE = new BehaviourType<>(); + public static final AtomicInteger LINK_ID_GENERATOR = new AtomicInteger(); + public int linkId; // Runtime context, not saved to disk public int redstonePower; + public UUID freqId; - // To - public int linkId; - public BlockPos targetOffset; - public ResourceKey targetDim; - public WeakReference target; + // - // From - private Map>> connectedLinks = new HashMap<>(); + public static final Cache>> LINKS = + CacheBuilder.newBuilder() + .expireAfterAccess(1, TimeUnit.SECONDS) + .build(); + + public static Collection getAllPresent(UUID freq, boolean sortByPriority) { + Cache> cache = LINKS.getIfPresent(freq); + if (cache == null) + return Collections.emptyList(); + Stream stream = new LinkedList<>(cache.asMap() + .values()).stream() + .map(WeakReference::get) + .filter(LogisticallyLinkedBehaviour::isValidLink); + + if (sortByPriority) + stream = stream.sorted((e1, e2) -> Integer.compare(e1.redstonePower, e2.redstonePower)); + + return stream.toList(); + } + + public static void keepAlive(LogisticallyLinkedBehaviour behaviour) { + if (behaviour.redstonePower == 15) + return; + try { + Cache> cache = LINKS.get(behaviour.freqId, + () -> CacheBuilder.newBuilder() + .expireAfterAccess(1, TimeUnit.SECONDS) + .build()); + + if (cache == null) + return; + + WeakReference reference = + cache.get(behaviour.linkId, () -> new WeakReference<>(behaviour)); + if (reference.get() != behaviour) + cache.put(behaviour.linkId, new WeakReference<>(behaviour)); + + } catch (ExecutionException e) { + e.printStackTrace(); + } + } + + public static void remove(LogisticallyLinkedBehaviour behaviour) { + Cache> cache = LINKS.getIfPresent(behaviour.freqId); + if (cache != null) + cache.invalidate(behaviour.linkId); + } + + // public LogisticallyLinkedBehaviour(SmartBlockEntity be) { super(be); - targetOffset = BlockPos.ZERO; linkId = LINK_ID_GENERATOR.getAndIncrement(); + freqId = UUID.randomUUID(); } @Override public void unload() { super.unload(); - if (!getWorld().isClientSide()) - invalidateSelf(); - } - - public void invalidateSelf() { - LogisticallyLinkedBehaviour target = getTarget(); - if (target != null) - target.invalidateLink(this); - } - - @Nullable - public LogisticallyLinkedBehaviour getTarget() { - if (targetOffset.equals(BlockPos.ZERO)) - return null; - - if (target != null) { - LogisticallyLinkedBehaviour link = target.get(); - if (isValidLink(link)) - return link; - target = null; - } - - BlockPos targetPos = getPos().offset(targetOffset); - Level world = getWorld(); - - if (world instanceof ServerLevel sl) - world = sl.getServer() - .getLevel(targetDim); - if (world == null) - return null; - if (!world.isLoaded(targetPos)) - return null; - - LogisticallyLinkedBehaviour logisticallyLinkedBehaviour = get(world, targetPos, TYPE); - if (logisticallyLinkedBehaviour != null) { - target = new WeakReference(logisticallyLinkedBehaviour); - return logisticallyLinkedBehaviour; - } - - return null; + remove(this); } @Override public void lazyTick() { - if (getWorld().isClientSide()) - return; - - tickTargetConnection(); - - for (Iterator iterator = connectedLinks.keySet() - .iterator(); iterator.hasNext();) { - Integer id = iterator.next(); - IntAttached> entry = connectedLinks.get(id); - entry.decrement(); - if (entry.isOrBelowZero()) { - iterator.remove(); - continue; - } - LogisticallyLinkedBehaviour link = entry.getSecond() - .get(); - if (!isValidLink(link)) { - iterator.remove(); - continue; - } - } - } - - public void tickTargetConnection() { - LogisticallyLinkedBehaviour target = getTarget(); - if (target != null) - target.keepConnected(this); + keepAlive(this); } public void redstonePowerChanged(int power) { @@ -137,42 +112,9 @@ public class LogisticallyLinkedBehaviour extends BlockEntityBehaviour { blockEntity.setChanged(); if (power == 15) - invalidateSelf(); + remove(this); else - tickTargetConnection(); - } - - public List getAllConnectedAvailableLinks(boolean sortByPriority) { - Map links = new IdentityHashMap<>(); - appendAvailableLinksRecursive(links, 0); - - if (!sortByPriority) - return new ArrayList<>(links.keySet()); - - return new ArrayList<>(links.entrySet()).stream() - .sorted((e1, e2) -> e1.getValue() - .compareTo(e2.getValue())) - .map(Entry::getKey) - .toList(); - } - - private void appendAvailableLinksRecursive(Map links, int relativePower) { - if (redstonePower == 15) - return; - - int combinedPower = relativePower + redstonePower; - links.put(this, combinedPower); - - LogisticallyLinkedBehaviour target = getTarget(); - if (target != null && !links.containsKey(target)) - target.appendAvailableLinksRecursive(links, combinedPower); - - connectedLinks.forEach(($, entry) -> { - LogisticallyLinkedBehaviour link = entry.getSecond() - .get(); - if (isValidLink(link) && !links.containsKey(link)) - link.appendAvailableLinksRecursive(links, combinedPower); - }); + keepAlive(this); } public int processRequest(ItemStack stack, int amount, String address, int linkIndex, MutableBoolean finalLink, @@ -203,34 +145,16 @@ public class LogisticallyLinkedBehaviour extends BlockEntityBehaviour { @Override public void write(CompoundTag tag, boolean clientPacket) { super.write(tag, clientPacket); - tag.put("TargetOffset", NbtUtils.writeBlockPos(targetOffset)); - if (targetDim != null) - tag.putString("TargetDimension", targetDim.location() - .toString()); + tag.putUUID("Freq", freqId); tag.putInt("Power", redstonePower); } @Override public void read(CompoundTag tag, boolean clientPacket) { super.read(tag, clientPacket); - targetOffset = NbtUtils.readBlockPos(tag.getCompound("TargetOffset")); + if (tag.hasUUID("Freq")) + freqId = tag.getUUID("Freq"); redstonePower = tag.getInt("Power"); - - if (!tag.contains("TargetDimension")) { - targetDim = Level.OVERWORLD; - return; - } - - targetDim = ResourceKey.create(Registries.DIMENSION, new ResourceLocation(tag.getString("TargetDimension"))); - } - - public void keepConnected(LogisticallyLinkedBehaviour link) { - connectedLinks.computeIfAbsent(link.linkId, $ -> IntAttached.withZero(new WeakReference<>(link))) - .setFirst(3); - } - - public void invalidateLink(LogisticallyLinkedBehaviour link) { - connectedLinks.remove(link.linkId); } @Override @@ -238,4 +162,8 @@ public class LogisticallyLinkedBehaviour extends BlockEntityBehaviour { return TYPE; } + public Iterable getAllConnectedAvailableLinks(boolean sortByPriority) { + return getAllPresent(freqId, sortByPriority); + } + } diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBlockItem.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBlockItem.java index 7d3e8d2b18..f64b6b79e1 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBlockItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBlockItem.java @@ -1,40 +1,93 @@ package com.simibubi.create.content.logistics.packagerLink; -import com.simibubi.create.AllBlocks; -import com.simibubi.create.content.logistics.stockTicker.StockTickerBlock; -import com.simibubi.create.content.redstone.displayLink.ClickToLinkBlockItem; +import java.util.List; +import java.util.UUID; +import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; +import com.simibubi.create.foundation.utility.CreateLang; + +import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; -import net.minecraft.world.level.LevelAccessor; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; -public class LogisticallyLinkedBlockItem extends ClickToLinkBlockItem { +public class LogisticallyLinkedBlockItem extends BlockItem { public LogisticallyLinkedBlockItem(Block pBlock, Properties pProperties) { super(pBlock, pProperties); } @Override - public boolean isValidTarget(LevelAccessor level, BlockPos pos) { - Block block = level.getBlockState(pos) - .getBlock(); - return (!AllBlocks.STOCK_TICKER.is(this) && block instanceof StockTickerBlock) - || block instanceof PackagerLinkBlock; + public boolean isFoil(ItemStack pStack) { + return isTuned(pStack); } - - @Override - public boolean placeWhenInvalid() { - return true; + + public static boolean isTuned(ItemStack pStack) { + return pStack.hasTag() && pStack.getTag() + .contains(BLOCK_ENTITY_TAG); } @Override - public int getMaxDistanceFromSelection() { - return -1; + public void appendHoverText(ItemStack pStack, Level pLevel, List pTooltip, TooltipFlag pFlag) { + super.appendHoverText(pStack, pLevel, pTooltip, pFlag); + if (!isTuned(pStack)) + return; + + CompoundTag tag = pStack.getTag() + .getCompound(BLOCK_ENTITY_TAG); + if (!tag.hasUUID("Freq")) + return; + + CreateLang.translate("logistically_linked.tooltip") + .style(ChatFormatting.GOLD) + .addTo(pTooltip); + + CreateLang.translate("logistically_linked.tooltip_clear") + .style(ChatFormatting.GRAY) + .addTo(pTooltip); } @Override - public String getMessageTranslationKey() { - return "packager_link"; + public InteractionResult useOn(UseOnContext pContext) { + ItemStack stack = pContext.getItemInHand(); + BlockPos pos = pContext.getClickedPos(); + Level level = pContext.getLevel(); + Player player = pContext.getPlayer(); + + if (player == null) + return InteractionResult.FAIL; + + LogisticallyLinkedBehaviour link = BlockEntityBehaviour.get(level, pos, LogisticallyLinkedBehaviour.TYPE); + + if (link != null) { + if (level.isClientSide) + return InteractionResult.SUCCESS; + + CompoundTag stackTag = stack.getOrCreateTag(); + CompoundTag teTag = new CompoundTag(); + teTag.putUUID("Freq", link.freqId); + stackTag.put(BLOCK_ENTITY_TAG, teTag); + + player.displayClientMessage(CreateLang.translateDirect("logistically_linked.tuned"), true); + stack.setTag(stackTag); + return InteractionResult.SUCCESS; + } + + InteractionResult useOn = super.useOn(pContext); + if (level.isClientSide || useOn == InteractionResult.FAIL) + return useOn; + + player.displayClientMessage(isTuned(stack) ? CreateLang.translateDirect("logistically_linked.connected") + : CreateLang.translateDirect("logistically_linked.new_network_started"), true); + return useOn; } } diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedClientHandler.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedClientHandler.java new file mode 100644 index 0000000000..ff605150b6 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedClientHandler.java @@ -0,0 +1,41 @@ +package com.simibubi.create.content.logistics.packagerLink; + +import java.util.UUID; + +import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; + +import net.createmod.catnip.CatnipClient; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.ItemStack; + +public class LogisticallyLinkedClientHandler { + + public static void tick() { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) + return; + ItemStack mainHandItem = player.getMainHandItem(); + if (!(mainHandItem.getItem() instanceof LogisticallyLinkedBlockItem) + || !LogisticallyLinkedBlockItem.isTuned(mainHandItem)) + return; + + CompoundTag tag = mainHandItem.getTag() + .getCompound(BlockItem.BLOCK_ENTITY_TAG); + if (!tag.hasUUID("Freq")) + return; + + UUID uuid = tag.getUUID("Freq"); + for (LogisticallyLinkedBehaviour behaviour : LogisticallyLinkedBehaviour.getAllPresent(uuid, false)) { + SmartBlockEntity be = behaviour.blockEntity; + CatnipClient.OUTLINER.showAABB(behaviour, be.getBlockState() + .getShape(player.level(), be.getBlockPos()) + .bounds() + .move(be.getBlockPos()), 2) + .lineWidth(1 / 16f); + } + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java index fa9a7b37af..1165c94702 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java @@ -166,7 +166,7 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity { List> stacks = order.stacks(); // Packages need to track their index and successors for successful defrag - List availableLinks = behaviour.getAllConnectedAvailableLinks(true); + Iterable availableLinks = behaviour.getAllConnectedAvailableLinks(true); List usedLinks = new ArrayList<>(); MutableBoolean finalLinkTracker = new MutableBoolean(false); diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java index e6c845ed4f..1b04a02224 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java @@ -999,6 +999,14 @@ public class StandardRecipeGen extends CreateRecipeProvider { .pattern("C") .pattern("S")), + LOGISTICS_LINK_CLEAR = create(AllBlocks.PACKAGER_LINK).withSuffix("_clear") + .unlockedBy(AllBlocks.PACKAGER_LINK::asItem) + .viaShapeless(b -> b.requires(AllBlocks.PACKAGER_LINK)), + + STOCK_TICKER_CLEAR = create(AllBlocks.STOCK_TICKER).withSuffix("_clear") + .unlockedBy(AllBlocks.STOCK_TICKER::asItem) + .viaShapeless(b -> b.requires(AllBlocks.STOCK_TICKER)), + DISPLAY_LINK = create(AllBlocks.DISPLAY_LINK).unlockedBy(I::brassCasing) .viaShaped(b -> b.define('C', Blocks.REDSTONE_TORCH) .define('A', I.copperSheet()) diff --git a/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java b/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java index acbcf6cc0f..b3bdd93e3a 100644 --- a/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java @@ -39,6 +39,8 @@ import com.simibubi.create.content.kinetics.mechanicalArm.ArmInteractionPointHan import com.simibubi.create.content.kinetics.turntable.TurntableHandler; import com.simibubi.create.content.logistics.depot.EjectorTargetHandler; import com.simibubi.create.content.logistics.frogport.FrogportTargetSelectionHandler; +import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedBlockItem; +import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedClientHandler; import com.simibubi.create.content.processing.sequenced.SequencedAssemblyRecipe; import com.simibubi.create.content.redstone.displayLink.ClickToLinkBlockItem; import com.simibubi.create.content.redstone.link.LinkRenderer; @@ -179,6 +181,7 @@ public class ClientEvents { ChainConveyorRidingHandler.clientTick(); ChainConveyorConnectionHandler.clientTick(); FrogportTargetSelectionHandler.tick(); + LogisticallyLinkedClientHandler.tick(); } @SubscribeEvent diff --git a/src/main/resources/assets/create/lang/default/interface.json b/src/main/resources/assets/create/lang/default/interface.json index 42af3f2b8b..808c9c5516 100644 --- a/src/main/resources/assets/create/lang/default/interface.json +++ b/src/main/resources/assets/create/lang/default/interface.json @@ -958,6 +958,12 @@ "create.display_link.information_type": "Type of Information", "create.display_link.display_on": "Write data to:", "create.display_link.display_on_multiline": "Start writing at:", + + "create.logistically_linked.tuned": "Tuned to this transmitter", + "create.logistically_linked.new_network_started": "New transmitter network started", + "create.logistically_linked.connected": "Connected to other Transmitters successfully", + "create.logistically_linked.tooltip": "Frequency configured", + "create.logistically_linked.tooltip_clear": "Place in crafting grid to reset", "create.display_source.label": "Attached Label", "create.display_source.combine_item_names": "Combine Item Names", From 5bb589f24fe243fc5331f1fcd560dcf98075f0a7 Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Sun, 29 Sep 2024 00:17:48 -0700 Subject: [PATCH 065/515] Recycling rope - Fix rope pulleys being invisible - Use an InstanceRecycler in AbstractPulleyVisual - Remove Select, Group, and ConditionalInstance --- .../pulley/AbstractPulleyVisual.java | 109 ++++++++---------- .../contraptions/pulley/HosePulleyVisual.java | 17 +-- .../contraptions/pulley/RopePulleyVisual.java | 17 +-- .../render/ConditionalInstance.java | 68 ----------- .../foundation/render/GroupInstance.java | 84 -------------- .../foundation/render/SelectInstance.java | 69 ----------- 6 files changed, 66 insertions(+), 298 deletions(-) delete mode 100644 src/main/java/com/simibubi/create/foundation/render/ConditionalInstance.java delete mode 100644 src/main/java/com/simibubi/create/foundation/render/GroupInstance.java delete mode 100644 src/main/java/com/simibubi/create/foundation/render/SelectInstance.java diff --git a/src/main/java/com/simibubi/create/content/contraptions/pulley/AbstractPulleyVisual.java b/src/main/java/com/simibubi/create/content/contraptions/pulley/AbstractPulleyVisual.java index d5dd84a903..df9a1a158b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/pulley/AbstractPulleyVisual.java +++ b/src/main/java/com/simibubi/create/content/contraptions/pulley/AbstractPulleyVisual.java @@ -5,17 +5,16 @@ import java.util.function.Consumer; import com.mojang.math.Axis; import com.simibubi.create.content.kinetics.base.KineticBlockEntity; import com.simibubi.create.content.kinetics.base.ShaftVisual; -import com.simibubi.create.foundation.render.ConditionalInstance; -import com.simibubi.create.foundation.render.GroupInstance; -import com.simibubi.create.foundation.render.SelectInstance; import dev.engine_room.flywheel.api.instance.Instance; import dev.engine_room.flywheel.api.instance.Instancer; import dev.engine_room.flywheel.api.visual.DynamicVisual; import dev.engine_room.flywheel.api.visualization.VisualizationContext; import dev.engine_room.flywheel.lib.instance.OrientedInstance; +import dev.engine_room.flywheel.lib.instance.TransformedInstance; import dev.engine_room.flywheel.lib.math.MoreMath; import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; +import dev.engine_room.flywheel.lib.visual.util.SmartRecycler; import it.unimi.dsi.fastutil.bytes.ByteArrayList; import it.unimi.dsi.fastutil.bytes.ByteList; import it.unimi.dsi.fastutil.longs.LongOpenHashSet; @@ -29,9 +28,8 @@ import net.minecraft.world.level.LightLayer; public abstract class AbstractPulleyVisual extends ShaftVisual implements SimpleDynamicVisual { private final OrientedInstance coil; - private final SelectInstance magnet; - private final GroupInstance rope; - private final ConditionalInstance halfRope; + private final TransformedInstance magnet; + private final SmartRecycler rope; protected final Direction rotatingAbout; protected final Axis rotationAxis; @@ -50,14 +48,12 @@ public abstract class AbstractPulleyVisual extends .position(getVisualPosition()); coil.setChanged(); - magnet = new SelectInstance<>(this::getMagnetModelIndex); - magnet.addModel(getMagnetModel()) - .addModel(getHalfMagnetModel()); + magnet = magnetInstancer().createInstance(); - rope = new GroupInstance<>(getRopeModel()); - halfRope = new ConditionalInstance<>(getHalfRopeModel()).withCondition(this::shouldRenderHalfRope); + rope = new SmartRecycler<>(b -> b ? getHalfRopeModel().createInstance() : getRopeModel().createInstance()); updateOffset(partialTick); + updateLight(partialTick); } @Override @@ -66,67 +62,68 @@ public abstract class AbstractPulleyVisual extends lightCache.updateSections(); } - protected abstract Instancer getRopeModel(); + protected abstract Instancer getRopeModel(); - protected abstract Instancer getMagnetModel(); + protected abstract Instancer getMagnetModel(); - protected abstract Instancer getHalfMagnetModel(); + protected abstract Instancer getHalfMagnetModel(); protected abstract Instancer getCoilModel(); - protected abstract Instancer getHalfRopeModel(); + protected abstract Instancer getHalfRopeModel(); protected abstract float getOffset(float pt); protected abstract boolean isRunning(); + private Instancer magnetInstancer() { + return offset > .25f ? getMagnetModel() : getHalfMagnetModel(); + } + @Override public void beginFrame(DynamicVisual.Context ctx) { updateOffset(ctx.partialTick()); coil.rotation(rotationAxis.rotationDegrees(offset * 180)) .setChanged(); - int neededRopeCount = getNeededRopeCount(); - rope.resize(neededRopeCount); + magnet.setVisible(isRunning() || offset == 0); - magnet.update() - .get() - .ifPresent(data -> { - int i = Math.max(0, Mth.floor(offset)); - int light = lightCache.getPackedLight(i); - data.position(getVisualPosition()) - .translatePosition(0, -offset, 0) - .light(light) - .setChanged(); - }); + magnetInstancer().stealInstance(magnet); - halfRope.update() - .get() - .ifPresent(rope1 -> { - float f = offset % 1; - float halfRopeNudge = f > .75f ? f - 1 : f; + magnet.setIdentityTransform() + .translate(getVisualPosition()) + .translate(0, -offset, 0) + .light(lightCache.getPackedLight(Math.max(0, Mth.floor(offset)))) + .setChanged(); - int light = lightCache.getPackedLight(0); - rope1.position(getVisualPosition()) - .translatePosition(0, -halfRopeNudge, 0) - .light(light) - .setChanged(); - }); + rope.resetCount(); + + if (shouldRenderHalfRope()) { + float f = offset % 1; + float halfRopeNudge = f > .75f ? f - 1 : f; + + rope.get(true).setIdentityTransform() + .translate(getVisualPosition()) + .translate(0, -halfRopeNudge, 0) + .light(lightCache.getPackedLight(0)) + .setChanged(); + } if (isRunning()) { - int size = rope.size(); - for (int i = 0; i < size; i++) { - int light = lightCache.getPackedLight(size - 1 - i); + int neededRopeCount = getNeededRopeCount(); - rope.get(i) - .position(getVisualPosition()) - .translatePosition(0, -offset + i + 1, 0) - .light(light) + for (int i = 0; i < neededRopeCount; i++) { + + rope.get(false) + .setIdentityTransform() + .translate(getVisualPosition()) + .translate(0, -offset + i + 1, 0) + .light(lightCache.getPackedLight(neededRopeCount - 1 - i)) .setChanged(); } - } else { - rope.clear(); } + + rope.discardExtra(); } @Override @@ -151,21 +148,11 @@ public abstract class AbstractPulleyVisual extends return offset > .75f && (f < .25f || f > .75f); } - private int getMagnetModelIndex() { - if (isRunning() || offset == 0) { - return offset > .25f ? 0 : 1; - } else { - return -1; - } - } - @Override public void collectCrumblingInstances(Consumer consumer) { super.collectCrumblingInstances(consumer); consumer.accept(coil); - magnet.forEach(consumer); - rope.forEach(consumer); - halfRope.forEach(consumer); + consumer.accept(magnet); } @Override @@ -173,8 +160,7 @@ public abstract class AbstractPulleyVisual extends super._delete(); coil.delete(); magnet.delete(); - rope.clear(); - halfRope.delete(); + rope.delete(); } private class LightCache { @@ -186,6 +172,7 @@ public abstract class AbstractPulleyVisual extends public void setSize(int size) { if (size != data.size()) { data.size(size); + update(); int sectionCount = MoreMath.ceilingDiv(size + 15 - pos.getY() + pos.getY() / 4 * 4, SectionPos.SECTION_SIZE); if (sectionCount != this.sectionCount) { @@ -215,7 +202,7 @@ public abstract class AbstractPulleyVisual extends for (int i = 0; i < data.size(); i++) { int blockLight = level.getBrightness(LightLayer.BLOCK, mutablePos); int skyLight = level.getBrightness(LightLayer.SKY, mutablePos); - int light = ((skyLight << 4) & 0xF) | (blockLight & 0xF); + int light = ((skyLight & 0xF) << 4) | (blockLight & 0xF); data.set(i, (byte) light); mutablePos.move(Direction.DOWN); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/pulley/HosePulleyVisual.java b/src/main/java/com/simibubi/create/content/contraptions/pulley/HosePulleyVisual.java index d530c063f9..417541ca99 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/pulley/HosePulleyVisual.java +++ b/src/main/java/com/simibubi/create/content/contraptions/pulley/HosePulleyVisual.java @@ -7,6 +7,7 @@ import dev.engine_room.flywheel.api.instance.Instancer; import dev.engine_room.flywheel.api.visualization.VisualizationContext; import dev.engine_room.flywheel.lib.instance.InstanceTypes; import dev.engine_room.flywheel.lib.instance.OrientedInstance; +import dev.engine_room.flywheel.lib.instance.TransformedInstance; import dev.engine_room.flywheel.lib.model.Models; public class HosePulleyVisual extends AbstractPulleyVisual { @@ -15,18 +16,18 @@ public class HosePulleyVisual extends AbstractPulleyVisual getRopeModel() { - return instancerProvider().instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.HOSE)); + protected Instancer getRopeModel() { + return instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.HOSE)); } @Override - protected Instancer getMagnetModel() { - return instancerProvider().instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.HOSE_MAGNET)); + protected Instancer getMagnetModel() { + return instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.HOSE_MAGNET)); } @Override - protected Instancer getHalfMagnetModel() { - return instancerProvider().instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.HOSE_HALF_MAGNET)); + protected Instancer getHalfMagnetModel() { + return instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.HOSE_HALF_MAGNET)); } @Override @@ -35,8 +36,8 @@ public class HosePulleyVisual extends AbstractPulleyVisual getHalfRopeModel() { - return instancerProvider().instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.HOSE_HALF)); + protected Instancer getHalfRopeModel() { + return instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.HOSE_HALF)); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/pulley/RopePulleyVisual.java b/src/main/java/com/simibubi/create/content/contraptions/pulley/RopePulleyVisual.java index 1ba4e792a9..fca35feccd 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/pulley/RopePulleyVisual.java +++ b/src/main/java/com/simibubi/create/content/contraptions/pulley/RopePulleyVisual.java @@ -8,6 +8,7 @@ import dev.engine_room.flywheel.api.instance.Instancer; import dev.engine_room.flywheel.api.visualization.VisualizationContext; import dev.engine_room.flywheel.lib.instance.InstanceTypes; import dev.engine_room.flywheel.lib.instance.OrientedInstance; +import dev.engine_room.flywheel.lib.instance.TransformedInstance; import dev.engine_room.flywheel.lib.model.Models; import net.createmod.catnip.render.VirtualRenderHelper; @@ -17,18 +18,18 @@ public class RopePulleyVisual extends AbstractPulleyVisual { } @Override - protected Instancer getRopeModel() { - return instancerProvider().instancer(InstanceTypes.ORIENTED, VirtualRenderHelper.blockModel(AllBlocks.ROPE.getDefaultState())); + protected Instancer getRopeModel() { + return instancerProvider().instancer(InstanceTypes.TRANSFORMED, VirtualRenderHelper.blockModel(AllBlocks.ROPE.getDefaultState())); } @Override - protected Instancer getMagnetModel() { - return instancerProvider().instancer(InstanceTypes.ORIENTED, VirtualRenderHelper.blockModel(AllBlocks.PULLEY_MAGNET.getDefaultState())); + protected Instancer getMagnetModel() { + return instancerProvider().instancer(InstanceTypes.TRANSFORMED, VirtualRenderHelper.blockModel(AllBlocks.PULLEY_MAGNET.getDefaultState())); } @Override - protected Instancer getHalfMagnetModel() { - return instancerProvider().instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.ROPE_HALF_MAGNET)); + protected Instancer getHalfMagnetModel() { + return instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.ROPE_HALF_MAGNET)); } @Override @@ -37,8 +38,8 @@ public class RopePulleyVisual extends AbstractPulleyVisual { } @Override - protected Instancer getHalfRopeModel() { - return instancerProvider().instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.ROPE_HALF)); + protected Instancer getHalfRopeModel() { + return instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.ROPE_HALF)); } @Override diff --git a/src/main/java/com/simibubi/create/foundation/render/ConditionalInstance.java b/src/main/java/com/simibubi/create/foundation/render/ConditionalInstance.java deleted file mode 100644 index c8c44b4c11..0000000000 --- a/src/main/java/com/simibubi/create/foundation/render/ConditionalInstance.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.simibubi.create.foundation.render; - -import java.util.Optional; -import java.util.function.Consumer; - -import javax.annotation.Nullable; - -import dev.engine_room.flywheel.api.instance.Instance; -import dev.engine_room.flywheel.api.instance.Instancer; -import dev.engine_room.flywheel.lib.instance.AbstractInstance; - -public class ConditionalInstance { - - final Instancer model; - ICondition condition; - - Consumer setupFunc; - - @Nullable - private D instance; - - public ConditionalInstance(Instancer model) { - this.model = model; - this.condition = () -> true; - } - - public ConditionalInstance withSetupFunc(Consumer setupFunc) { - this.setupFunc = setupFunc; - return this; - } - - public ConditionalInstance withCondition(ICondition condition) { - this.condition = condition; - return this; - } - - public ConditionalInstance update() { - boolean shouldShow = condition.shouldShow(); - if (shouldShow && instance == null) { - instance = model.createInstance(); - if (setupFunc != null) setupFunc.accept(instance); - } else if (!shouldShow && instance != null) { - instance.delete(); - instance = null; - } - - return this; - } - - public Optional get() { - return Optional.ofNullable(instance); - } - - public void delete() { - if (instance != null) instance.delete(); - } - - public void forEach(Consumer consumer) { - if (instance != null) { - consumer.accept(instance); - } - } - - @FunctionalInterface - public interface ICondition { - boolean shouldShow(); - } -} diff --git a/src/main/java/com/simibubi/create/foundation/render/GroupInstance.java b/src/main/java/com/simibubi/create/foundation/render/GroupInstance.java deleted file mode 100644 index 00255bd772..0000000000 --- a/src/main/java/com/simibubi/create/foundation/render/GroupInstance.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.simibubi.create.foundation.render; - -import java.util.AbstractCollection; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -import dev.engine_room.flywheel.api.instance.Instancer; -import dev.engine_room.flywheel.lib.instance.AbstractInstance; - -public class GroupInstance extends AbstractCollection { - - final Instancer model; - final List backing; - - public GroupInstance(Instancer model) { - this.model = model; - - this.backing = new ArrayList<>(); - } - - public GroupInstance(Instancer model, int size) { - this.model = model; - - this.backing = new ArrayList<>(size); - - for (int i = 0; i < size; i++) { - addInstance(); - } - } - - /** - * @param count - * @return True if the number of elements changed. - */ - public boolean resize(int count) { - int size = size(); - if (count == size) return false; - - if (count <= 0) { - clear(); - return size > 0; - } - - if (count > size) { - for (int i = size; i < count; i++) { - addInstance(); - } - } else { - List unnecessary = backing.subList(count, size); - unnecessary.forEach(AbstractInstance::delete); - unnecessary.clear(); - } - - return true; - } - - public D addInstance() { - D instance = model.createInstance(); - backing.add(instance); - - return instance; - } - - public D get(int index) { - return backing.get(index); - } - - @Override - public Iterator iterator() { - return backing.iterator(); - } - - @Override - public int size() { - return backing.size(); - } - - @Override - public void clear() { - backing.forEach(AbstractInstance::delete); - backing.clear(); - } -} diff --git a/src/main/java/com/simibubi/create/foundation/render/SelectInstance.java b/src/main/java/com/simibubi/create/foundation/render/SelectInstance.java deleted file mode 100644 index f638146d8e..0000000000 --- a/src/main/java/com/simibubi/create/foundation/render/SelectInstance.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.simibubi.create.foundation.render; - -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; -import java.util.function.Consumer; - -import javax.annotation.Nullable; - -import dev.engine_room.flywheel.api.instance.Instance; -import dev.engine_room.flywheel.api.instance.Instancer; - -public class SelectInstance { - - final List> models; - - ModelSelector selector; - - private int last = -1; - @Nullable - private D current; - - public SelectInstance(ModelSelector selector) { - this.models = new ArrayList<>(); - this.selector = selector; - } - - public SelectInstance addModel(Instancer model) { - models.add(model); - return this; - } - - public SelectInstance update() { - int i = selector.modelIndexToShow(); - - if (i < 0 || i >= models.size()) { - if (current != null) { - current.handle().setDeleted(); - current = null; - } - } else if (i != last) { - if (current != null) current.handle().setDeleted(); - - current = models.get(i) - .createInstance(); - } - - last = i; - return this; - } - - public Optional get() { - return Optional.ofNullable(current); - } - - public void delete() { - if (current != null) current.handle().setDeleted(); - } - - public void forEach(Consumer consumer) { - if (current != null) { - consumer.accept(current); - } - } - - public interface ModelSelector { - int modelIndexToShow(); - } -} From f8924c3fd5a70403e9d5cc610d62148bd15afdfa Mon Sep 17 00:00:00 2001 From: Kryppers <65094918+Kryppers@users.noreply.github.com> Date: Mon, 30 Sep 2024 20:04:13 +0100 Subject: [PATCH 066/515] visual adjustments: part 2 Updated control blocks Updated frog tongue fixed basin texture --- .../block/contraption_controls/block.json | 41 +++++++----- .../block/contraption_controls/item.json | 61 +++++++++++------- .../models/block/controls/block_closed.json | 39 +++++++---- .../models/block/controls/block_open.json | 39 +++++++---- .../models/block/controls/block_virtual.json | 60 ++++++++++------- .../create/models/block/controls/item.json | 60 ++++++++++------- .../models/block/package_frogport/tongue.json | 8 ++- .../assets/create/textures/block/basin.png | Bin 496 -> 1017 bytes .../block/contraption_controls_frame.png | Bin 652 -> 1378 bytes .../create/textures/block/controls_frame.png | Bin 474 -> 1056 bytes .../textures/block/train_controller_base.png | Bin 0 -> 472 bytes 11 files changed, 201 insertions(+), 107 deletions(-) create mode 100644 src/main/resources/assets/create/textures/block/train_controller_base.png diff --git a/src/main/resources/assets/create/models/block/contraption_controls/block.json b/src/main/resources/assets/create/models/block/contraption_controls/block.json index 527f16430a..e6fb5d0d95 100644 --- a/src/main/resources/assets/create/models/block/contraption_controls/block.json +++ b/src/main/resources/assets/create/models/block/contraption_controls/block.json @@ -7,8 +7,8 @@ }, "elements": [ { - "from": [14, 0, 6], - "to": [16, 14, 16], + "from": [14, 2, 6], + "to": [16, 16, 16], "faces": { "north": {"uv": [0, 9, 1, 16], "texture": "#4"}, "east": {"uv": [13, 0, 8, 7], "texture": "#4"}, @@ -19,8 +19,8 @@ } }, { - "from": [2, 5, 14], - "to": [14, 14, 16], + "from": [2, 7, 14], + "to": [14, 16, 16], "faces": { "north": {"uv": [1, 0, 7, 3.5], "texture": "#1_7"}, "south": {"uv": [1, 0, 7, 4.5], "texture": "#4"}, @@ -28,8 +28,8 @@ } }, { - "from": [0, 0, 6], - "to": [2, 14, 16], + "from": [0, 2, 6], + "to": [2, 16, 16], "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, "faces": { "north": {"uv": [7, 9, 8, 16], "texture": "#4"}, @@ -41,8 +41,8 @@ } }, { - "from": [2, 5, 7], - "to": [14, 10.1, 15], + "from": [2, 7, 7], + "to": [14, 12.1, 15], "rotation": {"angle": 0, "axis": "y", "origin": [0, 0.1, 0]}, "faces": { "north": {"uv": [1, 16, 7, 13.5], "rotation": 180, "texture": "#4"}, @@ -50,8 +50,8 @@ } }, { - "from": [2, 0, 8], - "to": [14, 5, 16], + "from": [2, 2, 8], + "to": [14, 7, 16], "faces": { "north": {"uv": [1, 4.5, 7, 7], "texture": "#4"}, "south": {"uv": [1, 4.5, 7, 7], "texture": "#4"}, @@ -59,13 +59,24 @@ } }, { - "from": [2, 9.1, 7], - "to": [14, 10.1, 15], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": -22.5, "axis": "x", "origin": [8, 10.1, 7]}, + "from": [2, 11.1, 7], + "to": [14, 12.1, 15], + "rotation": {"angle": -22.5, "axis": "x", "origin": [8, 12.1, 7]}, "faces": { "up": {"uv": [1, 9.5, 7, 13.5], "rotation": 180, "texture": "#4"} } + }, + { + "from": [0, 0, 0], + "to": [16, 2, 16], + "faces": { + "north": {"uv": [0, 0, 16, 2], "texture": "#particle"}, + "east": {"uv": [0, 0, 16, 2], "texture": "#particle"}, + "south": {"uv": [0, 0, 16, 2], "texture": "#particle"}, + "west": {"uv": [0, 0, 16, 2], "texture": "#particle"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#particle"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#particle"} + } } ], "display": { @@ -103,4 +114,4 @@ "scale": [0.5, 0.5, 0.5] } } -} +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/contraption_controls/item.json b/src/main/resources/assets/create/models/block/contraption_controls/item.json index fc2bf7a29b..ef638c3c81 100644 --- a/src/main/resources/assets/create/models/block/contraption_controls/item.json +++ b/src/main/resources/assets/create/models/block/contraption_controls/item.json @@ -7,8 +7,9 @@ }, "elements": [ { - "from": [14, 0, 6], - "to": [16, 14, 16], + "from": [14, 2, 6], + "to": [16, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 2, 0]}, "faces": { "north": {"uv": [0, 9, 1, 16], "texture": "#4"}, "east": {"uv": [13, 0, 8, 7], "texture": "#4"}, @@ -19,8 +20,9 @@ } }, { - "from": [2, 5, 14], - "to": [14, 14, 16], + "from": [2, 7, 14], + "to": [14, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 2, 0]}, "faces": { "north": {"uv": [1, 9, 7, 13.5], "texture": "#4"}, "south": {"uv": [1, 0, 7, 4.5], "texture": "#4"}, @@ -28,9 +30,9 @@ } }, { - "from": [0, 0, 6], - "to": [2, 14, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "from": [0, 2, 6], + "to": [2, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 2, 0]}, "faces": { "north": {"uv": [7, 9, 8, 16], "texture": "#4"}, "east": {"uv": [11, 9, 16, 16], "texture": "#4"}, @@ -41,16 +43,18 @@ } }, { - "from": [2, 5, 7], - "to": [14, 10, 15], + "from": [2, 7, 7], + "to": [14, 12, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 2, 0]}, "faces": { "north": {"uv": [1, 16, 7, 13.5], "rotation": 180, "texture": "#4"}, "down": {"uv": [1, 16, 7, 12], "rotation": 180, "texture": "#4"} } }, { - "from": [2, 0, 8], - "to": [14, 5, 16], + "from": [2, 2, 8], + "to": [14, 7, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 2, 0]}, "faces": { "north": {"uv": [1, 4.5, 7, 7], "texture": "#4"}, "south": {"uv": [1, 4.5, 7, 7], "texture": "#4"}, @@ -58,10 +62,9 @@ } }, { - "from": [4.95, 8.5, 7.95], - "to": [11.05, 11, 14.05], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": -22.5, "axis": "x", "origin": [8, 10, 7]}, + "from": [4.95, 10.5, 7.95], + "to": [11.05, 13, 14.05], + "rotation": {"angle": -22.5, "axis": "x", "origin": [8, 12, 7]}, "faces": { "north": {"uv": [5.5, 12.5, 2.5, 13], "rotation": 180, "texture": "#4"}, "east": {"uv": [2.5, 13, 3, 10], "rotation": 90, "texture": "#4"}, @@ -71,22 +74,32 @@ } }, { - "from": [2, 9, 7], - "to": [14, 10, 15], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": -22.5, "axis": "x", "origin": [8, 10, 7]}, + "from": [2, 11, 7], + "to": [14, 12, 15], + "rotation": {"angle": -22.5, "axis": "x", "origin": [8, 12, 7]}, "faces": { "up": {"uv": [1, 9.5, 7, 13.5], "rotation": 180, "texture": "#4"} } }, { - "from": [2, 9.05, 8], - "to": [14, 10.05, 14], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": -22.5, "axis": "x", "origin": [8, 10, 7]}, + "from": [2, 11.05, 8], + "to": [14, 12.05, 14], + "rotation": {"angle": -22.5, "axis": "x", "origin": [8, 12, 7]}, "faces": { "up": {"uv": [1, 10, 7, 13], "rotation": 180, "texture": "#4"} } + }, + { + "from": [0, 0, 0], + "to": [16, 2, 16], + "faces": { + "north": {"uv": [0, 0, 16, 2], "texture": "#particle"}, + "east": {"uv": [0, 0, 16, 2], "texture": "#particle"}, + "south": {"uv": [0, 0, 16, 2], "texture": "#particle"}, + "west": {"uv": [0, 0, 16, 2], "texture": "#particle"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#particle"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#particle"} + } } ], "display": { @@ -125,4 +138,4 @@ "scale": [0.5, 0.5, 0.5] } } -} +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/controls/block_closed.json b/src/main/resources/assets/create/models/block/controls/block_closed.json index d6a68aaecd..de8d33a474 100644 --- a/src/main/resources/assets/create/models/block/controls/block_closed.json +++ b/src/main/resources/assets/create/models/block/controls/block_closed.json @@ -1,14 +1,16 @@ { "credit": "Made with Blockbench", "textures": { + "3": "create:block/train_controller_base", "4": "create:block/controls_frame", "1_7": "create:block/controls", "particle": "create:block/bogey/particle" }, "elements": [ { - "from": [14, 0, 6], - "to": [16, 14, 16], + "from": [14, 2, 6], + "to": [16, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 2, 0]}, "faces": { "north": {"uv": [0, 9, 1, 16], "texture": "#4"}, "east": {"uv": [13, 0, 8, 7], "texture": "#4"}, @@ -19,8 +21,9 @@ } }, { - "from": [2, 5, 14], - "to": [14, 14, 16], + "from": [2, 7, 14], + "to": [14, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 2, 0]}, "faces": { "north": {"uv": [1, 0, 7, 4.5], "texture": "#1_7"}, "south": {"uv": [1, 0, 7, 4.5], "texture": "#4"}, @@ -28,9 +31,9 @@ } }, { - "from": [0, 0, 6], - "to": [2, 14, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "from": [0, 2, 6], + "to": [2, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 2, 0]}, "faces": { "north": {"uv": [7, 9, 8, 16], "texture": "#4"}, "east": {"uv": [11, 9, 16, 16], "texture": "#4"}, @@ -41,8 +44,9 @@ } }, { - "from": [2, 5, 6], - "to": [14, 14, 14], + "from": [2, 7, 6], + "to": [14, 16, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 2, 0]}, "faces": { "north": {"uv": [1, 9.5, 7, 5], "rotation": 180, "texture": "#1_7"}, "up": {"uv": [1, 5, 7, 1], "texture": "#1_7"}, @@ -50,13 +54,26 @@ } }, { - "from": [2, 0, 8], - "to": [14, 5, 16], + "from": [2, 2, 8], + "to": [14, 7, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 2, 0]}, "faces": { "north": {"uv": [1, 13.5, 7, 16], "texture": "#4"}, "south": {"uv": [1, 4.5, 7, 7], "texture": "#4"}, "down": {"uv": [7, 12, 1, 16], "texture": "#1_7"} } + }, + { + "from": [0, 0, 0], + "to": [16, 2, 16], + "faces": { + "north": {"uv": [0, 0, 16, 2], "texture": "#3"}, + "east": {"uv": [0, 0, 16, 2], "texture": "#3"}, + "south": {"uv": [0, 0, 16, 2], "texture": "#3"}, + "west": {"uv": [0, 0, 16, 2], "texture": "#3"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#3"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#3"} + } } ], "display": { diff --git a/src/main/resources/assets/create/models/block/controls/block_open.json b/src/main/resources/assets/create/models/block/controls/block_open.json index 479cce1742..cf487782cb 100644 --- a/src/main/resources/assets/create/models/block/controls/block_open.json +++ b/src/main/resources/assets/create/models/block/controls/block_open.json @@ -1,14 +1,16 @@ { "credit": "Made with Blockbench", "textures": { + "3": "create:block/train_controller_base", "4": "create:block/controls_frame", "1_7": "create:block/controls", "particle": "create:block/bogey/particle" }, "elements": [ { - "from": [14, 0, 6], - "to": [16, 14, 16], + "from": [14, 2, 6], + "to": [16, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 2, 0]}, "faces": { "north": {"uv": [0, 9, 1, 16], "texture": "#4"}, "east": {"uv": [13, 0, 8, 7], "texture": "#4"}, @@ -19,8 +21,9 @@ } }, { - "from": [2, 5, 14], - "to": [14, 14, 16], + "from": [2, 7, 14], + "to": [14, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 2, 0]}, "faces": { "north": {"uv": [1, 0, 7, 4.5], "texture": "#1_7"}, "south": {"uv": [1, 0, 7, 4.5], "texture": "#4"}, @@ -28,9 +31,9 @@ } }, { - "from": [0, 0, 6], - "to": [2, 14, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "from": [0, 2, 6], + "to": [2, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 2, 0]}, "faces": { "north": {"uv": [7, 9, 8, 16], "texture": "#4"}, "east": {"uv": [11, 9, 16, 16], "texture": "#4"}, @@ -41,8 +44,9 @@ } }, { - "from": [2, 5, 7], - "to": [14, 13.05, 15], + "from": [2, 7, 7], + "to": [14, 15.05, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 2, 0]}, "faces": { "north": {"uv": [1, 14, 7, 10.05], "rotation": 180, "texture": "#4"}, "up": {"uv": [1, 13.5, 7, 9.55], "texture": "#4"}, @@ -50,13 +54,26 @@ } }, { - "from": [2, 0, 8], - "to": [14, 5, 16], + "from": [2, 2, 8], + "to": [14, 7, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 2, 0]}, "faces": { "north": {"uv": [1, 13.5, 7, 16], "texture": "#4"}, "south": {"uv": [1, 4.5, 7, 7], "texture": "#4"}, "down": {"uv": [7, 12, 1, 16], "texture": "#1_7"} } + }, + { + "from": [0, 0, 0], + "to": [16, 2, 16], + "faces": { + "north": {"uv": [0, 0, 16, 2], "texture": "#3"}, + "east": {"uv": [0, 0, 16, 2], "texture": "#3"}, + "south": {"uv": [0, 0, 16, 2], "texture": "#3"}, + "west": {"uv": [0, 0, 16, 2], "texture": "#3"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#3"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#3"} + } } ], "display": { diff --git a/src/main/resources/assets/create/models/block/controls/block_virtual.json b/src/main/resources/assets/create/models/block/controls/block_virtual.json index 373b44c1ba..6e2b4c4701 100644 --- a/src/main/resources/assets/create/models/block/controls/block_virtual.json +++ b/src/main/resources/assets/create/models/block/controls/block_virtual.json @@ -1,16 +1,16 @@ { "credit": "Made with Blockbench", "textures": { + "3": "create:block/train_controller_base", "4": "create:block/controls_frame", "1_7": "create:block/controls", "particle": "create:block/bogey/particle" }, "elements": [ { - "from": [4, 9, -1], - "to": [6, 11, 9], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": 22.5, "axis": "x", "origin": [0, 10, 11]}, + "from": [4, 11, -1], + "to": [6, 13, 9], + "rotation": {"angle": 22.5, "axis": "x", "origin": [0, 12, 11]}, "faces": { "north": {"uv": [8, 1.5, 9, 2.5], "rotation": 180, "texture": "#1_7"}, "east": {"uv": [9, 3, 8, 8], "rotation": 90, "texture": "#1_7"}, @@ -20,10 +20,9 @@ } }, { - "from": [10, 9, -1], - "to": [12, 11, 9], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": 22.5, "axis": "x", "origin": [0, 10, 11]}, + "from": [10, 11, -1], + "to": [12, 13, 9], + "rotation": {"angle": 22.5, "axis": "x", "origin": [0, 12, 11]}, "faces": { "north": {"uv": [8, 1.5, 9, 2.5], "rotation": 180, "texture": "#1_7"}, "east": {"uv": [9, 3, 8, 8], "rotation": 90, "texture": "#1_7"}, @@ -33,8 +32,9 @@ } }, { - "from": [2, 4.95, 6.75], - "to": [14, 13.2, 14], + "from": [2, 6.95, 6.75], + "to": [14, 15.2, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 2, 0]}, "faces": { "north": {"uv": [9.5, 3.5, 15.5, 0], "texture": "#1_7"}, "up": {"uv": [9.5, 0, 15.5, 3.5], "rotation": 180, "texture": "#1_7"}, @@ -42,8 +42,9 @@ } }, { - "from": [14, 0, 6], - "to": [16, 14, 16], + "from": [14, 2, 6], + "to": [16, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 2, 0]}, "faces": { "north": {"uv": [0, 9, 1, 16], "texture": "#4"}, "east": {"uv": [13, 0, 8, 7], "texture": "#4"}, @@ -54,8 +55,9 @@ } }, { - "from": [2, 5, 14], - "to": [14, 14, 16], + "from": [2, 7, 14], + "to": [14, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 2, 0]}, "faces": { "north": {"uv": [1, 0, 7, 4.5], "texture": "#1_7"}, "south": {"uv": [1, 0, 7, 4.5], "texture": "#4"}, @@ -63,9 +65,9 @@ } }, { - "from": [0, 0, 6], - "to": [2, 14, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "from": [0, 2, 6], + "to": [2, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 2, 0]}, "faces": { "north": {"uv": [7, 9, 8, 16], "texture": "#4"}, "east": {"uv": [11, 9, 16, 16], "texture": "#4"}, @@ -76,8 +78,9 @@ } }, { - "from": [2, 5, 7], - "to": [14, 13.05, 15], + "from": [2, 7, 7], + "to": [14, 15.05, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 2, 0]}, "faces": { "north": {"uv": [1, 14, 7, 10], "rotation": 180, "texture": "#4"}, "up": {"uv": [1, 13.5, 7, 9.5], "texture": "#4"}, @@ -85,13 +88,26 @@ } }, { - "from": [2, 0, 8], - "to": [14, 5, 16], + "from": [2, 2, 8], + "to": [14, 7, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 2, 0]}, "faces": { "north": {"uv": [1, 13.5, 7, 16], "texture": "#4"}, "south": {"uv": [1, 4.5, 7, 7], "texture": "#4"}, "down": {"uv": [7, 12, 1, 16], "texture": "#1_7"} } + }, + { + "from": [0, 0, 0], + "to": [16, 2, 16], + "faces": { + "north": {"uv": [0, 0, 16, 2], "texture": "#3"}, + "east": {"uv": [0, 0, 16, 2], "texture": "#3"}, + "south": {"uv": [0, 0, 16, 2], "texture": "#3"}, + "west": {"uv": [0, 0, 16, 2], "texture": "#3"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#3"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#3"} + } } ] -} +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/controls/item.json b/src/main/resources/assets/create/models/block/controls/item.json index fd92033ed0..57f14d633e 100644 --- a/src/main/resources/assets/create/models/block/controls/item.json +++ b/src/main/resources/assets/create/models/block/controls/item.json @@ -1,16 +1,16 @@ { "credit": "Made with Blockbench", "textures": { + "3": "create:block/train_controller_base", "4": "create:block/controls_frame", "1_7": "create:block/controls", "particle": "create:block/bogey/particle" }, "elements": [ { - "from": [4, 9, -1], - "to": [6, 11, 9], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": 45, "axis": "x", "origin": [0, 10, 11]}, + "from": [4, 11, -1], + "to": [6, 13, 9], + "rotation": {"angle": 45, "axis": "x", "origin": [0, 12, 11]}, "faces": { "north": {"uv": [8, 1.5, 9, 2.5], "rotation": 180, "texture": "#1_7"}, "east": {"uv": [9, 3, 8, 8], "rotation": 90, "texture": "#1_7"}, @@ -20,10 +20,9 @@ } }, { - "from": [10, 9, -1], - "to": [12, 11, 9], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": 22.5, "axis": "x", "origin": [0, 10, 11]}, + "from": [10, 11, -1], + "to": [12, 13, 9], + "rotation": {"angle": 22.5, "axis": "x", "origin": [0, 12, 11]}, "faces": { "north": {"uv": [8, 1.5, 9, 2.5], "rotation": 180, "texture": "#1_7"}, "east": {"uv": [9, 3, 8, 8], "rotation": 90, "texture": "#1_7"}, @@ -33,8 +32,9 @@ } }, { - "from": [2, 4.95, 6.75], - "to": [14, 13.2, 14], + "from": [2, 6.95, 6.75], + "to": [14, 15.2, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 2, 0]}, "faces": { "north": {"uv": [9.5, 3.5, 15.5, 0], "texture": "#1_7"}, "up": {"uv": [9.5, 0, 15.5, 3.5], "rotation": 180, "texture": "#1_7"}, @@ -42,8 +42,9 @@ } }, { - "from": [14, 0, 6], - "to": [16, 14, 16], + "from": [14, 2, 6], + "to": [16, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 2, 0]}, "faces": { "north": {"uv": [0, 9, 1, 16], "texture": "#4"}, "east": {"uv": [13, 0, 8, 7], "texture": "#4"}, @@ -54,8 +55,9 @@ } }, { - "from": [2, 5, 14], - "to": [14, 14, 16], + "from": [2, 7, 14], + "to": [14, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 2, 0]}, "faces": { "north": {"uv": [1, 0, 7, 4.5], "texture": "#1_7"}, "south": {"uv": [1, 0, 7, 4.5], "texture": "#4"}, @@ -63,9 +65,9 @@ } }, { - "from": [0, 0, 6], - "to": [2, 14, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "from": [0, 2, 6], + "to": [2, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 2, 0]}, "faces": { "north": {"uv": [7, 9, 8, 16], "texture": "#4"}, "east": {"uv": [11, 9, 16, 16], "texture": "#4"}, @@ -76,8 +78,9 @@ } }, { - "from": [2, 5, 7], - "to": [14, 13, 15], + "from": [2, 7, 7], + "to": [14, 15, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 2, 0]}, "faces": { "north": {"uv": [1, 14, 7, 10], "rotation": 180, "texture": "#4"}, "up": {"uv": [1, 13.5, 7, 9.5], "texture": "#4"}, @@ -85,13 +88,26 @@ } }, { - "from": [2, 0, 8], - "to": [14, 5, 16], + "from": [2, 2, 8], + "to": [14, 7, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 2, 0]}, "faces": { "north": {"uv": [1, 13.5, 7, 16], "texture": "#4"}, "south": {"uv": [1, 4.5, 7, 7], "texture": "#4"}, "down": {"uv": [7, 12, 1, 16], "texture": "#1_7"} } + }, + { + "from": [0, 0, 0], + "to": [16, 2, 16], + "faces": { + "north": {"uv": [0, 0, 16, 2], "texture": "#3"}, + "east": {"uv": [0, 0, 16, 2], "texture": "#3"}, + "south": {"uv": [0, 0, 16, 2], "texture": "#3"}, + "west": {"uv": [0, 0, 16, 2], "texture": "#3"}, + "up": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#3"}, + "down": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#3"} + } } ], "display": { @@ -130,4 +146,4 @@ "scale": [0.5, 0.5, 0.5] } } -} +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/package_frogport/tongue.json b/src/main/resources/assets/create/models/block/package_frogport/tongue.json index 40a5d61bfd..f0a481059d 100644 --- a/src/main/resources/assets/create/models/block/package_frogport/tongue.json +++ b/src/main/resources/assets/create/models/block/package_frogport/tongue.json @@ -6,10 +6,14 @@ }, "elements": [ { - "from": [6, 10, 4], + "from": [6, 9, 4], "to": [10, 10, 11], - "rotation": {"angle": 0, "axis": "y", "origin": [6, 10, 4]}, + "rotation": {"angle": 0, "axis": "y", "origin": [6, 9, 4]}, "faces": { + "north": {"uv": [6, 3, 8, 3.5], "texture": "#0"}, + "east": {"uv": [6, 3.5, 6.5, 0], "rotation": 90, "texture": "#0"}, + "south": {"uv": [6, 0, 8, 0.5], "texture": "#0"}, + "west": {"uv": [7.5, 0, 8, 3.5], "rotation": 90, "texture": "#0"}, "up": {"uv": [6, 0, 8, 3.5], "rotation": 180, "texture": "#0"}, "down": {"uv": [6, 0, 8, 3.5], "texture": "#0"} } diff --git a/src/main/resources/assets/create/textures/block/basin.png b/src/main/resources/assets/create/textures/block/basin.png index 83b8bca696e336a623409f5f643ca49a80dbdc90..2ef8e0a911513c3a2ff966b2d261c5e9e4f1fb55 100644 GIT binary patch delta 978 zcmV;@11)cW$!p+*&4oW z!5Pcuu~(aK`sC5PW>=y8zB! zE}^x?*=mKkln}ESK7Ia*x~lN)@)E{0c=ywf0Dzz0yvgV&{~5t2GcL9q>Pyw(?F>yY9gpYV10G9MSoZ*f^!~$_;iwirob@(&KRabKuOsZ znv|#*LrsM9^OxEFh5(0v+5aH>Z8q{PVktNP)I^vHf%RsSITl5c`Gv8eb+@eNUG_fT zj$PTu8qiv!aV{QzA0;JTEtkM@nFTeMGVXo41xl*D4CHJG_~y0`v=5*tiY%i57>=8g zGJ>Xl;r(WF)jdP?*=-l)kb!P(lj}e#6k%IlB`l;tq=GWWfNyR`nFtJ|0W)KoOl;Dc zs7Epn>KEpPOhBC$aL*$XA*eL-bpHWh^4l*T;k}13P0Xr)s;YP_!>_6;R8OhF`I`}Fk>NMfYn4e zTdlCh24|~P)Pk`S003A4>rLld6M@JA0HmB{!8~MP-pT9NZ|}MVL{?P0EbKXv!!ayg zS3i7zj;RoTnI?=~rBm@88t3rW-~SvZfDa$uA@lU+#l^+RQzn*Wd6yQelmcyg^Egm;8f%E9 zG#_FCoUzlrmr>i^WP!3R+8=4EZ(fF(1pvlQcLtb$1rQ4EIX0ZjIY-;xK+0`aIp-j< z(I-mrv9=&(;VIuHhkzX;_zC`Jn;cRDM+xAN$z#Fq(}J;Yoem5Y@0m3au3RF!^B4}> zc;>9#YPTL^h6s4^Vhd!K5QRo`$O1do7NjEdkR&s93h&$dhD2+PvMlc&ql)QeR42Yq z=??-ec-NHn9nn0I*7WL4GZnKLTxeJa?fP@=KOmw?_JO7ZZU6uP07*qoM6N<$g7|&U Aod5s; delta 481 zcmV<70UrMO2k--s8Gi!+002a!ipBr{05ecbR7C)1SpWb4b#ZZSX=!I+VOdyMPft%t zNJvCPL_a=4IypTxG&nFYGb<}DCnqZ+A}0U<00E5Y$N&HU0d!JMQvg8b*k%9#00Cl4 zM??UK1szBL000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2Y=`Z77Hdd*O~E~0003t zNklQ{)3)Ka5p6rM6d+G{oU#bB z_^a=dRkajDd2smECkN!fm+Phb)0`VK%j+y@1q4Uoghzw z5C}*d09GgPJHZwD90h_^AqaPg{!fV?3H&4BtH}>-z7L9)L46(d*UK9JXuoa0_4T@6 X+_@k0=#*1t00000NkvXXu0mjf_l(2b diff --git a/src/main/resources/assets/create/textures/block/contraption_controls_frame.png b/src/main/resources/assets/create/textures/block/contraption_controls_frame.png index 4c18e31d295e56c637613ffb79354821e1b36d42..4065a9f9c0d8796a3aaac50c560ab3db6d11780c 100644 GIT binary patch delta 1370 zcmV-g1*Q6o1>y>j8Gi-<0047(dh`GQ00v@9M??Vs0RI60puMM)00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF;2!8Vnr<8)DXo000Ea!>F(DWNb+8oD zme#S4?IgC7W*5dTX%dQ7E_rT_`}&;cynfH~o;)pFzItU~SpwIUSeBq@7<4(P zss>Y9k)jHsY%myr8OBUc!L+VW)D@zrhbR}BvIL?kD1YfHb9RZOKg>~9k4fPC;w-%a z2vdI((h1^(Sy94^K$sduU1N7o=1Btd3Sf&8E+9QgtzO0`>KJ1<7OL9h1hR*AHwK_o zOecHM;iPU9qn6a6c+yTlq@oLDa4g3pOyy*miuH7HRXmKyk+HvzaK|A8n=4+%i&yz=w3EC0uZdQdBelW`M5g#!Q zh09m33|80IaGX7CyPl8ZaCFYSKQ|^i9e`^;TpJwatW;C8;(I=hvxj0?f=@49s-% znNG`2e+TSZ4Rd3IPzDn>cpq4n!1w(0DmF!#d7ys(LArq`4}G2MO1hmccCE(p#(xIJ zl!7VBClX&)fvKWlAgTgyN}(~G5QHJyjpoRLqERFWLmsLFss}wpHMQ_3u0Xfbq1kvv zV>+R~yh0quBj;yXB3E&Ld4-4SfM(-W?)y&yB|C!t@(KW&rr|hySayx2^B3|Ks#Gg^ za@z9BiH{&_Yb7h=+wFGu_q$`;P=C|3p}8kH0@syTb`52_xkD%eYm*5^IPRfo3ZV?xZtk3@0=8X8nO~R#V6DE7uBk+E!t-61*>Z_eQKR2KV8DQ_ zeV=o47L}5c8HuM_WN8TR|gQKqEv$MSoX4AyPghRy-h8JRem$ zA5%IWK0QHDHylkk97!}BHa0p(GaN}U7&SCBLN69SDHACvDI+5zSOEb^0|h_<0W1ap z43k_!00001bW%=J06^y0W&i*IiAh93RCwCWQh#&WFbs8L$(SOujhcy-v5>86#*+RD zI8eU-2de@$*MB4J_1`|*vi5seH#q|5#)pYT6OIaeKz~uvXnR_=HUwh|sPdX7v zuo}BTe(6W!+zmx-AreU-Vn0}Y@ou>CL%$l3PDB(;CV%tUY(A6Ft;vM4sw3nS1y%JR z^AH{+R91JJ%=tT2F!ZW$BPXW6eiM_UYiD&LqM%;afB$a^3HLvXa{Wk<&hMFo4@|N> znfyFpG%`9I4jkzN34lgX)-)kBL85FKrFTpMW>l=3&}so-+crA=Ku0hrg6F0M(UNJK zXP_jAKzBuYyOW0k+iZ85dOz4~w-3ky6ZYH8_J4qVXt7IyA?)8wA?{6A6|`;8=K`aw zeqE+MOTk7lESJk_DVX0>H*j7iDhsbW3T!V0VNuqnjzW4vApLXdD5SmzBdv7mD8uK1 Y7tHxVKK&2mi2wiq07*qoM6N<$f@p67ssI20 diff --git a/src/main/resources/assets/create/textures/block/controls_frame.png b/src/main/resources/assets/create/textures/block/controls_frame.png index 103e53d36f854528665adc8ca449394ee90127dc..671dcbc592c24b2fad72c49707dc96142e88835d 100644 GIT binary patch delta 1046 zcmV+x1nK+Q1E2_y8Gi-<0047(dh`GQ00v@9M??Vs0RI60puMM)00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF;2!8VoBTH+1rr000B6Nkl2xlwazZ>}$qzhbglO8bL)p#bx*!_m(nvD0V_e&wi?J2a~)YV||j zdG`{lrL>9*=zl6@6M$wl#rEC%BVR`Q?Ar3 zCCFqm2-BD;E_NOd4=%y17UMaa=9SGmhL2lqvJ07!V$Y|Jmw^=avn4Q%&^%Ko@UXde zrV-heJ%3Uh^m)yt_Ua;#qtj~BX|?@%rcU7cVvp2C1Jihlp3s2=PTx_xJE4buLqe^2 z-@&qD9CqzN%k8kfAjzgL`15#imfh#DYg3I%VE^EW61vB@vP)dVaivRK#7QQf3HOgW zB$I+(PrbP-UG@*2z>+%qM^2x3*T!;>0qM`-N`IGjL`7fN3j>(jys>tA=esZ1{$z`l z&p++WiT29 zUE{IgO*f9;g1)GYIx9&%cOHlZiN+(_C=){X*X@6ypx_etOqkAQ5JDhKgW|Q~n6L~| z8s}C4E%cnF>{B;#RO$$`Y9aVu!xx+_m zI_Zl7X&>YCE%bzrFtovcCqzp^pQlppOsv3LOAe-yK+pMI4YMld2-Up2U@^tvXLnuF{`kKC>x}oyY|fxsuX#^` zVLFUhKYCg;cvv=YQZ7$cR&qx%VM{J$Nhm~1Oj<-FRXQI!KtoVB98EYJFg7_tFBU&3 z6DKP$9w8>*)WUWE0004WQchCMcaOiwV6zQ)v?P);eue-U8F#5viNGr6EDqM`tSSC{yu;E!qeW2WlQ z^y)g zo&CDLrAwImwmtgQpg}iO2!-0V+s>m4yKzUq9sv-LD|oXcASnO<002ovPDHLkV1jVx B%5DGv diff --git a/src/main/resources/assets/create/textures/block/train_controller_base.png b/src/main/resources/assets/create/textures/block/train_controller_base.png new file mode 100644 index 0000000000000000000000000000000000000000..47f7025781fc469cb0eb7052c013831ddc9ca1c3 GIT binary patch literal 472 zcmV;}0Vn>6P)GH7>6o|26&o;fj~%r>udQTs;a1T!`Nl;h~RAA#gK5KDU@lk|+Y8 zWI7685V%kas%WM0y)ux+wV-Ox->vi;O*0)pD^1zi*m(N3+HPQ`7KBUJ1>kW|M)-ny zqq3VplCA+zNzn^mu>LssnSoZiP@HF!2b!8cH85b~wbGWIR+@OSLj#$D=Vk!oRq~~Q z$q8Q&Hgg)7odzxi!92H&OpDA+Y#0%_+I1l>;yw%(%O~u Date: Thu, 3 Oct 2024 19:38:10 +0200 Subject: [PATCH 067/515] Item shopper showstopper - Player2player trading experimentation --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 8 +- .../82992cbf8f2794d83ac94034835eac0acd7915b9 | 6 +- .../resources/assets/create/lang/en_ud.json | 3 + .../resources/assets/create/lang/en_us.json | 3 + .../create/models/item/display_cloth.json | 6 + .../create/models/item/shopping_list.json | 6 + .../appliances/display_cloth_clear.json | 35 ++ .../logistics/redstone_requester_clear.json | 35 ++ .../appliances/display_cloth_clear.json | 12 + .../logistics/redstone_requester_clear.json | 12 + .../simibubi/create/AllCreativeModeTabs.java | 1 + .../com/simibubi/create/AllEntityTypes.java | 6 + .../java/com/simibubi/create/AllItems.java | 11 + .../com/simibubi/create/AllMenuTypes.java | 5 + .../java/com/simibubi/create/AllPackets.java | 6 +- .../com/simibubi/create/AllPartialModels.java | 2 + .../simibubi/create/compat/jei/CreateJEI.java | 2 + .../equipment/blueprint/BlueprintEntity.java | 6 + .../blueprint/BlueprintOverlayRenderer.java | 124 +++++- .../content/logistics/box/PackageItem.java | 3 +- .../logistics/depot/DepotRenderer.java | 10 +- .../BlueprintOverlayShopContext.java | 5 + .../displayCloth/DisplayClothEntity.java | 417 ++++++++++++++++++ .../displayCloth/DisplayClothItem.java | 78 ++++ .../DisplayClothOverlayRenderer.java | 56 +++ .../displayCloth/DisplayClothPacket.java | 35 ++ .../DisplayClothPacketToClient.java | 35 ++ .../DisplayClothPacketToServer.java | 36 ++ .../displayCloth/DisplayClothPricingMenu.java | 83 ++++ .../DisplayClothPricingScreen.java | 141 ++++++ .../displayCloth/DisplayClothRenderer.java | 72 +++ .../displayCloth/ShoppingListItem.java | 193 ++++++++ .../LogisticallyLinkedBlockItem.java | 4 +- .../redstoneRequester/AutoRequestData.java | 81 ++++ .../RedstoneRequesterBlock.java | 83 ++-- .../RedstoneRequesterBlockEntity.java | 40 +- .../LogisticalStockRequestPacket.java | 5 + .../logistics/stockTicker/PackageOrder.java | 4 +- .../stockTicker/StockTickerBlockEntity.java | 34 +- .../StockTickerInteractionHandler.java | 67 ++- .../stockTicker/StockTickerRequestScreen.java | 16 +- .../data/recipe/StandardRecipeGen.java | 11 +- .../foundation/events/ClientEvents.java | 3 +- .../create/foundation/gui/AllGuiTextures.java | 3 + .../create/models/entity/display_cloth.json | 81 ++++ .../create/textures/entity/display_cloth.png | Bin 0 -> 168 bytes .../assets/create/textures/gui/widgets.png | Bin 9904 -> 10512 bytes .../create/textures/item/display_cloth.png | Bin 0 -> 233 bytes .../create/textures/item/shopping_list.png | Bin 0 -> 261 bytes .../assets/minecraft/atlases/blocks.json | 4 + 50 files changed, 1728 insertions(+), 161 deletions(-) create mode 100644 src/generated/resources/assets/create/models/item/display_cloth.json create mode 100644 src/generated/resources/assets/create/models/item/shopping_list.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/appliances/display_cloth_clear.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/redstone_requester_clear.json create mode 100644 src/generated/resources/data/create/recipes/crafting/appliances/display_cloth_clear.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/redstone_requester_clear.json create mode 100644 src/main/java/com/simibubi/create/content/logistics/displayCloth/BlueprintOverlayShopContext.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothEntity.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothItem.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothOverlayRenderer.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothPacket.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothPacketToClient.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothPacketToServer.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothPricingMenu.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothPricingScreen.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothRenderer.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/displayCloth/ShoppingListItem.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/redstoneRequester/AutoRequestData.java create mode 100644 src/main/resources/assets/create/models/entity/display_cloth.json create mode 100644 src/main/resources/assets/create/textures/entity/display_cloth.png create mode 100644 src/main/resources/assets/create/textures/item/display_cloth.png create mode 100644 src/main/resources/assets/create/textures/item/shopping_list.png diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 3eb8ee2960..de4d058384 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-09-25T12:48:56.6991439 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-10-02T12:38:33.0949918 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -593,8 +593,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -1ec09657f3c9425729cb4554977f350ae331ff6a assets/create/lang/en_ud.json -6bc1528908d08a24a9a6a6923e96bd5bbbef28d7 assets/create/lang/en_us.json +279ab42e8827434b1912a0ab32e0cd951e18b54b assets/create/lang/en_ud.json +8ca5795ff276ec5025638eebed07cc0498ef39f8 assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -1922,6 +1922,7 @@ eef3be2fa3b6424436a553e3c1bfee3979015962 assets/create/models/item/cyan_seat.jso aa44d681c3ccffe08aedbda093062b1a5ab3302e assets/create/models/item/depot.json 85a5830ca034be9a0ed534186210aa975278b20b assets/create/models/item/diorite_pillar.json 2a992f0961b8bab5628e075da413c91e903e424c assets/create/models/item/display_board.json +e71e3c355c4a9266e359e88278b238e38f15d9ea assets/create/models/item/display_cloth.json 0dd4d33644c9ec7dbf920d7fd7b713e4b413b330 assets/create/models/item/display_link.json eb750000addd1c25e79fc9fb277ccdcc3274852c assets/create/models/item/dough.json 5803643723c0aa65d6c531c1f9798556cd36d21a assets/create/models/item/dripstone_pillar.json @@ -2170,6 +2171,7 @@ ff36a19e124caf2ee8a03767e39601df6866075b assets/create/models/item/secondary_lin abaa6da82babc26717ffff44fc41327bd015c9a6 assets/create/models/item/shadow_steel.json ffaec38d11b91add4e150e33d0e0e49394f5beca assets/create/models/item/shadow_steel_casing.json b6fcd9722e5a09a9207964cba68752512e3b945a assets/create/models/item/shaft.json +617c6e2f759b2a95da7ee7192a2661afc6f6e8f8 assets/create/models/item/shopping_list.json 58ca190177e77db90c8195347c29d52c2cd0c556 assets/create/models/item/small_andesite_bricks.json fa92996fada8545fc340fb401bd0568f56809bf0 assets/create/models/item/small_andesite_brick_slab.json 08474bf814a55795c1f94203ceb8a969be2a2132 assets/create/models/item/small_andesite_brick_stairs.json diff --git a/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 b/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 index 85667da53b..f21438561f 100644 --- a/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 +++ b/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 @@ -1,4 +1,4 @@ -// 1.20.1 2024-09-25T12:48:56.7958848 Create's Standard Recipes +// 1.20.1 2024-10-02T12:38:33.1742888 Create's Standard Recipes a8cc4af26f6c7c45a9eef12e92af1452fe042454 data/create/advancements/recipes/combat/crafting/appliances/netherite_backtank.json 2c2639c7b307ee7c7a4e97e5efebf496788998ad data/create/advancements/recipes/combat/crafting/appliances/netherite_backtank_from_netherite.json 81dcf0cb1aa99e39bc7d1a386e07cad4cee7d8b9 data/create/advancements/recipes/combat/crafting/appliances/netherite_diving_boots.json @@ -40,6 +40,7 @@ b90af96817d6c38ec446f7464642a473a55c2027 data/create/advancements/recipes/misc/b 029e463d5eea7ae590577fdfab52664036727985 data/create/advancements/recipes/misc/crafting/appliances/copper_diving_boots.json 5d5b4c49e81090a48c23314c49815f61ac170518 data/create/advancements/recipes/misc/crafting/appliances/copper_diving_helmet.json 0746cb63e224d7620e781e1494b9a8b9d56b186b data/create/advancements/recipes/misc/crafting/appliances/crafting_blueprint.json +4bd1ab25286d5a9dce7cafd1f814113f21a6969d data/create/advancements/recipes/misc/crafting/appliances/display_cloth_clear.json c4d0901541855ea2fda0cef7f0270edfa16d70e2 data/create/advancements/recipes/misc/crafting/appliances/dough.json 79b6501f8cb069dc55b78871a5fecf40a5b3dbd5 data/create/advancements/recipes/misc/crafting/appliances/filter_clear.json 3271ad36fbab51d87d0baad8c69cb7b2add506b8 data/create/advancements/recipes/misc/crafting/appliances/linked_controller.json @@ -176,6 +177,7 @@ c443707391ce79dc1ec8cfacee74757b0c00bd3e data/create/advancements/recipes/misc/c 77c3df89a06fc10cd8bd1cc35f0353441860ec11 data/create/advancements/recipes/misc/crafting/logistics/pulse_repeater.json 96b4998626e624fb79c79fb754c28b21ddc27254 data/create/advancements/recipes/misc/crafting/logistics/redstone_contact.json 1b50ed47c37e48d1112c76059574eed71ecea4e5 data/create/advancements/recipes/misc/crafting/logistics/redstone_link.json +cea78bc9b093a8a6a85ef1df53ddf11d9c37a114 data/create/advancements/recipes/misc/crafting/logistics/redstone_requester_clear.json 831588b3f29411d5c4b358006051152eb2b23e6b data/create/advancements/recipes/misc/crafting/logistics/stockpile_switch.json 1e0fc9f4971286a69d9706006bd8358931382c9c data/create/advancements/recipes/misc/crafting/logistics/stock_ticker_clear.json cb416511a219d2bc5806c6880c01820a8b563b80 data/create/advancements/recipes/misc/crafting/materials/andesite_alloy.json @@ -281,6 +283,7 @@ b3c4585dc6ed9c4a38d7923ae399b88ab8912df9 data/create/recipes/blasting/zinc_ingot c500139f545fea4568575b93b1ab9e56f004f137 data/create/recipes/crafting/appliances/copper_diving_boots.json 77b28e10fcbe223f8235b193e899046b382382c9 data/create/recipes/crafting/appliances/copper_diving_helmet.json 3e3f71d579ec7453e453d5b65aaee3c43169b679 data/create/recipes/crafting/appliances/crafting_blueprint.json +4516e2c533f753f9d3802ae3c9c1400866ad3a31 data/create/recipes/crafting/appliances/display_cloth_clear.json b7c8f3c5e80749c6c38d5c0153dc68a79c32535f data/create/recipes/crafting/appliances/dough.json 409b5d70ee1ef9164c327d79472e6d66ce55dec6 data/create/recipes/crafting/appliances/filter_clear.json 265ead7993ae9e9b617dbfae749a77fed6b7b1ba data/create/recipes/crafting/appliances/linked_controller.json @@ -424,6 +427,7 @@ aa8a704ad643ff5f06db34f4047f7f740a556236 data/create/recipes/crafting/logistics/ 8b0b342baa18cc47c7a60a3c9812fece28210cf6 data/create/recipes/crafting/logistics/pulse_repeater.json c81f852f1d1514184ff235e790a6ca907f7b6ad4 data/create/recipes/crafting/logistics/redstone_contact.json 00877e6b56f28d8691080ef18b654f0a141835ce data/create/recipes/crafting/logistics/redstone_link.json +8446b3ca07575ea978ddde4121900207d54be8b3 data/create/recipes/crafting/logistics/redstone_requester_clear.json eff0d37e98e8badd8d2c3c9de17ee5560b110dbd data/create/recipes/crafting/logistics/stockpile_switch.json 38aa7b9b3c4724ec8b8d94f00a98d684110ad5ca data/create/recipes/crafting/logistics/stock_ticker_clear.json ac524c110f66a7433208a888c5f3bb69e5e95743 data/create/recipes/crafting/materials/andesite_alloy.json diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 61b26871ee..91b62b5568 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -2729,6 +2729,7 @@ "entity.create.carriage_contraption": "uoıʇdɐɹʇuoƆ ǝbɐıɹɹɐƆ", "entity.create.contraption": "uoıʇdɐɹʇuoƆ", "entity.create.crafting_blueprint": "ʇuıɹdǝnןᗺ buıʇɟɐɹƆ", + "entity.create.display_cloth": "ɥʇoןƆ ʎɐןdsıᗡ", "entity.create.gantry_contraption": "uoıʇdɐɹʇuoƆ ʎɹʇuɐ⅁", "entity.create.package": "ǝbɐʞɔɐԀ", "entity.create.potato_projectile": "ǝןıʇɔǝظoɹԀ oʇɐʇoԀ", @@ -2805,6 +2806,7 @@ "item.create.crushed_raw_tin": "uı⟘ ʍɐᴚ pǝɥsnɹƆ", "item.create.crushed_raw_uranium": "ɯnıuɐɹ∩ ʍɐᴚ pǝɥsnɹƆ", "item.create.crushed_raw_zinc": "ɔuıZ ʍɐᴚ pǝɥsnɹƆ", + "item.create.display_cloth": "ɥʇoןƆ ʎɐןdsıᗡ", "item.create.dough": "ɥbnoᗡ", "item.create.electron_tube": "ǝqn⟘ uoɹʇɔǝןƎ", "item.create.empty_blaze_burner": "ɹǝuɹnᗺ ǝzɐןᗺ ʎʇdɯƎ", @@ -2904,6 +2906,7 @@ "item.create.schematic_and_quill.tooltip.condition2": "buıʌɐS puɐ buıʇsnظpⱯ", "item.create.schematic_and_quill.tooltip.summary": "˙‾ǝןıɟ ʇqu˙‾ ɐ oʇ pןɹoʍ ɹnoʎ uı ‾ǝɹnʇɔnɹʇS ɐ buıʌɐs‾ ɹoɟ pǝs∩", "item.create.shadow_steel": "ןǝǝʇS ʍopɐɥS", + "item.create.shopping_list": "ʇsıꞀ buıddoɥS", "item.create.sturdy_sheet": "ʇǝǝɥS ʎpɹnʇS", "item.create.super_glue": "ǝnן⅁ ɹǝdnS", "item.create.sweet_roll": "ןןoᴚ ʇǝǝʍS", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 041cc43254..248260c574 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -2729,6 +2729,7 @@ "entity.create.carriage_contraption": "Carriage Contraption", "entity.create.contraption": "Contraption", "entity.create.crafting_blueprint": "Crafting Blueprint", + "entity.create.display_cloth": "Display Cloth", "entity.create.gantry_contraption": "Gantry Contraption", "entity.create.package": "Package", "entity.create.potato_projectile": "Potato Projectile", @@ -2805,6 +2806,7 @@ "item.create.crushed_raw_tin": "Crushed Raw Tin", "item.create.crushed_raw_uranium": "Crushed Raw Uranium", "item.create.crushed_raw_zinc": "Crushed Raw Zinc", + "item.create.display_cloth": "Display Cloth", "item.create.dough": "Dough", "item.create.electron_tube": "Electron Tube", "item.create.empty_blaze_burner": "Empty Blaze Burner", @@ -2904,6 +2906,7 @@ "item.create.schematic_and_quill.tooltip.condition2": "Adjusting and Saving", "item.create.schematic_and_quill.tooltip.summary": "Used for _saving a Structure_ in your world to a _.nbt file_.", "item.create.shadow_steel": "Shadow Steel", + "item.create.shopping_list": "Shopping List", "item.create.sturdy_sheet": "Sturdy Sheet", "item.create.super_glue": "Super Glue", "item.create.sweet_roll": "Sweet Roll", diff --git a/src/generated/resources/assets/create/models/item/display_cloth.json b/src/generated/resources/assets/create/models/item/display_cloth.json new file mode 100644 index 0000000000..5bf793fcfa --- /dev/null +++ b/src/generated/resources/assets/create/models/item/display_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/display_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/shopping_list.json b/src/generated/resources/assets/create/models/item/shopping_list.json new file mode 100644 index 0000000000..f51d72f6cb --- /dev/null +++ b/src/generated/resources/assets/create/models/item/shopping_list.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/shopping_list" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/appliances/display_cloth_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/appliances/display_cloth_clear.json new file mode 100644 index 0000000000..127c754882 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/appliances/display_cloth_clear.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "create:display_cloth" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/appliances/display_cloth_clear" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/appliances/display_cloth_clear" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/redstone_requester_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/redstone_requester_clear.json new file mode 100644 index 0000000000..80c24e25f2 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/redstone_requester_clear.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "create:redstone_requester" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/redstone_requester_clear" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/redstone_requester_clear" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/appliances/display_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/appliances/display_cloth_clear.json new file mode 100644 index 0000000000..a95acabe3d --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/appliances/display_cloth_clear.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "create:display_cloth" + } + ], + "result": { + "item": "create:display_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/redstone_requester_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/redstone_requester_clear.json new file mode 100644 index 0000000000..ac00a575b8 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/redstone_requester_clear.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "create:redstone_requester" + } + ], + "result": { + "item": "create:redstone_requester" + } +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllCreativeModeTabs.java b/src/main/java/com/simibubi/create/AllCreativeModeTabs.java index 7298a43099..5d1afa8579 100644 --- a/src/main/java/com/simibubi/create/AllCreativeModeTabs.java +++ b/src/main/java/com/simibubi/create/AllCreativeModeTabs.java @@ -127,6 +127,7 @@ public class AllCreativeModeTabs { AllItems.FURNACE_MINECART_CONTRAPTION, AllItems.CHEST_MINECART_CONTRAPTION, AllItems.SCHEMATIC, + AllItems.SHOPPING_LIST, AllBlocks.ANDESITE_ENCASED_SHAFT, AllBlocks.BRASS_ENCASED_SHAFT, AllBlocks.ANDESITE_ENCASED_COGWHEEL, diff --git a/src/main/java/com/simibubi/create/AllEntityTypes.java b/src/main/java/com/simibubi/create/AllEntityTypes.java index 30984943e8..55b9e81fb4 100644 --- a/src/main/java/com/simibubi/create/AllEntityTypes.java +++ b/src/main/java/com/simibubi/create/AllEntityTypes.java @@ -16,6 +16,8 @@ import com.simibubi.create.content.equipment.potatoCannon.PotatoProjectileEntity import com.simibubi.create.content.equipment.potatoCannon.PotatoProjectileRenderer; import com.simibubi.create.content.logistics.box.PackageEntity; import com.simibubi.create.content.logistics.box.PackageRenderer; +import com.simibubi.create.content.logistics.displayCloth.DisplayClothEntity; +import com.simibubi.create.content.logistics.displayCloth.DisplayClothRenderer; import com.simibubi.create.content.trains.entity.CarriageContraptionEntity; import com.simibubi.create.content.trains.entity.CarriageContraptionEntityRenderer; import com.simibubi.create.content.trains.entity.CarriageContraptionVisual; @@ -62,6 +64,10 @@ public class AllEntityTypes { public static final EntityEntry CRAFTING_BLUEPRINT = register("crafting_blueprint", BlueprintEntity::new, () -> BlueprintRenderer::new, MobCategory.MISC, 10, Integer.MAX_VALUE, false, true, BlueprintEntity::build).register(); + + public static final EntityEntry DISPLAY_CLOTH = + register("display_cloth", DisplayClothEntity::new, () -> DisplayClothRenderer::new, MobCategory.MISC, 10, + Integer.MAX_VALUE, false, true, DisplayClothEntity::build).register(); public static final EntityEntry POTATO_PROJECTILE = register("potato_projectile", PotatoProjectileEntity::new, () -> PotatoProjectileRenderer::new, diff --git a/src/main/java/com/simibubi/create/AllItems.java b/src/main/java/com/simibubi/create/AllItems.java index 227fd36215..165f0bbd85 100644 --- a/src/main/java/com/simibubi/create/AllItems.java +++ b/src/main/java/com/simibubi/create/AllItems.java @@ -42,6 +42,8 @@ import com.simibubi.create.content.legacy.ChromaticCompoundItem; import com.simibubi.create.content.legacy.RefinedRadianceItem; import com.simibubi.create.content.legacy.ShadowSteelItem; import com.simibubi.create.content.logistics.box.PackageItem; +import com.simibubi.create.content.logistics.displayCloth.DisplayClothItem; +import com.simibubi.create.content.logistics.displayCloth.ShoppingListItem; import com.simibubi.create.content.logistics.filter.FilterItem; import com.simibubi.create.content.materials.ExperienceNuggetItem; import com.simibubi.create.content.processing.burner.BlazeBurnerBlockItem; @@ -225,6 +227,10 @@ public class AllItems { public static final ItemEntry CRAFTING_BLUEPRINT = REGISTRATE.item("crafting_blueprint", BlueprintItem::new) .register(); + + public static final ItemEntry DISPLAY_CLOTH = + REGISTRATE.item("display_cloth", DisplayClothItem::new) + .register(); // wrapped by COPPER_BACKTANK for block placement uses. // must be registered as of 1.18.2 @@ -389,6 +395,11 @@ public class AllItems { .lang("Train Schedule") .register(); + public static final ItemEntry SHOPPING_LIST = + REGISTRATE.item("shopping_list", ShoppingListItem::new) + .properties(p -> p.stacksTo(1)) + .register(); + // Schematics public static final ItemEntry EMPTY_SCHEMATIC = REGISTRATE.item("empty_schematic", Item::new) diff --git a/src/main/java/com/simibubi/create/AllMenuTypes.java b/src/main/java/com/simibubi/create/AllMenuTypes.java index c6bf288a02..97a119f2e1 100644 --- a/src/main/java/com/simibubi/create/AllMenuTypes.java +++ b/src/main/java/com/simibubi/create/AllMenuTypes.java @@ -4,6 +4,8 @@ import com.simibubi.create.content.equipment.blueprint.BlueprintMenu; import com.simibubi.create.content.equipment.blueprint.BlueprintScreen; import com.simibubi.create.content.equipment.toolbox.ToolboxMenu; import com.simibubi.create.content.equipment.toolbox.ToolboxScreen; +import com.simibubi.create.content.logistics.displayCloth.DisplayClothPricingMenu; +import com.simibubi.create.content.logistics.displayCloth.DisplayClothPricingScreen; import com.simibubi.create.content.logistics.filter.AttributeFilterMenu; import com.simibubi.create.content.logistics.filter.AttributeFilterScreen; import com.simibubi.create.content.logistics.filter.FilterMenu; @@ -55,6 +57,9 @@ public class AllMenuTypes { public static final MenuEntry SCHEDULE = register("schedule", ScheduleMenu::new, () -> ScheduleScreen::new); + + public static final MenuEntry DISPLAY_CLOTH = + register("display_cloth", DisplayClothPricingMenu::new, () -> DisplayClothPricingScreen::new); private static > MenuEntry register( String name, ForgeMenuFactory factory, NonNullSupplier> screenFactory) { diff --git a/src/main/java/com/simibubi/create/AllPackets.java b/src/main/java/com/simibubi/create/AllPackets.java index 00b35d107f..2945b10603 100644 --- a/src/main/java/com/simibubi/create/AllPackets.java +++ b/src/main/java/com/simibubi/create/AllPackets.java @@ -57,6 +57,8 @@ import com.simibubi.create.content.logistics.depot.EjectorAwardPacket; import com.simibubi.create.content.logistics.depot.EjectorElytraPacket; import com.simibubi.create.content.logistics.depot.EjectorPlacementPacket; import com.simibubi.create.content.logistics.depot.EjectorTriggerPacket; +import com.simibubi.create.content.logistics.displayCloth.DisplayClothPacketToClient; +import com.simibubi.create.content.logistics.displayCloth.DisplayClothPacketToServer; import com.simibubi.create.content.logistics.filter.FilterScreenPacket; import com.simibubi.create.content.logistics.frogport.FrogportConfigurationPacket; import com.simibubi.create.content.logistics.frogport.FrogportPlacementPacket; @@ -184,6 +186,7 @@ public enum AllPackets { CHAIN_PACKAGE_INTERACTION(ChainPackageInteractionPacket.class, ChainPackageInteractionPacket::new, PLAY_TO_SERVER), STOCK_TICKER_CONFIGURATION(StockTickerConfigurationPacket.class, StockTickerConfigurationPacket::new, PLAY_TO_SERVER), PACKAGE_PORT_CONFIGURATION(FrogportConfigurationPacket.class, FrogportConfigurationPacket::new, PLAY_TO_SERVER), + DISPLAY_CLOTH_SERVERBOUND(DisplayClothPacketToServer.class, DisplayClothPacketToServer::new, PLAY_TO_SERVER), // Server to Client SYMMETRY_EFFECT(SymmetryEffectPacket.class, SymmetryEffectPacket::new, PLAY_TO_CLIENT), @@ -231,7 +234,8 @@ public enum AllPackets { ATTACHED_COMPUTER(AttachedComputerPacket.class, AttachedComputerPacket::new, PLAY_TO_CLIENT), SERVER_DEBUG_INFO(ServerDebugInfoPacket.class, ServerDebugInfoPacket::new, PLAY_TO_CLIENT), PACKAGE_DESTROYED(PackageDestroyPacket.class, PackageDestroyPacket::new, PLAY_TO_CLIENT), - LOGISTICS_STOCK_RESPONSE(LogisticalStockResponsePacket.class, LogisticalStockResponsePacket::new, PLAY_TO_CLIENT); + LOGISTICS_STOCK_RESPONSE(LogisticalStockResponsePacket.class, LogisticalStockResponsePacket::new, PLAY_TO_CLIENT), + DISPLAY_CLOTH_CLIENTBOUND(DisplayClothPacketToClient.class, DisplayClothPacketToClient::new, PLAY_TO_CLIENT); static { ClientboundSimpleActionPacket.addAction("rainbowDebug", () -> SimpleCreateActions::rainbowDebug); diff --git a/src/main/java/com/simibubi/create/AllPartialModels.java b/src/main/java/com/simibubi/create/AllPartialModels.java index 5181d0ca0a..f3acb942d7 100644 --- a/src/main/java/com/simibubi/create/AllPartialModels.java +++ b/src/main/java/com/simibubi/create/AllPartialModels.java @@ -179,6 +179,8 @@ public class AllPartialModels { WATER_WHEEL = block("water_wheel/wheel"), LARGE_WATER_WHEEL = block("large_water_wheel/block"), LARGE_WATER_WHEEL_EXTENSION = block("large_water_wheel/block_extension"), + DISPLAY_CLOTH = entity("display_cloth"), + CRAFTING_BLUEPRINT_1x1 = entity("crafting_blueprint_small"), CRAFTING_BLUEPRINT_2x2 = entity("crafting_blueprint_medium"), CRAFTING_BLUEPRINT_3x3 = entity("crafting_blueprint_large"), diff --git a/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java b/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java index 48cc2c3a72..222750e169 100644 --- a/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java +++ b/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java @@ -57,6 +57,7 @@ import com.simibubi.create.content.kinetics.press.MechanicalPressBlockEntity; import com.simibubi.create.content.kinetics.press.PressingRecipe; import com.simibubi.create.content.kinetics.saw.CuttingRecipe; import com.simibubi.create.content.kinetics.saw.SawBlockEntity; +import com.simibubi.create.content.logistics.displayCloth.DisplayClothPricingScreen; import com.simibubi.create.content.logistics.filter.AbstractFilterScreen; import com.simibubi.create.content.processing.basin.BasinRecipe; import com.simibubi.create.content.processing.sequenced.SequencedAssemblyRecipe; @@ -372,6 +373,7 @@ public class CreateJEI implements IModPlugin { registration.addGhostIngredientHandler(BlueprintScreen.class, new GhostIngredientHandler()); registration.addGhostIngredientHandler(LinkedControllerScreen.class, new GhostIngredientHandler()); registration.addGhostIngredientHandler(ScheduleScreen.class, new GhostIngredientHandler()); + registration.addGhostIngredientHandler(DisplayClothPricingScreen.class, new GhostIngredientHandler()); } private class CategoryBuilder> { diff --git a/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintEntity.java b/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintEntity.java index fd9b94b836..d142654beb 100644 --- a/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintEntity.java +++ b/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintEntity.java @@ -207,6 +207,12 @@ public class BlueprintEntity extends HangingEntity d6 = d6 / 32.0D; this.setBoundingBox(new AABB(d1 - d4, d2 - d5, d3 - d6, d1 + d4, d2 + d5, d3 + d6)); } + + @Override + public void setPos(double pX, double pY, double pZ) { + setPosRaw(pX, pY, pZ); + super.setPos(pX, pY, pZ); + } @Override public boolean survives() { diff --git a/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintOverlayRenderer.java b/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintOverlayRenderer.java index d858fc0453..860ad314a3 100644 --- a/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintOverlayRenderer.java +++ b/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintOverlayRenderer.java @@ -11,20 +11,27 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.AllItems; import com.simibubi.create.content.equipment.blueprint.BlueprintEntity.BlueprintCraftingInventory; import com.simibubi.create.content.equipment.blueprint.BlueprintEntity.BlueprintSection; +import com.simibubi.create.content.logistics.displayCloth.BlueprintOverlayShopContext; +import com.simibubi.create.content.logistics.displayCloth.DisplayClothEntity; import com.simibubi.create.content.logistics.filter.AttributeFilterMenu.WhitelistMode; import com.simibubi.create.content.logistics.filter.FilterItem; import com.simibubi.create.content.logistics.filter.FilterItemStack; import com.simibubi.create.content.logistics.filter.ItemAttribute; +import com.simibubi.create.content.logistics.packager.InventorySummary; import com.simibubi.create.content.trains.track.TrackPlacement.PlacementInfo; import com.simibubi.create.foundation.gui.AllGuiTextures; import net.createmod.catnip.gui.element.GuiGameElement; import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.IntAttached; import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.utility.lang.Components; import net.createmod.ponder.utility.LevelTickHolder; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.inventory.tooltip.TooltipRenderUtil; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.world.inventory.CraftingContainer; @@ -54,10 +61,11 @@ public class BlueprintOverlayRenderer { static boolean noOutput; static boolean lastSneakState; static BlueprintSection lastTargetedSection; + static BlueprintOverlayShopContext shopContext; static Map cachedRenderedFilters = new IdentityHashMap<>(); static List> ingredients = new ArrayList<>(); - static ItemStack result = ItemStack.EMPTY; + static List results = new ArrayList<>(); static boolean resultCraftable = false; public static void tick() { @@ -67,6 +75,7 @@ public class BlueprintOverlayRenderer { lastTargetedSection = null; active = false; noOutput = false; + shopContext = null; if (mc.gameMode.getPlayerMode() == GameType.SPECTATOR) return; @@ -116,13 +125,6 @@ public class BlueprintOverlayRenderer { } } - private static void prepareCustomOverlay() { - active = true; - empty = false; - noOutput = true; - ingredients.clear(); - } - public static void displayChainRequirements(Item chainItem, int count, boolean fulfilled) { if (active) return; @@ -135,6 +137,48 @@ public class BlueprintOverlayRenderer { } } + public static void displayClothShop(DisplayClothEntity dce, int alreadyPurchased) { + if (active) + return; + prepareCustomOverlay(); + noOutput = false; + + shopContext = new BlueprintOverlayShopContext(false, dce.getStockLevelForTrade(), alreadyPurchased); + + ingredients.add(Pair.of(dce.paymentItem.copyWithCount(dce.paymentAmount), + !dce.paymentItem.isEmpty() && shopContext.stockLevel() > shopContext.purchases())); + for (IntAttached entry : dce.requestData.encodedRequest.stacks()) + results.add(entry.getSecond() + .copyWithCount(entry.getFirst())); + } + + public static void displayShoppingList(Couple bakedList) { + if (active || bakedList == null) + return; + prepareCustomOverlay(); + noOutput = false; + + shopContext = new BlueprintOverlayShopContext(true, 1, 0); + + for (IntAttached entry : bakedList.getSecond() + .getStacksByCount()) + ingredients.add(Pair.of(entry.getSecond() + .copyWithCount(entry.getFirst()), true)); + for (IntAttached entry : bakedList.getFirst() + .getStacksByCount()) + results.add(entry.getSecond() + .copyWithCount(entry.getFirst())); + } + + private static void prepareCustomOverlay() { + active = true; + empty = false; + noOutput = true; + ingredients.clear(); + results.clear(); + shopContext = null; + } + public static void rebuild(BlueprintSection sectionAt, boolean sneak) { cachedRenderedFilters.clear(); ItemStackHandler items = sectionAt.getItems(); @@ -148,7 +192,7 @@ public class BlueprintOverlayRenderer { } BlueprintOverlayRenderer.empty = empty; - BlueprintOverlayRenderer.result = ItemStack.EMPTY; + BlueprintOverlayRenderer.results.clear(); if (empty) return; @@ -215,10 +259,11 @@ public class BlueprintOverlayRenderer { success = false; } else { amountCrafted += resultFromRecipe.getCount(); - if (result.isEmpty()) - result = resultFromRecipe.copy(); + if (results.isEmpty()) + results.add(resultFromRecipe.copy()); else - result.grow(resultFromRecipe.getCount()); + results.get(0) + .grow(resultFromRecipe.getCount()); resultCraftable = true; firstPass = false; } @@ -231,7 +276,9 @@ public class BlueprintOverlayRenderer { if (!success) { if (firstPass) { - result = invalid ? ItemStack.EMPTY : items.getStackInSlot(9); + results.clear(); + if (!invalid) + results.add(items.getStackInSlot(9)); resultCraftable = false; } break; @@ -264,19 +311,39 @@ public class BlueprintOverlayRenderer { if (!active || empty) return; + boolean invalidShop = shopContext != null && (ingredients.isEmpty() || ingredients.get(0) + .getFirst() + .isEmpty() || shopContext.stockLevel() == 0); + int w = 21 * ingredients.size(); - if (!noOutput) - w += 51; + if (!noOutput) { + w += 21 * results.size(); + w += 30; + } int x = (width - w) / 2; int y = (int) (height - 100); + if (shopContext != null) { + TooltipRenderUtil.renderTooltipBackground(graphics, x - 2, y + 1, w + 4, 19, 0, 0x55_000000, 0x55_000000, 0, + 0); + + AllGuiTextures.TRADE_OVERLAY.render(graphics, width / 2 - 49, y - 19); + if (shopContext.purchases() > 0) { + graphics.renderItem(AllItems.SHOPPING_LIST.asStack(), width / 2 + 20, y - 20); + graphics.drawString(mc.font, Components.literal("x" + shopContext.purchases()), width / 2 + 20 + 16, + y - 20 + 4, 0xff_eeeeee, true); + } + } + + // Ingredients for (Pair pair : ingredients) { RenderSystem.enableBlend(); (pair.getSecond() ? AllGuiTextures.HOTSLOT_ACTIVE : AllGuiTextures.HOTSLOT).render(graphics, x, y); ItemStack itemStack = pair.getFirst(); - String count = pair.getSecond() ? null : ChatFormatting.GOLD.toString() + itemStack.getCount(); + String count = + shopContext != null || pair.getSecond() ? null : ChatFormatting.GOLD.toString() + itemStack.getCount(); drawItemStack(graphics, mc, x, y, itemStack, count); x += 21; } @@ -284,21 +351,36 @@ public class BlueprintOverlayRenderer { if (noOutput) return; + // Arrow x += 5; RenderSystem.enableBlend(); - AllGuiTextures.HOTSLOT_ARROW.render(graphics, x, y + 4); + if (invalidShop) + AllGuiTextures.HOTSLOT_ARROW_BAD.render(graphics, x, y + 4); + else + AllGuiTextures.HOTSLOT_ARROW.render(graphics, x, y + 4); x += 25; - if (result.isEmpty()) { + // Outputs + if (results.isEmpty()) { AllGuiTextures.HOTSLOT.render(graphics, x, y); GuiGameElement.of(Items.BARRIER) .at(x + 3, y + 3) .render(graphics); } else { - (resultCraftable ? AllGuiTextures.HOTSLOT_SUPER_ACTIVE : AllGuiTextures.HOTSLOT).render(graphics, - resultCraftable ? x - 1 : x, resultCraftable ? y - 1 : y); - drawItemStack(graphics, mc, x, y, result, null); + for (ItemStack result : results) { + AllGuiTextures slot = resultCraftable ? AllGuiTextures.HOTSLOT_SUPER_ACTIVE : AllGuiTextures.HOTSLOT; + if (!invalidShop && shopContext != null && shopContext.stockLevel() > shopContext.purchases()) + slot = AllGuiTextures.HOTSLOT_ACTIVE; + slot.render(graphics, resultCraftable ? x - 1 : x, resultCraftable ? y - 1 : y); + drawItemStack(graphics, mc, x, y, result, null); + x += 21; + } } + +// if (shopContext != null) Display stock level? +// graphics.drawString(mc.font, Components.literal(shopContext.stockLevel() + "x in Stock"), x + 2, y + 13, +// 0xff_797979, true); + RenderSystem.disableBlend(); } diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java index 6f1980e0a6..787f1ff90d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java @@ -183,7 +183,8 @@ public class PackageItem extends Item { super.appendHoverText(pStack, pLevel, pTooltipComponents, pIsAdvanced); CompoundTag compoundnbt = pStack.getOrCreateTag(); - if (compoundnbt.contains("Address", Tag.TAG_STRING)) + if (compoundnbt.contains("Address", Tag.TAG_STRING) && !compoundnbt.getString("Address") + .isBlank()) pTooltipComponents.add(Components.literal("-> " + compoundnbt.getString("Address")) .withStyle(ChatFormatting.GOLD)); diff --git a/src/main/java/com/simibubi/create/content/logistics/depot/DepotRenderer.java b/src/main/java/com/simibubi/create/content/logistics/depot/DepotRenderer.java index 879871cc46..6ed187ccad 100644 --- a/src/main/java/com/simibubi/create/content/logistics/depot/DepotRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/depot/DepotRenderer.java @@ -71,7 +71,7 @@ public class DepotRenderer extends SafeBlockEntityRenderer { ItemStack itemStack = tis.stack; int angle = tis.angle; Random r = new Random(0); - renderItem(be.getLevel(), ms, buffer, light, overlay, itemStack, angle, r, itemPosition); + renderItem(be.getLevel(), ms, buffer, light, overlay, itemStack, angle, r, itemPosition, false); ms.popPose(); } @@ -93,7 +93,7 @@ public class DepotRenderer extends SafeBlockEntityRenderer { msr.rotateYDegrees(-(360 / 8f * i)); Random r = new Random(i + 1); int angle = (int) (360 * r.nextFloat()); - renderItem(be.getLevel(), ms, buffer, light, overlay, stack, renderUpright ? angle + 90 : angle, r, itemPosition); + renderItem(be.getLevel(), ms, buffer, light, overlay, stack, renderUpright ? angle + 90 : angle, r, itemPosition, false); ms.popPose(); } @@ -101,14 +101,14 @@ public class DepotRenderer extends SafeBlockEntityRenderer { } public static void renderItem(Level level, PoseStack ms, MultiBufferSource buffer, int light, int overlay, ItemStack itemStack, - int angle, Random r, Vec3 itemPosition) { + int angle, Random r, Vec3 itemPosition, boolean alwaysUpright) { ItemRenderer itemRenderer = Minecraft.getInstance() .getItemRenderer(); var msr = TransformStack.of(ms); int count = (int) (Mth.log2((int) (itemStack.getCount()))) / 2; - boolean renderUpright = BeltHelper.isItemUpright(itemStack); BakedModel bakedModel = itemRenderer.getModel(itemStack, null, null, 0); boolean blockItem = bakedModel.isGui3d(); + boolean renderUpright = BeltHelper.isItemUpright(itemStack) || alwaysUpright && !blockItem; ms.pushPose(); msr.rotateYDegrees(angle); @@ -127,7 +127,7 @@ public class DepotRenderer extends SafeBlockEntityRenderer { for (int i = 0; i <= count; i++) { ms.pushPose(); - if (blockItem) + if (blockItem && r != null) ms.translate(r.nextFloat() * .0625f * i, 0, r.nextFloat() * .0625f * i); if (itemStack.getItem() instanceof PackageItem) { diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/BlueprintOverlayShopContext.java b/src/main/java/com/simibubi/create/content/logistics/displayCloth/BlueprintOverlayShopContext.java new file mode 100644 index 0000000000..ff03d622e3 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/displayCloth/BlueprintOverlayShopContext.java @@ -0,0 +1,5 @@ +package com.simibubi.create.content.logistics.displayCloth; + +public record BlueprintOverlayShopContext(boolean checkout, int stockLevel, int purchases) { + +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothEntity.java b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothEntity.java new file mode 100644 index 0000000000..490bd520c9 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothEntity.java @@ -0,0 +1,417 @@ +package com.simibubi.create.content.logistics.displayCloth; + +import java.util.ArrayList; +import java.util.UUID; + +import javax.annotation.Nullable; + +import com.simibubi.create.AllEntityTypes; +import com.simibubi.create.AllItems; +import com.simibubi.create.AllPackets; +import com.simibubi.create.AllSoundEvents; +import com.simibubi.create.content.logistics.displayCloth.ShoppingListItem.ShoppingList; +import com.simibubi.create.content.logistics.packager.InventorySummary; +import com.simibubi.create.content.logistics.redstoneRequester.AutoRequestData; +import com.simibubi.create.content.logistics.stockTicker.StockTickerBlockEntity; +import com.simibubi.create.content.schematics.requirement.ISpecialEntityItemRequirement; +import com.simibubi.create.content.schematics.requirement.ItemRequirement; +import com.simibubi.create.content.schematics.requirement.ItemRequirement.ItemUseType; +import com.simibubi.create.foundation.networking.ISyncPersistentData; +import com.simibubi.create.foundation.utility.CreateLang; +import com.simibubi.create.foundation.utility.IInteractionChecker; + +import net.createmod.catnip.utility.IntAttached; +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.util.Mth; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.MenuProvider; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityDimensions; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.Pose; +import net.minecraft.world.entity.decoration.HangingEntity; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.EntityGetter; +import net.minecraft.world.level.GameRules; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.FenceBlock; +import net.minecraft.world.level.block.FenceGateBlock; +import net.minecraft.world.level.block.WallBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.HitResult; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.entity.IEntityAdditionalSpawnData; +import net.minecraftforge.network.NetworkHooks; +import net.minecraftforge.network.PacketDistributor; + +public class DisplayClothEntity extends HangingEntity implements IEntityAdditionalSpawnData, + ISpecialEntityItemRequirement, ISyncPersistentData, IInteractionChecker, MenuProvider { + + public AutoRequestData requestData = new AutoRequestData(); + + public ItemStack paymentItem = ItemStack.EMPTY; + public int paymentAmount = 1; + public UUID owner; + + public DisplayClothEntity(EntityType pEntityType, Level pLevel) { + super(pEntityType, pLevel); + } + + public DisplayClothEntity(Level world, BlockPos pos, Direction direction) { + super(AllEntityTypes.DISPLAY_CLOTH.get(), world, pos); + setDirection(direction); + } + + public static EntityType.Builder build(EntityType.Builder builder) { + @SuppressWarnings("unchecked") + EntityType.Builder entityBuilder = (EntityType.Builder) builder; + return entityBuilder; + } + + @Override + public Packet getAddEntityPacket() { + return NetworkHooks.getEntitySpawningPacket(this); + } + + public void addAdditionalSaveData(CompoundTag pCompound) { + pCompound.putByte("Facing", (byte) this.direction.get2DDataValue()); + requestData.write(pCompound); + pCompound.put("Payment", paymentItem.serializeNBT()); + pCompound.putInt("PaymentAmount", paymentAmount); + pCompound.putUUID("OwnerUUID", owner); + super.addAdditionalSaveData(pCompound); + } + + @Override + public void readAdditionalSaveData(CompoundTag pCompound) { + direction = Direction.from2DDataValue(pCompound.getByte("Facing")); + requestData = AutoRequestData.read(pCompound); + paymentItem = ItemStack.of(pCompound.getCompound("Payment")); + paymentAmount = pCompound.getInt("PaymentAmount"); + owner = pCompound.getUUID("OwnerUUID"); + super.readAdditionalSaveData(pCompound); + setDirection(direction); + } + + @Override + public InteractionResult interact(Player player, InteractionHand pHand) { + if (level().isClientSide()) + return InteractionResult.SUCCESS; + if (pHand != InteractionHand.MAIN_HAND) + return InteractionResult.PASS; + if (!owner.equals(player.getUUID()) || (!paymentItem.isEmpty() && !player.isShiftKeyDown())) + return interactAsCustomer(player); + + return interactAsOwner(player); + } + + public InteractionResult interactAsOwner(Player player) { + if (player instanceof ServerPlayer sp) + NetworkHooks.openScreen(sp, this, buf -> { + buf.writeVarInt(getId()); + requestData.encodedRequest.write(buf); + }); + return InteractionResult.SUCCESS; + } + + public InteractionResult interactAsCustomer(Player player) { + ItemStack itemInHand = player.getItemInHand(InteractionHand.MAIN_HAND); + ItemStack prevListItem = null; + boolean addOntoList = false; + + // Remove other lists from inventory + for (int i = 0; i < 9; i++) { + ItemStack item = player.getInventory() + .getItem(i); + if (!AllItems.SHOPPING_LIST.isIn(item)) + continue; + prevListItem = item; + addOntoList = true; + player.getInventory() + .setItem(i, ItemStack.EMPTY); + } + + // add onto existing list if in hand + if (AllItems.SHOPPING_LIST.isIn(itemInHand)) { + prevListItem = itemInHand; + addOntoList = true; + } + + if (!itemInHand.isEmpty() && !addOntoList) { + CreateLang.text("Empty hand required to start a shopping list") + .sendStatus(player); + AllSoundEvents.DENY.playOnServer(level(), blockPosition()); + return InteractionResult.SUCCESS; + } + + if (paymentItem.isEmpty()) { + CreateLang.text("Shop owner must set a price first") + .sendStatus(player); + AllSoundEvents.DENY.playOnServer(level(), blockPosition()); + return InteractionResult.SUCCESS; + } + + UUID tickerID = null; + BlockPos tickerPos = requestData.targetOffset.offset(blockPosition()); + if (level().getBlockEntity(tickerPos) instanceof StockTickerBlockEntity stbe && stbe.isKeeperPresent()) + tickerID = stbe.behaviour.freqId; + + int stockLevel = getStockLevelForTrade(); + + if (tickerID == null) { + CreateLang.text("Stock keeper missing") + .style(ChatFormatting.RED) + .sendStatus(player); + AllSoundEvents.DENY.playOnServer(level(), blockPosition()); + return InteractionResult.SUCCESS; + } + + if (stockLevel == 0) { + CreateLang.text("Out of Stock") + .style(ChatFormatting.RED) + .sendStatus(player); + AllSoundEvents.DENY.playOnServer(level(), blockPosition()); + return InteractionResult.SUCCESS; + } + + ShoppingList list = new ShoppingList(new ArrayList<>(), owner, tickerID); + + if (addOntoList) { + ShoppingList prevList = ShoppingListItem.getList(prevListItem); + if (owner.equals(prevList.shopOwner()) && tickerID.equals(prevList.shopNetwork())) + list = prevList; + else + addOntoList = false; + } + + BlockPos posWithPixelY = getPosWithPixelY(); + + if (list.getPurchases(posWithPixelY) == stockLevel) { + CreateLang.text("Limited stock available") + .style(ChatFormatting.RED) + .sendStatus(player); + AllSoundEvents.DENY.playOnServer(level(), blockPosition()); + + } else { + list.addPurchases(posWithPixelY, 1); + if (!addOntoList) + CreateLang.text("Use this list to add more to your purchase") + .color(0xeeeeee) + .sendStatus(player); + if (!addOntoList) + level().playSound(null, blockPosition(), SoundEvents.BOOK_PAGE_TURN, getSoundSource(), 1, 1.5f); + AllSoundEvents.CONFIRM.playOnServer(level(), blockPosition()); + } + + ItemStack newListItem = + ShoppingListItem.saveList(AllItems.SHOPPING_LIST.asStack(), list, requestData.encodedTargetAdress); + + if (player.getItemInHand(InteractionHand.MAIN_HAND) + .isEmpty()) + player.setItemInHand(InteractionHand.MAIN_HAND, newListItem); + else + player.getInventory() + .placeItemBackInInventory(newListItem); + + return InteractionResult.SUCCESS; + } + + public int getStockLevelForTrade() { + BlockPos tickerPos = requestData.targetOffset.offset(blockPosition()); + if (!(level().getBlockEntity(tickerPos) instanceof StockTickerBlockEntity stbe)) + return 0; + + InventorySummary recentSummary = null; + + if (level().isClientSide()) { + if (stbe.getTicksSinceLastUpdate() > 15) + stbe.refreshClientStockSnapshot(); + recentSummary = stbe.getLastClientsideStockSnapshotAsSummary(); + } else + recentSummary = stbe.getRecentSummary(); + + if (recentSummary == null) + return 0; + + int smallestQuotient = Integer.MAX_VALUE; + for (IntAttached entry : requestData.encodedRequest.stacks()) + smallestQuotient = + Math.min(smallestQuotient, recentSummary.getCountOf(entry.getValue()) / entry.getFirst()); + + return smallestQuotient; + } + + public BlockPos getPosWithPixelY() { + return new BlockPos(blockPosition().getX(), Mth.floor(getY() * 16), blockPosition().getZ()); + } + + public static DisplayClothEntity getAtPosWithPixelY(EntityGetter level, BlockPos pos) { + for (DisplayClothEntity entity : level.getEntitiesOfClass(DisplayClothEntity.class, + new AABB(new BlockPos(pos.getX(), pos.getY() / 16, pos.getZ())).inflate(1))) + if (pos.equals(entity.getPosWithPixelY())) + return entity; + return null; + } + + @Override + protected float getEyeHeight(Pose pPose, EntityDimensions pDimensions) { + return 0; + } + + @Override + protected void recalculateBoundingBox() { + setBoundingBox(new AABB(position(), position()).inflate(.5, 0, .5) + .expandTowards(0, 1 / 16f, 0)); + } + + @Override + public void setPos(double pX, double pY, double pZ) { + setPosRaw(pX, pY, pZ); + super.setPos(pX, pY, pZ); + } + + @Override + public void dropItem(@Nullable Entity pBrokenEntity) { + if (!this.level() + .getGameRules() + .getBoolean(GameRules.RULE_DOENTITYDROPS)) + return; + + playSound(SoundEvents.WOOL_BREAK, 1.0F, 1.0F); + if (pBrokenEntity instanceof Player) { + Player player = (Player) pBrokenEntity; + if (player.getAbilities().instabuild) + return; + } + + ItemStack item = AllItems.DISPLAY_CLOTH.asStack(); + if (requestData != null) + requestData.writeToItem(pos, item); + + spawnAtLocation(item); + } + + @Override + public boolean survives() { + BlockPos blockpos = BlockPos.containing(position().relative(Direction.DOWN, 1 / 16f)); + BlockState blockstate = level().getBlockState(blockpos); + + boolean fenceLikeBelow = blockstate.getBlock() instanceof FenceBlock + || blockstate.getBlock() instanceof FenceGateBlock || blockstate.getBlock() instanceof WallBlock; + + AABB boundingBox = getBoundingBox(); + if (fenceLikeBelow) + if (blockstate.getShape(level(), blockpos) + .bounds() + .move(blockpos) + .intersects(boundingBox)) + return false; + + if (!fenceLikeBelow) + if (!level().noCollision(this)) + return false; + + if (blockstate.getShape(level(), blockpos) + .isEmpty()) + return false; + + return level().getEntities(this, boundingBox, HANGING_ENTITY) + .isEmpty(); + } + + @Override + public int getWidth() { + return 16; + } + + @Override + public int getHeight() { + return 16; + } + + @Override + public ItemStack getPickedResult(HitResult target) { + return AllItems.DISPLAY_CLOTH.asStack(); + } + + @Override + public ItemRequirement getRequiredItems() { + return new ItemRequirement(ItemUseType.CONSUME, AllItems.DISPLAY_CLOTH.get()); + } + + @Override + public void playPlacementSound() { + this.playSound(SoundEvents.WOOL_PLACE, 1.0F, 1.0F); + } + + @Override + public void moveTo(double p_70012_1_, double p_70012_3_, double p_70012_5_, float p_70012_7_, float p_70012_8_) { + this.setPos(p_70012_1_, p_70012_3_, p_70012_5_); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void lerpTo(double p_180426_1_, double p_180426_3_, double p_180426_5_, float p_180426_7_, float p_180426_8_, + int p_180426_9_, boolean p_180426_10_) { + BlockPos blockpos = this.pos.offset( + BlockPos.containing(p_180426_1_ - this.getX(), p_180426_3_ - this.getY(), p_180426_5_ - this.getZ())); + this.setPos((double) blockpos.getX(), (double) blockpos.getY(), (double) blockpos.getZ()); + } + + @Override + public void onPersistentDataUpdated() {} + + @Override + public void writeSpawnData(FriendlyByteBuf buffer) { + CompoundTag compound = new CompoundTag(); + addAdditionalSaveData(compound); + buffer.writeNbt(compound); + buffer.writeNbt(getPersistentData()); + } + + @Override + public void readSpawnData(FriendlyByteBuf additionalData) { + readAdditionalSaveData(additionalData.readNbt()); + getPersistentData().merge(additionalData.readNbt()); + } + + @Override + public boolean canPlayerUse(Player player) { + return isAlive() && player.closerThan(this, 10); + } + + @Override + public AbstractContainerMenu createMenu(int id, Inventory inv, Player player) { + return DisplayClothPricingMenu.create(id, inv, this); + } + + @Override + public Component getDisplayName() { + return AllItems.DISPLAY_CLOTH.get() + .getDescription(); + } + + public void sendData() { + if (level().isClientSide()) + return; + AllPackets.getChannel() + .send(PacketDistributor.TRACKING_ENTITY.with(() -> this), + new DisplayClothPacketToClient(getId(), requestData.encodedRequest, paymentItem, paymentAmount)); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothItem.java b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothItem.java new file mode 100644 index 0000000000..70a2810a29 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothItem.java @@ -0,0 +1,78 @@ +package com.simibubi.create.content.logistics.displayCloth; + +import java.util.List; + +import com.simibubi.create.content.logistics.redstoneRequester.AutoRequestData; +import com.simibubi.create.content.logistics.redstoneRequester.RedstoneRequesterBlock; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.Level; + +public class DisplayClothItem extends Item { + + public DisplayClothItem(Properties p_i48487_1_) { + super(p_i48487_1_); + } + + @Override + public InteractionResult useOn(UseOnContext ctx) { + Direction face = ctx.getClickedFace(); + Player player = ctx.getPlayer(); + ItemStack stack = ctx.getItemInHand(); + BlockPos pos = ctx.getClickedPos() + .relative(face); + + if (player != null && !player.mayUseItemAt(pos, face, stack)) + return InteractionResult.FAIL; + + Level world = ctx.getLevel(); + DisplayClothEntity hangingentity = new DisplayClothEntity(world, pos, ctx.getHorizontalDirection()); + CompoundTag compoundnbt = stack.getTag(); + + hangingentity.setPos(pos.getX() + 0.5, Math.min(ctx.getClickLocation() + .y(), pos.getY() + 1), pos.getZ() + 0.5); + + if (compoundnbt != null) + EntityType.updateCustomEntityTag(world, player, hangingentity, compoundnbt); + if (!hangingentity.survives()) + return InteractionResult.CONSUME; + + hangingentity.requestData = AutoRequestData.readFromItem(world, player, hangingentity.blockPosition(), stack); + hangingentity.owner = player.getUUID(); + + if (!world.isClientSide) { + hangingentity.playPlacementSound(); + world.addFreshEntity(hangingentity); + } + + stack.shrink(1); + + if (hangingentity.requestData.isValid) + hangingentity.interactAsOwner(player); + + hangingentity.sendData(); + return InteractionResult.sidedSuccess(world.isClientSide); + } + + @Override + public void appendHoverText(ItemStack pStack, Level pLevel, List pTooltipComponents, + TooltipFlag pIsAdvanced) { + super.appendHoverText(pStack, pLevel, pTooltipComponents, pIsAdvanced); + RedstoneRequesterBlock.appendRequesterTooltip(pStack, pTooltipComponents); + } + + protected boolean canPlace(Player p_200127_1_, Direction p_200127_2_, ItemStack p_200127_3_, BlockPos p_200127_4_) { + return p_200127_1_.mayUseItemAt(p_200127_4_, p_200127_2_, p_200127_3_); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothOverlayRenderer.java b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothOverlayRenderer.java new file mode 100644 index 0000000000..64167dc68f --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothOverlayRenderer.java @@ -0,0 +1,56 @@ +package com.simibubi.create.content.logistics.displayCloth; + +import com.simibubi.create.AllItems; +import com.simibubi.create.content.equipment.blueprint.BlueprintOverlayRenderer; +import com.simibubi.create.content.logistics.displayCloth.ShoppingListItem.ShoppingList; +import com.simibubi.create.content.logistics.stockTicker.StockTickerBlockEntity; +import com.simibubi.create.content.logistics.stockTicker.StockTickerInteractionHandler; + +import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.GameType; +import net.minecraft.world.phys.EntityHitResult; +import net.minecraft.world.phys.HitResult; +import net.minecraft.world.phys.HitResult.Type; + +public class DisplayClothOverlayRenderer { + + public static void tick() { + Minecraft mc = Minecraft.getInstance(); + if (mc.gameMode.getPlayerMode() == GameType.SPECTATOR) + return; + + HitResult mouseOver = mc.hitResult; + if (mouseOver == null) + return; + if (mouseOver.getType() != Type.ENTITY) + return; + + EntityHitResult entityRay = (EntityHitResult) mouseOver; + ItemStack shoppingListItem = mc.player.getMainHandItem(); + ShoppingList list = ShoppingListItem.getList(shoppingListItem); + + if (!(entityRay.getEntity() instanceof DisplayClothEntity dce)) { + if (!AllItems.SHOPPING_LIST.isIn(shoppingListItem)) + return; + BlockPos stockTickerPosition = StockTickerInteractionHandler.getStockTickerPosition(entityRay.getEntity()); + if (list == null || stockTickerPosition == null) + return; + if (!(mc.level.getBlockEntity(stockTickerPosition) instanceof StockTickerBlockEntity tickerBE)) + return; + if (!tickerBE.behaviour.freqId.equals(list.shopNetwork())) + return; + + BlueprintOverlayRenderer.displayShoppingList(list.bakeEntries(mc.level)); + return; + } + + int alreadyPurchased = 0; + if (list != null) + alreadyPurchased = list.getPurchases(dce.getPosWithPixelY()); + + BlueprintOverlayRenderer.displayClothShop(dce, alreadyPurchased); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothPacket.java b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothPacket.java new file mode 100644 index 0000000000..a7eab82de0 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothPacket.java @@ -0,0 +1,35 @@ +package com.simibubi.create.content.logistics.displayCloth; + +import com.simibubi.create.content.logistics.stockTicker.PackageOrder; +import com.simibubi.create.foundation.networking.SimplePacketBase; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.item.ItemStack; + +public abstract class DisplayClothPacket extends SimplePacketBase { + + protected int entityID; + protected PackageOrder order; + protected ItemStack costItem; + protected int costAmount; + + public DisplayClothPacket(int entityID, PackageOrder order, ItemStack costItem, int costAmount) { + this.entityID = entityID; + this.order = order; + this.costItem = costItem; + this.costAmount = costAmount; + } + + public DisplayClothPacket(FriendlyByteBuf buffer) { + this(buffer.readVarInt(), PackageOrder.read(buffer), buffer.readItem(), buffer.readVarInt()); + } + + @Override + public void write(FriendlyByteBuf buffer) { + buffer.writeVarInt(entityID); + order.write(buffer); + buffer.writeItem(costItem); + buffer.writeVarInt(costAmount); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothPacketToClient.java b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothPacketToClient.java new file mode 100644 index 0000000000..056a804846 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothPacketToClient.java @@ -0,0 +1,35 @@ +package com.simibubi.create.content.logistics.displayCloth; + +import com.simibubi.create.content.logistics.stockTicker.PackageOrder; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.network.NetworkEvent.Context; + +public class DisplayClothPacketToClient extends DisplayClothPacket { + + public DisplayClothPacketToClient(int entityID, PackageOrder order, ItemStack costItem, int costAmount) { + super(entityID, order, costItem, costAmount); + } + + public DisplayClothPacketToClient(FriendlyByteBuf buffer) { + super(buffer); + } + + @Override + public boolean handle(Context context) { + ClientLevel level = Minecraft.getInstance().level; + if (level == null) + return true; + if (!(level.getEntity(entityID) instanceof DisplayClothEntity dce)) + return true; + + dce.requestData.encodedRequest = order; + dce.paymentItem = costItem; + dce.paymentAmount = costAmount; + return true; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothPacketToServer.java b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothPacketToServer.java new file mode 100644 index 0000000000..e5901d3196 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothPacketToServer.java @@ -0,0 +1,36 @@ +package com.simibubi.create.content.logistics.displayCloth; + +import com.simibubi.create.content.logistics.stockTicker.PackageOrder; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraftforge.network.NetworkEvent.Context; + +public class DisplayClothPacketToServer extends DisplayClothPacket { + + public DisplayClothPacketToServer(int entityID, PackageOrder order, ItemStack costItem, int costAmount) { + super(entityID, order, costItem, costAmount); + } + + public DisplayClothPacketToServer(FriendlyByteBuf buffer) { + super(buffer); + } + + @Override + public boolean handle(Context context) { + Level level = context.getSender() + .level(); + if (level == null) + return true; + if (!(level.getEntity(entityID) instanceof DisplayClothEntity dce)) + return true; + + dce.requestData.encodedRequest = order; + dce.paymentItem = costItem; + dce.paymentAmount = costAmount; + dce.sendData(); + return true; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothPricingMenu.java b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothPricingMenu.java new file mode 100644 index 0000000000..7d6eed2206 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothPricingMenu.java @@ -0,0 +1,83 @@ +package com.simibubi.create.content.logistics.displayCloth; + +import com.simibubi.create.AllMenuTypes; +import com.simibubi.create.AllPackets; +import com.simibubi.create.content.logistics.stockTicker.PackageOrder; +import com.simibubi.create.foundation.gui.menu.GhostItemMenu; + +import net.minecraft.client.Minecraft; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.inventory.MenuType; +import net.minecraftforge.items.ItemStackHandler; +import net.minecraftforge.items.SlotItemHandler; + +public class DisplayClothPricingMenu extends GhostItemMenu { + + int pricingAmount; + + public DisplayClothPricingMenu(MenuType type, int id, Inventory inv, DisplayClothEntity contentHolder) { + super(type, id, inv, contentHolder); + pricingAmount = contentHolder.paymentAmount; + } + + public DisplayClothPricingMenu(MenuType type, int id, Inventory inv, FriendlyByteBuf extraData) { + super(type, id, inv, extraData); + } + + public static DisplayClothPricingMenu create(int id, Inventory inv, DisplayClothEntity contentHolder) { + return new DisplayClothPricingMenu(AllMenuTypes.DISPLAY_CLOTH.get(), id, inv, contentHolder); + } + + @Override + protected ItemStackHandler createGhostInventory() { + ItemStackHandler handler = new ItemStackHandler(1); + handler.setStackInSlot(0, contentHolder.paymentItem.isEmpty() ? contentHolder.paymentItem + : contentHolder.paymentItem.copyWithCount(1)); + return handler; + } + + @Override + protected boolean allowRepeats() { + return true; + } + + @Override + protected DisplayClothEntity createOnClient(FriendlyByteBuf extraData) { + int entityID = extraData.readVarInt(); + PackageOrder order = PackageOrder.read(extraData); + Entity entityByID = Minecraft.getInstance().level.getEntity(entityID); + if (!(entityByID instanceof DisplayClothEntity dce)) + return null; + dce.requestData.encodedRequest = order; + pricingAmount = dce.paymentAmount; + return dce; + } + + @Override + protected void addSlots() { + int playerX = 33; + int playerY = 118; + int slotX = 0; + int slotY = 70; + + addPlayerSlots(playerX, playerY); + addSlot(new SlotItemHandler(ghostInventory, 0, slotX, slotY)); + } + + @Override + protected void saveData(DisplayClothEntity contentHolder) { + if (!contentHolder.level() + .isClientSide()) + return; + + contentHolder.paymentItem = ghostInventory.getStackInSlot(0); + contentHolder.paymentAmount = pricingAmount; + + AllPackets.getChannel() + .sendToServer(new DisplayClothPacketToServer(contentHolder.getId(), + contentHolder.requestData.encodedRequest, contentHolder.paymentItem, contentHolder.paymentAmount)); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothPricingScreen.java b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothPricingScreen.java new file mode 100644 index 0000000000..c088b68675 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothPricingScreen.java @@ -0,0 +1,141 @@ +package com.simibubi.create.content.logistics.displayCloth; + +import static com.simibubi.create.foundation.gui.AllGuiTextures.PLAYER_INVENTORY; + +import java.util.List; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.foundation.gui.AllGuiTextures; +import com.simibubi.create.foundation.gui.menu.AbstractSimiContainerScreen; +import com.simibubi.create.foundation.gui.widget.ScrollInput; +import com.simibubi.create.foundation.utility.CreateLang; + +import net.createmod.catnip.gui.element.GuiGameElement; +import net.createmod.catnip.utility.IntAttached; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.utility.theme.Color; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.item.ItemStack; + +public class DisplayClothPricingScreen extends AbstractSimiContainerScreen { + + private ScrollInput scrollInput; + + public DisplayClothPricingScreen(DisplayClothPricingMenu container, Inventory inv, Component title) { + super(container, inv, title); + } + + @Override + protected void init() { + setWindowSize(PLAYER_INVENTORY.getWidth() + 50, PLAYER_INVENTORY.getHeight() + 100); + super.init(); + clearWidgets(); + + int x = getGuiLeft(); + int y = getGuiTop(); + + scrollInput = new ScrollInput(x + 33, y - 4 + 72, 100, 20).withRange(1, 513) + .withShiftStep(10) + .calling(s -> menu.pricingAmount = s); + scrollInput.setState(menu.contentHolder.paymentAmount); + addRenderableWidget(scrollInput); + } + + final int cols = 8; + final int rowHeight = 18; + final int colWidth = 26; + + @Override + protected void renderBg(GuiGraphics graphics, float pPartialTick, int mouseX, int mouseY) { + int x = getGuiLeft(); + int y = getGuiTop(); + + AllGuiTextures.PLAYER_INVENTORY.render(graphics, x + 25, y + 100); + graphics.drawString(font, playerInventoryTitle, x + 8 + 25, y + 6 + 100, 0x404040, false); + + Color color = new Color(255, 255, 255, 50); + int hoveredSlot = getHoveredSlot(mouseX, mouseY); + + // Render some boxes + graphics.renderOutline(x - 2, y - 4 + 20, cols * colWidth + 6, rowHeight + 8, color.getRGB()); + graphics.renderOutline(x - 2, y - 4 + 72, 20, 20, color.getRGB()); + graphics.renderOutline(scrollInput.getX(), scrollInput.getY(), scrollInput.getWidth(), scrollInput.getHeight(), + color.getRGB()); + + graphics.drawString(font, Components.literal("Price per Order:"), x, y + 52, 0x88dddddd); + graphics.drawString(font, Components.literal("x"), scrollInput.getX() - 10, scrollInput.getY() + 6, 0x88dddddd, + true); + graphics.drawString(font, Components.literal(scrollInput.getState() + ""), scrollInput.getX() + 6, + scrollInput.getY() + 6, 0x88dddddd, true); + + PoseStack ms = graphics.pose(); + + for (int i = 0; i < currentStacks().size(); i++) { + IntAttached entry = currentStacks().get(i); + ms.pushPose(); + + ms.translate(x + i % cols * colWidth, y + 20 + i / cols * rowHeight, 200); + + int customCount = currentStacks().get(i) + .getFirst(); + drawItemCount(graphics, customCount, customCount); + ms.translate(0, 0, -200); + + float scaleFromHover = hoveredSlot == i ? 1.075f : 1; + ms.translate((colWidth - 18) / 2.0, (rowHeight - 18) / 2.0, 0); + ms.translate(18 / 2.0, 18 / 2.0, 0); + ms.scale(scaleFromHover, scaleFromHover, scaleFromHover); + ms.translate(-18 / 2.0, -18 / 2.0, 0); + GuiGameElement.of(entry.getSecond()) + .render(graphics); + ms.popPose(); + } + + if (hoveredSlot != -1) + graphics.renderTooltip(font, currentStacks().get(hoveredSlot) + .getValue(), mouseX, mouseY); + } + + private List> currentStacks() { + return menu.contentHolder.requestData.encodedRequest.stacks(); + } + + private int getHoveredSlot(int mouseX, int mouseY) { + if (mouseY < getGuiTop() + 20 || mouseY > getGuiTop() + 20 + rowHeight) + return -1; + int slot = (mouseX - getGuiLeft()) / colWidth; + if (slot >= currentStacks().size()) + return -1; + return Math.max(-1, slot); + } + + private void drawItemCount(GuiGraphics graphics, int count, int customCount) { // TODO same methods in stock ticker + // screens + boolean special = customCount != count; + if (!special && count == 1) + return; + + count = customCount; + String text = count >= 1000000 ? (count / 1000000) + "m" + : count >= 10000 ? (count / 1000) + "k" + : count >= 1000 ? ((count * 10) / 1000) / 10f + "k" + : count >= 100 ? count + "" : count > 0 ? " " + count : " \u2714"; + + int lightOutline = 0x444444; + int darkOutline = 0x222222; + int middleColor = special ? 0xaaffaa : 0xdddddd; + + for (int xi : Iterate.positiveAndNegative) + graphics.drawString(font, CreateLang.text(text) + .component(), 11 + xi, 10, xi < 0 ? lightOutline : darkOutline, false); + for (int yi : Iterate.positiveAndNegative) + graphics.drawString(font, CreateLang.text(text) + .component(), 11, 10 + yi, yi < 0 ? lightOutline : darkOutline, false); + graphics.drawString(font, CreateLang.text(text) + .component(), 11, 10, middleColor, false); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothRenderer.java b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothRenderer.java new file mode 100644 index 0000000000..6a56edb41d --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothRenderer.java @@ -0,0 +1,72 @@ +package com.simibubi.create.content.logistics.displayCloth; + +import java.util.List; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; +import com.simibubi.create.AllPartialModels; +import com.simibubi.create.content.logistics.depot.DepotRenderer; + +import dev.engine_room.flywheel.lib.model.baked.PartialModel; +import net.createmod.catnip.render.CachedBuffers; +import net.createmod.catnip.render.SuperByteBuffer; +import net.createmod.catnip.utility.IntAttached; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.Sheets; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Blocks; + +public class DisplayClothRenderer extends EntityRenderer { + + public DisplayClothRenderer(EntityRendererProvider.Context context) { + super(context); + } + + @Override + public void render(DisplayClothEntity entity, float yaw, float pt, PoseStack ms, MultiBufferSource buffer, + int light) { + PartialModel partialModel = AllPartialModels.DISPLAY_CLOTH; + SuperByteBuffer sbb = CachedBuffers.partial(partialModel, Blocks.AIR.defaultBlockState()); + + sbb.rotateYDegrees(180 + -entity.getYRot()) + .translate(-.5, 0, -.5) + .light(light) + .renderInto(ms, buffer.getBuffer(Sheets.solidBlockSheet())); + + if (entity.requestData == null) { + super.render(entity, yaw, pt, ms, buffer, light); + return; + } + + List> stacks = entity.requestData.encodedRequest.stacks(); + + for (int i = 0; i < stacks.size(); i++) { + IntAttached entry = stacks.get(i); + ms.pushPose(); + ms.translate(0, 3 / 16f, 0); + + if (stacks.size() > 1) { + ms.mulPose(Axis.YP.rotationDegrees(-entity.getYRot() + i * (360f / stacks.size()))); + ms.translate(0, i % 2 == 0 ? -0.005 : 0, 4 / 16f); + ms.mulPose(Axis.YP.rotationDegrees(entity.getYRot() - i * (360f / stacks.size()))); + } + + ms.mulPose(Axis.YP.rotationDegrees(180)); + DepotRenderer.renderItem(entity.level(), ms, buffer, light, OverlayTexture.NO_OVERLAY, entry.getSecond(), 0, + null, entity.position(), true); + ms.popPose(); + } + + super.render(entity, yaw, pt, ms, buffer, light); + } + + @Override + public ResourceLocation getTextureLocation(DisplayClothEntity entity) { + return null; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/ShoppingListItem.java b/src/main/java/com/simibubi/create/content/logistics/displayCloth/ShoppingListItem.java new file mode 100644 index 0000000000..e164663fd9 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/displayCloth/ShoppingListItem.java @@ -0,0 +1,193 @@ +package com.simibubi.create.content.logistics.displayCloth; + +import java.util.List; +import java.util.UUID; + +import com.simibubi.create.content.logistics.packager.InventorySummary; +import com.simibubi.create.foundation.utility.CreateLang; + +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.IntAttached; +import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.utility.lang.Components; +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.nbt.Tag; +import net.minecraft.network.chat.Component; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.EntityGetter; +import net.minecraft.world.level.Level; + +public class ShoppingListItem extends Item { + + public static record ShoppingList(List> purchases, UUID shopOwner, UUID shopNetwork) { + + public static ShoppingList load(CompoundTag tag) { + return new ShoppingList( + NBTHelper.readCompoundList(tag.getList("Purchases", Tag.TAG_COMPOUND), + c -> IntAttached.read(c, NbtUtils::readBlockPos)), + tag.getUUID("ShopOwner"), tag.getUUID("ShopNetwork")); + } + + public CompoundTag save() { + CompoundTag tag = new CompoundTag(); + tag.put("Purchases", + NBTHelper.writeCompoundList(purchases, ia -> ia.serializeNBT(NbtUtils::writeBlockPos))); + tag.putUUID("ShopOwner", shopOwner); + tag.putUUID("ShopNetwork", shopNetwork); + return tag; + } + + // Y value of clothPos is pixel perfect (x16) + public void addPurchases(BlockPos clothPos, int amount) { + for (IntAttached entry : purchases) { + if (clothPos.equals(entry.getValue())) { + entry.setFirst(entry.getFirst() + amount); + return; + } + } + purchases.add(IntAttached.with(amount, clothPos)); + } + + public int getPurchases(BlockPos clothPos) { + for (IntAttached entry : purchases) + if (clothPos.equals(entry.getValue())) + return entry.getFirst(); + return 0; + } + + public Couple bakeEntries(EntityGetter level) { + InventorySummary input = new InventorySummary(); + InventorySummary output = new InventorySummary(); + + for (IntAttached entry : purchases) { + DisplayClothEntity entity = DisplayClothEntity.getAtPosWithPixelY(level, entry.getValue()); + if (entity == null) + continue; + input.add(entity.paymentItem, entity.paymentAmount * entry.getFirst()); + for (IntAttached stackEntry : entity.requestData.encodedRequest.stacks()) + output.add(stackEntry.getValue(), stackEntry.getFirst() * entry.getFirst()); + } + + return Couple.create(output, input); + } + } + + public ShoppingListItem(Properties pProperties) { + super(pProperties); + } + + public static ShoppingList getList(ItemStack stack) { + if (!stack.hasTag() || !stack.getTag() + .contains("ShoppingList")) + return null; + return ShoppingList.load(stack.getTag() + .getCompound("ShoppingList")); + } + + public static ItemStack saveList(ItemStack stack, ShoppingList list, String address) { + CompoundTag tag = stack.getOrCreateTag(); + tag.put("ShoppingList", list.save()); + tag.putString("Address", address); + return stack; + } + + public static String getAddress(ItemStack stack) { + if (!stack.hasTag()) + return ""; + return stack.getTag() + .getString("Address"); + } + + @Override + public void appendHoverText(ItemStack pStack, Level pLevel, List pTooltipComponents, + TooltipFlag pIsAdvanced) { + ShoppingList list = getList(pStack); + + if (list != null) { + Couple lists = list.bakeEntries(pLevel); + + if (lists != null) { + for (InventorySummary items : lists) { + List> entries = items.getStacksByCount(); + boolean cost = items == lists.getSecond(); + + if (cost) + pTooltipComponents.add(Components.empty()); + + if (entries.size() == 1) { + IntAttached entry = entries.get(0); + CreateLang.text(cost ? "Total cost: " : "") + .style(ChatFormatting.GOLD) + .add(CreateLang.builder() + .add(entry.getSecond() + .getHoverName()) + .text(" x") + .text(String.valueOf(entry.getFirst())) + .style(cost ? ChatFormatting.YELLOW : ChatFormatting.GRAY)) + .addTo(pTooltipComponents); + + } else { + if (cost) + CreateLang.text("Total cost: ") + .style(ChatFormatting.GOLD) + .addTo(pTooltipComponents); + for (IntAttached entry : entries) { + CreateLang.builder() + .add(entry.getSecond() + .getHoverName()) + .text(" x") + .text(String.valueOf(entry.getFirst())) + .style(cost ? ChatFormatting.YELLOW : ChatFormatting.GRAY) + .addTo(pTooltipComponents); + } + } + } + } + } + + CreateLang.text("Hand this to a shop keeper") + .style(ChatFormatting.GRAY) + .addTo(pTooltipComponents); + + CreateLang.text("Sneak-Click to discard") + .style(ChatFormatting.DARK_GRAY) + .addTo(pTooltipComponents); + } + + @Override + public InteractionResultHolder use(Level pLevel, Player pPlayer, InteractionHand pUsedHand) { + if (pUsedHand == InteractionHand.OFF_HAND || pPlayer == null || !pPlayer.isShiftKeyDown()) + return new InteractionResultHolder(InteractionResult.PASS, pPlayer.getItemInHand(pUsedHand)); + + CreateLang.text("Shopping list discarded") + .sendStatus(pPlayer); + pPlayer.playSound(SoundEvents.BOOK_PAGE_TURN); + return new InteractionResultHolder(InteractionResult.SUCCESS, ItemStack.EMPTY); + } + + @Override + public InteractionResult useOn(UseOnContext pContext) { + InteractionHand pUsedHand = pContext.getHand(); + Player pPlayer = pContext.getPlayer(); + if (pUsedHand == InteractionHand.OFF_HAND || pPlayer == null || !pPlayer.isShiftKeyDown()) + return InteractionResult.PASS; + pPlayer.setItemInHand(pUsedHand, ItemStack.EMPTY); + + CreateLang.text("Shopping list discarded") + .sendStatus(pPlayer); + pPlayer.playSound(SoundEvents.BOOK_PAGE_TURN); + return InteractionResult.SUCCESS; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBlockItem.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBlockItem.java index f64b6b79e1..97b7b5f1a4 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBlockItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBlockItem.java @@ -1,7 +1,6 @@ package com.simibubi.create.content.logistics.packagerLink; import java.util.List; -import java.util.UUID; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import com.simibubi.create.foundation.utility.CreateLang; @@ -66,6 +65,7 @@ public class LogisticallyLinkedBlockItem extends BlockItem { return InteractionResult.FAIL; LogisticallyLinkedBehaviour link = BlockEntityBehaviour.get(level, pos, LogisticallyLinkedBehaviour.TYPE); + boolean tuned = isTuned(stack); if (link != null) { if (level.isClientSide) @@ -85,7 +85,7 @@ public class LogisticallyLinkedBlockItem extends BlockItem { if (level.isClientSide || useOn == InteractionResult.FAIL) return useOn; - player.displayClientMessage(isTuned(stack) ? CreateLang.translateDirect("logistically_linked.connected") + player.displayClientMessage(tuned ? CreateLang.translateDirect("logistically_linked.connected") : CreateLang.translateDirect("logistically_linked.new_network_started"), true); return useOn; } diff --git a/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/AutoRequestData.java b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/AutoRequestData.java new file mode 100644 index 0000000000..50511c68b1 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/AutoRequestData.java @@ -0,0 +1,81 @@ +package com.simibubi.create.content.logistics.redstoneRequester; + +import com.simibubi.create.content.logistics.stockTicker.PackageOrder; +import com.simibubi.create.content.logistics.stockTicker.StockTickerBlockEntity; +import com.simibubi.create.foundation.utility.CreateLang; + +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; + +public class AutoRequestData { + + public PackageOrder encodedRequest = PackageOrder.empty(); + public String encodedTargetAdress = ""; + public BlockPos targetOffset = BlockPos.ZERO; + public String targetDim = ""; + public boolean isValid = false; + + public void triggerRequest(Level level, BlockPos position) { + BlockPos tickerPos = position.offset(targetOffset); + if (!level.isLoaded(tickerPos)) + return; + BlockEntity blockEntity = level.getBlockEntity(tickerPos); + if (blockEntity instanceof StockTickerBlockEntity stbe) + stbe.broadcastPackageRequest(encodedRequest, null, encodedTargetAdress); + } + + public static AutoRequestData read(CompoundTag tag) { + AutoRequestData requestData = new AutoRequestData(); + requestData.targetOffset = NbtUtils.readBlockPos(tag.getCompound("TargetOffset")); + requestData.targetDim = tag.getString("TargetDim"); + requestData.isValid = tag.getBoolean("Valid"); + requestData.encodedTargetAdress = tag.getString("EncodedAddress"); + requestData.encodedRequest = PackageOrder.read(tag.getCompound("EncodedRequest")); + return requestData; + } + + public void write(CompoundTag tag) { + tag.put("TargetOffset", NbtUtils.writeBlockPos(targetOffset)); + tag.putString("TargetDim", targetDim); + tag.putBoolean("Valid", isValid); + tag.putString("EncodedAddress", encodedTargetAdress); + tag.put("EncodedRequest", encodedRequest.write()); + } + + public void writeToItem(BlockPos position, ItemStack itemStack) { + CompoundTag tag = itemStack.getOrCreateTag(); + write(tag); + tag.put("TargetOffset", NbtUtils.writeBlockPos(position.offset(targetOffset))); + tag.remove("Valid"); + itemStack.setTag(tag); + } + + public static AutoRequestData readFromItem(Level level, Player player, BlockPos position, ItemStack itemStack) { + CompoundTag tag = itemStack.getTag(); + if (tag == null) + return null; + + AutoRequestData requestData = read(tag); + requestData.targetOffset = requestData.targetOffset.subtract(position); + requestData.isValid = + requestData.targetOffset.closerThan(BlockPos.ZERO, 128) && requestData.targetDim.equals(level.dimension() + .location() + .toString()); + + if (player != null) + CreateLang + .translate(requestData.isValid ? "redstone_requester.keeper_connected" + : "redstone_requester.keeper_too_far_away") + .style(requestData.isValid ? ChatFormatting.WHITE : ChatFormatting.RED) + .sendStatus(player); + + return requestData; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlock.java b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlock.java index c086aca4e7..8d578138f0 100644 --- a/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlock.java @@ -4,18 +4,17 @@ import java.util.List; import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllItems; import com.simibubi.create.content.logistics.stockTicker.PackageOrder; import com.simibubi.create.content.logistics.stockTicker.StockTickerBlockEntity; import com.simibubi.create.foundation.block.IBE; import com.simibubi.create.foundation.utility.CreateLang; import net.createmod.catnip.utility.IntAttached; -import net.createmod.catnip.utility.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.NbtUtils; import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; @@ -48,32 +47,36 @@ public class RedstoneRequesterBlock extends Block implements IBE pTooltip, TooltipFlag pFlag) { super.appendHoverText(pStack, pLevel, pTooltip, pFlag); - CompoundTag compoundnbt = pStack.getOrCreateTag(); - if (!compoundnbt.contains("BlockEntityTag", Tag.TAG_COMPOUND)) - return; - compoundnbt = compoundnbt.getCompound("BlockEntityTag"); + appendRequesterTooltip(pStack, pTooltip); + } - if (compoundnbt.contains("EncodedAddress", Tag.TAG_STRING)) - pTooltip.add(Components.literal("-> " + compoundnbt.getString("EncodedAddress")) - .withStyle(ChatFormatting.GOLD)); + public static void appendRequesterTooltip(ItemStack pStack, List pTooltip) { + if (!pStack.hasTag()) + return; + + CompoundTag compoundnbt = pStack.getTag(); +// if (compoundnbt.contains("EncodedAddress", Tag.TAG_STRING)) +// pTooltip.add(Components.literal("-> " + compoundnbt.getString("EncodedAddress")) +// .withStyle(ChatFormatting.GOLD)); if (!compoundnbt.contains("EncodedRequest", Tag.TAG_COMPOUND)) return; @@ -87,39 +90,18 @@ public class RedstoneRequesterBlock extends Block implements IBE { - CompoundTag tag = pStack.getTag(); - BlockPos tickerPos = NbtUtils.readBlockPos(tag.getCompound("StockTickerPos")); - String tickerDim = tag.getString("StockTickerDim"); - - rrbe.targetOffset = tickerPos.subtract(requesterPos); - rrbe.targetDim = tickerDim; - rrbe.isValid = tickerPos.closerThan(requesterPos, 128) && tickerDim.equals(pLevel.dimension() - .location() - .toString()); - - if (pPlacer instanceof Player player) - CreateLang - .translate( - rrbe.isValid ? "redstone_requester.keeper_connected" : "redstone_requester.keeper_too_far_away") - .style(rrbe.isValid ? ChatFormatting.WHITE : ChatFormatting.RED) - .sendStatus(player); - }); - + Player player = pPlacer instanceof Player ? (Player) pPlacer : null; + withBlockEntityDo(pLevel, requesterPos, + rrbe -> rrbe.requestData = AutoRequestData.readFromItem(pLevel, player, requesterPos, pStack)); } @Override @@ -130,18 +112,9 @@ public class RedstoneRequesterBlock extends Block implements IBE type, BlockPos pos, BlockState state) { super(type, pos, state); - encodedRequest = PackageOrder.empty(); - encodedTargetAdress = ""; - targetOffset = BlockPos.ZERO; - targetDim = ""; } @Override @@ -40,44 +28,24 @@ public class RedstoneRequesterBlockEntity extends SmartBlockEntity { return; if (hasNeighborSignal) - triggerRequest(); + requestData.triggerRequest(level, worldPosition); redstonePowered = hasNeighborSignal; setChanged(); } - private void triggerRequest() { - BlockPos tickerPos = worldPosition.offset(targetOffset); - if (!level.isLoaded(tickerPos)) - return; - BlockEntity blockEntity = level.getBlockEntity(tickerPos); - if (blockEntity instanceof StockTickerBlockEntity stbe) - stbe.broadcastPackageRequest(encodedRequest, null, encodedTargetAdress); - } - @Override protected void read(CompoundTag tag, boolean clientPacket) { super.read(tag, clientPacket); redstonePowered = tag.getBoolean("Powered"); - targetOffset = NbtUtils.readBlockPos(tag.getCompound("TargetOffset")); - targetDim = tag.getString("TargetDim"); - isValid = tag.getBoolean("Valid"); - - encodedTargetAdress = tag.getString("EncodedAddress"); - encodedRequest = PackageOrder.read(tag.getCompound("EncodedRequest")); + requestData = AutoRequestData.read(tag); } @Override protected void write(CompoundTag tag, boolean clientPacket) { super.write(tag, clientPacket); tag.putBoolean("Powered", redstonePowered); - tag.put("TargetOffset", NbtUtils.writeBlockPos(targetOffset)); - tag.putString("TargetDim", targetDim); - tag.putBoolean("Valid", isValid); - - tag.putString("EncodedAddress", encodedTargetAdress); - tag.put("EncodedRequest", encodedRequest.write()); - + requestData.write(tag); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalStockRequestPacket.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalStockRequestPacket.java index bc6e15883f..bf1cc7934f 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalStockRequestPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalStockRequestPacket.java @@ -30,5 +30,10 @@ public class LogisticalStockRequestPacket extends BlockEntityConfigurationPacket be.getRecentSummary() .divideAndSendTo(player, pos); } + + @Override + protected int maxRange() { + return 4096; + } } diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrder.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrder.java index 3f11e5b132..178a60df1b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrder.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrder.java @@ -26,11 +26,11 @@ public record PackageOrder(List> stacks) { tag.put("Entries", list); return tag; } - + public static PackageOrder empty() { return new PackageOrder(List.of()); } - + public boolean isEmpty() { return stacks.isEmpty(); } diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java index 1165c94702..0c65ce6c31 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java @@ -6,6 +6,7 @@ import java.util.List; import org.apache.commons.lang3.mutable.MutableBoolean; import com.simibubi.create.AllPackets; +import com.simibubi.create.content.contraptions.actors.seat.SeatEntity; import com.simibubi.create.content.logistics.packager.InventorySummary; import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedBehaviour; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; @@ -13,21 +14,25 @@ import com.simibubi.create.foundation.blockEntity.behaviour.inventory.InvManipul import net.createmod.catnip.utility.BlockFace; import net.createmod.catnip.utility.IntAttached; +import net.createmod.catnip.utility.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; import net.minecraftforge.items.IItemHandler; public class StockTickerBlockEntity extends StockCheckingBlockEntity { // Player-interface Feature protected List> lastClientsideStockSnapshot; + protected InventorySummary lastClientsideStockSnapshotAsSummary; protected List> newlyReceivedStockSnapshot; protected String previouslyUsedAddress; protected int activeLinks; + protected int ticksSinceLastUpdate; // Auto-restock Feature protected InvManipulationBehaviour observedInventory; @@ -50,6 +55,7 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity { } public void refreshClientStockSnapshot() { + ticksSinceLastUpdate = 0; AllPackets.getChannel() .sendToServer(new LogisticalStockRequestPacket(worldPosition)); } @@ -58,11 +64,22 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity { return lastClientsideStockSnapshot; } + public InventorySummary getLastClientsideStockSnapshotAsSummary() { + return lastClientsideStockSnapshotAsSummary; + } + + public int getTicksSinceLastUpdate() { + return ticksSinceLastUpdate; + } + @Override public void tick() { super.tick(); - if (level.isClientSide()) + if (level.isClientSide()) { + if (ticksSinceLastUpdate < 100) + ticksSinceLastUpdate += 1; return; + } if (activeLinks != activeLinksLastSummary && !isRemoved()) { activeLinks = activeLinksLastSummary; sendData(); @@ -159,6 +176,8 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity { if (!endOfTransmission) return; lastClientsideStockSnapshot = newlyReceivedStockSnapshot; + lastClientsideStockSnapshotAsSummary = new InventorySummary(); + stacks.forEach(lastClientsideStockSnapshotAsSummary::add); newlyReceivedStockSnapshot = null; } @@ -209,4 +228,17 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity { notifyUpdate(); } + public boolean isKeeperPresent() { + for (int yOffset : Iterate.zeroAndOne) { + for (Direction side : Iterate.horizontalDirections) { + BlockPos seatPos = worldPosition.below(yOffset) + .relative(side); + for (SeatEntity seatEntity : level.getEntitiesOfClass(SeatEntity.class, new AABB(seatPos))) + if (seatEntity.isVehicle()) + return true; + } + } + return false; + } + } diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java index e98e5f5799..98e1afca8a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java @@ -1,17 +1,22 @@ package com.simibubi.create.content.logistics.stockTicker; import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllItems; import com.simibubi.create.content.contraptions.actors.seat.SeatEntity; +import com.simibubi.create.content.logistics.displayCloth.ShoppingListItem; +import com.simibubi.create.content.logistics.displayCloth.ShoppingListItem.ShoppingList; import net.createmod.catnip.gui.ScreenOpener; import net.createmod.catnip.utility.Iterate; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -31,22 +36,64 @@ public class StockTickerInteractionHandler { return; if (player.isSpectator()) return; + + Level level = event.getLevel(); + BlockPos targetPos = getStockTickerPosition(entity); + if (targetPos == null) + return; + + ItemStack mainHandItem = player.getMainHandItem(); + if (AllItems.SHOPPING_LIST.isIn(mainHandItem)) { + + if (!level.isClientSide()) { + if (!(level.getBlockEntity(targetPos) instanceof StockTickerBlockEntity tickerBE)) + return; + ShoppingList list = ShoppingListItem.getList(mainHandItem); + if (list == null) + return; + + PackageOrder order = new PackageOrder(list.bakeEntries(level) + .getFirst() + .getStacksByCount()); + + tickerBE.broadcastPackageRequest(order, null, ShoppingListItem.getAddress(mainHandItem)); + player.setItemInHand(InteractionHand.MAIN_HAND, ItemStack.EMPTY); + } + + event.setCancellationResult(InteractionResult.SUCCESS); + event.setCanceled(true); + return; + } + + final BlockPos posForUI = targetPos; + final boolean encodeMode = + AllItems.DISPLAY_CLOTH.isIn(mainHandItem) || AllBlocks.REDSTONE_REQUESTER.isIn(mainHandItem); + + if (level.isClientSide()) + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> displayScreen(posForUI, encodeMode)); + + event.setCancellationResult(InteractionResult.SUCCESS); + event.setCanceled(true); + return; + } + + public static BlockPos getStockTickerPosition(Entity entity) { Entity rootVehicle = entity.getRootVehicle(); if (!(rootVehicle instanceof SeatEntity)) - return; + return null; if (!(entity instanceof LivingEntity living)) - return; + return null; BlockPos pos = entity.blockPosition(); int stations = 0; - Level level = event.getLevel(); BlockPos targetPos = null; for (Direction d : Iterate.horizontalDirections) { for (int y : Iterate.zeroAndOne) { BlockPos workstationPos = pos.relative(d) .above(y); - if (!(level.getBlockState(workstationPos) + if (!(entity.level() + .getBlockState(workstationPos) .getBlock() instanceof StockTickerBlock lw)) continue; targetPos = workstationPos; @@ -55,16 +102,8 @@ public class StockTickerInteractionHandler { } if (stations != 1) - return; - - final BlockPos posForUI = targetPos; - if (level.isClientSide()) - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, - () -> () -> displayScreen(posForUI, AllBlocks.REDSTONE_REQUESTER.isIn(player.getMainHandItem()))); - - event.setCancellationResult(InteractionResult.SUCCESS); - event.setCanceled(true); - return; + return null; + return targetPos; } @OnlyIn(Dist.CLIENT) diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java index fe3a8c4b01..63321e1cd4 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java @@ -36,7 +36,6 @@ import net.minecraftforge.registries.ForgeRegistries; public class StockTickerRequestScreen extends AbstractSimiScreen { StockTickerBlockEntity blockEntity; - int ticksSinceLastUpdate = 0; LerpedFloat itemScroll; final int rows = 8; @@ -69,7 +68,7 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { itemsToOrder = new ArrayList<>(); blockEntity = be; blockEntity.lastClientsideStockSnapshot = null; - ticksSinceLastUpdate = 15; + blockEntity.ticksSinceLastUpdate = 15; emptyTicks = 0; successTicks = 0; itemScroll = LerpedFloat.linear() @@ -187,13 +186,8 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { if (Math.abs(itemScroll.getValue() - itemScroll.getChaseTarget()) < 1 / 16f) itemScroll.setValue(itemScroll.getChaseTarget()); - if (ticksSinceLastUpdate < 15) { - ticksSinceLastUpdate++; - return; - } - - ticksSinceLastUpdate = 0; - blockEntity.refreshClientStockSnapshot(); + if (blockEntity.ticksSinceLastUpdate > 15) + blockEntity.refreshClientStockSnapshot(); } @Override @@ -504,7 +498,7 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { if (existingOrder == null) { if (itemsToOrder.size() >= cols || rmb) return true; - itemsToOrder.add(existingOrder = IntAttached.withZero(itemStack)); + itemsToOrder.add(existingOrder = IntAttached.withZero(itemStack.copyWithCount(1))); } int transfer = hasShiftDown() ? itemStack.getMaxStackSize() : 1; @@ -595,7 +589,7 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { addressBox.getValue(), encodeRequester)); itemsToOrder = new ArrayList<>(); - ticksSinceLastUpdate = 10; + blockEntity.ticksSinceLastUpdate = 10; successTicks = 1; if (encodeRequester) diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java index 1b04a02224..1762226567 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java @@ -999,13 +999,9 @@ public class StandardRecipeGen extends CreateRecipeProvider { .pattern("C") .pattern("S")), - LOGISTICS_LINK_CLEAR = create(AllBlocks.PACKAGER_LINK).withSuffix("_clear") - .unlockedBy(AllBlocks.PACKAGER_LINK::asItem) - .viaShapeless(b -> b.requires(AllBlocks.PACKAGER_LINK)), - - STOCK_TICKER_CLEAR = create(AllBlocks.STOCK_TICKER).withSuffix("_clear") - .unlockedBy(AllBlocks.STOCK_TICKER::asItem) - .viaShapeless(b -> b.requires(AllBlocks.STOCK_TICKER)), + LOGISTICS_LINK_CLEAR = clearData(AllBlocks.PACKAGER_LINK), + STOCK_TICKER_CLEAR = clearData(AllBlocks.STOCK_TICKER), + REDSTONE_REQUESTER_CLEAR = clearData(AllBlocks.REDSTONE_REQUESTER), DISPLAY_LINK = create(AllBlocks.DISPLAY_LINK).unlockedBy(I::brassCasing) .viaShaped(b -> b.define('C', Blocks.REDSTONE_TORCH) @@ -1080,6 +1076,7 @@ public class StandardRecipeGen extends CreateRecipeProvider { CLIPBOARD_CLEAR = clearData(AllBlocks.CLIPBOARD), SCHEDULE_CLEAR = clearData(AllItems.SCHEDULE), FILTER_CLEAR = clearData(AllItems.FILTER), ATTRIBUTE_FILTER_CLEAR = clearData(AllItems.ATTRIBUTE_FILTER), + DISPLAY_CLOTH_CLEAR = clearData(AllItems.DISPLAY_CLOTH), DIVING_HELMET = create(AllItems.COPPER_DIVING_HELMET).unlockedByTag(I::copper) .viaShaped(b -> b.define('G', Tags.Items.GLASS) diff --git a/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java b/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java index b3bdd93e3a..9e773893fb 100644 --- a/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java @@ -38,8 +38,8 @@ import com.simibubi.create.content.kinetics.fan.AirCurrent; import com.simibubi.create.content.kinetics.mechanicalArm.ArmInteractionPointHandler; import com.simibubi.create.content.kinetics.turntable.TurntableHandler; import com.simibubi.create.content.logistics.depot.EjectorTargetHandler; +import com.simibubi.create.content.logistics.displayCloth.DisplayClothOverlayRenderer; import com.simibubi.create.content.logistics.frogport.FrogportTargetSelectionHandler; -import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedBlockItem; import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedClientHandler; import com.simibubi.create.content.processing.sequenced.SequencedAssemblyRecipe; import com.simibubi.create.content.redstone.displayLink.ClickToLinkBlockItem; @@ -182,6 +182,7 @@ public class ClientEvents { ChainConveyorConnectionHandler.clientTick(); FrogportTargetSelectionHandler.tick(); LogisticallyLinkedClientHandler.tick(); + DisplayClothOverlayRenderer.tick(); } @SubscribeEvent diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java index 8bb1199b2c..2549cf5d29 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java @@ -173,6 +173,7 @@ public enum AllGuiTextures implements ScreenElement, TextureSheetSegment { INDICATOR_RED("widgets", 72, 18, 18, 6), HOTSLOT_ARROW("widgets", 24, 51, 20, 12), + HOTSLOT_ARROW_BAD("widgets", 52, 51, 20, 15), HOTSLOT("widgets", 0, 68, 22, 22), HOTSLOT_ACTIVE("widgets", 0, 46, 22, 22), HOTSLOT_SUPER_ACTIVE("widgets", 27, 67, 24, 24), @@ -189,6 +190,8 @@ public enum AllGuiTextures implements ScreenElement, TextureSheetSegment { TRAIN_PROMPT_L("widgets", 8, 209, 3, 16), TRAIN_PROMPT_R("widgets", 11, 209, 3, 16), TRAIN_PROMPT("widgets", 0, 230, 256, 16), + + TRADE_OVERLAY("widgets", 136, 97, 98, 48), // ComputerCraft COMPUTER("computer", 200, 102); diff --git a/src/main/resources/assets/create/models/entity/display_cloth.json b/src/main/resources/assets/create/models/entity/display_cloth.json new file mode 100644 index 0000000000..a6a95e517a --- /dev/null +++ b/src/main/resources/assets/create/models/entity/display_cloth.json @@ -0,0 +1,81 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:entity/display_cloth", + "particle": "create:entity/display_cloth" + }, + "elements": [ + { + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 1, + 16 + ], + "faces": { + "north": { + "uv": [ + 0, + 0, + 16, + 1 + ], + "rotation": 180, + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 15, + 16, + 16 + ], + "rotation": 180, + "texture": "#0" + }, + "south": { + "uv": [ + 0, + 15, + 16, + 16 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0, + 0, + 1, + 16 + ], + "rotation": 270, + "texture": "#0" + }, + "up": { + "uv": [ + 0, + 0, + 16, + 16 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 0, + 0, + 16, + 16 + ], + "rotation": 270, + "texture": "#0" + } + } + } + ] +} diff --git a/src/main/resources/assets/create/textures/entity/display_cloth.png b/src/main/resources/assets/create/textures/entity/display_cloth.png new file mode 100644 index 0000000000000000000000000000000000000000..9ec8453802571427621129098f20ef9e9761e4a2 GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFM1 zMG8<*-qXb~MB;L?1B0VRN%~w=KSYn+RgVnes&n{v80#wT2>FVdQ I&MBb@0Esy@X8-^I literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/gui/widgets.png b/src/main/resources/assets/create/textures/gui/widgets.png index cc8cf5bef63005aae0a1a6dc73e7910080d3cf8e..02de6640b58643abae723bc9a0686ba0cc56f887 100644 GIT binary patch literal 10512 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 MFLa*QC|O7RFKb5fT>t<8 literal 9904 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 Sme(wxsSKX3elF{r5}E*kol!0T literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/item/shopping_list.png b/src/main/resources/assets/create/textures/item/shopping_list.png new file mode 100644 index 0000000000000000000000000000000000000000..d19a216b3312277be04ed7c8e73d12478519bc89 GIT binary patch literal 261 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}H0G|-oRcrUXdHdu4|Nj*Y3#QE6aP#J)z=*=c?Eb??F9MaU{oXzaNO6?} z`2_>jKmfz0GdkyiqMQXDk;M!Qe1}1p@p%4<6rf;~r;B5VMsR9xq*#Li2XnK|*6;f_ z=xpsiCocJk;qPGqkD^sR)1Citom>-OuBsHTG^0skP1;&n-tIy(iCx|G%x}!i3e7Ag tRGV5{b9!Rm-e5IBbC>AM*Dn@*XZMm|OL=>IHV4oa22WQ%mvv4FO#pt9VDbO} literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/atlases/blocks.json b/src/main/resources/assets/minecraft/atlases/blocks.json index 9c4f27da03..2eafe5f5c7 100644 --- a/src/main/resources/assets/minecraft/atlases/blocks.json +++ b/src/main/resources/assets/minecraft/atlases/blocks.json @@ -12,6 +12,10 @@ "type": "single", "resource": "create:entity/blueprint_small" }, + { + "type": "single", + "resource": "create:entity/display_cloth" + }, { "type": "single", "resource": "create:entity/coupling" From d325c827ba612d61c7e88ee59842c432dae41677 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 4 Oct 2024 11:53:24 +0200 Subject: [PATCH 068/515] You will pay for this - Implemented cost of purchase being transferred to the stock ticker block --- .../blueprint/BlueprintOverlayRenderer.java | 29 +++- .../displayCloth/DisplayClothEntity.java | 38 ++++-- .../DisplayClothOverlayRenderer.java | 4 +- .../displayCloth/ShoppingListItem.java | 20 +-- .../logistics/packager/InventorySummary.java | 10 +- .../stockTicker/StockCheckingBlockEntity.java | 2 +- .../stockTicker/StockTickerBlock.java | 15 +++ .../stockTicker/StockTickerBlockEntity.java | 68 +++++++++- .../StockTickerInteractionHandler.java | 127 +++++++++++++++--- .../create/foundation/utility/CreateLang.java | 5 + 10 files changed, 268 insertions(+), 50 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintOverlayRenderer.java b/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintOverlayRenderer.java index 860ad314a3..c12941c7e7 100644 --- a/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintOverlayRenderer.java +++ b/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintOverlayRenderer.java @@ -13,6 +13,7 @@ import com.simibubi.create.content.equipment.blueprint.BlueprintEntity.Blueprint import com.simibubi.create.content.equipment.blueprint.BlueprintEntity.BlueprintSection; import com.simibubi.create.content.logistics.displayCloth.BlueprintOverlayShopContext; import com.simibubi.create.content.logistics.displayCloth.DisplayClothEntity; +import com.simibubi.create.content.logistics.displayCloth.ShoppingListItem.ShoppingList; import com.simibubi.create.content.logistics.filter.AttributeFilterMenu.WhitelistMode; import com.simibubi.create.content.logistics.filter.FilterItem; import com.simibubi.create.content.logistics.filter.FilterItemStack; @@ -34,6 +35,7 @@ import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.screens.inventory.tooltip.TooltipRenderUtil; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.CraftingContainer; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; @@ -137,13 +139,13 @@ public class BlueprintOverlayRenderer { } } - public static void displayClothShop(DisplayClothEntity dce, int alreadyPurchased) { + public static void displayClothShop(DisplayClothEntity dce, int alreadyPurchased, ShoppingList list) { if (active) return; prepareCustomOverlay(); noOutput = false; - shopContext = new BlueprintOverlayShopContext(false, dce.getStockLevelForTrade(), alreadyPurchased); + shopContext = new BlueprintOverlayShopContext(false, dce.getStockLevelForTrade(list), alreadyPurchased); ingredients.add(Pair.of(dce.paymentItem.copyWithCount(dce.paymentAmount), !dce.paymentItem.isEmpty() && shopContext.stockLevel() > shopContext.purchases())); @@ -155,21 +157,36 @@ public class BlueprintOverlayRenderer { public static void displayShoppingList(Couple bakedList) { if (active || bakedList == null) return; + Minecraft mc = Minecraft.getInstance(); prepareCustomOverlay(); noOutput = false; shopContext = new BlueprintOverlayShopContext(true, 1, 0); for (IntAttached entry : bakedList.getSecond() - .getStacksByCount()) + .getStacksByCount()) { ingredients.add(Pair.of(entry.getSecond() - .copyWithCount(entry.getFirst()), true)); + .copyWithCount(entry.getFirst()), canAfford(mc.player, entry))); + } + for (IntAttached entry : bakedList.getFirst() .getStacksByCount()) results.add(entry.getSecond() .copyWithCount(entry.getFirst())); } + private static boolean canAfford(Player player, IntAttached entry) { + int itemsPresent = 0; + for (int i = 0; i < player.getInventory().items.size(); i++) { + ItemStack item = player.getInventory() + .getItem(i); + if (item.isEmpty() || !ItemHandlerHelper.canItemStacksStack(item, entry.getSecond())) + continue; + itemsPresent += item.getCount(); + } + return itemsPresent >= entry.getFirst(); + } + private static void prepareCustomOverlay() { active = true; empty = false; @@ -342,8 +359,8 @@ public class BlueprintOverlayRenderer { RenderSystem.enableBlend(); (pair.getSecond() ? AllGuiTextures.HOTSLOT_ACTIVE : AllGuiTextures.HOTSLOT).render(graphics, x, y); ItemStack itemStack = pair.getFirst(); - String count = - shopContext != null || pair.getSecond() ? null : ChatFormatting.GOLD.toString() + itemStack.getCount(); + String count = shopContext != null && !shopContext.checkout() || pair.getSecond() ? null + : ChatFormatting.GOLD.toString() + itemStack.getCount(); drawItemStack(graphics, mc, x, y, itemStack, count); x += 21; } diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothEntity.java b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothEntity.java index 490bd520c9..a1fd393179 100644 --- a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothEntity.java @@ -131,7 +131,7 @@ public class DisplayClothEntity extends HangingEntity implements IEntityAddition public InteractionResult interactAsCustomer(Player player) { ItemStack itemInHand = player.getItemInHand(InteractionHand.MAIN_HAND); - ItemStack prevListItem = null; + ItemStack prevListItem = ItemStack.EMPTY; boolean addOntoList = false; // Remove other lists from inventory @@ -153,14 +153,14 @@ public class DisplayClothEntity extends HangingEntity implements IEntityAddition } if (!itemInHand.isEmpty() && !addOntoList) { - CreateLang.text("Empty hand required to start a shopping list") + CreateLang.temporaryText("Empty hand required to start a shopping list") .sendStatus(player); AllSoundEvents.DENY.playOnServer(level(), blockPosition()); return InteractionResult.SUCCESS; } if (paymentItem.isEmpty()) { - CreateLang.text("Shop owner must set a price first") + CreateLang.temporaryText("Shop owner must set a price first") .sendStatus(player); AllSoundEvents.DENY.playOnServer(level(), blockPosition()); return InteractionResult.SUCCESS; @@ -171,10 +171,10 @@ public class DisplayClothEntity extends HangingEntity implements IEntityAddition if (level().getBlockEntity(tickerPos) instanceof StockTickerBlockEntity stbe && stbe.isKeeperPresent()) tickerID = stbe.behaviour.freqId; - int stockLevel = getStockLevelForTrade(); + int stockLevel = getStockLevelForTrade(ShoppingListItem.getList(prevListItem)); if (tickerID == null) { - CreateLang.text("Stock keeper missing") + CreateLang.temporaryText("Stock keeper missing") .style(ChatFormatting.RED) .sendStatus(player); AllSoundEvents.DENY.playOnServer(level(), blockPosition()); @@ -182,10 +182,20 @@ public class DisplayClothEntity extends HangingEntity implements IEntityAddition } if (stockLevel == 0) { - CreateLang.text("Out of Stock") + CreateLang.temporaryText("Out of Stock") .style(ChatFormatting.RED) .sendStatus(player); AllSoundEvents.DENY.playOnServer(level(), blockPosition()); + + if (!prevListItem.isEmpty()) { + if (player.getItemInHand(InteractionHand.MAIN_HAND) + .isEmpty()) + player.setItemInHand(InteractionHand.MAIN_HAND, prevListItem); + else + player.getInventory() + .placeItemBackInInventory(prevListItem); + } + return InteractionResult.SUCCESS; } @@ -202,7 +212,7 @@ public class DisplayClothEntity extends HangingEntity implements IEntityAddition BlockPos posWithPixelY = getPosWithPixelY(); if (list.getPurchases(posWithPixelY) == stockLevel) { - CreateLang.text("Limited stock available") + CreateLang.temporaryText("Limited stock available") .style(ChatFormatting.RED) .sendStatus(player); AllSoundEvents.DENY.playOnServer(level(), blockPosition()); @@ -210,7 +220,7 @@ public class DisplayClothEntity extends HangingEntity implements IEntityAddition } else { list.addPurchases(posWithPixelY, 1); if (!addOntoList) - CreateLang.text("Use this list to add more to your purchase") + CreateLang.temporaryText("Use this list to add more to your purchase") .color(0xeeeeee) .sendStatus(player); if (!addOntoList) @@ -231,7 +241,7 @@ public class DisplayClothEntity extends HangingEntity implements IEntityAddition return InteractionResult.SUCCESS; } - public int getStockLevelForTrade() { + public int getStockLevelForTrade(@Nullable ShoppingList otherPurchases) { BlockPos tickerPos = requestData.targetOffset.offset(blockPosition()); if (!(level().getBlockEntity(tickerPos) instanceof StockTickerBlockEntity stbe)) return 0; @@ -248,10 +258,16 @@ public class DisplayClothEntity extends HangingEntity implements IEntityAddition if (recentSummary == null) return 0; + InventorySummary modifierSummary = new InventorySummary(); + if (otherPurchases != null) + modifierSummary = otherPurchases.bakeEntries(level(), getPosWithPixelY()) + .getFirst(); + int smallestQuotient = Integer.MAX_VALUE; for (IntAttached entry : requestData.encodedRequest.stacks()) - smallestQuotient = - Math.min(smallestQuotient, recentSummary.getCountOf(entry.getValue()) / entry.getFirst()); + smallestQuotient = Math.min(smallestQuotient, + (recentSummary.getCountOf(entry.getValue()) - modifierSummary.getCountOf(entry.getValue())) + / entry.getFirst()); return smallestQuotient; } diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothOverlayRenderer.java b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothOverlayRenderer.java index 64167dc68f..599a25e422 100644 --- a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothOverlayRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothOverlayRenderer.java @@ -42,7 +42,7 @@ public class DisplayClothOverlayRenderer { if (!tickerBE.behaviour.freqId.equals(list.shopNetwork())) return; - BlueprintOverlayRenderer.displayShoppingList(list.bakeEntries(mc.level)); + BlueprintOverlayRenderer.displayShoppingList(list.bakeEntries(mc.level, null)); return; } @@ -50,7 +50,7 @@ public class DisplayClothOverlayRenderer { if (list != null) alreadyPurchased = list.getPurchases(dce.getPosWithPixelY()); - BlueprintOverlayRenderer.displayClothShop(dce, alreadyPurchased); + BlueprintOverlayRenderer.displayClothShop(dce, alreadyPurchased, list); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/ShoppingListItem.java b/src/main/java/com/simibubi/create/content/logistics/displayCloth/ShoppingListItem.java index e164663fd9..b3edcaf8eb 100644 --- a/src/main/java/com/simibubi/create/content/logistics/displayCloth/ShoppingListItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/displayCloth/ShoppingListItem.java @@ -3,6 +3,8 @@ package com.simibubi.create.content.logistics.displayCloth; import java.util.List; import java.util.UUID; +import javax.annotation.Nullable; + import com.simibubi.create.content.logistics.packager.InventorySummary; import com.simibubi.create.foundation.utility.CreateLang; @@ -66,11 +68,13 @@ public class ShoppingListItem extends Item { return 0; } - public Couple bakeEntries(EntityGetter level) { + public Couple bakeEntries(EntityGetter level, @Nullable BlockPos clothPosToIgnore) { InventorySummary input = new InventorySummary(); InventorySummary output = new InventorySummary(); for (IntAttached entry : purchases) { + if (clothPosToIgnore != null && clothPosToIgnore.equals(entry.getValue())) + continue; DisplayClothEntity entity = DisplayClothEntity.getAtPosWithPixelY(level, entry.getValue()); if (entity == null) continue; @@ -115,7 +119,7 @@ public class ShoppingListItem extends Item { ShoppingList list = getList(pStack); if (list != null) { - Couple lists = list.bakeEntries(pLevel); + Couple lists = list.bakeEntries(pLevel, null); if (lists != null) { for (InventorySummary items : lists) { @@ -127,7 +131,7 @@ public class ShoppingListItem extends Item { if (entries.size() == 1) { IntAttached entry = entries.get(0); - CreateLang.text(cost ? "Total cost: " : "") + CreateLang.temporaryText(cost ? "Total cost: " : "") .style(ChatFormatting.GOLD) .add(CreateLang.builder() .add(entry.getSecond() @@ -139,7 +143,7 @@ public class ShoppingListItem extends Item { } else { if (cost) - CreateLang.text("Total cost: ") + CreateLang.temporaryText("Total cost: ") .style(ChatFormatting.GOLD) .addTo(pTooltipComponents); for (IntAttached entry : entries) { @@ -156,11 +160,11 @@ public class ShoppingListItem extends Item { } } - CreateLang.text("Hand this to a shop keeper") + CreateLang.temporaryText("Hand this to a shop keeper") .style(ChatFormatting.GRAY) .addTo(pTooltipComponents); - CreateLang.text("Sneak-Click to discard") + CreateLang.temporaryText("Sneak-Click to discard") .style(ChatFormatting.DARK_GRAY) .addTo(pTooltipComponents); } @@ -170,7 +174,7 @@ public class ShoppingListItem extends Item { if (pUsedHand == InteractionHand.OFF_HAND || pPlayer == null || !pPlayer.isShiftKeyDown()) return new InteractionResultHolder(InteractionResult.PASS, pPlayer.getItemInHand(pUsedHand)); - CreateLang.text("Shopping list discarded") + CreateLang.temporaryText("Shopping list discarded") .sendStatus(pPlayer); pPlayer.playSound(SoundEvents.BOOK_PAGE_TURN); return new InteractionResultHolder(InteractionResult.SUCCESS, ItemStack.EMPTY); @@ -184,7 +188,7 @@ public class ShoppingListItem extends Item { return InteractionResult.PASS; pPlayer.setItemInHand(pUsedHand, ItemStack.EMPTY); - CreateLang.text("Shopping list discarded") + CreateLang.temporaryText("Shopping list discarded") .sendStatus(pPlayer); pPlayer.playSound(SoundEvents.BOOK_PAGE_TURN); return InteractionResult.SUCCESS; diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/InventorySummary.java b/src/main/java/com/simibubi/create/content/logistics/packager/InventorySummary.java index 5243833a11..2317628715 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/InventorySummary.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/InventorySummary.java @@ -42,12 +42,18 @@ public class InventorySummary { add(entry.getSecond(), entry.getFirst()); } + public InventorySummary copy() { + InventorySummary inventorySummary = new InventorySummary(); + items.forEach((i, list) -> list.forEach(entry -> inventorySummary.add(entry.getSecond(), entry.getFirst()))); + return inventorySummary; + } + public void add(ItemStack stack, int count) { if (count == 0 || stack.isEmpty()) return; totalCount += count; - + List> stacks = items.computeIfAbsent(stack.getItem(), $ -> Lists.newArrayList()); for (IntAttached existing : stacks) { ItemStack existingStack = existing.getSecond(); @@ -89,7 +95,7 @@ public class InventorySummary { } return stacksByCount; } - + public int getTotalCount() { return totalCount; } diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockCheckingBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockCheckingBlockEntity.java index bcc048acb8..fcd6f71d48 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockCheckingBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockCheckingBlockEntity.java @@ -46,7 +46,7 @@ public abstract class StockCheckingBlockEntity extends SmartBlockEntity { return summaryOfLinks; } - protected void refreshInventorySummary() { + public void refreshInventorySummary() { ticksSinceLastSummary = 0; activeLinksLastSummary = 0; summaryOfLinks = new InventorySummary(); diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlock.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlock.java index 9c638d4949..d158412a2d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlock.java @@ -54,6 +54,16 @@ public class StockTickerBlock extends HorizontalDirectionalBlock implements IBE< public InteractionResult use(BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, BlockHitResult pHit) { return onBlockEntityUse(pLevel, pPos, stbe -> { + + if (!stbe.receivedPayments.isEmpty()) { + for (int i = 0; i < stbe.receivedPayments.getSlots(); i++) + pPlayer.getInventory() + .placeItemBackInInventory( + stbe.receivedPayments.extractItem(i, stbe.receivedPayments.getStackInSlot(i) + .getCount(), false)); + return InteractionResult.SUCCESS; + } + if (!stbe.observedInventory.hasInventory()) return InteractionResult.PASS; DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> displayScreen(stbe, pPlayer)); @@ -85,6 +95,11 @@ public class StockTickerBlock extends HorizontalDirectionalBlock implements IBE< return AllPartialModels.LOGISTICS_HAT; } + @Override + public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pMovedByPiston) { + IBE.onRemove(pState, pLevel, pPos, pNewState); + } + @Override public Class getBlockEntityClass() { return StockTickerBlockEntity.class; diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java index 0c65ce6c31..8ea7a5f969 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java @@ -4,27 +4,39 @@ import java.util.ArrayList; import java.util.List; import org.apache.commons.lang3.mutable.MutableBoolean; +import org.checkerframework.checker.units.qual.s; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import com.simibubi.create.AllPackets; import com.simibubi.create.content.contraptions.actors.seat.SeatEntity; +import com.simibubi.create.content.equipment.goggles.IHaveHoveringInformation; import com.simibubi.create.content.logistics.packager.InventorySummary; import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedBehaviour; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import com.simibubi.create.foundation.blockEntity.behaviour.inventory.InvManipulationBehaviour; +import com.simibubi.create.foundation.item.ItemHelper; +import com.simibubi.create.foundation.item.SmartInventory; +import com.simibubi.create.foundation.utility.CreateLang; import net.createmod.catnip.utility.BlockFace; import net.createmod.catnip.utility.IntAttached; import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.lang.Components; +import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.items.IItemHandler; -public class StockTickerBlockEntity extends StockCheckingBlockEntity { +public class StockTickerBlockEntity extends StockCheckingBlockEntity implements IHaveHoveringInformation { // Player-interface Feature protected List> lastClientsideStockSnapshot; @@ -40,11 +52,17 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity { protected String restockAddress; protected boolean powered; + // Shop feature + protected SmartInventory receivedPayments; + protected LazyOptional capability; + public StockTickerBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); previouslyUsedAddress = ""; restockAddress = ""; restockAmounts = PackageOrder.empty(); + receivedPayments = new SmartInventory(27, this, 64, false); + capability = LazyOptional.of(() -> receivedPayments); } @Override @@ -67,7 +85,7 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity { public InventorySummary getLastClientsideStockSnapshotAsSummary() { return lastClientsideStockSnapshotAsSummary; } - + public int getTicksSinceLastUpdate() { return ticksSinceLastUpdate; } @@ -93,6 +111,7 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity { tag.put("RestockAmounts", restockAmounts.write()); tag.putString("RestockAddress", restockAddress); tag.putBoolean("Powered", powered); + tag.put("ReceivedPayments", receivedPayments.serializeNBT()); if (clientPacket) tag.putInt("ActiveLinks", activeLinks); @@ -105,6 +124,7 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity { restockAmounts = PackageOrder.read(tag.getCompound("RestockAmounts")); restockAddress = tag.getString("RestockAddress"); powered = tag.getBoolean("Powered"); + receivedPayments.deserializeNBT(tag.getCompound("ReceivedPayments")); if (clientPacket) activeLinks = tag.getInt("ActiveLinks"); @@ -241,4 +261,48 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity { return false; } + @Override + public boolean addToTooltip(List tooltip, boolean isPlayerSneaking) { + if (receivedPayments.isEmpty()) + return false; + CreateLang.temporaryText("Contains payments:") + .style(ChatFormatting.WHITE) + .forGoggles(tooltip); + + InventorySummary summary = new InventorySummary(); + for (int i = 0; i < receivedPayments.getSlots(); i++) + summary.add(receivedPayments.getStackInSlot(i)); + for (IntAttached entry : summary.getStacksByCount()) + CreateLang.builder() + .text(Components.translatable(entry.getSecond() + .getDescriptionId()) + .getString() + " x" + entry.getFirst()) + .style(ChatFormatting.GREEN) + .forGoggles(tooltip); + + CreateLang.temporaryText("Right-click to retrieve") + .style(ChatFormatting.GRAY) + .forGoggles(tooltip); + return true; + } + + @Override + public @NotNull LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction side) { + if (isItemHandlerCap(cap)) + return capability.cast(); + return super.getCapability(cap, side); + } + + @Override + public void destroy() { + ItemHelper.dropContents(level, worldPosition, receivedPayments); + super.destroy(); + } + + @Override + public void invalidate() { + capability.invalidate(); + super.invalidate(); + } + } diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java index 98e1afca8a..fa76781c92 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java @@ -1,16 +1,26 @@ package com.simibubi.create.content.logistics.stockTicker; +import java.util.ArrayList; +import java.util.List; + import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; +import com.simibubi.create.AllSoundEvents; import com.simibubi.create.content.contraptions.actors.seat.SeatEntity; import com.simibubi.create.content.logistics.displayCloth.ShoppingListItem; import com.simibubi.create.content.logistics.displayCloth.ShoppingListItem.ShoppingList; +import com.simibubi.create.content.logistics.packager.InventorySummary; +import com.simibubi.create.foundation.utility.CreateLang; import net.createmod.catnip.gui.ScreenOpener; +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.IntAttached; import net.createmod.catnip.utility.Iterate; +import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.util.Mth; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.Entity; @@ -24,6 +34,7 @@ import net.minecraftforge.event.entity.player.PlayerInteractEvent.EntityInteract import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; +import net.minecraftforge.items.ItemHandlerHelper; @EventBusSubscriber public class StockTickerInteractionHandler { @@ -43,25 +54,9 @@ public class StockTickerInteractionHandler { return; ItemStack mainHandItem = player.getMainHandItem(); + if (AllItems.SHOPPING_LIST.isIn(mainHandItem)) { - - if (!level.isClientSide()) { - if (!(level.getBlockEntity(targetPos) instanceof StockTickerBlockEntity tickerBE)) - return; - ShoppingList list = ShoppingListItem.getList(mainHandItem); - if (list == null) - return; - - PackageOrder order = new PackageOrder(list.bakeEntries(level) - .getFirst() - .getStacksByCount()); - - tickerBE.broadcastPackageRequest(order, null, ShoppingListItem.getAddress(mainHandItem)); - player.setItemInHand(InteractionHand.MAIN_HAND, ItemStack.EMPTY); - } - - event.setCancellationResult(InteractionResult.SUCCESS); - event.setCanceled(true); + interactWithShop(event, player, level, targetPos, mainHandItem); return; } @@ -77,6 +72,102 @@ public class StockTickerInteractionHandler { return; } + private static void interactWithShop(EntityInteractSpecific event, Player player, Level level, BlockPos targetPos, + ItemStack mainHandItem) { + event.setCancellationResult(InteractionResult.SUCCESS); + event.setCanceled(true); + + if (level.isClientSide()) + return; + if (!(level.getBlockEntity(targetPos) instanceof StockTickerBlockEntity tickerBE)) + return; + + ShoppingList list = ShoppingListItem.getList(mainHandItem); + if (list == null) + return; + + Couple bakeEntries = list.bakeEntries(level, null); + InventorySummary paymentEntries = bakeEntries.getSecond(); + InventorySummary orderEntries = bakeEntries.getFirst(); + PackageOrder order = new PackageOrder(orderEntries.getStacksByCount()); + + // Must be up-to-date + tickerBE.refreshInventorySummary(); + + // Check stock levels + InventorySummary recentSummary = tickerBE.getRecentSummary(); + for (IntAttached entry : order.stacks()) { + if (recentSummary.getCountOf(entry.getSecond()) >= entry.getFirst()) + continue; + + AllSoundEvents.DENY.playOnServer(level, player.blockPosition()); + CreateLang.temporaryText("Purchase failed: Stock levels lower than expected") + .style(ChatFormatting.RED) + .sendStatus(player); + return; + } + + // Check space in stock ticker + int occupiedSlots = 0; + for (IntAttached entry : paymentEntries.getStacksByCount()) + occupiedSlots += Mth.ceil(entry.getFirst() / (float) entry.getValue() + .getMaxStackSize()); + for (int i = 0; i < tickerBE.receivedPayments.getSlots(); i++) + if (tickerBE.receivedPayments.getStackInSlot(i) + .isEmpty()) + occupiedSlots--; + + if (occupiedSlots > 0) { + AllSoundEvents.DENY.playOnServer(level, player.blockPosition()); + CreateLang.temporaryText("Not enough space in Cash Register") + .style(ChatFormatting.RED) + .sendStatus(player); + return; + } + + // Transfer payment to stock ticker + for (boolean simulate : Iterate.trueAndFalse) { + InventorySummary tally = paymentEntries.copy(); + List toTransfer = new ArrayList<>(); + + for (int i = 0; i < player.getInventory().items.size(); i++) { + ItemStack item = player.getInventory() + .getItem(i); + if (item.isEmpty()) + continue; + int countOf = tally.getCountOf(item); + if (countOf == 0) + continue; + int toRemove = Math.min(item.getCount(), countOf); + tally.add(item, -toRemove); + + if (simulate) + continue; + + int newStackSize = item.getCount() - toRemove; + player.getInventory() + .setItem(i, newStackSize == 0 ? ItemStack.EMPTY : item.copyWithCount(newStackSize)); + toTransfer.add(item.copyWithCount(toRemove)); + } + + if (simulate && tally.getTotalCount() != 0) { + AllSoundEvents.DENY.playOnServer(level, player.blockPosition()); + CreateLang.temporaryText("You cannot afford this purchase") + .style(ChatFormatting.RED) + .sendStatus(player); + return; + } + + if (simulate) + continue; + + toTransfer.forEach(s -> ItemHandlerHelper.insertItemStacked(tickerBE.receivedPayments, s, false)); + } + + tickerBE.broadcastPackageRequest(order, null, ShoppingListItem.getAddress(mainHandItem)); + player.setItemInHand(InteractionHand.MAIN_HAND, ItemStack.EMPTY); + } + public static BlockPos getStockTickerPosition(Entity entity) { Entity rootVehicle = entity.getRootVehicle(); if (!(rootVehicle instanceof SeatEntity)) diff --git a/src/main/java/com/simibubi/create/foundation/utility/CreateLang.java b/src/main/java/com/simibubi/create/foundation/utility/CreateLang.java index eb439107a0..cc3b039939 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/CreateLang.java +++ b/src/main/java/com/simibubi/create/foundation/utility/CreateLang.java @@ -64,5 +64,10 @@ public class CreateLang extends Lang { public static LangBuilder text(String text) { return builder().text(text); } + + @Deprecated // Use while implementing and replace all references with Lang.translate + public static LangBuilder temporaryText(String text) { + return builder().text(text); + } } From 71cd8cd2c2db0f0426796f15cd991cf2cc9a8b36 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Sat, 5 Oct 2024 20:24:09 +0200 Subject: [PATCH 069/515] You've got mail - Added the postbox - Frogports no longer interact with train stations - Changed frogports to have a proper inventory screen --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 74 ++++++- .../create/blockstates/black_postbox.json | 34 ++++ .../create/blockstates/blue_postbox.json | 34 ++++ .../create/blockstates/brown_postbox.json | 34 ++++ .../create/blockstates/cyan_postbox.json | 34 ++++ .../create/blockstates/gray_postbox.json | 34 ++++ .../create/blockstates/green_postbox.json | 34 ++++ .../blockstates/light_blue_postbox.json | 34 ++++ .../blockstates/light_gray_postbox.json | 34 ++++ .../create/blockstates/lime_postbox.json | 34 ++++ .../create/blockstates/magenta_postbox.json | 34 ++++ .../create/blockstates/orange_postbox.json | 34 ++++ .../create/blockstates/pink_postbox.json | 34 ++++ .../create/blockstates/purple_postbox.json | 34 ++++ .../create/blockstates/red_postbox.json | 34 ++++ .../create/blockstates/white_postbox.json | 34 ++++ .../create/blockstates/yellow_postbox.json | 34 ++++ .../resources/assets/create/lang/en_ud.json | 16 ++ .../resources/assets/create/lang/en_us.json | 16 ++ .../create/models/block/black_postbox.json | 7 + .../create/models/block/blue_postbox.json | 7 + .../create/models/block/brown_postbox.json | 7 + .../create/models/block/cyan_postbox.json | 7 + .../create/models/block/gray_postbox.json | 7 + .../create/models/block/green_postbox.json | 7 + .../models/block/light_blue_postbox.json | 7 + .../models/block/light_gray_postbox.json | 7 + .../create/models/block/lime_postbox.json | 7 + .../create/models/block/magenta_postbox.json | 7 + .../create/models/block/orange_postbox.json | 7 + .../create/models/block/pink_postbox.json | 7 + .../create/models/block/purple_postbox.json | 7 + .../create/models/block/red_postbox.json | 7 + .../create/models/block/white_postbox.json | 7 + .../create/models/block/yellow_postbox.json | 7 + .../create/models/item/black_postbox.json | 7 + .../create/models/item/blue_postbox.json | 7 + .../create/models/item/brown_postbox.json | 7 + .../create/models/item/cyan_postbox.json | 7 + .../create/models/item/gray_postbox.json | 7 + .../create/models/item/green_postbox.json | 7 + .../models/item/light_blue_postbox.json | 7 + .../models/item/light_gray_postbox.json | 7 + .../create/models/item/lime_postbox.json | 7 + .../create/models/item/magenta_postbox.json | 7 + .../create/models/item/orange_postbox.json | 7 + .../create/models/item/pink_postbox.json | 7 + .../create/models/item/purple_postbox.json | 7 + .../create/models/item/red_postbox.json | 7 + .../create/models/item/white_postbox.json | 7 + .../create/models/item/yellow_postbox.json | 7 + .../loot_tables/blocks/black_postbox.json | 21 ++ .../loot_tables/blocks/blue_postbox.json | 21 ++ .../loot_tables/blocks/brown_postbox.json | 21 ++ .../loot_tables/blocks/cyan_postbox.json | 21 ++ .../loot_tables/blocks/gray_postbox.json | 21 ++ .../loot_tables/blocks/green_postbox.json | 21 ++ .../blocks/light_blue_postbox.json | 21 ++ .../blocks/light_gray_postbox.json | 21 ++ .../loot_tables/blocks/lime_postbox.json | 21 ++ .../loot_tables/blocks/magenta_postbox.json | 21 ++ .../loot_tables/blocks/orange_postbox.json | 21 ++ .../loot_tables/blocks/pink_postbox.json | 21 ++ .../loot_tables/blocks/purple_postbox.json | 21 ++ .../loot_tables/blocks/red_postbox.json | 21 ++ .../loot_tables/blocks/white_postbox.json | 21 ++ .../loot_tables/blocks/yellow_postbox.json | 21 ++ .../data/create/tags/blocks/postboxes.json | 20 ++ .../data/create/tags/items/postboxes.json | 20 ++ .../minecraft/tags/blocks/mineable/axe.json | 16 ++ .../simibubi/create/AllBlockEntityTypes.java | 14 +- .../java/com/simibubi/create/AllBlocks.java | 31 ++- .../simibubi/create/AllCreativeModeTabs.java | 8 + .../com/simibubi/create/AllMenuTypes.java | 5 + .../java/com/simibubi/create/AllPackets.java | 10 +- .../com/simibubi/create/AllPartialModels.java | 1 + .../java/com/simibubi/create/AllShapes.java | 4 +- .../java/com/simibubi/create/AllTags.java | 2 + .../ChainConveyorBlockEntity.java | 6 +- .../ChainConveyorInteractionHandler.java | 10 +- .../content/logistics/box/PackageEntity.java | 3 + .../logistics/box/PackageRenderer.java | 2 +- .../frogport/FrogportConfigurationPacket.java | 67 ------ .../logistics/frogport/FrogportInventory.java | 69 ------- .../logistics/frogport/FrogportScreen.java | 178 ---------------- ...PackagePortAutomationInventoryWrapper.java | 49 +++++ .../packagePort/PackagePortBlockEntity.java | 151 ++++++++++++++ .../PackagePortConfigurationPacket.java | 45 ++++ .../PackagePortItem.java} | 8 +- .../packagePort/PackagePortMenu.java | 84 ++++++++ .../PackagePortPlacementPacket.java} | 17 +- .../packagePort/PackagePortScreen.java | 192 ++++++++++++++++++ .../PackagePortTarget.java} | 88 ++++---- .../PackagePortTargetSelectionHandler.java} | 31 ++- .../frogport/FrogportBlock.java | 25 +-- .../frogport/FrogportBlockEntity.java | 113 +++-------- .../frogport/FrogportRenderer.java | 13 +- .../frogport/FrogportVisual.java | 2 +- .../packagePort/postbox/PostboxBlock.java | 75 +++++++ .../postbox/PostboxBlockEntity.java | 44 ++++ .../packagePort/postbox/PostboxRenderer.java | 37 ++++ .../packager/PackagerBlockEntity.java | 4 +- .../create/content/trains/entity/Train.java | 1 + .../content/trains/station/GlobalStation.java | 94 +++++---- .../trains/station/StationBlockEntity.java | 71 +++---- .../foundation/events/ClientEvents.java | 4 +- .../create/foundation/events/InputEvents.java | 4 +- .../create/foundation/gui/AllGuiTextures.java | 8 +- .../assets/create/lang/default/interface.json | 2 - .../block/package_postbox/block_closed.json | 24 +++ .../block/package_postbox/block_open.json | 6 + .../models/block/package_postbox/flag.json | 32 +++ .../models/block/package_postbox/item.json | 52 +++++ .../block/post_box/post_box_black.png | Bin 0 -> 1210 bytes .../block/post_box/post_box_black_closed.png | Bin 0 -> 372 bytes .../block/post_box/post_box_black_open.png | Bin 0 -> 322 bytes .../textures/block/post_box/post_box_blue.png | Bin 0 -> 1238 bytes .../block/post_box/post_box_blue_closed.png | Bin 0 -> 373 bytes .../block/post_box/post_box_blue_open.png | Bin 0 -> 339 bytes .../block/post_box/post_box_brown.png | Bin 0 -> 1269 bytes .../block/post_box/post_box_brown_closed.png | Bin 0 -> 385 bytes .../block/post_box/post_box_brown_open.png | Bin 0 -> 337 bytes .../textures/block/post_box/post_box_cyan.png | Bin 0 -> 1252 bytes .../block/post_box/post_box_cyan_closed.png | Bin 0 -> 382 bytes .../block/post_box/post_box_cyan_open.png | Bin 0 -> 347 bytes .../textures/block/post_box/post_box_gray.png | Bin 0 -> 1252 bytes .../block/post_box/post_box_gray_closed.png | Bin 0 -> 369 bytes .../block/post_box/post_box_gray_open.png | Bin 0 -> 332 bytes .../block/post_box/post_box_green.png | Bin 0 -> 1291 bytes .../block/post_box/post_box_green_closed.png | Bin 0 -> 384 bytes .../block/post_box/post_box_green_open.png | Bin 0 -> 351 bytes .../block/post_box/post_box_light_blue.png | Bin 0 -> 1243 bytes .../post_box/post_box_light_blue_closed.png | Bin 0 -> 393 bytes .../post_box/post_box_light_blue_open.png | Bin 0 -> 358 bytes .../block/post_box/post_box_light_gray.png | Bin 0 -> 1220 bytes .../post_box/post_box_light_gray_closed.png | Bin 0 -> 381 bytes .../post_box/post_box_light_gray_open.png | Bin 0 -> 344 bytes .../textures/block/post_box/post_box_lime.png | Bin 0 -> 1194 bytes .../block/post_box/post_box_lime_closed.png | Bin 0 -> 362 bytes .../block/post_box/post_box_lime_open.png | Bin 0 -> 338 bytes .../block/post_box/post_box_magenta.png | Bin 0 -> 1275 bytes .../post_box/post_box_magenta_closed.png | Bin 0 -> 394 bytes .../block/post_box/post_box_magenta_open.png | Bin 0 -> 357 bytes .../block/post_box/post_box_orange.png | Bin 0 -> 1314 bytes .../block/post_box/post_box_orange_closed.png | Bin 0 -> 414 bytes .../block/post_box/post_box_orange_open.png | Bin 0 -> 363 bytes .../textures/block/post_box/post_box_pink.png | Bin 0 -> 1298 bytes .../block/post_box/post_box_pink_closed.png | Bin 0 -> 383 bytes .../block/post_box/post_box_pink_open.png | Bin 0 -> 351 bytes .../block/post_box/post_box_purple.png | Bin 0 -> 1299 bytes .../block/post_box/post_box_purple_closed.png | Bin 0 -> 404 bytes .../block/post_box/post_box_purple_open.png | Bin 0 -> 354 bytes .../textures/block/post_box/post_box_red.png | Bin 0 -> 1279 bytes .../block/post_box/post_box_red_closed.png | Bin 0 -> 389 bytes .../block/post_box/post_box_red_open.png | Bin 0 -> 349 bytes .../block/post_box/post_box_white.png | Bin 0 -> 1228 bytes .../block/post_box/post_box_white_closed.png | Bin 0 -> 375 bytes .../block/post_box/post_box_white_open.png | Bin 0 -> 347 bytes .../block/post_box/post_box_yellow.png | Bin 0 -> 1157 bytes .../block/post_box/post_box_yellow_closed.png | Bin 0 -> 373 bytes .../block/post_box/post_box_yellow_open.png | Bin 0 -> 345 bytes .../assets/create/textures/gui/frogport.png | Bin 1227 -> 0 bytes .../textures/gui/frogport_and_mailbox.png | Bin 0 -> 1286 bytes 163 files changed, 2319 insertions(+), 633 deletions(-) create mode 100644 src/generated/resources/assets/create/blockstates/black_postbox.json create mode 100644 src/generated/resources/assets/create/blockstates/blue_postbox.json create mode 100644 src/generated/resources/assets/create/blockstates/brown_postbox.json create mode 100644 src/generated/resources/assets/create/blockstates/cyan_postbox.json create mode 100644 src/generated/resources/assets/create/blockstates/gray_postbox.json create mode 100644 src/generated/resources/assets/create/blockstates/green_postbox.json create mode 100644 src/generated/resources/assets/create/blockstates/light_blue_postbox.json create mode 100644 src/generated/resources/assets/create/blockstates/light_gray_postbox.json create mode 100644 src/generated/resources/assets/create/blockstates/lime_postbox.json create mode 100644 src/generated/resources/assets/create/blockstates/magenta_postbox.json create mode 100644 src/generated/resources/assets/create/blockstates/orange_postbox.json create mode 100644 src/generated/resources/assets/create/blockstates/pink_postbox.json create mode 100644 src/generated/resources/assets/create/blockstates/purple_postbox.json create mode 100644 src/generated/resources/assets/create/blockstates/red_postbox.json create mode 100644 src/generated/resources/assets/create/blockstates/white_postbox.json create mode 100644 src/generated/resources/assets/create/blockstates/yellow_postbox.json create mode 100644 src/generated/resources/assets/create/models/block/black_postbox.json create mode 100644 src/generated/resources/assets/create/models/block/blue_postbox.json create mode 100644 src/generated/resources/assets/create/models/block/brown_postbox.json create mode 100644 src/generated/resources/assets/create/models/block/cyan_postbox.json create mode 100644 src/generated/resources/assets/create/models/block/gray_postbox.json create mode 100644 src/generated/resources/assets/create/models/block/green_postbox.json create mode 100644 src/generated/resources/assets/create/models/block/light_blue_postbox.json create mode 100644 src/generated/resources/assets/create/models/block/light_gray_postbox.json create mode 100644 src/generated/resources/assets/create/models/block/lime_postbox.json create mode 100644 src/generated/resources/assets/create/models/block/magenta_postbox.json create mode 100644 src/generated/resources/assets/create/models/block/orange_postbox.json create mode 100644 src/generated/resources/assets/create/models/block/pink_postbox.json create mode 100644 src/generated/resources/assets/create/models/block/purple_postbox.json create mode 100644 src/generated/resources/assets/create/models/block/red_postbox.json create mode 100644 src/generated/resources/assets/create/models/block/white_postbox.json create mode 100644 src/generated/resources/assets/create/models/block/yellow_postbox.json create mode 100644 src/generated/resources/assets/create/models/item/black_postbox.json create mode 100644 src/generated/resources/assets/create/models/item/blue_postbox.json create mode 100644 src/generated/resources/assets/create/models/item/brown_postbox.json create mode 100644 src/generated/resources/assets/create/models/item/cyan_postbox.json create mode 100644 src/generated/resources/assets/create/models/item/gray_postbox.json create mode 100644 src/generated/resources/assets/create/models/item/green_postbox.json create mode 100644 src/generated/resources/assets/create/models/item/light_blue_postbox.json create mode 100644 src/generated/resources/assets/create/models/item/light_gray_postbox.json create mode 100644 src/generated/resources/assets/create/models/item/lime_postbox.json create mode 100644 src/generated/resources/assets/create/models/item/magenta_postbox.json create mode 100644 src/generated/resources/assets/create/models/item/orange_postbox.json create mode 100644 src/generated/resources/assets/create/models/item/pink_postbox.json create mode 100644 src/generated/resources/assets/create/models/item/purple_postbox.json create mode 100644 src/generated/resources/assets/create/models/item/red_postbox.json create mode 100644 src/generated/resources/assets/create/models/item/white_postbox.json create mode 100644 src/generated/resources/assets/create/models/item/yellow_postbox.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/black_postbox.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/blue_postbox.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/brown_postbox.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/cyan_postbox.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/gray_postbox.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/green_postbox.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/light_blue_postbox.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/light_gray_postbox.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/lime_postbox.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/magenta_postbox.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/orange_postbox.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/pink_postbox.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/purple_postbox.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/red_postbox.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/white_postbox.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/yellow_postbox.json create mode 100644 src/generated/resources/data/create/tags/blocks/postboxes.json create mode 100644 src/generated/resources/data/create/tags/items/postboxes.json delete mode 100644 src/main/java/com/simibubi/create/content/logistics/frogport/FrogportConfigurationPacket.java delete mode 100644 src/main/java/com/simibubi/create/content/logistics/frogport/FrogportInventory.java delete mode 100644 src/main/java/com/simibubi/create/content/logistics/frogport/FrogportScreen.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortAutomationInventoryWrapper.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortConfigurationPacket.java rename src/main/java/com/simibubi/create/content/logistics/{frogport/FrogportItem.java => packagePort/PackagePortItem.java} (74%) create mode 100644 src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortMenu.java rename src/main/java/com/simibubi/create/content/logistics/{frogport/FrogportPlacementPacket.java => packagePort/PackagePortPlacementPacket.java} (79%) create mode 100644 src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortScreen.java rename src/main/java/com/simibubi/create/content/logistics/{frogport/FrogportTarget.java => packagePort/PackagePortTarget.java} (70%) rename src/main/java/com/simibubi/create/content/logistics/{frogport/FrogportTargetSelectionHandler.java => packagePort/PackagePortTargetSelectionHandler.java} (83%) rename src/main/java/com/simibubi/create/content/logistics/{ => packagePort}/frogport/FrogportBlock.java (75%) rename src/main/java/com/simibubi/create/content/logistics/{ => packagePort}/frogport/FrogportBlockEntity.java (69%) rename src/main/java/com/simibubi/create/content/logistics/{ => packagePort}/frogport/FrogportRenderer.java (93%) rename src/main/java/com/simibubi/create/content/logistics/{ => packagePort}/frogport/FrogportVisual.java (98%) create mode 100644 src/main/java/com/simibubi/create/content/logistics/packagePort/postbox/PostboxBlock.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/packagePort/postbox/PostboxBlockEntity.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/packagePort/postbox/PostboxRenderer.java create mode 100644 src/main/resources/assets/create/models/block/package_postbox/block_closed.json create mode 100644 src/main/resources/assets/create/models/block/package_postbox/block_open.json create mode 100644 src/main/resources/assets/create/models/block/package_postbox/flag.json create mode 100644 src/main/resources/assets/create/models/block/package_postbox/item.json create mode 100644 src/main/resources/assets/create/textures/block/post_box/post_box_black.png create mode 100644 src/main/resources/assets/create/textures/block/post_box/post_box_black_closed.png create mode 100644 src/main/resources/assets/create/textures/block/post_box/post_box_black_open.png create mode 100644 src/main/resources/assets/create/textures/block/post_box/post_box_blue.png create mode 100644 src/main/resources/assets/create/textures/block/post_box/post_box_blue_closed.png create mode 100644 src/main/resources/assets/create/textures/block/post_box/post_box_blue_open.png create mode 100644 src/main/resources/assets/create/textures/block/post_box/post_box_brown.png create mode 100644 src/main/resources/assets/create/textures/block/post_box/post_box_brown_closed.png create mode 100644 src/main/resources/assets/create/textures/block/post_box/post_box_brown_open.png create mode 100644 src/main/resources/assets/create/textures/block/post_box/post_box_cyan.png create mode 100644 src/main/resources/assets/create/textures/block/post_box/post_box_cyan_closed.png create mode 100644 src/main/resources/assets/create/textures/block/post_box/post_box_cyan_open.png create mode 100644 src/main/resources/assets/create/textures/block/post_box/post_box_gray.png create mode 100644 src/main/resources/assets/create/textures/block/post_box/post_box_gray_closed.png create mode 100644 src/main/resources/assets/create/textures/block/post_box/post_box_gray_open.png create mode 100644 src/main/resources/assets/create/textures/block/post_box/post_box_green.png create mode 100644 src/main/resources/assets/create/textures/block/post_box/post_box_green_closed.png create mode 100644 src/main/resources/assets/create/textures/block/post_box/post_box_green_open.png create mode 100644 src/main/resources/assets/create/textures/block/post_box/post_box_light_blue.png create mode 100644 src/main/resources/assets/create/textures/block/post_box/post_box_light_blue_closed.png create mode 100644 src/main/resources/assets/create/textures/block/post_box/post_box_light_blue_open.png create mode 100644 src/main/resources/assets/create/textures/block/post_box/post_box_light_gray.png create mode 100644 src/main/resources/assets/create/textures/block/post_box/post_box_light_gray_closed.png create mode 100644 src/main/resources/assets/create/textures/block/post_box/post_box_light_gray_open.png create mode 100644 src/main/resources/assets/create/textures/block/post_box/post_box_lime.png create mode 100644 src/main/resources/assets/create/textures/block/post_box/post_box_lime_closed.png create mode 100644 src/main/resources/assets/create/textures/block/post_box/post_box_lime_open.png create mode 100644 src/main/resources/assets/create/textures/block/post_box/post_box_magenta.png create mode 100644 src/main/resources/assets/create/textures/block/post_box/post_box_magenta_closed.png create mode 100644 src/main/resources/assets/create/textures/block/post_box/post_box_magenta_open.png create mode 100644 src/main/resources/assets/create/textures/block/post_box/post_box_orange.png create mode 100644 src/main/resources/assets/create/textures/block/post_box/post_box_orange_closed.png create mode 100644 src/main/resources/assets/create/textures/block/post_box/post_box_orange_open.png create mode 100644 src/main/resources/assets/create/textures/block/post_box/post_box_pink.png create mode 100644 src/main/resources/assets/create/textures/block/post_box/post_box_pink_closed.png create mode 100644 src/main/resources/assets/create/textures/block/post_box/post_box_pink_open.png create mode 100644 src/main/resources/assets/create/textures/block/post_box/post_box_purple.png create mode 100644 src/main/resources/assets/create/textures/block/post_box/post_box_purple_closed.png create mode 100644 src/main/resources/assets/create/textures/block/post_box/post_box_purple_open.png create mode 100644 src/main/resources/assets/create/textures/block/post_box/post_box_red.png create mode 100644 src/main/resources/assets/create/textures/block/post_box/post_box_red_closed.png create mode 100644 src/main/resources/assets/create/textures/block/post_box/post_box_red_open.png create mode 100644 src/main/resources/assets/create/textures/block/post_box/post_box_white.png create mode 100644 src/main/resources/assets/create/textures/block/post_box/post_box_white_closed.png create mode 100644 src/main/resources/assets/create/textures/block/post_box/post_box_white_open.png create mode 100644 src/main/resources/assets/create/textures/block/post_box/post_box_yellow.png create mode 100644 src/main/resources/assets/create/textures/block/post_box/post_box_yellow_closed.png create mode 100644 src/main/resources/assets/create/textures/block/post_box/post_box_yellow_open.png delete mode 100644 src/main/resources/assets/create/textures/gui/frogport.png create mode 100644 src/main/resources/assets/create/textures/gui/frogport_and_mailbox.png diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 3eb8ee2960..d5b4c5931e 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-09-25T12:48:56.6991439 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-10-05T13:53:09.0252048 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -23,12 +23,14 @@ a97910c7516e7cedec9e34eca51f1183f1e3e681 assets/create/blockstates/belt.json 0ea03133af234921a3313f52521d8cfd02bf5d81 assets/create/blockstates/birch_window.json 2003c43151b731bf19cae58290c63bcb3785848a assets/create/blockstates/birch_window_pane.json c8b65faf51122eb411f5895e718869da9b260c2e assets/create/blockstates/black_nixie_tube.json +edcdce7ec6afbaa00952131df4b3f2c93c2c6919 assets/create/blockstates/black_postbox.json 980ae9ba3f6d4e0faea8f3878985f9a9dadc0796 assets/create/blockstates/black_sail.json da3ad0225984a0dcbfb4ed800e307e45aff5aaa1 assets/create/blockstates/black_seat.json 0083f6aa3fda2c7ebb2e5f2a032e740cf3ae3846 assets/create/blockstates/black_toolbox.json 28f2fb355e80171403e540afd2aed44e9c19659a assets/create/blockstates/black_valve_handle.json 06ecd28cd97f4e8200dc396858695cad57b871c8 assets/create/blockstates/blaze_burner.json 37caf031254b5171a1fbfe9906f4bc65e8dbc909 assets/create/blockstates/blue_nixie_tube.json +54f6aae1d573b27979689301ef1c2ad4a3bf6e93 assets/create/blockstates/blue_postbox.json d540f0f23e0d7c03f8e147cf3eebbaf7caec9f93 assets/create/blockstates/blue_sail.json d2fdb432bb037de781260c789e905b223fab408c assets/create/blockstates/blue_seat.json f91092da79b69fece9583ccc15350612f439ee1b assets/create/blockstates/blue_toolbox.json @@ -46,6 +48,7 @@ a408005aae4c1caa7aaae5a0ddf9d1ad73cd0254 assets/create/blockstates/brass_funnel. 6d210298b9d80ae69aa03b09aa73b92e14b9ab1b assets/create/blockstates/brass_scaffolding.json 8ee948f9e87b82bb27aaecc522127fa1297b3d9d assets/create/blockstates/brass_tunnel.json debf33346bf410216f21082e1e8d07aa6250b84c assets/create/blockstates/brown_nixie_tube.json +c23d7f691bf532d6b27317c0063289a8bd747de2 assets/create/blockstates/brown_postbox.json 1334fc9e71d9f2a6117f448817263467a9c695de assets/create/blockstates/brown_sail.json 19524b2c0672632e63372f405a87dbea35f1d160 assets/create/blockstates/brown_seat.json 1ffc38bf682e84aad4cb300c573375eb0cdcc434 assets/create/blockstates/brown_toolbox.json @@ -203,6 +206,7 @@ beb9e47f8d811c2146f68daf992fb805342a65cb assets/create/blockstates/cut_veridium. c11f09df4a23e951bdf9a345515183f4fac7cde3 assets/create/blockstates/cut_veridium_stairs.json 3aa6f5e613ff73952e3de00408051f92316e7f81 assets/create/blockstates/cut_veridium_wall.json bb627b2e78dba6833cf2d357033f253fc89aa1b8 assets/create/blockstates/cyan_nixie_tube.json +3406ab8baa7d9e9892c059c27b5ace92aadc2a80 assets/create/blockstates/cyan_postbox.json f1061b8f9757374d6608fda07e301a2623e79f72 assets/create/blockstates/cyan_sail.json 538c6d95da5cc460e99c91647dac61726a91479f assets/create/blockstates/cyan_seat.json c4d84b719762aca46cdb8decddfeb97dcc50676c assets/create/blockstates/cyan_toolbox.json @@ -245,11 +249,13 @@ ff9f56912d8ac4069df90505232820f9c45f5e06 assets/create/blockstates/gantry_carria 5a193991f33a1af8659192f3693e4d8d3ed0082b assets/create/blockstates/glass_fluid_pipe.json e3f2a093c436cb65c5a7ac049a14cc4dadb22526 assets/create/blockstates/granite_pillar.json 921cf220c44a67195c90a30c4c296e65311738da assets/create/blockstates/gray_nixie_tube.json +f3153de05bb7658cd2d27ed6becea1b2ea687ae3 assets/create/blockstates/gray_postbox.json 30ba031a6b5a327d2a4caa12169676da573c2133 assets/create/blockstates/gray_sail.json f35a502c4a5e2703e7c6811b3d2ba16a9c47d4c8 assets/create/blockstates/gray_seat.json 87457e0eddae80225dbb3145f2d120296ea1bfcd assets/create/blockstates/gray_toolbox.json f18b87db39836eef20154b239d488eebb64b3455 assets/create/blockstates/gray_valve_handle.json 0f0fe2bf83f763e04cd2d7a979beb547feac3191 assets/create/blockstates/green_nixie_tube.json +4446fdbf784366888215251fb082ff9b52c2ea6d assets/create/blockstates/green_postbox.json 0a2a5fbf2cf084e1be0426a224c291dc22a826fd assets/create/blockstates/green_sail.json b4aede1847d204ecdb7847559066d9d2ffb66903 assets/create/blockstates/green_seat.json 6f080890b3b30c46ba9ceb382c1171940bf4966f assets/create/blockstates/green_toolbox.json @@ -285,11 +291,13 @@ ca124508c59130d21f23d7b1ef354d78bdd24dd4 assets/create/blockstates/layered_tuff. 2ff5466f9ea3b1292c24a8ddb31666d74635c592 assets/create/blockstates/layered_veridium.json fcf02725651ab5973fab1cfc09fdd68cb4b93579 assets/create/blockstates/lectern_controller.json 5d7e1b08b1ec7c7c11b70db11df09311fcd7cf45 assets/create/blockstates/light_blue_nixie_tube.json +f77864045801c12e9308f9ae75fa7c78de15bb7e assets/create/blockstates/light_blue_postbox.json f2354e8cb6086473ac97a5228b99706858dcad8a assets/create/blockstates/light_blue_sail.json 6b7045eaf9efe3a90f2d9a6785be6a5fd534b8e7 assets/create/blockstates/light_blue_seat.json b7065e7871c3c7f1a0656c2f92f82544e606f2fb assets/create/blockstates/light_blue_toolbox.json 549882a0f4de60906ca870a6197330f81d4e1afe assets/create/blockstates/light_blue_valve_handle.json fa5fb2be73c7c54b70e927b66adf3f4d64c5cb6b assets/create/blockstates/light_gray_nixie_tube.json +63aa0bfbba64796ec0096972585d15d5cbed7508 assets/create/blockstates/light_gray_postbox.json 3d95c9c4442d1bdd660bae382c72c68134db86dd assets/create/blockstates/light_gray_sail.json 8ec5144da4a49dd5b497af07b0d4b88c9c0b6cc0 assets/create/blockstates/light_gray_seat.json 35b151db396069b146d223fbe46be5b0c3dda8a9 assets/create/blockstates/light_gray_toolbox.json @@ -297,6 +305,7 @@ fa5fb2be73c7c54b70e927b66adf3f4d64c5cb6b assets/create/blockstates/light_gray_ni a6f319c803c03e34bbf841ea52d82f0f7ec7a413 assets/create/blockstates/limestone.json 7ff65e1c4c8e48a0b694cd17506a192e6a7e6e44 assets/create/blockstates/limestone_pillar.json 7f20b548dd535942b2d6f41c39de7ad4fafe637e assets/create/blockstates/lime_nixie_tube.json +b1b07cbe36064d2755d0f2a4af036ec0506e6995 assets/create/blockstates/lime_postbox.json ad1ec304729fd6d336c0d4d0c27c9345af636695 assets/create/blockstates/lime_sail.json b9934a558e1b495403dc2c71ffb43cce7d396013 assets/create/blockstates/lime_seat.json 49a02f7fc16697ba1cf16cee7e45ab6bfd8b06ce assets/create/blockstates/lime_toolbox.json @@ -304,6 +313,7 @@ ba181485f219d3ae23509a7edf28e25d9edb10f4 assets/create/blockstates/lime_valve_ha 654e845cebed82b7afbcf81380921e0a475b01e9 assets/create/blockstates/linear_chassis.json e195e82e4d0c1fc20474535bc9068cbb77a5e175 assets/create/blockstates/lit_blaze_burner.json 296186b196af94e1ab3f7e8a3254f6d31ae47a5c assets/create/blockstates/magenta_nixie_tube.json +32cf7fc7e7b36b6ef873658946a40cf7c32d5da8 assets/create/blockstates/magenta_postbox.json f150922cbed1c05fb3892d4ac91eb471234252e2 assets/create/blockstates/magenta_sail.json bb1ab5c70647933400b3a99ef9d166ba5e3d4709 assets/create/blockstates/magenta_seat.json fcd226c7863262d98765c701538bf9e44d2b177e assets/create/blockstates/magenta_toolbox.json @@ -336,6 +346,7 @@ ba9c3ecfacbd398048440d247decffeaefc714b5 assets/create/blockstates/mysterious_cu 7f2c5728e24d60ed2f7a095e3a954d7ca4e410e9 assets/create/blockstates/oak_window_pane.json df91d0ca68934c1afd9858a8d1591dd4cb88df65 assets/create/blockstates/ochrum.json 09c9bee3d26edc4b87cb7a5042f125c439ee5956 assets/create/blockstates/ochrum_pillar.json +42799faa0c59e6ed410c1ef42eceef25c323090f assets/create/blockstates/orange_postbox.json af4c2c4861d1410e1b7371a5bf3fe09ed3ab0077 assets/create/blockstates/orange_sail.json aab812cecf7d10d4e7587f4dead8a98238a15f41 assets/create/blockstates/orange_seat.json 2bc30ed9907230271b4e2d0786f106f3e1e25029 assets/create/blockstates/orange_toolbox.json @@ -353,6 +364,7 @@ ef3af446b56c69e71a156d5998d9dc8e6d9ea4f5 assets/create/blockstates/packager.json 887565a0f89f089d6be888c87394dde4878afda7 assets/create/blockstates/package_frogport.json 36742cc6ce052ead143366d31b11e828a525c1b8 assets/create/blockstates/peculiar_bell.json 53d102e706d53cb2c0dbc0bc11da828084a43519 assets/create/blockstates/pink_nixie_tube.json +8889da0684a2fd247a769cadbf94fd45e1c218f2 assets/create/blockstates/pink_postbox.json 213da5c04a33ae8ae7c0a4dec9844bbb6d670e33 assets/create/blockstates/pink_sail.json 8d5c80d5dc561240dfe8d7f212ffc33ac4e0fcd8 assets/create/blockstates/pink_seat.json 90bd26c7c6933f5ebbe17b0fe58f840e2924a0f5 assets/create/blockstates/pink_toolbox.json @@ -425,6 +437,7 @@ df7af1e49c53ae99ac3f0b2fca5d948b8ea91938 assets/create/blockstates/pulley_magnet 81281435b8d1eeb4f1e318c6d14d49fa1fd86820 assets/create/blockstates/pulse_repeater.json 65bfd8283749117663f7199204691758fd286e38 assets/create/blockstates/pulse_timer.json b658654aa97e8dd2c897f432a601835a3f8aca10 assets/create/blockstates/purple_nixie_tube.json +af5db46f49be3c13eeb9bcae1803cc6fb47a1c76 assets/create/blockstates/purple_postbox.json f8f9802df9c0b4e39edeefc3b1abb38255d79801 assets/create/blockstates/purple_sail.json 91b5ab66d7ec5235d278ee2bed6ddd88f39ce81d assets/create/blockstates/purple_seat.json 6aa467b3588359fdf5d7201f844193d5b70f20f7 assets/create/blockstates/purple_toolbox.json @@ -436,6 +449,7 @@ ec546afd3ec8036e4393b97d535f05a86f57dbc1 assets/create/blockstates/redstone_cont ff205f032b36486753dddb1f2029ef8d53e9c86f assets/create/blockstates/redstone_link.json e3e0ea8069b354c29103948d0b5e79094587ef85 assets/create/blockstates/redstone_requester.json e3fd62e466e3e6e7bd6fc8661f764ba972a466fc assets/create/blockstates/red_nixie_tube.json +d7535074a636f30247e7bd2f1a21685d3231d321 assets/create/blockstates/red_postbox.json 4c36b562da58ef2af57009da7cf2426059249228 assets/create/blockstates/red_sail.json 145f4e9ffaeff9be180e6c4e4989f2cf44cf0686 assets/create/blockstates/red_seat.json 380f46b7cb72b13c0f16fd4a4287a1a33adeff41 assets/create/blockstates/red_toolbox.json @@ -580,6 +594,7 @@ fee668eb9a45dca0d287fee5811219d69f9ec3e2 assets/create/blockstates/weathered_cop da110f382368257e15431c77164aef82e014e3f8 assets/create/blockstates/weathered_copper_tile_stairs.json 25ce64b7af5d244f194da91ccf964a9bf5762327 assets/create/blockstates/weighted_ejector.json 2974b34a8cfb0d4e8e010f8bd085584ea631d541 assets/create/blockstates/white_nixie_tube.json +debbed52643d90ab054171f76622e54192be60ad assets/create/blockstates/white_postbox.json f079469d186087d23f0d91b384040f777b0088b1 assets/create/blockstates/white_sail.json 317a6463db64b66d215d25b65ab52fe7f26ba9f8 assets/create/blockstates/white_seat.json 6cb8c82a429b54d6a87d02eec5cfd1fcd5365f1e assets/create/blockstates/white_toolbox.json @@ -587,14 +602,15 @@ c0bfe8416173868f9916c4a54dd9f983887c5bac assets/create/blockstates/white_valve_h ec2720e3f1bc84304d0c81cd23ff1e155b0c2f2c assets/create/blockstates/windmill_bearing.json d688e80dfbd5b17970814887c3698fc721981caa assets/create/blockstates/wooden_bracket.json 157942a838aa02909fb2238ad9ce77edc82f6142 assets/create/blockstates/yellow_nixie_tube.json +f99bf11ac6b2d8d2a315f354d7704a938241d95e assets/create/blockstates/yellow_postbox.json 68b6e267e93b96dbc0596ea4a1cd26636aa0e04a assets/create/blockstates/yellow_sail.json 4face2dd50a30bda0b21742319e701e666d51f8c assets/create/blockstates/yellow_seat.json b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbox.json fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -1ec09657f3c9425729cb4554977f350ae331ff6a assets/create/lang/en_ud.json -6bc1528908d08a24a9a6a6923e96bd5bbbef28d7 assets/create/lang/en_us.json +2670fb1fc306cbe16e88a0b1be45b4047074b2ce assets/create/lang/en_ud.json +25dcc2800d5f15625490b7dcb736e42448929066 assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -661,11 +677,13 @@ ee71b0992edc2496025c22806e8de3a3243882aa assets/create/models/block/birch_window 3088aa5e46cf9caa912c80a4e7791904e64e9def assets/create/models/block/birch_window_pane_side.json cb9d3a0dbac6a884d5ce0dc82085322f8c666707 assets/create/models/block/birch_window_pane_side_alt.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/black_nixie_tube.json +1fe4a9cbcae773f32c07f7cef42f52588ec1c1aa assets/create/models/block/black_postbox.json 62c92a681b5a86a5415cc7a70263ffdc794cdd59 assets/create/models/block/black_sail.json 443ed49b053fdd7356cd56f0495e18f2570d57d9 assets/create/models/block/black_seat.json f48989d377de8e5067e807adf7e38da781e37ed9 assets/create/models/block/black_toolbox.json 8715787d72c3ef47c5651abcd819539bad6a96f7 assets/create/models/block/black_valve_handle.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/blue_nixie_tube.json +e9e9487a3440b3a6c1ac515f63385ee59e8fb773 assets/create/models/block/blue_postbox.json ddc740084aa5f387bee062bd4141ad8fadb56355 assets/create/models/block/blue_sail.json 96431b1f3a531ce89f876c9286b81838aec9b6d3 assets/create/models/block/blue_seat.json 89932aab163b14a21fffd4fab4b8b88a94163089 assets/create/models/block/blue_toolbox.json @@ -718,6 +736,7 @@ b2a95218042586aae38dff9278f3ee3f159bc73e assets/create/models/block/brass_post_e ec81e9c237ec98b30a3de22e12cb9720922478eb assets/create/models/block/brass_side.json c697cace1f4097468ff34254c4ff6450d9d52f91 assets/create/models/block/brass_side_alt.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/brown_nixie_tube.json +b04c80852527a07e01c27686be678cbaf568e821 assets/create/models/block/brown_postbox.json 50a054d1e0660d16e86cf7a520b9bf36e38401b6 assets/create/models/block/brown_sail.json 0616de192825246e6036d1f69911170438a83b81 assets/create/models/block/brown_seat.json 4226a7c5f1bfb0a75457fb4dfd22448503110e5c assets/create/models/block/brown_toolbox.json @@ -1043,6 +1062,7 @@ d6423c0fd0af4fbd929d26d6097a1722567acc9d assets/create/models/block/cut_veridium b2e847cee8c01791c15fcdd35787af33ebe46f0a assets/create/models/block/cut_veridium_wall_side.json 5ab4db4245b852edf985fe72595f678eb7372801 assets/create/models/block/cut_veridium_wall_side_tall.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/cyan_nixie_tube.json +0cbd0c6c909effa2f71e198655d51f2e483454aa assets/create/models/block/cyan_postbox.json 27c9aff76b32e4de18d581e133fc23a8239ca412 assets/create/models/block/cyan_sail.json 01a324a92552076589e2aaaeca9d4da2d1e3b39d assets/create/models/block/cyan_seat.json 663f431fe8a02e057980cf9bcfc566eb5adc876f assets/create/models/block/cyan_toolbox.json @@ -1124,11 +1144,13 @@ d0fa41de17f65693188f1868ace5fc2ac518739b assets/create/models/block/gantry_shaft 3356069e112cde817da0c99ceb40cd8f207de822 assets/create/models/block/granite_pillar.json ee860a8bd95fda14a859d6632652ee2a95f06c19 assets/create/models/block/granite_pillar_horizontal.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/gray_nixie_tube.json +f2bbb067bc4e91a71303cc92939c4f4707cdc1ab assets/create/models/block/gray_postbox.json 97f382e9b435c81d1d8e0ed487a7fc16e6945958 assets/create/models/block/gray_sail.json 58b51da5c80e4f43582452d97453c93145a516ad assets/create/models/block/gray_seat.json cd3cff8e38d559dcb78df014556a78d5a538af43 assets/create/models/block/gray_toolbox.json 3ee19f46bdeb0ac7489dcd4d51f90ab01ad863c9 assets/create/models/block/gray_valve_handle.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/green_nixie_tube.json +21fbacdc856fb1003f58bf2842fe418124f6b01d assets/create/models/block/green_postbox.json 26577589688ec1f39cae9f42704cb36cbc1c48ae assets/create/models/block/green_sail.json ae51eaa500dd036fa27474a7392f381afb677dfd assets/create/models/block/green_seat.json 801d277b241332d5f4b49bdb00b911dcd01a7db2 assets/create/models/block/green_toolbox.json @@ -1166,11 +1188,13 @@ b843a6e27c4f90e31108f9f3c1573e70fb3d0927 assets/create/models/block/layered_scor 5fb53db0c6623dc16e486ac0bd094b5a90e2e080 assets/create/models/block/layered_tuff.json 336d1646294e018ea3de60b30a621a10ca7aa6d7 assets/create/models/block/layered_veridium.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/light_blue_nixie_tube.json +cf487c0be9444b7ac124d2ae33e6c545803e14b6 assets/create/models/block/light_blue_postbox.json 2e83d3aaa92640d6b3da2a2644f6a160f97b08e4 assets/create/models/block/light_blue_sail.json ba917560f40a4e46ef190649f18adad9962c5c02 assets/create/models/block/light_blue_seat.json c20616aa90feab3003cecb4a5be5466c0fc83072 assets/create/models/block/light_blue_toolbox.json bcd3d28b8a062649301648ea5e2d0463f93d008d assets/create/models/block/light_blue_valve_handle.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/light_gray_nixie_tube.json +1efabd28f0dc3db1c0e6bea2be62cac883fefd66 assets/create/models/block/light_gray_postbox.json 09f284574b38ab57579e939bbb088b8d36e0b8f5 assets/create/models/block/light_gray_sail.json d1813d0f548fcddb361df7cc3b5d97582842b10f assets/create/models/block/light_gray_seat.json 4ec5d701dd8b2d8c3dc44d05f527a3d737002cd4 assets/create/models/block/light_gray_toolbox.json @@ -1179,6 +1203,7 @@ adb8dbed70419e0310e7a20f3656bf325b348434 assets/create/models/block/light_gray_v 2b80f9421c2fe902d55d9bd95183ad4bae46c315 assets/create/models/block/limestone_pillar.json fb18280a2a708f60b00cc7c675804c219784871a assets/create/models/block/limestone_pillar_horizontal.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/lime_nixie_tube.json +952d292d4dc2158e6106c5079cfa1ddb81c7777e assets/create/models/block/lime_postbox.json 5a95a72444f523cfba6e8c5adf8eacbb37e2d21e assets/create/models/block/lime_sail.json 09e7bf50cf88c449dbd9e77829cdb5afffb7d88d assets/create/models/block/lime_seat.json b92822a01e4fbed2463b1bdf7dcc736023988e20 assets/create/models/block/lime_toolbox.json @@ -1188,6 +1213,7 @@ b92822a01e4fbed2463b1bdf7dcc736023988e20 assets/create/models/block/lime_toolbox a1a3804ddcb1db0a7b5c0693555f8eb326950dd0 assets/create/models/block/linear_chassis_top.json f885acc0ba705cfa9c65b62626ab4007f3b6e329 assets/create/models/block/linear_chassis_top_bottom.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/magenta_nixie_tube.json +bfea3fd456f92391afc9f948ade90b16275e63de assets/create/models/block/magenta_postbox.json 81122f26a12b7ab40fed6d31c97376f4dfffa111 assets/create/models/block/magenta_sail.json b5cd13b021400b3c37499ec4ef22e560c721ac54 assets/create/models/block/magenta_seat.json d7b2b16ba2d6a0b2441aeaf7faa76f61fbdc35e7 assets/create/models/block/magenta_toolbox.json @@ -1212,6 +1238,7 @@ af50363d603d61340b336569d58c1febde253665 assets/create/models/block/ochrum_natur d69effa0a811cb93fead8257bcaad4bbf0094002 assets/create/models/block/ochrum_natural_3.json 24669a4e93925940477fcfc0aca10ab9d87368e0 assets/create/models/block/ochrum_pillar.json c8dd33a0b71dce37712788a61729de89574b117f assets/create/models/block/ochrum_pillar_horizontal.json +dbd0cbfa1c6cfaddd7ac954379b4b1f3056730f2 assets/create/models/block/orange_postbox.json cb4cd4e4bfb0d105a09c56454abf4795b155d12b assets/create/models/block/orange_sail.json 6c4addc75fb03911fca3083f891b22f55209b8db assets/create/models/block/orange_seat.json f68eeb8cd828a0659fe8665373daf093ea65f0fc assets/create/models/block/orange_toolbox.json @@ -1239,6 +1266,7 @@ f70f83cfec770879c478eea3760ea187700f2878 assets/create/models/block/peculiar_bel b9c9d00b844ca2f217ae21cc502cd4d082fed2d5 assets/create/models/block/peculiar_bell_floor.json f7b09c243cfeda8bb38a29a917b9fbdafe47eece assets/create/models/block/peculiar_bell_single_wall.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/pink_nixie_tube.json +084266ced8975953fa158fd9e7261d8f10b94db7 assets/create/models/block/pink_postbox.json 90113a1f53f0f8d9ce11ff14128eb860063f5ddc assets/create/models/block/pink_sail.json 888dba067e751a55205dbd919db8e92ef2be604d assets/create/models/block/pink_seat.json 3cb69299c7787f88fb41c6397362aa7b607c0960 assets/create/models/block/pink_toolbox.json @@ -1397,6 +1425,7 @@ addbe93af945ff7ca2680a27225db804d3ac9b46 assets/create/models/block/pulse_timer_ ab3d7e10abcb53b835d6f5c406b7a777a942d6f7 assets/create/models/block/pulse_timer_powered_powering.json 7b425d9db8d914b52b7faad2f792c020b678f84d assets/create/models/block/pulse_timer_powering.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/purple_nixie_tube.json +afdd265ee175c47ea6e4e44fb08d212e4cef5ee5 assets/create/models/block/purple_postbox.json 356378a5839b0b400aa5e0a67740634113c09a38 assets/create/models/block/purple_sail.json bc8e473a5662b6180b00b85e5006241a283c9baa assets/create/models/block/purple_seat.json 5e85ec98c165a0b5bfe25d391e96df9164372a3a assets/create/models/block/purple_toolbox.json @@ -1410,6 +1439,7 @@ ff65b89683fbb9326f625b9a68f954def5ed000d assets/create/models/block/radial_chass 9d234d1294f927d1e70a5c9b1e6de73ef65e7014 assets/create/models/block/railway_casing.json be8042806b08990786ced1cf140c4942d7a6788b assets/create/models/block/raw_zinc_block.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/red_nixie_tube.json +844614001c30ef34d3136a350c12018c5e9ab341 assets/create/models/block/red_postbox.json b692deeb65f338212fb1073b725a122b7b1359d5 assets/create/models/block/red_sail.json bf3f4ba33e1a61254073ecee3e753958f8debb35 assets/create/models/block/red_seat.json 2a13766aebac1a392ae7bf934bd81d9210c87a24 assets/create/models/block/red_toolbox.json @@ -1667,11 +1697,13 @@ e26dd64495ff8801593e9c22203cbf364075badd assets/create/models/block/weathered_co b658c1022587bd670b5acee267607719c1544332 assets/create/models/block/weathered_copper_tile_stairs_inner.json e7ae89577be9d26a071bf96cbd7ed80293902b63 assets/create/models/block/weathered_copper_tile_stairs_outer.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/white_nixie_tube.json +998d838964c6c5bc2a1903b5098491abf5d819bc assets/create/models/block/white_postbox.json 99f0628623a36ac1700a5876cec010ee6353162f assets/create/models/block/white_seat.json f252f8c68702a0c050797a2dc2a51c586408722d assets/create/models/block/white_toolbox.json c9e344a06ee8bca1bfddd70481198135cabafbce assets/create/models/block/white_valve_handle.json 68d8eddfb724c73938862fb1a213a99c95814fdb assets/create/models/block/windmill_bearing.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/yellow_nixie_tube.json +9abbd0af47396b1cb18362b423f497ddb40eede4 assets/create/models/block/yellow_postbox.json cf8477d6c7558ceba38416fae755567086a856a6 assets/create/models/block/yellow_sail.json 07b68f0e4c617dfe3e935a1b9e8e020ab3131c0b assets/create/models/block/yellow_seat.json 21bb6e0b43984214c496e531e16dd60aeb619a42 assets/create/models/block/yellow_toolbox.json @@ -1703,12 +1735,14 @@ def88cd2c79a1f0ed40bbf5a0332187dd1d6006e assets/create/models/item/basin.json 35a1e2cb2645a8386dfee2697b47547b3f9a1dd2 assets/create/models/item/belt_connector.json f5dcb9096a52d5d2eab1e4204fbd1222e0d5094d assets/create/models/item/birch_window.json eccafeec52e4195fbe211c602b4fc71a260d8a64 assets/create/models/item/birch_window_pane.json +641b85751f91c0b4931307548c12034fc56286bc assets/create/models/item/black_postbox.json 7ca635d45fef81e6681a492be6c7bb71fd0f4574 assets/create/models/item/black_seat.json e2dc1a8db84d84d592bfd91a26464343b8706bc0 assets/create/models/item/black_toolbox.json 20fbeb136e85d146c0e041f7f1570b1d1fd34585 assets/create/models/item/black_valve_handle.json c31038397821b6abe296d2799aa81edf3c12d095 assets/create/models/item/blaze_burner.json 9d28754112688323a6b55ecb6742e918eabfd6a3 assets/create/models/item/blaze_cake.json 01637416bb932d861e9c9b10b256b2fdf4c96d44 assets/create/models/item/blaze_cake_base.json +ef453775edb9342dc68e0e4ed7aa2e845b819fa6 assets/create/models/item/blue_postbox.json de8beb7ef521822eb9b2826806baf1fa3344a45d assets/create/models/item/blue_seat.json a82bc56a503cd15d2354c86a49fc6d1d4ed22767 assets/create/models/item/blue_toolbox.json 2f90f781cd9b5d144a6cfd4748ae3a87c9f12ba8 assets/create/models/item/blue_valve_handle.json @@ -1727,6 +1761,7 @@ a51a28424e75dbd11c845f455c778d4c578b9da4 assets/create/models/item/brass_ladder. af97ba84be90381e2cc9434e31e2199c2e7e3aa6 assets/create/models/item/brass_scaffolding.json b78e9274156f5027a9a3b6fb7725c57a7aecc8bb assets/create/models/item/brass_sheet.json 28e104d5041c1f4676704c0f6b4e2e80aac43106 assets/create/models/item/brass_tunnel.json +35c8539a0b2f927e65a43c3a2c3cb82db429c2eb assets/create/models/item/brown_postbox.json fce64539b36fc8a5ffa39d7a3f73765818437cbf assets/create/models/item/brown_seat.json 90c1ec317beed0b5735c8731e3115a695b7060f7 assets/create/models/item/brown_toolbox.json 9477ab491586f1314bebf4d58387425ae56d0bad assets/create/models/item/brown_valve_handle.json @@ -1911,6 +1946,7 @@ f633006045ccfcdf486d7a240217229d6eed717e assets/create/models/item/cut_veridium_ 410b949304faa5856028f7c42ab762b7498ffd95 assets/create/models/item/cut_veridium_slab.json 62697c0922b11537914d2f4f84faa0b909ee518d assets/create/models/item/cut_veridium_stairs.json 3921d61a26d48d999cbb2f6645611e53ea71978b assets/create/models/item/cut_veridium_wall.json +73c2eed9b6a906a519e27361211ae05bc6ed2d87 assets/create/models/item/cyan_postbox.json eef3be2fa3b6424436a553e3c1bfee3979015962 assets/create/models/item/cyan_seat.json 265d5d6de4238442bb9b161dba0a2fc2f063df0b assets/create/models/item/cyan_toolbox.json 8beb6459822efe59d0f60749143d73c5390e39f2 assets/create/models/item/cyan_valve_handle.json @@ -1958,9 +1994,11 @@ b17d9fd1a92db0965f2e5da6215956b0451af29e assets/create/models/item/furnace_minec 7c850a41a754e46bb9c9f257ed621e37a1b9506a assets/create/models/item/goggles.json b1ae37998326c8ca054e57b0cbff0b51cad98625 assets/create/models/item/golden_sheet.json 85c301898775d5720d4d11c1c555b331a5c2e93b assets/create/models/item/granite_pillar.json +44173ca711aa497d08ca3b8a9613290378072870 assets/create/models/item/gray_postbox.json b8d6d2d163e2ab5f654bbc4eda9ad63f8064d27c assets/create/models/item/gray_seat.json 6492f86b693f924d0222d0ca1d16fbe33d797b1a assets/create/models/item/gray_toolbox.json 2a9500f9630b1da44615c7c9ca145b56324c46bb assets/create/models/item/gray_valve_handle.json +1a97f63df2977ac2f2e3363c61a7e36bf60d3ce3 assets/create/models/item/green_postbox.json 2843370b0e693e1ba1777c26416914edbd87c4f9 assets/create/models/item/green_seat.json 561e0579101bf602b252c0b9a5eec468c89d0e40 assets/create/models/item/green_toolbox.json 7d3ddad087b4d2c6a32f97092533cbfb5de0cb3b assets/create/models/item/green_valve_handle.json @@ -1997,19 +2035,23 @@ a22638fd361a8185175e107a8ee092a9ac030b7b assets/create/models/item/layered_grani 14494272713544a1595d654fd397a986b2da0951 assets/create/models/item/layered_scoria.json b1174d783c62dda84aafd4259c622197f4664421 assets/create/models/item/layered_tuff.json 952b07dbf9ecc1883deabaa1344667f13936f7f2 assets/create/models/item/layered_veridium.json +623c937db944651cf1075b3875afe002db527ed6 assets/create/models/item/light_blue_postbox.json b44a9f1bd9079f3533d7f708d76eb19a864e5ebb assets/create/models/item/light_blue_seat.json dae914625ff1bc3ebe1463485cad4526a7d7e9f5 assets/create/models/item/light_blue_toolbox.json 1d94314f185151eb9dcabcef950abf6f86c3c836 assets/create/models/item/light_blue_valve_handle.json +b56a28924b0b1b2530ebac7834e011700b09b966 assets/create/models/item/light_gray_postbox.json 1747bcdea3b1d3f5dfb786102069e07198d36dfe assets/create/models/item/light_gray_seat.json c8513eb1c89652783e26d7dcfcf64afa97619bc8 assets/create/models/item/light_gray_toolbox.json 3774d23e76b5712e7004e333e0a770f2230c2998 assets/create/models/item/light_gray_valve_handle.json 8f53caad3899a30be5087a0ba155080834418cc0 assets/create/models/item/limestone.json fba1e7d1cad39c89976b427db62544d80f47ad5d assets/create/models/item/limestone_pillar.json +26b8e1daf9cc4b206fb5f62904c7f1701ba93e67 assets/create/models/item/lime_postbox.json 32cd55a1c97a31a13ad106a457ec9925aa91f6d3 assets/create/models/item/lime_seat.json 931d187c11cb95a0eeae8f256187ef551b42007e assets/create/models/item/lime_toolbox.json d0f4148bdb0a905e68f54b5dfd829fd47e528fea assets/create/models/item/lime_valve_handle.json 1d30f9b525e8e9736b34a92f848e235c71fd6bd8 assets/create/models/item/linear_chassis.json 8f622f5f79446f6060d9e8815205fce919c8c829 assets/create/models/item/linked_controller.json +538e28af9013a43c258a659cbe67671991f3eee7 assets/create/models/item/magenta_postbox.json ad6fd371ee989c9c3c21e762273e8a4e903f0af8 assets/create/models/item/magenta_seat.json 7c0e3f91e5ab029473736deffb2b2aab9d4763c7 assets/create/models/item/magenta_toolbox.json 6d82582e5afea919927606b20a74cbda5223956f assets/create/models/item/magenta_valve_handle.json @@ -2043,6 +2085,7 @@ f80358eba19bc8d1741e4e25753866799631a118 assets/create/models/item/nixie_tube.js 061587faf0e53e4fac0c8f2f3bd6b22020b2a3ee assets/create/models/item/oak_window_pane.json af50363d603d61340b336569d58c1febde253665 assets/create/models/item/ochrum.json 62ec1afee14f9de3f5b02ee930d002a240a3c337 assets/create/models/item/ochrum_pillar.json +226f99c241b1d8b03d8fc57db32c1bee0721b64f assets/create/models/item/orange_postbox.json 56e7d28824d3fc566b5f551babbe423a550ef08c assets/create/models/item/orange_seat.json 96cc543d5afed90a022ece7b8671cd47a9b6fb68 assets/create/models/item/orange_toolbox.json 7e767ca9e0ddb769b38fabd9289648ac63f5413d assets/create/models/item/orange_valve_handle.json @@ -2059,6 +2102,7 @@ a8538df19e47fe37401c9fbedbb867b5d612a51b assets/create/models/item/packager_link 5b974e55caffdbfc2156eb8b59dd99db12243bd3 assets/create/models/item/package_filter.json 7fd76e7d2e6c6d94352f1fa08d096b63616ad01e assets/create/models/item/package_frogport.json 76aeceb41bb7df873dbafe1bd5e26deb24abf93f assets/create/models/item/peculiar_bell.json +ab6c05a0468f3f4295a07adb362fa2d36cf6e3e8 assets/create/models/item/pink_postbox.json df13d4281dc45041ecd93504d45daef61d070581 assets/create/models/item/pink_seat.json 842afb2a345dbaba857e90f7dffa724841ef7b2d assets/create/models/item/pink_toolbox.json 6b85a0da81b2d18fb54eb05e187a2ce8cd7b09eb assets/create/models/item/pink_valve_handle.json @@ -2132,6 +2176,7 @@ d9a736e7a6fc70e0848de3e318c739d58b1e563f assets/create/models/item/propeller.jso 9b41eec5759887be9bae3d27654bf478a7eff676 assets/create/models/item/pulse_extender.json ea76bd3bd9e5bea4d64d91347d473b538e926b02 assets/create/models/item/pulse_repeater.json 6ff9ce0cc633ea39b779b2e873a1d0fd7cfe7119 assets/create/models/item/pulse_timer.json +8496f6c5449a70eef12e9c68ba46eee2f365fb77 assets/create/models/item/purple_postbox.json 7e165f83266edf34bb03fa3e8d2a83d44829c10a assets/create/models/item/purple_seat.json d75c4969334f2ee1ae4a3d8ac28b001735c76b97 assets/create/models/item/purple_toolbox.json ebffb05119f499fcec051a4337aadc47654baed2 assets/create/models/item/purple_valve_handle.json @@ -2142,6 +2187,7 @@ f91405b9aec1e0142c1b90582e03a1973251da05 assets/create/models/item/radial_chassi 9dc6c52e258b00cac6ed23147983045c43218b5d assets/create/models/item/redstone_contact.json f8f733364bdd32b2ad597e81103bc02344ce63bd assets/create/models/item/redstone_link.json f526dee8bc213b3d87cbc79350eb37b61b0eee79 assets/create/models/item/redstone_requester.json +4b73ee9cc2651a3d1a97476d100f9c4d7e2b2efe assets/create/models/item/red_postbox.json 8d00eb1a10055a802556eab10e13f522d12acd1c assets/create/models/item/red_sand_paper.json b64a054c92cbd2e055502d470f3921d1077e63a1 assets/create/models/item/red_seat.json ac4695cc465d094b4adba1a4e9efec42c916f37d assets/create/models/item/red_toolbox.json @@ -2297,6 +2343,7 @@ dadc7b65a4527e288c21a20df978796a8c444fd2 assets/create/models/item/waxed_weather 79431edb868e6560f4f6d5b3441c0176c7699f5e assets/create/models/item/weighted_ejector.json 0fd2214cdff8a92e05d9d5ee888329b3235143c0 assets/create/models/item/wheat_flour.json aacced59d21212090d508a9684bb46c9472a8a2f assets/create/models/item/whisk.json +bcf3104e463ec212dc239281033e4e80d78e1d74 assets/create/models/item/white_postbox.json 4e112e82185e2c1a5c57f5a94fa11c59c92cef0d assets/create/models/item/white_sail.json 17ed8ac7d745117f622190a46c5e1b42892afc29 assets/create/models/item/white_seat.json 432040f39177ab3df6003df24e818c73e28cf754 assets/create/models/item/white_toolbox.json @@ -2304,6 +2351,7 @@ aacced59d21212090d508a9684bb46c9472a8a2f assets/create/models/item/whisk.json bccccbdfa5d376936e123defa44f2907dc317617 assets/create/models/item/windmill_bearing.json 47c6ad1c146366156a0ec4bc1cbf74282784698f assets/create/models/item/wooden_bracket.json 6c08d2fa59e56e4848063ab6f3e45894b89f1744 assets/create/models/item/wrench.json +3a899db3044ee39ac5d6385c16630733e00f77ca assets/create/models/item/yellow_postbox.json ac59f141cd3c3f7e57a794e542d6e22bf8ebb8f9 assets/create/models/item/yellow_seat.json 532a429d58a177f61b4d67180db7676fa7536052 assets/create/models/item/yellow_toolbox.json 2c87ef8a26a01a17b2f3799d62cb27cf1107d061 assets/create/models/item/yellow_valve_handle.json @@ -2992,12 +3040,14 @@ d964b7a8f6a4ce28ce640d31a01e77eafcc181e5 data/create/loot_tables/blocks/belt.jso a268eb02c10015a901a6543595b2b815a8026d78 data/create/loot_tables/blocks/birch_window.json 43d16eae230de501c528f4e9af666f72a081ed29 data/create/loot_tables/blocks/birch_window_pane.json 4aec2374e76dfa5535fe22b1fc02b4b2d453217d data/create/loot_tables/blocks/black_nixie_tube.json +6ed685605e24af5c6ff5d797dde8492069427b76 data/create/loot_tables/blocks/black_postbox.json 7ce6dd2c0d02eb1b56ec441044dfc608ea6bcb41 data/create/loot_tables/blocks/black_sail.json 2449b8c173fbbc2a96e0b8d1996d72fb60527e64 data/create/loot_tables/blocks/black_seat.json 2d33e25b2741f634bbd6cd77b31c17dd94511d94 data/create/loot_tables/blocks/black_toolbox.json f911ac185cd48afa2393d24f28a688936a9fa147 data/create/loot_tables/blocks/black_valve_handle.json eee41c02c8cfcdb56f31e74fc266783b785bea9d data/create/loot_tables/blocks/blaze_burner.json 247d12823eed3b9248003aca8e3ead87972ac61e data/create/loot_tables/blocks/blue_nixie_tube.json +76217732c9bddf77b7de735b4380d9f92adca9b3 data/create/loot_tables/blocks/blue_postbox.json bb9d906a97810ed1461ed321ef8e4bee1dd104fb data/create/loot_tables/blocks/blue_sail.json 833fe6bc3020055dd0d6f46b324cbe27b248708d data/create/loot_tables/blocks/blue_seat.json 9d22716d9d846dc9587e327dfcdf18dd5955f826 data/create/loot_tables/blocks/blue_toolbox.json @@ -3015,6 +3065,7 @@ e466a397f84957616f7e83954db2050355f052c9 data/create/loot_tables/blocks/brass_en 429d524c9848b44d19028126f0efd678e0c4b680 data/create/loot_tables/blocks/brass_scaffolding.json af90102bfe0e3a14bf1330cddec553f27b8fba89 data/create/loot_tables/blocks/brass_tunnel.json d391cff5b741fd6ddf5b6fa64e05526eb3a9f0d9 data/create/loot_tables/blocks/brown_nixie_tube.json +bfa0365507a888134c20b36af4bd7944263687f0 data/create/loot_tables/blocks/brown_postbox.json 862bd3ceed05ea45c03911bb8403817b73c4bc38 data/create/loot_tables/blocks/brown_sail.json 6ddbdd489120be56f50272c86ecdb886afa3a8e4 data/create/loot_tables/blocks/brown_seat.json 588ae3d0da73eed3bc30cb28c583e7f8312d15bd data/create/loot_tables/blocks/brown_toolbox.json @@ -3170,6 +3221,7 @@ d9552e3e9f4de0e09df8ca9446066e94c6e2c681 data/create/loot_tables/blocks/cut_veri 4845f7127921c7dd93a59118e63c37107d6c2061 data/create/loot_tables/blocks/cut_veridium_stairs.json b56caea031d637321eddfd5d122fc357d2c2e49c data/create/loot_tables/blocks/cut_veridium_wall.json ffb440a03f5e513b8d20c2725a95dc5c9b84c73b data/create/loot_tables/blocks/cyan_nixie_tube.json +914146303ae7e73c4f9283ea61cd5443f49f5cde data/create/loot_tables/blocks/cyan_postbox.json 8858b4e1b4e51889b2006005585a17e4978ed8e9 data/create/loot_tables/blocks/cyan_sail.json 8dccecb2c87d7421efdfb3fb97ae62b79f0b4411 data/create/loot_tables/blocks/cyan_seat.json 66ea2f2cc32d49bb434f83cbd07736d6fbacacf3 data/create/loot_tables/blocks/cyan_toolbox.json @@ -3212,11 +3264,13 @@ a4c86e5456bbbcc417d736151ac6a15c944d555b data/create/loot_tables/blocks/gearshif ffa2776989447e44fa10673986961ab395ebd592 data/create/loot_tables/blocks/glass_fluid_pipe.json 07d8265c285ebb69b9160d516905ae1f17acc87d data/create/loot_tables/blocks/granite_pillar.json 41feb0f235495384ebca5b6f70d01b6f0c0c8878 data/create/loot_tables/blocks/gray_nixie_tube.json +6f123d5e6612274223ddb695e582abd952d3521c data/create/loot_tables/blocks/gray_postbox.json bd526fc4f0acea571c37b2ecbb7267fee6be29f0 data/create/loot_tables/blocks/gray_sail.json 5e23e2032f92737eaa6e6cfb4c62232566f06e77 data/create/loot_tables/blocks/gray_seat.json 6ff8b3e59ea98697b87e71eb64d1e6f7e4631f36 data/create/loot_tables/blocks/gray_toolbox.json aa0d47422e0adc3fb18e5c0eefd25c417ddbf9ae data/create/loot_tables/blocks/gray_valve_handle.json 4cfbe1bdc89916f78f891b9dbaed461cd838584b data/create/loot_tables/blocks/green_nixie_tube.json +e99e3895a19faa928e40fa17fbfbda6d3566b1ed data/create/loot_tables/blocks/green_postbox.json 6c22cf8de05828af7979dc32d9e151297d551fe5 data/create/loot_tables/blocks/green_sail.json fbd61c331d4fda692f0e7174aed5aed3652d3553 data/create/loot_tables/blocks/green_seat.json 703a285a5d47fcc13e6775040d45620db2ef5480 data/create/loot_tables/blocks/green_toolbox.json @@ -3251,11 +3305,13 @@ b4882fe056a8d03bddf7a8c4fa70ee06548e1743 data/create/loot_tables/blocks/layered_ 7f9ea6bfcf8344018866013e12d23edf21f034e9 data/create/loot_tables/blocks/layered_veridium.json 54a876a52655d5c9c33325a7d07c7978d33adca6 data/create/loot_tables/blocks/lectern_controller.json 8a6153a0b5857c77cdac0cffcb22e30ae6181f3a data/create/loot_tables/blocks/light_blue_nixie_tube.json +27bbda185ab99cff4974e6bfc40b72265896ef42 data/create/loot_tables/blocks/light_blue_postbox.json 304072298d4078eca7e0fb8c58ea3144afe246a8 data/create/loot_tables/blocks/light_blue_sail.json a1396be526ef27c6d0f97cdd0f0e61f810e7353b data/create/loot_tables/blocks/light_blue_seat.json 0cd56baf9f3c9edb97e4ce892d374e21a099374f data/create/loot_tables/blocks/light_blue_toolbox.json bf4e6c308d82f15689406b5b3e88fe95d49a9a44 data/create/loot_tables/blocks/light_blue_valve_handle.json 6928acbfcafdfead9750be6760da163b86532054 data/create/loot_tables/blocks/light_gray_nixie_tube.json +eb95d1e0abb93d5efecb0809e3901f37021c4dfc data/create/loot_tables/blocks/light_gray_postbox.json 886ef98e4bd60d8860b56441da6928e24f262d70 data/create/loot_tables/blocks/light_gray_sail.json 1ae0ff25ac9468e67ab1847b87a37829328d4c84 data/create/loot_tables/blocks/light_gray_seat.json e22dfadefcea50090efe87136a4b92e6ef20d379 data/create/loot_tables/blocks/light_gray_toolbox.json @@ -3263,6 +3319,7 @@ e22dfadefcea50090efe87136a4b92e6ef20d379 data/create/loot_tables/blocks/light_gr c6bb0877c537dda15469934383dc45c608bfd1a4 data/create/loot_tables/blocks/limestone.json 49058a62e1abd34917f983b6bc13cc4353b613a2 data/create/loot_tables/blocks/limestone_pillar.json 582bb26f6df37d0c2dbe12983ad05fc74f5fb5c0 data/create/loot_tables/blocks/lime_nixie_tube.json +ec9d973d218b26d51b82f265603feab31170c619 data/create/loot_tables/blocks/lime_postbox.json 623ac65211a9920325308b55285f78e3b7275751 data/create/loot_tables/blocks/lime_sail.json 7efe69664a781b292f491d5ff89e27dd5991f3cf data/create/loot_tables/blocks/lime_seat.json 0f6a465501a445925e9aff7a4c84b3c8e2caa93e data/create/loot_tables/blocks/lime_toolbox.json @@ -3270,6 +3327,7 @@ c6bb0877c537dda15469934383dc45c608bfd1a4 data/create/loot_tables/blocks/limeston baf70f9eb579f20b232a2af4e6b00a54f84844e6 data/create/loot_tables/blocks/linear_chassis.json e4c0f8ca822cf7555bd011825b430c3c735160d4 data/create/loot_tables/blocks/lit_blaze_burner.json 6bd8b044cc9c69a5268372e5436f556da2c1bf21 data/create/loot_tables/blocks/magenta_nixie_tube.json +601bc43286b9f6b978ae8681281bf8e195f8211d data/create/loot_tables/blocks/magenta_postbox.json b4d06c9ce7fbec0f23bb6dbc446b77d070f06775 data/create/loot_tables/blocks/magenta_sail.json 300e480d8e43e3a4ca19a92ae1360c02f7c5accd data/create/loot_tables/blocks/magenta_seat.json 40d2ba0a52eaa2c61900731f0cee2657c5e77c20 data/create/loot_tables/blocks/magenta_toolbox.json @@ -3302,6 +3360,7 @@ fe79cb4cbea87efc84d61d3d31f073bf3c64c73d data/create/loot_tables/blocks/netherit 5dcb11160a51ce17fb06f5fecc14e87d92b1a641 data/create/loot_tables/blocks/oak_window_pane.json 461e9818f41aab34905757a423455cdcee780e67 data/create/loot_tables/blocks/ochrum.json 1259a439286385d5b7c48bff89d0839f1f2e02c2 data/create/loot_tables/blocks/ochrum_pillar.json +3f6940f13ca705bad7cdb9a9b80a3ae84f70f80c data/create/loot_tables/blocks/orange_postbox.json d6323d4b30faa87cd4b5b8b815cb16f78296f203 data/create/loot_tables/blocks/orange_sail.json 119fc4c3055c09c7958ac405925a6b7be2081c6b data/create/loot_tables/blocks/orange_seat.json 54ac8c8166c23f24a8a0870c981ef8ffa64c0b89 data/create/loot_tables/blocks/orange_toolbox.json @@ -3319,6 +3378,7 @@ e5df1b8ead9e575ed06f2040a7c9cc72c7a71b49 data/create/loot_tables/blocks/packager 54aa9700df601640b705d912abe773d5b6ee2b1f data/create/loot_tables/blocks/package_frogport.json 58bd9fe9d6706998bfbda3b077cfd0a740972091 data/create/loot_tables/blocks/peculiar_bell.json 4d7724df6fefee4512c4f7886d0e103d1dc39510 data/create/loot_tables/blocks/pink_nixie_tube.json +df7b12349c64d035eb563535b03cb70d780c5a71 data/create/loot_tables/blocks/pink_postbox.json 85811771fbc36f645fdb9f510639715399503c99 data/create/loot_tables/blocks/pink_sail.json 9a5652002131d14c585a6e434a4457ef36d2f60d data/create/loot_tables/blocks/pink_seat.json 23e28971460b2a3b8b39412a4778672d7ced4af7 data/create/loot_tables/blocks/pink_toolbox.json @@ -3391,6 +3451,7 @@ e654e6cedc0373e97caea947e7e605bc4095da88 data/create/loot_tables/blocks/pulse_ex 422385f062dd63edaf246c42fb0e617e92e6cc44 data/create/loot_tables/blocks/pulse_repeater.json 93f0c41aedaa2b9baceda78b93a4b3198962e3f9 data/create/loot_tables/blocks/pulse_timer.json 6f453ea136098a5872aeb4e2ad1e5b78d2fd571f data/create/loot_tables/blocks/purple_nixie_tube.json +53e964048baa1b98877a559e8fda6c8f367d5cd6 data/create/loot_tables/blocks/purple_postbox.json c6b7a02db55cf0824a48156adf469c478dfd6a8d data/create/loot_tables/blocks/purple_sail.json 73cd7cc36fafb491666d2bccf1b4f24624b3c8f2 data/create/loot_tables/blocks/purple_seat.json 147086b9db173aed1b25d9460d0135708dcebcf9 data/create/loot_tables/blocks/purple_toolbox.json @@ -3402,6 +3463,7 @@ bbc2d61eeea335f8f011d799ef6a5484ca027640 data/create/loot_tables/blocks/redstone 4fa70deeac7e56121e42fb602dfa27ee1727f749 data/create/loot_tables/blocks/redstone_link.json efc3a5595e4daf67fa43f84c9869dfc76fd6fca4 data/create/loot_tables/blocks/redstone_requester.json a50e1c28af16e9f1b4f48aa974461167139768a7 data/create/loot_tables/blocks/red_nixie_tube.json +f36f1e69e4fb8723238f81aadbac892f54b5ac62 data/create/loot_tables/blocks/red_postbox.json 977d724cddf8eba053a3310ad0d30af15199bbed data/create/loot_tables/blocks/red_sail.json 9aedede893e2127a1cdd17695699397d8d5c6ce5 data/create/loot_tables/blocks/red_seat.json 9713071cab536e8c1550a6309dc4563fecc2c4e0 data/create/loot_tables/blocks/red_toolbox.json @@ -3546,6 +3608,7 @@ d6862dc9f7d291df618fbce71eebf613711a5517 data/create/loot_tables/blocks/weathere 57d5065d53016e4b1ef0fbad9b84605b1546bcc4 data/create/loot_tables/blocks/weathered_copper_tile_stairs.json f6ba0623b4bcea2f3796df4c65c494fc072d2c21 data/create/loot_tables/blocks/weighted_ejector.json 978263272f632ed79a61d52a0080de0b7b8102d6 data/create/loot_tables/blocks/white_nixie_tube.json +3d8a4d4a9634d49b20f65ebcdddaef2d0f21b36b data/create/loot_tables/blocks/white_postbox.json 129c6772c1c12271f9b0d41c77f41ce34fc437b1 data/create/loot_tables/blocks/white_sail.json 84c79bc47b4a74021e91745356bb24fe02402209 data/create/loot_tables/blocks/white_seat.json 3c63263c9fb642e34a0a67af4cab2d4348d661c0 data/create/loot_tables/blocks/white_toolbox.json @@ -3553,6 +3616,7 @@ f6ba0623b4bcea2f3796df4c65c494fc072d2c21 data/create/loot_tables/blocks/weighted bf0ea5c6957a43b6c4b1914df70e0b8f6585e638 data/create/loot_tables/blocks/windmill_bearing.json ed989d41a4b640dc1ffb15c9c0712ee3172d408f data/create/loot_tables/blocks/wooden_bracket.json d9f853e662b004b6ffdbb82af99ad7e774698178 data/create/loot_tables/blocks/yellow_nixie_tube.json +a536699cab16540eb906e0b63a2c5064244c7b6c data/create/loot_tables/blocks/yellow_postbox.json 0ead61521fec15522633d6cfdeb77150bb30d075 data/create/loot_tables/blocks/yellow_sail.json 3ae6d4e380237face57b9187ab8570967226b3b1 data/create/loot_tables/blocks/yellow_seat.json 11b10beba7a6842ce3d01ea4210bff7d3aa6ab94 data/create/loot_tables/blocks/yellow_toolbox.json @@ -4214,6 +4278,7 @@ f675c20350ed60da4878b5d6301f02c8c05624bd data/create/tags/blocks/fan_processing_ 4970078b49ddac1b1d500ed0469cedf42bdc3d35 data/create/tags/blocks/non_movable.json 06e13efbb7b0d09ff7ecd1a7dc45a0760b91ad67 data/create/tags/blocks/ore_override_stone.json a5874f73c7dc0a3ae12999e6ae8abf45bc7fb9be data/create/tags/blocks/passive_boiler_heaters.json +f400870b8dbcd14238be3ec99c419093073ba3a6 data/create/tags/blocks/postboxes.json 9bc8c13fd80bdbe7f767b91ee1a1042e9aff02b0 data/create/tags/blocks/roots.json 55dccb895bbdacfbd6ee9005486cd3fe9df01249 data/create/tags/blocks/safe_nbt.json 79418bd729cef417b322cef9b491e7ae83317d61 data/create/tags/blocks/seats.json @@ -4240,6 +4305,7 @@ d371dfd35e49a7bef19f59c03e7f4ae20992f03d data/create/tags/items/create_ingots.js 0fa526e7e742573b603ad26b09526cf724efa1dc data/create/tags/items/deployable_drink.json 1cebeb92bd514b75d54ac6d5708047801f0501c5 data/create/tags/items/modded_stripped_logs.json 586f8fc5a8b8559c9dc0017e13c78ad918688fae data/create/tags/items/modded_stripped_wood.json +f400870b8dbcd14238be3ec99c419093073ba3a6 data/create/tags/items/postboxes.json 695d75b352fd190b303c724d1aaee9bb786a903b data/create/tags/items/pressurized_air_sources.json 2cd3adffd8b151354df137a990dcb97996a665bb data/create/tags/items/sandpaper.json 79418bd729cef417b322cef9b491e7ae83317d61 data/create/tags/items/seats.json @@ -4329,7 +4395,7 @@ c741ba83b562ae3459d7c4f2db69537f549ea411 data/forge/tags/items/tools/wrench.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/dripstone_replaceable_blocks.json e3321ff14704c031a2c16953b7e391f4f24dd70b data/minecraft/tags/blocks/impermeable.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/lush_ground_replaceable.json -cb2f3843d82d0d56ecdb5333cf02fc1ea59b3792 data/minecraft/tags/blocks/mineable/axe.json +5bfa11627f37364de2098753c85a589721cfa2af data/minecraft/tags/blocks/mineable/axe.json 1f8802b85d179bbd7f74ec37c6ffceb59eb4856c data/minecraft/tags/blocks/mineable/pickaxe.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/moss_replaceable.json 0c13aae0eeb99e89febe8dbe5e002af2ff843a9e data/minecraft/tags/blocks/needs_iron_tool.json diff --git a/src/generated/resources/assets/create/blockstates/black_postbox.json b/src/generated/resources/assets/create/blockstates/black_postbox.json new file mode 100644 index 0000000000..55f5338a0b --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/black_postbox.json @@ -0,0 +1,34 @@ +{ + "variants": { + "facing=east,open=false": { + "model": "create:block/black_postbox", + "y": 90 + }, + "facing=east,open=true": { + "model": "create:block/black_postbox", + "y": 90 + }, + "facing=north,open=false": { + "model": "create:block/black_postbox" + }, + "facing=north,open=true": { + "model": "create:block/black_postbox" + }, + "facing=south,open=false": { + "model": "create:block/black_postbox", + "y": 180 + }, + "facing=south,open=true": { + "model": "create:block/black_postbox", + "y": 180 + }, + "facing=west,open=false": { + "model": "create:block/black_postbox", + "y": 270 + }, + "facing=west,open=true": { + "model": "create:block/black_postbox", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/blue_postbox.json b/src/generated/resources/assets/create/blockstates/blue_postbox.json new file mode 100644 index 0000000000..a33c5e87a5 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/blue_postbox.json @@ -0,0 +1,34 @@ +{ + "variants": { + "facing=east,open=false": { + "model": "create:block/blue_postbox", + "y": 90 + }, + "facing=east,open=true": { + "model": "create:block/blue_postbox", + "y": 90 + }, + "facing=north,open=false": { + "model": "create:block/blue_postbox" + }, + "facing=north,open=true": { + "model": "create:block/blue_postbox" + }, + "facing=south,open=false": { + "model": "create:block/blue_postbox", + "y": 180 + }, + "facing=south,open=true": { + "model": "create:block/blue_postbox", + "y": 180 + }, + "facing=west,open=false": { + "model": "create:block/blue_postbox", + "y": 270 + }, + "facing=west,open=true": { + "model": "create:block/blue_postbox", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/brown_postbox.json b/src/generated/resources/assets/create/blockstates/brown_postbox.json new file mode 100644 index 0000000000..ad38686dbb --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/brown_postbox.json @@ -0,0 +1,34 @@ +{ + "variants": { + "facing=east,open=false": { + "model": "create:block/brown_postbox", + "y": 90 + }, + "facing=east,open=true": { + "model": "create:block/brown_postbox", + "y": 90 + }, + "facing=north,open=false": { + "model": "create:block/brown_postbox" + }, + "facing=north,open=true": { + "model": "create:block/brown_postbox" + }, + "facing=south,open=false": { + "model": "create:block/brown_postbox", + "y": 180 + }, + "facing=south,open=true": { + "model": "create:block/brown_postbox", + "y": 180 + }, + "facing=west,open=false": { + "model": "create:block/brown_postbox", + "y": 270 + }, + "facing=west,open=true": { + "model": "create:block/brown_postbox", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/cyan_postbox.json b/src/generated/resources/assets/create/blockstates/cyan_postbox.json new file mode 100644 index 0000000000..3cffa0f9c2 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/cyan_postbox.json @@ -0,0 +1,34 @@ +{ + "variants": { + "facing=east,open=false": { + "model": "create:block/cyan_postbox", + "y": 90 + }, + "facing=east,open=true": { + "model": "create:block/cyan_postbox", + "y": 90 + }, + "facing=north,open=false": { + "model": "create:block/cyan_postbox" + }, + "facing=north,open=true": { + "model": "create:block/cyan_postbox" + }, + "facing=south,open=false": { + "model": "create:block/cyan_postbox", + "y": 180 + }, + "facing=south,open=true": { + "model": "create:block/cyan_postbox", + "y": 180 + }, + "facing=west,open=false": { + "model": "create:block/cyan_postbox", + "y": 270 + }, + "facing=west,open=true": { + "model": "create:block/cyan_postbox", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/gray_postbox.json b/src/generated/resources/assets/create/blockstates/gray_postbox.json new file mode 100644 index 0000000000..d072c5fd06 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/gray_postbox.json @@ -0,0 +1,34 @@ +{ + "variants": { + "facing=east,open=false": { + "model": "create:block/gray_postbox", + "y": 90 + }, + "facing=east,open=true": { + "model": "create:block/gray_postbox", + "y": 90 + }, + "facing=north,open=false": { + "model": "create:block/gray_postbox" + }, + "facing=north,open=true": { + "model": "create:block/gray_postbox" + }, + "facing=south,open=false": { + "model": "create:block/gray_postbox", + "y": 180 + }, + "facing=south,open=true": { + "model": "create:block/gray_postbox", + "y": 180 + }, + "facing=west,open=false": { + "model": "create:block/gray_postbox", + "y": 270 + }, + "facing=west,open=true": { + "model": "create:block/gray_postbox", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/green_postbox.json b/src/generated/resources/assets/create/blockstates/green_postbox.json new file mode 100644 index 0000000000..1f7dc4cf28 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/green_postbox.json @@ -0,0 +1,34 @@ +{ + "variants": { + "facing=east,open=false": { + "model": "create:block/green_postbox", + "y": 90 + }, + "facing=east,open=true": { + "model": "create:block/green_postbox", + "y": 90 + }, + "facing=north,open=false": { + "model": "create:block/green_postbox" + }, + "facing=north,open=true": { + "model": "create:block/green_postbox" + }, + "facing=south,open=false": { + "model": "create:block/green_postbox", + "y": 180 + }, + "facing=south,open=true": { + "model": "create:block/green_postbox", + "y": 180 + }, + "facing=west,open=false": { + "model": "create:block/green_postbox", + "y": 270 + }, + "facing=west,open=true": { + "model": "create:block/green_postbox", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/light_blue_postbox.json b/src/generated/resources/assets/create/blockstates/light_blue_postbox.json new file mode 100644 index 0000000000..2032c913e9 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/light_blue_postbox.json @@ -0,0 +1,34 @@ +{ + "variants": { + "facing=east,open=false": { + "model": "create:block/light_blue_postbox", + "y": 90 + }, + "facing=east,open=true": { + "model": "create:block/light_blue_postbox", + "y": 90 + }, + "facing=north,open=false": { + "model": "create:block/light_blue_postbox" + }, + "facing=north,open=true": { + "model": "create:block/light_blue_postbox" + }, + "facing=south,open=false": { + "model": "create:block/light_blue_postbox", + "y": 180 + }, + "facing=south,open=true": { + "model": "create:block/light_blue_postbox", + "y": 180 + }, + "facing=west,open=false": { + "model": "create:block/light_blue_postbox", + "y": 270 + }, + "facing=west,open=true": { + "model": "create:block/light_blue_postbox", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/light_gray_postbox.json b/src/generated/resources/assets/create/blockstates/light_gray_postbox.json new file mode 100644 index 0000000000..8718ed56cf --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/light_gray_postbox.json @@ -0,0 +1,34 @@ +{ + "variants": { + "facing=east,open=false": { + "model": "create:block/light_gray_postbox", + "y": 90 + }, + "facing=east,open=true": { + "model": "create:block/light_gray_postbox", + "y": 90 + }, + "facing=north,open=false": { + "model": "create:block/light_gray_postbox" + }, + "facing=north,open=true": { + "model": "create:block/light_gray_postbox" + }, + "facing=south,open=false": { + "model": "create:block/light_gray_postbox", + "y": 180 + }, + "facing=south,open=true": { + "model": "create:block/light_gray_postbox", + "y": 180 + }, + "facing=west,open=false": { + "model": "create:block/light_gray_postbox", + "y": 270 + }, + "facing=west,open=true": { + "model": "create:block/light_gray_postbox", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/lime_postbox.json b/src/generated/resources/assets/create/blockstates/lime_postbox.json new file mode 100644 index 0000000000..f7dc692eb0 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/lime_postbox.json @@ -0,0 +1,34 @@ +{ + "variants": { + "facing=east,open=false": { + "model": "create:block/lime_postbox", + "y": 90 + }, + "facing=east,open=true": { + "model": "create:block/lime_postbox", + "y": 90 + }, + "facing=north,open=false": { + "model": "create:block/lime_postbox" + }, + "facing=north,open=true": { + "model": "create:block/lime_postbox" + }, + "facing=south,open=false": { + "model": "create:block/lime_postbox", + "y": 180 + }, + "facing=south,open=true": { + "model": "create:block/lime_postbox", + "y": 180 + }, + "facing=west,open=false": { + "model": "create:block/lime_postbox", + "y": 270 + }, + "facing=west,open=true": { + "model": "create:block/lime_postbox", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/magenta_postbox.json b/src/generated/resources/assets/create/blockstates/magenta_postbox.json new file mode 100644 index 0000000000..d385e8276a --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/magenta_postbox.json @@ -0,0 +1,34 @@ +{ + "variants": { + "facing=east,open=false": { + "model": "create:block/magenta_postbox", + "y": 90 + }, + "facing=east,open=true": { + "model": "create:block/magenta_postbox", + "y": 90 + }, + "facing=north,open=false": { + "model": "create:block/magenta_postbox" + }, + "facing=north,open=true": { + "model": "create:block/magenta_postbox" + }, + "facing=south,open=false": { + "model": "create:block/magenta_postbox", + "y": 180 + }, + "facing=south,open=true": { + "model": "create:block/magenta_postbox", + "y": 180 + }, + "facing=west,open=false": { + "model": "create:block/magenta_postbox", + "y": 270 + }, + "facing=west,open=true": { + "model": "create:block/magenta_postbox", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/orange_postbox.json b/src/generated/resources/assets/create/blockstates/orange_postbox.json new file mode 100644 index 0000000000..6a94bd86d7 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/orange_postbox.json @@ -0,0 +1,34 @@ +{ + "variants": { + "facing=east,open=false": { + "model": "create:block/orange_postbox", + "y": 90 + }, + "facing=east,open=true": { + "model": "create:block/orange_postbox", + "y": 90 + }, + "facing=north,open=false": { + "model": "create:block/orange_postbox" + }, + "facing=north,open=true": { + "model": "create:block/orange_postbox" + }, + "facing=south,open=false": { + "model": "create:block/orange_postbox", + "y": 180 + }, + "facing=south,open=true": { + "model": "create:block/orange_postbox", + "y": 180 + }, + "facing=west,open=false": { + "model": "create:block/orange_postbox", + "y": 270 + }, + "facing=west,open=true": { + "model": "create:block/orange_postbox", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/pink_postbox.json b/src/generated/resources/assets/create/blockstates/pink_postbox.json new file mode 100644 index 0000000000..daf6c2a355 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/pink_postbox.json @@ -0,0 +1,34 @@ +{ + "variants": { + "facing=east,open=false": { + "model": "create:block/pink_postbox", + "y": 90 + }, + "facing=east,open=true": { + "model": "create:block/pink_postbox", + "y": 90 + }, + "facing=north,open=false": { + "model": "create:block/pink_postbox" + }, + "facing=north,open=true": { + "model": "create:block/pink_postbox" + }, + "facing=south,open=false": { + "model": "create:block/pink_postbox", + "y": 180 + }, + "facing=south,open=true": { + "model": "create:block/pink_postbox", + "y": 180 + }, + "facing=west,open=false": { + "model": "create:block/pink_postbox", + "y": 270 + }, + "facing=west,open=true": { + "model": "create:block/pink_postbox", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/purple_postbox.json b/src/generated/resources/assets/create/blockstates/purple_postbox.json new file mode 100644 index 0000000000..1d95d7201d --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/purple_postbox.json @@ -0,0 +1,34 @@ +{ + "variants": { + "facing=east,open=false": { + "model": "create:block/purple_postbox", + "y": 90 + }, + "facing=east,open=true": { + "model": "create:block/purple_postbox", + "y": 90 + }, + "facing=north,open=false": { + "model": "create:block/purple_postbox" + }, + "facing=north,open=true": { + "model": "create:block/purple_postbox" + }, + "facing=south,open=false": { + "model": "create:block/purple_postbox", + "y": 180 + }, + "facing=south,open=true": { + "model": "create:block/purple_postbox", + "y": 180 + }, + "facing=west,open=false": { + "model": "create:block/purple_postbox", + "y": 270 + }, + "facing=west,open=true": { + "model": "create:block/purple_postbox", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/red_postbox.json b/src/generated/resources/assets/create/blockstates/red_postbox.json new file mode 100644 index 0000000000..56c1c83ae1 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/red_postbox.json @@ -0,0 +1,34 @@ +{ + "variants": { + "facing=east,open=false": { + "model": "create:block/red_postbox", + "y": 90 + }, + "facing=east,open=true": { + "model": "create:block/red_postbox", + "y": 90 + }, + "facing=north,open=false": { + "model": "create:block/red_postbox" + }, + "facing=north,open=true": { + "model": "create:block/red_postbox" + }, + "facing=south,open=false": { + "model": "create:block/red_postbox", + "y": 180 + }, + "facing=south,open=true": { + "model": "create:block/red_postbox", + "y": 180 + }, + "facing=west,open=false": { + "model": "create:block/red_postbox", + "y": 270 + }, + "facing=west,open=true": { + "model": "create:block/red_postbox", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/white_postbox.json b/src/generated/resources/assets/create/blockstates/white_postbox.json new file mode 100644 index 0000000000..335fe6ff05 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/white_postbox.json @@ -0,0 +1,34 @@ +{ + "variants": { + "facing=east,open=false": { + "model": "create:block/white_postbox", + "y": 90 + }, + "facing=east,open=true": { + "model": "create:block/white_postbox", + "y": 90 + }, + "facing=north,open=false": { + "model": "create:block/white_postbox" + }, + "facing=north,open=true": { + "model": "create:block/white_postbox" + }, + "facing=south,open=false": { + "model": "create:block/white_postbox", + "y": 180 + }, + "facing=south,open=true": { + "model": "create:block/white_postbox", + "y": 180 + }, + "facing=west,open=false": { + "model": "create:block/white_postbox", + "y": 270 + }, + "facing=west,open=true": { + "model": "create:block/white_postbox", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/yellow_postbox.json b/src/generated/resources/assets/create/blockstates/yellow_postbox.json new file mode 100644 index 0000000000..a3b3f8f4e7 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/yellow_postbox.json @@ -0,0 +1,34 @@ +{ + "variants": { + "facing=east,open=false": { + "model": "create:block/yellow_postbox", + "y": 90 + }, + "facing=east,open=true": { + "model": "create:block/yellow_postbox", + "y": 90 + }, + "facing=north,open=false": { + "model": "create:block/yellow_postbox" + }, + "facing=north,open=true": { + "model": "create:block/yellow_postbox" + }, + "facing=south,open=false": { + "model": "create:block/yellow_postbox", + "y": 180 + }, + "facing=south,open=true": { + "model": "create:block/yellow_postbox", + "y": 180 + }, + "facing=west,open=false": { + "model": "create:block/yellow_postbox", + "y": 270 + }, + "facing=west,open=true": { + "model": "create:block/yellow_postbox", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 61b26871ee..6967a4fe7c 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -209,12 +209,14 @@ "block.create.birch_window": "ʍopuıM ɥɔɹıᗺ", "block.create.birch_window_pane": "ǝuɐԀ ʍopuıM ɥɔɹıᗺ", "block.create.black_nixie_tube": "ǝqn⟘ ǝıxıN ʞɔɐןᗺ", + "block.create.black_postbox": "xoqʇsoԀ ʞɔɐןᗺ", "block.create.black_sail": "ןıɐS ʞɔɐןᗺ", "block.create.black_seat": "ʇɐǝS ʞɔɐןᗺ", "block.create.black_toolbox": "xoqןoo⟘ ʞɔɐןᗺ", "block.create.black_valve_handle": "ǝןpuɐH ǝʌןɐΛ ʞɔɐןᗺ", "block.create.blaze_burner": "ɹǝuɹnᗺ ǝzɐןᗺ", "block.create.blue_nixie_tube": "ǝqn⟘ ǝıxıN ǝnןᗺ", + "block.create.blue_postbox": "xoqʇsoԀ ǝnןᗺ", "block.create.blue_sail": "ןıɐS ǝnןᗺ", "block.create.blue_seat": "ʇɐǝS ǝnןᗺ", "block.create.blue_toolbox": "xoqןoo⟘ ǝnןᗺ", @@ -232,6 +234,7 @@ "block.create.brass_scaffolding": "buıpןoɟɟɐɔS ssɐɹᗺ", "block.create.brass_tunnel": "ןǝuun⟘ ssɐɹᗺ", "block.create.brown_nixie_tube": "ǝqn⟘ ǝıxıN uʍoɹᗺ", + "block.create.brown_postbox": "xoqʇsoԀ uʍoɹᗺ", "block.create.brown_sail": "ןıɐS uʍoɹᗺ", "block.create.brown_seat": "ʇɐǝS uʍoɹᗺ", "block.create.brown_toolbox": "xoqןoo⟘ uʍoɹᗺ", @@ -409,6 +412,7 @@ "block.create.cut_veridium_stairs": "sɹıɐʇS ɯnıpıɹǝΛ ʇnƆ", "block.create.cut_veridium_wall": "ןןɐM ɯnıpıɹǝΛ ʇnƆ", "block.create.cyan_nixie_tube": "ǝqn⟘ ǝıxıN uɐʎƆ", + "block.create.cyan_postbox": "xoqʇsoԀ uɐʎƆ", "block.create.cyan_sail": "ןıɐS uɐʎƆ", "block.create.cyan_seat": "ʇɐǝS uɐʎƆ", "block.create.cyan_toolbox": "xoqןoo⟘ uɐʎƆ", @@ -454,11 +458,13 @@ "block.create.glass_fluid_pipe": "ǝdıԀ pınןℲ ssɐן⅁", "block.create.granite_pillar": "ɹɐןןıԀ ǝʇıuɐɹ⅁", "block.create.gray_nixie_tube": "ǝqn⟘ ǝıxıN ʎɐɹ⅁", + "block.create.gray_postbox": "xoqʇsoԀ ʎɐɹ⅁", "block.create.gray_sail": "ןıɐS ʎɐɹ⅁", "block.create.gray_seat": "ʇɐǝS ʎɐɹ⅁", "block.create.gray_toolbox": "xoqןoo⟘ ʎɐɹ⅁", "block.create.gray_valve_handle": "ǝןpuɐH ǝʌןɐΛ ʎɐɹ⅁", "block.create.green_nixie_tube": "ǝqn⟘ ǝıxıN uǝǝɹ⅁", + "block.create.green_postbox": "xoqʇsoԀ uǝǝɹ⅁", "block.create.green_sail": "ןıɐS uǝǝɹ⅁", "block.create.green_seat": "ʇɐǝS uǝǝɹ⅁", "block.create.green_toolbox": "xoqןoo⟘ uǝǝɹ⅁", @@ -497,16 +503,19 @@ "block.create.layered_veridium": "ɯnıpıɹǝΛ pǝɹǝʎɐꞀ", "block.create.lectern_controller": "ɹǝןןoɹʇuoƆ uɹǝʇɔǝꞀ", "block.create.light_blue_nixie_tube": "ǝqn⟘ ǝıxıN ǝnןᗺ ʇɥbıꞀ", + "block.create.light_blue_postbox": "xoqʇsoԀ ǝnןᗺ ʇɥbıꞀ", "block.create.light_blue_sail": "ןıɐS ǝnןᗺ ʇɥbıꞀ", "block.create.light_blue_seat": "ʇɐǝS ǝnןᗺ ʇɥbıꞀ", "block.create.light_blue_toolbox": "xoqןoo⟘ ǝnןᗺ ʇɥbıꞀ", "block.create.light_blue_valve_handle": "ǝןpuɐH ǝʌןɐΛ ǝnןᗺ ʇɥbıꞀ", "block.create.light_gray_nixie_tube": "ǝqn⟘ ǝıxıN ʎɐɹ⅁ ʇɥbıꞀ", + "block.create.light_gray_postbox": "xoqʇsoԀ ʎɐɹ⅁ ʇɥbıꞀ", "block.create.light_gray_sail": "ןıɐS ʎɐɹ⅁ ʇɥbıꞀ", "block.create.light_gray_seat": "ʇɐǝS ʎɐɹ⅁ ʇɥbıꞀ", "block.create.light_gray_toolbox": "xoqןoo⟘ ʎɐɹ⅁ ʇɥbıꞀ", "block.create.light_gray_valve_handle": "ǝןpuɐH ǝʌןɐΛ ʎɐɹ⅁ ʇɥbıꞀ", "block.create.lime_nixie_tube": "ǝqn⟘ ǝıxıN ǝɯıꞀ", + "block.create.lime_postbox": "xoqʇsoԀ ǝɯıꞀ", "block.create.lime_sail": "ןıɐS ǝɯıꞀ", "block.create.lime_seat": "ʇɐǝS ǝɯıꞀ", "block.create.lime_toolbox": "xoqןoo⟘ ǝɯıꞀ", @@ -516,6 +525,7 @@ "block.create.linear_chassis": "sıssɐɥƆ ɹɐǝuıꞀ", "block.create.lit_blaze_burner": "ɹǝuɹnᗺ ǝzɐןᗺ ʇıꞀ", "block.create.magenta_nixie_tube": "ǝqn⟘ ǝıxıN ɐʇuǝbɐW", + "block.create.magenta_postbox": "xoqʇsoԀ ɐʇuǝbɐW", "block.create.magenta_sail": "ןıɐS ɐʇuǝbɐW", "block.create.magenta_seat": "ʇɐǝS ɐʇuǝbɐW", "block.create.magenta_toolbox": "xoqןoo⟘ ɐʇuǝbɐW", @@ -550,6 +560,7 @@ "block.create.oak_window_pane": "ǝuɐԀ ʍopuıM ʞɐO", "block.create.ochrum": "ɯnɹɥɔO", "block.create.ochrum_pillar": "ɹɐןןıԀ ɯnɹɥɔO", + "block.create.orange_postbox": "xoqʇsoԀ ǝbuɐɹO", "block.create.orange_sail": "ןıɐS ǝbuɐɹO", "block.create.orange_seat": "ʇɐǝS ǝbuɐɹO", "block.create.orange_toolbox": "xoqןoo⟘ ǝbuɐɹO", @@ -568,6 +579,7 @@ "block.create.peculiar_bell": "ןןǝᗺ ɹɐıןnɔǝԀ", "block.create.peculiar_bell.tooltip.summary": "˙˙˙sʇɔǝɟɟǝ-ǝpıs ǝʌɐɥ ʎɐɯ ‾ǝɹıℲ ןnoS‾ uǝdo ǝʌoqɐ ʇɥbıɹ ʇı buıɔɐןԀ ˙‾ןןǝᗺ ssɐɹᗺ‾ ǝʌıʇɐɹoɔǝp Ɐ", "block.create.pink_nixie_tube": "ǝqn⟘ ǝıxıN ʞuıԀ", + "block.create.pink_postbox": "xoqʇsoԀ ʞuıԀ", "block.create.pink_sail": "ןıɐS ʞuıԀ", "block.create.pink_seat": "ʇɐǝS ʞuıԀ", "block.create.pink_toolbox": "xoqןoo⟘ ʞuıԀ", @@ -645,6 +657,7 @@ "block.create.pulse_repeater": "ɹǝʇɐǝdǝᴚ ǝsןnԀ", "block.create.pulse_timer": "ɹǝɯı⟘ ǝsןnԀ", "block.create.purple_nixie_tube": "ǝqn⟘ ǝıxıN ǝןdɹnԀ", + "block.create.purple_postbox": "xoqʇsoԀ ǝןdɹnԀ", "block.create.purple_sail": "ןıɐS ǝןdɹnԀ", "block.create.purple_seat": "ʇɐǝS ǝןdɹnԀ", "block.create.purple_toolbox": "xoqןoo⟘ ǝןdɹnԀ", @@ -653,6 +666,7 @@ "block.create.railway_casing": "buısɐƆ uıɐɹ⟘", "block.create.raw_zinc_block": "ɔuıZ ʍɐᴚ ɟo ʞɔoןᗺ", "block.create.red_nixie_tube": "ǝqn⟘ ǝıxıN pǝᴚ", + "block.create.red_postbox": "xoqʇsoԀ pǝᴚ", "block.create.red_sail": "ןıɐS pǝᴚ", "block.create.red_seat": "ʇɐǝS pǝᴚ", "block.create.red_toolbox": "xoqןoo⟘ pǝᴚ", @@ -817,6 +831,7 @@ "block.create.weathered_copper_tiles": "sǝןı⟘ ɹǝddoƆ pǝɹǝɥʇɐǝM", "block.create.weighted_ejector": "ɹoʇɔǝظƎ pǝʇɥbıǝM", "block.create.white_nixie_tube": "ǝqn⟘ ǝıxıN ǝʇıɥM", + "block.create.white_postbox": "xoqʇsoԀ ǝʇıɥM", "block.create.white_sail": "ןıɐS ןןıɯpuıM", "block.create.white_seat": "ʇɐǝS ǝʇıɥM", "block.create.white_toolbox": "xoqןoo⟘ ǝʇıɥM", @@ -825,6 +840,7 @@ "block.create.wooden_bracket": "ʇǝʞɔɐɹᗺ uǝpooM", "block.create.wooden_bracket.tooltip.summary": "˙ʇuǝɯǝɔɹoɟuıǝɹ ɟo ʇıq uǝpooʍ puɐ ʎzoɔ ɐ ɥʇıʍ ‾sǝdıԀ‾ puɐ ‾sןǝǝɥʍboƆ 'sʇɟɐɥS‾ ɹnoʎ ‾ǝʇɐɹoɔǝᗡ‾", "block.create.yellow_nixie_tube": "ǝqn⟘ ǝıxıN ʍoןןǝʎ", + "block.create.yellow_postbox": "xoqʇsoԀ ʍoןןǝʎ", "block.create.yellow_sail": "ןıɐS ʍoןןǝʎ", "block.create.yellow_seat": "ʇɐǝS ʍoןןǝʎ", "block.create.yellow_toolbox": "xoqןoo⟘ ʍoןןǝʎ", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 041cc43254..de161634dd 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -209,12 +209,14 @@ "block.create.birch_window": "Birch Window", "block.create.birch_window_pane": "Birch Window Pane", "block.create.black_nixie_tube": "Black Nixie Tube", + "block.create.black_postbox": "Black Postbox", "block.create.black_sail": "Black Sail", "block.create.black_seat": "Black Seat", "block.create.black_toolbox": "Black Toolbox", "block.create.black_valve_handle": "Black Valve Handle", "block.create.blaze_burner": "Blaze Burner", "block.create.blue_nixie_tube": "Blue Nixie Tube", + "block.create.blue_postbox": "Blue Postbox", "block.create.blue_sail": "Blue Sail", "block.create.blue_seat": "Blue Seat", "block.create.blue_toolbox": "Blue Toolbox", @@ -232,6 +234,7 @@ "block.create.brass_scaffolding": "Brass Scaffolding", "block.create.brass_tunnel": "Brass Tunnel", "block.create.brown_nixie_tube": "Brown Nixie Tube", + "block.create.brown_postbox": "Brown Postbox", "block.create.brown_sail": "Brown Sail", "block.create.brown_seat": "Brown Seat", "block.create.brown_toolbox": "Brown Toolbox", @@ -409,6 +412,7 @@ "block.create.cut_veridium_stairs": "Cut Veridium Stairs", "block.create.cut_veridium_wall": "Cut Veridium Wall", "block.create.cyan_nixie_tube": "Cyan Nixie Tube", + "block.create.cyan_postbox": "Cyan Postbox", "block.create.cyan_sail": "Cyan Sail", "block.create.cyan_seat": "Cyan Seat", "block.create.cyan_toolbox": "Cyan Toolbox", @@ -454,11 +458,13 @@ "block.create.glass_fluid_pipe": "Glass Fluid Pipe", "block.create.granite_pillar": "Granite Pillar", "block.create.gray_nixie_tube": "Gray Nixie Tube", + "block.create.gray_postbox": "Gray Postbox", "block.create.gray_sail": "Gray Sail", "block.create.gray_seat": "Gray Seat", "block.create.gray_toolbox": "Gray Toolbox", "block.create.gray_valve_handle": "Gray Valve Handle", "block.create.green_nixie_tube": "Green Nixie Tube", + "block.create.green_postbox": "Green Postbox", "block.create.green_sail": "Green Sail", "block.create.green_seat": "Green Seat", "block.create.green_toolbox": "Green Toolbox", @@ -497,16 +503,19 @@ "block.create.layered_veridium": "Layered Veridium", "block.create.lectern_controller": "Lectern Controller", "block.create.light_blue_nixie_tube": "Light Blue Nixie Tube", + "block.create.light_blue_postbox": "Light Blue Postbox", "block.create.light_blue_sail": "Light Blue Sail", "block.create.light_blue_seat": "Light Blue Seat", "block.create.light_blue_toolbox": "Light Blue Toolbox", "block.create.light_blue_valve_handle": "Light Blue Valve Handle", "block.create.light_gray_nixie_tube": "Light Gray Nixie Tube", + "block.create.light_gray_postbox": "Light Gray Postbox", "block.create.light_gray_sail": "Light Gray Sail", "block.create.light_gray_seat": "Light Gray Seat", "block.create.light_gray_toolbox": "Light Gray Toolbox", "block.create.light_gray_valve_handle": "Light Gray Valve Handle", "block.create.lime_nixie_tube": "Lime Nixie Tube", + "block.create.lime_postbox": "Lime Postbox", "block.create.lime_sail": "Lime Sail", "block.create.lime_seat": "Lime Seat", "block.create.lime_toolbox": "Lime Toolbox", @@ -516,6 +525,7 @@ "block.create.linear_chassis": "Linear Chassis", "block.create.lit_blaze_burner": "Lit Blaze Burner", "block.create.magenta_nixie_tube": "Magenta Nixie Tube", + "block.create.magenta_postbox": "Magenta Postbox", "block.create.magenta_sail": "Magenta Sail", "block.create.magenta_seat": "Magenta Seat", "block.create.magenta_toolbox": "Magenta Toolbox", @@ -550,6 +560,7 @@ "block.create.oak_window_pane": "Oak Window Pane", "block.create.ochrum": "Ochrum", "block.create.ochrum_pillar": "Ochrum Pillar", + "block.create.orange_postbox": "Orange Postbox", "block.create.orange_sail": "Orange Sail", "block.create.orange_seat": "Orange Seat", "block.create.orange_toolbox": "Orange Toolbox", @@ -568,6 +579,7 @@ "block.create.peculiar_bell": "Peculiar Bell", "block.create.peculiar_bell.tooltip.summary": "A decorative _Brass Bell_. Placing it right above open _Soul Fire_ may have side-effects...", "block.create.pink_nixie_tube": "Pink Nixie Tube", + "block.create.pink_postbox": "Pink Postbox", "block.create.pink_sail": "Pink Sail", "block.create.pink_seat": "Pink Seat", "block.create.pink_toolbox": "Pink Toolbox", @@ -645,6 +657,7 @@ "block.create.pulse_repeater": "Pulse Repeater", "block.create.pulse_timer": "Pulse Timer", "block.create.purple_nixie_tube": "Purple Nixie Tube", + "block.create.purple_postbox": "Purple Postbox", "block.create.purple_sail": "Purple Sail", "block.create.purple_seat": "Purple Seat", "block.create.purple_toolbox": "Purple Toolbox", @@ -653,6 +666,7 @@ "block.create.railway_casing": "Train Casing", "block.create.raw_zinc_block": "Block of Raw Zinc", "block.create.red_nixie_tube": "Red Nixie Tube", + "block.create.red_postbox": "Red Postbox", "block.create.red_sail": "Red Sail", "block.create.red_seat": "Red Seat", "block.create.red_toolbox": "Red Toolbox", @@ -817,6 +831,7 @@ "block.create.weathered_copper_tiles": "Weathered Copper Tiles", "block.create.weighted_ejector": "Weighted Ejector", "block.create.white_nixie_tube": "White Nixie Tube", + "block.create.white_postbox": "White Postbox", "block.create.white_sail": "Windmill Sail", "block.create.white_seat": "White Seat", "block.create.white_toolbox": "White Toolbox", @@ -825,6 +840,7 @@ "block.create.wooden_bracket": "Wooden Bracket", "block.create.wooden_bracket.tooltip.summary": "_Decorate_ your _Shafts, Cogwheels_ and _Pipes_ with a cozy and wooden bit of reinforcement.", "block.create.yellow_nixie_tube": "Yellow Nixie Tube", + "block.create.yellow_postbox": "Yellow Postbox", "block.create.yellow_sail": "Yellow Sail", "block.create.yellow_seat": "Yellow Seat", "block.create.yellow_toolbox": "Yellow Toolbox", diff --git a/src/generated/resources/assets/create/models/block/black_postbox.json b/src/generated/resources/assets/create/models/block/black_postbox.json new file mode 100644 index 0000000000..8d60726287 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/black_postbox.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/package_postbox/block_closed", + "textures": { + "0": "create:block/post_box/post_box_black", + "1": "create:block/post_box/post_box_black_closed" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/blue_postbox.json b/src/generated/resources/assets/create/models/block/blue_postbox.json new file mode 100644 index 0000000000..42cb79fd27 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/blue_postbox.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/package_postbox/block_closed", + "textures": { + "0": "create:block/post_box/post_box_blue", + "1": "create:block/post_box/post_box_blue_closed" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brown_postbox.json b/src/generated/resources/assets/create/models/block/brown_postbox.json new file mode 100644 index 0000000000..80e719bf55 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/brown_postbox.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/package_postbox/block_closed", + "textures": { + "0": "create:block/post_box/post_box_brown", + "1": "create:block/post_box/post_box_brown_closed" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/cyan_postbox.json b/src/generated/resources/assets/create/models/block/cyan_postbox.json new file mode 100644 index 0000000000..7fce29c937 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/cyan_postbox.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/package_postbox/block_closed", + "textures": { + "0": "create:block/post_box/post_box_cyan", + "1": "create:block/post_box/post_box_cyan_closed" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/gray_postbox.json b/src/generated/resources/assets/create/models/block/gray_postbox.json new file mode 100644 index 0000000000..de82bfa465 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/gray_postbox.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/package_postbox/block_closed", + "textures": { + "0": "create:block/post_box/post_box_gray", + "1": "create:block/post_box/post_box_gray_closed" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/green_postbox.json b/src/generated/resources/assets/create/models/block/green_postbox.json new file mode 100644 index 0000000000..094485db4c --- /dev/null +++ b/src/generated/resources/assets/create/models/block/green_postbox.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/package_postbox/block_closed", + "textures": { + "0": "create:block/post_box/post_box_green", + "1": "create:block/post_box/post_box_green_closed" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/light_blue_postbox.json b/src/generated/resources/assets/create/models/block/light_blue_postbox.json new file mode 100644 index 0000000000..8ac6c675a7 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/light_blue_postbox.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/package_postbox/block_closed", + "textures": { + "0": "create:block/post_box/post_box_light_blue", + "1": "create:block/post_box/post_box_light_blue_closed" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/light_gray_postbox.json b/src/generated/resources/assets/create/models/block/light_gray_postbox.json new file mode 100644 index 0000000000..b697cfa73b --- /dev/null +++ b/src/generated/resources/assets/create/models/block/light_gray_postbox.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/package_postbox/block_closed", + "textures": { + "0": "create:block/post_box/post_box_light_gray", + "1": "create:block/post_box/post_box_light_gray_closed" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/lime_postbox.json b/src/generated/resources/assets/create/models/block/lime_postbox.json new file mode 100644 index 0000000000..f40476f584 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/lime_postbox.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/package_postbox/block_closed", + "textures": { + "0": "create:block/post_box/post_box_lime", + "1": "create:block/post_box/post_box_lime_closed" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/magenta_postbox.json b/src/generated/resources/assets/create/models/block/magenta_postbox.json new file mode 100644 index 0000000000..3c52aaf863 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/magenta_postbox.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/package_postbox/block_closed", + "textures": { + "0": "create:block/post_box/post_box_magenta", + "1": "create:block/post_box/post_box_magenta_closed" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/orange_postbox.json b/src/generated/resources/assets/create/models/block/orange_postbox.json new file mode 100644 index 0000000000..4af3a5f369 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/orange_postbox.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/package_postbox/block_closed", + "textures": { + "0": "create:block/post_box/post_box_orange", + "1": "create:block/post_box/post_box_orange_closed" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/pink_postbox.json b/src/generated/resources/assets/create/models/block/pink_postbox.json new file mode 100644 index 0000000000..e3f09b3486 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/pink_postbox.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/package_postbox/block_closed", + "textures": { + "0": "create:block/post_box/post_box_pink", + "1": "create:block/post_box/post_box_pink_closed" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/purple_postbox.json b/src/generated/resources/assets/create/models/block/purple_postbox.json new file mode 100644 index 0000000000..b874575e1a --- /dev/null +++ b/src/generated/resources/assets/create/models/block/purple_postbox.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/package_postbox/block_closed", + "textures": { + "0": "create:block/post_box/post_box_purple", + "1": "create:block/post_box/post_box_purple_closed" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/red_postbox.json b/src/generated/resources/assets/create/models/block/red_postbox.json new file mode 100644 index 0000000000..fa815e3145 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/red_postbox.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/package_postbox/block_closed", + "textures": { + "0": "create:block/post_box/post_box_red", + "1": "create:block/post_box/post_box_red_closed" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/white_postbox.json b/src/generated/resources/assets/create/models/block/white_postbox.json new file mode 100644 index 0000000000..b1ff4edbc3 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/white_postbox.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/package_postbox/block_closed", + "textures": { + "0": "create:block/post_box/post_box_white", + "1": "create:block/post_box/post_box_white_closed" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/yellow_postbox.json b/src/generated/resources/assets/create/models/block/yellow_postbox.json new file mode 100644 index 0000000000..53080575c5 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/yellow_postbox.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/package_postbox/block_closed", + "textures": { + "0": "create:block/post_box/post_box_yellow", + "1": "create:block/post_box/post_box_yellow_closed" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/black_postbox.json b/src/generated/resources/assets/create/models/item/black_postbox.json new file mode 100644 index 0000000000..ac76bee8fb --- /dev/null +++ b/src/generated/resources/assets/create/models/item/black_postbox.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/package_postbox/item", + "textures": { + "0": "create:block/post_box/post_box_black", + "1": "create:block/post_box/post_box_black_closed" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/blue_postbox.json b/src/generated/resources/assets/create/models/item/blue_postbox.json new file mode 100644 index 0000000000..4ddfa86bc0 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/blue_postbox.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/package_postbox/item", + "textures": { + "0": "create:block/post_box/post_box_blue", + "1": "create:block/post_box/post_box_blue_closed" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/brown_postbox.json b/src/generated/resources/assets/create/models/item/brown_postbox.json new file mode 100644 index 0000000000..aa5c8fc6c6 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/brown_postbox.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/package_postbox/item", + "textures": { + "0": "create:block/post_box/post_box_brown", + "1": "create:block/post_box/post_box_brown_closed" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cyan_postbox.json b/src/generated/resources/assets/create/models/item/cyan_postbox.json new file mode 100644 index 0000000000..0e73d013f1 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cyan_postbox.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/package_postbox/item", + "textures": { + "0": "create:block/post_box/post_box_cyan", + "1": "create:block/post_box/post_box_cyan_closed" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/gray_postbox.json b/src/generated/resources/assets/create/models/item/gray_postbox.json new file mode 100644 index 0000000000..90e72e86d8 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/gray_postbox.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/package_postbox/item", + "textures": { + "0": "create:block/post_box/post_box_gray", + "1": "create:block/post_box/post_box_gray_closed" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/green_postbox.json b/src/generated/resources/assets/create/models/item/green_postbox.json new file mode 100644 index 0000000000..39f53f41be --- /dev/null +++ b/src/generated/resources/assets/create/models/item/green_postbox.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/package_postbox/item", + "textures": { + "0": "create:block/post_box/post_box_green", + "1": "create:block/post_box/post_box_green_closed" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/light_blue_postbox.json b/src/generated/resources/assets/create/models/item/light_blue_postbox.json new file mode 100644 index 0000000000..c4556c8247 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/light_blue_postbox.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/package_postbox/item", + "textures": { + "0": "create:block/post_box/post_box_light_blue", + "1": "create:block/post_box/post_box_light_blue_closed" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/light_gray_postbox.json b/src/generated/resources/assets/create/models/item/light_gray_postbox.json new file mode 100644 index 0000000000..3620b008fd --- /dev/null +++ b/src/generated/resources/assets/create/models/item/light_gray_postbox.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/package_postbox/item", + "textures": { + "0": "create:block/post_box/post_box_light_gray", + "1": "create:block/post_box/post_box_light_gray_closed" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/lime_postbox.json b/src/generated/resources/assets/create/models/item/lime_postbox.json new file mode 100644 index 0000000000..c4eb51bd53 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/lime_postbox.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/package_postbox/item", + "textures": { + "0": "create:block/post_box/post_box_lime", + "1": "create:block/post_box/post_box_lime_closed" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/magenta_postbox.json b/src/generated/resources/assets/create/models/item/magenta_postbox.json new file mode 100644 index 0000000000..b7f6f1288e --- /dev/null +++ b/src/generated/resources/assets/create/models/item/magenta_postbox.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/package_postbox/item", + "textures": { + "0": "create:block/post_box/post_box_magenta", + "1": "create:block/post_box/post_box_magenta_closed" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/orange_postbox.json b/src/generated/resources/assets/create/models/item/orange_postbox.json new file mode 100644 index 0000000000..3dcf782a1e --- /dev/null +++ b/src/generated/resources/assets/create/models/item/orange_postbox.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/package_postbox/item", + "textures": { + "0": "create:block/post_box/post_box_orange", + "1": "create:block/post_box/post_box_orange_closed" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/pink_postbox.json b/src/generated/resources/assets/create/models/item/pink_postbox.json new file mode 100644 index 0000000000..3c1d74edc8 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/pink_postbox.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/package_postbox/item", + "textures": { + "0": "create:block/post_box/post_box_pink", + "1": "create:block/post_box/post_box_pink_closed" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/purple_postbox.json b/src/generated/resources/assets/create/models/item/purple_postbox.json new file mode 100644 index 0000000000..0d99cca218 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/purple_postbox.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/package_postbox/item", + "textures": { + "0": "create:block/post_box/post_box_purple", + "1": "create:block/post_box/post_box_purple_closed" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/red_postbox.json b/src/generated/resources/assets/create/models/item/red_postbox.json new file mode 100644 index 0000000000..8806a65a81 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/red_postbox.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/package_postbox/item", + "textures": { + "0": "create:block/post_box/post_box_red", + "1": "create:block/post_box/post_box_red_closed" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/white_postbox.json b/src/generated/resources/assets/create/models/item/white_postbox.json new file mode 100644 index 0000000000..a57e176769 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/white_postbox.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/package_postbox/item", + "textures": { + "0": "create:block/post_box/post_box_white", + "1": "create:block/post_box/post_box_white_closed" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/yellow_postbox.json b/src/generated/resources/assets/create/models/item/yellow_postbox.json new file mode 100644 index 0000000000..8dc9e1471d --- /dev/null +++ b/src/generated/resources/assets/create/models/item/yellow_postbox.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/package_postbox/item", + "textures": { + "0": "create:block/post_box/post_box_yellow", + "1": "create:block/post_box/post_box_yellow_closed" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/black_postbox.json b/src/generated/resources/data/create/loot_tables/blocks/black_postbox.json new file mode 100644 index 0000000000..6392812530 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/black_postbox.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:black_postbox" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/black_postbox" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/blue_postbox.json b/src/generated/resources/data/create/loot_tables/blocks/blue_postbox.json new file mode 100644 index 0000000000..14e3805b2a --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/blue_postbox.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:blue_postbox" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/blue_postbox" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/brown_postbox.json b/src/generated/resources/data/create/loot_tables/blocks/brown_postbox.json new file mode 100644 index 0000000000..547a1f196d --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/brown_postbox.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:brown_postbox" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/brown_postbox" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/cyan_postbox.json b/src/generated/resources/data/create/loot_tables/blocks/cyan_postbox.json new file mode 100644 index 0000000000..5c7be1045d --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/cyan_postbox.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:cyan_postbox" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/cyan_postbox" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/gray_postbox.json b/src/generated/resources/data/create/loot_tables/blocks/gray_postbox.json new file mode 100644 index 0000000000..e262d34059 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/gray_postbox.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:gray_postbox" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/gray_postbox" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/green_postbox.json b/src/generated/resources/data/create/loot_tables/blocks/green_postbox.json new file mode 100644 index 0000000000..e3dca64f6e --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/green_postbox.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:green_postbox" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/green_postbox" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/light_blue_postbox.json b/src/generated/resources/data/create/loot_tables/blocks/light_blue_postbox.json new file mode 100644 index 0000000000..5ce4a4eef2 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/light_blue_postbox.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:light_blue_postbox" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/light_blue_postbox" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/light_gray_postbox.json b/src/generated/resources/data/create/loot_tables/blocks/light_gray_postbox.json new file mode 100644 index 0000000000..4efb6e6035 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/light_gray_postbox.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:light_gray_postbox" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/light_gray_postbox" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/lime_postbox.json b/src/generated/resources/data/create/loot_tables/blocks/lime_postbox.json new file mode 100644 index 0000000000..578daeea8e --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/lime_postbox.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:lime_postbox" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/lime_postbox" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/magenta_postbox.json b/src/generated/resources/data/create/loot_tables/blocks/magenta_postbox.json new file mode 100644 index 0000000000..76e817a3b4 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/magenta_postbox.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:magenta_postbox" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/magenta_postbox" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/orange_postbox.json b/src/generated/resources/data/create/loot_tables/blocks/orange_postbox.json new file mode 100644 index 0000000000..92a50f2d7c --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/orange_postbox.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:orange_postbox" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/orange_postbox" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/pink_postbox.json b/src/generated/resources/data/create/loot_tables/blocks/pink_postbox.json new file mode 100644 index 0000000000..2fa4ee3783 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/pink_postbox.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:pink_postbox" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/pink_postbox" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/purple_postbox.json b/src/generated/resources/data/create/loot_tables/blocks/purple_postbox.json new file mode 100644 index 0000000000..373fd05424 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/purple_postbox.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:purple_postbox" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/purple_postbox" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/red_postbox.json b/src/generated/resources/data/create/loot_tables/blocks/red_postbox.json new file mode 100644 index 0000000000..30008f94ea --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/red_postbox.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:red_postbox" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/red_postbox" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/white_postbox.json b/src/generated/resources/data/create/loot_tables/blocks/white_postbox.json new file mode 100644 index 0000000000..f5f6f92553 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/white_postbox.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:white_postbox" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/white_postbox" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/yellow_postbox.json b/src/generated/resources/data/create/loot_tables/blocks/yellow_postbox.json new file mode 100644 index 0000000000..ffcf660c29 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/yellow_postbox.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:yellow_postbox" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/yellow_postbox" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/tags/blocks/postboxes.json b/src/generated/resources/data/create/tags/blocks/postboxes.json new file mode 100644 index 0000000000..c5c54b8fbc --- /dev/null +++ b/src/generated/resources/data/create/tags/blocks/postboxes.json @@ -0,0 +1,20 @@ +{ + "values": [ + "create:white_postbox", + "create:orange_postbox", + "create:magenta_postbox", + "create:light_blue_postbox", + "create:yellow_postbox", + "create:lime_postbox", + "create:pink_postbox", + "create:gray_postbox", + "create:light_gray_postbox", + "create:cyan_postbox", + "create:purple_postbox", + "create:blue_postbox", + "create:brown_postbox", + "create:green_postbox", + "create:red_postbox", + "create:black_postbox" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/tags/items/postboxes.json b/src/generated/resources/data/create/tags/items/postboxes.json new file mode 100644 index 0000000000..c5c54b8fbc --- /dev/null +++ b/src/generated/resources/data/create/tags/items/postboxes.json @@ -0,0 +1,20 @@ +{ + "values": [ + "create:white_postbox", + "create:orange_postbox", + "create:magenta_postbox", + "create:light_blue_postbox", + "create:yellow_postbox", + "create:lime_postbox", + "create:pink_postbox", + "create:gray_postbox", + "create:light_gray_postbox", + "create:cyan_postbox", + "create:purple_postbox", + "create:blue_postbox", + "create:brown_postbox", + "create:green_postbox", + "create:red_postbox", + "create:black_postbox" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json b/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json index fac1ed1d05..526f980687 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json @@ -87,6 +87,22 @@ "create:rotation_speed_controller", "create:mechanical_arm", "create:railway_casing", + "create:white_postbox", + "create:orange_postbox", + "create:magenta_postbox", + "create:light_blue_postbox", + "create:yellow_postbox", + "create:lime_postbox", + "create:pink_postbox", + "create:gray_postbox", + "create:light_gray_postbox", + "create:cyan_postbox", + "create:purple_postbox", + "create:blue_postbox", + "create:brown_postbox", + "create:green_postbox", + "create:red_postbox", + "create:black_postbox", "create:stock_ticker", "create:redstone_requester", "create:content_observer", diff --git a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java index 7079549702..fe6cfa4603 100644 --- a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java +++ b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java @@ -166,13 +166,15 @@ import com.simibubi.create.content.logistics.depot.DepotRenderer; import com.simibubi.create.content.logistics.depot.EjectorBlockEntity; import com.simibubi.create.content.logistics.depot.EjectorRenderer; import com.simibubi.create.content.logistics.depot.EjectorVisual; -import com.simibubi.create.content.logistics.frogport.FrogportBlockEntity; -import com.simibubi.create.content.logistics.frogport.FrogportRenderer; -import com.simibubi.create.content.logistics.frogport.FrogportVisual; import com.simibubi.create.content.logistics.funnel.FunnelBlockEntity; import com.simibubi.create.content.logistics.funnel.FunnelRenderer; import com.simibubi.create.content.logistics.funnel.FunnelVisual; import com.simibubi.create.content.logistics.itemHatch.ItemHatchBlockEntity; +import com.simibubi.create.content.logistics.packagePort.frogport.FrogportBlockEntity; +import com.simibubi.create.content.logistics.packagePort.frogport.FrogportRenderer; +import com.simibubi.create.content.logistics.packagePort.frogport.FrogportVisual; +import com.simibubi.create.content.logistics.packagePort.postbox.PostboxBlockEntity; +import com.simibubi.create.content.logistics.packagePort.postbox.PostboxRenderer; import com.simibubi.create.content.logistics.packager.PackagerBlockEntity; import com.simibubi.create.content.logistics.packager.PackagerRenderer; import com.simibubi.create.content.logistics.packagerLink.PackagerLinkBlockEntity; @@ -502,6 +504,12 @@ public class AllBlockEntityTypes { .validBlocks(AllBlocks.PACKAGE_FROGPORT) .renderer(() -> FrogportRenderer::new) .register(); + + public static final BlockEntityEntry PACKAGE_POSTBOX = REGISTRATE + .blockEntity("package_postbox", PostboxBlockEntity::new) + .validBlocks(AllBlocks.PACKAGE_POSTBOXES.toArray()) + .renderer(() -> PostboxRenderer::new) + .register(); public static final BlockEntityEntry PACKAGER_LINK = REGISTRATE .blockEntity("packager_link", PackagerLinkBlockEntity::new) diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 12363256a5..9488a8934c 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -166,8 +166,6 @@ import com.simibubi.create.content.logistics.crate.CreativeCrateBlock; import com.simibubi.create.content.logistics.depot.DepotBlock; import com.simibubi.create.content.logistics.depot.EjectorBlock; import com.simibubi.create.content.logistics.depot.EjectorItem; -import com.simibubi.create.content.logistics.frogport.FrogportBlock; -import com.simibubi.create.content.logistics.frogport.FrogportItem; import com.simibubi.create.content.logistics.funnel.AndesiteFunnelBlock; import com.simibubi.create.content.logistics.funnel.BeltFunnelBlock; import com.simibubi.create.content.logistics.funnel.BeltFunnelGenerator; @@ -176,6 +174,9 @@ import com.simibubi.create.content.logistics.funnel.FunnelGenerator; import com.simibubi.create.content.logistics.funnel.FunnelItem; import com.simibubi.create.content.logistics.funnel.FunnelMovementBehaviour; import com.simibubi.create.content.logistics.itemHatch.ItemHatchBlock; +import com.simibubi.create.content.logistics.packagePort.PackagePortItem; +import com.simibubi.create.content.logistics.packagePort.frogport.FrogportBlock; +import com.simibubi.create.content.logistics.packagePort.postbox.PostboxBlock; import com.simibubi.create.content.logistics.packager.PackagerBlock; import com.simibubi.create.content.logistics.packager.PackagerGenerator; import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedBlockItem; @@ -1746,10 +1747,34 @@ public class AllBlocks { .transform(pickaxeOnly()) .addLayer(() -> RenderType::cutoutMipped) .blockstate((c, p) -> p.simpleBlock(c.getEntry(), AssetLookup.partialBaseModel(c, p))) - .item(FrogportItem::new) + .item(PackagePortItem::new) .model(AssetLookup::customItemModel) .build() .register(); + + public static final DyedBlockList PACKAGE_POSTBOXES = new DyedBlockList<>(colour -> { + String colourName = colour.getSerializedName(); + return REGISTRATE.block(colourName + "_postbox", p -> new PostboxBlock(p, colour)) + .initialProperties(SharedProperties::wooden) + .properties(p -> p.mapColor(colour)) + .transform(axeOnly()) + .blockstate((c, p) -> { + p.horizontalBlock(c.get(), s -> p.models() + .withExistingParent(colourName + "_postbox", + p.modLoc("block/package_postbox/block_" + (s.getValue(PostboxBlock.OPEN) ? "open" : "closed"))) + .texture("0", p.modLoc("block/post_box/post_box_" + colourName)) + .texture("1", p.modLoc("block/post_box/post_box_" + colourName + + (s.getValue(PostboxBlock.OPEN) ? "_open" : "_closed")))); + }) + .tag(AllBlockTags.POSTBOXES.tag) + .item(PackagePortItem::new) + .model((c, p) -> p.withExistingParent(colourName + "_postbox", p.modLoc("block/package_postbox/item")) + .texture("0", p.modLoc("block/post_box/post_box_" + colourName)) + .texture("1", p.modLoc("block/post_box/post_box_" + colourName + "_closed"))) + .tag(AllItemTags.POSTBOXES.tag) + .build() + .register(); + }); public static final BlockEntry PACKAGER_LINK = REGISTRATE.block("packager_link", PackagerLinkBlock::new) diff --git a/src/main/java/com/simibubi/create/AllCreativeModeTabs.java b/src/main/java/com/simibubi/create/AllCreativeModeTabs.java index 7298a43099..00f375b472 100644 --- a/src/main/java/com/simibubi/create/AllCreativeModeTabs.java +++ b/src/main/java/com/simibubi/create/AllCreativeModeTabs.java @@ -14,6 +14,7 @@ import com.simibubi.create.content.decoration.palettes.AllPaletteBlocks; import com.simibubi.create.content.equipment.armor.BacktankUtil; import com.simibubi.create.content.equipment.toolbox.ToolboxBlock; import com.simibubi.create.content.kinetics.crank.ValveHandleBlock; +import com.simibubi.create.content.logistics.packagePort.postbox.PostboxBlock; import com.simibubi.create.foundation.data.CreateRegistrate; import com.simibubi.create.foundation.item.TagDependentIngredientItem; import com.tterrag.registrate.util.entry.BlockEntry; @@ -238,6 +239,13 @@ public class AllCreativeModeTabs { visibilities.put(entry.asItem(), TabVisibility.SEARCH_TAB_ONLY); } } + + for (BlockEntry entry : AllBlocks.PACKAGE_POSTBOXES) { + PostboxBlock block = entry.get(); + if (block.getColor() != DyeColor.WHITE) { + visibilities.put(entry.asItem(), TabVisibility.SEARCH_TAB_ONLY); + } + } for (BlockEntry entry : AllBlocks.TOOLBOXES) { ToolboxBlock block = entry.get(); diff --git a/src/main/java/com/simibubi/create/AllMenuTypes.java b/src/main/java/com/simibubi/create/AllMenuTypes.java index c6bf288a02..a1e689c306 100644 --- a/src/main/java/com/simibubi/create/AllMenuTypes.java +++ b/src/main/java/com/simibubi/create/AllMenuTypes.java @@ -10,6 +10,8 @@ import com.simibubi.create.content.logistics.filter.FilterMenu; import com.simibubi.create.content.logistics.filter.FilterScreen; import com.simibubi.create.content.logistics.filter.PackageFilterMenu; import com.simibubi.create.content.logistics.filter.PackageFilterScreen; +import com.simibubi.create.content.logistics.packagePort.PackagePortMenu; +import com.simibubi.create.content.logistics.packagePort.PackagePortScreen; import com.simibubi.create.content.redstone.link.controller.LinkedControllerMenu; import com.simibubi.create.content.redstone.link.controller.LinkedControllerScreen; import com.simibubi.create.content.schematics.cannon.SchematicannonMenu; @@ -55,6 +57,9 @@ public class AllMenuTypes { public static final MenuEntry SCHEDULE = register("schedule", ScheduleMenu::new, () -> ScheduleScreen::new); + + public static final MenuEntry PACKAGE_PORT = + register("package_port", PackagePortMenu::new, () -> PackagePortScreen::new); private static > MenuEntry register( String name, ForgeMenuFactory factory, NonNullSupplier> screenFactory) { diff --git a/src/main/java/com/simibubi/create/AllPackets.java b/src/main/java/com/simibubi/create/AllPackets.java index 00b35d107f..5a03ba2832 100644 --- a/src/main/java/com/simibubi/create/AllPackets.java +++ b/src/main/java/com/simibubi/create/AllPackets.java @@ -58,9 +58,9 @@ import com.simibubi.create.content.logistics.depot.EjectorElytraPacket; import com.simibubi.create.content.logistics.depot.EjectorPlacementPacket; import com.simibubi.create.content.logistics.depot.EjectorTriggerPacket; import com.simibubi.create.content.logistics.filter.FilterScreenPacket; -import com.simibubi.create.content.logistics.frogport.FrogportConfigurationPacket; -import com.simibubi.create.content.logistics.frogport.FrogportPlacementPacket; import com.simibubi.create.content.logistics.funnel.FunnelFlapPacket; +import com.simibubi.create.content.logistics.packagePort.PackagePortConfigurationPacket; +import com.simibubi.create.content.logistics.packagePort.PackagePortPlacementPacket; import com.simibubi.create.content.logistics.stockTicker.LogisticalStockRequestPacket; import com.simibubi.create.content.logistics.stockTicker.LogisticalStockResponsePacket; import com.simibubi.create.content.logistics.stockTicker.PackageOrderRequestPacket; @@ -131,7 +131,7 @@ public enum AllPackets { CONTRAPTION_INTERACT(ContraptionInteractionPacket.class, ContraptionInteractionPacket::new, PLAY_TO_SERVER), CLIENT_MOTION(ClientMotionPacket.class, ClientMotionPacket::new, PLAY_TO_SERVER), PLACE_ARM(ArmPlacementPacket.class, ArmPlacementPacket::new, PLAY_TO_SERVER), - PLACE_PACKAGE_PORT(FrogportPlacementPacket.class, FrogportPlacementPacket::new, PLAY_TO_SERVER), + PLACE_PACKAGE_PORT(PackagePortPlacementPacket.class, PackagePortPlacementPacket::new, PLAY_TO_SERVER), MINECART_COUPLING_CREATION(CouplingCreationPacket.class, CouplingCreationPacket::new, PLAY_TO_SERVER), INSTANT_SCHEMATIC(InstantSchematicPacket.class, InstantSchematicPacket::new, PLAY_TO_SERVER), SYNC_SCHEMATIC(SchematicSyncPacket.class, SchematicSyncPacket::new, PLAY_TO_SERVER), @@ -183,7 +183,7 @@ public enum AllPackets { CHAIN_CONVEYOR_RIDING(ChainConveyorRidingPacket.class, ChainConveyorRidingPacket::new, PLAY_TO_SERVER), CHAIN_PACKAGE_INTERACTION(ChainPackageInteractionPacket.class, ChainPackageInteractionPacket::new, PLAY_TO_SERVER), STOCK_TICKER_CONFIGURATION(StockTickerConfigurationPacket.class, StockTickerConfigurationPacket::new, PLAY_TO_SERVER), - PACKAGE_PORT_CONFIGURATION(FrogportConfigurationPacket.class, FrogportConfigurationPacket::new, PLAY_TO_SERVER), + PACKAGE_PORT_CONFIGURATION(PackagePortConfigurationPacket.class, PackagePortConfigurationPacket::new, PLAY_TO_SERVER), // Server to Client SYMMETRY_EFFECT(SymmetryEffectPacket.class, SymmetryEffectPacket::new, PLAY_TO_CLIENT), @@ -223,7 +223,7 @@ public enum AllPackets { PLAY_TO_CLIENT), S_PLACE_ARM(EjectorPlacementPacket.ClientBoundRequest.class, EjectorPlacementPacket.ClientBoundRequest::new, PLAY_TO_CLIENT), - S_PLACE_PACKAGE_PORT(FrogportPlacementPacket.ClientBoundRequest.class, FrogportPlacementPacket.ClientBoundRequest::new, + S_PLACE_PACKAGE_PORT(PackagePortPlacementPacket.ClientBoundRequest.class, PackagePortPlacementPacket.ClientBoundRequest::new, PLAY_TO_CLIENT), UPDATE_ELEVATOR_FLOORS(ElevatorFloorListPacket.class, ElevatorFloorListPacket::new, PLAY_TO_CLIENT), CONTRAPTION_ACTOR_TOGGLE(ContraptionDisableActorPacket.class, ContraptionDisableActorPacket::new, PLAY_TO_CLIENT), diff --git a/src/main/java/com/simibubi/create/AllPartialModels.java b/src/main/java/com/simibubi/create/AllPartialModels.java index 5181d0ca0a..0f4c748a9d 100644 --- a/src/main/java/com/simibubi/create/AllPartialModels.java +++ b/src/main/java/com/simibubi/create/AllPartialModels.java @@ -118,6 +118,7 @@ public class AllPartialModels { FROGPORT_BODY = block("package_frogport/body"), FROGPORT_HEAD = block("package_frogport/head"), FROGPORT_TONGUE = block("package_frogport/tongue"), + POSTBOX_FLAG = block("package_postbox/flag"), PACKAGER_TRAY_REGULAR = block("packager/tray_regular"), PACKAGER_TRAY_DEFRAG = block("packager/tray_defrag"), PACKAGER_HATCH_OPEN = block("packager/hatch_open"), PACKAGER_HATCH_CLOSED = block("packager/hatch_closed"), diff --git a/src/main/java/com/simibubi/create/AllShapes.java b/src/main/java/com/simibubi/create/AllShapes.java index e75a0a3215..689d3ba2ec 100644 --- a/src/main/java/com/simibubi/create/AllShapes.java +++ b/src/main/java/com/simibubi/create/AllShapes.java @@ -180,7 +180,9 @@ public class AllShapes { ITEM_HATCH = shape(1, 0, 0, 15, 16, 2).add(2, 2, 0, 14, 13, 3.8) .add(2, 4, 0, 14, 11, 5.8) .add(2, 6, 0, 14, 9, 7.8) - .forHorizontal(SOUTH) + .forHorizontal(SOUTH), + + POSTBOX = shape(2, 0, 0, 14, 14, 16).forHorizontal(SOUTH); ; diff --git a/src/main/java/com/simibubi/create/AllTags.java b/src/main/java/com/simibubi/create/AllTags.java index 067dc003ad..2e8eef1fdb 100644 --- a/src/main/java/com/simibubi/create/AllTags.java +++ b/src/main/java/com/simibubi/create/AllTags.java @@ -96,6 +96,7 @@ public class AllTags { PASSIVE_BOILER_HEATERS, SAFE_NBT, SEATS, + POSTBOXES, TOOLBOXES, TRACKS, TREE_ATTACHMENTS, @@ -175,6 +176,7 @@ public class AllTags { PRESSURIZED_AIR_SOURCES, SANDPAPER, SEATS, + POSTBOXES, SLEEPERS, TOOLBOXES, TRACKS, diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java index acf353c483..472a066508 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java @@ -19,7 +19,7 @@ import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorShape.Cha import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorShape.ChainConveyorOBB; import com.simibubi.create.content.logistics.box.PackageEntity; import com.simibubi.create.content.logistics.box.PackageItem; -import com.simibubi.create.content.logistics.frogport.FrogportBlockEntity; +import com.simibubi.create.content.logistics.packagePort.frogport.FrogportBlockEntity; import com.simibubi.create.foundation.utility.ServerSpeedProvider; import com.simibubi.create.infrastructure.config.AllConfigs; @@ -112,7 +112,7 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity { public boolean addToTooltip(List tooltip, boolean isPlayerSneaking) { return super.addToTooltip(tooltip, isPlayerSneaking); -// // debug routing info + // debug routing info // tooltip.addAll(routingTable.createSummary()); // if (!loopPorts.isEmpty()) // tooltip.add(Components.literal(loopPorts.size() + " Loop ports")); @@ -317,7 +317,7 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity { if (ppbe.isAnimationInProgress()) return false; - if (ppbe.inventory.isBackedUp()) + if (ppbe.isBackedUp()) return false; ppbe.startAnimation(box.item, false); diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorInteractionHandler.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorInteractionHandler.java index 6d26795a13..5bde6488ae 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorInteractionHandler.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorInteractionHandler.java @@ -12,8 +12,8 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.AllPackets; import com.simibubi.create.AllTags.AllItemTags; import com.simibubi.create.content.logistics.box.PackageItem; -import com.simibubi.create.content.logistics.frogport.FrogportTarget; -import com.simibubi.create.content.logistics.frogport.FrogportTargetSelectionHandler; +import com.simibubi.create.content.logistics.packagePort.PackagePortTarget; +import com.simibubi.create.content.logistics.packagePort.PackagePortTargetSelectionHandler; import com.simibubi.create.foundation.utility.RaycastHelper; import net.createmod.catnip.CatnipClient; @@ -141,9 +141,9 @@ public class ChainConveyorInteractionHandler { } if (AllBlocks.PACKAGE_FROGPORT.isIn(mainHandItem)) { - FrogportTargetSelectionHandler.exactPositionOfTarget = selectedBakedPosition; - FrogportTargetSelectionHandler.activePackageTarget = - new FrogportTarget.ChainConveyorFrogportTarget(selectedLift, selectedChainPosition, selectedConnection); + PackagePortTargetSelectionHandler.exactPositionOfTarget = selectedBakedPosition; + PackagePortTargetSelectionHandler.activePackageTarget = + new PackagePortTarget.ChainConveyorFrogportTarget(selectedLift, selectedChainPosition, selectedConnection); return true; } diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java index 381c634e93..e5210c3319 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java @@ -163,6 +163,9 @@ public class PackageEntity extends LivingEntity implements IEntityAdditionalSpaw } insertionDelay = Math.min(insertionDelay + 1, 30); super.tick(); + + if (!PackageItem.isPackage(box)) + discard(); } /* diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageRenderer.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageRenderer.java index 56ec1d703a..0fe587ad1e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageRenderer.java @@ -26,7 +26,7 @@ public class PackageRenderer extends EntityRenderer { @Override public void render(PackageEntity entity, float yaw, float pt, PoseStack ms, MultiBufferSource buffer, int light) { ItemStack box = entity.box; - if (box.isEmpty()) + if (box.isEmpty() || !PackageItem.isPackage(box)) box = PackageItem.getFallbackBox(); PartialModel model = AllPartialModels.PACKAGES.get(ForgeRegistries.ITEMS.getKey(box.getItem())); SuperByteBuffer sbb = CachedBuffers.partial(model, Blocks.AIR.defaultBlockState()); diff --git a/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportConfigurationPacket.java b/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportConfigurationPacket.java deleted file mode 100644 index ec0b24c968..0000000000 --- a/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportConfigurationPacket.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.simibubi.create.content.logistics.frogport; - -import com.simibubi.create.foundation.networking.BlockEntityConfigurationPacket; - -import net.minecraft.core.BlockPos; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.item.ItemStack; - -public class FrogportConfigurationPacket extends BlockEntityConfigurationPacket { - - private String newFilter; - private boolean ejectPackages; - private boolean acceptPackages; - - public FrogportConfigurationPacket(BlockPos pos, String newFilter, boolean acceptPackages, boolean ejectPackages) { - super(pos); - this.newFilter = newFilter; - this.ejectPackages = ejectPackages; - this.acceptPackages = acceptPackages; - } - - public FrogportConfigurationPacket(FriendlyByteBuf buffer) { - super(buffer); - } - - @Override - protected void writeSettings(FriendlyByteBuf buffer) { - buffer.writeBoolean(ejectPackages); - buffer.writeBoolean(acceptPackages); - buffer.writeUtf(newFilter); - } - - @Override - protected void readSettings(FriendlyByteBuf buffer) { - ejectPackages = buffer.readBoolean(); - acceptPackages = buffer.readBoolean(); - newFilter = buffer.readUtf(); - } - - @Override - protected void applySettings(ServerPlayer player, FrogportBlockEntity be) { - super.applySettings(player, be); - if (!ejectPackages) - return; - for (int i = 0; i < be.inventory.getSlots(); i++) { - ItemStack stackInSlot = be.inventory.getStackInSlot(i); - if (stackInSlot.isEmpty()) - continue; - player.getInventory() - .placeItemBackInInventory(stackInSlot); - be.inventory.setStackInSlot(i, ItemStack.EMPTY); - } - be.notifyUpdate(); - } - - @Override - protected void applySettings(FrogportBlockEntity be) { - if (be.addressFilter.equals(newFilter) && be.acceptsPackages == acceptPackages) - return; - be.addressFilter = newFilter; - be.acceptsPackages = acceptPackages; - be.filterChanged(); - be.notifyUpdate(); - } - -} diff --git a/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportInventory.java b/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportInventory.java deleted file mode 100644 index 8efed235a7..0000000000 --- a/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportInventory.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.simibubi.create.content.logistics.frogport; - -import org.jetbrains.annotations.NotNull; - -import com.simibubi.create.content.logistics.box.PackageItem; - -import net.minecraft.world.item.ItemStack; -import net.minecraftforge.items.ItemStackHandler; - -public class FrogportInventory extends ItemStackHandler { - - private boolean receiveMode; - private FrogportBlockEntity port; - - public FrogportInventory(FrogportBlockEntity port) { - super(9); - this.port = port; - receiveMode = false; - } - - public void receiveMode(boolean enable) { - receiveMode = enable; - } - - public boolean isBackedUp() { - for (int i = 0; i < getSlots(); i++) - if (getStackInSlot(i).isEmpty()) - return false; - return true; - } - - public boolean isEmpty() { - for (int i = 0; i < getSlots(); i++) - if (!getStackInSlot(i).isEmpty()) - return false; - return true; - } - - @Override - public @NotNull ItemStack insertItem(int slot, @NotNull ItemStack stack, boolean simulate) { - if (!(stack.getItem() instanceof PackageItem)) - return stack; - if (receiveMode) - return super.insertItem(slot, stack, simulate); - - if (port.isAnimationInProgress()) - return stack; - if (port.target == null || !port.target.export(port.getLevel(), port.getBlockPos(), stack, true)) - return stack; - if (!simulate) - port.startAnimation(stack.copy(), true); - return ItemStack.EMPTY; - } - - @Override - public @NotNull ItemStack extractItem(int slot, int amount, boolean simulate) { - ItemStack extractItem = super.extractItem(slot, amount, simulate); - if (!simulate && !extractItem.isEmpty()) - port.notifyUpdate(); - return extractItem; - } - - @Override - protected void onContentsChanged(int slot) { - super.onContentsChanged(slot); - port.setChanged(); - } - -} diff --git a/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportScreen.java b/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportScreen.java deleted file mode 100644 index 3195980f3e..0000000000 --- a/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportScreen.java +++ /dev/null @@ -1,178 +0,0 @@ -package com.simibubi.create.content.logistics.frogport; - -import java.util.List; - -import com.simibubi.create.AllBlocks; -import com.simibubi.create.AllPackets; -import com.simibubi.create.content.logistics.box.PackageItem; -import com.simibubi.create.foundation.gui.AllGuiTextures; -import com.simibubi.create.foundation.gui.AllIcons; -import com.simibubi.create.foundation.gui.widget.IconButton; -import com.simibubi.create.foundation.utility.CreateLang; - -import net.createmod.catnip.gui.AbstractSimiScreen; -import net.createmod.catnip.gui.element.GuiGameElement; -import net.createmod.catnip.gui.widget.AbstractSimiWidget; -import net.minecraft.ChatFormatting; -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.gui.components.EditBox; -import net.minecraft.network.chat.Component; -import net.minecraft.world.item.ItemStack; - -public class FrogportScreen extends AbstractSimiScreen { - - private ItemStack renderedItem = AllBlocks.PACKAGE_FROGPORT.asStack(); - private ItemStack renderedPackage = PackageItem.containing(List.of()); - private AllGuiTextures background; - private FrogportBlockEntity blockEntity; - private EditBox addressBox; - private IconButton confirmButton; - private IconButton dontAcceptPackages; - private IconButton acceptPackages; - private IconButton dumpPackagesButton; - - public FrogportScreen(FrogportBlockEntity be) { - super(AllBlocks.PACKAGE_FROGPORT.asStack() - .getHoverName()); - background = AllGuiTextures.FROGPORT; - this.blockEntity = be; - } - - @Override - protected void init() { - setWindowSize(background.getWidth(), background.getHeight()); - setWindowOffset(-11, -3); - super.init(); - clearWidgets(); - - int x = guiLeft + 10; - int y = guiTop + 10; - - addressBox = new EditBox(this.font, x + 44, y + 28, 140, 9, Component.empty()); - addressBox.setMaxLength(50); - addressBox.setBordered(false); - addressBox.setTextColor(0xffffff); - addressBox.setValue(blockEntity.addressFilter); - - if (!blockEntity.acceptsPackages) - addressBox.visible = false; - - addRenderableWidget(addressBox); - - confirmButton = - new IconButton(x + background.getWidth() - 53, y + background.getHeight() - 44, AllIcons.I_CONFIRM); - confirmButton.withCallback(() -> minecraft.setScreen(null)); - addRenderableWidget(confirmButton); - - dumpPackagesButton = new IconButton(x + 156, y + background.getHeight() - 44, AllIcons.I_PRIORITY_LOW); - dumpPackagesButton.withCallback(() -> AllPackets.getChannel() - .sendToServer( - new FrogportConfigurationPacket(blockEntity.getBlockPos(), addressBox.getValue(), !sendOnly(), true))); - dumpPackagesButton.setToolTip(CreateLang.translateDirect("gui.package_port.eject_to_inventory")); - addRenderableWidget(dumpPackagesButton); - - acceptPackages = new IconButton(x + 15, y + background.getHeight() - 44, AllIcons.I_SEND_AND_RECEIVE); - acceptPackages.withCallback(() -> { - addressBox.visible = true; - acceptPackages.active = false; - dontAcceptPackages.active = true; - }); - acceptPackages.active = !blockEntity.acceptsPackages; - acceptPackages.setToolTip(CreateLang.translateDirect("gui.package_port.send_and_receive")); - addRenderableWidget(acceptPackages); - - dontAcceptPackages = new IconButton(x + 15 + 18, y + background.getHeight() - 44, AllIcons.I_SEND_ONLY); - dontAcceptPackages.withCallback(() -> { - addressBox.visible = false; - acceptPackages.active = true; - dontAcceptPackages.active = false; - }); - dontAcceptPackages.active = blockEntity.acceptsPackages; - dontAcceptPackages.setToolTip(CreateLang.translateDirect("gui.package_port.send_only")); - addRenderableWidget(dontAcceptPackages); - - setFocused(addressBox); - tick(); - } - - @Override - public void removed() { - AllPackets.getChannel() - .sendToServer( - new FrogportConfigurationPacket(blockEntity.getBlockPos(), addressBox.getValue(), !sendOnly(), false)); - super.removed(); - } - - private boolean sendOnly() { - return !addressBox.visible; - } - - @Override - public void tick() { - super.tick(); - if (dumpPackagesButton.visible != (getPackageCount() != 0)) { - dumpPackagesButton.visible = !dumpPackagesButton.active; - dumpPackagesButton.getToolTip() - .clear(); - if (dumpPackagesButton.active) - dumpPackagesButton.setToolTip(CreateLang.translateDirect("gui.package_port.eject_to_inventory")); - } - } - - @Override - protected void renderWindow(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { - int x = guiLeft + 10; - int y = guiTop + 10; - - background.render(graphics, guiLeft, guiTop); - graphics.drawString(font, title, x + (background.getWidth() - 20) / 2 - font.width(title) / 2, y + 4, 0x3D3C48, - false); - - GuiGameElement.of(renderedItem).at(x + background.getWidth() + 6, y + background.getHeight() - 56, -200) - .scale(5) - .render(graphics); - - graphics.renderItem(renderedPackage, x + 16, y + 23); - - if (!addressBox.visible) - AllGuiTextures.FROGPORT_INACTIVE_ADDRESS.render(graphics, x + 35, y + 22); - - if (getPackageCount() > 0) { - AllGuiTextures.FROGPORT_SLOT.render(graphics, x + 136, y + background.getHeight() - 44); - graphics.renderItem(renderedPackage, x + 137, y + background.getHeight() - 44); - graphics.renderItemDecorations(font, renderedPackage, x + 137, y + background.getHeight() - 44, - String.valueOf(getPackageCount())); - - if (mouseX > x + 136 && mouseX < x + 136 + 18 && mouseY > y + background.getHeight() - 44 - && mouseY < y + background.getHeight() - 44 + 18) - graphics.renderComponentTooltip(font, - List.of(CreateLang.translate("gui.package_port.packages_backed_up", getPackageCount()) - .component()), - mouseX, mouseY); - } - - if (addressBox.isHovered()) { - graphics.renderComponentTooltip(font, List.of(CreateLang.translate("gui.package_port.catch_packages") - .color(AbstractSimiWidget.HEADER_RGB) - .component(), - CreateLang.translate("gui.package_port.catch_packages_empty") - .style(ChatFormatting.GRAY) - .component(), - CreateLang.translate("gui.package_port.catch_packages_wildcard") - .style(ChatFormatting.GRAY) - .component()), - mouseX, mouseY); - } - } - - private int getPackageCount() { - int packageCount = 0; - for (int i = 0; i < blockEntity.inventory.getSlots(); i++) - if (!blockEntity.inventory.getStackInSlot(i) - .isEmpty()) - packageCount++; - return packageCount; - } - -} diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortAutomationInventoryWrapper.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortAutomationInventoryWrapper.java new file mode 100644 index 0000000000..0dcbe2d688 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortAutomationInventoryWrapper.java @@ -0,0 +1,49 @@ +package com.simibubi.create.content.logistics.packagePort; + +import com.simibubi.create.content.logistics.box.PackageItem; +import com.simibubi.create.foundation.item.ItemHandlerWrapper; +import com.simibubi.create.foundation.item.ItemHelper; + +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.items.IItemHandlerModifiable; + +public class PackagePortAutomationInventoryWrapper extends ItemHandlerWrapper { + + private PackagePortBlockEntity ppbe; + + private boolean access; + + public PackagePortAutomationInventoryWrapper(IItemHandlerModifiable wrapped, PackagePortBlockEntity ppbe) { + super(wrapped); + this.ppbe = ppbe; + access = false; + } + + @Override + public ItemStack extractItem(int slot, int amount, boolean simulate) { + if (access) + return super.extractItem(slot, amount, simulate); + + access = true; + ItemStack extract = ItemHelper.extract(this, stack -> { + if (!PackageItem.isPackage(stack)) + return false; + String filterString = ppbe.getFilterString(); + return filterString != null && PackageItem.matchAddress(stack, filterString); + }, simulate); + access = false; + + return extract; + } + + @Override + public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) { + if (!PackageItem.isPackage(stack)) + return stack; + String filterString = ppbe.getFilterString(); + if (filterString != null && PackageItem.matchAddress(stack, filterString)) + return stack; + return super.insertItem(slot, stack, simulate); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java new file mode 100644 index 0000000000..b87a840c3f --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java @@ -0,0 +1,151 @@ +package com.simibubi.create.content.logistics.packagePort; + +import java.util.List; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; +import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; +import com.simibubi.create.foundation.item.SmartInventory; + +import net.createmod.catnip.utility.lang.Components; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.MenuProvider; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.util.FakePlayer; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.network.NetworkHooks; + +public abstract class PackagePortBlockEntity extends SmartBlockEntity implements MenuProvider { + + public boolean acceptsPackages; + public String addressFilter; + public PackagePortTarget target; + public SmartInventory inventory; + + private LazyOptional itemHandler; + + public PackagePortBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { + super(type, pos, state); + addressFilter = ""; + acceptsPackages = true; + inventory = new SmartInventory(18, this); + itemHandler = LazyOptional.of(() -> new PackagePortAutomationInventoryWrapper(inventory, this)); + } + + public boolean isBackedUp() { + for (int i = 0; i < inventory.getSlots(); i++) + if (inventory.getStackInSlot(i) + .isEmpty()) + return false; + return true; + } + + public void filterChanged() { + if (target != null) { + target.deregister(this, level, worldPosition); + target.register(this, level, worldPosition); + } + } + + @Override + public void lazyTick() { + super.lazyTick(); + if (target != null) + target.register(this, level, worldPosition); + } + + public String getFilterString() { + return acceptsPackages ? addressFilter : null; + } + + @Override + protected void write(CompoundTag tag, boolean clientPacket) { + super.write(tag, clientPacket); + if (target != null) + tag.put("Target", target.write()); + tag.putString("AddressFilter", addressFilter); + tag.putBoolean("AcceptsPackages", acceptsPackages); + tag.put("Inventory", inventory.serializeNBT()); + } + + @Override + protected void read(CompoundTag tag, boolean clientPacket) { + super.read(tag, clientPacket); + inventory.deserializeNBT(tag.getCompound("Inventory")); + PackagePortTarget prevTarget = target; + target = PackagePortTarget.read(tag.getCompound("Target")); + addressFilter = tag.getString("AddressFilter"); + acceptsPackages = tag.getBoolean("AcceptsPackages"); + if (clientPacket && prevTarget != target) + invalidateRenderBoundingBox(); + } + + @Override + public @NotNull LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction side) { + if (isItemHandlerCap(cap)) + return itemHandler.cast(); + return super.getCapability(cap, side); + } + + @Override + public void invalidate() { + if (target != null) + target.deregister(this, level, worldPosition); + itemHandler.invalidate(); + super.invalidate(); + } + + @Override + public void destroy() { + super.destroy(); + for (int i = 0; i < inventory.getSlots(); i++) + drop(inventory.getStackInSlot(i)); + } + + public void drop(ItemStack box) { + if (box.isEmpty()) + return; + Block.popResource(level, worldPosition, box); + } + + @Override + public void addBehaviours(List behaviours) {} + + public InteractionResult use(Player player) { + if (player == null || player.isCrouching()) + return InteractionResult.PASS; + if (player instanceof FakePlayer) + return InteractionResult.PASS; + if (level.isClientSide) + return InteractionResult.SUCCESS; + + NetworkHooks.openScreen((ServerPlayer) player, this, worldPosition); + return InteractionResult.SUCCESS; + } + + @Override + public Component getDisplayName() { + return Components.empty(); + } + + @Override + public AbstractContainerMenu createMenu(int pContainerId, Inventory pPlayerInventory, Player pPlayer) { + return PackagePortMenu.create(pContainerId, pPlayerInventory, this); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortConfigurationPacket.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortConfigurationPacket.java new file mode 100644 index 0000000000..2ac5521c2e --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortConfigurationPacket.java @@ -0,0 +1,45 @@ +package com.simibubi.create.content.logistics.packagePort; + +import com.simibubi.create.foundation.networking.BlockEntityConfigurationPacket; + +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; + +public class PackagePortConfigurationPacket extends BlockEntityConfigurationPacket { + + private String newFilter; + private boolean acceptPackages; + + public PackagePortConfigurationPacket(BlockPos pos, String newFilter, boolean acceptPackages) { + super(pos); + this.newFilter = newFilter; + this.acceptPackages = acceptPackages; + } + + public PackagePortConfigurationPacket(FriendlyByteBuf buffer) { + super(buffer); + } + + @Override + protected void writeSettings(FriendlyByteBuf buffer) { + buffer.writeBoolean(acceptPackages); + buffer.writeUtf(newFilter); + } + + @Override + protected void readSettings(FriendlyByteBuf buffer) { + acceptPackages = buffer.readBoolean(); + newFilter = buffer.readUtf(); + } + + @Override + protected void applySettings(PackagePortBlockEntity be) { + if (be.addressFilter.equals(newFilter) && be.acceptsPackages == acceptPackages) + return; + be.addressFilter = newFilter; + be.acceptsPackages = acceptPackages; + be.filterChanged(); + be.notifyUpdate(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportItem.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortItem.java similarity index 74% rename from src/main/java/com/simibubi/create/content/logistics/frogport/FrogportItem.java rename to src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortItem.java index dc0440084f..07a107e49f 100644 --- a/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortItem.java @@ -1,4 +1,4 @@ -package com.simibubi.create.content.logistics.frogport; +package com.simibubi.create.content.logistics.packagePort; import com.simibubi.create.AllPackets; @@ -12,9 +12,9 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.network.PacketDistributor; -public class FrogportItem extends BlockItem { +public class PackagePortItem extends BlockItem { - public FrogportItem(Block pBlock, Properties pProperties) { + public PackagePortItem(Block pBlock, Properties pProperties) { super(pBlock, pProperties); } @@ -23,7 +23,7 @@ public class FrogportItem extends BlockItem { BlockState p_195943_5_) { if (!world.isClientSide && player instanceof ServerPlayer sp) AllPackets.getChannel() - .send(PacketDistributor.PLAYER.with(() -> sp), new FrogportPlacementPacket.ClientBoundRequest(pos)); + .send(PacketDistributor.PLAYER.with(() -> sp), new PackagePortPlacementPacket.ClientBoundRequest(pos)); return super.updateCustomBlockEntityTag(pos, world, player, p_195943_4_, p_195943_5_); } diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortMenu.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortMenu.java new file mode 100644 index 0000000000..7590cb415b --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortMenu.java @@ -0,0 +1,84 @@ +package com.simibubi.create.content.logistics.packagePort; + +import com.simibubi.create.AllMenuTypes; +import com.simibubi.create.foundation.gui.menu.MenuBase; +import com.simibubi.create.foundation.item.SmartInventory; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraftforge.items.SlotItemHandler; + +public class PackagePortMenu extends MenuBase { + + public PackagePortMenu(MenuType type, int id, Inventory inv, FriendlyByteBuf extraData) { + super(type, id, inv, extraData); + } + + public PackagePortMenu(MenuType type, int id, Inventory inv, PackagePortBlockEntity be) { + super(type, id, inv, be); + } + + public static PackagePortMenu create(int id, Inventory inv, PackagePortBlockEntity be) { + return new PackagePortMenu(AllMenuTypes.PACKAGE_PORT.get(), id, inv, be); + } + + @Override + protected PackagePortBlockEntity createOnClient(FriendlyByteBuf extraData) { + BlockPos readBlockPos = extraData.readBlockPos(); + ClientLevel world = Minecraft.getInstance().level; + BlockEntity blockEntity = world.getBlockEntity(readBlockPos); + if (blockEntity instanceof PackagePortBlockEntity ppbe) + return ppbe; + return null; + } + + @Override + public ItemStack quickMoveStack(Player player, int index) { + Slot clickedSlot = getSlot(index); + if (!clickedSlot.hasItem()) + return ItemStack.EMPTY; + + ItemStack stack = clickedSlot.getItem(); + int size = contentHolder.inventory.getSlots(); + boolean success = false; + if (index < size) { + success = !moveItemStackTo(stack, size, slots.size(), false); + } else + success = !moveItemStackTo(stack, 0, size - 1, false); + + return success ? ItemStack.EMPTY : stack; + } + + @Override + protected void initAndReadInventory(PackagePortBlockEntity contentHolder) {} + + @Override + protected void addSlots() { + SmartInventory inventory = contentHolder.inventory; + int x = 27; + int y = 9; + + for (int row = 0; row < 2; row++) + for (int col = 0; col < 9; col++) + addSlot(new SlotItemHandler(inventory, row * 9 + col, x + col * 18, y + row * 18)); + + addPlayerSlots(38, 108); + } + + @Override + protected void saveData(PackagePortBlockEntity contentHolder) {} + + @Override + public void removed(Player playerIn) { + super.removed(playerIn); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportPlacementPacket.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortPlacementPacket.java similarity index 79% rename from src/main/java/com/simibubi/create/content/logistics/frogport/FrogportPlacementPacket.java rename to src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortPlacementPacket.java index 073556f56f..dcf400401a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportPlacementPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortPlacementPacket.java @@ -1,4 +1,4 @@ -package com.simibubi.create.content.logistics.frogport; +package com.simibubi.create.content.logistics.packagePort; import com.simibubi.create.foundation.networking.SimplePacketBase; import com.simibubi.create.infrastructure.config.AllConfigs; @@ -13,18 +13,18 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.network.NetworkEvent.Context; -public class FrogportPlacementPacket extends SimplePacketBase { +public class PackagePortPlacementPacket extends SimplePacketBase { - private FrogportTarget target; + private PackagePortTarget target; private BlockPos pos; - public FrogportPlacementPacket(FrogportTarget target, BlockPos pos) { + public PackagePortPlacementPacket(PackagePortTarget target, BlockPos pos) { this.target = target; this.pos = pos; } - public FrogportPlacementPacket(FriendlyByteBuf buffer) { - target = FrogportTarget.read(buffer.readNbt()); + public PackagePortPlacementPacket(FriendlyByteBuf buffer) { + target = PackagePortTarget.read(buffer.readNbt()); pos = buffer.readBlockPos(); } @@ -44,7 +44,7 @@ public class FrogportPlacementPacket extends SimplePacketBase { if (world == null || !world.isLoaded(pos)) return; BlockEntity blockEntity = world.getBlockEntity(pos); - if (!(blockEntity instanceof FrogportBlockEntity ppbe)) + if (!(blockEntity instanceof PackagePortBlockEntity ppbe)) return; Vec3 targetLocation = target.getExactTargetLocation(ppbe, world, pos); @@ -55,6 +55,7 @@ public class FrogportPlacementPacket extends SimplePacketBase { target.setup(ppbe, world, pos); ppbe.target = target; ppbe.notifyUpdate(); + ppbe.use(player); }); return true; } @@ -79,7 +80,7 @@ public class FrogportPlacementPacket extends SimplePacketBase { @Override public boolean handle(Context context) { context.enqueueWork(() -> DistExecutor.unsafeRunWhenOn(Dist.CLIENT, - () -> () -> FrogportTargetSelectionHandler.flushSettings(pos))); + () -> () -> PackagePortTargetSelectionHandler.flushSettings(pos))); return true; } diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortScreen.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortScreen.java new file mode 100644 index 0000000000..d627629f86 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortScreen.java @@ -0,0 +1,192 @@ +package com.simibubi.create.content.logistics.packagePort; + +import java.util.Collections; +import java.util.List; +import java.util.function.Consumer; + +import com.google.common.collect.ImmutableList; +import com.mojang.blaze3d.platform.InputConstants; +import com.simibubi.create.AllPackets; +import com.simibubi.create.content.logistics.packagePort.frogport.FrogportBlockEntity; +import com.simibubi.create.content.trains.station.NoShadowFontWrapper; +import com.simibubi.create.foundation.gui.AllGuiTextures; +import com.simibubi.create.foundation.gui.AllIcons; +import com.simibubi.create.foundation.gui.menu.AbstractSimiContainerScreen; +import com.simibubi.create.foundation.gui.widget.IconButton; +import com.simibubi.create.foundation.utility.CreateLang; + +import net.createmod.catnip.gui.element.GuiGameElement; +import net.createmod.catnip.gui.widget.AbstractSimiWidget; +import net.createmod.catnip.utility.lang.Components; +import net.minecraft.ChatFormatting; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.EditBox; +import net.minecraft.client.renderer.Rect2i; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.item.ItemStack; + +public class PackagePortScreen extends AbstractSimiContainerScreen { + + private boolean frogMode; + private AllGuiTextures background; + + private EditBox addressBox; + private IconButton confirmButton; + private IconButton dontAcceptPackages; + private IconButton acceptPackages; + + private ItemStack icon; + + private List extraAreas = Collections.emptyList(); + + public PackagePortScreen(PackagePortMenu container, Inventory inv, Component title) { + super(container, inv, title); + background = AllGuiTextures.FROGPORT_BG; + frogMode = container.contentHolder instanceof FrogportBlockEntity; + icon = new ItemStack(container.contentHolder.getBlockState() + .getBlock() + .asItem()); + } + + @Override + protected void init() { + setWindowSize(background.getWidth(), background.getHeight() + AllGuiTextures.PLAYER_INVENTORY.getHeight()); + super.init(); + clearWidgets(); + + int x = getGuiLeft(); + int y = getGuiTop(); + + Consumer onTextChanged; + onTextChanged = s -> addressBox.setX(nameBoxX(s, addressBox)); + addressBox = new EditBox(new NoShadowFontWrapper(font), x + 23, y - 11, background.getWidth() - 20, 10, + Components.empty()); + addressBox.setBordered(false); + addressBox.setMaxLength(25); + addressBox.setTextColor(0x3D3C48); + addressBox.setValue(menu.contentHolder.addressFilter); + addressBox.setFocused(false); + addressBox.mouseClicked(0, 0, 0); + addressBox.setResponder(onTextChanged); + addressBox.setX(nameBoxX(addressBox.getValue(), addressBox)); + addRenderableWidget(addressBox); + + confirmButton = + new IconButton(x + background.getWidth() - 33, y + background.getHeight() - 24, AllIcons.I_CONFIRM); + confirmButton.withCallback(() -> minecraft.player.closeContainer()); + addRenderableWidget(confirmButton); + + acceptPackages = new IconButton(x + 37, y + background.getHeight() - 24, AllIcons.I_SEND_AND_RECEIVE); + acceptPackages.withCallback(() -> { + acceptPackages.active = false; + dontAcceptPackages.active = true; + }); + acceptPackages.active = !menu.contentHolder.acceptsPackages; + acceptPackages.setToolTip(CreateLang.translateDirect("gui.package_port.send_and_receive")); + addRenderableWidget(acceptPackages); + + dontAcceptPackages = new IconButton(x + 37 + 18, y + background.getHeight() - 24, AllIcons.I_SEND_ONLY); + dontAcceptPackages.withCallback(() -> { + acceptPackages.active = true; + dontAcceptPackages.active = false; + }); + dontAcceptPackages.active = menu.contentHolder.acceptsPackages; + dontAcceptPackages.setToolTip(CreateLang.translateDirect("gui.package_port.send_only")); + addRenderableWidget(dontAcceptPackages); + + containerTick(); + + extraAreas = ImmutableList.of(new Rect2i(x + background.getWidth(), y + background.getHeight() - 50, 70, 60)); + } + + private int nameBoxX(String s, EditBox nameBox) { + return getGuiLeft() + background.getWidth() / 2 - (Math.min(font.width(s), nameBox.getWidth()) + 10) / 2; + } + + @Override + protected void containerTick() { + acceptPackages.visible = menu.contentHolder.target != null; + dontAcceptPackages.visible = menu.contentHolder.target != null; + super.containerTick(); + } + + @Override + protected void renderBg(GuiGraphics graphics, float pPartialTick, int pMouseX, int pMouseY) { + int x = getGuiLeft(); + int y = getGuiTop(); + + AllGuiTextures header = frogMode ? AllGuiTextures.FROGPORT_HEADER : AllGuiTextures.POSTBOX_HEADER; + header.render(graphics, x, y - header.getHeight()); + background.render(graphics, x, y); + + String text = addressBox.getValue(); + if (!addressBox.isFocused()) { + if (addressBox.getValue() + .isEmpty()) { + text = icon.getHoverName() + .getString(); + graphics.drawString(font, text, nameBoxX(text, addressBox), y - 11, 0x3D3C48, false); + } + AllGuiTextures.FROGPORT_EDIT_NAME.render(graphics, nameBoxX(text, addressBox) + font.width(text) + 5, + y - 14); + } + + GuiGameElement.of(icon).at(x + background.getWidth() + 6, y + background.getHeight() - 56, -200) + .scale(4) + .render(graphics); + + int invX = leftPos + 30; + int invY = topPos + 8 + imageHeight - AllGuiTextures.PLAYER_INVENTORY.getHeight(); + renderPlayerInventory(graphics, invX, invY); + + if (menu.contentHolder.target == null) + return; + + x += 13; + y += 58; + AllGuiTextures.FROGPORT_SLOT.render(graphics, x, y); + graphics.renderItem(menu.contentHolder.target.getIcon(), x + 1, y + 1); + + if (addressBox.isHovered()) { + graphics.renderComponentTooltip(font, List.of(CreateLang.translate("gui.package_port.catch_packages") + .color(AbstractSimiWidget.HEADER_RGB) + .component(), + CreateLang.translate("gui.package_port.catch_packages_empty") + .style(ChatFormatting.GRAY) + .component(), + CreateLang.translate("gui.package_port.catch_packages_wildcard") + .style(ChatFormatting.GRAY) + .component()), + pMouseX, pMouseY); + } + } + + @Override + public boolean keyPressed(int pKeyCode, int pScanCode, int pModifiers) { + boolean hitEnter = getFocused() instanceof EditBox + && (pKeyCode == InputConstants.KEY_RETURN || pKeyCode == InputConstants.KEY_NUMPADENTER); + + if (hitEnter && addressBox.isFocused()) { + addressBox.setFocused(false); + return true; + } + + return super.keyPressed(pKeyCode, pScanCode, pModifiers); + } + + @Override + public void removed() { + AllPackets.getChannel() + .sendToServer(new PackagePortConfigurationPacket(menu.contentHolder.getBlockPos(), addressBox.getValue(), + dontAcceptPackages.isActive())); + super.removed(); + } + + @Override + public List getExtraAreas() { + return extraAreas; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportTarget.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTarget.java similarity index 70% rename from src/main/java/com/simibubi/create/content/logistics/frogport/FrogportTarget.java rename to src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTarget.java index ec2b25be25..96a17229ad 100644 --- a/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportTarget.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTarget.java @@ -1,4 +1,4 @@ -package com.simibubi.create.content.logistics.frogport; +package com.simibubi.create.content.logistics.packagePort; import java.util.Map; @@ -9,9 +9,6 @@ import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorBlockEnti import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorBlockEntity.ConnectedPort; import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorBlockEntity.ConnectionStats; import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorPackage; -import com.simibubi.create.content.trains.entity.Carriage; -import com.simibubi.create.content.trains.entity.Train; -import com.simibubi.create.content.trains.station.GlobalStation; import com.simibubi.create.content.trains.station.StationBlockEntity; import net.minecraft.core.BlockPos; @@ -22,33 +19,33 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.items.IItemHandlerModifiable; -import net.minecraftforge.items.ItemHandlerHelper; -public abstract class FrogportTarget { +public abstract class PackagePortTarget { public BlockPos relativePos; private String typeKey; - public FrogportTarget(String typeKey, BlockPos relativePos) { + public PackagePortTarget(String typeKey, BlockPos relativePos) { this.typeKey = typeKey; this.relativePos = relativePos; } public abstract boolean export(LevelAccessor level, BlockPos portPos, ItemStack box, boolean simulate); - public void setup(FrogportBlockEntity ppbe, LevelAccessor level, BlockPos portPos) {} + public void setup(PackagePortBlockEntity ppbe, LevelAccessor level, BlockPos portPos) {} - public void register(FrogportBlockEntity ppbe, LevelAccessor level, BlockPos portPos) {} + public void register(PackagePortBlockEntity ppbe, LevelAccessor level, BlockPos portPos) {} - public void deregister(FrogportBlockEntity ppbe, LevelAccessor level, BlockPos portPos) {} + public void deregister(PackagePortBlockEntity ppbe, LevelAccessor level, BlockPos portPos) {} - public abstract Vec3 getExactTargetLocation(FrogportBlockEntity ppbe, LevelAccessor level, BlockPos portPos); + public abstract Vec3 getExactTargetLocation(PackagePortBlockEntity ppbe, LevelAccessor level, BlockPos portPos); + + public abstract ItemStack getIcon(); public boolean depositImmediately() { return false; } - + public CompoundTag write() { CompoundTag compoundTag = new CompoundTag(); writeInternal(compoundTag); @@ -57,12 +54,12 @@ public abstract class FrogportTarget { return compoundTag; } - public static FrogportTarget read(CompoundTag tag) { + public static PackagePortTarget read(CompoundTag tag) { if (tag.isEmpty()) return null; BlockPos relativePos = NbtUtils.readBlockPos(tag.getCompound("RelativePos")); - FrogportTarget target = switch (tag.getString("Type")) { + PackagePortTarget target = switch (tag.getString("Type")) { case "ChainConveyor" -> new ChainConveyorFrogportTarget(relativePos, 0, null); case "TrainStation" -> new TrainStationFrogportTarget(relativePos); @@ -81,11 +78,13 @@ public abstract class FrogportTarget { protected abstract void readInternal(CompoundTag tag); - protected BlockEntity be(LevelAccessor level, BlockPos portPos) { + public BlockEntity be(LevelAccessor level, BlockPos portPos) { + if (level instanceof Level l && !l.isLoaded(portPos.offset(relativePos))) + return null; return level.getBlockEntity(portPos.offset(relativePos)); } - public static class ChainConveyorFrogportTarget extends FrogportTarget { + public static class ChainConveyorFrogportTarget extends PackagePortTarget { public float chainPos; public BlockPos connection; @@ -98,11 +97,16 @@ public abstract class FrogportTarget { } @Override - public void setup(FrogportBlockEntity ppbe, LevelAccessor level, BlockPos portPos) { + public void setup(PackagePortBlockEntity ppbe, LevelAccessor level, BlockPos portPos) { if (be(level, portPos) instanceof ChainConveyorBlockEntity clbe) flipped = clbe.getSpeed() < 0; } + @Override + public ItemStack getIcon() { + return AllBlocks.CHAIN_CONVEYOR.asStack(); + } + @Override public boolean export(LevelAccessor level, BlockPos portPos, ItemStack box, boolean simulate) { if (!(be(level, portPos) instanceof ChainConveyorBlockEntity clbe)) @@ -118,7 +122,7 @@ public abstract class FrogportTarget { } @Override - public void register(FrogportBlockEntity ppbe, LevelAccessor level, BlockPos portPos) { + public void register(PackagePortBlockEntity ppbe, LevelAccessor level, BlockPos portPos) { if (!(be(level, portPos) instanceof ChainConveyorBlockEntity clbe)) return; ChainConveyorBlockEntity actualBe = clbe; @@ -153,7 +157,7 @@ public abstract class FrogportTarget { } @Override - public void deregister(FrogportBlockEntity ppbe, LevelAccessor level, BlockPos portPos) { + public void deregister(PackagePortBlockEntity ppbe, LevelAccessor level, BlockPos portPos) { if (!(be(level, portPos) instanceof ChainConveyorBlockEntity clbe)) return; clbe.loopPorts.remove(relativePos.multiply(-1)); @@ -185,7 +189,7 @@ public abstract class FrogportTarget { } @Override - public Vec3 getExactTargetLocation(FrogportBlockEntity ppbe, LevelAccessor level, BlockPos portPos) { + public Vec3 getExactTargetLocation(PackagePortBlockEntity ppbe, LevelAccessor level, BlockPos portPos) { if (!(be(level, portPos) instanceof ChainConveyorBlockEntity clbe)) return Vec3.ZERO; return clbe.getPackagePosition(chainPos, connection); @@ -193,59 +197,39 @@ public abstract class FrogportTarget { } - public static class TrainStationFrogportTarget extends FrogportTarget { + public static class TrainStationFrogportTarget extends PackagePortTarget { public TrainStationFrogportTarget(BlockPos relativePos) { super("TrainStation", relativePos); } + @Override + public ItemStack getIcon() { + return AllBlocks.TRACK_STATION.asStack(); + } + @Override public boolean export(LevelAccessor level, BlockPos portPos, ItemStack box, boolean simulate) { - if (!(be(level, portPos) instanceof StationBlockEntity sbe)) - return false; - - GlobalStation station = sbe.getStation(); - if (station == null) - return false; - - Train train = station.getPresentTrain(); - if (train == null) - return false; - if (!(level instanceof Level l)) - return false; - - for (Carriage carriage : train.carriages) { - IItemHandlerModifiable inventory = carriage.storage.getItems(); - if (inventory == null) - continue; - ItemStack insertItemStacked = ItemHandlerHelper.insertItemStacked(inventory, box, simulate); - if (insertItemStacked.isEmpty()) - return true; - } - return false; } @Override - public Vec3 getExactTargetLocation(FrogportBlockEntity ppbe, LevelAccessor level, BlockPos portPos) { - if (!(be(level, portPos) instanceof StationBlockEntity sbe) || sbe.edgePoint == null) - return Vec3.atCenterOf(portPos); - return Vec3.atCenterOf(sbe.edgePoint.getPositionForMapMarker() - .above()); + public Vec3 getExactTargetLocation(PackagePortBlockEntity ppbe, LevelAccessor level, BlockPos portPos) { + return Vec3.atCenterOf(portPos); } @Override - public void register(FrogportBlockEntity ppbe, LevelAccessor level, BlockPos portPos) { + public void register(PackagePortBlockEntity ppbe, LevelAccessor level, BlockPos portPos) { if (be(level, portPos) instanceof StationBlockEntity sbe) sbe.attachPackagePort(ppbe); } @Override - public void deregister(FrogportBlockEntity ppbe, LevelAccessor level, BlockPos portPos) { + public void deregister(PackagePortBlockEntity ppbe, LevelAccessor level, BlockPos portPos) { if (be(level, portPos) instanceof StationBlockEntity sbe) sbe.removePackagePort(ppbe); } - + @Override public boolean depositImmediately() { return true; diff --git a/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportTargetSelectionHandler.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTargetSelectionHandler.java similarity index 83% rename from src/main/java/com/simibubi/create/content/logistics/frogport/FrogportTargetSelectionHandler.java rename to src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTargetSelectionHandler.java index a9ba22d8d6..08012c1a7f 100644 --- a/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportTargetSelectionHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTargetSelectionHandler.java @@ -1,13 +1,13 @@ -package com.simibubi.create.content.logistics.frogport; +package com.simibubi.create.content.logistics.packagePort; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllPackets; +import com.simibubi.create.AllTags.AllItemTags; import com.simibubi.create.content.trains.station.StationBlockEntity; import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.infrastructure.config.AllConfigs; import net.createmod.catnip.CatnipClient; -import net.createmod.catnip.gui.ScreenOpener; import net.createmod.catnip.utility.AnimationTickHolder; import net.createmod.catnip.utility.theme.Color; import net.minecraft.client.Minecraft; @@ -16,17 +16,17 @@ import net.minecraft.client.player.LocalPlayer; import net.minecraft.core.BlockPos; import net.minecraft.core.particles.DustParticleOptions; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.HitResult.Type; import net.minecraft.world.phys.Vec3; -public class FrogportTargetSelectionHandler { +public class PackagePortTargetSelectionHandler { - public static FrogportTarget activePackageTarget; + public static PackagePortTarget activePackageTarget; public static Vec3 exactPositionOfTarget; + public static boolean isPostbox; public static void flushSettings(BlockPos pos) { if (activePackageTarget == null) { @@ -38,14 +38,11 @@ public class FrogportTargetSelectionHandler { if (validateDiff(exactPositionOfTarget, pos) == null) { activePackageTarget.relativePos = activePackageTarget.relativePos.subtract(pos); AllPackets.getChannel() - .sendToServer(new FrogportPlacementPacket(activePackageTarget, pos)); - - BlockEntity blockEntity = Minecraft.getInstance().level.getBlockEntity(pos); - if (blockEntity instanceof FrogportBlockEntity ppbe) - ScreenOpener.open(new FrogportScreen(ppbe)); + .sendToServer(new PackagePortPlacementPacket(activePackageTarget, pos)); } activePackageTarget = null; + isPostbox = false; return; } @@ -64,13 +61,12 @@ public class FrogportTargetSelectionHandler { return false; if (sbe.edgePoint == null) return false; - if (!AllBlocks.PACKAGE_FROGPORT.isIn(mainHandItem)) + if (!AllItemTags.POSTBOXES.matches(mainHandItem)) return false; - FrogportTargetSelectionHandler.exactPositionOfTarget = - Vec3.atCenterOf(sbe.edgePoint.getPositionForMapMarker() - .above()); - FrogportTargetSelectionHandler.activePackageTarget = new FrogportTarget.TrainStationFrogportTarget(pos); + PackagePortTargetSelectionHandler.exactPositionOfTarget = Vec3.atCenterOf(pos); + PackagePortTargetSelectionHandler.activePackageTarget = new PackagePortTarget.TrainStationFrogportTarget(pos); + PackagePortTargetSelectionHandler.isPostbox = true; return true; } @@ -79,7 +75,8 @@ public class FrogportTargetSelectionHandler { LocalPlayer player = mc.player; if (activePackageTarget == null) return; - if (!AllBlocks.PACKAGE_FROGPORT.isIn(player.getMainHandItem())) + boolean isPostbox = AllItemTags.POSTBOXES.matches(player.getMainHandItem()); + if (!AllBlocks.PACKAGE_FROGPORT.isIn(player.getMainHandItem()) && !isPostbox) return; HitResult objectMouseOver = mc.hitResult; @@ -143,7 +140,7 @@ public class FrogportTargetSelectionHandler { public static String validateDiff(Vec3 target, BlockPos placedPos) { Vec3 source = Vec3.atBottomCenterOf(placedPos); Vec3 diff = target.subtract(source); - if (diff.y < 0) + if (diff.y < 0 && !isPostbox) return "package_port.cannot_reach_down"; if (diff.length() > AllConfigs.server().logistics.packagePortRange.get()) return "package_port.too_far"; diff --git a/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportBlock.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportBlock.java similarity index 75% rename from src/main/java/com/simibubi/create/content/logistics/frogport/FrogportBlock.java rename to src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportBlock.java index 2401e7bb0a..71618eebc0 100644 --- a/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportBlock.java @@ -1,4 +1,4 @@ -package com.simibubi.create.content.logistics.frogport; +package com.simibubi.create.content.logistics.packagePort.frogport; import org.jetbrains.annotations.Nullable; @@ -7,12 +7,8 @@ import com.simibubi.create.AllItems; import com.simibubi.create.AllShapes; import com.simibubi.create.content.equipment.wrench.IWrenchable; import com.simibubi.create.foundation.block.IBE; -import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.gui.ScreenOpener; import net.createmod.catnip.utility.VecHelper; -import net.minecraft.ChatFormatting; -import net.minecraft.client.player.LocalPlayer; import net.minecraft.core.BlockPos; import net.minecraft.util.Mth; import net.minecraft.world.InteractionHand; @@ -30,9 +26,6 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.fml.DistExecutor; public class FrogportBlock extends Block implements IBE, IWrenchable { @@ -69,21 +62,7 @@ public class FrogportBlock extends Block implements IBE, IW BlockHitResult hit) { if (player != null && AllItems.WRENCH.isIn(player.getItemInHand(handIn))) return InteractionResult.PASS; - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, - () -> () -> withBlockEntityDo(worldIn, pos, be -> this.displayScreen(be, player))); - return InteractionResult.SUCCESS; - } - - @OnlyIn(value = Dist.CLIENT) - protected void displayScreen(FrogportBlockEntity be, Player player) { - if (be.target == null) { - CreateLang.translate("gui.package_port.not_targeting_anything") - .style(ChatFormatting.RED) - .sendStatus(player); - return; - } - if (player instanceof LocalPlayer) - ScreenOpener.open(new FrogportScreen(be)); + return onBlockEntityUse(worldIn, pos, be -> be.use(player)); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportBlockEntity.java similarity index 69% rename from src/main/java/com/simibubi/create/content/logistics/frogport/FrogportBlockEntity.java rename to src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportBlockEntity.java index 907efad6aa..481f949bbb 100644 --- a/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportBlockEntity.java @@ -1,21 +1,13 @@ -package com.simibubi.create.content.logistics.frogport; - -import java.util.List; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +package com.simibubi.create.content.logistics.packagePort.frogport; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; -import com.simibubi.create.content.logistics.box.PackageEntity; import com.simibubi.create.content.logistics.box.PackageItem; +import com.simibubi.create.content.logistics.packagePort.PackagePortBlockEntity; import com.simibubi.create.content.logistics.packager.PackagerItemHandler; -import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; -import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import com.simibubi.create.foundation.item.ItemHelper; import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.VecHelper; import net.createmod.catnip.utility.animation.LerpedFloat; import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; import net.minecraft.core.BlockPos; @@ -30,19 +22,11 @@ import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.ForgeCapabilities; -import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.ItemHandlerHelper; -public class FrogportBlockEntity extends SmartBlockEntity { - - public boolean acceptsPackages; - public String addressFilter; - public FrogportTarget target; - public FrogportInventory inventory; - private LazyOptional itemHandler; +public class FrogportBlockEntity extends PackagePortBlockEntity { public ItemStack animatedPackage; public LerpedFloat animationProgress; @@ -55,17 +39,10 @@ public class FrogportBlockEntity extends SmartBlockEntity { public FrogportBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); - inventory = new FrogportInventory(this); - itemHandler = LazyOptional.of(() -> inventory); animationProgress = LerpedFloat.linear(); anticipationProgress = LerpedFloat.linear(); - addressFilter = ""; - acceptsPackages = true; } - @Override - public void addBehaviours(List behaviours) {} - public boolean isAnimationInProgress() { return animationProgress.getChaseTarget() == 1; } @@ -79,38 +56,13 @@ public class FrogportBlockEntity extends SmartBlockEntity { return bb; } - @Override - public @NotNull LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction side) { - if (isItemHandlerCap(cap)) - return itemHandler.cast(); - return super.getCapability(cap, side); - } - - public void filterChanged() { - if (target != null) { - target.deregister(this, level, worldPosition); - target.register(this, level, worldPosition); - } - } - @Override public void lazyTick() { super.lazyTick(); - if (target != null) - target.register(this, level, worldPosition); if (level.isClientSide() || isAnimationInProgress()) return; tryPushingToAdjacentInventories(); - tryPullingFromAdjacentInventories(); - } - - @Override - public void destroy() { - super.destroy(); - if (target != null) - target.deregister(this, level, worldPosition); - for (int i = 0; i < inventory.getSlots(); i++) - drop(inventory.getStackInSlot(i)); + tryPullingFromOwnAndAdjacentInventories(); } public void sendAnticipate() { @@ -163,22 +115,14 @@ public class FrogportBlockEntity extends SmartBlockEntity { } if (!currentlyDepositing) { - inventory.receiveMode(true); if (!ItemHandlerHelper.insertItem(inventory, animatedPackage.copy(), false) .isEmpty()) drop(animatedPackage); - inventory.receiveMode(false); } animatedPackage = null; } - public void drop(ItemStack box) { - if (box.isEmpty()) - return; - level.addFreshEntity(PackageEntity.fromItemStack(level, VecHelper.getCenterOf(worldPosition), box)); - } - public void startAnimation(ItemStack box, boolean deposit) { if (!(box.getItem() instanceof PackageItem)) return; @@ -234,32 +178,39 @@ public class FrogportBlockEntity extends SmartBlockEntity { } } - public void tryPullingFromAdjacentInventories() { + public void tryPullingFromOwnAndAdjacentInventories() { if (isAnimationInProgress()) return; if (target == null || !target.export(level, worldPosition, AllItems.CARDBOARD_PACKAGE_10x12.asStack(), true)) return; + if (tryPullingFrom(inventory)) + return; for (Direction side : Iterate.directions) { if (side != Direction.DOWN) continue; IItemHandler handler = getAdjacentInventory(side); if (handler == null) continue; - ItemStack extract = ItemHelper.extract(handler, stack -> { - if (!PackageItem.isPackage(stack)) - return false; - String filterString = getFilterString(); - boolean canAccept = - handler instanceof PackagerItemHandler || !PackageItem.matchAddress(stack, filterString); - return filterString == null || canAccept; - }, false); - if (extract.isEmpty()) - continue; - startAnimation(extract, true); - return; + if (tryPullingFrom(handler)) + return; } } + public boolean tryPullingFrom(IItemHandler handler) { + ItemStack extract = ItemHelper.extract(handler, stack -> { + if (!PackageItem.isPackage(stack)) + return false; + String filterString = getFilterString(); + return filterString == null || handler instanceof PackagerItemHandler + || !PackageItem.matchAddress(stack, filterString); + }, false); + if (extract.isEmpty()) + return false; + startAnimation(extract, true); + return true; + + } + protected IItemHandler getAdjacentInventory(Direction side) { BlockEntity blockEntity = level.getBlockEntity(worldPosition.relative(side)); if (blockEntity == null || blockEntity instanceof FrogportBlockEntity) @@ -271,12 +222,7 @@ public class FrogportBlockEntity extends SmartBlockEntity { @Override protected void write(CompoundTag tag, boolean clientPacket) { super.write(tag, clientPacket); - if (target != null) - tag.put("Target", target.write()); - tag.put("Inventory", inventory.serializeNBT()); tag.putFloat("PlacedYaw", passiveYaw); - tag.putString("AddressFilter", addressFilter); - tag.putBoolean("AcceptsPackages", acceptsPackages); if (animatedPackage != null) { tag.put("AnimatedPackage", animatedPackage.serializeNBT()); tag.putBoolean("Deposit", currentlyDepositing); @@ -290,24 +236,13 @@ public class FrogportBlockEntity extends SmartBlockEntity { @Override protected void read(CompoundTag tag, boolean clientPacket) { super.read(tag, clientPacket); - FrogportTarget prevTarget = target; - target = FrogportTarget.read(tag.getCompound("Target")); - inventory.deserializeNBT(tag.getCompound("Inventory")); passiveYaw = tag.getFloat("PlacedYaw"); - addressFilter = tag.getString("AddressFilter"); - acceptsPackages = tag.getBoolean("AcceptsPackages"); if (!clientPacket) animatedPackage = null; if (tag.contains("AnimatedPackage")) startAnimation(ItemStack.of(tag.getCompound("AnimatedPackage")), tag.getBoolean("Deposit")); if (clientPacket && tag.contains("Anticipate")) anticipate(); - if (clientPacket && prevTarget != target) - invalidateRenderBoundingBox(); - } - - public String getFilterString() { - return acceptsPackages ? addressFilter : null; } public float getYaw() { diff --git a/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportRenderer.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportRenderer.java similarity index 93% rename from src/main/java/com/simibubi/create/content/logistics/frogport/FrogportRenderer.java rename to src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportRenderer.java index 79c38ddd5f..b698b160d9 100644 --- a/src/main/java/com/simibubi/create/content/logistics/frogport/FrogportRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportRenderer.java @@ -1,4 +1,4 @@ -package com.simibubi.create.content.logistics.frogport; +package com.simibubi.create.content.logistics.packagePort.frogport; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllPartialModels; @@ -39,12 +39,10 @@ public class FrogportRenderer extends SmartBlockEntityRenderer { + + public static final BooleanProperty OPEN = BlockStateProperties.OPEN; + + protected final DyeColor color; + + public PostboxBlock(Properties properties, DyeColor color) { + super(properties); + this.color = color; + } + + public DyeColor getColor() { + return color; + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext pContext) { + Direction facing = pContext.getHorizontalDirection() + .getOpposite(); + return super.getStateForPlacement(pContext).setValue(FACING, facing); + } + + @Override + public VoxelShape getShape(BlockState pState, BlockGetter pLevel, BlockPos pPos, CollisionContext pContext) { + return AllShapes.POSTBOX.get(pState.getValue(FACING)); + } + + @Override + protected void createBlockStateDefinition(Builder pBuilder) { + super.createBlockStateDefinition(pBuilder.add(FACING, OPEN)); + } + + @Override + public InteractionResult use(BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, + BlockHitResult pHit) { + return onBlockEntityUse(pLevel, pPos, be -> be.use(pPlayer)); + } + + @Override + public Class getBlockEntityClass() { + return PostboxBlockEntity.class; + } + + @Override + public BlockEntityType getBlockEntityType() { + return AllBlockEntityTypes.PACKAGE_POSTBOX.get(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/postbox/PostboxBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/postbox/PostboxBlockEntity.java new file mode 100644 index 0000000000..00fbe102aa --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/postbox/PostboxBlockEntity.java @@ -0,0 +1,44 @@ +package com.simibubi.create.content.logistics.packagePort.postbox; + +import java.lang.ref.WeakReference; + +import com.simibubi.create.Create; +import com.simibubi.create.content.logistics.packagePort.PackagePortBlockEntity; +import com.simibubi.create.content.trains.station.GlobalStation; +import com.simibubi.create.content.trains.station.GlobalStation.GlobalPackagePort; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; + +public class PostboxBlockEntity extends PackagePortBlockEntity { + + public WeakReference trackedGlobalStation; + + public PostboxBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { + super(type, pos, state); + trackedGlobalStation = new WeakReference(null); + } + + @Override + public void onChunkUnloaded() { + if (level == null || level.isClientSide) + return; + GlobalStation station = trackedGlobalStation.get(); + if (station == null) + return; + if (!station.connectedPorts.containsKey(worldPosition)) + return; + GlobalPackagePort globalPackagePort = station.connectedPorts.get(worldPosition); + for (int i = 0; i < inventory.getSlots(); i++) { + globalPackagePort.offlineBuffer.setStackInSlot(i, inventory.getStackInSlot(i)); + inventory.setStackInSlot(i, ItemStack.EMPTY); + } + + globalPackagePort.primed = true; + Create.RAILWAYS.markTracksDirty(); + super.onChunkUnloaded(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/postbox/PostboxRenderer.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/postbox/PostboxRenderer.java new file mode 100644 index 0000000000..96358b7cae --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/postbox/PostboxRenderer.java @@ -0,0 +1,37 @@ +package com.simibubi.create.content.logistics.packagePort.postbox; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; +import com.simibubi.create.AllPartialModels; +import com.simibubi.create.foundation.blockEntity.renderer.SmartBlockEntityRenderer; + +import net.createmod.catnip.render.CachedBuffers; +import net.createmod.catnip.utility.lang.Components; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider.Context; +import net.minecraft.util.Mth; + +public class PostboxRenderer extends SmartBlockEntityRenderer { + + public PostboxRenderer(Context context) { + super(context); + } + + @Override + protected void renderSafe(PostboxBlockEntity blockEntity, float partialTicks, PoseStack ms, + MultiBufferSource buffer, int light, int overlay) { + + if (blockEntity.addressFilter != null && !blockEntity.addressFilter.isBlank()) + renderNameplateOnHover(blockEntity, Components.literal(blockEntity.addressFilter), 1, ms, buffer, light); + + CachedBuffers.partial(AllPartialModels.POSTBOX_FLAG, blockEntity.getBlockState()) + .light(light) + .overlay(overlay) + .rotateCentered(Mth.DEG_TO_RAD * (180 - blockEntity.getBlockState() + .getValue(PostboxBlock.FACING) + .toYRot()), Axis.YP) + .renderInto(ms, buffer.getBuffer(RenderType.cutout())); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java index 2ed48b8498..a6469de4a5 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java @@ -6,7 +6,7 @@ import java.util.List; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.content.logistics.crate.BottomlessItemHandler; -import com.simibubi.create.content.logistics.frogport.FrogportBlockEntity; +import com.simibubi.create.content.logistics.packagePort.frogport.FrogportBlockEntity; import com.simibubi.create.content.logistics.packager.PackagerBlock.PackagerType; import com.simibubi.create.content.logistics.packagerLink.PackagerLinkBlock; import com.simibubi.create.content.logistics.stockTicker.PackageOrder; @@ -461,7 +461,7 @@ public class PackagerBlockEntity extends SmartBlockEntity { protected void wakeTheFrogs() { if (level.getBlockEntity(worldPosition.relative(Direction.UP)) instanceof FrogportBlockEntity port) - port.tryPullingFromAdjacentInventories(); + port.tryPullingFromOwnAndAdjacentInventories(); } @Override diff --git a/src/main/java/com/simibubi/create/content/trains/entity/Train.java b/src/main/java/com/simibubi/create/content/trains/entity/Train.java index cb47f973ff..1d1f87fca3 100644 --- a/src/main/java/com/simibubi/create/content/trains/entity/Train.java +++ b/src/main/java/com/simibubi/create/content/trains/entity/Train.java @@ -916,6 +916,7 @@ public class Train { setCurrentStation(station); reservedSignalBlocks.clear(); runtime.destinationReached(); + station.runMailTransfer(); } public void setCurrentStation(GlobalStation station) { diff --git a/src/main/java/com/simibubi/create/content/trains/station/GlobalStation.java b/src/main/java/com/simibubi/create/content/trains/station/GlobalStation.java index f3c005b76a..5062dbbaab 100644 --- a/src/main/java/com/simibubi/create/content/trains/station/GlobalStation.java +++ b/src/main/java/com/simibubi/create/content/trains/station/GlobalStation.java @@ -1,9 +1,7 @@ package com.simibubi.create.content.trains.station; import java.lang.ref.WeakReference; -import java.util.ArrayList; import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -11,18 +9,18 @@ import javax.annotation.Nullable; import com.simibubi.create.Create; import com.simibubi.create.content.logistics.box.PackageItem; -import com.simibubi.create.content.logistics.frogport.FrogportBlockEntity; +import com.simibubi.create.content.logistics.packagePort.postbox.PostboxBlockEntity; import com.simibubi.create.content.trains.entity.Carriage; import com.simibubi.create.content.trains.entity.CarriageContraptionEntity; import com.simibubi.create.content.trains.entity.Train; import com.simibubi.create.content.trains.graph.DimensionPalette; -import com.simibubi.create.content.trains.graph.TrackGraph; import com.simibubi.create.content.trains.graph.TrackNode; import com.simibubi.create.content.trains.signal.SingleBlockEntityEdgePoint; import net.createmod.catnip.utility.NBTHelper; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; import net.minecraft.nbt.NbtUtils; import net.minecraft.nbt.Tag; import net.minecraft.network.FriendlyByteBuf; @@ -31,7 +29,10 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandlerModifiable; +import net.minecraftforge.items.ItemHandlerHelper; +import net.minecraftforge.items.ItemStackHandler; public class GlobalStation extends SingleBlockEntityEdgePoint { @@ -63,10 +64,12 @@ public class GlobalStation extends SingleBlockEntityEdgePoint { nearestTrain = new WeakReference(null); connectedPorts.clear(); - NBTHelper.iterateCompoundList(nbt.getList("Ports", Tag.TAG_LIST), c -> { + ListTag portList = nbt.getList("Ports", Tag.TAG_COMPOUND); + NBTHelper.iterateCompoundList(portList, c -> { GlobalPackagePort port = new GlobalPackagePort(); port.address = c.getString("Address"); - port.inBuffer = NBTHelper.readItemList(c.getList("InBuffer", Tag.TAG_LIST)); + port.offlineBuffer.deserializeNBT(c.getCompound("OfflineBuffer")); + port.primed = c.getBoolean("Primed"); connectedPorts.put(NbtUtils.readBlockPos(c.getCompound("Pos")), port); }); } @@ -89,7 +92,8 @@ public class GlobalStation extends SingleBlockEntityEdgePoint { nbt.put("Ports", NBTHelper.writeCompoundList(connectedPorts.entrySet(), e -> { CompoundTag c = new CompoundTag(); c.putString("Address", e.getValue().address); - c.put("InBuffer", NBTHelper.writeItemList(e.getValue().inBuffer)); + c.put("OfflineBuffer", e.getValue().offlineBuffer.serializeNBT()); + c.putBoolean("Primed", e.getValue().primed); c.put("Pos", NbtUtils.writeBlockPos(e.getKey())); return c; })); @@ -160,18 +164,14 @@ public class GlobalStation extends SingleBlockEntityEdgePoint { // Package Port integration public static class GlobalPackagePort { public String address = ""; - public List inBuffer = new ArrayList<>(); + public ItemStackHandler offlineBuffer = new ItemStackHandler(18); + public boolean primed = false; } - @Override - public void tick(TrackGraph graph, boolean preTrains) { - super.tick(graph, preTrains); - if (preTrains) - return; + public void runMailTransfer() { Train train = getPresentTrain(); if (train == null || connectedPorts.isEmpty()) return; - Level level = null; for (Carriage carriage : train.carriages) { @@ -182,40 +182,64 @@ public class GlobalStation extends SingleBlockEntityEdgePoint { .getLevel(getBlockEntityDimension()); } - IItemHandlerModifiable inventory = carriage.storage.getItems(); - if (inventory == null) + IItemHandlerModifiable carriageInventory = carriage.storage.getItems(); + if (carriageInventory == null) continue; - for (int slot = 0; slot < inventory.getSlots(); slot++) { - ItemStack stack = inventory.getStackInSlot(slot); + // Export to station + for (int slot = 0; slot < carriageInventory.getSlots(); slot++) { + ItemStack stack = carriageInventory.getStackInSlot(slot); if (!PackageItem.isPackage(stack)) continue; + for (Entry entry : connectedPorts.entrySet()) { GlobalPackagePort port = entry.getValue(); BlockPos pos = entry.getKey(); - + if (!PackageItem.matchAddress(stack, port.address)) continue; - - if (level != null && level.isLoaded(pos) && level.getBlockEntity(pos) instanceof FrogportBlockEntity ppbe) { - if (ppbe.isAnimationInProgress()) - continue; - if (ppbe.inventory.isBackedUp()) - continue; - ppbe.startAnimation(stack, false); - - } else { - if (port.inBuffer.size() >= 18) - continue; - port.inBuffer.add(stack); - Create.RAILWAYS.markTracksDirty(); - } - - inventory.setStackInSlot(slot, ItemStack.EMPTY); + + IItemHandler postboxInventory = port.offlineBuffer; + if (level != null && level.isLoaded(pos) + && level.getBlockEntity(pos) instanceof PostboxBlockEntity ppbe) + postboxInventory = ppbe.inventory; + + ItemStack result = ItemHandlerHelper.insertItemStacked(postboxInventory, stack, false); + if (!result.isEmpty()) + continue; + + Create.RAILWAYS.markTracksDirty(); + carriageInventory.setStackInSlot(slot, ItemStack.EMPTY); break; } } + // Import from station + for (Entry entry : connectedPorts.entrySet()) { + GlobalPackagePort port = entry.getValue(); + BlockPos pos = entry.getKey(); + + IItemHandlerModifiable postboxInventory = port.offlineBuffer; + if (level != null && level.isLoaded(pos) + && level.getBlockEntity(pos) instanceof PostboxBlockEntity ppbe) + postboxInventory = ppbe.inventory; + + for (int slot = 0; slot < postboxInventory.getSlots(); slot++) { + ItemStack stack = postboxInventory.getStackInSlot(slot); + if (!PackageItem.isPackage(stack)) + continue; + if (PackageItem.matchAddress(stack, port.address)) + continue; + + ItemStack result = ItemHandlerHelper.insertItemStacked(carriageInventory, stack, false); + if (!result.isEmpty()) + continue; + + postboxInventory.setStackInSlot(slot, ItemStack.EMPTY); + Create.RAILWAYS.markTracksDirty(); + } + } + } } diff --git a/src/main/java/com/simibubi/create/content/trains/station/StationBlockEntity.java b/src/main/java/com/simibubi/create/content/trains/station/StationBlockEntity.java index 617d523980..7890d5c16b 100644 --- a/src/main/java/com/simibubi/create/content/trains/station/StationBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/trains/station/StationBlockEntity.java @@ -1,10 +1,10 @@ package com.simibubi.create.content.trains.station; +import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -28,7 +28,8 @@ import com.simibubi.create.content.contraptions.ITransformableBlockEntity; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.decoration.slidingDoor.DoorControlBehaviour; import com.simibubi.create.content.logistics.depot.DepotBehaviour; -import com.simibubi.create.content.logistics.frogport.FrogportBlockEntity; +import com.simibubi.create.content.logistics.packagePort.PackagePortBlockEntity; +import com.simibubi.create.content.logistics.packagePort.postbox.PostboxBlockEntity; import com.simibubi.create.content.redstone.displayLink.DisplayLinkBlock; import com.simibubi.create.content.trains.bogey.AbstractBogeyBlock; import com.simibubi.create.content.trains.bogey.AbstractBogeyBlockEntity; @@ -92,7 +93,6 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.network.PacketDistributor; public class StationBlockEntity extends SmartBlockEntity implements ITransformableBlockEntity { @@ -224,8 +224,6 @@ public class StationBlockEntity extends SmartBlockEntity implements ITransformab @Override public void tick() { - tickPackagePorts(); - if (isAssembling() && level.isClientSide) refreshAssemblyInfo(); super.tick(); @@ -372,8 +370,9 @@ public class StationBlockEntity extends SmartBlockEntity implements ITransformab if (!tryEnterAssemblyMode()) return false; - //Check the station wasn't destroyed - if (!(level.getBlockState(worldPosition).getBlock() instanceof StationBlock)) + // Check the station wasn't destroyed + if (!(level.getBlockState(worldPosition) + .getBlock() instanceof StationBlock)) return true; BlockState newState = getBlockState().setValue(StationBlock.ASSEMBLING, true); @@ -961,17 +960,33 @@ public class StationBlockEntity extends SmartBlockEntity implements ITransformab // Package port integration - public void attachPackagePort(FrogportBlockEntity ppbe) { + public void attachPackagePort(PackagePortBlockEntity ppbe) { GlobalStation station = getStation(); - if (station == null) + if (station == null || level.isClientSide) return; + if (ppbe instanceof PostboxBlockEntity pbe) + pbe.trackedGlobalStation = new WeakReference(station); + + if (station.connectedPorts.containsKey(ppbe.getBlockPos())) + restoreOfflineBuffer(ppbe, station.connectedPorts.get(ppbe.getBlockPos())); + GlobalPackagePort globalPackagePort = new GlobalPackagePort(); globalPackagePort.address = ppbe.addressFilter; station.connectedPorts.put(ppbe.getBlockPos(), globalPackagePort); } - public void removePackagePort(FrogportBlockEntity ppbe) { + private void restoreOfflineBuffer(PackagePortBlockEntity ppbe, GlobalPackagePort globalPackagePort) { + if (!globalPackagePort.primed) + return; + for (int i = 0; i < globalPackagePort.offlineBuffer.getSlots(); i++) { + ppbe.inventory.setStackInSlot(i, globalPackagePort.offlineBuffer.getStackInSlot(i)); + globalPackagePort.offlineBuffer.setStackInSlot(i, ItemStack.EMPTY); + } + globalPackagePort.primed = false; + } + + public void removePackagePort(PackagePortBlockEntity ppbe) { GlobalStation station = getStation(); if (station == null) return; @@ -979,40 +994,4 @@ public class StationBlockEntity extends SmartBlockEntity implements ITransformab station.connectedPorts.remove(ppbe.getBlockPos()); } - public void tickPackagePorts() { - GlobalStation station = getStation(); - if (station == null) - return; - - boolean changed = false; - - for (Iterator> iterator = station.connectedPorts.entrySet() - .iterator(); iterator.hasNext();) { - Entry entry = iterator.next(); - BlockPos pos = entry.getKey(); - GlobalPackagePort port = entry.getValue(); - if (!level.isLoaded(pos)) - continue; - if (!(level.getBlockEntity(pos) instanceof FrogportBlockEntity ppbe)) { - iterator.remove(); - changed = true; - continue; - } - - while (!port.inBuffer.isEmpty()) { - ItemStack itemStack = port.inBuffer.get(0); - ppbe.inventory.receiveMode(true); - ItemStack insertItem = ItemHandlerHelper.insertItem(ppbe.inventory, itemStack, false); - ppbe.inventory.receiveMode(false); - if (!insertItem.isEmpty()) - break; - port.inBuffer.remove(0); - changed = true; - } - } - - if (changed) - Create.RAILWAYS.markTracksDirty(); - } - } diff --git a/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java b/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java index b3bdd93e3a..8f8f4f6d7e 100644 --- a/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java @@ -38,7 +38,7 @@ import com.simibubi.create.content.kinetics.fan.AirCurrent; import com.simibubi.create.content.kinetics.mechanicalArm.ArmInteractionPointHandler; import com.simibubi.create.content.kinetics.turntable.TurntableHandler; import com.simibubi.create.content.logistics.depot.EjectorTargetHandler; -import com.simibubi.create.content.logistics.frogport.FrogportTargetSelectionHandler; +import com.simibubi.create.content.logistics.packagePort.PackagePortTargetSelectionHandler; import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedBlockItem; import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedClientHandler; import com.simibubi.create.content.processing.sequenced.SequencedAssemblyRecipe; @@ -180,7 +180,7 @@ public class ClientEvents { ChainConveyorInteractionHandler.clientTick(); ChainConveyorRidingHandler.clientTick(); ChainConveyorConnectionHandler.clientTick(); - FrogportTargetSelectionHandler.tick(); + PackagePortTargetSelectionHandler.tick(); LogisticallyLinkedClientHandler.tick(); } diff --git a/src/main/java/com/simibubi/create/foundation/events/InputEvents.java b/src/main/java/com/simibubi/create/foundation/events/InputEvents.java index 0601eeedcb..c7049bb3fa 100644 --- a/src/main/java/com/simibubi/create/foundation/events/InputEvents.java +++ b/src/main/java/com/simibubi/create/foundation/events/InputEvents.java @@ -6,7 +6,7 @@ import com.simibubi.create.content.contraptions.wrench.RadialWrenchHandler; import com.simibubi.create.content.equipment.toolbox.ToolboxHandlerClient; import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorInteractionHandler; import com.simibubi.create.content.kinetics.chainConveyor.ChainPackageInteractionHandler; -import com.simibubi.create.content.logistics.frogport.FrogportTargetSelectionHandler; +import com.simibubi.create.content.logistics.packagePort.PackagePortTargetSelectionHandler; import com.simibubi.create.content.redstone.link.controller.LinkedControllerClientHandler; import com.simibubi.create.content.trains.TrainHUD; import com.simibubi.create.content.trains.entity.TrainRelocator; @@ -95,7 +95,7 @@ public class InputEvents { if (ChainConveyorInteractionHandler.onUse()) event.setCanceled(true); - else if (FrogportTargetSelectionHandler.onUse()) + else if (PackagePortTargetSelectionHandler.onUse()) event.setCanceled(true); DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java index 8bb1199b2c..f968212acc 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java @@ -49,9 +49,11 @@ public enum AllGuiTextures implements ScreenElement, TextureSheetSegment { ATTRIBUTE_FILTER("filters", 0, 99, 241, 85), PACKAGE_FILTER("filters_2", 0, 0, 218, 79), - FROGPORT("frogport", 0, 0, 238, 99), - FROGPORT_SLOT("frogport", 25, 33, 18, 18), - FROGPORT_INACTIVE_ADDRESS("frogport", 45, 102, 162, 20), + POSTBOX_HEADER("frogport_and_mailbox", 0, 23, 214, 24), + FROGPORT_HEADER("frogport_and_mailbox", 0, 0, 214, 17), + FROGPORT_SLOT("frogport_and_mailbox", 26, 55, 18, 18), + FROGPORT_EDIT_NAME("frogport_and_mailbox", 230, 3, 13, 13), + FROGPORT_BG("frogport_and_mailbox", 0, 47, 220, 82), TOOLBOX("toolbox", 188, 171), TOOLBELT_SLOT("minecraft", "widgets", 24, 23, 22, 22), diff --git a/src/main/resources/assets/create/lang/default/interface.json b/src/main/resources/assets/create/lang/default/interface.json index 808c9c5516..f1cd0232f8 100644 --- a/src/main/resources/assets/create/lang/default/interface.json +++ b/src/main/resources/assets/create/lang/default/interface.json @@ -464,8 +464,6 @@ "create.gui.filter.ignore_data": "Ignore Data", "create.gui.filter.ignore_data.description": "Items match regardless of their attributes.", - "create.gui.package_port.packages_backed_up": "%1$s Package(s) backed up", - "create.gui.package_port.eject_to_inventory": "Eject to Inventory", "create.gui.package_port.send_only": "Only send packages", "create.gui.package_port.send_and_receive": "Send and receive packages", "create.gui.package_port.catch_packages": "Catch packages addressed to...", diff --git a/src/main/resources/assets/create/models/block/package_postbox/block_closed.json b/src/main/resources/assets/create/models/block/package_postbox/block_closed.json new file mode 100644 index 0000000000..8b2c2d66a7 --- /dev/null +++ b/src/main/resources/assets/create/models/block/package_postbox/block_closed.json @@ -0,0 +1,24 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "0": "create:block/post_box/post_box_white", + "1": "create:block/post_box/post_box_white_closed", + "particle": "#0" + }, + "elements": [ + { + "from": [2, 0, 0], + "to": [14, 14, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 0, 0]}, + "faces": { + "north": {"uv": [2, 2, 14, 16], "texture": "#1"}, + "east": {"uv": [8, 1, 16, 8], "texture": "#0"}, + "south": {"uv": [1, 1, 7, 8], "texture": "#0"}, + "west": {"uv": [8, 1, 16, 8], "texture": "#0"}, + "up": {"uv": [0, 10, 8, 16], "rotation": 90, "texture": "#0"}, + "down": {"uv": [8, 10, 16, 16], "rotation": 90, "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/package_postbox/block_open.json b/src/main/resources/assets/create/models/block/package_postbox/block_open.json new file mode 100644 index 0000000000..f348ae5f45 --- /dev/null +++ b/src/main/resources/assets/create/models/block/package_postbox/block_open.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/package_postbox/block_open", + "textures": { + "1": "create:block/post_box/post_box_white_open" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/package_postbox/flag.json b/src/main/resources/assets/create/models/block/package_postbox/flag.json new file mode 100644 index 0000000000..137ff9917a --- /dev/null +++ b/src/main/resources/assets/create/models/block/package_postbox/flag.json @@ -0,0 +1,32 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "0": "create:block/post_box/post_box_white", + "particle": "create:block/post_box/post_box_white" + }, + "elements": [ + { + "from": [1, 9, 1], + "to": [2, 11, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [1, 10, 2]}, + "faces": { + "north": {"uv": [0.5, 8.5, 1, 9.5], "texture": "#0"}, + "east": {"uv": [0.5, 9.5, 7.5, 8.5], "rotation": 180, "texture": "#0"}, + "south": {"uv": [7, 8.5, 7.5, 9.5], "texture": "#0"}, + "west": {"uv": [0.5, 8.5, 7.5, 9.5], "texture": "#0"}, + "up": {"uv": [0.5, 8.5, 7.5, 9], "rotation": 90, "texture": "#0"}, + "down": {"uv": [0.5, 9, 7.5, 9.5], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [1.5, 4, 11], + "to": [1.5, 9, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [1, 9, 11]}, + "faces": { + "east": {"uv": [8, 8, 10.5, 10], "rotation": 270, "texture": "#0"}, + "west": {"uv": [8, 8, 10.5, 10], "rotation": 90, "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/package_postbox/item.json b/src/main/resources/assets/create/models/block/package_postbox/item.json new file mode 100644 index 0000000000..860aa8b322 --- /dev/null +++ b/src/main/resources/assets/create/models/block/package_postbox/item.json @@ -0,0 +1,52 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "0": "create:block/post_box/post_box_white", + "1": "create:block/post_box/post_box_white_closed", + "particle": "#0" + }, + "elements": [ + { + "from": [2, 0, 0], + "to": [14, 14, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 0, 0]}, + "faces": { + "north": {"uv": [2, 2, 14, 16], "texture": "#1"}, + "east": {"uv": [8, 1, 16, 8], "texture": "#0"}, + "south": {"uv": [1, 1, 7, 8], "texture": "#0"}, + "west": {"uv": [8, 1, 16, 8], "texture": "#0"}, + "up": {"uv": [0, 10, 8, 16], "rotation": 90, "texture": "#0"}, + "down": {"uv": [8, 10, 16, 16], "rotation": 90, "texture": "#0"} + } + }, + { + "from": [1, 9, 1], + "to": [2, 11, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [1, 10, 2]}, + "faces": { + "north": {"uv": [0.5, 8.5, 1, 9.5], "texture": "#0"}, + "east": {"uv": [0.5, 9.5, 7.5, 8.5], "rotation": 180, "texture": "#0"}, + "south": {"uv": [7, 8.5, 7.5, 9.5], "texture": "#0"}, + "west": {"uv": [0.5, 8.5, 7.5, 9.5], "texture": "#0"}, + "up": {"uv": [0.5, 8.5, 7.5, 9], "rotation": 90, "texture": "#0"}, + "down": {"uv": [0.5, 9, 7.5, 9.5], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [1.5, 4, 11], + "to": [1.5, 9, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [1, 9, 11]}, + "faces": { + "east": {"uv": [8, 8, 10.5, 10], "rotation": 270, "texture": "#0"}, + "west": {"uv": [8, 8, 10.5, 10], "rotation": 90, "texture": "#0"} + } + } + ], + "display": { + "gui": { + "rotation": [30, 135, 0], + "scale": [0.625, 0.625, 0.625] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/block/post_box/post_box_black.png b/src/main/resources/assets/create/textures/block/post_box/post_box_black.png new file mode 100644 index 0000000000000000000000000000000000000000..c69537f70c9d6029d713b1b350a8b15ae33ae17b GIT binary patch literal 1210 zcmV;r1V#IaP));^AaVCl#^k{`(<4gBB9diL!3^6c!y8VtT(W?2d$>Ii~c zcwPtmongST0I%7$tJa8U^_!yC^)UiKvk{0=NLkn9QXK7VD?XDl!1LOO;}AkfNLe?OWLXL# z0#S-ABY0jLA3y%7_7RaG?|Gey@$2|fO4JGu2twqr93Ku0<@%ZsQhCk$vMg0{i)fBG z4%HeX%joKSB0`NfGC7Wm)AI}CP$B9#J->kCxL8L*)FDIxw{5%XTS^HjC2ZTpXgo2{ z$g&iIz0u?EIIc=QCOw|IY#fK+FpkCo01yPXmG}c8_ID03jOGY}TXm+91LN_Hp}1^B z?p0XH0S*OIIR~W7!^Q}BUZ<#nEThT+c|O!}AFa!Qm5Bg~ykR*#B+Tb>uFYmM>t0RT zhIMt#JT|!3^>Z^;Ibqu_q?9P@D`JS4^swkT(Cuz1sC!)>!)UI&(`#Sn8~1>&Aj@(kT=Tlu$A^Pe?8wLg z_EwiIzw^Tg@i!3_2<-1{VdM(T!VIV97wX<;;(K7we~ez&$K~al9D$ajV$TZ7YrU?o zcshSHo0876P%s@Zhct%1z-bnTB5nW zQXe*;?RVh&j{pF};T0NAQz>3V^L%~v+i;r3Iuk4Z;nm51LiMvl@col-mIuv^Pf`v5 z*1^HkC10mUd)pWeuaGQl0I2kV{hckv=X+w)ia*N%5yv5p_O|ir;!-VgjRHj@(VIye zhd4eQ;Pt!rz+GY-7%cv|D7=OVl67$KRLyiPS6~s%5ztaadfu-Cbd8A{7IweU`=?wr-<9UsUl)@}a@nolu(RhO4@CvT$8V0h# z`ZNUO6OImbL-RD>XSQVksM)p)&ug#k_lsz*4p}$zl|3R#4JG>i`-~9zD4q`xoaI8) z5r!f9{apaSAJ;=;6DK7R86GnVWhd_A0mz3^p855m@#M_>V%N(gFk9AfvY4&pd8E*gIH0aEvb z_t+bRBuS7Y3A~1-@}T^%5njVG(YZn+C6Eem+Ql Y1Mom3!i<9khpZ*If%<`%aUYH?wcv z1pXVza`|{(t)7yyd^n4=D3!6_e^C_oxNngbW9lfkUOy)Q%Gwryrm1O~+E3o?-u}Gi za(UkOIX|E%1~g5LQW~u@0JPSgXsyNC77JzOD#bzrDJ;}`PyYY2r`|mj$xWe>)?`C=rCxk7AyGpw4lK;hzBg}o z7XBOFcKdMN?H)a?@6XOvC^h1Ed?Si(k-c*jMUl6({r<@VP}Wue7?Wd6UOOKSFP&+k zh2f;ud@+ck8vt|?vs%o!z6x4vwV0ukxK;ag0}Ft)7Nr8p;zagdcBYG_RDkpV_|8?m zg?;Ed^Tngrw;+0IykzbCxiiAYU8=BaF$ZKHv^Wi&Jgz32)wo U@fSBM<^TWy07*qoM6N<$f)XT<2mk;8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/post_box/post_box_blue.png b/src/main/resources/assets/create/textures/block/post_box/post_box_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..3d6b666dde10d92cb660ec32147edac4c6d2d320 GIT binary patch literal 1238 zcmV;{1S$K8P)A>v6#tzwk#}$R_I!KUNRhn0G;opPE((ef1w}+8BpMVdih!V^0_6{&ppNnnq@@YL zjT?+oq9Cvk2z+uP8hm?FB(LxA?bq$e8!yG|o1NLcIE0jpbkfaxZ|1%Cdmr-__`k2l zjoaJ#_MIDzw?4R&XK?^#ScrxLm}{3o`z#KSjy;9;!#B4Z0C4TyFLMCMk}0yoZKO#E zbL}Qrvt3h`4)53aEK8=G>3c{gBO!eBI?Ww@?ikbx-R^*&%G{q%&_36eP~@5 zixx91Fr$Q9b6l}!%{ExG4b5@kk0*jp&M7${8$rn@lt}TEWmDf1F^yubAQ}#8@y8f& zx;DHdL^K?TI~g4|d+RuQ{76w;Gs3WdF={ygaHyj_o}|?rpd9iKCxTyAL192Ot}>+6 zby^OPLRpSN5*2&b2Uj9E~;zUJ7!pLx;FQ!$O+AH!J6%wfturrJYYnW z<62$SP$)St_5>{|l8pFDy(cB2M~@$g91#Xk4hZ-Ph=iw7SmYd7x%8%hTF-fs$vs3~ z#FzWPlB^(`aiyJnM;Jk?lkaf2XMvIf!dpqU`k#JOhJuz%O9b?TO++UX02}brKFsqf z?0(vZW&rGD0R7-;X~6Klh&?H&(wwd>crxD~PD%qjZ=b^=c_e#ED5XgVFA2-bD*HvW z)A%o}fETT=F1?Yr&H^SYuln@YpZ@i|3;;g*6+xyoTMC^PDgXSBpI-{qR}R5v z7q8^6x6b@0kp#`o!TccVEc?miiuA@k9LG zxGIQp1+ZqD_lRVwbh=KygAms-pU;&G+pF)Ls&G2mQVq}?7st-W(2^87xghWPlt3Dp?t!8Uj4lE`L;Fm6;}?xTHGs z0X#wJIbNiI&dX?2WtPZ$W>}*6FvCI|$8g;qoUV<(hU%;!Pdu{6ghJH_nOBpi5~B|X z8XAvg7bG(;AQ}!z{%9aRP8KC$mV~wPtjY=lQWAKP)2rn_;iFEfE1hw0vG1<}v&{aGNry@Nkntk3kSoV+7K?g3X9{S4wNM+!J2nJUM|wmy1* z1DF)Ahk+0NF7)6)z!i9YDgqDQUZ0{r(SX}M>x4(_6Fyfv_*iW$5%{_MR@&R)ZF3I< z2iRH#Y8?{oK2qR;Pm4HD(KGwp9NGt?I3| TjvUIA00000NkvXXu0mjfNVT7m literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/post_box/post_box_blue_open.png b/src/main/resources/assets/create/textures/block/post_box/post_box_blue_open.png new file mode 100644 index 0000000000000000000000000000000000000000..038f963a9770e4c3956ac7dced22a42ed7133abf GIT binary patch literal 339 zcmV-Z0j&OsP)a%?fQRfrv+2k4eJ!)w8*K-Fzm?8y0 z#}PVNRn8yJ53Sd%CI_QR6Q4x}fErKH$qG@1=wd^<)s5yrN#w~H#+{(X(}RJXz!WLM z^U-m;8K^Wl^szkvuF12`!Y*{(x%CYCqF(Eo-64a%sMl5o^?&_^Mg~uhH%{-)4!D*a zoq;7sXJCmbQfwZ-!R)d|2Er0=eap5?2$cMB7Xl>_Wr(+aYa2w-3jlI>iBK7GFsddJ lp8vh(o{x_2h>A^R@CCbxl^169sEYsq002ovPDHLkV1oKelr8`O literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/post_box/post_box_brown.png b/src/main/resources/assets/create/textures/block/post_box/post_box_brown.png new file mode 100644 index 0000000000000000000000000000000000000000..725cf778448884ddea56e2b3299b755771a7b3c2 GIT binary patch literal 1269 zcmVP{mE_D=?e;k*;stD-^V38BP=TdjZ8Vi^A#XD5Tr3>uc02PI zS;|YJi_K9I@tAHrR=oUq8Sh2%msY^b=<7G$nXTDSw-#4@y7${ZzSjcy_~A!0ui4=d#=Omd<+-kJTm1cD{U`$aQ?#|F3hRBwt^1%BuO) zoH9`qvAMZLYop1@UtQx*`o`ntHmCeq4@Dj!n17haonK!X(_}G-ZjdFOlpps4^>MN+ z2}PV1$}_L49MG4_7kya7B4w|iA#`ucH$tW-q3e{5FDK=kR+4B*s5PRfuu=iaP?iG| zB|o&*xnoWET98&M=uqY)kSlB^Nc#FSXrw5)YwrP9}PoqW%wE;45-m5L!d fzPx_7T&DjwHX0nF5tFc-00000NkvXXu0mjfrF?B< literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/post_box/post_box_brown_closed.png b/src/main/resources/assets/create/textures/block/post_box/post_box_brown_closed.png new file mode 100644 index 0000000000000000000000000000000000000000..d0ad39ce5e67a5371d2e666c633d75ea83ba78c6 GIT binary patch literal 385 zcmV-{0e=38P)}iFal!5yV}^1LX+L> zIuR|enw^=QdGluAzv12ATI&hi7j&#!M5i}}fz8Nt@T?w%$Q7ySnM1JWdN zy4tzEtpPx~pC4eDXO0d!=4c=`2MsiA`xG1vo~N(gpV@#^wZp`QuMK;yHtez5xu$@g zOK+vU9hna`+}&IqOH&htQ{LY9T&8pEx->N(2i?mapI;pSPniaQ z{GiFDZf{=i@?WpnY>|jI^R%e}Sf(>_sgVSjvOp@+D<^SC7+sK1u}o)e?%D~IX%K-w zSO$>FV9Ej!_}C7BTYgW_J$On(dv2G(Sar|3T?S*-W1y=a24mG@uv%}O(aiz5)|}12 znzI>LqfCS4@t1Vf^ch&QQ4=HqNgSRmCvk`*V525&=2??vyRY%)0v%0RBm(=zBAk*- jjR<_U`+}@2+6z7btZI?OAZ?Ar00000NkvXXu0mjf!F7*} literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/post_box/post_box_cyan.png b/src/main/resources/assets/create/textures/block/post_box/post_box_cyan.png new file mode 100644 index 0000000000000000000000000000000000000000..07ab74a92a006d0db27b4318f471b97cff5dcbae GIT binary patch literal 1252 zcmV4}&w9tdcPj%040?)i-Z7m5jHV2!((J0DI43-pq8t`B8F{^Av$l z2nEa3b_d7KqB2grgJv5BXP`55F4S%`kUb2Oi|7blBscZL1n&XbuymMM1qaPGEXU4- zNtfq!kn_qAtH9elQu2_(L>}sjEyq^LH_C{6;$wib8 zMLq`r0G_WPCZ2vKVinL$DbyJUC8_OJDt0Pyb8JHsortN7)|AJAybDA<4$R$3Ez{t-HV{8{>I5CJgI zI~!tR{KYR|0>G8pRn%&6UAk@;Wj3J<4-%*dvND^<@QKLyhrd61Ayi*F1Ru2KhqDvL ze=-gLrG+oQ8d5v8A3ucab}{+(djL?F1J#W+C8s`d^3B&TbpdnW9m0P65Px64p_qCF z7@Q#zGBZp9&&Sku2mbs5f*{B!WVh~KYEZ5(XVzn7rw(!F9xTVs)T-s!YKRz|!E$Vs zh?ZkR+_{IcQ^(|+Z^5!GSe6BL>#mvus?}=WCaVEXPsq?rry%GPGhZb^5MVNy z5qi+Z2Hqh8&qpMrG8oD}TFnML{|K(z1?N0F*^&q9z&k7?sy@J|WQp=)834?(QwN-M zsOU71J*7l{P|&n9InRV3A4)o}qmg%FY~UTnQ;Ahn5}K?6Ap{zY88~(gyL;K3P$N4z zm$^}HtsBoH1SC%~f>eJrp4g3am)*cwcVEfnuB%WOm4uMJLV4!*DhKpO(m5$R?r5D!}dgg~y2gH!sp1&>KV O0000i`;?Aj)D@E zp*+h@5i4)9pP&CS0KK` zzc7ZjQ5V!Z literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/post_box/post_box_cyan_open.png b/src/main/resources/assets/create/textures/block/post_box/post_box_cyan_open.png new file mode 100644 index 0000000000000000000000000000000000000000..bdbe5d537aaab4c978cc8c585d63c4ef5f365661 GIT binary patch literal 347 zcmV-h0i^zkP)v^Js@bmN4XX{Gm_`wjhd?wu6#hfdhQ)aToJzShS z0Dh$u0A(gAGijCI9+QpN3^y2$Ea%rM2OykIC^Lyj78H8L>wD2Ejw68xb}04_2&a>8 z0n^!T?hP;8r^COzc9}om(pn(3-yw&0O0-bFMx#b8QFBx%$xZ;OXkp z`Ez9lToY{VfeE(uzyy_27(aePt#r!+-vsg94IlCaBJtxc#F0QG3u2jW3Z&^00PpC8 tSZN015$22iU`UzCuT8zbCe?|N=fs5v>y=z3nfuXHjGe8a>wFpa2<{up5S9iGQty((!v0gsmK>`8R|6*DCwb;G!cjfdu-_{P)ZpAw#9Zx*Xb$@I7XqW zJ*Q4dzQ_z;mvi^&!{g4Cnk<2v>e>ja3?2?5pvFWHh6v%Yjx#?D@hcp-dehG9I<2Ro zfr0eA+JpRA*5KO}Ae6^W^?P#iv~EQDfX09cUlk(bsg)KR1N#SWnv_ItkMTuf^^m%k z*nGPWbTxBTH5uUvj`}@ggr=i@uL`$nU|^}ewa%{p)*lT*yDE$CI-b z2#+Uc01SIuL~d^Oooqqm=8SyDDA0S6o8x2)M!tiSEgE-5zC*rxV5Oye*Nh`%XI-h`Sj!B zTGZ#eufO8(@FwwWZc0jrRj)P0vpK*0@n`2G%K?XERS<5yyaO)4wWv=NmB<{AAFJeuXrnTUP(DX=l%x|3f)dezQcI@2>;+V zKb)IDEdwByJku zham|NgbwknX4(@G=m^xEF6nysAt-gjl%^EBt!G#}VD<;i^X}PfYP@};YRvQbv}L#u zV&i+Crip2|N|l{bH?$oWc$Tr_LYBrPY?nc@BcNwGB^6ZNYIJa&d=WQFZ+_{R_g)Vy z`b{UzjFBZ3ttydH5)6io^8nptl9;JRD^yZ(>*$bpHZMWv`_2Ad8N9Tnq0#`akpf+^ z_PurL`e8_au($EO&n^-pWYf&&hiwJ668rvDMs$}+QclF4FwIAJg5`3_;o(h&gNVN$ zkDEedJw>e>zP`3ou^u6){uk(vJv5%G<`g3?r!{{*HGfVvfv`i?F3;*LYyhG5=6QcC z?Du?haJ>c~G(aeXM?r`P*6u4wP?aRA2BFo6E?Og%4jYtd$*X&1Bg#2l=BU||T8oTP z&uK(TNl0R(b>8*Eka?BMq2C;-?D5>DAPhNOmORf}1Ft&2(tzqhWBD%Y5Qd+-T;@V@5%LB3AC`iht%X0-!q!f(^dE>I!4J@+@RrC<2(ie`W;Y3Gec`xw zXJ_Z*oq_*Gc6EKTxxc&3&Mz)E>J=%4#r&J$XpEiJE6)8Swx`F34508{0dRGVb9IRP z`SE^`&1_ZG54J+p127nkajr&05Get|A3)VNpE4MYgFRn00aoe}k#HeWGVQgP_F735 zB7(gE$hB#~P*rDvf6W)nX0J!@b^)4buHN-8QX-}Bn|Ih$6Qq>nQS6(?8UTrN)$b=d z*j=K5ss;@V8u4RDG)huU;8+zff4J=rm{bsxUE=&!pN#wk~rHz z5U;3es)3PVv1Zb3hiv<08z$X0!(x3{fi27??`&7rmr2>ivt`X}xzpeek`kiD@a$as P00000NkvXXu0mjf&Q+;z literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/post_box/post_box_gray_open.png b/src/main/resources/assets/create/textures/block/post_box/post_box_gray_open.png new file mode 100644 index 0000000000000000000000000000000000000000..b49b687cde067d3fb08eb6e4b55ec11a48f767b2 GIT binary patch literal 332 zcmV-S0ki&zP)T^t z&gXY`e$R&ghIe{)zPh@+@Q#j8R$>J;QM|prkk00~y;#ARyqCMZx%L18YXtyP6c|&q zou8i`2h&_m>!i*3A{Kzd*&KjH9FkD+Y2JG)p<)q-JuW~{ZyMBMQA$yjIUlAPOm{h@ zrns8*4K@;f62~xh)=Dr%F*w|YE_dL;F6eT7k+p=buD{Up;9+^^?OZtm-vxVn;DWt9 za6v5==f`glk)8*E3(}yWi9;%)t$*P_M?`T*8Z^TOS#}SARa1N&p>=|LVx=Y+Q(%>X eGAAp)J@^8C!IRSB+h+Ly00003Sy#(Eb(rCb-f1g%Exb}04h+}w`P?KPC>3o zsD%T~UW;fNAQ~2yTc_c<1tT#kP$V)&g$d1G%gCC&7KyLGbK%I(c-_tASg(*O{yT3_zBO^dNJfiUH*aRG=75 zCPr>G7geCb#3(Qa0#yoWl}^HdWzNS&59BFHnHae)=e4`v?$=JVR8Y98u5)FX!&~hP zxf&ChVZjp4Ixco6!-3IS%xjgZsVMG^CfWZG49K)RDb%}i753u)<2z%65#xZyKpwuh zl!jtjiWq2J=$Mpr+9^Xh%X^4dt{N>b_JK7mOnik36NFQz+fR)Xn!5co3wM~5Fc6L9 z(%$NS{nHWB>%>=i1UmaZ=|sX_o5A*+rqe7b8f?$8S*LYZ(s|S{eCx&$oki}ofhupS z?HQStXS}1_f#GlfKy8}esM^I;pqR@ULpd|Nu(DpoJ5Bz?3V0HI`O<6Y#yUJFa#bJQ z{_$Vy6#yT6_5w(tjS^pzHvZ`^KRs1cpE(7e>|RP=+_3(Wae&(8FWyOYJ3V(W zXE+?-yn7K~X%2MueIwU>BKYRunJyrrvE7p;hxfng(c-DojveK28xVXN(N?~h?gv5rRKtI~~i6sk@XWmUP*C8j?d z^rP|7nIzwJ#zh<+=kohA^Kr5YgsGe@m8aedD?q4kbJ~Z63SveFN0~o+Z393kgV1v8 zaAlW9<$SRuOA#nGqUw_h$iLwV7zn45?taRHi|d5n-^sPz?87OID3Niw5#8)(ARJ#( zh#>p6D?X`;&+{TRJeLPfCbMn3B;(efCpxfd|35b-CmslLU?czl002ovPDHLkV1f`p Bb%g)` literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/post_box/post_box_green_closed.png b/src/main/resources/assets/create/textures/block/post_box/post_box_green_closed.png new file mode 100644 index 0000000000000000000000000000000000000000..f2d9e9babd312921160a0b869f6b165cf6ea0b00 GIT binary patch literal 384 zcmV-`0e}99P)f!bzMF$r8s6W3EUtU1JrRdO>+={(DzB&NFdeH*_ znu?>X1R?*tmoqjUTdhNiF*yRny98||zyc3m08}l( z0`H6*GHee$wuj#8f(0J*9{_Nr=&XWO8j=51Rw#;(#hfvMBn?b<7W!zeQ#eRRAK818pYTl35z$FPZaaH8Ad;E#_S9m~&0d9BW!j0D3OH zmFafOu}lr9FICIoNDQ_)$Z$xO2HM$VHIkeY+q7+MNzSp!>UjtHV4R8%CmS-WZN2WE eA5ril#eV@aBCaO++$4zr0000hhIe*zv3$6^^-iwNmqyJ9!aC{eJJHbrZf(?zY$8kC)AhXv5X{va z03A!RSmn;i^JL>R$2EFk&IM*|5DhwHv7$4QXgMYM)FpAZB@oRvAID9iLFe1RrUn3; z8Uj(P6azUIh&E0G;2SloY^*}no^RC3O~-Pp@F$ABzLl#R6zAH7Vy|zs1t`t63#AN3 zcSG;b$_n_d*gFGP?45xtY-(_M{05_KDTBZj{b9;-BB{5;*1yng3B*X!PsFCdc>Dsu x;`ESETN=F(_r$ekoh()?L=FA;##l~sgD literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/post_box/post_box_light_blue.png b/src/main/resources/assets/create/textures/block/post_box/post_box_light_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..6d483f7c645c96ec170645bc5cee4b8427d1b9c0 GIT binary patch literal 1243 zcmV<11SI>3P)=Bl zp&%B-g;;%9JEE+9<8p*=`0hRcfOT59-)@S+VHARVO zJ3x6YojA`hq_-fMX~NwsLt9d~r(TwR9Q)=yC;vS~Y?{IxQ?@ zGiWdugIZO{6dp(yOZap5j-oi$2%Zfz=-c;PbiY?=!hn<=W(hYiT`UO$jfoTkV#Cmj zxK$At69aL4@-BH)-(%ViW`4MSDe*u}(uTOa7Q(o}3)u{S&{LF2X3CBjXe})DSvsgyVde6u-?)s0 zYzE){xRU^Yr%s*-2>WiYj}db*Yfa;!+v|rVm@Ak0-ClnRL8DO*PbA^zOSlmXBj%#P zrYF?rakPW@56yswjZ4R$4jdD(jj5=&e*WoS%QXPtwKvZNhck2dW_t^T!V%#%U>eyp zr_t^8@yp$NiPq?E0EgiE0UYzu4`2Ym;mjN|nRx&q6tkA2UZnFt}L}e5w<7ue|$M2QXN> z33lrm%u}xjqMQLHZzTTEQ!1Umvk7Z;9pmv>5x9J2<3NRb+ZAO#V=XRW{?&`Ha(STu z2pb4B5i@1O%H>5MTDg3VxQ(|05GU8 zvvw1{#-zGU!f8;qGi^s{&AI~GFMC5@W3YBpSWXz5wu8ZNh(h5A0O0pO8d%m&LU#lm z27N9okGo|Vlw$PbK$pfz@j0<*t{4U$@%L+0foEJ0j+h%sPkpU0K)zHS^kdQ@@}>EG!*hM`B<@NF7k5wh>CJ zV#h^tq%t(m*iFRBP0!Egdv{L;{u|!K!`o(fa_F7k-fy%N@Og;UK|FF^zhA2Yu6HRVe@fQIcXkpMvoaJ`Vu^ewQ1fE+w=S zsH8xYq^94|ax0*v0IMI;V>KQ?jR%ekR!3?G5Q4a8>d#_tr$VvbM`=Y&JHST2LyXs8=M_H4X?dF+4Te4iH!~wcCKC6v39ve zfO6@UNPrv5*@11ds=q1OZHUwyyU(at-Q8eWEUN^;@-ah00000NkvXXu0mjf)MTjM literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/post_box/post_box_light_blue_open.png b/src/main/resources/assets/create/textures/block/post_box/post_box_light_blue_open.png new file mode 100644 index 0000000000000000000000000000000000000000..7e17624f9deab626a92897e8b05fa78a8a18a099 GIT binary patch literal 358 zcmV-s0h#`ZP)YU6vlrEDYTLhRD@b^3Iw0P#lgu*2Zug^4^SV%C(sAz6LfIU$w3@k1P3<}93+sY zNR@hT)4~nJA>K5>h@p$$bnbWlf1C^d4deLgDeWI@8{M;uR7pX@c9^_8<9a^&t)w6x z4NKhMD&1I*F%EEHEyi0aeaH2 z{RQm|f>!{x4ts1$L95-#J2h;FSrlT~4#DL)LA;pY3;2kaFH&e9C;$Ke07*qoM6N<$ Ef^OiTga7~l literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/post_box/post_box_light_gray.png b/src/main/resources/assets/create/textures/block/post_box/post_box_light_gray.png new file mode 100644 index 0000000000000000000000000000000000000000..3ba1295293401afaf230978f9b274ed9a6ea3915 GIT binary patch literal 1220 zcmV;#1UvhQP)!S@RpXoNdds^+nXFCs}&p^9Kmrc2w}l>XIV)p$%h6(h-$UMvTC&gDMPp}aJaw6yf{sg3t>eL zNEyO$#vZqtJM4f`l6l2a8IEHa5l9)b4gd_o0KVVl=ylym^0dAg0E)#K6ia0&CHY|6 z7ATg=C>CchiELZIwuKh$EU$%#5bgDkSx&(*0>0lhoS@<(((|e7`hJ(ABm?bsCy{^P z2!(tOUKpU=?(msL4Qy>S4a0FK#!($5YJiMvZ)_O6$oX*%k%QH0C3y?tdDS6}(`hvT zM0G=YdP+!6*EzksyqtQbC2hl`drdNOxRB2Qh-$)hXCZ`@aL{#UxehYK)bkprcq(+= z!$ayFU51$CI#NPJzqhuUQ3{AjH9&?4A|gF4dX6t#SYSg`WE7q2nt_m9?*nPwKoE?L zw3<8Y1W~KG1EnN_AT%PQXm#EAZ~72Iw3afA5NNDEMz4R2T5SQvQaJ&8u~Y^CbXrfL z{^~Km{;V zJ%V%gW>oIpj8O<9h?CnDotY_Go*s;``a&ng#3uRCY{ zlW_n@-MRDih}!Aq`V)BG9zM8r3jh-DKx6eW%c)P?zkBzU0?7D&7n|!(@Y=!~%+zmy z5Ec(3dZ%kOcTl@@5yRooIPmhd>!%uATd5oCwCm2|#=Gwr?==whYugt5o>L*}dluh& zAK7dc*=!beXsj_`Rorg`D{F_sB`zpiaZ#kcU~)2Y|HicX_HI zgGxzMO7rOTkKuWHux;BYNOD-8h5#7Q1JRY$_azV*=X&yUJO~3mBtG+z!RR@jJb+GF zj)6v8CrwevD~-QDMWPAbAd7$mM|T$dfthsx9bSSTgA2y3+kBNDv`g|IL;x0u*ZXvI@tG@|%O z1w@eQHQ@VQG*-ur=+TcqFn?{Oerh9HiBAp%Ij{Ye3%s0000b;@5JjIYDtp~U0Xig~B8qYnE|4>%a+NdW0`%MfQP3boauo>)Bq9o9LelK)Djg}J zU3Lvho8NeL_V1rRGlu_0GMT)b#^cANs-8~92zjp9Y_^o;2zNF{*zb=~uBx6BfS%SC zfVMr*G)J#o*KZfqTy8kL@wuMJuRvLjXqqEMk)c!u;J*MO77>fqma-iAeCh;5EJbmC zpj1Y^e5GE#MlOmX!@U7Wjgg2j7@X~We15Upy;DW_$&UU@>VqMz~+x3dYZ0^rJ7q}m$Z4Zc8l#;8P`L>#! b)jt0N^Qy45*9f5r00000NkvXXu0mjfrgW!J literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/post_box/post_box_light_gray_open.png b/src/main/resources/assets/create/textures/block/post_box/post_box_light_gray_open.png new file mode 100644 index 0000000000000000000000000000000000000000..8cca533a370ba7fb788cc0640044b0e36f45f4f2 GIT binary patch literal 344 zcmV-e0jK_nP)Czz*^~_}%kDjZ zo>CToqSzv3StZZsFRjy@7RSR%>uLQRkfsSzmgLI?d#m`=`-XWC1q7iWxws@vlXigC z79qk;Gf-(lgg6g?Z;b97>_XR`@6w85d(`+7^;y5(!KtXv`tB9#_xcNs4knX{ce1ks zz9VOM;KIHI-1_3;~&vW*UUj!Yk)*uA|oh=QYkVGsr6%LV3R*A7^(UjewfzCkHV q91p9Lq9{bl5+Oon(`VLJRRLd&qnL^Ow~0Xj0000%Hpt@p~Wj8u-7j z+J`$^^N+W8Yp>sac`kScW?MKLOwbA1puON3#t*nb`|_h7Y5=f(>%}<$h&02=w;X~e zc=E<&FvqGW>))AF_)U>c0RZEOV;pgHcyKVR2q2p4+lnUAO#S<-9-{nNq?utvnNO=p zn@-TiIO1To1?E_$5}qlcf@kOiZN=*ZZ7I+PqTkLHt+E#InPU|Oh*Uxg0NEY`whHBn z*2_bpc|b2V{t7 z&zu6$C>|+3Ij0cNam1CEqgei*4JMWN1AxEkA>;|p1`{RI$brGV zp`o~9MDA5N2S~{X!wMe&gd_9kBuAhVw6!YWMGoi|>yVb$#W|4EN-`-VC*X=tRJiQ4fa<(07Xu?zD%}Cp82-QgC-I6xRzHr6h;m_kk4aqL@_t`I#Rj= zgL}gw1Vp49Q1Edx40>4f7zfX;DMi^TL&%e&hxn!=#Mk>kT~|O#vpuGaP%rN>6+7KC z<*jzM{7gS8LtTzSAlf|#j{$4|vt9ybw+%tFUIM@d-v^>U&lSCYXOhRhp%fG}Ad2NP z@pOJa9u@|K;c@O!(Im_+Mkpl+d7^n}?ibOP@gG_N4_mjMeqr9SfXAAJsCR$a|HpEh z0Pxm3Z_Zus62AZDYjnF;5yc}7LJ1x1X+`k}zy5JpI~6kk4J6qdt&3a7asyoN5>Y8v4BHr$(lNb5L=i!n@}hyaOz-s#v)8T4n~xPtyye*plVc+IO^!{h+b z%jcVCgGr^{>Ao%-u;{+m?*-~`d|!W)TKfpzE3Jy$Ce3t$XBa^$4mQ?s@cGavJ%6jN z?t2T2jJ(4RbmRBC?VyUj}+2%yhs7PucJ{uQztK&ZK>wNYzt|cqT9U+f7Qd_ zepnK$P12=7rM%abmk|Q;?*jViL!-D}SZZIFiKp`kg+)mycv30P@>ykoK2$FIun;^$ zKSwCoSTj7)laM(U+#A*LT`x()fT9tJ%1A}9k#OCUY?q<6Im6)>_Z9tU=X7Z!5@}{M zqNANtnS^XBgW#5eSpRS+D+go}icQH|Sy?f7C*O^*Y?aUd4IIuYi^X7wUBd{&wWizEP69yL!j~pm6;+ z0HC#m)>7=ee|n!x~k9u9je9jGAAE+^O zsnBf~=(dZ5g*FQOPiR0sDOes2^z6qcn&xHpY$8GG*QJ6s3dg4gfSF8{wYl_wDaMH_ zllZ`AsRuN8z>x7A5)U44pR+%!fv|hQL?Y)v>Ka4J8rQ}KtSd?yZAa3U9u%^Guc@Ry zmg2~#9&lhcKcL;vY)qR$yHGn}z!#>qCa@{}>}DKwXsC<%UpzXlsO#922><{907*qo IM6N<$f_SZ_%m4rY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/post_box/post_box_lime_open.png b/src/main/resources/assets/create/textures/block/post_box/post_box_lime_open.png new file mode 100644 index 0000000000000000000000000000000000000000..2de126237148857eb4aa8d1bdb8e246b3f58677d GIT binary patch literal 338 zcmV-Y0j>UtP)EGFze`fz3_-}Zp*GKD%+MtFv1V zATY%z0I3#IEtT@({;k!`#fD>5#R5}U04CFzR0}c(BRSd9G>YRvM5K06`(>_!?*vTY z#%&h^WJ`mQyv+HoDFwu~5;vjiu9~3!{=ZPq_3Iw=MbiWM@t`jn9^73%c)cq-;5)Ll z2aas*fg`4{{QlA|7_kix0!Q?0g}j#=w`mvRL4?dfKd#yWN%921-r`wF`jZG8^6|tnZk{)`KdJ>97i(sM9c#<9pZ7JkXnq#04 zK?))?;>l84ylK-)K_Sr^@L*;(6kQxL-^86wOW7V~-#6dPtg+T(KNx1d_rCAF_r3Rj z?|TFP_c72scca^wnH>23y>GfIQP`Hv^4c8^)F+U+N)&z=U~E^ zgkw3zx;$S-MJ5O9*Jbtus+UuqVQ<&lm8n42kH|g zi z*JCQo6a(0n&D7u_MqLj-3`(c73-K23sYK~m+m=mhHPn1DFoyxt2mzlAGoI$!AZ+TG zwjQSnme=l-;twz~>=LwNme=lRnK=wxzrUDMTr@&XTEqaPq2SSvKp6v0ViP4wd*DEQ zf}t!6;!J?HSe4vrj(!+0htipmzCE{*%3IC&lFr+{Ts%MUR85A!et9iCF?eLy1yWDh zmW}5&a0*_8G>s*dD?&8mS{%htm}@mC!wdt$H}l=Z#P$1&daex+42U9C2!k0G69aGV zdqan0WFrNcWPwLkOH6*Q4hVBSQAA0MZP_~K%~LOITd zJTU8DpcRKqa)hbDLnXIQ4ITpEYP`rze?`-0?#=7ii-IC;WZ2a_lizwA8W;#thz7=q zq5^oLM5UFi9cx-~-jB8w|Ct%^tntPE!`<3;*j33yeQ@j7e=WBH@cyY2-63~3KU`kG z^Y&=BLFQJO%V<3gxxM`Rz#pBzfkEQGy41Em{{bohL+)-|_az_=#g3gdt+>;3mAGuj z&RUKxLzI8Kbo05q`obajaPRBgS89X*Njbp4&!;bSrJT;Ut`G#Pd_DOoP`(jo{R^5e zb>i%e&tK>O6+dh;-@3xFU2kcknE{Sv_nHxvt8@z+*EltDl+De}oWL_<$G22Cw{kHz z-!|$t_-yPWJhzd{RnKkcOT_8bbpfK++cWAmIQQBas?{phYLzo%$8ju2Kj{Iow_`b_ z^_8WyySbVTu(Wo!WVvJ2`rh|u9~mVvQ4(`CUM%hJv}4|V`Rx+DB0Zf-6g*0allzYF z$*tL3>P^>A==)w87P-@Tm>CH`T+Wis&CRTteP|fqhfN)C=~z^v*gNX+zz^uOWA^VK z&jC`_t6rm;c`3W`AWd1*kYc9{P!X&Aun8Mww@KccH>2EkLzbQE5sRUe{Y4{k2KZr9 zHxLqI+p>AmdV=Te0pNijz;L!nQZVhL^Cv3KP31)%^nOgF=Qo?i!+(xtt7<9mguk?Q zmz?MH=~57O+Hom8i)*z3W>dMv}QizHz zRVp;=>tzICli6M&nz=ov>2oU=w=6_a66Fff+{(oigwxguRHC$t%^!=Ra!5gV$~p=_ lwOY;b&Of;PR0I00{|AIsCMS|?kaqw8002ovPDHLkV1l21YnK23 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/post_box/post_box_magenta_closed.png b/src/main/resources/assets/create/textures/block/post_box/post_box_magenta_closed.png new file mode 100644 index 0000000000000000000000000000000000000000..bfc59e6a918bf0ca5752c43920d5f63480396051 GIT binary patch literal 394 zcmV;50d@X~P)o z*~&m|>=d!`P3Qab-Q9PF|3*@tE!Nq^G`T;%S{rMSLh|(f%>Hl>_cqp$*G1$zygf+( zdfFNQin=7POV7M`ec0;ed^>~8`+C}H04BpRd0nDJA0-q3N=TomtwCFjwk?z4*!$CF zGeKhwO7wj|3CXOQGppv&6iW1QH2|pz9^d1Qyj^|N6vf-Gv0#NC4Z`kHNKSW;0FXkW zgGOO)8fxH@9Y%vJ(!s?d4YX~&1`fKjRu_>5=gaHl&uqY06HO8#bw;>X7qU|vY2XaE zm%B>$I^kNO20dpq)}U=0b?cItO-`tRC%DXSsM?w-2WV>;4YDl)fV+0dWB#&D;66-I omuRa|Hom<(_vfmmShe2&1wGcYubA~kfB*mh07*qoM6N<$f~qsJ1^@s6 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/post_box/post_box_magenta_open.png b/src/main/resources/assets/create/textures/block/post_box/post_box_magenta_open.png new file mode 100644 index 0000000000000000000000000000000000000000..4084ca4773c964ab7ec26bf8c7d95f247e4e4c06 GIT binary patch literal 357 zcmV-r0h<1aP)=!ethkO)0)SyKAkI>*^9jW)M|>8wWN)=gcg5wv z-C-CE<^`rd9ZZ$Pb6kqI#blu3ybTwf17J(zU<(EUkeymexQUQzg-Q{05=&ng-SUd%L6Z{UdAKLJhr*>uWx@chUD> z(9R@z0pNJ^5TSDVeu#cz&+&+}6wh%PKVOl|=AC{4)`ypzhRyyU00000NkvXXu0mjf D{SBEG literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/post_box/post_box_orange.png b/src/main/resources/assets/create/textures/block/post_box/post_box_orange.png new file mode 100644 index 0000000000000000000000000000000000000000..fa7cab524ade908d975a003d797329c4fdc61f30 GIT binary patch literal 1314 zcmV+-1>O3IP)6N$e@ydq#y+;9z-p<6g`L_#excwgA^&0LM4QNp%>9h z5WRR&L{xeT#VRO8szRffRbhqDxR4<`?0R@J!%lW~$HUw2&6}A`TJ6yfhMD($@4fH; zp8@{wp#1&mQZ)VIrt-u3Gm+~Jplf+FclxmA3ZS*?4Y0RAOyEvk{z?IWudh560RZzN ztlqHE^BLC9S}-&v!|dX+U0ZB+gQ1B7R z{*?FH?NIpC>2v`A&7FS6|G*ICnG#w)LvyDu?o{cpRWIOn;~>E}EdOk)>%}o3B=#cc8V-eVF(3o2$+~7mP29)L&lSoofAVcMVN)Rc zavY5doJV=41b|E=t6J z?Sz@V>2G?-LbPUn1mW1HpL`;6I$gZ~QZ3O70EqrDTg~C(wLO$)O1Sae_X+?!HvdRO zzIQrZ^n8ZNDFZUDJW~?PWxCVp#x7{JcDY9FSR;yJ>Ick=(DNBuJ`)RPW!1-5Rj*gY4as7+WQLCL0W&`5tMr#76)5R~1KNPz+ z0FVdkM=-KI=-vc4R+>hs^Z)?vipeP>;WHpMzr9u@$U0F%!(=)0K9?lCX$Dt@d=3n z(X5QllvTX*!UBrLB8tT#R+r{s=!$p%B;JOuWcI7gJN-n>27uMRTVw(Ffw^WLyyTe3nVi^j;xAVyHag$HMgn zaBgu6EiO!mp)wtWhOS`!td%)We@bZ=d3vOh2ND^~ii%68xdn>FVuJSeH-Bcdmm$6X YA3=;!Ap>xf$N&HU07*qoM6N<$f@Mo|A^-pY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/post_box/post_box_orange_closed.png b/src/main/resources/assets/create/textures/block/post_box/post_box_orange_closed.png new file mode 100644 index 0000000000000000000000000000000000000000..82c3eacf1358298b1106fedf75e0f916c040e3c4 GIT binary patch literal 414 zcmV;P0b%}$P)BoZwWQbduCo(n+12{;2cpg@!;H$WT!aRP*>kZ7nVprb%S5v-CZ zp|HIQ5XTgYoplmunaZB|{xkoN;lD$?U+meH{Y!CovTKz#Byp9e=P%luHQZfk!&`3} z`=T8sgySZH2v_2O}U0m9&8d>jyBo@>Y0YE(#9w@a% zDvQ#VcB|&|6`2tr5OxIoNjF( zwIyvt3j_dX4?WgiR~HG~hspXAq_WgwQySag);-Q8-CTNtZ%S;qJFHymIRF3v07*qo IM6N<$g6%u4NB{r; literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/post_box/post_box_orange_open.png b/src/main/resources/assets/create/textures/block/post_box/post_box_orange_open.png new file mode 100644 index 0000000000000000000000000000000000000000..1b5b73a1ce71cfbff0eb2703ca861a37ffdda756 GIT binary patch literal 363 zcmV-x0hIoUP)X1HiJ%7oE7?M_5LR=nwc?xp@E7mG7yE$K&HuH8P@~gX_FKd7NKa*b5{s^gNcnlF<$E_J<4EO zjMsYFj53%OxeRuXF2vNG1@Ii1IRi&#&cG2BTU;K0K^vRPpybH@sp0AQg{t%?{)MXa zX?G%)9u|Kabi4Nev^G}J#!|0&xF@biK^UdTKyYw=OE*@T!54&PnZj1#3&w(iv5hY#aW|3dZ1S+PGwdR=KFr>`_s(ovYacx@?A~+E zz32a)bK(CEso=}+n%2{gr+$6^Y%{C|m>G+erDcXj_8`__HK4p+)^HELb|eMx<2xTT z0Rq29;mTR+q0i|9$FS_~gs_Q=vkAHpR09CKwGF&APcq+FSWFxsa8BNlxWKQqenXs| zEMDt>;D=bYsqpD^0fsnWaC8`N&BM%CShk6i@0CnpH6ZY71b#?Z4Hz69mbAgqVZv&F z1Mpjf8yeY@P`(r0%vf}VEe{CS0!&}OtO-|fA|xtZd;s;($6MQwxX827*NJYZhXJ^K zE(P{!Ld=Xs;ema)eJ6>HxU{zAy|5a{SeqFO@5+{>O9ey-goZ+ixTR`5RbFpx zL&ntGj0CJKEhpm7IygO9ilNWS(y~0$5Ss@_hq*Ra2^TZxAW6|~eg;S|pN>Vm-s%t?L3OhYn zAo7%%v2gOeSax?p!Cb#fuHOZ~5J)wyafpXP<&{afwjo_C=xV)Nemf^_EG)_#kqU?$ z=v0=`VePP}Ik0zpOzsg$CaR!)U7^vndq5D?xQLopt)9MqIZ^Wfl~Osud#igwcu2*` z_&@c;V@+>!i_czuQ|kpn)0L%V+&-6yi?cXAS-$@E`xL-KW1~$Gdv9}#dg!ymv{7+R zPgV+7>E7m6I|RkzYP6vhKapH21b&Tr=u-@RiHom0;ciF2V+Gs^PK=B@aODX3%!y4%61~0)+6wFAI0&)q4)X(V>T%_uJe4lW>64@<*RHMM)gL zdY)o&l}l6a0(v=_8H>UfA4<9?+2>~8z9$2WN~z58tLJ&^k!K`QtpLmJZVe+f?WUW) zewmX`9-`4`Xa~;jKYCk%Q}c7$x+~Z3a^`RWC*LatK-54)6S3^>Xx&OgC*RAN!v%8v zE}tHJgLFDgI-O>A|4}U4lwV{(``5C~1i!I*^LOpe24ufh!OU14`@K3xicn53&L{TQ zL!T4l2NQTh%yeqJ_l}S8!YA)(r8hG^A^W`;SmG^PUB|1W(P(JHtbndcsoa`sYEocW z4H&v_0B>`PVsRDA(z{{c*9fZtl~P&nc#7+xU9#V-W-a0|SEqto%{bHmMI5)neg=xDvObLF-*0W`1>O zoZS6rn`?KJcq(1Qvr`h*LqAcTabBr_HdNl`VG&jXylat%_KuHroEgQV=JbJM37U8* z#Y50lDV3Q#HxoS`l#51u>Y&oLWP{0bGgL}tUb=9KMx#Na(O_zRPCm=xpHO0Ieoo^z za{Vqd&rU?otJp}T4kRi#`Cd-ihX6>Y(;DsdZ$3^~uR@&vAIdIDb<4K5bpQYW07*qo IM6N<$f)CGdQvd(} literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/post_box/post_box_pink_closed.png b/src/main/resources/assets/create/textures/block/post_box/post_box_pink_closed.png new file mode 100644 index 0000000000000000000000000000000000000000..48a30720952a04397e36a06ada8493905d4f31a5 GIT binary patch literal 383 zcmV-_0f7FAP)#ByhezGE-Ss)wW1! zvjY}0;-u^Bf$x6Z0mGiw1ZM|_*Qef}>h%kD5*sZ(*uAQ-YgM(zfO|Dn0^C~m4tzVN zE(pQkXIj;SH8yVyj&3d>7fW32?toN@IO*050N`YHi}>@QZoof`%yN*@5Cu80`E!41 dg;XoUe*@WVvn(IIfxQ3#002ovPDHLkV1k;EqgVg{ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/post_box/post_box_pink_open.png b/src/main/resources/assets/create/textures/block/post_box/post_box_pink_open.png new file mode 100644 index 0000000000000000000000000000000000000000..17bc5e274cf5313e7739bde009ae9634e4bad769 GIT binary patch literal 351 zcmV-l0igbgP)8XP)^#*!5xgtl#se$RqS=zxPT-QUm9^>UhgTpdJCLuD8h~tRq$yqI%o}4Ah4F1+x z0pN%sHz_aoTn|Sbj^YS6i+HWH%t;otbH$rs0oV1kLv>E+03@NE;(CPY^6US=c9o|K_>B!o|MJ9i5|YR+HQCj?{PS+Sz2r~qfG5$% zFD&#&_k-^YOr8Jvr+;nN0XX;0+x-LOF>YSF%GA`fP8$r;s-6`!+X27ae^B}}`5V|r z_pd&q`=9;=9DoDmG0Np}AT7m+7}buGELAFHBVyFzD^kwizqj&KS$*abym$1a{_~^z z{*!Zn(x;1G_SHDO+q+J!w#nJK4*&}H!0pZzEmw15Y4zeWy@1nfH@Mro&WZjjIv-{S zh!HsjkrUfkfTSYXto1twM{(Fv*&xFW_!cF@v?93%Bg*amDhv4_ zOj%y;s1{Qn4r*yU6ra#ahe&~^Yv}ayd2VgFhdwp0)8M0DOGj#me z+yH=Jfl#;}r^@Gw=Z%&$L1+!4{7MB_d%dDou*2=rGV{Y{_-^BK&A(M&+H(-eII;%O zt@=_5!jthLQieLk=7&YzIiw(*muCPN9v-%2KeoSlYyi9I{{t*{EH03M32XoW002ov JPDHLkV1k}EbSnS= literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/post_box/post_box_purple_closed.png b/src/main/resources/assets/create/textures/block/post_box/post_box_purple_closed.png new file mode 100644 index 0000000000000000000000000000000000000000..6173d261c0d5b0f3ee4a3f25c8cdcf2ccd4bfbf6 GIT binary patch literal 404 zcmV;F0c-w=P)kRPXr zch;#w5wE>=B3h=Jot=3z@6Et}n|IT_U!Gkadlx5{OOXVn8hm|!upf1>Z;^z_?57kv zzw3GcH7yAMlX%E99_7ey?@w#pY-}go&0{q&D}Z*?VH%GJf;uXw1E97Vd7`8VVl>8R z+EFKu``Ty#w9y1vp)Kw&dh{2)(iA~Z$JPM&l2NeM+}_Lm@ib;I_}utcP)G|6-0n&> zI0{c8WF=%;G;(u&$;Pp~lqz^P!&XTL`&ZJyI2u@UyKShOQ$4hTsl8K-L0LbwXoAIHA|{*gMM#7lEzFJQ^+}=c~NT)d>h-{VuxM& zy}`;rC;@;_0>|+vlJ#bw)SS>m_W+o3Il|AvCN%AtvRGx%7S&o)F0WIa>n~JmO;yRD zEovE@-Jcq*I~!nXvT+8QY@C56LJ3rh9F!8Z3@lAV!Z literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/post_box/post_box_red.png b/src/main/resources/assets/create/textures/block/post_box/post_box_red.png new file mode 100644 index 0000000000000000000000000000000000000000..dad420aa8c382ba8a1fe98abbf198dfe80cd3612 GIT binary patch literal 1279 zcmV7 z%|#(#^bi*e%5DfG4y4@-(^;&VVY+A9@z7n>-P4neF-IQ^Ox3G;?_2M8!~dOH-(0w` zczb83^~I}iE@YA+Jd1;P!kM6rUdtpS8Yi{APk;EX1@PI+uP*>pI_GM7pXo$$e!Y+H z+6`qp>Ry9y|CP)Eh-5-EPR-#Pf69gcy%%;|v!~MhzMN%rHv)#me>uw#j%Cg*^EKJB z5U>@riN-0uYatwqPitjrXwkpu5 zS%&ZCi1);t5YH&rd;PeD?^>wJ3)Cz#XYgP;kwk7{Osp*gfN1j9%w>(V$fOi3 zJd1wZBJ6mqBH>vGuQYckJhS#)8{f4Fg~xCd8@_&=tr12tse#bJXOvX@Sv?!c#Q1c$ z$Q2yKlZOAJF?2Tq1{29aJTWqDeR(TrbK_9f6gNP47SWhS3_$LR>!T6Si~+xhq2cJh z;rj(ZTcu?TXj19CX3}MPXbk8V7i(=@oP67q80<=L?dCC#x=gIS+%t2jYDZ-!~oDSpcQEol>$n) zRAXR!Qy7=^)q z!QK2tZemc@su;N&rW46vQuc}E^{Tz&_>athN73icy|fSx_;xAk!(V>-*K%!u_dj@V zu^yb{+pjLu>z!gaicLys)9JOQ;V5SB=I^a&ngJGawm>+K{{S0cJvd1aJO$*gIMEhH z@w70NHra``sO@Xg%0Kz_=f|?@6T9H!(=RN}2}*(`(+8!Qd_*_09q` z`oI;&hOg_y#lde+^Z+|jDc8Iy&!;xU2vExa-?dTcJZ~nIO1CHGypo(CN$M5!t>D>X z74F9SbpWC7@-8k)WLzz}6;PXqAh$rZ(rr0yaNwQIvwVGY8-Uk3ryFfpI96>uTRv~! ziYK+24RGthq=DRbt(E=0I!CHBuaq~Pqw-?Go*qeFbb1ZBww~!^l7Y%Mx1SbV8Vzcx zw@ushdp)q|p3YGT5`aZBOOhlZTz6~d0oEdw63GOW&W%EuWSoAc$8Z!g7~G}P>C^&J zrFmb7R9ds1aIBgObjoU4wlowm0B+G#>ZNx&kw%E{EMp-ZAHHLi?RbR(eZOjrQ^srF8KTp2c`Prq??~cO&4=AA|Z!l5&cwzF1pf8AO%0%(r!l=?@1zG;XGUn?swd za}ZAq|JH+v`8Zh>gwvU9r04Qk1E4xo9`|7(lZ@-5dq5tfe)T1lAQXPK;E;R4h)flK2qRWS6CEQK+k1a%UmemT;ZnB>T;klWGbThi5K2lZ3^D2eH p!%uQxo>wne-;eJ+6u_$U{{XN1AfUoySvvp#002ovPDHLkV1m=4beI4D literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/post_box/post_box_red_closed.png b/src/main/resources/assets/create/textures/block/post_box/post_box_red_closed.png new file mode 100644 index 0000000000000000000000000000000000000000..de50aacfe3af091f319408fe2180f9d07235db8c GIT binary patch literal 389 zcmV;00eb$4P)-Y^qOmNS6|wjIk1t57di2u$>1K;kHW=dGPqQO#Vaz(8fhf!bm9zb@d~Z)yMh) zq>E0ae>$P8&;!q_K3x)3bldtvv^ioT4=9#Gg^j1#hxwHK$2P81>n&wi#woV<0O7 zfUFEj;8Cd6W}w!Rcn8}9;EK|87IvX)&Xu~!U|lTNy5f5~%jfzF%eAi5O$O_tmBHEF zjk9)V2V6@w&cKq5Gq6Nf2AjukklM5|=vi`s;>DklCgG27Ax%Oi{*32l-Ns-#eFWez v-bMO`K^$POxbJ)9N|OX0SL%W3y!j`eE(DZs?kx)D00000NkvXXu0mjf#;cuW literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/post_box/post_box_white.png b/src/main/resources/assets/create/textures/block/post_box/post_box_white.png new file mode 100644 index 0000000000000000000000000000000000000000..f06bca65f9d2ae367d97eb8dc43d36a5973a7777 GIT binary patch literal 1228 zcmV;-1T*`IP)2I(TE!``$FQcIkn~%suDcd(Qcv zbMCnp{_m7ak|fFHa=E>|pORQN@Ku5R>JH4WcM?coP#Z=K${B`7Qy_vF7u| zCEBef*B8quUuBeCot?|bJ*^u6L{Uf-g=X^h_U+6D!V7|;;ptcd5bFjb1;xS9e=$@j zEf@0QxH~A7CW)dDZ@=0CV7zoLi*+BlQi=hs zyB=t*4J?)Q4M(}nQ@%ph$U5;DpxtT`MWNvdvVyKH*IMJ*a0t8?FJE$C@>PM0moE_n zMJG(QJiUh)FHZTYz(GSBxftk44DF4BplFh>pAvhncmo&(`_-LH{E0$F3W|EG$$oXm z>}e1vl_uG~d)ram*N7<0pC!C284?+LSCatWnFkr^bC+3kVR>$?XcK6F!kEB35g(J&JgP?vE|M=U=(O=lt|6n9#qyh z4BU1OM76B9>HqQxLNeA`W8#0|{42>pL$g__IK2Qc{UHd7T%Da`q@eizhaYnQFTU_x zGE(T~$3a8WZZ#Pk8ph_06qHeJ%MTh>4%F-SyB=Bb(^lLh4DD8vdaG%8>2W{aaq>r2 zz@zBK*@_4|Bz>uZ2aANXu;*2v|Ycc#9Nw0 ztQ(wpW|Vsm>a<%;&YpeVG0?sVKkU{7-IBEpNjEqEFBmHl&}%9-$+?~0Ts%=qIUz`g zQr4%9$RHpIA~E(=fy2W?Mn_KraPL9gStOoloxM4w$F}l*w=7Q*M;;DxX*_@7RcGRU zb;ro7`@05(eo5GFH8bUzo@)%SFO|nVEbM+hH8q_{K)^g|t}m7|GW(fl(?C=U`RK|F zQ4~4{jePy?bWwD)rWUd=`zf7Hhfb%%a=GkWK%lz={}GE0000Kq(`Si%1dOQiL(y zO+?GD?D6-X`QL{BhH2ZjHO83D=CzFyu&&_a{f%*Tf$pOOyl*h=i3`GI}-ZyyP zB<1z`@uZv9%5s!y!x)bORW-%?24@}C6#zKv5>cWMB_L6#s%feZMC3>i>0EHuv8-#B zb={f5S%=;M7{nh7ihR6X5VqUTvuDYIL`fOsU92m(o!x002ovPDHLkV1fvrq}Tue literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/post_box/post_box_white_open.png b/src/main/resources/assets/create/textures/block/post_box/post_box_white_open.png new file mode 100644 index 0000000000000000000000000000000000000000..6597b7d060f61506dd56777d10270a5701e42ed9 GIT binary patch literal 347 zcmV-h0i^zkP)aN&BfvcfQ!)x tu|k^m@K+q`1Y>e^tht&@Sge+T^aI&-mP3I?6d(Wq002ovPDHLkV1i4PphExv literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/post_box/post_box_yellow.png b/src/main/resources/assets/create/textures/block/post_box/post_box_yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..f6292ed0e63ad2d5f38d7fa2c2a4f3595f431425 GIT binary patch literal 1157 zcmV;01bX|4P)E9qg_P zQwRuJ7lj}~Hwn~*ZhWzYEChYy6S8>B@E-HSdpN`EVtVe}zoe~Q_Q3Gwo^$Rw=brQ3 zd(Q=4bSmV3ev}tp`M&V*hYNWekH9&D@AuJcmO0L1YK zS8g969rkeT;sQ8lhO@O+Xvo)uOTjIXD1Fhdl&ADtJMVil0r+WMcr}c@9>PDo!|OSb3`m&vS$!ne=*7 z_T(~f&JcBugxm-~Htczh0H4i?tV^o_fT+_20Qi32s6PPIYc9fJ55C_QHWdu)?Zt}Y zT9P8;R0+Nl@ zYc7CErf4VWS)_mnC&H=?TtvDN9Ru_w3=r=)3{k0-00;we`t-EfFmV1nH$WzzAu^F% zIR|71NiqiKOze4i1+Cpo=-9HM<3j#F1!33ViTc02^kyD)y4cw`qud1)sqgpUc@EZE zA?h_3_x2~)X`WrosrFH)i*(q7Gh2botJhrNT$V?j?z9A9*fv&VLw7ptAsqGuPaoTO zC&{0<1D-@%ufCC2P61^$HTCK5zdp5H1^}y{tmNE1jh}zKgGOUsqz#y!ZZsx}I$ih= z4+}@>7(fxd|8i7LJ^KO}0C4v-T=yjalTtXd6{TjtG>y(|Md1^X^UDu@d#0>DcL_f8 zUe6aQ#sB3T01E%!doL%zZSD*ZhHc#W`ZWONLGtCzM9Aq}_~5HQo@)Ut2vThB4DiLf zYL}y5Nb)`of)uUY3>(XH$g)f^xV5@?qQmv=LuEYUc@Dn4QiJC?!T~TnujO-{fGE%T z=JGj|N+py^C2XxO3Vpc`pfBgl&}Y8iH}?C%!N7>TS}j`dd%2HHk};BGj9YtMV}3g9 z;nIb9gU{&1lY>}Vs$zNbZ)NLUUn`6IUe1gjr0h_pEX$N;mS~3hHR@V{2?o5E8;Ckx zgkc+Vb92`7UG9be7(vmNmFF25pqp!Q1gn6ebDNA4(Hzd1ay9D?Xug~cU55ohDk7&E zbIvdrBxp1yH4FX;0i02c(C*O7ppRwewx)*3SEJlCzJE?ubK(1aAwM`6ho*Dfwt=iAz|nIK5<@zsveQpw=dQ!UTAbmIZC zEJK!MSl>QWnhpKY62~K~Zyzf9%<~*vUt>xMKP)A+qIHWo)2t43#)RH@`B zEVX4Pft9!T{CxL(_iW(5k#t|TU2^%He7;59YY`5P~Du>$>S!mrv+||uG0RUE$ z1psK>peRmWd9yKt+Z;EWU3iYsSwN{AMR5Y>8H8W};8y@3vLLcBriD_u=Tj#@WWjmn z4}@S?tZFP)b<_pt8C*>y;2`D1$Gd%nvMff=1|w+QM7ImU@OU=`F!e?{gt=+xL4R&3 zC(+);kq5@K-UEmJSbanu+%MmgKeNvTVJ9I{7ld>5(JziXaDkgEeAeIE4n1IDf-&vj z^YlfGX(QfeKP(M)`wH_p2a$!8lTkCD-YUF)U?|`|jMk0+wqq~T91kdu2haZi9+R|5 T7#j1Q00000NkvXXu0mjfHNKsu literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/post_box/post_box_yellow_open.png b/src/main/resources/assets/create/textures/block/post_box/post_box_yellow_open.png new file mode 100644 index 0000000000000000000000000000000000000000..554c37cee7e748afc2e322d74359c6f9e5079c3e GIT binary patch literal 345 zcmV-f0jBYU6vlr^11%D{q0%`ZxH)8Z(8a}F!3S{i6&(8rZa#pZyNin%+&j1laxWQ0xtG?G zKtde!UXnJJ(#3B&|Gw{VJ`Vghy!!R5_V(_)m-~}i>yju6m`r9QNr=t0E|D^C)%H&x zJb>U!mjFnaqg3IP)6^_&v$Z(xyIP=s1(GC0se+rQPxAQ`Gs|0K5e^t^ZF6xnBuT<$ z0j*1f=yj3-R}*4{gLToI^^K_jSUhDFS{__pKYMF4 zJK)=3V-IYwu?IHLy2Sdi3dU3|58VC7hX?ihNB0+6*l!%|40%j{ybEkI%M<`t=ernF r5yySEDT)G=DiET_`1Xx#K6RqsN-CGPK0Ee700000NkvXXu0mjfCX<($ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/gui/frogport.png b/src/main/resources/assets/create/textures/gui/frogport.png deleted file mode 100644 index 7ea40aa277d48fd09959c155a47ec3ed6c2b76ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1227 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911MRQ8&P5D>38$lZxy-8q?;Kn_c~qpu?a z!^VE@KZ&eBzH5L_h%1o(|NsB7W5+^6Lv3w5ww-=hH*rZ?aoeFohgPjx_3G8D?(Xiz zix=nT=bM|Gmz0#GrKLT3^ytQon>TLUxPJZmk|j%kCdl2|b{j~Emjw9*15LvM7@j#i zivud*EbxddW?if+t!eIwnw~w z#%GnDYi_{@)+FuwVO$jFH`zw(LFyA7IS~W>6K)QcJ**`n3jh5b;v8aUSF$nrO)e2J zh-7$g93_!_@uSlV3(dNwG#AB&gHan9HXUGk!n$W)(YF&V=a@D%AB@VZyZGd7zS|zv zv;RX6{4Sb$zN+5E;qlkS@%)?_d+NTN<}F~BSS@Sbp!4%m!&lzATXG$rKic1I`1)*C z>eqMox3ecj*Y>~qTEc90T69t-=+roWLt=)asy{oZ?^^Bd}H%>MqF@xLhg?XOnD4cXCW9kZi5b4m> zc!y<*J+mHD+V8`*%riMxJj>^pAC#;*^~{C7RD_qqCJ!Gd3p zy$;-c?rtm?z*j$Szv6>`pEvL1Siuu=S$qzwijDo8-iAXCqN?hQn&aS+zA`PW--~>cN?d>m55D{<+s9s+uevgWLO9r|{m0dFR2ueOa@~f}O_`R+lp#wF3ql zh@IWQ)-tai81D1-|7T;F4E91BsRYG6HuT{_}n)ZCKB87ph?b+mU~|Mlu;z zcclfS`Ap{KF&Q0U@`%)Fm~wQOQ?4-wKK_u;bnQ(M&*rKH76uHSu6{1-oD!M<3Jw`f diff --git a/src/main/resources/assets/create/textures/gui/frogport_and_mailbox.png b/src/main/resources/assets/create/textures/gui/frogport_and_mailbox.png new file mode 100644 index 0000000000000000000000000000000000000000..794f0723b13b1c788931bcbf8a4bdd025b625782 GIT binary patch literal 1286 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911MRQ8&P5D>38$lZxy-8q?;Kn_c~qpu?a z!^VE@KZ&eBzIT96h%1o(|NsB7W5+^6Lv3w5ww-=hH*rZ?aoe#d>Cc6VhYlTDwQAL? zSFgIeyB9BBoS&a>Zf>5ImiFk;qmq)68#iv=xN+n9_3KNPECHG$92}Dhq$Ep%{DOgI zVg(G0CS2QriZ}~AB8wRq`1XS^qXlcQ3ebJ>o-U3d6>)Fp^7`L45OKX7V0SFxf}{8U z|N5~q_m{+Zs!OX%eX~9OYTcJvId$pl7kaVg_&v+q`vL=Qch<*BI9rp!6!K+Gp8)nZ-V`)iCV|`J-f4*=y z<73D9tQC7$*ci84=QD2K9m!ajlP4u$P*&vX@S@)DK$`lO?;+i{Zk*jC$i>w5FP&wM z*~3#e`1UeRLi%w&i)mwNDrbNjB- z3LF>O)2L4hzB^@m@U;R1BZq^7F;iRrkGZU0BDgz10s;Av zER1aP`Qp_%GWfnubG4}W{A07CT=%bjrg`(~w{D)dPf5XY|F5sAj3<9y)mLla?3kN+ zh^6KD8Y6d?ub*zCeg4n$Q{EuHIpg~C;yL@HQ{Qr4*l)ZsNjrYE0prWM z<40Kx7&mVAnbGhefoam`YGQQ5OS$XP| z@P{?>r;48K4!t(7!8>fv_Qf`nLmx^_cvl`1!#tzmMx>gLLxlm*S(lTTuHF6-B&w!x z_x+9;3~CBx(>R3%;}%OfB)@0;!w@B>-%@-#zr>Ql6D{^#wsG2;pR}!IfrG6M24%w z52*sN3$lGX*`x#wzRc%%(RVy~UZWYyk$=IAH`%nr1*F6O*K^MJTkCBcqMz{Rv6DmI z|Ev31emz_MPnhxM-|O|f9>46lPrTpX*!^JVe@_R;|GXR?6B;J{ixvsEQs2yU>eu?H z1GC>X&6k{~{c3*}<7asM%FF+qx>>P{)ug@Z^r9CJfd0B9#-fosEU77%U-I9PRtTMS Ts<9AQelU2t`njxgN@xNAlw={O literal 0 HcmV?d00001 From c9f39a0689dbbe3e6a605e207ec9cf6775ab9d1a Mon Sep 17 00:00:00 2001 From: Kryppers <65094918+Kryppers@users.noreply.github.com> Date: Wed, 9 Oct 2024 13:33:59 +0100 Subject: [PATCH 070/515] lick of paint Fixed flipped texture on postbox model updated paint colours for postbox --- .../block/package_postbox/block_closed.json | 4 ++-- .../models/block/package_postbox/item.json | 4 ++-- .../block/post_box/post_box_black.png | Bin 1210 -> 1242 bytes .../block/post_box/post_box_black_closed.png | Bin 372 -> 373 bytes .../block/post_box/post_box_black_open.png | Bin 322 -> 328 bytes .../textures/block/post_box/post_box_gray.png | Bin 1252 -> 1228 bytes .../block/post_box/post_box_gray_closed.png | Bin 369 -> 361 bytes .../block/post_box/post_box_gray_open.png | Bin 332 -> 328 bytes .../block/post_box/post_box_magenta.png | Bin 1275 -> 1279 bytes .../post_box/post_box_magenta_closed.png | Bin 394 -> 408 bytes .../block/post_box/post_box_magenta_open.png | Bin 357 -> 362 bytes .../textures/block/post_box/post_box_pink.png | Bin 1298 -> 1323 bytes .../block/post_box/post_box_pink_closed.png | Bin 383 -> 409 bytes .../block/post_box/post_box_pink_open.png | Bin 351 -> 364 bytes .../textures/block/post_box/post_box_red.png | Bin 1279 -> 1278 bytes .../block/post_box/post_box_red_closed.png | Bin 389 -> 392 bytes .../block/post_box/post_box_red_open.png | Bin 349 -> 343 bytes 17 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/resources/assets/create/models/block/package_postbox/block_closed.json b/src/main/resources/assets/create/models/block/package_postbox/block_closed.json index 8b2c2d66a7..0f935812f7 100644 --- a/src/main/resources/assets/create/models/block/package_postbox/block_closed.json +++ b/src/main/resources/assets/create/models/block/package_postbox/block_closed.json @@ -4,7 +4,7 @@ "textures": { "0": "create:block/post_box/post_box_white", "1": "create:block/post_box/post_box_white_closed", - "particle": "#0" + "particle": "create:block/post_box/post_box_white" }, "elements": [ { @@ -13,7 +13,7 @@ "rotation": {"angle": 0, "axis": "y", "origin": [2, 0, 0]}, "faces": { "north": {"uv": [2, 2, 14, 16], "texture": "#1"}, - "east": {"uv": [8, 1, 16, 8], "texture": "#0"}, + "east": {"uv": [16, 1, 8, 8], "texture": "#0"}, "south": {"uv": [1, 1, 7, 8], "texture": "#0"}, "west": {"uv": [8, 1, 16, 8], "texture": "#0"}, "up": {"uv": [0, 10, 8, 16], "rotation": 90, "texture": "#0"}, diff --git a/src/main/resources/assets/create/models/block/package_postbox/item.json b/src/main/resources/assets/create/models/block/package_postbox/item.json index 860aa8b322..b6b89718ff 100644 --- a/src/main/resources/assets/create/models/block/package_postbox/item.json +++ b/src/main/resources/assets/create/models/block/package_postbox/item.json @@ -4,7 +4,7 @@ "textures": { "0": "create:block/post_box/post_box_white", "1": "create:block/post_box/post_box_white_closed", - "particle": "#0" + "particle": "create:block/post_box/post_box_white" }, "elements": [ { @@ -13,7 +13,7 @@ "rotation": {"angle": 0, "axis": "y", "origin": [2, 0, 0]}, "faces": { "north": {"uv": [2, 2, 14, 16], "texture": "#1"}, - "east": {"uv": [8, 1, 16, 8], "texture": "#0"}, + "east": {"uv": [16, 1, 8, 8], "texture": "#0"}, "south": {"uv": [1, 1, 7, 8], "texture": "#0"}, "west": {"uv": [8, 1, 16, 8], "texture": "#0"}, "up": {"uv": [0, 10, 8, 16], "rotation": 90, "texture": "#0"}, diff --git a/src/main/resources/assets/create/textures/block/post_box/post_box_black.png b/src/main/resources/assets/create/textures/block/post_box/post_box_black.png index c69537f70c9d6029d713b1b350a8b15ae33ae17b..349f4b58f6c18f678edc12f279438ef0dd92c8d0 100644 GIT binary patch delta 1222 zcmV;%1UdV<3EByeB!8hvL_t(oh2@veZ{tK1$3JeIv6a|S>n1c^+GK^4WhK}Pl{j#L z8-E5!aN@-Oz`p}`xWN%51k!E=q7rO2g$5-tQtVopNh@=(XZ$PGvb#r~6gi$Z^L~Ec zn`ijHllA@wAEw`Z`;GPXqq9^gg%E;pwIn#~qu-TM#L>F4_J8E@j~2j#Hy@<{N=f#+ zEjCHSChZ`E(@@rF-!%BPlnQ`2j)>#PY@W~mY6#G4p68o2rDXP$lELVN1+Weil#~dk zFhWVmcvA2+*;+sl^oipL(H02DsVPw?B~enMwu&I=^YoA3%sHhbl=cUQ{bsCp@P%*+ z1C)}8wg6x<8h>yVZj5rhc7Ab*Xba=DKBxD9n}_(;gt)wypvm7W4r@buoL^k#UaQ7WLKFfRKI6}!xhMjf* z2v^HS{sG>aoG?ow!qw8qv^6sb`pmEXtSD|6k$Y9gK!4_qgfs(J9Ro@@C?!nqqi`+xa*Xe~U-}~JbK$hwpBgO!Yfg*gWl7@0x$`}|P zzivW32!C8=NmTTZQtg-d>uPfgw1~DTe*488 zumSdi1JluFvng(;=-Znl1KBKpx*fl=u1PEZ{P7Pj6xCNw!Dsi+(g%L)rIZ6$@0`7t z>VI}R9`=~crr6yhpju8s2#y2S@O7WKx&Hf=9I)d!Vm$0|@vI1`uF*`fllOaB>2#CP zfa!eAw$$waWPT&wMUItJ-fhqGS;cAPzJ}`9l^G%`olc(#l{BTf-n1ImuyCBpc$VT+ z_S<2&G(G#ZAivMUWy5mO7CZ0zIF4|041cI?)+u#EquVjhO%kz;ZUM}G09(&=S-!Jw zH5}fbMh4276z0XQGKKW zjG}C)yfOUA$YnZTW2t}8raKnwa6i0agkvRUk7MPH=qlVGgu~#lR~f0w<9V4p&u2Q% kWXKZ`(!;{^Z;_mNd(@TnAebCv}h|L4g1T2K4W= z!1lDK{fGUX?R|e?dB_4Zz#6n@mbh4p7Bu{hAIT#P z{NKrX_U!rc?CiuE48C4wSqdTQ2!dO9UI+Z0WhtU4G}bOJ-+x#D(C_aq0f30`<)aoB z(Hzt04pPdBvTn<%@C8u{0EpudaU3e)$>gST0I%7$tJa8U^_!yC^)UiKvk{0=NLkn9 zQXK7VD?XDl!1LOO;}AkfNLe?OWLXL#0#S-ABY0jLA3y%7_7RaG?|Gey@$2|fO4JGu z2twqr93Ku0<$wB`5K?)~`?4%ma*Jq=I1besBg^ROd?G@PH!?Yni_`N9<4_^$I6c3B z_t>RU<)DJ5*%#b`V+(8#hBg1yn>?>MeXJ|;b$x@;VW;4qHH0ss&M zx0UzfUGKdtlIij9%Br<>i|kftI6U&kD+Gy{@l#I)5~tKqcVO-u4mzrqLaUQaFyQJe5)+ zib6q92c*FPjqhLVpxTefQh1|N2}30589Nv26Pt{POcp z==XOOY(N1ke>0876P%s@Zhct%1z-bnTB5nWQXe*;?RVh&j{pF};T0NAQz>3V^L%~v z+i;r3Iuk4Z;nm51LiMvl@col-mIuv^Pf`v5*1^HkC10mUd)pWeuaGQl0I2kV{hckv z=YM-*(~3XK0TIU`j`p_k>f%x@a*YB-Bhi~l9EUhQ9N_i4_rP6Z92hMAxhTAb36gbi z@KnuoEmvR>%@NW@rFoPQ;NB1fQ&pOy*`m^hrL0%RGhJQ;!BpMZEw`r*tw1H@+I}C$ zA=<0N%(DD89rPbp_AjD2K8)up1DeITJb%;a@%H^Kv|M47-rMV9Naca0+#z|SV}&{; zNmA(z08rz3jfj-OEKBiZr;pKig5mHAuIm~GvcdW^1mqKr4s}EGG~Z{oWdNwzwhPZ| zukH7XXs!-fH}jP}B1#P<`u_Wj5cw#c4-lN?Levq4A^QDY0KgyDLt_&sB@r1OGk*$Y zC+_0`$cIv%`SqdkAcddwl~bWo4w&$8()*+s$u503Vy1n+C6Eem+Ql1Mom3!iG44v3ZpeCo*_{Ex)t)--*RSo@f&aGX_U^uXdVGkku5U_JMMPLF7nsW) z?yaii*-sFAnLI}T4QmyEJkQAUtYV(cK99P&Semx0SVPqUV1G=HJkOA(AV~s%NKye+ zEov=VD8}@7e|rTWb_A*xX-ZWfk}w{07!NwZ6w(x2&7MF5K-#Vg=F1h+>Bq^OM_?-r z{O%&c_wSZXd4Y%oMLsrGTWhc@uEA;A4s>uihuskrT4~_S_fJ`%!D9Xuokhd`_Q}ay z>>PiuLp!U1b5q=2?kb1Z@yGTxX!rmvH0X9rqG+L^2F@9p7NdT*B0C)0*{I)TXj;b; sxDT@_x4SPZNqCw4x#MEZbX{xk2TQr9`qW`|JOBUy07*qoM6N<$f}FXd_W%F@ delta 345 zcmV-f0jB=-0`vlqB!4?eL_t(Ijm479Yr;Sf#eYe615pU};z3l1Sn%kn|Nprs?>$Hn ziuA)aN;Z-mw1;%pT?=0OPLr88vv1x6{u{}1`FLKfo|3YBIE%C>m9gJ{Q55&MZ;=*b z>L|BfKPLdn+7^JOscD+pPu}g`{=DXLdEWOqKcFZEG);|C8h@=b0JPSgXsyNC77}c8B!3S{L_t(Ijm45pPQx$|g}?l{5lTcAf-0mQ0ahFUcAS|V9Dr4O z0Tc-;QILqODxNID0vuu*Xw?l*vNRsQnelrz{5OKD>znTW?lw5Txa>p(r4(ESD5eq<3lz#xsXH&{NA_-b=m3hQ` zHubmwv1=e=QHi42Xx>e;HQnV@qHr}|H;_@{7{<(fO%JOG} zs(J*VZX(()AtuXm+!L$G1YT22B!3A>L_t(Ijm42cOT$1EgujGMZETw=#XZnH*a?q{u|zQ`*7av9zCt^&(2jSHR5=DBZ_X3y>k^s zk+-z{{>cMS)>Z%*lVeO?J0A`&ooS+l;iT4lF^HlY0CWgrw;+0Iykz tbCxiiAYU8=BOr{)sXpKiNQ+Z#@Ck3;h4B|RE9L+I002ovPDHLkV1m4tjp_gZ diff --git a/src/main/resources/assets/create/textures/block/post_box/post_box_gray.png b/src/main/resources/assets/create/textures/block/post_box/post_box_gray.png index 8c9ddd03c875258f378c9642365c7d44e0313c75..5fbac4ef631e9380dbdb406a6122dbcf1d2c2373 100644 GIT binary patch delta 1208 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 delta 342 zcmV-c0jd7!0`UTnB!4(bL_t(Ijm45ZO9Md=hM&7!=0b82@&)-HmV%wFg+J87)=seW zABZ5q574CWmdH*BvB=G4HwkHd;kb8aXXoRcf&WH!b$zqBzq`%OFD^Ig6)AnQS6(?8UTrN)$b=d*j=K5ss;@V8u4RDG)hu zU;8+zff4J=rcbgzow%)7gTlzFS&}&0K@hK~YN~;eVX}c8B!3S{L_t(Ijm45ZPQ)-2guht%)5d5;!fj{}2cSWm647t~M8g>n z5)DeRLgGir&MJN>LXmYyHdz*J!&KwvnP*rwA?8i)vS98p&v6Eo1);w;B|0F-P-*cQ%VZcq7c)|j2fZ49-lk?sb=x%OeG zRU!?*Xs&%2W$^s;82s5e1LeuV8F+GV2A+rrK9AoZ(u_0kWYIcw)cv?!Sn3oVby|k7QsWFZ6UxHY)00000NkvXXu0mjfLNAQO delta 305 zcmV-10nYx&0?Y!CB!3f0L_t(Ijm45bPs1<}#eazsH;SAh()N=uBC)YD@Ie_^*^n6d z2B;E>_%i^4#ERmJLK#|zgrrb);YpUx=XZC0&xZeocY1cdy1KmZj*d@OVg)r(yuH4V z&gQtiSizXQm%F{W_5cEF1preN7*n*JpPwEF(_BvLq|Nyv7Jq=l*&KjH9FkD+Y2JG) zp<)q-JuW~{ZyMBMQA$yjIUlAPOm{h@rns8*4K@;f62~xh)=Dr%F*w|YE_dL;F6eT7 zk+p=buD{Up;9+^^?OZtm-vxVn;DWt9a6v5==f`glk)8*E3(}yWi9;%)t$*P_M?`T* z8Z^TOS#}SARVq__9ierCdt#*~7*k-Cf-)y7zdiT@e!-K{;@f8V00000NkvXXu0mjf Dyr_&Y diff --git a/src/main/resources/assets/create/textures/block/post_box/post_box_magenta.png b/src/main/resources/assets/create/textures/block/post_box/post_box_magenta.png index 1f360f375540fabdc2ab68536eff9efadb08df26..65e3d24413d5cf7d943e8d4d2cc949fd5c2825f6 100644 GIT binary patch delta 1259 zcmVUm+k@_m^swx(^BdgR zOT_jtdw%yfGwU_;u>-^G@0{QK&iS41`M2%;mx+kXp}4t+6HvBIiYEc!Ru z+Sr1uRjg=ty%cZy%qs&;jGxRyIWcul9Fd10)QcRysZ?$8gv~1hDDSENObsEeCmjKw>*pf4ToP45Uv8p$^K`&O=>cz0F!kGuOG4K z-_&OoLn8(*x2~oXXN{1XW@7*nC}@2Hoij5iTkaJ#j2SfJ}%r>lkvg0ycU@lJXv>u#8Xzq!gU(h881ST#*)fKVVbyR zDGPE#=31=-oe*G1$yI#8u zmLpr%LY;2F^~K){e-8czRula-q_*baFHi)SaMt2Dj{^x5+S19(#e$d4G;WoA$A^w3IsV=*|NxDx94^ms+oCIt@-e z`!252&0xQin{ok*qL z%*KPd-^;)l%-9rzk=X%;G0Y-qaNZhH*+5t}zpr2YA^3Q=~X0#b9mkQexz92KJDmriN^ z?EJYE3sKk)Q-x@D{#+7-GtV4E#VR*anFEPQuG8R9Wgh^gQYj_-xerOCk;L9PV^v+O%w_hv81<> z9(t2{5{gBOV4=`>k{$|eDdbR^W1tX03L-S($x>RpY12wUA<-J}U}iQHT^uss#GOq` z*&b%!H{Z;xvDRZh7-qirzVE&Fz4w3bdjtRXG0;4BquZF79Dn%!y>GfIQP`Hv^4c8^ z)F+U+N)&z=U~E^gkw3zx;$S-MJ5O9*Jbtuzx%9}KCkn@^0kE)fEvMY1IaUqX zBl}eE0qC@2g0QJ+LD>$yA5VL+;xs%dFza8S6^Bf6gsH(pCAUuv9s=NMyvR*| zMbl^Q&Fk2Uf+B5X*ws9f-+CMx7zk2`2F8h^0)Kd-M5UFi9cx-~-jB8w|Ct%^tntPE z!`<3;*j33yeQ@j7e=WBH@cyY2-63~3KU`kG^Y&=BLFQJO%V<3gxxM`Rz#pBzfkEQG zy41Em{{bohL+)-|_az_=#g3gdt+>;3mAGuj&RUKxLzI8Kbo05q`obajaPRBgS89X* zNq;%Oz|W^Ib)}rnx2_Nbt9(8ADNw!5tIJa^!H{UkuHu!ApBRsc}%T>>9=u5=u)pY@) z*V{AdHaPd%8LHJP)oPV9W5;nUM?dKSvVXT@Ii>ZLrM0`cnhmhDcDH1?W7YcJ_hug% zB{5MFb2VNp?eDZ>-hKJ)61^flok|ouN{N&Ej_}E?*<9*P*H7sCUK$p;(|MQ~2|!%V zlFiM{teJgi7~qFZ9dGGaRHE2B>hZu2=(J<@?;pag6Hi4;DH~&aJETO zFzuxCCo0ZOv}QizHzRVp;=>tzICli6M&nz=ov>2oU= zw=6_a66Fff+{(oigwxguRHC$t%^!=Ra!5gV$~p=_wOY;b&Of;PR0I00{|AIsCMS|? Rkaqw8002ovPDHLkV1n5nZKMDI diff --git a/src/main/resources/assets/create/textures/block/post_box/post_box_magenta_closed.png b/src/main/resources/assets/create/textures/block/post_box/post_box_magenta_closed.png index bfc59e6a918bf0ca5752c43920d5f63480396051..54e6e8711d04c90ba273d2b9a312c479b2870cf3 100644 GIT binary patch delta 381 zcmV-@0fPRD1DFGlB!6E?L_t(Ijm46&PQx$|hQCA|8l>7%J2vgaRH$G?V&OU1cmO5_ z24)6UDxRPc3lG4+(gleH2_cxuLX)jZR6A0ftt_?Wq==P&I^UiD^Z%dWzY%0NZ|mOW zVK6(tUu&Zgk>Df!WIx`+p0&{|vZR(fnVbdyEoBM-l00RRr+<$5`RiqCn#~QnvCFk| zsQ?)FM=bIb+3p~BBmgoJu2C6{Dix|K823jmAFhlBU}ZG2-EjpO2`2L?llipv3fb;p z?*N3_I{*xO0~ar|oFw`FwdN$K4MF1Rmytk3f{TMQ07N8E-XOm>RGtU6*<#R*Yd+Xo z%>z{x&I1e8kapEX&4a7Q+u+Y`KpS0qiI30*zOE)j<8sXd8(3X-E6wfrvV0F(Hdq;r zs*2jQCW+qk_#QZd>-RgBS8GYm*9Bw>n(Vn?dk%0O-G6tVJ6=lk>B-FJrnMpB+F*4f20xj(*I z8*7k4^7Q`9{%{ZXHr9~WMdUlYJxKt1+8O|gx+Jel&%Ahj*njHgd^>~8`+C}H04BpR zd0nDJA0-q3N=TomtwCFjwk?z4*!$CFGeKhwO7wj|3CXOQGppv&6iW1QH2|pz9^d1Q zyj^|N6vf-Gv0#NC4Z`kHNKSW;0FXkWgGOO)8fxH@9Y%vJ(!s?d4YX~&1`fKjRu_>5 z=gaHl&uqY06KG8mB6UW%R~NEV9BJSTx0kz0_d4NPp$0u?G}fSP8+GfFm`zTofhV}k zZ>ZXuDF9DpJX6p<)Ff{q5SI~2>iMz%Xsg!K=Y5T)T&vorH%cizmxf5VubJ?7n$ zZR76vI#;Qpv(n)?cwy7qK%Z5r@Ta2Y+q*b009rDQ0T5w;AAbf#<;m;AkK44b?|Ox= zr4k9ius6UD18&5aEQygHS&i(hT3BtH{q+&U-k>ZHr3!#3RXCR2NCpa@W7%j9fT=2n zYGM*%YF0t;|DBgVWn{V_{|kOl>T!fi{-bKpRo2 z(0a^+%;K5`MM(dn-JSe>8veRSP;TQ|*JXS^nf(PF6ygnlqpd?^7Sne<^oX6dgC7Ps hmd)kU6(T8L`U#~cmv_$c-y{G4002ovPDHLkV1lNCn_>U} delta 330 zcmV-Q0k!_>0_6gbB!4VPL_t(Ijm48aPQySDg+E&GAOT$ab)WK1(Huv!urDU!GV19ib!uNtP04X@6BYdb(e@O>=!ethkO) z0)SyKAkI>*^9jW)M|>8wWN)=gcg5wv-C-CE<^`rd9ZZ$Pb6kqI#blu3ybTwf17J(z zU<(EUkeymexQUQzg-Q{05=& zng-SUd%L6Z{X-*b+(He#jq7VZw|CL^U(n7Zc>&;f^AMqO`hJLhV$bo2vlP#989!f< c%;ueb0oI3?oQBQ*AOHXW07*qoM6N<$g0bV5U;qFB diff --git a/src/main/resources/assets/create/textures/block/post_box/post_box_pink.png b/src/main/resources/assets/create/textures/block/post_box/post_box_pink.png index 147393f1678072de3cdb704128295ac301d83f83..21b5b750e6a090edefe18d0894b82d574b457a1e 100644 GIT binary patch delta 1304 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 diff --git a/src/main/resources/assets/create/textures/block/post_box/post_box_pink_closed.png b/src/main/resources/assets/create/textures/block/post_box/post_box_pink_closed.png index 48a30720952a04397e36a06ada8493905d4f31a5..3d3c368e3d811d893826bb4f6acf4eea97d2383e 100644 GIT binary patch delta 382 zcmV-^0fGMi0+|DlB!6H@L_t(Ijm46oP6I&@hQGTsL3DekNL!MsQbQ^bDBb|U17P3* zs*ngg4^V*tfk4%f5FUV_5RecsAjl@Pm!?hbZnvSTh-0^VcMXp}zq^9R6J&LeBDVg2!Bij+4us4Gh>=qt(pm zU~)MPRI=2-n0H%kmE|V z%8taTRwDVuxEff3ql+`flPR~m+o&X^(Q1|m08Z|&S%14L6PSY;$zgV~fy%XQ*8M$8 ck+Ws|2ic9XQ5{zB(f|Me07*qoM6N<$f|!f2EdT%j delta 356 zcmV-q0h|7r1OEb$B!5OpL_t(Ijm1(SPs2bMeO;=0YhAa5iow(t&`2!d2jKS;2yz}r z2p)rB!6FE935Enc2o6Y7NO##puiphX%)aBUEm)qqzI%P&dtVFuH$1w#Ux|Y~@9FGv zr3*q33B0|$Vso$se%1wH{xNsB?c#ByhezGE-Ss)wW1!vjY}0;-u^Bf$x6Z0mGiw1ZM|_*Qef}>h%kD z5*sZ(*uAQ-Yh6{f#(;Y@RRY{v_6~eIrY;D<;AdLZgf%vA432ItAQwwq?e2h7i8$%j z3;^I{c8mD)p>DuGjLdS7(hvnXvH5dF+}?k?&2d39 z$hgWd5&&AAHbxuvug@6tBdiPx%?(whIz7YT>Nc%Tdn6FsR3Ns3s;kmwAmdbB;d%gk z$sO{AWhl$}5=KDk!MMoR`ms$-%+K`~^0mH%BM-(!!Gn$C18?lk68J8d*aH_#?12kn zD>y%XgM?D>AWEBmeQhP_eSH47NHE&Q`MFsxuWr)6;F4Ou0&udmhlE1V3~*0eYt%5> jpz4a<^CNUW%0#~aSf!UD*vJoq00000NkvXXu0mjfL4u)3 delta 324 zcmV-K0lWU}0^b6VB!4DJL_t(Ijm49{N&`U<#(#ID2zMrea#f0GDucd(pp6z{Z7=u+ zT3XwwZy;Fu0%D@I+we6!6S`dHT%tGo zclF+P3c$xNzM28}Ny;tu8HYYsI%`b^E7PP^rZJ? zZ=3WfEqQqcgO0&)H^qxHDcCj?hPx?)j=?;z4F%g!`wu-;u@QEvgD`AH@Plr6Rmjicbm8juPzDF;MKGzbd1 z7pK^ULhG~N?DJFC=y6Qm8^`fu?kicp*nlWAe%jrIh$<8hug!`&3St5pOI zcT?!7-0yfe?ZUI`iA&$^K^v(+;>gp|U+zhoq<_zFQqpL&4ZsdPX=RbaVycZppHb*b zVfFJo+;Q|1JK!YvX#M5P(qU06M7{sx$(g4NYE+`WC-QX+KX zEWq8{=ciwORsJ5QfQp}FSo)JYpaFDyOZ0lr0(mOh9ZM=6&q5_a*6vspya1v6!=Jx@ zqJOA9bqYQ>{Ze+;QvZ{30OiwHE@on!-mz0gqiwGC&j2*ufgA0Kq>DLm&3*7x4ror0 za>q_N7Zk{H2Uxl~TSTgpZetlPdMZ&ARRq4dc;;AzHxH`@YXei|?NsH^oN{aLp(KLUz&8ov;`)-wRD!R!n}oF*Pm}Z!+*j7fv@vxTL*E`@3TVMdQ|l)kAyP!y)W;P zev;uQ6Yh7siahkZXfLqRkgJKE&Wkfha^(4bn@@s=mDamF*5rFH78dcQ6Bb4asCP*e zMGTg-3O_*02~xS$2!&ppar%W-+`WB9qisyntQ4f5tX~2|%a-poB7cy- z%j)b=sWOa1Ukb4eMMg-}$D-cCDS1;*rMO>?M%@U_2~xR0h~Z-!3PBLCy1E9yAAgR( zd`?~xEtqf8sx(YQq3%S3R^r!0i-`{hu`~{nBIE;XHj_xww;o0E<78eDj`17qS?84o zl$XlmJ}kUA0>HaSc6XWez_$p5s-uEpt(|&!&a_=@*w*BpWh_! z&FI0ggUCs#sGx~OQr7ExIWmqvaEH9@mEL5ZQZSvQV2F&CC7p4>z UwADTk3IG5A07*qoM6N<$f~rntsQ>@~ delta 1259 zcmVeDS*)62x@X$)&|THt z)02%cM;{DK)vJ2%Tkm(n|D9UjT)41!duONh#j9^FWRf8~i+_W7!kM6rUdtpS8Yi{A zPk;EX1@PI+uP*>pI_GM7pXo$$e!Y+H+6`qp>Ry9y|CP)Eh-5-EPR-#Pf69gcy%%;| zv!~MhzMN%rHv)#me>uw#j%Cg*^EKJB5U>@riN-0uYatwqPZ=7{&ioDk0_*L(fAh3{IZ$_vyiGiUH% zI*~+fVoa9FtRmrA2(L7EC_JF4$;9|{xX2Y8#FK{qqkl1UHv$F|$w53ZGHrc%D`<1$ zP}USTKzJ6>m_`gh?uzT95zveQzlfpX=)U3m1wdP+WejLi>AYsrWqN1~=oc4jZC&G% zQOVcoy!Pe(kFAGlst8<_*P5pRcQ*o{jEPWq_^#am82T=upQo~sTJ`HPExV!?1LH&^ zVVK4>zJIJ)wY2DsLuq2f0MId@6=@Td0!p`3V_Da|1%to|qTr&T26bskCu+`M>_@G}LP~%SsDeVa(7uVjDp}ZXtrY+52$|I&jlD z;;_Wcj=D$J3&6uDFnhpI#d!%Xc!po>832R9-GBT=Zemc@su;N&rW46vQuc}E^{Tz& z_>athN73icy|fSx_;xAk!(V>-*K%!u_dj@Vu^yb{+pjLu>z!gaicLys)9JOQ;V5SB z=I^a&ngJGawm>+K{{S0cJvd1aJO$*gIMEhH@w70NHra``sO@Xg%0Kz_=f|?@6T9H! z(|<24&Is#2DFeB<0gm(y$Bl)>OGAN9@xH2T05#)hx!#KpmHPxJsgQYqKGDbJ@i z#RyQ#0N=Gy={#>Hl}fiK=Dd=eAW7;K^sV68V-@bk`*i@J@A57#N@QFux)o5Hh# zwbE@lZE)b7&9i)cbQ^%zI;R_LSU6T~Jbzn0Z{Lb1wVDlZ>%pXf+;^>&{k}R!sx+^Z zH=U#MV!@ssNnUh%4Y{_S>12|D$~U*47F-$)YN@wP+w^-qu;`x7Q3(=&MKep1Bq3aP zYv%#hB9#)!1eMN>LYZWoex}E86f+pyrPJxu0#c=UUx-v%vz~CQnhSKwYFf556n`-Q zZqZcgrFS}!Mu_k%V<8abBjC;- zgZfL7a*C?HSX*HkM3uM9w{?o?4+lLoZl-^mLz}E~5Kj#M)`N-pI9U~h)0u3f=ki$t zpgL3@_hBKEjO(L&Kpv!i^(B=c6l9LYdHT)!m6T*w0bmM|v>PK;E;R4h)flK2qRWS6 zCEQK+k1a%UmemT;ZnB>T;klWGbThi5K2lZ3^D2eH!%uQxo>wne-;eJ+6u_$U{{XN1 VAfUoySvvp#002ovPDHLkV1j!)cB}vZ diff --git a/src/main/resources/assets/create/textures/block/post_box/post_box_red_closed.png b/src/main/resources/assets/create/textures/block/post_box/post_box_red_closed.png index de50aacfe3af091f319408fe2180f9d07235db8c..ce7de107d8620ec158a1a8c47fe3a2cb5060f065 100644 GIT binary patch delta 365 zcmV-z0h0cO1Be5VB!5pyL_t(Ijm45XP6IIzhClC%Xwj~sl;Hs329#7N;w~JA3vh&# z5e1@*sM1j(p(tr05VFH6*t;=BV()`M%Sfvo&*Pu@e;fYW#Qk_|uclLRdvR%{w&aQ6 z`QwZ8{t50ZwPjW4R_tc>C;%d*cK|FuOIAhck)PJvAJbfHn14n-7D=;j8ub%aMM)M5 zvN#0re*k5w!)F=w6CV#YX1~G4?8su_6ImSckXJn9RcnhZ7PuaOKx*467^XG)`t6;? z;`M0GQ&6Vz8Z@WpiQw7{ARUk=0%hu^W^LdA9Irg7X`G!#Egf90rGYZmYv9a*{$?!= z?p|i%k6Hkvwq~tOnie>x$*XHkTHRU?;CQ)P>E2G0R#OB2q&8-UGWIYnJPIPUMH$=H zz&Vp%$vl;QT6b+{^HehF)fD^&?!hb>piG6-VPoyu-xi8Rp*+AhIw!1OJgk1900000 LNkvXXu0mjf{8Ouv delta 362 zcmV-w0hRuU1BC;SB!5gvL_t(Ijm1;3PQx$|eTh?BO6?^>rG7y94JKHa`YU`0U%}o9 zRboS`)QzbNY$!vJ5LJbfs&;CXp*_b=D^_m0+`Zhr_iO|I9m&&ldbpd-l85WtgEkII zFubp~xGHkcw>Az{W1`yq%X0z%*^k)+04i-zHP%ml{nTgMsDCyda$n1|Jr0-@IjY7& zat1YE007A|53KDTx^<|n!=%W4J*``J1hfv4GvAOr!$Rz^5W9$l-Y^qOmNS6|wjIk1t57di2u$>1K;kHW= zdGPqQO#Vaz&|}6$Ou|Sh33c@&l-0-j0i=sgrGGl1tk46`t3F*4Rdn0>L$oh7aS?4g?%h_S+;;Ee7c|MPE70P@D*ylh07*qo IM6N<$f+ESNtN;K2 diff --git a/src/main/resources/assets/create/textures/block/post_box/post_box_red_open.png b/src/main/resources/assets/create/textures/block/post_box/post_box_red_open.png index 42b7dad403f98e258662396d485af7c5adceede7..123a26699105f7d52889d774ad11189b6378c367 100644 GIT binary patch delta 316 zcmV-C0mJ^?0@nhNB!3=BL_t(Ijm46&PQx%5gg=KQL{ZapuGq`Q$jAcf%kVh70FS^} z!NOQEbz?$8g)Cjb4pxan%n&&wYM@mYZu))x@9h6<_-}~Y>C|4#X5#Af%*w(t39TQtSgkisbKE%g8-LE1rWQ>`A(<{&#FDjE zyysnmbPy562`75UWEB1w+P$7K^$6{`wxN^3_0wGJtn7j3ioG*%#oigXA~zK-kH4Ud?PSpW$(yKT6-!d0 zU;jcnh*-puEH&~s4VKGi0M3IW)W9;1ecTf#!2y{rNdm#0eqpIqWAF`I8}!6Vd} z#Gg^j1#hxwHK$2P81>n&wi#woV<0O7fUFEj;8Cd6W}w!Rcn8}9;EK|87IvX)&Xu~! zU|lTNy5f5~%jfzF%eAi5O$O_tmBHEFjk9)V2V6@w&cKq5Gq6Nf2AjukklM5|=vi`s z;>DklCgG27Av;Y%CjN})X5GeMI(-D-Fy2M_hCv))uek4fAd+TpDqNH UZ|*G$<^TWy07*qoM6N<$f^=b Date: Wed, 9 Oct 2024 19:15:02 +0200 Subject: [PATCH 071/515] Port Changes --- .../compat/trainmap/FTBChunksTrainMap.java | 4 +- .../compat/trainmap/JourneyTrainMap.java | 4 +- .../compat/trainmap/TrainMapManager.java | 54 +++++++++---------- .../compat/trainmap/TrainMapRenderer.java | 2 +- .../create/compat/trainmap/TrainMapSync.java | 2 +- .../compat/trainmap/TrainMapSyncClient.java | 5 +- .../compat/trainmap/TrainMapSyncPacket.java | 2 +- .../displayLink/source/DisplaySource.java | 2 +- .../renderer/SafeBlockEntityRenderer.java | 5 +- .../create/foundation/render/RenderTypes.java | 3 ++ 10 files changed, 43 insertions(+), 40 deletions(-) diff --git a/src/main/java/com/simibubi/create/compat/trainmap/FTBChunksTrainMap.java b/src/main/java/com/simibubi/create/compat/trainmap/FTBChunksTrainMap.java index f60921ae47..dad6921fc3 100644 --- a/src/main/java/com/simibubi/create/compat/trainmap/FTBChunksTrainMap.java +++ b/src/main/java/com/simibubi/create/compat/trainmap/FTBChunksTrainMap.java @@ -4,7 +4,7 @@ import java.util.List; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.foundation.gui.RemovedGuiUtils; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.infrastructure.config.AllConfigs; import dev.ftb.mods.ftbchunks.client.gui.LargeMapScreen; @@ -138,7 +138,7 @@ public class FTBChunksTrainMap { return false; renderingTooltip = true; - RemovedGuiUtils.drawHoveringText(graphics, List.of(Lang.translate("train_map.toggle") + RemovedGuiUtils.drawHoveringText(graphics, List.of(CreateLang.translate("train_map.toggle") .component()), event.getMouseX(), event.getMouseY() + 20, largeMapScreen.width, largeMapScreen.height, 256, Minecraft.getInstance().font); renderingTooltip = false; diff --git a/src/main/java/com/simibubi/create/compat/trainmap/JourneyTrainMap.java b/src/main/java/com/simibubi/create/compat/trainmap/JourneyTrainMap.java index 74beed9a51..e05b26c369 100644 --- a/src/main/java/com/simibubi/create/compat/trainmap/JourneyTrainMap.java +++ b/src/main/java/com/simibubi/create/compat/trainmap/JourneyTrainMap.java @@ -5,7 +5,7 @@ import java.util.List; import com.mojang.blaze3d.platform.Window; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.foundation.gui.RemovedGuiUtils; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.infrastructure.config.AllConfigs; import journeymap.client.api.display.Context.UI; @@ -100,7 +100,7 @@ public class JourneyTrainMap { if (!TrainMapManager.isToggleWidgetHovered(mouseX, mouseY, 3, 30)) return false; - RemovedGuiUtils.drawHoveringText(graphics, List.of(Lang.translate("train_map.toggle") + RemovedGuiUtils.drawHoveringText(graphics, List.of(CreateLang.translate("train_map.toggle") .component()), mouseX, mouseY + 20, screen.width, screen.height, 256, Minecraft.getInstance().font); return true; } diff --git a/src/main/java/com/simibubi/create/compat/trainmap/TrainMapManager.java b/src/main/java/com/simibubi/create/compat/trainmap/TrainMapManager.java index f9afac323b..1d138b7467 100644 --- a/src/main/java/com/simibubi/create/compat/trainmap/TrainMapManager.java +++ b/src/main/java/com/simibubi/create/compat/trainmap/TrainMapManager.java @@ -24,16 +24,16 @@ import com.simibubi.create.content.trains.graph.TrackNodeLocation; import com.simibubi.create.content.trains.station.GlobalStation; import com.simibubi.create.content.trains.track.BezierConnection; import com.simibubi.create.foundation.gui.AllGuiTextures; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.Components; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.Pair; +import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.infrastructure.config.AllConfigs; import com.simibubi.create.infrastructure.config.CClient; import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.utility.lang.Components; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.renderer.Rect2i; @@ -107,9 +107,9 @@ public class TrainMapManager { public static boolean isToggleWidgetHovered(int mouseX, int mouseY, int x, int y) { if (CreateClient.RAILWAYS.trackNetworks.isEmpty()) return false; - if (mouseX < x || mouseX >= x + AllGuiTextures.TRAINMAP_TOGGLE_PANEL.width) + if (mouseX < x || mouseX >= x + AllGuiTextures.TRAINMAP_TOGGLE_PANEL.getWidth()) return false; - if (mouseY < y || mouseY >= y + AllGuiTextures.TRAINMAP_TOGGLE_PANEL.height) + if (mouseY < y || mouseY >= y + AllGuiTextures.TRAINMAP_TOGGLE_PANEL.getHeight()) return false; return true; } @@ -127,39 +127,39 @@ public class TrainMapManager { TrainState state = trainEntry.state; SignalState signalState = trainEntry.signalState; - Lang.text(train.name.getString()) + CreateLang.text(train.name.getString()) .color(bright) .addTo(output); if (!trainEntry.ownerName.isBlank()) - Lang.translate("train_map.train_owned_by", trainEntry.ownerName) + CreateLang.translate("train_map.train_owned_by", trainEntry.ownerName) .color(blue) .addTo(output); switch (state) { case CONDUCTOR_MISSING: - Lang.translate("train_map.conductor_missing") + CreateLang.translate("train_map.conductor_missing") .color(orange) .addTo(output); return output; case DERAILED: - Lang.translate("train_map.derailed") + CreateLang.translate("train_map.derailed") .color(orange) .addTo(output); return output; case NAVIGATION_FAILED: - Lang.translate("train_map.navigation_failed") + CreateLang.translate("train_map.navigation_failed") .color(orange) .addTo(output); return output; case SCHEDULE_INTERRUPTED: - Lang.translate("train_map.schedule_interrupted") + CreateLang.translate("train_map.schedule_interrupted") .color(orange) .addTo(output); return output; case RUNNING_MANUALLY: - Lang.translate("train_map.player_controlled") + CreateLang.translate("train_map.player_controlled") .color(blue) .addTo(output); break; @@ -174,23 +174,23 @@ public class TrainMapManager { if (!currentStation.isBlank()) { if (targetStationDistance == 0) - Lang.translate("train_map.train_at_station", currentStation) + CreateLang.translate("train_map.train_at_station", currentStation) .color(darkBlue) .addTo(output); else - Lang.translate("train_map.train_moving_to_station", currentStation, targetStationDistance) + CreateLang.translate("train_map.train_moving_to_station", currentStation, targetStationDistance) .color(darkBlue) .addTo(output); } if (signalState != SignalState.NOT_WAITING) { boolean chainSignal = signalState == SignalState.CHAIN_SIGNAL; - Lang.translate("train_map.waiting_at_signal") + CreateLang.translate("train_map.waiting_at_signal") .color(orange) .addTo(output); if (signalState == SignalState.WAITING_FOR_REDSTONE) - Lang.translate("train_map.redstone_powered") + CreateLang.translate("train_map.redstone_powered") .color(blue) .addTo(output); else { @@ -200,7 +200,7 @@ public class TrainMapManager { if (waitingFor != null) { Train trainWaitingFor = CreateClient.RAILWAYS.trains.get(waitingFor); if (trainWaitingFor != null) { - Lang.translate("train_map.for_other_train", trainWaitingFor.name.getString()) + CreateLang.translate("train_map.for_other_train", trainWaitingFor.name.getString()) .color(blue) .addTo(output); trainFound = true; @@ -209,11 +209,11 @@ public class TrainMapManager { if (!trainFound) { if (chainSignal) - Lang.translate("train_map.cannot_traverse_section") + CreateLang.translate("train_map.cannot_traverse_section") .color(blue) .addTo(output); else - Lang.translate("train_map.section_reserved") + CreateLang.translate("train_map.section_reserved") .color(blue) .addTo(output); } @@ -221,7 +221,7 @@ public class TrainMapManager { } if (trainEntry.fueled) - Lang.translate("train_map.fuel_boosted") + CreateLang.translate("train_map.fuel_boosted") .color(darkBlue) .addTo(output); @@ -276,9 +276,9 @@ public class TrainMapManager { pose.pushPose(); pose.translate(x - 2, y - 2, 5); - pose.translate(sprite.width / 2.0, sprite.height / 2.0, 0); + pose.translate(sprite.getWidth() / 2.0, sprite.getHeight() / 2.0, 0); pose.mulPose(Axis.ZP.rotationDegrees(90 * (rotation / 2))); - pose.translate(-sprite.width / 2.0, -sprite.height / 2.0, 0); + pose.translate(-sprite.getWidth() / 2.0, -sprite.getHeight() / 2.0, 0); sprite.render(graphics, 0, 0); sprite.render(graphics, 0, 0); @@ -408,8 +408,8 @@ public class TrainMapManager { int sheetX = col * 16 + colorCol * 128; int sheetY = row * 16 + colorRow * 64; - graphics.blit(sprite.location, positionX, positionY, sheetX, sheetY, 16, 16, sprite.width, - sprite.height); + graphics.blit(sprite.location, positionX, positionY, sheetX, sheetY, 16, 16, sprite.getWidth(), + sprite.getHeight()); } pose.popPose(); diff --git a/src/main/java/com/simibubi/create/compat/trainmap/TrainMapRenderer.java b/src/main/java/com/simibubi/create/compat/trainmap/TrainMapRenderer.java index e5335bb4d0..6cc613bbf9 100644 --- a/src/main/java/com/simibubi/create/compat/trainmap/TrainMapRenderer.java +++ b/src/main/java/com/simibubi/create/compat/trainmap/TrainMapRenderer.java @@ -9,11 +9,11 @@ import com.mojang.blaze3d.platform.NativeImage; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.simibubi.create.foundation.render.RenderTypes; -import com.simibubi.create.foundation.utility.Couple; import com.simibubi.create.infrastructure.config.CClient; import it.unimi.dsi.fastutil.objects.Object2ObjectMap; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import net.createmod.catnip.utility.Couple; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.renderer.LightTexture; diff --git a/src/main/java/com/simibubi/create/compat/trainmap/TrainMapSync.java b/src/main/java/com/simibubi/create/compat/trainmap/TrainMapSync.java index 0de7783dbe..2a8f5a0a8f 100644 --- a/src/main/java/com/simibubi/create/compat/trainmap/TrainMapSync.java +++ b/src/main/java/com/simibubi/create/compat/trainmap/TrainMapSync.java @@ -21,8 +21,8 @@ import com.simibubi.create.content.trains.signal.SignalBlock.SignalType; import com.simibubi.create.content.trains.signal.SignalBoundary; import com.simibubi.create.content.trains.signal.SignalEdgeGroup; import com.simibubi.create.content.trains.station.GlobalStation; -import com.simibubi.create.foundation.utility.Pair; +import net.createmod.catnip.utility.Pair; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceKey; import net.minecraft.server.MinecraftServer; diff --git a/src/main/java/com/simibubi/create/compat/trainmap/TrainMapSyncClient.java b/src/main/java/com/simibubi/create/compat/trainmap/TrainMapSyncClient.java index 321b40fc4b..694240bfce 100644 --- a/src/main/java/com/simibubi/create/compat/trainmap/TrainMapSyncClient.java +++ b/src/main/java/com/simibubi/create/compat/trainmap/TrainMapSyncClient.java @@ -8,8 +8,9 @@ import java.util.UUID; import com.simibubi.create.AllPackets; import com.simibubi.create.compat.trainmap.TrainMapSync.TrainMapSyncEntry; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.Pair; + +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.Pair; public class TrainMapSyncClient { diff --git a/src/main/java/com/simibubi/create/compat/trainmap/TrainMapSyncPacket.java b/src/main/java/com/simibubi/create/compat/trainmap/TrainMapSyncPacket.java index 0c37037596..76a5341e6b 100644 --- a/src/main/java/com/simibubi/create/compat/trainmap/TrainMapSyncPacket.java +++ b/src/main/java/com/simibubi/create/compat/trainmap/TrainMapSyncPacket.java @@ -7,8 +7,8 @@ import java.util.UUID; import com.simibubi.create.compat.trainmap.TrainMapSync.TrainMapSyncEntry; import com.simibubi.create.content.trains.graph.DimensionPalette; import com.simibubi.create.foundation.networking.SimplePacketBase; -import com.simibubi.create.foundation.utility.Pair; +import net.createmod.catnip.utility.Pair; import net.minecraft.network.FriendlyByteBuf; import net.minecraftforge.network.NetworkEvent.Context; diff --git a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/DisplaySource.java b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/DisplaySource.java index d6070ec89d..53874302f1 100644 --- a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/DisplaySource.java +++ b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/DisplaySource.java @@ -12,8 +12,8 @@ import com.simibubi.create.content.redstone.displayLink.target.DisplayTargetStat import com.simibubi.create.content.trains.display.FlapDisplayBlockEntity; import com.simibubi.create.content.trains.display.FlapDisplayLayout; import com.simibubi.create.foundation.gui.ModularGuiLineBuilder; -import com.simibubi.create.foundation.utility.NBTProcessors; +import net.createmod.catnip.utility.NBTProcessors; import net.createmod.catnip.utility.lang.Components; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/renderer/SafeBlockEntityRenderer.java b/src/main/java/com/simibubi/create/foundation/blockEntity/renderer/SafeBlockEntityRenderer.java index d9b8d4c699..2a12be7f67 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/renderer/SafeBlockEntityRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/renderer/SafeBlockEntityRenderer.java @@ -2,8 +2,7 @@ package com.simibubi.create.foundation.blockEntity.renderer; import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.foundation.ponder.PonderWorld; - +import net.createmod.ponder.api.level.PonderLevel; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; @@ -32,7 +31,7 @@ public abstract class SafeBlockEntityRenderer implements } public boolean shouldCullItem(Vec3 itemPos, Level level) { - if (level instanceof PonderWorld) + if (level instanceof PonderLevel) return false; Frustum frustum = Minecraft.getInstance().levelRenderer.capturedFrustum != null ? diff --git a/src/main/java/com/simibubi/create/foundation/render/RenderTypes.java b/src/main/java/com/simibubi/create/foundation/render/RenderTypes.java index d626e1420a..27d2f6f5d7 100644 --- a/src/main/java/com/simibubi/create/foundation/render/RenderTypes.java +++ b/src/main/java/com/simibubi/create/foundation/render/RenderTypes.java @@ -1,14 +1,17 @@ package com.simibubi.create.foundation.render; import java.io.IOException; +import java.util.function.BiFunction; import com.mojang.blaze3d.vertex.DefaultVertexFormat; import com.mojang.blaze3d.vertex.VertexFormat; import com.simibubi.create.Create; +import net.minecraft.Util; import net.minecraft.client.renderer.RenderStateShard; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.ShaderInstance; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.packs.resources.ResourceProvider; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.RegisterShadersEvent; From 0632dc46053db730d1cb9462bc21e6fee2608c36 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Wed, 9 Oct 2024 21:07:52 +0200 Subject: [PATCH 072/515] We'll come back to that one --- gradle.properties | 2 +- .../schematics/client/SchematicHandler.java | 3 --- .../utility/CreateNBTProcessors.java | 23 ++++++++++++++++++- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/gradle.properties b/gradle.properties index 4749e91a69..e1a6dff55d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -28,7 +28,7 @@ jei_minecraft_version = 1.20.1 jei_version = 15.10.0.39 curios_minecraft_version = 1.20.1 curios_version = 5.3.1 -catnip_version = 0.8.11 +catnip_version = 0.8.15 ponder_version = 0.8.8 cc_tweaked_enable = true diff --git a/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java b/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java index 88cbee6c52..de9048e0ef 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java @@ -169,7 +169,6 @@ public class SchematicHandler implements IGuiOverlay { schematic.placeInWorld(w, pos, pos, placementSettings, w.getRandom(), Block.UPDATE_CLIENTS); for (BlockEntity blockEntity : w.getBlockEntities()) blockEntity.setLevel(w); - w.fixControllerBlockEntities(); } catch (Exception e) { Minecraft.getInstance().player.displayClientMessage(CreateLang.translate("schematic.error") .component(), false); @@ -184,7 +183,6 @@ public class SchematicHandler implements IGuiOverlay { placementSettings.getMirror()); for (BlockEntity be : wMirroredFB.getRenderedBlockEntities()) transform.apply(be); - wMirroredFB.fixControllerBlockEntities(); placementSettings.setMirror(Mirror.LEFT_RIGHT); pos = BlockPos.ZERO.south(size.getZ() - 1); @@ -193,7 +191,6 @@ public class SchematicHandler implements IGuiOverlay { placementSettings.getMirror()); for (BlockEntity be : wMirroredLR.getRenderedBlockEntities()) transform.apply(be); - wMirroredLR.fixControllerBlockEntities(); renderers.get(0) .display(w); diff --git a/src/main/java/com/simibubi/create/foundation/utility/CreateNBTProcessors.java b/src/main/java/com/simibubi/create/foundation/utility/CreateNBTProcessors.java index e604eb4251..5b7c672656 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/CreateNBTProcessors.java +++ b/src/main/java/com/simibubi/create/foundation/utility/CreateNBTProcessors.java @@ -1,7 +1,10 @@ package com.simibubi.create.foundation.utility; +import java.util.List; + import com.simibubi.create.AllBlockEntityTypes; +import net.createmod.catnip.utility.NBTHelper; import net.createmod.catnip.utility.NBTProcessors; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; @@ -39,10 +42,28 @@ public class CreateNBTProcessors { } return data; }); + + NBTProcessors.addProcessor(AllBlockEntityTypes.CLIPBOARD.get(), data -> { + if (!data.contains("Item", Tag.TAG_COMPOUND)) + return data; + CompoundTag book = data.getCompound("Item"); + + if (!book.contains("tag", Tag.TAG_COMPOUND)) + return data; + CompoundTag itemData = book.getCompound("tag"); + + for (List entries : NBTHelper.readCompoundList(itemData.getList("Pages", Tag.TAG_COMPOUND), + pageTag -> NBTHelper.readCompoundList(pageTag.getList("Entries", Tag.TAG_COMPOUND), + tag -> tag.getString("Text")))) { + for (String entry : entries) + if (NBTProcessors.textComponentHasClickEvent(entry)) + return null; + } + return data; + }); NBTProcessors.addProcessor(AllBlockEntityTypes.CREATIVE_CRATE.get(), NBTProcessors.itemProcessor("Filter")); NBTProcessors.addProcessor(AllBlockEntityTypes.PLACARD.get(), NBTProcessors.itemProcessor("Item")); - } } From 8f71351b5705494e3b23fb7fa1055f0fbf12bfdf Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Wed, 9 Oct 2024 21:36:11 +0200 Subject: [PATCH 073/515] Lost widgets --- .../create/foundation/gui/AllGuiTextures.java | 6 +++--- .../assets/create/textures/gui/widgets.png | Bin 10512 -> 11364 bytes 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java index 8f335ac547..0b31e39d01 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java @@ -206,9 +206,9 @@ public enum AllGuiTextures implements ScreenElement, TextureSheetSegment { TRAINMAP_STATION_ORTHO_HIGHLIGHT("widgets", 63, 156, 7, 7), TRAINMAP_STATION_DIAGO_HIGHLIGHT("widgets", 72, 156, 7, 7), - TRAINMAP_TOGGLE_PANEL("widgets", 166, 74, 33, 14), - TRAINMAP_TOGGLE_ON("widgets", 166, 89, 12, 7), - TRAINMAP_TOGGLE_OFF("widgets", 166, 97, 12, 7), + TRAINMAP_TOGGLE_PANEL("widgets", 219, 4, 33, 14), + TRAINMAP_TOGGLE_ON("widgets", 219, 19, 12, 7), + TRAINMAP_TOGGLE_OFF("widgets", 219, 27, 12, 7), // ComputerCraft COMPUTER("computer", 200, 102); diff --git a/src/main/resources/assets/create/textures/gui/widgets.png b/src/main/resources/assets/create/textures/gui/widgets.png index 02de6640b58643abae723bc9a0686ba0cc56f887..ef1978a55c02e14b9558838580e5b6eb9ee7e800 100644 GIT binary patch literal 11364 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 MFLa*QC|O7RFKb5fT>t<8 From 79e975ca60a517f5f4aaf24fb41c0874c82ff77a Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Thu, 10 Oct 2024 11:55:35 +0200 Subject: [PATCH 074/515] Reintroduce schematic fix from patch I --- .../schematics/client/SchematicHandler.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java b/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java index de9048e0ef..699d6f532c 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java @@ -16,6 +16,8 @@ import com.simibubi.create.content.schematics.SchematicItem; import com.simibubi.create.content.schematics.client.tools.ToolType; import com.simibubi.create.content.schematics.packet.SchematicPlacePacket; import com.simibubi.create.content.schematics.packet.SchematicSyncPacket; +import com.simibubi.create.foundation.blockEntity.IMultiBlockEntityContainer; +import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.utility.CreateLang; import net.createmod.catnip.render.SuperRenderTypeBuffer; @@ -169,6 +171,7 @@ public class SchematicHandler implements IGuiOverlay { schematic.placeInWorld(w, pos, pos, placementSettings, w.getRandom(), Block.UPDATE_CLIENTS); for (BlockEntity blockEntity : w.getBlockEntities()) blockEntity.setLevel(w); + fixControllerBlockEntities(w); } catch (Exception e) { Minecraft.getInstance().player.displayClientMessage(CreateLang.translate("schematic.error") .component(), false); @@ -183,6 +186,7 @@ public class SchematicHandler implements IGuiOverlay { placementSettings.getMirror()); for (BlockEntity be : wMirroredFB.getRenderedBlockEntities()) transform.apply(be); + fixControllerBlockEntities(wMirroredFB); placementSettings.setMirror(Mirror.LEFT_RIGHT); pos = BlockPos.ZERO.south(size.getZ() - 1); @@ -191,6 +195,7 @@ public class SchematicHandler implements IGuiOverlay { placementSettings.getMirror()); for (BlockEntity be : wMirroredLR.getRenderedBlockEntities()) transform.apply(be); + fixControllerBlockEntities(wMirroredLR); renderers.get(0) .display(w); @@ -200,6 +205,26 @@ public class SchematicHandler implements IGuiOverlay { .display(wMirroredLR); } + private void fixControllerBlockEntities(SchematicLevel level) { + for (BlockEntity blockEntity : level.getBlockEntities()) { + if (!(blockEntity instanceof IMultiBlockEntityContainer multiBlockEntity)) + continue; + BlockPos lastKnown = multiBlockEntity.getLastKnownPos(); + BlockPos current = blockEntity.getBlockPos(); + if (lastKnown == null || current == null) + continue; + if (multiBlockEntity.isController()) + continue; + if (!lastKnown.equals(current)) { + BlockPos newControllerPos = multiBlockEntity.getController() + .offset(current.subtract(lastKnown)); + if (multiBlockEntity instanceof SmartBlockEntity sbe) + sbe.markVirtual(); + multiBlockEntity.setController(newControllerPos); + } + } + } + public void render(PoseStack ms, SuperRenderTypeBuffer buffer, Vec3 camera) { boolean present = activeSchematicItem != null; if (!active && !present) From a6883a441faaadceb96c1bf506303f1de160f662 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Thu, 10 Oct 2024 12:46:14 +0200 Subject: [PATCH 075/515] I sawed this box in half! - Tweaked package item rendering on saws and belts - Saws can now open packages --- .../content/kinetics/belt/BeltRenderer.java | 6 +- .../content/kinetics/saw/SawBlockEntity.java | 22 +++- .../content/kinetics/saw/SawRenderer.java | 112 +++++++++++------- .../logistics/chute/ChuteRenderer.java | 6 +- .../logistics/depot/DepotRenderer.java | 6 +- .../logistics/depot/EjectorRenderer.java | 7 +- 6 files changed, 101 insertions(+), 58 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltRenderer.java b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltRenderer.java index d683ad9af1..04bea7e747 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltRenderer.java +++ b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltRenderer.java @@ -324,7 +324,7 @@ public class BeltRenderer extends SafeBlockEntityRenderer { for (int i = 0; i <= count; i++) { ms.pushPose(); - boolean box = transported.stack.getItem() instanceof PackageItem; + boolean box = PackageItem.isPackage(transported.stack); ms.mulPose(Axis.YP.rotationDegrees(transported.angle)); if (!blockItem && !renderUpright) { ms.translate(0, -.09375, 0); @@ -335,8 +335,8 @@ public class BeltRenderer extends SafeBlockEntityRenderer { ms.translate(r.nextFloat() * .0625f * i, 0, r.nextFloat() * .0625f * i); if (box) { - ms.translate(0, 6 / 16f, 0); - ms.scale(2f, 2f, 2f); + ms.translate(0, 4 / 16f, 0); + ms.scale(1.5f, 1.5f, 1.5f); } else ms.scale(.5f, .5f, .5f); itemRenderer.render(transported.stack, ItemDisplayContext.FIXED, false, ms, buffer, stackLight, overlay, bakedModel); diff --git a/src/main/java/com/simibubi/create/content/kinetics/saw/SawBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/saw/SawBlockEntity.java index d27d2d8daf..d7ea5f3d6e 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/saw/SawBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/saw/SawBlockEntity.java @@ -16,6 +16,7 @@ import com.simibubi.create.AllRecipeTypes; import com.simibubi.create.AllSoundEvents; import com.simibubi.create.content.kinetics.base.BlockBreakingKineticBlockEntity; import com.simibubi.create.content.kinetics.belt.behaviour.DirectBeltInputBehaviour; +import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.content.processing.recipe.ProcessingInventory; import com.simibubi.create.content.processing.sequenced.SequencedAssemblyRecipe; import com.simibubi.create.foundation.advancement.AllAdvancements; @@ -67,6 +68,7 @@ import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.ForgeCapabilities; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.ItemStackHandler; import net.minecraftforge.registries.ForgeRegistries; @ParametersAreNonnullByDefault @@ -325,6 +327,22 @@ public class SawBlockEntity extends BlockBreakingKineticBlockEntity { } private void applyRecipe() { + ItemStack input = inventory.getStackInSlot(0); + List list = new ArrayList<>(); + + if (PackageItem.isPackage(input)) { + inventory.clear(); + ItemStackHandler results = PackageItem.getContents(input); + for (int i = 0; i < results.getSlots(); i++) { + ItemStack stack = results.getStackInSlot(i); + if (!stack.isEmpty()) + ItemHelper.addToList(stack, list); + } + for (int slot = 0; slot < list.size() && slot + 1 < inventory.getSlots(); slot++) + inventory.setStackInSlot(slot + 1, list.get(slot)); + return; + } + List> recipes = getRecipes(); if (recipes.isEmpty()) return; @@ -333,11 +351,9 @@ public class SawBlockEntity extends BlockBreakingKineticBlockEntity { Recipe recipe = recipes.get(recipeIndex); - int rolls = inventory.getStackInSlot(0) - .getCount(); + int rolls = input.getCount(); inventory.clear(); - List list = new ArrayList<>(); for (int roll = 0; roll < rolls; roll++) { List results = new LinkedList(); if (recipe instanceof CuttingRecipe) diff --git a/src/main/java/com/simibubi/create/content/kinetics/saw/SawRenderer.java b/src/main/java/com/simibubi/create/content/kinetics/saw/SawRenderer.java index 142147b42d..d1d794eadb 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/saw/SawRenderer.java +++ b/src/main/java/com/simibubi/create/content/kinetics/saw/SawRenderer.java @@ -9,12 +9,14 @@ import com.simibubi.create.content.contraptions.behaviour.MovementContext; import com.simibubi.create.content.contraptions.render.ContraptionMatrices; import com.simibubi.create.content.kinetics.base.KineticBlockEntity; import com.simibubi.create.content.kinetics.base.KineticBlockEntityRenderer; +import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.foundation.blockEntity.behaviour.filtering.FilteringRenderer; import com.simibubi.create.foundation.blockEntity.renderer.SafeBlockEntityRenderer; import com.simibubi.create.foundation.virtualWorld.VirtualRenderWorld; import dev.engine_room.flywheel.api.visualization.VisualizationManager; import dev.engine_room.flywheel.lib.model.baked.PartialModel; +import dev.engine_room.flywheel.lib.transform.TransformStack; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.VecHelper; @@ -36,8 +38,7 @@ import net.minecraft.world.phys.Vec3; public class SawRenderer extends SafeBlockEntityRenderer { - public SawRenderer(BlockEntityRendererProvider.Context context) { - } + public SawRenderer(BlockEntityRendererProvider.Context context) {} @Override protected void renderSafe(SawBlockEntity be, float partialTicks, PoseStack ms, MultiBufferSource buffer, int light, @@ -93,53 +94,81 @@ public class SawRenderer extends SafeBlockEntityRenderer { buffer.getBuffer(RenderType.solid()), light); } - protected void renderItems(SawBlockEntity be, float partialTicks, PoseStack ms, MultiBufferSource buffer, - int light, int overlay) { - boolean processingMode = be.getBlockState() - .getValue(SawBlock.FACING) == Direction.UP; - if (processingMode && !be.inventory.isEmpty()) { - boolean alongZ = !be.getBlockState() - .getValue(SawBlock.AXIS_ALONG_FIRST_COORDINATE); + protected void renderItems(SawBlockEntity be, float partialTicks, PoseStack ms, MultiBufferSource buffer, int light, + int overlay) { + if (be.getBlockState() + .getValue(SawBlock.FACING) != Direction.UP) + return; + if (be.inventory.isEmpty()) + return; + + boolean alongZ = !be.getBlockState() + .getValue(SawBlock.AXIS_ALONG_FIRST_COORDINATE); + + float duration = be.inventory.recipeDuration; + boolean moving = duration != 0; + float offset = moving ? (float) (be.inventory.remainingTime) / duration : 0; + float processingSpeed = Mth.clamp(Math.abs(be.getSpeed()) / 32, 1, 128); + if (moving) { + offset = Mth.clamp(offset + ((-partialTicks + .5f) * processingSpeed) / duration, 0.125f, 1f); + if (!be.inventory.appliedRecipe) + offset += 1; + offset /= 2; + } + + if (be.getSpeed() == 0) + offset = .5f; + if (be.getSpeed() < 0 ^ alongZ) + offset = 1 - offset; + + int outputs = 0; + for (int i = 1; i < be.inventory.getSlots(); i++) + if (!be.inventory.getStackInSlot(i) + .isEmpty()) + outputs++; + + ms.pushPose(); + if (alongZ) + ms.mulPose(Axis.YP.rotationDegrees(90)); + ms.translate(outputs <= 1 ? .5 : .25, 0, offset); + + int renderedI = 0; + for (int i = 0; i < be.inventory.getSlots(); i++) { + ItemStack stack = be.inventory.getStackInSlot(i); + if (stack.isEmpty()) + continue; + + ItemRenderer itemRenderer = Minecraft.getInstance() + .getItemRenderer(); + BakedModel modelWithOverrides = itemRenderer.getModel(stack, be.getLevel(), null, 0); + boolean blockItem = modelWithOverrides.isGui3d(); + ms.pushPose(); + ms.translate(0, blockItem ? .925f : 13f / 16f, 0); - boolean moving = be.inventory.recipeDuration != 0; - float offset = moving ? (float) (be.inventory.remainingTime) / be.inventory.recipeDuration : 0; - float processingSpeed = Mth.clamp(Math.abs(be.getSpeed()) / 32, 1, 128); - if (moving) { - offset = Mth - .clamp(offset + ((-partialTicks + .5f) * processingSpeed) / be.inventory.recipeDuration, 0.125f, 1f); - if (!be.inventory.appliedRecipe) - offset += 1; - offset /= 2; + if (i > 0 && outputs > 1) { + ms.translate((0.5 / (outputs - 1)) * renderedI, 0, 0); + TransformStack.of(ms) + .nudge(i * 133); } - if (be.getSpeed() == 0) - offset = .5f; - if (be.getSpeed() < 0 ^ alongZ) - offset = 1 - offset; - - for (int i = 0; i < be.inventory.getSlots(); i++) { - ItemStack stack = be.inventory.getStackInSlot(i); - if (stack.isEmpty()) - continue; - - ItemRenderer itemRenderer = Minecraft.getInstance() - .getItemRenderer(); - BakedModel modelWithOverrides = itemRenderer.getModel(stack, be.getLevel(), null, 0); - boolean blockItem = modelWithOverrides.isGui3d(); - - ms.translate(alongZ ? offset : .5, blockItem ? .925f : 13f / 16f, alongZ ? .5 : offset); - + boolean box = PackageItem.isPackage(stack); + if (box) { + ms.translate(0, 4 / 16f, 0); + ms.scale(1.5f, 1.5f, 1.5f); + } else ms.scale(.5f, .5f, .5f); - if (alongZ) - ms.mulPose(Axis.YP.rotationDegrees(90)); + + if (!box) ms.mulPose(Axis.XP.rotationDegrees(90)); - itemRenderer.render(stack, ItemDisplayContext.FIXED, false, ms, buffer, light, overlay, modelWithOverrides); - break; - } + + itemRenderer.render(stack, ItemDisplayContext.FIXED, false, ms, buffer, light, overlay, modelWithOverrides); + renderedI++; ms.popPose(); } + + ms.popPose(); } protected SuperByteBuffer getRotatedModel(KineticBlockEntity be) { @@ -149,8 +178,7 @@ public class SawRenderer extends SafeBlockEntityRenderer { .isHorizontal()) return CachedBuffers.partialFacing(AllPartialModels.SHAFT_HALF, state.rotate(be.getLevel(), be.getBlockPos(), Rotation.CLOCKWISE_180)); - return CachedBuffers.block(KineticBlockEntityRenderer.KINETIC_BLOCK, - getRenderedBlockState(be)); + return CachedBuffers.block(KineticBlockEntityRenderer.KINETIC_BLOCK, getRenderedBlockState(be)); } protected BlockState getRenderedBlockState(KineticBlockEntity be) { diff --git a/src/main/java/com/simibubi/create/content/logistics/chute/ChuteRenderer.java b/src/main/java/com/simibubi/create/content/logistics/chute/ChuteRenderer.java index a9b11c0424..aa5c950899 100644 --- a/src/main/java/com/simibubi/create/content/logistics/chute/ChuteRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/chute/ChuteRenderer.java @@ -43,10 +43,10 @@ public class ChuteRenderer extends SafeBlockEntityRenderer { float itemScale = .5f; float itemPosition = be.itemPosition.getValue(partialTicks); ms.translate(0, -.5 + itemPosition, 0); - ms.scale(itemScale, itemScale, itemScale); - if (be.item.getItem() instanceof PackageItem) { - ms.scale(3, 3, 3); + if (PackageItem.isPackage(be.item)) { + ms.scale(1.5f, 1.5f, 1.5f); } else { + ms.scale(itemScale, itemScale, itemScale); msr.rotateXDegrees(itemPosition * 180); msr.rotateYDegrees(itemPosition * 180); } diff --git a/src/main/java/com/simibubi/create/content/logistics/depot/DepotRenderer.java b/src/main/java/com/simibubi/create/content/logistics/depot/DepotRenderer.java index 6ed187ccad..1a458775ca 100644 --- a/src/main/java/com/simibubi/create/content/logistics/depot/DepotRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/depot/DepotRenderer.java @@ -130,9 +130,9 @@ public class DepotRenderer extends SafeBlockEntityRenderer { if (blockItem && r != null) ms.translate(r.nextFloat() * .0625f * i, 0, r.nextFloat() * .0625f * i); - if (itemStack.getItem() instanceof PackageItem) { - ms.translate(0, 6/16f, 0); - ms.scale(2f, 2f, 2f); + if (PackageItem.isPackage(itemStack)) { + ms.translate(0, 4 / 16f, 0); + ms.scale(1.5f, 1.5f, 1.5f); } else ms.scale(.5f, .5f, .5f); diff --git a/src/main/java/com/simibubi/create/content/logistics/depot/EjectorRenderer.java b/src/main/java/com/simibubi/create/content/logistics/depot/EjectorRenderer.java index 28fab1e575..1317fe5285 100644 --- a/src/main/java/com/simibubi/create/content/logistics/depot/EjectorRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/depot/EjectorRenderer.java @@ -66,10 +66,9 @@ public class EjectorRenderer extends ShaftRenderer { Vec3 itemRotOffset = VecHelper.voxelSpace(0, 2, -1); msr.translate(itemRotOffset); - if (intAttached.getValue() - .getItem() instanceof PackageItem) { - ms.translate(0, 6 / 16f, 0); - ms.scale(2f, 2f, 2f); + if (PackageItem.isPackage(intAttached.getValue())) { + ms.translate(0, 4 / 16f, 0); + ms.scale(1.5f, 1.5f, 1.5f); msr.rotateYDegrees(time * 20); } else { ms.scale(.5f, .5f, .5f); From 50702d36ee3a905e7a7f29a35b32063c7dafd21b Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Tue, 15 Oct 2024 13:21:34 +0200 Subject: [PATCH 076/515] Home run - Added Cardboard materials and the Cardboard 'Sword' --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 118 +++++++++++++++- .../499d9d953ee69b539ff4dd4c95a6cbd849f63f67 | 4 +- .../82992cbf8f2794d83ac94034835eac0acd7915b9 | 10 +- .../b256105d8411632b0d585496ea8944a751a08034 | 4 +- .../c24b4d2b8d15abff51c78bd94f4403d9eae6c139 | 4 +- .../resources/assets/create/lang/en_ud.json | 8 +- .../resources/assets/create/lang/en_us.json | 8 +- .../assets/create/models/item/cardboard.json | 6 + .../create/models/item/cardboard_pulp.json | 6 + .../create/models/item/cardboard_sword.json | 6 + .../resources/assets/create/sounds.json | 9 ++ .../create/recipes/mixing/cardboard_pulp.json | 51 +++++++ .../create/recipes/pressing/cardboard.json | 13 ++ .../forge/tags/items/plates/cardboard.json | 5 + .../java/com/simibubi/create/AllItems.java | 10 +- .../com/simibubi/create/AllSoundEvents.java | 6 +- .../equipment/tool/AllToolMaterials.java | 66 +++++++++ .../equipment/tool/CardboardSwordItem.java | 129 ++++++++++++++++++ .../content/logistics/box/PackageEntity.java | 6 +- .../data/recipe/MixingRecipeGen.java | 16 +++ .../data/recipe/PressingRecipeGen.java | 3 + .../assets/create/sounds/cardboard_bonk.ogg | Bin 0 -> 13746 bytes .../assets/create/textures/item/cardboard.png | Bin 0 -> 248 bytes .../create/textures/item/cardboard_pulp.png | Bin 0 -> 280 bytes .../create/textures/item/cardboard_sword.png | Bin 0 -> 250 bytes 25 files changed, 466 insertions(+), 22 deletions(-) create mode 100644 src/generated/resources/assets/create/models/item/cardboard.json create mode 100644 src/generated/resources/assets/create/models/item/cardboard_pulp.json create mode 100644 src/generated/resources/assets/create/models/item/cardboard_sword.json create mode 100644 src/generated/resources/data/create/recipes/mixing/cardboard_pulp.json create mode 100644 src/generated/resources/data/create/recipes/pressing/cardboard.json create mode 100644 src/generated/resources/data/forge/tags/items/plates/cardboard.json create mode 100644 src/main/java/com/simibubi/create/content/equipment/tool/AllToolMaterials.java create mode 100644 src/main/java/com/simibubi/create/content/equipment/tool/CardboardSwordItem.java create mode 100644 src/main/resources/assets/create/sounds/cardboard_bonk.ogg create mode 100644 src/main/resources/assets/create/textures/item/cardboard.png create mode 100644 src/main/resources/assets/create/textures/item/cardboard_pulp.png create mode 100644 src/main/resources/assets/create/textures/item/cardboard_sword.png diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index b015606670..b90d4f8153 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-09-03T11:32:11.6637155 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-10-15T12:45:53.6413921 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -23,12 +23,14 @@ a97910c7516e7cedec9e34eca51f1183f1e3e681 assets/create/blockstates/belt.json 0ea03133af234921a3313f52521d8cfd02bf5d81 assets/create/blockstates/birch_window.json 2003c43151b731bf19cae58290c63bcb3785848a assets/create/blockstates/birch_window_pane.json c8b65faf51122eb411f5895e718869da9b260c2e assets/create/blockstates/black_nixie_tube.json +edcdce7ec6afbaa00952131df4b3f2c93c2c6919 assets/create/blockstates/black_postbox.json 980ae9ba3f6d4e0faea8f3878985f9a9dadc0796 assets/create/blockstates/black_sail.json da3ad0225984a0dcbfb4ed800e307e45aff5aaa1 assets/create/blockstates/black_seat.json 0083f6aa3fda2c7ebb2e5f2a032e740cf3ae3846 assets/create/blockstates/black_toolbox.json 28f2fb355e80171403e540afd2aed44e9c19659a assets/create/blockstates/black_valve_handle.json 06ecd28cd97f4e8200dc396858695cad57b871c8 assets/create/blockstates/blaze_burner.json 37caf031254b5171a1fbfe9906f4bc65e8dbc909 assets/create/blockstates/blue_nixie_tube.json +54f6aae1d573b27979689301ef1c2ad4a3bf6e93 assets/create/blockstates/blue_postbox.json d540f0f23e0d7c03f8e147cf3eebbaf7caec9f93 assets/create/blockstates/blue_sail.json d2fdb432bb037de781260c789e905b223fab408c assets/create/blockstates/blue_seat.json f91092da79b69fece9583ccc15350612f439ee1b assets/create/blockstates/blue_toolbox.json @@ -46,12 +48,14 @@ a408005aae4c1caa7aaae5a0ddf9d1ad73cd0254 assets/create/blockstates/brass_funnel. 6d210298b9d80ae69aa03b09aa73b92e14b9ab1b assets/create/blockstates/brass_scaffolding.json 8ee948f9e87b82bb27aaecc522127fa1297b3d9d assets/create/blockstates/brass_tunnel.json debf33346bf410216f21082e1e8d07aa6250b84c assets/create/blockstates/brown_nixie_tube.json +c23d7f691bf532d6b27317c0063289a8bd747de2 assets/create/blockstates/brown_postbox.json 1334fc9e71d9f2a6117f448817263467a9c695de assets/create/blockstates/brown_sail.json 19524b2c0672632e63372f405a87dbea35f1d160 assets/create/blockstates/brown_seat.json 1ffc38bf682e84aad4cb300c573375eb0cdcc434 assets/create/blockstates/brown_toolbox.json 440b29e1dffa4374ddc1aed444bff18a485bc1cb assets/create/blockstates/brown_valve_handle.json 2064534de4791b339fdcd4ef3a8129a2e233ec50 assets/create/blockstates/calcite_pillar.json 060c957b28afed9f4e0954cbef7e80cbf4b99f58 assets/create/blockstates/cart_assembler.json +fab98b93ad9b78312742daca83c2575db40fce98 assets/create/blockstates/chain_conveyor.json c7eca70054241944171b1d4ffcba0376b071ec62 assets/create/blockstates/chocolate.json 9eb989b0a0545af9efd052d1f127b2ec28a972d1 assets/create/blockstates/chute.json b5170d754ce5f07ea2b4646eb07c099c50bae249 assets/create/blockstates/clipboard.json @@ -202,6 +206,7 @@ beb9e47f8d811c2146f68daf992fb805342a65cb assets/create/blockstates/cut_veridium. c11f09df4a23e951bdf9a345515183f4fac7cde3 assets/create/blockstates/cut_veridium_stairs.json 3aa6f5e613ff73952e3de00408051f92316e7f81 assets/create/blockstates/cut_veridium_wall.json bb627b2e78dba6833cf2d357033f253fc89aa1b8 assets/create/blockstates/cyan_nixie_tube.json +3406ab8baa7d9e9892c059c27b5ace92aadc2a80 assets/create/blockstates/cyan_postbox.json f1061b8f9757374d6608fda07e301a2623e79f72 assets/create/blockstates/cyan_sail.json 538c6d95da5cc460e99c91647dac61726a91479f assets/create/blockstates/cyan_seat.json c4d84b719762aca46cdb8decddfeb97dcc50676c assets/create/blockstates/cyan_toolbox.json @@ -244,11 +249,13 @@ ff9f56912d8ac4069df90505232820f9c45f5e06 assets/create/blockstates/gantry_carria 5a193991f33a1af8659192f3693e4d8d3ed0082b assets/create/blockstates/glass_fluid_pipe.json e3f2a093c436cb65c5a7ac049a14cc4dadb22526 assets/create/blockstates/granite_pillar.json 921cf220c44a67195c90a30c4c296e65311738da assets/create/blockstates/gray_nixie_tube.json +f3153de05bb7658cd2d27ed6becea1b2ea687ae3 assets/create/blockstates/gray_postbox.json 30ba031a6b5a327d2a4caa12169676da573c2133 assets/create/blockstates/gray_sail.json f35a502c4a5e2703e7c6811b3d2ba16a9c47d4c8 assets/create/blockstates/gray_seat.json 87457e0eddae80225dbb3145f2d120296ea1bfcd assets/create/blockstates/gray_toolbox.json f18b87db39836eef20154b239d488eebb64b3455 assets/create/blockstates/gray_valve_handle.json 0f0fe2bf83f763e04cd2d7a979beb547feac3191 assets/create/blockstates/green_nixie_tube.json +4446fdbf784366888215251fb082ff9b52c2ea6d assets/create/blockstates/green_postbox.json 0a2a5fbf2cf084e1be0426a224c291dc22a826fd assets/create/blockstates/green_sail.json b4aede1847d204ecdb7847559066d9d2ffb66903 assets/create/blockstates/green_seat.json 6f080890b3b30c46ba9ceb382c1171940bf4966f assets/create/blockstates/green_toolbox.json @@ -261,6 +268,7 @@ bffc2169f5fc3a8e22f8952a90767e0bb8d726b5 assets/create/blockstates/horizontal_fr 8ae52808eba950c36b75d62113e9cea9441a1a54 assets/create/blockstates/hose_pulley.json 87fa830c5d3541d096fab32d430c54516c197583 assets/create/blockstates/industrial_iron_block.json 2788ad2d29996076f7f18ab8d47e40c1ad10b348 assets/create/blockstates/item_drain.json +e840d746532f350ee2977c00036163f73c3f4147 assets/create/blockstates/item_hatch.json 3e99569e978c0fe17ec18b97881434a9da1a8421 assets/create/blockstates/item_vault.json 8680e9d2a94231f4bbad87b26ab2efdb714903d3 assets/create/blockstates/jungle_window.json ddcf1010e43c5d4a8c93aad37cc97a94343fd9f5 assets/create/blockstates/jungle_window_pane.json @@ -283,11 +291,13 @@ ca124508c59130d21f23d7b1ef354d78bdd24dd4 assets/create/blockstates/layered_tuff. 2ff5466f9ea3b1292c24a8ddb31666d74635c592 assets/create/blockstates/layered_veridium.json fcf02725651ab5973fab1cfc09fdd68cb4b93579 assets/create/blockstates/lectern_controller.json 5d7e1b08b1ec7c7c11b70db11df09311fcd7cf45 assets/create/blockstates/light_blue_nixie_tube.json +f77864045801c12e9308f9ae75fa7c78de15bb7e assets/create/blockstates/light_blue_postbox.json f2354e8cb6086473ac97a5228b99706858dcad8a assets/create/blockstates/light_blue_sail.json 6b7045eaf9efe3a90f2d9a6785be6a5fd534b8e7 assets/create/blockstates/light_blue_seat.json b7065e7871c3c7f1a0656c2f92f82544e606f2fb assets/create/blockstates/light_blue_toolbox.json 549882a0f4de60906ca870a6197330f81d4e1afe assets/create/blockstates/light_blue_valve_handle.json fa5fb2be73c7c54b70e927b66adf3f4d64c5cb6b assets/create/blockstates/light_gray_nixie_tube.json +63aa0bfbba64796ec0096972585d15d5cbed7508 assets/create/blockstates/light_gray_postbox.json 3d95c9c4442d1bdd660bae382c72c68134db86dd assets/create/blockstates/light_gray_sail.json 8ec5144da4a49dd5b497af07b0d4b88c9c0b6cc0 assets/create/blockstates/light_gray_seat.json 35b151db396069b146d223fbe46be5b0c3dda8a9 assets/create/blockstates/light_gray_toolbox.json @@ -295,6 +305,7 @@ fa5fb2be73c7c54b70e927b66adf3f4d64c5cb6b assets/create/blockstates/light_gray_ni a6f319c803c03e34bbf841ea52d82f0f7ec7a413 assets/create/blockstates/limestone.json 7ff65e1c4c8e48a0b694cd17506a192e6a7e6e44 assets/create/blockstates/limestone_pillar.json 7f20b548dd535942b2d6f41c39de7ad4fafe637e assets/create/blockstates/lime_nixie_tube.json +b1b07cbe36064d2755d0f2a4af036ec0506e6995 assets/create/blockstates/lime_postbox.json ad1ec304729fd6d336c0d4d0c27c9345af636695 assets/create/blockstates/lime_sail.json b9934a558e1b495403dc2c71ffb43cce7d396013 assets/create/blockstates/lime_seat.json 49a02f7fc16697ba1cf16cee7e45ab6bfd8b06ce assets/create/blockstates/lime_toolbox.json @@ -302,6 +313,7 @@ ba181485f219d3ae23509a7edf28e25d9edb10f4 assets/create/blockstates/lime_valve_ha 654e845cebed82b7afbcf81380921e0a475b01e9 assets/create/blockstates/linear_chassis.json e195e82e4d0c1fc20474535bc9068cbb77a5e175 assets/create/blockstates/lit_blaze_burner.json 296186b196af94e1ab3f7e8a3254f6d31ae47a5c assets/create/blockstates/magenta_nixie_tube.json +32cf7fc7e7b36b6ef873658946a40cf7c32d5da8 assets/create/blockstates/magenta_postbox.json f150922cbed1c05fb3892d4ac91eb471234252e2 assets/create/blockstates/magenta_sail.json bb1ab5c70647933400b3a99ef9d166ba5e3d4709 assets/create/blockstates/magenta_seat.json fcd226c7863262d98765c701538bf9e44d2b177e assets/create/blockstates/magenta_toolbox.json @@ -334,6 +346,7 @@ ba9c3ecfacbd398048440d247decffeaefc714b5 assets/create/blockstates/mysterious_cu 7f2c5728e24d60ed2f7a095e3a954d7ca4e410e9 assets/create/blockstates/oak_window_pane.json df91d0ca68934c1afd9858a8d1591dd4cb88df65 assets/create/blockstates/ochrum.json 09c9bee3d26edc4b87cb7a5042f125c439ee5956 assets/create/blockstates/ochrum_pillar.json +42799faa0c59e6ed410c1ef42eceef25c323090f assets/create/blockstates/orange_postbox.json af4c2c4861d1410e1b7371a5bf3fe09ed3ab0077 assets/create/blockstates/orange_sail.json aab812cecf7d10d4e7587f4dead8a98238a15f41 assets/create/blockstates/orange_seat.json 2bc30ed9907230271b4e2d0786f106f3e1e25029 assets/create/blockstates/orange_toolbox.json @@ -346,8 +359,12 @@ ac536ae742c12e97bfd0b2483c87ff29f3935eaf assets/create/blockstates/oxidized_copp 110a6c19bcc9f044e5e982ac6e4b295b03ec0145 assets/create/blockstates/oxidized_copper_tiles.json 3f3924f0f0e368edfa04f4fdd6d6c2319276ddfe assets/create/blockstates/oxidized_copper_tile_slab.json 5e634cfb9abb06d8b29f39d751fc56b28ea5a9cd assets/create/blockstates/oxidized_copper_tile_stairs.json +ef3af446b56c69e71a156d5998d9dc8e6d9ea4f5 assets/create/blockstates/packager.json +0f204afc6712a08d2db84bb07a0a49927f3127a6 assets/create/blockstates/packager_link.json +887565a0f89f089d6be888c87394dde4878afda7 assets/create/blockstates/package_frogport.json 36742cc6ce052ead143366d31b11e828a525c1b8 assets/create/blockstates/peculiar_bell.json 53d102e706d53cb2c0dbc0bc11da828084a43519 assets/create/blockstates/pink_nixie_tube.json +8889da0684a2fd247a769cadbf94fd45e1c218f2 assets/create/blockstates/pink_postbox.json 213da5c04a33ae8ae7c0a4dec9844bbb6d670e33 assets/create/blockstates/pink_sail.json 8d5c80d5dc561240dfe8d7f212ffc33ac4e0fcd8 assets/create/blockstates/pink_seat.json 90bd26c7c6933f5ebbe17b0fe58f840e2924a0f5 assets/create/blockstates/pink_toolbox.json @@ -418,7 +435,9 @@ b1f5ad596067cb4c84eb53b2c7b359be76f1cfbe assets/create/blockstates/powered_shaft df7af1e49c53ae99ac3f0b2fca5d948b8ea91938 assets/create/blockstates/pulley_magnet.json 89d763258c53aa12a1e0c0e586ab701f3de5a1b5 assets/create/blockstates/pulse_extender.json 81281435b8d1eeb4f1e318c6d14d49fa1fd86820 assets/create/blockstates/pulse_repeater.json +65bfd8283749117663f7199204691758fd286e38 assets/create/blockstates/pulse_timer.json b658654aa97e8dd2c897f432a601835a3f8aca10 assets/create/blockstates/purple_nixie_tube.json +af5db46f49be3c13eeb9bcae1803cc6fb47a1c76 assets/create/blockstates/purple_postbox.json f8f9802df9c0b4e39edeefc3b1abb38255d79801 assets/create/blockstates/purple_sail.json 91b5ab66d7ec5235d278ee2bed6ddd88f39ce81d assets/create/blockstates/purple_seat.json 6aa467b3588359fdf5d7201f844193d5b70f20f7 assets/create/blockstates/purple_toolbox.json @@ -428,7 +447,9 @@ f8f9802df9c0b4e39edeefc3b1abb38255d79801 assets/create/blockstates/purple_sail.j 7ce346fa18702f6fe6e2a939efcfa26eda63fe38 assets/create/blockstates/raw_zinc_block.json ec546afd3ec8036e4393b97d535f05a86f57dbc1 assets/create/blockstates/redstone_contact.json ff205f032b36486753dddb1f2029ef8d53e9c86f assets/create/blockstates/redstone_link.json +e3e0ea8069b354c29103948d0b5e79094587ef85 assets/create/blockstates/redstone_requester.json e3fd62e466e3e6e7bd6fc8661f764ba972a466fc assets/create/blockstates/red_nixie_tube.json +d7535074a636f30247e7bd2f1a21685d3231d321 assets/create/blockstates/red_postbox.json 4c36b562da58ef2af57009da7cf2426059249228 assets/create/blockstates/red_sail.json 145f4e9ffaeff9be180e6c4e4989f2cf44cf0686 assets/create/blockstates/red_seat.json 380f46b7cb72b13c0f16fd4a4287a1a33adeff41 assets/create/blockstates/red_toolbox.json @@ -521,6 +542,7 @@ a60c9c8241e40c2e28f5760c0ca6e80cfe9d59f3 assets/create/blockstates/steam_whistle 8865500bcd2e4d467e74edb3509850fa92a5809f assets/create/blockstates/sticker.json bed0534e618105184bc877b104230403ca85bb58 assets/create/blockstates/sticky_mechanical_piston.json bab242ab794e6d439645c2d5a0242ae7c81942ff assets/create/blockstates/stockpile_switch.json +9989bda294fbffc5f659d2e608e01dea424c7694 assets/create/blockstates/stock_ticker.json a70c025de5d85180f371ff05bbdc531d8bdfaab1 assets/create/blockstates/stressometer.json 8086f80c532fad42b37fcdc590b890ed7e8c3fe9 assets/create/blockstates/tiled_glass.json 1143ab7223c655764a81ed72ac385ea179664072 assets/create/blockstates/tiled_glass_pane.json @@ -572,6 +594,7 @@ fee668eb9a45dca0d287fee5811219d69f9ec3e2 assets/create/blockstates/weathered_cop da110f382368257e15431c77164aef82e014e3f8 assets/create/blockstates/weathered_copper_tile_stairs.json 25ce64b7af5d244f194da91ccf964a9bf5762327 assets/create/blockstates/weighted_ejector.json 2974b34a8cfb0d4e8e010f8bd085584ea631d541 assets/create/blockstates/white_nixie_tube.json +debbed52643d90ab054171f76622e54192be60ad assets/create/blockstates/white_postbox.json f079469d186087d23f0d91b384040f777b0088b1 assets/create/blockstates/white_sail.json 317a6463db64b66d215d25b65ab52fe7f26ba9f8 assets/create/blockstates/white_seat.json 6cb8c82a429b54d6a87d02eec5cfd1fcd5365f1e assets/create/blockstates/white_toolbox.json @@ -579,14 +602,15 @@ c0bfe8416173868f9916c4a54dd9f983887c5bac assets/create/blockstates/white_valve_h ec2720e3f1bc84304d0c81cd23ff1e155b0c2f2c assets/create/blockstates/windmill_bearing.json d688e80dfbd5b17970814887c3698fc721981caa assets/create/blockstates/wooden_bracket.json 157942a838aa02909fb2238ad9ce77edc82f6142 assets/create/blockstates/yellow_nixie_tube.json +f99bf11ac6b2d8d2a315f354d7704a938241d95e assets/create/blockstates/yellow_postbox.json 68b6e267e93b96dbc0596ea4a1cd26636aa0e04a assets/create/blockstates/yellow_sail.json 4face2dd50a30bda0b21742319e701e666d51f8c assets/create/blockstates/yellow_seat.json b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbox.json fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -1195fdc4fb51659c921e2bbe744a35107f787aa2 assets/create/lang/en_ud.json -632d1aac7255fc0f4804f4df138ce9926134d2f9 assets/create/lang/en_us.json +8ed3587c8b0fd48d591340803e6570490614e7a3 assets/create/lang/en_ud.json +4ccbf8f607fce6dfd1b32c0406ba571c9d335e9b assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -653,11 +677,13 @@ ee71b0992edc2496025c22806e8de3a3243882aa assets/create/models/block/birch_window 3088aa5e46cf9caa912c80a4e7791904e64e9def assets/create/models/block/birch_window_pane_side.json cb9d3a0dbac6a884d5ce0dc82085322f8c666707 assets/create/models/block/birch_window_pane_side_alt.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/black_nixie_tube.json +1fe4a9cbcae773f32c07f7cef42f52588ec1c1aa assets/create/models/block/black_postbox.json 62c92a681b5a86a5415cc7a70263ffdc794cdd59 assets/create/models/block/black_sail.json 443ed49b053fdd7356cd56f0495e18f2570d57d9 assets/create/models/block/black_seat.json f48989d377de8e5067e807adf7e38da781e37ed9 assets/create/models/block/black_toolbox.json 8715787d72c3ef47c5651abcd819539bad6a96f7 assets/create/models/block/black_valve_handle.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/blue_nixie_tube.json +e9e9487a3440b3a6c1ac515f63385ee59e8fb773 assets/create/models/block/blue_postbox.json ddc740084aa5f387bee062bd4141ad8fadb56355 assets/create/models/block/blue_sail.json 96431b1f3a531ce89f876c9286b81838aec9b6d3 assets/create/models/block/blue_seat.json 89932aab163b14a21fffd4fab4b8b88a94163089 assets/create/models/block/blue_toolbox.json @@ -710,6 +736,7 @@ b2a95218042586aae38dff9278f3ee3f159bc73e assets/create/models/block/brass_post_e ec81e9c237ec98b30a3de22e12cb9720922478eb assets/create/models/block/brass_side.json c697cace1f4097468ff34254c4ff6450d9d52f91 assets/create/models/block/brass_side_alt.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/brown_nixie_tube.json +b04c80852527a07e01c27686be678cbaf568e821 assets/create/models/block/brown_postbox.json 50a054d1e0660d16e86cf7a520b9bf36e38401b6 assets/create/models/block/brown_sail.json 0616de192825246e6036d1f69911170438a83b81 assets/create/models/block/brown_seat.json 4226a7c5f1bfb0a75457fb4dfd22448503110e5c assets/create/models/block/brown_toolbox.json @@ -1035,6 +1062,7 @@ d6423c0fd0af4fbd929d26d6097a1722567acc9d assets/create/models/block/cut_veridium b2e847cee8c01791c15fcdd35787af33ebe46f0a assets/create/models/block/cut_veridium_wall_side.json 5ab4db4245b852edf985fe72595f678eb7372801 assets/create/models/block/cut_veridium_wall_side_tall.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/cyan_nixie_tube.json +0cbd0c6c909effa2f71e198655d51f2e483454aa assets/create/models/block/cyan_postbox.json 27c9aff76b32e4de18d581e133fc23a8239ca412 assets/create/models/block/cyan_sail.json 01a324a92552076589e2aaaeca9d4da2d1e3b39d assets/create/models/block/cyan_seat.json 663f431fe8a02e057980cf9bcfc566eb5adc876f assets/create/models/block/cyan_toolbox.json @@ -1116,11 +1144,13 @@ d0fa41de17f65693188f1868ace5fc2ac518739b assets/create/models/block/gantry_shaft 3356069e112cde817da0c99ceb40cd8f207de822 assets/create/models/block/granite_pillar.json ee860a8bd95fda14a859d6632652ee2a95f06c19 assets/create/models/block/granite_pillar_horizontal.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/gray_nixie_tube.json +f2bbb067bc4e91a71303cc92939c4f4707cdc1ab assets/create/models/block/gray_postbox.json 97f382e9b435c81d1d8e0ed487a7fc16e6945958 assets/create/models/block/gray_sail.json 58b51da5c80e4f43582452d97453c93145a516ad assets/create/models/block/gray_seat.json cd3cff8e38d559dcb78df014556a78d5a538af43 assets/create/models/block/gray_toolbox.json 3ee19f46bdeb0ac7489dcd4d51f90ab01ad863c9 assets/create/models/block/gray_valve_handle.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/green_nixie_tube.json +21fbacdc856fb1003f58bf2842fe418124f6b01d assets/create/models/block/green_postbox.json 26577589688ec1f39cae9f42704cb36cbc1c48ae assets/create/models/block/green_sail.json ae51eaa500dd036fa27474a7392f381afb677dfd assets/create/models/block/green_seat.json 801d277b241332d5f4b49bdb00b911dcd01a7db2 assets/create/models/block/green_toolbox.json @@ -1158,11 +1188,13 @@ b843a6e27c4f90e31108f9f3c1573e70fb3d0927 assets/create/models/block/layered_scor 5fb53db0c6623dc16e486ac0bd094b5a90e2e080 assets/create/models/block/layered_tuff.json 336d1646294e018ea3de60b30a621a10ca7aa6d7 assets/create/models/block/layered_veridium.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/light_blue_nixie_tube.json +cf487c0be9444b7ac124d2ae33e6c545803e14b6 assets/create/models/block/light_blue_postbox.json 2e83d3aaa92640d6b3da2a2644f6a160f97b08e4 assets/create/models/block/light_blue_sail.json ba917560f40a4e46ef190649f18adad9962c5c02 assets/create/models/block/light_blue_seat.json c20616aa90feab3003cecb4a5be5466c0fc83072 assets/create/models/block/light_blue_toolbox.json bcd3d28b8a062649301648ea5e2d0463f93d008d assets/create/models/block/light_blue_valve_handle.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/light_gray_nixie_tube.json +1efabd28f0dc3db1c0e6bea2be62cac883fefd66 assets/create/models/block/light_gray_postbox.json 09f284574b38ab57579e939bbb088b8d36e0b8f5 assets/create/models/block/light_gray_sail.json d1813d0f548fcddb361df7cc3b5d97582842b10f assets/create/models/block/light_gray_seat.json 4ec5d701dd8b2d8c3dc44d05f527a3d737002cd4 assets/create/models/block/light_gray_toolbox.json @@ -1171,6 +1203,7 @@ adb8dbed70419e0310e7a20f3656bf325b348434 assets/create/models/block/light_gray_v 2b80f9421c2fe902d55d9bd95183ad4bae46c315 assets/create/models/block/limestone_pillar.json fb18280a2a708f60b00cc7c675804c219784871a assets/create/models/block/limestone_pillar_horizontal.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/lime_nixie_tube.json +952d292d4dc2158e6106c5079cfa1ddb81c7777e assets/create/models/block/lime_postbox.json 5a95a72444f523cfba6e8c5adf8eacbb37e2d21e assets/create/models/block/lime_sail.json 09e7bf50cf88c449dbd9e77829cdb5afffb7d88d assets/create/models/block/lime_seat.json b92822a01e4fbed2463b1bdf7dcc736023988e20 assets/create/models/block/lime_toolbox.json @@ -1180,6 +1213,7 @@ b92822a01e4fbed2463b1bdf7dcc736023988e20 assets/create/models/block/lime_toolbox a1a3804ddcb1db0a7b5c0693555f8eb326950dd0 assets/create/models/block/linear_chassis_top.json f885acc0ba705cfa9c65b62626ab4007f3b6e329 assets/create/models/block/linear_chassis_top_bottom.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/magenta_nixie_tube.json +bfea3fd456f92391afc9f948ade90b16275e63de assets/create/models/block/magenta_postbox.json 81122f26a12b7ab40fed6d31c97376f4dfffa111 assets/create/models/block/magenta_sail.json b5cd13b021400b3c37499ec4ef22e560c721ac54 assets/create/models/block/magenta_seat.json d7b2b16ba2d6a0b2441aeaf7faa76f61fbdc35e7 assets/create/models/block/magenta_toolbox.json @@ -1204,6 +1238,7 @@ af50363d603d61340b336569d58c1febde253665 assets/create/models/block/ochrum_natur d69effa0a811cb93fead8257bcaad4bbf0094002 assets/create/models/block/ochrum_natural_3.json 24669a4e93925940477fcfc0aca10ab9d87368e0 assets/create/models/block/ochrum_pillar.json c8dd33a0b71dce37712788a61729de89574b117f assets/create/models/block/ochrum_pillar_horizontal.json +dbd0cbfa1c6cfaddd7ac954379b4b1f3056730f2 assets/create/models/block/orange_postbox.json cb4cd4e4bfb0d105a09c56454abf4795b155d12b assets/create/models/block/orange_sail.json 6c4addc75fb03911fca3083f891b22f55209b8db assets/create/models/block/orange_seat.json f68eeb8cd828a0659fe8665373daf093ea65f0fc assets/create/models/block/orange_toolbox.json @@ -1231,6 +1266,7 @@ f70f83cfec770879c478eea3760ea187700f2878 assets/create/models/block/peculiar_bel b9c9d00b844ca2f217ae21cc502cd4d082fed2d5 assets/create/models/block/peculiar_bell_floor.json f7b09c243cfeda8bb38a29a917b9fbdafe47eece assets/create/models/block/peculiar_bell_single_wall.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/pink_nixie_tube.json +084266ced8975953fa158fd9e7261d8f10b94db7 assets/create/models/block/pink_postbox.json 90113a1f53f0f8d9ce11ff14128eb860063f5ddc assets/create/models/block/pink_sail.json 888dba067e751a55205dbd919db8e92ef2be604d assets/create/models/block/pink_seat.json 3cb69299c7787f88fb41c6397362aa7b607c0960 assets/create/models/block/pink_toolbox.json @@ -1385,7 +1421,11 @@ b21ec7cde56398b65f44922ddb026d9adb7b6072 assets/create/models/block/polished_cut 66374fdc4d3d55f99b03e406f3b594f8b1bab94d assets/create/models/block/pulse_repeater_powered.json 6bd0d85ca18b468bee279e7bc398bc8395e33a8b assets/create/models/block/pulse_repeater_powered_powering.json de0cc956e7ff1510d0947ca8fd2b6e642944f0ee assets/create/models/block/pulse_repeater_powering.json +addbe93af945ff7ca2680a27225db804d3ac9b46 assets/create/models/block/pulse_timer_powered.json +ab3d7e10abcb53b835d6f5c406b7a777a942d6f7 assets/create/models/block/pulse_timer_powered_powering.json +7b425d9db8d914b52b7faad2f792c020b678f84d assets/create/models/block/pulse_timer_powering.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/purple_nixie_tube.json +afdd265ee175c47ea6e4e44fb08d212e4cef5ee5 assets/create/models/block/purple_postbox.json 356378a5839b0b400aa5e0a67740634113c09a38 assets/create/models/block/purple_sail.json bc8e473a5662b6180b00b85e5006241a283c9baa assets/create/models/block/purple_seat.json 5e85ec98c165a0b5bfe25d391e96df9164372a3a assets/create/models/block/purple_toolbox.json @@ -1399,6 +1439,7 @@ ff65b89683fbb9326f625b9a68f954def5ed000d assets/create/models/block/radial_chass 9d234d1294f927d1e70a5c9b1e6de73ef65e7014 assets/create/models/block/railway_casing.json be8042806b08990786ced1cf140c4942d7a6788b assets/create/models/block/raw_zinc_block.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/red_nixie_tube.json +844614001c30ef34d3136a350c12018c5e9ab341 assets/create/models/block/red_postbox.json b692deeb65f338212fb1073b725a122b7b1359d5 assets/create/models/block/red_sail.json bf3f4ba33e1a61254073ecee3e753958f8debb35 assets/create/models/block/red_seat.json 2a13766aebac1a392ae7bf934bd81d9210c87a24 assets/create/models/block/red_toolbox.json @@ -1656,11 +1697,13 @@ e26dd64495ff8801593e9c22203cbf364075badd assets/create/models/block/weathered_co b658c1022587bd670b5acee267607719c1544332 assets/create/models/block/weathered_copper_tile_stairs_inner.json e7ae89577be9d26a071bf96cbd7ed80293902b63 assets/create/models/block/weathered_copper_tile_stairs_outer.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/white_nixie_tube.json +998d838964c6c5bc2a1903b5098491abf5d819bc assets/create/models/block/white_postbox.json 99f0628623a36ac1700a5876cec010ee6353162f assets/create/models/block/white_seat.json f252f8c68702a0c050797a2dc2a51c586408722d assets/create/models/block/white_toolbox.json c9e344a06ee8bca1bfddd70481198135cabafbce assets/create/models/block/white_valve_handle.json 68d8eddfb724c73938862fb1a213a99c95814fdb assets/create/models/block/windmill_bearing.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/yellow_nixie_tube.json +9abbd0af47396b1cb18362b423f497ddb40eede4 assets/create/models/block/yellow_postbox.json cf8477d6c7558ceba38416fae755567086a856a6 assets/create/models/block/yellow_sail.json 07b68f0e4c617dfe3e935a1b9e8e020ab3131c0b assets/create/models/block/yellow_seat.json 21bb6e0b43984214c496e531e16dd60aeb619a42 assets/create/models/block/yellow_toolbox.json @@ -1692,12 +1735,14 @@ def88cd2c79a1f0ed40bbf5a0332187dd1d6006e assets/create/models/item/basin.json 35a1e2cb2645a8386dfee2697b47547b3f9a1dd2 assets/create/models/item/belt_connector.json f5dcb9096a52d5d2eab1e4204fbd1222e0d5094d assets/create/models/item/birch_window.json eccafeec52e4195fbe211c602b4fc71a260d8a64 assets/create/models/item/birch_window_pane.json +641b85751f91c0b4931307548c12034fc56286bc assets/create/models/item/black_postbox.json 7ca635d45fef81e6681a492be6c7bb71fd0f4574 assets/create/models/item/black_seat.json e2dc1a8db84d84d592bfd91a26464343b8706bc0 assets/create/models/item/black_toolbox.json 20fbeb136e85d146c0e041f7f1570b1d1fd34585 assets/create/models/item/black_valve_handle.json c31038397821b6abe296d2799aa81edf3c12d095 assets/create/models/item/blaze_burner.json 9d28754112688323a6b55ecb6742e918eabfd6a3 assets/create/models/item/blaze_cake.json 01637416bb932d861e9c9b10b256b2fdf4c96d44 assets/create/models/item/blaze_cake_base.json +ef453775edb9342dc68e0e4ed7aa2e845b819fa6 assets/create/models/item/blue_postbox.json de8beb7ef521822eb9b2826806baf1fa3344a45d assets/create/models/item/blue_seat.json a82bc56a503cd15d2354c86a49fc6d1d4ed22767 assets/create/models/item/blue_toolbox.json 2f90f781cd9b5d144a6cfd4748ae3a87c9f12ba8 assets/create/models/item/blue_valve_handle.json @@ -1716,12 +1761,21 @@ a51a28424e75dbd11c845f455c778d4c578b9da4 assets/create/models/item/brass_ladder. af97ba84be90381e2cc9434e31e2199c2e7e3aa6 assets/create/models/item/brass_scaffolding.json b78e9274156f5027a9a3b6fb7725c57a7aecc8bb assets/create/models/item/brass_sheet.json 28e104d5041c1f4676704c0f6b4e2e80aac43106 assets/create/models/item/brass_tunnel.json +35c8539a0b2f927e65a43c3a2c3cb82db429c2eb assets/create/models/item/brown_postbox.json fce64539b36fc8a5ffa39d7a3f73765818437cbf assets/create/models/item/brown_seat.json 90c1ec317beed0b5735c8731e3115a695b7060f7 assets/create/models/item/brown_toolbox.json 9477ab491586f1314bebf4d58387425ae56d0bad assets/create/models/item/brown_valve_handle.json 1db479848369140bb913ba09f3f1d994e4ac864c assets/create/models/item/builders_tea.json f5ff4e2ed2ea2e43b6d02f6a95ba02b2e4b611dc assets/create/models/item/calcite_pillar.json +cc2692f7964f4266ecf00fcab176b1ef0b78673f assets/create/models/item/cardboard.json +45d7fa87d102a0373a06a13592f58baafa4e5a33 assets/create/models/item/cardboard_package_10x12.json +f998f36d9a6f469bbd3822a17b2b45f81e6810c6 assets/create/models/item/cardboard_package_10x8.json +b7a24a7dd21a464815b2fd8cd6037e854be3f485 assets/create/models/item/cardboard_package_12x10.json +d5396690e7813c67ee3600555d7e47d0097b1f56 assets/create/models/item/cardboard_package_12x12.json +39aacb806378ce16d5c801a0c7ea8027b5090f9c assets/create/models/item/cardboard_pulp.json +9ed2aad55ca1d8d4e1881c1abd1154f8bc4d35c2 assets/create/models/item/cardboard_sword.json 1cdb2b8801551c1540bb9b2a9cc3d725a2b433e7 assets/create/models/item/cart_assembler.json +390a06d81c8c2a0ff83196bd0154dd292206e3b6 assets/create/models/item/chain_conveyor.json a197d08618f4035182c91a6b16031eb681ab8a7c assets/create/models/item/chest_minecart_contraption.json 293cfa8b1073f8641a2c623b73a90907576c36ed assets/create/models/item/chocolate_bucket.json 77654cbd16cdfa95181ea3f85fcfa3cd352b69fd assets/create/models/item/chocolate_glazed_berries.json @@ -1895,6 +1949,7 @@ f633006045ccfcdf486d7a240217229d6eed717e assets/create/models/item/cut_veridium_ 410b949304faa5856028f7c42ab762b7498ffd95 assets/create/models/item/cut_veridium_slab.json 62697c0922b11537914d2f4f84faa0b909ee518d assets/create/models/item/cut_veridium_stairs.json 3921d61a26d48d999cbb2f6645611e53ea71978b assets/create/models/item/cut_veridium_wall.json +73c2eed9b6a906a519e27361211ae05bc6ed2d87 assets/create/models/item/cyan_postbox.json eef3be2fa3b6424436a553e3c1bfee3979015962 assets/create/models/item/cyan_seat.json 265d5d6de4238442bb9b161dba0a2fc2f063df0b assets/create/models/item/cyan_toolbox.json 8beb6459822efe59d0f60749143d73c5390e39f2 assets/create/models/item/cyan_valve_handle.json @@ -1906,6 +1961,7 @@ eef3be2fa3b6424436a553e3c1bfee3979015962 assets/create/models/item/cyan_seat.jso aa44d681c3ccffe08aedbda093062b1a5ab3302e assets/create/models/item/depot.json 85a5830ca034be9a0ed534186210aa975278b20b assets/create/models/item/diorite_pillar.json 2a992f0961b8bab5628e075da413c91e903e424c assets/create/models/item/display_board.json +e71e3c355c4a9266e359e88278b238e38f15d9ea assets/create/models/item/display_cloth.json 0dd4d33644c9ec7dbf920d7fd7b713e4b413b330 assets/create/models/item/display_link.json eb750000addd1c25e79fc9fb277ccdcc3274852c assets/create/models/item/dough.json 5803643723c0aa65d6c531c1f9798556cd36d21a assets/create/models/item/dripstone_pillar.json @@ -1942,9 +1998,11 @@ b17d9fd1a92db0965f2e5da6215956b0451af29e assets/create/models/item/furnace_minec 7c850a41a754e46bb9c9f257ed621e37a1b9506a assets/create/models/item/goggles.json b1ae37998326c8ca054e57b0cbff0b51cad98625 assets/create/models/item/golden_sheet.json 85c301898775d5720d4d11c1c555b331a5c2e93b assets/create/models/item/granite_pillar.json +44173ca711aa497d08ca3b8a9613290378072870 assets/create/models/item/gray_postbox.json b8d6d2d163e2ab5f654bbc4eda9ad63f8064d27c assets/create/models/item/gray_seat.json 6492f86b693f924d0222d0ca1d16fbe33d797b1a assets/create/models/item/gray_toolbox.json 2a9500f9630b1da44615c7c9ca145b56324c46bb assets/create/models/item/gray_valve_handle.json +1a97f63df2977ac2f2e3363c61a7e36bf60d3ce3 assets/create/models/item/green_postbox.json 2843370b0e693e1ba1777c26416914edbd87c4f9 assets/create/models/item/green_seat.json 561e0579101bf602b252c0b9a5eec468c89d0e40 assets/create/models/item/green_toolbox.json 7d3ddad087b4d2c6a32f97092533cbfb5de0cb3b assets/create/models/item/green_valve_handle.json @@ -1961,6 +2019,7 @@ ae5c5925ecf775a4f5c3dc3c79d9766d7dd34ab6 assets/create/models/item/incomplete_tr 43173d18384817288a9ba687da77a4fab31b1957 assets/create/models/item/industrial_iron_block.json c6e3e4ca8b3dfdaaa943faa3dc89c0b2e6f2b5c4 assets/create/models/item/iron_sheet.json d1fbf1be53208c3ab5384dfd6be4d980c858941c assets/create/models/item/item_drain.json +5adda29ca25d00eb41884d0b7ad4a471e250ae10 assets/create/models/item/item_hatch.json 908dd0a4eafd868d280e25cfb7721f20b649560f assets/create/models/item/item_vault.json 5fba1fa33e360c2744ec74d7ccb63f9baa295546 assets/create/models/item/jungle_window.json b3a0c9664465f49a2f53e4ded6c29710a357e6ca assets/create/models/item/jungle_window_pane.json @@ -1980,19 +2039,23 @@ a22638fd361a8185175e107a8ee092a9ac030b7b assets/create/models/item/layered_grani 14494272713544a1595d654fd397a986b2da0951 assets/create/models/item/layered_scoria.json b1174d783c62dda84aafd4259c622197f4664421 assets/create/models/item/layered_tuff.json 952b07dbf9ecc1883deabaa1344667f13936f7f2 assets/create/models/item/layered_veridium.json +623c937db944651cf1075b3875afe002db527ed6 assets/create/models/item/light_blue_postbox.json b44a9f1bd9079f3533d7f708d76eb19a864e5ebb assets/create/models/item/light_blue_seat.json dae914625ff1bc3ebe1463485cad4526a7d7e9f5 assets/create/models/item/light_blue_toolbox.json 1d94314f185151eb9dcabcef950abf6f86c3c836 assets/create/models/item/light_blue_valve_handle.json +b56a28924b0b1b2530ebac7834e011700b09b966 assets/create/models/item/light_gray_postbox.json 1747bcdea3b1d3f5dfb786102069e07198d36dfe assets/create/models/item/light_gray_seat.json c8513eb1c89652783e26d7dcfcf64afa97619bc8 assets/create/models/item/light_gray_toolbox.json 3774d23e76b5712e7004e333e0a770f2230c2998 assets/create/models/item/light_gray_valve_handle.json 8f53caad3899a30be5087a0ba155080834418cc0 assets/create/models/item/limestone.json fba1e7d1cad39c89976b427db62544d80f47ad5d assets/create/models/item/limestone_pillar.json +26b8e1daf9cc4b206fb5f62904c7f1701ba93e67 assets/create/models/item/lime_postbox.json 32cd55a1c97a31a13ad106a457ec9925aa91f6d3 assets/create/models/item/lime_seat.json 931d187c11cb95a0eeae8f256187ef551b42007e assets/create/models/item/lime_toolbox.json d0f4148bdb0a905e68f54b5dfd829fd47e528fea assets/create/models/item/lime_valve_handle.json 1d30f9b525e8e9736b34a92f848e235c71fd6bd8 assets/create/models/item/linear_chassis.json 8f622f5f79446f6060d9e8815205fce919c8c829 assets/create/models/item/linked_controller.json +538e28af9013a43c258a659cbe67671991f3eee7 assets/create/models/item/magenta_postbox.json ad6fd371ee989c9c3c21e762273e8a4e903f0af8 assets/create/models/item/magenta_seat.json 7c0e3f91e5ab029473736deffb2b2aab9d4763c7 assets/create/models/item/magenta_toolbox.json 6d82582e5afea919927606b20a74cbda5223956f assets/create/models/item/magenta_valve_handle.json @@ -2026,6 +2089,7 @@ f80358eba19bc8d1741e4e25753866799631a118 assets/create/models/item/nixie_tube.js 061587faf0e53e4fac0c8f2f3bd6b22020b2a3ee assets/create/models/item/oak_window_pane.json af50363d603d61340b336569d58c1febde253665 assets/create/models/item/ochrum.json 62ec1afee14f9de3f5b02ee930d002a240a3c337 assets/create/models/item/ochrum_pillar.json +226f99c241b1d8b03d8fc57db32c1bee0721b64f assets/create/models/item/orange_postbox.json 56e7d28824d3fc566b5f551babbe423a550ef08c assets/create/models/item/orange_seat.json 96cc543d5afed90a022ece7b8671cd47a9b6fb68 assets/create/models/item/orange_toolbox.json 7e767ca9e0ddb769b38fabd9289648ac63f5413d assets/create/models/item/orange_valve_handle.json @@ -2037,7 +2101,12 @@ c9c7ccdb68de2e77cd9f7053fab19493dd30a985 assets/create/models/item/oxidized_copp 1c3428e2aed32a013631db012642a34d4eaf0785 assets/create/models/item/oxidized_copper_tiles.json f1af7c5f3840efc3ae07940ee6719eb3417a0e1a assets/create/models/item/oxidized_copper_tile_slab.json ef2fe68d407a03bf1ed8f2d2f3e7323777d061bb assets/create/models/item/oxidized_copper_tile_stairs.json +b21a1f3ee7de3e17f69d27fd13ae6b23b62aa22c assets/create/models/item/packager.json +a8538df19e47fe37401c9fbedbb867b5d612a51b assets/create/models/item/packager_link.json +5b974e55caffdbfc2156eb8b59dd99db12243bd3 assets/create/models/item/package_filter.json +7fd76e7d2e6c6d94352f1fa08d096b63616ad01e assets/create/models/item/package_frogport.json 76aeceb41bb7df873dbafe1bd5e26deb24abf93f assets/create/models/item/peculiar_bell.json +ab6c05a0468f3f4295a07adb362fa2d36cf6e3e8 assets/create/models/item/pink_postbox.json df13d4281dc45041ecd93504d45daef61d070581 assets/create/models/item/pink_seat.json 842afb2a345dbaba857e90f7dffa724841ef7b2d assets/create/models/item/pink_toolbox.json 6b85a0da81b2d18fb54eb05e187a2ce8cd7b09eb assets/create/models/item/pink_valve_handle.json @@ -2110,6 +2179,8 @@ bd70b798ca9f73f4e5aabc30e286487f5363122e assets/create/models/item/precision_mec d9a736e7a6fc70e0848de3e318c739d58b1e563f assets/create/models/item/propeller.json 9b41eec5759887be9bae3d27654bf478a7eff676 assets/create/models/item/pulse_extender.json ea76bd3bd9e5bea4d64d91347d473b538e926b02 assets/create/models/item/pulse_repeater.json +6ff9ce0cc633ea39b779b2e873a1d0fd7cfe7119 assets/create/models/item/pulse_timer.json +8496f6c5449a70eef12e9c68ba46eee2f365fb77 assets/create/models/item/purple_postbox.json 7e165f83266edf34bb03fa3e8d2a83d44829c10a assets/create/models/item/purple_seat.json d75c4969334f2ee1ae4a3d8ac28b001735c76b97 assets/create/models/item/purple_toolbox.json ebffb05119f499fcec051a4337aadc47654baed2 assets/create/models/item/purple_valve_handle.json @@ -2119,6 +2190,8 @@ f91405b9aec1e0142c1b90582e03a1973251da05 assets/create/models/item/radial_chassi 4631d67976cef148c346a7016baaa6703e4f243e assets/create/models/item/raw_zinc_block.json 9dc6c52e258b00cac6ed23147983045c43218b5d assets/create/models/item/redstone_contact.json f8f733364bdd32b2ad597e81103bc02344ce63bd assets/create/models/item/redstone_link.json +f526dee8bc213b3d87cbc79350eb37b61b0eee79 assets/create/models/item/redstone_requester.json +4b73ee9cc2651a3d1a97476d100f9c4d7e2b2efe assets/create/models/item/red_postbox.json 8d00eb1a10055a802556eab10e13f522d12acd1c assets/create/models/item/red_sand_paper.json b64a054c92cbd2e055502d470f3921d1077e63a1 assets/create/models/item/red_seat.json ac4695cc465d094b4adba1a4e9efec42c916f37d assets/create/models/item/red_toolbox.json @@ -2147,6 +2220,7 @@ ff36a19e124caf2ee8a03767e39601df6866075b assets/create/models/item/secondary_lin abaa6da82babc26717ffff44fc41327bd015c9a6 assets/create/models/item/shadow_steel.json ffaec38d11b91add4e150e33d0e0e49394f5beca assets/create/models/item/shadow_steel_casing.json b6fcd9722e5a09a9207964cba68752512e3b945a assets/create/models/item/shaft.json +617c6e2f759b2a95da7ee7192a2661afc6f6e8f8 assets/create/models/item/shopping_list.json 58ca190177e77db90c8195347c29d52c2cd0c556 assets/create/models/item/small_andesite_bricks.json fa92996fada8545fc340fb401bd0568f56809bf0 assets/create/models/item/small_andesite_brick_slab.json 08474bf814a55795c1f94203ceb8a969be2a2132 assets/create/models/item/small_andesite_brick_stairs.json @@ -2215,6 +2289,7 @@ b82ab0c69df330f6f938ed1beee7b4add67d2e50 assets/create/models/item/steam_engine. 54f200be903e056e5cf9e2186f0a0a51f8f0f84e assets/create/models/item/sticker.json 0f88de164439640cc175ceef2017f7416b5a7018 assets/create/models/item/sticky_mechanical_piston.json 4b640b66765b206f8c2884b7c1a1ef860b81d841 assets/create/models/item/stockpile_switch.json +67c98c6c7f2122850acfbee34688572934fdd226 assets/create/models/item/stock_ticker.json 6ee792277b9fd980c40e18e841afa63fc500ed0b assets/create/models/item/stressometer.json 8d4ce1ccf180016506292f63188c10d0dabe0ee3 assets/create/models/item/sturdy_sheet.json a10bb4d6d1a4483a806e3aaa086d48c0e20aaefe assets/create/models/item/super_glue.json @@ -2273,6 +2348,7 @@ dadc7b65a4527e288c21a20df978796a8c444fd2 assets/create/models/item/waxed_weather 79431edb868e6560f4f6d5b3441c0176c7699f5e assets/create/models/item/weighted_ejector.json 0fd2214cdff8a92e05d9d5ee888329b3235143c0 assets/create/models/item/wheat_flour.json aacced59d21212090d508a9684bb46c9472a8a2f assets/create/models/item/whisk.json +bcf3104e463ec212dc239281033e4e80d78e1d74 assets/create/models/item/white_postbox.json 4e112e82185e2c1a5c57f5a94fa11c59c92cef0d assets/create/models/item/white_sail.json 17ed8ac7d745117f622190a46c5e1b42892afc29 assets/create/models/item/white_seat.json 432040f39177ab3df6003df24e818c73e28cf754 assets/create/models/item/white_toolbox.json @@ -2280,6 +2356,7 @@ aacced59d21212090d508a9684bb46c9472a8a2f assets/create/models/item/whisk.json bccccbdfa5d376936e123defa44f2907dc317617 assets/create/models/item/windmill_bearing.json 47c6ad1c146366156a0ec4bc1cbf74282784698f assets/create/models/item/wooden_bracket.json 6c08d2fa59e56e4848063ab6f3e45894b89f1744 assets/create/models/item/wrench.json +3a899db3044ee39ac5d6385c16630733e00f77ca assets/create/models/item/yellow_postbox.json ac59f141cd3c3f7e57a794e542d6e22bf8ebb8f9 assets/create/models/item/yellow_seat.json 532a429d58a177f61b4d67180db7676fa7536052 assets/create/models/item/yellow_toolbox.json 2c87ef8a26a01a17b2f3799d62cb27cf1107d061 assets/create/models/item/yellow_valve_handle.json @@ -2968,12 +3045,14 @@ d964b7a8f6a4ce28ce640d31a01e77eafcc181e5 data/create/loot_tables/blocks/belt.jso a268eb02c10015a901a6543595b2b815a8026d78 data/create/loot_tables/blocks/birch_window.json 43d16eae230de501c528f4e9af666f72a081ed29 data/create/loot_tables/blocks/birch_window_pane.json 4aec2374e76dfa5535fe22b1fc02b4b2d453217d data/create/loot_tables/blocks/black_nixie_tube.json +6ed685605e24af5c6ff5d797dde8492069427b76 data/create/loot_tables/blocks/black_postbox.json 7ce6dd2c0d02eb1b56ec441044dfc608ea6bcb41 data/create/loot_tables/blocks/black_sail.json 2449b8c173fbbc2a96e0b8d1996d72fb60527e64 data/create/loot_tables/blocks/black_seat.json 2d33e25b2741f634bbd6cd77b31c17dd94511d94 data/create/loot_tables/blocks/black_toolbox.json f911ac185cd48afa2393d24f28a688936a9fa147 data/create/loot_tables/blocks/black_valve_handle.json eee41c02c8cfcdb56f31e74fc266783b785bea9d data/create/loot_tables/blocks/blaze_burner.json 247d12823eed3b9248003aca8e3ead87972ac61e data/create/loot_tables/blocks/blue_nixie_tube.json +76217732c9bddf77b7de735b4380d9f92adca9b3 data/create/loot_tables/blocks/blue_postbox.json bb9d906a97810ed1461ed321ef8e4bee1dd104fb data/create/loot_tables/blocks/blue_sail.json 833fe6bc3020055dd0d6f46b324cbe27b248708d data/create/loot_tables/blocks/blue_seat.json 9d22716d9d846dc9587e327dfcdf18dd5955f826 data/create/loot_tables/blocks/blue_toolbox.json @@ -2991,12 +3070,14 @@ e466a397f84957616f7e83954db2050355f052c9 data/create/loot_tables/blocks/brass_en 429d524c9848b44d19028126f0efd678e0c4b680 data/create/loot_tables/blocks/brass_scaffolding.json af90102bfe0e3a14bf1330cddec553f27b8fba89 data/create/loot_tables/blocks/brass_tunnel.json d391cff5b741fd6ddf5b6fa64e05526eb3a9f0d9 data/create/loot_tables/blocks/brown_nixie_tube.json +bfa0365507a888134c20b36af4bd7944263687f0 data/create/loot_tables/blocks/brown_postbox.json 862bd3ceed05ea45c03911bb8403817b73c4bc38 data/create/loot_tables/blocks/brown_sail.json 6ddbdd489120be56f50272c86ecdb886afa3a8e4 data/create/loot_tables/blocks/brown_seat.json 588ae3d0da73eed3bc30cb28c583e7f8312d15bd data/create/loot_tables/blocks/brown_toolbox.json 7c7cf4c30786f6e0a699e2b3f9120343e53107f4 data/create/loot_tables/blocks/brown_valve_handle.json 06d1c478e4236210aa12b5911691868fef33bb5f data/create/loot_tables/blocks/calcite_pillar.json 515c839deea520b07b03f7ba65c4a7b22fdf5ba3 data/create/loot_tables/blocks/cart_assembler.json +aadd8aa7f8433896bd4fea56f43e496cbc5be25a data/create/loot_tables/blocks/chain_conveyor.json fb4877d45df15be1a74378ab28f23fbf9d0657ef data/create/loot_tables/blocks/chute.json ace9255cbdd1af5e5068916d2a6bed2f861f81f1 data/create/loot_tables/blocks/clipboard.json bfd871acdde6c239098ead188a5aad7636d11bc0 data/create/loot_tables/blocks/clockwork_bearing.json @@ -3145,6 +3226,7 @@ d9552e3e9f4de0e09df8ca9446066e94c6e2c681 data/create/loot_tables/blocks/cut_veri 4845f7127921c7dd93a59118e63c37107d6c2061 data/create/loot_tables/blocks/cut_veridium_stairs.json b56caea031d637321eddfd5d122fc357d2c2e49c data/create/loot_tables/blocks/cut_veridium_wall.json ffb440a03f5e513b8d20c2725a95dc5c9b84c73b data/create/loot_tables/blocks/cyan_nixie_tube.json +914146303ae7e73c4f9283ea61cd5443f49f5cde data/create/loot_tables/blocks/cyan_postbox.json 8858b4e1b4e51889b2006005585a17e4978ed8e9 data/create/loot_tables/blocks/cyan_sail.json 8dccecb2c87d7421efdfb3fb97ae62b79f0b4411 data/create/loot_tables/blocks/cyan_seat.json 66ea2f2cc32d49bb434f83cbd07736d6fbacacf3 data/create/loot_tables/blocks/cyan_toolbox.json @@ -3187,11 +3269,13 @@ a4c86e5456bbbcc417d736151ac6a15c944d555b data/create/loot_tables/blocks/gearshif ffa2776989447e44fa10673986961ab395ebd592 data/create/loot_tables/blocks/glass_fluid_pipe.json 07d8265c285ebb69b9160d516905ae1f17acc87d data/create/loot_tables/blocks/granite_pillar.json 41feb0f235495384ebca5b6f70d01b6f0c0c8878 data/create/loot_tables/blocks/gray_nixie_tube.json +6f123d5e6612274223ddb695e582abd952d3521c data/create/loot_tables/blocks/gray_postbox.json bd526fc4f0acea571c37b2ecbb7267fee6be29f0 data/create/loot_tables/blocks/gray_sail.json 5e23e2032f92737eaa6e6cfb4c62232566f06e77 data/create/loot_tables/blocks/gray_seat.json 6ff8b3e59ea98697b87e71eb64d1e6f7e4631f36 data/create/loot_tables/blocks/gray_toolbox.json aa0d47422e0adc3fb18e5c0eefd25c417ddbf9ae data/create/loot_tables/blocks/gray_valve_handle.json 4cfbe1bdc89916f78f891b9dbaed461cd838584b data/create/loot_tables/blocks/green_nixie_tube.json +e99e3895a19faa928e40fa17fbfbda6d3566b1ed data/create/loot_tables/blocks/green_postbox.json 6c22cf8de05828af7979dc32d9e151297d551fe5 data/create/loot_tables/blocks/green_sail.json fbd61c331d4fda692f0e7174aed5aed3652d3553 data/create/loot_tables/blocks/green_seat.json 703a285a5d47fcc13e6775040d45620db2ef5480 data/create/loot_tables/blocks/green_toolbox.json @@ -3203,6 +3287,7 @@ a206598562bcbc9e3bc10dbe12fb22974ee58fcc data/create/loot_tables/blocks/horizont e65fae1b9b72cf2208696463fa20a82a4d64fb62 data/create/loot_tables/blocks/hose_pulley.json 34c239150baa92e03ca89430148560e1b7a1f02d data/create/loot_tables/blocks/industrial_iron_block.json c22dea1941471be65c811cdc2ce7b77d2247e9e1 data/create/loot_tables/blocks/item_drain.json +528078b0cf042236d2cb0701fb55f41f54aa932b data/create/loot_tables/blocks/item_hatch.json 72b5a7288f7f54694df5f456e4ab4433bd38dfff data/create/loot_tables/blocks/item_vault.json 13bd1033991eb65354a9b9406fe638c357fea409 data/create/loot_tables/blocks/jungle_window.json fe9c2629eb30393d2ae5a1f252b9732506ef9bef data/create/loot_tables/blocks/jungle_window_pane.json @@ -3225,11 +3310,13 @@ b4882fe056a8d03bddf7a8c4fa70ee06548e1743 data/create/loot_tables/blocks/layered_ 7f9ea6bfcf8344018866013e12d23edf21f034e9 data/create/loot_tables/blocks/layered_veridium.json 54a876a52655d5c9c33325a7d07c7978d33adca6 data/create/loot_tables/blocks/lectern_controller.json 8a6153a0b5857c77cdac0cffcb22e30ae6181f3a data/create/loot_tables/blocks/light_blue_nixie_tube.json +27bbda185ab99cff4974e6bfc40b72265896ef42 data/create/loot_tables/blocks/light_blue_postbox.json 304072298d4078eca7e0fb8c58ea3144afe246a8 data/create/loot_tables/blocks/light_blue_sail.json a1396be526ef27c6d0f97cdd0f0e61f810e7353b data/create/loot_tables/blocks/light_blue_seat.json 0cd56baf9f3c9edb97e4ce892d374e21a099374f data/create/loot_tables/blocks/light_blue_toolbox.json bf4e6c308d82f15689406b5b3e88fe95d49a9a44 data/create/loot_tables/blocks/light_blue_valve_handle.json 6928acbfcafdfead9750be6760da163b86532054 data/create/loot_tables/blocks/light_gray_nixie_tube.json +eb95d1e0abb93d5efecb0809e3901f37021c4dfc data/create/loot_tables/blocks/light_gray_postbox.json 886ef98e4bd60d8860b56441da6928e24f262d70 data/create/loot_tables/blocks/light_gray_sail.json 1ae0ff25ac9468e67ab1847b87a37829328d4c84 data/create/loot_tables/blocks/light_gray_seat.json e22dfadefcea50090efe87136a4b92e6ef20d379 data/create/loot_tables/blocks/light_gray_toolbox.json @@ -3237,6 +3324,7 @@ e22dfadefcea50090efe87136a4b92e6ef20d379 data/create/loot_tables/blocks/light_gr c6bb0877c537dda15469934383dc45c608bfd1a4 data/create/loot_tables/blocks/limestone.json 49058a62e1abd34917f983b6bc13cc4353b613a2 data/create/loot_tables/blocks/limestone_pillar.json 582bb26f6df37d0c2dbe12983ad05fc74f5fb5c0 data/create/loot_tables/blocks/lime_nixie_tube.json +ec9d973d218b26d51b82f265603feab31170c619 data/create/loot_tables/blocks/lime_postbox.json 623ac65211a9920325308b55285f78e3b7275751 data/create/loot_tables/blocks/lime_sail.json 7efe69664a781b292f491d5ff89e27dd5991f3cf data/create/loot_tables/blocks/lime_seat.json 0f6a465501a445925e9aff7a4c84b3c8e2caa93e data/create/loot_tables/blocks/lime_toolbox.json @@ -3244,6 +3332,7 @@ c6bb0877c537dda15469934383dc45c608bfd1a4 data/create/loot_tables/blocks/limeston baf70f9eb579f20b232a2af4e6b00a54f84844e6 data/create/loot_tables/blocks/linear_chassis.json e4c0f8ca822cf7555bd011825b430c3c735160d4 data/create/loot_tables/blocks/lit_blaze_burner.json 6bd8b044cc9c69a5268372e5436f556da2c1bf21 data/create/loot_tables/blocks/magenta_nixie_tube.json +601bc43286b9f6b978ae8681281bf8e195f8211d data/create/loot_tables/blocks/magenta_postbox.json b4d06c9ce7fbec0f23bb6dbc446b77d070f06775 data/create/loot_tables/blocks/magenta_sail.json 300e480d8e43e3a4ca19a92ae1360c02f7c5accd data/create/loot_tables/blocks/magenta_seat.json 40d2ba0a52eaa2c61900731f0cee2657c5e77c20 data/create/loot_tables/blocks/magenta_toolbox.json @@ -3276,6 +3365,7 @@ fe79cb4cbea87efc84d61d3d31f073bf3c64c73d data/create/loot_tables/blocks/netherit 5dcb11160a51ce17fb06f5fecc14e87d92b1a641 data/create/loot_tables/blocks/oak_window_pane.json 461e9818f41aab34905757a423455cdcee780e67 data/create/loot_tables/blocks/ochrum.json 1259a439286385d5b7c48bff89d0839f1f2e02c2 data/create/loot_tables/blocks/ochrum_pillar.json +3f6940f13ca705bad7cdb9a9b80a3ae84f70f80c data/create/loot_tables/blocks/orange_postbox.json d6323d4b30faa87cd4b5b8b815cb16f78296f203 data/create/loot_tables/blocks/orange_sail.json 119fc4c3055c09c7958ac405925a6b7be2081c6b data/create/loot_tables/blocks/orange_seat.json 54ac8c8166c23f24a8a0870c981ef8ffa64c0b89 data/create/loot_tables/blocks/orange_toolbox.json @@ -3288,8 +3378,12 @@ f47a01824093455030fca66e7b8a39bcfc61d219 data/create/loot_tables/blocks/oxidized 4d2a2863697664b3b71f02aa703c3504cd5cc826 data/create/loot_tables/blocks/oxidized_copper_tiles.json 4d815b361af81bd0c0e14c853ca54ad3cde66a57 data/create/loot_tables/blocks/oxidized_copper_tile_slab.json d599ef03d1b69e4367ec0dea78f52c1964c99f9b data/create/loot_tables/blocks/oxidized_copper_tile_stairs.json +ab8cee7abd7dd92428bf7d8f0f5edd35082401a4 data/create/loot_tables/blocks/packager.json +e5df1b8ead9e575ed06f2040a7c9cc72c7a71b49 data/create/loot_tables/blocks/packager_link.json +54aa9700df601640b705d912abe773d5b6ee2b1f data/create/loot_tables/blocks/package_frogport.json 58bd9fe9d6706998bfbda3b077cfd0a740972091 data/create/loot_tables/blocks/peculiar_bell.json 4d7724df6fefee4512c4f7886d0e103d1dc39510 data/create/loot_tables/blocks/pink_nixie_tube.json +df7b12349c64d035eb563535b03cb70d780c5a71 data/create/loot_tables/blocks/pink_postbox.json 85811771fbc36f645fdb9f510639715399503c99 data/create/loot_tables/blocks/pink_sail.json 9a5652002131d14c585a6e434a4457ef36d2f60d data/create/loot_tables/blocks/pink_seat.json 23e28971460b2a3b8b39412a4778672d7ced4af7 data/create/loot_tables/blocks/pink_toolbox.json @@ -3360,7 +3454,9 @@ afe84b9468fba532acc447236a9a0cbdd02c4560 data/create/loot_tables/blocks/powered_ fbc433a7e8518860bc828a52b56dba92e4dff66c data/create/loot_tables/blocks/pulley_magnet.json e654e6cedc0373e97caea947e7e605bc4095da88 data/create/loot_tables/blocks/pulse_extender.json 422385f062dd63edaf246c42fb0e617e92e6cc44 data/create/loot_tables/blocks/pulse_repeater.json +93f0c41aedaa2b9baceda78b93a4b3198962e3f9 data/create/loot_tables/blocks/pulse_timer.json 6f453ea136098a5872aeb4e2ad1e5b78d2fd571f data/create/loot_tables/blocks/purple_nixie_tube.json +53e964048baa1b98877a559e8fda6c8f367d5cd6 data/create/loot_tables/blocks/purple_postbox.json c6b7a02db55cf0824a48156adf469c478dfd6a8d data/create/loot_tables/blocks/purple_sail.json 73cd7cc36fafb491666d2bccf1b4f24624b3c8f2 data/create/loot_tables/blocks/purple_seat.json 147086b9db173aed1b25d9460d0135708dcebcf9 data/create/loot_tables/blocks/purple_toolbox.json @@ -3370,7 +3466,9 @@ c6b7a02db55cf0824a48156adf469c478dfd6a8d data/create/loot_tables/blocks/purple_s f76e5a157d2aeab5708f464b1f3c8e47b3855f18 data/create/loot_tables/blocks/raw_zinc_block.json bbc2d61eeea335f8f011d799ef6a5484ca027640 data/create/loot_tables/blocks/redstone_contact.json 4fa70deeac7e56121e42fb602dfa27ee1727f749 data/create/loot_tables/blocks/redstone_link.json +efc3a5595e4daf67fa43f84c9869dfc76fd6fca4 data/create/loot_tables/blocks/redstone_requester.json a50e1c28af16e9f1b4f48aa974461167139768a7 data/create/loot_tables/blocks/red_nixie_tube.json +f36f1e69e4fb8723238f81aadbac892f54b5ac62 data/create/loot_tables/blocks/red_postbox.json 977d724cddf8eba053a3310ad0d30af15199bbed data/create/loot_tables/blocks/red_sail.json 9aedede893e2127a1cdd17695699397d8d5c6ce5 data/create/loot_tables/blocks/red_seat.json 9713071cab536e8c1550a6309dc4563fecc2c4e0 data/create/loot_tables/blocks/red_toolbox.json @@ -3463,6 +3561,7 @@ cae1bd9100b62841e260880faa80e2442f44a141 data/create/loot_tables/blocks/steam_wh 0bc3fdde351129e3a261a2420aff9d3f063c235e data/create/loot_tables/blocks/sticker.json 074f526902cb5fcff2129614428aba1ea05a6649 data/create/loot_tables/blocks/sticky_mechanical_piston.json a7332324e63f7d28621ddfbd54eb3d091461d890 data/create/loot_tables/blocks/stockpile_switch.json +f4fa9bb255348dc79dcc0468b3beb9ad075eb036 data/create/loot_tables/blocks/stock_ticker.json b13496b1b4bc0be30605832e23894fb374dd796e data/create/loot_tables/blocks/stressometer.json 6a7df4d2730d57ae6e404b4bc8e01367e5ddbf07 data/create/loot_tables/blocks/tiled_glass.json 0ad584e41780dc0183af1fa1e49e126730dfdbab data/create/loot_tables/blocks/tiled_glass_pane.json @@ -3514,6 +3613,7 @@ d6862dc9f7d291df618fbce71eebf613711a5517 data/create/loot_tables/blocks/weathere 57d5065d53016e4b1ef0fbad9b84605b1546bcc4 data/create/loot_tables/blocks/weathered_copper_tile_stairs.json f6ba0623b4bcea2f3796df4c65c494fc072d2c21 data/create/loot_tables/blocks/weighted_ejector.json 978263272f632ed79a61d52a0080de0b7b8102d6 data/create/loot_tables/blocks/white_nixie_tube.json +3d8a4d4a9634d49b20f65ebcdddaef2d0f21b36b data/create/loot_tables/blocks/white_postbox.json 129c6772c1c12271f9b0d41c77f41ce34fc437b1 data/create/loot_tables/blocks/white_sail.json 84c79bc47b4a74021e91745356bb24fe02402209 data/create/loot_tables/blocks/white_seat.json 3c63263c9fb642e34a0a67af4cab2d4348d661c0 data/create/loot_tables/blocks/white_toolbox.json @@ -3521,6 +3621,7 @@ f6ba0623b4bcea2f3796df4c65c494fc072d2c21 data/create/loot_tables/blocks/weighted bf0ea5c6957a43b6c4b1914df70e0b8f6585e638 data/create/loot_tables/blocks/windmill_bearing.json ed989d41a4b640dc1ffb15c9c0712ee3172d408f data/create/loot_tables/blocks/wooden_bracket.json d9f853e662b004b6ffdbb82af99ad7e774698178 data/create/loot_tables/blocks/yellow_nixie_tube.json +a536699cab16540eb906e0b63a2c5064244c7b6c data/create/loot_tables/blocks/yellow_postbox.json 0ead61521fec15522633d6cfdeb77150bb30d075 data/create/loot_tables/blocks/yellow_sail.json 3ae6d4e380237face57b9187ab8570967226b3b1 data/create/loot_tables/blocks/yellow_seat.json 11b10beba7a6842ce3d01ea4210bff7d3aa6ab94 data/create/loot_tables/blocks/yellow_toolbox.json @@ -4182,8 +4283,9 @@ f675c20350ed60da4878b5d6301f02c8c05624bd data/create/tags/blocks/fan_processing_ 4970078b49ddac1b1d500ed0469cedf42bdc3d35 data/create/tags/blocks/non_movable.json 06e13efbb7b0d09ff7ecd1a7dc45a0760b91ad67 data/create/tags/blocks/ore_override_stone.json a5874f73c7dc0a3ae12999e6ae8abf45bc7fb9be data/create/tags/blocks/passive_boiler_heaters.json +f400870b8dbcd14238be3ec99c419093073ba3a6 data/create/tags/blocks/postboxes.json 9bc8c13fd80bdbe7f767b91ee1a1042e9aff02b0 data/create/tags/blocks/roots.json -79ed9149ee2ce143114db4ccafda8a2b6a293aac data/create/tags/blocks/safe_nbt.json +55dccb895bbdacfbd6ee9005486cd3fe9df01249 data/create/tags/blocks/safe_nbt.json 79418bd729cef417b322cef9b491e7ae83317d61 data/create/tags/blocks/seats.json 5def5088f7fd31b80e6f28c1c4ea146aa9d7d15b data/create/tags/blocks/toolboxes.json 2589b135c0e96ad29076569e144528fe32ea5b39 data/create/tags/blocks/tracks.json @@ -4208,6 +4310,7 @@ d371dfd35e49a7bef19f59c03e7f4ae20992f03d data/create/tags/items/create_ingots.js 0fa526e7e742573b603ad26b09526cf724efa1dc data/create/tags/items/deployable_drink.json 1cebeb92bd514b75d54ac6d5708047801f0501c5 data/create/tags/items/modded_stripped_logs.json 586f8fc5a8b8559c9dc0017e13c78ad918688fae data/create/tags/items/modded_stripped_wood.json +f400870b8dbcd14238be3ec99c419093073ba3a6 data/create/tags/items/postboxes.json 695d75b352fd190b303c724d1aaee9bb786a903b data/create/tags/items/pressurized_air_sources.json 2cd3adffd8b151354df137a990dcb97996a665bb data/create/tags/items/sandpaper.json 79418bd729cef417b322cef9b491e7ae83317d61 data/create/tags/items/seats.json @@ -4243,7 +4346,7 @@ de1fc89be6a52473d526d3efe0204b9b8489058c data/forge/tags/blocks/glass_panes.json 81b107ada9c6ac5679a21f8c6a006bf230f69c39 data/forge/tags/blocks/ores/zinc.json e475ad1c52bffedfc544e5331a87c1f5c45149fd data/forge/tags/blocks/ores_in_ground/deepslate.json 2f6068972e364599b6849dc46fcb0724d4219d53 data/forge/tags/blocks/ores_in_ground/stone.json -2589b135c0e96ad29076569e144528fe32ea5b39 data/forge/tags/blocks/relocation_not_supported.json +8a5988e68f3a41341b486784c29d00e16d5272f7 data/forge/tags/blocks/relocation_not_supported.json b3af02a6fa3dc41bc3f4db933485f22b202deea3 data/forge/tags/blocks/storage_blocks.json 7d10cdf9e46a79753d4437c7bb958e3ab8bf0c89 data/forge/tags/blocks/storage_blocks/andesite_alloy.json 70bba470740dc7a77f51b4cb1747a105b62d4bde data/forge/tags/blocks/storage_blocks/brass.json @@ -4276,6 +4379,7 @@ e475ad1c52bffedfc544e5331a87c1f5c45149fd data/forge/tags/items/ores_in_ground/de 2f6068972e364599b6849dc46fcb0724d4219d53 data/forge/tags/items/ores_in_ground/stone.json 12c3455bbb7edcea84d47ad6ccde9c209a25d811 data/forge/tags/items/plates.json 23f4874238f7d06e80c699b672d4e9fab6eb464f data/forge/tags/items/plates/brass.json +7f3f85d0978bc274e4689fbf41f7b80b023b7a05 data/forge/tags/items/plates/cardboard.json ef5256892a9d4167bf7371c7138a933a107a123a data/forge/tags/items/plates/copper.json 3ca40ae504b1f68d6e7279726a2bf411509ce322 data/forge/tags/items/plates/gold.json 6f72d5205b399f03e481cee15bd5c085bfe6fe3c data/forge/tags/items/plates/iron.json @@ -4297,8 +4401,8 @@ c741ba83b562ae3459d7c4f2db69537f549ea411 data/forge/tags/items/tools/wrench.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/dripstone_replaceable_blocks.json e3321ff14704c031a2c16953b7e391f4f24dd70b data/minecraft/tags/blocks/impermeable.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/lush_ground_replaceable.json -5a030817b2322e363edc8f5376f7c9de73df8b48 data/minecraft/tags/blocks/mineable/axe.json -d794a156fdc9ec9e7c935b3b8962206b7b82eb79 data/minecraft/tags/blocks/mineable/pickaxe.json +5bfa11627f37364de2098753c85a589721cfa2af data/minecraft/tags/blocks/mineable/axe.json +1f8802b85d179bbd7f74ec37c6ffceb59eb4856c data/minecraft/tags/blocks/mineable/pickaxe.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/moss_replaceable.json 0c13aae0eeb99e89febe8dbe5e002af2ff843a9e data/minecraft/tags/blocks/needs_iron_tool.json 3cb2a92cbdf32ed5978f740dc378d363306c3e84 data/minecraft/tags/blocks/needs_stone_tool.json diff --git a/src/generated/resources/.cache/499d9d953ee69b539ff4dd4c95a6cbd849f63f67 b/src/generated/resources/.cache/499d9d953ee69b539ff4dd4c95a6cbd849f63f67 index 96f56121bf..d21c5cdcb0 100644 --- a/src/generated/resources/.cache/499d9d953ee69b539ff4dd4c95a6cbd849f63f67 +++ b/src/generated/resources/.cache/499d9d953ee69b539ff4dd4c95a6cbd849f63f67 @@ -1,4 +1,4 @@ -// 1.20.1 2024-10-09T12:24:59.1824022 Create Train Hat Information +// 1.20.1 2024-10-15T10:59:16.1145758 Create Train Hat Information be16d47aa64e673b1107a36ce06475016e316fca assets/minecraft/train_hat_info/axolotl.json b8ae6d9c8014439f4049622e0d6e79b9d6716260 assets/minecraft/train_hat_info/bat.json 5053a6c9fb412dfac1bf17eb0f57f9fd314198e4 assets/minecraft/train_hat_info/bee.json @@ -47,6 +47,6 @@ e524c61954660d3cb605f01395edb25572b59a1c assets/minecraft/train_hat_info/skeleto b8ae6d9c8014439f4049622e0d6e79b9d6716260 assets/minecraft/train_hat_info/turtle.json 78950a0bb66d28d1939049400a8cfd194f92f906 assets/minecraft/train_hat_info/warden.json 5ed6eccda89a6721f1b70eca7e7869cfc30aa612 assets/minecraft/train_hat_info/wither.json -0ac114bc3a5d0a0ab3153cae258a30fe970d4264 assets/minecraft/train_hat_info/wolf.json +0e92893e2b9d3e6586610e4e13c678e11beb1e64 assets/minecraft/train_hat_info/wolf.json daac75dcadb6e00db5cf1a5b30a450f137da54ae assets/minecraft/train_hat_info/zoglin.json e524c61954660d3cb605f01395edb25572b59a1c assets/minecraft/train_hat_info/zombie_horse.json diff --git a/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 b/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 index 52e3dc4f30..9163e3154c 100644 --- a/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 +++ b/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 @@ -1,4 +1,4 @@ -// 1.20.1 2024-10-09T12:24:59.2686824 Create's Standard Recipes +// 1.20.1 2024-10-15T10:59:16.195561 Create's Standard Recipes a8cc4af26f6c7c45a9eef12e92af1452fe042454 data/create/advancements/recipes/combat/crafting/appliances/netherite_backtank.json 2c2639c7b307ee7c7a4e97e5efebf496788998ad data/create/advancements/recipes/combat/crafting/appliances/netherite_backtank_from_netherite.json 81dcf0cb1aa99e39bc7d1a386e07cad4cee7d8b9 data/create/advancements/recipes/combat/crafting/appliances/netherite_diving_boots.json @@ -40,6 +40,7 @@ b90af96817d6c38ec446f7464642a473a55c2027 data/create/advancements/recipes/misc/b 029e463d5eea7ae590577fdfab52664036727985 data/create/advancements/recipes/misc/crafting/appliances/copper_diving_boots.json 5d5b4c49e81090a48c23314c49815f61ac170518 data/create/advancements/recipes/misc/crafting/appliances/copper_diving_helmet.json 0746cb63e224d7620e781e1494b9a8b9d56b186b data/create/advancements/recipes/misc/crafting/appliances/crafting_blueprint.json +4bd1ab25286d5a9dce7cafd1f814113f21a6969d data/create/advancements/recipes/misc/crafting/appliances/display_cloth_clear.json c4d0901541855ea2fda0cef7f0270edfa16d70e2 data/create/advancements/recipes/misc/crafting/appliances/dough.json 79b6501f8cb069dc55b78871a5fecf40a5b3dbd5 data/create/advancements/recipes/misc/crafting/appliances/filter_clear.json 3271ad36fbab51d87d0baad8c69cb7b2add506b8 data/create/advancements/recipes/misc/crafting/appliances/linked_controller.json @@ -169,13 +170,16 @@ f3e387ae41a55cdb5ff745f40e2ddb5e2595e9b8 data/create/advancements/recipes/misc/c dc61a327753684a0d8a7bcc408d656b53ac633b1 data/create/advancements/recipes/misc/crafting/logistics/brass_tunnel.json 03c367840951af268047c407b15aad52f0b094b4 data/create/advancements/recipes/misc/crafting/logistics/content_observer.json 09454f1d4db813c89a0a2f3af966298fc5f7da7b data/create/advancements/recipes/misc/crafting/logistics/display_link.json +995aa09f4672405984988e445a1d97301c5c4389 data/create/advancements/recipes/misc/crafting/logistics/packager_link_clear.json 95b357cbac39acfbc68ac04d0d4681a4d91746ee data/create/advancements/recipes/misc/crafting/logistics/powered_latch.json ef84b382bd4f6ba9558574f2c8e63030813594e9 data/create/advancements/recipes/misc/crafting/logistics/powered_toggle_latch.json c443707391ce79dc1ec8cfacee74757b0c00bd3e data/create/advancements/recipes/misc/crafting/logistics/pulse_extender.json 77c3df89a06fc10cd8bd1cc35f0353441860ec11 data/create/advancements/recipes/misc/crafting/logistics/pulse_repeater.json 96b4998626e624fb79c79fb754c28b21ddc27254 data/create/advancements/recipes/misc/crafting/logistics/redstone_contact.json 1b50ed47c37e48d1112c76059574eed71ecea4e5 data/create/advancements/recipes/misc/crafting/logistics/redstone_link.json +cea78bc9b093a8a6a85ef1df53ddf11d9c37a114 data/create/advancements/recipes/misc/crafting/logistics/redstone_requester_clear.json 831588b3f29411d5c4b358006051152eb2b23e6b data/create/advancements/recipes/misc/crafting/logistics/stockpile_switch.json +1e0fc9f4971286a69d9706006bd8358931382c9c data/create/advancements/recipes/misc/crafting/logistics/stock_ticker_clear.json cb416511a219d2bc5806c6880c01820a8b563b80 data/create/advancements/recipes/misc/crafting/materials/andesite_alloy.json 3b65a04da4e16442bfa8accfe209b7c5342b1db9 data/create/advancements/recipes/misc/crafting/materials/andesite_alloy_block.json 2715b888b6d96ee4c7208af21bb4dfb1a1bd544c data/create/advancements/recipes/misc/crafting/materials/andesite_alloy_from_block.json @@ -279,6 +283,7 @@ b3c4585dc6ed9c4a38d7923ae399b88ab8912df9 data/create/recipes/blasting/zinc_ingot c500139f545fea4568575b93b1ab9e56f004f137 data/create/recipes/crafting/appliances/copper_diving_boots.json 77b28e10fcbe223f8235b193e899046b382382c9 data/create/recipes/crafting/appliances/copper_diving_helmet.json 3e3f71d579ec7453e453d5b65aaee3c43169b679 data/create/recipes/crafting/appliances/crafting_blueprint.json +4516e2c533f753f9d3802ae3c9c1400866ad3a31 data/create/recipes/crafting/appliances/display_cloth_clear.json b7c8f3c5e80749c6c38d5c0153dc68a79c32535f data/create/recipes/crafting/appliances/dough.json 409b5d70ee1ef9164c327d79472e6d66ce55dec6 data/create/recipes/crafting/appliances/filter_clear.json 265ead7993ae9e9b617dbfae749a77fed6b7b1ba data/create/recipes/crafting/appliances/linked_controller.json @@ -415,13 +420,16 @@ a24f11d979f40994b9f881b0f49fff5d93185296 data/create/recipes/crafting/logistics/ d994ef262b16357984d3ed62f6563d2f37266193 data/create/recipes/crafting/logistics/brass_tunnel.json 0b18d9964f2d580eb465cc72208f7a7fdba7b63e data/create/recipes/crafting/logistics/content_observer.json cc837e8b014c121ed9d959baddea134ebf669350 data/create/recipes/crafting/logistics/display_link.json +5db046b432f184c6590c8e6adaf95adac6f0dc9d data/create/recipes/crafting/logistics/packager_link_clear.json dd28b63ceb46a1e9071549c4f8ff32f520c667f6 data/create/recipes/crafting/logistics/powered_latch.json 9ee6e19644928dc78e6f8a5e59f30cd42ac3e454 data/create/recipes/crafting/logistics/powered_toggle_latch.json aa8a704ad643ff5f06db34f4047f7f740a556236 data/create/recipes/crafting/logistics/pulse_extender.json 8b0b342baa18cc47c7a60a3c9812fece28210cf6 data/create/recipes/crafting/logistics/pulse_repeater.json c81f852f1d1514184ff235e790a6ca907f7b6ad4 data/create/recipes/crafting/logistics/redstone_contact.json 00877e6b56f28d8691080ef18b654f0a141835ce data/create/recipes/crafting/logistics/redstone_link.json +8446b3ca07575ea978ddde4121900207d54be8b3 data/create/recipes/crafting/logistics/redstone_requester_clear.json eff0d37e98e8badd8d2c3c9de17ee5560b110dbd data/create/recipes/crafting/logistics/stockpile_switch.json +38aa7b9b3c4724ec8b8d94f00a98d684110ad5ca data/create/recipes/crafting/logistics/stock_ticker_clear.json ac524c110f66a7433208a888c5f3bb69e5e95743 data/create/recipes/crafting/materials/andesite_alloy.json e6bb68a1d2ed5a629c83f5a0eefb843bb890736d data/create/recipes/crafting/materials/andesite_alloy_block.json eebacb477bcce876622173289b06e1ad21424686 data/create/recipes/crafting/materials/andesite_alloy_from_block.json diff --git a/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 b/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 index 7cbe41f318..6d276f6821 100644 --- a/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 +++ b/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 @@ -1,4 +1,4 @@ -// 1.20.1 2024-10-09T12:24:59.1833995 Create's Processing Recipes +// 1.20.1 2024-10-15T10:59:16.1265677 Create's Processing Recipes 3c94326fb730f68c1e44fe1e2ef09c9db6ffd92b data/create/recipes/compacting/andesite_from_flint.json 8d3d5b31f3601b9f681ff710e0545a483a1494c6 data/create/recipes/compacting/blaze_cake.json 8bd7f4e3a686ab520b2d55594d2018d0e9a50c91 data/create/recipes/compacting/chocolate.json @@ -968,6 +968,7 @@ a91dae829938d3f69a7007d3cf8db02b70fe3a7f data/create/recipes/milling/white_tulip 5f1b8a82af091cd4589ecfa5c13a4db6ad9c51b9 data/create/recipes/mixing/andesite_alloy.json 48604c2205b18fe1401eac58d14aa1677cbd9c2b data/create/recipes/mixing/andesite_alloy_from_zinc.json d06c1d0362dccc4e5f8b22f851dc8316b35c06b0 data/create/recipes/mixing/brass_ingot.json +59fc3b044b72cb7855daa63c64f723b7f0957c5e data/create/recipes/mixing/cardboard_pulp.json 840a9008d4531425beadfcf224d21e938acc4502 data/create/recipes/mixing/chocolate.json e7b86d4ca5de2df474794424d93b447e5f9dcdc3 data/create/recipes/mixing/chocolate_melting.json 39e832016fa5e360434271505d09ced17a40e7eb data/create/recipes/mixing/compat/ae2/fluix_crystal.json @@ -981,6 +982,7 @@ ac2a2456e2f0ccd74db6dc5ad029eb4e6781a25d data/create/recipes/mixing/honey.json 77de88a8d25b974a63a5d132dd5461523e798fe2 data/create/recipes/pressing/aether_dirt_path.json 92a1198c990660458565ca871520b7c32fb0e24b data/create/recipes/pressing/aether_dirt_path_from_grass.json 8bd950c78b4db3b7f5a9a1f42c116677049b77fc data/create/recipes/pressing/brass_ingot.json +3f7b661d165c9c0140722dfe31591e6688b1ab98 data/create/recipes/pressing/cardboard.json 1fe1caaec87a1a7b3cd739c372829f48386d2f8a data/create/recipes/pressing/compat/atmospheric/crustose_path.json 4d4821506da8c82eabc6109d1cfcb4fa980e54c8 data/create/recipes/pressing/compat/betterendforge/amber_moss_path.json 16c653a9c8771662d060a6151fa77ab4ce8d2614 data/create/recipes/pressing/compat/betterendforge/cave_moss_path.json diff --git a/src/generated/resources/.cache/c24b4d2b8d15abff51c78bd94f4403d9eae6c139 b/src/generated/resources/.cache/c24b4d2b8d15abff51c78bd94f4403d9eae6c139 index 4184c4f4cf..d6a396f9a3 100644 --- a/src/generated/resources/.cache/c24b4d2b8d15abff51c78bd94f4403d9eae6c139 +++ b/src/generated/resources/.cache/c24b4d2b8d15abff51c78bd94f4403d9eae6c139 @@ -1,2 +1,2 @@ -// 1.20.1 2024-10-09T12:24:59.2018604 Create's Custom Sounds -bcfd9320f8ed54f3282b1757a41da0d1753e1754 assets/create/sounds.json +// 1.20.1 2024-10-15T12:45:53.6394085 Create's Custom Sounds +aab9aed51d861cbd3ae7e421859ced9f6bf22c4d assets/create/sounds.json diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 66eb7425ea..792f2f29da 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -1133,9 +1133,7 @@ "create.gui.package_port.catch_packages": "˙˙˙oʇ pǝssǝɹppɐ sǝbɐʞɔɐd ɥɔʇɐƆ", "create.gui.package_port.catch_packages_empty": "pǝssǝɹppɐ-uou ɥɔʇɐɯ oʇ ʎʇdɯǝ ǝʌɐǝꞀ", "create.gui.package_port.catch_packages_wildcard": "pɹɐɔpןıʍ ʇxǝʇ ɐ sɐ * ǝs∩", - "create.gui.package_port.eject_to_inventory": "ʎɹoʇuǝʌuI oʇ ʇɔǝظƎ", "create.gui.package_port.not_targeting_anything": "buıɥʇʎuɐ buıʇǝbɹɐʇ ʇou sı ʇɹod ǝbɐʞɔɐԀ", - "create.gui.package_port.packages_backed_up": "dn pǝʞɔɐq )s(ǝbɐʞɔɐԀ %1$s", "create.gui.package_port.send_and_receive": "sǝbɐʞɔɐd ǝʌıǝɔǝɹ puɐ puǝS", "create.gui.package_port.send_only": "sǝbɐʞɔɐd puǝs ʎןuO", "create.gui.schedule.add_condition": "uoıʇıpuoƆ ppⱯ", @@ -2541,6 +2539,7 @@ "create.station.train_not_aligned": "'ǝןqɯǝssɐsıp ʇouuɐƆ", "create.station.train_not_aligned_1": "pǝubıןɐ sǝbɐıɹɹɐɔ ןןɐ ʇou", "create.subtitle.blaze_munch": "sǝɥɔunɯ ɹǝuɹnᗺ ǝzɐןᗺ", + "create.subtitle.cardboard_bonk": "ʞuoq ʇuɐuosǝᴚ", "create.subtitle.cogs": "ǝןqɯnɹ sןǝǝɥʍboƆ", "create.subtitle.confirm": "buıp ǝʌıʇɐɯɹıɟɟⱯ", "create.subtitle.contraption_assemble": "sǝʌoɯ uoıʇdɐɹʇuoƆ", @@ -2557,7 +2556,7 @@ "create.subtitle.depot_plop": "spuɐן ɯǝʇI", "create.subtitle.depot_slide": "sǝpıןs ɯǝʇI", "create.subtitle.funnel_flap": "sdɐןɟ ןǝuunℲ", - "create.subtitle.fwoomp": "sdɯooʍɟ ɹǝɥɔunɐꞀ oʇɐʇoԀ", + "create.subtitle.fwoomp": "dɯooʍɟ ʇuɐuosǝᴚ", "create.subtitle.haunted_bell_convert": "suǝʞɐʍɐ ןןǝᗺ pǝʇunɐH", "create.subtitle.haunted_bell_use": "sןןoʇ ןןǝᗺ pǝʇunɐH", "create.subtitle.item_hatch": "suǝdo ɥɔʇɐH ɯǝʇI", @@ -2788,10 +2787,13 @@ "item.create.brass_sheet": "ʇǝǝɥS ssɐɹᗺ", "item.create.builders_tea": "ɐǝ⟘ s,ɹǝpןınᗺ", "item.create.builders_tea.tooltip.summary": "‾˙buıʇɐɹnʇɐS‾ puɐ ‾buıʇɐʌıʇoW‾ -pǝʇɹɐʇs ʎɐp ǝɥʇ ʇǝb oʇ ʞuıɹp ʇɔǝɟɹǝd ǝɥ⟘", + "item.create.cardboard": "pɹɐoqpɹɐƆ", "item.create.cardboard_package_10x12": "ǝbɐʞɔɐԀ pɹɐoqpɹɐƆ", "item.create.cardboard_package_10x8": "ǝbɐʞɔɐԀ pɹɐoqpɹɐƆ", "item.create.cardboard_package_12x10": "ǝbɐʞɔɐԀ pɹɐoqpɹɐƆ", "item.create.cardboard_package_12x12": "ǝbɐʞɔɐԀ pɹɐoqpɹɐƆ", + "item.create.cardboard_pulp": "dןnԀ pɹɐoqpɹɐƆ", + "item.create.cardboard_sword": "pɹoʍS pɹɐoqpɹɐƆ", "item.create.chest_minecart_contraption": "uoıʇdɐɹʇuoƆ ʇɹɐɔǝuıW ʇsǝɥƆ", "item.create.chocolate_bucket": "ʇǝʞɔnᗺ ǝʇɐןoɔoɥƆ", "item.create.chocolate_glazed_berries": "sǝıɹɹǝᗺ pǝzɐן⅁ ǝʇɐןoɔoɥƆ", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index d687820e3b..e27a54f682 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1133,9 +1133,7 @@ "create.gui.package_port.catch_packages": "Catch packages addressed to...", "create.gui.package_port.catch_packages_empty": "Leave empty to match non-addressed", "create.gui.package_port.catch_packages_wildcard": "Use * as a text wildcard", - "create.gui.package_port.eject_to_inventory": "Eject to Inventory", "create.gui.package_port.not_targeting_anything": "Package port is not targeting anything", - "create.gui.package_port.packages_backed_up": "%1$s Package(s) backed up", "create.gui.package_port.send_and_receive": "Send and receive packages", "create.gui.package_port.send_only": "Only send packages", "create.gui.schedule.add_condition": "Add Condition", @@ -2541,6 +2539,7 @@ "create.station.train_not_aligned": "Cannot disassemble,", "create.station.train_not_aligned_1": "not all carriages aligned", "create.subtitle.blaze_munch": "Blaze Burner munches", + "create.subtitle.cardboard_bonk": "Resonant bonk", "create.subtitle.cogs": "Cogwheels rumble", "create.subtitle.confirm": "Affirmative ding", "create.subtitle.contraption_assemble": "Contraption moves", @@ -2557,7 +2556,7 @@ "create.subtitle.depot_plop": "Item lands", "create.subtitle.depot_slide": "Item slides", "create.subtitle.funnel_flap": "Funnel flaps", - "create.subtitle.fwoomp": "Potato Launcher fwoomps", + "create.subtitle.fwoomp": "Resonant fwoomp", "create.subtitle.haunted_bell_convert": "Haunted Bell awakens", "create.subtitle.haunted_bell_use": "Haunted Bell tolls", "create.subtitle.item_hatch": "Item Hatch opens", @@ -2788,10 +2787,13 @@ "item.create.brass_sheet": "Brass Sheet", "item.create.builders_tea": "Builder's Tea", "item.create.builders_tea.tooltip.summary": "The perfect drink to get the day started- _Motivating_ and _Saturating._", + "item.create.cardboard": "Cardboard", "item.create.cardboard_package_10x12": "Cardboard Package", "item.create.cardboard_package_10x8": "Cardboard Package", "item.create.cardboard_package_12x10": "Cardboard Package", "item.create.cardboard_package_12x12": "Cardboard Package", + "item.create.cardboard_pulp": "Cardboard Pulp", + "item.create.cardboard_sword": "Cardboard Sword", "item.create.chest_minecart_contraption": "Chest Minecart Contraption", "item.create.chocolate_bucket": "Chocolate Bucket", "item.create.chocolate_glazed_berries": "Chocolate Glazed Berries", diff --git a/src/generated/resources/assets/create/models/item/cardboard.json b/src/generated/resources/assets/create/models/item/cardboard.json new file mode 100644 index 0000000000..0c9666da8d --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/cardboard" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_pulp.json b/src/generated/resources/assets/create/models/item/cardboard_pulp.json new file mode 100644 index 0000000000..ca956b9090 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard_pulp.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/cardboard_pulp" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_sword.json b/src/generated/resources/assets/create/models/item/cardboard_sword.json new file mode 100644 index 0000000000..fc5ccc5ad0 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard_sword.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/cardboard_sword" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/sounds.json b/src/generated/resources/assets/create/sounds.json index 32751d9ca5..ac2ba8c13e 100644 --- a/src/generated/resources/assets/create/sounds.json +++ b/src/generated/resources/assets/create/sounds.json @@ -8,6 +8,15 @@ ], "subtitle": "create.subtitle.blaze_munch" }, + "cardboard_bonk": { + "sounds": [ + { + "type": "file", + "name": "create:cardboard_bonk" + } + ], + "subtitle": "create.subtitle.cardboard_bonk" + }, "chiff": { "sounds": [ { diff --git a/src/generated/resources/data/create/recipes/mixing/cardboard_pulp.json b/src/generated/resources/data/create/recipes/mixing/cardboard_pulp.json new file mode 100644 index 0000000000..7d9173c294 --- /dev/null +++ b/src/generated/resources/data/create/recipes/mixing/cardboard_pulp.json @@ -0,0 +1,51 @@ +{ + "type": "create:mixing", + "ingredients": [ + { + "item": "minecraft:paper" + }, + { + "item": "minecraft:paper" + }, + { + "item": "minecraft:paper" + }, + { + "item": "minecraft:paper" + }, + { + "item": "minecraft:paper" + }, + { + "item": "minecraft:paper" + }, + { + "item": "minecraft:paper" + }, + { + "item": "minecraft:paper" + }, + { + "item": "minecraft:paper" + }, + { + "item": "minecraft:paper" + }, + { + "item": "minecraft:paper" + }, + { + "item": "minecraft:paper" + }, + { + "amount": 1000, + "fluid": "minecraft:water", + "nbt": {} + } + ], + "results": [ + { + "item": "create:cardboard_pulp" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/pressing/cardboard.json b/src/generated/resources/data/create/recipes/pressing/cardboard.json new file mode 100644 index 0000000000..3b9533b931 --- /dev/null +++ b/src/generated/resources/data/create/recipes/pressing/cardboard.json @@ -0,0 +1,13 @@ +{ + "type": "create:pressing", + "ingredients": [ + { + "item": "create:cardboard_pulp" + } + ], + "results": [ + { + "item": "create:cardboard" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/plates/cardboard.json b/src/generated/resources/data/forge/tags/items/plates/cardboard.json new file mode 100644 index 0000000000..1563fbdd85 --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/plates/cardboard.json @@ -0,0 +1,5 @@ +{ + "values": [ + "create:cardboard" + ] +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllItems.java b/src/main/java/com/simibubi/create/AllItems.java index 165f0bbd85..30ea93b020 100644 --- a/src/main/java/com/simibubi/create/AllItems.java +++ b/src/main/java/com/simibubi/create/AllItems.java @@ -33,6 +33,7 @@ import com.simibubi.create.content.equipment.goggles.GogglesModel; import com.simibubi.create.content.equipment.potatoCannon.PotatoCannonItem; import com.simibubi.create.content.equipment.sandPaper.SandPaperItem; import com.simibubi.create.content.equipment.symmetryWand.SymmetryWandItem; +import com.simibubi.create.content.equipment.tool.CardboardSwordItem; import com.simibubi.create.content.equipment.wrench.WrenchItem; import com.simibubi.create.content.equipment.zapper.terrainzapper.WorldshaperItem; import com.simibubi.create.content.kinetics.belt.item.BeltConnectorItem; @@ -82,7 +83,9 @@ public class AllItems { POLISHED_ROSE_QUARTZ = ingredient("polished_rose_quartz"), POWDERED_OBSIDIAN = ingredient("powdered_obsidian"), STURDY_SHEET = taggedIngredient("sturdy_sheet", forgeItemTag("plates/obsidian"), PLATES.tag), PROPELLER = ingredient("propeller"), WHISK = ingredient("whisk"), BRASS_HAND = ingredient("brass_hand"), - CRAFTER_SLOT_COVER = ingredient("crafter_slot_cover"), ELECTRON_TUBE = ingredient("electron_tube"); + CRAFTER_SLOT_COVER = ingredient("crafter_slot_cover"), ELECTRON_TUBE = ingredient("electron_tube"), + CARDBOARD_PULP = ingredient("cardboard_pulp"), + CARDBOARD = taggedIngredient("cardboard", forgeItemTag("plates/cardboard")); public static final ItemEntry @@ -140,6 +143,11 @@ public class AllItems { .lang("Builder's Tea") .register(); + public static final ItemEntry CARDBOARD_SWORD = + REGISTRATE.item("cardboard_sword", CardboardSwordItem::new) + .properties(p -> p.stacksTo(1)) + .register(); + public static final ItemEntry RAW_ZINC = taggedIngredient("raw_zinc", forgeItemTag("raw_materials/zinc"), forgeItemTag("raw_materials")); diff --git a/src/main/java/com/simibubi/create/AllSoundEvents.java b/src/main/java/com/simibubi/create/AllSoundEvents.java index 3f3bb0fd11..758407b6b5 100644 --- a/src/main/java/com/simibubi/create/AllSoundEvents.java +++ b/src/main/java/com/simibubi/create/AllSoundEvents.java @@ -125,7 +125,11 @@ public class AllSoundEvents { .category(SoundSource.BLOCKS) .build(), - FWOOMP = create("fwoomp").subtitle("Potato Launcher fwoomps") + FWOOMP = create("fwoomp").subtitle("Resonant fwoomp") + .category(SoundSource.PLAYERS) + .build(), + + CARDBOARD_SWORD = create("cardboard_bonk").subtitle("Resonant bonk") .category(SoundSource.PLAYERS) .build(), diff --git a/src/main/java/com/simibubi/create/content/equipment/tool/AllToolMaterials.java b/src/main/java/com/simibubi/create/content/equipment/tool/AllToolMaterials.java new file mode 100644 index 0000000000..eb9e7021fa --- /dev/null +++ b/src/main/java/com/simibubi/create/content/equipment/tool/AllToolMaterials.java @@ -0,0 +1,66 @@ +package com.simibubi.create.content.equipment.tool; + +import java.util.function.Supplier; + +import com.simibubi.create.AllItems; +import com.simibubi.create.Create; + +import net.minecraft.world.item.Tier; +import net.minecraft.world.item.crafting.Ingredient; + +public enum AllToolMaterials implements Tier { + + CARDBOARD(Create.asResource("cardboard") + .toString(), 200, 1, 2, 1, () -> Ingredient.of(AllItems.CARDBOARD.asItem())) + + ; + + public String name; + + private int uses; + private float speed; + private float damageBonus; + private int enchantValue; + private Supplier repairMaterial; + + private AllToolMaterials(String name, int uses, float speed, float damageBonus, int enchantValue, + Supplier repairMaterial) { + this.name = name; + this.uses = uses; + this.speed = speed; + this.damageBonus = damageBonus; + this.enchantValue = enchantValue; + this.repairMaterial = repairMaterial; + } + + @Override + public int getUses() { + return uses; + } + + @Override + public float getSpeed() { + return speed; + } + + @Override + public float getAttackDamageBonus() { + return damageBonus; + } + + @Override + public int getLevel() { + return 0; + } + + @Override + public int getEnchantmentValue() { + return enchantValue; + } + + @Override + public Ingredient getRepairIngredient() { + return repairMaterial.get(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/equipment/tool/CardboardSwordItem.java b/src/main/java/com/simibubi/create/content/equipment/tool/CardboardSwordItem.java new file mode 100644 index 0000000000..8a52aa417c --- /dev/null +++ b/src/main/java/com/simibubi/create/content/equipment/tool/CardboardSwordItem.java @@ -0,0 +1,129 @@ +package com.simibubi.create.content.equipment.tool; + +import java.util.UUID; + +import org.jetbrains.annotations.NotNull; + +import com.google.common.collect.ImmutableMultimap; +import com.google.common.collect.Multimap; +import com.simibubi.create.AllItems; +import com.simibubi.create.AllSoundEvents; + +import net.minecraft.util.Mth; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.MobCategory; +import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.monster.Spider; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.ItemStack.TooltipPart; +import net.minecraft.world.item.SwordItem; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraftforge.event.entity.living.LivingAttackEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod.EventBusSubscriber; + +@EventBusSubscriber +public class CardboardSwordItem extends SwordItem { + + private ImmutableMultimap cardboardModifiers; + + public CardboardSwordItem(Properties pProperties) { + super(AllToolMaterials.CARDBOARD, 3, 1f, pProperties); + + float attackDamage = 3f + AllToolMaterials.CARDBOARD.getAttackDamageBonus(); + ImmutableMultimap.Builder builder = ImmutableMultimap.builder(); + builder.put(Attributes.ATTACK_DAMAGE, new AttributeModifier(BASE_ATTACK_DAMAGE_UUID, "Weapon modifier", + attackDamage, AttributeModifier.Operation.ADDITION)); + builder.put(Attributes.ATTACK_SPEED, + new AttributeModifier(BASE_ATTACK_SPEED_UUID, "Weapon modifier", 1f, AttributeModifier.Operation.ADDITION)); + + // Setting knockback to 0 prevents the aggressive punching sound + // Knockback strength is reapplied in the event handler below + builder.put(Attributes.ATTACK_KNOCKBACK, + new AttributeModifier(UUID.fromString("45227E1C-A180-4865-B01B-BCCE9785ACA3"), "Weapon modifier", 0f, + AttributeModifier.Operation.MULTIPLY_TOTAL)); + + cardboardModifiers = builder.build(); + } + + @Override + public Multimap getDefaultAttributeModifiers(EquipmentSlot pEquipmentSlot) { + return pEquipmentSlot == EquipmentSlot.MAINHAND ? cardboardModifiers + : super.getDefaultAttributeModifiers(pEquipmentSlot); + } + + @Override + public boolean canApplyAtEnchantingTable(ItemStack stack, Enchantment enchantment) { + return enchantment == Enchantments.KNOCKBACK; + } + + @Override + public int getDefaultTooltipHideFlags(@NotNull ItemStack stack) { + return TooltipPart.MODIFIERS.getMask(); + } + + @Override + public boolean hurtEnemy(ItemStack pStack, LivingEntity pTarget, LivingEntity pAttacker) { + return super.hurtEnemy(pStack, pTarget, pAttacker); + } + + @Override + public boolean onLeftClickEntity(ItemStack stack, Player player, Entity entity) { + AllSoundEvents.CARDBOARD_SWORD.playFrom(entity, 0.75f, 1.5f); + return super.onLeftClickEntity(stack, player, entity); + } + + @SubscribeEvent + public static void cardboardSwordsCannotHurtYou(LivingAttackEvent event) { + Entity attacker = event.getSource() + .getEntity(); + LivingEntity target = event.getEntity(); + if (target instanceof Spider) + return; + if (!(attacker instanceof LivingEntity livingAttacker + && AllItems.CARDBOARD_SWORD.isIn(livingAttacker.getItemInHand(InteractionHand.MAIN_HAND)))) + return; + + event.setCanceled(true); + + // Reference player.attack() + // This section replicates knockback behaviour without hurting the target + + double i = livingAttacker.getAttributeValue(Attributes.ATTACK_KNOCKBACK) + 2; + i += EnchantmentHelper.getKnockbackBonus(livingAttacker); + if (livingAttacker.isSprinting() + && (!(livingAttacker instanceof Player p) || p.getAttackStrengthScale(0.5f) > 0.9f)) + ++i; + + if (i <= 0) + return; + + if (target instanceof LivingEntity livingTarget) { + livingTarget.knockback(i * 0.5F, Mth.sin(livingAttacker.getYRot() * Mth.DEG_TO_RAD), + -Mth.cos(livingAttacker.getYRot() * Mth.DEG_TO_RAD)); + if ((livingTarget.getClassification(false) == MobCategory.MISC + || livingTarget.getClassification(false) == MobCategory.CREATURE) && !(livingTarget instanceof Player)) + livingTarget.addEffect(new MobEffectInstance(MobEffects.MOVEMENT_SLOWDOWN, 60, 9, true, false, false)); + + } else { + event.getEntity() + .push(-Mth.sin(livingAttacker.getYRot() * Mth.DEG_TO_RAD) * i * 0.5F, 0.05D, + Mth.cos(livingAttacker.getYRot() * Mth.DEG_TO_RAD) * i * 0.5F); + } + + livingAttacker.setDeltaMovement(livingAttacker.getDeltaMovement() + .multiply(0.6D, 1.0D, 0.6D)); + livingAttacker.setSprinting(false); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java index e5210c3319..9b0a6ed55b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java @@ -44,6 +44,7 @@ import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.VoxelShape; +import net.minecraftforge.common.ForgeHooks; import net.minecraftforge.entity.IEntityAdditionalSpawnData; import net.minecraftforge.items.ItemStackHandler; import net.minecraftforge.network.NetworkHooks; @@ -163,7 +164,7 @@ public class PackageEntity extends LivingEntity implements IEntityAdditionalSpaw } insertionDelay = Math.min(insertionDelay + 1, 30); super.tick(); - + if (!PackageItem.isPackage(box)) discard(); } @@ -283,6 +284,9 @@ public class PackageEntity extends LivingEntity implements IEntityAdditionalSpaw @Override public boolean hurt(DamageSource source, float amount) { + if (!ForgeHooks.onLivingAttack(this, source, amount)) + return false; + if (level().isClientSide || !this.isAlive()) return false; diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/MixingRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/MixingRecipeGen.java index c8534f278b..7ed09fc23a 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/MixingRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/MixingRecipeGen.java @@ -62,6 +62,22 @@ public class MixingRecipeGen extends ProcessingRecipeGen { MUD = create("mud_by_mixing", b -> b.require(BlockTagIngredient.create(BlockTags.CONVERTABLE_TO_MUD)) .require(Fluids.WATER, 250) .output(Blocks.MUD, 1)), + + PULP = create("cardboard_pulp", b -> b + .require(Items.PAPER) + .require(Items.PAPER) + .require(Items.PAPER) + .require(Items.PAPER) + .require(Items.PAPER) + .require(Items.PAPER) + .require(Items.PAPER) + .require(Items.PAPER) + .require(Items.PAPER) + .require(Items.PAPER) + .require(Items.PAPER) + .require(Items.PAPER) + .require(Fluids.WATER, 1000) + .output(AllItems.CARDBOARD_PULP, 1)), // AE2 diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/PressingRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/PressingRecipeGen.java index bea7083415..2867cae28a 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/PressingRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/PressingRecipeGen.java @@ -26,6 +26,9 @@ public class PressingRecipeGen extends ProcessingRecipeGen { BRASS = create("brass_ingot", b -> b.require(I.brass()) .output(AllItems.BRASS_SHEET.get())), + CARDBOARD = create("cardboard", b -> b.require(AllItems.CARDBOARD_PULP) + .output(AllItems.CARDBOARD.get())), + // Atmospheric ATM = moddedPaths(Mods.ATM, "crustose"), diff --git a/src/main/resources/assets/create/sounds/cardboard_bonk.ogg b/src/main/resources/assets/create/sounds/cardboard_bonk.ogg new file mode 100644 index 0000000000000000000000000000000000000000..a110956d803178464f29da10bc40a44e1e5df56a GIT binary patch literal 13746 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/item/cardboard_pulp.png b/src/main/resources/assets/create/textures/item/cardboard_pulp.png new file mode 100644 index 0000000000000000000000000000000000000000..6869a2480f5d013c7568d0794818d648c9444456 GIT binary patch literal 280 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}%0G|+72UE34#j*S6bgbzrE=}@Z*;%+_R*M)16HtD4Ny9%N#aR;M7yKUz z7=ryPgg}A?9+AZi419+{nDKc2iWHz=p{I*uh(>U1pQ8|qA_p_0@q_>IHoR8VH$og| znkjAjU(&d++UlJ0BLS;C#o7b&&h&iv&9Oo3=LB=<1zU}to-{sg#B}NENye9xI8iYxXcM=?@7#yKJ|E#2uY$yOxz6@UPzA$jS0FN~8nmD+UHn LS3j3^P6NS%G|^0G|-omL%&-s~X-PpB-c-x?@5zPRAzBM=qAepK_+qii$5Q_+x(Tu$U9gUahRjf=T7vQ-{;Pp{I2lh l-7O!Ll|OcPck+aU-hCIqyrItJj4#kC22WQ%mvv4FO#tNWT%!O0 literal 0 HcmV?d00001 From 8e18022df2d4c7913c030fd459a92fd1ad30cc30 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Wed, 16 Oct 2024 00:31:12 +0200 Subject: [PATCH 077/515] Prop hunt - Added cardboard armor - Fixed cardboard sword models --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 17 +++-- .../b256105d8411632b0d585496ea8944a751a08034 | 4 +- .../resources/assets/create/lang/en_ud.json | 4 ++ .../resources/assets/create/lang/en_us.json | 4 ++ .../create/models/item/cardboard_boots.json | 6 ++ .../models/item/cardboard_chestplate.json | 6 ++ .../create/models/item/cardboard_helmet.json | 6 ++ .../models/item/cardboard_leggings.json | 6 ++ .../create/models/item/cardboard_sword.json | 5 +- .../create/recipes/mixing/cardboard_pulp.json | 9 --- .../data/forge/tags/items/armors/boots.json | 3 +- .../forge/tags/items/armors/chestplate.json | 5 ++ .../data/forge/tags/items/armors/helmet.json | 5 ++ .../forge/tags/items/armors/leggings.json | 5 ++ .../java/com/simibubi/create/AllItems.java | 34 +++++++++ .../equipment/armor/AllArmorMaterials.java | 13 +++- .../armor/CardboardArmorHandler.java | 52 ++++++++++++++ .../armor/CardboardArmorHandlerClient.java | 47 ++++++++++++ .../equipment/tool/CardboardSwordItem.java | 11 +++ .../tool/CardboardSwordItemRenderer.java | 24 +++++++ .../logistics/box/PackageRenderer.java | 8 ++- .../data/recipe/MixingRecipeGen.java | 3 - .../models/item/cardboard_sword/item.json | 6 ++ .../item/cardboard_sword/item_in_hand.json | 67 ++++++++++++++++++ .../create/textures/item/cardboard_boots.png | Bin 0 -> 224 bytes .../textures/item/cardboard_chestplate.png | Bin 0 -> 251 bytes .../create/textures/item/cardboard_helmet.png | Bin 0 -> 219 bytes .../textures/item/cardboard_leggings.png | Bin 0 -> 236 bytes .../textures/item/cardboard_sword_in_hand.png | Bin 0 -> 218 bytes .../models/armor/cardboard_layer_1.png | Bin 0 -> 611 bytes .../models/armor/cardboard_layer_2.png | Bin 0 -> 278 bytes 31 files changed, 322 insertions(+), 28 deletions(-) create mode 100644 src/generated/resources/assets/create/models/item/cardboard_boots.json create mode 100644 src/generated/resources/assets/create/models/item/cardboard_chestplate.json create mode 100644 src/generated/resources/assets/create/models/item/cardboard_helmet.json create mode 100644 src/generated/resources/assets/create/models/item/cardboard_leggings.json create mode 100644 src/generated/resources/data/forge/tags/items/armors/chestplate.json create mode 100644 src/generated/resources/data/forge/tags/items/armors/helmet.json create mode 100644 src/generated/resources/data/forge/tags/items/armors/leggings.json create mode 100644 src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorHandler.java create mode 100644 src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorHandlerClient.java create mode 100644 src/main/java/com/simibubi/create/content/equipment/tool/CardboardSwordItemRenderer.java create mode 100644 src/main/resources/assets/create/models/item/cardboard_sword/item.json create mode 100644 src/main/resources/assets/create/models/item/cardboard_sword/item_in_hand.json create mode 100644 src/main/resources/assets/create/textures/item/cardboard_boots.png create mode 100644 src/main/resources/assets/create/textures/item/cardboard_chestplate.png create mode 100644 src/main/resources/assets/create/textures/item/cardboard_helmet.png create mode 100644 src/main/resources/assets/create/textures/item/cardboard_leggings.png create mode 100644 src/main/resources/assets/create/textures/item/cardboard_sword_in_hand.png create mode 100644 src/main/resources/assets/create/textures/models/armor/cardboard_layer_1.png create mode 100644 src/main/resources/assets/create/textures/models/armor/cardboard_layer_2.png diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index b90d4f8153..880084bcf1 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-10-15T12:45:53.6413921 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-10-15T23:01:25.2230224 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -609,8 +609,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -8ed3587c8b0fd48d591340803e6570490614e7a3 assets/create/lang/en_ud.json -4ccbf8f607fce6dfd1b32c0406ba571c9d335e9b assets/create/lang/en_us.json +2fa2f9f6b521cc5012a6aa497c7991b2e67ee170 assets/create/lang/en_ud.json +3f4bc5c6c5ecde34d3e6c121ea7f6706e5b90563 assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -1768,12 +1768,16 @@ fce64539b36fc8a5ffa39d7a3f73765818437cbf assets/create/models/item/brown_seat.js 1db479848369140bb913ba09f3f1d994e4ac864c assets/create/models/item/builders_tea.json f5ff4e2ed2ea2e43b6d02f6a95ba02b2e4b611dc assets/create/models/item/calcite_pillar.json cc2692f7964f4266ecf00fcab176b1ef0b78673f assets/create/models/item/cardboard.json +39eadb54cec52d9e2a087fc71ef83341688f2781 assets/create/models/item/cardboard_boots.json +d6a3f139fca5ac6aff94d11d75fe239283bb4a09 assets/create/models/item/cardboard_chestplate.json +82236ea8e939c46f0d2c9142336190eca2a0425e assets/create/models/item/cardboard_helmet.json +416a4d33a2b3b1921285f96436853dd7690447ac assets/create/models/item/cardboard_leggings.json 45d7fa87d102a0373a06a13592f58baafa4e5a33 assets/create/models/item/cardboard_package_10x12.json f998f36d9a6f469bbd3822a17b2b45f81e6810c6 assets/create/models/item/cardboard_package_10x8.json b7a24a7dd21a464815b2fd8cd6037e854be3f485 assets/create/models/item/cardboard_package_12x10.json d5396690e7813c67ee3600555d7e47d0097b1f56 assets/create/models/item/cardboard_package_12x12.json 39aacb806378ce16d5c801a0c7ea8027b5090f9c assets/create/models/item/cardboard_pulp.json -9ed2aad55ca1d8d4e1881c1abd1154f8bc4d35c2 assets/create/models/item/cardboard_sword.json +9dccb21720687bbd516c8598c5449028077f8467 assets/create/models/item/cardboard_sword.json 1cdb2b8801551c1540bb9b2a9cc3d725a2b433e7 assets/create/models/item/cart_assembler.json 390a06d81c8c2a0ff83196bd0154dd292206e3b6 assets/create/models/item/chain_conveyor.json a197d08618f4035182c91a6b16031eb681ab8a7c assets/create/models/item/chest_minecart_contraption.json @@ -4355,9 +4359,12 @@ bcd593714f43bc6a0aefbd714c24db3cf9e71250 data/forge/tags/blocks/storage_blocks/r 8140415f1c16f09167f41eeee25c09706a944be0 data/forge/tags/fluids/chocolate.json 0ccc9ff76001cdd7db1b79c1371f59d3283abe64 data/forge/tags/fluids/honey.json cca816b34ac2e9b7933df680aa9778ff2cfe9605 data/forge/tags/fluids/tea.json -00c856dcfa4368cca671ee5d93c4900835991d68 data/forge/tags/items/armors/boots.json +1a9ce7d5f5fe92d3b73e269cd5dbf5cd1f1fe5b8 data/forge/tags/items/armors/boots.json +6749b53c23aefe4baa55c4b2f624bbc6dfe5f423 data/forge/tags/items/armors/chestplate.json 695d75b352fd190b303c724d1aaee9bb786a903b data/forge/tags/items/armors/chestplates.json +5b91b107f48b47958db20f13cb3cc0c6f7085fdc data/forge/tags/items/armors/helmet.json 3580dae058fc75b45fab4c4ebbd1b01573ba9e11 data/forge/tags/items/armors/helmets.json +afdac448376ff5624f49cbf31feedf691ecbc4c5 data/forge/tags/items/armors/leggings.json 06ebf72e8f6c081862236d4b068b5dfb275a8385 data/forge/tags/items/buckets/honey.json 801d097b0af7153e0c5c72a924d61f8afb4cf264 data/forge/tags/items/dough.json 801d097b0af7153e0c5c72a924d61f8afb4cf264 data/forge/tags/items/dough/wheat.json diff --git a/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 b/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 index 6d276f6821..307839d92a 100644 --- a/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 +++ b/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 @@ -1,4 +1,4 @@ -// 1.20.1 2024-10-15T10:59:16.1265677 Create's Processing Recipes +// 1.20.1 2024-10-15T23:01:25.1999039 Create's Processing Recipes 3c94326fb730f68c1e44fe1e2ef09c9db6ffd92b data/create/recipes/compacting/andesite_from_flint.json 8d3d5b31f3601b9f681ff710e0545a483a1494c6 data/create/recipes/compacting/blaze_cake.json 8bd7f4e3a686ab520b2d55594d2018d0e9a50c91 data/create/recipes/compacting/chocolate.json @@ -968,7 +968,7 @@ a91dae829938d3f69a7007d3cf8db02b70fe3a7f data/create/recipes/milling/white_tulip 5f1b8a82af091cd4589ecfa5c13a4db6ad9c51b9 data/create/recipes/mixing/andesite_alloy.json 48604c2205b18fe1401eac58d14aa1677cbd9c2b data/create/recipes/mixing/andesite_alloy_from_zinc.json d06c1d0362dccc4e5f8b22f851dc8316b35c06b0 data/create/recipes/mixing/brass_ingot.json -59fc3b044b72cb7855daa63c64f723b7f0957c5e data/create/recipes/mixing/cardboard_pulp.json +fd3d1d8d2584dca71525f52ce6e08a1a77d3045f data/create/recipes/mixing/cardboard_pulp.json 840a9008d4531425beadfcf224d21e938acc4502 data/create/recipes/mixing/chocolate.json e7b86d4ca5de2df474794424d93b447e5f9dcdc3 data/create/recipes/mixing/chocolate_melting.json 39e832016fa5e360434271505d09ced17a40e7eb data/create/recipes/mixing/compat/ae2/fluix_crystal.json diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 792f2f29da..a3265fc689 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -2788,6 +2788,10 @@ "item.create.builders_tea": "ɐǝ⟘ s,ɹǝpןınᗺ", "item.create.builders_tea.tooltip.summary": "‾˙buıʇɐɹnʇɐS‾ puɐ ‾buıʇɐʌıʇoW‾ -pǝʇɹɐʇs ʎɐp ǝɥʇ ʇǝb oʇ ʞuıɹp ʇɔǝɟɹǝd ǝɥ⟘", "item.create.cardboard": "pɹɐoqpɹɐƆ", + "item.create.cardboard_boots": "sʇooᗺ pɹɐoqpɹɐƆ", + "item.create.cardboard_chestplate": "ǝʇɐןdʇsǝɥƆ pɹɐoqpɹɐƆ", + "item.create.cardboard_helmet": "ʇǝɯןǝH pɹɐoqpɹɐƆ", + "item.create.cardboard_leggings": "sbuıbbǝꞀ pɹɐoqpɹɐƆ", "item.create.cardboard_package_10x12": "ǝbɐʞɔɐԀ pɹɐoqpɹɐƆ", "item.create.cardboard_package_10x8": "ǝbɐʞɔɐԀ pɹɐoqpɹɐƆ", "item.create.cardboard_package_12x10": "ǝbɐʞɔɐԀ pɹɐoqpɹɐƆ", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index e27a54f682..f8f25a8a32 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -2788,6 +2788,10 @@ "item.create.builders_tea": "Builder's Tea", "item.create.builders_tea.tooltip.summary": "The perfect drink to get the day started- _Motivating_ and _Saturating._", "item.create.cardboard": "Cardboard", + "item.create.cardboard_boots": "Cardboard Boots", + "item.create.cardboard_chestplate": "Cardboard Chestplate", + "item.create.cardboard_helmet": "Cardboard Helmet", + "item.create.cardboard_leggings": "Cardboard Leggings", "item.create.cardboard_package_10x12": "Cardboard Package", "item.create.cardboard_package_10x8": "Cardboard Package", "item.create.cardboard_package_12x10": "Cardboard Package", diff --git a/src/generated/resources/assets/create/models/item/cardboard_boots.json b/src/generated/resources/assets/create/models/item/cardboard_boots.json new file mode 100644 index 0000000000..d7bd75e088 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard_boots.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/cardboard_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_chestplate.json b/src/generated/resources/assets/create/models/item/cardboard_chestplate.json new file mode 100644 index 0000000000..910c1f284c --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard_chestplate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/cardboard_chestplate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_helmet.json b/src/generated/resources/assets/create/models/item/cardboard_helmet.json new file mode 100644 index 0000000000..434b84e5ea --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard_helmet.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/cardboard_helmet" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_leggings.json b/src/generated/resources/assets/create/models/item/cardboard_leggings.json new file mode 100644 index 0000000000..ac0b435a81 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard_leggings.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/cardboard_leggings" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_sword.json b/src/generated/resources/assets/create/models/item/cardboard_sword.json index fc5ccc5ad0..c3786698f9 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_sword.json +++ b/src/generated/resources/assets/create/models/item/cardboard_sword.json @@ -1,6 +1,3 @@ { - "parent": "minecraft:item/generated", - "textures": { - "layer0": "create:item/cardboard_sword" - } + "parent": "create:item/cardboard_sword/item" } \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/mixing/cardboard_pulp.json b/src/generated/resources/data/create/recipes/mixing/cardboard_pulp.json index 7d9173c294..3431023d90 100644 --- a/src/generated/resources/data/create/recipes/mixing/cardboard_pulp.json +++ b/src/generated/resources/data/create/recipes/mixing/cardboard_pulp.json @@ -28,15 +28,6 @@ { "item": "minecraft:paper" }, - { - "item": "minecraft:paper" - }, - { - "item": "minecraft:paper" - }, - { - "item": "minecraft:paper" - }, { "amount": 1000, "fluid": "minecraft:water", diff --git a/src/generated/resources/data/forge/tags/items/armors/boots.json b/src/generated/resources/data/forge/tags/items/armors/boots.json index 892f0dd355..a12039a291 100644 --- a/src/generated/resources/data/forge/tags/items/armors/boots.json +++ b/src/generated/resources/data/forge/tags/items/armors/boots.json @@ -1,6 +1,7 @@ { "values": [ "create:copper_diving_boots", - "create:netherite_diving_boots" + "create:netherite_diving_boots", + "create:cardboard_boots" ] } \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/armors/chestplate.json b/src/generated/resources/data/forge/tags/items/armors/chestplate.json new file mode 100644 index 0000000000..706bfa2f56 --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/armors/chestplate.json @@ -0,0 +1,5 @@ +{ + "values": [ + "create:cardboard_chestplate" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/armors/helmet.json b/src/generated/resources/data/forge/tags/items/armors/helmet.json new file mode 100644 index 0000000000..9217784ddc --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/armors/helmet.json @@ -0,0 +1,5 @@ +{ + "values": [ + "create:cardboard_helmet" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/armors/leggings.json b/src/generated/resources/data/forge/tags/items/armors/leggings.json new file mode 100644 index 0000000000..551ee16974 --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/armors/leggings.json @@ -0,0 +1,5 @@ +{ + "values": [ + "create:cardboard_leggings" + ] +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllItems.java b/src/main/java/com/simibubi/create/AllItems.java index 30ea93b020..521e21ea92 100644 --- a/src/main/java/com/simibubi/create/AllItems.java +++ b/src/main/java/com/simibubi/create/AllItems.java @@ -24,6 +24,7 @@ import com.simibubi.create.content.equipment.TreeFertilizerItem; import com.simibubi.create.content.equipment.armor.AllArmorMaterials; import com.simibubi.create.content.equipment.armor.BacktankItem; import com.simibubi.create.content.equipment.armor.BacktankItem.BacktankBlockItem; +import com.simibubi.create.content.equipment.armor.BaseArmorItem; import com.simibubi.create.content.equipment.armor.DivingBootsItem; import com.simibubi.create.content.equipment.armor.DivingHelmetItem; import com.simibubi.create.content.equipment.blueprint.BlueprintItem; @@ -65,6 +66,7 @@ import com.tterrag.registrate.util.entry.ItemEntry; import net.minecraft.tags.ItemTags; import net.minecraft.tags.TagKey; import net.minecraft.world.food.FoodProperties; +import net.minecraft.world.item.ArmorItem; import net.minecraft.world.item.ArmorMaterials; import net.minecraft.world.item.Item; import net.minecraft.world.item.Rarity; @@ -146,6 +148,7 @@ public class AllItems { public static final ItemEntry CARDBOARD_SWORD = REGISTRATE.item("cardboard_sword", CardboardSwordItem::new) .properties(p -> p.stacksTo(1)) + .model(AssetLookup.itemModelWithPartials()) .register(); public static final ItemEntry RAW_ZINC = @@ -310,6 +313,37 @@ public class AllItems { .tag(forgeItemTag("armors/boots")) .register(); + public static final ItemEntry + + CARDBOARD_HELMET = + REGISTRATE + .item("cardboard_helmet", + p -> new BaseArmorItem(AllArmorMaterials.CARDBOARD, ArmorItem.Type.HELMET, p, + Create.asResource("cardboard"))) + .tag(forgeItemTag("armors/helmet")) + .register(), + + CARDBOARD_CHESTPLATE = REGISTRATE + .item("cardboard_chestplate", + p -> new BaseArmorItem(AllArmorMaterials.CARDBOARD, ArmorItem.Type.CHESTPLATE, p, + Create.asResource("cardboard"))) + .tag(forgeItemTag("armors/chestplate")) + .register(), + + CARDBOARD_LEGGINGS = REGISTRATE + .item("cardboard_leggings", + p -> new BaseArmorItem(AllArmorMaterials.CARDBOARD, ArmorItem.Type.LEGGINGS, p, + Create.asResource("cardboard"))) + .tag(forgeItemTag("armors/leggings")) + .register(), + + CARDBOARD_BOOTS = REGISTRATE + .item("cardboard_boots", + p -> new BaseArmorItem(AllArmorMaterials.CARDBOARD, ArmorItem.Type.BOOTS, p, + Create.asResource("cardboard"))) + .tag(forgeItemTag("armors/boots")) + .register(); + public static final ItemEntry SAND_PAPER = REGISTRATE.item("sand_paper", SandPaperItem::new) .tag(AllTags.AllItemTags.SANDPAPER.tag) .register(); diff --git a/src/main/java/com/simibubi/create/content/equipment/armor/AllArmorMaterials.java b/src/main/java/com/simibubi/create/content/equipment/armor/AllArmorMaterials.java index eeaf24a7c8..6cee82fd59 100644 --- a/src/main/java/com/simibubi/create/content/equipment/armor/AllArmorMaterials.java +++ b/src/main/java/com/simibubi/create/content/equipment/armor/AllArmorMaterials.java @@ -1,20 +1,27 @@ package com.simibubi.create.content.equipment.armor; +import java.util.function.Supplier; + import com.google.common.base.Suppliers; +import com.simibubi.create.AllItems; import com.simibubi.create.AllSoundEvents; import com.simibubi.create.Create; + import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; import net.minecraft.world.item.ArmorItem.Type; import net.minecraft.world.item.ArmorMaterial; import net.minecraft.world.item.Items; import net.minecraft.world.item.crafting.Ingredient; -import java.util.function.Supplier; - public enum AllArmorMaterials implements ArmorMaterial { COPPER(Create.asResource("copper").toString(), 7, new int[] { 2, 4, 3, 1 }, 25, () -> AllSoundEvents.COPPER_ARMOR_EQUIP.getMainEvent(), 0.0F, 0.0F, - () -> Ingredient.of(Items.COPPER_INGOT)) + () -> Ingredient.of(Items.COPPER_INGOT)), + + CARDBOARD(Create.asResource("cardboard") + .toString(), 7, new int[] { 1, 1, 1, 1 }, 25, () -> SoundEvents.ARMOR_EQUIP_LEATHER, 0.0F, 0.0F, + () -> Ingredient.of(AllItems.CARDBOARD)) ; diff --git a/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorHandler.java b/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorHandler.java new file mode 100644 index 0000000000..2e08217f73 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorHandler.java @@ -0,0 +1,52 @@ +package com.simibubi.create.content.equipment.armor; + +import com.simibubi.create.AllItems; + +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.Pose; +import net.minecraftforge.event.entity.living.LivingEvent.LivingTickEvent; +import net.minecraftforge.event.entity.living.LivingEvent.LivingVisibilityEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod.EventBusSubscriber; + +@EventBusSubscriber +public class CardboardArmorHandler { + + @SubscribeEvent + public static void playersStealthWhenWearingCardboard(LivingVisibilityEvent event) { + LivingEntity entity = event.getEntity(); + if (!testForStealth(entity)) + return; + event.modifyVisibility(0); + } + + @SubscribeEvent + public static void mobsLoseTargetWhenItsWearingCardboard(LivingTickEvent event) { + LivingEntity entity = event.getEntity(); + if (entity.tickCount % 16 != 0) + return; + if (!(entity instanceof Mob mob)) + return; + LivingEntity target = mob.getTarget(); + if (target == null || !testForStealth(target)) + return; + mob.setTarget(null); + } + + public static boolean testForStealth(LivingEntity entity) { + if (entity.getPose() != Pose.CROUCHING) + return false; + if (!AllItems.CARDBOARD_HELMET.isIn(entity.getItemBySlot(EquipmentSlot.HEAD))) + return false; + if (!AllItems.CARDBOARD_CHESTPLATE.isIn(entity.getItemBySlot(EquipmentSlot.CHEST))) + return false; + if (!AllItems.CARDBOARD_LEGGINGS.isIn(entity.getItemBySlot(EquipmentSlot.LEGS))) + return false; + if (!AllItems.CARDBOARD_BOOTS.isIn(entity.getItemBySlot(EquipmentSlot.FEET))) + return false; + return true; + } + +} diff --git a/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorHandlerClient.java b/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorHandlerClient.java new file mode 100644 index 0000000000..0a722f535e --- /dev/null +++ b/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorHandlerClient.java @@ -0,0 +1,47 @@ +package com.simibubi.create.content.equipment.armor; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.AllItems; +import com.simibubi.create.AllPartialModels; +import com.simibubi.create.content.logistics.box.PackageRenderer; + +import net.createmod.catnip.utility.AnimationTickHolder; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.client.event.RenderPlayerEvent; +import net.minecraftforge.eventbus.api.EventPriority; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod.EventBusSubscriber; +import net.minecraftforge.registries.ForgeRegistries; + +@EventBusSubscriber(value = Dist.CLIENT) +public class CardboardArmorHandlerClient { + + @SubscribeEvent(priority = EventPriority.HIGH) + public static void playerRendersAsBoxWhenSneaking(RenderPlayerEvent.Pre event) { + Player player = event.getEntity(); + if (!CardboardArmorHandler.testForStealth(player)) + return; + + event.setCanceled(true); + + PoseStack ms = event.getPoseStack(); + ms.pushPose(); + ms.translate(0, 2 / 16f, 0); + + float movement = (float) player.position() + .subtract(player.xo, player.yo, player.zo) + .length(); + + if (player.onGround()) + ms.translate(0, + Math.min(Math.abs(Mth.cos((AnimationTickHolder.getRenderTime() % 256) / 2.0f)) * 2 / 16f, movement * 5), + 0); + + PackageRenderer.renderBox(player, -player.getYRot(), ms, event.getMultiBufferSource(), event.getPackedLight(), + AllPartialModels.PACKAGES.get(ForgeRegistries.ITEMS.getKey(AllItems.CARDBOARD_PACKAGE_10x12.get()))); + ms.popPose(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/equipment/tool/CardboardSwordItem.java b/src/main/java/com/simibubi/create/content/equipment/tool/CardboardSwordItem.java index 8a52aa417c..f526651c04 100644 --- a/src/main/java/com/simibubi/create/content/equipment/tool/CardboardSwordItem.java +++ b/src/main/java/com/simibubi/create/content/equipment/tool/CardboardSwordItem.java @@ -1,6 +1,7 @@ package com.simibubi.create.content.equipment.tool; import java.util.UUID; +import java.util.function.Consumer; import org.jetbrains.annotations.NotNull; @@ -8,6 +9,7 @@ import com.google.common.collect.ImmutableMultimap; import com.google.common.collect.Multimap; import com.simibubi.create.AllItems; import com.simibubi.create.AllSoundEvents; +import com.simibubi.create.foundation.item.render.SimpleCustomRenderer; import net.minecraft.util.Mth; import net.minecraft.world.InteractionHand; @@ -28,6 +30,9 @@ import net.minecraft.world.item.SwordItem; import net.minecraft.world.item.enchantment.Enchantment; import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.client.extensions.common.IClientItemExtensions; import net.minecraftforge.event.entity.living.LivingAttackEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; @@ -125,5 +130,11 @@ public class CardboardSwordItem extends SwordItem { .multiply(0.6D, 1.0D, 0.6D)); livingAttacker.setSprinting(false); } + + @Override + @OnlyIn(Dist.CLIENT) + public void initializeClient(Consumer consumer) { + consumer.accept(SimpleCustomRenderer.create(this, new CardboardSwordItemRenderer())); + } } diff --git a/src/main/java/com/simibubi/create/content/equipment/tool/CardboardSwordItemRenderer.java b/src/main/java/com/simibubi/create/content/equipment/tool/CardboardSwordItemRenderer.java new file mode 100644 index 0000000000..85ab0fba12 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/equipment/tool/CardboardSwordItemRenderer.java @@ -0,0 +1,24 @@ +package com.simibubi.create.content.equipment.tool; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.Create; +import com.simibubi.create.foundation.item.render.CustomRenderedItemModel; +import com.simibubi.create.foundation.item.render.CustomRenderedItemModelRenderer; +import com.simibubi.create.foundation.item.render.PartialItemModelRenderer; + +import dev.engine_room.flywheel.lib.model.baked.PartialModel; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; + +public class CardboardSwordItemRenderer extends CustomRenderedItemModelRenderer { + + protected static final PartialModel HELD = PartialModel.of(Create.asResource("item/cardboard_sword/item_in_hand")); + + @Override + protected void render(ItemStack stack, CustomRenderedItemModel model, PartialItemModelRenderer renderer, + ItemDisplayContext transformType, PoseStack ms, MultiBufferSource buffer, int light, int overlay) { + renderer.render(transformType == ItemDisplayContext.GUI ? model.getOriginalModel() : HELD.get(), light); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageRenderer.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageRenderer.java index 0fe587ad1e..919ca4575d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageRenderer.java @@ -13,6 +13,7 @@ import net.minecraft.client.renderer.entity.EntityRenderer; import net.minecraft.client.renderer.entity.EntityRendererProvider.Context; import net.minecraft.core.Direction; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.Entity; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Blocks; import net.minecraftforge.registries.ForgeRegistries; @@ -29,13 +30,18 @@ public class PackageRenderer extends EntityRenderer { if (box.isEmpty() || !PackageItem.isPackage(box)) box = PackageItem.getFallbackBox(); PartialModel model = AllPartialModels.PACKAGES.get(ForgeRegistries.ITEMS.getKey(box.getItem())); + renderBox(entity, yaw, ms, buffer, light, model); + super.render(entity, yaw, pt, ms, buffer, light); + } + + public static void renderBox(Entity entity, float yaw, PoseStack ms, MultiBufferSource buffer, int light, + PartialModel model) { SuperByteBuffer sbb = CachedBuffers.partial(model, Blocks.AIR.defaultBlockState()); sbb.translate(-.5, 0, -.5) .rotateCentered(AngleHelper.rad(yaw), Direction.UP) .light(light) .nudge(entity.getId()); sbb.renderInto(ms, buffer.getBuffer(RenderType.solid())); - super.render(entity, yaw, pt, ms, buffer, light); } @Override diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/MixingRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/MixingRecipeGen.java index 7ed09fc23a..980fa79658 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/MixingRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/MixingRecipeGen.java @@ -73,9 +73,6 @@ public class MixingRecipeGen extends ProcessingRecipeGen { .require(Items.PAPER) .require(Items.PAPER) .require(Items.PAPER) - .require(Items.PAPER) - .require(Items.PAPER) - .require(Items.PAPER) .require(Fluids.WATER, 1000) .output(AllItems.CARDBOARD_PULP, 1)), diff --git a/src/main/resources/assets/create/models/item/cardboard_sword/item.json b/src/main/resources/assets/create/models/item/cardboard_sword/item.json new file mode 100644 index 0000000000..fc5ccc5ad0 --- /dev/null +++ b/src/main/resources/assets/create/models/item/cardboard_sword/item.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/cardboard_sword" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/cardboard_sword/item_in_hand.json b/src/main/resources/assets/create/models/item/cardboard_sword/item_in_hand.json new file mode 100644 index 0000000000..b627c875e1 --- /dev/null +++ b/src/main/resources/assets/create/models/item/cardboard_sword/item_in_hand.json @@ -0,0 +1,67 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "2": "create:item/cardboard_sword_in_hand", + "particle": "create:item/cardboard_sword_in_hand" + }, + "elements": [ + { + "from": [6, -8, 6], + "to": [10, 8, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 6]}, + "faces": { + "north": {"uv": [5, 0, 9, 16], "texture": "#2"}, + "east": {"uv": [9, 0, 5, 16], "texture": "#2"}, + "south": {"uv": [5, 0, 9, 16], "texture": "#2"}, + "west": {"uv": [9, 0, 5, 16], "texture": "#2"}, + "down": {"uv": [10, 0, 14, 4], "texture": "#2"} + } + }, + { + "from": [6, 8, 6], + "to": [10, 24, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 6]}, + "faces": { + "north": {"uv": [0, 0, 4, 16], "texture": "#2"}, + "east": {"uv": [4, 0, 0, 16], "texture": "#2"}, + "south": {"uv": [0, 0, 4, 16], "texture": "#2"}, + "west": {"uv": [4, 0, 0, 16], "texture": "#2"}, + "up": {"uv": [10, 0, 14, 4], "rotation": 90, "texture": "#2"} + } + } + ], + "gui_light": "front", + "display": { + "thirdperson_righthand": { + "rotation": [0, 60, 0], + "translation": [11, 17, -2] + }, + "thirdperson_lefthand": { + "rotation": [0, 60, 0], + "translation": [3, 17, 12] + }, + "firstperson_righthand": { + "rotation": [13, -90, 11], + "translation": [-3, 13, 6] + }, + "firstperson_lefthand": { + "rotation": [0, 90, -25], + "translation": [13, 17, 1] + }, + "ground": { + "translation": [4, 4, 2], + "scale": [0.25, 0.25, 0.25] + }, + "gui": { + "rotation": [15, -25, -5], + "translation": [2, 3, 0], + "scale": [0.65, 0.65, 0.65] + }, + "fixed": { + "rotation": [0, 180, 0], + "translation": [-2, 4, -5], + "scale": [0.5, 0.5, 0.5] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/item/cardboard_boots.png b/src/main/resources/assets/create/textures/item/cardboard_boots.png new file mode 100644 index 0000000000000000000000000000000000000000..165dcf18b9c20ba962f402e2a54ef74ed14324d7 GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G|^0G|-omL%)<$7ctbi9X!fyJJE!PlBSEK+1T|HeKLo|YWPdExOC~z=282$Y}oq6uEjoyU;5l5!_GyM1@ zlE8C&`$3xpU6l&i%=rhVJ@{JWytd`R9TsEJ#!M}pCT;zW2*EVwCm&C)v;!K*;OXk; Jvd$@?2>^UoNhJUP literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/item/cardboard_chestplate.png b/src/main/resources/assets/create/textures/item/cardboard_chestplate.png new file mode 100644 index 0000000000000000000000000000000000000000..350215e6305a013ded86ea6f1f653228d7c7bf69 GIT binary patch literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}f0G|-omL%)<$7es>*?VbK!;T5bL1v;r8GYfYIzWoOB*-uLKNv7bc{95K zg*Xd5B8wRq_zr_GG=v-Voe`k85?LF9$Hd*ViO kVm3VC{!_Uq??%b}Uq#G6{^m~K0kns~)78&qol`;+04>N=YybcN literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/item/cardboard_helmet.png b/src/main/resources/assets/create/textures/item/cardboard_helmet.png new file mode 100644 index 0000000000000000000000000000000000000000..9d9fdb5003670c3ffe6432eac801ada35ed0d0f2 GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}f0G|-omL%&SGtu|QXFuH8yJJG~rBw|;nY-p3{XmMnB*-uLKNv7bc{95K zg*Xd5B8wRq_zr_GNS%G}f0G|-omL%&SGtu|QXFuH8yJJG~rBw|;nY-p3{XmMnB*-uLKNv7bc{95K zg*Xd5B8wRq_zr_G)i1@;BpDxBRV~ zpX|{G8LK6}JKlWYQ!~LmgyVo-!TC;Ui__hF2RXm8{bR^tY;)MFP#hI-DdC)WP&iA0 Ty@ZV@&|n5nS3j3^P6NS%G|s0G|-o%d6`T&di;e?_3*cyrLmE&`NnzPYO^nW$g`+8jg}6zu^B6z;Lg5 zZzNERv%n*=n1O-sFbFdq&tCyjZ|>>h7@`rJoRE-`l$M^7keI~2xk06aS1}@TW&q2K yh)BsmmKif8Bm-C!5+-nONaSd!Nn{1`?E`#5TraP#zq6&iHqv-zzVoqpg=dyjtY`>cSmC|6+V9EHMfVTRKeJ)t zmF?4?pILWsX72T!GtaN6+0>H~W+l02N*2(J)QpuYfs|-TkYDhBEPz4#X6-AW0?q=D z$YKTtzC$3)D5~Mr0CZfBr;B5Vhxgi$?n%uGJUp&7ae=q~{oj61t>p!;^Xtm(e5waG zxJ=UBEAoV;p!?)a*jgPFG67O(IRaJO@c~B1q)_xR?I43oOJ%mHG=w*so^keNQ!nqEui;k>0vBqng={~0LBl7L* m=Cl3df8rv&t4?VBb@QIGlFJjNYcB#Li^0>?&t;ucLK6U%AQK$` literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/models/armor/cardboard_layer_2.png b/src/main/resources/assets/create/textures/models/armor/cardboard_layer_2.png new file mode 100644 index 0000000000000000000000000000000000000000..dc9eb71e8b424aab3c531cdb710522e76285af24 GIT binary patch literal 278 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3-p)I`?e@QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`g#vs+Tx%nZXXZPvXb4_d;k~%p4=7wBFMke5v6Te*1^)*DhRyqz><5Z) z7I;J!GcfQS24TkI`72U@g4Lcbjv*f2ZznzEI-tPOvUkh(`lm}RSL~GE`mg6jGqdHF zQyrg_)E}^Ds3**4VDd;kr()JJWr0!pB&h>TQ!OX2Szo|k&#PE)bN|HOhXt1Km=)E} zuxEMmoh?-7(4DLI&ayxhX8>mS%IkjXO7$a>G;vi?obu3Nw5pVTngb|~LIV)2g& P=nMu=S3j3^P6 Date: Wed, 16 Oct 2024 12:13:16 +0200 Subject: [PATCH 078/515] Even stealthier - Fixed a couple of issues with mob AI and cardboard armor - Sound and texture tweaks --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 6 +-- .../c24b4d2b8d15abff51c78bd94f4403d9eae6c139 | 4 +- .../resources/assets/create/lang/en_ud.json | 1 + .../resources/assets/create/lang/en_us.json | 1 + .../resources/assets/create/sounds.json | 17 ++++++++ .../com/simibubi/create/AllSoundEvents.java | 6 +++ .../equipment/armor/AllArmorMaterials.java | 2 +- .../armor/CardboardArmorHandler.java | 37 +++++++++++++++--- .../armor/CardboardArmorHandlerClient.java | 3 +- .../equipment/tool/CardboardSwordItem.java | 29 -------------- .../ChainConveyorBlockEntity.java | 1 + .../content/logistics/box/PackageEntity.java | 18 +++++++-- .../logistics/box/PackageRenderer.java | 1 + .../create/textures/gui/threshold_switch.png | Bin 1555 -> 1494 bytes .../models/armor/cardboard_layer_1.png | Bin 611 -> 563 bytes 15 files changed, 80 insertions(+), 46 deletions(-) diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 880084bcf1..ca7d04a551 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-10-15T23:01:25.2230224 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-10-16T10:36:50.6126632 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -609,8 +609,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -2fa2f9f6b521cc5012a6aa497c7991b2e67ee170 assets/create/lang/en_ud.json -3f4bc5c6c5ecde34d3e6c121ea7f6706e5b90563 assets/create/lang/en_us.json +bb133028f134e0cf078a08fb468a6005f7d46c76 assets/create/lang/en_ud.json +119508739932781e5166384ab3ecdc82dd01760e assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json diff --git a/src/generated/resources/.cache/c24b4d2b8d15abff51c78bd94f4403d9eae6c139 b/src/generated/resources/.cache/c24b4d2b8d15abff51c78bd94f4403d9eae6c139 index d6a396f9a3..91d451aa5c 100644 --- a/src/generated/resources/.cache/c24b4d2b8d15abff51c78bd94f4403d9eae6c139 +++ b/src/generated/resources/.cache/c24b4d2b8d15abff51c78bd94f4403d9eae6c139 @@ -1,2 +1,2 @@ -// 1.20.1 2024-10-15T12:45:53.6394085 Create's Custom Sounds -aab9aed51d861cbd3ae7e421859ced9f6bf22c4d assets/create/sounds.json +// 1.20.1 2024-10-16T10:36:50.6106407 Create's Custom Sounds +c46cacfd6c383d9195b9d1104c7ed543e184cad9 assets/create/sounds.json diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index a3265fc689..98c8980107 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -2563,6 +2563,7 @@ "create.subtitle.mechanical_press_activation": "sbuɐןɔ ssǝɹԀ ןɐɔıuɐɥɔǝW", "create.subtitle.mechanical_press_activation_belt": "sʞuoq ssǝɹԀ ןɐɔıuɐɥɔǝW", "create.subtitle.mixing": "sǝsıou buıxıW", + "create.subtitle.package_pop": "sʞɐǝɹq ǝbɐʞɔɐԀ", "create.subtitle.peculiar_bell_use": "sןןoʇ ןןǝᗺ ɹɐıןnɔǝԀ", "create.subtitle.potato_hit": "sʇɔɐdɯı ǝןqɐʇǝbǝΛ", "create.subtitle.sanding_long": "sǝsıou buıpuɐS", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index f8f25a8a32..a92661ef16 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -2563,6 +2563,7 @@ "create.subtitle.mechanical_press_activation": "Mechanical Press clangs", "create.subtitle.mechanical_press_activation_belt": "Mechanical Press bonks", "create.subtitle.mixing": "Mixing noises", + "create.subtitle.package_pop": "Package breaks", "create.subtitle.peculiar_bell_use": "Peculiar Bell tolls", "create.subtitle.potato_hit": "Vegetable impacts", "create.subtitle.sanding_long": "Sanding noises", diff --git a/src/generated/resources/assets/create/sounds.json b/src/generated/resources/assets/create/sounds.json index ac2ba8c13e..b5260d82ce 100644 --- a/src/generated/resources/assets/create/sounds.json +++ b/src/generated/resources/assets/create/sounds.json @@ -328,6 +328,23 @@ } ] }, + "package_pop": { + "sounds": [ + { + "type": "event", + "name": "minecraft:entity.armor_stand.break" + } + ], + "subtitle": "create.subtitle.package_pop" + }, + "package_pop_compounded_1": { + "sounds": [ + { + "type": "event", + "name": "minecraft:block.wool.break" + } + ] + }, "peculiar_bell_use": { "sounds": [ { diff --git a/src/main/java/com/simibubi/create/AllSoundEvents.java b/src/main/java/com/simibubi/create/AllSoundEvents.java index 758407b6b5..a553e2cb23 100644 --- a/src/main/java/com/simibubi/create/AllSoundEvents.java +++ b/src/main/java/com/simibubi/create/AllSoundEvents.java @@ -160,6 +160,12 @@ public class AllSoundEvents { .playExisting(SoundEvents.NETHERITE_BLOCK_HIT, .25f, .75f) .category(SoundSource.BLOCKS) .build(), + + PACKAGE_POP = create("package_pop").subtitle("Package breaks") + .playExisting(SoundEvents.ARMOR_STAND_BREAK, .25f, .75f) + .playExisting(SoundEvents.WOOL_BREAK, .5f, 1.15f) + .category(SoundSource.BLOCKS) + .build(), CRAFTER_CLICK = create("crafter_click").subtitle("Crafter clicks") .playExisting(SoundEvents.NETHERITE_BLOCK_HIT, .25f, 1) diff --git a/src/main/java/com/simibubi/create/content/equipment/armor/AllArmorMaterials.java b/src/main/java/com/simibubi/create/content/equipment/armor/AllArmorMaterials.java index 6cee82fd59..7a2f67020f 100644 --- a/src/main/java/com/simibubi/create/content/equipment/armor/AllArmorMaterials.java +++ b/src/main/java/com/simibubi/create/content/equipment/armor/AllArmorMaterials.java @@ -20,7 +20,7 @@ public enum AllArmorMaterials implements ArmorMaterial { () -> Ingredient.of(Items.COPPER_INGOT)), CARDBOARD(Create.asResource("cardboard") - .toString(), 7, new int[] { 1, 1, 1, 1 }, 25, () -> SoundEvents.ARMOR_EQUIP_LEATHER, 0.0F, 0.0F, + .toString(), 4, new int[] { 1, 1, 1, 1 }, 25, () -> SoundEvents.ARMOR_EQUIP_LEATHER, 0.0F, 0.0F, () -> Ingredient.of(AllItems.CARDBOARD)) ; diff --git a/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorHandler.java b/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorHandler.java index 2e08217f73..8f218b44a2 100644 --- a/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorHandler.java +++ b/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorHandler.java @@ -1,11 +1,17 @@ package com.simibubi.create.content.equipment.armor; +import java.util.UUID; + import com.simibubi.create.AllItems; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.NeutralMob; import net.minecraft.world.entity.Pose; +import net.minecraft.world.entity.ai.goal.target.TargetGoal; import net.minecraftforge.event.entity.living.LivingEvent.LivingTickEvent; import net.minecraftforge.event.entity.living.LivingEvent.LivingVisibilityEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; @@ -23,19 +29,38 @@ public class CardboardArmorHandler { } @SubscribeEvent - public static void mobsLoseTargetWhenItsWearingCardboard(LivingTickEvent event) { + public static void mobsMayLoseTargetWhenItIsWearingCardboard(LivingTickEvent event) { LivingEntity entity = event.getEntity(); if (entity.tickCount % 16 != 0) return; if (!(entity instanceof Mob mob)) return; - LivingEntity target = mob.getTarget(); - if (target == null || !testForStealth(target)) - return; - mob.setTarget(null); + + if (testForStealth(mob.getTarget())) { + mob.setTarget(null); + if (mob.targetSelector != null) + mob.targetSelector.getRunningGoals() + .forEach(wrappedGoal -> { + if (wrappedGoal.getGoal() instanceof TargetGoal tg) + tg.stop(); + }); + } + + if (entity instanceof NeutralMob nMob && entity.level() instanceof ServerLevel sl) { + UUID uuid = nMob.getPersistentAngerTarget(); + if (uuid != null && testForStealth(sl.getEntity(uuid))) + nMob.stopBeingAngry(); + } + + if (testForStealth(mob.getLastHurtByMob())) { + mob.setLastHurtByMob(null); + mob.setLastHurtByPlayer(null); + } } - public static boolean testForStealth(LivingEntity entity) { + public static boolean testForStealth(Entity entityIn) { + if (!(entityIn instanceof LivingEntity entity)) + return false; if (entity.getPose() != Pose.CROUCHING) return false; if (!AllItems.CARDBOARD_HELMET.isIn(entity.getItemBySlot(EquipmentSlot.HEAD))) diff --git a/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorHandlerClient.java b/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorHandlerClient.java index 0a722f535e..9ae57498f8 100644 --- a/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorHandlerClient.java +++ b/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorHandlerClient.java @@ -39,7 +39,8 @@ public class CardboardArmorHandlerClient { Math.min(Math.abs(Mth.cos((AnimationTickHolder.getRenderTime() % 256) / 2.0f)) * 2 / 16f, movement * 5), 0); - PackageRenderer.renderBox(player, -player.getYRot(), ms, event.getMultiBufferSource(), event.getPackedLight(), + float f = Mth.lerp(event.getPartialTick(), player.yRotO, player.getYRot()); + PackageRenderer.renderBox(player, -f + -90, ms, event.getMultiBufferSource(), event.getPackedLight(), AllPartialModels.PACKAGES.get(ForgeRegistries.ITEMS.getKey(AllItems.CARDBOARD_PACKAGE_10x12.get()))); ms.popPose(); } diff --git a/src/main/java/com/simibubi/create/content/equipment/tool/CardboardSwordItem.java b/src/main/java/com/simibubi/create/content/equipment/tool/CardboardSwordItem.java index f526651c04..2a74ad9353 100644 --- a/src/main/java/com/simibubi/create/content/equipment/tool/CardboardSwordItem.java +++ b/src/main/java/com/simibubi/create/content/equipment/tool/CardboardSwordItem.java @@ -1,12 +1,9 @@ package com.simibubi.create.content.equipment.tool; -import java.util.UUID; import java.util.function.Consumer; import org.jetbrains.annotations.NotNull; -import com.google.common.collect.ImmutableMultimap; -import com.google.common.collect.Multimap; import com.simibubi.create.AllItems; import com.simibubi.create.AllSoundEvents; import com.simibubi.create.foundation.item.render.SimpleCustomRenderer; @@ -16,11 +13,8 @@ import net.minecraft.world.InteractionHand; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.effect.MobEffects; import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.MobCategory; -import net.minecraft.world.entity.ai.attributes.Attribute; -import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.monster.Spider; import net.minecraft.world.entity.player.Player; @@ -40,31 +34,8 @@ import net.minecraftforge.fml.common.Mod.EventBusSubscriber; @EventBusSubscriber public class CardboardSwordItem extends SwordItem { - private ImmutableMultimap cardboardModifiers; - public CardboardSwordItem(Properties pProperties) { super(AllToolMaterials.CARDBOARD, 3, 1f, pProperties); - - float attackDamage = 3f + AllToolMaterials.CARDBOARD.getAttackDamageBonus(); - ImmutableMultimap.Builder builder = ImmutableMultimap.builder(); - builder.put(Attributes.ATTACK_DAMAGE, new AttributeModifier(BASE_ATTACK_DAMAGE_UUID, "Weapon modifier", - attackDamage, AttributeModifier.Operation.ADDITION)); - builder.put(Attributes.ATTACK_SPEED, - new AttributeModifier(BASE_ATTACK_SPEED_UUID, "Weapon modifier", 1f, AttributeModifier.Operation.ADDITION)); - - // Setting knockback to 0 prevents the aggressive punching sound - // Knockback strength is reapplied in the event handler below - builder.put(Attributes.ATTACK_KNOCKBACK, - new AttributeModifier(UUID.fromString("45227E1C-A180-4865-B01B-BCCE9785ACA3"), "Weapon modifier", 0f, - AttributeModifier.Operation.MULTIPLY_TOTAL)); - - cardboardModifiers = builder.build(); - } - - @Override - public Multimap getDefaultAttributeModifiers(EquipmentSlot pEquipmentSlot) { - return pEquipmentSlot == EquipmentSlot.MAINHAND ? cardboardModifiers - : super.getDefaultAttributeModifiers(pEquipmentSlot); } @Override diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java index 472a066508..42aed44ecb 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java @@ -390,6 +390,7 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity { if (travelTarget == null) return Vec3.atBottomCenterOf(worldPosition) .add(VecHelper.rotate(new Vec3(0, 6 / 16f, 0.875), chainPosition, Axis.Y)); + prepareStats(); ConnectionStats stats = connectionStats.get(travelTarget); if (stats == null) return Vec3.ZERO; diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java index 9b0a6ed55b..77ca170222 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java @@ -7,6 +7,7 @@ import javax.annotation.Nullable; import com.simibubi.create.AllEntityTypes; import com.simibubi.create.AllPackets; +import com.simibubi.create.AllSoundEvents; import com.simibubi.create.content.logistics.chute.ChuteBlock; import net.createmod.catnip.utility.VecHelper; @@ -345,8 +346,7 @@ public class PackageEntity extends LivingEntity implements IEntityAdditionalSpaw AllPackets.getChannel() .send(PacketDistributor.TRACKING_ENTITY.with(() -> this), new PackageDestroyPacket(getBoundingBox().getCenter(), box)); - level().playSound((Player) null, getX(), getY(), getZ(), SoundEvents.ARMOR_STAND_BREAK, this.getSoundSource(), - 1.0F, 1.0F); + AllSoundEvents.PACKAGE_POP.playOnServer(level(), blockPosition()); this.dropAllDeathLoot(source); } @@ -425,7 +425,17 @@ public class PackageEntity extends LivingEntity implements IEntityAdditionalSpaw } protected SoundEvent getFallSound(int heightIn) { - return SoundEvents.ARMOR_STAND_FALL; + return SoundEvents.WOOL_HIT; + } + + @Override + public float getVoicePitch() { + return 1.5f; + } + + @Override + public Fallsounds getFallSounds() { + return new LivingEntity.Fallsounds(SoundEvents.WOOL_FALL, SoundEvents.WOOL_FALL); } @Nullable @@ -435,7 +445,7 @@ public class PackageEntity extends LivingEntity implements IEntityAdditionalSpaw @Nullable protected SoundEvent getDeathSound() { - return SoundEvents.ARMOR_STAND_BREAK; + return null; } } diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageRenderer.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageRenderer.java index 919ca4575d..adfd933622 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageRenderer.java @@ -22,6 +22,7 @@ public class PackageRenderer extends EntityRenderer { public PackageRenderer(Context pContext) { super(pContext); + shadowRadius = 0.5f; } @Override diff --git a/src/main/resources/assets/create/textures/gui/threshold_switch.png b/src/main/resources/assets/create/textures/gui/threshold_switch.png index 62b6b47b9324d42b21d7ae65dd8650dd459a66ac..439b56c4d5feaed958c5278fb05461d48c8380b0 100644 GIT binary patch delta 1342 zcmb`HYfO_@7{|}4ZS|#GYC*u&O9kXMgjU6h5P2I3 z2+>YKTFO|X6YCVC$mA8YL@|o8(n^scMr2i>f}2*bUAryW$9-9HzMTL6Ise~to}8R2 z$6i`Rj=x&1PEAeC%*^C+xkE!kB9Ta^d#2Orv|4RLLxV!0000R^H11{C& zm(?H6%r1!5r0D=P-t;XT{_81^Wf#<9qdc4ZUiG@efmzUU7ZF z2c1EYR&Gm?7Ux()XAdlUXh71fmSv^aA1!93pBOp40aZCZDMf@N_DD4wjw1eBW=*Zz z9px*_)`ew3xD9i1VF9D7{0jej1(8n)vC#CDE-dKl^{z# zE0)`ILYC4_j)+6MkV+L+y=GmYf8rv zyOIE0@ijk6>;T})N>?}Ap~Hd>8)&=LzZCIYiow=kQ>-pB-kzwhKwueiaft4G;(e!t^(b|QD_zLVYsT>RRJHqHeDn8M zAZtWa^JuqINs#QUU}fh_XqnH2`bl%mQ$k8wy?+u5B-*^)Ds+UBWHjFjl`kTa=1sP_ zs`R77-hrWSPKrm%%m$kOp^4wAtCk+TTR6tlbZtY$JMAhR_vm)Eza8PP z2xs_B*M5N?&mC6TMiYDDa*ewie!<-jSm{5{#5Bq$<=0tYQ zf)-Yi4EA7_Lx{3$*vD6<6H1;JZl%m)Q23viQf;8{^;0d%CuKaUYop%u&N$FNrx8f5 zd2a*fMe9^}=iXz6m*n@KOQM_bfxEftA&&r>9~x@!)ZLtdd7hbB0#;F&z@va?oSP?oL*hI%wxDiDT7v1F zB~7%o?SkzNrs8VKW+*NW>s)x852IfE%Q~)^gzq0OND12d#0Nx9go}_}=J25w^0n#3 zX08KyJoD42(@dv3({<<=nN~6dw v~{x>pHlwv5_s zvqmEpXJbf0HEYHyRLWp$u2wZgLnS6})5^;Zr~L!=oIU6H;W?kr^Y%HPf2mn#$sU%q@9A0Ln7oj8uG)#}2+!h(VV06ZJT)4JBMXvM5;39K92JiogXi% zb4(~MuiMs}?C?g>*4?fa9y>Dr(B6HE7v1C}$By;X+tYJ(>Vq`c`AupNKn$jt{3RWx zVKczbyCYCJIvnk)w@&b>!XA9v%z?b)4|Tn5C>tJ4AbO4MTijK7q3zo08Xqrh^(}T) zjUlPzT+;XrQl3jstg+|x`0t{z+yJabR21q8J#)#4DFr+*M`F%n*22}$#FRss0Eyn@ zF?U<2Lb1g$1ZsVXMMjWGB#nOOf!R=0k{wFcjaZzzB<4Z4o+_~tf+~FcRt%rH1Lffyv}CHK`f1I0ll@A9D@*GAK|O)Z*U+S9oYTCFw06uY#8pcU_JBl zr0|gsliZLtf<_K{k@Zf>#FT$qe?l<%ceQrS1l`9g3?B2YAx>#Mqiz?pwK|)u66{4P zVCTN`6>u=rKHc3@sVuR${AbKYfqC5ijBcxf#Ke3c+F)bJgz~V-EYxht!lO%ugv$=Y zIu-KQE+z;}9ud&bsB55mUlO6CrA>$HtktTYxlR{$u< z0yp)Kl~x0be&JLRDDTj{zxbHB4|4VJZW05%=rq>Q+Z(yXXdNOC8&cRSy&9~ta3&Y} zeoDC2+9d82x_sIZYU)1d1+(3g;PJ>2$xl^(yK$i8GZ(nZk-TBO@rs9vF}7+iP1E1h zZt5>V@55ElB4Q+TcQ`f#n`>Oyitd74dK5IseMmu3z36$1#0xa@?QS~Z=@Kk1^2|gz z!oVy@X`gP6Hrjjk+0E6dbeMv$C0Qsj_6D5>ICM6cvgsl22`e~wI@;6`tWDYeS_HcC z>O&jgxc;?b2^sU~SmPA+nVn{ko(sAznjs82@Y}G!4jd_3zFRpE7u|+YoINhkAT71n z&&WZ0O+?a|4Smj#YI~RMgvR#E?hx<+=RaQGE`!r3NUnBKu-ZX-2)!6ZmBCM1E`^`y zTF`DaK-dm4<81@Mz*of)P`7)1`5IVT$L^3}oww!eZb~PGjqRTq*HY?)vtBi=s$5kH za%)>#lC+5Jfy8Yjk1K}t%HSCBH=ICarWUyz+#zQYujE)|?AbaDbE=ZqRACr3jr+iq zb+srlWj)GcIFaTZIccvnl&U541+=(NSwA5M5o(&None+Ql(B~s?6paXj+VUhC2fXv z;&7V)re-kXzB%bbz|dJsZ0eCOWXX3u?mr=7Kq`tiw;-*zu?=7X4t(6iJkDsOd}*MFnt2i? z-SIK>&j+llLEv)mtZa-%AuugXk^hVK|BuyQz=6f6jx*8py7u9u;f;dLet|5R5C8Z- DYanQg diff --git a/src/main/resources/assets/create/textures/models/armor/cardboard_layer_1.png b/src/main/resources/assets/create/textures/models/armor/cardboard_layer_1.png index 1c9e2f15f5a1497626b2f992d6bd57aaacd13d7b..16cb0659836570d3c77858acfe44ef56d33d624b 100644 GIT binary patch delta 489 zcmV${OQU;E0000-B|H28000z`jTe6aPfzC&00009a7bBm z000ib000ib0l1NC?EnA)U`a$lR7gw3l#OGInUUbN2P5 zB${0Lr(K~zu(%g17@YIoyFtTl4gnJ07r2bVMZ<1PVEPay4ZAtb0Z+ky&cWNuNZwyZ z@A2&{fOx!~V$FYRLLtt#X^tU~=U+fP-6VF1UC_KH#DyW;LxSCdH2D$!76@uy6H4Tg z`bKh;a*vh{fmGE)0puZk^YSarNh(9qu*u8I_RQZ2JYsyP%RXaqfoQIFstLq-j_R_{ zSX`j+lfb$i0_(PI>-w6&uZK{;892^G67Qiw|GHCQbkM_yuc^Kev4jP-xh5!z-31nYiS2P6BX&XZJ^>syA zDl-&F(b0qKYkmdaNSc_9FPMZ9ms|5SzoLB64EI2idkuF%63f2kSMZ9&v+470aQVp> f&GdOE`~DRP1lo4BMp(*Z00000NkvXXu0mjfl!5F@ delta 557 zcmdnY@|b0UW4(QVPl)T~)%AC_wAV%&&&+o|Hm~r^l8O}#!3!(A7gzf|IlAcn!TD!4 zOuVvv`tvjE4$jQIzH{dJ6*ZfBQo^hx_e{xRU|>kiSh*5NiIxQU1^>qa7_@KJz5*)X zEbxddW?8eRfugDXYlFv=E_3B#$cdX-9EIId`Y5i&WjlvTS{7jVi_-9_iEY{0Ud8X+f zd{p?)BId+_lcIl4%l2G1+7aW%_0X=pVY4ygpPzLfOxJOC?Tep&@3=?fe2)71$fNHc zlm|YZrI0fx>|O*1)7oH#kLEw5uCs8M2{nCL@OEMggSXd?xylb5lm)g6%sHj7Tq<2= z&$&5_!6#&M(%&hZOl>`4Ja5X62YpA{Cz`C|bh>oFc z-V0T^$zR=@8FY`_{dw5V_rO8ZMlm(v1wKMNCPpW$EN<2C^NAf#*mOEaV1o>oD* zt!#|kD{GuUtROAv8w#_(@oZZAQ8eP5)C~3z4%MQUDQ3}+wWkQ@ID!My$Fmj22WQ%mvv4FO#rXI3X=c; From eb9e8ab59d6370f083d68e242c9381e7ed945d2c Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Wed, 16 Oct 2024 12:18:39 +0200 Subject: [PATCH 079/515] Bonus sprite --- .../create/textures/item/cardboard_helmet.png | Bin 219 -> 224 bytes .../create/textures/item/cardboard_leggings.png | Bin 236 -> 234 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/create/textures/item/cardboard_helmet.png b/src/main/resources/assets/create/textures/item/cardboard_helmet.png index 9d9fdb5003670c3ffe6432eac801ada35ed0d0f2..d1bdd1aecb18be7458dc8ebff9c147d7cecf99d4 100644 GIT binary patch delta 129 zcmV-{0Dk}50pJ0UOcTVGd002Bm zL_t(2Q=QB?4geqs06~!B|4%ju5}+}0%PAIg^b6qO1y~jln>f&^0+L_{=^$1C84u(r eAq!}|Ky?F)mIS-XrT1z80000NklgY+2BlkkVjMqz%Fpli5ob}iw?mF^#=X`Y5|5oy&!X1P|{$| Y7gARQa6cG46#xJL07*qoM6N<$g44n+2mk;8 From 58007c5f8860ec900ff88b3fca673cfe83331f01 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Wed, 16 Oct 2024 14:10:54 +0200 Subject: [PATCH 080/515] Compile error quick fix --- .../equipment/tool/CardboardSwordItem.java | 29 +++++++------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/equipment/tool/CardboardSwordItem.java b/src/main/java/com/simibubi/create/content/equipment/tool/CardboardSwordItem.java index 2a74ad9353..9c9e0bdbb6 100644 --- a/src/main/java/com/simibubi/create/content/equipment/tool/CardboardSwordItem.java +++ b/src/main/java/com/simibubi/create/content/equipment/tool/CardboardSwordItem.java @@ -64,7 +64,7 @@ public class CardboardSwordItem extends SwordItem { Entity attacker = event.getSource() .getEntity(); LivingEntity target = event.getEntity(); - if (target instanceof Spider) + if (target == null || target instanceof Spider) return; if (!(attacker instanceof LivingEntity livingAttacker && AllItems.CARDBOARD_SWORD.isIn(livingAttacker.getItemInHand(InteractionHand.MAIN_HAND)))) @@ -75,33 +75,26 @@ public class CardboardSwordItem extends SwordItem { // Reference player.attack() // This section replicates knockback behaviour without hurting the target - double i = livingAttacker.getAttributeValue(Attributes.ATTACK_KNOCKBACK) + 2; - i += EnchantmentHelper.getKnockbackBonus(livingAttacker); + double knockbackStrength = livingAttacker.getAttributeValue(Attributes.ATTACK_KNOCKBACK) + 2; + knockbackStrength += EnchantmentHelper.getKnockbackBonus(livingAttacker); if (livingAttacker.isSprinting() && (!(livingAttacker instanceof Player p) || p.getAttackStrengthScale(0.5f) > 0.9f)) - ++i; + ++knockbackStrength; - if (i <= 0) + if (knockbackStrength <= 0) return; - if (target instanceof LivingEntity livingTarget) { - livingTarget.knockback(i * 0.5F, Mth.sin(livingAttacker.getYRot() * Mth.DEG_TO_RAD), - -Mth.cos(livingAttacker.getYRot() * Mth.DEG_TO_RAD)); - if ((livingTarget.getClassification(false) == MobCategory.MISC - || livingTarget.getClassification(false) == MobCategory.CREATURE) && !(livingTarget instanceof Player)) - livingTarget.addEffect(new MobEffectInstance(MobEffects.MOVEMENT_SLOWDOWN, 60, 9, true, false, false)); - - } else { - event.getEntity() - .push(-Mth.sin(livingAttacker.getYRot() * Mth.DEG_TO_RAD) * i * 0.5F, 0.05D, - Mth.cos(livingAttacker.getYRot() * Mth.DEG_TO_RAD) * i * 0.5F); - } + target.knockback(knockbackStrength * 0.5F, Mth.sin(livingAttacker.getYRot() * Mth.DEG_TO_RAD), + -Mth.cos(livingAttacker.getYRot() * Mth.DEG_TO_RAD)); + if ((target.getClassification(false) == MobCategory.MISC + || target.getClassification(false) == MobCategory.CREATURE) && !(target instanceof Player)) + target.addEffect(new MobEffectInstance(MobEffects.MOVEMENT_SLOWDOWN, 60, 9, true, false, false)); livingAttacker.setDeltaMovement(livingAttacker.getDeltaMovement() .multiply(0.6D, 1.0D, 0.6D)); livingAttacker.setSprinting(false); } - + @Override @OnlyIn(Dist.CLIENT) public void initializeClient(Consumer consumer) { From 186aa54e6f4e1b40907e49dca7ab3aeab0c7d7f2 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Thu, 17 Oct 2024 19:13:11 +0200 Subject: [PATCH 081/515] Breakbeat Cardboard - Added Block of Cardboard - Stealth overlay placeholder texture - Randomize stealth box - Cardboard Sword plays sound when hitting blocks --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 17 +++-- .../82992cbf8f2794d83ac94034835eac0acd7915b9 | 6 +- .../create/blockstates/cardboard_block.json | 11 ++++ .../resources/assets/create/lang/en_ud.json | 1 + .../resources/assets/create/lang/en_us.json | 1 + .../create/models/item/cardboard_block.json | 3 + .../crafting/materials/cardboard_block.json | 35 +++++++++++ .../materials/cardboard_from_block.json | 35 +++++++++++ .../loot_tables/blocks/cardboard_block.json | 21 +++++++ .../crafting/materials/cardboard_block.json | 17 +++++ .../materials/cardboard_from_block.json | 13 ++++ .../forge/tags/blocks/storage_blocks.json | 1 + .../tags/blocks/storage_blocks/cardboard.json | 5 ++ .../data/forge/tags/items/storage_blocks.json | 1 + .../tags/items/storage_blocks/cardboard.json | 5 ++ .../minecraft/tags/blocks/mineable/axe.json | 3 +- .../java/com/simibubi/create/AllBlocks.java | 15 +++++ .../java/com/simibubi/create/AllItems.java | 3 +- .../com/simibubi/create/AllPartialModels.java | 5 +- .../content/decoration/CardboardBlock.java | 59 ++++++++++++++++++ .../armor/CardboardArmorHandlerClient.java | 47 ++++++++++++-- .../armor/CardboardArmorStealthOverlay.java | 50 +++++++++++++++ .../equipment/armor/CardboardHelmetItem.java | 25 ++++++++ .../equipment/tool/CardboardSwordItem.java | 24 +++++-- .../data/recipe/StandardRecipeGen.java | 14 ++++- .../foundation/events/ClientEvents.java | 2 + .../create/models/block/cardboard_block.json | 24 +++++++ .../textures/block/cardboard_block_front.png | Bin 0 -> 216 bytes .../textures/block/cardboard_block_side.png | Bin 0 -> 205 bytes .../textures/block/cardboard_block_top.png | Bin 0 -> 223 bytes .../create/textures/misc/package_blur.png | Bin 0 -> 12296 bytes .../textures/misc/package_blur.png.mcmeta | 6 ++ 32 files changed, 426 insertions(+), 23 deletions(-) create mode 100644 src/generated/resources/assets/create/blockstates/cardboard_block.json create mode 100644 src/generated/resources/assets/create/models/item/cardboard_block.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/materials/cardboard_block.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/materials/cardboard_from_block.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/cardboard_block.json create mode 100644 src/generated/resources/data/create/recipes/crafting/materials/cardboard_block.json create mode 100644 src/generated/resources/data/create/recipes/crafting/materials/cardboard_from_block.json create mode 100644 src/generated/resources/data/forge/tags/blocks/storage_blocks/cardboard.json create mode 100644 src/generated/resources/data/forge/tags/items/storage_blocks/cardboard.json create mode 100644 src/main/java/com/simibubi/create/content/decoration/CardboardBlock.java create mode 100644 src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorStealthOverlay.java create mode 100644 src/main/java/com/simibubi/create/content/equipment/armor/CardboardHelmetItem.java create mode 100644 src/main/resources/assets/create/models/block/cardboard_block.json create mode 100644 src/main/resources/assets/create/textures/block/cardboard_block_front.png create mode 100644 src/main/resources/assets/create/textures/block/cardboard_block_side.png create mode 100644 src/main/resources/assets/create/textures/block/cardboard_block_top.png create mode 100644 src/main/resources/assets/create/textures/misc/package_blur.png create mode 100644 src/main/resources/assets/create/textures/misc/package_blur.png.mcmeta diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index ca7d04a551..a31e8abad1 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-10-16T10:36:50.6126632 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-10-17T18:56:47.626034 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -54,6 +54,7 @@ c23d7f691bf532d6b27317c0063289a8bd747de2 assets/create/blockstates/brown_postbox 1ffc38bf682e84aad4cb300c573375eb0cdcc434 assets/create/blockstates/brown_toolbox.json 440b29e1dffa4374ddc1aed444bff18a485bc1cb assets/create/blockstates/brown_valve_handle.json 2064534de4791b339fdcd4ef3a8129a2e233ec50 assets/create/blockstates/calcite_pillar.json +6a3e661d54423af7a8d642b813deb8f5331013c5 assets/create/blockstates/cardboard_block.json 060c957b28afed9f4e0954cbef7e80cbf4b99f58 assets/create/blockstates/cart_assembler.json fab98b93ad9b78312742daca83c2575db40fce98 assets/create/blockstates/chain_conveyor.json c7eca70054241944171b1d4ffcba0376b071ec62 assets/create/blockstates/chocolate.json @@ -609,8 +610,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -bb133028f134e0cf078a08fb468a6005f7d46c76 assets/create/lang/en_ud.json -119508739932781e5166384ab3ecdc82dd01760e assets/create/lang/en_us.json +1d3a9e827cc454562c86cc8c5ee596b78cfa7a57 assets/create/lang/en_ud.json +b6619ed3dcd9146aa7a567629455ef7c01146437 assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -1768,6 +1769,7 @@ fce64539b36fc8a5ffa39d7a3f73765818437cbf assets/create/models/item/brown_seat.js 1db479848369140bb913ba09f3f1d994e4ac864c assets/create/models/item/builders_tea.json f5ff4e2ed2ea2e43b6d02f6a95ba02b2e4b611dc assets/create/models/item/calcite_pillar.json cc2692f7964f4266ecf00fcab176b1ef0b78673f assets/create/models/item/cardboard.json +607272f2b906fdffd46677d47a4e6ecb94184eff assets/create/models/item/cardboard_block.json 39eadb54cec52d9e2a087fc71ef83341688f2781 assets/create/models/item/cardboard_boots.json d6a3f139fca5ac6aff94d11d75fe239283bb4a09 assets/create/models/item/cardboard_chestplate.json 82236ea8e939c46f0d2c9142336190eca2a0425e assets/create/models/item/cardboard_helmet.json @@ -3080,6 +3082,7 @@ bfa0365507a888134c20b36af4bd7944263687f0 data/create/loot_tables/blocks/brown_po 588ae3d0da73eed3bc30cb28c583e7f8312d15bd data/create/loot_tables/blocks/brown_toolbox.json 7c7cf4c30786f6e0a699e2b3f9120343e53107f4 data/create/loot_tables/blocks/brown_valve_handle.json 06d1c478e4236210aa12b5911691868fef33bb5f data/create/loot_tables/blocks/calcite_pillar.json +3d65461b1fc2667f446aefa2853621c06068bb38 data/create/loot_tables/blocks/cardboard_block.json 515c839deea520b07b03f7ba65c4a7b22fdf5ba3 data/create/loot_tables/blocks/cart_assembler.json aadd8aa7f8433896bd4fea56f43e496cbc5be25a data/create/loot_tables/blocks/chain_conveyor.json fb4877d45df15be1a74378ab28f23fbf9d0657ef data/create/loot_tables/blocks/chute.json @@ -4351,9 +4354,10 @@ de1fc89be6a52473d526d3efe0204b9b8489058c data/forge/tags/blocks/glass_panes.json e475ad1c52bffedfc544e5331a87c1f5c45149fd data/forge/tags/blocks/ores_in_ground/deepslate.json 2f6068972e364599b6849dc46fcb0724d4219d53 data/forge/tags/blocks/ores_in_ground/stone.json 8a5988e68f3a41341b486784c29d00e16d5272f7 data/forge/tags/blocks/relocation_not_supported.json -b3af02a6fa3dc41bc3f4db933485f22b202deea3 data/forge/tags/blocks/storage_blocks.json +807ea01d3b028bd226ed0befc142cbd23647e998 data/forge/tags/blocks/storage_blocks.json 7d10cdf9e46a79753d4437c7bb958e3ab8bf0c89 data/forge/tags/blocks/storage_blocks/andesite_alloy.json 70bba470740dc7a77f51b4cb1747a105b62d4bde data/forge/tags/blocks/storage_blocks/brass.json +18f54179c6f809ff4aee792702fa35d3053e5dc4 data/forge/tags/blocks/storage_blocks/cardboard.json bcd593714f43bc6a0aefbd714c24db3cf9e71250 data/forge/tags/blocks/storage_blocks/raw_zinc.json 41b2a17b5ebcff5623e25dc6232f73cf9aa70387 data/forge/tags/blocks/storage_blocks/zinc.json 8140415f1c16f09167f41eeee25c09706a944be0 data/forge/tags/fluids/chocolate.json @@ -4393,9 +4397,10 @@ ef5256892a9d4167bf7371c7138a933a107a123a data/forge/tags/items/plates/copper.jso 07a6e69488ff6994a9ef1cca75b6e911bc3e3358 data/forge/tags/items/plates/obsidian.json 30496416fffaf4f845052a264023e64e52894ee7 data/forge/tags/items/raw_materials.json 30496416fffaf4f845052a264023e64e52894ee7 data/forge/tags/items/raw_materials/zinc.json -b3af02a6fa3dc41bc3f4db933485f22b202deea3 data/forge/tags/items/storage_blocks.json +807ea01d3b028bd226ed0befc142cbd23647e998 data/forge/tags/items/storage_blocks.json 7d10cdf9e46a79753d4437c7bb958e3ab8bf0c89 data/forge/tags/items/storage_blocks/andesite_alloy.json 70bba470740dc7a77f51b4cb1747a105b62d4bde data/forge/tags/items/storage_blocks/brass.json +18f54179c6f809ff4aee792702fa35d3053e5dc4 data/forge/tags/items/storage_blocks/cardboard.json bcd593714f43bc6a0aefbd714c24db3cf9e71250 data/forge/tags/items/storage_blocks/raw_zinc.json 41b2a17b5ebcff5623e25dc6232f73cf9aa70387 data/forge/tags/items/storage_blocks/zinc.json b69fcc7227d44fc000c8ab94524230f55b89aa27 data/forge/tags/items/stripped_logs.json @@ -4408,7 +4413,7 @@ c741ba83b562ae3459d7c4f2db69537f549ea411 data/forge/tags/items/tools/wrench.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/dripstone_replaceable_blocks.json e3321ff14704c031a2c16953b7e391f4f24dd70b data/minecraft/tags/blocks/impermeable.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/lush_ground_replaceable.json -5bfa11627f37364de2098753c85a589721cfa2af data/minecraft/tags/blocks/mineable/axe.json +f65bb63cc66aa72b5b9fa05dd88e2a69c8bf7d55 data/minecraft/tags/blocks/mineable/axe.json 1f8802b85d179bbd7f74ec37c6ffceb59eb4856c data/minecraft/tags/blocks/mineable/pickaxe.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/moss_replaceable.json 0c13aae0eeb99e89febe8dbe5e002af2ff843a9e data/minecraft/tags/blocks/needs_iron_tool.json diff --git a/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 b/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 index 9163e3154c..c0fbdb41d0 100644 --- a/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 +++ b/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 @@ -1,4 +1,4 @@ -// 1.20.1 2024-10-15T10:59:16.195561 Create's Standard Recipes +// 1.20.1 2024-10-17T18:56:47.6838794 Create's Standard Recipes a8cc4af26f6c7c45a9eef12e92af1452fe042454 data/create/advancements/recipes/combat/crafting/appliances/netherite_backtank.json 2c2639c7b307ee7c7a4e97e5efebf496788998ad data/create/advancements/recipes/combat/crafting/appliances/netherite_backtank_from_netherite.json 81dcf0cb1aa99e39bc7d1a386e07cad4cee7d8b9 data/create/advancements/recipes/combat/crafting/appliances/netherite_diving_boots.json @@ -188,6 +188,8 @@ cb416511a219d2bc5806c6880c01820a8b563b80 data/create/advancements/recipes/misc/c 8aa51bd8685a70f200506d3efd4e73ce9b2d7370 data/create/advancements/recipes/misc/crafting/materials/brass_ingot_from_compacting.json 9e703c5fa1bd44eb6581e745f06923d40126ada4 data/create/advancements/recipes/misc/crafting/materials/brass_ingot_from_decompacting.json 4cb9d1fc5289b11df4610a85aa2cd67877556b32 data/create/advancements/recipes/misc/crafting/materials/brass_nugget_from_decompacting.json +f07788c42f4c49d0b4fc7253742d95e94bd5346d data/create/advancements/recipes/misc/crafting/materials/cardboard_block.json +86439f388e88fe56d3931ab46fce5a111b2c15f4 data/create/advancements/recipes/misc/crafting/materials/cardboard_from_block.json ffcd3f0339794c782a8be8434cd79de15d0ab3cc data/create/advancements/recipes/misc/crafting/materials/copper_ingot.json 58c23978d7222951cba2bbf3020cd0c2c6f85ac9 data/create/advancements/recipes/misc/crafting/materials/copper_nugget.json d4879e7721bdbb6c7029ac88ff5684acec8223d6 data/create/advancements/recipes/misc/crafting/materials/electron_tube.json @@ -438,6 +440,8 @@ f9f94e5082e7971e55b25bc00ba86c3579b492aa data/create/recipes/crafting/materials/ ecd8581ad4a04cc1217133363bd15d76129cb651 data/create/recipes/crafting/materials/brass_ingot_from_compacting.json fe2f3c0722aa0f6b41ad0f497b9742eb856c0dd0 data/create/recipes/crafting/materials/brass_ingot_from_decompacting.json 941b2c1007c4b3afb6e141a754141de1b1c9a43a data/create/recipes/crafting/materials/brass_nugget_from_decompacting.json +4c92a1eadc2e5dfba9e871537671702ccf35368a data/create/recipes/crafting/materials/cardboard_block.json +cb1188148d18e456cecd33279aaf695787ddbf74 data/create/recipes/crafting/materials/cardboard_from_block.json d4d6664d05c7406b4f839413d4e3c60cf0347fb7 data/create/recipes/crafting/materials/copper_ingot.json 4863d3feda514d414962c1947abaa232ab3f6cd5 data/create/recipes/crafting/materials/copper_nugget.json 66c0b1d060395826c4a45082a03295b5df450801 data/create/recipes/crafting/materials/electron_tube.json diff --git a/src/generated/resources/assets/create/blockstates/cardboard_block.json b/src/generated/resources/assets/create/blockstates/cardboard_block.json new file mode 100644 index 0000000000..0ffaa202ae --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/cardboard_block.json @@ -0,0 +1,11 @@ +{ + "variants": { + "axis=x": { + "model": "create:block/cardboard_block", + "y": 90 + }, + "axis=z": { + "model": "create:block/cardboard_block" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 98c8980107..8bc04f5eef 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -240,6 +240,7 @@ "block.create.brown_toolbox": "xoqןoo⟘ uʍoɹᗺ", "block.create.brown_valve_handle": "ǝןpuɐH ǝʌןɐΛ uʍoɹᗺ", "block.create.calcite_pillar": "ɹɐןןıԀ ǝʇıɔןɐƆ", + "block.create.cardboard_block": "pɹɐoqpɹɐƆ ɟo ʞɔoןᗺ", "block.create.cart_assembler": "ɹǝןqɯǝssⱯ ʇɹɐƆ", "block.create.chain_conveyor": "ɹoʎǝʌuoƆ uıɐɥƆ", "block.create.chocolate": "ǝʇɐןoɔoɥƆ", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index a92661ef16..b72f8c85cc 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -240,6 +240,7 @@ "block.create.brown_toolbox": "Brown Toolbox", "block.create.brown_valve_handle": "Brown Valve Handle", "block.create.calcite_pillar": "Calcite Pillar", + "block.create.cardboard_block": "Block of Cardboard", "block.create.cart_assembler": "Cart Assembler", "block.create.chain_conveyor": "Chain Conveyor", "block.create.chocolate": "Chocolate", diff --git a/src/generated/resources/assets/create/models/item/cardboard_block.json b/src/generated/resources/assets/create/models/item/cardboard_block.json new file mode 100644 index 0000000000..c39463f355 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard_block.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/cardboard_block" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/materials/cardboard_block.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/materials/cardboard_block.json new file mode 100644 index 0000000000..fc13ed8ccc --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/materials/cardboard_block.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "create:cardboard" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/materials/cardboard_block" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/materials/cardboard_block" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/materials/cardboard_from_block.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/materials/cardboard_from_block.json new file mode 100644 index 0000000000..6585feb979 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/materials/cardboard_from_block.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "create:cardboard" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/materials/cardboard_from_block" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/materials/cardboard_from_block" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/cardboard_block.json b/src/generated/resources/data/create/loot_tables/blocks/cardboard_block.json new file mode 100644 index 0000000000..edd4a2520b --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/cardboard_block.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:cardboard_block" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/cardboard_block" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/materials/cardboard_block.json b/src/generated/resources/data/create/recipes/crafting/materials/cardboard_block.json new file mode 100644 index 0000000000..1bc4b517f3 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/materials/cardboard_block.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "C": { + "item": "create:cardboard" + } + }, + "pattern": [ + "CC", + "CC" + ], + "result": { + "item": "create:cardboard_block" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/materials/cardboard_from_block.json b/src/generated/resources/data/create/recipes/crafting/materials/cardboard_from_block.json new file mode 100644 index 0000000000..8a7ef79073 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/materials/cardboard_from_block.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "create:cardboard_block" + } + ], + "result": { + "count": 4, + "item": "create:cardboard" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/blocks/storage_blocks.json b/src/generated/resources/data/forge/tags/blocks/storage_blocks.json index 14641f4514..3c03b7b1a9 100644 --- a/src/generated/resources/data/forge/tags/blocks/storage_blocks.json +++ b/src/generated/resources/data/forge/tags/blocks/storage_blocks.json @@ -4,6 +4,7 @@ "create:zinc_block", "create:andesite_alloy_block", "create:brass_block", + "create:cardboard_block", "create:experience_block" ] } \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/blocks/storage_blocks/cardboard.json b/src/generated/resources/data/forge/tags/blocks/storage_blocks/cardboard.json new file mode 100644 index 0000000000..10452a5013 --- /dev/null +++ b/src/generated/resources/data/forge/tags/blocks/storage_blocks/cardboard.json @@ -0,0 +1,5 @@ +{ + "values": [ + "create:cardboard_block" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/storage_blocks.json b/src/generated/resources/data/forge/tags/items/storage_blocks.json index 14641f4514..3c03b7b1a9 100644 --- a/src/generated/resources/data/forge/tags/items/storage_blocks.json +++ b/src/generated/resources/data/forge/tags/items/storage_blocks.json @@ -4,6 +4,7 @@ "create:zinc_block", "create:andesite_alloy_block", "create:brass_block", + "create:cardboard_block", "create:experience_block" ] } \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/storage_blocks/cardboard.json b/src/generated/resources/data/forge/tags/items/storage_blocks/cardboard.json new file mode 100644 index 0000000000..10452a5013 --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/storage_blocks/cardboard.json @@ -0,0 +1,5 @@ +{ + "values": [ + "create:cardboard_block" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json b/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json index 526f980687..15e384e308 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json @@ -130,6 +130,7 @@ "create:brown_seat", "create:green_seat", "create:red_seat", - "create:black_seat" + "create:black_seat", + "create:cardboard_block" ] } \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 9488a8934c..a9908de79b 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -54,6 +54,7 @@ import com.simibubi.create.content.contraptions.piston.MechanicalPistonBlock; import com.simibubi.create.content.contraptions.piston.MechanicalPistonHeadBlock; import com.simibubi.create.content.contraptions.piston.PistonExtensionPoleBlock; import com.simibubi.create.content.contraptions.pulley.PulleyBlock; +import com.simibubi.create.content.decoration.CardboardBlock; import com.simibubi.create.content.decoration.MetalLadderBlock; import com.simibubi.create.content.decoration.MetalScaffoldingBlock; import com.simibubi.create.content.decoration.TrainTrapdoorBlock; @@ -2466,6 +2467,20 @@ public class AllBlocks { .build() .lang("Block of Brass") .register(); + + public static final BlockEntry CARDBOARD_BLOCK = + REGISTRATE.block("cardboard_block", CardboardBlock::new) + .initialProperties(() -> Blocks.MUSHROOM_STEM) + .properties(p -> p.mapColor(MapColor.COLOR_BROWN) + .ignitedByLava()) + .transform(axeOnly()) + .blockstate(BlockStateGen.horizontalAxisBlockProvider(false)) + .tag(Tags.Blocks.STORAGE_BLOCKS) + .transform(tagBlockAndItem("storage_blocks/cardboard")) + .tag(Tags.Items.STORAGE_BLOCKS) + .build() + .lang("Block of Cardboard") + .register(); public static final BlockEntry EXPERIENCE_BLOCK = REGISTRATE.block("experience_block", ExperienceBlock::new) diff --git a/src/main/java/com/simibubi/create/AllItems.java b/src/main/java/com/simibubi/create/AllItems.java index 521e21ea92..582b25abc2 100644 --- a/src/main/java/com/simibubi/create/AllItems.java +++ b/src/main/java/com/simibubi/create/AllItems.java @@ -25,6 +25,7 @@ import com.simibubi.create.content.equipment.armor.AllArmorMaterials; import com.simibubi.create.content.equipment.armor.BacktankItem; import com.simibubi.create.content.equipment.armor.BacktankItem.BacktankBlockItem; import com.simibubi.create.content.equipment.armor.BaseArmorItem; +import com.simibubi.create.content.equipment.armor.CardboardHelmetItem; import com.simibubi.create.content.equipment.armor.DivingBootsItem; import com.simibubi.create.content.equipment.armor.DivingHelmetItem; import com.simibubi.create.content.equipment.blueprint.BlueprintItem; @@ -318,7 +319,7 @@ public class AllItems { CARDBOARD_HELMET = REGISTRATE .item("cardboard_helmet", - p -> new BaseArmorItem(AllArmorMaterials.CARDBOARD, ArmorItem.Type.HELMET, p, + p -> new CardboardHelmetItem(AllArmorMaterials.CARDBOARD, ArmorItem.Type.HELMET, p, Create.asResource("cardboard"))) .tag(forgeItemTag("armors/helmet")) .register(), diff --git a/src/main/java/com/simibubi/create/AllPartialModels.java b/src/main/java/com/simibubi/create/AllPartialModels.java index ed21ef548d..bd48c566b5 100644 --- a/src/main/java/com/simibubi/create/AllPartialModels.java +++ b/src/main/java/com/simibubi/create/AllPartialModels.java @@ -202,6 +202,7 @@ public class AllPartialModels { public static final List CONTRAPTION_CONTROLS_INDICATOR = new ArrayList<>(); public static final Map PACKAGES = new HashMap<>(); + public static final List PACKAGES_AS_LIST = new ArrayList<>(); public static final Map PACKAGE_RIGGING = new HashMap<>(); static { @@ -226,7 +227,9 @@ public class AllPartialModels { for (String size : new String[] { "12x12", "10x12", "12x10", "10x8" }) { ResourceLocation key = Create.asResource("cardboard_package_" + size); - PACKAGES.put(key, PartialModel.of(Create.asResource("item/packages/cardboard_" + size))); + PartialModel model = PartialModel.of(Create.asResource("item/packages/cardboard_" + size)); + PACKAGES.put(key, model); + PACKAGES_AS_LIST.add(model); PACKAGE_RIGGING.put(key, PartialModel.of(Create.asResource("item/packages/cardboard_" + size + "_rigging"))); } diff --git a/src/main/java/com/simibubi/create/content/decoration/CardboardBlock.java b/src/main/java/com/simibubi/create/content/decoration/CardboardBlock.java new file mode 100644 index 0000000000..1f47575e5f --- /dev/null +++ b/src/main/java/com/simibubi/create/content/decoration/CardboardBlock.java @@ -0,0 +1,59 @@ +package com.simibubi.create.content.decoration; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Direction.Axis; +import net.minecraft.core.Direction.AxisDirection; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition.Builder; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.Property; + +public class CardboardBlock extends Block { + + public static final Property HORIZONTAL_AXIS = BlockStateProperties.HORIZONTAL_AXIS; + + public CardboardBlock(Properties pProperties) { + super(pProperties); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext pContext) { + return this.defaultBlockState() + .setValue(HORIZONTAL_AXIS, pContext.getHorizontalDirection() + .getAxis()); + } + + @Override + public int getFireSpreadSpeed(BlockState state, BlockGetter level, BlockPos pos, Direction direction) { + return 100; + } + + @Override + public int getFlammability(BlockState state, BlockGetter level, BlockPos pos, Direction direction) { + return 20; + } + + @Override + protected void createBlockStateDefinition(Builder builder) { + super.createBlockStateDefinition(builder.add(HORIZONTAL_AXIS)); + } + + @Override + public BlockState rotate(BlockState state, Rotation rot) { + return state.setValue(HORIZONTAL_AXIS, + rot.rotate(Direction.get(AxisDirection.POSITIVE, state.getValue(HORIZONTAL_AXIS))) + .getAxis()); + } + + @Override + public BlockState mirror(BlockState state, Mirror mirrorIn) { + return state; + } + +} diff --git a/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorHandlerClient.java b/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorHandlerClient.java index 9ae57498f8..56eddb14f2 100644 --- a/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorHandlerClient.java +++ b/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorHandlerClient.java @@ -1,23 +1,48 @@ package com.simibubi.create.content.equipment.armor; +import java.util.UUID; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; + +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.AllItems; import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.logistics.box.PackageRenderer; +import dev.engine_room.flywheel.lib.model.baked.PartialModel; import net.createmod.catnip.utility.AnimationTickHolder; import net.minecraft.util.Mth; import net.minecraft.world.entity.player.Player; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.RenderPlayerEvent; +import net.minecraftforge.event.TickEvent.Phase; +import net.minecraftforge.event.TickEvent.PlayerTickEvent; import net.minecraftforge.eventbus.api.EventPriority; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; -import net.minecraftforge.registries.ForgeRegistries; @EventBusSubscriber(value = Dist.CLIENT) public class CardboardArmorHandlerClient { + private static final Cache BOXES_PLAYERS_ARE_HIDING_AS = CacheBuilder.newBuilder() + .expireAfterAccess(1, TimeUnit.SECONDS) + .build(); + + @SubscribeEvent + public static void keepCacheAliveDesignDespiteNotRendering(PlayerTickEvent event) { + if (event.phase == Phase.START) + return; + Player player = event.player; + if (!CardboardArmorHandler.testForStealth(player)) + return; + try { + getCurrentBoxIndex(player); + } catch (ExecutionException e) { + e.printStackTrace(); + } + } + @SubscribeEvent(priority = EventPriority.HIGH) public static void playerRendersAsBoxWhenSneaking(RenderPlayerEvent.Pre event) { Player player = event.getEntity(); @@ -39,10 +64,22 @@ public class CardboardArmorHandlerClient { Math.min(Math.abs(Mth.cos((AnimationTickHolder.getRenderTime() % 256) / 2.0f)) * 2 / 16f, movement * 5), 0); - float f = Mth.lerp(event.getPartialTick(), player.yRotO, player.getYRot()); - PackageRenderer.renderBox(player, -f + -90, ms, event.getMultiBufferSource(), event.getPackedLight(), - AllPartialModels.PACKAGES.get(ForgeRegistries.ITEMS.getKey(AllItems.CARDBOARD_PACKAGE_10x12.get()))); + float interpolatedYaw = Mth.lerp(event.getPartialTick(), player.yRotO, player.getYRot()); + + try { + PartialModel model = AllPartialModels.PACKAGES_AS_LIST.get(getCurrentBoxIndex(player)); + PackageRenderer.renderBox(player, -interpolatedYaw + -90, ms, event.getMultiBufferSource(), + event.getPackedLight(), model); + } catch (ExecutionException e) { + e.printStackTrace(); + } + ms.popPose(); } + private static Integer getCurrentBoxIndex(Player player) throws ExecutionException { + return BOXES_PLAYERS_ARE_HIDING_AS.get(player.getUUID(), + () -> player.level().random.nextInt(AllPartialModels.PACKAGES_AS_LIST.size())); + } + } diff --git a/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorStealthOverlay.java b/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorStealthOverlay.java new file mode 100644 index 0000000000..40f49fa718 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorStealthOverlay.java @@ -0,0 +1,50 @@ +package com.simibubi.create.content.equipment.armor; + +import com.simibubi.create.Create; + +import net.createmod.catnip.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Gui; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.client.extensions.common.IClientItemExtensions; + +public class CardboardArmorStealthOverlay extends Gui implements IClientItemExtensions { + + public CardboardArmorStealthOverlay() { + super(Minecraft.getInstance(), Minecraft.getInstance() + .getItemRenderer()); + } + + private static final ResourceLocation PACKAGE_BLUR_LOCATION = Create.asResource("textures/misc/package_blur.png"); + + private static LerpedFloat opacity = LerpedFloat.linear() + .startWithValue(0) + .chase(0, 0.25f, Chaser.EXP); + + public static void clientTick() { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) + return; + + opacity.tickChaser(); + opacity.updateChaseTarget(CardboardArmorHandler.testForStealth(player) ? 1 : 0); + } + + @Override + public void renderHelmetOverlay(ItemStack stack, Player player, int width, int height, float partialTick) { + Minecraft mc = Minecraft.getInstance(); + float value = opacity.getValue(partialTick); + if (value == 0) + return; + screenWidth = width; + screenHeight = height; + renderTextureOverlay(new GuiGraphics(mc, mc.renderBuffers() + .bufferSource()), PACKAGE_BLUR_LOCATION, value); + } + +} diff --git a/src/main/java/com/simibubi/create/content/equipment/armor/CardboardHelmetItem.java b/src/main/java/com/simibubi/create/content/equipment/armor/CardboardHelmetItem.java new file mode 100644 index 0000000000..efdf62aef9 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/equipment/armor/CardboardHelmetItem.java @@ -0,0 +1,25 @@ +package com.simibubi.create.content.equipment.armor; + +import java.util.function.Consumer; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ArmorMaterial; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.client.extensions.common.IClientItemExtensions; + +public class CardboardHelmetItem extends BaseArmorItem { + + public CardboardHelmetItem(ArmorMaterial armorMaterial, Type type, Properties properties, + ResourceLocation textureLoc) { + super(armorMaterial, type, properties, textureLoc); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void initializeClient(Consumer consumer) { + super.initializeClient(consumer); + consumer.accept(new CardboardArmorStealthOverlay()); + } + +} diff --git a/src/main/java/com/simibubi/create/content/equipment/tool/CardboardSwordItem.java b/src/main/java/com/simibubi/create/content/equipment/tool/CardboardSwordItem.java index 9c9e0bdbb6..7218155ca7 100644 --- a/src/main/java/com/simibubi/create/content/equipment/tool/CardboardSwordItem.java +++ b/src/main/java/com/simibubi/create/content/equipment/tool/CardboardSwordItem.java @@ -28,7 +28,10 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.extensions.common.IClientItemExtensions; import net.minecraftforge.event.entity.living.LivingAttackEvent; +import net.minecraftforge.event.entity.player.PlayerInteractEvent.LeftClickBlock; +import net.minecraftforge.event.entity.player.PlayerInteractEvent.LeftClickBlock.Action; import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.LogicalSide; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; @EventBusSubscriber @@ -49,14 +52,22 @@ public class CardboardSwordItem extends SwordItem { } @Override - public boolean hurtEnemy(ItemStack pStack, LivingEntity pTarget, LivingEntity pAttacker) { - return super.hurtEnemy(pStack, pTarget, pAttacker); + public boolean onLeftClickEntity(ItemStack stack, Player player, Entity entity) { + AllSoundEvents.CARDBOARD_SWORD.playFrom(entity, 0.75f, 1.85f); + return super.onLeftClickEntity(stack, player, entity); } - @Override - public boolean onLeftClickEntity(ItemStack stack, Player player, Entity entity) { - AllSoundEvents.CARDBOARD_SWORD.playFrom(entity, 0.75f, 1.5f); - return super.onLeftClickEntity(stack, player, entity); + @SubscribeEvent + public static void cardboardSwordsMakeNoiseOnClick(LeftClickBlock event) { + ItemStack itemStack = event.getItemStack(); + if (!AllItems.CARDBOARD_SWORD.isIn(itemStack)) + return; + if (event.getAction() != Action.START) + return; + if (event.getSide() == LogicalSide.CLIENT) + AllSoundEvents.CARDBOARD_SWORD.playAt(event.getLevel(), event.getPos(), 0.5f, 1.85f, false); + else + AllSoundEvents.CARDBOARD_SWORD.play(event.getLevel(), event.getEntity(), event.getPos(), 0.5f, 1.85f); } @SubscribeEvent @@ -84,6 +95,7 @@ public class CardboardSwordItem extends SwordItem { if (knockbackStrength <= 0) return; + target.stopRiding(); target.knockback(knockbackStrength * 0.5F, Mth.sin(livingAttacker.getYRot() * Mth.DEG_TO_RAD), -Mth.cos(livingAttacker.getYRot() * Mth.DEG_TO_RAD)); if ((target.getClassification(false) == MobCategory.MISC diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java index d3e7eac7dc..d8e500ee2b 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java @@ -14,6 +14,8 @@ import java.util.ArrayList; import java.util.List; import java.util.function.UnaryOperator; +import org.jetbrains.annotations.NotNull; + import com.google.common.base.Supplier; import com.google.common.collect.ImmutableList; import com.google.gson.JsonArray; @@ -59,8 +61,6 @@ import net.minecraftforge.common.crafting.conditions.ICondition; import net.minecraftforge.common.crafting.conditions.ModLoadedCondition; import net.minecraftforge.common.crafting.conditions.NotCondition; -import org.jetbrains.annotations.NotNull; - @SuppressWarnings("unused") public class StandardRecipeGen extends CreateRecipeProvider { @@ -115,6 +115,16 @@ public class StandardRecipeGen extends CreateRecipeProvider { .pattern("CCC") .pattern("CCC") .pattern("CCC")), + + CARDBOARD_BLOCK = create(AllBlocks.CARDBOARD_BLOCK).unlockedBy(AllItems.CARDBOARD::get) + .viaShaped(b -> b.define('C', AllItems.CARDBOARD.get()) + .pattern("CC") + .pattern("CC")), + + CARDBOARD_FROM_BLOCK = create(AllItems.CARDBOARD).withSuffix("_from_block") + .returns(4) + .unlockedBy(AllItems.CARDBOARD::get) + .viaShapeless(b -> b.requires(AllBlocks.CARDBOARD_BLOCK.get())), BRASS_COMPACTING = metalCompacting(ImmutableList.of(AllItems.BRASS_NUGGET, AllItems.BRASS_INGOT, AllBlocks.BRASS_BLOCK), diff --git a/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java b/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java index ae6ebd6085..d53893c04e 100644 --- a/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java @@ -17,6 +17,7 @@ import com.simibubi.create.content.contraptions.render.ContraptionRenderInfoMana import com.simibubi.create.content.contraptions.wrench.RadialWrenchHandler; import com.simibubi.create.content.decoration.girder.GirderWrenchBehavior; import com.simibubi.create.content.equipment.armor.BacktankArmorLayer; +import com.simibubi.create.content.equipment.armor.CardboardArmorStealthOverlay; import com.simibubi.create.content.equipment.armor.DivingHelmetItem; import com.simibubi.create.content.equipment.armor.NetheriteBacktankFirstPersonRenderer; import com.simibubi.create.content.equipment.armor.NetheriteDivingHandler; @@ -183,6 +184,7 @@ public class ClientEvents { PackagePortTargetSelectionHandler.tick(); LogisticallyLinkedClientHandler.tick(); DisplayClothOverlayRenderer.tick(); + CardboardArmorStealthOverlay.clientTick(); } @SubscribeEvent diff --git a/src/main/resources/assets/create/models/block/cardboard_block.json b/src/main/resources/assets/create/models/block/cardboard_block.json new file mode 100644 index 0000000000..8a9476d965 --- /dev/null +++ b/src/main/resources/assets/create/models/block/cardboard_block.json @@ -0,0 +1,24 @@ +{ + "parent": "block/block", + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/cardboard_block_front", + "1": "create:block/cardboard_block_side", + "2": "create:block/cardboard_block_top", + "particle": "create:block/cardboard_block_side" + }, + "elements": [ + { + "from": [0, 0, 0], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [0, 0, 16, 16], "texture": "#0"}, + "east": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "south": {"uv": [0, 0, 16, 16], "texture": "#0"}, + "west": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "up": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#2"}, + "down": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#2"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/block/cardboard_block_front.png b/src/main/resources/assets/create/textures/block/cardboard_block_front.png new file mode 100644 index 0000000000000000000000000000000000000000..edf9b73fee661d1476bc4155529c5d320f3a2fba GIT binary patch literal 216 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 k&bcsFk^dKgqz;7&LX(R2RkvBQUCw| literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/misc/package_blur.png.mcmeta b/src/main/resources/assets/create/textures/misc/package_blur.png.mcmeta new file mode 100644 index 0000000000..2077f3ce06 --- /dev/null +++ b/src/main/resources/assets/create/textures/misc/package_blur.png.mcmeta @@ -0,0 +1,6 @@ +{ + "texture": { + "blur": true + } +} + From 4ad371e685602dbfded40fdc47993ee905cdb537 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 18 Oct 2024 15:50:53 +0200 Subject: [PATCH 082/515] Factory panel concept --- .../12afe0d97856fb2040b8407470e6d13529994eaa | 2 +- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 12 +- .../455c485c9c8ef171bbc1ce4d435b3110ba1557ba | 2 +- .../499d9d953ee69b539ff4dd4c95a6cbd849f63f67 | 2 +- .../6ec3b5a261c9ae3df674f7595dc66530ce54feb9 | 2 +- .../82992cbf8f2794d83ac94034835eac0acd7915b9 | 4 +- .../ad9bf59631726a3f24738ebf1a6cd44c7f88ba0f | 2 +- .../b256105d8411632b0d585496ea8944a751a08034 | 2 +- .../c24b4d2b8d15abff51c78bd94f4403d9eae6c139 | 2 +- .../e0a39a97205b7149114f15de91b614248d05fd95 | 2 +- .../eaed56ca9d9781c7626be345dd9f2c9a1fad638e | 2 +- .../create/blockstates/factory_panel.json | 216 ++++++++++++ .../resources/assets/create/lang/en_ud.json | 2 + .../resources/assets/create/lang/en_us.json | 2 + .../create/models/item/factory_panel.json | 3 + .../models/item/factory_panel_connector.json | 6 + .../logistics/factory_panel_clear.json | 35 ++ .../loot_tables/blocks/factory_panel.json | 21 ++ .../logistics/factory_panel_clear.json | 12 + .../tags/blocks/mineable/pickaxe.json | 1 + .../simibubi/create/AllBlockEntityTypes.java | 8 + .../java/com/simibubi/create/AllBlocks.java | 11 + .../simibubi/create/AllCreativeModeTabs.java | 3 +- .../java/com/simibubi/create/AllItems.java | 5 + .../java/com/simibubi/create/AllPackets.java | 6 + .../com/simibubi/create/AllPartialModels.java | 3 + .../java/com/simibubi/create/AllShapes.java | 3 + .../crank/ValveHandleBlockEntity.java | 4 +- .../FactoryPanelAddressInputScreen.java | 45 +++ .../factoryBoard/FactoryPanelBehaviour.java | 194 +++++++++++ .../factoryBoard/FactoryPanelBlock.java | 156 +++++++++ .../factoryBoard/FactoryPanelBlockEntity.java | 145 +++++++++ .../FactoryPanelConfigurationPacket.java | 45 +++ .../factoryBoard/FactoryPanelConnection.java | 18 + .../FactoryPanelConnectionBehaviour.java | 307 ++++++++++++++++++ .../FactoryPanelConnectionPacket.java | 50 +++ .../FactoryPanelConnectorItem.java | 95 ++++++ .../FactoryPanelEffectPacket.java | 60 ++++ .../factoryBoard/FactoryPanelRenderer.java | 120 +++++++ .../logistics/packager/InventorySummary.java | 3 + .../LogisticallyLinkedBehaviour.java | 28 +- .../stockTicker/StockCheckingBlockEntity.java | 82 +++-- .../stockTicker/StockTickerBlockEntity.java | 63 +--- .../StockTickerInteractionHandler.java | 2 +- .../BrassDiodeScrollValueBehaviour.java | 4 +- .../blockEntity/behaviour/ValueBox.java | 24 +- .../behaviour/ValueSettingsBehaviour.java | 11 +- .../behaviour/ValueSettingsClient.java | 14 +- .../behaviour/ValueSettingsInputHandler.java | 4 +- .../behaviour/ValueSettingsPacket.java | 23 +- .../behaviour/ValueSettingsScreen.java | 41 ++- .../filtering/FilteringBehaviour.java | 27 +- .../filtering/FilteringRenderer.java | 14 +- .../scrollValue/ScrollValueBehaviour.java | 6 +- .../scrollValue/ScrollValueRenderer.java | 61 ++-- .../data/recipe/StandardRecipeGen.java | 1 + .../models/block/factory_board/block.bbmodel | 1 + .../models/block/factory_board/block.json | 60 ++++ .../models/block/factory_panel/block.json | 87 +++++ .../models/block/factory_panel/input.json | 50 +++ .../models/block/factory_panel/timer.json | 49 +++ .../create/textures/block/factory_board.png | Bin 0 -> 145 bytes .../create/textures/block/factory_panel.png | Bin 0 -> 344 bytes .../textures/item/factory_panel_connector.png | Bin 0 -> 243 bytes 64 files changed, 2084 insertions(+), 181 deletions(-) create mode 100644 src/generated/resources/assets/create/blockstates/factory_panel.json create mode 100644 src/generated/resources/assets/create/models/item/factory_panel.json create mode 100644 src/generated/resources/assets/create/models/item/factory_panel_connector.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/factory_panel_clear.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/factory_panel.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/factory_panel_clear.json create mode 100644 src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelAddressInputScreen.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConfigurationPacket.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnection.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionBehaviour.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionPacket.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectorItem.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelEffectPacket.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelRenderer.java create mode 100644 src/main/resources/assets/create/models/block/factory_board/block.bbmodel create mode 100644 src/main/resources/assets/create/models/block/factory_board/block.json create mode 100644 src/main/resources/assets/create/models/block/factory_panel/block.json create mode 100644 src/main/resources/assets/create/models/block/factory_panel/input.json create mode 100644 src/main/resources/assets/create/models/block/factory_panel/timer.json create mode 100644 src/main/resources/assets/create/textures/block/factory_board.png create mode 100644 src/main/resources/assets/create/textures/block/factory_panel.png create mode 100644 src/main/resources/assets/create/textures/item/factory_panel_connector.png diff --git a/src/generated/resources/.cache/12afe0d97856fb2040b8407470e6d13529994eaa b/src/generated/resources/.cache/12afe0d97856fb2040b8407470e6d13529994eaa index 8aded56d1a..031c4a3d31 100644 --- a/src/generated/resources/.cache/12afe0d97856fb2040b8407470e6d13529994eaa +++ b/src/generated/resources/.cache/12afe0d97856fb2040b8407470e6d13529994eaa @@ -1,4 +1,4 @@ -// 1.20.1 2024-10-09T12:24:59.2666858 Create's Sequenced Assembly Recipes +// 1.20.1 2024-10-18T15:46:50.5780971 Create's Sequenced Assembly Recipes dbaca5a5aa312f3bc7b826e51e665d32e798a5d7 data/create/recipes/sequenced_assembly/precision_mechanism.json dacafdb106304d183b00e21fb01517ac45eca800 data/create/recipes/sequenced_assembly/sturdy_sheet.json 1274315b5c570722d6f5b2ed7f5e53fe01b6288a data/create/recipes/sequenced_assembly/track.json diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index a31e8abad1..1de6bc9499 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-10-17T18:56:47.626034 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-10-18T15:46:50.504294 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -234,6 +234,7 @@ d47bc65703e9582cc710e6408fb565e16d3514a6 assets/create/blockstates/encased_fan.j 5299b4f7b9b3490872e8c26a6b212e14dd05fd9a assets/create/blockstates/exposed_copper_tiles.json 6ee73ff3608d51fdad6e9810feee66ed1773b81c assets/create/blockstates/exposed_copper_tile_slab.json f93e4059876bfc6d70b9fa2bc24d8e3d6943d56f assets/create/blockstates/exposed_copper_tile_stairs.json +8dea51f1c103e3bf1766e0f626b1143c92c364c3 assets/create/blockstates/factory_panel.json f1a03ede031d8c4e33a4d07c529e71936da9dc6d assets/create/blockstates/fake_track.json 21fa4a1bf4ee851e090a21c97c9a38d18cfddf0d assets/create/blockstates/fluid_pipe.json 185e6367c5c5b3632e54148c74987057cbfccaca assets/create/blockstates/fluid_tank.json @@ -610,8 +611,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -1d3a9e827cc454562c86cc8c5ee596b78cfa7a57 assets/create/lang/en_ud.json -b6619ed3dcd9146aa7a567629455ef7c01146437 assets/create/lang/en_us.json +0327d230f2c772bc5239d306d3ff557e90b9edcd assets/create/lang/en_ud.json +5642d29ae31e006d0970c9b20ff681aa345d96c4 assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -1987,6 +1988,8 @@ fa7ffb172a43774cc07a2bb201e7010a2549001d assets/create/models/item/exposed_coppe a443633d90ef9ac2a866b69b2ecdfad1841dc3e1 assets/create/models/item/exposed_copper_tile_slab.json 9bb425a14635fc8b36a9a95f3d0c54e0b129b7b4 assets/create/models/item/exposed_copper_tile_stairs.json 8b64a93d9b6e33e3caa66adb7a0cc8c5cd473023 assets/create/models/item/extendo_grip.json +caca352133a2f224fb841d85941f26cf47e843c4 assets/create/models/item/factory_panel.json +bfc640c64c9ecde635eb0e7fc7b014f12e566840 assets/create/models/item/factory_panel_connector.json dad31483f65baaf187e6553e3cd301c5d69e9db4 assets/create/models/item/filter.json 575047531b8e324df9e58abba79cfe9ee3db8b16 assets/create/models/item/fluid_pipe.json 51d34caaa63685e901b8bfe6ced13ff2e8914ce7 assets/create/models/item/fluid_tank.json @@ -3260,6 +3263,7 @@ d2c9abd9260eb82ea1c2eeae5e2d6abd0b4d3ce8 data/create/loot_tables/blocks/exposed_ f0905ae4c9bdff8fe9e1ab4682a7b1efe2d27d9d data/create/loot_tables/blocks/exposed_copper_tiles.json 6841c02935838f00011d33fc392965326c4dbc5b data/create/loot_tables/blocks/exposed_copper_tile_slab.json 432a047156b93a09b7e027fc34f5680a8f68dc92 data/create/loot_tables/blocks/exposed_copper_tile_stairs.json +2752e8d18bd512fcbab7b6bd1ceab16b5bd5baab data/create/loot_tables/blocks/factory_panel.json 3fae2a7a3f133a1d7c76ce91f6c48eab787d6ff6 data/create/loot_tables/blocks/fake_track.json 1d4734d6d9ba039c0dfa2271f08cdb55e35b721f data/create/loot_tables/blocks/fluid_pipe.json 9c112883a3763b2d286d9a5a0980dcea82bcc9e6 data/create/loot_tables/blocks/fluid_tank.json @@ -4414,7 +4418,7 @@ c741ba83b562ae3459d7c4f2db69537f549ea411 data/forge/tags/items/tools/wrench.json e3321ff14704c031a2c16953b7e391f4f24dd70b data/minecraft/tags/blocks/impermeable.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/lush_ground_replaceable.json f65bb63cc66aa72b5b9fa05dd88e2a69c8bf7d55 data/minecraft/tags/blocks/mineable/axe.json -1f8802b85d179bbd7f74ec37c6ffceb59eb4856c data/minecraft/tags/blocks/mineable/pickaxe.json +bdfb14d8f55cdccf1c763bada28ee1089b7d2a26 data/minecraft/tags/blocks/mineable/pickaxe.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/moss_replaceable.json 0c13aae0eeb99e89febe8dbe5e002af2ff843a9e data/minecraft/tags/blocks/needs_iron_tool.json 3cb2a92cbdf32ed5978f740dc378d363306c3e84 data/minecraft/tags/blocks/needs_stone_tool.json diff --git a/src/generated/resources/.cache/455c485c9c8ef171bbc1ce4d435b3110ba1557ba b/src/generated/resources/.cache/455c485c9c8ef171bbc1ce4d435b3110ba1557ba index 1c010d34b7..7bcbca3468 100644 --- a/src/generated/resources/.cache/455c485c9c8ef171bbc1ce4d435b3110ba1557ba +++ b/src/generated/resources/.cache/455c485c9c8ef171bbc1ce4d435b3110ba1557ba @@ -1,4 +1,4 @@ -// 1.20.1 2024-10-09T12:24:59.1794112 Create's Advancements +// 1.20.1 2024-10-18T15:46:50.483838 Create's Advancements 2661a689fdcf729494f46e3c719f71c62e31582e data/create/advancements/andesite_alloy.json fa16c4afe0496edc3f157858a6e0ff177a1622ff data/create/advancements/andesite_casing.json 5a694002d0a663bc869b09d15924a10c43dc522f data/create/advancements/anvil_plough.json diff --git a/src/generated/resources/.cache/499d9d953ee69b539ff4dd4c95a6cbd849f63f67 b/src/generated/resources/.cache/499d9d953ee69b539ff4dd4c95a6cbd849f63f67 index d21c5cdcb0..7bb6ff2e45 100644 --- a/src/generated/resources/.cache/499d9d953ee69b539ff4dd4c95a6cbd849f63f67 +++ b/src/generated/resources/.cache/499d9d953ee69b539ff4dd4c95a6cbd849f63f67 @@ -1,4 +1,4 @@ -// 1.20.1 2024-10-15T10:59:16.1145758 Create Train Hat Information +// 1.20.1 2024-10-18T15:46:50.4863422 Create Train Hat Information be16d47aa64e673b1107a36ce06475016e316fca assets/minecraft/train_hat_info/axolotl.json b8ae6d9c8014439f4049622e0d6e79b9d6716260 assets/minecraft/train_hat_info/bat.json 5053a6c9fb412dfac1bf17eb0f57f9fd314198e4 assets/minecraft/train_hat_info/bee.json diff --git a/src/generated/resources/.cache/6ec3b5a261c9ae3df674f7595dc66530ce54feb9 b/src/generated/resources/.cache/6ec3b5a261c9ae3df674f7595dc66530ce54feb9 index 0a84a5228e..f3c74abf68 100644 --- a/src/generated/resources/.cache/6ec3b5a261c9ae3df674f7595dc66530ce54feb9 +++ b/src/generated/resources/.cache/6ec3b5a261c9ae3df674f7595dc66530ce54feb9 @@ -1,4 +1,4 @@ -// 1.20.1 2024-10-09T12:24:59.2726698 Create's Mechanical Crafting Recipes +// 1.20.1 2024-10-18T15:46:50.5880704 Create's Mechanical Crafting Recipes f076d64d9f30709bed34775136c9241097b28aa9 data/create/recipes/mechanical_crafting/crushing_wheel.json 694dca9dcff246bb7f560b3304fcc244c53217d5 data/create/recipes/mechanical_crafting/extendo_grip.json c03bc27f537e2d6531438bf58a17d977a7e16c7b data/create/recipes/mechanical_crafting/potato_cannon.json diff --git a/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 b/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 index c0fbdb41d0..7ec45153ec 100644 --- a/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 +++ b/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 @@ -1,4 +1,4 @@ -// 1.20.1 2024-10-17T18:56:47.6838794 Create's Standard Recipes +// 1.20.1 2024-10-18T15:46:50.5810891 Create's Standard Recipes a8cc4af26f6c7c45a9eef12e92af1452fe042454 data/create/advancements/recipes/combat/crafting/appliances/netherite_backtank.json 2c2639c7b307ee7c7a4e97e5efebf496788998ad data/create/advancements/recipes/combat/crafting/appliances/netherite_backtank_from_netherite.json 81dcf0cb1aa99e39bc7d1a386e07cad4cee7d8b9 data/create/advancements/recipes/combat/crafting/appliances/netherite_diving_boots.json @@ -170,6 +170,7 @@ f3e387ae41a55cdb5ff745f40e2ddb5e2595e9b8 data/create/advancements/recipes/misc/c dc61a327753684a0d8a7bcc408d656b53ac633b1 data/create/advancements/recipes/misc/crafting/logistics/brass_tunnel.json 03c367840951af268047c407b15aad52f0b094b4 data/create/advancements/recipes/misc/crafting/logistics/content_observer.json 09454f1d4db813c89a0a2f3af966298fc5f7da7b data/create/advancements/recipes/misc/crafting/logistics/display_link.json +659025bbb47c8acae226198fafbd980d89379e25 data/create/advancements/recipes/misc/crafting/logistics/factory_panel_clear.json 995aa09f4672405984988e445a1d97301c5c4389 data/create/advancements/recipes/misc/crafting/logistics/packager_link_clear.json 95b357cbac39acfbc68ac04d0d4681a4d91746ee data/create/advancements/recipes/misc/crafting/logistics/powered_latch.json ef84b382bd4f6ba9558574f2c8e63030813594e9 data/create/advancements/recipes/misc/crafting/logistics/powered_toggle_latch.json @@ -422,6 +423,7 @@ a24f11d979f40994b9f881b0f49fff5d93185296 data/create/recipes/crafting/logistics/ d994ef262b16357984d3ed62f6563d2f37266193 data/create/recipes/crafting/logistics/brass_tunnel.json 0b18d9964f2d580eb465cc72208f7a7fdba7b63e data/create/recipes/crafting/logistics/content_observer.json cc837e8b014c121ed9d959baddea134ebf669350 data/create/recipes/crafting/logistics/display_link.json +9b5926ef76342b8364bff3474e491704c3197c5f data/create/recipes/crafting/logistics/factory_panel_clear.json 5db046b432f184c6590c8e6adaf95adac6f0dc9d data/create/recipes/crafting/logistics/packager_link_clear.json dd28b63ceb46a1e9071549c4f8ff32f520c667f6 data/create/recipes/crafting/logistics/powered_latch.json 9ee6e19644928dc78e6f8a5e59f30cd42ac3e454 data/create/recipes/crafting/logistics/powered_toggle_latch.json diff --git a/src/generated/resources/.cache/ad9bf59631726a3f24738ebf1a6cd44c7f88ba0f b/src/generated/resources/.cache/ad9bf59631726a3f24738ebf1a6cd44c7f88ba0f index 65eee720eb..ab50b60766 100644 --- a/src/generated/resources/.cache/ad9bf59631726a3f24738ebf1a6cd44c7f88ba0f +++ b/src/generated/resources/.cache/ad9bf59631726a3f24738ebf1a6cd44c7f88ba0f @@ -1,4 +1,4 @@ -// 1.20.1 2024-10-09T12:24:59.2656887 Create's Damage Type Tags +// 1.20.1 2024-10-18T15:46:50.5770997 Create's Damage Type Tags 7884716b2f4bb1330ff215366bb4bab06e4728c2 data/minecraft/tags/damage_type/bypasses_armor.json 1fcad1f89265fba8bdb05b03a1dfcc88d7b7a550 data/minecraft/tags/damage_type/is_explosion.json 08324c61115b72bb8a6370d7f34d84d9a31afd16 data/minecraft/tags/damage_type/is_fire.json diff --git a/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 b/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 index 307839d92a..ebcc73eea7 100644 --- a/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 +++ b/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 @@ -1,4 +1,4 @@ -// 1.20.1 2024-10-15T23:01:25.1999039 Create's Processing Recipes +// 1.20.1 2024-10-18T15:46:50.4883378 Create's Processing Recipes 3c94326fb730f68c1e44fe1e2ef09c9db6ffd92b data/create/recipes/compacting/andesite_from_flint.json 8d3d5b31f3601b9f681ff710e0545a483a1494c6 data/create/recipes/compacting/blaze_cake.json 8bd7f4e3a686ab520b2d55594d2018d0e9a50c91 data/create/recipes/compacting/chocolate.json diff --git a/src/generated/resources/.cache/c24b4d2b8d15abff51c78bd94f4403d9eae6c139 b/src/generated/resources/.cache/c24b4d2b8d15abff51c78bd94f4403d9eae6c139 index 91d451aa5c..77746800f4 100644 --- a/src/generated/resources/.cache/c24b4d2b8d15abff51c78bd94f4403d9eae6c139 +++ b/src/generated/resources/.cache/c24b4d2b8d15abff51c78bd94f4403d9eae6c139 @@ -1,2 +1,2 @@ -// 1.20.1 2024-10-16T10:36:50.6106407 Create's Custom Sounds +// 1.20.1 2024-10-18T15:46:50.5032973 Create's Custom Sounds c46cacfd6c383d9195b9d1104c7ed543e184cad9 assets/create/sounds.json diff --git a/src/generated/resources/.cache/e0a39a97205b7149114f15de91b614248d05fd95 b/src/generated/resources/.cache/e0a39a97205b7149114f15de91b614248d05fd95 index ba866d79a0..36643d1433 100644 --- a/src/generated/resources/.cache/e0a39a97205b7149114f15de91b614248d05fd95 +++ b/src/generated/resources/.cache/e0a39a97205b7149114f15de91b614248d05fd95 @@ -1,2 +1,2 @@ -// 1.20.1 2024-10-09T12:24:59.2646915 Create's Recipe Serializer Tags +// 1.20.1 2024-10-18T15:46:50.5751052 Create's Recipe Serializer Tags 0d8718f7383761bc5d7bc45306ed266ebf25dc1d data/create/tags/recipe_serializer/automation_ignore.json diff --git a/src/generated/resources/.cache/eaed56ca9d9781c7626be345dd9f2c9a1fad638e b/src/generated/resources/.cache/eaed56ca9d9781c7626be345dd9f2c9a1fad638e index 5a2a21ad8f..76bfbc26da 100644 --- a/src/generated/resources/.cache/eaed56ca9d9781c7626be345dd9f2c9a1fad638e +++ b/src/generated/resources/.cache/eaed56ca9d9781c7626be345dd9f2c9a1fad638e @@ -1,4 +1,4 @@ -// 1.20.1 2024-10-09T12:24:59.2666858 Create's Generated Registry Entries +// 1.20.1 2024-10-18T15:46:50.5800917 Create's Generated Registry Entries 030ede1044384c4117ac1e491bf5c78bbd2842f5 data/create/damage_type/crush.json 92b0416950ffeb3ba68811e587177c2f8811c2c5 data/create/damage_type/cuckoo_surprise.json d2a4fdb64f4ba817e13a7b20c73fd1ca34b825fc data/create/damage_type/fan_fire.json diff --git a/src/generated/resources/assets/create/blockstates/factory_panel.json b/src/generated/resources/assets/create/blockstates/factory_panel.json new file mode 100644 index 0000000000..8240e5b6ca --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/factory_panel.json @@ -0,0 +1,216 @@ +{ + "variants": { + "face=ceiling,facing=east,powered=false,waterlogged=false": { + "model": "create:block/factory_panel/block", + "x": 180, + "y": 270 + }, + "face=ceiling,facing=east,powered=false,waterlogged=true": { + "model": "create:block/factory_panel/block", + "x": 180, + "y": 270 + }, + "face=ceiling,facing=east,powered=true,waterlogged=false": { + "model": "create:block/factory_panel/block", + "x": 180, + "y": 270 + }, + "face=ceiling,facing=east,powered=true,waterlogged=true": { + "model": "create:block/factory_panel/block", + "x": 180, + "y": 270 + }, + "face=ceiling,facing=north,powered=false,waterlogged=false": { + "model": "create:block/factory_panel/block", + "x": 180, + "y": 180 + }, + "face=ceiling,facing=north,powered=false,waterlogged=true": { + "model": "create:block/factory_panel/block", + "x": 180, + "y": 180 + }, + "face=ceiling,facing=north,powered=true,waterlogged=false": { + "model": "create:block/factory_panel/block", + "x": 180, + "y": 180 + }, + "face=ceiling,facing=north,powered=true,waterlogged=true": { + "model": "create:block/factory_panel/block", + "x": 180, + "y": 180 + }, + "face=ceiling,facing=south,powered=false,waterlogged=false": { + "model": "create:block/factory_panel/block", + "x": 180 + }, + "face=ceiling,facing=south,powered=false,waterlogged=true": { + "model": "create:block/factory_panel/block", + "x": 180 + }, + "face=ceiling,facing=south,powered=true,waterlogged=false": { + "model": "create:block/factory_panel/block", + "x": 180 + }, + "face=ceiling,facing=south,powered=true,waterlogged=true": { + "model": "create:block/factory_panel/block", + "x": 180 + }, + "face=ceiling,facing=west,powered=false,waterlogged=false": { + "model": "create:block/factory_panel/block", + "x": 180, + "y": 90 + }, + "face=ceiling,facing=west,powered=false,waterlogged=true": { + "model": "create:block/factory_panel/block", + "x": 180, + "y": 90 + }, + "face=ceiling,facing=west,powered=true,waterlogged=false": { + "model": "create:block/factory_panel/block", + "x": 180, + "y": 90 + }, + "face=ceiling,facing=west,powered=true,waterlogged=true": { + "model": "create:block/factory_panel/block", + "x": 180, + "y": 90 + }, + "face=floor,facing=east,powered=false,waterlogged=false": { + "model": "create:block/factory_panel/block", + "y": 90 + }, + "face=floor,facing=east,powered=false,waterlogged=true": { + "model": "create:block/factory_panel/block", + "y": 90 + }, + "face=floor,facing=east,powered=true,waterlogged=false": { + "model": "create:block/factory_panel/block", + "y": 90 + }, + "face=floor,facing=east,powered=true,waterlogged=true": { + "model": "create:block/factory_panel/block", + "y": 90 + }, + "face=floor,facing=north,powered=false,waterlogged=false": { + "model": "create:block/factory_panel/block" + }, + "face=floor,facing=north,powered=false,waterlogged=true": { + "model": "create:block/factory_panel/block" + }, + "face=floor,facing=north,powered=true,waterlogged=false": { + "model": "create:block/factory_panel/block" + }, + "face=floor,facing=north,powered=true,waterlogged=true": { + "model": "create:block/factory_panel/block" + }, + "face=floor,facing=south,powered=false,waterlogged=false": { + "model": "create:block/factory_panel/block", + "y": 180 + }, + "face=floor,facing=south,powered=false,waterlogged=true": { + "model": "create:block/factory_panel/block", + "y": 180 + }, + "face=floor,facing=south,powered=true,waterlogged=false": { + "model": "create:block/factory_panel/block", + "y": 180 + }, + "face=floor,facing=south,powered=true,waterlogged=true": { + "model": "create:block/factory_panel/block", + "y": 180 + }, + "face=floor,facing=west,powered=false,waterlogged=false": { + "model": "create:block/factory_panel/block", + "y": 270 + }, + "face=floor,facing=west,powered=false,waterlogged=true": { + "model": "create:block/factory_panel/block", + "y": 270 + }, + "face=floor,facing=west,powered=true,waterlogged=false": { + "model": "create:block/factory_panel/block", + "y": 270 + }, + "face=floor,facing=west,powered=true,waterlogged=true": { + "model": "create:block/factory_panel/block", + "y": 270 + }, + "face=wall,facing=east,powered=false,waterlogged=false": { + "model": "create:block/factory_panel/block", + "x": 90, + "y": 90 + }, + "face=wall,facing=east,powered=false,waterlogged=true": { + "model": "create:block/factory_panel/block", + "x": 90, + "y": 90 + }, + "face=wall,facing=east,powered=true,waterlogged=false": { + "model": "create:block/factory_panel/block", + "x": 90, + "y": 90 + }, + "face=wall,facing=east,powered=true,waterlogged=true": { + "model": "create:block/factory_panel/block", + "x": 90, + "y": 90 + }, + "face=wall,facing=north,powered=false,waterlogged=false": { + "model": "create:block/factory_panel/block", + "x": 90 + }, + "face=wall,facing=north,powered=false,waterlogged=true": { + "model": "create:block/factory_panel/block", + "x": 90 + }, + "face=wall,facing=north,powered=true,waterlogged=false": { + "model": "create:block/factory_panel/block", + "x": 90 + }, + "face=wall,facing=north,powered=true,waterlogged=true": { + "model": "create:block/factory_panel/block", + "x": 90 + }, + "face=wall,facing=south,powered=false,waterlogged=false": { + "model": "create:block/factory_panel/block", + "x": 90, + "y": 180 + }, + "face=wall,facing=south,powered=false,waterlogged=true": { + "model": "create:block/factory_panel/block", + "x": 90, + "y": 180 + }, + "face=wall,facing=south,powered=true,waterlogged=false": { + "model": "create:block/factory_panel/block", + "x": 90, + "y": 180 + }, + "face=wall,facing=south,powered=true,waterlogged=true": { + "model": "create:block/factory_panel/block", + "x": 90, + "y": 180 + }, + "face=wall,facing=west,powered=false,waterlogged=false": { + "model": "create:block/factory_panel/block", + "x": 90, + "y": 270 + }, + "face=wall,facing=west,powered=false,waterlogged=true": { + "model": "create:block/factory_panel/block", + "x": 90, + "y": 270 + }, + "face=wall,facing=west,powered=true,waterlogged=false": { + "model": "create:block/factory_panel/block", + "x": 90, + "y": 270 + }, + "face=wall,facing=west,powered=true,waterlogged=true": { + "model": "create:block/factory_panel/block", + "x": 90, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 8bc04f5eef..ff853c1e1f 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -440,6 +440,7 @@ "block.create.exposed_copper_tile_slab": "qɐןS ǝןı⟘ ɹǝddoƆ pǝsodxƎ", "block.create.exposed_copper_tile_stairs": "sɹıɐʇS ǝןı⟘ ɹǝddoƆ pǝsodxƎ", "block.create.exposed_copper_tiles": "sǝןı⟘ ɹǝddoƆ pǝsodxƎ", + "block.create.factory_panel": "ןǝuɐԀ ʎɹoʇɔɐℲ", "block.create.fake_track": "sdɐW ɹoɟ ɹǝʞɹɐW ʞɔɐɹ⟘", "block.create.fluid_pipe": "ǝdıԀ pınןℲ", "block.create.fluid_tank": "ʞuɐ⟘ pınןℲ", @@ -2862,6 +2863,7 @@ "item.create.extendo_grip.tooltip.condition1": "puɐH-ɟɟO uı uǝɥM", "item.create.extendo_grip.tooltip.condition2": "ʞuɐʇʞɔɐᗺ buıɹɐǝʍ ǝןıɥM", "item.create.extendo_grip.tooltip.summary": "‾ʞuɐʇʞɔɐᗺ‾ ɐ ɯoɹɟ ‾ǝɹnssǝɹԀ‾ ‾ɹıⱯ‾ ɥʇıʍ pǝɹǝʍod ǝq uɐƆ ˙ɹǝpןǝıʍ ǝɥʇ ɟo ‾ǝɔuɐʇsıp ɥɔɐǝɹ sǝsɐǝɹɔuı‾ ʎןʇɐǝɹ⅁", + "item.create.factory_panel_connector": "ɹoʇɔǝuuoƆ ןǝuɐԀ ʎɹoʇɔɐℲ", "item.create.filter": "ɹǝʇןıℲ ʇsıꞀ", "item.create.filter.tooltip.behaviour1": "˙‾ǝɔɐɟɹǝʇuı uoıʇɐɹnbıɟuoɔ‾ ǝɥʇ suǝdO", "item.create.filter.tooltip.condition1": "pǝʞɔıןƆ-ᴚ uǝɥM", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index b72f8c85cc..3b72ead47f 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -440,6 +440,7 @@ "block.create.exposed_copper_tile_slab": "Exposed Copper Tile Slab", "block.create.exposed_copper_tile_stairs": "Exposed Copper Tile Stairs", "block.create.exposed_copper_tiles": "Exposed Copper Tiles", + "block.create.factory_panel": "Factory Panel", "block.create.fake_track": "Track Marker for Maps", "block.create.fluid_pipe": "Fluid Pipe", "block.create.fluid_tank": "Fluid Tank", @@ -2862,6 +2863,7 @@ "item.create.extendo_grip.tooltip.condition1": "When in Off-Hand", "item.create.extendo_grip.tooltip.condition2": "While wearing Backtank", "item.create.extendo_grip.tooltip.summary": "Greatly _increases reach distance_ of the wielder. Can be powered with _Air_ _Pressure_ from a _Backtank_", + "item.create.factory_panel_connector": "Factory Panel Connector", "item.create.filter": "List Filter", "item.create.filter.tooltip.behaviour1": "Opens the _configuration interface_.", "item.create.filter.tooltip.condition1": "When R-Clicked", diff --git a/src/generated/resources/assets/create/models/item/factory_panel.json b/src/generated/resources/assets/create/models/item/factory_panel.json new file mode 100644 index 0000000000..5a5ccbca1a --- /dev/null +++ b/src/generated/resources/assets/create/models/item/factory_panel.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/factory_panel/block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/factory_panel_connector.json b/src/generated/resources/assets/create/models/item/factory_panel_connector.json new file mode 100644 index 0000000000..573e90688c --- /dev/null +++ b/src/generated/resources/assets/create/models/item/factory_panel_connector.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/factory_panel_connector" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/factory_panel_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/factory_panel_clear.json new file mode 100644 index 0000000000..46c891e915 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/factory_panel_clear.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "create:factory_panel" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/factory_panel_clear" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/factory_panel_clear" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/factory_panel.json b/src/generated/resources/data/create/loot_tables/blocks/factory_panel.json new file mode 100644 index 0000000000..d94feba672 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/factory_panel.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:factory_panel" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/factory_panel" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/factory_panel_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/factory_panel_clear.json new file mode 100644 index 0000000000..00ec03d887 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/factory_panel_clear.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "create:factory_panel" + } + ], + "result": { + "item": "create:factory_panel" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json index 32832091d9..638eb2c70b 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json @@ -128,6 +128,7 @@ "create:packager_link", "create:stock_ticker", "create:redstone_requester", + "create:factory_panel", "create:andesite_funnel", "create:andesite_belt_funnel", "create:brass_funnel", diff --git a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java index fe6cfa4603..d1eb92b0b5 100644 --- a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java +++ b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java @@ -166,6 +166,8 @@ import com.simibubi.create.content.logistics.depot.DepotRenderer; import com.simibubi.create.content.logistics.depot.EjectorBlockEntity; import com.simibubi.create.content.logistics.depot.EjectorRenderer; import com.simibubi.create.content.logistics.depot.EjectorVisual; +import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBlockEntity; +import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelRenderer; import com.simibubi.create.content.logistics.funnel.FunnelBlockEntity; import com.simibubi.create.content.logistics.funnel.FunnelRenderer; import com.simibubi.create.content.logistics.funnel.FunnelVisual; @@ -779,6 +781,12 @@ public class AllBlockEntityTypes { .renderer(() -> PlacardRenderer::new) .register(); + public static final BlockEntityEntry FACTORY_PANEL = + REGISTRATE.blockEntity("factory_panel", FactoryPanelBlockEntity::new) + .validBlocks(AllBlocks.FACTORY_PANEL) + .renderer(() -> FactoryPanelRenderer::new) + .register(); + public static final BlockEntityEntry CART_ASSEMBLER = REGISTRATE .blockEntity("cart_assembler", CartAssemblerBlockEntity::new) .validBlocks(AllBlocks.CART_ASSEMBLER) diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index a9908de79b..3b3d641f83 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -167,6 +167,7 @@ import com.simibubi.create.content.logistics.crate.CreativeCrateBlock; import com.simibubi.create.content.logistics.depot.DepotBlock; import com.simibubi.create.content.logistics.depot.EjectorBlock; import com.simibubi.create.content.logistics.depot.EjectorItem; +import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBlock; import com.simibubi.create.content.logistics.funnel.AndesiteFunnelBlock; import com.simibubi.create.content.logistics.funnel.BeltFunnelBlock; import com.simibubi.create.content.logistics.funnel.BeltFunnelGenerator; @@ -1809,6 +1810,16 @@ public class AllBlocks { .simpleItem() .register(); + public static final BlockEntry FACTORY_PANEL = + REGISTRATE.block("factory_panel", FactoryPanelBlock::new) + .initialProperties(SharedProperties::copperMetal) + .properties(p -> p.forceSolidOn()) + .transform(pickaxeOnly()) + .blockstate((c, p) -> p.horizontalFaceBlock(c.get(), AssetLookup.partialBaseModel(c, p))) + .item(LogisticallyLinkedBlockItem::new) + .transform(customItemModel("_", "block")) + .register(); + public static final BlockEntry ANDESITE_FUNNEL = REGISTRATE.block("andesite_funnel", AndesiteFunnelBlock::new) .addLayer(() -> RenderType::cutoutMipped) diff --git a/src/main/java/com/simibubi/create/AllCreativeModeTabs.java b/src/main/java/com/simibubi/create/AllCreativeModeTabs.java index d854c9f9a0..a40ff0b302 100644 --- a/src/main/java/com/simibubi/create/AllCreativeModeTabs.java +++ b/src/main/java/com/simibubi/create/AllCreativeModeTabs.java @@ -176,7 +176,8 @@ public class AllCreativeModeTabs { ); Map, ItemProviderEntry> simpleAfterOrderings = Map.of( - AllItems.VERTICAL_GEARBOX, AllBlocks.GEARBOX + AllItems.VERTICAL_GEARBOX, AllBlocks.GEARBOX, + AllItems.FACTORY_PANEL_CONNECTOR, AllBlocks.FACTORY_PANEL ); simpleBeforeOrderings.forEach((entry, otherEntry) -> { diff --git a/src/main/java/com/simibubi/create/AllItems.java b/src/main/java/com/simibubi/create/AllItems.java index 582b25abc2..e1389bb5bf 100644 --- a/src/main/java/com/simibubi/create/AllItems.java +++ b/src/main/java/com/simibubi/create/AllItems.java @@ -47,6 +47,7 @@ import com.simibubi.create.content.legacy.ShadowSteelItem; import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.content.logistics.displayCloth.DisplayClothItem; import com.simibubi.create.content.logistics.displayCloth.ShoppingListItem; +import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelConnectorItem; import com.simibubi.create.content.logistics.filter.FilterItem; import com.simibubi.create.content.materials.ExperienceNuggetItem; import com.simibubi.create.content.processing.burner.BlazeBurnerBlockItem; @@ -243,6 +244,10 @@ public class AllItems { public static final ItemEntry DISPLAY_CLOTH = REGISTRATE.item("display_cloth", DisplayClothItem::new) .register(); + + public static final ItemEntry FACTORY_PANEL_CONNECTOR = + REGISTRATE.item("factory_panel_connector", FactoryPanelConnectorItem::new) + .register(); // wrapped by COPPER_BACKTANK for block placement uses. // must be registered as of 1.18.2 diff --git a/src/main/java/com/simibubi/create/AllPackets.java b/src/main/java/com/simibubi/create/AllPackets.java index daa475049b..cad1936398 100644 --- a/src/main/java/com/simibubi/create/AllPackets.java +++ b/src/main/java/com/simibubi/create/AllPackets.java @@ -61,6 +61,9 @@ import com.simibubi.create.content.logistics.depot.EjectorPlacementPacket; import com.simibubi.create.content.logistics.depot.EjectorTriggerPacket; import com.simibubi.create.content.logistics.displayCloth.DisplayClothPacketToClient; import com.simibubi.create.content.logistics.displayCloth.DisplayClothPacketToServer; +import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelConfigurationPacket; +import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelConnectionPacket; +import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelEffectPacket; import com.simibubi.create.content.logistics.filter.FilterScreenPacket; import com.simibubi.create.content.logistics.funnel.FunnelFlapPacket; import com.simibubi.create.content.logistics.packagePort.PackagePortConfigurationPacket; @@ -190,6 +193,8 @@ public enum AllPackets { DISPLAY_CLOTH_SERVERBOUND(DisplayClothPacketToServer.class, DisplayClothPacketToServer::new, PLAY_TO_SERVER), PACKAGE_PORT_CONFIGURATION(PackagePortConfigurationPacket.class, PackagePortConfigurationPacket::new, PLAY_TO_SERVER), TRAIN_MAP_REQUEST(TrainMapSyncRequestPacket.class, TrainMapSyncRequestPacket::new, PLAY_TO_SERVER), + CONNECT_FACTORY_PANEL(FactoryPanelConnectionPacket.class, FactoryPanelConnectionPacket::new, PLAY_TO_SERVER), + CONFIGURE_FACTORY_PANEL(FactoryPanelConfigurationPacket.class, FactoryPanelConfigurationPacket::new, PLAY_TO_SERVER), // Server to Client SYMMETRY_EFFECT(SymmetryEffectPacket.class, SymmetryEffectPacket::new, PLAY_TO_CLIENT), @@ -239,6 +244,7 @@ public enum AllPackets { PACKAGE_DESTROYED(PackageDestroyPacket.class, PackageDestroyPacket::new, PLAY_TO_CLIENT), LOGISTICS_STOCK_RESPONSE(LogisticalStockResponsePacket.class, LogisticalStockResponsePacket::new, PLAY_TO_CLIENT), DISPLAY_CLOTH_CLIENTBOUND(DisplayClothPacketToClient.class, DisplayClothPacketToClient::new, PLAY_TO_CLIENT), + FACTORY_PANEL_EFFECT(FactoryPanelEffectPacket.class, FactoryPanelEffectPacket::new, PLAY_TO_CLIENT), TRAIN_MAP_SYNC(TrainMapSyncPacket.class, TrainMapSyncPacket::new, PLAY_TO_CLIENT); static { diff --git a/src/main/java/com/simibubi/create/AllPartialModels.java b/src/main/java/com/simibubi/create/AllPartialModels.java index bd48c566b5..b5eccf7950 100644 --- a/src/main/java/com/simibubi/create/AllPartialModels.java +++ b/src/main/java/com/simibubi/create/AllPartialModels.java @@ -179,6 +179,9 @@ public class AllPartialModels { WATER_WHEEL = block("water_wheel/wheel"), LARGE_WATER_WHEEL = block("large_water_wheel/block"), LARGE_WATER_WHEEL_EXTENSION = block("large_water_wheel/block_extension"), + + FACTORY_PANEL_TIMER = block("factory_panel/timer"), + FACTORY_PANEL_INPUT = block("factory_panel/input"), DISPLAY_CLOTH = entity("display_cloth"), diff --git a/src/main/java/com/simibubi/create/AllShapes.java b/src/main/java/com/simibubi/create/AllShapes.java index 689d3ba2ec..a15b3656c3 100644 --- a/src/main/java/com/simibubi/create/AllShapes.java +++ b/src/main/java/com/simibubi/create/AllShapes.java @@ -161,6 +161,9 @@ public class AllShapes { .forHorizontal(SOUTH), PLACARD = shape(2, 0, 2, 14, 3, 14).forDirectional(UP), + FACTORY_PANEL = shape(2, 0, 2, 14, 3, 14).add(0, 0, 6, 16, 3, 10) + .add(6, 0, 0, 10, 3, 16) + .forDirectional(UP), CLIPBOARD_FLOOR = shape(3, 0, 1, 13, 1, 15).forHorizontal(SOUTH), CLIPBOARD_CEILING = shape(3, 15, 1, 13, 16, 15).forHorizontal(SOUTH), diff --git a/src/main/java/com/simibubi/create/content/kinetics/crank/ValveHandleBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/crank/ValveHandleBlockEntity.java index 44b7d46ad5..9bd8f41d2b 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/crank/ValveHandleBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/crank/ValveHandleBlockEntity.java @@ -196,7 +196,9 @@ public class ValveHandleBlockEntity extends HandCrankBlockEntity { } @Override - public void onShortInteract(Player player, InteractionHand hand, Direction side) { + public void onShortInteract(Player player, InteractionHand hand, Direction side, BlockHitResult hitResult) { + if (getWorld().isClientSide) + return; BlockState blockState = blockEntity.getBlockState(); if (blockState.getBlock() instanceof ValveHandleBlock vhb) vhb.clicked(getWorld(), getPos(), blockState, player, hand); diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelAddressInputScreen.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelAddressInputScreen.java new file mode 100644 index 0000000000..2372811bc8 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelAddressInputScreen.java @@ -0,0 +1,45 @@ +package com.simibubi.create.content.logistics.factoryBoard; + +import com.simibubi.create.AllPackets; + +import net.createmod.catnip.gui.AbstractSimiScreen; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.EditBox; +import net.minecraft.network.chat.Component; + +public class FactoryPanelAddressInputScreen extends AbstractSimiScreen { + + EditBox addressBox; + private FactoryPanelConnectionBehaviour behaviour; + + public FactoryPanelAddressInputScreen(FactoryPanelConnectionBehaviour behaviour) { + this.behaviour = behaviour; + } + + @Override + protected void init() { + int sizeX = 200; + int sizeY = 20; + setWindowSize(sizeX, sizeY); + super.init(); + clearWidgets(); + addressBox = new EditBox(font, guiLeft, guiTop, sizeX, sizeY, Component.empty()); + addressBox.setValue(behaviour.address); + addRenderableWidget(addressBox); + } + + @Override + protected void renderWindow(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + // TODO Auto-generated method stub + + } + + @Override + public void removed() { + super.removed(); + AllPackets.getChannel() + .sendToServer( + new FactoryPanelConfigurationPacket(behaviour.getPos(), behaviour.side, addressBox.getValue())); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java new file mode 100644 index 0000000000..329aa3f2a8 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java @@ -0,0 +1,194 @@ +package com.simibubi.create.content.logistics.factoryBoard; + +import java.util.List; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.content.logistics.filter.FilterItem; +import com.simibubi.create.content.logistics.filter.FilterItemStack; +import com.simibubi.create.content.logistics.packager.InventorySummary; +import com.simibubi.create.content.logistics.stockTicker.StockCheckingBlockEntity; +import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform; +import com.simibubi.create.foundation.blockEntity.behaviour.ValueSettingsBoard; +import com.simibubi.create.foundation.blockEntity.behaviour.ValueSettingsFormatter; +import com.simibubi.create.foundation.blockEntity.behaviour.filtering.FilteringBehaviour; +import com.simibubi.create.foundation.utility.CreateLang; + +import dev.engine_room.flywheel.lib.transform.TransformStack; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.lang.Components; +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Direction.Axis; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; + +public class FactoryPanelBehaviour extends FilteringBehaviour { + + int lastReportedLevelInStorage; + + public FactoryPanelBehaviour(FactoryPanelBlockEntity be) { + super(be, new FactoryPanelSlotPositioning(be)); + showCount(); + count = 0; + diamondShape = true; + } + + @Override + public ValueSettingsBoard createBoard(Player player, BlockHitResult hitResult) { + int maxAmount = 100; + return new ValueSettingsBoard(CreateLang.temporaryText("Target Amount in Storage") + .component(), maxAmount, 10, + List.of(CreateLang.temporaryText("Items") + .component(), + CreateLang.temporaryText("Stacks") + .component()), + new ValueSettingsFormatter(this::formatValue)); + } + + @Override + public MutableComponent getLabel() { + return CreateLang.temporaryText("Target Amount") + .component(); + } + + @Override + public ValueSettings getValueSettings() { + return new ValueSettings(upTo ? 0 : 1, count); + } + + @Override + public MutableComponent getCountLabelForValueBox() { + if (filter.isEmpty()) + return Components.empty(); + + int inStorage = getLevelInStorage(); + String stacks = upTo ? "" : "\u25A4"; + + if (count == 0) { + return CreateLang.text(inStorage + stacks) + .color(0xF1EFE8) + .component(); + } + + return CreateLang.text(" " + inStorage + stacks) + .color(inStorage >= count ? 0xD7FFA8 : 0xFFBFA8) + .add(CreateLang.text("/") + .style(ChatFormatting.WHITE)) + .add(CreateLang.text(count + stacks + " ") + .color(0xF1EFE8)) + .component(); + } + + @Override + public void tick() { + super.tick(); + if (getWorld().isClientSide()) + return; + int levelInStorage = getLevelInStorage(); + if (lastReportedLevelInStorage != levelInStorage) { + lastReportedLevelInStorage = levelInStorage; + blockEntity.sendData(); + } + } + + private int getLevelInStorage() { + if (getWorld().isClientSide()) + return lastReportedLevelInStorage; + InventorySummary summary = ((StockCheckingBlockEntity) blockEntity).getRecentSummary(); + return summary.getCountOf(getFilter()) / (upTo ? 1 : getFilter().getMaxStackSize()); + } + + @Override + public void write(CompoundTag nbt, boolean clientPacket) { + super.write(nbt, clientPacket); + nbt.putInt("LastLevel", lastReportedLevelInStorage); + } + + @Override + public void read(CompoundTag nbt, boolean clientPacket) { + filter = FilterItemStack.of(nbt.getCompound("Filter")); + count = nbt.getInt("FilterAmount"); + upTo = nbt.getBoolean("UpTo"); + lastReportedLevelInStorage = nbt.getInt("LastLevel"); + } + + @Override + public float getRenderDistance() { + return 64; + } + + @Override + public MutableComponent formatValue(ValueSettings value) { + return value.value() == 0 ? Components.literal("*") + : Components.literal(Math.max(0, value.value()) + ((value.row() == 0) ? "" : "\u25A4")); + } + + @Override + public boolean setFilter(ItemStack stack) { + ItemStack filter = stack.copy(); + if (stack.getItem() instanceof FilterItem) + return false; + this.filter = FilterItemStack.of(filter); + blockEntity.setChanged(); + blockEntity.sendData(); + return true; + } + + @Override + public void setValueSettings(Player player, ValueSettings settings, boolean ctrlDown) { + if (getValueSettings().equals(settings)) + return; + count = Math.max(0, settings.value()); + upTo = settings.row() == 0; + blockEntity.setChanged(); + blockEntity.sendData(); + playFeedbackSound(this); + } + + private static class FactoryPanelSlotPositioning extends ValueBoxTransform { + + private FactoryPanelBlockEntity be; + + public FactoryPanelSlotPositioning(FactoryPanelBlockEntity be) { + this.be = be; + } + + @Override + public Vec3 getLocalOffset(LevelAccessor level, BlockPos pos, BlockState state) { + Vec3 vec = VecHelper.voxelSpace(8, 8, 2.5f); + vec = VecHelper.rotateCentered(vec, Mth.RAD_TO_DEG * be.getXRot(), Axis.X); + vec = VecHelper.rotateCentered(vec, Mth.RAD_TO_DEG * be.getYRot(), Axis.Y); + return vec; + } + + @Override + public boolean testHit(LevelAccessor level, BlockPos pos, BlockState state, Vec3 localHit) { + Vec3 offset = getLocalOffset(level, pos, state); + if (offset == null) + return false; + return localHit.distanceTo(offset) < scale / 3; + } + + @Override + public float getScale() { + return super.getScale() * 1.125f; + } + + @Override + public void rotate(LevelAccessor level, BlockPos pos, BlockState state, PoseStack ms) { + TransformStack.of(ms) + .rotate(be.getYRot() + Mth.PI, Direction.UP) + .rotate(-be.getXRot(), Direction.EAST); + } + + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java new file mode 100644 index 0000000000..b02a9629c7 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java @@ -0,0 +1,156 @@ +package com.simibubi.create.content.logistics.factoryBoard; + +import com.simibubi.create.AllBlockEntityTypes; +import com.simibubi.create.AllItems; +import com.simibubi.create.AllShapes; +import com.simibubi.create.content.equipment.wrench.IWrenchable; +import com.simibubi.create.foundation.block.IBE; +import com.simibubi.create.foundation.block.ProperWaterloggedBlock; + +import net.createmod.catnip.utility.Pointing; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.FaceAttachedHorizontalDirectionalBlock; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition.Builder; +import net.minecraft.world.level.block.state.properties.AttachFace; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; + +public class FactoryPanelBlock extends FaceAttachedHorizontalDirectionalBlock + implements ProperWaterloggedBlock, IBE, IWrenchable { + + public static final BooleanProperty POWERED = BlockStateProperties.POWERED; + + public FactoryPanelBlock(Properties p_53182_) { + super(p_53182_); + registerDefaultState(defaultBlockState().setValue(WATERLOGGED, false) + .setValue(POWERED, false)); + } + + @Override + protected void createBlockStateDefinition(Builder pBuilder) { + super.createBlockStateDefinition(pBuilder.add(FACE, FACING, WATERLOGGED, POWERED)); + } + + @Override + public boolean canSurvive(BlockState pState, LevelReader pLevel, BlockPos pPos) { + return canAttachLenient(pLevel, pPos, getConnectedDirection(pState).getOpposite()); + } + + public static boolean canAttachLenient(LevelReader pReader, BlockPos pPos, Direction pDirection) { + BlockPos blockpos = pPos.relative(pDirection); + return !pReader.getBlockState(blockpos) + .getCollisionShape(pReader, blockpos) + .isEmpty(); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext pContext) { + BlockState stateForPlacement = super.getStateForPlacement(pContext); + if (stateForPlacement == null) + return null; + if (stateForPlacement.getValue(FACE) == AttachFace.FLOOR) + stateForPlacement = stateForPlacement.setValue(FACING, stateForPlacement.getValue(FACING) + .getOpposite()); + return withWater(stateForPlacement, pContext); + } + + @Override + public boolean isSignalSource(BlockState pState) { + return true; + } + + @Override + public int getSignal(BlockState pBlockState, BlockGetter pBlockAccess, BlockPos pPos, Direction pSide) { + return pBlockState.getValue(POWERED) ? 15 : 0; + } + + @Override + public int getDirectSignal(BlockState pBlockState, BlockGetter pBlockAccess, BlockPos pPos, Direction pSide) { + return pBlockState.getValue(POWERED) && getConnectedDirection(pBlockState) == pSide ? 15 : 0; + } + + @Override + public VoxelShape getShape(BlockState pState, BlockGetter pLevel, BlockPos pPos, CollisionContext pContext) { + return AllShapes.FACTORY_PANEL.get(getConnectedDirection(pState)); + } + + @Override + public BlockState updateShape(BlockState pState, Direction pFacing, BlockState pFacingState, LevelAccessor pLevel, + BlockPos pCurrentPos, BlockPos pFacingPos) { + updateWater(pLevel, pState, pCurrentPos); + return super.updateShape(pState, pFacing, pFacingState, pLevel, pCurrentPos, pFacingPos); + } + + @Override + public FluidState getFluidState(BlockState pState) { + return fluidState(pState); + } + + public static Direction connectedDirection(BlockState state) { + return getConnectedDirection(state); + } + + @Override + public InteractionResult use(BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, + BlockHitResult pHit) { + if (pPlayer != null && AllItems.FACTORY_PANEL_CONNECTOR.isIn(pPlayer.getItemInHand(pHand))) + return InteractionResult.PASS; + return InteractionResult.SUCCESS; + } + + @Override + public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pIsMoving) { + boolean blockChanged = !pState.is(pNewState.getBlock()); + if (!pIsMoving && blockChanged) + if (pState.getValue(POWERED)) + updateNeighbours(pState, pLevel, pPos); + + if (pState.hasBlockEntity() && (blockChanged || !pNewState.hasBlockEntity())) + pLevel.removeBlockEntity(pPos); + } + + public static void updateNeighbours(BlockState pState, Level pLevel, BlockPos pPos) { + pLevel.updateNeighborsAt(pPos, pState.getBlock()); + pLevel.updateNeighborsAt(pPos.relative(getConnectedDirection(pState).getOpposite()), pState.getBlock()); + } + + public static Direction getDirection(BlockState state, Pointing side) { + Direction direction = getConnectedDirection(state).getOpposite(); + Direction hDirection = state.getValue(FACING); + + if (direction == Direction.UP) + side = Pointing.values()[(side.ordinal() + hDirection.getOpposite() + .get2DDataValue()) % 4]; + if (direction == Direction.DOWN) + side = Pointing.values()[(side.ordinal() + 6 - hDirection.get2DDataValue()) % 4]; + + return side.getCombinedDirection(direction); + } + + @Override + public Class getBlockEntityClass() { + return FactoryPanelBlockEntity.class; + } + + @Override + public BlockEntityType getBlockEntityType() { + return AllBlockEntityTypes.FACTORY_PANEL.get(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java new file mode 100644 index 0000000000..4c6048eaf2 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java @@ -0,0 +1,145 @@ +package com.simibubi.create.content.logistics.factoryBoard; + +import java.util.EnumMap; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.joml.Math; + +import com.simibubi.create.content.logistics.stockTicker.StockCheckingBlockEntity; +import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; + +import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.utility.math.AngleHelper; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.nbt.Tag; +import net.minecraft.util.Mth; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.AttachFace; + +public class FactoryPanelBlockEntity extends StockCheckingBlockEntity { + + public FactoryPanelBehaviour behaviour; + + public EnumMap> inboundConnections = new EnumMap<>(Pointing.class); + public EnumMap connections; + + public boolean satisfied; + + public FactoryPanelBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { + super(type, pos, state); + satisfied = false; + } + + @Override + public void addBehaviours(List behaviours) { + super.addBehaviours(behaviours); + behaviours.add(behaviour = new FactoryPanelBehaviour(this)); + connections = new EnumMap<>(Pointing.class); + for (Pointing side : Pointing.values()) { + FactoryPanelConnectionBehaviour e = new FactoryPanelConnectionBehaviour(this, side); + connections.put(side, e); + behaviours.add(e); + } + } + + public void addConnection(BlockPos fromPos, Pointing fromSide, Pointing toSide) { + if (level.getBlockEntity(fromPos) instanceof FactoryPanelBlockEntity fpbe) + fpbe.activateInput(fromSide); + inboundConnections.computeIfAbsent(toSide, $ -> new HashMap<>()) + .put(fromPos.subtract(worldPosition), new FactoryPanelConnection(fromSide)); + connections.get(toSide) + .setValue(Math.max(connections.get(toSide) + .getValue(), 200)); + notifyUpdate(); + } + + public void activateInput(Pointing onSide) { + connections.get(onSide).inputModeActive = true; + notifyUpdate(); + } + + public boolean isInput(Pointing onSide) { + return connections.get(onSide).inputModeActive; + } + + public boolean hasInboundConnections(Pointing onSide) { + return inboundConnections.containsKey(onSide); + } + + @Override + public void tick() { + super.tick(); + if (level.isClientSide) + return; + + ItemStack filter = behaviour.getFilter(); + if (filter.isEmpty() || behaviour.getAmount() == 0) { + setSatisfied(true); + return; + } + + setSatisfied(getRecentSummary().getCountOf(filter) >= behaviour.getAmount() + * (behaviour.upTo ? 1 : filter.getMaxStackSize())); + } + + public void setSatisfied(boolean satisfied) { + if (this.satisfied == satisfied) + return; + this.satisfied = satisfied; + notifyUpdate(); + } + + @Override + protected void write(CompoundTag tag, boolean clientPacket) { + super.write(tag, clientPacket); + tag.putBoolean("Satisfied", satisfied); + + tag.put("Sides", NBTHelper.writeCompoundList(inboundConnections.entrySet(), e -> { + CompoundTag nbt = new CompoundTag(); + nbt.put("Connections", NBTHelper.writeCompoundList(e.getValue() + .entrySet(), e2 -> { + CompoundTag nbt2 = e2.getValue() + .write(); + nbt2.put("Pos", NbtUtils.writeBlockPos(e2.getKey())); + return nbt2; + })); + nbt.putString("Side", e.getKey() + .name()); + return nbt; + })); + } + + @Override + protected void read(CompoundTag tag, boolean clientPacket) { + super.read(tag, clientPacket); + satisfied = tag.getBoolean("Satisfied"); + + inboundConnections.clear(); + NBTHelper.iterateCompoundList(tag.getList("Sides", Tag.TAG_COMPOUND), nbt -> { + HashMap map = new HashMap<>(); + NBTHelper.iterateCompoundList(nbt.getList("Connections", Tag.TAG_COMPOUND), + nbt2 -> map.put(NbtUtils.readBlockPos(nbt2.getCompound("Pos")), FactoryPanelConnection.read(nbt2))); + inboundConnections.put(Pointing.valueOf(nbt.getString("Side")), map); + }); + } + + public float getYRot() { + Direction facing = getBlockState().getValue(FactoryPanelBlock.FACING); + AttachFace face = getBlockState().getValue(FactoryPanelBlock.FACE); + return (face == AttachFace.CEILING ? Mth.PI : 0) + AngleHelper.rad(AngleHelper.horizontalAngle(facing)); + } + + public float getXRot() { + AttachFace face = getBlockState().getValue(FactoryPanelBlock.FACE); + return face == AttachFace.CEILING ? Mth.PI / 2 : face == AttachFace.FLOOR ? -Mth.PI / 2 : 0; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConfigurationPacket.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConfigurationPacket.java new file mode 100644 index 0000000000..69a396d08f --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConfigurationPacket.java @@ -0,0 +1,45 @@ +package com.simibubi.create.content.logistics.factoryBoard; + +import com.simibubi.create.foundation.networking.BlockEntityConfigurationPacket; + +import net.createmod.catnip.utility.Pointing; +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; + +public class FactoryPanelConfigurationPacket extends BlockEntityConfigurationPacket { + + private Pointing side; + private String address; + + public FactoryPanelConfigurationPacket(BlockPos pos, Pointing side, String address) { + super(pos); + this.side = side; + this.address = address; + } + + public FactoryPanelConfigurationPacket(FriendlyByteBuf buffer) { + super(buffer); + } + + @Override + protected void writeSettings(FriendlyByteBuf buffer) { + buffer.writeVarInt(side.ordinal()); + buffer.writeUtf(address); + } + + @Override + protected void readSettings(FriendlyByteBuf buffer) { + side = Pointing.values()[buffer.readVarInt()]; + address = buffer.readUtf(); + } + + @Override + protected void applySettings(FactoryPanelBlockEntity be) { + FactoryPanelConnectionBehaviour behaviour = be.connections.get(side); + if (behaviour != null) { + behaviour.address = address; + be.notifyUpdate(); + } + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnection.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnection.java new file mode 100644 index 0000000000..523f18f9fc --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnection.java @@ -0,0 +1,18 @@ +package com.simibubi.create.content.logistics.factoryBoard; + +import net.createmod.catnip.utility.Pointing; +import net.minecraft.nbt.CompoundTag; + +public record FactoryPanelConnection(Pointing fromSide) { + + public static FactoryPanelConnection read(CompoundTag nbt) { + return new FactoryPanelConnection(Pointing.valueOf(nbt.getString("FromSide"))); + } + + public CompoundTag write() { + CompoundTag nbt = new CompoundTag(); + nbt.putString("FromSide", fromSide.name()); + return nbt; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionBehaviour.java new file mode 100644 index 0000000000..26c6cdb5ef --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionBehaviour.java @@ -0,0 +1,307 @@ +package com.simibubi.create.content.logistics.factoryBoard; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map.Entry; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.AllItems; +import com.simibubi.create.AllPackets; +import com.simibubi.create.content.logistics.packager.InventorySummary; +import com.simibubi.create.content.logistics.stockTicker.PackageOrder; +import com.simibubi.create.foundation.blockEntity.behaviour.BehaviourType; +import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform; +import com.simibubi.create.foundation.blockEntity.behaviour.ValueSettingsBoard; +import com.simibubi.create.foundation.blockEntity.behaviour.ValueSettingsFormatter; +import com.simibubi.create.foundation.blockEntity.behaviour.scrollValue.ScrollValueBehaviour; +import com.simibubi.create.foundation.utility.CreateLang; + +import dev.engine_room.flywheel.lib.transform.TransformStack; +import net.createmod.catnip.gui.ScreenOpener; +import net.createmod.catnip.utility.IntAttached; +import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.lang.Components; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Direction.Axis; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.util.Mth; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.fml.DistExecutor; + +public class FactoryPanelConnectionBehaviour extends ScrollValueBehaviour { + + public static final BehaviourType UP = new BehaviourType<>(); + public static final BehaviourType DOWN = new BehaviourType<>(); + public static final BehaviourType LEFT = new BehaviourType<>(); + public static final BehaviourType RIGHT = new BehaviourType<>(); + + public boolean inputModeActive; + public String address; + public Pointing side; + + private int timer; + + public FactoryPanelConnectionBehaviour(FactoryPanelBlockEntity be, Pointing side) { + super(Components.empty(), be, new FactoryPanelConnectionSlotPositioning(be, side)); + this.side = side; + onlyActiveWhen(() -> inputModeActive || be.hasInboundConnections(side)); + withFormatter(value -> inputModeActive ? formatInputSlot(value) : formatTimerSlot(value)); + inputModeActive = false; + setValue(1); + address = ""; + } + + @Override + public void tick() { + super.tick(); + if (getWorld().isClientSide) + return; + if (!(blockEntity instanceof FactoryPanelBlockEntity fpbe)) + return; + if (!fpbe.hasInboundConnections(side) || fpbe.satisfied) + return; + if (value < 20) + return; + if (timer > 0) { + timer = Math.min(timer, value); + timer--; + return; + } + + timer = value; + + InventorySummary summary = fpbe.getAccurateSummary(); + boolean failed = false; + + ArrayList> toRequest = new ArrayList<>(); + for (Entry entry : fpbe.inboundConnections.get(side) + .entrySet()) { + BlockPos targetPos = getPos().offset(entry.getKey()); + if (!getWorld().isLoaded(targetPos)) + return; + if (!(getWorld().getBlockEntity(targetPos) instanceof FactoryPanelBlockEntity fpbe2)) + continue; + Pointing fromSide = entry.getValue() + .fromSide(); + FactoryPanelConnectionBehaviour connectionBehaviour = fpbe2.connections.get(fromSide); + ItemStack item = fpbe2.behaviour.getFilter(); + if (connectionBehaviour.value == 0 || item.isEmpty()) + continue; + if (summary.getCountOf(item) < connectionBehaviour.value) { + sendEffect(targetPos, fromSide, getPos(), side, false); + failed = true; + continue; + } + + toRequest.add(IntAttached.with(connectionBehaviour.value, item)); + sendEffect(targetPos, fromSide, getPos(), side, true); + } + + if (failed) + return; + + PackageOrder order = new PackageOrder(toRequest); + fpbe.broadcastPackageRequest(order, null, address); + } + + private void sendEffect(BlockPos fromPos, Pointing fromSide, BlockPos toPos, Pointing toSide, boolean success) { + AllPackets.sendToNear(getWorld(), getPos(), 64, + new FactoryPanelEffectPacket(fromPos, fromSide, toPos, toSide, success)); + } + + @Override + public BehaviourType getType() { + return getTypeForSide(side); + } + + public static BehaviourType getTypeForSide(Pointing side) { + return switch (side) { + case DOWN -> DOWN; + case LEFT -> LEFT; + case RIGHT -> RIGHT; + case UP -> UP; + }; + } + + // + + @Override + public ValueSettingsBoard createBoard(Player player, BlockHitResult hitResult) { + if (inputModeActive) { + return new ValueSettingsBoard(CreateLang.temporaryText("Amount per Shipment") + .component(), 64, 16, + List.of(CreateLang.temporaryText("Items") + .component()), + new ValueSettingsFormatter(this::formatInputSettings)); + } + return new ValueSettingsBoard(CreateLang.temporaryText("Request inputs every...") + .component(), 60, 10, CreateLang.translatedOptions("generic.unit", "seconds", "minutes"), + new ValueSettingsFormatter(this::formatTimerSettings)); + } + + @Override + public void onShortInteract(Player player, InteractionHand hand, Direction side, BlockHitResult hitResult) { + ItemStack itemInHand = player.getItemInHand(hand); + if (AllItems.FACTORY_PANEL_CONNECTOR.isIn(itemInHand)) + itemInHand.useOn(new UseOnContext(player, hand, hitResult)); + else if (!inputModeActive) + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> displayScreen(player)); + } + + @Override + public void setValueSettings(Player player, ValueSettings valueSetting, boolean ctrlHeld) { + int value = valueSetting.value(); + int multiplier = inputModeActive ? 1 : switch (valueSetting.row()) { + case 0 -> 20; + default -> 60 * 20; + }; + if (!valueSetting.equals(getValueSettings())) + playFeedbackSound(this); + setValue(Math.max(1, Math.max(1, value) * multiplier)); + } + + @Override + public ValueSettings getValueSettings() { + int row = 0; + int value = this.value; + + if (value > 60 * 20) { + value = value / (60 * 20); + row = 1; + } else if (value > 60) { + value = value / 20; + row = 0; + } + + return new ValueSettings(row, value); + } + + @Override + public void setValue(int value) { + if (value == this.value) + return; + this.value = value; + blockEntity.setChanged(); + blockEntity.sendData(); + } + + public MutableComponent formatTimerSettings(ValueSettings settings) { + int value = Math.max(1, settings.value()); + return Components.literal(switch (settings.row()) { + case 0 -> "0:" + (value < 10 ? "0" : "") + value; + default -> value + ":00"; + }); + } + + public MutableComponent formatInputSettings(ValueSettings settings) { + int value = Math.max(1, settings.value()); + return Components.literal(value + ""); + } + + private String formatTimerSlot(int value) { + if (value < 20 * 60) + return (value / 20) + "s"; + return (value / 20 / 60) + "m"; + } + + private String formatInputSlot(int value) { + return String.valueOf(value); + } + + @Override + public String getClipboardKey() { + return "FactoryConnections"; + } + + // + + @Override + public void write(CompoundTag nbt, boolean clientPacket) { + String sideName = side.getSerializedName(); + if (inputModeActive) + NBTHelper.putMarker(nbt, sideName + "Input"); + else { + nbt.putInt(sideName + "Timer", timer); + nbt.putString(sideName + "Address", address); + } + nbt.putInt(sideName + "ScrollValue", value); + } + + @Override + public void read(CompoundTag nbt, boolean clientPacket) { + String sideName = side.getSerializedName(); + inputModeActive = nbt.getBoolean(sideName + "Input"); + value = nbt.getInt(sideName + "ScrollValue"); + address = nbt.getString(sideName + "Address"); + timer = nbt.getInt(sideName + "Timer"); + + if (!clientPacket) + return; + label = inputModeActive ? CreateLang.temporaryText("Amount per Shipment") + .component() + : CreateLang.temporaryText("Request rate") + .component(); + } + + @Override + public int netId() { + return 2 + side.ordinal(); + } + + @OnlyIn(value = Dist.CLIENT) + protected void displayScreen(Player player) { + if (player instanceof LocalPlayer) + ScreenOpener.open(new FactoryPanelAddressInputScreen(this)); + } + + private static class FactoryPanelConnectionSlotPositioning extends ValueBoxTransform { + + private FactoryPanelBlockEntity be; + private Pointing side; + + public FactoryPanelConnectionSlotPositioning(FactoryPanelBlockEntity be, Pointing side) { + this.be = be; + this.side = side; + } + + @Override + public boolean testHit(LevelAccessor level, BlockPos pos, BlockState state, Vec3 localHit) { + Vec3 offset = getLocalOffset(level, pos, state); + if (offset == null) + return false; + return localHit.distanceTo(offset) < scale / 4; + } + + @Override + public Vec3 getLocalOffset(LevelAccessor level, BlockPos pos, BlockState state) { + Vec3 vec = VecHelper.voxelSpace(8, 14, 2.5f); + vec = VecHelper.rotateCentered(vec, -side.getXRotation(), Axis.Z); + vec = VecHelper.rotateCentered(vec, Mth.RAD_TO_DEG * be.getXRot(), Axis.X); + vec = VecHelper.rotateCentered(vec, Mth.RAD_TO_DEG * be.getYRot(), Axis.Y); + return vec; + } + + @Override + public void rotate(LevelAccessor level, BlockPos pos, BlockState state, PoseStack ms) { + TransformStack.of(ms) + .rotate(be.getYRot() + Mth.PI, Direction.UP) + .rotate(-be.getXRot(), Direction.EAST); + } + + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionPacket.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionPacket.java new file mode 100644 index 0000000000..c0cfdfd898 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionPacket.java @@ -0,0 +1,50 @@ +package com.simibubi.create.content.logistics.factoryBoard; + +import com.simibubi.create.foundation.networking.BlockEntityConfigurationPacket; + +import net.createmod.catnip.utility.Pointing; +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; + +public class FactoryPanelConnectionPacket extends BlockEntityConfigurationPacket { + + private BlockPos fromPos; + private Pointing fromSide; + private Pointing toSide; + + public FactoryPanelConnectionPacket(BlockPos fromPos, Pointing fromSide, BlockPos toPos, Pointing toSide) { + super(toPos); + this.fromPos = fromPos; + this.fromSide = fromSide; + this.toSide = toSide; + } + + public FactoryPanelConnectionPacket(FriendlyByteBuf buffer) { + super(buffer); + } + + @Override + protected void writeSettings(FriendlyByteBuf buffer) { + buffer.writeBlockPos(fromPos); + buffer.writeVarInt(fromSide.ordinal()); + buffer.writeVarInt(toSide.ordinal()); + } + + @Override + protected void readSettings(FriendlyByteBuf buffer) { + fromPos = buffer.readBlockPos(); + fromSide = Pointing.values()[buffer.readVarInt()]; + toSide = Pointing.values()[buffer.readVarInt()]; + } + + @Override + protected void applySettings(FactoryPanelBlockEntity be) { + be.addConnection(fromPos, fromSide, toSide); + } + + @Override + protected int maxRange() { + return super.maxRange() * 2; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectorItem.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectorItem.java new file mode 100644 index 0000000000..44b106efc9 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectorItem.java @@ -0,0 +1,95 @@ +package com.simibubi.create.content.logistics.factoryBoard; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllPackets; + +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.Pointing; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; + +public class FactoryPanelConnectorItem extends Item { + + static BlockPos connectingFrom; + static Pointing connectingFromSide; + + public FactoryPanelConnectorItem(Properties pProperties) { + super(pProperties); + } + + @Override + public InteractionResult useOn(UseOnContext pContext) { + BlockPos pos = pContext.getClickedPos(); + Level level = pContext.getLevel(); + BlockState blockState = level.getBlockState(pos); + + if (!AllBlocks.FACTORY_PANEL.has(blockState)) + return super.useOn(pContext); + if (!level.isClientSide()) + return InteractionResult.SUCCESS; + + Direction direction = FactoryPanelBlock.connectedDirection(blockState) + .getOpposite(); + Vec3 clickLocation = pContext.getClickLocation(); + + if (connectingFrom == null) { + connectingFrom = pos; + connectingFromSide = getTargetedSide(pos, direction, blockState, clickLocation); + return InteractionResult.SUCCESS; + } + + BlockPos connectingTo = pos; + Pointing connectingToSide = getTargetedSide(pos, direction, blockState, clickLocation); + + if (connectingTo.equals(connectingFrom)) + return InteractionResult.SUCCESS; + + BlockPos connectingFromPos = connectingFrom; + connectingFrom = null; + + BlockState blockStateFrom = level.getBlockState(connectingFromPos); + + if (!AllBlocks.FACTORY_PANEL.has(blockStateFrom)) + return InteractionResult.SUCCESS; + if (blockStateFrom != blockState) + return InteractionResult.SUCCESS; + + AllPackets.getChannel() + .sendToServer(new FactoryPanelConnectionPacket(connectingFromPos, connectingFromSide, connectingTo, + connectingToSide)); + + return InteractionResult.SUCCESS; + } + + private Pointing getTargetedSide(BlockPos pos, Direction direction, BlockState blockState, Vec3 clickLocation) { + double bestDistance = 0; + Direction bestDirection = null; + Vec3 diffFromCenter = clickLocation.subtract(Vec3.atCenterOf(pos)); + for (Direction side : Iterate.directions) { + if (side.getAxis() == direction.getAxis()) + continue; + double diff = side.getAxis() + .choose(diffFromCenter.x, diffFromCenter.y, diffFromCenter.z) + * side.getAxisDirection() + .getStep(); + if (diff < bestDistance) + continue; + bestDistance = diff; + bestDirection = side; + } + + Pointing result = Pointing.UP; + for (Pointing p : Pointing.values()) + if (FactoryPanelBlock.getDirection(blockState, p) == bestDirection) + result = p; + + return result; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelEffectPacket.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelEffectPacket.java new file mode 100644 index 0000000000..aa39fd8209 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelEffectPacket.java @@ -0,0 +1,60 @@ +package com.simibubi.create.content.logistics.factoryBoard; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.foundation.networking.SimplePacketBase; + +import net.createmod.catnip.utility.Pointing; +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.network.NetworkEvent.Context; + +public class FactoryPanelEffectPacket extends SimplePacketBase { + + private BlockPos fromPos; + private Pointing fromSide; + private Pointing toSide; + private BlockPos toPos; + private boolean success; + + public FactoryPanelEffectPacket(BlockPos fromPos, Pointing fromSide, BlockPos toPos, Pointing toSide, + boolean success) { + this.fromPos = fromPos; + this.fromSide = fromSide; + this.toPos = toPos; + this.toSide = toSide; + this.success = success; + } + + public FactoryPanelEffectPacket(FriendlyByteBuf buffer) { + toPos = buffer.readBlockPos(); + fromPos = buffer.readBlockPos(); + fromSide = Pointing.values()[buffer.readVarInt()]; + toSide = Pointing.values()[buffer.readVarInt()]; + success = buffer.readBoolean(); + } + + @Override + public void write(FriendlyByteBuf buffer) { + buffer.writeBlockPos(toPos); + buffer.writeBlockPos(fromPos); + buffer.writeVarInt(fromSide.ordinal()); + buffer.writeVarInt(toSide.ordinal()); + buffer.writeBoolean(success); + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean handle(Context context) { + ClientLevel level = Minecraft.getInstance().level; + BlockState blockState = level.getBlockState(fromPos); + if (!AllBlocks.FACTORY_PANEL.has(blockState)) + return true; + FactoryPanelRenderer.renderConnection(blockState, fromPos, toPos, fromSide, toSide, success, true); + return true; + } +} diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelRenderer.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelRenderer.java new file mode 100644 index 0000000000..ab3442f5f2 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelRenderer.java @@ -0,0 +1,120 @@ +package com.simibubi.create.content.logistics.factoryBoard; + +import org.apache.commons.lang3.tuple.Pair; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.AllPartialModels; +import com.simibubi.create.foundation.blockEntity.renderer.SmartBlockEntityRenderer; + +import net.createmod.catnip.CatnipClient; +import net.createmod.catnip.render.CachedBuffers; +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.Pointing; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider.Context; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.util.Mth; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; + +public class FactoryPanelRenderer extends SmartBlockEntityRenderer { + + public FactoryPanelRenderer(Context context) { + super(context); + } + + @Override + protected void renderSafe(FactoryPanelBlockEntity be, float partialTicks, PoseStack ms, MultiBufferSource buffer, + int light, int overlay) { + super.renderSafe(be, partialTicks, ms, buffer, light, overlay); + + be.connections.forEach((fromSide, behaviour) -> { + if (behaviour.inputModeActive) + renderAttachment(be, fromSide, true, ms, buffer, light, overlay); + }); + + be.inboundConnections.forEach((toSide, map) -> { + map.forEach((fromPos, connection) -> renderConnection(be.getBlockState(), fromPos.offset(be.getBlockPos()), + be.getBlockPos(), connection.fromSide(), toSide, be.satisfied, false)); + renderAttachment(be, toSide, false, ms, buffer, light, overlay); + }); + } + + private void renderAttachment(FactoryPanelBlockEntity be, Pointing side, boolean input, PoseStack ms, + MultiBufferSource buffer, int light, int overlay) { + ms.pushPose(); + + float offset = 6 / 16f; + + CachedBuffers + .partial(input ? AllPartialModels.FACTORY_PANEL_INPUT : AllPartialModels.FACTORY_PANEL_TIMER, + be.getBlockState()) + .rotateCentered(be.getYRot() + Mth.PI, Direction.UP) + .rotateCentered(-be.getXRot(), Direction.EAST) + .translate(0, side == Pointing.UP ? offset : side == Pointing.DOWN ? -offset : 0, 0) + .translate(side == Pointing.LEFT ? offset : side == Pointing.RIGHT ? -offset : 0, 0, 0) + .light(light) + .overlay(overlay) + .renderInto(ms, buffer.getBuffer(RenderType.solid())); + + ms.popPose(); + } + + public static void renderConnection(BlockState blockState, BlockPos fromPos, BlockPos toPos, Pointing fromSide, + Pointing toSide, boolean satisfied, boolean effect) { + Direction facing = FactoryPanelBlock.connectedDirection(blockState); + Vec3 facingNormal = Vec3.atLowerCornerOf(facing.getNormal()); + Vec3 offset = Vec3.atCenterOf(BlockPos.ZERO) + .add(facingNormal.scale(-0.375)); + + int color = satisfied ? 0x85E59B : (AnimationTickHolder.getTicks() % 16 >= 8) ? 0x7783A8 : 0x687291; + + if (effect) + color = satisfied ? 0xEAF2EC : 0xE5654B; + + Pointing currentDirection = fromSide; + BlockPos currentPos = fromPos; + BlockPos targetPos = toPos.relative(FactoryPanelBlock.getDirection(blockState, toSide)); + + for (int i = 0; i < 100; i++) { + BlockPos nextPos = currentPos.relative(FactoryPanelBlock.getDirection(blockState, currentDirection)); + + Vec3 fromOffset = Vec3.atLowerCornerOf(currentPos) + .add(offset); + Vec3 toOffset = Vec3.atLowerCornerOf(nextPos) + .add(offset); + + Pair> key = + Pair.of(currentPos.hashCode() + 13 * nextPos.hashCode(), Pair.of(effect, effect ? satisfied : true)); + + CatnipClient.OUTLINER.showLine(key, fromOffset, toOffset) + .lineWidth(effect ? (satisfied ? 3f / 32f : 3.5f / 32f) : 2 / 32f) + .colored(color); + + if (currentPos.equals(targetPos)) + break; + + currentPos = nextPos; + + if (currentPos.equals(targetPos)) { + currentDirection = Pointing.values()[(toSide.ordinal() + 2) % 4]; + continue; + } + + for (Pointing p : Pointing.values()) { + if (p != currentDirection && Math.abs(p.ordinal() - currentDirection.ordinal()) % 2 == 0) + continue; + if (currentPos.relative(FactoryPanelBlock.getDirection(blockState, p)) + .distManhattan(targetPos) < currentPos + .relative(FactoryPanelBlock.getDirection(blockState, currentDirection)) + .distManhattan(targetPos)) + currentDirection = p; + } + + } + + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/InventorySummary.java b/src/main/java/com/simibubi/create/content/logistics/packager/InventorySummary.java index 2317628715..74adf837a2 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/InventorySummary.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/InventorySummary.java @@ -29,9 +29,12 @@ public class InventorySummary { private Map>> items = new IdentityHashMap<>(); private List> stacksByCount; private int totalCount; + + public int contributingLinks; public void add(InventorySummary summary) { summary.items.forEach((i, list) -> list.forEach(this::add)); + contributingLinks += summary.contributingLinks; } public void add(ItemStack stack) { diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java index 8f5d9ff35c..1fccddbfa6 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java @@ -38,11 +38,37 @@ public class LogisticallyLinkedBehaviour extends BlockEntityBehaviour { // - public static final Cache>> LINKS = + private static final Cache>> LINKS = CacheBuilder.newBuilder() .expireAfterAccess(1, TimeUnit.SECONDS) .build(); + private static final Cache SUMMARIES = CacheBuilder.newBuilder() + .expireAfterWrite(1, TimeUnit.SECONDS) + .build(); + + private static final Cache ACCURATE_SUMMARIES = CacheBuilder.newBuilder() + .expireAfterWrite(100, TimeUnit.MILLISECONDS) + .build(); + + public InventorySummary getSummaryOfNetwork(boolean accurate) { + try { + return (accurate ? ACCURATE_SUMMARIES : SUMMARIES).get(freqId, () -> { + InventorySummary summaryOfLinks = new InventorySummary(); + getAllConnectedAvailableLinks(false).forEach(link -> { + InventorySummary summary = link.getSummary(); + if (summary != InventorySummary.EMPTY) + summaryOfLinks.contributingLinks++; + summaryOfLinks.add(summary); + }); + return summaryOfLinks; + }); + } catch (ExecutionException e) { + e.printStackTrace(); + } + return InventorySummary.EMPTY; + } + public static Collection getAllPresent(UUID freq, boolean sortByPriority) { Cache> cache = LINKS.getIfPresent(freq); if (cache == null) diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockCheckingBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockCheckingBlockEntity.java index fcd6f71d48..92cefe65b8 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockCheckingBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockCheckingBlockEntity.java @@ -1,29 +1,29 @@ package com.simibubi.create.content.logistics.stockTicker; +import java.util.ArrayList; import java.util.List; +import org.apache.commons.lang3.mutable.MutableBoolean; + import com.simibubi.create.content.logistics.packager.InventorySummary; import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedBehaviour; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; +import net.createmod.catnip.utility.IntAttached; import net.minecraft.core.BlockPos; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.items.IItemHandler; public abstract class StockCheckingBlockEntity extends SmartBlockEntity { public LogisticallyLinkedBehaviour behaviour; - protected InventorySummary summaryOfLinks; - protected int activeLinksLastSummary; - protected int ticksSinceLastSummary; - public StockCheckingBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); setLazyTickRate(10); - ticksSinceLastSummary = 15; - activeLinksLastSummary = 0; } @Override @@ -31,32 +31,56 @@ public abstract class StockCheckingBlockEntity extends SmartBlockEntity { behaviours.add(behaviour = new LogisticallyLinkedBehaviour(this)); } - @Override - public void tick() { - super.tick(); - if (level.isClientSide()) - return; - if (ticksSinceLastSummary < 15) - ticksSinceLastSummary++; - } - public InventorySummary getRecentSummary() { - if (summaryOfLinks == null || ticksSinceLastSummary >= 15) - refreshInventorySummary(); - return summaryOfLinks; + return behaviour.getSummaryOfNetwork(false); } - public void refreshInventorySummary() { - ticksSinceLastSummary = 0; - activeLinksLastSummary = 0; - summaryOfLinks = new InventorySummary(); - behaviour.getAllConnectedAvailableLinks(false) - .forEach(link -> { - InventorySummary summary = link.getSummary(); - if (summary != InventorySummary.EMPTY) - activeLinksLastSummary++; - summaryOfLinks.add(summary); - }); + public InventorySummary getAccurateSummary() { + return behaviour.getSummaryOfNetwork(true); + } + + public void broadcastPackageRequest(PackageOrder order, IItemHandler ignoredHandler, String address) { + List> stacks = order.stacks(); + + // Packages need to track their index and successors for successful defrag + Iterable availableLinks = behaviour.getAllConnectedAvailableLinks(true); + List usedLinks = new ArrayList<>(); + MutableBoolean finalLinkTracker = new MutableBoolean(false); + + // First box needs to carry the order specifics for successful defrag + PackageOrder contextToSend = order; + + // Packages from future orders should not be merged in the packager queue + int orderId = level.random.nextInt(); + + for (int i = 0; i < stacks.size(); i++) { + IntAttached entry = stacks.get(i); + int remainingCount = entry.getFirst(); + boolean finalEntry = i == stacks.size() - 1; + ItemStack requestedItem = entry.getSecond(); + + for (LogisticallyLinkedBehaviour link : availableLinks) { + int usedIndex = usedLinks.indexOf(link); + int linkIndex = usedIndex == -1 ? usedLinks.size() : usedIndex; + MutableBoolean isFinalLink = new MutableBoolean(false); + if (linkIndex == usedLinks.size() - 1) + isFinalLink = finalLinkTracker; + + int processedCount = link.processRequest(requestedItem, remainingCount, address, linkIndex, isFinalLink, + orderId, contextToSend, ignoredHandler); + if (processedCount > 0 && usedIndex == -1) { + contextToSend = null; + usedLinks.add(link); + finalLinkTracker = isFinalLink; + } + remainingCount -= processedCount; + if (remainingCount > 0) + continue; + if (finalEntry) + finalLinkTracker.setTrue(); + break; + } + } } } diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java index 8ea7a5f969..4bfc645547 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java @@ -3,8 +3,6 @@ package com.simibubi.create.content.logistics.stockTicker; import java.util.ArrayList; import java.util.List; -import org.apache.commons.lang3.mutable.MutableBoolean; -import org.checkerframework.checker.units.qual.s; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -12,7 +10,6 @@ import com.simibubi.create.AllPackets; import com.simibubi.create.content.contraptions.actors.seat.SeatEntity; import com.simibubi.create.content.equipment.goggles.IHaveHoveringInformation; import com.simibubi.create.content.logistics.packager.InventorySummary; -import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedBehaviour; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import com.simibubi.create.foundation.blockEntity.behaviour.inventory.InvManipulationBehaviour; import com.simibubi.create.foundation.item.ItemHelper; @@ -89,6 +86,13 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity implements public int getTicksSinceLastUpdate() { return ticksSinceLastUpdate; } + + @Override + public void broadcastPackageRequest(PackageOrder order, IItemHandler ignoredHandler, String address) { + super.broadcastPackageRequest(order, ignoredHandler, address); + previouslyUsedAddress = address; + notifyUpdate(); + } @Override public void tick() { @@ -98,8 +102,9 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity implements ticksSinceLastUpdate += 1; return; } - if (activeLinks != activeLinksLastSummary && !isRemoved()) { - activeLinks = activeLinksLastSummary; + int contributingLinks = getRecentSummary().contributingLinks; + if (activeLinks != contributingLinks && !isRemoved()) { + activeLinks = contributingLinks; sendData(); } } @@ -201,53 +206,7 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity implements newlyReceivedStockSnapshot = null; } - public void broadcastPackageRequest(PackageOrder order, IItemHandler ignoredHandler, String address) { - List> stacks = order.stacks(); - - // Packages need to track their index and successors for successful defrag - Iterable availableLinks = behaviour.getAllConnectedAvailableLinks(true); - List usedLinks = new ArrayList<>(); - MutableBoolean finalLinkTracker = new MutableBoolean(false); - - // First box needs to carry the order specifics for successful defrag - PackageOrder contextToSend = order; - - // Packages from future orders should not be merged in the packager queue - int orderId = level.random.nextInt(); - - for (int i = 0; i < stacks.size(); i++) { - IntAttached entry = stacks.get(i); - int remainingCount = entry.getFirst(); - boolean finalEntry = i == stacks.size() - 1; - ItemStack requestedItem = entry.getSecond(); - - for (LogisticallyLinkedBehaviour link : availableLinks) { - int usedIndex = usedLinks.indexOf(link); - int linkIndex = usedIndex == -1 ? usedLinks.size() : usedIndex; - MutableBoolean isFinalLink = new MutableBoolean(false); - if (linkIndex == usedLinks.size() - 1) - isFinalLink = finalLinkTracker; - - int processedCount = link.processRequest(requestedItem, remainingCount, address, linkIndex, isFinalLink, - orderId, contextToSend, ignoredHandler); - if (processedCount > 0 && usedIndex == -1) { - contextToSend = null; - usedLinks.add(link); - finalLinkTracker = isFinalLink; - } - remainingCount -= processedCount; - if (remainingCount > 0) - continue; - if (finalEntry) - finalLinkTracker.setTrue(); - break; - } - } - - previouslyUsedAddress = address; - notifyUpdate(); - } - + public boolean isKeeperPresent() { for (int yOffset : Iterate.zeroAndOne) { for (Direction side : Iterate.horizontalDirections) { diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java index fa76781c92..1bee5e8b4b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java @@ -92,7 +92,7 @@ public class StockTickerInteractionHandler { PackageOrder order = new PackageOrder(orderEntries.getStacksByCount()); // Must be up-to-date - tickerBE.refreshInventorySummary(); + tickerBE.getAccurateSummary(); // Check stock levels InventorySummary recentSummary = tickerBE.getRecentSummary(); diff --git a/src/main/java/com/simibubi/create/content/redstone/diodes/BrassDiodeScrollValueBehaviour.java b/src/main/java/com/simibubi/create/content/redstone/diodes/BrassDiodeScrollValueBehaviour.java index c48921e333..20d99c40da 100644 --- a/src/main/java/com/simibubi/create/content/redstone/diodes/BrassDiodeScrollValueBehaviour.java +++ b/src/main/java/com/simibubi/create/content/redstone/diodes/BrassDiodeScrollValueBehaviour.java @@ -30,7 +30,9 @@ public class BrassDiodeScrollValueBehaviour extends ScrollValueBehaviour { } @Override - public void onShortInteract(Player player, InteractionHand hand, Direction side) { + public void onShortInteract(Player player, InteractionHand hand, Direction side, BlockHitResult hitResult) { + if (getWorld().isClientSide) + return; BlockState blockState = blockEntity.getBlockState(); if (blockState.getBlock()instanceof BrassDiodeBlock bdb) bdb.toggle(getWorld(), getPos(), blockState, player, hand); diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBox.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBox.java index 77a3dcac56..c3b82b7450 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBox.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBox.java @@ -3,6 +3,7 @@ package com.simibubi.create.foundation.blockEntity.behaviour; import java.lang.ref.WeakReference; import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; import com.simibubi.create.content.logistics.filter.FilterItem; import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform.Sided; import com.simibubi.create.foundation.blockEntity.behaviour.scrollValue.INamedIconOptions; @@ -19,6 +20,8 @@ import net.minecraft.client.renderer.entity.ItemRenderer; import net.minecraft.client.resources.model.BakedModel; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.util.Mth; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.state.BlockState; @@ -35,6 +38,7 @@ public class ValueBox extends ChasingAABBOutline { public int overrideColor = -1; public boolean isPassive; + public boolean isDiamond; protected ValueBoxTransform transform; @@ -94,6 +98,8 @@ public class ValueBox extends ChasingAABBOutline { if (!isPassive) { ms.pushPose(); ms.scale(-2.01f, -2.01f, 2.01f); + if (isDiamond) + ms.mulPose(Axis.ZP.rotation(Mth.PI / 4f)); ms.translate(-8 / 16.0, -8 / 16.0, -.5 / 16.0); getOutline().render(ms, buffer, 0xffffff); ms.popPose(); @@ -114,14 +120,12 @@ public class ValueBox extends ChasingAABBOutline { public static class ItemValueBox extends ValueBox { ItemStack stack; - int count; - boolean upTo; + MutableComponent count; - public ItemValueBox(Component label, AABB bb, BlockPos pos, ItemStack stack, int count, boolean upTo) { + public ItemValueBox(Component label, AABB bb, BlockPos pos, ItemStack stack, MutableComponent count) { super(label, bb, pos); this.stack = stack; this.count = count; - this.upTo = upTo; } @Override @@ -134,12 +138,10 @@ public class ValueBox extends ChasingAABBOutline { @Override public void renderContents(PoseStack ms, MultiBufferSource buffer) { super.renderContents(ms, buffer); - if (count == -1) + if (count == null) return; Font font = Minecraft.getInstance().font; - boolean wildcard = count == 0 || upTo && count >= stack.getMaxStackSize(); - Component countString = Components.literal(wildcard ? "*" : count + ""); ms.translate(17.5f, -5f, 7f); boolean isFilter = stack.getItem() instanceof FilterItem; @@ -152,7 +154,7 @@ public class ValueBox extends ChasingAABBOutline { .size() <= 1; float scale = 1.5f; - ms.translate(-font.width(countString), 0, 0); + ms.translate(-font.width(count), 0, 0); if (isFilter) ms.translate(-5, 8, 7.25f); @@ -162,13 +164,13 @@ public class ValueBox extends ChasingAABBOutline { } else ms.translate(-7, 10, blockItem ? 10 + 1 / 4f : 0); - if (wildcard) + if (count.getString().equals("*")) ms.translate(-1, 3f, 0); ms.scale(scale, scale, scale); - drawString(ms, buffer, countString, 0, 0, isFilter ? 0xFFFFFF : 0xEDEDED); + drawString(ms, buffer, count, 0, 0, isFilter ? 0xFFFFFF : 0xEDEDED); ms.translate(0, 0, -1 / 16f); - drawString(ms, buffer, countString, 1 - 1 / 8f, 1 - 1 / 8f, 0x4F4F4F); + drawString(ms, buffer, Components.literal(count.getString()), 1 - 1 / 8f, 1 - 1 / 8f, 0x3F3F3F); } } diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsBehaviour.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsBehaviour.java index 445050d9b0..742c114650 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsBehaviour.java @@ -10,6 +10,7 @@ import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.Vec3; @@ -81,6 +82,14 @@ public interface ValueSettingsBehaviour extends ClipboardCloneable { 1.125f); } - default void onShortInteract(Player player, InteractionHand hand, Direction side) {} + default void onShortInteract(Player player, InteractionHand hand, Direction side, BlockHitResult hitResult) {} + default boolean bypassesInput(ItemStack mainhandItem) { + return false; + } + + default int netId() { + return 0; + } + } diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsClient.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsClient.java index 3a1bcd6e28..8366cbe0d1 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsClient.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsClient.java @@ -22,7 +22,7 @@ import net.minecraftforge.client.gui.overlay.IGuiOverlay; import net.minecraftforge.event.entity.player.PlayerInteractEvent; public class ValueSettingsClient implements IGuiOverlay { - + private Minecraft mc; public int interactHeldTicks = -1; @@ -81,14 +81,16 @@ public class ValueSettingsClient implements IGuiOverlay { } BlockEntityBehaviour behaviour = BlockEntityBehaviour.get(mc.level, interactHeldPos, interactHeldBehaviour); if (!(behaviour instanceof ValueSettingsBehaviour valueSettingBehaviour) + || valueSettingBehaviour.bypassesInput(player.getMainHandItem()) || !valueSettingBehaviour.testHit(blockHitResult.getLocation())) { cancelInteraction(); return; } if (!mc.options.keyUse.isDown()) { AllPackets.getChannel() - .sendToServer( - new ValueSettingsPacket(interactHeldPos, 0, 0, interactHeldHand, interactHeldFace, false)); + .sendToServer(new ValueSettingsPacket(interactHeldPos, 0, 0, interactHeldHand, blockHitResult, + interactHeldFace, false, valueSettingBehaviour.netId())); + valueSettingBehaviour.onShortInteract(player, interactHeldHand, interactHeldFace, blockHitResult); cancelInteraction(); return; } @@ -97,9 +99,9 @@ public class ValueSettingsClient implements IGuiOverlay { player.swinging = false; if (interactHeldTicks++ < 5) return; - ScreenOpener - .open(new ValueSettingsScreen(interactHeldPos, valueSettingBehaviour.createBoard(player, blockHitResult), - valueSettingBehaviour.getValueSettings(), valueSettingBehaviour::newSettingHovered)); + ScreenOpener.open(new ValueSettingsScreen(interactHeldPos, + valueSettingBehaviour.createBoard(player, blockHitResult), valueSettingBehaviour.getValueSettings(), + valueSettingBehaviour::newSettingHovered, valueSettingBehaviour.netId())); interactHeldTicks = -1; } diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsInputHandler.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsInputHandler.java index 5ab4fd6848..7fe578643e 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsInputHandler.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsInputHandler.java @@ -48,6 +48,8 @@ public class ValueSettingsInputHandler { for (BlockEntityBehaviour behaviour : sbe.getAllBehaviours()) { if (!(behaviour instanceof ValueSettingsBehaviour valueSettingsBehaviour)) continue; + if (valueSettingsBehaviour.bypassesInput(player.getMainHandItem())) + continue; BlockHitResult ray = RaycastHelper.rayTraceRange(world, player, 10); if (ray == null) @@ -77,7 +79,7 @@ public class ValueSettingsInputHandler { event.setCancellationResult(InteractionResult.SUCCESS); if (!valueSettingsBehaviour.acceptsValueSettings() || fakePlayer) { - valueSettingsBehaviour.onShortInteract(player, hand, ray.getDirection()); + valueSettingsBehaviour.onShortInteract(player, hand, ray.getDirection(), ray); return; } diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsPacket.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsPacket.java index 27638e80dd..d1e328c552 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsPacket.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsPacket.java @@ -11,6 +11,7 @@ import net.minecraft.core.Direction; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; +import net.minecraft.world.phys.BlockHitResult; public class ValueSettingsPacket extends BlockEntityConfigurationPacket { @@ -19,15 +20,19 @@ public class ValueSettingsPacket extends BlockEntityConfigurationPacket onHover) { + Consumer onHover, int netId) { this.pos = pos; this.board = board; this.initialSettings = valueSettings; this.onHover = onHover; + this.netId = netId; this.iconMode = board.formatter() instanceof ScrollOptionSettingsFormatter; this.milestoneSize = iconMode ? 8 : 4; } @@ -136,7 +138,8 @@ public class ValueSettingsScreen extends AbstractSimiScreen { int scale = board.maxValue() > 128 ? 1 : 2; Component title = board.title(); - Component tip = CreateLang.translateDirect("gui.value_settings.release_to_confirm", Components.keybind("key.use")); + Component tip = + CreateLang.translateDirect("gui.value_settings.release_to_confirm", Components.keybind("key.use")); double fadeIn = Math.pow(Mth.clamp((ticksOpen + partialTicks) / 4.0, 0, 1), 1); int fattestLabel = Math.max(font.width(tip), font.width(title)); @@ -152,17 +155,18 @@ public class ValueSettingsScreen extends AbstractSimiScreen { int additionalHeight = iconMode ? 46 : 33; int zLevel = 0; - UIRenderHelper.drawStretched(graphics, x - 11 + fadeInStart, y - 17, fadeInWidth, windowHeight + additionalHeight, - zLevel, AllGuiTextures.VALUE_SETTINGS_OUTER_BG); - UIRenderHelper.drawStretched(graphics, x - 10 + fadeInStart, y - 18, fadeInWidth - 2, 1, - zLevel, AllGuiTextures.VALUE_SETTINGS_OUTER_BG); - UIRenderHelper.drawStretched(graphics, x - 10 + fadeInStart, y - 17 + windowHeight + additionalHeight, - zLevel, fadeInWidth - 2, 1, AllGuiTextures.VALUE_SETTINGS_OUTER_BG); + UIRenderHelper.drawStretched(graphics, x - 11 + fadeInStart, y - 17, fadeInWidth, + windowHeight + additionalHeight, zLevel, AllGuiTextures.VALUE_SETTINGS_OUTER_BG); + UIRenderHelper.drawStretched(graphics, x - 10 + fadeInStart, y - 18, fadeInWidth - 2, 1, zLevel, + AllGuiTextures.VALUE_SETTINGS_OUTER_BG); + UIRenderHelper.drawStretched(graphics, x - 10 + fadeInStart, y - 17 + windowHeight + additionalHeight, zLevel, + fadeInWidth - 2, 1, AllGuiTextures.VALUE_SETTINGS_OUTER_BG); if (fadeInWidth > fattestLabel) { int textX = x - 11 - fatTipOffset + bgWidth / 2; graphics.drawString(font, title, textX - font.width(title) / 2, y - 14, 0xdddddd, false); - graphics.drawString(font, tip, textX - font.width(tip) / 2, y + windowHeight + additionalHeight - 27, 0xdddddd, false); + graphics.drawString(font, tip, textX - font.width(tip) / 2, y + windowHeight + additionalHeight - 27, + 0xdddddd, false); } renderBrassFrame(graphics, x + maxLabelWidth + 14, y - 3, valueBarWidth + 8, board.rows() @@ -175,12 +179,12 @@ public class ValueSettingsScreen extends AbstractSimiScreen { int valueBarX = x + maxLabelWidth + 14 + 4; if (!iconMode) { - UIRenderHelper.drawCropped(graphics, x - 4, y, maxLabelWidth + 8, 11, - zLevel, AllGuiTextures.VALUE_SETTINGS_LABEL_BG); + UIRenderHelper.drawCropped(graphics, x - 4, y, maxLabelWidth + 8, 11, zLevel, + AllGuiTextures.VALUE_SETTINGS_LABEL_BG); for (int w = 0; w < valueBarWidth; w += AllGuiTextures.VALUE_SETTINGS_BAR.getWidth() - 1) UIRenderHelper.drawCropped(graphics, valueBarX + w, y + 1, - Math.min(AllGuiTextures.VALUE_SETTINGS_BAR.getWidth() - 1, valueBarWidth - w), 8, - zLevel, AllGuiTextures.VALUE_SETTINGS_BAR); + Math.min(AllGuiTextures.VALUE_SETTINGS_BAR.getWidth() - 1, valueBarWidth - w), 8, zLevel, + AllGuiTextures.VALUE_SETTINGS_BAR); graphics.drawString(font, component, x, y + 1, 0x442000, false); } @@ -242,8 +246,8 @@ public class ValueSettingsScreen extends AbstractSimiScreen { } AllGuiTextures.VALUE_SETTINGS_CURSOR_LEFT.render(graphics, cursorX - 3, cursorY); - UIRenderHelper.drawCropped(graphics, cursorX, cursorY, cursorWidth, 14, - zLevel, AllGuiTextures.VALUE_SETTINGS_CURSOR); + UIRenderHelper.drawCropped(graphics, cursorX, cursorY, cursorWidth, 14, zLevel, + AllGuiTextures.VALUE_SETTINGS_CURSOR); AllGuiTextures.VALUE_SETTINGS_CURSOR_RIGHT.render(graphics, cursorX + cursorWidth, cursorY); graphics.drawString(font, cursorText, cursorX + 2, cursorY + 3, 0x442000, false); @@ -258,7 +262,8 @@ public class ValueSettingsScreen extends AbstractSimiScreen { if (h > 8) { UIRenderHelper.drawStretched(graphics, x, y + 4, 3, h - 8, zLevel, AllGuiTextures.BRASS_FRAME_LEFT); - UIRenderHelper.drawStretched(graphics, x + w - 3, y + 4, 3, h - 8, zLevel, AllGuiTextures.BRASS_FRAME_RIGHT); + UIRenderHelper.drawStretched(graphics, x + w - 3, y + 4, 3, h - 8, zLevel, + AllGuiTextures.BRASS_FRAME_RIGHT); } if (w > 8) { @@ -318,8 +323,8 @@ public class ValueSettingsScreen extends AbstractSimiScreen { ValueSettings closest = getClosestCoordinate((int) pMouseX, (int) pMouseY); // FIXME: value settings may be face-sensitive on future components AllPackets.getChannel() - .sendToServer(new ValueSettingsPacket(pos, closest.row(), closest.value(), null, Direction.UP, - AllKeys.ctrlDown())); + .sendToServer(new ValueSettingsPacket(pos, closest.row(), closest.value(), null, null, Direction.UP, + AllKeys.ctrlDown(), netId)); onClose(); } diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringBehaviour.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringBehaviour.java index b6b91fb539..9b114ed9c7 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringBehaviour.java @@ -19,6 +19,7 @@ import com.simibubi.create.foundation.blockEntity.behaviour.ValueSettingsBoard; import com.simibubi.create.foundation.blockEntity.behaviour.ValueSettingsFormatter; import com.simibubi.create.foundation.item.ItemHelper; import com.simibubi.create.foundation.utility.CreateLang; +import com.simibubi.create.infrastructure.config.AllConfigs; import net.createmod.catnip.utility.Iterate; import net.createmod.catnip.utility.VecHelper; @@ -51,7 +52,7 @@ public class FilteringBehaviour extends BlockEntityBehaviour implements ValueSet ValueBoxTransform slotPositioning; boolean showCount; - private FilterItemStack filter; + protected FilterItemStack filter; public int count; public boolean upTo; @@ -62,6 +63,8 @@ public class FilteringBehaviour extends BlockEntityBehaviour implements ValueSet boolean recipeFilter; boolean fluidFilter; + + protected boolean diamondShape; public FilteringBehaviour(SmartBlockEntity be, ValueBoxTransform slot) { super(be); @@ -77,6 +80,7 @@ public class FilteringBehaviour extends BlockEntityBehaviour implements ValueSet recipeFilter = false; fluidFilter = false; upTo = true; + diamondShape = false; } @Override @@ -273,7 +277,7 @@ public class FilteringBehaviour extends BlockEntityBehaviour implements ValueSet } @Override - public void onShortInteract(Player player, InteractionHand hand, Direction side) { + public void onShortInteract(Player player, InteractionHand hand, Direction side, BlockHitResult hitResult) { Level level = getWorld(); BlockPos pos = getPos(); ItemStack itemInHand = player.getItemInHand(hand); @@ -322,6 +326,11 @@ public class FilteringBehaviour extends BlockEntityBehaviour implements ValueSet return CreateLang.translateDirect( recipeFilter ? "logistics.recipe_filter" : fluidFilter ? "logistics.fluid_filter" : "logistics.filter"); } + + public MutableComponent getCountLabelForValueBox() { + return Components.literal(showCount ? upTo && filter.item() + .getMaxStackSize() == count ? "*" : String.valueOf(count) : ""); + } @Override public String getClipboardKey() { @@ -390,5 +399,19 @@ public class FilteringBehaviour extends BlockEntityBehaviour implements ValueSet public boolean isRecipeFilter() { return recipeFilter; } + + @Override + public boolean bypassesInput(ItemStack mainhandItem) { + return AllItems.FACTORY_PANEL_CONNECTOR.isIn(mainhandItem); + } + + @Override + public int netId() { + return 1; + } + + public float getRenderDistance() { + return AllConfigs.client().filterItemRenderDistance.getF(); + } } diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringRenderer.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringRenderer.java index 27458b61e3..4c6f0736ce 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringRenderer.java @@ -81,8 +81,9 @@ public class FilteringRenderer { AABB emptyBB = new AABB(Vec3.ZERO, Vec3.ZERO); AABB bb = isFilterSlotted ? emptyBB.inflate(.45f, .31f, .2f) : emptyBB.inflate(.25f); - ValueBox box = new ItemValueBox(label, bb, pos, filter, showCount ? behaviour.count : -1, behaviour.upTo); - box.passive(!hit || AllBlocks.CLIPBOARD.isIn(mainhandItem)); + ValueBox box = new ItemValueBox(label, bb, pos, filter, behaviour.getCountLabelForValueBox()); + box.passive(!hit || behaviour.bypassesInput(mainhandItem)); + box.isDiamond = behaviour.diamondShape; CatnipClient.OUTLINER.showOutline(Pair.of("filter", pos), box.transform(behaviour.slotPositioning)) .lineWidth(1 / 64f) @@ -111,10 +112,14 @@ public class FilteringRenderer { Level level = be.getLevel(); BlockPos blockPos = be.getBlockPos(); + FilteringBehaviour behaviour = be.getBehaviour(FilteringBehaviour.TYPE); + if (behaviour == null) + return; + if (!be.isVirtual()) { Entity cameraEntity = Minecraft.getInstance().cameraEntity; if (cameraEntity != null && level == cameraEntity.level()) { - float max = AllConfigs.client().filterItemRenderDistance.getF(); + float max = behaviour.getRenderDistance(); if (cameraEntity.position() .distanceToSqr(VecHelper.getCenterOf(blockPos)) > (max * max)) { return; @@ -122,9 +127,6 @@ public class FilteringRenderer { } } - FilteringBehaviour behaviour = be.getBehaviour(FilteringBehaviour.TYPE); - if (behaviour == null) - return; if (!behaviour.isActive()) return; if (behaviour.getFilter() diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/scrollValue/ScrollValueBehaviour.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/scrollValue/ScrollValueBehaviour.java index e37d316746..e66db19e0b 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/scrollValue/ScrollValueBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/scrollValue/ScrollValueBehaviour.java @@ -13,7 +13,6 @@ import com.simibubi.create.foundation.blockEntity.behaviour.ValueSettingsBehavio import com.simibubi.create.foundation.blockEntity.behaviour.ValueSettingsBoard; import com.simibubi.create.foundation.blockEntity.behaviour.ValueSettingsFormatter; -import net.createmod.catnip.utility.VecHelper; import net.createmod.catnip.utility.lang.Components; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; @@ -180,11 +179,10 @@ public class ScrollValueBehaviour extends BlockEntityBehaviour implements ValueS } @Override - public void onShortInteract(Player player, InteractionHand hand, Direction side) { + public void onShortInteract(Player player, InteractionHand hand, Direction side, BlockHitResult hitResult) { if (player instanceof FakePlayer) blockEntity.getBlockState() - .use(getWorld(), player, hand, - new BlockHitResult(VecHelper.getCenterOf(getPos()), side, getPos(), true)); + .use(getWorld(), player, hand, hitResult); } } diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/scrollValue/ScrollValueRenderer.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/scrollValue/ScrollValueRenderer.java index 0d51d8ae8b..7568f35098 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/scrollValue/ScrollValueRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/scrollValue/ScrollValueRenderer.java @@ -3,7 +3,6 @@ package com.simibubi.create.foundation.blockEntity.behaviour.scrollValue; import java.util.ArrayList; import java.util.List; -import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.AllKeys; import com.simibubi.create.CreateClient; @@ -41,37 +40,45 @@ public class ScrollValueRenderer { ClientLevel world = mc.level; BlockPos pos = result.getBlockPos(); Direction face = result.getDirection(); + boolean highlightFound = false; - ScrollValueBehaviour behaviour = BlockEntityBehaviour.get(world, pos, ScrollValueBehaviour.TYPE); - if (behaviour == null) + if (!(world.getBlockEntity(pos) instanceof SmartBlockEntity sbe)) return; - if (!behaviour.isActive()) { - CatnipClient.OUTLINER.remove(pos); - return; - } - ItemStack mainhandItem = mc.player.getItemInHand(InteractionHand.MAIN_HAND); - boolean clipboard = AllBlocks.CLIPBOARD.isIn(mainhandItem); - if (behaviour.needsWrench && !AllItems.WRENCH.isIn(mainhandItem) && !clipboard) - return; - boolean highlight = behaviour.testHit(target.getLocation()) && !clipboard; - if (behaviour instanceof BulkScrollValueBehaviour && AllKeys.ctrlDown()) { - BulkScrollValueBehaviour bulkScrolling = (BulkScrollValueBehaviour) behaviour; - for (SmartBlockEntity smartBlockEntity : bulkScrolling.getBulk()) { - ScrollValueBehaviour other = smartBlockEntity.getBehaviour(ScrollValueBehaviour.TYPE); - if (other != null) - addBox(world, smartBlockEntity.getBlockPos(), face, other, highlight); + for (BlockEntityBehaviour blockEntityBehaviour : sbe.getAllBehaviours()) { + if (!(blockEntityBehaviour instanceof ScrollValueBehaviour behaviour)) + continue; + + if (!behaviour.isActive()) { + CatnipClient.OUTLINER.remove(behaviour); + continue; } - } else - addBox(world, pos, face, behaviour, highlight); - if (!highlight) - return; + ItemStack mainhandItem = mc.player.getItemInHand(InteractionHand.MAIN_HAND); + boolean clipboard = behaviour.bypassesInput(mainhandItem); + if (behaviour.needsWrench && !AllItems.WRENCH.isIn(mainhandItem) && !clipboard) + continue; + boolean highlight = behaviour.testHit(target.getLocation()) && !clipboard && !highlightFound; - List tip = new ArrayList<>(); - tip.add(behaviour.label.copy()); - tip.add(CreateLang.translateDirect("gui.value_settings.hold_to_edit")); - CreateClient.VALUE_SETTINGS_HANDLER.showHoverTip(tip); + if (behaviour instanceof BulkScrollValueBehaviour && AllKeys.ctrlDown()) { + BulkScrollValueBehaviour bulkScrolling = (BulkScrollValueBehaviour) behaviour; + for (SmartBlockEntity smartBlockEntity : bulkScrolling.getBulk()) { + ScrollValueBehaviour other = smartBlockEntity.getBehaviour(ScrollValueBehaviour.TYPE); + if (other != null) + addBox(world, smartBlockEntity.getBlockPos(), face, other, highlight); + } + } else + addBox(world, pos, face, behaviour, highlight); + + if (!highlight) + continue; + + highlightFound = true; + List tip = new ArrayList<>(); + tip.add(behaviour.label.copy()); + tip.add(CreateLang.translateDirect("gui.value_settings.hold_to_edit")); + CreateClient.VALUE_SETTINGS_HANDLER.showHoverTip(tip); + } } protected static void addBox(ClientLevel world, BlockPos pos, Direction face, ScrollValueBehaviour behaviour, @@ -91,7 +98,7 @@ public class ScrollValueRenderer { box.passive(!highlight) .wideOutline(); - CatnipClient.OUTLINER.showOutline(pos, box.transform(behaviour.slotPositioning)) + CatnipClient.OUTLINER.showOutline(behaviour, box.transform(behaviour.slotPositioning)) .highlightFace(face); } diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java index d8e500ee2b..85ef41cd69 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java @@ -1014,6 +1014,7 @@ public class StandardRecipeGen extends CreateRecipeProvider { LOGISTICS_LINK_CLEAR = clearData(AllBlocks.PACKAGER_LINK), STOCK_TICKER_CLEAR = clearData(AllBlocks.STOCK_TICKER), REDSTONE_REQUESTER_CLEAR = clearData(AllBlocks.REDSTONE_REQUESTER), + FACTORY_PANEL_CLEAR = clearData(AllBlocks.FACTORY_PANEL), DISPLAY_LINK = create(AllBlocks.DISPLAY_LINK).unlockedBy(I::brassCasing) .viaShaped(b -> b.define('C', Blocks.REDSTONE_TORCH) diff --git a/src/main/resources/assets/create/models/block/factory_board/block.bbmodel b/src/main/resources/assets/create/models/block/factory_board/block.bbmodel new file mode 100644 index 0000000000..a658ec3c93 --- /dev/null +++ b/src/main/resources/assets/create/models/block/factory_board/block.bbmodel @@ -0,0 +1 @@ +{"meta":{"format_version":"4.10","model_format":"java_block","box_uv":false},"name":"block","parent":"create:block/large_wheels","ambientocclusion":true,"front_gui_light":false,"visible_box":[1,1,0],"variable_placeholders":"","variable_placeholder_buttons":[],"unhandled_root_fields":{},"resolution":{"width":16,"height":16},"elements":[{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[0,0,3],"to":[16,16,6],"autouv":0,"color":1,"origin":[0,0,6],"faces":{"north":{"uv":[0,0,16,16],"texture":6},"east":{"uv":[13,0,16,16],"texture":2},"south":{"uv":[0,0,16,16],"texture":5},"west":{"uv":[0,0,3,16],"texture":2},"up":{"uv":[0,0,3,16],"rotation":90,"texture":4},"down":{"uv":[7,0,10,16],"rotation":90,"texture":4}},"type":"cube","uuid":"f3e6ac4a-ae8e-b4ec-c08a-72c0aff87260"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[0,0,10],"to":[16,16,13],"autouv":0,"color":1,"origin":[0,0,6],"faces":{"north":{"uv":[0,0,16,16],"texture":5},"east":{"uv":[3,0,6,16],"texture":2},"south":{"uv":[0,0,16,16],"texture":1},"west":{"uv":[10,0,13,16],"texture":2},"up":{"uv":[7,0,10,16],"rotation":90,"texture":4},"down":{"uv":[0,0,3,16],"rotation":90,"texture":4}},"type":"cube","uuid":"a864f9d2-8b98-0a6b-5905-068e12a4ed4a"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[0,0,6],"to":[16,16,10],"autouv":0,"color":8,"origin":[0,0,0],"faces":{"north":{"uv":[0,0,0,0],"texture":null},"east":{"uv":[6,0,10,16],"texture":2},"south":{"uv":[0,0,0,0],"texture":null},"west":{"uv":[6,0,10,16],"texture":2},"up":{"uv":[3,0,7,16],"rotation":90,"texture":4},"down":{"uv":[3,0,7,16],"rotation":90,"texture":4}},"type":"cube","uuid":"8bfa9753-ea73-56a2-f9cb-e6d0607b1eeb"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[15.95,0.05,6],"to":[0.05,15.95,10],"autouv":0,"color":9,"origin":[0,0,0],"faces":{"north":{"uv":[0,0,0,0],"texture":null},"east":{"uv":[6,0,10,16],"texture":2},"south":{"uv":[0,0,0,0],"texture":null},"west":{"uv":[6,0,10,16],"texture":2},"up":{"uv":[3,0,7,16],"rotation":90,"texture":4},"down":{"uv":[3,0,7,16],"rotation":90,"texture":4}},"type":"cube","uuid":"1ab06a32-ddca-3cc5-6184-730fb810df9e"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[16,0,3],"to":[32,16,6],"autouv":0,"color":1,"origin":[16,0,6],"faces":{"north":{"uv":[0,0,16,16],"texture":6},"east":{"uv":[9,0,12,16],"texture":2},"south":{"uv":[0,0,16,16],"texture":5},"west":{"uv":[0,0,3,16],"texture":2},"up":{"uv":[0,0,3,16],"rotation":90,"texture":4},"down":{"uv":[7,0,10,16],"rotation":90,"texture":4}},"type":"cube","uuid":"0ffa2507-5119-81f8-7c2f-8b06672e9bc8"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[16,0,10],"to":[32,16,13],"autouv":0,"color":1,"origin":[16,0,6],"faces":{"north":{"uv":[0,0,16,16],"texture":5},"east":{"uv":[4,0,7,16],"texture":2},"south":{"uv":[0,0,16,16],"texture":1},"west":{"uv":[10,0,13,16],"texture":2},"up":{"uv":[7,0,10,16],"rotation":90,"texture":4},"down":{"uv":[0,0,3,16],"rotation":90,"texture":4}},"type":"cube","uuid":"79acb8f9-546a-acbc-06bd-0db7adf4562b"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[16,0,6],"to":[32,16,10],"autouv":0,"color":8,"origin":[16,0,0],"faces":{"north":{"uv":[0,0,0,0],"texture":null},"east":{"uv":[6,0,10,16],"texture":2},"south":{"uv":[0,0,0,0],"texture":null},"west":{"uv":[6,0,10,16],"texture":2},"up":{"uv":[3,0,7,16],"rotation":90,"texture":4},"down":{"uv":[3,0,7,16],"rotation":90,"texture":4}},"type":"cube","uuid":"b8995380-5649-968b-702a-c45125c8028f"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[31.950000000000003,0.05,6],"to":[16.05,15.95,10],"autouv":0,"color":9,"origin":[16,0,0],"faces":{"north":{"uv":[0,0,0,0],"texture":null},"east":{"uv":[6,0,10,16],"texture":2},"south":{"uv":[0,0,0,0],"texture":null},"west":{"uv":[6,0,10,16],"texture":2},"up":{"uv":[3,0,7,16],"rotation":90,"texture":4},"down":{"uv":[3,0,7,16],"rotation":90,"texture":4}},"type":"cube","uuid":"1c8efa84-aa71-c7d9-f0d9-c4bed393985b"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[0,16,3],"to":[16,32,6],"autouv":0,"color":1,"origin":[0,16,6],"faces":{"north":{"uv":[0,0,16,16],"texture":6},"east":{"uv":[13,0,16,16],"texture":2},"south":{"uv":[0,0,16,16],"texture":5},"west":{"uv":[0,0,3,16],"texture":2},"up":{"uv":[0,0,3,16],"rotation":90,"texture":4},"down":{"uv":[7,0,10,16],"rotation":90,"texture":4}},"type":"cube","uuid":"b1792b7b-bd79-d27e-82d7-0ce76650122f"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[0,16,10],"to":[16,32,13],"autouv":0,"color":1,"origin":[0,16,6],"faces":{"north":{"uv":[0,0,16,16],"texture":5},"east":{"uv":[3,0,6,16],"texture":2},"south":{"uv":[0,0,16,16],"texture":1},"west":{"uv":[10,0,13,16],"texture":2},"up":{"uv":[7,0,10,16],"rotation":90,"texture":4},"down":{"uv":[0,0,3,16],"rotation":90,"texture":4}},"type":"cube","uuid":"248a3ef9-643f-bfdf-ed3f-277a68c1e31f"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[0,16,6],"to":[16,32,10],"autouv":0,"color":8,"origin":[0,16,0],"faces":{"north":{"uv":[0,0,0,0],"texture":null},"east":{"uv":[6,0,10,16],"texture":2},"south":{"uv":[0,0,0,0],"texture":null},"west":{"uv":[6,0,10,16],"texture":2},"up":{"uv":[3,0,7,16],"rotation":90,"texture":4},"down":{"uv":[3,0,7,16],"rotation":90,"texture":4}},"type":"cube","uuid":"13dd54f8-ca6f-19ed-e70b-b325f6e7c88d"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[15.95,16.05,6],"to":[0.05,31.950000000000003,10],"autouv":0,"color":9,"origin":[0,16,0],"faces":{"north":{"uv":[0,0,0,0],"texture":null},"east":{"uv":[6,0,10,16],"texture":2},"south":{"uv":[0,0,0,0],"texture":null},"west":{"uv":[6,0,10,16],"texture":2},"up":{"uv":[3,0,7,16],"rotation":90,"texture":4},"down":{"uv":[3,0,7,16],"rotation":90,"texture":4}},"type":"cube","uuid":"cb2a5eec-1ee0-f954-1a1f-f611aa48d07a"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[16,16,3],"to":[32,32,6],"autouv":0,"color":1,"origin":[16,16,6],"faces":{"north":{"uv":[0,0,16,16],"texture":6},"east":{"uv":[9,0,12,16],"texture":6},"south":{"uv":[0,0,16,16],"texture":5},"west":{"uv":[0,0,3,16],"texture":2},"up":{"uv":[0,0,3,16],"rotation":90,"texture":4},"down":{"uv":[7,0,10,16],"rotation":90,"texture":4}},"type":"cube","uuid":"94f28cc4-aeef-2708-2953-bf1c6ec85c3b"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[16,16,10],"to":[32,32,13],"autouv":0,"color":1,"origin":[16,16,6],"faces":{"north":{"uv":[0,0,16,16],"texture":5},"east":{"uv":[2,0,5,16],"texture":6},"south":{"uv":[0,0,16,16],"texture":1},"west":{"uv":[10,0,13,16],"texture":2},"up":{"uv":[7,0,10,16],"rotation":90,"texture":4},"down":{"uv":[0,0,3,16],"rotation":90,"texture":4}},"type":"cube","uuid":"d55a2435-fced-d6da-06a7-6a3ae6c11144"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[16,16,6],"to":[32,32,10],"autouv":0,"color":8,"origin":[16,16,0],"faces":{"north":{"uv":[0,0,0,0],"texture":null},"east":{"uv":[5,0,9,16],"texture":6},"south":{"uv":[0,0,0,0],"texture":null},"west":{"uv":[6,0,10,16],"texture":2},"up":{"uv":[3,0,7,16],"rotation":90,"texture":4},"down":{"uv":[3,0,7,16],"rotation":90,"texture":4}},"type":"cube","uuid":"1b50c803-07bd-b324-dc37-d0e3bdd41e7a"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[31.95,16.05,6],"to":[16.05,31.950000000000003,10],"autouv":0,"color":9,"origin":[16,16,0],"faces":{"north":{"uv":[0,0,0,0],"texture":null},"east":{"uv":[6,0,10,16],"texture":2},"south":{"uv":[0,0,0,0],"texture":null},"west":{"uv":[6,0,10,16],"texture":2},"up":{"uv":[3,0,7,16],"rotation":90,"texture":4},"down":{"uv":[3,0,7,16],"rotation":90,"texture":4}},"type":"cube","uuid":"5b6aff94-5c3f-5dcf-db00-782eafc22986"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-16,16,3],"to":[0,32,6],"autouv":0,"color":1,"origin":[-16,16,6],"faces":{"north":{"uv":[0,0,16,16],"texture":6},"east":{"uv":[13,0,16,16],"texture":2},"south":{"uv":[0,0,16,16],"texture":5},"west":{"uv":[0,0,3,16],"texture":2},"up":{"uv":[0,0,3,16],"rotation":90,"texture":4},"down":{"uv":[7,0,10,16],"rotation":90,"texture":4}},"type":"cube","uuid":"95ceca62-28f7-0a06-296c-3e3abeb80f66"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-16,16,10],"to":[0,32,13],"autouv":0,"color":1,"origin":[-16,16,6],"faces":{"north":{"uv":[0,0,16,16],"texture":5},"east":{"uv":[3,0,6,16],"texture":2},"south":{"uv":[0,0,16,16],"texture":1},"west":{"uv":[10,0,13,16],"texture":2},"up":{"uv":[7,0,10,16],"rotation":90,"texture":4},"down":{"uv":[0,0,3,16],"rotation":90,"texture":4}},"type":"cube","uuid":"45f0e7a2-258c-31f8-2f98-f1fbf01bd607"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-16,16,6],"to":[0,32,10],"autouv":0,"color":8,"origin":[-16,16,0],"faces":{"north":{"uv":[0,0,0,0],"texture":null},"east":{"uv":[6,0,10,16],"texture":2},"south":{"uv":[0,0,0,0],"texture":null},"west":{"uv":[6,0,10,16],"texture":2},"up":{"uv":[3,0,7,16],"rotation":90,"texture":4},"down":{"uv":[3,0,7,16],"rotation":90,"texture":4}},"type":"cube","uuid":"78e6ba39-615d-19a9-f608-d2e16fed3ebe"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-0.05000000000000071,16.05,6],"to":[-15.95,31.950000000000003,10],"autouv":0,"color":9,"origin":[-16,16,0],"faces":{"north":{"uv":[0,0,0,0],"texture":null},"east":{"uv":[6,0,10,16],"texture":2},"south":{"uv":[0,0,0,0],"texture":null},"west":{"uv":[6,0,10,16],"texture":2},"up":{"uv":[3,0,7,16],"rotation":90,"texture":4},"down":{"uv":[3,0,7,16],"rotation":90,"texture":4}},"type":"cube","uuid":"0c46257c-d3c8-6d34-b3bb-b072afda5de3"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-16,0,3],"to":[0,16,6],"autouv":0,"color":1,"origin":[-16,0,6],"faces":{"north":{"uv":[0,0,16,16],"texture":6},"east":{"uv":[13,0,16,16],"texture":2},"south":{"uv":[0,0,16,16],"texture":5},"west":{"uv":[0,0,3,16],"texture":2},"up":{"uv":[0,0,3,16],"rotation":90,"texture":4},"down":{"uv":[7,0,10,16],"rotation":90,"texture":4}},"type":"cube","uuid":"6abd6abb-73fa-6522-3fb6-816a2e21621d"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-16,0,10],"to":[0,16,13],"autouv":0,"color":1,"origin":[-16,0,6],"faces":{"north":{"uv":[0,0,16,16],"texture":5},"east":{"uv":[3,0,6,16],"texture":2},"south":{"uv":[0,0,16,16],"texture":1},"west":{"uv":[10,0,13,16],"texture":2},"up":{"uv":[7,0,10,16],"rotation":90,"texture":4},"down":{"uv":[0,0,3,16],"rotation":90,"texture":4}},"type":"cube","uuid":"db5c3c11-192d-ece3-8a9f-7063d170e18a"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-16,0,6],"to":[0,16,10],"autouv":0,"color":8,"origin":[-16,0,0],"faces":{"north":{"uv":[0,0,0,0],"texture":null},"east":{"uv":[6,0,10,16],"texture":2},"south":{"uv":[0,0,0,0],"texture":null},"west":{"uv":[6,0,10,16],"texture":2},"up":{"uv":[3,0,7,16],"rotation":90,"texture":4},"down":{"uv":[3,0,7,16],"rotation":90,"texture":4}},"type":"cube","uuid":"8912c0cc-e2ce-12bb-00ac-c52960b58107"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-0.05000000000000071,0.05000000000000071,6],"to":[-15.95,15.950000000000003,10],"autouv":0,"color":9,"origin":[-16,0,0],"faces":{"north":{"uv":[0,0,0,0],"texture":null},"east":{"uv":[6,0,10,16],"texture":2},"south":{"uv":[0,0,0,0],"texture":null},"west":{"uv":[6,0,10,16],"texture":2},"up":{"uv":[3,0,7,16],"rotation":90,"texture":4},"down":{"uv":[3,0,7,16],"rotation":90,"texture":4}},"type":"cube","uuid":"d0b8b748-62f4-8b5f-3e92-b3964f0ba6fa"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[0,-16,0],"to":[16,0,16],"autouv":1,"color":5,"origin":[0,-16,0],"faces":{"north":{"uv":[0,0,16,16],"texture":3},"east":{"uv":[0,0,16,16],"texture":3},"south":{"uv":[0,0,16,16],"texture":3},"west":{"uv":[0,0,16,16],"texture":3},"up":{"uv":[0,0,16,16],"texture":3},"down":{"uv":[0,0,16,16],"texture":3}},"type":"cube","uuid":"709fa87e-af5c-f7ba-b040-dd274f0cb23b"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[16,-16,0],"to":[32,0,16],"autouv":1,"color":5,"origin":[16,-16,0],"faces":{"north":{"uv":[0,0,16,16],"texture":3},"east":{"uv":[0,0,16,16],"texture":3},"south":{"uv":[0,0,16,16],"texture":3},"west":{"uv":[0,0,16,16],"texture":3},"up":{"uv":[0,0,16,16],"texture":3},"down":{"uv":[0,0,16,16],"texture":3}},"type":"cube","uuid":"da2fa599-f38c-f451-2628-9b39380480dd"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-16,-16,0],"to":[0,0,16],"autouv":1,"color":5,"origin":[-16,-16,0],"faces":{"north":{"uv":[0,0,16,16],"texture":3},"east":{"uv":[0,0,16,16],"texture":3},"south":{"uv":[0,0,16,16],"texture":3},"west":{"uv":[0,0,16,16],"texture":3},"up":{"uv":[0,0,16,16],"texture":3},"down":{"uv":[0,0,16,16],"texture":3}},"type":"cube","uuid":"5851f75e-2bf6-395e-f0b1-5b84ccb2698d"},{"name":"box","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[34,-15,2],"to":[46,-5,14],"autouv":0,"color":2,"rotation":[0,45,0],"origin":[40,-10,8],"faces":{"north":{"uv":[3,5.25,6,7.75],"texture":7},"east":{"uv":[3,0.25,6,2.75],"texture":7},"south":{"uv":[6,5.25,3,7.75],"texture":7},"west":{"uv":[3,2.75,6,5.25],"texture":7},"up":{"uv":[3,7.75,6,10.75],"rotation":180,"texture":7},"down":{"uv":[3,10.75,6,13.75],"rotation":270,"texture":7}},"type":"cube","uuid":"f168b2eb-aa48-4997-84ff-7052c1d6d492"},{"name":"box","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[33,-5,3],"to":[43,3,13],"autouv":0,"color":2,"origin":[37,-1,8],"faces":{"north":{"uv":[0.25,4.25,2.75,6.25],"texture":7},"east":{"uv":[0.25,0.25,2.75,2.25],"texture":7},"south":{"uv":[2.75,4.25,0.25,6.25],"texture":7},"west":{"uv":[0.25,2.25,2.75,4.25],"texture":7},"up":{"uv":[0.25,6.25,2.75,8.75],"rotation":180,"texture":7},"down":{"uv":[0.25,8.75,2.75,11.25],"rotation":180,"texture":7}},"type":"cube","uuid":"12fa5088-3f91-f4f9-10a1-2af3a696c0fe"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[1,17,2],"to":[7,23,4],"autouv":1,"color":9,"origin":[0,16,2],"faces":{"north":{"uv":[0,0,6,6]},"east":{"uv":[0,0,2,6]},"south":{"uv":[0,0,6,6]},"west":{"uv":[0,0,2,6]},"up":{"uv":[0,0,6,2]},"down":{"uv":[0,0,6,2]}},"type":"cube","uuid":"7d56ba64-5525-dff7-3833-5b071bcdd163"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[0,16,2.9],"to":[8,24,4],"autouv":1,"color":5,"origin":[0,16,2],"faces":{"north":{"uv":[0,0,8,8],"texture":3},"east":{"uv":[0,0,1.1,8],"texture":3},"south":{"uv":[0,0,8,8],"texture":3},"west":{"uv":[0,0,1.1,8],"texture":3},"up":{"uv":[0,0,8,1.1],"texture":3},"down":{"uv":[0,0,8,1.1],"texture":3}},"type":"cube","uuid":"23cb6d79-5fa8-9450-1d9e-62e00a93283f"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[16,24,2.9],"to":[24,32,4],"autouv":1,"color":5,"origin":[16,24,2],"faces":{"north":{"uv":[0,0,8,8],"texture":3},"east":{"uv":[0,0,1.1,8],"texture":3},"south":{"uv":[0,0,8,8],"texture":3},"west":{"uv":[0,0,1.1,8],"texture":3},"up":{"uv":[0,0,8,1.1],"texture":3},"down":{"uv":[0,0,8,1.1],"texture":3}},"type":"cube","uuid":"e416b457-1c0b-74dc-19d7-209c35c9722c"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[17,25,2],"to":[23,31,4],"autouv":1,"color":9,"origin":[16,24,2],"faces":{"north":{"uv":[0,0,6,6]},"east":{"uv":[0,0,2,6]},"south":{"uv":[0,0,6,6]},"west":{"uv":[0,0,2,6]},"up":{"uv":[0,0,6,2]},"down":{"uv":[0,0,6,2]}},"type":"cube","uuid":"3ae91df1-dc58-bbb5-f466-4ddef96b1dc2"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[16,16,2.9],"to":[24,24,4],"autouv":1,"color":5,"origin":[16,16,2],"faces":{"north":{"uv":[0,0,8,8],"texture":3},"east":{"uv":[0,0,1.1,8],"texture":3},"south":{"uv":[0,0,8,8],"texture":3},"west":{"uv":[0,0,1.1,8],"texture":3},"up":{"uv":[0,0,8,1.1],"texture":3},"down":{"uv":[0,0,8,1.1],"texture":3}},"type":"cube","uuid":"a9121026-2aed-a946-6011-79ad4712d797"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[17,17,2],"to":[23,23,4],"autouv":1,"color":9,"origin":[16,16,2],"faces":{"north":{"uv":[0,0,6,6]},"east":{"uv":[0,0,2,6]},"south":{"uv":[0,0,6,6]},"west":{"uv":[0,0,2,6]},"up":{"uv":[0,0,6,2]},"down":{"uv":[0,0,6,2]}},"type":"cube","uuid":"de77d797-3428-8af4-425d-cbec659e4317"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[24,8,2.9],"to":[32,16,4],"autouv":1,"color":5,"origin":[24,8,2],"faces":{"north":{"uv":[0,0,8,8],"texture":3},"east":{"uv":[0,0,1.1,8],"texture":3},"south":{"uv":[0,0,8,8],"texture":3},"west":{"uv":[0,0,1.1,8],"texture":3},"up":{"uv":[0,0,8,1.1],"texture":3},"down":{"uv":[0,0,8,1.1],"texture":3}},"type":"cube","uuid":"f3ad9cfa-e77c-28c8-5228-93b1fffad997"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[25,9,2],"to":[31,15,4],"autouv":1,"color":9,"origin":[24,8,2],"faces":{"north":{"uv":[0,0,6,6]},"east":{"uv":[0,0,2,6]},"south":{"uv":[0,0,6,6]},"west":{"uv":[0,0,2,6]},"up":{"uv":[0,0,6,2]},"down":{"uv":[0,0,6,2]}},"type":"cube","uuid":"37950a5b-d169-0c20-539e-e1d8d6928ead"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[0,8,2.9],"to":[8,16,4],"autouv":1,"color":5,"origin":[0,8,2],"faces":{"north":{"uv":[0,0,8,8],"texture":3},"east":{"uv":[0,0,1.1,8],"texture":3},"south":{"uv":[0,0,8,8],"texture":3},"west":{"uv":[0,0,1.1,8],"texture":3},"up":{"uv":[0,0,8,1.1],"texture":3},"down":{"uv":[0,0,8,1.1],"texture":3}},"type":"cube","uuid":"4ff5d83b-0db9-d185-6515-40b8f077d208"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[1,9,2],"to":[7,15,4],"autouv":1,"color":9,"origin":[0,8,2],"faces":{"north":{"uv":[0,0,6,6]},"east":{"uv":[0,0,2,6]},"south":{"uv":[0,0,6,6]},"west":{"uv":[0,0,2,6]},"up":{"uv":[0,0,6,2]},"down":{"uv":[0,0,6,2]}},"type":"cube","uuid":"0d335727-a5e5-0748-1f3d-3a6db0451681"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[7,11,2],"to":[25,12,4],"autouv":1,"color":5,"origin":[23,10,2],"faces":{"north":{"uv":[0,0,16,1]},"east":{"uv":[0,0,2,1]},"south":{"uv":[0,0,16,1]},"west":{"uv":[0,0,2,1]},"up":{"uv":[0,0,16,2]},"down":{"uv":[0,0,16,2]}},"type":"cube","uuid":"c8d0fded-9b71-948c-d423-6710a5d09b27"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[19,12,2],"to":[20,17,4],"autouv":1,"color":5,"origin":[22,13,2],"faces":{"north":{"uv":[0,0,1,5]},"east":{"uv":[0,0,2,5]},"south":{"uv":[0,0,1,5]},"west":{"uv":[0,0,2,5]},"up":{"uv":[0,0,1,2]},"down":{"uv":[0,0,1,2]}},"type":"cube","uuid":"abdd6b8c-b21f-9b63-20bf-5859ad115ee1"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[18,24,2],"to":[21,25,4],"autouv":1,"color":7,"origin":[22,21,2],"faces":{"north":{"uv":[0,0,3,1]},"east":{"uv":[0,0,2,1]},"south":{"uv":[0,0,3,1]},"west":{"uv":[0,0,2,1]},"up":{"uv":[0,0,3,2]},"down":{"uv":[0,0,3,2]}},"type":"cube","uuid":"80262d0c-962b-bf27-9189-1c28748c94b0"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[19,23,2],"to":[20,24,4],"autouv":1,"color":7,"origin":[22,20,2],"faces":{"north":{"uv":[0,0,1,1]},"east":{"uv":[0,0,2,1]},"south":{"uv":[0,0,1,1]},"west":{"uv":[0,0,2,1]},"up":{"uv":[0,0,1,2]},"down":{"uv":[0,0,1,2]}},"type":"cube","uuid":"d83fd3c5-c05b-5c85-a2df-465dfdbd2128"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[8,10,2],"to":[9,13,4],"autouv":1,"color":5,"origin":[11,10,2],"faces":{"north":{"uv":[0,0,1,3]},"east":{"uv":[0,0,2,3]},"south":{"uv":[0,0,1,3]},"west":{"uv":[0,0,2,3]},"up":{"uv":[0,0,1,2]},"down":{"uv":[0,0,1,2]}},"type":"cube","uuid":"5f637b44-5202-5970-8a1d-7a0f317bdbe6"},{"name":"Axis","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[3.4500000000000006,11.209999999999999,-1.0350000000000001],"to":[4.789999999999999,12.549999999999999,4.325],"autouv":0,"color":0,"origin":[1.4399999999999995,14.559999999999999,-1.0350000000000001],"faces":{"north":{"uv":[6,6,10,10],"rotation":180,"texture":12},"east":{"uv":[6,0,10,16],"rotation":270,"texture":11},"south":{"uv":[6,6,10,10],"texture":12},"west":{"uv":[6,0,10,16],"rotation":90,"texture":11},"up":{"uv":[6,0,10,16],"rotation":180,"texture":11},"down":{"uv":[6,0,10,16],"texture":11}},"type":"cube","uuid":"3b1f8416-fe8f-e0be-07b9-56efd5145e7b"},{"name":"Gear","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[1.1049999999999995,11.3775,1.1425],"to":[7.135,12.3825,2.1475],"autouv":0,"color":7,"origin":[1.4399999999999995,14.559999999999999,-1.0350000000000001],"faces":{"north":{"uv":[7,6,16,7.5],"rotation":180,"texture":13},"east":{"uv":[5,8,6.5,9.5],"rotation":270,"texture":13},"south":{"uv":[7,6,16,7.5],"texture":13},"west":{"uv":[5,8,6.5,9.5],"rotation":90,"texture":13},"up":{"uv":[7,8,16,9.5],"rotation":180,"texture":13},"down":{"uv":[7,8,16,9.5],"texture":13}},"type":"cube","uuid":"00f373c7-757d-179f-06c5-d5639d25da09"},{"name":"Gear2","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[1.1049999999999995,11.3775,1.1425],"to":[7.135,12.3825,2.1475],"autouv":0,"color":9,"rotation":[0,0,45],"origin":[4.120000000000001,11.879999999999999,1.6449999999999996],"faces":{"north":{"uv":[7,6,16,7.5],"rotation":180,"texture":13},"east":{"uv":[5,8,6.5,9.5],"rotation":270,"texture":13},"south":{"uv":[7,6,16,7.5],"texture":13},"west":{"uv":[5,8,6.5,9.5],"rotation":90,"texture":13},"up":{"uv":[7,8,16,9.5],"rotation":180,"texture":13},"down":{"uv":[7,8,16,9.5],"texture":13}},"type":"cube","uuid":"02616f77-ee0a-8a39-e290-c8e247acd576"},{"name":"Gear3","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[1.1049999999999995,11.3775,1.1425],"to":[7.135,12.3825,2.1475],"autouv":0,"color":0,"rotation":[0,0,-45],"origin":[4.120000000000001,11.879999999999999,1.6449999999999996],"faces":{"north":{"uv":[7,6,16,7.5],"rotation":180,"texture":13},"east":{"uv":[5,8,6.5,9.5],"rotation":270,"texture":13},"south":{"uv":[7,6,16,7.5],"texture":13},"west":{"uv":[5,8,6.5,9.5],"rotation":90,"texture":13},"up":{"uv":[7,8,16,9.5],"rotation":180,"texture":13},"down":{"uv":[7,8,16,9.5],"texture":13}},"type":"cube","uuid":"72028ce0-c3fe-cddd-e90e-3e9a1f2e897b"},{"name":"Gear4","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[3.6175,8.864999999999998,1.1425],"to":[4.622499999999999,14.895,2.1475],"autouv":0,"color":6,"origin":[1.4399999999999995,14.559999999999999,-1.0350000000000001],"faces":{"north":{"uv":[7,6,16,7.5],"rotation":270,"texture":13},"east":{"uv":[7,8,16,9.5],"rotation":270,"texture":13},"south":{"uv":[7,6,16,7.5],"rotation":90,"texture":13},"west":{"uv":[7,8,16,9.5],"rotation":90,"texture":13},"up":{"uv":[5,8,6.5,9.5],"rotation":180,"texture":13},"down":{"uv":[5,8,6.5,9.5],"texture":13}},"type":"cube","uuid":"ee9a1263-03dc-505c-0f71-05f7617d1d33"},{"name":"GearCaseInner","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[2.1099999999999994,9.87,1.1592500000000001],"to":[6.129999999999999,13.89,2.130749999999999],"autouv":0,"color":5,"origin":[1.4399999999999995,14.559999999999999,-1.0350000000000001],"faces":{"north":{"uv":[4,0,10,6],"rotation":180,"texture":13},"east":{"uv":[0,6,6,7.5],"rotation":270,"texture":13},"south":{"uv":[4,0,10,6],"texture":13},"west":{"uv":[0,6,6,7.5],"rotation":90,"texture":13},"up":{"uv":[0,6,6,7.5],"rotation":180,"texture":13},"down":{"uv":[0,6,6,7.5],"texture":13}},"type":"cube","uuid":"40625058-f506-3061-ec6c-0a5cfeb335bc"},{"name":"GearCaseOuter","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[2.78,10.54,0.9749999999999996],"to":[5.459999999999999,13.219999999999999,2.3149999999999995],"autouv":0,"color":2,"origin":[1.4399999999999995,14.559999999999999,-1.0350000000000001],"faces":{"north":{"uv":[0,0,4,4],"rotation":180,"texture":13},"east":{"uv":[0,4,4,6],"rotation":270,"texture":13},"south":{"uv":[0,0,4,4],"texture":13},"west":{"uv":[0,4,4,6],"rotation":90,"texture":13},"up":{"uv":[0,4,4,6],"rotation":180,"texture":13},"down":{"uv":[0,4,4,6],"texture":13}},"type":"cube","uuid":"bb81bc93-d0d9-2ccb-00ef-d546c7b87357"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[18,18,0],"to":[22,22,4],"autouv":0,"color":0,"origin":[18,18,0],"faces":{"north":{"uv":[0,0,16,16],"texture":15},"east":{"uv":[0,0,16,16],"texture":15},"south":{"uv":[0,0,16,16],"texture":15},"west":{"uv":[0,0,16,16],"texture":15},"up":{"uv":[0,0,16,16],"texture":15},"down":{"uv":[0,0,16,16],"texture":15}},"type":"cube","uuid":"edf7d183-03fd-9df1-9698-56dbf0d158d4"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[18,26,0],"to":[22,30,4],"autouv":0,"color":0,"origin":[18,26,0],"faces":{"north":{"uv":[0,0,16,16],"texture":16},"east":{"uv":[0,0,16,16],"texture":16},"south":{"uv":[0,0,16,16],"texture":16},"west":{"uv":[0,0,16,16],"texture":16},"up":{"uv":[0,0,16,16],"texture":16},"down":{"uv":[0,0,16,16],"texture":16}},"type":"cube","uuid":"f1a2d481-12a0-7e86-4160-a585cb68b418"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[25.52,9.699999999999998,1.7410000000000005],"to":[30.28,14.459999999999999,6.501],"autouv":0,"color":0,"origin":[25.52,9.699999999999998,1.7410000000000005],"faces":{"north":{"uv":[0,0,16,16],"texture":17},"east":{"uv":[0,0,0,0],"texture":null},"south":{"uv":[0,0,0,0],"texture":null},"west":{"uv":[0,0,0,0],"texture":null},"up":{"uv":[0,0,0,0],"texture":null},"down":{"uv":[0,0,0,0],"texture":null}},"type":"cube","uuid":"994c2fff-91fb-f425-3e6c-dc2415909031"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[1.5199999999999996,17.699999999999996,1.7410000000000005],"to":[6.280000000000001,22.46,6.501],"autouv":0,"color":0,"origin":[1.5199999999999996,17.699999999999996,1.7410000000000005],"faces":{"north":{"uv":[0,0,16,16],"texture":18},"east":{"uv":[0,0,0,0],"texture":null},"south":{"uv":[0,0,0,0],"texture":null},"west":{"uv":[0,0,0,0],"texture":null},"up":{"uv":[0,0,0,0],"texture":null},"down":{"uv":[0,0,0,0],"texture":null}},"type":"cube","uuid":"d0536c95-b5a6-5761-c358-f3f0c09c703f"}],"outliner":[{"name":"group","origin":[0,0,0],"color":0,"uuid":"31baba0a-6741-3c3c-c928-d479fae06e0b","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"children":["f3e6ac4a-ae8e-b4ec-c08a-72c0aff87260","a864f9d2-8b98-0a6b-5905-068e12a4ed4a","8bfa9753-ea73-56a2-f9cb-e6d0607b1eeb","1ab06a32-ddca-3cc5-6184-730fb810df9e"]},{"name":"group","origin":[0,0,0],"color":0,"uuid":"bbbd62e8-892f-d3c4-182c-317adac38594","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"children":["94f28cc4-aeef-2708-2953-bf1c6ec85c3b","d55a2435-fced-d6da-06a7-6a3ae6c11144","1b50c803-07bd-b324-dc37-d0e3bdd41e7a","5b6aff94-5c3f-5dcf-db00-782eafc22986"]},{"name":"group","origin":[0,0,0],"color":0,"uuid":"56114a43-c82b-b74b-e5b5-44005e14e504","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"children":["95ceca62-28f7-0a06-296c-3e3abeb80f66","45f0e7a2-258c-31f8-2f98-f1fbf01bd607","78e6ba39-615d-19a9-f608-d2e16fed3ebe","0c46257c-d3c8-6d34-b3bb-b072afda5de3"]},{"name":"group","origin":[0,0,0],"color":0,"uuid":"32ac98d0-05a5-4be3-22fe-c7707e43820c","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"children":["6abd6abb-73fa-6522-3fb6-816a2e21621d","db5c3c11-192d-ece3-8a9f-7063d170e18a","8912c0cc-e2ce-12bb-00ac-c52960b58107","d0b8b748-62f4-8b5f-3e92-b3964f0ba6fa"]},{"name":"group","origin":[0,0,0],"color":0,"uuid":"7312a41e-fe28-6703-bb72-7bd254030063","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"children":["b1792b7b-bd79-d27e-82d7-0ce76650122f","248a3ef9-643f-bfdf-ed3f-277a68c1e31f","13dd54f8-ca6f-19ed-e70b-b325f6e7c88d","cb2a5eec-1ee0-f954-1a1f-f611aa48d07a"]},{"name":"group","origin":[0,0,0],"color":0,"uuid":"b1720c20-248e-e67f-9a91-96d68b3b565b","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"children":["0ffa2507-5119-81f8-7c2f-8b06672e9bc8","79acb8f9-546a-acbc-06bd-0db7adf4562b","b8995380-5649-968b-702a-c45125c8028f","1c8efa84-aa71-c7d9-f0d9-c4bed393985b"]},"709fa87e-af5c-f7ba-b040-dd274f0cb23b","da2fa599-f38c-f451-2628-9b39380480dd","5851f75e-2bf6-395e-f0b1-5b84ccb2698d",{"name":"cardboard_12x10","origin":[8,8,8],"color":0,"uuid":"a04c4950-b0ff-ca6a-62a0-bff392880f46","export":true,"mirror_uv":false,"isOpen":false,"locked":false,"visibility":true,"autouv":0,"children":[{"name":"package_2","origin":[8,8,8],"color":0,"uuid":"77a5b652-a7d2-350e-f49f-8744f18e7102","export":true,"mirror_uv":false,"isOpen":false,"locked":false,"visibility":true,"autouv":0,"children":["f168b2eb-aa48-4997-84ff-7052c1d6d492"]}]},{"name":"cardboard_10x8","origin":[8,8,8],"color":0,"uuid":"cda42963-2d40-ebd2-3578-d1d296107dd6","export":true,"mirror_uv":false,"isOpen":false,"locked":false,"visibility":true,"autouv":0,"children":[{"name":"package_1","origin":[8,8,8],"color":0,"uuid":"2a1e9339-7c05-6aa5-8835-0be3e77e0a88","export":true,"mirror_uv":false,"isOpen":false,"locked":false,"visibility":true,"autouv":0,"children":["12fa5088-3f91-f4f9-10a1-2af3a696c0fe"]}]},{"name":"group","origin":[0,16,2],"color":0,"uuid":"62f756b2-52a4-aa55-976a-c0409bf58695","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"children":["23cb6d79-5fa8-9450-1d9e-62e00a93283f","7d56ba64-5525-dff7-3833-5b071bcdd163"]},{"name":"group","origin":[0,16,2],"color":0,"uuid":"cc4f5f8e-f45f-4291-e79d-65c31db9be39","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"children":["e416b457-1c0b-74dc-19d7-209c35c9722c","3ae91df1-dc58-bbb5-f466-4ddef96b1dc2"]},{"name":"group","origin":[0,16,2],"color":0,"uuid":"389d6b8a-1af6-33cb-2274-6527f87f8dec","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"children":["a9121026-2aed-a946-6011-79ad4712d797","de77d797-3428-8af4-425d-cbec659e4317"]},{"name":"group","origin":[0,16,2],"color":0,"uuid":"44e5557f-c525-1521-4449-7e04f2dfc33c","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"children":["f3ad9cfa-e77c-28c8-5228-93b1fffad997","37950a5b-d169-0c20-539e-e1d8d6928ead"]},{"name":"group","origin":[0,16,2],"color":0,"uuid":"33cd31ab-a826-79fa-5fba-ea017522864c","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"children":["4ff5d83b-0db9-d185-6515-40b8f077d208","0d335727-a5e5-0748-1f3d-3a6db0451681"]},"c8d0fded-9b71-948c-d423-6710a5d09b27","abdd6b8c-b21f-9b63-20bf-5859ad115ee1","5f637b44-5202-5970-8a1d-7a0f317bdbe6","80262d0c-962b-bf27-9189-1c28748c94b0","d83fd3c5-c05b-5c85-a2df-465dfdbd2128",{"name":"cogwheel","origin":[8,8,8],"color":0,"uuid":"63eb11b7-5894-a221-7569-8075bb6bf7c6","export":true,"mirror_uv":false,"isOpen":false,"locked":false,"visibility":true,"autouv":0,"children":["3b1f8416-fe8f-e0be-07b9-56efd5145e7b","00f373c7-757d-179f-06c5-d5639d25da09","02616f77-ee0a-8a39-e290-c8e247acd576","72028ce0-c3fe-cddd-e90e-3e9a1f2e897b","ee9a1263-03dc-505c-0f71-05f7617d1d33","40625058-f506-3061-ec6c-0a5cfeb335bc","bb81bc93-d0d9-2ccb-00ef-d546c7b87357"]},"edf7d183-03fd-9df1-9698-56dbf0d158d4","994c2fff-91fb-f425-3e6c-dc2415909031","d0536c95-b5a6-5761-c358-f3f0c09c703f","f1a2d481-12a0-7e86-4160-a585cb68b418"],"textures":[{"path":"C:\\Users\\simon\\Desktop\\Modding\\Forge 20 1 Concealed\\Create\\src\\main\\resources\\assets\\create\\textures\\block\\flap_display_front.png","name":"flap_display_front.png","folder":"block","namespace":"create","id":"2","group":"","width":16,"height":16,"uv_width":16,"uv_height":16,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"3853a254-d4c1-6932-f7af-9ace9354a8e5","relative_path":"../../../textures/block/flap_display_front.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAJRJREFUOE9jNDIy/s/AwMDAzMwEosDg799/cDaMgUueMSgoFGwAHx8fWO2nT58wNOOTZ7S2sf3/88cPsCZ2Dg4wTQqfUVtbF+wCcsEgcAEsEH/8+IbVFxwcXGBxXPKMGhqa/5GjCFs04pNnBKUDigyAeQHd/cSmi0EQCwOfEr28vFGSMqF4R5dn1NbWRjEAPSsTimIADrx310Hfd9cAAAAASUVORK5CYII="},{"path":"C:\\Users\\simon\\Desktop\\Modding\\Forge 20 1 Concealed\\Create\\src\\main\\resources\\assets\\create\\textures\\block\\dark_metal_block.png","name":"dark_metal_block.png","folder":"block","namespace":"create","id":"3","group":"","width":16,"height":16,"uv_width":16,"uv_height":16,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"3b4e1205-847b-fdf5-c413-69c518d563ed","relative_path":"../../../textures/block/dark_metal_block.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAWlJREFUOE+Fk01vgkAQhocKqGBak3qyCQeTmibYhKTS//8jWo6kWrzZxJKKykdp3jGzXSimc1mYnffZ2ZlZIwzDmoioqr6xKOv1rvi77YdP9vBtBEFQB8FTQ6z/pGn6Z+94zNgXxzEZi8VjvVw+UxS9XoR0bYzHN7TZJE2AZZmN2KIo+X/oDHnt2zavpmlSWZbdANOyOKgsCgWDz3Uc2mcZQwCArVZvvzXAFeQkiPXTRSxEgSjAbHZPSfLOAIjz/MSxhtGjyeSWT5aMkM1FAGqAgGz/xeJ2RrLfAKAL8/kDZyBFRAa23WeYfp1OAOZAroCALnFdV5yRdES6wW0EYDq9o+32Q2WAQNd1abf7JIilHnoG8K3X6/MceJ7XAEB8ynM6ZAcG4HQR6/OgAFIDFA3pQSyGGshstNuoRlkAaBkPUXmeQDEZHH0PPgXAFWCDgdMQyqPRnQIfja4pil7I8H2fn3OX/feUofkBipPU/87OVPMAAAAASUVORK5CYII="},{"path":"C:\\Users\\simon\\Desktop\\Modding\\Forge 20 1 Concealed\\Create\\src\\main\\resources\\assets\\create\\textures\\block\\girder_pole_side.png","name":"girder_pole_side.png","folder":"block","namespace":"create","id":"4","group":"","width":16,"height":16,"uv_width":16,"uv_height":16,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"ec032fcc-3adf-8fc0-18db-1979f0d79bb8","relative_path":"../../../textures/block/girder_pole_side.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAANZJREFUOE9jZEADLi4u/7m5uRm4ODkZ+Dg5wbKfvn9n+Pb9O8PXr18Z9uzZw4isBYUDkrC3c/rPysbEADIEBEAGwTT//vWP4eChffgNALnA1sqK4dzFi3BXvHj3jsFIX5/h8LFjxLng27dvDFLS4igGPHv6koGLi4s4F4CcDgsHEJskL1AlDJBdAIoJUBiAAH1iAdkLsLQAcgHIdhAgmA5A0YjNCyADiE4HAx8LVEuJyHmBpJSInApB6YCk3KikpP5fWEgQnO6RASh/vH33nuHevZsouREAn+jHERFo+EIAAAAASUVORK5CYII="},{"path":"C:\\Users\\simon\\Desktop\\Modding\\Forge 20 1 Concealed\\Create\\src\\main\\resources\\assets\\create\\textures\\block\\industrial_iron_block.png","name":"industrial_iron_block.png","folder":"block","namespace":"create","id":"8","group":"","width":16,"height":16,"uv_width":16,"uv_height":16,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"28cbf0a9-6426-927b-875d-44a4b85db3dc","relative_path":"../../../textures/block/industrial_iron_block.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAYhJREFUOE+dU01LAlEUvRN+MCPJBBaMZIFCBEIt+qCFGLTSRe1a+ONctKtF61yH61oYuDGIrKZossHQhx9knDfd54xpC+/m3XfnvfPOOfeOtrd7MDIMg+YJ58Mh7TB/NCqVTumqUqGNdFrhtF2X4qYp95xjRby2WlQsFKhcPvMAzKVFcj+/5MdwZEGBhEMhmQ+GQ1Ub9L9ljjsvz28ewP7ONt3V67RmWdQWglYtK6CIGTzZNsV1nR5tW569qdXHALe1mrwUi8XI0HV5kAOgiK4Q1Ol0ZL6cSFCj8eABbGbWJappmuriLP0Ac12XItHoWEIyuULvjqNe55f/Y/GHwX2zSZlUSnqAi2Aw2Qn+xmeVBywBtBDwAMEM/B6g3u/1pFzlwTQJzILnQK5CKCNhtmojGIAWd8HPgv1ABxBTuzDJAK+zXn6Za9zKgIkAQGsQ8IE9CEzT7xxAv5xEvwezRnkSAPupo3xyXKTralV1ADSZBWv3s0Itn8vR+cUladns1sjQ5/udu6JLP4KD+tf6Oo96AAAAAElFTkSuQmCC"},{"path":"C:\\Users\\simon\\Desktop\\Modding\\Forge 20 1 Concealed\\Create\\src\\main\\resources\\assets\\create\\textures\\block\\flap_display_top.png","name":"flap_display_top.png","folder":"block","namespace":"create","id":"5","group":"","width":16,"height":16,"uv_width":16,"uv_height":16,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"f9abc3b1-8eb7-24a7-2884-1ada79958942","relative_path":"../../../textures/block/flap_display_top.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAANBJREFUOE/Fk7EKgzAQhs/6ABXqZMFBqBS0EKhK338qOsc6BbW62SVIcdCmBKoQMKZQpFnCXcLH3X/3a2EYMgCAYXjxazq6vhHiJEk0IfEJNIQQQ+gsvFFKp7htKZRlCVl2mwf4/okFQQRpiiGOr8KnKLoww9hCXVeAMf4TwDR3UBS5vIJRA1kLXwEc5wBVdZ/VYH0An4LrHterQDlGLqJl7aFpHtI9UC6Sbdu/AVQaEEKWV3kJwDVQtsC9MBqo656Csfq+XwZ4nsdUVuZEmZneGRnTEZjeOtQAAAAASUVORK5CYII="},{"path":"C:\\Users\\simon\\Desktop\\Modding\\Forge 20 1 Concealed\\Create\\src\\main\\resources\\assets\\create\\textures\\block\\flap_display_inside.png","name":"flap_display_inside.png","folder":"block","namespace":"create","id":"6","group":"","width":16,"height":16,"uv_width":16,"uv_height":16,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"46fa4f13-a24c-bdd1-e644-26f8d1032de0","relative_path":"../../../textures/block/flap_display_inside.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAR5JREFUOE+NU8uOgzAMdEpJt8mx/QtYiQv//0t9CKpCaVZjaZADrFpfYieZsT1xXNu2SURkmt5YZiuKnfrLfezxDL5rmiZ5/5OBvw1ut6u4uv5NIUQpy/2M25elPPqHxtgfx5ccw1Hjg/e6Xi5X6bp7TgAg7DWOClqSxhCk63slWREwgwWzEpwRzDJRoVZADXAJ4GF4inOFlsw2zueTZsY5jMQZAXu1fcMnMXy2tUmACylNmp1mNbCaZAR8BYC9P8wtAIyLVhNLAn/VAvqHgciC7VyQeCUiDkAAMA1ZqAnFpS4g+HeQYozyHAZ9BRLr2LpCY2qwSUAwnwxVUNylLhkBngsThsycxqUm3N+s4NsPZO9pBVVV6Xfesk9fGZg/EXXv/1sbuAAAAAAASUVORK5CYII="},{"path":"C:\\Users\\simon\\Desktop\\Modding\\Forge 20 1 Concealed\\Create\\src\\main\\resources\\assets\\create\\textures\\block\\factory_board.png","name":"factory_board.png","folder":"block","namespace":"create","id":"7","group":"","width":16,"height":16,"uv_width":16,"uv_height":16,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"af44dd06-4afa-f17a-420f-a36e0fee8003","relative_path":"../../../textures/block/factory_board.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAADVJREFUOE9j7Onp/M9AAWAEGfDt2ze4EVxcXAyk8AeJARQEAcMg8QIpoY4eS2AvjIbBiA8DAEs9uKkSz7+xAAAAAElFTkSuQmCC"},{"path":"C:\\Users\\simon\\Desktop\\Modding\\Forge 20 1 Concealed\\Create\\src\\main\\resources\\assets\\create\\textures\\entity\\package\\cardboard.png","name":"cardboard.png","folder":"entity/package","namespace":"create","id":"0","group":"","width":64,"height":64,"uv_width":16,"uv_height":16,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"004fb2ad-e1ca-f677-2021-0045ac660e4b","relative_path":"../../../textures/entity/package/cardboard.png","source":"data:image/png;base64,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"},{"path":"C:\\Users\\simon\\Desktop\\Modding\\Forge 20 1 Concealed\\Create\\src\\main\\resources\\assets\\create\\textures\\entity\\package\\cardboard_particle.png","name":"cardboard_particle.png","folder":"entity/package","namespace":"create","id":"particle","group":"","width":16,"height":16,"uv_width":16,"uv_height":16,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"738d687e-24d9-f0eb-5344-4fa58d18e9bc","relative_path":"../../../textures/entity/package/cardboard_particle.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAARxJREFUOE9jZKAQMFKonwFuwOXV9f9//vwJN09aw4zh6ZPHDNIysgw/vn5kePv4JlyOnZ2dQTe0EawXbsDBmbn/b1y7xsAvKABWqG/pxvD+wzsGQQEhhq/ffzDcuXAILP7x/QcGDS0tBvv0yZgGCAkJMXz+/ImBl5ePgUdMgeHHj18MHBxsDKwszAyvH99iYGFmBsv//v0HtwEgb4CcCDLgy6sHcBomTtCAP3//wm0CuQSmEZn++vUrbhfgMgAmDqI/ffxI2AswG5E1gsKAoAHYNIA0Eu0FdD/DDCTaAFg04jIIZyxs6kn5rygvDU8HuAITZMCbd58Z/ErmoCYkkAH8vJwMv3//ZWBlZYYnW2z8bz9+YRpAbqaiODcCAPW59hHCn6lGAAAAAElFTkSuQmCC"},{"path":"C:\\Users\\simon\\Desktop\\Modding\\Forge 20 1 Concealed\\Create\\src\\main\\resources\\assets\\create\\textures\\block\\large_cogwheel.png","name":"large_cogwheel.png","folder":"block","namespace":"create","id":"5_4","group":"","width":32,"height":32,"uv_width":16,"uv_height":16,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"615e5b1e-f07c-03e8-e356-b36ad8907aeb","relative_path":"../../../textures/block/large_cogwheel.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAA15JREFUWEfFV71uE0EQnktsn3O+xJCISKQhvECEBA15BSS6FFCRjgeggQIJCioegC4dDR0Sr0BFgXgBUoFkRIyd88V3cVj49vSdd9dr50ISM83a692db2a++XHw+P6WisMF8UmS/ba2fefcM7zw5v2XAJ9fPLqrsvxYwkZdsCqlJAiC8nvwZOeW4iU+lp0UO+GiDQv72CMQ8zz3f6YF6L0PBYDde1vq5nosXzuJ+NYAHsBBKqVKKnf3CcwFSVAugGcP76hm2JCjYSZLzbBch1ku2NcAaNnGWiz9JBVY1qyNrR+ObE+Yv0XNhnzv5bIWFWF0ATx9cFtBMd5diSPpHQ70CgDYtzyAR/hAlqUTtAjDyNrDmc31KxoAxLzPECDEy60lORwcCdZufyAAnR+PNBDNASrlA3A/rYT1cO/oZExI7n3rJrJxNdYegxenAWjUa1oh1nSY2wAYAlhwvV24sx0WhgKpT/AIpNMfe2AaCWEgFFNoOTlhhQAA9ju/tFW4RNe6IHDuIMmln6b6LD0IECQnQ2CSEOkHAfnICS+AlSiS1bjwhinkBeIOAViTAz4ALglBPtQEcEJzgGmIBxFrWIOHAACu7mUiSbenFdajul6hlL+ZcZ/GAbIelgMABUC8WQAOIP5VAJA3s7IAAHx1AHfKOuCSkPmNfbqeaQilpgeYBbNCgPxvL7d0HcBqkZDEIfuZAeSAWxPcEMwCgFK8ea0l+z8G4lutEPjSD2kDYS4zfr7cN3sHm9HL3W3FsutbdSFiU2HxYfxriwtl8aBisyy7aQgSvn73uci1ijLhAbDedLmv/JYsDiNdvFATmEXnAoDHIHT7aUawwoErrIRnBmCGYJpCs/W6bdedGRj708Dzd2sg8V1yhxTmO1ZzGgIwfD8XAD7ojl7mvu8MqifnAc4SIGsVMNoDZqsF86fNea6H3DaNu3gLK6QKH6xe4Bu/qsTS5QHS+b95oIrVplE6BEgndKqDXqLd5yNeFU+4Z+gZhmq1HesjmAUIdO4AUI5RZywAaJeQeXhgAgBGJiifRwjQYziUvHr7SfeMAN0KH4AMPf4yOcAhFyCe730sAHBonAcAkJAjWemBf2H3Rd45U+++SMVlM7qMR/nmzvYNhUkaMwX/bXHIaYZ1afz9v/IH7FPFp0CzEhkAAAAASUVORK5CYII="},{"path":"C:\\Users\\simon\\Desktop\\Modding\\Forge 20 1 Concealed\\Create\\src\\main\\resources\\assets\\minecraft\\textures\\block\\stripped_spruce_log.png","name":"stripped_spruce_log.png","folder":"block","namespace":"minecraft","id":"5_particle","group":"","width":16,"height":16,"uv_width":16,"uv_height":16,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"6bf455b7-b3cd-c92c-0e42-95f8cdd9fae7","relative_path":"../../../../minecraft/textures/block/stripped_spruce_log.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAHxJREFUOE/dUzEOwCAIxMUfOPH/nymLJu7GhAZcaOIgDh3KAgvHHQeBmRkuo5QCQQCkiDHCGMOViWgB1FrdzTKstXbOABFVqB3mYpBSUgAr968MdlrF4uMd7LYtlh27YCfZJheDOSf03l+0v2Pg+QnXJe4eTS8x58xS3MYDngGKTOcZJJwAAAAASUVORK5CYII="},{"path":"C:\\Users\\simon\\Desktop\\Modding\\Forge 20 1 Concealed\\Create\\src\\main\\resources\\assets\\create\\textures\\block\\cogwheel_axis.png","name":"cogwheel_axis.png","folder":"block","namespace":"create","id":"0","group":"","width":16,"height":16,"uv_width":16,"uv_height":16,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"86dbdeb9-84fe-309c-ce15-c3939ab286a3","relative_path":"../../../textures/block/cogwheel_axis.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAMJJREFUOE9jZMABomKj/ssrKjJ8//6V4dWLVwzLFi9jxKYUqyBIYVJa0n8+fj4GTk5uhpcvnjPMmzWPdAPYOdgZJCWlGR7cv0e+AQICQgwP798n3QuZeZn/QZo5OTkZnj9/yjB90nTSvBAQHPhfSFiQAeSNj+8/kucCUGCCXPHhwzvSXYAcC2QZAEoHYhJiDEJCIuSFASwhgQKRrGikSiCCEhEIkBWNoEAUl5AEG0BWUgYlJHZ2dnAgkhUGFGcmYrMzAJgOdhGedY2NAAAAAElFTkSuQmCC"},{"path":"C:\\Users\\simon\\Desktop\\Modding\\Forge 20 1 Concealed\\Create\\src\\main\\resources\\assets\\create\\textures\\block\\axis_top.png","name":"axis_top.png","folder":"block","namespace":"create","id":"3","group":"","width":16,"height":16,"uv_width":16,"uv_height":16,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"6648a61d-8f93-ae33-3b89-e60596155fb2","relative_path":"../../../textures/block/axis_top.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAGRJREFUOE9jZKAQMFKon2HUAAbcYZCUlvRfXEKS4fv3rwyfPn5imDdrHtbwwhmIlXXV/8UkxBg+f/zM8P37d4b2plbSDCgoLfgvJCQC1gxyxYTuCaQZQLEXiE1gowkJT0IiNhABDy8oEaP4AzUAAAAASUVORK5CYII="},{"path":"C:\\Users\\simon\\Desktop\\Modding\\Forge 20 1 Concealed\\Create\\src\\main\\resources\\assets\\create\\textures\\block\\cogwheel.png","name":"cogwheel.png","folder":"block","namespace":"create","id":"1_2","group":"","width":32,"height":32,"uv_width":16,"uv_height":16,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"3bc98a82-3b4c-930e-c50f-b345e14045d5","relative_path":"../../../textures/block/cogwheel.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAitJREFUWEftVatOA0EUvUsf22yaLkE0EAxfQBAofoEEQYLB1SERKCQChUDyBRgSBN+BICgcJAiSCqDNpun2wZIzm7O9ne2TUrejdmbu49xzz511Tg+3I69UFK5WuyPc4xsLe32eGIuYc3tNind9/+ycH+9Gb/VvqVY8MZuPRjoIgm74MTAm18kICveNUMR3Y6C6EJxj4Y6FXN4+JjkR3wEDNKRzGLbM51Z1NanQtqGtDk6wNiMaIAGAAcQ3aFAZjIKvhvEteIUhAAxAEAToul6SSwMhozjTwFExAFzU9qLXemAYNgyQxnEAeI/EOqm9Jwja2/RjTwAv7/UBA0RsV0YN4B533VZ3iCHuN9f9lA60XsgCGaAIkxbYAMgrDHRf6800CNqCGS1azQKZgEhTIgQanUSr2xaTHZSMYZyocvrYI8xzjCHajmLMGNb2Yw2MW+yrFhMTw4ea4Biiwknx7LupAEArq9EgbGDco8J/B2DTaj8wpB9Alw5g1LOsn+m5W3B2tBP1+j8Ja/ncigRhvC+7K2LfXd09GYrhVyzkpeQW5bMRDD040zS15peNSTNoiXNyMBBh2B/t6uYG5zcPcY8XBdAOO9Lp9sRZhIFKOR6/vzCQAJhHscuwnXlk0KpSXqTdE0Eb+IBRA1o7divZQmoKQoYfWJgZAF4vJMGCEPFHwzeCYArmBQBfgJgZwCgGWMW8ADAFAI41M4Bl9D8DkDGQMZAxkDGQMQAGfgEyaZdKXv7ASQAAAABJRU5ErkJggg=="},{"path":"C:\\Users\\simon\\Desktop\\Modding\\Forge 20 1 Concealed\\Create\\src\\main\\resources\\assets\\minecraft\\textures\\block\\stripped_spruce_log_top.png","name":"stripped_spruce_log_top.png","folder":"block","namespace":"minecraft","id":"6_particle","group":"","width":16,"height":16,"uv_width":16,"uv_height":16,"particle":true,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"daf1ffaa-7d5c-929d-d389-8efa37314d69","relative_path":"../../../../minecraft/textures/block/stripped_spruce_log_top.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAHxJREFUOE/dUzEOwCAIxMUfOPH/nymLJu7GhAZcaOIgDh3KAgvHHQeBmRkuo5QCQQCkiDHCGMOViWgB1FrdzTKstXbOABFVqB3mYpBSUgAr968MdlrF4uMd7LYtlh27YCfZJheDOSf03l+0v2Pg+QnXJe4eTS8x58xS3MYDngGKTOcZJJwAAAAASUVORK5CYII="},{"path":"D:\\simon\\Minecraft\\Minecraft Assets\\minecraft\\textures\\block\\oak_planks.png","name":"oak_planks.png","folder":"block","namespace":"minecraft","id":"15","group":"","width":16,"height":16,"uv_width":16,"uv_height":16,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"a49e3215-10aa-29ce-7f8c-e06a392a2519","relative_path":"D:/simon/Minecraft/Minecraft Assets/minecraft/textures/block/oak_planks.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAVlJREFUOE91U8FKAzEUTJCC21ZZVkR7KcVe+xN+gODFs+ClP+An9O5FvImf4LVn/8MiQtmKsuTQdgWRLfPqlNm05pLk5WXyZt7Ej++vq/Jn6ZJG0zWTPRePZfn7b3zy9u48AHAJIBj59MsladulrX0D5eA5Y3ko7Mg/311VcSL2uBAW37WCAIrBfKvg4fa8mhXr10+z9YvYfxQLW59kLZuxx1rjWBsFcH/NP12/c1x7MY5BD1JBdZ00q1Ng2SgVCWWYb/TQ0lUX/zS6MBEpGl+goGe97paQqo0fXg4MgFyhg2rA2zynVszZaIAD5Xh0eLDlCQ0gF600ABpJE+I2UhfO5p0wd/7l8aaK1VUg9p4x8kcHrALVYJcPqA+1oScIaBWg30DkX0BF1oVQ1LxBX+j/MCtrj+lx5Qpw4/z36bTVBkBe6gUaiT7Y9TcAahqo35UzebLn+hd4tgJnUgM/K1gwfwAAAABJRU5ErkJggg=="},{"path":"D:\\simon\\Minecraft\\Minecraft Assets\\minecraft\\textures\\block\\stripped_oak_log.png","name":"stripped_oak_log.png","folder":"block","namespace":"minecraft","id":"16","group":"","width":16,"height":16,"uv_width":16,"uv_height":16,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"aaabed7c-088f-028f-fb20-13722f43ff0c","relative_path":"D:/simon/Minecraft/Minecraft Assets/minecraft/textures/block/stripped_oak_log.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAh5JREFUOE9lk8tu00AUhn/bM77F18S0qtIueBQkKsQDddcNj4DYwY5Ho5Wg1LnZjp1JJh50juPQqv8mnlHmO/+5Wd/uPposlriYpSB5fojlZo1pmvGZpHYt34/fnToi8BzQrzUCJlGAiee+AvQ44rBTEJ4Hx3JgC4GuqfghqapaWD/uPxnftUGAplK4vilQbVpkacyRR1d12yJNEgY8PdeYxBHqejMA0PeYFTEDosSDDQdpFmPfvQVorfD4UDLAsXpYP798NkrpVwDKnyK6NuC4EsKWfI7DoQ6kxXqLxz9/TzWIXFwUCbZqz9aF8LCpKgZQ/lJ6bN2PE5iD5sekM0BK4P28YABFp2IRIPCH6GPx6NG+B5q2gyt8bOtmcEAAckC5kwMSWQ6Dofok6sh6U0NK9wwoV+WpC9JBEPoQDhUvgjE9tq06Vz2IEvRa83wQgGrxu1zg0OnBwfwqOZMviwx6f4DS/RlAtukRuSAwff96eEKnd7C+3n0w0yhANk3YWuT5cKX1aippwNxwAtNrtI2CFOBZYMD3+1tzfTnDMFsAjuYNgK7zPMdqteJpbXaG/7qu1wNglsfY1gr5LIYnbJi+55EeR5m64wsHO32EMZKr3x72CKV7SiHxAQNkecq9J0nf4z0gURHLRcnRyTqJABNPDIBQCrwrMu4C5TeKXIybSB0YATTGpOfl8v823syv+PLlAo3nl6tMd3SmaSTAP4l8QGr43pFPAAAAAElFTkSuQmCC"},{"path":"C:\\Users\\simon\\Desktop\\Modding\\Forge 20 1 Concealed\\Create\\src\\main\\resources\\assets\\create\\textures\\item\\andesite_alloy.png","name":"andesite_alloy.png","folder":"item","namespace":"create","id":"17","group":"","width":16,"height":16,"uv_width":16,"uv_height":16,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"34fee77d-1e9a-5ee0-8854-a6ed44006edf","relative_path":"../../../textures/item/andesite_alloy.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAASlJREFUOE9jZKAQMFKon4GgAXGZyf9BliyaPherWqyCME0gjd5udgw3X7xgOLH3BMO2Nesx1KMIwDSCNClISzI8ePocxYcLl27AMARuAEhzdmI4ziABGQYytLFrOoohcAO8QgL/WzhbMKT4BzEcPnkMxSCQRhhYsnknw76dhxiunjoN1othAEgQZMjjJ/dRDAFpvHv9HoOIqBDD2bOXsBugrKnEIColBtYIMwSmEWYaQQNACkGGqEtIMGzddYjhzet3YL0gjTCA1QXaZqb/jY31GFT01BheP3vFYGOkBzYABJANAbEfPnqC6QWQQmRDQC4ARRsMvH37geHL1y9gLiwAUQIRphBmCIh/88Y9uCZ0jTD1WFMiyBCYAmTbsCUSgnkBZ8qCSlBsAAAIcooRVNOrsgAAAABJRU5ErkJggg=="},{"path":"D:\\simon\\Minecraft\\Minecraft Assets\\minecraft\\textures\\item\\iron_nugget.png","name":"iron_nugget.png","folder":"item","namespace":"minecraft","id":"18","group":"","width":16,"height":16,"uv_width":16,"uv_height":16,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"172a1529-1546-1a60-5de9-be6c847c3e9a","relative_path":"D:/simon/Minecraft/Minecraft Assets/minecraft/textures/item/iron_nugget.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAJRJREFUOE9jZKAQMFKon2E4GxARn/EfFD4rFs7A602skiDNSZlFDPLivAz1DY3wcMZmGIYBIM2NDfUMksLcYI3P335lOHnxOpg9vaeJ4fiRAyh6sBowa3IXWCMIgDRfvHsezD62fjNxBqRmFzP8/QcOAob6kjS4F9BtB0lgDQNLGweIbgYGDBvRE95wTkjEZjKKwwAAUdQ2EVuBBVwAAAAASUVORK5CYII="}]} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/factory_board/block.json b/src/main/resources/assets/create/models/block/factory_board/block.json new file mode 100644 index 0000000000..cd848767f9 --- /dev/null +++ b/src/main/resources/assets/create/models/block/factory_board/block.json @@ -0,0 +1,60 @@ +{ + "credit": "Made with Blockbench", + "parent": "create:block/large_wheels", + "textures": { + "2": "create:block/flap_display_front", + "3": "create:block/dark_metal_block", + "4": "create:block/flap_display_side", + "5": "create:block/flap_display_top", + "6": "create:block/flap_display_inside", + "particle": "create:block/flap_display_front" + }, + "elements": [ + { + "from": [0, 0, 3], + "to": [16, 16, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 6]}, + "faces": { + "north": {"uv": [0, 0, 16, 16], "texture": "#2"}, + "east": {"uv": [13, 0, 16, 16], "texture": "#4"}, + "south": {"uv": [0, 0, 16, 16], "texture": "#6"}, + "west": {"uv": [0, 0, 3, 16], "texture": "#4"}, + "up": {"uv": [0, 0, 3, 16], "rotation": 90, "texture": "#5"}, + "down": {"uv": [7, 0, 10, 16], "rotation": 90, "texture": "#5"} + } + }, + { + "from": [0, 0, 10], + "to": [16, 16, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 6]}, + "faces": { + "north": {"uv": [0, 0, 16, 16], "texture": "#6"}, + "east": {"uv": [3, 0, 6, 16], "texture": "#4"}, + "south": {"uv": [0, 0, 16, 16], "texture": "#3"}, + "west": {"uv": [10, 0, 13, 16], "texture": "#4"}, + "up": {"uv": [7, 0, 10, 16], "rotation": 90, "texture": "#5"}, + "down": {"uv": [0, 0, 3, 16], "rotation": 90, "texture": "#5"} + } + }, + { + "from": [0, 0, 6], + "to": [16, 16, 10], + "faces": { + "east": {"uv": [6, 0, 10, 16], "texture": "#4"}, + "west": {"uv": [6, 0, 10, 16], "texture": "#4"}, + "up": {"uv": [3, 0, 7, 16], "rotation": 90, "texture": "#5"}, + "down": {"uv": [3, 0, 7, 16], "rotation": 90, "texture": "#5"} + } + }, + { + "from": [15.95, 0.05, 6], + "to": [0.05, 15.95, 10], + "faces": { + "east": {"uv": [6, 0, 10, 16], "texture": "#4"}, + "west": {"uv": [6, 0, 10, 16], "texture": "#4"}, + "up": {"uv": [3, 0, 7, 16], "rotation": 90, "texture": "#5"}, + "down": {"uv": [3, 0, 7, 16], "rotation": 90, "texture": "#5"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/factory_panel/block.json b/src/main/resources/assets/create/models/block/factory_panel/block.json new file mode 100644 index 0000000000..8618c13555 --- /dev/null +++ b/src/main/resources/assets/create/models/block/factory_panel/block.json @@ -0,0 +1,87 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/factory_panel", + "particle": "create:block/factory_panel" + }, + "elements": [ + { + "from": [11, -0.95, 2], + "to": [14, 2.05, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [13, 13, 16, 16], "rotation": 270, "texture": "#0"}, + "east": {"uv": [0, 13, 12, 16], "texture": "#0"}, + "south": {"uv": [13, 13, 16, 16], "rotation": 90, "texture": "#0"}, + "west": {"uv": [0, 13, 12, 16], "rotation": 180, "texture": "#0"}, + "up": {"uv": [13, 0, 16, 12], "rotation": 180, "texture": "#0"}, + "down": {"uv": [13, 0, 16, 12], "texture": "#0"} + } + }, + { + "from": [2, -0.95, 2], + "to": [5, 2.05, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [13, 13, 16, 16], "rotation": 270, "texture": "#0"}, + "east": {"uv": [0, 13, 12, 16], "texture": "#0"}, + "south": {"uv": [13, 13, 16, 16], "rotation": 90, "texture": "#0"}, + "west": {"uv": [0, 13, 12, 16], "rotation": 180, "texture": "#0"}, + "up": {"uv": [13, 0, 16, 12], "rotation": 180, "texture": "#0"}, + "down": {"uv": [13, 0, 16, 12], "texture": "#0"} + } + }, + { + "from": [2.5, 1, 2.5], + "to": [13.5, 3, 13.5], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 11, 12, 12], "rotation": 180, "texture": "#0"}, + "east": {"uv": [12, 0, 10, 12], "rotation": 270, "texture": "#0"}, + "south": {"uv": [10, 0, 12, 12], "rotation": 90, "texture": "#0"}, + "west": {"uv": [11, 0, 12, 12], "rotation": 90, "texture": "#0"}, + "up": {"uv": [0, 0, 12, 12], "rotation": 180, "texture": "#0"}, + "down": {"uv": [0, 0, 12, 12], "texture": "#0"} + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 2.25], + "scale": [0.375, 0.375, 0.375] + }, + "thirdperson_lefthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 2.25], + "scale": [0.375, 0.375, 0.375] + }, + "firstperson_righthand": { + "rotation": [0, 135, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 135, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "ground": { + "translation": [0, 3, 0], + "scale": [0.25, 0.25, 0.25] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0, 3.5, 0], + "scale": [0.75, 0.75, 0.75] + }, + "head": { + "translation": [0, 13.5, 0] + }, + "fixed": { + "rotation": [-90, 0, 0], + "translation": [0, 0, -4], + "scale": [0.5, 0.5, 0.5] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/factory_panel/input.json b/src/main/resources/assets/create/models/block/factory_panel/input.json new file mode 100644 index 0000000000..e5cb59d0cc --- /dev/null +++ b/src/main/resources/assets/create/models/block/factory_panel/input.json @@ -0,0 +1,50 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "2": "create:block/andesite_casing_piston", + "3": "create:block/girder", + "particle": "create:block/andesite_casing_piston" + }, + "elements": [ + { + "name": "Top", + "from": [6, 6, 12.95], + "to": [10, 10, 14.95], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 16.2]}, + "faces": { + "north": {"uv": [6, 8, 10, 12], "rotation": 180, "texture": "#2"}, + "east": {"uv": [10, 8, 8, 12], "rotation": 180, "texture": "#2"}, + "west": {"uv": [6, 12, 8, 8], "texture": "#2"}, + "up": {"uv": [6, 12, 10, 10], "texture": "#2"}, + "down": {"uv": [6, 10, 10, 8], "texture": "#2"} + } + }, + { + "name": "Top", + "from": [5, 5, 14.75], + "to": [11, 11, 15.75], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 16]}, + "faces": { + "north": {"uv": [1.5, 0.5, 4.5, 3.5], "rotation": 90, "texture": "#3"}, + "east": {"uv": [9, 12.5, 12, 13], "rotation": 90, "texture": "#3"}, + "south": {"uv": [9, 9, 12, 12], "rotation": 90, "texture": "#3"}, + "west": {"uv": [9, 12.5, 12, 13], "rotation": 90, "texture": "#3"}, + "up": {"uv": [8, 9, 8.5, 12], "rotation": 90, "texture": "#3"}, + "down": {"uv": [12.5, 9, 13, 12], "rotation": 90, "texture": "#3"} + } + } + ], + "display": { + "gui": { + "rotation": [30, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.625, 0.625, 0.625] + }, + "fixed": { + "rotation": [270, 0, 0], + "translation": [0, 0, -3], + "scale": [0.5, 0.5, 0.5] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/factory_panel/timer.json b/src/main/resources/assets/create/models/block/factory_panel/timer.json new file mode 100644 index 0000000000..00fd131501 --- /dev/null +++ b/src/main/resources/assets/create/models/block/factory_panel/timer.json @@ -0,0 +1,49 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "3": "create:block/girder", + "top": "create:block/diodes/pulse_timer/idle" + }, + "elements": [ + { + "name": "Top", + "from": [6, 6, 12.95], + "to": [10, 10, 14.95], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 16.2]}, + "faces": { + "north": {"uv": [6, 6, 10, 10], "rotation": 180, "texture": "#top"}, + "east": {"uv": [10, 6, 8, 10], "rotation": 180, "texture": "#top"}, + "west": {"uv": [6, 10, 8, 6], "texture": "#top"}, + "up": {"uv": [6, 10, 10, 8], "texture": "#top"}, + "down": {"uv": [6, 8, 10, 6], "texture": "#top"} + } + }, + { + "name": "Top", + "from": [5, 5, 14.75], + "to": [11, 11, 15.75], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 16]}, + "faces": { + "north": {"uv": [1.5, 0.5, 4.5, 3.5], "rotation": 90, "texture": "#3"}, + "east": {"uv": [9, 12.5, 12, 13], "rotation": 90, "texture": "#3"}, + "south": {"uv": [9, 9, 12, 12], "rotation": 90, "texture": "#3"}, + "west": {"uv": [9, 12.5, 12, 13], "rotation": 90, "texture": "#3"}, + "up": {"uv": [8, 9, 8.5, 12], "rotation": 90, "texture": "#3"}, + "down": {"uv": [12.5, 9, 13, 12], "rotation": 90, "texture": "#3"} + } + } + ], + "display": { + "gui": { + "rotation": [30, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.625, 0.625, 0.625] + }, + "fixed": { + "rotation": [270, 0, 0], + "translation": [0, 0, -3], + "scale": [0.5, 0.5, 0.5] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/block/factory_board.png b/src/main/resources/assets/create/textures/block/factory_board.png new file mode 100644 index 0000000000000000000000000000000000000000..eca4ceb62c22138f84eecc2eb000bec60a345d7b GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFP@cil)z4*}Q$iB}1Fa}? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/factory_panel.png b/src/main/resources/assets/create/textures/block/factory_panel.png new file mode 100644 index 0000000000000000000000000000000000000000..8951d4ca2150c5e2e5b47ecde3812f0b39d7d4ed GIT binary patch literal 344 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}Z0G|-ojGFGsuEi4<9$C5Ja&TI{Q&80M#fu{&BK-aRBg2C3Ts!*W!C6xi zi;wSLynb=t)5F8YFUa1`38-6tPR>&xC0r8Z7yKUsFl?&5!vU1$EbxddW?I#w%^DS-FV=?{Odz=)yi+Tw45{&nXpAiQ&n(l>1W=g zWegz;xBY(QQTD{rdd=^b5hl~KeZ*c1vRFLZ8?%C?u_b@8$6LFDmn9Bp*2=W@F}mDm zV_e!~TYqB0HVJ9YmWN5U*BT7BhRGc}Ci$ZN;Ilt-%H|o$zOA|ZZ1R1#Zs{G>T&8pO Set!;h6oaR$pUXO@geCwC=#8xa literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/item/factory_panel_connector.png b/src/main/resources/assets/create/textures/item/factory_panel_connector.png new file mode 100644 index 0000000000000000000000000000000000000000..e5b727c08cebb1e0b5d112c28cbfa6501518439b GIT binary patch literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G|^0G|-opg`aM|Nlp3G|H>$Hq4j@6z1GtbO=bXl?3?(1Ev1|XV|=d$$pST zfk$L90|Vb-5N14{zaj-F7~$#S7@`qe+vmu4z<}ehQ^WuIO2@OeR<=J)3y*M(|ILx` zfWxIFgPY~#346!6A2RG es_mbZ+W%P0d}{s* Date: Sat, 19 Oct 2024 01:41:16 +0200 Subject: [PATCH 083/515] We've been expecting you - Experimental logistics promise system --- src/main/java/com/simibubi/create/Create.java | 2 + .../blueprint/BlueprintOverlayRenderer.java | 23 ++-- .../content/logistics/BigItemStack.java | 68 +++++++++++ .../displayCloth/DisplayClothEntity.java | 7 +- .../DisplayClothPricingScreen.java | 15 +-- .../displayCloth/DisplayClothRenderer.java | 11 +- .../displayCloth/ShoppingListItem.java | 23 ++-- .../factoryBoard/FactoryPanelBehaviour.java | 27 ++++- .../factoryBoard/FactoryPanelBlock.java | 3 +- .../factoryBoard/FactoryPanelBlockEntity.java | 27 ++++- .../FactoryPanelConnectionBehaviour.java | 80 +++++-------- .../FactoryPanelEffectPacket.java | 2 +- .../factoryBoard/FactoryPanelRenderer.java | 17 +-- .../logistics/packager/InventorySummary.java | 78 +++++++++---- .../packager/PackageDefragmenter.java | 39 +++---- .../logistics/packager/PackagerBlock.java | 11 ++ .../packager/PackagerBlockEntity.java | 54 ++++++++- .../packager/PackagerItemHandler.java | 4 +- .../packagerLink/GlobalLogisticsManager.java | 73 ++++++++++++ .../LogisticallyLinkedBehaviour.java | 27 ++++- .../packagerLink/LogisticsNetwork.java | 34 ++++++ .../LogisticsNetworkSavedData.java | 49 ++++++++ .../packagerLink/PackagerLinkBlock.java | 5 + .../packagerLink/RequestPromise.java | 25 ++++ .../packagerLink/RequestPromiseQueue.java | 110 ++++++++++++++++++ .../RedstoneRequesterBlock.java | 9 +- .../LogisticalStockResponsePacket.java | 12 +- .../logistics/stockTicker/PackageOrder.java | 33 ++---- .../stockTicker/StockCheckingBlockEntity.java | 10 +- .../StockTickerAutoRequestScreen.java | 22 ++-- .../stockTicker/StockTickerBlockEntity.java | 31 +++-- .../StockTickerInteractionHandler.java | 11 +- .../stockTicker/StockTickerRequestScreen.java | 70 ++++++----- .../foundation/events/CommonEvents.java | 2 + 34 files changed, 738 insertions(+), 276 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/logistics/BigItemStack.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/packagerLink/GlobalLogisticsManager.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsNetwork.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsNetworkSavedData.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/packagerLink/RequestPromise.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/packagerLink/RequestPromiseQueue.java diff --git a/src/main/java/com/simibubi/create/Create.java b/src/main/java/com/simibubi/create/Create.java index 4e00bad313..366b92714b 100644 --- a/src/main/java/com/simibubi/create/Create.java +++ b/src/main/java/com/simibubi/create/Create.java @@ -18,6 +18,7 @@ import com.simibubi.create.content.fluids.tank.BoilerHeaters; import com.simibubi.create.content.kinetics.TorquePropagator; import com.simibubi.create.content.kinetics.fan.processing.AllFanProcessingTypes; import com.simibubi.create.content.kinetics.mechanicalArm.AllArmInteractionPointTypes; +import com.simibubi.create.content.logistics.packagerLink.GlobalLogisticsManager; import com.simibubi.create.content.redstone.displayLink.AllDisplayBehaviours; import com.simibubi.create.content.redstone.link.RedstoneLinkNetworkHandler; import com.simibubi.create.content.schematics.ServerSchematicLoader; @@ -92,6 +93,7 @@ public class Create { public static final RedstoneLinkNetworkHandler REDSTONE_LINK_NETWORK_HANDLER = new RedstoneLinkNetworkHandler(); public static final TorquePropagator TORQUE_PROPAGATOR = new TorquePropagator(); public static final GlobalRailwayManager RAILWAYS = new GlobalRailwayManager(); + public static final GlobalLogisticsManager LOGISTICS = new GlobalLogisticsManager(); public static final ServerLagger LAGGER = new ServerLagger(); public Create() { diff --git a/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintOverlayRenderer.java b/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintOverlayRenderer.java index c12941c7e7..edd11b044b 100644 --- a/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintOverlayRenderer.java +++ b/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintOverlayRenderer.java @@ -11,6 +11,7 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.AllItems; import com.simibubi.create.content.equipment.blueprint.BlueprintEntity.BlueprintCraftingInventory; import com.simibubi.create.content.equipment.blueprint.BlueprintEntity.BlueprintSection; +import com.simibubi.create.content.logistics.BigItemStack; import com.simibubi.create.content.logistics.displayCloth.BlueprintOverlayShopContext; import com.simibubi.create.content.logistics.displayCloth.DisplayClothEntity; import com.simibubi.create.content.logistics.displayCloth.ShoppingListItem.ShoppingList; @@ -25,7 +26,6 @@ import com.simibubi.create.foundation.gui.AllGuiTextures; import net.createmod.catnip.gui.element.GuiGameElement; import net.createmod.catnip.utility.AnimationTickHolder; import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.IntAttached; import net.createmod.catnip.utility.Pair; import net.createmod.catnip.utility.lang.Components; import net.createmod.ponder.utility.LevelTickHolder; @@ -149,9 +149,8 @@ public class BlueprintOverlayRenderer { ingredients.add(Pair.of(dce.paymentItem.copyWithCount(dce.paymentAmount), !dce.paymentItem.isEmpty() && shopContext.stockLevel() > shopContext.purchases())); - for (IntAttached entry : dce.requestData.encodedRequest.stacks()) - results.add(entry.getSecond() - .copyWithCount(entry.getFirst())); + for (BigItemStack entry : dce.requestData.encodedRequest.stacks()) + results.add(entry.stack.copyWithCount(entry.count)); } public static void displayShoppingList(Couple bakedList) { @@ -163,28 +162,26 @@ public class BlueprintOverlayRenderer { shopContext = new BlueprintOverlayShopContext(true, 1, 0); - for (IntAttached entry : bakedList.getSecond() + for (BigItemStack entry : bakedList.getSecond() .getStacksByCount()) { - ingredients.add(Pair.of(entry.getSecond() - .copyWithCount(entry.getFirst()), canAfford(mc.player, entry))); + ingredients.add(Pair.of(entry.stack.copyWithCount(entry.count), canAfford(mc.player, entry))); } - for (IntAttached entry : bakedList.getFirst() + for (BigItemStack entry : bakedList.getFirst() .getStacksByCount()) - results.add(entry.getSecond() - .copyWithCount(entry.getFirst())); + results.add(entry.stack.copyWithCount(entry.count)); } - private static boolean canAfford(Player player, IntAttached entry) { + private static boolean canAfford(Player player, BigItemStack entry) { int itemsPresent = 0; for (int i = 0; i < player.getInventory().items.size(); i++) { ItemStack item = player.getInventory() .getItem(i); - if (item.isEmpty() || !ItemHandlerHelper.canItemStacksStack(item, entry.getSecond())) + if (item.isEmpty() || !ItemHandlerHelper.canItemStacksStack(item, entry.stack)) continue; itemsPresent += item.getCount(); } - return itemsPresent >= entry.getFirst(); + return itemsPresent >= entry.count; } private static void prepareCustomOverlay() { diff --git a/src/main/java/com/simibubi/create/content/logistics/BigItemStack.java b/src/main/java/com/simibubi/create/content/logistics/BigItemStack.java new file mode 100644 index 0000000000..8936b33170 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/BigItemStack.java @@ -0,0 +1,68 @@ +package com.simibubi.create.content.logistics; + +import java.util.Comparator; +import java.util.Objects; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.item.ItemStack; + +public class BigItemStack { + + public ItemStack stack; + public int count; + + public BigItemStack(ItemStack stack, int count) { + this.stack = stack; + this.count = count; + } + + public CompoundTag write() { + CompoundTag tag = new CompoundTag(); + tag.put("Item", stack.serializeNBT()); + tag.putInt("Amount", count); + return tag; + } + + public static BigItemStack read(CompoundTag tag) { + return new BigItemStack(ItemStack.of(tag.getCompound("Item")), tag.getInt("Amount")); + } + + public void send(FriendlyByteBuf buffer) { + buffer.writeItem(stack); + buffer.writeVarInt(count); + } + + public static BigItemStack receive(FriendlyByteBuf buffer) { + return new BigItemStack(buffer.readItem(), buffer.readVarInt()); + } + + public static Comparator comparator() { + return (i1, i2) -> Integer.compare(i2.count, i1.count); + } + + @Override + public boolean equals(final Object obj) { + if (obj == this) + return true; + if (obj instanceof BigItemStack other) + return Objects.equals(stack, other.stack) && count == other.count; + return false; + } + + @Override + public int hashCode() { + return (nullHash(stack) * 31) ^ Integer.hashCode(count); + } + + int nullHash(Object o) { + return o == null ? 0 : o.hashCode(); + } + + @Override + public String toString() { + return "(" + stack.getHoverName() + .getString() + " x" + count + ")"; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothEntity.java b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothEntity.java index a1fd393179..fc379c7f77 100644 --- a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothEntity.java @@ -9,6 +9,7 @@ import com.simibubi.create.AllEntityTypes; import com.simibubi.create.AllItems; import com.simibubi.create.AllPackets; import com.simibubi.create.AllSoundEvents; +import com.simibubi.create.content.logistics.BigItemStack; import com.simibubi.create.content.logistics.displayCloth.ShoppingListItem.ShoppingList; import com.simibubi.create.content.logistics.packager.InventorySummary; import com.simibubi.create.content.logistics.redstoneRequester.AutoRequestData; @@ -20,7 +21,6 @@ import com.simibubi.create.foundation.networking.ISyncPersistentData; import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.foundation.utility.IInteractionChecker; -import net.createmod.catnip.utility.IntAttached; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -264,10 +264,9 @@ public class DisplayClothEntity extends HangingEntity implements IEntityAddition .getFirst(); int smallestQuotient = Integer.MAX_VALUE; - for (IntAttached entry : requestData.encodedRequest.stacks()) + for (BigItemStack entry : requestData.encodedRequest.stacks()) smallestQuotient = Math.min(smallestQuotient, - (recentSummary.getCountOf(entry.getValue()) - modifierSummary.getCountOf(entry.getValue())) - / entry.getFirst()); + (recentSummary.getCountOf(entry.stack) - modifierSummary.getCountOf(entry.stack)) / entry.count); return smallestQuotient; } diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothPricingScreen.java b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothPricingScreen.java index c088b68675..bc37766039 100644 --- a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothPricingScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothPricingScreen.java @@ -5,20 +5,19 @@ import static com.simibubi.create.foundation.gui.AllGuiTextures.PLAYER_INVENTORY import java.util.List; import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.content.logistics.BigItemStack; import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.menu.AbstractSimiContainerScreen; import com.simibubi.create.foundation.gui.widget.ScrollInput; import com.simibubi.create.foundation.utility.CreateLang; import net.createmod.catnip.gui.element.GuiGameElement; -import net.createmod.catnip.utility.IntAttached; import net.createmod.catnip.utility.Iterate; import net.createmod.catnip.utility.lang.Components; import net.createmod.catnip.utility.theme.Color; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Inventory; -import net.minecraft.world.item.ItemStack; public class DisplayClothPricingScreen extends AbstractSimiContainerScreen { @@ -74,13 +73,12 @@ public class DisplayClothPricingScreen extends AbstractSimiContainerScreen entry = currentStacks().get(i); + BigItemStack entry = currentStacks().get(i); ms.pushPose(); ms.translate(x + i % cols * colWidth, y + 20 + i / cols * rowHeight, 200); - int customCount = currentStacks().get(i) - .getFirst(); + int customCount = currentStacks().get(i).count; drawItemCount(graphics, customCount, customCount); ms.translate(0, 0, -200); @@ -89,17 +87,16 @@ public class DisplayClothPricingScreen extends AbstractSimiContainerScreen> currentStacks() { + private List currentStacks() { return menu.contentHolder.requestData.encodedRequest.stacks(); } diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothRenderer.java b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothRenderer.java index 6a56edb41d..7b4d53f62e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothRenderer.java @@ -5,19 +5,18 @@ import java.util.List; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Axis; import com.simibubi.create.AllPartialModels; +import com.simibubi.create.content.logistics.BigItemStack; import com.simibubi.create.content.logistics.depot.DepotRenderer; import dev.engine_room.flywheel.lib.model.baked.PartialModel; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; -import net.createmod.catnip.utility.IntAttached; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.Sheets; import net.minecraft.client.renderer.entity.EntityRenderer; import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Blocks; public class DisplayClothRenderer extends EntityRenderer { @@ -42,10 +41,10 @@ public class DisplayClothRenderer extends EntityRenderer { return; } - List> stacks = entity.requestData.encodedRequest.stacks(); + List stacks = entity.requestData.encodedRequest.stacks(); for (int i = 0; i < stacks.size(); i++) { - IntAttached entry = stacks.get(i); + BigItemStack entry = stacks.get(i); ms.pushPose(); ms.translate(0, 3 / 16f, 0); @@ -56,8 +55,8 @@ public class DisplayClothRenderer extends EntityRenderer { } ms.mulPose(Axis.YP.rotationDegrees(180)); - DepotRenderer.renderItem(entity.level(), ms, buffer, light, OverlayTexture.NO_OVERLAY, entry.getSecond(), 0, - null, entity.position(), true); + DepotRenderer.renderItem(entity.level(), ms, buffer, light, OverlayTexture.NO_OVERLAY, entry.stack, 0, null, + entity.position(), true); ms.popPose(); } diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/ShoppingListItem.java b/src/main/java/com/simibubi/create/content/logistics/displayCloth/ShoppingListItem.java index b3edcaf8eb..f538faad45 100644 --- a/src/main/java/com/simibubi/create/content/logistics/displayCloth/ShoppingListItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/displayCloth/ShoppingListItem.java @@ -5,6 +5,7 @@ import java.util.UUID; import javax.annotation.Nullable; +import com.simibubi.create.content.logistics.BigItemStack; import com.simibubi.create.content.logistics.packager.InventorySummary; import com.simibubi.create.foundation.utility.CreateLang; @@ -60,7 +61,7 @@ public class ShoppingListItem extends Item { } purchases.add(IntAttached.with(amount, clothPos)); } - + public int getPurchases(BlockPos clothPos) { for (IntAttached entry : purchases) if (clothPos.equals(entry.getValue())) @@ -79,8 +80,8 @@ public class ShoppingListItem extends Item { if (entity == null) continue; input.add(entity.paymentItem, entity.paymentAmount * entry.getFirst()); - for (IntAttached stackEntry : entity.requestData.encodedRequest.stacks()) - output.add(stackEntry.getValue(), stackEntry.getFirst() * entry.getFirst()); + for (BigItemStack stackEntry : entity.requestData.encodedRequest.stacks()) + output.add(stackEntry.stack, stackEntry.count * entry.getFirst()); } return Couple.create(output, input); @@ -123,21 +124,20 @@ public class ShoppingListItem extends Item { if (lists != null) { for (InventorySummary items : lists) { - List> entries = items.getStacksByCount(); + List entries = items.getStacksByCount(); boolean cost = items == lists.getSecond(); if (cost) pTooltipComponents.add(Components.empty()); if (entries.size() == 1) { - IntAttached entry = entries.get(0); + BigItemStack entry = entries.get(0); CreateLang.temporaryText(cost ? "Total cost: " : "") .style(ChatFormatting.GOLD) .add(CreateLang.builder() - .add(entry.getSecond() - .getHoverName()) + .add(entry.stack.getHoverName()) .text(" x") - .text(String.valueOf(entry.getFirst())) + .text(String.valueOf(entry.count)) .style(cost ? ChatFormatting.YELLOW : ChatFormatting.GRAY)) .addTo(pTooltipComponents); @@ -146,12 +146,11 @@ public class ShoppingListItem extends Item { CreateLang.temporaryText("Total cost: ") .style(ChatFormatting.GOLD) .addTo(pTooltipComponents); - for (IntAttached entry : entries) { + for (BigItemStack entry : entries) { CreateLang.builder() - .add(entry.getSecond() - .getHoverName()) + .add(entry.stack.getHoverName()) .text(" x") - .text(String.valueOf(entry.getFirst())) + .text(String.valueOf(entry.count)) .style(cost ? ChatFormatting.YELLOW : ChatFormatting.GRAY) .addTo(pTooltipComponents); } diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java index 329aa3f2a8..fc82856cf3 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java @@ -1,11 +1,14 @@ package com.simibubi.create.content.logistics.factoryBoard; import java.util.List; +import java.util.UUID; import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.Create; import com.simibubi.create.content.logistics.filter.FilterItem; import com.simibubi.create.content.logistics.filter.FilterItemStack; import com.simibubi.create.content.logistics.packager.InventorySummary; +import com.simibubi.create.content.logistics.packagerLink.RequestPromiseQueue; import com.simibubi.create.content.logistics.stockTicker.StockCheckingBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform; import com.simibubi.create.foundation.blockEntity.behaviour.ValueSettingsBoard; @@ -33,6 +36,7 @@ import net.minecraft.world.phys.Vec3; public class FactoryPanelBehaviour extends FilteringBehaviour { int lastReportedLevelInStorage; + int lastReportedPromises; public FactoryPanelBehaviour(FactoryPanelBlockEntity be) { super(be, new FactoryPanelSlotPositioning(be)); @@ -70,6 +74,7 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { return Components.empty(); int inStorage = getLevelInStorage(); + int promised = getPromised(); String stacks = upTo ? "" : "\u25A4"; if (count == 0) { @@ -80,6 +85,7 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { return CreateLang.text(" " + inStorage + stacks) .color(inStorage >= count ? 0xD7FFA8 : 0xFFBFA8) + .add(CreateLang.text(promised == 0 ? "" : "+" + promised)) .add(CreateLang.text("/") .style(ChatFormatting.WHITE)) .add(CreateLang.text(count + stacks + " ") @@ -97,19 +103,35 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { lastReportedLevelInStorage = levelInStorage; blockEntity.sendData(); } + int promised = getPromised(); + if (lastReportedPromises != promised) { + lastReportedPromises = promised; + blockEntity.sendData(); + } } - private int getLevelInStorage() { + public int getLevelInStorage() { if (getWorld().isClientSide()) return lastReportedLevelInStorage; InventorySummary summary = ((StockCheckingBlockEntity) blockEntity).getRecentSummary(); return summary.getCountOf(getFilter()) / (upTo ? 1 : getFilter().getMaxStackSize()); } + public int getPromised() { + if (getWorld().isClientSide()) + return lastReportedPromises; + UUID freqId = ((StockCheckingBlockEntity) blockEntity).behaviour.freqId; + RequestPromiseQueue promises = Create.LOGISTICS.getQueuedPromises(freqId); + if (promises == null) + return 0; + return promises.getTotalPromised(getFilter()); + } + @Override public void write(CompoundTag nbt, boolean clientPacket) { super.write(nbt, clientPacket); nbt.putInt("LastLevel", lastReportedLevelInStorage); + nbt.putInt("LastPromised", lastReportedPromises); } @Override @@ -118,8 +140,9 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { count = nbt.getInt("FilterAmount"); upTo = nbt.getBoolean("UpTo"); lastReportedLevelInStorage = nbt.getInt("LastLevel"); + lastReportedPromises = nbt.getInt("LastPromised"); } - + @Override public float getRenderDistance() { return 64; diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java index b02a9629c7..e3a55a0331 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java @@ -121,8 +121,7 @@ public class FactoryPanelBlock extends FaceAttachedHorizontalDirectionalBlock if (pState.getValue(POWERED)) updateNeighbours(pState, pLevel, pPos); - if (pState.hasBlockEntity() && (blockChanged || !pNewState.hasBlockEntity())) - pLevel.removeBlockEntity(pPos); + IBE.onRemove(pState, pLevel, pPos, pNewState); } public static void updateNeighbours(BlockState pState, Level pLevel, BlockPos pPos) { diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java index 4c6048eaf2..f248be23ea 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java @@ -26,22 +26,24 @@ import net.minecraft.world.level.block.state.properties.AttachFace; public class FactoryPanelBlockEntity extends StockCheckingBlockEntity { - public FactoryPanelBehaviour behaviour; + public FactoryPanelBehaviour panelBehaviour; public EnumMap> inboundConnections = new EnumMap<>(Pointing.class); public EnumMap connections; public boolean satisfied; + public boolean promisedSatisfied; public FactoryPanelBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); satisfied = false; + promisedSatisfied = false; } @Override public void addBehaviours(List behaviours) { super.addBehaviours(behaviours); - behaviours.add(behaviour = new FactoryPanelBehaviour(this)); + behaviours.add(panelBehaviour = new FactoryPanelBehaviour(this)); connections = new EnumMap<>(Pointing.class); for (Pointing side : Pointing.values()) { FactoryPanelConnectionBehaviour e = new FactoryPanelConnectionBehaviour(this, side); @@ -80,14 +82,25 @@ public class FactoryPanelBlockEntity extends StockCheckingBlockEntity { if (level.isClientSide) return; - ItemStack filter = behaviour.getFilter(); - if (filter.isEmpty() || behaviour.getAmount() == 0) { + ItemStack filter = panelBehaviour.getFilter(); + if (filter.isEmpty() || panelBehaviour.getAmount() == 0) { setSatisfied(true); return; } - setSatisfied(getRecentSummary().getCountOf(filter) >= behaviour.getAmount() - * (behaviour.upTo ? 1 : filter.getMaxStackSize())); + int inStorage = panelBehaviour.getLevelInStorage(); + int promised = panelBehaviour.getPromised(); + int demand = panelBehaviour.getAmount() * (panelBehaviour.upTo ? 1 : filter.getMaxStackSize()); + + setSatisfied(inStorage >= demand); + setPromisedSatisfied(inStorage + promised >= demand); + } + + public void setPromisedSatisfied(boolean promisedSatisfied) { + if (this.promisedSatisfied == promisedSatisfied) + return; + this.promisedSatisfied = promisedSatisfied; + notifyUpdate(); } public void setSatisfied(boolean satisfied) { @@ -101,6 +114,7 @@ public class FactoryPanelBlockEntity extends StockCheckingBlockEntity { protected void write(CompoundTag tag, boolean clientPacket) { super.write(tag, clientPacket); tag.putBoolean("Satisfied", satisfied); + tag.putBoolean("PromisedSatisfied", promisedSatisfied); tag.put("Sides", NBTHelper.writeCompoundList(inboundConnections.entrySet(), e -> { CompoundTag nbt = new CompoundTag(); @@ -121,6 +135,7 @@ public class FactoryPanelBlockEntity extends StockCheckingBlockEntity { protected void read(CompoundTag tag, boolean clientPacket) { super.read(tag, clientPacket); satisfied = tag.getBoolean("Satisfied"); + promisedSatisfied = tag.getBoolean("PromisedSatisfied"); inboundConnections.clear(); NBTHelper.iterateCompoundList(tag.getList("Sides", Tag.TAG_COMPOUND), nbt -> { diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionBehaviour.java index 26c6cdb5ef..a143040cc8 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionBehaviour.java @@ -7,7 +7,11 @@ import java.util.Map.Entry; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllItems; import com.simibubi.create.AllPackets; +import com.simibubi.create.Create; +import com.simibubi.create.content.logistics.BigItemStack; import com.simibubi.create.content.logistics.packager.InventorySummary; +import com.simibubi.create.content.logistics.packagerLink.RequestPromise; +import com.simibubi.create.content.logistics.packagerLink.RequestPromiseQueue; import com.simibubi.create.content.logistics.stockTicker.PackageOrder; import com.simibubi.create.foundation.blockEntity.behaviour.BehaviourType; import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform; @@ -18,7 +22,6 @@ import com.simibubi.create.foundation.utility.CreateLang; import dev.engine_room.flywheel.lib.transform.TransformStack; import net.createmod.catnip.gui.ScreenOpener; -import net.createmod.catnip.utility.IntAttached; import net.createmod.catnip.utility.NBTHelper; import net.createmod.catnip.utility.Pointing; import net.createmod.catnip.utility.VecHelper; @@ -53,13 +56,15 @@ public class FactoryPanelConnectionBehaviour extends ScrollValueBehaviour { public String address; public Pointing side; + public static final int REQUEST_INTERVAL = 100; + private int timer; public FactoryPanelConnectionBehaviour(FactoryPanelBlockEntity be, Pointing side) { super(Components.empty(), be, new FactoryPanelConnectionSlotPositioning(be, side)); this.side = side; onlyActiveWhen(() -> inputModeActive || be.hasInboundConnections(side)); - withFormatter(value -> inputModeActive ? formatInputSlot(value) : formatTimerSlot(value)); + withFormatter(value -> formatInputSlot(value)); inputModeActive = false; setValue(1); address = ""; @@ -72,22 +77,22 @@ public class FactoryPanelConnectionBehaviour extends ScrollValueBehaviour { return; if (!(blockEntity instanceof FactoryPanelBlockEntity fpbe)) return; - if (!fpbe.hasInboundConnections(side) || fpbe.satisfied) + if (!fpbe.hasInboundConnections(side) || fpbe.satisfied || fpbe.promisedSatisfied) return; - if (value < 20) + if (value <= 0) return; if (timer > 0) { - timer = Math.min(timer, value); + timer = Math.min(timer, REQUEST_INTERVAL); timer--; return; } - timer = value; + timer = REQUEST_INTERVAL; InventorySummary summary = fpbe.getAccurateSummary(); boolean failed = false; - ArrayList> toRequest = new ArrayList<>(); + List toRequest = new ArrayList<>(); for (Entry entry : fpbe.inboundConnections.get(side) .entrySet()) { BlockPos targetPos = getPos().offset(entry.getKey()); @@ -98,7 +103,7 @@ public class FactoryPanelConnectionBehaviour extends ScrollValueBehaviour { Pointing fromSide = entry.getValue() .fromSide(); FactoryPanelConnectionBehaviour connectionBehaviour = fpbe2.connections.get(fromSide); - ItemStack item = fpbe2.behaviour.getFilter(); + ItemStack item = fpbe2.panelBehaviour.getFilter(); if (connectionBehaviour.value == 0 || item.isEmpty()) continue; if (summary.getCountOf(item) < connectionBehaviour.value) { @@ -107,7 +112,7 @@ public class FactoryPanelConnectionBehaviour extends ScrollValueBehaviour { continue; } - toRequest.add(IntAttached.with(connectionBehaviour.value, item)); + toRequest.add(new BigItemStack(item, connectionBehaviour.value)); sendEffect(targetPos, fromSide, getPos(), side, true); } @@ -116,6 +121,10 @@ public class FactoryPanelConnectionBehaviour extends ScrollValueBehaviour { PackageOrder order = new PackageOrder(toRequest); fpbe.broadcastPackageRequest(order, null, address); + + RequestPromiseQueue promises = Create.LOGISTICS.getQueuedPromises(fpbe.behaviour.freqId); + if (promises != null) + promises.add(new RequestPromise(new BigItemStack(fpbe.panelBehaviour.getFilter(), getValue()))); } private void sendEffect(BlockPos fromPos, Pointing fromSide, BlockPos toPos, Pointing toSide, boolean success) { @@ -141,16 +150,12 @@ public class FactoryPanelConnectionBehaviour extends ScrollValueBehaviour { @Override public ValueSettingsBoard createBoard(Player player, BlockHitResult hitResult) { - if (inputModeActive) { - return new ValueSettingsBoard(CreateLang.temporaryText("Amount per Shipment") - .component(), 64, 16, - List.of(CreateLang.temporaryText("Items") - .component()), - new ValueSettingsFormatter(this::formatInputSettings)); - } - return new ValueSettingsBoard(CreateLang.temporaryText("Request inputs every...") - .component(), 60, 10, CreateLang.translatedOptions("generic.unit", "seconds", "minutes"), - new ValueSettingsFormatter(this::formatTimerSettings)); + return new ValueSettingsBoard( + CreateLang.temporaryText(inputModeActive ? "Amount per Shipment" : "Expected Returns") + .component(), + 64, 16, List.of(CreateLang.temporaryText("Items") + .component()), + new ValueSettingsFormatter(this::formatInputSettings)); } @Override @@ -164,30 +169,15 @@ public class FactoryPanelConnectionBehaviour extends ScrollValueBehaviour { @Override public void setValueSettings(Player player, ValueSettings valueSetting, boolean ctrlHeld) { - int value = valueSetting.value(); - int multiplier = inputModeActive ? 1 : switch (valueSetting.row()) { - case 0 -> 20; - default -> 60 * 20; - }; + int value = Math.max(1, valueSetting.value()); if (!valueSetting.equals(getValueSettings())) playFeedbackSound(this); - setValue(Math.max(1, Math.max(1, value) * multiplier)); + setValue(value); } @Override public ValueSettings getValueSettings() { - int row = 0; - int value = this.value; - - if (value > 60 * 20) { - value = value / (60 * 20); - row = 1; - } else if (value > 60) { - value = value / 20; - row = 0; - } - - return new ValueSettings(row, value); + return new ValueSettings(0, this.value); } @Override @@ -199,25 +189,11 @@ public class FactoryPanelConnectionBehaviour extends ScrollValueBehaviour { blockEntity.sendData(); } - public MutableComponent formatTimerSettings(ValueSettings settings) { - int value = Math.max(1, settings.value()); - return Components.literal(switch (settings.row()) { - case 0 -> "0:" + (value < 10 ? "0" : "") + value; - default -> value + ":00"; - }); - } - public MutableComponent formatInputSettings(ValueSettings settings) { int value = Math.max(1, settings.value()); return Components.literal(value + ""); } - private String formatTimerSlot(int value) { - if (value < 20 * 60) - return (value / 20) + "s"; - return (value / 20 / 60) + "m"; - } - private String formatInputSlot(int value) { return String.valueOf(value); } @@ -253,7 +229,7 @@ public class FactoryPanelConnectionBehaviour extends ScrollValueBehaviour { return; label = inputModeActive ? CreateLang.temporaryText("Amount per Shipment") .component() - : CreateLang.temporaryText("Request rate") + : CreateLang.temporaryText("Expected Amount") .component(); } diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelEffectPacket.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelEffectPacket.java index aa39fd8209..86d4dc74c0 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelEffectPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelEffectPacket.java @@ -54,7 +54,7 @@ public class FactoryPanelEffectPacket extends SimplePacketBase { BlockState blockState = level.getBlockState(fromPos); if (!AllBlocks.FACTORY_PANEL.has(blockState)) return true; - FactoryPanelRenderer.renderConnection(blockState, fromPos, toPos, fromSide, toSide, success, true); + FactoryPanelRenderer.renderConnection(blockState, fromPos, toPos, fromSide, toSide, success ? 1 : 0, true); return true; } } diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelRenderer.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelRenderer.java index ab3442f5f2..e62e987968 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelRenderer.java @@ -37,7 +37,8 @@ public class FactoryPanelRenderer extends SmartBlockEntityRenderer { map.forEach((fromPos, connection) -> renderConnection(be.getBlockState(), fromPos.offset(be.getBlockPos()), - be.getBlockPos(), connection.fromSide(), toSide, be.satisfied, false)); + be.getBlockPos(), connection.fromSide(), toSide, be.satisfied ? 2 : be.promisedSatisfied ? 1 : 0, + false)); renderAttachment(be, toSide, false, ms, buffer, light, overlay); }); } @@ -63,16 +64,18 @@ public class FactoryPanelRenderer extends SmartBlockEntityRenderer= 8) ? 0x7783A8 : 0x687291; + boolean flicker = AnimationTickHolder.getTicks() % 16 >= 8; + int color = satisfyState == 1 ? (flicker ? 0xBC75FF : 0x915BC6) + : satisfyState == 2 ? 0x85E59B : (flicker ? 0x7783A8 : 0x687291); if (effect) - color = satisfied ? 0xEAF2EC : 0xE5654B; + color = satisfyState != 0 ? 0xEAF2EC : 0xE5654B; Pointing currentDirection = fromSide; BlockPos currentPos = fromPos; @@ -86,11 +89,11 @@ public class FactoryPanelRenderer extends SmartBlockEntityRenderer> key = - Pair.of(currentPos.hashCode() + 13 * nextPos.hashCode(), Pair.of(effect, effect ? satisfied : true)); + Pair> key = Pair.of(currentPos.hashCode() + 13 * nextPos.hashCode(), + Pair.of(effect, effect ? satisfyState != 0 : true)); CatnipClient.OUTLINER.showLine(key, fromOffset, toOffset) - .lineWidth(effect ? (satisfied ? 3f / 32f : 3.5f / 32f) : 2 / 32f) + .lineWidth(effect ? (satisfyState != 0 ? 3f / 32f : 3.5f / 32f) : 2 / 32f) .colored(color); if (currentPos.equals(targetPos)) diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/InventorySummary.java b/src/main/java/com/simibubi/create/content/logistics/packager/InventorySummary.java index 74adf837a2..8431b9a367 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/InventorySummary.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/InventorySummary.java @@ -11,10 +11,13 @@ import org.apache.commons.lang3.mutable.MutableInt; import com.google.common.collect.Lists; import com.simibubi.create.AllPackets; +import com.simibubi.create.content.logistics.BigItemStack; import com.simibubi.create.content.logistics.stockTicker.LogisticalStockResponsePacket; -import net.createmod.catnip.utility.IntAttached; +import net.createmod.catnip.utility.NBTHelper; import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; @@ -26,10 +29,10 @@ public class InventorySummary { public static final InventorySummary EMPTY = new InventorySummary(); - private Map>> items = new IdentityHashMap<>(); - private List> stacksByCount; + private Map> items = new IdentityHashMap<>(); + private List stacksByCount; private int totalCount; - + public int contributingLinks; public void add(InventorySummary summary) { @@ -41,13 +44,13 @@ public class InventorySummary { add(stack, stack.getCount()); } - public void add(IntAttached entry) { - add(entry.getSecond(), entry.getFirst()); + public void add(BigItemStack entry) { + add(entry.stack, entry.count); } public InventorySummary copy() { InventorySummary inventorySummary = new InventorySummary(); - items.forEach((i, list) -> list.forEach(entry -> inventorySummary.add(entry.getSecond(), entry.getFirst()))); + items.forEach((i, list) -> list.forEach(entry -> inventorySummary.add(entry.stack, entry.count))); return inventorySummary; } @@ -57,44 +60,53 @@ public class InventorySummary { totalCount += count; - List> stacks = items.computeIfAbsent(stack.getItem(), $ -> Lists.newArrayList()); - for (IntAttached existing : stacks) { - ItemStack existingStack = existing.getSecond(); + List stacks = items.computeIfAbsent(stack.getItem(), $ -> Lists.newArrayList()); + for (BigItemStack existing : stacks) { + ItemStack existingStack = existing.stack; if (ItemHandlerHelper.canItemStacksStack(existingStack, stack)) { - existing.setFirst(existing.getFirst() + count); + existing.count += count; return; } } - IntAttached newEntry = IntAttached.with(count, stack); + BigItemStack newEntry = new BigItemStack(stack, count); stacks.add(newEntry); } public int getCountOf(ItemStack stack) { - List> list = items.get(stack.getItem()); + List list = items.get(stack.getItem()); if (list == null) return 0; - for (IntAttached entry : list) - if (ItemHandlerHelper.canItemStacksStack(entry.getSecond(), stack)) - return entry.getFirst(); + for (BigItemStack entry : list) + if (ItemHandlerHelper.canItemStacksStack(entry.stack, stack)) + return entry.count; return 0; } public int getTotalOfMatching(Predicate filter) { MutableInt sum = new MutableInt(); items.forEach(($, list) -> { - for (IntAttached entry : list) - if (filter.test(entry.getSecond())) - sum.add(entry.getFirst()); + for (BigItemStack entry : list) + if (filter.test(entry.stack)) + sum.add(entry.count); }); return sum.getValue(); } - public List> getStacksByCount() { + public List getStacks() { + if (stacksByCount == null) { + List stacks = new ArrayList<>(); + items.forEach((i, list) -> list.forEach(stacks::add)); + return stacks; + } + return stacksByCount; + } + + public List getStacksByCount() { if (stacksByCount == null) { stacksByCount = new ArrayList<>(); items.forEach((i, list) -> list.forEach(stacksByCount::add)); - Collections.sort(stacksByCount, IntAttached.comparator()); + Collections.sort(stacksByCount, BigItemStack.comparator()); } return stacksByCount; } @@ -104,17 +116,17 @@ public class InventorySummary { } public void divideAndSendTo(ServerPlayer player, BlockPos pos) { - List> stacks = getStacksByCount(); + List stacks = getStacksByCount(); int remaining = stacks.size(); - List> currentList = null; + List currentList = null; PacketTarget target = PacketDistributor.PLAYER.with(() -> player); if (stacks.isEmpty()) AllPackets.getChannel() .send(target, new LogisticalStockResponsePacket(true, pos, Collections.emptyList())); - for (IntAttached entry : stacks) { + for (BigItemStack entry : stacks) { if (currentList == null) currentList = new ArrayList<>(Math.min(100, remaining)); @@ -136,4 +148,22 @@ public class InventorySummary { .send(target, new LogisticalStockResponsePacket(true, pos, currentList)); } + public CompoundTag write() { + List all = new ArrayList<>(); + items.forEach((key, list) -> all.addAll(list)); + CompoundTag tag = new CompoundTag(); + tag.put("List", NBTHelper.writeCompoundList(all, BigItemStack::write)); + return tag; + } + + public static InventorySummary read(CompoundTag tag) { + InventorySummary summary = new InventorySummary(); + NBTHelper.iterateCompoundList(tag.getList("List", Tag.TAG_COMPOUND), c -> summary.add(BigItemStack.read(c))); + return summary; + } + + public boolean isEmpty() { + return items.isEmpty(); + } + } diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackageDefragmenter.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackageDefragmenter.java index fae5de8fae..28baa2d2c2 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackageDefragmenter.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackageDefragmenter.java @@ -7,10 +7,10 @@ import java.util.List; import java.util.Map; import com.google.common.collect.Lists; +import com.simibubi.create.content.logistics.BigItemStack; import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.content.logistics.stockTicker.PackageOrder; -import net.createmod.catnip.utility.IntAttached; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.ItemStack; import net.minecraftforge.items.ItemHandlerHelper; @@ -40,7 +40,7 @@ public class PackageDefragmenter { int collectedOrderId = PackageItem.getOrderId(box); if (collectedOrderId == -1) return -1; - + List collectedOrder = collectedPackages.computeIfAbsent(collectedOrderId, $ -> Lists.newArrayList()); collectedOrder.add(box); @@ -54,7 +54,7 @@ public class PackageDefragmenter { List exportingPackages = new ArrayList<>(); String address = ""; PackageOrder order = null; - List> allItems = new ArrayList<>(); + List allItems = new ArrayList<>(); for (ItemStack box : collectedPackages.get(orderId)) { address = PackageItem.getAddress(box); @@ -67,48 +67,47 @@ public class PackageDefragmenter { ItemStackHandler contents = PackageItem.getContents(box); Slots: for (int slot = 0; slot < contents.getSlots(); slot++) { ItemStack stackInSlot = contents.getStackInSlot(slot); - for (IntAttached existing : allItems) { - if (!ItemHandlerHelper.canItemStacksStack(stackInSlot, existing.getValue())) + for (BigItemStack existing : allItems) { + if (!ItemHandlerHelper.canItemStacksStack(stackInSlot, existing.stack)) continue; - existing.setFirst(existing.getFirst() + stackInSlot.getCount()); + existing.count += stackInSlot.getCount(); continue Slots; } - allItems.add(IntAttached.with(stackInSlot.getCount(), stackInSlot)); + allItems.add(new BigItemStack(stackInSlot, stackInSlot.getCount())); } } - List> orderedStacks = order == null ? Collections.emptyList() : order.stacks(); + List orderedStacks = order == null ? Collections.emptyList() : order.stacks(); List outputSlots = new ArrayList<>(); Repack: while (true) { - allItems.removeIf(e -> e.getFirst() == 0); + allItems.removeIf(e -> e.count == 0); if (allItems.isEmpty()) break; - IntAttached targetedEntry = null; + BigItemStack targetedEntry = null; if (!orderedStacks.isEmpty()) targetedEntry = orderedStacks.remove(0); - ItemSearch: for (IntAttached entry : allItems) { - int targetAmount = entry.getFirst(); + ItemSearch: for (BigItemStack entry : allItems) { + int targetAmount = entry.count; if (targetAmount == 0) continue; if (targetedEntry != null) { - targetAmount = targetedEntry.getFirst(); - if (!ItemHandlerHelper.canItemStacksStack(entry.getSecond(), targetedEntry.getSecond())) + targetAmount = targetedEntry.count; + if (!ItemHandlerHelper.canItemStacksStack(entry.stack, targetedEntry.stack)) continue; } while (targetAmount > 0) { - int removedAmount = Math.min(Math.min(targetAmount, entry.getSecond() - .getMaxStackSize()), entry.getFirst()); + int removedAmount = Math.min(Math.min(targetAmount, entry.stack.getMaxStackSize()), entry.count); if (removedAmount == 0) continue ItemSearch; - ItemStack output = ItemHandlerHelper.copyStackWithSize(entry.getSecond(), removedAmount); + ItemStack output = ItemHandlerHelper.copyStackWithSize(entry.stack, removedAmount); targetAmount -= removedAmount; - targetedEntry.setFirst(targetAmount); - entry.setFirst(entry.getFirst() - removedAmount); + targetedEntry.count = targetAmount; + entry.count -= removedAmount; outputSlots.add(output); } @@ -132,7 +131,7 @@ public class PackageDefragmenter { for (ItemStack box : exportingPackages) PackageItem.addAddress(box, address); - + return exportingPackages; } diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java index fc531b877b..78f7196583 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java @@ -19,6 +19,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.SignalGetter; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; @@ -98,6 +99,7 @@ public class PackagerBlock extends WrenchableDirectionalBlock implements IBE logisticsNetworks; + + private LogisticsNetworkSavedData savedData; + + public GlobalLogisticsManager() { + logisticsNetworks = new HashMap<>(); + } + + public void levelLoaded(LevelAccessor level) { + MinecraftServer server = level.getServer(); + if (server == null || server.overworld() != level) + return; + logisticsNetworks = new HashMap<>(); + savedData = null; + loadLogisticsData(server); + } + + public void linkAdded(UUID networkId) { + logisticsNetworks.computeIfAbsent(networkId, $ -> new LogisticsNetwork(networkId)).totalLinks++; + markDirty(); + } + + public void linkRemoved(UUID networkId) { + LogisticsNetwork logisticsNetwork = logisticsNetworks.get(networkId); + if (logisticsNetwork == null) + return; + logisticsNetwork.totalLinks--; + if (logisticsNetwork.totalLinks <= 0) + logisticsNetworks.remove(networkId); + markDirty(); + } + + public RequestPromiseQueue getQueuedPromises(UUID networkId) { + return !logisticsNetworks.containsKey(networkId) ? null : logisticsNetworks.get(networkId).panelPromises; + } + + public boolean hasQueuedPromises(UUID networkId) { + return logisticsNetworks.containsKey(networkId) && !logisticsNetworks.get(networkId).panelPromises.isEmpty(); + } + + private void loadLogisticsData(MinecraftServer server) { + if (savedData != null) + return; + savedData = LogisticsNetworkSavedData.load(server); + logisticsNetworks = savedData.getLogisticsNetworks(); + } + + public void tick(Level level) { + if (level.dimension() != Level.OVERWORLD) + return; + logisticsNetworks.forEach((id, network) -> { + network.panelPromises.tick(); + }); + } + + public void markDirty() { + if (savedData != null) + savedData.setDirty(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java index 1fccddbfa6..c665b4a7bd 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java @@ -16,6 +16,7 @@ import org.apache.commons.lang3.mutable.MutableBoolean; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; +import com.simibubi.create.Create; import com.simibubi.create.content.logistics.packager.InventorySummary; import com.simibubi.create.content.logistics.stockTicker.PackageOrder; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; @@ -36,6 +37,8 @@ public class LogisticallyLinkedBehaviour extends BlockEntityBehaviour { public int redstonePower; public UUID freqId; + private boolean addedGlobally = false; + // private static final Cache>> LINKS = @@ -46,11 +49,11 @@ public class LogisticallyLinkedBehaviour extends BlockEntityBehaviour { private static final Cache SUMMARIES = CacheBuilder.newBuilder() .expireAfterWrite(1, TimeUnit.SECONDS) .build(); - + private static final Cache ACCURATE_SUMMARIES = CacheBuilder.newBuilder() .expireAfterWrite(100, TimeUnit.MILLISECONDS) .build(); - + public InventorySummary getSummaryOfNetwork(boolean accurate) { try { return (accurate ? ACCURATE_SUMMARIES : SUMMARIES).get(freqId, () -> { @@ -131,6 +134,24 @@ public class LogisticallyLinkedBehaviour extends BlockEntityBehaviour { keepAlive(this); } + @Override + public void initialize() { + super.initialize(); + if (getWorld().isClientSide) + return; + if (!addedGlobally) { + addedGlobally = true; + blockEntity.setChanged(); + Create.LOGISTICS.linkAdded(freqId); + } + } + + @Override + public void destroy() { + super.destroy(); + Create.LOGISTICS.linkRemoved(freqId); + } + public void redstonePowerChanged(int power) { if (power == redstonePower) return; @@ -173,6 +194,7 @@ public class LogisticallyLinkedBehaviour extends BlockEntityBehaviour { super.write(tag, clientPacket); tag.putUUID("Freq", freqId); tag.putInt("Power", redstonePower); + tag.putBoolean("Added", addedGlobally); } @Override @@ -181,6 +203,7 @@ public class LogisticallyLinkedBehaviour extends BlockEntityBehaviour { if (tag.hasUUID("Freq")) freqId = tag.getUUID("Freq"); redstonePower = tag.getInt("Power"); + addedGlobally = tag.getBoolean("Added"); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsNetwork.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsNetwork.java new file mode 100644 index 0000000000..f497a5a357 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsNetwork.java @@ -0,0 +1,34 @@ +package com.simibubi.create.content.logistics.packagerLink; + +import java.util.UUID; + +import net.minecraft.nbt.CompoundTag; + +public class LogisticsNetwork { + + public UUID id; + public RequestPromiseQueue panelPromises; + public int totalLinks; + + public LogisticsNetwork(UUID networkId) { + id = networkId; + panelPromises = new RequestPromiseQueue(); + totalLinks = 0; + } + + public CompoundTag write() { + CompoundTag tag = new CompoundTag(); + tag.putUUID("Id", id); + tag.put("Promises", panelPromises.write()); + tag.putInt("Links", totalLinks); + return tag; + } + + public static LogisticsNetwork read(CompoundTag tag) { + LogisticsNetwork network = new LogisticsNetwork(tag.getUUID("Id")); + network.panelPromises = RequestPromiseQueue.read(tag.getCompound("Promises")); + network.totalLinks = tag.getInt("Links"); + return network; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsNetworkSavedData.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsNetworkSavedData.java new file mode 100644 index 0000000000..e411bf3b2d --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsNetworkSavedData.java @@ -0,0 +1,49 @@ +package com.simibubi.create.content.logistics.packagerLink; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +import com.simibubi.create.Create; + +import net.createmod.catnip.utility.NBTHelper; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; +import net.minecraft.server.MinecraftServer; +import net.minecraft.world.level.saveddata.SavedData; + +public class LogisticsNetworkSavedData extends SavedData { + + private Map logisticsNetworks = new HashMap<>(); + + @Override + public CompoundTag save(CompoundTag nbt) { + GlobalLogisticsManager logistics = Create.LOGISTICS; + nbt.put("LogisticsNetworks", + NBTHelper.writeCompoundList(logistics.logisticsNetworks.values(), tg -> tg.write())); + return nbt; + } + + private static LogisticsNetworkSavedData load(CompoundTag nbt) { + LogisticsNetworkSavedData sd = new LogisticsNetworkSavedData(); + sd.logisticsNetworks = new HashMap<>(); + NBTHelper.iterateCompoundList(nbt.getList("LogisticsNetworks", Tag.TAG_COMPOUND), c -> { + LogisticsNetwork network = LogisticsNetwork.read(c); + sd.logisticsNetworks.put(network.id, network); + }); + return sd; + } + + public Map getLogisticsNetworks() { + return logisticsNetworks; + } + + private LogisticsNetworkSavedData() {} + + public static LogisticsNetworkSavedData load(MinecraftServer server) { + return server.overworld() + .getDataStorage() + .computeIfAbsent(LogisticsNetworkSavedData::load, LogisticsNetworkSavedData::new, "create_logistics"); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlock.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlock.java index a1c5fb1722..8b9d26a02e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlock.java @@ -84,5 +84,10 @@ public class PackagerLinkBlock extends WrenchableDirectionalBlock implements IBE public BlockEntityType getBlockEntityType() { return AllBlockEntityTypes.PACKAGER_LINK.get(); } + + @Override + public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pMovedByPiston) { + IBE.onRemove(pState, pLevel, pPos, pNewState); + } } diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/RequestPromise.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/RequestPromise.java new file mode 100644 index 0000000000..ee40d7b74a --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/RequestPromise.java @@ -0,0 +1,25 @@ +package com.simibubi.create.content.logistics.packagerLink; + +import java.util.Comparator; + +import com.simibubi.create.content.logistics.BigItemStack; + +public class RequestPromise { + + public int ticksExisted; + public BigItemStack promisedStack; + + public RequestPromise(BigItemStack promisedStack) { + this.promisedStack = promisedStack; + ticksExisted = 0; + } + + public void tick() { + ticksExisted++; + } + + public static Comparator ageComparator() { + return (i1, i2) -> Integer.compare(i2.ticksExisted, i1.ticksExisted); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/RequestPromiseQueue.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/RequestPromiseQueue.java new file mode 100644 index 0000000000..50dc6b5b27 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/RequestPromiseQueue.java @@ -0,0 +1,110 @@ +package com.simibubi.create.content.logistics.packagerLink; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.IdentityHashMap; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import com.simibubi.create.Create; +import com.simibubi.create.content.logistics.BigItemStack; + +import net.createmod.catnip.utility.NBTHelper; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.items.ItemHandlerHelper; + +public class RequestPromiseQueue { + + private Map> promisesByItem; + + public RequestPromiseQueue() { + promisesByItem = new IdentityHashMap<>(); + } + + public void add(RequestPromise promise) { + promisesByItem.computeIfAbsent(promise.promisedStack.stack.getItem(), $ -> new LinkedList<>()) + .add(promise); + Create.LOGISTICS.markDirty(); + } + + public int getTotalPromised(ItemStack stack) { + int promised = 0; + List list = promisesByItem.get(stack.getItem()); + if (list == null) + return promised; + for (RequestPromise promise : list) { + if (!ItemHandlerHelper.canItemStacksStack(promise.promisedStack.stack, stack)) + continue; + promised += promise.promisedStack.count; + } + return promised; + } + + public void itemEnteredSystem(ItemStack stack, int amount) { + List list = promisesByItem.get(stack.getItem()); + if (list == null) + return; + + for (Iterator iterator = list.iterator(); iterator.hasNext();) { + RequestPromise requestPromise = iterator.next(); + if (!ItemHandlerHelper.canItemStacksStack(requestPromise.promisedStack.stack, stack)) + continue; + + int toSubtract = Math.min(amount, requestPromise.promisedStack.count); + amount -= toSubtract; + requestPromise.promisedStack.count -= toSubtract; + + if (requestPromise.promisedStack.count <= 0) { + iterator.remove(); + Create.LOGISTICS.markDirty(); + } + if (amount <= 0) + break; + } + + if (list.isEmpty()) + promisesByItem.remove(stack.getItem()); + } + + public List flatten(boolean sorted) { + List all = new ArrayList<>(); + promisesByItem.forEach((key, list) -> all.addAll(list)); + if (sorted) + Collections.sort(all, RequestPromise.ageComparator()); + return all; + } + + public CompoundTag write() { + CompoundTag tag = new CompoundTag(); + tag.put("List", NBTHelper.writeCompoundList(flatten(false), rp -> { + CompoundTag c = rp.promisedStack.write(); + c.putInt("Age", rp.ticksExisted); + return c; + })); + return tag; + } + + public static RequestPromiseQueue read(CompoundTag tag) { + RequestPromiseQueue queue = new RequestPromiseQueue(); + NBTHelper.iterateCompoundList(tag.getList("List", Tag.TAG_COMPOUND), c -> { + RequestPromise promise = new RequestPromise(BigItemStack.read(c)); + promise.ticksExisted = c.getInt("Age"); + queue.add(promise); + }); + return queue; + } + + public void tick() { + promisesByItem.forEach((key, list) -> list.forEach(RequestPromise::tick)); // delete old entries? + } + + public boolean isEmpty() { + return promisesByItem.isEmpty(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlock.java b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlock.java index 8d578138f0..1b3574802e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlock.java @@ -5,12 +5,12 @@ import java.util.List; import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; +import com.simibubi.create.content.logistics.BigItemStack; import com.simibubi.create.content.logistics.stockTicker.PackageOrder; import com.simibubi.create.content.logistics.stockTicker.StockTickerBlockEntity; import com.simibubi.create.foundation.block.IBE; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.IntAttached; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -82,12 +82,11 @@ public class RedstoneRequesterBlock extends Block implements IBE entry : contents.stacks()) { - pTooltip.add(entry.getSecond() - .getHoverName() + for (BigItemStack entry : contents.stacks()) { + pTooltip.add(entry.stack.getHoverName() .copy() .append(" x") - .append(String.valueOf(entry.getFirst())) + .append(String.valueOf(entry.count)) .withStyle(ChatFormatting.GRAY)); } diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalStockResponsePacket.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalStockResponsePacket.java index 46bd152e3e..629ce6928b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalStockResponsePacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalStockResponsePacket.java @@ -3,6 +3,7 @@ package com.simibubi.create.content.logistics.stockTicker; import java.util.ArrayList; import java.util.List; +import com.simibubi.create.content.logistics.BigItemStack; import com.simibubi.create.foundation.networking.SimplePacketBase; import net.createmod.catnip.utility.IntAttached; @@ -17,10 +18,10 @@ import net.minecraftforge.network.NetworkEvent.Context; public class LogisticalStockResponsePacket extends SimplePacketBase { private BlockPos pos; - private List> items; + private List items; private boolean lastPacket; - public LogisticalStockResponsePacket(boolean lastPacket, BlockPos pos, List> items) { + public LogisticalStockResponsePacket(boolean lastPacket, BlockPos pos, List items) { this.lastPacket = lastPacket; this.pos = pos; this.items = items; @@ -32,7 +33,7 @@ public class LogisticalStockResponsePacket extends SimplePacketBase { int count = buffer.readVarInt(); items = new ArrayList<>(count); for (int i = 0; i < count; i++) - items.add(IntAttached.with(buffer.readVarInt(), buffer.readItem())); + items.add(BigItemStack.receive(buffer)); } @Override @@ -40,10 +41,7 @@ public class LogisticalStockResponsePacket extends SimplePacketBase { buffer.writeBoolean(lastPacket); buffer.writeBlockPos(pos); buffer.writeVarInt(items.size()); - for (IntAttached entry : items) { - buffer.writeVarInt(entry.getFirst()); - buffer.writeItem(entry.getSecond()); - } + items.forEach(stack -> stack.send(buffer)); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrder.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrder.java index 178a60df1b..cb47da241d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrder.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrder.java @@ -3,27 +3,18 @@ package com.simibubi.create.content.logistics.stockTicker; import java.util.ArrayList; import java.util.List; -import net.createmod.catnip.utility.IntAttached; +import com.simibubi.create.content.logistics.BigItemStack; + import net.createmod.catnip.utility.NBTHelper; import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.world.item.ItemStack; -public record PackageOrder(List> stacks) { +public record PackageOrder(List stacks) { public CompoundTag write() { CompoundTag tag = new CompoundTag(); - ListTag list = new ListTag(); - for (IntAttached entry : stacks) { - CompoundTag entryTag = new CompoundTag(); - entryTag.putInt("Quantity", entry.getFirst()); - entryTag.put("Item", entry.getSecond() - .serializeNBT()); - list.add(entryTag); - } - tag.put("Entries", list); + tag.put("Entries", NBTHelper.writeCompoundList(stacks, BigItemStack::write)); return tag; } @@ -36,25 +27,23 @@ public record PackageOrder(List> stacks) { } public static PackageOrder read(CompoundTag tag) { - List> stacks = new ArrayList<>(); - NBTHelper.iterateCompoundList(tag.getList("Entries", Tag.TAG_COMPOUND), entryTag -> stacks - .add(IntAttached.with(entryTag.getInt("Quantity"), ItemStack.of(entryTag.getCompound("Item"))))); + List stacks = new ArrayList<>(); + NBTHelper.iterateCompoundList(tag.getList("Entries", Tag.TAG_COMPOUND), + entryTag -> stacks.add(BigItemStack.read(entryTag))); return new PackageOrder(stacks); } public void write(FriendlyByteBuf buffer) { buffer.writeVarInt(stacks.size()); - for (IntAttached entry : stacks) { - buffer.writeVarInt(entry.getFirst()); - buffer.writeItem(entry.getSecond()); - } + for (BigItemStack entry : stacks) + entry.send(buffer); } public static PackageOrder read(FriendlyByteBuf buffer) { int size = buffer.readVarInt(); - List> stacks = new ArrayList<>(); + List stacks = new ArrayList<>(); for (int i = 0; i < size; i++) - stacks.add(IntAttached.with(buffer.readVarInt(), buffer.readItem())); + stacks.add(BigItemStack.receive(buffer)); return new PackageOrder(stacks); } diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockCheckingBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockCheckingBlockEntity.java index 92cefe65b8..34decbfc66 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockCheckingBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockCheckingBlockEntity.java @@ -5,12 +5,12 @@ import java.util.List; import org.apache.commons.lang3.mutable.MutableBoolean; +import com.simibubi.create.content.logistics.BigItemStack; import com.simibubi.create.content.logistics.packager.InventorySummary; import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedBehaviour; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; -import net.createmod.catnip.utility.IntAttached; import net.minecraft.core.BlockPos; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntityType; @@ -40,7 +40,7 @@ public abstract class StockCheckingBlockEntity extends SmartBlockEntity { } public void broadcastPackageRequest(PackageOrder order, IItemHandler ignoredHandler, String address) { - List> stacks = order.stacks(); + List stacks = order.stacks(); // Packages need to track their index and successors for successful defrag Iterable availableLinks = behaviour.getAllConnectedAvailableLinks(true); @@ -54,10 +54,10 @@ public abstract class StockCheckingBlockEntity extends SmartBlockEntity { int orderId = level.random.nextInt(); for (int i = 0; i < stacks.size(); i++) { - IntAttached entry = stacks.get(i); - int remainingCount = entry.getFirst(); + BigItemStack entry = stacks.get(i); + int remainingCount = entry.count; boolean finalEntry = i == stacks.size() - 1; - ItemStack requestedItem = entry.getSecond(); + ItemStack requestedItem = entry.stack; for (LogisticallyLinkedBehaviour link : availableLinks) { int usedIndex = usedLinks.indexOf(link); diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerAutoRequestScreen.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerAutoRequestScreen.java index 58fe274d3d..7d2d967266 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerAutoRequestScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerAutoRequestScreen.java @@ -5,11 +5,11 @@ import java.util.List; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllPackets; +import com.simibubi.create.content.logistics.BigItemStack; import com.simibubi.create.foundation.utility.CreateLang; import net.createmod.catnip.gui.AbstractSimiScreen; import net.createmod.catnip.gui.element.GuiGameElement; -import net.createmod.catnip.utility.IntAttached; import net.createmod.catnip.utility.Iterate; import net.createmod.catnip.utility.lang.Components; import net.createmod.catnip.utility.theme.Color; @@ -18,7 +18,6 @@ import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.components.EditBox; import net.minecraft.network.chat.MutableComponent; import net.minecraft.util.Mth; -import net.minecraft.world.item.ItemStack; public class StockTickerAutoRequestScreen extends AbstractSimiScreen { @@ -40,8 +39,8 @@ public class StockTickerAutoRequestScreen extends AbstractSimiScreen { private void resetAmounts() { modifiedAmounts = new ArrayList<>(); - for (IntAttached intAttached : currentStacks()) - modifiedAmounts.add(intAttached.getFirst()); + for (BigItemStack stack : currentStacks()) + modifiedAmounts.add(stack.count); } @Override @@ -81,8 +80,7 @@ public class StockTickerAutoRequestScreen extends AbstractSimiScreen { public void removed() { if (modifiedAmounts != null) for (int i = 0; i < currentStacks().size(); i++) - currentStacks().get(i) - .setFirst(modifiedAmounts.get(i)); + currentStacks().get(i).count = modifiedAmounts.get(i); AllPackets.getChannel() .sendToServer(new StockTickerConfigurationPacket(blockEntity.getBlockPos(), false, addressBox.getValue(), blockEntity.restockAmounts)); @@ -116,13 +114,12 @@ public class StockTickerAutoRequestScreen extends AbstractSimiScreen { PoseStack ms = graphics.pose(); for (int i = 0; i < currentStacks().size(); i++) { - IntAttached entry = currentStacks().get(i); + BigItemStack entry = currentStacks().get(i); ms.pushPose(); ms.translate(guiLeft + i % cols * colWidth, guiTop + 20 + i / cols * rowHeight, 200); - int customCount = modifiedAmounts == null ? currentStacks().get(i) - .getFirst() : modifiedAmounts.get(i); + int customCount = modifiedAmounts == null ? currentStacks().get(i).count : modifiedAmounts.get(i); drawItemCount(graphics, customCount, customCount); ms.translate(0, 0, -200); @@ -131,17 +128,16 @@ public class StockTickerAutoRequestScreen extends AbstractSimiScreen { ms.translate(18 / 2.0, 18 / 2.0, 0); ms.scale(scaleFromHover, scaleFromHover, scaleFromHover); ms.translate(-18 / 2.0, -18 / 2.0, 0); - GuiGameElement.of(entry.getSecond()) + GuiGameElement.of(entry.stack) .render(graphics); ms.popPose(); } if (hoveredSlot != -1) - graphics.renderTooltip(font, currentStacks().get(hoveredSlot) - .getValue(), mouseX, mouseY); + graphics.renderTooltip(font, currentStacks().get(hoveredSlot).stack, mouseX, mouseY); } - private List> currentStacks() { + private List currentStacks() { return blockEntity.restockAmounts.stacks(); } diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java index 4bfc645547..b763dfc1b1 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java @@ -9,6 +9,7 @@ import org.jetbrains.annotations.Nullable; import com.simibubi.create.AllPackets; import com.simibubi.create.content.contraptions.actors.seat.SeatEntity; import com.simibubi.create.content.equipment.goggles.IHaveHoveringInformation; +import com.simibubi.create.content.logistics.BigItemStack; import com.simibubi.create.content.logistics.packager.InventorySummary; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import com.simibubi.create.foundation.blockEntity.behaviour.inventory.InvManipulationBehaviour; @@ -17,7 +18,6 @@ import com.simibubi.create.foundation.item.SmartInventory; import com.simibubi.create.foundation.utility.CreateLang; import net.createmod.catnip.utility.BlockFace; -import net.createmod.catnip.utility.IntAttached; import net.createmod.catnip.utility.Iterate; import net.createmod.catnip.utility.lang.Components; import net.minecraft.ChatFormatting; @@ -25,7 +25,6 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; -import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; @@ -36,9 +35,9 @@ import net.minecraftforge.items.IItemHandler; public class StockTickerBlockEntity extends StockCheckingBlockEntity implements IHaveHoveringInformation { // Player-interface Feature - protected List> lastClientsideStockSnapshot; + protected List lastClientsideStockSnapshot; protected InventorySummary lastClientsideStockSnapshotAsSummary; - protected List> newlyReceivedStockSnapshot; + protected List newlyReceivedStockSnapshot; protected String previouslyUsedAddress; protected int activeLinks; protected int ticksSinceLastUpdate; @@ -75,7 +74,7 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity implements .sendToServer(new LogisticalStockRequestPacket(worldPosition)); } - public List> getClientStockSnapshot() { + public List getClientStockSnapshot() { return lastClientsideStockSnapshot; } @@ -86,7 +85,7 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity implements public int getTicksSinceLastUpdate() { return ticksSinceLastUpdate; } - + @Override public void broadcastPackageRequest(PackageOrder order, IItemHandler ignoredHandler, String address) { super.broadcastPackageRequest(order, ignoredHandler, address); @@ -141,7 +140,7 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity implements if (inventory == null) return; restockAmounts = new PackageOrder(summariseObservedInventory().getStacksByCount()); - List> stacks = restockAmounts.stacks(); + List stacks = restockAmounts.stacks(); if (stacks.size() > 8) stacks.subList(8, stacks.size()) .clear(); @@ -175,11 +174,11 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity implements return; InventorySummary presentStock = summariseObservedInventory(); - List> missingItems = new ArrayList<>(); - for (IntAttached required : restockAmounts.stacks()) { - int diff = required.getFirst() - presentStock.getCountOf(required.getValue()); + List missingItems = new ArrayList<>(); + for (BigItemStack required : restockAmounts.stacks()) { + int diff = required.count - presentStock.getCountOf(required.stack); if (diff > 0) - missingItems.add(IntAttached.with(diff, required.getValue())); + missingItems.add(new BigItemStack(required.stack, diff)); } if (missingItems.isEmpty()) @@ -194,7 +193,7 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity implements notifyUpdate(); } - public void receiveStockPacket(List> stacks, boolean endOfTransmission) { + public void receiveStockPacket(List stacks, boolean endOfTransmission) { if (newlyReceivedStockSnapshot == null) newlyReceivedStockSnapshot = new ArrayList<>(); newlyReceivedStockSnapshot.addAll(stacks); @@ -206,7 +205,6 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity implements newlyReceivedStockSnapshot = null; } - public boolean isKeeperPresent() { for (int yOffset : Iterate.zeroAndOne) { for (Direction side : Iterate.horizontalDirections) { @@ -231,11 +229,10 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity implements InventorySummary summary = new InventorySummary(); for (int i = 0; i < receivedPayments.getSlots(); i++) summary.add(receivedPayments.getStackInSlot(i)); - for (IntAttached entry : summary.getStacksByCount()) + for (BigItemStack entry : summary.getStacksByCount()) CreateLang.builder() - .text(Components.translatable(entry.getSecond() - .getDescriptionId()) - .getString() + " x" + entry.getFirst()) + .text(Components.translatable(entry.stack.getDescriptionId()) + .getString() + " x" + entry.count) .style(ChatFormatting.GREEN) .forGoggles(tooltip); diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java index 1bee5e8b4b..68be591fe4 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java @@ -7,6 +7,7 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.AllSoundEvents; import com.simibubi.create.content.contraptions.actors.seat.SeatEntity; +import com.simibubi.create.content.logistics.BigItemStack; import com.simibubi.create.content.logistics.displayCloth.ShoppingListItem; import com.simibubi.create.content.logistics.displayCloth.ShoppingListItem.ShoppingList; import com.simibubi.create.content.logistics.packager.InventorySummary; @@ -14,7 +15,6 @@ import com.simibubi.create.foundation.utility.CreateLang; import net.createmod.catnip.gui.ScreenOpener; import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.IntAttached; import net.createmod.catnip.utility.Iterate; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; @@ -96,8 +96,8 @@ public class StockTickerInteractionHandler { // Check stock levels InventorySummary recentSummary = tickerBE.getRecentSummary(); - for (IntAttached entry : order.stacks()) { - if (recentSummary.getCountOf(entry.getSecond()) >= entry.getFirst()) + for (BigItemStack entry : order.stacks()) { + if (recentSummary.getCountOf(entry.stack) >= entry.count) continue; AllSoundEvents.DENY.playOnServer(level, player.blockPosition()); @@ -109,9 +109,8 @@ public class StockTickerInteractionHandler { // Check space in stock ticker int occupiedSlots = 0; - for (IntAttached entry : paymentEntries.getStacksByCount()) - occupiedSlots += Mth.ceil(entry.getFirst() / (float) entry.getValue() - .getMaxStackSize()); + for (BigItemStack entry : paymentEntries.getStacksByCount()) + occupiedSlots += Mth.ceil(entry.count / (float) entry.stack.getMaxStackSize()); for (int i = 0; i < tickerBE.receivedPayments.getSlots(); i++) if (tickerBE.receivedPayments.getStackInSlot(i) .isEmpty()) diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java index 63321e1cd4..b6ef59b357 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java @@ -15,11 +15,11 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.AllPackets; +import com.simibubi.create.content.logistics.BigItemStack; import com.simibubi.create.foundation.utility.CreateLang; import net.createmod.catnip.gui.AbstractSimiScreen; import net.createmod.catnip.gui.element.GuiGameElement; -import net.createmod.catnip.utility.IntAttached; import net.createmod.catnip.utility.Iterate; import net.createmod.catnip.utility.animation.LerpedFloat; import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; @@ -53,9 +53,9 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { int emptyTicks = 0; int successTicks = 0; - List> currentItemSource; - List> displayedItems; - List> itemsToOrder; + List currentItemSource; + List displayedItems; + List itemsToOrder; boolean encodeRequester; // Redstone requesters @@ -126,8 +126,8 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { final String value = valueWithPrefix; displayedItems = new ArrayList<>(); - for (IntAttached entry : currentItemSource) { - ItemStack stack = entry.getValue(); + for (BigItemStack entry : currentItemSource) { + ItemStack stack = entry.stack; if (modSearch) { if (ForgeRegistries.ITEMS.getKey(stack.getItem()) @@ -175,7 +175,7 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { else successTicks = 0; - List> clientStockSnapshot = blockEntity.getClientStockSnapshot(); + List clientStockSnapshot = blockEntity.getClientStockSnapshot(); if (clientStockSnapshot != currentItemSource) { currentItemSource = clientStockSnapshot; refreshSearchResults(false); @@ -241,7 +241,7 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { if (itemsToOrder.size() <= index) break; - IntAttached entry = itemsToOrder.get(index); + BigItemStack entry = itemsToOrder.get(index); boolean isStackHovered = index == hoveredSlot; ms.pushPose(); @@ -288,7 +288,7 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { if (displayedItems.size() <= index) break; - IntAttached entry = displayedItems.get(index); + BigItemStack entry = displayedItems.get(index); boolean isStackHovered = index == hoveredSlot; ms.pushPose(); @@ -313,28 +313,26 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { // Render tooltip of hovered item if (hoveredSlot != noneHovered) - graphics.renderTooltip(font, displayedItems.get(hoveredSlot) - .getValue(), mouseX, mouseY); + graphics.renderTooltip(font, displayedItems.get(hoveredSlot).stack, mouseX, mouseY); hoveredSlot = getHoveredSlot(mouseX, mouseY, true); if (hoveredSlot != noneHovered) - graphics.renderTooltip(font, itemsToOrder.get(hoveredSlot) - .getValue(), mouseX, mouseY); + graphics.renderTooltip(font, itemsToOrder.get(hoveredSlot).stack, mouseX, mouseY); } - private void renderItemEntry(GuiGraphics graphics, float scale, IntAttached entry, - boolean isStackHovered, boolean isRenderingOrders) { + private void renderItemEntry(GuiGraphics graphics, float scale, BigItemStack entry, boolean isStackHovered, + boolean isRenderingOrders) { PoseStack ms = graphics.pose(); ms.pushPose(); ms.translate(0, 0, 200); - int customCount = entry.getFirst(); + int customCount = entry.count; if (!isRenderingOrders) { - IntAttached order = getOrderForItem(entry.getSecond()); + BigItemStack order = getOrderForItem(entry.stack); if (order != null) - customCount -= order.getFirst(); + customCount -= order.count; } - drawItemCount(graphics, entry.getFirst(), customCount); + drawItemCount(graphics, entry.count, customCount); ms.translate(0, 0, -200); float scaleFromHover = 1; @@ -346,7 +344,7 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { ms.scale(scale, scale, scale); ms.scale(scaleFromHover, scaleFromHover, scaleFromHover); ms.translate(-18 / 2.0, -18 / 2.0, 0); - GuiGameElement.of(entry.getSecond()) + GuiGameElement.of(entry.stack) .render(graphics); ms.popPose(); } @@ -377,23 +375,23 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { } @Nullable - private IntAttached getOrderForItem(ItemStack stack) { - for (IntAttached entry : itemsToOrder) - if (ItemHandlerHelper.canItemStacksStack(stack, entry.getValue())) + private BigItemStack getOrderForItem(ItemStack stack) { + for (BigItemStack entry : itemsToOrder) + if (ItemHandlerHelper.canItemStacksStack(stack, entry.stack)) return entry; return null; } private void revalidateOrders() { - Set> invalid = new HashSet<>(itemsToOrder); + Set invalid = new HashSet<>(itemsToOrder); if (currentItemSource == null) { itemsToOrder.removeAll(invalid); return; } - for (IntAttached entry : itemsToOrder) - for (IntAttached available : currentItemSource) - if (ItemHandlerHelper.canItemStacksStack(entry.getValue(), available.getValue())) { - entry.setFirst(Math.min(available.getFirst(), entry.getFirst())); + for (BigItemStack entry : itemsToOrder) + for (BigItemStack available : currentItemSource) + if (ItemHandlerHelper.canItemStacksStack(entry.stack, available.stack)) { + entry.count = Math.min(available.count, entry.count); invalid.remove(entry); break; } @@ -492,26 +490,26 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { if (hoveredSlot == noneHovered || !lmb && !rmb) return super.mouseClicked(pMouseX, pMouseY, pButton); - IntAttached entry = orderClicked ? itemsToOrder.get(hoveredSlot) : displayedItems.get(hoveredSlot); - ItemStack itemStack = entry.getValue(); - IntAttached existingOrder = getOrderForItem(itemStack); + BigItemStack entry = orderClicked ? itemsToOrder.get(hoveredSlot) : displayedItems.get(hoveredSlot); + ItemStack itemStack = entry.stack; + BigItemStack existingOrder = getOrderForItem(itemStack); if (existingOrder == null) { if (itemsToOrder.size() >= cols || rmb) return true; - itemsToOrder.add(existingOrder = IntAttached.withZero(itemStack.copyWithCount(1))); + itemsToOrder.add(existingOrder = new BigItemStack(itemStack.copyWithCount(1), 0)); } int transfer = hasShiftDown() ? itemStack.getMaxStackSize() : 1; - int current = existingOrder.getFirst(); + int current = existingOrder.count; if (rmb || orderClicked) { - existingOrder.setFirst(current - transfer); - if (existingOrder.getFirst() <= 0) + existingOrder.count = current - transfer; + if (existingOrder.count <= 0) itemsToOrder.remove(existingOrder); return true; } - existingOrder.setFirst(current + Math.min(transfer, entry.getFirst() - current)); + existingOrder.count = current + Math.min(transfer, entry.count - current); return true; } diff --git a/src/main/java/com/simibubi/create/foundation/events/CommonEvents.java b/src/main/java/com/simibubi/create/foundation/events/CommonEvents.java index 9a94303d69..24e2e62dd5 100644 --- a/src/main/java/com/simibubi/create/foundation/events/CommonEvents.java +++ b/src/main/java/com/simibubi/create/foundation/events/CommonEvents.java @@ -102,6 +102,7 @@ public class CommonEvents { LinkedControllerServerHandler.tick(world); ControlsServerHandler.tick(world); Create.RAILWAYS.tick(world); + Create.LOGISTICS.tick(world); } @SubscribeEvent @@ -164,6 +165,7 @@ public class CommonEvents { Create.REDSTONE_LINK_NETWORK_HANDLER.onLoadWorld(world); Create.TORQUE_PROPAGATOR.onLoadWorld(world); Create.RAILWAYS.levelLoaded(world); + Create.LOGISTICS.levelLoaded(world); } @SubscribeEvent From f9fa1b79345005c5e1fc613842c2cf9375a5f928 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Sun, 20 Oct 2024 19:50:04 +0200 Subject: [PATCH 084/515] A sizable size change - Reworked factory panels to fit 4 into one block space - Added proper connection sprites --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 4 +- .../create/models/item/factory_panel.json | 2 +- .../java/com/simibubi/create/AllBlocks.java | 7 +- .../java/com/simibubi/create/AllItems.java | 5 +- .../com/simibubi/create/AllPartialModels.java | 13 +- .../java/com/simibubi/create/AllShapes.java | 4 +- .../FactoryPanelAddressInputScreen.java | 9 +- .../factoryBoard/FactoryPanelBehaviour.java | 470 ++++++++++++++---- .../factoryBoard/FactoryPanelBlock.java | 193 ++++++- .../factoryBoard/FactoryPanelBlockEntity.java | 201 ++++---- .../FactoryPanelConfigurationPacket.java | 19 +- .../factoryBoard/FactoryPanelConnection.java | 76 ++- .../FactoryPanelConnectionBehaviour.java | 283 ----------- .../FactoryPanelConnectionHandler.java | 22 + .../FactoryPanelConnectionPacket.java | 33 +- .../FactoryPanelConnectorItem.java | 95 ---- .../FactoryPanelEffectPacket.java | 40 +- .../factoryBoard/FactoryPanelModel.java | 98 ++++ .../factoryBoard/FactoryPanelPosition.java | 23 + .../factoryBoard/FactoryPanelRenderer.java | 156 +++--- .../FactoryPanelSlotPositioning.java | 54 ++ .../blockEntity/behaviour/ValueBox.java | 5 - .../filtering/FilteringBehaviour.java | 25 +- .../filtering/FilteringRenderer.java | 177 +++---- .../models/block/factory_board/block.bbmodel | 1 - .../models/block/factory_board/block.json | 60 --- .../models/block/factory_panel/block.json | 44 +- .../block/factory_panel/bulb_light.json | 22 + .../factory_panel/connections/arrow_east.json | 18 + .../connections/arrow_north.json | 18 + .../connections/arrow_south.json | 17 + .../factory_panel/connections/arrow_west.json | 18 + .../factory_panel/connections/line_east.json | 18 + .../factory_panel/connections/line_north.json | 18 + .../factory_panel/connections/line_south.json | 17 + .../factory_panel/connections/line_west.json | 18 + .../models/block/factory_panel/input.json | 50 -- .../models/block/factory_panel/item.json | 106 ++++ .../models/block/factory_panel/panel.json | 38 ++ .../block/factory_panel/panel_with_bulb.json | 64 +++ .../models/block/factory_panel/timer.json | 49 -- .../create/textures/block/factory_board.png | Bin 145 -> 0 bytes .../create/textures/block/factory_panel.png | Bin 344 -> 478 bytes .../block/factory_panel_connections.png | Bin 0 -> 234 bytes .../assets/minecraft/atlases/blocks.json | 8 + 45 files changed, 1531 insertions(+), 1067 deletions(-) delete mode 100644 src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionBehaviour.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionHandler.java delete mode 100644 src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectorItem.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelModel.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelPosition.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelSlotPositioning.java delete mode 100644 src/main/resources/assets/create/models/block/factory_board/block.bbmodel delete mode 100644 src/main/resources/assets/create/models/block/factory_board/block.json create mode 100644 src/main/resources/assets/create/models/block/factory_panel/bulb_light.json create mode 100644 src/main/resources/assets/create/models/block/factory_panel/connections/arrow_east.json create mode 100644 src/main/resources/assets/create/models/block/factory_panel/connections/arrow_north.json create mode 100644 src/main/resources/assets/create/models/block/factory_panel/connections/arrow_south.json create mode 100644 src/main/resources/assets/create/models/block/factory_panel/connections/arrow_west.json create mode 100644 src/main/resources/assets/create/models/block/factory_panel/connections/line_east.json create mode 100644 src/main/resources/assets/create/models/block/factory_panel/connections/line_north.json create mode 100644 src/main/resources/assets/create/models/block/factory_panel/connections/line_south.json create mode 100644 src/main/resources/assets/create/models/block/factory_panel/connections/line_west.json delete mode 100644 src/main/resources/assets/create/models/block/factory_panel/input.json create mode 100644 src/main/resources/assets/create/models/block/factory_panel/item.json create mode 100644 src/main/resources/assets/create/models/block/factory_panel/panel.json create mode 100644 src/main/resources/assets/create/models/block/factory_panel/panel_with_bulb.json delete mode 100644 src/main/resources/assets/create/models/block/factory_panel/timer.json delete mode 100644 src/main/resources/assets/create/textures/block/factory_board.png create mode 100644 src/main/resources/assets/create/textures/block/factory_panel_connections.png diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 1de6bc9499..3bd1122443 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-10-18T15:46:50.504294 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-10-19T13:55:15.8788146 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -1988,7 +1988,7 @@ fa7ffb172a43774cc07a2bb201e7010a2549001d assets/create/models/item/exposed_coppe a443633d90ef9ac2a866b69b2ecdfad1841dc3e1 assets/create/models/item/exposed_copper_tile_slab.json 9bb425a14635fc8b36a9a95f3d0c54e0b129b7b4 assets/create/models/item/exposed_copper_tile_stairs.json 8b64a93d9b6e33e3caa66adb7a0cc8c5cd473023 assets/create/models/item/extendo_grip.json -caca352133a2f224fb841d85941f26cf47e843c4 assets/create/models/item/factory_panel.json +8e4a2cef0741c30574874d1a71d46f221ddbfaa4 assets/create/models/item/factory_panel.json bfc640c64c9ecde635eb0e7fc7b014f12e566840 assets/create/models/item/factory_panel_connector.json dad31483f65baaf187e6553e3cd301c5d69e9db4 assets/create/models/item/filter.json 575047531b8e324df9e58abba79cfe9ee3db8b16 assets/create/models/item/fluid_pipe.json diff --git a/src/generated/resources/assets/create/models/item/factory_panel.json b/src/generated/resources/assets/create/models/item/factory_panel.json index 5a5ccbca1a..52a5b2b366 100644 --- a/src/generated/resources/assets/create/models/item/factory_panel.json +++ b/src/generated/resources/assets/create/models/item/factory_panel.json @@ -1,3 +1,3 @@ { - "parent": "create:block/factory_panel/block" + "parent": "create:block/factory_panel/item" } \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 3b3d641f83..5989759b25 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -168,6 +168,7 @@ import com.simibubi.create.content.logistics.depot.DepotBlock; import com.simibubi.create.content.logistics.depot.EjectorBlock; import com.simibubi.create.content.logistics.depot.EjectorItem; import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBlock; +import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelModel; import com.simibubi.create.content.logistics.funnel.AndesiteFunnelBlock; import com.simibubi.create.content.logistics.funnel.BeltFunnelBlock; import com.simibubi.create.content.logistics.funnel.BeltFunnelGenerator; @@ -1812,12 +1813,16 @@ public class AllBlocks { public static final BlockEntry FACTORY_PANEL = REGISTRATE.block("factory_panel", FactoryPanelBlock::new) + .addLayer(() -> RenderType::cutoutMipped) .initialProperties(SharedProperties::copperMetal) + .properties(p -> p.noOcclusion()) .properties(p -> p.forceSolidOn()) .transform(pickaxeOnly()) .blockstate((c, p) -> p.horizontalFaceBlock(c.get(), AssetLookup.partialBaseModel(c, p))) + .onRegister(CreateRegistrate.blockModel(() -> FactoryPanelModel::new)) .item(LogisticallyLinkedBlockItem::new) - .transform(customItemModel("_", "block")) + .model(AssetLookup::customItemModel) + .build() .register(); public static final BlockEntry ANDESITE_FUNNEL = diff --git a/src/main/java/com/simibubi/create/AllItems.java b/src/main/java/com/simibubi/create/AllItems.java index e1389bb5bf..ada592ba42 100644 --- a/src/main/java/com/simibubi/create/AllItems.java +++ b/src/main/java/com/simibubi/create/AllItems.java @@ -47,7 +47,6 @@ import com.simibubi.create.content.legacy.ShadowSteelItem; import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.content.logistics.displayCloth.DisplayClothItem; import com.simibubi.create.content.logistics.displayCloth.ShoppingListItem; -import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelConnectorItem; import com.simibubi.create.content.logistics.filter.FilterItem; import com.simibubi.create.content.materials.ExperienceNuggetItem; import com.simibubi.create.content.processing.burner.BlazeBurnerBlockItem; @@ -245,8 +244,8 @@ public class AllItems { REGISTRATE.item("display_cloth", DisplayClothItem::new) .register(); - public static final ItemEntry FACTORY_PANEL_CONNECTOR = - REGISTRATE.item("factory_panel_connector", FactoryPanelConnectorItem::new) + public static final ItemEntry FACTORY_PANEL_CONNECTOR = + REGISTRATE.item("factory_panel_connector", Item::new) .register(); // wrapped by COPPER_BACKTANK for block placement uses. diff --git a/src/main/java/com/simibubi/create/AllPartialModels.java b/src/main/java/com/simibubi/create/AllPartialModels.java index b5eccf7950..006fef4b71 100644 --- a/src/main/java/com/simibubi/create/AllPartialModels.java +++ b/src/main/java/com/simibubi/create/AllPartialModels.java @@ -180,8 +180,9 @@ public class AllPartialModels { WATER_WHEEL = block("water_wheel/wheel"), LARGE_WATER_WHEEL = block("large_water_wheel/block"), LARGE_WATER_WHEEL_EXTENSION = block("large_water_wheel/block_extension"), - FACTORY_PANEL_TIMER = block("factory_panel/timer"), - FACTORY_PANEL_INPUT = block("factory_panel/input"), + FACTORY_PANEL = block("factory_panel/panel"), + FACTORY_PANEL_WITH_BULB = block("factory_panel/panel_with_bulb"), + FACTORY_PANEL_LIGHT = block("factory_panel/bulb_light"), DISPLAY_CLOTH = entity("display_cloth"), @@ -199,6 +200,9 @@ public class AllPartialModels { public static final Map> PIPE_ATTACHMENTS = new EnumMap<>(FluidTransportBehaviour.AttachmentTypes.ComponentPartials.class); + public static final Map FACTORY_PANEL_ARROWS = new EnumMap<>(Direction.class); + public static final Map FACTORY_PANEL_LINES = new EnumMap<>(Direction.class); + public static final Map METAL_GIRDER_BRACKETS = new EnumMap<>(Direction.class); public static final Map TOOLBOX_LIDS = new EnumMap<>(DyeColor.class); public static final Map> FOLDING_DOORS = new HashMap<>(); @@ -220,8 +224,11 @@ public class AllPartialModels { } for (DyeColor color : DyeColor.values()) TOOLBOX_LIDS.put(color, block("toolbox/lid/" + Lang.asId(color.name()))); - for (Direction d : Iterate.horizontalDirections) + for (Direction d : Iterate.horizontalDirections) { METAL_GIRDER_BRACKETS.put(d, block("metal_girder/bracket_" + Lang.asId(d.name()))); + FACTORY_PANEL_ARROWS.put(d, block("factory_panel/connections/arrow_" + Lang.asId(d.name()))); + FACTORY_PANEL_LINES.put(d, block("factory_panel/connections/line_" + Lang.asId(d.name()))); + } for (int i = 0; i < 8; i++) CONTRAPTION_CONTROLS_INDICATOR.add(block("contraption_controls/indicator_" + i)); diff --git a/src/main/java/com/simibubi/create/AllShapes.java b/src/main/java/com/simibubi/create/AllShapes.java index a15b3656c3..a1ccfc70ba 100644 --- a/src/main/java/com/simibubi/create/AllShapes.java +++ b/src/main/java/com/simibubi/create/AllShapes.java @@ -161,9 +161,7 @@ public class AllShapes { .forHorizontal(SOUTH), PLACARD = shape(2, 0, 2, 14, 3, 14).forDirectional(UP), - FACTORY_PANEL = shape(2, 0, 2, 14, 3, 14).add(0, 0, 6, 16, 3, 10) - .add(6, 0, 0, 10, 3, 16) - .forDirectional(UP), + FACTORY_PANEL_FALLBACK = shape(0, 0, 0, 16, 2, 16).forDirectional(UP), CLIPBOARD_FLOOR = shape(3, 0, 1, 13, 1, 15).forHorizontal(SOUTH), CLIPBOARD_CEILING = shape(3, 15, 1, 13, 16, 15).forHorizontal(SOUTH), diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelAddressInputScreen.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelAddressInputScreen.java index 2372811bc8..0228a66c36 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelAddressInputScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelAddressInputScreen.java @@ -10,9 +10,9 @@ import net.minecraft.network.chat.Component; public class FactoryPanelAddressInputScreen extends AbstractSimiScreen { EditBox addressBox; - private FactoryPanelConnectionBehaviour behaviour; + private FactoryPanelBehaviour behaviour; - public FactoryPanelAddressInputScreen(FactoryPanelConnectionBehaviour behaviour) { + public FactoryPanelAddressInputScreen(FactoryPanelBehaviour behaviour) { this.behaviour = behaviour; } @@ -24,7 +24,7 @@ public class FactoryPanelAddressInputScreen extends AbstractSimiScreen { super.init(); clearWidgets(); addressBox = new EditBox(font, guiLeft, guiTop, sizeX, sizeY, Component.empty()); - addressBox.setValue(behaviour.address); + addressBox.setValue(behaviour.recipeAddress); addRenderableWidget(addressBox); } @@ -38,8 +38,7 @@ public class FactoryPanelAddressInputScreen extends AbstractSimiScreen { public void removed() { super.removed(); AllPackets.getChannel() - .sendToServer( - new FactoryPanelConfigurationPacket(behaviour.getPos(), behaviour.side, addressBox.getValue())); + .sendToServer(new FactoryPanelConfigurationPacket(behaviour.getPanelPosition(), addressBox.getValue())); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java index fc82856cf3..5c5d83a943 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java @@ -1,118 +1,273 @@ package com.simibubi.create.content.logistics.factoryBoard; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.UUID; -import com.mojang.blaze3d.vertex.PoseStack; +import javax.annotation.Nullable; + +import org.joml.Math; + +import com.simibubi.create.AllItems; +import com.simibubi.create.AllPackets; import com.simibubi.create.Create; +import com.simibubi.create.content.logistics.BigItemStack; +import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBlock.PanelSlot; import com.simibubi.create.content.logistics.filter.FilterItem; import com.simibubi.create.content.logistics.filter.FilterItemStack; import com.simibubi.create.content.logistics.packager.InventorySummary; +import com.simibubi.create.content.logistics.packagerLink.RequestPromise; import com.simibubi.create.content.logistics.packagerLink.RequestPromiseQueue; +import com.simibubi.create.content.logistics.stockTicker.PackageOrder; import com.simibubi.create.content.logistics.stockTicker.StockCheckingBlockEntity; -import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform; +import com.simibubi.create.foundation.blockEntity.behaviour.BehaviourType; import com.simibubi.create.foundation.blockEntity.behaviour.ValueSettingsBoard; import com.simibubi.create.foundation.blockEntity.behaviour.ValueSettingsFormatter; import com.simibubi.create.foundation.blockEntity.behaviour.filtering.FilteringBehaviour; import com.simibubi.create.foundation.utility.CreateLang; -import dev.engine_room.flywheel.lib.transform.TransformStack; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.gui.ScreenOpener; +import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; import net.createmod.catnip.utility.lang.Components; import net.minecraft.ChatFormatting; -import net.minecraft.core.BlockPos; +import net.minecraft.client.player.LocalPlayer; import net.minecraft.core.Direction; -import net.minecraft.core.Direction.Axis; import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; import net.minecraft.network.chat.MutableComponent; -import net.minecraft.util.Mth; +import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.BlockAndTintGetter; +import net.minecraft.world.level.Level; import net.minecraft.world.phys.BlockHitResult; -import net.minecraft.world.phys.Vec3; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.fml.DistExecutor; public class FactoryPanelBehaviour extends FilteringBehaviour { - int lastReportedLevelInStorage; - int lastReportedPromises; + public static final BehaviourType TOP_LEFT = new BehaviourType<>(); + public static final BehaviourType TOP_RIGHT = new BehaviourType<>(); + public static final BehaviourType BOTTOM_LEFT = new BehaviourType<>(); + public static final BehaviourType BOTTOM_RIGHT = new BehaviourType<>(); + public static final int REQUEST_INTERVAL = 100; - public FactoryPanelBehaviour(FactoryPanelBlockEntity be) { - super(be, new FactoryPanelSlotPositioning(be)); - showCount(); - count = 0; - diamondShape = true; + public Map targetedBy; + public Set targeting; + + public boolean satisfied; + public boolean promisedSatisfied; + public String recipeAddress; + public int recipeOutput; + public LerpedFloat bulb; + public PanelSlot slot; + + private boolean active; + private int lastReportedLevelInStorage; + private int lastReportedPromises; + private int timer; + + public FactoryPanelBehaviour(FactoryPanelBlockEntity be, PanelSlot slot) { + super(be, new FactoryPanelSlotPositioning(slot)); + this.slot = slot; + this.targetedBy = new HashMap<>(); + this.targeting = new HashSet<>(); + this.count = 0; + this.satisfied = false; + this.promisedSatisfied = false; + this.recipeAddress = ""; + this.recipeOutput = 1; + this.active = false; + this.bulb = LerpedFloat.linear() + .startWithValue(0) + .chase(0, 0.45, Chaser.EXP); } - @Override - public ValueSettingsBoard createBoard(Player player, BlockHitResult hitResult) { - int maxAmount = 100; - return new ValueSettingsBoard(CreateLang.temporaryText("Target Amount in Storage") - .component(), maxAmount, 10, - List.of(CreateLang.temporaryText("Items") - .component(), - CreateLang.temporaryText("Stacks") - .component()), - new ValueSettingsFormatter(this::formatValue)); - } - - @Override - public MutableComponent getLabel() { - return CreateLang.temporaryText("Target Amount") - .component(); - } - - @Override - public ValueSettings getValueSettings() { - return new ValueSettings(upTo ? 0 : 1, count); - } - - @Override - public MutableComponent getCountLabelForValueBox() { - if (filter.isEmpty()) - return Components.empty(); - - int inStorage = getLevelInStorage(); - int promised = getPromised(); - String stacks = upTo ? "" : "\u25A4"; - - if (count == 0) { - return CreateLang.text(inStorage + stacks) - .color(0xF1EFE8) - .component(); - } - - return CreateLang.text(" " + inStorage + stacks) - .color(inStorage >= count ? 0xD7FFA8 : 0xFFBFA8) - .add(CreateLang.text(promised == 0 ? "" : "+" + promised)) - .add(CreateLang.text("/") - .style(ChatFormatting.WHITE)) - .add(CreateLang.text(count + stacks + " ") - .color(0xF1EFE8)) - .component(); + @Nullable + public static FactoryPanelBehaviour at(BlockAndTintGetter world, FactoryPanelPosition pos) { + if (world instanceof Level l && !l.isLoaded(pos.pos())) + return null; + if (!(world.getBlockEntity(pos.pos()) instanceof FactoryPanelBlockEntity fpbe)) + return null; + FactoryPanelBehaviour behaviour = fpbe.panels.get(pos.slot()); + if (!behaviour.active) + return null; + return behaviour; } @Override public void tick() { super.tick(); - if (getWorld().isClientSide()) + if (getWorld().isClientSide()) { + bulb.updateChaseTarget(satisfied ? 1 : 0); + bulb.tickChaser(); return; - int levelInStorage = getLevelInStorage(); - if (lastReportedLevelInStorage != levelInStorage) { - lastReportedLevelInStorage = levelInStorage; - blockEntity.sendData(); } + tickStorageMonitor(); + tickRequests(); + } + + private void tickStorageMonitor() { + ItemStack filter = getFilter(); + int inStorage = getLevelInStorage(); int promised = getPromised(); - if (lastReportedPromises != promised) { - lastReportedPromises = promised; - blockEntity.sendData(); + int demand = getAmount() * (upTo ? 1 : filter.getMaxStackSize()); + boolean shouldSatisfy = filter.isEmpty() || inStorage >= demand; + boolean shouldPromiseSatisfy = filter.isEmpty() || inStorage + promised >= demand; + + if (lastReportedLevelInStorage == inStorage && lastReportedPromises == promised && satisfied == shouldSatisfy + && promisedSatisfied == shouldPromiseSatisfy) + return; + + lastReportedLevelInStorage = inStorage; + satisfied = shouldSatisfy; + lastReportedPromises = promised; + promisedSatisfied = shouldPromiseSatisfy; + blockEntity.sendData(); + } + + private void tickRequests() { + if (targetedBy.isEmpty()) + return; + if (!(blockEntity instanceof FactoryPanelBlockEntity fpbe)) + return; + if (satisfied || promisedSatisfied) + return; + if (timer > 0) { + timer = Math.min(timer, REQUEST_INTERVAL); + timer--; + return; } + + timer = REQUEST_INTERVAL; + + InventorySummary summary = fpbe.getAccurateSummary(); + boolean failed = false; + + List toRequest = new ArrayList<>(); + for (FactoryPanelConnection connection : targetedBy.values()) { + FactoryPanelBehaviour source = at(getWorld(), connection.from()); + if (source == null) + return; + ItemStack item = source.getFilter(); + int amount = connection.amount(); + if (amount == 0 || item.isEmpty() || summary.getCountOf(item) < amount) { + sendEffect(connection.from(), false); + failed = true; + continue; + } + + toRequest.add(new BigItemStack(item, amount)); + sendEffect(connection.from(), true); + } + + if (failed) + return; + + PackageOrder order = new PackageOrder(toRequest); + fpbe.broadcastPackageRequest(order, null, recipeAddress); + + RequestPromiseQueue promises = Create.LOGISTICS.getQueuedPromises(fpbe.behaviour.freqId); + if (promises != null) + promises.add(new RequestPromise(new BigItemStack(getFilter(), recipeOutput))); + } + + private void sendEffect(FactoryPanelPosition fromPos, boolean success) { + AllPackets.sendToNear(getWorld(), getPos(), 64, + new FactoryPanelEffectPacket(fromPos, getPanelPosition(), success)); + } + + public void addConnection(FactoryPanelPosition fromPos) { + FactoryPanelBehaviour source = at(getWorld(), fromPos); + if (source == null) + return; + source.targeting.add(getPanelPosition()); + targetedBy.putIfAbsent(fromPos, new FactoryPanelConnection(fromPos, 1)); + blockEntity.notifyUpdate(); + } + + public FactoryPanelPosition getPanelPosition() { + return new FactoryPanelPosition(getPos(), slot); + } + + @Override + public void onShortInteract(Player player, InteractionHand hand, Direction side, BlockHitResult hitResult) { + ItemStack itemInHand = player.getItemInHand(hand); + boolean isConnector = AllItems.FACTORY_PANEL_CONNECTOR.isIn(itemInHand); + + if (getFilter().isEmpty()) { + super.onShortInteract(player, hand, side, hitResult); + return; + } + + if (!player.level().isClientSide) + return; + if (isConnector) { + FactoryPanelConnectionHandler.panelClicked(getWorld(), getPanelPosition()); + return; + } + + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> displayScreen(player)); + } + + public void enable() { + active = true; + blockEntity.notifyUpdate(); + } + + public void disable() { + destroy(); + active = false; + targetedBy = new HashMap<>(); + targeting = new HashSet<>(); + count = 0; + satisfied = false; + promisedSatisfied = false; + recipeAddress = ""; + recipeOutput = 1; + setFilter(ItemStack.EMPTY); + blockEntity.notifyUpdate(); + } + + @Override + public boolean isActive() { + return active; + } + + @Override + public void destroy() { + FactoryPanelPosition panelPosition = getPanelPosition(); + for (FactoryPanelPosition position : targetedBy.keySet()) { + FactoryPanelBehaviour source = at(getWorld(), position); + if (source != null) { + source.targeting.remove(panelPosition); + source.blockEntity.sendData(); + } + } + for (FactoryPanelPosition position : targeting) { + FactoryPanelBehaviour target = at(getWorld(), position); + if (target != null) { + target.targetedBy.remove(panelPosition); + target.blockEntity.sendData(); + } + } + + super.destroy(); } public int getLevelInStorage() { if (getWorld().isClientSide()) return lastReportedLevelInStorage; + if (getFilter().isEmpty()) + return 0; + InventorySummary summary = ((StockCheckingBlockEntity) blockEntity).getRecentSummary(); return summary.getCountOf(getFilter()) / (upTo ? 1 : getFilter().getMaxStackSize()); } @@ -120,27 +275,61 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { public int getPromised() { if (getWorld().isClientSide()) return lastReportedPromises; + if (getFilter().isEmpty()) + return 0; + UUID freqId = ((StockCheckingBlockEntity) blockEntity).behaviour.freqId; RequestPromiseQueue promises = Create.LOGISTICS.getQueuedPromises(freqId); - if (promises == null) - return 0; - return promises.getTotalPromised(getFilter()); + return promises == null ? 0 : promises.getTotalPromised(getFilter()); } @Override public void write(CompoundTag nbt, boolean clientPacket) { - super.write(nbt, clientPacket); - nbt.putInt("LastLevel", lastReportedLevelInStorage); - nbt.putInt("LastPromised", lastReportedPromises); + if (!active) + return; + + CompoundTag panelTag = new CompoundTag(); + super.write(panelTag, clientPacket); + + panelTag.putInt("LastLevel", lastReportedLevelInStorage); + panelTag.putInt("LastPromised", lastReportedPromises); + panelTag.putBoolean("Satisfied", satisfied); + panelTag.putBoolean("PromisedSatisfied", promisedSatisfied); + panelTag.put("Targeting", NBTHelper.writeCompoundList(targeting, FactoryPanelPosition::write)); + panelTag.put("TargetedBy", NBTHelper.writeCompoundList(targetedBy.values(), FactoryPanelConnection::write)); + panelTag.putString("RecipeAddress", recipeAddress); + panelTag.putInt("RecipeOutput", recipeOutput); + + nbt.put(CreateLang.asId(slot.name()), panelTag); } @Override public void read(CompoundTag nbt, boolean clientPacket) { - filter = FilterItemStack.of(nbt.getCompound("Filter")); - count = nbt.getInt("FilterAmount"); - upTo = nbt.getBoolean("UpTo"); - lastReportedLevelInStorage = nbt.getInt("LastLevel"); - lastReportedPromises = nbt.getInt("LastPromised"); + CompoundTag panelTag = nbt.getCompound(CreateLang.asId(slot.name())); + if (panelTag.isEmpty()) { + active = false; + return; + } + + active = true; + filter = FilterItemStack.of(panelTag.getCompound("Filter")); + count = panelTag.getInt("FilterAmount"); + upTo = panelTag.getBoolean("UpTo"); + lastReportedLevelInStorage = panelTag.getInt("LastLevel"); + lastReportedPromises = panelTag.getInt("LastPromised"); + satisfied = panelTag.getBoolean("Satisfied"); + promisedSatisfied = panelTag.getBoolean("PromisedSatisfied"); + + targeting.clear(); + NBTHelper.iterateCompoundList(panelTag.getList("Targeting", Tag.TAG_COMPOUND), + c -> targeting.add(FactoryPanelPosition.read(c))); + + targetedBy.clear(); + NBTHelper.iterateCompoundList(panelTag.getList("TargetedBy", Tag.TAG_COMPOUND), + c -> targetedBy.put(FactoryPanelPosition.read(c), FactoryPanelConnection.read(c))); + + recipeAddress = panelTag.getString("RecipeAddress"); + recipeOutput = panelTag.getInt("RecipeOutput"); } @Override @@ -171,47 +360,110 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { return; count = Math.max(0, settings.value()); upTo = settings.row() == 0; + if (blockEntity instanceof FactoryPanelBlockEntity fpbe) + fpbe.redraw = true; blockEntity.setChanged(); blockEntity.sendData(); playFeedbackSound(this); } - private static class FactoryPanelSlotPositioning extends ValueBoxTransform { + @Override + public ValueSettingsBoard createBoard(Player player, BlockHitResult hitResult) { + int maxAmount = 100; + return new ValueSettingsBoard(CreateLang.temporaryText("Target Amount in Storage") + .component(), maxAmount, 10, + List.of(CreateLang.temporaryText("Items") + .component(), + CreateLang.temporaryText("Stacks") + .component()), + new ValueSettingsFormatter(this::formatValue)); + } - private FactoryPanelBlockEntity be; + @Override + public MutableComponent getLabel() { + String key = "Target Amount"; - public FactoryPanelSlotPositioning(FactoryPanelBlockEntity be) { - this.be = be; + if (getFilter().isEmpty()) + key = "New Factory task"; + else if (getAmount() == 0 || targetedBy.isEmpty()) + key = getFilter().getHoverName() + .getString(); + else { + String stacks = upTo ? "" : "\u25A4"; + key = getFilter().getHoverName() + .getString() + " -> " + getAmount() + stacks; + if (!satisfied) + key += " (In Progress)"; } - @Override - public Vec3 getLocalOffset(LevelAccessor level, BlockPos pos, BlockState state) { - Vec3 vec = VecHelper.voxelSpace(8, 8, 2.5f); - vec = VecHelper.rotateCentered(vec, Mth.RAD_TO_DEG * be.getXRot(), Axis.X); - vec = VecHelper.rotateCentered(vec, Mth.RAD_TO_DEG * be.getYRot(), Axis.Y); - return vec; + return CreateLang.temporaryText(key) + .component(); + } + + @Override + public ValueSettings getValueSettings() { + return new ValueSettings(upTo ? 0 : 1, count); + } + + @Override + public MutableComponent getTip() { + return CreateLang.translateDirect( + filter.isEmpty() ? "logistics.filter.click_to_set" : "logistics.factory_panel.click_to_configure"); + } + + @Override + public MutableComponent getCountLabelForValueBox() { + if (filter.isEmpty()) + return Components.empty(); + + int inStorage = getLevelInStorage(); + int promised = getPromised(); + String stacks = upTo ? "" : "\u25A4"; + + if (count == 0) { + return CreateLang.text(inStorage + stacks) + .color(0xF1EFE8) + .component(); } - @Override - public boolean testHit(LevelAccessor level, BlockPos pos, BlockState state, Vec3 localHit) { - Vec3 offset = getLocalOffset(level, pos, state); - if (offset == null) - return false; - return localHit.distanceTo(offset) < scale / 3; - } + return CreateLang.text(" " + inStorage + stacks) + .color(inStorage >= count ? 0xD7FFA8 : 0xFFBFA8) + .add(CreateLang.text(promised == 0 ? "" : "+" + promised)) + .add(CreateLang.text("/") + .style(ChatFormatting.WHITE)) + .add(CreateLang.text(count + stacks + " ") + .color(0xF1EFE8)) + .component(); + } - @Override - public float getScale() { - return super.getScale() * 1.125f; - } + @Override + public int netId() { + return 2 + slot.ordinal(); + } - @Override - public void rotate(LevelAccessor level, BlockPos pos, BlockState state, PoseStack ms) { - TransformStack.of(ms) - .rotate(be.getYRot() + Mth.PI, Direction.UP) - .rotate(-be.getXRot(), Direction.EAST); - } + @Override + public boolean isCountVisible() { + return !getFilter().isEmpty(); + } + @Override + public BehaviourType getType() { + return getTypeForSlot(slot); + } + + public static BehaviourType getTypeForSlot(PanelSlot slot) { + return switch (slot) { + case BOTTOM_LEFT -> BOTTOM_LEFT; + case TOP_LEFT -> TOP_LEFT; + case TOP_RIGHT -> TOP_RIGHT; + case BOTTOM_RIGHT -> BOTTOM_RIGHT; + }; + } + + @OnlyIn(value = Dist.CLIENT) + private void displayScreen(Player player) { + if (player instanceof LocalPlayer) + ScreenOpener.open(new FactoryPanelAddressInputScreen(this)); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java index e3a55a0331..54b4851559 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java @@ -1,18 +1,25 @@ package com.simibubi.create.content.logistics.factoryBoard; import com.simibubi.create.AllBlockEntityTypes; +import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.AllShapes; import com.simibubi.create.content.equipment.wrench.IWrenchable; import com.simibubi.create.foundation.block.IBE; import com.simibubi.create.foundation.block.ProperWaterloggedBlock; -import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.core.Direction.Axis; +import net.minecraft.sounds.SoundSource; +import net.minecraft.util.Mth; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; @@ -28,14 +35,34 @@ import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.block.state.properties.BooleanProperty; import net.minecraft.world.level.material.FluidState; import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.HitResult; +import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; +import net.minecraftforge.common.ForgeMod; public class FactoryPanelBlock extends FaceAttachedHorizontalDirectionalBlock implements ProperWaterloggedBlock, IBE, IWrenchable { public static final BooleanProperty POWERED = BlockStateProperties.POWERED; + public static enum PanelSlot { + TOP_LEFT(1, 1), TOP_RIGHT(0, 1), BOTTOM_LEFT(1, 0), BOTTOM_RIGHT(0, 0); + + public int xOffset; + public int yOffset; + + private PanelSlot(int xOffset, int yOffset) { + this.xOffset = xOffset; + this.yOffset = yOffset; + } + } + + public static enum PanelType { + PASSIVE, ACTIVE + } + public FactoryPanelBlock(Properties p_53182_) { super(p_53182_); registerDefaultState(defaultBlockState().setValue(WATERLOGGED, false) @@ -67,9 +94,90 @@ public class FactoryPanelBlock extends FaceAttachedHorizontalDirectionalBlock if (stateForPlacement.getValue(FACE) == AttachFace.FLOOR) stateForPlacement = stateForPlacement.setValue(FACING, stateForPlacement.getValue(FACING) .getOpposite()); + + Level level = pContext.getLevel(); + BlockPos pos = pContext.getClickedPos(); + BlockState blockState = level.getBlockState(pos); + FactoryPanelBlockEntity fpbe = getBlockEntity(level, pos); + + Vec3 location = pContext.getClickLocation(); + if (blockState.is(this) && location != null && fpbe != null && !level.isClientSide()) + fpbe.addPanel(getTargetedSlot(pos, blockState, location)); + return withWater(stateForPlacement, pContext); } + @Override + public void setPlacedBy(Level pLevel, BlockPos pPos, BlockState pState, LivingEntity pPlacer, ItemStack pStack) { + super.setPlacedBy(pLevel, pPos, pState, pPlacer, pStack); + if (pPlacer == null) + return; + double range = pPlacer.getAttribute(ForgeMod.BLOCK_REACH.get()) + .getValue() + 1; + HitResult hitResult = pPlacer.pick(range, 1, false); + Vec3 location = hitResult.getLocation(); + if (location == null) + return; + PanelSlot initialSlot = getTargetedSlot(pPos, pState, location); + withBlockEntityDo(pLevel, pPos, fpbe -> fpbe.addPanel(initialSlot)); + } + + @Override + public InteractionResult use(BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, + BlockHitResult pHit) { + if (pPlayer == null) + return InteractionResult.PASS; + ItemStack item = pPlayer.getItemInHand(pHand); + if (AllItems.FACTORY_PANEL_CONNECTOR.isIn(item)) + return InteractionResult.PASS; + if (pLevel.isClientSide) + return InteractionResult.SUCCESS; + if (!AllBlocks.FACTORY_PANEL.isIn(item)) + return InteractionResult.SUCCESS; + Vec3 location = pHit.getLocation(); + if (location == null) + return InteractionResult.SUCCESS; + + PanelSlot newSlot = getTargetedSlot(pPos, pState, location); + withBlockEntityDo(pLevel, pPos, fpbe -> { + if (!fpbe.addPanel(newSlot)) + return; + pLevel.playSound(null, pPos, soundType.getPlaceSound(), SoundSource.BLOCKS); + if (pPlayer.isCreative()) + return; + item.shrink(1); + if (item.isEmpty()) + pPlayer.setItemInHand(pHand, ItemStack.EMPTY); + }); + return InteractionResult.SUCCESS; + } + + @Override + public boolean onDestroyedByPlayer(BlockState state, Level level, BlockPos pos, Player player, boolean willHarvest, + FluidState fluid) { + if (tryDestroySubPanelFirst(state, level, pos, player)) + return false; + boolean result = super.onDestroyedByPlayer(state, level, pos, player, willHarvest, fluid); + return result; + } + + private boolean tryDestroySubPanelFirst(BlockState state, Level level, BlockPos pos, Player player) { + double range = player.getAttribute(ForgeMod.BLOCK_REACH.get()) + .getValue() + 1; + HitResult hitResult = player.pick(range, 1, false); + Vec3 location = hitResult.getLocation(); + PanelSlot destroyedSlot = getTargetedSlot(pos, state, location); + return InteractionResult.SUCCESS == onBlockEntityUse(level, pos, fpbe -> { + if (fpbe.activePanels() < 2) + return InteractionResult.FAIL; + if (!fpbe.removePanel(destroyedSlot)) + return InteractionResult.FAIL; + if (!player.isCreative()) + popResource(level, pos, AllBlocks.FACTORY_PANEL.asStack()); + return InteractionResult.SUCCESS; + }); + } + @Override public boolean isSignalSource(BlockState pState) { return true; @@ -85,9 +193,40 @@ public class FactoryPanelBlock extends FaceAttachedHorizontalDirectionalBlock return pBlockState.getValue(POWERED) && getConnectedDirection(pBlockState) == pSide ? 15 : 0; } + @Override + public boolean canBeReplaced(BlockState pState, BlockPlaceContext pUseContext) { + if (pUseContext.isSecondaryUseActive()) + return false; + if (!AllBlocks.FACTORY_PANEL.isIn(pUseContext.getItemInHand())) + return false; + Vec3 location = pUseContext.getClickLocation(); + if (location == null) + return false; + + BlockPos pos = pUseContext.getClickedPos(); + PanelSlot slot = getTargetedSlot(pos, pState, location); + FactoryPanelBlockEntity blockEntity = getBlockEntity(pUseContext.getLevel(), pos); + + if (blockEntity == null) + return false; + if (blockEntity.panels.get(slot) + .isActive()) + return false; + return true; + } + + @Override + public VoxelShape getCollisionShape(BlockState pState, BlockGetter pLevel, BlockPos pPos, + CollisionContext pContext) { + return Shapes.empty(); + } + @Override public VoxelShape getShape(BlockState pState, BlockGetter pLevel, BlockPos pPos, CollisionContext pContext) { - return AllShapes.FACTORY_PANEL.get(getConnectedDirection(pState)); + FactoryPanelBlockEntity blockEntity = getBlockEntity(pLevel, pPos); + if (blockEntity != null) + return blockEntity.getShape(); + return AllShapes.FACTORY_PANEL_FALLBACK.get(getConnectedDirection(pState)); } @Override @@ -106,14 +245,6 @@ public class FactoryPanelBlock extends FaceAttachedHorizontalDirectionalBlock return getConnectedDirection(state); } - @Override - public InteractionResult use(BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, - BlockHitResult pHit) { - if (pPlayer != null && AllItems.FACTORY_PANEL_CONNECTOR.isIn(pPlayer.getItemInHand(pHand))) - return InteractionResult.PASS; - return InteractionResult.SUCCESS; - } - @Override public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pIsMoving) { boolean blockChanged = !pState.is(pNewState.getBlock()); @@ -129,17 +260,27 @@ public class FactoryPanelBlock extends FaceAttachedHorizontalDirectionalBlock pLevel.updateNeighborsAt(pPos.relative(getConnectedDirection(pState).getOpposite()), pState.getBlock()); } - public static Direction getDirection(BlockState state, Pointing side) { - Direction direction = getConnectedDirection(state).getOpposite(); - Direction hDirection = state.getValue(FACING); + public PanelSlot getTargetedSlot(BlockPos pos, BlockState blockState, Vec3 clickLocation) { + double bestDistance = Double.MAX_VALUE; + PanelSlot bestSlot = PanelSlot.BOTTOM_LEFT; + Vec3 localClick = clickLocation.subtract(Vec3.atLowerCornerOf(pos)); + float xRot = Mth.RAD_TO_DEG * FactoryPanelBlock.getXRot(blockState); + float yRot = Mth.RAD_TO_DEG * FactoryPanelBlock.getYRot(blockState); - if (direction == Direction.UP) - side = Pointing.values()[(side.ordinal() + hDirection.getOpposite() - .get2DDataValue()) % 4]; - if (direction == Direction.DOWN) - side = Pointing.values()[(side.ordinal() + 6 - hDirection.get2DDataValue()) % 4]; + for (PanelSlot slot : PanelSlot.values()) { + Vec3 vec = new Vec3(.25 + slot.xOffset * .5, 0, .25 + slot.yOffset * .5); + vec = VecHelper.rotateCentered(vec, 180, Axis.Y); + vec = VecHelper.rotateCentered(vec, xRot + 90, Axis.X); + vec = VecHelper.rotateCentered(vec, yRot, Axis.Y); - return side.getCombinedDirection(direction); + double diff = vec.distanceToSqr(localClick); + if (diff > bestDistance) + continue; + bestDistance = diff; + bestSlot = slot; + } + + return bestSlot; } @Override @@ -152,4 +293,18 @@ public class FactoryPanelBlock extends FaceAttachedHorizontalDirectionalBlock return AllBlockEntityTypes.FACTORY_PANEL.get(); } + public static float getXRot(BlockState state) { + AttachFace face = state.getOptionalValue(FactoryPanelBlock.FACE) + .orElse(AttachFace.FLOOR); + return face == AttachFace.CEILING ? Mth.PI / 2 : face == AttachFace.FLOOR ? -Mth.PI / 2 : 0; + } + + public static float getYRot(BlockState state) { + Direction facing = state.getOptionalValue(FactoryPanelBlock.FACING) + .orElse(Direction.SOUTH); + AttachFace face = state.getOptionalValue(FactoryPanelBlock.FACE) + .orElse(AttachFace.FLOOR); + return (face == AttachFace.CEILING ? Mth.PI : 0) + AngleHelper.rad(AngleHelper.horizontalAngle(facing)); + } + } diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java index f248be23ea..b28f7a3cbf 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java @@ -1,160 +1,141 @@ package com.simibubi.create.content.logistics.factoryBoard; import java.util.EnumMap; -import java.util.HashMap; import java.util.List; -import java.util.Map; - -import org.joml.Math; +import com.simibubi.create.AllBlocks; +import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBlock.PanelSlot; import com.simibubi.create.content.logistics.stockTicker.StockCheckingBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import net.createmod.catnip.utility.NBTHelper; -import net.createmod.catnip.utility.Pointing; -import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.core.Direction.Axis; import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.NbtUtils; -import net.minecraft.nbt.Tag; import net.minecraft.util.Mth; -import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.state.properties.AttachFace; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; public class FactoryPanelBlockEntity extends StockCheckingBlockEntity { - public FactoryPanelBehaviour panelBehaviour; + public EnumMap panels; - public EnumMap> inboundConnections = new EnumMap<>(Pointing.class); - public EnumMap connections; + public boolean redraw; - public boolean satisfied; - public boolean promisedSatisfied; + private VoxelShape lastShape; public FactoryPanelBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); - satisfied = false; - promisedSatisfied = false; } @Override public void addBehaviours(List behaviours) { + panels = new EnumMap<>(PanelSlot.class); + redraw = true; super.addBehaviours(behaviours); - behaviours.add(panelBehaviour = new FactoryPanelBehaviour(this)); - connections = new EnumMap<>(Pointing.class); - for (Pointing side : Pointing.values()) { - FactoryPanelConnectionBehaviour e = new FactoryPanelConnectionBehaviour(this, side); - connections.put(side, e); + for (PanelSlot slot : PanelSlot.values()) { + FactoryPanelBehaviour e = new FactoryPanelBehaviour(this, slot); + panels.put(slot, e); behaviours.add(e); } } - public void addConnection(BlockPos fromPos, Pointing fromSide, Pointing toSide) { - if (level.getBlockEntity(fromPos) instanceof FactoryPanelBlockEntity fpbe) - fpbe.activateInput(fromSide); - inboundConnections.computeIfAbsent(toSide, $ -> new HashMap<>()) - .put(fromPos.subtract(worldPosition), new FactoryPanelConnection(fromSide)); - connections.get(toSide) - .setValue(Math.max(connections.get(toSide) - .getValue(), 200)); - notifyUpdate(); + @Override + public void lazyTick() { + super.lazyTick(); + if (!level.isClientSide() && panels.isEmpty()) + level.destroyBlock(worldPosition, false); } - public void activateInput(Pointing onSide) { - connections.get(onSide).inputModeActive = true; - notifyUpdate(); - } - - public boolean isInput(Pointing onSide) { - return connections.get(onSide).inputModeActive; - } - - public boolean hasInboundConnections(Pointing onSide) { - return inboundConnections.containsKey(onSide); + public int activePanels() { + int result = 0; + for (FactoryPanelBehaviour panelBehaviour : panels.values()) + if (panelBehaviour.isActive()) + result++; + return result; } @Override - public void tick() { - super.tick(); - if (level.isClientSide) - return; + public void destroy() { + super.destroy(); + int panelCount = activePanels(); + if (panelCount > 1) + Block.popResource(level, worldPosition, AllBlocks.FACTORY_PANEL.asStack(panelCount - 1)); + } - ItemStack filter = panelBehaviour.getFilter(); - if (filter.isEmpty() || panelBehaviour.getAmount() == 0) { - setSatisfied(true); - return; + public boolean addPanel(PanelSlot slot) { + FactoryPanelBehaviour behaviour = panels.get(slot); + if (behaviour != null && !behaviour.isActive()) { + behaviour.enable(); + redraw = true; + lastShape = null; + return true; + } + return false; + } + + public boolean removePanel(PanelSlot slot) { + FactoryPanelBehaviour behaviour = panels.get(slot); + if (behaviour != null && behaviour.isActive()) { + behaviour.disable(); + redraw = true; + lastShape = null; + return true; + } + return false; + } + + public VoxelShape getShape() { + if (lastShape != null) + return lastShape; + + float xRot = Mth.RAD_TO_DEG * FactoryPanelBlock.getXRot(getBlockState()) + 90; + float yRot = Mth.RAD_TO_DEG * FactoryPanelBlock.getYRot(getBlockState()); + Direction connectedDirection = FactoryPanelBlock.connectedDirection(getBlockState()); + Vec3 inflateAxes = VecHelper.axisAlingedPlaneOf(connectedDirection); + + lastShape = Shapes.empty(); + + for (FactoryPanelBehaviour behaviour : panels.values()) { + if (!behaviour.isActive()) + continue; + FactoryPanelPosition panelPosition = behaviour.getPanelPosition(); + Vec3 vec = + new Vec3(.25 + panelPosition.slot().xOffset * .5, 1 / 16f, .25 + panelPosition.slot().yOffset * .5); + vec = VecHelper.rotateCentered(vec, 180, Axis.Y); + vec = VecHelper.rotateCentered(vec, xRot, Axis.X); + vec = VecHelper.rotateCentered(vec, yRot, Axis.Y); + AABB bb = new AABB(vec, vec).inflate(1 / 16f) + .inflate(inflateAxes.x * 3 / 16f, inflateAxes.y * 3 / 16f, inflateAxes.z * 3 / 16f); + lastShape = Shapes.or(lastShape, Shapes.create(bb)); } - int inStorage = panelBehaviour.getLevelInStorage(); - int promised = panelBehaviour.getPromised(); - int demand = panelBehaviour.getAmount() * (panelBehaviour.upTo ? 1 : filter.getMaxStackSize()); - - setSatisfied(inStorage >= demand); - setPromisedSatisfied(inStorage + promised >= demand); - } - - public void setPromisedSatisfied(boolean promisedSatisfied) { - if (this.promisedSatisfied == promisedSatisfied) - return; - this.promisedSatisfied = promisedSatisfied; - notifyUpdate(); - } - - public void setSatisfied(boolean satisfied) { - if (this.satisfied == satisfied) - return; - this.satisfied = satisfied; - notifyUpdate(); - } - - @Override - protected void write(CompoundTag tag, boolean clientPacket) { - super.write(tag, clientPacket); - tag.putBoolean("Satisfied", satisfied); - tag.putBoolean("PromisedSatisfied", promisedSatisfied); - - tag.put("Sides", NBTHelper.writeCompoundList(inboundConnections.entrySet(), e -> { - CompoundTag nbt = new CompoundTag(); - nbt.put("Connections", NBTHelper.writeCompoundList(e.getValue() - .entrySet(), e2 -> { - CompoundTag nbt2 = e2.getValue() - .write(); - nbt2.put("Pos", NbtUtils.writeBlockPos(e2.getKey())); - return nbt2; - })); - nbt.putString("Side", e.getKey() - .name()); - return nbt; - })); + return lastShape; } @Override protected void read(CompoundTag tag, boolean clientPacket) { super.read(tag, clientPacket); - satisfied = tag.getBoolean("Satisfied"); - promisedSatisfied = tag.getBoolean("PromisedSatisfied"); - - inboundConnections.clear(); - NBTHelper.iterateCompoundList(tag.getList("Sides", Tag.TAG_COMPOUND), nbt -> { - HashMap map = new HashMap<>(); - NBTHelper.iterateCompoundList(nbt.getList("Connections", Tag.TAG_COMPOUND), - nbt2 -> map.put(NbtUtils.readBlockPos(nbt2.getCompound("Pos")), FactoryPanelConnection.read(nbt2))); - inboundConnections.put(Pointing.valueOf(nbt.getString("Side")), map); - }); + if (clientPacket && tag.contains("Redraw")) { + lastShape = null; + level.sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), 16); + } } - public float getYRot() { - Direction facing = getBlockState().getValue(FactoryPanelBlock.FACING); - AttachFace face = getBlockState().getValue(FactoryPanelBlock.FACE); - return (face == AttachFace.CEILING ? Mth.PI : 0) + AngleHelper.rad(AngleHelper.horizontalAngle(facing)); - } - - public float getXRot() { - AttachFace face = getBlockState().getValue(FactoryPanelBlock.FACE); - return face == AttachFace.CEILING ? Mth.PI / 2 : face == AttachFace.FLOOR ? -Mth.PI / 2 : 0; + @Override + protected void write(CompoundTag tag, boolean clientPacket) { + super.write(tag, clientPacket); + if (clientPacket && redraw) { + NBTHelper.putMarker(tag, "Redraw"); + redraw = false; + } } } diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConfigurationPacket.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConfigurationPacket.java index 69a396d08f..3ef6863c7e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConfigurationPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConfigurationPacket.java @@ -1,19 +1,18 @@ package com.simibubi.create.content.logistics.factoryBoard; +import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBlock.PanelSlot; import com.simibubi.create.foundation.networking.BlockEntityConfigurationPacket; -import net.createmod.catnip.utility.Pointing; -import net.minecraft.core.BlockPos; import net.minecraft.network.FriendlyByteBuf; public class FactoryPanelConfigurationPacket extends BlockEntityConfigurationPacket { - private Pointing side; + private PanelSlot slot; private String address; - public FactoryPanelConfigurationPacket(BlockPos pos, Pointing side, String address) { - super(pos); - this.side = side; + public FactoryPanelConfigurationPacket(FactoryPanelPosition position, String address) { + super(position.pos()); + this.slot = position.slot(); this.address = address; } @@ -23,21 +22,21 @@ public class FactoryPanelConfigurationPacket extends BlockEntityConfigurationPac @Override protected void writeSettings(FriendlyByteBuf buffer) { - buffer.writeVarInt(side.ordinal()); + buffer.writeVarInt(slot.ordinal()); buffer.writeUtf(address); } @Override protected void readSettings(FriendlyByteBuf buffer) { - side = Pointing.values()[buffer.readVarInt()]; + slot = PanelSlot.values()[buffer.readVarInt()]; address = buffer.readUtf(); } @Override protected void applySettings(FactoryPanelBlockEntity be) { - FactoryPanelConnectionBehaviour behaviour = be.connections.get(side); + FactoryPanelBehaviour behaviour = be.panels.get(slot); if (behaviour != null) { - behaviour.address = address; + behaviour.recipeAddress = address; be.notifyUpdate(); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnection.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnection.java index 523f18f9fc..44bda79fe1 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnection.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnection.java @@ -1,18 +1,80 @@ package com.simibubi.create.content.logistics.factoryBoard; -import net.createmod.catnip.utility.Pointing; -import net.minecraft.nbt.CompoundTag; +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.lang3.mutable.MutableBoolean; + +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.VecHelper; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Direction.Axis; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.Mth; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; + +public record FactoryPanelConnection(FactoryPanelPosition from, int amount, List path, + MutableBoolean successTracker) { + + public FactoryPanelConnection(FactoryPanelPosition from, int amount) { + this(from, amount, new ArrayList<>(), new MutableBoolean(true)); + } -public record FactoryPanelConnection(Pointing fromSide) { - public static FactoryPanelConnection read(CompoundTag nbt) { - return new FactoryPanelConnection(Pointing.valueOf(nbt.getString("FromSide"))); + return new FactoryPanelConnection(FactoryPanelPosition.read(nbt), nbt.getInt("Amount")); } public CompoundTag write() { - CompoundTag nbt = new CompoundTag(); - nbt.putString("FromSide", fromSide.name()); + CompoundTag nbt = from.write(); + nbt.putInt("Amount", amount); return nbt; } + public List getPath(BlockState state, FactoryPanelPosition to) { + if (!path.isEmpty()) + return path; + + path.clear(); + + float xRot = Mth.RAD_TO_DEG * FactoryPanelBlock.getXRot(state); + float yRot = Mth.RAD_TO_DEG * FactoryPanelBlock.getYRot(state); + + int slotDiffx = to.slot().xOffset - from.slot().xOffset; + int slotDiffY = to.slot().yOffset - from.slot().yOffset; + Vec3 diff = Vec3.atLowerCornerOf(to.pos() + .subtract(from.pos())); + + diff = VecHelper.rotate(diff, -yRot, Axis.Y); + diff = VecHelper.rotate(diff, -xRot - 90, Axis.X); + diff = VecHelper.rotate(diff, -180, Axis.Y); + diff = diff.add(slotDiffx * .5, 0, slotDiffY * .5); + + BlockPos toTravel = BlockPos.containing(diff.scale(2) + .add(0.1, 0.1, 0.1)); + Direction lastDirection = null; + Direction currentDirection = Direction.SOUTH; + + for (int i = 0; i < 100; i++) { + if (toTravel.equals(BlockPos.ZERO)) + break; + + for (Direction d : Iterate.horizontalDirections) { + if (lastDirection != null && d == lastDirection.getOpposite()) + continue; + if (toTravel.relative(d) + .distManhattan(BlockPos.ZERO) < toTravel.relative(currentDirection) + .distManhattan(BlockPos.ZERO)) + currentDirection = d; + } + + lastDirection = currentDirection; + toTravel = toTravel.relative(currentDirection); + path.add(currentDirection); + } + + return path; + } + } diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionBehaviour.java deleted file mode 100644 index a143040cc8..0000000000 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionBehaviour.java +++ /dev/null @@ -1,283 +0,0 @@ -package com.simibubi.create.content.logistics.factoryBoard; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map.Entry; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.AllItems; -import com.simibubi.create.AllPackets; -import com.simibubi.create.Create; -import com.simibubi.create.content.logistics.BigItemStack; -import com.simibubi.create.content.logistics.packager.InventorySummary; -import com.simibubi.create.content.logistics.packagerLink.RequestPromise; -import com.simibubi.create.content.logistics.packagerLink.RequestPromiseQueue; -import com.simibubi.create.content.logistics.stockTicker.PackageOrder; -import com.simibubi.create.foundation.blockEntity.behaviour.BehaviourType; -import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform; -import com.simibubi.create.foundation.blockEntity.behaviour.ValueSettingsBoard; -import com.simibubi.create.foundation.blockEntity.behaviour.ValueSettingsFormatter; -import com.simibubi.create.foundation.blockEntity.behaviour.scrollValue.ScrollValueBehaviour; -import com.simibubi.create.foundation.utility.CreateLang; - -import dev.engine_room.flywheel.lib.transform.TransformStack; -import net.createmod.catnip.gui.ScreenOpener; -import net.createmod.catnip.utility.NBTHelper; -import net.createmod.catnip.utility.Pointing; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.lang.Components; -import net.minecraft.client.player.LocalPlayer; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.core.Direction.Axis; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.chat.MutableComponent; -import net.minecraft.util.Mth; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.context.UseOnContext; -import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.BlockHitResult; -import net.minecraft.world.phys.Vec3; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.fml.DistExecutor; - -public class FactoryPanelConnectionBehaviour extends ScrollValueBehaviour { - - public static final BehaviourType UP = new BehaviourType<>(); - public static final BehaviourType DOWN = new BehaviourType<>(); - public static final BehaviourType LEFT = new BehaviourType<>(); - public static final BehaviourType RIGHT = new BehaviourType<>(); - - public boolean inputModeActive; - public String address; - public Pointing side; - - public static final int REQUEST_INTERVAL = 100; - - private int timer; - - public FactoryPanelConnectionBehaviour(FactoryPanelBlockEntity be, Pointing side) { - super(Components.empty(), be, new FactoryPanelConnectionSlotPositioning(be, side)); - this.side = side; - onlyActiveWhen(() -> inputModeActive || be.hasInboundConnections(side)); - withFormatter(value -> formatInputSlot(value)); - inputModeActive = false; - setValue(1); - address = ""; - } - - @Override - public void tick() { - super.tick(); - if (getWorld().isClientSide) - return; - if (!(blockEntity instanceof FactoryPanelBlockEntity fpbe)) - return; - if (!fpbe.hasInboundConnections(side) || fpbe.satisfied || fpbe.promisedSatisfied) - return; - if (value <= 0) - return; - if (timer > 0) { - timer = Math.min(timer, REQUEST_INTERVAL); - timer--; - return; - } - - timer = REQUEST_INTERVAL; - - InventorySummary summary = fpbe.getAccurateSummary(); - boolean failed = false; - - List toRequest = new ArrayList<>(); - for (Entry entry : fpbe.inboundConnections.get(side) - .entrySet()) { - BlockPos targetPos = getPos().offset(entry.getKey()); - if (!getWorld().isLoaded(targetPos)) - return; - if (!(getWorld().getBlockEntity(targetPos) instanceof FactoryPanelBlockEntity fpbe2)) - continue; - Pointing fromSide = entry.getValue() - .fromSide(); - FactoryPanelConnectionBehaviour connectionBehaviour = fpbe2.connections.get(fromSide); - ItemStack item = fpbe2.panelBehaviour.getFilter(); - if (connectionBehaviour.value == 0 || item.isEmpty()) - continue; - if (summary.getCountOf(item) < connectionBehaviour.value) { - sendEffect(targetPos, fromSide, getPos(), side, false); - failed = true; - continue; - } - - toRequest.add(new BigItemStack(item, connectionBehaviour.value)); - sendEffect(targetPos, fromSide, getPos(), side, true); - } - - if (failed) - return; - - PackageOrder order = new PackageOrder(toRequest); - fpbe.broadcastPackageRequest(order, null, address); - - RequestPromiseQueue promises = Create.LOGISTICS.getQueuedPromises(fpbe.behaviour.freqId); - if (promises != null) - promises.add(new RequestPromise(new BigItemStack(fpbe.panelBehaviour.getFilter(), getValue()))); - } - - private void sendEffect(BlockPos fromPos, Pointing fromSide, BlockPos toPos, Pointing toSide, boolean success) { - AllPackets.sendToNear(getWorld(), getPos(), 64, - new FactoryPanelEffectPacket(fromPos, fromSide, toPos, toSide, success)); - } - - @Override - public BehaviourType getType() { - return getTypeForSide(side); - } - - public static BehaviourType getTypeForSide(Pointing side) { - return switch (side) { - case DOWN -> DOWN; - case LEFT -> LEFT; - case RIGHT -> RIGHT; - case UP -> UP; - }; - } - - // - - @Override - public ValueSettingsBoard createBoard(Player player, BlockHitResult hitResult) { - return new ValueSettingsBoard( - CreateLang.temporaryText(inputModeActive ? "Amount per Shipment" : "Expected Returns") - .component(), - 64, 16, List.of(CreateLang.temporaryText("Items") - .component()), - new ValueSettingsFormatter(this::formatInputSettings)); - } - - @Override - public void onShortInteract(Player player, InteractionHand hand, Direction side, BlockHitResult hitResult) { - ItemStack itemInHand = player.getItemInHand(hand); - if (AllItems.FACTORY_PANEL_CONNECTOR.isIn(itemInHand)) - itemInHand.useOn(new UseOnContext(player, hand, hitResult)); - else if (!inputModeActive) - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> displayScreen(player)); - } - - @Override - public void setValueSettings(Player player, ValueSettings valueSetting, boolean ctrlHeld) { - int value = Math.max(1, valueSetting.value()); - if (!valueSetting.equals(getValueSettings())) - playFeedbackSound(this); - setValue(value); - } - - @Override - public ValueSettings getValueSettings() { - return new ValueSettings(0, this.value); - } - - @Override - public void setValue(int value) { - if (value == this.value) - return; - this.value = value; - blockEntity.setChanged(); - blockEntity.sendData(); - } - - public MutableComponent formatInputSettings(ValueSettings settings) { - int value = Math.max(1, settings.value()); - return Components.literal(value + ""); - } - - private String formatInputSlot(int value) { - return String.valueOf(value); - } - - @Override - public String getClipboardKey() { - return "FactoryConnections"; - } - - // - - @Override - public void write(CompoundTag nbt, boolean clientPacket) { - String sideName = side.getSerializedName(); - if (inputModeActive) - NBTHelper.putMarker(nbt, sideName + "Input"); - else { - nbt.putInt(sideName + "Timer", timer); - nbt.putString(sideName + "Address", address); - } - nbt.putInt(sideName + "ScrollValue", value); - } - - @Override - public void read(CompoundTag nbt, boolean clientPacket) { - String sideName = side.getSerializedName(); - inputModeActive = nbt.getBoolean(sideName + "Input"); - value = nbt.getInt(sideName + "ScrollValue"); - address = nbt.getString(sideName + "Address"); - timer = nbt.getInt(sideName + "Timer"); - - if (!clientPacket) - return; - label = inputModeActive ? CreateLang.temporaryText("Amount per Shipment") - .component() - : CreateLang.temporaryText("Expected Amount") - .component(); - } - - @Override - public int netId() { - return 2 + side.ordinal(); - } - - @OnlyIn(value = Dist.CLIENT) - protected void displayScreen(Player player) { - if (player instanceof LocalPlayer) - ScreenOpener.open(new FactoryPanelAddressInputScreen(this)); - } - - private static class FactoryPanelConnectionSlotPositioning extends ValueBoxTransform { - - private FactoryPanelBlockEntity be; - private Pointing side; - - public FactoryPanelConnectionSlotPositioning(FactoryPanelBlockEntity be, Pointing side) { - this.be = be; - this.side = side; - } - - @Override - public boolean testHit(LevelAccessor level, BlockPos pos, BlockState state, Vec3 localHit) { - Vec3 offset = getLocalOffset(level, pos, state); - if (offset == null) - return false; - return localHit.distanceTo(offset) < scale / 4; - } - - @Override - public Vec3 getLocalOffset(LevelAccessor level, BlockPos pos, BlockState state) { - Vec3 vec = VecHelper.voxelSpace(8, 14, 2.5f); - vec = VecHelper.rotateCentered(vec, -side.getXRotation(), Axis.Z); - vec = VecHelper.rotateCentered(vec, Mth.RAD_TO_DEG * be.getXRot(), Axis.X); - vec = VecHelper.rotateCentered(vec, Mth.RAD_TO_DEG * be.getYRot(), Axis.Y); - return vec; - } - - @Override - public void rotate(LevelAccessor level, BlockPos pos, BlockState state, PoseStack ms) { - TransformStack.of(ms) - .rotate(be.getYRot() + Mth.PI, Direction.UP) - .rotate(-be.getXRot(), Direction.EAST); - } - - } - -} diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionHandler.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionHandler.java new file mode 100644 index 0000000000..9524d34773 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionHandler.java @@ -0,0 +1,22 @@ +package com.simibubi.create.content.logistics.factoryBoard; + +import com.simibubi.create.AllPackets; + +import net.minecraft.world.level.LevelAccessor; + +public class FactoryPanelConnectionHandler { + + static FactoryPanelPosition connectingFrom; + + public static void panelClicked(LevelAccessor level, FactoryPanelPosition panelPos) { + if (connectingFrom == null) { + connectingFrom = panelPos; + return; + } + + AllPackets.getChannel() + .sendToServer(new FactoryPanelConnectionPacket(connectingFrom, panelPos)); + connectingFrom = null; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionPacket.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionPacket.java index c0cfdfd898..0a41204b1b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionPacket.java @@ -1,22 +1,19 @@ package com.simibubi.create.content.logistics.factoryBoard; +import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBlock.PanelSlot; import com.simibubi.create.foundation.networking.BlockEntityConfigurationPacket; -import net.createmod.catnip.utility.Pointing; -import net.minecraft.core.BlockPos; import net.minecraft.network.FriendlyByteBuf; public class FactoryPanelConnectionPacket extends BlockEntityConfigurationPacket { - private BlockPos fromPos; - private Pointing fromSide; - private Pointing toSide; + private FactoryPanelPosition fromPos; + private FactoryPanelPosition toPos; - public FactoryPanelConnectionPacket(BlockPos fromPos, Pointing fromSide, BlockPos toPos, Pointing toSide) { - super(toPos); + public FactoryPanelConnectionPacket(FactoryPanelPosition fromPos, FactoryPanelPosition toPos) { + super(toPos.pos()); this.fromPos = fromPos; - this.fromSide = fromSide; - this.toSide = toSide; + this.toPos = toPos; } public FactoryPanelConnectionPacket(FriendlyByteBuf buffer) { @@ -25,21 +22,25 @@ public class FactoryPanelConnectionPacket extends BlockEntityConfigurationPacket @Override protected void writeSettings(FriendlyByteBuf buffer) { - buffer.writeBlockPos(fromPos); - buffer.writeVarInt(fromSide.ordinal()); - buffer.writeVarInt(toSide.ordinal()); + buffer.writeBlockPos(fromPos.pos()); + buffer.writeVarInt(fromPos.slot() + .ordinal()); + buffer.writeBlockPos(toPos.pos()); + buffer.writeVarInt(toPos.slot() + .ordinal()); } @Override protected void readSettings(FriendlyByteBuf buffer) { - fromPos = buffer.readBlockPos(); - fromSide = Pointing.values()[buffer.readVarInt()]; - toSide = Pointing.values()[buffer.readVarInt()]; + fromPos = new FactoryPanelPosition(buffer.readBlockPos(), PanelSlot.values()[buffer.readVarInt()]); + toPos = new FactoryPanelPosition(buffer.readBlockPos(), PanelSlot.values()[buffer.readVarInt()]); } @Override protected void applySettings(FactoryPanelBlockEntity be) { - be.addConnection(fromPos, fromSide, toSide); + FactoryPanelBehaviour behaviour = FactoryPanelBehaviour.at(be.getLevel(), toPos); + if (behaviour != null) + behaviour.addConnection(fromPos); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectorItem.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectorItem.java deleted file mode 100644 index 44b106efc9..0000000000 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectorItem.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.simibubi.create.content.logistics.factoryBoard; - -import com.simibubi.create.AllBlocks; -import com.simibubi.create.AllPackets; - -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.Pointing; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.context.UseOnContext; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.Vec3; - -public class FactoryPanelConnectorItem extends Item { - - static BlockPos connectingFrom; - static Pointing connectingFromSide; - - public FactoryPanelConnectorItem(Properties pProperties) { - super(pProperties); - } - - @Override - public InteractionResult useOn(UseOnContext pContext) { - BlockPos pos = pContext.getClickedPos(); - Level level = pContext.getLevel(); - BlockState blockState = level.getBlockState(pos); - - if (!AllBlocks.FACTORY_PANEL.has(blockState)) - return super.useOn(pContext); - if (!level.isClientSide()) - return InteractionResult.SUCCESS; - - Direction direction = FactoryPanelBlock.connectedDirection(blockState) - .getOpposite(); - Vec3 clickLocation = pContext.getClickLocation(); - - if (connectingFrom == null) { - connectingFrom = pos; - connectingFromSide = getTargetedSide(pos, direction, blockState, clickLocation); - return InteractionResult.SUCCESS; - } - - BlockPos connectingTo = pos; - Pointing connectingToSide = getTargetedSide(pos, direction, blockState, clickLocation); - - if (connectingTo.equals(connectingFrom)) - return InteractionResult.SUCCESS; - - BlockPos connectingFromPos = connectingFrom; - connectingFrom = null; - - BlockState blockStateFrom = level.getBlockState(connectingFromPos); - - if (!AllBlocks.FACTORY_PANEL.has(blockStateFrom)) - return InteractionResult.SUCCESS; - if (blockStateFrom != blockState) - return InteractionResult.SUCCESS; - - AllPackets.getChannel() - .sendToServer(new FactoryPanelConnectionPacket(connectingFromPos, connectingFromSide, connectingTo, - connectingToSide)); - - return InteractionResult.SUCCESS; - } - - private Pointing getTargetedSide(BlockPos pos, Direction direction, BlockState blockState, Vec3 clickLocation) { - double bestDistance = 0; - Direction bestDirection = null; - Vec3 diffFromCenter = clickLocation.subtract(Vec3.atCenterOf(pos)); - for (Direction side : Iterate.directions) { - if (side.getAxis() == direction.getAxis()) - continue; - double diff = side.getAxis() - .choose(diffFromCenter.x, diffFromCenter.y, diffFromCenter.z) - * side.getAxisDirection() - .getStep(); - if (diff < bestDistance) - continue; - bestDistance = diff; - bestDirection = side; - } - - Pointing result = Pointing.UP; - for (Pointing p : Pointing.values()) - if (FactoryPanelBlock.getDirection(blockState, p) == bestDirection) - result = p; - - return result; - } - -} diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelEffectPacket.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelEffectPacket.java index 86d4dc74c0..e4eaeaa4ca 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelEffectPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelEffectPacket.java @@ -1,12 +1,11 @@ package com.simibubi.create.content.logistics.factoryBoard; import com.simibubi.create.AllBlocks; +import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBlock.PanelSlot; import com.simibubi.create.foundation.networking.SimplePacketBase; -import net.createmod.catnip.utility.Pointing; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.core.BlockPos; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.api.distmarker.Dist; @@ -15,35 +14,30 @@ import net.minecraftforge.network.NetworkEvent.Context; public class FactoryPanelEffectPacket extends SimplePacketBase { - private BlockPos fromPos; - private Pointing fromSide; - private Pointing toSide; - private BlockPos toPos; + private FactoryPanelPosition fromPos; + private FactoryPanelPosition toPos; private boolean success; - public FactoryPanelEffectPacket(BlockPos fromPos, Pointing fromSide, BlockPos toPos, Pointing toSide, - boolean success) { + public FactoryPanelEffectPacket(FactoryPanelPosition fromPos, FactoryPanelPosition toPos, boolean success) { this.fromPos = fromPos; - this.fromSide = fromSide; this.toPos = toPos; - this.toSide = toSide; this.success = success; } public FactoryPanelEffectPacket(FriendlyByteBuf buffer) { - toPos = buffer.readBlockPos(); - fromPos = buffer.readBlockPos(); - fromSide = Pointing.values()[buffer.readVarInt()]; - toSide = Pointing.values()[buffer.readVarInt()]; + fromPos = new FactoryPanelPosition(buffer.readBlockPos(), PanelSlot.values()[buffer.readVarInt()]); + toPos = new FactoryPanelPosition(buffer.readBlockPos(), PanelSlot.values()[buffer.readVarInt()]); success = buffer.readBoolean(); } @Override public void write(FriendlyByteBuf buffer) { - buffer.writeBlockPos(toPos); - buffer.writeBlockPos(fromPos); - buffer.writeVarInt(fromSide.ordinal()); - buffer.writeVarInt(toSide.ordinal()); + buffer.writeBlockPos(fromPos.pos()); + buffer.writeVarInt(fromPos.slot() + .ordinal()); + buffer.writeBlockPos(toPos.pos()); + buffer.writeVarInt(toPos.slot() + .ordinal()); buffer.writeBoolean(success); } @@ -51,10 +45,16 @@ public class FactoryPanelEffectPacket extends SimplePacketBase { @OnlyIn(Dist.CLIENT) public boolean handle(Context context) { ClientLevel level = Minecraft.getInstance().level; - BlockState blockState = level.getBlockState(fromPos); + BlockState blockState = level.getBlockState(fromPos.pos()); if (!AllBlocks.FACTORY_PANEL.has(blockState)) return true; - FactoryPanelRenderer.renderConnection(blockState, fromPos, toPos, fromSide, toSide, success ? 1 : 0, true); + FactoryPanelBehaviour panelBehaviour = FactoryPanelBehaviour.at(level, toPos); + if (panelBehaviour != null) { + panelBehaviour.bulb.setValue(1); + FactoryPanelConnection connection = panelBehaviour.targetedBy.get(fromPos); + connection.successTracker() + .setValue(success); + } return true; } } diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelModel.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelModel.java new file mode 100644 index 0000000000..9dc3599a28 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelModel.java @@ -0,0 +1,98 @@ +package com.simibubi.create.content.logistics.factoryBoard; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.EnumMap; +import java.util.List; + +import com.simibubi.create.AllPartialModels; +import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBlock.PanelSlot; +import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBlock.PanelType; +import com.simibubi.create.foundation.model.BakedModelWrapperWithData; +import com.simibubi.create.foundation.model.BakedQuadHelper; + +import dev.engine_room.flywheel.lib.model.baked.PartialModel; +import net.createmod.catnip.utility.VecHelper; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Direction.Axis; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.BlockAndTintGetter; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.client.model.data.ModelData; +import net.minecraftforge.client.model.data.ModelData.Builder; +import net.minecraftforge.client.model.data.ModelProperty; + +public class FactoryPanelModel extends BakedModelWrapperWithData { + + private static final ModelProperty PANEL_PROPERTY = new ModelProperty<>(); + + public FactoryPanelModel(BakedModel originalModel) { + super(originalModel); + } + + @Override + protected Builder gatherModelData(Builder builder, BlockAndTintGetter world, BlockPos pos, BlockState state, + ModelData blockEntityData) { + FactoryPanelModelData data = new FactoryPanelModelData(); + for (PanelSlot slot : PanelSlot.values()) { + FactoryPanelBehaviour behaviour = FactoryPanelBehaviour.at(world, new FactoryPanelPosition(pos, slot)); + if (behaviour == null) + continue; + data.types.put(slot, behaviour.count == 0 ? PanelType.PASSIVE : PanelType.ACTIVE); + } + return builder.with(PANEL_PROPERTY, data); + } + + @Override + public List getQuads(BlockState state, Direction side, RandomSource rand, ModelData data, + RenderType renderType) { + if (side != null || !data.has(PANEL_PROPERTY)) + return Collections.emptyList(); + FactoryPanelModelData modelData = data.get(PANEL_PROPERTY); + List quads = new ArrayList<>(super.getQuads(state, null, rand, data, renderType)); + for (PanelSlot panelSlot : PanelSlot.values()) + if (modelData.types.containsKey(panelSlot)) + addPanel(quads, state, panelSlot, modelData.types.get(panelSlot), rand, data, renderType); + return quads; + } + + public void addPanel(List quads, BlockState state, PanelSlot slot, PanelType type, RandomSource rand, + ModelData data, RenderType renderType) { + PartialModel factoryPanel = + type == PanelType.PASSIVE ? AllPartialModels.FACTORY_PANEL : AllPartialModels.FACTORY_PANEL_WITH_BULB; + List quadsToAdd = factoryPanel.get() + .getQuads(state, null, rand, data, RenderType.solid()); + + for (BakedQuad bakedQuad : quadsToAdd) { + int[] vertices = bakedQuad.getVertices(); + int[] transformedVertices = Arrays.copyOf(vertices, vertices.length); + + float xRot = Mth.RAD_TO_DEG * FactoryPanelBlock.getXRot(state); + float yRot = Mth.RAD_TO_DEG * FactoryPanelBlock.getYRot(state); + + for (int i = 0; i < vertices.length / BakedQuadHelper.VERTEX_STRIDE; i++) { + Vec3 vertex = BakedQuadHelper.getXYZ(vertices, i); + vertex = vertex.add(slot.xOffset * .5, 0, slot.yOffset * .5); + vertex = VecHelper.rotateCentered(vertex, 180, Axis.Y); + vertex = VecHelper.rotateCentered(vertex, xRot + 90, Axis.X); + vertex = VecHelper.rotateCentered(vertex, yRot, Axis.Y); + BakedQuadHelper.setXYZ(transformedVertices, i, vertex); + } + + quads.add(BakedQuadHelper.cloneWithCustomGeometry(bakedQuad, transformedVertices)); + } + + } + + private static class FactoryPanelModelData { + public EnumMap types = new EnumMap<>(PanelSlot.class); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelPosition.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelPosition.java new file mode 100644 index 0000000000..925dee1cd9 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelPosition.java @@ -0,0 +1,23 @@ +package com.simibubi.create.content.logistics.factoryBoard; + +import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBlock.PanelSlot; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.util.Mth; + +public record FactoryPanelPosition(BlockPos pos, PanelSlot slot) { + + public static FactoryPanelPosition read(CompoundTag nbt) { + return new FactoryPanelPosition(NbtUtils.readBlockPos(nbt), + PanelSlot.values()[Mth.positiveModulo(nbt.getInt("Slot"), 4)]); + } + + public CompoundTag write() { + CompoundTag nbt = NbtUtils.writeBlockPos(pos); + nbt.putInt("Slot", slot.ordinal()); + return nbt; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelRenderer.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelRenderer.java index e62e987968..5ba69d73d1 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelRenderer.java @@ -1,23 +1,22 @@ package com.simibubi.create.content.logistics.factoryBoard; -import org.apache.commons.lang3.tuple.Pair; +import java.util.List; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllPartialModels; import com.simibubi.create.foundation.blockEntity.renderer.SmartBlockEntityRenderer; +import com.simibubi.create.foundation.render.RenderTypes; -import net.createmod.catnip.CatnipClient; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.utility.AnimationTickHolder; -import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.utility.theme.Color; +import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider.Context; -import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.util.Mth; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.Vec3; public class FactoryPanelRenderer extends SmartBlockEntityRenderer { @@ -29,93 +28,100 @@ public class FactoryPanelRenderer extends SmartBlockEntityRenderer { - if (behaviour.inputModeActive) - renderAttachment(be, fromSide, true, ms, buffer, light, overlay); - }); - - be.inboundConnections.forEach((toSide, map) -> { - map.forEach((fromPos, connection) -> renderConnection(be.getBlockState(), fromPos.offset(be.getBlockPos()), - be.getBlockPos(), connection.fromSide(), toSide, be.satisfied ? 2 : be.promisedSatisfied ? 1 : 0, - false)); - renderAttachment(be, toSide, false, ms, buffer, light, overlay); - }); + for (FactoryPanelBehaviour behaviour : be.panels.values()) { + if (!behaviour.isActive()) + continue; + if (behaviour.getAmount() > 0) + renderBulb(behaviour, partialTicks, ms, buffer, light, overlay); + for (FactoryPanelConnection connection : behaviour.targetedBy.values()) + renderPath(behaviour, connection, partialTicks, ms, buffer, light, overlay); + } } - private void renderAttachment(FactoryPanelBlockEntity be, Pointing side, boolean input, PoseStack ms, + public static void renderBulb(FactoryPanelBehaviour behaviour, float partialTicks, PoseStack ms, MultiBufferSource buffer, int light, int overlay) { - ms.pushPose(); + BlockState blockState = behaviour.blockEntity.getBlockState(); - float offset = 6 / 16f; + float xRot = FactoryPanelBlock.getXRot(blockState) + Mth.PI / 2; + float yRot = FactoryPanelBlock.getYRot(blockState); + float glow = behaviour.bulb.getValue(partialTicks); - CachedBuffers - .partial(input ? AllPartialModels.FACTORY_PANEL_INPUT : AllPartialModels.FACTORY_PANEL_TIMER, - be.getBlockState()) - .rotateCentered(be.getYRot() + Mth.PI, Direction.UP) - .rotateCentered(-be.getXRot(), Direction.EAST) - .translate(0, side == Pointing.UP ? offset : side == Pointing.DOWN ? -offset : 0, 0) - .translate(side == Pointing.LEFT ? offset : side == Pointing.RIGHT ? -offset : 0, 0, 0) - .light(light) + CachedBuffers.partial(AllPartialModels.FACTORY_PANEL_LIGHT, blockState) + .rotateCentered(yRot, Direction.UP) + .rotateCentered(xRot, Direction.EAST) + .rotateCentered(Mth.PI, Direction.UP) + .translate(behaviour.slot.xOffset * .5, 0, behaviour.slot.yOffset * .5) + .light(glow > 0.125f ? LightTexture.FULL_BRIGHT : light) .overlay(overlay) - .renderInto(ms, buffer.getBuffer(RenderType.solid())); + .renderInto(ms, buffer.getBuffer(RenderType.translucent())); - ms.popPose(); + if (glow < .125f) + return; + + glow = (float) (1 - (2 * Math.pow(glow - .75f, 2))); + glow = Mth.clamp(glow, -1, 1); + int color = (int) (200 * glow); + + CachedBuffers.partial(AllPartialModels.FACTORY_PANEL_LIGHT, blockState) + .rotateCentered(yRot, Direction.UP) + .rotateCentered(xRot, Direction.EAST) + .rotateCentered(Mth.PI, Direction.UP) + .translate(behaviour.slot.xOffset * .5, 0, behaviour.slot.yOffset * .5) +// .translate(1 / 16f, 2 / 16f, 7 / 16f) +// .scale(1.25f) +// .translate(-1 / 16f, -2 / 16f, -7 / 16f) + .light(LightTexture.FULL_BRIGHT) + .color(color, color, color, 255) + .overlay(overlay) + .renderInto(ms, buffer.getBuffer(RenderTypes.additive())); } - public static void renderConnection(BlockState blockState, BlockPos fromPos, BlockPos toPos, Pointing fromSide, - Pointing toSide, int satisfyState, boolean effect) { - Direction facing = FactoryPanelBlock.connectedDirection(blockState); - Vec3 facingNormal = Vec3.atLowerCornerOf(facing.getNormal()); - Vec3 offset = Vec3.atCenterOf(BlockPos.ZERO) - .add(facingNormal.scale(-0.375)); + public static void renderPath(FactoryPanelBehaviour behaviour, FactoryPanelConnection connection, + float partialTicks, PoseStack ms, MultiBufferSource buffer, int light, int overlay) { + BlockState blockState = behaviour.blockEntity.getBlockState(); + List path = connection.getPath(blockState, behaviour.getPanelPosition()); + + float xRot = FactoryPanelBlock.getXRot(blockState) + Mth.PI / 2; + float yRot = FactoryPanelBlock.getYRot(blockState); + float glow = behaviour.bulb.getValue(partialTicks); + float yOffset = 0; boolean flicker = AnimationTickHolder.getTicks() % 16 >= 8; - int color = satisfyState == 1 ? (flicker ? 0xBC75FF : 0x915BC6) - : satisfyState == 2 ? 0x85E59B : (flicker ? 0x7783A8 : 0x687291); + boolean success = connection.successTracker() + .booleanValue(); - if (effect) - color = satisfyState != 0 ? 0xEAF2EC : 0xE5654B; + int color = behaviour.promisedSatisfied ? (flicker ? 0xBC75FF : 0x915BC6) + : behaviour.satisfied ? 0x85E59B : (flicker ? 0x7783A8 : 0x687291); + yOffset = behaviour.promisedSatisfied ? 1 : behaviour.satisfied ? 0 : 2; - Pointing currentDirection = fromSide; - BlockPos currentPos = fromPos; - BlockPos targetPos = toPos.relative(FactoryPanelBlock.getDirection(blockState, toSide)); + if (glow > 0) { + color = Color.mixColors(color, success ? 0xEAF2EC : 0xE5654B, glow); + if (!behaviour.satisfied && !behaviour.promisedSatisfied) + yOffset += (success ? 1 : 2) * glow; + } - for (int i = 0; i < 100; i++) { - BlockPos nextPos = currentPos.relative(FactoryPanelBlock.getDirection(blockState, currentDirection)); + float currentX = 0; + float currentZ = 0; - Vec3 fromOffset = Vec3.atLowerCornerOf(currentPos) - .add(offset); - Vec3 toOffset = Vec3.atLowerCornerOf(nextPos) - .add(offset); + for (int i = 0; i < path.size(); i++) { + Direction direction = path.get(i); - Pair> key = Pair.of(currentPos.hashCode() + 13 * nextPos.hashCode(), - Pair.of(effect, effect ? satisfyState != 0 : true)); - - CatnipClient.OUTLINER.showLine(key, fromOffset, toOffset) - .lineWidth(effect ? (satisfyState != 0 ? 3f / 32f : 3.5f / 32f) : 2 / 32f) - .colored(color); - - if (currentPos.equals(targetPos)) - break; - - currentPos = nextPos; - - if (currentPos.equals(targetPos)) { - currentDirection = Pointing.values()[(toSide.ordinal() + 2) % 4]; - continue; - } - - for (Pointing p : Pointing.values()) { - if (p != currentDirection && Math.abs(p.ordinal() - currentDirection.ordinal()) % 2 == 0) - continue; - if (currentPos.relative(FactoryPanelBlock.getDirection(blockState, p)) - .distManhattan(targetPos) < currentPos - .relative(FactoryPanelBlock.getDirection(blockState, currentDirection)) - .distManhattan(targetPos)) - currentDirection = p; - } + currentX += direction.getStepX() * .5; + currentZ += direction.getStepZ() * .5; + CachedBuffers + .partial((i == 0 ? AllPartialModels.FACTORY_PANEL_ARROWS : AllPartialModels.FACTORY_PANEL_LINES) + .get(direction.getOpposite()), blockState) + .rotateCentered(yRot, Direction.UP) + .rotateCentered(xRot, Direction.EAST) + .rotateCentered(Mth.PI, Direction.UP) + .translate(behaviour.slot.xOffset * .5 + .25, 0, behaviour.slot.yOffset * .5 + .25) + .translate(currentX, (yOffset + (direction.get2DDataValue() % 2) * 0.125f) / 512f, currentZ) +// .nudge(behaviour.hashCode()) + .color(color) + .light(light) + .overlay(overlay) + .renderInto(ms, buffer.getBuffer(RenderType.cutoutMipped())); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelSlotPositioning.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelSlotPositioning.java new file mode 100644 index 0000000000..d788c12798 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelSlotPositioning.java @@ -0,0 +1,54 @@ +package com.simibubi.create.content.logistics.factoryBoard; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBlock.PanelSlot; +import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform; + +import dev.engine_room.flywheel.lib.transform.TransformStack; +import net.createmod.catnip.utility.VecHelper; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Direction.Axis; +import net.minecraft.util.Mth; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; + +class FactoryPanelSlotPositioning extends ValueBoxTransform { + + private PanelSlot slot; + + public FactoryPanelSlotPositioning(PanelSlot slot) { + this.slot = slot; + } + + @Override + public Vec3 getLocalOffset(LevelAccessor level, BlockPos pos, BlockState state) { + Vec3 vec = new Vec3(.25 + slot.xOffset * .5, 1.5 / 16f, .25 + slot.yOffset * .5); + vec = VecHelper.rotateCentered(vec, 180, Axis.Y); + vec = VecHelper.rotateCentered(vec, Mth.RAD_TO_DEG * FactoryPanelBlock.getXRot(state) + 90, Axis.X); + vec = VecHelper.rotateCentered(vec, Mth.RAD_TO_DEG * FactoryPanelBlock.getYRot(state), Axis.Y); + return vec; + } + + @Override + public boolean testHit(LevelAccessor level, BlockPos pos, BlockState state, Vec3 localHit) { + Vec3 offset = getLocalOffset(level, pos, state); + if (offset == null) + return false; + return localHit.distanceTo(offset) < scale / 2; + } + + @Override + public float getScale() { + return super.getScale(); + } + + @Override + public void rotate(LevelAccessor level, BlockPos pos, BlockState state, PoseStack ms) { + TransformStack.of(ms) + .rotate(FactoryPanelBlock.getYRot(state) + Mth.PI, Direction.UP) + .rotate(-FactoryPanelBlock.getXRot(state), Direction.EAST); + } + +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBox.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBox.java index c3b82b7450..27295361cc 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBox.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBox.java @@ -3,7 +3,6 @@ package com.simibubi.create.foundation.blockEntity.behaviour; import java.lang.ref.WeakReference; import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.math.Axis; import com.simibubi.create.content.logistics.filter.FilterItem; import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform.Sided; import com.simibubi.create.foundation.blockEntity.behaviour.scrollValue.INamedIconOptions; @@ -21,7 +20,6 @@ import net.minecraft.client.resources.model.BakedModel; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; -import net.minecraft.util.Mth; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.state.BlockState; @@ -38,7 +36,6 @@ public class ValueBox extends ChasingAABBOutline { public int overrideColor = -1; public boolean isPassive; - public boolean isDiamond; protected ValueBoxTransform transform; @@ -98,8 +95,6 @@ public class ValueBox extends ChasingAABBOutline { if (!isPassive) { ms.pushPose(); ms.scale(-2.01f, -2.01f, 2.01f); - if (isDiamond) - ms.mulPose(Axis.ZP.rotation(Mth.PI / 4f)); ms.translate(-8 / 16.0, -8 / 16.0, -.5 / 16.0); getOutline().render(ms, buffer, 0xffffff); ms.popPose(); diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringBehaviour.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringBehaviour.java index 9b114ed9c7..e6a40f6a18 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringBehaviour.java @@ -63,8 +63,6 @@ public class FilteringBehaviour extends BlockEntityBehaviour implements ValueSet boolean recipeFilter; boolean fluidFilter; - - protected boolean diamondShape; public FilteringBehaviour(SmartBlockEntity be, ValueBoxTransform slot) { super(be); @@ -80,7 +78,6 @@ public class FilteringBehaviour extends BlockEntityBehaviour implements ValueSet recipeFilter = false; fluidFilter = false; upTo = true; - diamondShape = false; } @Override @@ -266,12 +263,13 @@ public class FilteringBehaviour extends BlockEntityBehaviour implements ValueSet ItemStack filter = getFilter(hitResult.getDirection()); int maxAmount = (filter.getItem() instanceof FilterItem) ? 64 : filter.getMaxStackSize(); return new ValueSettingsBoard(CreateLang.translateDirect("logistics.filter.extracted_amount"), maxAmount, 16, - CreateLang.translatedOptions("logistics.filter", "up_to", "exactly"), + CreateLang.translatedOptions("logistics.filter", "up_to", "exactly"), new ValueSettingsFormatter(this::formatValue)); } public MutableComponent formatValue(ValueSettings value) { - if (value.row() == 0 && value.value() == filter.item().getMaxStackSize()) + if (value.row() == 0 && value.value() == filter.item() + .getMaxStackSize()) return CreateLang.translateDirect("logistics.filter.any_amount_short"); return Components.literal(((value.row() == 0) ? "\u2264" : "=") + Math.max(1, value.value())); } @@ -326,7 +324,12 @@ public class FilteringBehaviour extends BlockEntityBehaviour implements ValueSet return CreateLang.translateDirect( recipeFilter ? "logistics.recipe_filter" : fluidFilter ? "logistics.fluid_filter" : "logistics.filter"); } - + + public MutableComponent getTip() { + return CreateLang + .translateDirect(filter.isEmpty() ? "logistics.filter.click_to_set" : "logistics.filter.click_to_replace"); + } + public MutableComponent getCountLabelForValueBox() { return Components.literal(showCount ? upTo && filter.item() .getMaxStackSize() == count ? "*" : String.valueOf(count) : ""); @@ -395,21 +398,21 @@ public class FilteringBehaviour extends BlockEntityBehaviour implements ValueSet return setFilter(side, copied); } - + public boolean isRecipeFilter() { return recipeFilter; } - + @Override public boolean bypassesInput(ItemStack mainhandItem) { - return AllItems.FACTORY_PANEL_CONNECTOR.isIn(mainhandItem); + return false; } - + @Override public int netId() { return 1; } - + public float getRenderDistance() { return AllConfigs.client().filterItemRenderDistance.getF(); } diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringRenderer.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringRenderer.java index 4c6f0736ce..584d0fe37b 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringRenderer.java @@ -16,7 +16,6 @@ import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxRenderer; import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform; import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform.Sided; import com.simibubi.create.foundation.utility.CreateLang; -import com.simibubi.create.infrastructure.config.AllConfigs; import net.createmod.catnip.CatnipClient; import net.createmod.catnip.utility.Iterate; @@ -52,55 +51,60 @@ public class FilteringRenderer { BlockPos pos = result.getBlockPos(); BlockState state = world.getBlockState(pos); - FilteringBehaviour behaviour = BlockEntityBehaviour.get(world, pos, FilteringBehaviour.TYPE); if (mc.player.isShiftKeyDown()) return; + if (!(world.getBlockEntity(pos) instanceof SmartBlockEntity sbe)) + return; ItemStack mainhandItem = mc.player.getItemInHand(InteractionHand.MAIN_HAND); - if (behaviour == null) - return; - if (behaviour instanceof SidedFilteringBehaviour) { - behaviour = ((SidedFilteringBehaviour) behaviour).get(result.getDirection()); - if (behaviour == null) - return; + + for (BlockEntityBehaviour b : sbe.getAllBehaviours()) { + if (!(b instanceof FilteringBehaviour behaviour)) + continue; + + if (behaviour instanceof SidedFilteringBehaviour) { + behaviour = ((SidedFilteringBehaviour) behaviour).get(result.getDirection()); + if (behaviour == null) + continue; + } + + if (!behaviour.isActive()) + continue; + if (behaviour.slotPositioning instanceof ValueBoxTransform.Sided) + ((Sided) behaviour.slotPositioning).fromSide(result.getDirection()); + if (!behaviour.slotPositioning.shouldRender(world, pos, state)) + continue; + + ItemStack filter = behaviour.getFilter(); + boolean isFilterSlotted = filter.getItem() instanceof FilterItem; + boolean showCount = behaviour.isCountVisible(); + Component label = behaviour.getLabel(); + boolean hit = behaviour.slotPositioning.testHit(world, pos, state, target.getLocation() + .subtract(Vec3.atLowerCornerOf(pos))); + + AABB emptyBB = new AABB(Vec3.ZERO, Vec3.ZERO); + AABB bb = isFilterSlotted ? emptyBB.inflate(.45f, .31f, .2f) : emptyBB.inflate(.25f); + + ValueBox box = new ItemValueBox(label, bb, pos, filter, behaviour.getCountLabelForValueBox()); + box.passive(!hit || behaviour.bypassesInput(mainhandItem)); + + CatnipClient.OUTLINER + .showOutline(Pair.of("filter" + behaviour.netId(), pos), box.transform(behaviour.slotPositioning)) + .lineWidth(1 / 64f) + .withFaceTexture(hit ? AllSpecialTextures.THIN_CHECKERED : null) + .highlightFace(result.getDirection()); + + if (!hit) + continue; + + List tip = new ArrayList<>(); + tip.add(label.copy()); + tip.add(behaviour.getTip()); + if (showCount) + tip.add(CreateLang.translateDirect("logistics.filter.hold_to_set_amount")); + + CreateClient.VALUE_SETTINGS_HANDLER.showHoverTip(tip); } - if (!behaviour.isActive()) - return; - if (behaviour.slotPositioning instanceof ValueBoxTransform.Sided) - ((Sided) behaviour.slotPositioning).fromSide(result.getDirection()); - if (!behaviour.slotPositioning.shouldRender(world, pos, state)) - return; - - ItemStack filter = behaviour.getFilter(); - boolean isFilterSlotted = filter.getItem() instanceof FilterItem; - boolean showCount = behaviour.isCountVisible(); - Component label = behaviour.getLabel(); - boolean hit = behaviour.slotPositioning.testHit(world, pos, state, target.getLocation() - .subtract(Vec3.atLowerCornerOf(pos))); - - AABB emptyBB = new AABB(Vec3.ZERO, Vec3.ZERO); - AABB bb = isFilterSlotted ? emptyBB.inflate(.45f, .31f, .2f) : emptyBB.inflate(.25f); - - ValueBox box = new ItemValueBox(label, bb, pos, filter, behaviour.getCountLabelForValueBox()); - box.passive(!hit || behaviour.bypassesInput(mainhandItem)); - box.isDiamond = behaviour.diamondShape; - - CatnipClient.OUTLINER.showOutline(Pair.of("filter", pos), box.transform(behaviour.slotPositioning)) - .lineWidth(1 / 64f) - .withFaceTexture(hit ? AllSpecialTextures.THIN_CHECKERED : null) - .highlightFace(result.getDirection()); - - if (!hit) - return; - - List tip = new ArrayList<>(); - tip.add(label.copy()); - tip.add(CreateLang - .translateDirect(filter.isEmpty() ? "logistics.filter.click_to_set" : "logistics.filter.click_to_replace")); - if (showCount) - tip.add(CreateLang.translateDirect("logistics.filter.hold_to_set_amount")); - - CreateClient.VALUE_SETTINGS_HANDLER.showHoverTip(tip); } public static void renderOnBlockEntity(SmartBlockEntity be, float partialTicks, PoseStack ms, @@ -111,58 +115,59 @@ public class FilteringRenderer { Level level = be.getLevel(); BlockPos blockPos = be.getBlockPos(); - - FilteringBehaviour behaviour = be.getBehaviour(FilteringBehaviour.TYPE); - if (behaviour == null) - return; - - if (!be.isVirtual()) { - Entity cameraEntity = Minecraft.getInstance().cameraEntity; - if (cameraEntity != null && level == cameraEntity.level()) { - float max = behaviour.getRenderDistance(); - if (cameraEntity.position() - .distanceToSqr(VecHelper.getCenterOf(blockPos)) > (max * max)) { - return; + + for (BlockEntityBehaviour b : be.getAllBehaviours()) { + if (!(b instanceof FilteringBehaviour behaviour)) + continue; + + if (!be.isVirtual()) { + Entity cameraEntity = Minecraft.getInstance().cameraEntity; + if (cameraEntity != null && level == cameraEntity.level()) { + float max = behaviour.getRenderDistance(); + if (cameraEntity.position() + .distanceToSqr(VecHelper.getCenterOf(blockPos)) > (max * max)) { + continue; + } } } - } - if (!behaviour.isActive()) - return; - if (behaviour.getFilter() - .isEmpty() && !(behaviour instanceof SidedFilteringBehaviour)) - return; + if (!behaviour.isActive()) + continue; + if (behaviour.getFilter() + .isEmpty() && !(behaviour instanceof SidedFilteringBehaviour)) + continue; - ValueBoxTransform slotPositioning = behaviour.slotPositioning; - BlockState blockState = be.getBlockState(); + ValueBoxTransform slotPositioning = behaviour.slotPositioning; + BlockState blockState = be.getBlockState(); - if (slotPositioning instanceof ValueBoxTransform.Sided) { - ValueBoxTransform.Sided sided = (ValueBoxTransform.Sided) slotPositioning; - Direction side = sided.getSide(); - for (Direction d : Iterate.directions) { - ItemStack filter = behaviour.getFilter(d); - if (filter.isEmpty()) - continue; + if (slotPositioning instanceof ValueBoxTransform.Sided) { + ValueBoxTransform.Sided sided = (ValueBoxTransform.Sided) slotPositioning; + Direction side = sided.getSide(); + for (Direction d : Iterate.directions) { + ItemStack filter = behaviour.getFilter(d); + if (filter.isEmpty()) + continue; - sided.fromSide(d); - if (!slotPositioning.shouldRender(level, blockPos, blockState)) - continue; + sided.fromSide(d); + if (!slotPositioning.shouldRender(level, blockPos, blockState)) + continue; + ms.pushPose(); + slotPositioning.transform(level, blockPos, blockState, ms); + if (AllBlocks.CONTRAPTION_CONTROLS.has(blockState)) + ValueBoxRenderer.renderFlatItemIntoValueBox(filter, ms, buffer, light, overlay); + else + ValueBoxRenderer.renderItemIntoValueBox(filter, ms, buffer, light, overlay); + ms.popPose(); + } + sided.fromSide(side); + continue; + } else if (slotPositioning.shouldRender(level, blockPos, blockState)) { ms.pushPose(); slotPositioning.transform(level, blockPos, blockState, ms); - if (AllBlocks.CONTRAPTION_CONTROLS.has(blockState)) - ValueBoxRenderer.renderFlatItemIntoValueBox(filter, ms, buffer, light, overlay); - else - ValueBoxRenderer.renderItemIntoValueBox(filter, ms, buffer, light, overlay); + ValueBoxRenderer.renderItemIntoValueBox(behaviour.getFilter(), ms, buffer, light, overlay); ms.popPose(); } - sided.fromSide(side); - return; - } else if (slotPositioning.shouldRender(level, blockPos, blockState)) { - ms.pushPose(); - slotPositioning.transform(level, blockPos, blockState, ms); - ValueBoxRenderer.renderItemIntoValueBox(behaviour.getFilter(), ms, buffer, light, overlay); - ms.popPose(); } } diff --git a/src/main/resources/assets/create/models/block/factory_board/block.bbmodel b/src/main/resources/assets/create/models/block/factory_board/block.bbmodel deleted file mode 100644 index a658ec3c93..0000000000 --- a/src/main/resources/assets/create/models/block/factory_board/block.bbmodel +++ /dev/null @@ -1 +0,0 @@ -{"meta":{"format_version":"4.10","model_format":"java_block","box_uv":false},"name":"block","parent":"create:block/large_wheels","ambientocclusion":true,"front_gui_light":false,"visible_box":[1,1,0],"variable_placeholders":"","variable_placeholder_buttons":[],"unhandled_root_fields":{},"resolution":{"width":16,"height":16},"elements":[{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[0,0,3],"to":[16,16,6],"autouv":0,"color":1,"origin":[0,0,6],"faces":{"north":{"uv":[0,0,16,16],"texture":6},"east":{"uv":[13,0,16,16],"texture":2},"south":{"uv":[0,0,16,16],"texture":5},"west":{"uv":[0,0,3,16],"texture":2},"up":{"uv":[0,0,3,16],"rotation":90,"texture":4},"down":{"uv":[7,0,10,16],"rotation":90,"texture":4}},"type":"cube","uuid":"f3e6ac4a-ae8e-b4ec-c08a-72c0aff87260"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[0,0,10],"to":[16,16,13],"autouv":0,"color":1,"origin":[0,0,6],"faces":{"north":{"uv":[0,0,16,16],"texture":5},"east":{"uv":[3,0,6,16],"texture":2},"south":{"uv":[0,0,16,16],"texture":1},"west":{"uv":[10,0,13,16],"texture":2},"up":{"uv":[7,0,10,16],"rotation":90,"texture":4},"down":{"uv":[0,0,3,16],"rotation":90,"texture":4}},"type":"cube","uuid":"a864f9d2-8b98-0a6b-5905-068e12a4ed4a"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[0,0,6],"to":[16,16,10],"autouv":0,"color":8,"origin":[0,0,0],"faces":{"north":{"uv":[0,0,0,0],"texture":null},"east":{"uv":[6,0,10,16],"texture":2},"south":{"uv":[0,0,0,0],"texture":null},"west":{"uv":[6,0,10,16],"texture":2},"up":{"uv":[3,0,7,16],"rotation":90,"texture":4},"down":{"uv":[3,0,7,16],"rotation":90,"texture":4}},"type":"cube","uuid":"8bfa9753-ea73-56a2-f9cb-e6d0607b1eeb"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[15.95,0.05,6],"to":[0.05,15.95,10],"autouv":0,"color":9,"origin":[0,0,0],"faces":{"north":{"uv":[0,0,0,0],"texture":null},"east":{"uv":[6,0,10,16],"texture":2},"south":{"uv":[0,0,0,0],"texture":null},"west":{"uv":[6,0,10,16],"texture":2},"up":{"uv":[3,0,7,16],"rotation":90,"texture":4},"down":{"uv":[3,0,7,16],"rotation":90,"texture":4}},"type":"cube","uuid":"1ab06a32-ddca-3cc5-6184-730fb810df9e"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[16,0,3],"to":[32,16,6],"autouv":0,"color":1,"origin":[16,0,6],"faces":{"north":{"uv":[0,0,16,16],"texture":6},"east":{"uv":[9,0,12,16],"texture":2},"south":{"uv":[0,0,16,16],"texture":5},"west":{"uv":[0,0,3,16],"texture":2},"up":{"uv":[0,0,3,16],"rotation":90,"texture":4},"down":{"uv":[7,0,10,16],"rotation":90,"texture":4}},"type":"cube","uuid":"0ffa2507-5119-81f8-7c2f-8b06672e9bc8"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[16,0,10],"to":[32,16,13],"autouv":0,"color":1,"origin":[16,0,6],"faces":{"north":{"uv":[0,0,16,16],"texture":5},"east":{"uv":[4,0,7,16],"texture":2},"south":{"uv":[0,0,16,16],"texture":1},"west":{"uv":[10,0,13,16],"texture":2},"up":{"uv":[7,0,10,16],"rotation":90,"texture":4},"down":{"uv":[0,0,3,16],"rotation":90,"texture":4}},"type":"cube","uuid":"79acb8f9-546a-acbc-06bd-0db7adf4562b"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[16,0,6],"to":[32,16,10],"autouv":0,"color":8,"origin":[16,0,0],"faces":{"north":{"uv":[0,0,0,0],"texture":null},"east":{"uv":[6,0,10,16],"texture":2},"south":{"uv":[0,0,0,0],"texture":null},"west":{"uv":[6,0,10,16],"texture":2},"up":{"uv":[3,0,7,16],"rotation":90,"texture":4},"down":{"uv":[3,0,7,16],"rotation":90,"texture":4}},"type":"cube","uuid":"b8995380-5649-968b-702a-c45125c8028f"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[31.950000000000003,0.05,6],"to":[16.05,15.95,10],"autouv":0,"color":9,"origin":[16,0,0],"faces":{"north":{"uv":[0,0,0,0],"texture":null},"east":{"uv":[6,0,10,16],"texture":2},"south":{"uv":[0,0,0,0],"texture":null},"west":{"uv":[6,0,10,16],"texture":2},"up":{"uv":[3,0,7,16],"rotation":90,"texture":4},"down":{"uv":[3,0,7,16],"rotation":90,"texture":4}},"type":"cube","uuid":"1c8efa84-aa71-c7d9-f0d9-c4bed393985b"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[0,16,3],"to":[16,32,6],"autouv":0,"color":1,"origin":[0,16,6],"faces":{"north":{"uv":[0,0,16,16],"texture":6},"east":{"uv":[13,0,16,16],"texture":2},"south":{"uv":[0,0,16,16],"texture":5},"west":{"uv":[0,0,3,16],"texture":2},"up":{"uv":[0,0,3,16],"rotation":90,"texture":4},"down":{"uv":[7,0,10,16],"rotation":90,"texture":4}},"type":"cube","uuid":"b1792b7b-bd79-d27e-82d7-0ce76650122f"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[0,16,10],"to":[16,32,13],"autouv":0,"color":1,"origin":[0,16,6],"faces":{"north":{"uv":[0,0,16,16],"texture":5},"east":{"uv":[3,0,6,16],"texture":2},"south":{"uv":[0,0,16,16],"texture":1},"west":{"uv":[10,0,13,16],"texture":2},"up":{"uv":[7,0,10,16],"rotation":90,"texture":4},"down":{"uv":[0,0,3,16],"rotation":90,"texture":4}},"type":"cube","uuid":"248a3ef9-643f-bfdf-ed3f-277a68c1e31f"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[0,16,6],"to":[16,32,10],"autouv":0,"color":8,"origin":[0,16,0],"faces":{"north":{"uv":[0,0,0,0],"texture":null},"east":{"uv":[6,0,10,16],"texture":2},"south":{"uv":[0,0,0,0],"texture":null},"west":{"uv":[6,0,10,16],"texture":2},"up":{"uv":[3,0,7,16],"rotation":90,"texture":4},"down":{"uv":[3,0,7,16],"rotation":90,"texture":4}},"type":"cube","uuid":"13dd54f8-ca6f-19ed-e70b-b325f6e7c88d"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[15.95,16.05,6],"to":[0.05,31.950000000000003,10],"autouv":0,"color":9,"origin":[0,16,0],"faces":{"north":{"uv":[0,0,0,0],"texture":null},"east":{"uv":[6,0,10,16],"texture":2},"south":{"uv":[0,0,0,0],"texture":null},"west":{"uv":[6,0,10,16],"texture":2},"up":{"uv":[3,0,7,16],"rotation":90,"texture":4},"down":{"uv":[3,0,7,16],"rotation":90,"texture":4}},"type":"cube","uuid":"cb2a5eec-1ee0-f954-1a1f-f611aa48d07a"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[16,16,3],"to":[32,32,6],"autouv":0,"color":1,"origin":[16,16,6],"faces":{"north":{"uv":[0,0,16,16],"texture":6},"east":{"uv":[9,0,12,16],"texture":6},"south":{"uv":[0,0,16,16],"texture":5},"west":{"uv":[0,0,3,16],"texture":2},"up":{"uv":[0,0,3,16],"rotation":90,"texture":4},"down":{"uv":[7,0,10,16],"rotation":90,"texture":4}},"type":"cube","uuid":"94f28cc4-aeef-2708-2953-bf1c6ec85c3b"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[16,16,10],"to":[32,32,13],"autouv":0,"color":1,"origin":[16,16,6],"faces":{"north":{"uv":[0,0,16,16],"texture":5},"east":{"uv":[2,0,5,16],"texture":6},"south":{"uv":[0,0,16,16],"texture":1},"west":{"uv":[10,0,13,16],"texture":2},"up":{"uv":[7,0,10,16],"rotation":90,"texture":4},"down":{"uv":[0,0,3,16],"rotation":90,"texture":4}},"type":"cube","uuid":"d55a2435-fced-d6da-06a7-6a3ae6c11144"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[16,16,6],"to":[32,32,10],"autouv":0,"color":8,"origin":[16,16,0],"faces":{"north":{"uv":[0,0,0,0],"texture":null},"east":{"uv":[5,0,9,16],"texture":6},"south":{"uv":[0,0,0,0],"texture":null},"west":{"uv":[6,0,10,16],"texture":2},"up":{"uv":[3,0,7,16],"rotation":90,"texture":4},"down":{"uv":[3,0,7,16],"rotation":90,"texture":4}},"type":"cube","uuid":"1b50c803-07bd-b324-dc37-d0e3bdd41e7a"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[31.95,16.05,6],"to":[16.05,31.950000000000003,10],"autouv":0,"color":9,"origin":[16,16,0],"faces":{"north":{"uv":[0,0,0,0],"texture":null},"east":{"uv":[6,0,10,16],"texture":2},"south":{"uv":[0,0,0,0],"texture":null},"west":{"uv":[6,0,10,16],"texture":2},"up":{"uv":[3,0,7,16],"rotation":90,"texture":4},"down":{"uv":[3,0,7,16],"rotation":90,"texture":4}},"type":"cube","uuid":"5b6aff94-5c3f-5dcf-db00-782eafc22986"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-16,16,3],"to":[0,32,6],"autouv":0,"color":1,"origin":[-16,16,6],"faces":{"north":{"uv":[0,0,16,16],"texture":6},"east":{"uv":[13,0,16,16],"texture":2},"south":{"uv":[0,0,16,16],"texture":5},"west":{"uv":[0,0,3,16],"texture":2},"up":{"uv":[0,0,3,16],"rotation":90,"texture":4},"down":{"uv":[7,0,10,16],"rotation":90,"texture":4}},"type":"cube","uuid":"95ceca62-28f7-0a06-296c-3e3abeb80f66"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-16,16,10],"to":[0,32,13],"autouv":0,"color":1,"origin":[-16,16,6],"faces":{"north":{"uv":[0,0,16,16],"texture":5},"east":{"uv":[3,0,6,16],"texture":2},"south":{"uv":[0,0,16,16],"texture":1},"west":{"uv":[10,0,13,16],"texture":2},"up":{"uv":[7,0,10,16],"rotation":90,"texture":4},"down":{"uv":[0,0,3,16],"rotation":90,"texture":4}},"type":"cube","uuid":"45f0e7a2-258c-31f8-2f98-f1fbf01bd607"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-16,16,6],"to":[0,32,10],"autouv":0,"color":8,"origin":[-16,16,0],"faces":{"north":{"uv":[0,0,0,0],"texture":null},"east":{"uv":[6,0,10,16],"texture":2},"south":{"uv":[0,0,0,0],"texture":null},"west":{"uv":[6,0,10,16],"texture":2},"up":{"uv":[3,0,7,16],"rotation":90,"texture":4},"down":{"uv":[3,0,7,16],"rotation":90,"texture":4}},"type":"cube","uuid":"78e6ba39-615d-19a9-f608-d2e16fed3ebe"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-0.05000000000000071,16.05,6],"to":[-15.95,31.950000000000003,10],"autouv":0,"color":9,"origin":[-16,16,0],"faces":{"north":{"uv":[0,0,0,0],"texture":null},"east":{"uv":[6,0,10,16],"texture":2},"south":{"uv":[0,0,0,0],"texture":null},"west":{"uv":[6,0,10,16],"texture":2},"up":{"uv":[3,0,7,16],"rotation":90,"texture":4},"down":{"uv":[3,0,7,16],"rotation":90,"texture":4}},"type":"cube","uuid":"0c46257c-d3c8-6d34-b3bb-b072afda5de3"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-16,0,3],"to":[0,16,6],"autouv":0,"color":1,"origin":[-16,0,6],"faces":{"north":{"uv":[0,0,16,16],"texture":6},"east":{"uv":[13,0,16,16],"texture":2},"south":{"uv":[0,0,16,16],"texture":5},"west":{"uv":[0,0,3,16],"texture":2},"up":{"uv":[0,0,3,16],"rotation":90,"texture":4},"down":{"uv":[7,0,10,16],"rotation":90,"texture":4}},"type":"cube","uuid":"6abd6abb-73fa-6522-3fb6-816a2e21621d"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-16,0,10],"to":[0,16,13],"autouv":0,"color":1,"origin":[-16,0,6],"faces":{"north":{"uv":[0,0,16,16],"texture":5},"east":{"uv":[3,0,6,16],"texture":2},"south":{"uv":[0,0,16,16],"texture":1},"west":{"uv":[10,0,13,16],"texture":2},"up":{"uv":[7,0,10,16],"rotation":90,"texture":4},"down":{"uv":[0,0,3,16],"rotation":90,"texture":4}},"type":"cube","uuid":"db5c3c11-192d-ece3-8a9f-7063d170e18a"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-16,0,6],"to":[0,16,10],"autouv":0,"color":8,"origin":[-16,0,0],"faces":{"north":{"uv":[0,0,0,0],"texture":null},"east":{"uv":[6,0,10,16],"texture":2},"south":{"uv":[0,0,0,0],"texture":null},"west":{"uv":[6,0,10,16],"texture":2},"up":{"uv":[3,0,7,16],"rotation":90,"texture":4},"down":{"uv":[3,0,7,16],"rotation":90,"texture":4}},"type":"cube","uuid":"8912c0cc-e2ce-12bb-00ac-c52960b58107"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-0.05000000000000071,0.05000000000000071,6],"to":[-15.95,15.950000000000003,10],"autouv":0,"color":9,"origin":[-16,0,0],"faces":{"north":{"uv":[0,0,0,0],"texture":null},"east":{"uv":[6,0,10,16],"texture":2},"south":{"uv":[0,0,0,0],"texture":null},"west":{"uv":[6,0,10,16],"texture":2},"up":{"uv":[3,0,7,16],"rotation":90,"texture":4},"down":{"uv":[3,0,7,16],"rotation":90,"texture":4}},"type":"cube","uuid":"d0b8b748-62f4-8b5f-3e92-b3964f0ba6fa"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[0,-16,0],"to":[16,0,16],"autouv":1,"color":5,"origin":[0,-16,0],"faces":{"north":{"uv":[0,0,16,16],"texture":3},"east":{"uv":[0,0,16,16],"texture":3},"south":{"uv":[0,0,16,16],"texture":3},"west":{"uv":[0,0,16,16],"texture":3},"up":{"uv":[0,0,16,16],"texture":3},"down":{"uv":[0,0,16,16],"texture":3}},"type":"cube","uuid":"709fa87e-af5c-f7ba-b040-dd274f0cb23b"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[16,-16,0],"to":[32,0,16],"autouv":1,"color":5,"origin":[16,-16,0],"faces":{"north":{"uv":[0,0,16,16],"texture":3},"east":{"uv":[0,0,16,16],"texture":3},"south":{"uv":[0,0,16,16],"texture":3},"west":{"uv":[0,0,16,16],"texture":3},"up":{"uv":[0,0,16,16],"texture":3},"down":{"uv":[0,0,16,16],"texture":3}},"type":"cube","uuid":"da2fa599-f38c-f451-2628-9b39380480dd"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-16,-16,0],"to":[0,0,16],"autouv":1,"color":5,"origin":[-16,-16,0],"faces":{"north":{"uv":[0,0,16,16],"texture":3},"east":{"uv":[0,0,16,16],"texture":3},"south":{"uv":[0,0,16,16],"texture":3},"west":{"uv":[0,0,16,16],"texture":3},"up":{"uv":[0,0,16,16],"texture":3},"down":{"uv":[0,0,16,16],"texture":3}},"type":"cube","uuid":"5851f75e-2bf6-395e-f0b1-5b84ccb2698d"},{"name":"box","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[34,-15,2],"to":[46,-5,14],"autouv":0,"color":2,"rotation":[0,45,0],"origin":[40,-10,8],"faces":{"north":{"uv":[3,5.25,6,7.75],"texture":7},"east":{"uv":[3,0.25,6,2.75],"texture":7},"south":{"uv":[6,5.25,3,7.75],"texture":7},"west":{"uv":[3,2.75,6,5.25],"texture":7},"up":{"uv":[3,7.75,6,10.75],"rotation":180,"texture":7},"down":{"uv":[3,10.75,6,13.75],"rotation":270,"texture":7}},"type":"cube","uuid":"f168b2eb-aa48-4997-84ff-7052c1d6d492"},{"name":"box","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[33,-5,3],"to":[43,3,13],"autouv":0,"color":2,"origin":[37,-1,8],"faces":{"north":{"uv":[0.25,4.25,2.75,6.25],"texture":7},"east":{"uv":[0.25,0.25,2.75,2.25],"texture":7},"south":{"uv":[2.75,4.25,0.25,6.25],"texture":7},"west":{"uv":[0.25,2.25,2.75,4.25],"texture":7},"up":{"uv":[0.25,6.25,2.75,8.75],"rotation":180,"texture":7},"down":{"uv":[0.25,8.75,2.75,11.25],"rotation":180,"texture":7}},"type":"cube","uuid":"12fa5088-3f91-f4f9-10a1-2af3a696c0fe"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[1,17,2],"to":[7,23,4],"autouv":1,"color":9,"origin":[0,16,2],"faces":{"north":{"uv":[0,0,6,6]},"east":{"uv":[0,0,2,6]},"south":{"uv":[0,0,6,6]},"west":{"uv":[0,0,2,6]},"up":{"uv":[0,0,6,2]},"down":{"uv":[0,0,6,2]}},"type":"cube","uuid":"7d56ba64-5525-dff7-3833-5b071bcdd163"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[0,16,2.9],"to":[8,24,4],"autouv":1,"color":5,"origin":[0,16,2],"faces":{"north":{"uv":[0,0,8,8],"texture":3},"east":{"uv":[0,0,1.1,8],"texture":3},"south":{"uv":[0,0,8,8],"texture":3},"west":{"uv":[0,0,1.1,8],"texture":3},"up":{"uv":[0,0,8,1.1],"texture":3},"down":{"uv":[0,0,8,1.1],"texture":3}},"type":"cube","uuid":"23cb6d79-5fa8-9450-1d9e-62e00a93283f"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[16,24,2.9],"to":[24,32,4],"autouv":1,"color":5,"origin":[16,24,2],"faces":{"north":{"uv":[0,0,8,8],"texture":3},"east":{"uv":[0,0,1.1,8],"texture":3},"south":{"uv":[0,0,8,8],"texture":3},"west":{"uv":[0,0,1.1,8],"texture":3},"up":{"uv":[0,0,8,1.1],"texture":3},"down":{"uv":[0,0,8,1.1],"texture":3}},"type":"cube","uuid":"e416b457-1c0b-74dc-19d7-209c35c9722c"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[17,25,2],"to":[23,31,4],"autouv":1,"color":9,"origin":[16,24,2],"faces":{"north":{"uv":[0,0,6,6]},"east":{"uv":[0,0,2,6]},"south":{"uv":[0,0,6,6]},"west":{"uv":[0,0,2,6]},"up":{"uv":[0,0,6,2]},"down":{"uv":[0,0,6,2]}},"type":"cube","uuid":"3ae91df1-dc58-bbb5-f466-4ddef96b1dc2"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[16,16,2.9],"to":[24,24,4],"autouv":1,"color":5,"origin":[16,16,2],"faces":{"north":{"uv":[0,0,8,8],"texture":3},"east":{"uv":[0,0,1.1,8],"texture":3},"south":{"uv":[0,0,8,8],"texture":3},"west":{"uv":[0,0,1.1,8],"texture":3},"up":{"uv":[0,0,8,1.1],"texture":3},"down":{"uv":[0,0,8,1.1],"texture":3}},"type":"cube","uuid":"a9121026-2aed-a946-6011-79ad4712d797"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[17,17,2],"to":[23,23,4],"autouv":1,"color":9,"origin":[16,16,2],"faces":{"north":{"uv":[0,0,6,6]},"east":{"uv":[0,0,2,6]},"south":{"uv":[0,0,6,6]},"west":{"uv":[0,0,2,6]},"up":{"uv":[0,0,6,2]},"down":{"uv":[0,0,6,2]}},"type":"cube","uuid":"de77d797-3428-8af4-425d-cbec659e4317"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[24,8,2.9],"to":[32,16,4],"autouv":1,"color":5,"origin":[24,8,2],"faces":{"north":{"uv":[0,0,8,8],"texture":3},"east":{"uv":[0,0,1.1,8],"texture":3},"south":{"uv":[0,0,8,8],"texture":3},"west":{"uv":[0,0,1.1,8],"texture":3},"up":{"uv":[0,0,8,1.1],"texture":3},"down":{"uv":[0,0,8,1.1],"texture":3}},"type":"cube","uuid":"f3ad9cfa-e77c-28c8-5228-93b1fffad997"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[25,9,2],"to":[31,15,4],"autouv":1,"color":9,"origin":[24,8,2],"faces":{"north":{"uv":[0,0,6,6]},"east":{"uv":[0,0,2,6]},"south":{"uv":[0,0,6,6]},"west":{"uv":[0,0,2,6]},"up":{"uv":[0,0,6,2]},"down":{"uv":[0,0,6,2]}},"type":"cube","uuid":"37950a5b-d169-0c20-539e-e1d8d6928ead"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[0,8,2.9],"to":[8,16,4],"autouv":1,"color":5,"origin":[0,8,2],"faces":{"north":{"uv":[0,0,8,8],"texture":3},"east":{"uv":[0,0,1.1,8],"texture":3},"south":{"uv":[0,0,8,8],"texture":3},"west":{"uv":[0,0,1.1,8],"texture":3},"up":{"uv":[0,0,8,1.1],"texture":3},"down":{"uv":[0,0,8,1.1],"texture":3}},"type":"cube","uuid":"4ff5d83b-0db9-d185-6515-40b8f077d208"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[1,9,2],"to":[7,15,4],"autouv":1,"color":9,"origin":[0,8,2],"faces":{"north":{"uv":[0,0,6,6]},"east":{"uv":[0,0,2,6]},"south":{"uv":[0,0,6,6]},"west":{"uv":[0,0,2,6]},"up":{"uv":[0,0,6,2]},"down":{"uv":[0,0,6,2]}},"type":"cube","uuid":"0d335727-a5e5-0748-1f3d-3a6db0451681"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[7,11,2],"to":[25,12,4],"autouv":1,"color":5,"origin":[23,10,2],"faces":{"north":{"uv":[0,0,16,1]},"east":{"uv":[0,0,2,1]},"south":{"uv":[0,0,16,1]},"west":{"uv":[0,0,2,1]},"up":{"uv":[0,0,16,2]},"down":{"uv":[0,0,16,2]}},"type":"cube","uuid":"c8d0fded-9b71-948c-d423-6710a5d09b27"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[19,12,2],"to":[20,17,4],"autouv":1,"color":5,"origin":[22,13,2],"faces":{"north":{"uv":[0,0,1,5]},"east":{"uv":[0,0,2,5]},"south":{"uv":[0,0,1,5]},"west":{"uv":[0,0,2,5]},"up":{"uv":[0,0,1,2]},"down":{"uv":[0,0,1,2]}},"type":"cube","uuid":"abdd6b8c-b21f-9b63-20bf-5859ad115ee1"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[18,24,2],"to":[21,25,4],"autouv":1,"color":7,"origin":[22,21,2],"faces":{"north":{"uv":[0,0,3,1]},"east":{"uv":[0,0,2,1]},"south":{"uv":[0,0,3,1]},"west":{"uv":[0,0,2,1]},"up":{"uv":[0,0,3,2]},"down":{"uv":[0,0,3,2]}},"type":"cube","uuid":"80262d0c-962b-bf27-9189-1c28748c94b0"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[19,23,2],"to":[20,24,4],"autouv":1,"color":7,"origin":[22,20,2],"faces":{"north":{"uv":[0,0,1,1]},"east":{"uv":[0,0,2,1]},"south":{"uv":[0,0,1,1]},"west":{"uv":[0,0,2,1]},"up":{"uv":[0,0,1,2]},"down":{"uv":[0,0,1,2]}},"type":"cube","uuid":"d83fd3c5-c05b-5c85-a2df-465dfdbd2128"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[8,10,2],"to":[9,13,4],"autouv":1,"color":5,"origin":[11,10,2],"faces":{"north":{"uv":[0,0,1,3]},"east":{"uv":[0,0,2,3]},"south":{"uv":[0,0,1,3]},"west":{"uv":[0,0,2,3]},"up":{"uv":[0,0,1,2]},"down":{"uv":[0,0,1,2]}},"type":"cube","uuid":"5f637b44-5202-5970-8a1d-7a0f317bdbe6"},{"name":"Axis","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[3.4500000000000006,11.209999999999999,-1.0350000000000001],"to":[4.789999999999999,12.549999999999999,4.325],"autouv":0,"color":0,"origin":[1.4399999999999995,14.559999999999999,-1.0350000000000001],"faces":{"north":{"uv":[6,6,10,10],"rotation":180,"texture":12},"east":{"uv":[6,0,10,16],"rotation":270,"texture":11},"south":{"uv":[6,6,10,10],"texture":12},"west":{"uv":[6,0,10,16],"rotation":90,"texture":11},"up":{"uv":[6,0,10,16],"rotation":180,"texture":11},"down":{"uv":[6,0,10,16],"texture":11}},"type":"cube","uuid":"3b1f8416-fe8f-e0be-07b9-56efd5145e7b"},{"name":"Gear","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[1.1049999999999995,11.3775,1.1425],"to":[7.135,12.3825,2.1475],"autouv":0,"color":7,"origin":[1.4399999999999995,14.559999999999999,-1.0350000000000001],"faces":{"north":{"uv":[7,6,16,7.5],"rotation":180,"texture":13},"east":{"uv":[5,8,6.5,9.5],"rotation":270,"texture":13},"south":{"uv":[7,6,16,7.5],"texture":13},"west":{"uv":[5,8,6.5,9.5],"rotation":90,"texture":13},"up":{"uv":[7,8,16,9.5],"rotation":180,"texture":13},"down":{"uv":[7,8,16,9.5],"texture":13}},"type":"cube","uuid":"00f373c7-757d-179f-06c5-d5639d25da09"},{"name":"Gear2","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[1.1049999999999995,11.3775,1.1425],"to":[7.135,12.3825,2.1475],"autouv":0,"color":9,"rotation":[0,0,45],"origin":[4.120000000000001,11.879999999999999,1.6449999999999996],"faces":{"north":{"uv":[7,6,16,7.5],"rotation":180,"texture":13},"east":{"uv":[5,8,6.5,9.5],"rotation":270,"texture":13},"south":{"uv":[7,6,16,7.5],"texture":13},"west":{"uv":[5,8,6.5,9.5],"rotation":90,"texture":13},"up":{"uv":[7,8,16,9.5],"rotation":180,"texture":13},"down":{"uv":[7,8,16,9.5],"texture":13}},"type":"cube","uuid":"02616f77-ee0a-8a39-e290-c8e247acd576"},{"name":"Gear3","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[1.1049999999999995,11.3775,1.1425],"to":[7.135,12.3825,2.1475],"autouv":0,"color":0,"rotation":[0,0,-45],"origin":[4.120000000000001,11.879999999999999,1.6449999999999996],"faces":{"north":{"uv":[7,6,16,7.5],"rotation":180,"texture":13},"east":{"uv":[5,8,6.5,9.5],"rotation":270,"texture":13},"south":{"uv":[7,6,16,7.5],"texture":13},"west":{"uv":[5,8,6.5,9.5],"rotation":90,"texture":13},"up":{"uv":[7,8,16,9.5],"rotation":180,"texture":13},"down":{"uv":[7,8,16,9.5],"texture":13}},"type":"cube","uuid":"72028ce0-c3fe-cddd-e90e-3e9a1f2e897b"},{"name":"Gear4","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[3.6175,8.864999999999998,1.1425],"to":[4.622499999999999,14.895,2.1475],"autouv":0,"color":6,"origin":[1.4399999999999995,14.559999999999999,-1.0350000000000001],"faces":{"north":{"uv":[7,6,16,7.5],"rotation":270,"texture":13},"east":{"uv":[7,8,16,9.5],"rotation":270,"texture":13},"south":{"uv":[7,6,16,7.5],"rotation":90,"texture":13},"west":{"uv":[7,8,16,9.5],"rotation":90,"texture":13},"up":{"uv":[5,8,6.5,9.5],"rotation":180,"texture":13},"down":{"uv":[5,8,6.5,9.5],"texture":13}},"type":"cube","uuid":"ee9a1263-03dc-505c-0f71-05f7617d1d33"},{"name":"GearCaseInner","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[2.1099999999999994,9.87,1.1592500000000001],"to":[6.129999999999999,13.89,2.130749999999999],"autouv":0,"color":5,"origin":[1.4399999999999995,14.559999999999999,-1.0350000000000001],"faces":{"north":{"uv":[4,0,10,6],"rotation":180,"texture":13},"east":{"uv":[0,6,6,7.5],"rotation":270,"texture":13},"south":{"uv":[4,0,10,6],"texture":13},"west":{"uv":[0,6,6,7.5],"rotation":90,"texture":13},"up":{"uv":[0,6,6,7.5],"rotation":180,"texture":13},"down":{"uv":[0,6,6,7.5],"texture":13}},"type":"cube","uuid":"40625058-f506-3061-ec6c-0a5cfeb335bc"},{"name":"GearCaseOuter","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[2.78,10.54,0.9749999999999996],"to":[5.459999999999999,13.219999999999999,2.3149999999999995],"autouv":0,"color":2,"origin":[1.4399999999999995,14.559999999999999,-1.0350000000000001],"faces":{"north":{"uv":[0,0,4,4],"rotation":180,"texture":13},"east":{"uv":[0,4,4,6],"rotation":270,"texture":13},"south":{"uv":[0,0,4,4],"texture":13},"west":{"uv":[0,4,4,6],"rotation":90,"texture":13},"up":{"uv":[0,4,4,6],"rotation":180,"texture":13},"down":{"uv":[0,4,4,6],"texture":13}},"type":"cube","uuid":"bb81bc93-d0d9-2ccb-00ef-d546c7b87357"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[18,18,0],"to":[22,22,4],"autouv":0,"color":0,"origin":[18,18,0],"faces":{"north":{"uv":[0,0,16,16],"texture":15},"east":{"uv":[0,0,16,16],"texture":15},"south":{"uv":[0,0,16,16],"texture":15},"west":{"uv":[0,0,16,16],"texture":15},"up":{"uv":[0,0,16,16],"texture":15},"down":{"uv":[0,0,16,16],"texture":15}},"type":"cube","uuid":"edf7d183-03fd-9df1-9698-56dbf0d158d4"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[18,26,0],"to":[22,30,4],"autouv":0,"color":0,"origin":[18,26,0],"faces":{"north":{"uv":[0,0,16,16],"texture":16},"east":{"uv":[0,0,16,16],"texture":16},"south":{"uv":[0,0,16,16],"texture":16},"west":{"uv":[0,0,16,16],"texture":16},"up":{"uv":[0,0,16,16],"texture":16},"down":{"uv":[0,0,16,16],"texture":16}},"type":"cube","uuid":"f1a2d481-12a0-7e86-4160-a585cb68b418"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[25.52,9.699999999999998,1.7410000000000005],"to":[30.28,14.459999999999999,6.501],"autouv":0,"color":0,"origin":[25.52,9.699999999999998,1.7410000000000005],"faces":{"north":{"uv":[0,0,16,16],"texture":17},"east":{"uv":[0,0,0,0],"texture":null},"south":{"uv":[0,0,0,0],"texture":null},"west":{"uv":[0,0,0,0],"texture":null},"up":{"uv":[0,0,0,0],"texture":null},"down":{"uv":[0,0,0,0],"texture":null}},"type":"cube","uuid":"994c2fff-91fb-f425-3e6c-dc2415909031"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[1.5199999999999996,17.699999999999996,1.7410000000000005],"to":[6.280000000000001,22.46,6.501],"autouv":0,"color":0,"origin":[1.5199999999999996,17.699999999999996,1.7410000000000005],"faces":{"north":{"uv":[0,0,16,16],"texture":18},"east":{"uv":[0,0,0,0],"texture":null},"south":{"uv":[0,0,0,0],"texture":null},"west":{"uv":[0,0,0,0],"texture":null},"up":{"uv":[0,0,0,0],"texture":null},"down":{"uv":[0,0,0,0],"texture":null}},"type":"cube","uuid":"d0536c95-b5a6-5761-c358-f3f0c09c703f"}],"outliner":[{"name":"group","origin":[0,0,0],"color":0,"uuid":"31baba0a-6741-3c3c-c928-d479fae06e0b","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"children":["f3e6ac4a-ae8e-b4ec-c08a-72c0aff87260","a864f9d2-8b98-0a6b-5905-068e12a4ed4a","8bfa9753-ea73-56a2-f9cb-e6d0607b1eeb","1ab06a32-ddca-3cc5-6184-730fb810df9e"]},{"name":"group","origin":[0,0,0],"color":0,"uuid":"bbbd62e8-892f-d3c4-182c-317adac38594","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"children":["94f28cc4-aeef-2708-2953-bf1c6ec85c3b","d55a2435-fced-d6da-06a7-6a3ae6c11144","1b50c803-07bd-b324-dc37-d0e3bdd41e7a","5b6aff94-5c3f-5dcf-db00-782eafc22986"]},{"name":"group","origin":[0,0,0],"color":0,"uuid":"56114a43-c82b-b74b-e5b5-44005e14e504","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"children":["95ceca62-28f7-0a06-296c-3e3abeb80f66","45f0e7a2-258c-31f8-2f98-f1fbf01bd607","78e6ba39-615d-19a9-f608-d2e16fed3ebe","0c46257c-d3c8-6d34-b3bb-b072afda5de3"]},{"name":"group","origin":[0,0,0],"color":0,"uuid":"32ac98d0-05a5-4be3-22fe-c7707e43820c","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"children":["6abd6abb-73fa-6522-3fb6-816a2e21621d","db5c3c11-192d-ece3-8a9f-7063d170e18a","8912c0cc-e2ce-12bb-00ac-c52960b58107","d0b8b748-62f4-8b5f-3e92-b3964f0ba6fa"]},{"name":"group","origin":[0,0,0],"color":0,"uuid":"7312a41e-fe28-6703-bb72-7bd254030063","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"children":["b1792b7b-bd79-d27e-82d7-0ce76650122f","248a3ef9-643f-bfdf-ed3f-277a68c1e31f","13dd54f8-ca6f-19ed-e70b-b325f6e7c88d","cb2a5eec-1ee0-f954-1a1f-f611aa48d07a"]},{"name":"group","origin":[0,0,0],"color":0,"uuid":"b1720c20-248e-e67f-9a91-96d68b3b565b","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"children":["0ffa2507-5119-81f8-7c2f-8b06672e9bc8","79acb8f9-546a-acbc-06bd-0db7adf4562b","b8995380-5649-968b-702a-c45125c8028f","1c8efa84-aa71-c7d9-f0d9-c4bed393985b"]},"709fa87e-af5c-f7ba-b040-dd274f0cb23b","da2fa599-f38c-f451-2628-9b39380480dd","5851f75e-2bf6-395e-f0b1-5b84ccb2698d",{"name":"cardboard_12x10","origin":[8,8,8],"color":0,"uuid":"a04c4950-b0ff-ca6a-62a0-bff392880f46","export":true,"mirror_uv":false,"isOpen":false,"locked":false,"visibility":true,"autouv":0,"children":[{"name":"package_2","origin":[8,8,8],"color":0,"uuid":"77a5b652-a7d2-350e-f49f-8744f18e7102","export":true,"mirror_uv":false,"isOpen":false,"locked":false,"visibility":true,"autouv":0,"children":["f168b2eb-aa48-4997-84ff-7052c1d6d492"]}]},{"name":"cardboard_10x8","origin":[8,8,8],"color":0,"uuid":"cda42963-2d40-ebd2-3578-d1d296107dd6","export":true,"mirror_uv":false,"isOpen":false,"locked":false,"visibility":true,"autouv":0,"children":[{"name":"package_1","origin":[8,8,8],"color":0,"uuid":"2a1e9339-7c05-6aa5-8835-0be3e77e0a88","export":true,"mirror_uv":false,"isOpen":false,"locked":false,"visibility":true,"autouv":0,"children":["12fa5088-3f91-f4f9-10a1-2af3a696c0fe"]}]},{"name":"group","origin":[0,16,2],"color":0,"uuid":"62f756b2-52a4-aa55-976a-c0409bf58695","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"children":["23cb6d79-5fa8-9450-1d9e-62e00a93283f","7d56ba64-5525-dff7-3833-5b071bcdd163"]},{"name":"group","origin":[0,16,2],"color":0,"uuid":"cc4f5f8e-f45f-4291-e79d-65c31db9be39","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"children":["e416b457-1c0b-74dc-19d7-209c35c9722c","3ae91df1-dc58-bbb5-f466-4ddef96b1dc2"]},{"name":"group","origin":[0,16,2],"color":0,"uuid":"389d6b8a-1af6-33cb-2274-6527f87f8dec","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"children":["a9121026-2aed-a946-6011-79ad4712d797","de77d797-3428-8af4-425d-cbec659e4317"]},{"name":"group","origin":[0,16,2],"color":0,"uuid":"44e5557f-c525-1521-4449-7e04f2dfc33c","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"children":["f3ad9cfa-e77c-28c8-5228-93b1fffad997","37950a5b-d169-0c20-539e-e1d8d6928ead"]},{"name":"group","origin":[0,16,2],"color":0,"uuid":"33cd31ab-a826-79fa-5fba-ea017522864c","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"children":["4ff5d83b-0db9-d185-6515-40b8f077d208","0d335727-a5e5-0748-1f3d-3a6db0451681"]},"c8d0fded-9b71-948c-d423-6710a5d09b27","abdd6b8c-b21f-9b63-20bf-5859ad115ee1","5f637b44-5202-5970-8a1d-7a0f317bdbe6","80262d0c-962b-bf27-9189-1c28748c94b0","d83fd3c5-c05b-5c85-a2df-465dfdbd2128",{"name":"cogwheel","origin":[8,8,8],"color":0,"uuid":"63eb11b7-5894-a221-7569-8075bb6bf7c6","export":true,"mirror_uv":false,"isOpen":false,"locked":false,"visibility":true,"autouv":0,"children":["3b1f8416-fe8f-e0be-07b9-56efd5145e7b","00f373c7-757d-179f-06c5-d5639d25da09","02616f77-ee0a-8a39-e290-c8e247acd576","72028ce0-c3fe-cddd-e90e-3e9a1f2e897b","ee9a1263-03dc-505c-0f71-05f7617d1d33","40625058-f506-3061-ec6c-0a5cfeb335bc","bb81bc93-d0d9-2ccb-00ef-d546c7b87357"]},"edf7d183-03fd-9df1-9698-56dbf0d158d4","994c2fff-91fb-f425-3e6c-dc2415909031","d0536c95-b5a6-5761-c358-f3f0c09c703f","f1a2d481-12a0-7e86-4160-a585cb68b418"],"textures":[{"path":"C:\\Users\\simon\\Desktop\\Modding\\Forge 20 1 Concealed\\Create\\src\\main\\resources\\assets\\create\\textures\\block\\flap_display_front.png","name":"flap_display_front.png","folder":"block","namespace":"create","id":"2","group":"","width":16,"height":16,"uv_width":16,"uv_height":16,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"3853a254-d4c1-6932-f7af-9ace9354a8e5","relative_path":"../../../textures/block/flap_display_front.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAJRJREFUOE9jNDIy/s/AwMDAzMwEosDg799/cDaMgUueMSgoFGwAHx8fWO2nT58wNOOTZ7S2sf3/88cPsCZ2Dg4wTQqfUVtbF+wCcsEgcAEsEH/8+IbVFxwcXGBxXPKMGhqa/5GjCFs04pNnBKUDigyAeQHd/cSmi0EQCwOfEr28vFGSMqF4R5dn1NbWRjEAPSsTimIADrx310Hfd9cAAAAASUVORK5CYII="},{"path":"C:\\Users\\simon\\Desktop\\Modding\\Forge 20 1 Concealed\\Create\\src\\main\\resources\\assets\\create\\textures\\block\\dark_metal_block.png","name":"dark_metal_block.png","folder":"block","namespace":"create","id":"3","group":"","width":16,"height":16,"uv_width":16,"uv_height":16,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"3b4e1205-847b-fdf5-c413-69c518d563ed","relative_path":"../../../textures/block/dark_metal_block.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAWlJREFUOE+Fk01vgkAQhocKqGBak3qyCQeTmibYhKTS//8jWo6kWrzZxJKKykdp3jGzXSimc1mYnffZ2ZlZIwzDmoioqr6xKOv1rvi77YdP9vBtBEFQB8FTQ6z/pGn6Z+94zNgXxzEZi8VjvVw+UxS9XoR0bYzHN7TZJE2AZZmN2KIo+X/oDHnt2zavpmlSWZbdANOyOKgsCgWDz3Uc2mcZQwCArVZvvzXAFeQkiPXTRSxEgSjAbHZPSfLOAIjz/MSxhtGjyeSWT5aMkM1FAGqAgGz/xeJ2RrLfAKAL8/kDZyBFRAa23WeYfp1OAOZAroCALnFdV5yRdES6wW0EYDq9o+32Q2WAQNd1abf7JIilHnoG8K3X6/MceJ7XAEB8ynM6ZAcG4HQR6/OgAFIDFA3pQSyGGshstNuoRlkAaBkPUXmeQDEZHH0PPgXAFWCDgdMQyqPRnQIfja4pil7I8H2fn3OX/feUofkBipPU/87OVPMAAAAASUVORK5CYII="},{"path":"C:\\Users\\simon\\Desktop\\Modding\\Forge 20 1 Concealed\\Create\\src\\main\\resources\\assets\\create\\textures\\block\\girder_pole_side.png","name":"girder_pole_side.png","folder":"block","namespace":"create","id":"4","group":"","width":16,"height":16,"uv_width":16,"uv_height":16,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"ec032fcc-3adf-8fc0-18db-1979f0d79bb8","relative_path":"../../../textures/block/girder_pole_side.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAANZJREFUOE9jZEADLi4u/7m5uRm4ODkZ+Dg5wbKfvn9n+Pb9O8PXr18Z9uzZw4isBYUDkrC3c/rPysbEADIEBEAGwTT//vWP4eChffgNALnA1sqK4dzFi3BXvHj3jsFIX5/h8LFjxLng27dvDFLS4igGPHv6koGLi4s4F4CcDgsHEJskL1AlDJBdAIoJUBiAAH1iAdkLsLQAcgHIdhAgmA5A0YjNCyADiE4HAx8LVEuJyHmBpJSInApB6YCk3KikpP5fWEgQnO6RASh/vH33nuHevZsouREAn+jHERFo+EIAAAAASUVORK5CYII="},{"path":"C:\\Users\\simon\\Desktop\\Modding\\Forge 20 1 Concealed\\Create\\src\\main\\resources\\assets\\create\\textures\\block\\industrial_iron_block.png","name":"industrial_iron_block.png","folder":"block","namespace":"create","id":"8","group":"","width":16,"height":16,"uv_width":16,"uv_height":16,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"28cbf0a9-6426-927b-875d-44a4b85db3dc","relative_path":"../../../textures/block/industrial_iron_block.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAYhJREFUOE+dU01LAlEUvRN+MCPJBBaMZIFCBEIt+qCFGLTSRe1a+ONctKtF61yH61oYuDGIrKZossHQhx9knDfd54xpC+/m3XfnvfPOOfeOtrd7MDIMg+YJ58Mh7TB/NCqVTumqUqGNdFrhtF2X4qYp95xjRby2WlQsFKhcPvMAzKVFcj+/5MdwZEGBhEMhmQ+GQ1Ub9L9ljjsvz28ewP7ONt3V67RmWdQWglYtK6CIGTzZNsV1nR5tW569qdXHALe1mrwUi8XI0HV5kAOgiK4Q1Ol0ZL6cSFCj8eABbGbWJappmuriLP0Ac12XItHoWEIyuULvjqNe55f/Y/GHwX2zSZlUSnqAi2Aw2Qn+xmeVBywBtBDwAMEM/B6g3u/1pFzlwTQJzILnQK5CKCNhtmojGIAWd8HPgv1ABxBTuzDJAK+zXn6Za9zKgIkAQGsQ8IE9CEzT7xxAv5xEvwezRnkSAPupo3xyXKTralV1ADSZBWv3s0Itn8vR+cUladns1sjQ5/udu6JLP4KD+tf6Oo96AAAAAElFTkSuQmCC"},{"path":"C:\\Users\\simon\\Desktop\\Modding\\Forge 20 1 Concealed\\Create\\src\\main\\resources\\assets\\create\\textures\\block\\flap_display_top.png","name":"flap_display_top.png","folder":"block","namespace":"create","id":"5","group":"","width":16,"height":16,"uv_width":16,"uv_height":16,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"f9abc3b1-8eb7-24a7-2884-1ada79958942","relative_path":"../../../textures/block/flap_display_top.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAANBJREFUOE/Fk7EKgzAQhs/6ABXqZMFBqBS0EKhK338qOsc6BbW62SVIcdCmBKoQMKZQpFnCXcLH3X/3a2EYMgCAYXjxazq6vhHiJEk0IfEJNIQQQ+gsvFFKp7htKZRlCVl2mwf4/okFQQRpiiGOr8KnKLoww9hCXVeAMf4TwDR3UBS5vIJRA1kLXwEc5wBVdZ/VYH0An4LrHterQDlGLqJl7aFpHtI9UC6Sbdu/AVQaEEKWV3kJwDVQtsC9MBqo656Csfq+XwZ4nsdUVuZEmZneGRnTEZjeOtQAAAAASUVORK5CYII="},{"path":"C:\\Users\\simon\\Desktop\\Modding\\Forge 20 1 Concealed\\Create\\src\\main\\resources\\assets\\create\\textures\\block\\flap_display_inside.png","name":"flap_display_inside.png","folder":"block","namespace":"create","id":"6","group":"","width":16,"height":16,"uv_width":16,"uv_height":16,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"46fa4f13-a24c-bdd1-e644-26f8d1032de0","relative_path":"../../../textures/block/flap_display_inside.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAR5JREFUOE+NU8uOgzAMdEpJt8mx/QtYiQv//0t9CKpCaVZjaZADrFpfYieZsT1xXNu2SURkmt5YZiuKnfrLfezxDL5rmiZ5/5OBvw1ut6u4uv5NIUQpy/2M25elPPqHxtgfx5ccw1Hjg/e6Xi5X6bp7TgAg7DWOClqSxhCk63slWREwgwWzEpwRzDJRoVZADXAJ4GF4inOFlsw2zueTZsY5jMQZAXu1fcMnMXy2tUmACylNmp1mNbCaZAR8BYC9P8wtAIyLVhNLAn/VAvqHgciC7VyQeCUiDkAAMA1ZqAnFpS4g+HeQYozyHAZ9BRLr2LpCY2qwSUAwnwxVUNylLhkBngsThsycxqUm3N+s4NsPZO9pBVVV6Xfesk9fGZg/EXXv/1sbuAAAAAAASUVORK5CYII="},{"path":"C:\\Users\\simon\\Desktop\\Modding\\Forge 20 1 Concealed\\Create\\src\\main\\resources\\assets\\create\\textures\\block\\factory_board.png","name":"factory_board.png","folder":"block","namespace":"create","id":"7","group":"","width":16,"height":16,"uv_width":16,"uv_height":16,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"af44dd06-4afa-f17a-420f-a36e0fee8003","relative_path":"../../../textures/block/factory_board.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAADVJREFUOE9j7Onp/M9AAWAEGfDt2ze4EVxcXAyk8AeJARQEAcMg8QIpoY4eS2AvjIbBiA8DAEs9uKkSz7+xAAAAAElFTkSuQmCC"},{"path":"C:\\Users\\simon\\Desktop\\Modding\\Forge 20 1 Concealed\\Create\\src\\main\\resources\\assets\\create\\textures\\entity\\package\\cardboard.png","name":"cardboard.png","folder":"entity/package","namespace":"create","id":"0","group":"","width":64,"height":64,"uv_width":16,"uv_height":16,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"004fb2ad-e1ca-f677-2021-0045ac660e4b","relative_path":"../../../textures/entity/package/cardboard.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAACXdJREFUeF7lW2tsVEUUPqWt3Xb72D6ptAUrRiqJJUh8EEPQNBqiBHyEH0YiJiig8QFGTRoEI0iaqBFfUUBJxGD8QXxA0JCYRtEYNYIiJoAGRCgFoa/tY9vdtus1Z/Bszs7O3JnZbVHi/bPd3blz53z3O9/5ztxtFvzPjyyM/5cdz3r5+QFfKIaGonD1oueybMbSRC7nuIyV53/rwUbvobcPilj4sXrhZK+8JAhPvHc45TsaJ77Yu/lRr6ysDGKxGOTl5SlfI5EIzF3+ehaNjUajEAgEgF5V58rn9Pf3QVFRMdArnYPvR0ZGk+ZXjcFzVedgoBt2nkwJ8uX7rvIwPmcARuNxyMnOTgJCDoYWohpLIOrOkYPDuXRgyfPTew7aspsnelu+OKsEoKs3AipwUhjQ2z8E2z/6FNasWgZ0EXxteW0rLL7rdigpyk+6Q8dPtIvxzY8tTQJr/cYtYnxdbTX09fYmnaMLBj+Xx8oA+4F27/Xl3vvfdylTYDAWh4172s0pMLnhGohGh2G073TizuPCAqV1EAhcAieP/JgUDC7whTe3wdMPL0lKGwSAQNQBwAEmpunYYpOWOvFaNa/Gq6sqdk8B+aKqHMUxu/a0woJ5TUkA7Nj5GSxaeJsA0SUo2xTjLKJzdABYa8Culx7w6qfUKMWJRKuzux8WPPlOQgQLqy4TjIl0HBcA0MJyiicJxnS1/aoE4PSfnTCpukKcg2mE15XBwnTcd+BnOPL7qRSGIcD4OU9LPwCsNAABwBwfGYlDbm52Yj7+HhfFAZBZIuf3wMAADA8PJ9Km9evvxMLxoLTBdMGj4fJaaJpzQ1KK0Xc0lubnn5sYgNXBSgNsajvVaR1beHlC1iAAHV29StC4klNp4ynA9UhVZYKV9Um6NGYaoFJapCrXAB1baBE61uiCkoORPYkKLLnMZqwBOiOkEhwbtshOzcQaZA9qA6aYSY84IKRLGWuADnVei3V12qZMuWiMzVgMGJk2GB0WoOkAsNYAEwAuJS1d1mTSC4ybBqhsJ4HlZ4FtrTDXHJ0V1jGM61LGGiDnnaoRkX2AqQyqWCMLGl1HZYXlxkl1LjVQGWuATd7pfIBLM6RTdL9egIOEtlnFGj8NwO+MzRAqO94xPGoaroP2U21QU1sH0UivcHR4IK1xPyCdMuVSZXQppmqkSJj9AOjoi4GqU0zpBo8cOgQlpSGYMftW6Al3Q2moDCJDUTh64Cvo7QlDw/Tpvv26zX6AC1t07bZLL4BtMgZqBQBtiFTXT4f+gSEoKswXr9QdkkiZ6jQHgmp7OhsuLvsNOgYgAJHBUVC1ysodIUS3su7KRODY2KgAMPUNNLmLbshVwFRluG7oAMB9AvzOCQB5J4g6Pco3rheyZoS7OkR3SIesG7KguRgtvz0EPwCCBTluKUDeH5sUVb4hnUkv8MJcM1A7Th7eJ9ZjoxsuPkAGwOQDcDME1xGJjZoBMPkA7tVllS6omALDwyMJzYj2tIktMk5Rml/uGHmtJ59hsxa6SbwXoHzHoPGuB/NyoCDvfGuPlQC1gL7jwih8NPkAopJqX4B8tyxoCMBg5wkonTRVaAdtkHAj5OIzTGvhdCeNwc9I8XmglcV5YjjuCSAT+HdUGVKeCwSrpyV8QDw2ANGedjEJeXWTout6AVuf4acx3Jdwb+JXBZAJeOg2RgUAR3e3eBggUrK+cQ50dZyFUHEQRkbjMHDuD/F5VVUVXDG/OcUI2XSDXDdsfIZOY8iXyBrjB4BVGSQAMBj0AeG+CAQLzj8p0gFgKlO6DpL7DA6w7sEI7T3iPmNuTjZ0tP0mNMYkgrh26zLIASivmwaRwWgSAzCYUKgkiQEyADYPO4gt6C90RktOMQQAbwK9ciE1NUMIgFUZVAHAGcABMCm6nxN0scJ+W2G2W2LWVtgEANcAnUrLlUPkqbSTrGpo5JIpl1mZWdwPmJohnTbwz5NEUKcBnAHynqCuavhVDj9XZ+ocxxUARPvSqY2+GsArBrpFrP8omuWVE0X7fObYQfEE2E83VKmg6wVUYNmkAD4Vys/LhaHYiPnRGA9q8rSZIiBdGeTpggtBIzQUjSXGEwC48KLCoLJ0+tlaEwO4xvg9GMH8RyNktR/AaW0yQjoA8gN5MGFClthAoQZKBsDmuQMBoBur2qdU5boTA9bcM8urrQr5asapc2FY/8H+LAKAFiIzgABQVQ7dDyT8ngvoqgHO5fdcgDwABmVshzc/3uThbpDfgd3d8ldbEwBQMDIA4TPHEr8XIO8g9wJ+FcOmb8B1mp4LOAMQ+Oc3QhOys+GveBzwlQ58Hx2KJgFAuUgiSClAAPDS6ZJi6VQZ1Y1zBiBTBsgawAHIRGTlKkMpxufPWAMwBQoKgyl3HifGu4+HzABKAZkBKg3gANiWWWIYWmBuzW0BwF+OoW6htql+QUagCSOUjgbIKUBlU5UCpmaLC6bsMwgAsuYqgMeEAX4agBcYHIj4agAZIVsG6HoNndEigG0ZYGODcYwzA9IRKVO3qdILXQqQ0TJpgDMAyABZ+akicA2w8Qx0cdk7YFCqdlsnmGip000BJwBsgqJgbPSCLq7yDmS1TSlgYgDXDbre7r17vPlz5wlWr3xqpVdWViG+6u7uhFdefEX5OwLtjwt0CCIApBc4hrOGn6PzDrTjxHsNlQjKABBgqmaLrrtl+1Zv2eKlIqZ1Lc97a5ufSflbjistAEyeQWaAixGSew0qszZVgAfNA9V9nhBB23yhkkl6ITtG7htcdUOlF9hUVdTPSNqk9asCSHsV1ZvXrvZa1m0YuxRwZYCNbpBepFNl6Abev3SJ9+7WbSJQ/DtUVpq4t+OiAXL+EyNk90i6MV5VhqK84+47vU8+/FgAsOKRFQmtQhe76Y1NFwcDbNgiawy9v+mWJu/Lz1tFoAhGKFQsvgqH+4CAGRMRdK0CvNfQVQ5ymqqxqu6UawwFde2Ns70fvvnWSdidBpMIjqcGZMKAxlkzvYP7f3KKyWkwrwJ0J/0qAXWQdFepSnCHSfNwBvC+hO4u6QrpCPcZLlUs4xSwcY10ERf3SFUgEwakA4QzA9K5CHePqsrB89lPL2QWEGvSWROdc0EAsGGNC1t0VSAdIC4IAC4LU3kGnXaQxrjMn7EGZHIxm3P/FQ3Q/eelzYLHeoysF7oqg1oyZhqg+8/LsQ7OZj4bvZCrjM28ujFCA3T/eZnJxBfLuQIA3X9eXixBZLLO/1wVyCSYdM79G5WYhiLsLDKiAAAAAElFTkSuQmCC"},{"path":"C:\\Users\\simon\\Desktop\\Modding\\Forge 20 1 Concealed\\Create\\src\\main\\resources\\assets\\create\\textures\\entity\\package\\cardboard_particle.png","name":"cardboard_particle.png","folder":"entity/package","namespace":"create","id":"particle","group":"","width":16,"height":16,"uv_width":16,"uv_height":16,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"738d687e-24d9-f0eb-5344-4fa58d18e9bc","relative_path":"../../../textures/entity/package/cardboard_particle.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAARxJREFUOE9jZKAQMFKonwFuwOXV9f9//vwJN09aw4zh6ZPHDNIysgw/vn5kePv4JlyOnZ2dQTe0EawXbsDBmbn/b1y7xsAvKABWqG/pxvD+wzsGQQEhhq/ffzDcuXAILP7x/QcGDS0tBvv0yZgGCAkJMXz+/ImBl5ePgUdMgeHHj18MHBxsDKwszAyvH99iYGFmBsv//v0HtwEgb4CcCDLgy6sHcBomTtCAP3//wm0CuQSmEZn++vUrbhfgMgAmDqI/ffxI2AswG5E1gsKAoAHYNIA0Eu0FdD/DDCTaAFg04jIIZyxs6kn5rygvDU8HuAITZMCbd58Z/ErmoCYkkAH8vJwMv3//ZWBlZYYnW2z8bz9+YRpAbqaiODcCAPW59hHCn6lGAAAAAElFTkSuQmCC"},{"path":"C:\\Users\\simon\\Desktop\\Modding\\Forge 20 1 Concealed\\Create\\src\\main\\resources\\assets\\create\\textures\\block\\large_cogwheel.png","name":"large_cogwheel.png","folder":"block","namespace":"create","id":"5_4","group":"","width":32,"height":32,"uv_width":16,"uv_height":16,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"615e5b1e-f07c-03e8-e356-b36ad8907aeb","relative_path":"../../../textures/block/large_cogwheel.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAA15JREFUWEfFV71uE0EQnktsn3O+xJCISKQhvECEBA15BSS6FFCRjgeggQIJCioegC4dDR0Sr0BFgXgBUoFkRIyd88V3cVj49vSdd9dr50ISM83a692db2a++XHw+P6WisMF8UmS/ba2fefcM7zw5v2XAJ9fPLqrsvxYwkZdsCqlJAiC8nvwZOeW4iU+lp0UO+GiDQv72CMQ8zz3f6YF6L0PBYDde1vq5nosXzuJ+NYAHsBBKqVKKnf3CcwFSVAugGcP76hm2JCjYSZLzbBch1ku2NcAaNnGWiz9JBVY1qyNrR+ObE+Yv0XNhnzv5bIWFWF0ATx9cFtBMd5diSPpHQ70CgDYtzyAR/hAlqUTtAjDyNrDmc31KxoAxLzPECDEy60lORwcCdZufyAAnR+PNBDNASrlA3A/rYT1cO/oZExI7n3rJrJxNdYegxenAWjUa1oh1nSY2wAYAlhwvV24sx0WhgKpT/AIpNMfe2AaCWEgFFNoOTlhhQAA9ju/tFW4RNe6IHDuIMmln6b6LD0IECQnQ2CSEOkHAfnICS+AlSiS1bjwhinkBeIOAViTAz4ALglBPtQEcEJzgGmIBxFrWIOHAACu7mUiSbenFdajul6hlL+ZcZ/GAbIelgMABUC8WQAOIP5VAJA3s7IAAHx1AHfKOuCSkPmNfbqeaQilpgeYBbNCgPxvL7d0HcBqkZDEIfuZAeSAWxPcEMwCgFK8ea0l+z8G4lutEPjSD2kDYS4zfr7cN3sHm9HL3W3FsutbdSFiU2HxYfxriwtl8aBisyy7aQgSvn73uci1ijLhAbDedLmv/JYsDiNdvFATmEXnAoDHIHT7aUawwoErrIRnBmCGYJpCs/W6bdedGRj708Dzd2sg8V1yhxTmO1ZzGgIwfD8XAD7ojl7mvu8MqifnAc4SIGsVMNoDZqsF86fNea6H3DaNu3gLK6QKH6xe4Bu/qsTS5QHS+b95oIrVplE6BEgndKqDXqLd5yNeFU+4Z+gZhmq1HesjmAUIdO4AUI5RZywAaJeQeXhgAgBGJiifRwjQYziUvHr7SfeMAN0KH4AMPf4yOcAhFyCe730sAHBonAcAkJAjWemBf2H3Rd45U+++SMVlM7qMR/nmzvYNhUkaMwX/bXHIaYZ1afz9v/IH7FPFp0CzEhkAAAAASUVORK5CYII="},{"path":"C:\\Users\\simon\\Desktop\\Modding\\Forge 20 1 Concealed\\Create\\src\\main\\resources\\assets\\minecraft\\textures\\block\\stripped_spruce_log.png","name":"stripped_spruce_log.png","folder":"block","namespace":"minecraft","id":"5_particle","group":"","width":16,"height":16,"uv_width":16,"uv_height":16,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"6bf455b7-b3cd-c92c-0e42-95f8cdd9fae7","relative_path":"../../../../minecraft/textures/block/stripped_spruce_log.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAHxJREFUOE/dUzEOwCAIxMUfOPH/nymLJu7GhAZcaOIgDh3KAgvHHQeBmRkuo5QCQQCkiDHCGMOViWgB1FrdzTKstXbOABFVqB3mYpBSUgAr968MdlrF4uMd7LYtlh27YCfZJheDOSf03l+0v2Pg+QnXJe4eTS8x58xS3MYDngGKTOcZJJwAAAAASUVORK5CYII="},{"path":"C:\\Users\\simon\\Desktop\\Modding\\Forge 20 1 Concealed\\Create\\src\\main\\resources\\assets\\create\\textures\\block\\cogwheel_axis.png","name":"cogwheel_axis.png","folder":"block","namespace":"create","id":"0","group":"","width":16,"height":16,"uv_width":16,"uv_height":16,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"86dbdeb9-84fe-309c-ce15-c3939ab286a3","relative_path":"../../../textures/block/cogwheel_axis.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAMJJREFUOE9jZMABomKj/ssrKjJ8//6V4dWLVwzLFi9jxKYUqyBIYVJa0n8+fj4GTk5uhpcvnjPMmzWPdAPYOdgZJCWlGR7cv0e+AQICQgwP798n3QuZeZn/QZo5OTkZnj9/yjB90nTSvBAQHPhfSFiQAeSNj+8/kucCUGCCXPHhwzvSXYAcC2QZAEoHYhJiDEJCIuSFASwhgQKRrGikSiCCEhEIkBWNoEAUl5AEG0BWUgYlJHZ2dnAgkhUGFGcmYrMzAJgOdhGedY2NAAAAAElFTkSuQmCC"},{"path":"C:\\Users\\simon\\Desktop\\Modding\\Forge 20 1 Concealed\\Create\\src\\main\\resources\\assets\\create\\textures\\block\\axis_top.png","name":"axis_top.png","folder":"block","namespace":"create","id":"3","group":"","width":16,"height":16,"uv_width":16,"uv_height":16,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"6648a61d-8f93-ae33-3b89-e60596155fb2","relative_path":"../../../textures/block/axis_top.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAGRJREFUOE9jZKAQMFKon2HUAAbcYZCUlvRfXEKS4fv3rwyfPn5imDdrHtbwwhmIlXXV/8UkxBg+f/zM8P37d4b2plbSDCgoLfgvJCQC1gxyxYTuCaQZQLEXiE1gowkJT0IiNhABDy8oEaP4AzUAAAAASUVORK5CYII="},{"path":"C:\\Users\\simon\\Desktop\\Modding\\Forge 20 1 Concealed\\Create\\src\\main\\resources\\assets\\create\\textures\\block\\cogwheel.png","name":"cogwheel.png","folder":"block","namespace":"create","id":"1_2","group":"","width":32,"height":32,"uv_width":16,"uv_height":16,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"3bc98a82-3b4c-930e-c50f-b345e14045d5","relative_path":"../../../textures/block/cogwheel.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAitJREFUWEftVatOA0EUvUsf22yaLkE0EAxfQBAofoEEQYLB1SERKCQChUDyBRgSBN+BICgcJAiSCqDNpun2wZIzm7O9ne2TUrejdmbu49xzz511Tg+3I69UFK5WuyPc4xsLe32eGIuYc3tNind9/+ycH+9Gb/VvqVY8MZuPRjoIgm74MTAm18kICveNUMR3Y6C6EJxj4Y6FXN4+JjkR3wEDNKRzGLbM51Z1NanQtqGtDk6wNiMaIAGAAcQ3aFAZjIKvhvEteIUhAAxAEAToul6SSwMhozjTwFExAFzU9qLXemAYNgyQxnEAeI/EOqm9Jwja2/RjTwAv7/UBA0RsV0YN4B533VZ3iCHuN9f9lA60XsgCGaAIkxbYAMgrDHRf6800CNqCGS1azQKZgEhTIgQanUSr2xaTHZSMYZyocvrYI8xzjCHajmLMGNb2Yw2MW+yrFhMTw4ea4Biiwknx7LupAEArq9EgbGDco8J/B2DTaj8wpB9Alw5g1LOsn+m5W3B2tBP1+j8Ja/ncigRhvC+7K2LfXd09GYrhVyzkpeQW5bMRDD040zS15peNSTNoiXNyMBBh2B/t6uYG5zcPcY8XBdAOO9Lp9sRZhIFKOR6/vzCQAJhHscuwnXlk0KpSXqTdE0Eb+IBRA1o7divZQmoKQoYfWJgZAF4vJMGCEPFHwzeCYArmBQBfgJgZwCgGWMW8ADAFAI41M4Bl9D8DkDGQMZAxkDGQMQAGfgEyaZdKXv7ASQAAAABJRU5ErkJggg=="},{"path":"C:\\Users\\simon\\Desktop\\Modding\\Forge 20 1 Concealed\\Create\\src\\main\\resources\\assets\\minecraft\\textures\\block\\stripped_spruce_log_top.png","name":"stripped_spruce_log_top.png","folder":"block","namespace":"minecraft","id":"6_particle","group":"","width":16,"height":16,"uv_width":16,"uv_height":16,"particle":true,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"daf1ffaa-7d5c-929d-d389-8efa37314d69","relative_path":"../../../../minecraft/textures/block/stripped_spruce_log_top.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAHxJREFUOE/dUzEOwCAIxMUfOPH/nymLJu7GhAZcaOIgDh3KAgvHHQeBmRkuo5QCQQCkiDHCGMOViWgB1FrdzTKstXbOABFVqB3mYpBSUgAr968MdlrF4uMd7LYtlh27YCfZJheDOSf03l+0v2Pg+QnXJe4eTS8x58xS3MYDngGKTOcZJJwAAAAASUVORK5CYII="},{"path":"D:\\simon\\Minecraft\\Minecraft Assets\\minecraft\\textures\\block\\oak_planks.png","name":"oak_planks.png","folder":"block","namespace":"minecraft","id":"15","group":"","width":16,"height":16,"uv_width":16,"uv_height":16,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"a49e3215-10aa-29ce-7f8c-e06a392a2519","relative_path":"D:/simon/Minecraft/Minecraft Assets/minecraft/textures/block/oak_planks.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAVlJREFUOE91U8FKAzEUTJCC21ZZVkR7KcVe+xN+gODFs+ClP+An9O5FvImf4LVn/8MiQtmKsuTQdgWRLfPqlNm05pLk5WXyZt7Ej++vq/Jn6ZJG0zWTPRePZfn7b3zy9u48AHAJIBj59MsladulrX0D5eA5Y3ko7Mg/311VcSL2uBAW37WCAIrBfKvg4fa8mhXr10+z9YvYfxQLW59kLZuxx1rjWBsFcH/NP12/c1x7MY5BD1JBdZ00q1Ng2SgVCWWYb/TQ0lUX/zS6MBEpGl+goGe97paQqo0fXg4MgFyhg2rA2zynVszZaIAD5Xh0eLDlCQ0gF600ABpJE+I2UhfO5p0wd/7l8aaK1VUg9p4x8kcHrALVYJcPqA+1oScIaBWg30DkX0BF1oVQ1LxBX+j/MCtrj+lx5Qpw4/z36bTVBkBe6gUaiT7Y9TcAahqo35UzebLn+hd4tgJnUgM/K1gwfwAAAABJRU5ErkJggg=="},{"path":"D:\\simon\\Minecraft\\Minecraft Assets\\minecraft\\textures\\block\\stripped_oak_log.png","name":"stripped_oak_log.png","folder":"block","namespace":"minecraft","id":"16","group":"","width":16,"height":16,"uv_width":16,"uv_height":16,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"aaabed7c-088f-028f-fb20-13722f43ff0c","relative_path":"D:/simon/Minecraft/Minecraft Assets/minecraft/textures/block/stripped_oak_log.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAh5JREFUOE9lk8tu00AUhn/bM77F18S0qtIueBQkKsQDddcNj4DYwY5Ho5Wg1LnZjp1JJh50juPQqv8mnlHmO/+5Wd/uPposlriYpSB5fojlZo1pmvGZpHYt34/fnToi8BzQrzUCJlGAiee+AvQ44rBTEJ4Hx3JgC4GuqfghqapaWD/uPxnftUGAplK4vilQbVpkacyRR1d12yJNEgY8PdeYxBHqejMA0PeYFTEDosSDDQdpFmPfvQVorfD4UDLAsXpYP798NkrpVwDKnyK6NuC4EsKWfI7DoQ6kxXqLxz9/TzWIXFwUCbZqz9aF8LCpKgZQ/lJ6bN2PE5iD5sekM0BK4P28YABFp2IRIPCH6GPx6NG+B5q2gyt8bOtmcEAAckC5kwMSWQ6Dofok6sh6U0NK9wwoV+WpC9JBEPoQDhUvgjE9tq06Vz2IEvRa83wQgGrxu1zg0OnBwfwqOZMviwx6f4DS/RlAtukRuSAwff96eEKnd7C+3n0w0yhANk3YWuT5cKX1aippwNxwAtNrtI2CFOBZYMD3+1tzfTnDMFsAjuYNgK7zPMdqteJpbXaG/7qu1wNglsfY1gr5LIYnbJi+55EeR5m64wsHO32EMZKr3x72CKV7SiHxAQNkecq9J0nf4z0gURHLRcnRyTqJABNPDIBQCrwrMu4C5TeKXIybSB0YATTGpOfl8v823syv+PLlAo3nl6tMd3SmaSTAP4l8QGr43pFPAAAAAElFTkSuQmCC"},{"path":"C:\\Users\\simon\\Desktop\\Modding\\Forge 20 1 Concealed\\Create\\src\\main\\resources\\assets\\create\\textures\\item\\andesite_alloy.png","name":"andesite_alloy.png","folder":"item","namespace":"create","id":"17","group":"","width":16,"height":16,"uv_width":16,"uv_height":16,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"34fee77d-1e9a-5ee0-8854-a6ed44006edf","relative_path":"../../../textures/item/andesite_alloy.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAASlJREFUOE9jZKAQMFKon4GgAXGZyf9BliyaPherWqyCME0gjd5udgw3X7xgOLH3BMO2Nesx1KMIwDSCNClISzI8ePocxYcLl27AMARuAEhzdmI4ziABGQYytLFrOoohcAO8QgL/WzhbMKT4BzEcPnkMxSCQRhhYsnknw76dhxiunjoN1othAEgQZMjjJ/dRDAFpvHv9HoOIqBDD2bOXsBugrKnEIColBtYIMwSmEWYaQQNACkGGqEtIMGzddYjhzet3YL0gjTCA1QXaZqb/jY31GFT01BheP3vFYGOkBzYABJANAbEfPnqC6QWQQmRDQC4ARRsMvH37geHL1y9gLiwAUQIRphBmCIh/88Y9uCZ0jTD1WFMiyBCYAmTbsCUSgnkBZ8qCSlBsAAAIcooRVNOrsgAAAABJRU5ErkJggg=="},{"path":"D:\\simon\\Minecraft\\Minecraft Assets\\minecraft\\textures\\item\\iron_nugget.png","name":"iron_nugget.png","folder":"item","namespace":"minecraft","id":"18","group":"","width":16,"height":16,"uv_width":16,"uv_height":16,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"172a1529-1546-1a60-5de9-be6c847c3e9a","relative_path":"D:/simon/Minecraft/Minecraft Assets/minecraft/textures/item/iron_nugget.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAJRJREFUOE9jZKAQMFKon2E4GxARn/EfFD4rFs7A602skiDNSZlFDPLivAz1DY3wcMZmGIYBIM2NDfUMksLcYI3P335lOHnxOpg9vaeJ4fiRAyh6sBowa3IXWCMIgDRfvHsezD62fjNxBqRmFzP8/QcOAob6kjS4F9BtB0lgDQNLGweIbgYGDBvRE95wTkjEZjKKwwAAUdQ2EVuBBVwAAAAASUVORK5CYII="}]} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/factory_board/block.json b/src/main/resources/assets/create/models/block/factory_board/block.json deleted file mode 100644 index cd848767f9..0000000000 --- a/src/main/resources/assets/create/models/block/factory_board/block.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "credit": "Made with Blockbench", - "parent": "create:block/large_wheels", - "textures": { - "2": "create:block/flap_display_front", - "3": "create:block/dark_metal_block", - "4": "create:block/flap_display_side", - "5": "create:block/flap_display_top", - "6": "create:block/flap_display_inside", - "particle": "create:block/flap_display_front" - }, - "elements": [ - { - "from": [0, 0, 3], - "to": [16, 16, 6], - "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 6]}, - "faces": { - "north": {"uv": [0, 0, 16, 16], "texture": "#2"}, - "east": {"uv": [13, 0, 16, 16], "texture": "#4"}, - "south": {"uv": [0, 0, 16, 16], "texture": "#6"}, - "west": {"uv": [0, 0, 3, 16], "texture": "#4"}, - "up": {"uv": [0, 0, 3, 16], "rotation": 90, "texture": "#5"}, - "down": {"uv": [7, 0, 10, 16], "rotation": 90, "texture": "#5"} - } - }, - { - "from": [0, 0, 10], - "to": [16, 16, 13], - "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 6]}, - "faces": { - "north": {"uv": [0, 0, 16, 16], "texture": "#6"}, - "east": {"uv": [3, 0, 6, 16], "texture": "#4"}, - "south": {"uv": [0, 0, 16, 16], "texture": "#3"}, - "west": {"uv": [10, 0, 13, 16], "texture": "#4"}, - "up": {"uv": [7, 0, 10, 16], "rotation": 90, "texture": "#5"}, - "down": {"uv": [0, 0, 3, 16], "rotation": 90, "texture": "#5"} - } - }, - { - "from": [0, 0, 6], - "to": [16, 16, 10], - "faces": { - "east": {"uv": [6, 0, 10, 16], "texture": "#4"}, - "west": {"uv": [6, 0, 10, 16], "texture": "#4"}, - "up": {"uv": [3, 0, 7, 16], "rotation": 90, "texture": "#5"}, - "down": {"uv": [3, 0, 7, 16], "rotation": 90, "texture": "#5"} - } - }, - { - "from": [15.95, 0.05, 6], - "to": [0.05, 15.95, 10], - "faces": { - "east": {"uv": [6, 0, 10, 16], "texture": "#4"}, - "west": {"uv": [6, 0, 10, 16], "texture": "#4"}, - "up": {"uv": [3, 0, 7, 16], "rotation": 90, "texture": "#5"}, - "down": {"uv": [3, 0, 7, 16], "rotation": 90, "texture": "#5"} - } - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/factory_panel/block.json b/src/main/resources/assets/create/models/block/factory_panel/block.json index 8618c13555..93debc0beb 100644 --- a/src/main/resources/assets/create/models/block/factory_panel/block.json +++ b/src/main/resources/assets/create/models/block/factory_panel/block.json @@ -1,50 +1,8 @@ { "credit": "Made with Blockbench", "textures": { - "0": "create:block/factory_panel", - "particle": "create:block/factory_panel" + "particle": "create:block/industrial_iron_block" }, - "elements": [ - { - "from": [11, -0.95, 2], - "to": [14, 2.05, 14], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [13, 13, 16, 16], "rotation": 270, "texture": "#0"}, - "east": {"uv": [0, 13, 12, 16], "texture": "#0"}, - "south": {"uv": [13, 13, 16, 16], "rotation": 90, "texture": "#0"}, - "west": {"uv": [0, 13, 12, 16], "rotation": 180, "texture": "#0"}, - "up": {"uv": [13, 0, 16, 12], "rotation": 180, "texture": "#0"}, - "down": {"uv": [13, 0, 16, 12], "texture": "#0"} - } - }, - { - "from": [2, -0.95, 2], - "to": [5, 2.05, 14], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [13, 13, 16, 16], "rotation": 270, "texture": "#0"}, - "east": {"uv": [0, 13, 12, 16], "texture": "#0"}, - "south": {"uv": [13, 13, 16, 16], "rotation": 90, "texture": "#0"}, - "west": {"uv": [0, 13, 12, 16], "rotation": 180, "texture": "#0"}, - "up": {"uv": [13, 0, 16, 12], "rotation": 180, "texture": "#0"}, - "down": {"uv": [13, 0, 16, 12], "texture": "#0"} - } - }, - { - "from": [2.5, 1, 2.5], - "to": [13.5, 3, 13.5], - "rotation": {"angle": -45, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [0, 11, 12, 12], "rotation": 180, "texture": "#0"}, - "east": {"uv": [12, 0, 10, 12], "rotation": 270, "texture": "#0"}, - "south": {"uv": [10, 0, 12, 12], "rotation": 90, "texture": "#0"}, - "west": {"uv": [11, 0, 12, 12], "rotation": 90, "texture": "#0"}, - "up": {"uv": [0, 0, 12, 12], "rotation": 180, "texture": "#0"}, - "down": {"uv": [0, 0, 12, 12], "texture": "#0"} - } - } - ], "display": { "thirdperson_righthand": { "rotation": [75, 45, 0], diff --git a/src/main/resources/assets/create/models/block/factory_panel/bulb_light.json b/src/main/resources/assets/create/models/block/factory_panel/bulb_light.json new file mode 100644 index 0000000000..57e05a3be1 --- /dev/null +++ b/src/main/resources/assets/create/models/block/factory_panel/bulb_light.json @@ -0,0 +1,22 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/factory_panel", + "particle": "create:block/factory_panel" + }, + "elements": [ + { + "from": [0, 1, 6], + "to": [2, 3, 8], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [3, 8, 5, 10], "texture": "#0"}, + "east": {"uv": [3, 8, 5, 10], "rotation": 90, "texture": "#0"}, + "south": {"uv": [3, 8, 5, 10], "rotation": 270, "texture": "#0"}, + "west": {"uv": [3, 8, 5, 10], "texture": "#0"}, + "up": {"uv": [3, 8, 5, 10], "rotation": 180, "texture": "#0"}, + "down": {"uv": [3, 8, 5, 10], "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/factory_panel/connections/arrow_east.json b/src/main/resources/assets/create/models/block/factory_panel/connections/arrow_east.json new file mode 100644 index 0000000000..4e5ea7ad1f --- /dev/null +++ b/src/main/resources/assets/create/models/block/factory_panel/connections/arrow_east.json @@ -0,0 +1,18 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/factory_panel_connections", + "particle": "create:block/factory_panel_connections" + }, + "elements": [ + { + "from": [0, 0.1, -2], + "to": [8, 0.15, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 0, -2]}, + "faces": { + "up": {"uv": [8, 8, 16, 12], "rotation": 180, "texture": "#0"}, + "down": {"uv": [8, 12, 16, 8], "rotation": 180, "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/factory_panel/connections/arrow_north.json b/src/main/resources/assets/create/models/block/factory_panel/connections/arrow_north.json new file mode 100644 index 0000000000..cc945448c3 --- /dev/null +++ b/src/main/resources/assets/create/models/block/factory_panel/connections/arrow_north.json @@ -0,0 +1,18 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/factory_panel_connections", + "particle": "create:block/factory_panel_connections" + }, + "elements": [ + { + "from": [-2, 0.1, -8], + "to": [2, 0.15, 0], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, -8]}, + "faces": { + "up": {"uv": [12, 0, 16, 8], "rotation": 180, "texture": "#0"}, + "down": {"uv": [12, 8, 16, 0], "rotation": 180, "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/factory_panel/connections/arrow_south.json b/src/main/resources/assets/create/models/block/factory_panel/connections/arrow_south.json new file mode 100644 index 0000000000..4753a90adf --- /dev/null +++ b/src/main/resources/assets/create/models/block/factory_panel/connections/arrow_south.json @@ -0,0 +1,17 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/factory_panel_connections", + "particle": "create:block/factory_panel_connections" + }, + "elements": [ + { + "from": [-2, 0.1, 0], + "to": [2, 0.15, 8], + "faces": { + "up": {"uv": [8, 0, 12, 8], "rotation": 180, "texture": "#0"}, + "down": {"uv": [8, 8, 12, 0], "rotation": 180, "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/factory_panel/connections/arrow_west.json b/src/main/resources/assets/create/models/block/factory_panel/connections/arrow_west.json new file mode 100644 index 0000000000..a412074255 --- /dev/null +++ b/src/main/resources/assets/create/models/block/factory_panel/connections/arrow_west.json @@ -0,0 +1,18 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/factory_panel_connections", + "particle": "create:block/factory_panel_connections" + }, + "elements": [ + { + "from": [-8, 0.1, -2], + "to": [0, 0.15, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [-6, 0, -2]}, + "faces": { + "up": {"uv": [8, 12, 16, 16], "rotation": 180, "texture": "#0"}, + "down": {"uv": [8, 16, 16, 12], "rotation": 180, "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/factory_panel/connections/line_east.json b/src/main/resources/assets/create/models/block/factory_panel/connections/line_east.json new file mode 100644 index 0000000000..50dad03227 --- /dev/null +++ b/src/main/resources/assets/create/models/block/factory_panel/connections/line_east.json @@ -0,0 +1,18 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/factory_panel_connections", + "particle": "create:block/factory_panel_connections" + }, + "elements": [ + { + "from": [0, 0.1, -2], + "to": [8, 0.15, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 0, -2]}, + "faces": { + "up": {"uv": [0, 8, 8, 12], "rotation": 180, "texture": "#0"}, + "down": {"uv": [0, 12, 8, 8], "rotation": 180, "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/factory_panel/connections/line_north.json b/src/main/resources/assets/create/models/block/factory_panel/connections/line_north.json new file mode 100644 index 0000000000..424cebf948 --- /dev/null +++ b/src/main/resources/assets/create/models/block/factory_panel/connections/line_north.json @@ -0,0 +1,18 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/factory_panel_connections", + "particle": "create:block/factory_panel_connections" + }, + "elements": [ + { + "from": [-2, 0.1, -8], + "to": [2, 0.15, 0], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, -8]}, + "faces": { + "up": {"uv": [4, 0, 8, 8], "rotation": 180, "texture": "#0"}, + "down": {"uv": [4, 8, 8, 0], "rotation": 180, "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/factory_panel/connections/line_south.json b/src/main/resources/assets/create/models/block/factory_panel/connections/line_south.json new file mode 100644 index 0000000000..3ad4f16b9b --- /dev/null +++ b/src/main/resources/assets/create/models/block/factory_panel/connections/line_south.json @@ -0,0 +1,17 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/factory_panel_connections", + "particle": "create:block/factory_panel_connections" + }, + "elements": [ + { + "from": [-2, 0.1, 0], + "to": [2, 0.15, 8], + "faces": { + "up": {"uv": [0, 0, 4, 8], "rotation": 180, "texture": "#0"}, + "down": {"uv": [0, 8, 4, 0], "rotation": 180, "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/factory_panel/connections/line_west.json b/src/main/resources/assets/create/models/block/factory_panel/connections/line_west.json new file mode 100644 index 0000000000..aaeb8b511a --- /dev/null +++ b/src/main/resources/assets/create/models/block/factory_panel/connections/line_west.json @@ -0,0 +1,18 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/factory_panel_connections", + "particle": "create:block/factory_panel_connections" + }, + "elements": [ + { + "from": [-8, 0.1, -2], + "to": [0, 0.15, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [-6, 0, -2]}, + "faces": { + "up": {"uv": [0, 12, 8, 16], "rotation": 180, "texture": "#0"}, + "down": {"uv": [0, 16, 8, 12], "rotation": 180, "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/factory_panel/input.json b/src/main/resources/assets/create/models/block/factory_panel/input.json deleted file mode 100644 index e5cb59d0cc..0000000000 --- a/src/main/resources/assets/create/models/block/factory_panel/input.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "credit": "Made with Blockbench", - "parent": "block/block", - "textures": { - "2": "create:block/andesite_casing_piston", - "3": "create:block/girder", - "particle": "create:block/andesite_casing_piston" - }, - "elements": [ - { - "name": "Top", - "from": [6, 6, 12.95], - "to": [10, 10, 14.95], - "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 16.2]}, - "faces": { - "north": {"uv": [6, 8, 10, 12], "rotation": 180, "texture": "#2"}, - "east": {"uv": [10, 8, 8, 12], "rotation": 180, "texture": "#2"}, - "west": {"uv": [6, 12, 8, 8], "texture": "#2"}, - "up": {"uv": [6, 12, 10, 10], "texture": "#2"}, - "down": {"uv": [6, 10, 10, 8], "texture": "#2"} - } - }, - { - "name": "Top", - "from": [5, 5, 14.75], - "to": [11, 11, 15.75], - "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 16]}, - "faces": { - "north": {"uv": [1.5, 0.5, 4.5, 3.5], "rotation": 90, "texture": "#3"}, - "east": {"uv": [9, 12.5, 12, 13], "rotation": 90, "texture": "#3"}, - "south": {"uv": [9, 9, 12, 12], "rotation": 90, "texture": "#3"}, - "west": {"uv": [9, 12.5, 12, 13], "rotation": 90, "texture": "#3"}, - "up": {"uv": [8, 9, 8.5, 12], "rotation": 90, "texture": "#3"}, - "down": {"uv": [12.5, 9, 13, 12], "rotation": 90, "texture": "#3"} - } - } - ], - "display": { - "gui": { - "rotation": [30, 45, 0], - "translation": [0, 2.5, 0], - "scale": [0.625, 0.625, 0.625] - }, - "fixed": { - "rotation": [270, 0, 0], - "translation": [0, 0, -3], - "scale": [0.5, 0.5, 0.5] - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/factory_panel/item.json b/src/main/resources/assets/create/models/block/factory_panel/item.json new file mode 100644 index 0000000000..7a0049e96b --- /dev/null +++ b/src/main/resources/assets/create/models/block/factory_panel/item.json @@ -0,0 +1,106 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/factory_panel", + "2": "create:block/display_link", + "particle": "create:block/factory_panel" + }, + "elements": [ + { + "from": [5, 0, 5], + "to": [11, 2, 11], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 0, 9]}, + "faces": { + "north": {"uv": [9, 6, 15, 8], "texture": "#0"}, + "east": {"uv": [8, 1, 10, 7], "rotation": 270, "texture": "#0"}, + "south": {"uv": [9, 0, 15, 2], "rotation": 180, "texture": "#0"}, + "west": {"uv": [14, 1, 16, 7], "rotation": 90, "texture": "#0"}, + "up": {"uv": [1, 1, 7, 7], "rotation": 180, "texture": "#0"} + } + }, + { + "from": [4, 0, 4], + "to": [12, 0, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 0, 9]}, + "faces": { + "up": {"uv": [0, 0, 8, 8], "rotation": 180, "texture": "#0"}, + "down": {"uv": [8, 8, 16, 16], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [4, 1, 10], + "to": [6, 3, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [4, 1, 10]}, + "faces": { + "north": {"uv": [13.5, 7, 14.5, 8], "texture": "#2"}, + "east": {"uv": [13.5, 7, 14.5, 8], "texture": "#2"}, + "south": {"uv": [15, 7, 16, 8], "texture": "#2"}, + "west": {"uv": [15, 7, 16, 8], "texture": "#2"}, + "up": {"uv": [14.5, 7, 15.5, 8], "texture": "#2"}, + "down": {"uv": [14, 6.5, 15, 7.5], "texture": "#2"} + } + }, + { + "from": [4.975, 0, 10], + "to": [5.025, 1, 12], + "rotation": {"angle": -45, "axis": "y", "origin": [5, 0.5, 11]}, + "faces": { + "east": {"uv": [14, 8, 16, 9], "texture": "#0"}, + "west": {"uv": [14, 8, 16, 9], "texture": "#0"} + } + }, + { + "from": [4, 0, 10.975], + "to": [6, 1, 11.025], + "rotation": {"angle": -45, "axis": "y", "origin": [5, 0.5, 11]}, + "faces": { + "north": {"uv": [14, 8, 16, 9], "texture": "#0"}, + "south": {"uv": [14, 8, 16, 9], "texture": "#0"} + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 2.5], + "scale": [0.375, 0.375, 0.375] + }, + "thirdperson_lefthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 2.75], + "scale": [0.375, 0.375, 0.375] + }, + "firstperson_righthand": { + "rotation": [0, 45, 0], + "translation": [0, 3.75, 0.75], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 45, 0], + "translation": [0, 3.75, 0.75], + "scale": [0.4, 0.4, 0.4] + }, + "ground": { + "translation": [0, 3, 0], + "scale": [0.5, 0.5, 0.5] + }, + "gui": { + "rotation": [30, 135, 0], + "translation": [0, 5, 0] + }, + "head": { + "translation": [0, 14.25, 0] + }, + "fixed": { + "scale": [0.5, 0.5, 0.5] + } + }, + "groups": [ + { + "name": "group", + "origin": [9, 0.5, 7], + "color": 0, + "children": [0, 1, 2, 3, 4] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/factory_panel/panel.json b/src/main/resources/assets/create/models/block/factory_panel/panel.json new file mode 100644 index 0000000000..f0b0f9ae91 --- /dev/null +++ b/src/main/resources/assets/create/models/block/factory_panel/panel.json @@ -0,0 +1,38 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/factory_panel", + "particle": "create:block/factory_panel" + }, + "elements": [ + { + "from": [1, 0, 1], + "to": [7, 2, 7], + "rotation": {"angle": 0, "axis": "y", "origin": [5, 0, 5]}, + "faces": { + "north": {"uv": [9, 6, 15, 8], "texture": "#0"}, + "east": {"uv": [8, 1, 10, 7], "rotation": 270, "texture": "#0"}, + "south": {"uv": [9, 0, 15, 2], "rotation": 180, "texture": "#0"}, + "west": {"uv": [14, 1, 16, 7], "rotation": 90, "texture": "#0"}, + "up": {"uv": [1, 1, 7, 7], "rotation": 180, "texture": "#0"} + } + }, + { + "from": [0, 0.05, 2], + "to": [8, 0.05, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [5, 0, 5]}, + "faces": { + "up": {"uv": [0, 2, 8, 6], "rotation": 180, "texture": "#0"}, + "down": {"uv": [10, 8, 14, 16], "rotation": 270, "texture": "#0"} + } + } + ], + "groups": [ + { + "name": "group", + "origin": [9, 0.5, 7], + "color": 0, + "children": [0, 1] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/factory_panel/panel_with_bulb.json b/src/main/resources/assets/create/models/block/factory_panel/panel_with_bulb.json new file mode 100644 index 0000000000..a8ed3dcbc7 --- /dev/null +++ b/src/main/resources/assets/create/models/block/factory_panel/panel_with_bulb.json @@ -0,0 +1,64 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/factory_panel", + "particle": "create:block/factory_panel" + }, + "elements": [ + { + "from": [1, 0, 1], + "to": [7, 2, 7], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [9, 6, 15, 8], "texture": "#0"}, + "east": {"uv": [8, 1, 10, 7], "rotation": 270, "texture": "#0"}, + "south": {"uv": [9, 0, 15, 2], "rotation": 180, "texture": "#0"}, + "west": {"uv": [14, 1, 16, 7], "rotation": 90, "texture": "#0"}, + "up": {"uv": [1, 1, 7, 7], "rotation": 180, "texture": "#0"} + } + }, + { + "from": [0, 0.05, 0], + "to": [8, 0.05, 8], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "up": {"uv": [0, 0, 8, 8], "rotation": 180, "texture": "#0"}, + "down": {"uv": [8, 8, 16, 16], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [0.5, 1.25, 6.5], + "to": [1.5, 2.25, 7.5], + "rotation": {"angle": 45, "axis": "y", "origin": [1, 1.75, 7]}, + "faces": { + "up": {"uv": [7, 8, 8, 9], "texture": "#0"} + } + }, + { + "from": [1, 0, 6], + "to": [1, 2, 8], + "rotation": {"angle": 45, "axis": "y", "origin": [1, 0.5, 7]}, + "faces": { + "east": {"uv": [6, 8, 8, 10], "texture": "#0"}, + "west": {"uv": [6, 8, 8, 10], "texture": "#0"} + } + }, + { + "from": [1, 0, 6], + "to": [1, 2, 8], + "rotation": {"angle": -45, "axis": "y", "origin": [1, 0.5, 7]}, + "faces": { + "east": {"uv": [6, 8, 8, 10], "texture": "#0"}, + "west": {"uv": [6, 8, 8, 10], "texture": "#0"} + } + } + ], + "groups": [ + { + "name": "group", + "origin": [9, 0.5, 7], + "color": 0, + "children": [0, 1, 2, 3, 4] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/factory_panel/timer.json b/src/main/resources/assets/create/models/block/factory_panel/timer.json deleted file mode 100644 index 00fd131501..0000000000 --- a/src/main/resources/assets/create/models/block/factory_panel/timer.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "credit": "Made with Blockbench", - "parent": "block/block", - "textures": { - "3": "create:block/girder", - "top": "create:block/diodes/pulse_timer/idle" - }, - "elements": [ - { - "name": "Top", - "from": [6, 6, 12.95], - "to": [10, 10, 14.95], - "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 16.2]}, - "faces": { - "north": {"uv": [6, 6, 10, 10], "rotation": 180, "texture": "#top"}, - "east": {"uv": [10, 6, 8, 10], "rotation": 180, "texture": "#top"}, - "west": {"uv": [6, 10, 8, 6], "texture": "#top"}, - "up": {"uv": [6, 10, 10, 8], "texture": "#top"}, - "down": {"uv": [6, 8, 10, 6], "texture": "#top"} - } - }, - { - "name": "Top", - "from": [5, 5, 14.75], - "to": [11, 11, 15.75], - "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 16]}, - "faces": { - "north": {"uv": [1.5, 0.5, 4.5, 3.5], "rotation": 90, "texture": "#3"}, - "east": {"uv": [9, 12.5, 12, 13], "rotation": 90, "texture": "#3"}, - "south": {"uv": [9, 9, 12, 12], "rotation": 90, "texture": "#3"}, - "west": {"uv": [9, 12.5, 12, 13], "rotation": 90, "texture": "#3"}, - "up": {"uv": [8, 9, 8.5, 12], "rotation": 90, "texture": "#3"}, - "down": {"uv": [12.5, 9, 13, 12], "rotation": 90, "texture": "#3"} - } - } - ], - "display": { - "gui": { - "rotation": [30, 45, 0], - "translation": [0, 2.5, 0], - "scale": [0.625, 0.625, 0.625] - }, - "fixed": { - "rotation": [270, 0, 0], - "translation": [0, 0, -3], - "scale": [0.5, 0.5, 0.5] - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/block/factory_board.png b/src/main/resources/assets/create/textures/block/factory_board.png deleted file mode 100644 index eca4ceb62c22138f84eecc2eb000bec60a345d7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFP@cil)z4*}Q$iB}1Fa}? diff --git a/src/main/resources/assets/create/textures/block/factory_panel.png b/src/main/resources/assets/create/textures/block/factory_panel.png index 8951d4ca2150c5e2e5b47ecde3812f0b39d7d4ed..891f3c6bc05107f6104aa847122dc0207f67ef5a 100644 GIT binary patch delta 435 zcmV;k0Zjhb0^S3V83+ad001BJ|6!3KAb$yPNLh0L01mX(jDb9z&(kNlnI*NC*aEk?4QWq=V65YOG==VKg-H7buYkZ;(ht zBaB!uU=fj5^;*$#`JTARBkd#cN$xwp-Z}T)bFP6VEH30!cRYdY%&aky>QgP@2!CQ$ ztHkb|XS`M`uusnnDKI&mRUylQ8MWjGx9p(iI2av>VSi%_fy5vh#oup>Fw*I?s<-zb zml;B*)rLpsNn~zi2f@-6Y7ciXk|Wq&U;cL5smz>Gmj?*At}B(9)X|khJkcwXKE`-# zy|Wkk7z>!DDGu&jam$F9QISN){C^1W!#nW=I+>C_!iH(x3w@0FHgR_|FB9->qIiD6 zZ;ay5q~?cb7kwB7p|*o#fY6Rq)FeDy6rOs=tVSbhw9`>vPdLYRX7BEOw<@ z#qr4n(2u`efdx2H;+;&PP%vZ)&CplS$%MLI#J7O)3FXiC;I(}Vcwv%W+8`!>E diC6yzzz5H8v-DX3X~qBm002ovPDHLkV1jz3%G3Y= delta 300 zcmcb|e1mC%BnLAC1A~SxfAB;_g?h^XpAgrKn(oT3#S<4ES-IhIa9X}oP}K6piz6c< z{QdnS!-DQyJNn|mSyK~>kMCc+esSN^!^6fe$llHgXo~)voToraxFpCg_&)|<*i?Im z11QZ|;1OBOz`%DHgc*8uy79n&`PYZ$s+Hev zX*p>mGGU93rmEo9($Bm}%NRlyZu|YpqwI;L^_t%=BTS}e`-r_3WU+X*H)aJ(V@v*G zkGFOQFH0QItd(i)V|2OC#<;Y}w*JI~Z4%O)Ef14yuQeEM4U;=|O!7tj!DoNwl+81g jeOq(+ndIdAZr##5s<}+(?EU^6=qv_LS3j3^P6NS%G~10G|-o2M->krKN?0gv^{d6Da1#vEV9@Vl4^s3;quT48OPWfehj-@Q5sC zVBk9l!i+m6X1@gr279_VhG+!0_AzoDFyLTL{_;OR?$NGuhZ5L>_O8<93Y2ww-mlQ^ zaaSpsTU@ui{nlA+nfpl(nD|c#hX`?ZdbG`xz2SH9=iUX1my*^BT(Lhdcr{c!zL{yJ TQlyd)(0B$ Date: Mon, 21 Oct 2024 17:26:15 +0200 Subject: [PATCH 085/515] UIs will be my demise - Added the configuration screen for factory panels --- .../FactoryPanelAddressInputScreen.java | 44 -- .../factoryBoard/FactoryPanelBehaviour.java | 31 +- .../FactoryPanelConfigurationPacket.java | 73 +++- .../FactoryPanelConnectionHandler.java | 17 +- .../factoryBoard/FactoryPanelPosition.java | 11 + .../factoryBoard/FactoryPanelScreen.java | 376 ++++++++++++++++++ .../packagerLink/RequestPromiseQueue.java | 29 +- .../create/foundation/gui/AllGuiTextures.java | 18 +- .../create/textures/gui/factory_panel.png | Bin 0 -> 1565 bytes 9 files changed, 532 insertions(+), 67 deletions(-) delete mode 100644 src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelAddressInputScreen.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java create mode 100644 src/main/resources/assets/create/textures/gui/factory_panel.png diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelAddressInputScreen.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelAddressInputScreen.java deleted file mode 100644 index 0228a66c36..0000000000 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelAddressInputScreen.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.simibubi.create.content.logistics.factoryBoard; - -import com.simibubi.create.AllPackets; - -import net.createmod.catnip.gui.AbstractSimiScreen; -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.gui.components.EditBox; -import net.minecraft.network.chat.Component; - -public class FactoryPanelAddressInputScreen extends AbstractSimiScreen { - - EditBox addressBox; - private FactoryPanelBehaviour behaviour; - - public FactoryPanelAddressInputScreen(FactoryPanelBehaviour behaviour) { - this.behaviour = behaviour; - } - - @Override - protected void init() { - int sizeX = 200; - int sizeY = 20; - setWindowSize(sizeX, sizeY); - super.init(); - clearWidgets(); - addressBox = new EditBox(font, guiLeft, guiTop, sizeX, sizeY, Component.empty()); - addressBox.setValue(behaviour.recipeAddress); - addRenderableWidget(addressBox); - } - - @Override - protected void renderWindow(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { - // TODO Auto-generated method stub - - } - - @Override - public void removed() { - super.removed(); - AllPackets.getChannel() - .sendToServer(new FactoryPanelConfigurationPacket(behaviour.getPanelPosition(), addressBox.getValue())); - } - -} diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java index 5c5d83a943..9b3630a846 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java @@ -68,6 +68,8 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { public int recipeOutput; public LerpedFloat bulb; public PanelSlot slot; + public int promiseClearingInterval; + public boolean forceClearPromises; private boolean active; private int lastReportedLevelInStorage; @@ -85,6 +87,8 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { this.recipeAddress = ""; this.recipeOutput = 1; this.active = false; + this.forceClearPromises = false; + this.promiseClearingInterval = -1; this.bulb = LerpedFloat.linear() .startWithValue(0) .chase(0, 0.45, Chaser.EXP); @@ -185,6 +189,8 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { } public void addConnection(FactoryPanelPosition fromPos) { + if (targetedBy.size() >= 9) + return; FactoryPanelBehaviour source = at(getWorld(), fromPos); if (source == null) return; @@ -209,10 +215,8 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { if (!player.level().isClientSide) return; - if (isConnector) { - FactoryPanelConnectionHandler.panelClicked(getWorld(), getPanelPosition()); + if (FactoryPanelConnectionHandler.panelClicked(getWorld(), player, getPanelPosition())) return; - } DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> displayScreen(player)); } @@ -280,7 +284,20 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { UUID freqId = ((StockCheckingBlockEntity) blockEntity).behaviour.freqId; RequestPromiseQueue promises = Create.LOGISTICS.getQueuedPromises(freqId); - return promises == null ? 0 : promises.getTotalPromised(getFilter()); + if (forceClearPromises) + promises.forceClear(getFilter()); + + return promises == null ? 0 + : promises.getTotalPromisedAndRemoveExpired(getFilter(), getPromiseExpiryTimeInTicks()); + } + + private int getPromiseExpiryTimeInTicks() { + if (promiseClearingInterval == -1) + return -1; + if (promiseClearingInterval == 0) + return 20 * 30; + + return promiseClearingInterval * 20 * 60; } @Override @@ -299,6 +316,7 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { panelTag.put("TargetedBy", NBTHelper.writeCompoundList(targetedBy.values(), FactoryPanelConnection::write)); panelTag.putString("RecipeAddress", recipeAddress); panelTag.putInt("RecipeOutput", recipeOutput); + panelTag.putInt("PromiseClearingInterval", promiseClearingInterval); nbt.put(CreateLang.asId(slot.name()), panelTag); } @@ -319,6 +337,7 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { lastReportedPromises = panelTag.getInt("LastPromised"); satisfied = panelTag.getBoolean("Satisfied"); promisedSatisfied = panelTag.getBoolean("PromisedSatisfied"); + promiseClearingInterval = panelTag.getInt("PromiseClearingInterval"); targeting.clear(); NBTHelper.iterateCompoundList(panelTag.getList("Targeting", Tag.TAG_COMPOUND), @@ -461,9 +480,9 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { } @OnlyIn(value = Dist.CLIENT) - private void displayScreen(Player player) { + public void displayScreen(Player player) { if (player instanceof LocalPlayer) - ScreenOpener.open(new FactoryPanelAddressInputScreen(this)); + ScreenOpener.open(new FactoryPanelScreen(this)); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConfigurationPacket.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConfigurationPacket.java index 3ef6863c7e..6fd86e0f0e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConfigurationPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConfigurationPacket.java @@ -1,5 +1,11 @@ package com.simibubi.create.content.logistics.factoryBoard; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; + +import javax.annotation.Nullable; + import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBlock.PanelSlot; import com.simibubi.create.foundation.networking.BlockEntityConfigurationPacket; @@ -9,11 +15,23 @@ public class FactoryPanelConfigurationPacket extends BlockEntityConfigurationPac private PanelSlot slot; private String address; + private Map inputAmounts; + private int outputAmount; + private int promiseClearingInterval; + private FactoryPanelPosition removeConnection; + private boolean clearPromises; - public FactoryPanelConfigurationPacket(FactoryPanelPosition position, String address) { + public FactoryPanelConfigurationPacket(FactoryPanelPosition position, String address, + Map inputAmounts, int outputAmount, int promiseClearingInterval, + @Nullable FactoryPanelPosition removeConnection, boolean clearPromises) { super(position.pos()); - this.slot = position.slot(); this.address = address; + this.inputAmounts = inputAmounts; + this.outputAmount = outputAmount; + this.promiseClearingInterval = promiseClearingInterval; + this.removeConnection = removeConnection; + this.clearPromises = clearPromises; + this.slot = position.slot(); } public FactoryPanelConfigurationPacket(FriendlyByteBuf buffer) { @@ -24,21 +42,66 @@ public class FactoryPanelConfigurationPacket extends BlockEntityConfigurationPac protected void writeSettings(FriendlyByteBuf buffer) { buffer.writeVarInt(slot.ordinal()); buffer.writeUtf(address); + buffer.writeVarInt(inputAmounts.size()); + for (Entry entry : inputAmounts.entrySet()) { + entry.getKey() + .send(buffer); + buffer.writeVarInt(entry.getValue()); + } + buffer.writeVarInt(outputAmount); + buffer.writeVarInt(promiseClearingInterval); + buffer.writeBoolean(removeConnection != null); + if (removeConnection != null) + removeConnection.send(buffer); + buffer.writeBoolean(clearPromises); } @Override protected void readSettings(FriendlyByteBuf buffer) { slot = PanelSlot.values()[buffer.readVarInt()]; address = buffer.readUtf(); + inputAmounts = new HashMap<>(); + int entries = buffer.readVarInt(); + for (int i = 0; i < entries; i++) + inputAmounts.put(FactoryPanelPosition.receive(buffer), buffer.readVarInt()); + outputAmount = buffer.readVarInt(); + promiseClearingInterval = buffer.readVarInt(); + if (buffer.readBoolean()) + removeConnection = FactoryPanelPosition.receive(buffer); + clearPromises = buffer.readBoolean(); } @Override protected void applySettings(FactoryPanelBlockEntity be) { FactoryPanelBehaviour behaviour = be.panels.get(slot); - if (behaviour != null) { - behaviour.recipeAddress = address; - be.notifyUpdate(); + if (behaviour == null) + return; + + behaviour.recipeAddress = address; + + for (Entry entry : inputAmounts.entrySet()) { + FactoryPanelPosition key = entry.getKey(); + FactoryPanelConnection connection = behaviour.targetedBy.get(key); + if (connection != null) + behaviour.targetedBy.put(key, new FactoryPanelConnection(key, entry.getValue())); } + + behaviour.recipeOutput = outputAmount; + behaviour.promiseClearingInterval = promiseClearingInterval; + + if (removeConnection != null) { + behaviour.targetedBy.remove(removeConnection); + FactoryPanelBehaviour source = FactoryPanelBehaviour.at(be.getLevel(), removeConnection); + if (source != null) { + source.targeting.remove(behaviour.getPanelPosition()); + source.blockEntity.sendData(); + } + } + + if (clearPromises) + behaviour.forceClearPromises = true; + + be.notifyUpdate(); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionHandler.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionHandler.java index 9524d34773..540ceb7551 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionHandler.java @@ -2,21 +2,26 @@ package com.simibubi.create.content.logistics.factoryBoard; import com.simibubi.create.AllPackets; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.LevelAccessor; public class FactoryPanelConnectionHandler { static FactoryPanelPosition connectingFrom; - public static void panelClicked(LevelAccessor level, FactoryPanelPosition panelPos) { - if (connectingFrom == null) { - connectingFrom = panelPos; - return; + public static boolean panelClicked(LevelAccessor level, Player player, FactoryPanelPosition panelPos) { + if (connectingFrom == null) + return false; + FactoryPanelBehaviour at = FactoryPanelBehaviour.at(level, connectingFrom); + if (at == null) { + connectingFrom = null; + return false; } - +// at.displayScreen(player); AllPackets.getChannel() - .sendToServer(new FactoryPanelConnectionPacket(connectingFrom, panelPos)); + .sendToServer(new FactoryPanelConnectionPacket(panelPos, connectingFrom)); connectingFrom = null; + return true; } } diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelPosition.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelPosition.java index 925dee1cd9..e2cd7005f4 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelPosition.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelPosition.java @@ -5,6 +5,7 @@ import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBlock.Pane import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; +import net.minecraft.network.FriendlyByteBuf; import net.minecraft.util.Mth; public record FactoryPanelPosition(BlockPos pos, PanelSlot slot) { @@ -20,4 +21,14 @@ public record FactoryPanelPosition(BlockPos pos, PanelSlot slot) { return nbt; } + public void send(FriendlyByteBuf buffer) { + buffer.writeBlockPos(pos); + buffer.writeVarInt(slot.ordinal()); + } + + public static FactoryPanelPosition receive(FriendlyByteBuf buffer) { + return new FactoryPanelPosition(buffer.readBlockPos(), + PanelSlot.values()[Mth.positiveModulo(buffer.readVarInt(), 4)]); + } + } diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java new file mode 100644 index 0000000000..96aad7629d --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java @@ -0,0 +1,376 @@ +package com.simibubi.create.content.logistics.factoryBoard; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.annotation.Nullable; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllItems; +import com.simibubi.create.AllPackets; +import com.simibubi.create.content.logistics.BigItemStack; +import com.simibubi.create.content.trains.station.NoShadowFontWrapper; +import com.simibubi.create.foundation.gui.AllGuiTextures; +import com.simibubi.create.foundation.gui.AllIcons; +import com.simibubi.create.foundation.gui.widget.IconButton; +import com.simibubi.create.foundation.gui.widget.ScrollInput; +import com.simibubi.create.foundation.utility.CreateLang; + +import net.createmod.catnip.gui.AbstractSimiScreen; +import net.createmod.catnip.gui.element.GuiGameElement; +import net.createmod.catnip.utility.Iterate; +import net.minecraft.ChatFormatting; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.EditBox; +import net.minecraft.network.chat.Component; +import net.minecraft.util.Mth; +import net.minecraft.world.item.ItemStack; + +public class FactoryPanelScreen extends AbstractSimiScreen { + + private EditBox addressBox; + private IconButton confirmButton; + private IconButton newInputButton; + private ScrollInput promiseExpiration; + private FactoryPanelBehaviour behaviour; + private int displayedExtraRows; + + private BigItemStack outputConfig; + private List inputConfig; + private List connections; + + public FactoryPanelScreen(FactoryPanelBehaviour behaviour) { + this.behaviour = behaviour; + minecraft = Minecraft.getInstance(); + updateConfigs(); + } + + private void updateConfigs() { + connections = new ArrayList<>(behaviour.targetedBy.values()); + outputConfig = new BigItemStack(behaviour.getFilter(), behaviour.recipeOutput); + inputConfig = connections.stream() + .map(c -> { + FactoryPanelBehaviour b = FactoryPanelBehaviour.at(minecraft.level, c.from()); + return b == null ? new BigItemStack(ItemStack.EMPTY, 0) : new BigItemStack(b.getFilter(), c.amount()); + }) + .toList(); + } + + @Override + protected void init() { + int sizeX = 200; + int sizeY = 75 + middleHeight(); + setWindowSize(sizeX, sizeY); + super.init(); + clearWidgets(); + int x = guiLeft; + int y = guiTop; + + if (addressBox == null) { + addressBox = + new EditBox(new NoShadowFontWrapper(font), x + 38, y + 30 + middleHeight(), 110, 10, Component.empty()); + addressBox.setValue(behaviour.recipeAddress); + addressBox.setBordered(false); + addressBox.setTextColor(0x555555); + addressBox.setFocused(false); + addressBox.mouseClicked(0, 0, 0); + addressBox.setMaxLength(25); + } + addressBox.setY(y + 30 + middleHeight()); + addRenderableWidget(addressBox); + + confirmButton = new IconButton(x + sizeX - 61, y + sizeY - 22, AllIcons.I_CONFIRM); + confirmButton.withCallback(() -> minecraft.setScreen(null)); + addRenderableWidget(confirmButton); + + promiseExpiration = new ScrollInput(x + 102, y + 54 + middleHeight(), 25, 16).withRange(-1, 31) + .titled(CreateLang.temporaryText("Promises expire after") + .component()); + promiseExpiration.setState(behaviour.promiseClearingInterval); + addRenderableWidget(promiseExpiration); + + if (behaviour.targetedBy.size() < 9) { + int slot = behaviour.targetedBy.size(); + newInputButton = new IconButton(x + 19 + (slot % 3 * 18), y + 27 + (slot / 3 * 18), AllIcons.I_ADD); + newInputButton.withCallback(() -> { + FactoryPanelConnectionHandler.connectingFrom = behaviour.getPanelPosition(); + minecraft.setScreen(null); + }); + newInputButton.setToolTip(CreateLang.temporaryText("Connect an input panel") + .component()); + addRenderableWidget(newInputButton); + } + + displayedExtraRows = Math.min((behaviour.targetedBy.size() / 3), 2); + } + + private int middleHeight() { + return AllGuiTextures.FACTORY_PANEL_MIDDLE.getHeight() + Math.min((behaviour.targetedBy.size() / 3), 2) * 18; + } + + @Override + public void tick() { + super.tick(); + if (inputConfig.size() != behaviour.targetedBy.size() + || displayedExtraRows != Math.min((behaviour.targetedBy.size() / 3), 2)) { + updateConfigs(); + init(); + } + promiseExpiration.titled(CreateLang + .temporaryText(promiseExpiration.getState() == -1 ? "Promises do not expire" : "Promises expire after:") + .component()); + } + + @Override + protected void renderWindow(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + int x = guiLeft; + int y = guiTop; + + // BG + AllGuiTextures.FACTORY_PANEL_TOP.render(graphics, x, y); + y += AllGuiTextures.FACTORY_PANEL_TOP.getHeight(); + for (int i = 0; i < displayedExtraRows + 1; i++) + AllGuiTextures.FACTORY_PANEL_MIDDLE.render(graphics, x, y + i * 18); + y += middleHeight(); + AllGuiTextures.FACTORY_PANEL_BOTTOM.render(graphics, x, y); + y = guiTop; + + // RECIPE + int slot = 0; + for (int frame : Iterate.zeroAndOne) { + AllGuiTextures sprite = + frame == 0 ? AllGuiTextures.FACTORY_PANEL_SLOT_FRAME : AllGuiTextures.FACTORY_PANEL_SLOT; + for (slot = 0; slot < behaviour.targetedBy.size(); slot++) + sprite.render(graphics, x + 18 + frame + (slot % 3 * 18), y + 26 + frame + (slot / 3 * 18)); + if (slot < 9) + sprite.render(graphics, x + 18 + frame + (slot % 3 * 18), y + 26 + frame + (slot / 3 * 18)); + } + + slot = 0; + for (BigItemStack itemStack : inputConfig) { + int inputX = x + 20 + (slot % 3 * 18); + int inputY = y + 28 + (slot / 3 * 18); + graphics.renderItem(itemStack.stack, inputX, inputY); + graphics.renderItemDecorations(font, behaviour.getFilter(), inputX, inputY, itemStack.count + ""); + slot++; + if (mouseX >= inputX - 1 && mouseX < inputX - 1 + 18 && mouseY >= inputY - 1 && mouseY < inputY - 1 + 18) { + graphics.renderComponentTooltip(font, List.of(CreateLang.temporaryText("Send ") + .add(CreateLang.itemName(itemStack.stack) + .add(CreateLang.text(" x" + itemStack.count))) + .color(ScrollInput.HEADER_RGB) + .component(), + CreateLang.temporaryText("Scroll to change amount") + .style(ChatFormatting.DARK_GRAY) + .style(ChatFormatting.ITALIC) + .component(), + CreateLang.temporaryText("Left-Click to disconnect") + .style(ChatFormatting.DARK_GRAY) + .style(ChatFormatting.ITALIC) + .component()), + mouseX, mouseY); + } + } + + AllGuiTextures.FACTORY_PANEL_ARROW.render(graphics, x + 70 + Mth.clamp(behaviour.targetedBy.size(), 0, 2) * 9, + y + 16 + middleHeight() / 2); + int outputX = x + 128; + int outputY = y + 16 + middleHeight() / 2; + AllGuiTextures.FACTORY_PANEL_SLOT_FRAME.render(graphics, outputX - 2, outputY - 2); + + graphics.renderItem(outputConfig.stack, outputX, outputY); + graphics.renderItemDecorations(font, behaviour.getFilter(), outputX, outputY, outputConfig.count + ""); + + if (mouseX >= outputX - 1 && mouseX < outputX - 1 + 18 && mouseY >= outputY - 1 && mouseY < outputY - 1 + 18) { + graphics.renderComponentTooltip(font, List.of(CreateLang.temporaryText("Expect ") + .add(CreateLang.itemName(outputConfig.stack) + .add(CreateLang.text(" x" + outputConfig.count))) + .color(ScrollInput.HEADER_RGB) + .component(), + CreateLang.temporaryText("Scroll to change amount") + .style(ChatFormatting.DARK_GRAY) + .style(ChatFormatting.ITALIC) + .component()), + mouseX, mouseY); + } + + PoseStack ms = graphics.pose(); + ms.pushPose(); + ms.translate(0, 0, 10); + + // ADDRESS + if (addressBox.isHovered() && !addressBox.isFocused()) { + if (addressBox.getValue() + .isBlank()) + graphics.renderComponentTooltip(font, List.of(CreateLang.temporaryText("Send inputs to...") + .color(ScrollInput.HEADER_RGB) + .component(), + CreateLang.temporaryText("Enter an address where") + .style(ChatFormatting.GRAY) + .component(), + CreateLang.temporaryText("this recipe is carried out.") + .style(ChatFormatting.GRAY) + .component(), + CreateLang.translate("gui.schedule.lmb_edit") + .style(ChatFormatting.DARK_GRAY) + .style(ChatFormatting.ITALIC) + .component()), + mouseX, mouseY); + else + graphics.renderComponentTooltip(font, List.of(CreateLang.temporaryText("Sending inputs to") + .color(ScrollInput.HEADER_RGB) + .component(), + CreateLang.temporaryText("'" + addressBox.getValue() + "'") + .style(ChatFormatting.GRAY) + .component()), + mouseX, mouseY); + } + + // TITLE + Component title = CreateLang.temporaryText("Logistics Recipe") + .component(); + graphics.drawString(font, title, x + 82 - font.width(title) / 2, y + 7, 0x3D3C48, false); + + // ITEM PREVIEW + ms.pushPose(); + ms.translate(0, middleHeight() - 25, 0); + GuiGameElement.of(AllBlocks.FACTORY_PANEL.asStack()) + .scale(4) + .at(0, 0, -200) + .render(graphics, x + 165, y + 55); + if (!behaviour.getFilter() + .isEmpty()) { + GuiGameElement.of(behaviour.getFilter()) + .scale(1.625) + .at(0, 0, 200) + .render(graphics, x + 184, y + 68); + } + ms.popPose(); + + // PROMISES + int state = promiseExpiration.getState(); + graphics.drawString(font, CreateLang.temporaryText(state == -1 ? " /" : state == 0 ? "30s" : state + "m") + .component(), promiseExpiration.getX() + 3, promiseExpiration.getY() + 4, 0xffeeeeee, true); + + ItemStack asStack = AllItems.CARDBOARD_PACKAGE_12x12.asStack(); + int itemY = y + 54 + middleHeight(); + int itemX = x + 78; + graphics.renderItem(asStack, itemX, itemY); + int promised = behaviour.getPromised(); + graphics.renderItemDecorations(font, asStack, itemX, itemY, promised + ""); + + if (mouseX >= itemX && mouseX < itemX + 16 && mouseY >= itemY && mouseY < itemY + 16) { + List promiseTip = List.of(); + + if (promised == 0) { + promiseTip = List.of(CreateLang.temporaryText("No open promises") + .color(ScrollInput.HEADER_RGB) + .component(), + CreateLang.temporaryText("When inputs are sent, a promise") + .style(ChatFormatting.GRAY) + .component(), + CreateLang.temporaryText("is held until outputs arrive.") + .style(ChatFormatting.GRAY) + .component(), + CreateLang.temporaryText("This prevents over-sending.") + .style(ChatFormatting.GRAY) + .component()); + } else { + promiseTip = List.of(CreateLang.temporaryText("Promised Items") + .color(ScrollInput.HEADER_RGB) + .component(), + CreateLang.temporaryText(behaviour.getFilter() + .getHoverName() + .getString() + " x" + promised) + .component(), + CreateLang.temporaryText("Left-Click to reset") + .style(ChatFormatting.DARK_GRAY) + .style(ChatFormatting.ITALIC) + .component()); + } + + graphics.renderComponentTooltip(font, promiseTip, mouseX, mouseY); + } + + ms.popPose(); + } + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int pButton) { + if (getFocused() != null && !getFocused().isMouseOver(mouseX, mouseY)) + setFocused(null); + + int x = guiLeft; + int y = guiTop; + + // Remove connections + for (int i = 0; i < connections.size(); i++) { + int inputX = x + 20 + (i % 3 * 18); + int inputY = y + 28 + (i / 3 * 18); + if (mouseX >= inputX && mouseX < inputX + 16 && mouseY >= inputY && mouseY < inputY + 16) { + sendIt(connections.get(i) + .from(), false); + return true; + } + } + + // Clear promises + int itemY = y + 54 + middleHeight(); + int itemX = x + 78; + if (mouseX >= itemX && mouseX < itemX + 16 && mouseY >= itemY && mouseY < itemY + 16) { + sendIt(null, true); + return true; + } + + return super.mouseClicked(mouseX, mouseY, pButton); + } + + @Override + public boolean mouseScrolled(double mouseX, double mouseY, double pDelta) { + int x = guiLeft; + int y = guiTop; + + for (int i = 0; i < inputConfig.size(); i++) { + int inputX = x + 20 + (i % 3 * 18); + int inputY = y + 28 + (i / 3 * 18); + if (mouseX >= inputX && mouseX < inputX + 16 && mouseY >= inputY && mouseY < inputY + 16) { + BigItemStack itemStack = inputConfig.get(i); + itemStack.count = + Mth.clamp((int) (itemStack.count + Math.signum(pDelta) * (hasShiftDown() ? 10 : 1)), 1, 64); + return true; + } + } + + int outputX = x + 128; + int outputY = y + 16 + middleHeight() / 2; + if (mouseX >= outputX && mouseX < outputX + 16 && mouseY >= outputY && mouseY < outputY + 16) { + BigItemStack itemStack = outputConfig; + itemStack.count = + Mth.clamp((int) (itemStack.count + Math.signum(pDelta) * (hasShiftDown() ? 10 : 1)), 1, 64); + return true; + } + + return super.mouseScrolled(mouseX, mouseY, pDelta); + } + + @Override + public void removed() { + sendIt(null, false); + super.removed(); + } + + private void sendIt(@Nullable FactoryPanelPosition toRemove, boolean clearPromises) { + Map inputs = new HashMap<>(); + if (inputs.size() == connections.size()) + for (int i = 0; i < inputConfig.size(); i++) + inputs.put(connections.get(i) + .from(), inputConfig.get(i).count); + AllPackets.getChannel() + .sendToServer(new FactoryPanelConfigurationPacket(behaviour.getPanelPosition(), addressBox.getValue(), + inputs, outputConfig.count, promiseExpiration.getState(), toRemove, clearPromises)); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/RequestPromiseQueue.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/RequestPromiseQueue.java index 50dc6b5b27..9b9e8e6bd1 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/RequestPromiseQueue.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/RequestPromiseQueue.java @@ -32,19 +32,44 @@ public class RequestPromiseQueue { Create.LOGISTICS.markDirty(); } - public int getTotalPromised(ItemStack stack) { + public int getTotalPromisedAndRemoveExpired(ItemStack stack, int expiryTime) { int promised = 0; List list = promisesByItem.get(stack.getItem()); if (list == null) return promised; - for (RequestPromise promise : list) { + + for (Iterator iterator = list.iterator(); iterator.hasNext();) { + RequestPromise promise = iterator.next(); if (!ItemHandlerHelper.canItemStacksStack(promise.promisedStack.stack, stack)) continue; + if (expiryTime != -1 && promise.ticksExisted >= expiryTime) { + iterator.remove(); + Create.LOGISTICS.markDirty(); + continue; + } + promised += promise.promisedStack.count; } return promised; } + public void forceClear(ItemStack stack) { + List list = promisesByItem.get(stack.getItem()); + if (list == null) + return; + + for (Iterator iterator = list.iterator(); iterator.hasNext();) { + RequestPromise promise = iterator.next(); + if (!ItemHandlerHelper.canItemStacksStack(promise.promisedStack.stack, stack)) + continue; + iterator.remove(); + Create.LOGISTICS.markDirty(); + } + + if (list.isEmpty()) + promisesByItem.remove(stack.getItem()); + } + public void itemEnteredSystem(ItemStack stack, int amount) { List list = promisesByItem.get(stack.getItem()); if (list == null) diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java index 0b31e39d01..73c1a36fce 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java @@ -48,7 +48,7 @@ public enum AllGuiTextures implements ScreenElement, TextureSheetSegment { FILTER("filters", 214, 99), ATTRIBUTE_FILTER("filters", 0, 99, 241, 85), PACKAGE_FILTER("filters_2", 0, 0, 218, 79), - + POSTBOX_HEADER("frogport_and_mailbox", 0, 23, 214, 24), FROGPORT_HEADER("frogport_and_mailbox", 0, 0, 214, 17), FROGPORT_SLOT("frogport_and_mailbox", 26, 55, 18, 18), @@ -150,6 +150,15 @@ public enum AllGuiTextures implements ScreenElement, TextureSheetSegment { VALUE_SETTINGS_CURSOR_ICON("value_settings", 0, 44, 22, 20), VALUE_SETTINGS_LABEL_BG("value_settings", 0, 31, 81, 11), + // HILO + FACTORY_PANEL_TOP("factory_panel", 0, 0, 172, 23), + FACTORY_PANEL_MIDDLE("factory_panel", 0, 23, 172, 26), + FACTORY_PANEL_BOTTOM("factory_panel", 0, 49, 172, 54), + FACTORY_PANEL_SLOT_FRAME("factory_panel", 3, 106, 20, 20), + FACTORY_PANEL_SLOT("factory_panel", 4, 107, 18, 18), + FACTORY_PANEL_ARROW("factory_panel", 27, 108, 22, 16), + FACTORY_PANEL_ARROW_FILLED("factory_panel", 50, 108, 22, 16), + // JEI JEI_SLOT("jei/widgets", 18, 18), JEI_CHANCE_SLOT("jei/widgets", 20, 156, 18, 18), @@ -192,12 +201,12 @@ public enum AllGuiTextures implements ScreenElement, TextureSheetSegment { TRAIN_PROMPT_L("widgets", 8, 209, 3, 16), TRAIN_PROMPT_R("widgets", 11, 209, 3, 16), TRAIN_PROMPT("widgets", 0, 230, 256, 16), - + TRADE_OVERLAY("widgets", 136, 97, 98, 48), // PlacementIndicator PLACEMENT_INDICATOR_SHEET("placement_indicator", 0, 0, 16, 256), - + // Train Map TRAINMAP_SPRITES("trainmap_sprite_sheet", 0, 0, 512, 256), TRAINMAP_SIGNAL("widgets", 81, 156, 5, 10), @@ -205,7 +214,7 @@ public enum AllGuiTextures implements ScreenElement, TextureSheetSegment { TRAINMAP_STATION_DIAGO("widgets", 56, 156, 5, 5), TRAINMAP_STATION_ORTHO_HIGHLIGHT("widgets", 63, 156, 7, 7), TRAINMAP_STATION_DIAGO_HIGHLIGHT("widgets", 72, 156, 7, 7), - + TRAINMAP_TOGGLE_PANEL("widgets", 219, 4, 33, 14), TRAINMAP_TOGGLE_ON("widgets", 219, 19, 12, 7), TRAINMAP_TOGGLE_OFF("widgets", 219, 27, 12, 7), @@ -226,6 +235,7 @@ public enum AllGuiTextures implements ScreenElement, TextureSheetSegment { AllGuiTextures(String location, int width, int height) { this(location, 0, 0, width, height); } + AllGuiTextures(String location, int startX, int startY, int width, int height) { this(Create.ID, location, startX, startY, width, height); } diff --git a/src/main/resources/assets/create/textures/gui/factory_panel.png b/src/main/resources/assets/create/textures/gui/factory_panel.png new file mode 100644 index 0000000000000000000000000000000000000000..38156df31f4b5c2dacf8124faaccd0df00339e6b GIT binary patch literal 1565 zcmds1`BPI@6u$5A0)`NaK~tq75s*cL2~a>}2|K|-VA#q|1POv5k)&mbkO$SeU?tQ# zwt@o{9C27o5mAcE6D+7ubci&8AOuj*IzU7UR7qZ+o&Ev+xp%%h-}&aw`R1H6_uiA? zp+QtbQ$qj%HJIxk0RTjV5Llx}(7~qIsEaM@RGdd{9Kx|30SMSA!nsL-YiSvM$nXx7}V|MSe{6tCd;Rlw~B8KJ`9d zKby1~!9Izs#xw8T5#tlxAMzi-CHT}-F9)}vYx2EK&{TWdM6@@_D7=Z3PSI3X$1brT z8UvzXJJs?lXS*Ee;ZVcS(dmx3YWiV_l-}D&6=@u-rk}%_`Efv6undl z$lh07xF|wE%{^uT(a?w-DIgQTDh&f*D{y&)uqA+6Za9T-!JZpFuoXr=;dNqr?l$9p z>`LGP)}(m&iv{wn*qwFa@;;*nyc1jmPx~fP}E6Uy0X$?!@wVVLc`~+u|)6}ZrTVv z%kq`0M-tf6@bAMNTdqz_2g2cvWMURV! zIdbi))By@JD+9T}epw@_4Gbi;dFB^dTmWsOzjBNt3-QP&kXU;YmL*x5ka+Hw7IZd- z7(e8tHp~QVUVCnt6AWB_i5kP#Ll0|CGkADiCj@cql7TiM^%)m@M<;s^T0q=*D-c{x rbWjPb>}hCy04#0$A00|51tmK34lji>l-C+Ze1RZ1Ak@Fbmsj>T={cMm literal 0 HcmV?d00001 From 1bfdb57f701d061e7d03ecde262e9fcec1257f63 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Tue, 22 Oct 2024 00:18:29 +0200 Subject: [PATCH 086/515] Highly controlled - Raised rendered partial models of train and contraption controls to match new block asset - Doors on elevators now try to open other non-assembled doors in front of them --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 7 +++---- .../resources/assets/create/lang/en_ud.json | 1 - .../resources/assets/create/lang/en_us.json | 1 - .../models/item/factory_panel_connector.json | 6 ------ .../com/simibubi/create/AllCreativeModeTabs.java | 3 +-- src/main/java/com/simibubi/create/AllItems.java | 4 ---- src/main/java/com/simibubi/create/AllShapes.java | 16 ++++++++++++---- .../ContraptionControlsBlock.java | 6 ++++++ .../ContraptionControlsBlockEntity.java | 2 +- .../ContraptionControlsRenderer.java | 2 +- .../actors/trainControls/ControlsBlock.java | 6 ++++++ .../actors/trainControls/ControlsRenderer.java | 4 ++-- .../SlidingDoorMovementBehaviour.java | 10 ++++++++++ .../factoryBoard/FactoryPanelBehaviour.java | 4 ---- .../factoryBoard/FactoryPanelBlock.java | 3 --- .../block/contraption_controls/button.json | 9 ++++----- .../block/contraption_controls/indicator_0.json | 9 ++++----- .../block/contraption_controls/indicator_1.json | 9 ++++----- .../block/contraption_controls/indicator_2.json | 9 ++++----- .../block/contraption_controls/indicator_3.json | 9 ++++----- .../block/contraption_controls/indicator_4.json | 9 ++++----- .../block/contraption_controls/indicator_5.json | 9 ++++----- .../block/contraption_controls/indicator_6.json | 9 ++++----- .../block/contraption_controls/indicator_7.json | 9 ++++----- .../models/block/controls/train/cover.json | 5 +++-- .../models/block/controls/train/lever.json | 9 ++++----- 26 files changed, 85 insertions(+), 85 deletions(-) delete mode 100644 src/generated/resources/assets/create/models/item/factory_panel_connector.json diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 3bd1122443..ee502d510b 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-10-19T13:55:15.8788146 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-10-21T23:58:33.4126681 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -611,8 +611,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -0327d230f2c772bc5239d306d3ff557e90b9edcd assets/create/lang/en_ud.json -5642d29ae31e006d0970c9b20ff681aa345d96c4 assets/create/lang/en_us.json +9c765f4a42506cec87f96509a068301c3f88c380 assets/create/lang/en_ud.json +03464574c913d840da0b5e2eefe04e0b0a3ece42 assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -1989,7 +1989,6 @@ a443633d90ef9ac2a866b69b2ecdfad1841dc3e1 assets/create/models/item/exposed_coppe 9bb425a14635fc8b36a9a95f3d0c54e0b129b7b4 assets/create/models/item/exposed_copper_tile_stairs.json 8b64a93d9b6e33e3caa66adb7a0cc8c5cd473023 assets/create/models/item/extendo_grip.json 8e4a2cef0741c30574874d1a71d46f221ddbfaa4 assets/create/models/item/factory_panel.json -bfc640c64c9ecde635eb0e7fc7b014f12e566840 assets/create/models/item/factory_panel_connector.json dad31483f65baaf187e6553e3cd301c5d69e9db4 assets/create/models/item/filter.json 575047531b8e324df9e58abba79cfe9ee3db8b16 assets/create/models/item/fluid_pipe.json 51d34caaa63685e901b8bfe6ced13ff2e8914ce7 assets/create/models/item/fluid_tank.json diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index ff853c1e1f..0b83d9483f 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -2863,7 +2863,6 @@ "item.create.extendo_grip.tooltip.condition1": "puɐH-ɟɟO uı uǝɥM", "item.create.extendo_grip.tooltip.condition2": "ʞuɐʇʞɔɐᗺ buıɹɐǝʍ ǝןıɥM", "item.create.extendo_grip.tooltip.summary": "‾ʞuɐʇʞɔɐᗺ‾ ɐ ɯoɹɟ ‾ǝɹnssǝɹԀ‾ ‾ɹıⱯ‾ ɥʇıʍ pǝɹǝʍod ǝq uɐƆ ˙ɹǝpןǝıʍ ǝɥʇ ɟo ‾ǝɔuɐʇsıp ɥɔɐǝɹ sǝsɐǝɹɔuı‾ ʎןʇɐǝɹ⅁", - "item.create.factory_panel_connector": "ɹoʇɔǝuuoƆ ןǝuɐԀ ʎɹoʇɔɐℲ", "item.create.filter": "ɹǝʇןıℲ ʇsıꞀ", "item.create.filter.tooltip.behaviour1": "˙‾ǝɔɐɟɹǝʇuı uoıʇɐɹnbıɟuoɔ‾ ǝɥʇ suǝdO", "item.create.filter.tooltip.condition1": "pǝʞɔıןƆ-ᴚ uǝɥM", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 3b72ead47f..f0369143e1 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -2863,7 +2863,6 @@ "item.create.extendo_grip.tooltip.condition1": "When in Off-Hand", "item.create.extendo_grip.tooltip.condition2": "While wearing Backtank", "item.create.extendo_grip.tooltip.summary": "Greatly _increases reach distance_ of the wielder. Can be powered with _Air_ _Pressure_ from a _Backtank_", - "item.create.factory_panel_connector": "Factory Panel Connector", "item.create.filter": "List Filter", "item.create.filter.tooltip.behaviour1": "Opens the _configuration interface_.", "item.create.filter.tooltip.condition1": "When R-Clicked", diff --git a/src/generated/resources/assets/create/models/item/factory_panel_connector.json b/src/generated/resources/assets/create/models/item/factory_panel_connector.json deleted file mode 100644 index 573e90688c..0000000000 --- a/src/generated/resources/assets/create/models/item/factory_panel_connector.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "create:item/factory_panel_connector" - } -} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllCreativeModeTabs.java b/src/main/java/com/simibubi/create/AllCreativeModeTabs.java index a40ff0b302..d854c9f9a0 100644 --- a/src/main/java/com/simibubi/create/AllCreativeModeTabs.java +++ b/src/main/java/com/simibubi/create/AllCreativeModeTabs.java @@ -176,8 +176,7 @@ public class AllCreativeModeTabs { ); Map, ItemProviderEntry> simpleAfterOrderings = Map.of( - AllItems.VERTICAL_GEARBOX, AllBlocks.GEARBOX, - AllItems.FACTORY_PANEL_CONNECTOR, AllBlocks.FACTORY_PANEL + AllItems.VERTICAL_GEARBOX, AllBlocks.GEARBOX ); simpleBeforeOrderings.forEach((entry, otherEntry) -> { diff --git a/src/main/java/com/simibubi/create/AllItems.java b/src/main/java/com/simibubi/create/AllItems.java index ada592ba42..582b25abc2 100644 --- a/src/main/java/com/simibubi/create/AllItems.java +++ b/src/main/java/com/simibubi/create/AllItems.java @@ -243,10 +243,6 @@ public class AllItems { public static final ItemEntry DISPLAY_CLOTH = REGISTRATE.item("display_cloth", DisplayClothItem::new) .register(); - - public static final ItemEntry FACTORY_PANEL_CONNECTOR = - REGISTRATE.item("factory_panel_connector", Item::new) - .register(); // wrapped by COPPER_BACKTANK for block placement uses. // must be registered as of 1.18.2 diff --git a/src/main/java/com/simibubi/create/AllShapes.java b/src/main/java/com/simibubi/create/AllShapes.java index a1ccfc70ba..a59d533fbd 100644 --- a/src/main/java/com/simibubi/create/AllShapes.java +++ b/src/main/java/com/simibubi/create/AllShapes.java @@ -132,10 +132,18 @@ public class AllShapes { STEP_BOTTOM = shape(0, 0, 8, 16, 8, 16).forHorizontal(SOUTH), STEP_TOP = shape(0, 8, 8, 16, 16, 16).forHorizontal(SOUTH), - CONTROLS = shape(0, 0, 6, 16, 14, 16).forHorizontal(NORTH), - CONTRAPTION_CONTROLS = shape(0, 0, 6, 2, 14, 16).add(14, 0, 6, 16, 14, 16) - .add(0, 0, 14, 16, 14, 16) - .add(0, 0, 7, 16, 10, 16) + CONTROLS = shape(0, 0, 6, 16, 16, 16).add(0, 0, 0, 16, 2, 16) + .forHorizontal(NORTH), + CONTROLS_COLLISION = shape(0, 0, 6, 16, 16, 16).forHorizontal(NORTH), + + CONTRAPTION_CONTROLS = shape(0, 0, 6, 2, 16, 16).add(14, 0, 6, 16, 16, 16) + .add(0, 0, 14, 16, 16, 16) + .add(0, 0, 7, 16, 12, 16) + .add(0, 0, 0, 16, 2, 16) + .forHorizontal(NORTH), + CONTRAPTION_CONTROLS_COLLISION = shape(0, 0, 6, 2, 16, 16).add(14, 0, 6, 16, 16, 16) + .add(0, 0, 14, 16, 16, 16) + .add(0, 0, 7, 16, 12, 16) .forHorizontal(NORTH), NIXIE_TUBE = shape(9, 0, 5, 15, 12, 11).add(1, 0, 5, 7, 12, 11) diff --git a/src/main/java/com/simibubi/create/content/contraptions/actors/contraptionControls/ContraptionControlsBlock.java b/src/main/java/com/simibubi/create/content/contraptions/actors/contraptionControls/ContraptionControlsBlock.java index 9898d1549a..fc0115820d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/actors/contraptionControls/ContraptionControlsBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/actors/contraptionControls/ContraptionControlsBlock.java @@ -51,6 +51,12 @@ public class ContraptionControlsBlock extends ControlsBlock implements IBE getBlockEntityClass() { diff --git a/src/main/java/com/simibubi/create/content/contraptions/actors/contraptionControls/ContraptionControlsBlockEntity.java b/src/main/java/com/simibubi/create/content/contraptions/actors/contraptionControls/ContraptionControlsBlockEntity.java index 97ae58d9b6..d89cf9c078 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/actors/contraptionControls/ContraptionControlsBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/actors/contraptionControls/ContraptionControlsBlockEntity.java @@ -129,7 +129,7 @@ public class ContraptionControlsBlockEntity extends SmartBlockEntity { public Vec3 getLocalOffset(LevelAccessor level, BlockPos pos, BlockState state) { Direction facing = state.getValue(ControlsBlock.FACING); float yRot = AngleHelper.horizontalAngle(facing); - return VecHelper.rotateCentered(VecHelper.voxelSpace(8, 12f, 5.5f), yRot, Axis.Y); + return VecHelper.rotateCentered(VecHelper.voxelSpace(8, 14f, 5.5f), yRot, Axis.Y); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/actors/contraptionControls/ContraptionControlsRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/actors/contraptionControls/ContraptionControlsRenderer.java index 36ab3890b2..6fdd7672b1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/actors/contraptionControls/ContraptionControlsRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/actors/contraptionControls/ContraptionControlsRenderer.java @@ -99,7 +99,7 @@ public class ContraptionControlsRenderer extends SmartBlockEntityRenderer Date: Thu, 24 Oct 2024 13:04:22 +0200 Subject: [PATCH 087/515] Requesters Revisited - Added UI for Redstone Requester - Requester emits comparator signal on success - Fixed saw offsets - Fixed cardboard knockback not applied to server players - Factory panels shut off when some links arent loaded - Postbox animates flag and spawns particles on transfer - Fixed cardboard block culling - Fixed trains not transferring packages during stay, only on arrival - Factory panel refinements - Added bound cardboard blocks - Added recipes where cardboard substitutes leather --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 15 +- .../82992cbf8f2794d83ac94034835eac0acd7915b9 | 20 +- .../blockstates/bound_cardboard_block.json | 11 + .../blockstates/redstone_requester.json | 7 +- .../resources/assets/create/lang/en_ud.json | 2 + .../resources/assets/create/lang/en_us.json | 2 + .../models/item/bound_cardboard_block.json | 3 + .../models/item/redstone_requester.json | 2 +- .../misc/crafting/appliances/book.json | 35 +++ .../crafting/appliances/cardboard_boots.json | 35 +++ .../appliances/cardboard_chestplate.json | 35 +++ .../crafting/appliances/cardboard_helmet.json | 35 +++ .../appliances/cardboard_leggings.json | 35 +++ .../misc/crafting/appliances/item_frame.json | 35 +++ .../misc/crafting/appliances/name_tag.json | 35 +++ .../materials/bound_cardboard_block.json | 35 +++ .../materials/cardboard_from_bound_block.json | 35 +++ .../blocks/bound_cardboard_block.json | 21 ++ .../recipes/crafting/appliances/book.json | 21 ++ .../crafting/appliances/cardboard_boots.json | 17 ++ .../appliances/cardboard_chestplate.json | 18 ++ .../crafting/appliances/cardboard_helmet.json | 17 ++ .../appliances/cardboard_leggings.json | 18 ++ .../crafting/appliances/item_frame.json | 21 ++ .../recipes/crafting/appliances/name_tag.json | 18 ++ .../materials/bound_cardboard_block.json | 22 ++ .../materials/cardboard_from_bound_block.json | 13 + .../minecraft/tags/blocks/mineable/axe.json | 3 +- .../java/com/simibubi/create/AllBlocks.java | 20 +- .../com/simibubi/create/AllMenuTypes.java | 5 + .../java/com/simibubi/create/AllPackets.java | 4 + .../com/simibubi/create/AllSpriteShifts.java | 3 + .../simibubi/create/compat/jei/CreateJEI.java | 2 + .../equipment/tool/CardboardSwordItem.java | 24 +- .../equipment/tool/KnockbackPacket.java | 43 ++++ .../content/kinetics/saw/SawRenderer.java | 1 + .../displayCloth/DisplayClothEntity.java | 5 +- .../factoryBoard/FactoryPanelBehaviour.java | 53 ++-- .../factoryBoard/FactoryPanelBlockItem.java | 33 +++ .../FactoryPanelConnectionHandler.java | 87 ++++++- .../factoryBoard/FactoryPanelRenderer.java | 21 +- .../factoryBoard/FactoryPanelScreen.java | 97 +++++--- .../postbox/PostboxBlockEntity.java | 59 +++++ .../packagePort/postbox/PostboxRenderer.java | 26 +- .../packagerLink/GlobalLogisticsManager.java | 18 ++ .../LogisticallyLinkedBehaviour.java | 34 ++- .../LogisticallyLinkedClientHandler.java | 11 +- .../packagerLink/LogisticsNetwork.java | 2 + .../packagerLink/PackagerLinkBlockEntity.java | 2 +- .../redstoneRequester/AutoRequestData.java | 11 - .../RedstoneRequesterBlock.java | 87 ++++--- .../RedstoneRequesterBlockEntity.java | 87 ++++++- .../RedstoneRequesterBlockItem.java | 39 +++ .../RedstoneRequesterConfigurationPacket.java | 61 +++++ .../RedstoneRequesterMenu.java | 82 +++++++ .../RedstoneRequesterScreen.java | 230 ++++++++++++++++++ .../stockTicker/StockCheckingBlockEntity.java | 2 +- .../create/content/trains/entity/Train.java | 11 + .../content/trains/station/GlobalStation.java | 15 +- .../data/recipe/CreateRecipeProvider.java | 4 + .../data/recipe/StandardRecipeGen.java | 63 ++++- .../foundation/events/ClientEvents.java | 2 + .../create/foundation/events/InputEvents.java | 6 + .../create/foundation/gui/AllGuiTextures.java | 16 +- .../create/foundation/gui/AllIcons.java | 4 +- .../assets/create/lang/default/interface.json | 2 + .../models/block/bound_cardboard_block.json | 24 ++ .../create/models/block/cardboard_block.json | 12 +- .../models/block/package_postbox/flag.json | 2 +- .../models/block/redstone_requester.json | 47 ---- .../block/redstone_requester/block.json | 23 ++ .../redstone_requester/block_powered.json | 7 + .../block/bound_cardboard_block_front.png | Bin 0 -> 253 bytes .../block/bound_cardboard_block_side.png | Bin 0 -> 237 bytes .../block/bound_cardboard_block_top.png | Bin 0 -> 268 bytes .../block/factory_panel_arrows_animated.png | Bin 0 -> 573 bytes .../block/factory_panel_connections.png | Bin 234 -> 233 bytes .../factory_panel_connections_animated.png | Bin 0 -> 572 bytes ...tory_panel_connections_animated.png.mcmeta | 6 + .../block/redstone_requester_side.png | Bin 0 -> 303 bytes .../block/redstone_requester_side_powered.png | Bin 0 -> 305 bytes .../textures/block/redstone_requester_top.png | Bin 0 -> 260 bytes .../create/textures/gui/factory_panel.png | Bin 1565 -> 0 bytes .../assets/create/textures/gui/icons.png | Bin 3798 -> 3856 bytes .../textures/gui/restocker_and_requester.png | Bin 0 -> 2024 bytes .../assets/minecraft/atlases/blocks.json | 4 + 86 files changed, 1733 insertions(+), 230 deletions(-) create mode 100644 src/generated/resources/assets/create/blockstates/bound_cardboard_block.json create mode 100644 src/generated/resources/assets/create/models/item/bound_cardboard_block.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/appliances/book.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/appliances/cardboard_boots.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/appliances/cardboard_chestplate.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/appliances/cardboard_helmet.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/appliances/cardboard_leggings.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/appliances/item_frame.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/appliances/name_tag.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/materials/bound_cardboard_block.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/materials/cardboard_from_bound_block.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/bound_cardboard_block.json create mode 100644 src/generated/resources/data/create/recipes/crafting/appliances/book.json create mode 100644 src/generated/resources/data/create/recipes/crafting/appliances/cardboard_boots.json create mode 100644 src/generated/resources/data/create/recipes/crafting/appliances/cardboard_chestplate.json create mode 100644 src/generated/resources/data/create/recipes/crafting/appliances/cardboard_helmet.json create mode 100644 src/generated/resources/data/create/recipes/crafting/appliances/cardboard_leggings.json create mode 100644 src/generated/resources/data/create/recipes/crafting/appliances/item_frame.json create mode 100644 src/generated/resources/data/create/recipes/crafting/appliances/name_tag.json create mode 100644 src/generated/resources/data/create/recipes/crafting/materials/bound_cardboard_block.json create mode 100644 src/generated/resources/data/create/recipes/crafting/materials/cardboard_from_bound_block.json create mode 100644 src/main/java/com/simibubi/create/content/equipment/tool/KnockbackPacket.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockItem.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlockItem.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterConfigurationPacket.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterMenu.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterScreen.java create mode 100644 src/main/resources/assets/create/models/block/bound_cardboard_block.json delete mode 100644 src/main/resources/assets/create/models/block/redstone_requester.json create mode 100644 src/main/resources/assets/create/models/block/redstone_requester/block.json create mode 100644 src/main/resources/assets/create/models/block/redstone_requester/block_powered.json create mode 100644 src/main/resources/assets/create/textures/block/bound_cardboard_block_front.png create mode 100644 src/main/resources/assets/create/textures/block/bound_cardboard_block_side.png create mode 100644 src/main/resources/assets/create/textures/block/bound_cardboard_block_top.png create mode 100644 src/main/resources/assets/create/textures/block/factory_panel_arrows_animated.png create mode 100644 src/main/resources/assets/create/textures/block/factory_panel_connections_animated.png create mode 100644 src/main/resources/assets/create/textures/block/factory_panel_connections_animated.png.mcmeta create mode 100644 src/main/resources/assets/create/textures/block/redstone_requester_side.png create mode 100644 src/main/resources/assets/create/textures/block/redstone_requester_side_powered.png create mode 100644 src/main/resources/assets/create/textures/block/redstone_requester_top.png delete mode 100644 src/main/resources/assets/create/textures/gui/factory_panel.png create mode 100644 src/main/resources/assets/create/textures/gui/restocker_and_requester.png diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index ee502d510b..00a26e5b81 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-10-21T23:58:33.4126681 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-10-24T12:46:14.8446146 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -35,6 +35,7 @@ d540f0f23e0d7c03f8e147cf3eebbaf7caec9f93 assets/create/blockstates/blue_sail.jso d2fdb432bb037de781260c789e905b223fab408c assets/create/blockstates/blue_seat.json f91092da79b69fece9583ccc15350612f439ee1b assets/create/blockstates/blue_toolbox.json e330efa253172b315f73401ed8f2c39270ba90d3 assets/create/blockstates/blue_valve_handle.json +a02d3059619edf0bd19dbf397cb35f0f8b8fb20e assets/create/blockstates/bound_cardboard_block.json 5c7065e56a831e0957b6531d50f720e9efb64309 assets/create/blockstates/brass_bars.json d49d09f1026f816bb05a5dc13c806b860f2eb07a assets/create/blockstates/brass_belt_funnel.json 5a2551315557447abc579cf9225e3a12d9a46641 assets/create/blockstates/brass_block.json @@ -449,7 +450,7 @@ f8f9802df9c0b4e39edeefc3b1abb38255d79801 assets/create/blockstates/purple_sail.j 7ce346fa18702f6fe6e2a939efcfa26eda63fe38 assets/create/blockstates/raw_zinc_block.json ec546afd3ec8036e4393b97d535f05a86f57dbc1 assets/create/blockstates/redstone_contact.json ff205f032b36486753dddb1f2029ef8d53e9c86f assets/create/blockstates/redstone_link.json -e3e0ea8069b354c29103948d0b5e79094587ef85 assets/create/blockstates/redstone_requester.json +9ae6198e13b456ef18582364644071a18cf9324e assets/create/blockstates/redstone_requester.json e3fd62e466e3e6e7bd6fc8661f764ba972a466fc assets/create/blockstates/red_nixie_tube.json d7535074a636f30247e7bd2f1a21685d3231d321 assets/create/blockstates/red_postbox.json 4c36b562da58ef2af57009da7cf2426059249228 assets/create/blockstates/red_sail.json @@ -611,8 +612,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -9c765f4a42506cec87f96509a068301c3f88c380 assets/create/lang/en_ud.json -03464574c913d840da0b5e2eefe04e0b0a3ece42 assets/create/lang/en_us.json +7cae2f006a11bc6b07b15f0fd317e09ad9609650 assets/create/lang/en_ud.json +2c05bc7cbfef98ba87340f4f50adba0d112d0a68 assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -1748,6 +1749,7 @@ ef453775edb9342dc68e0e4ed7aa2e845b819fa6 assets/create/models/item/blue_postbox. de8beb7ef521822eb9b2826806baf1fa3344a45d assets/create/models/item/blue_seat.json a82bc56a503cd15d2354c86a49fc6d1d4ed22767 assets/create/models/item/blue_toolbox.json 2f90f781cd9b5d144a6cfd4748ae3a87c9f12ba8 assets/create/models/item/blue_valve_handle.json +d16ce54ed4e2546f168d3bcf7d748ff749565316 assets/create/models/item/bound_cardboard_block.json 4e711f64e0ab7d16c550cc4aa8b876d604dfb2af assets/create/models/item/brass_bars.json 136f97f26217c51c932d79bf715b2a1a92e6595e assets/create/models/item/brass_block.json c876713c3b8ed6511679d1e3186e6d6031190dd5 assets/create/models/item/brass_casing.json @@ -2198,7 +2200,7 @@ f91405b9aec1e0142c1b90582e03a1973251da05 assets/create/models/item/radial_chassi 4631d67976cef148c346a7016baaa6703e4f243e assets/create/models/item/raw_zinc_block.json 9dc6c52e258b00cac6ed23147983045c43218b5d assets/create/models/item/redstone_contact.json f8f733364bdd32b2ad597e81103bc02344ce63bd assets/create/models/item/redstone_link.json -f526dee8bc213b3d87cbc79350eb37b61b0eee79 assets/create/models/item/redstone_requester.json +ae0ba4827a81bd51c5c01178c2ccdae3a722628a assets/create/models/item/redstone_requester.json 4b73ee9cc2651a3d1a97476d100f9c4d7e2b2efe assets/create/models/item/red_postbox.json 8d00eb1a10055a802556eab10e13f522d12acd1c assets/create/models/item/red_sand_paper.json b64a054c92cbd2e055502d470f3921d1077e63a1 assets/create/models/item/red_seat.json @@ -3065,6 +3067,7 @@ bb9d906a97810ed1461ed321ef8e4bee1dd104fb data/create/loot_tables/blocks/blue_sai 833fe6bc3020055dd0d6f46b324cbe27b248708d data/create/loot_tables/blocks/blue_seat.json 9d22716d9d846dc9587e327dfcdf18dd5955f826 data/create/loot_tables/blocks/blue_toolbox.json 6d7ecb10e21b1e12c83c71736f14cbba3ccd7aaf data/create/loot_tables/blocks/blue_valve_handle.json +14f1cffb75761dc7e6223aa16a5d84da10dc2813 data/create/loot_tables/blocks/bound_cardboard_block.json 7d8b199f381003e5a74a8144976b65c93a09dbcb data/create/loot_tables/blocks/brass_bars.json 64a5869c6b3edeca06771f8ef64ef9521d83302a data/create/loot_tables/blocks/brass_belt_funnel.json 78ecee2c9baf6b0c78f6c7aa692e102a3f4dda74 data/create/loot_tables/blocks/brass_block.json @@ -4416,7 +4419,7 @@ c741ba83b562ae3459d7c4f2db69537f549ea411 data/forge/tags/items/tools/wrench.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/dripstone_replaceable_blocks.json e3321ff14704c031a2c16953b7e391f4f24dd70b data/minecraft/tags/blocks/impermeable.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/lush_ground_replaceable.json -f65bb63cc66aa72b5b9fa05dd88e2a69c8bf7d55 data/minecraft/tags/blocks/mineable/axe.json +4cf669239caa93951fd8e243a03e9157d2d06208 data/minecraft/tags/blocks/mineable/axe.json bdfb14d8f55cdccf1c763bada28ee1089b7d2a26 data/minecraft/tags/blocks/mineable/pickaxe.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/moss_replaceable.json 0c13aae0eeb99e89febe8dbe5e002af2ff843a9e data/minecraft/tags/blocks/needs_iron_tool.json diff --git a/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 b/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 index 7ec45153ec..300825713c 100644 --- a/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 +++ b/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 @@ -1,4 +1,4 @@ -// 1.20.1 2024-10-18T15:46:50.5810891 Create's Standard Recipes +// 1.20.1 2024-10-24T13:00:33.3172448 Create's Standard Recipes a8cc4af26f6c7c45a9eef12e92af1452fe042454 data/create/advancements/recipes/combat/crafting/appliances/netherite_backtank.json 2c2639c7b307ee7c7a4e97e5efebf496788998ad data/create/advancements/recipes/combat/crafting/appliances/netherite_backtank_from_netherite.json 81dcf0cb1aa99e39bc7d1a386e07cad4cee7d8b9 data/create/advancements/recipes/combat/crafting/appliances/netherite_diving_boots.json @@ -34,6 +34,11 @@ b90af96817d6c38ec446f7464642a473a55c2027 data/create/advancements/recipes/misc/b 0337c63f3fa75e8ae8ece4a05c85d52313e04f13 data/create/advancements/recipes/misc/blasting/zinc_ingot_from_raw_ore.json 979ce50c0238ee2512acbe568f093b96d253adbe data/create/advancements/recipes/misc/campfire_cooking/bread.json 3d2decdb350a8ba7f553dec5ee5f7b79d6cfd9c4 data/create/advancements/recipes/misc/crafting/appliances/attribute_filter_clear.json +84d6c2b2c256ead627764816f389729c6954d38e data/create/advancements/recipes/misc/crafting/appliances/book.json +28dfbb796d48a7bb2ba4a69003dfa30a7a4a2c7e data/create/advancements/recipes/misc/crafting/appliances/cardboard_boots.json +52a32f67c9303fe18c51c40b49ca359cc556eb26 data/create/advancements/recipes/misc/crafting/appliances/cardboard_chestplate.json +6a0d06d354aa7f81e6141a03aeef9a51d03e3cd4 data/create/advancements/recipes/misc/crafting/appliances/cardboard_helmet.json +dd3d469cc9899f3f7299cbd6903a2b541df5c7ff data/create/advancements/recipes/misc/crafting/appliances/cardboard_leggings.json 8b0f0b4342adbd3466c81298c87b5ed8993c3636 data/create/advancements/recipes/misc/crafting/appliances/clipboard.json 42f06a32b53c954a54fa1d5ffb1afd2e161cbde2 data/create/advancements/recipes/misc/crafting/appliances/clipboard_clear.json 6fa2794d2d8d8d5ffeea22701862d79578adf7f2 data/create/advancements/recipes/misc/crafting/appliances/copper_backtank.json @@ -43,7 +48,9 @@ b90af96817d6c38ec446f7464642a473a55c2027 data/create/advancements/recipes/misc/b 4bd1ab25286d5a9dce7cafd1f814113f21a6969d data/create/advancements/recipes/misc/crafting/appliances/display_cloth_clear.json c4d0901541855ea2fda0cef7f0270edfa16d70e2 data/create/advancements/recipes/misc/crafting/appliances/dough.json 79b6501f8cb069dc55b78871a5fecf40a5b3dbd5 data/create/advancements/recipes/misc/crafting/appliances/filter_clear.json +37ad1d645de355b261b9bb6b611bd136723233b7 data/create/advancements/recipes/misc/crafting/appliances/item_frame.json 3271ad36fbab51d87d0baad8c69cb7b2add506b8 data/create/advancements/recipes/misc/crafting/appliances/linked_controller.json +54ed96f8c7d040058e5e682d68279d197b08e5e1 data/create/advancements/recipes/misc/crafting/appliances/name_tag.json d4d13730d982713b5809ecf30187e01707248d75 data/create/advancements/recipes/misc/crafting/appliances/schedule_clear.json 44c1a131bed101ad4b87d57816ff5a375cc36bf4 data/create/advancements/recipes/misc/crafting/appliances/slime_ball.json 7d0fa7ac8a04b19cd3db31342e276d2da4860a1d data/create/advancements/recipes/misc/crafting/appliances/tree_fertilizer.json @@ -185,12 +192,14 @@ cb416511a219d2bc5806c6880c01820a8b563b80 data/create/advancements/recipes/misc/c 3b65a04da4e16442bfa8accfe209b7c5342b1db9 data/create/advancements/recipes/misc/crafting/materials/andesite_alloy_block.json 2715b888b6d96ee4c7208af21bb4dfb1a1bd544c data/create/advancements/recipes/misc/crafting/materials/andesite_alloy_from_block.json 2ca100aa71cc3419c47d1028f5c77aa9387ab216 data/create/advancements/recipes/misc/crafting/materials/andesite_alloy_from_zinc.json +652779172d0058cfe3d380a0462a71f82e6dd91c data/create/advancements/recipes/misc/crafting/materials/bound_cardboard_block.json 47e965b7ba2b12000efcf6f9090b5622833cc9ab data/create/advancements/recipes/misc/crafting/materials/brass_block_from_compacting.json 8aa51bd8685a70f200506d3efd4e73ce9b2d7370 data/create/advancements/recipes/misc/crafting/materials/brass_ingot_from_compacting.json 9e703c5fa1bd44eb6581e745f06923d40126ada4 data/create/advancements/recipes/misc/crafting/materials/brass_ingot_from_decompacting.json 4cb9d1fc5289b11df4610a85aa2cd67877556b32 data/create/advancements/recipes/misc/crafting/materials/brass_nugget_from_decompacting.json f07788c42f4c49d0b4fc7253742d95e94bd5346d data/create/advancements/recipes/misc/crafting/materials/cardboard_block.json 86439f388e88fe56d3931ab46fce5a111b2c15f4 data/create/advancements/recipes/misc/crafting/materials/cardboard_from_block.json +fa758dda053e4e0f44fe234026417124594b0e63 data/create/advancements/recipes/misc/crafting/materials/cardboard_from_bound_block.json ffcd3f0339794c782a8be8434cd79de15d0ab3cc data/create/advancements/recipes/misc/crafting/materials/copper_ingot.json 58c23978d7222951cba2bbf3020cd0c2c6f85ac9 data/create/advancements/recipes/misc/crafting/materials/copper_nugget.json d4879e7721bdbb6c7029ac88ff5684acec8223d6 data/create/advancements/recipes/misc/crafting/materials/electron_tube.json @@ -280,6 +289,11 @@ b3c4585dc6ed9c4a38d7923ae399b88ab8912df9 data/create/recipes/blasting/zinc_ingot 23077aeccd8712038ef04542713c2b365765346d data/create/recipes/blasting/zinc_ingot_from_raw_ore.json 785636ad3752d7a78059757d7ba21118be2a3289 data/create/recipes/campfire_cooking/bread.json 208487a2d020c2603391f55e815a39a28f8fd9e8 data/create/recipes/crafting/appliances/attribute_filter_clear.json +dad85e5945795a3f61f5e6b2bb13c36cf11a3966 data/create/recipes/crafting/appliances/book.json +1c507eb168fa55354e26b76704012ae85fed5edb data/create/recipes/crafting/appliances/cardboard_boots.json +b42fe3c262a33657b098b036ae0864af988b9f10 data/create/recipes/crafting/appliances/cardboard_chestplate.json +efbfccade226b34d22abb77138dab8726725752e data/create/recipes/crafting/appliances/cardboard_helmet.json +1f49a67c1698a56cfd017a9e89a17c640052e1e3 data/create/recipes/crafting/appliances/cardboard_leggings.json 66c24da136abee4521d788df83f55b1c224d19fe data/create/recipes/crafting/appliances/clipboard.json 28d1dabd689b855964151100a80247b2ea150bd4 data/create/recipes/crafting/appliances/clipboard_clear.json 97932adf38574c2baf0ed2d5e3d62e7514e0c2bf data/create/recipes/crafting/appliances/copper_backtank.json @@ -289,7 +303,9 @@ c500139f545fea4568575b93b1ab9e56f004f137 data/create/recipes/crafting/appliances 4516e2c533f753f9d3802ae3c9c1400866ad3a31 data/create/recipes/crafting/appliances/display_cloth_clear.json b7c8f3c5e80749c6c38d5c0153dc68a79c32535f data/create/recipes/crafting/appliances/dough.json 409b5d70ee1ef9164c327d79472e6d66ce55dec6 data/create/recipes/crafting/appliances/filter_clear.json +854f7efc8724f733ed7f4ac08c1d252cf949512d data/create/recipes/crafting/appliances/item_frame.json 265ead7993ae9e9b617dbfae749a77fed6b7b1ba data/create/recipes/crafting/appliances/linked_controller.json +48c48579dda926b348ba56b8b640436cb81650bf data/create/recipes/crafting/appliances/name_tag.json 32d4ba22e5133284793b4854f1a6798dd1f50ea0 data/create/recipes/crafting/appliances/netherite_backtank.json de4c3f66e8664c607900c672ee1c20d3442fdebc data/create/recipes/crafting/appliances/netherite_backtank_from_netherite.json b5b29558d4efe161f6edaeae2c449735d46261ca data/create/recipes/crafting/appliances/netherite_diving_boots.json @@ -438,12 +454,14 @@ ac524c110f66a7433208a888c5f3bb69e5e95743 data/create/recipes/crafting/materials/ e6bb68a1d2ed5a629c83f5a0eefb843bb890736d data/create/recipes/crafting/materials/andesite_alloy_block.json eebacb477bcce876622173289b06e1ad21424686 data/create/recipes/crafting/materials/andesite_alloy_from_block.json 5008707e622c0fa0b6df32da5da7230a4da574ca data/create/recipes/crafting/materials/andesite_alloy_from_zinc.json +455730ac3f06c0b2ef20992ec23edd36cd65194b data/create/recipes/crafting/materials/bound_cardboard_block.json f9f94e5082e7971e55b25bc00ba86c3579b492aa data/create/recipes/crafting/materials/brass_block_from_compacting.json ecd8581ad4a04cc1217133363bd15d76129cb651 data/create/recipes/crafting/materials/brass_ingot_from_compacting.json fe2f3c0722aa0f6b41ad0f497b9742eb856c0dd0 data/create/recipes/crafting/materials/brass_ingot_from_decompacting.json 941b2c1007c4b3afb6e141a754141de1b1c9a43a data/create/recipes/crafting/materials/brass_nugget_from_decompacting.json 4c92a1eadc2e5dfba9e871537671702ccf35368a data/create/recipes/crafting/materials/cardboard_block.json cb1188148d18e456cecd33279aaf695787ddbf74 data/create/recipes/crafting/materials/cardboard_from_block.json +00d637b64b6dfa18be86cb921f920a63bacb096d data/create/recipes/crafting/materials/cardboard_from_bound_block.json d4d6664d05c7406b4f839413d4e3c60cf0347fb7 data/create/recipes/crafting/materials/copper_ingot.json 4863d3feda514d414962c1947abaa232ab3f6cd5 data/create/recipes/crafting/materials/copper_nugget.json 66c0b1d060395826c4a45082a03295b5df450801 data/create/recipes/crafting/materials/electron_tube.json diff --git a/src/generated/resources/assets/create/blockstates/bound_cardboard_block.json b/src/generated/resources/assets/create/blockstates/bound_cardboard_block.json new file mode 100644 index 0000000000..7f9aae8a0e --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/bound_cardboard_block.json @@ -0,0 +1,11 @@ +{ + "variants": { + "axis=x": { + "model": "create:block/bound_cardboard_block", + "y": 90 + }, + "axis=z": { + "model": "create:block/bound_cardboard_block" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/redstone_requester.json b/src/generated/resources/assets/create/blockstates/redstone_requester.json index c18ade96ef..498215dec0 100644 --- a/src/generated/resources/assets/create/blockstates/redstone_requester.json +++ b/src/generated/resources/assets/create/blockstates/redstone_requester.json @@ -1,7 +1,10 @@ { "variants": { - "": { - "model": "create:block/redstone_requester" + "powered=false": { + "model": "create:block/redstone_requester/block" + }, + "powered=true": { + "model": "create:block/redstone_requester/block_powered" } } } \ No newline at end of file diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 0b83d9483f..66b39dbde9 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -221,6 +221,7 @@ "block.create.blue_seat": "ʇɐǝS ǝnןᗺ", "block.create.blue_toolbox": "xoqןoo⟘ ǝnןᗺ", "block.create.blue_valve_handle": "ǝןpuɐH ǝʌןɐΛ ǝnןᗺ", + "block.create.bound_cardboard_block": "pɹɐoqpɹɐƆ ɟo ʞɔoןq punoᗺ", "block.create.brass_bars": "sɹɐᗺ ssɐɹᗺ", "block.create.brass_belt_funnel": "ןǝuunℲ ʇןǝᗺ ssɐɹᗺ", "block.create.brass_block": "ssɐɹᗺ ɟo ʞɔoןᗺ", @@ -1045,6 +1046,7 @@ "create.elevator_contact.floor_description": "uoıʇdıɹɔsǝᗡ ɹooןℲ", "create.elevator_contact.floor_identifier": "ɹǝıɟıʇuǝpI ɹooןℲ", "create.elevator_contact.title": "ʇɔɐʇuoƆ ɹoʇɐʌǝןƎ", + "create.factory_panel.click_to_configure": "ǝdıɔǝɹ ɐ ʎɟıɔǝds oʇ ʞɔıןƆ", "create.flap_display.cycles.alphabet": "Z؛ʎ؛X؛Λ؛∩؛⟘؛S؛ᴚ؛Ὁ؛Ԁ؛O؛N؛W؛Ꞁ؛ʞ؛ſ؛I؛H؛⅁؛Ⅎ؛Ǝ؛ᗡ؛Ɔ؛ᗺ؛Ɐ؛ ", "create.flap_display.cycles.arrival_time": "sϛㄣ؛s0Ɛ؛sϛƖ؛ʍou؛uıɯ ؛ ", "create.flap_display.cycles.fluid_units": " ᗺ؛ᗺɯ", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index f0369143e1..a4f05429b5 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -221,6 +221,7 @@ "block.create.blue_seat": "Blue Seat", "block.create.blue_toolbox": "Blue Toolbox", "block.create.blue_valve_handle": "Blue Valve Handle", + "block.create.bound_cardboard_block": "Bound block of Cardboard", "block.create.brass_bars": "Brass Bars", "block.create.brass_belt_funnel": "Brass Belt Funnel", "block.create.brass_block": "Block of Brass", @@ -1045,6 +1046,7 @@ "create.elevator_contact.floor_description": "Floor Description", "create.elevator_contact.floor_identifier": "Floor Identifier", "create.elevator_contact.title": "Elevator Contact", + "create.factory_panel.click_to_configure": "Click to specify a recipe", "create.flap_display.cycles.alphabet": " ;A;B;C;D;E;F;G;H;I;J;K;L;M;N;O;P;Q;R;S;T;U;V;X;Y;Z", "create.flap_display.cycles.arrival_time": " ; min;now;15s;30s;45s", "create.flap_display.cycles.fluid_units": "mB;B ", diff --git a/src/generated/resources/assets/create/models/item/bound_cardboard_block.json b/src/generated/resources/assets/create/models/item/bound_cardboard_block.json new file mode 100644 index 0000000000..9eadc7114d --- /dev/null +++ b/src/generated/resources/assets/create/models/item/bound_cardboard_block.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/bound_cardboard_block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/redstone_requester.json b/src/generated/resources/assets/create/models/item/redstone_requester.json index c5c4f7a55a..d8caa6f255 100644 --- a/src/generated/resources/assets/create/models/item/redstone_requester.json +++ b/src/generated/resources/assets/create/models/item/redstone_requester.json @@ -1,3 +1,3 @@ { - "parent": "create:block/redstone_requester" + "parent": "create:block/redstone_requester/block" } \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/appliances/book.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/appliances/book.json new file mode 100644 index 0000000000..14def310be --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/appliances/book.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "create:cardboard" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/appliances/book" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/appliances/book" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/appliances/cardboard_boots.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/appliances/cardboard_boots.json new file mode 100644 index 0000000000..a14e19dec9 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/appliances/cardboard_boots.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "create:cardboard" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/appliances/cardboard_boots" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/appliances/cardboard_boots" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/appliances/cardboard_chestplate.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/appliances/cardboard_chestplate.json new file mode 100644 index 0000000000..0d08a08398 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/appliances/cardboard_chestplate.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "create:cardboard" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/appliances/cardboard_chestplate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/appliances/cardboard_chestplate" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/appliances/cardboard_helmet.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/appliances/cardboard_helmet.json new file mode 100644 index 0000000000..b5cb901f19 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/appliances/cardboard_helmet.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "create:cardboard" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/appliances/cardboard_helmet" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/appliances/cardboard_helmet" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/appliances/cardboard_leggings.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/appliances/cardboard_leggings.json new file mode 100644 index 0000000000..c2d20cf35e --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/appliances/cardboard_leggings.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "create:cardboard" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/appliances/cardboard_leggings" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/appliances/cardboard_leggings" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/appliances/item_frame.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/appliances/item_frame.json new file mode 100644 index 0000000000..55277bc2bb --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/appliances/item_frame.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "create:cardboard" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/appliances/item_frame" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/appliances/item_frame" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/appliances/name_tag.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/appliances/name_tag.json new file mode 100644 index 0000000000..034ad73f78 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/appliances/name_tag.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "create:cardboard" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/appliances/name_tag" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/appliances/name_tag" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/materials/bound_cardboard_block.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/materials/bound_cardboard_block.json new file mode 100644 index 0000000000..be198645af --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/materials/bound_cardboard_block.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "create:cardboard" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/materials/bound_cardboard_block" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/materials/bound_cardboard_block" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/materials/cardboard_from_bound_block.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/materials/cardboard_from_bound_block.json new file mode 100644 index 0000000000..70c9f03dec --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/materials/cardboard_from_bound_block.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "create:cardboard" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/materials/cardboard_from_bound_block" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/materials/cardboard_from_bound_block" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/bound_cardboard_block.json b/src/generated/resources/data/create/loot_tables/blocks/bound_cardboard_block.json new file mode 100644 index 0000000000..72ea360f9c --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/bound_cardboard_block.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:bound_cardboard_block" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/bound_cardboard_block" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/appliances/book.json b/src/generated/resources/data/create/recipes/crafting/appliances/book.json new file mode 100644 index 0000000000..be59b14cda --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/appliances/book.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "create:cardboard" + }, + { + "item": "minecraft:paper" + }, + { + "item": "minecraft:paper" + }, + { + "item": "minecraft:paper" + } + ], + "result": { + "item": "minecraft:book" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/appliances/cardboard_boots.json b/src/generated/resources/data/create/recipes/crafting/appliances/cardboard_boots.json new file mode 100644 index 0000000000..89886731af --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/appliances/cardboard_boots.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "P": { + "item": "create:cardboard" + } + }, + "pattern": [ + "P P", + "P P" + ], + "result": { + "item": "create:cardboard_boots" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/appliances/cardboard_chestplate.json b/src/generated/resources/data/create/recipes/crafting/appliances/cardboard_chestplate.json new file mode 100644 index 0000000000..7a60c3c079 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/appliances/cardboard_chestplate.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "P": { + "item": "create:cardboard" + } + }, + "pattern": [ + "P P", + "PPP", + "PPP" + ], + "result": { + "item": "create:cardboard_chestplate" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/appliances/cardboard_helmet.json b/src/generated/resources/data/create/recipes/crafting/appliances/cardboard_helmet.json new file mode 100644 index 0000000000..c2e2046380 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/appliances/cardboard_helmet.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "P": { + "item": "create:cardboard" + } + }, + "pattern": [ + "PPP", + "P P" + ], + "result": { + "item": "create:cardboard_helmet" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/appliances/cardboard_leggings.json b/src/generated/resources/data/create/recipes/crafting/appliances/cardboard_leggings.json new file mode 100644 index 0000000000..e3ee002600 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/appliances/cardboard_leggings.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "P": { + "item": "create:cardboard" + } + }, + "pattern": [ + "PPP", + "P P", + "P P" + ], + "result": { + "item": "create:cardboard_leggings" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/appliances/item_frame.json b/src/generated/resources/data/create/recipes/crafting/appliances/item_frame.json new file mode 100644 index 0000000000..e1965b6aaf --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/appliances/item_frame.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "P": { + "item": "create:cardboard" + }, + "S": { + "tag": "forge:rods/wooden" + } + }, + "pattern": [ + "SSS", + "SPS", + "SSS" + ], + "result": { + "item": "minecraft:item_frame" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/appliances/name_tag.json b/src/generated/resources/data/create/recipes/crafting/appliances/name_tag.json new file mode 100644 index 0000000000..55d6978281 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/appliances/name_tag.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "tag": "forge:dyes/black" + }, + { + "tag": "forge:string" + }, + { + "item": "create:cardboard" + } + ], + "result": { + "item": "minecraft:name_tag" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/materials/bound_cardboard_block.json b/src/generated/resources/data/create/recipes/crafting/materials/bound_cardboard_block.json new file mode 100644 index 0000000000..9b01e47713 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/materials/bound_cardboard_block.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "C": { + "item": "create:cardboard_block" + }, + "S": { + "tag": "forge:string" + } + }, + "pattern": [ + "CCC", + "CSC", + "CCC" + ], + "result": { + "count": 8, + "item": "create:bound_cardboard_block" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/materials/cardboard_from_bound_block.json b/src/generated/resources/data/create/recipes/crafting/materials/cardboard_from_bound_block.json new file mode 100644 index 0000000000..b65f25e251 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/materials/cardboard_from_bound_block.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "create:bound_cardboard_block" + } + ], + "result": { + "count": 4, + "item": "create:cardboard" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json b/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json index 15e384e308..c1d4637403 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json @@ -131,6 +131,7 @@ "create:green_seat", "create:red_seat", "create:black_seat", - "create:cardboard_block" + "create:cardboard_block", + "create:bound_cardboard_block" ] } \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 5989759b25..c2332e68bc 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -168,6 +168,7 @@ import com.simibubi.create.content.logistics.depot.DepotBlock; import com.simibubi.create.content.logistics.depot.EjectorBlock; import com.simibubi.create.content.logistics.depot.EjectorItem; import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBlock; +import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBlockItem; import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelModel; import com.simibubi.create.content.logistics.funnel.AndesiteFunnelBlock; import com.simibubi.create.content.logistics.funnel.BeltFunnelBlock; @@ -185,6 +186,7 @@ import com.simibubi.create.content.logistics.packager.PackagerGenerator; import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedBlockItem; import com.simibubi.create.content.logistics.packagerLink.PackagerLinkBlock; import com.simibubi.create.content.logistics.redstoneRequester.RedstoneRequesterBlock; +import com.simibubi.create.content.logistics.redstoneRequester.RedstoneRequesterBlockItem; import com.simibubi.create.content.logistics.stockTicker.StockTickerBlock; import com.simibubi.create.content.logistics.tunnel.BeltTunnelBlock; import com.simibubi.create.content.logistics.tunnel.BrassTunnelBlock; @@ -1807,8 +1809,9 @@ public class AllBlocks { .initialProperties(SharedProperties::stone) .properties(p -> p.sound(SoundType.WOOD)) .transform(axeOrPickaxe()) - .blockstate((c, p) -> p.simpleBlock(c.get(), AssetLookup.standardModel(c, p))) - .simpleItem() + .blockstate((c, p) -> BlockStateGen.simpleBlock(c, p, AssetLookup.forPowered(c, p))) + .item(RedstoneRequesterBlockItem::new) + .transform(customItemModel("_", "block")) .register(); public static final BlockEntry FACTORY_PANEL = @@ -1820,7 +1823,7 @@ public class AllBlocks { .transform(pickaxeOnly()) .blockstate((c, p) -> p.horizontalFaceBlock(c.get(), AssetLookup.partialBaseModel(c, p))) .onRegister(CreateRegistrate.blockModel(() -> FactoryPanelModel::new)) - .item(LogisticallyLinkedBlockItem::new) + .item(FactoryPanelBlockItem::new) .model(AssetLookup::customItemModel) .build() .register(); @@ -2497,6 +2500,17 @@ public class AllBlocks { .build() .lang("Block of Cardboard") .register(); + + public static final BlockEntry BOUND_CARDBOARD_BLOCK = + REGISTRATE.block("bound_cardboard_block", CardboardBlock::new) + .initialProperties(() -> Blocks.MUSHROOM_STEM) + .properties(p -> p.mapColor(MapColor.COLOR_BROWN) + .ignitedByLava()) + .transform(axeOnly()) + .blockstate(BlockStateGen.horizontalAxisBlockProvider(false)) + .simpleItem() + .lang("Bound block of Cardboard") + .register(); public static final BlockEntry EXPERIENCE_BLOCK = REGISTRATE.block("experience_block", ExperienceBlock::new) diff --git a/src/main/java/com/simibubi/create/AllMenuTypes.java b/src/main/java/com/simibubi/create/AllMenuTypes.java index fd6aecbf82..0b58a77c2e 100644 --- a/src/main/java/com/simibubi/create/AllMenuTypes.java +++ b/src/main/java/com/simibubi/create/AllMenuTypes.java @@ -14,6 +14,8 @@ import com.simibubi.create.content.logistics.filter.PackageFilterMenu; import com.simibubi.create.content.logistics.filter.PackageFilterScreen; import com.simibubi.create.content.logistics.packagePort.PackagePortMenu; import com.simibubi.create.content.logistics.packagePort.PackagePortScreen; +import com.simibubi.create.content.logistics.redstoneRequester.RedstoneRequesterMenu; +import com.simibubi.create.content.logistics.redstoneRequester.RedstoneRequesterScreen; import com.simibubi.create.content.redstone.link.controller.LinkedControllerMenu; import com.simibubi.create.content.redstone.link.controller.LinkedControllerScreen; import com.simibubi.create.content.schematics.cannon.SchematicannonMenu; @@ -66,6 +68,9 @@ public class AllMenuTypes { public static final MenuEntry PACKAGE_PORT = register("package_port", PackagePortMenu::new, () -> PackagePortScreen::new); + public static final MenuEntry REDSTONE_REQUESTER = + register("redstone_requester", RedstoneRequesterMenu::new, () -> RedstoneRequesterScreen::new); + private static > MenuEntry register( String name, ForgeMenuFactory factory, NonNullSupplier> screenFactory) { return Create.REGISTRATE diff --git a/src/main/java/com/simibubi/create/AllPackets.java b/src/main/java/com/simibubi/create/AllPackets.java index cad1936398..857791a393 100644 --- a/src/main/java/com/simibubi/create/AllPackets.java +++ b/src/main/java/com/simibubi/create/AllPackets.java @@ -43,6 +43,7 @@ import com.simibubi.create.content.equipment.potatoCannon.PotatoCannonPacket; import com.simibubi.create.content.equipment.potatoCannon.PotatoProjectileTypeManager; import com.simibubi.create.content.equipment.symmetryWand.ConfigureSymmetryWandPacket; import com.simibubi.create.content.equipment.symmetryWand.SymmetryEffectPacket; +import com.simibubi.create.content.equipment.tool.KnockbackPacket; import com.simibubi.create.content.equipment.toolbox.ToolboxDisposeAllPacket; import com.simibubi.create.content.equipment.toolbox.ToolboxEquipPacket; import com.simibubi.create.content.equipment.zapper.ZapperBeamPacket; @@ -68,6 +69,7 @@ import com.simibubi.create.content.logistics.filter.FilterScreenPacket; import com.simibubi.create.content.logistics.funnel.FunnelFlapPacket; import com.simibubi.create.content.logistics.packagePort.PackagePortConfigurationPacket; import com.simibubi.create.content.logistics.packagePort.PackagePortPlacementPacket; +import com.simibubi.create.content.logistics.redstoneRequester.RedstoneRequesterConfigurationPacket; import com.simibubi.create.content.logistics.stockTicker.LogisticalStockRequestPacket; import com.simibubi.create.content.logistics.stockTicker.LogisticalStockResponsePacket; import com.simibubi.create.content.logistics.stockTicker.PackageOrderRequestPacket; @@ -195,6 +197,7 @@ public enum AllPackets { TRAIN_MAP_REQUEST(TrainMapSyncRequestPacket.class, TrainMapSyncRequestPacket::new, PLAY_TO_SERVER), CONNECT_FACTORY_PANEL(FactoryPanelConnectionPacket.class, FactoryPanelConnectionPacket::new, PLAY_TO_SERVER), CONFIGURE_FACTORY_PANEL(FactoryPanelConfigurationPacket.class, FactoryPanelConfigurationPacket::new, PLAY_TO_SERVER), + CONFIGURE_REDSTONE_REQUESTER(RedstoneRequesterConfigurationPacket.class, RedstoneRequesterConfigurationPacket::new, PLAY_TO_SERVER), // Server to Client SYMMETRY_EFFECT(SymmetryEffectPacket.class, SymmetryEffectPacket::new, PLAY_TO_CLIENT), @@ -245,6 +248,7 @@ public enum AllPackets { LOGISTICS_STOCK_RESPONSE(LogisticalStockResponsePacket.class, LogisticalStockResponsePacket::new, PLAY_TO_CLIENT), DISPLAY_CLOTH_CLIENTBOUND(DisplayClothPacketToClient.class, DisplayClothPacketToClient::new, PLAY_TO_CLIENT), FACTORY_PANEL_EFFECT(FactoryPanelEffectPacket.class, FactoryPanelEffectPacket::new, PLAY_TO_CLIENT), + KNOCKBACK(KnockbackPacket.class, KnockbackPacket::new, PLAY_TO_CLIENT), TRAIN_MAP_SYNC(TrainMapSyncPacket.class, TrainMapSyncPacket::new, PLAY_TO_CLIENT); static { diff --git a/src/main/java/com/simibubi/create/AllSpriteShifts.java b/src/main/java/com/simibubi/create/AllSpriteShifts.java index c0b148ab83..fe05ed85db 100644 --- a/src/main/java/com/simibubi/create/AllSpriteShifts.java +++ b/src/main/java/com/simibubi/create/AllSpriteShifts.java @@ -73,6 +73,9 @@ public class AllSpriteShifts { get("block/elevator_pulley_belt", "block/elevator_pulley_belt_scroll"), ELEVATOR_COIL = get("block/elevator_pulley_coil", "block/elevator_pulley_coil_scroll"); + public static final SpriteShiftEntry FACTORY_PANEL_CONNECTIONS = + get("block/factory_panel_connections", "block/factory_panel_connections_animated"); + public static final SpriteShiftEntry BELT = get("block/belt", "block/belt_scroll"), BELT_OFFSET = get("block/belt_offset", "block/belt_scroll"), BELT_DIAGONAL = get("block/belt_diagonal", "block/belt_diagonal_scroll"), diff --git a/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java b/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java index 222750e169..a5d28647e9 100644 --- a/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java +++ b/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java @@ -59,6 +59,7 @@ import com.simibubi.create.content.kinetics.saw.CuttingRecipe; import com.simibubi.create.content.kinetics.saw.SawBlockEntity; import com.simibubi.create.content.logistics.displayCloth.DisplayClothPricingScreen; import com.simibubi.create.content.logistics.filter.AbstractFilterScreen; +import com.simibubi.create.content.logistics.redstoneRequester.RedstoneRequesterScreen; import com.simibubi.create.content.processing.basin.BasinRecipe; import com.simibubi.create.content.processing.sequenced.SequencedAssemblyRecipe; import com.simibubi.create.content.redstone.link.controller.LinkedControllerScreen; @@ -374,6 +375,7 @@ public class CreateJEI implements IModPlugin { registration.addGhostIngredientHandler(LinkedControllerScreen.class, new GhostIngredientHandler()); registration.addGhostIngredientHandler(ScheduleScreen.class, new GhostIngredientHandler()); registration.addGhostIngredientHandler(DisplayClothPricingScreen.class, new GhostIngredientHandler()); + registration.addGhostIngredientHandler(RedstoneRequesterScreen.class, new GhostIngredientHandler()); } private class CategoryBuilder> { diff --git a/src/main/java/com/simibubi/create/content/equipment/tool/CardboardSwordItem.java b/src/main/java/com/simibubi/create/content/equipment/tool/CardboardSwordItem.java index 7218155ca7..f44526fb73 100644 --- a/src/main/java/com/simibubi/create/content/equipment/tool/CardboardSwordItem.java +++ b/src/main/java/com/simibubi/create/content/equipment/tool/CardboardSwordItem.java @@ -5,9 +5,11 @@ import java.util.function.Consumer; import org.jetbrains.annotations.NotNull; import com.simibubi.create.AllItems; +import com.simibubi.create.AllPackets; import com.simibubi.create.AllSoundEvents; import com.simibubi.create.foundation.item.render.SimpleCustomRenderer; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.util.Mth; import net.minecraft.world.InteractionHand; import net.minecraft.world.effect.MobEffectInstance; @@ -33,6 +35,7 @@ import net.minecraftforge.event.entity.player.PlayerInteractEvent.LeftClickBlock import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.LogicalSide; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; +import net.minecraftforge.network.PacketDistributor; @EventBusSubscriber public class CardboardSwordItem extends SwordItem { @@ -95,11 +98,17 @@ public class CardboardSwordItem extends SwordItem { if (knockbackStrength <= 0) return; - target.stopRiding(); - target.knockback(knockbackStrength * 0.5F, Mth.sin(livingAttacker.getYRot() * Mth.DEG_TO_RAD), - -Mth.cos(livingAttacker.getYRot() * Mth.DEG_TO_RAD)); - if ((target.getClassification(false) == MobCategory.MISC - || target.getClassification(false) == MobCategory.CREATURE) && !(target instanceof Player)) + float yRot = livingAttacker.getYRot(); + knockback(target, knockbackStrength, yRot); + + boolean targetIsPlayer = target instanceof Player; + MobCategory targetType = target.getClassification(false); + + if (target instanceof ServerPlayer sp) + AllPackets.getChannel() + .send(PacketDistributor.PLAYER.with(() -> sp), new KnockbackPacket(yRot, (float) knockbackStrength)); + + if ((targetType == MobCategory.MISC || targetType == MobCategory.CREATURE) && !targetIsPlayer) target.addEffect(new MobEffectInstance(MobEffects.MOVEMENT_SLOWDOWN, 60, 9, true, false, false)); livingAttacker.setDeltaMovement(livingAttacker.getDeltaMovement() @@ -107,6 +116,11 @@ public class CardboardSwordItem extends SwordItem { livingAttacker.setSprinting(false); } + public static void knockback(LivingEntity target, double knockbackStrength, float yRot) { + target.stopRiding(); + target.knockback(knockbackStrength * 0.5F, Mth.sin(yRot * Mth.DEG_TO_RAD), -Mth.cos(yRot * Mth.DEG_TO_RAD)); + } + @Override @OnlyIn(Dist.CLIENT) public void initializeClient(Consumer consumer) { diff --git a/src/main/java/com/simibubi/create/content/equipment/tool/KnockbackPacket.java b/src/main/java/com/simibubi/create/content/equipment/tool/KnockbackPacket.java new file mode 100644 index 0000000000..733df927f1 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/equipment/tool/KnockbackPacket.java @@ -0,0 +1,43 @@ +package com.simibubi.create.content.equipment.tool; + +import com.simibubi.create.foundation.networking.SimplePacketBase; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.network.NetworkEvent.Context; + +public class KnockbackPacket extends SimplePacketBase { + + private float yRot; + private float strength; + + public KnockbackPacket(float yRot, float strength) { + this.yRot = yRot; + this.strength = strength; + } + + public KnockbackPacket(FriendlyByteBuf buffer) { + strength = buffer.readFloat(); + yRot = buffer.readFloat(); + } + + @Override + public void write(FriendlyByteBuf buffer) { + buffer.writeFloat(strength); + buffer.writeFloat(yRot); + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean handle(Context context) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) + return true; + CardboardSwordItem.knockback(player, strength, yRot); + return true; + } + +} diff --git a/src/main/java/com/simibubi/create/content/kinetics/saw/SawRenderer.java b/src/main/java/com/simibubi/create/content/kinetics/saw/SawRenderer.java index d1d794eadb..304819df94 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/saw/SawRenderer.java +++ b/src/main/java/com/simibubi/create/content/kinetics/saw/SawRenderer.java @@ -131,6 +131,7 @@ public class SawRenderer extends SafeBlockEntityRenderer { if (alongZ) ms.mulPose(Axis.YP.rotationDegrees(90)); ms.translate(outputs <= 1 ? .5 : .25, 0, offset); + ms.translate(alongZ ? -1 : 0, 0, 0); int renderedI = 0; for (int i = 0; i < be.inventory.getSlots(); i++) { diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothEntity.java b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothEntity.java index fc379c7f77..323aac3f89 100644 --- a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothEntity.java @@ -265,8 +265,9 @@ public class DisplayClothEntity extends HangingEntity implements IEntityAddition int smallestQuotient = Integer.MAX_VALUE; for (BigItemStack entry : requestData.encodedRequest.stacks()) - smallestQuotient = Math.min(smallestQuotient, - (recentSummary.getCountOf(entry.stack) - modifierSummary.getCountOf(entry.stack)) / entry.count); + if (entry.count > 0) + smallestQuotient = Math.min(smallestQuotient, + (recentSummary.getCountOf(entry.stack) - modifierSummary.getCountOf(entry.stack)) / entry.count); return smallestQuotient; } diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java index cbe188143d..14a14586b7 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java @@ -12,6 +12,7 @@ import javax.annotation.Nullable; import org.joml.Math; +import com.simibubi.create.AllBlocks; import com.simibubi.create.AllPackets; import com.simibubi.create.Create; import com.simibubi.create.content.logistics.BigItemStack; @@ -63,6 +64,7 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { public boolean satisfied; public boolean promisedSatisfied; + public boolean waitingForNetwork; public String recipeAddress; public int recipeOutput; public LerpedFloat bulb; @@ -71,6 +73,7 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { public boolean forceClearPromises; private boolean active; + private int lastReportedUnloadedLinks; private int lastReportedLevelInStorage; private int lastReportedPromises; private int timer; @@ -83,6 +86,7 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { this.count = 0; this.satisfied = false; this.promisedSatisfied = false; + this.waitingForNetwork = false; this.recipeAddress = ""; this.recipeOutput = 1; this.active = false; @@ -122,17 +126,22 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { int inStorage = getLevelInStorage(); int promised = getPromised(); int demand = getAmount() * (upTo ? 1 : filter.getMaxStackSize()); + int unloadedLinkCount = getUnloadedLinks(); boolean shouldSatisfy = filter.isEmpty() || inStorage >= demand; boolean shouldPromiseSatisfy = filter.isEmpty() || inStorage + promised >= demand; + boolean shouldWait = unloadedLinkCount > 0; - if (lastReportedLevelInStorage == inStorage && lastReportedPromises == promised && satisfied == shouldSatisfy - && promisedSatisfied == shouldPromiseSatisfy) + if (lastReportedLevelInStorage == inStorage && lastReportedPromises == promised + && lastReportedUnloadedLinks == unloadedLinkCount && satisfied == shouldSatisfy + && promisedSatisfied == shouldPromiseSatisfy && waitingForNetwork == shouldWait) return; lastReportedLevelInStorage = inStorage; satisfied = shouldSatisfy; lastReportedPromises = promised; promisedSatisfied = shouldPromiseSatisfy; + lastReportedUnloadedLinks = unloadedLinkCount; + waitingForNetwork = shouldWait; blockEntity.sendData(); } @@ -141,7 +150,7 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { return; if (!(blockEntity instanceof FactoryPanelBlockEntity fpbe)) return; - if (satisfied || promisedSatisfied) + if (satisfied || promisedSatisfied || waitingForNetwork) return; if (timer > 0) { timer = Math.min(timer, REQUEST_INTERVAL); @@ -204,17 +213,17 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { @Override public void onShortInteract(Player player, InteractionHand hand, Direction side, BlockHitResult hitResult) { - if (getFilter().isEmpty()) { + if (player.level().isClientSide) + if (FactoryPanelConnectionHandler.panelClicked(getWorld(), player, this)) + return; + + if (getFilter().isEmpty() && !AllBlocks.FACTORY_PANEL.isIn(player.getItemInHand(hand))) { super.onShortInteract(player, hand, side, hitResult); return; } - if (!player.level().isClientSide) - return; - if (FactoryPanelConnectionHandler.panelClicked(getWorld(), player, getPanelPosition())) - return; - - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> displayScreen(player)); + if (player.level().isClientSide) + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> displayScreen(player)); } public void enable() { @@ -262,6 +271,13 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { super.destroy(); } + public int getUnloadedLinks() { + if (getWorld().isClientSide()) + return lastReportedUnloadedLinks; + UUID freqId = ((StockCheckingBlockEntity) blockEntity).behaviour.freqId; + return Create.LOGISTICS.getUnloadedLinkCount(freqId); + } + public int getLevelInStorage() { if (getWorld().isClientSide()) return lastReportedLevelInStorage; @@ -306,8 +322,10 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { panelTag.putInt("LastLevel", lastReportedLevelInStorage); panelTag.putInt("LastPromised", lastReportedPromises); + panelTag.putInt("LastUnloadedLinks", lastReportedUnloadedLinks); panelTag.putBoolean("Satisfied", satisfied); panelTag.putBoolean("PromisedSatisfied", promisedSatisfied); + panelTag.putBoolean("Waiting", waitingForNetwork); panelTag.put("Targeting", NBTHelper.writeCompoundList(targeting, FactoryPanelPosition::write)); panelTag.put("TargetedBy", NBTHelper.writeCompoundList(targetedBy.values(), FactoryPanelConnection::write)); panelTag.putString("RecipeAddress", recipeAddress); @@ -331,8 +349,10 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { upTo = panelTag.getBoolean("UpTo"); lastReportedLevelInStorage = panelTag.getInt("LastLevel"); lastReportedPromises = panelTag.getInt("LastPromised"); + lastReportedUnloadedLinks = panelTag.getInt("LastUnloadedLinks"); satisfied = panelTag.getBoolean("Satisfied"); promisedSatisfied = panelTag.getBoolean("PromisedSatisfied"); + waitingForNetwork = panelTag.getBoolean("Waiting"); promiseClearingInterval = panelTag.getInt("PromiseClearingInterval"); targeting.clear(); @@ -411,6 +431,9 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { key += " (In Progress)"; } + if (waitingForNetwork) + key = "Some links are not loaded"; + return CreateLang.temporaryText(key) .component(); } @@ -422,14 +445,16 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { @Override public MutableComponent getTip() { - return CreateLang.translateDirect( - filter.isEmpty() ? "logistics.filter.click_to_set" : "logistics.factory_panel.click_to_configure"); + return CreateLang + .translateDirect(filter.isEmpty() ? "logistics.filter.click_to_set" : "factory_panel.click_to_configure"); } @Override public MutableComponent getCountLabelForValueBox() { if (filter.isEmpty()) return Components.empty(); + if (waitingForNetwork) + return Components.literal("?"); int inStorage = getLevelInStorage(); int promised = getPromised(); @@ -442,8 +467,8 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { } return CreateLang.text(" " + inStorage + stacks) - .color(inStorage >= count ? 0xD7FFA8 : 0xFFBFA8) - .add(CreateLang.text(promised == 0 ? "" : "+" + promised)) + .color(satisfied ? 0xD7FFA8 : promisedSatisfied ? 0xffcd75 : 0xFFBFA8) + .add(CreateLang.text(promised == 0 ? "" : "\u23F6")) .add(CreateLang.text("/") .style(ChatFormatting.WHITE)) .add(CreateLang.text(count + stacks + " ") diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockItem.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockItem.java new file mode 100644 index 0000000000..606fd337f5 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockItem.java @@ -0,0 +1,33 @@ +package com.simibubi.create.content.logistics.factoryBoard; + +import com.simibubi.create.AllSoundEvents; +import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedBlockItem; +import com.simibubi.create.foundation.utility.CreateLang; + +import net.minecraft.world.InteractionResult; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.block.Block; + +public class FactoryPanelBlockItem extends LogisticallyLinkedBlockItem { + + public FactoryPanelBlockItem(Block pBlock, Properties pProperties) { + super(pBlock, pProperties); + } + + @Override + public InteractionResult place(BlockPlaceContext pContext) { + ItemStack stack = pContext.getItemInHand(); + + if (!isTuned(stack)) { + AllSoundEvents.DENY.playOnServer(pContext.getLevel(), pContext.getClickedPos()); + pContext.getPlayer() + .displayClientMessage(CreateLang.temporaryText("Tune to a transmitter before placing") + .component(), true); + return InteractionResult.FAIL; + } + + return super.place(pContext); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionHandler.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionHandler.java index 540ceb7551..e2d439c8d5 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionHandler.java @@ -1,27 +1,106 @@ package com.simibubi.create.content.logistics.factoryBoard; import com.simibubi.create.AllPackets; +import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.CatnipClient; +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.VecHelper; +import net.minecraft.ChatFormatting; +import net.minecraft.client.Minecraft; +import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; public class FactoryPanelConnectionHandler { static FactoryPanelPosition connectingFrom; + static AABB connectingFromBox; - public static boolean panelClicked(LevelAccessor level, Player player, FactoryPanelPosition panelPos) { + public static boolean panelClicked(LevelAccessor level, Player player, FactoryPanelBehaviour panel) { if (connectingFrom == null) return false; FactoryPanelBehaviour at = FactoryPanelBehaviour.at(level, connectingFrom); - if (at == null) { + if (panel.getPanelPosition() + .equals(connectingFrom) || at == null) { + player.displayClientMessage(Component.empty(), true); connectingFrom = null; + connectingFromBox = null; return false; } -// at.displayScreen(player); + AllPackets.getChannel() - .sendToServer(new FactoryPanelConnectionPacket(panelPos, connectingFrom)); + .sendToServer(new FactoryPanelConnectionPacket(panel.getPanelPosition(), connectingFrom)); + + ItemStack filterFrom = panel.getFilter(); + ItemStack filterTo = at.getFilter(); + + if (filterTo.isEmpty() || filterFrom.isEmpty()) + player.displayClientMessage(CreateLang.temporaryText("Factory Panels are now connected") + .style(ChatFormatting.GREEN) + .component(), true); + else + player.displayClientMessage(CreateLang.temporaryText("Now using " + filterFrom.getHoverName() + .getString() + " to create " + + filterTo.getHoverName() + .getString()) + .style(ChatFormatting.GREEN) + .component(), true); + connectingFrom = null; + connectingFromBox = null; return true; } + public static void clientTick() { + if (connectingFrom == null || connectingFromBox == null) + return; + + Minecraft mc = Minecraft.getInstance(); + FactoryPanelBehaviour at = FactoryPanelBehaviour.at(mc.level, connectingFrom); + + if (!connectingFrom.pos() + .closerThan(mc.player.blockPosition(), 16) || at == null) { + connectingFrom = null; + connectingFromBox = null; + mc.player.displayClientMessage(Component.empty(), true); + return; + } + + CatnipClient.OUTLINER.showAABB(connectingFrom, connectingFromBox) + .colored(AnimationTickHolder.getTicks() % 16 > 8 ? 0x38b764 : 0xa7f070) + .lineWidth(1 / 16f); + + mc.player.displayClientMessage(CreateLang.temporaryText("Click a second panel to connect...") + .component(), true); + } + + public static boolean onRightClick() { + if (connectingFrom == null || connectingFromBox == null) + return false; + Minecraft mc = Minecraft.getInstance(); + if (!mc.player.isShiftKeyDown()) + return false; + connectingFrom = null; + connectingFromBox = null; + mc.player.displayClientMessage(CreateLang.temporaryText("Input connection aborted") + .component(), true); + return true; + } + + public static void startConnection(FactoryPanelBehaviour behaviour) { + connectingFrom = behaviour.getPanelPosition(); + BlockState blockState = behaviour.blockEntity.getBlockState(); + Vec3 location = behaviour.getSlotPositioning() + .getLocalOffset(behaviour.getWorld(), behaviour.getPos(), blockState) + .add(Vec3.atLowerCornerOf(behaviour.getPos())); + Vec3 plane = VecHelper.axisAlingedPlaneOf(FactoryPanelBlock.connectedDirection(blockState)); + connectingFromBox = + new AABB(location, location).inflate(plane.x * 3 / 16f, plane.y * 3 / 16f, plane.z * 3 / 16f); + } + } diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelRenderer.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelRenderer.java index 5ba69d73d1..1d88aca0a1 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelRenderer.java @@ -4,11 +4,12 @@ import java.util.List; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllPartialModels; +import com.simibubi.create.AllSpriteShifts; import com.simibubi.create.foundation.blockEntity.renderer.SmartBlockEntityRenderer; import com.simibubi.create.foundation.render.RenderTypes; import net.createmod.catnip.render.CachedBuffers; -import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.theme.Color; import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.MultiBufferSource; @@ -86,15 +87,14 @@ public class FactoryPanelRenderer extends SmartBlockEntityRenderer= 8; boolean success = connection.successTracker() .booleanValue(); - int color = behaviour.promisedSatisfied ? (flicker ? 0xBC75FF : 0x915BC6) - : behaviour.satisfied ? 0x85E59B : (flicker ? 0x7783A8 : 0x687291); + int color = behaviour.waitingForNetwork ? 0x5B3B3B + : behaviour.satisfied ? 0x9EFF7F : behaviour.promisedSatisfied ? 0x7FD6DB : 0x708DAD; yOffset = behaviour.promisedSatisfied ? 1 : behaviour.satisfied ? 0 : 2; - if (glow > 0) { + if (!behaviour.waitingForNetwork && glow > 0 && !behaviour.satisfied) { color = Color.mixColors(color, success ? 0xEAF2EC : 0xE5654B, glow); if (!behaviour.satisfied && !behaviour.promisedSatisfied) yOffset += (success ? 1 : 2) * glow; @@ -109,16 +109,19 @@ public class FactoryPanelRenderer extends SmartBlockEntityRenderer { - FactoryPanelConnectionHandler.connectingFrom = behaviour.getPanelPosition(); + FactoryPanelConnectionHandler.startConnection(behaviour); minecraft.setScreen(null); }); newInputButton.setToolTip(CreateLang.temporaryText("Connect an input panel") @@ -155,19 +155,56 @@ public class FactoryPanelScreen extends AbstractSimiScreen { int inputX = x + 20 + (slot % 3 * 18); int inputY = y + 28 + (slot / 3 * 18); graphics.renderItem(itemStack.stack, inputX, inputY); - graphics.renderItemDecorations(font, behaviour.getFilter(), inputX, inputY, itemStack.count + ""); + if (!itemStack.stack.isEmpty()) + graphics.renderItemDecorations(font, itemStack.stack, inputX, inputY, itemStack.count + ""); + slot++; + if (mouseX >= inputX - 1 && mouseX < inputX - 1 + 18 && mouseY >= inputY - 1 && mouseY < inputY - 1 + 18) { - graphics.renderComponentTooltip(font, List.of(CreateLang.temporaryText("Send ") - .add(CreateLang.itemName(itemStack.stack) - .add(CreateLang.text(" x" + itemStack.count))) + if (itemStack.stack.isEmpty()) { + graphics.renderComponentTooltip(font, List.of(CreateLang.temporaryText("Empty panel") + .color(ScrollInput.HEADER_RGB) + .component(), + CreateLang.temporaryText("Left-Click to disconnect") + .style(ChatFormatting.DARK_GRAY) + .style(ChatFormatting.ITALIC) + .component()), + mouseX, mouseY); + } else + graphics.renderComponentTooltip(font, List.of(CreateLang.temporaryText("Send ") + .add(CreateLang.itemName(itemStack.stack) + .add(CreateLang.text(" x" + itemStack.count))) + .color(ScrollInput.HEADER_RGB) + .component(), + CreateLang.temporaryText("Scroll to change amount") + .style(ChatFormatting.DARK_GRAY) + .style(ChatFormatting.ITALIC) + .component(), + CreateLang.temporaryText("Left-Click to disconnect") + .style(ChatFormatting.DARK_GRAY) + .style(ChatFormatting.ITALIC) + .component()), + mouseX, mouseY); + } + } + + if (inputConfig.size() > 0) { + AllGuiTextures.FACTORY_PANEL_ARROW.render(graphics, + x + 70 + Mth.clamp(behaviour.targetedBy.size(), 0, 2) * 9, y + 16 + middleHeight() / 2); + int outputX = x + 128; + int outputY = y + 16 + middleHeight() / 2; + AllGuiTextures.FACTORY_PANEL_SLOT_FRAME.render(graphics, outputX - 2, outputY - 2); + graphics.renderItem(outputConfig.stack, outputX, outputY); + graphics.renderItemDecorations(font, behaviour.getFilter(), outputX, outputY, outputConfig.count + ""); + + if (mouseX >= outputX - 1 && mouseX < outputX - 1 + 18 && mouseY >= outputY - 1 + && mouseY < outputY - 1 + 18) { + graphics.renderComponentTooltip(font, List.of(CreateLang.temporaryText("Expect ") + .add(CreateLang.itemName(outputConfig.stack) + .add(CreateLang.text(" x" + outputConfig.count))) .color(ScrollInput.HEADER_RGB) .component(), CreateLang.temporaryText("Scroll to change amount") - .style(ChatFormatting.DARK_GRAY) - .style(ChatFormatting.ITALIC) - .component(), - CreateLang.temporaryText("Left-Click to disconnect") .style(ChatFormatting.DARK_GRAY) .style(ChatFormatting.ITALIC) .component()), @@ -175,28 +212,6 @@ public class FactoryPanelScreen extends AbstractSimiScreen { } } - AllGuiTextures.FACTORY_PANEL_ARROW.render(graphics, x + 70 + Mth.clamp(behaviour.targetedBy.size(), 0, 2) * 9, - y + 16 + middleHeight() / 2); - int outputX = x + 128; - int outputY = y + 16 + middleHeight() / 2; - AllGuiTextures.FACTORY_PANEL_SLOT_FRAME.render(graphics, outputX - 2, outputY - 2); - - graphics.renderItem(outputConfig.stack, outputX, outputY); - graphics.renderItemDecorations(font, behaviour.getFilter(), outputX, outputY, outputConfig.count + ""); - - if (mouseX >= outputX - 1 && mouseX < outputX - 1 + 18 && mouseY >= outputY - 1 && mouseY < outputY - 1 + 18) { - graphics.renderComponentTooltip(font, List.of(CreateLang.temporaryText("Expect ") - .add(CreateLang.itemName(outputConfig.stack) - .add(CreateLang.text(" x" + outputConfig.count))) - .color(ScrollInput.HEADER_RGB) - .component(), - CreateLang.temporaryText("Scroll to change amount") - .style(ChatFormatting.DARK_GRAY) - .style(ChatFormatting.ITALIC) - .component()), - mouseX, mouseY); - } - PoseStack ms = graphics.pose(); ms.pushPose(); ms.translate(0, 0, 10); @@ -338,19 +353,23 @@ public class FactoryPanelScreen extends AbstractSimiScreen { int inputY = y + 28 + (i / 3 * 18); if (mouseX >= inputX && mouseX < inputX + 16 && mouseY >= inputY && mouseY < inputY + 16) { BigItemStack itemStack = inputConfig.get(i); + if (itemStack.stack.isEmpty()) + return true; itemStack.count = Mth.clamp((int) (itemStack.count + Math.signum(pDelta) * (hasShiftDown() ? 10 : 1)), 1, 64); return true; } } - int outputX = x + 128; - int outputY = y + 16 + middleHeight() / 2; - if (mouseX >= outputX && mouseX < outputX + 16 && mouseY >= outputY && mouseY < outputY + 16) { - BigItemStack itemStack = outputConfig; - itemStack.count = - Mth.clamp((int) (itemStack.count + Math.signum(pDelta) * (hasShiftDown() ? 10 : 1)), 1, 64); - return true; + if (inputConfig.size() > 0) { + int outputX = x + 128; + int outputY = y + 16 + middleHeight() / 2; + if (mouseX >= outputX && mouseX < outputX + 16 && mouseY >= outputY && mouseY < outputY + 16) { + BigItemStack itemStack = outputConfig; + itemStack.count = + Mth.clamp((int) (itemStack.count + Math.signum(pDelta) * (hasShiftDown() ? 10 : 1)), 1, 64); + return true; + } } return super.mouseScrolled(mouseX, mouseY, pDelta); @@ -364,7 +383,7 @@ public class FactoryPanelScreen extends AbstractSimiScreen { private void sendIt(@Nullable FactoryPanelPosition toRemove, boolean clearPromises) { Map inputs = new HashMap<>(); - if (inputs.size() == connections.size()) + if (inputConfig.size() == connections.size()) for (int i = 0; i < inputConfig.size(); i++) inputs.put(connections.get(i) .from(), inputConfig.get(i).count); diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/postbox/PostboxBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/postbox/PostboxBlockEntity.java index 00fbe102aa..847ed935d0 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/postbox/PostboxBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/postbox/PostboxBlockEntity.java @@ -2,12 +2,18 @@ package com.simibubi.create.content.logistics.packagePort.postbox; import java.lang.ref.WeakReference; +import com.simibubi.create.AllSoundEvents; import com.simibubi.create.Create; import com.simibubi.create.content.logistics.packagePort.PackagePortBlockEntity; import com.simibubi.create.content.trains.station.GlobalStation; import com.simibubi.create.content.trains.station.GlobalStation.GlobalPackagePort; +import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.item.BoneMealItem; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; @@ -16,9 +22,62 @@ public class PostboxBlockEntity extends PackagePortBlockEntity { public WeakReference trackedGlobalStation; + public LerpedFloat flag; + + private boolean sendParticles; + public PostboxBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); trackedGlobalStation = new WeakReference(null); + flag = LerpedFloat.linear() + .startWithValue(0); + } + + @Override + public void tick() { + super.tick(); + if (!level.isClientSide) { + if (sendParticles) + sendData(); + return; + } + + float currentTarget = flag.getChaseTarget(); + if (currentTarget == 0 || flag.settled()) { + int target = inventory.isEmpty() ? 0 : 1; + if (target != currentTarget) { + flag.chase(target, 0.1f, Chaser.LINEAR); + if (target == 1) + AllSoundEvents.CONTRAPTION_ASSEMBLE.playAt(level, worldPosition, 1, 2, true); + } + } + boolean settled = flag.getValue() > .15f; + flag.tickChaser(); + if (currentTarget == 0 && settled != flag.getValue() > .15f) + AllSoundEvents.CONTRAPTION_DISASSEMBLE.playAt(level, worldPosition, 0.75f, 1.5f, true); + + if (sendParticles) { + sendParticles = false; + BoneMealItem.addGrowthParticles(level, worldPosition, 40); + } + } + + public void spawnParticles() { + sendParticles = true; + } + + @Override + protected void write(CompoundTag tag, boolean clientPacket) { + super.write(tag, clientPacket); + if (clientPacket && sendParticles) + NBTHelper.putMarker(tag, "Particles"); + sendParticles = false; + } + + @Override + protected void read(CompoundTag tag, boolean clientPacket) { + super.read(tag, clientPacket); + sendParticles = clientPacket && tag.contains("Particles"); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/postbox/PostboxRenderer.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/postbox/PostboxRenderer.java index 96358b7cae..b078d66007 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/postbox/PostboxRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/postbox/PostboxRenderer.java @@ -5,7 +5,9 @@ import com.mojang.math.Axis; import com.simibubi.create.AllPartialModels; import com.simibubi.create.foundation.blockEntity.renderer.SmartBlockEntityRenderer; +import dev.engine_room.flywheel.lib.transform.Transform; import net.createmod.catnip.render.CachedBuffers; +import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.lang.Components; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; @@ -25,13 +27,29 @@ public class PostboxRenderer extends SmartBlockEntityRenderer flag, PostboxBlockEntity be, float partialTicks) { + float value = be.flag.getValue(partialTicks); + float progress = (float) (Math.pow(Math.min(value * 5, 1), 2)); + if (be.flag.getChaseTarget() > 0 && !be.flag.settled() && progress == 1) { + float wiggleProgress = (value - .2f) / .8f; + progress += (Math.sin(wiggleProgress * (2 * Mth.PI) * 4) / 8f) / Math.max(1, 8f * wiggleProgress); + } + flag.translate(0, 10 / 16f, 2 / 16f); + flag.rotateXDegrees(-progress * 90); + flag.translateBack(0, 10 / 16f, 2 / 16f); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/GlobalLogisticsManager.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/GlobalLogisticsManager.java index 8c6e4f53c4..63c6de4f38 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/GlobalLogisticsManager.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/GlobalLogisticsManager.java @@ -31,6 +31,10 @@ public class GlobalLogisticsManager { logisticsNetworks.computeIfAbsent(networkId, $ -> new LogisticsNetwork(networkId)).totalLinks++; markDirty(); } + + public void linkLoaded(UUID networkId) { + logisticsNetworks.computeIfAbsent(networkId, $ -> new LogisticsNetwork(networkId)).loadedLinks++; + } public void linkRemoved(UUID networkId) { LogisticsNetwork logisticsNetwork = logisticsNetworks.get(networkId); @@ -41,6 +45,20 @@ public class GlobalLogisticsManager { logisticsNetworks.remove(networkId); markDirty(); } + + public void linkInvalidated(UUID networkId) { + LogisticsNetwork logisticsNetwork = logisticsNetworks.get(networkId); + if (logisticsNetwork == null) + return; + logisticsNetwork.loadedLinks--; + } + + public int getUnloadedLinkCount(UUID networkId) { + LogisticsNetwork logisticsNetwork = logisticsNetworks.get(networkId); + if (logisticsNetwork == null) + return 0; + return logisticsNetwork.totalLinks - logisticsNetwork.loadedLinks; + } public RequestPromiseQueue getQueuedPromises(UUID networkId) { return !logisticsNetworks.containsKey(networkId) ? null : logisticsNetworks.get(networkId).panelPromises; diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java index c665b4a7bd..623347cd66 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java @@ -38,6 +38,17 @@ public class LogisticallyLinkedBehaviour extends BlockEntityBehaviour { public UUID freqId; private boolean addedGlobally = false; + private boolean loadedGlobally = false; + private boolean global = false; + + // + + public LogisticallyLinkedBehaviour(SmartBlockEntity be, boolean global) { + super(be); + this.global = global; + linkId = LINK_ID_GENERATOR.getAndIncrement(); + freqId = UUID.randomUUID(); + } // @@ -117,14 +128,10 @@ public class LogisticallyLinkedBehaviour extends BlockEntityBehaviour { // - public LogisticallyLinkedBehaviour(SmartBlockEntity be) { - super(be); - linkId = LINK_ID_GENERATOR.getAndIncrement(); - freqId = UUID.randomUUID(); - } - @Override public void unload() { + if (loadedGlobally && global) + Create.LOGISTICS.linkInvalidated(freqId); super.unload(); remove(this); } @@ -139,17 +146,26 @@ public class LogisticallyLinkedBehaviour extends BlockEntityBehaviour { super.initialize(); if (getWorld().isClientSide) return; - if (!addedGlobally) { + + if (!loadedGlobally && global) { + loadedGlobally = true; + Create.LOGISTICS.linkLoaded(freqId); + } + + if (!addedGlobally && global) { addedGlobally = true; blockEntity.setChanged(); - Create.LOGISTICS.linkAdded(freqId); + if (blockEntity instanceof PackagerLinkBlockEntity) + Create.LOGISTICS.linkAdded(freqId); } + } @Override public void destroy() { super.destroy(); - Create.LOGISTICS.linkRemoved(freqId); + if (addedGlobally && global) + Create.LOGISTICS.linkRemoved(freqId); } public void redstonePowerChanged(int power) { diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedClientHandler.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedClientHandler.java index ff605150b6..329d548bbf 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedClientHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedClientHandler.java @@ -2,6 +2,7 @@ package com.simibubi.create.content.logistics.packagerLink; import java.util.UUID; +import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import net.createmod.catnip.CatnipClient; @@ -10,6 +11,7 @@ import net.minecraft.client.player.LocalPlayer; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.phys.shapes.VoxelShape; public class LogisticallyLinkedClientHandler { @@ -30,9 +32,12 @@ public class LogisticallyLinkedClientHandler { UUID uuid = tag.getUUID("Freq"); for (LogisticallyLinkedBehaviour behaviour : LogisticallyLinkedBehaviour.getAllPresent(uuid, false)) { SmartBlockEntity be = behaviour.blockEntity; - CatnipClient.OUTLINER.showAABB(behaviour, be.getBlockState() - .getShape(player.level(), be.getBlockPos()) - .bounds() + VoxelShape shape = be.getBlockState() + .getShape(player.level(), be.getBlockPos()); + if (shape.isEmpty()) + continue; + CatnipClient.OUTLINER.showAABB(behaviour, shape.bounds() + .inflate(AllBlockEntityTypes.FACTORY_PANEL.is(be) ? -1 / 16f : 0) .move(be.getBlockPos()), 2) .lineWidth(1 / 16f); } diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsNetwork.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsNetwork.java index f497a5a357..c7edc82b1b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsNetwork.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsNetwork.java @@ -9,11 +9,13 @@ public class LogisticsNetwork { public UUID id; public RequestPromiseQueue panelPromises; public int totalLinks; + public int loadedLinks; public LogisticsNetwork(UUID networkId) { id = networkId; panelPromises = new RequestPromiseQueue(); totalLinks = 0; + loadedLinks = 0; } public CompoundTag write() { diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java index f6ab6c5b97..e533680645 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java @@ -63,7 +63,7 @@ public class PackagerLinkBlockEntity extends LinkWithBulbBlockEntity { @Override public void addBehaviours(List behaviours) { - behaviours.add(behaviour = new LogisticallyLinkedBehaviour(this)); + behaviours.add(behaviour = new LogisticallyLinkedBehaviour(this, true)); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/AutoRequestData.java b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/AutoRequestData.java index 50511c68b1..50a5d2501d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/AutoRequestData.java +++ b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/AutoRequestData.java @@ -1,7 +1,6 @@ package com.simibubi.create.content.logistics.redstoneRequester; import com.simibubi.create.content.logistics.stockTicker.PackageOrder; -import com.simibubi.create.content.logistics.stockTicker.StockTickerBlockEntity; import com.simibubi.create.foundation.utility.CreateLang; import net.minecraft.ChatFormatting; @@ -11,7 +10,6 @@ import net.minecraft.nbt.NbtUtils; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; public class AutoRequestData { @@ -21,15 +19,6 @@ public class AutoRequestData { public String targetDim = ""; public boolean isValid = false; - public void triggerRequest(Level level, BlockPos position) { - BlockPos tickerPos = position.offset(targetOffset); - if (!level.isLoaded(tickerPos)) - return; - BlockEntity blockEntity = level.getBlockEntity(tickerPos); - if (blockEntity instanceof StockTickerBlockEntity stbe) - stbe.broadcastPackageRequest(encodedRequest, null, encodedTargetAdress); - } - public static AutoRequestData read(CompoundTag tag) { AutoRequestData requestData = new AutoRequestData(); requestData.targetOffset = NbtUtils.readBlockPos(tag.getCompound("TargetOffset")); diff --git a/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlock.java b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlock.java index 1b3574802e..42242af997 100644 --- a/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlock.java @@ -19,24 +19,43 @@ import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.TooltipFlag; -import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.Level; import net.minecraft.world.level.SignalGetter; import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.storage.loot.LootParams.Builder; -import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.phys.BlockHitResult; public class RedstoneRequesterBlock extends Block implements IBE { + public static final BooleanProperty POWERED = BlockStateProperties.POWERED; + public RedstoneRequesterBlock(Properties pProperties) { super(pProperties); + registerDefaultState(defaultBlockState().setValue(POWERED, false)); + } + + @Override + protected void createBlockStateDefinition( + net.minecraft.world.level.block.state.StateDefinition.Builder pBuilder) { + super.createBlockStateDefinition(pBuilder.add(POWERED)); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext pContext) { + BlockState stateForPlacement = super.getStateForPlacement(pContext); + if (stateForPlacement == null) + return null; + return stateForPlacement.setValue(POWERED, pContext.getLevel() + .hasNeighborSignal(pContext.getClickedPos())); } @Override @@ -44,6 +63,23 @@ public class RedstoneRequesterBlock extends Block implements IBE be.use(pPlayer)); + } + public static void programRequester(ServerPlayer player, StockTickerBlockEntity be, PackageOrder order, String address) { ItemStack stack = player.getMainHandItem(); @@ -60,13 +96,13 @@ public class RedstoneRequesterBlock extends Block implements IBE pTooltip, TooltipFlag pFlag) { - super.appendHoverText(pStack, pLevel, pTooltip, pFlag); - appendRequesterTooltip(pStack, pTooltip); + CompoundTag stackTag = stack.getTag(); + CompoundTag beTag = stackTag.getCompound(BlockItem.BLOCK_ENTITY_TAG); + beTag.putUUID("Freq", be.behaviour.freqId); + stackTag.put(BlockItem.BLOCK_ENTITY_TAG, beTag); + + player.setItemInHand(InteractionHand.MAIN_HAND, stack); } public static void appendRequesterTooltip(ItemStack pStack, List pTooltip) { @@ -74,10 +110,6 @@ public class RedstoneRequesterBlock extends Block implements IBE " + compoundnbt.getString("EncodedAddress")) -// .withStyle(ChatFormatting.GOLD)); - if (!compoundnbt.contains("EncodedRequest", Tag.TAG_COMPOUND)) return; @@ -99,23 +131,13 @@ public class RedstoneRequesterBlock extends Block implements IBE rrbe.requestData = AutoRequestData.readFromItem(pLevel, player, requesterPos, pStack)); - } - - @Override - public List getDrops(BlockState pState, Builder pParams) { - @SuppressWarnings("deprecation") - List drops = super.getDrops(pState, pParams); - BlockEntity blockEntity = pParams.getOptionalParameter(LootContextParams.BLOCK_ENTITY); - if (!(blockEntity instanceof RedstoneRequesterBlockEntity rrbe)) - return drops; - - for (ItemStack itemStack : drops) - if (itemStack.is(this.asItem())) - rrbe.requestData.writeToItem(rrbe.getBlockPos(), itemStack); - - return drops; + withBlockEntityDo(pLevel, requesterPos, rrbe -> { + AutoRequestData data = AutoRequestData.readFromItem(pLevel, player, requesterPos, pStack); + if (data == null) + return; + rrbe.encodedRequest = data.encodedRequest; + rrbe.encodedTargetAdress = data.encodedTargetAdress; + }); } @Override @@ -123,6 +145,7 @@ public class RedstoneRequesterBlock extends Block implements IBE type, BlockPos pos, BlockState state) { super(type, pos, state); + allowPartialRequests = false; } - @Override - public void addBehaviours(List behaviours) {} - protected void onRedstonePowerChanged() { boolean hasNeighborSignal = level.hasNeighborSignal(worldPosition); if (redstonePowered == hasNeighborSignal) return; + lastRequestSucceeded = false; if (hasNeighborSignal) - requestData.triggerRequest(level, worldPosition); + triggerRequest(); redstonePowered = hasNeighborSignal; - setChanged(); + notifyUpdate(); + } + + public void triggerRequest() { + if (encodedRequest.isEmpty()) + return; + + if (!allowPartialRequests) { + InventorySummary summaryOfOrder = new InventorySummary(); + encodedRequest.stacks() + .forEach(summaryOfOrder::add); + + InventorySummary summary = getAccurateSummary(); + for (BigItemStack entry : summaryOfOrder.getStacks()) + if (summary.getCountOf(entry.stack) < entry.count) + return; + } + + broadcastPackageRequest(encodedRequest, null, encodedTargetAdress); + lastRequestSucceeded = true; } @Override protected void read(CompoundTag tag, boolean clientPacket) { super.read(tag, clientPacket); redstonePowered = tag.getBoolean("Powered"); - requestData = AutoRequestData.read(tag); + lastRequestSucceeded = tag.getBoolean("Success"); + allowPartialRequests = tag.getBoolean("AllowPartial"); + encodedRequest = PackageOrder.read(tag.getCompound("EncodedRequest")); + encodedTargetAdress = tag.getString("EncodedAddress"); } @Override protected void write(CompoundTag tag, boolean clientPacket) { super.write(tag, clientPacket); tag.putBoolean("Powered", redstonePowered); - requestData.write(tag); + tag.putBoolean("Success", lastRequestSucceeded); + tag.putBoolean("AllowPartial", allowPartialRequests); + tag.putString("EncodedAddress", encodedTargetAdress); + tag.put("EncodedRequest", encodedRequest.write()); + } + + public InteractionResult use(Player player) { + if (player == null || player.isCrouching()) + return InteractionResult.PASS; + if (player instanceof FakePlayer) + return InteractionResult.PASS; + if (level.isClientSide) + return InteractionResult.SUCCESS; + + NetworkHooks.openScreen((ServerPlayer) player, this, worldPosition); + return InteractionResult.SUCCESS; + } + + @Override + public Component getDisplayName() { + return Components.empty(); + } + + @Override + public AbstractContainerMenu createMenu(int pContainerId, Inventory pPlayerInventory, Player pPlayer) { + return RedstoneRequesterMenu.create(pContainerId, pPlayerInventory, this); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlockItem.java b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlockItem.java new file mode 100644 index 0000000000..1394e327d6 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlockItem.java @@ -0,0 +1,39 @@ +package com.simibubi.create.content.logistics.redstoneRequester; + +import java.util.List; + +import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedBlockItem; +import com.simibubi.create.foundation.utility.CreateLang; + +import net.minecraft.ChatFormatting; +import net.minecraft.nbt.Tag; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; + +public class RedstoneRequesterBlockItem extends LogisticallyLinkedBlockItem { + + public RedstoneRequesterBlockItem(Block pBlock, Properties pProperties) { + super(pBlock, pProperties); + } + + @Override + public void appendHoverText(ItemStack pStack, Level pLevel, List pTooltip, TooltipFlag pFlag) { + if (!isTuned(pStack)) + return; + + if (!pStack.getTag() + .contains("EncodedRequest", Tag.TAG_COMPOUND)) { + super.appendHoverText(pStack, pLevel, pTooltip, pFlag); + return; + } + + CreateLang.translate("logistically_linked.tooltip") + .style(ChatFormatting.GOLD) + .addTo(pTooltip); + RedstoneRequesterBlock.appendRequesterTooltip(pStack, pTooltip); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterConfigurationPacket.java b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterConfigurationPacket.java new file mode 100644 index 0000000000..c2cf4a3442 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterConfigurationPacket.java @@ -0,0 +1,61 @@ +package com.simibubi.create.content.logistics.redstoneRequester; + +import java.util.ArrayList; +import java.util.List; + +import com.simibubi.create.content.logistics.BigItemStack; +import com.simibubi.create.foundation.networking.BlockEntityConfigurationPacket; + +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.item.ItemStack; + +public class RedstoneRequesterConfigurationPacket extends BlockEntityConfigurationPacket { + + private String address; + private boolean allowPartial; + private List amounts; + + public RedstoneRequesterConfigurationPacket(BlockPos pos, String address, boolean allowPartial, + List amounts) { + super(pos); + this.address = address; + this.allowPartial = allowPartial; + this.amounts = amounts; + } + + public RedstoneRequesterConfigurationPacket(FriendlyByteBuf buffer) { + super(buffer); + } + + @Override + protected void writeSettings(FriendlyByteBuf buffer) { + buffer.writeUtf(address); + buffer.writeBoolean(allowPartial); + buffer.writeVarInt(amounts.size()); + amounts.forEach(buffer::writeVarInt); + } + + @Override + protected void readSettings(FriendlyByteBuf buffer) { + address = buffer.readUtf(); + allowPartial = buffer.readBoolean(); + int size = buffer.readVarInt(); + amounts = new ArrayList<>(); + for (int i = 0; i < size; i++) + amounts.add(buffer.readVarInt()); + } + + @Override + protected void applySettings(RedstoneRequesterBlockEntity be) { + be.encodedTargetAdress = address; + List stacks = be.encodedRequest.stacks(); + for (int i = 0; i < stacks.size() && i < amounts.size(); i++) { + ItemStack stack = stacks.get(i).stack; + if (!stack.isEmpty()) + stacks.set(i, new BigItemStack(stack, amounts.get(i))); + } + be.allowPartialRequests = allowPartial; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterMenu.java b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterMenu.java new file mode 100644 index 0000000000..7a5539035c --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterMenu.java @@ -0,0 +1,82 @@ +package com.simibubi.create.content.logistics.redstoneRequester; + +import java.util.ArrayList; +import java.util.List; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllMenuTypes; +import com.simibubi.create.content.logistics.BigItemStack; +import com.simibubi.create.content.logistics.stockTicker.PackageOrder; +import com.simibubi.create.foundation.gui.menu.GhostItemMenu; + +import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.inventory.MenuType; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.items.ItemStackHandler; +import net.minecraftforge.items.SlotItemHandler; + +public class RedstoneRequesterMenu extends GhostItemMenu { + + public RedstoneRequesterMenu(MenuType type, int id, Inventory inv, RedstoneRequesterBlockEntity contentHolder) { + super(type, id, inv, contentHolder); + } + + public RedstoneRequesterMenu(MenuType type, int id, Inventory inv, FriendlyByteBuf extraData) { + super(type, id, inv, extraData); + } + + public static RedstoneRequesterMenu create(int id, Inventory inv, RedstoneRequesterBlockEntity be) { + return new RedstoneRequesterMenu(AllMenuTypes.REDSTONE_REQUESTER.get(), id, inv, be); + } + + @Override + protected ItemStackHandler createGhostInventory() { + ItemStackHandler inventory = new ItemStackHandler(9); + List stacks = contentHolder.encodedRequest.stacks(); + for (int i = 0; i < stacks.size(); i++) + inventory.setStackInSlot(i, stacks.get(i).stack.copyWithCount(1)); + return inventory; + } + + @Override + protected boolean allowRepeats() { + return true; + } + + @Override + @OnlyIn(Dist.CLIENT) + protected RedstoneRequesterBlockEntity createOnClient(FriendlyByteBuf extraData) { + BlockPos blockPos = extraData.readBlockPos(); + return AllBlocks.REDSTONE_REQUESTER.get() + .getBlockEntity(Minecraft.getInstance().level, blockPos); + } + + @Override + protected void addSlots() { + int playerX = 5; + int playerY = 124; + int slotX = 21; + int slotY = 25; + + addPlayerSlots(playerX, playerY); + for (int i = 0; i < 9; i++) + addSlot(new SlotItemHandler(ghostInventory, i, slotX + 18 * i, slotY)); + } + + @Override + protected void saveData(RedstoneRequesterBlockEntity contentHolder) { + List stacks = contentHolder.encodedRequest.stacks(); + ArrayList list = new ArrayList<>(); + for (int i = 0; i < ghostInventory.getSlots(); i++) + list.add(new BigItemStack(ghostInventory.getStackInSlot(i) + .copyWithCount(1), i < stacks.size() ? stacks.get(i).count : 1)); + + contentHolder.encodedRequest = new PackageOrder(list); + contentHolder.sendData(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterScreen.java b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterScreen.java new file mode 100644 index 0000000000..b0007ea648 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterScreen.java @@ -0,0 +1,230 @@ +package com.simibubi.create.content.logistics.redstoneRequester; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllPackets; +import com.simibubi.create.content.logistics.BigItemStack; +import com.simibubi.create.content.trains.station.NoShadowFontWrapper; +import com.simibubi.create.foundation.gui.AllGuiTextures; +import com.simibubi.create.foundation.gui.AllIcons; +import com.simibubi.create.foundation.gui.menu.AbstractSimiContainerScreen; +import com.simibubi.create.foundation.gui.widget.IconButton; +import com.simibubi.create.foundation.gui.widget.ScrollInput; +import com.simibubi.create.foundation.utility.CreateLang; + +import net.createmod.catnip.gui.element.GuiGameElement; +import net.minecraft.ChatFormatting; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.EditBox; +import net.minecraft.client.renderer.Rect2i; +import net.minecraft.network.chat.Component; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.items.SlotItemHandler; + +public class RedstoneRequesterScreen extends AbstractSimiContainerScreen { + + private EditBox addressBox; + private IconButton confirmButton; + private List extraAreas = Collections.emptyList(); + private List amounts = new ArrayList<>(); + + private IconButton dontAllowPartial; + private IconButton allowPartial; + + public RedstoneRequesterScreen(RedstoneRequesterMenu container, Inventory inv, Component title) { + super(container, inv, title); + + for (int i = 0; i < 9; i++) + amounts.add(1); + + List stacks = menu.contentHolder.encodedRequest.stacks(); + for (int i = 0; i < stacks.size(); i++) + amounts.set(i, Math.max(1, stacks.get(i).count)); + } + + @Override + protected void containerTick() { + super.containerTick(); + for (int i = 0; i < amounts.size(); i++) + if (menu.ghostInventory.getStackInSlot(i) + .isEmpty()) + amounts.set(i, 1); + } + + @Override + protected void init() { + int bgHeight = AllGuiTextures.REDSTONE_REQUESTER.getHeight(); + int bgWidth = AllGuiTextures.REDSTONE_REQUESTER.getWidth(); + setWindowSize(bgWidth, bgHeight + AllGuiTextures.PLAYER_INVENTORY.getHeight()); + super.init(); + clearWidgets(); + int x = getGuiLeft(); + int y = getGuiTop(); + + if (addressBox == null) { + addressBox = new EditBox(new NoShadowFontWrapper(font), x + 50, y + 53, 110, 10, Component.empty()); + addressBox.setValue(menu.contentHolder.encodedTargetAdress); + addressBox.setBordered(false); + addressBox.setTextColor(0x555555); + addressBox.setFocused(false); + addressBox.mouseClicked(0, 0, 0); + addressBox.setMaxLength(25); + } + addRenderableWidget(addressBox); + + confirmButton = new IconButton(x + bgWidth - 33, y + bgHeight - 24, AllIcons.I_CONFIRM); + confirmButton.withCallback(() -> minecraft.player.closeContainer()); + addRenderableWidget(confirmButton); + + allowPartial = new IconButton(x + 12, y + bgHeight - 24, AllIcons.I_PARTIAL_REQUESTS); + allowPartial.withCallback(() -> { + allowPartial.active = false; + dontAllowPartial.active = true; + }); + allowPartial.active = !menu.contentHolder.allowPartialRequests; + allowPartial.setToolTip(CreateLang.temporaryText("Allow partial orders") + .component()); + addRenderableWidget(allowPartial); + + dontAllowPartial = new IconButton(x + 12 + 18, y + bgHeight - 24, AllIcons.I_FULL_REQUESTS); + dontAllowPartial.withCallback(() -> { + allowPartial.active = true; + dontAllowPartial.active = false; + }); + dontAllowPartial.active = menu.contentHolder.allowPartialRequests; + dontAllowPartial.setToolTip(CreateLang.temporaryText("Must send all items") + .component()); + addRenderableWidget(dontAllowPartial); + + extraAreas = List.of(new Rect2i(x + bgWidth, y + bgHeight - 50, 70, 60)); + } + + @Override + protected void renderBg(GuiGraphics pGuiGraphics, float pPartialTick, int pMouseX, int pMouseY) { + int x = getGuiLeft(); + int y = getGuiTop(); + AllGuiTextures.REDSTONE_REQUESTER.render(pGuiGraphics, x, y); + renderPlayerInventory(pGuiGraphics, x - 3, y + 106); + + Component title = CreateLang.temporaryText("Redstone Requester") + .component(); + pGuiGraphics.drawString(font, title, x + 100 - font.width(title) / 2, y + 4, 0x3D3C48, false); + + GuiGameElement.of(AllBlocks.REDSTONE_REQUESTER.asStack()) + .scale(3) + .render(pGuiGraphics, x + 220, y + 60); + } + + @Override + protected void renderForeground(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.renderForeground(graphics, mouseX, mouseY, partialTicks); + int x = getGuiLeft(); + int y = getGuiTop(); + + for (int i = 0; i < amounts.size(); i++) { + int inputX = x + 21 + i * 18; + int inputY = y + 25; + ItemStack itemStack = menu.ghostInventory.getStackInSlot(i); + if (itemStack.isEmpty()) + continue; + PoseStack ms = graphics.pose(); + ms.pushPose(); + ms.translate(0, 0, 100); + graphics.renderItemDecorations(font, itemStack, inputX, inputY, "" + amounts.get(i)); + ms.popPose(); + } + + if (addressBox.isHovered() && !addressBox.isFocused()) { + if (addressBox.getValue() + .isBlank()) + graphics.renderComponentTooltip(font, List.of(CreateLang.temporaryText("Send order to...") + .color(ScrollInput.HEADER_RGB) + .component(), + CreateLang.temporaryText("Enter the address this") + .style(ChatFormatting.GRAY) + .component(), + CreateLang.temporaryText("order should be send to.") + .style(ChatFormatting.GRAY) + .component(), + CreateLang.translate("gui.schedule.lmb_edit") + .style(ChatFormatting.DARK_GRAY) + .style(ChatFormatting.ITALIC) + .component()), + mouseX, mouseY); + else + graphics.renderComponentTooltip(font, List.of(CreateLang.temporaryText("Sending order to") + .color(ScrollInput.HEADER_RGB) + .component(), + CreateLang.temporaryText("'" + addressBox.getValue() + "'") + .style(ChatFormatting.GRAY) + .component()), + mouseX, mouseY); + } + } + + @Override + public boolean mouseScrolled(double mouseX, double mouseY, double pDelta) { + int x = getGuiLeft(); + int y = getGuiTop(); + + for (int i = 0; i < amounts.size(); i++) { + int inputX = x + 21 + i * 18; + int inputY = y + 25; + if (mouseX >= inputX && mouseX < inputX + 16 && mouseY >= inputY && mouseY < inputY + 16) { + ItemStack itemStack = menu.ghostInventory.getStackInSlot(i); + if (itemStack.isEmpty()) + return true; + amounts.set(i, + Mth.clamp((int) (amounts.get(i) + Math.signum(pDelta) * (hasShiftDown() ? 10 : 1)), 1, 256)); + return true; + } + } + + return super.mouseScrolled(mouseX, mouseY, pDelta); + } + + @Override + protected List getTooltipFromContainerItem(ItemStack pStack) { + List tooltip = super.getTooltipFromContainerItem(pStack); + if (!(hoveredSlot instanceof SlotItemHandler)) + return tooltip; + + int slotIndex = this.hoveredSlot.getSlotIndex(); + if (slotIndex >= amounts.size()) + return tooltip; + + return List.of(CreateLang.temporaryText("Send ") + .add(CreateLang.itemName(pStack) + .add(CreateLang.text(" x" + amounts.get(slotIndex)))) + .color(ScrollInput.HEADER_RGB) + .component(), + CreateLang.temporaryText("Scroll to change amount") + .style(ChatFormatting.DARK_GRAY) + .style(ChatFormatting.ITALIC) + .component(), + CreateLang.translate("gui.scrollInput.shiftScrollsFaster") + .style(ChatFormatting.DARK_GRAY) + .style(ChatFormatting.ITALIC) + .component()); + } + + @Override + public List getExtraAreas() { + return extraAreas; + } + + @Override + public void removed() { + AllPackets.getChannel() + .sendToServer(new RedstoneRequesterConfigurationPacket(menu.contentHolder.getBlockPos(), + addressBox.getValue(), !allowPartial.active, amounts)); + super.removed(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockCheckingBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockCheckingBlockEntity.java index 34decbfc66..9467f4e5e7 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockCheckingBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockCheckingBlockEntity.java @@ -28,7 +28,7 @@ public abstract class StockCheckingBlockEntity extends SmartBlockEntity { @Override public void addBehaviours(List behaviours) { - behaviours.add(behaviour = new LogisticallyLinkedBehaviour(this)); + behaviours.add(behaviour = new LogisticallyLinkedBehaviour(this, false)); } public InventorySummary getRecentSummary() { diff --git a/src/main/java/com/simibubi/create/content/trains/entity/Train.java b/src/main/java/com/simibubi/create/content/trains/entity/Train.java index 64c7405464..292e59e891 100644 --- a/src/main/java/com/simibubi/create/content/trains/entity/Train.java +++ b/src/main/java/com/simibubi/create/content/trains/entity/Train.java @@ -131,6 +131,7 @@ public class Train { public float accumulatedSteamRelease; int tickOffset; + int ticksSinceLastMailTransfer; double[] stress; // advancements @@ -268,6 +269,15 @@ public class Train { updateConductors(); return; } + + GlobalStation currentStation = getCurrentStation(); + if (currentStation != null) { + ticksSinceLastMailTransfer++; + if (ticksSinceLastMailTransfer > 20) { + currentStation.runMailTransfer(); + ticksSinceLastMailTransfer = 0; + } + } updateConductors(); runtime.tick(level); @@ -918,6 +928,7 @@ public class Train { reservedSignalBlocks.clear(); runtime.destinationReached(); station.runMailTransfer(); + ticksSinceLastMailTransfer = 0; } public void setCurrentStation(GlobalStation station) { diff --git a/src/main/java/com/simibubi/create/content/trains/station/GlobalStation.java b/src/main/java/com/simibubi/create/content/trains/station/GlobalStation.java index 5062dbbaab..e4ca488a85 100644 --- a/src/main/java/com/simibubi/create/content/trains/station/GlobalStation.java +++ b/src/main/java/com/simibubi/create/content/trains/station/GlobalStation.java @@ -195,14 +195,17 @@ public class GlobalStation extends SingleBlockEntityEdgePoint { for (Entry entry : connectedPorts.entrySet()) { GlobalPackagePort port = entry.getValue(); BlockPos pos = entry.getKey(); + PostboxBlockEntity box = null; if (!PackageItem.matchAddress(stack, port.address)) continue; IItemHandler postboxInventory = port.offlineBuffer; if (level != null && level.isLoaded(pos) - && level.getBlockEntity(pos) instanceof PostboxBlockEntity ppbe) + && level.getBlockEntity(pos) instanceof PostboxBlockEntity ppbe) { postboxInventory = ppbe.inventory; + box = ppbe; + } ItemStack result = ItemHandlerHelper.insertItemStacked(postboxInventory, stack, false); if (!result.isEmpty()) @@ -210,6 +213,9 @@ public class GlobalStation extends SingleBlockEntityEdgePoint { Create.RAILWAYS.markTracksDirty(); carriageInventory.setStackInSlot(slot, ItemStack.EMPTY); + if (box != null) + box.spawnParticles(); + break; } } @@ -218,11 +224,14 @@ public class GlobalStation extends SingleBlockEntityEdgePoint { for (Entry entry : connectedPorts.entrySet()) { GlobalPackagePort port = entry.getValue(); BlockPos pos = entry.getKey(); + PostboxBlockEntity box = null; IItemHandlerModifiable postboxInventory = port.offlineBuffer; if (level != null && level.isLoaded(pos) - && level.getBlockEntity(pos) instanceof PostboxBlockEntity ppbe) + && level.getBlockEntity(pos) instanceof PostboxBlockEntity ppbe) { postboxInventory = ppbe.inventory; + box = ppbe; + } for (int slot = 0; slot < postboxInventory.getSlots(); slot++) { ItemStack stack = postboxInventory.getStackInSlot(slot); @@ -237,6 +246,8 @@ public class GlobalStation extends SingleBlockEntityEdgePoint { postboxInventory.setStackInSlot(slot, ItemStack.EMPTY); Create.RAILWAYS.markTracksDirty(); + if (box != null) + box.spawnParticles(); } } diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/CreateRecipeProvider.java b/src/main/java/com/simibubi/create/foundation/data/recipe/CreateRecipeProvider.java index d3bfc77368..e68a6d4b94 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/CreateRecipeProvider.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/CreateRecipeProvider.java @@ -123,6 +123,10 @@ public abstract class CreateRecipeProvider extends RecipeProvider { static ItemLike brassCasing() { return AllBlocks.BRASS_CASING.get(); } + + static ItemLike cardboard() { + return AllItems.CARDBOARD.get(); + } static ItemLike railwayCasing() { return AllBlocks.RAILWAY_CASING.get(); diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java index 85ef41cd69..609cd59d3f 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java @@ -115,17 +115,30 @@ public class StandardRecipeGen extends CreateRecipeProvider { .pattern("CCC") .pattern("CCC") .pattern("CCC")), - - CARDBOARD_BLOCK = create(AllBlocks.CARDBOARD_BLOCK).unlockedBy(AllItems.CARDBOARD::get) - .viaShaped(b -> b.define('C', AllItems.CARDBOARD.get()) + + CARDBOARD_BLOCK = create(AllBlocks.CARDBOARD_BLOCK).unlockedBy(I::cardboard) + .viaShaped(b -> b.define('C', I.cardboard()) .pattern("CC") .pattern("CC")), - + + BOUND_CARDBOARD_BLOCK = create(AllBlocks.BOUND_CARDBOARD_BLOCK).returns(8) + .unlockedBy(I::cardboard) + .viaShaped(b -> b.define('C', AllBlocks.CARDBOARD_BLOCK.get()) + .define('S', Tags.Items.STRING) + .pattern("CCC") + .pattern("CSC") + .pattern("CCC")), + CARDBOARD_FROM_BLOCK = create(AllItems.CARDBOARD).withSuffix("_from_block") .returns(4) - .unlockedBy(AllItems.CARDBOARD::get) + .unlockedBy(I::cardboard) .viaShapeless(b -> b.requires(AllBlocks.CARDBOARD_BLOCK.get())), + CARDBOARD_FROM_BOUND_BLOCK = create(AllItems.CARDBOARD).withSuffix("_from_bound_block") + .returns(4) + .unlockedBy(I::cardboard) + .viaShapeless(b -> b.requires(AllBlocks.BOUND_CARDBOARD_BLOCK.get())), + BRASS_COMPACTING = metalCompacting(ImmutableList.of(AllItems.BRASS_NUGGET, AllItems.BRASS_INGOT, AllBlocks.BRASS_BLOCK), ImmutableList.of(I::brassNugget, I::brass, I::brassBlock)), @@ -1091,6 +1104,28 @@ public class StandardRecipeGen extends CreateRecipeProvider { FILTER_CLEAR = clearData(AllItems.FILTER), ATTRIBUTE_FILTER_CLEAR = clearData(AllItems.ATTRIBUTE_FILTER), DISPLAY_CLOTH_CLEAR = clearData(AllItems.DISPLAY_CLOTH), + CARDBOARD_HELMET = create(AllItems.CARDBOARD_HELMET).unlockedBy(I::cardboard) + .viaShaped(b -> b.define('P', I.cardboard()) + .pattern("PPP") + .pattern("P P")), + + CARDBOARD_CHESTPLATE = create(AllItems.CARDBOARD_CHESTPLATE).unlockedBy(I::cardboard) + .viaShaped(b -> b.define('P', I.cardboard()) + .pattern("P P") + .pattern("PPP") + .pattern("PPP")), + + CARDBOARD_LEGGINGS = create(AllItems.CARDBOARD_LEGGINGS).unlockedBy(I::cardboard) + .viaShaped(b -> b.define('P', I.cardboard()) + .pattern("PPP") + .pattern("P P") + .pattern("P P")), + + CARDBOARD_BOOTS = create(AllItems.CARDBOARD_BOOTS).unlockedBy(I::cardboard) + .viaShaped(b -> b.define('P', I.cardboard()) + .pattern("P P") + .pattern("P P")), + DIVING_HELMET = create(AllItems.COPPER_DIVING_HELMET).unlockedByTag(I::copper) .viaShaped(b -> b.define('G', Tags.Items.GLASS) .define('P', I.copper()) @@ -1128,6 +1163,24 @@ public class StandardRecipeGen extends CreateRecipeProvider { .viaShapeless(b -> b.requires(AllItems.DOUGH.get()) .requires(Tags.Items.DYES_LIME)), + BOOK = create(() -> Items.BOOK).unlockedBy(I::cardboard) + .viaShapeless(b -> b.requires(I.cardboard()) + .requires(Items.PAPER) + .requires(Items.PAPER) + .requires(Items.PAPER)), + + NAME_TAG = create(() -> Items.NAME_TAG).unlockedBy(I::cardboard) + .viaShapeless(b -> b.requires(Tags.Items.DYES_BLACK) + .requires(Tags.Items.STRING) + .requires(I.cardboard())), + + ITEM_FRAME = create(() -> Items.ITEM_FRAME).unlockedBy(I::cardboard) + .viaShaped(b -> b.define('S', Tags.Items.RODS_WOODEN) + .define('P', I.cardboard()) + .pattern("SSS") + .pattern("SPS") + .pattern("SSS")), + TREE_FERTILIZER = create(AllItems.TREE_FERTILIZER).returns(2) .unlockedBy(() -> Items.BONE_MEAL) .viaShapeless(b -> b.requires(Ingredient.of(ItemTags.SMALL_FLOWERS), 2) diff --git a/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java b/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java index d53893c04e..5e9f55bb5a 100644 --- a/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java @@ -40,6 +40,7 @@ import com.simibubi.create.content.kinetics.mechanicalArm.ArmInteractionPointHan import com.simibubi.create.content.kinetics.turntable.TurntableHandler; import com.simibubi.create.content.logistics.depot.EjectorTargetHandler; import com.simibubi.create.content.logistics.displayCloth.DisplayClothOverlayRenderer; +import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelConnectionHandler; import com.simibubi.create.content.logistics.packagePort.PackagePortTargetSelectionHandler; import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedClientHandler; import com.simibubi.create.content.processing.sequenced.SequencedAssemblyRecipe; @@ -185,6 +186,7 @@ public class ClientEvents { LogisticallyLinkedClientHandler.tick(); DisplayClothOverlayRenderer.tick(); CardboardArmorStealthOverlay.clientTick(); + FactoryPanelConnectionHandler.clientTick(); } @SubscribeEvent diff --git a/src/main/java/com/simibubi/create/foundation/events/InputEvents.java b/src/main/java/com/simibubi/create/foundation/events/InputEvents.java index c7049bb3fa..6b59cffb32 100644 --- a/src/main/java/com/simibubi/create/foundation/events/InputEvents.java +++ b/src/main/java/com/simibubi/create/foundation/events/InputEvents.java @@ -6,6 +6,7 @@ import com.simibubi.create.content.contraptions.wrench.RadialWrenchHandler; import com.simibubi.create.content.equipment.toolbox.ToolboxHandlerClient; import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorInteractionHandler; import com.simibubi.create.content.kinetics.chainConveyor.ChainPackageInteractionHandler; +import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelConnectionHandler; import com.simibubi.create.content.logistics.packagePort.PackagePortTargetSelectionHandler; import com.simibubi.create.content.redstone.link.controller.LinkedControllerClientHandler; import com.simibubi.create.content.trains.TrainHUD; @@ -80,6 +81,11 @@ public class InputEvents { if (CreateClient.GLUE_HANDLER.onMouseInput(key == mc.options.keyAttack)) event.setCanceled(true); } + + if (key == mc.options.keyUse && FactoryPanelConnectionHandler.onRightClick()) { + event.setCanceled(true); + return; + } if (key == mc.options.keyPickItem) { if (ToolboxHandlerClient.onPickItem()) diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java index 73c1a36fce..15549b1bcd 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java @@ -151,13 +151,15 @@ public enum AllGuiTextures implements ScreenElement, TextureSheetSegment { VALUE_SETTINGS_LABEL_BG("value_settings", 0, 31, 81, 11), // HILO - FACTORY_PANEL_TOP("factory_panel", 0, 0, 172, 23), - FACTORY_PANEL_MIDDLE("factory_panel", 0, 23, 172, 26), - FACTORY_PANEL_BOTTOM("factory_panel", 0, 49, 172, 54), - FACTORY_PANEL_SLOT_FRAME("factory_panel", 3, 106, 20, 20), - FACTORY_PANEL_SLOT("factory_panel", 4, 107, 18, 18), - FACTORY_PANEL_ARROW("factory_panel", 27, 108, 22, 16), - FACTORY_PANEL_ARROW_FILLED("factory_panel", 50, 108, 22, 16), + FACTORY_PANEL_TOP("restocker_and_requester", 0, 0, 172, 23), + FACTORY_PANEL_MIDDLE("restocker_and_requester", 0, 23, 172, 26), + FACTORY_PANEL_BOTTOM("restocker_and_requester", 0, 49, 172, 54), + FACTORY_PANEL_SLOT_FRAME("restocker_and_requester", 3, 106, 20, 20), + FACTORY_PANEL_SLOT("restocker_and_requester", 4, 107, 18, 18), + FACTORY_PANEL_ARROW("restocker_and_requester", 27, 108, 22, 16), + FACTORY_PANEL_ARROW_FILLED("restocker_and_requester", 50, 108, 22, 16), + + REDSTONE_REQUESTER("restocker_and_requester", 0, 134, 210, 100), // JEI JEI_SLOT("jei/widgets", 18, 18), diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java b/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java index c74bc4df70..5c23ee4e07 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java @@ -164,7 +164,9 @@ public class AllIcons implements ScreenElement { I_FX_BLEND_OFF = next(), I_SEND_ONLY = newRow(), - I_SEND_AND_RECEIVE = next(); + I_SEND_AND_RECEIVE = next(), + I_PARTIAL_REQUESTS = next(), + I_FULL_REQUESTS = next(); ; public AllIcons(int x, int y) { diff --git a/src/main/resources/assets/create/lang/default/interface.json b/src/main/resources/assets/create/lang/default/interface.json index 99ccedffb5..7839781416 100644 --- a/src/main/resources/assets/create/lang/default/interface.json +++ b/src/main/resources/assets/create/lang/default/interface.json @@ -979,6 +979,8 @@ "create.logistically_linked.connected": "Connected to other Transmitters successfully", "create.logistically_linked.tooltip": "Frequency configured", "create.logistically_linked.tooltip_clear": "Place in crafting grid to reset", + + "create.factory_panel.click_to_configure": "Click to specify a recipe", "create.display_source.label": "Attached Label", "create.display_source.combine_item_names": "Combine Item Names", diff --git a/src/main/resources/assets/create/models/block/bound_cardboard_block.json b/src/main/resources/assets/create/models/block/bound_cardboard_block.json new file mode 100644 index 0000000000..94c7b2d03d --- /dev/null +++ b/src/main/resources/assets/create/models/block/bound_cardboard_block.json @@ -0,0 +1,24 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "0": "create:block/bound_cardboard_block_front", + "1": "create:block/bound_cardboard_block_side", + "2": "create:block/bound_cardboard_block_top", + "particle": "create:block/bound_cardboard_block_side" + }, + "elements": [ + { + "from": [0, 0, 0], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [0, 0, 16, 16], "texture": "#0", "cullface": "north"}, + "east": {"uv": [0, 0, 16, 16], "texture": "#1", "cullface": "east"}, + "south": {"uv": [0, 0, 16, 16], "texture": "#0", "cullface": "south"}, + "west": {"uv": [0, 0, 16, 16], "texture": "#1", "cullface": "west"}, + "up": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#2", "cullface": "up"}, + "down": {"uv": [16, 0, 0, 16], "rotation": 90, "texture": "#2", "cullface": "down"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/cardboard_block.json b/src/main/resources/assets/create/models/block/cardboard_block.json index 8a9476d965..3c6a240083 100644 --- a/src/main/resources/assets/create/models/block/cardboard_block.json +++ b/src/main/resources/assets/create/models/block/cardboard_block.json @@ -12,12 +12,12 @@ "from": [0, 0, 0], "to": [16, 16, 16], "faces": { - "north": {"uv": [0, 0, 16, 16], "texture": "#0"}, - "east": {"uv": [0, 0, 16, 16], "texture": "#1"}, - "south": {"uv": [0, 0, 16, 16], "texture": "#0"}, - "west": {"uv": [0, 0, 16, 16], "texture": "#1"}, - "up": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#2"}, - "down": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#2"} + "north": {"uv": [0, 0, 16, 16], "texture": "#0", "cullface": "north"}, + "east": {"uv": [0, 0, 16, 16], "texture": "#1", "cullface": "east"}, + "south": {"uv": [0, 0, 16, 16], "texture": "#0", "cullface": "south"}, + "west": {"uv": [0, 0, 16, 16], "texture": "#1", "cullface": "west"}, + "up": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#2", "cullface": "up"}, + "down": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#2", "cullface": "down"} } } ] diff --git a/src/main/resources/assets/create/models/block/package_postbox/flag.json b/src/main/resources/assets/create/models/block/package_postbox/flag.json index 137ff9917a..ba1778694f 100644 --- a/src/main/resources/assets/create/models/block/package_postbox/flag.json +++ b/src/main/resources/assets/create/models/block/package_postbox/flag.json @@ -24,7 +24,7 @@ "to": [1.5, 9, 15], "rotation": {"angle": 0, "axis": "y", "origin": [1, 9, 11]}, "faces": { - "east": {"uv": [8, 8, 10.5, 10], "rotation": 270, "texture": "#0"}, + "east": {"uv": [10.5, 8, 8, 10], "rotation": 270, "texture": "#0"}, "west": {"uv": [8, 8, 10.5, 10], "rotation": 90, "texture": "#0"} } } diff --git a/src/main/resources/assets/create/models/block/redstone_requester.json b/src/main/resources/assets/create/models/block/redstone_requester.json deleted file mode 100644 index da6f8d69fe..0000000000 --- a/src/main/resources/assets/create/models/block/redstone_requester.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "credit": "Made with Blockbench", - "parent": "block/block", - "textures": { - "0": "block/note_block", - "1": "create:block/packager_block_defrag", - "2": "create:block/andesite_casing", - "particle": "block/note_block" - }, - "elements": [ - { - "from": [0, 0, 0], - "to": [16, 3, 16], - "faces": { - "north": {"uv": [8, 6.5, 16, 8], "texture": "#1"}, - "east": {"uv": [8, 6.5, 16, 8], "texture": "#1"}, - "south": {"uv": [8, 6.5, 16, 8], "texture": "#1"}, - "west": {"uv": [8, 6.5, 16, 8], "texture": "#1"}, - "down": {"uv": [0, 0, 16, 16], "texture": "#2"} - } - }, - { - "from": [0, 14, 0], - "to": [16, 16, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [0, 14, 0]}, - "faces": { - "north": {"uv": [0, 0, 8, 1], "texture": "#1"}, - "east": {"uv": [0, 0, 8, 1], "texture": "#1"}, - "south": {"uv": [0, 0, 8, 1], "texture": "#1"}, - "west": {"uv": [0, 0, 8, 1], "texture": "#1"}, - "up": {"uv": [0, 0, 16, 16], "texture": "#2"}, - "down": {"uv": [0, 0, 16, 16], "texture": "#missing"} - } - }, - { - "from": [0, 3, 0], - "to": [16, 14, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [0, 2, 0]}, - "faces": { - "north": {"uv": [0, 1, 16, 12], "texture": "#0"}, - "east": {"uv": [0, 1, 16, 12], "texture": "#0"}, - "south": {"uv": [0, 1, 16, 12], "texture": "#0"}, - "west": {"uv": [0, 1, 16, 12], "texture": "#0"} - } - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/redstone_requester/block.json b/src/main/resources/assets/create/models/block/redstone_requester/block.json new file mode 100644 index 0000000000..d64305fff7 --- /dev/null +++ b/src/main/resources/assets/create/models/block/redstone_requester/block.json @@ -0,0 +1,23 @@ +{ + "parent": "block/block", + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/redstone_requester_side", + "2": "create:block/redstone_requester_top", + "particle": "create:block/redstone_requester_side" + }, + "elements": [ + { + "from": [0, 0, 0], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [0, 0, 16, 16], "texture": "#0", "cullface": "north"}, + "east": {"uv": [0, 0, 16, 16], "texture": "#0", "cullface": "east"}, + "south": {"uv": [0, 0, 16, 16], "texture": "#0", "cullface": "south"}, + "west": {"uv": [0, 0, 16, 16], "texture": "#0", "cullface": "west"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#2", "cullface": "up"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#2", "cullface": "down"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/redstone_requester/block_powered.json b/src/main/resources/assets/create/models/block/redstone_requester/block_powered.json new file mode 100644 index 0000000000..6a88c28128 --- /dev/null +++ b/src/main/resources/assets/create/models/block/redstone_requester/block_powered.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/redstone_requester/block", + "textures": { + "0": "create:block/redstone_requester_side_powered", + "particle": "create:block/redstone_requester_side_powered" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/block/bound_cardboard_block_front.png b/src/main/resources/assets/create/textures/block/bound_cardboard_block_front.png new file mode 100644 index 0000000000000000000000000000000000000000..4a659a42cfd125b32a41e2b4f6ffb444d861d90e GIT binary patch literal 253 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFAcbSHBheGTwx^1Fd54boFyt=akR{0761m-v9sr literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/bound_cardboard_block_side.png b/src/main/resources/assets/create/textures/block/bound_cardboard_block_side.png new file mode 100644 index 0000000000000000000000000000000000000000..e1c791df3a346cfdccdaf077b78460d195d4cb8f GIT binary patch literal 237 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF0 z{y*<}chBS#7g|$x8C6c*+i~$POJJ%dlS0bn8%OR|G~5bfxV+3`e%tp`_n-Y#w3YtP dn|8T^@mhe)37!4#B7oK~c)I$ztaD0e0su2DSwH{) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/bound_cardboard_block_top.png b/src/main/resources/assets/create/textures/block/bound_cardboard_block_top.png new file mode 100644 index 0000000000000000000000000000000000000000..92ce990d1449a37d15659de0bacbc6393bf1d368 GIT binary patch literal 268 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFt_xen^$;dNyU-P3vX>abOET0v%n*= zn1O-s5C}7hYIrpO1*<$=977~7oAx?#9WoGLP}jYe9G4KZqCEHnv&qrL7xp=9tjbfV zY_Pkt=0T}MTEH=0_GD8jvxY_WE#do~YNx3$+4x13*E{ms{$$R5ccwoHPnu(&pP_y7 ze6h{hM_Yt_kKdba(ivr@VLOmY4X|Gj1}HWZsZ}y9wwD22WQ% Jmvv4FO#rrNWugE8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/factory_panel_arrows_animated.png b/src/main/resources/assets/create/textures/block/factory_panel_arrows_animated.png new file mode 100644 index 0000000000000000000000000000000000000000..b1e4a37c202da45ff128c0eee266ea361076934f GIT binary patch literal 573 zcmV-D0>b@?P)Px#1ZP1_K>z@;j|==^1poj58&FJCMgRZ*#l^+j+uL<@b)cZ2W@cvj`T4W6vj6}9 zUMF6V00009bW%=J|NsC0|NsC008>wR5&!@I32;bRa{vGi!vFvd!vV){sAK>D0hUQb zK~zXft(Ae2gCGnt@!b zK!@TUfpA)yf;NTp>Y}Hcp_PJcH2T)eN?nFQXtplPVM;^G0;lyzfgTAccnYLivCiWZ z`e|YEstdkK_DA7sJc5P4`piR>pceWlr_5R)kVk!i#}34K1k?IA4__twAzT7_m&d96 zh+vbDEb%BD^Bv|qD&xVUzO+9kkk}s+$UPn>ApkwL6miWX%11aYO+kAuB-?r5N#7nA zjyn9jY%iXd0D=S*lt8w9#v_EeKUgt7UcsK6<$yQ&0k>Sx07uxm}%?T)u=H zao}-%e?-KAM@pP>gph177}apha=^oPI)r=wTXu1u%9!ZsecJmE=u|9WZmRVi00000 LNkvXXu0mjfs0jU; literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/factory_panel_connections.png b/src/main/resources/assets/create/textures/block/factory_panel_connections.png index fc43276b3e0f7ca03b976de3e3d7301c9255cdbc..8d7417bcbf5b4bfc8783d8e0a4ff47580c3a5631 100644 GIT binary patch delta 146 zcmV;D0B!&30qFsdMiblH+jVtyprD{;W@Z2Y00^PcUy)fHbie=r4!{9w)`Ne>;N5anw0J_K_JumJFg9xTs>)|+vn`WJ&9 zl(leAHL;N(GU7U+Y6|x&z$l=_ju5GT-Y1%?K3MqzjUS<)d;kCd07*qoM6N<$f=-h> AW&i*H delta 147 zcmV;E0Bry10qOyeMib!R;AUoKR8&-%nVA3p08R*?)sa~ob-@4t4#5Gqk!$S$002`- zL_t(2Q-zKJ3cxT317r06Z(icM&ca{^QoX7z3Q-+K=Z_$VNZlf13l}YShuY069N%K# z0uRa)R1yn`NQRyr*iO;;y`Uk|VyzI=KhF`>RTp1_0+}LNA`$=q002ovPDHLkV1fqy BId}j7 diff --git a/src/main/resources/assets/create/textures/block/factory_panel_connections_animated.png b/src/main/resources/assets/create/textures/block/factory_panel_connections_animated.png new file mode 100644 index 0000000000000000000000000000000000000000..8c0d2ce47b5537b7802f9fbace387735cec8d827 GIT binary patch literal 572 zcmeAS@N?(olHy`uVBq!ia0vp^0zllr!3-o#y(K{$#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6PdH{dJ& z@j5nlwq(m2hm`n(Uehn_*1OBJH=;=MiYaH*?p4<`4HoV=f1t!Is>!VNOV-Ba?Tb1W zNHy;a3)MW$!4Y~r)lz3=M&yG{a;g^=GqCD625En*j5%bJduG$4ruUQn2L6!jPk6ZA z?z4gVheI-DDOHUQa!+~XtOcG6`kcORQ#1WddjaQ*U^(^QhRtVNL^|6G&XlkCtTBgQ z?&;dkhK)yl&Tx45(Snn4MQ-LX)BX+pFMGDIyxlq>>3O4iajpcPd|muD^Y`8ij*MJk z2aov`rpNw0qw2?ZG#D%TX8nSZ_F0&k1j`TPBC(^#d8cQUU` za^1_4bkwfjdxo>e?4e#Y}= zUe&juiUv0;3vQ;{^f+2<{P@6djzdQIzxX$u{6?(W38`VV&k9T9H`NM%>S6AG{oehI z#Rrep;9h|s9=5~0$G0%c)m>7&^Lu})`2ApRv8tc8Z~ro$lGfRHbyH9gFxD76UHx3v IIVCg!0LZ8JfdBvi literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/factory_panel_connections_animated.png.mcmeta b/src/main/resources/assets/create/textures/block/factory_panel_connections_animated.png.mcmeta new file mode 100644 index 0000000000..c6f8b9bd57 --- /dev/null +++ b/src/main/resources/assets/create/textures/block/factory_panel_connections_animated.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/block/redstone_requester_side.png b/src/main/resources/assets/create/textures/block/redstone_requester_side.png new file mode 100644 index 0000000000000000000000000000000000000000..a8f78f1810c55b8c4a820c574f949b32201febaf GIT binary patch literal 303 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G|;0G|+711k$h50~KZz|72~mZtLgvnTJ_wl2y>vpT?XN~~j)iGrhsgtoS! zt&N8p1A{pOgEa$#sfld_BcnSbll`W+MxZ&I1s;*b3=DjSL74G){)!Z!V2!7XV~9p@ zsDHOmg8~P$Aggip-~apDGD-`5`gzM38XE6$WSF}8*}i$|!J(LTQF2l;L(;`fQy3GO zymnak(u6{1-oD!MNS%G|;0G|+711k$h50~KZz|72~mZtLgvnTJ_wl2y>vpT?XN~~j)iGrhsgtoS! zt&PV_28Id-hDHX4bqoxqCbnl882AnDT?U%NS>O>_%)r2R7=#&*=dVZs3f6hLIEH8h zhx#)L9ai9A7G%v{TlW9|Yk}PI!`yP51uP8Adj&6Kb;On08TiQZhr*#iA*! ziA-Kq8Ic0M-8Xg}=Y&R~D%{rr4G!1=PR_kO)d u-#Tf-z3b^`%-?l=nemy?{CmFqL+(o{Zw_T)X=)D~&Z?)crfN4yo=H2;bm&})Lb9p{$B7rSY*$x@sRwW^Qk!{DWX&>LiB)VWM%-)I zR#d2Y@CHoJH23gzH#o$#VCl*PZ^d&4LJSOgK9(KJr3_C1EoJa@^>bP0l+XkKUldau literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/gui/factory_panel.png b/src/main/resources/assets/create/textures/gui/factory_panel.png deleted file mode 100644 index 38156df31f4b5c2dacf8124faaccd0df00339e6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1565 zcmds1`BPI@6u$5A0)`NaK~tq75s*cL2~a>}2|K|-VA#q|1POv5k)&mbkO$SeU?tQ# zwt@o{9C27o5mAcE6D+7ubci&8AOuj*IzU7UR7qZ+o&Ev+xp%%h-}&aw`R1H6_uiA? zp+QtbQ$qj%HJIxk0RTjV5Llx}(7~qIsEaM@RGdd{9Kx|30SMSA!nsL-YiSvM$nXx7}V|MSe{6tCd;Rlw~B8KJ`9d zKby1~!9Izs#xw8T5#tlxAMzi-CHT}-F9)}vYx2EK&{TWdM6@@_D7=Z3PSI3X$1brT z8UvzXJJs?lXS*Ee;ZVcS(dmx3YWiV_l-}D&6=@u-rk}%_`Efv6undl z$lh07xF|wE%{^uT(a?w-DIgQTDh&f*D{y&)uqA+6Za9T-!JZpFuoXr=;dNqr?l$9p z>`LGP)}(m&iv{wn*qwFa@;;*nyc1jmPx~fP}E6Uy0X$?!@wVVLc`~+u|)6}ZrTVv z%kq`0M-tf6@bAMNTdqz_2g2cvWMURV! zIdbi))By@JD+9T}epw@_4Gbi;dFB^dTmWsOzjBNt3-QP&kXU;YmL*x5ka+Hw7IZd- z7(e8tHp~QVUVCnt6AWB_i5kP#Ll0|CGkADiCj@cql7TiM^%)m@M<;s^T0q=*D-c{x rbWjPb>}hCy04#0$A00|51tmK34lji>l-C+Ze1RZ1Ak@Fbmsj>T={cMm diff --git a/src/main/resources/assets/create/textures/gui/icons.png b/src/main/resources/assets/create/textures/gui/icons.png index e74d8c9f4d8b8b22d9bb4b9dcb1688b0c4f3e1e0..1cda7baa3a6347254684da665d2a9132783438ea 100644 GIT binary patch delta 3399 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 BhcN&E diff --git a/src/main/resources/assets/create/textures/gui/restocker_and_requester.png b/src/main/resources/assets/create/textures/gui/restocker_and_requester.png new file mode 100644 index 0000000000000000000000000000000000000000..2fec202cd86babaf47d78fbdcf5dca44b0616e4f GIT binary patch literal 2024 zcma)+3pCW*9>@3pKVwXcVH8PZyyZ10k7lN2Fw>Ygh=}x z=b$4QMcuAbVbsavMCrv8!?5J7p_4e}asSS_=dN|{T6e9x*V^m1zu&!ozrEL9`?E6w z{MZ_5`f30G4URW65C8}rLI96J!;#9+?aL}AknIVoo*Rs!0(;QoI}ZS=bJXYesh~PD zz;`R$buGGnD=RB& zU|>KX5XfZjBoawUNr_A*>+0$%EiGMA+)WDGP>uwl$JjG`?-&~F1%ZA+Xr2GRfs~w> zU^H_D-#aV@0OI524(V8JMF7A_I82Z2@p~qVPer_U(Mpq-cE6977vv(C)PmEx=Qk>s z67mO)!d>o*vi&W?W_M?0bEf27UN>^Z6LyhK$gNdad&QHtGc#|`q^j)NEu4=}Vp)@q zZeREnNRU3bDIe(*eaP{@-jMkF{Q7;6aB*g4yl=_OR(&)4-dr=~t~$82@oztaVac*g*g{<>6O#2orYN1!67bN|MMIY_UrK9bWr;(*A^wGL)cv*Co zXZ_8y`nAgZ1@ot?8PXt;uTp;W_yt^()|A(dhJ_#OsVegm14+=hJlg*dmjG2P4rrc5 zW|C2Xg@*bX=6t5L0s{2)e2^>HCLQq&X&@*&m51d{Xm#us{sfYU<=DzuRcnlCJ5+mg zbw`l!5(sKA=O(!s93o^JD~j(j_AVI0nO~!zNOVteh4SROJHH&a(STU}1jtU z#C~rCC*l0C1{8g`d~DW4{DR?y*wS=7Vkb{Z+Xq>u4pi7*oCo2Evys)boc>|APr z(*p5_*nd2!U7VJh;e*aEa2nMJo>66%+k1kL4zgP#u!@6@wrx=yu}V*W(u2$>DozcW zyUuC-ln7Du_J2r(ZtJam#Ee!XLJjXV(1Fy0@end6AI8|jJ2ehLj%)ea9Xu&MU4|5a z{bH-1J*J&WuPhaRPa}yn#Dlo6Ya>c`Ft)`MccoH+dDlx<8FNp=xB)*0GBazRTjuz`2_ElG+xD$GGD^yg&f=OnV>0>1nK3ouv}kV zl7nGDo@s)-|9k!^P{}uN7VWUqU4}0m^swKcAdz8o9@Ra)y}l`pum#5YnAyB$5G|+C z=x5!<;T6|bi`)g2`4=nc6nky1-2a}jAwLgUfkFq=j+F(2=MqT7wArH5@yTYRo=xHG z)ggKnm@f}#b-K6N1l%lGW;JCO>8~v_@M53D%Kx6Z+WT(wc1P;{Ga-yml#Hk8D8p7Q zI;PTuto5C>-bk$bOI)yOTf0dQ3A;_z_EXP;rW%8~r1@*)G2~GvM7QY(X;!LNY+~H@ zNbce76zQ>rmgPgBjzIep+};%x#DMCS_H@B~Ok0Wj2o-sl{DoLp0o;IyCC zb7+Vz)(&e|h7m4Y{*3GYPjbs>BUHw9)gg5q-&(4wnMV zHZ?0X_JT9?@yMGk){6L-S`OT^y>3Qu#avCYk2Kdg)3g{<`PBvzbsjnwt6e!pQ6Yqv zP(vVHEr-g*QM_L0QY4ljargWeM=p03@hbOBmygR}or`?;+ubW3mQpU159w@jn(DqG t!b=NnO~C$|WtvQ22aBx#X_(n7CMShyb5H0^({{xGZ5);#v&xg3@=t$$ZD9Za literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/atlases/blocks.json b/src/main/resources/assets/minecraft/atlases/blocks.json index d70dbb8674..7d7ea16dcc 100644 --- a/src/main/resources/assets/minecraft/atlases/blocks.json +++ b/src/main/resources/assets/minecraft/atlases/blocks.json @@ -19,6 +19,10 @@ { "type": "single", "resource": "create:block/factory_panel_connections" + }, + { + "type": "single", + "resource": "create:block/factory_panel_connections_animated" }, { "type": "single", From 9d13cd98539b705cc6e5d953f248a41c952f254b Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Thu, 24 Oct 2024 21:47:23 +0200 Subject: [PATCH 088/515] It looks like you're writing an address. Would you like help? - Get help with writing the address - Just type the address without help - Don't show this tip again --- .../clipboard/ClipboardBlockEntity.java | 13 ++ .../equipment/clipboard/ClipboardScreen.java | 64 +++++++-- .../content/logistics/AddressEditBox.java | 121 ++++++++++++++++++ .../logistics/AddressEditBoxHelper.java | 84 ++++++++++++ .../factoryBoard/FactoryPanelScreen.java | 40 +++--- .../logistics/filter/PackageFilterScreen.java | 7 +- .../packagePort/PackagePortBlockEntity.java | 46 +++++++ .../RedstoneRequesterScreen.java | 8 +- .../stockTicker/StockTickerRequestScreen.java | 7 +- .../schedule/DestinationSuggestions.java | 4 + .../create/foundation/gui/AllGuiTextures.java | 8 +- .../textures/gui/restocker_and_requester.png | Bin 2024 -> 2036 bytes .../assets/create/textures/gui/widgets.png | Bin 11364 -> 11512 bytes 13 files changed, 352 insertions(+), 50 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/logistics/AddressEditBox.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/AddressEditBoxHelper.java diff --git a/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardBlockEntity.java b/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardBlockEntity.java index 2537f6a88e..03bc8f9b2a 100644 --- a/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardBlockEntity.java @@ -4,6 +4,7 @@ import java.util.List; import java.util.UUID; import com.simibubi.create.AllBlocks; +import com.simibubi.create.content.logistics.AddressEditBoxHelper; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; @@ -39,6 +40,13 @@ public class ClipboardBlockEntity extends SmartBlockEntity { notifyUpdate(); updateWrittenState(); } + + @Override + public void lazyTick() { + super.lazyTick(); + if (level.isClientSide()) + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> this::advertiseToAddressHelper); + } public void updateWrittenState() { BlockState blockState = getBlockState(); @@ -87,5 +95,10 @@ public class ClipboardBlockEntity extends SmartBlockEntity { return; cs.reopenWith(dataContainer); } + + @OnlyIn(Dist.CLIENT) + private void advertiseToAddressHelper() { + AddressEditBoxHelper.advertiseClipboard(this); + } } diff --git a/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardScreen.java b/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardScreen.java index a51fa1e4aa..f731491955 100644 --- a/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardScreen.java +++ b/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardScreen.java @@ -46,6 +46,7 @@ import net.minecraft.client.resources.sounds.SimpleSoundInstance; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.Style; import net.minecraft.util.FormattedCharSequence; import net.minecraft.util.Mth; @@ -280,19 +281,32 @@ public class ClipboardScreen extends AbstractSimiScreen { int y = guiTop - 8; AllGuiTextures.CLIPBOARD.render(graphics, x, y); - graphics.drawString(font, Components.translatable("book.pageIndicator", currentPage + 1, getNumPages()), x + 150, y + 9, - 0x43ffffff, false); + graphics.drawString(font, Components.translatable("book.pageIndicator", currentPage + 1, getNumPages()), + x + 150, y + 9, 0x43ffffff, false); for (int i = 0; i < currentEntries.size(); i++) { ClipboardEntry clipboardEntry = currentEntries.get(i); boolean checked = clipboardEntry.checked; int iconOffset = clipboardEntry.icon.isEmpty() ? 0 : 16; - graphics.drawString(font, "\u25A1", x + 45, y + 51, checked ? 0x668D7F6B : 0xff8D7F6B, false); - if (checked) - graphics.drawString(font, "\u2714", x + 45, y + 50, 0x31B25D, false); + MutableComponent text = clipboardEntry.text; + String string = text.getString(); + boolean isAddress = string.startsWith("#") && !string.substring(1) + .isBlank(); - List split = font.split(clipboardEntry.text, 150 - iconOffset); + if (isAddress) { + RenderSystem.enableBlend(); + (checked ? AllGuiTextures.CLIPBOARD_ADDRESS_INACTIVE : AllGuiTextures.CLIPBOARD_ADDRESS) + .render(graphics, x + 44, y + 50); + text = Components.literal(string.substring(1) + .stripLeading()); + } else { + graphics.drawString(font, "\u25A1", x + 45, y + 51, checked ? 0x668D7F6B : 0xff8D7F6B, false); + if (checked) + graphics.drawString(font, "\u2714", x + 45, y + 50, 0x31B25D, false); + } + + List split = font.split(text, 150 - iconOffset); if (split.isEmpty()) { y += 12; continue; @@ -303,7 +317,8 @@ public class ClipboardScreen extends AbstractSimiScreen { for (FormattedCharSequence sequence : split) { if (i != editingIndex) - graphics.drawString(font, sequence, x + 58 + iconOffset, y + 50, checked ? 0x31B25D : 0x311A00, false); + graphics.drawString(font, sequence, x + 58 + iconOffset, y + 50, + checked ? isAddress ? 0x668D7F6B : 0x31B25D : 0x311A00, false); y += 9; } y += 3; @@ -312,13 +327,11 @@ public class ClipboardScreen extends AbstractSimiScreen { if (editingIndex == -1) return; - boolean checked = currentEntries.get(editingIndex).checked; - setFocused(null); DisplayCache cache = getDisplayCache(); for (LineInfo line : cache.lines) - graphics.drawString(font, line.asComponent, line.x, line.y, checked ? 0x31B25D : 0x311A00, false); + graphics.drawString(font, line.asComponent, line.x, line.y, 0x311A00, false); renderHighlight(cache.selection); renderCursor(graphics, cache.cursor, cache.cursorAtEnd); @@ -583,8 +596,16 @@ public class ClipboardScreen extends AbstractSimiScreen { editingIndex = -1; if (hoveredEntry < currentEntries.size()) { currentEntries.get(hoveredEntry).checked ^= true; - if (currentEntries.get(hoveredEntry).checked == true) Minecraft.getInstance().getSoundManager().play(SimpleSoundInstance.forUI(AllSoundEvents.CLIPBOARD_CHECKMARK.getMainEvent(), 0.95f + (float)Math.random() * 0.05f)); - else Minecraft.getInstance().getSoundManager().play(SimpleSoundInstance.forUI(AllSoundEvents.CLIPBOARD_ERASE.getMainEvent(), 0.90f + (float)Math.random() * 0.2f)); + if (currentEntries.get(hoveredEntry).checked == true) + Minecraft.getInstance() + .getSoundManager() + .play(SimpleSoundInstance.forUI(AllSoundEvents.CLIPBOARD_CHECKMARK.getMainEvent(), + 0.95f + (float) Math.random() * 0.05f)); + else + Minecraft.getInstance() + .getSoundManager() + .play(SimpleSoundInstance.forUI(AllSoundEvents.CLIPBOARD_ERASE.getMainEvent(), + 0.90f + (float) Math.random() * 0.2f)); } sendIfEditingBlock(); return true; @@ -673,12 +694,27 @@ public class ClipboardScreen extends AbstractSimiScreen { } private DisplayCache rebuildDisplayCache() { - String s = getCurrentEntryText(); - if (s.isEmpty()) + String current = getCurrentEntryText(); + boolean address = current.startsWith("#") && !current.substring(1) + .isBlank(); + int offset = 0; + + if (address) { + String stripped = current.substring(1) + .stripLeading(); + offset = current.length() - stripped.length(); + current = stripped; + } + + if (current.isEmpty()) return DisplayCache.EMPTY; + String s = current; int i = editContext.getCursorPos(); int j = editContext.getSelectionPos(); + i = Mth.clamp(i - offset, 0, s.length()); + j = Mth.clamp(j - offset, 0, s.length()); + IntList intlist = new IntArrayList(); List list = Lists.newArrayList(); MutableInt mutableint = new MutableInt(); diff --git a/src/main/java/com/simibubi/create/content/logistics/AddressEditBox.java b/src/main/java/com/simibubi/create/content/logistics/AddressEditBox.java new file mode 100644 index 0000000000..09ab093611 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/AddressEditBox.java @@ -0,0 +1,121 @@ +package com.simibubi.create.content.logistics; + +import java.util.List; +import java.util.function.Consumer; + +import org.lwjgl.glfw.GLFW; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.AllBlocks; +import com.simibubi.create.content.trains.schedule.DestinationSuggestions; +import com.simibubi.create.foundation.gui.widget.ScrollInput; +import com.simibubi.create.foundation.utility.CreateLang; + +import net.createmod.catnip.utility.lang.Components; +import net.minecraft.ChatFormatting; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.EditBox; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.network.chat.Component; +import net.minecraft.util.Mth; + +public class AddressEditBox extends EditBox { + + private DestinationSuggestions destinationSuggestions; + private Consumer mainResponder; + + public AddressEditBox(Screen screen, Font pFont, int pX, int pY, int pWidth, int pHeight) { + super(pFont, pX, pY, pWidth, pHeight, Components.empty()); + destinationSuggestions = AddressEditBoxHelper.createSuggestions(screen, this); + destinationSuggestions.setAllowSuggestions(true); + destinationSuggestions.updateCommandInfo(); + mainResponder = t -> destinationSuggestions.updateCommandInfo(); + setResponder(mainResponder); + setBordered(false); + setFocused(false); + mouseClicked(0, 0, 0); + setMaxLength(25); + } + + @Override + public boolean keyPressed(int pKeyCode, int pScanCode, int pModifiers) { + if (destinationSuggestions.keyPressed(pKeyCode, pScanCode, pModifiers)) + return true; + if (isFocused() && pKeyCode == GLFW.GLFW_KEY_ENTER) { + setFocused(false); + mouseClicked(0, 0, 0); + return true; + } + return super.keyPressed(pKeyCode, pScanCode, pModifiers); + } + + @Override + public boolean mouseScrolled(double pMouseX, double pMouseY, double pDelta) { + if (destinationSuggestions.mouseScrolled(Mth.clamp(pDelta, -1.0D, 1.0D))) + return true; + return super.mouseScrolled(pMouseX, pMouseY, pDelta); + } + + @Override + public boolean mouseClicked(double pMouseX, double pMouseY, int pButton) { + if (super.mouseClicked(pMouseX, pMouseY, pButton)) + return true; + if (destinationSuggestions.mouseClicked((int) pMouseX, (int) pMouseY, pButton)) + return true; + return false; + } + + @Override + public void renderWidget(GuiGraphics pGuiGraphics, int pMouseX, int pMouseY, float pPartialTick) { + super.renderWidget(pGuiGraphics, pMouseX, pMouseY, pPartialTick); + PoseStack matrixStack = pGuiGraphics.pose(); + matrixStack.pushPose(); + matrixStack.translate(0, 0, 500); + destinationSuggestions.render(pGuiGraphics, pMouseX, pMouseY); + matrixStack.popPose(); + + if (!destinationSuggestions.isEmpty()) + return; + + int itemX = getX() + width + 4; + int itemY = getY() - 3; + pGuiGraphics.renderItem(AllBlocks.CLIPBOARD.asStack(), itemX, itemY); + if (pMouseX >= itemX && pMouseX < itemX + 16 && pMouseY >= itemY && pMouseY < itemY + 16) { + List promiseTip = List.of(); + promiseTip = List.of(CreateLang.temporaryText("Keeping Track") + .color(ScrollInput.HEADER_RGB) + .component(), + CreateLang.temporaryText("Entries starting with '#' on") + .style(ChatFormatting.GRAY) + .component(), + CreateLang.temporaryText("held or nearby clipboards will") + .style(ChatFormatting.GRAY) + .component(), + CreateLang.temporaryText("help auto-complete this input.") + .style(ChatFormatting.GRAY) + .component(), + CreateLang.temporaryText("(e.g. #storage, #factory)") + .style(ChatFormatting.DARK_GRAY) + .component()); + pGuiGraphics.renderComponentTooltip(Minecraft.getInstance().font, promiseTip, pMouseX, pMouseY); + } + } + + @Override + public void setResponder(Consumer pResponder) { + super.setResponder(pResponder == mainResponder ? mainResponder : mainResponder.andThen(pResponder)); + } + + @Override + public void tick() { + super.tick(); + if (!isFocused()) + destinationSuggestions.hide(); + if (isFocused() && destinationSuggestions.suggestions == null) + destinationSuggestions.updateCommandInfo(); + destinationSuggestions.tick(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/AddressEditBoxHelper.java b/src/main/java/com/simibubi/create/content/logistics/AddressEditBoxHelper.java new file mode 100644 index 0000000000..0ddd0b6fe0 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/AddressEditBoxHelper.java @@ -0,0 +1,84 @@ +package com.simibubi.create.content.logistics; + +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import com.simibubi.create.AllBlocks; +import com.simibubi.create.content.equipment.clipboard.ClipboardBlockEntity; +import com.simibubi.create.content.equipment.clipboard.ClipboardEntry; +import com.simibubi.create.content.trains.schedule.DestinationSuggestions; + +import net.createmod.catnip.utility.IntAttached; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.components.EditBox; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.phys.Vec3; + +public class AddressEditBoxHelper { + + private static Cache> NEARBY_CLIPBOARDS = CacheBuilder.newBuilder() + .expireAfterWrite(1, TimeUnit.SECONDS) + .build(); + + public static void advertiseClipboard(ClipboardBlockEntity blockEntity) { + Minecraft mc = Minecraft.getInstance(); + Player player = mc.player; + if (player == null) + return; + BlockPos blockPos = blockEntity.getBlockPos(); + if (player.distanceToSqr(Vec3.atCenterOf(blockPos)) > 32 * 32) + return; + NEARBY_CLIPBOARDS.put(blockPos, new WeakReference<>(blockEntity)); + } + + public static DestinationSuggestions createSuggestions(Screen screen, EditBox pInput) { + Minecraft mc = Minecraft.getInstance(); + Player player = mc.player; + List> options = new ArrayList<>(); + DestinationSuggestions destinationSuggestions = + new DestinationSuggestions(mc, screen, pInput, mc.font, options, -72 + pInput.getY() + pInput.getHeight()); + + if (player == null) + return destinationSuggestions; + + for (int i = 0; i < Inventory.INVENTORY_SIZE; i++) + appendAddresses(options, player.getInventory() + .getItem(i)); + + for (WeakReference wr : NEARBY_CLIPBOARDS.asMap() + .values()) { + ClipboardBlockEntity cbe = wr.get(); + if (cbe != null) + appendAddresses(options, cbe.dataContainer); + } + + return destinationSuggestions; + } + + private static void appendAddresses(List> options, ItemStack item) { + if (item == null || !AllBlocks.CLIPBOARD.isIn(item)) + return; + + List> pages = ClipboardEntry.readAll(item); + pages.forEach(page -> page.forEach(entry -> { + String string = entry.text.getString(); + if (entry.checked) + return; + if (!string.startsWith("#") || string.length() <= 1) + return; + String address = string.substring(1); + if (address.isBlank()) + return; + options.add(IntAttached.withZero(address.trim())); + })); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java index 3b1ac9216d..245938a43c 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java @@ -11,6 +11,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.AllPackets; +import com.simibubi.create.content.logistics.AddressEditBox; import com.simibubi.create.content.logistics.BigItemStack; import com.simibubi.create.content.trains.station.NoShadowFontWrapper; import com.simibubi.create.foundation.gui.AllGuiTextures; @@ -72,22 +73,18 @@ public class FactoryPanelScreen extends AbstractSimiScreen { if (addressBox == null) { addressBox = - new EditBox(new NoShadowFontWrapper(font), x + 38, y + 30 + middleHeight(), 110, 10, Component.empty()); + new AddressEditBox(this, new NoShadowFontWrapper(font), x + 38, y + 30 + middleHeight(), 110, 10); addressBox.setValue(behaviour.recipeAddress); - addressBox.setBordered(false); addressBox.setTextColor(0x555555); - addressBox.setFocused(false); - addressBox.mouseClicked(0, 0, 0); - addressBox.setMaxLength(25); } addressBox.setY(y + 30 + middleHeight()); addRenderableWidget(addressBox); - confirmButton = new IconButton(x + sizeX - 61, y + sizeY - 22, AllIcons.I_CONFIRM); + confirmButton = new IconButton(x + sizeX - 51, y + sizeY - 22, AllIcons.I_CONFIRM); confirmButton.withCallback(() -> minecraft.setScreen(null)); addRenderableWidget(confirmButton); - promiseExpiration = new ScrollInput(x + 102, y + 54 + middleHeight(), 25, 16).withRange(-1, 31) + promiseExpiration = new ScrollInput(x + 112, y + 54 + middleHeight(), 25, 16).withRange(-1, 31) .titled(CreateLang.temporaryText("Promises expire after") .component()); promiseExpiration.setState(behaviour.promiseClearingInterval); @@ -95,7 +92,7 @@ public class FactoryPanelScreen extends AbstractSimiScreen { if (behaviour.targetedBy.size() < 9) { int slot = behaviour.targetedBy.size(); - newInputButton = new IconButton(x + 19 + (slot % 3 * 18), y + 27 + (slot / 3 * 18), AllIcons.I_ADD); + newInputButton = new IconButton(x + 24 + (slot % 3 * 18), y + 27 + (slot / 3 * 18), AllIcons.I_ADD); newInputButton.withCallback(() -> { FactoryPanelConnectionHandler.startConnection(behaviour); minecraft.setScreen(null); @@ -120,6 +117,7 @@ public class FactoryPanelScreen extends AbstractSimiScreen { updateConfigs(); init(); } + addressBox.tick(); promiseExpiration.titled(CreateLang .temporaryText(promiseExpiration.getState() == -1 ? "Promises do not expire" : "Promises expire after:") .component()); @@ -145,14 +143,14 @@ public class FactoryPanelScreen extends AbstractSimiScreen { AllGuiTextures sprite = frame == 0 ? AllGuiTextures.FACTORY_PANEL_SLOT_FRAME : AllGuiTextures.FACTORY_PANEL_SLOT; for (slot = 0; slot < behaviour.targetedBy.size(); slot++) - sprite.render(graphics, x + 18 + frame + (slot % 3 * 18), y + 26 + frame + (slot / 3 * 18)); + sprite.render(graphics, x + 23 + frame + (slot % 3 * 18), y + 26 + frame + (slot / 3 * 18)); if (slot < 9) - sprite.render(graphics, x + 18 + frame + (slot % 3 * 18), y + 26 + frame + (slot / 3 * 18)); + sprite.render(graphics, x + 23 + frame + (slot % 3 * 18), y + 26 + frame + (slot / 3 * 18)); } slot = 0; for (BigItemStack itemStack : inputConfig) { - int inputX = x + 20 + (slot % 3 * 18); + int inputX = x + 25 + (slot % 3 * 18); int inputY = y + 28 + (slot / 3 * 18); graphics.renderItem(itemStack.stack, inputX, inputY); if (!itemStack.stack.isEmpty()) @@ -190,8 +188,8 @@ public class FactoryPanelScreen extends AbstractSimiScreen { if (inputConfig.size() > 0) { AllGuiTextures.FACTORY_PANEL_ARROW.render(graphics, - x + 70 + Mth.clamp(behaviour.targetedBy.size(), 0, 2) * 9, y + 16 + middleHeight() / 2); - int outputX = x + 128; + x + 75 + Mth.clamp(behaviour.targetedBy.size(), 0, 2) * 9, y + 16 + middleHeight() / 2); + int outputX = x + 130; int outputY = y + 16 + middleHeight() / 2; AllGuiTextures.FACTORY_PANEL_SLOT_FRAME.render(graphics, outputX - 2, outputY - 2); graphics.renderItem(outputConfig.stack, outputX, outputY); @@ -247,7 +245,7 @@ public class FactoryPanelScreen extends AbstractSimiScreen { // TITLE Component title = CreateLang.temporaryText("Logistics Recipe") .component(); - graphics.drawString(font, title, x + 82 - font.width(title) / 2, y + 7, 0x3D3C48, false); + graphics.drawString(font, title, x + 87 - font.width(title) / 2, y + 7, 0x3D3C48, false); // ITEM PREVIEW ms.pushPose(); @@ -255,13 +253,13 @@ public class FactoryPanelScreen extends AbstractSimiScreen { GuiGameElement.of(AllBlocks.FACTORY_PANEL.asStack()) .scale(4) .at(0, 0, -200) - .render(graphics, x + 165, y + 55); + .render(graphics, x + 175, y + 55); if (!behaviour.getFilter() .isEmpty()) { GuiGameElement.of(behaviour.getFilter()) .scale(1.625) .at(0, 0, 200) - .render(graphics, x + 184, y + 68); + .render(graphics, x + 194, y + 68); } ms.popPose(); @@ -272,7 +270,7 @@ public class FactoryPanelScreen extends AbstractSimiScreen { ItemStack asStack = AllItems.CARDBOARD_PACKAGE_12x12.asStack(); int itemY = y + 54 + middleHeight(); - int itemX = x + 78; + int itemX = x + 88; graphics.renderItem(asStack, itemX, itemY); int promised = behaviour.getPromised(); graphics.renderItemDecorations(font, asStack, itemX, itemY, promised + ""); @@ -323,7 +321,7 @@ public class FactoryPanelScreen extends AbstractSimiScreen { // Remove connections for (int i = 0; i < connections.size(); i++) { - int inputX = x + 20 + (i % 3 * 18); + int inputX = x + 25 + (i % 3 * 18); int inputY = y + 28 + (i / 3 * 18); if (mouseX >= inputX && mouseX < inputX + 16 && mouseY >= inputY && mouseY < inputY + 16) { sendIt(connections.get(i) @@ -334,7 +332,7 @@ public class FactoryPanelScreen extends AbstractSimiScreen { // Clear promises int itemY = y + 54 + middleHeight(); - int itemX = x + 78; + int itemX = x + 88; if (mouseX >= itemX && mouseX < itemX + 16 && mouseY >= itemY && mouseY < itemY + 16) { sendIt(null, true); return true; @@ -349,7 +347,7 @@ public class FactoryPanelScreen extends AbstractSimiScreen { int y = guiTop; for (int i = 0; i < inputConfig.size(); i++) { - int inputX = x + 20 + (i % 3 * 18); + int inputX = x + 25 + (i % 3 * 18); int inputY = y + 28 + (i / 3 * 18); if (mouseX >= inputX && mouseX < inputX + 16 && mouseY >= inputY && mouseY < inputY + 16) { BigItemStack itemStack = inputConfig.get(i); @@ -362,7 +360,7 @@ public class FactoryPanelScreen extends AbstractSimiScreen { } if (inputConfig.size() > 0) { - int outputX = x + 128; + int outputX = x + 130; int outputY = y + 16 + middleHeight() / 2; if (mouseX >= outputX && mouseX < outputX + 16 && mouseY >= outputY && mouseY < outputY + 16) { BigItemStack itemStack = outputConfig; diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/PackageFilterScreen.java b/src/main/java/com/simibubi/create/content/logistics/filter/PackageFilterScreen.java index d70ccebd4a..66a934bad4 100644 --- a/src/main/java/com/simibubi/create/content/logistics/filter/PackageFilterScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/filter/PackageFilterScreen.java @@ -5,6 +5,7 @@ import org.lwjgl.glfw.GLFW; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllItems; import com.simibubi.create.AllPackets; +import com.simibubi.create.content.logistics.AddressEditBox; import com.simibubi.create.content.logistics.filter.FilterScreenPacket.Option; import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.widget.IconButton; @@ -33,6 +34,7 @@ public class PackageFilterScreen extends AbstractFilterScreen deferFocus = false; setFocused(addressBox); } + addressBox.tick(); } @Override @@ -43,9 +45,7 @@ public class PackageFilterScreen extends AbstractFilterScreen int x = leftPos; int y = topPos; - addressBox = new EditBox(this.font, x + 44, y + 28, 140, 9, Component.empty()); - addressBox.setMaxLength(50); - addressBox.setBordered(false); + addressBox = new AddressEditBox(this, this.font, x + 44, y + 28, 140, 9); addressBox.setTextColor(0xffffff); addressBox.setValue(menu.address); addressBox.setResponder(this::onAddressEdited); @@ -90,6 +90,7 @@ public class PackageFilterScreen extends AbstractFilterScreen public boolean charTyped(char pCodePoint, int pModifiers) { return super.charTyped(pCodePoint, pModifiers); } + @Override protected void contentsCleared() { diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java index b87a840c3f..e2da5d3404 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java @@ -1,13 +1,18 @@ package com.simibubi.create.content.logistics.packagePort; +import java.util.ArrayList; import java.util.List; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import com.simibubi.create.AllBlocks; +import com.simibubi.create.content.equipment.clipboard.ClipboardEntry; +import com.simibubi.create.content.equipment.clipboard.ClipboardOverrides; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import com.simibubi.create.foundation.item.SmartInventory; +import com.simibubi.create.foundation.utility.CreateLang; import net.createmod.catnip.utility.lang.Components; import net.minecraft.core.BlockPos; @@ -134,10 +139,51 @@ public abstract class PackagePortBlockEntity extends SmartBlockEntity implements if (level.isClientSide) return InteractionResult.SUCCESS; + ItemStack mainHandItem = player.getMainHandItem(); + if (AllBlocks.CLIPBOARD.isIn(mainHandItem)) { + addAddressToClipboard(player, mainHandItem); + return InteractionResult.SUCCESS; + } + NetworkHooks.openScreen((ServerPlayer) player, this, worldPosition); return InteractionResult.SUCCESS; } + private void addAddressToClipboard(Player player, ItemStack mainHandItem) { + if (addressFilter == null || addressFilter.isBlank()) + return; + + List> list = ClipboardEntry.readAll(mainHandItem); + for (List page : list) { + for (ClipboardEntry entry : page) { + String existing = entry.text.getString(); + if (existing.equals("#" + addressFilter) || existing.equals("# " + addressFilter)) + return; + } + } + + List page = null; + + for (List freePage : list) { + if (freePage.size() > 16) + continue; + page = freePage; + break; + } + + if (page == null) { + page = new ArrayList<>(); + list.add(page); + } + + page.add(new ClipboardEntry(false, Components.literal("#" + addressFilter))); + player.displayClientMessage(CreateLang.temporaryText("'" + addressFilter + "' added to Clipboard") + .component(), true); + + ClipboardEntry.saveAll(list, mainHandItem); + mainHandItem.getTag().putInt("Type", ClipboardOverrides.ClipboardType.WRITTEN.ordinal()); + } + @Override public Component getDisplayName() { return Components.empty(); diff --git a/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterScreen.java b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterScreen.java index b0007ea648..474702dcf7 100644 --- a/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterScreen.java @@ -7,6 +7,7 @@ import java.util.List; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllPackets; +import com.simibubi.create.content.logistics.AddressEditBox; import com.simibubi.create.content.logistics.BigItemStack; import com.simibubi.create.content.trains.station.NoShadowFontWrapper; import com.simibubi.create.foundation.gui.AllGuiTextures; @@ -51,6 +52,7 @@ public class RedstoneRequesterScreen extends AbstractSimiContainerScreen}vL*q+EkuH8TOpMB0B=X?Fm_4{4F-?`5BbH=Fi z)DlA&t%V>;EnJ=wJOx3d3J>9K?->87YdX^BcC>TH+d@O{hl$)V4d=(snjYz^t8Yyo zTE6Ld<{2~})#cdDk?OvCHNNTQ=G~<}#!b+x|D3r5s6O4@J{zr>5mC#t!wXk5VL$N# zm#~Ydu0x8ExFcA2&MtKE^`cij61O@$*^N4_K01I6kjA0>DT*Dkec~|q`9-Y@P^s!; zmpKAr5=56*g5KWsb}@8JJ7`MYGZ_-saJC|GsSH#uI?BrDwt#Gt@fp+iyPSfn7GA|Z zeibidBSPqM&d&cEqkm6O5ar=cH#YPW<&m3NxqQjp{I|Ln1gsKs?QgJ0{O;m^r^qH9=)(~G1 zpve?5QYK^r@K$Y|*IJZ^XM~Lu9{m{7(PBP9?uGf+4cQKIaz9)TRom;Vd6Ij1hDCcU z;InAsz9j{Q9rQdxT0FUBE;XqQHgn0QxPP2a*s0a1zF!{`U&OM`8hVaCM)o3hTC+U) zlV~m?FWVyopT(HzLjiC*GhEZe42&X}p+ zCn;PphL0?J11a9La3Zmqav-oWH617;ItFMnGc)oMp!Z^L{3gON#PbsiIBb$?E@>2q zz_#k!IphdG^h=n~E;t0NB)5IM5x?#nC3FPE)@G(czb_;j0L$;19Sj5jdb=>EJD9tY zpMwxhFt_D?q8ghlw;f$!y^4|;TWailxo^g3E+cWNN^70SOtJoh&6LrNA#djMkNTMY zX;T_CaU_9^WmvdEamX2o@nghdkTP)XPS2=Rp$}GN-bMYEgN7zP{ix-jhV@2yH9F$u>r%Y%0i3lg}bN1U`N+vHl)YIO6h-i8aU;bjfu%f!T&9C*Y&WDkFk z1M9tKT0cm16Y@KxM>>yo*)v*Zx!czTbEX}ddwzt}h2jTW%N#k-t^GK{;50tYhi_m* zo-^^kqP|XJI`HP=CKc?y_W|*z)aVuN_FGf4T=u)Gzu9we=Czd%$n1f`FO3Ye*bRZ} ztND^Z=Fm~v4}6KQ{)m6t=-Bw8W}TO&{v}FMDT;)~uH??xYL3}9?(I$KV%PT!kOLxt z|2Y<^<@?&*#^Gm+DdM~4O-U!}A|FZZ)lq^!mh!&E>iQ-=>-xIuup6Gx;DGsQdUGZp z#Of3FnVuQ?n!@XbuQd8O8azs?bB-LRqAW!*;o^-8?h6gm5F>%KNK72DqV3v&3A0fx z@t)E#Y7I+ak_mtRs~~0?l0pI5=Mq#c8&`I))8kL@*=?ng&uzwJG?rqm5d46$PoEGx zq8AW!DdS)bF=*wGv>j&nUN<QofxYlEv{#$}K~%2?BKCo+eaY=a#F)uax@E-|kP?m|9W z7GkQHozIO1%@svC+Uo+rjX#N#)L2`1!8fzg0i8Sd`aA8ymv@%V11qkc%{7AiavAu7 zYZG~mIJv}yhxZq#wgLzqp2)!)E$ns0o-G+_$NY9@@Jn0O-IN6z{gzAkupEftYn|oj zc+2nvlFZ~8;_fqX3gst3$vqr|cl6?Wpg52efB1hm5UCLVfK|=aZv&%AZLP%+zC2t! Kg+DnYC}&z;gA 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 Date: Fri, 25 Oct 2024 13:14:53 +0200 Subject: [PATCH 089/515] Theme No More --- gradle.properties | 4 +-- src/main/java/com/simibubi/create/Create.java | 10 +++---- .../com/simibubi/create/CreateClient.java | 2 -- .../contraptions/wrench/RadialWrenchMenu.java | 22 +++++++--------- .../goggles/GoggleOverlayRenderer.java | 8 +++--- .../equipment/toolbox/RadialToolboxMenu.java | 3 +-- .../create/foundation/gui/CreateTheme.java | 26 ------------------- .../foundation/gui/widget/ScrollInput.java | 4 +-- .../gui/widget/SelectionScrollInput.java | 4 +-- 9 files changed, 26 insertions(+), 57 deletions(-) delete mode 100644 src/main/java/com/simibubi/create/foundation/gui/CreateTheme.java diff --git a/gradle.properties b/gradle.properties index ebe28cfc15..97b5dec335 100644 --- a/gradle.properties +++ b/gradle.properties @@ -28,8 +28,8 @@ jei_minecraft_version = 1.20.1 jei_version = 15.10.0.39 curios_minecraft_version = 1.20.1 curios_version = 5.3.1 -catnip_version = 0.8.15 -ponder_version = 0.8.10 +catnip_version = 0.8.16 +ponder_version = 0.8.11 cc_tweaked_enable = true cc_tweaked_minecraft_version = 1.20.1 diff --git a/src/main/java/com/simibubi/create/Create.java b/src/main/java/com/simibubi/create/Create.java index 366b92714b..21a7e3dc38 100644 --- a/src/main/java/com/simibubi/create/Create.java +++ b/src/main/java/com/simibubi/create/Create.java @@ -29,7 +29,6 @@ import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.block.CopperRegistries; import com.simibubi.create.foundation.data.CreateRegistrate; -import com.simibubi.create.foundation.gui.CreateTheme; import com.simibubi.create.foundation.item.ItemDescription; import com.simibubi.create.foundation.item.KineticStats; import com.simibubi.create.foundation.item.TooltipModifier; @@ -41,6 +40,7 @@ import com.simibubi.create.infrastructure.data.CreateDatagen; import com.simibubi.create.infrastructure.worldgen.AllFeatures; import com.simibubi.create.infrastructure.worldgen.AllPlacementModifiers; +import net.createmod.catnip.utility.FontHelper; import net.createmod.catnip.utility.lang.LangBuilder; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; @@ -83,10 +83,10 @@ public class Create { .defaultCreativeTab((ResourceKey) null); static { - REGISTRATE.setTooltipModifierFactory(item -> { - return new ItemDescription.Modifier(item, CreateTheme.Key.STANDARD_TOOLTIP.palette()) - .andThen(TooltipModifier.mapNull(KineticStats.create(item))); - }); + REGISTRATE.setTooltipModifierFactory(item -> + new ItemDescription.Modifier(item, FontHelper.Palette.STANDARD_CREATE) + .andThen(TooltipModifier.mapNull(KineticStats.create(item))) + ); } public static final ServerSchematicLoader SCHEMATIC_RECEIVER = new ServerSchematicLoader(); diff --git a/src/main/java/com/simibubi/create/CreateClient.java b/src/main/java/com/simibubi/create/CreateClient.java index a6d1b11a9e..8809a3c2da 100644 --- a/src/main/java/com/simibubi/create/CreateClient.java +++ b/src/main/java/com/simibubi/create/CreateClient.java @@ -18,7 +18,6 @@ import com.simibubi.create.content.schematics.client.SchematicHandler; import com.simibubi.create.content.trains.GlobalRailwayManager; import com.simibubi.create.foundation.ClientResourceReloadListener; import com.simibubi.create.foundation.blockEntity.behaviour.ValueSettingsClient; -import com.simibubi.create.foundation.gui.CreateTheme; import com.simibubi.create.foundation.ponder.CreatePonderPlugin; import com.simibubi.create.foundation.render.AllInstanceTypes; import com.simibubi.create.foundation.utility.ModelSwapper; @@ -93,7 +92,6 @@ public class CreateClient { //AllPonderTags.register(); //PonderIndex.register(); PonderIndex.addPlugin(new CreatePonderPlugin()); - CreateTheme.loadClass(); setupConfigUIBackground(); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchMenu.java b/src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchMenu.java index ddbd931098..c6ef81e7b1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchMenu.java +++ b/src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchMenu.java @@ -29,7 +29,6 @@ import com.simibubi.create.content.kinetics.base.HorizontalKineticBlock; import com.simibubi.create.content.kinetics.base.RotatedPillarKineticBlock; import com.simibubi.create.content.kinetics.transmission.sequencer.SequencedGearshiftBlock; import com.simibubi.create.foundation.gui.AllIcons; -import com.simibubi.create.foundation.gui.CreateTheme; import dev.engine_room.flywheel.lib.transform.TransformStack; import net.createmod.catnip.gui.AbstractSimiScreen; @@ -40,7 +39,6 @@ import net.createmod.catnip.platform.CatnipServices; import net.createmod.catnip.utility.AnimationTickHolder; import net.createmod.catnip.utility.math.AngleHelper; import net.createmod.catnip.utility.theme.Color; -import net.createmod.catnip.utility.theme.Theme; import net.createmod.ponder.enums.PonderGuiTextures; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; @@ -104,9 +102,9 @@ public class RadialWrenchMenu extends AbstractSimiScreen { private int ticksOpen; private int selectedStateIndex = 0; - private RenderElement iconScroll = RenderElement.of(PonderGuiTextures.ICON_SCROLL); - private RenderElement iconUp = RenderElement.of(AllIcons.I_PRIORITY_HIGH); - private RenderElement iconDown = RenderElement.of(AllIcons.I_PRIORITY_LOW); + private final RenderElement iconScroll = RenderElement.of(PonderGuiTextures.ICON_SCROLL); + private final RenderElement iconUp = RenderElement.of(AllIcons.I_PRIORITY_HIGH); + private final RenderElement iconDown = RenderElement.of(AllIcons.I_PRIORITY_LOW); public static Optional tryCreateFor(BlockState state, BlockPos pos, @Nullable Level level) { if (BLOCK_BLACKLIST.contains(CatnipServices.REGISTRIES.getKeyOrThrow(state.getBlock()))) @@ -198,18 +196,18 @@ public class RadialWrenchMenu extends AbstractSimiScreen { if (selectedPropertyIndex > 0) { iconScroll.at(-14, -46).render(graphics); iconUp.at(-1, -46).render(graphics); - graphics.drawCenteredString(font, propertiesForState.get(selectedPropertyIndex - 1).getValue(), 0, -30, Theme.Key.TEXT.i()); + graphics.drawCenteredString(font, propertiesForState.get(selectedPropertyIndex - 1).getValue(), 0, -30, UIRenderHelper.COLOR_TEXT.getFirst().getRGB()); } if (selectedPropertyIndex < propertiesForState.size() - 1) { iconScroll.at(-14, 30).render(graphics); iconDown.at(-1, 30).render(graphics); - graphics.drawCenteredString(font, propertiesForState.get(selectedPropertyIndex + 1).getValue(), 0, 22, Theme.Key.TEXT.i()); + graphics.drawCenteredString(font, propertiesForState.get(selectedPropertyIndex + 1).getValue(), 0, 22, UIRenderHelper.COLOR_TEXT.getFirst().getRGB()); } - graphics.drawCenteredString(font, "Currently", 0, -13, Theme.Key.TEXT.i()); - graphics.drawCenteredString(font, "Changing:", 0, -3, Theme.Key.TEXT.i()); - graphics.drawCenteredString(font, propertyLabel, 0, 7, Theme.Key.TEXT.i()); + graphics.drawCenteredString(font, "Currently", 0, -13, UIRenderHelper.COLOR_TEXT.getFirst().getRGB()); + graphics.drawCenteredString(font, "Changing:", 0, -3, UIRenderHelper.COLOR_TEXT.getFirst().getRGB()); + graphics.drawCenteredString(font, propertyLabel, 0, 7, UIRenderHelper.COLOR_TEXT.getFirst().getRGB()); ms.popPose(); @@ -269,7 +267,7 @@ public class RadialWrenchMenu extends AbstractSimiScreen { poseStack.translate(0, 0, 50); if (i == selectedStateIndex) { - graphics.drawCenteredString(font, blockState.getValue(property).toString(), 0, 15, Theme.Key.TEXT.i()); + graphics.drawCenteredString(font, blockState.getValue(property).toString(), 0, 15, UIRenderHelper.COLOR_TEXT.getFirst().getRGB()); } poseStack.popPose(); @@ -338,7 +336,7 @@ public class RadialWrenchMenu extends AbstractSimiScreen { @Override public void renderBackground(GuiGraphics graphics) { - Color color = CreateTheme.Key.RADIAL_BACKGROUND.c() + Color color = BACKGROUND_COLOR .scaleAlpha(Math.min(1, (ticksOpen + AnimationTickHolder.getPartialTicks()) / 20f)); graphics.fillGradient(0, 0, this.width, this.height, color.getRGB(), color.getRGB()); diff --git a/src/main/java/com/simibubi/create/content/equipment/goggles/GoggleOverlayRenderer.java b/src/main/java/com/simibubi/create/content/equipment/goggles/GoggleOverlayRenderer.java index 7c7384c613..0b357f9735 100644 --- a/src/main/java/com/simibubi/create/content/equipment/goggles/GoggleOverlayRenderer.java +++ b/src/main/java/com/simibubi/create/content/equipment/goggles/GoggleOverlayRenderer.java @@ -21,13 +21,13 @@ import com.simibubi.create.infrastructure.config.AllConfigs; import com.simibubi.create.infrastructure.config.CClient; import net.createmod.catnip.CatnipClient; +import net.createmod.catnip.gui.element.BoxElement; import net.createmod.catnip.gui.element.GuiGameElement; import net.createmod.catnip.utility.Iterate; import net.createmod.catnip.utility.lang.Components; import net.createmod.catnip.utility.outliner.Outline; import net.createmod.catnip.utility.outliner.Outliner.OutlineEntry; import net.createmod.catnip.utility.theme.Color; -import net.createmod.catnip.utility.theme.Theme; import net.minecraft.client.Minecraft; import net.minecraft.client.MouseHandler; import net.minecraft.client.gui.GuiGraphics; @@ -195,11 +195,11 @@ public class GoggleOverlayRenderer { float fade = Mth.clamp((hoverTicks + partialTicks) / 24f, 0, 1); Boolean useCustom = cfg.overlayCustomColor.get(); Color colorBackground = useCustom ? new Color(cfg.overlayBackgroundColor.get()) - : Theme.Key.VANILLA_TOOLTIP_BACKGROUND.c().scaleAlpha(.75f); + : BoxElement.COLOR_VANILLA_BACKGROUND.scaleAlpha(.75f); Color colorBorderTop = useCustom ? new Color(cfg.overlayBorderColorTop.get()) - : Theme.Key.VANILLA_TOOLTIP_BORDER.c(true).copy(); + : BoxElement.COLOR_VANILLA_BORDER.getFirst().copy(); Color colorBorderBot = useCustom ? new Color(cfg.overlayBorderColorBot.get()) - : Theme.Key.VANILLA_TOOLTIP_BORDER.c(false).copy(); + : BoxElement.COLOR_VANILLA_BORDER.getSecond().copy(); if (fade < 1) { poseStack.translate(Math.pow(1 - fade, 3) * Math.signum(cfg.overlayOffsetX.get() + .5f) * 8, 0, 0); diff --git a/src/main/java/com/simibubi/create/content/equipment/toolbox/RadialToolboxMenu.java b/src/main/java/com/simibubi/create/content/equipment/toolbox/RadialToolboxMenu.java index 898095fd23..17468ad483 100644 --- a/src/main/java/com/simibubi/create/content/equipment/toolbox/RadialToolboxMenu.java +++ b/src/main/java/com/simibubi/create/content/equipment/toolbox/RadialToolboxMenu.java @@ -15,7 +15,6 @@ import com.simibubi.create.AllKeys; import com.simibubi.create.AllPackets; import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllIcons; -import com.simibubi.create.foundation.gui.CreateTheme; import com.simibubi.create.foundation.utility.CreateLang; import dev.engine_room.flywheel.lib.transform.TransformStack; @@ -215,7 +214,7 @@ public class RadialToolboxMenu extends AbstractSimiScreen { @Override public void renderBackground(GuiGraphics graphics) { - Color color = CreateTheme.Key.RADIAL_BACKGROUND.c() + Color color = BACKGROUND_COLOR .scaleAlpha(Math.min(1, (ticksOpen + AnimationTickHolder.getPartialTicks()) / 20f)); graphics.fillGradient(0, 0, this.width, this.height, color.getRGB(), color.getRGB()); diff --git a/src/main/java/com/simibubi/create/foundation/gui/CreateTheme.java b/src/main/java/com/simibubi/create/foundation/gui/CreateTheme.java deleted file mode 100644 index d39b86dcee..0000000000 --- a/src/main/java/com/simibubi/create/foundation/gui/CreateTheme.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.simibubi.create.foundation.gui; - -import net.createmod.catnip.utility.theme.Color; -import net.createmod.catnip.utility.theme.Theme; - -public class CreateTheme extends Theme { - - public static final CreateTheme CREATE_THEME = addTheme(new CreateTheme()); - - @Override - protected void init() { - - put(Key.STANDARD_TOOLTIP, new Color(0xff_c9974c), new Color(0xff_f1dd79)); - put(Key.RADIAL_BACKGROUND, new Color(0x50_101010, true)); - - } - - public static void loadClass() {} - - public static class Key { - - public static final Theme.Key STANDARD_TOOLTIP = new Theme.Key(); - public static final Theme.Key RADIAL_BACKGROUND = new Theme.Key(); - - } -} diff --git a/src/main/java/com/simibubi/create/foundation/gui/widget/ScrollInput.java b/src/main/java/com/simibubi/create/foundation/gui/widget/ScrollInput.java index be76f50523..776b7a6fb3 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/widget/ScrollInput.java +++ b/src/main/java/com/simibubi/create/foundation/gui/widget/ScrollInput.java @@ -180,10 +180,10 @@ public class ScrollInput extends AbstractSimiWidget { if (title == null) return; toolTip.add(title.plainCopy() - .withStyle(s -> s.withColor(HEADER_RGB))); + .withStyle(s -> s.withColor(HEADER_RGB.getRGB()))); if (hint != null) toolTip.add(hint.plainCopy() - .withStyle(s -> s.withColor(HINT_RGB))); + .withStyle(s -> s.withColor(HINT_RGB.getRGB()))); toolTip.add(scrollToModify.plainCopy() .withStyle(ChatFormatting.ITALIC, ChatFormatting.DARK_GRAY)); toolTip.add(shiftScrollsFaster.plainCopy() diff --git a/src/main/java/com/simibubi/create/foundation/gui/widget/SelectionScrollInput.java b/src/main/java/com/simibubi/create/foundation/gui/widget/SelectionScrollInput.java index 798bfaebce..dafbb7fefa 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/widget/SelectionScrollInput.java +++ b/src/main/java/com/simibubi/create/foundation/gui/widget/SelectionScrollInput.java @@ -35,7 +35,7 @@ public class SelectionScrollInput extends ScrollInput { if (title == null) return; toolTip.add(title.plainCopy() - .withStyle(s -> s.withColor(HEADER_RGB))); + .withStyle(s -> s.withColor(HEADER_RGB.getRGB()))); int min = Math.min(this.max - 16, state - 7); int max = Math.max(this.min + 16, state + 8); min = Math.max(min, this.min); @@ -65,7 +65,7 @@ public class SelectionScrollInput extends ScrollInput { if (hint != null) toolTip.add(hint.plainCopy() - .withStyle(s -> s.withColor(HINT_RGB))); + .withStyle(s -> s.withColor(HINT_RGB.getRGB()))); toolTip.add(scrollToSelect.plainCopy() .withStyle(ChatFormatting.DARK_GRAY, ChatFormatting.ITALIC)); } From 64a185c107934ed13fcde15800766985c69635e3 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 25 Oct 2024 14:16:41 +0200 Subject: [PATCH 090/515] Keeping category - Added the filtering interface for Stock Tickers - Removed auto-restocking feature of the stock ticker block --- .../com/simibubi/create/AllMenuTypes.java | 5 + .../java/com/simibubi/create/AllPackets.java | 6 +- .../packagePort/PackagePortMenu.java | 2 +- .../StockKeeperCategoryEditPacket.java | 45 ++ .../stockTicker/StockKeeperCategoryMenu.java | 128 +++++ .../StockKeeperCategoryRefundPacket.java | 44 ++ .../StockKeeperCategoryScreen.java | 506 ++++++++++++++++++ .../StockTickerAutoRequestScreen.java | 196 ------- .../stockTicker/StockTickerBlock.java | 25 +- .../stockTicker/StockTickerBlockEntity.java | 113 +--- .../StockTickerConfigurationPacket.java | 49 -- .../create/foundation/gui/AllGuiTextures.java | 9 + .../gui/menu/GhostItemSubmitPacket.java | 11 +- .../textures/gui/stock_keeper_categories.png | Bin 0 -> 1431 bytes 14 files changed, 786 insertions(+), 353 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryEditPacket.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryMenu.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryRefundPacket.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryScreen.java delete mode 100644 src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerAutoRequestScreen.java delete mode 100644 src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerConfigurationPacket.java create mode 100644 src/main/resources/assets/create/textures/gui/stock_keeper_categories.png diff --git a/src/main/java/com/simibubi/create/AllMenuTypes.java b/src/main/java/com/simibubi/create/AllMenuTypes.java index 0b58a77c2e..0f1c02bf07 100644 --- a/src/main/java/com/simibubi/create/AllMenuTypes.java +++ b/src/main/java/com/simibubi/create/AllMenuTypes.java @@ -16,6 +16,8 @@ import com.simibubi.create.content.logistics.packagePort.PackagePortMenu; import com.simibubi.create.content.logistics.packagePort.PackagePortScreen; import com.simibubi.create.content.logistics.redstoneRequester.RedstoneRequesterMenu; import com.simibubi.create.content.logistics.redstoneRequester.RedstoneRequesterScreen; +import com.simibubi.create.content.logistics.stockTicker.StockKeeperCategoryMenu; +import com.simibubi.create.content.logistics.stockTicker.StockKeeperCategoryScreen; import com.simibubi.create.content.redstone.link.controller.LinkedControllerMenu; import com.simibubi.create.content.redstone.link.controller.LinkedControllerScreen; import com.simibubi.create.content.schematics.cannon.SchematicannonMenu; @@ -62,6 +64,9 @@ public class AllMenuTypes { public static final MenuEntry SCHEDULE = register("schedule", ScheduleMenu::new, () -> ScheduleScreen::new); + public static final MenuEntry STOCK_KEEPER_CATEGORY = + register("stock_keeper_category", StockKeeperCategoryMenu::new, () -> StockKeeperCategoryScreen::new); + public static final MenuEntry DISPLAY_CLOTH = register("display_cloth", DisplayClothPricingMenu::new, () -> DisplayClothPricingScreen::new); diff --git a/src/main/java/com/simibubi/create/AllPackets.java b/src/main/java/com/simibubi/create/AllPackets.java index 857791a393..3dacfe2e32 100644 --- a/src/main/java/com/simibubi/create/AllPackets.java +++ b/src/main/java/com/simibubi/create/AllPackets.java @@ -73,7 +73,8 @@ import com.simibubi.create.content.logistics.redstoneRequester.RedstoneRequester import com.simibubi.create.content.logistics.stockTicker.LogisticalStockRequestPacket; import com.simibubi.create.content.logistics.stockTicker.LogisticalStockResponsePacket; import com.simibubi.create.content.logistics.stockTicker.PackageOrderRequestPacket; -import com.simibubi.create.content.logistics.stockTicker.StockTickerConfigurationPacket; +import com.simibubi.create.content.logistics.stockTicker.StockKeeperCategoryEditPacket; +import com.simibubi.create.content.logistics.stockTicker.StockKeeperCategoryRefundPacket; import com.simibubi.create.content.logistics.tunnel.TunnelFlapPacket; import com.simibubi.create.content.redstone.displayLink.DisplayLinkConfigurationPacket; import com.simibubi.create.content.redstone.link.controller.LinkedControllerBindPacket; @@ -191,13 +192,14 @@ public enum AllPackets { CHAIN_CONVEYOR_CONNECT(ChainConveyorConnectionPacket.class, ChainConveyorConnectionPacket::new, PLAY_TO_SERVER), CHAIN_CONVEYOR_RIDING(ChainConveyorRidingPacket.class, ChainConveyorRidingPacket::new, PLAY_TO_SERVER), CHAIN_PACKAGE_INTERACTION(ChainPackageInteractionPacket.class, ChainPackageInteractionPacket::new, PLAY_TO_SERVER), - STOCK_TICKER_CONFIGURATION(StockTickerConfigurationPacket.class, StockTickerConfigurationPacket::new, PLAY_TO_SERVER), DISPLAY_CLOTH_SERVERBOUND(DisplayClothPacketToServer.class, DisplayClothPacketToServer::new, PLAY_TO_SERVER), PACKAGE_PORT_CONFIGURATION(PackagePortConfigurationPacket.class, PackagePortConfigurationPacket::new, PLAY_TO_SERVER), TRAIN_MAP_REQUEST(TrainMapSyncRequestPacket.class, TrainMapSyncRequestPacket::new, PLAY_TO_SERVER), CONNECT_FACTORY_PANEL(FactoryPanelConnectionPacket.class, FactoryPanelConnectionPacket::new, PLAY_TO_SERVER), CONFIGURE_FACTORY_PANEL(FactoryPanelConfigurationPacket.class, FactoryPanelConfigurationPacket::new, PLAY_TO_SERVER), CONFIGURE_REDSTONE_REQUESTER(RedstoneRequesterConfigurationPacket.class, RedstoneRequesterConfigurationPacket::new, PLAY_TO_SERVER), + CONFIGURE_STOCK_KEEPER_CATEGORIES(StockKeeperCategoryEditPacket.class, StockKeeperCategoryEditPacket::new, PLAY_TO_SERVER), + REFUND_STOCK_KEEPER_CATEGORY(StockKeeperCategoryRefundPacket.class, StockKeeperCategoryRefundPacket::new, PLAY_TO_SERVER), // Server to Client SYMMETRY_EFFECT(SymmetryEffectPacket.class, SymmetryEffectPacket::new, PLAY_TO_CLIENT), diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortMenu.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortMenu.java index 7590cb415b..c14217b337 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortMenu.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortMenu.java @@ -52,7 +52,7 @@ public class PackagePortMenu extends MenuBase { if (index < size) { success = !moveItemStackTo(stack, size, slots.size(), false); } else - success = !moveItemStackTo(stack, 0, size - 1, false); + success = !moveItemStackTo(stack, 0, size, false); return success ? ItemStack.EMPTY : stack; } diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryEditPacket.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryEditPacket.java new file mode 100644 index 0000000000..8e0dd52041 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryEditPacket.java @@ -0,0 +1,45 @@ +package com.simibubi.create.content.logistics.stockTicker; + +import java.util.ArrayList; +import java.util.List; + +import com.simibubi.create.foundation.networking.BlockEntityConfigurationPacket; + +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.item.ItemStack; + +public class StockKeeperCategoryEditPacket extends BlockEntityConfigurationPacket { + + private List schedule; + + public StockKeeperCategoryEditPacket(BlockPos pos, List schedule) { + super(pos); + this.schedule = schedule; + } + + public StockKeeperCategoryEditPacket(FriendlyByteBuf buffer) { + super(buffer); + } + + @Override + protected void readSettings(FriendlyByteBuf buffer) { + int size = buffer.readVarInt(); + schedule = new ArrayList<>(); + for (int i = 0; i < size; i++) + schedule.add(buffer.readItem()); + } + + @Override + protected void writeSettings(FriendlyByteBuf buffer) { + buffer.writeVarInt(schedule.size()); + schedule.forEach(buffer::writeItem); + } + + @Override + protected void applySettings(StockTickerBlockEntity be) { + be.categories = schedule; + be.notifyUpdate(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryMenu.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryMenu.java new file mode 100644 index 0000000000..d30e6d21ff --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryMenu.java @@ -0,0 +1,128 @@ +package com.simibubi.create.content.logistics.stockTicker; + +import org.jetbrains.annotations.NotNull; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllMenuTypes; +import com.simibubi.create.content.logistics.filter.FilterItem; +import com.simibubi.create.foundation.gui.menu.MenuBase; + +import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.Container; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.ItemStackHandler; +import net.minecraftforge.items.SlotItemHandler; + +public class StockKeeperCategoryMenu extends MenuBase { + + public boolean slotsActive = true; + public ItemStackHandler proxyInventory; + + public StockKeeperCategoryMenu(MenuType type, int id, Inventory inv, FriendlyByteBuf extraData) { + super(type, id, inv, extraData); + } + + public static AbstractContainerMenu create(int pContainerId, Inventory pPlayerInventory, + StockTickerBlockEntity stockTickerBlockEntity) { + return new StockKeeperCategoryMenu(AllMenuTypes.STOCK_KEEPER_CATEGORY.get(), pContainerId, pPlayerInventory, + stockTickerBlockEntity); + } + + public StockKeeperCategoryMenu(MenuType type, int id, Inventory inv, StockTickerBlockEntity contentHolder) { + super(type, id, inv, contentHolder); + } + + @Override + protected void initAndReadInventory(StockTickerBlockEntity contentHolder) { + proxyInventory = new ItemStackHandler(1); + } + + @Override + protected StockTickerBlockEntity createOnClient(FriendlyByteBuf extraData) { + BlockPos blockPos = extraData.readBlockPos(); + return AllBlocks.STOCK_TICKER.get() + .getBlockEntity(Minecraft.getInstance().level, blockPos); + } + + @Override + protected void addSlots() { + addSlot(new InactiveItemHandlerSlot(proxyInventory, 0, 23, 41)); + addPlayerSlots(26, 123); + } + + @Override + protected void addPlayerSlots(int x, int y) { + for (int hotbarSlot = 0; hotbarSlot < 9; ++hotbarSlot) + this.addSlot(new InactiveSlot(playerInventory, hotbarSlot, x + hotbarSlot * 18, y + 58)); + for (int row = 0; row < 3; ++row) + for (int col = 0; col < 9; ++col) + this.addSlot(new InactiveSlot(playerInventory, col + row * 9 + 9, x + col * 18, y + row * 18)); + } + + @Override + protected void saveData(StockTickerBlockEntity contentHolder) {} + + @Override + public boolean stillValid(Player player) { + return !contentHolder.isRemoved() && player.position() + .closerThan(Vec3.atCenterOf(contentHolder.getBlockPos()), player.getBlockReach() + 4); + } + + class InactiveSlot extends Slot { + + public InactiveSlot(Container pContainer, int pIndex, int pX, int pY) { + super(pContainer, pIndex, pX, pY); + } + + @Override + public boolean isActive() { + return slotsActive; + } + + } + + class InactiveItemHandlerSlot extends SlotItemHandler { + + public InactiveItemHandlerSlot(IItemHandler itemHandler, int index, int xPosition, int yPosition) { + super(itemHandler, index, xPosition, yPosition); + } + + @Override + public boolean mayPlace(@NotNull ItemStack stack) { + return super.mayPlace(stack) && (stack.isEmpty() || stack.getItem() instanceof FilterItem); + } + + @Override + public boolean isActive() { + return slotsActive; + } + + } + + @Override + public ItemStack quickMoveStack(Player pPlayer, int index) { + Slot clickedSlot = getSlot(index); + if (!clickedSlot.hasItem()) + return ItemStack.EMPTY; + + ItemStack stack = clickedSlot.getItem(); + int size = 1; + boolean success = false; + if (index < size) { + success = !moveItemStackTo(stack, size, slots.size(), false); + } else + success = !moveItemStackTo(stack, 0, size, false); + + return success ? ItemStack.EMPTY : stack; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryRefundPacket.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryRefundPacket.java new file mode 100644 index 0000000000..25a96cf7d0 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryRefundPacket.java @@ -0,0 +1,44 @@ +package com.simibubi.create.content.logistics.stockTicker; + +import com.simibubi.create.content.logistics.filter.FilterItem; +import com.simibubi.create.foundation.networking.BlockEntityConfigurationPacket; + +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.item.ItemStack; + +public class StockKeeperCategoryRefundPacket extends BlockEntityConfigurationPacket { + + private ItemStack filter; + + public StockKeeperCategoryRefundPacket(BlockPos pos, ItemStack filter) { + super(pos); + this.filter = filter; + } + + public StockKeeperCategoryRefundPacket(FriendlyByteBuf buffer) { + super(buffer); + } + + @Override + protected void readSettings(FriendlyByteBuf buffer) { + filter = buffer.readItem(); + } + + @Override + protected void writeSettings(FriendlyByteBuf buffer) { + buffer.writeItem(filter); + } + + @Override + protected void applySettings(StockTickerBlockEntity be) {} + + @Override + protected void applySettings(ServerPlayer player, StockTickerBlockEntity be) { + if (!filter.isEmpty() && filter.getItem() instanceof FilterItem) + player.getInventory() + .placeItemBackInInventory(filter); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryScreen.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryScreen.java new file mode 100644 index 0000000000..cc1663e0c2 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryScreen.java @@ -0,0 +1,506 @@ +package com.simibubi.create.content.logistics.stockTicker; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Optional; + +import javax.annotation.Nullable; + +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL30; + +import com.google.common.collect.ImmutableList; +import com.mojang.blaze3d.platform.InputConstants; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllPackets; +import com.simibubi.create.foundation.gui.AllGuiTextures; +import com.simibubi.create.foundation.gui.AllIcons; +import com.simibubi.create.foundation.gui.menu.AbstractSimiContainerScreen; +import com.simibubi.create.foundation.gui.menu.GhostItemSubmitPacket; +import com.simibubi.create.foundation.gui.widget.IconButton; +import com.simibubi.create.foundation.gui.widget.ScrollInput; +import com.simibubi.create.foundation.utility.CreateLang; + +import net.createmod.catnip.gui.UIRenderHelper; +import net.createmod.catnip.gui.element.GuiGameElement; +import net.createmod.catnip.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.utility.lang.Components; +import net.minecraft.ChatFormatting; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.EditBox; +import net.minecraft.client.gui.components.Renderable; +import net.minecraft.client.renderer.Rect2i; +import net.minecraft.network.chat.Component; +import net.minecraft.util.FormattedCharSequence; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.items.SlotItemHandler; + +public class StockKeeperCategoryScreen extends AbstractSimiContainerScreen { + + private static final int CARD_HEADER = 20; + private static final int CARD_WIDTH = 160; + + private List extraAreas = Collections.emptyList(); + + private LerpedFloat scroll = LerpedFloat.linear() + .startWithValue(0); + + private List schedule; + private IconButton confirmButton; + private ItemStack editingItem; + private int editingIndex; + private IconButton editorConfirm; + private EditBox editorEditBox; + + public StockKeeperCategoryScreen(StockKeeperCategoryMenu menu, Inventory inv, Component title) { + super(menu, inv, title); + schedule = new ArrayList<>(menu.contentHolder.categories); + menu.slotsActive = false; + } + + @Override + protected void init() { + AllGuiTextures bg = AllGuiTextures.STOCK_KEEPER_CATEGORY; + setWindowSize(bg.getWidth(), bg.getHeight()); + super.init(); + clearWidgets(); + + confirmButton = new IconButton(leftPos + bg.getWidth() - 33, topPos + bg.getHeight() - 24, AllIcons.I_CONFIRM); + confirmButton.withCallback(() -> minecraft.player.closeContainer()); + addRenderableWidget(confirmButton); + + stopEditing(); + + extraAreas = ImmutableList.of(new Rect2i(leftPos + bg.getWidth(), topPos + bg.getHeight() - 40, 48, 40)); + } + + protected void startEditing(int index) { + confirmButton.visible = false; + + editorConfirm = new IconButton(leftPos + 36 + 143, topPos + 55 + 18, AllIcons.I_CONFIRM); + menu.slotsActive = true; + + editorEditBox = new EditBox(font, leftPos + 53, topPos + 45, 128, 10, Components.empty()); + editorEditBox.setTextColor(0xffeeeeee); + editorEditBox.setBordered(false); + editorEditBox.setFocused(false); + editorEditBox.mouseClicked(0, 0, 0); + editorEditBox.setMaxLength(50); + editorEditBox.setValue(index == -1 || schedule.get(index) + .isEmpty() ? CreateLang.temporaryText("New Category") + .string() + : schedule.get(index) + .getHoverName() + .getString()); + + editingIndex = index; + editingItem = index == -1 ? ItemStack.EMPTY : schedule.get(index); + menu.proxyInventory.setStackInSlot(0, editingItem); + AllPackets.getChannel() + .sendToServer(new GhostItemSubmitPacket(editingItem, 0)); + + addRenderableWidget(editorConfirm); + addRenderableWidget(editorEditBox); + } + + protected void stopEditing() { + confirmButton.visible = true; + if (editingItem == null) + return; + + removeWidget(editorConfirm); + removeWidget(editorEditBox); + + ItemStack stackInSlot = menu.proxyInventory.getStackInSlot(0) + .copy(); + if (!stackInSlot.isEmpty()) + stackInSlot.setHoverName(Components.literal(editorEditBox.getValue())); + + if (editingIndex == -1) + schedule.add(stackInSlot); + else + schedule.set(editingIndex, stackInSlot); + + AllPackets.getChannel() + .sendToServer(new GhostItemSubmitPacket(ItemStack.EMPTY, 0)); + + editingItem = null; + editorConfirm = null; + editorEditBox = null; + menu.slotsActive = false; + init(); + } + + @Override + protected void containerTick() { + super.containerTick(); + scroll.tickChaser(); + if (editorEditBox == null) + return; + if (!editorEditBox.getValue() + .equals(CreateLang.temporaryText("New Category") + .string())) + return; + if (menu.proxyInventory.getStackInSlot(0) + .hasCustomHoverName()) + editorEditBox.setValue(menu.proxyInventory.getStackInSlot(0) + .getHoverName() + .getString()); + } + + @Override + public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + partialTicks = minecraft.getFrameTime(); + + if (menu.slotsActive) + super.render(graphics, mouseX, mouseY, partialTicks); + else { + renderBackground(graphics); + renderBg(graphics, partialTicks, mouseX, mouseY); + for (Renderable widget : this.renderables) + widget.render(graphics, mouseX, mouseY, partialTicks); + renderForeground(graphics, mouseX, mouseY, partialTicks); + } + } + + protected void renderSchedule(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + PoseStack matrixStack = graphics.pose(); + UIRenderHelper.swapAndBlitColor(minecraft.getMainRenderTarget(), UIRenderHelper.framebuffer); + + int yOffset = 25; + List entries = schedule; + float scrollOffset = -scroll.getValue(partialTicks); + + for (int i = 0; i <= entries.size(); i++) { + startStencil(graphics, leftPos + 3, topPos + 16, 196, 143); + matrixStack.pushPose(); + matrixStack.translate(0, scrollOffset, 0); + + if (i == entries.size()) { + AllGuiTextures.STOCK_KEEPER_CATEGORY_NEW.render(graphics, leftPos + 9, topPos + yOffset); + matrixStack.popPose(); + endStencil(); + break; + } + + ItemStack scheduleEntry = entries.get(i); + int cardY = yOffset; + int cardHeight = renderScheduleEntry(graphics, i, scheduleEntry, cardY, mouseX, mouseY, partialTicks); + yOffset += cardHeight; + + matrixStack.popPose(); + endStencil(); + } + + int zLevel = 200; + graphics.fillGradient(leftPos + 3, topPos + 16, leftPos + 3 + 196, topPos + 16 + 10, zLevel, 0x77000000, + 0x00000000); + graphics.fillGradient(leftPos + 3, topPos + 6 + 143, leftPos + 3 + 196, topPos + 143 + 16, zLevel, 0x00000000, + 0x77000000); + UIRenderHelper.swapAndBlitColor(UIRenderHelper.framebuffer, minecraft.getMainRenderTarget()); + } + + public int renderScheduleEntry(GuiGraphics graphics, int i, ItemStack entry, int yOffset, int mouseX, int mouseY, + float partialTicks) { + int cardWidth = CARD_WIDTH; + int cardHeader = CARD_HEADER; + int cardHeight = cardHeader; + + PoseStack matrixStack = graphics.pose(); + matrixStack.pushPose(); + matrixStack.translate(leftPos + 9, topPos + yOffset, 0); + + AllGuiTextures.STOCK_KEEPER_CATEGORY_ENTRY.render(graphics, 0, 0); + + if (i > 0) + AllGuiTextures.STOCK_KEEPER_CATEGORY_UP.render(graphics, cardWidth + 12, cardHeader - 18); + if (i < schedule.size() - 1) + AllGuiTextures.STOCK_KEEPER_CATEGORY_DOWN.render(graphics, cardWidth + 12, cardHeader - 9); + + graphics.renderItem(entry, 16, 0); + graphics.drawString(font, entry.isEmpty() ? CreateLang.temporaryText("(Empty)") + .string() + : entry.getHoverName() + .getString(20) + .stripTrailing() + + (entry.getHoverName() + .getString() + .length() > 20 ? "..." : ""), + 36, 4, 0x656565, false); + + matrixStack.popPose(); + return cardHeight; + } + + private Component clickToEdit = CreateLang.translateDirect("gui.schedule.lmb_edit") + .withStyle(ChatFormatting.DARK_GRAY, ChatFormatting.ITALIC); + + public boolean action(@Nullable GuiGraphics graphics, double mouseX, double mouseY, int click) { + if (editingItem != null) + return false; + + int mx = (int) mouseX; + int my = (int) mouseY; + int x = mx - leftPos - 20; + int y = my - topPos - 24; + if (x < 0 || x >= 196) + return false; + if (y < 0 || y >= 143) + return false; + y += scroll.getValue(0); + + List entries = schedule; + for (int i = 0; i < entries.size(); i++) { + ItemStack entry = entries.get(i); + int cardHeight = CARD_HEADER; + + if (y >= cardHeight) { + y -= cardHeight; + if (y < 0) + return false; + continue; + } + + int fieldSize = 140; + if (x > 0 && x <= fieldSize && y > 0 && y <= 16) { + List components = new ArrayList<>(); + components.add(entry.isEmpty() ? CreateLang.temporaryText("(Empty)") + .component() : entry.getHoverName()); + components.add(clickToEdit); + renderActionTooltip(graphics, components, mx, my); + if (click == 0) + startEditing(i); + return true; + } + + if (x > fieldSize && x <= fieldSize + 16 && y > 0 && y <= 16) { + renderActionTooltip(graphics, ImmutableList.of(CreateLang.temporaryText("Delete Category") + .component()), mx, my); + if (click == 0) { + if (!entry.isEmpty()) + AllPackets.getChannel() + .sendToServer(new StockKeeperCategoryRefundPacket(menu.contentHolder.getBlockPos(), entry)); + entries.remove(entry); + init(); + } + return true; + } + + if (x > 158 && x < 170) { + if (y > 2 && y <= 10 && i > 0) { + renderActionTooltip(graphics, ImmutableList.of(CreateLang.translateDirect("gui.schedule.move_up")), + mx, my); + if (click == 0) { + entries.remove(entry); + entries.add(i - 1, entry); + init(); + } + return true; + } + if (y > 10 && y <= 22 && i < entries.size() - 1) { + renderActionTooltip(graphics, + ImmutableList.of(CreateLang.translateDirect("gui.schedule.move_down")), mx, my); + if (click == 0) { + entries.remove(entry); + entries.add(i + 1, entry); + init(); + } + return true; + } + } + + x -= 18; + y -= 28; + + if (x < 0 || y < 0 || x > 160) + return false; + } + + if (x > 0 && x <= 16 && y > 0 && y <= 16) { + renderActionTooltip(graphics, ImmutableList.of(CreateLang.temporaryText("New Category") + .component()), mx, my); + if (click == 0) + startEditing(-1); + } + + return false; + } + + private void renderActionTooltip(@Nullable GuiGraphics graphics, List tooltip, int mx, int my) { + if (graphics != null) + graphics.renderTooltip(font, tooltip, Optional.empty(), mx, my); + } + + protected void startStencil(GuiGraphics graphics, float x, float y, float w, float h) { + RenderSystem.clear(GL30.GL_STENCIL_BUFFER_BIT | GL30.GL_DEPTH_BUFFER_BIT, Minecraft.ON_OSX); + + GL11.glDisable(GL11.GL_STENCIL_TEST); + RenderSystem.stencilMask(~0); + RenderSystem.clear(GL11.GL_STENCIL_BUFFER_BIT, Minecraft.ON_OSX); + GL11.glEnable(GL11.GL_STENCIL_TEST); + RenderSystem.stencilOp(GL11.GL_REPLACE, GL11.GL_KEEP, GL11.GL_KEEP); + RenderSystem.stencilMask(0xFF); + RenderSystem.stencilFunc(GL11.GL_NEVER, 1, 0xFF); + + PoseStack matrixStack = graphics.pose(); + matrixStack.pushPose(); + matrixStack.translate(x, y, 0); + matrixStack.scale(w, h, 1); + graphics.fillGradient(0, 0, 1, 1, -100, 0xff000000, 0xff000000); + matrixStack.popPose(); + + GL11.glEnable(GL11.GL_STENCIL_TEST); + RenderSystem.stencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_KEEP); + RenderSystem.stencilFunc(GL11.GL_EQUAL, 1, 0xFF); + } + + protected void endStencil() { + GL11.glDisable(GL11.GL_STENCIL_TEST); + } + + @Override + public boolean mouseClicked(double pMouseX, double pMouseY, int pButton) { + if (editorConfirm != null && editorConfirm.isMouseOver(pMouseX, pMouseY)) { + stopEditing(); + return true; + } + if (action(null, pMouseX, pMouseY, pButton)) + return true; + + return super.mouseClicked(pMouseX, pMouseY, pButton); + } + + @Override + public boolean keyPressed(int pKeyCode, int pScanCode, int pModifiers) { + if (editingItem == null) + return super.keyPressed(pKeyCode, pScanCode, pModifiers); + InputConstants.Key mouseKey = InputConstants.getKey(pKeyCode, pScanCode); + boolean hitEnter = getFocused() instanceof EditBox && (pKeyCode == 257 || pKeyCode == 335); + boolean hitE = getFocused() == null && minecraft.options.keyInventory.isActiveAndMatches(mouseKey); + if (hitE || hitEnter) { + stopEditing(); + return true; + } + return super.keyPressed(pKeyCode, pScanCode, pModifiers); + } + + @Override + public boolean mouseScrolled(double pMouseX, double pMouseY, double pDelta) { + if (editingItem != null) + return super.mouseScrolled(pMouseX, pMouseY, pDelta); + + float chaseTarget = scroll.getChaseTarget(); + float max = 40 - 143; + max += schedule.size() * CARD_HEADER + 24; + if (max > 0) { + chaseTarget -= pDelta * 12; + chaseTarget = Mth.clamp(chaseTarget, 0, max); + scroll.chase((int) chaseTarget, 0.7f, Chaser.EXP); + } else + scroll.chase(0, 0.7f, Chaser.EXP); + + return super.mouseScrolled(pMouseX, pMouseY, pDelta); + } + + @Override + protected void renderForeground(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.renderForeground(graphics, mouseX, mouseY, partialTicks); + + GuiGameElement.of(AllBlocks.STOCK_TICKER.asStack()).at(leftPos + AllGuiTextures.STOCK_KEEPER_CATEGORY.getWidth() + 3, + topPos + AllGuiTextures.STOCK_KEEPER_CATEGORY.getHeight() - 44, -190) + .scale(3) + .render(graphics); + + action(graphics, mouseX, mouseY, -1); + + if (editingItem == null) + return; + + if (hoveredSlot instanceof SlotItemHandler && hoveredSlot.getItem() + .isEmpty()) { + graphics.renderComponentTooltip(font, List.of(CreateLang.temporaryText("Category Filter") + .color(ScrollInput.HEADER_RGB) + .component(), + CreateLang.temporaryText("Place a List or Attribute Filter") + .style(ChatFormatting.GRAY) + .component(), + CreateLang.temporaryText("to specify which items are included") + .style(ChatFormatting.GRAY) + .component()), + mouseX, mouseY); + } + + if (editorEditBox != null && editorEditBox.isHovered() && !editorEditBox.isFocused()) { + graphics.renderComponentTooltip(font, List.of(CreateLang.temporaryText("Category Name") + .color(ScrollInput.HEADER_RGB) + .component(), clickToEdit), mouseX, mouseY); + } + + } + + @Override + protected void renderBg(GuiGraphics graphics, float pPartialTick, int pMouseX, int pMouseY) { + AllGuiTextures.STOCK_KEEPER_CATEGORY.render(graphics, leftPos, topPos); + FormattedCharSequence formattedcharsequence = menu.contentHolder.getBlockState() + .getBlock() + .getName() + .getVisualOrderText(); + int center = leftPos + (AllGuiTextures.STOCK_KEEPER_CATEGORY.getWidth() - 8) / 2; + graphics.drawString(font, formattedcharsequence, (float) (center - font.width(formattedcharsequence) / 2), + (float) topPos + 4, 0x3D3C48, false); + renderSchedule(graphics, pMouseX, pMouseY, pPartialTick); + + if (editingItem == null) + return; + + graphics.fillGradient(0, 0, this.width, this.height, -1072689136, -804253680); + AllGuiTextures.STOCK_KEEPER_CATEGORY_HEADER.render(graphics, leftPos + 2, topPos + 16); + AllGuiTextures.STOCK_KEEPER_CATEGORY_EDIT.render(graphics, leftPos + 2, topPos + 16 + 14); + AllGuiTextures.STOCK_KEEPER_CATEGORY_FOOTER.render(graphics, leftPos + 2, topPos + 16 + 51); + renderPlayerInventory(graphics, leftPos + 18, topPos + 105); + + formattedcharsequence = CreateLang.temporaryText("Category Editor") + .component() + .getVisualOrderText(); + graphics.drawString(font, formattedcharsequence, (float) (center - font.width(formattedcharsequence) / 2), + (float) topPos + 20, 0x3D3C48, false); + } + + @Override + public void removed() { + super.removed(); + AllPackets.getChannel() + .sendToServer(new StockKeeperCategoryEditPacket(menu.contentHolder.getBlockPos(), schedule)); + } + + @Override + protected List getTooltipFromContainerItem(ItemStack pStack) { + List tooltip = super.getTooltipFromContainerItem(pStack); + if (!(hoveredSlot instanceof SlotItemHandler)) + return tooltip; + if (!tooltip.isEmpty()) + tooltip.set(0, CreateLang.temporaryText("Category Filter") + .color(ScrollInput.HEADER_RGB) + .component()); + return tooltip; + } + + @Override + public List getExtraAreas() { + return extraAreas; + } + + public Font getFont() { + return font; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerAutoRequestScreen.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerAutoRequestScreen.java deleted file mode 100644 index 7d2d967266..0000000000 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerAutoRequestScreen.java +++ /dev/null @@ -1,196 +0,0 @@ -package com.simibubi.create.content.logistics.stockTicker; - -import java.util.ArrayList; -import java.util.List; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.AllPackets; -import com.simibubi.create.content.logistics.BigItemStack; -import com.simibubi.create.foundation.utility.CreateLang; - -import net.createmod.catnip.gui.AbstractSimiScreen; -import net.createmod.catnip.gui.element.GuiGameElement; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.lang.Components; -import net.createmod.catnip.utility.theme.Color; -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.gui.components.Button; -import net.minecraft.client.gui.components.EditBox; -import net.minecraft.network.chat.MutableComponent; -import net.minecraft.util.Mth; - -public class StockTickerAutoRequestScreen extends AbstractSimiScreen { - - StockTickerBlockEntity blockEntity; - - EditBox addressBox; - Button takeSnapshotButton; - - List modifiedAmounts; - - public StockTickerAutoRequestScreen(StockTickerBlockEntity be) { - super(be.getBlockState() - .getBlock() - .getName()); - blockEntity = be; - blockEntity.lastClientsideStockSnapshot = null; - modifiedAmounts = null; - } - - private void resetAmounts() { - modifiedAmounts = new ArrayList<>(); - for (BigItemStack stack : currentStacks()) - modifiedAmounts.add(stack.count); - } - - @Override - protected void init() { - setWindowSize(256, 128); - super.init(); - - int x = guiLeft; - int y = guiTop; - - takeSnapshotButton = Button.builder(Components.literal("Take Snapshot"), this::onPress) - .bounds(x, y + 44, 100, 20) - .build(); - - MutableComponent addressLabel = CreateLang.translateDirect("gui.stock_ticker.package_adress"); - boolean initial = addressBox == null; - addressBox = new EditBox(this.font, x, y + 80, 120, 9, addressLabel); - addressBox.setMaxLength(50); - addressBox.setBordered(false); - addressBox.setTextColor(0xffffff); - if (initial) - addressBox.setValue(blockEntity.restockAddress); - addRenderableWidget(addressBox); - addRenderableWidget(takeSnapshotButton); - } - - private void onPress(Button button) { - if (button == takeSnapshotButton) { - AllPackets.getChannel() - .sendToServer( - new StockTickerConfigurationPacket(blockEntity.getBlockPos(), true, "", PackageOrder.empty())); - modifiedAmounts = null; - } - } - - @Override - public void removed() { - if (modifiedAmounts != null) - for (int i = 0; i < currentStacks().size(); i++) - currentStacks().get(i).count = modifiedAmounts.get(i); - AllPackets.getChannel() - .sendToServer(new StockTickerConfigurationPacket(blockEntity.getBlockPos(), false, addressBox.getValue(), - blockEntity.restockAmounts)); - super.removed(); - } - - final int rows = 8; - final int cols = 8; - final int rowHeight = 18; - final int colWidth = 26; - - @Override - protected void renderWindow(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { - if (modifiedAmounts != null && currentStacks().size() != modifiedAmounts.size()) - resetAmounts(); - - Color color = new Color(255, 255, 255, 50); - int hoveredSlot = getHoveredSlot(mouseX, mouseY); - - // Render some boxes - graphics.renderOutline(addressBox.getX() - 4, addressBox.getY() - 4, addressBox.getWidth() + 12, - addressBox.getHeight() + 7, color.getRGB()); - graphics.renderOutline(guiLeft - 3, guiTop - 4 + 20, cols * colWidth + 6, rowHeight + 8, color.getRGB()); - - // Render text input hints - if (addressBox.getValue() - .isBlank()) - graphics.drawString(font, addressBox.getMessage(), addressBox.getX(), addressBox.getY(), 0x88dddddd); - - graphics.drawString(font, Components.literal("Target Amounts:"), guiLeft, guiTop, 0x88dddddd); - PoseStack ms = graphics.pose(); - - for (int i = 0; i < currentStacks().size(); i++) { - BigItemStack entry = currentStacks().get(i); - ms.pushPose(); - - ms.translate(guiLeft + i % cols * colWidth, guiTop + 20 + i / cols * rowHeight, 200); - - int customCount = modifiedAmounts == null ? currentStacks().get(i).count : modifiedAmounts.get(i); - drawItemCount(graphics, customCount, customCount); - ms.translate(0, 0, -200); - - float scaleFromHover = hoveredSlot == i ? 1.075f : 1; - ms.translate((colWidth - 18) / 2.0, (rowHeight - 18) / 2.0, 0); - ms.translate(18 / 2.0, 18 / 2.0, 0); - ms.scale(scaleFromHover, scaleFromHover, scaleFromHover); - ms.translate(-18 / 2.0, -18 / 2.0, 0); - GuiGameElement.of(entry.stack) - .render(graphics); - ms.popPose(); - } - - if (hoveredSlot != -1) - graphics.renderTooltip(font, currentStacks().get(hoveredSlot).stack, mouseX, mouseY); - } - - private List currentStacks() { - return blockEntity.restockAmounts.stacks(); - } - - private int getHoveredSlot(int mouseX, int mouseY) { - if (mouseY < guiTop + 20 || mouseY > guiTop + 20 + rowHeight) - return -1; - int slot = (mouseX - guiLeft) / colWidth; - if (slot >= currentStacks().size()) - return -1; - return Math.max(-1, slot); - } - - @Override - public boolean mouseScrolled(double pMouseX, double pMouseY, double pDelta) { - if (modifiedAmounts == null) - resetAmounts(); - int hoveredSlot = getHoveredSlot(Mth.floor(pMouseX), Mth.floor(pMouseY)); - if (hoveredSlot != -1) { - int amount = modifiedAmounts.get(hoveredSlot); - amount += (hasShiftDown() ? 64 : 1) * Math.signum(pDelta); - if (hasShiftDown()) - amount = 64 * (amount / 64); - amount = Math.max(amount, 1); - modifiedAmounts.set(hoveredSlot, amount); - return true; - } - - return super.mouseScrolled(pMouseX, pMouseY, pDelta); - } - - private void drawItemCount(GuiGraphics graphics, int count, int customCount) { - boolean special = customCount != count; - if (!special && count == 1) - return; - - count = customCount; - String text = count >= 1000000 ? (count / 1000000) + "m" - : count >= 10000 ? (count / 1000) + "k" - : count >= 1000 ? ((count * 10) / 1000) / 10f + "k" - : count >= 100 ? count + "" : count > 0 ? " " + count : " \u2714"; - - int lightOutline = 0x444444; - int darkOutline = 0x222222; - int middleColor = special ? 0xaaffaa : 0xdddddd; - - for (int xi : Iterate.positiveAndNegative) - graphics.drawString(font, CreateLang.text(text) - .component(), 11 + xi, 10, xi < 0 ? lightOutline : darkOutline, false); - for (int yi : Iterate.positiveAndNegative) - graphics.drawString(font, CreateLang.text(text) - .component(), 11, 10 + yi, yi < 0 ? lightOutline : darkOutline, false); - graphics.drawString(font, CreateLang.text(text) - .component(), 11, 10, middleColor, false); - } - -} diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlock.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlock.java index d158412a2d..b220dbe199 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlock.java @@ -6,10 +6,9 @@ import com.simibubi.create.AllShapes; import com.simibubi.create.foundation.block.IBE; import dev.engine_room.flywheel.lib.model.baked.PartialModel; -import net.createmod.catnip.gui.ScreenOpener; -import net.minecraft.client.player.LocalPlayer; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.LivingEntity; @@ -28,7 +27,7 @@ import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.fml.DistExecutor; +import net.minecraftforge.network.NetworkHooks; public class StockTickerBlock extends HorizontalDirectionalBlock implements IBE { @@ -64,27 +63,13 @@ public class StockTickerBlock extends HorizontalDirectionalBlock implements IBE< return InteractionResult.SUCCESS; } - if (!stbe.observedInventory.hasInventory()) - return InteractionResult.PASS; - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> displayScreen(stbe, pPlayer)); + if (pPlayer instanceof ServerPlayer sp && stbe.isKeeperPresent()) + NetworkHooks.openScreen(sp, stbe, stbe.getBlockPos()); + return InteractionResult.SUCCESS; }); } - @Override - public void neighborChanged(BlockState pState, Level pLevel, BlockPos pPos, Block pNeighborBlock, - BlockPos pNeighborPos, boolean pMovedByPiston) { - if (pLevel.isClientSide()) - return; - withBlockEntityDo(pLevel, pPos, StockTickerBlockEntity::onRedstonePowerChanged); - } - - @OnlyIn(value = Dist.CLIENT) - protected void displayScreen(StockTickerBlockEntity be, Player player) { - if (player instanceof LocalPlayer) - ScreenOpener.open(new StockTickerAutoRequestScreen(be)); - } - @Override public VoxelShape getShape(BlockState pState, BlockGetter pLevel, BlockPos pPos, CollisionContext pContext) { return AllShapes.STOCK_TICKER; diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java index b763dfc1b1..aaa53a3080 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java @@ -10,21 +10,27 @@ import com.simibubi.create.AllPackets; import com.simibubi.create.content.contraptions.actors.seat.SeatEntity; import com.simibubi.create.content.equipment.goggles.IHaveHoveringInformation; import com.simibubi.create.content.logistics.BigItemStack; +import com.simibubi.create.content.logistics.filter.FilterItem; import com.simibubi.create.content.logistics.packager.InventorySummary; -import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; -import com.simibubi.create.foundation.blockEntity.behaviour.inventory.InvManipulationBehaviour; import com.simibubi.create.foundation.item.ItemHelper; import com.simibubi.create.foundation.item.SmartInventory; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.BlockFace; import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.NBTHelper; import net.createmod.catnip.utility.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; +import net.minecraft.world.Containers; +import net.minecraft.world.MenuProvider; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; @@ -32,7 +38,7 @@ import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.items.IItemHandler; -public class StockTickerBlockEntity extends StockCheckingBlockEntity implements IHaveHoveringInformation { +public class StockTickerBlockEntity extends StockCheckingBlockEntity implements IHaveHoveringInformation, MenuProvider { // Player-interface Feature protected List lastClientsideStockSnapshot; @@ -41,12 +47,7 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity implements protected String previouslyUsedAddress; protected int activeLinks; protected int ticksSinceLastUpdate; - - // Auto-restock Feature - protected InvManipulationBehaviour observedInventory; - protected PackageOrder restockAmounts; - protected String restockAddress; - protected boolean powered; + protected List categories; // Shop feature protected SmartInventory receivedPayments; @@ -55,17 +56,9 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity implements public StockTickerBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); previouslyUsedAddress = ""; - restockAddress = ""; - restockAmounts = PackageOrder.empty(); receivedPayments = new SmartInventory(27, this, 64, false); capability = LazyOptional.of(() -> receivedPayments); - } - - @Override - public void addBehaviours(List behaviours) { - super.addBehaviours(behaviours); - behaviours - .add(observedInventory = new InvManipulationBehaviour(this, (w, p, s) -> new BlockFace(p, Direction.DOWN))); + categories = new ArrayList<>(); } public void refreshClientStockSnapshot() { @@ -112,10 +105,8 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity implements protected void write(CompoundTag tag, boolean clientPacket) { super.write(tag, clientPacket); tag.putString("PreviousAddress", previouslyUsedAddress); - tag.put("RestockAmounts", restockAmounts.write()); - tag.putString("RestockAddress", restockAddress); - tag.putBoolean("Powered", powered); tag.put("ReceivedPayments", receivedPayments.serializeNBT()); + tag.put("Categories", NBTHelper.writeItemList(categories)); if (clientPacket) tag.putInt("ActiveLinks", activeLinks); @@ -125,74 +116,14 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity implements protected void read(CompoundTag tag, boolean clientPacket) { super.read(tag, clientPacket); previouslyUsedAddress = tag.getString("PreviousAddress"); - restockAmounts = PackageOrder.read(tag.getCompound("RestockAmounts")); - restockAddress = tag.getString("RestockAddress"); - powered = tag.getBoolean("Powered"); receivedPayments.deserializeNBT(tag.getCompound("ReceivedPayments")); + categories = NBTHelper.readItemList(tag.getList("Categories", Tag.TAG_COMPOUND)); + categories.removeIf(stack -> !stack.isEmpty() && !(stack.getItem() instanceof FilterItem)); if (clientPacket) activeLinks = tag.getInt("ActiveLinks"); } - protected void takeInventoryStockSnapshot() { - restockAmounts = PackageOrder.empty(); - IItemHandler inventory = observedInventory.getInventory(); - if (inventory == null) - return; - restockAmounts = new PackageOrder(summariseObservedInventory().getStacksByCount()); - List stacks = restockAmounts.stacks(); - if (stacks.size() > 8) - stacks.subList(8, stacks.size()) - .clear(); - notifyUpdate(); - } - - private InventorySummary summariseObservedInventory() { - IItemHandler inventory = observedInventory.getInventory(); - if (inventory == null) - return InventorySummary.EMPTY; - InventorySummary inventorySummary = new InventorySummary(); - for (int i = 0; i < inventory.getSlots(); i++) - inventorySummary.add(inventory.getStackInSlot(i)); - return inventorySummary; - } - - protected void onRedstonePowerChanged() { - boolean hasNeighborSignal = level.hasNeighborSignal(worldPosition); - if (powered == hasNeighborSignal) - return; - - if (hasNeighborSignal) - triggerRestock(); - - powered = hasNeighborSignal; - setChanged(); - } - - protected void triggerRestock() { - if (!observedInventory.hasInventory() || restockAmounts.isEmpty()) - return; - - InventorySummary presentStock = summariseObservedInventory(); - List missingItems = new ArrayList<>(); - for (BigItemStack required : restockAmounts.stacks()) { - int diff = required.count - presentStock.getCountOf(required.stack); - if (diff > 0) - missingItems.add(new BigItemStack(required.stack, diff)); - } - - if (missingItems.isEmpty()) - return; - - broadcastPackageRequest(new PackageOrder(missingItems), observedInventory.getInventory(), restockAddress); - } - - protected void updateAutoRestockSettings(String address, PackageOrder amounts) { - restockAmounts = amounts; - restockAddress = address; - notifyUpdate(); - } - public void receiveStockPacket(List stacks, boolean endOfTransmission) { if (newlyReceivedStockSnapshot == null) newlyReceivedStockSnapshot = new ArrayList<>(); @@ -252,6 +183,10 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity implements @Override public void destroy() { ItemHelper.dropContents(level, worldPosition, receivedPayments); + for (ItemStack filter : categories) + if (!filter.isEmpty() && filter.getItem() instanceof FilterItem) + Containers.dropItemStack(level, worldPosition.getX(), worldPosition.getY(), worldPosition.getZ(), + filter); super.destroy(); } @@ -261,4 +196,14 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity implements super.invalidate(); } + @Override + public AbstractContainerMenu createMenu(int pContainerId, Inventory pPlayerInventory, Player pPlayer) { + return StockKeeperCategoryMenu.create(pContainerId, pPlayerInventory, this); + } + + @Override + public Component getDisplayName() { + return Components.empty(); + } + } diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerConfigurationPacket.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerConfigurationPacket.java deleted file mode 100644 index ed7316b33d..0000000000 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerConfigurationPacket.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.simibubi.create.content.logistics.stockTicker; - -import com.simibubi.create.foundation.networking.BlockEntityConfigurationPacket; - -import net.minecraft.core.BlockPos; -import net.minecraft.network.FriendlyByteBuf; - -public class StockTickerConfigurationPacket extends BlockEntityConfigurationPacket { - - private boolean takeSnapshot; - private String address; - private PackageOrder amounts; - - public StockTickerConfigurationPacket(BlockPos pos, boolean takeSnapshot, String address, PackageOrder amounts) { - super(pos); - this.takeSnapshot = takeSnapshot; - this.address = address; - this.amounts = amounts; - } - - public StockTickerConfigurationPacket(FriendlyByteBuf buffer) { - super(buffer); - } - - @Override - protected void writeSettings(FriendlyByteBuf buffer) { - buffer.writeBoolean(takeSnapshot); - buffer.writeUtf(address); - amounts.write(buffer); - } - - @Override - protected void readSettings(FriendlyByteBuf buffer) { - takeSnapshot = buffer.readBoolean(); - address = buffer.readUtf(); - amounts = PackageOrder.read(buffer); - } - - @Override - protected void applySettings(StockTickerBlockEntity be) { - if (takeSnapshot) { - be.takeInventoryStockSnapshot(); - return; - } - - be.updateAutoRestockSettings(address, amounts); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java index fd2f93894b..c30bce8dc2 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java @@ -161,6 +161,15 @@ public enum AllGuiTextures implements ScreenElement, TextureSheetSegment { FACTORY_PANEL_ARROW("restocker_and_requester", 27, 108, 22, 16), FACTORY_PANEL_ARROW_FILLED("restocker_and_requester", 50, 108, 22, 16), + STOCK_KEEPER_CATEGORY("stock_keeper_categories", 210, 190), + STOCK_KEEPER_CATEGORY_HEADER("stock_keeper_categories", 202, 15), + STOCK_KEEPER_CATEGORY_EDIT("stock_keeper_categories", 0, 216, 202, 38), + STOCK_KEEPER_CATEGORY_FOOTER("stock_keeper_categories", 0, 160, 210, 30), + STOCK_KEEPER_CATEGORY_NEW("stock_keeper_categories", 4, 194, 28, 17), + STOCK_KEEPER_CATEGORY_ENTRY("stock_keeper_categories", 39, 194, 169, 17), + STOCK_KEEPER_CATEGORY_UP("stock_keeper_categories", 211, 195, 8, 9), + STOCK_KEEPER_CATEGORY_DOWN("stock_keeper_categories", 211, 205, 8, 9), + REDSTONE_REQUESTER("restocker_and_requester", 0, 134, 210, 100), // JEI diff --git a/src/main/java/com/simibubi/create/foundation/gui/menu/GhostItemSubmitPacket.java b/src/main/java/com/simibubi/create/foundation/gui/menu/GhostItemSubmitPacket.java index 234b87d4bb..a29e54e37c 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/menu/GhostItemSubmitPacket.java +++ b/src/main/java/com/simibubi/create/foundation/gui/menu/GhostItemSubmitPacket.java @@ -1,5 +1,7 @@ package com.simibubi.create.foundation.gui.menu; +import com.simibubi.create.content.logistics.filter.FilterItem; +import com.simibubi.create.content.logistics.stockTicker.StockKeeperCategoryMenu; import com.simibubi.create.foundation.networking.SimplePacketBase; import net.minecraft.network.FriendlyByteBuf; @@ -37,7 +39,14 @@ public class GhostItemSubmitPacket extends SimplePacketBase { if (player.containerMenu instanceof GhostItemMenu menu) { menu.ghostInventory.setStackInSlot(slot, item); - menu.getSlot(36 + slot).setChanged(); + menu.getSlot(36 + slot) + .setChanged(); + } + if (player.containerMenu instanceof StockKeeperCategoryMenu menu + && (item.isEmpty() || item.getItem() instanceof FilterItem)) { + menu.proxyInventory.setStackInSlot(slot, item); + menu.getSlot(36 + slot) + .setChanged(); } }); return true; diff --git a/src/main/resources/assets/create/textures/gui/stock_keeper_categories.png b/src/main/resources/assets/create/textures/gui/stock_keeper_categories.png new file mode 100644 index 0000000000000000000000000000000000000000..cffb32aacf3a7ad830549a68a72fe0d728aabe7a GIT binary patch literal 1431 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911MRQ8&P5D>38$lZxy-8q?;Kn_c~qpu?a z!^VE@KZ&eBet3XSh%1oZcKTu6#3i;i9%;pGmsi(6KeKK{L-5Re=l}ozA3Js|G&D3V zE$z{xM(`eoS@P=Ds~Iz92nh-8-@pIbwQC1w=9-(EcXxL$Uc4A+ z=8iOt8$e37B*-rqXbw)m5ZU%T3#gE@z$3Dlfr0NZ2s0kfUy%ZI?*dO3$B>G+w{yD7 zE?Wt>p4Bxp(XDlGUijqy{?E5Qb=np(^`&%~oVwR^ZR6xftMs=!)`(@iN}TULspp*Qzs=&Rm~rt-`uq3tm!(!LZFu|mac~gxRgn#~RbE*O<}nFL7sNS~ zbIWjhWFIJJ{CmA&Wy9Oc#Wl?9xH*3MGTwgv{P_(w8*zgt+gVji9&Bn*-0?|Xw4l7a zT$WYF?hIGQ`S)LRFSN>kp3Nlmsd_K_j6cDQnm_N}V_E(unbGs-U9p4!#>}6uH5Cl& zO<9*bD~~wPypP*XaGffMSqV)hnX}f%@3zihRS^&1^%C)Xbox~z)0dxF3mIzX{U~ek zlUtmvx=1$eoF}7{$)d|*v6_<)i?yFWeI@ch#ReZ;);)V(9Nuzp!*$nJnh#X}y!*a7 zc)F>9zQcN1skav^oApH8rrW*QdHX@$_4zm6w!PI8;JUHpt(wiOLua`yK2JF$@rnPp zEdMl4)-4ai-Txn&7w|m5(W3sD=F-9&A9tKA*l?zh@!;G(gSRz|?aM{n_TSy`bi>Ji zJ{A#a-^3&yYyPu%ekQm}=}oy#!gWEuX*2J$sI!+W_}u0sD{$+{(KFl@mHn@`xQ3rn zdGn##-6Eom=}Vp2KJ?^~Nhg);!7k*h)ld=DAqD92BB@H)q z-`zR8<;m`Z{r3Z0k8ilm>c_&TsV;W^R>=`{0E2r zOclGZ*Rynk$5Pf9KGu-WhYeY~TI(%$<=;BX|3CYx{XDbcJL^J0IZm8yjn)DtV9<+b zOxw)*B7612?czlXd3*m{Wx6%L_+H!dIdLbB9Ih7sVD|W1K!e|ygg97kXXH8&*6>ebmNbZ# zd;V-Mcg5xUOBM^6{Pa^E)pGCnmET#}0xTjLlU{Ng*e4e4z9yNVZW$}lz{n-y9e&{I pf6 Date: Sun, 27 Oct 2024 15:11:12 +0100 Subject: [PATCH 091/515] Order up - Stock keeper screen second pass --- .../LogisticalStockResponsePacket.java | 2 - .../StockKeeperCategoryScreen.java | 36 +- .../stockTicker/StockTickerBlock.java | 5 + .../stockTicker/StockTickerBlockEntity.java | 33 +- .../StockTickerInteractionHandler.java | 3 + .../stockTicker/StockTickerRequestScreen.java | 571 +++++++++++++----- .../trains/schedule/ScheduleScreen.java | 89 +-- .../create/foundation/gui/AllGuiTextures.java | 9 +- .../foundation/gui/ScreenWithStencils.java | 41 ++ .../create/textures/gui/stock_keeper.png | Bin 0 -> 1482 bytes .../assets/create/textures/gui/widgets.png | Bin 11512 -> 12034 bytes 11 files changed, 529 insertions(+), 260 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/gui/ScreenWithStencils.java create mode 100644 src/main/resources/assets/create/textures/gui/stock_keeper.png diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalStockResponsePacket.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalStockResponsePacket.java index 629ce6928b..d873c96890 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalStockResponsePacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalStockResponsePacket.java @@ -6,11 +6,9 @@ import java.util.List; import com.simibubi.create.content.logistics.BigItemStack; import com.simibubi.create.foundation.networking.SimplePacketBase; -import net.createmod.catnip.utility.IntAttached; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.world.item.ItemStack; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.network.NetworkEvent.Context; diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryScreen.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryScreen.java index cc1663e0c2..bcab306bd0 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryScreen.java @@ -7,17 +7,14 @@ import java.util.Optional; import javax.annotation.Nullable; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL30; - import com.google.common.collect.ImmutableList; import com.mojang.blaze3d.platform.InputConstants; -import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllPackets; import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllIcons; +import com.simibubi.create.foundation.gui.ScreenWithStencils; import com.simibubi.create.foundation.gui.menu.AbstractSimiContainerScreen; import com.simibubi.create.foundation.gui.menu.GhostItemSubmitPacket; import com.simibubi.create.foundation.gui.widget.IconButton; @@ -30,7 +27,6 @@ import net.createmod.catnip.utility.animation.LerpedFloat; import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; import net.createmod.catnip.utility.lang.Components; import net.minecraft.ChatFormatting; -import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.EditBox; @@ -43,7 +39,8 @@ import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.item.ItemStack; import net.minecraftforge.items.SlotItemHandler; -public class StockKeeperCategoryScreen extends AbstractSimiContainerScreen { +public class StockKeeperCategoryScreen extends AbstractSimiContainerScreen + implements ScreenWithStencils { private static final int CARD_HEADER = 20; private static final int CARD_WIDTH = 160; @@ -339,33 +336,6 @@ public class StockKeeperCategoryScreen extends AbstractSimiContainerScreen { if (!stbe.receivedPayments.isEmpty()) { diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java index aaa53a3080..11b2bba54b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java @@ -1,6 +1,7 @@ package com.simibubi.create.content.logistics.stockTicker; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import org.jetbrains.annotations.NotNull; @@ -11,6 +12,7 @@ import com.simibubi.create.content.contraptions.actors.seat.SeatEntity; import com.simibubi.create.content.equipment.goggles.IHaveHoveringInformation; import com.simibubi.create.content.logistics.BigItemStack; import com.simibubi.create.content.logistics.filter.FilterItem; +import com.simibubi.create.content.logistics.filter.FilterItemStack; import com.simibubi.create.content.logistics.packager.InventorySummary; import com.simibubi.create.foundation.item.ItemHelper; import com.simibubi.create.foundation.item.SmartInventory; @@ -41,7 +43,7 @@ import net.minecraftforge.items.IItemHandler; public class StockTickerBlockEntity extends StockCheckingBlockEntity implements IHaveHoveringInformation, MenuProvider { // Player-interface Feature - protected List lastClientsideStockSnapshot; + protected List> lastClientsideStockSnapshot; protected InventorySummary lastClientsideStockSnapshotAsSummary; protected List newlyReceivedStockSnapshot; protected String previouslyUsedAddress; @@ -67,7 +69,7 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity implements .sendToServer(new LogisticalStockRequestPacket(worldPosition)); } - public List getClientStockSnapshot() { + public List> getClientStockSnapshot() { return lastClientsideStockSnapshot; } @@ -128,11 +130,34 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity implements if (newlyReceivedStockSnapshot == null) newlyReceivedStockSnapshot = new ArrayList<>(); newlyReceivedStockSnapshot.addAll(stacks); + if (!endOfTransmission) return; - lastClientsideStockSnapshot = newlyReceivedStockSnapshot; + lastClientsideStockSnapshotAsSummary = new InventorySummary(); - stacks.forEach(lastClientsideStockSnapshotAsSummary::add); + lastClientsideStockSnapshot = new ArrayList<>(); + + for (BigItemStack bigStack : newlyReceivedStockSnapshot) + lastClientsideStockSnapshotAsSummary.add(bigStack); + + for (ItemStack filter : categories) { + List inCategory = new ArrayList<>(); + if (!filter.isEmpty()) { + FilterItemStack filterItemStack = FilterItemStack.of(filter); + for (Iterator iterator = newlyReceivedStockSnapshot.iterator(); iterator.hasNext();) { + BigItemStack bigStack = iterator.next(); + if (!filterItemStack.test(level, bigStack.stack)) + continue; + inCategory.add(bigStack); + iterator.remove(); + } + } + lastClientsideStockSnapshot.add(inCategory); + } + + List unsorted = new ArrayList<>(newlyReceivedStockSnapshot); + lastClientsideStockSnapshot.add(unsorted); + newlyReceivedStockSnapshot = null; } diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java index 68be591fe4..5593b9f560 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllEntityTypes; import com.simibubi.create.AllItems; import com.simibubi.create.AllSoundEvents; import com.simibubi.create.content.contraptions.actors.seat.SeatEntity; @@ -173,6 +174,8 @@ public class StockTickerInteractionHandler { return null; if (!(entity instanceof LivingEntity living)) return null; + if (AllEntityTypes.PACKAGE.is(entity)) + return null; BlockPos pos = entity.blockPosition(); int stations = 0; diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java index 5a4b20c6a5..91ce1497c1 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java @@ -1,5 +1,6 @@ package com.simibubi.create.content.logistics.stockTicker; +import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; @@ -11,39 +12,60 @@ import javax.annotation.Nullable; import org.lwjgl.glfw.GLFW; +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.AllPackets; +import com.simibubi.create.content.contraptions.actors.seat.SeatEntity; import com.simibubi.create.content.logistics.AddressEditBox; import com.simibubi.create.content.logistics.BigItemStack; +import com.simibubi.create.content.logistics.packager.InventorySummary; +import com.simibubi.create.content.trains.station.NoShadowFontWrapper; +import com.simibubi.create.foundation.gui.AllGuiTextures; +import com.simibubi.create.foundation.gui.ScreenWithStencils; import com.simibubi.create.foundation.utility.CreateLang; import net.createmod.catnip.gui.AbstractSimiScreen; +import net.createmod.catnip.gui.UIRenderHelper; import net.createmod.catnip.gui.element.GuiGameElement; +import net.createmod.catnip.utility.Couple; import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.Pair; import net.createmod.catnip.utility.animation.LerpedFloat; import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; import net.createmod.catnip.utility.theme.Color; +import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.EditBox; +import net.minecraft.client.gui.screens.inventory.InventoryScreen; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.util.Mth; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Pose; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.phys.AABB; import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.registries.ForgeRegistries; -public class StockTickerRequestScreen extends AbstractSimiScreen { +public class StockTickerRequestScreen extends AbstractSimiScreen implements ScreenWithStencils { + + private static final AllGuiTextures NUMBERS = AllGuiTextures.NUMBERS; + private static final AllGuiTextures HEADER = AllGuiTextures.STOCK_KEEPER_REQUEST_HEADER; + private static final AllGuiTextures BODY = AllGuiTextures.STOCK_KEEPER_REQUEST_BODY; + private static final AllGuiTextures FOOTER = AllGuiTextures.STOCK_KEEPER_REQUEST_FOOTER; StockTickerBlockEntity blockEntity; LerpedFloat itemScroll; - final int rows = 8; - final int cols = 8; - final int rowHeight = 18; - final int colWidth = 26; - final int noneHovered = -1; + final int rows = 9; + final int cols = 9; + final int rowHeight = 20; + final int colWidth = 20; + final Couple noneHovered = Couple.create(-1, -1); int itemsX; int itemsY; int orderY; @@ -54,10 +76,14 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { int emptyTicks = 0; int successTicks = 0; - List currentItemSource; - List displayedItems; + List> currentItemSource; + List> displayedItems; + List> categories; + List itemsToOrder; + WeakReference stockKeeper; + boolean encodeRequester; // Redstone requesters public StockTickerRequestScreen(StockTickerBlockEntity be, boolean encodeRequester) { @@ -67,6 +93,7 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { this.encodeRequester = encodeRequester; displayedItems = new ArrayList<>(); itemsToOrder = new ArrayList<>(); + categories = new ArrayList<>(); blockEntity = be; blockEntity.lastClientsideStockSnapshot = null; blockEntity.ticksSinceLastUpdate = 15; @@ -74,27 +101,55 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { successTicks = 0; itemScroll = LerpedFloat.linear() .startWithValue(0); + stockKeeper = new WeakReference(null); + + // Find the keeper for rendering + for (int yOffset : Iterate.zeroAndOne) { + for (Direction side : Iterate.horizontalDirections) { + BlockPos seatPos = be.getBlockPos() + .below(yOffset) + .relative(side); + for (SeatEntity seatEntity : be.getLevel() + .getEntitiesOfClass(SeatEntity.class, new AABB(seatPos))) + if (!seatEntity.getPassengers() + .isEmpty() + && seatEntity.getPassengers() + .get(0) instanceof LivingEntity keeper) + stockKeeper = new WeakReference<>(keeper); + } + } } @Override protected void init() { - setWindowSize(256, 256); + int appropriateHeight = Minecraft.getInstance() + .getWindow() + .getGuiScaledHeight() - 10; + appropriateHeight -= + Mth.positiveModulo(appropriateHeight - HEADER.getHeight() - FOOTER.getHeight(), BODY.getHeight()); + appropriateHeight = + Math.min(appropriateHeight, HEADER.getHeight() + FOOTER.getHeight() + BODY.getHeight() * 17); + + setWindowSize(256, appropriateHeight); super.init(); - itemsX = guiLeft + (windowWidth - cols * colWidth) / 2; + int x = guiLeft; + int y = guiTop; + + itemsX = guiLeft + (windowWidth - cols * colWidth) / 2 + 1; itemsY = guiTop + 35; - orderY = itemsY + rows * rowHeight + 10; + orderY = y + windowHeight - 60; MutableComponent searchLabel = CreateLang.translateDirect("gui.stock_ticker.search_items"); - searchBox = new EditBox(this.font, itemsX + 1, itemsY - 18, 120, 9, searchLabel); + searchBox = new EditBox(this.font, x + 81, y + 24, 110, 9, searchLabel); searchBox.setMaxLength(50); searchBox.setBordered(false); searchBox.setTextColor(0xffffff); - addRenderableWidget(searchBox); + addWidget(searchBox); boolean initial = addressBox == null; - addressBox = new AddressEditBox(this, font, itemsX + 1, orderY + rowHeight + 10, 120, 9); - addressBox.setTextColor(0xffffff); + addressBox = new AddressEditBox(this, new NoShadowFontWrapper(font), x + 60, y + windowHeight - 32, 112, 10); + addressBox.setTextColor(0x555555); if (initial) addressBox.setValue(blockEntity.previouslyUsedAddress); addRenderableWidget(addressBox); @@ -110,9 +165,37 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { return; } + categories = new ArrayList<>(); + blockEntity.categories.forEach(stack -> categories.add(Pair.of(stack.isEmpty() ? "" + : stack.getHoverName() + .getString(), + 0))); + categories.add(Pair.of(CreateLang.temporaryText("Unsorted") + .string(), 0)); + String valueWithPrefix = searchBox.getValue(); + boolean anyItemsInCategory = false; + if (valueWithPrefix.isBlank()) { displayedItems = currentItemSource; + + int categoryY = 0; + for (int categoryIndex = 0; categoryIndex < currentItemSource.size(); categoryIndex++) { + categories.get(categoryIndex) + .setSecond(categoryY); + List displayedItemsInCategory = displayedItems.get(categoryIndex); + if (displayedItemsInCategory.isEmpty()) + continue; + if (categoryIndex < currentItemSource.size() - 1) + anyItemsInCategory = true; + + categoryY += rowHeight; + categoryY += Math.ceil(displayedItemsInCategory.size() / (float) cols) * rowHeight; + } + + if (!anyItemsInCategory) + categories.clear(); + clampScrollBar(); return; } @@ -124,38 +207,59 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { final String value = valueWithPrefix; displayedItems = new ArrayList<>(); - for (BigItemStack entry : currentItemSource) { - ItemStack stack = entry.stack; + currentItemSource.forEach($ -> displayedItems.add(new ArrayList<>())); - if (modSearch) { - if (ForgeRegistries.ITEMS.getKey(stack.getItem()) - .getNamespace() - .contains(value)) { - displayedItems.add(entry); + int categoryY = 0; + for (int categoryIndex = 0; categoryIndex < currentItemSource.size(); categoryIndex++) { + List category = currentItemSource.get(categoryIndex); + categories.get(categoryIndex) + .setSecond(categoryY); + + List displayedItemsInCategory = displayedItems.get(categoryIndex); + for (BigItemStack entry : category) { + ItemStack stack = entry.stack; + + if (modSearch) { + if (ForgeRegistries.ITEMS.getKey(stack.getItem()) + .getNamespace() + .contains(value)) { + displayedItemsInCategory.add(entry); + } + continue; + } + + if (tagSearch) { + if (stack.getTags() + .anyMatch(key -> key.location() + .toString() + .contains(value))) + displayedItemsInCategory.add(entry); + continue; + } + + if (stack.getHoverName() + .getString() + .contains(value) + || ForgeRegistries.ITEMS.getKey(stack.getItem()) + .getPath() + .contains(value)) { + displayedItemsInCategory.add(entry); + continue; } - continue; } - if (tagSearch) { - if (stack.getTags() - .anyMatch(key -> key.location() - .toString() - .contains(value))) - displayedItems.add(entry); + if (displayedItemsInCategory.isEmpty()) continue; - } - if (stack.getHoverName() - .getString() - .contains(value) - || ForgeRegistries.ITEMS.getKey(stack.getItem()) - .getPath() - .contains(value)) { - displayedItems.add(entry); - continue; - } + if (categoryIndex < currentItemSource.size() - 1) + anyItemsInCategory = true; + categoryY += rowHeight; + categoryY += Math.ceil(displayedItemsInCategory.size() / (float) cols) * rowHeight; } + if (!anyItemsInCategory) + categories.clear(); + clampScrollBar(); } @@ -164,7 +268,10 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { super.tick(); addressBox.tick(); - if (displayedItems.isEmpty()) + boolean allEmpty = true; + for (List list : displayedItems) + allEmpty &= list.isEmpty(); + if (allEmpty) emptyTicks++; else emptyTicks = 0; @@ -174,7 +281,7 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { else successTicks = 0; - List clientStockSnapshot = blockEntity.getClientStockSnapshot(); + List> clientStockSnapshot = blockEntity.getClientStockSnapshot(); if (clientStockSnapshot != currentItemSource) { currentItemSource = clientStockSnapshot; refreshSearchResults(false); @@ -187,6 +294,10 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { if (blockEntity.ticksSinceLastUpdate > 15) blockEntity.refreshClientStockSnapshot(); + + LivingEntity keeper = stockKeeper.get(); + if (keeper == null || !keeper.isAlive()) + removed(); } @Override @@ -194,46 +305,66 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { PoseStack ms = graphics.pose(); Color color = new Color(255, 255, 255, 50); float currentScroll = itemScroll.getValue(partialTicks); - int startRow = Math.max(0, Mth.floor(currentScroll) - 1); - int hoveredSlot = getHoveredSlot(mouseX, mouseY, true); + Couple hoveredSlot = getHoveredSlot(mouseX, mouseY); - // Render some boxes - graphics.renderOutline(searchBox.getX() - 4, searchBox.getY() - 4, searchBox.getWidth() + 12, - searchBox.getHeight() + 7, color.getRGB()); - graphics.renderOutline(addressBox.getX() - 4, addressBox.getY() - 4, addressBox.getWidth() + 12, - addressBox.getHeight() + 7, color.getRGB()); - graphics.renderOutline(itemsX - 3, itemsY - 4, cols * colWidth + 6, rows * rowHeight + 8, color.getRGB()); - graphics.renderOutline(itemsX - 3, orderY - 4, cols * colWidth + 6, rowHeight + 8, color.getRGB()); - drawConfirmBox(graphics, color, mouseX, mouseY); + int x = guiLeft; + int y = guiTop; + + // BG + HEADER.render(graphics, x, y); + y += HEADER.getHeight(); + for (int i = 0; i < (windowHeight - HEADER.getHeight() - FOOTER.getHeight()) / BODY.getHeight(); i++) { + BODY.render(graphics, x, y); + y += BODY.getHeight(); + } + FOOTER.render(graphics, x, y); + y = guiTop; // Render text input hints - if (searchBox.getValue() - .isBlank()) - graphics.drawString(font, searchBox.getMessage(), searchBox.getX(), searchBox.getY(), 0x88dddddd); if (addressBox.getValue() .isBlank()) graphics.drawString(font, addressBox.getMessage(), addressBox.getX(), addressBox.getY(), 0x88dddddd); + // Render keeper + int entitySizeOffset = 0; + LivingEntity keeper = stockKeeper.get(); + if (keeper != null && keeper.isAlive()) { + ms.pushPose(); + ms.translate(0, 0, 300); + entitySizeOffset = (int) (Math.max(0, keeper.getBoundingBox() + .getXsize() - 1) * 50); + int entityX = x + windowWidth + 10 + entitySizeOffset; + int entityY = y + windowHeight - 70; + AllGuiTextures.STOCK_KEEPER_REQUEST_SAYS.render(graphics, x + 226, + entityY - (int) (keeper.getEyeHeight(Pose.STANDING) * 50) / 2 * 2); + InventoryScreen.renderEntityInInventoryFollowsMouse(graphics, entityX, entityY, 50, entityX - mouseX, + Mth.clamp(entityY - mouseY, -50, 10), keeper); + ms.popPose(); + } + // Render static item icons ms.pushPose(); - ms.translate(itemsX + cols * colWidth + 8, orderY - 4, 0); - ms.scale(1.5f, 1.5f, 1.5f); + ms.translate(x - 30, y + windowHeight - 80, 0); + ms.scale(3.5f, 3.5f, 3.5f); GuiGameElement .of(encodeRequester ? AllBlocks.REDSTONE_REQUESTER.asStack() : AllItems.CARDBOARD_PACKAGE_10x12.asStack()) .render(graphics); ms.popPose(); ms.pushPose(); - ms.translate(itemsX + cols * colWidth + 8, itemsY, 0); - ms.scale(1.5f, 1.5f, 1.5f); + ms.translate(x + windowWidth + 39 + entitySizeOffset, y + windowHeight - 105, 0); + ms.scale(2.25f, 2.25f, 2.25f); GuiGameElement.of(AllBlocks.PACKAGER.asStack()) .render(graphics); ms.translate(0, -9, 15); GuiGameElement.of(AllBlocks.PACKAGER_LINK.asStack()) .render(graphics); ms.popPose(); + ms.pushPose(); + ms.translate(0, 0, 300); graphics.drawString(font, CreateLang.text(blockEntity.activeLinks + "") - .component(), itemsX + cols * colWidth + 33, itemsY + 11, 0x88dddddd); + .component(), x + windowWidth + 76 + entitySizeOffset, y + windowHeight - 105, 0x88dddddd); + ms.popPose(); // Render ordered items for (int index = 0; index < cols; index++) { @@ -241,7 +372,7 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { break; BigItemStack entry = itemsToOrder.get(index); - boolean isStackHovered = index == hoveredSlot; + boolean isStackHovered = index == hoveredSlot.getSecond() && hoveredSlot.getFirst() == -1; ms.pushPose(); ms.translate(itemsX + index * colWidth, orderY, 0); @@ -249,90 +380,134 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { ms.popPose(); } - // Something isnt right - if (displayedItems.isEmpty()) { - Component msg = getTroubleshootingMessage(); - float alpha = Mth.clamp((emptyTicks - 10f) / 5f, 0f, 1f); - if (alpha > 0) - graphics.drawString(font, msg, itemsX + 1, itemsY, new Color(.5f, .5f, .5f, alpha).getRGB()); - } + MutableComponent headerTitle = CreateLang.temporaryText("Stock Keeper") + .component(); + graphics.drawString(font, headerTitle, x + windowWidth / 2 - font.width(headerTitle) / 2, y + 4, 0x505050, + false); + graphics.drawString(font, CreateLang.temporaryText("Send") + .component(), x + windowWidth - 52, y + windowHeight - 32, + isConfirmHovered(mouseX, mouseY) ? 0xffffff : 0x505050, false); // Request just sent if (itemsToOrder.isEmpty() && successTicks > 0) { Component msg = CreateLang.translateDirect("gui.stock_ticker.request_sent"); float alpha = Mth.clamp((successTicks - 10f) / 5f, 0f, 1f); if (alpha > 0) - graphics.drawCenteredString(font, msg, itemsX + cols * colWidth / 2, orderY + 4, - new Color(.75f, .95f, .75f, alpha).getRGB()); + graphics.drawString(font, msg, x + windowWidth / 2 - font.width(msg) / 2, orderY + 4, + new Color(0x7A5A3A).setAlpha(alpha) + .getRGB(), + false); } - hoveredSlot = getHoveredSlot(mouseX, mouseY, false); + int itemWindowX = x + 36; + int itemWindowX2 = itemWindowX + 184; + int itemWindowY = y + 16; + int itemWindowY2 = y + windowHeight - 68; + + UIRenderHelper.swapAndBlitColor(minecraft.getMainRenderTarget(), UIRenderHelper.framebuffer); + startStencil(graphics, itemWindowX - 5, itemWindowY, itemWindowX2 - itemWindowX + 10, + itemWindowY2 - itemWindowY); ms.pushPose(); ms.translate(0, -currentScroll * rowHeight, 0); - // Render item pool - for (int row = startRow; row < startRow + rows + 2; row++) { - float scale = 1; - if (row < currentScroll) - scale = Mth.clamp(1 - (currentScroll - row), 0, 1); - if (row > currentScroll + (rows - 1)) - scale = Mth.clamp((currentScroll + rows) - row, 0, 1); - scale *= scale; - if (scale < 0.5) + // Search bar + AllGuiTextures.STOCK_KEEPER_REQUEST_SEARCH.render(graphics, x, y + 20); + searchBox.render(graphics, mouseX, mouseY, partialTicks); + if (searchBox.getValue() + .isBlank()) + graphics.drawString(font, searchBox.getMessage(), searchBox.getX(), searchBox.getY(), 0x88dddddd); + + // Something isnt right + boolean allEmpty = true; + for (List list : displayedItems) + allEmpty &= list.isEmpty(); + if (allEmpty) { + Component msg = getTroubleshootingMessage(); + float alpha = Mth.clamp((emptyTicks - 10f) / 5f, 0f, 1f); + if (alpha > 0) + graphics.drawString(font, msg, x + windowWidth / 2 - font.width(msg) / 2, itemsY + 20, + new Color(.8f, .8f, .8f, alpha).getRGB()); + } + + // Items + for (int categoryIndex = 0; categoryIndex < displayedItems.size(); categoryIndex++) { + List category = displayedItems.get(categoryIndex); + int categoryY = categories.isEmpty() ? 0 + : categories.get(categoryIndex) + .getSecond(); + if (category.isEmpty()) continue; - for (int col = 0; col < cols; col++) { - int index = row * cols + col; - if (displayedItems.size() <= index) + if (!categories.isEmpty()) + graphics.drawString(font, categories.get(categoryIndex) + .getFirst(), itemsX + 4, itemsY + categoryY + 6, 0xFF_FFFFFF); + + for (int index = 0; index < category.size(); index++) { + int pY = itemsY + categoryY + (categories.isEmpty() ? 4 : rowHeight) + (index / cols) * rowHeight; + float cullY = pY - currentScroll * rowHeight; + + if (cullY < y) + continue; + if (cullY > y + windowHeight - 60) break; - BigItemStack entry = displayedItems.get(index); - boolean isStackHovered = index == hoveredSlot; + boolean isStackHovered = index == hoveredSlot.getSecond() && categoryIndex == hoveredSlot.getFirst(); + BigItemStack entry = category.get(index); ms.pushPose(); - ms.translate(itemsX + col * colWidth, itemsY + row * rowHeight, 0); + ms.translate(itemsX + (index % cols) * colWidth, pY, 0); renderItemEntry(graphics, 1, entry, isStackHovered, false); ms.popPose(); } } ms.popPose(); + endStencil(); // Scroll bar - int totalHeight = rows * rowHeight; - int allRows = Mth.ceil(displayedItems.size() / (1.0 * cols)); - int barSize = Mth.floor(1f * totalHeight * rows / allRows); - if (barSize < totalHeight) { + int windowH = windowHeight - 84; + int totalH = getMaxScroll() * rowHeight + windowH; + int barSize = Mth.floor((float) windowH / totalH * (windowH - 2)); + if (barSize < windowH - 2) { ms.pushPose(); - ms.translate(0, currentScroll * (totalHeight - barSize) / Math.max(1, allRows - rows), 0); - graphics.renderOutline(itemsX + cols * colWidth + 2, itemsY, 1, barSize, color.getRGB()); + ms.translate(0, (currentScroll * rowHeight) / totalH * (windowH - 2), 0); + graphics.renderOutline(itemsX + cols * colWidth + 2, y + 17, 1, barSize, color.getRGB()); ms.popPose(); } // Render tooltip of hovered item if (hoveredSlot != noneHovered) - graphics.renderTooltip(font, displayedItems.get(hoveredSlot).stack, mouseX, mouseY); - hoveredSlot = getHoveredSlot(mouseX, mouseY, true); - if (hoveredSlot != noneHovered) - graphics.renderTooltip(font, itemsToOrder.get(hoveredSlot).stack, mouseX, mouseY); + graphics.renderTooltip(font, + hoveredSlot.getFirst() == -1 ? itemsToOrder.get(hoveredSlot.getSecond()).stack + : displayedItems.get(hoveredSlot.getFirst()) + .get(hoveredSlot.getSecond()).stack, + mouseX, mouseY); + + RenderSystem.enableBlend(); + int zLevel = 200; + graphics.fillGradient(itemWindowX, itemWindowY, itemWindowX2, itemWindowY + 10, zLevel, 0x77000000, 0x00000000); + graphics.fillGradient(itemWindowX, itemWindowY2 - 10, itemWindowX2, itemWindowY2, zLevel, 0x00000000, + 0x77000000); + + UIRenderHelper.swapAndBlitColor(UIRenderHelper.framebuffer, minecraft.getMainRenderTarget()); } private void renderItemEntry(GuiGraphics graphics, float scale, BigItemStack entry, boolean isStackHovered, boolean isRenderingOrders) { - PoseStack ms = graphics.pose(); - ms.pushPose(); - ms.translate(0, 0, 200); int customCount = entry.count; if (!isRenderingOrders) { BigItemStack order = getOrderForItem(entry.stack); if (order != null) customCount -= order.count; + + graphics.renderOutline(0, 0, 18, 18, + isStackHovered ? 0x44_ffffff : customCount != entry.count ? 0x22_ffffff : 0x22_000000); } - drawItemCount(graphics, entry.count, customCount); - ms.translate(0, 0, -200); + PoseStack ms = graphics.pose(); + ms.pushPose(); float scaleFromHover = 1; if (isStackHovered) @@ -346,6 +521,11 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { GuiGameElement.of(entry.stack) .render(graphics); ms.popPose(); + + ms.pushPose(); + ms.translate(0, 0, 200); + drawItemCount(graphics, entry.count, customCount); + ms.popPose(); } private void drawItemCount(GuiGraphics graphics, int count, int customCount) { @@ -354,23 +534,59 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { return; count = customCount; + String text = count >= 1000000 ? (count / 1000000) + "m" : count >= 10000 ? (count / 1000) + "k" : count >= 1000 ? ((count * 10) / 1000) / 10f + "k" - : count >= 100 ? count + "" : count > 0 ? " " + count : " \u2714"; + : count >= 100 ? count + "" : count > 0 ? " " + count : "";// " \u2714"; - int lightOutline = 0x444444; - int darkOutline = 0x222222; - int middleColor = special ? 0xaaffaa : 0xdddddd; + if (text.isBlank()) + return; + +// int lightOutline = 0x444444; +// int darkOutline = 0x222222; +// int middleColor = special ? 0xaaffaa : 0xdddddd; +// if (" \u2714".equals(text)) { +// for (int xi : Iterate.positiveAndNegative) +// graphics.drawString(font, CreateLang.text(text) +// .component(), 11 + xi, 10, xi < 0 ? lightOutline : darkOutline, false); +// for (int yi : Iterate.positiveAndNegative) +// graphics.drawString(font, CreateLang.text(text) +// .component(), 11, 10 + yi, yi < 0 ? lightOutline : darkOutline, false); +// graphics.drawString(font, CreateLang.text(text) +// .component(), 11, 10, middleColor, false); +// return; +// } + + int x = -text.length() * 2; + for (char c : text.toCharArray()) { + int index = c - '0'; + int xOffset = index * 6; + int spriteWidth = NUMBERS.getWidth(); + + switch (c) { + case ' ': + x += 4; + continue; + case '.': + spriteWidth = 3; + xOffset = 60; + break; + case 'k': + xOffset = 64; + break; + case 'm': + spriteWidth = 7; + xOffset = 70; + break; + } + + RenderSystem.enableBlend(); + graphics.blit(NUMBERS.location, 14 + x, 10, 0, NUMBERS.getStartX() + xOffset, NUMBERS.getStartY(), + spriteWidth, NUMBERS.getHeight(), 256, 256); + x += spriteWidth - 1; + } - for (int xi : Iterate.positiveAndNegative) - graphics.drawString(font, CreateLang.text(text) - .component(), 11 + xi, 10, xi < 0 ? lightOutline : darkOutline, false); - for (int yi : Iterate.positiveAndNegative) - graphics.drawString(font, CreateLang.text(text) - .component(), 11, 10 + yi, yi < 0 ? lightOutline : darkOutline, false); - graphics.drawString(font, CreateLang.text(text) - .component(), 11, 10, middleColor, false); } @Nullable @@ -383,62 +599,64 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { private void revalidateOrders() { Set invalid = new HashSet<>(itemsToOrder); - if (currentItemSource == null) { + InventorySummary summary = blockEntity.lastClientsideStockSnapshotAsSummary; + if (currentItemSource == null || summary == null) { itemsToOrder.removeAll(invalid); return; } - for (BigItemStack entry : itemsToOrder) - for (BigItemStack available : currentItemSource) - if (ItemHandlerHelper.canItemStacksStack(entry.stack, available.stack)) { - entry.count = Math.min(available.count, entry.count); - invalid.remove(entry); - break; - } + for (BigItemStack entry : itemsToOrder) { + entry.count = Math.min(summary.getCountOf(entry.stack), entry.count); + if (entry.count > 0) + invalid.remove(entry); + } itemsToOrder.removeAll(invalid); } - private int getHoveredSlot(int x, int y, boolean order) { + private Couple getHoveredSlot(int x, int y) { if (x < itemsX || x >= itemsX + cols * colWidth) return noneHovered; - if (!order && (y < itemsY || y >= itemsY + rows * rowHeight)) + + // Ordered item is hovered + if (y >= orderY && y < orderY + rowHeight) { + int col = (x - itemsX) / colWidth; + if (itemsToOrder.size() <= col || col < 0) + return noneHovered; + return Couple.create(-1, col); + } + + if (y < guiTop + 16 || y > guiTop + windowHeight - 69) return noneHovered; - if (order && (y < orderY || y >= orderY + rowHeight)) - return noneHovered; - if (!order && !itemScroll.settled()) + if (!itemScroll.settled()) return noneHovered; - int row = (y - itemsY) / rowHeight + (int) itemScroll.getChaseTarget(); - int col = (x - itemsX) / colWidth; - int slot = row * cols + col; + int localY = y - itemsY; - if (order && itemsToOrder.size() <= col) - return noneHovered; - if (!order && displayedItems.size() <= slot) - return noneHovered; - return order ? col : slot; - } + for (int categoryIndex = 0; categoryIndex < displayedItems.size(); categoryIndex++) { + Pair entry = categories.isEmpty() ? Pair.of("", 0) : categories.get(categoryIndex); - private void drawConfirmBox(GuiGraphics graphics, Color defaultColor, int mouseX, int mouseY) { - int confirmX = addressBox.getX() + addressBox.getWidth() + 10; - int confirmY = addressBox.getY() - 4; - int confirmW = (cols * colWidth) - addressBox.getWidth() - 8; - int confirmH = addressBox.getHeight() + 7; + int row = + Mth.floor((localY - (categories.isEmpty() ? 4 : rowHeight) - entry.getSecond()) / (float) rowHeight) + + (int) itemScroll.getChaseTarget(); - boolean hovered = isConfirmHovered(mouseX, mouseY); - boolean inactive = itemsToOrder.isEmpty(); - int color = inactive ? defaultColor.darker() - .getRGB() : hovered ? 0xeeffffff : 0x99ffffff; - graphics.renderOutline(confirmX, confirmY, confirmW, confirmH, color); - graphics.drawCenteredString(font, - CreateLang.translateDirect( - encodeRequester ? "gui.stock_ticker.program_requester" : "gui.stock_ticker.confirm_order"), - confirmX + (confirmW / 2), confirmY + 4, color); + int col = (x - itemsX) / colWidth; + int slot = row * cols + col; + + if (slot < 0) + return noneHovered; + if (displayedItems.get(categoryIndex) + .size() <= slot) + continue; + + return Couple.create(categoryIndex, slot); + } + + return noneHovered; } private boolean isConfirmHovered(int mouseX, int mouseY) { - int confirmX = addressBox.getX() + addressBox.getWidth() + 10; + int confirmX = addressBox.getX() + addressBox.getWidth() + 25; int confirmY = addressBox.getY() - 4; - int confirmW = (cols * colWidth) - addressBox.getWidth() - 8; + int confirmW = 40; int confirmH = addressBox.getHeight() + 7; if (mouseX < confirmX || mouseX >= confirmX + confirmW) @@ -464,12 +682,18 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { @Override public boolean mouseClicked(double pMouseX, double pMouseY, int pButton) { - boolean orderClicked = false; - int hoveredSlot = getHoveredSlot((int) pMouseX, (int) pMouseY, false); - if (hoveredSlot == noneHovered) { - hoveredSlot = getHoveredSlot((int) pMouseX, (int) pMouseY, true); - orderClicked = true; + if (addressBox.isFocused()) { + if (addressBox.isHovered()) + return addressBox.mouseClicked(pMouseX, pMouseY, pButton); + addressBox.setFocused(false); } + if (searchBox.isFocused()) { + if (searchBox.isHovered()) + return searchBox.mouseClicked(pMouseX, pMouseY, pButton); + searchBox.setFocused(false); + } + + Couple hoveredSlot = getHoveredSlot((int) pMouseX, (int) pMouseY); boolean lmb = pButton == 0; boolean rmb = pButton == 1; @@ -489,16 +713,21 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { if (hoveredSlot == noneHovered || !lmb && !rmb) return super.mouseClicked(pMouseX, pMouseY, pButton); - BigItemStack entry = orderClicked ? itemsToOrder.get(hoveredSlot) : displayedItems.get(hoveredSlot); + BigItemStack entry = hoveredSlot.getFirst() == -1 ? itemsToOrder.get(hoveredSlot.getSecond()) + : displayedItems.get(hoveredSlot.getFirst()) + .get(hoveredSlot.getSecond()); + + boolean orderClicked = hoveredSlot.getFirst() == -1; ItemStack itemStack = entry.stack; BigItemStack existingOrder = getOrderForItem(itemStack); + if (existingOrder == null) { if (itemsToOrder.size() >= cols || rmb) return true; itemsToOrder.add(existingOrder = new BigItemStack(itemStack.copyWithCount(1), 0)); } - int transfer = hasShiftDown() ? itemStack.getMaxStackSize() : 1; + int transfer = hasShiftDown() ? itemStack.getMaxStackSize() : hasControlDown() ? 10 : 1; int current = existingOrder.count; if (rmb || orderClicked) { @@ -519,10 +748,10 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { @Override public boolean mouseScrolled(double mouseX, double mouseY, double delta) { - int hoveredOrderSlot = getHoveredSlot((int) mouseX, (int) mouseY, true); - if (hoveredOrderSlot == noneHovered) { - int maxScroll = Math.max(0, Mth.ceil(displayedItems.size() / (1.0 * cols)) - rows); - int direction = (int) Math.signum(-delta); + Couple hoveredOrderSlot = getHoveredSlot((int) mouseX, (int) mouseY); + if (hoveredOrderSlot == noneHovered || hoveredOrderSlot.getFirst() != -1) { + int maxScroll = getMaxScroll(); + int direction = (int) (Math.ceil(Math.abs(delta)) * -Math.signum(delta)); float newTarget = Mth.clamp(itemScroll.getChaseTarget() + direction, 0, maxScroll); itemScroll.chase(newTarget, 0.5, Chaser.EXP); } @@ -530,13 +759,26 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { } private void clampScrollBar() { - int maxScroll = Math.max(0, Mth.ceil(displayedItems.size() / (1.0 * cols)) - rows); + int maxScroll = getMaxScroll(); float prevTarget = itemScroll.getChaseTarget(); float newTarget = Mth.clamp(prevTarget, 0, maxScroll); if (prevTarget != newTarget) itemScroll.startWithValue(newTarget); } + private int getMaxScroll() { + int visibleHeight = windowHeight - 84; + int totalRows = 0; + for (List list : displayedItems) { + if (list.isEmpty()) + continue; + totalRows++; + totalRows += Math.ceil(list.size() / (float) cols); + } + int maxScroll = (int) Math.max(0, (totalRows * rowHeight - visibleHeight + 50) / rowHeight); + return maxScroll; + } + @Override public boolean charTyped(char pCodePoint, int pModifiers) { if (addressBox.isFocused() && addressBox.charTyped(pCodePoint, pModifiers)) @@ -551,6 +793,11 @@ public class StockTickerRequestScreen extends AbstractSimiScreen { @Override public boolean keyPressed(int pKeyCode, int pScanCode, int pModifiers) { + if (pKeyCode == GLFW.GLFW_KEY_ENTER && searchBox.isFocused()) { + searchBox.setFocused(false); + return true; + } + if (pKeyCode == GLFW.GLFW_KEY_ENTER && hasShiftDown()) { sendIt(); return true; diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleScreen.java b/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleScreen.java index d4ebe709eb..05f3d14a3c 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleScreen.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleScreen.java @@ -11,12 +11,8 @@ import java.util.function.Consumer; import javax.annotation.Nullable; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL30; - import com.google.common.collect.ImmutableList; import com.mojang.blaze3d.platform.InputConstants; -import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllPackets; import com.simibubi.create.Create; @@ -32,6 +28,7 @@ import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.ModularGuiLine; import com.simibubi.create.foundation.gui.ModularGuiLineBuilder; +import com.simibubi.create.foundation.gui.ScreenWithStencils; import com.simibubi.create.foundation.gui.menu.AbstractSimiContainerScreen; import com.simibubi.create.foundation.gui.menu.GhostItemSubmitPacket; import com.simibubi.create.foundation.gui.widget.IconButton; @@ -50,7 +47,6 @@ import net.createmod.catnip.utility.animation.LerpedFloat; import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; import net.createmod.catnip.utility.lang.Components; import net.minecraft.ChatFormatting; -import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.EditBox; @@ -65,7 +61,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.phys.Vec3; -public class ScheduleScreen extends AbstractSimiContainerScreen { +public class ScheduleScreen extends AbstractSimiContainerScreen implements ScreenWithStencils { private static final int CARD_HEADER = 22; private static final int CARD_WIDTH = 195; @@ -182,7 +178,8 @@ public class ScheduleScreen extends AbstractSimiContainerScreen { for (int i = 0; i < field.slotsTargeted(); i++) { ItemStack item = field.getItem(i); menu.ghostInventory.setStackInSlot(i, item); - AllPackets.getChannel().sendToServer(new GhostItemSubmitPacket(item, i)); + AllPackets.getChannel() + .sendToServer(new GhostItemSubmitPacket(item, i)); } if (field instanceof ScheduleInstruction instruction) { @@ -267,7 +264,8 @@ public class ScheduleScreen extends AbstractSimiContainerScreen { IScheduleInput editing = editingCondition == null ? editingDestination : editingCondition; for (int i = 0; i < editing.slotsTargeted(); i++) { editing.setItem(i, menu.ghostInventory.getStackInSlot(i)); - AllPackets.getChannel().sendToServer(new GhostItemSubmitPacket(ItemStack.EMPTY, i)); + AllPackets.getChannel() + .sendToServer(new GhostItemSubmitPacket(ItemStack.EMPTY, i)); } editorSubWidgets.saveValues(editing.getData()); @@ -379,7 +377,8 @@ public class ScheduleScreen extends AbstractSimiContainerScreen { PoseStack matrixStack = graphics.pose(); UIRenderHelper.swapAndBlitColor(minecraft.getMainRenderTarget(), UIRenderHelper.framebuffer); - UIRenderHelper.drawStretched(graphics, leftPos + 33, topPos + 16, 3, 173, 200, AllGuiTextures.SCHEDULE_STRIP_DARK); + UIRenderHelper.drawStretched(graphics, leftPos + 33, topPos + 16, 3, 173, 200, + AllGuiTextures.SCHEDULE_STRIP_DARK); int yOffset = 25; List entries = schedule.entries; @@ -401,8 +400,8 @@ public class ScheduleScreen extends AbstractSimiContainerScreen { matrixStack.pushPose(); matrixStack.translate(0, scrollOffset, 0); if (i == 0 || entries.size() == 0) - UIRenderHelper.drawStretched(graphics, leftPos + 33, topPos + 16, 3, 10, - -100, AllGuiTextures.SCHEDULE_STRIP_LIGHT); + UIRenderHelper.drawStretched(graphics, leftPos + 33, topPos + 16, 3, 10, -100, + AllGuiTextures.SCHEDULE_STRIP_LIGHT); if (i == entries.size()) { if (i > 0) @@ -511,8 +510,7 @@ public class ScheduleScreen extends AbstractSimiContainerScreen { if (i < schedule.entries.size() - 1) AllGuiTextures.SCHEDULE_CARD_MOVE_DOWN.render(graphics, cardWidth, cardHeader); - UIRenderHelper.drawStretched(graphics, 8, 0, 3, cardHeight + 10, zLevel, - AllGuiTextures.SCHEDULE_STRIP_LIGHT); + UIRenderHelper.drawStretched(graphics, 8, 0, 3, cardHeight + 10, zLevel, AllGuiTextures.SCHEDULE_STRIP_LIGHT); (supportsConditions ? AllGuiTextures.SCHEDULE_STRIP_TRAVEL : AllGuiTextures.SCHEDULE_STRIP_ACTION) .render(graphics, 4, 6); @@ -528,8 +526,8 @@ public class ScheduleScreen extends AbstractSimiContainerScreen { return cardHeight; } - public void renderScheduleConditions(GuiGraphics graphics, ScheduleEntry entry, int yOffset, int mouseX, - int mouseY, float partialTicks, int cardHeight, int entryIndex) { + public void renderScheduleConditions(GuiGraphics graphics, ScheduleEntry entry, int yOffset, int mouseX, int mouseY, + float partialTicks, int cardHeight, int entryIndex) { int cardWidth = CARD_WIDTH; int cardHeader = CARD_HEADER; @@ -546,8 +544,8 @@ public class ScheduleScreen extends AbstractSimiContainerScreen { int maxWidth = getConditionColumnWidth(list); for (int i = 0; i < list.size(); i++) { ScheduleWaitCondition scheduleWaitCondition = list.get(i); - Math.max(maxWidth, renderInput(graphics, scheduleWaitCondition.getSummary(), xOffset, 29 + i * 18, - i != 0, maxWidth)); + Math.max(maxWidth, + renderInput(graphics, scheduleWaitCondition.getSummary(), xOffset, 29 + i * 18, i != 0, maxWidth)); scheduleWaitCondition.renderSpecialIcon(graphics, xOffset + 4, 29 + i * 18); } @@ -688,8 +686,8 @@ public class ScheduleScreen extends AbstractSimiContainerScreen { if (x > 180 && x <= 192) { if (y > 0 && y <= 14) { - renderActionTooltip(graphics, ImmutableList.of(CreateLang.translateDirect("gui.schedule.remove_entry")), - mx, my); + renderActionTooltip(graphics, + ImmutableList.of(CreateLang.translateDirect("gui.schedule.remove_entry")), mx, my); if (click == 0) { entries.remove(entry); init(); @@ -697,8 +695,8 @@ public class ScheduleScreen extends AbstractSimiContainerScreen { return true; } if (y > cardHeight - 14) { - renderActionTooltip(graphics, ImmutableList.of(CreateLang.translateDirect("gui.schedule.duplicate")), mx, - my); + renderActionTooltip(graphics, + ImmutableList.of(CreateLang.translateDirect("gui.schedule.duplicate")), mx, my); if (click == 0) { entries.add(entries.indexOf(entry), entry.clone()); init(); @@ -709,8 +707,8 @@ public class ScheduleScreen extends AbstractSimiContainerScreen { if (x > 194) { if (y > 7 && y <= 20 && i > 0) { - renderActionTooltip(graphics, ImmutableList.of(CreateLang.translateDirect("gui.schedule.move_up")), mx, - my); + renderActionTooltip(graphics, ImmutableList.of(CreateLang.translateDirect("gui.schedule.move_up")), + mx, my); if (click == 0) { entries.remove(entry); entries.add(i - 1, entry); @@ -719,8 +717,8 @@ public class ScheduleScreen extends AbstractSimiContainerScreen { return true; } if (y > 20 && y <= 33 && i < entries.size() - 1) { - renderActionTooltip(graphics, ImmutableList.of(CreateLang.translateDirect("gui.schedule.move_down")), mx, - my); + renderActionTooltip(graphics, + ImmutableList.of(CreateLang.translateDirect("gui.schedule.move_down")), mx, my); if (click == 0) { entries.remove(entry); entries.add(i + 1, entry); @@ -797,7 +795,8 @@ public class ScheduleScreen extends AbstractSimiContainerScreen { } if (y > 18 * conditions.size() && y <= 18 * conditions.size() + 10 && x >= w / 2 - 5 && x < w / 2 + 5) { - renderActionTooltip(graphics, ImmutableList.of(CreateLang.translateDirect("gui.schedule.add_condition")), mx, my); + renderActionTooltip(graphics, + ImmutableList.of(CreateLang.translateDirect("gui.schedule.add_condition")), mx, my); if (click == 0) startEditing(new ScheduledDelay(), confirmed -> { if (confirmed) @@ -812,8 +811,8 @@ public class ScheduleScreen extends AbstractSimiContainerScreen { if (x < 0 || x > 15 || y > 20) return false; - renderActionTooltip(graphics, ImmutableList.of(CreateLang.translateDirect("gui.schedule.alternative_condition")), - mx, my); + renderActionTooltip(graphics, + ImmutableList.of(CreateLang.translateDirect("gui.schedule.alternative_condition")), mx, my); if (click == 0) startEditing(new ScheduledDelay(), confirmed -> { if (!confirmed) @@ -857,33 +856,6 @@ public class ScheduleScreen extends AbstractSimiContainerScreen { return Math.max((text == null ? 0 : font.width(text)) + (hasItem ? 20 : 0) + 16, minSize); } - protected void startStencil(GuiGraphics graphics, float x, float y, float w, float h) { - RenderSystem.clear(GL30.GL_STENCIL_BUFFER_BIT | GL30.GL_DEPTH_BUFFER_BIT, Minecraft.ON_OSX); - - GL11.glDisable(GL11.GL_STENCIL_TEST); - RenderSystem.stencilMask(~0); - RenderSystem.clear(GL11.GL_STENCIL_BUFFER_BIT, Minecraft.ON_OSX); - GL11.glEnable(GL11.GL_STENCIL_TEST); - RenderSystem.stencilOp(GL11.GL_REPLACE, GL11.GL_KEEP, GL11.GL_KEEP); - RenderSystem.stencilMask(0xFF); - RenderSystem.stencilFunc(GL11.GL_NEVER, 1, 0xFF); - - PoseStack matrixStack = graphics.pose(); - matrixStack.pushPose(); - matrixStack.translate(x, y, 0); - matrixStack.scale(w, h, 1); - graphics.fillGradient(0, 0, 1, 1, -100, 0xff000000, 0xff000000); - matrixStack.popPose(); - - GL11.glEnable(GL11.GL_STENCIL_TEST); - RenderSystem.stencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_KEEP); - RenderSystem.stencilFunc(GL11.GL_EQUAL, 1, 0xFF); - } - - protected void endStencil() { - GL11.glDisable(GL11.GL_STENCIL_TEST); - } - @Override public boolean mouseClicked(double pMouseX, double pMouseY, int pButton) { if (destinationSuggestions != null @@ -1001,8 +973,8 @@ public class ScheduleScreen extends AbstractSimiContainerScreen { super.renderForeground(graphics, mouseX, mouseY, partialTicks); GuiGameElement.of(menu.contentHolder).at(leftPos + AllGuiTextures.SCHEDULE.getWidth(), topPos + AllGuiTextures.SCHEDULE.getHeight() - 56, - -200) + .GuiRenderBuilder>at(leftPos + AllGuiTextures.SCHEDULE.getWidth(), + topPos + AllGuiTextures.SCHEDULE.getHeight() - 56, -200) .scale(3) .render(graphics); action(graphics, mouseX, mouseY, -1); @@ -1078,7 +1050,8 @@ public class ScheduleScreen extends AbstractSimiContainerScreen { @Override public void removed() { super.removed(); - AllPackets.getChannel().sendToServer(new ScheduleEditPacket(schedule)); + AllPackets.getChannel() + .sendToServer(new ScheduleEditPacket(schedule)); } @Override diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java index c30bce8dc2..a2a92c1e8b 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java @@ -161,6 +161,13 @@ public enum AllGuiTextures implements ScreenElement, TextureSheetSegment { FACTORY_PANEL_ARROW("restocker_and_requester", 27, 108, 22, 16), FACTORY_PANEL_ARROW_FILLED("restocker_and_requester", 50, 108, 22, 16), + STOCK_KEEPER_REQUEST_HEADER("stock_keeper", 256, 22), + STOCK_KEEPER_REQUEST_BODY("stock_keeper", 0, 23, 256, 20), + STOCK_KEEPER_REQUEST_FOOTER("stock_keeper", 0, 44, 256, 74), + STOCK_KEEPER_REQUEST_SEARCH("stock_keeper", 0, 137, 256, 15), + STOCK_KEEPER_REQUEST_SAYS("stock_keeper", 4, 163, 8, 16), + NUMBERS("widgets", 100, 20, 5, 8), + STOCK_KEEPER_CATEGORY("stock_keeper_categories", 210, 190), STOCK_KEEPER_CATEGORY_HEADER("stock_keeper_categories", 202, 15), STOCK_KEEPER_CATEGORY_EDIT("stock_keeper_categories", 0, 216, 202, 38), @@ -236,7 +243,7 @@ public enum AllGuiTextures implements ScreenElement, TextureSheetSegment { COMPUTER("computer", 200, 102); ; - + public static final int FONT_COLOR = 0x575F7A; public final ResourceLocation location; diff --git a/src/main/java/com/simibubi/create/foundation/gui/ScreenWithStencils.java b/src/main/java/com/simibubi/create/foundation/gui/ScreenWithStencils.java new file mode 100644 index 0000000000..e104992dbd --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/gui/ScreenWithStencils.java @@ -0,0 +1,41 @@ +package com.simibubi.create.foundation.gui; + +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL30; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; + +public interface ScreenWithStencils { + + default void startStencil(GuiGraphics graphics, float x, float y, float w, float h) { + RenderSystem.clear(GL30.GL_STENCIL_BUFFER_BIT | GL30.GL_DEPTH_BUFFER_BIT, Minecraft.ON_OSX); + + GL11.glDisable(GL11.GL_STENCIL_TEST); + RenderSystem.stencilMask(~0); + RenderSystem.clear(GL11.GL_STENCIL_BUFFER_BIT, Minecraft.ON_OSX); + GL11.glEnable(GL11.GL_STENCIL_TEST); + RenderSystem.stencilOp(GL11.GL_REPLACE, GL11.GL_KEEP, GL11.GL_KEEP); + RenderSystem.stencilMask(0xFF); + RenderSystem.stencilFunc(GL11.GL_NEVER, 1, 0xFF); + + PoseStack matrixStack = graphics.pose(); + matrixStack.pushPose(); + matrixStack.translate(x, y, 0); + matrixStack.scale(w, h, 1); + graphics.fillGradient(0, 0, 1, 1, -100, 0xff000000, 0xff000000); + matrixStack.popPose(); + + GL11.glEnable(GL11.GL_STENCIL_TEST); + RenderSystem.stencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_KEEP); + RenderSystem.stencilFunc(GL11.GL_EQUAL, 1, 0xFF); + } + + default void endStencil() { + GL11.glDisable(GL11.GL_STENCIL_TEST); + } + +} diff --git a/src/main/resources/assets/create/textures/gui/stock_keeper.png b/src/main/resources/assets/create/textures/gui/stock_keeper.png new file mode 100644 index 0000000000000000000000000000000000000000..6c8e0ef41245b7b6cd821444f4ae5f5db698af05 GIT binary patch literal 1482 zcmcIkYfw{H5I#2vfq=mnXvAP8VlWB@7~Zjp7ZgZpgvdh(TD?FNEm#m8jfmt5sO^MD z&^iKwWC{un^0L%0;v-RBS_}$wghnKWDn*5WwFD(0z5I5j{naybX7}6uc6QGuaiV>3mfZc;BDT>@n)+^56X}6uc0w5QsnlJ2OeBXyI=O5 zMx!wp3?3n26B83UovyyVo=T;G#DtdYs7xbMba8ZJm&RYdh8BkpJX#(RLdxgSZsAV%8n`F|hjT+isq59GB`z6!A zzJFiHWp!k2uN)e7=1uPNZiBx^%Y?UZw4K42`Z2MP`2xU5V{H2&Qe3)EPCK17#&P;|W`eWaE0mFuyx>hp=&l~B;) zoIPF)uJYL;E9w**pF_y%MH!HIIgc)ZI*ehqVw-M}Bn`T1-t@CF3SME56jY*FGX^`^ z(|M|Vr*bPWEinyhjN z;Ab5DL`q+V1r0ODm5U%PO%~K02-uQ6GcQX%QFFx8q(sX2Wc4 zk+3pOnVCf9+kEw85V4OqLuq=!_xrmaDL0MU#7T_9gN>?0d9!NG7k%AQ~gX3^)3k&tAcLN=?N6Q2h?7t lmwhJ0zpC{AB_nTYB(7E;*6KzxTd{u)@Iu13Gz23#{{U~Se@FlT literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/gui/widgets.png b/src/main/resources/assets/create/textures/gui/widgets.png index a090492b868d3a9de50119385481f9c99a431491..c66697998369d77153cee7a960943040cce882d4 100644 GIT binary patch literal 12034 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 TH^QFwtpjAG6eVlKjROA*P8Efq literal 11512 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 Date: Mon, 28 Oct 2024 09:42:39 +0100 Subject: [PATCH 092/515] Revert threshold switch compat - Stockticker/switch setups were too likely to leak packages when only partially chunk loaded / on login --- .../StockKeeperCategoryScreen.java | 2 +- .../stockTicker/StockTickerRequestScreen.java | 7 ++-- .../ThresholdSwitchBlockEntity.java | 32 ++++++++----------- .../CapManipulationBehaviourBase.java | 12 ++++++- .../ponder/AllCreatePonderTags.java | 1 - 5 files changed, 30 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryScreen.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryScreen.java index bcab306bd0..325ac565b2 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryScreen.java @@ -90,7 +90,7 @@ public class StockKeeperCategoryScreen extends AbstractSimiContainerScreen new BlockFace(p, DirectedDirectionalBlock.getTargetDirection(s)); - behaviours.add(observedInventory = new InvManipulationBehaviour(this, towardBlockFacing).bypassSidedness()); + behaviours.add(observedInventory = new InvManipulationBehaviour(this, towardBlockFacing).bypassSidedness() + .withFilter(this::isSuitableInventory)); behaviours.add(observedTank = new TankManipulationBehaviour(this, towardBlockFacing).bypassSidedness()); } diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/inventory/CapManipulationBehaviourBase.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/inventory/CapManipulationBehaviourBase.java index 6ea0dd93b7..1c65add303 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/inventory/CapManipulationBehaviourBase.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/inventory/CapManipulationBehaviourBase.java @@ -2,6 +2,8 @@ package com.simibubi.create.foundation.blockEntity.behaviour.inventory; import javax.annotation.Nullable; +import com.google.common.base.Predicate; +import com.google.common.base.Predicates; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import com.simibubi.create.foundation.blockEntity.behaviour.filtering.FilteringBehaviour; @@ -22,6 +24,7 @@ public abstract class CapManipulationBehaviourBase targetCapability; + protected Predicate filter; protected boolean simulateNext; protected boolean bypassSided; private boolean findNewNextTick; @@ -33,6 +36,7 @@ public abstract class CapManipulationBehaviourBase capability(); @@ -65,6 +69,12 @@ public abstract class CapManipulationBehaviourBase filter) { + this.filter = filter; + return (S) this; + } public boolean hasInventory() { return targetCapability.isPresent(); @@ -127,7 +137,7 @@ public abstract class CapManipulationBehaviourBase capability = capability(); targetCapability = diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderTags.java b/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderTags.java index 455ddbf1b7..1d3ea02916 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderTags.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderTags.java @@ -462,7 +462,6 @@ public class AllCreatePonderTags { HELPER.addToTag(THRESHOLD_SWITCH_TARGETS) .add(AllBlocks.ROPE_PULLEY) - .add(AllBlocks.STOCK_TICKER) .add(AllBlocks.ITEM_VAULT) .add(AllBlocks.FLUID_TANK); From 92d97e35d2eaa10f489bc6e3e9d5faf3be26ff9c Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Mon, 28 Oct 2024 18:13:35 +0100 Subject: [PATCH 093/515] Stocked to be here - Added restocker mode for factory panels when placed on packager - Factory panel connections are more picky about correct placement - Wrench can cycle the arrow pathing mode - Fully outlined text on filter slots for better readability - Fixed amounts on funnels no longer showing - Fixed factory panels overproducing when using stack units --- .../com/simibubi/create/AllPartialModels.java | 2 + .../factoryBoard/FactoryPanelBehaviour.java | 150 ++++++++++-- .../factoryBoard/FactoryPanelBlock.java | 6 +- .../factoryBoard/FactoryPanelBlockEntity.java | 39 ++- .../FactoryPanelConfigurationPacket.java | 2 +- .../factoryBoard/FactoryPanelConnection.java | 84 +++++-- .../FactoryPanelConnectionHandler.java | 69 ++++-- .../FactoryPanelEffectPacket.java | 4 +- .../factoryBoard/FactoryPanelModel.java | 23 +- .../factoryBoard/FactoryPanelRenderer.java | 3 +- .../factoryBoard/FactoryPanelScreen.java | 229 ++++++++++++------ .../packagePort/PackagePortScreen.java | 14 +- .../logistics/packager/PackagerBlock.java | 20 +- .../packager/PackagerBlockEntity.java | 68 ++++-- .../packagerLink/GlobalLogisticsManager.java | 6 +- .../LogisticallyLinkedBehaviour.java | 14 +- .../packagerLink/LogisticsNetwork.java | 12 +- .../packagerLink/PackagerLinkBlockEntity.java | 5 +- .../packagerLink/RequestPromiseQueue.java | 21 +- .../RedstoneRequesterScreen.java | 14 +- .../stockTicker/StockTickerRequestScreen.java | 2 +- .../blockEntity/behaviour/ValueBox.java | 28 ++- .../filtering/FilteringBehaviour.java | 2 +- .../create/foundation/gui/AllGuiTextures.java | 2 + .../foundation/gui/widget/IconButton.java | 12 +- .../block/factory_panel/panel_restocker.json | 7 + .../panel_restocker_with_bulb.json | 7 + .../block/factory_panel_packager_mode.png | Bin 0 -> 468 bytes .../assets/create/textures/gui/widgets.png | Bin 12034 -> 12014 bytes 29 files changed, 623 insertions(+), 222 deletions(-) create mode 100644 src/main/resources/assets/create/models/block/factory_panel/panel_restocker.json create mode 100644 src/main/resources/assets/create/models/block/factory_panel/panel_restocker_with_bulb.json create mode 100644 src/main/resources/assets/create/textures/block/factory_panel_packager_mode.png diff --git a/src/main/java/com/simibubi/create/AllPartialModels.java b/src/main/java/com/simibubi/create/AllPartialModels.java index 006fef4b71..122abc1801 100644 --- a/src/main/java/com/simibubi/create/AllPartialModels.java +++ b/src/main/java/com/simibubi/create/AllPartialModels.java @@ -182,6 +182,8 @@ public class AllPartialModels { FACTORY_PANEL = block("factory_panel/panel"), FACTORY_PANEL_WITH_BULB = block("factory_panel/panel_with_bulb"), + FACTORY_PANEL_RESTOCKER = block("factory_panel/panel_restocker"), + FACTORY_PANEL_RESTOCKER_WITH_BULB = block("factory_panel/panel_restocker_with_bulb"), FACTORY_PANEL_LIGHT = block("factory_panel/bulb_light"), DISPLAY_CLOTH = entity("display_cloth"), diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java index 14a14586b7..d001d84791 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java @@ -14,12 +14,14 @@ import org.joml.Math; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllPackets; +import com.simibubi.create.AllTags.AllItemTags; import com.simibubi.create.Create; import com.simibubi.create.content.logistics.BigItemStack; import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBlock.PanelSlot; import com.simibubi.create.content.logistics.filter.FilterItem; import com.simibubi.create.content.logistics.filter.FilterItemStack; import com.simibubi.create.content.logistics.packager.InventorySummary; +import com.simibubi.create.content.logistics.packager.PackagerBlockEntity; import com.simibubi.create.content.logistics.packagerLink.RequestPromise; import com.simibubi.create.content.logistics.packagerLink.RequestPromiseQueue; import com.simibubi.create.content.logistics.stockTicker.PackageOrder; @@ -72,6 +74,9 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { public int promiseClearingInterval; public boolean forceClearPromises; + public RequestPromiseQueue restockerPromises; + private boolean promisePrimedForMarkDirty; + private boolean active; private int lastReportedUnloadedLinks; private int lastReportedLevelInStorage; @@ -95,6 +100,8 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { this.bulb = LerpedFloat.linear() .startWithValue(0) .chase(0, 0.45, Chaser.EXP); + this.restockerPromises = new RequestPromiseQueue(be::setChanged); + this.promisePrimedForMarkDirty = true; } @Nullable @@ -117,6 +124,12 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { bulb.tickChaser(); return; } + + if (!promisePrimedForMarkDirty) { + restockerPromises.setOnChanged(blockEntity::setChanged); + promisePrimedForMarkDirty = true; + } + tickStorageMonitor(); tickRequests(); } @@ -146,9 +159,8 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { } private void tickRequests() { - if (targetedBy.isEmpty()) - return; - if (!(blockEntity instanceof FactoryPanelBlockEntity fpbe)) + FactoryPanelBlockEntity panelBE = panelBE(); + if (targetedBy.isEmpty() && !panelBE.restocker) return; if (satisfied || promisedSatisfied || waitingForNetwork) return; @@ -160,37 +172,72 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { timer = REQUEST_INTERVAL; - InventorySummary summary = fpbe.getAccurateSummary(); + if (panelBE.restocker) { + tryRestock(); + return; + } + + InventorySummary summary = panelBE.getAccurateSummary(); boolean failed = false; List toRequest = new ArrayList<>(); for (FactoryPanelConnection connection : targetedBy.values()) { - FactoryPanelBehaviour source = at(getWorld(), connection.from()); + FactoryPanelBehaviour source = at(getWorld(), connection.from); if (source == null) return; ItemStack item = source.getFilter(); - int amount = connection.amount(); + int amount = connection.amount; if (amount == 0 || item.isEmpty() || summary.getCountOf(item) < amount) { - sendEffect(connection.from(), false); + sendEffect(connection.from, false); failed = true; continue; } toRequest.add(new BigItemStack(item, amount)); - sendEffect(connection.from(), true); + sendEffect(connection.from, true); } if (failed) return; PackageOrder order = new PackageOrder(toRequest); - fpbe.broadcastPackageRequest(order, null, recipeAddress); + panelBE.broadcastPackageRequest(order, null, recipeAddress); - RequestPromiseQueue promises = Create.LOGISTICS.getQueuedPromises(fpbe.behaviour.freqId); + RequestPromiseQueue promises = Create.LOGISTICS.getQueuedPromises(panelBE.behaviour.freqId); if (promises != null) promises.add(new RequestPromise(new BigItemStack(getFilter(), recipeOutput))); } + private void tryRestock() { + ItemStack item = getFilter(); + if (item.isEmpty()) + return; + + FactoryPanelBlockEntity panelBE = panelBE(); + PackagerBlockEntity packager = panelBE.getRestockedPackager(); + if (packager == null) + return; + + int availableOnNetwork = panelBE.behaviour.getStockOf(item, packager.targetInventory.getInventory()); + if (availableOnNetwork == 0) { + sendEffect(getPanelPosition(), false); + return; + } + + int inStorage = getLevelInStorage(); + int promised = getPromised(); + int maxStackSize = item.getMaxStackSize(); + int demand = getAmount() * (upTo ? 1 : maxStackSize); + int amountToOrder = Math.clamp(demand - promised - inStorage, 0, maxStackSize * 9); + + BigItemStack orderedItem = new BigItemStack(item, Math.min(amountToOrder, availableOnNetwork)); + PackageOrder order = new PackageOrder(List.of(orderedItem)); + + panelBE.broadcastPackageRequest(order, packager.targetInventory.getInventory(), recipeAddress); + restockerPromises.add(new RequestPromise(orderedItem)); + sendEffect(getPanelPosition(), true); + } + private void sendEffect(FactoryPanelPosition fromPos, boolean success) { AllPackets.sendToNear(getWorld(), getPos(), 64, new FactoryPanelEffectPacket(fromPos, getPanelPosition(), success)); @@ -203,7 +250,7 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { if (source == null) return; source.targeting.add(getPanelPosition()); - targetedBy.putIfAbsent(fromPos, new FactoryPanelConnection(fromPos, 1)); + targetedBy.put(fromPos, new FactoryPanelConnection(fromPos, 1)); blockEntity.notifyUpdate(); } @@ -211,13 +258,46 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { return new FactoryPanelPosition(getPos(), slot); } + public FactoryPanelBlockEntity panelBE() { + return (FactoryPanelBlockEntity) blockEntity; + } + @Override public void onShortInteract(Player player, InteractionHand hand, Direction side, BlockHitResult hitResult) { + if (AllItemTags.WRENCH.matches(player.getItemInHand(hand))) { + int sharedMode = -1; + for (FactoryPanelPosition target : targeting) { + FactoryPanelBehaviour at = at(getWorld(), target); + if (at == null) + continue; + FactoryPanelConnection connection = at.targetedBy.get(getPanelPosition()); + if (connection == null) + continue; + if (sharedMode == -1) + sharedMode = (connection.arrowBendMode + 1) % 4; + connection.arrowBendMode = sharedMode; + if (!player.level().isClientSide) + at.blockEntity.notifyUpdate(); + } + if (sharedMode == -1) + return; + + char[] boxes = "\u25a1\u25a1\u25a1\u25a1".toCharArray(); + boxes[sharedMode] = '\u25a0'; + player.displayClientMessage(CreateLang.temporaryText("Cycled arrow pathing mode " + new String(boxes)) + .component(), true); + + return; + } + if (player.level().isClientSide) if (FactoryPanelConnectionHandler.panelClicked(getWorld(), player, this)) return; - if (getFilter().isEmpty() && !AllBlocks.FACTORY_PANEL.isIn(player.getItemInHand(hand))) { + if (getFilter().isEmpty()) { + if (AllBlocks.FACTORY_PANEL.isIn(player.getItemInHand(hand))) + return; + super.onShortInteract(player, hand, side, hitResult); return; } @@ -274,6 +354,8 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { public int getUnloadedLinks() { if (getWorld().isClientSide()) return lastReportedUnloadedLinks; + if (panelBE().restocker) + return panelBE().getRestockedPackager() == null ? 1 : 0; UUID freqId = ((StockCheckingBlockEntity) blockEntity).behaviour.freqId; return Create.LOGISTICS.getUnloadedLinkCount(freqId); } @@ -284,23 +366,41 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { if (getFilter().isEmpty()) return 0; - InventorySummary summary = ((StockCheckingBlockEntity) blockEntity).getRecentSummary(); - return summary.getCountOf(getFilter()) / (upTo ? 1 : getFilter().getMaxStackSize()); + InventorySummary summary = getRelevantSummary(); + return summary.getCountOf(getFilter()); + } + + private InventorySummary getRelevantSummary() { + FactoryPanelBlockEntity panelBE = panelBE(); + if (!panelBE.restocker) + return panelBE.getRecentSummary(); + PackagerBlockEntity packager = panelBE.getRestockedPackager(); + if (packager == null) + return InventorySummary.EMPTY; + return packager.getAvailableItems(); } public int getPromised() { if (getWorld().isClientSide()) return lastReportedPromises; - if (getFilter().isEmpty()) + ItemStack item = getFilter(); + if (item.isEmpty()) return 0; + if (panelBE().restocker) { + if (forceClearPromises) + restockerPromises.forceClear(item); + forceClearPromises = false; + return restockerPromises.getTotalPromisedAndRemoveExpired(item, getPromiseExpiryTimeInTicks()); + } + UUID freqId = ((StockCheckingBlockEntity) blockEntity).behaviour.freqId; RequestPromiseQueue promises = Create.LOGISTICS.getQueuedPromises(freqId); if (forceClearPromises) - promises.forceClear(getFilter()); + promises.forceClear(item); + forceClearPromises = false; - return promises == null ? 0 - : promises.getTotalPromisedAndRemoveExpired(getFilter(), getPromiseExpiryTimeInTicks()); + return promises == null ? 0 : promises.getTotalPromisedAndRemoveExpired(item, getPromiseExpiryTimeInTicks()); } private int getPromiseExpiryTimeInTicks() { @@ -332,6 +432,9 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { panelTag.putInt("RecipeOutput", recipeOutput); panelTag.putInt("PromiseClearingInterval", promiseClearingInterval); + if (panelBE().restocker && !clientPacket) + panelTag.put("Promises", restockerPromises.write()); + nbt.put(CreateLang.asId(slot.name()), panelTag); } @@ -365,6 +468,12 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { recipeAddress = panelTag.getString("RecipeAddress"); recipeOutput = panelTag.getInt("RecipeOutput"); + + if (nbt.getBoolean("Restocker") && !clientPacket) { + restockerPromises = RequestPromiseQueue.read(panelTag.getCompound("Promises"), () -> { + }); + promisePrimedForMarkDirty = false; + } } @Override @@ -395,8 +504,7 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { return; count = Math.max(0, settings.value()); upTo = settings.row() == 0; - if (blockEntity instanceof FactoryPanelBlockEntity fpbe) - fpbe.redraw = true; + panelBE().redraw = true; blockEntity.setChanged(); blockEntity.sendData(); playFeedbackSound(this); @@ -456,7 +564,7 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { if (waitingForNetwork) return Components.literal("?"); - int inStorage = getLevelInStorage(); + int inStorage = getLevelInStorage() / (upTo ? 1 : getFilter().getMaxStackSize()); int promised = getPromised(); String stacks = upTo ? "" : "\u25A4"; diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java index 0140f68384..db18a74bf4 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java @@ -58,9 +58,13 @@ public class FactoryPanelBlock extends FaceAttachedHorizontalDirectionalBlock } } - public static enum PanelType { + public static enum PanelState { PASSIVE, ACTIVE } + + public static enum PanelType { + NETWORK, PACKAGER + } public FactoryPanelBlock(Properties p_53182_) { super(p_53182_); diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java index b28f7a3cbf..cdae669867 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java @@ -3,8 +3,11 @@ package com.simibubi.create.content.logistics.factoryBoard; import java.util.EnumMap; import java.util.List; +import javax.annotation.Nullable; + import com.simibubi.create.AllBlocks; import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBlock.PanelSlot; +import com.simibubi.create.content.logistics.packager.PackagerBlockEntity; import com.simibubi.create.content.logistics.stockTicker.StockCheckingBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; @@ -16,6 +19,7 @@ import net.minecraft.core.Direction.Axis; import net.minecraft.nbt.CompoundTag; import net.minecraft.util.Mth; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; @@ -28,11 +32,13 @@ public class FactoryPanelBlockEntity extends StockCheckingBlockEntity { public EnumMap panels; public boolean redraw; + public boolean restocker; private VoxelShape lastShape; public FactoryPanelBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); + restocker = false; } @Override @@ -50,8 +56,37 @@ public class FactoryPanelBlockEntity extends StockCheckingBlockEntity { @Override public void lazyTick() { super.lazyTick(); - if (!level.isClientSide() && panels.isEmpty()) + if (level.isClientSide()) + return; + + if (panels.isEmpty()) level.destroyBlock(worldPosition, false); + + if (AllBlocks.FACTORY_PANEL.has(getBlockState())) { + boolean shouldBeRestocker = AllBlocks.PACKAGER + .has(level.getBlockState(worldPosition.relative(FactoryPanelBlock.connectedDirection(getBlockState()) + .getOpposite()))); + if (restocker == shouldBeRestocker) + return; + restocker = shouldBeRestocker; + redraw = true; + sendData(); + } + } + + @Nullable + public PackagerBlockEntity getRestockedPackager() { + BlockState state = getBlockState(); + if (!restocker || !AllBlocks.FACTORY_PANEL.has(state)) + return null; + BlockPos packagerPos = worldPosition.relative(FactoryPanelBlock.connectedDirection(state) + .getOpposite()); + if (!level.isLoaded(packagerPos)) + return null; + BlockEntity be = level.getBlockEntity(packagerPos); + if (be == null || !(be instanceof PackagerBlockEntity pbe)) + return null; + return pbe; } public int activePanels() { @@ -123,6 +158,7 @@ public class FactoryPanelBlockEntity extends StockCheckingBlockEntity { @Override protected void read(CompoundTag tag, boolean clientPacket) { super.read(tag, clientPacket); + restocker = tag.getBoolean("Restocker"); if (clientPacket && tag.contains("Redraw")) { lastShape = null; level.sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), 16); @@ -132,6 +168,7 @@ public class FactoryPanelBlockEntity extends StockCheckingBlockEntity { @Override protected void write(CompoundTag tag, boolean clientPacket) { super.write(tag, clientPacket); + tag.putBoolean("Restocker", restocker); if (clientPacket && redraw) { NBTHelper.putMarker(tag, "Redraw"); redraw = false; diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConfigurationPacket.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConfigurationPacket.java index 6fd86e0f0e..62f6663198 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConfigurationPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConfigurationPacket.java @@ -83,7 +83,7 @@ public class FactoryPanelConfigurationPacket extends BlockEntityConfigurationPac FactoryPanelPosition key = entry.getKey(); FactoryPanelConnection connection = behaviour.targetedBy.get(key); if (connection != null) - behaviour.targetedBy.put(key, new FactoryPanelConnection(key, entry.getValue())); + connection.amount = entry.getValue(); } behaviour.recipeOutput = outputAmount; diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnection.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnection.java index 44bda79fe1..3c70bbc40a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnection.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnection.java @@ -3,9 +3,6 @@ package com.simibubi.create.content.logistics.factoryBoard; import java.util.ArrayList; import java.util.List; -import org.apache.commons.lang3.mutable.MutableBoolean; - -import net.createmod.catnip.utility.Iterate; import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -15,27 +12,44 @@ import net.minecraft.util.Mth; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; -public record FactoryPanelConnection(FactoryPanelPosition from, int amount, List path, - MutableBoolean successTracker) { +public class FactoryPanelConnection { + + public FactoryPanelPosition from; + public int amount; + public List path; + public int arrowBendMode; + public boolean success; + + private int arrowBendModeCurrentPathUses; public FactoryPanelConnection(FactoryPanelPosition from, int amount) { - this(from, amount, new ArrayList<>(), new MutableBoolean(true)); + this.from = from; + this.amount = amount; + path = new ArrayList<>(); + success = true; + arrowBendMode = -1; + arrowBendModeCurrentPathUses = 0; } public static FactoryPanelConnection read(CompoundTag nbt) { - return new FactoryPanelConnection(FactoryPanelPosition.read(nbt), nbt.getInt("Amount")); + FactoryPanelConnection connection = + new FactoryPanelConnection(FactoryPanelPosition.read(nbt), nbt.getInt("Amount")); + connection.arrowBendMode = nbt.getInt("ArrowBending"); + return connection; } public CompoundTag write() { CompoundTag nbt = from.write(); nbt.putInt("Amount", amount); + nbt.putInt("ArrowBending", arrowBendMode); return nbt; } public List getPath(BlockState state, FactoryPanelPosition to) { - if (!path.isEmpty()) + if (!path.isEmpty() && arrowBendModeCurrentPathUses == arrowBendMode) return path; + arrowBendModeCurrentPathUses = arrowBendMode; path.clear(); float xRot = Mth.RAD_TO_DEG * FactoryPanelBlock.getXRot(state); @@ -50,28 +64,50 @@ public record FactoryPanelConnection(FactoryPanelPosition from, int amount, List diff = VecHelper.rotate(diff, -xRot - 90, Axis.X); diff = VecHelper.rotate(diff, -180, Axis.Y); diff = diff.add(slotDiffx * .5, 0, slotDiffY * .5); + diff = diff.multiply(1, 0, 1); - BlockPos toTravel = BlockPos.containing(diff.scale(2) + BlockPos toTravelFirst = BlockPos.ZERO; + BlockPos toTravelLast = BlockPos.containing(diff.scale(2) .add(0.1, 0.1, 0.1)); + + if (arrowBendMode > 1) { + boolean flipX = diff.x > 0 ^ (arrowBendMode % 2 == 1); + boolean flipZ = diff.z > 0 ^ (arrowBendMode % 2 == 0); + int ceilX = Mth.positiveCeilDiv(toTravelLast.getX(), 2); + int ceilZ = Mth.positiveCeilDiv(toTravelLast.getZ(), 2); + int floorZ = Mth.floorDiv(toTravelLast.getZ(), 2); + int floorX = Mth.floorDiv(toTravelLast.getX(), 2); + toTravelFirst = new BlockPos(flipX ? floorX : ceilX, 0, flipZ ? floorZ : ceilZ); + toTravelLast = new BlockPos(!flipX ? floorX : ceilX, 0, !flipZ ? floorZ : ceilZ); + } + Direction lastDirection = null; - Direction currentDirection = Direction.SOUTH; + Direction currentDirection = null; - for (int i = 0; i < 100; i++) { - if (toTravel.equals(BlockPos.ZERO)) - break; + for (BlockPos toTravel : List.of(toTravelFirst, toTravelLast)) { + boolean zIsPreferred = + arrowBendMode == -1 ? (Math.abs(toTravel.getZ()) > Math.abs(toTravel.getX())) : arrowBendMode % 2 == 1; + List directionOrder = + zIsPreferred ? List.of(Direction.SOUTH, Direction.NORTH, Direction.WEST, Direction.EAST) + : List.of(Direction.WEST, Direction.EAST, Direction.SOUTH, Direction.NORTH); - for (Direction d : Iterate.horizontalDirections) { - if (lastDirection != null && d == lastDirection.getOpposite()) - continue; - if (toTravel.relative(d) - .distManhattan(BlockPos.ZERO) < toTravel.relative(currentDirection) - .distManhattan(BlockPos.ZERO)) - currentDirection = d; + for (int i = 0; i < 100; i++) { + if (toTravel.equals(BlockPos.ZERO)) + break; + + for (Direction d : directionOrder) { + if (lastDirection != null && d == lastDirection.getOpposite()) + continue; + if (currentDirection == null || toTravel.relative(d) + .distManhattan(BlockPos.ZERO) < toTravel.relative(currentDirection) + .distManhattan(BlockPos.ZERO)) + currentDirection = d; + } + + lastDirection = currentDirection; + toTravel = toTravel.relative(currentDirection); + path.add(currentDirection); } - - lastDirection = currentDirection; - toTravel = toTravel.relative(currentDirection); - path.add(currentDirection); } return path; diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionHandler.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionHandler.java index e2d439c8d5..3d84f290f9 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionHandler.java @@ -1,5 +1,7 @@ package com.simibubi.create.content.logistics.factoryBoard; +import javax.annotation.Nullable; + import com.simibubi.create.AllPackets; import com.simibubi.create.foundation.utility.CreateLang; @@ -8,6 +10,7 @@ import net.createmod.catnip.utility.AnimationTickHolder; import net.createmod.catnip.utility.VecHelper; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -24,38 +27,76 @@ public class FactoryPanelConnectionHandler { public static boolean panelClicked(LevelAccessor level, Player player, FactoryPanelBehaviour panel) { if (connectingFrom == null) return false; + FactoryPanelBehaviour at = FactoryPanelBehaviour.at(level, connectingFrom); if (panel.getPanelPosition() .equals(connectingFrom) || at == null) { player.displayClientMessage(Component.empty(), true); connectingFrom = null; connectingFromBox = null; - return false; + return true; } - AllPackets.getChannel() - .sendToServer(new FactoryPanelConnectionPacket(panel.getPanelPosition(), connectingFrom)); + String checkForIssues = checkForIssues(at, panel); + if (checkForIssues != null) { + player.displayClientMessage(CreateLang.temporaryText(checkForIssues) + .style(ChatFormatting.RED) + .component(), true); + connectingFrom = null; + connectingFromBox = null; + return true; + } ItemStack filterFrom = panel.getFilter(); ItemStack filterTo = at.getFilter(); - if (filterTo.isEmpty() || filterFrom.isEmpty()) - player.displayClientMessage(CreateLang.temporaryText("Factory Panels are now connected") - .style(ChatFormatting.GREEN) - .component(), true); - else - player.displayClientMessage(CreateLang.temporaryText("Now using " + filterFrom.getHoverName() - .getString() + " to create " - + filterTo.getHoverName() - .getString()) - .style(ChatFormatting.GREEN) - .component(), true); + AllPackets.getChannel() + .sendToServer(new FactoryPanelConnectionPacket(panel.getPanelPosition(), connectingFrom)); + + player.displayClientMessage(CreateLang.temporaryText("Now using " + filterFrom.getHoverName() + .getString() + " to create " + + filterTo.getHoverName() + .getString()) + .style(ChatFormatting.GREEN) + .component(), true); connectingFrom = null; connectingFromBox = null; return true; } + @Nullable + private static String checkForIssues(FactoryPanelBehaviour from, FactoryPanelBehaviour to) { + BlockState state1 = to.blockEntity.getBlockState(); + BlockState state2 = from.blockEntity.getBlockState(); + BlockPos diff = to.getPos() + .subtract(from.getPos()); + + if (state1.setValue(FactoryPanelBlock.WATERLOGGED, false) + .setValue(FactoryPanelBlock.POWERED, false) != state2.setValue(FactoryPanelBlock.WATERLOGGED, false) + .setValue(FactoryPanelBlock.POWERED, false)) + return "Panels must have the same orientation"; + + if (FactoryPanelBlock.connectedDirection(state1) + .getAxis() + .choose(diff.getX(), diff.getY(), diff.getZ()) != 0) + return "Panels must be on the same surface"; + + if (!diff.closerThan(BlockPos.ZERO, 16)) + return "Panels are too far away from each other"; + + if (to.panelBE().restocker) + return "Input panel cannot be in restock mode"; + + if (to.getFilter() + .isEmpty() + || from.getFilter() + .isEmpty()) + return "Input panel must have an item first"; + + return null; + } + public static void clientTick() { if (connectingFrom == null || connectingFromBox == null) return; diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelEffectPacket.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelEffectPacket.java index e4eaeaa4ca..f92592e46d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelEffectPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelEffectPacket.java @@ -52,8 +52,8 @@ public class FactoryPanelEffectPacket extends SimplePacketBase { if (panelBehaviour != null) { panelBehaviour.bulb.setValue(1); FactoryPanelConnection connection = panelBehaviour.targetedBy.get(fromPos); - connection.successTracker() - .setValue(success); + if (connection != null) + connection.success = success; } return true; } diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelModel.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelModel.java index 9dc3599a28..e25af4c6bc 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelModel.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelModel.java @@ -8,6 +8,7 @@ import java.util.List; import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBlock.PanelSlot; +import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBlock.PanelState; import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBlock.PanelType; import com.simibubi.create.foundation.model.BakedModelWrapperWithData; import com.simibubi.create.foundation.model.BakedQuadHelper; @@ -45,7 +46,8 @@ public class FactoryPanelModel extends BakedModelWrapperWithData { FactoryPanelBehaviour behaviour = FactoryPanelBehaviour.at(world, new FactoryPanelPosition(pos, slot)); if (behaviour == null) continue; - data.types.put(slot, behaviour.count == 0 ? PanelType.PASSIVE : PanelType.ACTIVE); + data.states.put(slot, behaviour.count == 0 ? PanelState.PASSIVE : PanelState.ACTIVE); + data.type = behaviour.panelBE().restocker ? PanelType.PACKAGER : PanelType.NETWORK; } return builder.with(PANEL_PROPERTY, data); } @@ -58,15 +60,19 @@ public class FactoryPanelModel extends BakedModelWrapperWithData { FactoryPanelModelData modelData = data.get(PANEL_PROPERTY); List quads = new ArrayList<>(super.getQuads(state, null, rand, data, renderType)); for (PanelSlot panelSlot : PanelSlot.values()) - if (modelData.types.containsKey(panelSlot)) - addPanel(quads, state, panelSlot, modelData.types.get(panelSlot), rand, data, renderType); + if (modelData.states.containsKey(panelSlot)) + addPanel(quads, state, panelSlot, modelData.type, modelData.states.get(panelSlot), rand, data, + renderType); return quads; } - public void addPanel(List quads, BlockState state, PanelSlot slot, PanelType type, RandomSource rand, - ModelData data, RenderType renderType) { - PartialModel factoryPanel = - type == PanelType.PASSIVE ? AllPartialModels.FACTORY_PANEL : AllPartialModels.FACTORY_PANEL_WITH_BULB; + public void addPanel(List quads, BlockState state, PanelSlot slot, PanelType type, PanelState panelState, + RandomSource rand, ModelData data, RenderType renderType) { + PartialModel factoryPanel = panelState == PanelState.PASSIVE + ? type == PanelType.NETWORK ? AllPartialModels.FACTORY_PANEL : AllPartialModels.FACTORY_PANEL_RESTOCKER + : type == PanelType.NETWORK ? AllPartialModels.FACTORY_PANEL_WITH_BULB + : AllPartialModels.FACTORY_PANEL_RESTOCKER_WITH_BULB; + List quadsToAdd = factoryPanel.get() .getQuads(state, null, rand, data, RenderType.solid()); @@ -92,7 +98,8 @@ public class FactoryPanelModel extends BakedModelWrapperWithData { } private static class FactoryPanelModelData { - public EnumMap types = new EnumMap<>(PanelSlot.class); + public PanelType type; + public EnumMap states = new EnumMap<>(PanelSlot.class); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelRenderer.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelRenderer.java index 1d88aca0a1..bd5059921a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelRenderer.java @@ -87,8 +87,7 @@ public class FactoryPanelRenderer extends SmartBlockEntityRenderer inputConfig; @@ -47,6 +49,7 @@ public class FactoryPanelScreen extends AbstractSimiScreen { public FactoryPanelScreen(FactoryPanelBehaviour behaviour) { this.behaviour = behaviour; minecraft = Minecraft.getInstance(); + restocker = behaviour.panelBE().restocker; updateConfigs(); } @@ -55,8 +58,8 @@ public class FactoryPanelScreen extends AbstractSimiScreen { outputConfig = new BigItemStack(behaviour.getFilter(), behaviour.recipeOutput); inputConfig = connections.stream() .map(c -> { - FactoryPanelBehaviour b = FactoryPanelBehaviour.at(minecraft.level, c.from()); - return b == null ? new BigItemStack(ItemStack.EMPTY, 0) : new BigItemStack(b.getFilter(), c.amount()); + FactoryPanelBehaviour b = FactoryPanelBehaviour.at(minecraft.level, c.from); + return b == null ? new BigItemStack(ItemStack.EMPTY, 0) : new BigItemStack(b.getFilter(), c.amount); }) .toList(); } @@ -77,6 +80,7 @@ public class FactoryPanelScreen extends AbstractSimiScreen { addressBox.setValue(behaviour.recipeAddress); addressBox.setTextColor(0x555555); } + addressBox.setX(x + 38); addressBox.setY(y + 30 + middleHeight()); addRenderableWidget(addressBox); @@ -90,7 +94,7 @@ public class FactoryPanelScreen extends AbstractSimiScreen { promiseExpiration.setState(behaviour.promiseClearingInterval); addRenderableWidget(promiseExpiration); - if (behaviour.targetedBy.size() < 9) { + if (!restocker && behaviour.targetedBy.size() < 9) { int slot = behaviour.targetedBy.size(); newInputButton = new IconButton(x + 24 + (slot % 3 * 18), y + 27 + (slot / 3 * 18), AllIcons.I_ADD); newInputButton.withCallback(() -> { @@ -150,42 +154,13 @@ public class FactoryPanelScreen extends AbstractSimiScreen { slot = 0; for (BigItemStack itemStack : inputConfig) { - int inputX = x + 25 + (slot % 3 * 18); - int inputY = y + 28 + (slot / 3 * 18); - graphics.renderItem(itemStack.stack, inputX, inputY); - if (!itemStack.stack.isEmpty()) - graphics.renderItemDecorations(font, itemStack.stack, inputX, inputY, itemStack.count + ""); - + renderInputItem(graphics, slot, itemStack, mouseX, mouseY); slot++; - - if (mouseX >= inputX - 1 && mouseX < inputX - 1 + 18 && mouseY >= inputY - 1 && mouseY < inputY - 1 + 18) { - if (itemStack.stack.isEmpty()) { - graphics.renderComponentTooltip(font, List.of(CreateLang.temporaryText("Empty panel") - .color(ScrollInput.HEADER_RGB) - .component(), - CreateLang.temporaryText("Left-Click to disconnect") - .style(ChatFormatting.DARK_GRAY) - .style(ChatFormatting.ITALIC) - .component()), - mouseX, mouseY); - } else - graphics.renderComponentTooltip(font, List.of(CreateLang.temporaryText("Send ") - .add(CreateLang.itemName(itemStack.stack) - .add(CreateLang.text(" x" + itemStack.count))) - .color(ScrollInput.HEADER_RGB) - .component(), - CreateLang.temporaryText("Scroll to change amount") - .style(ChatFormatting.DARK_GRAY) - .style(ChatFormatting.ITALIC) - .component(), - CreateLang.temporaryText("Left-Click to disconnect") - .style(ChatFormatting.DARK_GRAY) - .style(ChatFormatting.ITALIC) - .component()), - mouseX, mouseY); - } } + if (restocker) + renderInputItem(graphics, slot, new BigItemStack(behaviour.getFilter(), 1), mouseX, mouseY); + if (inputConfig.size() > 0) { AllGuiTextures.FACTORY_PANEL_ARROW.render(graphics, x + 75 + Mth.clamp(behaviour.targetedBy.size(), 0, 2) * 9, y + 16 + middleHeight() / 2); @@ -202,7 +177,13 @@ public class FactoryPanelScreen extends AbstractSimiScreen { .add(CreateLang.text(" x" + outputConfig.count))) .color(ScrollInput.HEADER_RGB) .component(), - CreateLang.temporaryText("Scroll to change amount") + CreateLang.temporaryText("The amount of output returning") + .style(ChatFormatting.GRAY) + .component(), + CreateLang.temporaryText("after each successful request") + .style(ChatFormatting.GRAY) + .component(), + CreateLang.temporaryText("Scroll to change") .style(ChatFormatting.DARK_GRAY) .style(ChatFormatting.ITALIC) .component()), @@ -215,35 +196,11 @@ public class FactoryPanelScreen extends AbstractSimiScreen { ms.translate(0, 0, 10); // ADDRESS - if (addressBox.isHovered() && !addressBox.isFocused()) { - if (addressBox.getValue() - .isBlank()) - graphics.renderComponentTooltip(font, List.of(CreateLang.temporaryText("Send inputs to...") - .color(ScrollInput.HEADER_RGB) - .component(), - CreateLang.temporaryText("Enter an address where") - .style(ChatFormatting.GRAY) - .component(), - CreateLang.temporaryText("this recipe is carried out.") - .style(ChatFormatting.GRAY) - .component(), - CreateLang.translate("gui.schedule.lmb_edit") - .style(ChatFormatting.DARK_GRAY) - .style(ChatFormatting.ITALIC) - .component()), - mouseX, mouseY); - else - graphics.renderComponentTooltip(font, List.of(CreateLang.temporaryText("Sending inputs to") - .color(ScrollInput.HEADER_RGB) - .component(), - CreateLang.temporaryText("'" + addressBox.getValue() + "'") - .style(ChatFormatting.GRAY) - .component()), - mouseX, mouseY); - } + if (addressBox.isHovered() && !addressBox.isFocused()) + showAddressBoxTooltip(graphics, mouseX, mouseY); // TITLE - Component title = CreateLang.temporaryText("Logistics Recipe") + Component title = CreateLang.temporaryText(restocker ? "Restocker Settings" : "Recipe Settings") .component(); graphics.drawString(font, title, x + 87 - font.width(title) / 2, y + 7, 0x3D3C48, false); @@ -258,11 +215,20 @@ public class FactoryPanelScreen extends AbstractSimiScreen { .isEmpty()) { GuiGameElement.of(behaviour.getFilter()) .scale(1.625) - .at(0, 0, 200) + .at(0, 0, 100) .render(graphics, x + 194, y + 68); } + + ms.translate(0, 0, 350); + MutableComponent countLabelForValueBox = behaviour.getCountLabelForValueBox(); + graphics.drawString(font, countLabelForValueBox, x + 210 - font.width(countLabelForValueBox) / 2, y + 98, + 0xffffffff); ms.popPose(); + if (mouseX >= x + 190 - 1 && mouseX < x + 190 - 1 + 48 && mouseY >= y + middleHeight() - 25 + 90 - 1 + && mouseY < y + middleHeight() - 25 + 94 - 1 + 26) + showStockLevelTooltip(graphics, mouseX, mouseY); + // PROMISES int state = promiseExpiration.getState(); graphics.drawString(font, CreateLang.temporaryText(state == -1 ? " /" : state == 0 ? "30s" : state + "m") @@ -282,10 +248,11 @@ public class FactoryPanelScreen extends AbstractSimiScreen { promiseTip = List.of(CreateLang.temporaryText("No open promises") .color(ScrollInput.HEADER_RGB) .component(), - CreateLang.temporaryText("When inputs are sent, a promise") + CreateLang + .temporaryText(restocker ? "When items are sent, a promise" : "When inputs are sent, a promise") .style(ChatFormatting.GRAY) .component(), - CreateLang.temporaryText("is held until outputs arrive.") + CreateLang.temporaryText(restocker ? "is held until they arrive." : "is held until outputs arrive.") .style(ChatFormatting.GRAY) .component(), CreateLang.temporaryText("This prevents over-sending.") @@ -311,6 +278,128 @@ public class FactoryPanelScreen extends AbstractSimiScreen { ms.popPose(); } + // + + private void renderInputItem(GuiGraphics graphics, int slot, BigItemStack itemStack, int mouseX, int mouseY) { + int inputX = guiLeft + 25 + (slot % 3 * 18); + int inputY = guiTop + 28 + (slot / 3 * 18); + + graphics.renderItem(itemStack.stack, inputX, inputY); + if (!restocker && !itemStack.stack.isEmpty()) + graphics.renderItemDecorations(font, itemStack.stack, inputX, inputY, itemStack.count + ""); + + if (mouseX < inputX - 1 || mouseX >= inputX - 1 + 18 || mouseY < inputY - 1 || mouseY >= inputY - 1 + 18) + return; + + if (itemStack.stack.isEmpty()) { + graphics.renderComponentTooltip(font, List.of(CreateLang.temporaryText("Empty panel") + .color(ScrollInput.HEADER_RGB) + .component(), + CreateLang.temporaryText("Left-Click to disconnect") + .style(ChatFormatting.DARK_GRAY) + .style(ChatFormatting.ITALIC) + .component()), + mouseX, mouseY); + return; + } + + if (restocker) { + graphics.renderComponentTooltip(font, List.of(CreateLang.temporaryText("Sending ") + .add(CreateLang.itemName(itemStack.stack)) + .color(ScrollInput.HEADER_RGB) + .component(), + CreateLang.temporaryText("whenever local stock level") + .style(ChatFormatting.GRAY) + .component(), + CreateLang.temporaryText("is below the target amount") + .style(ChatFormatting.GRAY) + .component()), + mouseX, mouseY); + return; + } + + graphics.renderComponentTooltip(font, List.of(CreateLang.temporaryText("Send ") + .add(CreateLang.itemName(itemStack.stack) + .add(CreateLang.text(" x" + itemStack.count))) + .color(ScrollInput.HEADER_RGB) + .component(), + CreateLang.temporaryText("Scroll to change amount") + .style(ChatFormatting.DARK_GRAY) + .style(ChatFormatting.ITALIC) + .component(), + CreateLang.temporaryText("Left-Click to disconnect") + .style(ChatFormatting.DARK_GRAY) + .style(ChatFormatting.ITALIC) + .component()), + mouseX, mouseY); + } + + private void showStockLevelTooltip(GuiGraphics graphics, int mouseX, int mouseY) { + graphics.renderComponentTooltip(font, + List.of( + (behaviour.count > 0 ? CreateLang.temporaryText("Storage level and target") + : CreateLang.temporaryText("Storage level")).color(ScrollInput.HEADER_RGB) + .component(), + CreateLang.temporaryText("Targeted amount can be set") + .style(ChatFormatting.GRAY) + .component(), + CreateLang.temporaryText("by using the filter slot") + .style(ChatFormatting.GRAY) + .component(), + CreateLang.temporaryText("outside of this interface") + .style(ChatFormatting.GRAY) + .component()), + mouseX, mouseY); + } + + private void showAddressBoxTooltip(GuiGraphics graphics, int mouseX, int mouseY) { + if (addressBox.getValue() + .isBlank()) { + if (restocker) { + graphics.renderComponentTooltip(font, List.of(CreateLang.temporaryText("Send items to...") + .color(ScrollInput.HEADER_RGB) + .component(), + CreateLang.temporaryText("Enter an address that will") + .style(ChatFormatting.GRAY) + .component(), + CreateLang.temporaryText("cause packages to arrive here.") + .style(ChatFormatting.GRAY) + .component(), + CreateLang.translate("gui.schedule.lmb_edit") + .style(ChatFormatting.DARK_GRAY) + .style(ChatFormatting.ITALIC) + .component()), + mouseX, mouseY); + + } else { + graphics.renderComponentTooltip(font, List.of(CreateLang.temporaryText("Send inputs to...") + .color(ScrollInput.HEADER_RGB) + .component(), + CreateLang.temporaryText("Enter an address where") + .style(ChatFormatting.GRAY) + .component(), + CreateLang.temporaryText("this recipe is carried out.") + .style(ChatFormatting.GRAY) + .component(), + CreateLang.translate("gui.schedule.lmb_edit") + .style(ChatFormatting.DARK_GRAY) + .style(ChatFormatting.ITALIC) + .component()), + mouseX, mouseY); + } + } else + graphics.renderComponentTooltip(font, + List.of(CreateLang.temporaryText(restocker ? "Sending to" : "Sending inputs to") + .color(ScrollInput.HEADER_RGB) + .component(), + CreateLang.temporaryText("'" + addressBox.getValue() + "'") + .style(ChatFormatting.GRAY) + .component()), + mouseX, mouseY); + } + + // + @Override public boolean mouseClicked(double mouseX, double mouseY, int pButton) { if (getFocused() != null && !getFocused().isMouseOver(mouseX, mouseY)) @@ -324,8 +413,7 @@ public class FactoryPanelScreen extends AbstractSimiScreen { int inputX = x + 25 + (i % 3 * 18); int inputY = y + 28 + (i / 3 * 18); if (mouseX >= inputX && mouseX < inputX + 16 && mouseY >= inputY && mouseY < inputY + 16) { - sendIt(connections.get(i) - .from(), false); + sendIt(connections.get(i).from, false); return true; } } @@ -383,8 +471,7 @@ public class FactoryPanelScreen extends AbstractSimiScreen { Map inputs = new HashMap<>(); if (inputConfig.size() == connections.size()) for (int i = 0; i < inputConfig.size(); i++) - inputs.put(connections.get(i) - .from(), inputConfig.get(i).count); + inputs.put(connections.get(i).from, inputConfig.get(i).count); AllPackets.getChannel() .sendToServer(new FactoryPanelConfigurationPacket(behaviour.getPanelPosition(), addressBox.getValue(), inputs, outputConfig.count, promiseExpiration.getState(), toRemove, clearPromises)); diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortScreen.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortScreen.java index d627629f86..9b113c2b1a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortScreen.java @@ -79,19 +79,19 @@ public class PackagePortScreen extends AbstractSimiContainerScreen { - acceptPackages.active = false; - dontAcceptPackages.active = true; + acceptPackages.green = true; + dontAcceptPackages.green = false; }); - acceptPackages.active = !menu.contentHolder.acceptsPackages; + acceptPackages.green = menu.contentHolder.acceptsPackages; acceptPackages.setToolTip(CreateLang.translateDirect("gui.package_port.send_and_receive")); addRenderableWidget(acceptPackages); dontAcceptPackages = new IconButton(x + 37 + 18, y + background.getHeight() - 24, AllIcons.I_SEND_ONLY); dontAcceptPackages.withCallback(() -> { - acceptPackages.active = true; - dontAcceptPackages.active = false; + acceptPackages.green = false; + dontAcceptPackages.green = true; }); - dontAcceptPackages.active = menu.contentHolder.acceptsPackages; + dontAcceptPackages.green = !menu.contentHolder.acceptsPackages; dontAcceptPackages.setToolTip(CreateLang.translateDirect("gui.package_port.send_only")); addRenderableWidget(dontAcceptPackages); @@ -180,7 +180,7 @@ public class PackagePortScreen extends AbstractSimiContainerScreen { if (be.heldBox.isEmpty()) { if (be.animationTicks > 0) return InteractionResult.SUCCESS; - ItemStack heldItem = player.getItemInHand(handIn); - if (heldItem.getItem() instanceof PackageItem) { + if (itemInHand.getItem() instanceof PackageItem) { if (worldIn.isClientSide()) return InteractionResult.SUCCESS; - if (!be.unwrapBox(heldItem.copy(), true)) + if (!be.unwrapBox(itemInHand.copy(), true)) return InteractionResult.SUCCESS; - be.unwrapBox(heldItem.copy(), false); + be.unwrapBox(itemInHand.copy(), false); be.triggerStockCheck(); - heldItem.shrink(1); - if (heldItem.isEmpty()) + itemInHand.shrink(1); + if (itemInHand.isEmpty()) player.setItemInHand(handIn, ItemStack.EMPTY); return InteractionResult.SUCCESS; } diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java index ac50480fe7..6b19c76173 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java @@ -1,18 +1,25 @@ package com.simibubi.create.content.logistics.packager; +import java.util.HashSet; import java.util.LinkedList; import java.util.List; +import java.util.Set; import java.util.UUID; import com.simibubi.create.AllBlocks; import com.simibubi.create.Create; +import com.simibubi.create.content.contraptions.actors.psi.PortableStorageInterfaceBlockEntity; import com.simibubi.create.content.logistics.BigItemStack; import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.content.logistics.crate.BottomlessItemHandler; +import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBehaviour; +import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBlock; +import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBlockEntity; import com.simibubi.create.content.logistics.packagePort.frogport.FrogportBlockEntity; import com.simibubi.create.content.logistics.packager.PackagerBlock.PackagerType; import com.simibubi.create.content.logistics.packagerLink.PackagerLinkBlock; import com.simibubi.create.content.logistics.packagerLink.PackagerLinkBlockEntity; +import com.simibubi.create.content.logistics.packagerLink.RequestPromiseQueue; import com.simibubi.create.content.logistics.stockTicker.PackageOrder; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; @@ -89,10 +96,15 @@ public class PackagerBlockEntity extends SmartBlockEntity { @Override public void addBehaviours(List behaviours) { - behaviours.add(targetInventory = new InvManipulationBehaviour(this, InterfaceProvider.oppositeOfBlockFacing())); + behaviours.add(targetInventory = new InvManipulationBehaviour(this, InterfaceProvider.oppositeOfBlockFacing()) + .withFilter(this::supportsBlockEntity)); behaviours.add(invVersionTracker = new VersionedInventoryTrackerBehaviour(this)); } + private boolean supportsBlockEntity(BlockEntity target) { + return target != null && !(target instanceof PortableStorageInterfaceBlockEntity); + } + @Override public void initialize() { super.initialize(); @@ -123,7 +135,7 @@ public class PackagerBlockEntity extends SmartBlockEntity { public void triggerStockCheck() { getAvailableItems(); } - + public InventorySummary getAvailableItems() { if (availableItems != null && invVersionTracker.stillWaiting(targetInventory.getInventory())) return availableItems; @@ -149,28 +161,48 @@ public class PackagerBlockEntity extends SmartBlockEntity { if (before == null || after.isEmpty()) return; + Set promiseQueues = new HashSet<>(); + for (Direction d : Iterate.directions) { + if (!level.isLoaded(worldPosition.relative(d))) + continue; + BlockState adjacentState = level.getBlockState(worldPosition.relative(d)); - if (!AllBlocks.PACKAGER_LINK.has(adjacentState)) - continue; - if (adjacentState.getValue(PackagerLinkBlock.FACING) != d) - continue; - if (!(level.getBlockEntity(worldPosition.relative(d)) instanceof PackagerLinkBlockEntity plbe)) - return; - UUID freqId = plbe.behaviour.freqId; - if (!Create.LOGISTICS.hasQueuedPromises(freqId)) - return; + if (AllBlocks.FACTORY_PANEL.has(adjacentState)) { + if (FactoryPanelBlock.connectedDirection(adjacentState) != d) + continue; + if (!(level.getBlockEntity(worldPosition.relative(d)) instanceof FactoryPanelBlockEntity fpbe)) + continue; + if (!fpbe.restocker) + continue; + for (FactoryPanelBehaviour behaviour : fpbe.panels.values()) { + if (!behaviour.isActive()) + continue; + promiseQueues.add(behaviour.restockerPromises); + } + } - for (BigItemStack entry : after.getStacks()) - before.add(entry.stack, -entry.count); + if (AllBlocks.PACKAGER_LINK.has(adjacentState)) { + if (adjacentState.getValue(PackagerLinkBlock.FACING) != d) + continue; + if (!(level.getBlockEntity(worldPosition.relative(d)) instanceof PackagerLinkBlockEntity plbe)) + continue; + UUID freqId = plbe.behaviour.freqId; + if (!Create.LOGISTICS.hasQueuedPromises(freqId)) + continue; + promiseQueues.add(Create.LOGISTICS.getQueuedPromises(freqId)); + } + } + if (promiseQueues.isEmpty()) + return; + + for (BigItemStack entry : after.getStacks()) + before.add(entry.stack, -entry.count); + for (RequestPromiseQueue queue : promiseQueues) for (BigItemStack entry : before.getStacks()) if (entry.count < 0) - Create.LOGISTICS.getQueuedPromises(freqId) - .itemEnteredSystem(entry.stack, -entry.count); - - return; - } + queue.itemEnteredSystem(entry.stack, -entry.count); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/GlobalLogisticsManager.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/GlobalLogisticsManager.java index 63c6de4f38..2b26a41863 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/GlobalLogisticsManager.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/GlobalLogisticsManager.java @@ -31,7 +31,7 @@ public class GlobalLogisticsManager { logisticsNetworks.computeIfAbsent(networkId, $ -> new LogisticsNetwork(networkId)).totalLinks++; markDirty(); } - + public void linkLoaded(UUID networkId) { logisticsNetworks.computeIfAbsent(networkId, $ -> new LogisticsNetwork(networkId)).loadedLinks++; } @@ -45,14 +45,14 @@ public class GlobalLogisticsManager { logisticsNetworks.remove(networkId); markDirty(); } - + public void linkInvalidated(UUID networkId) { LogisticsNetwork logisticsNetwork = logisticsNetworks.get(networkId); if (logisticsNetwork == null) return; logisticsNetwork.loadedLinks--; } - + public int getUnloadedLinkCount(UUID networkId) { LogisticsNetwork logisticsNetwork = logisticsNetworks.get(networkId); if (logisticsNetwork == null) diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java index 623347cd66..7c497725be 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java @@ -70,7 +70,7 @@ public class LogisticallyLinkedBehaviour extends BlockEntityBehaviour { return (accurate ? ACCURATE_SUMMARIES : SUMMARIES).get(freqId, () -> { InventorySummary summaryOfLinks = new InventorySummary(); getAllConnectedAvailableLinks(false).forEach(link -> { - InventorySummary summary = link.getSummary(); + InventorySummary summary = link.getSummary(null); if (summary != InventorySummary.EMPTY) summaryOfLinks.contributingLinks++; summaryOfLinks.add(summary); @@ -83,6 +83,14 @@ public class LogisticallyLinkedBehaviour extends BlockEntityBehaviour { return InventorySummary.EMPTY; } + public int getStockOf(ItemStack stack, @Nullable IItemHandler ignoredHandler) { + int sum = 0; + for (LogisticallyLinkedBehaviour link : getAllConnectedAvailableLinks(false)) + sum += link.getSummary(ignoredHandler) + .getCountOf(stack); + return sum; + } + public static Collection getAllPresent(UUID freq, boolean sortByPriority) { Cache> cache = LINKS.getIfPresent(freq); if (cache == null) @@ -188,9 +196,9 @@ public class LogisticallyLinkedBehaviour extends BlockEntityBehaviour { return 0; } - public InventorySummary getSummary() { + public InventorySummary getSummary(@Nullable IItemHandler ignoredHandler) { if (blockEntity instanceof PackagerLinkBlockEntity plbe) - return plbe.fetchSummaryFromPackager(); + return plbe.fetchSummaryFromPackager(ignoredHandler); return InventorySummary.EMPTY; } diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsNetwork.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsNetwork.java index c7edc82b1b..8aa46663aa 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsNetwork.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsNetwork.java @@ -2,18 +2,20 @@ package com.simibubi.create.content.logistics.packagerLink; import java.util.UUID; +import com.simibubi.create.Create; + import net.minecraft.nbt.CompoundTag; public class LogisticsNetwork { - + public UUID id; public RequestPromiseQueue panelPromises; public int totalLinks; public int loadedLinks; - + public LogisticsNetwork(UUID networkId) { id = networkId; - panelPromises = new RequestPromiseQueue(); + panelPromises = new RequestPromiseQueue(Create.LOGISTICS::markDirty); totalLinks = 0; loadedLinks = 0; } @@ -25,10 +27,10 @@ public class LogisticsNetwork { tag.putInt("Links", totalLinks); return tag; } - + public static LogisticsNetwork read(CompoundTag tag) { LogisticsNetwork network = new LogisticsNetwork(tag.getUUID("Id")); - network.panelPromises = RequestPromiseQueue.read(tag.getCompound("Promises")); + network.panelPromises = RequestPromiseQueue.read(tag.getCompound("Promises"), Create.LOGISTICS::markDirty); network.totalLinks = tag.getInt("Links"); return network; } diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java index e533680645..3350ee21d0 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java @@ -29,10 +29,13 @@ public class PackagerLinkBlockEntity extends LinkWithBulbBlockEntity { setLazyTickRate(10); } - public InventorySummary fetchSummaryFromPackager() { + public InventorySummary fetchSummaryFromPackager(@Nullable IItemHandler ignoredHandler) { PackagerBlockEntity packager = getPackager(); if (packager == null || packager.defragmenterActive) return InventorySummary.EMPTY; + if (packager.isTargetingSameInventory(ignoredHandler)) + return InventorySummary.EMPTY; + sendPulseNextSync(); sendData(); return packager.getAvailableItems(); diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/RequestPromiseQueue.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/RequestPromiseQueue.java index 9b9e8e6bd1..0db4280584 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/RequestPromiseQueue.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/RequestPromiseQueue.java @@ -8,7 +8,6 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; -import com.simibubi.create.Create; import com.simibubi.create.content.logistics.BigItemStack; import net.createmod.catnip.utility.NBTHelper; @@ -21,15 +20,21 @@ import net.minecraftforge.items.ItemHandlerHelper; public class RequestPromiseQueue { private Map> promisesByItem; + private Runnable onChanged; - public RequestPromiseQueue() { + public RequestPromiseQueue(Runnable onChanged) { promisesByItem = new IdentityHashMap<>(); + this.onChanged = onChanged; } public void add(RequestPromise promise) { promisesByItem.computeIfAbsent(promise.promisedStack.stack.getItem(), $ -> new LinkedList<>()) .add(promise); - Create.LOGISTICS.markDirty(); + onChanged.run(); + } + + public void setOnChanged(Runnable onChanged) { + this.onChanged = onChanged; } public int getTotalPromisedAndRemoveExpired(ItemStack stack, int expiryTime) { @@ -44,7 +49,7 @@ public class RequestPromiseQueue { continue; if (expiryTime != -1 && promise.ticksExisted >= expiryTime) { iterator.remove(); - Create.LOGISTICS.markDirty(); + onChanged.run(); continue; } @@ -63,7 +68,7 @@ public class RequestPromiseQueue { if (!ItemHandlerHelper.canItemStacksStack(promise.promisedStack.stack, stack)) continue; iterator.remove(); - Create.LOGISTICS.markDirty(); + onChanged.run(); } if (list.isEmpty()) @@ -86,7 +91,7 @@ public class RequestPromiseQueue { if (requestPromise.promisedStack.count <= 0) { iterator.remove(); - Create.LOGISTICS.markDirty(); + onChanged.run(); } if (amount <= 0) break; @@ -114,8 +119,8 @@ public class RequestPromiseQueue { return tag; } - public static RequestPromiseQueue read(CompoundTag tag) { - RequestPromiseQueue queue = new RequestPromiseQueue(); + public static RequestPromiseQueue read(CompoundTag tag, Runnable onChanged) { + RequestPromiseQueue queue = new RequestPromiseQueue(onChanged); NBTHelper.iterateCompoundList(tag.getList("List", Tag.TAG_COMPOUND), c -> { RequestPromise promise = new RequestPromise(BigItemStack.read(c)); promise.ticksExisted = c.getInt("Age"); diff --git a/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterScreen.java b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterScreen.java index 474702dcf7..8e4508aeb4 100644 --- a/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterScreen.java @@ -82,20 +82,20 @@ public class RedstoneRequesterScreen extends AbstractSimiContainerScreen { - allowPartial.active = false; - dontAllowPartial.active = true; + allowPartial.green = true; + dontAllowPartial.green = false; }); - allowPartial.active = !menu.contentHolder.allowPartialRequests; + allowPartial.green = menu.contentHolder.allowPartialRequests; allowPartial.setToolTip(CreateLang.temporaryText("Allow partial orders") .component()); addRenderableWidget(allowPartial); dontAllowPartial = new IconButton(x + 12 + 18, y + bgHeight - 24, AllIcons.I_FULL_REQUESTS); dontAllowPartial.withCallback(() -> { - allowPartial.active = true; - dontAllowPartial.active = false; + allowPartial.green = false; + dontAllowPartial.green = true; }); - dontAllowPartial.active = menu.contentHolder.allowPartialRequests; + dontAllowPartial.green = !menu.contentHolder.allowPartialRequests; dontAllowPartial.setToolTip(CreateLang.temporaryText("Must send all items") .component()); addRenderableWidget(dontAllowPartial); @@ -221,7 +221,7 @@ public class RedstoneRequesterScreen extends AbstractSimiContainerScreen level; protected BlockPos pos; protected BlockState blockState; @@ -82,7 +82,7 @@ public class ValueBox extends ChasingAABBOutline { boolean hasTransform = transform != null; if (transform instanceof Sided && params.getHighlightedFace() != null) ((Sided) transform).fromSide(params.getHighlightedFace()); - + LevelAccessor levelAccessor = level.get(); if (hasTransform && !transform.shouldRender(levelAccessor, pos, blockState)) return; @@ -159,13 +159,12 @@ public class ValueBox extends ChasingAABBOutline { } else ms.translate(-7, 10, blockItem ? 10 + 1 / 4f : 0); - if (count.getString().equals("*")) + if (count.getString() + .equals("*")) ms.translate(-1, 3f, 0); ms.scale(scale, scale, scale); - drawString(ms, buffer, count, 0, 0, isFilter ? 0xFFFFFF : 0xEDEDED); - ms.translate(0, 0, -1 / 16f); - drawString(ms, buffer, Components.literal(count.getString()), 1 - 1 / 8f, 1 - 1 / 8f, 0x3F3F3F); + drawString8x(ms, buffer, count, 0, 0, isFilter ? 0xFFFFFF : 0xEDEDED); } } @@ -202,7 +201,10 @@ public class ValueBox extends ChasingAABBOutline { ms.translate(singleDigit ? stringWidth / 2 : 0, singleDigit ? -verticalMargin : verticalMargin, 0); int overrideColor = transform.getOverrideColor(); - renderHoveringText(ms, buffer, text, overrideColor != -1 ? overrideColor : 0xEDEDED); + if (overrideColor == -1) + drawString8x(ms, buffer, text, 0, 0, 0xEDEDED); + else + drawString(ms, buffer, text, 0, 0, overrideColor); } } @@ -228,16 +230,16 @@ public class ValueBox extends ChasingAABBOutline { } - protected void renderHoveringText(PoseStack ms, MultiBufferSource buffer, Component text, int color) { - ms.pushPose(); - drawString(ms, buffer, text, 0, 0, color); - ms.popPose(); - } - private static void drawString(PoseStack ms, MultiBufferSource buffer, Component text, float x, float y, int color) { Minecraft.getInstance().font.drawInBatch(text, x, y, color, false, ms.last() .pose(), buffer, Font.DisplayMode.NORMAL, 0, LightTexture.FULL_BRIGHT); } + private static void drawString8x(PoseStack ms, MultiBufferSource buffer, Component text, float x, float y, + int color) { + Minecraft.getInstance().font.drawInBatch8xOutline(text.getVisualOrderText(), x, y, color, 0xff333333, ms.last() + .pose(), buffer, LightTexture.FULL_BRIGHT); + } + } diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringBehaviour.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringBehaviour.java index e6a40f6a18..ec4f1c4ba0 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringBehaviour.java @@ -331,7 +331,7 @@ public class FilteringBehaviour extends BlockEntityBehaviour implements ValueSet } public MutableComponent getCountLabelForValueBox() { - return Components.literal(showCount ? upTo && filter.item() + return Components.literal(isCountVisible() ? upTo && filter.item() .getMaxStackSize() == count ? "*" : String.valueOf(count) : ""); } diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java index a2a92c1e8b..0be129d723 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java @@ -197,6 +197,8 @@ public enum AllGuiTextures implements ScreenElement, TextureSheetSegment { BUTTON("widgets", 18, 18), BUTTON_HOVER("widgets", 18, 0, 18, 18), BUTTON_DOWN("widgets", 36, 0, 18, 18), + BUTTON_GREEN("widgets", 72, 0, 18, 18), + BUTTON_DISABLED("widgets", 90, 0, 18, 18), INDICATOR("widgets", 0, 18, 18, 6), INDICATOR_WHITE("widgets", 18, 18, 18, 6), INDICATOR_GREEN("widgets", 36, 18, 18, 6), diff --git a/src/main/java/com/simibubi/create/foundation/gui/widget/IconButton.java b/src/main/java/com/simibubi/create/foundation/gui/widget/IconButton.java index 6c0249d4cc..ffee722c24 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/widget/IconButton.java +++ b/src/main/java/com/simibubi/create/foundation/gui/widget/IconButton.java @@ -1,6 +1,7 @@ package com.simibubi.create.foundation.gui.widget; import com.mojang.blaze3d.systems.RenderSystem; +import com.simibubi.create.AllKeys; import com.simibubi.create.foundation.gui.AllGuiTextures; import net.createmod.catnip.gui.element.ScreenElement; @@ -12,6 +13,8 @@ public class IconButton extends AbstractSimiWidget { protected ScreenElement icon; + public boolean green; + public IconButton(int x, int y, ScreenElement icon) { this(x, y, 18, 18, icon); } @@ -26,8 +29,10 @@ public class IconButton extends AbstractSimiWidget { if (visible) { isHovered = mouseX >= getX() && mouseY >= getY() && mouseX < getX() + width && mouseY < getY() + height; - AllGuiTextures button = !active ? AllGuiTextures.BUTTON_DOWN - : isMouseOver(mouseX, mouseY) ? AllGuiTextures.BUTTON_HOVER : AllGuiTextures.BUTTON; + AllGuiTextures button = !active ? AllGuiTextures.BUTTON_DISABLED + : isHovered && AllKeys.isMouseButtonDown(0) ? AllGuiTextures.BUTTON_DOWN + : isHovered ? AllGuiTextures.BUTTON_HOVER + : green ? AllGuiTextures.BUTTON_GREEN : AllGuiTextures.BUTTON; RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); drawBg(graphics, button); @@ -36,7 +41,8 @@ public class IconButton extends AbstractSimiWidget { } protected void drawBg(GuiGraphics graphics, AllGuiTextures button) { - graphics.blit(button.location, getX(), getY(), button.getStartX(), button.getStartY(), button.getWidth(), button.getHeight()); + graphics.blit(button.location, getX(), getY(), button.getStartX(), button.getStartY(), button.getWidth(), + button.getHeight()); } public void setToolTip(Component text) { diff --git a/src/main/resources/assets/create/models/block/factory_panel/panel_restocker.json b/src/main/resources/assets/create/models/block/factory_panel/panel_restocker.json new file mode 100644 index 0000000000..a90d41d5ec --- /dev/null +++ b/src/main/resources/assets/create/models/block/factory_panel/panel_restocker.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/factory_panel/panel", + "textures": { + "0": "create:block/factory_panel_packager_mode", + "particle": "create:block/factory_panel_packager_mode" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/factory_panel/panel_restocker_with_bulb.json b/src/main/resources/assets/create/models/block/factory_panel/panel_restocker_with_bulb.json new file mode 100644 index 0000000000..84f36d5a49 --- /dev/null +++ b/src/main/resources/assets/create/models/block/factory_panel/panel_restocker_with_bulb.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/factory_panel/panel_with_bulb", + "textures": { + "0": "create:block/factory_panel_packager_mode", + "particle": "create:block/factory_panel_packager_mode" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/block/factory_panel_packager_mode.png b/src/main/resources/assets/create/textures/block/factory_panel_packager_mode.png new file mode 100644 index 0000000000000000000000000000000000000000..360ad3255fe296f7264c4463b132c2a8275506f9 GIT binary patch literal 468 zcmV;_0W1EAP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!2kdb!2!6DYwZ940clA@K~y+TrIODp z1yK~o&%7QrGw4z1G?4;5?%8>I(6yIc;!=f&bjA1=iDFX8kE5L+LG$Y7iex_(U>g`s%F!ou3QUi_qA7g zk3#ZJPK_)ArP6%-b0;AI+}_>9J6MfDr@x`#tFM)B-w4k|A@@Z~-8f2z37+5Pbn;4y|8$r|!Z40000< KMNUMnLSTYsAj`)9 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/gui/widgets.png b/src/main/resources/assets/create/textures/gui/widgets.png index c66697998369d77153cee7a960943040cce882d4..0e8ca0bcfc5800ed30cc5bf7cc4cd91a28a995ac 100644 GIT binary patch delta 11529 zcmY*;bx<5n)a~xV;<7lw34uUx0)gOe!6DeZCXnD7 z1q;0L3rYXwfWJ^hCs1!bpldUf$ZEYW)!K4a;Z@?&yi`^Ow`JYluF!KSDK0r|1)8=e zi?*igdR`2EYd&iG-gY}xkt##5-F$VJ7jXAzM5UOfIJ2Z6ax>>Pl55;Fdj6d@C;ar~ zTkc4nhbR*2%1*%K?&dir*h#j()a%(Ud3u78<^X5Ny;h z*yWDEm-7NbMpHQnHc|=zX-pC}4FHmcJ(L(f{@U)5Iv3+cc2^U6oX}38=|J$~E_-HY z+{;JSzU3tN#am9zQf*oc(S9b^iOjE}$^YKLzm=3SzEhV`CJ9XW9jOUg)o`PJPce}6 ziO4ap;HA81GV8E5w9?2R<;6?>aTg^fa7jr9+$0}|8NGxcP_M>nJjdPJyA^Q!kjN4? zGd0B&ay>tqJeT^g}Yz0I7*hR$18tkp~V`x*>t z>myC!$~REOzLPbl`h5EZL_;JP?R^lG>(Aoiy&!6tfAR&*8EF;oyLWarpFhic`dHYg zZ#(nFTNi$}?j`NYnEx{~t&t2A4ea{ITIY;2wj>XIIQfI$-KZz|!>9Y>Nv^hG?doSf z3W3<(;5X|o8ImnLX-v3%*1QF2=3ToQ+s5X-!n-&jtZRwyG*YU9rLqzv`02AJptLi; zHXNpIi9IK?b1HqGBv_hNB&EhH-Yv`i;M9c3nrgJ9pepsiyA|dIiPx)u^Tb{(O;GeJ z%a4$eGJSbYGc|nK%<}u2NA}(|9HF~d$6IZI&6`INVD0bMv^TQ-@281pp8V+9Wm%A*l3JCb8eR<-+D3-uZp_h(u}DFqbe9ZnSj@wfM|W|20iGUFY^td46@c zyH<2nYUeEcTZ6VjP=c?e<3461LFPBqz~K0TCcLI0&>{!hbwv~~ZO|t%E_&LHIB-@G z#IL&VFq38m9eb*i8@6O4*TR>6jwvW=;_v=}(rWFn`Mw(!c`WF|$6@vPtXGVL1m0rG zMro>2=70D7j#iU9>|RfB2FRf0FeU0};)xiBja%R8Cg4{#)s^fGPa4x3yFCADo64S# zzJ-0`RoLaD&YD0Cb)j?fT6AA<_m7}AbG|+AKNEdA;{%x+_0qMIS+4TCTxePx#6=gi z46*6hP`!{BRX+KYRQ#&+)3dAKU=3z_^}qZCW@14dmrmTs2F!lQFl|>QABsk|;;vTX z1QVlPdX5 zX=7OGZyyG2q9$*sKnz@A8kt3~TKq~#9Myy8lI`&e2_$r9645xe_6%sH!_~Wl7tQ#` zeIgH9XZ@=|Nw_Jr@@g2Vljo?14>CI{I_Qj>SS&NPwzd!IMVTg6>Bgxf*EGpC^)+fL zT_c~#7+L@vy3BO_BhcKv&F_tv73%z-JWIC=&NsF=TjMP^B`Y_#`xW2!dX0MD__~yM z@8#4;5&Fh5R}!ymIZElQ-q>5+zrgE_rl|h~65}G}Gn)|N3?jt|8Q6GXAQ$MozvI(% z4~0VaNZ~*wM7Frkbw=NZTlLxpE`1|nDVgV^pcyK`&S$m3N^qa(j|-ZyrKb&)d1@Itgqjoii(Qoi%z2{ zGAITWNsD%F-|FR2QKYke_;+UAcHi5Lc#RMu;TrlbtZB6M?XI`Qtp#LT1&SjavioCC zyAS*+gzLV;59{_dGLZSOc?Dh@woeS<;Mo97%}m2?B9esYIVvx4)O@Y(h;yo+W`Q2m z?w^e!LBa_U|5##%hJH&J;3g47I6W8($H0Pu{SRcKa%Kg+@>6ya-{uc08+Qj|Tgdj4 zkjR4-q->bA$|H|f+E)bA_~7+6+3E#KMU@|~*Se97CuDwzt)il$CX9uMX9pfz`|xfv zU?j62H|o7}tgda;bM0=#rpChVv3kKcj3eBP_F-Xctdgx+=x6kN%nM^&%(e#KIAPQm zDC=$dlgrj|`lv4fH%Y<{4P%Tqz6w#td2p{mh$v#$HeLHl#eGiB z%Qq|(868;2kja%5Wh5jdbZYsmy1ImV`=+qpRNSX?jR_Z3wH`Y2Eyt~FryhE5D5829 zJ4UP-Nk96;{$T6CC&iE{sz~42Rou54&5UxKeVLPEk|XY_B;`ZAsFr9}J1;y9v5`8C zVG@Sr_zCCu`Q)@wb&GU(I$TWapZgcdilUR_Ko7##5Uy{W&n~Lo`SEa(;;0$M4jHde zo6QW#L)VZB`pV)|(I^0`3;%)8QDzbquy%z=n0~YC_>Uxm;;xF8Q;afr0n4mhyUg|| z<|gP|ZtSY^mhAlF*lW3qi8UiAh(0U-{3jMs@P-dgKKEMA{hie$T0zQR4NH#dBL zQ<4{irx)DRUMl+&B#c`BMq9fPHT&MV65Mq`uFj{#2C>Ip*8`4mxADZ@>n*|tO(H;# z$f2fjQ+?Eco^5@&DbbKmDqq(6nnLHh+>nhE@;qAnw%-wg)AvmVd=w?Kcrxqeb#PXq1sg5RXR_@%hOb+^3s>f76fFz#O6 zj9YTui7)JRV?e<@gZj;MwOA9sU-)SLef+h?y5ZgY%np3zmiSYqTw25~^EE}OX5=lU z?9GUWcDzAbn8fOXwN`2f3a)(%9j9yo=W8gJfke3|bbv=0_5!JYjY;pyT$v<|&&yJ&Zw!gtSoz4WzdrpaQ$+6zZ zLNZ?Nr1-c|sjGq!hi93*F<3r`74PFeOPOh0i|^5DmP$!?^`eSLY4nyUFj~vhR)i{1N0n(G*K+^YKY?Kr)6@C7%Gbp4 zSx6Jgi(cs>^afiY0b^pvc%Lvl=M#DLePY)TTwH%{3L>65aecB7F7fp97|A)S8PR=; z{Do$<0D*)&585`}2zp4^P&kE>GGPBQr+8p(oed60gN*`zSJBu;B+k^E}Q zVBG+FSEhg@crz2T2=qts>cME@i906v=Jc(IKku%i1tn6YW@5bwS{qtB%_h|W*vjSR zt$3gg>{Mo+4aDNBkqz7(wd1l^5c|@g#SJ6j3d?3bb&6!*yCIBQ zrKAFo#bC&^=nvJMkffohXx3(#?rYHyp%YbcYd#8`zS*fS^&8T5Vz7KJ70}sp0hOVF zRT^jdeD9V{_tPvsW6uuIztdp&WeNairqI3p-0MN6%d;5rLcc-Ak*gWD<_RreSV)mjXQpePghd1zn$gH>5bG3Mc% zR|Qf%<4dF9VB^y+;&VDFcNEovq68d;o41uSo41=qB;QXiEHEE&VRjMr zMH4UWzZHGxTDNLaf(P@U_GhOO&)Gi>9l6@V z<%}Y=zQ7OdLb*VHRg zJ_3kiMbzW1dwY8q-^Dha715xn6PSZvnZ9no?xM_n1e?ag#O)a&0`F~d637M*bYJ@5t*Gq2Iq!RBB>Vn@pr@xTPo*u$d{Y2P9} zTG0-2ux_X-^*(M4U4B0L$Ke}d5HXopB^Q65mte-v(d`HlLc%YE7R2`iM1!jP69Ajc z1$tMlq{|5>+VztCid1{k(YP1qAa3U&c28lyY5o24`CX_B#B}$B8-?mAN%Ye)8HC6% zMTi{CU-bYt(^oqMZX&*Uzqo0p$?hMo+8bP4UEl1l4yU~RjNO^`-l?#;8D2&=rip|o zfr7IS{{8y_w{Im1F-_H-ywG=B0$k2#tXCxLpSm^aXPesCft#T)cSOp&ghKk}V- zBAQZQCy2x#>+fHS`5H@Hp}T{c^JkPZ@qxWnlD+-j(fMe(^{bYFhdG)9@P$HVp~0T| zs$tRD+h}{&j{X292jRQ9gskbO+j_3x=csgj(d)lJa`}Omknv><~=hih@{sfsBdHUQbmgdFK10d z$&{_rG**Q6*?wR}HwM;`z8c+%P+n9ucYzl*m&2c^nslvv~Aqt9V`9Cp4iS}^w4ULzXuUU3?U zetn#7d{I4n4so_0ELb1GQr|Eghhk%hoMNo*ZID0v-mmn zH5mtbxG8k)E_5q?h}hR&>2hJw%B0~|K=Z*~NLV;HsWR$FCC4Rb5%{pcx#(}7TUKz_ zER(FDcc_t_LZSCrsatO+{U$6Lu%&Y9JF|xVI^G`GHH@mRo(W)LKKz#YLGslA(0Kb% z7SAV24dTzS;AiyfDs#5%-F1h&usM_i%~T$%PrEjN1aU6ku2JdG-<5+x)Y}I6ln;I` z0{)`1+ch^Uk6%Z9WYJjyUl?gnKq?yU|Mcmi8+GFTsSHq&lS5Aza8qK6TzOb$IzS2Z z1`B+YelCw~|tuTH^l3C7&%+n-yYB z%07hU^u{}kJ=rVlh|UDqnPkHC(pQ$&gGfsHFP*#6(B zB}6?u)y9n$CHUmIgS#rRsIoGyuKk2r=5=|;PDzX*Y0W|qsnNYCEbt`v5;+jxXhNUK z*TxOnE4n1B4F_Uvz5QtvD5jtsGRwB5nAP({q+8lDCllFsPc#d+qI;Gb%rR2 z((fTT6-pX9d#VAB$(b`p7-kS+)WGRM$^8kWXwqMV$j0}D(nMv|8PI+UEh7aa6MlzR z=R?x`hV{)bq*BrU?2OQ?GEnU*)Q%{Kjy~BE@Snwsznf=k`0UMNl|Hp2Wa+PBLh>KE za6rl=RhPxoJkO?zT(pE|N;4BZ&s|0woOSWrRm&)IRG=8rkwZDjJJ1Zn^yff{M~Kmk zll>R#ycNdRHIOl8=r}Oi!}hC^Q5x>eh$ikC-;zDm+d)Bg^c?KJJ`c$(pz|ldsScBK z7)Ze&3=GT8lZ^pau3FSFS9Tl6m}XFGiZYy+^fo>xOAQVe3Jn^8gxoh5SS&6>3v*@t zD`|)+w$;Npw7*`s_FlV(@q-`K*o2X3!a@MktjjgCzq~^)nCz#FPKxiC>9*1J+;oV3 zXm(5fyym7qhrTbU_o(GesSZHG{r=ZDa+n-~H5$HzA_ZQPqNXZiiylwa($FY0Mcc@h z2-yjHoe}Cpm5bicu_aQ~u#rG+;PZ*3Oy`c+yp5UJSB&)RmQR`l%<7ddCB<=b!S-ub zPx2B878nMW(`tsSxNk(gL!%BP6Gn!Kl7gidXs=}hcCn3vI=bU|Q2mee;9)hc4S=Y^BUobfXw|_+f}H1Fja{2(Z-8&h4n?o@c7pQZ&nYA=P{ehki#&cXr+1|!517A;^fO3J1HEg(~>(XqW?CpA^mNeoD*mBdSa^g{m;0Lzi~HmcD*E zT1<%d-R1bh)k@52kP4*dptnVtl$f$pr#pY2M~jEy$ec}q{BeVNIhU-V{b@k+Q{iHv9 z1++TwI#WY4Hlt$?TJz?h#ZE|LcQ(zY5=aCI_is#lABq-pXLy#wE;cQRf z2tdTFYA<5#$NY2cYESu`J(vu1P54^8H1>G)KK6Ve{q0x#&6u}9aLy5y{|;tm`$$*1 zWaaRNBLYyx06if1)U67~1Q3Sdm?OA8jv62ge{YHnLvx40yW4!6-UY-L5)9`L*A!Dy zgt|((|Eo>H-qCV(fB7L>1M8~~jJ$9$Gv3QVz3Y&j?$ACPA^ye!LW}Mlc`zR1H98>9 z3tT=>Z~ljKn&rYRvJ2JlK_ftt%1MxG^MeAuT7hN$`&^^eG*PPl+@hBX{6 zel(^=%D9Jq&Rs&&h?=lGeXrU%9Aj6$$X5@>28>`n4j5OlQ5EO#f8~s{7M;Ip)=* z=?E`eRt= z1&g3_AA|Yc{>CJtCjAxD)PqHBmqb-EzIg31DM3eJ`;Z+YvNlwS_~nwkge=O)s1p$h zNl8&nm_nv`vE|D+b~1io&My@I6cQsa@GIC~CHILU$T@R?=g_=clWQstJ19R3sj$Jo zX{Rfls~Ht)d}%}|JCjLGl26TXwq|$ti*9gH2B21wWsn1}mIzh4)1HG^1zA9?Y#=0W zn2IwlHz~&fId>orj7$yFkAWYXPfch8Jcv}rt76&NlN022{0X>K=kk%RxYxk4686~&uD6DstkTgX(S@# zEx4Fm&BVWqzW|ZKB*_RRK&&FnU`GGc`2=z=ue$^H7gqJmp!4+ckoq>8+;R3L?M@9i z|1mz!pl>Gb`OTiE%*!R0$lwcpCl}kMNQ8oV{zp)<42UH8BVUxy&+eJ<^CP&E9xvFUn7}V|j5gvaGIshw zxQV%trVK(F1&N7)KN3cyQ^$~t@K>>k;>c-&=;y~qBS%MA+d0EH5%u!mQh9Aq4k$3C zKQ!0I9aj|BpPu+{GF2dT1n})wgp^s%*;5>VdcyOE%{dEY9xkEDBP;Yo| zW9Gy^aHzqY7Fj`w*`)w2)9r$E*opeIH)2>IbNq?%@OilXVsFp>%+}aXI>#_=!KLtq z=t}a~p{;PoilBX7C9p9g_;B#mZ@JNneH~0a0)y}_&UorJk=gO_@u9xNHA%7L7q0+9 zP#`s=)DW$!Sd^9UmM#P4`HOa>$rP54J28@CNCQ>bbZu6ioSY=wI}2&C{vZu!gn0^; z`|XEGzI;Q40X9x=uc@iY94cDRa;Wm>2vEUTO@!OY;rnnz5rG(2odi3@BS*vty0A*u zIQ_Y9qq1m*S!%yT!{7Aw2f=*AU~wCiMeGBi)W_%6El)cwf!#1V^e?EB{1fLV;t z6B7Pic16qH+DYD-Ep&elxnIgll=i^w#L51&M$gKpnw|wq+TC+mNw|tLS%_s4%(Zmn=DtcNkQtM7OWNr()U4jv)o`sR?lYJ-d^Z<@e zAb_uJAdeY5_-T3Fq-i^*B5L+Cdj4&lMmHdoHbS=TD4rPf*zcQA_!*} zq=G0yMnr!*YTDp9`ggZA4F4EyxpFLqYsw}ePQT)jywM)IyUvJ{`|d|!bY~S&J;@*54r9yNc{8E=-vFnoFl^?NxSiE!9G`pS}?DRE zMnbj=*(5Dl_1fG2bd@->v+X7rx0$-kSMsMcyyL!+W;5YeFb&|Iqi8!)_F}XF%zZsl zN3ES)ODmfXIQE@Jfuiabi&|(yiG4t{D>XF&RYJONW>0NKf-yepspd!9Ki%Tou1zmh z&xOTm#Y27n)zcVRSF}sM-#2(Py?N*RNckLy)USh-L%a~K1c3yxA>q_xq&!;OQ;e>l zuFJ3VAJ&T&?7=omQ-oALz7w{~b2}Mc%hURxc4!Llr;cX3@wY1xRg{};VfGDnZ=LYHcAPd?+~8{ntBln%1Qv1O7c|+ohwA$czPI~< zED1)tk+uLc_*G$ukSZI9_4E9P>xt(_FvXj#MQ@#NcGL0*!MMa>7?gf=-qP7e*O52Pan8V$Ok;a|7fRKBiYn0>)>5?7vTC(WZV_52G|L)3(KWXEb}+}8$VPrKDe9=z zpl6Qe-rg&dHuPfXv(*jJ86#PkDocLO&d5xRiaUq=h?mlz`<|^gEzT~K9vFI?nQ+m9 zgU^XMGTg&~L??}phT=FtK@?lF1%1LOdrrqH?7|gW#n3IZX*46p2nd`{Rf=nU zbPPuhF8pjjL{ugE+qN{<@6d^RY)Yap#_iAQuEC!0q}C;5wKVzb?{@W-TdhoX>J2uXUBfMh3DtVN*TY`C| zDq6f1X_M(q-WQs}!S}A$j6K0QlT~*dD`{@un$2+ZYY+bsVu$=JwW}6LBaDzPycqG` z{Nk}Q`IuC+o)a;ksxo|KPPvWwEdttfct#)KP0>8Jn@)GI1fW`wVey2T-gpp5K z?kwUwbwfW5d@OPhb`oG8Vb8+We>9CP^v?PFF#SCaMS-~s zb5Utlc-L3h`|FGZfN1y!0jZMzZ# zr8(!*%dR>7!qpT?w>r!=MO9K=`WAG4X+1sO5|pr6ea9!HG%m*G)Gx-&rmt`ac}*$c z{w=Y*IM?mz-vMn)G}}-=V|Advv(_X*-QiFQl|EH! z$oe6ds!OK{wPq(K(U#^WF{*jZ={B7{jtlGD1v&o2lT)e-YYdK#H(HPXWNrj2^6&x9 zxq#M9CxN2M%Gfs~Y&lXSWg57MtKUh5b`w*z_pH{1z|Y#q{lAWs?@m4S-WXo^Lre2s zPA-j$f7q_by+|?~x^iWkYplaY<=3I<+H{sIs<(TO9fY#$Jfm6+uMO8MofkFV`lz9% z*?FTB+h<$QI2B>_c(1D&<;w4Iuc$lk4%M&Q-PpWJ`o@YP<(Rl%_jTw+cB2#Xzy@o< z2Bl)H4R8bhbdlPiN`z@6IEcZ72-edpnAy(>j+j1u|8v*<&ZnvRkgLgT%Unamo+&*d zEl>2GLcjJ4535dPILf~Qos(ZX?pK_;4F{CYTR*kGO~KMIpCkXE^({J@$Nb zQ`zD3-aoVr^HLK6)+i7UFa-gFpQJ*3d6U zAGEdjvS(no`b@&M_Lr@Uz)z{riE*KVB4gVh;b$a?Rl!wf_Rm3PASuvj zg|DkB&-*zi8ETh}Z{n666TYo=9I%;_s~A#P(fYk9##!wGj-~!HjoMKFj(_-)x}ly$ zc&XJn=i#Tkgval2>;6O5Jdcl4Hbq#4)4+_nnwYDd1HUegx>;6|rvSWPq&-8g$J{1+ zQZ2L$IjX@K$EE)C#-U9e)j-{WM@vsa)ox(uCL78)3h!sA9gQ$Li+G(yck0IQ2B z#Bb7TlJ)FFSPOL|10I6sq68T$>gE`gx4Ws0?aX=J&qBhgznu|l6t=@# zh3|dbJS9|@Dl*i;V@n#RXL(bU9k*z5b(OA?*j3k)q~;f~pKd6TE$iD-4k>0V&9ASq zS5qG{&~(S+cl`_cm^7&#W{JaE1lZ;o{i>X&Ij))8wVu&(QS3&p54z|5Lkg0e>6^I`YkF*VNy{2LQf;%y z;+0I78U03Q)AFnpZfL6AU8GL7?A|`nxRiowsRb>9u}V#$pZchV%kA^qfNQIV3ujZP zCzerOn^4D5=?1iD$B`2SRQli*RmYCw-0qzx+>El-IP7x`b7SJ3ZkawU-9RSWtceC| z-yKZ*c;`F#PPVoGMlJRDI-1JRm8tL)k*U>X;C$m9c2|8E&KyDndP`Wf3PodVYQx7ssr3qLbTfu zc;C0Y39%TIC%_dmLktMc^i|ZKsniAomK@87WF0UmLCWC_R|bG^vi>_^WGE6OPW#q{ zbn}deNKMPjQt7Pq#-fA~gqiyWR0Rr7DMgroL!n=?JN$XBfv32#FfYgPaGqdD2k}7Sg*%B}uQX=G?>!jYZr(~su7w8D z3zl^+#9S@o0qDWzw6OzQ5hX{yPwQU^o;SRvYSFrlF1W>MPSEo)s|roJ3qRxc+O~k_ zFAP#TdGKOweTIREtGrZcd0BjAV1di^)FD_EWGdMU3VacQ_QZz=r5V=PoTGv+(zL2P zgHJN|dMR`>>5-(pqY3mb1&NG*U*%Ym$0DG}#`!eB==n~ej;}g!Ex8_$=+B`(W@uR6 za!JC)kqrI;dUPDU`=&t8h~!<`(A1l8HD~8#OFuz%ySvvPua#-p)>c_^6n61wX7ciC z&@=t!XZ@r#slEQ~y>v54qgmeFw?o92`)GJ3J~Y-F`_O;vL^*kJ29RKJ0tY?S<=f!DRZ^wbSE&E{|B#i7CHa` delta 11633 zcmajFbx<5n)Hb>-EV9@_a9u(OE(xxS1_=Rzy95pHy0ExwaCdhJ8a%iMf)fG+cL)I% z`}lot)&1kGTlY?N)l60QoH^Zndd~Aa-6sZthVhz+RC#F$bx*_NY^)?I+4SA+_DW<~ z*IbycZ#jbwe}k<&AG)dd+vf8#GH#r-EfX4?egHlf`f28px%L#WU3qbeuJ6wox1;O0@v=!4jVm34gRQ&$ke6>?vb^LL z?&j=52)zA4Vrdn)>ap(oH^u?pFG2xZ_cg|N*!zW_DZ91HYIF-0efX5=#Us7YCdMtT zuBmGr8d_J)YNzNMZXCa{aRdG z$;_>mI18d%kuLn``6e}Wb3i84r7b)X@eo@1N47rS_}7)AfIBn>SL6GkNQ9@2fErEg zg1r*+SnzE5WdCTi?+R|UyZY{}+`p{h9!7(<-$1!7@*7{H(~9(DWuRw(q9<>@nmkAkUi!t#Nu(tM&eg(g}J6gesWA z2I-oOem^T^q>0!&kkP8xitX=6s%<;D#9!=sf_48DyyRjxdP=2z7{>wYp!qtV07c?R zmIjpjp-;s~3`GWGRjO={2d&yiO5M!U0%fr$G&kYpmJIm=en59)XmwGPhm#LUR6=#T z`*x`B-9HA=Fz$JvfM+ZH2-p$fSlMOv@oTy@rtoIfWQJIFKzwGe^dbdDm1Ir-%bUcg zC6J0_2JHq(PKa;L(Aifh7}stn8l7&lY@CbKpG}~=UH#tjp|zl zvXwy=#bQHyY#8DJz_H1ZIQnZPjaJ4gRh;owv>hjFKYk19Rz!|An?*$koyAe2y(L|! z&)u?&1zC1Rr|B#<7nF1v1$>o)3EA!mIIqZl#4#&{%xQ@KwRdJsD2gFSPA{Z|@ z*yz~r5_7Sy| z=piyWx+n5QGW0qx*6#itbN`I#jn)A0ufrSL_aa_`#fM3>qfVXM3fRu>*~sEh`xX=W zQ^=rl=%`_~?TjUm{tYfK5h>P)czfzK1Gc{P$x_C+cZ;I~naK0IGwymAKvP;Ipi57nk3X-@AyIrfe&SXZX z=>oL$m&4;`2Yea(F@k0=LvA)D6C}37mOz4V3;veX%7ro!EJq4^ccm`B(p2h~i;t@A zYH6o_;Y@_m`O;KHfSKkAX@;kIL?V8uqYDD;%R;)MLz9}C9rlfegOOwx*$=0o1LLAE z#Zk!Ad;Qbro;luCOwJ8t@?Ui+C+boE-VDFJxCubT81FxC^t!YVa@mOn>xIyYDMI*s z)hW>YjE%*ye3^(8FuQj=T~E-R6l;A403$0f33kfR^;X3x!=CMsgQL>Ngwf6@fZ;;$IvxNP}4lL;HZek1J< z+&?-hdY(izYAKW(xY)(r!zd>cQ{Mf3KGwK6RNU9scW!+>_beYRmKLV8!ngWv7oYt0 zXmu2+z5I>M&hW;N^j3s}IQE?>(eE8zqG%S_uqvrB7EVav+{(MZN1?n;L!R_$A6^!y z1xgmc-9dgNtDjQLnwG`pfwnSdam>GH3my#%9>ofN+4sYSy`8pGvi~-e%ZU?E;&~l` zH{kB09+y}3d;z>~A$Y0|@na?%w8jhl3ZRW3%b}`7VN5E7+*RO6_!M)h3W|0uEFxRj z<43X<#i_&5^4F;Os*fZ`MeBu8yPyUD^3|S?wl6M{WiPP^x$js9^e0qN^VSaq_dCHb z)G{1DKKk-l2hS?Hu;c;i#4@VgoC_%ZF*&5xj5J^A19DOIh}o)EgH-&476BW`7-lL) z(ts9pCl16-*kyPg6^A{dfj}9#9MBg_lo2C3N zRQSpD9Cp)-pHv(BI=mTJ!qi%7>XeAbLcTw^0^M_SbCYLG;!q+JE@$T)SFU!6|)$aaG zSHZ?u6m8b`dT-E-f{h>z`2PS+?fMA1J~qrYdOK18iFn0y_vQ6^SgIPfI3!qpXCsDk zKgtOC#TnDc`a2L3yqfU2PV~jg+(0Pi|6h5PZ^W0j>)f_nXMQb5M!Q$XD5hYA8`i%; z) z=xbiLOzb@E>R&DXA3K&g#f*MPN+y&g8*xa90AKeyEzEa^=b@h;AtsyY_xLwXCvOX4 z?Q;2+c;4w|l=Kjz89kgBtsV6pUC$|}V^`hoE$8af8f^j9!Tx@NM>@zP(o{C;#EsGd z4xOewzeAnza*>+JsBo+*dqq`S8#S=Y4`J8)lb_+`t~+g2nqe)RocdzIp^j1iSYJ3f zDXGj^r38wpMk`E#K=Lb}zQKLQw=DL{HF=Mw|XE}x*r<4@19tN@oY8&%b>WiR~K?M0}GJ{N%fAUM?n)mQuzc zhK|yGckHvTg)jC9cy~*;D4I`3>^Yv2yPb}&ad_&~s!f3NW$ZJi;H!bdGbZ!%uZj`7Q^b>xo~&$G1Kwn|aOpe*F`mvH*52MeCj_+P?P<}4Kt^+N zXxg`8g&hSd%4H1JKk%5CWJ?d z+u+Y|7$4F`ki7_BG5wvar^aQSh8`del~3c@a9nKuJo|dN%U8Jb z{$gwnvAU}0^Y191)X+2F-|>oUZ5NWI^WU<~OsCKFJNM&d-f#hd*h0IN=9pVO`*yLq zE!$K=cTApx*}gc>_?YK0ZhwviYT1^V&h=ZdhZE8%k-9ty-Wx1r5yx%PzsH{1cw0M!DCazw{wyI5F75UqPd&$T6H7X#m{+Od z^pRKVN4ubT#lS)zVrbI9qM{e=@I~ z9Kpw7YVDDKKnV`rY(NP;0L&d>KOH6=} zA&@b>qT%=c8Qa`*0kak@xbF&@1MA z1T#n37guUyHMwYscTy#d#1I}~q{-jN8Vm~%R7ybx{YlcYj=C+=t;wxH!yjs|wpWG<{$lUef2sfwQ+l-4EP zvUSVOIc*B_QYG?-MiYExJ$txbcUbB0aQMVX+w={>w$>nZ^V?;NdbhPz5L#xqZjKV$ zs4|$(H99u7rt-4;;n+cAsRF@;tpezL=xn)1#>LINpL&w-;S@Ueg`$V9nPPXe8{8;jh7m3Wq8+E(d+sTgEo+yr}#bvx!=vzu@58_IQ*d+_axui|QwIb!nieyV%Y81#Uj=B}&I;n1F$j30 z!cR3nPpjA@CIK0YLmU9p=ui3PK`)kx$+op+&u8=Ro{S5w0_J#8p6$|@qZEOUJv~6^ z^g4htRt+o02JAN_OmEDYG5Z$f;bg%e{(KPBN~+^=ab)bZH`6CAA5>#4<1ITATbjr& zp^skmvbdureumww@mSha5M9=-YGr(ZPY^XoaD5?#M$;(5o5c8K2hfxPG8@tVoSuK& zzHY~U(*u@%b}m*GunZQ*&e_%cD4-hX#SuOs-d20;Tsf~5G_Mo$%jGpDgFC@9y};o= zi+B^#WGq8_&^!DfeK>1X{PNj7IVM2UuNP~?i@TSxWq>*>jH?e99N(Wi1!ORS$TbZ< zSCRcdI3y+NpzI|F?sZ$5l77-AqOTSsLZcH^_%&^9YK#|iE$t54@p~v^1N?nz{EGc% z9FYzt3O>&-l8ZyB`>kZ9WgON|Gb945@>kr`iutdF1@$w)g$#y$d36Yd(nkAe8QaO@ zU<^`BBMY&)W{}etro@G8Ad>%VC}tib*y6EPd__8dF67p~Y0S-ml5yEV8_G>$N0K<( zyg!>?k_PVs(YXAkM6b)JJr{ZKP0fBmj6F4v_?W<$oX9gPH>c?NZ&g)_)KX;l&m2ox z^h!PJlI%k(h~ufe^SHy_>-cAOll9d~(rrx@0NrH#aEr_Ut?4M8gt+(5LI(t4>O!!D z|LiZuD}!S&{II%Z848D3-$29xCTL`KVZZ5dOZbC{f%s~_$i#V?(S4BnrSG)TjK8V!*tm`@*CMGR|2$_>j{la0TmgO#{kv+J zLHU|mSqPfM|1Kp^?`7MDl3g=hB}fSuWcuc?wz~!|mPWJ!?s$+?A75Kh!9qZTeRq9Y z8b;%d+50{p4ZIZNoy)~06xbO0VZpS<8lm`WOh1k9ehBtWnb#h1oyh)!tXP8CfBk-k zzsa~4NSvSCBTWPdrhV^)xE(XvEOoD(h#6dz;PuLtBZ!JzM90tMpoG>Z+^R=~g{+0lS!geehI( za+a`I53qn(?4@kl>`$#&?F0cw{AW6FKCAOor)Unn&uw*MW;d{aa}s(|P$YHxTvEE; z-f2~GVSa5=na$kYpJB|f=p;nQsRHy`?2BV4`Rz3@$a^Yp7X!xjUq=>s;XYLwJse!= zqKI4!)1Nte2d&wA+-KO-gcc>znQ$GiJc{C+_Sg$m|JHB+X~H--2cn{I!aU+4pM^{|N^rkmye7||out=#cztu|fmIWT;IEX-N+63j z3MhHG_?BSYZJ)4{_a|jXjuuZUu zO1D!NxB3bUbX*x%t1msF9z`Hgn$c9n#KsrWxhx15*c9!$9%>h+JG*ZLOrQ{s7ljl2 zdUct8geD|8!+CV#F88FF7xpA%KdI{=nE0y3j-N((+(aZg#wf<#JzOcjkE(t}T1v#9 zdHpGO<9W$h9V0Y6dL+~0f(WEA!hvbXJkF;H2Rp68J0EvfbE-Ak=h2YX1p$)0re5ZO z46r>ATy)0ZR2^v#qbztywI~g?cw%|Z%$G?sEt!Vdz{$R9%)N8bOGae0&k`i?3+i(? zVCc4*{K99P`_IwmSkugRTRNI^@C%~7$>M9qiKax6%w73F(5OLOlt$RzRxFhQ+*#fj zlq&Ha3{0#eXM5qkfNp+pxHSiF%znlE^TDF2FDUVpoE$PfP`u9$0HVJVVG zMj?c_eGDhO5Q!5W`5qdmQuss_;+ng{yJOz3`SvF_!Nms&3>62_o#_x^b9a1j-%&49 zd<_i7p$IeH>0i4oA4+PAdlbuxSNsC((eg1qm)t|q_0$G<8vxLe(7ZhwD=ymhJ6y`XD$I^Mh2&j zMIEsTb%vJBH6KzFqCSr{fdMY3ds9+aJ;0u%JdGPSeIa9%EHPi*5Y8Dt1VA2~x2WvY zMPz=_5A5;JyNXuNB2Wyy{5fB%Pm76mG%+zjhBJQUrYL9zU~lj})P$rT|SymGDLYrtQq_9v6r zeTkd;8%FtW+R}rBR9+S z&~f$Y3I;a75&EC&%u3@>6#9p>-Gy5G>%V`eSKC}((BgE?k@RHn+F*8|wCUF{UF){` zZ4p6234hlpZf5<}@6P$!!@E(;L?v~*aTj!ad@KsLC08N}PM45Gporhl^&mr_Rp2?v zeAp&dzAV*`Dq(aJB-dKjErTimWZ!b9{^7%iE-}P#N3&T|2rz$Pi=s70?p48NJ_Is< zD=Z|0Y|T=@qabC)A~vMP_I;6xhi<%wf`);qa0(OLH!g|2 zn^ycONgupHiYAdbOHG`(PK|*G))8MWZa>x4r8wQ^H;hH`@=ke-*-8 zqt?_);(HZ*}c0K8R zW(X3Ta3JJe$Rpox$K1{zxlI)NFZ7pQ>E&)wU?Y+5T&iE(u4>nG;WA;;7j)w?(}3Y!q0bkVfM zbB^rqYSEZp?|!nbFv?Qaf+OoqNLjSU?*8P=%4Y^pnO!rwS68yg8stDRm-_9ISScKw z8i9+>CAlJOf4vcm&`xg1W_+l~urT5L1@s8w-T4BN)Ejd&sQTXv^maC^nStQ{k<0oN z2SN>ew0Jbr!la(TNfBvAY=-Rq#J_6}1Mze}?AL|*OT5~UhA_J=Qu}ZtKaF$>|4ZFp z2KMVq(z$m-Pon}aRGQkq__~4q&)jWTEgk>R`5RDF7zX|VI4O|LR1?-txV%z8>YScV;OoAD32wjtg z)Ti+3Y=Z;iss9rQb)usa9XW^-y*aQENx(fJN)?Qy9^HAfWL8W`cNK7+ZLBi28S4LI zg3VtZEq9J)GJOec;|rZBAkm-15w85y+`*^+2ZGNSDc(9KM+zO&2CdIdi+AvMOTfAh z+g>gF-SJAc&_LUn0@0Pe;zPUbSF5(Rv7dPEU0$z){k@9ak5FhjVw8G(sq+O2`k^x_fBxO#y)^?uv{9IcZr*;vI9O~Pu}xL@5Z;wjy5b*7|`{yfKxSAES& z|FBS*CxRIIhsbNOAy^XtdE~b2?{9w8oF-<<-O^MLC-RTCF(WZ1B&$9Ps{cbAY)k)) z*e%{XPq4{z7J)_uo2|Sx$)E#6vG;BfiYQ9K%B$^32z$i(b_0{#FnIysb-3F(z6F3Q zBln~uG+o^AzNBy|O^BEQ`iC&xIRh}CVuamI@~6H4(eYS&Ft-U!CnRzX@b3A>%ix5F zsGsl3TdahCF!GqjA^)3&54q62q{H7-E6;IYbNN}6vK^hu++Am8HKTlbONY`vE!d<` zQ`X0X7|S4qcJtDT8`_A~!r}r&Q6m}>Uqq1j39=AQ4i7^=GBG5K1SMs_)3I zC93*w6dwBq#7pnF`xj2M#fK?(8!!Hpm9BGC3CtZ!Buys?#paT&h(Wx!1NAWVo z1b*UdQmRAGSsa3|pblv#T{0?9C7q<2Z@3Y64UZ4}l>(H(Pt>$rX!Ryexa@5f95VE8 zA_vroI=`MWgH;AGO+kYPO>N!)#jkfF)8J1$f)O2g~27ilfk<4`e|A`nDm z@wFd>Zma7WhzA5n9PA&J{;GkvWy7R;yD-185Im!!Y6rFQx4N{=2P+!vEbt%tlNczSA((kH&TYuZ5XV$n5j2besZv83@{1`yDhSEWBzZnU)*j*09-!nl0 zruJ=4Gb04=QftkZKKMnl`q?_YLcK~ny5LjW3HE)*bGW!Cu@t_)IVCQ-#jee}@3YoW zN(*^SgR3Sh%N^2>BIM&tOPoxx^&(k=m#5SjG;pi$JxN{K+v_K^z9xI_$&)apr6O}_ zO{)6QNz|w|6X~OT;U!qUy=REv=*XPR7L;UgpOKBa)TV6nOj*cC8} zZ{~-+Qt0V(1ov$Gy*p{Qet>%~e6ZQirq%9kTa%_^%(lT&y#byF{S+_F=-B_>%dOsB zm-5T2pCUs~Pl=-=Zgz`^`uAH5>ZYSn(4R?{9}!ZepJyVyy-$sdJ`5DgxIPNBAWayF zNsza#X*-$|#Sm=Y!;M*ly2rM#)qqCorIePU+Zd_p?ukX@by#^`p1(Ea!SKG5+E6}8 zM)xNIcKznG6hjY&U-A+wVajr$;8QXLnM;B zGwu~S&Z5=2*Lcp2{!5abe@wDpbWY3T`AyqUk}%0kdwIfsa_T5yld}Ex)O`JqOs0K# znB<7Qg%@ac_QO>T9tbILaHp3hP1Rut5W8M|tbzh-d0A2PW%kRs6(wSg%kuX2SdGGLrCfLv z343Q~&B~el#a+}0NzhBdsjKDT?PwJl89}da#jXvV5hR>m2;pk|E4&J`fEZaFx{#@a zsKdYB26LWE)?yg^*|x&s3-d-YT5R2s6gwOR*a@>l;YN95)>=RMyjZPz{8EUOqm|sV z^LV4yWflzE0v@ha9RBiz9ChAbd&G0Dzjt9#U>?41J|6$5JMRfH_!@a?WI`~Y&vp;D ze|!m($wuj_LA<2Eyq-=-m=Xyr$nvSle&wSr zRpD=OXD>|x#cO^1PBIE4nY3@{pwiEY(#vN0N@HCj=g9TEnl*=kT9v_z*{6kl2XFo2 z^xvrYsJ}%7QRd{EbfKxA|>@DB-8T{UwPZ=n!3{(1=t^S#5O2-{_sq>bnr6H0% z+3zRPI}$NEJjt%)Ge!{k_gY0+7W=l6a#%yVk3@kwWKm(-Giq05$Vm(~>9O;hlBH%R zgOX{K-HRF41labvTnct?D>HxMpg0m$o_T6X)TgXrz+lDE25^XBbc8+8=yS3K%$JBB zw3KzsyWtLXlr_DI)7#DGP&AYPQNsq=ne>39lZdY>=UJdX&Uc>;C*Tx&+~f9tB)o<) zV=i39?g>~%D~EeY^?dhGJD_Kg48wU#AR{>o9gVD zK?wTLpXm8v1Jh2+p0%5EAtcH8>RR(mtibKw24UEA`fy9j@xmt*Z8DK7(SBeV(jmg< z;@{yf8&{OGbw^VG)PUA#7h@m!H18A$@0PvIc+7#gQ3)%@)}4>mp2X?NA1~ObUX~m_ z1G?sCRdjK8T`v_b5bLw<9BFlYxnN z>st%|h~?A!6aV$e*t0Z7tqQoe)WitnLJeF4 zCw#sB0CIIa^*c$diHE;7omlYh<5IRcv@Uu08qKi2nLMV^rM>DIvI@Q+b|l@M?n2d> zxIU=th)DL=MtNOpcb`W1?`y7?h?BBrb*Hx+3Y*T`+=&ZAFnVI?zW>6Z`HQZ2rE^sM z0sPuO++;Rl<5hs@2*qm~^7mbl83=2Ny=PRw^n8#p0Nxb{Kd?O+<5D;{n47ld| z1F1KCnxdVW!q1^wvPlJb^q68TLGMl#>vR|UDDct*OZo7uIZ@O@CeTC&fobM^6n zyW9D%`esg2QgWq0rY7LjP$bn*$c!y8p)R=8<)-+beLe79gest=+CI;hak4Bt*=?IJ z<*W&>``1rSuyN8bnLpPSWP_Hz01%uWDY8QEPgz6?#_Ur>ooZ$Z7%#h3eee~MNc%k8 zC@K;Gdf{E~4;?4^lTJg9;Kg>_!OvBIPpd*Kz{ta~ZT?3|bad`KqMqE-C-E=kXy$ow zSDFipmwp8+hI%7SVSepGZ?}K$rdM(v9r%3egr$>Bbv77Ua@4S2Q4H#)ighQP$ncS$ zbQKBHQgt83T1umsLEqrs+`0|U&j)fPdRh$;5cvIHiW&UMHXYF=Y3l33#2W{%lZ05H zE1sF@0@)G;)O)d+Le8W zO%OcO5Mn{@ZX${em>yCtMXP$R&domdyl0QhX9M5>em$#Sb5N)S$}<}#szX0>`}j>4 zE3D4-1)7NkSA~T5J`l5ST>82CKWzUW%rDdgEE<56Ai?SVWkmjd7~J(3jidgy841IIjbThe@u7|v{+q#<1^QIh%d=frz4EWA0@MqX$;~_i_ zdCgWy^q;N8*&QMt6`wcs##L=UtnfwrN8cj9J+tdZGQGQ#CsvaGYW|1RF##mf2A;Y3 zGr#*^kJbajW8#5aQS#p8Oe@jb43XvH9ERWPzKq=^9@ Date: Tue, 29 Oct 2024 17:59:37 +0100 Subject: [PATCH 094/515] The edge case files - Fixed packagers having an unlimited queue for requests - Fixed issues related to factory panels with differing frequencies interacting - Fixed promise creep on deployer inventories --- .../deployer/BeltDeployerCallbacks.java | 2 +- .../deployer/DeployerBlockEntity.java | 6 +- .../factoryBoard/FactoryPanelBehaviour.java | 78 +++++++-- .../factoryBoard/FactoryPanelBlock.java | 65 ++++++- .../factoryBoard/FactoryPanelBlockEntity.java | 11 +- .../packager/PackagerBlockEntity.java | 67 +++++--- .../packager/PackagerItemHandler.java | 2 +- .../LogisticallyLinkedBehaviour.java | 64 ++----- .../LogisticallyLinkedBlockItem.java | 14 ++ .../packagerLink/LogisticsManager.java | 158 ++++++++++++++++++ .../packagerLink/PackagerLinkBlock.java | 2 +- .../packagerLink/PackagerLinkBlockEntity.java | 22 +-- .../RedstoneRequesterBlockEntity.java | 3 +- .../PackageOrderRequestPacket.java | 3 +- .../stockTicker/StockCheckingBlockEntity.java | 56 +------ .../stockTicker/StockTickerBlockEntity.java | 6 +- .../StockTickerInteractionHandler.java | 3 +- 17 files changed, 395 insertions(+), 167 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsManager.java diff --git a/src/main/java/com/simibubi/create/content/kinetics/deployer/BeltDeployerCallbacks.java b/src/main/java/com/simibubi/create/content/kinetics/deployer/BeltDeployerCallbacks.java index e18b1d699a..091033b9b1 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/deployer/BeltDeployerCallbacks.java +++ b/src/main/java/com/simibubi/create/content/kinetics/deployer/BeltDeployerCallbacks.java @@ -153,7 +153,7 @@ public class BeltDeployerCallbacks { if (recipe instanceof SandPaperPolishingRecipe) AllSoundEvents.SANDING_SHORT.playOnServer(world, pos, .35f, 1f); - blockEntity.sendData(); + blockEntity.notifyUpdate(); } private static void awardAdvancements(DeployerBlockEntity blockEntity, ItemStack created) { diff --git a/src/main/java/com/simibubi/create/content/kinetics/deployer/DeployerBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/deployer/DeployerBlockEntity.java index a83cf5ca22..1c2e97900f 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/deployer/DeployerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/deployer/DeployerBlockEntity.java @@ -337,8 +337,12 @@ public class DeployerBlockEntity extends KineticBlockEntity { DeployerHandler.activate(player, center, clickedPos, movementVector, mode); award(AllAdvancements.DEPLOYER); - if (player != null) + if (player != null) { + int count = heldItem.getCount(); heldItem = player.getMainHandItem(); + if (count != heldItem.getCount()) + setChanged(); + } } protected Vec3 getMovementVector() { diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java index d001d84791..825fc78cab 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java @@ -1,10 +1,12 @@ package com.simibubi.create.content.logistics.factoryBoard; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; import java.util.UUID; @@ -12,6 +14,8 @@ import javax.annotation.Nullable; import org.joml.Math; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllPackets; import com.simibubi.create.AllTags.AllItemTags; @@ -22,10 +26,12 @@ import com.simibubi.create.content.logistics.filter.FilterItem; import com.simibubi.create.content.logistics.filter.FilterItemStack; import com.simibubi.create.content.logistics.packager.InventorySummary; import com.simibubi.create.content.logistics.packager.PackagerBlockEntity; +import com.simibubi.create.content.logistics.packager.PackagingRequest; +import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedBehaviour.RequestType; +import com.simibubi.create.content.logistics.packagerLink.LogisticsManager; import com.simibubi.create.content.logistics.packagerLink.RequestPromise; import com.simibubi.create.content.logistics.packagerLink.RequestPromiseQueue; import com.simibubi.create.content.logistics.stockTicker.PackageOrder; -import com.simibubi.create.content.logistics.stockTicker.StockCheckingBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BehaviourType; import com.simibubi.create.foundation.blockEntity.behaviour.ValueSettingsBoard; import com.simibubi.create.foundation.blockEntity.behaviour.ValueSettingsFormatter; @@ -73,6 +79,7 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { public PanelSlot slot; public int promiseClearingInterval; public boolean forceClearPromises; + public UUID network; public RequestPromiseQueue restockerPromises; private boolean promisePrimedForMarkDirty; @@ -102,6 +109,11 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { .chase(0, 0.45, Chaser.EXP); this.restockerPromises = new RequestPromiseQueue(be::setChanged); this.promisePrimedForMarkDirty = true; + this.network = UUID.randomUUID(); + } + + public void setNetwork(UUID network) { + this.network = network; } @Nullable @@ -176,34 +188,55 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { tryRestock(); return; } + + if (recipeAddress.isBlank()) + return; - InventorySummary summary = panelBE.getAccurateSummary(); boolean failed = false; - List toRequest = new ArrayList<>(); + Multimap toRequest = HashMultimap.create(); for (FactoryPanelConnection connection : targetedBy.values()) { FactoryPanelBehaviour source = at(getWorld(), connection.from); if (source == null) return; + ItemStack item = source.getFilter(); int amount = connection.amount; + InventorySummary summary = LogisticsManager.getSummaryOfNetwork(source.network, true); if (amount == 0 || item.isEmpty() || summary.getCountOf(item) < amount) { sendEffect(connection.from, false); failed = true; continue; } - toRequest.add(new BigItemStack(item, amount)); + toRequest.put(source.network, new BigItemStack(item, amount)); sendEffect(connection.from, true); } if (failed) return; - PackageOrder order = new PackageOrder(toRequest); - panelBE.broadcastPackageRequest(order, null, recipeAddress); + // Input items may come from differing networks + Map> asMap = toRequest.asMap(); + List> requests = new ArrayList<>(); - RequestPromiseQueue promises = Create.LOGISTICS.getQueuedPromises(panelBE.behaviour.freqId); + // Collect request distributions + for (Entry> entry : asMap.entrySet()) + requests.add(LogisticsManager.findPackagersForRequest(entry.getKey(), + new PackageOrder(new ArrayList<>(entry.getValue())), null, recipeAddress)); + + // Check if any packager is busy - cancel all + for (Multimap entry : requests) + for (PackagerBlockEntity packager : entry.keySet()) + if (packager.isTooBusyFor(RequestType.RESTOCK)) + return; + + // Send it + for (Multimap entry : requests) + LogisticsManager.performPackageRequests(entry); + + // Keep the output promise + RequestPromiseQueue promises = Create.LOGISTICS.getQueuedPromises(network); if (promises != null) promises.add(new RequestPromise(new BigItemStack(getFilter(), recipeOutput))); } @@ -215,10 +248,10 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { FactoryPanelBlockEntity panelBE = panelBE(); PackagerBlockEntity packager = panelBE.getRestockedPackager(); - if (packager == null) + if (packager == null || !packager.targetInventory.hasInventory()) return; - int availableOnNetwork = panelBE.behaviour.getStockOf(item, packager.targetInventory.getInventory()); + int availableOnNetwork = LogisticsManager.getStockOf(network, item, packager.targetInventory.getInventory()); if (availableOnNetwork == 0) { sendEffect(getPanelPosition(), false); return; @@ -233,9 +266,13 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { BigItemStack orderedItem = new BigItemStack(item, Math.min(amountToOrder, availableOnNetwork)); PackageOrder order = new PackageOrder(List.of(orderedItem)); - panelBE.broadcastPackageRequest(order, packager.targetInventory.getInventory(), recipeAddress); - restockerPromises.add(new RequestPromise(orderedItem)); sendEffect(getPanelPosition(), true); + + if (!LogisticsManager.broadcastPackageRequest(network, RequestType.RESTOCK, order, + packager.targetInventory.getInventory(), recipeAddress)) + return; + + restockerPromises.add(new RequestPromise(orderedItem)); } private void sendEffect(FactoryPanelPosition fromPos, boolean success) { @@ -356,8 +393,7 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { return lastReportedUnloadedLinks; if (panelBE().restocker) return panelBE().getRestockedPackager() == null ? 1 : 0; - UUID freqId = ((StockCheckingBlockEntity) blockEntity).behaviour.freqId; - return Create.LOGISTICS.getUnloadedLinkCount(freqId); + return Create.LOGISTICS.getUnloadedLinkCount(network); } public int getLevelInStorage() { @@ -373,7 +409,7 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { private InventorySummary getRelevantSummary() { FactoryPanelBlockEntity panelBE = panelBE(); if (!panelBE.restocker) - return panelBE.getRecentSummary(); + return LogisticsManager.getSummaryOfNetwork(network, false); PackagerBlockEntity packager = panelBE.getRestockedPackager(); if (packager == null) return InventorySummary.EMPTY; @@ -388,16 +424,19 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { return 0; if (panelBE().restocker) { - if (forceClearPromises) + if (forceClearPromises) { restockerPromises.forceClear(item); + timer = 0; + } forceClearPromises = false; return restockerPromises.getTotalPromisedAndRemoveExpired(item, getPromiseExpiryTimeInTicks()); } - UUID freqId = ((StockCheckingBlockEntity) blockEntity).behaviour.freqId; - RequestPromiseQueue promises = Create.LOGISTICS.getQueuedPromises(freqId); - if (forceClearPromises) + RequestPromiseQueue promises = Create.LOGISTICS.getQueuedPromises(network); + if (forceClearPromises) { promises.forceClear(item); + timer = 0; + } forceClearPromises = false; return promises == null ? 0 : promises.getTotalPromisedAndRemoveExpired(item, getPromiseExpiryTimeInTicks()); @@ -431,6 +470,7 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { panelTag.putString("RecipeAddress", recipeAddress); panelTag.putInt("RecipeOutput", recipeOutput); panelTag.putInt("PromiseClearingInterval", promiseClearingInterval); + panelTag.putUUID("Freq", network); if (panelBE().restocker && !clientPacket) panelTag.put("Promises", restockerPromises.write()); @@ -457,6 +497,8 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { promisedSatisfied = panelTag.getBoolean("PromisedSatisfied"); waitingForNetwork = panelTag.getBoolean("Waiting"); promiseClearingInterval = panelTag.getInt("PromiseClearingInterval"); + if (panelTag.hasUUID("Freq")) + network = panelTag.getUUID("Freq"); targeting.clear(); NBTHelper.iterateCompoundList(panelTag.getList("Targeting", Tag.TAG_COMPOUND), diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java index db18a74bf4..6dae599b97 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java @@ -3,15 +3,19 @@ package com.simibubi.create.content.logistics.factoryBoard; import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; +import com.simibubi.create.AllSoundEvents; import com.simibubi.create.content.equipment.wrench.IWrenchable; +import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedBlockItem; import com.simibubi.create.foundation.block.IBE; import com.simibubi.create.foundation.block.ProperWaterloggedBlock; +import com.simibubi.create.foundation.utility.CreateLang; import net.createmod.catnip.utility.VecHelper; import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; +import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundSource; import net.minecraft.util.Mth; import net.minecraft.world.InteractionHand; @@ -20,6 +24,7 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; @@ -40,6 +45,8 @@ import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraftforge.common.ForgeMod; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.level.BlockEvent; public class FactoryPanelBlock extends FaceAttachedHorizontalDirectionalBlock implements ProperWaterloggedBlock, IBE, IWrenchable { @@ -61,7 +68,7 @@ public class FactoryPanelBlock extends FaceAttachedHorizontalDirectionalBlock public static enum PanelState { PASSIVE, ACTIVE } - + public static enum PanelType { NETWORK, PACKAGER } @@ -104,12 +111,51 @@ public class FactoryPanelBlock extends FaceAttachedHorizontalDirectionalBlock FactoryPanelBlockEntity fpbe = getBlockEntity(level, pos); Vec3 location = pContext.getClickLocation(); - if (blockState.is(this) && location != null && fpbe != null && !level.isClientSide()) - fpbe.addPanel(getTargetedSlot(pos, blockState, location)); + if (blockState.is(this) && location != null && fpbe != null && !level.isClientSide()) { + if (fpbe.addPanel(getTargetedSlot(pos, blockState, location), + LogisticallyLinkedBlockItem.networkFromStack(pContext.getItemInHand())) && pContext.getPlayer() != null) + pContext.getPlayer() + .displayClientMessage(CreateLang.translateDirect("logistically_linked.connected"), true); + } return withWater(stateForPlacement, pContext); } + @Override + public InteractionResult onSneakWrenched(BlockState state, UseOnContext context) { + Level world = context.getLevel(); + BlockPos pos = context.getClickedPos(); + Player player = context.getPlayer(); + PanelSlot slot = getTargetedSlot(pos, state, context.getClickLocation()); + + if (!(world instanceof ServerLevel serverLevel)) + return InteractionResult.SUCCESS; + + return onBlockEntityUse(world, pos, be -> { + FactoryPanelBehaviour behaviour = be.panels.get(slot); + if (behaviour == null || !behaviour.isActive()) + return InteractionResult.SUCCESS; + + BlockEvent.BreakEvent event = new BlockEvent.BreakEvent(world, pos, world.getBlockState(pos), player); + MinecraftForge.EVENT_BUS.post(event); + if (event.isCanceled()) + return InteractionResult.SUCCESS; + + if (!be.removePanel(slot)) + return InteractionResult.SUCCESS; + + if (!player.isCreative()) + player.getInventory() + .placeItemBackInInventory(AllBlocks.FACTORY_PANEL.asStack()); + + playRemoveSound(world, pos); + if (be.activePanels() == 0) + world.destroyBlock(pos, false); + + return InteractionResult.SUCCESS; + }); + } + @Override public void setPlacedBy(Level pLevel, BlockPos pPos, BlockState pState, LivingEntity pPlacer, ItemStack pStack) { super.setPlacedBy(pLevel, pPos, pState, pPlacer, pStack); @@ -122,7 +168,8 @@ public class FactoryPanelBlock extends FaceAttachedHorizontalDirectionalBlock if (location == null) return; PanelSlot initialSlot = getTargetedSlot(pPos, pState, location); - withBlockEntityDo(pLevel, pPos, fpbe -> fpbe.addPanel(initialSlot)); + withBlockEntityDo(pLevel, pPos, + fpbe -> fpbe.addPanel(initialSlot, LogisticallyLinkedBlockItem.networkFromStack(pStack))); } @Override @@ -139,10 +186,18 @@ public class FactoryPanelBlock extends FaceAttachedHorizontalDirectionalBlock if (location == null) return InteractionResult.SUCCESS; + if (!FactoryPanelBlockItem.isTuned(item)) { + AllSoundEvents.DENY.playOnServer(pLevel, pPos); + pPlayer.displayClientMessage(CreateLang.temporaryText("Tune to a transmitter before placing") + .component(), true); + return InteractionResult.FAIL; + } + PanelSlot newSlot = getTargetedSlot(pPos, pState, location); withBlockEntityDo(pLevel, pPos, fpbe -> { - if (!fpbe.addPanel(newSlot)) + if (!fpbe.addPanel(newSlot, LogisticallyLinkedBlockItem.networkFromStack(item))) return; + pPlayer.displayClientMessage(CreateLang.translateDirect("logistically_linked.connected"), true); pLevel.playSound(null, pPos, soundType.getPlaceSound(), SoundSource.BLOCKS); if (pPlayer.isCreative()) return; diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java index cdae669867..0a2fc566a4 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java @@ -2,13 +2,14 @@ package com.simibubi.create.content.logistics.factoryBoard; import java.util.EnumMap; import java.util.List; +import java.util.UUID; import javax.annotation.Nullable; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBlock.PanelSlot; import com.simibubi.create.content.logistics.packager.PackagerBlockEntity; -import com.simibubi.create.content.logistics.stockTicker.StockCheckingBlockEntity; +import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import net.createmod.catnip.utility.NBTHelper; @@ -27,7 +28,7 @@ import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; -public class FactoryPanelBlockEntity extends StockCheckingBlockEntity { +public class FactoryPanelBlockEntity extends SmartBlockEntity { public EnumMap panels; @@ -45,7 +46,6 @@ public class FactoryPanelBlockEntity extends StockCheckingBlockEntity { public void addBehaviours(List behaviours) { panels = new EnumMap<>(PanelSlot.class); redraw = true; - super.addBehaviours(behaviours); for (PanelSlot slot : PanelSlot.values()) { FactoryPanelBehaviour e = new FactoryPanelBehaviour(this, slot); panels.put(slot, e); @@ -59,7 +59,7 @@ public class FactoryPanelBlockEntity extends StockCheckingBlockEntity { if (level.isClientSide()) return; - if (panels.isEmpty()) + if (activePanels() == 0) level.destroyBlock(worldPosition, false); if (AllBlocks.FACTORY_PANEL.has(getBlockState())) { @@ -105,10 +105,11 @@ public class FactoryPanelBlockEntity extends StockCheckingBlockEntity { Block.popResource(level, worldPosition, AllBlocks.FACTORY_PANEL.asStack(panelCount - 1)); } - public boolean addPanel(PanelSlot slot) { + public boolean addPanel(PanelSlot slot, UUID frequency) { FactoryPanelBehaviour behaviour = panels.get(slot); if (behaviour != null && !behaviour.isActive()) { behaviour.enable(); + behaviour.setNetwork(frequency); redraw = true; lastShape = null; return true; diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java index 6b19c76173..890a1141c3 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java @@ -17,6 +17,7 @@ import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBlock; import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBlockEntity; import com.simibubi.create.content.logistics.packagePort.frogport.FrogportBlockEntity; import com.simibubi.create.content.logistics.packager.PackagerBlock.PackagerType; +import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedBehaviour.RequestType; import com.simibubi.create.content.logistics.packagerLink.PackagerLinkBlock; import com.simibubi.create.content.logistics.packagerLink.PackagerLinkBlockEntity; import com.simibubi.create.content.logistics.packagerLink.RequestPromiseQueue; @@ -36,6 +37,7 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; import net.minecraft.util.Mth; +import net.minecraft.world.Containers; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; @@ -59,12 +61,12 @@ public class PackagerBlockEntity extends SmartBlockEntity { public ItemStack heldBox; public ItemStack previouslyUnwrapped; - public List queuedRequests; + public List queuedExitingPackages; public PackagerItemHandler inventory; private final LazyOptional invProvider; - public static final int CYCLE = 30; + public static final int CYCLE = 20; public int animationTicks; public boolean animationInward; @@ -87,7 +89,7 @@ public class PackagerBlockEntity extends SmartBlockEntity { invProvider = LazyOptional.of(() -> inventory); animationTicks = 0; animationInward = true; - queuedRequests = new LinkedList<>(); + queuedExitingPackages = new LinkedList<>(); signBasedAddress = ""; if (AllBlocks.PACKAGER.has(state)) defragmenterActive = state.getValue(PackagerBlock.TYPE) == PackagerType.DEFRAG; @@ -114,10 +116,17 @@ public class PackagerBlockEntity extends SmartBlockEntity { @Override public void tick() { super.tick(); - if (!level.isClientSide() && !queuedRequests.isEmpty() && !defragmenterActive) - attemptToSend(true); + if (animationTicks == 0) { previouslyUnwrapped = ItemStack.EMPTY; + + if (!level.isClientSide() && !queuedExitingPackages.isEmpty() && heldBox.isEmpty()) { + heldBox = queuedExitingPackages.remove(0); + animationInward = false; + animationTicks = CYCLE; + notifyUpdate(); + } + return; } @@ -127,11 +136,6 @@ public class PackagerBlockEntity extends SmartBlockEntity { wakeTheFrogs(); } - public void queueRequest(PackagingRequest packagingRequest) { - queuedRequests.add(packagingRequest); - level.blockEntityChanged(worldPosition); - } - public void triggerStockCheck() { getAvailableItems(); } @@ -218,7 +222,16 @@ public class PackagerBlockEntity extends SmartBlockEntity { if (!redstoneModeActive) return; updateSignAddress(); - attemptToSend(false); + attemptToSend(null); + } + + public boolean isTooBusyFor(RequestType type) { + int queue = queuedExitingPackages.size(); + return queue >= switch (type) { + case PLAYER -> 50; + case REDSTONE -> 20; + case RESTOCK -> 10; + }; } public void recheckIfLinksPresent() { @@ -244,7 +257,7 @@ public class PackagerBlockEntity extends SmartBlockEntity { if (!redstoneModeActive) return; updateSignAddress(); - attemptToSend(false); + attemptToSend(null); } public boolean unwrapBox(ItemStack box, boolean simulate) { @@ -325,8 +338,8 @@ public class PackagerBlockEntity extends SmartBlockEntity { return true; } - public void attemptToSend(boolean requestQueue) { - if (!heldBox.isEmpty() || animationTicks != 0) + public void attemptToSend(List queuedRequests) { + if (queuedRequests == null && (!heldBox.isEmpty() || animationTicks != 0)) return; IItemHandler targetInv = targetInventory.getInventory(); @@ -353,6 +366,7 @@ public class PackagerBlockEntity extends SmartBlockEntity { int packageIndexAtLink = 0; boolean finalPackageAtLink = false; PackageOrder orderContext = null; + boolean requestQueue = queuedRequests != null; if (requestQueue && !queuedRequests.isEmpty()) { nextRequest = queuedRequests.get(0); @@ -439,17 +453,24 @@ public class PackagerBlockEntity extends SmartBlockEntity { return; } - heldBox = extractedPackageItem.isEmpty() ? PackageItem.containing(extractedItems) : extractedPackageItem.copy(); - PackageItem.clearAddress(heldBox); + ItemStack createdBox = + extractedPackageItem.isEmpty() ? PackageItem.containing(extractedItems) : extractedPackageItem.copy(); + PackageItem.clearAddress(createdBox); if (fixedAddress != null) - PackageItem.addAddress(heldBox, fixedAddress); + PackageItem.addAddress(createdBox, fixedAddress); if (requestQueue) - PackageItem.setOrder(heldBox, fixedOrderId, linkIndexInOrder, finalLinkInOrder, packageIndexAtLink, + PackageItem.setOrder(createdBox, fixedOrderId, linkIndexInOrder, finalLinkInOrder, packageIndexAtLink, finalPackageAtLink, orderContext); if (!requestQueue && !signBasedAddress.isBlank()) - PackageItem.addAddress(heldBox, signBasedAddress); + PackageItem.addAddress(createdBox, signBasedAddress); + if (!heldBox.isEmpty() || animationTicks != 0) { + queuedExitingPackages.add(createdBox); + return; + } + + heldBox = createdBox; animationInward = false; animationTicks = CYCLE; @@ -550,8 +571,7 @@ public class PackagerBlockEntity extends SmartBlockEntity { defragmenterActive = compound.getBoolean("Defrag"); if (clientPacket) return; - queuedRequests = - NBTHelper.readCompoundList(compound.getList("QueuedRequests", Tag.TAG_COMPOUND), PackagingRequest::fromNBT); + queuedExitingPackages = NBTHelper.readItemList(compound.getList("QueuedPackages", Tag.TAG_COMPOUND)); if (compound.contains("LastSummary")) availableItems = InventorySummary.read(compound.getCompound("LastSummary")); } @@ -568,7 +588,7 @@ public class PackagerBlockEntity extends SmartBlockEntity { compound.putBoolean("Defrag", defragmenterActive); if (clientPacket) return; - compound.put("QueuedRequests", NBTHelper.writeCompoundList(queuedRequests, PackagingRequest::toNBT)); + compound.put("QueuedPackages", NBTHelper.writeItemList(queuedExitingPackages)); if (availableItems != null) compound.put("LastSummary", availableItems.write()); } @@ -583,6 +603,9 @@ public class PackagerBlockEntity extends SmartBlockEntity { public void destroy() { super.destroy(); ItemHelper.dropContents(level, worldPosition, inventory); + queuedExitingPackages.forEach(stack -> Containers.dropItemStack(level, worldPosition.getX(), + worldPosition.getY(), worldPosition.getZ(), stack)); + queuedExitingPackages.clear(); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerItemHandler.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerItemHandler.java index a794bd5c75..1752c55c31 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerItemHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerItemHandler.java @@ -34,7 +34,7 @@ public class PackagerItemHandler implements IItemHandlerModifiable { @Override public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) { - if (!blockEntity.heldBox.isEmpty()) + if (!blockEntity.heldBox.isEmpty() || !blockEntity.queuedExitingPackages.isEmpty()) return stack; if (!isItemValid(slot, stack)) return stack; diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java index 7c497725be..12505b6d9a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java @@ -18,11 +18,14 @@ import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import com.simibubi.create.Create; import com.simibubi.create.content.logistics.packager.InventorySummary; +import com.simibubi.create.content.logistics.packager.PackagerBlockEntity; +import com.simibubi.create.content.logistics.packager.PackagingRequest; import com.simibubi.create.content.logistics.stockTicker.PackageOrder; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BehaviourType; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; +import net.createmod.catnip.utility.Pair; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.ItemStack; import net.minecraftforge.items.IItemHandler; @@ -41,54 +44,20 @@ public class LogisticallyLinkedBehaviour extends BlockEntityBehaviour { private boolean loadedGlobally = false; private boolean global = false; - // - - public LogisticallyLinkedBehaviour(SmartBlockEntity be, boolean global) { - super(be); - this.global = global; - linkId = LINK_ID_GENERATOR.getAndIncrement(); - freqId = UUID.randomUUID(); + public static enum RequestType { + RESTOCK, REDSTONE, PLAYER } - // - private static final Cache>> LINKS = CacheBuilder.newBuilder() .expireAfterAccess(1, TimeUnit.SECONDS) .build(); - private static final Cache SUMMARIES = CacheBuilder.newBuilder() - .expireAfterWrite(1, TimeUnit.SECONDS) - .build(); - - private static final Cache ACCURATE_SUMMARIES = CacheBuilder.newBuilder() - .expireAfterWrite(100, TimeUnit.MILLISECONDS) - .build(); - - public InventorySummary getSummaryOfNetwork(boolean accurate) { - try { - return (accurate ? ACCURATE_SUMMARIES : SUMMARIES).get(freqId, () -> { - InventorySummary summaryOfLinks = new InventorySummary(); - getAllConnectedAvailableLinks(false).forEach(link -> { - InventorySummary summary = link.getSummary(null); - if (summary != InventorySummary.EMPTY) - summaryOfLinks.contributingLinks++; - summaryOfLinks.add(summary); - }); - return summaryOfLinks; - }); - } catch (ExecutionException e) { - e.printStackTrace(); - } - return InventorySummary.EMPTY; - } - - public int getStockOf(ItemStack stack, @Nullable IItemHandler ignoredHandler) { - int sum = 0; - for (LogisticallyLinkedBehaviour link : getAllConnectedAvailableLinks(false)) - sum += link.getSummary(ignoredHandler) - .getCountOf(stack); - return sum; + public LogisticallyLinkedBehaviour(SmartBlockEntity be, boolean global) { + super(be); + this.global = global; + linkId = LINK_ID_GENERATOR.getAndIncrement(); + freqId = UUID.randomUUID(); } public static Collection getAllPresent(UUID freq, boolean sortByPriority) { @@ -188,12 +157,15 @@ public class LogisticallyLinkedBehaviour extends BlockEntityBehaviour { keepAlive(this); } - public int processRequest(ItemStack stack, int amount, String address, int linkIndex, MutableBoolean finalLink, - int orderId, @Nullable PackageOrder orderContext, @Nullable IItemHandler ignoredHandler) { + public Pair processRequest(ItemStack stack, int amount, String address, + int linkIndex, MutableBoolean finalLink, int orderId, @Nullable PackageOrder orderContext, + @Nullable IItemHandler ignoredHandler) { + if (blockEntity instanceof PackagerLinkBlockEntity plbe) return plbe.processRequest(stack, amount, address, linkIndex, finalLink, orderId, orderContext, ignoredHandler); - return 0; + + return null; } public InventorySummary getSummary(@Nullable IItemHandler ignoredHandler) { @@ -235,8 +207,4 @@ public class LogisticallyLinkedBehaviour extends BlockEntityBehaviour { return TYPE; } - public Iterable getAllConnectedAvailableLinks(boolean sortByPriority) { - return getAllPresent(freqId, sortByPriority); - } - } diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBlockItem.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBlockItem.java index 97b7b5f1a4..c8a06cc9ac 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBlockItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBlockItem.java @@ -1,6 +1,9 @@ package com.simibubi.create.content.logistics.packagerLink; import java.util.List; +import java.util.UUID; + +import javax.annotation.Nullable; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import com.simibubi.create.foundation.utility.CreateLang; @@ -33,6 +36,17 @@ public class LogisticallyLinkedBlockItem extends BlockItem { return pStack.hasTag() && pStack.getTag() .contains(BLOCK_ENTITY_TAG); } + + @Nullable + public static UUID networkFromStack(ItemStack pStack) { + if (!isTuned(pStack)) + return null; + CompoundTag tag = pStack.getTag() + .getCompound(BLOCK_ENTITY_TAG); + if (!tag.hasUUID("Freq")) + return null; + return tag.getUUID("Freq"); + } @Override public void appendHoverText(ItemStack pStack, Level pLevel, List pTooltip, TooltipFlag pFlag) { diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsManager.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsManager.java new file mode 100644 index 0000000000..ef8c90d1e8 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsManager.java @@ -0,0 +1,158 @@ +package com.simibubi.create.content.logistics.packagerLink; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Random; +import java.util.UUID; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; + +import javax.annotation.Nullable; + +import org.apache.commons.lang3.mutable.MutableBoolean; + +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; +import com.simibubi.create.content.logistics.BigItemStack; +import com.simibubi.create.content.logistics.packager.InventorySummary; +import com.simibubi.create.content.logistics.packager.PackagerBlockEntity; +import com.simibubi.create.content.logistics.packager.PackagingRequest; +import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedBehaviour.RequestType; +import com.simibubi.create.content.logistics.stockTicker.PackageOrder; + +import net.createmod.catnip.utility.Pair; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.items.IItemHandler; + +public class LogisticsManager { + + private static Random r = new Random(); + + public static final Cache ACCURATE_SUMMARIES = CacheBuilder.newBuilder() + .expireAfterWrite(100, TimeUnit.MILLISECONDS) + .build(); + + public static final Cache SUMMARIES = CacheBuilder.newBuilder() + .expireAfterWrite(1, TimeUnit.SECONDS) + .build(); + + public static InventorySummary getSummaryOfNetwork(UUID freqId, boolean accurate) { + try { + return (accurate ? LogisticsManager.ACCURATE_SUMMARIES : LogisticsManager.SUMMARIES).get(freqId, () -> { + InventorySummary summaryOfLinks = new InventorySummary(); + LogisticallyLinkedBehaviour.getAllPresent(freqId, false) + .forEach(link -> { + InventorySummary summary = link.getSummary(null); + if (summary != InventorySummary.EMPTY) + summaryOfLinks.contributingLinks++; + summaryOfLinks.add(summary); + }); + return summaryOfLinks; + }); + } catch (ExecutionException e) { + e.printStackTrace(); + } + return InventorySummary.EMPTY; + } + + public static int getStockOf(UUID freqId, ItemStack stack, @Nullable IItemHandler ignoredHandler) { + int sum = 0; + for (LogisticallyLinkedBehaviour link : LogisticallyLinkedBehaviour.getAllPresent(freqId, false)) + sum += link.getSummary(ignoredHandler) + .getCountOf(stack); + return sum; + } + + public static boolean broadcastPackageRequest(UUID freqId, RequestType type, PackageOrder order, + IItemHandler ignoredHandler, String address) { + Multimap requests = + findPackagersForRequest(freqId, order, ignoredHandler, address); + + // Check if packagers have accumulated too many packages already + for (PackagerBlockEntity packager : requests.keySet()) + if (packager.isTooBusyFor(type)) + return false; + + // Actually perform package creation + performPackageRequests(requests); + return true; + } + + public static Multimap findPackagersForRequest(UUID freqId, + PackageOrder order, IItemHandler ignoredHandler, String address) { + List stacks = order.stacks(); + Multimap requests = HashMultimap.create(); + + // Packages need to track their index and successors for successful defrag + Iterable availableLinks = LogisticallyLinkedBehaviour.getAllPresent(freqId, true); + List usedLinks = new ArrayList<>(); + MutableBoolean finalLinkTracker = new MutableBoolean(false); + + // First box needs to carry the order specifics for successful defrag + PackageOrder contextToSend = order; + + // Packages from future orders should not be merged in the packager queue + int orderId = r.nextInt(); + + for (int i = 0; i < stacks.size(); i++) { + BigItemStack entry = stacks.get(i); + int remainingCount = entry.count; + boolean finalEntry = i == stacks.size() - 1; + ItemStack requestedItem = entry.stack; + + for (LogisticallyLinkedBehaviour link : availableLinks) { + int usedIndex = usedLinks.indexOf(link); + int linkIndex = usedIndex == -1 ? usedLinks.size() : usedIndex; + MutableBoolean isFinalLink = new MutableBoolean(false); + if (linkIndex == usedLinks.size() - 1) + isFinalLink = finalLinkTracker; + + Pair request = link.processRequest(requestedItem, remainingCount, + address, linkIndex, isFinalLink, orderId, contextToSend, ignoredHandler); + if (request == null) + continue; + + requests.put(request.getFirst(), request.getSecond()); + + int processedCount = request.getSecond() + .getCount(); + if (processedCount > 0 && usedIndex == -1) { + contextToSend = null; + usedLinks.add(link); + finalLinkTracker = isFinalLink; + } + + remainingCount -= processedCount; + if (remainingCount > 0) + continue; + if (finalEntry) + finalLinkTracker.setTrue(); + break; + } + } + return requests; + } + + public static void performPackageRequests(Multimap requests) { + Map> asMap = requests.asMap(); + for (Entry> entry : asMap.entrySet()) { + ArrayList queuedRequests = new ArrayList<>(entry.getValue()); + PackagerBlockEntity packager = entry.getKey(); + + for (int i = 0; i < 100; i++) { + if (queuedRequests.isEmpty()) + break; + packager.attemptToSend(queuedRequests); + } + + packager.triggerStockCheck(); + packager.notifyUpdate(); + } + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlock.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlock.java index 8b9d26a02e..d80f539a64 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlock.java @@ -84,7 +84,7 @@ public class PackagerLinkBlock extends WrenchableDirectionalBlock implements IBE public BlockEntityType getBlockEntityType() { return AllBlockEntityTypes.PACKAGER_LINK.get(); } - + @Override public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pMovedByPiston) { IBE.onRemove(pState, pLevel, pPos, pNewState); diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java index 3350ee21d0..ce4fd83f18 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java @@ -13,6 +13,7 @@ import com.simibubi.create.content.logistics.stockTicker.PackageOrder; import com.simibubi.create.content.redstone.displayLink.LinkWithBulbBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; +import net.createmod.catnip.utility.Pair; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.item.ItemStack; @@ -35,33 +36,32 @@ public class PackagerLinkBlockEntity extends LinkWithBulbBlockEntity { return InventorySummary.EMPTY; if (packager.isTargetingSameInventory(ignoredHandler)) return InventorySummary.EMPTY; - + sendPulseNextSync(); sendData(); return packager.getAvailableItems(); } - public int processRequest(ItemStack stack, int amount, String address, int linkIndex, MutableBoolean finalLink, - int orderId, @Nullable PackageOrder orderContext, @Nullable IItemHandler ignoredHandler) { + public Pair processRequest(ItemStack stack, int amount, String address, + int linkIndex, MutableBoolean finalLink, int orderId, @Nullable PackageOrder orderContext, + @Nullable IItemHandler ignoredHandler) { PackagerBlockEntity packager = getPackager(); if (packager == null || packager.defragmenterActive) - return 0; + return null; if (packager.isTargetingSameInventory(ignoredHandler)) - return 0; + return null; InventorySummary summary = packager.getAvailableItems(); int availableCount = summary.getCountOf(stack); if (availableCount == 0) - return 0; + return null; - int toWithdraw = Math.min(amount, availableCount); - PackagingRequest packagingRequest = - PackagingRequest.create(stack, toWithdraw, address, linkIndex, finalLink, 0, orderId, orderContext); - packager.queueRequest(packagingRequest); sendPulseNextSync(); sendData(); - return toWithdraw; + int toWithdraw = Math.min(amount, availableCount); + return Pair.of(packager, + PackagingRequest.create(stack, toWithdraw, address, linkIndex, finalLink, 0, orderId, orderContext)); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlockEntity.java index 07b99c2a2b..dfd6ddd875 100644 --- a/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlockEntity.java @@ -2,6 +2,7 @@ package com.simibubi.create.content.logistics.redstoneRequester; import com.simibubi.create.content.logistics.BigItemStack; import com.simibubi.create.content.logistics.packager.InventorySummary; +import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedBehaviour.RequestType; import com.simibubi.create.content.logistics.stockTicker.PackageOrder; import com.simibubi.create.content.logistics.stockTicker.StockCheckingBlockEntity; @@ -63,7 +64,7 @@ public class RedstoneRequesterBlockEntity extends StockCheckingBlockEntity imple return; } - broadcastPackageRequest(encodedRequest, null, encodedTargetAdress); + broadcastPackageRequest(RequestType.REDSTONE, encodedRequest, null, encodedTargetAdress); lastRequestSucceeded = true; } diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrderRequestPacket.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrderRequestPacket.java index 7e89b4a29f..74bec9f4c6 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrderRequestPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrderRequestPacket.java @@ -1,5 +1,6 @@ package com.simibubi.create.content.logistics.stockTicker; +import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedBehaviour.RequestType; import com.simibubi.create.content.logistics.redstoneRequester.RedstoneRequesterBlock; import com.simibubi.create.foundation.networking.BlockEntityConfigurationPacket; @@ -48,7 +49,7 @@ public class PackageOrderRequestPacket extends BlockEntityConfigurationPacket stacks = order.stacks(); - - // Packages need to track their index and successors for successful defrag - Iterable availableLinks = behaviour.getAllConnectedAvailableLinks(true); - List usedLinks = new ArrayList<>(); - MutableBoolean finalLinkTracker = new MutableBoolean(false); - - // First box needs to carry the order specifics for successful defrag - PackageOrder contextToSend = order; - - // Packages from future orders should not be merged in the packager queue - int orderId = level.random.nextInt(); - - for (int i = 0; i < stacks.size(); i++) { - BigItemStack entry = stacks.get(i); - int remainingCount = entry.count; - boolean finalEntry = i == stacks.size() - 1; - ItemStack requestedItem = entry.stack; - - for (LogisticallyLinkedBehaviour link : availableLinks) { - int usedIndex = usedLinks.indexOf(link); - int linkIndex = usedIndex == -1 ? usedLinks.size() : usedIndex; - MutableBoolean isFinalLink = new MutableBoolean(false); - if (linkIndex == usedLinks.size() - 1) - isFinalLink = finalLinkTracker; - - int processedCount = link.processRequest(requestedItem, remainingCount, address, linkIndex, isFinalLink, - orderId, contextToSend, ignoredHandler); - if (processedCount > 0 && usedIndex == -1) { - contextToSend = null; - usedLinks.add(link); - finalLinkTracker = isFinalLink; - } - remainingCount -= processedCount; - if (remainingCount > 0) - continue; - if (finalEntry) - finalLinkTracker.setTrue(); - break; - } - } + public boolean broadcastPackageRequest(RequestType type, PackageOrder order, IItemHandler ignoredHandler, + String address) { + return LogisticsManager.broadcastPackageRequest(behaviour.freqId, type, order, ignoredHandler, address); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java index 11b2bba54b..db0c9fb886 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java @@ -14,6 +14,7 @@ import com.simibubi.create.content.logistics.BigItemStack; import com.simibubi.create.content.logistics.filter.FilterItem; import com.simibubi.create.content.logistics.filter.FilterItemStack; import com.simibubi.create.content.logistics.packager.InventorySummary; +import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedBehaviour.RequestType; import com.simibubi.create.foundation.item.ItemHelper; import com.simibubi.create.foundation.item.SmartInventory; import com.simibubi.create.foundation.utility.CreateLang; @@ -82,10 +83,11 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity implements } @Override - public void broadcastPackageRequest(PackageOrder order, IItemHandler ignoredHandler, String address) { - super.broadcastPackageRequest(order, ignoredHandler, address); + public boolean broadcastPackageRequest(RequestType type, PackageOrder order, IItemHandler ignoredHandler, String address) { + boolean result = super.broadcastPackageRequest(type, order, ignoredHandler, address); previouslyUsedAddress = address; notifyUpdate(); + return result; } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java index 5593b9f560..a97847dcb8 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java @@ -12,6 +12,7 @@ import com.simibubi.create.content.logistics.BigItemStack; import com.simibubi.create.content.logistics.displayCloth.ShoppingListItem; import com.simibubi.create.content.logistics.displayCloth.ShoppingListItem.ShoppingList; import com.simibubi.create.content.logistics.packager.InventorySummary; +import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedBehaviour.RequestType; import com.simibubi.create.foundation.utility.CreateLang; import net.createmod.catnip.gui.ScreenOpener; @@ -164,7 +165,7 @@ public class StockTickerInteractionHandler { toTransfer.forEach(s -> ItemHandlerHelper.insertItemStacked(tickerBE.receivedPayments, s, false)); } - tickerBE.broadcastPackageRequest(order, null, ShoppingListItem.getAddress(mainHandItem)); + tickerBE.broadcastPackageRequest(RequestType.PLAYER, order, null, ShoppingListItem.getAddress(mainHandItem)); player.setItemInHand(InteractionHand.MAIN_HAND, ItemStack.EMPTY); } From 70cd3d4d5a010e5b93ff201143d27fab08fbf2ee Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Tue, 29 Oct 2024 21:34:07 +0100 Subject: [PATCH 095/515] Service - Added the Desk Bell - Bells assembled to elevator contraptions now activate when arriving at a floor --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 9 +- .../c24b4d2b8d15abff51c78bd94f4403d9eae6c139 | 4 +- .../assets/create/blockstates/desk_bell.json | 108 +++++++++++++ .../resources/assets/create/lang/en_ud.json | 2 + .../resources/assets/create/lang/en_us.json | 2 + .../assets/create/models/item/desk_bell.json | 3 + .../resources/assets/create/sounds.json | 10 ++ .../create/loot_tables/blocks/desk_bell.json | 21 +++ .../simibubi/create/AllBlockEntityTypes.java | 8 + .../java/com/simibubi/create/AllBlocks.java | 9 ++ .../com/simibubi/create/AllPartialModels.java | 3 + .../java/com/simibubi/create/AllShapes.java | 3 + .../com/simibubi/create/AllSoundEvents.java | 5 + .../behaviour/BellMovementBehaviour.java | 32 +++- .../redstone/deskBell/DeskBellBlock.java | 149 ++++++++++++++++++ .../deskBell/DeskBellBlockEntity.java | 62 ++++++++ .../redstone/deskBell/DeskBellRenderer.java | 61 +++++++ .../create/models/block/desk_bell/bell.json | 30 ++++ .../create/models/block/desk_bell/block.json | 76 +++++++++ .../models/block/desk_bell/block_powered.json | 43 +++++ .../models/block/desk_bell/plunger.json | 37 +++++ .../assets/create/sounds/desk_bell.ogg | Bin 0 -> 42313 bytes .../create/textures/block/desk_bell.png | Bin 0 -> 817 bytes 23 files changed, 667 insertions(+), 10 deletions(-) create mode 100644 src/generated/resources/assets/create/blockstates/desk_bell.json create mode 100644 src/generated/resources/assets/create/models/item/desk_bell.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/desk_bell.json create mode 100644 src/main/java/com/simibubi/create/content/redstone/deskBell/DeskBellBlock.java create mode 100644 src/main/java/com/simibubi/create/content/redstone/deskBell/DeskBellBlockEntity.java create mode 100644 src/main/java/com/simibubi/create/content/redstone/deskBell/DeskBellRenderer.java create mode 100644 src/main/resources/assets/create/models/block/desk_bell/bell.json create mode 100644 src/main/resources/assets/create/models/block/desk_bell/block.json create mode 100644 src/main/resources/assets/create/models/block/desk_bell/block_powered.json create mode 100644 src/main/resources/assets/create/models/block/desk_bell/plunger.json create mode 100644 src/main/resources/assets/create/sounds/desk_bell.ogg create mode 100644 src/main/resources/assets/create/textures/block/desk_bell.png diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 00a26e5b81..bb2057a5ca 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-10-24T12:46:14.8446146 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-10-29T20:48:43.0748887 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -219,6 +219,7 @@ c705f9cd47042867c87fab3a898a57152dec6dd5 assets/create/blockstates/deepslate_pil 1073fe9e96ea170c81b613835064034f967945b5 assets/create/blockstates/deepslate_zinc_ore.json d0ec99fdd534e1f3a84cc51fa914d3b74fb2c96a assets/create/blockstates/deployer.json 4f18fd003ca756417fd036bd8b66f323e0ca4852 assets/create/blockstates/depot.json +5b933ed479ec646f8cc2cd3739405c34737d517c assets/create/blockstates/desk_bell.json 26a5a4c176e75b1f48f3eb653a45c23e606f07b4 assets/create/blockstates/diorite_pillar.json d45d92164f81fd42cc1f8c6ba4ac25df0fca79b1 assets/create/blockstates/display_board.json a65771f280051a884725073d14a831539bc0d658 assets/create/blockstates/display_link.json @@ -612,8 +613,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -7cae2f006a11bc6b07b15f0fd317e09ad9609650 assets/create/lang/en_ud.json -2c05bc7cbfef98ba87340f4f50adba0d112d0a68 assets/create/lang/en_us.json +33926a10d74a9fa696f64108554adb9217a82f33 assets/create/lang/en_ud.json +5da69b7b326804d29d050e403133080025109fe9 assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -1968,6 +1969,7 @@ eef3be2fa3b6424436a553e3c1bfee3979015962 assets/create/models/item/cyan_seat.jso 9b5b804fe75a3e748a0d9a6761ab46178e5f3850 assets/create/models/item/deepslate_zinc_ore.json 7ff5075e907b57d6b0f6fd0a31d0e46464afe634 assets/create/models/item/deployer.json aa44d681c3ccffe08aedbda093062b1a5ab3302e assets/create/models/item/depot.json +63e24083922af9d5300aea771bb63bb9962ba3e6 assets/create/models/item/desk_bell.json 85a5830ca034be9a0ed534186210aa975278b20b assets/create/models/item/diorite_pillar.json 2a992f0961b8bab5628e075da413c91e903e424c assets/create/models/item/display_board.json e71e3c355c4a9266e359e88278b238e38f15d9ea assets/create/models/item/display_cloth.json @@ -3249,6 +3251,7 @@ ccb3ab3c0d9c8fad236ccc790c2f7a1524202e9a data/create/loot_tables/blocks/dark_oak 3c3d83fc964462e2401ec6dac5200709d5ce1957 data/create/loot_tables/blocks/deepslate_zinc_ore.json 8c1d8d9680834419b9049bc11137316b75f59f46 data/create/loot_tables/blocks/deployer.json 9ded269b860ed96c964f6f8960a680a5c87fa033 data/create/loot_tables/blocks/depot.json +eec1b262b34fc05a95bbb3762cf96a050030d010 data/create/loot_tables/blocks/desk_bell.json 98987901bdb35efe2922b420def9cdb116ec5416 data/create/loot_tables/blocks/diorite_pillar.json 6dda1fa6622ce351af2e0aeec2b5c2e4183fb593 data/create/loot_tables/blocks/display_board.json 5320ddec6855d99e5685bb424d02165eca480805 data/create/loot_tables/blocks/display_link.json diff --git a/src/generated/resources/.cache/c24b4d2b8d15abff51c78bd94f4403d9eae6c139 b/src/generated/resources/.cache/c24b4d2b8d15abff51c78bd94f4403d9eae6c139 index 77746800f4..eae1118802 100644 --- a/src/generated/resources/.cache/c24b4d2b8d15abff51c78bd94f4403d9eae6c139 +++ b/src/generated/resources/.cache/c24b4d2b8d15abff51c78bd94f4403d9eae6c139 @@ -1,2 +1,2 @@ -// 1.20.1 2024-10-18T15:46:50.5032973 Create's Custom Sounds -c46cacfd6c383d9195b9d1104c7ed543e184cad9 assets/create/sounds.json +// 1.20.1 2024-10-29T20:48:43.0728938 Create's Custom Sounds +95f92936f1028973cacb7aade6eb6acf582aaa8f assets/create/sounds.json diff --git a/src/generated/resources/assets/create/blockstates/desk_bell.json b/src/generated/resources/assets/create/blockstates/desk_bell.json new file mode 100644 index 0000000000..6ef28ee2bd --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/desk_bell.json @@ -0,0 +1,108 @@ +{ + "variants": { + "facing=down,powered=false,waterlogged=false": { + "model": "create:block/desk_bell/block", + "x": 180 + }, + "facing=down,powered=false,waterlogged=true": { + "model": "create:block/desk_bell/block", + "x": 180 + }, + "facing=down,powered=true,waterlogged=false": { + "model": "create:block/desk_bell/block_powered", + "x": 180 + }, + "facing=down,powered=true,waterlogged=true": { + "model": "create:block/desk_bell/block_powered", + "x": 180 + }, + "facing=east,powered=false,waterlogged=false": { + "model": "create:block/desk_bell/block", + "x": 90, + "y": 90 + }, + "facing=east,powered=false,waterlogged=true": { + "model": "create:block/desk_bell/block", + "x": 90, + "y": 90 + }, + "facing=east,powered=true,waterlogged=false": { + "model": "create:block/desk_bell/block_powered", + "x": 90, + "y": 90 + }, + "facing=east,powered=true,waterlogged=true": { + "model": "create:block/desk_bell/block_powered", + "x": 90, + "y": 90 + }, + "facing=north,powered=false,waterlogged=false": { + "model": "create:block/desk_bell/block", + "x": 90 + }, + "facing=north,powered=false,waterlogged=true": { + "model": "create:block/desk_bell/block", + "x": 90 + }, + "facing=north,powered=true,waterlogged=false": { + "model": "create:block/desk_bell/block_powered", + "x": 90 + }, + "facing=north,powered=true,waterlogged=true": { + "model": "create:block/desk_bell/block_powered", + "x": 90 + }, + "facing=south,powered=false,waterlogged=false": { + "model": "create:block/desk_bell/block", + "x": 90, + "y": 180 + }, + "facing=south,powered=false,waterlogged=true": { + "model": "create:block/desk_bell/block", + "x": 90, + "y": 180 + }, + "facing=south,powered=true,waterlogged=false": { + "model": "create:block/desk_bell/block_powered", + "x": 90, + "y": 180 + }, + "facing=south,powered=true,waterlogged=true": { + "model": "create:block/desk_bell/block_powered", + "x": 90, + "y": 180 + }, + "facing=up,powered=false,waterlogged=false": { + "model": "create:block/desk_bell/block" + }, + "facing=up,powered=false,waterlogged=true": { + "model": "create:block/desk_bell/block" + }, + "facing=up,powered=true,waterlogged=false": { + "model": "create:block/desk_bell/block_powered" + }, + "facing=up,powered=true,waterlogged=true": { + "model": "create:block/desk_bell/block_powered" + }, + "facing=west,powered=false,waterlogged=false": { + "model": "create:block/desk_bell/block", + "x": 90, + "y": 270 + }, + "facing=west,powered=false,waterlogged=true": { + "model": "create:block/desk_bell/block", + "x": 90, + "y": 270 + }, + "facing=west,powered=true,waterlogged=false": { + "model": "create:block/desk_bell/block_powered", + "x": 90, + "y": 270 + }, + "facing=west,powered=true,waterlogged=true": { + "model": "create:block/desk_bell/block_powered", + "x": 90, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 66b39dbde9..e70dbc8df9 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -425,6 +425,7 @@ "block.create.deepslate_zinc_ore": "ǝɹO ɔuıZ ǝʇɐןsdǝǝᗡ", "block.create.deployer": "ɹǝʎoןdǝᗡ", "block.create.depot": "ʇodǝᗡ", + "block.create.desk_bell": "ןןǝᗺ ʞsǝᗡ", "block.create.diorite_pillar": "ɹɐןןıԀ ǝʇıɹoıᗡ", "block.create.display_board": "pɹɐoᗺ ʎɐןdsıᗡ", "block.create.display_link": "ʞuıꞀ ʎɐןdsıᗡ", @@ -2559,6 +2560,7 @@ "create.subtitle.deny": "dooq buıuıןɔǝᗡ", "create.subtitle.depot_plop": "spuɐן ɯǝʇI", "create.subtitle.depot_slide": "sǝpıןs ɯǝʇI", + "create.subtitle.desk_bell": "sbuıp ןןǝq uoıʇdǝɔǝᴚ", "create.subtitle.funnel_flap": "sdɐןɟ ןǝuunℲ", "create.subtitle.fwoomp": "dɯooʍɟ ʇuɐuosǝᴚ", "create.subtitle.haunted_bell_convert": "suǝʞɐʍɐ ןןǝᗺ pǝʇunɐH", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index a4f05429b5..76c54d3ae8 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -425,6 +425,7 @@ "block.create.deepslate_zinc_ore": "Deepslate Zinc Ore", "block.create.deployer": "Deployer", "block.create.depot": "Depot", + "block.create.desk_bell": "Desk Bell", "block.create.diorite_pillar": "Diorite Pillar", "block.create.display_board": "Display Board", "block.create.display_link": "Display Link", @@ -2559,6 +2560,7 @@ "create.subtitle.deny": "Declining boop", "create.subtitle.depot_plop": "Item lands", "create.subtitle.depot_slide": "Item slides", + "create.subtitle.desk_bell": "Reception bell dings", "create.subtitle.funnel_flap": "Funnel flaps", "create.subtitle.fwoomp": "Resonant fwoomp", "create.subtitle.haunted_bell_convert": "Haunted Bell awakens", diff --git a/src/generated/resources/assets/create/models/item/desk_bell.json b/src/generated/resources/assets/create/models/item/desk_bell.json new file mode 100644 index 0000000000..866b99fd86 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/desk_bell.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/desk_bell/block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/sounds.json b/src/generated/resources/assets/create/sounds.json index b5260d82ce..2aa793f370 100644 --- a/src/generated/resources/assets/create/sounds.json +++ b/src/generated/resources/assets/create/sounds.json @@ -216,6 +216,16 @@ ], "subtitle": "create.subtitle.depot_slide" }, + "desk_bell": { + "sounds": [ + { + "type": "file", + "attenuation_distance": 64, + "name": "create:desk_bell" + } + ], + "subtitle": "create.subtitle.desk_bell" + }, "funnel_flap": { "sounds": [ { diff --git a/src/generated/resources/data/create/loot_tables/blocks/desk_bell.json b/src/generated/resources/data/create/loot_tables/blocks/desk_bell.json new file mode 100644 index 0000000000..baa0dfa9c3 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/desk_bell.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:desk_bell" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/desk_bell" +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java index d1eb92b0b5..58ec8ef7cb 100644 --- a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java +++ b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java @@ -195,6 +195,8 @@ import com.simibubi.create.content.processing.burner.BlazeBurnerVisual; import com.simibubi.create.content.redstone.analogLever.AnalogLeverBlockEntity; import com.simibubi.create.content.redstone.analogLever.AnalogLeverRenderer; import com.simibubi.create.content.redstone.analogLever.AnalogLeverVisual; +import com.simibubi.create.content.redstone.deskBell.DeskBellBlockEntity; +import com.simibubi.create.content.redstone.deskBell.DeskBellRenderer; import com.simibubi.create.content.redstone.diodes.BrassDiodeRenderer; import com.simibubi.create.content.redstone.diodes.BrassDiodeVisual; import com.simibubi.create.content.redstone.diodes.PulseExtenderBlockEntity; @@ -900,6 +902,12 @@ public class AllBlockEntityTypes { .validBlocks(AllBlocks.HAUNTED_BELL) .renderer(() -> BellRenderer::new) .register(); + + public static final BlockEntityEntry DESK_BELL = REGISTRATE + .blockEntity("desk_bell", DeskBellBlockEntity::new) + .validBlocks(AllBlocks.DESK_BELL) + .renderer(() -> DeskBellRenderer::new) + .register(); public static final BlockEntityEntry TOOLBOX = REGISTRATE .blockEntity("toolbox", ToolboxBlockEntity::new) diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index c2332e68bc..2160f82af9 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -209,6 +209,7 @@ import com.simibubi.create.content.redstone.analogLever.AnalogLeverBlock; import com.simibubi.create.content.redstone.contact.ContactMovementBehaviour; import com.simibubi.create.content.redstone.contact.RedstoneContactBlock; import com.simibubi.create.content.redstone.contact.RedstoneContactItem; +import com.simibubi.create.content.redstone.deskBell.DeskBellBlock; import com.simibubi.create.content.redstone.diodes.AbstractDiodeGenerator; import com.simibubi.create.content.redstone.diodes.BrassDiodeBlock; import com.simibubi.create.content.redstone.diodes.BrassDiodeGenerator; @@ -2123,6 +2124,14 @@ public class AllBlocks { .onRegister(movementBehaviour(new HauntedBellMovementBehaviour())) .register(); + public static final BlockEntry DESK_BELL = REGISTRATE.block("desk_bell", DeskBellBlock::new) + .properties(p -> p.mapColor(MapColor.SAND)) + .blockstate((c, p) -> p.directionalBlock(c.get(), AssetLookup.forPowered(c, p))) + .item() + .transform(customItemModel("_", "block")) + .onRegister(movementBehaviour(new BellMovementBehaviour())) + .register(); + public static final DyedBlockList TOOLBOXES = new DyedBlockList<>(colour -> { String colourName = colour.getSerializedName(); return REGISTRATE.block(colourName + "_toolbox", p -> new ToolboxBlock(p, colour)) diff --git a/src/main/java/com/simibubi/create/AllPartialModels.java b/src/main/java/com/simibubi/create/AllPartialModels.java index 122abc1801..e64810672b 100644 --- a/src/main/java/com/simibubi/create/AllPartialModels.java +++ b/src/main/java/com/simibubi/create/AllPartialModels.java @@ -83,6 +83,9 @@ public class AllPartialModels { SYMMETRY_TRIPLEPLANE = block("symmetry_effect/tripleplane"), STICKER_HEAD = block("sticker/head"), + + DESK_BELL_PLUNGER = block("desk_bell/plunger"), + DESK_BELL_BELL = block("desk_bell/bell"), PORTABLE_STORAGE_INTERFACE_MIDDLE = block("portable_storage_interface/block_middle"), PORTABLE_STORAGE_INTERFACE_MIDDLE_POWERED = block("portable_storage_interface/block_middle_powered"), diff --git a/src/main/java/com/simibubi/create/AllShapes.java b/src/main/java/com/simibubi/create/AllShapes.java index a59d533fbd..9d12051c5a 100644 --- a/src/main/java/com/simibubi/create/AllShapes.java +++ b/src/main/java/com/simibubi/create/AllShapes.java @@ -185,6 +185,9 @@ public class AllShapes { WHISTLE_BASE = shape(1, 0, 1, 15, 3, 15).add(5, 0, 5, 11, 8, 11) .forDirectional(UP), + + DESK_BELL = shape(3, 0, 3, 13, 3, 13).add(4, 0, 4, 12, 9, 12) + .forDirectional(UP), ITEM_HATCH = shape(1, 0, 0, 15, 16, 2).add(2, 2, 0, 14, 13, 3.8) .add(2, 4, 0, 14, 11, 5.8) diff --git a/src/main/java/com/simibubi/create/AllSoundEvents.java b/src/main/java/com/simibubi/create/AllSoundEvents.java index a553e2cb23..4f38c5bb93 100644 --- a/src/main/java/com/simibubi/create/AllSoundEvents.java +++ b/src/main/java/com/simibubi/create/AllSoundEvents.java @@ -247,6 +247,11 @@ public class AllSoundEvents { .playExisting(SoundEvents.BELL_BLOCK) .category(SoundSource.BLOCKS) .build(), + + DESK_BELL_USE = create("desk_bell").subtitle("Reception bell dings") + .category(SoundSource.BLOCKS) + .attenuationDistance(64) + .build(), WHISTLE_HIGH = create("whistle_high").subtitle("High whistling") .category(SoundSource.RECORDS) diff --git a/src/main/java/com/simibubi/create/content/contraptions/behaviour/BellMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/behaviour/BellMovementBehaviour.java index 7796239796..84711f6063 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/behaviour/BellMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/behaviour/BellMovementBehaviour.java @@ -1,6 +1,10 @@ package com.simibubi.create.content.contraptions.behaviour; +import com.simibubi.create.AllBlocks; +import com.simibubi.create.content.contraptions.Contraption; +import com.simibubi.create.content.contraptions.elevator.ElevatorContraption; import com.simibubi.create.content.equipment.bell.AbstractBellBlock; +import com.simibubi.create.content.redstone.deskBell.DeskBellBlock; import com.simibubi.create.content.trains.entity.CarriageContraption; import net.minecraft.core.BlockPos; @@ -11,15 +15,31 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.phys.Vec3; public class BellMovementBehaviour implements MovementBehaviour { + @Override public boolean isActive(MovementContext context) { return MovementBehaviour.super.isActive(context) && !(context.contraption instanceof CarriageContraption); } @Override - public void onSpeedChanged(MovementContext context, Vec3 oldMotion, Vec3 motion) { - double dotProduct = oldMotion.dot(motion); + public void tick(MovementContext context) { + boolean moved = context.temporaryData instanceof Boolean b && b.booleanValue(); + Contraption contraption = context.contraption; + if (contraption instanceof ElevatorContraption ec && !ec.arrived) + context.temporaryData = Boolean.valueOf(true); + else if (moved) { + playSound(context); + context.temporaryData = null; + } + } + + @Override + public void onSpeedChanged(MovementContext context, Vec3 oldMotion, Vec3 motion) { + if (context.contraption instanceof ElevatorContraption) + return; + + double dotProduct = oldMotion.dot(motion); if (dotProduct <= 0 && (context.relativeMotion.length() != 0) || context.firstMovement) playSound(context); } @@ -35,12 +55,14 @@ public class BellMovementBehaviour implements MovementBehaviour { BlockPos pos = BlockPos.containing(context.position); Block block = context.state.getBlock(); - if (block instanceof AbstractBellBlock) { + if (AllBlocks.DESK_BELL.has(context.state)) { + ((DeskBellBlock) block).playSound(null, world, pos); + } else if (block instanceof AbstractBellBlock) { ((AbstractBellBlock) block).playSound(world, pos); } else { // Vanilla bell sound - world.playSound(null, pos, SoundEvents.BELL_BLOCK, - SoundSource.BLOCKS, 2f, 1f); + world.playSound(null, pos, SoundEvents.BELL_BLOCK, SoundSource.BLOCKS, 2f, 1f); } } + } diff --git a/src/main/java/com/simibubi/create/content/redstone/deskBell/DeskBellBlock.java b/src/main/java/com/simibubi/create/content/redstone/deskBell/DeskBellBlock.java new file mode 100644 index 0000000000..0ca83ad5e4 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/redstone/deskBell/DeskBellBlock.java @@ -0,0 +1,149 @@ +package com.simibubi.create.content.redstone.deskBell; + +import javax.annotation.Nullable; + +import com.simibubi.create.AllBlockEntityTypes; +import com.simibubi.create.AllShapes; +import com.simibubi.create.AllSoundEvents; +import com.simibubi.create.foundation.block.IBE; +import com.simibubi.create.foundation.block.ProperWaterloggedBlock; +import com.simibubi.create.foundation.block.WrenchableDirectionalBlock; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition.Builder; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; + +public class DeskBellBlock extends WrenchableDirectionalBlock + implements ProperWaterloggedBlock, IBE { + + public static final BooleanProperty POWERED = BlockStateProperties.POWERED; + + public DeskBellBlock(Properties properties) { + super(properties); + registerDefaultState(defaultBlockState().setValue(FACING, Direction.UP) + .setValue(POWERED, false) + .setValue(WATERLOGGED, false)); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext context) { + return withWater(defaultBlockState().setValue(FACING, context.getClickedFace()), context); + } + + @Override + public BlockState updateShape(BlockState pState, Direction pDirection, BlockState pNeighborState, + LevelAccessor pLevel, BlockPos pPos, BlockPos pNeighborPos) { + updateWater(pLevel, pState, pPos); + return pState; + } + + @Override + public VoxelShape getShape(BlockState pState, BlockGetter pLevel, BlockPos pPos, CollisionContext pContext) { + return AllShapes.DESK_BELL.get(pState.getValue(FACING)); + } + + @Override + protected void createBlockStateDefinition(Builder builder) { + super.createBlockStateDefinition(builder.add(POWERED, WATERLOGGED)); + } + + @Override + public FluidState getFluidState(BlockState pState) { + return fluidState(pState); + } + + @Override + public InteractionResult use(BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, + BlockHitResult pHit) { + if (pState.getValue(POWERED)) + return InteractionResult.CONSUME; + press(pState, pLevel, pPos); + playSound(pPlayer, pLevel, pPos); + withBlockEntityDo(pLevel, pPos, DeskBellBlockEntity::ding); + return InteractionResult.SUCCESS; + } + + public void press(BlockState pState, Level pLevel, BlockPos pPos) { + pLevel.setBlock(pPos, pState.setValue(POWERED, true), 3); + updateNeighbours(pState, pLevel, pPos); + pLevel.scheduleTick(pPos, this, 20); + } + + public void playSound(@Nullable Player pPlayer, LevelAccessor pLevel, BlockPos pPos) { + if (pLevel instanceof Level level) + AllSoundEvents.DESK_BELL_USE.play(level, pPlayer, pPos); + } + + @Override + public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pIsMoving) { + if (!pIsMoving && !pState.is(pNewState.getBlock())) + if (pState.getValue(POWERED)) + updateNeighbours(pState, pLevel, pPos); + IBE.onRemove(pState, pLevel, pPos, pNewState); + } + + @Override + public int getSignal(BlockState pBlockState, BlockGetter pBlockAccess, BlockPos pPos, Direction pSide) { + return pBlockState.getValue(POWERED) ? 15 : 0; + } + + @Override + public int getDirectSignal(BlockState pBlockState, BlockGetter pBlockAccess, BlockPos pPos, Direction pSide) { + return pBlockState.getValue(POWERED) && getConnectedDirection(pBlockState) == pSide ? 15 : 0; + } + + @Override + public boolean isSignalSource(BlockState pState) { + return true; + } + + @Override + public void tick(BlockState pState, ServerLevel pLevel, BlockPos pPos, RandomSource pRandom) { + if (pState.getValue(POWERED)) + unPress(pState, pLevel, pPos); + } + + protected void unPress(BlockState pState, Level pLevel, BlockPos pPos) { + pLevel.setBlock(pPos, pState.setValue(POWERED, false), 3); + updateNeighbours(pState, pLevel, pPos); + } + + protected void updateNeighbours(BlockState pState, Level pLevel, BlockPos pPos) { + pLevel.updateNeighborsAt(pPos, this); + pLevel.updateNeighborsAt(pPos.relative(getConnectedDirection(pState).getOpposite()), this); + } + + private Direction getConnectedDirection(BlockState pState) { + return pState.getOptionalValue(FACING) + .orElse(Direction.UP); + } + + @Override + public Class getBlockEntityClass() { + return DeskBellBlockEntity.class; + } + + @Override + public BlockEntityType getBlockEntityType() { + return AllBlockEntityTypes.DESK_BELL.get(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/redstone/deskBell/DeskBellBlockEntity.java b/src/main/java/com/simibubi/create/content/redstone/deskBell/DeskBellBlockEntity.java new file mode 100644 index 0000000000..be5d46938f --- /dev/null +++ b/src/main/java/com/simibubi/create/content/redstone/deskBell/DeskBellBlockEntity.java @@ -0,0 +1,62 @@ +package com.simibubi.create.content.redstone.deskBell; + +import java.util.List; + +import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; +import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; + +import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.utility.animation.LerpedFloat; +import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; + +public class DeskBellBlockEntity extends SmartBlockEntity { + + public LerpedFloat animation = LerpedFloat.linear() + .startWithValue(0); + + public boolean ding; + + public DeskBellBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { + super(type, pos, state); + } + + @Override + public void tick() { + super.tick(); + animation.tickChaser(); + } + + @Override + protected void write(CompoundTag tag, boolean clientPacket) { + super.write(tag, clientPacket); + if (clientPacket && ding) + NBTHelper.putMarker(tag, "Ding"); + ding = false; + } + + @Override + protected void read(CompoundTag tag, boolean clientPacket) { + super.read(tag, clientPacket); + if (clientPacket && tag.contains("Ding")) + ding(); + } + + public void ding() { + if (!level.isClientSide) { + ding = true; + sendData(); + return; + } + + animation.startWithValue(1) + .chase(0, 0.05, Chaser.LINEAR); + } + + @Override + public void addBehaviours(List behaviours) {} + +} diff --git a/src/main/java/com/simibubi/create/content/redstone/deskBell/DeskBellRenderer.java b/src/main/java/com/simibubi/create/content/redstone/deskBell/DeskBellRenderer.java new file mode 100644 index 0000000000..6598d976d3 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/redstone/deskBell/DeskBellRenderer.java @@ -0,0 +1,61 @@ +package com.simibubi.create.content.redstone.deskBell; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.AllPartialModels; +import com.simibubi.create.foundation.blockEntity.renderer.SmartBlockEntityRenderer; + +import net.createmod.catnip.render.CachedBuffers; +import net.createmod.catnip.utility.math.AngleHelper; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider.Context; +import net.minecraft.core.Direction; +import net.minecraft.util.Mth; +import net.minecraft.world.level.block.state.BlockState; + +public class DeskBellRenderer extends SmartBlockEntityRenderer { + + public DeskBellRenderer(Context context) { + super(context); + } + + @Override + protected void renderSafe(DeskBellBlockEntity blockEntity, float partialTicks, PoseStack ms, + MultiBufferSource buffer, int light, int overlay) { + BlockState blockState = blockEntity.getBlockState(); + float p = blockEntity.animation.getValue(partialTicks); + if (p < 0.004 && !blockState.getOptionalValue(DeskBellBlock.POWERED) + .orElse(false)) + return; + + float f = (float) (1 - 4 * Math.pow((Math.max(p - 0.5, 0)) - 0.5, 2)); + float f2 = (float) (Math.pow(p, 1.25f)); + + Direction facing = blockState.getValue(DeskBellBlock.FACING); + + CachedBuffers.partial(AllPartialModels.DESK_BELL_PLUNGER, blockState) + .center() + .rotateYDegrees(AngleHelper.horizontalAngle(facing)) + .rotateXDegrees(AngleHelper.verticalAngle(facing) + 90) + .uncenter() + .translate(0, f * -.75f / 16f, 0) + .light(light) + .overlay(overlay) + .renderInto(ms, buffer.getBuffer(RenderType.solid())); + + CachedBuffers.partial(AllPartialModels.DESK_BELL_BELL, blockState) + .center() + .rotateYDegrees(AngleHelper.horizontalAngle(facing)) + .rotateXDegrees(AngleHelper.verticalAngle(facing) + 90) + .translate(0, -1 / 16, 0) + .rotateXDegrees(f2 * 8 * Mth.sin(p * Mth.PI * 4)) + .rotateZDegrees(f2 * 8 * Mth.cos(p * Mth.PI * 4)) + .translate(0, 1 / 16, 0) + .scale(0.995f) + .uncenter() + .light(light) + .overlay(overlay) + .renderInto(ms, buffer.getBuffer(RenderType.solid())); + } + +} diff --git a/src/main/resources/assets/create/models/block/desk_bell/bell.json b/src/main/resources/assets/create/models/block/desk_bell/bell.json new file mode 100644 index 0000000000..26d889d0da --- /dev/null +++ b/src/main/resources/assets/create/models/block/desk_bell/bell.json @@ -0,0 +1,30 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/desk_bell", + "particle": "create:block/desk_bell" + }, + "elements": [ + { + "from": [4, 3, 4], + "to": [12, 9, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 9, 8]}, + "faces": { + "north": {"uv": [2, 3.5, 6, 6.5], "texture": "#0"}, + "east": {"uv": [2, 3.5, 6, 6.5], "texture": "#0"}, + "south": {"uv": [2, 3.5, 6, 6.5], "texture": "#0"}, + "west": {"uv": [2, 3.5, 6, 6.5], "texture": "#0"}, + "up": {"uv": [10, 0, 14, 4], "texture": "#0"}, + "down": {"uv": [10, 4, 14, 8], "texture": "#0"} + } + } + ], + "groups": [ + { + "name": "bell", + "origin": [8, 8, 8], + "color": 0, + "children": [0] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/desk_bell/block.json b/src/main/resources/assets/create/models/block/desk_bell/block.json new file mode 100644 index 0000000000..5952dced55 --- /dev/null +++ b/src/main/resources/assets/create/models/block/desk_bell/block.json @@ -0,0 +1,76 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "0": "create:block/desk_bell", + "particle": "create:block/desk_bell" + }, + "elements": [ + { + "from": [7, 9, 7], + "to": [9, 10, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [7, 9, 7]}, + "faces": { + "north": {"uv": [3.5, 3, 4.5, 3.5], "texture": "#0"}, + "east": {"uv": [3.5, 3, 4.5, 3.5], "texture": "#0"}, + "south": {"uv": [3.5, 3, 4.5, 3.5], "texture": "#0"}, + "west": {"uv": [3.5, 3, 4.5, 3.5], "texture": "#0"} + } + }, + { + "from": [6.5, 10, 6.5], + "to": [9.5, 10, 9.5], + "rotation": {"angle": 0, "axis": "y", "origin": [6, 10, 6]}, + "faces": { + "up": {"uv": [3.5, 1.5, 5, 3], "texture": "#0"}, + "down": {"uv": [3.5, 1.5, 5, 3], "texture": "#0"} + } + }, + { + "from": [3, 0, 3], + "to": [13, 3, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [3, 0, 3]}, + "faces": { + "north": {"uv": [1.5, 6.5, 6.5, 8], "texture": "#0"}, + "east": {"uv": [1.5, 6.5, 6.5, 8], "texture": "#0"}, + "south": {"uv": [1.5, 6.5, 6.5, 8], "texture": "#0"}, + "west": {"uv": [1.5, 6.5, 6.5, 8], "texture": "#0"}, + "up": {"uv": [1.5, 9.5, 6.5, 14.5], "texture": "#0"}, + "down": {"uv": [9.5, 9.5, 14.5, 14.5], "texture": "#0"} + } + }, + { + "from": [4, 3, 4], + "to": [12, 9, 12], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 9, 8]}, + "faces": { + "north": {"uv": [2, 3.5, 6, 6.5], "texture": "#0"}, + "east": {"uv": [2, 3.5, 6, 6.5], "texture": "#0"}, + "south": {"uv": [2, 3.5, 6, 6.5], "texture": "#0"}, + "west": {"uv": [2, 3.5, 6, 6.5], "texture": "#0"}, + "up": {"uv": [10, 0, 14, 4], "texture": "#0"}, + "down": {"uv": [10, 4, 14, 8], "texture": "#0"} + } + } + ], + "groups": [ + { + "name": "plunger", + "origin": [8, 8, 8], + "color": 0, + "children": [0, 1] + }, + { + "name": "base", + "origin": [3, 0, 3], + "color": 0, + "children": [2] + }, + { + "name": "bell", + "origin": [8, 8, 8], + "color": 0, + "children": [3] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/desk_bell/block_powered.json b/src/main/resources/assets/create/models/block/desk_bell/block_powered.json new file mode 100644 index 0000000000..26e0ae6e08 --- /dev/null +++ b/src/main/resources/assets/create/models/block/desk_bell/block_powered.json @@ -0,0 +1,43 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "0": "create:block/desk_bell", + "particle": "create:block/desk_bell" + }, + "elements": [ + { + "from": [3, 0, 3], + "to": [13, 3, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [3, 0, 3]}, + "faces": { + "north": {"uv": [1.5, 6.5, 6.5, 8], "texture": "#0"}, + "east": {"uv": [1.5, 6.5, 6.5, 8], "texture": "#0"}, + "south": {"uv": [1.5, 6.5, 6.5, 8], "texture": "#0"}, + "west": {"uv": [1.5, 6.5, 6.5, 8], "texture": "#0"}, + "up": {"uv": [1.5, 9.5, 6.5, 14.5], "texture": "#0"}, + "down": {"uv": [9.5, 9.5, 14.5, 14.5], "texture": "#0"} + } + } + ], + "groups": [ + { + "name": "plunger", + "origin": [8, 8, 8], + "color": 0, + "children": [] + }, + { + "name": "base", + "origin": [3, 0, 3], + "color": 0, + "children": [0] + }, + { + "name": "bell", + "origin": [8, 8, 8], + "color": 0, + "children": [] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/desk_bell/plunger.json b/src/main/resources/assets/create/models/block/desk_bell/plunger.json new file mode 100644 index 0000000000..d31b05c868 --- /dev/null +++ b/src/main/resources/assets/create/models/block/desk_bell/plunger.json @@ -0,0 +1,37 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/desk_bell", + "particle": "create:block/desk_bell" + }, + "elements": [ + { + "from": [7, 9, 7], + "to": [9, 10, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [7, 9, 7]}, + "faces": { + "north": {"uv": [3.5, 3, 4.5, 3.5], "texture": "#0"}, + "east": {"uv": [3.5, 3, 4.5, 3.5], "texture": "#0"}, + "south": {"uv": [3.5, 3, 4.5, 3.5], "texture": "#0"}, + "west": {"uv": [3.5, 3, 4.5, 3.5], "texture": "#0"} + } + }, + { + "from": [6.5, 10, 6.5], + "to": [9.5, 10, 9.5], + "rotation": {"angle": 0, "axis": "y", "origin": [6, 10, 6]}, + "faces": { + "up": {"uv": [3.5, 1.5, 5, 3], "texture": "#0"}, + "down": {"uv": [3.5, 1.5, 5, 3], "texture": "#0"} + } + } + ], + "groups": [ + { + "name": "plunger", + "origin": [8, 8, 8], + "color": 0, + "children": [0, 1] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/sounds/desk_bell.ogg b/src/main/resources/assets/create/sounds/desk_bell.ogg new file mode 100644 index 0000000000000000000000000000000000000000..a67229ed55ef8052c808f7e79768a35538a1ce87 GIT binary patch literal 42313 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/desk_bell.png b/src/main/resources/assets/create/textures/block/desk_bell.png new file mode 100644 index 0000000000000000000000000000000000000000..1d200c18b66d81faa555fffbf6b97362c313c4e1 GIT binary patch literal 817 zcmV-11J3-3P)Px%>q$gGR9J=WmOV@pVHn4MHEpkVl@=;(N*YK@_=+EaD2YgnlM|zfiyJXIFgP0r z2L|Kdga!r@i7|0ucXJ^I5Yd>R3200!O#`74Y=!Fw)pKaC_IlUr0W~iCw|k!Fec%7{ z@qgd5(O_)Mo>4rJ0;0bIn_DW|<=86esGYX!pKO)!_C^!%L<&gZK9H^epojwiNK62$ zy7-0@kivZ^r|yt>H-jY+|A1m#l5CB(4uG!3Dt6@(S_`K!? zprP98ydVwJdv<`xUwf>lZs_mGcS1U zIBLY35}11SoPe)|si~)y%b!WEBe~}gFHAzI8cu-i3FMfCAzYa}uk`e$aQ2@CegoS) zy4kC!Jv}$}-jqx_Y6n(JQ(uI#CzDC8mwa^ywEA;6x;o1;LY_nPcaUM7R)4N;1wJnQ zBA9f;QoPFJW-}_+C*bpCvAHD_aX>drK3}#jfnY@96)h83SxexM90IiXX1y=(Ti&#-y~%J0A!AM; z6!apwoVWxh0NGp~a3W{(-~q{1v@`#$=HZ)Bxisz7-Oc=y79Qis&`k6A=&+K_<%>Nx zfI1)dXXXu6aPP*T0+_A`c<^Gmyk0XY*<7C3){pYHss>dFq-DZ^X48zm#F79wB<%yN zs;E2c*Vr`#ROSIs)t^g=$W~genO)`jlPzAIPY_^tC#73&`bTsaRA*k#rz22#2_3|D zSTwu>MR!fJqiD-Kc!yt00000NkvXXu0mjfO1yV3 literal 0 HcmV?d00001 From aa5c7b0743faafc0da3407064ac87ba82295a751 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Wed, 30 Oct 2024 12:17:54 +0100 Subject: [PATCH 096/515] Clean sheets - New blockstates for updated display cloth implementation --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 86 +++++- .../blockstates/andesite_display_cloth.json | 7 + .../blockstates/black_display_cloth.json | 7 + .../blockstates/blue_display_cloth.json | 7 + .../blockstates/brass_display_cloth.json | 7 + .../blockstates/brown_display_cloth.json | 7 + .../blockstates/copper_display_cloth.json | 7 + .../blockstates/cyan_display_cloth.json | 7 + .../blockstates/gray_display_cloth.json | 7 + .../blockstates/green_display_cloth.json | 7 + .../blockstates/light_blue_display_cloth.json | 7 + .../blockstates/light_gray_display_cloth.json | 7 + .../blockstates/lime_display_cloth.json | 7 + .../blockstates/magenta_display_cloth.json | 7 + .../blockstates/orange_display_cloth.json | 7 + .../blockstates/pink_display_cloth.json | 7 + .../blockstates/purple_display_cloth.json | 7 + .../create/blockstates/red_display_cloth.json | 7 + .../blockstates/white_display_cloth.json | 7 + .../blockstates/yellow_display_cloth.json | 7 + .../resources/assets/create/lang/en_ud.json | 19 ++ .../resources/assets/create/lang/en_us.json | 19 ++ .../models/block/andesite_display_cloth.json | 6 + .../models/block/black_display_cloth.json | 6 + .../models/block/blue_display_cloth.json | 6 + .../models/block/brass_display_cloth.json | 6 + .../models/block/brown_display_cloth.json | 6 + .../models/block/copper_display_cloth.json | 6 + .../models/block/cyan_display_cloth.json | 6 + .../models/block/gray_display_cloth.json | 6 + .../models/block/green_display_cloth.json | 6 + .../block/light_blue_display_cloth.json | 6 + .../block/light_gray_display_cloth.json | 6 + .../models/block/lime_display_cloth.json | 6 + .../models/block/magenta_display_cloth.json | 6 + .../models/block/orange_display_cloth.json | 6 + .../models/block/pink_display_cloth.json | 6 + .../models/block/purple_display_cloth.json | 6 + .../models/block/red_display_cloth.json | 6 + .../models/block/white_display_cloth.json | 6 + .../models/block/yellow_display_cloth.json | 6 + .../models/item/andesite_display_cloth.json | 6 + .../models/item/black_display_cloth.json | 6 + .../models/item/blue_display_cloth.json | 6 + .../models/item/brass_display_cloth.json | 6 + .../models/item/brown_display_cloth.json | 6 + .../models/item/copper_display_cloth.json | 6 + .../models/item/cyan_display_cloth.json | 6 + .../models/item/gray_display_cloth.json | 6 + .../models/item/green_display_cloth.json | 6 + .../models/item/light_blue_display_cloth.json | 6 + .../models/item/light_gray_display_cloth.json | 6 + .../models/item/lime_display_cloth.json | 6 + .../models/item/magenta_display_cloth.json | 6 + .../models/item/orange_display_cloth.json | 6 + .../models/item/pink_display_cloth.json | 6 + .../models/item/purple_display_cloth.json | 6 + .../create/models/item/red_display_cloth.json | 6 + .../models/item/white_display_cloth.json | 6 + .../models/item/yellow_display_cloth.json | 6 + .../blocks/andesite_display_cloth.json | 21 ++ .../blocks/black_display_cloth.json | 21 ++ .../blocks/blue_display_cloth.json | 21 ++ .../blocks/brass_display_cloth.json | 21 ++ .../blocks/brown_display_cloth.json | 21 ++ .../blocks/copper_display_cloth.json | 21 ++ .../blocks/cyan_display_cloth.json | 21 ++ .../blocks/gray_display_cloth.json | 21 ++ .../blocks/green_display_cloth.json | 21 ++ .../blocks/light_blue_display_cloth.json | 21 ++ .../blocks/light_gray_display_cloth.json | 21 ++ .../blocks/lime_display_cloth.json | 21 ++ .../blocks/magenta_display_cloth.json | 21 ++ .../blocks/orange_display_cloth.json | 21 ++ .../blocks/pink_display_cloth.json | 21 ++ .../blocks/purple_display_cloth.json | 21 ++ .../loot_tables/blocks/red_display_cloth.json | 21 ++ .../blocks/white_display_cloth.json | 21 ++ .../blocks/yellow_display_cloth.json | 21 ++ .../create/tags/blocks/display_cloths.json | 23 ++ .../create/tags/items/display_cloths.json | 23 ++ .../tags/blocks/mineable/pickaxe.json | 3 + .../simibubi/create/AllBlockEntityTypes.java | 11 + .../java/com/simibubi/create/AllBlocks.java | 38 ++- .../simibubi/create/AllCreativeModeTabs.java | 8 + .../com/simibubi/create/AllEntityTypes.java | 4 +- .../com/simibubi/create/AllPartialModels.java | 5 + .../java/com/simibubi/create/AllShapes.java | 3 + .../java/com/simibubi/create/AllTags.java | 2 + .../logistics/depot/DepotRenderer.java | 20 +- .../displayCloth/DisplayClothBlock.java | 164 ++++++++++++ .../displayCloth/DisplayClothBlockEntity.java | 88 ++++++ .../DisplayClothEntityRenderer.java | 71 +++++ .../displayCloth/DisplayClothModel.java | 120 +++++++++ .../displayCloth/DisplayClothRenderer.java | 59 ++-- .../ClientResourceReloadListener.java | 2 + .../foundation/data/BuilderTransformers.java | 23 +- .../models/block/display_cloth/block.json | 129 +++++++++ .../models/block/display_cloth/item.json | 252 ++++++++++++++++++ .../block/display_cloth/item_lower.json | 252 ++++++++++++++++++ .../block/display_cloth/north_east.json | 28 ++ .../block/display_cloth/north_west.json | 28 ++ .../block/display_cloth/south_east.json | 28 ++ .../block/display_cloth/south_west.json | 28 ++ .../textures/block/display_cloth/andesite.png | Bin 0 -> 365 bytes .../textures/block/display_cloth/black.png | Bin 0 -> 363 bytes .../textures/block/display_cloth/blue.png | Bin 0 -> 363 bytes .../textures/block/display_cloth/brass.png | Bin 0 -> 349 bytes .../textures/block/display_cloth/brown.png | Bin 0 -> 363 bytes .../textures/block/display_cloth/copper.png | Bin 0 -> 353 bytes .../textures/block/display_cloth/cyan.png | Bin 0 -> 363 bytes .../textures/block/display_cloth/gray.png | Bin 0 -> 363 bytes .../textures/block/display_cloth/green.png | Bin 0 -> 363 bytes .../block/display_cloth/light_blue.png | Bin 0 -> 363 bytes .../block/display_cloth/light_gray.png | Bin 0 -> 363 bytes .../textures/block/display_cloth/lime.png | Bin 0 -> 363 bytes .../textures/block/display_cloth/magenta.png | Bin 0 -> 363 bytes .../textures/block/display_cloth/orange.png | Bin 0 -> 363 bytes .../textures/block/display_cloth/pink.png | Bin 0 -> 363 bytes .../textures/block/display_cloth/purple.png | Bin 0 -> 363 bytes .../textures/block/display_cloth/red.png | Bin 0 -> 597 bytes .../textures/block/display_cloth/white.png | Bin 0 -> 363 bytes .../textures/block/display_cloth/yellow.png | Bin 0 -> 363 bytes 123 files changed, 2236 insertions(+), 60 deletions(-) create mode 100644 src/generated/resources/assets/create/blockstates/andesite_display_cloth.json create mode 100644 src/generated/resources/assets/create/blockstates/black_display_cloth.json create mode 100644 src/generated/resources/assets/create/blockstates/blue_display_cloth.json create mode 100644 src/generated/resources/assets/create/blockstates/brass_display_cloth.json create mode 100644 src/generated/resources/assets/create/blockstates/brown_display_cloth.json create mode 100644 src/generated/resources/assets/create/blockstates/copper_display_cloth.json create mode 100644 src/generated/resources/assets/create/blockstates/cyan_display_cloth.json create mode 100644 src/generated/resources/assets/create/blockstates/gray_display_cloth.json create mode 100644 src/generated/resources/assets/create/blockstates/green_display_cloth.json create mode 100644 src/generated/resources/assets/create/blockstates/light_blue_display_cloth.json create mode 100644 src/generated/resources/assets/create/blockstates/light_gray_display_cloth.json create mode 100644 src/generated/resources/assets/create/blockstates/lime_display_cloth.json create mode 100644 src/generated/resources/assets/create/blockstates/magenta_display_cloth.json create mode 100644 src/generated/resources/assets/create/blockstates/orange_display_cloth.json create mode 100644 src/generated/resources/assets/create/blockstates/pink_display_cloth.json create mode 100644 src/generated/resources/assets/create/blockstates/purple_display_cloth.json create mode 100644 src/generated/resources/assets/create/blockstates/red_display_cloth.json create mode 100644 src/generated/resources/assets/create/blockstates/white_display_cloth.json create mode 100644 src/generated/resources/assets/create/blockstates/yellow_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/block/andesite_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/block/black_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/block/blue_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/block/brass_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/block/brown_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/block/copper_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/block/cyan_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/block/gray_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/block/green_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/block/light_blue_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/block/light_gray_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/block/lime_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/block/magenta_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/block/orange_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/block/pink_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/block/purple_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/block/red_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/block/white_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/block/yellow_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/item/andesite_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/item/black_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/item/blue_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/item/brass_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/item/brown_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/item/copper_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/item/cyan_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/item/gray_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/item/green_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/item/light_blue_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/item/light_gray_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/item/lime_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/item/magenta_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/item/orange_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/item/pink_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/item/purple_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/item/red_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/item/white_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/item/yellow_display_cloth.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/andesite_display_cloth.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/black_display_cloth.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/blue_display_cloth.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/brass_display_cloth.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/brown_display_cloth.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/copper_display_cloth.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/cyan_display_cloth.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/gray_display_cloth.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/green_display_cloth.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/light_blue_display_cloth.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/light_gray_display_cloth.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/lime_display_cloth.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/magenta_display_cloth.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/orange_display_cloth.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/pink_display_cloth.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/purple_display_cloth.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/red_display_cloth.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/white_display_cloth.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/yellow_display_cloth.json create mode 100644 src/generated/resources/data/create/tags/blocks/display_cloths.json create mode 100644 src/generated/resources/data/create/tags/items/display_cloths.json create mode 100644 src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothBlock.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothBlockEntity.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothEntityRenderer.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothModel.java create mode 100644 src/main/resources/assets/create/models/block/display_cloth/block.json create mode 100644 src/main/resources/assets/create/models/block/display_cloth/item.json create mode 100644 src/main/resources/assets/create/models/block/display_cloth/item_lower.json create mode 100644 src/main/resources/assets/create/models/block/display_cloth/north_east.json create mode 100644 src/main/resources/assets/create/models/block/display_cloth/north_west.json create mode 100644 src/main/resources/assets/create/models/block/display_cloth/south_east.json create mode 100644 src/main/resources/assets/create/models/block/display_cloth/south_west.json create mode 100644 src/main/resources/assets/create/textures/block/display_cloth/andesite.png create mode 100644 src/main/resources/assets/create/textures/block/display_cloth/black.png create mode 100644 src/main/resources/assets/create/textures/block/display_cloth/blue.png create mode 100644 src/main/resources/assets/create/textures/block/display_cloth/brass.png create mode 100644 src/main/resources/assets/create/textures/block/display_cloth/brown.png create mode 100644 src/main/resources/assets/create/textures/block/display_cloth/copper.png create mode 100644 src/main/resources/assets/create/textures/block/display_cloth/cyan.png create mode 100644 src/main/resources/assets/create/textures/block/display_cloth/gray.png create mode 100644 src/main/resources/assets/create/textures/block/display_cloth/green.png create mode 100644 src/main/resources/assets/create/textures/block/display_cloth/light_blue.png create mode 100644 src/main/resources/assets/create/textures/block/display_cloth/light_gray.png create mode 100644 src/main/resources/assets/create/textures/block/display_cloth/lime.png create mode 100644 src/main/resources/assets/create/textures/block/display_cloth/magenta.png create mode 100644 src/main/resources/assets/create/textures/block/display_cloth/orange.png create mode 100644 src/main/resources/assets/create/textures/block/display_cloth/pink.png create mode 100644 src/main/resources/assets/create/textures/block/display_cloth/purple.png create mode 100644 src/main/resources/assets/create/textures/block/display_cloth/red.png create mode 100644 src/main/resources/assets/create/textures/block/display_cloth/white.png create mode 100644 src/main/resources/assets/create/textures/block/display_cloth/yellow.png diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index bb2057a5ca..705596518c 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-10-29T20:48:43.0748887 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-10-30T11:53:14.6383606 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -7,6 +7,7 @@ c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_ch 96c0b7cf225d51e2df633786c1a8a0a6c61fe261 assets/create/blockstates/andesite_bars.json db046170dcd57e5fcfe85b475790d6725a0ad8e3 assets/create/blockstates/andesite_belt_funnel.json 6cd5574ad64b212440ae07ab75b732e04ee3aab5 assets/create/blockstates/andesite_casing.json +db10c9c0acd7171f4921e75c93fdccedb2664cdf assets/create/blockstates/andesite_display_cloth.json aff6d09929301e72548f4ce5720af96426171580 assets/create/blockstates/andesite_door.json 84dacd6144568b97ae00a55525290b4f295a72e7 assets/create/blockstates/andesite_encased_cogwheel.json c9aa3f6acdcadfcd6f0c48457ddafcdd9ff37104 assets/create/blockstates/andesite_encased_large_cogwheel.json @@ -22,6 +23,7 @@ afff577673aec43b9a596c4663024cb35127e0c3 assets/create/blockstates/andesite_pill a97910c7516e7cedec9e34eca51f1183f1e3e681 assets/create/blockstates/belt.json 0ea03133af234921a3313f52521d8cfd02bf5d81 assets/create/blockstates/birch_window.json 2003c43151b731bf19cae58290c63bcb3785848a assets/create/blockstates/birch_window_pane.json +396e4772b041319fc86b50deded74f514945f45d assets/create/blockstates/black_display_cloth.json c8b65faf51122eb411f5895e718869da9b260c2e assets/create/blockstates/black_nixie_tube.json edcdce7ec6afbaa00952131df4b3f2c93c2c6919 assets/create/blockstates/black_postbox.json 980ae9ba3f6d4e0faea8f3878985f9a9dadc0796 assets/create/blockstates/black_sail.json @@ -29,6 +31,7 @@ da3ad0225984a0dcbfb4ed800e307e45aff5aaa1 assets/create/blockstates/black_seat.js 0083f6aa3fda2c7ebb2e5f2a032e740cf3ae3846 assets/create/blockstates/black_toolbox.json 28f2fb355e80171403e540afd2aed44e9c19659a assets/create/blockstates/black_valve_handle.json 06ecd28cd97f4e8200dc396858695cad57b871c8 assets/create/blockstates/blaze_burner.json +88793493e0a7e0713b5ea9f3bbb88395d690b873 assets/create/blockstates/blue_display_cloth.json 37caf031254b5171a1fbfe9906f4bc65e8dbc909 assets/create/blockstates/blue_nixie_tube.json 54f6aae1d573b27979689301ef1c2ad4a3bf6e93 assets/create/blockstates/blue_postbox.json d540f0f23e0d7c03f8e147cf3eebbaf7caec9f93 assets/create/blockstates/blue_sail.json @@ -40,6 +43,7 @@ a02d3059619edf0bd19dbf397cb35f0f8b8fb20e assets/create/blockstates/bound_cardboa d49d09f1026f816bb05a5dc13c806b860f2eb07a assets/create/blockstates/brass_belt_funnel.json 5a2551315557447abc579cf9225e3a12d9a46641 assets/create/blockstates/brass_block.json ac2f8f5e1d556e5c697da95729e82f107b115f09 assets/create/blockstates/brass_casing.json +a6af136d3a0822c17b331febb3c85ff057403fd8 assets/create/blockstates/brass_display_cloth.json 2ae65b2e9018a7445b42609e99b91e64cb2dff45 assets/create/blockstates/brass_door.json bac88b313b63acfc77c25b1463276a714f22f336 assets/create/blockstates/brass_encased_cogwheel.json 8a152aeb42b1e8fc3596886124139c811976bf7b assets/create/blockstates/brass_encased_large_cogwheel.json @@ -48,6 +52,7 @@ a408005aae4c1caa7aaae5a0ddf9d1ad73cd0254 assets/create/blockstates/brass_funnel. 1e8eba1ac6a0beb744f8b5feb96bbe5f3a75f214 assets/create/blockstates/brass_ladder.json 6d210298b9d80ae69aa03b09aa73b92e14b9ab1b assets/create/blockstates/brass_scaffolding.json 8ee948f9e87b82bb27aaecc522127fa1297b3d9d assets/create/blockstates/brass_tunnel.json +158c380605f071c89b9de21f2b2737449a72aac3 assets/create/blockstates/brown_display_cloth.json debf33346bf410216f21082e1e8d07aa6250b84c assets/create/blockstates/brown_nixie_tube.json c23d7f691bf532d6b27317c0063289a8bd747de2 assets/create/blockstates/brown_postbox.json 1334fc9e71d9f2a6117f448817263467a9c695de assets/create/blockstates/brown_sail.json @@ -71,6 +76,7 @@ b5170d754ce5f07ea2b4646eb07c099c50bae249 assets/create/blockstates/clipboard.jso 134c62bbd8ea43ff54c8edb2da5ea707f0a228fe assets/create/blockstates/copper_backtank.json 1b1e311efecc45ce7a3f69c8a1c2c53c6559b995 assets/create/blockstates/copper_bars.json 33175a9b530554e42e2ac68a9761d55f7f8623cf assets/create/blockstates/copper_casing.json +edbfe63a2432dae19b6b4efbdb5041ea1b9893e3 assets/create/blockstates/copper_display_cloth.json f7254f20f91e2f1295e36d2e70390d43f3952d07 assets/create/blockstates/copper_door.json 736777de0eb038ff1ef9e8fe9d04c23d80239eda assets/create/blockstates/copper_ladder.json df3103dfc1c3ba7a9573229d009cb0de4925df16 assets/create/blockstates/copper_scaffolding.json @@ -207,6 +213,7 @@ beb9e47f8d811c2146f68daf992fb805342a65cb assets/create/blockstates/cut_veridium. 212d8ee5dfa78802b9539640cf8b263fd5880b87 assets/create/blockstates/cut_veridium_slab.json c11f09df4a23e951bdf9a345515183f4fac7cde3 assets/create/blockstates/cut_veridium_stairs.json 3aa6f5e613ff73952e3de00408051f92316e7f81 assets/create/blockstates/cut_veridium_wall.json +d6d25beb53a4393839eeb94472c8feb4c80bac6d assets/create/blockstates/cyan_display_cloth.json bb627b2e78dba6833cf2d357033f253fc89aa1b8 assets/create/blockstates/cyan_nixie_tube.json 3406ab8baa7d9e9892c059c27b5ace92aadc2a80 assets/create/blockstates/cyan_postbox.json f1061b8f9757374d6608fda07e301a2623e79f72 assets/create/blockstates/cyan_sail.json @@ -252,12 +259,14 @@ ff9f56912d8ac4069df90505232820f9c45f5e06 assets/create/blockstates/gantry_carria 8ac0d74f418d2789a61dc5b451defcd2cb2687cc assets/create/blockstates/gearshift.json 5a193991f33a1af8659192f3693e4d8d3ed0082b assets/create/blockstates/glass_fluid_pipe.json e3f2a093c436cb65c5a7ac049a14cc4dadb22526 assets/create/blockstates/granite_pillar.json +f4e76daf384e628b76890b72775302d65f651176 assets/create/blockstates/gray_display_cloth.json 921cf220c44a67195c90a30c4c296e65311738da assets/create/blockstates/gray_nixie_tube.json f3153de05bb7658cd2d27ed6becea1b2ea687ae3 assets/create/blockstates/gray_postbox.json 30ba031a6b5a327d2a4caa12169676da573c2133 assets/create/blockstates/gray_sail.json f35a502c4a5e2703e7c6811b3d2ba16a9c47d4c8 assets/create/blockstates/gray_seat.json 87457e0eddae80225dbb3145f2d120296ea1bfcd assets/create/blockstates/gray_toolbox.json f18b87db39836eef20154b239d488eebb64b3455 assets/create/blockstates/gray_valve_handle.json +7d441d117efce42a787c86355fc69dbd052b5db0 assets/create/blockstates/green_display_cloth.json 0f0fe2bf83f763e04cd2d7a979beb547feac3191 assets/create/blockstates/green_nixie_tube.json 4446fdbf784366888215251fb082ff9b52c2ea6d assets/create/blockstates/green_postbox.json 0a2a5fbf2cf084e1be0426a224c291dc22a826fd assets/create/blockstates/green_sail.json @@ -294,12 +303,14 @@ fc0d3c258d8ee61c9bd16fdfc6565bce4e6df7b2 assets/create/blockstates/layered_scori ca124508c59130d21f23d7b1ef354d78bdd24dd4 assets/create/blockstates/layered_tuff.json 2ff5466f9ea3b1292c24a8ddb31666d74635c592 assets/create/blockstates/layered_veridium.json fcf02725651ab5973fab1cfc09fdd68cb4b93579 assets/create/blockstates/lectern_controller.json +2c52c5dff36461c2af7dabce69452fcb3fc13640 assets/create/blockstates/light_blue_display_cloth.json 5d7e1b08b1ec7c7c11b70db11df09311fcd7cf45 assets/create/blockstates/light_blue_nixie_tube.json f77864045801c12e9308f9ae75fa7c78de15bb7e assets/create/blockstates/light_blue_postbox.json f2354e8cb6086473ac97a5228b99706858dcad8a assets/create/blockstates/light_blue_sail.json 6b7045eaf9efe3a90f2d9a6785be6a5fd534b8e7 assets/create/blockstates/light_blue_seat.json b7065e7871c3c7f1a0656c2f92f82544e606f2fb assets/create/blockstates/light_blue_toolbox.json 549882a0f4de60906ca870a6197330f81d4e1afe assets/create/blockstates/light_blue_valve_handle.json +643092c9caa8e586833d9e7fdab7cb059810fb0a assets/create/blockstates/light_gray_display_cloth.json fa5fb2be73c7c54b70e927b66adf3f4d64c5cb6b assets/create/blockstates/light_gray_nixie_tube.json 63aa0bfbba64796ec0096972585d15d5cbed7508 assets/create/blockstates/light_gray_postbox.json 3d95c9c4442d1bdd660bae382c72c68134db86dd assets/create/blockstates/light_gray_sail.json @@ -308,6 +319,7 @@ fa5fb2be73c7c54b70e927b66adf3f4d64c5cb6b assets/create/blockstates/light_gray_ni 894827ffd176bc733abecf18d96888e9ed5a3eb4 assets/create/blockstates/light_gray_valve_handle.json a6f319c803c03e34bbf841ea52d82f0f7ec7a413 assets/create/blockstates/limestone.json 7ff65e1c4c8e48a0b694cd17506a192e6a7e6e44 assets/create/blockstates/limestone_pillar.json +34d900ed4c9922b82e39b2ee84d24eaffc7017ab assets/create/blockstates/lime_display_cloth.json 7f20b548dd535942b2d6f41c39de7ad4fafe637e assets/create/blockstates/lime_nixie_tube.json b1b07cbe36064d2755d0f2a4af036ec0506e6995 assets/create/blockstates/lime_postbox.json ad1ec304729fd6d336c0d4d0c27c9345af636695 assets/create/blockstates/lime_sail.json @@ -316,6 +328,7 @@ b9934a558e1b495403dc2c71ffb43cce7d396013 assets/create/blockstates/lime_seat.jso ba181485f219d3ae23509a7edf28e25d9edb10f4 assets/create/blockstates/lime_valve_handle.json 654e845cebed82b7afbcf81380921e0a475b01e9 assets/create/blockstates/linear_chassis.json e195e82e4d0c1fc20474535bc9068cbb77a5e175 assets/create/blockstates/lit_blaze_burner.json +66775372786ece9b6300b335cf6acbdd2aa91147 assets/create/blockstates/magenta_display_cloth.json 296186b196af94e1ab3f7e8a3254f6d31ae47a5c assets/create/blockstates/magenta_nixie_tube.json 32cf7fc7e7b36b6ef873658946a40cf7c32d5da8 assets/create/blockstates/magenta_postbox.json f150922cbed1c05fb3892d4ac91eb471234252e2 assets/create/blockstates/magenta_sail.json @@ -350,6 +363,7 @@ ba9c3ecfacbd398048440d247decffeaefc714b5 assets/create/blockstates/mysterious_cu 7f2c5728e24d60ed2f7a095e3a954d7ca4e410e9 assets/create/blockstates/oak_window_pane.json df91d0ca68934c1afd9858a8d1591dd4cb88df65 assets/create/blockstates/ochrum.json 09c9bee3d26edc4b87cb7a5042f125c439ee5956 assets/create/blockstates/ochrum_pillar.json +0042b5a229d8b7bf89333697fb53ffdda32a153b assets/create/blockstates/orange_display_cloth.json 42799faa0c59e6ed410c1ef42eceef25c323090f assets/create/blockstates/orange_postbox.json af4c2c4861d1410e1b7371a5bf3fe09ed3ab0077 assets/create/blockstates/orange_sail.json aab812cecf7d10d4e7587f4dead8a98238a15f41 assets/create/blockstates/orange_seat.json @@ -367,6 +381,7 @@ ef3af446b56c69e71a156d5998d9dc8e6d9ea4f5 assets/create/blockstates/packager.json 0f204afc6712a08d2db84bb07a0a49927f3127a6 assets/create/blockstates/packager_link.json 887565a0f89f089d6be888c87394dde4878afda7 assets/create/blockstates/package_frogport.json 36742cc6ce052ead143366d31b11e828a525c1b8 assets/create/blockstates/peculiar_bell.json +c4de02184f63ed2e7c98cfa5bb30f8c0da10a425 assets/create/blockstates/pink_display_cloth.json 53d102e706d53cb2c0dbc0bc11da828084a43519 assets/create/blockstates/pink_nixie_tube.json 8889da0684a2fd247a769cadbf94fd45e1c218f2 assets/create/blockstates/pink_postbox.json 213da5c04a33ae8ae7c0a4dec9844bbb6d670e33 assets/create/blockstates/pink_sail.json @@ -440,6 +455,7 @@ df7af1e49c53ae99ac3f0b2fca5d948b8ea91938 assets/create/blockstates/pulley_magnet 89d763258c53aa12a1e0c0e586ab701f3de5a1b5 assets/create/blockstates/pulse_extender.json 81281435b8d1eeb4f1e318c6d14d49fa1fd86820 assets/create/blockstates/pulse_repeater.json 65bfd8283749117663f7199204691758fd286e38 assets/create/blockstates/pulse_timer.json +285ff4a4289c3c62a7837639130033922127089d assets/create/blockstates/purple_display_cloth.json b658654aa97e8dd2c897f432a601835a3f8aca10 assets/create/blockstates/purple_nixie_tube.json af5db46f49be3c13eeb9bcae1803cc6fb47a1c76 assets/create/blockstates/purple_postbox.json f8f9802df9c0b4e39edeefc3b1abb38255d79801 assets/create/blockstates/purple_sail.json @@ -452,6 +468,7 @@ f8f9802df9c0b4e39edeefc3b1abb38255d79801 assets/create/blockstates/purple_sail.j ec546afd3ec8036e4393b97d535f05a86f57dbc1 assets/create/blockstates/redstone_contact.json ff205f032b36486753dddb1f2029ef8d53e9c86f assets/create/blockstates/redstone_link.json 9ae6198e13b456ef18582364644071a18cf9324e assets/create/blockstates/redstone_requester.json +d8446bc66d6d7da6d3533c961220d3180e4e4c0b assets/create/blockstates/red_display_cloth.json e3fd62e466e3e6e7bd6fc8661f764ba972a466fc assets/create/blockstates/red_nixie_tube.json d7535074a636f30247e7bd2f1a21685d3231d321 assets/create/blockstates/red_postbox.json 4c36b562da58ef2af57009da7cf2426059249228 assets/create/blockstates/red_sail.json @@ -597,6 +614,7 @@ c11562afd9a5f85945e521dcea5f911d1b6d13c6 assets/create/blockstates/weathered_cop fee668eb9a45dca0d287fee5811219d69f9ec3e2 assets/create/blockstates/weathered_copper_tile_slab.json da110f382368257e15431c77164aef82e014e3f8 assets/create/blockstates/weathered_copper_tile_stairs.json 25ce64b7af5d244f194da91ccf964a9bf5762327 assets/create/blockstates/weighted_ejector.json +1c8b590923b1d78f5ae34ef0d8ba487884b696b3 assets/create/blockstates/white_display_cloth.json 2974b34a8cfb0d4e8e010f8bd085584ea631d541 assets/create/blockstates/white_nixie_tube.json debbed52643d90ab054171f76622e54192be60ad assets/create/blockstates/white_postbox.json f079469d186087d23f0d91b384040f777b0088b1 assets/create/blockstates/white_sail.json @@ -605,6 +623,7 @@ f079469d186087d23f0d91b384040f777b0088b1 assets/create/blockstates/white_sail.js c0bfe8416173868f9916c4a54dd9f983887c5bac assets/create/blockstates/white_valve_handle.json ec2720e3f1bc84304d0c81cd23ff1e155b0c2f2c assets/create/blockstates/windmill_bearing.json d688e80dfbd5b17970814887c3698fc721981caa assets/create/blockstates/wooden_bracket.json +1ae2558e739350632a0c2f1a93aea5f832b54d62 assets/create/blockstates/yellow_display_cloth.json 157942a838aa02909fb2238ad9ce77edc82f6142 assets/create/blockstates/yellow_nixie_tube.json f99bf11ac6b2d8d2a315f354d7704a938241d95e assets/create/blockstates/yellow_postbox.json 68b6e267e93b96dbc0596ea4a1cd26636aa0e04a assets/create/blockstates/yellow_sail.json @@ -613,8 +632,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -33926a10d74a9fa696f64108554adb9217a82f33 assets/create/lang/en_ud.json -5da69b7b326804d29d050e403133080025109fe9 assets/create/lang/en_us.json +97bb7346fb696215f1c02603afc54d204d8359bc assets/create/lang/en_ud.json +d4dcb6c999fce54a6006b881c2d10c867f41df4e assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -643,6 +662,7 @@ d4ffa3f167dfa03728ed760db7b72480ac78da71 assets/create/models/block/andesite_bel 63dc5d1d36eda5131f6163d1c051ff5b5d60b1f5 assets/create/models/block/andesite_cap.json 088c4433e9199faf6a09032f443d1c5529c1f117 assets/create/models/block/andesite_cap_alt.json b69b845d2a5f93ec3c2339fd5d38fa8e1360a3ee assets/create/models/block/andesite_casing.json +42000612b61b62f66f61aa5cfbf8f26942155450 assets/create/models/block/andesite_display_cloth.json 7f3e4636d521a67eb621d5d27d6b175d455179f8 assets/create/models/block/andesite_encased_cogwheel.json 5a5a3aac31c44030880774b96cfecc40568abe75 assets/create/models/block/andesite_encased_cogwheel_bottom.json 82ce3bec0d6b5332b4f5007245ca2cdd8e28b9c9 assets/create/models/block/andesite_encased_cogwheel_top.json @@ -680,12 +700,14 @@ e80a3d387e8c40bf886735d46a119f9a93c6f5a8 assets/create/models/block/asurine_natu ee71b0992edc2496025c22806e8de3a3243882aa assets/create/models/block/birch_window_pane_post.json 3088aa5e46cf9caa912c80a4e7791904e64e9def assets/create/models/block/birch_window_pane_side.json cb9d3a0dbac6a884d5ce0dc82085322f8c666707 assets/create/models/block/birch_window_pane_side_alt.json +b8f853e8289d735f9a2a8b43785fa0995ac99112 assets/create/models/block/black_display_cloth.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/black_nixie_tube.json 1fe4a9cbcae773f32c07f7cef42f52588ec1c1aa assets/create/models/block/black_postbox.json 62c92a681b5a86a5415cc7a70263ffdc794cdd59 assets/create/models/block/black_sail.json 443ed49b053fdd7356cd56f0495e18f2570d57d9 assets/create/models/block/black_seat.json f48989d377de8e5067e807adf7e38da781e37ed9 assets/create/models/block/black_toolbox.json 8715787d72c3ef47c5651abcd819539bad6a96f7 assets/create/models/block/black_valve_handle.json +e0eebf58af7ce6789dd3908f216e81e363fcdea6 assets/create/models/block/blue_display_cloth.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/blue_nixie_tube.json e9e9487a3440b3a6c1ac515f63385ee59e8fb773 assets/create/models/block/blue_postbox.json ddc740084aa5f387bee062bd4141ad8fadb56355 assets/create/models/block/blue_sail.json @@ -716,6 +738,7 @@ baaaaf87b9b883ef028fbf42e4f8b1fe89f79acf assets/create/models/block/brass_belt_f f96d0c4880b15e2b85c3d3428e7a5db502d2a668 assets/create/models/block/brass_cap.json 0686785f47d3360012dab59291271a30ad039603 assets/create/models/block/brass_cap_alt.json d2c11a9d736b8cb17b7face08f00202ecb12b4df assets/create/models/block/brass_casing.json +b2892b3e41efa1c14fd72bb33150149fcc4713fa assets/create/models/block/brass_display_cloth.json bf9a54257daa3e2787c8dcd84d42b9eb72503b5b assets/create/models/block/brass_encased_cogwheel.json ef13822bd18d37e7cf5d2c37e3fd3207cf2c58c1 assets/create/models/block/brass_encased_cogwheel_bottom.json c2187c0544513e96b440432f373f60845398af8a assets/create/models/block/brass_encased_cogwheel_top.json @@ -739,6 +762,7 @@ b2a95218042586aae38dff9278f3ee3f159bc73e assets/create/models/block/brass_post_e 62d99236e09b11af9a24d3c667fb1167cf8db0b0 assets/create/models/block/brass_scaffolding_horizontal.json ec81e9c237ec98b30a3de22e12cb9720922478eb assets/create/models/block/brass_side.json c697cace1f4097468ff34254c4ff6450d9d52f91 assets/create/models/block/brass_side_alt.json +5996b728460cf24e25890d977cdca49d2927465a assets/create/models/block/brown_display_cloth.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/brown_nixie_tube.json b04c80852527a07e01c27686be678cbaf568e821 assets/create/models/block/brown_postbox.json 50a054d1e0660d16e86cf7a520b9bf36e38401b6 assets/create/models/block/brown_sail.json @@ -752,6 +776,7 @@ d8339ab47ffa828985c7da27c37794a95aba8b42 assets/create/models/block/clockwork_be 8afe6afaff33b94c1fcee68fdaf842d525eec212 assets/create/models/block/copper_cap.json 58e6ed1f765ba67ca5d8a446af357f311587e431 assets/create/models/block/copper_cap_alt.json d8053f194ee9331288aadac94bc23fff5a63ae9c assets/create/models/block/copper_casing.json +7a7002f487eb938dfbfbb04236f2ce01b925fc52 assets/create/models/block/copper_display_cloth.json 2606721928394e80b24b5f0ff7011c1c552cfe7c assets/create/models/block/copper_ladder.json d063df8e9b974c11fc7810ce176b02d7d924e15b assets/create/models/block/copper_post.json 2b5aed4a917694beb33d9b0ecbc800dcbc143ee9 assets/create/models/block/copper_post_ends.json @@ -1065,6 +1090,7 @@ d6423c0fd0af4fbd929d26d6097a1722567acc9d assets/create/models/block/cut_veridium 579e9da7420bfb7fdd354c80534426262a941a7c assets/create/models/block/cut_veridium_wall_post.json b2e847cee8c01791c15fcdd35787af33ebe46f0a assets/create/models/block/cut_veridium_wall_side.json 5ab4db4245b852edf985fe72595f678eb7372801 assets/create/models/block/cut_veridium_wall_side_tall.json +983788579d7ec61b805d1057b81a18282af38365 assets/create/models/block/cyan_display_cloth.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/cyan_nixie_tube.json 0cbd0c6c909effa2f71e198655d51f2e483454aa assets/create/models/block/cyan_postbox.json 27c9aff76b32e4de18d581e133fc23a8239ca412 assets/create/models/block/cyan_sail.json @@ -1147,12 +1173,14 @@ d0fa41de17f65693188f1868ace5fc2ac518739b assets/create/models/block/gantry_shaft 2cf599d083948513c5fbfd92ea8f47c0c215cfbc assets/create/models/block/gantry_shaft_start_powered_flipped.json 3356069e112cde817da0c99ceb40cd8f207de822 assets/create/models/block/granite_pillar.json ee860a8bd95fda14a859d6632652ee2a95f06c19 assets/create/models/block/granite_pillar_horizontal.json +ca01316f75239f08d7da81615779f8eb002de88f assets/create/models/block/gray_display_cloth.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/gray_nixie_tube.json f2bbb067bc4e91a71303cc92939c4f4707cdc1ab assets/create/models/block/gray_postbox.json 97f382e9b435c81d1d8e0ed487a7fc16e6945958 assets/create/models/block/gray_sail.json 58b51da5c80e4f43582452d97453c93145a516ad assets/create/models/block/gray_seat.json cd3cff8e38d559dcb78df014556a78d5a538af43 assets/create/models/block/gray_toolbox.json 3ee19f46bdeb0ac7489dcd4d51f90ab01ad863c9 assets/create/models/block/gray_valve_handle.json +71fae019670515f2c5bf7bd1f7930d76b6ff3e15 assets/create/models/block/green_display_cloth.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/green_nixie_tube.json 21fbacdc856fb1003f58bf2842fe418124f6b01d assets/create/models/block/green_postbox.json 26577589688ec1f39cae9f42704cb36cbc1c48ae assets/create/models/block/green_sail.json @@ -1191,12 +1219,14 @@ b843a6e27c4f90e31108f9f3c1573e70fb3d0927 assets/create/models/block/layered_scor 714fce357bab1fd9b9134aba560125c39b733a4e assets/create/models/block/layered_scoria.json 5fb53db0c6623dc16e486ac0bd094b5a90e2e080 assets/create/models/block/layered_tuff.json 336d1646294e018ea3de60b30a621a10ca7aa6d7 assets/create/models/block/layered_veridium.json +f479a8a6964c52fc3b072ca3170d5b478f62842a assets/create/models/block/light_blue_display_cloth.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/light_blue_nixie_tube.json cf487c0be9444b7ac124d2ae33e6c545803e14b6 assets/create/models/block/light_blue_postbox.json 2e83d3aaa92640d6b3da2a2644f6a160f97b08e4 assets/create/models/block/light_blue_sail.json ba917560f40a4e46ef190649f18adad9962c5c02 assets/create/models/block/light_blue_seat.json c20616aa90feab3003cecb4a5be5466c0fc83072 assets/create/models/block/light_blue_toolbox.json bcd3d28b8a062649301648ea5e2d0463f93d008d assets/create/models/block/light_blue_valve_handle.json +8de84b9d3eb33403de699c5c5c4093e32b1685f9 assets/create/models/block/light_gray_display_cloth.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/light_gray_nixie_tube.json 1efabd28f0dc3db1c0e6bea2be62cac883fefd66 assets/create/models/block/light_gray_postbox.json 09f284574b38ab57579e939bbb088b8d36e0b8f5 assets/create/models/block/light_gray_sail.json @@ -1206,6 +1236,7 @@ adb8dbed70419e0310e7a20f3656bf325b348434 assets/create/models/block/light_gray_v 8f53caad3899a30be5087a0ba155080834418cc0 assets/create/models/block/limestone.json 2b80f9421c2fe902d55d9bd95183ad4bae46c315 assets/create/models/block/limestone_pillar.json fb18280a2a708f60b00cc7c675804c219784871a assets/create/models/block/limestone_pillar_horizontal.json +023f2538cd860e3ade165390eab9e4fe32847402 assets/create/models/block/lime_display_cloth.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/lime_nixie_tube.json 952d292d4dc2158e6106c5079cfa1ddb81c7777e assets/create/models/block/lime_postbox.json 5a95a72444f523cfba6e8c5adf8eacbb37e2d21e assets/create/models/block/lime_sail.json @@ -1216,6 +1247,7 @@ b92822a01e4fbed2463b1bdf7dcc736023988e20 assets/create/models/block/lime_toolbox 29ee936c09c1222c6a144e5bb39577b5a9cd28bf assets/create/models/block/linear_chassis_bottom.json a1a3804ddcb1db0a7b5c0693555f8eb326950dd0 assets/create/models/block/linear_chassis_top.json f885acc0ba705cfa9c65b62626ab4007f3b6e329 assets/create/models/block/linear_chassis_top_bottom.json +e23d016fe71681e6b13fece5d14d95da5fb45fbb assets/create/models/block/magenta_display_cloth.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/magenta_nixie_tube.json bfea3fd456f92391afc9f948ade90b16275e63de assets/create/models/block/magenta_postbox.json 81122f26a12b7ab40fed6d31c97376f4dfffa111 assets/create/models/block/magenta_sail.json @@ -1242,6 +1274,7 @@ af50363d603d61340b336569d58c1febde253665 assets/create/models/block/ochrum_natur d69effa0a811cb93fead8257bcaad4bbf0094002 assets/create/models/block/ochrum_natural_3.json 24669a4e93925940477fcfc0aca10ab9d87368e0 assets/create/models/block/ochrum_pillar.json c8dd33a0b71dce37712788a61729de89574b117f assets/create/models/block/ochrum_pillar_horizontal.json +6ba7beb0581d761ce06dad03cdd19e591e392546 assets/create/models/block/orange_display_cloth.json dbd0cbfa1c6cfaddd7ac954379b4b1f3056730f2 assets/create/models/block/orange_postbox.json cb4cd4e4bfb0d105a09c56454abf4795b155d12b assets/create/models/block/orange_sail.json 6c4addc75fb03911fca3083f891b22f55209b8db assets/create/models/block/orange_seat.json @@ -1269,6 +1302,7 @@ f8b51eec36c2eddc08a1b60894d863bb58f55625 assets/create/models/block/peculiar_bel f70f83cfec770879c478eea3760ea187700f2878 assets/create/models/block/peculiar_bell_double_wall.json b9c9d00b844ca2f217ae21cc502cd4d082fed2d5 assets/create/models/block/peculiar_bell_floor.json f7b09c243cfeda8bb38a29a917b9fbdafe47eece assets/create/models/block/peculiar_bell_single_wall.json +266d126aa95d03fc274d838986fc1f53519f4e10 assets/create/models/block/pink_display_cloth.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/pink_nixie_tube.json 084266ced8975953fa158fd9e7261d8f10b94db7 assets/create/models/block/pink_postbox.json 90113a1f53f0f8d9ce11ff14128eb860063f5ddc assets/create/models/block/pink_sail.json @@ -1428,6 +1462,7 @@ de0cc956e7ff1510d0947ca8fd2b6e642944f0ee assets/create/models/block/pulse_repeat addbe93af945ff7ca2680a27225db804d3ac9b46 assets/create/models/block/pulse_timer_powered.json ab3d7e10abcb53b835d6f5c406b7a777a942d6f7 assets/create/models/block/pulse_timer_powered_powering.json 7b425d9db8d914b52b7faad2f792c020b678f84d assets/create/models/block/pulse_timer_powering.json +7688c890be93afa905bd869ef0bcdc603bce9a78 assets/create/models/block/purple_display_cloth.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/purple_nixie_tube.json afdd265ee175c47ea6e4e44fb08d212e4cef5ee5 assets/create/models/block/purple_postbox.json 356378a5839b0b400aa5e0a67740634113c09a38 assets/create/models/block/purple_sail.json @@ -1442,6 +1477,7 @@ ff65b89683fbb9326f625b9a68f954def5ed000d assets/create/models/block/radial_chass 2a59eb4074dba8ea4acbef2260171c11d93e12e6 assets/create/models/block/radial_chassis_side_z_sticky.json 9d234d1294f927d1e70a5c9b1e6de73ef65e7014 assets/create/models/block/railway_casing.json be8042806b08990786ced1cf140c4942d7a6788b assets/create/models/block/raw_zinc_block.json +832899421073c18da17bf6919c97e2f3cf9a6b77 assets/create/models/block/red_display_cloth.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/red_nixie_tube.json 844614001c30ef34d3136a350c12018c5e9ab341 assets/create/models/block/red_postbox.json b692deeb65f338212fb1073b725a122b7b1359d5 assets/create/models/block/red_sail.json @@ -1700,12 +1736,14 @@ f32a18c76cfaca2153f6321880a8da1347be37ce assets/create/models/block/weathered_co e26dd64495ff8801593e9c22203cbf364075badd assets/create/models/block/weathered_copper_tile_stairs.json b658c1022587bd670b5acee267607719c1544332 assets/create/models/block/weathered_copper_tile_stairs_inner.json e7ae89577be9d26a071bf96cbd7ed80293902b63 assets/create/models/block/weathered_copper_tile_stairs_outer.json +15316edd1babb61b1458cf81feaf2c3e135122b6 assets/create/models/block/white_display_cloth.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/white_nixie_tube.json 998d838964c6c5bc2a1903b5098491abf5d819bc assets/create/models/block/white_postbox.json 99f0628623a36ac1700a5876cec010ee6353162f assets/create/models/block/white_seat.json f252f8c68702a0c050797a2dc2a51c586408722d assets/create/models/block/white_toolbox.json c9e344a06ee8bca1bfddd70481198135cabafbce assets/create/models/block/white_valve_handle.json 68d8eddfb724c73938862fb1a213a99c95814fdb assets/create/models/block/windmill_bearing.json +6c063bc2ef06940af3a1d3d0f1546030bdaef672 assets/create/models/block/yellow_display_cloth.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/yellow_nixie_tube.json 9abbd0af47396b1cb18362b423f497ddb40eede4 assets/create/models/block/yellow_postbox.json cf8477d6c7558ceba38416fae755567086a856a6 assets/create/models/block/yellow_sail.json @@ -1722,6 +1760,7 @@ be9e4a7937dcb87bce696e6ad234c9eff8cd299e assets/create/models/item/analog_lever. 158270c9fa3022d1afb56002d0ea1db3366467aa assets/create/models/item/andesite_alloy_block.json d497fcfe54f9caddf1925cc303f9f9a62015e0ae assets/create/models/item/andesite_bars.json 11c747281cbe2d96324db27fec020100b50977d0 assets/create/models/item/andesite_casing.json +09d48b7e4f3e89f2b46f84a2dd981d09b1a0a91c assets/create/models/item/andesite_display_cloth.json ab09b7886916048add1fa0ea9e87c4644a781031 assets/create/models/item/andesite_door.json 944cbae9f7c4bf7d1734d25645cfa6b0d0f2c33d assets/create/models/item/andesite_encased_cogwheel.json bb351157b7f6771be05b4cecef17b8610c3810b3 assets/create/models/item/andesite_encased_large_cogwheel.json @@ -1739,6 +1778,7 @@ def88cd2c79a1f0ed40bbf5a0332187dd1d6006e assets/create/models/item/basin.json 35a1e2cb2645a8386dfee2697b47547b3f9a1dd2 assets/create/models/item/belt_connector.json f5dcb9096a52d5d2eab1e4204fbd1222e0d5094d assets/create/models/item/birch_window.json eccafeec52e4195fbe211c602b4fc71a260d8a64 assets/create/models/item/birch_window_pane.json +204c6bd54cb28e9403e7842320b4d58e5a0a2aa5 assets/create/models/item/black_display_cloth.json 641b85751f91c0b4931307548c12034fc56286bc assets/create/models/item/black_postbox.json 7ca635d45fef81e6681a492be6c7bb71fd0f4574 assets/create/models/item/black_seat.json e2dc1a8db84d84d592bfd91a26464343b8706bc0 assets/create/models/item/black_toolbox.json @@ -1746,6 +1786,7 @@ e2dc1a8db84d84d592bfd91a26464343b8706bc0 assets/create/models/item/black_toolbox c31038397821b6abe296d2799aa81edf3c12d095 assets/create/models/item/blaze_burner.json 9d28754112688323a6b55ecb6742e918eabfd6a3 assets/create/models/item/blaze_cake.json 01637416bb932d861e9c9b10b256b2fdf4c96d44 assets/create/models/item/blaze_cake_base.json +e5ec8be9aa7d7e33c35e095a28ee6d52dc3a88af assets/create/models/item/blue_display_cloth.json ef453775edb9342dc68e0e4ed7aa2e845b819fa6 assets/create/models/item/blue_postbox.json de8beb7ef521822eb9b2826806baf1fa3344a45d assets/create/models/item/blue_seat.json a82bc56a503cd15d2354c86a49fc6d1d4ed22767 assets/create/models/item/blue_toolbox.json @@ -1754,6 +1795,7 @@ d16ce54ed4e2546f168d3bcf7d748ff749565316 assets/create/models/item/bound_cardboa 4e711f64e0ab7d16c550cc4aa8b876d604dfb2af assets/create/models/item/brass_bars.json 136f97f26217c51c932d79bf715b2a1a92e6595e assets/create/models/item/brass_block.json c876713c3b8ed6511679d1e3186e6d6031190dd5 assets/create/models/item/brass_casing.json +a0423c680718c221381a201a3c229bcd8b99c751 assets/create/models/item/brass_display_cloth.json 378a2f1820c9abdc1080c940e5a01e30c25ea5cb assets/create/models/item/brass_door.json 2bff62a6d695a0affa217569c764e37b584495f9 assets/create/models/item/brass_encased_cogwheel.json 14cae756c604d0ea39f640f7cedc11cd403562f1 assets/create/models/item/brass_encased_large_cogwheel.json @@ -1766,6 +1808,7 @@ a51a28424e75dbd11c845f455c778d4c578b9da4 assets/create/models/item/brass_ladder. af97ba84be90381e2cc9434e31e2199c2e7e3aa6 assets/create/models/item/brass_scaffolding.json b78e9274156f5027a9a3b6fb7725c57a7aecc8bb assets/create/models/item/brass_sheet.json 28e104d5041c1f4676704c0f6b4e2e80aac43106 assets/create/models/item/brass_tunnel.json +65a548c6f3117d14e94f17e5ee3a60909a973c3f assets/create/models/item/brown_display_cloth.json 35c8539a0b2f927e65a43c3a2c3cb82db429c2eb assets/create/models/item/brown_postbox.json fce64539b36fc8a5ffa39d7a3f73765818437cbf assets/create/models/item/brown_seat.json 90c1ec317beed0b5735c8731e3115a695b7060f7 assets/create/models/item/brown_toolbox.json @@ -1806,6 +1849,7 @@ de48f4b6fa26928ebc7d5d60e6a0767093430d65 assets/create/models/item/contraption_c 6c53b1a6ed28929b7a0a090edf6101e610f842fc assets/create/models/item/copper_backtank_placeable.json 2a0b31d76ab8a74c458475640d17de15ad314fcd assets/create/models/item/copper_bars.json 688e4dee99126b7507761de618d6788c18f17153 assets/create/models/item/copper_casing.json +48440557057d868cd507cd2973559b9fd3874d52 assets/create/models/item/copper_display_cloth.json 68890c027cd6a094b484a237d3ff5daeb09622af assets/create/models/item/copper_diving_boots.json 23499699c6ea6a30673835056f5d0039519413fa assets/create/models/item/copper_diving_helmet.json 0e394c50a977eae45d3d8e6a62e256a5408ac994 assets/create/models/item/copper_door.json @@ -1959,6 +2003,7 @@ f633006045ccfcdf486d7a240217229d6eed717e assets/create/models/item/cut_veridium_ 410b949304faa5856028f7c42ab762b7498ffd95 assets/create/models/item/cut_veridium_slab.json 62697c0922b11537914d2f4f84faa0b909ee518d assets/create/models/item/cut_veridium_stairs.json 3921d61a26d48d999cbb2f6645611e53ea71978b assets/create/models/item/cut_veridium_wall.json +8249e035f7218d67e057c903cba06324c09bb658 assets/create/models/item/cyan_display_cloth.json 73c2eed9b6a906a519e27361211ae05bc6ed2d87 assets/create/models/item/cyan_postbox.json eef3be2fa3b6424436a553e3c1bfee3979015962 assets/create/models/item/cyan_seat.json 265d5d6de4238442bb9b161dba0a2fc2f063df0b assets/create/models/item/cyan_toolbox.json @@ -2010,10 +2055,12 @@ b17d9fd1a92db0965f2e5da6215956b0451af29e assets/create/models/item/furnace_minec 7c850a41a754e46bb9c9f257ed621e37a1b9506a assets/create/models/item/goggles.json b1ae37998326c8ca054e57b0cbff0b51cad98625 assets/create/models/item/golden_sheet.json 85c301898775d5720d4d11c1c555b331a5c2e93b assets/create/models/item/granite_pillar.json +aaf4f056415a83e02a8c7fa0bcf19039510b732b assets/create/models/item/gray_display_cloth.json 44173ca711aa497d08ca3b8a9613290378072870 assets/create/models/item/gray_postbox.json b8d6d2d163e2ab5f654bbc4eda9ad63f8064d27c assets/create/models/item/gray_seat.json 6492f86b693f924d0222d0ca1d16fbe33d797b1a assets/create/models/item/gray_toolbox.json 2a9500f9630b1da44615c7c9ca145b56324c46bb assets/create/models/item/gray_valve_handle.json +ea83c3f62c9cbdd63bccc2440783c5d4b4bc78fe assets/create/models/item/green_display_cloth.json 1a97f63df2977ac2f2e3363c61a7e36bf60d3ce3 assets/create/models/item/green_postbox.json 2843370b0e693e1ba1777c26416914edbd87c4f9 assets/create/models/item/green_seat.json 561e0579101bf602b252c0b9a5eec468c89d0e40 assets/create/models/item/green_toolbox.json @@ -2051,22 +2098,26 @@ a22638fd361a8185175e107a8ee092a9ac030b7b assets/create/models/item/layered_grani 14494272713544a1595d654fd397a986b2da0951 assets/create/models/item/layered_scoria.json b1174d783c62dda84aafd4259c622197f4664421 assets/create/models/item/layered_tuff.json 952b07dbf9ecc1883deabaa1344667f13936f7f2 assets/create/models/item/layered_veridium.json +6a90dedcacb1f49192edef3d595485a851e01210 assets/create/models/item/light_blue_display_cloth.json 623c937db944651cf1075b3875afe002db527ed6 assets/create/models/item/light_blue_postbox.json b44a9f1bd9079f3533d7f708d76eb19a864e5ebb assets/create/models/item/light_blue_seat.json dae914625ff1bc3ebe1463485cad4526a7d7e9f5 assets/create/models/item/light_blue_toolbox.json 1d94314f185151eb9dcabcef950abf6f86c3c836 assets/create/models/item/light_blue_valve_handle.json +8625b55c38664eb3edc3449b3071ec8363cb1cfd assets/create/models/item/light_gray_display_cloth.json b56a28924b0b1b2530ebac7834e011700b09b966 assets/create/models/item/light_gray_postbox.json 1747bcdea3b1d3f5dfb786102069e07198d36dfe assets/create/models/item/light_gray_seat.json c8513eb1c89652783e26d7dcfcf64afa97619bc8 assets/create/models/item/light_gray_toolbox.json 3774d23e76b5712e7004e333e0a770f2230c2998 assets/create/models/item/light_gray_valve_handle.json 8f53caad3899a30be5087a0ba155080834418cc0 assets/create/models/item/limestone.json fba1e7d1cad39c89976b427db62544d80f47ad5d assets/create/models/item/limestone_pillar.json +db293a19bce89ee56cbd08d46357fafae8e8d53a assets/create/models/item/lime_display_cloth.json 26b8e1daf9cc4b206fb5f62904c7f1701ba93e67 assets/create/models/item/lime_postbox.json 32cd55a1c97a31a13ad106a457ec9925aa91f6d3 assets/create/models/item/lime_seat.json 931d187c11cb95a0eeae8f256187ef551b42007e assets/create/models/item/lime_toolbox.json d0f4148bdb0a905e68f54b5dfd829fd47e528fea assets/create/models/item/lime_valve_handle.json 1d30f9b525e8e9736b34a92f848e235c71fd6bd8 assets/create/models/item/linear_chassis.json 8f622f5f79446f6060d9e8815205fce919c8c829 assets/create/models/item/linked_controller.json +0328f4c819026affcf6c260a610a783433f22da0 assets/create/models/item/magenta_display_cloth.json 538e28af9013a43c258a659cbe67671991f3eee7 assets/create/models/item/magenta_postbox.json ad6fd371ee989c9c3c21e762273e8a4e903f0af8 assets/create/models/item/magenta_seat.json 7c0e3f91e5ab029473736deffb2b2aab9d4763c7 assets/create/models/item/magenta_toolbox.json @@ -2101,6 +2152,7 @@ f80358eba19bc8d1741e4e25753866799631a118 assets/create/models/item/nixie_tube.js 061587faf0e53e4fac0c8f2f3bd6b22020b2a3ee assets/create/models/item/oak_window_pane.json af50363d603d61340b336569d58c1febde253665 assets/create/models/item/ochrum.json 62ec1afee14f9de3f5b02ee930d002a240a3c337 assets/create/models/item/ochrum_pillar.json +0357d442273a13f506451c0711480b1beab1cb33 assets/create/models/item/orange_display_cloth.json 226f99c241b1d8b03d8fc57db32c1bee0721b64f assets/create/models/item/orange_postbox.json 56e7d28824d3fc566b5f551babbe423a550ef08c assets/create/models/item/orange_seat.json 96cc543d5afed90a022ece7b8671cd47a9b6fb68 assets/create/models/item/orange_toolbox.json @@ -2118,6 +2170,7 @@ a8538df19e47fe37401c9fbedbb867b5d612a51b assets/create/models/item/packager_link 5b974e55caffdbfc2156eb8b59dd99db12243bd3 assets/create/models/item/package_filter.json 7fd76e7d2e6c6d94352f1fa08d096b63616ad01e assets/create/models/item/package_frogport.json 76aeceb41bb7df873dbafe1bd5e26deb24abf93f assets/create/models/item/peculiar_bell.json +50bf80632cf4b569b417ca5a18f2706ef35aa8c8 assets/create/models/item/pink_display_cloth.json ab6c05a0468f3f4295a07adb362fa2d36cf6e3e8 assets/create/models/item/pink_postbox.json df13d4281dc45041ecd93504d45daef61d070581 assets/create/models/item/pink_seat.json 842afb2a345dbaba857e90f7dffa724841ef7b2d assets/create/models/item/pink_toolbox.json @@ -2192,6 +2245,7 @@ d9a736e7a6fc70e0848de3e318c739d58b1e563f assets/create/models/item/propeller.jso 9b41eec5759887be9bae3d27654bf478a7eff676 assets/create/models/item/pulse_extender.json ea76bd3bd9e5bea4d64d91347d473b538e926b02 assets/create/models/item/pulse_repeater.json 6ff9ce0cc633ea39b779b2e873a1d0fd7cfe7119 assets/create/models/item/pulse_timer.json +a9a62a4f51e71abd935f0afc025689f20c81830c assets/create/models/item/purple_display_cloth.json 8496f6c5449a70eef12e9c68ba46eee2f365fb77 assets/create/models/item/purple_postbox.json 7e165f83266edf34bb03fa3e8d2a83d44829c10a assets/create/models/item/purple_seat.json d75c4969334f2ee1ae4a3d8ac28b001735c76b97 assets/create/models/item/purple_toolbox.json @@ -2203,6 +2257,7 @@ f91405b9aec1e0142c1b90582e03a1973251da05 assets/create/models/item/radial_chassi 9dc6c52e258b00cac6ed23147983045c43218b5d assets/create/models/item/redstone_contact.json f8f733364bdd32b2ad597e81103bc02344ce63bd assets/create/models/item/redstone_link.json ae0ba4827a81bd51c5c01178c2ccdae3a722628a assets/create/models/item/redstone_requester.json +2a42d190811be5ab90b35935c8b69be409944061 assets/create/models/item/red_display_cloth.json 4b73ee9cc2651a3d1a97476d100f9c4d7e2b2efe assets/create/models/item/red_postbox.json 8d00eb1a10055a802556eab10e13f522d12acd1c assets/create/models/item/red_sand_paper.json b64a054c92cbd2e055502d470f3921d1077e63a1 assets/create/models/item/red_seat.json @@ -2360,6 +2415,7 @@ dadc7b65a4527e288c21a20df978796a8c444fd2 assets/create/models/item/waxed_weather 79431edb868e6560f4f6d5b3441c0176c7699f5e assets/create/models/item/weighted_ejector.json 0fd2214cdff8a92e05d9d5ee888329b3235143c0 assets/create/models/item/wheat_flour.json aacced59d21212090d508a9684bb46c9472a8a2f assets/create/models/item/whisk.json +c9ea8eac03920449cca3646f5c524a5634825a4a assets/create/models/item/white_display_cloth.json bcf3104e463ec212dc239281033e4e80d78e1d74 assets/create/models/item/white_postbox.json 4e112e82185e2c1a5c57f5a94fa11c59c92cef0d assets/create/models/item/white_sail.json 17ed8ac7d745117f622190a46c5e1b42892afc29 assets/create/models/item/white_seat.json @@ -2368,6 +2424,7 @@ bcf3104e463ec212dc239281033e4e80d78e1d74 assets/create/models/item/white_postbox bccccbdfa5d376936e123defa44f2907dc317617 assets/create/models/item/windmill_bearing.json 47c6ad1c146366156a0ec4bc1cbf74282784698f assets/create/models/item/wooden_bracket.json 6c08d2fa59e56e4848063ab6f3e45894b89f1744 assets/create/models/item/wrench.json +f185d037ab7d78d72b9e3e96a09fb510766dd021 assets/create/models/item/yellow_display_cloth.json 3a899db3044ee39ac5d6385c16630733e00f77ca assets/create/models/item/yellow_postbox.json ac59f141cd3c3f7e57a794e542d6e22bf8ebb8f9 assets/create/models/item/yellow_seat.json 532a429d58a177f61b4d67180db7676fa7536052 assets/create/models/item/yellow_toolbox.json @@ -3041,6 +3098,7 @@ a7b37cec417ec9f9095e2ae11c990e4906d6af0e data/create/loot_tables/blocks/acacia_w aaaedbe325d5358d10e15389009dbf7fbf9bc637 data/create/loot_tables/blocks/andesite_bars.json d46459cf38853767c34bda3909f24370f2d6943d data/create/loot_tables/blocks/andesite_belt_funnel.json 3086cbf5ae5034d23ddd6c057d113736cef40516 data/create/loot_tables/blocks/andesite_casing.json +c0fe0077dbc4f204524fda795c225af0ac8f7bea data/create/loot_tables/blocks/andesite_display_cloth.json 58e150c67c259f5460e5c5dd5cbf6e4cf7299d69 data/create/loot_tables/blocks/andesite_door.json 9a5be1db8d171e74d256ad3326004452bf86a07b data/create/loot_tables/blocks/andesite_encased_cogwheel.json 4b71486ad67bc07dbae4fed50fb12d0a08d40841 data/create/loot_tables/blocks/andesite_encased_large_cogwheel.json @@ -3056,6 +3114,7 @@ d408536459078c1d72770b7431137d7d8d8ff3bb data/create/loot_tables/blocks/asurine. d964b7a8f6a4ce28ce640d31a01e77eafcc181e5 data/create/loot_tables/blocks/belt.json a268eb02c10015a901a6543595b2b815a8026d78 data/create/loot_tables/blocks/birch_window.json 43d16eae230de501c528f4e9af666f72a081ed29 data/create/loot_tables/blocks/birch_window_pane.json +ce69fa46ae674bf52b428e7193643deba9587a32 data/create/loot_tables/blocks/black_display_cloth.json 4aec2374e76dfa5535fe22b1fc02b4b2d453217d data/create/loot_tables/blocks/black_nixie_tube.json 6ed685605e24af5c6ff5d797dde8492069427b76 data/create/loot_tables/blocks/black_postbox.json 7ce6dd2c0d02eb1b56ec441044dfc608ea6bcb41 data/create/loot_tables/blocks/black_sail.json @@ -3063,6 +3122,7 @@ a268eb02c10015a901a6543595b2b815a8026d78 data/create/loot_tables/blocks/birch_wi 2d33e25b2741f634bbd6cd77b31c17dd94511d94 data/create/loot_tables/blocks/black_toolbox.json f911ac185cd48afa2393d24f28a688936a9fa147 data/create/loot_tables/blocks/black_valve_handle.json eee41c02c8cfcdb56f31e74fc266783b785bea9d data/create/loot_tables/blocks/blaze_burner.json +4534238bd7e514f0f00cb44cd86f7ea027f405de data/create/loot_tables/blocks/blue_display_cloth.json 247d12823eed3b9248003aca8e3ead87972ac61e data/create/loot_tables/blocks/blue_nixie_tube.json 76217732c9bddf77b7de735b4380d9f92adca9b3 data/create/loot_tables/blocks/blue_postbox.json bb9d906a97810ed1461ed321ef8e4bee1dd104fb data/create/loot_tables/blocks/blue_sail.json @@ -3074,6 +3134,7 @@ bb9d906a97810ed1461ed321ef8e4bee1dd104fb data/create/loot_tables/blocks/blue_sai 64a5869c6b3edeca06771f8ef64ef9521d83302a data/create/loot_tables/blocks/brass_belt_funnel.json 78ecee2c9baf6b0c78f6c7aa692e102a3f4dda74 data/create/loot_tables/blocks/brass_block.json d45666afba904c2f3fdcfe78a4d22f0ab98efa5d data/create/loot_tables/blocks/brass_casing.json +c6f6defa8fe799c8a5123bec0a96b77b94f3d81d data/create/loot_tables/blocks/brass_display_cloth.json bb07dcb6f4f1e01b85a00ab0fdfb27100e8a5622 data/create/loot_tables/blocks/brass_door.json ac59fa67bd9bc003afc50202d0ca576a9b0a2957 data/create/loot_tables/blocks/brass_encased_cogwheel.json cecada7e520f41c014929136b53509b9b75c2dfd data/create/loot_tables/blocks/brass_encased_large_cogwheel.json @@ -3082,6 +3143,7 @@ e466a397f84957616f7e83954db2050355f052c9 data/create/loot_tables/blocks/brass_en 8d58d4c771843950a14fd7b800a05736c1fc88d9 data/create/loot_tables/blocks/brass_ladder.json 429d524c9848b44d19028126f0efd678e0c4b680 data/create/loot_tables/blocks/brass_scaffolding.json af90102bfe0e3a14bf1330cddec553f27b8fba89 data/create/loot_tables/blocks/brass_tunnel.json +3411fafe31f602d71a5ff7c220e66fc25b66a548 data/create/loot_tables/blocks/brown_display_cloth.json d391cff5b741fd6ddf5b6fa64e05526eb3a9f0d9 data/create/loot_tables/blocks/brown_nixie_tube.json bfa0365507a888134c20b36af4bd7944263687f0 data/create/loot_tables/blocks/brown_postbox.json 862bd3ceed05ea45c03911bb8403817b73c4bc38 data/create/loot_tables/blocks/brown_sail.json @@ -3104,6 +3166,7 @@ f2058ad809606d54123c7efbad2a6b995ed1defe data/create/loot_tables/blocks/controls 639d3d5bbbc452b2c4d170cf005dce9b3bcff26c data/create/loot_tables/blocks/copper_backtank.json fa0856e11351ad0882de2066569807e782071881 data/create/loot_tables/blocks/copper_bars.json 5f48b688829ca7849997d88697cff2de1ede4804 data/create/loot_tables/blocks/copper_casing.json +8a8fb6ef3420d7da95711af8df572a784ad5805c data/create/loot_tables/blocks/copper_display_cloth.json 0937b9f634b86dbe41e07eda52c69993fce60fb5 data/create/loot_tables/blocks/copper_door.json 8ed70d812f38adfa147db07a4f2bbe206a69ad20 data/create/loot_tables/blocks/copper_ladder.json ac621731ca23e6fbb1003be59edacdf837dbc37e data/create/loot_tables/blocks/copper_scaffolding.json @@ -3239,6 +3302,7 @@ d9552e3e9f4de0e09df8ca9446066e94c6e2c681 data/create/loot_tables/blocks/cut_veri 009186ed0efe29a229a28cfd913bc02ddad217d4 data/create/loot_tables/blocks/cut_veridium_slab.json 4845f7127921c7dd93a59118e63c37107d6c2061 data/create/loot_tables/blocks/cut_veridium_stairs.json b56caea031d637321eddfd5d122fc357d2c2e49c data/create/loot_tables/blocks/cut_veridium_wall.json +cb4f82249ddd6eddb920b01521326760a9e1d0fc data/create/loot_tables/blocks/cyan_display_cloth.json ffb440a03f5e513b8d20c2725a95dc5c9b84c73b data/create/loot_tables/blocks/cyan_nixie_tube.json 914146303ae7e73c4f9283ea61cd5443f49f5cde data/create/loot_tables/blocks/cyan_postbox.json 8858b4e1b4e51889b2006005585a17e4978ed8e9 data/create/loot_tables/blocks/cyan_sail.json @@ -3284,12 +3348,14 @@ f33d0bdbf35ca5294684b0628419ad11d508a649 data/create/loot_tables/blocks/gearbox. a4c86e5456bbbcc417d736151ac6a15c944d555b data/create/loot_tables/blocks/gearshift.json ffa2776989447e44fa10673986961ab395ebd592 data/create/loot_tables/blocks/glass_fluid_pipe.json 07d8265c285ebb69b9160d516905ae1f17acc87d data/create/loot_tables/blocks/granite_pillar.json +3d1ca8217454367c5a4d0a9eb19d17e455905847 data/create/loot_tables/blocks/gray_display_cloth.json 41feb0f235495384ebca5b6f70d01b6f0c0c8878 data/create/loot_tables/blocks/gray_nixie_tube.json 6f123d5e6612274223ddb695e582abd952d3521c data/create/loot_tables/blocks/gray_postbox.json bd526fc4f0acea571c37b2ecbb7267fee6be29f0 data/create/loot_tables/blocks/gray_sail.json 5e23e2032f92737eaa6e6cfb4c62232566f06e77 data/create/loot_tables/blocks/gray_seat.json 6ff8b3e59ea98697b87e71eb64d1e6f7e4631f36 data/create/loot_tables/blocks/gray_toolbox.json aa0d47422e0adc3fb18e5c0eefd25c417ddbf9ae data/create/loot_tables/blocks/gray_valve_handle.json +b924bd4318a953cbf2f1ea14d6735981a33c42e0 data/create/loot_tables/blocks/green_display_cloth.json 4cfbe1bdc89916f78f891b9dbaed461cd838584b data/create/loot_tables/blocks/green_nixie_tube.json e99e3895a19faa928e40fa17fbfbda6d3566b1ed data/create/loot_tables/blocks/green_postbox.json 6c22cf8de05828af7979dc32d9e151297d551fe5 data/create/loot_tables/blocks/green_sail.json @@ -3325,12 +3391,14 @@ ae3b9785ae64f1c936cac555505f97774b09fd95 data/create/loot_tables/blocks/layered_ b4882fe056a8d03bddf7a8c4fa70ee06548e1743 data/create/loot_tables/blocks/layered_tuff.json 7f9ea6bfcf8344018866013e12d23edf21f034e9 data/create/loot_tables/blocks/layered_veridium.json 54a876a52655d5c9c33325a7d07c7978d33adca6 data/create/loot_tables/blocks/lectern_controller.json +26d208f411a7c4014731ea3609443a76937dbce6 data/create/loot_tables/blocks/light_blue_display_cloth.json 8a6153a0b5857c77cdac0cffcb22e30ae6181f3a data/create/loot_tables/blocks/light_blue_nixie_tube.json 27bbda185ab99cff4974e6bfc40b72265896ef42 data/create/loot_tables/blocks/light_blue_postbox.json 304072298d4078eca7e0fb8c58ea3144afe246a8 data/create/loot_tables/blocks/light_blue_sail.json a1396be526ef27c6d0f97cdd0f0e61f810e7353b data/create/loot_tables/blocks/light_blue_seat.json 0cd56baf9f3c9edb97e4ce892d374e21a099374f data/create/loot_tables/blocks/light_blue_toolbox.json bf4e6c308d82f15689406b5b3e88fe95d49a9a44 data/create/loot_tables/blocks/light_blue_valve_handle.json +f9d90c7c730e15b244bff8cc8155d0e9e555b85f data/create/loot_tables/blocks/light_gray_display_cloth.json 6928acbfcafdfead9750be6760da163b86532054 data/create/loot_tables/blocks/light_gray_nixie_tube.json eb95d1e0abb93d5efecb0809e3901f37021c4dfc data/create/loot_tables/blocks/light_gray_postbox.json 886ef98e4bd60d8860b56441da6928e24f262d70 data/create/loot_tables/blocks/light_gray_sail.json @@ -3339,6 +3407,7 @@ e22dfadefcea50090efe87136a4b92e6ef20d379 data/create/loot_tables/blocks/light_gr 3e586bc1281f15e25e75475dd726578ff032c6ae data/create/loot_tables/blocks/light_gray_valve_handle.json c6bb0877c537dda15469934383dc45c608bfd1a4 data/create/loot_tables/blocks/limestone.json 49058a62e1abd34917f983b6bc13cc4353b613a2 data/create/loot_tables/blocks/limestone_pillar.json +0e8e4ef0208fcd1201b9637864a45b86a3dab7a5 data/create/loot_tables/blocks/lime_display_cloth.json 582bb26f6df37d0c2dbe12983ad05fc74f5fb5c0 data/create/loot_tables/blocks/lime_nixie_tube.json ec9d973d218b26d51b82f265603feab31170c619 data/create/loot_tables/blocks/lime_postbox.json 623ac65211a9920325308b55285f78e3b7275751 data/create/loot_tables/blocks/lime_sail.json @@ -3347,6 +3416,7 @@ ec9d973d218b26d51b82f265603feab31170c619 data/create/loot_tables/blocks/lime_pos 1a3ed7cd5660d7ea014956ea642e0b07d89bc297 data/create/loot_tables/blocks/lime_valve_handle.json baf70f9eb579f20b232a2af4e6b00a54f84844e6 data/create/loot_tables/blocks/linear_chassis.json e4c0f8ca822cf7555bd011825b430c3c735160d4 data/create/loot_tables/blocks/lit_blaze_burner.json +fcf106a036e8a4894abf2a5aaf96061c2e5c920d data/create/loot_tables/blocks/magenta_display_cloth.json 6bd8b044cc9c69a5268372e5436f556da2c1bf21 data/create/loot_tables/blocks/magenta_nixie_tube.json 601bc43286b9f6b978ae8681281bf8e195f8211d data/create/loot_tables/blocks/magenta_postbox.json b4d06c9ce7fbec0f23bb6dbc446b77d070f06775 data/create/loot_tables/blocks/magenta_sail.json @@ -3381,6 +3451,7 @@ fe79cb4cbea87efc84d61d3d31f073bf3c64c73d data/create/loot_tables/blocks/netherit 5dcb11160a51ce17fb06f5fecc14e87d92b1a641 data/create/loot_tables/blocks/oak_window_pane.json 461e9818f41aab34905757a423455cdcee780e67 data/create/loot_tables/blocks/ochrum.json 1259a439286385d5b7c48bff89d0839f1f2e02c2 data/create/loot_tables/blocks/ochrum_pillar.json +1d4bd118086ac49b1d11ac7c4e7ea371d9367388 data/create/loot_tables/blocks/orange_display_cloth.json 3f6940f13ca705bad7cdb9a9b80a3ae84f70f80c data/create/loot_tables/blocks/orange_postbox.json d6323d4b30faa87cd4b5b8b815cb16f78296f203 data/create/loot_tables/blocks/orange_sail.json 119fc4c3055c09c7958ac405925a6b7be2081c6b data/create/loot_tables/blocks/orange_seat.json @@ -3398,6 +3469,7 @@ ab8cee7abd7dd92428bf7d8f0f5edd35082401a4 data/create/loot_tables/blocks/packager e5df1b8ead9e575ed06f2040a7c9cc72c7a71b49 data/create/loot_tables/blocks/packager_link.json 54aa9700df601640b705d912abe773d5b6ee2b1f data/create/loot_tables/blocks/package_frogport.json 58bd9fe9d6706998bfbda3b077cfd0a740972091 data/create/loot_tables/blocks/peculiar_bell.json +95c91b99c769a67ef8558c787b23fa8e8796f2a5 data/create/loot_tables/blocks/pink_display_cloth.json 4d7724df6fefee4512c4f7886d0e103d1dc39510 data/create/loot_tables/blocks/pink_nixie_tube.json df7b12349c64d035eb563535b03cb70d780c5a71 data/create/loot_tables/blocks/pink_postbox.json 85811771fbc36f645fdb9f510639715399503c99 data/create/loot_tables/blocks/pink_sail.json @@ -3471,6 +3543,7 @@ fbc433a7e8518860bc828a52b56dba92e4dff66c data/create/loot_tables/blocks/pulley_m e654e6cedc0373e97caea947e7e605bc4095da88 data/create/loot_tables/blocks/pulse_extender.json 422385f062dd63edaf246c42fb0e617e92e6cc44 data/create/loot_tables/blocks/pulse_repeater.json 93f0c41aedaa2b9baceda78b93a4b3198962e3f9 data/create/loot_tables/blocks/pulse_timer.json +f927369a17c144539d2eb18c7627aefed7d1ab3e data/create/loot_tables/blocks/purple_display_cloth.json 6f453ea136098a5872aeb4e2ad1e5b78d2fd571f data/create/loot_tables/blocks/purple_nixie_tube.json 53e964048baa1b98877a559e8fda6c8f367d5cd6 data/create/loot_tables/blocks/purple_postbox.json c6b7a02db55cf0824a48156adf469c478dfd6a8d data/create/loot_tables/blocks/purple_sail.json @@ -3483,6 +3556,7 @@ f76e5a157d2aeab5708f464b1f3c8e47b3855f18 data/create/loot_tables/blocks/raw_zinc bbc2d61eeea335f8f011d799ef6a5484ca027640 data/create/loot_tables/blocks/redstone_contact.json 4fa70deeac7e56121e42fb602dfa27ee1727f749 data/create/loot_tables/blocks/redstone_link.json efc3a5595e4daf67fa43f84c9869dfc76fd6fca4 data/create/loot_tables/blocks/redstone_requester.json +04f7282a470bad6803e9cba54cd70a21d7c6096a data/create/loot_tables/blocks/red_display_cloth.json a50e1c28af16e9f1b4f48aa974461167139768a7 data/create/loot_tables/blocks/red_nixie_tube.json f36f1e69e4fb8723238f81aadbac892f54b5ac62 data/create/loot_tables/blocks/red_postbox.json 977d724cddf8eba053a3310ad0d30af15199bbed data/create/loot_tables/blocks/red_sail.json @@ -3628,6 +3702,7 @@ f309ffd94dfb3591efd2fab337a871a0ceff1084 data/create/loot_tables/blocks/waxed_we d6862dc9f7d291df618fbce71eebf613711a5517 data/create/loot_tables/blocks/weathered_copper_tile_slab.json 57d5065d53016e4b1ef0fbad9b84605b1546bcc4 data/create/loot_tables/blocks/weathered_copper_tile_stairs.json f6ba0623b4bcea2f3796df4c65c494fc072d2c21 data/create/loot_tables/blocks/weighted_ejector.json +96a2ad84099368f22ded8896270ddeee1f977772 data/create/loot_tables/blocks/white_display_cloth.json 978263272f632ed79a61d52a0080de0b7b8102d6 data/create/loot_tables/blocks/white_nixie_tube.json 3d8a4d4a9634d49b20f65ebcdddaef2d0f21b36b data/create/loot_tables/blocks/white_postbox.json 129c6772c1c12271f9b0d41c77f41ce34fc437b1 data/create/loot_tables/blocks/white_sail.json @@ -3636,6 +3711,7 @@ f6ba0623b4bcea2f3796df4c65c494fc072d2c21 data/create/loot_tables/blocks/weighted 2fae4331c0ab590aef542cf4e23deea579d734f8 data/create/loot_tables/blocks/white_valve_handle.json bf0ea5c6957a43b6c4b1914df70e0b8f6585e638 data/create/loot_tables/blocks/windmill_bearing.json ed989d41a4b640dc1ffb15c9c0712ee3172d408f data/create/loot_tables/blocks/wooden_bracket.json +e9adb779fd81f12bb8946c40c0ffdcc86fc36e4a data/create/loot_tables/blocks/yellow_display_cloth.json d9f853e662b004b6ffdbb82af99ad7e774698178 data/create/loot_tables/blocks/yellow_nixie_tube.json a536699cab16540eb906e0b63a2c5064244c7b6c data/create/loot_tables/blocks/yellow_postbox.json 0ead61521fec15522633d6cfdeb77150bb30d075 data/create/loot_tables/blocks/yellow_sail.json @@ -4289,6 +4365,7 @@ f365be4eda73234b73aa49c97b065f1a8baafbf6 data/create/tags/blocks/brittle.json c7ec0dbc18e9c1b58e568ed925287b89df11a136 data/create/tags/blocks/copycat_allow.json 876eb9210f4a14898a2fe6d225699c66b5bdfeef data/create/tags/blocks/copycat_deny.json 7296238b4c6b81251870addce1de8ecda63381dc data/create/tags/blocks/corals.json +7166503de3103541b1db1f697728659f48844496 data/create/tags/blocks/display_cloths.json f675c20350ed60da4878b5d6301f02c8c05624bd data/create/tags/blocks/fan_processing_catalysts/blasting.json 0592b99f657415f6546564ed8efa1fcbef07ba15 data/create/tags/blocks/fan_processing_catalysts/haunting.json 9386dd9a1d234813f9b8ae4ec88866d396aa1d37 data/create/tags/blocks/fan_processing_catalysts/smoking.json @@ -4324,6 +4401,7 @@ f43cac8216e2a9347e48cf93a43de95dd810ca20 data/create/tags/items/contraption_cont d371dfd35e49a7bef19f59c03e7f4ae20992f03d data/create/tags/items/create_ingots.json 910d0f5ccbc4c84b224eca1f1588b1695f41447b data/create/tags/items/crushed_raw_materials.json 0fa526e7e742573b603ad26b09526cf724efa1dc data/create/tags/items/deployable_drink.json +7166503de3103541b1db1f697728659f48844496 data/create/tags/items/display_cloths.json 1cebeb92bd514b75d54ac6d5708047801f0501c5 data/create/tags/items/modded_stripped_logs.json 586f8fc5a8b8559c9dc0017e13c78ad918688fae data/create/tags/items/modded_stripped_wood.json f400870b8dbcd14238be3ec99c419093073ba3a6 data/create/tags/items/postboxes.json @@ -4423,7 +4501,7 @@ c741ba83b562ae3459d7c4f2db69537f549ea411 data/forge/tags/items/tools/wrench.json e3321ff14704c031a2c16953b7e391f4f24dd70b data/minecraft/tags/blocks/impermeable.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/lush_ground_replaceable.json 4cf669239caa93951fd8e243a03e9157d2d06208 data/minecraft/tags/blocks/mineable/axe.json -bdfb14d8f55cdccf1c763bada28ee1089b7d2a26 data/minecraft/tags/blocks/mineable/pickaxe.json +1c9329be842d22db88e68486bc6fe64aefd9d3b7 data/minecraft/tags/blocks/mineable/pickaxe.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/moss_replaceable.json 0c13aae0eeb99e89febe8dbe5e002af2ff843a9e data/minecraft/tags/blocks/needs_iron_tool.json 3cb2a92cbdf32ed5978f740dc378d363306c3e84 data/minecraft/tags/blocks/needs_stone_tool.json diff --git a/src/generated/resources/assets/create/blockstates/andesite_display_cloth.json b/src/generated/resources/assets/create/blockstates/andesite_display_cloth.json new file mode 100644 index 0000000000..ed83fc4907 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/andesite_display_cloth.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/andesite_display_cloth" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/black_display_cloth.json b/src/generated/resources/assets/create/blockstates/black_display_cloth.json new file mode 100644 index 0000000000..d2b216703f --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/black_display_cloth.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/black_display_cloth" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/blue_display_cloth.json b/src/generated/resources/assets/create/blockstates/blue_display_cloth.json new file mode 100644 index 0000000000..86eacb58c7 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/blue_display_cloth.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/blue_display_cloth" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/brass_display_cloth.json b/src/generated/resources/assets/create/blockstates/brass_display_cloth.json new file mode 100644 index 0000000000..fee161fb7c --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/brass_display_cloth.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/brass_display_cloth" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/brown_display_cloth.json b/src/generated/resources/assets/create/blockstates/brown_display_cloth.json new file mode 100644 index 0000000000..437ab26ae5 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/brown_display_cloth.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/brown_display_cloth" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/copper_display_cloth.json b/src/generated/resources/assets/create/blockstates/copper_display_cloth.json new file mode 100644 index 0000000000..be129084f6 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/copper_display_cloth.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/copper_display_cloth" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/cyan_display_cloth.json b/src/generated/resources/assets/create/blockstates/cyan_display_cloth.json new file mode 100644 index 0000000000..036726e9c6 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/cyan_display_cloth.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/cyan_display_cloth" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/gray_display_cloth.json b/src/generated/resources/assets/create/blockstates/gray_display_cloth.json new file mode 100644 index 0000000000..4f732a35eb --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/gray_display_cloth.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/gray_display_cloth" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/green_display_cloth.json b/src/generated/resources/assets/create/blockstates/green_display_cloth.json new file mode 100644 index 0000000000..10b831420e --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/green_display_cloth.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/green_display_cloth" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/light_blue_display_cloth.json b/src/generated/resources/assets/create/blockstates/light_blue_display_cloth.json new file mode 100644 index 0000000000..49d1e681f4 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/light_blue_display_cloth.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/light_blue_display_cloth" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/light_gray_display_cloth.json b/src/generated/resources/assets/create/blockstates/light_gray_display_cloth.json new file mode 100644 index 0000000000..e8ed847946 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/light_gray_display_cloth.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/light_gray_display_cloth" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/lime_display_cloth.json b/src/generated/resources/assets/create/blockstates/lime_display_cloth.json new file mode 100644 index 0000000000..c9a5e0cf94 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/lime_display_cloth.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/lime_display_cloth" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/magenta_display_cloth.json b/src/generated/resources/assets/create/blockstates/magenta_display_cloth.json new file mode 100644 index 0000000000..caccd48ad9 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/magenta_display_cloth.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/magenta_display_cloth" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/orange_display_cloth.json b/src/generated/resources/assets/create/blockstates/orange_display_cloth.json new file mode 100644 index 0000000000..9409655142 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/orange_display_cloth.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/orange_display_cloth" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/pink_display_cloth.json b/src/generated/resources/assets/create/blockstates/pink_display_cloth.json new file mode 100644 index 0000000000..78e64c62fa --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/pink_display_cloth.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/pink_display_cloth" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/purple_display_cloth.json b/src/generated/resources/assets/create/blockstates/purple_display_cloth.json new file mode 100644 index 0000000000..46a87f6699 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/purple_display_cloth.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/purple_display_cloth" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/red_display_cloth.json b/src/generated/resources/assets/create/blockstates/red_display_cloth.json new file mode 100644 index 0000000000..d493d8cda3 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/red_display_cloth.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/red_display_cloth" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/white_display_cloth.json b/src/generated/resources/assets/create/blockstates/white_display_cloth.json new file mode 100644 index 0000000000..0f9b9fd8cd --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/white_display_cloth.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/white_display_cloth" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/yellow_display_cloth.json b/src/generated/resources/assets/create/blockstates/yellow_display_cloth.json new file mode 100644 index 0000000000..dc1d17c581 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/yellow_display_cloth.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/yellow_display_cloth" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index e70dbc8df9..cbc277d0a3 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -193,6 +193,7 @@ "block.create.andesite_bars": "sɹɐᗺ ǝʇısǝpuⱯ", "block.create.andesite_belt_funnel": "ןǝuunℲ ʇןǝᗺ ǝʇısǝpuⱯ", "block.create.andesite_casing": "buısɐƆ ǝʇısǝpuⱯ", + "block.create.andesite_display_cloth": "ɥʇoןƆ ʎɐןdsıᗡ ǝʇısǝpuⱯ", "block.create.andesite_door": "ɹooᗡ ǝʇısǝpuⱯ", "block.create.andesite_encased_cogwheel": "ןǝǝɥʍboƆ pǝsɐɔuƎ ǝʇısǝpuⱯ", "block.create.andesite_encased_large_cogwheel": "ןǝǝɥʍboƆ ǝbɹɐꞀ pǝsɐɔuƎ ǝʇısǝpuⱯ", @@ -208,6 +209,7 @@ "block.create.belt": "ʇןǝᗺ", "block.create.birch_window": "ʍopuıM ɥɔɹıᗺ", "block.create.birch_window_pane": "ǝuɐԀ ʍopuıM ɥɔɹıᗺ", + "block.create.black_display_cloth": "ɥʇoןƆ ʎɐןdsıᗡ ʞɔɐןᗺ", "block.create.black_nixie_tube": "ǝqn⟘ ǝıxıN ʞɔɐןᗺ", "block.create.black_postbox": "xoqʇsoԀ ʞɔɐןᗺ", "block.create.black_sail": "ןıɐS ʞɔɐןᗺ", @@ -215,6 +217,7 @@ "block.create.black_toolbox": "xoqןoo⟘ ʞɔɐןᗺ", "block.create.black_valve_handle": "ǝןpuɐH ǝʌןɐΛ ʞɔɐןᗺ", "block.create.blaze_burner": "ɹǝuɹnᗺ ǝzɐןᗺ", + "block.create.blue_display_cloth": "ɥʇoןƆ ʎɐןdsıᗡ ǝnןᗺ", "block.create.blue_nixie_tube": "ǝqn⟘ ǝıxıN ǝnןᗺ", "block.create.blue_postbox": "xoqʇsoԀ ǝnןᗺ", "block.create.blue_sail": "ןıɐS ǝnןᗺ", @@ -226,6 +229,7 @@ "block.create.brass_belt_funnel": "ןǝuunℲ ʇןǝᗺ ssɐɹᗺ", "block.create.brass_block": "ssɐɹᗺ ɟo ʞɔoןᗺ", "block.create.brass_casing": "buısɐƆ ssɐɹᗺ", + "block.create.brass_display_cloth": "ɥʇoןƆ ʎɐןdsıᗡ ssɐɹᗺ", "block.create.brass_door": "ɹooᗡ ssɐɹᗺ", "block.create.brass_encased_cogwheel": "ןǝǝɥʍboƆ pǝsɐɔuƎ ssɐɹᗺ", "block.create.brass_encased_large_cogwheel": "ןǝǝɥʍboƆ ǝbɹɐꞀ pǝsɐɔuƎ ssɐɹᗺ", @@ -234,6 +238,7 @@ "block.create.brass_ladder": "ɹǝppɐꞀ ssɐɹᗺ", "block.create.brass_scaffolding": "buıpןoɟɟɐɔS ssɐɹᗺ", "block.create.brass_tunnel": "ןǝuun⟘ ssɐɹᗺ", + "block.create.brown_display_cloth": "ɥʇoןƆ ʎɐןdsıᗡ uʍoɹᗺ", "block.create.brown_nixie_tube": "ǝqn⟘ ǝıxıN uʍoɹᗺ", "block.create.brown_postbox": "xoqʇsoԀ uʍoɹᗺ", "block.create.brown_sail": "ןıɐS uʍoɹᗺ", @@ -263,6 +268,7 @@ "block.create.copper_backtank": "ʞuɐʇʞɔɐᗺ ɹǝddoƆ", "block.create.copper_bars": "sɹɐᗺ ɹǝddoƆ", "block.create.copper_casing": "buısɐƆ ɹǝddoƆ", + "block.create.copper_display_cloth": "ɥʇoןƆ ʎɐןdsıᗡ ɹǝddoƆ", "block.create.copper_door": "ɹooᗡ ɹǝddoƆ", "block.create.copper_ladder": "ɹǝppɐꞀ ɹǝddoƆ", "block.create.copper_scaffolding": "buıpןoɟɟɐɔS ɹǝddoƆ", @@ -413,6 +419,7 @@ "block.create.cut_veridium_slab": "qɐןS ɯnıpıɹǝΛ ʇnƆ", "block.create.cut_veridium_stairs": "sɹıɐʇS ɯnıpıɹǝΛ ʇnƆ", "block.create.cut_veridium_wall": "ןןɐM ɯnıpıɹǝΛ ʇnƆ", + "block.create.cyan_display_cloth": "ɥʇoןƆ ʎɐןdsıᗡ uɐʎƆ", "block.create.cyan_nixie_tube": "ǝqn⟘ ǝıxıN uɐʎƆ", "block.create.cyan_postbox": "xoqʇsoԀ uɐʎƆ", "block.create.cyan_sail": "ןıɐS uɐʎƆ", @@ -461,12 +468,14 @@ "block.create.gearshift": "ʇɟıɥsɹɐǝ⅁", "block.create.glass_fluid_pipe": "ǝdıԀ pınןℲ ssɐן⅁", "block.create.granite_pillar": "ɹɐןןıԀ ǝʇıuɐɹ⅁", + "block.create.gray_display_cloth": "ɥʇoןƆ ʎɐןdsıᗡ ʎɐɹ⅁", "block.create.gray_nixie_tube": "ǝqn⟘ ǝıxıN ʎɐɹ⅁", "block.create.gray_postbox": "xoqʇsoԀ ʎɐɹ⅁", "block.create.gray_sail": "ןıɐS ʎɐɹ⅁", "block.create.gray_seat": "ʇɐǝS ʎɐɹ⅁", "block.create.gray_toolbox": "xoqןoo⟘ ʎɐɹ⅁", "block.create.gray_valve_handle": "ǝןpuɐH ǝʌןɐΛ ʎɐɹ⅁", + "block.create.green_display_cloth": "ɥʇoןƆ ʎɐןdsıᗡ uǝǝɹ⅁", "block.create.green_nixie_tube": "ǝqn⟘ ǝıxıN uǝǝɹ⅁", "block.create.green_postbox": "xoqʇsoԀ uǝǝɹ⅁", "block.create.green_sail": "ןıɐS uǝǝɹ⅁", @@ -506,18 +515,21 @@ "block.create.layered_tuff": "ɟɟn⟘ pǝɹǝʎɐꞀ", "block.create.layered_veridium": "ɯnıpıɹǝΛ pǝɹǝʎɐꞀ", "block.create.lectern_controller": "ɹǝןןoɹʇuoƆ uɹǝʇɔǝꞀ", + "block.create.light_blue_display_cloth": "ɥʇoןƆ ʎɐןdsıᗡ ǝnןᗺ ʇɥbıꞀ", "block.create.light_blue_nixie_tube": "ǝqn⟘ ǝıxıN ǝnןᗺ ʇɥbıꞀ", "block.create.light_blue_postbox": "xoqʇsoԀ ǝnןᗺ ʇɥbıꞀ", "block.create.light_blue_sail": "ןıɐS ǝnןᗺ ʇɥbıꞀ", "block.create.light_blue_seat": "ʇɐǝS ǝnןᗺ ʇɥbıꞀ", "block.create.light_blue_toolbox": "xoqןoo⟘ ǝnןᗺ ʇɥbıꞀ", "block.create.light_blue_valve_handle": "ǝןpuɐH ǝʌןɐΛ ǝnןᗺ ʇɥbıꞀ", + "block.create.light_gray_display_cloth": "ɥʇoןƆ ʎɐןdsıᗡ ʎɐɹ⅁ ʇɥbıꞀ", "block.create.light_gray_nixie_tube": "ǝqn⟘ ǝıxıN ʎɐɹ⅁ ʇɥbıꞀ", "block.create.light_gray_postbox": "xoqʇsoԀ ʎɐɹ⅁ ʇɥbıꞀ", "block.create.light_gray_sail": "ןıɐS ʎɐɹ⅁ ʇɥbıꞀ", "block.create.light_gray_seat": "ʇɐǝS ʎɐɹ⅁ ʇɥbıꞀ", "block.create.light_gray_toolbox": "xoqןoo⟘ ʎɐɹ⅁ ʇɥbıꞀ", "block.create.light_gray_valve_handle": "ǝןpuɐH ǝʌןɐΛ ʎɐɹ⅁ ʇɥbıꞀ", + "block.create.lime_display_cloth": "ɥʇoןƆ ʎɐןdsıᗡ ǝɯıꞀ", "block.create.lime_nixie_tube": "ǝqn⟘ ǝıxıN ǝɯıꞀ", "block.create.lime_postbox": "xoqʇsoԀ ǝɯıꞀ", "block.create.lime_sail": "ןıɐS ǝɯıꞀ", @@ -528,6 +540,7 @@ "block.create.limestone_pillar": "ɹɐןןıԀ ǝuoʇsǝɯıꞀ", "block.create.linear_chassis": "sıssɐɥƆ ɹɐǝuıꞀ", "block.create.lit_blaze_burner": "ɹǝuɹnᗺ ǝzɐןᗺ ʇıꞀ", + "block.create.magenta_display_cloth": "ɥʇoןƆ ʎɐןdsıᗡ ɐʇuǝbɐW", "block.create.magenta_nixie_tube": "ǝqn⟘ ǝıxıN ɐʇuǝbɐW", "block.create.magenta_postbox": "xoqʇsoԀ ɐʇuǝbɐW", "block.create.magenta_sail": "ןıɐS ɐʇuǝbɐW", @@ -564,6 +577,7 @@ "block.create.oak_window_pane": "ǝuɐԀ ʍopuıM ʞɐO", "block.create.ochrum": "ɯnɹɥɔO", "block.create.ochrum_pillar": "ɹɐןןıԀ ɯnɹɥɔO", + "block.create.orange_display_cloth": "ɥʇoןƆ ʎɐןdsıᗡ ǝbuɐɹO", "block.create.orange_postbox": "xoqʇsoԀ ǝbuɐɹO", "block.create.orange_sail": "ןıɐS ǝbuɐɹO", "block.create.orange_seat": "ʇɐǝS ǝbuɐɹO", @@ -582,6 +596,7 @@ "block.create.packager_link": "ʞuıꞀ ɹǝbɐʞɔɐԀ", "block.create.peculiar_bell": "ןןǝᗺ ɹɐıןnɔǝԀ", "block.create.peculiar_bell.tooltip.summary": "˙˙˙sʇɔǝɟɟǝ-ǝpıs ǝʌɐɥ ʎɐɯ ‾ǝɹıℲ ןnoS‾ uǝdo ǝʌoqɐ ʇɥbıɹ ʇı buıɔɐןԀ ˙‾ןןǝᗺ ssɐɹᗺ‾ ǝʌıʇɐɹoɔǝp Ɐ", + "block.create.pink_display_cloth": "ɥʇoןƆ ʎɐןdsıᗡ ʞuıԀ", "block.create.pink_nixie_tube": "ǝqn⟘ ǝıxıN ʞuıԀ", "block.create.pink_postbox": "xoqʇsoԀ ʞuıԀ", "block.create.pink_sail": "ןıɐS ʞuıԀ", @@ -660,6 +675,7 @@ "block.create.pulse_extender": "ɹǝpuǝʇxƎ ǝsןnԀ", "block.create.pulse_repeater": "ɹǝʇɐǝdǝᴚ ǝsןnԀ", "block.create.pulse_timer": "ɹǝɯı⟘ ǝsןnԀ", + "block.create.purple_display_cloth": "ɥʇoןƆ ʎɐןdsıᗡ ǝןdɹnԀ", "block.create.purple_nixie_tube": "ǝqn⟘ ǝıxıN ǝןdɹnԀ", "block.create.purple_postbox": "xoqʇsoԀ ǝןdɹnԀ", "block.create.purple_sail": "ןıɐS ǝןdɹnԀ", @@ -669,6 +685,7 @@ "block.create.radial_chassis": "sıssɐɥƆ ןɐıpɐᴚ", "block.create.railway_casing": "buısɐƆ uıɐɹ⟘", "block.create.raw_zinc_block": "ɔuıZ ʍɐᴚ ɟo ʞɔoןᗺ", + "block.create.red_display_cloth": "ɥʇoןƆ ʎɐןdsıᗡ pǝᴚ", "block.create.red_nixie_tube": "ǝqn⟘ ǝıxıN pǝᴚ", "block.create.red_postbox": "xoqʇsoԀ pǝᴚ", "block.create.red_sail": "ןıɐS pǝᴚ", @@ -834,6 +851,7 @@ "block.create.weathered_copper_tile_stairs": "sɹıɐʇS ǝןı⟘ ɹǝddoƆ pǝɹǝɥʇɐǝM", "block.create.weathered_copper_tiles": "sǝןı⟘ ɹǝddoƆ pǝɹǝɥʇɐǝM", "block.create.weighted_ejector": "ɹoʇɔǝظƎ pǝʇɥbıǝM", + "block.create.white_display_cloth": "ɥʇoןƆ ʎɐןdsıᗡ ǝʇıɥM", "block.create.white_nixie_tube": "ǝqn⟘ ǝıxıN ǝʇıɥM", "block.create.white_postbox": "xoqʇsoԀ ǝʇıɥM", "block.create.white_sail": "ןıɐS ןןıɯpuıM", @@ -843,6 +861,7 @@ "block.create.windmill_bearing": "buıɹɐǝᗺ ןןıɯpuıM", "block.create.wooden_bracket": "ʇǝʞɔɐɹᗺ uǝpooM", "block.create.wooden_bracket.tooltip.summary": "˙ʇuǝɯǝɔɹoɟuıǝɹ ɟo ʇıq uǝpooʍ puɐ ʎzoɔ ɐ ɥʇıʍ ‾sǝdıԀ‾ puɐ ‾sןǝǝɥʍboƆ 'sʇɟɐɥS‾ ɹnoʎ ‾ǝʇɐɹoɔǝᗡ‾", + "block.create.yellow_display_cloth": "ɥʇoןƆ ʎɐןdsıᗡ ʍoןןǝʎ", "block.create.yellow_nixie_tube": "ǝqn⟘ ǝıxıN ʍoןןǝʎ", "block.create.yellow_postbox": "xoqʇsoԀ ʍoןןǝʎ", "block.create.yellow_sail": "ןıɐS ʍoןןǝʎ", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 76c54d3ae8..ae1193e858 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -193,6 +193,7 @@ "block.create.andesite_bars": "Andesite Bars", "block.create.andesite_belt_funnel": "Andesite Belt Funnel", "block.create.andesite_casing": "Andesite Casing", + "block.create.andesite_display_cloth": "Andesite Display Cloth", "block.create.andesite_door": "Andesite Door", "block.create.andesite_encased_cogwheel": "Andesite Encased Cogwheel", "block.create.andesite_encased_large_cogwheel": "Andesite Encased Large Cogwheel", @@ -208,6 +209,7 @@ "block.create.belt": "Belt", "block.create.birch_window": "Birch Window", "block.create.birch_window_pane": "Birch Window Pane", + "block.create.black_display_cloth": "Black Display Cloth", "block.create.black_nixie_tube": "Black Nixie Tube", "block.create.black_postbox": "Black Postbox", "block.create.black_sail": "Black Sail", @@ -215,6 +217,7 @@ "block.create.black_toolbox": "Black Toolbox", "block.create.black_valve_handle": "Black Valve Handle", "block.create.blaze_burner": "Blaze Burner", + "block.create.blue_display_cloth": "Blue Display Cloth", "block.create.blue_nixie_tube": "Blue Nixie Tube", "block.create.blue_postbox": "Blue Postbox", "block.create.blue_sail": "Blue Sail", @@ -226,6 +229,7 @@ "block.create.brass_belt_funnel": "Brass Belt Funnel", "block.create.brass_block": "Block of Brass", "block.create.brass_casing": "Brass Casing", + "block.create.brass_display_cloth": "Brass Display Cloth", "block.create.brass_door": "Brass Door", "block.create.brass_encased_cogwheel": "Brass Encased Cogwheel", "block.create.brass_encased_large_cogwheel": "Brass Encased Large Cogwheel", @@ -234,6 +238,7 @@ "block.create.brass_ladder": "Brass Ladder", "block.create.brass_scaffolding": "Brass Scaffolding", "block.create.brass_tunnel": "Brass Tunnel", + "block.create.brown_display_cloth": "Brown Display Cloth", "block.create.brown_nixie_tube": "Brown Nixie Tube", "block.create.brown_postbox": "Brown Postbox", "block.create.brown_sail": "Brown Sail", @@ -263,6 +268,7 @@ "block.create.copper_backtank": "Copper Backtank", "block.create.copper_bars": "Copper Bars", "block.create.copper_casing": "Copper Casing", + "block.create.copper_display_cloth": "Copper Display Cloth", "block.create.copper_door": "Copper Door", "block.create.copper_ladder": "Copper Ladder", "block.create.copper_scaffolding": "Copper Scaffolding", @@ -413,6 +419,7 @@ "block.create.cut_veridium_slab": "Cut Veridium Slab", "block.create.cut_veridium_stairs": "Cut Veridium Stairs", "block.create.cut_veridium_wall": "Cut Veridium Wall", + "block.create.cyan_display_cloth": "Cyan Display Cloth", "block.create.cyan_nixie_tube": "Cyan Nixie Tube", "block.create.cyan_postbox": "Cyan Postbox", "block.create.cyan_sail": "Cyan Sail", @@ -461,12 +468,14 @@ "block.create.gearshift": "Gearshift", "block.create.glass_fluid_pipe": "Glass Fluid Pipe", "block.create.granite_pillar": "Granite Pillar", + "block.create.gray_display_cloth": "Gray Display Cloth", "block.create.gray_nixie_tube": "Gray Nixie Tube", "block.create.gray_postbox": "Gray Postbox", "block.create.gray_sail": "Gray Sail", "block.create.gray_seat": "Gray Seat", "block.create.gray_toolbox": "Gray Toolbox", "block.create.gray_valve_handle": "Gray Valve Handle", + "block.create.green_display_cloth": "Green Display Cloth", "block.create.green_nixie_tube": "Green Nixie Tube", "block.create.green_postbox": "Green Postbox", "block.create.green_sail": "Green Sail", @@ -506,18 +515,21 @@ "block.create.layered_tuff": "Layered Tuff", "block.create.layered_veridium": "Layered Veridium", "block.create.lectern_controller": "Lectern Controller", + "block.create.light_blue_display_cloth": "Light Blue Display Cloth", "block.create.light_blue_nixie_tube": "Light Blue Nixie Tube", "block.create.light_blue_postbox": "Light Blue Postbox", "block.create.light_blue_sail": "Light Blue Sail", "block.create.light_blue_seat": "Light Blue Seat", "block.create.light_blue_toolbox": "Light Blue Toolbox", "block.create.light_blue_valve_handle": "Light Blue Valve Handle", + "block.create.light_gray_display_cloth": "Light Gray Display Cloth", "block.create.light_gray_nixie_tube": "Light Gray Nixie Tube", "block.create.light_gray_postbox": "Light Gray Postbox", "block.create.light_gray_sail": "Light Gray Sail", "block.create.light_gray_seat": "Light Gray Seat", "block.create.light_gray_toolbox": "Light Gray Toolbox", "block.create.light_gray_valve_handle": "Light Gray Valve Handle", + "block.create.lime_display_cloth": "Lime Display Cloth", "block.create.lime_nixie_tube": "Lime Nixie Tube", "block.create.lime_postbox": "Lime Postbox", "block.create.lime_sail": "Lime Sail", @@ -528,6 +540,7 @@ "block.create.limestone_pillar": "Limestone Pillar", "block.create.linear_chassis": "Linear Chassis", "block.create.lit_blaze_burner": "Lit Blaze Burner", + "block.create.magenta_display_cloth": "Magenta Display Cloth", "block.create.magenta_nixie_tube": "Magenta Nixie Tube", "block.create.magenta_postbox": "Magenta Postbox", "block.create.magenta_sail": "Magenta Sail", @@ -564,6 +577,7 @@ "block.create.oak_window_pane": "Oak Window Pane", "block.create.ochrum": "Ochrum", "block.create.ochrum_pillar": "Ochrum Pillar", + "block.create.orange_display_cloth": "Orange Display Cloth", "block.create.orange_postbox": "Orange Postbox", "block.create.orange_sail": "Orange Sail", "block.create.orange_seat": "Orange Seat", @@ -582,6 +596,7 @@ "block.create.packager_link": "Packager Link", "block.create.peculiar_bell": "Peculiar Bell", "block.create.peculiar_bell.tooltip.summary": "A decorative _Brass Bell_. Placing it right above open _Soul Fire_ may have side-effects...", + "block.create.pink_display_cloth": "Pink Display Cloth", "block.create.pink_nixie_tube": "Pink Nixie Tube", "block.create.pink_postbox": "Pink Postbox", "block.create.pink_sail": "Pink Sail", @@ -660,6 +675,7 @@ "block.create.pulse_extender": "Pulse Extender", "block.create.pulse_repeater": "Pulse Repeater", "block.create.pulse_timer": "Pulse Timer", + "block.create.purple_display_cloth": "Purple Display Cloth", "block.create.purple_nixie_tube": "Purple Nixie Tube", "block.create.purple_postbox": "Purple Postbox", "block.create.purple_sail": "Purple Sail", @@ -669,6 +685,7 @@ "block.create.radial_chassis": "Radial Chassis", "block.create.railway_casing": "Train Casing", "block.create.raw_zinc_block": "Block of Raw Zinc", + "block.create.red_display_cloth": "Red Display Cloth", "block.create.red_nixie_tube": "Red Nixie Tube", "block.create.red_postbox": "Red Postbox", "block.create.red_sail": "Red Sail", @@ -834,6 +851,7 @@ "block.create.weathered_copper_tile_stairs": "Weathered Copper Tile Stairs", "block.create.weathered_copper_tiles": "Weathered Copper Tiles", "block.create.weighted_ejector": "Weighted Ejector", + "block.create.white_display_cloth": "White Display Cloth", "block.create.white_nixie_tube": "White Nixie Tube", "block.create.white_postbox": "White Postbox", "block.create.white_sail": "Windmill Sail", @@ -843,6 +861,7 @@ "block.create.windmill_bearing": "Windmill Bearing", "block.create.wooden_bracket": "Wooden Bracket", "block.create.wooden_bracket.tooltip.summary": "_Decorate_ your _Shafts, Cogwheels_ and _Pipes_ with a cozy and wooden bit of reinforcement.", + "block.create.yellow_display_cloth": "Yellow Display Cloth", "block.create.yellow_nixie_tube": "Yellow Nixie Tube", "block.create.yellow_postbox": "Yellow Postbox", "block.create.yellow_sail": "Yellow Sail", diff --git a/src/generated/resources/assets/create/models/block/andesite_display_cloth.json b/src/generated/resources/assets/create/models/block/andesite_display_cloth.json new file mode 100644 index 0000000000..c4fce81046 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/andesite_display_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/display_cloth/block", + "textures": { + "0": "create:block/display_cloth/andesite" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/black_display_cloth.json b/src/generated/resources/assets/create/models/block/black_display_cloth.json new file mode 100644 index 0000000000..32cb26841c --- /dev/null +++ b/src/generated/resources/assets/create/models/block/black_display_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/display_cloth/block", + "textures": { + "0": "create:block/display_cloth/black" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/blue_display_cloth.json b/src/generated/resources/assets/create/models/block/blue_display_cloth.json new file mode 100644 index 0000000000..9f92093212 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/blue_display_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/display_cloth/block", + "textures": { + "0": "create:block/display_cloth/blue" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_display_cloth.json b/src/generated/resources/assets/create/models/block/brass_display_cloth.json new file mode 100644 index 0000000000..f97c2cd063 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/brass_display_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/display_cloth/block", + "textures": { + "0": "create:block/display_cloth/brass" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brown_display_cloth.json b/src/generated/resources/assets/create/models/block/brown_display_cloth.json new file mode 100644 index 0000000000..0165cc7143 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/brown_display_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/display_cloth/block", + "textures": { + "0": "create:block/display_cloth/brown" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/copper_display_cloth.json b/src/generated/resources/assets/create/models/block/copper_display_cloth.json new file mode 100644 index 0000000000..3b1246118c --- /dev/null +++ b/src/generated/resources/assets/create/models/block/copper_display_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/display_cloth/block", + "textures": { + "0": "create:block/display_cloth/copper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/cyan_display_cloth.json b/src/generated/resources/assets/create/models/block/cyan_display_cloth.json new file mode 100644 index 0000000000..ed8319921c --- /dev/null +++ b/src/generated/resources/assets/create/models/block/cyan_display_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/display_cloth/block", + "textures": { + "0": "create:block/display_cloth/cyan" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/gray_display_cloth.json b/src/generated/resources/assets/create/models/block/gray_display_cloth.json new file mode 100644 index 0000000000..df41d93c15 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/gray_display_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/display_cloth/block", + "textures": { + "0": "create:block/display_cloth/gray" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/green_display_cloth.json b/src/generated/resources/assets/create/models/block/green_display_cloth.json new file mode 100644 index 0000000000..7ec205fbc6 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/green_display_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/display_cloth/block", + "textures": { + "0": "create:block/display_cloth/green" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/light_blue_display_cloth.json b/src/generated/resources/assets/create/models/block/light_blue_display_cloth.json new file mode 100644 index 0000000000..d2cc0320df --- /dev/null +++ b/src/generated/resources/assets/create/models/block/light_blue_display_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/display_cloth/block", + "textures": { + "0": "create:block/display_cloth/light_blue" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/light_gray_display_cloth.json b/src/generated/resources/assets/create/models/block/light_gray_display_cloth.json new file mode 100644 index 0000000000..74a3723ff0 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/light_gray_display_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/display_cloth/block", + "textures": { + "0": "create:block/display_cloth/light_gray" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/lime_display_cloth.json b/src/generated/resources/assets/create/models/block/lime_display_cloth.json new file mode 100644 index 0000000000..1b059a9307 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/lime_display_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/display_cloth/block", + "textures": { + "0": "create:block/display_cloth/lime" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/magenta_display_cloth.json b/src/generated/resources/assets/create/models/block/magenta_display_cloth.json new file mode 100644 index 0000000000..15b3ac900c --- /dev/null +++ b/src/generated/resources/assets/create/models/block/magenta_display_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/display_cloth/block", + "textures": { + "0": "create:block/display_cloth/magenta" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/orange_display_cloth.json b/src/generated/resources/assets/create/models/block/orange_display_cloth.json new file mode 100644 index 0000000000..d69cb111e4 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/orange_display_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/display_cloth/block", + "textures": { + "0": "create:block/display_cloth/orange" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/pink_display_cloth.json b/src/generated/resources/assets/create/models/block/pink_display_cloth.json new file mode 100644 index 0000000000..e93fc7db9d --- /dev/null +++ b/src/generated/resources/assets/create/models/block/pink_display_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/display_cloth/block", + "textures": { + "0": "create:block/display_cloth/pink" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/purple_display_cloth.json b/src/generated/resources/assets/create/models/block/purple_display_cloth.json new file mode 100644 index 0000000000..71dee5ed3f --- /dev/null +++ b/src/generated/resources/assets/create/models/block/purple_display_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/display_cloth/block", + "textures": { + "0": "create:block/display_cloth/purple" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/red_display_cloth.json b/src/generated/resources/assets/create/models/block/red_display_cloth.json new file mode 100644 index 0000000000..f22c642b56 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/red_display_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/display_cloth/block", + "textures": { + "0": "create:block/display_cloth/red" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/white_display_cloth.json b/src/generated/resources/assets/create/models/block/white_display_cloth.json new file mode 100644 index 0000000000..4e18cf5c5e --- /dev/null +++ b/src/generated/resources/assets/create/models/block/white_display_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/display_cloth/block", + "textures": { + "0": "create:block/display_cloth/white" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/yellow_display_cloth.json b/src/generated/resources/assets/create/models/block/yellow_display_cloth.json new file mode 100644 index 0000000000..128428a55d --- /dev/null +++ b/src/generated/resources/assets/create/models/block/yellow_display_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/display_cloth/block", + "textures": { + "0": "create:block/display_cloth/yellow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/andesite_display_cloth.json b/src/generated/resources/assets/create/models/item/andesite_display_cloth.json new file mode 100644 index 0000000000..200d15200e --- /dev/null +++ b/src/generated/resources/assets/create/models/item/andesite_display_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/display_cloth/item_lower", + "textures": { + "0": "create:block/display_cloth/andesite" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/black_display_cloth.json b/src/generated/resources/assets/create/models/item/black_display_cloth.json new file mode 100644 index 0000000000..3d909f280b --- /dev/null +++ b/src/generated/resources/assets/create/models/item/black_display_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/display_cloth/item", + "textures": { + "0": "create:block/display_cloth/black" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/blue_display_cloth.json b/src/generated/resources/assets/create/models/item/blue_display_cloth.json new file mode 100644 index 0000000000..b82a4eef9f --- /dev/null +++ b/src/generated/resources/assets/create/models/item/blue_display_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/display_cloth/item", + "textures": { + "0": "create:block/display_cloth/blue" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/brass_display_cloth.json b/src/generated/resources/assets/create/models/item/brass_display_cloth.json new file mode 100644 index 0000000000..a13a858004 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/brass_display_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/display_cloth/item_lower", + "textures": { + "0": "create:block/display_cloth/brass" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/brown_display_cloth.json b/src/generated/resources/assets/create/models/item/brown_display_cloth.json new file mode 100644 index 0000000000..b6576ff3e7 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/brown_display_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/display_cloth/item", + "textures": { + "0": "create:block/display_cloth/brown" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/copper_display_cloth.json b/src/generated/resources/assets/create/models/item/copper_display_cloth.json new file mode 100644 index 0000000000..91cf020ec4 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/copper_display_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/display_cloth/item_lower", + "textures": { + "0": "create:block/display_cloth/copper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cyan_display_cloth.json b/src/generated/resources/assets/create/models/item/cyan_display_cloth.json new file mode 100644 index 0000000000..ed634c3d4c --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cyan_display_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/display_cloth/item", + "textures": { + "0": "create:block/display_cloth/cyan" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/gray_display_cloth.json b/src/generated/resources/assets/create/models/item/gray_display_cloth.json new file mode 100644 index 0000000000..8498172f77 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/gray_display_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/display_cloth/item", + "textures": { + "0": "create:block/display_cloth/gray" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/green_display_cloth.json b/src/generated/resources/assets/create/models/item/green_display_cloth.json new file mode 100644 index 0000000000..a1a2dc7827 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/green_display_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/display_cloth/item", + "textures": { + "0": "create:block/display_cloth/green" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/light_blue_display_cloth.json b/src/generated/resources/assets/create/models/item/light_blue_display_cloth.json new file mode 100644 index 0000000000..a4661e4813 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/light_blue_display_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/display_cloth/item", + "textures": { + "0": "create:block/display_cloth/light_blue" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/light_gray_display_cloth.json b/src/generated/resources/assets/create/models/item/light_gray_display_cloth.json new file mode 100644 index 0000000000..bd0cb7cca7 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/light_gray_display_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/display_cloth/item", + "textures": { + "0": "create:block/display_cloth/light_gray" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/lime_display_cloth.json b/src/generated/resources/assets/create/models/item/lime_display_cloth.json new file mode 100644 index 0000000000..f23caad29a --- /dev/null +++ b/src/generated/resources/assets/create/models/item/lime_display_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/display_cloth/item", + "textures": { + "0": "create:block/display_cloth/lime" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/magenta_display_cloth.json b/src/generated/resources/assets/create/models/item/magenta_display_cloth.json new file mode 100644 index 0000000000..6e7eb4ccd1 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/magenta_display_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/display_cloth/item", + "textures": { + "0": "create:block/display_cloth/magenta" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/orange_display_cloth.json b/src/generated/resources/assets/create/models/item/orange_display_cloth.json new file mode 100644 index 0000000000..372428c1e2 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/orange_display_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/display_cloth/item", + "textures": { + "0": "create:block/display_cloth/orange" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/pink_display_cloth.json b/src/generated/resources/assets/create/models/item/pink_display_cloth.json new file mode 100644 index 0000000000..92ef2f7f13 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/pink_display_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/display_cloth/item", + "textures": { + "0": "create:block/display_cloth/pink" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/purple_display_cloth.json b/src/generated/resources/assets/create/models/item/purple_display_cloth.json new file mode 100644 index 0000000000..4c0a364458 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/purple_display_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/display_cloth/item", + "textures": { + "0": "create:block/display_cloth/purple" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/red_display_cloth.json b/src/generated/resources/assets/create/models/item/red_display_cloth.json new file mode 100644 index 0000000000..e51e59a708 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/red_display_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/display_cloth/item", + "textures": { + "0": "create:block/display_cloth/red" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/white_display_cloth.json b/src/generated/resources/assets/create/models/item/white_display_cloth.json new file mode 100644 index 0000000000..7fa7b43e54 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/white_display_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/display_cloth/item", + "textures": { + "0": "create:block/display_cloth/white" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/yellow_display_cloth.json b/src/generated/resources/assets/create/models/item/yellow_display_cloth.json new file mode 100644 index 0000000000..406b931942 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/yellow_display_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/display_cloth/item", + "textures": { + "0": "create:block/display_cloth/yellow" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/andesite_display_cloth.json b/src/generated/resources/data/create/loot_tables/blocks/andesite_display_cloth.json new file mode 100644 index 0000000000..4004c91a6c --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/andesite_display_cloth.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:andesite_display_cloth" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/andesite_display_cloth" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/black_display_cloth.json b/src/generated/resources/data/create/loot_tables/blocks/black_display_cloth.json new file mode 100644 index 0000000000..f7837b51a5 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/black_display_cloth.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:black_display_cloth" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/black_display_cloth" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/blue_display_cloth.json b/src/generated/resources/data/create/loot_tables/blocks/blue_display_cloth.json new file mode 100644 index 0000000000..42b8fc647d --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/blue_display_cloth.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:blue_display_cloth" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/blue_display_cloth" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/brass_display_cloth.json b/src/generated/resources/data/create/loot_tables/blocks/brass_display_cloth.json new file mode 100644 index 0000000000..c3d73dc479 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/brass_display_cloth.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:brass_display_cloth" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/brass_display_cloth" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/brown_display_cloth.json b/src/generated/resources/data/create/loot_tables/blocks/brown_display_cloth.json new file mode 100644 index 0000000000..60a66f5fda --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/brown_display_cloth.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:brown_display_cloth" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/brown_display_cloth" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/copper_display_cloth.json b/src/generated/resources/data/create/loot_tables/blocks/copper_display_cloth.json new file mode 100644 index 0000000000..46253d68b7 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/copper_display_cloth.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:copper_display_cloth" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/copper_display_cloth" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/cyan_display_cloth.json b/src/generated/resources/data/create/loot_tables/blocks/cyan_display_cloth.json new file mode 100644 index 0000000000..a43f36bdc2 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/cyan_display_cloth.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:cyan_display_cloth" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/cyan_display_cloth" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/gray_display_cloth.json b/src/generated/resources/data/create/loot_tables/blocks/gray_display_cloth.json new file mode 100644 index 0000000000..9e5f5ae419 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/gray_display_cloth.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:gray_display_cloth" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/gray_display_cloth" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/green_display_cloth.json b/src/generated/resources/data/create/loot_tables/blocks/green_display_cloth.json new file mode 100644 index 0000000000..5e674e3030 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/green_display_cloth.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:green_display_cloth" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/green_display_cloth" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/light_blue_display_cloth.json b/src/generated/resources/data/create/loot_tables/blocks/light_blue_display_cloth.json new file mode 100644 index 0000000000..6327e1f71b --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/light_blue_display_cloth.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:light_blue_display_cloth" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/light_blue_display_cloth" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/light_gray_display_cloth.json b/src/generated/resources/data/create/loot_tables/blocks/light_gray_display_cloth.json new file mode 100644 index 0000000000..72c4e5cfb1 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/light_gray_display_cloth.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:light_gray_display_cloth" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/light_gray_display_cloth" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/lime_display_cloth.json b/src/generated/resources/data/create/loot_tables/blocks/lime_display_cloth.json new file mode 100644 index 0000000000..643e5f7726 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/lime_display_cloth.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:lime_display_cloth" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/lime_display_cloth" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/magenta_display_cloth.json b/src/generated/resources/data/create/loot_tables/blocks/magenta_display_cloth.json new file mode 100644 index 0000000000..b363e398fb --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/magenta_display_cloth.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:magenta_display_cloth" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/magenta_display_cloth" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/orange_display_cloth.json b/src/generated/resources/data/create/loot_tables/blocks/orange_display_cloth.json new file mode 100644 index 0000000000..ff910cea81 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/orange_display_cloth.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:orange_display_cloth" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/orange_display_cloth" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/pink_display_cloth.json b/src/generated/resources/data/create/loot_tables/blocks/pink_display_cloth.json new file mode 100644 index 0000000000..758c81f90e --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/pink_display_cloth.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:pink_display_cloth" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/pink_display_cloth" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/purple_display_cloth.json b/src/generated/resources/data/create/loot_tables/blocks/purple_display_cloth.json new file mode 100644 index 0000000000..c64d6bb2fa --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/purple_display_cloth.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:purple_display_cloth" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/purple_display_cloth" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/red_display_cloth.json b/src/generated/resources/data/create/loot_tables/blocks/red_display_cloth.json new file mode 100644 index 0000000000..5e7dfdfc3a --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/red_display_cloth.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:red_display_cloth" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/red_display_cloth" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/white_display_cloth.json b/src/generated/resources/data/create/loot_tables/blocks/white_display_cloth.json new file mode 100644 index 0000000000..f35d918210 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/white_display_cloth.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:white_display_cloth" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/white_display_cloth" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/yellow_display_cloth.json b/src/generated/resources/data/create/loot_tables/blocks/yellow_display_cloth.json new file mode 100644 index 0000000000..9cde6dcc3d --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/yellow_display_cloth.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:yellow_display_cloth" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/yellow_display_cloth" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/tags/blocks/display_cloths.json b/src/generated/resources/data/create/tags/blocks/display_cloths.json new file mode 100644 index 0000000000..3bb263867a --- /dev/null +++ b/src/generated/resources/data/create/tags/blocks/display_cloths.json @@ -0,0 +1,23 @@ +{ + "values": [ + "create:white_display_cloth", + "create:orange_display_cloth", + "create:magenta_display_cloth", + "create:light_blue_display_cloth", + "create:yellow_display_cloth", + "create:lime_display_cloth", + "create:pink_display_cloth", + "create:gray_display_cloth", + "create:light_gray_display_cloth", + "create:cyan_display_cloth", + "create:purple_display_cloth", + "create:blue_display_cloth", + "create:brown_display_cloth", + "create:green_display_cloth", + "create:red_display_cloth", + "create:black_display_cloth", + "create:andesite_display_cloth", + "create:brass_display_cloth", + "create:copper_display_cloth" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/tags/items/display_cloths.json b/src/generated/resources/data/create/tags/items/display_cloths.json new file mode 100644 index 0000000000..3bb263867a --- /dev/null +++ b/src/generated/resources/data/create/tags/items/display_cloths.json @@ -0,0 +1,23 @@ +{ + "values": [ + "create:white_display_cloth", + "create:orange_display_cloth", + "create:magenta_display_cloth", + "create:light_blue_display_cloth", + "create:yellow_display_cloth", + "create:lime_display_cloth", + "create:pink_display_cloth", + "create:gray_display_cloth", + "create:light_gray_display_cloth", + "create:cyan_display_cloth", + "create:purple_display_cloth", + "create:blue_display_cloth", + "create:brown_display_cloth", + "create:green_display_cloth", + "create:red_display_cloth", + "create:black_display_cloth", + "create:andesite_display_cloth", + "create:brass_display_cloth", + "create:copper_display_cloth" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json index 638eb2c70b..d9837a5299 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json @@ -125,6 +125,9 @@ "create:item_hatch", "create:packager", "create:package_frogport", + "create:andesite_display_cloth", + "create:brass_display_cloth", + "create:copper_display_cloth", "create:packager_link", "create:stock_ticker", "create:redstone_requester", diff --git a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java index 58ec8ef7cb..1c64d3ef39 100644 --- a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java +++ b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java @@ -166,6 +166,8 @@ import com.simibubi.create.content.logistics.depot.DepotRenderer; import com.simibubi.create.content.logistics.depot.EjectorBlockEntity; import com.simibubi.create.content.logistics.depot.EjectorRenderer; import com.simibubi.create.content.logistics.depot.EjectorVisual; +import com.simibubi.create.content.logistics.displayCloth.DisplayClothBlockEntity; +import com.simibubi.create.content.logistics.displayCloth.DisplayClothRenderer; import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBlockEntity; import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelRenderer; import com.simibubi.create.content.logistics.funnel.FunnelBlockEntity; @@ -515,6 +517,15 @@ public class AllBlockEntityTypes { .renderer(() -> PostboxRenderer::new) .register(); + public static final BlockEntityEntry DISPLAY_CLOTH = + REGISTRATE.blockEntity("display_cloth", DisplayClothBlockEntity::new) + .validBlocks(AllBlocks.DISPLAY_CLOTHS.toArray()) + .validBlock(AllBlocks.ANDESITE_DISPLAY_CLOTH) + .validBlock(AllBlocks.BRASS_DISPLAY_CLOTH) + .validBlock(AllBlocks.COPPER_DISPLAY_CLOTH) + .renderer(() -> DisplayClothRenderer::new) + .register(); + public static final BlockEntityEntry PACKAGER_LINK = REGISTRATE .blockEntity("packager_link", PackagerLinkBlockEntity::new) .validBlocks(AllBlocks.PACKAGER_LINK) diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 2160f82af9..8b913e8d48 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -167,6 +167,7 @@ import com.simibubi.create.content.logistics.crate.CreativeCrateBlock; import com.simibubi.create.content.logistics.depot.DepotBlock; import com.simibubi.create.content.logistics.depot.EjectorBlock; import com.simibubi.create.content.logistics.depot.EjectorItem; +import com.simibubi.create.content.logistics.displayCloth.DisplayClothBlock; import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBlock; import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBlockItem; import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelModel; @@ -1757,7 +1758,7 @@ public class AllBlocks { .model(AssetLookup::customItemModel) .build() .register(); - + public static final DyedBlockList PACKAGE_POSTBOXES = new DyedBlockList<>(colour -> { String colourName = colour.getSerializedName(); return REGISTRATE.block(colourName + "_postbox", p -> new PostboxBlock(p, colour)) @@ -1829,6 +1830,37 @@ public class AllBlocks { .build() .register(); + public static final DyedBlockList DISPLAY_CLOTHS = new DyedBlockList<>(colour -> { + String colourName = colour.getSerializedName(); + return REGISTRATE.block(colourName + "_display_cloth", p -> new DisplayClothBlock(p, colour)) + .transform(BuilderTransformers.displayCloth(colourName, () -> Blocks.BLACK_CARPET, false)) + .properties(p -> p.mapColor(colour)) + .register(); + }); + + public static final BlockEntry ANDESITE_DISPLAY_CLOTH = + REGISTRATE.block("andesite_display_cloth", p -> new DisplayClothBlock(p, "andesite")) + .transform(BuilderTransformers.displayCloth("andesite", SharedProperties::stone, true)) + .properties(p -> p.mapColor(MapColor.STONE) + .requiresCorrectToolForDrops()) + .transform(pickaxeOnly()) + .register(); + + public static final BlockEntry BRASS_DISPLAY_CLOTH = + REGISTRATE.block("brass_display_cloth", p -> new DisplayClothBlock(p, "brass")) + .transform(BuilderTransformers.displayCloth("brass", SharedProperties::softMetal, true)) + .properties(p -> p.mapColor(MapColor.TERRACOTTA_YELLOW) + .requiresCorrectToolForDrops()) + .transform(pickaxeOnly()) + .register(); + + public static final BlockEntry COPPER_DISPLAY_CLOTH = + REGISTRATE.block("copper_display_cloth", p -> new DisplayClothBlock(p, "copper")) + .transform(BuilderTransformers.displayCloth("copper", SharedProperties::copperMetal, true)) + .properties(p -> p.requiresCorrectToolForDrops()) + .transform(pickaxeOnly()) + .register(); + public static final BlockEntry ANDESITE_FUNNEL = REGISTRATE.block("andesite_funnel", AndesiteFunnelBlock::new) .addLayer(() -> RenderType::cutoutMipped) @@ -2495,7 +2527,7 @@ public class AllBlocks { .build() .lang("Block of Brass") .register(); - + public static final BlockEntry CARDBOARD_BLOCK = REGISTRATE.block("cardboard_block", CardboardBlock::new) .initialProperties(() -> Blocks.MUSHROOM_STEM) @@ -2509,7 +2541,7 @@ public class AllBlocks { .build() .lang("Block of Cardboard") .register(); - + public static final BlockEntry BOUND_CARDBOARD_BLOCK = REGISTRATE.block("bound_cardboard_block", CardboardBlock::new) .initialProperties(() -> Blocks.MUSHROOM_STEM) diff --git a/src/main/java/com/simibubi/create/AllCreativeModeTabs.java b/src/main/java/com/simibubi/create/AllCreativeModeTabs.java index d854c9f9a0..98177e85a7 100644 --- a/src/main/java/com/simibubi/create/AllCreativeModeTabs.java +++ b/src/main/java/com/simibubi/create/AllCreativeModeTabs.java @@ -14,6 +14,7 @@ import com.simibubi.create.content.decoration.palettes.AllPaletteBlocks; import com.simibubi.create.content.equipment.armor.BacktankUtil; import com.simibubi.create.content.equipment.toolbox.ToolboxBlock; import com.simibubi.create.content.kinetics.crank.ValveHandleBlock; +import com.simibubi.create.content.logistics.displayCloth.DisplayClothBlock; import com.simibubi.create.content.logistics.packagePort.postbox.PostboxBlock; import com.simibubi.create.foundation.data.CreateRegistrate; import com.simibubi.create.foundation.item.TagDependentIngredientItem; @@ -241,6 +242,13 @@ public class AllCreativeModeTabs { } } + for (BlockEntry entry : AllBlocks.DISPLAY_CLOTHS) { + DisplayClothBlock block = entry.get(); + if (block.getColor() != DyeColor.RED) { + visibilities.put(entry.asItem(), TabVisibility.SEARCH_TAB_ONLY); + } + } + for (BlockEntry entry : AllBlocks.PACKAGE_POSTBOXES) { PostboxBlock block = entry.get(); if (block.getColor() != DyeColor.WHITE) { diff --git a/src/main/java/com/simibubi/create/AllEntityTypes.java b/src/main/java/com/simibubi/create/AllEntityTypes.java index 55b9e81fb4..3784dbb315 100644 --- a/src/main/java/com/simibubi/create/AllEntityTypes.java +++ b/src/main/java/com/simibubi/create/AllEntityTypes.java @@ -17,7 +17,7 @@ import com.simibubi.create.content.equipment.potatoCannon.PotatoProjectileRender import com.simibubi.create.content.logistics.box.PackageEntity; import com.simibubi.create.content.logistics.box.PackageRenderer; import com.simibubi.create.content.logistics.displayCloth.DisplayClothEntity; -import com.simibubi.create.content.logistics.displayCloth.DisplayClothRenderer; +import com.simibubi.create.content.logistics.displayCloth.DisplayClothEntityRenderer; import com.simibubi.create.content.trains.entity.CarriageContraptionEntity; import com.simibubi.create.content.trains.entity.CarriageContraptionEntityRenderer; import com.simibubi.create.content.trains.entity.CarriageContraptionVisual; @@ -66,7 +66,7 @@ public class AllEntityTypes { Integer.MAX_VALUE, false, true, BlueprintEntity::build).register(); public static final EntityEntry DISPLAY_CLOTH = - register("display_cloth", DisplayClothEntity::new, () -> DisplayClothRenderer::new, MobCategory.MISC, 10, + register("display_cloth", DisplayClothEntity::new, () -> DisplayClothEntityRenderer::new, MobCategory.MISC, 10, Integer.MAX_VALUE, false, true, DisplayClothEntity::build).register(); public static final EntityEntry POTATO_PROJECTILE = diff --git a/src/main/java/com/simibubi/create/AllPartialModels.java b/src/main/java/com/simibubi/create/AllPartialModels.java index e64810672b..2d1b4683a4 100644 --- a/src/main/java/com/simibubi/create/AllPartialModels.java +++ b/src/main/java/com/simibubi/create/AllPartialModels.java @@ -189,6 +189,11 @@ public class AllPartialModels { FACTORY_PANEL_RESTOCKER_WITH_BULB = block("factory_panel/panel_restocker_with_bulb"), FACTORY_PANEL_LIGHT = block("factory_panel/bulb_light"), + DISPLAY_CLOTH_NW = block("display_cloth/north_west"), + DISPLAY_CLOTH_NE = block("display_cloth/north_east"), + DISPLAY_CLOTH_SW = block("display_cloth/south_west"), + DISPLAY_CLOTH_SE = block("display_cloth/south_east"), + DISPLAY_CLOTH = entity("display_cloth"), CRAFTING_BLUEPRINT_1x1 = entity("crafting_blueprint_small"), diff --git a/src/main/java/com/simibubi/create/AllShapes.java b/src/main/java/com/simibubi/create/AllShapes.java index 9d12051c5a..367e9bbf4e 100644 --- a/src/main/java/com/simibubi/create/AllShapes.java +++ b/src/main/java/com/simibubi/create/AllShapes.java @@ -239,6 +239,9 @@ public class AllShapes { PACKAGE_PORT = shape(0, 0, 0, 16, 4, 16).add(2, 2, 2, 14, 14, 14) .build(), + DISPLAY_CLOTH = shape(-1, -9, -1, 17, 1, 17).build(), + DISPLAY_CLOTH_OCCLUSION = shape(0, 0, 0, 16, 1, 16).build(), + CHAIN_CONVEYOR_INTERACTION = shape(-10, 2, 0, 26, 14, 16).add(0, 2, -10, 16, 14, 26) .add(-5, 2, -5, 21, 14, 21) .add(Shapes.block()) diff --git a/src/main/java/com/simibubi/create/AllTags.java b/src/main/java/com/simibubi/create/AllTags.java index 2e8eef1fdb..8746b07c0f 100644 --- a/src/main/java/com/simibubi/create/AllTags.java +++ b/src/main/java/com/simibubi/create/AllTags.java @@ -97,6 +97,7 @@ public class AllTags { SAFE_NBT, SEATS, POSTBOXES, + DISPLAY_CLOTHS, TOOLBOXES, TRACKS, TREE_ATTACHMENTS, @@ -177,6 +178,7 @@ public class AllTags { SANDPAPER, SEATS, POSTBOXES, + DISPLAY_CLOTHS, SLEEPERS, TOOLBOXES, TRACKS, diff --git a/src/main/java/com/simibubi/create/content/logistics/depot/DepotRenderer.java b/src/main/java/com/simibubi/create/content/logistics/depot/DepotRenderer.java index 1a458775ca..deb82321ce 100644 --- a/src/main/java/com/simibubi/create/content/logistics/depot/DepotRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/depot/DepotRenderer.java @@ -27,8 +27,7 @@ import net.minecraft.world.phys.Vec3; public class DepotRenderer extends SafeBlockEntityRenderer { - public DepotRenderer(BlockEntityRendererProvider.Context context) { - } + public DepotRenderer(BlockEntityRendererProvider.Context context) {} @Override protected void renderSafe(DepotBlockEntity be, float partialTicks, PoseStack ms, MultiBufferSource buffer, @@ -59,7 +58,8 @@ public class DepotRenderer extends SafeBlockEntityRenderer { if (tis.insertedFrom.getAxis() .isHorizontal()) { Vec3 offsetVec = Vec3.atLowerCornerOf(tis.insertedFrom.getOpposite() - .getNormal()).scale(.5f - offset); + .getNormal()) + .scale(.5f - offset); ms.translate(offsetVec.x, offsetVec.y, offsetVec.z); boolean alongX = tis.insertedFrom.getClockWise() .getAxis() == Direction.Axis.X; @@ -93,15 +93,16 @@ public class DepotRenderer extends SafeBlockEntityRenderer { msr.rotateYDegrees(-(360 / 8f * i)); Random r = new Random(i + 1); int angle = (int) (360 * r.nextFloat()); - renderItem(be.getLevel(), ms, buffer, light, overlay, stack, renderUpright ? angle + 90 : angle, r, itemPosition, false); + renderItem(be.getLevel(), ms, buffer, light, overlay, stack, renderUpright ? angle + 90 : angle, r, + itemPosition, false); ms.popPose(); } ms.popPose(); } - public static void renderItem(Level level, PoseStack ms, MultiBufferSource buffer, int light, int overlay, ItemStack itemStack, - int angle, Random r, Vec3 itemPosition, boolean alwaysUpright) { + public static void renderItem(Level level, PoseStack ms, MultiBufferSource buffer, int light, int overlay, + ItemStack itemStack, int angle, Random r, Vec3 itemPosition, boolean alwaysUpright) { ItemRenderer itemRenderer = Minecraft.getInstance() .getItemRenderer(); var msr = TransformStack.of(ms); @@ -130,12 +131,15 @@ public class DepotRenderer extends SafeBlockEntityRenderer { if (blockItem && r != null) ms.translate(r.nextFloat() * .0625f * i, 0, r.nextFloat() * .0625f * i); - if (PackageItem.isPackage(itemStack)) { + if (PackageItem.isPackage(itemStack) && !alwaysUpright) { ms.translate(0, 4 / 16f, 0); ms.scale(1.5f, 1.5f, 1.5f); + } else if (blockItem && alwaysUpright) { + ms.translate(0, 1 / 16f, 0); + ms.scale(.755f, .755f, .755f); } else ms.scale(.5f, .5f, .5f); - + if (!blockItem && !renderUpright) { ms.translate(0, -3 / 16f, 0); msr.rotateXDegrees(90); diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothBlock.java b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothBlock.java new file mode 100644 index 0000000000..d4a2b83d58 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothBlock.java @@ -0,0 +1,164 @@ +package com.simibubi.create.content.logistics.displayCloth; + +import java.util.List; +import java.util.function.Predicate; + +import javax.annotation.Nullable; + +import com.simibubi.create.AllBlockEntityTypes; +import com.simibubi.create.AllShapes; +import com.simibubi.create.AllTags.AllItemTags; +import com.simibubi.create.content.equipment.wrench.IWrenchable; +import com.simibubi.create.foundation.block.IBE; +import com.simibubi.create.foundation.block.IHaveBigOutline; + +import net.createmod.catnip.utility.placement.IPlacementHelper; +import net.createmod.catnip.utility.placement.PlacementHelpers; +import net.createmod.catnip.utility.placement.PlacementOffset; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Direction.Axis; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition.Builder; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; + +public class DisplayClothBlock extends Block implements IHaveBigOutline, IWrenchable, IBE { + + public static final BooleanProperty HAS_BE = BooleanProperty.create("entity"); + + private static final int placementHelperId = PlacementHelpers.register(new PlacementHelper()); + + private DyeColor colour; + + public DisplayClothBlock(Properties pProperties, DyeColor colour) { + super(pProperties); + this.colour = colour; + registerDefaultState(defaultBlockState().setValue(HAS_BE, false)); + } + + public DisplayClothBlock(Properties pProperties, String type) { + super(pProperties); + } + + @Override + protected void createBlockStateDefinition(Builder pBuilder) { + super.createBlockStateDefinition(pBuilder.add(HAS_BE)); + } + + @Override + public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, + BlockHitResult ray) { + ItemStack heldItem = player.getItemInHand(hand); + if (player.isShiftKeyDown() || !player.mayBuild()) + return InteractionResult.PASS; + + IPlacementHelper placementHelper = PlacementHelpers.get(placementHelperId); + if (placementHelper.matchesItem(heldItem)) { + placementHelper.getOffset(player, world, state, pos, ray) + .placeInWorld(world, (BlockItem) heldItem.getItem(), player, hand, ray); + return InteractionResult.SUCCESS; + } + + if (heldItem.isEmpty() && !state.getValue(HAS_BE)) + return InteractionResult.PASS; + + if (!world.isClientSide() && !state.getValue(HAS_BE)) + world.setBlockAndUpdate(pos, state.cycle(HAS_BE)); + if (world.isClientSide()) + return InteractionResult.SUCCESS; + + return onBlockEntityUse(world, pos, dcbe -> dcbe.use(player)); + } + + @Override + public VoxelShape getShape(BlockState pState, BlockGetter pLevel, BlockPos pPos, CollisionContext pContext) { + return colour == null ? AllShapes.DISPLAY_CLOTH_OCCLUSION : AllShapes.DISPLAY_CLOTH; + } + + @Override + public VoxelShape getInteractionShape(BlockState pState, BlockGetter pLevel, BlockPos pPos) { + return colour == null ? AllShapes.DISPLAY_CLOTH_OCCLUSION : AllShapes.DISPLAY_CLOTH; + } + + @Override + public VoxelShape getOcclusionShape(BlockState pState, BlockGetter pLevel, BlockPos pPos) { + return AllShapes.DISPLAY_CLOTH_OCCLUSION; + } + + @Override + public boolean canSurvive(BlockState p_152922_, LevelReader p_152923_, BlockPos p_152924_) { + return true; + } + + @Nullable + public DyeColor getColor() { + return colour; + } + + @Nullable + @Override + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return state.getValue(HAS_BE) ? IBE.super.newBlockEntity(pos, state) : null; + } + + @Override + public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pMovedByPiston) { + if (!pNewState.getOptionalValue(HAS_BE) + .orElse(false)) + pNewState = Blocks.AIR.defaultBlockState(); + + IBE.onRemove(pState, pLevel, pPos, pNewState); + } + + @Override + public Class getBlockEntityClass() { + return DisplayClothBlockEntity.class; + } + + @Override + public BlockEntityType getBlockEntityType() { + return AllBlockEntityTypes.DISPLAY_CLOTH.get(); + } + + private static class PlacementHelper implements IPlacementHelper { + + @Override + public Predicate getItemPredicate() { + return i -> AllItemTags.DISPLAY_CLOTHS.matches(i.getItem()); + } + + @Override + public Predicate getStatePredicate() { + return s -> s.getBlock() instanceof DisplayClothBlock; + } + + @Override + public PlacementOffset getOffset(Player player, Level world, BlockState state, BlockPos pos, + BlockHitResult ray) { + List directions = IPlacementHelper.orderedByDistanceExceptAxis(pos, ray.getLocation(), Axis.Y, + dir -> world.getBlockState(pos.relative(dir)) + .canBeReplaced()); + + if (directions.isEmpty()) + return PlacementOffset.fail(); + else + return PlacementOffset.success(pos.relative(directions.get(0)), s -> s); + } + } +} diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothBlockEntity.java new file mode 100644 index 0000000000..d387581d8b --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothBlockEntity.java @@ -0,0 +1,88 @@ +package com.simibubi.create.content.logistics.displayCloth; + +import java.util.ArrayList; +import java.util.List; + +import com.simibubi.create.AllPackets; +import com.simibubi.create.foundation.blockEntity.RemoveBlockEntityPacket; +import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; +import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; + +import net.createmod.catnip.utility.NBTHelper; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; +import net.minecraft.world.Containers; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; + +public class DisplayClothBlockEntity extends SmartBlockEntity { + + private List manuallyAddedItems; + + public DisplayClothBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { + super(type, pos, state); + manuallyAddedItems = new ArrayList<>(); + } + + @Override + public void addBehaviours(List behaviours) {} + + public List getItemsForRender() { + return manuallyAddedItems; + } + + public InteractionResult use(Player player) { + ItemStack heldItem = player.getItemInHand(InteractionHand.MAIN_HAND); + + if (heldItem.isEmpty()) { + if (manuallyAddedItems.isEmpty()) + return InteractionResult.SUCCESS; + player.setItemInHand(InteractionHand.MAIN_HAND, manuallyAddedItems.remove(manuallyAddedItems.size() - 1)); + + if (manuallyAddedItems.isEmpty()) { + level.setBlock(worldPosition, getBlockState().setValue(DisplayClothBlock.HAS_BE, false), 3); + AllPackets.getChannel() + .send(packetTarget(), new RemoveBlockEntityPacket(worldPosition)); + } else + notifyUpdate(); + + return InteractionResult.SUCCESS; + } + + if (manuallyAddedItems.size() >= 4) + return InteractionResult.SUCCESS; + + manuallyAddedItems.add(heldItem.copyWithCount(1)); + heldItem.shrink(1); + if (heldItem.isEmpty()) + player.setItemInHand(InteractionHand.MAIN_HAND, ItemStack.EMPTY); + notifyUpdate(); + return InteractionResult.SUCCESS; + } + + @Override + protected void write(CompoundTag tag, boolean clientPacket) { + super.write(tag, clientPacket); + tag.put("Items", NBTHelper.writeItemList(manuallyAddedItems)); + } + + @Override + protected void read(CompoundTag tag, boolean clientPacket) { + super.read(tag, clientPacket); + manuallyAddedItems = NBTHelper.readItemList(tag.getList("Items", Tag.TAG_COMPOUND)); + } + + @Override + public void destroy() { + super.destroy(); + manuallyAddedItems.forEach(stack -> Containers.dropItemStack(level, worldPosition.getX(), worldPosition.getY(), + worldPosition.getZ(), stack)); + manuallyAddedItems.clear(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothEntityRenderer.java b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothEntityRenderer.java new file mode 100644 index 0000000000..794e8c3ba0 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothEntityRenderer.java @@ -0,0 +1,71 @@ +package com.simibubi.create.content.logistics.displayCloth; + +import java.util.List; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; +import com.simibubi.create.AllPartialModels; +import com.simibubi.create.content.logistics.BigItemStack; +import com.simibubi.create.content.logistics.depot.DepotRenderer; + +import dev.engine_room.flywheel.lib.model.baked.PartialModel; +import net.createmod.catnip.render.CachedBuffers; +import net.createmod.catnip.render.SuperByteBuffer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.Sheets; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Blocks; + +public class DisplayClothEntityRenderer extends EntityRenderer { + + public DisplayClothEntityRenderer(EntityRendererProvider.Context context) { + super(context); + } + + @Override + public void render(DisplayClothEntity entity, float yaw, float pt, PoseStack ms, MultiBufferSource buffer, + int light) { + PartialModel partialModel = AllPartialModels.DISPLAY_CLOTH; + SuperByteBuffer sbb = CachedBuffers.partial(partialModel, Blocks.AIR.defaultBlockState()); + + sbb.rotateYDegrees(180 + -entity.getYRot()) + .translate(-.5, 0, -.5) + .light(light) + .renderInto(ms, buffer.getBuffer(Sheets.solidBlockSheet())); + + if (entity.requestData == null) { + super.render(entity, yaw, pt, ms, buffer, light); + return; + } + + List stacks = entity.requestData.encodedRequest.stacks(); + + for (int i = 0; i < stacks.size(); i++) { + BigItemStack entry = stacks.get(i); + ms.pushPose(); + ms.translate(0, 3 / 16f, 0); + + if (stacks.size() > 1) { + ms.mulPose(Axis.YP.rotationDegrees(-entity.getYRot() + i * (360f / stacks.size()))); + ms.translate(0, i % 2 == 0 ? -0.005 : 0, 4 / 16f); + ms.mulPose(Axis.YP.rotationDegrees(entity.getYRot() - i * (360f / stacks.size()))); + } + + ms.mulPose(Axis.YP.rotationDegrees(180)); + DepotRenderer.renderItem(entity.level(), ms, buffer, light, OverlayTexture.NO_OVERLAY, entry.stack, 0, null, + entity.position(), true); + ms.popPose(); + } + + super.render(entity, yaw, pt, ms, buffer, light); + } + + @Override + public ResourceLocation getTextureLocation(DisplayClothEntity entity) { + return null; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothModel.java b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothModel.java new file mode 100644 index 0000000000..a0b68285b9 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothModel.java @@ -0,0 +1,120 @@ +package com.simibubi.create.content.logistics.displayCloth; + +import java.util.ArrayList; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import com.simibubi.create.AllPartialModels; +import com.simibubi.create.foundation.model.BakedModelWrapperWithData; +import com.simibubi.create.foundation.model.BakedQuadHelper; + +import dev.engine_room.flywheel.lib.model.baked.PartialModel; +import net.createmod.catnip.render.SpriteShiftEntry; +import net.createmod.catnip.utility.Iterate; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Direction.Axis; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.BlockAndTintGetter; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.client.model.data.ModelData; +import net.minecraftforge.client.model.data.ModelData.Builder; +import net.minecraftforge.client.model.data.ModelProperty; + +public class DisplayClothModel extends BakedModelWrapperWithData { + + private static final ModelProperty CULL_PROPERTY = new ModelProperty<>(); + + private static final Map>> CORNERS = new HashMap<>(); + + public DisplayClothModel(BakedModel originalModel) { + super(originalModel); + } + + public static void reload() { + CORNERS.clear(); + } + + @Override + public boolean useAmbientOcclusion() { + return false; + } + + private List getCorner(DisplayClothBlock block, int corner, @NotNull RandomSource rand, + @Nullable RenderType renderType) { + + List> corners = CORNERS.computeIfAbsent(block, b -> { + TextureAtlasSprite targetSprite = getParticleIcon(ModelData.EMPTY); + List> list = new ArrayList<>(); + + for (PartialModel pm : List.of(AllPartialModels.DISPLAY_CLOTH_SW, AllPartialModels.DISPLAY_CLOTH_NW, + AllPartialModels.DISPLAY_CLOTH_NE, AllPartialModels.DISPLAY_CLOTH_SE)) { + List quads = new ArrayList<>(); + + for (BakedQuad quad : pm.get() + .getQuads(null, null, rand, ModelData.EMPTY, renderType)) { + TextureAtlasSprite original = quad.getSprite(); + BakedQuad newQuad = BakedQuadHelper.clone(quad); + int[] vertexData = newQuad.getVertices(); + for (int vertex = 0; vertex < 4; vertex++) { + BakedQuadHelper.setU(vertexData, vertex, targetSprite.getU( + SpriteShiftEntry.getUnInterpolatedU(original, BakedQuadHelper.getU(vertexData, vertex)))); + BakedQuadHelper.setV(vertexData, vertex, targetSprite.getV( + SpriteShiftEntry.getUnInterpolatedV(original, BakedQuadHelper.getV(vertexData, vertex)))); + } + quads.add(newQuad); + } + list.add(quads); + } + return list; + }); + + return corners.get(corner); + } + + @Override + protected Builder gatherModelData(Builder builder, BlockAndTintGetter world, BlockPos pos, BlockState state, + ModelData blockEntityData) { + List culledSides = new ArrayList<>(); + for (Direction side : Iterate.horizontalDirections) + if (!Block.shouldRenderFace(state, world, pos, side, pos.relative(side))) + culledSides.add(side); + if (culledSides.isEmpty()) + return builder; + return builder.with(CULL_PROPERTY, new CullData(EnumSet.copyOf(culledSides))); + } + + @Override + public @NotNull List getQuads(@Nullable BlockState state, @Nullable Direction side, + @NotNull RandomSource rand, @NotNull ModelData extraData, @Nullable RenderType renderType) { + @NotNull + List mainQuads = super.getQuads(state, side, rand, extraData, renderType); + if (side == null || side.getAxis() == Axis.Y) + return mainQuads; + + CullData cullData = extraData.get(CULL_PROPERTY); + if (cullData != null && cullData.culled() + .contains(side.getClockWise())) + return mainQuads; + if (state == null || !(state.getBlock() instanceof DisplayClothBlock dcb)) + return mainQuads; + + List copyOf = new ArrayList<>(mainQuads); + copyOf.addAll(getCorner(dcb, side.get2DDataValue(), rand, renderType)); + return copyOf; + } + + private static record CullData(EnumSet culled) { + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothRenderer.java b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothRenderer.java index 7b4d53f62e..9d7c2286b2 100644 --- a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothRenderer.java @@ -4,68 +4,43 @@ import java.util.List; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Axis; -import com.simibubi.create.AllPartialModels; -import com.simibubi.create.content.logistics.BigItemStack; import com.simibubi.create.content.logistics.depot.DepotRenderer; +import com.simibubi.create.foundation.blockEntity.renderer.SmartBlockEntityRenderer; -import dev.engine_room.flywheel.lib.model.baked.PartialModel; -import net.createmod.catnip.render.CachedBuffers; -import net.createmod.catnip.render.SuperByteBuffer; import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.Sheets; -import net.minecraft.client.renderer.entity.EntityRenderer; -import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider.Context; import net.minecraft.client.renderer.texture.OverlayTexture; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.phys.Vec3; -public class DisplayClothRenderer extends EntityRenderer { +public class DisplayClothRenderer extends SmartBlockEntityRenderer { - public DisplayClothRenderer(EntityRendererProvider.Context context) { + public DisplayClothRenderer(Context context) { super(context); } @Override - public void render(DisplayClothEntity entity, float yaw, float pt, PoseStack ms, MultiBufferSource buffer, - int light) { - PartialModel partialModel = AllPartialModels.DISPLAY_CLOTH; - SuperByteBuffer sbb = CachedBuffers.partial(partialModel, Blocks.AIR.defaultBlockState()); - - sbb.rotateYDegrees(180 + -entity.getYRot()) - .translate(-.5, 0, -.5) - .light(light) - .renderInto(ms, buffer.getBuffer(Sheets.solidBlockSheet())); - - if (entity.requestData == null) { - super.render(entity, yaw, pt, ms, buffer, light); - return; - } - - List stacks = entity.requestData.encodedRequest.stacks(); + protected void renderSafe(DisplayClothBlockEntity blockEntity, float partialTicks, PoseStack ms, + MultiBufferSource buffer, int light, int overlay) { + super.renderSafe(blockEntity, partialTicks, ms, buffer, light, overlay); + List stacks = blockEntity.getItemsForRender(); for (int i = 0; i < stacks.size(); i++) { - BigItemStack entry = stacks.get(i); + ItemStack entry = stacks.get(i); ms.pushPose(); - ms.translate(0, 3 / 16f, 0); + ms.translate(0.5f, 3 / 16f, 0.5f); if (stacks.size() > 1) { - ms.mulPose(Axis.YP.rotationDegrees(-entity.getYRot() + i * (360f / stacks.size()))); - ms.translate(0, i % 2 == 0 ? -0.005 : 0, 4 / 16f); - ms.mulPose(Axis.YP.rotationDegrees(entity.getYRot() - i * (360f / stacks.size()))); + ms.mulPose(Axis.YP.rotationDegrees(i * (360f / stacks.size()) + 45f)); + ms.translate(0, i % 2 == 0 ? -0.005 : 0, 5 / 16f); + ms.mulPose(Axis.YP.rotationDegrees(-i * (360f / stacks.size()) - 45f)); } ms.mulPose(Axis.YP.rotationDegrees(180)); - DepotRenderer.renderItem(entity.level(), ms, buffer, light, OverlayTexture.NO_OVERLAY, entry.stack, 0, null, - entity.position(), true); + DepotRenderer.renderItem(blockEntity.getLevel(), ms, buffer, light, OverlayTexture.NO_OVERLAY, entry, 0, + null, Vec3.atCenterOf(blockEntity.getBlockPos()), true); ms.popPose(); } - - super.render(entity, yaw, pt, ms, buffer, light); - } - - @Override - public ResourceLocation getTextureLocation(DisplayClothEntity entity) { - return null; } } diff --git a/src/main/java/com/simibubi/create/foundation/ClientResourceReloadListener.java b/src/main/java/com/simibubi/create/foundation/ClientResourceReloadListener.java index 12f4a4a318..383235fb46 100644 --- a/src/main/java/com/simibubi/create/foundation/ClientResourceReloadListener.java +++ b/src/main/java/com/simibubi/create/foundation/ClientResourceReloadListener.java @@ -2,6 +2,7 @@ package com.simibubi.create.foundation; import com.simibubi.create.CreateClient; import com.simibubi.create.content.kinetics.belt.BeltHelper; +import com.simibubi.create.content.logistics.displayCloth.DisplayClothModel; import com.simibubi.create.foundation.sound.SoundScapes; import net.minecraft.server.packs.resources.ResourceManager; @@ -14,6 +15,7 @@ public class ClientResourceReloadListener implements ResourceManagerReloadListen CreateClient.invalidateRenderers(); SoundScapes.invalidateAll(); BeltHelper.uprightCache.clear(); + DisplayClothModel.reload(); } } diff --git a/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java b/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java index 574cbf0e16..8fc8dbd5c0 100644 --- a/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java +++ b/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java @@ -37,6 +37,7 @@ import com.simibubi.create.content.kinetics.simpleRelays.encased.EncasedCogCTBeh import com.simibubi.create.content.kinetics.simpleRelays.encased.EncasedCogwheelBlock; import com.simibubi.create.content.kinetics.simpleRelays.encased.EncasedShaftBlock; import com.simibubi.create.content.logistics.box.PackageItem; +import com.simibubi.create.content.logistics.displayCloth.DisplayClothModel; import com.simibubi.create.content.logistics.tunnel.BeltTunnelBlock; import com.simibubi.create.content.logistics.tunnel.BeltTunnelBlock.Shape; import com.simibubi.create.content.logistics.tunnel.BeltTunnelItem; @@ -48,6 +49,7 @@ import com.simibubi.create.foundation.block.connected.HorizontalCTBehaviour; import com.tterrag.registrate.builders.BlockBuilder; import com.tterrag.registrate.builders.ItemBuilder; import com.tterrag.registrate.util.DataIngredient; +import com.tterrag.registrate.util.nullness.NonNullSupplier; import com.tterrag.registrate.util.nullness.NonNullUnaryOperator; import net.createmod.catnip.platform.CatnipServices; @@ -105,7 +107,8 @@ public class BuilderTransformers { .blockstate((c, p) -> BlockStateGen.horizontalAxisBlock(c, p, s -> p.models() .getExistingFile(p.modLoc("block/track/bogey/top")))) .loot((p, l) -> p.dropOther(l, AllBlocks.RAILWAY_CASING.get())) - .onRegister(block -> AbstractBogeyBlock.registerStandardBogey(CatnipServices.REGISTRIES.getKeyOrThrow(block))); + .onRegister( + block -> AbstractBogeyBlock.registerStandardBogey(CatnipServices.REGISTRIES.getKeyOrThrow(block))); } public static NonNullUnaryOperator> copycat() { @@ -471,4 +474,22 @@ public class BuilderTransformers { .toUpperCase(Locale.ROOT) + material.substring(1) + " Package"); } + public static NonNullUnaryOperator> displayCloth(String name, + NonNullSupplier initialProps, boolean lowerItem) { + return b -> b.initialProperties(initialProps) + .addLayer(() -> RenderType::cutoutMipped) + .blockstate((c, p) -> p.simpleBlock(c.get(), p.models() + .withExistingParent(name + "_display_cloth", p.modLoc("block/display_cloth/block")) + .texture("0", p.modLoc("block/display_cloth/" + name)))) + .onRegister(CreateRegistrate.blockModel(() -> DisplayClothModel::new)) + .tag(AllBlockTags.DISPLAY_CLOTHS.tag) + .item() + .model((c, p) -> p + .withExistingParent(name + "_display_cloth", + p.modLoc("block/display_cloth/item" + (lowerItem ? "_lower" : ""))) + .texture("0", p.modLoc("block/display_cloth/" + name))) + .tag(AllItemTags.DISPLAY_CLOTHS.tag) + .build(); + } + } diff --git a/src/main/resources/assets/create/models/block/display_cloth/block.json b/src/main/resources/assets/create/models/block/display_cloth/block.json new file mode 100644 index 0000000000..aac1d9ecbe --- /dev/null +++ b/src/main/resources/assets/create/models/block/display_cloth/block.json @@ -0,0 +1,129 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "0": "create:block/display_cloth/red", + "particle": "#0" + }, + "elements": [ + { + "from": [0, 0, 0], + "to": [16, 1, 16], + "faces": { + "north": {"uv": [0, 7.5, 8, 8], "texture": "#0", "cullface": "north"}, + "east": {"uv": [0, 7.5, 8, 8], "texture": "#0", "cullface": "east"}, + "south": {"uv": [0, 7.5, 8, 8], "texture": "#0", "cullface": "south"}, + "west": {"uv": [0, 7.5, 8, 8], "texture": "#0", "cullface": "west"}, + "up": {"uv": [0, 0, 8, 8], "texture": "#0"}, + "down": {"uv": [0, 0, 8, 8], "texture": "#0", "cullface": "down"} + } + }, + { + "from": [-1, -11, 0], + "to": [0, 1, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 8, 0.5, 14], "texture": "#0", "cullface": "west"}, + "east": {"uv": [0, 8, 8, 14], "texture": "#0", "cullface": "west"}, + "south": {"uv": [6, 8, 6.5, 14], "texture": "#0", "cullface": "west"}, + "west": {"uv": [0, 8, 8, 14], "texture": "#0", "cullface": "west"}, + "up": {"uv": [0, 8, 8, 8.5], "rotation": 90, "texture": "#0", "cullface": "west"} + } + }, + { + "from": [-1, -9, 0], + "to": [0, -8, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "down": {"uv": [0, 15.5, 8, 16], "rotation": 90, "texture": "#0", "cullface": "west"} + } + }, + { + "from": [0, -11, -1], + "to": [16, 1, 0], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 8, 8, 14], "texture": "#0", "cullface": "north"}, + "east": {"uv": [0, 8, 0.5, 14], "texture": "#0", "cullface": "north"}, + "south": {"uv": [0, 8, 8, 14], "texture": "#0", "cullface": "north"}, + "west": {"uv": [6, 8, 6.5, 14], "texture": "#0", "cullface": "north"}, + "up": {"uv": [0, 8, 8, 8.5], "rotation": 180, "texture": "#0", "cullface": "north"} + } + }, + { + "from": [0, -9, -1], + "to": [16, -8, 0], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "down": {"uv": [0, 15.5, 8, 16], "texture": "#0", "cullface": "north"} + } + }, + { + "from": [16, -11, 0], + "to": [17, 1, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [6, 8, 6.5, 14], "texture": "#0", "cullface": "east"}, + "east": {"uv": [0, 8, 8, 14], "texture": "#0", "cullface": "east"}, + "south": {"uv": [0, 8, 0.5, 14], "texture": "#0", "cullface": "east"}, + "west": {"uv": [0, 8, 8, 14], "texture": "#0", "cullface": "east"}, + "up": {"uv": [0, 8, 8, 8.5], "rotation": 270, "texture": "#0", "cullface": "east"} + } + }, + { + "from": [16, -9, 0], + "to": [17, -8, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "down": {"uv": [0, 15.5, 8, 16], "rotation": 270, "texture": "#0", "cullface": "east"} + } + }, + { + "from": [0, -11, 16], + "to": [16, 1, 17], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 8, 8, 14], "texture": "#0", "cullface": "south"}, + "east": {"uv": [6, 8, 6.5, 14], "texture": "#0", "cullface": "south"}, + "south": {"uv": [0, 8, 8, 14], "texture": "#0", "cullface": "south"}, + "west": {"uv": [0, 8, 0.5, 14], "texture": "#0", "cullface": "south"}, + "up": {"uv": [0, 8, 8, 8.5], "texture": "#0", "cullface": "south"} + } + }, + { + "from": [0, -9, 16], + "to": [16, -8, 17], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "down": {"uv": [0, 15.5, 8, 16], "rotation": 180, "texture": "#0", "cullface": "south"} + } + } + ], + "groups": [ + 0, + { + "name": "west", + "origin": [-2, 2, 0], + "color": 0, + "children": [1, 2] + }, + { + "name": "north", + "origin": [-2, 2, 0], + "color": 0, + "children": [3, 4] + }, + { + "name": "east", + "origin": [-2, 2, 0], + "color": 0, + "children": [5, 6] + }, + { + "name": "south", + "origin": [-2, 2, 0], + "color": 0, + "children": [7, 8] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/display_cloth/item.json b/src/main/resources/assets/create/models/block/display_cloth/item.json new file mode 100644 index 0000000000..816c98c4b1 --- /dev/null +++ b/src/main/resources/assets/create/models/block/display_cloth/item.json @@ -0,0 +1,252 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "0": "create:block/display_cloth/red", + "particle": "#0" + }, + "elements": [ + { + "from": [0, 0, 0], + "to": [16, 1, 16], + "faces": { + "north": {"uv": [0, 7.5, 8, 8], "texture": "#0", "cullface": "north"}, + "east": {"uv": [0, 7.5, 8, 8], "texture": "#0", "cullface": "east"}, + "south": {"uv": [0, 7.5, 8, 8], "texture": "#0", "cullface": "south"}, + "west": {"uv": [0, 7.5, 8, 8], "texture": "#0", "cullface": "west"}, + "up": {"uv": [0, 0, 8, 8], "texture": "#0"}, + "down": {"uv": [0, 0, 8, 8], "texture": "#0", "cullface": "down"} + } + }, + { + "from": [-1, -11, 0], + "to": [0, 1, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "east": {"uv": [0, 8, 8, 14], "texture": "#0", "cullface": "west"}, + "west": {"uv": [0, 8, 8, 14], "texture": "#0", "cullface": "west"}, + "up": {"uv": [0, 8, 8, 8.5], "rotation": 90, "texture": "#0", "cullface": "west"} + } + }, + { + "from": [-1, -9, 0], + "to": [0, -8, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "down": {"uv": [0, 15.5, 8, 16], "rotation": 90, "texture": "#0", "cullface": "west"} + } + }, + { + "from": [0, -11, -1], + "to": [16, 1, 0], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 8, 8, 14], "texture": "#0", "cullface": "north"}, + "south": {"uv": [0, 8, 8, 14], "texture": "#0", "cullface": "north"}, + "up": {"uv": [0, 8, 8, 8.5], "rotation": 180, "texture": "#0", "cullface": "north"} + } + }, + { + "from": [0, -9, -1], + "to": [16, -8, 0], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "down": {"uv": [0, 15.5, 8, 16], "texture": "#0", "cullface": "north"} + } + }, + { + "from": [16, -11, 0], + "to": [17, 1, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "east": {"uv": [0, 8, 8, 14], "texture": "#0", "cullface": "east"}, + "west": {"uv": [0, 8, 8, 14], "texture": "#0", "cullface": "east"}, + "up": {"uv": [0, 8, 8, 8.5], "rotation": 270, "texture": "#0", "cullface": "east"} + } + }, + { + "from": [16, -9, 0], + "to": [17, -8, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "down": {"uv": [0, 15.5, 8, 16], "rotation": 270, "texture": "#0", "cullface": "east"} + } + }, + { + "from": [0, -11, 16], + "to": [16, 1, 17], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 8, 8, 14], "texture": "#0", "cullface": "south"}, + "south": {"uv": [0, 8, 8, 14], "texture": "#0", "cullface": "south"}, + "up": {"uv": [0, 8, 8, 8.5], "texture": "#0", "cullface": "south"} + } + }, + { + "from": [0, -9, 16], + "to": [16, -8, 17], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "down": {"uv": [0, 15.5, 8, 16], "rotation": 180, "texture": "#0", "cullface": "south"} + } + }, + { + "from": [-1, -11, -1], + "to": [0, 1, 0], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [9, 8, 9.5, 14], "texture": "#0"}, + "west": {"uv": [9.5, 8, 10, 14], "texture": "#0"}, + "up": {"uv": [9, 8, 9.5, 8.5], "texture": "#0"} + } + }, + { + "from": [-1, -9, -1], + "to": [0, -8, 0], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "down": {"uv": [7.5, 15.5, 8, 16], "texture": "#0"} + } + }, + { + "from": [16, -11, -1], + "to": [17, 1, 0], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [9.5, 8, 10, 14], "texture": "#0"}, + "east": {"uv": [9, 8, 9.5, 14], "texture": "#0"}, + "up": {"uv": [9, 8, 9.5, 8.5], "rotation": 90, "texture": "#0"} + } + }, + { + "from": [16, -9, -1], + "to": [17, -8, 0], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "down": {"uv": [7.5, 15.5, 8, 16], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [16, -11, 16], + "to": [17, 1, 17], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "east": {"uv": [9.5, 8, 10, 14], "texture": "#0"}, + "south": {"uv": [9, 8, 9.5, 14], "texture": "#0"}, + "up": {"uv": [9, 8, 9.5, 8.5], "rotation": 180, "texture": "#0"} + } + }, + { + "from": [16, -9, 16], + "to": [17, -8, 17], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "down": {"uv": [7.5, 15.5, 8, 16], "rotation": 180, "texture": "#0"} + } + }, + { + "from": [-1, -11, 16], + "to": [0, 1, 17], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "south": {"uv": [9.5, 8, 10, 14], "texture": "#0"}, + "west": {"uv": [9, 8, 9.5, 14], "texture": "#0"}, + "up": {"uv": [9, 8, 9.5, 8.5], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [-1, -9, 16], + "to": [0, -8, 17], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "down": {"uv": [7.5, 15.5, 8, 16], "rotation": 90, "texture": "#0"} + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 3.25], + "scale": [0.375, 0.375, 0.375] + }, + "thirdperson_lefthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 3.5], + "scale": [0.375, 0.375, 0.375] + }, + "firstperson_righthand": { + "rotation": [0, 45, 0], + "translation": [0, 3.25, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 45, 0], + "translation": [0, 3.25, 0], + "scale": [0.4, 0.4, 0.4] + }, + "ground": { + "translation": [0, 3.5, 0], + "scale": [0.25, 0.25, 0.25] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0, 6.75, 0], + "scale": [0.625, 0.625, 0.625] + }, + "fixed": { + "translation": [0, 5.75, 0], + "scale": [0.5, 0.5, 0.5] + } + }, + "groups": [ + 0, + { + "name": "west", + "origin": [-2, 2, 0], + "color": 0, + "children": [1, 2] + }, + { + "name": "north", + "origin": [-2, 2, 0], + "color": 0, + "children": [3, 4] + }, + { + "name": "east", + "origin": [-2, 2, 0], + "color": 0, + "children": [5, 6] + }, + { + "name": "south", + "origin": [-2, 2, 0], + "color": 0, + "children": [7, 8] + }, + { + "name": "northwest", + "origin": [-1, 2, -1], + "color": 0, + "children": [9, 10] + }, + { + "name": "northeast", + "origin": [-1, 2, -1], + "color": 0, + "children": [11, 12] + }, + { + "name": "southeast", + "origin": [-1, 2, -1], + "color": 0, + "children": [13, 14] + }, + { + "name": "southwest", + "origin": [-1, 2, -1], + "color": 0, + "children": [15, 16] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/display_cloth/item_lower.json b/src/main/resources/assets/create/models/block/display_cloth/item_lower.json new file mode 100644 index 0000000000..2462647221 --- /dev/null +++ b/src/main/resources/assets/create/models/block/display_cloth/item_lower.json @@ -0,0 +1,252 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "0": "create:block/display_cloth/red", + "particle": "#0" + }, + "elements": [ + { + "from": [0, 0, 0], + "to": [16, 1, 16], + "faces": { + "north": {"uv": [0, 7.5, 8, 8], "texture": "#0", "cullface": "north"}, + "east": {"uv": [0, 7.5, 8, 8], "texture": "#0", "cullface": "east"}, + "south": {"uv": [0, 7.5, 8, 8], "texture": "#0", "cullface": "south"}, + "west": {"uv": [0, 7.5, 8, 8], "texture": "#0", "cullface": "west"}, + "up": {"uv": [0, 0, 8, 8], "texture": "#0"}, + "down": {"uv": [0, 0, 8, 8], "texture": "#0", "cullface": "down"} + } + }, + { + "from": [-1, -11, 0], + "to": [0, 1, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "east": {"uv": [0, 8, 8, 14], "texture": "#0", "cullface": "west"}, + "west": {"uv": [0, 8, 8, 14], "texture": "#0", "cullface": "west"}, + "up": {"uv": [0, 8, 8, 8.5], "rotation": 90, "texture": "#0", "cullface": "west"} + } + }, + { + "from": [-1, -9, 0], + "to": [0, -8, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "down": {"uv": [0, 15.5, 8, 16], "rotation": 90, "texture": "#0", "cullface": "west"} + } + }, + { + "from": [0, -11, -1], + "to": [16, 1, 0], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 8, 8, 14], "texture": "#0", "cullface": "north"}, + "south": {"uv": [0, 8, 8, 14], "texture": "#0", "cullface": "north"}, + "up": {"uv": [0, 8, 8, 8.5], "rotation": 180, "texture": "#0", "cullface": "north"} + } + }, + { + "from": [0, -9, -1], + "to": [16, -8, 0], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "down": {"uv": [0, 15.5, 8, 16], "texture": "#0", "cullface": "north"} + } + }, + { + "from": [16, -11, 0], + "to": [17, 1, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "east": {"uv": [0, 8, 8, 14], "texture": "#0", "cullface": "east"}, + "west": {"uv": [0, 8, 8, 14], "texture": "#0", "cullface": "east"}, + "up": {"uv": [0, 8, 8, 8.5], "rotation": 270, "texture": "#0", "cullface": "east"} + } + }, + { + "from": [16, -9, 0], + "to": [17, -8, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "down": {"uv": [0, 15.5, 8, 16], "rotation": 270, "texture": "#0", "cullface": "east"} + } + }, + { + "from": [0, -11, 16], + "to": [16, 1, 17], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 8, 8, 14], "texture": "#0", "cullface": "south"}, + "south": {"uv": [0, 8, 8, 14], "texture": "#0", "cullface": "south"}, + "up": {"uv": [0, 8, 8, 8.5], "texture": "#0", "cullface": "south"} + } + }, + { + "from": [0, -9, 16], + "to": [16, -8, 17], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "down": {"uv": [0, 15.5, 8, 16], "rotation": 180, "texture": "#0", "cullface": "south"} + } + }, + { + "from": [-1, -11, -1], + "to": [0, 1, 0], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [9, 8, 9.5, 14], "texture": "#0"}, + "west": {"uv": [9.5, 8, 10, 14], "texture": "#0"}, + "up": {"uv": [9, 8, 9.5, 8.5], "texture": "#0"} + } + }, + { + "from": [-1, -9, -1], + "to": [0, -8, 0], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "down": {"uv": [7.5, 15.5, 8, 16], "texture": "#0"} + } + }, + { + "from": [16, -11, -1], + "to": [17, 1, 0], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [9.5, 8, 10, 14], "texture": "#0"}, + "east": {"uv": [9, 8, 9.5, 14], "texture": "#0"}, + "up": {"uv": [9, 8, 9.5, 8.5], "rotation": 90, "texture": "#0"} + } + }, + { + "from": [16, -9, -1], + "to": [17, -8, 0], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "down": {"uv": [7.5, 15.5, 8, 16], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [16, -11, 16], + "to": [17, 1, 17], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "east": {"uv": [9.5, 8, 10, 14], "texture": "#0"}, + "south": {"uv": [9, 8, 9.5, 14], "texture": "#0"}, + "up": {"uv": [9, 8, 9.5, 8.5], "rotation": 180, "texture": "#0"} + } + }, + { + "from": [16, -9, 16], + "to": [17, -8, 17], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "down": {"uv": [7.5, 15.5, 8, 16], "rotation": 180, "texture": "#0"} + } + }, + { + "from": [-1, -11, 16], + "to": [0, 1, 17], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "south": {"uv": [9.5, 8, 10, 14], "texture": "#0"}, + "west": {"uv": [9, 8, 9.5, 14], "texture": "#0"}, + "up": {"uv": [9, 8, 9.5, 8.5], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [-1, -9, 16], + "to": [0, -8, 17], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "down": {"uv": [7.5, 15.5, 8, 16], "rotation": 90, "texture": "#0"} + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 3.25], + "scale": [0.375, 0.375, 0.375] + }, + "thirdperson_lefthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 3.5], + "scale": [0.375, 0.375, 0.375] + }, + "firstperson_righthand": { + "rotation": [0, 45, 0], + "translation": [0, 3.25, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 45, 0], + "translation": [0, 3.25, 0], + "scale": [0.4, 0.4, 0.4] + }, + "ground": { + "translation": [0, 3.5, 0], + "scale": [0.25, 0.25, 0.25] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0, 3.75, 0], + "scale": [0.625, 0.625, 0.625] + }, + "fixed": { + "translation": [0, 5.75, 0], + "scale": [0.5, 0.5, 0.5] + } + }, + "groups": [ + 0, + { + "name": "west", + "origin": [-2, 2, 0], + "color": 0, + "children": [1, 2] + }, + { + "name": "north", + "origin": [-2, 2, 0], + "color": 0, + "children": [3, 4] + }, + { + "name": "east", + "origin": [-2, 2, 0], + "color": 0, + "children": [5, 6] + }, + { + "name": "south", + "origin": [-2, 2, 0], + "color": 0, + "children": [7, 8] + }, + { + "name": "northwest", + "origin": [-1, 2, -1], + "color": 0, + "children": [9, 10] + }, + { + "name": "northeast", + "origin": [-1, 2, -1], + "color": 0, + "children": [11, 12] + }, + { + "name": "southeast", + "origin": [-1, 2, -1], + "color": 0, + "children": [13, 14] + }, + { + "name": "southwest", + "origin": [-1, 2, -1], + "color": 0, + "children": [15, 16] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/display_cloth/north_east.json b/src/main/resources/assets/create/models/block/display_cloth/north_east.json new file mode 100644 index 0000000000..26610fdd8a --- /dev/null +++ b/src/main/resources/assets/create/models/block/display_cloth/north_east.json @@ -0,0 +1,28 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "0": "create:block/display_cloth/red", + "particle": "create:block/display_cloth/red" + }, + "elements": [ + { + "from": [16, -11, -1], + "to": [17, 1, 0], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [9.5, 8, 10, 14], "texture": "#0"}, + "east": {"uv": [9, 8, 9.5, 14], "texture": "#0"}, + "up": {"uv": [9, 8, 9.5, 8.5], "rotation": 90, "texture": "#0"} + } + }, + { + "from": [16, -9, -1], + "to": [17, -8, 0], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "down": {"uv": [7.5, 15.5, 8, 16], "rotation": 270, "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/display_cloth/north_west.json b/src/main/resources/assets/create/models/block/display_cloth/north_west.json new file mode 100644 index 0000000000..a37e0c7ff4 --- /dev/null +++ b/src/main/resources/assets/create/models/block/display_cloth/north_west.json @@ -0,0 +1,28 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "0": "create:block/display_cloth/red", + "particle": "create:block/display_cloth/red" + }, + "elements": [ + { + "from": [-1, -11, -1], + "to": [0, 1, 0], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [9, 8, 9.5, 14], "texture": "#0"}, + "west": {"uv": [9.5, 8, 10, 14], "texture": "#0"}, + "up": {"uv": [9, 8, 9.5, 8.5], "texture": "#0"} + } + }, + { + "from": [-1, -9, -1], + "to": [0, -8, 0], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "down": {"uv": [7.5, 15.5, 8, 16], "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/display_cloth/south_east.json b/src/main/resources/assets/create/models/block/display_cloth/south_east.json new file mode 100644 index 0000000000..cd2340e3d2 --- /dev/null +++ b/src/main/resources/assets/create/models/block/display_cloth/south_east.json @@ -0,0 +1,28 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "0": "create:block/display_cloth/red", + "particle": "create:block/display_cloth/red" + }, + "elements": [ + { + "from": [16, -11, 16], + "to": [17, 1, 17], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "east": {"uv": [9.5, 8, 10, 14], "texture": "#0"}, + "south": {"uv": [9, 8, 9.5, 14], "texture": "#0"}, + "up": {"uv": [9, 8, 9.5, 8.5], "rotation": 180, "texture": "#0"} + } + }, + { + "from": [16, -9, 16], + "to": [17, -8, 17], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "down": {"uv": [7.5, 15.5, 8, 16], "rotation": 180, "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/display_cloth/south_west.json b/src/main/resources/assets/create/models/block/display_cloth/south_west.json new file mode 100644 index 0000000000..8935a922f5 --- /dev/null +++ b/src/main/resources/assets/create/models/block/display_cloth/south_west.json @@ -0,0 +1,28 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "0": "create:block/display_cloth/red", + "particle": "create:block/display_cloth/red" + }, + "elements": [ + { + "from": [-1, -11, 16], + "to": [0, 1, 17], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "south": {"uv": [9.5, 8, 10, 14], "texture": "#0"}, + "west": {"uv": [9, 8, 9.5, 14], "texture": "#0"}, + "up": {"uv": [9, 8, 9.5, 8.5], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [-1, -9, 16], + "to": [0, -8, 17], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "down": {"uv": [7.5, 15.5, 8, 16], "rotation": 90, "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/block/display_cloth/andesite.png b/src/main/resources/assets/create/textures/block/display_cloth/andesite.png new file mode 100644 index 0000000000000000000000000000000000000000..d12113f87ee301c538a958541e0615faeac72d8f GIT binary patch literal 365 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCilI0(?ST1A+q+lH)USG8|l;XDyk#<=~DLn^*Twn^;g<(A3@%5gp;_<7H}X z2~=*bQlJi`_)3EOg8w4}2G;|3P5@;%3p^r=85r~wL70&}`p;4ouMXwiucxXVc7_UO2N#vxi)KdzB%rDX-oNI)8NqJnIBa%Ymanv zOq_qw+u`sP<%|I4LgTe~DWM4fp8<*K literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/display_cloth/black.png b/src/main/resources/assets/create/textures/block/display_cloth/black.png new file mode 100644 index 0000000000000000000000000000000000000000..922327a8acc30b6f4667000fc2420496e7bff2e0 GIT binary patch literal 363 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCilg0(?ST8+CTA+sRp0KteRuW6!Tnn{Z(Olt(X44x``g=_aO9xUyB|(0{|Iq=%qy77ZfU=wg9+AZi40=i+%(&{& z-AO>f1)eUBAr}5`CwlW8R^V~rRZL*|dFHQv^sA^TRySQxC&K4|~v`wx%$zYz%bGW43R-VkZrSoG|O?xSlnESXO)n(46g zN>tQVJ>C_e#*NoA+sRp0KteRuW6!Tnn{Z(Olt(X44x``g=_aO9xUyB|(0{|Iq=%qy77ZfU=wg9+AZi40=i+%(&{& z-AO>f1)eUBAr}5`CwlW8R^V~rRZL*|dFHQv^sA^TRySQxC&K4|~v`wx%$zYz%bGW43R-VkZrSoG|O?xSlnESXO)n(46g zN>tQVJ>C_e#*Non{sU-zu9^xxkXdVN*gyMq}|wkIE- z9syLIyRWAbNb!{f`33(+1`MtT?wkP1a29w(7BevDDS|K~d-R|GK*2?xE{-7<{%-@L z`3@`aG+SM;dGU9>wexDvyO)G>{wZ)+AMx~BX`XYO-K%xWz3A6#y~U@z{@WXr8ZNQm zRKg^VS%(g57m)f8C zcH?-3$;#96m9tLxaEWd0yP|SC=4+)wZm@-G-^_r!#*8jbO$jHaZJjE;?|SV~_dl%a cbxs8``ri$8?j3rm0SXcZPgg&ebxsLQ0J@cr-T(jq literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/display_cloth/brown.png b/src/main/resources/assets/create/textures/block/display_cloth/brown.png new file mode 100644 index 0000000000000000000000000000000000000000..922327a8acc30b6f4667000fc2420496e7bff2e0 GIT binary patch literal 363 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCilg0(?ST8+CTA+sRp0KteRuW6!Tnn{Z(Olt(X44x``g=_aO9xUyB|(0{|Iq=%qy77ZfU=wg9+AZi40=i+%(&{& z-AO>f1)eUBAr}5`CwlW8R^V~rRZL*|dFHQv^sA^TRySQxC&K4|~v`wx%$zYz%bGW43R-VkZrSoG|O?xSlnESXO)n(46g zN>tQVJ>C_e#*NoGs*df1n;A;jzD;@tnIT92j%ec4v|cyij2lxEebp>%fD?^s`&pns%1y#HQ_gYznTr?eWDvQvNZTk*9mvHp1pgTe8;5Tw?N6np5**tJI_pVTn4^Qw<$6{&7D@x%~XoCufG` z@($OQuo(QwFk%fzI`i)MjGv3PUD_UUPwXnk^cAXtcS3&6QCg$h8F3+d#r)@gmmcrl h{qMj9e}><63=Z*nL5f#j?f|-$!PC{xWt~$(69C9$m4*NS literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/display_cloth/cyan.png b/src/main/resources/assets/create/textures/block/display_cloth/cyan.png new file mode 100644 index 0000000000000000000000000000000000000000..922327a8acc30b6f4667000fc2420496e7bff2e0 GIT binary patch literal 363 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/display_cloth/white.png b/src/main/resources/assets/create/textures/block/display_cloth/white.png new file mode 100644 index 0000000000000000000000000000000000000000..922327a8acc30b6f4667000fc2420496e7bff2e0 GIT binary patch literal 363 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCilg0(?ST8+CTA+sRp0KteRuW6!Tnn{Z(Olt(X44x``g=_aO9xUyB|(0{|Iq=%qy77ZfU=wg9+AZi40=i+%(&{& z-AO>f1)eUBAr}5`CwlW8R^V~rRZL*|dFHQv^sA^TRySQxC&K4|~v`wx%$zYz%bGW43R-VkZrSoG|O?xSlnESXO)n(46g zN>tQVJ>C_e#*NoA+sRp0KteRuW6!Tnn{Z(Olt(X44x``g=_aO9xUyB|(0{|Iq=%qy77ZfU=wg9+AZi40=i+%(&{& z-AO>f1)eUBAr}5`CwlW8R^V~rRZL*|dFHQv^sA^TRySQxC&K4|~v`wx%$zYz%bGW43R-VkZrSoG|O?xSlnESXO)n(46g zN>tQVJ>C_e#*No Date: Wed, 30 Oct 2024 17:51:46 +0100 Subject: [PATCH 097/515] On the shopping block - Restore old display cloth behaviour on new blocks --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 47 +- .../82992cbf8f2794d83ac94034835eac0acd7915b9 | 6 +- .../resources/assets/create/lang/en_ud.json | 2 - .../resources/assets/create/lang/en_us.json | 2 - .../create/models/item/display_cloth.json | 6 - ...h_clear.json => package_filter_clear.json} | 6 +- .../andesite_display_cloth_clear.json | 35 ++ .../logistics/black_display_cloth_clear.json | 35 ++ .../logistics/blue_display_cloth_clear.json | 35 ++ .../logistics/brass_display_cloth_clear.json | 35 ++ .../logistics/brown_display_cloth_clear.json | 35 ++ .../logistics/copper_display_cloth_clear.json | 35 ++ .../logistics/cyan_display_cloth_clear.json | 35 ++ .../logistics/gray_display_cloth_clear.json | 35 ++ .../logistics/green_display_cloth_clear.json | 35 ++ .../light_blue_display_cloth_clear.json | 35 ++ .../light_gray_display_cloth_clear.json | 35 ++ .../logistics/lime_display_cloth_clear.json | 35 ++ .../magenta_display_cloth_clear.json | 35 ++ .../logistics/orange_display_cloth_clear.json | 35 ++ .../logistics/pink_display_cloth_clear.json | 35 ++ .../logistics/purple_display_cloth_clear.json | 35 ++ .../logistics/red_display_cloth_clear.json | 35 ++ .../logistics/white_display_cloth_clear.json | 35 ++ .../logistics/yellow_display_cloth_clear.json | 35 ++ ...h_clear.json => package_filter_clear.json} | 4 +- .../andesite_display_cloth_clear.json | 12 + .../logistics/black_display_cloth_clear.json | 12 + .../logistics/blue_display_cloth_clear.json | 12 + .../logistics/brass_display_cloth_clear.json | 12 + .../logistics/brown_display_cloth_clear.json | 12 + .../logistics/copper_display_cloth_clear.json | 12 + .../logistics/cyan_display_cloth_clear.json | 12 + .../logistics/gray_display_cloth_clear.json | 12 + .../logistics/green_display_cloth_clear.json | 12 + .../light_blue_display_cloth_clear.json | 12 + .../light_gray_display_cloth_clear.json | 12 + .../logistics/lime_display_cloth_clear.json | 12 + .../magenta_display_cloth_clear.json | 12 + .../logistics/orange_display_cloth_clear.json | 12 + .../logistics/pink_display_cloth_clear.json | 12 + .../logistics/purple_display_cloth_clear.json | 12 + .../logistics/red_display_cloth_clear.json | 12 + .../logistics/white_display_cloth_clear.json | 12 + .../logistics/yellow_display_cloth_clear.json | 12 + .../tags/blocks/mineable/pickaxe.json | 6 +- .../com/simibubi/create/AllEntityTypes.java | 6 - .../java/com/simibubi/create/AllItems.java | 5 - .../java/com/simibubi/create/AllPackets.java | 6 +- .../blueprint/BlueprintOverlayRenderer.java | 4 +- .../displayCloth/DisplayClothBlock.java | 51 ++- .../displayCloth/DisplayClothBlockEntity.java | 227 ++++++++- .../displayCloth/DisplayClothBlockItem.java | 42 ++ .../DisplayClothConfigurationPacket.java | 49 ++ .../displayCloth/DisplayClothEntity.java | 433 ------------------ .../DisplayClothEntityRenderer.java | 71 --- .../displayCloth/DisplayClothItem.java | 78 ---- .../DisplayClothOverlayRenderer.java | 46 +- .../displayCloth/DisplayClothPacket.java | 35 -- .../DisplayClothPacketToClient.java | 35 -- .../DisplayClothPacketToServer.java | 36 -- .../displayCloth/DisplayClothPricingMenu.java | 32 +- .../displayCloth/ShoppingListItem.java | 11 +- .../redstoneRequester/AutoRequestData.java | 2 +- .../RedstoneRequesterBlock.java | 16 +- .../StockTickerInteractionHandler.java | 3 +- .../foundation/data/BuilderTransformers.java | 9 +- .../data/recipe/StandardRecipeGen.java | 2 +- 68 files changed, 1383 insertions(+), 788 deletions(-) delete mode 100644 src/generated/resources/assets/create/models/item/display_cloth.json rename src/generated/resources/data/create/advancements/recipes/misc/crafting/appliances/{display_cloth_clear.json => package_filter_clear.json} (76%) create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/andesite_display_cloth_clear.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/black_display_cloth_clear.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/blue_display_cloth_clear.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/brass_display_cloth_clear.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/brown_display_cloth_clear.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/copper_display_cloth_clear.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/cyan_display_cloth_clear.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/gray_display_cloth_clear.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/green_display_cloth_clear.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/light_blue_display_cloth_clear.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/light_gray_display_cloth_clear.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/lime_display_cloth_clear.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/magenta_display_cloth_clear.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/orange_display_cloth_clear.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/pink_display_cloth_clear.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/purple_display_cloth_clear.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/red_display_cloth_clear.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/white_display_cloth_clear.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/yellow_display_cloth_clear.json rename src/generated/resources/data/create/recipes/crafting/appliances/{display_cloth_clear.json => package_filter_clear.json} (62%) create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/andesite_display_cloth_clear.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/black_display_cloth_clear.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/blue_display_cloth_clear.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/brass_display_cloth_clear.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/brown_display_cloth_clear.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/copper_display_cloth_clear.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/cyan_display_cloth_clear.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/gray_display_cloth_clear.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/green_display_cloth_clear.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/light_blue_display_cloth_clear.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/light_gray_display_cloth_clear.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/lime_display_cloth_clear.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/magenta_display_cloth_clear.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/orange_display_cloth_clear.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/pink_display_cloth_clear.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/purple_display_cloth_clear.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/red_display_cloth_clear.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/white_display_cloth_clear.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/yellow_display_cloth_clear.json create mode 100644 src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothBlockItem.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothConfigurationPacket.java delete mode 100644 src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothEntity.java delete mode 100644 src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothEntityRenderer.java delete mode 100644 src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothItem.java delete mode 100644 src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothPacket.java delete mode 100644 src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothPacketToClient.java delete mode 100644 src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothPacketToServer.java diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 705596518c..906e375b04 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-10-30T11:53:14.6383606 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-10-30T15:58:08.5505451 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -632,8 +632,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -97bb7346fb696215f1c02603afc54d204d8359bc assets/create/lang/en_ud.json -d4dcb6c999fce54a6006b881c2d10c867f41df4e assets/create/lang/en_us.json +6885a6111e0210232c89fff56c4d84df726da208 assets/create/lang/en_ud.json +619639ca62c53ed3eb39ca17da639c31bdb4b38d assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -2017,7 +2017,6 @@ aa44d681c3ccffe08aedbda093062b1a5ab3302e assets/create/models/item/depot.json 63e24083922af9d5300aea771bb63bb9962ba3e6 assets/create/models/item/desk_bell.json 85a5830ca034be9a0ed534186210aa975278b20b assets/create/models/item/diorite_pillar.json 2a992f0961b8bab5628e075da413c91e903e424c assets/create/models/item/display_board.json -e71e3c355c4a9266e359e88278b238e38f15d9ea assets/create/models/item/display_cloth.json 0dd4d33644c9ec7dbf920d7fd7b713e4b413b330 assets/create/models/item/display_link.json eb750000addd1c25e79fc9fb277ccdcc3274852c assets/create/models/item/dough.json 5803643723c0aa65d6c531c1f9798556cd36d21a assets/create/models/item/dripstone_pillar.json @@ -3090,6 +3089,25 @@ c96b1b147139c9d560e9d1e1dd9a726ebb771329 data/create/advancements/recipes/misc/c 004b31d1be78dbc4be60f4fd0879065f1a685518 data/create/advancements/recipes/misc/crafting/kinetics/red_valve_handle_from_other_valve_handle.json cf2920d4d27c40fe71dd8954225e7f2a38ba2a4f data/create/advancements/recipes/misc/crafting/kinetics/white_valve_handle_from_other_valve_handle.json 54bf51dcbdd86635e68d366cb4130f65b9c0fe4a data/create/advancements/recipes/misc/crafting/kinetics/yellow_valve_handle_from_other_valve_handle.json +a501bbd0abff4598f34d495eeffd94613c0064d5 data/create/advancements/recipes/misc/crafting/logistics/andesite_display_cloth_clear.json +c00e4c692567f91c5ef380e90b12d32736054b90 data/create/advancements/recipes/misc/crafting/logistics/black_display_cloth_clear.json +33b76b320e6616a1fafa9ffd657a0fcd9e440020 data/create/advancements/recipes/misc/crafting/logistics/blue_display_cloth_clear.json +019e153032c23d084c0ba895f7cbb3cbcca22244 data/create/advancements/recipes/misc/crafting/logistics/brass_display_cloth_clear.json +d32efca29bad2187e1e85e70151a3e1618515bfd data/create/advancements/recipes/misc/crafting/logistics/brown_display_cloth_clear.json +66c9b974fe53972fd5b21cf9caf2cade2c90f139 data/create/advancements/recipes/misc/crafting/logistics/copper_display_cloth_clear.json +2198a82b90ff0a36a26e07bdd0059a7c17f03a58 data/create/advancements/recipes/misc/crafting/logistics/cyan_display_cloth_clear.json +f52574e38859c3c127bc494d0f3cd24a9bba51d3 data/create/advancements/recipes/misc/crafting/logistics/gray_display_cloth_clear.json +a96284d88f49031789673218944bb75101b61f04 data/create/advancements/recipes/misc/crafting/logistics/green_display_cloth_clear.json +d911ec729abbb1156147b4d2c98b6b7af5123ce2 data/create/advancements/recipes/misc/crafting/logistics/light_blue_display_cloth_clear.json +3f6cb7e6fecf4eedbe2eac017490975ac656dddf data/create/advancements/recipes/misc/crafting/logistics/light_gray_display_cloth_clear.json +c270d53142e7b20c0046fc4f13049df167ac6243 data/create/advancements/recipes/misc/crafting/logistics/lime_display_cloth_clear.json +af8e9d0c3089d353ac5248a168d898f7cf9ee32e data/create/advancements/recipes/misc/crafting/logistics/magenta_display_cloth_clear.json +6997ad3851e60d99f1101b4e6e73b926feb1643e data/create/advancements/recipes/misc/crafting/logistics/orange_display_cloth_clear.json +ff3fb1fecfb2a8160c7886a6eeadd51bb1a82e62 data/create/advancements/recipes/misc/crafting/logistics/pink_display_cloth_clear.json +44ba6084e51437f569c2224efdc47fced328cc2b data/create/advancements/recipes/misc/crafting/logistics/purple_display_cloth_clear.json +b1422a67e7f922c999dd0415ec2492812b3242bd data/create/advancements/recipes/misc/crafting/logistics/red_display_cloth_clear.json +1a4df897a12d2fb167158ad9e60673cb6c528c2f data/create/advancements/recipes/misc/crafting/logistics/white_display_cloth_clear.json +bb7e5808222945e6cc8363f6c97602ef6368ab84 data/create/advancements/recipes/misc/crafting/logistics/yellow_display_cloth_clear.json 706a4da01ddbd9c3db4d3183ffdcd602a558a5cd data/create/loot_tables/blocks/acacia_window.json a7b37cec417ec9f9095e2ae11c990e4906d6af0e data/create/loot_tables/blocks/acacia_window_pane.json 5eee4b2702e432e03b1f46c6f1573ceee67b131f data/create/loot_tables/blocks/adjustable_chain_gearshift.json @@ -3823,6 +3841,25 @@ b04c1cebcfbcf44c4ced04252f54dbfeb8f9ff12 data/create/recipes/crafting/kinetics/w 48c9e3b9f5a8a0f598ab0f57cd8936724337bf1f data/create/recipes/crafting/kinetics/yellow_seat.json 75633a46c374230fab4096a45628b42d6012627d data/create/recipes/crafting/kinetics/yellow_seat_from_other_seat.json 2be097bb4f1e47a6b3a4a6f0ef222dffe31a1e22 data/create/recipes/crafting/kinetics/yellow_valve_handle_from_other_valve_handle.json +71f4965e15eb26147dc40956e91e08d1ef06a21a data/create/recipes/crafting/logistics/andesite_display_cloth_clear.json +82ba5c0a85e81cebce21659ede405a746756f1e2 data/create/recipes/crafting/logistics/black_display_cloth_clear.json +7816be94db3c463af44159458bf27aab678e6100 data/create/recipes/crafting/logistics/blue_display_cloth_clear.json +01518769395fc7abe47a9ff12c68ca3b30b68e04 data/create/recipes/crafting/logistics/brass_display_cloth_clear.json +ce28b0be98db49bc5fe89d731e4db996efe1fe88 data/create/recipes/crafting/logistics/brown_display_cloth_clear.json +5135b71f945a983e6db42c70f4d189a9f592643e data/create/recipes/crafting/logistics/copper_display_cloth_clear.json +5b7939c63ad42eab794684719f10483cec58bc52 data/create/recipes/crafting/logistics/cyan_display_cloth_clear.json +1078d48b6c7f16c891d69ed594ec41a3ba8929a2 data/create/recipes/crafting/logistics/gray_display_cloth_clear.json +5ca021d16b79c3fa4acb71c9b79abbdd36ad59ae data/create/recipes/crafting/logistics/green_display_cloth_clear.json +e5ab1348ccb2a9365f5943b88d8cffe2d7071a74 data/create/recipes/crafting/logistics/light_blue_display_cloth_clear.json +c902db7f0ff484d6a7889eacf04f2b959bdab3c2 data/create/recipes/crafting/logistics/light_gray_display_cloth_clear.json +1d8cfcef76a8790077237402b988796d9d97c925 data/create/recipes/crafting/logistics/lime_display_cloth_clear.json +d0499cf74efc8dd7d05c3850f91ce160b4a955bc data/create/recipes/crafting/logistics/magenta_display_cloth_clear.json +5a3b9155cc4cb3740bd77ceb549b48262ee3cc7a data/create/recipes/crafting/logistics/orange_display_cloth_clear.json +c8b24e9c30de8ebb5f3fd310ff077a40bfc1e80c data/create/recipes/crafting/logistics/pink_display_cloth_clear.json +a9ff41f876867767ad4c9220d9a39d1edc656c82 data/create/recipes/crafting/logistics/purple_display_cloth_clear.json +6e0e19929c5ef41bf904561791eabf3eae9d47fa data/create/recipes/crafting/logistics/red_display_cloth_clear.json +00419f83d19d15f39cdf8b8b50695016043fcd0f data/create/recipes/crafting/logistics/white_display_cloth_clear.json +d382e3818b79a3911555d371c86b8b8f923df682 data/create/recipes/crafting/logistics/yellow_display_cloth_clear.json 44a59669177a5a1b0b0eb7cb3dd46826311f4dfe data/create/recipes/crimsite_from_stone_types_crimsite_stonecutting.json c3f4fd2206f3885904913289761f2b8b758e4c95 data/create/recipes/crimsite_pillar_from_stone_types_crimsite_stonecutting.json e1815f97fbc2786d77f5378a2696e36050d8a1fd data/create/recipes/crimson_window.json @@ -4501,7 +4538,7 @@ c741ba83b562ae3459d7c4f2db69537f549ea411 data/forge/tags/items/tools/wrench.json e3321ff14704c031a2c16953b7e391f4f24dd70b data/minecraft/tags/blocks/impermeable.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/lush_ground_replaceable.json 4cf669239caa93951fd8e243a03e9157d2d06208 data/minecraft/tags/blocks/mineable/axe.json -1c9329be842d22db88e68486bc6fe64aefd9d3b7 data/minecraft/tags/blocks/mineable/pickaxe.json +f816879274e6f561b67f460358e77f6084390d77 data/minecraft/tags/blocks/mineable/pickaxe.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/moss_replaceable.json 0c13aae0eeb99e89febe8dbe5e002af2ff843a9e data/minecraft/tags/blocks/needs_iron_tool.json 3cb2a92cbdf32ed5978f740dc378d363306c3e84 data/minecraft/tags/blocks/needs_stone_tool.json diff --git a/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 b/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 index 300825713c..9561427a32 100644 --- a/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 +++ b/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 @@ -1,4 +1,4 @@ -// 1.20.1 2024-10-24T13:00:33.3172448 Create's Standard Recipes +// 1.20.1 2024-10-30T15:58:08.6667432 Create's Standard Recipes a8cc4af26f6c7c45a9eef12e92af1452fe042454 data/create/advancements/recipes/combat/crafting/appliances/netherite_backtank.json 2c2639c7b307ee7c7a4e97e5efebf496788998ad data/create/advancements/recipes/combat/crafting/appliances/netherite_backtank_from_netherite.json 81dcf0cb1aa99e39bc7d1a386e07cad4cee7d8b9 data/create/advancements/recipes/combat/crafting/appliances/netherite_diving_boots.json @@ -45,12 +45,12 @@ dd3d469cc9899f3f7299cbd6903a2b541df5c7ff data/create/advancements/recipes/misc/c 029e463d5eea7ae590577fdfab52664036727985 data/create/advancements/recipes/misc/crafting/appliances/copper_diving_boots.json 5d5b4c49e81090a48c23314c49815f61ac170518 data/create/advancements/recipes/misc/crafting/appliances/copper_diving_helmet.json 0746cb63e224d7620e781e1494b9a8b9d56b186b data/create/advancements/recipes/misc/crafting/appliances/crafting_blueprint.json -4bd1ab25286d5a9dce7cafd1f814113f21a6969d data/create/advancements/recipes/misc/crafting/appliances/display_cloth_clear.json c4d0901541855ea2fda0cef7f0270edfa16d70e2 data/create/advancements/recipes/misc/crafting/appliances/dough.json 79b6501f8cb069dc55b78871a5fecf40a5b3dbd5 data/create/advancements/recipes/misc/crafting/appliances/filter_clear.json 37ad1d645de355b261b9bb6b611bd136723233b7 data/create/advancements/recipes/misc/crafting/appliances/item_frame.json 3271ad36fbab51d87d0baad8c69cb7b2add506b8 data/create/advancements/recipes/misc/crafting/appliances/linked_controller.json 54ed96f8c7d040058e5e682d68279d197b08e5e1 data/create/advancements/recipes/misc/crafting/appliances/name_tag.json +9ce5a607b16146339de77128aec3747f8054d03b data/create/advancements/recipes/misc/crafting/appliances/package_filter_clear.json d4d13730d982713b5809ecf30187e01707248d75 data/create/advancements/recipes/misc/crafting/appliances/schedule_clear.json 44c1a131bed101ad4b87d57816ff5a375cc36bf4 data/create/advancements/recipes/misc/crafting/appliances/slime_ball.json 7d0fa7ac8a04b19cd3db31342e276d2da4860a1d data/create/advancements/recipes/misc/crafting/appliances/tree_fertilizer.json @@ -300,7 +300,6 @@ efbfccade226b34d22abb77138dab8726725752e data/create/recipes/crafting/appliances c500139f545fea4568575b93b1ab9e56f004f137 data/create/recipes/crafting/appliances/copper_diving_boots.json 77b28e10fcbe223f8235b193e899046b382382c9 data/create/recipes/crafting/appliances/copper_diving_helmet.json 3e3f71d579ec7453e453d5b65aaee3c43169b679 data/create/recipes/crafting/appliances/crafting_blueprint.json -4516e2c533f753f9d3802ae3c9c1400866ad3a31 data/create/recipes/crafting/appliances/display_cloth_clear.json b7c8f3c5e80749c6c38d5c0153dc68a79c32535f data/create/recipes/crafting/appliances/dough.json 409b5d70ee1ef9164c327d79472e6d66ce55dec6 data/create/recipes/crafting/appliances/filter_clear.json 854f7efc8724f733ed7f4ac08c1d252cf949512d data/create/recipes/crafting/appliances/item_frame.json @@ -312,6 +311,7 @@ b5b29558d4efe161f6edaeae2c449735d46261ca data/create/recipes/crafting/appliances 5a6d3e59e8fa623b147600cae7065e22af9c2cbf data/create/recipes/crafting/appliances/netherite_diving_boots_from_netherite.json 5eae779a8c16a4efb8fa61996c608bc44c55da7f data/create/recipes/crafting/appliances/netherite_diving_helmet.json 26eec27acd056e62510bc831cc6e6823a45c51b8 data/create/recipes/crafting/appliances/netherite_diving_helmet_from_netherite.json +bbf63119e3ee54afd49fe2ccfe2c06baaa9f6f41 data/create/recipes/crafting/appliances/package_filter_clear.json 0b83c52c90948141e5807b7d1243fb5d48d4c998 data/create/recipes/crafting/appliances/schedule_clear.json 05e4700f7fd59029ba19bcfb7b49fd3a30a93cad data/create/recipes/crafting/appliances/slime_ball.json d0bad974476c54315e4b656c67dbf6165d183bbc data/create/recipes/crafting/appliances/tree_fertilizer.json diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index cbc277d0a3..de6911bec5 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -2786,7 +2786,6 @@ "entity.create.carriage_contraption": "uoıʇdɐɹʇuoƆ ǝbɐıɹɹɐƆ", "entity.create.contraption": "uoıʇdɐɹʇuoƆ", "entity.create.crafting_blueprint": "ʇuıɹdǝnןᗺ buıʇɟɐɹƆ", - "entity.create.display_cloth": "ɥʇoןƆ ʎɐןdsıᗡ", "entity.create.gantry_contraption": "uoıʇdɐɹʇuoƆ ʎɹʇuɐ⅁", "entity.create.package": "ǝbɐʞɔɐԀ", "entity.create.potato_projectile": "ǝןıʇɔǝظoɹԀ oʇɐʇoԀ", @@ -2870,7 +2869,6 @@ "item.create.crushed_raw_tin": "uı⟘ ʍɐᴚ pǝɥsnɹƆ", "item.create.crushed_raw_uranium": "ɯnıuɐɹ∩ ʍɐᴚ pǝɥsnɹƆ", "item.create.crushed_raw_zinc": "ɔuıZ ʍɐᴚ pǝɥsnɹƆ", - "item.create.display_cloth": "ɥʇoןƆ ʎɐןdsıᗡ", "item.create.dough": "ɥbnoᗡ", "item.create.electron_tube": "ǝqn⟘ uoɹʇɔǝןƎ", "item.create.empty_blaze_burner": "ɹǝuɹnᗺ ǝzɐןᗺ ʎʇdɯƎ", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index ae1193e858..c3dbc19298 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -2786,7 +2786,6 @@ "entity.create.carriage_contraption": "Carriage Contraption", "entity.create.contraption": "Contraption", "entity.create.crafting_blueprint": "Crafting Blueprint", - "entity.create.display_cloth": "Display Cloth", "entity.create.gantry_contraption": "Gantry Contraption", "entity.create.package": "Package", "entity.create.potato_projectile": "Potato Projectile", @@ -2870,7 +2869,6 @@ "item.create.crushed_raw_tin": "Crushed Raw Tin", "item.create.crushed_raw_uranium": "Crushed Raw Uranium", "item.create.crushed_raw_zinc": "Crushed Raw Zinc", - "item.create.display_cloth": "Display Cloth", "item.create.dough": "Dough", "item.create.electron_tube": "Electron Tube", "item.create.empty_blaze_burner": "Empty Blaze Burner", diff --git a/src/generated/resources/assets/create/models/item/display_cloth.json b/src/generated/resources/assets/create/models/item/display_cloth.json deleted file mode 100644 index 5bf793fcfa..0000000000 --- a/src/generated/resources/assets/create/models/item/display_cloth.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "create:item/display_cloth" - } -} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/appliances/display_cloth_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/appliances/package_filter_clear.json similarity index 76% rename from src/generated/resources/data/create/advancements/recipes/misc/crafting/appliances/display_cloth_clear.json rename to src/generated/resources/data/create/advancements/recipes/misc/crafting/appliances/package_filter_clear.json index 127c754882..a7f5838c8e 100644 --- a/src/generated/resources/data/create/advancements/recipes/misc/crafting/appliances/display_cloth_clear.json +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/appliances/package_filter_clear.json @@ -6,7 +6,7 @@ "items": [ { "items": [ - "create:display_cloth" + "create:package_filter" ] } ] @@ -15,7 +15,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "create:crafting/appliances/display_cloth_clear" + "recipe": "create:crafting/appliances/package_filter_clear" }, "trigger": "minecraft:recipe_unlocked" } @@ -28,7 +28,7 @@ ], "rewards": { "recipes": [ - "create:crafting/appliances/display_cloth_clear" + "create:crafting/appliances/package_filter_clear" ] }, "sends_telemetry_event": false diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/andesite_display_cloth_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/andesite_display_cloth_clear.json new file mode 100644 index 0000000000..86c211c770 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/andesite_display_cloth_clear.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_andesite_display_cloth": { + "conditions": { + "items": [ + { + "items": [ + "create:andesite_display_cloth" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/andesite_display_cloth_clear" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_andesite_display_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/andesite_display_cloth_clear" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/black_display_cloth_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/black_display_cloth_clear.json new file mode 100644 index 0000000000..3eb81cee9d --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/black_display_cloth_clear.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_black_display_cloth": { + "conditions": { + "items": [ + { + "items": [ + "create:black_display_cloth" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/black_display_cloth_clear" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_black_display_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/black_display_cloth_clear" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/blue_display_cloth_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/blue_display_cloth_clear.json new file mode 100644 index 0000000000..e81088e36e --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/blue_display_cloth_clear.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_blue_display_cloth": { + "conditions": { + "items": [ + { + "items": [ + "create:blue_display_cloth" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/blue_display_cloth_clear" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_blue_display_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/blue_display_cloth_clear" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/brass_display_cloth_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/brass_display_cloth_clear.json new file mode 100644 index 0000000000..7729f2062c --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/brass_display_cloth_clear.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_brass_display_cloth": { + "conditions": { + "items": [ + { + "items": [ + "create:brass_display_cloth" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/brass_display_cloth_clear" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_brass_display_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/brass_display_cloth_clear" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/brown_display_cloth_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/brown_display_cloth_clear.json new file mode 100644 index 0000000000..32da213a8c --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/brown_display_cloth_clear.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_brown_display_cloth": { + "conditions": { + "items": [ + { + "items": [ + "create:brown_display_cloth" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/brown_display_cloth_clear" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_brown_display_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/brown_display_cloth_clear" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/copper_display_cloth_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/copper_display_cloth_clear.json new file mode 100644 index 0000000000..d69d15a7fb --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/copper_display_cloth_clear.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_copper_display_cloth": { + "conditions": { + "items": [ + { + "items": [ + "create:copper_display_cloth" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/copper_display_cloth_clear" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_copper_display_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/copper_display_cloth_clear" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/cyan_display_cloth_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/cyan_display_cloth_clear.json new file mode 100644 index 0000000000..158fe29580 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/cyan_display_cloth_clear.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cyan_display_cloth": { + "conditions": { + "items": [ + { + "items": [ + "create:cyan_display_cloth" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/cyan_display_cloth_clear" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cyan_display_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/cyan_display_cloth_clear" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/gray_display_cloth_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/gray_display_cloth_clear.json new file mode 100644 index 0000000000..20f6f29660 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/gray_display_cloth_clear.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_gray_display_cloth": { + "conditions": { + "items": [ + { + "items": [ + "create:gray_display_cloth" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/gray_display_cloth_clear" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_gray_display_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/gray_display_cloth_clear" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/green_display_cloth_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/green_display_cloth_clear.json new file mode 100644 index 0000000000..05a1bff75d --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/green_display_cloth_clear.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_green_display_cloth": { + "conditions": { + "items": [ + { + "items": [ + "create:green_display_cloth" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/green_display_cloth_clear" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_green_display_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/green_display_cloth_clear" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/light_blue_display_cloth_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/light_blue_display_cloth_clear.json new file mode 100644 index 0000000000..d70b8537e5 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/light_blue_display_cloth_clear.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_light_blue_display_cloth": { + "conditions": { + "items": [ + { + "items": [ + "create:light_blue_display_cloth" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/light_blue_display_cloth_clear" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_light_blue_display_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/light_blue_display_cloth_clear" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/light_gray_display_cloth_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/light_gray_display_cloth_clear.json new file mode 100644 index 0000000000..040e1e283c --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/light_gray_display_cloth_clear.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_light_gray_display_cloth": { + "conditions": { + "items": [ + { + "items": [ + "create:light_gray_display_cloth" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/light_gray_display_cloth_clear" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_light_gray_display_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/light_gray_display_cloth_clear" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/lime_display_cloth_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/lime_display_cloth_clear.json new file mode 100644 index 0000000000..1d189e6402 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/lime_display_cloth_clear.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_lime_display_cloth": { + "conditions": { + "items": [ + { + "items": [ + "create:lime_display_cloth" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/lime_display_cloth_clear" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_lime_display_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/lime_display_cloth_clear" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/magenta_display_cloth_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/magenta_display_cloth_clear.json new file mode 100644 index 0000000000..e753652b05 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/magenta_display_cloth_clear.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_magenta_display_cloth": { + "conditions": { + "items": [ + { + "items": [ + "create:magenta_display_cloth" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/magenta_display_cloth_clear" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_magenta_display_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/magenta_display_cloth_clear" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/orange_display_cloth_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/orange_display_cloth_clear.json new file mode 100644 index 0000000000..0145f1f8f3 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/orange_display_cloth_clear.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_orange_display_cloth": { + "conditions": { + "items": [ + { + "items": [ + "create:orange_display_cloth" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/orange_display_cloth_clear" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_orange_display_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/orange_display_cloth_clear" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/pink_display_cloth_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/pink_display_cloth_clear.json new file mode 100644 index 0000000000..491cb4a3bc --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/pink_display_cloth_clear.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_pink_display_cloth": { + "conditions": { + "items": [ + { + "items": [ + "create:pink_display_cloth" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/pink_display_cloth_clear" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_pink_display_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/pink_display_cloth_clear" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/purple_display_cloth_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/purple_display_cloth_clear.json new file mode 100644 index 0000000000..68c0c1a7b3 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/purple_display_cloth_clear.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_purple_display_cloth": { + "conditions": { + "items": [ + { + "items": [ + "create:purple_display_cloth" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/purple_display_cloth_clear" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_purple_display_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/purple_display_cloth_clear" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/red_display_cloth_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/red_display_cloth_clear.json new file mode 100644 index 0000000000..ea469a34a5 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/red_display_cloth_clear.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_red_display_cloth": { + "conditions": { + "items": [ + { + "items": [ + "create:red_display_cloth" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/red_display_cloth_clear" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_red_display_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/red_display_cloth_clear" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/white_display_cloth_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/white_display_cloth_clear.json new file mode 100644 index 0000000000..f496913211 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/white_display_cloth_clear.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/white_display_cloth_clear" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_white_display_cloth": { + "conditions": { + "items": [ + { + "items": [ + "create:white_display_cloth" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_white_display_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/white_display_cloth_clear" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/yellow_display_cloth_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/yellow_display_cloth_clear.json new file mode 100644 index 0000000000..7c2dd1f190 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/yellow_display_cloth_clear.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/yellow_display_cloth_clear" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_yellow_display_cloth": { + "conditions": { + "items": [ + { + "items": [ + "create:yellow_display_cloth" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_yellow_display_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/yellow_display_cloth_clear" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/appliances/display_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/appliances/package_filter_clear.json similarity index 62% rename from src/generated/resources/data/create/recipes/crafting/appliances/display_cloth_clear.json rename to src/generated/resources/data/create/recipes/crafting/appliances/package_filter_clear.json index a95acabe3d..84869a32f6 100644 --- a/src/generated/resources/data/create/recipes/crafting/appliances/display_cloth_clear.json +++ b/src/generated/resources/data/create/recipes/crafting/appliances/package_filter_clear.json @@ -3,10 +3,10 @@ "category": "misc", "ingredients": [ { - "item": "create:display_cloth" + "item": "create:package_filter" } ], "result": { - "item": "create:display_cloth" + "item": "create:package_filter" } } \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/andesite_display_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/andesite_display_cloth_clear.json new file mode 100644 index 0000000000..8b82fdb751 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/andesite_display_cloth_clear.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "create:andesite_display_cloth" + } + ], + "result": { + "item": "create:andesite_display_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/black_display_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/black_display_cloth_clear.json new file mode 100644 index 0000000000..5afcddb78d --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/black_display_cloth_clear.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "create:black_display_cloth" + } + ], + "result": { + "item": "create:black_display_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/blue_display_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/blue_display_cloth_clear.json new file mode 100644 index 0000000000..ac50b05228 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/blue_display_cloth_clear.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "create:blue_display_cloth" + } + ], + "result": { + "item": "create:blue_display_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/brass_display_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/brass_display_cloth_clear.json new file mode 100644 index 0000000000..f6255c9412 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/brass_display_cloth_clear.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "create:brass_display_cloth" + } + ], + "result": { + "item": "create:brass_display_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/brown_display_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/brown_display_cloth_clear.json new file mode 100644 index 0000000000..241edc37a0 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/brown_display_cloth_clear.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "create:brown_display_cloth" + } + ], + "result": { + "item": "create:brown_display_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/copper_display_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/copper_display_cloth_clear.json new file mode 100644 index 0000000000..9bc05b0179 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/copper_display_cloth_clear.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "create:copper_display_cloth" + } + ], + "result": { + "item": "create:copper_display_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/cyan_display_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/cyan_display_cloth_clear.json new file mode 100644 index 0000000000..f554283e14 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/cyan_display_cloth_clear.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "create:cyan_display_cloth" + } + ], + "result": { + "item": "create:cyan_display_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/gray_display_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/gray_display_cloth_clear.json new file mode 100644 index 0000000000..3135ef4869 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/gray_display_cloth_clear.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "create:gray_display_cloth" + } + ], + "result": { + "item": "create:gray_display_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/green_display_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/green_display_cloth_clear.json new file mode 100644 index 0000000000..444005f84a --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/green_display_cloth_clear.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "create:green_display_cloth" + } + ], + "result": { + "item": "create:green_display_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/light_blue_display_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/light_blue_display_cloth_clear.json new file mode 100644 index 0000000000..52ef7f71a7 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/light_blue_display_cloth_clear.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "create:light_blue_display_cloth" + } + ], + "result": { + "item": "create:light_blue_display_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/light_gray_display_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/light_gray_display_cloth_clear.json new file mode 100644 index 0000000000..31333780a9 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/light_gray_display_cloth_clear.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "create:light_gray_display_cloth" + } + ], + "result": { + "item": "create:light_gray_display_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/lime_display_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/lime_display_cloth_clear.json new file mode 100644 index 0000000000..88e6129ddc --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/lime_display_cloth_clear.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "create:lime_display_cloth" + } + ], + "result": { + "item": "create:lime_display_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/magenta_display_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/magenta_display_cloth_clear.json new file mode 100644 index 0000000000..6915f14279 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/magenta_display_cloth_clear.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "create:magenta_display_cloth" + } + ], + "result": { + "item": "create:magenta_display_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/orange_display_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/orange_display_cloth_clear.json new file mode 100644 index 0000000000..809509582a --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/orange_display_cloth_clear.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "create:orange_display_cloth" + } + ], + "result": { + "item": "create:orange_display_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/pink_display_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/pink_display_cloth_clear.json new file mode 100644 index 0000000000..affc56fd10 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/pink_display_cloth_clear.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "create:pink_display_cloth" + } + ], + "result": { + "item": "create:pink_display_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/purple_display_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/purple_display_cloth_clear.json new file mode 100644 index 0000000000..21b206c49e --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/purple_display_cloth_clear.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "create:purple_display_cloth" + } + ], + "result": { + "item": "create:purple_display_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/red_display_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/red_display_cloth_clear.json new file mode 100644 index 0000000000..8cf2651fe2 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/red_display_cloth_clear.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "create:red_display_cloth" + } + ], + "result": { + "item": "create:red_display_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/white_display_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/white_display_cloth_clear.json new file mode 100644 index 0000000000..8d0979f17d --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/white_display_cloth_clear.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "create:white_display_cloth" + } + ], + "result": { + "item": "create:white_display_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/yellow_display_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/yellow_display_cloth_clear.json new file mode 100644 index 0000000000..b6a8e7b247 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/yellow_display_cloth_clear.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "create:yellow_display_cloth" + } + ], + "result": { + "item": "create:yellow_display_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json index d9837a5299..b928713753 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json @@ -125,13 +125,13 @@ "create:item_hatch", "create:packager", "create:package_frogport", - "create:andesite_display_cloth", - "create:brass_display_cloth", - "create:copper_display_cloth", "create:packager_link", "create:stock_ticker", "create:redstone_requester", "create:factory_panel", + "create:andesite_display_cloth", + "create:brass_display_cloth", + "create:copper_display_cloth", "create:andesite_funnel", "create:andesite_belt_funnel", "create:brass_funnel", diff --git a/src/main/java/com/simibubi/create/AllEntityTypes.java b/src/main/java/com/simibubi/create/AllEntityTypes.java index 3784dbb315..30984943e8 100644 --- a/src/main/java/com/simibubi/create/AllEntityTypes.java +++ b/src/main/java/com/simibubi/create/AllEntityTypes.java @@ -16,8 +16,6 @@ import com.simibubi.create.content.equipment.potatoCannon.PotatoProjectileEntity import com.simibubi.create.content.equipment.potatoCannon.PotatoProjectileRenderer; import com.simibubi.create.content.logistics.box.PackageEntity; import com.simibubi.create.content.logistics.box.PackageRenderer; -import com.simibubi.create.content.logistics.displayCloth.DisplayClothEntity; -import com.simibubi.create.content.logistics.displayCloth.DisplayClothEntityRenderer; import com.simibubi.create.content.trains.entity.CarriageContraptionEntity; import com.simibubi.create.content.trains.entity.CarriageContraptionEntityRenderer; import com.simibubi.create.content.trains.entity.CarriageContraptionVisual; @@ -64,10 +62,6 @@ public class AllEntityTypes { public static final EntityEntry CRAFTING_BLUEPRINT = register("crafting_blueprint", BlueprintEntity::new, () -> BlueprintRenderer::new, MobCategory.MISC, 10, Integer.MAX_VALUE, false, true, BlueprintEntity::build).register(); - - public static final EntityEntry DISPLAY_CLOTH = - register("display_cloth", DisplayClothEntity::new, () -> DisplayClothEntityRenderer::new, MobCategory.MISC, 10, - Integer.MAX_VALUE, false, true, DisplayClothEntity::build).register(); public static final EntityEntry POTATO_PROJECTILE = register("potato_projectile", PotatoProjectileEntity::new, () -> PotatoProjectileRenderer::new, diff --git a/src/main/java/com/simibubi/create/AllItems.java b/src/main/java/com/simibubi/create/AllItems.java index 582b25abc2..1f0d95165c 100644 --- a/src/main/java/com/simibubi/create/AllItems.java +++ b/src/main/java/com/simibubi/create/AllItems.java @@ -45,7 +45,6 @@ import com.simibubi.create.content.legacy.ChromaticCompoundItem; import com.simibubi.create.content.legacy.RefinedRadianceItem; import com.simibubi.create.content.legacy.ShadowSteelItem; import com.simibubi.create.content.logistics.box.PackageItem; -import com.simibubi.create.content.logistics.displayCloth.DisplayClothItem; import com.simibubi.create.content.logistics.displayCloth.ShoppingListItem; import com.simibubi.create.content.logistics.filter.FilterItem; import com.simibubi.create.content.materials.ExperienceNuggetItem; @@ -239,10 +238,6 @@ public class AllItems { public static final ItemEntry CRAFTING_BLUEPRINT = REGISTRATE.item("crafting_blueprint", BlueprintItem::new) .register(); - - public static final ItemEntry DISPLAY_CLOTH = - REGISTRATE.item("display_cloth", DisplayClothItem::new) - .register(); // wrapped by COPPER_BACKTANK for block placement uses. // must be registered as of 1.18.2 diff --git a/src/main/java/com/simibubi/create/AllPackets.java b/src/main/java/com/simibubi/create/AllPackets.java index 3dacfe2e32..9c2d1cccf0 100644 --- a/src/main/java/com/simibubi/create/AllPackets.java +++ b/src/main/java/com/simibubi/create/AllPackets.java @@ -60,8 +60,7 @@ import com.simibubi.create.content.logistics.depot.EjectorAwardPacket; import com.simibubi.create.content.logistics.depot.EjectorElytraPacket; import com.simibubi.create.content.logistics.depot.EjectorPlacementPacket; import com.simibubi.create.content.logistics.depot.EjectorTriggerPacket; -import com.simibubi.create.content.logistics.displayCloth.DisplayClothPacketToClient; -import com.simibubi.create.content.logistics.displayCloth.DisplayClothPacketToServer; +import com.simibubi.create.content.logistics.displayCloth.DisplayClothConfigurationPacket; import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelConfigurationPacket; import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelConnectionPacket; import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelEffectPacket; @@ -192,7 +191,7 @@ public enum AllPackets { CHAIN_CONVEYOR_CONNECT(ChainConveyorConnectionPacket.class, ChainConveyorConnectionPacket::new, PLAY_TO_SERVER), CHAIN_CONVEYOR_RIDING(ChainConveyorRidingPacket.class, ChainConveyorRidingPacket::new, PLAY_TO_SERVER), CHAIN_PACKAGE_INTERACTION(ChainPackageInteractionPacket.class, ChainPackageInteractionPacket::new, PLAY_TO_SERVER), - DISPLAY_CLOTH_SERVERBOUND(DisplayClothPacketToServer.class, DisplayClothPacketToServer::new, PLAY_TO_SERVER), + DISPLAY_CLOTH_CONFIGURATION(DisplayClothConfigurationPacket.class, DisplayClothConfigurationPacket::new, PLAY_TO_SERVER), PACKAGE_PORT_CONFIGURATION(PackagePortConfigurationPacket.class, PackagePortConfigurationPacket::new, PLAY_TO_SERVER), TRAIN_MAP_REQUEST(TrainMapSyncRequestPacket.class, TrainMapSyncRequestPacket::new, PLAY_TO_SERVER), CONNECT_FACTORY_PANEL(FactoryPanelConnectionPacket.class, FactoryPanelConnectionPacket::new, PLAY_TO_SERVER), @@ -248,7 +247,6 @@ public enum AllPackets { SERVER_DEBUG_INFO(ServerDebugInfoPacket.class, ServerDebugInfoPacket::new, PLAY_TO_CLIENT), PACKAGE_DESTROYED(PackageDestroyPacket.class, PackageDestroyPacket::new, PLAY_TO_CLIENT), LOGISTICS_STOCK_RESPONSE(LogisticalStockResponsePacket.class, LogisticalStockResponsePacket::new, PLAY_TO_CLIENT), - DISPLAY_CLOTH_CLIENTBOUND(DisplayClothPacketToClient.class, DisplayClothPacketToClient::new, PLAY_TO_CLIENT), FACTORY_PANEL_EFFECT(FactoryPanelEffectPacket.class, FactoryPanelEffectPacket::new, PLAY_TO_CLIENT), KNOCKBACK(KnockbackPacket.class, KnockbackPacket::new, PLAY_TO_CLIENT), TRAIN_MAP_SYNC(TrainMapSyncPacket.class, TrainMapSyncPacket::new, PLAY_TO_CLIENT); diff --git a/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintOverlayRenderer.java b/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintOverlayRenderer.java index edd11b044b..6c6d6d262c 100644 --- a/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintOverlayRenderer.java +++ b/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintOverlayRenderer.java @@ -13,7 +13,7 @@ import com.simibubi.create.content.equipment.blueprint.BlueprintEntity.Blueprint import com.simibubi.create.content.equipment.blueprint.BlueprintEntity.BlueprintSection; import com.simibubi.create.content.logistics.BigItemStack; import com.simibubi.create.content.logistics.displayCloth.BlueprintOverlayShopContext; -import com.simibubi.create.content.logistics.displayCloth.DisplayClothEntity; +import com.simibubi.create.content.logistics.displayCloth.DisplayClothBlockEntity; import com.simibubi.create.content.logistics.displayCloth.ShoppingListItem.ShoppingList; import com.simibubi.create.content.logistics.filter.AttributeFilterMenu.WhitelistMode; import com.simibubi.create.content.logistics.filter.FilterItem; @@ -139,7 +139,7 @@ public class BlueprintOverlayRenderer { } } - public static void displayClothShop(DisplayClothEntity dce, int alreadyPurchased, ShoppingList list) { + public static void displayClothShop(DisplayClothBlockEntity dce, int alreadyPurchased, ShoppingList list) { if (active) return; prepareCustomOverlay(); diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothBlock.java b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothBlock.java index d4a2b83d58..9f815ecaf8 100644 --- a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothBlock.java @@ -9,6 +9,7 @@ import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllShapes; import com.simibubi.create.AllTags.AllItemTags; import com.simibubi.create.content.equipment.wrench.IWrenchable; +import com.simibubi.create.content.logistics.redstoneRequester.AutoRequestData; import com.simibubi.create.foundation.block.IBE; import com.simibubi.create.foundation.block.IHaveBigOutline; @@ -20,6 +21,7 @@ import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.DyeColor; @@ -34,6 +36,7 @@ import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition.Builder; import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; @@ -61,21 +64,43 @@ public class DisplayClothBlock extends Block implements IHaveBigOutline, IWrench super.createBlockStateDefinition(pBuilder.add(HAS_BE)); } + @Override + public void setPlacedBy(Level pLevel, BlockPos pPos, BlockState pState, LivingEntity pPlacer, ItemStack pStack) { + super.setPlacedBy(pLevel, pPos, pState, pPlacer, pStack); + if (!(pPlacer instanceof Player player)) + return; + + AutoRequestData requestData = AutoRequestData.readFromItem(pLevel, player, pPos, pStack); + if (requestData == null) + return; + + pLevel.setBlockAndUpdate(pPos, pState.setValue(HAS_BE, true)); + withBlockEntityDo(pLevel, pPos, dcbe -> { + dcbe.requestData = requestData; + dcbe.owner = player.getUUID(); + if (dcbe.requestData.isValid) + dcbe.interactAsOwner(player); + }); + } + @Override public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult ray) { ItemStack heldItem = player.getItemInHand(hand); - if (player.isShiftKeyDown() || !player.mayBuild()) + boolean shiftKeyDown = player.isShiftKeyDown(); + if (!player.mayBuild()) return InteractionResult.PASS; IPlacementHelper placementHelper = PlacementHelpers.get(placementHelperId); if (placementHelper.matchesItem(heldItem)) { + if (shiftKeyDown) + return InteractionResult.PASS; placementHelper.getOffset(player, world, state, pos, ray) .placeInWorld(world, (BlockItem) heldItem.getItem(), player, hand, ray); return InteractionResult.SUCCESS; } - if (heldItem.isEmpty() && !state.getValue(HAS_BE)) + if ((shiftKeyDown || heldItem.isEmpty()) && !state.getValue(HAS_BE)) return InteractionResult.PASS; if (!world.isClientSide() && !state.getValue(HAS_BE)) @@ -86,6 +111,28 @@ public class DisplayClothBlock extends Block implements IHaveBigOutline, IWrench return onBlockEntityUse(world, pos, dcbe -> dcbe.use(player)); } + @SuppressWarnings("deprecation") + @Override + public List getDrops(BlockState pState, + net.minecraft.world.level.storage.loot.LootParams.Builder pParams) { + List drops = super.getDrops(pState, pParams); + + if (!(pParams.getOptionalParameter(LootContextParams.BLOCK_ENTITY) instanceof DisplayClothBlockEntity dcbe)) + return drops; + if (!dcbe.isShop()) + return drops; + + for (ItemStack stack : drops) { + if (AllItemTags.DISPLAY_CLOTHS.matches(stack)) { + ItemStack drop = new ItemStack(this); + dcbe.requestData.writeToItem(dcbe.getBlockPos(), drop); + return List.of(drop); + } + } + + return drops; + } + @Override public VoxelShape getShape(BlockState pState, BlockGetter pLevel, BlockPos pPos, CollisionContext pContext) { return colour == null ? AllShapes.DISPLAY_CLOTH_OCCLUSION : AllShapes.DISPLAY_CLOTH; diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothBlockEntity.java index d387581d8b..cba7f43f79 100644 --- a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothBlockEntity.java @@ -2,41 +2,89 @@ package com.simibubi.create.content.logistics.displayCloth; import java.util.ArrayList; import java.util.List; +import java.util.UUID; +import javax.annotation.Nullable; + +import com.simibubi.create.AllItems; import com.simibubi.create.AllPackets; +import com.simibubi.create.AllSoundEvents; +import com.simibubi.create.content.logistics.BigItemStack; +import com.simibubi.create.content.logistics.displayCloth.ShoppingListItem.ShoppingList; +import com.simibubi.create.content.logistics.packager.InventorySummary; +import com.simibubi.create.content.logistics.redstoneRequester.AutoRequestData; +import com.simibubi.create.content.logistics.stockTicker.StockTickerBlockEntity; import com.simibubi.create.foundation.blockEntity.RemoveBlockEntityPacket; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; +import com.simibubi.create.foundation.utility.CreateLang; import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.utility.lang.Components; +import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; import net.minecraft.world.Containers; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; +import net.minecraft.world.MenuProvider; +import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.network.NetworkHooks; -public class DisplayClothBlockEntity extends SmartBlockEntity { +public class DisplayClothBlockEntity extends SmartBlockEntity implements MenuProvider { - private List manuallyAddedItems; + public AutoRequestData requestData; + public List manuallyAddedItems; + public ItemStack paymentItem; + public int paymentAmount; + public UUID owner; + + private List renderedItemsForShop; public DisplayClothBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); manuallyAddedItems = new ArrayList<>(); + requestData = new AutoRequestData(); + paymentItem = ItemStack.EMPTY; + paymentAmount = 1; + owner = null; } @Override public void addBehaviours(List behaviours) {} public List getItemsForRender() { + if (isShop()) { + if (renderedItemsForShop == null) + renderedItemsForShop = requestData.encodedRequest.stacks() + .stream() + .map(b -> b.stack) + .limit(4) + .toList(); + return renderedItemsForShop; + } + return manuallyAddedItems; } + public boolean isShop() { + return !requestData.encodedRequest.isEmpty(); + } + public InteractionResult use(Player player) { + if (isShop()) + return useShop(player); + ItemStack heldItem = player.getItemInHand(InteractionHand.MAIN_HAND); if (heldItem.isEmpty()) { @@ -65,16 +113,181 @@ public class DisplayClothBlockEntity extends SmartBlockEntity { return InteractionResult.SUCCESS; } + public InteractionResult useShop(Player player) { + if (level.isClientSide()) + return InteractionResult.SUCCESS; + if (!owner.equals(player.getUUID()) || (!paymentItem.isEmpty() && !player.isShiftKeyDown())) + return interactAsCustomer(player); + + return interactAsOwner(player); + } + + public InteractionResult interactAsOwner(Player player) { + if (player instanceof ServerPlayer sp) + NetworkHooks.openScreen(sp, this, worldPosition); + return InteractionResult.SUCCESS; + } + + public InteractionResult interactAsCustomer(Player player) { + ItemStack itemInHand = player.getItemInHand(InteractionHand.MAIN_HAND); + ItemStack prevListItem = ItemStack.EMPTY; + boolean addOntoList = false; + + // Remove other lists from inventory + for (int i = 0; i < 9; i++) { + ItemStack item = player.getInventory() + .getItem(i); + if (!AllItems.SHOPPING_LIST.isIn(item)) + continue; + prevListItem = item; + addOntoList = true; + player.getInventory() + .setItem(i, ItemStack.EMPTY); + } + + // add onto existing list if in hand + if (AllItems.SHOPPING_LIST.isIn(itemInHand)) { + prevListItem = itemInHand; + addOntoList = true; + } + + if (!itemInHand.isEmpty() && !addOntoList) { + CreateLang.temporaryText("Empty hand required to start a shopping list") + .sendStatus(player); + AllSoundEvents.DENY.playOnServer(level, worldPosition); + return InteractionResult.SUCCESS; + } + + if (paymentItem.isEmpty()) { + CreateLang.temporaryText("Shop owner must set a price first") + .sendStatus(player); + AllSoundEvents.DENY.playOnServer(level, worldPosition); + return InteractionResult.SUCCESS; + } + + UUID tickerID = null; + BlockPos tickerPos = requestData.targetOffset.offset(worldPosition); + if (level.getBlockEntity(tickerPos) instanceof StockTickerBlockEntity stbe && stbe.isKeeperPresent()) + tickerID = stbe.behaviour.freqId; + + int stockLevel = getStockLevelForTrade(ShoppingListItem.getList(prevListItem)); + + if (tickerID == null) { + CreateLang.temporaryText("Stock keeper missing") + .style(ChatFormatting.RED) + .sendStatus(player); + AllSoundEvents.DENY.playOnServer(level, worldPosition); + return InteractionResult.SUCCESS; + } + + if (stockLevel == 0) { + CreateLang.temporaryText("Out of Stock") + .style(ChatFormatting.RED) + .sendStatus(player); + AllSoundEvents.DENY.playOnServer(level, worldPosition); + + if (!prevListItem.isEmpty()) { + if (player.getItemInHand(InteractionHand.MAIN_HAND) + .isEmpty()) + player.setItemInHand(InteractionHand.MAIN_HAND, prevListItem); + else + player.getInventory() + .placeItemBackInInventory(prevListItem); + } + + return InteractionResult.SUCCESS; + } + + ShoppingList list = new ShoppingList(new ArrayList<>(), owner, tickerID); + + if (addOntoList) { + ShoppingList prevList = ShoppingListItem.getList(prevListItem); + if (owner.equals(prevList.shopOwner()) && tickerID.equals(prevList.shopNetwork())) + list = prevList; + else + addOntoList = false; + } + + if (list.getPurchases(worldPosition) == stockLevel) { + CreateLang.temporaryText("Limited stock available") + .style(ChatFormatting.RED) + .sendStatus(player); + AllSoundEvents.DENY.playOnServer(level, worldPosition); + + } else { + list.addPurchases(worldPosition, 1); + if (!addOntoList) + CreateLang.temporaryText("Use this list to add more to your purchase") + .color(0xeeeeee) + .sendStatus(player); + if (!addOntoList) + level.playSound(null, worldPosition, SoundEvents.BOOK_PAGE_TURN, SoundSource.BLOCKS, 1, 1.5f); + AllSoundEvents.CONFIRM.playOnServer(level, worldPosition); + } + + ItemStack newListItem = + ShoppingListItem.saveList(AllItems.SHOPPING_LIST.asStack(), list, requestData.encodedTargetAdress); + + if (player.getItemInHand(InteractionHand.MAIN_HAND) + .isEmpty()) + player.setItemInHand(InteractionHand.MAIN_HAND, newListItem); + else + player.getInventory() + .placeItemBackInInventory(newListItem); + + return InteractionResult.SUCCESS; + } + + public int getStockLevelForTrade(@Nullable ShoppingList otherPurchases) { + BlockPos tickerPos = requestData.targetOffset.offset(worldPosition); + if (!(level.getBlockEntity(tickerPos) instanceof StockTickerBlockEntity stbe)) + return 0; + + InventorySummary recentSummary = null; + + if (level.isClientSide()) { + if (stbe.getTicksSinceLastUpdate() > 15) + stbe.refreshClientStockSnapshot(); + recentSummary = stbe.getLastClientsideStockSnapshotAsSummary(); + } else + recentSummary = stbe.getRecentSummary(); + + if (recentSummary == null) + return 0; + + InventorySummary modifierSummary = new InventorySummary(); + if (otherPurchases != null) + modifierSummary = otherPurchases.bakeEntries(level, worldPosition) + .getFirst(); + + int smallestQuotient = Integer.MAX_VALUE; + for (BigItemStack entry : requestData.encodedRequest.stacks()) + if (entry.count > 0) + smallestQuotient = Math.min(smallestQuotient, + (recentSummary.getCountOf(entry.stack) - modifierSummary.getCountOf(entry.stack)) / entry.count); + + return smallestQuotient; + } + @Override protected void write(CompoundTag tag, boolean clientPacket) { super.write(tag, clientPacket); tag.put("Items", NBTHelper.writeItemList(manuallyAddedItems)); + tag.put("Payment", paymentItem.serializeNBT()); + tag.putInt("PaymentAmount", paymentAmount); + requestData.write(tag); + if (owner != null) + tag.putUUID("OwnerUUID", owner); } @Override protected void read(CompoundTag tag, boolean clientPacket) { super.read(tag, clientPacket); manuallyAddedItems = NBTHelper.readItemList(tag.getList("Items", Tag.TAG_COMPOUND)); + requestData = AutoRequestData.read(tag); + paymentItem = ItemStack.of(tag.getCompound("Payment")); + paymentAmount = tag.getInt("PaymentAmount"); + owner = tag.contains("OwnerUUID") ? tag.getUUID("OwnerUUID") : null; } @Override @@ -85,4 +298,14 @@ public class DisplayClothBlockEntity extends SmartBlockEntity { manuallyAddedItems.clear(); } + @Override + public AbstractContainerMenu createMenu(int pContainerId, Inventory pPlayerInventory, Player pPlayer) { + return DisplayClothPricingMenu.create(pContainerId, pPlayerInventory, this); + } + + @Override + public Component getDisplayName() { + return Components.empty(); + } + } diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothBlockItem.java b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothBlockItem.java new file mode 100644 index 0000000000..eb9fddbe54 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothBlockItem.java @@ -0,0 +1,42 @@ +package com.simibubi.create.content.logistics.displayCloth; + +import java.util.List; + +import com.simibubi.create.content.logistics.redstoneRequester.RedstoneRequesterBlock; +import com.simibubi.create.foundation.utility.CreateLang; + +import net.minecraft.ChatFormatting; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; + +public class DisplayClothBlockItem extends BlockItem { + + public DisplayClothBlockItem(Block pBlock, Properties pProperties) { + super(pBlock, pProperties); + } + + @Override + public boolean isFoil(ItemStack pStack) { + CompoundTag tag = pStack.getTag(); + return tag != null && tag.contains("TargetOffset"); + } + + @Override + public void appendHoverText(ItemStack pStack, Level pLevel, List pTooltip, TooltipFlag pFlag) { + super.appendHoverText(pStack, pLevel, pTooltip, pFlag); + if (!isFoil(pStack)) + return; + + CreateLang.temporaryText("Item shop configured") + .style(ChatFormatting.GOLD) + .addTo(pTooltip); + + RedstoneRequesterBlock.appendRequesterTooltip(pStack, pTooltip); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothConfigurationPacket.java b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothConfigurationPacket.java new file mode 100644 index 0000000000..fcf299750b --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothConfigurationPacket.java @@ -0,0 +1,49 @@ +package com.simibubi.create.content.logistics.displayCloth; + +import com.simibubi.create.content.logistics.stockTicker.PackageOrder; +import com.simibubi.create.foundation.networking.BlockEntityConfigurationPacket; + +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.item.ItemStack; + +public class DisplayClothConfigurationPacket extends BlockEntityConfigurationPacket { + + protected PackageOrder order; + protected ItemStack costItem; + protected int costAmount; + + public DisplayClothConfigurationPacket(BlockPos pos, PackageOrder order, ItemStack costItem, int costAmount) { + super(pos); + this.order = order; + this.costItem = costItem; + this.costAmount = costAmount; + } + + public DisplayClothConfigurationPacket(FriendlyByteBuf buffer) { + super(buffer); + } + + @Override + protected void writeSettings(FriendlyByteBuf buffer) { + order.write(buffer); + buffer.writeItem(costItem); + buffer.writeVarInt(costAmount); + } + + @Override + protected void readSettings(FriendlyByteBuf buffer) { + order = PackageOrder.read(buffer); + costItem = buffer.readItem(); + costAmount = buffer.readVarInt(); + } + + @Override + protected void applySettings(DisplayClothBlockEntity be) { + be.requestData.encodedRequest = order; + be.paymentItem = costItem; + be.paymentAmount = costAmount; + be.notifyUpdate(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothEntity.java b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothEntity.java deleted file mode 100644 index 323aac3f89..0000000000 --- a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothEntity.java +++ /dev/null @@ -1,433 +0,0 @@ -package com.simibubi.create.content.logistics.displayCloth; - -import java.util.ArrayList; -import java.util.UUID; - -import javax.annotation.Nullable; - -import com.simibubi.create.AllEntityTypes; -import com.simibubi.create.AllItems; -import com.simibubi.create.AllPackets; -import com.simibubi.create.AllSoundEvents; -import com.simibubi.create.content.logistics.BigItemStack; -import com.simibubi.create.content.logistics.displayCloth.ShoppingListItem.ShoppingList; -import com.simibubi.create.content.logistics.packager.InventorySummary; -import com.simibubi.create.content.logistics.redstoneRequester.AutoRequestData; -import com.simibubi.create.content.logistics.stockTicker.StockTickerBlockEntity; -import com.simibubi.create.content.schematics.requirement.ISpecialEntityItemRequirement; -import com.simibubi.create.content.schematics.requirement.ItemRequirement; -import com.simibubi.create.content.schematics.requirement.ItemRequirement.ItemUseType; -import com.simibubi.create.foundation.networking.ISyncPersistentData; -import com.simibubi.create.foundation.utility.CreateLang; -import com.simibubi.create.foundation.utility.IInteractionChecker; - -import net.minecraft.ChatFormatting; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.chat.Component; -import net.minecraft.network.protocol.Packet; -import net.minecraft.network.protocol.game.ClientGamePacketListener; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.sounds.SoundEvents; -import net.minecraft.util.Mth; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.MenuProvider; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.EntityDimensions; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.Pose; -import net.minecraft.world.entity.decoration.HangingEntity; -import net.minecraft.world.entity.player.Inventory; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.inventory.AbstractContainerMenu; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.EntityGetter; -import net.minecraft.world.level.GameRules; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.FenceBlock; -import net.minecraft.world.level.block.FenceGateBlock; -import net.minecraft.world.level.block.WallBlock; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.AABB; -import net.minecraft.world.phys.HitResult; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.entity.IEntityAdditionalSpawnData; -import net.minecraftforge.network.NetworkHooks; -import net.minecraftforge.network.PacketDistributor; - -public class DisplayClothEntity extends HangingEntity implements IEntityAdditionalSpawnData, - ISpecialEntityItemRequirement, ISyncPersistentData, IInteractionChecker, MenuProvider { - - public AutoRequestData requestData = new AutoRequestData(); - - public ItemStack paymentItem = ItemStack.EMPTY; - public int paymentAmount = 1; - public UUID owner; - - public DisplayClothEntity(EntityType pEntityType, Level pLevel) { - super(pEntityType, pLevel); - } - - public DisplayClothEntity(Level world, BlockPos pos, Direction direction) { - super(AllEntityTypes.DISPLAY_CLOTH.get(), world, pos); - setDirection(direction); - } - - public static EntityType.Builder build(EntityType.Builder builder) { - @SuppressWarnings("unchecked") - EntityType.Builder entityBuilder = (EntityType.Builder) builder; - return entityBuilder; - } - - @Override - public Packet getAddEntityPacket() { - return NetworkHooks.getEntitySpawningPacket(this); - } - - public void addAdditionalSaveData(CompoundTag pCompound) { - pCompound.putByte("Facing", (byte) this.direction.get2DDataValue()); - requestData.write(pCompound); - pCompound.put("Payment", paymentItem.serializeNBT()); - pCompound.putInt("PaymentAmount", paymentAmount); - pCompound.putUUID("OwnerUUID", owner); - super.addAdditionalSaveData(pCompound); - } - - @Override - public void readAdditionalSaveData(CompoundTag pCompound) { - direction = Direction.from2DDataValue(pCompound.getByte("Facing")); - requestData = AutoRequestData.read(pCompound); - paymentItem = ItemStack.of(pCompound.getCompound("Payment")); - paymentAmount = pCompound.getInt("PaymentAmount"); - owner = pCompound.getUUID("OwnerUUID"); - super.readAdditionalSaveData(pCompound); - setDirection(direction); - } - - @Override - public InteractionResult interact(Player player, InteractionHand pHand) { - if (level().isClientSide()) - return InteractionResult.SUCCESS; - if (pHand != InteractionHand.MAIN_HAND) - return InteractionResult.PASS; - if (!owner.equals(player.getUUID()) || (!paymentItem.isEmpty() && !player.isShiftKeyDown())) - return interactAsCustomer(player); - - return interactAsOwner(player); - } - - public InteractionResult interactAsOwner(Player player) { - if (player instanceof ServerPlayer sp) - NetworkHooks.openScreen(sp, this, buf -> { - buf.writeVarInt(getId()); - requestData.encodedRequest.write(buf); - }); - return InteractionResult.SUCCESS; - } - - public InteractionResult interactAsCustomer(Player player) { - ItemStack itemInHand = player.getItemInHand(InteractionHand.MAIN_HAND); - ItemStack prevListItem = ItemStack.EMPTY; - boolean addOntoList = false; - - // Remove other lists from inventory - for (int i = 0; i < 9; i++) { - ItemStack item = player.getInventory() - .getItem(i); - if (!AllItems.SHOPPING_LIST.isIn(item)) - continue; - prevListItem = item; - addOntoList = true; - player.getInventory() - .setItem(i, ItemStack.EMPTY); - } - - // add onto existing list if in hand - if (AllItems.SHOPPING_LIST.isIn(itemInHand)) { - prevListItem = itemInHand; - addOntoList = true; - } - - if (!itemInHand.isEmpty() && !addOntoList) { - CreateLang.temporaryText("Empty hand required to start a shopping list") - .sendStatus(player); - AllSoundEvents.DENY.playOnServer(level(), blockPosition()); - return InteractionResult.SUCCESS; - } - - if (paymentItem.isEmpty()) { - CreateLang.temporaryText("Shop owner must set a price first") - .sendStatus(player); - AllSoundEvents.DENY.playOnServer(level(), blockPosition()); - return InteractionResult.SUCCESS; - } - - UUID tickerID = null; - BlockPos tickerPos = requestData.targetOffset.offset(blockPosition()); - if (level().getBlockEntity(tickerPos) instanceof StockTickerBlockEntity stbe && stbe.isKeeperPresent()) - tickerID = stbe.behaviour.freqId; - - int stockLevel = getStockLevelForTrade(ShoppingListItem.getList(prevListItem)); - - if (tickerID == null) { - CreateLang.temporaryText("Stock keeper missing") - .style(ChatFormatting.RED) - .sendStatus(player); - AllSoundEvents.DENY.playOnServer(level(), blockPosition()); - return InteractionResult.SUCCESS; - } - - if (stockLevel == 0) { - CreateLang.temporaryText("Out of Stock") - .style(ChatFormatting.RED) - .sendStatus(player); - AllSoundEvents.DENY.playOnServer(level(), blockPosition()); - - if (!prevListItem.isEmpty()) { - if (player.getItemInHand(InteractionHand.MAIN_HAND) - .isEmpty()) - player.setItemInHand(InteractionHand.MAIN_HAND, prevListItem); - else - player.getInventory() - .placeItemBackInInventory(prevListItem); - } - - return InteractionResult.SUCCESS; - } - - ShoppingList list = new ShoppingList(new ArrayList<>(), owner, tickerID); - - if (addOntoList) { - ShoppingList prevList = ShoppingListItem.getList(prevListItem); - if (owner.equals(prevList.shopOwner()) && tickerID.equals(prevList.shopNetwork())) - list = prevList; - else - addOntoList = false; - } - - BlockPos posWithPixelY = getPosWithPixelY(); - - if (list.getPurchases(posWithPixelY) == stockLevel) { - CreateLang.temporaryText("Limited stock available") - .style(ChatFormatting.RED) - .sendStatus(player); - AllSoundEvents.DENY.playOnServer(level(), blockPosition()); - - } else { - list.addPurchases(posWithPixelY, 1); - if (!addOntoList) - CreateLang.temporaryText("Use this list to add more to your purchase") - .color(0xeeeeee) - .sendStatus(player); - if (!addOntoList) - level().playSound(null, blockPosition(), SoundEvents.BOOK_PAGE_TURN, getSoundSource(), 1, 1.5f); - AllSoundEvents.CONFIRM.playOnServer(level(), blockPosition()); - } - - ItemStack newListItem = - ShoppingListItem.saveList(AllItems.SHOPPING_LIST.asStack(), list, requestData.encodedTargetAdress); - - if (player.getItemInHand(InteractionHand.MAIN_HAND) - .isEmpty()) - player.setItemInHand(InteractionHand.MAIN_HAND, newListItem); - else - player.getInventory() - .placeItemBackInInventory(newListItem); - - return InteractionResult.SUCCESS; - } - - public int getStockLevelForTrade(@Nullable ShoppingList otherPurchases) { - BlockPos tickerPos = requestData.targetOffset.offset(blockPosition()); - if (!(level().getBlockEntity(tickerPos) instanceof StockTickerBlockEntity stbe)) - return 0; - - InventorySummary recentSummary = null; - - if (level().isClientSide()) { - if (stbe.getTicksSinceLastUpdate() > 15) - stbe.refreshClientStockSnapshot(); - recentSummary = stbe.getLastClientsideStockSnapshotAsSummary(); - } else - recentSummary = stbe.getRecentSummary(); - - if (recentSummary == null) - return 0; - - InventorySummary modifierSummary = new InventorySummary(); - if (otherPurchases != null) - modifierSummary = otherPurchases.bakeEntries(level(), getPosWithPixelY()) - .getFirst(); - - int smallestQuotient = Integer.MAX_VALUE; - for (BigItemStack entry : requestData.encodedRequest.stacks()) - if (entry.count > 0) - smallestQuotient = Math.min(smallestQuotient, - (recentSummary.getCountOf(entry.stack) - modifierSummary.getCountOf(entry.stack)) / entry.count); - - return smallestQuotient; - } - - public BlockPos getPosWithPixelY() { - return new BlockPos(blockPosition().getX(), Mth.floor(getY() * 16), blockPosition().getZ()); - } - - public static DisplayClothEntity getAtPosWithPixelY(EntityGetter level, BlockPos pos) { - for (DisplayClothEntity entity : level.getEntitiesOfClass(DisplayClothEntity.class, - new AABB(new BlockPos(pos.getX(), pos.getY() / 16, pos.getZ())).inflate(1))) - if (pos.equals(entity.getPosWithPixelY())) - return entity; - return null; - } - - @Override - protected float getEyeHeight(Pose pPose, EntityDimensions pDimensions) { - return 0; - } - - @Override - protected void recalculateBoundingBox() { - setBoundingBox(new AABB(position(), position()).inflate(.5, 0, .5) - .expandTowards(0, 1 / 16f, 0)); - } - - @Override - public void setPos(double pX, double pY, double pZ) { - setPosRaw(pX, pY, pZ); - super.setPos(pX, pY, pZ); - } - - @Override - public void dropItem(@Nullable Entity pBrokenEntity) { - if (!this.level() - .getGameRules() - .getBoolean(GameRules.RULE_DOENTITYDROPS)) - return; - - playSound(SoundEvents.WOOL_BREAK, 1.0F, 1.0F); - if (pBrokenEntity instanceof Player) { - Player player = (Player) pBrokenEntity; - if (player.getAbilities().instabuild) - return; - } - - ItemStack item = AllItems.DISPLAY_CLOTH.asStack(); - if (requestData != null) - requestData.writeToItem(pos, item); - - spawnAtLocation(item); - } - - @Override - public boolean survives() { - BlockPos blockpos = BlockPos.containing(position().relative(Direction.DOWN, 1 / 16f)); - BlockState blockstate = level().getBlockState(blockpos); - - boolean fenceLikeBelow = blockstate.getBlock() instanceof FenceBlock - || blockstate.getBlock() instanceof FenceGateBlock || blockstate.getBlock() instanceof WallBlock; - - AABB boundingBox = getBoundingBox(); - if (fenceLikeBelow) - if (blockstate.getShape(level(), blockpos) - .bounds() - .move(blockpos) - .intersects(boundingBox)) - return false; - - if (!fenceLikeBelow) - if (!level().noCollision(this)) - return false; - - if (blockstate.getShape(level(), blockpos) - .isEmpty()) - return false; - - return level().getEntities(this, boundingBox, HANGING_ENTITY) - .isEmpty(); - } - - @Override - public int getWidth() { - return 16; - } - - @Override - public int getHeight() { - return 16; - } - - @Override - public ItemStack getPickedResult(HitResult target) { - return AllItems.DISPLAY_CLOTH.asStack(); - } - - @Override - public ItemRequirement getRequiredItems() { - return new ItemRequirement(ItemUseType.CONSUME, AllItems.DISPLAY_CLOTH.get()); - } - - @Override - public void playPlacementSound() { - this.playSound(SoundEvents.WOOL_PLACE, 1.0F, 1.0F); - } - - @Override - public void moveTo(double p_70012_1_, double p_70012_3_, double p_70012_5_, float p_70012_7_, float p_70012_8_) { - this.setPos(p_70012_1_, p_70012_3_, p_70012_5_); - } - - @Override - @OnlyIn(Dist.CLIENT) - public void lerpTo(double p_180426_1_, double p_180426_3_, double p_180426_5_, float p_180426_7_, float p_180426_8_, - int p_180426_9_, boolean p_180426_10_) { - BlockPos blockpos = this.pos.offset( - BlockPos.containing(p_180426_1_ - this.getX(), p_180426_3_ - this.getY(), p_180426_5_ - this.getZ())); - this.setPos((double) blockpos.getX(), (double) blockpos.getY(), (double) blockpos.getZ()); - } - - @Override - public void onPersistentDataUpdated() {} - - @Override - public void writeSpawnData(FriendlyByteBuf buffer) { - CompoundTag compound = new CompoundTag(); - addAdditionalSaveData(compound); - buffer.writeNbt(compound); - buffer.writeNbt(getPersistentData()); - } - - @Override - public void readSpawnData(FriendlyByteBuf additionalData) { - readAdditionalSaveData(additionalData.readNbt()); - getPersistentData().merge(additionalData.readNbt()); - } - - @Override - public boolean canPlayerUse(Player player) { - return isAlive() && player.closerThan(this, 10); - } - - @Override - public AbstractContainerMenu createMenu(int id, Inventory inv, Player player) { - return DisplayClothPricingMenu.create(id, inv, this); - } - - @Override - public Component getDisplayName() { - return AllItems.DISPLAY_CLOTH.get() - .getDescription(); - } - - public void sendData() { - if (level().isClientSide()) - return; - AllPackets.getChannel() - .send(PacketDistributor.TRACKING_ENTITY.with(() -> this), - new DisplayClothPacketToClient(getId(), requestData.encodedRequest, paymentItem, paymentAmount)); - } - -} diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothEntityRenderer.java b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothEntityRenderer.java deleted file mode 100644 index 794e8c3ba0..0000000000 --- a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothEntityRenderer.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.simibubi.create.content.logistics.displayCloth; - -import java.util.List; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.math.Axis; -import com.simibubi.create.AllPartialModels; -import com.simibubi.create.content.logistics.BigItemStack; -import com.simibubi.create.content.logistics.depot.DepotRenderer; - -import dev.engine_room.flywheel.lib.model.baked.PartialModel; -import net.createmod.catnip.render.CachedBuffers; -import net.createmod.catnip.render.SuperByteBuffer; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.Sheets; -import net.minecraft.client.renderer.entity.EntityRenderer; -import net.minecraft.client.renderer.entity.EntityRendererProvider; -import net.minecraft.client.renderer.texture.OverlayTexture; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.block.Blocks; - -public class DisplayClothEntityRenderer extends EntityRenderer { - - public DisplayClothEntityRenderer(EntityRendererProvider.Context context) { - super(context); - } - - @Override - public void render(DisplayClothEntity entity, float yaw, float pt, PoseStack ms, MultiBufferSource buffer, - int light) { - PartialModel partialModel = AllPartialModels.DISPLAY_CLOTH; - SuperByteBuffer sbb = CachedBuffers.partial(partialModel, Blocks.AIR.defaultBlockState()); - - sbb.rotateYDegrees(180 + -entity.getYRot()) - .translate(-.5, 0, -.5) - .light(light) - .renderInto(ms, buffer.getBuffer(Sheets.solidBlockSheet())); - - if (entity.requestData == null) { - super.render(entity, yaw, pt, ms, buffer, light); - return; - } - - List stacks = entity.requestData.encodedRequest.stacks(); - - for (int i = 0; i < stacks.size(); i++) { - BigItemStack entry = stacks.get(i); - ms.pushPose(); - ms.translate(0, 3 / 16f, 0); - - if (stacks.size() > 1) { - ms.mulPose(Axis.YP.rotationDegrees(-entity.getYRot() + i * (360f / stacks.size()))); - ms.translate(0, i % 2 == 0 ? -0.005 : 0, 4 / 16f); - ms.mulPose(Axis.YP.rotationDegrees(entity.getYRot() - i * (360f / stacks.size()))); - } - - ms.mulPose(Axis.YP.rotationDegrees(180)); - DepotRenderer.renderItem(entity.level(), ms, buffer, light, OverlayTexture.NO_OVERLAY, entry.stack, 0, null, - entity.position(), true); - ms.popPose(); - } - - super.render(entity, yaw, pt, ms, buffer, light); - } - - @Override - public ResourceLocation getTextureLocation(DisplayClothEntity entity) { - return null; - } - -} diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothItem.java b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothItem.java deleted file mode 100644 index 70a2810a29..0000000000 --- a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothItem.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.simibubi.create.content.logistics.displayCloth; - -import java.util.List; - -import com.simibubi.create.content.logistics.redstoneRequester.AutoRequestData; -import com.simibubi.create.content.logistics.redstoneRequester.RedstoneRequesterBlock; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.chat.Component; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.TooltipFlag; -import net.minecraft.world.item.context.UseOnContext; -import net.minecraft.world.level.Level; - -public class DisplayClothItem extends Item { - - public DisplayClothItem(Properties p_i48487_1_) { - super(p_i48487_1_); - } - - @Override - public InteractionResult useOn(UseOnContext ctx) { - Direction face = ctx.getClickedFace(); - Player player = ctx.getPlayer(); - ItemStack stack = ctx.getItemInHand(); - BlockPos pos = ctx.getClickedPos() - .relative(face); - - if (player != null && !player.mayUseItemAt(pos, face, stack)) - return InteractionResult.FAIL; - - Level world = ctx.getLevel(); - DisplayClothEntity hangingentity = new DisplayClothEntity(world, pos, ctx.getHorizontalDirection()); - CompoundTag compoundnbt = stack.getTag(); - - hangingentity.setPos(pos.getX() + 0.5, Math.min(ctx.getClickLocation() - .y(), pos.getY() + 1), pos.getZ() + 0.5); - - if (compoundnbt != null) - EntityType.updateCustomEntityTag(world, player, hangingentity, compoundnbt); - if (!hangingentity.survives()) - return InteractionResult.CONSUME; - - hangingentity.requestData = AutoRequestData.readFromItem(world, player, hangingentity.blockPosition(), stack); - hangingentity.owner = player.getUUID(); - - if (!world.isClientSide) { - hangingentity.playPlacementSound(); - world.addFreshEntity(hangingentity); - } - - stack.shrink(1); - - if (hangingentity.requestData.isValid) - hangingentity.interactAsOwner(player); - - hangingentity.sendData(); - return InteractionResult.sidedSuccess(world.isClientSide); - } - - @Override - public void appendHoverText(ItemStack pStack, Level pLevel, List pTooltipComponents, - TooltipFlag pIsAdvanced) { - super.appendHoverText(pStack, pLevel, pTooltipComponents, pIsAdvanced); - RedstoneRequesterBlock.appendRequesterTooltip(pStack, pTooltipComponents); - } - - protected boolean canPlace(Player p_200127_1_, Direction p_200127_2_, ItemStack p_200127_3_, BlockPos p_200127_4_) { - return p_200127_1_.mayUseItemAt(p_200127_4_, p_200127_2_, p_200127_3_); - } - -} diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothOverlayRenderer.java b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothOverlayRenderer.java index 599a25e422..2fb4321e89 100644 --- a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothOverlayRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothOverlayRenderer.java @@ -10,6 +10,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.GameType; +import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.HitResult.Type; @@ -20,37 +21,46 @@ public class DisplayClothOverlayRenderer { Minecraft mc = Minecraft.getInstance(); if (mc.gameMode.getPlayerMode() == GameType.SPECTATOR) return; - HitResult mouseOver = mc.hitResult; if (mouseOver == null) return; - if (mouseOver.getType() != Type.ENTITY) - return; - EntityHitResult entityRay = (EntityHitResult) mouseOver; - ItemStack shoppingListItem = mc.player.getMainHandItem(); - ShoppingList list = ShoppingListItem.getList(shoppingListItem); + ItemStack heldItem = mc.player.getMainHandItem(); - if (!(entityRay.getEntity() instanceof DisplayClothEntity dce)) { - if (!AllItems.SHOPPING_LIST.isIn(shoppingListItem)) + if (mouseOver.getType() != Type.ENTITY) { + if (!(mouseOver instanceof BlockHitResult bhr)) return; - BlockPos stockTickerPosition = StockTickerInteractionHandler.getStockTickerPosition(entityRay.getEntity()); - if (list == null || stockTickerPosition == null) + if (!(mc.level.getBlockEntity(bhr.getBlockPos()) instanceof DisplayClothBlockEntity dcbe)) return; - if (!(mc.level.getBlockEntity(stockTickerPosition) instanceof StockTickerBlockEntity tickerBE)) - return; - if (!tickerBE.behaviour.freqId.equals(list.shopNetwork())) + if (!dcbe.isShop()) return; - BlueprintOverlayRenderer.displayShoppingList(list.bakeEntries(mc.level, null)); + int alreadyPurchased = 0; + ShoppingList list = ShoppingListItem.getList(heldItem); + if (list != null) + alreadyPurchased = list.getPurchases(dcbe.getBlockPos()); + + BlueprintOverlayRenderer.displayClothShop(dcbe, alreadyPurchased, list); return; } - int alreadyPurchased = 0; - if (list != null) - alreadyPurchased = list.getPurchases(dce.getPosWithPixelY()); + EntityHitResult entityRay = (EntityHitResult) mouseOver; + if (!AllItems.SHOPPING_LIST.isIn(heldItem)) + return; + + ShoppingList list = ShoppingListItem.getList(heldItem); + BlockPos stockTickerPosition = StockTickerInteractionHandler.getStockTickerPosition(entityRay.getEntity()); + + if (list == null || stockTickerPosition == null) + return; + if (!(mc.level.getBlockEntity(stockTickerPosition) instanceof StockTickerBlockEntity tickerBE)) + return; + if (!tickerBE.behaviour.freqId.equals(list.shopNetwork())) + return; + + BlueprintOverlayRenderer.displayShoppingList(list.bakeEntries(mc.level, null)); + return; - BlueprintOverlayRenderer.displayClothShop(dce, alreadyPurchased, list); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothPacket.java b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothPacket.java deleted file mode 100644 index a7eab82de0..0000000000 --- a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothPacket.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.simibubi.create.content.logistics.displayCloth; - -import com.simibubi.create.content.logistics.stockTicker.PackageOrder; -import com.simibubi.create.foundation.networking.SimplePacketBase; - -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.world.item.ItemStack; - -public abstract class DisplayClothPacket extends SimplePacketBase { - - protected int entityID; - protected PackageOrder order; - protected ItemStack costItem; - protected int costAmount; - - public DisplayClothPacket(int entityID, PackageOrder order, ItemStack costItem, int costAmount) { - this.entityID = entityID; - this.order = order; - this.costItem = costItem; - this.costAmount = costAmount; - } - - public DisplayClothPacket(FriendlyByteBuf buffer) { - this(buffer.readVarInt(), PackageOrder.read(buffer), buffer.readItem(), buffer.readVarInt()); - } - - @Override - public void write(FriendlyByteBuf buffer) { - buffer.writeVarInt(entityID); - order.write(buffer); - buffer.writeItem(costItem); - buffer.writeVarInt(costAmount); - } - -} diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothPacketToClient.java b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothPacketToClient.java deleted file mode 100644 index 056a804846..0000000000 --- a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothPacketToClient.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.simibubi.create.content.logistics.displayCloth; - -import com.simibubi.create.content.logistics.stockTicker.PackageOrder; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.world.item.ItemStack; -import net.minecraftforge.network.NetworkEvent.Context; - -public class DisplayClothPacketToClient extends DisplayClothPacket { - - public DisplayClothPacketToClient(int entityID, PackageOrder order, ItemStack costItem, int costAmount) { - super(entityID, order, costItem, costAmount); - } - - public DisplayClothPacketToClient(FriendlyByteBuf buffer) { - super(buffer); - } - - @Override - public boolean handle(Context context) { - ClientLevel level = Minecraft.getInstance().level; - if (level == null) - return true; - if (!(level.getEntity(entityID) instanceof DisplayClothEntity dce)) - return true; - - dce.requestData.encodedRequest = order; - dce.paymentItem = costItem; - dce.paymentAmount = costAmount; - return true; - } - -} diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothPacketToServer.java b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothPacketToServer.java deleted file mode 100644 index e5901d3196..0000000000 --- a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothPacketToServer.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.simibubi.create.content.logistics.displayCloth; - -import com.simibubi.create.content.logistics.stockTicker.PackageOrder; - -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Level; -import net.minecraftforge.network.NetworkEvent.Context; - -public class DisplayClothPacketToServer extends DisplayClothPacket { - - public DisplayClothPacketToServer(int entityID, PackageOrder order, ItemStack costItem, int costAmount) { - super(entityID, order, costItem, costAmount); - } - - public DisplayClothPacketToServer(FriendlyByteBuf buffer) { - super(buffer); - } - - @Override - public boolean handle(Context context) { - Level level = context.getSender() - .level(); - if (level == null) - return true; - if (!(level.getEntity(entityID) instanceof DisplayClothEntity dce)) - return true; - - dce.requestData.encodedRequest = order; - dce.paymentItem = costItem; - dce.paymentAmount = costAmount; - dce.sendData(); - return true; - } - -} diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothPricingMenu.java b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothPricingMenu.java index 7d6eed2206..cb97039b2a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothPricingMenu.java +++ b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothPricingMenu.java @@ -2,22 +2,21 @@ package com.simibubi.create.content.logistics.displayCloth; import com.simibubi.create.AllMenuTypes; import com.simibubi.create.AllPackets; -import com.simibubi.create.content.logistics.stockTicker.PackageOrder; import com.simibubi.create.foundation.gui.menu.GhostItemMenu; import net.minecraft.client.Minecraft; import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraftforge.items.ItemStackHandler; import net.minecraftforge.items.SlotItemHandler; -public class DisplayClothPricingMenu extends GhostItemMenu { +public class DisplayClothPricingMenu extends GhostItemMenu { int pricingAmount; - public DisplayClothPricingMenu(MenuType type, int id, Inventory inv, DisplayClothEntity contentHolder) { + public DisplayClothPricingMenu(MenuType type, int id, Inventory inv, DisplayClothBlockEntity contentHolder) { super(type, id, inv, contentHolder); pricingAmount = contentHolder.paymentAmount; } @@ -26,7 +25,7 @@ public class DisplayClothPricingMenu extends GhostItemMenu { super(type, id, inv, extraData); } - public static DisplayClothPricingMenu create(int id, Inventory inv, DisplayClothEntity contentHolder) { + public static DisplayClothPricingMenu create(int id, Inventory inv, DisplayClothBlockEntity contentHolder) { return new DisplayClothPricingMenu(AllMenuTypes.DISPLAY_CLOTH.get(), id, inv, contentHolder); } @@ -44,15 +43,11 @@ public class DisplayClothPricingMenu extends GhostItemMenu { } @Override - protected DisplayClothEntity createOnClient(FriendlyByteBuf extraData) { - int entityID = extraData.readVarInt(); - PackageOrder order = PackageOrder.read(extraData); - Entity entityByID = Minecraft.getInstance().level.getEntity(entityID); - if (!(entityByID instanceof DisplayClothEntity dce)) - return null; - dce.requestData.encodedRequest = order; - pricingAmount = dce.paymentAmount; - return dce; + protected DisplayClothBlockEntity createOnClient(FriendlyByteBuf extraData) { + BlockEntity blockEntity = Minecraft.getInstance().level.getBlockEntity(extraData.readBlockPos()); + if (blockEntity instanceof DisplayClothBlockEntity dcbe) + return dcbe; + return null; } @Override @@ -67,16 +62,15 @@ public class DisplayClothPricingMenu extends GhostItemMenu { } @Override - protected void saveData(DisplayClothEntity contentHolder) { - if (!contentHolder.level() - .isClientSide()) + protected void saveData(DisplayClothBlockEntity contentHolder) { + if (!contentHolder.getLevel().isClientSide) return; contentHolder.paymentItem = ghostInventory.getStackInSlot(0); - contentHolder.paymentAmount = pricingAmount; + contentHolder.paymentAmount = Math.max(1, pricingAmount); AllPackets.getChannel() - .sendToServer(new DisplayClothPacketToServer(contentHolder.getId(), + .sendToServer(new DisplayClothConfigurationPacket(contentHolder.getBlockPos(), contentHolder.requestData.encodedRequest, contentHolder.paymentItem, contentHolder.paymentAmount)); } diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/ShoppingListItem.java b/src/main/java/com/simibubi/create/content/logistics/displayCloth/ShoppingListItem.java index f538faad45..43b4bb55e9 100644 --- a/src/main/java/com/simibubi/create/content/logistics/displayCloth/ShoppingListItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/displayCloth/ShoppingListItem.java @@ -28,8 +28,8 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.context.UseOnContext; -import net.minecraft.world.level.EntityGetter; import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; public class ShoppingListItem extends Item { @@ -69,18 +69,17 @@ public class ShoppingListItem extends Item { return 0; } - public Couple bakeEntries(EntityGetter level, @Nullable BlockPos clothPosToIgnore) { + public Couple bakeEntries(LevelAccessor level, @Nullable BlockPos clothPosToIgnore) { InventorySummary input = new InventorySummary(); InventorySummary output = new InventorySummary(); for (IntAttached entry : purchases) { if (clothPosToIgnore != null && clothPosToIgnore.equals(entry.getValue())) continue; - DisplayClothEntity entity = DisplayClothEntity.getAtPosWithPixelY(level, entry.getValue()); - if (entity == null) + if (!(level.getBlockEntity(entry.getValue()) instanceof DisplayClothBlockEntity dcbe)) continue; - input.add(entity.paymentItem, entity.paymentAmount * entry.getFirst()); - for (BigItemStack stackEntry : entity.requestData.encodedRequest.stacks()) + input.add(dcbe.paymentItem, dcbe.paymentAmount * entry.getFirst()); + for (BigItemStack stackEntry : dcbe.requestData.encodedRequest.stacks()) output.add(stackEntry.stack, stackEntry.count * entry.getFirst()); } diff --git a/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/AutoRequestData.java b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/AutoRequestData.java index 50a5d2501d..41c69b099a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/AutoRequestData.java +++ b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/AutoRequestData.java @@ -47,7 +47,7 @@ public class AutoRequestData { public static AutoRequestData readFromItem(Level level, Player player, BlockPos position, ItemStack itemStack) { CompoundTag tag = itemStack.getTag(); - if (tag == null) + if (tag == null || !tag.contains("TargetOffset")) return null; AutoRequestData requestData = read(tag); diff --git a/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlock.java b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlock.java index 42242af997..a36c8f76b0 100644 --- a/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlock.java @@ -4,7 +4,7 @@ import java.util.List; import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllBlocks; -import com.simibubi.create.AllItems; +import com.simibubi.create.AllTags.AllItemTags; import com.simibubi.create.content.logistics.BigItemStack; import com.simibubi.create.content.logistics.stockTicker.PackageOrder; import com.simibubi.create.content.logistics.stockTicker.StockTickerBlockEntity; @@ -83,7 +83,9 @@ public class RedstoneRequesterBlock extends Block implements IBE () -> displayScreen(posForUI, encodeMode)); diff --git a/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java b/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java index 8fc8dbd5c0..4e29e03c69 100644 --- a/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java +++ b/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java @@ -37,6 +37,7 @@ import com.simibubi.create.content.kinetics.simpleRelays.encased.EncasedCogCTBeh import com.simibubi.create.content.kinetics.simpleRelays.encased.EncasedCogwheelBlock; import com.simibubi.create.content.kinetics.simpleRelays.encased.EncasedShaftBlock; import com.simibubi.create.content.logistics.box.PackageItem; +import com.simibubi.create.content.logistics.displayCloth.DisplayClothBlockItem; import com.simibubi.create.content.logistics.displayCloth.DisplayClothModel; import com.simibubi.create.content.logistics.tunnel.BeltTunnelBlock; import com.simibubi.create.content.logistics.tunnel.BeltTunnelBlock.Shape; @@ -48,6 +49,7 @@ import com.simibubi.create.foundation.block.connected.CTSpriteShiftEntry; import com.simibubi.create.foundation.block.connected.HorizontalCTBehaviour; import com.tterrag.registrate.builders.BlockBuilder; import com.tterrag.registrate.builders.ItemBuilder; +import com.tterrag.registrate.providers.RegistrateRecipeProvider; import com.tterrag.registrate.util.DataIngredient; import com.tterrag.registrate.util.nullness.NonNullSupplier; import com.tterrag.registrate.util.nullness.NonNullUnaryOperator; @@ -57,6 +59,7 @@ import net.minecraft.client.renderer.RenderType; import net.minecraft.core.Direction.Axis; import net.minecraft.core.Direction.AxisDirection; import net.minecraft.data.recipes.RecipeCategory; +import net.minecraft.data.recipes.ShapelessRecipeBuilder; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.BlockTags; import net.minecraft.tags.ItemTags; @@ -483,12 +486,16 @@ public class BuilderTransformers { .texture("0", p.modLoc("block/display_cloth/" + name)))) .onRegister(CreateRegistrate.blockModel(() -> DisplayClothModel::new)) .tag(AllBlockTags.DISPLAY_CLOTHS.tag) - .item() + .item(DisplayClothBlockItem::new) .model((c, p) -> p .withExistingParent(name + "_display_cloth", p.modLoc("block/display_cloth/item" + (lowerItem ? "_lower" : ""))) .texture("0", p.modLoc("block/display_cloth/" + name))) .tag(AllItemTags.DISPLAY_CLOTHS.tag) + .recipe((c, p) -> ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, c.get()) + .requires(c.get()) + .unlockedBy("has_" + c.getName(), RegistrateRecipeProvider.has(c.get())) + .save(p, Create.asResource("crafting/logistics/" + c.getName() + "_clear"))) .build(); } diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java index 609cd59d3f..6d02c4683c 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java @@ -1102,7 +1102,7 @@ public class StandardRecipeGen extends CreateRecipeProvider { CLIPBOARD_CLEAR = clearData(AllBlocks.CLIPBOARD), SCHEDULE_CLEAR = clearData(AllItems.SCHEDULE), FILTER_CLEAR = clearData(AllItems.FILTER), ATTRIBUTE_FILTER_CLEAR = clearData(AllItems.ATTRIBUTE_FILTER), - DISPLAY_CLOTH_CLEAR = clearData(AllItems.DISPLAY_CLOTH), + PACKAGE_FILTER_CLEAR = clearData(AllItems.PACKAGE_FILTER), CARDBOARD_HELMET = create(AllItems.CARDBOARD_HELMET).unlockedBy(I::cardboard) .viaShaped(b -> b.define('P', I.cardboard()) From 2ae7edd1a6444977dc87f87c053a01c79586817b Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Wed, 30 Oct 2024 18:39:31 +0100 Subject: [PATCH 098/515] Windows 12 - Added Cherry and Bamboo windows --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 44 ++++++++-- .../create/blockstates/bamboo_window.json | 7 ++ .../blockstates/bamboo_window_pane.json | 77 ++++++++++++++++++ .../create/blockstates/cherry_window.json | 7 ++ .../blockstates/cherry_window_pane.json | 77 ++++++++++++++++++ .../resources/assets/create/lang/en_ud.json | 4 + .../resources/assets/create/lang/en_us.json | 4 + .../create/models/block/bamboo_window.json | 7 ++ .../block/bamboo_window_pane_noside.json | 7 ++ .../block/bamboo_window_pane_noside_alt.json | 7 ++ .../models/block/bamboo_window_pane_post.json | 7 ++ .../models/block/bamboo_window_pane_side.json | 7 ++ .../block/bamboo_window_pane_side_alt.json | 7 ++ .../create/models/block/cherry_window.json | 7 ++ .../block/cherry_window_pane_noside.json | 7 ++ .../block/cherry_window_pane_noside_alt.json | 7 ++ .../models/block/cherry_window_pane_post.json | 7 ++ .../models/block/cherry_window_pane_side.json | 7 ++ .../block/cherry_window_pane_side_alt.json | 7 ++ .../create/models/item/bamboo_window.json | 3 + .../models/item/bamboo_window_pane.json | 7 ++ .../create/models/item/cherry_window.json | 3 + .../models/item/cherry_window_pane.json | 7 ++ .../building_blocks/bamboo_window.json | 35 ++++++++ .../building_blocks/bamboo_window_pane.json | 35 ++++++++ .../building_blocks/cherry_window.json | 35 ++++++++ .../building_blocks/cherry_window_pane.json | 35 ++++++++ .../loot_tables/blocks/bamboo_window.json | 31 +++++++ .../blocks/bamboo_window_pane.json | 31 +++++++ .../loot_tables/blocks/cherry_window.json | 31 +++++++ .../blocks/cherry_window_pane.json | 31 +++++++ .../data/create/recipes/bamboo_window.json | 21 +++++ .../create/recipes/bamboo_window_pane.json | 18 ++++ .../data/create/recipes/cherry_window.json | 21 +++++ .../create/recipes/cherry_window_pane.json | 18 ++++ .../data/forge/tags/blocks/glass_panes.json | 2 + .../data/forge/tags/items/glass_panes.json | 2 + .../minecraft/tags/blocks/impermeable.json | 2 + .../com/simibubi/create/AllSpriteShifts.java | 3 +- .../decoration/palettes/AllPaletteBlocks.java | 4 + .../StockKeeperCategoryScreen.java | 7 +- .../textures/block/palettes/bamboo_window.png | Bin 0 -> 449 bytes .../palettes/bamboo_window_connected.png | Bin 0 -> 667 bytes .../textures/block/palettes/cherry_window.png | Bin 0 -> 498 bytes .../palettes/cherry_window_connected.png | Bin 0 -> 683 bytes 45 files changed, 678 insertions(+), 8 deletions(-) create mode 100644 src/generated/resources/assets/create/blockstates/bamboo_window.json create mode 100644 src/generated/resources/assets/create/blockstates/bamboo_window_pane.json create mode 100644 src/generated/resources/assets/create/blockstates/cherry_window.json create mode 100644 src/generated/resources/assets/create/blockstates/cherry_window_pane.json create mode 100644 src/generated/resources/assets/create/models/block/bamboo_window.json create mode 100644 src/generated/resources/assets/create/models/block/bamboo_window_pane_noside.json create mode 100644 src/generated/resources/assets/create/models/block/bamboo_window_pane_noside_alt.json create mode 100644 src/generated/resources/assets/create/models/block/bamboo_window_pane_post.json create mode 100644 src/generated/resources/assets/create/models/block/bamboo_window_pane_side.json create mode 100644 src/generated/resources/assets/create/models/block/bamboo_window_pane_side_alt.json create mode 100644 src/generated/resources/assets/create/models/block/cherry_window.json create mode 100644 src/generated/resources/assets/create/models/block/cherry_window_pane_noside.json create mode 100644 src/generated/resources/assets/create/models/block/cherry_window_pane_noside_alt.json create mode 100644 src/generated/resources/assets/create/models/block/cherry_window_pane_post.json create mode 100644 src/generated/resources/assets/create/models/block/cherry_window_pane_side.json create mode 100644 src/generated/resources/assets/create/models/block/cherry_window_pane_side_alt.json create mode 100644 src/generated/resources/assets/create/models/item/bamboo_window.json create mode 100644 src/generated/resources/assets/create/models/item/bamboo_window_pane.json create mode 100644 src/generated/resources/assets/create/models/item/cherry_window.json create mode 100644 src/generated/resources/assets/create/models/item/cherry_window_pane.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/bamboo_window.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/bamboo_window_pane.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/cherry_window.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/cherry_window_pane.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/bamboo_window.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/bamboo_window_pane.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/cherry_window.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/cherry_window_pane.json create mode 100644 src/generated/resources/data/create/recipes/bamboo_window.json create mode 100644 src/generated/resources/data/create/recipes/bamboo_window_pane.json create mode 100644 src/generated/resources/data/create/recipes/cherry_window.json create mode 100644 src/generated/resources/data/create/recipes/cherry_window_pane.json create mode 100644 src/main/resources/assets/create/textures/block/palettes/bamboo_window.png create mode 100644 src/main/resources/assets/create/textures/block/palettes/bamboo_window_connected.png create mode 100644 src/main/resources/assets/create/textures/block/palettes/cherry_window.png create mode 100644 src/main/resources/assets/create/textures/block/palettes/cherry_window_connected.png diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 906e375b04..7cf63584cd 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-10-30T15:58:08.5505451 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-10-30T18:22:23.0602544 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -19,6 +19,8 @@ afff577673aec43b9a596c4663024cb35127e0c3 assets/create/blockstates/andesite_pill 67c4f7802f0854d24bb29019682b1d0a2f335a15 assets/create/blockstates/andesite_tunnel.json 542af96eb0c1e34df81f15fae7dbbaf4f81287f3 assets/create/blockstates/asurine.json 7f07775d89e3bea45d7161d289daf15470e7f544 assets/create/blockstates/asurine_pillar.json +a850a113b4cfd8f1c827905b79b8629c40de12b0 assets/create/blockstates/bamboo_window.json +dfaec148d3bb21efb2ef7106a2d04454c4134303 assets/create/blockstates/bamboo_window_pane.json 9c62e0ce5d85ac4081bc04c85db7676b996b0f12 assets/create/blockstates/basin.json a97910c7516e7cedec9e34eca51f1183f1e3e681 assets/create/blockstates/belt.json 0ea03133af234921a3313f52521d8cfd02bf5d81 assets/create/blockstates/birch_window.json @@ -63,6 +65,8 @@ c23d7f691bf532d6b27317c0063289a8bd747de2 assets/create/blockstates/brown_postbox 6a3e661d54423af7a8d642b813deb8f5331013c5 assets/create/blockstates/cardboard_block.json 060c957b28afed9f4e0954cbef7e80cbf4b99f58 assets/create/blockstates/cart_assembler.json fab98b93ad9b78312742daca83c2575db40fce98 assets/create/blockstates/chain_conveyor.json +178c651f169ffc32556738bb5c19b4a746cfa085 assets/create/blockstates/cherry_window.json +b1796f89bd7785d00dc8618ca90d760da4f258bb assets/create/blockstates/cherry_window_pane.json c7eca70054241944171b1d4ffcba0376b071ec62 assets/create/blockstates/chocolate.json 9eb989b0a0545af9efd052d1f127b2ec28a972d1 assets/create/blockstates/chute.json b5170d754ce5f07ea2b4646eb07c099c50bae249 assets/create/blockstates/clipboard.json @@ -632,8 +636,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -6885a6111e0210232c89fff56c4d84df726da208 assets/create/lang/en_ud.json -619639ca62c53ed3eb39ca17da639c31bdb4b38d assets/create/lang/en_us.json +c571c86ea08a65fa325f14509707f3d920f0926e assets/create/lang/en_ud.json +2b95d25bac70a8db6d0736b9b818e3aaafa80096 assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -694,6 +698,12 @@ d6eb7105dd9b42adde48bd70e3f2fba70751c1db assets/create/models/block/asurine_natu e80a3d387e8c40bf886735d46a119f9a93c6f5a8 assets/create/models/block/asurine_natural_3.json 1c3ddf07bdd9fc5fcf7c1f35c7a06846cc1add54 assets/create/models/block/asurine_pillar.json 403efa3dcd07e94c351594cc6c5b5becc15e6690 assets/create/models/block/asurine_pillar_horizontal.json +daac4c886b0485449eff2f87d82754d387baba93 assets/create/models/block/bamboo_window.json +75f28c83adcd81ddd7f073596b04ddc5809b421e assets/create/models/block/bamboo_window_pane_noside.json +e70e053d438ec435395c416c6fa7a06aa0527762 assets/create/models/block/bamboo_window_pane_noside_alt.json +568c8603c7606bf77958d0855a7471e6a935bb54 assets/create/models/block/bamboo_window_pane_post.json +d9c964d9e0d77249f1e5caac8fc419ae533ee828 assets/create/models/block/bamboo_window_pane_side.json +c60adf74c20091675c4c9293e69fcc8ded8fef93 assets/create/models/block/bamboo_window_pane_side_alt.json 930e154155eaba67acb96109472b6d8c502907dc assets/create/models/block/birch_window.json 3ba397e70b642bdfa458dd3046b094ccf73b42e5 assets/create/models/block/birch_window_pane_noside.json 3ff792e09a83b47640083f4da20701e47e6a46bb assets/create/models/block/birch_window_pane_noside_alt.json @@ -771,6 +781,12 @@ b04c80852527a07e01c27686be678cbaf568e821 assets/create/models/block/brown_postbo 0e1fece0854ccea20df2f0abc865e4f44af54d1a assets/create/models/block/brown_valve_handle.json 40a224ce4ea989599f7bd66bd2437ac2b98247d8 assets/create/models/block/calcite_pillar.json 141fc72bb7296c6b5a13499622c0c7384179a7fa assets/create/models/block/calcite_pillar_horizontal.json +09cdcbe8056a81a0a825df47f5cb0e352f98907e assets/create/models/block/cherry_window.json +5275e27c80bdd43b40fa31418dfad175fc809480 assets/create/models/block/cherry_window_pane_noside.json +ae87368850bc6ef1a2e2f633b8ef6ed33ab5b2e0 assets/create/models/block/cherry_window_pane_noside_alt.json +0e5c58632e134aeae3e85e70d7c0ea1ed6e05055 assets/create/models/block/cherry_window_pane_post.json +b13184df1e1c20a7b94fa887ab64845e3b7d0fca assets/create/models/block/cherry_window_pane_side.json +d8e2f395915af41686924cb4654d43097260720c assets/create/models/block/cherry_window_pane_side_alt.json e9d61ba17fa2619af01ef604c3f65cbe9272f010 assets/create/models/block/chocolate.json d8339ab47ffa828985c7da27c37794a95aba8b42 assets/create/models/block/clockwork_bearing.json 8afe6afaff33b94c1fcee68fdaf842d525eec212 assets/create/models/block/copper_cap.json @@ -1773,6 +1789,8 @@ d5375c3de6272a00f3e3787fee6b8255f828d686 assets/create/models/item/andesite_tunn d6eb7105dd9b42adde48bd70e3f2fba70751c1db assets/create/models/item/asurine.json 8b61987c61ae461e4bea0fccf5b1bb3399ac9226 assets/create/models/item/asurine_pillar.json a8e9fab6ce8dc5da29b451c827663fb553669a23 assets/create/models/item/attribute_filter.json +2a57b4e07c5a853d4875fae7916cdb71f3b3f378 assets/create/models/item/bamboo_window.json +69f07020d66498909df3bd37fa6e1a09cb06788e assets/create/models/item/bamboo_window_pane.json 6913f9acbb272de28387918ce92984fa767b4389 assets/create/models/item/bar_of_chocolate.json def88cd2c79a1f0ed40bbf5a0332187dd1d6006e assets/create/models/item/basin.json 35a1e2cb2645a8386dfee2697b47547b3f9a1dd2 assets/create/models/item/belt_connector.json @@ -1829,6 +1847,8 @@ d5396690e7813c67ee3600555d7e47d0097b1f56 assets/create/models/item/cardboard_pac 9dccb21720687bbd516c8598c5449028077f8467 assets/create/models/item/cardboard_sword.json 1cdb2b8801551c1540bb9b2a9cc3d725a2b433e7 assets/create/models/item/cart_assembler.json 390a06d81c8c2a0ff83196bd0154dd292206e3b6 assets/create/models/item/chain_conveyor.json +74c265b6ea2df76ae1b2e8e920eaa91749f74c1a assets/create/models/item/cherry_window.json +30395c9018e273105b20cc35737f501696529acf assets/create/models/item/cherry_window_pane.json a197d08618f4035182c91a6b16031eb681ab8a7c assets/create/models/item/chest_minecart_contraption.json 293cfa8b1073f8641a2c623b73a90907576c36ed assets/create/models/item/chocolate_bucket.json 77654cbd16cdfa95181ea3f85fcfa3cd352b69fd assets/create/models/item/chocolate_glazed_berries.json @@ -2456,10 +2476,14 @@ a2b7fe4d1b1c8d173da0e6dfcf41379648a92a80 data/create/advancements/recipes/buildi ab03b83587129f06998ec86e9c417e622baff713 data/create/advancements/recipes/building_blocks/andesite_pillar_from_stone_types_andesite_stonecutting.json 676eca0ab460b460ae76c66926ac91da4612a201 data/create/advancements/recipes/building_blocks/asurine_from_stone_types_asurine_stonecutting.json fb36a2f400347c3291978a49e59374f3ac459f14 data/create/advancements/recipes/building_blocks/asurine_pillar_from_stone_types_asurine_stonecutting.json +a41990f2ea73c54ce3af41a3a61c4fdd4134d3b9 data/create/advancements/recipes/building_blocks/bamboo_window.json +b25b8c230fde8d6d77e8d516bed52236652b5ca6 data/create/advancements/recipes/building_blocks/bamboo_window_pane.json 7a7eb78c70e1591d339115b367cd3114fb7c1799 data/create/advancements/recipes/building_blocks/birch_window.json 6df6a6885c3ebf92f98f105be16d8e0c80da19f0 data/create/advancements/recipes/building_blocks/birch_window_pane.json 0d724aefa51b969dbadb59b1193172a44ecf5644 data/create/advancements/recipes/building_blocks/calcite_from_stone_types_calcite_stonecutting.json 537fe5dffa659e5838379587fbd84f2f641551ea data/create/advancements/recipes/building_blocks/calcite_pillar_from_stone_types_calcite_stonecutting.json +2636ac059b6412a46402cccbe5abe4fb49143662 data/create/advancements/recipes/building_blocks/cherry_window.json +3e08f575543f1e0abea979dbaee643572734788b data/create/advancements/recipes/building_blocks/cherry_window_pane.json 09f332cd34e6a92af9e8e4e757418c7ba8b536da data/create/advancements/recipes/building_blocks/copper_shingles_from_ingots_copper_stonecutting.json 55214a0fd27318b17163cace66c7525785127ef8 data/create/advancements/recipes/building_blocks/copper_shingle_slab.json fb4210dbbfb74459e10da94a540f3bfdf91c4a8d data/create/advancements/recipes/building_blocks/copper_shingle_slab_from_copper_shingles_stonecutting.json @@ -3128,6 +3152,8 @@ ac6b9e99a900f203f69c5127cc44c0de48b0d946 data/create/loot_tables/blocks/andesite 1c6f1dd9ec49b7db86e43706e940208b51e0f6d5 data/create/loot_tables/blocks/andesite_tunnel.json d408536459078c1d72770b7431137d7d8d8ff3bb data/create/loot_tables/blocks/asurine.json 3129cb3d97d657bf16ea5973b3bde1e31ff054c7 data/create/loot_tables/blocks/asurine_pillar.json +858038cff810f9b47e37e5c80064370573d73255 data/create/loot_tables/blocks/bamboo_window.json +76843e927185385fbdfe403577eb4a85a60e25bd data/create/loot_tables/blocks/bamboo_window_pane.json 8ac6f7a29c32e636b0639ac2caaa60882617f675 data/create/loot_tables/blocks/basin.json d964b7a8f6a4ce28ce640d31a01e77eafcc181e5 data/create/loot_tables/blocks/belt.json a268eb02c10015a901a6543595b2b815a8026d78 data/create/loot_tables/blocks/birch_window.json @@ -3172,6 +3198,8 @@ bfa0365507a888134c20b36af4bd7944263687f0 data/create/loot_tables/blocks/brown_po 3d65461b1fc2667f446aefa2853621c06068bb38 data/create/loot_tables/blocks/cardboard_block.json 515c839deea520b07b03f7ba65c4a7b22fdf5ba3 data/create/loot_tables/blocks/cart_assembler.json aadd8aa7f8433896bd4fea56f43e496cbc5be25a data/create/loot_tables/blocks/chain_conveyor.json +5c79f6384b77fc0d817a17f65f3cdfef34a7a039 data/create/loot_tables/blocks/cherry_window.json +d2e962b8cfc208d0c8af5f4b79311b9df14b1738 data/create/loot_tables/blocks/cherry_window_pane.json fb4877d45df15be1a74378ab28f23fbf9d0657ef data/create/loot_tables/blocks/chute.json ace9255cbdd1af5e5068916d2a6bed2f861f81f1 data/create/loot_tables/blocks/clipboard.json bfd871acdde6c239098ead188a5aad7636d11bc0 data/create/loot_tables/blocks/clockwork_bearing.json @@ -3747,6 +3775,8 @@ b9648ec56e55fe2b9d54adf172405519a46bfa66 data/create/loot_tables/blocks/yellow_v 367e57a760156a19fc6805a0f23c3f8194cd4255 data/create/recipes/andesite_scaffolding_from_andesite_alloy_stonecutting.json 5272c61c8c17eb7a528cade93bbc80fd9ef51521 data/create/recipes/asurine_from_stone_types_asurine_stonecutting.json 5bf4b9baf782a461efc36d463b99b9acb0ab4607 data/create/recipes/asurine_pillar_from_stone_types_asurine_stonecutting.json +6e54f07090c60a8163038672bcbf47464219bb9b data/create/recipes/bamboo_window.json +9a243cb03b882d90760ffba791ab78ffe9daade3 data/create/recipes/bamboo_window_pane.json 41f53dd9817c3cc9613c8e97ff8f9ffb895e2b0e data/create/recipes/birch_window.json 998dbc2cc27888a28f009b8e408b7091baac9255 data/create/recipes/birch_window_pane.json 5965f3abe435ac0b3a39d8ec31af71808592642b data/create/recipes/brass_bars_from_ingots_brass_stonecutting.json @@ -3754,6 +3784,8 @@ b9648ec56e55fe2b9d54adf172405519a46bfa66 data/create/loot_tables/blocks/yellow_v 9c685014019a7a4f1ef47f235cd1e9b3f9093295 data/create/recipes/brass_scaffolding_from_ingots_brass_stonecutting.json 8f21b67e168a14d354b6c00b5ec795355fdd4209 data/create/recipes/calcite_from_stone_types_calcite_stonecutting.json da3692808565988e21ec5b1d5e976338ccc4a037 data/create/recipes/calcite_pillar_from_stone_types_calcite_stonecutting.json +79bd6c532172149ede8e161f2809362d90f87e7d data/create/recipes/cherry_window.json +22557ebdbe69634968c97e7f348307fdea34d97f data/create/recipes/cherry_window_pane.json 1157b2eab2ada187ea80feae298b77ed7ece4bfd data/create/recipes/copper_bars_from_ingots_copper_stonecutting.json b9d4f55128aa03ee6f6ab1831e709629a42c147e data/create/recipes/copper_ladder_from_ingots_copper_stonecutting.json 922c5ac48c8eb8b3a39f5626a381c2252fbac107 data/create/recipes/copper_scaffolding_from_ingots_copper_stonecutting.json @@ -4472,7 +4504,7 @@ c59c9fc0cdd45de659aa8023d36f9decb90f708c data/create/tags/items/vanilla_stripped 64441ac1daa64c81601b94b82b21c0ee862b6344 data/create/tags/items/vanilla_stripped_wood.json edf7390f09e622193bbc720ec51ba128ea1e96e6 data/curios/tags/items/head.json 10d5f0c1763f80860a39398ecc33dbbe43099471 data/forge/tags/blocks/glass/colorless.json -de1fc89be6a52473d526d3efe0204b9b8489058c data/forge/tags/blocks/glass_panes.json +26304ec2e243fa4268afa580ff2a199503d9a30a data/forge/tags/blocks/glass_panes.json 81b107ada9c6ac5679a21f8c6a006bf230f69c39 data/forge/tags/blocks/ores.json 81b107ada9c6ac5679a21f8c6a006bf230f69c39 data/forge/tags/blocks/ores/zinc.json e475ad1c52bffedfc544e5331a87c1f5c45149fd data/forge/tags/blocks/ores_in_ground/deepslate.json @@ -4500,7 +4532,7 @@ afdac448376ff5624f49cbf31feedf691ecbc4c5 data/forge/tags/items/armors/leggings.j 745512f10c4ba52f2c224607377e41011fb2ecfe data/forge/tags/items/flour.json 745512f10c4ba52f2c224607377e41011fb2ecfe data/forge/tags/items/flour/wheat.json 10d5f0c1763f80860a39398ecc33dbbe43099471 data/forge/tags/items/glass/colorless.json -de1fc89be6a52473d526d3efe0204b9b8489058c data/forge/tags/items/glass_panes.json +26304ec2e243fa4268afa580ff2a199503d9a30a data/forge/tags/items/glass_panes.json 01d32d3b7b033aff44c047bf289d696de0b0c715 data/forge/tags/items/ingots.json 5a7bffd1d604bc6ea8b35714ef02b95773240f90 data/forge/tags/items/ingots/brass.json ccf5b08295f6362a3f6b3b595f1de1bba4b224ec data/forge/tags/items/ingots/zinc.json @@ -4535,7 +4567,7 @@ c741ba83b562ae3459d7c4f2db69537f549ea411 data/forge/tags/items/tools/wrench.json 82274e06b6a9f3bfd83c8b59be38dee4a15b8bf3 data/minecraft/tags/blocks/climbable.json 71aef080a900d9e86818cf579438c3d826d6567e data/minecraft/tags/blocks/doors.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/dripstone_replaceable_blocks.json -e3321ff14704c031a2c16953b7e391f4f24dd70b data/minecraft/tags/blocks/impermeable.json +a25d96534556d2e526ed5d1efbd5f6c352457abf data/minecraft/tags/blocks/impermeable.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/lush_ground_replaceable.json 4cf669239caa93951fd8e243a03e9157d2d06208 data/minecraft/tags/blocks/mineable/axe.json f816879274e6f561b67f460358e77f6084390d77 data/minecraft/tags/blocks/mineable/pickaxe.json diff --git a/src/generated/resources/assets/create/blockstates/bamboo_window.json b/src/generated/resources/assets/create/blockstates/bamboo_window.json new file mode 100644 index 0000000000..1c3d582245 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/bamboo_window.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/bamboo_window" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/bamboo_window_pane.json b/src/generated/resources/assets/create/blockstates/bamboo_window_pane.json new file mode 100644 index 0000000000..08a969744e --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/bamboo_window_pane.json @@ -0,0 +1,77 @@ +{ + "multipart": [ + { + "apply": { + "model": "create:block/bamboo_window_pane_post" + } + }, + { + "apply": { + "model": "create:block/bamboo_window_pane_side" + }, + "when": { + "north": "true" + } + }, + { + "apply": { + "model": "create:block/bamboo_window_pane_noside" + }, + "when": { + "north": "false" + } + }, + { + "apply": { + "model": "create:block/bamboo_window_pane_side_alt" + }, + "when": { + "south": "true" + } + }, + { + "apply": { + "model": "create:block/bamboo_window_pane_noside_alt", + "y": 90 + }, + "when": { + "south": "false" + } + }, + { + "apply": { + "model": "create:block/bamboo_window_pane_side_alt", + "y": 90 + }, + "when": { + "west": "true" + } + }, + { + "apply": { + "model": "create:block/bamboo_window_pane_noside", + "y": 270 + }, + "when": { + "west": "false" + } + }, + { + "apply": { + "model": "create:block/bamboo_window_pane_side", + "y": 90 + }, + "when": { + "east": "true" + } + }, + { + "apply": { + "model": "create:block/bamboo_window_pane_noside_alt" + }, + "when": { + "east": "false" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/cherry_window.json b/src/generated/resources/assets/create/blockstates/cherry_window.json new file mode 100644 index 0000000000..c842e75dbc --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/cherry_window.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/cherry_window" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/cherry_window_pane.json b/src/generated/resources/assets/create/blockstates/cherry_window_pane.json new file mode 100644 index 0000000000..4232dc3a56 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/cherry_window_pane.json @@ -0,0 +1,77 @@ +{ + "multipart": [ + { + "apply": { + "model": "create:block/cherry_window_pane_post" + } + }, + { + "apply": { + "model": "create:block/cherry_window_pane_side" + }, + "when": { + "north": "true" + } + }, + { + "apply": { + "model": "create:block/cherry_window_pane_noside" + }, + "when": { + "north": "false" + } + }, + { + "apply": { + "model": "create:block/cherry_window_pane_side_alt" + }, + "when": { + "south": "true" + } + }, + { + "apply": { + "model": "create:block/cherry_window_pane_noside_alt", + "y": 90 + }, + "when": { + "south": "false" + } + }, + { + "apply": { + "model": "create:block/cherry_window_pane_side_alt", + "y": 90 + }, + "when": { + "west": "true" + } + }, + { + "apply": { + "model": "create:block/cherry_window_pane_noside", + "y": 270 + }, + "when": { + "west": "false" + } + }, + { + "apply": { + "model": "create:block/cherry_window_pane_side", + "y": 90 + }, + "when": { + "east": "true" + } + }, + { + "apply": { + "model": "create:block/cherry_window_pane_noside_alt" + }, + "when": { + "east": "false" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index de6911bec5..39b95b0627 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -205,6 +205,8 @@ "block.create.andesite_tunnel": "ןǝuun⟘ ǝʇısǝpuⱯ", "block.create.asurine": "ǝuıɹnsⱯ", "block.create.asurine_pillar": "ɹɐןןıԀ ǝuıɹnsⱯ", + "block.create.bamboo_window": "ʍopuıM ooqɯɐᗺ", + "block.create.bamboo_window_pane": "ǝuɐԀ ʍopuıM ooqɯɐᗺ", "block.create.basin": "uısɐᗺ", "block.create.belt": "ʇןǝᗺ", "block.create.birch_window": "ʍopuıM ɥɔɹıᗺ", @@ -249,6 +251,8 @@ "block.create.cardboard_block": "pɹɐoqpɹɐƆ ɟo ʞɔoןᗺ", "block.create.cart_assembler": "ɹǝןqɯǝssⱯ ʇɹɐƆ", "block.create.chain_conveyor": "ɹoʎǝʌuoƆ uıɐɥƆ", + "block.create.cherry_window": "ʍopuıM ʎɹɹǝɥƆ", + "block.create.cherry_window_pane": "ǝuɐԀ ʍopuıM ʎɹɹǝɥƆ", "block.create.chocolate": "ǝʇɐןoɔoɥƆ", "block.create.chute": "ǝʇnɥƆ", "block.create.clipboard": "pɹɐoqdıןƆ", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index c3dbc19298..7ed78cdae4 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -205,6 +205,8 @@ "block.create.andesite_tunnel": "Andesite Tunnel", "block.create.asurine": "Asurine", "block.create.asurine_pillar": "Asurine Pillar", + "block.create.bamboo_window": "Bamboo Window", + "block.create.bamboo_window_pane": "Bamboo Window Pane", "block.create.basin": "Basin", "block.create.belt": "Belt", "block.create.birch_window": "Birch Window", @@ -249,6 +251,8 @@ "block.create.cardboard_block": "Block of Cardboard", "block.create.cart_assembler": "Cart Assembler", "block.create.chain_conveyor": "Chain Conveyor", + "block.create.cherry_window": "Cherry Window", + "block.create.cherry_window_pane": "Cherry Window Pane", "block.create.chocolate": "Chocolate", "block.create.chute": "Chute", "block.create.clipboard": "Clipboard", diff --git a/src/generated/resources/assets/create/models/block/bamboo_window.json b/src/generated/resources/assets/create/models/block/bamboo_window.json new file mode 100644 index 0000000000..832c3b256b --- /dev/null +++ b/src/generated/resources/assets/create/models/block/bamboo_window.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "minecraft:block/bamboo_planks", + "side": "create:block/palettes/bamboo_window" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/bamboo_window_pane_noside.json b/src/generated/resources/assets/create/models/block/bamboo_window_pane_noside.json new file mode 100644 index 0000000000..f721c82c3d --- /dev/null +++ b/src/generated/resources/assets/create/models/block/bamboo_window_pane_noside.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/connected_glass_pane/noside", + "textures": { + "edge": "minecraft:block/bamboo_planks", + "pane": "create:block/palettes/bamboo_window" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/bamboo_window_pane_noside_alt.json b/src/generated/resources/assets/create/models/block/bamboo_window_pane_noside_alt.json new file mode 100644 index 0000000000..05e942f80b --- /dev/null +++ b/src/generated/resources/assets/create/models/block/bamboo_window_pane_noside_alt.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/connected_glass_pane/noside_alt", + "textures": { + "edge": "minecraft:block/bamboo_planks", + "pane": "create:block/palettes/bamboo_window" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/bamboo_window_pane_post.json b/src/generated/resources/assets/create/models/block/bamboo_window_pane_post.json new file mode 100644 index 0000000000..7bf9489eca --- /dev/null +++ b/src/generated/resources/assets/create/models/block/bamboo_window_pane_post.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/connected_glass_pane/post", + "textures": { + "edge": "minecraft:block/bamboo_planks", + "pane": "create:block/palettes/bamboo_window" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/bamboo_window_pane_side.json b/src/generated/resources/assets/create/models/block/bamboo_window_pane_side.json new file mode 100644 index 0000000000..3a5e28cfc6 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/bamboo_window_pane_side.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/connected_glass_pane/side", + "textures": { + "edge": "minecraft:block/bamboo_planks", + "pane": "create:block/palettes/bamboo_window" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/bamboo_window_pane_side_alt.json b/src/generated/resources/assets/create/models/block/bamboo_window_pane_side_alt.json new file mode 100644 index 0000000000..1be0a9c1b2 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/bamboo_window_pane_side_alt.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/connected_glass_pane/side_alt", + "textures": { + "edge": "minecraft:block/bamboo_planks", + "pane": "create:block/palettes/bamboo_window" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/cherry_window.json b/src/generated/resources/assets/create/models/block/cherry_window.json new file mode 100644 index 0000000000..3c02e74959 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/cherry_window.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "minecraft:block/cherry_planks", + "side": "create:block/palettes/cherry_window" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/cherry_window_pane_noside.json b/src/generated/resources/assets/create/models/block/cherry_window_pane_noside.json new file mode 100644 index 0000000000..1b5bf0a3d0 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/cherry_window_pane_noside.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/connected_glass_pane/noside", + "textures": { + "edge": "minecraft:block/cherry_planks", + "pane": "create:block/palettes/cherry_window" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/cherry_window_pane_noside_alt.json b/src/generated/resources/assets/create/models/block/cherry_window_pane_noside_alt.json new file mode 100644 index 0000000000..3f23c0d4b7 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/cherry_window_pane_noside_alt.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/connected_glass_pane/noside_alt", + "textures": { + "edge": "minecraft:block/cherry_planks", + "pane": "create:block/palettes/cherry_window" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/cherry_window_pane_post.json b/src/generated/resources/assets/create/models/block/cherry_window_pane_post.json new file mode 100644 index 0000000000..c175bc7352 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/cherry_window_pane_post.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/connected_glass_pane/post", + "textures": { + "edge": "minecraft:block/cherry_planks", + "pane": "create:block/palettes/cherry_window" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/cherry_window_pane_side.json b/src/generated/resources/assets/create/models/block/cherry_window_pane_side.json new file mode 100644 index 0000000000..03bf47f9ae --- /dev/null +++ b/src/generated/resources/assets/create/models/block/cherry_window_pane_side.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/connected_glass_pane/side", + "textures": { + "edge": "minecraft:block/cherry_planks", + "pane": "create:block/palettes/cherry_window" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/cherry_window_pane_side_alt.json b/src/generated/resources/assets/create/models/block/cherry_window_pane_side_alt.json new file mode 100644 index 0000000000..edfbf362fb --- /dev/null +++ b/src/generated/resources/assets/create/models/block/cherry_window_pane_side_alt.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/connected_glass_pane/side_alt", + "textures": { + "edge": "minecraft:block/cherry_planks", + "pane": "create:block/palettes/cherry_window" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/bamboo_window.json b/src/generated/resources/assets/create/models/item/bamboo_window.json new file mode 100644 index 0000000000..4d7ca412ea --- /dev/null +++ b/src/generated/resources/assets/create/models/item/bamboo_window.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/bamboo_window" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/bamboo_window_pane.json b/src/generated/resources/assets/create/models/item/bamboo_window_pane.json new file mode 100644 index 0000000000..d0839f8b6e --- /dev/null +++ b/src/generated/resources/assets/create/models/item/bamboo_window_pane.json @@ -0,0 +1,7 @@ +{ + "parent": "create:item/pane", + "textures": { + "edge": "minecraft:block/bamboo_planks", + "pane": "create:block/palettes/bamboo_window" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cherry_window.json b/src/generated/resources/assets/create/models/item/cherry_window.json new file mode 100644 index 0000000000..02a0066dc5 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cherry_window.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/cherry_window" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cherry_window_pane.json b/src/generated/resources/assets/create/models/item/cherry_window_pane.json new file mode 100644 index 0000000000..c99c15abd6 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cherry_window_pane.json @@ -0,0 +1,7 @@ +{ + "parent": "create:item/pane", + "textures": { + "edge": "minecraft:block/cherry_planks", + "pane": "create:block/palettes/cherry_window" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/bamboo_window.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/bamboo_window.json new file mode 100644 index 0000000000..486cef41ee --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/bamboo_window.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_ingredient": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:bamboo_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:bamboo_window" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_ingredient", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:bamboo_window" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/bamboo_window_pane.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/bamboo_window_pane.json new file mode 100644 index 0000000000..246b3c6e95 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/bamboo_window_pane.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_ingredient": { + "conditions": { + "items": [ + { + "items": [ + "create:bamboo_window" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:bamboo_window_pane" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_ingredient", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:bamboo_window_pane" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/cherry_window.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/cherry_window.json new file mode 100644 index 0000000000..747782465e --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/cherry_window.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_ingredient": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:cherry_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:cherry_window" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_ingredient", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:cherry_window" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/cherry_window_pane.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/cherry_window_pane.json new file mode 100644 index 0000000000..b252e6f55e --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/cherry_window_pane.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_ingredient": { + "conditions": { + "items": [ + { + "items": [ + "create:cherry_window" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:cherry_window_pane" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_ingredient", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:cherry_window_pane" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/bamboo_window.json b/src/generated/resources/data/create/loot_tables/blocks/bamboo_window.json new file mode 100644 index 0000000000..cd9311d3fe --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/bamboo_window.json @@ -0,0 +1,31 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:bamboo_window" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/bamboo_window" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/bamboo_window_pane.json b/src/generated/resources/data/create/loot_tables/blocks/bamboo_window_pane.json new file mode 100644 index 0000000000..02dbdcef1e --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/bamboo_window_pane.json @@ -0,0 +1,31 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:bamboo_window_pane" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/bamboo_window_pane" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/cherry_window.json b/src/generated/resources/data/create/loot_tables/blocks/cherry_window.json new file mode 100644 index 0000000000..4d2da071ce --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/cherry_window.json @@ -0,0 +1,31 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:cherry_window" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/cherry_window" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/cherry_window_pane.json b/src/generated/resources/data/create/loot_tables/blocks/cherry_window_pane.json new file mode 100644 index 0000000000..64438e0e08 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/cherry_window_pane.json @@ -0,0 +1,31 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:cherry_window_pane" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/cherry_window_pane" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/bamboo_window.json b/src/generated/resources/data/create/recipes/bamboo_window.json new file mode 100644 index 0000000000..f88d802f5b --- /dev/null +++ b/src/generated/resources/data/create/recipes/bamboo_window.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "minecraft:bamboo_planks" + }, + "X": { + "tag": "forge:glass/colorless" + } + }, + "pattern": [ + " # ", + "#X#" + ], + "result": { + "count": 2, + "item": "create:bamboo_window" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/bamboo_window_pane.json b/src/generated/resources/data/create/recipes/bamboo_window_pane.json new file mode 100644 index 0000000000..3dd1289f99 --- /dev/null +++ b/src/generated/resources/data/create/recipes/bamboo_window_pane.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "create:bamboo_window" + } + }, + "pattern": [ + "###", + "###" + ], + "result": { + "count": 16, + "item": "create:bamboo_window_pane" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cherry_window.json b/src/generated/resources/data/create/recipes/cherry_window.json new file mode 100644 index 0000000000..cbd29ee9c1 --- /dev/null +++ b/src/generated/resources/data/create/recipes/cherry_window.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "minecraft:cherry_planks" + }, + "X": { + "tag": "forge:glass/colorless" + } + }, + "pattern": [ + " # ", + "#X#" + ], + "result": { + "count": 2, + "item": "create:cherry_window" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cherry_window_pane.json b/src/generated/resources/data/create/recipes/cherry_window_pane.json new file mode 100644 index 0000000000..a13694b665 --- /dev/null +++ b/src/generated/resources/data/create/recipes/cherry_window_pane.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "create:cherry_window" + } + }, + "pattern": [ + "###", + "###" + ], + "result": { + "count": 16, + "item": "create:cherry_window_pane" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/blocks/glass_panes.json b/src/generated/resources/data/forge/tags/blocks/glass_panes.json index ec99a30f53..ceaa578ec9 100644 --- a/src/generated/resources/data/forge/tags/blocks/glass_panes.json +++ b/src/generated/resources/data/forge/tags/blocks/glass_panes.json @@ -13,6 +13,8 @@ "create:mangrove_window_pane", "create:crimson_window_pane", "create:warped_window_pane", + "create:cherry_window_pane", + "create:bamboo_window_pane", "create:ornate_iron_window_pane" ] } \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/glass_panes.json b/src/generated/resources/data/forge/tags/items/glass_panes.json index ec99a30f53..ceaa578ec9 100644 --- a/src/generated/resources/data/forge/tags/items/glass_panes.json +++ b/src/generated/resources/data/forge/tags/items/glass_panes.json @@ -13,6 +13,8 @@ "create:mangrove_window_pane", "create:crimson_window_pane", "create:warped_window_pane", + "create:cherry_window_pane", + "create:bamboo_window_pane", "create:ornate_iron_window_pane" ] } \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/impermeable.json b/src/generated/resources/data/minecraft/tags/blocks/impermeable.json index f6c6369fb4..f83f1e59e3 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/impermeable.json +++ b/src/generated/resources/data/minecraft/tags/blocks/impermeable.json @@ -13,6 +13,8 @@ "create:mangrove_window", "create:crimson_window", "create:warped_window", + "create:cherry_window", + "create:bamboo_window", "create:ornate_iron_window" ] } \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllSpriteShifts.java b/src/main/java/com/simibubi/create/AllSpriteShifts.java index fe05ed85db..ffff1fb1f4 100644 --- a/src/main/java/com/simibubi/create/AllSpriteShifts.java +++ b/src/main/java/com/simibubi/create/AllSpriteShifts.java @@ -88,7 +88,8 @@ public class AllSpriteShifts { private static void populateMaps() { WoodType[] supportedWoodTypes = new WoodType[] { WoodType.OAK, WoodType.SPRUCE, WoodType.BIRCH, WoodType.ACACIA, - WoodType.JUNGLE, WoodType.DARK_OAK, WoodType.MANGROVE, WoodType.CRIMSON, WoodType.WARPED }; + WoodType.JUNGLE, WoodType.DARK_OAK, WoodType.MANGROVE, WoodType.CRIMSON, WoodType.WARPED, WoodType.CHERRY, + WoodType.BAMBOO }; Arrays.stream(supportedWoodTypes) .forEach(woodType -> WOODEN_WINDOWS.put(woodType, vertical("palettes/" + woodType.name() + "_window"))); diff --git a/src/main/java/com/simibubi/create/content/decoration/palettes/AllPaletteBlocks.java b/src/main/java/com/simibubi/create/content/decoration/palettes/AllPaletteBlocks.java index 257603ed55..4af72de951 100644 --- a/src/main/java/com/simibubi/create/content/decoration/palettes/AllPaletteBlocks.java +++ b/src/main/java/com/simibubi/create/content/decoration/palettes/AllPaletteBlocks.java @@ -77,6 +77,8 @@ public class AllPaletteBlocks { MANGROVE_WINDOW = woodenWindowBlock(WoodType.MANGROVE, Blocks.MANGROVE_PLANKS), CRIMSON_WINDOW = woodenWindowBlock(WoodType.CRIMSON, Blocks.CRIMSON_PLANKS), WARPED_WINDOW = woodenWindowBlock(WoodType.WARPED, Blocks.WARPED_PLANKS), + CHERRY_WINDOW = woodenWindowBlock(WoodType.CHERRY, Blocks.CHERRY_PLANKS), + BAMBOO_WINDOW = woodenWindowBlock(WoodType.BAMBOO, Blocks.BAMBOO_PLANKS), ORNATE_IRON_WINDOW = customWindowBlock("ornate_iron_window", () -> Items.IRON_NUGGET, () -> AllSpriteShifts.ORNATE_IRON_WINDOW, () -> RenderType::cutout, false, () -> MapColor.TERRACOTTA_LIGHT_GRAY); @@ -91,6 +93,8 @@ public class AllPaletteBlocks { MANGROVE_WINDOW_PANE = woodenWindowPane(WoodType.MANGROVE, MANGROVE_WINDOW), CRIMSON_WINDOW_PANE = woodenWindowPane(WoodType.CRIMSON, CRIMSON_WINDOW), WARPED_WINDOW_PANE = woodenWindowPane(WoodType.WARPED, WARPED_WINDOW), + CHERRY_WINDOW_PANE = woodenWindowPane(WoodType.CHERRY, CHERRY_WINDOW), + BAMBOO_WINDOW_PANE = woodenWindowPane(WoodType.BAMBOO, BAMBOO_WINDOW), ORNATE_IRON_WINDOW_PANE = customWindowPane("ornate_iron_window", ORNATE_IRON_WINDOW, () -> AllSpriteShifts.ORNATE_IRON_WINDOW, () -> RenderType::cutoutMipped); diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryScreen.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryScreen.java index 325ac565b2..870f48a5de 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryScreen.java @@ -7,6 +7,8 @@ import java.util.Optional; import javax.annotation.Nullable; +import org.lwjgl.glfw.GLFW; + import com.google.common.collect.ImmutableList; import com.mojang.blaze3d.platform.InputConstants; import com.mojang.blaze3d.vertex.PoseStack; @@ -352,13 +354,16 @@ public class StockKeeperCategoryScreen extends AbstractSimiContainerScreenPx$dr3q=R5*=|lfg>EKoEw%v@yaYiUm)C2gQSW@c{&}2T#63uR`CzC+IWuHN1Kd zJbRLY6r=%Ti=j#aX;!V3^$-#_HCFeuJG1l8KmW{F{p*$vlbD86W391)x3UhvBzXoX z-li>%MmWo>gh`AIkg5;flRBvinA(pxGY!Dhwjg{g0CIcss@dJ~Ac?U>JY0!6I=!&E zou&pjJHN81IHo_iX=?y0xM}O2@AGi~#=*YF)V8?0P1xRYOThy_E%}cRHyMQEtOOHv zI1GMeVEQu#V{D}+xUy8xbEQtV)6`WA=1T$Q7@X`a)WG!T_nP@ZsYz8_=}hf1b_qbl zTNqrGpeEvxs*l2us?R@Jm|%ql-A+^I#@|E~$%f}!@TIbd{p*%?rM^%^XQqq4K-R`Q ztB6MwMgMA}h({WZvr&dIXXjVe<(9j!jix_uqcy*cP`!cXmd4SDwZ;ZL-~ZO&>19T$ r0$iyRN24Fvhr^(_C$Ac3Ih)`wcS+{9f2l>M00000NkvXXu0mjfIjhi% literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/palettes/bamboo_window_connected.png b/src/main/resources/assets/create/textures/block/palettes/bamboo_window_connected.png new file mode 100644 index 0000000000000000000000000000000000000000..04d640665e740ef06d86c722a9b0b666629cbcdf GIT binary patch literal 667 zcmV;M0%ZM(P)Px%RY^oaR9J=WR@yMw)y0DuKEfa#rDfc{4h67S!+Koo-bgMLfWyg|Pu&rY4p=08U<0HA4`81!3` z^Mubhcj55FD_W%6yDdC{Zuh@mO8_8#xA)cXhMkRk-R`$PNC0UB2K|=&^wGtF8Ea3V z+l81T7EdYyaS!NOwec^HNTILGH_L>x%|dmM zxroYoIzrJ!RF%Kd6VkZITkrft*}d}Px$tVu*cR5*=&lOb>#K@^6+Wq`XWbOs1BDVRZk90rxBoP$BNm_&3sO$27oByH1j40kZI72IC#4(OV_d2jc<|Nq{ta4yajrUB+7 zVrxEI?a6pFKley0&qJ6-EJ&e<9FD@X+5BV5jXIddDj)31^GJtXqL*!(=BXv34X-|b zQsqV+3dIL?Kx(b?hRXnZA3loPZ{Okfuh7=QoswF()4;2Nv~9|@XH0rsl`JrBS<0XO zB`i`X0t6NSIUI$Zz_>X^jsO4v07*qoM6N<$g8BO5cK`qY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/palettes/cherry_window_connected.png b/src/main/resources/assets/create/textures/block/palettes/cherry_window_connected.png new file mode 100644 index 0000000000000000000000000000000000000000..ea5d4a832fd3bde976151275d908303b89cd95fb GIT binary patch literal 683 zcmV;c0#yBpP)Px%Wl2OqR9J=WRxNDXKotHiN@6R?+N6z?*itl21yw;xx}hj#9oo>y*uc=xz+g#8 z;J{E(L0Cvof@0RHs0(SpG;IYTXR`mrk)1@k0q3qh$F5p?&_`_f-S_Uh_r3T0h&dcE zs0yIwAT4|5KKzI;Uh;QI800l?1dH^h6G_Vk&s=V~=DhZCq& z*A728Zb^*CAKtU_-Y!rqiM@UTnS24})ffQQ@SFs_{0IQhpF9S09HgXhh8zw6^|$ZH zw@;seUq6K`3u`Lu{PudY5s23gj|fx++J0Tw7uFOh;Y3wH4Flz!N0@Xw%x_O zM)To-nP&#$iRZ_20-1aPWYX=htgf$T>8d(7>mW_p?>|^rQ^diqa=`INOk`}BrqYUm zPi69jK!aDaAWZ>R|G0QJ0;(b<#`Wn5D^@EwIBpRhT5~v%?2@M#c##A5uH$9{b4mdK zaqua=;ZAi7+|;p8_o#R`0$bZshq|q|Yx{LK^S8D!|MA_8Kny(b>fx``u--oDcG%LI z`7ap>FLFTq^}_yw{_plo%7Li(^wOGP`Q Date: Wed, 30 Oct 2024 23:36:50 +0100 Subject: [PATCH 099/515] Windows 13 - Added industrial iron windows --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 28 +++++-- .../blockstates/industrial_iron_window.json | 7 ++ .../industrial_iron_window_pane.json | 77 ++++++++++++++++++ .../resources/assets/create/lang/en_ud.json | 2 + .../resources/assets/create/lang/en_us.json | 2 + .../models/block/industrial_iron_window.json | 7 ++ .../industrial_iron_window_pane_noside.json | 7 ++ ...ndustrial_iron_window_pane_noside_alt.json | 7 ++ .../industrial_iron_window_pane_post.json | 7 ++ .../industrial_iron_window_pane_side.json | 7 ++ .../industrial_iron_window_pane_side_alt.json | 7 ++ .../models/item/industrial_iron_window.json | 3 + .../item/industrial_iron_window_pane.json | 7 ++ .../industrial_iron_window.json | 35 ++++++++ .../industrial_iron_window_pane.json | 35 ++++++++ .../blocks/industrial_iron_window.json | 31 +++++++ .../blocks/industrial_iron_window_pane.json | 31 +++++++ .../recipes/industrial_iron_window.json | 21 +++++ .../recipes/industrial_iron_window_pane.json | 18 ++++ .../data/forge/tags/blocks/glass_panes.json | 3 +- .../data/forge/tags/items/glass_panes.json | 3 +- .../minecraft/tags/blocks/impermeable.json | 3 +- .../com/simibubi/create/AllSpriteShifts.java | 3 +- .../decoration/palettes/AllPaletteBlocks.java | 9 +- .../displayCloth/DisplayClothBlock.java | 3 + .../block/palettes/industrial_iron_window.png | Bin 0 -> 351 bytes .../industrial_iron_window_connected.png | Bin 0 -> 1415 bytes .../palettes/industrial_iron_window_end.png | Bin 0 -> 268 bytes .../industrial_iron_window_pane_top.png | Bin 0 -> 182 bytes 29 files changed, 351 insertions(+), 12 deletions(-) create mode 100644 src/generated/resources/assets/create/blockstates/industrial_iron_window.json create mode 100644 src/generated/resources/assets/create/blockstates/industrial_iron_window_pane.json create mode 100644 src/generated/resources/assets/create/models/block/industrial_iron_window.json create mode 100644 src/generated/resources/assets/create/models/block/industrial_iron_window_pane_noside.json create mode 100644 src/generated/resources/assets/create/models/block/industrial_iron_window_pane_noside_alt.json create mode 100644 src/generated/resources/assets/create/models/block/industrial_iron_window_pane_post.json create mode 100644 src/generated/resources/assets/create/models/block/industrial_iron_window_pane_side.json create mode 100644 src/generated/resources/assets/create/models/block/industrial_iron_window_pane_side_alt.json create mode 100644 src/generated/resources/assets/create/models/item/industrial_iron_window.json create mode 100644 src/generated/resources/assets/create/models/item/industrial_iron_window_pane.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/industrial_iron_window.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/industrial_iron_window_pane.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/industrial_iron_window.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/industrial_iron_window_pane.json create mode 100644 src/generated/resources/data/create/recipes/industrial_iron_window.json create mode 100644 src/generated/resources/data/create/recipes/industrial_iron_window_pane.json create mode 100644 src/main/resources/assets/create/textures/block/palettes/industrial_iron_window.png create mode 100644 src/main/resources/assets/create/textures/block/palettes/industrial_iron_window_connected.png create mode 100644 src/main/resources/assets/create/textures/block/palettes/industrial_iron_window_end.png create mode 100644 src/main/resources/assets/create/textures/block/palettes/industrial_iron_window_pane_top.png diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 7cf63584cd..660d2db89d 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-10-30T18:22:23.0602544 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-10-30T19:35:41.3745103 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -284,6 +284,8 @@ d0b26c085df3ee5189082bc18945e5f74ee529fa assets/create/blockstates/haunted_bell. bffc2169f5fc3a8e22f8952a90767e0bb8d726b5 assets/create/blockstates/horizontal_framed_glass_pane.json 8ae52808eba950c36b75d62113e9cea9441a1a54 assets/create/blockstates/hose_pulley.json 87fa830c5d3541d096fab32d430c54516c197583 assets/create/blockstates/industrial_iron_block.json +3727801604445df291112fd9b99f99bbdcfa0f6d assets/create/blockstates/industrial_iron_window.json +877418ed76fdc589788db119663ca3e52e26a2aa assets/create/blockstates/industrial_iron_window_pane.json 2788ad2d29996076f7f18ab8d47e40c1ad10b348 assets/create/blockstates/item_drain.json e840d746532f350ee2977c00036163f73c3f4147 assets/create/blockstates/item_hatch.json 3e99569e978c0fe17ec18b97881434a9da1a8421 assets/create/blockstates/item_vault.json @@ -636,8 +638,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -c571c86ea08a65fa325f14509707f3d920f0926e assets/create/lang/en_ud.json -2b95d25bac70a8db6d0736b9b818e3aaafa80096 assets/create/lang/en_us.json +c3de6ad9aa8e75977b93d59a36b2fa2e1e4e9445 assets/create/lang/en_ud.json +3cf9afee452951897c1ca572e5f7c3362f897db3 assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -1215,6 +1217,12 @@ a1a239714f5feb45a692f5c2873c37d6614e1b8b assets/create/models/block/horizontal_f 0f7e518ef02428c55e1683bc9de0d20e2c1e6883 assets/create/models/block/horizontal_framed_glass_pane_side.json db3f9472815fb6acc1ee1d9941b8cc19518ebcbf assets/create/models/block/horizontal_framed_glass_pane_side_alt.json 6868ed1959875efec96a15ca6f32b8c7efefb2d9 assets/create/models/block/industrial_iron_block.json +02806f9c95ba6b74b61e1c92927492b3668ffdc9 assets/create/models/block/industrial_iron_window.json +a0152d54688e8c4bb0c96e0476cca7e5f92dabd7 assets/create/models/block/industrial_iron_window_pane_noside.json +bbc922f5ddce4acfe89911d149204d4663515fc2 assets/create/models/block/industrial_iron_window_pane_noside_alt.json +13c0714510f379830f42488c4f0457c4f4d6be16 assets/create/models/block/industrial_iron_window_pane_post.json +b5bbcb04dd68249b4d9c2bae2fa2c15e9bcd9870 assets/create/models/block/industrial_iron_window_pane_side.json +7763d9f974f859963a48060858b80a6b46f842c9 assets/create/models/block/industrial_iron_window_pane_side_alt.json cdc4f1c608f74824fd270521a846823ca4b6ef16 assets/create/models/block/jungle_window.json 8c5ee8e36756fcff3095c564567a35be1db23cee assets/create/models/block/jungle_window_pane_noside.json 2bb34fe17c7cfafc8658cd0b44ab636191f81348 assets/create/models/block/jungle_window_pane_noside_alt.json @@ -2095,6 +2103,8 @@ e623c9541adc0fa877c5615e3211f47886383f2d assets/create/models/item/horizontal_fr 14ae1ba5e842715fc4526b19e20c74d10102eb4a assets/create/models/item/incomplete_precision_mechanism.json ae5c5925ecf775a4f5c3dc3c79d9766d7dd34ab6 assets/create/models/item/incomplete_track.json 43173d18384817288a9ba687da77a4fab31b1957 assets/create/models/item/industrial_iron_block.json +4596b83d7da43a670f2274c8389cca9897ae379d assets/create/models/item/industrial_iron_window.json +b023f505f851799e7212531402e788e927cf6033 assets/create/models/item/industrial_iron_window_pane.json c6e3e4ca8b3dfdaaa943faa3dc89c0b2e6f2b5c4 assets/create/models/item/iron_sheet.json d1fbf1be53208c3ab5384dfd6be4d980c858941c assets/create/models/item/item_drain.json 5adda29ca25d00eb41884d0b7ad4a471e250ae10 assets/create/models/item/item_hatch.json @@ -2803,6 +2813,8 @@ e3c5bd9bf6f73620ccb61e0a9cb3beb18b04b527 data/create/advancements/recipes/buildi 85fb8fdb3cebaaacf24794aec90e7894f66a8402 data/create/advancements/recipes/building_blocks/horizontal_framed_glass_from_glass_colorless_stonecutting.json c609b408d6467ec71513ecca19a6040ad7011a79 data/create/advancements/recipes/building_blocks/horizontal_framed_glass_pane.json a587d84e187d6552473f646461539dc56d4e748f data/create/advancements/recipes/building_blocks/industrial_iron_block_from_ingots_iron_stonecutting.json +d6c892f6f3ae052b2f65d5e5a0cdcc7c60da13db data/create/advancements/recipes/building_blocks/industrial_iron_window.json +a26261da3faa6b49a3d2c6b4f7ccc504681f73f8 data/create/advancements/recipes/building_blocks/industrial_iron_window_pane.json 546af6a639e4799fb83d61b131ab0cc38ef6b33a data/create/advancements/recipes/building_blocks/jungle_window.json e8c728c46cc69cc0e9d755551bb9a52f2b61a6c0 data/create/advancements/recipes/building_blocks/jungle_window_pane.json b9d04c53fdf3ba977216021ca71aa5e4f2d9a0b0 data/create/advancements/recipes/building_blocks/layered_andesite_from_stone_types_andesite_stonecutting.json @@ -3414,6 +3426,8 @@ f917ddc34b196750efbab88ee5565ecd0e38e0e6 data/create/loot_tables/blocks/haunted_ a206598562bcbc9e3bc10dbe12fb22974ee58fcc data/create/loot_tables/blocks/horizontal_framed_glass_pane.json e65fae1b9b72cf2208696463fa20a82a4d64fb62 data/create/loot_tables/blocks/hose_pulley.json 34c239150baa92e03ca89430148560e1b7a1f02d data/create/loot_tables/blocks/industrial_iron_block.json +9c831bbcae1bf3dbddce1126a1279f4f22902a25 data/create/loot_tables/blocks/industrial_iron_window.json +de30f216e9326c27103702ea296c460d927aa3ef data/create/loot_tables/blocks/industrial_iron_window_pane.json c22dea1941471be65c811cdc2ce7b77d2247e9e1 data/create/loot_tables/blocks/item_drain.json 528078b0cf042236d2cb0701fb55f41f54aa932b data/create/loot_tables/blocks/item_hatch.json 72b5a7288f7f54694df5f456e4ab4433bd38dfff data/create/loot_tables/blocks/item_vault.json @@ -4143,6 +4157,8 @@ c1ac5bad113e067bf5cfa8d730dcc835420aecfb data/create/recipes/granite_from_stone_ 8d6448c67261138b6331273024b757a9a58b41c4 data/create/recipes/horizontal_framed_glass_from_glass_colorless_stonecutting.json dde9d763cc1306d48e2f3b813530fca0842a5c14 data/create/recipes/horizontal_framed_glass_pane.json 61f759fec228090a60371add88cc90be3a84a735 data/create/recipes/industrial_iron_block_from_ingots_iron_stonecutting.json +813c68e25ffc543d7457a1417897dd0b579d1b1e data/create/recipes/industrial_iron_window.json +4a4e4f87a2753fb5310f7f70c39143e02b6a6fd0 data/create/recipes/industrial_iron_window_pane.json 2b4a8702db989116dbf97d0021d71a5948336805 data/create/recipes/jungle_window.json 4400d3db46b091d3ead7fbcb64cb712db2fde5de data/create/recipes/jungle_window_pane.json 66da7fc9adbe0119bc41bfad0f6422fb93dcf3b6 data/create/recipes/layered_andesite_from_stone_types_andesite_stonecutting.json @@ -4504,7 +4520,7 @@ c59c9fc0cdd45de659aa8023d36f9decb90f708c data/create/tags/items/vanilla_stripped 64441ac1daa64c81601b94b82b21c0ee862b6344 data/create/tags/items/vanilla_stripped_wood.json edf7390f09e622193bbc720ec51ba128ea1e96e6 data/curios/tags/items/head.json 10d5f0c1763f80860a39398ecc33dbbe43099471 data/forge/tags/blocks/glass/colorless.json -26304ec2e243fa4268afa580ff2a199503d9a30a data/forge/tags/blocks/glass_panes.json +6f715416c891aaff77831878d1970c4dd7d24742 data/forge/tags/blocks/glass_panes.json 81b107ada9c6ac5679a21f8c6a006bf230f69c39 data/forge/tags/blocks/ores.json 81b107ada9c6ac5679a21f8c6a006bf230f69c39 data/forge/tags/blocks/ores/zinc.json e475ad1c52bffedfc544e5331a87c1f5c45149fd data/forge/tags/blocks/ores_in_ground/deepslate.json @@ -4532,7 +4548,7 @@ afdac448376ff5624f49cbf31feedf691ecbc4c5 data/forge/tags/items/armors/leggings.j 745512f10c4ba52f2c224607377e41011fb2ecfe data/forge/tags/items/flour.json 745512f10c4ba52f2c224607377e41011fb2ecfe data/forge/tags/items/flour/wheat.json 10d5f0c1763f80860a39398ecc33dbbe43099471 data/forge/tags/items/glass/colorless.json -26304ec2e243fa4268afa580ff2a199503d9a30a data/forge/tags/items/glass_panes.json +6f715416c891aaff77831878d1970c4dd7d24742 data/forge/tags/items/glass_panes.json 01d32d3b7b033aff44c047bf289d696de0b0c715 data/forge/tags/items/ingots.json 5a7bffd1d604bc6ea8b35714ef02b95773240f90 data/forge/tags/items/ingots/brass.json ccf5b08295f6362a3f6b3b595f1de1bba4b224ec data/forge/tags/items/ingots/zinc.json @@ -4567,7 +4583,7 @@ c741ba83b562ae3459d7c4f2db69537f549ea411 data/forge/tags/items/tools/wrench.json 82274e06b6a9f3bfd83c8b59be38dee4a15b8bf3 data/minecraft/tags/blocks/climbable.json 71aef080a900d9e86818cf579438c3d826d6567e data/minecraft/tags/blocks/doors.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/dripstone_replaceable_blocks.json -a25d96534556d2e526ed5d1efbd5f6c352457abf data/minecraft/tags/blocks/impermeable.json +4fffa6fa3be0722121611a1c1393e39cc5281b24 data/minecraft/tags/blocks/impermeable.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/lush_ground_replaceable.json 4cf669239caa93951fd8e243a03e9157d2d06208 data/minecraft/tags/blocks/mineable/axe.json f816879274e6f561b67f460358e77f6084390d77 data/minecraft/tags/blocks/mineable/pickaxe.json diff --git a/src/generated/resources/assets/create/blockstates/industrial_iron_window.json b/src/generated/resources/assets/create/blockstates/industrial_iron_window.json new file mode 100644 index 0000000000..d8645c1c56 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/industrial_iron_window.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/industrial_iron_window" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/industrial_iron_window_pane.json b/src/generated/resources/assets/create/blockstates/industrial_iron_window_pane.json new file mode 100644 index 0000000000..4f32186a04 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/industrial_iron_window_pane.json @@ -0,0 +1,77 @@ +{ + "multipart": [ + { + "apply": { + "model": "create:block/industrial_iron_window_pane_post" + } + }, + { + "apply": { + "model": "create:block/industrial_iron_window_pane_side" + }, + "when": { + "north": "true" + } + }, + { + "apply": { + "model": "create:block/industrial_iron_window_pane_noside" + }, + "when": { + "north": "false" + } + }, + { + "apply": { + "model": "create:block/industrial_iron_window_pane_side_alt" + }, + "when": { + "south": "true" + } + }, + { + "apply": { + "model": "create:block/industrial_iron_window_pane_noside_alt", + "y": 90 + }, + "when": { + "south": "false" + } + }, + { + "apply": { + "model": "create:block/industrial_iron_window_pane_side_alt", + "y": 90 + }, + "when": { + "west": "true" + } + }, + { + "apply": { + "model": "create:block/industrial_iron_window_pane_noside", + "y": 270 + }, + "when": { + "west": "false" + } + }, + { + "apply": { + "model": "create:block/industrial_iron_window_pane_side", + "y": 90 + }, + "when": { + "east": "true" + } + }, + { + "apply": { + "model": "create:block/industrial_iron_window_pane_noside_alt" + }, + "when": { + "east": "false" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 39b95b0627..fbca534606 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -496,6 +496,8 @@ "block.create.horizontal_framed_glass_pane": "ǝuɐԀ ssɐן⅁ pǝɯɐɹℲ ןɐʇuozıɹoH", "block.create.hose_pulley": "ʎǝןןnԀ ǝsoH", "block.create.industrial_iron_block": "uoɹI ןɐıɹʇsnpuI ɟo ʞɔoןᗺ", + "block.create.industrial_iron_window": "ʍopuıM uoɹI ןɐıɹʇsnpuI", + "block.create.industrial_iron_window_pane": "ǝuɐԀ ʍopuıM uoɹI ןɐıɹʇsnpuI", "block.create.item_drain": "uıɐɹᗡ ɯǝʇI", "block.create.item_hatch": "ɥɔʇɐH ɯǝʇI", "block.create.item_vault": "ʇןnɐΛ ɯǝʇI", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 7ed78cdae4..6bc35908d9 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -496,6 +496,8 @@ "block.create.horizontal_framed_glass_pane": "Horizontal Framed Glass Pane", "block.create.hose_pulley": "Hose Pulley", "block.create.industrial_iron_block": "Block of Industrial Iron", + "block.create.industrial_iron_window": "Industrial Iron Window", + "block.create.industrial_iron_window_pane": "Industrial Iron Window Pane", "block.create.item_drain": "Item Drain", "block.create.item_hatch": "Item Hatch", "block.create.item_vault": "Item Vault", diff --git a/src/generated/resources/assets/create/models/block/industrial_iron_window.json b/src/generated/resources/assets/create/models/block/industrial_iron_window.json new file mode 100644 index 0000000000..85a7b320da --- /dev/null +++ b/src/generated/resources/assets/create/models/block/industrial_iron_window.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "create:block/palettes/industrial_iron_window_end", + "side": "create:block/palettes/industrial_iron_window" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/industrial_iron_window_pane_noside.json b/src/generated/resources/assets/create/models/block/industrial_iron_window_pane_noside.json new file mode 100644 index 0000000000..e3a58e86bc --- /dev/null +++ b/src/generated/resources/assets/create/models/block/industrial_iron_window_pane_noside.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/connected_glass_pane/noside", + "textures": { + "edge": "create:block/palettes/industrial_iron_window_pane_top", + "pane": "create:block/palettes/industrial_iron_window" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/industrial_iron_window_pane_noside_alt.json b/src/generated/resources/assets/create/models/block/industrial_iron_window_pane_noside_alt.json new file mode 100644 index 0000000000..1e913b806f --- /dev/null +++ b/src/generated/resources/assets/create/models/block/industrial_iron_window_pane_noside_alt.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/connected_glass_pane/noside_alt", + "textures": { + "edge": "create:block/palettes/industrial_iron_window_pane_top", + "pane": "create:block/palettes/industrial_iron_window" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/industrial_iron_window_pane_post.json b/src/generated/resources/assets/create/models/block/industrial_iron_window_pane_post.json new file mode 100644 index 0000000000..819fb29f3c --- /dev/null +++ b/src/generated/resources/assets/create/models/block/industrial_iron_window_pane_post.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/connected_glass_pane/post", + "textures": { + "edge": "create:block/palettes/industrial_iron_window_pane_top", + "pane": "create:block/palettes/industrial_iron_window" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/industrial_iron_window_pane_side.json b/src/generated/resources/assets/create/models/block/industrial_iron_window_pane_side.json new file mode 100644 index 0000000000..5eda7010ae --- /dev/null +++ b/src/generated/resources/assets/create/models/block/industrial_iron_window_pane_side.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/connected_glass_pane/side", + "textures": { + "edge": "create:block/palettes/industrial_iron_window_pane_top", + "pane": "create:block/palettes/industrial_iron_window" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/industrial_iron_window_pane_side_alt.json b/src/generated/resources/assets/create/models/block/industrial_iron_window_pane_side_alt.json new file mode 100644 index 0000000000..e09fc74d5e --- /dev/null +++ b/src/generated/resources/assets/create/models/block/industrial_iron_window_pane_side_alt.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/connected_glass_pane/side_alt", + "textures": { + "edge": "create:block/palettes/industrial_iron_window_pane_top", + "pane": "create:block/palettes/industrial_iron_window" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/industrial_iron_window.json b/src/generated/resources/assets/create/models/item/industrial_iron_window.json new file mode 100644 index 0000000000..3387bcdffc --- /dev/null +++ b/src/generated/resources/assets/create/models/item/industrial_iron_window.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/industrial_iron_window" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/industrial_iron_window_pane.json b/src/generated/resources/assets/create/models/item/industrial_iron_window_pane.json new file mode 100644 index 0000000000..115e11e0b8 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/industrial_iron_window_pane.json @@ -0,0 +1,7 @@ +{ + "parent": "create:item/pane", + "textures": { + "edge": "create:block/palettes/industrial_iron_window_pane_top", + "pane": "create:block/palettes/industrial_iron_window" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/industrial_iron_window.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/industrial_iron_window.json new file mode 100644 index 0000000000..3374702a43 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/industrial_iron_window.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_ingredient": { + "conditions": { + "items": [ + { + "items": [ + "create:industrial_iron_block" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:industrial_iron_window" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_ingredient", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:industrial_iron_window" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/industrial_iron_window_pane.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/industrial_iron_window_pane.json new file mode 100644 index 0000000000..190e8d4c53 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/industrial_iron_window_pane.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_ingredient": { + "conditions": { + "items": [ + { + "items": [ + "create:industrial_iron_window" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:industrial_iron_window_pane" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_ingredient", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:industrial_iron_window_pane" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/industrial_iron_window.json b/src/generated/resources/data/create/loot_tables/blocks/industrial_iron_window.json new file mode 100644 index 0000000000..17cb67c733 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/industrial_iron_window.json @@ -0,0 +1,31 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:industrial_iron_window" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/industrial_iron_window" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/industrial_iron_window_pane.json b/src/generated/resources/data/create/loot_tables/blocks/industrial_iron_window_pane.json new file mode 100644 index 0000000000..83dfd8e361 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/industrial_iron_window_pane.json @@ -0,0 +1,31 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:industrial_iron_window_pane" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/industrial_iron_window_pane" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/industrial_iron_window.json b/src/generated/resources/data/create/recipes/industrial_iron_window.json new file mode 100644 index 0000000000..d126e944f0 --- /dev/null +++ b/src/generated/resources/data/create/recipes/industrial_iron_window.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "create:industrial_iron_block" + }, + "X": { + "tag": "forge:glass/colorless" + } + }, + "pattern": [ + " # ", + "#X#" + ], + "result": { + "count": 2, + "item": "create:industrial_iron_window" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/industrial_iron_window_pane.json b/src/generated/resources/data/create/recipes/industrial_iron_window_pane.json new file mode 100644 index 0000000000..7b7e4869a6 --- /dev/null +++ b/src/generated/resources/data/create/recipes/industrial_iron_window_pane.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "create:industrial_iron_window" + } + }, + "pattern": [ + "###", + "###" + ], + "result": { + "count": 16, + "item": "create:industrial_iron_window_pane" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/blocks/glass_panes.json b/src/generated/resources/data/forge/tags/blocks/glass_panes.json index ceaa578ec9..378292fc8e 100644 --- a/src/generated/resources/data/forge/tags/blocks/glass_panes.json +++ b/src/generated/resources/data/forge/tags/blocks/glass_panes.json @@ -15,6 +15,7 @@ "create:warped_window_pane", "create:cherry_window_pane", "create:bamboo_window_pane", - "create:ornate_iron_window_pane" + "create:ornate_iron_window_pane", + "create:industrial_iron_window_pane" ] } \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/glass_panes.json b/src/generated/resources/data/forge/tags/items/glass_panes.json index ceaa578ec9..378292fc8e 100644 --- a/src/generated/resources/data/forge/tags/items/glass_panes.json +++ b/src/generated/resources/data/forge/tags/items/glass_panes.json @@ -15,6 +15,7 @@ "create:warped_window_pane", "create:cherry_window_pane", "create:bamboo_window_pane", - "create:ornate_iron_window_pane" + "create:ornate_iron_window_pane", + "create:industrial_iron_window_pane" ] } \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/impermeable.json b/src/generated/resources/data/minecraft/tags/blocks/impermeable.json index f83f1e59e3..5b6acee1f8 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/impermeable.json +++ b/src/generated/resources/data/minecraft/tags/blocks/impermeable.json @@ -15,6 +15,7 @@ "create:warped_window", "create:cherry_window", "create:bamboo_window", - "create:ornate_iron_window" + "create:ornate_iron_window", + "create:industrial_iron_window" ] } \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllSpriteShifts.java b/src/main/java/com/simibubi/create/AllSpriteShifts.java index ffff1fb1f4..ea0744a3c9 100644 --- a/src/main/java/com/simibubi/create/AllSpriteShifts.java +++ b/src/main/java/com/simibubi/create/AllSpriteShifts.java @@ -40,7 +40,8 @@ public class AllSpriteShifts { HORIZONTAL_FRAMED_GLASS = getCT(AllCTTypes.HORIZONTAL_KRYPPERS, "palettes/framed_glass", "palettes/horizontal_framed_glass"), VERTICAL_FRAMED_GLASS = getCT(AllCTTypes.VERTICAL, "palettes/framed_glass", "palettes/vertical_framed_glass"), - ORNATE_IRON_WINDOW = vertical("palettes/ornate_iron_window"); + ORNATE_IRON_WINDOW = vertical("palettes/ornate_iron_window"), + INDUSTRIAL_IRON_WINDOW = getCT(AllCTTypes.RECTANGLE, "palettes/industrial_iron_window"); public static final CTSpriteShiftEntry CRAFTER_SIDE = vertical("crafter_side"), CRAFTER_OTHERSIDE = horizontal("crafter_side"), diff --git a/src/main/java/com/simibubi/create/content/decoration/palettes/AllPaletteBlocks.java b/src/main/java/com/simibubi/create/content/decoration/palettes/AllPaletteBlocks.java index 4af72de951..f7bc31151a 100644 --- a/src/main/java/com/simibubi/create/content/decoration/palettes/AllPaletteBlocks.java +++ b/src/main/java/com/simibubi/create/content/decoration/palettes/AllPaletteBlocks.java @@ -8,6 +8,7 @@ import static com.simibubi.create.foundation.data.WindowGen.framedGlassPane; import static com.simibubi.create.foundation.data.WindowGen.woodenWindowBlock; import static com.simibubi.create.foundation.data.WindowGen.woodenWindowPane; +import com.simibubi.create.AllBlocks; import com.simibubi.create.AllCreativeModeTabs; import com.simibubi.create.AllSpriteShifts; import com.simibubi.create.Create; @@ -81,7 +82,9 @@ public class AllPaletteBlocks { BAMBOO_WINDOW = woodenWindowBlock(WoodType.BAMBOO, Blocks.BAMBOO_PLANKS), ORNATE_IRON_WINDOW = customWindowBlock("ornate_iron_window", () -> Items.IRON_NUGGET, () -> AllSpriteShifts.ORNATE_IRON_WINDOW, - () -> RenderType::cutout, false, () -> MapColor.TERRACOTTA_LIGHT_GRAY); + () -> RenderType::cutout, false, () -> MapColor.TERRACOTTA_LIGHT_GRAY), + INDUSTRIAL_IRON_WINDOW = customWindowBlock("industrial_iron_window", AllBlocks.INDUSTRIAL_IRON_BLOCK, + () -> AllSpriteShifts.INDUSTRIAL_IRON_WINDOW, () -> RenderType::cutout, false, () -> MapColor.COLOR_GRAY); public static final BlockEntry OAK_WINDOW_PANE = woodenWindowPane(WoodType.OAK, OAK_WINDOW), @@ -96,7 +99,9 @@ public class AllPaletteBlocks { CHERRY_WINDOW_PANE = woodenWindowPane(WoodType.CHERRY, CHERRY_WINDOW), BAMBOO_WINDOW_PANE = woodenWindowPane(WoodType.BAMBOO, BAMBOO_WINDOW), ORNATE_IRON_WINDOW_PANE = customWindowPane("ornate_iron_window", ORNATE_IRON_WINDOW, - () -> AllSpriteShifts.ORNATE_IRON_WINDOW, () -> RenderType::cutoutMipped); + () -> AllSpriteShifts.ORNATE_IRON_WINDOW, () -> RenderType::cutoutMipped), + INDUSTRIAL_IRON_WINDOW_PANE = customWindowPane("industrial_iron_window", INDUSTRIAL_IRON_WINDOW, + () -> AllSpriteShifts.INDUSTRIAL_IRON_WINDOW, () -> RenderType::cutoutMipped); static { AllPaletteStoneTypes.register(REGISTRATE); diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothBlock.java b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothBlock.java index 9f815ecaf8..43213fb25f 100644 --- a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothBlock.java @@ -86,6 +86,9 @@ public class DisplayClothBlock extends Block implements IHaveBigOutline, IWrench @Override public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult ray) { + if (ray.getDirection() == Direction.DOWN) + return InteractionResult.PASS; + ItemStack heldItem = player.getItemInHand(hand); boolean shiftKeyDown = player.isShiftKeyDown(); if (!player.mayBuild()) diff --git a/src/main/resources/assets/create/textures/block/palettes/industrial_iron_window.png b/src/main/resources/assets/create/textures/block/palettes/industrial_iron_window.png new file mode 100644 index 0000000000000000000000000000000000000000..3c5792d14d30517231d3048df8210b6c5edb4b87 GIT binary patch literal 351 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!7rXJjv*HQ$ycsj`+ffC$)gT@Kfe8yW?sB^ z?&W&>c>gxz^z%-wjzae(cUV|H%n@*S)_gPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1sq94K~#8N?VHbU zOi>ia-w2gXm0}R}GtmVRB#K!0ksuKZ8f;ifBo_V@3o8qW#8NHFTA~}ZkZ3K4*fb%2 zR4}Mkr|Hm+_dV~OaeC+dxbNPXc{A;Nl9zYqUEg=lJ@4Fm-o0KkyLay`W!tlk35Dqb zolW&=1N$?_kDVx;JA1|%9vSg3dlaUp>6~qEr!&LXj~zMU^xq$Fve~Qy{o}zwy56>Y zd8lS;YKqRxvZYJ?QgZ(M{p*)1>FDU7bC4aynHegdI(d@pFGs+tt`$_F%dhd@rZqjRC)4golTei?$!cdhQEGJ6)Vb0moPm4;7T zmkIX?2aOIqWQHI1_|Hkt0c$$VjQTM-U3P$s2%vTrhD}U*L#EcO?95iQEuF&7C=`m` z96-M;;4Hw74C`#YvIWmg66q8?I6zr|C&A~#&oXpXz|ML7`ej8OA_q6ft<5>bqSv78 zbWms2HlpqiOzVS&wR8%c0ovNK&JuJW4AezEHPq+7=c(g3@NfA*XVEAQl!F|sbAOY1 zZcnz)cHv-qVLMIRJw4k=m;^b~@{PG+9Jn6Wfm$Qmm$tFJfE=)S<3{=s$D^U4TYk~K zK|7@pGy=HOQAoWB)zZrcL=O1)`7=(DKz#b>(d+(CH?;o0i0DL+s!vL_^&G+45ui3M z-{4I2NvXD;BbXd8F<$x75{HZc6MfpS{j?bB?p|NMK%Q~S{DkFohU-U1-_eVZsa}@T z(8GQQ4!CyZN=4oT$fulZRiHt=sUDItKpcNYD%rNAbGSSE3>R-K56@21c*F-_2PLg@w_>}Kp)1{ix-SL50cuy=-&g#0XuhWb8g?g zTd|no92&G9M;?9g>J2%-L=V!eXZvXggb}rz)k%GE%i%QZ+5W&RpaX{%Fwv(C+fNP% z%Hu)E+$zVEiQWXHN55!9kp0>b5S3eP^*W&QHt8{}eR6>9dcIEk0aocTtbH#6TKfU5 z{Q%0BDmv@w)_y<)QF@SOJ=?FH1yne+fQdeB*nVZ|u6prQ5y>Z51-Tl)d6{eTE`*3(g>x!wml_6KHxq}b}ygdAYIp0DG6K-Kly z5fGJIZS^|TN*_4~NNgGhjjC^bER8gXkDZ@9eM%Q~^QiiEL6%vK>ocz)DYmh1HHWq=kEpRiUoM% z0!{h3JkJ60Lr2b;QSZ{&PxFiA2AlG8c?fPtuxOp>?11?{>R2m!mO68{hTpk6J|Jh-0 zE{MC}TnB26Y+u^O_5yN%&CHBO0C&0>kPj%)n;_DoUnDR;fc<-R z(K!xPpOk9qk-A~O_7LEA1OMkdZ1p-+ThDKa+C#vmanPvx)_wqTeQQ5p(MCYQ`3C`t VyVlC-GBp4I002ovPDHLkV1n{Rw;%uj literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/palettes/industrial_iron_window_end.png b/src/main/resources/assets/create/textures/block/palettes/industrial_iron_window_end.png new file mode 100644 index 0000000000000000000000000000000000000000..cd4780a2cb18d1ad2a980f30e456c5c218dbe028 GIT binary patch literal 268 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFCK*!jp;L#n?07jzO?jQo`c(`OH0>z-#y54ed##`w`HG` zt{;7P!4W@L98aQUoY3T0e zK6QxigOr1ZF^53O!R`6?7wEiUSkI_%_V5Aj7KYrt4pSYLXz+9}ZsBzika)w{*~rMS YXQOoO-%SmsKw}v^UHx3vIVCg!0MR`*#sB~S literal 0 HcmV?d00001 From bc3347d752123c2eef5d54dfe85ba2b92c3b296c Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 1 Nov 2024 11:37:44 +0100 Subject: [PATCH 100/515] Is it November already - Fixed chain conveyors culling too quickly - Adjusted outline for logistically linked preview - Address box suggestions no longer have duplicates and render above box when necessary - Adjusted display cloth entity collision box - Held clipboards can now copy entries from other in-world clipboards - Fixed logistically linked items not placing the block when sneaking - Postboxes and frogs now open visually when opened - String can now be applied to cardboard blocks in-world - Desk bells can now be spam-clicked - Metal ladders no longer require a wall if another ladder block is above them - Packaged spawn eggs may cause side effects when opened --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 88 ++++++++------ .../82992cbf8f2794d83ac94034835eac0acd7915b9 | 4 +- .../b256105d8411632b0d585496ea8944a751a08034 | 3 +- .../create/blockstates/black_postbox.json | 16 +-- .../create/blockstates/blue_postbox.json | 16 +-- .../create/blockstates/brown_postbox.json | 16 +-- .../create/blockstates/cyan_postbox.json | 16 +-- .../create/blockstates/gray_postbox.json | 16 +-- .../create/blockstates/green_postbox.json | 16 +-- .../blockstates/light_blue_postbox.json | 16 +-- .../blockstates/light_gray_postbox.json | 16 +-- .../create/blockstates/lime_postbox.json | 16 +-- .../create/blockstates/magenta_postbox.json | 16 +-- .../create/blockstates/orange_postbox.json | 16 +-- .../create/blockstates/pink_postbox.json | 16 +-- .../create/blockstates/purple_postbox.json | 16 +-- .../create/blockstates/red_postbox.json | 16 +-- .../create/blockstates/white_postbox.json | 16 +-- .../create/blockstates/yellow_postbox.json | 16 +-- .../resources/assets/create/lang/en_ud.json | 2 + .../resources/assets/create/lang/en_us.json | 2 + ...postbox.json => black_postbox_closed.json} | 0 .../models/block/black_postbox_open.json | 7 ++ ..._postbox.json => blue_postbox_closed.json} | 0 .../models/block/blue_postbox_open.json | 7 ++ ...postbox.json => brown_postbox_closed.json} | 0 .../models/block/brown_postbox_open.json | 7 ++ ..._postbox.json => cyan_postbox_closed.json} | 0 .../models/block/cyan_postbox_open.json | 7 ++ ..._postbox.json => gray_postbox_closed.json} | 0 .../models/block/gray_postbox_open.json | 7 ++ ...postbox.json => green_postbox_closed.json} | 0 .../models/block/green_postbox_open.json | 7 ++ ...ox.json => light_blue_postbox_closed.json} | 0 .../models/block/light_blue_postbox_open.json | 7 ++ ...ox.json => light_gray_postbox_closed.json} | 0 .../models/block/light_gray_postbox_open.json | 7 ++ ..._postbox.json => lime_postbox_closed.json} | 0 .../models/block/lime_postbox_open.json | 7 ++ ...stbox.json => magenta_postbox_closed.json} | 0 .../models/block/magenta_postbox_open.json | 7 ++ ...ostbox.json => orange_postbox_closed.json} | 0 .../models/block/orange_postbox_open.json | 7 ++ ..._postbox.json => pink_postbox_closed.json} | 0 .../models/block/pink_postbox_open.json | 7 ++ ...ostbox.json => purple_postbox_closed.json} | 0 .../models/block/purple_postbox_open.json | 7 ++ ...d_postbox.json => red_postbox_closed.json} | 0 .../create/models/block/red_postbox_open.json | 7 ++ ...postbox.json => white_postbox_closed.json} | 0 .../models/block/white_postbox_open.json | 7 ++ ...ostbox.json => yellow_postbox_closed.json} | 0 .../models/block/yellow_postbox_open.json | 7 ++ .../blocks/bound_cardboard_block.json | 17 ++- .../materials/bound_cardboard_block.json | 19 +--- .../bound_cardboard_inworld.json | 16 +++ .../java/com/simibubi/create/AllBlocks.java | 22 +++- .../content/decoration/MetalLadderBlock.java | 35 +++++- .../ClipboardValueSettingsHandler.java | 61 +++++++++- .../equipment/toolbox/ToolboxBlockEntity.java | 58 ++-------- .../equipment/toolbox/ToolboxMenu.java | 8 +- .../ChainConveyorBlockEntity.java | 2 +- .../content/logistics/AddressEditBox.java | 4 +- .../logistics/AddressEditBoxHelper.java | 21 ++-- .../content/logistics/box/PackageEntity.java | 12 ++ .../content/logistics/box/PackageItem.java | 47 +++++--- .../displayCloth/DisplayClothBlock.java | 8 +- .../factoryBoard/FactoryPanelScreen.java | 4 +- .../logistics/filter/PackageFilterScreen.java | 5 +- .../packagePort/PackagePortBlockEntity.java | 17 ++- .../packagePort/PackagePortMenu.java | 7 ++ .../frogport/FrogportBlockEntity.java | 19 +++- .../frogport/FrogportRenderer.java | 4 + .../packagePort/frogport/FrogportVisual.java | 3 + .../postbox/PostboxBlockEntity.java | 19 +++- .../LogisticallyLinkedBlockItem.java | 2 + .../LogisticallyLinkedClientHandler.java | 23 +++- .../RedstoneRequesterScreen.java | 2 +- .../stockTicker/StockTickerRequestScreen.java | 3 +- .../redstone/deskBell/DeskBellBlock.java | 23 +--- .../deskBell/DeskBellBlockEntity.java | 30 ++++- .../redstone/deskBell/DeskBellRenderer.java | 4 +- .../schedule/DestinationSuggestions.java | 4 +- .../trains/schedule/ScheduleScreen.java | 2 +- .../AnimatedContainerBehaviour.java | 107 ++++++++++++++++++ .../data/recipe/ItemApplicationRecipeGen.java | 7 ++ .../data/recipe/StandardRecipeGen.java | 9 +- .../create/foundation/events/InputEvents.java | 9 +- .../assets/create/lang/default/interface.json | 2 + .../assets/create/models/block/ladder.json | 58 +++++----- .../block/package_postbox/block_closed.json | 2 +- .../block/package_postbox/block_open.json | 2 +- 92 files changed, 808 insertions(+), 356 deletions(-) rename src/generated/resources/assets/create/models/block/{black_postbox.json => black_postbox_closed.json} (100%) create mode 100644 src/generated/resources/assets/create/models/block/black_postbox_open.json rename src/generated/resources/assets/create/models/block/{blue_postbox.json => blue_postbox_closed.json} (100%) create mode 100644 src/generated/resources/assets/create/models/block/blue_postbox_open.json rename src/generated/resources/assets/create/models/block/{brown_postbox.json => brown_postbox_closed.json} (100%) create mode 100644 src/generated/resources/assets/create/models/block/brown_postbox_open.json rename src/generated/resources/assets/create/models/block/{cyan_postbox.json => cyan_postbox_closed.json} (100%) create mode 100644 src/generated/resources/assets/create/models/block/cyan_postbox_open.json rename src/generated/resources/assets/create/models/block/{gray_postbox.json => gray_postbox_closed.json} (100%) create mode 100644 src/generated/resources/assets/create/models/block/gray_postbox_open.json rename src/generated/resources/assets/create/models/block/{green_postbox.json => green_postbox_closed.json} (100%) create mode 100644 src/generated/resources/assets/create/models/block/green_postbox_open.json rename src/generated/resources/assets/create/models/block/{light_blue_postbox.json => light_blue_postbox_closed.json} (100%) create mode 100644 src/generated/resources/assets/create/models/block/light_blue_postbox_open.json rename src/generated/resources/assets/create/models/block/{light_gray_postbox.json => light_gray_postbox_closed.json} (100%) create mode 100644 src/generated/resources/assets/create/models/block/light_gray_postbox_open.json rename src/generated/resources/assets/create/models/block/{lime_postbox.json => lime_postbox_closed.json} (100%) create mode 100644 src/generated/resources/assets/create/models/block/lime_postbox_open.json rename src/generated/resources/assets/create/models/block/{magenta_postbox.json => magenta_postbox_closed.json} (100%) create mode 100644 src/generated/resources/assets/create/models/block/magenta_postbox_open.json rename src/generated/resources/assets/create/models/block/{orange_postbox.json => orange_postbox_closed.json} (100%) create mode 100644 src/generated/resources/assets/create/models/block/orange_postbox_open.json rename src/generated/resources/assets/create/models/block/{pink_postbox.json => pink_postbox_closed.json} (100%) create mode 100644 src/generated/resources/assets/create/models/block/pink_postbox_open.json rename src/generated/resources/assets/create/models/block/{purple_postbox.json => purple_postbox_closed.json} (100%) create mode 100644 src/generated/resources/assets/create/models/block/purple_postbox_open.json rename src/generated/resources/assets/create/models/block/{red_postbox.json => red_postbox_closed.json} (100%) create mode 100644 src/generated/resources/assets/create/models/block/red_postbox_open.json rename src/generated/resources/assets/create/models/block/{white_postbox.json => white_postbox_closed.json} (100%) create mode 100644 src/generated/resources/assets/create/models/block/white_postbox_open.json rename src/generated/resources/assets/create/models/block/{yellow_postbox.json => yellow_postbox_closed.json} (100%) create mode 100644 src/generated/resources/assets/create/models/block/yellow_postbox_open.json create mode 100644 src/generated/resources/data/create/recipes/item_application/bound_cardboard_inworld.json create mode 100644 src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/animatedContainer/AnimatedContainerBehaviour.java diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 660d2db89d..d4179532f7 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-10-30T19:35:41.3745103 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-11-01T10:40:15.7618068 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -27,7 +27,7 @@ a97910c7516e7cedec9e34eca51f1183f1e3e681 assets/create/blockstates/belt.json 2003c43151b731bf19cae58290c63bcb3785848a assets/create/blockstates/birch_window_pane.json 396e4772b041319fc86b50deded74f514945f45d assets/create/blockstates/black_display_cloth.json c8b65faf51122eb411f5895e718869da9b260c2e assets/create/blockstates/black_nixie_tube.json -edcdce7ec6afbaa00952131df4b3f2c93c2c6919 assets/create/blockstates/black_postbox.json +2449479f4d81a6d16bbd1a469daa2d8f9ba2782e assets/create/blockstates/black_postbox.json 980ae9ba3f6d4e0faea8f3878985f9a9dadc0796 assets/create/blockstates/black_sail.json da3ad0225984a0dcbfb4ed800e307e45aff5aaa1 assets/create/blockstates/black_seat.json 0083f6aa3fda2c7ebb2e5f2a032e740cf3ae3846 assets/create/blockstates/black_toolbox.json @@ -35,7 +35,7 @@ da3ad0225984a0dcbfb4ed800e307e45aff5aaa1 assets/create/blockstates/black_seat.js 06ecd28cd97f4e8200dc396858695cad57b871c8 assets/create/blockstates/blaze_burner.json 88793493e0a7e0713b5ea9f3bbb88395d690b873 assets/create/blockstates/blue_display_cloth.json 37caf031254b5171a1fbfe9906f4bc65e8dbc909 assets/create/blockstates/blue_nixie_tube.json -54f6aae1d573b27979689301ef1c2ad4a3bf6e93 assets/create/blockstates/blue_postbox.json +eec6f598fc517c5f6b36d13f3928364b16f0ae3d assets/create/blockstates/blue_postbox.json d540f0f23e0d7c03f8e147cf3eebbaf7caec9f93 assets/create/blockstates/blue_sail.json d2fdb432bb037de781260c789e905b223fab408c assets/create/blockstates/blue_seat.json f91092da79b69fece9583ccc15350612f439ee1b assets/create/blockstates/blue_toolbox.json @@ -56,7 +56,7 @@ a408005aae4c1caa7aaae5a0ddf9d1ad73cd0254 assets/create/blockstates/brass_funnel. 8ee948f9e87b82bb27aaecc522127fa1297b3d9d assets/create/blockstates/brass_tunnel.json 158c380605f071c89b9de21f2b2737449a72aac3 assets/create/blockstates/brown_display_cloth.json debf33346bf410216f21082e1e8d07aa6250b84c assets/create/blockstates/brown_nixie_tube.json -c23d7f691bf532d6b27317c0063289a8bd747de2 assets/create/blockstates/brown_postbox.json +ad42a677da8d381d6a8d909a602d73c1b9b3bbb7 assets/create/blockstates/brown_postbox.json 1334fc9e71d9f2a6117f448817263467a9c695de assets/create/blockstates/brown_sail.json 19524b2c0672632e63372f405a87dbea35f1d160 assets/create/blockstates/brown_seat.json 1ffc38bf682e84aad4cb300c573375eb0cdcc434 assets/create/blockstates/brown_toolbox.json @@ -219,7 +219,7 @@ c11f09df4a23e951bdf9a345515183f4fac7cde3 assets/create/blockstates/cut_veridium_ 3aa6f5e613ff73952e3de00408051f92316e7f81 assets/create/blockstates/cut_veridium_wall.json d6d25beb53a4393839eeb94472c8feb4c80bac6d assets/create/blockstates/cyan_display_cloth.json bb627b2e78dba6833cf2d357033f253fc89aa1b8 assets/create/blockstates/cyan_nixie_tube.json -3406ab8baa7d9e9892c059c27b5ace92aadc2a80 assets/create/blockstates/cyan_postbox.json +d7d497e5495cd7e8e74422f42caa27682fd06b2d assets/create/blockstates/cyan_postbox.json f1061b8f9757374d6608fda07e301a2623e79f72 assets/create/blockstates/cyan_sail.json 538c6d95da5cc460e99c91647dac61726a91479f assets/create/blockstates/cyan_seat.json c4d84b719762aca46cdb8decddfeb97dcc50676c assets/create/blockstates/cyan_toolbox.json @@ -265,14 +265,14 @@ ff9f56912d8ac4069df90505232820f9c45f5e06 assets/create/blockstates/gantry_carria e3f2a093c436cb65c5a7ac049a14cc4dadb22526 assets/create/blockstates/granite_pillar.json f4e76daf384e628b76890b72775302d65f651176 assets/create/blockstates/gray_display_cloth.json 921cf220c44a67195c90a30c4c296e65311738da assets/create/blockstates/gray_nixie_tube.json -f3153de05bb7658cd2d27ed6becea1b2ea687ae3 assets/create/blockstates/gray_postbox.json +f09f7a6f184992b21610e244310e22a99a01e247 assets/create/blockstates/gray_postbox.json 30ba031a6b5a327d2a4caa12169676da573c2133 assets/create/blockstates/gray_sail.json f35a502c4a5e2703e7c6811b3d2ba16a9c47d4c8 assets/create/blockstates/gray_seat.json 87457e0eddae80225dbb3145f2d120296ea1bfcd assets/create/blockstates/gray_toolbox.json f18b87db39836eef20154b239d488eebb64b3455 assets/create/blockstates/gray_valve_handle.json 7d441d117efce42a787c86355fc69dbd052b5db0 assets/create/blockstates/green_display_cloth.json 0f0fe2bf83f763e04cd2d7a979beb547feac3191 assets/create/blockstates/green_nixie_tube.json -4446fdbf784366888215251fb082ff9b52c2ea6d assets/create/blockstates/green_postbox.json +67aefcca975866a40717725d34770acd8f8908f6 assets/create/blockstates/green_postbox.json 0a2a5fbf2cf084e1be0426a224c291dc22a826fd assets/create/blockstates/green_sail.json b4aede1847d204ecdb7847559066d9d2ffb66903 assets/create/blockstates/green_seat.json 6f080890b3b30c46ba9ceb382c1171940bf4966f assets/create/blockstates/green_toolbox.json @@ -311,14 +311,14 @@ ca124508c59130d21f23d7b1ef354d78bdd24dd4 assets/create/blockstates/layered_tuff. fcf02725651ab5973fab1cfc09fdd68cb4b93579 assets/create/blockstates/lectern_controller.json 2c52c5dff36461c2af7dabce69452fcb3fc13640 assets/create/blockstates/light_blue_display_cloth.json 5d7e1b08b1ec7c7c11b70db11df09311fcd7cf45 assets/create/blockstates/light_blue_nixie_tube.json -f77864045801c12e9308f9ae75fa7c78de15bb7e assets/create/blockstates/light_blue_postbox.json +117eb12e69c9c978474104a749d1071e4980af76 assets/create/blockstates/light_blue_postbox.json f2354e8cb6086473ac97a5228b99706858dcad8a assets/create/blockstates/light_blue_sail.json 6b7045eaf9efe3a90f2d9a6785be6a5fd534b8e7 assets/create/blockstates/light_blue_seat.json b7065e7871c3c7f1a0656c2f92f82544e606f2fb assets/create/blockstates/light_blue_toolbox.json 549882a0f4de60906ca870a6197330f81d4e1afe assets/create/blockstates/light_blue_valve_handle.json 643092c9caa8e586833d9e7fdab7cb059810fb0a assets/create/blockstates/light_gray_display_cloth.json fa5fb2be73c7c54b70e927b66adf3f4d64c5cb6b assets/create/blockstates/light_gray_nixie_tube.json -63aa0bfbba64796ec0096972585d15d5cbed7508 assets/create/blockstates/light_gray_postbox.json +36817126602128d1c463047c9f54a671ed71e04c assets/create/blockstates/light_gray_postbox.json 3d95c9c4442d1bdd660bae382c72c68134db86dd assets/create/blockstates/light_gray_sail.json 8ec5144da4a49dd5b497af07b0d4b88c9c0b6cc0 assets/create/blockstates/light_gray_seat.json 35b151db396069b146d223fbe46be5b0c3dda8a9 assets/create/blockstates/light_gray_toolbox.json @@ -327,7 +327,7 @@ a6f319c803c03e34bbf841ea52d82f0f7ec7a413 assets/create/blockstates/limestone.jso 7ff65e1c4c8e48a0b694cd17506a192e6a7e6e44 assets/create/blockstates/limestone_pillar.json 34d900ed4c9922b82e39b2ee84d24eaffc7017ab assets/create/blockstates/lime_display_cloth.json 7f20b548dd535942b2d6f41c39de7ad4fafe637e assets/create/blockstates/lime_nixie_tube.json -b1b07cbe36064d2755d0f2a4af036ec0506e6995 assets/create/blockstates/lime_postbox.json +1478770b73bf498bd6fa35bd40a38027fd6fd4c8 assets/create/blockstates/lime_postbox.json ad1ec304729fd6d336c0d4d0c27c9345af636695 assets/create/blockstates/lime_sail.json b9934a558e1b495403dc2c71ffb43cce7d396013 assets/create/blockstates/lime_seat.json 49a02f7fc16697ba1cf16cee7e45ab6bfd8b06ce assets/create/blockstates/lime_toolbox.json @@ -336,7 +336,7 @@ ba181485f219d3ae23509a7edf28e25d9edb10f4 assets/create/blockstates/lime_valve_ha e195e82e4d0c1fc20474535bc9068cbb77a5e175 assets/create/blockstates/lit_blaze_burner.json 66775372786ece9b6300b335cf6acbdd2aa91147 assets/create/blockstates/magenta_display_cloth.json 296186b196af94e1ab3f7e8a3254f6d31ae47a5c assets/create/blockstates/magenta_nixie_tube.json -32cf7fc7e7b36b6ef873658946a40cf7c32d5da8 assets/create/blockstates/magenta_postbox.json +f14f13217b4eb7d897e1ed55c790186cc0cecaf5 assets/create/blockstates/magenta_postbox.json f150922cbed1c05fb3892d4ac91eb471234252e2 assets/create/blockstates/magenta_sail.json bb1ab5c70647933400b3a99ef9d166ba5e3d4709 assets/create/blockstates/magenta_seat.json fcd226c7863262d98765c701538bf9e44d2b177e assets/create/blockstates/magenta_toolbox.json @@ -370,7 +370,7 @@ ba9c3ecfacbd398048440d247decffeaefc714b5 assets/create/blockstates/mysterious_cu df91d0ca68934c1afd9858a8d1591dd4cb88df65 assets/create/blockstates/ochrum.json 09c9bee3d26edc4b87cb7a5042f125c439ee5956 assets/create/blockstates/ochrum_pillar.json 0042b5a229d8b7bf89333697fb53ffdda32a153b assets/create/blockstates/orange_display_cloth.json -42799faa0c59e6ed410c1ef42eceef25c323090f assets/create/blockstates/orange_postbox.json +8ff85f8171ff60ebf95f574d6c9f275ae6e98ee0 assets/create/blockstates/orange_postbox.json af4c2c4861d1410e1b7371a5bf3fe09ed3ab0077 assets/create/blockstates/orange_sail.json aab812cecf7d10d4e7587f4dead8a98238a15f41 assets/create/blockstates/orange_seat.json 2bc30ed9907230271b4e2d0786f106f3e1e25029 assets/create/blockstates/orange_toolbox.json @@ -389,7 +389,7 @@ ef3af446b56c69e71a156d5998d9dc8e6d9ea4f5 assets/create/blockstates/packager.json 36742cc6ce052ead143366d31b11e828a525c1b8 assets/create/blockstates/peculiar_bell.json c4de02184f63ed2e7c98cfa5bb30f8c0da10a425 assets/create/blockstates/pink_display_cloth.json 53d102e706d53cb2c0dbc0bc11da828084a43519 assets/create/blockstates/pink_nixie_tube.json -8889da0684a2fd247a769cadbf94fd45e1c218f2 assets/create/blockstates/pink_postbox.json +a238a92b88c32f513c405cde5bd1898d6fe930b7 assets/create/blockstates/pink_postbox.json 213da5c04a33ae8ae7c0a4dec9844bbb6d670e33 assets/create/blockstates/pink_sail.json 8d5c80d5dc561240dfe8d7f212ffc33ac4e0fcd8 assets/create/blockstates/pink_seat.json 90bd26c7c6933f5ebbe17b0fe58f840e2924a0f5 assets/create/blockstates/pink_toolbox.json @@ -463,7 +463,7 @@ df7af1e49c53ae99ac3f0b2fca5d948b8ea91938 assets/create/blockstates/pulley_magnet 65bfd8283749117663f7199204691758fd286e38 assets/create/blockstates/pulse_timer.json 285ff4a4289c3c62a7837639130033922127089d assets/create/blockstates/purple_display_cloth.json b658654aa97e8dd2c897f432a601835a3f8aca10 assets/create/blockstates/purple_nixie_tube.json -af5db46f49be3c13eeb9bcae1803cc6fb47a1c76 assets/create/blockstates/purple_postbox.json +ee36eb7d8b7575f884a1d89c3ee1b4f3a5972a45 assets/create/blockstates/purple_postbox.json f8f9802df9c0b4e39edeefc3b1abb38255d79801 assets/create/blockstates/purple_sail.json 91b5ab66d7ec5235d278ee2bed6ddd88f39ce81d assets/create/blockstates/purple_seat.json 6aa467b3588359fdf5d7201f844193d5b70f20f7 assets/create/blockstates/purple_toolbox.json @@ -476,7 +476,7 @@ ff205f032b36486753dddb1f2029ef8d53e9c86f assets/create/blockstates/redstone_link 9ae6198e13b456ef18582364644071a18cf9324e assets/create/blockstates/redstone_requester.json d8446bc66d6d7da6d3533c961220d3180e4e4c0b assets/create/blockstates/red_display_cloth.json e3fd62e466e3e6e7bd6fc8661f764ba972a466fc assets/create/blockstates/red_nixie_tube.json -d7535074a636f30247e7bd2f1a21685d3231d321 assets/create/blockstates/red_postbox.json +e003cc60f957419c178d5b4ee215485ebeb3191f assets/create/blockstates/red_postbox.json 4c36b562da58ef2af57009da7cf2426059249228 assets/create/blockstates/red_sail.json 145f4e9ffaeff9be180e6c4e4989f2cf44cf0686 assets/create/blockstates/red_seat.json 380f46b7cb72b13c0f16fd4a4287a1a33adeff41 assets/create/blockstates/red_toolbox.json @@ -622,7 +622,7 @@ da110f382368257e15431c77164aef82e014e3f8 assets/create/blockstates/weathered_cop 25ce64b7af5d244f194da91ccf964a9bf5762327 assets/create/blockstates/weighted_ejector.json 1c8b590923b1d78f5ae34ef0d8ba487884b696b3 assets/create/blockstates/white_display_cloth.json 2974b34a8cfb0d4e8e010f8bd085584ea631d541 assets/create/blockstates/white_nixie_tube.json -debbed52643d90ab054171f76622e54192be60ad assets/create/blockstates/white_postbox.json +f128f18e0baa69c94ac9149960cfe810a6c9ecf9 assets/create/blockstates/white_postbox.json f079469d186087d23f0d91b384040f777b0088b1 assets/create/blockstates/white_sail.json 317a6463db64b66d215d25b65ab52fe7f26ba9f8 assets/create/blockstates/white_seat.json 6cb8c82a429b54d6a87d02eec5cfd1fcd5365f1e assets/create/blockstates/white_toolbox.json @@ -631,15 +631,15 @@ ec2720e3f1bc84304d0c81cd23ff1e155b0c2f2c assets/create/blockstates/windmill_bear d688e80dfbd5b17970814887c3698fc721981caa assets/create/blockstates/wooden_bracket.json 1ae2558e739350632a0c2f1a93aea5f832b54d62 assets/create/blockstates/yellow_display_cloth.json 157942a838aa02909fb2238ad9ce77edc82f6142 assets/create/blockstates/yellow_nixie_tube.json -f99bf11ac6b2d8d2a315f354d7704a938241d95e assets/create/blockstates/yellow_postbox.json +c11d93cd5a64e80c7ad2d11d88b656dd7705138b assets/create/blockstates/yellow_postbox.json 68b6e267e93b96dbc0596ea4a1cd26636aa0e04a assets/create/blockstates/yellow_sail.json 4face2dd50a30bda0b21742319e701e666d51f8c assets/create/blockstates/yellow_seat.json b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbox.json fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -c3de6ad9aa8e75977b93d59a36b2fa2e1e4e9445 assets/create/lang/en_ud.json -3cf9afee452951897c1ca572e5f7c3362f897db3 assets/create/lang/en_us.json +d5bb760251e65801c7d8d4c7c99149dfc644ae26 assets/create/lang/en_ud.json +71537c153c046d7ac132c20ed36db50daf6e7284 assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -714,14 +714,16 @@ ee71b0992edc2496025c22806e8de3a3243882aa assets/create/models/block/birch_window cb9d3a0dbac6a884d5ce0dc82085322f8c666707 assets/create/models/block/birch_window_pane_side_alt.json b8f853e8289d735f9a2a8b43785fa0995ac99112 assets/create/models/block/black_display_cloth.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/black_nixie_tube.json -1fe4a9cbcae773f32c07f7cef42f52588ec1c1aa assets/create/models/block/black_postbox.json +1fe4a9cbcae773f32c07f7cef42f52588ec1c1aa assets/create/models/block/black_postbox_closed.json +3caec00f8aa36393cac8049815b3e8bad12d8dae assets/create/models/block/black_postbox_open.json 62c92a681b5a86a5415cc7a70263ffdc794cdd59 assets/create/models/block/black_sail.json 443ed49b053fdd7356cd56f0495e18f2570d57d9 assets/create/models/block/black_seat.json f48989d377de8e5067e807adf7e38da781e37ed9 assets/create/models/block/black_toolbox.json 8715787d72c3ef47c5651abcd819539bad6a96f7 assets/create/models/block/black_valve_handle.json e0eebf58af7ce6789dd3908f216e81e363fcdea6 assets/create/models/block/blue_display_cloth.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/blue_nixie_tube.json -e9e9487a3440b3a6c1ac515f63385ee59e8fb773 assets/create/models/block/blue_postbox.json +e9e9487a3440b3a6c1ac515f63385ee59e8fb773 assets/create/models/block/blue_postbox_closed.json +7e2df652bfc7fdc27da6a52b52fe732fa175c996 assets/create/models/block/blue_postbox_open.json ddc740084aa5f387bee062bd4141ad8fadb56355 assets/create/models/block/blue_sail.json 96431b1f3a531ce89f876c9286b81838aec9b6d3 assets/create/models/block/blue_seat.json 89932aab163b14a21fffd4fab4b8b88a94163089 assets/create/models/block/blue_toolbox.json @@ -776,7 +778,8 @@ ec81e9c237ec98b30a3de22e12cb9720922478eb assets/create/models/block/brass_side.j c697cace1f4097468ff34254c4ff6450d9d52f91 assets/create/models/block/brass_side_alt.json 5996b728460cf24e25890d977cdca49d2927465a assets/create/models/block/brown_display_cloth.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/brown_nixie_tube.json -b04c80852527a07e01c27686be678cbaf568e821 assets/create/models/block/brown_postbox.json +b04c80852527a07e01c27686be678cbaf568e821 assets/create/models/block/brown_postbox_closed.json +19a2045ecedd3ef12cda7d69a0d7bc6a4133b7f1 assets/create/models/block/brown_postbox_open.json 50a054d1e0660d16e86cf7a520b9bf36e38401b6 assets/create/models/block/brown_sail.json 0616de192825246e6036d1f69911170438a83b81 assets/create/models/block/brown_seat.json 4226a7c5f1bfb0a75457fb4dfd22448503110e5c assets/create/models/block/brown_toolbox.json @@ -1110,7 +1113,8 @@ b2e847cee8c01791c15fcdd35787af33ebe46f0a assets/create/models/block/cut_veridium 5ab4db4245b852edf985fe72595f678eb7372801 assets/create/models/block/cut_veridium_wall_side_tall.json 983788579d7ec61b805d1057b81a18282af38365 assets/create/models/block/cyan_display_cloth.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/cyan_nixie_tube.json -0cbd0c6c909effa2f71e198655d51f2e483454aa assets/create/models/block/cyan_postbox.json +0cbd0c6c909effa2f71e198655d51f2e483454aa assets/create/models/block/cyan_postbox_closed.json +ccea6f3023879d84de4590a584f666598f58d6bc assets/create/models/block/cyan_postbox_open.json 27c9aff76b32e4de18d581e133fc23a8239ca412 assets/create/models/block/cyan_sail.json 01a324a92552076589e2aaaeca9d4da2d1e3b39d assets/create/models/block/cyan_seat.json 663f431fe8a02e057980cf9bcfc566eb5adc876f assets/create/models/block/cyan_toolbox.json @@ -1193,14 +1197,16 @@ d0fa41de17f65693188f1868ace5fc2ac518739b assets/create/models/block/gantry_shaft ee860a8bd95fda14a859d6632652ee2a95f06c19 assets/create/models/block/granite_pillar_horizontal.json ca01316f75239f08d7da81615779f8eb002de88f assets/create/models/block/gray_display_cloth.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/gray_nixie_tube.json -f2bbb067bc4e91a71303cc92939c4f4707cdc1ab assets/create/models/block/gray_postbox.json +f2bbb067bc4e91a71303cc92939c4f4707cdc1ab assets/create/models/block/gray_postbox_closed.json +905fb4b54a39ca9bc1d6f48977bb3b158b17c2a1 assets/create/models/block/gray_postbox_open.json 97f382e9b435c81d1d8e0ed487a7fc16e6945958 assets/create/models/block/gray_sail.json 58b51da5c80e4f43582452d97453c93145a516ad assets/create/models/block/gray_seat.json cd3cff8e38d559dcb78df014556a78d5a538af43 assets/create/models/block/gray_toolbox.json 3ee19f46bdeb0ac7489dcd4d51f90ab01ad863c9 assets/create/models/block/gray_valve_handle.json 71fae019670515f2c5bf7bd1f7930d76b6ff3e15 assets/create/models/block/green_display_cloth.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/green_nixie_tube.json -21fbacdc856fb1003f58bf2842fe418124f6b01d assets/create/models/block/green_postbox.json +21fbacdc856fb1003f58bf2842fe418124f6b01d assets/create/models/block/green_postbox_closed.json +703df2f5307d39f0f4e5b9a1f99b8c14fd819dd0 assets/create/models/block/green_postbox_open.json 26577589688ec1f39cae9f42704cb36cbc1c48ae assets/create/models/block/green_sail.json ae51eaa500dd036fa27474a7392f381afb677dfd assets/create/models/block/green_seat.json 801d277b241332d5f4b49bdb00b911dcd01a7db2 assets/create/models/block/green_toolbox.json @@ -1245,14 +1251,16 @@ b843a6e27c4f90e31108f9f3c1573e70fb3d0927 assets/create/models/block/layered_scor 336d1646294e018ea3de60b30a621a10ca7aa6d7 assets/create/models/block/layered_veridium.json f479a8a6964c52fc3b072ca3170d5b478f62842a assets/create/models/block/light_blue_display_cloth.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/light_blue_nixie_tube.json -cf487c0be9444b7ac124d2ae33e6c545803e14b6 assets/create/models/block/light_blue_postbox.json +cf487c0be9444b7ac124d2ae33e6c545803e14b6 assets/create/models/block/light_blue_postbox_closed.json +7497701edea1599fc51e3eaa0367007ca00bbe69 assets/create/models/block/light_blue_postbox_open.json 2e83d3aaa92640d6b3da2a2644f6a160f97b08e4 assets/create/models/block/light_blue_sail.json ba917560f40a4e46ef190649f18adad9962c5c02 assets/create/models/block/light_blue_seat.json c20616aa90feab3003cecb4a5be5466c0fc83072 assets/create/models/block/light_blue_toolbox.json bcd3d28b8a062649301648ea5e2d0463f93d008d assets/create/models/block/light_blue_valve_handle.json 8de84b9d3eb33403de699c5c5c4093e32b1685f9 assets/create/models/block/light_gray_display_cloth.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/light_gray_nixie_tube.json -1efabd28f0dc3db1c0e6bea2be62cac883fefd66 assets/create/models/block/light_gray_postbox.json +1efabd28f0dc3db1c0e6bea2be62cac883fefd66 assets/create/models/block/light_gray_postbox_closed.json +a42521eac2924269cb1f0e865bafe7dcd147d1cc assets/create/models/block/light_gray_postbox_open.json 09f284574b38ab57579e939bbb088b8d36e0b8f5 assets/create/models/block/light_gray_sail.json d1813d0f548fcddb361df7cc3b5d97582842b10f assets/create/models/block/light_gray_seat.json 4ec5d701dd8b2d8c3dc44d05f527a3d737002cd4 assets/create/models/block/light_gray_toolbox.json @@ -1262,7 +1270,8 @@ adb8dbed70419e0310e7a20f3656bf325b348434 assets/create/models/block/light_gray_v fb18280a2a708f60b00cc7c675804c219784871a assets/create/models/block/limestone_pillar_horizontal.json 023f2538cd860e3ade165390eab9e4fe32847402 assets/create/models/block/lime_display_cloth.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/lime_nixie_tube.json -952d292d4dc2158e6106c5079cfa1ddb81c7777e assets/create/models/block/lime_postbox.json +952d292d4dc2158e6106c5079cfa1ddb81c7777e assets/create/models/block/lime_postbox_closed.json +4357f5d9102d54c7fbe5325512a2cd42d94d6d42 assets/create/models/block/lime_postbox_open.json 5a95a72444f523cfba6e8c5adf8eacbb37e2d21e assets/create/models/block/lime_sail.json 09e7bf50cf88c449dbd9e77829cdb5afffb7d88d assets/create/models/block/lime_seat.json b92822a01e4fbed2463b1bdf7dcc736023988e20 assets/create/models/block/lime_toolbox.json @@ -1273,7 +1282,8 @@ a1a3804ddcb1db0a7b5c0693555f8eb326950dd0 assets/create/models/block/linear_chass f885acc0ba705cfa9c65b62626ab4007f3b6e329 assets/create/models/block/linear_chassis_top_bottom.json e23d016fe71681e6b13fece5d14d95da5fb45fbb assets/create/models/block/magenta_display_cloth.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/magenta_nixie_tube.json -bfea3fd456f92391afc9f948ade90b16275e63de assets/create/models/block/magenta_postbox.json +bfea3fd456f92391afc9f948ade90b16275e63de assets/create/models/block/magenta_postbox_closed.json +fe224c9e396eb51a6cc0b38175b621a56500fda7 assets/create/models/block/magenta_postbox_open.json 81122f26a12b7ab40fed6d31c97376f4dfffa111 assets/create/models/block/magenta_sail.json b5cd13b021400b3c37499ec4ef22e560c721ac54 assets/create/models/block/magenta_seat.json d7b2b16ba2d6a0b2441aeaf7faa76f61fbdc35e7 assets/create/models/block/magenta_toolbox.json @@ -1299,7 +1309,8 @@ d69effa0a811cb93fead8257bcaad4bbf0094002 assets/create/models/block/ochrum_natur 24669a4e93925940477fcfc0aca10ab9d87368e0 assets/create/models/block/ochrum_pillar.json c8dd33a0b71dce37712788a61729de89574b117f assets/create/models/block/ochrum_pillar_horizontal.json 6ba7beb0581d761ce06dad03cdd19e591e392546 assets/create/models/block/orange_display_cloth.json -dbd0cbfa1c6cfaddd7ac954379b4b1f3056730f2 assets/create/models/block/orange_postbox.json +dbd0cbfa1c6cfaddd7ac954379b4b1f3056730f2 assets/create/models/block/orange_postbox_closed.json +88cda1f606e502cf0df9430b75a70fd3161fd6ba assets/create/models/block/orange_postbox_open.json cb4cd4e4bfb0d105a09c56454abf4795b155d12b assets/create/models/block/orange_sail.json 6c4addc75fb03911fca3083f891b22f55209b8db assets/create/models/block/orange_seat.json f68eeb8cd828a0659fe8665373daf093ea65f0fc assets/create/models/block/orange_toolbox.json @@ -1328,7 +1339,8 @@ b9c9d00b844ca2f217ae21cc502cd4d082fed2d5 assets/create/models/block/peculiar_bel f7b09c243cfeda8bb38a29a917b9fbdafe47eece assets/create/models/block/peculiar_bell_single_wall.json 266d126aa95d03fc274d838986fc1f53519f4e10 assets/create/models/block/pink_display_cloth.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/pink_nixie_tube.json -084266ced8975953fa158fd9e7261d8f10b94db7 assets/create/models/block/pink_postbox.json +084266ced8975953fa158fd9e7261d8f10b94db7 assets/create/models/block/pink_postbox_closed.json +e99518b61a3c7a89570a8aa8c4cb45badfa8547a assets/create/models/block/pink_postbox_open.json 90113a1f53f0f8d9ce11ff14128eb860063f5ddc assets/create/models/block/pink_sail.json 888dba067e751a55205dbd919db8e92ef2be604d assets/create/models/block/pink_seat.json 3cb69299c7787f88fb41c6397362aa7b607c0960 assets/create/models/block/pink_toolbox.json @@ -1488,7 +1500,8 @@ ab3d7e10abcb53b835d6f5c406b7a777a942d6f7 assets/create/models/block/pulse_timer_ 7b425d9db8d914b52b7faad2f792c020b678f84d assets/create/models/block/pulse_timer_powering.json 7688c890be93afa905bd869ef0bcdc603bce9a78 assets/create/models/block/purple_display_cloth.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/purple_nixie_tube.json -afdd265ee175c47ea6e4e44fb08d212e4cef5ee5 assets/create/models/block/purple_postbox.json +afdd265ee175c47ea6e4e44fb08d212e4cef5ee5 assets/create/models/block/purple_postbox_closed.json +fbd874fd63b3d6f50592703dce6bf196f2d63732 assets/create/models/block/purple_postbox_open.json 356378a5839b0b400aa5e0a67740634113c09a38 assets/create/models/block/purple_sail.json bc8e473a5662b6180b00b85e5006241a283c9baa assets/create/models/block/purple_seat.json 5e85ec98c165a0b5bfe25d391e96df9164372a3a assets/create/models/block/purple_toolbox.json @@ -1503,7 +1516,8 @@ ff65b89683fbb9326f625b9a68f954def5ed000d assets/create/models/block/radial_chass be8042806b08990786ced1cf140c4942d7a6788b assets/create/models/block/raw_zinc_block.json 832899421073c18da17bf6919c97e2f3cf9a6b77 assets/create/models/block/red_display_cloth.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/red_nixie_tube.json -844614001c30ef34d3136a350c12018c5e9ab341 assets/create/models/block/red_postbox.json +844614001c30ef34d3136a350c12018c5e9ab341 assets/create/models/block/red_postbox_closed.json +d06791faedd062464a13972a3b64de86053aeac7 assets/create/models/block/red_postbox_open.json b692deeb65f338212fb1073b725a122b7b1359d5 assets/create/models/block/red_sail.json bf3f4ba33e1a61254073ecee3e753958f8debb35 assets/create/models/block/red_seat.json 2a13766aebac1a392ae7bf934bd81d9210c87a24 assets/create/models/block/red_toolbox.json @@ -1762,14 +1776,16 @@ b658c1022587bd670b5acee267607719c1544332 assets/create/models/block/weathered_co e7ae89577be9d26a071bf96cbd7ed80293902b63 assets/create/models/block/weathered_copper_tile_stairs_outer.json 15316edd1babb61b1458cf81feaf2c3e135122b6 assets/create/models/block/white_display_cloth.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/white_nixie_tube.json -998d838964c6c5bc2a1903b5098491abf5d819bc assets/create/models/block/white_postbox.json +998d838964c6c5bc2a1903b5098491abf5d819bc assets/create/models/block/white_postbox_closed.json +e89fe63260b94fc70e360eceb3d04b74242c248f assets/create/models/block/white_postbox_open.json 99f0628623a36ac1700a5876cec010ee6353162f assets/create/models/block/white_seat.json f252f8c68702a0c050797a2dc2a51c586408722d assets/create/models/block/white_toolbox.json c9e344a06ee8bca1bfddd70481198135cabafbce assets/create/models/block/white_valve_handle.json 68d8eddfb724c73938862fb1a213a99c95814fdb assets/create/models/block/windmill_bearing.json 6c063bc2ef06940af3a1d3d0f1546030bdaef672 assets/create/models/block/yellow_display_cloth.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/yellow_nixie_tube.json -9abbd0af47396b1cb18362b423f497ddb40eede4 assets/create/models/block/yellow_postbox.json +9abbd0af47396b1cb18362b423f497ddb40eede4 assets/create/models/block/yellow_postbox_closed.json +098b675ef5071a32bce387445da09067917852c7 assets/create/models/block/yellow_postbox_open.json cf8477d6c7558ceba38416fae755567086a856a6 assets/create/models/block/yellow_sail.json 07b68f0e4c617dfe3e935a1b9e8e020ab3131c0b assets/create/models/block/yellow_seat.json 21bb6e0b43984214c496e531e16dd60aeb619a42 assets/create/models/block/yellow_toolbox.json @@ -3185,7 +3201,7 @@ bb9d906a97810ed1461ed321ef8e4bee1dd104fb data/create/loot_tables/blocks/blue_sai 833fe6bc3020055dd0d6f46b324cbe27b248708d data/create/loot_tables/blocks/blue_seat.json 9d22716d9d846dc9587e327dfcdf18dd5955f826 data/create/loot_tables/blocks/blue_toolbox.json 6d7ecb10e21b1e12c83c71736f14cbba3ccd7aaf data/create/loot_tables/blocks/blue_valve_handle.json -14f1cffb75761dc7e6223aa16a5d84da10dc2813 data/create/loot_tables/blocks/bound_cardboard_block.json +53e01f63aa47aa00575240ccdf867b4d6c392385 data/create/loot_tables/blocks/bound_cardboard_block.json 7d8b199f381003e5a74a8144976b65c93a09dbcb data/create/loot_tables/blocks/brass_bars.json 64a5869c6b3edeca06771f8ef64ef9521d83302a data/create/loot_tables/blocks/brass_belt_funnel.json 78ecee2c9baf6b0c78f6c7aa692e102a3f4dda74 data/create/loot_tables/blocks/brass_block.json diff --git a/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 b/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 index 9561427a32..395042fc01 100644 --- a/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 +++ b/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 @@ -1,4 +1,4 @@ -// 1.20.1 2024-10-30T15:58:08.6667432 Create's Standard Recipes +// 1.20.1 2024-11-01T09:46:44.6761844 Create's Standard Recipes a8cc4af26f6c7c45a9eef12e92af1452fe042454 data/create/advancements/recipes/combat/crafting/appliances/netherite_backtank.json 2c2639c7b307ee7c7a4e97e5efebf496788998ad data/create/advancements/recipes/combat/crafting/appliances/netherite_backtank_from_netherite.json 81dcf0cb1aa99e39bc7d1a386e07cad4cee7d8b9 data/create/advancements/recipes/combat/crafting/appliances/netherite_diving_boots.json @@ -454,7 +454,7 @@ ac524c110f66a7433208a888c5f3bb69e5e95743 data/create/recipes/crafting/materials/ e6bb68a1d2ed5a629c83f5a0eefb843bb890736d data/create/recipes/crafting/materials/andesite_alloy_block.json eebacb477bcce876622173289b06e1ad21424686 data/create/recipes/crafting/materials/andesite_alloy_from_block.json 5008707e622c0fa0b6df32da5da7230a4da574ca data/create/recipes/crafting/materials/andesite_alloy_from_zinc.json -455730ac3f06c0b2ef20992ec23edd36cd65194b data/create/recipes/crafting/materials/bound_cardboard_block.json +ba8ec9cb0894132cd4e0d14322a388c061706a29 data/create/recipes/crafting/materials/bound_cardboard_block.json f9f94e5082e7971e55b25bc00ba86c3579b492aa data/create/recipes/crafting/materials/brass_block_from_compacting.json ecd8581ad4a04cc1217133363bd15d76129cb651 data/create/recipes/crafting/materials/brass_ingot_from_compacting.json fe2f3c0722aa0f6b41ad0f497b9742eb856c0dd0 data/create/recipes/crafting/materials/brass_ingot_from_decompacting.json diff --git a/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 b/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 index ebcc73eea7..a6e4275848 100644 --- a/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 +++ b/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 @@ -1,4 +1,4 @@ -// 1.20.1 2024-10-18T15:46:50.4883378 Create's Processing Recipes +// 1.20.1 2024-11-01T09:46:44.623326 Create's Processing Recipes 3c94326fb730f68c1e44fe1e2ef09c9db6ffd92b data/create/recipes/compacting/andesite_from_flint.json 8d3d5b31f3601b9f681ff710e0545a483a1494c6 data/create/recipes/compacting/blaze_cake.json 8bd7f4e3a686ab520b2d55594d2018d0e9a50c91 data/create/recipes/compacting/chocolate.json @@ -752,6 +752,7 @@ a701fb82072d60320aa9b0280fa58c58296e8e42 data/create/recipes/haunting/soul_sand. b18c81c17d395fb6e9291fc010576914000f069d data/create/recipes/haunting/warped_fungus.json 409c94b597bc0e35cce51282428fc02b919bb55e data/create/recipes/item_application/andesite_casing_from_log.json 4816a96aa0117b826ec01f9351c98eaec4e132fd data/create/recipes/item_application/andesite_casing_from_wood.json +59b5145feb9f433aaab98bb7e3f1070499768210 data/create/recipes/item_application/bound_cardboard_inworld.json ac734bd72012ab3f0fd362fdcf237191874e1eae data/create/recipes/item_application/brass_casing_from_log.json df1d95a4e41fb01d0ac240f89dcf734e00d92853 data/create/recipes/item_application/brass_casing_from_wood.json a9e164ba47552af7df82f011080d981420388bc6 data/create/recipes/item_application/copper_casing_from_log.json diff --git a/src/generated/resources/assets/create/blockstates/black_postbox.json b/src/generated/resources/assets/create/blockstates/black_postbox.json index 55f5338a0b..f5654df01e 100644 --- a/src/generated/resources/assets/create/blockstates/black_postbox.json +++ b/src/generated/resources/assets/create/blockstates/black_postbox.json @@ -1,33 +1,33 @@ { "variants": { "facing=east,open=false": { - "model": "create:block/black_postbox", + "model": "create:block/black_postbox_closed", "y": 90 }, "facing=east,open=true": { - "model": "create:block/black_postbox", + "model": "create:block/black_postbox_open", "y": 90 }, "facing=north,open=false": { - "model": "create:block/black_postbox" + "model": "create:block/black_postbox_closed" }, "facing=north,open=true": { - "model": "create:block/black_postbox" + "model": "create:block/black_postbox_open" }, "facing=south,open=false": { - "model": "create:block/black_postbox", + "model": "create:block/black_postbox_closed", "y": 180 }, "facing=south,open=true": { - "model": "create:block/black_postbox", + "model": "create:block/black_postbox_open", "y": 180 }, "facing=west,open=false": { - "model": "create:block/black_postbox", + "model": "create:block/black_postbox_closed", "y": 270 }, "facing=west,open=true": { - "model": "create:block/black_postbox", + "model": "create:block/black_postbox_open", "y": 270 } } diff --git a/src/generated/resources/assets/create/blockstates/blue_postbox.json b/src/generated/resources/assets/create/blockstates/blue_postbox.json index a33c5e87a5..ab1d61e9ed 100644 --- a/src/generated/resources/assets/create/blockstates/blue_postbox.json +++ b/src/generated/resources/assets/create/blockstates/blue_postbox.json @@ -1,33 +1,33 @@ { "variants": { "facing=east,open=false": { - "model": "create:block/blue_postbox", + "model": "create:block/blue_postbox_closed", "y": 90 }, "facing=east,open=true": { - "model": "create:block/blue_postbox", + "model": "create:block/blue_postbox_open", "y": 90 }, "facing=north,open=false": { - "model": "create:block/blue_postbox" + "model": "create:block/blue_postbox_closed" }, "facing=north,open=true": { - "model": "create:block/blue_postbox" + "model": "create:block/blue_postbox_open" }, "facing=south,open=false": { - "model": "create:block/blue_postbox", + "model": "create:block/blue_postbox_closed", "y": 180 }, "facing=south,open=true": { - "model": "create:block/blue_postbox", + "model": "create:block/blue_postbox_open", "y": 180 }, "facing=west,open=false": { - "model": "create:block/blue_postbox", + "model": "create:block/blue_postbox_closed", "y": 270 }, "facing=west,open=true": { - "model": "create:block/blue_postbox", + "model": "create:block/blue_postbox_open", "y": 270 } } diff --git a/src/generated/resources/assets/create/blockstates/brown_postbox.json b/src/generated/resources/assets/create/blockstates/brown_postbox.json index ad38686dbb..77f3075357 100644 --- a/src/generated/resources/assets/create/blockstates/brown_postbox.json +++ b/src/generated/resources/assets/create/blockstates/brown_postbox.json @@ -1,33 +1,33 @@ { "variants": { "facing=east,open=false": { - "model": "create:block/brown_postbox", + "model": "create:block/brown_postbox_closed", "y": 90 }, "facing=east,open=true": { - "model": "create:block/brown_postbox", + "model": "create:block/brown_postbox_open", "y": 90 }, "facing=north,open=false": { - "model": "create:block/brown_postbox" + "model": "create:block/brown_postbox_closed" }, "facing=north,open=true": { - "model": "create:block/brown_postbox" + "model": "create:block/brown_postbox_open" }, "facing=south,open=false": { - "model": "create:block/brown_postbox", + "model": "create:block/brown_postbox_closed", "y": 180 }, "facing=south,open=true": { - "model": "create:block/brown_postbox", + "model": "create:block/brown_postbox_open", "y": 180 }, "facing=west,open=false": { - "model": "create:block/brown_postbox", + "model": "create:block/brown_postbox_closed", "y": 270 }, "facing=west,open=true": { - "model": "create:block/brown_postbox", + "model": "create:block/brown_postbox_open", "y": 270 } } diff --git a/src/generated/resources/assets/create/blockstates/cyan_postbox.json b/src/generated/resources/assets/create/blockstates/cyan_postbox.json index 3cffa0f9c2..0dab80b26c 100644 --- a/src/generated/resources/assets/create/blockstates/cyan_postbox.json +++ b/src/generated/resources/assets/create/blockstates/cyan_postbox.json @@ -1,33 +1,33 @@ { "variants": { "facing=east,open=false": { - "model": "create:block/cyan_postbox", + "model": "create:block/cyan_postbox_closed", "y": 90 }, "facing=east,open=true": { - "model": "create:block/cyan_postbox", + "model": "create:block/cyan_postbox_open", "y": 90 }, "facing=north,open=false": { - "model": "create:block/cyan_postbox" + "model": "create:block/cyan_postbox_closed" }, "facing=north,open=true": { - "model": "create:block/cyan_postbox" + "model": "create:block/cyan_postbox_open" }, "facing=south,open=false": { - "model": "create:block/cyan_postbox", + "model": "create:block/cyan_postbox_closed", "y": 180 }, "facing=south,open=true": { - "model": "create:block/cyan_postbox", + "model": "create:block/cyan_postbox_open", "y": 180 }, "facing=west,open=false": { - "model": "create:block/cyan_postbox", + "model": "create:block/cyan_postbox_closed", "y": 270 }, "facing=west,open=true": { - "model": "create:block/cyan_postbox", + "model": "create:block/cyan_postbox_open", "y": 270 } } diff --git a/src/generated/resources/assets/create/blockstates/gray_postbox.json b/src/generated/resources/assets/create/blockstates/gray_postbox.json index d072c5fd06..c4b241be33 100644 --- a/src/generated/resources/assets/create/blockstates/gray_postbox.json +++ b/src/generated/resources/assets/create/blockstates/gray_postbox.json @@ -1,33 +1,33 @@ { "variants": { "facing=east,open=false": { - "model": "create:block/gray_postbox", + "model": "create:block/gray_postbox_closed", "y": 90 }, "facing=east,open=true": { - "model": "create:block/gray_postbox", + "model": "create:block/gray_postbox_open", "y": 90 }, "facing=north,open=false": { - "model": "create:block/gray_postbox" + "model": "create:block/gray_postbox_closed" }, "facing=north,open=true": { - "model": "create:block/gray_postbox" + "model": "create:block/gray_postbox_open" }, "facing=south,open=false": { - "model": "create:block/gray_postbox", + "model": "create:block/gray_postbox_closed", "y": 180 }, "facing=south,open=true": { - "model": "create:block/gray_postbox", + "model": "create:block/gray_postbox_open", "y": 180 }, "facing=west,open=false": { - "model": "create:block/gray_postbox", + "model": "create:block/gray_postbox_closed", "y": 270 }, "facing=west,open=true": { - "model": "create:block/gray_postbox", + "model": "create:block/gray_postbox_open", "y": 270 } } diff --git a/src/generated/resources/assets/create/blockstates/green_postbox.json b/src/generated/resources/assets/create/blockstates/green_postbox.json index 1f7dc4cf28..127f9c2e90 100644 --- a/src/generated/resources/assets/create/blockstates/green_postbox.json +++ b/src/generated/resources/assets/create/blockstates/green_postbox.json @@ -1,33 +1,33 @@ { "variants": { "facing=east,open=false": { - "model": "create:block/green_postbox", + "model": "create:block/green_postbox_closed", "y": 90 }, "facing=east,open=true": { - "model": "create:block/green_postbox", + "model": "create:block/green_postbox_open", "y": 90 }, "facing=north,open=false": { - "model": "create:block/green_postbox" + "model": "create:block/green_postbox_closed" }, "facing=north,open=true": { - "model": "create:block/green_postbox" + "model": "create:block/green_postbox_open" }, "facing=south,open=false": { - "model": "create:block/green_postbox", + "model": "create:block/green_postbox_closed", "y": 180 }, "facing=south,open=true": { - "model": "create:block/green_postbox", + "model": "create:block/green_postbox_open", "y": 180 }, "facing=west,open=false": { - "model": "create:block/green_postbox", + "model": "create:block/green_postbox_closed", "y": 270 }, "facing=west,open=true": { - "model": "create:block/green_postbox", + "model": "create:block/green_postbox_open", "y": 270 } } diff --git a/src/generated/resources/assets/create/blockstates/light_blue_postbox.json b/src/generated/resources/assets/create/blockstates/light_blue_postbox.json index 2032c913e9..1e42fef094 100644 --- a/src/generated/resources/assets/create/blockstates/light_blue_postbox.json +++ b/src/generated/resources/assets/create/blockstates/light_blue_postbox.json @@ -1,33 +1,33 @@ { "variants": { "facing=east,open=false": { - "model": "create:block/light_blue_postbox", + "model": "create:block/light_blue_postbox_closed", "y": 90 }, "facing=east,open=true": { - "model": "create:block/light_blue_postbox", + "model": "create:block/light_blue_postbox_open", "y": 90 }, "facing=north,open=false": { - "model": "create:block/light_blue_postbox" + "model": "create:block/light_blue_postbox_closed" }, "facing=north,open=true": { - "model": "create:block/light_blue_postbox" + "model": "create:block/light_blue_postbox_open" }, "facing=south,open=false": { - "model": "create:block/light_blue_postbox", + "model": "create:block/light_blue_postbox_closed", "y": 180 }, "facing=south,open=true": { - "model": "create:block/light_blue_postbox", + "model": "create:block/light_blue_postbox_open", "y": 180 }, "facing=west,open=false": { - "model": "create:block/light_blue_postbox", + "model": "create:block/light_blue_postbox_closed", "y": 270 }, "facing=west,open=true": { - "model": "create:block/light_blue_postbox", + "model": "create:block/light_blue_postbox_open", "y": 270 } } diff --git a/src/generated/resources/assets/create/blockstates/light_gray_postbox.json b/src/generated/resources/assets/create/blockstates/light_gray_postbox.json index 8718ed56cf..3561ff37c9 100644 --- a/src/generated/resources/assets/create/blockstates/light_gray_postbox.json +++ b/src/generated/resources/assets/create/blockstates/light_gray_postbox.json @@ -1,33 +1,33 @@ { "variants": { "facing=east,open=false": { - "model": "create:block/light_gray_postbox", + "model": "create:block/light_gray_postbox_closed", "y": 90 }, "facing=east,open=true": { - "model": "create:block/light_gray_postbox", + "model": "create:block/light_gray_postbox_open", "y": 90 }, "facing=north,open=false": { - "model": "create:block/light_gray_postbox" + "model": "create:block/light_gray_postbox_closed" }, "facing=north,open=true": { - "model": "create:block/light_gray_postbox" + "model": "create:block/light_gray_postbox_open" }, "facing=south,open=false": { - "model": "create:block/light_gray_postbox", + "model": "create:block/light_gray_postbox_closed", "y": 180 }, "facing=south,open=true": { - "model": "create:block/light_gray_postbox", + "model": "create:block/light_gray_postbox_open", "y": 180 }, "facing=west,open=false": { - "model": "create:block/light_gray_postbox", + "model": "create:block/light_gray_postbox_closed", "y": 270 }, "facing=west,open=true": { - "model": "create:block/light_gray_postbox", + "model": "create:block/light_gray_postbox_open", "y": 270 } } diff --git a/src/generated/resources/assets/create/blockstates/lime_postbox.json b/src/generated/resources/assets/create/blockstates/lime_postbox.json index f7dc692eb0..b60e715c60 100644 --- a/src/generated/resources/assets/create/blockstates/lime_postbox.json +++ b/src/generated/resources/assets/create/blockstates/lime_postbox.json @@ -1,33 +1,33 @@ { "variants": { "facing=east,open=false": { - "model": "create:block/lime_postbox", + "model": "create:block/lime_postbox_closed", "y": 90 }, "facing=east,open=true": { - "model": "create:block/lime_postbox", + "model": "create:block/lime_postbox_open", "y": 90 }, "facing=north,open=false": { - "model": "create:block/lime_postbox" + "model": "create:block/lime_postbox_closed" }, "facing=north,open=true": { - "model": "create:block/lime_postbox" + "model": "create:block/lime_postbox_open" }, "facing=south,open=false": { - "model": "create:block/lime_postbox", + "model": "create:block/lime_postbox_closed", "y": 180 }, "facing=south,open=true": { - "model": "create:block/lime_postbox", + "model": "create:block/lime_postbox_open", "y": 180 }, "facing=west,open=false": { - "model": "create:block/lime_postbox", + "model": "create:block/lime_postbox_closed", "y": 270 }, "facing=west,open=true": { - "model": "create:block/lime_postbox", + "model": "create:block/lime_postbox_open", "y": 270 } } diff --git a/src/generated/resources/assets/create/blockstates/magenta_postbox.json b/src/generated/resources/assets/create/blockstates/magenta_postbox.json index d385e8276a..13b16c5cec 100644 --- a/src/generated/resources/assets/create/blockstates/magenta_postbox.json +++ b/src/generated/resources/assets/create/blockstates/magenta_postbox.json @@ -1,33 +1,33 @@ { "variants": { "facing=east,open=false": { - "model": "create:block/magenta_postbox", + "model": "create:block/magenta_postbox_closed", "y": 90 }, "facing=east,open=true": { - "model": "create:block/magenta_postbox", + "model": "create:block/magenta_postbox_open", "y": 90 }, "facing=north,open=false": { - "model": "create:block/magenta_postbox" + "model": "create:block/magenta_postbox_closed" }, "facing=north,open=true": { - "model": "create:block/magenta_postbox" + "model": "create:block/magenta_postbox_open" }, "facing=south,open=false": { - "model": "create:block/magenta_postbox", + "model": "create:block/magenta_postbox_closed", "y": 180 }, "facing=south,open=true": { - "model": "create:block/magenta_postbox", + "model": "create:block/magenta_postbox_open", "y": 180 }, "facing=west,open=false": { - "model": "create:block/magenta_postbox", + "model": "create:block/magenta_postbox_closed", "y": 270 }, "facing=west,open=true": { - "model": "create:block/magenta_postbox", + "model": "create:block/magenta_postbox_open", "y": 270 } } diff --git a/src/generated/resources/assets/create/blockstates/orange_postbox.json b/src/generated/resources/assets/create/blockstates/orange_postbox.json index 6a94bd86d7..fe6665e0dc 100644 --- a/src/generated/resources/assets/create/blockstates/orange_postbox.json +++ b/src/generated/resources/assets/create/blockstates/orange_postbox.json @@ -1,33 +1,33 @@ { "variants": { "facing=east,open=false": { - "model": "create:block/orange_postbox", + "model": "create:block/orange_postbox_closed", "y": 90 }, "facing=east,open=true": { - "model": "create:block/orange_postbox", + "model": "create:block/orange_postbox_open", "y": 90 }, "facing=north,open=false": { - "model": "create:block/orange_postbox" + "model": "create:block/orange_postbox_closed" }, "facing=north,open=true": { - "model": "create:block/orange_postbox" + "model": "create:block/orange_postbox_open" }, "facing=south,open=false": { - "model": "create:block/orange_postbox", + "model": "create:block/orange_postbox_closed", "y": 180 }, "facing=south,open=true": { - "model": "create:block/orange_postbox", + "model": "create:block/orange_postbox_open", "y": 180 }, "facing=west,open=false": { - "model": "create:block/orange_postbox", + "model": "create:block/orange_postbox_closed", "y": 270 }, "facing=west,open=true": { - "model": "create:block/orange_postbox", + "model": "create:block/orange_postbox_open", "y": 270 } } diff --git a/src/generated/resources/assets/create/blockstates/pink_postbox.json b/src/generated/resources/assets/create/blockstates/pink_postbox.json index daf6c2a355..ee0556c3dd 100644 --- a/src/generated/resources/assets/create/blockstates/pink_postbox.json +++ b/src/generated/resources/assets/create/blockstates/pink_postbox.json @@ -1,33 +1,33 @@ { "variants": { "facing=east,open=false": { - "model": "create:block/pink_postbox", + "model": "create:block/pink_postbox_closed", "y": 90 }, "facing=east,open=true": { - "model": "create:block/pink_postbox", + "model": "create:block/pink_postbox_open", "y": 90 }, "facing=north,open=false": { - "model": "create:block/pink_postbox" + "model": "create:block/pink_postbox_closed" }, "facing=north,open=true": { - "model": "create:block/pink_postbox" + "model": "create:block/pink_postbox_open" }, "facing=south,open=false": { - "model": "create:block/pink_postbox", + "model": "create:block/pink_postbox_closed", "y": 180 }, "facing=south,open=true": { - "model": "create:block/pink_postbox", + "model": "create:block/pink_postbox_open", "y": 180 }, "facing=west,open=false": { - "model": "create:block/pink_postbox", + "model": "create:block/pink_postbox_closed", "y": 270 }, "facing=west,open=true": { - "model": "create:block/pink_postbox", + "model": "create:block/pink_postbox_open", "y": 270 } } diff --git a/src/generated/resources/assets/create/blockstates/purple_postbox.json b/src/generated/resources/assets/create/blockstates/purple_postbox.json index 1d95d7201d..7f9542a5bf 100644 --- a/src/generated/resources/assets/create/blockstates/purple_postbox.json +++ b/src/generated/resources/assets/create/blockstates/purple_postbox.json @@ -1,33 +1,33 @@ { "variants": { "facing=east,open=false": { - "model": "create:block/purple_postbox", + "model": "create:block/purple_postbox_closed", "y": 90 }, "facing=east,open=true": { - "model": "create:block/purple_postbox", + "model": "create:block/purple_postbox_open", "y": 90 }, "facing=north,open=false": { - "model": "create:block/purple_postbox" + "model": "create:block/purple_postbox_closed" }, "facing=north,open=true": { - "model": "create:block/purple_postbox" + "model": "create:block/purple_postbox_open" }, "facing=south,open=false": { - "model": "create:block/purple_postbox", + "model": "create:block/purple_postbox_closed", "y": 180 }, "facing=south,open=true": { - "model": "create:block/purple_postbox", + "model": "create:block/purple_postbox_open", "y": 180 }, "facing=west,open=false": { - "model": "create:block/purple_postbox", + "model": "create:block/purple_postbox_closed", "y": 270 }, "facing=west,open=true": { - "model": "create:block/purple_postbox", + "model": "create:block/purple_postbox_open", "y": 270 } } diff --git a/src/generated/resources/assets/create/blockstates/red_postbox.json b/src/generated/resources/assets/create/blockstates/red_postbox.json index 56c1c83ae1..bc58c6661a 100644 --- a/src/generated/resources/assets/create/blockstates/red_postbox.json +++ b/src/generated/resources/assets/create/blockstates/red_postbox.json @@ -1,33 +1,33 @@ { "variants": { "facing=east,open=false": { - "model": "create:block/red_postbox", + "model": "create:block/red_postbox_closed", "y": 90 }, "facing=east,open=true": { - "model": "create:block/red_postbox", + "model": "create:block/red_postbox_open", "y": 90 }, "facing=north,open=false": { - "model": "create:block/red_postbox" + "model": "create:block/red_postbox_closed" }, "facing=north,open=true": { - "model": "create:block/red_postbox" + "model": "create:block/red_postbox_open" }, "facing=south,open=false": { - "model": "create:block/red_postbox", + "model": "create:block/red_postbox_closed", "y": 180 }, "facing=south,open=true": { - "model": "create:block/red_postbox", + "model": "create:block/red_postbox_open", "y": 180 }, "facing=west,open=false": { - "model": "create:block/red_postbox", + "model": "create:block/red_postbox_closed", "y": 270 }, "facing=west,open=true": { - "model": "create:block/red_postbox", + "model": "create:block/red_postbox_open", "y": 270 } } diff --git a/src/generated/resources/assets/create/blockstates/white_postbox.json b/src/generated/resources/assets/create/blockstates/white_postbox.json index 335fe6ff05..1471a51fec 100644 --- a/src/generated/resources/assets/create/blockstates/white_postbox.json +++ b/src/generated/resources/assets/create/blockstates/white_postbox.json @@ -1,33 +1,33 @@ { "variants": { "facing=east,open=false": { - "model": "create:block/white_postbox", + "model": "create:block/white_postbox_closed", "y": 90 }, "facing=east,open=true": { - "model": "create:block/white_postbox", + "model": "create:block/white_postbox_open", "y": 90 }, "facing=north,open=false": { - "model": "create:block/white_postbox" + "model": "create:block/white_postbox_closed" }, "facing=north,open=true": { - "model": "create:block/white_postbox" + "model": "create:block/white_postbox_open" }, "facing=south,open=false": { - "model": "create:block/white_postbox", + "model": "create:block/white_postbox_closed", "y": 180 }, "facing=south,open=true": { - "model": "create:block/white_postbox", + "model": "create:block/white_postbox_open", "y": 180 }, "facing=west,open=false": { - "model": "create:block/white_postbox", + "model": "create:block/white_postbox_closed", "y": 270 }, "facing=west,open=true": { - "model": "create:block/white_postbox", + "model": "create:block/white_postbox_open", "y": 270 } } diff --git a/src/generated/resources/assets/create/blockstates/yellow_postbox.json b/src/generated/resources/assets/create/blockstates/yellow_postbox.json index a3b3f8f4e7..1959f2eb7d 100644 --- a/src/generated/resources/assets/create/blockstates/yellow_postbox.json +++ b/src/generated/resources/assets/create/blockstates/yellow_postbox.json @@ -1,33 +1,33 @@ { "variants": { "facing=east,open=false": { - "model": "create:block/yellow_postbox", + "model": "create:block/yellow_postbox_closed", "y": 90 }, "facing=east,open=true": { - "model": "create:block/yellow_postbox", + "model": "create:block/yellow_postbox_open", "y": 90 }, "facing=north,open=false": { - "model": "create:block/yellow_postbox" + "model": "create:block/yellow_postbox_closed" }, "facing=north,open=true": { - "model": "create:block/yellow_postbox" + "model": "create:block/yellow_postbox_open" }, "facing=south,open=false": { - "model": "create:block/yellow_postbox", + "model": "create:block/yellow_postbox_closed", "y": 180 }, "facing=south,open=true": { - "model": "create:block/yellow_postbox", + "model": "create:block/yellow_postbox_open", "y": 180 }, "facing=west,open=false": { - "model": "create:block/yellow_postbox", + "model": "create:block/yellow_postbox_closed", "y": 270 }, "facing=west,open=true": { - "model": "create:block/yellow_postbox", + "model": "create:block/yellow_postbox_open", "y": 270 } } diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index fbca534606..55604f9b22 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -919,6 +919,8 @@ "create.chain_conveyor.valid_connection": "✔ ʇɔǝuuoƆ uɐƆ", "create.clipboard.actions": "suoıʇɔⱯ pɹɐoqdıןƆ", "create.clipboard.copied_from": "%1$s ɯoɹɟ sbuıʇʇǝs buıʎdoƆ", + "create.clipboard.copied_from_clipboard": "pɹɐoqdıןƆ ɯoɹɟ sǝıɹʇuǝ pǝppⱯ", + "create.clipboard.copy_other_clipboard": "pɹɐoqdıןƆ sıɥʇ ɯoɹɟ sǝıɹʇuǝ ʎdoƆ oʇ %1$s", "create.clipboard.pasted_to": "%1$s oʇ sbuıʇʇǝs pǝıןddⱯ", "create.clipboard.to_copy": "sbuıʇʇǝs ʎdoƆ oʇ %1$s", "create.clipboard.to_paste": "sbuıʇʇǝs ǝʇsɐԀ oʇ %1$s", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 6bc35908d9..a944be551c 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -919,6 +919,8 @@ "create.chain_conveyor.valid_connection": "Can Connect ✔", "create.clipboard.actions": "Clipboard Actions", "create.clipboard.copied_from": "Copying settings from %1$s", + "create.clipboard.copied_from_clipboard": "Added entries from Clipboard", + "create.clipboard.copy_other_clipboard": "%1$s to Copy entries from this Clipboard", "create.clipboard.pasted_to": "Applied settings to %1$s", "create.clipboard.to_copy": "%1$s to Copy settings", "create.clipboard.to_paste": "%1$s to Paste settings", diff --git a/src/generated/resources/assets/create/models/block/black_postbox.json b/src/generated/resources/assets/create/models/block/black_postbox_closed.json similarity index 100% rename from src/generated/resources/assets/create/models/block/black_postbox.json rename to src/generated/resources/assets/create/models/block/black_postbox_closed.json diff --git a/src/generated/resources/assets/create/models/block/black_postbox_open.json b/src/generated/resources/assets/create/models/block/black_postbox_open.json new file mode 100644 index 0000000000..5e9b0af55a --- /dev/null +++ b/src/generated/resources/assets/create/models/block/black_postbox_open.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/package_postbox/block_open", + "textures": { + "0": "create:block/post_box/post_box_black", + "1": "create:block/post_box/post_box_black_open" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/blue_postbox.json b/src/generated/resources/assets/create/models/block/blue_postbox_closed.json similarity index 100% rename from src/generated/resources/assets/create/models/block/blue_postbox.json rename to src/generated/resources/assets/create/models/block/blue_postbox_closed.json diff --git a/src/generated/resources/assets/create/models/block/blue_postbox_open.json b/src/generated/resources/assets/create/models/block/blue_postbox_open.json new file mode 100644 index 0000000000..7a4c608e2f --- /dev/null +++ b/src/generated/resources/assets/create/models/block/blue_postbox_open.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/package_postbox/block_open", + "textures": { + "0": "create:block/post_box/post_box_blue", + "1": "create:block/post_box/post_box_blue_open" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brown_postbox.json b/src/generated/resources/assets/create/models/block/brown_postbox_closed.json similarity index 100% rename from src/generated/resources/assets/create/models/block/brown_postbox.json rename to src/generated/resources/assets/create/models/block/brown_postbox_closed.json diff --git a/src/generated/resources/assets/create/models/block/brown_postbox_open.json b/src/generated/resources/assets/create/models/block/brown_postbox_open.json new file mode 100644 index 0000000000..037670e724 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/brown_postbox_open.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/package_postbox/block_open", + "textures": { + "0": "create:block/post_box/post_box_brown", + "1": "create:block/post_box/post_box_brown_open" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/cyan_postbox.json b/src/generated/resources/assets/create/models/block/cyan_postbox_closed.json similarity index 100% rename from src/generated/resources/assets/create/models/block/cyan_postbox.json rename to src/generated/resources/assets/create/models/block/cyan_postbox_closed.json diff --git a/src/generated/resources/assets/create/models/block/cyan_postbox_open.json b/src/generated/resources/assets/create/models/block/cyan_postbox_open.json new file mode 100644 index 0000000000..855f1d76aa --- /dev/null +++ b/src/generated/resources/assets/create/models/block/cyan_postbox_open.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/package_postbox/block_open", + "textures": { + "0": "create:block/post_box/post_box_cyan", + "1": "create:block/post_box/post_box_cyan_open" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/gray_postbox.json b/src/generated/resources/assets/create/models/block/gray_postbox_closed.json similarity index 100% rename from src/generated/resources/assets/create/models/block/gray_postbox.json rename to src/generated/resources/assets/create/models/block/gray_postbox_closed.json diff --git a/src/generated/resources/assets/create/models/block/gray_postbox_open.json b/src/generated/resources/assets/create/models/block/gray_postbox_open.json new file mode 100644 index 0000000000..6863bc3219 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/gray_postbox_open.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/package_postbox/block_open", + "textures": { + "0": "create:block/post_box/post_box_gray", + "1": "create:block/post_box/post_box_gray_open" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/green_postbox.json b/src/generated/resources/assets/create/models/block/green_postbox_closed.json similarity index 100% rename from src/generated/resources/assets/create/models/block/green_postbox.json rename to src/generated/resources/assets/create/models/block/green_postbox_closed.json diff --git a/src/generated/resources/assets/create/models/block/green_postbox_open.json b/src/generated/resources/assets/create/models/block/green_postbox_open.json new file mode 100644 index 0000000000..29eab5611d --- /dev/null +++ b/src/generated/resources/assets/create/models/block/green_postbox_open.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/package_postbox/block_open", + "textures": { + "0": "create:block/post_box/post_box_green", + "1": "create:block/post_box/post_box_green_open" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/light_blue_postbox.json b/src/generated/resources/assets/create/models/block/light_blue_postbox_closed.json similarity index 100% rename from src/generated/resources/assets/create/models/block/light_blue_postbox.json rename to src/generated/resources/assets/create/models/block/light_blue_postbox_closed.json diff --git a/src/generated/resources/assets/create/models/block/light_blue_postbox_open.json b/src/generated/resources/assets/create/models/block/light_blue_postbox_open.json new file mode 100644 index 0000000000..6bec66e514 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/light_blue_postbox_open.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/package_postbox/block_open", + "textures": { + "0": "create:block/post_box/post_box_light_blue", + "1": "create:block/post_box/post_box_light_blue_open" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/light_gray_postbox.json b/src/generated/resources/assets/create/models/block/light_gray_postbox_closed.json similarity index 100% rename from src/generated/resources/assets/create/models/block/light_gray_postbox.json rename to src/generated/resources/assets/create/models/block/light_gray_postbox_closed.json diff --git a/src/generated/resources/assets/create/models/block/light_gray_postbox_open.json b/src/generated/resources/assets/create/models/block/light_gray_postbox_open.json new file mode 100644 index 0000000000..6208d0cddf --- /dev/null +++ b/src/generated/resources/assets/create/models/block/light_gray_postbox_open.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/package_postbox/block_open", + "textures": { + "0": "create:block/post_box/post_box_light_gray", + "1": "create:block/post_box/post_box_light_gray_open" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/lime_postbox.json b/src/generated/resources/assets/create/models/block/lime_postbox_closed.json similarity index 100% rename from src/generated/resources/assets/create/models/block/lime_postbox.json rename to src/generated/resources/assets/create/models/block/lime_postbox_closed.json diff --git a/src/generated/resources/assets/create/models/block/lime_postbox_open.json b/src/generated/resources/assets/create/models/block/lime_postbox_open.json new file mode 100644 index 0000000000..2b27ee0755 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/lime_postbox_open.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/package_postbox/block_open", + "textures": { + "0": "create:block/post_box/post_box_lime", + "1": "create:block/post_box/post_box_lime_open" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/magenta_postbox.json b/src/generated/resources/assets/create/models/block/magenta_postbox_closed.json similarity index 100% rename from src/generated/resources/assets/create/models/block/magenta_postbox.json rename to src/generated/resources/assets/create/models/block/magenta_postbox_closed.json diff --git a/src/generated/resources/assets/create/models/block/magenta_postbox_open.json b/src/generated/resources/assets/create/models/block/magenta_postbox_open.json new file mode 100644 index 0000000000..f2067ef047 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/magenta_postbox_open.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/package_postbox/block_open", + "textures": { + "0": "create:block/post_box/post_box_magenta", + "1": "create:block/post_box/post_box_magenta_open" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/orange_postbox.json b/src/generated/resources/assets/create/models/block/orange_postbox_closed.json similarity index 100% rename from src/generated/resources/assets/create/models/block/orange_postbox.json rename to src/generated/resources/assets/create/models/block/orange_postbox_closed.json diff --git a/src/generated/resources/assets/create/models/block/orange_postbox_open.json b/src/generated/resources/assets/create/models/block/orange_postbox_open.json new file mode 100644 index 0000000000..26973cd8a3 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/orange_postbox_open.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/package_postbox/block_open", + "textures": { + "0": "create:block/post_box/post_box_orange", + "1": "create:block/post_box/post_box_orange_open" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/pink_postbox.json b/src/generated/resources/assets/create/models/block/pink_postbox_closed.json similarity index 100% rename from src/generated/resources/assets/create/models/block/pink_postbox.json rename to src/generated/resources/assets/create/models/block/pink_postbox_closed.json diff --git a/src/generated/resources/assets/create/models/block/pink_postbox_open.json b/src/generated/resources/assets/create/models/block/pink_postbox_open.json new file mode 100644 index 0000000000..97c3e0bd09 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/pink_postbox_open.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/package_postbox/block_open", + "textures": { + "0": "create:block/post_box/post_box_pink", + "1": "create:block/post_box/post_box_pink_open" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/purple_postbox.json b/src/generated/resources/assets/create/models/block/purple_postbox_closed.json similarity index 100% rename from src/generated/resources/assets/create/models/block/purple_postbox.json rename to src/generated/resources/assets/create/models/block/purple_postbox_closed.json diff --git a/src/generated/resources/assets/create/models/block/purple_postbox_open.json b/src/generated/resources/assets/create/models/block/purple_postbox_open.json new file mode 100644 index 0000000000..a1606532ad --- /dev/null +++ b/src/generated/resources/assets/create/models/block/purple_postbox_open.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/package_postbox/block_open", + "textures": { + "0": "create:block/post_box/post_box_purple", + "1": "create:block/post_box/post_box_purple_open" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/red_postbox.json b/src/generated/resources/assets/create/models/block/red_postbox_closed.json similarity index 100% rename from src/generated/resources/assets/create/models/block/red_postbox.json rename to src/generated/resources/assets/create/models/block/red_postbox_closed.json diff --git a/src/generated/resources/assets/create/models/block/red_postbox_open.json b/src/generated/resources/assets/create/models/block/red_postbox_open.json new file mode 100644 index 0000000000..c13dccaf99 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/red_postbox_open.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/package_postbox/block_open", + "textures": { + "0": "create:block/post_box/post_box_red", + "1": "create:block/post_box/post_box_red_open" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/white_postbox.json b/src/generated/resources/assets/create/models/block/white_postbox_closed.json similarity index 100% rename from src/generated/resources/assets/create/models/block/white_postbox.json rename to src/generated/resources/assets/create/models/block/white_postbox_closed.json diff --git a/src/generated/resources/assets/create/models/block/white_postbox_open.json b/src/generated/resources/assets/create/models/block/white_postbox_open.json new file mode 100644 index 0000000000..bb1b084cb7 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/white_postbox_open.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/package_postbox/block_open", + "textures": { + "0": "create:block/post_box/post_box_white", + "1": "create:block/post_box/post_box_white_open" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/yellow_postbox.json b/src/generated/resources/assets/create/models/block/yellow_postbox_closed.json similarity index 100% rename from src/generated/resources/assets/create/models/block/yellow_postbox.json rename to src/generated/resources/assets/create/models/block/yellow_postbox_closed.json diff --git a/src/generated/resources/assets/create/models/block/yellow_postbox_open.json b/src/generated/resources/assets/create/models/block/yellow_postbox_open.json new file mode 100644 index 0000000000..6ce15c57c8 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/yellow_postbox_open.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/package_postbox/block_open", + "textures": { + "0": "create:block/post_box/post_box_yellow", + "1": "create:block/post_box/post_box_yellow_open" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/bound_cardboard_block.json b/src/generated/resources/data/create/loot_tables/blocks/bound_cardboard_block.json index 72ea360f9c..e159395588 100644 --- a/src/generated/resources/data/create/loot_tables/blocks/bound_cardboard_block.json +++ b/src/generated/resources/data/create/loot_tables/blocks/bound_cardboard_block.json @@ -11,7 +11,22 @@ "entries": [ { "type": "minecraft:item", - "name": "create:bound_cardboard_block" + "name": "minecraft:string" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:cardboard_block" } ], "rolls": 1.0 diff --git a/src/generated/resources/data/create/recipes/crafting/materials/bound_cardboard_block.json b/src/generated/resources/data/create/recipes/crafting/materials/bound_cardboard_block.json index 9b01e47713..c3082c7c73 100644 --- a/src/generated/resources/data/create/recipes/crafting/materials/bound_cardboard_block.json +++ b/src/generated/resources/data/create/recipes/crafting/materials/bound_cardboard_block.json @@ -1,22 +1,15 @@ { - "type": "minecraft:crafting_shaped", + "type": "minecraft:crafting_shapeless", "category": "misc", - "key": { - "C": { + "ingredients": [ + { "item": "create:cardboard_block" }, - "S": { - "tag": "forge:string" + { + "item": "minecraft:string" } - }, - "pattern": [ - "CCC", - "CSC", - "CCC" ], "result": { - "count": 8, "item": "create:bound_cardboard_block" - }, - "show_notification": true + } } \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/item_application/bound_cardboard_inworld.json b/src/generated/resources/data/create/recipes/item_application/bound_cardboard_inworld.json new file mode 100644 index 0000000000..01db281a27 --- /dev/null +++ b/src/generated/resources/data/create/recipes/item_application/bound_cardboard_inworld.json @@ -0,0 +1,16 @@ +{ + "type": "create:item_application", + "ingredients": [ + { + "item": "create:cardboard_block" + }, + { + "tag": "forge:string" + } + ], + "results": [ + { + "item": "create:bound_cardboard_block" + } + ] +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 8b913e8d48..67866d31b7 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -299,6 +299,7 @@ import net.minecraft.sounds.SoundEvents; import net.minecraft.tags.BlockTags; import net.minecraft.tags.ItemTags; import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.Items; import net.minecraft.world.item.Rarity; import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.level.block.Block; @@ -1766,12 +1767,14 @@ public class AllBlocks { .properties(p -> p.mapColor(colour)) .transform(axeOnly()) .blockstate((c, p) -> { - p.horizontalBlock(c.get(), s -> p.models() - .withExistingParent(colourName + "_postbox", - p.modLoc("block/package_postbox/block_" + (s.getValue(PostboxBlock.OPEN) ? "open" : "closed"))) - .texture("0", p.modLoc("block/post_box/post_box_" + colourName)) - .texture("1", p.modLoc("block/post_box/post_box_" + colourName - + (s.getValue(PostboxBlock.OPEN) ? "_open" : "_closed")))); + p.horizontalBlock(c.get(), s -> { + String suffix = s.getValue(PostboxBlock.OPEN) ? "open" : "closed"; + return p.models() + .withExistingParent(colourName + "_postbox_" + suffix, + p.modLoc("block/package_postbox/block_" + suffix)) + .texture("0", p.modLoc("block/post_box/post_box_" + colourName)) + .texture("1", p.modLoc("block/post_box/post_box_" + colourName + "_" + suffix)); + }); }) .tag(AllBlockTags.POSTBOXES.tag) .item(PackagePortItem::new) @@ -2549,6 +2552,13 @@ public class AllBlocks { .ignitedByLava()) .transform(axeOnly()) .blockstate(BlockStateGen.horizontalAxisBlockProvider(false)) + .loot((r, b) -> r.add(b, LootTable.lootTable() + .withPool(r.applyExplosionCondition(b, LootPool.lootPool() + .setRolls(ConstantValue.exactly(1.0F)) + .add(LootItem.lootTableItem(Items.STRING)))) + .withPool(r.applyExplosionCondition(b, LootPool.lootPool() + .setRolls(ConstantValue.exactly(1.0F)) + .add(LootItem.lootTableItem(AllBlocks.CARDBOARD_BLOCK.asItem())))))) .simpleItem() .lang("Bound block of Cardboard") .register(); diff --git a/src/main/java/com/simibubi/create/content/decoration/MetalLadderBlock.java b/src/main/java/com/simibubi/create/content/decoration/MetalLadderBlock.java index 55dbbfa5e4..7cbc03e682 100644 --- a/src/main/java/com/simibubi/create/content/decoration/MetalLadderBlock.java +++ b/src/main/java/com/simibubi/create/content/decoration/MetalLadderBlock.java @@ -1,30 +1,38 @@ package com.simibubi.create.content.decoration; +import java.util.function.Predicate; + +import com.simibubi.create.AllShapes; import com.simibubi.create.content.equipment.extendoGrip.ExtendoGripItem; import com.simibubi.create.content.equipment.wrench.IWrenchable; import com.simibubi.create.infrastructure.config.AllConfigs; + import net.createmod.catnip.utility.placement.IPlacementHelper; import net.createmod.catnip.utility.placement.PlacementHelpers; import net.createmod.catnip.utility.placement.PlacementOffset; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.core.Direction.Axis; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.ai.attributes.AttributeInstance; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.LadderBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.common.ForgeMod; -import java.util.function.Predicate; - public class MetalLadderBlock extends LadderBlock implements IWrenchable { private static final int placementHelperId = PlacementHelpers.register(new PlacementHelper()); @@ -41,10 +49,33 @@ public class MetalLadderBlock extends LadderBlock implements IWrenchable { @Override @OnlyIn(Dist.CLIENT) + @SuppressWarnings("deprecation") public boolean skipRendering(BlockState pState, BlockState pAdjacentBlockState, Direction pDirection) { + if (pDirection != null && pDirection.getAxis() + .isHorizontal()) + return pAdjacentBlockState.isAir() || !pAdjacentBlockState.blocksMotion(); return pDirection == Direction.UP && pAdjacentBlockState.getBlock() instanceof LadderBlock; } + @Override + public VoxelShape getOcclusionShape(BlockState pState, BlockGetter pLevel, BlockPos pPos) { + return AllShapes.SIX_VOXEL_POLE.get(Axis.Y); + } + + @Override + public BlockState updateShape(BlockState pState, Direction pFacing, BlockState pFacingState, LevelAccessor pLevel, + BlockPos pCurrentPos, BlockPos pFacingPos) { + if (!pState.canSurvive(pLevel, pCurrentPos)) + return Blocks.AIR.defaultBlockState(); + return super.updateShape(pState, pFacing, pFacingState, pLevel, pCurrentPos, pFacingPos); + } + + @Override + public boolean canSurvive(BlockState pState, LevelReader pLevel, BlockPos pPos) { + return super.canSurvive(pState, pLevel, pPos) || pLevel.getBlockState(pPos.relative(Direction.UP)) + .is(this); + } + @Override public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult ray) { diff --git a/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardValueSettingsHandler.java b/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardValueSettingsHandler.java index 3cca3b44d4..8fd81e694e 100644 --- a/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardValueSettingsHandler.java +++ b/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardValueSettingsHandler.java @@ -55,11 +55,11 @@ public class ClipboardValueSettingsHandler { return; if (!(mc.level.getBlockEntity(pos) instanceof SmartBlockEntity smartBE)) return; - if (!smartBE.getAllBehaviours() + if (!(smartBE instanceof ClipboardBlockEntity) && !smartBE.getAllBehaviours() .stream() .anyMatch(b -> b instanceof ClipboardCloneable cc && cc.writeToClipboard(new CompoundTag(), target.getDirection())) - && !(smartBE instanceof ClipboardCloneable)) + && !(smartBE instanceof ClipboardCloneable)) return; VoxelShape shape = blockstate.getShape(mc.level, pos); @@ -92,6 +92,14 @@ public class ClipboardValueSettingsHandler { if (!(mc.level.getBlockEntity(pos) instanceof SmartBlockEntity smartBE)) return; + if (smartBE instanceof ClipboardBlockEntity) { + List tip = new ArrayList<>(); + tip.add(CreateLang.translateDirect("clipboard.actions")); + tip.add(CreateLang.translateDirect("clipboard.copy_other_clipboard", Components.keybind("key.use"))); + CreateClient.VALUE_SETTINGS_HANDLER.showHoverTip(tip); + return; + } + CompoundTag tagElement = mc.player.getMainHandItem() .getTagElement("CopiedValues"); @@ -146,6 +154,55 @@ public class ClipboardValueSettingsHandler { return; if (!(world.getBlockEntity(pos) instanceof SmartBlockEntity smartBE)) return; + + if (smartBE instanceof ClipboardBlockEntity cbe) { + event.setCanceled(true); + event.setCancellationResult(InteractionResult.SUCCESS); + + if (!world.isClientSide()) { + List> listTo = ClipboardEntry.readAll(itemStack); + List> listFrom = ClipboardEntry.readAll(cbe.dataContainer); + List toAdd = new ArrayList<>(); + + for (List page : listFrom) { + Copy: for (ClipboardEntry entry : page) { + String entryToAdd = entry.text.getString(); + for (List pageTo : listTo) + for (ClipboardEntry existing : pageTo) + if (entryToAdd.equals(existing.text.getString())) + continue Copy; + toAdd.add(new ClipboardEntry(entry.checked, entry.text)); + } + } + + for (ClipboardEntry entry : toAdd) { + List page = null; + for (List freePage : listTo) { + if (freePage.size() > 11) + continue; + page = freePage; + break; + } + if (page == null) { + page = new ArrayList<>(); + listTo.add(page); + } + page.add(entry); + ClipboardOverrides.switchTo(ClipboardType.WRITTEN, itemStack); + } + + ClipboardEntry.saveAll(listTo, itemStack); + } + + player.displayClientMessage(CreateLang.translate("clipboard.copied_from_clipboard", world.getBlockState(pos) + .getBlock() + .getName() + .withStyle(ChatFormatting.WHITE)) + .style(ChatFormatting.GREEN) + .component(), true); + return; + } + CompoundTag tag = itemStack.getTagElement("CopiedValues"); if (paste && tag == null) return; diff --git a/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolboxBlockEntity.java b/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolboxBlockEntity.java index 98d18b0e6e..90542b1968 100644 --- a/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolboxBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolboxBlockEntity.java @@ -13,6 +13,7 @@ import java.util.WeakHashMap; import com.simibubi.create.AllBlocks; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; +import com.simibubi.create.foundation.blockEntity.behaviour.animatedContainer.AnimatedContainerBehaviour; import com.simibubi.create.foundation.utility.ResetableLazy; import net.createmod.catnip.utility.VecHelper; @@ -34,7 +35,6 @@ import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.LazyOptional; @@ -53,12 +53,13 @@ public class ToolboxBlockEntity extends SmartBlockEntity implements MenuProvider ToolboxInventory inventory; LazyOptional inventoryProvider; ResetableLazy colorProvider; - protected int openCount; Map> connectedPlayers; private Component customName; + private AnimatedContainerBehaviour openTracker; + public ToolboxBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); connectedPlayers = new HashMap<>(); @@ -78,7 +79,9 @@ public class ToolboxBlockEntity extends SmartBlockEntity implements MenuProvider } @Override - public void addBehaviours(List behaviours) {} + public void addBehaviours(List behaviours) { + behaviours.add(openTracker = new AnimatedContainerBehaviour<>(this, ToolboxMenu.class)); + } @Override public void initialize() { @@ -101,8 +104,8 @@ public class ToolboxBlockEntity extends SmartBlockEntity implements MenuProvider if (!level.isClientSide) tickPlayers(); - lid.chase(openCount > 0 ? 1 : 0, 0.2f, Chaser.LINEAR); - drawers.chase(openCount > 0 ? 1 : 0, 0.2f, Chaser.EXP); + lid.chase(openTracker.openCount > 0 ? 1 : 0, 0.2f, Chaser.LINEAR); + drawers.chase(openTracker.openCount > 0 ? 1 : 0, 0.2f, Chaser.EXP); lid.tickChaser(); drawers.tickChaser(); } @@ -257,17 +260,17 @@ public class ToolboxBlockEntity extends SmartBlockEntity implements MenuProvider private void tickAudio() { Vec3 vec = VecHelper.getCenterOf(worldPosition); if (lid.settled()) { - if (openCount > 0 && lid.getChaseTarget() == 0) { + if (openTracker.openCount > 0 && lid.getChaseTarget() == 0) { level.playLocalSound(vec.x, vec.y, vec.z, SoundEvents.IRON_DOOR_OPEN, SoundSource.BLOCKS, 0.25F, level.random.nextFloat() * 0.1F + 1.2F, true); level.playLocalSound(vec.x, vec.y, vec.z, SoundEvents.CHEST_OPEN, SoundSource.BLOCKS, 0.1F, level.random.nextFloat() * 0.1F + 1.1F, true); } - if (openCount == 0 && lid.getChaseTarget() == 1) + if (openTracker.openCount == 0 && lid.getChaseTarget() == 1) level.playLocalSound(vec.x, vec.y, vec.z, SoundEvents.CHEST_CLOSE, SoundSource.BLOCKS, 0.1F, level.random.nextFloat() * 0.1F + 1.1F, true); - } else if (openCount == 0 && lid.getChaseTarget() == 0 && lid.getValue(0) > 1 / 16f + } else if (openTracker.openCount == 0 && lid.getChaseTarget() == 0 && lid.getValue(0) > 1 / 16f && lid.getValue(1) < 1 / 16f) level.playLocalSound(vec.x, vec.y, vec.z, SoundEvents.IRON_DOOR_CLOSE, SoundSource.BLOCKS, 0.25F, level.random.nextFloat() * 0.1F + 1.2F, true); @@ -288,8 +291,6 @@ public class ToolboxBlockEntity extends SmartBlockEntity implements MenuProvider this.uniqueId = compound.getUUID("UniqueId"); if (compound.contains("CustomName", 8)) this.customName = Component.Serializer.fromJson(compound.getString("CustomName")); - if (clientPacket) - openCount = compound.getInt("OpenCount"); } @Override @@ -303,8 +304,6 @@ public class ToolboxBlockEntity extends SmartBlockEntity implements MenuProvider if (customName != null) compound.putString("CustomName", Component.Serializer.toJson(customName)); super.write(compound, clientPacket); - if (clientPacket) - compound.putInt("OpenCount", openCount); } @Override @@ -314,46 +313,11 @@ public class ToolboxBlockEntity extends SmartBlockEntity implements MenuProvider @Override public void lazyTick() { - updateOpenCount(); // keep re-advertising active TEs ToolboxHandler.onLoad(this); super.lazyTick(); } - void updateOpenCount() { - if (level.isClientSide) - return; - if (openCount == 0) - return; - - int prevOpenCount = openCount; - openCount = 0; - - for (Player playerentity : level.getEntitiesOfClass(Player.class, new AABB(worldPosition).inflate(8))) - if (playerentity.containerMenu instanceof ToolboxMenu - && ((ToolboxMenu) playerentity.containerMenu).contentHolder == this) - openCount++; - - if (prevOpenCount != openCount) - sendData(); - } - - public void startOpen(Player player) { - if (player.isSpectator()) - return; - if (openCount < 0) - openCount = 0; - openCount++; - sendData(); - } - - public void stopOpen(Player player) { - if (player.isSpectator()) - return; - openCount--; - sendData(); - } - public void connectPlayer(int slot, Player player, int hotbarSlot) { if (level.isClientSide) return; diff --git a/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolboxMenu.java b/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolboxMenu.java index 8dca8ec499..f7db862c84 100644 --- a/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolboxMenu.java +++ b/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolboxMenu.java @@ -3,6 +3,8 @@ package com.simibubi.create.content.equipment.toolbox; import static com.simibubi.create.content.equipment.toolbox.ToolboxInventory.STACKS_PER_COMPARTMENT; import com.simibubi.create.AllMenuTypes; +import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; +import com.simibubi.create.foundation.blockEntity.behaviour.animatedContainer.AnimatedContainerBehaviour; import com.simibubi.create.foundation.gui.menu.MenuBase; import net.minecraft.client.Minecraft; @@ -27,7 +29,8 @@ public class ToolboxMenu extends MenuBase { public ToolboxMenu(MenuType type, int id, Inventory inv, ToolboxBlockEntity be) { super(type, id, inv, be); - be.startOpen(player); + BlockEntityBehaviour.get(be, AnimatedContainerBehaviour.TYPE) + .startOpen(player); } public static ToolboxMenu create(int id, Inventory inv, ToolboxBlockEntity be) { @@ -153,7 +156,8 @@ public class ToolboxMenu extends MenuBase { public void removed(Player playerIn) { super.removed(playerIn); if (!playerIn.level().isClientSide) - contentHolder.stopOpen(playerIn); + BlockEntityBehaviour.get(contentHolder, AnimatedContainerBehaviour.TYPE) + .stopOpen(playerIn); } } diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java index 42aed44ecb..15e2784a78 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java @@ -80,7 +80,7 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity { @Override protected AABB createRenderBoundingBox() { - return INFINITE_EXTENT_AABB; // TODO: compute smallest possible from connection data + return new AABB(worldPosition).inflate(connections.isEmpty() ? 3 : 64); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/AddressEditBox.java b/src/main/java/com/simibubi/create/content/logistics/AddressEditBox.java index 09ab093611..e867800b2e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/AddressEditBox.java +++ b/src/main/java/com/simibubi/create/content/logistics/AddressEditBox.java @@ -26,9 +26,9 @@ public class AddressEditBox extends EditBox { private DestinationSuggestions destinationSuggestions; private Consumer mainResponder; - public AddressEditBox(Screen screen, Font pFont, int pX, int pY, int pWidth, int pHeight) { + public AddressEditBox(Screen screen, Font pFont, int pX, int pY, int pWidth, int pHeight, boolean anchorToBottom) { super(pFont, pX, pY, pWidth, pHeight, Components.empty()); - destinationSuggestions = AddressEditBoxHelper.createSuggestions(screen, this); + destinationSuggestions = AddressEditBoxHelper.createSuggestions(screen, this, anchorToBottom); destinationSuggestions.setAllowSuggestions(true); destinationSuggestions.updateCommandInfo(); mainResponder = t -> destinationSuggestions.updateCommandInfo(); diff --git a/src/main/java/com/simibubi/create/content/logistics/AddressEditBoxHelper.java b/src/main/java/com/simibubi/create/content/logistics/AddressEditBoxHelper.java index 0ddd0b6fe0..0d4923dc80 100644 --- a/src/main/java/com/simibubi/create/content/logistics/AddressEditBoxHelper.java +++ b/src/main/java/com/simibubi/create/content/logistics/AddressEditBoxHelper.java @@ -2,7 +2,9 @@ package com.simibubi.create.content.logistics; import java.lang.ref.WeakReference; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.concurrent.TimeUnit; import com.google.common.cache.Cache; @@ -39,31 +41,33 @@ public class AddressEditBoxHelper { NEARBY_CLIPBOARDS.put(blockPos, new WeakReference<>(blockEntity)); } - public static DestinationSuggestions createSuggestions(Screen screen, EditBox pInput) { + public static DestinationSuggestions createSuggestions(Screen screen, EditBox pInput, boolean anchorToBottom) { Minecraft mc = Minecraft.getInstance(); Player player = mc.player; List> options = new ArrayList<>(); - DestinationSuggestions destinationSuggestions = - new DestinationSuggestions(mc, screen, pInput, mc.font, options, -72 + pInput.getY() + pInput.getHeight()); + Set alreadyAdded = new HashSet<>(); + + DestinationSuggestions destinationSuggestions = new DestinationSuggestions(mc, screen, pInput, mc.font, options, + anchorToBottom, -72 + pInput.getY() + (anchorToBottom ? 0 : pInput.getHeight())); if (player == null) return destinationSuggestions; for (int i = 0; i < Inventory.INVENTORY_SIZE; i++) - appendAddresses(options, player.getInventory() + appendAddresses(options, alreadyAdded, player.getInventory() .getItem(i)); for (WeakReference wr : NEARBY_CLIPBOARDS.asMap() .values()) { ClipboardBlockEntity cbe = wr.get(); if (cbe != null) - appendAddresses(options, cbe.dataContainer); + appendAddresses(options, alreadyAdded, cbe.dataContainer); } return destinationSuggestions; } - private static void appendAddresses(List> options, ItemStack item) { + private static void appendAddresses(List> options, Set alreadyAdded, ItemStack item) { if (item == null || !AllBlocks.CLIPBOARD.isIn(item)) return; @@ -77,7 +81,10 @@ public class AddressEditBoxHelper { String address = string.substring(1); if (address.isBlank()) return; - options.add(IntAttached.withZero(address.trim())); + String trim = address.trim(); + if (!alreadyAdded.add(trim)) + return; + options.add(IntAttached.withZero(trim)); })); } diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java index 77ca170222..d312886c75 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java @@ -18,6 +18,7 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; @@ -31,6 +32,7 @@ import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.HumanoidArm; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.MobSpawnType; import net.minecraft.world.entity.Pose; import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.entity.ai.attributes.Attributes; @@ -38,6 +40,7 @@ import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.projectile.AbstractArrow; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.SpawnEggItem; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; @@ -356,6 +359,15 @@ public class PackageEntity extends LivingEntity implements IEntityAdditionalSpaw ItemStackHandler contents = PackageItem.getContents(box); for (int i = 0; i < contents.getSlots(); i++) { ItemStack itemstack = contents.getStackInSlot(i); + + if (itemstack.getItem() instanceof SpawnEggItem sei && level() instanceof ServerLevel sl) { + EntityType entitytype = sei.getType(itemstack.getTag()); + Entity entity = entitytype.spawn(sl, itemstack, null, blockPosition(), + MobSpawnType.SPAWN_EGG, false, false); + if (entity != null) + itemstack.shrink(1); + } + if (itemstack.isEmpty()) continue; ItemEntity entityIn = new ItemEntity(level(), getX(), getY(), getZ(), itemstack); diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java index 787f1ff90d..c02a9f9170 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java @@ -12,22 +12,27 @@ import com.simibubi.create.content.logistics.stockTicker.PackageOrder; import net.createmod.catnip.utility.VecHelper; import net.createmod.catnip.utility.lang.Components; import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.particles.ItemParticleOption; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.MobSpawnType; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.SpawnEggItem; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.UseAnim; import net.minecraft.world.item.context.UseOnContext; @@ -63,7 +68,7 @@ public class PackageItem extends Item { public static boolean isPackage(ItemStack stack) { return stack.getItem() instanceof PackageItem; } - + @Override public boolean canFitInsideContainerItems() { return false; @@ -129,7 +134,7 @@ public class PackageItem extends Item { public static boolean matchAddress(ItemStack box, String address) { return matchAddress(getAddress(box), address); } - + public static boolean matchAddress(String boxAddress, String address) { if (address.isBlank()) return boxAddress.isBlank(); @@ -188,20 +193,18 @@ public class PackageItem extends Item { pTooltipComponents.add(Components.literal("-> " + compoundnbt.getString("Address")) .withStyle(ChatFormatting.GOLD)); - /* Debug Fragmentation Data - if (compoundnbt.contains("Fragment")) { - CompoundTag fragTag = compoundnbt.getCompound("Fragment"); - pTooltipComponents.add(Components.literal("Order Information (Temporary)") - .withStyle(ChatFormatting.GREEN)); - pTooltipComponents.add(Components - .literal(" Link " + fragTag.getInt("LinkIndex") + (fragTag.getBoolean("IsFinalLink") ? " Final" : "") - + " | Fragment " + fragTag.getInt("Index") + (fragTag.getBoolean("IsFinal") ? " Final" : "")) - .withStyle(ChatFormatting.DARK_GREEN)); - if (fragTag.contains("OrderContext")) - pTooltipComponents.add(Components.literal("Has Context!") - .withStyle(ChatFormatting.DARK_GREEN)); - } - */ + /* + * Debug Fragmentation Data if (compoundnbt.contains("Fragment")) { CompoundTag + * fragTag = compoundnbt.getCompound("Fragment"); + * pTooltipComponents.add(Components.literal("Order Information (Temporary)") + * .withStyle(ChatFormatting.GREEN)); pTooltipComponents.add(Components + * .literal(" Link " + fragTag.getInt("LinkIndex") + + * (fragTag.getBoolean("IsFinalLink") ? " Final" : "") + " | Fragment " + + * fragTag.getInt("Index") + (fragTag.getBoolean("IsFinal") ? " Final" : "")) + * .withStyle(ChatFormatting.DARK_GREEN)); if (fragTag.contains("OrderContext")) + * pTooltipComponents.add(Components.literal("Has Context!") + * .withStyle(ChatFormatting.DARK_GREEN)); } + */ if (!compoundnbt.contains("Items", Tag.TAG_COMPOUND)) return; @@ -256,6 +259,18 @@ public class PackageItem extends Item { for (int i = 0; i < contents.getSlots(); i++) { ItemStack itemstack = contents.getStackInSlot(i); + + if (itemstack.getItem() instanceof SpawnEggItem sei && worldIn instanceof ServerLevel sl) { + EntityType entitytype = sei.getType(itemstack.getTag()); + Entity entity = entitytype.spawn(sl, itemstack, null, BlockPos.containing(playerIn.position() + .add(playerIn.getLookAngle() + .multiply(1, 0, 1) + .normalize())), + MobSpawnType.SPAWN_EGG, false, false); + if (entity != null) + itemstack.shrink(1); + } + if (itemstack.isEmpty()) continue; playerIn.getInventory() diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothBlock.java b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothBlock.java index 43213fb25f..484ed06e1b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothBlock.java @@ -88,7 +88,7 @@ public class DisplayClothBlock extends Block implements IHaveBigOutline, IWrench BlockHitResult ray) { if (ray.getDirection() == Direction.DOWN) return InteractionResult.PASS; - + ItemStack heldItem = player.getItemInHand(hand); boolean shiftKeyDown = player.isShiftKeyDown(); if (!player.mayBuild()) @@ -151,6 +151,12 @@ public class DisplayClothBlock extends Block implements IHaveBigOutline, IWrench return AllShapes.DISPLAY_CLOTH_OCCLUSION; } + @Override + public VoxelShape getCollisionShape(BlockState pState, BlockGetter pLevel, BlockPos pPos, + CollisionContext pContext) { + return AllShapes.DISPLAY_CLOTH_OCCLUSION; + } + @Override public boolean canSurvive(BlockState p_152922_, LevelReader p_152923_, BlockPos p_152924_) { return true; diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java index 1e8ac70007..3413f4d8d4 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java @@ -75,8 +75,8 @@ public class FactoryPanelScreen extends AbstractSimiScreen { int y = guiTop; if (addressBox == null) { - addressBox = - new AddressEditBox(this, new NoShadowFontWrapper(font), x + 38, y + 30 + middleHeight(), 110, 10); + addressBox = new AddressEditBox(this, new NoShadowFontWrapper(font), x + 38, y + 30 + middleHeight(), 110, + 10, false); addressBox.setValue(behaviour.recipeAddress); addressBox.setTextColor(0x555555); } diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/PackageFilterScreen.java b/src/main/java/com/simibubi/create/content/logistics/filter/PackageFilterScreen.java index 66a934bad4..afd3ebbccb 100644 --- a/src/main/java/com/simibubi/create/content/logistics/filter/PackageFilterScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/filter/PackageFilterScreen.java @@ -45,7 +45,7 @@ public class PackageFilterScreen extends AbstractFilterScreen int x = leftPos; int y = topPos; - addressBox = new AddressEditBox(this, this.font, x + 44, y + 28, 140, 9); + addressBox = new AddressEditBox(this, this.font, x + 44, y + 28, 140, 9, false); addressBox.setTextColor(0xffffff); addressBox.setValue(menu.address); addressBox.setResponder(this::onAddressEdited); @@ -57,7 +57,7 @@ public class PackageFilterScreen extends AbstractFilterScreen @Override public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { super.render(graphics, mouseX, mouseY, partialTicks); - + PoseStack ms = graphics.pose(); ms.pushPose(); ms.translate(leftPos + 16, topPos + 23, 0); @@ -90,7 +90,6 @@ public class PackageFilterScreen extends AbstractFilterScreen public boolean charTyped(char pCodePoint, int pModifiers) { return super.charTyped(pCodePoint, pModifiers); } - @Override protected void contentsCleared() { diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java index e2da5d3404..b64436fd4d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java @@ -11,6 +11,7 @@ import com.simibubi.create.content.equipment.clipboard.ClipboardEntry; import com.simibubi.create.content.equipment.clipboard.ClipboardOverrides; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; +import com.simibubi.create.foundation.blockEntity.behaviour.animatedContainer.AnimatedContainerBehaviour; import com.simibubi.create.foundation.item.SmartInventory; import com.simibubi.create.foundation.utility.CreateLang; @@ -42,6 +43,8 @@ public abstract class PackagePortBlockEntity extends SmartBlockEntity implements public PackagePortTarget target; public SmartInventory inventory; + protected AnimatedContainerBehaviour openTracker; + private LazyOptional itemHandler; public PackagePortBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { @@ -129,7 +132,12 @@ public abstract class PackagePortBlockEntity extends SmartBlockEntity implements } @Override - public void addBehaviours(List behaviours) {} + public void addBehaviours(List behaviours) { + behaviours.add(openTracker = new AnimatedContainerBehaviour<>(this, PackagePortMenu.class)); + openTracker.onOpenChanged(this::onOpenChange); + } + + protected abstract void onOpenChange(boolean open); public InteractionResult use(Player player) { if (player == null || player.isCrouching()) @@ -165,7 +173,7 @@ public abstract class PackagePortBlockEntity extends SmartBlockEntity implements List page = null; for (List freePage : list) { - if (freePage.size() > 16) + if (freePage.size() > 11) continue; page = freePage; break; @@ -179,9 +187,10 @@ public abstract class PackagePortBlockEntity extends SmartBlockEntity implements page.add(new ClipboardEntry(false, Components.literal("#" + addressFilter))); player.displayClientMessage(CreateLang.temporaryText("'" + addressFilter + "' added to Clipboard") .component(), true); - + ClipboardEntry.saveAll(list, mainHandItem); - mainHandItem.getTag().putInt("Type", ClipboardOverrides.ClipboardType.WRITTEN.ordinal()); + mainHandItem.getTag() + .putInt("Type", ClipboardOverrides.ClipboardType.WRITTEN.ordinal()); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortMenu.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortMenu.java index c14217b337..dd9d22e70d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortMenu.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortMenu.java @@ -1,6 +1,8 @@ package com.simibubi.create.content.logistics.packagePort; import com.simibubi.create.AllMenuTypes; +import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; +import com.simibubi.create.foundation.blockEntity.behaviour.animatedContainer.AnimatedContainerBehaviour; import com.simibubi.create.foundation.gui.menu.MenuBase; import com.simibubi.create.foundation.item.SmartInventory; @@ -24,6 +26,8 @@ public class PackagePortMenu extends MenuBase { public PackagePortMenu(MenuType type, int id, Inventory inv, PackagePortBlockEntity be) { super(type, id, inv, be); + BlockEntityBehaviour.get(be, AnimatedContainerBehaviour.TYPE) + .startOpen(player); } public static PackagePortMenu create(int id, Inventory inv, PackagePortBlockEntity be) { @@ -79,6 +83,9 @@ public class PackagePortMenu extends MenuBase { @Override public void removed(Player playerIn) { super.removed(playerIn); + if (!playerIn.level().isClientSide) + BlockEntityBehaviour.get(contentHolder, AnimatedContainerBehaviour.TYPE) + .stopOpen(playerIn); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportBlockEntity.java index 481f949bbb..e39c8b3434 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportBlockEntity.java @@ -29,6 +29,7 @@ import net.minecraftforge.items.ItemHandlerHelper; public class FrogportBlockEntity extends PackagePortBlockEntity { public ItemStack animatedPackage; + public LerpedFloat manualOpenAnimationProgress; public LerpedFloat animationProgress; public LerpedFloat anticipationProgress; public boolean currentlyDepositing; @@ -41,6 +42,9 @@ public class FrogportBlockEntity extends PackagePortBlockEntity { super(type, pos, state); animationProgress = LerpedFloat.linear(); anticipationProgress = LerpedFloat.linear(); + manualOpenAnimationProgress = LerpedFloat.linear() + .startWithValue(0) + .chase(0, 0.35, Chaser.LINEAR); } public boolean isAnimationInProgress() { @@ -68,8 +72,13 @@ public class FrogportBlockEntity extends PackagePortBlockEntity { public void sendAnticipate() { if (isAnimationInProgress()) return; - sendAnticipate = true; - sendData(); + for (int i = 0; i < inventory.getSlots(); i++) + if (inventory.getStackInSlot(i) + .isEmpty()) { + sendAnticipate = true; + sendData(); + return; + } } public void anticipate() { @@ -83,7 +92,10 @@ public class FrogportBlockEntity extends PackagePortBlockEntity { if (anticipationProgress.getValue() == 1) anticipationProgress.updateChaseTarget(0); + manualOpenAnimationProgress.updateChaseTarget(openTracker.openCount > 0 ? 1 : 0); + anticipationProgress.tickChaser(); + manualOpenAnimationProgress.tickChaser(); if (!isAnimationInProgress()) return; @@ -178,6 +190,9 @@ public class FrogportBlockEntity extends PackagePortBlockEntity { } } + @Override + protected void onOpenChange(boolean open) {} + public void tryPullingFromOwnAndAdjacentInventories() { if (isAnimationInProgress()) return; diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportRenderer.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportRenderer.java index b698b160d9..44f9bf945b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportRenderer.java @@ -84,6 +84,10 @@ public class FrogportRenderer extends SmartBlockEntityRenderer trackedGlobalStation; public LerpedFloat flag; - + private boolean sendParticles; public PostboxBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { @@ -55,17 +57,24 @@ public class PostboxBlockEntity extends PackagePortBlockEntity { flag.tickChaser(); if (currentTarget == 0 && settled != flag.getValue() > .15f) AllSoundEvents.CONTRAPTION_DISASSEMBLE.playAt(level, worldPosition, 0.75f, 1.5f, true); - + if (sendParticles) { sendParticles = false; BoneMealItem.addGrowthParticles(level, worldPosition, 40); } } - + + @Override + protected void onOpenChange(boolean open) { + level.setBlockAndUpdate(worldPosition, getBlockState().setValue(PostboxBlock.OPEN, open)); + level.playSound(null, worldPosition, open ? SoundEvents.BARREL_OPEN : SoundEvents.BARREL_CLOSE, + SoundSource.BLOCKS); + } + public void spawnParticles() { sendParticles = true; } - + @Override protected void write(CompoundTag tag, boolean clientPacket) { super.write(tag, clientPacket); @@ -73,7 +82,7 @@ public class PostboxBlockEntity extends PackagePortBlockEntity { NBTHelper.putMarker(tag, "Particles"); sendParticles = false; } - + @Override protected void read(CompoundTag tag, boolean clientPacket) { super.read(tag, clientPacket); diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBlockItem.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBlockItem.java index c8a06cc9ac..0b17b79817 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBlockItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBlockItem.java @@ -77,6 +77,8 @@ public class LogisticallyLinkedBlockItem extends BlockItem { if (player == null) return InteractionResult.FAIL; + if (player.isShiftKeyDown()) + return super.useOn(pContext); LogisticallyLinkedBehaviour link = BlockEntityBehaviour.get(level, pos, LogisticallyLinkedBehaviour.TYPE); boolean tuned = isTuned(stack); diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedClientHandler.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedClientHandler.java index 329d548bbf..db0bcab98c 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedClientHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedClientHandler.java @@ -2,15 +2,18 @@ package com.simibubi.create.content.logistics.packagerLink; import java.util.UUID; -import com.simibubi.create.AllBlockEntityTypes; +import org.apache.commons.lang3.tuple.Pair; + import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import net.createmod.catnip.CatnipClient; +import net.createmod.catnip.utility.AnimationTickHolder; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.shapes.VoxelShape; public class LogisticallyLinkedClientHandler { @@ -36,10 +39,20 @@ public class LogisticallyLinkedClientHandler { .getShape(player.level(), be.getBlockPos()); if (shape.isEmpty()) continue; - CatnipClient.OUTLINER.showAABB(behaviour, shape.bounds() - .inflate(AllBlockEntityTypes.FACTORY_PANEL.is(be) ? -1 / 16f : 0) - .move(be.getBlockPos()), 2) - .lineWidth(1 / 16f); + if (!player.blockPosition() + .closerThan(be.getBlockPos(), 64)) + continue; + for (int i = 0; i < shape.toAabbs() + .size(); i++) { + AABB aabb = shape.toAabbs() + .get(i); + CatnipClient.OUTLINER.showAABB(Pair.of(behaviour, i), aabb.inflate(-1 / 128f) + .move(be.getBlockPos()), 2) + .lineWidth(1 / 32f) + .disableLineNormals() + .colored(AnimationTickHolder.getTicks() % 16 < 8 ? 0x708DAD : 0x90ADCD); + } + } } diff --git a/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterScreen.java b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterScreen.java index 8e4508aeb4..e078efd689 100644 --- a/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterScreen.java @@ -70,7 +70,7 @@ public class RedstoneRequesterScreen extends AbstractSimiContainerScreen type, BlockPos pos, BlockState state) { super(type, pos, state); + blockStateTimer = 0; } @Override public void tick() { super.tick(); animation.tickChaser(); + + if (level.isClientSide) + return; + if (blockStateTimer == 0) + return; + + blockStateTimer--; + + if (blockStateTimer > 0) + return; + BlockState blockState = getBlockState(); + if (blockState.getValue(DeskBellBlock.POWERED)) + AllBlocks.DESK_BELL.get() + .unPress(blockState, level, worldPosition); } - + @Override protected void write(CompoundTag tag, boolean clientPacket) { super.write(tag, clientPacket); @@ -37,7 +57,7 @@ public class DeskBellBlockEntity extends SmartBlockEntity { NBTHelper.putMarker(tag, "Ding"); ding = false; } - + @Override protected void read(CompoundTag tag, boolean clientPacket) { super.read(tag, clientPacket); @@ -47,11 +67,13 @@ public class DeskBellBlockEntity extends SmartBlockEntity { public void ding() { if (!level.isClientSide) { + blockStateTimer = 20; ding = true; sendData(); return; } - + + animationOffset = level.random.nextFloat() * 2 * Mth.PI; animation.startWithValue(1) .chase(0, 0.05, Chaser.LINEAR); } diff --git a/src/main/java/com/simibubi/create/content/redstone/deskBell/DeskBellRenderer.java b/src/main/java/com/simibubi/create/content/redstone/deskBell/DeskBellRenderer.java index 6598d976d3..6fd2928143 100644 --- a/src/main/java/com/simibubi/create/content/redstone/deskBell/DeskBellRenderer.java +++ b/src/main/java/com/simibubi/create/content/redstone/deskBell/DeskBellRenderer.java @@ -48,8 +48,8 @@ public class DeskBellRenderer extends SmartBlockEntityRenderer> viableStations, int yOffset) { - super(pMinecraft, pScreen, pInput, pFont, true, true, 0, 7, false, 0xee_303030); + List> viableStations, boolean anchorToBottom, int yOffset) { + super(pMinecraft, pScreen, pInput, pFont, true, true, 0, 7, anchorToBottom, 0xee_303030); this.textBox = pInput; this.font = pFont; this.viableStations = viableStations; diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleScreen.java b/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleScreen.java index 05f3d14a3c..253de2337f 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleScreen.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleScreen.java @@ -297,7 +297,7 @@ public class ScheduleScreen extends AbstractSimiContainerScreen im if (!(e instanceof EditBox destinationBox)) return; destinationSuggestions = new DestinationSuggestions(this.minecraft, this, destinationBox, this.font, - getViableStations(field), topPos + 33); + getViableStations(field), false, topPos + 33); destinationSuggestions.setAllowSuggestions(true); destinationSuggestions.updateCommandInfo(); destinationBox.setResponder(this::onDestinationEdited); diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/animatedContainer/AnimatedContainerBehaviour.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/animatedContainer/AnimatedContainerBehaviour.java new file mode 100644 index 0000000000..a58efd8c64 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/animatedContainer/AnimatedContainerBehaviour.java @@ -0,0 +1,107 @@ +package com.simibubi.create.foundation.blockEntity.behaviour.animatedContainer; + +import java.util.function.Consumer; + +import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; +import com.simibubi.create.foundation.blockEntity.behaviour.BehaviourType; +import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; +import com.simibubi.create.foundation.gui.menu.MenuBase; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.AABB; + +public class AnimatedContainerBehaviour> extends BlockEntityBehaviour { + + public static final BehaviourType> TYPE = new BehaviourType<>(); + + public int openCount; + + private Class menuClass; + private Consumer openChanged; + + public AnimatedContainerBehaviour(SmartBlockEntity be, Class menuClass) { + super(be); + this.menuClass = menuClass; + openCount = 0; + } + + public void onOpenChanged(Consumer openChanged) { + this.openChanged = openChanged; + } + + @Override + public void read(CompoundTag compound, boolean clientPacket) { + super.read(compound, clientPacket); + if (clientPacket) + openCount = compound.getInt("OpenCount"); + } + + @Override + public void write(CompoundTag compound, boolean clientPacket) { + super.write(compound, clientPacket); + if (clientPacket) + compound.putInt("OpenCount", openCount); + } + + @Override + public void lazyTick() { + updateOpenCount(); + super.lazyTick(); + } + + void updateOpenCount() { + Level level = getWorld(); + if (level.isClientSide) + return; + if (openCount == 0) + return; + + int prevOpenCount = openCount; + openCount = 0; + + for (Player playerentity : level.getEntitiesOfClass(Player.class, new AABB(getPos()).inflate(8))) + if (menuClass.isInstance(playerentity.containerMenu) + && menuClass.cast(playerentity.containerMenu).contentHolder == blockEntity) + openCount++; + + if (prevOpenCount != openCount) { + if (openChanged != null && prevOpenCount == 0 && openCount > 0) + openChanged.accept(true); + if (openChanged != null && prevOpenCount > 0 && openCount == 0) + openChanged.accept(false); + blockEntity.sendData(); + } + } + + public void startOpen(Player player) { + if (player.isSpectator()) + return; + if (getWorld().isClientSide) + return; + if (openCount < 0) + openCount = 0; + openCount++; + if (openCount == 1 && openChanged != null) + openChanged.accept(true); + blockEntity.sendData(); + } + + public void stopOpen(Player player) { + if (player.isSpectator()) + return; + if (getWorld().isClientSide) + return; + openCount--; + if (openCount == 0 && openChanged != null) + openChanged.accept(false); + blockEntity.sendData(); + } + + @Override + public BehaviourType getType() { + return TYPE; + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/ItemApplicationRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/ItemApplicationRecipeGen.java index cb09352630..ecd66971f9 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/ItemApplicationRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/ItemApplicationRecipeGen.java @@ -2,6 +2,7 @@ package com.simibubi.create.foundation.data.recipe; import java.util.function.Supplier; +import com.simibubi.create.AllBlocks; import com.simibubi.create.AllRecipeTypes; import com.simibubi.create.AllTags.AllItemTags; @@ -10,9 +11,15 @@ import net.minecraft.tags.TagKey; import net.minecraft.world.item.Item; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.level.ItemLike; +import net.minecraftforge.common.Tags.Items; public class ItemApplicationRecipeGen extends ProcessingRecipeGen { + GeneratedRecipe BOUND_CARDBOARD_BLOCK = create("bound_cardboard_inworld", + b -> b.require(AllBlocks.CARDBOARD_BLOCK.asItem()) + .require(Items.STRING) + .output(AllBlocks.BOUND_CARDBOARD_BLOCK.asStack())); + GeneratedRecipe ANDESITE = woodCasing("andesite", I::andesiteAlloy, I::andesiteCasing); GeneratedRecipe COPPER = woodCasingTag("copper", I::copper, I::copperCasing); GeneratedRecipe BRASS = woodCasingTag("brass", I::brass, I::brassCasing); diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java index 6d02c4683c..2f810e1a94 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java @@ -121,13 +121,10 @@ public class StandardRecipeGen extends CreateRecipeProvider { .pattern("CC") .pattern("CC")), - BOUND_CARDBOARD_BLOCK = create(AllBlocks.BOUND_CARDBOARD_BLOCK).returns(8) + BOUND_CARDBOARD_BLOCK = create(AllBlocks.BOUND_CARDBOARD_BLOCK).returns(1) .unlockedBy(I::cardboard) - .viaShaped(b -> b.define('C', AllBlocks.CARDBOARD_BLOCK.get()) - .define('S', Tags.Items.STRING) - .pattern("CCC") - .pattern("CSC") - .pattern("CCC")), + .viaShapeless(b -> b.requires(AllBlocks.CARDBOARD_BLOCK.get()) + .requires(Items.STRING)), CARDBOARD_FROM_BLOCK = create(AllItems.CARDBOARD).withSuffix("_from_block") .returns(4) diff --git a/src/main/java/com/simibubi/create/foundation/events/InputEvents.java b/src/main/java/com/simibubi/create/foundation/events/InputEvents.java index 6b59cffb32..50c52ba69f 100644 --- a/src/main/java/com/simibubi/create/foundation/events/InputEvents.java +++ b/src/main/java/com/simibubi/create/foundation/events/InputEvents.java @@ -99,11 +99,14 @@ public class InputEvents { LinkedControllerClientHandler.deactivateInLectern(); TrainRelocator.onClicked(event); - if (ChainConveyorInteractionHandler.onUse()) + if (ChainConveyorInteractionHandler.onUse()) { event.setCanceled(true); - else if (PackagePortTargetSelectionHandler.onUse()) + return; + } else if (PackagePortTargetSelectionHandler.onUse()) { event.setCanceled(true); - + return; + } + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { if (ChainPackageInteractionHandler.onUse()) event.setCanceled(true); diff --git a/src/main/resources/assets/create/lang/default/interface.json b/src/main/resources/assets/create/lang/default/interface.json index 7839781416..33d0330672 100644 --- a/src/main/resources/assets/create/lang/default/interface.json +++ b/src/main/resources/assets/create/lang/default/interface.json @@ -333,8 +333,10 @@ "create.clipboard.actions": "Clipboard Actions", "create.clipboard.to_copy": "%1$s to Copy settings", + "create.clipboard.copy_other_clipboard": "%1$s to Copy entries from this Clipboard", "create.clipboard.to_paste": "%1$s to Paste settings", "create.clipboard.copied_from": "Copying settings from %1$s", + "create.clipboard.copied_from_clipboard": "Added entries from Clipboard", "create.clipboard.pasted_to": "Applied settings to %1$s", "create.schematicAndQuill.dimensions": "Schematic Size: %1$sx%2$sx%3$s", diff --git a/src/main/resources/assets/create/models/block/ladder.json b/src/main/resources/assets/create/models/block/ladder.json index 16a88bd372..217a67af34 100644 --- a/src/main/resources/assets/create/models/block/ladder.json +++ b/src/main/resources/assets/create/models/block/ladder.json @@ -6,6 +6,28 @@ "particle": "create:block/ladder_andesite" }, "elements": [ + { + "name": "hoop_right", + "from": [2, 16, 14], + "to": [4, 18, 18], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [14, 4, 16, 6], "texture": "#0", "cullface": "up"}, + "south": {"uv": [16, 4, 14, 6], "texture": "#0", "cullface": "up"}, + "up": {"uv": [14, 0, 16, 4], "rotation": 180, "texture": "#0", "cullface": "up"} + } + }, + { + "name": "hoop_right_backface", + "from": [2, 18, 14], + "to": [4, 16, 18], + "rotation": {"angle": 0, "axis": "y", "origin": [13, 19, 16]}, + "faces": { + "north": {"uv": [16, 4, 14, 6], "rotation": 180, "texture": "#0", "cullface": "up"}, + "south": {"uv": [14, 4, 16, 6], "rotation": 180, "texture": "#0", "cullface": "up"}, + "down": {"uv": [14, 0, 16, 4], "rotation": 180, "texture": "#0", "cullface": "up"} + } + }, { "name": "ladder", "from": [2, 0, 14], @@ -13,8 +35,8 @@ "shade": false, "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "east": {"uv": [12, 0, 14, 16], "texture": "#0"}, - "west": {"uv": [14, 0, 12, 16], "texture": "#0"} + "east": {"uv": [12, 0, 14, 16], "texture": "#0", "cullface": "south"}, + "west": {"uv": [14, 0, 12, 16], "texture": "#0", "cullface": "south"} } }, { @@ -33,8 +55,8 @@ "shade": false, "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "east": {"uv": [14, 0, 12, 16], "texture": "#0"}, - "west": {"uv": [12, 0, 14, 16], "texture": "#0"} + "east": {"uv": [14, 0, 12, 16], "texture": "#0", "cullface": "south"}, + "west": {"uv": [12, 0, 14, 16], "texture": "#0", "cullface": "south"} } }, { @@ -67,42 +89,22 @@ "south": {"uv": [14, 4, 16, 6], "rotation": 180, "texture": "#0", "cullface": "up"}, "down": {"uv": [14, 0, 16, 4], "rotation": 180, "texture": "#0", "cullface": "up"} } - }, - { - "name": "hoop_right", - "from": [2, 16, 14], - "to": [4, 18, 18], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [14, 4, 16, 6], "texture": "#0", "cullface": "up"}, - "south": {"uv": [16, 4, 14, 6], "texture": "#0", "cullface": "up"}, - "up": {"uv": [14, 0, 16, 4], "rotation": 180, "texture": "#0", "cullface": "up"} - } - }, - { - "name": "hoop_right_backface", - "from": [2, 18, 14], - "to": [4, 16, 18], - "rotation": {"angle": 0, "axis": "y", "origin": [13, 19, 16]}, - "faces": { - "north": {"uv": [16, 4, 14, 6], "rotation": 180, "texture": "#0", "cullface": "up"}, - "south": {"uv": [14, 4, 16, 6], "rotation": 180, "texture": "#0", "cullface": "up"}, - "down": {"uv": [14, 0, 16, 4], "rotation": 180, "texture": "#0", "cullface": "up"} - } } ], "groups": [ + 0, + 1, { "name": "Ladder", "origin": [0, 0, 0], "color": 0, - "children": [0, 1] + "children": [2, 3] }, { "name": "Hoops", "origin": [0, 0, 0], "color": 0, - "children": [2, 3, 4, 5] + "children": [4, 5, 6, 7] } ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/package_postbox/block_closed.json b/src/main/resources/assets/create/models/block/package_postbox/block_closed.json index 0f935812f7..35c8ef0fd0 100644 --- a/src/main/resources/assets/create/models/block/package_postbox/block_closed.json +++ b/src/main/resources/assets/create/models/block/package_postbox/block_closed.json @@ -4,7 +4,7 @@ "textures": { "0": "create:block/post_box/post_box_white", "1": "create:block/post_box/post_box_white_closed", - "particle": "create:block/post_box/post_box_white" + "particle": "#0" }, "elements": [ { diff --git a/src/main/resources/assets/create/models/block/package_postbox/block_open.json b/src/main/resources/assets/create/models/block/package_postbox/block_open.json index f348ae5f45..0faedf585a 100644 --- a/src/main/resources/assets/create/models/block/package_postbox/block_open.json +++ b/src/main/resources/assets/create/models/block/package_postbox/block_open.json @@ -1,5 +1,5 @@ { - "parent": "create:block/package_postbox/block_open", + "parent": "create:block/package_postbox/block_closed", "textures": { "1": "create:block/post_box/post_box_white_open" } From 2d37efe5bd484cc55278a3495f96640180326f9a Mon Sep 17 00:00:00 2001 From: Kryppers <65094918+Kryppers@users.noreply.github.com> Date: Fri, 1 Nov 2024 14:51:40 +0000 Subject: [PATCH 101/515] I broke it again updates to the cloth models texture updates for carboard sword and item sprite --- .../models/block/display_cloth/block.json | 72 +- .../models/block/display_cloth/item.json | 120 ++-- .../block/display_cloth/item_lower.json | 120 ++-- .../block/display_cloth/north_east.json | 14 +- .../block/display_cloth/north_west.json | 14 +- .../block/display_cloth/south_east.json | 14 +- .../block/display_cloth/south_west.json | 14 +- .../block/valve_handle/valve_handle.obj | 649 ++---------------- .../item/cardboard_sword/item_in_hand.json | 54 +- .../textures/block/display_cloth/black.png | Bin 363 -> 886 bytes .../textures/block/display_cloth/blue.png | Bin 363 -> 907 bytes .../textures/block/display_cloth/brown.png | Bin 363 -> 850 bytes .../textures/block/display_cloth/cyan.png | Bin 363 -> 868 bytes .../textures/block/display_cloth/gray.png | Bin 363 -> 871 bytes .../textures/block/display_cloth/green.png | Bin 363 -> 876 bytes .../block/display_cloth/light_blue.png | Bin 363 -> 885 bytes .../block/display_cloth/light_gray.png | Bin 363 -> 833 bytes .../textures/block/display_cloth/lime.png | Bin 363 -> 862 bytes .../textures/block/display_cloth/magenta.png | Bin 363 -> 838 bytes .../textures/block/display_cloth/orange.png | Bin 363 -> 830 bytes .../textures/block/display_cloth/pink.png | Bin 363 -> 777 bytes .../textures/block/display_cloth/purple.png | Bin 363 -> 864 bytes .../textures/block/display_cloth/red.png | Bin 597 -> 872 bytes .../textures/block/display_cloth/white.png | Bin 363 -> 754 bytes .../textures/block/display_cloth/yellow.png | Bin 363 -> 812 bytes .../create/textures/item/cardboard_sword.png | Bin 250 -> 387 bytes .../textures/item/cardboard_sword_in_hand.png | Bin 218 -> 485 bytes 27 files changed, 300 insertions(+), 771 deletions(-) diff --git a/src/main/resources/assets/create/models/block/display_cloth/block.json b/src/main/resources/assets/create/models/block/display_cloth/block.json index aac1d9ecbe..0106218c04 100644 --- a/src/main/resources/assets/create/models/block/display_cloth/block.json +++ b/src/main/resources/assets/create/models/block/display_cloth/block.json @@ -3,7 +3,7 @@ "parent": "block/block", "textures": { "0": "create:block/display_cloth/red", - "particle": "#0" + "particle": "create:block/display_cloth/red" }, "elements": [ { @@ -19,83 +19,83 @@ } }, { - "from": [-1, -11, 0], - "to": [0, 1, 16], + "from": [-1, -10, 0], + "to": [0.1, 1, 16], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [0, 8, 0.5, 14], "texture": "#0", "cullface": "west"}, - "east": {"uv": [0, 8, 8, 14], "texture": "#0", "cullface": "west"}, - "south": {"uv": [6, 8, 6.5, 14], "texture": "#0", "cullface": "west"}, - "west": {"uv": [0, 8, 8, 14], "texture": "#0", "cullface": "west"}, - "up": {"uv": [0, 8, 8, 8.5], "rotation": 90, "texture": "#0", "cullface": "west"} + "north": {"uv": [11.45, 9, 12, 14.5], "texture": "#0", "cullface": "west"}, + "east": {"uv": [0, 9, 8, 14.5], "texture": "#0", "cullface": "west"}, + "south": {"uv": [12, 9, 11.45, 14.5], "texture": "#0", "cullface": "west"}, + "west": {"uv": [0, 9, 8, 14.5], "texture": "#0", "cullface": "west"}, + "up": {"uv": [0, 8.45, 8, 9], "rotation": 90, "texture": "#0", "cullface": "west"} } }, { - "from": [-1, -9, 0], - "to": [0, -8, 16], + "from": [-1, -8, 0], + "to": [0.1, -8, 16], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { "down": {"uv": [0, 15.5, 8, 16], "rotation": 90, "texture": "#0", "cullface": "west"} } }, { - "from": [0, -11, -1], - "to": [16, 1, 0], + "from": [0, -10, -1], + "to": [16, 1, 0.1], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [0, 8, 8, 14], "texture": "#0", "cullface": "north"}, - "east": {"uv": [0, 8, 0.5, 14], "texture": "#0", "cullface": "north"}, - "south": {"uv": [0, 8, 8, 14], "texture": "#0", "cullface": "north"}, - "west": {"uv": [6, 8, 6.5, 14], "texture": "#0", "cullface": "north"}, - "up": {"uv": [0, 8, 8, 8.5], "rotation": 180, "texture": "#0", "cullface": "north"} + "north": {"uv": [0, 9, 8, 14.5], "texture": "#0", "cullface": "west"}, + "east": {"uv": [11.45, 9, 12, 14.5], "texture": "#0", "cullface": "west"}, + "south": {"uv": [0, 9, 8, 14.5], "texture": "#0", "cullface": "west"}, + "west": {"uv": [12, 9, 11.45, 14.5], "texture": "#0", "cullface": "west"}, + "up": {"uv": [0, 8.45, 8, 9], "rotation": 180, "texture": "#0", "cullface": "west"} } }, { - "from": [0, -9, -1], - "to": [16, -8, 0], + "from": [0, -8, -1], + "to": [16, -8, 0.1], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "down": {"uv": [0, 15.5, 8, 16], "texture": "#0", "cullface": "north"} + "down": {"uv": [0, 15.5, 8, 16], "texture": "#0", "cullface": "west"} } }, { - "from": [16, -11, 0], + "from": [15.9, -10, 0], "to": [17, 1, 16], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [6, 8, 6.5, 14], "texture": "#0", "cullface": "east"}, - "east": {"uv": [0, 8, 8, 14], "texture": "#0", "cullface": "east"}, - "south": {"uv": [0, 8, 0.5, 14], "texture": "#0", "cullface": "east"}, - "west": {"uv": [0, 8, 8, 14], "texture": "#0", "cullface": "east"}, - "up": {"uv": [0, 8, 8, 8.5], "rotation": 270, "texture": "#0", "cullface": "east"} + "north": {"uv": [12, 9, 11.45, 14.5], "texture": "#0", "cullface": "west"}, + "east": {"uv": [0, 9, 8, 14.5], "texture": "#0", "cullface": "west"}, + "south": {"uv": [11.45, 9, 12, 14.5], "texture": "#0", "cullface": "west"}, + "west": {"uv": [0, 9, 8, 14.5], "texture": "#0", "cullface": "west"}, + "up": {"uv": [0, 8.45, 8, 9], "rotation": 270, "texture": "#0", "cullface": "west"} } }, { - "from": [16, -9, 0], + "from": [15.9, -8, 0], "to": [17, -8, 16], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "down": {"uv": [0, 15.5, 8, 16], "rotation": 270, "texture": "#0", "cullface": "east"} + "down": {"uv": [0, 15.5, 8, 16], "rotation": 270, "texture": "#0", "cullface": "west"} } }, { - "from": [0, -11, 16], + "from": [0, -10, 15.9], "to": [16, 1, 17], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [0, 8, 8, 14], "texture": "#0", "cullface": "south"}, - "east": {"uv": [6, 8, 6.5, 14], "texture": "#0", "cullface": "south"}, - "south": {"uv": [0, 8, 8, 14], "texture": "#0", "cullface": "south"}, - "west": {"uv": [0, 8, 0.5, 14], "texture": "#0", "cullface": "south"}, - "up": {"uv": [0, 8, 8, 8.5], "texture": "#0", "cullface": "south"} + "north": {"uv": [0, 9, 8, 14.5], "texture": "#0", "cullface": "west"}, + "east": {"uv": [12, 9, 11.45, 14.5], "texture": "#0", "cullface": "west"}, + "south": {"uv": [0, 9, 8, 14.5], "texture": "#0", "cullface": "west"}, + "west": {"uv": [11.45, 9, 12, 14.5], "texture": "#0", "cullface": "west"}, + "up": {"uv": [0, 8.45, 8, 9], "texture": "#0", "cullface": "west"} } }, { - "from": [0, -9, 16], + "from": [0, -8, 15.9], "to": [16, -8, 17], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "down": {"uv": [0, 15.5, 8, 16], "rotation": 180, "texture": "#0", "cullface": "south"} + "down": {"uv": [0, 15.5, 8, 16], "rotation": 180, "texture": "#0", "cullface": "west"} } } ], diff --git a/src/main/resources/assets/create/models/block/display_cloth/item.json b/src/main/resources/assets/create/models/block/display_cloth/item.json index 816c98c4b1..df75a26388 100644 --- a/src/main/resources/assets/create/models/block/display_cloth/item.json +++ b/src/main/resources/assets/create/models/block/display_cloth/item.json @@ -3,7 +3,7 @@ "parent": "block/block", "textures": { "0": "create:block/display_cloth/red", - "particle": "#0" + "particle": "create:block/display_cloth/red" }, "elements": [ { @@ -19,145 +19,153 @@ } }, { - "from": [-1, -11, 0], - "to": [0, 1, 16], + "from": [-1, -10, 0], + "to": [0.1, 1, 16], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "east": {"uv": [0, 8, 8, 14], "texture": "#0", "cullface": "west"}, - "west": {"uv": [0, 8, 8, 14], "texture": "#0", "cullface": "west"}, - "up": {"uv": [0, 8, 8, 8.5], "rotation": 90, "texture": "#0", "cullface": "west"} + "north": {"uv": [11.45, 9, 12, 14.5], "texture": "#0", "cullface": "west"}, + "east": {"uv": [0, 9, 8, 14.5], "texture": "#0", "cullface": "west"}, + "south": {"uv": [12, 9, 11.45, 14.5], "texture": "#0", "cullface": "west"}, + "west": {"uv": [0, 9, 8, 14.5], "texture": "#0", "cullface": "west"}, + "up": {"uv": [0, 8.45, 8, 9], "rotation": 90, "texture": "#0", "cullface": "west"} } }, { - "from": [-1, -9, 0], - "to": [0, -8, 16], + "from": [-1, -8, 0], + "to": [0.1, -8, 16], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { "down": {"uv": [0, 15.5, 8, 16], "rotation": 90, "texture": "#0", "cullface": "west"} } }, { - "from": [0, -11, -1], - "to": [16, 1, 0], + "from": [0, -10, -1], + "to": [16, 1, 0.1], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [0, 8, 8, 14], "texture": "#0", "cullface": "north"}, - "south": {"uv": [0, 8, 8, 14], "texture": "#0", "cullface": "north"}, - "up": {"uv": [0, 8, 8, 8.5], "rotation": 180, "texture": "#0", "cullface": "north"} + "north": {"uv": [0, 9, 8, 14.5], "texture": "#0", "cullface": "west"}, + "east": {"uv": [11.45, 9, 12, 14.5], "texture": "#0", "cullface": "west"}, + "south": {"uv": [0, 9, 8, 14.5], "texture": "#0", "cullface": "west"}, + "west": {"uv": [12, 9, 11.45, 14.5], "texture": "#0", "cullface": "west"}, + "up": {"uv": [0, 8.45, 8, 9], "rotation": 180, "texture": "#0", "cullface": "west"} } }, { - "from": [0, -9, -1], - "to": [16, -8, 0], + "from": [0, -8, -1], + "to": [16, -8, 0.1], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "down": {"uv": [0, 15.5, 8, 16], "texture": "#0", "cullface": "north"} + "down": {"uv": [0, 15.5, 8, 16], "texture": "#0", "cullface": "west"} } }, { - "from": [16, -11, 0], + "from": [15.9, -10, 0], "to": [17, 1, 16], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "east": {"uv": [0, 8, 8, 14], "texture": "#0", "cullface": "east"}, - "west": {"uv": [0, 8, 8, 14], "texture": "#0", "cullface": "east"}, - "up": {"uv": [0, 8, 8, 8.5], "rotation": 270, "texture": "#0", "cullface": "east"} + "north": {"uv": [12, 9, 11.45, 14.5], "texture": "#0", "cullface": "west"}, + "east": {"uv": [0, 9, 8, 14.5], "texture": "#0", "cullface": "west"}, + "south": {"uv": [11.45, 9, 12, 14.5], "texture": "#0", "cullface": "west"}, + "west": {"uv": [0, 9, 8, 14.5], "texture": "#0", "cullface": "west"}, + "up": {"uv": [0, 8.45, 8, 9], "rotation": 270, "texture": "#0", "cullface": "west"} } }, { - "from": [16, -9, 0], + "from": [15.9, -8, 0], "to": [17, -8, 16], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "down": {"uv": [0, 15.5, 8, 16], "rotation": 270, "texture": "#0", "cullface": "east"} + "down": {"uv": [0, 15.5, 8, 16], "rotation": 270, "texture": "#0", "cullface": "west"} } }, { - "from": [0, -11, 16], + "from": [0, -10, 15.9], "to": [16, 1, 17], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [0, 8, 8, 14], "texture": "#0", "cullface": "south"}, - "south": {"uv": [0, 8, 8, 14], "texture": "#0", "cullface": "south"}, - "up": {"uv": [0, 8, 8, 8.5], "texture": "#0", "cullface": "south"} + "north": {"uv": [0, 9, 8, 14.5], "texture": "#0", "cullface": "west"}, + "east": {"uv": [12, 9, 11.45, 14.5], "texture": "#0", "cullface": "west"}, + "south": {"uv": [0, 9, 8, 14.5], "texture": "#0", "cullface": "west"}, + "west": {"uv": [11.45, 9, 12, 14.5], "texture": "#0", "cullface": "west"}, + "up": {"uv": [0, 8.45, 8, 9], "texture": "#0", "cullface": "west"} } }, { - "from": [0, -9, 16], + "from": [0, -8, 15.9], "to": [16, -8, 17], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "down": {"uv": [0, 15.5, 8, 16], "rotation": 180, "texture": "#0", "cullface": "south"} + "down": {"uv": [0, 15.5, 8, 16], "rotation": 180, "texture": "#0", "cullface": "west"} } }, { - "from": [-1, -11, -1], + "from": [-1, -10, -1], "to": [0, 1, 0], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [9, 8, 9.5, 14], "texture": "#0"}, - "west": {"uv": [9.5, 8, 10, 14], "texture": "#0"}, - "up": {"uv": [9, 8, 9.5, 8.5], "texture": "#0"} + "north": {"uv": [9, 9, 9.5, 14.5], "texture": "#0"}, + "west": {"uv": [9.5, 9, 10, 14.5], "texture": "#0"}, + "up": {"uv": [9.5, 8.5, 10, 9], "texture": "#0"} } }, { - "from": [-1, -9, -1], - "to": [0, -8, 0], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "from": [-1, -8, -1], + "to": [0, -7, 0], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 9, 8]}, "faces": { "down": {"uv": [7.5, 15.5, 8, 16], "texture": "#0"} } }, { - "from": [16, -11, -1], + "from": [16, -10, -1], "to": [17, 1, 0], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [9.5, 8, 10, 14], "texture": "#0"}, - "east": {"uv": [9, 8, 9.5, 14], "texture": "#0"}, - "up": {"uv": [9, 8, 9.5, 8.5], "rotation": 90, "texture": "#0"} + "north": {"uv": [9.5, 9, 10, 14.5], "texture": "#0"}, + "east": {"uv": [9, 9, 9.5, 14.5], "texture": "#0"}, + "up": {"uv": [9.5, 8.5, 10, 9], "rotation": 90, "texture": "#0"} } }, { - "from": [16, -9, -1], - "to": [17, -8, 0], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "from": [16, -8, -1], + "to": [17, -7, 0], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 9, 8]}, "faces": { "down": {"uv": [7.5, 15.5, 8, 16], "rotation": 270, "texture": "#0"} } }, { - "from": [16, -11, 16], + "from": [16, -10, 16], "to": [17, 1, 17], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "east": {"uv": [9.5, 8, 10, 14], "texture": "#0"}, - "south": {"uv": [9, 8, 9.5, 14], "texture": "#0"}, - "up": {"uv": [9, 8, 9.5, 8.5], "rotation": 180, "texture": "#0"} + "east": {"uv": [9.5, 9, 10, 14.5], "texture": "#0"}, + "south": {"uv": [9, 9, 9.5, 14.5], "texture": "#0"}, + "up": {"uv": [9.5, 8.5, 10, 9], "rotation": 180, "texture": "#0"} } }, { - "from": [16, -9, 16], - "to": [17, -8, 17], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "from": [16, -8, 16], + "to": [17, -7, 17], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 9, 8]}, "faces": { "down": {"uv": [7.5, 15.5, 8, 16], "rotation": 180, "texture": "#0"} } }, { - "from": [-1, -11, 16], + "from": [-1, -10, 16], "to": [0, 1, 17], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "south": {"uv": [9.5, 8, 10, 14], "texture": "#0"}, - "west": {"uv": [9, 8, 9.5, 14], "texture": "#0"}, - "up": {"uv": [9, 8, 9.5, 8.5], "rotation": 270, "texture": "#0"} + "south": {"uv": [9.5, 9, 10, 14.5], "texture": "#0"}, + "west": {"uv": [9, 9, 9.5, 14.5], "texture": "#0"}, + "up": {"uv": [9.5, 8.5, 10, 9], "rotation": 270, "texture": "#0"} } }, { - "from": [-1, -9, 16], - "to": [0, -8, 17], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "from": [-1, -8, 16], + "to": [0, -7, 17], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 9, 8]}, "faces": { "down": {"uv": [7.5, 15.5, 8, 16], "rotation": 90, "texture": "#0"} } diff --git a/src/main/resources/assets/create/models/block/display_cloth/item_lower.json b/src/main/resources/assets/create/models/block/display_cloth/item_lower.json index 2462647221..51d1dd6364 100644 --- a/src/main/resources/assets/create/models/block/display_cloth/item_lower.json +++ b/src/main/resources/assets/create/models/block/display_cloth/item_lower.json @@ -3,7 +3,7 @@ "parent": "block/block", "textures": { "0": "create:block/display_cloth/red", - "particle": "#0" + "particle": "create:block/display_cloth/red" }, "elements": [ { @@ -19,145 +19,153 @@ } }, { - "from": [-1, -11, 0], - "to": [0, 1, 16], + "from": [-1, -10, 0], + "to": [0.1, 1, 16], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "east": {"uv": [0, 8, 8, 14], "texture": "#0", "cullface": "west"}, - "west": {"uv": [0, 8, 8, 14], "texture": "#0", "cullface": "west"}, - "up": {"uv": [0, 8, 8, 8.5], "rotation": 90, "texture": "#0", "cullface": "west"} + "north": {"uv": [11.45, 9, 12, 14.5], "texture": "#0", "cullface": "west"}, + "east": {"uv": [0, 9, 8, 14.5], "texture": "#0", "cullface": "west"}, + "south": {"uv": [12, 9, 11.45, 14.5], "texture": "#0", "cullface": "west"}, + "west": {"uv": [0, 9, 8, 14.5], "texture": "#0", "cullface": "west"}, + "up": {"uv": [0, 8.45, 8, 9], "rotation": 90, "texture": "#0", "cullface": "west"} } }, { - "from": [-1, -9, 0], - "to": [0, -8, 16], + "from": [-1, -8, 0], + "to": [0.1, -8, 16], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { "down": {"uv": [0, 15.5, 8, 16], "rotation": 90, "texture": "#0", "cullface": "west"} } }, { - "from": [0, -11, -1], - "to": [16, 1, 0], + "from": [0, -10, -1], + "to": [16, 1, 0.1], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [0, 8, 8, 14], "texture": "#0", "cullface": "north"}, - "south": {"uv": [0, 8, 8, 14], "texture": "#0", "cullface": "north"}, - "up": {"uv": [0, 8, 8, 8.5], "rotation": 180, "texture": "#0", "cullface": "north"} + "north": {"uv": [0, 9, 8, 14.5], "texture": "#0", "cullface": "west"}, + "east": {"uv": [11.45, 9, 12, 14.5], "texture": "#0", "cullface": "west"}, + "south": {"uv": [0, 9, 8, 14.5], "texture": "#0", "cullface": "west"}, + "west": {"uv": [12, 9, 11.45, 14.5], "texture": "#0", "cullface": "west"}, + "up": {"uv": [0, 8.45, 8, 9], "rotation": 180, "texture": "#0", "cullface": "west"} } }, { - "from": [0, -9, -1], - "to": [16, -8, 0], + "from": [0, -8, -1], + "to": [16, -8, 0.1], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "down": {"uv": [0, 15.5, 8, 16], "texture": "#0", "cullface": "north"} + "down": {"uv": [0, 15.5, 8, 16], "texture": "#0", "cullface": "west"} } }, { - "from": [16, -11, 0], + "from": [15.9, -10, 0], "to": [17, 1, 16], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "east": {"uv": [0, 8, 8, 14], "texture": "#0", "cullface": "east"}, - "west": {"uv": [0, 8, 8, 14], "texture": "#0", "cullface": "east"}, - "up": {"uv": [0, 8, 8, 8.5], "rotation": 270, "texture": "#0", "cullface": "east"} + "north": {"uv": [12, 9, 11.45, 14.5], "texture": "#0", "cullface": "west"}, + "east": {"uv": [0, 9, 8, 14.5], "texture": "#0", "cullface": "west"}, + "south": {"uv": [11.45, 9, 12, 14.5], "texture": "#0", "cullface": "west"}, + "west": {"uv": [0, 9, 8, 14.5], "texture": "#0", "cullface": "west"}, + "up": {"uv": [0, 8.45, 8, 9], "rotation": 270, "texture": "#0", "cullface": "west"} } }, { - "from": [16, -9, 0], + "from": [15.9, -8, 0], "to": [17, -8, 16], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "down": {"uv": [0, 15.5, 8, 16], "rotation": 270, "texture": "#0", "cullface": "east"} + "down": {"uv": [0, 15.5, 8, 16], "rotation": 270, "texture": "#0", "cullface": "west"} } }, { - "from": [0, -11, 16], + "from": [0, -10, 15.9], "to": [16, 1, 17], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [0, 8, 8, 14], "texture": "#0", "cullface": "south"}, - "south": {"uv": [0, 8, 8, 14], "texture": "#0", "cullface": "south"}, - "up": {"uv": [0, 8, 8, 8.5], "texture": "#0", "cullface": "south"} + "north": {"uv": [0, 9, 8, 14.5], "texture": "#0", "cullface": "west"}, + "east": {"uv": [12, 9, 11.45, 14.5], "texture": "#0", "cullface": "west"}, + "south": {"uv": [0, 9, 8, 14.5], "texture": "#0", "cullface": "west"}, + "west": {"uv": [11.45, 9, 12, 14.5], "texture": "#0", "cullface": "west"}, + "up": {"uv": [0, 8.45, 8, 9], "texture": "#0", "cullface": "west"} } }, { - "from": [0, -9, 16], + "from": [0, -8, 15.9], "to": [16, -8, 17], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "down": {"uv": [0, 15.5, 8, 16], "rotation": 180, "texture": "#0", "cullface": "south"} + "down": {"uv": [0, 15.5, 8, 16], "rotation": 180, "texture": "#0", "cullface": "west"} } }, { - "from": [-1, -11, -1], + "from": [-1, -10, -1], "to": [0, 1, 0], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [9, 8, 9.5, 14], "texture": "#0"}, - "west": {"uv": [9.5, 8, 10, 14], "texture": "#0"}, - "up": {"uv": [9, 8, 9.5, 8.5], "texture": "#0"} + "north": {"uv": [9, 9, 9.5, 14.5], "texture": "#0"}, + "west": {"uv": [9.5, 9, 10, 14.5], "texture": "#0"}, + "up": {"uv": [9.5, 8.5, 10, 9], "texture": "#0"} } }, { - "from": [-1, -9, -1], - "to": [0, -8, 0], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "from": [-1, -8, -1], + "to": [0, -7, 0], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 9, 8]}, "faces": { "down": {"uv": [7.5, 15.5, 8, 16], "texture": "#0"} } }, { - "from": [16, -11, -1], + "from": [16, -10, -1], "to": [17, 1, 0], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [9.5, 8, 10, 14], "texture": "#0"}, - "east": {"uv": [9, 8, 9.5, 14], "texture": "#0"}, - "up": {"uv": [9, 8, 9.5, 8.5], "rotation": 90, "texture": "#0"} + "north": {"uv": [9.5, 9, 10, 14.5], "texture": "#0"}, + "east": {"uv": [9, 9, 9.5, 14.5], "texture": "#0"}, + "up": {"uv": [9.5, 8.5, 10, 9], "rotation": 90, "texture": "#0"} } }, { - "from": [16, -9, -1], - "to": [17, -8, 0], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "from": [16, -8, -1], + "to": [17, -7, 0], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 9, 8]}, "faces": { "down": {"uv": [7.5, 15.5, 8, 16], "rotation": 270, "texture": "#0"} } }, { - "from": [16, -11, 16], + "from": [16, -10, 16], "to": [17, 1, 17], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "east": {"uv": [9.5, 8, 10, 14], "texture": "#0"}, - "south": {"uv": [9, 8, 9.5, 14], "texture": "#0"}, - "up": {"uv": [9, 8, 9.5, 8.5], "rotation": 180, "texture": "#0"} + "east": {"uv": [9.5, 9, 10, 14.5], "texture": "#0"}, + "south": {"uv": [9, 9, 9.5, 14.5], "texture": "#0"}, + "up": {"uv": [9.5, 8.5, 10, 9], "rotation": 180, "texture": "#0"} } }, { - "from": [16, -9, 16], - "to": [17, -8, 17], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "from": [16, -8, 16], + "to": [17, -7, 17], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 9, 8]}, "faces": { "down": {"uv": [7.5, 15.5, 8, 16], "rotation": 180, "texture": "#0"} } }, { - "from": [-1, -11, 16], + "from": [-1, -10, 16], "to": [0, 1, 17], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "south": {"uv": [9.5, 8, 10, 14], "texture": "#0"}, - "west": {"uv": [9, 8, 9.5, 14], "texture": "#0"}, - "up": {"uv": [9, 8, 9.5, 8.5], "rotation": 270, "texture": "#0"} + "south": {"uv": [9.5, 9, 10, 14.5], "texture": "#0"}, + "west": {"uv": [9, 9, 9.5, 14.5], "texture": "#0"}, + "up": {"uv": [9.5, 8.5, 10, 9], "rotation": 270, "texture": "#0"} } }, { - "from": [-1, -9, 16], - "to": [0, -8, 17], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "from": [-1, -8, 16], + "to": [0, -7, 17], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 9, 8]}, "faces": { "down": {"uv": [7.5, 15.5, 8, 16], "rotation": 90, "texture": "#0"} } diff --git a/src/main/resources/assets/create/models/block/display_cloth/north_east.json b/src/main/resources/assets/create/models/block/display_cloth/north_east.json index 26610fdd8a..ca7bf618f7 100644 --- a/src/main/resources/assets/create/models/block/display_cloth/north_east.json +++ b/src/main/resources/assets/create/models/block/display_cloth/north_east.json @@ -7,19 +7,19 @@ }, "elements": [ { - "from": [16, -11, -1], + "from": [16, -10, -1], "to": [17, 1, 0], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [9.5, 8, 10, 14], "texture": "#0"}, - "east": {"uv": [9, 8, 9.5, 14], "texture": "#0"}, - "up": {"uv": [9, 8, 9.5, 8.5], "rotation": 90, "texture": "#0"} + "north": {"uv": [9.5, 9, 10, 14.5], "texture": "#0"}, + "east": {"uv": [9, 9, 9.5, 14.5], "texture": "#0"}, + "up": {"uv": [9.5, 8.5, 10, 9], "rotation": 90, "texture": "#0"} } }, { - "from": [16, -9, -1], - "to": [17, -8, 0], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "from": [16, -8, -1], + "to": [17, -7, 0], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 9, 8]}, "faces": { "down": {"uv": [7.5, 15.5, 8, 16], "rotation": 270, "texture": "#0"} } diff --git a/src/main/resources/assets/create/models/block/display_cloth/north_west.json b/src/main/resources/assets/create/models/block/display_cloth/north_west.json index a37e0c7ff4..d563854def 100644 --- a/src/main/resources/assets/create/models/block/display_cloth/north_west.json +++ b/src/main/resources/assets/create/models/block/display_cloth/north_west.json @@ -7,19 +7,19 @@ }, "elements": [ { - "from": [-1, -11, -1], + "from": [-1, -10, -1], "to": [0, 1, 0], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [9, 8, 9.5, 14], "texture": "#0"}, - "west": {"uv": [9.5, 8, 10, 14], "texture": "#0"}, - "up": {"uv": [9, 8, 9.5, 8.5], "texture": "#0"} + "north": {"uv": [9, 9, 9.5, 14.5], "texture": "#0"}, + "west": {"uv": [9.5, 9, 10, 14.5], "texture": "#0"}, + "up": {"uv": [9.5, 8.5, 10, 9], "texture": "#0"} } }, { - "from": [-1, -9, -1], - "to": [0, -8, 0], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "from": [-1, -8, -1], + "to": [0, -7, 0], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 9, 8]}, "faces": { "down": {"uv": [7.5, 15.5, 8, 16], "texture": "#0"} } diff --git a/src/main/resources/assets/create/models/block/display_cloth/south_east.json b/src/main/resources/assets/create/models/block/display_cloth/south_east.json index cd2340e3d2..b018b7fa65 100644 --- a/src/main/resources/assets/create/models/block/display_cloth/south_east.json +++ b/src/main/resources/assets/create/models/block/display_cloth/south_east.json @@ -7,19 +7,19 @@ }, "elements": [ { - "from": [16, -11, 16], + "from": [16, -10, 16], "to": [17, 1, 17], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "east": {"uv": [9.5, 8, 10, 14], "texture": "#0"}, - "south": {"uv": [9, 8, 9.5, 14], "texture": "#0"}, - "up": {"uv": [9, 8, 9.5, 8.5], "rotation": 180, "texture": "#0"} + "east": {"uv": [9.5, 9, 10, 14.5], "texture": "#0"}, + "south": {"uv": [9, 9, 9.5, 14.5], "texture": "#0"}, + "up": {"uv": [9.5, 8.5, 10, 9], "rotation": 180, "texture": "#0"} } }, { - "from": [16, -9, 16], - "to": [17, -8, 17], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "from": [16, -8, 16], + "to": [17, -7, 17], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 9, 8]}, "faces": { "down": {"uv": [7.5, 15.5, 8, 16], "rotation": 180, "texture": "#0"} } diff --git a/src/main/resources/assets/create/models/block/display_cloth/south_west.json b/src/main/resources/assets/create/models/block/display_cloth/south_west.json index 8935a922f5..e1e5463bf6 100644 --- a/src/main/resources/assets/create/models/block/display_cloth/south_west.json +++ b/src/main/resources/assets/create/models/block/display_cloth/south_west.json @@ -7,19 +7,19 @@ }, "elements": [ { - "from": [-1, -11, 16], + "from": [-1, -10, 16], "to": [0, 1, 17], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "south": {"uv": [9.5, 8, 10, 14], "texture": "#0"}, - "west": {"uv": [9, 8, 9.5, 14], "texture": "#0"}, - "up": {"uv": [9, 8, 9.5, 8.5], "rotation": 270, "texture": "#0"} + "south": {"uv": [9.5, 9, 10, 14.5], "texture": "#0"}, + "west": {"uv": [9, 9, 9.5, 14.5], "texture": "#0"}, + "up": {"uv": [9.5, 8.5, 10, 9], "rotation": 270, "texture": "#0"} } }, { - "from": [-1, -9, 16], - "to": [0, -8, 17], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "from": [-1, -8, 16], + "to": [0, -7, 17], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 9, 8]}, "faces": { "down": {"uv": [7.5, 15.5, 8, 16], "rotation": 90, "texture": "#0"} } diff --git a/src/main/resources/assets/create/models/block/valve_handle/valve_handle.obj b/src/main/resources/assets/create/models/block/valve_handle/valve_handle.obj index 0b35c651e7..d300609c66 100644 --- a/src/main/resources/assets/create/models/block/valve_handle/valve_handle.obj +++ b/src/main/resources/assets/create/models/block/valve_handle/valve_handle.obj @@ -1,4 +1,4 @@ -# Blender 3.5.0 +# Blender 4.2.2 LTS # www.blender.org mtllib valve_handle.mtl o Cube.009 @@ -58,26 +58,6 @@ v 0.437500 0.047335 0.364277 v 0.437500 0.135723 0.452665 v 0.562500 0.135723 0.452665 v 0.562500 0.047335 0.364277 -v 0.437500 0.356694 0.231694 -v 0.437500 0.312500 0.275888 -v 0.437500 0.268306 0.320083 -v 0.437500 0.224112 0.364277 -v 0.437500 0.179917 0.408471 -v 0.562500 0.179917 0.408471 -v 0.562500 0.224112 0.364277 -v 0.562500 0.268306 0.320083 -v 0.562500 0.312500 0.275888 -v 0.562500 0.356694 0.231694 -v 0.562500 0.091529 0.320083 -v 0.562500 0.135723 0.275888 -v 0.562500 0.179917 0.231694 -v 0.562500 0.224112 0.187500 -v 0.562500 0.268306 0.143306 -v 0.437500 0.268306 0.143306 -v 0.437500 0.224112 0.187500 -v 0.437500 0.179917 0.231694 -v 0.437500 0.135723 0.275888 -v 0.437500 0.091529 0.320083 v 0.099112 0.312500 0.562500 v 0.187500 0.400888 0.562500 v 0.099112 0.312500 0.437500 @@ -86,26 +66,6 @@ v 0.364277 0.047335 0.562500 v 0.452665 0.135723 0.562500 v 0.452665 0.135723 0.437500 v 0.364277 0.047335 0.437500 -v 0.231694 0.356694 0.562500 -v 0.275888 0.312500 0.562500 -v 0.320083 0.268306 0.562500 -v 0.364277 0.224112 0.562500 -v 0.408471 0.179917 0.562500 -v 0.408471 0.179917 0.437500 -v 0.364277 0.224112 0.437500 -v 0.320083 0.268306 0.437500 -v 0.275888 0.312500 0.437500 -v 0.231694 0.356694 0.437500 -v 0.320083 0.091529 0.437500 -v 0.275888 0.135723 0.437500 -v 0.231694 0.179917 0.437500 -v 0.187500 0.224112 0.437500 -v 0.143306 0.268306 0.437500 -v 0.143306 0.268306 0.562500 -v 0.187500 0.224112 0.562500 -v 0.231694 0.179917 0.562500 -v 0.275888 0.135723 0.562500 -v 0.320083 0.091529 0.562500 v 0.562500 0.312500 0.900888 v 0.562500 0.400888 0.812500 v 0.437500 0.312500 0.900888 @@ -114,26 +74,6 @@ v 0.562500 0.047335 0.635723 v 0.562500 0.135723 0.547335 v 0.437500 0.135723 0.547335 v 0.437500 0.047335 0.635723 -v 0.562500 0.356694 0.768306 -v 0.562500 0.312500 0.724112 -v 0.562500 0.268306 0.679917 -v 0.562500 0.224112 0.635723 -v 0.562500 0.179917 0.591529 -v 0.437500 0.179917 0.591529 -v 0.437500 0.224112 0.635723 -v 0.437500 0.268306 0.679917 -v 0.437500 0.312500 0.724112 -v 0.437500 0.356694 0.768306 -v 0.437500 0.091529 0.679917 -v 0.437500 0.135723 0.724112 -v 0.437500 0.179917 0.768306 -v 0.437500 0.224112 0.812500 -v 0.437500 0.268306 0.856694 -v 0.562500 0.268306 0.856694 -v 0.562500 0.224112 0.812500 -v 0.562500 0.179917 0.768306 -v 0.562500 0.135723 0.724112 -v 0.562500 0.091529 0.679917 v 0.900888 0.312500 0.437500 v 0.812500 0.400888 0.437500 v 0.900888 0.312500 0.562500 @@ -142,26 +82,6 @@ v 0.635723 0.047335 0.437500 v 0.547335 0.135723 0.437500 v 0.547335 0.135723 0.562500 v 0.635723 0.047335 0.562500 -v 0.768306 0.356694 0.437500 -v 0.724112 0.312500 0.437500 -v 0.679917 0.268306 0.437500 -v 0.635723 0.224112 0.437500 -v 0.591529 0.179917 0.437500 -v 0.591529 0.179917 0.562500 -v 0.635723 0.224112 0.562500 -v 0.679918 0.268306 0.562500 -v 0.724112 0.312500 0.562500 -v 0.768306 0.356694 0.562500 -v 0.679918 0.091529 0.562500 -v 0.724112 0.135723 0.562500 -v 0.768306 0.179917 0.562500 -v 0.812500 0.224112 0.562500 -v 0.856694 0.268306 0.562500 -v 0.856694 0.268306 0.437500 -v 0.812500 0.224112 0.437500 -v 0.768306 0.179917 0.437500 -v 0.724112 0.135723 0.437500 -v 0.679917 0.091529 0.437500 vn -1.0000 -0.0000 -0.0000 vn -0.0000 -0.0000 -1.0000 vn 1.0000 -0.0000 -0.0000 @@ -172,533 +92,104 @@ vn 0.7071 -0.0000 -0.7071 vn -0.7071 -0.0000 0.7071 vn 0.7071 -0.0000 0.7071 vn -0.7071 -0.0000 -0.7071 -vn -0.0000 0.7071 0.7071 vn -0.0000 -0.7071 -0.7071 -vn 0.7071 0.7071 -0.0000 +vn -0.0000 0.7071 0.7071 vn -0.7071 -0.7071 -0.0000 -vn -0.0000 0.7071 -0.7071 +vn 0.7071 0.7071 -0.0000 vn -0.0000 -0.7071 0.7071 -vn -0.7071 0.7071 -0.0000 +vn -0.0000 0.7071 -0.7071 vn 0.7071 -0.7071 -0.0000 +vn -0.7071 0.7071 -0.0000 vt 1.000000 0.500000 -vt 0.625000 0.500000 -vt 1.000000 0.625000 vt 1.000000 0.625000 vt 0.625000 0.625000 vt 0.625000 0.500000 -vt 1.000000 0.500000 vt 1.000000 1.000000 -vt 0.625000 0.625000 -vt 1.000000 0.625000 vt 0.625000 1.000000 -vt 0.625000 0.500000 -vt 1.000000 0.500000 -vt 0.625000 0.625000 -vt 0.625000 0.625000 -vt 1.000000 0.625000 -vt 0.625000 0.500000 -vt 1.000000 0.500000 -vt 0.625000 1.000000 -vt 0.625000 0.625000 -vt 1.000000 0.625000 -vt 1.000000 1.000000 -vt 0.000000 0.687500 -vt 0.375000 1.000000 -vt 0.375000 0.687500 -vt 0.000021 0.999979 -vt 0.000000 0.500000 -vt 0.375000 1.000000 vt 0.375000 0.500000 -vt -0.000000 1.000000 -vt 0.321429 0.875000 -vt 0.053587 0.875000 -vt 0.321429 0.687500 -vt 0.321429 0.875000 -vt 0.053587 0.687500 -vt 0.053571 0.875000 -vt 0.000000 0.687500 -vt 0.375000 1.000000 vt 0.375000 0.687500 -vt 0.000021 0.999979 -vt 0.000000 0.500000 -vt 0.375000 1.000000 -vt 0.375000 0.500000 -vt -0.000000 1.000000 -vt 0.321429 0.875000 -vt 0.053587 0.875000 -vt 0.321429 0.687500 -vt 0.321429 0.875000 -vt 0.053587 0.687500 -vt 0.053571 0.875000 vt 0.000000 0.687500 -vt 0.375000 1.000000 -vt 0.375000 0.687500 -vt 0.000021 0.999979 vt 0.000000 0.500000 -vt 0.375000 1.000000 -vt 0.375000 0.500000 -vt -0.000000 1.000000 -vt 0.321429 0.875000 -vt 0.053587 0.875000 -vt 0.321429 0.687500 -vt 0.321429 0.875000 -vt 0.053587 0.687500 -vt 0.053571 0.875000 -vt 0.000000 0.687500 -vt 0.375000 1.000000 -vt 0.375000 0.687500 vt 0.000021 0.999979 -vt 0.000000 0.500000 -vt 0.375000 1.000000 -vt 0.375000 0.500000 -vt -0.000000 1.000000 -vt 0.321429 0.875000 -vt 0.053587 0.875000 -vt 0.321429 0.687500 -vt 0.321429 0.875000 -vt 0.053587 0.687500 -vt 0.053571 0.875000 -vt 0.000000 0.687500 -vt 0.375000 1.000000 -vt 0.375000 0.687500 -vt 0.000021 0.999979 -vt 0.000000 0.500000 -vt 0.375000 1.000000 -vt 0.375000 0.500000 -vt -0.000000 1.000000 -vt 0.321429 0.875000 -vt 0.053587 0.875000 -vt 0.321429 0.687500 -vt 0.321429 0.875000 -vt 0.053587 0.687500 -vt 0.053571 0.875000 -vt 0.000000 0.687500 -vt 0.375000 1.000000 -vt 0.375000 0.687500 -vt 0.000021 0.999979 -vt 0.000000 0.500000 -vt 0.375000 1.000000 -vt 0.375000 0.500000 -vt -0.000000 1.000000 -vt 0.321429 0.875000 -vt 0.053587 0.875000 -vt 0.321429 0.687500 -vt 0.321429 0.875000 -vt 0.053587 0.687500 -vt 0.053571 0.875000 -vt 0.000000 0.687500 -vt 0.375000 1.000000 -vt 0.375000 0.687500 -vt 0.000021 0.999979 -vt 0.000000 0.500000 -vt 0.375000 1.000000 -vt 0.375000 0.500000 -vt -0.000000 1.000000 -vt 0.321429 0.875000 -vt 0.053587 0.875000 -vt 0.321429 0.687500 -vt 0.321429 0.875000 -vt 0.053587 0.687500 -vt 0.053571 0.875000 -vt 0.375000 0.687500 -vt 0.000021 0.999979 -vt 0.000000 0.687500 -vt 0.375000 1.000000 -vt 0.375000 0.500000 -vt -0.000000 1.000000 -vt 0.000000 0.500000 -vt 0.375000 1.000000 vt 0.053587 0.875000 vt 0.321429 0.875000 +vt 0.375000 1.000000 vt 0.053587 0.687500 -vt 0.053571 0.875000 vt 0.321429 0.687500 -vt 0.321429 0.875000 +vt -0.000000 1.000000 +vt 0.053571 0.875000 vt 0.312500 -0.000000 -vt 0.062500 -0.000000 -vt 0.625000 1.000000 vt 0.312500 0.187500 vt 0.062500 0.187500 vt 0.062500 -0.000000 -vt 0.312500 -0.000000 vt 0.625000 0.687500 -vt 0.062500 0.187500 -vt 0.312500 0.187500 -vt 0.062500 0.437500 -vt 0.062500 -0.000000 -vt 0.312500 -0.000000 -vt 0.937500 1.000000 -vt 0.062500 0.187500 -vt 0.312500 0.187500 -vt 0.062500 -0.000000 -vt 0.312500 -0.000000 vt 0.937500 0.687500 -vt 0.062500 0.187500 -vt 0.312500 0.187500 +vt 0.937500 1.000000 vt 0.312500 0.437500 -vt 0.562500 1.000000 +vt 0.062500 0.437500 vt 0.437500 1.000000 -vt 0.437500 1.000000 -vt 0.562500 1.000000 -vt 0.562500 1.000000 -vt 0.437500 1.000000 -vt 0.437500 1.000000 -vt 0.562500 1.000000 vt 0.437500 0.625000 vt 0.562500 0.625000 -vt 0.562500 0.625000 -vt 0.437500 0.625000 -vt 0.562500 0.625000 -vt 0.437500 0.625000 -vt 0.437500 0.625000 -vt 0.562500 0.625000 -vt 0.437500 0.937500 -vt 0.562500 0.937500 -vt 0.437500 0.875000 -vt 0.562500 0.875000 -vt 0.437500 0.812500 -vt 0.562500 0.812500 -vt 0.437500 0.750000 -vt 0.562500 0.750000 -vt 0.437500 0.687500 -vt 0.562500 0.687500 -vt 0.437500 0.687500 -vt 0.562500 0.687500 -vt 0.437500 0.750000 -vt 0.562500 0.750000 -vt 0.437500 0.812500 -vt 0.562500 0.812500 -vt 0.437500 0.875000 -vt 0.562500 0.875000 -vt 0.437500 0.937500 -vt 0.562500 0.937500 -vt 0.562500 0.687500 -vt 0.437500 0.687500 -vt 0.562500 0.750000 -vt 0.437500 0.750000 -vt 0.562500 0.812500 -vt 0.437500 0.812500 -vt 0.562500 0.875000 -vt 0.437500 0.875000 -vt 0.562500 0.937500 -vt 0.437500 0.937500 -vt 0.562500 0.937500 -vt 0.437500 0.937500 -vt 0.562500 0.875000 -vt 0.437500 0.875000 -vt 0.562500 0.812500 -vt 0.437500 0.812500 -vt 0.562500 0.750000 -vt 0.437500 0.750000 -vt 0.562500 0.687500 -vt 0.437500 0.687500 vt 0.562500 1.000000 -vt 0.437500 1.000000 -vt 0.437500 1.000000 -vt 0.562500 1.000000 -vt 0.562500 1.000000 -vt 0.437500 1.000000 -vt 0.437500 1.000000 -vt 0.562500 1.000000 -vt 0.437500 0.625000 -vt 0.562500 0.625000 -vt 0.562500 0.625000 -vt 0.437500 0.625000 -vt 0.562500 0.625000 -vt 0.437500 0.625000 -vt 0.437500 0.625000 -vt 0.562500 0.625000 -vt 0.437500 0.937500 -vt 0.562500 0.937500 -vt 0.437500 0.875000 -vt 0.562500 0.875000 -vt 0.437500 0.812500 -vt 0.562500 0.812500 -vt 0.437500 0.750000 -vt 0.562500 0.750000 -vt 0.437500 0.687500 -vt 0.562500 0.687500 -vt 0.437500 0.687500 -vt 0.562500 0.687500 -vt 0.437500 0.750000 -vt 0.562500 0.750000 -vt 0.437500 0.812500 -vt 0.562500 0.812500 -vt 0.437500 0.875000 -vt 0.562500 0.875000 -vt 0.437500 0.937500 -vt 0.562500 0.937500 -vt 0.562500 0.687500 -vt 0.437500 0.687500 -vt 0.562500 0.750000 -vt 0.437500 0.750000 -vt 0.562500 0.812500 -vt 0.437500 0.812500 -vt 0.562500 0.875000 -vt 0.437500 0.875000 -vt 0.562500 0.937500 -vt 0.437500 0.937500 -vt 0.562500 0.937500 -vt 0.437500 0.937500 -vt 0.562500 0.875000 -vt 0.437500 0.875000 -vt 0.562500 0.812500 -vt 0.437500 0.812500 -vt 0.562500 0.750000 -vt 0.437500 0.750000 -vt 0.562500 0.687500 -vt 0.437500 0.687500 -vt 0.562500 1.000000 -vt 0.437500 1.000000 -vt 0.437500 1.000000 -vt 0.562500 1.000000 -vt 0.562500 1.000000 -vt 0.437500 1.000000 -vt 0.437500 1.000000 -vt 0.562500 1.000000 -vt 0.437500 0.625000 -vt 0.562500 0.625000 -vt 0.562500 0.625000 -vt 0.437500 0.625000 -vt 0.562500 0.625000 -vt 0.437500 0.625000 -vt 0.437500 0.625000 -vt 0.562500 0.625000 -vt 0.437500 0.937500 -vt 0.562500 0.937500 -vt 0.437500 0.875000 -vt 0.562500 0.875000 -vt 0.437500 0.812500 -vt 0.562500 0.812500 -vt 0.437500 0.750000 -vt 0.562500 0.750000 -vt 0.437500 0.687500 -vt 0.562500 0.687500 -vt 0.437500 0.687500 -vt 0.562500 0.687500 -vt 0.437500 0.750000 -vt 0.562500 0.750000 -vt 0.437500 0.812500 -vt 0.562500 0.812500 -vt 0.437500 0.875000 -vt 0.562500 0.875000 -vt 0.437500 0.937500 -vt 0.562500 0.937500 -vt 0.562500 0.687500 -vt 0.437500 0.687500 -vt 0.562500 0.750000 -vt 0.437500 0.750000 -vt 0.562500 0.812500 -vt 0.437500 0.812500 -vt 0.562500 0.875000 -vt 0.437500 0.875000 -vt 0.562500 0.937500 -vt 0.437500 0.937500 -vt 0.562500 0.937500 -vt 0.437500 0.937500 -vt 0.562500 0.875000 -vt 0.437500 0.875000 -vt 0.562500 0.812500 -vt 0.437500 0.812500 -vt 0.562500 0.750000 -vt 0.437500 0.750000 -vt 0.562500 0.687500 -vt 0.437500 0.687500 -vt 0.562500 1.000000 -vt 0.437500 1.000000 -vt 0.437500 1.000000 -vt 0.562500 1.000000 -vt 0.562500 1.000000 -vt 0.437500 1.000000 -vt 0.437500 1.000000 -vt 0.562500 1.000000 -vt 0.437500 0.625000 -vt 0.562500 0.625000 -vt 0.562500 0.625000 -vt 0.437500 0.625000 -vt 0.562500 0.625000 -vt 0.437500 0.625000 -vt 0.437500 0.625000 -vt 0.562500 0.625000 -vt 0.437500 0.937500 -vt 0.562500 0.937500 -vt 0.437500 0.875000 -vt 0.562500 0.875000 -vt 0.437500 0.812500 -vt 0.562500 0.812500 -vt 0.437500 0.750000 -vt 0.562500 0.750000 -vt 0.437500 0.687500 -vt 0.562500 0.687500 -vt 0.437500 0.687500 -vt 0.562500 0.687500 -vt 0.437500 0.750000 -vt 0.562500 0.750000 -vt 0.437500 0.812500 -vt 0.562500 0.812500 -vt 0.437500 0.875000 -vt 0.562500 0.875000 -vt 0.437500 0.937500 -vt 0.562500 0.937500 -vt 0.562500 0.687500 -vt 0.437500 0.687500 -vt 0.562500 0.750000 -vt 0.437500 0.750000 -vt 0.562500 0.812500 -vt 0.437500 0.812500 -vt 0.562500 0.875000 -vt 0.437500 0.875000 -vt 0.562500 0.937500 -vt 0.437500 0.937500 -vt 0.562500 0.937500 -vt 0.437500 0.937500 -vt 0.562500 0.875000 -vt 0.437500 0.875000 -vt 0.562500 0.812500 -vt 0.437500 0.812500 -vt 0.562500 0.750000 -vt 0.437500 0.750000 -vt 0.562500 0.687500 -vt 0.437500 0.687500 s 0 usemtl Material -f 1/1/1 2/4/1 4/9/1 3/6/1 -f 3/7/2 4/10/2 8/20/2 7/17/2 -f 7/18/3 8/21/3 6/15/3 5/12/3 -f 5/13/4 6/16/4 2/5/4 1/2/4 -f 8/22/5 4/11/5 2/5/5 6/16/5 -f 3/8/6 7/19/6 5/14/6 1/3/6 -f 38/125/2 37/121/2 9/23/2 10/27/2 -f 37/122/5 39/129/5 11/31/5 9/24/5 -f 40/131/4 12/33/4 11/31/4 39/129/4 -f 38/126/6 10/28/6 12/34/6 40/132/6 -f 10/29/7 9/25/7 13/37/7 14/41/7 -f 9/26/5 11/32/5 15/45/5 13/38/5 -f 12/35/8 16/47/8 15/45/8 11/32/8 -f 10/30/6 14/42/6 16/48/6 12/36/6 -f 14/43/3 13/39/3 17/51/3 18/55/3 -f 13/40/5 15/46/5 19/59/5 17/52/5 -f 16/49/1 20/61/1 19/59/1 15/46/1 -f 14/44/6 18/56/6 20/62/6 16/50/6 -f 18/57/9 17/53/9 21/65/9 22/69/9 -f 17/54/5 19/60/5 23/73/5 21/66/5 -f 20/63/10 24/75/10 23/73/10 19/60/10 -f 18/58/6 22/70/6 24/76/6 20/64/6 -f 22/71/4 21/67/4 25/79/4 26/83/4 -f 21/68/5 23/74/5 27/87/5 25/80/5 -f 24/77/2 28/89/2 27/87/2 23/74/2 -f 22/72/6 26/84/6 28/90/6 24/78/6 -f 26/85/8 25/81/8 29/93/8 30/97/8 -f 25/82/5 27/88/5 31/101/5 29/94/5 -f 28/91/7 32/103/7 31/101/7 27/88/7 -f 26/86/6 30/98/6 32/104/6 28/92/6 -f 30/99/1 29/95/1 33/107/1 34/111/1 -f 29/96/5 31/102/5 35/115/5 33/108/5 -f 32/105/3 36/117/3 35/115/3 31/102/3 -f 30/100/6 34/112/6 36/118/6 32/106/6 -f 34/113/10 33/109/10 37/123/10 38/127/10 -f 33/110/5 35/116/5 39/130/5 37/124/5 -f 36/119/9 40/133/9 39/130/9 35/116/9 -f 34/114/6 38/128/6 40/134/6 36/120/6 -f 41/135/1 42/138/1 44/143/1 43/140/1 -f 43/141/2 44/144/2 48/154/2 47/151/2 -f 47/152/3 48/155/3 46/149/3 45/146/3 -f 45/147/4 46/150/4 42/139/4 41/136/4 -f 43/142/6 47/153/6 45/148/6 41/137/6 -f 48/156/5 44/145/5 42/139/5 46/150/5 -f 76/212/1 53/165/1 54/167/1 61/182/1 -f 61/181/11 54/168/11 55/169/11 62/184/11 -f 67/194/12 56/171/12 53/166/12 76/211/12 -f 62/183/3 55/170/3 56/172/3 67/193/3 -f 52/163/3 66/191/3 71/201/3 51/161/3 -f 66/191/3 65/189/3 70/199/3 71/201/3 -f 65/189/3 64/187/3 69/197/3 70/199/3 -f 64/187/3 63/185/3 68/195/3 69/197/3 -f 63/185/3 62/183/3 67/193/3 68/195/3 -f 51/162/12 71/202/12 72/203/12 49/157/12 -f 71/202/12 70/200/12 73/205/12 72/203/12 -f 70/200/12 69/198/12 74/207/12 73/205/12 -f 69/198/12 68/196/12 75/209/12 74/207/12 -f 68/196/12 67/194/12 76/211/12 75/209/12 -f 50/159/11 57/173/11 66/192/11 52/164/11 -f 57/173/11 58/175/11 65/190/11 66/192/11 -f 58/175/11 59/177/11 64/188/11 65/190/11 -f 59/177/11 60/179/11 63/186/11 64/188/11 -f 60/179/11 61/181/11 62/184/11 63/186/11 -f 49/158/1 72/204/1 57/174/1 50/160/1 -f 72/204/1 73/206/1 58/176/1 57/174/1 -f 73/206/1 74/208/1 59/178/1 58/176/1 -f 74/208/1 75/210/1 60/180/1 59/178/1 -f 75/210/1 76/212/1 61/182/1 60/180/1 -f 104/268/4 81/221/4 82/223/4 89/238/4 -f 89/237/13 82/224/13 83/225/13 90/240/13 -f 95/250/14 84/227/14 81/222/14 104/267/14 -f 90/239/2 83/226/2 84/228/2 95/249/2 -f 80/219/2 94/247/2 99/257/2 79/217/2 -f 94/247/2 93/245/2 98/255/2 99/257/2 -f 93/245/2 92/243/2 97/253/2 98/255/2 -f 92/243/2 91/241/2 96/251/2 97/253/2 -f 91/241/2 90/239/2 95/249/2 96/251/2 -f 79/218/14 99/258/14 100/259/14 77/213/14 -f 99/258/14 98/256/14 101/261/14 100/259/14 -f 98/256/14 97/254/14 102/263/14 101/261/14 -f 97/254/14 96/252/14 103/265/14 102/263/14 -f 96/252/14 95/250/14 104/267/14 103/265/14 -f 78/215/13 85/229/13 94/248/13 80/220/13 -f 85/229/13 86/231/13 93/246/13 94/248/13 -f 86/231/13 87/233/13 92/244/13 93/246/13 -f 87/233/13 88/235/13 91/242/13 92/244/13 -f 88/235/13 89/237/13 90/240/13 91/242/13 -f 77/214/4 100/260/4 85/230/4 78/216/4 -f 100/260/4 101/262/4 86/232/4 85/230/4 -f 101/262/4 102/264/4 87/234/4 86/232/4 -f 102/264/4 103/266/4 88/236/4 87/234/4 -f 103/266/4 104/268/4 89/238/4 88/236/4 -f 132/324/3 109/277/3 110/279/3 117/294/3 -f 117/293/15 110/280/15 111/281/15 118/296/15 -f 123/306/16 112/283/16 109/278/16 132/323/16 -f 118/295/1 111/282/1 112/284/1 123/305/1 -f 108/275/1 122/303/1 127/313/1 107/273/1 -f 122/303/1 121/301/1 126/311/1 127/313/1 -f 121/301/1 120/299/1 125/309/1 126/311/1 -f 120/299/1 119/297/1 124/307/1 125/309/1 -f 119/297/1 118/295/1 123/305/1 124/307/1 -f 107/274/16 127/314/16 128/315/16 105/269/16 -f 127/314/16 126/312/16 129/317/16 128/315/16 -f 126/312/16 125/310/16 130/319/16 129/317/16 -f 125/310/16 124/308/16 131/321/16 130/319/16 -f 124/308/16 123/306/16 132/323/16 131/321/16 -f 106/271/15 113/285/15 122/304/15 108/276/15 -f 113/285/15 114/287/15 121/302/15 122/304/15 -f 114/287/15 115/289/15 120/300/15 121/302/15 -f 115/289/15 116/291/15 119/298/15 120/300/15 -f 116/291/15 117/293/15 118/296/15 119/298/15 -f 105/270/3 128/316/3 113/286/3 106/272/3 -f 128/316/3 129/318/3 114/288/3 113/286/3 -f 129/318/3 130/320/3 115/290/3 114/288/3 -f 130/320/3 131/322/3 116/292/3 115/290/3 -f 131/322/3 132/324/3 117/294/3 116/292/3 -f 160/380/2 137/333/2 138/335/2 145/350/2 -f 145/349/17 138/336/17 139/337/17 146/352/17 -f 151/362/18 140/339/18 137/334/18 160/379/18 -f 146/351/4 139/338/4 140/340/4 151/361/4 -f 136/331/4 150/359/4 155/369/4 135/329/4 -f 150/359/4 149/357/4 154/367/4 155/369/4 -f 149/357/4 148/355/4 153/365/4 154/367/4 -f 148/355/4 147/353/4 152/363/4 153/365/4 -f 147/353/4 146/351/4 151/361/4 152/363/4 -f 135/330/18 155/370/18 156/371/18 133/325/18 -f 155/370/18 154/368/18 157/373/18 156/371/18 -f 154/368/18 153/366/18 158/375/18 157/373/18 -f 153/366/18 152/364/18 159/377/18 158/375/18 -f 152/364/18 151/362/18 160/379/18 159/377/18 -f 134/327/17 141/341/17 150/360/17 136/332/17 -f 141/341/17 142/343/17 149/358/17 150/360/17 -f 142/343/17 143/345/17 148/356/17 149/358/17 -f 143/345/17 144/347/17 147/354/17 148/356/17 -f 144/347/17 145/349/17 146/352/17 147/354/17 -f 133/326/2 156/372/2 141/342/2 134/328/2 -f 156/372/2 157/374/2 142/344/2 141/342/2 -f 157/374/2 158/376/2 143/346/2 142/344/2 -f 158/376/2 159/378/2 144/348/2 143/346/2 -f 159/378/2 160/380/2 145/350/2 144/348/2 +f 1/1/1 2/2/1 4/3/1 3/4/1 +f 3/1/2 4/2/2 8/3/2 7/4/2 +f 7/1/3 8/2/3 6/3/3 5/4/3 +f 5/1/4 6/2/4 2/3/4 1/4/4 +f 8/5/5 4/6/5 2/3/5 6/2/5 +f 3/5/6 7/6/6 5/3/6 1/2/6 +f 38/7/2 37/8/2 9/9/2 10/10/2 +f 37/11/5 39/12/5 11/13/5 9/14/5 +f 40/15/4 12/16/4 11/13/4 39/12/4 +f 38/17/6 10/14/6 12/13/6 40/18/6 +f 10/7/7 9/8/7 13/9/7 14/10/7 +f 9/11/5 11/12/5 15/13/5 13/14/5 +f 12/15/8 16/16/8 15/13/8 11/12/8 +f 10/17/6 14/14/6 16/13/6 12/18/6 +f 14/7/3 13/8/3 17/9/3 18/10/3 +f 13/11/5 15/12/5 19/13/5 17/14/5 +f 16/15/1 20/16/1 19/13/1 15/12/1 +f 14/17/6 18/14/6 20/13/6 16/18/6 +f 18/7/9 17/8/9 21/9/9 22/10/9 +f 17/11/5 19/12/5 23/13/5 21/14/5 +f 20/15/10 24/16/10 23/13/10 19/12/10 +f 18/17/6 22/14/6 24/13/6 20/18/6 +f 22/7/4 21/8/4 25/9/4 26/10/4 +f 21/11/5 23/12/5 27/13/5 25/14/5 +f 24/15/2 28/16/2 27/13/2 23/12/2 +f 22/17/6 26/14/6 28/13/6 24/18/6 +f 26/7/8 25/8/8 29/9/8 30/10/8 +f 25/11/5 27/12/5 31/13/5 29/14/5 +f 28/15/7 32/16/7 31/13/7 27/12/7 +f 26/17/6 30/14/6 32/13/6 28/18/6 +f 30/7/1 29/8/1 33/9/1 34/10/1 +f 29/11/5 31/12/5 35/13/5 33/14/5 +f 32/15/3 36/16/3 35/13/3 31/12/3 +f 30/17/6 34/14/6 36/13/6 32/18/6 +f 34/7/10 33/8/10 37/9/10 38/10/10 +f 33/11/5 35/12/5 39/13/5 37/14/5 +f 36/15/9 40/16/9 39/13/9 35/12/9 +f 34/17/6 38/14/6 40/13/6 36/18/6 +f 41/19/1 42/20/1 44/21/1 43/22/1 +f 43/19/2 44/20/2 48/21/2 47/22/2 +f 47/19/3 48/20/3 46/21/3 45/22/3 +f 45/19/4 46/20/4 42/21/4 41/22/4 +f 43/23/6 47/24/6 45/25/6 41/6/6 +f 48/26/5 44/27/5 42/21/5 46/20/5 +f 52/28/3 55/29/3 56/30/3 51/31/3 +f 51/28/11 56/29/11 53/30/11 49/31/11 +f 50/28/12 54/29/12 55/30/12 52/31/12 +f 49/28/1 53/29/1 54/30/1 50/31/1 +f 60/28/2 63/29/2 64/30/2 59/31/2 +f 59/28/13 64/29/13 61/30/13 57/31/13 +f 58/28/14 62/29/14 63/30/14 60/31/14 +f 57/28/4 61/29/4 62/30/4 58/31/4 +f 68/28/1 71/29/1 72/30/1 67/31/1 +f 67/28/15 72/29/15 69/30/15 65/31/15 +f 66/28/16 70/29/16 71/30/16 68/31/16 +f 65/28/3 69/29/3 70/30/3 66/31/3 +f 76/28/4 79/29/4 80/30/4 75/31/4 +f 75/28/17 80/29/17 77/30/17 73/31/17 +f 74/28/18 78/29/18 79/30/18 76/31/18 +f 73/28/2 77/29/2 78/30/2 74/31/2 diff --git a/src/main/resources/assets/create/models/item/cardboard_sword/item_in_hand.json b/src/main/resources/assets/create/models/item/cardboard_sword/item_in_hand.json index b627c875e1..0acfe4bbce 100644 --- a/src/main/resources/assets/create/models/item/cardboard_sword/item_in_hand.json +++ b/src/main/resources/assets/create/models/item/cardboard_sword/item_in_hand.json @@ -7,27 +7,49 @@ }, "elements": [ { - "from": [6, -8, 6], - "to": [10, 8, 10], - "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 6]}, + "from": [6, 8, 6], + "to": [10, 23, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 6]}, "faces": { - "north": {"uv": [5, 0, 9, 16], "texture": "#2"}, - "east": {"uv": [9, 0, 5, 16], "texture": "#2"}, - "south": {"uv": [5, 0, 9, 16], "texture": "#2"}, - "west": {"uv": [9, 0, 5, 16], "texture": "#2"}, - "down": {"uv": [10, 0, 14, 4], "texture": "#2"} + "north": {"uv": [5, 1, 9, 16], "texture": "#2"}, + "east": {"uv": [0, 1, 4, 16], "texture": "#2"}, + "south": {"uv": [5, 1, 9, 16], "texture": "#2"}, + "west": {"uv": [0, 1, 4, 16], "texture": "#2"} } }, { - "from": [6, 8, 6], - "to": [10, 24, 10], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 6]}, + "from": [6, -7, 6], + "to": [10, 8, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]}, "faces": { - "north": {"uv": [0, 0, 4, 16], "texture": "#2"}, - "east": {"uv": [4, 0, 0, 16], "texture": "#2"}, - "south": {"uv": [0, 0, 4, 16], "texture": "#2"}, - "west": {"uv": [4, 0, 0, 16], "texture": "#2"}, - "up": {"uv": [10, 0, 14, 4], "rotation": 90, "texture": "#2"} + "north": {"uv": [5, 0, 9, 15], "texture": "#2"}, + "east": {"uv": [0, 0, 4, 15], "texture": "#2"}, + "south": {"uv": [5, 0, 9, 15], "texture": "#2"}, + "west": {"uv": [0, 0, 4, 15], "texture": "#2"} + } + }, + { + "from": [6, 23, 6], + "to": [10, 24, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [6, 23, 6]}, + "faces": { + "north": {"uv": [10, 7, 14, 8], "texture": "#2"}, + "east": {"uv": [10, 5, 14, 6], "texture": "#2"}, + "south": {"uv": [10, 7, 14, 8], "texture": "#2"}, + "west": {"uv": [10, 5, 14, 6], "texture": "#2"}, + "up": {"uv": [10, 0, 14, 4], "texture": "#2"} + } + }, + { + "from": [6, -8, 6], + "to": [10, -7, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [6, -8, 6]}, + "faces": { + "north": {"uv": [10, 12, 14, 13], "texture": "#2"}, + "east": {"uv": [10, 10, 14, 11], "texture": "#2"}, + "south": {"uv": [10, 12, 14, 13], "texture": "#2"}, + "west": {"uv": [10, 10, 14, 11], "texture": "#2"}, + "down": {"uv": [10, 0, 14, 4], "texture": "#2"} } } ], diff --git a/src/main/resources/assets/create/textures/block/display_cloth/black.png b/src/main/resources/assets/create/textures/block/display_cloth/black.png index 922327a8acc30b6f4667000fc2420496e7bff2e0..92e10fea84a72fb05196eee948014082f93e7327 100644 GIT binary patch delta 874 zcmV-w1C{*i0`>-w8Gi-<0047(dh`GQ13gJZK~z|U<(E%LR8bVhe>05WH18j^5F>G+ zlw^=Wg*fsARhiFtnp zT?Er&x_91tGeOTcE~2x!^WAf~@7!~~``t5kVDu z)$4Sq0HXdH7fnZEkr_93uWy9K(o4&AYc6Um(k!r>6Aj^jU2^YzxyD-2e2_G615BPG^?oM!EN! zvYQHGQK&pX`fpaBZ)sugH=*oOz`{R0kz{4H@*MYGuka?9+XxguWMp`>Y}+NziG>OLrxB2UOa}Xh%67>im)i)Y z17mjvZpjm^ufOwTVDrN#Ov{!TsOJ|AN!P_rbWI7I0RVb?Z As{jB1 delta 347 zcmeyy_L^yeWIZzj1B1(wu46!ou{g-xiDBJ2nU_EgOS+@4BLl<6e(pbstU$h5fKP~P zqt1?9t!EESyjZHd>f61y@2f=|D=TB*-uLKN_h2&+usfej%VVXMsm#F$0615(qP{dUSUZP;h~#i(`m| z|J#Y)e1{cyTzC}|n0}u5s~`O;YKqlOmsg9r?XuTo98=;`EUJ@YW!`D~KgkTc^VTGt5evK3 zq5&0_;=y_o+G5#52_B@!-MxuYaPMya0_(kpMd+cB6};3O-0GpMRKY#8w1=uotr%oY zHwR&+$>>Z%hVd}_UfxXNVLItS{9RtY@AsQGZ+_qJ`@LUE?|*&rUA)m)zzc^ocSrbM z#HEY#019ueR%yEdJA3hjzjgU+i2`PBG!}ScsYcZ@af1$Zr#cnCU4I@(`=Lv#$lHN( z+YP8%CjD@PBMfw0cfC6Cdl7)bfXd9`$%Om5BXEOA;UZ>kuBJJ5#5`x}FHp5il?ff& z)`E(6M3-j44V1GSyFsL|%#4op_*s~_vlmb0TymVGd5m>U%tQme7foou5efGd+n{?e zz!AoTzwHJ}BSp--ba6h#spMFmb1;<#rfH;b9RO0C>VF((H6SxHQw_B4a8&WcR1IV~ ze_!dCn#F!lCj%vpO)Tfe!UE>DsT?0qD%O4rI@H_HM}f>y9X%0lf}1ccrkV zYe3!w(m#&>4_oQ0+uy`~udgO5wW|7^ou3x>?zsykfX|xOVt^0V-_O;cn2&yX2*7i- z3bkW39)BNns2!`RfZmf{>H&#+PkQ{-^VNL!;4sg7#~XO~^F9D!5CC8aK^O#Tlx7K$ ziqq!+e*5*&(`{gBWsMVd0)9D6viH_foWiebxT@jD9&mLFfa5D4B#T_To^J!EmJC(f zZ|--otvPk>x9=rtm;UX0$!XC2(kddx5Aye?=708Xgx%$Q5QVGUhS!_ z82)CXk@#=!jTgGVALD!Zk7XH>3&^(S09ZUZPuop+_Pyi^_QD~K7`JPBd{Hyk&KoqA z7wLy1*3S=dgNU`$FD8}m=*y*FV(I^=0bgED7J75J1en~)yMfkSXzu=z`r@6vH2&i2 z-+0wUq+{I@3ZncOICm;y?et6Z!x7)N|4e1z!C|6}#&XvGvhuf%GVt0fWh$bSI|Bf$ zeEe-(WX!IU$I5`Z*I!+>QsckPXGdwX=nwvXR$9OML+tlQO5s2*HQ)O5okD-l{{jEL VF7Mz8H*x>~002ovPDHLkV1kR%&m#Z; delta 347 zcmeBXf6X*OvYwfNfx%@-*D)Z)SRCZ;#IWw1%u67LCEd~2k%3`jKlh(RRv_Ojz$e7D zQD?`l*0YBuUMy8!_3hr#uZBz&6+l~zrDRFCo3a4A%1z`?gxjj_J%G@ zm6-z6y6fh#bRZ>E666>B9}U$1XLz)KzYtKGv%n*=n1Ml034|F}J-RyyD7e7W#WBRf z|LsI?zQYPUF1(5fOh3>3)sKD^HO1q#d fXX9)B#r1)Kfm^4NQTALY(6J1ju6{1-oD!M<-PW2a diff --git a/src/main/resources/assets/create/textures/block/display_cloth/brown.png b/src/main/resources/assets/create/textures/block/display_cloth/brown.png index 922327a8acc30b6f4667000fc2420496e7bff2e0..d8512f5d3d41f389f0df800d8803f73831098a51 100644 GIT binary patch delta 838 zcmV-M1G)U`0@4PM8Gi-<0047(dh`GQ0~tv~K~z|U<(E%L6j2<x{dCxa%b~ zC_?&UfzoLS0zoCBRP2&S1VWb%ojZ2TLzhB`lDc@%gM_ODqU$O2kS!*rgeH|Kf^IYJ zc-juT@9oSuR_m;X=y!R1-|y{vzxn;Xzwdh+7xd$x330KL!n#{n$FC~u@R`nu{8XGz)C!L`gVcWikgiAOccDA-p&uGm#I*k16qvPDf2e zjb)!x-~f1V#IFtjj+(l4!Oa2pdcUT8n4Xe~=fwec&3}(Y2c+WJYApKPizCOT16~|( zYrkCwa#lheaQFG2aAmZ{*WuvOf!V~Eba-(<+y%mKU;ocq;LY@S)<_pxN)H$M-#zcO z?%I{s0KmZO=UITh+jon4peV}=O8{tLop2<~xAm`tBVoB9y_gQW-)JHXP*Q3ys~_>0B$ta5UH*PU~_F1fN0%$7p}MA3W;~O zws@A`=;nne056LTAXa};YWvc=8HWzcPbM7NKR=mp=)(MDLT*%6uCc#o7I{1Flpy%QWOGSoD7?nFK(*qEju5UHwSXLAFfz=gc_iv#TI z{hHF;+RmBFaV+B}&28;ira|M?Hiz;FzreyD@9c)hx$C&Lp&`HJXmJ6grl+K$i7ytZ z7I=1I!qFW9+wG_&P);{B$uC-4c<;!-kJS|{(~ueP@{0#atge=_a;@kL0Py7A^{k)K zy+2Pe76jzI9;-d!7!R9wkHSjvKKTDEF!=CJc7JbAG8`z1&G(;<`ucnR3mO3tNiH~1 Ql>h($07*qoM6N<$g8c)br~m)} delta 347 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 delta 347 zcmey$_L^yeWIZzj1B1(wu46!ou{g-xiDBJ2nU_EgOS+@4BLl<6e(pbstU$h5fKP~P zqt1?9t!EESyjZHd>f61y@2f=|D=TB*-uLKN_h2&+usfej%VVXMsm#F$0615(qP{dUSUZP;h~#i(`m| z|J#Y)e1{cyTzC}|n0}u5s~`O;YKqlOmsg9r?XuTo98=;`EUJ@YW!`DK858Gi-<0047(dh`GQ0|-e(K~z|UK>9|yvTcu@}~UOZ@G^q?{EFETNDz?kSkO-wwf7sJVT0S_(0E~zDm5QQl1ma=aT z_0Y~^cDoweEeGRwnSS$TXWq5~Vw>B%e{a*@lMAb)Z(HJJqf=Cd;sDBBg7 zR$73jKv;}C=pP#0f0FGJ{iO4 zW@m_qc^GK3Gk+7F7z-gVG;kccF8Cx=u8SCtm-aA-`eRH)%;m|bTpiyDXr@&RjJb@l zJZ8z&oajgn5V=h`ARQ7S2HW0;5TeOmwkzyR7-&-s9gs1VF;?%n%z?U7%{dYVQ2?Hp zsxkKGfLyS{Iq;bkFDM86F+UO=kcy|qSl)BV9dg-zWPdsklmmY4S9PEhi27sxr?H2}DC z{Z>l_ie}|k0RV}VfmBZlUpF?9>Phi{(q75)f#jvV5-KH|`?oi?T3Pqdfz{x) z4!K+f%lmIyMF4=TqRq8+o@i_PJ6BV!APO`dpnt~wHjHkR?Fs-iWH{E4VZjTif61y@2f=|D=TB*-uLKN_h2&+usfej%VVXMsm#F$0615(qP{dUSUZP;h~#i(`m| z|J#Y)e1{cyTzC}|n0}u5s~`O;YKqlOmsg9r?XuTo98=;`EUJ@YW!`DJiu&KFcFM3R8v6=!~+b3)y;%GjJ#kG12GU4T@^(~TgSld>7E0+ z8H1*3s(VJE?J*EvQvCI*yI#Nd*I%zwr{;Ed4phc*J%_34Er05s&7sOs0ELgNJV~u> zao3ve@t+-=O_9LFfyy`|g;nG-MH;?CX{g*6kD8kSLVkd=%qH2NbggZX%M@w)b@CYl z9hZj6J=paeg$H5c@%M-1GX?+?AFfaoW)Fto%dfsYPf?gOe209-VB*7-!~vwOR+WM< zX!s6AVN&;O0Dpx6m6>vOL!Rp~nAp3WHI`|XSm(q*I8gWO9uCNWio(QdRmo?1{k68Gf=OcH zP~~W-rn1KJoI{rb(94m;Isk-fs@FKm0hyVBa^T+A8GogC{WuV<`Criisd##gOl0INAHHHzcf@%v^hj{V5)jcIr?!x-UZUHum5K)HTB?5 z$FaLd$}qd%3lgO2c>9TG~U?uTypBskN=&;tk98r2uX| zKivU1xb956V|f4DtWq@j#WK|r-~KeAE+QT4_NOHfTb687U(_!HuIKQ(49SLMg|UW$ zFiW_=T&0ua6pQL*uXJqocGz^auZ+rOrLx-*LUVVmJ_s%@=me cCHg)832zx2(%&$!n*aa+07*qoM6N<$f@sI0{{R30 delta 347 zcmcb|_L^yeWIZzj1B1(wu46!ou{g-xiDBJ2nU_EgOS+@4BLl<6e(pbstU$h5fKP~P zqt1?9t!EESyjZHd>f61y@2f=|D=TB*-uLKN_h2&+usfej%VVXMsm#F$0615(qP{dUSUZP;h~#i(`m| z|J#Y)e1{cyTzC}|n0}u5s~`O;YKqlOmsg9r?XuTo98=;`EUJ@YW!`D%cA8Gi-<0047(dh`GQ0}V+;K~z|U<(EHf6G;@te={D8z5cT}fT1Bk zg=nEhobFD7f+}fAfskmBsA;L7MxsGN6i`!91PKr!l-J&&h!g)JAOsL(?cKFtvqQ0- z@$P0pIBN>TYsTNa@$Q@VeSYs*ET6xt-PtK(KcYA95eEWyrhf%sac8c>`s#rGVz9x# z=hEMT5~keQDJs)VR9(^ZBP!h*mFXrTht+{?z)Hs70=QJ>^&r<*2Z*{thY_NoNaISk zwgJa}Wbq_S1^F=bTmyr33lyPuXF%1`T(+_(0+t;G;xqn zYA|3kqqZkss(*BAXg{*JjH%9CC&RI5D7GBjhNvr>i8PiCWzQRb8IyUAb&6w?nKVwH zpMwF*q{N?P>IvgL?03jPpboY4HVV> zbRB?|(gDak=iloMd4Hu_D;+?l4)o@|;dZeGOfNA0(fME4#O;N7-S3_e+01UzqfLguIAPntltX8jQ&ZYMNp8o%2Qvrx~*B@xrtpf1*`2c|GzS~{+LeNpYt*98_wbwE0jIEcs2fa=}xaEFy{GzCNK zM|KMC%qcq+Lx4Lw^gjyhg9b~HouP|Q zo9dw*=rE#nJVN^sTaWBUhmpOx@f&RX?hJ4-c~I@Z<^odw!=9~Z=EnWSry16ktiS9N`;pB+k>3m?)jbmF$W3K|7w7KjGHd=hf61y@2f=|D=TB*-uLKN_h2&+usfej%VVXMsm#F$0615(qP{dUSUZP;h~#i(`m| z|J#Y)e1{cyTzC}|n0}u5s~`O;YKqlOmsg9r?XuTo98=;`EUJ@YW!`DWB>pF diff --git a/src/main/resources/assets/create/textures/block/display_cloth/orange.png b/src/main/resources/assets/create/textures/block/display_cloth/orange.png index 922327a8acc30b6f4667000fc2420496e7bff2e0..2c0935cd68b453075384569a1bb99b94b5d7add2 100644 GIT binary patch delta 818 zcmV-21I_&F0=@>28Gi-<0047(dh`GQ0|iM$K~z|U<(E%LR8bVhfA`JfJ%{-xCe6kO zGJ;kvW@kk~5G{ge)kZ=P+PZ2Tu3NPY+?0y~A%wsb0>f%&5NV-i1e!IA%$fIwao*_M z7Vph{f1Jeejf?1PuHQX(-aYr6?|%0vww~RTMqwCPv#BpmB7bWojKT##z>LK54dUeG7-eWO#ADN6fhAh04-W$H@zPAG84oh&UC=^`pR_6 znm22#((K_NCpy9bSu5@5fESQ3b2O|C7f1ZkD*D03Fx@DOglej4tnPV$1JHsaF?GQG zs9)0%Cn6kZW~Q?`uri|*uN4QPH9sC5@Dwk^0q>rxnt#`9?)4}}|ck=&*G z0$}^qJqgf#^+9_j(0a}UwEb;F2WG?C&umy1)@J>a7-{4YWosf=82oBZDQx+Q~x0f;Gi9~ z1iF6uqB>E_4Ag86%22Z*(R$Azj5ILUb`bn}d_~3?qu*)AG(f%UiQe;}@o)3dQGKif w{VT!$XX5wsAt@b8F&t=%%_r{6#rpUB5A>?`E9YGFdjJ3c07*qoM6N<$f}kgoM*si- delta 347 zcmdnT_L^yeWIZzj1B1(wu46!ou{g-xiDBJ2nU_EgOS+@4BLl<6e(pbstU$h5fKP~P zqt1?9t!EESyjZHd>f61y@2f=|D=TB*-uLKN_h2&+usfej%VVXMsm#F$0615(qP{dUSUZP;h~#i(`m| z|J#Y)e1{cyTzC}|n0}u5s~`O;YKqlOmsg9r?XuTo98=;`EUJ@YW!`Dade91s&5h7CtzFC9KdrC zo5zYr%2}~}(%1ouQ4Ed^Q3AFFar$MNLlzm@w&I?v?3y=#Bl|rw$F7C!%&Q!ykubPp z=j+|(DzK(<9DgM_Pa|XS;`$lD5&J=P&UKF4w#kc{n284BWLg6{w6+DKSn;wwjB<@M zfFoBrW=?gE3+Fu3090zE2`s?OX)(uT4QNr$Rs+MV;#F#(obxNG18K!Ga;(p}=94(L zUs)Zf(m=WP7wbUd?aOtbe9p_gp=|fu#txWuV0VyuMSryhbT82Mbp1aK@oM9ZJPS^< zi3NW#doIsct$V!wPyjrC`9cCbd-Al_1;yFkf631l1jE4if#$(5 z;5<0X=6@X=)!8?9U~BUm0HZJjpzV2#!Y~^(+MZ{uE6xGzec!p117iH;vy`ctMKA(D z`t85tVShyH&Rqd8{`64-wC=6dOM&!T)&0Jz_Jdg$4u|=hTpOaeb_5);Hvq>*6mG@z zdy1#GVEQ&f---cNyUKo0(8qC@-==Cn6@V~OMFv!P4I}j&r!9Drw&XZ(SlRl9aOACJ zlIx4AvfW;WC?UDIq#uZBz&6+l~zrDRFCo3a4A%1z`?gxjj_J%G@ zm6-z6y6fh#bRZ>E666>B9}U$1XLz)KzYtKGv%n*=n1Ml034|F}J-RyyD7e7W#WBRf z|LsI?zQYPUF1(5fOh3>3)sKD^HO1q#d fXX9)B#r1)Kfm^4NQTALY(6J1ju6{1-oD!M<*~XeD diff --git a/src/main/resources/assets/create/textures/block/display_cloth/purple.png b/src/main/resources/assets/create/textures/block/display_cloth/purple.png index 922327a8acc30b6f4667000fc2420496e7bff2e0..5360298367953416e62096c6effeefdd67361da5 100644 GIT binary patch delta 852 zcmV-a1FQV&0^kOa8Gi-<0047(dh`GQ11CvDK~z|U<(JQE6HySyKiO=SCU28g&`{As z3t9zxsFz$sy$bfM7Sw~5f_MK6&$ftyikEthP*3#-UV5>YDz;(-e}z!cCV5TR%?}To z_p-Z*V!H7l&gJ#{X7YC4%=gVqWBD7e+S7AMoJxbuyvwd^GJkV%1VH25yp1e66jqx( z`q{-(F(QaLJ(pzch>c~NxUz&8?~k)HCJ@xaHY`T@JQ%X*VA&>4wLwA{_^}wbdazSz zXgmxtKd&`Oh;0DYm+PcNya#(Xw^+MdB_-mxvP41{tS{FiJ7DaTnpkNQSGGurIJ>e5 zpfR8$Gn)0V7=O2LWlQ5IV&>-UK#mh4LH6VrmTl@t__38XwS7Wt!>woz7~vedvZb+# zj34{$haqNRwU+~4B)lAZVeVo-Cx*g-UD?ZlgfIX|i8wnY4~O-#=xB~a5p(9^NFb+H zI`q!za-uIsqSgT*kW+t-!yHhN88QdlPQ|nOav+@ZzkgB(RK@e>SiN(Fok~ON|5_dB zDB>DfFt)1 zfvqPlR=Vn&itFU&!KpMlQ?NrWUDZ=D)R><0^nV|pHT6NI4fHfMh#1gmKxq?z(QF)9 zbO7(bl!)V0yrQH&;J1$|=F#&B4xiqSQ*AIc+rX7ACeLMYsttW}rB_(#Ph0|Sdk1At z0L08AMZVG96o(8q(7+j zYE2*+n}DnsJOThbzWSmaWeuM*h!}wG>jx%+>#z31tCC^N2mhbMp5A=bc4e3GFc_OJ eJUkQW-}9f%eJgW?N3+=g0000f61y@2f=|D=TB*-uLKN_h2&+usfej%VVXMsm#F$0615(qP{dUSUZP;h~#i(`m| z|J#Y)e1{cyTzC}|n0}u5s~`O;YKqlOmsg9r?XuTo98=;`EUJ@YW!`Dc#p4 z75o9>wX}jD6e{%(=t&BmJt>0HLT}Pms)Dts^`LmrlRs)T2pXCcy`-6hEo>kj;!Jlp z8;fo{h~LZPJ8zhM^WK~9ytF($ce0uu>Zc+lnel17LYbYzeSZL&caIF>=JI@*nya%P zntaeg3>fL5eyr^~Foc6AOC&qmBYA7jUVwldfXN4OzE8r<v@rsn%{?~LM zss_T^@7DpKxjGQO=i#>@Y)^Ky$ND&gbRaW6tqoB%pxy#y_pkqF(Q^OU!)mE0^@QyR z{X0A#weHlx6S^U}IdQ9cvF}1d9tGpmyF~yj$Hr-O$YqysTGvFVxDveYiWgUkl#3-j zf92|Eb$>aV53CLINCy_*F95LWx&UlQCRue|Jt}NSCIjpIa{!++p8^}7zc5e@&qX?L zX={pPXIt%5A2I+q`*#OtB%iQ?6(dCX>O2!)Sh7LICE}ynP3F*L0K>J}P zpbN|QX4XC7dN4BM)1-w6bj95xgH)u{U2yk^(0^Sqfa;2dEY@ zYs+TbT&;M#LK!n<)nr)Mx?S_Hj|-z~;4GVZ4^xpvx(3eT$r5d+&rp#?eR5@2T-nn@ z{rWlXJif2CGsS~TvDxSH0ckQ9_aX*%3U;dIebfEp{0ezyC*RKK* zC`*4_q#~t`K$Jah1ORw+q_-Mp4Da(hNC5g>-?(dAU~DuW9u=C=AN+r4`IEf)aqRJY ctiR_!0Mlp|vBxP;g8%>k07*qoM6N<$g09$}j{pDw delta 573 zcmV-D0>b_12GsbR2(17B02y>eSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2! zfese{00E;(L_t(o!|j&4OT$nU#($9vy_jA>tb#fyMMQLT7k@VgCqQTlQ*+`1yA|M z8n58;3V>p%v=JdF+O}t1M1-h{tMmcfUgv5%z-XhOD}OlxKyLd0fUe|(k5|60j$bQn zG{`#uo2mzB?(Cqsr44|WrY7{Lp~PLZwzdCm7i4$$|M?{Bo*4V$OUr6=Ak!Onq!3tm}H+O1tAU;3iWt2ZYAy$#$Pk7J@0Fdd8J3*{}A0-h2$kITm)w=NW z5Pt%i+crM6LbdJu_yqm%j}#hDmQw%#01jnXNoGw=04e|g00;m8000000Mb*F00000 LNkvXXu0mjfO7ihw diff --git a/src/main/resources/assets/create/textures/block/display_cloth/white.png b/src/main/resources/assets/create/textures/block/display_cloth/white.png index 922327a8acc30b6f4667000fc2420496e7bff2e0..33b21e69df6642c2db94c326942759819109546b 100644 GIT binary patch delta 741 zcmVzz&H+A+h5KEZA}gKv57#gtsDDo;bGW)x~0FdZxz?!X9UV_!n;fUFDwcs+zyc zY8ii)U~mFr$dW0d3c~OdpyAOOVlwhHUb7D;_Z2Ct*;W}93h_QSh@QZAYQXT+ldW8~ijYE0zH2H-RuZ)cHNYks{8_TrvP zr~<%pz(z(B*v*I(miK`lMrUr0m4^;SD5Y&A9ImwWukC%H*K#gJljAxvZQk60oqw9xM-7N7)@q>MkP;6=R@OkrE+(^^=>tCuPu-l_95?TIT?4SWM*2XP zi#9oRa@?r_8=3vqz|1P%rW)wx{7!VhDqcIs)q8GhLQG@7D;?NW1AbTgTRN~0=(U{x z;ci&7>peuEtpiyywT6u~P~8Q!z3uCK60!VIt3P5yl zZ@Uy|FMqPyUZitJ2l8a*Xn&r}oSraGX3a?|@!A%CmQD$jcDrKEKupsGtEMXksJrMq zYwDxO7q*+)1{%r>h)U@+r7Q!b>`EoWs@1Nw{QJTW!ehK}jEEtKju9#Fqa#F&J$Y@f zd2J6ku?uC7rxed0RQHP5nXa}l+88(zDn!1sc&J(0;4P6SN80x>oM8|@Xe z7wz7lEUrIEpRv2nHqhlqd8=tPaL3!`J7cq0|J(8ZgIZmG5fRh8^RQJlj}9O7`g{Hx X%ghn%r*h;t00000NkvXXu0mjfDbH*X delta 347 zcmeyw`kHBiWIZzj1B1(wu46!ou{g-xiDBJ2nU_EgOS+@4BLl<6e(pbstU$h5fKP~P zqt1?9t!EESyjZHd>f61y@2f=|D=TB*-uLKN_h2&+usfej%VVXMsm#F$0615(qP{dUSUZP;h~#i(`m| z|J#Y)e1{cyTzC}|n0}u5s~`O;YKqlOmsg9r?XuTo98=;`EUJ@YW!`DIdrQ`dw;dd zp1-*yNB~=AYiwD zy+g}Qc6)!dcg{OGHevU9 zxF!Zt1Iq2H0pB4Z9dv8ktAUtZx5~zuB(UwmOf;u{j?Fy}YQS?UULy&00Epx?lH*tn z_>mcC4XFJ!qj)`QAeQrU(E(raB028db5j$l9@x)I2Y-6iK$rH1bil&^bs&Dv<8MQk zJvEwWbBO7H+Fdq=o;A>U3w(Qc{XYxwdi{;Axm7cfbB4{|@%disrY7$SfQ9GJG{EeG zhkZ3D_U7jz09hx8lXuuDZR6wvg>x%z6Tm8Gn5YrPGmh;W>bOT?z?pc` zUkXI#iqZCVOa~NE?N>x~LH%40P9k$?RXcX0V;xX?ugtv;cfqK7&;^IOVgNc_bo=0~ z`B1z1$#hfwz=F^N1fKl1$^ac1b^=lI+qKa8q<;{#(hF_nZ+R!GZJ<>Hd2!O?&2Q*d z`9z*8ObLK$ab5$aCQb`m9jqBe^H1!D+UIKbW$2*_co=6*fo+Z42~N}_0;oDCMaXYR zMCKZn%mFKXJHhYw_jHmm{+)hc0p?w|GS?&Har5!f#~}KH{|}<_aaNOfz0000f61y@2f=|D=TB*-uLKN_h2&+usfej%VVXMsm#F$0615(qP{dUSUZP;h~#i(`m| z|J#Y)e1{cyTzC}|n0}u5s~`O;YKqlOmsg9r?XuTo98=;`EUJ@YW!`D1vC;wp+Ic#=s$2XPXY&VrMOzd#C34*r1- z4xQXx>pu{>c9VLG6o=wa#6gG`IC@a%Z3@OI;fm7c`cC14CwaaviJ(GSjk;*bgzw$Ea8Wpkhgu xkAq-8gX^<>TU%fC#ZY+a7S4}q{;P(<0KYuTy)8e3C0PIf002ovPDHLkV1lt{>3;!vYwfNfk8u;KNv_c76-XIF|0c$^AgBmNq6*hWMJ6X&;2Kn704F~@Ck8k zNwU7Qs^R_d*+FKaJ0>Ipg*SpF2XskIMF;2#5Dz*E;z|rF0004UNklEQ-Z> zIhzq@l@J@2Reu4cuDA^V;&?DIz|8C7XHCnE2IMpyioyW^^9$KO4jjq=KrpAJ%6MhD z+?_XgsZ<1GAGq!Iu(f|W3Ng()o{QsB06?|YkUNm^5@MrVUWey-!qvC~-)E@S8VbE` zaaG2f({wRxn2XFozyF%7ah4v)^!WUeAf$O^xyTU0fKMhpNb|~aks&ygB|S*<%5rHp z>wKeP!S|UM_!$mn@4;~I;|hW>32|Bvrin#yGC@4T&5LwR|jZ-Y~GuV^OG>l<@*+27{-opUXO@geCw`UqNjE From 7ef487fa46dfde637e17da7ae40dd11b58a972e4 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 1 Nov 2024 16:11:27 +0100 Subject: [PATCH 102/515] Total Recull - Set cullfaces to correct sides; made model implementation less brittle (?) --- .../displayCloth/DisplayClothModel.java | 50 +++++++++++-------- .../models/block/display_cloth/block.json | 38 +++++++------- .../models/block/display_cloth/item.json | 2 +- 3 files changed, 48 insertions(+), 42 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothModel.java b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothModel.java index a0b68285b9..1f59080804 100644 --- a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothModel.java +++ b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothModel.java @@ -44,7 +44,7 @@ public class DisplayClothModel extends BakedModelWrapperWithData { public static void reload() { CORNERS.clear(); } - + @Override public boolean useAmbientOcclusion() { return false; @@ -52,34 +52,40 @@ public class DisplayClothModel extends BakedModelWrapperWithData { private List getCorner(DisplayClothBlock block, int corner, @NotNull RandomSource rand, @Nullable RenderType renderType) { - - List> corners = CORNERS.computeIfAbsent(block, b -> { + if (!CORNERS.containsKey(block)) { TextureAtlasSprite targetSprite = getParticleIcon(ModelData.EMPTY); List> list = new ArrayList<>(); for (PartialModel pm : List.of(AllPartialModels.DISPLAY_CLOTH_SW, AllPartialModels.DISPLAY_CLOTH_NW, - AllPartialModels.DISPLAY_CLOTH_NE, AllPartialModels.DISPLAY_CLOTH_SE)) { - List quads = new ArrayList<>(); + AllPartialModels.DISPLAY_CLOTH_NE, AllPartialModels.DISPLAY_CLOTH_SE)) + list.add(getCornerQuads(rand, renderType, targetSprite, pm)); - for (BakedQuad quad : pm.get() - .getQuads(null, null, rand, ModelData.EMPTY, renderType)) { - TextureAtlasSprite original = quad.getSprite(); - BakedQuad newQuad = BakedQuadHelper.clone(quad); - int[] vertexData = newQuad.getVertices(); - for (int vertex = 0; vertex < 4; vertex++) { - BakedQuadHelper.setU(vertexData, vertex, targetSprite.getU( - SpriteShiftEntry.getUnInterpolatedU(original, BakedQuadHelper.getU(vertexData, vertex)))); - BakedQuadHelper.setV(vertexData, vertex, targetSprite.getV( - SpriteShiftEntry.getUnInterpolatedV(original, BakedQuadHelper.getV(vertexData, vertex)))); - } - quads.add(newQuad); - } - list.add(quads); + CORNERS.put(block, list); + } + + return CORNERS.get(block) + .get(corner); + } + + private List getCornerQuads(RandomSource rand, RenderType renderType, TextureAtlasSprite targetSprite, + PartialModel pm) { + List quads = new ArrayList<>(); + + for (BakedQuad quad : pm.get() + .getQuads(null, null, rand, ModelData.EMPTY, renderType)) { + TextureAtlasSprite original = quad.getSprite(); + BakedQuad newQuad = BakedQuadHelper.clone(quad); + int[] vertexData = newQuad.getVertices(); + for (int vertex = 0; vertex < 4; vertex++) { + BakedQuadHelper.setU(vertexData, vertex, targetSprite + .getU(SpriteShiftEntry.getUnInterpolatedU(original, BakedQuadHelper.getU(vertexData, vertex)))); + BakedQuadHelper.setV(vertexData, vertex, targetSprite + .getV(SpriteShiftEntry.getUnInterpolatedV(original, BakedQuadHelper.getV(vertexData, vertex)))); } - return list; - }); + quads.add(newQuad); + } - return corners.get(corner); + return quads; } @Override diff --git a/src/main/resources/assets/create/models/block/display_cloth/block.json b/src/main/resources/assets/create/models/block/display_cloth/block.json index 0106218c04..defda713c4 100644 --- a/src/main/resources/assets/create/models/block/display_cloth/block.json +++ b/src/main/resources/assets/create/models/block/display_cloth/block.json @@ -3,7 +3,7 @@ "parent": "block/block", "textures": { "0": "create:block/display_cloth/red", - "particle": "create:block/display_cloth/red" + "particle": "#0" }, "elements": [ { @@ -43,11 +43,11 @@ "to": [16, 1, 0.1], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [0, 9, 8, 14.5], "texture": "#0", "cullface": "west"}, - "east": {"uv": [11.45, 9, 12, 14.5], "texture": "#0", "cullface": "west"}, - "south": {"uv": [0, 9, 8, 14.5], "texture": "#0", "cullface": "west"}, - "west": {"uv": [12, 9, 11.45, 14.5], "texture": "#0", "cullface": "west"}, - "up": {"uv": [0, 8.45, 8, 9], "rotation": 180, "texture": "#0", "cullface": "west"} + "north": {"uv": [0, 9, 8, 14.5], "texture": "#0", "cullface": "north"}, + "east": {"uv": [11.45, 9, 12, 14.5], "texture": "#0", "cullface": "north"}, + "south": {"uv": [0, 9, 8, 14.5], "texture": "#0", "cullface": "north"}, + "west": {"uv": [12, 9, 11.45, 14.5], "texture": "#0", "cullface": "north"}, + "up": {"uv": [0, 8.45, 8, 9], "rotation": 180, "texture": "#0", "cullface": "north"} } }, { @@ -55,7 +55,7 @@ "to": [16, -8, 0.1], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "down": {"uv": [0, 15.5, 8, 16], "texture": "#0", "cullface": "west"} + "down": {"uv": [0, 15.5, 8, 16], "texture": "#0", "cullface": "north"} } }, { @@ -63,11 +63,11 @@ "to": [17, 1, 16], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [12, 9, 11.45, 14.5], "texture": "#0", "cullface": "west"}, - "east": {"uv": [0, 9, 8, 14.5], "texture": "#0", "cullface": "west"}, - "south": {"uv": [11.45, 9, 12, 14.5], "texture": "#0", "cullface": "west"}, - "west": {"uv": [0, 9, 8, 14.5], "texture": "#0", "cullface": "west"}, - "up": {"uv": [0, 8.45, 8, 9], "rotation": 270, "texture": "#0", "cullface": "west"} + "north": {"uv": [12, 9, 11.45, 14.5], "texture": "#0", "cullface": "east"}, + "east": {"uv": [0, 9, 8, 14.5], "texture": "#0", "cullface": "east"}, + "south": {"uv": [11.45, 9, 12, 14.5], "texture": "#0", "cullface": "east"}, + "west": {"uv": [0, 9, 8, 14.5], "texture": "#0", "cullface": "east"}, + "up": {"uv": [0, 8.45, 8, 9], "rotation": 270, "texture": "#0", "cullface": "east"} } }, { @@ -75,7 +75,7 @@ "to": [17, -8, 16], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "down": {"uv": [0, 15.5, 8, 16], "rotation": 270, "texture": "#0", "cullface": "west"} + "down": {"uv": [0, 15.5, 8, 16], "rotation": 270, "texture": "#0", "cullface": "east"} } }, { @@ -83,11 +83,11 @@ "to": [16, 1, 17], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [0, 9, 8, 14.5], "texture": "#0", "cullface": "west"}, - "east": {"uv": [12, 9, 11.45, 14.5], "texture": "#0", "cullface": "west"}, - "south": {"uv": [0, 9, 8, 14.5], "texture": "#0", "cullface": "west"}, - "west": {"uv": [11.45, 9, 12, 14.5], "texture": "#0", "cullface": "west"}, - "up": {"uv": [0, 8.45, 8, 9], "texture": "#0", "cullface": "west"} + "north": {"uv": [0, 9, 8, 14.5], "texture": "#0", "cullface": "south"}, + "east": {"uv": [12, 9, 11.45, 14.5], "texture": "#0", "cullface": "south"}, + "south": {"uv": [0, 9, 8, 14.5], "texture": "#0", "cullface": "south"}, + "west": {"uv": [11.45, 9, 12, 14.5], "texture": "#0", "cullface": "south"}, + "up": {"uv": [0, 8.45, 8, 9], "texture": "#0", "cullface": "south"} } }, { @@ -95,7 +95,7 @@ "to": [16, -8, 17], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "down": {"uv": [0, 15.5, 8, 16], "rotation": 180, "texture": "#0", "cullface": "west"} + "down": {"uv": [0, 15.5, 8, 16], "rotation": 180, "texture": "#0", "cullface": "south"} } } ], diff --git a/src/main/resources/assets/create/models/block/display_cloth/item.json b/src/main/resources/assets/create/models/block/display_cloth/item.json index df75a26388..f39e64867a 100644 --- a/src/main/resources/assets/create/models/block/display_cloth/item.json +++ b/src/main/resources/assets/create/models/block/display_cloth/item.json @@ -3,7 +3,7 @@ "parent": "block/block", "textures": { "0": "create:block/display_cloth/red", - "particle": "create:block/display_cloth/red" + "particle": "#0" }, "elements": [ { From 2fc209446dd2becbe4f9ad8c5e754a159e88e00b Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 1 Nov 2024 16:59:09 +0100 Subject: [PATCH 103/515] Locked Stocks - Added the option to prevent other users from connecting links / ordering items from your network --- .../java/com/simibubi/create/AllPackets.java | 4 ++ .../factoryBoard/FactoryPanelBehaviour.java | 7 +++ .../packagePort/postbox/PostboxBlock.java | 1 + .../packagerLink/GlobalLogisticsManager.java | 46 +++++++++++---- .../LogisticallyLinkedBehaviour.java | 39 ++++++++++--- .../LogisticallyLinkedBlockItem.java | 2 + .../packagerLink/LogisticsNetwork.java | 50 ++++++++++++++-- .../packagerLink/PackagerLinkBlock.java | 14 +++++ .../packagerLink/PackagerLinkBlockEntity.java | 17 ++++++ .../RedstoneRequesterBlockEntity.java | 2 + .../stockTicker/StockKeeperLockPacket.java | 48 ++++++++++++++++ .../StockKeeperOpenRequestScreenPacket.java | 54 ++++++++++++++++++ .../stockTicker/StockTickerBlock.java | 2 + .../stockTicker/StockTickerBlockEntity.java | 7 +++ .../StockTickerInteractionHandler.java | 46 +++++++++------ .../stockTicker/StockTickerRequestScreen.java | 46 ++++++++++++++- .../create/foundation/gui/AllGuiTextures.java | 2 + .../create/textures/gui/stock_keeper.png | Bin 1482 -> 1645 bytes 18 files changed, 343 insertions(+), 44 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperLockPacket.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperOpenRequestScreenPacket.java diff --git a/src/main/java/com/simibubi/create/AllPackets.java b/src/main/java/com/simibubi/create/AllPackets.java index 9c2d1cccf0..182b1c0e79 100644 --- a/src/main/java/com/simibubi/create/AllPackets.java +++ b/src/main/java/com/simibubi/create/AllPackets.java @@ -74,6 +74,8 @@ import com.simibubi.create.content.logistics.stockTicker.LogisticalStockResponse import com.simibubi.create.content.logistics.stockTicker.PackageOrderRequestPacket; import com.simibubi.create.content.logistics.stockTicker.StockKeeperCategoryEditPacket; import com.simibubi.create.content.logistics.stockTicker.StockKeeperCategoryRefundPacket; +import com.simibubi.create.content.logistics.stockTicker.StockKeeperLockPacket; +import com.simibubi.create.content.logistics.stockTicker.StockKeeperOpenRequestScreenPacket; import com.simibubi.create.content.logistics.tunnel.TunnelFlapPacket; import com.simibubi.create.content.redstone.displayLink.DisplayLinkConfigurationPacket; import com.simibubi.create.content.redstone.link.controller.LinkedControllerBindPacket; @@ -199,6 +201,7 @@ public enum AllPackets { CONFIGURE_REDSTONE_REQUESTER(RedstoneRequesterConfigurationPacket.class, RedstoneRequesterConfigurationPacket::new, PLAY_TO_SERVER), CONFIGURE_STOCK_KEEPER_CATEGORIES(StockKeeperCategoryEditPacket.class, StockKeeperCategoryEditPacket::new, PLAY_TO_SERVER), REFUND_STOCK_KEEPER_CATEGORY(StockKeeperCategoryRefundPacket.class, StockKeeperCategoryRefundPacket::new, PLAY_TO_SERVER), + LOCK_STOCK_KEEPER(StockKeeperLockPacket.class, StockKeeperLockPacket::new, PLAY_TO_SERVER), // Server to Client SYMMETRY_EFFECT(SymmetryEffectPacket.class, SymmetryEffectPacket::new, PLAY_TO_CLIENT), @@ -249,6 +252,7 @@ public enum AllPackets { LOGISTICS_STOCK_RESPONSE(LogisticalStockResponsePacket.class, LogisticalStockResponsePacket::new, PLAY_TO_CLIENT), FACTORY_PANEL_EFFECT(FactoryPanelEffectPacket.class, FactoryPanelEffectPacket::new, PLAY_TO_CLIENT), KNOCKBACK(KnockbackPacket.class, KnockbackPacket::new, PLAY_TO_CLIENT), + STOCK_KEEPER_OPEN_GUI(StockKeeperOpenRequestScreenPacket.class, StockKeeperOpenRequestScreenPacket::new, PLAY_TO_CLIENT), TRAIN_MAP_SYNC(TrainMapSyncPacket.class, TrainMapSyncPacket::new, PLAY_TO_CLIENT); static { diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java index 825fc78cab..d5043e0ef9 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java @@ -301,6 +301,13 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { @Override public void onShortInteract(Player player, InteractionHand hand, Direction side, BlockHitResult hitResult) { + if (!Create.LOGISTICS.mayInteract(network, player)) { + player.displayClientMessage(CreateLang.temporaryText("Logistics Network is Protected") + .style(ChatFormatting.RED) + .component(), true); + return; + } + if (AllItemTags.WRENCH.matches(player.getItemInHand(hand))) { int sharedMode = -1; for (FactoryPanelPosition target : targeting) { diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/postbox/PostboxBlock.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/postbox/PostboxBlock.java index 303150108b..baa0dc05ed 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/postbox/PostboxBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/postbox/PostboxBlock.java @@ -33,6 +33,7 @@ public class PostboxBlock extends HorizontalDirectionalBlock implements IBE new LogisticsNetwork(networkId)).totalLinks++; + public boolean mayInteract(UUID networkId, Player player) { + LogisticsNetwork network = logisticsNetworks.get(networkId); + return network == null || network.owner == null || !network.locked || network.owner.equals(player.getUUID()); + } + + public boolean mayAdministrate(UUID networkId, Player player) { + LogisticsNetwork network = logisticsNetworks.get(networkId); + return network == null || network.owner == null || network.owner.equals(player.getUUID()); + } + + public boolean isLockable(UUID networkId) { + LogisticsNetwork network = logisticsNetworks.get(networkId); + return network != null; + } + + public boolean isLocked(UUID networkId) { + LogisticsNetwork network = logisticsNetworks.get(networkId); + return network != null && network.locked; + } + + public void linkAdded(UUID networkId, GlobalPos pos, UUID ownedBy) { + LogisticsNetwork network = logisticsNetworks.computeIfAbsent(networkId, $ -> new LogisticsNetwork(networkId)); + network.totalLinks.add(pos); + if (ownedBy != null && network.owner == null) + network.owner = ownedBy; markDirty(); } - public void linkLoaded(UUID networkId) { - logisticsNetworks.computeIfAbsent(networkId, $ -> new LogisticsNetwork(networkId)).loadedLinks++; + public void linkLoaded(UUID networkId, GlobalPos pos) { + logisticsNetworks.computeIfAbsent(networkId, $ -> new LogisticsNetwork(networkId)).loadedLinks.add(pos); } - public void linkRemoved(UUID networkId) { + public void linkRemoved(UUID networkId, GlobalPos pos) { LogisticsNetwork logisticsNetwork = logisticsNetworks.get(networkId); if (logisticsNetwork == null) return; - logisticsNetwork.totalLinks--; - if (logisticsNetwork.totalLinks <= 0) + logisticsNetwork.totalLinks.remove(pos); + logisticsNetwork.loadedLinks.remove(pos); + if (logisticsNetwork.totalLinks.size() <= 0) logisticsNetworks.remove(networkId); markDirty(); } - public void linkInvalidated(UUID networkId) { + public void linkInvalidated(UUID networkId, GlobalPos pos) { LogisticsNetwork logisticsNetwork = logisticsNetworks.get(networkId); if (logisticsNetwork == null) return; - logisticsNetwork.loadedLinks--; + logisticsNetwork.loadedLinks.remove(pos); } public int getUnloadedLinkCount(UUID networkId) { LogisticsNetwork logisticsNetwork = logisticsNetworks.get(networkId); if (logisticsNetwork == null) return 0; - return logisticsNetwork.totalLinks - logisticsNetwork.loadedLinks; + return logisticsNetwork.totalLinks.size() - logisticsNetwork.loadedLinks.size(); } public RequestPromiseQueue getQueuedPromises(UUID networkId) { diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java index 12505b6d9a..e69d2e5381 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java @@ -24,9 +24,13 @@ import com.simibubi.create.content.logistics.stockTicker.PackageOrder; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BehaviourType; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; +import com.simibubi.create.foundation.utility.CreateLang; import net.createmod.catnip.utility.Pair; +import net.minecraft.ChatFormatting; +import net.minecraft.core.GlobalPos; import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraftforge.items.IItemHandler; @@ -107,8 +111,8 @@ public class LogisticallyLinkedBehaviour extends BlockEntityBehaviour { @Override public void unload() { - if (loadedGlobally && global) - Create.LOGISTICS.linkInvalidated(freqId); + if (loadedGlobally && global && getWorld() != null) + Create.LOGISTICS.linkInvalidated(freqId, getGlobalPos()); super.unload(); remove(this); } @@ -126,23 +130,27 @@ public class LogisticallyLinkedBehaviour extends BlockEntityBehaviour { if (!loadedGlobally && global) { loadedGlobally = true; - Create.LOGISTICS.linkLoaded(freqId); + Create.LOGISTICS.linkLoaded(freqId, getGlobalPos()); } if (!addedGlobally && global) { addedGlobally = true; blockEntity.setChanged(); - if (blockEntity instanceof PackagerLinkBlockEntity) - Create.LOGISTICS.linkAdded(freqId); + if (blockEntity instanceof PackagerLinkBlockEntity plbe) + Create.LOGISTICS.linkAdded(freqId, getGlobalPos(), plbe.placedBy); } } + private GlobalPos getGlobalPos() { + return GlobalPos.of(getWorld().dimension(), getPos()); + } + @Override public void destroy() { super.destroy(); - if (addedGlobally && global) - Create.LOGISTICS.linkRemoved(freqId); + if (addedGlobally && global && getWorld() != null) + Create.LOGISTICS.linkRemoved(freqId, getGlobalPos()); } public void redstonePowerChanged(int power) { @@ -175,6 +183,23 @@ public class LogisticallyLinkedBehaviour extends BlockEntityBehaviour { } // + + public boolean mayInteract(Player player) { + return Create.LOGISTICS.mayInteract(freqId, player); + } + + public boolean mayInteractMessage(Player player) { + boolean mayInteract = Create.LOGISTICS.mayInteract(freqId, player); + if (!mayInteract) + player.displayClientMessage(CreateLang.temporaryText("Logistics Network is protected") + .style(ChatFormatting.RED) + .component(), true); + return mayInteract; + } + + public boolean mayAdministrate(Player player) { + return Create.LOGISTICS.mayAdministrate(freqId, player); + } public static boolean isValidLink(LogisticallyLinkedBehaviour link) { return link != null && !link.blockEntity.isRemoved() && !link.blockEntity.isChunkUnloaded(); diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBlockItem.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBlockItem.java index 0b17b79817..d615a45935 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBlockItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBlockItem.java @@ -86,6 +86,8 @@ public class LogisticallyLinkedBlockItem extends BlockItem { if (link != null) { if (level.isClientSide) return InteractionResult.SUCCESS; + if (!link.mayInteractMessage(player)) + return InteractionResult.SUCCESS; CompoundTag stackTag = stack.getOrCreateTag(); CompoundTag teTag = new CompoundTag(); diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsNetwork.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsNetwork.java index 8aa46663aa..81cb81f36f 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsNetwork.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsNetwork.java @@ -1,37 +1,75 @@ package com.simibubi.create.content.logistics.packagerLink; +import java.util.HashSet; +import java.util.Set; import java.util.UUID; import com.simibubi.create.Create; +import net.createmod.catnip.utility.NBTHelper; +import net.minecraft.core.GlobalPos; +import net.minecraft.core.registries.Registries; import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.nbt.Tag; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.Level; public class LogisticsNetwork { public UUID id; public RequestPromiseQueue panelPromises; - public int totalLinks; - public int loadedLinks; + + public Set totalLinks; + public Set loadedLinks; + + public UUID owner; + public boolean locked; public LogisticsNetwork(UUID networkId) { id = networkId; panelPromises = new RequestPromiseQueue(Create.LOGISTICS::markDirty); - totalLinks = 0; - loadedLinks = 0; + totalLinks = new HashSet<>(); + loadedLinks = new HashSet<>(); + owner = null; + locked = false; } public CompoundTag write() { CompoundTag tag = new CompoundTag(); tag.putUUID("Id", id); tag.put("Promises", panelPromises.write()); - tag.putInt("Links", totalLinks); + + tag.put("Links", NBTHelper.writeCompoundList(totalLinks, p -> { + CompoundTag nbt = NbtUtils.writeBlockPos(p.pos()); + if (p.dimension() != Level.OVERWORLD) + nbt.putString("Dim", p.dimension() + .location() + .toString()); + return nbt; + })); + + if (owner != null) + tag.putUUID("Owner", owner); + + tag.putBoolean("Locked", locked); return tag; } public static LogisticsNetwork read(CompoundTag tag) { LogisticsNetwork network = new LogisticsNetwork(tag.getUUID("Id")); network.panelPromises = RequestPromiseQueue.read(tag.getCompound("Promises"), Create.LOGISTICS::markDirty); - network.totalLinks = tag.getInt("Links"); + + NBTHelper.iterateCompoundList(tag.getList("Links", Tag.TAG_COMPOUND), nbt -> { + network.totalLinks.add(GlobalPos.of(nbt.contains("Dim") + ? ResourceKey.create(Registries.DIMENSION, new ResourceLocation(nbt.getString("Dim"))) + : Level.OVERWORLD, NbtUtils.readBlockPos(nbt))); + }); + + network.owner = tag.contains("Owner") ? tag.getUUID("Owner") : null; + network.locked = tag.getBoolean("Locked"); + return network; } diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlock.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlock.java index d80f539a64..fbade84b13 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlock.java @@ -8,6 +8,9 @@ import com.simibubi.create.foundation.block.WrenchableDirectionalBlock; import net.createmod.catnip.utility.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; @@ -60,6 +63,17 @@ public class PackagerLinkBlock extends WrenchableDirectionalBlock implements IBE return power; } + @Override + public void setPlacedBy(Level pLevel, BlockPos pPos, BlockState pState, LivingEntity pPlacer, ItemStack pStack) { + super.setPlacedBy(pLevel, pPos, pState, pPlacer, pStack); + withBlockEntityDo(pLevel, pPos, plbe -> { + if (pPlacer instanceof Player player) { + plbe.placedBy = player.getUUID(); + plbe.notifyUpdate(); + } + }); + } + @Override public VoxelShape getShape(BlockState pState, BlockGetter pLevel, BlockPos pPos, CollisionContext pContext) { return AllShapes.DATA_GATHERER.get(pState.getValue(FACING)); diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java index ce4fd83f18..0eccf7dd17 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java @@ -1,6 +1,7 @@ package com.simibubi.create.content.logistics.packagerLink; import java.util.List; +import java.util.UUID; import javax.annotation.Nullable; @@ -16,6 +17,7 @@ import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour import net.createmod.catnip.utility.Pair; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; @@ -24,10 +26,12 @@ import net.minecraftforge.items.IItemHandler; public class PackagerLinkBlockEntity extends LinkWithBulbBlockEntity { public LogisticallyLinkedBehaviour behaviour; + public UUID placedBy; public PackagerLinkBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); setLazyTickRate(10); + placedBy = null; } public InventorySummary fetchSummaryFromPackager(@Nullable IItemHandler ignoredHandler) { @@ -64,6 +68,19 @@ public class PackagerLinkBlockEntity extends LinkWithBulbBlockEntity { PackagingRequest.create(stack, toWithdraw, address, linkIndex, finalLink, 0, orderId, orderContext)); } + @Override + protected void write(CompoundTag tag, boolean clientPacket) { + super.write(tag, clientPacket); + if (placedBy != null) + tag.putUUID("PlacedBy", placedBy); + } + + @Override + protected void read(CompoundTag tag, boolean clientPacket) { + super.read(tag, clientPacket); + placedBy = tag.contains("PlacedBy") ? tag.getUUID("PlacedBy") : null; + } + @Override public void addBehaviours(List behaviours) { behaviours.add(behaviour = new LogisticallyLinkedBehaviour(this, true)); diff --git a/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlockEntity.java index dfd6ddd875..f4190a894c 100644 --- a/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlockEntity.java @@ -95,6 +95,8 @@ public class RedstoneRequesterBlockEntity extends StockCheckingBlockEntity imple return InteractionResult.PASS; if (level.isClientSide) return InteractionResult.SUCCESS; + if (!behaviour.mayInteractMessage(player)) + return InteractionResult.SUCCESS; NetworkHooks.openScreen((ServerPlayer) player, this, worldPosition); return InteractionResult.SUCCESS; diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperLockPacket.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperLockPacket.java new file mode 100644 index 0000000000..7edc6a12d8 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperLockPacket.java @@ -0,0 +1,48 @@ +package com.simibubi.create.content.logistics.stockTicker; + +import com.simibubi.create.Create; +import com.simibubi.create.content.logistics.packagerLink.LogisticsNetwork; +import com.simibubi.create.foundation.networking.BlockEntityConfigurationPacket; + +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.level.ServerPlayer; + +public class StockKeeperLockPacket extends BlockEntityConfigurationPacket { + + private boolean lock; + + public StockKeeperLockPacket(BlockPos pos, boolean lock) { + super(pos); + this.lock = lock; + } + + public StockKeeperLockPacket(FriendlyByteBuf buffer) { + super(buffer); + } + + @Override + protected void writeSettings(FriendlyByteBuf buffer) { + buffer.writeBoolean(lock); + } + + @Override + protected void readSettings(FriendlyByteBuf buffer) { + lock = buffer.readBoolean(); + } + + @Override + protected void applySettings(StockTickerBlockEntity be) {} + + @Override + protected void applySettings(ServerPlayer player, StockTickerBlockEntity be) { + if (!be.behaviour.mayAdministrate(player)) + return; + LogisticsNetwork network = Create.LOGISTICS.logisticsNetworks.get(be.behaviour.freqId); + if (network != null) { + network.locked = lock; + Create.LOGISTICS.markDirty(); + } + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperOpenRequestScreenPacket.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperOpenRequestScreenPacket.java new file mode 100644 index 0000000000..4796f1dad7 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperOpenRequestScreenPacket.java @@ -0,0 +1,54 @@ +package com.simibubi.create.content.logistics.stockTicker; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllTags.AllItemTags; +import com.simibubi.create.foundation.networking.SimplePacketBase; + +import net.createmod.catnip.gui.ScreenOpener; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.network.NetworkEvent.Context; + +public class StockKeeperOpenRequestScreenPacket extends SimplePacketBase { + + private BlockPos pos; + private boolean isAdmin; + private boolean isLocked; + + public StockKeeperOpenRequestScreenPacket(BlockPos pos, boolean isAdmin, boolean isLocked) { + this.pos = pos; + this.isAdmin = isAdmin; + this.isLocked = isLocked; + } + + public StockKeeperOpenRequestScreenPacket(FriendlyByteBuf buffer) { + pos = buffer.readBlockPos(); + isAdmin = buffer.readBoolean(); + isLocked = buffer.readBoolean(); + } + + @Override + public void write(FriendlyByteBuf buffer) { + buffer.writeBlockPos(pos); + buffer.writeBoolean(isAdmin); + buffer.writeBoolean(isLocked); + } + + @Override + public boolean handle(Context context) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) + return true; + ItemStack mainHandItem = player.getMainHandItem(); + final boolean encodeMode = + AllItemTags.DISPLAY_CLOTHS.matches(mainHandItem) || AllBlocks.REDSTONE_REQUESTER.isIn(mainHandItem); + if (player.level() + .getBlockEntity(pos) instanceof StockTickerBlockEntity be) + ScreenOpener.open(new StockTickerRequestScreen(be, isAdmin, isLocked, encodeMode)); + return true; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlock.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlock.java index eebb6bf6e3..b99e9dfc17 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlock.java @@ -58,6 +58,8 @@ public class StockTickerBlock extends HorizontalDirectionalBlock implements IBE< return InteractionResult.PASS; return onBlockEntityUse(pLevel, pPos, stbe -> { + if (!stbe.behaviour.mayInteractMessage(pPlayer)) + return InteractionResult.SUCCESS; if (!stbe.receivedPayments.isEmpty()) { for (int i = 0; i < stbe.receivedPayments.getSlots(); i++) diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java index db0c9fb886..e43db62a3e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java @@ -23,6 +23,7 @@ import net.createmod.catnip.utility.Iterate; import net.createmod.catnip.utility.NBTHelper; import net.createmod.catnip.utility.lang.Components; import net.minecraft.ChatFormatting; +import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; @@ -37,6 +38,8 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.items.IItemHandler; @@ -177,9 +180,13 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity implements } @Override + @OnlyIn(Dist.CLIENT) public boolean addToTooltip(List tooltip, boolean isPlayerSneaking) { if (receivedPayments.isEmpty()) return false; + if (!behaviour.mayAdministrate(Minecraft.getInstance().player)) + return false; + CreateLang.temporaryText("Contains payments:") .style(ChatFormatting.WHITE) .forGoggles(tooltip); diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java index 210c653c1b..a31ec687bb 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java @@ -3,11 +3,11 @@ package com.simibubi.create.content.logistics.stockTicker; import java.util.ArrayList; import java.util.List; -import com.simibubi.create.AllBlocks; import com.simibubi.create.AllEntityTypes; import com.simibubi.create.AllItems; +import com.simibubi.create.AllPackets; import com.simibubi.create.AllSoundEvents; -import com.simibubi.create.AllTags.AllItemTags; +import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.actors.seat.SeatEntity; import com.simibubi.create.content.logistics.BigItemStack; import com.simibubi.create.content.logistics.displayCloth.ShoppingListItem; @@ -16,13 +16,12 @@ import com.simibubi.create.content.logistics.packager.InventorySummary; import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedBehaviour.RequestType; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.gui.ScreenOpener; import net.createmod.catnip.utility.Couple; import net.createmod.catnip.utility.Iterate; import net.minecraft.ChatFormatting; -import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.util.Mth; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; @@ -31,13 +30,11 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.event.entity.player.PlayerInteractEvent.EntityInteractSpecific; import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; import net.minecraftforge.items.ItemHandlerHelper; +import net.minecraftforge.network.PacketDistributor; @EventBusSubscriber public class StockTickerInteractionHandler { @@ -63,12 +60,31 @@ public class StockTickerInteractionHandler { return; } - final BlockPos posForUI = targetPos; - final boolean encodeMode = - AllItemTags.DISPLAY_CLOTHS.matches(mainHandItem) || AllBlocks.REDSTONE_REQUESTER.isIn(mainHandItem); - if (level.isClientSide()) - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> displayScreen(posForUI, encodeMode)); + return; + if (!(level.getBlockEntity(targetPos) instanceof StockTickerBlockEntity stbe)) + return; + + if (!stbe.behaviour.mayInteract(player)) { + player.displayClientMessage( + CreateLang.temporaryText("Logistics Network is protected. You can interact using a Shopping list.") + .style(ChatFormatting.RED) + .component(), + true); + return; + } + + if (player instanceof ServerPlayer sp) { + boolean showLockOption = + stbe.behaviour.mayAdministrate(player) && Create.LOGISTICS.isLockable(stbe.behaviour.freqId); + boolean isCurrentlyLocked = Create.LOGISTICS.isLocked(stbe.behaviour.freqId); + + AllPackets.getChannel() + .send(PacketDistributor.PLAYER.with(() -> sp), + new StockKeeperOpenRequestScreenPacket(targetPos, showLockOption, isCurrentlyLocked)); + stbe.getRecentSummary() + .divideAndSendTo(sp, targetPos); + } event.setCancellationResult(InteractionResult.SUCCESS); event.setCanceled(true); @@ -201,10 +217,4 @@ public class StockTickerInteractionHandler { return targetPos; } - @OnlyIn(Dist.CLIENT) - private static void displayScreen(BlockPos tickerPos, boolean encodeRequester) { - if (Minecraft.getInstance().level.getBlockEntity(tickerPos) instanceof StockTickerBlockEntity be) - ScreenOpener.open(new StockTickerRequestScreen(be, encodeRequester)); - } - } diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java index 269ae1dc1b..19602ddb3b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java @@ -35,6 +35,7 @@ import net.createmod.catnip.utility.Pair; import net.createmod.catnip.utility.animation.LerpedFloat; import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; import net.createmod.catnip.utility.theme.Color; +import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.EditBox; @@ -69,6 +70,8 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre int itemsX; int itemsY; int orderY; + int lockX; + int lockY; EditBox searchBox; EditBox addressBox; @@ -86,10 +89,16 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre boolean encodeRequester; // Redstone requesters - public StockTickerRequestScreen(StockTickerBlockEntity be, boolean encodeRequester) { + private boolean isAdmin; + private boolean isLocked; + + public StockTickerRequestScreen(StockTickerBlockEntity be, boolean isAdmin, boolean isLocked, + boolean encodeRequester) { super(be.getBlockState() .getBlock() .getName()); + this.isAdmin = isAdmin; + this.isLocked = isLocked; this.encodeRequester = encodeRequester; displayedItems = new ArrayList<>(); itemsToOrder = new ArrayList<>(); @@ -136,9 +145,11 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre int x = guiLeft; int y = guiTop; - itemsX = guiLeft + (windowWidth - cols * colWidth) / 2 + 1; - itemsY = guiTop + 35; + itemsX = x + (windowWidth - cols * colWidth) / 2 + 1; + itemsY = y + 35; orderY = y + windowHeight - 60; + lockX = x + 230; + lockY = y + 15; MutableComponent searchLabel = CreateLang.translateDirect("gui.stock_ticker.search_items"); searchBox = new EditBox(this.font, x + 81, y + 25, 110, 9, searchLabel); @@ -493,6 +504,28 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre 0x77000000); UIRenderHelper.swapAndBlitColor(UIRenderHelper.framebuffer, minecraft.getMainRenderTarget()); + + // Render lock option + if (isAdmin) { + (isLocked ? AllGuiTextures.STOCK_KEEPER_REQUEST_LOCKED : AllGuiTextures.STOCK_KEEPER_REQUEST_UNLOCKED) + .render(graphics, lockX, lockY); + if (mouseX > lockX && mouseX <= lockX + 15 && mouseY > lockY && mouseY <= lockY + 15) { + graphics.renderComponentTooltip(font, + List.of(CreateLang.temporaryText(isLocked ? "Network is locked" : "Network is open") + .component(), + CreateLang.temporaryText("Locking prevents other Players") + .style(ChatFormatting.GRAY) + .component(), + CreateLang.temporaryText("from ordering items directly") + .style(ChatFormatting.GRAY) + .component(), + CreateLang.temporaryText("Click to toggle") + .style(ChatFormatting.DARK_GRAY) + .style(ChatFormatting.ITALIC) + .component()), + mouseX, mouseY); + } + } } private void renderItemEntry(GuiGraphics graphics, float scale, BigItemStack entry, boolean isStackHovered, @@ -700,6 +733,13 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre boolean lmb = pButton == 0; boolean rmb = pButton == 1; + if (lmb && pMouseX > lockX && pMouseX <= lockX + 15 && pMouseY > lockY && pMouseY <= lockY + 15) { + isLocked = !isLocked; + AllPackets.getChannel() + .sendToServer(new StockKeeperLockPacket(blockEntity.getBlockPos(), isLocked)); + return true; + } + if (rmb && searchBox.isMouseOver(pMouseX, pMouseY)) { searchBox.setValue(""); refreshSearchResults(true); diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java index 0be129d723..603fd81507 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java @@ -166,6 +166,8 @@ public enum AllGuiTextures implements ScreenElement, TextureSheetSegment { STOCK_KEEPER_REQUEST_FOOTER("stock_keeper", 0, 44, 256, 74), STOCK_KEEPER_REQUEST_SEARCH("stock_keeper", 0, 137, 256, 15), STOCK_KEEPER_REQUEST_SAYS("stock_keeper", 4, 163, 8, 16), + STOCK_KEEPER_REQUEST_LOCKED("stock_keeper", 29, 163, 15, 15), + STOCK_KEEPER_REQUEST_UNLOCKED("stock_keeper", 45, 163, 15, 15), NUMBERS("widgets", 100, 20, 5, 8), STOCK_KEEPER_CATEGORY("stock_keeper_categories", 210, 190), diff --git a/src/main/resources/assets/create/textures/gui/stock_keeper.png b/src/main/resources/assets/create/textures/gui/stock_keeper.png index 6c8e0ef41245b7b6cd821444f4ae5f5db698af05..71382df3e38abf77f2f1ace3ad337f0db09a5448 100644 GIT binary patch delta 1461 zcmb7^TToMX5XS!}AtwX~1c;O*2x$NdYLOHINRcyfc7zq)rx&*45pb`<#agcsgxts^ z08Ewd3X1E=B>;d64A|nkTfA@j2WU?hmn;c$6~yd`a>~i0*D+RfIw60Jr-Q^(;2q}1 zf2kO>X*gACIePMC8G~CaDA`K1<{nTVG=oO}1+KA)P2}Yd2P=E^sZ97?H4n#&X z9Gno~+>y2@tjs(F#VI)!%eDg^f&rI-&ws6(uASCW3K^|&)4g-U^?^Pv=b}*?s5GVl z(-V!FKyOW^Vp@q23e)xTR8`x~qgX%uF@r_6uAZjymf6!wE=|I9re(&}U;|W^v$P#0 z@~};mKHvfPH%&a~Z%Xyt2lDNaCYbK8m+2)LdPVr~iGJ*Dzn-H|oR~oO7h4|s$Cq#E zE}u-4PCQ<+qB!zw%sqf}=S>%~EZI`C9g4(g!#QWs5Tj;`nMgee?XDLchgv7|;L|v# z3+zaAO2=NyCCi8ZTqq;7yCFrue?AOsKr$Sl(ZtMeOv;Qx57Hx1E9?a3duur`QhG7E z40b!eN}ew#g*vW`hS244PAJB;p!q{cu(EEua(q*FWf)5}7bjL!B>xES6?jx7Dw3nn z*++mok?SY)PkhU4=dvN>vKVl6(DXucT7cF)1rd z=(2R^9J2QKjdo2x5vf}$>euhKeZv=RT^83|ePJM3lE!l)ViM5OSr<_+8G5DJ=BcbY z0B=1Zu32L!8w-i$xT1|EZ7pIm#Z)!gtO+1G#qbibrsfyew;)Mn=D@6}XipY<% zxJ|snnILFT+psS9YDN&0(g1X3Geh61-I7wizU6R?fk6C)1v9ocwkAuDR6XVSGqHVv zjB@e}FG886FbFbU9D3-vUN!4%?RBIndlddMV1$gZy=WDpjjevFd5zno)u^4*h*q>B zTD)Un8kC^Dc;&DeZ(Z()@mIDjZTqzrebYYLY;T$b7q2M4f0}21eZ=URtr4e4f{`JI zFM+a1ClG6;XGg;voo;d_HC-y)%U;I0HYd$aPDVRmH|SXI@)OcZxEc1t zexadKRnqWhR62E>syf<_u;lDck=aaEAm-=uXNsT2^rBksi_M(0+yr-J$Yyu>r@MO5 z=HT|tBgok{q1m|fE{jvrc!bkf51TxypwfREWXbnOVY3eg6LX#>jwWUFY2FSon~tv7 wkmPm`E~mWzLZJY8-vR&2{QtdAM9Xa7e9uiG^L^L!PZtE>{da7s^y6jz1)cF|&;S4c delta 1300 zcmaFMbBcR{BV*1)r(Avp1_qzWDJy`KN=cAk@WhJ>_5c6>XNb_@u08X zKY3=Y@wqGCYwt8YPv4lk`~;iMlShwUtIZTpNSMWFZZ6c&8soumsg=c}f#rder!u3E z0%OF9R+f5&Sds19%_AS^DoAgb(CxkcwpeQ9xl@&gW_&#T=~JJF`q7%e`8V$>dA>_C z-tExQFe`EwlUP|J1LHHU?#NTT5i|JC9Fj^{H?e>@huw+g%KQIYq!X+Jln%rxzGR!h z_k%mZVLQVm&cC_~*j6xp%1k&v^8YJ6{F&iIn<$#%2HQHy;Rgko#WWJHMgk z+jrp!7yk*>FNi+i&G5H5!HunkH6{5#w1XboAJ&v42PPGu>t3oWcnY>ZY!{fI^7|pX zzyuRes2%s5-eB}sSY<)s+?4YHycHFHYAjb82QbU6e)VCKrN3atzQ327^;@<#Pd)eI zZo{h;jQ;*VQhSq&4my0i<9d71Ug>}^w}bzlYW((Bt9V`C7i_b?Zn1=gPf^(~&H_oG;P-Ep2Y7;JRVSKX+F_DzY4_jP;c@Pj z<#k#n>X-f<2R}qA z?6+Uuwj!Rnr;)?t{=b(8|Npvu&?~*dOkwHb^PFuQ88PZNg_Roq)T_IF_%IQe6ptRg z{_v-HB@@eo?~~Pg>vr#9@n8@uQe^ZH2Zp&&L$*pUFzIe*_&alM%mF7oy}f-*oDP?i z7(Jp?7(BaK6f!3=sOSncEOBL;u*HL6k{D1@Nb7;AmBf+h4vg#fhi&9E5zt83DjrbJ zbZ_5>>Xb0;o<}Dgn3mP&=fAHnV{>C)Tw&DH@bY$w&{+nzk0~CE?~gFuJFDxU`=CE^ ze#C*QWL_U`>kBs$MEu(XHr(?u`+7NH&fmw}5%quW-dKMyX~D*W8uMDX4Sv@jxplWG z(1ueyV9n!q^8dvw-r3nX$@ZRL+O~W7!5Ikx@lLEN{YcKOhq_n$!Kd@#&wE*}{4eOgkFeTFFJcD4;tKXM$7&tGwF>UlPU`%FiE%S#>D^?x7Z zmfwpR_xyg(BJf_H@yP1;6EK1TcQ}<23Ps#niO?Ce?RLEu#}~~ Date: Fri, 1 Nov 2024 16:16:44 +0000 Subject: [PATCH 104/515] updated cloth textures quick update to cloth textures to support new model geometry --- .../textures/block/display_cloth/black.png | Bin 886 -> 882 bytes .../textures/block/display_cloth/blue.png | Bin 907 -> 905 bytes .../textures/block/display_cloth/brown.png | Bin 850 -> 848 bytes .../textures/block/display_cloth/cyan.png | Bin 868 -> 873 bytes .../textures/block/display_cloth/gray.png | Bin 871 -> 875 bytes .../textures/block/display_cloth/green.png | Bin 876 -> 875 bytes .../textures/block/display_cloth/light_blue.png | Bin 885 -> 896 bytes .../textures/block/display_cloth/light_gray.png | Bin 833 -> 845 bytes .../textures/block/display_cloth/lime.png | Bin 862 -> 878 bytes .../textures/block/display_cloth/magenta.png | Bin 838 -> 842 bytes .../textures/block/display_cloth/orange.png | Bin 830 -> 841 bytes .../textures/block/display_cloth/pink.png | Bin 777 -> 785 bytes .../textures/block/display_cloth/purple.png | Bin 864 -> 874 bytes .../textures/block/display_cloth/white.png | Bin 754 -> 768 bytes .../textures/block/display_cloth/yellow.png | Bin 812 -> 823 bytes 15 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/create/textures/block/display_cloth/black.png b/src/main/resources/assets/create/textures/block/display_cloth/black.png index 92e10fea84a72fb05196eee948014082f93e7327..9a4f742f9d3c7dc9f1a7ab4f3cfba7788a4d378d 100644 GIT binary patch delta 859 zcmV-h1El=+2J!}wB!4+cL_t(oh2@t$Xj4%X$A1YCta)G5p|rGgsGz8z4%($qu_7IW zB3;D<3J#@$bm~?VLB|f#K`1ohB!o8NkVq{QT%;>N@F`NbD1n|#pCvP3V%TI>8T0Ui(6zD3k~+A z<$R0?NKD>JbN1W`tagL4?a|xQ8OkpXT>wz*087jHDBmZ(UfimEY}>&yHT=A{r?Y|E zjw^X9ka)553d__0n3>I>C$$C+wUgg@@DM$zQMNrSQ)6Z}6WM|IW~qc}=#*^_J*nYV zJOIf78JVt*4u9!P+4dxlg2eRHgpy;+)EFE*kJWC-Ncg#F=yJVfYAigSC}+;&`P zKQJ8#tAU{Q`*i?ltquh5dGKur+IxFCqaB}s4$NihrwOY8@fHZXfBip;*z=Wq)pJ}q zp&7dT9h?tacXe=BHYAUp%vEn*A8X3PkoffWBLGQ5!!Qjti{CKJx(GS8dfx?iY=?^D z$@#nY?|)Ul7q^tPK_2SB$9L}m*xlIy;BZ?TyE{8_6gb@0rmXYN0et=ZN!d6(mZ}El zLLE4I#G<>qcAwwA`vO0p|IFDs2Tq;rlUzHbOTMvDk{fA)E zbRaXIQ?x%bpHp-pGoSmTkNnbsxyM;dLsz=u>3^vSY{!*du(a--F? zH_FCA-VAZ5JwWDORd;oCu)bG3Zl(4F+m4H6*4s7z`lv{Z-56!$+7RV!hq2TsW!oc_ z9#ND}*aa8%$%!;eFKf^7<-q{}UcY`7%9|l}ZDh3Sx)tTb0)jUi0r|(Izki^*_rXx! zG*kjth6dz`R#sM(2)tSQfbF<40%3O1knA@C_`Til7~JP?5C`PDe*9RUGB%qJjsmUd l5B@*I_LDb1epltc!%uSeByg{K!#w~1002ovPDHLkV1hZ)tabvx#|s23-WxV!C(Udow}L zH!h;Hx%1s~x$oR_zWd!Xk-`3<^7Ld9)3RAerLjv6Q;)^~B!8ZrnP4w}NP20x#=o+b zjS#|O)00Vhu61FY)hL<{?QN}f@$G?|03JWU%33ze_lfT14=W%0VPWVBZrtA1T7yl? zmbeiXd%LoMp(_B)&8JWkN)3j}$sa#?ikeU;nhu7pFgKqH9YFM;P(asIil&2_P_Ro5 zfW&~z%=wlU8GlUCbR-UAvDujkPmK*-p|9@-##v2f!i{xJmFo>%;nnMOr~sn=8W&AR zVv!j)cCT-Q#nMa5b!#qaEYd8nn-dM;fL(HGI3NO26AA}~0*0>C`1kUMGMF$Hn|d_n zsi~;3xaUyi0Mv3MvPSln}gP0N=4 zQ`3QZ9Pn$uTL*x~>VW^A``-q?zrC$B-0|`0z(T5entB`%Z-MZ;*Z;E?d9$7^JC-dc z6it=C{qyzK-R&ES06crKPzHE-e>_lw65HL{0U)6%Xu8Hh{u`QJ6(P&?-gkj5)1qWK za{hb%Fn`E*s{!n6e+1z8=m>!3c%0*-BRL9dj>kRg+;ae5KkuF_fOBUIE?lVG=dJB8 z@DqBk_Ea&@eYrzorAd`|f4?9%QkqmwVzDdT9a7sfuU0)ekXp=mv_G|&@#sQoF(Wt9 zH3idElD`gM;dvTeQ$1br?92qFWy>yD-2e2_GJgP~i%w^jBZ1 zpKobl?>C|BQsoIYEgM6xwrlS7VJ$ZPV3gsJ0g68?#>Yk}nhs;hVUO|&zreyjJ&|N( zwelSIUa#;bm)i&wKxAZiv~1fY&xwTz{HGC+e@q7Zhst)zA(z_-rUQ2dZpjm^ufOwT zU|93RCrrzh8K~zM4N2Fon=g0kLkzW`d28(HsG3y}Z-002ovPDHLkV1nqUsZsy{ diff --git a/src/main/resources/assets/create/textures/block/display_cloth/blue.png b/src/main/resources/assets/create/textures/block/display_cloth/blue.png index db6452bb479e540e8ad3654489cd4010bd2d325a..baaa83db09a663f79cbbefec1fd03f9de4f61b87 100644 GIT binary patch delta 882 zcmV-&1C9KP2Z;xeB!5szL_t(oh2@t|h#OTL$3L4HcIT~0IwK0Z+9ClFmg1$JDr}2o z4<&ez9(M~0rBZP3Zm%L#?>#Jq9)zsmrOm;u9?F)sha8kDs4e}2LAL4UAj~w0&Lqt+ zJBy5Q?g84zeU9x}sRsN1>Q_C4Z zAzfqF4;7c0(YfwF37DIWD6{6W#&MeWxUPwbXrSkXBN}i-T>GMJ(BAIj2xG+FbbY0f zJTT9km`T)B)>xi%FqHyCH3_I3j-r^gdAAlETW?fV>N&eb4_t zjH&Oh{}}Z;T{TfGm(=ILJ*%M4(CX@xiJnB3cmv-RG5l;H1Zyrl6*9&mmgfY+B!$BSJ2CX)i9=E7%JLIAZU)ru*lGxpK^) zx-dsK7;^I10M`#$IrL`S`F3|M?UGCTXH~d-HeP7)unE9bviaBm>OVtm>tSNYn~fy@ z?rVp?)J3Fo9XA`pXY#QD96cDaa%ex@V93qp--!(Twi9ckx{$WNrR?>b8317E^J`I_ zF}=?7pa7_Q{p|%SF^-#0j}nu3AN>C?^&)lCarNsDa{WDj3YIxExMullY5)KL07*qo IM6N<$g4&P4od5s; delta 884 zcmV-)1B?8L2a5-gB!5y#L_t(oh2@vQiyKuO$3MvoyYtp0oe>MW)uI6vmg2#B6WU_g zLkS+F$KAb&QgH8X{{rj1hehb2kQKbt9Ng-mtW?20w6uq+ORX4WO*aQ&rpf3`LWc1$ z`(EBm;$b@JLHu1_zVG*&H*bF5@B6)9O7DI0UA)m)zzc^ocYjCtUc{w~^8gBOu2yNg z0Xuu~guiw9Y>5J9ZZsBnW2r{fGI4_rb*DNNzg>SGNc*8ntH|4da@!54S|xqC3cw&rky zh>C6Cdl7)bfPc!&;>m>jx+8FdNZ}%8Zmy;|cEmhq>Mu~WOqB^8+tz}LcSM(F!3~tN z9J@iJu*{5(_4rwsxw98f-{qC|`sW+_wKn1C4kSG*J6MV*Wb_8pqP(-dI-RCwFVE-=drx}&)$`SS_uw$kd&e7i`13vhVGsad2|*YHYLsRPk&4sj0Dk-R(bH{U zX=RNQb^?AmOtSaZQk=rCYq+Z6#~yHX3xMM*A0&%hyPj_YrmKW)VBi7Fkaf67p z(=R5K@94{=Ut;P1r~zMIP8ND|xdfQp%DaKqU1;w9k^17Dy)^#f>)+Kyq+{I@3ZncO zIBj<-V(s)x^urO~xBpCK;K5;{jmC1;|FZJ8jxzAtD`hI8lsf|etbF`!Tx86ylgG+{ zy4PP_wo>E2&1Xkxv*-{0e^y$*`a|sZM@r#9E;Zl!^qoR~&;J4czAo?J2{&>80000< KMNUMnLSTXsYRqB) diff --git a/src/main/resources/assets/create/textures/block/display_cloth/brown.png b/src/main/resources/assets/create/textures/block/display_cloth/brown.png index d8512f5d3d41f389f0df800d8803f73831098a51..d77fdea536572586e09a642d290249e4c8b42152 100644 GIT binary patch delta 825 zcmV-91IGN)2G9nOB!3r4L_t(oh2@vcOB7)o$3HG}m|@0UVR79{Y0%4|cTqYmK_I9^ zl!{#v13~E0p+6ynPI>532vJcN4|mmAHhVS$I_IZBK@8$bETQTtHZa&e`iEWw8BuBAxITCH{0DqD?}4FINxhfpPv{!Wl`d$TcAaqcUWn@a!NI9US zQz_q^iyVtE3+}9mvebZ`%k8TH;gG6n_|=GvMA4ZbP!etJuAGV-%RXnX2EeCAg6aU^ z%Bfcuyfxsp4+`b;)TC5AzZ&r7{8)5ADxM?9qR;(mnX|ope!#e0-%Qt!jUjP*MAU>grz}tC+qrw;MtulR@Ri`kDv7AGwZ)xwqEY*z~Yy$ z0P-4^t$*man#H)&&N&9~eP!9T@co|dym!pkf!mkkM5?O+*jQTyAXaK#o1%P-(r>9eLp|x*|u7$n46hctEfPacw5Q#?F-pBy#)k0DGMgE=kL7_A@ zw{q@U0^8iBv85H;GP!)C#ie{=UT`s=Xzzrlh3oiieSLAs5no=?f%Md*R5Wp75o*C_ z#>ZXVA-EGub8`psk`A0{XpkpbTlnOP!0*)+Y|E4p@S7J8lA}fdfM*YG<%4{^>--Hu zfHJ(-YfheUeM^mdzXIiWAN+r)I7;4}c=&uI(BJbvE}j-bN=GR=00000NkvXXu0mjf D^4g*{ delta 827 zcmV-B1H}B$2GRzQB!3x6L_t(oh2@t|NEA^V$3MFaIO~kNg1GA?H7G**V}a6X2?9YS zqEzgXNCZNc4xKx8%|n+$h?2T^(1V1l1fuIH^pGtkri3PyDS~b@?s(b`yYKDHI9BVd zhv;{CeBbZwd%yYpzQ6B#8yI+SD;w|X#xf0N6JuDJ4DpUm0Dp;FdV1N}+#r=q9`N_| z4+ZdHO1!I^Sp6wfy#mWLsEpQl;<|H}033b*`iK0SPjF{*BX^kb6IIi(sG6SJG!(+hWB?=v zWM(2&RWcaMG=C)aV@gX;ucOAQrc-zJBC1{?GhxT7rpxuJro*Ebz5)pTuEsJmhj646 zrlgWd&zg%Gi!=*t=R`?3U}Z7~I3NO2Lm|94A~TT>#*ZoSj!s8SMU7>jQ{Vu2aKx_; z0FIivb-~R6_jGQ2c+WJYApKPi+>}>rUPCaaBII^2XakwZ(sk*ra3 zzT0<;dY~xF3rhfKVV!U!%(wNggd<_OAibM*{6OIJZW=Rf$oY-+@5P*32w>^sB7nSx zWh>gQW`8knUuT~K_`I@wv;b~2))1+#24Hh-6@X~nc^9s?;R=a&x3+ke-{|IrC;%^u z4Ioy3Qfm9syBUWL%ugm9+CM*;aOlGPWI}FKR<5zXXBK%pD6`{ZQt9lkV9PY*D_Hb@ zDwza8yrNSxNx9LN#YIPX{?>w!zku>u5UHwSXMb}8pumN^_KO4T>;0P2+}h5W%W*8@ zC(Ui`Sf)Ya)i#In3BSO?AMfmj$GPjcwxJ=vn1xEYpw~@bZfXNvy7xvU08H3;^)t-u0}X(Y;SG76jzI9;-d! z7&H%?caOqK@jm$fEHL=+PIiB9Pcj@Rip}?*j{5q0{tFrb5lJpMQI!Ay002ovPDHLk FV1oT)pDh3Y diff --git a/src/main/resources/assets/create/textures/block/display_cloth/cyan.png b/src/main/resources/assets/create/textures/block/display_cloth/cyan.png index b8bf14450d51f42be22ca93b6f30a3e1b326cb59..52cd811515ac4e800069cbeabade4f1dbc998681 100644 GIT binary patch delta 850 zcmV-Y1Fihz2I&TnB!4hTL_t(oh2@t|XcJKo#(xRvZmQdDW3YNjwG})R|Fj3G2caMc zg5pg<5ETS3dhu*QDuTy?R1m>~wbg?ML3;3FQRu}}(Q2h_Y}KOHKuxk;ZFURB!}h(r z-E0)yco4tK%lBsX?Yx=UnMrK_{h@MSSB8S?FgTTC$$?AVt$zTL5A7U3&HXuG{LyM-9cOB9?EIFP) za6o#d!|-^!VSkc$9m%60G0>Co#WA!SaPa!Afuhaoi@zfZL?_BVLk^_IO z4piqrb?sN{08G}m4g|mRU~dS@+YK|S1N?Pha7x59JO@NC5b}!tKaAMu(?@07T9zAz z*(84l_rvrK_a2l3$<5(g<+CTw)Z}4E%)XiiV7+NzHk*80_<-45iLF(%d=Ch26)nD6 zw%osb^?yovap99sH^@T`n4WqKKxt(KfMjDMrIi)A3M3mFeR}F1z+86Lckt;mr^>;- zPy;p|>t$=xIsjfQc`n|QZu0S63fC3>cKI6&-T z;oh6cU*7PS9=JZ0qh+nqRibfm2Tfaf)MO#_CrIa$%fjYqQMK7Q@hxNJl!SMl)u>Q8x10}iz{%Nva^zV~_H zl0WqT0K12W%2C$fIlqHAAp3gvhL~@ywI5ss>Mh>&S2{jH3|;JAMGF&6a+yi z=;ELth>PH&i?fB&zn~x$L~yXSIymUy;G!VZ!Kr9%L>pVRsBNGoIZuo& zIu|2?B}NA`?AhFp)|I5_*km=mEk4-49hmp|0iHxT9f&VmCR$e#t5(HORJ=H==`FbA z*b;Zb5)VI=F_gCejL#KFtF&P8^2^UxNUKnEYz#$Ze6A4r0`VmaQi@8^u}Q12Zo3YF z0U4Q{nv1iVPJhv{C5~c=iQ$Yd$A+SEcdyHcreFBPmV=o zyx6?ZtvrymlN2=70RJ=zvf>Z;r)xE^x`ifxo5$ ztsH38ey%e4Ag3B9+OTeEEXeju<}Hu-K^ za(;E?OMjSin-_SKdksLfQUM^@-A%Ppk)yC=ceihycMf1FzxZbt*mC*^J9;((@N(S^ z@qu)Y5AX9})q~%E`vH^J0q8w*%-!+kt#B6@N*itKeLL+B>cZW3^Kv6y*?{T%3?G4O zxdN$%(lxtaC^@$5f+vPm*%d>X(LvXLCtsEuJ%3xP$!;o)#lbB=sYapMsksqDDkzVUbS!BJQz`h)+^VkaL=)yuUe!+}t2esMP1zvsUI XHctzs2;B%U00000NkvXXu0mjfWr3d& diff --git a/src/main/resources/assets/create/textures/block/display_cloth/gray.png b/src/main/resources/assets/create/textures/block/display_cloth/gray.png index 9a98355e42853fc0a18697a87e5b2569e0c0f91c..6f3b0680263102e35437fb784a40915d2935ae68 100644 GIT binary patch delta 852 zcmV-a1FQV!2I~fpB!4nVL_t(oh2@veOH@%5$3G6U(DzFarjRMfGB*~~CJ_qTl~NHj zD-G-iBrW_WB52v7MVYh^vegt}(PWf4xG;6m!Yo9QK&Gh%1mBOb-Lx3*?cFzT#C+o- z`fl!g?>X+8XGJkn!XJhw=HZ#RJCgMR}la`^(|6LS^z(V_cw zL_qvnUk~lA2e1qs$1RdZfJOJ5kPW4 zW+t(xNe1J%MSsboAU-&dQfh1(8lA`6u?$^i!p|*Jm;R=qF?=^#0I^_=9k(dC$c&%+ z{cC~v_{3aj%|(qxng#dwL`{0YbBh%{AOg}2jl$10%+1F0+jIGX3?>TV{k`2vO+}5x zK8HU&0F^xwSqA{6rv4fSdq8BSrakcL?Tl2supS83e1BJTKq#KS#$ulfZabc|@0t#T z^*~Vj{W<_J95H}cu;yEx4MBUdIT7*o0Ubz>Wu+mk2gF$*?0)}$7IiPPuS>4&$O*$T z3{obUhxg`&;S-ce*xgv#s&cO4GsL-*pQ<@eM5ud=br;uSzb~WzH+_46r2kU zprx&q=Dp?pytI-7;PAoZws`)>np|jqYpb$wkXH?$?a)4{?c-CkiVmbRlZy7IGn0xg zq%)J-ddZdnJbjVHGIixvJUEcTc073t7W;pEVt)<*af^QQeoihl|7lrSILNCZ2Ac0(TY5*rYj>s>X{?%U1{cF)fGmY!1hE85-yVka%P`MSs3fBs;fMrJo)jix5I$ zR|os)?rOu(R4m&i*_x<{dyaMk`1AnN<6~j&Cz>x5F*Fs^cF;8iFHW{5s<3G}5;sC( z3$Nd!YYG69GZ|D(slrhC^4sHSR87IMU35)hawZenfoSo^28LbPwhJIJAS07# z*(05?Y**qi5`P;RPWf`IYYIKbx-m3WM#75?U6uB_rZ90UoCDEdjxF1jSVYE)z4nce zSaxoyX3j;9MVJNl)Uz_Hz`8W0YtnnLl%2KrXvdG+~1Q92VwVnYLczMP62i+2vc zYXGWiBs32IzMOh<9IOEmnTFQDljm#N;O^ADGQf??*XkNjVynw50H}tB(QNSbOCF=ykOt;Y)As{`&7UTYY0Ld@ zUkdfy`+wVkl@A{Q*esO*Xo|<#ES2Ocq$wWv*?IQ>*4I{d=0N+QE?W0i-t+2u9)N=# z$-lyd?;G-<16^G^bKp?te#!0Gg+(6^q%-qA?oVgteY}v)%*%r`HID6+w!djR2kt-0 zVd$!FDjpe5VOoxyg2nsK&Mg5Trs!ucm*he3mVZCVX{sKH!d3&)D@>PY*+afi1i;y9 z!KPIqC2@h*KCHwpo$uw$spFWoL+U~=mhF=2JMCjWp%+-_uMG4vb*Ivfk92ne@Nl|L z2Qn`fC8LQi7NHjS!E8=8A}{vJPE!y&dE&7AqE~O1eGyn*`;2KhG6J>qVj$^g+lQvc z>q(9P02c>`%3;>vIrT^skbS+qJ?UGw+Yhcn8ZjUIe-gPqI$Cz!OdNS0% a=f40`>=MArQ1tWw0000k8Z@%yMo43FB`~Bwo-c}s$Kbh}o?!FfJsKf{63MCl}6VL9M{IsbX1-&>x#JL zI+B+I(d67K3{3~1cVZZ`GFHT)u=7h}cQGqt*sg=2>GVzvhYlc;vMo$a$95ge${1EI z3m`clGm|h(8GnrJI+BM$w6C?>Q)5HZIaI$7T{C1RRBmdz^fxq}M?44>K*V2TTdA?g zjLKF2av(Z5GaguTQDc#2!PTB9OAlDNY*7!0fXvDmDciybu&1oF3?>YsJxv{+nu;2W z?;L*i02KE~XdM7NHC1cu?*WmSGWWm}sdzy>;IH|*=zoAvJhjH+I~UwidSKmjAgBlY z+OO&WP+lGIf9L+Q!EaBPb>X&;PY3#^Mx-IA2gF$*?5h7ii;B?~WBJvLBPXikx_tJ} z2l<^m(kd?`ckT`3&!6ck$%7DGcs~z7RlJ(G5huO$mADa?4jDV+c|q`uo#A_CRnA|% zel5SUw14dJ_4B|0=0D5<;ARWQuojEqX0vh>&|)!mE?=xR^WDFq4@Et!oxr?FBw2X?KVZ*pZRnk>Ct{j zdUWCbZ1T4|{A~tqO^;x%DV=%?wp>Tvg8N!^d4DSg5Vz=|*>SnhL~7o%u%DMg1PTX` zxuyjP!z5*;0kCq}g8Z&&zqqcc{$UZlaIlRNJC5SGHWwS)uw94KdrslFw%oa}3oh(e znmTD&JC578?*-s3&jWeM0ET9sN<|Yp7O58e=JaEE5UE_n!}&MA! zhjrsY{4TTKyvgjF_uhW<5<8q9sOEZy5z;09d>T_?(6{opB-S4nJDikUJyl0!@`vgmSN)M8M~v73+Za! z3?!zOpJ5p$0AmaHv0IXL9BL=OJbN3vC5a1M;eKQX;sr-w8zzo)v0IXeN*O?N zKu0EH+1eRLx__ESL1Mgr#Ft~sFgcXnhiOkuo~D4qNtsTf<&%o$d^-Ok;258e$yd&cgFc6Y4D1|{+F?FRr-=~mKKn&Q`Qq^-1GP;yGXA1GdOO8hGQ)bp!f zzlVA6x_<*7-Yo+l%e8CRNG6fxvK|$TWYV|JI|uOP)5kw^V9PO+?B+HAmcD-mV1Ik3 zk9W22(0mgq%~yV`!j0NS>Eo%|!$e32_O|czX#3-U4ovy9AEtb|aBpc!Z)6)Og!~mg z0@q(mW3MTlw+j~1)m`v-zp1-o0M$j`S(?`yEq|;m>uxFx;!wMQ>@_XOST+Sw1VB{E zHThlBe)R(H`lv`;IylIQT}N@H!)W&)j&wQKbsASX`sB*4xUygE8K!UTI_}Bt2H-Vw zp&W<}-aK0sQuJ00000NkvXXu0mjf1o4>U diff --git a/src/main/resources/assets/create/textures/block/display_cloth/light_blue.png b/src/main/resources/assets/create/textures/block/display_cloth/light_blue.png index aeb9c424a8ed0a089b8da3d555e2ed7c36cbaf2c..915aed7f80837a78f8b3c1dffae799aba1ca80d7 100644 GIT binary patch delta 873 zcmV-v1D5>t27m{UB!5RqL_t(oh2@veixfu`$3NXwnV#7lyBilmLhQq`hXf^vUWDu+ zgj|Az`~@)y2)QhhKVWVl;yH*HA(vhM02xHQNbq35i;{y$7W3oK=*lc3)4k5l_R=+- zLtC}oJu@2Z@eur8YQFW})Kt}b^?h%wukPH<)&h$-P1)EI41ZF=xnLi_@Xqp>FiGh4 z8WZ;QQztEIK&}NAE3HKqgd|cu0>@#cJK>qy1#uI%2E`|+!sVcmIKKc27Ye{V4szi zXJVSi_~4y`GC43UM{4T;P>N|W#?>6qH#659xVoJg#edT}@VuD&Qq5lnwBi+Gtlzoj zahe+YYtwy8Ul~3Kk=5N0Pus0e3&}_BX8;#7U(QLI!e#JR} zzyEwtTKJo@UuV_1X|R6$<97C*lPA;W?ihgg7wrGUA0~?LK3KH?&fotf1Lz$4Xeyt1 z14kDcm3l8tk66|IgPt(AU+?!`c)}M!ZalVe<$tiy729-{bFRDK&hpT7#gMTUJhN}V zWfr2|H?Ul;PsJ7ZS;x7k%GXWos7 z)R@ytInPhNZ|s_D``VGADaW5KyDH`0PDG@XIpJTUA#ti$^=I4b-T(k!-2OGIGgjAm8Q6fS z>qpz8(l~3rI%>?LKX~(Cy-M7Q=&l~G_4oW=o#ZuxD+mew00000NkvXXu0mjfy_UPJ delta 862 zcmV-k1EKtY2lWP!B!4_fL_t(oh2@t|ixfu~#(&*anV#7lyBilgB=lj~gTWv{FM@lJ z+(d$(Ab1gSS;P-8XFq^QE&(sQ`2aG65Xd2T*gzB&4@MWGfi$`@%gS``pP81fX%B7H zbocCvV~>ZB=TiIB`%ZUty-z*$u660p``Joh5vM6@n}U8SxPKD70WiF?I3i3Ey1m9k zeD%y}iyDwCfyGj5o;e|jRFA-MSZa9{KF`Uv2bANm&1#*u19q4s%n8Z9O7VoC$OFfj z;BlH7J`2d-U)y+M8-N>O17E5NZ=k>Y+CMhF6hx|rCj>XbM(qXI;n2aAl1M3hspzKy zz;M9qOwddK2!9-hNGZeXKz0^Kr5bxeaOy~2W4#ka?n=w#dt#d(YA(R8);LniaJ@4{ zUd*2bWVhEiu;#kPLDMerq9$gdfqp6`G~kI`2fkEC9F)<(K^m#;13;;!#Tr*Npm%1b8o0HU8OPH;@PEFV`%=x`2ejiAYplV`GfMlJ$K#$`0=Nk8Nm17U7o5zkxw6O05I>iaXpup;R{^PH3@MP zmwupm9Dl{^#k*$yRk%6Ld&djd`0FtM!@&T6W~;?;FfgM=v(+l)73Tn+|NZo%7GPa} zvYvh6pfa_1zGr(x#Lm_W%Wvp%X-+giJeBGYr0$(;*eYs;Uq9QNiV@n{vIXdFPf`8}^ z#8;_e**`q48wf;SS3qWf#>4tF)mjD0&07*qoM6N<$g34sFYXATM diff --git a/src/main/resources/assets/create/textures/block/display_cloth/light_gray.png b/src/main/resources/assets/create/textures/block/display_cloth/light_gray.png index 4c45c07c5a178220f476280aec25c6dce0cf3dd4..6f941699a41e57d36deec724d1358f701a7ec7f9 100644 GIT binary patch delta 822 zcmV-61Ihfs2F(VLB!3i1L_t(oh2>YzPZL2D{@QG3DczPIB^tp9A(0r$p}>J~B3{&k zi5Cx=7%{<^_-_~!{{#}F2aSmyyqI`UFNTxx0v=j~T~dq4k0?ZGx0IbdtcP}xyIt03+`~2>_?^pK|SEtet%g9T7js)<_FyketXhLgbqN_ zfn44sLr@QhyFl1w|9=*dmvgT?yHutLBbB7j{`nxki&GcqL301eL+{qLnWj7lnw4J$ z03=cdQXMI5tgR!}ks^oEZb|uq;HBLXDkYod@7%lVZLMu8zJ4AU!1Cfp0Kk5=3IJ$} z$FX0n(tjw>7LO}_@*DsZRxD-V8#B|Me=Z1-xwkL8WU|)H+dDr106po>-{R$R1yg4) zMF8N<>*pQ-oI8IxkT=ahI^9LuUMPN1bYRIWDB8bd78G4rG7E?9@Gxk(MGHEMDX-$m zi7XuM(kob;f72=g0K_ZWTv?@swzj@03;TI9M1O($1yn!ZhS83)T>*f)49Ds+%;>o$ z`-g=#GJG0?11I4)93z<_aL#dNXi!l;VHaH3$FswYzPZL2D{@QG3Dcu%m@dsccA(0r$fgcCLiFi>D zCSE*fV)URf@h>tldcc_IK}}3Ns29V@cmWSB!Y-*Lh!BM+?Uu4{5B1Q_V|Ke5+bsv< zcbR_kW@p~ad-Kg}#AHJJqf=Cd;sD1X}(m{zgLe)Zbz2tq)c zp3I^@(+6D_AR;7tU)tu-^4iLFb zIUpSpA_m*uhY+I4UbZXjOc-cW4IPj%l`&TDxy*sOQ_VRN22lW>n5r@M=YU+W!#VJo z6)z|U{4qZg9gvEr##r8S$sKapeq=fjlmmY4S9PEhh=2NH{-?LWZ%-PD&<=QXAeT4U z5R?P*Es%C~{6CAxtA*D!yHw^5BbDUe{{EnGm*y@;0O0=Phcy7WbNyCJ1&U_nR{;Qt zlz~)F3ST!ik?KkDfYM&c^MT~0y%H)VoBOvnwpv;D(1F$EPXK^}Y83#`6_4YfTIE)v zD<1cZQ-Avaps;4OxpS8z0PyzBvl;-Lzi_3s z5M(latnG#37mp6Cm<5maub2goF07aZo=6ulIE`YaB?ofL7JsZ(!4A1x1OKt9Kv{Z z6hwrxqaz;WlXl6aeR^VyCmJ|;tUU)ztH_EbcPx)u@?73h9;!pGqTLW^!>0#%N1I#U zJSVWT`vVTSd;&psiFCTR{jfZmzgG*>`sZl{Q2_j|r_;Tj_ILgMR-zO2!T*QIi|6w- oA|sbG96(FieBzke%(|& z3RMsk+6rETp7kUZkAip*wa|l5^(M5bC#ymg@gN?mXjK$VU5y93*?hq+@epP*yV+E9 z<3apihX1_D?3?%A{O2WdcJ5$fFgHZmv6(8|rsP;0%Z&g?K7ZUlO0jNo-<)ozwz!8Y0aSG+9YE-lOL~#b|7lj3ZyihiffbB3`&j# zAUPl-la2RDXMZZLEqNGd!~LV494BKs>wCA7h^1vDRG!jwxxQ(?6Uu?8KgSifm17YZ zm86VQ;}nF z&!JTV&|V{RL!x!21I1KS_89R^HTAGYQUfKzki|wLh;lbi+e73*=g0lU(nB2c`iT~ck*SCG8n)HCQo7N) z|Ni-)b%*yJkPXSTo8ygB$A>!dAZQEouK`FII!3R-;->;eZ%g5z!L22WvSrKp z^B2b&=6|Ozp0$1+=)mijuK=i3s{q6k32N1<90lTuglC;P2k`#wf@kBCLnj*kxj+Z@ zonB2Q-mK;i_FDkf>YIFgK;d!8i#3z0SDG8`KC=RViSc0G(SclQK+*O`J{`z=v>);w zU3gN=|MG;tjKK8b9a5U^>57N@M=3kD?1I&<7=J)?(X(G$4!rpB%(JndcS01J4^T>L zYC$&MN3m`KP;xBNnnBrVYQJdL)b(KzdGcYRv1R2Rs&0ulOV6peHajwhsJbNzJwOgJj zC{O}r$7Z<*iH2n7>iqy*W-gE~i!%>*HNuSkeSQZ~K)&k(`UcO~Y2H5ybfZ7`{}B0; hys5ancP`Z5^PfTSB;5N^Kra9Q002ovPDHLkV1gJFr8NKm delta 839 zcmV-N1GxO|2HpmcB!4AIL_t(oh2@tyh!jB-hQFC9*g1N7@fa9bVMNyh6h#9;7LQQH zP&~kFRWK2ZHB?hU48#Krgw@T2J&e3y5d$$06W&3cMep>aXp8r>MiP?&7sOs0ELgNJby{8ZE@F{?(v@;n@y3x z#DU5%~G;LESRJx@`XG<=7A#$e*ZmBaz0tyYzSFlhJ=MPX9+YygD; zm6>vOLelEq@y)%_}v=I%;;EO zKL`_dt?9lsmo=7YmRRS+KsZqM>>dutfQrJzYE{W+di}MwrGiOf;!x#isHU>U@|;7L z1JKKn#5w?kYO2>b$^n^~fpXy9*BPaF{WuV<`CriisegESjpaF)*!8*`_-i`Qj{{Nd z*L5JU0qQ{XoJa45sJ}E+PP92hbYQA_OF8;+K;8w?udn}SEj9JvPRFskN6Ij}=RZ2% zZ{6MccdF$hs zIQw=3cz^ZcB>=5v6M$?kN2}RXqqJ-;7h0#!0la%N|7QX0Jie4tHemC6=M4bMjr9>c zs^P4{wU))Di@}Swomd3G^=mN$s1!yuZGRZiftir@!%RpQ9@S>liwYtTtJoQs{yeE3 z*1KTWb5s|scf|m*i@x`@8^E(4PgFM*$I=j7Kz{`hXhAtULal89Q1@(#!o>9g?Ux(q z>yujQ(fjM2jf=O_^y|D{cuK=}*jm~{)2~x?=c%==-{K9+_N4%BK0n<7IJoXiykmI( z+pJPF`NcBT65swbp)MjF>-MK55L=dPQ(x3C1Fq-ry9~*OWQDPYf-tziTFiC%#4uQ8Hoi6F~Ho3p_Kqp%80}SRaI2}R6r?IrB3Wb#mO-^cd;F(f;t@#-*Wlx zyKGY;ta%tYL6E1)=?>m>Jk5In;l8S2 z%7S{L5}mR}x>q^wz=538dp;W+hG6msD{;M@9_!UrLqJ zNXOGW2}EhU6o1m#$O-z64Pa!1jzo}~IidZPJqgUH#xkI>icF9P{d)mXop)n3R~q|a zZu4MH^dtwGuF;VLMo##~ti)UQb0BJOtkrdnB!RF-3n5LF#`-;{oddBslC%y0Ax(oC zM{__$rl&dJ%vF%BiWipyQO$Ry4ycM3)L6aeiZ=r}uzzcHAesYlwLe$~U^Vdt%&6wu z^@gZDRZb_qK&TE>X6)8>d=98ypzLk`e;CH&xfxlt+u58i7WC)new^RM(<6Eyx%cS4 zymo1#E02R%db0>Xu9&B275TFAnW9zH4)$g^%!=EaHjZ7@`?n@<%hi>yA>SyEy};tz z1pw-`8h-%kOon=`rdNe@CKK`t?g1>nTM8X~W#Y1o?#03Q{@}S3<$eIRKGXr|Kb-y} z?yYUH@9G%?;M?725@7%Jv$4Eu1p1C-WBYwv?T^+4=9AX}QJJ-|T9vLn1w+&E^b}kg z7kVlN7i+9#f9dLj>Wksd80Fnyg5QA5R-+L^K7R+l44YZ$5287t$F-n;Qi#HZBK;@! zB5NLn5fABj>^XG+S@ZOhE4$*#ZjAzy{z2K}snEeu-t_{`i;Avj>WQoK%OP&hzSoT? z$b)cSH@4+nFOWT%(NFYi;b$lUjZamYj;A9KXIBHsP9p%o#~V*&k~MnH-@pWPU+*6_ xLM&^y{phODi}~RHgRv9cf;e>NT%y0{zX2$ME?Kf{WVQeR002ovPDHLkV1f*fnG*m2 delta 815 zcmV+~1JL}+2F3=EB!3M_L_t(oh2@t&Y!gWo#(y&&jJ^J|IDnxcK!s?bMx5?Wf`Te( zNr8}Pkf>>?phluWLKIL_Q3MGPA(YqNp@`s#rGVt=r~zvt55f)b|O*(oa1 zO;lac^dlGo!XAU#fI# zXg{*JjH%9CCx64SXehQE+=i$tn~5}*4Q0<8e;Jc`j&+J-lbJM5pPz)O{$fzbx#2iT z^9ZLkF%b>Kf!Lq{(NKxg(L^5-4dngns{^Z%GN#;_R)$lPk*Zec?}fR{&XFHmC^yoJm=r* z4S9d1TPqzvrVjMxz2SDT223w7{?Ykg*u?FHdENI$YHqe$_H%x}=-i2;#|6OEo7XhJ znUkl-8c@`ef0qDgw41cuHm{do(RSPRfVY-Sv%%h)hwt_6{>t*3ao#%$VClcd01Uzq zfLguIAb$+)YOGeTXU?Vf0G|H;WK#i%ch?_i)vW^X`S}2V>b}|!;b`?UJ5T)~0N!4? zuK{+Q{c}7Dw(NHb`+ZUE&({SOM|D6tk~oOR&VcIO@o_>JA?#wAW6+?hK zJM=#a?1KhNk)5W-F$qZnlEX%$wkH^pGAtdP41b~xWnYj!U)EIXSexph9q2Hkbv#1* z5nGS!Mu(BTx$zrp{O$~JF?mq!z~%x{{==TFXy(TK#itqU-FapkQ5vUhvlJ-jaNXYM z%i~X(46MKG6Z?_PK#|`JB-K3<>BvoGffwiQ=`w5nIpdfFY+tWVi_H41{rqZd67#|D tXDH&;g?l;NHM_aK4KTL8yZ|!^ zfHOCSW@UGBypz{n-SxOr0W*m+Hx}Cgy-{98vqZS9EN-pnSp)}UWb|~ObOxs)c^nwl z(5RAQ%p{54L4PmIA`(HaS*hlFGYO2xazGE~*bA@VA~Hd))Jz*-)EB2BbMEI@hFS1n zO|+#3+*)yG4G4!cD@&ui>hX}>Ef<>3#(-hwMwFb&9Lswir~!zmk(fH*ZQ9JKQWK#X z@FUY+9ax-}iWgM_;hgV{4hY3lYCzm`ne&=0?R%#K5q~uh)_z3?fcEM@_@0N~hLBxL z_s04-gmj=jKhd;A)PQ^ogk4$xuR?qD?6GT?%5ox=Nz1>(^HJ;0pFAfUl6&K0?$t{p zEqN4-rFRPeBr_>8*$iJ-*2rWtazUwBQhwm`Qn5s()YO8Tw{N-MSH3B0!#vV~h4&u- z*sN9o=zr|$VzXM6qmRz6E@fSC4&c+rC1vCM$Q3s{7X_{O{D!NiylUQFUj`u2)Bjt% zVHe1rxUKQ3C_Lm_Ym{GN#8C4gSXLdc|ZZPWe6W;v}bj8-t zsK-SY9PEk#WEU+s!1mf}W#ce!1sxDF>?xg|?tk;d20YodvZ4`9%62WdJ}!)ofngE{ zkAY*;F)$2Hg+%{ZaBO*U-!8eZo4Gvxb8H+wEw-GEc_8(Qo wRx9)2QEt|T{^0+E_BVM8V&CQ2SpS~?1b;N|q_8L+!pW6eSe(9@r{e< zY_8uuciuhsobP`3D7K#6lty6~S+l7xP9ke1jKT z7)I;v2O|wm1(C_O#wP~=!hQgz;_Qzmt)jP?4MvI}7Mc8hT(kZ49WZ_O+Z!-a05}Wd z2s5`I`Rinb9(RDj1xK!f{MD2S-CS z#z>LK54dUeGJg@o!c6i7X_A(R1AzC3lTWTVm&8WYl^R3q1xO`mzJenAn0C$H*+Gp$Ar*AHO%(`Nv7s#O5Gl1X-| zRW&xPD}R{`tqaZpeEqU|qyR)|eoSg=i$NQz6lR4IG=s z_8QVE9*EOtZwY|X{Fnq3Ck|`+?&^$EwC0JMscmBC<5T}33gDm}wFJ6;`l32f%M8?P z4$4roA<=rzA&fLI*LD#6dVEF38Kd86$235_>xtg;q496?(NTS@1O37OXX5wsAt@b8 lF(4dhi_ItQ%*Fcm{15c1_ABRH^m_mR002ovPDHLkV1mKQkHr80 diff --git a/src/main/resources/assets/create/textures/block/display_cloth/pink.png b/src/main/resources/assets/create/textures/block/display_cloth/pink.png index 8f29ddff217544ab48481d4de139d58790f89bd6..9e5a5845233b89f969cf093e73644bb069145c64 100644 GIT binary patch delta 761 zcmV&wFR;4rY+een~aCaB$;g1s@WdI?`86x_jWS# z-plvRis748DVI7hiV<5qh!f;u8zAT11qdU=PB3O~++G&cfPW*GI!M2XbS$hW0ne@G z?ekb*+UvYIg+&-49Sbo^z_l>A=Z^DHobxHb5&K72t~!g@I0V}o=K!9ISo^Mcq&6!y z4r_0~Vi1F4LzIARL7bjUbI2k?(^lMbm0j~1aAbGE%&}`B+cPT1X(SBp*tx%3zY46e z97jpc)5sXS=zl*2IASNL&biKU(>8grCZ?-|@nc}FT;>y?1R#u*$bgd9FjCKP+JZ-EOOEq~mHF3% zBd^SpT$oeJc6A=2gyeEd@vhoTX4hQX7d!b%7jkFJmCJn62E(gDbMzXxH2*bk=ctq1FZ25{tR7k}xuk&cBGCE&T$ymJi; zOnZ}^Q&@x%(yJ&baVG=L*lI%ZCFjtl2J z(*RUzqzNp*%xN*lWesRi&Q=4%tm0K_pq%q7sRL=nGjgoYx#p8Nw_jNusM0{W_803w zF>!<6%VW&Rqd8 z{`64-w14ic)k}f&Th;x(s`i6f7Y>K{n_L^BxOM~_u{Qw6Mig$v^m~e@w_y4WQsM}+492hD%O+#_J$0bssQbDZoB!4kUL_t(oh2@veYZFlr$3NX{mL_kLR?twN!Gh^#@*hv6m{g#S~gKgn~B7Heom0c-Xwx-OWa{8xP|5 z^74H%d6_peZ)Vb0xb?0zGL^!vHd!t>Y+Ej)ll=gS=ci4ql7CHc-tCZ2JUG)w4Co_M zDF%<47^aS6l@UYHJU6NXK{;%~gE&7AnpLtfOdY${Bq=ofTnrf<+^#ki?*;UY1(&4Q z1YmKtL0Tj_xOa1dg-12gB7tL-NeYd{*+y&ww5_s>k<4m@i@@)(|=|l#z~PRcX|-R)Riav+{oxkKPfihUOWS|aEu*mM{(&HKlkhR0(x=2 zGY33Rcro_eyvzML(UTn5wmNelDKr4mBEeSK<6*f~vQ>`6fj&CfABd@u3B7Z6b0RWF z;?@Bm5L17Q!#N;5)8ia)+7-`;%z<#s|4JQ@70(}I`G3wOx2sJh|7&%iGY86?2-SWm zmvtj9v~bLS)f>WcF=WIxAW#RE3r>4GItOGgkn&yqe;9p**K@5}rK&c}Y({+!??>rP zoEujI$;0Q5TQ@J==*pv@uPl86Kx9p_16jVVe<3@NRSK1@O5h8USGFoxm73bWefLhQ zwEiui8-M1J27LPP5r9U$4nTh@MWbFE;GykFn#Vd^mFWxMJHbKYx^^5R_l zI-sw-bTBeC-&EWnKMi)Z*`9)J@|l{NilNTPlz%5*d*!NwzAm|egTuTVG-x-Vj1Is+ zE`e3D0ob-&(jtLf^@@@l*Zlf%p&vV+{^rK6HOdzhvD%YcCD#yF6EL-`KgP* zeea+n`F3A;7R|dFur}|oT=*8aadAG#mkJxI5&5|vYYXl#c~=7t6zyT5;C!Ie!8TP<{Qtk>J{GKfFrxVm|o)(6^Vk`ElXd d*;s$ie*#@RH5gt$1@8a=002ovPDHLkV1h(gmrVcw delta 841 zcmV-P1GfC?2H*yeB!4GKL_t(oh2@veYZFlr$3NL@mL_kLR?twB4&?b3J*v$_QoAQuiDddNt{Z9&AiL5Y%+6k1VH25yp1e66n|EmJ^IGbRw!!!|5N`8*i1=wR6-UK!1)CB0=`#7?y47NcgdpHnn|1Y{RW+4jADayRxORii{uo?S~;|VYQb7 zUL?F6dtvTkKPQI5fnC|lfrKysNQpQ*B@c)7vgl}zL=ki5;z%H;Ryy>~>2jhkN21mN zAdpjkj>8;Kkr^@v+)l-_`f?zg^S@FDRK@e>SiN(FoqtM0>;GCE=;c6(W1-rw^r~(| z6(gMU-}Q#DUW{9j9SGEc&Ai*$?#}_$3zWWV{|`$n|9qugEm!o0ok{Dz!~6a0X3w6B z0o-|XuMMzp`T9Tuin+D%4gis{$&6^ngn~Lk? z=E12nI#aMiE?w1AG1Qoz^YkB|HT6NI4fHfMh<_N+X+UWcfYEFmS#$vJz?6vNRJ@|3 zKH#^HD(2Di2@ap$k5g?hHQT_IEhf)pajFe{bEQ{U=}%k&ZhHr1PXNT>;eZZ&Ty@#Z ze+%5Wuo}c0`Omr$`LSR2nga7sF0OA>di^61fgkTZZX7;+Fr+`I^=cp)n}DnsJOThb zzC!w<9c2xlGl&>~?&}98g6psL!>f{E%m@FU#Gc-K)pli<@h}*hFFZUG>EH98&3!9# Tg-5g500000NkvXXu0mjfq;94P diff --git a/src/main/resources/assets/create/textures/block/display_cloth/white.png b/src/main/resources/assets/create/textures/block/display_cloth/white.png index 33b21e69df6642c2db94c326942759819109546b..0caab0f064f2f4ba82e4eaa2f9b58a72a4a29a00 100644 GIT binary patch delta 744 zcmV0cmPoG-XUUAvLsrw55~6@9pDH3eYD?4DUC>u(tp7QJ_K;=+kh66u71p* zl!wE0u*MN%`8MF^=^Ujz0FvYkCEgl`;^ayE6D3{|8Rd~AXPq~o4Jnl277tN5faQRV zj3%&~5y>s@0zd2>x;a)JIvApqwvlkS($>GUcY$8Zx#U%j%gEGu&3_y4vm|QI`6|aY z>?`in#5QU`RDZr!1LcO4co@>61{!uTsohK$_+fb9=G5l6de6%mfc6^c0$nUx< zqXukbwp#-;t9WfS(9HRb=zvwcdX87`xvdE?mHno4psfb{ruNr#U>neDIltm=ShMRb zM4+w%X*{)t)*4vd1*N_2|Ib3bdh=T5(Yc)%jd$($=6`&f-~GGyY(w(=1?Fp}gpC(fRrQNQWLl9GS!K&(t z0m?2qORM_G&B9r@$u~hmaRISXI!z(VKq0%bl3`VA*J}P<;RoR!UN}O;5cKvC$?S29o3tYP^mtKfjW1+<+I1?1@ae za3Wx`OAuot&}#1(0RR@~pQOv!T<1@qi;v<~)2i=|o8}v1wOIGt@&AMRo4nOA+`ZH3 a@A)qmVjA#Ky6%Vo0000G+wh0C-)US;0J>fv_C*8jYxsg!7Y3Q;D6Zn0WBu09%fL=!{Itu zMkbe>nLsr&6$1Wzbo9P2T3{Tyh+8j6Ud0hjrxkmaxmy0$zb#mOP0UMe9 z*1*gv-liJp=KM}{z$#ul$JKjoYeGz8zbhTsR0Doj`&&A&59qa=|KV;}v+F%XpsfR0 zGPQ<{HBj9JwY}~C&qBR=^IGQdwVfDG4(<2u{3gH04}Tvifafn?2*9%^Pq%7N{EN5e z031xlOpYdeyZp-JXks1WS?v6v=J71%CZ5~*AD7>^d2X|T^LOt7SS^ZM;wfy_S55i--aEyo{h>j5{@S`I{j6Hd6uX$|`II#$>^cpJN>!1sc&J(0;4PE!O-z5+2e0vqiWv={B(pe(LGNuRO1 z&Nk5HM|rDhHE_q<<~w7vSpVDc|ASgxe-RPWyz{VCHIEJ-^!j`L8_UcQ?5A?%H~;_u M07*qoM6N<$f;NX~M*si- diff --git a/src/main/resources/assets/create/textures/block/display_cloth/yellow.png b/src/main/resources/assets/create/textures/block/display_cloth/yellow.png index 345a7214d17b43c059665382d1fb459fc820800f..2fabfc8d5efcce40f222fa9ee7c08e89139ec644 100644 GIT binary patch delta 800 zcmV+*1K<3t2Db)~B!B)%L_t(oh2@veOH@%5$3O1}lk>x;1R9M<(W1b05p8lC6x6m1 z3xvSGpjDd+qQ4*z+C=20g+W3XE^HG)w961f2+`8f(x)?HgZJGQ@4frpee)*EH!h;@ z=Faz?J9o}K=iKi-V{E>^Dy{Mmh$>=b0x4YV@-RTe`$v(D3V+_(RFl2y^teF=*j9N6 zGk*-MB2v^aay{w1GytI4eT--MeN5S?_?w9;hE+i0xt=DDs4CtL*xrw~7*+v*-Q_13 zmea(+Kl$$BBMi&&BV!fVU4D|;0aG@XqHtRdQn&z$11d5`u1`7Rr>8Ho1Ge2is^{1$ zV3r2JDym3m+8j7aPFq7eIexTrc2e`R`Yis+?U@LziMlfJk^1@*-rrM)aw9ruL*8|&3!mq;jc<C5L(ekhKMWvT)*$I6qhEJayXuaA)sG z0B7J{DsLG9qi|elyO+=bfv)`mT^GdnnLSUq7i_WmLfz|l7mTPzU2v=`1|aC7z4g~> zBX8@2wsDfTf(fw)2z>c%Q~&}Qb|O&<+qKyGtbeer-piO>XMCkQas?@BSceBeRMp8t zd&omON3Q|T0I<5x2U||2@|F&W^=YMO;fcdghg_^Yk3Ccok3(#{`7LkhfZ2Ucoygms z)gs{4zksN!2&CGBhGf4H0AS@nND)!sx`#*j@nⅅK*k0}$}>IdrQ`dw+km%bvfvBuD^T7N)V% zmqBLHs)0z2_U5?>fQa40Qj-0#bgS%rOw|!GLxiVByEv+D_#j}nf4xJ<3;;(viwNm- zaqv!lRC+QFZ3p3&4qCYYh65%tA~j~5@zOJv*a6!fpNr;LX0UP- zAhRYC5iYZ4y?hbgooA-0(N_UwRg@tIW}SUdAKG9QUl8EssZ02 zAsuvU+pB??UAM}{nIy37!b~)$evZvO4{E@3DqbTAbpVLuG?L?34fv56Xbq_SHKTYv zYao{MbI}1`@gh0y+;dYCsvg+SO9y(@K$rH1bil&^b$=j!&*N`HmpwI_Xmg0^fZAO) zhMqOhc?*1dc>O;M@p}D@uDMk+k#mO4-|_ig>!v2}3V?;@&osd7gNJ=JDE8*(A^=$@ zhm&{MDQ)BA1BG)dZsZ3(cPlP+w`S&ll)m?~Z{R?2;|lb9_NJQoumdpVweLKPL z_xE&?G5(!?U;*Y`w=&lw<8kxx(Z?YAgZ~er@^Mz9s==LyzN&fT_DZ6E&;J5f00000NkvXXu0mjf8$o?| From 9a3e69ab244f0a6c297d5c063406ef50265bd664 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Sat, 2 Nov 2024 14:58:15 +0100 Subject: [PATCH 105/515] Fresh batch of baked Strings - Transfer temporary components to lang file --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 6 +- .../resources/assets/create/lang/en_ud.json | 116 ++++++++++++- .../resources/assets/create/lang/en_us.json | 116 ++++++++++++- .../content/logistics/AddressEditBox.java | 10 +- .../displayCloth/DisplayClothBlockEntity.java | 12 +- .../displayCloth/DisplayClothBlockItem.java | 2 +- .../displayCloth/ShoppingListItem.java | 12 +- .../factoryBoard/FactoryPanelBehaviour.java | 30 ++-- .../factoryBoard/FactoryPanelBlock.java | 2 +- .../factoryBoard/FactoryPanelBlockItem.java | 2 +- .../FactoryPanelConnectionHandler.java | 22 +-- .../factoryBoard/FactoryPanelScreen.java | 162 ++++++++++-------- .../packagePort/PackagePortBlockEntity.java | 2 +- .../LogisticallyLinkedBehaviour.java | 2 +- .../RedstoneRequesterScreen.java | 55 +++--- .../StockKeeperCategoryScreen.java | 46 ++--- .../stockTicker/StockTickerBlockEntity.java | 11 +- .../StockTickerInteractionHandler.java | 14 +- .../stockTicker/StockTickerRequestScreen.java | 55 +++--- .../assets/create/lang/default/interface.json | 126 ++++++++++++-- 20 files changed, 565 insertions(+), 238 deletions(-) diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index d4179532f7..01ea8767b5 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-11-01T10:40:15.7618068 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-11-02T14:53:35.7518171 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -638,8 +638,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -d5bb760251e65801c7d8d4c7c99149dfc644ae26 assets/create/lang/en_ud.json -71537c153c046d7ac132c20ed36db50daf6e7284 assets/create/lang/en_us.json +e486a51e2a706036e2bf48fc22f50a69eba6cace assets/create/lang/en_ud.json +fa8ca9eada8b6e36ea44e6b557a1106c4b43aeb0 assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 55604f9b22..4899795981 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -918,6 +918,7 @@ "create.chain_conveyor.too_steep": "dǝǝʇs ooʇ ǝdoןS", "create.chain_conveyor.valid_connection": "✔ ʇɔǝuuoƆ uɐƆ", "create.clipboard.actions": "suoıʇɔⱯ pɹɐoqdıןƆ", + "create.clipboard.address_added": "pɹɐoqdıןƆ oʇ pǝppɐ ,%1$s,", "create.clipboard.copied_from": "%1$s ɯoɹɟ sbuıʇʇǝs buıʎdoƆ", "create.clipboard.copied_from_clipboard": "pɹɐoqdıןƆ ɯoɹɟ sǝıɹʇuǝ pǝppⱯ", "create.clipboard.copy_other_clipboard": "pɹɐoqdıןƆ sıɥʇ ɯoɹɟ sǝıɹʇuǝ ʎdoƆ oʇ %1$s", @@ -990,6 +991,11 @@ "create.crafting_blueprint.manually_assigned": "pǝubıssɐ ʎןןɐnuɐW", "create.crafting_blueprint.optional": "ןɐuoıʇdO", "create.crafting_blueprint.secondary_display_slot": "ʇoןS ʎɐןdsıᗡ ʎɹɐpuoɔǝS", + "create.display_cloth.hand_to_shop_keeper": "ɹǝdǝǝʞ doɥs ɐ oʇ sıɥʇ puɐH", + "create.display_cloth.shop_configured": "pǝɹnbıɟuoɔ doɥs ɯǝʇI", + "create.display_cloth.shopping_list_discarded": "pǝpɹɐɔsıp ʇsıן buıddoɥS", + "create.display_cloth.sneak_click_discard": "pɹɐɔsıp oʇ ʞɔıןƆ-ʞɐǝuS", + "create.display_cloth.total_cost": " :ʇsoɔ ןɐʇo⟘", "create.display_link.attached_side": "ǝpıs pǝɥɔɐʇʇɐ uo ʞɔoןᗺ", "create.display_link.clear": "uoıʇɔǝןǝs uoıʇısod pǝɹɐǝןƆ", "create.display_link.display_on": ":oʇ ɐʇɐp ǝʇıɹM", @@ -1074,7 +1080,21 @@ "create.elevator_contact.floor_description": "uoıʇdıɹɔsǝᗡ ɹooןℲ", "create.elevator_contact.floor_identifier": "ɹǝıɟıʇuǝpI ɹooןℲ", "create.elevator_contact.title": "ʇɔɐʇuoƆ ɹoʇɐʌǝןƎ", + "create.factory_panel.click_second_panel": "˙˙˙ʇɔǝuuoɔ oʇ ןǝuɐd puoɔǝs ɐ ʞɔıןƆ", "create.factory_panel.click_to_configure": "ǝdıɔǝɹ ɐ ʎɟıɔǝds oʇ ʞɔıןƆ", + "create.factory_panel.connection_aborted": "pǝʇɹoqɐ uoıʇɔǝuuoɔ ʇnduI", + "create.factory_panel.cycled_arrow_path": "%1$s ǝpoɯ buıɥʇɐd ʍoɹɹɐ pǝןɔʎƆ", + "create.factory_panel.in_progress": ")ssǝɹboɹԀ uI(", + "create.factory_panel.input_in_restock_mode": "ǝpoɯ ʞɔoʇsǝɹ uı ǝq ʇouuɐɔ ןǝuɐd ʇnduI", + "create.factory_panel.new_factory_task": "ʞsɐʇ ʎɹoʇɔɐɟ ʍǝN", + "create.factory_panel.no_item": "ʇsɹıɟ ɯǝʇı uɐ ǝʌɐɥ ʇsnɯ ןǝuɐd ʇnduI", + "create.factory_panel.panels_connected": "%2$s ǝʇɐǝɹɔ oʇ %1$s buısn ʍoN", + "create.factory_panel.same_orientation": "uoıʇɐʇuǝıɹo ǝɯɐs ǝɥʇ ǝʌɐɥ ʇsnɯ sןǝuɐԀ", + "create.factory_panel.same_surface": "ǝɔɐɟɹns ǝɯɐs ǝɥʇ uo ǝq ʇsnɯ sןǝuɐԀ", + "create.factory_panel.some_links_unloaded": "pǝpɐoן ʇou ǝɹɐ sʞuıן ǝɯoS", + "create.factory_panel.target_amount": "ǝbɐɹoʇS uı ʇunoɯⱯ ʇǝbɹɐ⟘", + "create.factory_panel.too_far_apart": "ɹǝɥʇo ɥɔɐǝ ɯoɹɟ ʎɐʍɐ ɹɐɟ ooʇ ǝɹɐ sןǝuɐԀ", + "create.factory_panel.tune_before_placing": "buıɔɐןd ǝɹoɟǝq ɹǝʇʇıɯsuɐɹʇ ɐ oʇ ǝun⟘", "create.flap_display.cycles.alphabet": "Z؛ʎ؛X؛Λ؛∩؛⟘؛S؛ᴚ؛Ὁ؛Ԁ؛O؛N؛W؛Ꞁ؛ʞ؛ſ؛I؛H؛⅁؛Ⅎ؛Ǝ؛ᗡ؛Ɔ؛ᗺ؛Ɐ؛ ", "create.flap_display.cycles.arrival_time": "sϛㄣ؛s0Ɛ؛sϛƖ؛ʍou؛uıɯ ؛ ", "create.flap_display.cycles.fluid_units": " ᗺ؛ᗺɯ", @@ -1110,6 +1130,11 @@ "create.generic.unit.stress": "ns", "create.generic.unit.ticks": "sʞɔı⟘", "create.generic.width": "ɥʇpıM", + "create.gui.address_box.clipboard_tip": "ʞɔɐɹ⟘ buıdǝǝʞ", + "create.gui.address_box.clipboard_tip_1": "uo ,#, ɥʇıʍ buıʇɹɐʇs sǝıɹʇuƎ", + "create.gui.address_box.clipboard_tip_2": "ןןıʍ spɹɐoqdıןɔ ʎqɹɐǝu ɹo pןǝɥ", + "create.gui.address_box.clipboard_tip_3": "˙ʇnduı sıɥʇ ǝʇǝןdɯoɔ-oʇnɐ dןǝɥ", + "create.gui.address_box.clipboard_tip_4": ")ʎɹoʇɔɐɟ# 'ǝbɐɹoʇs# ˙b˙ǝ(", "create.gui.adjustable_crate.storageSpace": "ǝɔɐdS ǝbɐɹoʇS", "create.gui.adjustable_crate.title": "ǝʇɐɹƆ ǝןqɐʇsnظpⱯ", "create.gui.assembly.exception": ":ǝןqɯǝssɐ oʇ ǝןqɐun sɐʍ uoıʇdɐɹʇuoƆ sıɥ⟘", @@ -1146,6 +1171,43 @@ "create.gui.config.overlay8": "uoıʇısod ʇןnɐɟǝp ǝɥʇ oʇ ʇǝsǝɹ oʇ", "create.gui.contraptions.network_overstressed": "˙‾ʇɔɐdɯı‾ ‾ssǝɹʇs‾ ɥbıɥ ɐ ɥʇıʍ sʇuǝuodɯoɔ ǝɥʇ ‾uʍop‾ ‾ʍoןs‾ ɹo sǝɔɹnos ǝɹoɯ ppⱯ ˙‾pǝssǝɹʇsɹǝʌo‾ sı uoıʇdɐɹʇuoɔ sıɥʇ ʇɐɥʇ sɹɐǝddɐ ʇI", "create.gui.contraptions.not_fast_enough": "˙‾pǝǝds‾ ‾ɥbnouǝ‾ ɥʇıʍ buıʇɐʇoɹ ‾ʇou‾ sı %1$s sıɥʇ ʇɐɥʇ sɹɐǝddɐ ʇI", + "create.gui.factory_panel.connect_input": "ןǝuɐd ʇnduı uɐ ʇɔǝuuoƆ", + "create.gui.factory_panel.empty_panel": "ןǝuɐd ʎʇdɯƎ", + "create.gui.factory_panel.expected_output": "%1$s ʇɔǝdxƎ", + "create.gui.factory_panel.expected_output_tip": "buıuɹnʇǝɹ ʇndʇno ɟo ʇunoɯɐ ǝɥ⟘", + "create.gui.factory_panel.expected_output_tip_1": "ʇsǝnbǝɹ ןnɟssǝɔɔns ɥɔɐǝ ɹǝʇɟɐ", + "create.gui.factory_panel.expected_output_tip_2": "ǝbuɐɥɔ oʇ ןןoɹɔS", + "create.gui.factory_panel.left_click_disconnect": "ʇɔǝuuoɔsıp oʇ ʞɔıןƆ-ʇɟǝꞀ", + "create.gui.factory_panel.left_click_reset": "ʇǝsǝɹ oʇ ʞɔıןƆ-ʇɟǝꞀ", + "create.gui.factory_panel.no_open_promises": "sǝsıɯoɹd uǝdo oN", + "create.gui.factory_panel.promise_prevents_oversending": "˙buıpuǝs-ɹǝʌo sʇuǝʌǝɹd sıɥ⟘", + "create.gui.factory_panel.promised_items": "sɯǝʇı pǝsıɯoɹԀ", + "create.gui.factory_panel.promises_do_not_expire": "ǝɹıdxǝ ʇou op sǝsıɯoɹԀ", + "create.gui.factory_panel.promises_expire_title": "ɹǝʇɟɐ ǝɹıdxǝ sǝsıɯoɹԀ", + "create.gui.factory_panel.recipe_address": "˙˙˙oʇ sʇnduı puǝS", + "create.gui.factory_panel.recipe_address_given": "oʇ sʇnduı buıpuǝS", + "create.gui.factory_panel.recipe_address_tip": "ǝɹǝɥʍ ssǝɹppɐ uɐ ɹǝʇuƎ", + "create.gui.factory_panel.recipe_address_tip_1": "˙ʇno pǝıɹɹɐɔ sı ǝdıɔǝɹ sıɥʇ", + "create.gui.factory_panel.recipe_promises_tip": "ǝsıɯoɹd ɐ 'ʇuǝs ǝɹɐ sʇnduı uǝɥM", + "create.gui.factory_panel.recipe_promises_tip_1": "˙ǝʌıɹɹɐ sʇndʇno ןıʇun pןǝɥ sı", + "create.gui.factory_panel.restocker_address": "˙˙˙oʇ sɯǝʇı puǝS", + "create.gui.factory_panel.restocker_address_given": "oʇ buıpuǝS", + "create.gui.factory_panel.restocker_address_tip": "ןןıʍ ʇɐɥʇ ssǝɹppɐ uɐ ɹǝʇuƎ", + "create.gui.factory_panel.restocker_address_tip_1": "˙ǝɹǝɥ ǝʌıɹɹɐ oʇ sǝbɐʞɔɐd ǝsnɐɔ", + "create.gui.factory_panel.restocker_promises_tip": "ǝsıɯoɹd ɐ 'ʇuǝs ǝɹɐ sɯǝʇı uǝɥM", + "create.gui.factory_panel.restocker_promises_tip_1": "˙ǝʌıɹɹɐ ʎǝɥʇ ןıʇun pןǝɥ sı", + "create.gui.factory_panel.scroll_to_change_amount": "ʇunoɯɐ ǝbuɐɥɔ oʇ ןןoɹɔS", + "create.gui.factory_panel.send_item": "%1$s puǝS", + "create.gui.factory_panel.sending_item": "%1$s buıpuǝS", + "create.gui.factory_panel.sending_item_tip": "ןǝʌǝן ʞɔoʇs ןɐɔoן ɹǝʌǝuǝɥʍ", + "create.gui.factory_panel.sending_item_tip_1": "ʇunoɯɐ ʇǝbɹɐʇ ǝɥʇ ʍoןǝq sı", + "create.gui.factory_panel.storage_level": "ןǝʌǝן ǝbɐɹoʇS", + "create.gui.factory_panel.storage_level_and_target": "ʇǝbɹɐʇ puɐ ןǝʌǝן ǝbɐɹoʇS", + "create.gui.factory_panel.storage_level_tip": "ʇǝs ǝq uɐɔ ʇunoɯɐ pǝʇǝbɹɐ⟘", + "create.gui.factory_panel.storage_level_tip_1": "ʇoןs ɹǝʇןıɟ ǝɥʇ buısn ʎq", + "create.gui.factory_panel.storage_level_tip_2": "ǝɔɐɟɹǝʇuı sıɥʇ ɟo ǝpısʇno", + "create.gui.factory_panel.title_as_recipe": "sbuıʇʇǝS ǝdıɔǝᴚ", + "create.gui.factory_panel.title_as_restocker": "sbuıʇʇǝS ɹǝʞɔoʇsǝᴚ", "create.gui.filter.allow_list": "ʇsıꞀ-ʍoןןⱯ", "create.gui.filter.allow_list.description": "˙buıɥʇʎɹǝʌǝ sʇɔǝظǝɹ ʇsıꞀ-ʍoןןⱯ ʎʇdɯǝ uⱯ ˙ǝʌoqɐ ǝɥʇ ɟo ʎuɐ ɥɔʇɐɯ ʎǝɥʇ ɟı ssɐd sɯǝʇI", "create.gui.filter.deny_list": "ʇsıꞀ-ʎuǝᗡ", @@ -1168,6 +1230,12 @@ "create.gui.package_port.not_targeting_anything": "buıɥʇʎuɐ buıʇǝbɹɐʇ ʇou sı ʇɹod ǝbɐʞɔɐԀ", "create.gui.package_port.send_and_receive": "sǝbɐʞɔɐd ǝʌıǝɔǝɹ puɐ puǝS", "create.gui.package_port.send_only": "sǝbɐʞɔɐd puǝs ʎןuO", + "create.gui.redstone_requester.allow_partial": "sɹǝpɹo ןɐıʇɹɐd ʍoןןⱯ", + "create.gui.redstone_requester.dont_allow_partial": "sɯǝʇı ןןɐ puǝs ʇsnW", + "create.gui.redstone_requester.requester_address": "˙˙˙oʇ ɹǝpɹo puǝS", + "create.gui.redstone_requester.requester_address_given": "oʇ ɹǝpɹo buıpuǝS", + "create.gui.redstone_requester.requester_address_tip": "sıɥʇ ssǝɹppɐ ǝɥʇ ɹǝʇuƎ", + "create.gui.redstone_requester.requester_address_tip_1": "˙oʇ puǝs ǝq pןnoɥs ɹǝpɹo", "create.gui.schedule.add_condition": "uoıʇıpuoƆ ppⱯ", "create.gui.schedule.add_entry": "uoıʇɔⱯ ppⱯ", "create.gui.schedule.alternative_condition": "uoıʇıpuoƆ ǝʌıʇɐuɹǝʇןⱯ", @@ -1233,15 +1301,32 @@ "create.gui.sequenced_gearshift.speed.forward_fast": "spɹɐʍɹoℲ 'pǝǝds ǝןqnoᗡ", "create.gui.sequenced_gearshift.title": "ʇɟıɥsɹɐǝ⅁ pǝɔuǝnbǝS", "create.gui.speedometer.title": "pǝǝdS uoıʇɐʇoᴚ", - "create.gui.stock_ticker.checking_stocks": "˙˙˙sʞɔoʇs buıʞɔǝɥƆ", - "create.gui.stock_ticker.confirm_order": "ɹǝpɹO ɯɹıɟuoƆ", - "create.gui.stock_ticker.inventories_empty": "ʎʇdɯƎ ǝɹɐ sǝıɹoʇuǝʌuI pǝʞuıꞀ", - "create.gui.stock_ticker.no_packagers_linked": "pǝʞuıꞀ sɹǝbɐʞɔɐԀ oN", - "create.gui.stock_ticker.no_search_results": "punoɟ sɯǝʇı buıɥɔʇɐɯ oN", - "create.gui.stock_ticker.package_adress": "ssǝɹppⱯ ǝbɐʞɔɐԀ", - "create.gui.stock_ticker.program_requester": "ɹǝʇsǝnbǝᴚ ɯɐɹboɹԀ", - "create.gui.stock_ticker.request_sent": "¡ʇuǝS ʇsǝnbǝᴚ", - "create.gui.stock_ticker.search_items": "sɯǝʇI ɥɔɹɐǝS", + "create.gui.stock_keeper.checking_stocks": "˙˙˙sʞɔoʇs buıʞɔǝɥƆ", + "create.gui.stock_keeper.configure": "ǝɹnbıɟuoƆ", + "create.gui.stock_keeper.confirm_order": "ɹǝpɹO ɯɹıɟuoƆ", + "create.gui.stock_keeper.inventories_empty": "ʎʇdɯƎ ǝɹɐ sǝıɹoʇuǝʌuI pǝʞuıꞀ", + "create.gui.stock_keeper.network_lock_tip": "sɹǝʎɐןԀ ɹǝɥʇo sʇuǝʌǝɹd buıʞɔoꞀ", + "create.gui.stock_keeper.network_lock_tip_1": "ʎןʇɔǝɹıp sɯǝʇı buıɹǝpɹo ɯoɹɟ", + "create.gui.stock_keeper.network_lock_tip_2": "ǝןbboʇ oʇ ʞɔıןƆ", + "create.gui.stock_keeper.network_locked": "pǝʞɔoן sı ʞɹoʍʇǝN", + "create.gui.stock_keeper.network_open": "uǝdo sı ʞɹoʍʇǝN", + "create.gui.stock_keeper.no_packagers_linked": "pǝʞuıꞀ sɹǝbɐʞɔɐԀ oN", + "create.gui.stock_keeper.no_search_results": "punoɟ sɯǝʇı buıɥɔʇɐɯ oN", + "create.gui.stock_keeper.package_adress": "ssǝɹppⱯ ǝbɐʞɔɐԀ", + "create.gui.stock_keeper.program_requester": "ɹǝʇsǝnbǝᴚ ɯɐɹboɹԀ", + "create.gui.stock_keeper.request_sent": "¡ʇuǝS ʇsǝnbǝᴚ", + "create.gui.stock_keeper.search_items": "sɯǝʇI ɥɔɹɐǝS", + "create.gui.stock_keeper.send": "puǝS", + "create.gui.stock_keeper.title": "ɹǝdǝǝʞ ʞɔoʇS", + "create.gui.stock_keeper.unsorted_category": "pǝʇɹosu∩", + "create.gui.stock_ticker.category_editor": "ɹoʇıpƎ ʎɹobǝʇɐƆ", + "create.gui.stock_ticker.category_filter": "ɹǝʇןıℲ ʎɹobǝʇɐƆ", + "create.gui.stock_ticker.category_filter_tip": "ɹǝʇןıℲ ǝʇnqıɹʇʇⱯ ɹo ʇsıꞀ ɐ ǝɔɐןԀ", + "create.gui.stock_ticker.category_filter_tip_1": "pǝpnןɔuı ǝɹɐ sɯǝʇı ɥɔıɥʍ ʎɟıɔǝds oʇ", + "create.gui.stock_ticker.category_name": "ǝɯɐN ʎɹobǝʇɐƆ", + "create.gui.stock_ticker.delete_category": "ʎɹobǝʇɐƆ ǝʇǝןǝᗡ", + "create.gui.stock_ticker.empty_category_name_placeholder": ")ʎʇdɯƎ(", + "create.gui.stock_ticker.new_category": "ʎɹobǝʇɐƆ ʍǝN", "create.gui.stressometer.capacity": "ʎʇıɔɐdɐƆ buıuıɐɯǝᴚ", "create.gui.stressometer.no_rotation": "uoıʇɐʇoᴚ oN", "create.gui.stressometer.overstressed": "pǝssǝɹʇsɹǝʌO", @@ -1390,6 +1475,7 @@ "create.linked_controller.press_keybind": "ʎǝʞ ǝʌıʇɔǝdsǝɹ ǝɥʇ oʇ ʎɔuǝnbǝɹɟ sıɥʇ puıq oʇ '%6$s ɹo %5$s '%4$s '%3$s '%2$s '%1$s ssǝɹԀ", "create.logistically_linked.connected": "ʎןןnɟssǝɔɔns sɹǝʇʇıɯsuɐɹ⟘ ɹǝɥʇo oʇ pǝʇɔǝuuoƆ", "create.logistically_linked.new_network_started": "pǝʇɹɐʇs ʞɹoʍʇǝu ɹǝʇʇıɯsuɐɹʇ ʍǝN", + "create.logistically_linked.protected": "pǝʇɔǝʇoɹԀ sı ʞɹoʍʇǝN sɔıʇsıboꞀ", "create.logistically_linked.tooltip": "pǝɹnbıɟuoɔ ʎɔuǝnbǝɹℲ", "create.logistically_linked.tooltip_clear": "ʇǝsǝɹ oʇ pıɹb buıʇɟɐɹɔ uı ǝɔɐןԀ", "create.logistically_linked.tuned": "ɹǝʇʇıɯsuɐɹʇ sıɥʇ oʇ pǝun⟘", @@ -2570,6 +2656,18 @@ "create.station.train_map_color": "sdɐW uo ɹoןoƆ", "create.station.train_not_aligned": "'ǝןqɯǝssɐsıp ʇouuɐƆ", "create.station.train_not_aligned_1": "pǝubıןɐ sǝbɐıɹɹɐɔ ןןɐ ʇou", + "create.stock_keeper.cash_register_full": "ɹǝʇsıbǝᴚ ɥsɐƆ uı ǝɔɐds ɥbnouǝ ʇoN :pǝןןǝɔuɐɔ ǝsɐɥɔɹnԀ", + "create.stock_keeper.keeper_missing": "buıssıɯ ɹǝdǝǝʞ ʞɔoʇS", + "create.stock_keeper.limited_stock": "ǝןqɐןıɐʌɐ ʞɔoʇs pǝʇıɯıꞀ", + "create.stock_keeper.locked": "pǝʞɔoן uǝǝq sɐɥ ssǝɔɔɐ ʇɔǝɹıp 'ʇsıן buıddoɥS ɐ buısn ʇɔɐɹǝʇuI", + "create.stock_keeper.no_price_set": "ʇsɹıɟ ǝɔıɹd ɐ ʇǝs ʇsnɯ ɹǝuʍo doɥS", + "create.stock_keeper.out_of_stock": "ʞɔoʇS ɟo ʇnO", + "create.stock_keeper.shopping_list_empty_hand": "ʇsıן buıddoɥs ɐ ʇɹɐʇs oʇ pǝɹınbǝɹ puɐɥ ʎʇdɯƎ", + "create.stock_keeper.stock_level_too_low": "pǝʇɔǝdxǝ uɐɥʇ ɹǝʍoן sןǝʌǝן ʞɔoʇS :pǝןןǝɔuɐɔ ǝsɐɥɔɹnԀ", + "create.stock_keeper.too_broke": "ǝsɐɥɔɹnd sıɥʇ pɹoɟɟɐ ʇouuɐɔ noʎ", + "create.stock_keeper.use_list_to_add_purchases": "ǝsɐɥɔɹnd ɹnoʎ oʇ ǝɹoɯ ppɐ oʇ ʇsıן sıɥʇ ǝs∩", + "create.stock_ticker.click_to_retrieve": "ǝʌǝıɹʇǝɹ oʇ ʞɔıןƆ", + "create.stock_ticker.contains_payments": ":sʇuǝɯʎɐd suıɐʇuoƆ", "create.subtitle.blaze_munch": "sǝɥɔunɯ ɹǝuɹnᗺ ǝzɐןᗺ", "create.subtitle.cardboard_bonk": "ʞuoq ʇuɐuosǝᴚ", "create.subtitle.cogs": "ǝןqɯnɹ sןǝǝɥʍboƆ", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index a944be551c..ea174be658 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -918,6 +918,7 @@ "create.chain_conveyor.too_steep": "Slope too steep", "create.chain_conveyor.valid_connection": "Can Connect ✔", "create.clipboard.actions": "Clipboard Actions", + "create.clipboard.address_added": "'%1$s' added to Clipboard", "create.clipboard.copied_from": "Copying settings from %1$s", "create.clipboard.copied_from_clipboard": "Added entries from Clipboard", "create.clipboard.copy_other_clipboard": "%1$s to Copy entries from this Clipboard", @@ -990,6 +991,11 @@ "create.crafting_blueprint.manually_assigned": "Manually assigned", "create.crafting_blueprint.optional": "Optional", "create.crafting_blueprint.secondary_display_slot": "Secondary Display Slot", + "create.display_cloth.hand_to_shop_keeper": "Hand this to a shop keeper", + "create.display_cloth.shop_configured": "Item shop configured", + "create.display_cloth.shopping_list_discarded": "Shopping list discarded", + "create.display_cloth.sneak_click_discard": "Sneak-Click to discard", + "create.display_cloth.total_cost": "Total cost: ", "create.display_link.attached_side": "Block on attached side", "create.display_link.clear": "Cleared position selection", "create.display_link.display_on": "Write data to:", @@ -1074,7 +1080,21 @@ "create.elevator_contact.floor_description": "Floor Description", "create.elevator_contact.floor_identifier": "Floor Identifier", "create.elevator_contact.title": "Elevator Contact", + "create.factory_panel.click_second_panel": "Click a second panel to connect...", "create.factory_panel.click_to_configure": "Click to specify a recipe", + "create.factory_panel.connection_aborted": "Input connection aborted", + "create.factory_panel.cycled_arrow_path": "Cycled arrow pathing mode %1$s", + "create.factory_panel.in_progress": "(In Progress)", + "create.factory_panel.input_in_restock_mode": "Input panel cannot be in restock mode", + "create.factory_panel.new_factory_task": "New factory task", + "create.factory_panel.no_item": "Input panel must have an item first", + "create.factory_panel.panels_connected": "Now using %1$s to create %2$s", + "create.factory_panel.same_orientation": "Panels must have the same orientation", + "create.factory_panel.same_surface": "Panels must be on the same surface", + "create.factory_panel.some_links_unloaded": "Some links are not loaded", + "create.factory_panel.target_amount": "Target Amount in Storage", + "create.factory_panel.too_far_apart": "Panels are too far away from each other", + "create.factory_panel.tune_before_placing": "Tune to a transmitter before placing", "create.flap_display.cycles.alphabet": " ;A;B;C;D;E;F;G;H;I;J;K;L;M;N;O;P;Q;R;S;T;U;V;X;Y;Z", "create.flap_display.cycles.arrival_time": " ; min;now;15s;30s;45s", "create.flap_display.cycles.fluid_units": "mB;B ", @@ -1110,6 +1130,11 @@ "create.generic.unit.stress": "su", "create.generic.unit.ticks": "Ticks", "create.generic.width": "Width", + "create.gui.address_box.clipboard_tip": "Keeping Track", + "create.gui.address_box.clipboard_tip_1": "Entries starting with '#' on", + "create.gui.address_box.clipboard_tip_2": "held or nearby clipboards will", + "create.gui.address_box.clipboard_tip_3": "help auto-complete this input.", + "create.gui.address_box.clipboard_tip_4": "(e.g. #storage, #factory)", "create.gui.adjustable_crate.storageSpace": "Storage Space", "create.gui.adjustable_crate.title": "Adjustable Crate", "create.gui.assembly.exception": "This Contraption was unable to assemble:", @@ -1146,6 +1171,43 @@ "create.gui.config.overlay8": "to reset to the default position", "create.gui.contraptions.network_overstressed": "It appears that this contraption is _overstressed_. Add more sources or _slow_ _down_ the components with a high _stress_ _impact_.", "create.gui.contraptions.not_fast_enough": "It appears that this %1$s is _not_ rotating with _enough_ _speed_.", + "create.gui.factory_panel.connect_input": "Connect an input panel", + "create.gui.factory_panel.empty_panel": "Empty panel", + "create.gui.factory_panel.expected_output": "Expect %1$s", + "create.gui.factory_panel.expected_output_tip": "The amount of output returning", + "create.gui.factory_panel.expected_output_tip_1": "after each successful request", + "create.gui.factory_panel.expected_output_tip_2": "Scroll to change", + "create.gui.factory_panel.left_click_disconnect": "Left-Click to disconnect", + "create.gui.factory_panel.left_click_reset": "Left-Click to reset", + "create.gui.factory_panel.no_open_promises": "No open promises", + "create.gui.factory_panel.promise_prevents_oversending": "This prevents over-sending.", + "create.gui.factory_panel.promised_items": "Promised items", + "create.gui.factory_panel.promises_do_not_expire": "Promises do not expire", + "create.gui.factory_panel.promises_expire_title": "Promises expire after", + "create.gui.factory_panel.recipe_address": "Send inputs to...", + "create.gui.factory_panel.recipe_address_given": "Sending inputs to", + "create.gui.factory_panel.recipe_address_tip": "Enter an address where", + "create.gui.factory_panel.recipe_address_tip_1": "this recipe is carried out.", + "create.gui.factory_panel.recipe_promises_tip": "When inputs are sent, a promise", + "create.gui.factory_panel.recipe_promises_tip_1": "is held until outputs arrive.", + "create.gui.factory_panel.restocker_address": "Send items to...", + "create.gui.factory_panel.restocker_address_given": "Sending to", + "create.gui.factory_panel.restocker_address_tip": "Enter an address that will", + "create.gui.factory_panel.restocker_address_tip_1": "cause packages to arrive here.", + "create.gui.factory_panel.restocker_promises_tip": "When items are sent, a promise", + "create.gui.factory_panel.restocker_promises_tip_1": "is held until they arrive.", + "create.gui.factory_panel.scroll_to_change_amount": "Scroll to change amount", + "create.gui.factory_panel.send_item": "Send %1$s", + "create.gui.factory_panel.sending_item": "Sending %1$s", + "create.gui.factory_panel.sending_item_tip": "whenever local stock level", + "create.gui.factory_panel.sending_item_tip_1": "is below the target amount", + "create.gui.factory_panel.storage_level": "Storage level", + "create.gui.factory_panel.storage_level_and_target": "Storage level and target", + "create.gui.factory_panel.storage_level_tip": "Targeted amount can be set", + "create.gui.factory_panel.storage_level_tip_1": "by using the filter slot", + "create.gui.factory_panel.storage_level_tip_2": "outside of this interface", + "create.gui.factory_panel.title_as_recipe": "Recipe Settings", + "create.gui.factory_panel.title_as_restocker": "Restocker Settings", "create.gui.filter.allow_list": "Allow-List", "create.gui.filter.allow_list.description": "Items pass if they match any of the above. An empty Allow-List rejects everything.", "create.gui.filter.deny_list": "Deny-List", @@ -1168,6 +1230,12 @@ "create.gui.package_port.not_targeting_anything": "Package port is not targeting anything", "create.gui.package_port.send_and_receive": "Send and receive packages", "create.gui.package_port.send_only": "Only send packages", + "create.gui.redstone_requester.allow_partial": "Allow partial orders", + "create.gui.redstone_requester.dont_allow_partial": "Must send all items", + "create.gui.redstone_requester.requester_address": "Send order to...", + "create.gui.redstone_requester.requester_address_given": "Sending order to", + "create.gui.redstone_requester.requester_address_tip": "Enter the address this", + "create.gui.redstone_requester.requester_address_tip_1": "order should be send to.", "create.gui.schedule.add_condition": "Add Condition", "create.gui.schedule.add_entry": "Add Action", "create.gui.schedule.alternative_condition": "Alternative Condition", @@ -1233,15 +1301,32 @@ "create.gui.sequenced_gearshift.speed.forward_fast": "Double speed, Forwards", "create.gui.sequenced_gearshift.title": "Sequenced Gearshift", "create.gui.speedometer.title": "Rotation Speed", - "create.gui.stock_ticker.checking_stocks": "Checking stocks...", - "create.gui.stock_ticker.confirm_order": "Confirm Order", - "create.gui.stock_ticker.inventories_empty": "Linked Inventories are Empty", - "create.gui.stock_ticker.no_packagers_linked": "No Packagers Linked", - "create.gui.stock_ticker.no_search_results": "No matching items found", - "create.gui.stock_ticker.package_adress": "Package Address", - "create.gui.stock_ticker.program_requester": "Program Requester", - "create.gui.stock_ticker.request_sent": "Request Sent!", - "create.gui.stock_ticker.search_items": "Search Items", + "create.gui.stock_keeper.checking_stocks": "Checking stocks...", + "create.gui.stock_keeper.configure": "Configure", + "create.gui.stock_keeper.confirm_order": "Confirm Order", + "create.gui.stock_keeper.inventories_empty": "Linked Inventories are Empty", + "create.gui.stock_keeper.network_lock_tip": "Locking prevents other Players", + "create.gui.stock_keeper.network_lock_tip_1": "from ordering items directly", + "create.gui.stock_keeper.network_lock_tip_2": "Click to toggle", + "create.gui.stock_keeper.network_locked": "Network is locked", + "create.gui.stock_keeper.network_open": "Network is open", + "create.gui.stock_keeper.no_packagers_linked": "No Packagers Linked", + "create.gui.stock_keeper.no_search_results": "No matching items found", + "create.gui.stock_keeper.package_adress": "Package Address", + "create.gui.stock_keeper.program_requester": "Program Requester", + "create.gui.stock_keeper.request_sent": "Request Sent!", + "create.gui.stock_keeper.search_items": "Search Items", + "create.gui.stock_keeper.send": "Send", + "create.gui.stock_keeper.title": "Stock Keeper", + "create.gui.stock_keeper.unsorted_category": "Unsorted", + "create.gui.stock_ticker.category_editor": "Category Editor", + "create.gui.stock_ticker.category_filter": "Category Filter", + "create.gui.stock_ticker.category_filter_tip": "Place a List or Attribute Filter", + "create.gui.stock_ticker.category_filter_tip_1": "to specify which items are included", + "create.gui.stock_ticker.category_name": "Category Name", + "create.gui.stock_ticker.delete_category": "Delete Category", + "create.gui.stock_ticker.empty_category_name_placeholder": "(Empty)", + "create.gui.stock_ticker.new_category": "New Category", "create.gui.stressometer.capacity": "Remaining Capacity", "create.gui.stressometer.no_rotation": "No Rotation", "create.gui.stressometer.overstressed": "Overstressed", @@ -1390,6 +1475,7 @@ "create.linked_controller.press_keybind": "Press %1$s, %2$s, %3$s, %4$s, %5$s or %6$s, to bind this frequency to the respective key", "create.logistically_linked.connected": "Connected to other Transmitters successfully", "create.logistically_linked.new_network_started": "New transmitter network started", + "create.logistically_linked.protected": "Logistics Network is Protected", "create.logistically_linked.tooltip": "Frequency configured", "create.logistically_linked.tooltip_clear": "Place in crafting grid to reset", "create.logistically_linked.tuned": "Tuned to this transmitter", @@ -2570,6 +2656,18 @@ "create.station.train_map_color": "Color on Maps", "create.station.train_not_aligned": "Cannot disassemble,", "create.station.train_not_aligned_1": "not all carriages aligned", + "create.stock_keeper.cash_register_full": "Purchase cancelled: Not enough space in Cash Register", + "create.stock_keeper.keeper_missing": "Stock keeper missing", + "create.stock_keeper.limited_stock": "Limited stock available", + "create.stock_keeper.locked": "Interact using a Shopping list, direct access has been locked", + "create.stock_keeper.no_price_set": "Shop owner must set a price first", + "create.stock_keeper.out_of_stock": "Out of Stock", + "create.stock_keeper.shopping_list_empty_hand": "Empty hand required to start a shopping list", + "create.stock_keeper.stock_level_too_low": "Purchase cancelled: Stock levels lower than expected", + "create.stock_keeper.too_broke": "You cannot afford this purchase", + "create.stock_keeper.use_list_to_add_purchases": "Use this list to add more to your purchase", + "create.stock_ticker.click_to_retrieve": "Click to retrieve", + "create.stock_ticker.contains_payments": "Contains payments:", "create.subtitle.blaze_munch": "Blaze Burner munches", "create.subtitle.cardboard_bonk": "Resonant bonk", "create.subtitle.cogs": "Cogwheels rumble", diff --git a/src/main/java/com/simibubi/create/content/logistics/AddressEditBox.java b/src/main/java/com/simibubi/create/content/logistics/AddressEditBox.java index e867800b2e..6c967db507 100644 --- a/src/main/java/com/simibubi/create/content/logistics/AddressEditBox.java +++ b/src/main/java/com/simibubi/create/content/logistics/AddressEditBox.java @@ -84,19 +84,19 @@ public class AddressEditBox extends EditBox { pGuiGraphics.renderItem(AllBlocks.CLIPBOARD.asStack(), itemX, itemY); if (pMouseX >= itemX && pMouseX < itemX + 16 && pMouseY >= itemY && pMouseY < itemY + 16) { List promiseTip = List.of(); - promiseTip = List.of(CreateLang.temporaryText("Keeping Track") + promiseTip = List.of(CreateLang.translate("gui.address_box.clipboard_tip") .color(ScrollInput.HEADER_RGB) .component(), - CreateLang.temporaryText("Entries starting with '#' on") + CreateLang.translate("gui.address_box.clipboard_tip_1") .style(ChatFormatting.GRAY) .component(), - CreateLang.temporaryText("held or nearby clipboards will") + CreateLang.translate("gui.address_box.clipboard_tip_2") .style(ChatFormatting.GRAY) .component(), - CreateLang.temporaryText("help auto-complete this input.") + CreateLang.translate("gui.address_box.clipboard_tip_3") .style(ChatFormatting.GRAY) .component(), - CreateLang.temporaryText("(e.g. #storage, #factory)") + CreateLang.translate("gui.address_box.clipboard_tip_4") .style(ChatFormatting.DARK_GRAY) .component()); pGuiGraphics.renderComponentTooltip(Minecraft.getInstance().font, promiseTip, pMouseX, pMouseY); diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothBlockEntity.java index cba7f43f79..58b0e2a20c 100644 --- a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothBlockEntity.java @@ -152,14 +152,14 @@ public class DisplayClothBlockEntity extends SmartBlockEntity implements MenuPro } if (!itemInHand.isEmpty() && !addOntoList) { - CreateLang.temporaryText("Empty hand required to start a shopping list") + CreateLang.translate("stock_keeper.shopping_list_empty_hand") .sendStatus(player); AllSoundEvents.DENY.playOnServer(level, worldPosition); return InteractionResult.SUCCESS; } if (paymentItem.isEmpty()) { - CreateLang.temporaryText("Shop owner must set a price first") + CreateLang.translate("stock_keeper.no_price_set") .sendStatus(player); AllSoundEvents.DENY.playOnServer(level, worldPosition); return InteractionResult.SUCCESS; @@ -173,7 +173,7 @@ public class DisplayClothBlockEntity extends SmartBlockEntity implements MenuPro int stockLevel = getStockLevelForTrade(ShoppingListItem.getList(prevListItem)); if (tickerID == null) { - CreateLang.temporaryText("Stock keeper missing") + CreateLang.translate("stock_keeper.keeper_missing") .style(ChatFormatting.RED) .sendStatus(player); AllSoundEvents.DENY.playOnServer(level, worldPosition); @@ -181,7 +181,7 @@ public class DisplayClothBlockEntity extends SmartBlockEntity implements MenuPro } if (stockLevel == 0) { - CreateLang.temporaryText("Out of Stock") + CreateLang.translate("stock_keeper.out_of_stock") .style(ChatFormatting.RED) .sendStatus(player); AllSoundEvents.DENY.playOnServer(level, worldPosition); @@ -209,7 +209,7 @@ public class DisplayClothBlockEntity extends SmartBlockEntity implements MenuPro } if (list.getPurchases(worldPosition) == stockLevel) { - CreateLang.temporaryText("Limited stock available") + CreateLang.translate("stock_keeper.limited_stock") .style(ChatFormatting.RED) .sendStatus(player); AllSoundEvents.DENY.playOnServer(level, worldPosition); @@ -217,7 +217,7 @@ public class DisplayClothBlockEntity extends SmartBlockEntity implements MenuPro } else { list.addPurchases(worldPosition, 1); if (!addOntoList) - CreateLang.temporaryText("Use this list to add more to your purchase") + CreateLang.translate("stock_keeper.use_list_to_add_purchases") .color(0xeeeeee) .sendStatus(player); if (!addOntoList) diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothBlockItem.java b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothBlockItem.java index eb9fddbe54..87c9a4852b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothBlockItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothBlockItem.java @@ -32,7 +32,7 @@ public class DisplayClothBlockItem extends BlockItem { if (!isFoil(pStack)) return; - CreateLang.temporaryText("Item shop configured") + CreateLang.translate("display_cloth.shop_configured") .style(ChatFormatting.GOLD) .addTo(pTooltip); diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/ShoppingListItem.java b/src/main/java/com/simibubi/create/content/logistics/displayCloth/ShoppingListItem.java index 43b4bb55e9..09995203cc 100644 --- a/src/main/java/com/simibubi/create/content/logistics/displayCloth/ShoppingListItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/displayCloth/ShoppingListItem.java @@ -131,7 +131,7 @@ public class ShoppingListItem extends Item { if (entries.size() == 1) { BigItemStack entry = entries.get(0); - CreateLang.temporaryText(cost ? "Total cost: " : "") + (cost ? CreateLang.translate("display_cloth.total_cost") : CreateLang.text("")) .style(ChatFormatting.GOLD) .add(CreateLang.builder() .add(entry.stack.getHoverName()) @@ -142,7 +142,7 @@ public class ShoppingListItem extends Item { } else { if (cost) - CreateLang.temporaryText("Total cost: ") + CreateLang.translate("display_cloth.total_cost") .style(ChatFormatting.GOLD) .addTo(pTooltipComponents); for (BigItemStack entry : entries) { @@ -158,11 +158,11 @@ public class ShoppingListItem extends Item { } } - CreateLang.temporaryText("Hand this to a shop keeper") + CreateLang.translate("display_cloth.hand_to_shop_keeper") .style(ChatFormatting.GRAY) .addTo(pTooltipComponents); - CreateLang.temporaryText("Sneak-Click to discard") + CreateLang.translate("display_cloth.sneak_click_discard") .style(ChatFormatting.DARK_GRAY) .addTo(pTooltipComponents); } @@ -172,7 +172,7 @@ public class ShoppingListItem extends Item { if (pUsedHand == InteractionHand.OFF_HAND || pPlayer == null || !pPlayer.isShiftKeyDown()) return new InteractionResultHolder(InteractionResult.PASS, pPlayer.getItemInHand(pUsedHand)); - CreateLang.temporaryText("Shopping list discarded") + CreateLang.translate("display_cloth.shopping_list_discarded") .sendStatus(pPlayer); pPlayer.playSound(SoundEvents.BOOK_PAGE_TURN); return new InteractionResultHolder(InteractionResult.SUCCESS, ItemStack.EMPTY); @@ -186,7 +186,7 @@ public class ShoppingListItem extends Item { return InteractionResult.PASS; pPlayer.setItemInHand(pUsedHand, ItemStack.EMPTY); - CreateLang.temporaryText("Shopping list discarded") + CreateLang.translate("display_cloth.shopping_list_discarded") .sendStatus(pPlayer); pPlayer.playSound(SoundEvents.BOOK_PAGE_TURN); return InteractionResult.SUCCESS; diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java index d5043e0ef9..8bf2b59cdb 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java @@ -188,7 +188,7 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { tryRestock(); return; } - + if (recipeAddress.isBlank()) return; @@ -302,12 +302,12 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { @Override public void onShortInteract(Player player, InteractionHand hand, Direction side, BlockHitResult hitResult) { if (!Create.LOGISTICS.mayInteract(network, player)) { - player.displayClientMessage(CreateLang.temporaryText("Logistics Network is Protected") + player.displayClientMessage(CreateLang.translate("logistically_linked.protected") .style(ChatFormatting.RED) .component(), true); return; } - + if (AllItemTags.WRENCH.matches(player.getItemInHand(hand))) { int sharedMode = -1; for (FactoryPanelPosition target : targeting) { @@ -328,7 +328,7 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { char[] boxes = "\u25a1\u25a1\u25a1\u25a1".toCharArray(); boxes[sharedMode] = '\u25a0'; - player.displayClientMessage(CreateLang.temporaryText("Cycled arrow pathing mode " + new String(boxes)) + player.displayClientMessage(CreateLang.translate("factory_panel.cycled_arrow_path", new String(boxes)) .component(), true); return; @@ -562,21 +562,23 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { @Override public ValueSettingsBoard createBoard(Player player, BlockHitResult hitResult) { int maxAmount = 100; - return new ValueSettingsBoard(CreateLang.temporaryText("Target Amount in Storage") + return new ValueSettingsBoard(CreateLang.translate("factory_panel.target_amount") .component(), maxAmount, 10, - List.of(CreateLang.temporaryText("Items") + List.of(CreateLang.translate("schedule.condition.threshold.items") .component(), - CreateLang.temporaryText("Stacks") + CreateLang.translate("schedule.condition.threshold.stacks") .component()), new ValueSettingsFormatter(this::formatValue)); } @Override public MutableComponent getLabel() { - String key = "Target Amount"; + String key = ""; if (getFilter().isEmpty()) - key = "New Factory task"; + key = "factory_panel.new_factory_task"; + else if (waitingForNetwork) + key = "factory_panel.some_links_unloaded"; else if (getAmount() == 0 || targetedBy.isEmpty()) key = getFilter().getHoverName() .getString(); @@ -585,13 +587,13 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { key = getFilter().getHoverName() .getString() + " -> " + getAmount() + stacks; if (!satisfied) - key += " (In Progress)"; + key += " " + CreateLang.translate("factory_panel.in_progress") + .string(); + return CreateLang.text(key) + .component(); } - if (waitingForNetwork) - key = "Some links are not loaded"; - - return CreateLang.temporaryText(key) + return CreateLang.translate(key) .component(); } diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java index 6dae599b97..d37c86d83e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java @@ -188,7 +188,7 @@ public class FactoryPanelBlock extends FaceAttachedHorizontalDirectionalBlock if (!FactoryPanelBlockItem.isTuned(item)) { AllSoundEvents.DENY.playOnServer(pLevel, pPos); - pPlayer.displayClientMessage(CreateLang.temporaryText("Tune to a transmitter before placing") + pPlayer.displayClientMessage(CreateLang.translate("factory_panel.tune_before_placing") .component(), true); return InteractionResult.FAIL; } diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockItem.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockItem.java index 606fd337f5..83277f542a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockItem.java @@ -22,7 +22,7 @@ public class FactoryPanelBlockItem extends LogisticallyLinkedBlockItem { if (!isTuned(stack)) { AllSoundEvents.DENY.playOnServer(pContext.getLevel(), pContext.getClickedPos()); pContext.getPlayer() - .displayClientMessage(CreateLang.temporaryText("Tune to a transmitter before placing") + .displayClientMessage(CreateLang.translate("factory_panel.tune_before_placing") .component(), true); return InteractionResult.FAIL; } diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionHandler.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionHandler.java index 3d84f290f9..73ae6dca43 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionHandler.java @@ -39,7 +39,7 @@ public class FactoryPanelConnectionHandler { String checkForIssues = checkForIssues(at, panel); if (checkForIssues != null) { - player.displayClientMessage(CreateLang.temporaryText(checkForIssues) + player.displayClientMessage(CreateLang.translate(checkForIssues) .style(ChatFormatting.RED) .component(), true); connectingFrom = null; @@ -53,9 +53,9 @@ public class FactoryPanelConnectionHandler { AllPackets.getChannel() .sendToServer(new FactoryPanelConnectionPacket(panel.getPanelPosition(), connectingFrom)); - player.displayClientMessage(CreateLang.temporaryText("Now using " + filterFrom.getHoverName() - .getString() + " to create " - + filterTo.getHoverName() + player.displayClientMessage(CreateLang.translate("factory_panel.panels_connected", filterFrom.getHoverName() + .getString(), + filterTo.getHoverName() .getString()) .style(ChatFormatting.GREEN) .component(), true); @@ -75,24 +75,24 @@ public class FactoryPanelConnectionHandler { if (state1.setValue(FactoryPanelBlock.WATERLOGGED, false) .setValue(FactoryPanelBlock.POWERED, false) != state2.setValue(FactoryPanelBlock.WATERLOGGED, false) .setValue(FactoryPanelBlock.POWERED, false)) - return "Panels must have the same orientation"; + return "factory_panel.same_orientation"; if (FactoryPanelBlock.connectedDirection(state1) .getAxis() .choose(diff.getX(), diff.getY(), diff.getZ()) != 0) - return "Panels must be on the same surface"; + return "factory_panel.same_surface"; if (!diff.closerThan(BlockPos.ZERO, 16)) - return "Panels are too far away from each other"; + return "factory_panel.too_far_apart"; if (to.panelBE().restocker) - return "Input panel cannot be in restock mode"; + return "factory_panel.input_in_restock_mode"; if (to.getFilter() .isEmpty() || from.getFilter() .isEmpty()) - return "Input panel must have an item first"; + return "factory_panel.no_item"; return null; } @@ -116,7 +116,7 @@ public class FactoryPanelConnectionHandler { .colored(AnimationTickHolder.getTicks() % 16 > 8 ? 0x38b764 : 0xa7f070) .lineWidth(1 / 16f); - mc.player.displayClientMessage(CreateLang.temporaryText("Click a second panel to connect...") + mc.player.displayClientMessage(CreateLang.translate("factory_panel.click_second_panel") .component(), true); } @@ -128,7 +128,7 @@ public class FactoryPanelConnectionHandler { return false; connectingFrom = null; connectingFromBox = null; - mc.player.displayClientMessage(CreateLang.temporaryText("Input connection aborted") + mc.player.displayClientMessage(CreateLang.translate("factory_panel.connection_aborted") .component(), true); return true; } diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java index 3413f4d8d4..d9bb6c6b7c 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java @@ -89,7 +89,7 @@ public class FactoryPanelScreen extends AbstractSimiScreen { addRenderableWidget(confirmButton); promiseExpiration = new ScrollInput(x + 112, y + 54 + middleHeight(), 25, 16).withRange(-1, 31) - .titled(CreateLang.temporaryText("Promises expire after") + .titled(CreateLang.translate("gui.factory_panel.promises_expire_title") .component()); promiseExpiration.setState(behaviour.promiseClearingInterval); addRenderableWidget(promiseExpiration); @@ -101,7 +101,7 @@ public class FactoryPanelScreen extends AbstractSimiScreen { FactoryPanelConnectionHandler.startConnection(behaviour); minecraft.setScreen(null); }); - newInputButton.setToolTip(CreateLang.temporaryText("Connect an input panel") + newInputButton.setToolTip(CreateLang.translate("gui.factory_panel.connect_input") .component()); addRenderableWidget(newInputButton); } @@ -123,7 +123,8 @@ public class FactoryPanelScreen extends AbstractSimiScreen { } addressBox.tick(); promiseExpiration.titled(CreateLang - .temporaryText(promiseExpiration.getState() == -1 ? "Promises do not expire" : "Promises expire after:") + .translate(promiseExpiration.getState() == -1 ? "gui.factory_panel.promises_do_not_expire" + : "gui.factory_panel.promises_expire_title") .component()); } @@ -172,21 +173,24 @@ public class FactoryPanelScreen extends AbstractSimiScreen { if (mouseX >= outputX - 1 && mouseX < outputX - 1 + 18 && mouseY >= outputY - 1 && mouseY < outputY - 1 + 18) { - graphics.renderComponentTooltip(font, List.of(CreateLang.temporaryText("Expect ") - .add(CreateLang.itemName(outputConfig.stack) - .add(CreateLang.text(" x" + outputConfig.count))) - .color(ScrollInput.HEADER_RGB) - .component(), - CreateLang.temporaryText("The amount of output returning") - .style(ChatFormatting.GRAY) - .component(), - CreateLang.temporaryText("after each successful request") - .style(ChatFormatting.GRAY) - .component(), - CreateLang.temporaryText("Scroll to change") - .style(ChatFormatting.DARK_GRAY) - .style(ChatFormatting.ITALIC) - .component()), + graphics.renderComponentTooltip(font, + List.of( + CreateLang + .translate("gui.factory_panel.expected_output", CreateLang.itemName(outputConfig.stack) + .add(CreateLang.text(" x" + outputConfig.count)) + .string()) + .color(ScrollInput.HEADER_RGB) + .component(), + CreateLang.translate("gui.factory_panel.expected_output_tip") + .style(ChatFormatting.GRAY) + .component(), + CreateLang.translate("gui.factory_panel.expected_output_tip_1") + .style(ChatFormatting.GRAY) + .component(), + CreateLang.translate("gui.factory_panel.expected_output_tip_2") + .style(ChatFormatting.DARK_GRAY) + .style(ChatFormatting.ITALIC) + .component()), mouseX, mouseY); } } @@ -200,7 +204,8 @@ public class FactoryPanelScreen extends AbstractSimiScreen { showAddressBoxTooltip(graphics, mouseX, mouseY); // TITLE - Component title = CreateLang.temporaryText(restocker ? "Restocker Settings" : "Recipe Settings") + Component title = CreateLang + .translate(restocker ? "gui.factory_panel.title_as_restocker" : "gui.factory_panel.title_as_recipe") .component(); graphics.drawString(font, title, x + 87 - font.width(title) / 2, y + 7, 0x3D3C48, false); @@ -231,7 +236,7 @@ public class FactoryPanelScreen extends AbstractSimiScreen { // PROMISES int state = promiseExpiration.getState(); - graphics.drawString(font, CreateLang.temporaryText(state == -1 ? " /" : state == 0 ? "30s" : state + "m") + graphics.drawString(font, CreateLang.text(state == -1 ? " /" : state == 0 ? "30s" : state + "m") .component(), promiseExpiration.getX() + 3, promiseExpiration.getY() + 4, 0xffeeeeee, true); ItemStack asStack = AllItems.CARDBOARD_PACKAGE_12x12.asStack(); @@ -245,28 +250,31 @@ public class FactoryPanelScreen extends AbstractSimiScreen { List promiseTip = List.of(); if (promised == 0) { - promiseTip = List.of(CreateLang.temporaryText("No open promises") + promiseTip = List.of(CreateLang.translate("gui.factory_panel.no_open_promises") .color(ScrollInput.HEADER_RGB) .component(), CreateLang - .temporaryText(restocker ? "When items are sent, a promise" : "When inputs are sent, a promise") + .translate(restocker ? "gui.factory_panel.restocker_promises_tip" + : "gui.factory_panel.recipe_promises_tip") .style(ChatFormatting.GRAY) .component(), - CreateLang.temporaryText(restocker ? "is held until they arrive." : "is held until outputs arrive.") + CreateLang + .translate(restocker ? "gui.factory_panel.restocker_promises_tip_1" + : "gui.factory_panel.recipe_promises_tip_1") .style(ChatFormatting.GRAY) .component(), - CreateLang.temporaryText("This prevents over-sending.") + CreateLang.translate("gui.factory_panel.promise_prevents_oversending") .style(ChatFormatting.GRAY) .component()); } else { - promiseTip = List.of(CreateLang.temporaryText("Promised Items") + promiseTip = List.of(CreateLang.translate("gui.factory_panel.promised_items") .color(ScrollInput.HEADER_RGB) .component(), - CreateLang.temporaryText(behaviour.getFilter() + CreateLang.text(behaviour.getFilter() .getHoverName() .getString() + " x" + promised) .component(), - CreateLang.temporaryText("Left-Click to reset") + CreateLang.translate("gui.factory_panel.left_click_reset") .style(ChatFormatting.DARK_GRAY) .style(ChatFormatting.ITALIC) .component()); @@ -292,10 +300,10 @@ public class FactoryPanelScreen extends AbstractSimiScreen { return; if (itemStack.stack.isEmpty()) { - graphics.renderComponentTooltip(font, List.of(CreateLang.temporaryText("Empty panel") + graphics.renderComponentTooltip(font, List.of(CreateLang.translate("gui.factory_panel.empty_panel") .color(ScrollInput.HEADER_RGB) .component(), - CreateLang.temporaryText("Left-Click to disconnect") + CreateLang.translate("gui.factory_panel.left_click_disconnect") .style(ChatFormatting.DARK_GRAY) .style(ChatFormatting.ITALIC) .component()), @@ -304,49 +312,51 @@ public class FactoryPanelScreen extends AbstractSimiScreen { } if (restocker) { - graphics.renderComponentTooltip(font, List.of(CreateLang.temporaryText("Sending ") - .add(CreateLang.itemName(itemStack.stack)) - .color(ScrollInput.HEADER_RGB) - .component(), - CreateLang.temporaryText("whenever local stock level") - .style(ChatFormatting.GRAY) + graphics.renderComponentTooltip(font, + List.of(CreateLang.translate("gui.factory_panel.sending_item", CreateLang.itemName(itemStack.stack) + .string()) + .color(ScrollInput.HEADER_RGB) .component(), - CreateLang.temporaryText("is below the target amount") - .style(ChatFormatting.GRAY) - .component()), + CreateLang.translate("gui.factory_panel.sending_item_tip") + .style(ChatFormatting.GRAY) + .component(), + CreateLang.translate("gui.factory_panel.sending_item_tip_1") + .style(ChatFormatting.GRAY) + .component()), mouseX, mouseY); return; } - graphics.renderComponentTooltip(font, List.of(CreateLang.temporaryText("Send ") - .add(CreateLang.itemName(itemStack.stack) - .add(CreateLang.text(" x" + itemStack.count))) - .color(ScrollInput.HEADER_RGB) - .component(), - CreateLang.temporaryText("Scroll to change amount") - .style(ChatFormatting.DARK_GRAY) - .style(ChatFormatting.ITALIC) + graphics.renderComponentTooltip(font, + List.of(CreateLang.translate("gui.factory_panel.sending_item", CreateLang.itemName(itemStack.stack) + .add(CreateLang.text(" x" + itemStack.count)) + .string()) + .color(ScrollInput.HEADER_RGB) .component(), - CreateLang.temporaryText("Left-Click to disconnect") - .style(ChatFormatting.DARK_GRAY) - .style(ChatFormatting.ITALIC) - .component()), + CreateLang.translate("gui.factory_panel.scroll_to_change_amount") + .style(ChatFormatting.DARK_GRAY) + .style(ChatFormatting.ITALIC) + .component(), + CreateLang.translate("gui.factory_panel.left_click_disconnect") + .style(ChatFormatting.DARK_GRAY) + .style(ChatFormatting.ITALIC) + .component()), mouseX, mouseY); } private void showStockLevelTooltip(GuiGraphics graphics, int mouseX, int mouseY) { graphics.renderComponentTooltip(font, List.of( - (behaviour.count > 0 ? CreateLang.temporaryText("Storage level and target") - : CreateLang.temporaryText("Storage level")).color(ScrollInput.HEADER_RGB) + (behaviour.count > 0 ? CreateLang.translate("gui.factory_panel.storage_level_and_target") + : CreateLang.translate("gui.factory_panel.storage_level")).color(ScrollInput.HEADER_RGB) .component(), - CreateLang.temporaryText("Targeted amount can be set") + CreateLang.translate("gui.factory_panel.storage_level_tip") .style(ChatFormatting.GRAY) .component(), - CreateLang.temporaryText("by using the filter slot") + CreateLang.translate("gui.factory_panel.storage_level_tip_1") .style(ChatFormatting.GRAY) .component(), - CreateLang.temporaryText("outside of this interface") + CreateLang.translate("gui.factory_panel.storage_level_tip_2") .style(ChatFormatting.GRAY) .component()), mouseX, mouseY); @@ -356,29 +366,30 @@ public class FactoryPanelScreen extends AbstractSimiScreen { if (addressBox.getValue() .isBlank()) { if (restocker) { - graphics.renderComponentTooltip(font, List.of(CreateLang.temporaryText("Send items to...") - .color(ScrollInput.HEADER_RGB) - .component(), - CreateLang.temporaryText("Enter an address that will") - .style(ChatFormatting.GRAY) + graphics.renderComponentTooltip(font, + List.of(CreateLang.translate("gui.factory_panel.restocker_address") + .color(ScrollInput.HEADER_RGB) .component(), - CreateLang.temporaryText("cause packages to arrive here.") - .style(ChatFormatting.GRAY) - .component(), - CreateLang.translate("gui.schedule.lmb_edit") - .style(ChatFormatting.DARK_GRAY) - .style(ChatFormatting.ITALIC) - .component()), + CreateLang.translate("gui.factory_panel.restocker_address_tip") + .style(ChatFormatting.GRAY) + .component(), + CreateLang.translate("gui.factory_panel.restocker_address_tip_1") + .style(ChatFormatting.GRAY) + .component(), + CreateLang.translate("gui.schedule.lmb_edit") + .style(ChatFormatting.DARK_GRAY) + .style(ChatFormatting.ITALIC) + .component()), mouseX, mouseY); } else { - graphics.renderComponentTooltip(font, List.of(CreateLang.temporaryText("Send inputs to...") + graphics.renderComponentTooltip(font, List.of(CreateLang.translate("gui.factory_panel.recipe_address") .color(ScrollInput.HEADER_RGB) .component(), - CreateLang.temporaryText("Enter an address where") + CreateLang.translate("gui.factory_panel.recipe_address_tip") .style(ChatFormatting.GRAY) .component(), - CreateLang.temporaryText("this recipe is carried out.") + CreateLang.translate("gui.factory_panel.recipe_address_tip_1") .style(ChatFormatting.GRAY) .component(), CreateLang.translate("gui.schedule.lmb_edit") @@ -389,10 +400,13 @@ public class FactoryPanelScreen extends AbstractSimiScreen { } } else graphics.renderComponentTooltip(font, - List.of(CreateLang.temporaryText(restocker ? "Sending to" : "Sending inputs to") - .color(ScrollInput.HEADER_RGB) - .component(), - CreateLang.temporaryText("'" + addressBox.getValue() + "'") + List.of( + CreateLang + .translate(restocker ? "gui.factory_panel.restocker_address_given" + : "gui.factory_panel.recipe_address_given") + .color(ScrollInput.HEADER_RGB) + .component(), + CreateLang.text("'" + addressBox.getValue() + "'") .style(ChatFormatting.GRAY) .component()), mouseX, mouseY); diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java index b64436fd4d..96e49c6c07 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java @@ -185,7 +185,7 @@ public abstract class PackagePortBlockEntity extends SmartBlockEntity implements } page.add(new ClipboardEntry(false, Components.literal("#" + addressFilter))); - player.displayClientMessage(CreateLang.temporaryText("'" + addressFilter + "' added to Clipboard") + player.displayClientMessage(CreateLang.translate("clipboard.address_added", addressFilter) .component(), true); ClipboardEntry.saveAll(list, mainHandItem); diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java index e69d2e5381..7816e369e5 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java @@ -191,7 +191,7 @@ public class LogisticallyLinkedBehaviour extends BlockEntityBehaviour { public boolean mayInteractMessage(Player player) { boolean mayInteract = Create.LOGISTICS.mayInteract(freqId, player); if (!mayInteract) - player.displayClientMessage(CreateLang.temporaryText("Logistics Network is protected") + player.displayClientMessage(CreateLang.translate("logistically_linked.protected") .style(ChatFormatting.RED) .component(), true); return mayInteract; diff --git a/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterScreen.java b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterScreen.java index e078efd689..f7b9f76263 100644 --- a/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterScreen.java @@ -86,7 +86,7 @@ public class RedstoneRequesterScreen extends AbstractSimiContainerScreen= amounts.size()) return tooltip; - return List.of(CreateLang.temporaryText("Send ") - .add(CreateLang.itemName(pStack) - .add(CreateLang.text(" x" + amounts.get(slotIndex)))) + return List.of(CreateLang.translate("gui.factory_panel.send_item", CreateLang.itemName(pStack) + .add(CreateLang.text(" x" + amounts.get(slotIndex)))) .color(ScrollInput.HEADER_RGB) .component(), - CreateLang.temporaryText("Scroll to change amount") + CreateLang.translate("gui.factory_panel.scroll_to_change_amount") .style(ChatFormatting.DARK_GRAY) .style(ChatFormatting.ITALIC) .component(), diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryScreen.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryScreen.java index 870f48a5de..afcec1baa5 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryScreen.java @@ -94,7 +94,7 @@ public class StockKeeperCategoryScreen extends AbstractSimiContainerScreen 20 ? "..." : ""), + graphics.drawString(font, + entry.isEmpty() ? CreateLang.translate("gui.stock_ticker.empty_category_name_placeholder") + .string() + : entry.getHoverName() + .getString(20) + .stripTrailing() + + (entry.getHoverName() + .getString() + .length() > 20 ? "..." : ""), 36, 4, 0x656565, false); matrixStack.popPose(); @@ -271,8 +272,9 @@ public class StockKeeperCategoryScreen extends AbstractSimiContainerScreen 0 && x <= fieldSize && y > 0 && y <= 16) { List components = new ArrayList<>(); - components.add(entry.isEmpty() ? CreateLang.temporaryText("(Empty)") - .component() : entry.getHoverName()); + components + .add(entry.isEmpty() ? CreateLang.translate("gui.stock_ticker.empty_category_name_placeholder") + .component() : entry.getHoverName()); components.add(clickToEdit); renderActionTooltip(graphics, components, mx, my); if (click == 0) @@ -281,7 +283,7 @@ public class StockKeeperCategoryScreen extends AbstractSimiContainerScreen fieldSize && x <= fieldSize + 16 && y > 0 && y <= 16) { - renderActionTooltip(graphics, ImmutableList.of(CreateLang.temporaryText("Delete Category") + renderActionTooltip(graphics, ImmutableList.of(CreateLang.translate("gui.stock_ticker.delete_category") .component()), mx, my); if (click == 0) { if (!entry.isEmpty()) @@ -324,7 +326,7 @@ public class StockKeeperCategoryScreen extends AbstractSimiContainerScreen 0 && x <= 16 && y > 0 && y <= 16) { - renderActionTooltip(graphics, ImmutableList.of(CreateLang.temporaryText("New Category") + renderActionTooltip(graphics, ImmutableList.of(CreateLang.translate("gui.stock_ticker.new_category") .component()), mx, my); if (click == 0) startEditing(-1); @@ -354,7 +356,7 @@ public class StockKeeperCategoryScreen extends AbstractSimiContainerScreen unsorted = new ArrayList<>(newlyReceivedStockSnapshot); lastClientsideStockSnapshot.add(unsorted); @@ -186,8 +187,8 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity implements return false; if (!behaviour.mayAdministrate(Minecraft.getInstance().player)) return false; - - CreateLang.temporaryText("Contains payments:") + + CreateLang.translate("stock_ticker.contains_payments") .style(ChatFormatting.WHITE) .forGoggles(tooltip); @@ -201,7 +202,7 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity implements .style(ChatFormatting.GREEN) .forGoggles(tooltip); - CreateLang.temporaryText("Right-click to retrieve") + CreateLang.translate("stock_ticker.click_to_retrieve") .style(ChatFormatting.GRAY) .forGoggles(tooltip); return true; diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java index a31ec687bb..12a72cba5b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java @@ -66,11 +66,9 @@ public class StockTickerInteractionHandler { return; if (!stbe.behaviour.mayInteract(player)) { - player.displayClientMessage( - CreateLang.temporaryText("Logistics Network is protected. You can interact using a Shopping list.") - .style(ChatFormatting.RED) - .component(), - true); + player.displayClientMessage(CreateLang.translate("stock_keeper.locked") + .style(ChatFormatting.RED) + .component(), true); return; } @@ -120,7 +118,7 @@ public class StockTickerInteractionHandler { continue; AllSoundEvents.DENY.playOnServer(level, player.blockPosition()); - CreateLang.temporaryText("Purchase failed: Stock levels lower than expected") + CreateLang.translate("stock_keeper.stock_level_too_low") .style(ChatFormatting.RED) .sendStatus(player); return; @@ -137,7 +135,7 @@ public class StockTickerInteractionHandler { if (occupiedSlots > 0) { AllSoundEvents.DENY.playOnServer(level, player.blockPosition()); - CreateLang.temporaryText("Not enough space in Cash Register") + CreateLang.translate("stock_keeper.cash_register_full") .style(ChatFormatting.RED) .sendStatus(player); return; @@ -170,7 +168,7 @@ public class StockTickerInteractionHandler { if (simulate && tally.getTotalCount() != 0) { AllSoundEvents.DENY.playOnServer(level, player.blockPosition()); - CreateLang.temporaryText("You cannot afford this purchase") + CreateLang.translate("stock_keeper.too_broke") .style(ChatFormatting.RED) .sendStatus(player); return; diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java index 19602ddb3b..b761082c24 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java @@ -151,7 +151,7 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre lockX = x + 230; lockY = y + 15; - MutableComponent searchLabel = CreateLang.translateDirect("gui.stock_ticker.search_items"); + MutableComponent searchLabel = CreateLang.translateDirect("gui.stock_keeper.search_items"); searchBox = new EditBox(this.font, x + 81, y + 25, 110, 9, searchLabel); searchBox.setMaxLength(50); searchBox.setBordered(false); @@ -182,7 +182,7 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre : stack.getHoverName() .getString(), 0))); - categories.add(Pair.of(CreateLang.temporaryText("Unsorted") + categories.add(Pair.of(CreateLang.translate("gui.stock_keeper.unsorted_category") .string(), 0)); String valueWithPrefix = searchBox.getValue(); @@ -392,17 +392,18 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre ms.popPose(); } - MutableComponent headerTitle = CreateLang.temporaryText("Stock Keeper") + MutableComponent headerTitle = CreateLang.translate("gui.stock_keeper.title") .component(); graphics.drawString(font, headerTitle, x + windowWidth / 2 - font.width(headerTitle) / 2, y + 4, 0x505050, false); - graphics.drawString(font, CreateLang.temporaryText("Send") - .component(), x + windowWidth - 52, y + windowHeight - 32, - isConfirmHovered(mouseX, mouseY) ? 0xffffff : 0x505050, false); + graphics.drawString(font, + CreateLang.translate(encodeRequester ? "gui.stock_keeper.configure" : "gui.stock_keeper.send") + .component(), + x + windowWidth - 52, y + windowHeight - 32, isConfirmHovered(mouseX, mouseY) ? 0xffffff : 0x505050, false); // Request just sent if (itemsToOrder.isEmpty() && successTicks > 0) { - Component msg = CreateLang.translateDirect("gui.stock_ticker.request_sent"); + Component msg = CreateLang.translateDirect("gui.stock_keeper.request_sent"); float alpha = Mth.clamp((successTicks - 10f) / 5f, 0f, 1f); if (alpha > 0) graphics.drawString(font, msg, x + windowWidth / 2 - font.width(msg) / 2, orderY + 4, @@ -510,20 +511,24 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre (isLocked ? AllGuiTextures.STOCK_KEEPER_REQUEST_LOCKED : AllGuiTextures.STOCK_KEEPER_REQUEST_UNLOCKED) .render(graphics, lockX, lockY); if (mouseX > lockX && mouseX <= lockX + 15 && mouseY > lockY && mouseY <= lockY + 15) { - graphics.renderComponentTooltip(font, - List.of(CreateLang.temporaryText(isLocked ? "Network is locked" : "Network is open") - .component(), - CreateLang.temporaryText("Locking prevents other Players") - .style(ChatFormatting.GRAY) - .component(), - CreateLang.temporaryText("from ordering items directly") - .style(ChatFormatting.GRAY) - .component(), - CreateLang.temporaryText("Click to toggle") - .style(ChatFormatting.DARK_GRAY) - .style(ChatFormatting.ITALIC) - .component()), - mouseX, mouseY); + graphics + .renderComponentTooltip(font, + List.of( + CreateLang + .translate( + isLocked ? "gui.stock_keeper.network_locked" : "gui.stock_keeper.network_open") + .component(), + CreateLang.translate("gui.stock_keeper.network_lock_tip") + .style(ChatFormatting.GRAY) + .component(), + CreateLang.translate("gui.stock_keeper.network_lock_tip_1") + .style(ChatFormatting.GRAY) + .component(), + CreateLang.translate("gui.stock_keeper.network_lock_tip_2") + .style(ChatFormatting.DARK_GRAY) + .style(ChatFormatting.ITALIC) + .component()), + mouseX, mouseY); } } } @@ -703,15 +708,15 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre private Component getTroubleshootingMessage() { if (currentItemSource == null) - return CreateLang.translate("gui.stock_ticker.checking_stocks") + return CreateLang.translate("gui.stock_keeper.checking_stocks") .component(); if (blockEntity.activeLinks == 0) - return CreateLang.translate("gui.stock_ticker.no_packagers_linked") + return CreateLang.translate("gui.stock_keeper.no_packagers_linked") .component(); if (currentItemSource.isEmpty()) - return CreateLang.translate("gui.stock_ticker.inventories_empty") + return CreateLang.translate("gui.stock_keeper.inventories_empty") .component(); - return CreateLang.translate("gui.stock_ticker.no_search_results") + return CreateLang.translate("gui.stock_keeper.no_search_results") .component(); } diff --git a/src/main/resources/assets/create/lang/default/interface.json b/src/main/resources/assets/create/lang/default/interface.json index 33d0330672..8e8deb9db0 100644 --- a/src/main/resources/assets/create/lang/default/interface.json +++ b/src/main/resources/assets/create/lang/default/interface.json @@ -318,15 +318,59 @@ "create.gui.clipboard.erase_checked": "Erase checked items", - "create.gui.stock_ticker.checking_stocks": "Checking stocks...", - "create.gui.stock_ticker.no_packagers_linked": "No Packagers Linked", - "create.gui.stock_ticker.inventories_empty": "Linked Inventories are Empty", - "create.gui.stock_ticker.no_search_results": "No matching items found", - "create.gui.stock_ticker.search_items": "Search Items", - "create.gui.stock_ticker.package_adress": "Package Address", - "create.gui.stock_ticker.confirm_order": "Confirm Order", - "create.gui.stock_ticker.request_sent": "Request Sent!", - "create.gui.stock_ticker.program_requester": "Program Requester", + "create.gui.stock_keeper.title": "Stock Keeper", + "create.gui.stock_keeper.checking_stocks": "Checking stocks...", + "create.gui.stock_keeper.no_packagers_linked": "No Packagers Linked", + "create.gui.stock_keeper.inventories_empty": "Linked Inventories are Empty", + "create.gui.stock_keeper.no_search_results": "No matching items found", + "create.gui.stock_keeper.search_items": "Search Items", + "create.gui.stock_keeper.package_adress": "Package Address", + "create.gui.stock_keeper.confirm_order": "Confirm Order", + "create.gui.stock_keeper.request_sent": "Request Sent!", + "create.gui.stock_keeper.program_requester": "Program Requester", + "create.gui.stock_keeper.unsorted_category": "Unsorted", + "create.gui.stock_keeper.send": "Send", + "create.gui.stock_keeper.configure": "Configure", + "create.gui.stock_keeper.network_locked": "Network is locked", + "create.gui.stock_keeper.network_open": "Network is open", + "create.gui.stock_keeper.network_lock_tip": "Locking prevents other Players", + "create.gui.stock_keeper.network_lock_tip_1": "from ordering items directly", + "create.gui.stock_keeper.network_lock_tip_2": "Click to toggle", + + "create.stock_keeper.shopping_list_empty_hand": "Empty hand required to start a shopping list", + "create.stock_keeper.no_price_set": "Shop owner must set a price first", + "create.stock_keeper.keeper_missing": "Stock keeper missing", + "create.stock_keeper.out_of_stock": "Out of Stock", + "create.stock_keeper.limited_stock": "Limited stock available", + "create.stock_keeper.use_list_to_add_purchases": "Use this list to add more to your purchase", + "create.stock_keeper.locked": "Interact using a Shopping list, direct access has been locked", + "create.stock_keeper.stock_level_too_low": "Purchase cancelled: Stock levels lower than expected", + "create.stock_keeper.cash_register_full": "Purchase cancelled: Not enough space in Cash Register", + "create.stock_keeper.too_broke": "You cannot afford this purchase", + + "create.stock_ticker.contains_payments": "Contains payments:", + "create.stock_ticker.click_to_retrieve": "Click to retrieve", + + "create.gui.stock_ticker.category_editor": "Category Editor", + "create.gui.stock_ticker.category_filter": "Category Filter", + "create.gui.stock_ticker.category_filter_tip": "Place a List or Attribute Filter", + "create.gui.stock_ticker.category_filter_tip_1": "to specify which items are included", + "create.gui.stock_ticker.new_category": "New Category", + "create.gui.stock_ticker.category_name": "Category Name", + "create.gui.stock_ticker.delete_category": "Delete Category", + "create.gui.stock_ticker.empty_category_name_placeholder": "(Empty)", + + "create.display_cloth.shop_configured": "Item shop configured", + "create.display_cloth.total_cost": "Total cost: ", + "create.display_cloth.hand_to_shop_keeper": "Hand this to a shop keeper", + "create.display_cloth.sneak_click_discard": "Sneak-Click to discard", + "create.display_cloth.shopping_list_discarded": "Shopping list discarded", + + "create.gui.address_box.clipboard_tip": "Keeping Track", + "create.gui.address_box.clipboard_tip_1": "Entries starting with '#' on", + "create.gui.address_box.clipboard_tip_2": "held or nearby clipboards will", + "create.gui.address_box.clipboard_tip_3": "help auto-complete this input.", + "create.gui.address_box.clipboard_tip_4": "(e.g. #storage, #factory)", "create.redstone_requester.keeper_connected": "Connected to Stock keeper successfully", "create.redstone_requester.keeper_too_far_away": "Requester too far away from Stock keeper", @@ -338,6 +382,7 @@ "create.clipboard.copied_from": "Copying settings from %1$s", "create.clipboard.copied_from_clipboard": "Added entries from Clipboard", "create.clipboard.pasted_to": "Applied settings to %1$s", + "create.clipboard.address_added": "'%1$s' added to Clipboard", "create.schematicAndQuill.dimensions": "Schematic Size: %1$sx%2$sx%3$s", "create.schematicAndQuill.firstPos": "First position set.", @@ -981,9 +1026,70 @@ "create.logistically_linked.connected": "Connected to other Transmitters successfully", "create.logistically_linked.tooltip": "Frequency configured", "create.logistically_linked.tooltip_clear": "Place in crafting grid to reset", + "create.logistically_linked.protected": "Logistics Network is Protected", + + "create.gui.factory_panel.title_as_recipe": "Recipe Settings", + "create.gui.factory_panel.title_as_restocker": "Restocker Settings", + "create.gui.factory_panel.connect_input": "Connect an input panel", + "create.gui.factory_panel.no_open_promises": "No open promises", + "create.gui.factory_panel.promised_items": "Promised items", + "create.gui.factory_panel.left_click_reset": "Left-Click to reset", + "create.gui.factory_panel.promises_expire_title": "Promises expire after", + "create.gui.factory_panel.promises_do_not_expire": "Promises do not expire", + "create.gui.factory_panel.expected_output": "Expect %1$s", + "create.gui.factory_panel.restocker_promises_tip": "When items are sent, a promise", + "create.gui.factory_panel.restocker_promises_tip_1": "is held until they arrive.", + "create.gui.factory_panel.recipe_promises_tip": "When inputs are sent, a promise", + "create.gui.factory_panel.recipe_promises_tip_1": "is held until outputs arrive.", + "create.gui.factory_panel.promise_prevents_oversending": "This prevents over-sending.", + "create.gui.factory_panel.empty_panel": "Empty panel", + "create.gui.factory_panel.sending_item": "Sending %1$s", + "create.gui.factory_panel.sending_item_tip": "whenever local stock level", + "create.gui.factory_panel.sending_item_tip_1": "is below the target amount", + "create.gui.factory_panel.send_item": "Send %1$s", + "create.gui.factory_panel.left_click_disconnect": "Left-Click to disconnect", + "create.gui.factory_panel.scroll_to_change_amount": "Scroll to change amount", + "create.gui.factory_panel.storage_level": "Storage level", + "create.gui.factory_panel.storage_level_and_target": "Storage level and target", + "create.gui.factory_panel.storage_level_tip": "Targeted amount can be set", + "create.gui.factory_panel.storage_level_tip_1": "by using the filter slot", + "create.gui.factory_panel.storage_level_tip_2": "outside of this interface", + "create.gui.factory_panel.recipe_address": "Send inputs to...", + "create.gui.factory_panel.recipe_address_given": "Sending inputs to", + "create.gui.factory_panel.recipe_address_tip": "Enter an address where", + "create.gui.factory_panel.recipe_address_tip_1": "this recipe is carried out.", + "create.gui.factory_panel.restocker_address": "Send items to...", + "create.gui.factory_panel.restocker_address_given": "Sending to", + "create.gui.factory_panel.restocker_address_tip": "Enter an address that will", + "create.gui.factory_panel.restocker_address_tip_1": "cause packages to arrive here.", + + "create.gui.redstone_requester.allow_partial": "Allow partial orders", + "create.gui.redstone_requester.dont_allow_partial": "Must send all items", + "create.gui.redstone_requester.requester_address": "Send order to...", + "create.gui.redstone_requester.requester_address_given": "Sending order to", + "create.gui.redstone_requester.requester_address_tip": "Enter the address this", + "create.gui.redstone_requester.requester_address_tip_1": "order should be send to.", + + "create.gui.factory_panel.expected_output_tip": "The amount of output returning", + "create.gui.factory_panel.expected_output_tip_1": "after each successful request", + "create.gui.factory_panel.expected_output_tip_2": "Scroll to change", "create.factory_panel.click_to_configure": "Click to specify a recipe", - + "create.factory_panel.target_amount": "Target Amount in Storage", + "create.factory_panel.new_factory_task": "New factory task", + "create.factory_panel.some_links_unloaded": "Some links are not loaded", + "create.factory_panel.in_progress": "(In Progress)", + "create.factory_panel.cycled_arrow_path": "Cycled arrow pathing mode %1$s", + "create.factory_panel.tune_before_placing": "Tune to a transmitter before placing", + "create.factory_panel.same_orientation": "Panels must have the same orientation", + "create.factory_panel.same_surface": "Panels must be on the same surface", + "create.factory_panel.too_far_apart": "Panels are too far away from each other", + "create.factory_panel.input_in_restock_mode": "Input panel cannot be in restock mode", + "create.factory_panel.no_item": "Input panel must have an item first", + "create.factory_panel.panels_connected": "Now using %1$s to create %2$s", + "create.factory_panel.click_second_panel": "Click a second panel to connect...", + "create.factory_panel.connection_aborted": "Input connection aborted", + "create.display_source.label": "Attached Label", "create.display_source.combine_item_names": "Combine Item Names", "create.display_source.count_items": "Amount of matching Items", From ea79c342928ceafa9b027c6ba4d46ebe382cb2e6 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Mon, 4 Nov 2024 11:42:54 +0100 Subject: [PATCH 106/515] Tip your tester - Added tooltips and ponder placeholders - Cardboard items can now be used as furnace fuel --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 6 +- .../resources/assets/create/lang/en_ud.json | 27 +++++++++ .../resources/assets/create/lang/en_us.json | 27 +++++++++ .../java/com/simibubi/create/AllBlocks.java | 1 + .../java/com/simibubi/create/AllItems.java | 58 +++++++++---------- .../equipment/armor/CardboardArmorItem.java | 21 +++++++ .../equipment/armor/CardboardHelmetItem.java | 9 +-- .../equipment/tool/CardboardSwordItem.java | 7 +++ .../foundation/data/BuilderTransformers.java | 3 + .../assets/create/lang/default/tooltips.json | 35 +++++++++++ .../block/contraption_controls/item.json | 2 +- .../create/models/block/controls/item.json | 2 +- 12 files changed, 157 insertions(+), 41 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorItem.java diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 01ea8767b5..965c61a675 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-11-02T14:53:35.7518171 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-11-04T11:30:08.6907256 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -638,8 +638,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -e486a51e2a706036e2bf48fc22f50a69eba6cace assets/create/lang/en_ud.json -fa8ca9eada8b6e36ea44e6b557a1106c4b43aeb0 assets/create/lang/en_us.json +74ec69161923ebe06e8dc281e40aec34c716e58a assets/create/lang/en_ud.json +6c5181994eb7853e46a3e21bd1a36e0ece70cd4e assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 4899795981..d3adf51dc3 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -251,6 +251,7 @@ "block.create.cardboard_block": "pɹɐoqpɹɐƆ ɟo ʞɔoןᗺ", "block.create.cart_assembler": "ɹǝןqɯǝssⱯ ʇɹɐƆ", "block.create.chain_conveyor": "ɹoʎǝʌuoƆ uıɐɥƆ", + "block.create.chain_conveyor.tooltip.summary": "˙ǝpıɹ ɐ ǝʞɐʇ oʇ ɥɔuǝɹʍ ǝs∩ ˙ɯǝɥʇ uo sǝbɐʞɔɐd ʇɹodsuɐɹʇ oʇ sʇɹodboɹɟ ǝs∩ ˙sʞɹoʍʇǝu ɹoʎǝʌuoɔ ɯɹoɟ oʇ suıɐɥɔ ɥʇıʍ ʇɔǝuuoƆ ]ɹǝpuod[", "block.create.cherry_window": "ʍopuıM ʎɹɹǝɥƆ", "block.create.cherry_window_pane": "ǝuɐԀ ʍopuıM ʎɹɹǝɥƆ", "block.create.chocolate": "ǝʇɐןoɔoɥƆ", @@ -437,8 +438,12 @@ "block.create.deployer": "ɹǝʎoןdǝᗡ", "block.create.depot": "ʇodǝᗡ", "block.create.desk_bell": "ןןǝᗺ ʞsǝᗡ", + "block.create.desk_bell.tooltip.behaviour1": "˙‾ɹooןɟ ʇǝbɹɐʇ‾ ǝɥʇ ʇɐ buıʌıɹɹɐ uǝɥʍ ‾punos ɐ sʎɐןԀ‾", + "block.create.desk_bell.tooltip.condition1": "uoıʇdɐɹʇuoƆ ɹoʇɐʌǝןƎ oʇ pǝɥɔɐʇʇɐ uǝɥM", + "block.create.desk_bell.tooltip.summary": "˙pǝʇɐʌıʇɔɐ uǝɥʍ ‾ןɐubıs ǝuoʇspǝɹ‾ ɐ sʇıɯƎ ¡ǝɔıʌɹǝS ɹoɟ buıᴚ", "block.create.diorite_pillar": "ɹɐןןıԀ ǝʇıɹoıᗡ", "block.create.display_board": "pɹɐoᗺ ʎɐןdsıᗡ", + "block.create.display_cloth.tooltip.summary": "˙ɥʇoןɔ ʎɐןdsıp pǝɹnbıɟuoɔ ǝɥʇ buıɔɐןd ɹǝʇɟɐ pǝıɟıɔǝds ǝq uɐɔ ʇsoɔ ǝɥ⟘ ˙sɹǝʎɐןd ɹǝɥʇo ʎq pǝsɐɥɔɹnd ǝq uɐɔ ʇɐɥʇ ʞɹoʍʇǝu ɹnoʎ ɯoɹɟ ʇsǝnbǝɹ ɐ ʎɟıɔǝds 'ɹǝdǝǝʞ ʞɔoʇs ɐ uo pǝsn uǝɥʍ 'ʎןǝʌıʇɐuɹǝʇןⱯ ˙ɯǝɥʇ ʎɐןdsıp oʇ ɯǝʇı ɥʇıʍ ʞɔıןɔ 'uoıʇɐɹoɔǝp ɹoɟ pǝsn ǝq uɐƆ ]ɹǝpuod[", "block.create.display_link": "ʞuıꞀ ʎɐןdsıᗡ", "block.create.dripstone_pillar": "ɹɐןןıԀ ǝuoʇsdıɹᗡ", "block.create.elevator_contact": "ʇɔɐʇuoƆ ɹoʇɐʌǝןƎ", @@ -454,6 +459,11 @@ "block.create.exposed_copper_tile_stairs": "sɹıɐʇS ǝןı⟘ ɹǝddoƆ pǝsodxƎ", "block.create.exposed_copper_tiles": "sǝןı⟘ ɹǝddoƆ pǝsodxƎ", "block.create.factory_panel": "ןǝuɐԀ ʎɹoʇɔɐℲ", + "block.create.factory_panel.tooltip.behaviour1": "˙ssǝɹppɐ uɐ ʇǝs oʇ ןǝuɐd ǝɥʇ ʞɔıןɔ ʇɹoɥS ˙ɹǝuıɐʇuoɔ ǝɥʇ uı sı ʇunoɯɐ ʇǝbɹɐʇ ǝɥʇ ןıʇun ssǝɹppɐ pǝıɟıɔǝds ǝɥʇ oʇ ʞɹoʍʇǝu ǝɥʇ ɯoɹɟ sɯǝʇı sʇsǝnbǝɹ ןǝuɐԀ :ǝpoɯ ɹǝʞɔoʇsǝᴚ", + "block.create.factory_panel.tooltip.behaviour2": "˙sןǝuɐd ɹǝɥʇo ɹoɟ ʇnduı uɐ sɐ pǝsnǝɹ ǝq osןɐ uɐɔ ɯǝʇı ʇndʇno uɐ buıʎɟıɔǝds sןǝuɐԀ ˙sɯǝʇı ʇnduı sɐ sןǝuɐd ɹǝɥʇo ʇɔǝuuoɔ puɐ ssǝɹppɐ uɐ ʇǝs oʇ ןǝuɐd ǝɥʇ ʞɔıןɔ ʇɹoɥS ˙)ʞɹoʍʇǝu uo sʞuɐןԀ ㄣ9 ʇsɐǝן ʇɐ ןıʇun 'sʞuɐןԀ 9 ʇɔǝdxǝ puɐ ,ʍɐs, oʇ boꞀ Ɩ puǝS ˙b˙ǝ( ʞɹoʍʇǝu ǝɥʇ uo punoɟ sı ɯǝʇı ʇndʇno ǝɥʇ ɟo pǝʇunoɯɐ ʇǝbɹɐʇ ǝɥʇ ןıʇun ssǝɹppɐ uɐ oʇ sʇuǝıpǝɹbuı sʇsǝnbǝɹ ןǝuɐԀ :ǝpoɯ ǝdıɔǝᴚ", + "block.create.factory_panel.tooltip.condition1": "ɹǝbɐʞɔɐԀ oʇ pǝɥɔɐʇʇɐ uǝɥM", + "block.create.factory_panel.tooltip.condition2": "ɹǝbɐʞɔɐԀ oʇ pǝɥɔɐʇʇɐ ʇou uǝɥM", + "block.create.factory_panel.tooltip.summary": "˙ǝbɐɹoʇs uı uıɐʇuıɐɯ oʇ ʇunoɯɐ ʇǝbɹɐʇ ɐ ʎɟıɔǝds oʇ ʞɔıןɔ pןoH ˙ʇoןs ɹǝʇןıɟ uı ɹoʇıuoɯ oʇ ɯǝʇı ǝɔɐןԀ ˙ʎɔuǝnbǝɹɟ sʇı ǝsn oʇ ʇuǝɯǝɔɐןd ǝɹoɟǝq ʞuıן ɹǝbɐʞɔɐd ʞɔıןƆ ]ɹǝpuod[", "block.create.fake_track": "sdɐW ɹoɟ ɹǝʞɹɐW ʞɔɐɹ⟘", "block.create.fluid_pipe": "ǝdıԀ pınןℲ", "block.create.fluid_tank": "ʞuɐ⟘ pınןℲ", @@ -500,6 +510,9 @@ "block.create.industrial_iron_window_pane": "ǝuɐԀ ʍopuıM uoɹI ןɐıɹʇsnpuI", "block.create.item_drain": "uıɐɹᗡ ɯǝʇI", "block.create.item_hatch": "ɥɔʇɐH ɯǝʇI", + "block.create.item_hatch.tooltip.behaviour1": "˙pǝɹɹǝɟsuɐɹʇ ǝq ‾ʇou‾ ןןıʍ ‾sʇuǝʇuoɔ ɥʇıʍ‾ sɯǝʇı puɐ ‾sɯǝʇı ɹɐqʇoH‾ ˙uo pǝɔɐןd sı ʇı ‾ɹǝuıɐʇuoɔ‾ ǝɥʇ oʇuı sɯǝʇı ɹnoʎ ‾sʇısodǝᗡ‾", + "block.create.item_hatch.tooltip.condition1": "pǝʞɔıןƆ-ᴚ uǝɥM", + "block.create.item_hatch.tooltip.summary": "˙ɯǝןqoɹd s,ǝsןǝ ǝuoǝɯos ʇı sǝʞɐɯ puɐ ɹǝʇʇnןɔ ‾ʎɹoʇuǝʌuı‾ ɹnoʎ ‾sǝʌןos ʎןʞɔınὉ‾", "block.create.item_vault": "ʇןnɐΛ ɯǝʇI", "block.create.jungle_window": "ʍopuıM ǝןbunſ", "block.create.jungle_window_pane": "ǝuɐԀ ʍopuıM ǝןbunſ", @@ -598,8 +611,12 @@ "block.create.oxidized_copper_tile_stairs": "sɹıɐʇS ǝןı⟘ ɹǝddoƆ pǝzıpıxO", "block.create.oxidized_copper_tiles": "sǝןı⟘ ɹǝddoƆ pǝzıpıxO", "block.create.package_frogport": "ʇɹodboɹℲ ǝbɐʞɔɐԀ", + "block.create.package_frogport.tooltip.summary": "˙ɐsɹǝʌ ǝɔıʌ puɐ suıɐɥɔ ɯoɹɟ pǝʌoɯǝɹ ǝq ןןıʍ sǝbɐʞɔɐd buıɥɔʇɐW ˙I∩ uı ɹǝʇןıɟ ssǝɹppɐ ʇǝS ˙ssǝɹppɐ ɹıǝɥʇ uo pǝsɐq suıɐɥɔ ɯoɹɟ puɐ oʇ sǝbɐʞɔɐd sǝʌoW ˙ǝɔɐןd uǝɥʇ ʞuıן oʇ ɹoʎǝʌuoɔ uıɐɥɔ ɐ ʞɔıןƆ ]ɹǝpuod[", + "block.create.package_postbox.tooltip.summary": "˙ɐsɹǝʌ ǝɔıʌ puɐ suıɐɹʇ ɯoɹɟ pǝʌoɯǝɹ ǝq ןןıʍ sǝbɐʞɔɐd buıɥɔʇɐW ˙I∩ uı ɹǝʇןıɟ ssǝɹppɐ ʇǝS ˙ssǝɹppɐ ɹıǝɥʇ uo pǝsɐq suıɐɹʇ ɯoɹɟ puɐ oʇ sǝbɐʞɔɐd sǝʌoW ˙ǝɔɐןd uǝɥʇ ʞuıן oʇ uoıʇɐʇs uıɐɹʇ ɐ ʞɔıןƆ ]ɹǝpuod[", "block.create.packager": "ɹǝbɐʞɔɐԀ", + "block.create.packager.tooltip.summary": "˙ʞɹoʍʇǝu sɔıʇsıboן ɐ oʇ sʇuǝʇuoɔ ʎɹoʇuǝʌuı ʇıɯqns oʇ ʞuıן ɹǝbɐʞɔɐd ɥɔɐʇʇɐ 'ʎןǝʌıʇɐuɹǝʇןⱯ ˙ssǝɹppɐ ʇǝbɹɐʇ ʎɟıɔǝds oʇ ubıs ɥɔɐʇʇⱯ ˙ǝuoʇspǝɹ uo ʎɹoʇuǝʌuı pǝɥɔɐʇʇɐ ɯoɹɟ sǝbɐʞɔɐd sǝʇɐǝɹƆ ]ɹǝpuod[", "block.create.packager_link": "ʞuıꞀ ɹǝbɐʞɔɐԀ", + "block.create.packager_link.tooltip.summary": "suoıʇɐʇıɯıן ǝbuɐɹ oN ˙ʎɔuǝnbǝɹɟ ɹıǝɥʇ ǝɹɐɥs oʇ ʇuǝɯǝɔɐןd ǝɹoɟǝq sʞuıן ɹǝɥʇo ʞɔıןƆ ˙ɯoɹɟ ʇsǝnbǝɹ oʇ ǝןqɐןıɐʌɐ ʎɹoʇuǝʌuı ʇǝbɹɐʇ sʇı ǝʞɐɯ oʇ ɹǝbɐʞɔɐd oʇ ɥɔɐʇʇⱯ ]ɹǝpuod[", "block.create.peculiar_bell": "ןןǝᗺ ɹɐıןnɔǝԀ", "block.create.peculiar_bell.tooltip.summary": "˙˙˙sʇɔǝɟɟǝ-ǝpıs ǝʌɐɥ ʎɐɯ ‾ǝɹıℲ ןnoS‾ uǝdo ǝʌoqɐ ʇɥbıɹ ʇı buıɔɐןԀ ˙‾ןןǝᗺ ssɐɹᗺ‾ ǝʌıʇɐɹoɔǝp Ɐ", "block.create.pink_display_cloth": "ɥʇoןƆ ʎɐןdsıᗡ ʞuıԀ", @@ -681,6 +698,7 @@ "block.create.pulse_extender": "ɹǝpuǝʇxƎ ǝsןnԀ", "block.create.pulse_repeater": "ɹǝʇɐǝdǝᴚ ǝsןnԀ", "block.create.pulse_timer": "ɹǝɯı⟘ ǝsןnԀ", + "block.create.pulse_timer.tooltip.summary": "˙ןɐubıs ʇuɐʇsuoɔ ɐ ʎq pǝɹǝʍod sı ǝpıs ʇnduı ǝɥʇ ssǝןun sǝsןnd ǝuoʇspǝɹ sʇıɯǝ ʎןpǝʇɐǝdǝᴚ ˙ʇoןs ʇnduı ǝɥʇ buısn ʎɐןǝp ɐ ʇǝS ]ɹǝpuod[", "block.create.purple_display_cloth": "ɥʇoןƆ ʎɐןdsıᗡ ǝןdɹnԀ", "block.create.purple_nixie_tube": "ǝqn⟘ ǝıxıN ǝןdɹnԀ", "block.create.purple_postbox": "xoqʇsoԀ ǝןdɹnԀ", @@ -701,6 +719,7 @@ "block.create.redstone_contact": "ʇɔɐʇuoƆ ǝuoʇspǝᴚ", "block.create.redstone_link": "ʞuıꞀ ǝuoʇspǝᴚ", "block.create.redstone_requester": "ɹǝʇsǝnbǝᴚ ǝuoʇspǝᴚ", + "block.create.redstone_requester.tooltip.summary": "˙ʇuǝɯǝɔɐןd ǝɹoɟǝq ɹǝdǝǝʞ ʞɔoʇs ɐ ʇɐ pǝɹnbıɟuoɔ ǝq uɐɔ ʇsǝnbǝɹ sıɥʇ ʎןǝʌıʇɐuɹǝʇןⱯ ˙pǝʌıǝɔǝɹ sı ǝsןnd ǝuoʇspǝɹ ɐ uǝɥʍ ssǝɹppɐ uɐ oʇ pǝʇsǝnbǝɹ sɯǝʇı ʎɟıɔǝds oʇ I∩ uǝdO ˙ʎɔuǝnbǝɹɟ sʇı ǝsn oʇ ʇuǝɯǝɔɐןd ǝɹoɟǝq ʞuıן ɹǝbɐʞɔɐd ʞɔıןƆ ]ɹǝpuod[", "block.create.refined_radiance_casing": "buısɐƆ ʇuɐıpɐᴚ", "block.create.rope": "ǝdoᴚ", "block.create.rope_pulley": "ʎǝןןnԀ ǝdoᴚ", @@ -798,6 +817,7 @@ "block.create.sticker": "ɹǝʞɔıʇS", "block.create.sticky_mechanical_piston": "uoʇsıԀ ןɐɔıuɐɥɔǝW ʎʞɔıʇS", "block.create.stock_ticker": "ɹǝʞɔı⟘ ʞɔoʇS", + "block.create.stock_ticker.tooltip.summary": "˙sǝıɹobǝʇɐɔ oʇuı sɯǝʇı pǝʎɐןdsıp ǝsıuɐbɹo oʇ ʞɔoןq ɹǝʞɔıʇ ʞɔoʇs ǝɥʇ ʞɔıןƆ ˙ssǝɹppɐ uǝʌıb ɐ oʇ sɹǝbɐʞɔɐd pǝʞuıן ʎuɐ ɯoɹɟ sɯǝʇı ʇsǝnbǝɹ oʇ ʎʇıʇuǝ ǝɥʇ ʞɔıןƆ ˙ɹǝdǝǝʞ ʞɔoʇs sʇı sɐ ʇɐǝs ɐ uo ʎʇıʇuǝ ʇuǝɔɐظpɐ uɐ spǝǝN ˙ʎɔuǝnbǝɹɟ sʇı ǝsn oʇ ʇuǝɯǝɔɐןd ǝɹoɟǝq ʞuıן ɹǝbɐʞɔɐd ʞɔıןƆ ]ɹǝpuod[", "block.create.stockpile_switch": "ɥɔʇıʍS pןoɥsǝɹɥ⟘", "block.create.stressometer": "ɹǝʇǝɯossǝɹʇS", "block.create.tiled_glass": "ssɐן⅁ pǝןı⟘", @@ -2919,6 +2939,9 @@ "item.create.builders_tea": "ɐǝ⟘ s,ɹǝpןınᗺ", "item.create.builders_tea.tooltip.summary": "‾˙buıʇɐɹnʇɐS‾ puɐ ‾buıʇɐʌıʇoW‾ -pǝʇɹɐʇs ʎɐp ǝɥʇ ʇǝb oʇ ʞuıɹp ʇɔǝɟɹǝd ǝɥ⟘", "item.create.cardboard": "pɹɐoqpɹɐƆ", + "item.create.cardboard_armor.tooltip.behaviour1": "˙‾ǝsınbsıp‾ snonɔıdsuoɔuı uɐ ǝʇɐʌıʇɔɐ oʇ ‾ʞɐǝuS‾", + "item.create.cardboard_armor.tooltip.condition1": "pǝddınbǝ ʇǝs ןןnɟ uǝɥM", + "item.create.cardboard_armor.tooltip.summary": "˙‾ɥʇןɐǝʇs‾ puɐ ‾ǝןʎʇs‾ pǝsɐǝɹɔuı ɹoɟ ‾ʇuǝɯdınbǝ‾ ‾ǝןqɐɹɐǝM‾", "item.create.cardboard_boots": "sʇooᗺ pɹɐoqpɹɐƆ", "item.create.cardboard_chestplate": "ǝʇɐןdʇsǝɥƆ pɹɐoqpɹɐƆ", "item.create.cardboard_helmet": "ʇǝɯןǝH pɹɐoqpɹɐƆ", @@ -2929,6 +2952,7 @@ "item.create.cardboard_package_12x12": "ǝbɐʞɔɐԀ pɹɐoqpɹɐƆ", "item.create.cardboard_pulp": "dןnԀ pɹɐoqpɹɐƆ", "item.create.cardboard_sword": "pɹoʍS pɹɐoqpɹɐƆ", + "item.create.cardboard_sword.tooltip.summary": "˙ǝɔıoɥɔ ɟo uodɐǝʍ ןnɟɹǝʍod ʇǝʎ '‾ssǝןɯɹɐɥ‾ ‾ʎןʇsoɯ‾ Ɐ ˙ʞuoᗺ", "item.create.chest_minecart_contraption": "uoıʇdɐɹʇuoƆ ʇɹɐɔǝuıW ʇsǝɥƆ", "item.create.chocolate_bucket": "ʇǝʞɔnᗺ ǝʇɐןoɔoɥƆ", "item.create.chocolate_glazed_berries": "sǝıɹɹǝᗺ pǝzɐן⅁ ǝʇɐןoɔoɥƆ", @@ -3042,6 +3066,9 @@ "item.create.netherite_diving_helmet.tooltip.condition1": ")ʇǝs ןןnℲ( uɹoM uǝɥM", "item.create.netherite_diving_helmet.tooltip.summary": "˙ooʇ '‾ǝʇıɹǝɥʇǝN‾ uı pǝɹǝʌoɔ ǝq oʇ ǝʌɐɥ ‾ʇǝǝℲ puɐ sbǝꞀ‾ 'ǝʌıʇɔǝɟɟǝ ǝq o⟘ ˙‾ʇɐǝɥ ǝɯǝɹʇxǝ‾ ɯoɹɟ noʎ ʇɔǝʇoɹd uɐɔ sıɥʇ '‾ʞuɐʇʞɔɐᗺ ǝʇıɹǝɥʇǝN‾ ɐ ɥʇıʍ ɹǝɥʇǝbo⟘", "item.create.package_filter": "ɹǝʇןıℲ ǝbɐʞɔɐԀ", + "item.create.package_filter.tooltip.behaviour1": "˙‾ǝɔɐɟɹǝʇuı uoıʇɐɹnbıɟuoɔ‾ ǝɥʇ suǝdO", + "item.create.package_filter.tooltip.condition1": "pǝʞɔıןƆ-ᴚ uǝɥM", + "item.create.package_filter.tooltip.summary": "sʇuǝuodɯoƆ s,ǝʇɐǝɹƆ ɟo ‾sʇoןS ɹǝʇןıℲ‾ uı pǝsn ǝq uɐƆ ˙‾ssǝɹppɐ‾ pǝʇǝbɹɐʇ ɹıǝɥʇ ʎq ‾sɯǝʇı pǝbɐʞɔɐd sǝɥɔʇɐW‾", "item.create.polished_rose_quartz": "zʇɹɐnὉ ǝsoᴚ pǝɥsıןoԀ", "item.create.potato_cannon": "uouuɐƆ oʇɐʇoԀ", "item.create.potato_cannon.tooltip.behaviour1": "˙‾ʎɹoʇuǝʌuI‾ ɹnoʎ ɯoɹɟ ɯǝʇı ǝןqɐʇıns ɐ ‾sʇooɥS‾", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index ea174be658..c9f1097921 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -251,6 +251,7 @@ "block.create.cardboard_block": "Block of Cardboard", "block.create.cart_assembler": "Cart Assembler", "block.create.chain_conveyor": "Chain Conveyor", + "block.create.chain_conveyor.tooltip.summary": "[ponder] Connect with chains to form conveyor networks. Use frogports to transport packages on them. Use wrench to take a ride.", "block.create.cherry_window": "Cherry Window", "block.create.cherry_window_pane": "Cherry Window Pane", "block.create.chocolate": "Chocolate", @@ -437,8 +438,12 @@ "block.create.deployer": "Deployer", "block.create.depot": "Depot", "block.create.desk_bell": "Desk Bell", + "block.create.desk_bell.tooltip.behaviour1": "_Plays a sound_ when arriving at the _target floor_.", + "block.create.desk_bell.tooltip.condition1": "When attached to Elevator Contraption", + "block.create.desk_bell.tooltip.summary": "Ring for Service! Emits a _redstone signal_ when activated.", "block.create.diorite_pillar": "Diorite Pillar", "block.create.display_board": "Display Board", + "block.create.display_cloth.tooltip.summary": "[ponder] Can be used for decoration, click with item to display them. Alternatively, when used on a stock keeper, specify a request from your network that can be purchased by other players. The cost can be specified after placing the configured display cloth.", "block.create.display_link": "Display Link", "block.create.dripstone_pillar": "Dripstone Pillar", "block.create.elevator_contact": "Elevator Contact", @@ -454,6 +459,11 @@ "block.create.exposed_copper_tile_stairs": "Exposed Copper Tile Stairs", "block.create.exposed_copper_tiles": "Exposed Copper Tiles", "block.create.factory_panel": "Factory Panel", + "block.create.factory_panel.tooltip.behaviour1": "Restocker mode: Panel requests items from the network to the specified address until the target amount is in the container. Short click the panel to set an address.", + "block.create.factory_panel.tooltip.behaviour2": "Recipe mode: Panel requests ingredients to an address until the target amounted of the output item is found on the network (e.g. Send 1 Log to 'saw' and expect 6 Planks, until at least 64 Planks on network). Short click the panel to set an address and connect other panels as input items. Panels specifying an output item can also be reused as an input for other panels.", + "block.create.factory_panel.tooltip.condition1": "When attached to Packager", + "block.create.factory_panel.tooltip.condition2": "When not attached to Packager", + "block.create.factory_panel.tooltip.summary": "[ponder] Click packager link before placement to use its frequency. Place item to monitor in filter slot. Hold click to specify a target amount to maintain in storage.", "block.create.fake_track": "Track Marker for Maps", "block.create.fluid_pipe": "Fluid Pipe", "block.create.fluid_tank": "Fluid Tank", @@ -500,6 +510,9 @@ "block.create.industrial_iron_window_pane": "Industrial Iron Window Pane", "block.create.item_drain": "Item Drain", "block.create.item_hatch": "Item Hatch", + "block.create.item_hatch.tooltip.behaviour1": "_Deposits_ your items into the _container_ it is placed on. _Hotbar items_ and items _with contents_ will _not_ be transferred.", + "block.create.item_hatch.tooltip.condition1": "When R-Clicked", + "block.create.item_hatch.tooltip.summary": "_Quickly solves_ your _inventory_ clutter and makes it someone else's problem.", "block.create.item_vault": "Item Vault", "block.create.jungle_window": "Jungle Window", "block.create.jungle_window_pane": "Jungle Window Pane", @@ -598,8 +611,12 @@ "block.create.oxidized_copper_tile_stairs": "Oxidized Copper Tile Stairs", "block.create.oxidized_copper_tiles": "Oxidized Copper Tiles", "block.create.package_frogport": "Package Frogport", + "block.create.package_frogport.tooltip.summary": "[ponder] Click a chain conveyor to link then place. Moves packages to and from chains based on their address. Set address filter in UI. Matching packages will be removed from chains and vice versa.", + "block.create.package_postbox.tooltip.summary": "[ponder] Click a train station to link then place. Moves packages to and from trains based on their address. Set address filter in UI. Matching packages will be removed from trains and vice versa.", "block.create.packager": "Packager", + "block.create.packager.tooltip.summary": "[ponder] Creates packages from attached inventory on redstone. Attach sign to specify target address. Alternatively, attach packager link to submit inventory contents to a logistics network.", "block.create.packager_link": "Packager Link", + "block.create.packager_link.tooltip.summary": "[ponder] Attach to packager to make its target inventory available to request from. Click other links before placement to share their frequency. No range limitations", "block.create.peculiar_bell": "Peculiar Bell", "block.create.peculiar_bell.tooltip.summary": "A decorative _Brass Bell_. Placing it right above open _Soul Fire_ may have side-effects...", "block.create.pink_display_cloth": "Pink Display Cloth", @@ -681,6 +698,7 @@ "block.create.pulse_extender": "Pulse Extender", "block.create.pulse_repeater": "Pulse Repeater", "block.create.pulse_timer": "Pulse Timer", + "block.create.pulse_timer.tooltip.summary": "[ponder] Set a delay using the input slot. Repeatedly emits redstone pulses unless the input side is powered by a constant signal.", "block.create.purple_display_cloth": "Purple Display Cloth", "block.create.purple_nixie_tube": "Purple Nixie Tube", "block.create.purple_postbox": "Purple Postbox", @@ -701,6 +719,7 @@ "block.create.redstone_contact": "Redstone Contact", "block.create.redstone_link": "Redstone Link", "block.create.redstone_requester": "Redstone Requester", + "block.create.redstone_requester.tooltip.summary": "[ponder] Click packager link before placement to use its frequency. Open UI to specify items requested to an address when a redstone pulse is received. Alternatively this request can be configured at a stock keeper before placement.", "block.create.refined_radiance_casing": "Radiant Casing", "block.create.rope": "Rope", "block.create.rope_pulley": "Rope Pulley", @@ -798,6 +817,7 @@ "block.create.sticker": "Sticker", "block.create.sticky_mechanical_piston": "Sticky Mechanical Piston", "block.create.stock_ticker": "Stock Ticker", + "block.create.stock_ticker.tooltip.summary": "[ponder] Click packager link before placement to use its frequency. Needs an adjacent entity on a seat as its stock keeper. Click the entity to request items from any linked packagers to a given address. Click the stock ticker block to organise displayed items into categories.", "block.create.stockpile_switch": "Threshold Switch", "block.create.stressometer": "Stressometer", "block.create.tiled_glass": "Tiled Glass", @@ -2919,6 +2939,9 @@ "item.create.builders_tea": "Builder's Tea", "item.create.builders_tea.tooltip.summary": "The perfect drink to get the day started- _Motivating_ and _Saturating._", "item.create.cardboard": "Cardboard", + "item.create.cardboard_armor.tooltip.behaviour1": "_Sneak_ to activate an inconspicuous _disguise_.", + "item.create.cardboard_armor.tooltip.condition1": "When full set equipped", + "item.create.cardboard_armor.tooltip.summary": "_Wearable_ _equipment_ for increased _style_ and _stealth_.", "item.create.cardboard_boots": "Cardboard Boots", "item.create.cardboard_chestplate": "Cardboard Chestplate", "item.create.cardboard_helmet": "Cardboard Helmet", @@ -2929,6 +2952,7 @@ "item.create.cardboard_package_12x12": "Cardboard Package", "item.create.cardboard_pulp": "Cardboard Pulp", "item.create.cardboard_sword": "Cardboard Sword", + "item.create.cardboard_sword.tooltip.summary": "Bonk. A _mostly_ _harmless_, yet powerful weapon of choice.", "item.create.chest_minecart_contraption": "Chest Minecart Contraption", "item.create.chocolate_bucket": "Chocolate Bucket", "item.create.chocolate_glazed_berries": "Chocolate Glazed Berries", @@ -3042,6 +3066,9 @@ "item.create.netherite_diving_helmet.tooltip.condition1": "When Worn (Full set)", "item.create.netherite_diving_helmet.tooltip.summary": "Together with a _Netherite Backtank_, this can protect you from _extreme heat_. To be effective, _Legs and Feet_ have to be covered in _Netherite_, too.", "item.create.package_filter": "Package Filter", + "item.create.package_filter.tooltip.behaviour1": "Opens the _configuration interface_.", + "item.create.package_filter.tooltip.condition1": "When R-Clicked", + "item.create.package_filter.tooltip.summary": "_Matches packaged items_ by their targeted _address_. Can be used in _Filter Slots_ of Create's Components", "item.create.polished_rose_quartz": "Polished Rose Quartz", "item.create.potato_cannon": "Potato Cannon", "item.create.potato_cannon.tooltip.behaviour1": "_Shoots_ a suitable item from your _Inventory_.", diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 67866d31b7..4620c0fcb6 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -1777,6 +1777,7 @@ public class AllBlocks { }); }) .tag(AllBlockTags.POSTBOXES.tag) + .onRegisterAfter(Registries.ITEM, v -> ItemDescription.useKey(v, "block.create.package_postbox")) .item(PackagePortItem::new) .model((c, p) -> p.withExistingParent(colourName + "_postbox", p.modLoc("block/package_postbox/item")) .texture("0", p.modLoc("block/post_box/post_box_" + colourName)) diff --git a/src/main/java/com/simibubi/create/AllItems.java b/src/main/java/com/simibubi/create/AllItems.java index 1f0d95165c..106ceda5be 100644 --- a/src/main/java/com/simibubi/create/AllItems.java +++ b/src/main/java/com/simibubi/create/AllItems.java @@ -25,6 +25,7 @@ import com.simibubi.create.content.equipment.armor.AllArmorMaterials; import com.simibubi.create.content.equipment.armor.BacktankItem; import com.simibubi.create.content.equipment.armor.BacktankItem.BacktankBlockItem; import com.simibubi.create.content.equipment.armor.BaseArmorItem; +import com.simibubi.create.content.equipment.armor.CardboardArmorItem; import com.simibubi.create.content.equipment.armor.CardboardHelmetItem; import com.simibubi.create.content.equipment.armor.DivingBootsItem; import com.simibubi.create.content.equipment.armor.DivingHelmetItem; @@ -63,6 +64,7 @@ import com.simibubi.create.foundation.item.ItemDescription; import com.simibubi.create.foundation.item.TagDependentIngredientItem; import com.tterrag.registrate.util.entry.ItemEntry; +import net.minecraft.core.registries.Registries; import net.minecraft.tags.ItemTags; import net.minecraft.tags.TagKey; import net.minecraft.world.food.FoodProperties; @@ -86,8 +88,12 @@ public class AllItems { STURDY_SHEET = taggedIngredient("sturdy_sheet", forgeItemTag("plates/obsidian"), PLATES.tag), PROPELLER = ingredient("propeller"), WHISK = ingredient("whisk"), BRASS_HAND = ingredient("brass_hand"), CRAFTER_SLOT_COVER = ingredient("crafter_slot_cover"), ELECTRON_TUBE = ingredient("electron_tube"), - CARDBOARD_PULP = ingredient("cardboard_pulp"), - CARDBOARD = taggedIngredient("cardboard", forgeItemTag("plates/cardboard")); + CARDBOARD_PULP = ingredient("cardboard_pulp"); + + public static final ItemEntry CARDBOARD = REGISTRATE.item("cardboard", CombustibleItem::new) + .tag(forgeItemTag("plates/cardboard")) + .onRegister(i -> i.setBurnTime(1000)) + .register(); public static final ItemEntry @@ -97,10 +103,9 @@ public class AllItems { public static final ItemEntry PRECISION_MECHANISM = ingredient("precision_mechanism"); - public static final ItemEntry BLAZE_CAKE_BASE = - REGISTRATE.item("blaze_cake_base", Item::new) - .tag(AllItemTags.UPRIGHT_ON_BELT.tag) - .register(); + public static final ItemEntry BLAZE_CAKE_BASE = REGISTRATE.item("blaze_cake_base", Item::new) + .tag(AllItemTags.UPRIGHT_ON_BELT.tag) + .register(); public static final ItemEntry BLAZE_CAKE = REGISTRATE.item("blaze_cake", CombustibleItem::new) .tag(AllItemTags.BLAZE_BURNER_FUEL_SPECIAL.tag, AllItemTags.UPRIGHT_ON_BELT.tag) @@ -311,33 +316,26 @@ public class AllItems { public static final ItemEntry - CARDBOARD_HELMET = - REGISTRATE - .item("cardboard_helmet", - p -> new CardboardHelmetItem(AllArmorMaterials.CARDBOARD, ArmorItem.Type.HELMET, p, - Create.asResource("cardboard"))) - .tag(forgeItemTag("armors/helmet")) - .register(), + CARDBOARD_HELMET = REGISTRATE.item("cardboard_helmet", p -> new CardboardHelmetItem(ArmorItem.Type.HELMET, p)) + .tag(forgeItemTag("armors/helmet")) + .onRegisterAfter(Registries.ITEM, v -> ItemDescription.useKey(v, "item.create.cardboard_armor")) + .register(), - CARDBOARD_CHESTPLATE = REGISTRATE - .item("cardboard_chestplate", - p -> new BaseArmorItem(AllArmorMaterials.CARDBOARD, ArmorItem.Type.CHESTPLATE, p, - Create.asResource("cardboard"))) - .tag(forgeItemTag("armors/chestplate")) - .register(), + CARDBOARD_CHESTPLATE = + REGISTRATE.item("cardboard_chestplate", p -> new CardboardArmorItem(ArmorItem.Type.CHESTPLATE, p)) + .tag(forgeItemTag("armors/chestplate")) + .onRegisterAfter(Registries.ITEM, v -> ItemDescription.useKey(v, "item.create.cardboard_armor")) + .register(), - CARDBOARD_LEGGINGS = REGISTRATE - .item("cardboard_leggings", - p -> new BaseArmorItem(AllArmorMaterials.CARDBOARD, ArmorItem.Type.LEGGINGS, p, - Create.asResource("cardboard"))) - .tag(forgeItemTag("armors/leggings")) - .register(), + CARDBOARD_LEGGINGS = + REGISTRATE.item("cardboard_leggings", p -> new CardboardArmorItem(ArmorItem.Type.LEGGINGS, p)) + .tag(forgeItemTag("armors/leggings")) + .onRegisterAfter(Registries.ITEM, v -> ItemDescription.useKey(v, "item.create.cardboard_armor")) + .register(), - CARDBOARD_BOOTS = REGISTRATE - .item("cardboard_boots", - p -> new BaseArmorItem(AllArmorMaterials.CARDBOARD, ArmorItem.Type.BOOTS, p, - Create.asResource("cardboard"))) + CARDBOARD_BOOTS = REGISTRATE.item("cardboard_boots", p -> new CardboardArmorItem(ArmorItem.Type.BOOTS, p)) .tag(forgeItemTag("armors/boots")) + .onRegisterAfter(Registries.ITEM, v -> ItemDescription.useKey(v, "item.create.cardboard_armor")) .register(); public static final ItemEntry SAND_PAPER = REGISTRATE.item("sand_paper", SandPaperItem::new) @@ -437,7 +435,7 @@ public class AllItems { REGISTRATE.item("shopping_list", ShoppingListItem::new) .properties(p -> p.stacksTo(1)) .register(); - + // Schematics public static final ItemEntry EMPTY_SCHEMATIC = REGISTRATE.item("empty_schematic", Item::new) diff --git a/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorItem.java b/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorItem.java new file mode 100644 index 0000000000..22b44f6da5 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorItem.java @@ -0,0 +1,21 @@ +package com.simibubi.create.content.equipment.armor; + +import org.jetbrains.annotations.Nullable; + +import com.simibubi.create.Create; + +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.RecipeType; + +public class CardboardArmorItem extends BaseArmorItem { + + public CardboardArmorItem(Type type, Properties properties) { + super(AllArmorMaterials.CARDBOARD, type, properties, Create.asResource("cardboard")); + } + + @Override + public int getBurnTime(ItemStack itemStack, @Nullable RecipeType recipeType) { + return 1000; + } + +} diff --git a/src/main/java/com/simibubi/create/content/equipment/armor/CardboardHelmetItem.java b/src/main/java/com/simibubi/create/content/equipment/armor/CardboardHelmetItem.java index efdf62aef9..eab4121bc1 100644 --- a/src/main/java/com/simibubi/create/content/equipment/armor/CardboardHelmetItem.java +++ b/src/main/java/com/simibubi/create/content/equipment/armor/CardboardHelmetItem.java @@ -2,17 +2,14 @@ package com.simibubi.create.content.equipment.armor; import java.util.function.Consumer; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.ArmorMaterial; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.extensions.common.IClientItemExtensions; -public class CardboardHelmetItem extends BaseArmorItem { +public class CardboardHelmetItem extends CardboardArmorItem { - public CardboardHelmetItem(ArmorMaterial armorMaterial, Type type, Properties properties, - ResourceLocation textureLoc) { - super(armorMaterial, type, properties, textureLoc); + public CardboardHelmetItem(Type type, Properties properties) { + super(type, properties); } @Override diff --git a/src/main/java/com/simibubi/create/content/equipment/tool/CardboardSwordItem.java b/src/main/java/com/simibubi/create/content/equipment/tool/CardboardSwordItem.java index f44526fb73..ccda5e4d21 100644 --- a/src/main/java/com/simibubi/create/content/equipment/tool/CardboardSwordItem.java +++ b/src/main/java/com/simibubi/create/content/equipment/tool/CardboardSwordItem.java @@ -3,6 +3,7 @@ package com.simibubi.create.content.equipment.tool; import java.util.function.Consumer; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import com.simibubi.create.AllItems; import com.simibubi.create.AllPackets; @@ -22,6 +23,7 @@ import net.minecraft.world.entity.monster.Spider; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack.TooltipPart; +import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.item.SwordItem; import net.minecraft.world.item.enchantment.Enchantment; import net.minecraft.world.item.enchantment.EnchantmentHelper; @@ -44,6 +46,11 @@ public class CardboardSwordItem extends SwordItem { super(AllToolMaterials.CARDBOARD, 3, 1f, pProperties); } + @Override + public int getBurnTime(ItemStack itemStack, @Nullable RecipeType recipeType) { + return 1000; + } + @Override public boolean canApplyAtEnchantingTable(ItemStack stack, Enchantment enchantment) { return enchantment == Enchantments.KNOCKBACK; diff --git a/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java b/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java index 4e29e03c69..85f0328555 100644 --- a/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java +++ b/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java @@ -47,6 +47,7 @@ import com.simibubi.create.content.trains.bogey.StandardBogeyBlock; import com.simibubi.create.foundation.block.ItemUseOverrides; import com.simibubi.create.foundation.block.connected.CTSpriteShiftEntry; import com.simibubi.create.foundation.block.connected.HorizontalCTBehaviour; +import com.simibubi.create.foundation.item.ItemDescription; import com.tterrag.registrate.builders.BlockBuilder; import com.tterrag.registrate.builders.ItemBuilder; import com.tterrag.registrate.providers.RegistrateRecipeProvider; @@ -58,6 +59,7 @@ import net.createmod.catnip.platform.CatnipServices; import net.minecraft.client.renderer.RenderType; import net.minecraft.core.Direction.Axis; import net.minecraft.core.Direction.AxisDirection; +import net.minecraft.core.registries.Registries; import net.minecraft.data.recipes.RecipeCategory; import net.minecraft.data.recipes.ShapelessRecipeBuilder; import net.minecraft.resources.ResourceLocation; @@ -486,6 +488,7 @@ public class BuilderTransformers { .texture("0", p.modLoc("block/display_cloth/" + name)))) .onRegister(CreateRegistrate.blockModel(() -> DisplayClothModel::new)) .tag(AllBlockTags.DISPLAY_CLOTHS.tag) + .onRegisterAfter(Registries.ITEM, v -> ItemDescription.useKey(v, "block.create.display_cloth")) .item(DisplayClothBlockItem::new) .model((c, p) -> p .withExistingParent(name + "_display_cloth", diff --git a/src/main/resources/assets/create/lang/default/tooltips.json b/src/main/resources/assets/create/lang/default/tooltips.json index d43cb9bc3b..ccddab5f4f 100644 --- a/src/main/resources/assets/create/lang/default/tooltips.json +++ b/src/main/resources/assets/create/lang/default/tooltips.json @@ -47,6 +47,10 @@ "item.create.attribute_filter.tooltip.condition1": "When R-Clicked", "item.create.attribute_filter.tooltip.behaviour1": "Opens the _configuration interface_.", + "item.create.package_filter.tooltip.summary": "_Matches packaged items_ by their targeted _address_. Can be used in _Filter Slots_ of Create's Components", + "item.create.package_filter.tooltip.condition1": "When R-Clicked", + "item.create.package_filter.tooltip.behaviour1": "Opens the _configuration interface_.", + "item.create.empty_schematic.tooltip.summary": "Used as a recipe ingredient and for writing at the _Schematic Table_.", "item.create.schematic.tooltip.summary": "Holds a structure to be positioned and placed into the world. Position the Hologram as desired and use a _Schematicannon_ to build it.", @@ -143,6 +147,12 @@ "item.create.netherite_backtank.tooltip.condition2": "When placed, Powered by Kinetics", "item.create.netherite_backtank.tooltip.behaviour2": "_Collects_ _Pressurized_ _Air_ at a rate depending on the Rotational Speed.", + "item.create.cardboard_armor.tooltip.summary": "_Wearable_ _equipment_ for increased _style_ and _stealth_.", + "item.create.cardboard_armor.tooltip.condition1": "When full set equipped", + "item.create.cardboard_armor.tooltip.behaviour1": "_Sneak_ to activate an inconspicuous _disguise_.", + + "item.create.cardboard_sword.tooltip.summary": "Bonk. A _mostly_ _harmless_, yet powerful weapon of choice.", + "block.create.placard.tooltip.summary": "_Frame_ your _items_ in brass using this fancy wall panel. Safe for contraptions!", "block.create.placard.tooltip.condition1": "When R-Clicked with Item", "block.create.placard.tooltip.behaviour1": "_Adds_ the held _item_ to the Placard. _Emits_ a brief _Redstone_ signal if a matching item was present already.", @@ -174,6 +184,10 @@ "item.create.experience_nugget.tooltip.behaviour1": "_Redeems_ _Experience_ points contained within.", "block.create.peculiar_bell.tooltip.summary": "A decorative _Brass Bell_. Placing it right above open _Soul Fire_ may have side-effects...", + + "block.create.desk_bell.tooltip.summary": "Ring for Service! Emits a _redstone signal_ when activated.", + "block.create.desk_bell.tooltip.condition1": "When attached to Elevator Contraption", + "block.create.desk_bell.tooltip.behaviour1": "_Plays a sound_ when arriving at the _target floor_.", "block.create.haunted_bell.tooltip.summary": "A _Cursed Bell_ haunted by lost souls of the Nether.", "block.create.haunted_bell.tooltip.condition1": "When Held or Rang", @@ -187,6 +201,27 @@ "block.create.copycat_step.tooltip.condition1": "When R-Clicked", "block.create.copycat_step.tooltip.behaviour1": "Applies _held item_ as its _material_ if possible. _Click again_ to cycle _orientation_ or _powered_ state. Use a _Wrench_ to _reset_ the material.", + "block.create.item_hatch.tooltip.summary": "_Quickly solves_ your _inventory_ clutter and makes it someone else's problem.", + "block.create.item_hatch.tooltip.condition1": "When R-Clicked", + "block.create.item_hatch.tooltip.behaviour1": "_Deposits_ your items into the _container_ it is placed on. _Hotbar items_ and items _with contents_ will _not_ be transferred.", + + + + "block.create.chain_conveyor.tooltip.summary": "[ponder] Connect with chains to form conveyor networks. Use frogports to transport packages on them. Use wrench to take a ride.", + "block.create.packager.tooltip.summary": "[ponder] Creates packages from attached inventory on redstone. Attach sign to specify target address. Alternatively, attach packager link to submit inventory contents to a logistics network.", + "block.create.package_frogport.tooltip.summary": "[ponder] Click a chain conveyor to link then place. Moves packages to and from chains based on their address. Set address filter in UI. Matching packages will be removed from chains and vice versa.", + "block.create.package_postbox.tooltip.summary": "[ponder] Click a train station to link then place. Moves packages to and from trains based on their address. Set address filter in UI. Matching packages will be removed from trains and vice versa.", + "block.create.packager_link.tooltip.summary": "[ponder] Attach to packager to make its target inventory available to request from. Click other links before placement to share their frequency. No range limitations", + "block.create.stock_ticker.tooltip.summary": "[ponder] Click packager link before placement to use its frequency. Needs an adjacent entity on a seat as its stock keeper. Click the entity to request items from any linked packagers to a given address. Click the stock ticker block to organise displayed items into categories.", + "block.create.redstone_requester.tooltip.summary": "[ponder] Click packager link before placement to use its frequency. Open UI to specify items requested to an address when a redstone pulse is received. Alternatively this request can be configured at a stock keeper before placement.", + "block.create.factory_panel.tooltip.summary": "[ponder] Click packager link before placement to use its frequency. Place item to monitor in filter slot. Hold click to specify a target amount to maintain in storage.", + "block.create.factory_panel.tooltip.condition1": "When attached to Packager", + "block.create.factory_panel.tooltip.behaviour1": "Restocker mode: Panel requests items from the network to the specified address until the target amount is in the container. Short click the panel to set an address.", + "block.create.factory_panel.tooltip.condition2": "When not attached to Packager", + "block.create.factory_panel.tooltip.behaviour2": "Recipe mode: Panel requests ingredients to an address until the target amounted of the output item is found on the network (e.g. Send 1 Log to 'saw' and expect 6 Planks, until at least 64 Planks on network). Short click the panel to set an address and connect other panels as input items. Panels specifying an output item can also be reused as an input for other panels.", + "block.create.display_cloth.tooltip.summary": "[ponder] Can be used for decoration, click with item to display them. Alternatively, when used on a stock keeper, specify a request from your network that can be purchased by other players. The cost can be specified after placing the configured display cloth.", + "block.create.pulse_timer.tooltip.summary": "[ponder] Set a delay using the input slot. Repeatedly emits redstone pulses unless the input side is powered by a constant signal.", + "block.create.clipboard.tooltip.summary": "_Keeps your notes_ and makes you look more professional.", "block.create.clipboard.tooltip.condition1": "When R-Clicked", "block.create.clipboard.tooltip.behaviour1": "Opens the _Interface_. _Sneak-Click_ to _place_ it on a surface.", diff --git a/src/main/resources/assets/create/models/block/contraption_controls/item.json b/src/main/resources/assets/create/models/block/contraption_controls/item.json index ef638c3c81..cd7f51f565 100644 --- a/src/main/resources/assets/create/models/block/contraption_controls/item.json +++ b/src/main/resources/assets/create/models/block/contraption_controls/item.json @@ -127,7 +127,7 @@ }, "gui": { "rotation": [30, 225, 0], - "translation": [1.5, -0.25, 0], + "translation": [0.5, -0.25, 0], "scale": [0.625, 0.625, 0.625] }, "head": { diff --git a/src/main/resources/assets/create/models/block/controls/item.json b/src/main/resources/assets/create/models/block/controls/item.json index 57f14d633e..70eebc097e 100644 --- a/src/main/resources/assets/create/models/block/controls/item.json +++ b/src/main/resources/assets/create/models/block/controls/item.json @@ -135,7 +135,7 @@ }, "gui": { "rotation": [30, 225, 0], - "translation": [1.5, -0.25, 0], + "translation": [0.5, -0.25, 0], "scale": [0.625, 0.625, 0.625] }, "head": { From 21223bfc175f6ffb3586538060dc47c39239780d Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Mon, 4 Nov 2024 15:31:14 +0100 Subject: [PATCH 107/515] Next gen cobble gen - In common cobblegen scenarios, stationary drills now skip breaking blocks and just insert the result items into open inventories directly below --- .../kinetics/drill/CobbleGenOptimisation.java | 101 ++++++++++++++++++ .../kinetics/drill/DrillBlockEntity.java | 58 ++++++++++ .../FluidInteractionRegistryAccessor.java | 21 ++++ src/main/resources/create.mixins.json | 3 +- 4 files changed, 182 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/simibubi/create/content/kinetics/drill/CobbleGenOptimisation.java create mode 100644 src/main/java/com/simibubi/create/foundation/mixin/accessor/FluidInteractionRegistryAccessor.java diff --git a/src/main/java/com/simibubi/create/content/kinetics/drill/CobbleGenOptimisation.java b/src/main/java/com/simibubi/create/content/kinetics/drill/CobbleGenOptimisation.java new file mode 100644 index 0000000000..2102def98d --- /dev/null +++ b/src/main/java/com/simibubi/create/content/kinetics/drill/CobbleGenOptimisation.java @@ -0,0 +1,101 @@ +package com.simibubi.create.content.kinetics.drill; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import javax.annotation.Nullable; + +import com.simibubi.create.foundation.fluid.FluidHelper; +import com.simibubi.create.foundation.mixin.accessor.FluidInteractionRegistryAccessor; + +import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.utility.levelWrappers.PlacementSimulationServerLevel; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.FluidState; +import net.minecraftforge.fluids.FluidInteractionRegistry.FluidInteraction; +import net.minecraftforge.fluids.FluidInteractionRegistry.HasFluidInteraction; +import net.minecraftforge.fluids.FluidInteractionRegistry.InteractionInformation; +import net.minecraftforge.fluids.FluidType; + +public class CobbleGenOptimisation { + + public record CobbleGenBlockConfiguration(List statesAroundDrill) { + } + + @Nullable + public static CobbleGenBlockConfiguration getConfig(LevelAccessor level, BlockPos drillPos, + Direction drillDirection) { + List list = new ArrayList<>(); + for (Direction side : Iterate.directions) { + BlockPos relative = drillPos.relative(drillDirection) + .relative(side); + if (level instanceof Level l && !l.isLoaded(relative)) + return null; + list.add(level.getBlockState(relative)); + } + return new CobbleGenBlockConfiguration(list); + } + + public static BlockState determineOutput(ServerLevel level, BlockPos pos, CobbleGenBlockConfiguration config) { + Map> interactions = FluidInteractionRegistryAccessor.getInteractions(); + Map> presentFluidTypes = new HashMap<>(); + + for (int i = 0; i < Iterate.directions.length; i++) { + if (config.statesAroundDrill.size() <= i) + break; + FluidState fluidState = config.statesAroundDrill.get(i) + .getFluidState(); + FluidType fluidType = fluidState.getFluidType(); + if (!fluidType.isAir() && interactions.get(fluidType) != null) + presentFluidTypes.put(fluidType, Pair.of(Iterate.directions[i], fluidState)); + } + + FluidInteraction interaction = null; + Pair affected = null; + + Search: for (Entry> type : presentFluidTypes.entrySet()) { + List list = interactions.get(type.getKey()); + FluidState state = FluidHelper.convertToFlowing(type.getValue() + .getSecond() + .getType()) + .defaultFluidState(); + + if (list == null) + continue; + for (Direction d : Iterate.horizontalDirections) { + for (InteractionInformation information : list) { + if (d == type.getValue() + .getFirst()) + continue; + BlockPos relative = pos.relative(d); + HasFluidInteraction predicate = information.predicate(); + if (!predicate.test(level, pos, relative, state)) + continue; + interaction = information.interaction(); + affected = Pair.of(d, state); + break Search; + } + } + } + + // TODO Catnip: add empty methods to PSSL overriding levelEvent() side-effects + PlacementSimulationServerLevel simulation = new PlacementSimulationServerLevel(level); + BlockState result = Blocks.AIR.defaultBlockState(); + if (interaction == null) + return result; + + interaction.interact(simulation, pos, pos.relative(affected.getFirst()), affected.getSecond()); + return simulation.blocksAdded.getOrDefault(pos, result); + } + +} diff --git a/src/main/java/com/simibubi/create/content/kinetics/drill/DrillBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/drill/DrillBlockEntity.java index e8b3ffb5f7..a115449680 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/drill/DrillBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/drill/DrillBlockEntity.java @@ -1,15 +1,32 @@ package com.simibubi.create.content.kinetics.drill; import com.simibubi.create.content.kinetics.base.BlockBreakingKineticBlockEntity; +import com.simibubi.create.content.kinetics.belt.behaviour.DirectBeltInputBehaviour; +import com.simibubi.create.content.kinetics.drill.CobbleGenOptimisation.CobbleGenBlockConfiguration; +import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.entity.HopperBlockEntity; import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.ItemHandlerHelper; public class DrillBlockEntity extends BlockBreakingKineticBlockEntity { + private CobbleGenBlockConfiguration currentConfig; + private BlockState currentOutput; + public DrillBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); + currentOutput = Blocks.AIR.defaultBlockState(); } @Override @@ -17,4 +34,45 @@ public class DrillBlockEntity extends BlockBreakingKineticBlockEntity { return getBlockPos().relative(getBlockState().getValue(DrillBlock.FACING)); } + @Override + public void onBlockBroken(BlockState stateToBreak) { + if (!optimiseCobbleGen(stateToBreak)) + super.onBlockBroken(stateToBreak); + } + + public boolean optimiseCobbleGen(BlockState stateToBreak) { + CobbleGenBlockConfiguration config = + CobbleGenOptimisation.getConfig(level, worldPosition, getBlockState().getValue(DrillBlock.FACING)); + if (config == null) + return false; + if (!(level instanceof ServerLevel sl)) + return false; + + BlockPos breakingPos = getBreakingPos(); + if (!config.equals(currentConfig)) { + currentConfig = config; + currentOutput = CobbleGenOptimisation.determineOutput(sl, breakingPos, config); + } + + if (currentOutput.isAir() || !currentOutput.equals(stateToBreak)) + return false; + + DirectBeltInputBehaviour inv = + BlockEntityBehaviour.get(level, breakingPos.below(), DirectBeltInputBehaviour.TYPE); + + if (inv != null) + for (ItemStack stack : Block.getDrops(stateToBreak, sl, breakingPos, null)) + inv.handleInsertion(stack, Direction.UP, false); + else { + BlockEntity blockEntity = level.getBlockEntity(breakingPos.below()); + if (blockEntity instanceof HopperBlockEntity hbe && hbe.getCapability(ForgeCapabilities.ITEM_HANDLER) + .orElse(null) instanceof IItemHandler handler) + for (ItemStack stack : Block.getDrops(stateToBreak, sl, breakingPos, null)) + ItemHandlerHelper.insertItemStacked(handler, stack, false); + } + + level.levelEvent(2001, breakingPos, Block.getId(stateToBreak)); + return true; + } + } diff --git a/src/main/java/com/simibubi/create/foundation/mixin/accessor/FluidInteractionRegistryAccessor.java b/src/main/java/com/simibubi/create/foundation/mixin/accessor/FluidInteractionRegistryAccessor.java new file mode 100644 index 0000000000..7c20a580e2 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/mixin/accessor/FluidInteractionRegistryAccessor.java @@ -0,0 +1,21 @@ +package com.simibubi.create.foundation.mixin.accessor; + +import java.util.List; +import java.util.Map; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import net.minecraftforge.fluids.FluidInteractionRegistry; +import net.minecraftforge.fluids.FluidInteractionRegistry.InteractionInformation; +import net.minecraftforge.fluids.FluidType; + +@Mixin(FluidInteractionRegistry.class) +public interface FluidInteractionRegistryAccessor { + + @Accessor("INTERACTIONS") + public static Map> getInteractions() { + throw new AssertionError(); + } + +} diff --git a/src/main/resources/create.mixins.json b/src/main/resources/create.mixins.json index 9f23f9336a..53d8ba2031 100644 --- a/src/main/resources/create.mixins.json +++ b/src/main/resources/create.mixins.json @@ -25,7 +25,8 @@ "accessor.NbtAccounterAccessor", "accessor.ServerLevelAccessor", "accessor.SystemReportAccessor", - "accessor.UseOnContextAccessor" + "accessor.UseOnContextAccessor", + "accessor.FluidInteractionRegistryAccessor" ], "client": [ "accessor.AgeableListModelAccessor", From 859d1078269255f54618ae5098440fbe90d9611a Mon Sep 17 00:00:00 2001 From: Kryppers <65094918+Kryppers@users.noreply.github.com> Date: Tue, 5 Nov 2024 01:17:12 +0000 Subject: [PATCH 108/515] Late night art push colour tweaks for some display cloths new sprites for cardboard and pulp new UI effect for card package blur --- .../block/display_cloth/light_blue.png | Bin 896 -> 843 bytes .../textures/block/display_cloth/lime.png | Bin 878 -> 867 bytes .../textures/block/display_cloth/pink.png | Bin 785 -> 828 bytes .../assets/create/textures/item/cardboard.png | Bin 248 -> 400 bytes .../create/textures/item/cardboard_pulp.png | Bin 280 -> 491 bytes .../create/textures/misc/package_blur.png | Bin 12296 -> 7656 bytes 6 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/create/textures/block/display_cloth/light_blue.png b/src/main/resources/assets/create/textures/block/display_cloth/light_blue.png index 915aed7f80837a78f8b3c1dffae799aba1ca80d7..10e07919b6da5371695b9556cc86cfeeb7701850 100644 GIT binary patch delta 820 zcmV-41Izq?2g?SKB!3b~L_t(oh2@vOZ__{&$3Kpb#*W)m6w1JlAXP#P2w0&5NK6cw zD+VNxD)CQrLsa|^NJtC}h`9q(5ez9E0RgIt7$^kfmO|4eaoTgu;N0PJoFZ^KAim4x zd++&j_uljOo~_y1i>O+0X-Ua^eTSBWYUKcc=2H_ct3iiFe}A{fJ~Mg2A_qjZ;&Q@s zacn_Tt}*TuGx@3V2w>Xbd!GLWps*TraBM*kN<3kcUAhMMPr zn3`~n9DBm%^nd6GjxBT~lDs5@_E+{iD5P`Tl%eJ-GD)8F9|XjrznhtJmE$0(X zGte5S`P*9YvT7im^L^0)rFh94tM^>-mXzAQZ#vLh1Ao2RpVR?Z%e{d@I_G=c4Qczh zQ_Q^qLkH&TDyP{spzZ=?|KWSgYnz>A5UekKQaqhl{boed;y?$Gal`JHFNl zxpwBF1@PciEdscCZZebijlfB7NNfAcbyEjwzN!5+-_(VgpI-;We0`geXeYYj9i}Fr zC1tk@-la6r)?G2QsaBLd)C(>DC>RT;c|R0@u73>2VI6ZKR)Y=@%Wf>cvMa~&LrMR< z5Lb>4aenL|K`6O$RMM0olSdB6%GW))vMa9a)e6jX7dm^$ycg2E?*qXMKluM({Y~DIn7x$m^ZX~>TsDG>=;_q}0000D27m{UB!5RqL_t(oh2@veixfu`$3NXwnV#7lyBilmLhQq`hXf^vUWDu+ zgj|Az`~@)y2)QhhKVWVl;yH*HA(vhM02xHQNbq35i;{y$7W3oK=*lc3)4k5l_R=+- zLtC}oJu@2Z@eur8YQFW})Kt}b^?h%wukPH<)&h$-P1)EI41ZF=xnLi_@Xqp>FiGh4 z8WZ;QQztEIK&}NAE3HKqgd|cu0>@#cJK>qy1#uI%2E`|+!sVcmIKKc27Ye{V4szi zXJVSi_~4y`GC43UM{4T;P>N|W#?>6qH#659xVoJg#edT}@VuD&Qq5lnwBi+Gtlzoj zahe+YYtwy8Ul~3Kk=5N0Pus0e3&}_BX8;#7U(QLI!e#JR} zzyEwtTKJo@UuV_1X|R6$<97C*lPA;W?ihgg7wrGUA0~?LK3KH?&fotf1Lz$4Xeyt1 z14kDcm3l8tk66|IgPt(AU+?!`c)}M!ZalVe<$tiy729-{bFRDK&hpT7#gMTUJhN}V zWfr2|H?Ul;PsJ7ZS;x7k%GXWos7 z)R@ytInPhNZ|s_D``VGADaW5KyDH`0PDG@XIpJTUA#ti$^=I4b-T(k!-2OGIGgjAm8Q6fS z>qpz8(l~3rI%>?LKX~(Cy-M7Q=&l~G_4oW=o#ZuxD+mew00000NkvXXu0mjfE?m2V diff --git a/src/main/resources/assets/create/textures/block/display_cloth/lime.png b/src/main/resources/assets/create/textures/block/display_cloth/lime.png index 5ed46687676ab9d77b446168ff815124456d7400..26dac9960ce5fe18b2abed2eb8533c703cb0d314 100644 GIT binary patch delta 844 zcmV-S1GD_@2IB^hB!4PNL_t(oh2@veOH@%5$3G75f$u#XsZk^Pp_MKSH~rj3AmJir zp#(0H1fl*1X%$ibKu`pNP>Vp^NQ;34G0{aytd9DNA=%o6a0O#aDMa2T+0qT5cz;h@FIlm{RC=<+KF~2# zMFeQc)-F!gHe+ZtIIc~?YzXD&kF^8%>;MA{MfrVVS+P<4vHT8(ZsFw#v!R3wS14Wy zXrI?-Fmwxm(Zvx=%_`wg-1(ciSD2cGw(0Jbwzbp0-|JjSb!6!tsk3T8+wtmz%n&{EPPIkphSXYwWnT;xaQ{?)9$( zw5jxDXw7AfWtt`T_C!T`K;-R`9*_Z<9QJzv zN_!--4gkKIdTSi)0hyVK_P}&{LMdKY4+Lv|Bsw4!&wpEEdCnylu2A+P(}A!a2x`Aq z2P%PBu;vHd4MBUtY=|6yPY1@9Qpyn41M)7AcCY_Gi>kL1slrZfTTRr&Yt`rAe3;+u z8=dMw^78dy;r`wJvOEmh!k2jftauIax;U#VY2tNp<&fLT`Mw}|ZYzhK+t-3ePahY4 ztgQKbgMU0Ufce=u0CpV*fNH~F*KyP+QEeDLKkppC_r(R@!hQYs3cXTXHy*mknS#{az`W+_6lxLT)TFFyU8IgpnP;8NoiwWDvFv%Uzke%(|& z3RMsk+6rETp7kUZkAip*wa|l5^(M5bC#ymg@gN?mXjK$VU5y93*?hq+@epP*yV+E9 z<3apihX1_D?3?%A{O2WdcJ5$fFgHZmv6(8|rsP;0%Z&g?K7ZUlO0jNo-<)ozwz!8Y0aSG+9YE-lOL~#b|7lj3ZyihiffbB3`&j# zAUPl-la2RDXMZZLEqNGd!~LV494BKs>wCA7h^1vDRG!jwxxQ(?6Uu?8KgSifm17YZ zm86VQ;}nF z&!JTV&|V{RL!x!21I1KS_89R^HTAGYQUfKzki|wLh;lbi+e73*=g0lU(nB2c`iT~ck*SCG8n)HCQo7N) z|Ni-)b%*yJkPXSTo8ygB$A>!dAZQEouK`FII!3R-;->;eZ%g5z!L22WvSrKp z^B2b&=6|Ozp0$1+=)mijuK=i3s{q6k32N1<90lTuglC;P2k`#wf@kBCLnj*kxj+Z@ zonB2Q-mK;i_FDkf>YIFgK;d!8i#3z0SDG8`KC=RViSc0G(SclQK+*O`J{`z=v>);w zU3gN=|MG;tjKK8b9a5U^>57N@M=3kD?1I&<7=J)?(X(G$4!rpB%(JndcS01J4^T>L zYC$&MN3m`KP;xBNnnBrVYQJdL)b(KzdGcYRv1R2Rs&0ulOV6peHajwhsJbNzJwOgJj zC{O}r$7Z<*iH2n7>iqy*W-gE~i!%>*HNuSkeSQZ~K)&k(`UcO~Y2H5ybfZ7`{}B0; hys5ancP`Z5^PfTSB;5N^Kra9Q002ovPDHLkV1g*er8)or diff --git a/src/main/resources/assets/create/textures/block/display_cloth/pink.png b/src/main/resources/assets/create/textures/block/display_cloth/pink.png index 9e5a5845233b89f969cf093e73644bb069145c64..bb7c6d99f559c1b7960f4b386e53c6319c5531e9 100644 GIT binary patch delta 806 zcmV+>1KIqM2D}E4BYy(}Nklcpm*50mR6y|;HJlUAK{A-0Z_a&S*7LG34a$hI_v{8w+u4CE=-JK z^}FEY5J80LmQ%TPwjUs7?*+`3S8s0?L>NvEottjCg9|@Yyce*er7ev8(=_H*FdeId zL;K`=uNN^L3$Y(;V{RpL0A{lmU=;H0bUPNUpb4NjpfY1s92JZRBE_@7E=^WrH8z|a z_PGIYaw-!#H-8Fw}N*jx_>WVhYK62HJ3G(X_j2?iJtU8D`~2WfO}CsmfS3*h^Q+2` z)&ue`kapewpM~-K%}cRc`=J*4Dks$EBetg<=uE(NIr` zLa`Y0(|^|hKCCRqHlCWkEs|?#FuuKdAxyUfKy%vzz#4LYi?_TzPF}uh0DOJ+Q~;d1 zej}B4&44xNYTCY;(1Ep>_QP6iCX5!>jy&N}u!H&4w&rV7acQ!O@Iy5PmnQRSDh7~K zwB!KM$M3O?le`;DXkS1^ArH`&U#||(mR-j}_}Ug)|H~k6U)>}?$56sTtphz5x(C!ly?mv zH+ou~=;y{xECbCi9>Nb*2GZ<{907*qoM6N<$f|{Lv9{>OV delta 762 zcmVi&*=vc%(Kf zHV$iVz+w=CV?&gHZ9$x#OmoO0L(^8=bCq558gOKH!OXF1A=@)5$7v)C?%27%TfYjd zu^dN9&eO;kynpCF1vp|SsLr|0anm+=u_mTc1938513I*}1%p`evOSFQ8mR$CF1F2_ z>Kqro^Q;D-vPSB_0?eEib6l?oMD9-I?rUO+q zP}csU4%B{qSqIABdAT=~?VekE1Evma_0nBYT?4uoXn%X^|4&1_TzxH%gQIL>)}PCs z%kx!!_m=Nu7m{Z$p36t~S0?f*IGdl=0hsY;@moIMcK7gGe&!JL1LFsp2mOGP;5eIq z{Pc-D*xfgL%e-;}>ua9@7=$4JP0wQxhS{jm^gP3_I0vx(Wz$&r;mQM9o~wcwe*7S1 zTFoLD0DmC;=I`+^qH*oI02sc1CjlBaZdUS%5s-ePy5Co6KbX3(*FW`yr@;~1J#cJ9 z;Z{s{LGkn!OxH%}TQR^=N7;7^_3>k1u3Y95padX{l*oXR*DzAgaoU1MX-kgthL!o( zgd?xalU$fn%64@gqJ-pfOYyGSOlH?y+ZQ|eN^=)y%$3W0(gws%A6qM0dSY9LTJx{H zyb%?75eFx~<`W}uX)ZgFI6N^TAc6sm;w%D{_L>m@VEF2-tTUF^`4gx(>b~xuGsj8u sk!~1&2XskIMF;2$ z1pyEO)5Gf~0003UNklmQk*(gaB*<) z2Xt_Bad0VQ%@m3TL~wQMpinxwUV0&FZII&hTNES!-KcZf^NeOgH$TBdseTl~C3=2As+eR)vBYlFIXT(~U>HPs zKoR79`dMhqUZLV6Ngo@K!9%m0000< KMNUMnLSTa2ft^SI delta 231 zcmbQh{DX0VWIZzj1A~Sxe=v|@EDmyaVpw-h<|UBBlJ4m1$iT3%pZiZDE08Y~;1lB7 zl4Sk<`0Puo8g@)b4l)x33g>P5#Sf&|N`m}?|APR-=KV|d14TFsJR*x382Ao@Fyrz3 z6)8Z$SWg$n5RKs2(~Nuv6nK~%wtPwWA1~)|chby^Q;`?;e`ZSC)v(q0T=!nLKNeg{ zyZYuI$nACPRD85_QNz>oIu}IWX}eY=yG*nY^_+UEYh}cqwJT&cWIXL@e0D_q-OD00009a7bBm000id z000id0mpBsWB>pF2XskIMF;2$1py8jjprQ|0004aNklb7@B1n) z=CXv$;2`M_FlkwoD^*H%<>wWaS67_Pl_h-s004HYrHc-m2LQa>g@-6KfwUzry*~8% zgv=lzGswx+4SyY}7{y|0LXgc00OxZPpNpQEP3TFZ7Xv{=2LuQL8s`P4wJ!v5AJ47; delta 264 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 literal 12296 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 k&bcsFk^dKgqz;7&LX(R2RkvBQUCw| From 4f94b94058c2e6473e2a90d46d6d1a98c0ab7d10 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Tue, 5 Nov 2024 15:25:27 +0100 Subject: [PATCH 109/515] Laptop leftovers --- .../content/logistics/BigItemStack.java | 12 +- .../factoryBoard/FactoryPanelBehaviour.java | 30 +++- .../FactoryPanelConfigurationPacket.java | 16 +- .../factoryBoard/FactoryPanelScreen.java | 160 +++++++++++++++--- .../logistics/packager/InventorySummary.java | 8 +- .../packager/PackagerBlockEntity.java | 6 + .../packagerLink/LogisticsManager.java | 9 +- .../stockTicker/RequestCraftableHelper.java | 108 ++++++++++++ .../stockTicker/StockTickerRequestScreen.java | 3 + 9 files changed, 315 insertions(+), 37 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/logistics/stockTicker/RequestCraftableHelper.java diff --git a/src/main/java/com/simibubi/create/content/logistics/BigItemStack.java b/src/main/java/com/simibubi/create/content/logistics/BigItemStack.java index 8936b33170..19bda7497c 100644 --- a/src/main/java/com/simibubi/create/content/logistics/BigItemStack.java +++ b/src/main/java/com/simibubi/create/content/logistics/BigItemStack.java @@ -9,14 +9,20 @@ import net.minecraft.world.item.ItemStack; public class BigItemStack { + public static final int INF = 1_000_000_000; + public ItemStack stack; public int count; + public BigItemStack(ItemStack stack) { + this(stack, 1); + } + public BigItemStack(ItemStack stack, int count) { this.stack = stack; this.count = count; } - + public CompoundTag write() { CompoundTag tag = new CompoundTag(); tag.put("Item", stack.serializeNBT()); @@ -32,6 +38,10 @@ public class BigItemStack { buffer.writeItem(stack); buffer.writeVarInt(count); } + + public boolean isInfinite() { + return count >= INF; + } public static BigItemStack receive(FriendlyByteBuf buffer) { return new BigItemStack(buffer.readItem(), buffer.readVarInt()); diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java index 8bf2b59cdb..fdac6383ef 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java @@ -69,6 +69,7 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { public Map targetedBy; public Set targeting; + public List activeCraftingArrangement; public boolean satisfied; public boolean promisedSatisfied; @@ -99,6 +100,7 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { this.satisfied = false; this.promisedSatisfied = false; this.waitingForNetwork = false; + this.activeCraftingArrangement = List.of(); this.recipeAddress = ""; this.recipeOutput = 1; this.active = false; @@ -195,6 +197,8 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { boolean failed = false; Multimap toRequest = HashMultimap.create(); + List toRequestAsList = new ArrayList<>(); + for (FactoryPanelConnection connection : targetedBy.values()) { FactoryPanelBehaviour source = at(getWorld(), connection.from); if (source == null) @@ -209,7 +213,9 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { continue; } - toRequest.put(source.network, new BigItemStack(item, amount)); + BigItemStack stack = new BigItemStack(item, amount); + toRequest.put(source.network, stack); + toRequestAsList.add(stack); sendEffect(connection.from, true); } @@ -218,12 +224,22 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { // Input items may come from differing networks Map> asMap = toRequest.asMap(); + PackageOrder requestContext = new PackageOrder(toRequestAsList); List> requests = new ArrayList<>(); + // Panel may enforce item arrangement + if (!activeCraftingArrangement.isEmpty()) + requestContext = new PackageOrder(activeCraftingArrangement.stream() + .map(BigItemStack::new) + .toList()); + // Collect request distributions - for (Entry> entry : asMap.entrySet()) - requests.add(LogisticsManager.findPackagersForRequest(entry.getKey(), - new PackageOrder(new ArrayList<>(entry.getValue())), null, recipeAddress)); + for (Entry> entry : asMap.entrySet()) { + PackageOrder order = new PackageOrder(new ArrayList<>(entry.getValue())); + Multimap request = + LogisticsManager.findPackagersForRequest(entry.getKey(), order, requestContext, null, recipeAddress); + requests.add(request); + } // Check if any packager is busy - cancel all for (Multimap entry : requests) @@ -478,6 +494,7 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { panelTag.putInt("RecipeOutput", recipeOutput); panelTag.putInt("PromiseClearingInterval", promiseClearingInterval); panelTag.putUUID("Freq", network); + panelTag.put("Craft", NBTHelper.writeItemList(activeCraftingArrangement)); if (panelBE().restocker && !clientPacket) panelTag.put("Promises", restockerPromises.write()); @@ -515,6 +532,7 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { NBTHelper.iterateCompoundList(panelTag.getList("TargetedBy", Tag.TAG_COMPOUND), c -> targetedBy.put(FactoryPanelPosition.read(c), FactoryPanelConnection.read(c))); + activeCraftingArrangement = NBTHelper.readItemList(panelTag.getList("Craft", Tag.TAG_COMPOUND)); recipeAddress = panelTag.getString("RecipeAddress"); recipeOutput = panelTag.getInt("RecipeOutput"); @@ -580,8 +598,8 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { else if (waitingForNetwork) key = "factory_panel.some_links_unloaded"; else if (getAmount() == 0 || targetedBy.isEmpty()) - key = getFilter().getHoverName() - .getString(); + return getFilter().getHoverName() + .plainCopy(); else { String stacks = upTo ? "" : "\u25A4"; key = getFilter().getHoverName() diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConfigurationPacket.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConfigurationPacket.java index 62f6663198..28ce4c8b4b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConfigurationPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConfigurationPacket.java @@ -1,6 +1,8 @@ package com.simibubi.create.content.logistics.factoryBoard; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -10,23 +12,26 @@ import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBlock.Pane import com.simibubi.create.foundation.networking.BlockEntityConfigurationPacket; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.item.ItemStack; public class FactoryPanelConfigurationPacket extends BlockEntityConfigurationPacket { private PanelSlot slot; private String address; private Map inputAmounts; + private List craftingArrangement; private int outputAmount; private int promiseClearingInterval; private FactoryPanelPosition removeConnection; private boolean clearPromises; public FactoryPanelConfigurationPacket(FactoryPanelPosition position, String address, - Map inputAmounts, int outputAmount, int promiseClearingInterval, - @Nullable FactoryPanelPosition removeConnection, boolean clearPromises) { + Map inputAmounts, List craftingArrangement, int outputAmount, + int promiseClearingInterval, @Nullable FactoryPanelPosition removeConnection, boolean clearPromises) { super(position.pos()); this.address = address; this.inputAmounts = inputAmounts; + this.craftingArrangement = craftingArrangement; this.outputAmount = outputAmount; this.promiseClearingInterval = promiseClearingInterval; this.removeConnection = removeConnection; @@ -48,6 +53,8 @@ public class FactoryPanelConfigurationPacket extends BlockEntityConfigurationPac .send(buffer); buffer.writeVarInt(entry.getValue()); } + buffer.writeVarInt(craftingArrangement.size()); + craftingArrangement.forEach(buffer::writeItem); buffer.writeVarInt(outputAmount); buffer.writeVarInt(promiseClearingInterval); buffer.writeBoolean(removeConnection != null); @@ -64,6 +71,10 @@ public class FactoryPanelConfigurationPacket extends BlockEntityConfigurationPac int entries = buffer.readVarInt(); for (int i = 0; i < entries; i++) inputAmounts.put(FactoryPanelPosition.receive(buffer), buffer.readVarInt()); + int craftEntries = buffer.readVarInt(); + craftingArrangement = new ArrayList<>(); + for (int i = 0; i < craftEntries; i++) + craftingArrangement.add(buffer.readItem()); outputAmount = buffer.readVarInt(); promiseClearingInterval = buffer.readVarInt(); if (buffer.readBoolean()) @@ -88,6 +99,7 @@ public class FactoryPanelConfigurationPacket extends BlockEntityConfigurationPac behaviour.recipeOutput = outputAmount; behaviour.promiseClearingInterval = promiseClearingInterval; + behaviour.activeCraftingArrangement = craftingArrangement; if (removeConnection != null) { behaviour.targetedBy.remove(removeConnection); diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java index d9bb6c6b7c..91aade7ff3 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java @@ -2,8 +2,11 @@ package com.simibubi.create.content.logistics.factoryBoard; import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; import javax.annotation.Nullable; @@ -11,6 +14,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.AllPackets; +import com.simibubi.create.AllRecipeTypes; import com.simibubi.create.content.logistics.AddressEditBox; import com.simibubi.create.content.logistics.BigItemStack; import com.simibubi.create.content.trains.station.NoShadowFontWrapper; @@ -27,10 +31,16 @@ import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.EditBox; +import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.util.Mth; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.CraftingRecipe; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.RecipeType; public class FactoryPanelScreen extends AbstractSimiScreen { @@ -46,10 +56,15 @@ public class FactoryPanelScreen extends AbstractSimiScreen { private List inputConfig; private List connections; + private CraftingRecipe availableCraftingRecipe; + private boolean craftingActive; + private List craftingIngredients; + public FactoryPanelScreen(FactoryPanelBehaviour behaviour) { this.behaviour = behaviour; minecraft = Minecraft.getInstance(); restocker = behaviour.panelBE().restocker; + availableCraftingRecipe = null; updateConfigs(); } @@ -62,6 +77,31 @@ public class FactoryPanelScreen extends AbstractSimiScreen { return b == null ? new BigItemStack(ItemStack.EMPTY, 0) : new BigItemStack(b.getFilter(), c.amount); }) .toList(); + searchForCraftingRecipe(); + + craftingActive = false; + if (availableCraftingRecipe == null) + return; + + outputConfig.count = availableCraftingRecipe.getResultItem(minecraft.level.registryAccess()) + .getCount(); + craftingIngredients = new ArrayList<>(); + craftingActive = true; + + Ingredients: for (Ingredient ingredient : availableCraftingRecipe.getIngredients()) { + if (ingredient.isEmpty()) { + craftingIngredients.add(new BigItemStack(ItemStack.EMPTY, 1)); + continue; + } + for (BigItemStack bigItemStack : inputConfig) { + if (!ingredient.test(bigItemStack.stack)) + continue; + craftingIngredients.add(bigItemStack); + continue Ingredients; + } + while (craftingIngredients.size() < 9) + craftingIngredients.add(new BigItemStack(ItemStack.EMPTY, 1)); + } } @Override @@ -94,7 +134,7 @@ public class FactoryPanelScreen extends AbstractSimiScreen { promiseExpiration.setState(behaviour.promiseClearingInterval); addRenderableWidget(promiseExpiration); - if (!restocker && behaviour.targetedBy.size() < 9) { + if (!craftingActive && !restocker && behaviour.targetedBy.size() < 9) { int slot = behaviour.targetedBy.size(); newInputButton = new IconButton(x + 24 + (slot % 3 * 18), y + 27 + (slot / 3 * 18), AllIcons.I_ADD); newInputButton.withCallback(() -> { @@ -106,18 +146,21 @@ public class FactoryPanelScreen extends AbstractSimiScreen { addRenderableWidget(newInputButton); } - displayedExtraRows = Math.min((behaviour.targetedBy.size() / 3), 2); + displayedExtraRows = rowsToDisplay(); + } + + private int rowsToDisplay() { + return craftingActive ? 2 : Math.min((behaviour.targetedBy.size() / 3), 2); } private int middleHeight() { - return AllGuiTextures.FACTORY_PANEL_MIDDLE.getHeight() + Math.min((behaviour.targetedBy.size() / 3), 2) * 18; + return AllGuiTextures.FACTORY_PANEL_MIDDLE.getHeight() + rowsToDisplay() * 18; } @Override public void tick() { super.tick(); - if (inputConfig.size() != behaviour.targetedBy.size() - || displayedExtraRows != Math.min((behaviour.targetedBy.size() / 3), 2)) { + if (inputConfig.size() != behaviour.targetedBy.size() || displayedExtraRows != rowsToDisplay()) { updateConfigs(); init(); } @@ -144,27 +187,32 @@ public class FactoryPanelScreen extends AbstractSimiScreen { // RECIPE int slot = 0; + int slotsToRender = craftingActive ? 9 : behaviour.targetedBy.size(); for (int frame : Iterate.zeroAndOne) { AllGuiTextures sprite = frame == 0 ? AllGuiTextures.FACTORY_PANEL_SLOT_FRAME : AllGuiTextures.FACTORY_PANEL_SLOT; - for (slot = 0; slot < behaviour.targetedBy.size(); slot++) + for (slot = 0; slot < slotsToRender; slot++) sprite.render(graphics, x + 23 + frame + (slot % 3 * 18), y + 26 + frame + (slot / 3 * 18)); if (slot < 9) sprite.render(graphics, x + 23 + frame + (slot % 3 * 18), y + 26 + frame + (slot / 3 * 18)); } slot = 0; - for (BigItemStack itemStack : inputConfig) { - renderInputItem(graphics, slot, itemStack, mouseX, mouseY); - slot++; - } + + if (craftingActive) { + for (BigItemStack itemStack : craftingIngredients) + renderInputItem(graphics, slot++, itemStack, mouseX, mouseY); + + } else + for (BigItemStack itemStack : inputConfig) + renderInputItem(graphics, slot++, itemStack, mouseX, mouseY); if (restocker) renderInputItem(graphics, slot, new BigItemStack(behaviour.getFilter(), 1), mouseX, mouseY); if (inputConfig.size() > 0) { - AllGuiTextures.FACTORY_PANEL_ARROW.render(graphics, - x + 75 + Mth.clamp(behaviour.targetedBy.size(), 0, 2) * 9, y + 16 + middleHeight() / 2); + int arrowOffset = Mth.clamp(slotsToRender, 0, 2); + AllGuiTextures.FACTORY_PANEL_ARROW.render(graphics, x + 75 + arrowOffset * 9, y + 16 + middleHeight() / 2); int outputX = x + 130; int outputY = y + 16 + middleHeight() / 2; AllGuiTextures.FACTORY_PANEL_SLOT_FRAME.render(graphics, outputX - 2, outputY - 2); @@ -293,12 +341,15 @@ public class FactoryPanelScreen extends AbstractSimiScreen { int inputY = guiTop + 28 + (slot / 3 * 18); graphics.renderItem(itemStack.stack, inputX, inputY); - if (!restocker && !itemStack.stack.isEmpty()) + if (!craftingActive && !restocker && !itemStack.stack.isEmpty()) graphics.renderItemDecorations(font, itemStack.stack, inputX, inputY, itemStack.count + ""); if (mouseX < inputX - 1 || mouseX >= inputX - 1 + 18 || mouseY < inputY - 1 || mouseY >= inputY - 1 + 18) return; + if (craftingActive) + return; + if (itemStack.stack.isEmpty()) { graphics.renderComponentTooltip(font, List.of(CreateLang.translate("gui.factory_panel.empty_panel") .color(ScrollInput.HEADER_RGB) @@ -423,14 +474,15 @@ public class FactoryPanelScreen extends AbstractSimiScreen { int y = guiTop; // Remove connections - for (int i = 0; i < connections.size(); i++) { - int inputX = x + 25 + (i % 3 * 18); - int inputY = y + 28 + (i / 3 * 18); - if (mouseX >= inputX && mouseX < inputX + 16 && mouseY >= inputY && mouseY < inputY + 16) { - sendIt(connections.get(i).from, false); - return true; + if (!craftingActive) + for (int i = 0; i < connections.size(); i++) { + int inputX = x + 25 + (i % 3 * 18); + int inputY = y + 28 + (i / 3 * 18); + if (mouseX >= inputX && mouseX < inputX + 16 && mouseY >= inputY && mouseY < inputY + 16) { + sendIt(connections.get(i).from, false); + return true; + } } - } // Clear promises int itemY = y + 54 + middleHeight(); @@ -448,6 +500,9 @@ public class FactoryPanelScreen extends AbstractSimiScreen { int x = guiLeft; int y = guiTop; + if (craftingActive) + return super.mouseScrolled(mouseX, mouseY, pDelta); + for (int i = 0; i < inputConfig.size(); i++) { int inputX = x + 25 + (i % 3 * 18); int inputY = y + 28 + (i / 3 * 18); @@ -486,9 +541,70 @@ public class FactoryPanelScreen extends AbstractSimiScreen { if (inputConfig.size() == connections.size()) for (int i = 0; i < inputConfig.size(); i++) inputs.put(connections.get(i).from, inputConfig.get(i).count); + + List craftingArrangement = craftingActive ? craftingIngredients.stream() + .map(b -> b.stack) + .toList() : List.of(); + + FactoryPanelPosition pos = behaviour.getPanelPosition(); + int promiseExp = promiseExpiration.getState(); + String address = addressBox.getValue(); + + FactoryPanelConfigurationPacket packet = new FactoryPanelConfigurationPacket(pos, address, inputs, + craftingArrangement, outputConfig.count, promiseExp, toRemove, clearPromises); AllPackets.getChannel() - .sendToServer(new FactoryPanelConfigurationPacket(behaviour.getPanelPosition(), addressBox.getValue(), - inputs, outputConfig.count, promiseExpiration.getState(), toRemove, clearPromises)); + .sendToServer(packet); + } + + private void searchForCraftingRecipe() { + ItemStack output = outputConfig.stack; + if (output.isEmpty()) + return; + if (behaviour.targetedBy.isEmpty()) + return; + + Set itemsToUse = inputConfig.stream() + .map(b -> b.stack) + .filter(i -> !i.isEmpty()) + .map(i -> i.getItem()) + .collect(Collectors.toSet()); + + ClientLevel level = Minecraft.getInstance().level; + + availableCraftingRecipe = level.getRecipeManager() + .getAllRecipesFor(RecipeType.CRAFTING) + .parallelStream() + .filter(r -> r.getSerializer() == RecipeSerializer.SHAPED_RECIPE + || r.getSerializer() == RecipeSerializer.SHAPELESS_RECIPE) + .filter(r -> output.getItem() == r.getResultItem(level.registryAccess()) + .getItem()) + .filter(r -> { + if (AllRecipeTypes.shouldIgnoreInAutomation(r)) + return false; + + Set itemsUsed = new HashSet<>(); + for (Ingredient ingredient : r.getIngredients()) { + if (ingredient.isEmpty()) + continue; + boolean available = false; + for (BigItemStack bis : inputConfig) { + if (!bis.stack.isEmpty() && ingredient.test(bis.stack)) { + available = true; + itemsUsed.add(bis.stack.getItem()); + break; + } + } + if (!available) + return false; + } + + if (itemsUsed.size() < itemsToUse.size()) + return false; + + return true; + }) + .findAny() + .orElse(null); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/InventorySummary.java b/src/main/java/com/simibubi/create/content/logistics/packager/InventorySummary.java index 8431b9a367..efb6d3aa7a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/InventorySummary.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/InventorySummary.java @@ -58,13 +58,15 @@ public class InventorySummary { if (count == 0 || stack.isEmpty()) return; - totalCount += count; + if (totalCount < BigItemStack.INF) + totalCount += count; List stacks = items.computeIfAbsent(stack.getItem(), $ -> Lists.newArrayList()); for (BigItemStack existing : stacks) { ItemStack existingStack = existing.stack; if (ItemHandlerHelper.canItemStacksStack(existingStack, stack)) { - existing.count += count; + if (existing.count < BigItemStack.INF) + existing.count += count; return; } } @@ -101,7 +103,7 @@ public class InventorySummary { } return stacksByCount; } - + public List getStacksByCount() { if (stacksByCount == null) { stacksByCount = new ArrayList<>(); diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java index 890a1141c3..36b7c0b37e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java @@ -151,6 +151,12 @@ public class PackagerBlockEntity extends SmartBlockEntity { this.availableItems = availableItems; return availableItems; } + + if (targetInv instanceof BottomlessItemHandler bih) { + availableItems.add(bih.getStackInSlot(0), BigItemStack.INF); + this.availableItems = availableItems; + return availableItems; + } for (int slot = 0; slot < targetInv.getSlots(); slot++) availableItems.add(targetInv.getStackInSlot(slot)); diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsManager.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsManager.java index ef8c90d1e8..67e206ed1b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsManager.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsManager.java @@ -71,7 +71,7 @@ public class LogisticsManager { public static boolean broadcastPackageRequest(UUID freqId, RequestType type, PackageOrder order, IItemHandler ignoredHandler, String address) { Multimap requests = - findPackagersForRequest(freqId, order, ignoredHandler, address); + findPackagersForRequest(freqId, order, null, ignoredHandler, address); // Check if packagers have accumulated too many packages already for (PackagerBlockEntity packager : requests.keySet()) @@ -84,7 +84,8 @@ public class LogisticsManager { } public static Multimap findPackagersForRequest(UUID freqId, - PackageOrder order, IItemHandler ignoredHandler, String address) { + PackageOrder order, @Nullable PackageOrder customContext, @Nullable IItemHandler ignoredHandler, + String address) { List stacks = order.stacks(); Multimap requests = HashMultimap.create(); @@ -95,6 +96,8 @@ public class LogisticsManager { // First box needs to carry the order specifics for successful defrag PackageOrder contextToSend = order; + if (customContext != null) + contextToSend = customContext; // Packages from future orders should not be merged in the packager queue int orderId = r.nextInt(); @@ -143,7 +146,7 @@ public class LogisticsManager { for (Entry> entry : asMap.entrySet()) { ArrayList queuedRequests = new ArrayList<>(entry.getValue()); PackagerBlockEntity packager = entry.getKey(); - + for (int i = 0; i < 100; i++) { if (queuedRequests.isEmpty()) break; diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/RequestCraftableHelper.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/RequestCraftableHelper.java new file mode 100644 index 0000000000..e772d2425d --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/RequestCraftableHelper.java @@ -0,0 +1,108 @@ +package com.simibubi.create.content.logistics.stockTicker; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import com.simibubi.create.content.logistics.BigItemStack; +import com.simibubi.create.content.logistics.packager.InventorySummary; + +import net.createmod.catnip.utility.IntAttached; +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.core.RegistryAccess; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeManager; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.RecipeType; + +public class RequestCraftableHelper { + + class CraftingDependency { + + private int amount; + private List options; + + CraftingDependency(int amount, List options) { + this.amount = amount; + this.options = options; + } + + boolean canReuseFor(Ingredient ingredient) { + return options.stream() + .allMatch(ingredient); + } + + } + + record CraftableItem(ItemStack result, List dependencies) { + } + + private List> craftableByDepth; + + public void rebuild(InventorySummary baseItems) { + List stacksByCount = baseItems.getStacksByCount(); + ClientLevel level = Minecraft.getInstance().level; + RecipeManager recipeManager = level.getRecipeManager(); + RegistryAccess registryAccess = level.registryAccess(); + Set> checked = new HashSet<>(); + + for (int depth = 0; depth < 3; depth++) { + List itemsOnThisDepth = new ArrayList<>(); + + recipeManager.getAllRecipesFor(RecipeType.CRAFTING) + .parallelStream() + .filter(r -> r.getSerializer() == RecipeSerializer.SHAPED_RECIPE + || r.getSerializer() == RecipeSerializer.SHAPELESS_RECIPE) + .filter(r -> r.getIngredients() + .stream() + .allMatch(i -> stacksByCount.stream() + .anyMatch(b -> i.test(b.stack)) + || craftableByDepth.stream() + .anyMatch(l -> l.stream() + .anyMatch(s -> i.test(s.result))))) + + .forEachOrdered(r -> { + ItemStack resultItem = r.getResultItem(registryAccess); + List dependencies = new ArrayList<>(); + + Ingredients: for (Ingredient ingredient : r.getIngredients()) { + if (ingredient.isEmpty()) + continue; + + for (CraftingDependency existing : dependencies) { + if (!existing.canReuseFor(ingredient)) + continue; + existing.amount++; + continue Ingredients; + } + + List list = stacksByCount.stream() + .map(b -> b.stack) + .filter(ingredient) + .toList(); + + for (List layer : craftableByDepth) { + if (!list.isEmpty()) + break; + list = layer.stream() + .map(b -> b.result) + .filter(ingredient) + .toList(); + } + + dependencies.add(new CraftingDependency(1, list)); + } + + itemsOnThisDepth.add(new CraftableItem(resultItem, dependencies)); + }); + + craftableByDepth.add(itemsOnThisDepth); + } + + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java index b761082c24..3f5323b91b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java @@ -580,6 +580,9 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre : count >= 1000 ? ((count * 10) / 1000) / 10f + "k" : count >= 100 ? count + "" : count > 0 ? " " + count : "";// " \u2714"; + if (count >= BigItemStack.INF) + text = "+"; + if (text.isBlank()) return; From 21a2bf6a20aae089dbe5de10fb6b060bbee6e3f6 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Tue, 5 Nov 2024 21:08:44 +0100 Subject: [PATCH 110/515] Whatchamacallit - Rename some blocks and items - Cannot disguise while flying - Deployers can no longer take a seat - Reorder block entries --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 256 +++++++------- .../82992cbf8f2794d83ac94034835eac0acd7915b9 | 10 +- .../b256105d8411632b0d585496ea8944a751a08034 | 6 +- .../blockstates/andesite_display_cloth.json | 7 - .../blockstates/andesite_table_cloth.json | 7 + .../blockstates/black_display_cloth.json | 7 - .../create/blockstates/black_table_cloth.json | 7 + .../blockstates/blue_display_cloth.json | 7 - .../create/blockstates/blue_table_cloth.json | 7 + .../blockstates/brass_display_cloth.json | 7 - .../create/blockstates/brass_table_cloth.json | 7 + .../blockstates/brown_display_cloth.json | 7 - .../create/blockstates/brown_table_cloth.json | 7 + .../blockstates/copper_display_cloth.json | 7 - .../blockstates/copper_table_cloth.json | 7 + .../blockstates/cyan_display_cloth.json | 7 - .../create/blockstates/cyan_table_cloth.json | 7 + ...{factory_panel.json => factory_gauge.json} | 96 +++--- .../blockstates/gray_display_cloth.json | 7 - .../create/blockstates/gray_table_cloth.json | 7 + .../blockstates/green_display_cloth.json | 7 - .../create/blockstates/green_table_cloth.json | 7 + .../blockstates/light_blue_display_cloth.json | 7 - .../blockstates/light_blue_table_cloth.json | 7 + .../blockstates/light_gray_display_cloth.json | 7 - .../blockstates/light_gray_table_cloth.json | 7 + .../blockstates/lime_display_cloth.json | 7 - .../create/blockstates/lime_table_cloth.json | 7 + .../blockstates/magenta_display_cloth.json | 7 - .../blockstates/magenta_table_cloth.json | 7 + .../blockstates/orange_display_cloth.json | 7 - .../blockstates/orange_table_cloth.json | 7 + .../blockstates/pink_display_cloth.json | 7 - .../create/blockstates/pink_table_cloth.json | 7 + .../blockstates/purple_display_cloth.json | 7 - .../blockstates/purple_table_cloth.json | 7 + .../create/blockstates/red_display_cloth.json | 7 - .../create/blockstates/red_table_cloth.json | 7 + .../{packager_link.json => stock_link.json} | 24 +- .../blockstates/white_display_cloth.json | 7 - .../create/blockstates/white_table_cloth.json | 7 + .../blockstates/yellow_display_cloth.json | 7 - .../blockstates/yellow_table_cloth.json | 7 + .../resources/assets/create/lang/en_ud.json | 74 ++-- .../resources/assets/create/lang/en_us.json | 74 ++-- .../models/block/andesite_display_cloth.json | 6 - .../models/block/andesite_table_cloth.json | 6 + .../models/block/black_display_cloth.json | 6 - .../models/block/black_table_cloth.json | 6 + .../models/block/blue_display_cloth.json | 6 - .../create/models/block/blue_table_cloth.json | 6 + .../models/block/brass_display_cloth.json | 6 - .../models/block/brass_table_cloth.json | 6 + .../models/block/brown_display_cloth.json | 6 - .../models/block/brown_table_cloth.json | 6 + .../models/block/copper_display_cloth.json | 6 - .../models/block/copper_table_cloth.json | 6 + .../models/block/cyan_display_cloth.json | 6 - .../create/models/block/cyan_table_cloth.json | 6 + .../models/block/gray_display_cloth.json | 6 - .../create/models/block/gray_table_cloth.json | 6 + .../models/block/green_display_cloth.json | 6 - .../models/block/green_table_cloth.json | 6 + .../block/light_blue_display_cloth.json | 6 - .../models/block/light_blue_table_cloth.json | 6 + .../block/light_gray_display_cloth.json | 6 - .../models/block/light_gray_table_cloth.json | 6 + .../models/block/lime_display_cloth.json | 6 - .../create/models/block/lime_table_cloth.json | 6 + .../models/block/magenta_display_cloth.json | 6 - .../models/block/magenta_table_cloth.json | 6 + .../models/block/orange_display_cloth.json | 6 - .../models/block/orange_table_cloth.json | 6 + .../models/block/pink_display_cloth.json | 6 - .../create/models/block/pink_table_cloth.json | 6 + .../models/block/purple_display_cloth.json | 6 - .../models/block/purple_table_cloth.json | 6 + .../models/block/red_display_cloth.json | 6 - .../create/models/block/red_table_cloth.json | 6 + .../models/block/white_display_cloth.json | 6 - .../models/block/white_table_cloth.json | 6 + .../models/block/yellow_display_cloth.json | 6 - .../models/block/yellow_table_cloth.json | 6 + .../models/item/andesite_display_cloth.json | 6 - .../models/item/andesite_table_cloth.json | 6 + .../models/item/black_display_cloth.json | 6 - .../create/models/item/black_table_cloth.json | 6 + .../models/item/blue_display_cloth.json | 6 - .../create/models/item/blue_table_cloth.json | 6 + .../models/item/brass_display_cloth.json | 6 - .../create/models/item/brass_table_cloth.json | 6 + .../models/item/brown_display_cloth.json | 6 - .../create/models/item/brown_table_cloth.json | 6 + .../models/item/copper_display_cloth.json | 6 - .../models/item/copper_table_cloth.json | 6 + .../models/item/cyan_display_cloth.json | 6 - .../create/models/item/cyan_table_cloth.json | 6 + .../create/models/item/factory_gauge.json | 3 + .../create/models/item/factory_panel.json | 3 - .../models/item/gray_display_cloth.json | 6 - .../create/models/item/gray_table_cloth.json | 6 + .../models/item/green_display_cloth.json | 6 - .../create/models/item/green_table_cloth.json | 6 + .../models/item/light_blue_display_cloth.json | 6 - .../models/item/light_blue_table_cloth.json | 6 + .../models/item/light_gray_display_cloth.json | 6 - .../models/item/light_gray_table_cloth.json | 6 + .../models/item/lime_display_cloth.json | 6 - .../create/models/item/lime_table_cloth.json | 6 + .../models/item/magenta_display_cloth.json | 6 - .../models/item/magenta_table_cloth.json | 6 + .../models/item/orange_display_cloth.json | 6 - .../models/item/orange_table_cloth.json | 6 + .../create/models/item/packager_link.json | 3 - .../models/item/pink_display_cloth.json | 6 - .../create/models/item/pink_table_cloth.json | 6 + .../item/{cardboard_pulp.json => pulp.json} | 2 +- .../models/item/purple_display_cloth.json | 6 - .../models/item/purple_table_cloth.json | 6 + .../create/models/item/red_display_cloth.json | 6 - .../create/models/item/red_table_cloth.json | 6 + .../assets/create/models/item/stock_link.json | 3 + .../models/item/white_display_cloth.json | 6 - .../create/models/item/white_table_cloth.json | 6 + .../models/item/yellow_display_cloth.json | 6 - .../models/item/yellow_table_cloth.json | 6 + ...r.json => andesite_table_cloth_clear.json} | 10 +- ...lear.json => black_table_cloth_clear.json} | 10 +- .../logistics/blue_table_cloth_clear.json | 35 ++ .../logistics/brass_table_cloth_clear.json | 35 ++ .../logistics/brown_display_cloth_clear.json | 35 -- .../logistics/brown_table_cloth_clear.json | 35 ++ ...ear.json => copper_table_cloth_clear.json} | 10 +- .../logistics/cyan_table_cloth_clear.json | 35 ++ ...nk_clear.json => factory_gauge_clear.json} | 6 +- .../logistics/gray_table_cloth_clear.json | 35 ++ .../logistics/green_display_cloth_clear.json | 35 -- .../logistics/green_table_cloth_clear.json | 35 ++ .../light_blue_display_cloth_clear.json | 35 -- ...json => light_blue_table_cloth_clear.json} | 10 +- .../light_gray_display_cloth_clear.json | 35 -- ...json => light_gray_table_cloth_clear.json} | 10 +- .../logistics/lime_table_cloth_clear.json | 35 ++ .../magenta_display_cloth_clear.json | 35 -- ...ar.json => magenta_table_cloth_clear.json} | 10 +- .../logistics/orange_display_cloth_clear.json | 35 -- ...ear.json => orange_table_cloth_clear.json} | 10 +- .../logistics/pink_display_cloth_clear.json | 35 -- .../logistics/pink_table_cloth_clear.json | 35 ++ .../logistics/purple_display_cloth_clear.json | 35 -- ...ear.json => purple_table_cloth_clear.json} | 10 +- .../logistics/red_table_cloth_clear.json | 35 ++ ...panel_clear.json => stock_link_clear.json} | 6 +- .../logistics/white_display_cloth_clear.json | 35 -- .../logistics/white_table_cloth_clear.json | 35 ++ .../logistics/yellow_display_cloth_clear.json | 35 -- ...ear.json => yellow_table_cloth_clear.json} | 20 +- ...y_cloth.json => andesite_table_cloth.json} | 4 +- ...play_cloth.json => black_table_cloth.json} | 4 +- ...splay_cloth.json => blue_table_cloth.json} | 4 +- .../loot_tables/blocks/brass_table_cloth.json | 21 ++ .../blocks/brown_display_cloth.json | 21 -- .../loot_tables/blocks/brown_table_cloth.json | 21 ++ .../blocks/copper_display_cloth.json | 21 -- ...lay_cloth.json => copper_table_cloth.json} | 4 +- .../loot_tables/blocks/cyan_table_cloth.json | 21 ++ ...{packager_link.json => factory_gauge.json} | 4 +- .../loot_tables/blocks/gray_table_cloth.json | 21 ++ .../blocks/green_display_cloth.json | 21 -- .../loot_tables/blocks/green_table_cloth.json | 21 ++ .../blocks/light_blue_display_cloth.json | 21 -- ...cloth.json => light_blue_table_cloth.json} | 4 +- .../blocks/light_gray_display_cloth.json | 21 -- .../blocks/light_gray_table_cloth.json | 21 ++ .../blocks/lime_display_cloth.json | 21 -- .../loot_tables/blocks/lime_table_cloth.json | 21 ++ .../blocks/magenta_display_cloth.json | 21 -- ...ay_cloth.json => magenta_table_cloth.json} | 4 +- .../blocks/orange_display_cloth.json | 21 -- ...lay_cloth.json => orange_table_cloth.json} | 4 +- .../blocks/pink_display_cloth.json | 21 -- .../loot_tables/blocks/pink_table_cloth.json | 21 ++ .../blocks/purple_display_cloth.json | 21 -- .../blocks/purple_table_cloth.json | 21 ++ .../loot_tables/blocks/red_table_cloth.json | 21 ++ .../{factory_panel.json => stock_link.json} | 4 +- .../blocks/white_display_cloth.json | 21 -- .../loot_tables/blocks/white_table_cloth.json | 21 ++ .../blocks/yellow_display_cloth.json | 21 -- .../blocks/yellow_table_cloth.json | 21 ++ ...r.json => andesite_table_cloth_clear.json} | 4 +- ...lear.json => black_table_cloth_clear.json} | 4 +- ...clear.json => blue_table_cloth_clear.json} | 4 +- .../logistics/brass_table_cloth_clear.json | 12 + .../logistics/brown_display_cloth_clear.json | 12 - .../logistics/brown_table_cloth_clear.json | 12 + .../logistics/copper_display_cloth_clear.json | 12 - ...ear.json => copper_table_cloth_clear.json} | 4 +- .../logistics/cyan_table_cloth_clear.json | 12 + ...nk_clear.json => factory_gauge_clear.json} | 4 +- .../logistics/gray_table_cloth_clear.json | 12 + .../logistics/green_display_cloth_clear.json | 12 - .../logistics/green_table_cloth_clear.json | 12 + .../light_blue_display_cloth_clear.json | 12 - ...json => light_blue_table_cloth_clear.json} | 4 +- .../light_gray_display_cloth_clear.json | 12 - .../light_gray_table_cloth_clear.json | 12 + .../logistics/lime_display_cloth_clear.json | 12 - .../logistics/lime_table_cloth_clear.json | 12 + .../magenta_display_cloth_clear.json | 12 - ...ar.json => magenta_table_cloth_clear.json} | 4 +- .../logistics/orange_display_cloth_clear.json | 12 - ...ear.json => orange_table_cloth_clear.json} | 4 +- .../logistics/pink_display_cloth_clear.json | 12 - .../logistics/pink_table_cloth_clear.json | 12 + .../logistics/purple_display_cloth_clear.json | 12 - .../logistics/purple_table_cloth_clear.json | 12 + .../logistics/red_table_cloth_clear.json | 12 + ...panel_clear.json => stock_link_clear.json} | 4 +- .../logistics/white_display_cloth_clear.json | 12 - .../logistics/white_table_cloth_clear.json | 12 + .../logistics/yellow_display_cloth_clear.json | 12 - .../logistics/yellow_table_cloth_clear.json | 12 + .../create/recipes/mixing/cardboard_pulp.json | 2 +- .../create/recipes/pressing/cardboard.json | 2 +- .../create/tags/blocks/display_cloths.json | 23 -- .../data/create/tags/blocks/table_cloths.json | 23 ++ .../create/tags/items/display_cloths.json | 23 -- .../data/create/tags/items/table_cloths.json | 23 ++ .../minecraft/tags/blocks/mineable/axe.json | 6 +- .../tags/blocks/mineable/pickaxe.json | 22 +- .../simibubi/create/AllBlockEntityTypes.java | 6 +- .../java/com/simibubi/create/AllBlocks.java | 324 +++++++++--------- .../simibubi/create/AllCreativeModeTabs.java | 8 +- .../java/com/simibubi/create/AllItems.java | 2 +- .../com/simibubi/create/AllPartialModels.java | 24 +- .../java/com/simibubi/create/AllTags.java | 4 +- .../contraptions/actors/seat/SeatBlock.java | 3 +- .../armor/CardboardArmorHandler.java | 4 + .../kinetics/drill/DrillBlockEntity.java | 11 +- .../displayCloth/DisplayClothBlock.java | 4 +- .../factoryBoard/FactoryPanelBehaviour.java | 2 +- .../factoryBoard/FactoryPanelBlock.java | 8 +- .../factoryBoard/FactoryPanelBlockEntity.java | 6 +- .../FactoryPanelEffectPacket.java | 2 +- .../factoryBoard/FactoryPanelScreen.java | 16 +- .../packagePort/postbox/PostboxBlock.java | 3 +- .../logistics/packager/PackagerBlock.java | 2 +- .../packager/PackagerBlockEntity.java | 9 +- .../RedstoneRequesterBlock.java | 2 +- .../StockKeeperOpenRequestScreenPacket.java | 2 +- .../stockTicker/StockTickerBlock.java | 3 +- .../stockTicker/StockTickerRequestScreen.java | 2 +- .../foundation/data/BuilderTransformers.java | 18 +- .../data/recipe/MixingRecipeGen.java | 2 +- .../data/recipe/PressingRecipeGen.java | 2 +- .../data/recipe/StandardRecipeGen.java | 4 +- .../assets/create/lang/default/interface.json | 10 +- .../assets/create/lang/default/tooltips.json | 20 +- .../block.json | 0 .../bulb_light.json | 0 .../connections/arrow_east.json | 0 .../connections/arrow_north.json | 0 .../connections/arrow_south.json | 0 .../connections/arrow_west.json | 0 .../connections/line_east.json | 0 .../connections/line_north.json | 0 .../connections/line_south.json | 0 .../connections/line_west.json | 0 .../item.json | 0 .../panel.json | 0 .../panel_restocker.json | 2 +- .../panel_restocker_with_bulb.json | 2 +- .../panel_with_bulb.json | 0 .../{packager_link => stock_link}/block.json | 0 .../block_powered.json | 0 .../{display_cloth => table_cloth}/block.json | 2 +- .../{display_cloth => table_cloth}/item.json | 2 +- .../item_lower.json | 4 +- .../north_east.json | 4 +- .../north_west.json | 4 +- .../south_east.json | 4 +- .../south_west.json | 4 +- .../create/models/entity/display_cloth.json | 81 ----- .../andesite.png | Bin .../{display_cloth => table_cloth}/black.png | Bin .../{display_cloth => table_cloth}/blue.png | Bin .../{display_cloth => table_cloth}/brass.png | Bin .../{display_cloth => table_cloth}/brown.png | Bin .../{display_cloth => table_cloth}/copper.png | Bin .../{display_cloth => table_cloth}/cyan.png | Bin .../{display_cloth => table_cloth}/gray.png | Bin .../{display_cloth => table_cloth}/green.png | Bin .../light_blue.png | Bin .../light_gray.png | Bin .../{display_cloth => table_cloth}/lime.png | Bin .../magenta.png | Bin .../{display_cloth => table_cloth}/orange.png | Bin .../{display_cloth => table_cloth}/pink.png | Bin .../{display_cloth => table_cloth}/purple.png | Bin .../{display_cloth => table_cloth}/red.png | Bin .../{display_cloth => table_cloth}/white.png | Bin .../{display_cloth => table_cloth}/yellow.png | Bin .../item/{cardboard_pulp.png => pulp.png} | Bin 304 files changed, 1815 insertions(+), 1873 deletions(-) delete mode 100644 src/generated/resources/assets/create/blockstates/andesite_display_cloth.json create mode 100644 src/generated/resources/assets/create/blockstates/andesite_table_cloth.json delete mode 100644 src/generated/resources/assets/create/blockstates/black_display_cloth.json create mode 100644 src/generated/resources/assets/create/blockstates/black_table_cloth.json delete mode 100644 src/generated/resources/assets/create/blockstates/blue_display_cloth.json create mode 100644 src/generated/resources/assets/create/blockstates/blue_table_cloth.json delete mode 100644 src/generated/resources/assets/create/blockstates/brass_display_cloth.json create mode 100644 src/generated/resources/assets/create/blockstates/brass_table_cloth.json delete mode 100644 src/generated/resources/assets/create/blockstates/brown_display_cloth.json create mode 100644 src/generated/resources/assets/create/blockstates/brown_table_cloth.json delete mode 100644 src/generated/resources/assets/create/blockstates/copper_display_cloth.json create mode 100644 src/generated/resources/assets/create/blockstates/copper_table_cloth.json delete mode 100644 src/generated/resources/assets/create/blockstates/cyan_display_cloth.json create mode 100644 src/generated/resources/assets/create/blockstates/cyan_table_cloth.json rename src/generated/resources/assets/create/blockstates/{factory_panel.json => factory_gauge.json} (64%) delete mode 100644 src/generated/resources/assets/create/blockstates/gray_display_cloth.json create mode 100644 src/generated/resources/assets/create/blockstates/gray_table_cloth.json delete mode 100644 src/generated/resources/assets/create/blockstates/green_display_cloth.json create mode 100644 src/generated/resources/assets/create/blockstates/green_table_cloth.json delete mode 100644 src/generated/resources/assets/create/blockstates/light_blue_display_cloth.json create mode 100644 src/generated/resources/assets/create/blockstates/light_blue_table_cloth.json delete mode 100644 src/generated/resources/assets/create/blockstates/light_gray_display_cloth.json create mode 100644 src/generated/resources/assets/create/blockstates/light_gray_table_cloth.json delete mode 100644 src/generated/resources/assets/create/blockstates/lime_display_cloth.json create mode 100644 src/generated/resources/assets/create/blockstates/lime_table_cloth.json delete mode 100644 src/generated/resources/assets/create/blockstates/magenta_display_cloth.json create mode 100644 src/generated/resources/assets/create/blockstates/magenta_table_cloth.json delete mode 100644 src/generated/resources/assets/create/blockstates/orange_display_cloth.json create mode 100644 src/generated/resources/assets/create/blockstates/orange_table_cloth.json delete mode 100644 src/generated/resources/assets/create/blockstates/pink_display_cloth.json create mode 100644 src/generated/resources/assets/create/blockstates/pink_table_cloth.json delete mode 100644 src/generated/resources/assets/create/blockstates/purple_display_cloth.json create mode 100644 src/generated/resources/assets/create/blockstates/purple_table_cloth.json delete mode 100644 src/generated/resources/assets/create/blockstates/red_display_cloth.json create mode 100644 src/generated/resources/assets/create/blockstates/red_table_cloth.json rename src/generated/resources/assets/create/blockstates/{packager_link.json => stock_link.json} (53%) delete mode 100644 src/generated/resources/assets/create/blockstates/white_display_cloth.json create mode 100644 src/generated/resources/assets/create/blockstates/white_table_cloth.json delete mode 100644 src/generated/resources/assets/create/blockstates/yellow_display_cloth.json create mode 100644 src/generated/resources/assets/create/blockstates/yellow_table_cloth.json delete mode 100644 src/generated/resources/assets/create/models/block/andesite_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/block/andesite_table_cloth.json delete mode 100644 src/generated/resources/assets/create/models/block/black_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/block/black_table_cloth.json delete mode 100644 src/generated/resources/assets/create/models/block/blue_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/block/blue_table_cloth.json delete mode 100644 src/generated/resources/assets/create/models/block/brass_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/block/brass_table_cloth.json delete mode 100644 src/generated/resources/assets/create/models/block/brown_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/block/brown_table_cloth.json delete mode 100644 src/generated/resources/assets/create/models/block/copper_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/block/copper_table_cloth.json delete mode 100644 src/generated/resources/assets/create/models/block/cyan_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/block/cyan_table_cloth.json delete mode 100644 src/generated/resources/assets/create/models/block/gray_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/block/gray_table_cloth.json delete mode 100644 src/generated/resources/assets/create/models/block/green_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/block/green_table_cloth.json delete mode 100644 src/generated/resources/assets/create/models/block/light_blue_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/block/light_blue_table_cloth.json delete mode 100644 src/generated/resources/assets/create/models/block/light_gray_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/block/light_gray_table_cloth.json delete mode 100644 src/generated/resources/assets/create/models/block/lime_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/block/lime_table_cloth.json delete mode 100644 src/generated/resources/assets/create/models/block/magenta_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/block/magenta_table_cloth.json delete mode 100644 src/generated/resources/assets/create/models/block/orange_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/block/orange_table_cloth.json delete mode 100644 src/generated/resources/assets/create/models/block/pink_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/block/pink_table_cloth.json delete mode 100644 src/generated/resources/assets/create/models/block/purple_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/block/purple_table_cloth.json delete mode 100644 src/generated/resources/assets/create/models/block/red_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/block/red_table_cloth.json delete mode 100644 src/generated/resources/assets/create/models/block/white_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/block/white_table_cloth.json delete mode 100644 src/generated/resources/assets/create/models/block/yellow_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/block/yellow_table_cloth.json delete mode 100644 src/generated/resources/assets/create/models/item/andesite_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/item/andesite_table_cloth.json delete mode 100644 src/generated/resources/assets/create/models/item/black_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/item/black_table_cloth.json delete mode 100644 src/generated/resources/assets/create/models/item/blue_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/item/blue_table_cloth.json delete mode 100644 src/generated/resources/assets/create/models/item/brass_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/item/brass_table_cloth.json delete mode 100644 src/generated/resources/assets/create/models/item/brown_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/item/brown_table_cloth.json delete mode 100644 src/generated/resources/assets/create/models/item/copper_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/item/copper_table_cloth.json delete mode 100644 src/generated/resources/assets/create/models/item/cyan_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/item/cyan_table_cloth.json create mode 100644 src/generated/resources/assets/create/models/item/factory_gauge.json delete mode 100644 src/generated/resources/assets/create/models/item/factory_panel.json delete mode 100644 src/generated/resources/assets/create/models/item/gray_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/item/gray_table_cloth.json delete mode 100644 src/generated/resources/assets/create/models/item/green_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/item/green_table_cloth.json delete mode 100644 src/generated/resources/assets/create/models/item/light_blue_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/item/light_blue_table_cloth.json delete mode 100644 src/generated/resources/assets/create/models/item/light_gray_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/item/light_gray_table_cloth.json delete mode 100644 src/generated/resources/assets/create/models/item/lime_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/item/lime_table_cloth.json delete mode 100644 src/generated/resources/assets/create/models/item/magenta_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/item/magenta_table_cloth.json delete mode 100644 src/generated/resources/assets/create/models/item/orange_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/item/orange_table_cloth.json delete mode 100644 src/generated/resources/assets/create/models/item/packager_link.json delete mode 100644 src/generated/resources/assets/create/models/item/pink_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/item/pink_table_cloth.json rename src/generated/resources/assets/create/models/item/{cardboard_pulp.json => pulp.json} (59%) delete mode 100644 src/generated/resources/assets/create/models/item/purple_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/item/purple_table_cloth.json delete mode 100644 src/generated/resources/assets/create/models/item/red_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/item/red_table_cloth.json create mode 100644 src/generated/resources/assets/create/models/item/stock_link.json delete mode 100644 src/generated/resources/assets/create/models/item/white_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/item/white_table_cloth.json delete mode 100644 src/generated/resources/assets/create/models/item/yellow_display_cloth.json create mode 100644 src/generated/resources/assets/create/models/item/yellow_table_cloth.json rename src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/{copper_display_cloth_clear.json => andesite_table_cloth_clear.json} (67%) rename src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/{red_display_cloth_clear.json => black_table_cloth_clear.json} (68%) create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/blue_table_cloth_clear.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/brass_table_cloth_clear.json delete mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/brown_display_cloth_clear.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/brown_table_cloth_clear.json rename src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/{cyan_display_cloth_clear.json => copper_table_cloth_clear.json} (67%) create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/cyan_table_cloth_clear.json rename src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/{packager_link_clear.json => factory_gauge_clear.json} (76%) create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/gray_table_cloth_clear.json delete mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/green_display_cloth_clear.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/green_table_cloth_clear.json delete mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/light_blue_display_cloth_clear.json rename src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/{andesite_display_cloth_clear.json => light_blue_table_cloth_clear.json} (66%) delete mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/light_gray_display_cloth_clear.json rename src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/{black_display_cloth_clear.json => light_gray_table_cloth_clear.json} (65%) create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/lime_table_cloth_clear.json delete mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/magenta_display_cloth_clear.json rename src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/{brass_display_cloth_clear.json => magenta_table_cloth_clear.json} (67%) delete mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/orange_display_cloth_clear.json rename src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/{lime_display_cloth_clear.json => orange_table_cloth_clear.json} (67%) delete mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/pink_display_cloth_clear.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/pink_table_cloth_clear.json delete mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/purple_display_cloth_clear.json rename src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/{gray_display_cloth_clear.json => purple_table_cloth_clear.json} (67%) create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/red_table_cloth_clear.json rename src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/{factory_panel_clear.json => stock_link_clear.json} (76%) delete mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/white_display_cloth_clear.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/white_table_cloth_clear.json delete mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/yellow_display_cloth_clear.json rename src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/{blue_display_cloth_clear.json => yellow_table_cloth_clear.json} (67%) rename src/generated/resources/data/create/loot_tables/blocks/{black_display_cloth.json => andesite_table_cloth.json} (73%) rename src/generated/resources/data/create/loot_tables/blocks/{red_display_cloth.json => black_table_cloth.json} (74%) rename src/generated/resources/data/create/loot_tables/blocks/{gray_display_cloth.json => blue_table_cloth.json} (74%) create mode 100644 src/generated/resources/data/create/loot_tables/blocks/brass_table_cloth.json delete mode 100644 src/generated/resources/data/create/loot_tables/blocks/brown_display_cloth.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/brown_table_cloth.json delete mode 100644 src/generated/resources/data/create/loot_tables/blocks/copper_display_cloth.json rename src/generated/resources/data/create/loot_tables/blocks/{blue_display_cloth.json => copper_table_cloth.json} (74%) create mode 100644 src/generated/resources/data/create/loot_tables/blocks/cyan_table_cloth.json rename src/generated/resources/data/create/loot_tables/blocks/{packager_link.json => factory_gauge.json} (76%) create mode 100644 src/generated/resources/data/create/loot_tables/blocks/gray_table_cloth.json delete mode 100644 src/generated/resources/data/create/loot_tables/blocks/green_display_cloth.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/green_table_cloth.json delete mode 100644 src/generated/resources/data/create/loot_tables/blocks/light_blue_display_cloth.json rename src/generated/resources/data/create/loot_tables/blocks/{andesite_display_cloth.json => light_blue_table_cloth.json} (72%) delete mode 100644 src/generated/resources/data/create/loot_tables/blocks/light_gray_display_cloth.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/light_gray_table_cloth.json delete mode 100644 src/generated/resources/data/create/loot_tables/blocks/lime_display_cloth.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/lime_table_cloth.json delete mode 100644 src/generated/resources/data/create/loot_tables/blocks/magenta_display_cloth.json rename src/generated/resources/data/create/loot_tables/blocks/{brass_display_cloth.json => magenta_table_cloth.json} (74%) delete mode 100644 src/generated/resources/data/create/loot_tables/blocks/orange_display_cloth.json rename src/generated/resources/data/create/loot_tables/blocks/{cyan_display_cloth.json => orange_table_cloth.json} (74%) delete mode 100644 src/generated/resources/data/create/loot_tables/blocks/pink_display_cloth.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/pink_table_cloth.json delete mode 100644 src/generated/resources/data/create/loot_tables/blocks/purple_display_cloth.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/purple_table_cloth.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/red_table_cloth.json rename src/generated/resources/data/create/loot_tables/blocks/{factory_panel.json => stock_link.json} (76%) delete mode 100644 src/generated/resources/data/create/loot_tables/blocks/white_display_cloth.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/white_table_cloth.json delete mode 100644 src/generated/resources/data/create/loot_tables/blocks/yellow_display_cloth.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/yellow_table_cloth.json rename src/generated/resources/data/create/recipes/crafting/logistics/{black_display_cloth_clear.json => andesite_table_cloth_clear.json} (58%) rename src/generated/resources/data/create/recipes/crafting/logistics/{red_display_cloth_clear.json => black_table_cloth_clear.json} (60%) rename src/generated/resources/data/create/recipes/crafting/logistics/{gray_display_cloth_clear.json => blue_table_cloth_clear.json} (59%) create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/brass_table_cloth_clear.json delete mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/brown_display_cloth_clear.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/brown_table_cloth_clear.json delete mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/copper_display_cloth_clear.json rename src/generated/resources/data/create/recipes/crafting/logistics/{blue_display_cloth_clear.json => copper_table_cloth_clear.json} (59%) create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/cyan_table_cloth_clear.json rename src/generated/resources/data/create/recipes/crafting/logistics/{packager_link_clear.json => factory_gauge_clear.json} (62%) create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/gray_table_cloth_clear.json delete mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/green_display_cloth_clear.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/green_table_cloth_clear.json delete mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/light_blue_display_cloth_clear.json rename src/generated/resources/data/create/recipes/crafting/logistics/{andesite_display_cloth_clear.json => light_blue_table_cloth_clear.json} (57%) delete mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/light_gray_display_cloth_clear.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/light_gray_table_cloth_clear.json delete mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/lime_display_cloth_clear.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/lime_table_cloth_clear.json delete mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/magenta_display_cloth_clear.json rename src/generated/resources/data/create/recipes/crafting/logistics/{brass_display_cloth_clear.json => magenta_table_cloth_clear.json} (59%) delete mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/orange_display_cloth_clear.json rename src/generated/resources/data/create/recipes/crafting/logistics/{cyan_display_cloth_clear.json => orange_table_cloth_clear.json} (59%) delete mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/pink_display_cloth_clear.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/pink_table_cloth_clear.json delete mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/purple_display_cloth_clear.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/purple_table_cloth_clear.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/red_table_cloth_clear.json rename src/generated/resources/data/create/recipes/crafting/logistics/{factory_panel_clear.json => stock_link_clear.json} (62%) delete mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/white_display_cloth_clear.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/white_table_cloth_clear.json delete mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/yellow_display_cloth_clear.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/yellow_table_cloth_clear.json delete mode 100644 src/generated/resources/data/create/tags/blocks/display_cloths.json create mode 100644 src/generated/resources/data/create/tags/blocks/table_cloths.json delete mode 100644 src/generated/resources/data/create/tags/items/display_cloths.json create mode 100644 src/generated/resources/data/create/tags/items/table_cloths.json rename src/main/resources/assets/create/models/block/{factory_panel => factory_gauge}/block.json (100%) rename src/main/resources/assets/create/models/block/{factory_panel => factory_gauge}/bulb_light.json (100%) rename src/main/resources/assets/create/models/block/{factory_panel => factory_gauge}/connections/arrow_east.json (100%) rename src/main/resources/assets/create/models/block/{factory_panel => factory_gauge}/connections/arrow_north.json (100%) rename src/main/resources/assets/create/models/block/{factory_panel => factory_gauge}/connections/arrow_south.json (100%) rename src/main/resources/assets/create/models/block/{factory_panel => factory_gauge}/connections/arrow_west.json (100%) rename src/main/resources/assets/create/models/block/{factory_panel => factory_gauge}/connections/line_east.json (100%) rename src/main/resources/assets/create/models/block/{factory_panel => factory_gauge}/connections/line_north.json (100%) rename src/main/resources/assets/create/models/block/{factory_panel => factory_gauge}/connections/line_south.json (100%) rename src/main/resources/assets/create/models/block/{factory_panel => factory_gauge}/connections/line_west.json (100%) rename src/main/resources/assets/create/models/block/{factory_panel => factory_gauge}/item.json (100%) rename src/main/resources/assets/create/models/block/{factory_panel => factory_gauge}/panel.json (100%) rename src/main/resources/assets/create/models/block/{factory_panel => factory_gauge}/panel_restocker.json (73%) rename src/main/resources/assets/create/models/block/{factory_panel => factory_gauge}/panel_restocker_with_bulb.json (69%) rename src/main/resources/assets/create/models/block/{factory_panel => factory_gauge}/panel_with_bulb.json (100%) rename src/main/resources/assets/create/models/block/{packager_link => stock_link}/block.json (100%) rename src/main/resources/assets/create/models/block/{packager_link => stock_link}/block_powered.json (100%) rename src/main/resources/assets/create/models/block/{display_cloth => table_cloth}/block.json (98%) rename src/main/resources/assets/create/models/block/{display_cloth => table_cloth}/item.json (99%) rename src/main/resources/assets/create/models/block/{display_cloth => table_cloth}/item_lower.json (98%) rename src/main/resources/assets/create/models/block/{display_cloth => table_cloth}/north_east.json (87%) rename src/main/resources/assets/create/models/block/{display_cloth => table_cloth}/north_west.json (87%) rename src/main/resources/assets/create/models/block/{display_cloth => table_cloth}/south_east.json (87%) rename src/main/resources/assets/create/models/block/{display_cloth => table_cloth}/south_west.json (87%) delete mode 100644 src/main/resources/assets/create/models/entity/display_cloth.json rename src/main/resources/assets/create/textures/block/{display_cloth => table_cloth}/andesite.png (100%) rename src/main/resources/assets/create/textures/block/{display_cloth => table_cloth}/black.png (100%) rename src/main/resources/assets/create/textures/block/{display_cloth => table_cloth}/blue.png (100%) rename src/main/resources/assets/create/textures/block/{display_cloth => table_cloth}/brass.png (100%) rename src/main/resources/assets/create/textures/block/{display_cloth => table_cloth}/brown.png (100%) rename src/main/resources/assets/create/textures/block/{display_cloth => table_cloth}/copper.png (100%) rename src/main/resources/assets/create/textures/block/{display_cloth => table_cloth}/cyan.png (100%) rename src/main/resources/assets/create/textures/block/{display_cloth => table_cloth}/gray.png (100%) rename src/main/resources/assets/create/textures/block/{display_cloth => table_cloth}/green.png (100%) rename src/main/resources/assets/create/textures/block/{display_cloth => table_cloth}/light_blue.png (100%) rename src/main/resources/assets/create/textures/block/{display_cloth => table_cloth}/light_gray.png (100%) rename src/main/resources/assets/create/textures/block/{display_cloth => table_cloth}/lime.png (100%) rename src/main/resources/assets/create/textures/block/{display_cloth => table_cloth}/magenta.png (100%) rename src/main/resources/assets/create/textures/block/{display_cloth => table_cloth}/orange.png (100%) rename src/main/resources/assets/create/textures/block/{display_cloth => table_cloth}/pink.png (100%) rename src/main/resources/assets/create/textures/block/{display_cloth => table_cloth}/purple.png (100%) rename src/main/resources/assets/create/textures/block/{display_cloth => table_cloth}/red.png (100%) rename src/main/resources/assets/create/textures/block/{display_cloth => table_cloth}/white.png (100%) rename src/main/resources/assets/create/textures/block/{display_cloth => table_cloth}/yellow.png (100%) rename src/main/resources/assets/create/textures/item/{cardboard_pulp.png => pulp.png} (100%) diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 965c61a675..d5af5e8104 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-11-04T11:30:08.6907256 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-11-05T20:56:43.0602251 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -7,7 +7,6 @@ c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_ch 96c0b7cf225d51e2df633786c1a8a0a6c61fe261 assets/create/blockstates/andesite_bars.json db046170dcd57e5fcfe85b475790d6725a0ad8e3 assets/create/blockstates/andesite_belt_funnel.json 6cd5574ad64b212440ae07ab75b732e04ee3aab5 assets/create/blockstates/andesite_casing.json -db10c9c0acd7171f4921e75c93fdccedb2664cdf assets/create/blockstates/andesite_display_cloth.json aff6d09929301e72548f4ce5720af96426171580 assets/create/blockstates/andesite_door.json 84dacd6144568b97ae00a55525290b4f295a72e7 assets/create/blockstates/andesite_encased_cogwheel.json c9aa3f6acdcadfcd6f0c48457ddafcdd9ff37104 assets/create/blockstates/andesite_encased_large_cogwheel.json @@ -16,6 +15,7 @@ c9aa3f6acdcadfcd6f0c48457ddafcdd9ff37104 assets/create/blockstates/andesite_enca 1299bde31535b381cc2d9b40f58097702bd12b92 assets/create/blockstates/andesite_ladder.json afff577673aec43b9a596c4663024cb35127e0c3 assets/create/blockstates/andesite_pillar.json 0d47d0816051dd63837c689de8b838dc1639d2fd assets/create/blockstates/andesite_scaffolding.json +beb5fd89e2c6701bca3c7c579b1b1f965a7ff71a assets/create/blockstates/andesite_table_cloth.json 67c4f7802f0854d24bb29019682b1d0a2f335a15 assets/create/blockstates/andesite_tunnel.json 542af96eb0c1e34df81f15fae7dbbaf4f81287f3 assets/create/blockstates/asurine.json 7f07775d89e3bea45d7161d289daf15470e7f544 assets/create/blockstates/asurine_pillar.json @@ -25,19 +25,19 @@ dfaec148d3bb21efb2ef7106a2d04454c4134303 assets/create/blockstates/bamboo_window a97910c7516e7cedec9e34eca51f1183f1e3e681 assets/create/blockstates/belt.json 0ea03133af234921a3313f52521d8cfd02bf5d81 assets/create/blockstates/birch_window.json 2003c43151b731bf19cae58290c63bcb3785848a assets/create/blockstates/birch_window_pane.json -396e4772b041319fc86b50deded74f514945f45d assets/create/blockstates/black_display_cloth.json c8b65faf51122eb411f5895e718869da9b260c2e assets/create/blockstates/black_nixie_tube.json 2449479f4d81a6d16bbd1a469daa2d8f9ba2782e assets/create/blockstates/black_postbox.json 980ae9ba3f6d4e0faea8f3878985f9a9dadc0796 assets/create/blockstates/black_sail.json da3ad0225984a0dcbfb4ed800e307e45aff5aaa1 assets/create/blockstates/black_seat.json +1ea958c40f0cbf63c31d9b5422b6b86f9268e393 assets/create/blockstates/black_table_cloth.json 0083f6aa3fda2c7ebb2e5f2a032e740cf3ae3846 assets/create/blockstates/black_toolbox.json 28f2fb355e80171403e540afd2aed44e9c19659a assets/create/blockstates/black_valve_handle.json 06ecd28cd97f4e8200dc396858695cad57b871c8 assets/create/blockstates/blaze_burner.json -88793493e0a7e0713b5ea9f3bbb88395d690b873 assets/create/blockstates/blue_display_cloth.json 37caf031254b5171a1fbfe9906f4bc65e8dbc909 assets/create/blockstates/blue_nixie_tube.json eec6f598fc517c5f6b36d13f3928364b16f0ae3d assets/create/blockstates/blue_postbox.json d540f0f23e0d7c03f8e147cf3eebbaf7caec9f93 assets/create/blockstates/blue_sail.json d2fdb432bb037de781260c789e905b223fab408c assets/create/blockstates/blue_seat.json +27241e0fd5a034c461f6920f94b852c6e825ce56 assets/create/blockstates/blue_table_cloth.json f91092da79b69fece9583ccc15350612f439ee1b assets/create/blockstates/blue_toolbox.json e330efa253172b315f73401ed8f2c39270ba90d3 assets/create/blockstates/blue_valve_handle.json a02d3059619edf0bd19dbf397cb35f0f8b8fb20e assets/create/blockstates/bound_cardboard_block.json @@ -45,7 +45,6 @@ a02d3059619edf0bd19dbf397cb35f0f8b8fb20e assets/create/blockstates/bound_cardboa d49d09f1026f816bb05a5dc13c806b860f2eb07a assets/create/blockstates/brass_belt_funnel.json 5a2551315557447abc579cf9225e3a12d9a46641 assets/create/blockstates/brass_block.json ac2f8f5e1d556e5c697da95729e82f107b115f09 assets/create/blockstates/brass_casing.json -a6af136d3a0822c17b331febb3c85ff057403fd8 assets/create/blockstates/brass_display_cloth.json 2ae65b2e9018a7445b42609e99b91e64cb2dff45 assets/create/blockstates/brass_door.json bac88b313b63acfc77c25b1463276a714f22f336 assets/create/blockstates/brass_encased_cogwheel.json 8a152aeb42b1e8fc3596886124139c811976bf7b assets/create/blockstates/brass_encased_large_cogwheel.json @@ -53,12 +52,13 @@ bac88b313b63acfc77c25b1463276a714f22f336 assets/create/blockstates/brass_encased a408005aae4c1caa7aaae5a0ddf9d1ad73cd0254 assets/create/blockstates/brass_funnel.json 1e8eba1ac6a0beb744f8b5feb96bbe5f3a75f214 assets/create/blockstates/brass_ladder.json 6d210298b9d80ae69aa03b09aa73b92e14b9ab1b assets/create/blockstates/brass_scaffolding.json +61f5242e85c36ecf0f7963954236c60596ec9cbe assets/create/blockstates/brass_table_cloth.json 8ee948f9e87b82bb27aaecc522127fa1297b3d9d assets/create/blockstates/brass_tunnel.json -158c380605f071c89b9de21f2b2737449a72aac3 assets/create/blockstates/brown_display_cloth.json debf33346bf410216f21082e1e8d07aa6250b84c assets/create/blockstates/brown_nixie_tube.json ad42a677da8d381d6a8d909a602d73c1b9b3bbb7 assets/create/blockstates/brown_postbox.json 1334fc9e71d9f2a6117f448817263467a9c695de assets/create/blockstates/brown_sail.json 19524b2c0672632e63372f405a87dbea35f1d160 assets/create/blockstates/brown_seat.json +41a93cdd7ef066a844b750b657dce766df29d301 assets/create/blockstates/brown_table_cloth.json 1ffc38bf682e84aad4cb300c573375eb0cdcc434 assets/create/blockstates/brown_toolbox.json 440b29e1dffa4374ddc1aed444bff18a485bc1cb assets/create/blockstates/brown_valve_handle.json 2064534de4791b339fdcd4ef3a8129a2e233ec50 assets/create/blockstates/calcite_pillar.json @@ -80,13 +80,13 @@ b5170d754ce5f07ea2b4646eb07c099c50bae249 assets/create/blockstates/clipboard.jso 134c62bbd8ea43ff54c8edb2da5ea707f0a228fe assets/create/blockstates/copper_backtank.json 1b1e311efecc45ce7a3f69c8a1c2c53c6559b995 assets/create/blockstates/copper_bars.json 33175a9b530554e42e2ac68a9761d55f7f8623cf assets/create/blockstates/copper_casing.json -edbfe63a2432dae19b6b4efbdb5041ea1b9893e3 assets/create/blockstates/copper_display_cloth.json f7254f20f91e2f1295e36d2e70390d43f3952d07 assets/create/blockstates/copper_door.json 736777de0eb038ff1ef9e8fe9d04c23d80239eda assets/create/blockstates/copper_ladder.json df3103dfc1c3ba7a9573229d009cb0de4925df16 assets/create/blockstates/copper_scaffolding.json 4d3d29e8a74bf103da39e76a1466b03eb5dcf916 assets/create/blockstates/copper_shingles.json 1ea8fdb990f8cda1762ab69ac38ea3161a835227 assets/create/blockstates/copper_shingle_slab.json 7c35bb802099d6bb5d92eafd8cbb7ea146979a2e assets/create/blockstates/copper_shingle_stairs.json +5c5ba06bf5b0a2c57d0aa42e85880f36d9694a78 assets/create/blockstates/copper_table_cloth.json 9a9f03140a57a7a8903d3e1b159bdc052566a6ec assets/create/blockstates/copper_tiles.json 7db7a0d81887091ca889f40bb8a508d3098c5164 assets/create/blockstates/copper_tile_slab.json c0b7eca017242913d156e4623147add0d03574f6 assets/create/blockstates/copper_tile_stairs.json @@ -217,11 +217,11 @@ beb9e47f8d811c2146f68daf992fb805342a65cb assets/create/blockstates/cut_veridium. 212d8ee5dfa78802b9539640cf8b263fd5880b87 assets/create/blockstates/cut_veridium_slab.json c11f09df4a23e951bdf9a345515183f4fac7cde3 assets/create/blockstates/cut_veridium_stairs.json 3aa6f5e613ff73952e3de00408051f92316e7f81 assets/create/blockstates/cut_veridium_wall.json -d6d25beb53a4393839eeb94472c8feb4c80bac6d assets/create/blockstates/cyan_display_cloth.json bb627b2e78dba6833cf2d357033f253fc89aa1b8 assets/create/blockstates/cyan_nixie_tube.json d7d497e5495cd7e8e74422f42caa27682fd06b2d assets/create/blockstates/cyan_postbox.json f1061b8f9757374d6608fda07e301a2623e79f72 assets/create/blockstates/cyan_sail.json 538c6d95da5cc460e99c91647dac61726a91479f assets/create/blockstates/cyan_seat.json +c2fc64da0466fe9daa63c18c35221736c1e091df assets/create/blockstates/cyan_table_cloth.json c4d84b719762aca46cdb8decddfeb97dcc50676c assets/create/blockstates/cyan_toolbox.json 477d32008d5aa6ed5a6825a70b9bb7d976e7d0fc assets/create/blockstates/cyan_valve_handle.json f4d7f5a38db9b92399a81f49ff1787d025c6f41f assets/create/blockstates/dark_oak_window.json @@ -247,7 +247,7 @@ d47bc65703e9582cc710e6408fb565e16d3514a6 assets/create/blockstates/encased_fan.j 5299b4f7b9b3490872e8c26a6b212e14dd05fd9a assets/create/blockstates/exposed_copper_tiles.json 6ee73ff3608d51fdad6e9810feee66ed1773b81c assets/create/blockstates/exposed_copper_tile_slab.json f93e4059876bfc6d70b9fa2bc24d8e3d6943d56f assets/create/blockstates/exposed_copper_tile_stairs.json -8dea51f1c103e3bf1766e0f626b1143c92c364c3 assets/create/blockstates/factory_panel.json +4b30365ed77db9c5754eeda5fee81d47b568b946 assets/create/blockstates/factory_gauge.json f1a03ede031d8c4e33a4d07c529e71936da9dc6d assets/create/blockstates/fake_track.json 21fa4a1bf4ee851e090a21c97c9a38d18cfddf0d assets/create/blockstates/fluid_pipe.json 185e6367c5c5b3632e54148c74987057cbfccaca assets/create/blockstates/fluid_tank.json @@ -263,18 +263,18 @@ ff9f56912d8ac4069df90505232820f9c45f5e06 assets/create/blockstates/gantry_carria 8ac0d74f418d2789a61dc5b451defcd2cb2687cc assets/create/blockstates/gearshift.json 5a193991f33a1af8659192f3693e4d8d3ed0082b assets/create/blockstates/glass_fluid_pipe.json e3f2a093c436cb65c5a7ac049a14cc4dadb22526 assets/create/blockstates/granite_pillar.json -f4e76daf384e628b76890b72775302d65f651176 assets/create/blockstates/gray_display_cloth.json 921cf220c44a67195c90a30c4c296e65311738da assets/create/blockstates/gray_nixie_tube.json f09f7a6f184992b21610e244310e22a99a01e247 assets/create/blockstates/gray_postbox.json 30ba031a6b5a327d2a4caa12169676da573c2133 assets/create/blockstates/gray_sail.json f35a502c4a5e2703e7c6811b3d2ba16a9c47d4c8 assets/create/blockstates/gray_seat.json +612058f415131fb127280c24d5d089793c103a7a assets/create/blockstates/gray_table_cloth.json 87457e0eddae80225dbb3145f2d120296ea1bfcd assets/create/blockstates/gray_toolbox.json f18b87db39836eef20154b239d488eebb64b3455 assets/create/blockstates/gray_valve_handle.json -7d441d117efce42a787c86355fc69dbd052b5db0 assets/create/blockstates/green_display_cloth.json 0f0fe2bf83f763e04cd2d7a979beb547feac3191 assets/create/blockstates/green_nixie_tube.json 67aefcca975866a40717725d34770acd8f8908f6 assets/create/blockstates/green_postbox.json 0a2a5fbf2cf084e1be0426a224c291dc22a826fd assets/create/blockstates/green_sail.json b4aede1847d204ecdb7847559066d9d2ffb66903 assets/create/blockstates/green_seat.json +98587a931a565d4196f71ac4928846a7d55b3645 assets/create/blockstates/green_table_cloth.json 6f080890b3b30c46ba9ceb382c1171940bf4966f assets/create/blockstates/green_toolbox.json a343aefdb4207d1bffa6f4b40e20283a6d42c2f9 assets/create/blockstates/green_valve_handle.json 23430b770b5257af36844dfe9b976e343a6d1180 assets/create/blockstates/hand_crank.json @@ -309,36 +309,36 @@ fc0d3c258d8ee61c9bd16fdfc6565bce4e6df7b2 assets/create/blockstates/layered_scori ca124508c59130d21f23d7b1ef354d78bdd24dd4 assets/create/blockstates/layered_tuff.json 2ff5466f9ea3b1292c24a8ddb31666d74635c592 assets/create/blockstates/layered_veridium.json fcf02725651ab5973fab1cfc09fdd68cb4b93579 assets/create/blockstates/lectern_controller.json -2c52c5dff36461c2af7dabce69452fcb3fc13640 assets/create/blockstates/light_blue_display_cloth.json 5d7e1b08b1ec7c7c11b70db11df09311fcd7cf45 assets/create/blockstates/light_blue_nixie_tube.json 117eb12e69c9c978474104a749d1071e4980af76 assets/create/blockstates/light_blue_postbox.json f2354e8cb6086473ac97a5228b99706858dcad8a assets/create/blockstates/light_blue_sail.json 6b7045eaf9efe3a90f2d9a6785be6a5fd534b8e7 assets/create/blockstates/light_blue_seat.json +ba0ae5046b643f82338e98ae56a48c01cf2d5972 assets/create/blockstates/light_blue_table_cloth.json b7065e7871c3c7f1a0656c2f92f82544e606f2fb assets/create/blockstates/light_blue_toolbox.json 549882a0f4de60906ca870a6197330f81d4e1afe assets/create/blockstates/light_blue_valve_handle.json -643092c9caa8e586833d9e7fdab7cb059810fb0a assets/create/blockstates/light_gray_display_cloth.json fa5fb2be73c7c54b70e927b66adf3f4d64c5cb6b assets/create/blockstates/light_gray_nixie_tube.json 36817126602128d1c463047c9f54a671ed71e04c assets/create/blockstates/light_gray_postbox.json 3d95c9c4442d1bdd660bae382c72c68134db86dd assets/create/blockstates/light_gray_sail.json 8ec5144da4a49dd5b497af07b0d4b88c9c0b6cc0 assets/create/blockstates/light_gray_seat.json +f1901887cd166296e465133c3b0d7ad0d664a614 assets/create/blockstates/light_gray_table_cloth.json 35b151db396069b146d223fbe46be5b0c3dda8a9 assets/create/blockstates/light_gray_toolbox.json 894827ffd176bc733abecf18d96888e9ed5a3eb4 assets/create/blockstates/light_gray_valve_handle.json a6f319c803c03e34bbf841ea52d82f0f7ec7a413 assets/create/blockstates/limestone.json 7ff65e1c4c8e48a0b694cd17506a192e6a7e6e44 assets/create/blockstates/limestone_pillar.json -34d900ed4c9922b82e39b2ee84d24eaffc7017ab assets/create/blockstates/lime_display_cloth.json 7f20b548dd535942b2d6f41c39de7ad4fafe637e assets/create/blockstates/lime_nixie_tube.json 1478770b73bf498bd6fa35bd40a38027fd6fd4c8 assets/create/blockstates/lime_postbox.json ad1ec304729fd6d336c0d4d0c27c9345af636695 assets/create/blockstates/lime_sail.json b9934a558e1b495403dc2c71ffb43cce7d396013 assets/create/blockstates/lime_seat.json +7c5dc2ffd0bd44ba8785b6a788030714a009bcbc assets/create/blockstates/lime_table_cloth.json 49a02f7fc16697ba1cf16cee7e45ab6bfd8b06ce assets/create/blockstates/lime_toolbox.json ba181485f219d3ae23509a7edf28e25d9edb10f4 assets/create/blockstates/lime_valve_handle.json 654e845cebed82b7afbcf81380921e0a475b01e9 assets/create/blockstates/linear_chassis.json e195e82e4d0c1fc20474535bc9068cbb77a5e175 assets/create/blockstates/lit_blaze_burner.json -66775372786ece9b6300b335cf6acbdd2aa91147 assets/create/blockstates/magenta_display_cloth.json 296186b196af94e1ab3f7e8a3254f6d31ae47a5c assets/create/blockstates/magenta_nixie_tube.json f14f13217b4eb7d897e1ed55c790186cc0cecaf5 assets/create/blockstates/magenta_postbox.json f150922cbed1c05fb3892d4ac91eb471234252e2 assets/create/blockstates/magenta_sail.json bb1ab5c70647933400b3a99ef9d166ba5e3d4709 assets/create/blockstates/magenta_seat.json +a09b8c51cfbb1c9c8a4f670a83cd81c376fe4ba3 assets/create/blockstates/magenta_table_cloth.json fcd226c7863262d98765c701538bf9e44d2b177e assets/create/blockstates/magenta_toolbox.json ecf670d95969a33a738f59e08393299891f78847 assets/create/blockstates/magenta_valve_handle.json 8a30c1ed277ec60963abbcb24cce6efd162d02d3 assets/create/blockstates/mangrove_window.json @@ -369,10 +369,10 @@ ba9c3ecfacbd398048440d247decffeaefc714b5 assets/create/blockstates/mysterious_cu 7f2c5728e24d60ed2f7a095e3a954d7ca4e410e9 assets/create/blockstates/oak_window_pane.json df91d0ca68934c1afd9858a8d1591dd4cb88df65 assets/create/blockstates/ochrum.json 09c9bee3d26edc4b87cb7a5042f125c439ee5956 assets/create/blockstates/ochrum_pillar.json -0042b5a229d8b7bf89333697fb53ffdda32a153b assets/create/blockstates/orange_display_cloth.json 8ff85f8171ff60ebf95f574d6c9f275ae6e98ee0 assets/create/blockstates/orange_postbox.json af4c2c4861d1410e1b7371a5bf3fe09ed3ab0077 assets/create/blockstates/orange_sail.json aab812cecf7d10d4e7587f4dead8a98238a15f41 assets/create/blockstates/orange_seat.json +27d90736a8d64fe7f742a6e5874b8d5843f5dd2d assets/create/blockstates/orange_table_cloth.json 2bc30ed9907230271b4e2d0786f106f3e1e25029 assets/create/blockstates/orange_toolbox.json 2af63a4768f84fc93c7e7d67fa9a64438433e59f assets/create/blockstates/orange_valve_handle.json 515ed7dae09b052f289419ba09998a23e0d7083d assets/create/blockstates/ornate_iron_window.json @@ -384,14 +384,13 @@ ac536ae742c12e97bfd0b2483c87ff29f3935eaf assets/create/blockstates/oxidized_copp 3f3924f0f0e368edfa04f4fdd6d6c2319276ddfe assets/create/blockstates/oxidized_copper_tile_slab.json 5e634cfb9abb06d8b29f39d751fc56b28ea5a9cd assets/create/blockstates/oxidized_copper_tile_stairs.json ef3af446b56c69e71a156d5998d9dc8e6d9ea4f5 assets/create/blockstates/packager.json -0f204afc6712a08d2db84bb07a0a49927f3127a6 assets/create/blockstates/packager_link.json 887565a0f89f089d6be888c87394dde4878afda7 assets/create/blockstates/package_frogport.json 36742cc6ce052ead143366d31b11e828a525c1b8 assets/create/blockstates/peculiar_bell.json -c4de02184f63ed2e7c98cfa5bb30f8c0da10a425 assets/create/blockstates/pink_display_cloth.json 53d102e706d53cb2c0dbc0bc11da828084a43519 assets/create/blockstates/pink_nixie_tube.json a238a92b88c32f513c405cde5bd1898d6fe930b7 assets/create/blockstates/pink_postbox.json 213da5c04a33ae8ae7c0a4dec9844bbb6d670e33 assets/create/blockstates/pink_sail.json 8d5c80d5dc561240dfe8d7f212ffc33ac4e0fcd8 assets/create/blockstates/pink_seat.json +2698986d23ccd7b828af6150d04f0139255a5bf1 assets/create/blockstates/pink_table_cloth.json 90bd26c7c6933f5ebbe17b0fe58f840e2924a0f5 assets/create/blockstates/pink_toolbox.json 9f698d0fe8cfd3c9b727ec00623e6d473d516d4a assets/create/blockstates/pink_valve_handle.json 73c2a6e6e2e0dad1bdcf2d8b089b28dd4c72c825 assets/create/blockstates/piston_extension_pole.json @@ -461,11 +460,11 @@ df7af1e49c53ae99ac3f0b2fca5d948b8ea91938 assets/create/blockstates/pulley_magnet 89d763258c53aa12a1e0c0e586ab701f3de5a1b5 assets/create/blockstates/pulse_extender.json 81281435b8d1eeb4f1e318c6d14d49fa1fd86820 assets/create/blockstates/pulse_repeater.json 65bfd8283749117663f7199204691758fd286e38 assets/create/blockstates/pulse_timer.json -285ff4a4289c3c62a7837639130033922127089d assets/create/blockstates/purple_display_cloth.json b658654aa97e8dd2c897f432a601835a3f8aca10 assets/create/blockstates/purple_nixie_tube.json ee36eb7d8b7575f884a1d89c3ee1b4f3a5972a45 assets/create/blockstates/purple_postbox.json f8f9802df9c0b4e39edeefc3b1abb38255d79801 assets/create/blockstates/purple_sail.json 91b5ab66d7ec5235d278ee2bed6ddd88f39ce81d assets/create/blockstates/purple_seat.json +a4b6bd4e55cd292abf752efeda93cf8d23162657 assets/create/blockstates/purple_table_cloth.json 6aa467b3588359fdf5d7201f844193d5b70f20f7 assets/create/blockstates/purple_toolbox.json 6d02761efbb93349654514f67f5c0b7331e2823a assets/create/blockstates/purple_valve_handle.json 3aca01f2eddb22adb1b25735b98a990bfc7220d2 assets/create/blockstates/radial_chassis.json @@ -474,11 +473,11 @@ f8f9802df9c0b4e39edeefc3b1abb38255d79801 assets/create/blockstates/purple_sail.j ec546afd3ec8036e4393b97d535f05a86f57dbc1 assets/create/blockstates/redstone_contact.json ff205f032b36486753dddb1f2029ef8d53e9c86f assets/create/blockstates/redstone_link.json 9ae6198e13b456ef18582364644071a18cf9324e assets/create/blockstates/redstone_requester.json -d8446bc66d6d7da6d3533c961220d3180e4e4c0b assets/create/blockstates/red_display_cloth.json e3fd62e466e3e6e7bd6fc8661f764ba972a466fc assets/create/blockstates/red_nixie_tube.json e003cc60f957419c178d5b4ee215485ebeb3191f assets/create/blockstates/red_postbox.json 4c36b562da58ef2af57009da7cf2426059249228 assets/create/blockstates/red_sail.json 145f4e9ffaeff9be180e6c4e4989f2cf44cf0686 assets/create/blockstates/red_seat.json +90bf31515faa2e7e6d73414a6c5498911910710e assets/create/blockstates/red_table_cloth.json 380f46b7cb72b13c0f16fd4a4287a1a33adeff41 assets/create/blockstates/red_toolbox.json b689d87a27ed0cb2cab190a2ad2b599818bff56c assets/create/blockstates/red_valve_handle.json 87ab7ca62ecf24d60d7e5c61bd5af97714dad0ad assets/create/blockstates/refined_radiance_casing.json @@ -569,6 +568,7 @@ a60c9c8241e40c2e28f5760c0ca6e80cfe9d59f3 assets/create/blockstates/steam_whistle 8865500bcd2e4d467e74edb3509850fa92a5809f assets/create/blockstates/sticker.json bed0534e618105184bc877b104230403ca85bb58 assets/create/blockstates/sticky_mechanical_piston.json bab242ab794e6d439645c2d5a0242ae7c81942ff assets/create/blockstates/stockpile_switch.json +fef93db4bec71f83431800675f19f6c8ba749200 assets/create/blockstates/stock_link.json 9989bda294fbffc5f659d2e608e01dea424c7694 assets/create/blockstates/stock_ticker.json a70c025de5d85180f371ff05bbdc531d8bdfaab1 assets/create/blockstates/stressometer.json 8086f80c532fad42b37fcdc590b890ed7e8c3fe9 assets/create/blockstates/tiled_glass.json @@ -620,26 +620,26 @@ c11562afd9a5f85945e521dcea5f911d1b6d13c6 assets/create/blockstates/weathered_cop fee668eb9a45dca0d287fee5811219d69f9ec3e2 assets/create/blockstates/weathered_copper_tile_slab.json da110f382368257e15431c77164aef82e014e3f8 assets/create/blockstates/weathered_copper_tile_stairs.json 25ce64b7af5d244f194da91ccf964a9bf5762327 assets/create/blockstates/weighted_ejector.json -1c8b590923b1d78f5ae34ef0d8ba487884b696b3 assets/create/blockstates/white_display_cloth.json 2974b34a8cfb0d4e8e010f8bd085584ea631d541 assets/create/blockstates/white_nixie_tube.json f128f18e0baa69c94ac9149960cfe810a6c9ecf9 assets/create/blockstates/white_postbox.json f079469d186087d23f0d91b384040f777b0088b1 assets/create/blockstates/white_sail.json 317a6463db64b66d215d25b65ab52fe7f26ba9f8 assets/create/blockstates/white_seat.json +9013272715c2ed3104457a50a6f0795a7c33fc43 assets/create/blockstates/white_table_cloth.json 6cb8c82a429b54d6a87d02eec5cfd1fcd5365f1e assets/create/blockstates/white_toolbox.json c0bfe8416173868f9916c4a54dd9f983887c5bac assets/create/blockstates/white_valve_handle.json ec2720e3f1bc84304d0c81cd23ff1e155b0c2f2c assets/create/blockstates/windmill_bearing.json d688e80dfbd5b17970814887c3698fc721981caa assets/create/blockstates/wooden_bracket.json -1ae2558e739350632a0c2f1a93aea5f832b54d62 assets/create/blockstates/yellow_display_cloth.json 157942a838aa02909fb2238ad9ce77edc82f6142 assets/create/blockstates/yellow_nixie_tube.json c11d93cd5a64e80c7ad2d11d88b656dd7705138b assets/create/blockstates/yellow_postbox.json 68b6e267e93b96dbc0596ea4a1cd26636aa0e04a assets/create/blockstates/yellow_sail.json 4face2dd50a30bda0b21742319e701e666d51f8c assets/create/blockstates/yellow_seat.json +38135a1fda544b7b9624ebfa08d46351bd31ec89 assets/create/blockstates/yellow_table_cloth.json b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbox.json fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -74ec69161923ebe06e8dc281e40aec34c716e58a assets/create/lang/en_ud.json -6c5181994eb7853e46a3e21bd1a36e0ece70cd4e assets/create/lang/en_us.json +57831942f845db5cd15c5ad08d643b25eaf5d6e1 assets/create/lang/en_ud.json +0f661f60a043ebcf20c52ad99e928d97cb0cd355 assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -668,7 +668,6 @@ d4ffa3f167dfa03728ed760db7b72480ac78da71 assets/create/models/block/andesite_bel 63dc5d1d36eda5131f6163d1c051ff5b5d60b1f5 assets/create/models/block/andesite_cap.json 088c4433e9199faf6a09032f443d1c5529c1f117 assets/create/models/block/andesite_cap_alt.json b69b845d2a5f93ec3c2339fd5d38fa8e1360a3ee assets/create/models/block/andesite_casing.json -42000612b61b62f66f61aa5cfbf8f26942155450 assets/create/models/block/andesite_display_cloth.json 7f3e4636d521a67eb621d5d27d6b175d455179f8 assets/create/models/block/andesite_encased_cogwheel.json 5a5a3aac31c44030880774b96cfecc40568abe75 assets/create/models/block/andesite_encased_cogwheel_bottom.json 82ce3bec0d6b5332b4f5007245ca2cdd8e28b9c9 assets/create/models/block/andesite_encased_cogwheel_top.json @@ -694,6 +693,7 @@ b39661fd20e4b3f5ab2b20cbd51af4ca98e2410e assets/create/models/block/andesite_lad 32551174974fde322de14af09afb160673c4ed23 assets/create/models/block/andesite_scaffolding_horizontal.json e20105b4d1762fbfe67377e08cdb8c7ff9a62128 assets/create/models/block/andesite_side.json b58e7204eef795080abf9fffa41ba11ec2e12426 assets/create/models/block/andesite_side_alt.json +f9bc3af98dedae53161917c78a76353d1a270e7b assets/create/models/block/andesite_table_cloth.json 378df94de8cbce28cd3c2dc30fd3a30dfc451cdd assets/create/models/block/asurine_natural_0.json d6eb7105dd9b42adde48bd70e3f2fba70751c1db assets/create/models/block/asurine_natural_1.json 6d77d2591579619aa1ebb7b2f0e2c939e1648e4a assets/create/models/block/asurine_natural_2.json @@ -712,20 +712,20 @@ c60adf74c20091675c4c9293e69fcc8ded8fef93 assets/create/models/block/bamboo_windo ee71b0992edc2496025c22806e8de3a3243882aa assets/create/models/block/birch_window_pane_post.json 3088aa5e46cf9caa912c80a4e7791904e64e9def assets/create/models/block/birch_window_pane_side.json cb9d3a0dbac6a884d5ce0dc82085322f8c666707 assets/create/models/block/birch_window_pane_side_alt.json -b8f853e8289d735f9a2a8b43785fa0995ac99112 assets/create/models/block/black_display_cloth.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/black_nixie_tube.json 1fe4a9cbcae773f32c07f7cef42f52588ec1c1aa assets/create/models/block/black_postbox_closed.json 3caec00f8aa36393cac8049815b3e8bad12d8dae assets/create/models/block/black_postbox_open.json 62c92a681b5a86a5415cc7a70263ffdc794cdd59 assets/create/models/block/black_sail.json 443ed49b053fdd7356cd56f0495e18f2570d57d9 assets/create/models/block/black_seat.json +6f85d70c8fb017e80290a5832cdaf07ad3306b50 assets/create/models/block/black_table_cloth.json f48989d377de8e5067e807adf7e38da781e37ed9 assets/create/models/block/black_toolbox.json 8715787d72c3ef47c5651abcd819539bad6a96f7 assets/create/models/block/black_valve_handle.json -e0eebf58af7ce6789dd3908f216e81e363fcdea6 assets/create/models/block/blue_display_cloth.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/blue_nixie_tube.json e9e9487a3440b3a6c1ac515f63385ee59e8fb773 assets/create/models/block/blue_postbox_closed.json 7e2df652bfc7fdc27da6a52b52fe732fa175c996 assets/create/models/block/blue_postbox_open.json ddc740084aa5f387bee062bd4141ad8fadb56355 assets/create/models/block/blue_sail.json 96431b1f3a531ce89f876c9286b81838aec9b6d3 assets/create/models/block/blue_seat.json +97aef30303b851c28d4911bf2c6ad8033df628df assets/create/models/block/blue_table_cloth.json 89932aab163b14a21fffd4fab4b8b88a94163089 assets/create/models/block/blue_toolbox.json 3e052466f0b8db75779945c0f1231af9611b723e assets/create/models/block/blue_valve_handle.json 159e2b37a0866c9dbcdd6554be8a207883098168 assets/create/models/block/bracket/cog/ground_metal.json @@ -752,7 +752,6 @@ baaaaf87b9b883ef028fbf42e4f8b1fe89f79acf assets/create/models/block/brass_belt_f f96d0c4880b15e2b85c3d3428e7a5db502d2a668 assets/create/models/block/brass_cap.json 0686785f47d3360012dab59291271a30ad039603 assets/create/models/block/brass_cap_alt.json d2c11a9d736b8cb17b7face08f00202ecb12b4df assets/create/models/block/brass_casing.json -b2892b3e41efa1c14fd72bb33150149fcc4713fa assets/create/models/block/brass_display_cloth.json bf9a54257daa3e2787c8dcd84d42b9eb72503b5b assets/create/models/block/brass_encased_cogwheel.json ef13822bd18d37e7cf5d2c37e3fd3207cf2c58c1 assets/create/models/block/brass_encased_cogwheel_bottom.json c2187c0544513e96b440432f373f60845398af8a assets/create/models/block/brass_encased_cogwheel_top.json @@ -776,12 +775,13 @@ b2a95218042586aae38dff9278f3ee3f159bc73e assets/create/models/block/brass_post_e 62d99236e09b11af9a24d3c667fb1167cf8db0b0 assets/create/models/block/brass_scaffolding_horizontal.json ec81e9c237ec98b30a3de22e12cb9720922478eb assets/create/models/block/brass_side.json c697cace1f4097468ff34254c4ff6450d9d52f91 assets/create/models/block/brass_side_alt.json -5996b728460cf24e25890d977cdca49d2927465a assets/create/models/block/brown_display_cloth.json +f0552bba877b84ae81051019961cf87d13f976f4 assets/create/models/block/brass_table_cloth.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/brown_nixie_tube.json b04c80852527a07e01c27686be678cbaf568e821 assets/create/models/block/brown_postbox_closed.json 19a2045ecedd3ef12cda7d69a0d7bc6a4133b7f1 assets/create/models/block/brown_postbox_open.json 50a054d1e0660d16e86cf7a520b9bf36e38401b6 assets/create/models/block/brown_sail.json 0616de192825246e6036d1f69911170438a83b81 assets/create/models/block/brown_seat.json +eb829b796cea3387cb25ace858c795e2497b3703 assets/create/models/block/brown_table_cloth.json 4226a7c5f1bfb0a75457fb4dfd22448503110e5c assets/create/models/block/brown_toolbox.json 0e1fece0854ccea20df2f0abc865e4f44af54d1a assets/create/models/block/brown_valve_handle.json 40a224ce4ea989599f7bd66bd2437ac2b98247d8 assets/create/models/block/calcite_pillar.json @@ -797,7 +797,6 @@ d8339ab47ffa828985c7da27c37794a95aba8b42 assets/create/models/block/clockwork_be 8afe6afaff33b94c1fcee68fdaf842d525eec212 assets/create/models/block/copper_cap.json 58e6ed1f765ba67ca5d8a446af357f311587e431 assets/create/models/block/copper_cap_alt.json d8053f194ee9331288aadac94bc23fff5a63ae9c assets/create/models/block/copper_casing.json -7a7002f487eb938dfbfbb04236f2ce01b925fc52 assets/create/models/block/copper_display_cloth.json 2606721928394e80b24b5f0ff7011c1c552cfe7c assets/create/models/block/copper_ladder.json d063df8e9b974c11fc7810ce176b02d7d924e15b assets/create/models/block/copper_post.json 2b5aed4a917694beb33d9b0ecbc800dcbc143ee9 assets/create/models/block/copper_post_ends.json @@ -811,6 +810,7 @@ fb7fb6deebd502946ab57f1b8a9f4a6b5dd48da3 assets/create/models/block/copper_shing fcb9295f4f388e6d439ec9a3906ca326b6d69077 assets/create/models/block/copper_shingle_stairs_outer.json cb218a725f82db34ffe58a5208266e1c768cfc05 assets/create/models/block/copper_side.json d9b4652ca8f1e65007f42d946ecfb38acc3f168f assets/create/models/block/copper_side_alt.json +03a6c5b8bc3041a2be001092f7abd014d6f852a2 assets/create/models/block/copper_table_cloth.json 32f06f39d0b34e4431795aa6e64f87e58dc1597b assets/create/models/block/copper_tiles.json 298c6100de02ed9f813397d8ba38c46f35035c69 assets/create/models/block/copper_tile_slab.json d4422c2d96fb329087d1be70d8b983a8cf6c7f01 assets/create/models/block/copper_tile_slab_top.json @@ -1111,12 +1111,12 @@ d6423c0fd0af4fbd929d26d6097a1722567acc9d assets/create/models/block/cut_veridium 579e9da7420bfb7fdd354c80534426262a941a7c assets/create/models/block/cut_veridium_wall_post.json b2e847cee8c01791c15fcdd35787af33ebe46f0a assets/create/models/block/cut_veridium_wall_side.json 5ab4db4245b852edf985fe72595f678eb7372801 assets/create/models/block/cut_veridium_wall_side_tall.json -983788579d7ec61b805d1057b81a18282af38365 assets/create/models/block/cyan_display_cloth.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/cyan_nixie_tube.json 0cbd0c6c909effa2f71e198655d51f2e483454aa assets/create/models/block/cyan_postbox_closed.json ccea6f3023879d84de4590a584f666598f58d6bc assets/create/models/block/cyan_postbox_open.json 27c9aff76b32e4de18d581e133fc23a8239ca412 assets/create/models/block/cyan_sail.json 01a324a92552076589e2aaaeca9d4da2d1e3b39d assets/create/models/block/cyan_seat.json +c7a147b092909c57ae197007818810fa75b9cb68 assets/create/models/block/cyan_table_cloth.json 663f431fe8a02e057980cf9bcfc566eb5adc876f assets/create/models/block/cyan_toolbox.json febd2b2f94194441fb73020b667d0398853add4a assets/create/models/block/cyan_valve_handle.json 339993f53eacf042d8caab6101eb5d4088b35746 assets/create/models/block/dark_oak_window.json @@ -1195,20 +1195,20 @@ d0fa41de17f65693188f1868ace5fc2ac518739b assets/create/models/block/gantry_shaft 2cf599d083948513c5fbfd92ea8f47c0c215cfbc assets/create/models/block/gantry_shaft_start_powered_flipped.json 3356069e112cde817da0c99ceb40cd8f207de822 assets/create/models/block/granite_pillar.json ee860a8bd95fda14a859d6632652ee2a95f06c19 assets/create/models/block/granite_pillar_horizontal.json -ca01316f75239f08d7da81615779f8eb002de88f assets/create/models/block/gray_display_cloth.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/gray_nixie_tube.json f2bbb067bc4e91a71303cc92939c4f4707cdc1ab assets/create/models/block/gray_postbox_closed.json 905fb4b54a39ca9bc1d6f48977bb3b158b17c2a1 assets/create/models/block/gray_postbox_open.json 97f382e9b435c81d1d8e0ed487a7fc16e6945958 assets/create/models/block/gray_sail.json 58b51da5c80e4f43582452d97453c93145a516ad assets/create/models/block/gray_seat.json +2efdba46e7e7acbbcbd36468e5d46c22989b8516 assets/create/models/block/gray_table_cloth.json cd3cff8e38d559dcb78df014556a78d5a538af43 assets/create/models/block/gray_toolbox.json 3ee19f46bdeb0ac7489dcd4d51f90ab01ad863c9 assets/create/models/block/gray_valve_handle.json -71fae019670515f2c5bf7bd1f7930d76b6ff3e15 assets/create/models/block/green_display_cloth.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/green_nixie_tube.json 21fbacdc856fb1003f58bf2842fe418124f6b01d assets/create/models/block/green_postbox_closed.json 703df2f5307d39f0f4e5b9a1f99b8c14fd819dd0 assets/create/models/block/green_postbox_open.json 26577589688ec1f39cae9f42704cb36cbc1c48ae assets/create/models/block/green_sail.json ae51eaa500dd036fa27474a7392f381afb677dfd assets/create/models/block/green_seat.json +4fbf52032b062afd32921ee925d8c13160fe2029 assets/create/models/block/green_table_cloth.json 801d277b241332d5f4b49bdb00b911dcd01a7db2 assets/create/models/block/green_toolbox.json f7762c9388198b51686541edbef9a1546041f6e4 assets/create/models/block/green_valve_handle.json f8b51eec36c2eddc08a1b60894d863bb58f55625 assets/create/models/block/haunted_bell_ceiling.json @@ -1249,43 +1249,43 @@ b843a6e27c4f90e31108f9f3c1573e70fb3d0927 assets/create/models/block/layered_scor 714fce357bab1fd9b9134aba560125c39b733a4e assets/create/models/block/layered_scoria.json 5fb53db0c6623dc16e486ac0bd094b5a90e2e080 assets/create/models/block/layered_tuff.json 336d1646294e018ea3de60b30a621a10ca7aa6d7 assets/create/models/block/layered_veridium.json -f479a8a6964c52fc3b072ca3170d5b478f62842a assets/create/models/block/light_blue_display_cloth.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/light_blue_nixie_tube.json cf487c0be9444b7ac124d2ae33e6c545803e14b6 assets/create/models/block/light_blue_postbox_closed.json 7497701edea1599fc51e3eaa0367007ca00bbe69 assets/create/models/block/light_blue_postbox_open.json 2e83d3aaa92640d6b3da2a2644f6a160f97b08e4 assets/create/models/block/light_blue_sail.json ba917560f40a4e46ef190649f18adad9962c5c02 assets/create/models/block/light_blue_seat.json +af065b4c74b0d177075221a996d9ac78b871e8f0 assets/create/models/block/light_blue_table_cloth.json c20616aa90feab3003cecb4a5be5466c0fc83072 assets/create/models/block/light_blue_toolbox.json bcd3d28b8a062649301648ea5e2d0463f93d008d assets/create/models/block/light_blue_valve_handle.json -8de84b9d3eb33403de699c5c5c4093e32b1685f9 assets/create/models/block/light_gray_display_cloth.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/light_gray_nixie_tube.json 1efabd28f0dc3db1c0e6bea2be62cac883fefd66 assets/create/models/block/light_gray_postbox_closed.json a42521eac2924269cb1f0e865bafe7dcd147d1cc assets/create/models/block/light_gray_postbox_open.json 09f284574b38ab57579e939bbb088b8d36e0b8f5 assets/create/models/block/light_gray_sail.json d1813d0f548fcddb361df7cc3b5d97582842b10f assets/create/models/block/light_gray_seat.json +debf78f20659bc3c637299a40b649cbe4aa30ebf assets/create/models/block/light_gray_table_cloth.json 4ec5d701dd8b2d8c3dc44d05f527a3d737002cd4 assets/create/models/block/light_gray_toolbox.json adb8dbed70419e0310e7a20f3656bf325b348434 assets/create/models/block/light_gray_valve_handle.json 8f53caad3899a30be5087a0ba155080834418cc0 assets/create/models/block/limestone.json 2b80f9421c2fe902d55d9bd95183ad4bae46c315 assets/create/models/block/limestone_pillar.json fb18280a2a708f60b00cc7c675804c219784871a assets/create/models/block/limestone_pillar_horizontal.json -023f2538cd860e3ade165390eab9e4fe32847402 assets/create/models/block/lime_display_cloth.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/lime_nixie_tube.json 952d292d4dc2158e6106c5079cfa1ddb81c7777e assets/create/models/block/lime_postbox_closed.json 4357f5d9102d54c7fbe5325512a2cd42d94d6d42 assets/create/models/block/lime_postbox_open.json 5a95a72444f523cfba6e8c5adf8eacbb37e2d21e assets/create/models/block/lime_sail.json 09e7bf50cf88c449dbd9e77829cdb5afffb7d88d assets/create/models/block/lime_seat.json +e4142a22c20d6e5b9a8b9f96c13d4e5f96adc59d assets/create/models/block/lime_table_cloth.json b92822a01e4fbed2463b1bdf7dcc736023988e20 assets/create/models/block/lime_toolbox.json 802b47f34b1053b7af980b08b6511f468e7dd7c1 assets/create/models/block/lime_valve_handle.json 84b9ac6eafdbd037f3ff558c250a8b8952415af1 assets/create/models/block/linear_chassis.json 29ee936c09c1222c6a144e5bb39577b5a9cd28bf assets/create/models/block/linear_chassis_bottom.json a1a3804ddcb1db0a7b5c0693555f8eb326950dd0 assets/create/models/block/linear_chassis_top.json f885acc0ba705cfa9c65b62626ab4007f3b6e329 assets/create/models/block/linear_chassis_top_bottom.json -e23d016fe71681e6b13fece5d14d95da5fb45fbb assets/create/models/block/magenta_display_cloth.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/magenta_nixie_tube.json bfea3fd456f92391afc9f948ade90b16275e63de assets/create/models/block/magenta_postbox_closed.json fe224c9e396eb51a6cc0b38175b621a56500fda7 assets/create/models/block/magenta_postbox_open.json 81122f26a12b7ab40fed6d31c97376f4dfffa111 assets/create/models/block/magenta_sail.json b5cd13b021400b3c37499ec4ef22e560c721ac54 assets/create/models/block/magenta_seat.json +8b37821a3c6825488479d4f605bbd84734457c68 assets/create/models/block/magenta_table_cloth.json d7b2b16ba2d6a0b2441aeaf7faa76f61fbdc35e7 assets/create/models/block/magenta_toolbox.json c0d29851d48cebd376b3b6e8f0454e0369d0e265 assets/create/models/block/magenta_valve_handle.json 026384a699d592160624bb7a1606e31fb77751be assets/create/models/block/mangrove_window.json @@ -1308,11 +1308,11 @@ af50363d603d61340b336569d58c1febde253665 assets/create/models/block/ochrum_natur d69effa0a811cb93fead8257bcaad4bbf0094002 assets/create/models/block/ochrum_natural_3.json 24669a4e93925940477fcfc0aca10ab9d87368e0 assets/create/models/block/ochrum_pillar.json c8dd33a0b71dce37712788a61729de89574b117f assets/create/models/block/ochrum_pillar_horizontal.json -6ba7beb0581d761ce06dad03cdd19e591e392546 assets/create/models/block/orange_display_cloth.json dbd0cbfa1c6cfaddd7ac954379b4b1f3056730f2 assets/create/models/block/orange_postbox_closed.json 88cda1f606e502cf0df9430b75a70fd3161fd6ba assets/create/models/block/orange_postbox_open.json cb4cd4e4bfb0d105a09c56454abf4795b155d12b assets/create/models/block/orange_sail.json 6c4addc75fb03911fca3083f891b22f55209b8db assets/create/models/block/orange_seat.json +f004bacf25a9675a87905ddbfa2e140a3891f4b0 assets/create/models/block/orange_table_cloth.json f68eeb8cd828a0659fe8665373daf093ea65f0fc assets/create/models/block/orange_toolbox.json 992367362e20777dd2e1245c6b26b6ffab86b21c assets/create/models/block/orange_valve_handle.json f9010894858512398bddd5d31b922e12594d2e3c assets/create/models/block/ornate_iron_window.json @@ -1337,12 +1337,12 @@ f8b51eec36c2eddc08a1b60894d863bb58f55625 assets/create/models/block/peculiar_bel f70f83cfec770879c478eea3760ea187700f2878 assets/create/models/block/peculiar_bell_double_wall.json b9c9d00b844ca2f217ae21cc502cd4d082fed2d5 assets/create/models/block/peculiar_bell_floor.json f7b09c243cfeda8bb38a29a917b9fbdafe47eece assets/create/models/block/peculiar_bell_single_wall.json -266d126aa95d03fc274d838986fc1f53519f4e10 assets/create/models/block/pink_display_cloth.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/pink_nixie_tube.json 084266ced8975953fa158fd9e7261d8f10b94db7 assets/create/models/block/pink_postbox_closed.json e99518b61a3c7a89570a8aa8c4cb45badfa8547a assets/create/models/block/pink_postbox_open.json 90113a1f53f0f8d9ce11ff14128eb860063f5ddc assets/create/models/block/pink_sail.json 888dba067e751a55205dbd919db8e92ef2be604d assets/create/models/block/pink_seat.json +9a7e7af8cc625a0812304c9bd3b00d13f085f040 assets/create/models/block/pink_table_cloth.json 3cb69299c7787f88fb41c6397362aa7b607c0960 assets/create/models/block/pink_toolbox.json cf2fda0a37a0e5771cf882793ca21f277219796f assets/create/models/block/pink_valve_handle.json 44b05f0e3847c526514f7a7e167d275415408b39 assets/create/models/block/polished_cut_andesite.json @@ -1498,12 +1498,12 @@ de0cc956e7ff1510d0947ca8fd2b6e642944f0ee assets/create/models/block/pulse_repeat addbe93af945ff7ca2680a27225db804d3ac9b46 assets/create/models/block/pulse_timer_powered.json ab3d7e10abcb53b835d6f5c406b7a777a942d6f7 assets/create/models/block/pulse_timer_powered_powering.json 7b425d9db8d914b52b7faad2f792c020b678f84d assets/create/models/block/pulse_timer_powering.json -7688c890be93afa905bd869ef0bcdc603bce9a78 assets/create/models/block/purple_display_cloth.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/purple_nixie_tube.json afdd265ee175c47ea6e4e44fb08d212e4cef5ee5 assets/create/models/block/purple_postbox_closed.json fbd874fd63b3d6f50592703dce6bf196f2d63732 assets/create/models/block/purple_postbox_open.json 356378a5839b0b400aa5e0a67740634113c09a38 assets/create/models/block/purple_sail.json bc8e473a5662b6180b00b85e5006241a283c9baa assets/create/models/block/purple_seat.json +d040daf29c44f31c4cd8522998b66f7021b3c746 assets/create/models/block/purple_table_cloth.json 5e85ec98c165a0b5bfe25d391e96df9164372a3a assets/create/models/block/purple_toolbox.json b7e5f69044c7a1d0a31fd2f6efe81a5be060bf19 assets/create/models/block/purple_valve_handle.json e1fdd5fb88d9f5af7d0e90e65cf5ecea0667e1c7 assets/create/models/block/radial_chassis_side_x.json @@ -1514,12 +1514,12 @@ ff65b89683fbb9326f625b9a68f954def5ed000d assets/create/models/block/radial_chass 2a59eb4074dba8ea4acbef2260171c11d93e12e6 assets/create/models/block/radial_chassis_side_z_sticky.json 9d234d1294f927d1e70a5c9b1e6de73ef65e7014 assets/create/models/block/railway_casing.json be8042806b08990786ced1cf140c4942d7a6788b assets/create/models/block/raw_zinc_block.json -832899421073c18da17bf6919c97e2f3cf9a6b77 assets/create/models/block/red_display_cloth.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/red_nixie_tube.json 844614001c30ef34d3136a350c12018c5e9ab341 assets/create/models/block/red_postbox_closed.json d06791faedd062464a13972a3b64de86053aeac7 assets/create/models/block/red_postbox_open.json b692deeb65f338212fb1073b725a122b7b1359d5 assets/create/models/block/red_sail.json bf3f4ba33e1a61254073ecee3e753958f8debb35 assets/create/models/block/red_seat.json +687a21d7d3e00820430dc47575449dcdbdc5b59c assets/create/models/block/red_table_cloth.json 2a13766aebac1a392ae7bf934bd81d9210c87a24 assets/create/models/block/red_toolbox.json 36f525b420b040b9f78032abe84cd125766cf320 assets/create/models/block/red_valve_handle.json 2aa9e5c535979c912593f30b654ae96334f72a80 assets/create/models/block/refined_radiance_casing.json @@ -1774,20 +1774,20 @@ f32a18c76cfaca2153f6321880a8da1347be37ce assets/create/models/block/weathered_co e26dd64495ff8801593e9c22203cbf364075badd assets/create/models/block/weathered_copper_tile_stairs.json b658c1022587bd670b5acee267607719c1544332 assets/create/models/block/weathered_copper_tile_stairs_inner.json e7ae89577be9d26a071bf96cbd7ed80293902b63 assets/create/models/block/weathered_copper_tile_stairs_outer.json -15316edd1babb61b1458cf81feaf2c3e135122b6 assets/create/models/block/white_display_cloth.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/white_nixie_tube.json 998d838964c6c5bc2a1903b5098491abf5d819bc assets/create/models/block/white_postbox_closed.json e89fe63260b94fc70e360eceb3d04b74242c248f assets/create/models/block/white_postbox_open.json 99f0628623a36ac1700a5876cec010ee6353162f assets/create/models/block/white_seat.json +29d6f3efddd06f6c9fd876aefb3f95043fc928e6 assets/create/models/block/white_table_cloth.json f252f8c68702a0c050797a2dc2a51c586408722d assets/create/models/block/white_toolbox.json c9e344a06ee8bca1bfddd70481198135cabafbce assets/create/models/block/white_valve_handle.json 68d8eddfb724c73938862fb1a213a99c95814fdb assets/create/models/block/windmill_bearing.json -6c063bc2ef06940af3a1d3d0f1546030bdaef672 assets/create/models/block/yellow_display_cloth.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/yellow_nixie_tube.json 9abbd0af47396b1cb18362b423f497ddb40eede4 assets/create/models/block/yellow_postbox_closed.json 098b675ef5071a32bce387445da09067917852c7 assets/create/models/block/yellow_postbox_open.json cf8477d6c7558ceba38416fae755567086a856a6 assets/create/models/block/yellow_sail.json 07b68f0e4c617dfe3e935a1b9e8e020ab3131c0b assets/create/models/block/yellow_seat.json +199a767acb9a27b5fead0870c00068f3f5602bc4 assets/create/models/block/yellow_table_cloth.json 21bb6e0b43984214c496e531e16dd60aeb619a42 assets/create/models/block/yellow_toolbox.json 467109ede866fb030d2cdc46c832643630d982b5 assets/create/models/block/yellow_valve_handle.json 23d6852eca1bf1480dc74ed51d15c098e26a520f assets/create/models/block/zinc_block.json @@ -1800,7 +1800,6 @@ be9e4a7937dcb87bce696e6ad234c9eff8cd299e assets/create/models/item/analog_lever. 158270c9fa3022d1afb56002d0ea1db3366467aa assets/create/models/item/andesite_alloy_block.json d497fcfe54f9caddf1925cc303f9f9a62015e0ae assets/create/models/item/andesite_bars.json 11c747281cbe2d96324db27fec020100b50977d0 assets/create/models/item/andesite_casing.json -09d48b7e4f3e89f2b46f84a2dd981d09b1a0a91c assets/create/models/item/andesite_display_cloth.json ab09b7886916048add1fa0ea9e87c4644a781031 assets/create/models/item/andesite_door.json 944cbae9f7c4bf7d1734d25645cfa6b0d0f2c33d assets/create/models/item/andesite_encased_cogwheel.json bb351157b7f6771be05b4cecef17b8610c3810b3 assets/create/models/item/andesite_encased_large_cogwheel.json @@ -1809,6 +1808,7 @@ af792bb7d70029e66cc8aa21ed61322f899fb134 assets/create/models/item/andesite_enca 113fb6cb131bc3cdf63f558be71b8d77f9ae64c9 assets/create/models/item/andesite_ladder.json f187d676688c728804ab3758eb4b78a431c7ec21 assets/create/models/item/andesite_pillar.json d0dd86f6c7418c27c0f930cfd20e0867936eca3d assets/create/models/item/andesite_scaffolding.json +bfff8b148eb612a0d801cb044e3266a7245d2792 assets/create/models/item/andesite_table_cloth.json d5375c3de6272a00f3e3787fee6b8255f828d686 assets/create/models/item/andesite_tunnel.json d6eb7105dd9b42adde48bd70e3f2fba70751c1db assets/create/models/item/asurine.json 8b61987c61ae461e4bea0fccf5b1bb3399ac9226 assets/create/models/item/asurine_pillar.json @@ -1820,24 +1820,23 @@ def88cd2c79a1f0ed40bbf5a0332187dd1d6006e assets/create/models/item/basin.json 35a1e2cb2645a8386dfee2697b47547b3f9a1dd2 assets/create/models/item/belt_connector.json f5dcb9096a52d5d2eab1e4204fbd1222e0d5094d assets/create/models/item/birch_window.json eccafeec52e4195fbe211c602b4fc71a260d8a64 assets/create/models/item/birch_window_pane.json -204c6bd54cb28e9403e7842320b4d58e5a0a2aa5 assets/create/models/item/black_display_cloth.json 641b85751f91c0b4931307548c12034fc56286bc assets/create/models/item/black_postbox.json 7ca635d45fef81e6681a492be6c7bb71fd0f4574 assets/create/models/item/black_seat.json +67256e7c62c3ed2cee1dc88c2437083966165f92 assets/create/models/item/black_table_cloth.json e2dc1a8db84d84d592bfd91a26464343b8706bc0 assets/create/models/item/black_toolbox.json 20fbeb136e85d146c0e041f7f1570b1d1fd34585 assets/create/models/item/black_valve_handle.json c31038397821b6abe296d2799aa81edf3c12d095 assets/create/models/item/blaze_burner.json 9d28754112688323a6b55ecb6742e918eabfd6a3 assets/create/models/item/blaze_cake.json 01637416bb932d861e9c9b10b256b2fdf4c96d44 assets/create/models/item/blaze_cake_base.json -e5ec8be9aa7d7e33c35e095a28ee6d52dc3a88af assets/create/models/item/blue_display_cloth.json ef453775edb9342dc68e0e4ed7aa2e845b819fa6 assets/create/models/item/blue_postbox.json de8beb7ef521822eb9b2826806baf1fa3344a45d assets/create/models/item/blue_seat.json +b1059dd00b8b4102e345a3d4f3e903a92c372ea1 assets/create/models/item/blue_table_cloth.json a82bc56a503cd15d2354c86a49fc6d1d4ed22767 assets/create/models/item/blue_toolbox.json 2f90f781cd9b5d144a6cfd4748ae3a87c9f12ba8 assets/create/models/item/blue_valve_handle.json d16ce54ed4e2546f168d3bcf7d748ff749565316 assets/create/models/item/bound_cardboard_block.json 4e711f64e0ab7d16c550cc4aa8b876d604dfb2af assets/create/models/item/brass_bars.json 136f97f26217c51c932d79bf715b2a1a92e6595e assets/create/models/item/brass_block.json c876713c3b8ed6511679d1e3186e6d6031190dd5 assets/create/models/item/brass_casing.json -a0423c680718c221381a201a3c229bcd8b99c751 assets/create/models/item/brass_display_cloth.json 378a2f1820c9abdc1080c940e5a01e30c25ea5cb assets/create/models/item/brass_door.json 2bff62a6d695a0affa217569c764e37b584495f9 assets/create/models/item/brass_encased_cogwheel.json 14cae756c604d0ea39f640f7cedc11cd403562f1 assets/create/models/item/brass_encased_large_cogwheel.json @@ -1849,10 +1848,11 @@ a51a28424e75dbd11c845f455c778d4c578b9da4 assets/create/models/item/brass_ladder. 55208677f9135c3ca897c2432caa332bb1b858f2 assets/create/models/item/brass_nugget.json af97ba84be90381e2cc9434e31e2199c2e7e3aa6 assets/create/models/item/brass_scaffolding.json b78e9274156f5027a9a3b6fb7725c57a7aecc8bb assets/create/models/item/brass_sheet.json +56a3fa52f2e68c3cc27841f094cf85f55cddce5c assets/create/models/item/brass_table_cloth.json 28e104d5041c1f4676704c0f6b4e2e80aac43106 assets/create/models/item/brass_tunnel.json -65a548c6f3117d14e94f17e5ee3a60909a973c3f assets/create/models/item/brown_display_cloth.json 35c8539a0b2f927e65a43c3a2c3cb82db429c2eb assets/create/models/item/brown_postbox.json fce64539b36fc8a5ffa39d7a3f73765818437cbf assets/create/models/item/brown_seat.json +a126a50454ea449e66c6f6e36eb96bff96652c92 assets/create/models/item/brown_table_cloth.json 90c1ec317beed0b5735c8731e3115a695b7060f7 assets/create/models/item/brown_toolbox.json 9477ab491586f1314bebf4d58387425ae56d0bad assets/create/models/item/brown_valve_handle.json 1db479848369140bb913ba09f3f1d994e4ac864c assets/create/models/item/builders_tea.json @@ -1867,7 +1867,6 @@ d6a3f139fca5ac6aff94d11d75fe239283bb4a09 assets/create/models/item/cardboard_che f998f36d9a6f469bbd3822a17b2b45f81e6810c6 assets/create/models/item/cardboard_package_10x8.json b7a24a7dd21a464815b2fd8cd6037e854be3f485 assets/create/models/item/cardboard_package_12x10.json d5396690e7813c67ee3600555d7e47d0097b1f56 assets/create/models/item/cardboard_package_12x12.json -39aacb806378ce16d5c801a0c7ea8027b5090f9c assets/create/models/item/cardboard_pulp.json 9dccb21720687bbd516c8598c5449028077f8467 assets/create/models/item/cardboard_sword.json 1cdb2b8801551c1540bb9b2a9cc3d725a2b433e7 assets/create/models/item/cart_assembler.json 390a06d81c8c2a0ff83196bd0154dd292206e3b6 assets/create/models/item/chain_conveyor.json @@ -1893,7 +1892,6 @@ de48f4b6fa26928ebc7d5d60e6a0767093430d65 assets/create/models/item/contraption_c 6c53b1a6ed28929b7a0a090edf6101e610f842fc assets/create/models/item/copper_backtank_placeable.json 2a0b31d76ab8a74c458475640d17de15ad314fcd assets/create/models/item/copper_bars.json 688e4dee99126b7507761de618d6788c18f17153 assets/create/models/item/copper_casing.json -48440557057d868cd507cd2973559b9fd3874d52 assets/create/models/item/copper_display_cloth.json 68890c027cd6a094b484a237d3ff5daeb09622af assets/create/models/item/copper_diving_boots.json 23499699c6ea6a30673835056f5d0039519413fa assets/create/models/item/copper_diving_helmet.json 0e394c50a977eae45d3d8e6a62e256a5408ac994 assets/create/models/item/copper_door.json @@ -1904,6 +1902,7 @@ a4fd2f4f00e03b2ac5d863e93827d39a984cc2ff assets/create/models/item/copper_sheet. 13b18ba2938e283d507fbca70518cf52198cdc71 assets/create/models/item/copper_shingles.json 79d9f8667965072f12e51e6601b5c36f8acc125f assets/create/models/item/copper_shingle_slab.json 9fe6f0bdea4595b403ed2d2cbc2023a9abeb79f0 assets/create/models/item/copper_shingle_stairs.json +f8353c0830e1ce5511104196551e8adf73894563 assets/create/models/item/copper_table_cloth.json 19642e4ea5deecaf57059827c4c13a19d2e73822 assets/create/models/item/copper_tiles.json a7147444fc28a4cce21b6cf38e9528537e27c352 assets/create/models/item/copper_tile_slab.json 7330324d6c64f0340d676ecef83a930515d9130e assets/create/models/item/copper_tile_stairs.json @@ -2047,9 +2046,9 @@ f633006045ccfcdf486d7a240217229d6eed717e assets/create/models/item/cut_veridium_ 410b949304faa5856028f7c42ab762b7498ffd95 assets/create/models/item/cut_veridium_slab.json 62697c0922b11537914d2f4f84faa0b909ee518d assets/create/models/item/cut_veridium_stairs.json 3921d61a26d48d999cbb2f6645611e53ea71978b assets/create/models/item/cut_veridium_wall.json -8249e035f7218d67e057c903cba06324c09bb658 assets/create/models/item/cyan_display_cloth.json 73c2eed9b6a906a519e27361211ae05bc6ed2d87 assets/create/models/item/cyan_postbox.json eef3be2fa3b6424436a553e3c1bfee3979015962 assets/create/models/item/cyan_seat.json +fb3660aa1b33ef63361d91598c2b46dd5b1c30d7 assets/create/models/item/cyan_table_cloth.json 265d5d6de4238442bb9b161dba0a2fc2f063df0b assets/create/models/item/cyan_toolbox.json 8beb6459822efe59d0f60749143d73c5390e39f2 assets/create/models/item/cyan_valve_handle.json 2e0a1bb3f3498454eb23dab5d4eb6fad98fe586c assets/create/models/item/dark_oak_window.json @@ -2080,7 +2079,7 @@ fa7ffb172a43774cc07a2bb201e7010a2549001d assets/create/models/item/exposed_coppe a443633d90ef9ac2a866b69b2ecdfad1841dc3e1 assets/create/models/item/exposed_copper_tile_slab.json 9bb425a14635fc8b36a9a95f3d0c54e0b129b7b4 assets/create/models/item/exposed_copper_tile_stairs.json 8b64a93d9b6e33e3caa66adb7a0cc8c5cd473023 assets/create/models/item/extendo_grip.json -8e4a2cef0741c30574874d1a71d46f221ddbfaa4 assets/create/models/item/factory_panel.json +9114fa2e92ea4b7bf949b2e5a26290b0bade1af3 assets/create/models/item/factory_gauge.json dad31483f65baaf187e6553e3cd301c5d69e9db4 assets/create/models/item/filter.json 575047531b8e324df9e58abba79cfe9ee3db8b16 assets/create/models/item/fluid_pipe.json 51d34caaa63685e901b8bfe6ced13ff2e8914ce7 assets/create/models/item/fluid_tank.json @@ -2098,14 +2097,14 @@ b17d9fd1a92db0965f2e5da6215956b0451af29e assets/create/models/item/furnace_minec 7c850a41a754e46bb9c9f257ed621e37a1b9506a assets/create/models/item/goggles.json b1ae37998326c8ca054e57b0cbff0b51cad98625 assets/create/models/item/golden_sheet.json 85c301898775d5720d4d11c1c555b331a5c2e93b assets/create/models/item/granite_pillar.json -aaf4f056415a83e02a8c7fa0bcf19039510b732b assets/create/models/item/gray_display_cloth.json 44173ca711aa497d08ca3b8a9613290378072870 assets/create/models/item/gray_postbox.json b8d6d2d163e2ab5f654bbc4eda9ad63f8064d27c assets/create/models/item/gray_seat.json +4a9aa604745afcb19c3495a879013e263415f214 assets/create/models/item/gray_table_cloth.json 6492f86b693f924d0222d0ca1d16fbe33d797b1a assets/create/models/item/gray_toolbox.json 2a9500f9630b1da44615c7c9ca145b56324c46bb assets/create/models/item/gray_valve_handle.json -ea83c3f62c9cbdd63bccc2440783c5d4b4bc78fe assets/create/models/item/green_display_cloth.json 1a97f63df2977ac2f2e3363c61a7e36bf60d3ce3 assets/create/models/item/green_postbox.json 2843370b0e693e1ba1777c26416914edbd87c4f9 assets/create/models/item/green_seat.json +334fd81d5e6574220ee5815f1452b4f4aa7ad223 assets/create/models/item/green_table_cloth.json 561e0579101bf602b252c0b9a5eec468c89d0e40 assets/create/models/item/green_toolbox.json 7d3ddad087b4d2c6a32f97092533cbfb5de0cb3b assets/create/models/item/green_valve_handle.json 9e352162c8135773a4eca41871beea8f3ca650ae assets/create/models/item/handheld_worldshaper.json @@ -2143,28 +2142,28 @@ a22638fd361a8185175e107a8ee092a9ac030b7b assets/create/models/item/layered_grani 14494272713544a1595d654fd397a986b2da0951 assets/create/models/item/layered_scoria.json b1174d783c62dda84aafd4259c622197f4664421 assets/create/models/item/layered_tuff.json 952b07dbf9ecc1883deabaa1344667f13936f7f2 assets/create/models/item/layered_veridium.json -6a90dedcacb1f49192edef3d595485a851e01210 assets/create/models/item/light_blue_display_cloth.json 623c937db944651cf1075b3875afe002db527ed6 assets/create/models/item/light_blue_postbox.json b44a9f1bd9079f3533d7f708d76eb19a864e5ebb assets/create/models/item/light_blue_seat.json +df2a3c76b7dbe1f5f6556436e7db3b72288b2232 assets/create/models/item/light_blue_table_cloth.json dae914625ff1bc3ebe1463485cad4526a7d7e9f5 assets/create/models/item/light_blue_toolbox.json 1d94314f185151eb9dcabcef950abf6f86c3c836 assets/create/models/item/light_blue_valve_handle.json -8625b55c38664eb3edc3449b3071ec8363cb1cfd assets/create/models/item/light_gray_display_cloth.json b56a28924b0b1b2530ebac7834e011700b09b966 assets/create/models/item/light_gray_postbox.json 1747bcdea3b1d3f5dfb786102069e07198d36dfe assets/create/models/item/light_gray_seat.json +cc8834024208662cb100f7cd38a04637da3b6852 assets/create/models/item/light_gray_table_cloth.json c8513eb1c89652783e26d7dcfcf64afa97619bc8 assets/create/models/item/light_gray_toolbox.json 3774d23e76b5712e7004e333e0a770f2230c2998 assets/create/models/item/light_gray_valve_handle.json 8f53caad3899a30be5087a0ba155080834418cc0 assets/create/models/item/limestone.json fba1e7d1cad39c89976b427db62544d80f47ad5d assets/create/models/item/limestone_pillar.json -db293a19bce89ee56cbd08d46357fafae8e8d53a assets/create/models/item/lime_display_cloth.json 26b8e1daf9cc4b206fb5f62904c7f1701ba93e67 assets/create/models/item/lime_postbox.json 32cd55a1c97a31a13ad106a457ec9925aa91f6d3 assets/create/models/item/lime_seat.json +a0843c3731fa3c4d23bc2b91fd68410fcf1df149 assets/create/models/item/lime_table_cloth.json 931d187c11cb95a0eeae8f256187ef551b42007e assets/create/models/item/lime_toolbox.json d0f4148bdb0a905e68f54b5dfd829fd47e528fea assets/create/models/item/lime_valve_handle.json 1d30f9b525e8e9736b34a92f848e235c71fd6bd8 assets/create/models/item/linear_chassis.json 8f622f5f79446f6060d9e8815205fce919c8c829 assets/create/models/item/linked_controller.json -0328f4c819026affcf6c260a610a783433f22da0 assets/create/models/item/magenta_display_cloth.json 538e28af9013a43c258a659cbe67671991f3eee7 assets/create/models/item/magenta_postbox.json ad6fd371ee989c9c3c21e762273e8a4e903f0af8 assets/create/models/item/magenta_seat.json +c50cb6b0285ee3a2b7d7f592ee48672d66e02af3 assets/create/models/item/magenta_table_cloth.json 7c0e3f91e5ab029473736deffb2b2aab9d4763c7 assets/create/models/item/magenta_toolbox.json 6d82582e5afea919927606b20a74cbda5223956f assets/create/models/item/magenta_valve_handle.json a4ecba2ee36699401de661b89065bf0738487a87 assets/create/models/item/mangrove_window.json @@ -2197,9 +2196,9 @@ f80358eba19bc8d1741e4e25753866799631a118 assets/create/models/item/nixie_tube.js 061587faf0e53e4fac0c8f2f3bd6b22020b2a3ee assets/create/models/item/oak_window_pane.json af50363d603d61340b336569d58c1febde253665 assets/create/models/item/ochrum.json 62ec1afee14f9de3f5b02ee930d002a240a3c337 assets/create/models/item/ochrum_pillar.json -0357d442273a13f506451c0711480b1beab1cb33 assets/create/models/item/orange_display_cloth.json 226f99c241b1d8b03d8fc57db32c1bee0721b64f assets/create/models/item/orange_postbox.json 56e7d28824d3fc566b5f551babbe423a550ef08c assets/create/models/item/orange_seat.json +9f122183a1b04ac6346631db4f505e53ed333acf assets/create/models/item/orange_table_cloth.json 96cc543d5afed90a022ece7b8671cd47a9b6fb68 assets/create/models/item/orange_toolbox.json 7e767ca9e0ddb769b38fabd9289648ac63f5413d assets/create/models/item/orange_valve_handle.json 82152bca4310111d91584a2a78f05e158bb4bd90 assets/create/models/item/ornate_iron_window.json @@ -2211,13 +2210,12 @@ c9c7ccdb68de2e77cd9f7053fab19493dd30a985 assets/create/models/item/oxidized_copp f1af7c5f3840efc3ae07940ee6719eb3417a0e1a assets/create/models/item/oxidized_copper_tile_slab.json ef2fe68d407a03bf1ed8f2d2f3e7323777d061bb assets/create/models/item/oxidized_copper_tile_stairs.json b21a1f3ee7de3e17f69d27fd13ae6b23b62aa22c assets/create/models/item/packager.json -a8538df19e47fe37401c9fbedbb867b5d612a51b assets/create/models/item/packager_link.json 5b974e55caffdbfc2156eb8b59dd99db12243bd3 assets/create/models/item/package_filter.json 7fd76e7d2e6c6d94352f1fa08d096b63616ad01e assets/create/models/item/package_frogport.json 76aeceb41bb7df873dbafe1bd5e26deb24abf93f assets/create/models/item/peculiar_bell.json -50bf80632cf4b569b417ca5a18f2706ef35aa8c8 assets/create/models/item/pink_display_cloth.json ab6c05a0468f3f4295a07adb362fa2d36cf6e3e8 assets/create/models/item/pink_postbox.json df13d4281dc45041ecd93504d45daef61d070581 assets/create/models/item/pink_seat.json +d142627de73dc821281d64ab54fe9956936253b4 assets/create/models/item/pink_table_cloth.json 842afb2a345dbaba857e90f7dffa724841ef7b2d assets/create/models/item/pink_toolbox.json 6b85a0da81b2d18fb54eb05e187a2ce8cd7b09eb assets/create/models/item/pink_valve_handle.json 9e8b4c1a0bbcb0ea9b15aec174d8f98b572133d1 assets/create/models/item/piston_extension_pole.json @@ -2287,12 +2285,13 @@ a06275da5e5cec7c17edaae8b5a693a3eeff2fe2 assets/create/models/item/powered_latch a1c6fd9b035eed7de732f4080cedaa118a2bc559 assets/create/models/item/powered_toggle_latch.json bd70b798ca9f73f4e5aabc30e286487f5363122e assets/create/models/item/precision_mechanism.json d9a736e7a6fc70e0848de3e318c739d58b1e563f assets/create/models/item/propeller.json +34c09fb1eb46ed362aa384958c2ad2cc96688abb assets/create/models/item/pulp.json 9b41eec5759887be9bae3d27654bf478a7eff676 assets/create/models/item/pulse_extender.json ea76bd3bd9e5bea4d64d91347d473b538e926b02 assets/create/models/item/pulse_repeater.json 6ff9ce0cc633ea39b779b2e873a1d0fd7cfe7119 assets/create/models/item/pulse_timer.json -a9a62a4f51e71abd935f0afc025689f20c81830c assets/create/models/item/purple_display_cloth.json 8496f6c5449a70eef12e9c68ba46eee2f365fb77 assets/create/models/item/purple_postbox.json 7e165f83266edf34bb03fa3e8d2a83d44829c10a assets/create/models/item/purple_seat.json +0d688a25e03c9f0e7059998a44a5be31e570a04d assets/create/models/item/purple_table_cloth.json d75c4969334f2ee1ae4a3d8ac28b001735c76b97 assets/create/models/item/purple_toolbox.json ebffb05119f499fcec051a4337aadc47654baed2 assets/create/models/item/purple_valve_handle.json f91405b9aec1e0142c1b90582e03a1973251da05 assets/create/models/item/radial_chassis.json @@ -2302,10 +2301,10 @@ f91405b9aec1e0142c1b90582e03a1973251da05 assets/create/models/item/radial_chassi 9dc6c52e258b00cac6ed23147983045c43218b5d assets/create/models/item/redstone_contact.json f8f733364bdd32b2ad597e81103bc02344ce63bd assets/create/models/item/redstone_link.json ae0ba4827a81bd51c5c01178c2ccdae3a722628a assets/create/models/item/redstone_requester.json -2a42d190811be5ab90b35935c8b69be409944061 assets/create/models/item/red_display_cloth.json 4b73ee9cc2651a3d1a97476d100f9c4d7e2b2efe assets/create/models/item/red_postbox.json 8d00eb1a10055a802556eab10e13f522d12acd1c assets/create/models/item/red_sand_paper.json b64a054c92cbd2e055502d470f3921d1077e63a1 assets/create/models/item/red_seat.json +359d9bdb2496140e297a1e5a98c9563bc09d56b9 assets/create/models/item/red_table_cloth.json ac4695cc465d094b4adba1a4e9efec42c916f37d assets/create/models/item/red_toolbox.json 02473f42ef4b53dc809c7c58ae657c014bfaf652 assets/create/models/item/red_valve_handle.json 9926bbe6dad7c4c1a146492116d232e941c80d2b assets/create/models/item/refined_radiance.json @@ -2401,6 +2400,7 @@ b82ab0c69df330f6f938ed1beee7b4add67d2e50 assets/create/models/item/steam_engine. 54f200be903e056e5cf9e2186f0a0a51f8f0f84e assets/create/models/item/sticker.json 0f88de164439640cc175ceef2017f7416b5a7018 assets/create/models/item/sticky_mechanical_piston.json 4b640b66765b206f8c2884b7c1a1ef860b81d841 assets/create/models/item/stockpile_switch.json +c04a4ef6debb04d305d74d9b034c1e95c6b9e956 assets/create/models/item/stock_link.json 67c98c6c7f2122850acfbee34688572934fdd226 assets/create/models/item/stock_ticker.json 6ee792277b9fd980c40e18e841afa63fc500ed0b assets/create/models/item/stressometer.json 8d4ce1ccf180016506292f63188c10d0dabe0ee3 assets/create/models/item/sturdy_sheet.json @@ -2460,18 +2460,18 @@ dadc7b65a4527e288c21a20df978796a8c444fd2 assets/create/models/item/waxed_weather 79431edb868e6560f4f6d5b3441c0176c7699f5e assets/create/models/item/weighted_ejector.json 0fd2214cdff8a92e05d9d5ee888329b3235143c0 assets/create/models/item/wheat_flour.json aacced59d21212090d508a9684bb46c9472a8a2f assets/create/models/item/whisk.json -c9ea8eac03920449cca3646f5c524a5634825a4a assets/create/models/item/white_display_cloth.json bcf3104e463ec212dc239281033e4e80d78e1d74 assets/create/models/item/white_postbox.json 4e112e82185e2c1a5c57f5a94fa11c59c92cef0d assets/create/models/item/white_sail.json 17ed8ac7d745117f622190a46c5e1b42892afc29 assets/create/models/item/white_seat.json +0fa9208df662c018499902e3aeddf1bbec16c3db assets/create/models/item/white_table_cloth.json 432040f39177ab3df6003df24e818c73e28cf754 assets/create/models/item/white_toolbox.json 8ba8a6d4baf98f0f037f83b4b704f75a8d46a26e assets/create/models/item/white_valve_handle.json bccccbdfa5d376936e123defa44f2907dc317617 assets/create/models/item/windmill_bearing.json 47c6ad1c146366156a0ec4bc1cbf74282784698f assets/create/models/item/wooden_bracket.json 6c08d2fa59e56e4848063ab6f3e45894b89f1744 assets/create/models/item/wrench.json -f185d037ab7d78d72b9e3e96a09fb510766dd021 assets/create/models/item/yellow_display_cloth.json 3a899db3044ee39ac5d6385c16630733e00f77ca assets/create/models/item/yellow_postbox.json ac59f141cd3c3f7e57a794e542d6e22bf8ebb8f9 assets/create/models/item/yellow_seat.json +1f9f7c6102a0c5e1a6e50a6ac67858009a13153f assets/create/models/item/yellow_table_cloth.json 532a429d58a177f61b4d67180db7676fa7536052 assets/create/models/item/yellow_toolbox.json 2c87ef8a26a01a17b2f3799d62cb27cf1107d061 assets/create/models/item/yellow_valve_handle.json bcf63b7198d31d3a94b2566171b7e3e84464601c assets/create/models/item/zinc_block.json @@ -3141,25 +3141,25 @@ c96b1b147139c9d560e9d1e1dd9a726ebb771329 data/create/advancements/recipes/misc/c 004b31d1be78dbc4be60f4fd0879065f1a685518 data/create/advancements/recipes/misc/crafting/kinetics/red_valve_handle_from_other_valve_handle.json cf2920d4d27c40fe71dd8954225e7f2a38ba2a4f data/create/advancements/recipes/misc/crafting/kinetics/white_valve_handle_from_other_valve_handle.json 54bf51dcbdd86635e68d366cb4130f65b9c0fe4a data/create/advancements/recipes/misc/crafting/kinetics/yellow_valve_handle_from_other_valve_handle.json -a501bbd0abff4598f34d495eeffd94613c0064d5 data/create/advancements/recipes/misc/crafting/logistics/andesite_display_cloth_clear.json -c00e4c692567f91c5ef380e90b12d32736054b90 data/create/advancements/recipes/misc/crafting/logistics/black_display_cloth_clear.json -33b76b320e6616a1fafa9ffd657a0fcd9e440020 data/create/advancements/recipes/misc/crafting/logistics/blue_display_cloth_clear.json -019e153032c23d084c0ba895f7cbb3cbcca22244 data/create/advancements/recipes/misc/crafting/logistics/brass_display_cloth_clear.json -d32efca29bad2187e1e85e70151a3e1618515bfd data/create/advancements/recipes/misc/crafting/logistics/brown_display_cloth_clear.json -66c9b974fe53972fd5b21cf9caf2cade2c90f139 data/create/advancements/recipes/misc/crafting/logistics/copper_display_cloth_clear.json -2198a82b90ff0a36a26e07bdd0059a7c17f03a58 data/create/advancements/recipes/misc/crafting/logistics/cyan_display_cloth_clear.json -f52574e38859c3c127bc494d0f3cd24a9bba51d3 data/create/advancements/recipes/misc/crafting/logistics/gray_display_cloth_clear.json -a96284d88f49031789673218944bb75101b61f04 data/create/advancements/recipes/misc/crafting/logistics/green_display_cloth_clear.json -d911ec729abbb1156147b4d2c98b6b7af5123ce2 data/create/advancements/recipes/misc/crafting/logistics/light_blue_display_cloth_clear.json -3f6cb7e6fecf4eedbe2eac017490975ac656dddf data/create/advancements/recipes/misc/crafting/logistics/light_gray_display_cloth_clear.json -c270d53142e7b20c0046fc4f13049df167ac6243 data/create/advancements/recipes/misc/crafting/logistics/lime_display_cloth_clear.json -af8e9d0c3089d353ac5248a168d898f7cf9ee32e data/create/advancements/recipes/misc/crafting/logistics/magenta_display_cloth_clear.json -6997ad3851e60d99f1101b4e6e73b926feb1643e data/create/advancements/recipes/misc/crafting/logistics/orange_display_cloth_clear.json -ff3fb1fecfb2a8160c7886a6eeadd51bb1a82e62 data/create/advancements/recipes/misc/crafting/logistics/pink_display_cloth_clear.json -44ba6084e51437f569c2224efdc47fced328cc2b data/create/advancements/recipes/misc/crafting/logistics/purple_display_cloth_clear.json -b1422a67e7f922c999dd0415ec2492812b3242bd data/create/advancements/recipes/misc/crafting/logistics/red_display_cloth_clear.json -1a4df897a12d2fb167158ad9e60673cb6c528c2f data/create/advancements/recipes/misc/crafting/logistics/white_display_cloth_clear.json -bb7e5808222945e6cc8363f6c97602ef6368ab84 data/create/advancements/recipes/misc/crafting/logistics/yellow_display_cloth_clear.json +b60b14d473fc8a841be668e98303f07779916637 data/create/advancements/recipes/misc/crafting/logistics/andesite_table_cloth_clear.json +5e50ee44a3316eb23bbd8f0164c17d5719ab707c data/create/advancements/recipes/misc/crafting/logistics/black_table_cloth_clear.json +b6ce89f748f35694cf2fd4c79693b3a8f3dba864 data/create/advancements/recipes/misc/crafting/logistics/blue_table_cloth_clear.json +2aeabffefd6e7a963e61288b632961783ce9ab69 data/create/advancements/recipes/misc/crafting/logistics/brass_table_cloth_clear.json +a8a4ef79d02e1903464fff524bcbb63b424681ea data/create/advancements/recipes/misc/crafting/logistics/brown_table_cloth_clear.json +a613cb47dd2a7cf5cf2f7b6bd8031f59e6bc554a data/create/advancements/recipes/misc/crafting/logistics/copper_table_cloth_clear.json +e44912e563d11cb42bf45ab668e81c66845725d1 data/create/advancements/recipes/misc/crafting/logistics/cyan_table_cloth_clear.json +13b4e81dcaa87e9862180f10b239de43bf1d1dc8 data/create/advancements/recipes/misc/crafting/logistics/gray_table_cloth_clear.json +df90265b1aba8f4c49564dce7e04609cf65ddba5 data/create/advancements/recipes/misc/crafting/logistics/green_table_cloth_clear.json +05c7735e280b2be640084fecc3724c41544805fd data/create/advancements/recipes/misc/crafting/logistics/light_blue_table_cloth_clear.json +5ee045df398bb091467f5b18df7d8b322ed43c23 data/create/advancements/recipes/misc/crafting/logistics/light_gray_table_cloth_clear.json +ad99b5d2213c5a9d00f4719e4aaaca4215e8191b data/create/advancements/recipes/misc/crafting/logistics/lime_table_cloth_clear.json +97ca5d009fb727f770d3c3d74756eeb571f084b7 data/create/advancements/recipes/misc/crafting/logistics/magenta_table_cloth_clear.json +33cbf02d26d008cd7b261d729aed1e5fcce0cb6e data/create/advancements/recipes/misc/crafting/logistics/orange_table_cloth_clear.json +e23d1bf1143d08074df53d9a07ea0c5304f63271 data/create/advancements/recipes/misc/crafting/logistics/pink_table_cloth_clear.json +b9be0a58a604965048084487294b4c1b9ce0f745 data/create/advancements/recipes/misc/crafting/logistics/purple_table_cloth_clear.json +0d8c16e085d8f869237fdfb428d29ece096a3291 data/create/advancements/recipes/misc/crafting/logistics/red_table_cloth_clear.json +c1768fde21268bb1b035c63b5e9fba81526de83c data/create/advancements/recipes/misc/crafting/logistics/white_table_cloth_clear.json +ccb8f3871eb044360b597ff02ea78896050c3760 data/create/advancements/recipes/misc/crafting/logistics/yellow_table_cloth_clear.json 706a4da01ddbd9c3db4d3183ffdcd602a558a5cd data/create/loot_tables/blocks/acacia_window.json a7b37cec417ec9f9095e2ae11c990e4906d6af0e data/create/loot_tables/blocks/acacia_window_pane.json 5eee4b2702e432e03b1f46c6f1573ceee67b131f data/create/loot_tables/blocks/adjustable_chain_gearshift.json @@ -3168,7 +3168,6 @@ a7b37cec417ec9f9095e2ae11c990e4906d6af0e data/create/loot_tables/blocks/acacia_w aaaedbe325d5358d10e15389009dbf7fbf9bc637 data/create/loot_tables/blocks/andesite_bars.json d46459cf38853767c34bda3909f24370f2d6943d data/create/loot_tables/blocks/andesite_belt_funnel.json 3086cbf5ae5034d23ddd6c057d113736cef40516 data/create/loot_tables/blocks/andesite_casing.json -c0fe0077dbc4f204524fda795c225af0ac8f7bea data/create/loot_tables/blocks/andesite_display_cloth.json 58e150c67c259f5460e5c5dd5cbf6e4cf7299d69 data/create/loot_tables/blocks/andesite_door.json 9a5be1db8d171e74d256ad3326004452bf86a07b data/create/loot_tables/blocks/andesite_encased_cogwheel.json 4b71486ad67bc07dbae4fed50fb12d0a08d40841 data/create/loot_tables/blocks/andesite_encased_large_cogwheel.json @@ -3177,6 +3176,7 @@ ac6b9e99a900f203f69c5127cc44c0de48b0d946 data/create/loot_tables/blocks/andesite 1d9b959e0a6b965fef70136c2988e37c94f58b9e data/create/loot_tables/blocks/andesite_ladder.json 93e40b5e41c32af364a4636989a72ef7901e6bd6 data/create/loot_tables/blocks/andesite_pillar.json 191c341be37299e8ab0d692eb3a185188157ebdf data/create/loot_tables/blocks/andesite_scaffolding.json +d3a343785cc9e9ac0e9d2309ef4203121c9ab385 data/create/loot_tables/blocks/andesite_table_cloth.json 1c6f1dd9ec49b7db86e43706e940208b51e0f6d5 data/create/loot_tables/blocks/andesite_tunnel.json d408536459078c1d72770b7431137d7d8d8ff3bb data/create/loot_tables/blocks/asurine.json 3129cb3d97d657bf16ea5973b3bde1e31ff054c7 data/create/loot_tables/blocks/asurine_pillar.json @@ -3186,19 +3186,19 @@ d408536459078c1d72770b7431137d7d8d8ff3bb data/create/loot_tables/blocks/asurine. d964b7a8f6a4ce28ce640d31a01e77eafcc181e5 data/create/loot_tables/blocks/belt.json a268eb02c10015a901a6543595b2b815a8026d78 data/create/loot_tables/blocks/birch_window.json 43d16eae230de501c528f4e9af666f72a081ed29 data/create/loot_tables/blocks/birch_window_pane.json -ce69fa46ae674bf52b428e7193643deba9587a32 data/create/loot_tables/blocks/black_display_cloth.json 4aec2374e76dfa5535fe22b1fc02b4b2d453217d data/create/loot_tables/blocks/black_nixie_tube.json 6ed685605e24af5c6ff5d797dde8492069427b76 data/create/loot_tables/blocks/black_postbox.json 7ce6dd2c0d02eb1b56ec441044dfc608ea6bcb41 data/create/loot_tables/blocks/black_sail.json 2449b8c173fbbc2a96e0b8d1996d72fb60527e64 data/create/loot_tables/blocks/black_seat.json +2ac4a51540f596ddb81f9fa1b72bcc02c3a6b1fd data/create/loot_tables/blocks/black_table_cloth.json 2d33e25b2741f634bbd6cd77b31c17dd94511d94 data/create/loot_tables/blocks/black_toolbox.json f911ac185cd48afa2393d24f28a688936a9fa147 data/create/loot_tables/blocks/black_valve_handle.json eee41c02c8cfcdb56f31e74fc266783b785bea9d data/create/loot_tables/blocks/blaze_burner.json -4534238bd7e514f0f00cb44cd86f7ea027f405de data/create/loot_tables/blocks/blue_display_cloth.json 247d12823eed3b9248003aca8e3ead87972ac61e data/create/loot_tables/blocks/blue_nixie_tube.json 76217732c9bddf77b7de735b4380d9f92adca9b3 data/create/loot_tables/blocks/blue_postbox.json bb9d906a97810ed1461ed321ef8e4bee1dd104fb data/create/loot_tables/blocks/blue_sail.json 833fe6bc3020055dd0d6f46b324cbe27b248708d data/create/loot_tables/blocks/blue_seat.json +2b7aa6506e02be7a7b76228bc16bf05d0920195e data/create/loot_tables/blocks/blue_table_cloth.json 9d22716d9d846dc9587e327dfcdf18dd5955f826 data/create/loot_tables/blocks/blue_toolbox.json 6d7ecb10e21b1e12c83c71736f14cbba3ccd7aaf data/create/loot_tables/blocks/blue_valve_handle.json 53e01f63aa47aa00575240ccdf867b4d6c392385 data/create/loot_tables/blocks/bound_cardboard_block.json @@ -3206,7 +3206,6 @@ bb9d906a97810ed1461ed321ef8e4bee1dd104fb data/create/loot_tables/blocks/blue_sai 64a5869c6b3edeca06771f8ef64ef9521d83302a data/create/loot_tables/blocks/brass_belt_funnel.json 78ecee2c9baf6b0c78f6c7aa692e102a3f4dda74 data/create/loot_tables/blocks/brass_block.json d45666afba904c2f3fdcfe78a4d22f0ab98efa5d data/create/loot_tables/blocks/brass_casing.json -c6f6defa8fe799c8a5123bec0a96b77b94f3d81d data/create/loot_tables/blocks/brass_display_cloth.json bb07dcb6f4f1e01b85a00ab0fdfb27100e8a5622 data/create/loot_tables/blocks/brass_door.json ac59fa67bd9bc003afc50202d0ca576a9b0a2957 data/create/loot_tables/blocks/brass_encased_cogwheel.json cecada7e520f41c014929136b53509b9b75c2dfd data/create/loot_tables/blocks/brass_encased_large_cogwheel.json @@ -3214,12 +3213,13 @@ e466a397f84957616f7e83954db2050355f052c9 data/create/loot_tables/blocks/brass_en 7b79b14f64108cd8a734f95dd8c721830b48ac82 data/create/loot_tables/blocks/brass_funnel.json 8d58d4c771843950a14fd7b800a05736c1fc88d9 data/create/loot_tables/blocks/brass_ladder.json 429d524c9848b44d19028126f0efd678e0c4b680 data/create/loot_tables/blocks/brass_scaffolding.json +ce1aa8d4b40ba0d0898c552811f1a6f7e94879a5 data/create/loot_tables/blocks/brass_table_cloth.json af90102bfe0e3a14bf1330cddec553f27b8fba89 data/create/loot_tables/blocks/brass_tunnel.json -3411fafe31f602d71a5ff7c220e66fc25b66a548 data/create/loot_tables/blocks/brown_display_cloth.json d391cff5b741fd6ddf5b6fa64e05526eb3a9f0d9 data/create/loot_tables/blocks/brown_nixie_tube.json bfa0365507a888134c20b36af4bd7944263687f0 data/create/loot_tables/blocks/brown_postbox.json 862bd3ceed05ea45c03911bb8403817b73c4bc38 data/create/loot_tables/blocks/brown_sail.json 6ddbdd489120be56f50272c86ecdb886afa3a8e4 data/create/loot_tables/blocks/brown_seat.json +0aa66846a1b29feda9c63b9364860c4c75eaf2e4 data/create/loot_tables/blocks/brown_table_cloth.json 588ae3d0da73eed3bc30cb28c583e7f8312d15bd data/create/loot_tables/blocks/brown_toolbox.json 7c7cf4c30786f6e0a699e2b3f9120343e53107f4 data/create/loot_tables/blocks/brown_valve_handle.json 06d1c478e4236210aa12b5911691868fef33bb5f data/create/loot_tables/blocks/calcite_pillar.json @@ -3240,13 +3240,13 @@ f2058ad809606d54123c7efbad2a6b995ed1defe data/create/loot_tables/blocks/controls 639d3d5bbbc452b2c4d170cf005dce9b3bcff26c data/create/loot_tables/blocks/copper_backtank.json fa0856e11351ad0882de2066569807e782071881 data/create/loot_tables/blocks/copper_bars.json 5f48b688829ca7849997d88697cff2de1ede4804 data/create/loot_tables/blocks/copper_casing.json -8a8fb6ef3420d7da95711af8df572a784ad5805c data/create/loot_tables/blocks/copper_display_cloth.json 0937b9f634b86dbe41e07eda52c69993fce60fb5 data/create/loot_tables/blocks/copper_door.json 8ed70d812f38adfa147db07a4f2bbe206a69ad20 data/create/loot_tables/blocks/copper_ladder.json ac621731ca23e6fbb1003be59edacdf837dbc37e data/create/loot_tables/blocks/copper_scaffolding.json 9be387731859ccc3aec7701c1804ddc3c5dde216 data/create/loot_tables/blocks/copper_shingles.json be31f0c68bfe80dff88959bd30ef9a9080dd3b3b data/create/loot_tables/blocks/copper_shingle_slab.json 83ae2652a2df217730d6fb34a65c3962e82a961d data/create/loot_tables/blocks/copper_shingle_stairs.json +f6a29868a011d9ad73bc29be94ec2a07a2626323 data/create/loot_tables/blocks/copper_table_cloth.json 9cb359c96543d7421250c4ef4e83a5e170974efb data/create/loot_tables/blocks/copper_tiles.json adbe83d6bf88dd7d2b0b8788bb619cedd37f59d9 data/create/loot_tables/blocks/copper_tile_slab.json 1e06f16b1fa8e78af5cbfc90ba8ff1136de83d2d data/create/loot_tables/blocks/copper_tile_stairs.json @@ -3376,11 +3376,11 @@ d9552e3e9f4de0e09df8ca9446066e94c6e2c681 data/create/loot_tables/blocks/cut_veri 009186ed0efe29a229a28cfd913bc02ddad217d4 data/create/loot_tables/blocks/cut_veridium_slab.json 4845f7127921c7dd93a59118e63c37107d6c2061 data/create/loot_tables/blocks/cut_veridium_stairs.json b56caea031d637321eddfd5d122fc357d2c2e49c data/create/loot_tables/blocks/cut_veridium_wall.json -cb4f82249ddd6eddb920b01521326760a9e1d0fc data/create/loot_tables/blocks/cyan_display_cloth.json ffb440a03f5e513b8d20c2725a95dc5c9b84c73b data/create/loot_tables/blocks/cyan_nixie_tube.json 914146303ae7e73c4f9283ea61cd5443f49f5cde data/create/loot_tables/blocks/cyan_postbox.json 8858b4e1b4e51889b2006005585a17e4978ed8e9 data/create/loot_tables/blocks/cyan_sail.json 8dccecb2c87d7421efdfb3fb97ae62b79f0b4411 data/create/loot_tables/blocks/cyan_seat.json +30bfeac6b7766ff1985ce9953f0dd6824f177aef data/create/loot_tables/blocks/cyan_table_cloth.json 66ea2f2cc32d49bb434f83cbd07736d6fbacacf3 data/create/loot_tables/blocks/cyan_toolbox.json 8c7fd26e7bd03916014274e005d69ab8f14df973 data/create/loot_tables/blocks/cyan_valve_handle.json 704a10ef59d052e92b7035406422231b9bb2372f data/create/loot_tables/blocks/dark_oak_window.json @@ -3406,7 +3406,7 @@ d2c9abd9260eb82ea1c2eeae5e2d6abd0b4d3ce8 data/create/loot_tables/blocks/exposed_ f0905ae4c9bdff8fe9e1ab4682a7b1efe2d27d9d data/create/loot_tables/blocks/exposed_copper_tiles.json 6841c02935838f00011d33fc392965326c4dbc5b data/create/loot_tables/blocks/exposed_copper_tile_slab.json 432a047156b93a09b7e027fc34f5680a8f68dc92 data/create/loot_tables/blocks/exposed_copper_tile_stairs.json -2752e8d18bd512fcbab7b6bd1ceab16b5bd5baab data/create/loot_tables/blocks/factory_panel.json +4dd285b35d9b94d48f7aa783e93bdd04d58c4a26 data/create/loot_tables/blocks/factory_gauge.json 3fae2a7a3f133a1d7c76ce91f6c48eab787d6ff6 data/create/loot_tables/blocks/fake_track.json 1d4734d6d9ba039c0dfa2271f08cdb55e35b721f data/create/loot_tables/blocks/fluid_pipe.json 9c112883a3763b2d286d9a5a0980dcea82bcc9e6 data/create/loot_tables/blocks/fluid_tank.json @@ -3422,18 +3422,18 @@ f33d0bdbf35ca5294684b0628419ad11d508a649 data/create/loot_tables/blocks/gearbox. a4c86e5456bbbcc417d736151ac6a15c944d555b data/create/loot_tables/blocks/gearshift.json ffa2776989447e44fa10673986961ab395ebd592 data/create/loot_tables/blocks/glass_fluid_pipe.json 07d8265c285ebb69b9160d516905ae1f17acc87d data/create/loot_tables/blocks/granite_pillar.json -3d1ca8217454367c5a4d0a9eb19d17e455905847 data/create/loot_tables/blocks/gray_display_cloth.json 41feb0f235495384ebca5b6f70d01b6f0c0c8878 data/create/loot_tables/blocks/gray_nixie_tube.json 6f123d5e6612274223ddb695e582abd952d3521c data/create/loot_tables/blocks/gray_postbox.json bd526fc4f0acea571c37b2ecbb7267fee6be29f0 data/create/loot_tables/blocks/gray_sail.json 5e23e2032f92737eaa6e6cfb4c62232566f06e77 data/create/loot_tables/blocks/gray_seat.json +d60c2dfc073632b8488e13190b15436173c9caa4 data/create/loot_tables/blocks/gray_table_cloth.json 6ff8b3e59ea98697b87e71eb64d1e6f7e4631f36 data/create/loot_tables/blocks/gray_toolbox.json aa0d47422e0adc3fb18e5c0eefd25c417ddbf9ae data/create/loot_tables/blocks/gray_valve_handle.json -b924bd4318a953cbf2f1ea14d6735981a33c42e0 data/create/loot_tables/blocks/green_display_cloth.json 4cfbe1bdc89916f78f891b9dbaed461cd838584b data/create/loot_tables/blocks/green_nixie_tube.json e99e3895a19faa928e40fa17fbfbda6d3566b1ed data/create/loot_tables/blocks/green_postbox.json 6c22cf8de05828af7979dc32d9e151297d551fe5 data/create/loot_tables/blocks/green_sail.json fbd61c331d4fda692f0e7174aed5aed3652d3553 data/create/loot_tables/blocks/green_seat.json +b918c78d0c8dabd9a6962e4c441096a12f4f47d1 data/create/loot_tables/blocks/green_table_cloth.json 703a285a5d47fcc13e6775040d45620db2ef5480 data/create/loot_tables/blocks/green_toolbox.json 17cbfa7c5627a2ac92826e349d09509f4722fdef data/create/loot_tables/blocks/green_valve_handle.json 8dfbcb358f008317a0515ca35f3976470ca7c4e9 data/create/loot_tables/blocks/hand_crank.json @@ -3467,36 +3467,36 @@ ae3b9785ae64f1c936cac555505f97774b09fd95 data/create/loot_tables/blocks/layered_ b4882fe056a8d03bddf7a8c4fa70ee06548e1743 data/create/loot_tables/blocks/layered_tuff.json 7f9ea6bfcf8344018866013e12d23edf21f034e9 data/create/loot_tables/blocks/layered_veridium.json 54a876a52655d5c9c33325a7d07c7978d33adca6 data/create/loot_tables/blocks/lectern_controller.json -26d208f411a7c4014731ea3609443a76937dbce6 data/create/loot_tables/blocks/light_blue_display_cloth.json 8a6153a0b5857c77cdac0cffcb22e30ae6181f3a data/create/loot_tables/blocks/light_blue_nixie_tube.json 27bbda185ab99cff4974e6bfc40b72265896ef42 data/create/loot_tables/blocks/light_blue_postbox.json 304072298d4078eca7e0fb8c58ea3144afe246a8 data/create/loot_tables/blocks/light_blue_sail.json a1396be526ef27c6d0f97cdd0f0e61f810e7353b data/create/loot_tables/blocks/light_blue_seat.json +b281c6ff8b383f27bba02e11819ddab13c80a473 data/create/loot_tables/blocks/light_blue_table_cloth.json 0cd56baf9f3c9edb97e4ce892d374e21a099374f data/create/loot_tables/blocks/light_blue_toolbox.json bf4e6c308d82f15689406b5b3e88fe95d49a9a44 data/create/loot_tables/blocks/light_blue_valve_handle.json -f9d90c7c730e15b244bff8cc8155d0e9e555b85f data/create/loot_tables/blocks/light_gray_display_cloth.json 6928acbfcafdfead9750be6760da163b86532054 data/create/loot_tables/blocks/light_gray_nixie_tube.json eb95d1e0abb93d5efecb0809e3901f37021c4dfc data/create/loot_tables/blocks/light_gray_postbox.json 886ef98e4bd60d8860b56441da6928e24f262d70 data/create/loot_tables/blocks/light_gray_sail.json 1ae0ff25ac9468e67ab1847b87a37829328d4c84 data/create/loot_tables/blocks/light_gray_seat.json +e61e9b3e116037c4ad44a7e222e5127e5767ddad data/create/loot_tables/blocks/light_gray_table_cloth.json e22dfadefcea50090efe87136a4b92e6ef20d379 data/create/loot_tables/blocks/light_gray_toolbox.json 3e586bc1281f15e25e75475dd726578ff032c6ae data/create/loot_tables/blocks/light_gray_valve_handle.json c6bb0877c537dda15469934383dc45c608bfd1a4 data/create/loot_tables/blocks/limestone.json 49058a62e1abd34917f983b6bc13cc4353b613a2 data/create/loot_tables/blocks/limestone_pillar.json -0e8e4ef0208fcd1201b9637864a45b86a3dab7a5 data/create/loot_tables/blocks/lime_display_cloth.json 582bb26f6df37d0c2dbe12983ad05fc74f5fb5c0 data/create/loot_tables/blocks/lime_nixie_tube.json ec9d973d218b26d51b82f265603feab31170c619 data/create/loot_tables/blocks/lime_postbox.json 623ac65211a9920325308b55285f78e3b7275751 data/create/loot_tables/blocks/lime_sail.json 7efe69664a781b292f491d5ff89e27dd5991f3cf data/create/loot_tables/blocks/lime_seat.json +10ecd65ecba6b66652dd04a385fc47a44c1f8110 data/create/loot_tables/blocks/lime_table_cloth.json 0f6a465501a445925e9aff7a4c84b3c8e2caa93e data/create/loot_tables/blocks/lime_toolbox.json 1a3ed7cd5660d7ea014956ea642e0b07d89bc297 data/create/loot_tables/blocks/lime_valve_handle.json baf70f9eb579f20b232a2af4e6b00a54f84844e6 data/create/loot_tables/blocks/linear_chassis.json e4c0f8ca822cf7555bd011825b430c3c735160d4 data/create/loot_tables/blocks/lit_blaze_burner.json -fcf106a036e8a4894abf2a5aaf96061c2e5c920d data/create/loot_tables/blocks/magenta_display_cloth.json 6bd8b044cc9c69a5268372e5436f556da2c1bf21 data/create/loot_tables/blocks/magenta_nixie_tube.json 601bc43286b9f6b978ae8681281bf8e195f8211d data/create/loot_tables/blocks/magenta_postbox.json b4d06c9ce7fbec0f23bb6dbc446b77d070f06775 data/create/loot_tables/blocks/magenta_sail.json 300e480d8e43e3a4ca19a92ae1360c02f7c5accd data/create/loot_tables/blocks/magenta_seat.json +64bbc8f91a7b60d86c76e237cb87863f7f7539c9 data/create/loot_tables/blocks/magenta_table_cloth.json 40d2ba0a52eaa2c61900731f0cee2657c5e77c20 data/create/loot_tables/blocks/magenta_toolbox.json 347115d1507997a6f838d222092092ab994db7e5 data/create/loot_tables/blocks/magenta_valve_handle.json 49c68e263386549cc30438d3b3878ec5bbd909cc data/create/loot_tables/blocks/mangrove_window.json @@ -3527,10 +3527,10 @@ fe79cb4cbea87efc84d61d3d31f073bf3c64c73d data/create/loot_tables/blocks/netherit 5dcb11160a51ce17fb06f5fecc14e87d92b1a641 data/create/loot_tables/blocks/oak_window_pane.json 461e9818f41aab34905757a423455cdcee780e67 data/create/loot_tables/blocks/ochrum.json 1259a439286385d5b7c48bff89d0839f1f2e02c2 data/create/loot_tables/blocks/ochrum_pillar.json -1d4bd118086ac49b1d11ac7c4e7ea371d9367388 data/create/loot_tables/blocks/orange_display_cloth.json 3f6940f13ca705bad7cdb9a9b80a3ae84f70f80c data/create/loot_tables/blocks/orange_postbox.json d6323d4b30faa87cd4b5b8b815cb16f78296f203 data/create/loot_tables/blocks/orange_sail.json 119fc4c3055c09c7958ac405925a6b7be2081c6b data/create/loot_tables/blocks/orange_seat.json +24b82ccacdc00d98a660c20384c76927cd8c2948 data/create/loot_tables/blocks/orange_table_cloth.json 54ac8c8166c23f24a8a0870c981ef8ffa64c0b89 data/create/loot_tables/blocks/orange_toolbox.json 30aef2df782b6b35cd16b4c205bb15de85bc0664 data/create/loot_tables/blocks/orange_valve_handle.json f4004c6d16754fc8867ed6618dace8e8f6dcc412 data/create/loot_tables/blocks/ornate_iron_window.json @@ -3542,14 +3542,13 @@ f47a01824093455030fca66e7b8a39bcfc61d219 data/create/loot_tables/blocks/oxidized 4d815b361af81bd0c0e14c853ca54ad3cde66a57 data/create/loot_tables/blocks/oxidized_copper_tile_slab.json d599ef03d1b69e4367ec0dea78f52c1964c99f9b data/create/loot_tables/blocks/oxidized_copper_tile_stairs.json ab8cee7abd7dd92428bf7d8f0f5edd35082401a4 data/create/loot_tables/blocks/packager.json -e5df1b8ead9e575ed06f2040a7c9cc72c7a71b49 data/create/loot_tables/blocks/packager_link.json 54aa9700df601640b705d912abe773d5b6ee2b1f data/create/loot_tables/blocks/package_frogport.json 58bd9fe9d6706998bfbda3b077cfd0a740972091 data/create/loot_tables/blocks/peculiar_bell.json -95c91b99c769a67ef8558c787b23fa8e8796f2a5 data/create/loot_tables/blocks/pink_display_cloth.json 4d7724df6fefee4512c4f7886d0e103d1dc39510 data/create/loot_tables/blocks/pink_nixie_tube.json df7b12349c64d035eb563535b03cb70d780c5a71 data/create/loot_tables/blocks/pink_postbox.json 85811771fbc36f645fdb9f510639715399503c99 data/create/loot_tables/blocks/pink_sail.json 9a5652002131d14c585a6e434a4457ef36d2f60d data/create/loot_tables/blocks/pink_seat.json +23e3176e0511b3910b9dcefa1821af9c9acfa34b data/create/loot_tables/blocks/pink_table_cloth.json 23e28971460b2a3b8b39412a4778672d7ced4af7 data/create/loot_tables/blocks/pink_toolbox.json e234842b7d2334b77d02e383908795f0714b21a2 data/create/loot_tables/blocks/pink_valve_handle.json 175735e4a055945df59fb6206ef1a6ebf8ca3e8f data/create/loot_tables/blocks/piston_extension_pole.json @@ -3619,11 +3618,11 @@ fbc433a7e8518860bc828a52b56dba92e4dff66c data/create/loot_tables/blocks/pulley_m e654e6cedc0373e97caea947e7e605bc4095da88 data/create/loot_tables/blocks/pulse_extender.json 422385f062dd63edaf246c42fb0e617e92e6cc44 data/create/loot_tables/blocks/pulse_repeater.json 93f0c41aedaa2b9baceda78b93a4b3198962e3f9 data/create/loot_tables/blocks/pulse_timer.json -f927369a17c144539d2eb18c7627aefed7d1ab3e data/create/loot_tables/blocks/purple_display_cloth.json 6f453ea136098a5872aeb4e2ad1e5b78d2fd571f data/create/loot_tables/blocks/purple_nixie_tube.json 53e964048baa1b98877a559e8fda6c8f367d5cd6 data/create/loot_tables/blocks/purple_postbox.json c6b7a02db55cf0824a48156adf469c478dfd6a8d data/create/loot_tables/blocks/purple_sail.json 73cd7cc36fafb491666d2bccf1b4f24624b3c8f2 data/create/loot_tables/blocks/purple_seat.json +b4746e296f4bf63778e40a751b4c7fa8be45d21d data/create/loot_tables/blocks/purple_table_cloth.json 147086b9db173aed1b25d9460d0135708dcebcf9 data/create/loot_tables/blocks/purple_toolbox.json 0354f88c3e1d0b6580b9a23d23752dcd9b86fc31 data/create/loot_tables/blocks/purple_valve_handle.json 9e5e841d9f9a00d560ed17a7e197dc56bae334b7 data/create/loot_tables/blocks/radial_chassis.json @@ -3632,11 +3631,11 @@ f76e5a157d2aeab5708f464b1f3c8e47b3855f18 data/create/loot_tables/blocks/raw_zinc bbc2d61eeea335f8f011d799ef6a5484ca027640 data/create/loot_tables/blocks/redstone_contact.json 4fa70deeac7e56121e42fb602dfa27ee1727f749 data/create/loot_tables/blocks/redstone_link.json efc3a5595e4daf67fa43f84c9869dfc76fd6fca4 data/create/loot_tables/blocks/redstone_requester.json -04f7282a470bad6803e9cba54cd70a21d7c6096a data/create/loot_tables/blocks/red_display_cloth.json a50e1c28af16e9f1b4f48aa974461167139768a7 data/create/loot_tables/blocks/red_nixie_tube.json f36f1e69e4fb8723238f81aadbac892f54b5ac62 data/create/loot_tables/blocks/red_postbox.json 977d724cddf8eba053a3310ad0d30af15199bbed data/create/loot_tables/blocks/red_sail.json 9aedede893e2127a1cdd17695699397d8d5c6ce5 data/create/loot_tables/blocks/red_seat.json +09796bc3be977e17927d0a9e32bff2982618e844 data/create/loot_tables/blocks/red_table_cloth.json 9713071cab536e8c1550a6309dc4563fecc2c4e0 data/create/loot_tables/blocks/red_toolbox.json 17d75711f4ef5d76aa931175364642732fb0c60d data/create/loot_tables/blocks/red_valve_handle.json 632067fe6309e31e78637eb0272209b630750242 data/create/loot_tables/blocks/refined_radiance_casing.json @@ -3727,6 +3726,7 @@ cae1bd9100b62841e260880faa80e2442f44a141 data/create/loot_tables/blocks/steam_wh 0bc3fdde351129e3a261a2420aff9d3f063c235e data/create/loot_tables/blocks/sticker.json 074f526902cb5fcff2129614428aba1ea05a6649 data/create/loot_tables/blocks/sticky_mechanical_piston.json a7332324e63f7d28621ddfbd54eb3d091461d890 data/create/loot_tables/blocks/stockpile_switch.json +af312881ec9bfb0902438f53c5cac020244bdba2 data/create/loot_tables/blocks/stock_link.json f4fa9bb255348dc79dcc0468b3beb9ad075eb036 data/create/loot_tables/blocks/stock_ticker.json b13496b1b4bc0be30605832e23894fb374dd796e data/create/loot_tables/blocks/stressometer.json 6a7df4d2730d57ae6e404b4bc8e01367e5ddbf07 data/create/loot_tables/blocks/tiled_glass.json @@ -3778,20 +3778,20 @@ f309ffd94dfb3591efd2fab337a871a0ceff1084 data/create/loot_tables/blocks/waxed_we d6862dc9f7d291df618fbce71eebf613711a5517 data/create/loot_tables/blocks/weathered_copper_tile_slab.json 57d5065d53016e4b1ef0fbad9b84605b1546bcc4 data/create/loot_tables/blocks/weathered_copper_tile_stairs.json f6ba0623b4bcea2f3796df4c65c494fc072d2c21 data/create/loot_tables/blocks/weighted_ejector.json -96a2ad84099368f22ded8896270ddeee1f977772 data/create/loot_tables/blocks/white_display_cloth.json 978263272f632ed79a61d52a0080de0b7b8102d6 data/create/loot_tables/blocks/white_nixie_tube.json 3d8a4d4a9634d49b20f65ebcdddaef2d0f21b36b data/create/loot_tables/blocks/white_postbox.json 129c6772c1c12271f9b0d41c77f41ce34fc437b1 data/create/loot_tables/blocks/white_sail.json 84c79bc47b4a74021e91745356bb24fe02402209 data/create/loot_tables/blocks/white_seat.json +cda45c1338e6c9078a107e99c70690fe3e0aa7c2 data/create/loot_tables/blocks/white_table_cloth.json 3c63263c9fb642e34a0a67af4cab2d4348d661c0 data/create/loot_tables/blocks/white_toolbox.json 2fae4331c0ab590aef542cf4e23deea579d734f8 data/create/loot_tables/blocks/white_valve_handle.json bf0ea5c6957a43b6c4b1914df70e0b8f6585e638 data/create/loot_tables/blocks/windmill_bearing.json ed989d41a4b640dc1ffb15c9c0712ee3172d408f data/create/loot_tables/blocks/wooden_bracket.json -e9adb779fd81f12bb8946c40c0ffdcc86fc36e4a data/create/loot_tables/blocks/yellow_display_cloth.json d9f853e662b004b6ffdbb82af99ad7e774698178 data/create/loot_tables/blocks/yellow_nixie_tube.json a536699cab16540eb906e0b63a2c5064244c7b6c data/create/loot_tables/blocks/yellow_postbox.json 0ead61521fec15522633d6cfdeb77150bb30d075 data/create/loot_tables/blocks/yellow_sail.json 3ae6d4e380237face57b9187ab8570967226b3b1 data/create/loot_tables/blocks/yellow_seat.json +573457c5bb1a8693f4b877620468703c86051a3a data/create/loot_tables/blocks/yellow_table_cloth.json 11b10beba7a6842ce3d01ea4210bff7d3aa6ab94 data/create/loot_tables/blocks/yellow_toolbox.json b9648ec56e55fe2b9d54adf172405519a46bfa66 data/create/loot_tables/blocks/yellow_valve_handle.json 8be474a69469561dfe759159a40fb135a6ad5de6 data/create/loot_tables/blocks/zinc_block.json @@ -3903,25 +3903,25 @@ b04c1cebcfbcf44c4ced04252f54dbfeb8f9ff12 data/create/recipes/crafting/kinetics/w 48c9e3b9f5a8a0f598ab0f57cd8936724337bf1f data/create/recipes/crafting/kinetics/yellow_seat.json 75633a46c374230fab4096a45628b42d6012627d data/create/recipes/crafting/kinetics/yellow_seat_from_other_seat.json 2be097bb4f1e47a6b3a4a6f0ef222dffe31a1e22 data/create/recipes/crafting/kinetics/yellow_valve_handle_from_other_valve_handle.json -71f4965e15eb26147dc40956e91e08d1ef06a21a data/create/recipes/crafting/logistics/andesite_display_cloth_clear.json -82ba5c0a85e81cebce21659ede405a746756f1e2 data/create/recipes/crafting/logistics/black_display_cloth_clear.json -7816be94db3c463af44159458bf27aab678e6100 data/create/recipes/crafting/logistics/blue_display_cloth_clear.json -01518769395fc7abe47a9ff12c68ca3b30b68e04 data/create/recipes/crafting/logistics/brass_display_cloth_clear.json -ce28b0be98db49bc5fe89d731e4db996efe1fe88 data/create/recipes/crafting/logistics/brown_display_cloth_clear.json -5135b71f945a983e6db42c70f4d189a9f592643e data/create/recipes/crafting/logistics/copper_display_cloth_clear.json -5b7939c63ad42eab794684719f10483cec58bc52 data/create/recipes/crafting/logistics/cyan_display_cloth_clear.json -1078d48b6c7f16c891d69ed594ec41a3ba8929a2 data/create/recipes/crafting/logistics/gray_display_cloth_clear.json -5ca021d16b79c3fa4acb71c9b79abbdd36ad59ae data/create/recipes/crafting/logistics/green_display_cloth_clear.json -e5ab1348ccb2a9365f5943b88d8cffe2d7071a74 data/create/recipes/crafting/logistics/light_blue_display_cloth_clear.json -c902db7f0ff484d6a7889eacf04f2b959bdab3c2 data/create/recipes/crafting/logistics/light_gray_display_cloth_clear.json -1d8cfcef76a8790077237402b988796d9d97c925 data/create/recipes/crafting/logistics/lime_display_cloth_clear.json -d0499cf74efc8dd7d05c3850f91ce160b4a955bc data/create/recipes/crafting/logistics/magenta_display_cloth_clear.json -5a3b9155cc4cb3740bd77ceb549b48262ee3cc7a data/create/recipes/crafting/logistics/orange_display_cloth_clear.json -c8b24e9c30de8ebb5f3fd310ff077a40bfc1e80c data/create/recipes/crafting/logistics/pink_display_cloth_clear.json -a9ff41f876867767ad4c9220d9a39d1edc656c82 data/create/recipes/crafting/logistics/purple_display_cloth_clear.json -6e0e19929c5ef41bf904561791eabf3eae9d47fa data/create/recipes/crafting/logistics/red_display_cloth_clear.json -00419f83d19d15f39cdf8b8b50695016043fcd0f data/create/recipes/crafting/logistics/white_display_cloth_clear.json -d382e3818b79a3911555d371c86b8b8f923df682 data/create/recipes/crafting/logistics/yellow_display_cloth_clear.json +113186f64e29efebd628fe3d88ae69f1ef0537f0 data/create/recipes/crafting/logistics/andesite_table_cloth_clear.json +ab88f259eb1ea6767c97969e205241e91c0fe048 data/create/recipes/crafting/logistics/black_table_cloth_clear.json +4002ef4244d7556fc132075d38ceb36e50cf1ed1 data/create/recipes/crafting/logistics/blue_table_cloth_clear.json +45a400f1b48d12af82615eba8bec4cdefb738333 data/create/recipes/crafting/logistics/brass_table_cloth_clear.json +850593663b67399a027d5126593e98109e626fea data/create/recipes/crafting/logistics/brown_table_cloth_clear.json +7c1fa243e64073d435ff2c4117dc04e002abc465 data/create/recipes/crafting/logistics/copper_table_cloth_clear.json +5486c2bc2f263dd901e201bc3bad7015cf9e8d49 data/create/recipes/crafting/logistics/cyan_table_cloth_clear.json +8e04ba7eed8faff3c16e1a841c72d3a778c970f3 data/create/recipes/crafting/logistics/gray_table_cloth_clear.json +2c630a129fe21227412803d42dc3211ec95b1a38 data/create/recipes/crafting/logistics/green_table_cloth_clear.json +1763f06ba76551bf5c4950d50561dd491a3fb86f data/create/recipes/crafting/logistics/light_blue_table_cloth_clear.json +ea87dec016be2987fdc77c82c8ea792f93af3a7b data/create/recipes/crafting/logistics/light_gray_table_cloth_clear.json +468f4c27ac1134484ea81bafbc81055aab86ed21 data/create/recipes/crafting/logistics/lime_table_cloth_clear.json +9dd457949a6f5ff746c974f8fbf5ebbfa151e31e data/create/recipes/crafting/logistics/magenta_table_cloth_clear.json +ed88c2ba5ea1a41e97e80aa97979587945919233 data/create/recipes/crafting/logistics/orange_table_cloth_clear.json +b19c6ae1d968c0966815a78f2c112ea872dc1550 data/create/recipes/crafting/logistics/pink_table_cloth_clear.json +36cefcb804b1806428a6ff33bf4e5408d8f7a07f data/create/recipes/crafting/logistics/purple_table_cloth_clear.json +bddd8bfab2124ea63df317f74d37a6e4b65a583c data/create/recipes/crafting/logistics/red_table_cloth_clear.json +8d292e87ac51ea1f1683d67c53a26601d8b89495 data/create/recipes/crafting/logistics/white_table_cloth_clear.json +655446f2504c7d57d11a893b0c5b1177e4217e58 data/create/recipes/crafting/logistics/yellow_table_cloth_clear.json 44a59669177a5a1b0b0eb7cb3dd46826311f4dfe data/create/recipes/crimsite_from_stone_types_crimsite_stonecutting.json c3f4fd2206f3885904913289761f2b8b758e4c95 data/create/recipes/crimsite_pillar_from_stone_types_crimsite_stonecutting.json e1815f97fbc2786d77f5378a2696e36050d8a1fd data/create/recipes/crimson_window.json @@ -4466,7 +4466,6 @@ f365be4eda73234b73aa49c97b065f1a8baafbf6 data/create/tags/blocks/brittle.json c7ec0dbc18e9c1b58e568ed925287b89df11a136 data/create/tags/blocks/copycat_allow.json 876eb9210f4a14898a2fe6d225699c66b5bdfeef data/create/tags/blocks/copycat_deny.json 7296238b4c6b81251870addce1de8ecda63381dc data/create/tags/blocks/corals.json -7166503de3103541b1db1f697728659f48844496 data/create/tags/blocks/display_cloths.json f675c20350ed60da4878b5d6301f02c8c05624bd data/create/tags/blocks/fan_processing_catalysts/blasting.json 0592b99f657415f6546564ed8efa1fcbef07ba15 data/create/tags/blocks/fan_processing_catalysts/haunting.json 9386dd9a1d234813f9b8ae4ec88866d396aa1d37 data/create/tags/blocks/fan_processing_catalysts/smoking.json @@ -4481,6 +4480,7 @@ f400870b8dbcd14238be3ec99c419093073ba3a6 data/create/tags/blocks/postboxes.json 9bc8c13fd80bdbe7f767b91ee1a1042e9aff02b0 data/create/tags/blocks/roots.json 55dccb895bbdacfbd6ee9005486cd3fe9df01249 data/create/tags/blocks/safe_nbt.json 79418bd729cef417b322cef9b491e7ae83317d61 data/create/tags/blocks/seats.json +8a6ad3c63fb0c436ec8109f39358213930effd5a data/create/tags/blocks/table_cloths.json 5def5088f7fd31b80e6f28c1c4ea146aa9d7d15b data/create/tags/blocks/toolboxes.json 2589b135c0e96ad29076569e144528fe32ea5b39 data/create/tags/blocks/tracks.json 1b6977d9a399cf6ee042e3f8f5e64e4d3cda5489 data/create/tags/blocks/tree_attachments.json @@ -4502,7 +4502,6 @@ f43cac8216e2a9347e48cf93a43de95dd810ca20 data/create/tags/items/contraption_cont d371dfd35e49a7bef19f59c03e7f4ae20992f03d data/create/tags/items/create_ingots.json 910d0f5ccbc4c84b224eca1f1588b1695f41447b data/create/tags/items/crushed_raw_materials.json 0fa526e7e742573b603ad26b09526cf724efa1dc data/create/tags/items/deployable_drink.json -7166503de3103541b1db1f697728659f48844496 data/create/tags/items/display_cloths.json 1cebeb92bd514b75d54ac6d5708047801f0501c5 data/create/tags/items/modded_stripped_logs.json 586f8fc5a8b8559c9dc0017e13c78ad918688fae data/create/tags/items/modded_stripped_wood.json f400870b8dbcd14238be3ec99c419093073ba3a6 data/create/tags/items/postboxes.json @@ -4527,6 +4526,7 @@ e22493305e0cebfb7ededae122e19ee9dd24fc9d data/create/tags/items/stone_types/scor 8034ddb85922b193ad1e6251fc6b856b4ae622b1 data/create/tags/items/stone_types/scoria.json 7e4d20c52a25a0c0d13e0122be0250718a9fb645 data/create/tags/items/stone_types/tuff.json 076c79e07eb3a65d74107577dbfd993b13780637 data/create/tags/items/stone_types/veridium.json +8a6ad3c63fb0c436ec8109f39358213930effd5a data/create/tags/items/table_cloths.json 5def5088f7fd31b80e6f28c1c4ea146aa9d7d15b data/create/tags/items/toolboxes.json 2589b135c0e96ad29076569e144528fe32ea5b39 data/create/tags/items/tracks.json a5b5711d1798473a9b25db5b7f749570ed0a2769 data/create/tags/items/upgrade_aquatic/coral.json @@ -4601,8 +4601,8 @@ c741ba83b562ae3459d7c4f2db69537f549ea411 data/forge/tags/items/tools/wrench.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/dripstone_replaceable_blocks.json 4fffa6fa3be0722121611a1c1393e39cc5281b24 data/minecraft/tags/blocks/impermeable.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/lush_ground_replaceable.json -4cf669239caa93951fd8e243a03e9157d2d06208 data/minecraft/tags/blocks/mineable/axe.json -f816879274e6f561b67f460358e77f6084390d77 data/minecraft/tags/blocks/mineable/pickaxe.json +632b3589bae819777af7129b534f1c10e810cf5d data/minecraft/tags/blocks/mineable/axe.json +276f0a42a366034f24acce80a93b5981c6ec46d1 data/minecraft/tags/blocks/mineable/pickaxe.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/moss_replaceable.json 0c13aae0eeb99e89febe8dbe5e002af2ff843a9e data/minecraft/tags/blocks/needs_iron_tool.json 3cb2a92cbdf32ed5978f740dc378d363306c3e84 data/minecraft/tags/blocks/needs_stone_tool.json diff --git a/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 b/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 index 395042fc01..65f707061a 100644 --- a/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 +++ b/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 @@ -1,4 +1,4 @@ -// 1.20.1 2024-11-01T09:46:44.6761844 Create's Standard Recipes +// 1.20.1 2024-11-05T20:29:59.0953128 Create's Standard Recipes a8cc4af26f6c7c45a9eef12e92af1452fe042454 data/create/advancements/recipes/combat/crafting/appliances/netherite_backtank.json 2c2639c7b307ee7c7a4e97e5efebf496788998ad data/create/advancements/recipes/combat/crafting/appliances/netherite_backtank_from_netherite.json 81dcf0cb1aa99e39bc7d1a386e07cad4cee7d8b9 data/create/advancements/recipes/combat/crafting/appliances/netherite_diving_boots.json @@ -177,8 +177,7 @@ f3e387ae41a55cdb5ff745f40e2ddb5e2595e9b8 data/create/advancements/recipes/misc/c dc61a327753684a0d8a7bcc408d656b53ac633b1 data/create/advancements/recipes/misc/crafting/logistics/brass_tunnel.json 03c367840951af268047c407b15aad52f0b094b4 data/create/advancements/recipes/misc/crafting/logistics/content_observer.json 09454f1d4db813c89a0a2f3af966298fc5f7da7b data/create/advancements/recipes/misc/crafting/logistics/display_link.json -659025bbb47c8acae226198fafbd980d89379e25 data/create/advancements/recipes/misc/crafting/logistics/factory_panel_clear.json -995aa09f4672405984988e445a1d97301c5c4389 data/create/advancements/recipes/misc/crafting/logistics/packager_link_clear.json +02fd978c4f9f3c247710b052486cb498aebce95b data/create/advancements/recipes/misc/crafting/logistics/factory_gauge_clear.json 95b357cbac39acfbc68ac04d0d4681a4d91746ee data/create/advancements/recipes/misc/crafting/logistics/powered_latch.json ef84b382bd4f6ba9558574f2c8e63030813594e9 data/create/advancements/recipes/misc/crafting/logistics/powered_toggle_latch.json c443707391ce79dc1ec8cfacee74757b0c00bd3e data/create/advancements/recipes/misc/crafting/logistics/pulse_extender.json @@ -187,6 +186,7 @@ c443707391ce79dc1ec8cfacee74757b0c00bd3e data/create/advancements/recipes/misc/c 1b50ed47c37e48d1112c76059574eed71ecea4e5 data/create/advancements/recipes/misc/crafting/logistics/redstone_link.json cea78bc9b093a8a6a85ef1df53ddf11d9c37a114 data/create/advancements/recipes/misc/crafting/logistics/redstone_requester_clear.json 831588b3f29411d5c4b358006051152eb2b23e6b data/create/advancements/recipes/misc/crafting/logistics/stockpile_switch.json +972ce787e625ad95588ba1fdd36098173798f198 data/create/advancements/recipes/misc/crafting/logistics/stock_link_clear.json 1e0fc9f4971286a69d9706006bd8358931382c9c data/create/advancements/recipes/misc/crafting/logistics/stock_ticker_clear.json cb416511a219d2bc5806c6880c01820a8b563b80 data/create/advancements/recipes/misc/crafting/materials/andesite_alloy.json 3b65a04da4e16442bfa8accfe209b7c5342b1db9 data/create/advancements/recipes/misc/crafting/materials/andesite_alloy_block.json @@ -439,8 +439,7 @@ a24f11d979f40994b9f881b0f49fff5d93185296 data/create/recipes/crafting/logistics/ d994ef262b16357984d3ed62f6563d2f37266193 data/create/recipes/crafting/logistics/brass_tunnel.json 0b18d9964f2d580eb465cc72208f7a7fdba7b63e data/create/recipes/crafting/logistics/content_observer.json cc837e8b014c121ed9d959baddea134ebf669350 data/create/recipes/crafting/logistics/display_link.json -9b5926ef76342b8364bff3474e491704c3197c5f data/create/recipes/crafting/logistics/factory_panel_clear.json -5db046b432f184c6590c8e6adaf95adac6f0dc9d data/create/recipes/crafting/logistics/packager_link_clear.json +2fb7722137990b9b9be967a1f766e138678d0573 data/create/recipes/crafting/logistics/factory_gauge_clear.json dd28b63ceb46a1e9071549c4f8ff32f520c667f6 data/create/recipes/crafting/logistics/powered_latch.json 9ee6e19644928dc78e6f8a5e59f30cd42ac3e454 data/create/recipes/crafting/logistics/powered_toggle_latch.json aa8a704ad643ff5f06db34f4047f7f740a556236 data/create/recipes/crafting/logistics/pulse_extender.json @@ -449,6 +448,7 @@ c81f852f1d1514184ff235e790a6ca907f7b6ad4 data/create/recipes/crafting/logistics/ 00877e6b56f28d8691080ef18b654f0a141835ce data/create/recipes/crafting/logistics/redstone_link.json 8446b3ca07575ea978ddde4121900207d54be8b3 data/create/recipes/crafting/logistics/redstone_requester_clear.json eff0d37e98e8badd8d2c3c9de17ee5560b110dbd data/create/recipes/crafting/logistics/stockpile_switch.json +e19544e2ef88a4d10f6dc8a3a973793cb00085ba data/create/recipes/crafting/logistics/stock_link_clear.json 38aa7b9b3c4724ec8b8d94f00a98d684110ad5ca data/create/recipes/crafting/logistics/stock_ticker_clear.json ac524c110f66a7433208a888c5f3bb69e5e95743 data/create/recipes/crafting/materials/andesite_alloy.json e6bb68a1d2ed5a629c83f5a0eefb843bb890736d data/create/recipes/crafting/materials/andesite_alloy_block.json diff --git a/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 b/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 index a6e4275848..bc01caf90a 100644 --- a/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 +++ b/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 @@ -1,4 +1,4 @@ -// 1.20.1 2024-11-01T09:46:44.623326 Create's Processing Recipes +// 1.20.1 2024-11-05T20:25:45.1913258 Create's Processing Recipes 3c94326fb730f68c1e44fe1e2ef09c9db6ffd92b data/create/recipes/compacting/andesite_from_flint.json 8d3d5b31f3601b9f681ff710e0545a483a1494c6 data/create/recipes/compacting/blaze_cake.json 8bd7f4e3a686ab520b2d55594d2018d0e9a50c91 data/create/recipes/compacting/chocolate.json @@ -969,7 +969,7 @@ a91dae829938d3f69a7007d3cf8db02b70fe3a7f data/create/recipes/milling/white_tulip 5f1b8a82af091cd4589ecfa5c13a4db6ad9c51b9 data/create/recipes/mixing/andesite_alloy.json 48604c2205b18fe1401eac58d14aa1677cbd9c2b data/create/recipes/mixing/andesite_alloy_from_zinc.json d06c1d0362dccc4e5f8b22f851dc8316b35c06b0 data/create/recipes/mixing/brass_ingot.json -fd3d1d8d2584dca71525f52ce6e08a1a77d3045f data/create/recipes/mixing/cardboard_pulp.json +85056d50f7fd86393e2345e678e2497724615d4f data/create/recipes/mixing/cardboard_pulp.json 840a9008d4531425beadfcf224d21e938acc4502 data/create/recipes/mixing/chocolate.json e7b86d4ca5de2df474794424d93b447e5f9dcdc3 data/create/recipes/mixing/chocolate_melting.json 39e832016fa5e360434271505d09ced17a40e7eb data/create/recipes/mixing/compat/ae2/fluix_crystal.json @@ -983,7 +983,7 @@ ac2a2456e2f0ccd74db6dc5ad029eb4e6781a25d data/create/recipes/mixing/honey.json 77de88a8d25b974a63a5d132dd5461523e798fe2 data/create/recipes/pressing/aether_dirt_path.json 92a1198c990660458565ca871520b7c32fb0e24b data/create/recipes/pressing/aether_dirt_path_from_grass.json 8bd950c78b4db3b7f5a9a1f42c116677049b77fc data/create/recipes/pressing/brass_ingot.json -3f7b661d165c9c0140722dfe31591e6688b1ab98 data/create/recipes/pressing/cardboard.json +6ceffc42f77201423f42b537b0567d0213c4427d data/create/recipes/pressing/cardboard.json 1fe1caaec87a1a7b3cd739c372829f48386d2f8a data/create/recipes/pressing/compat/atmospheric/crustose_path.json 4d4821506da8c82eabc6109d1cfcb4fa980e54c8 data/create/recipes/pressing/compat/betterendforge/amber_moss_path.json 16c653a9c8771662d060a6151fa77ab4ce8d2614 data/create/recipes/pressing/compat/betterendforge/cave_moss_path.json diff --git a/src/generated/resources/assets/create/blockstates/andesite_display_cloth.json b/src/generated/resources/assets/create/blockstates/andesite_display_cloth.json deleted file mode 100644 index ed83fc4907..0000000000 --- a/src/generated/resources/assets/create/blockstates/andesite_display_cloth.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "create:block/andesite_display_cloth" - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/andesite_table_cloth.json b/src/generated/resources/assets/create/blockstates/andesite_table_cloth.json new file mode 100644 index 0000000000..e5afa390f5 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/andesite_table_cloth.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/andesite_table_cloth" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/black_display_cloth.json b/src/generated/resources/assets/create/blockstates/black_display_cloth.json deleted file mode 100644 index d2b216703f..0000000000 --- a/src/generated/resources/assets/create/blockstates/black_display_cloth.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "create:block/black_display_cloth" - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/black_table_cloth.json b/src/generated/resources/assets/create/blockstates/black_table_cloth.json new file mode 100644 index 0000000000..c359608ab8 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/black_table_cloth.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/black_table_cloth" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/blue_display_cloth.json b/src/generated/resources/assets/create/blockstates/blue_display_cloth.json deleted file mode 100644 index 86eacb58c7..0000000000 --- a/src/generated/resources/assets/create/blockstates/blue_display_cloth.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "create:block/blue_display_cloth" - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/blue_table_cloth.json b/src/generated/resources/assets/create/blockstates/blue_table_cloth.json new file mode 100644 index 0000000000..d0a8ea92fa --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/blue_table_cloth.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/blue_table_cloth" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/brass_display_cloth.json b/src/generated/resources/assets/create/blockstates/brass_display_cloth.json deleted file mode 100644 index fee161fb7c..0000000000 --- a/src/generated/resources/assets/create/blockstates/brass_display_cloth.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "create:block/brass_display_cloth" - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/brass_table_cloth.json b/src/generated/resources/assets/create/blockstates/brass_table_cloth.json new file mode 100644 index 0000000000..e7d0f7161c --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/brass_table_cloth.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/brass_table_cloth" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/brown_display_cloth.json b/src/generated/resources/assets/create/blockstates/brown_display_cloth.json deleted file mode 100644 index 437ab26ae5..0000000000 --- a/src/generated/resources/assets/create/blockstates/brown_display_cloth.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "create:block/brown_display_cloth" - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/brown_table_cloth.json b/src/generated/resources/assets/create/blockstates/brown_table_cloth.json new file mode 100644 index 0000000000..20a016bf8b --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/brown_table_cloth.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/brown_table_cloth" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/copper_display_cloth.json b/src/generated/resources/assets/create/blockstates/copper_display_cloth.json deleted file mode 100644 index be129084f6..0000000000 --- a/src/generated/resources/assets/create/blockstates/copper_display_cloth.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "create:block/copper_display_cloth" - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/copper_table_cloth.json b/src/generated/resources/assets/create/blockstates/copper_table_cloth.json new file mode 100644 index 0000000000..6cd6309dd0 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/copper_table_cloth.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/copper_table_cloth" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/cyan_display_cloth.json b/src/generated/resources/assets/create/blockstates/cyan_display_cloth.json deleted file mode 100644 index 036726e9c6..0000000000 --- a/src/generated/resources/assets/create/blockstates/cyan_display_cloth.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "create:block/cyan_display_cloth" - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/cyan_table_cloth.json b/src/generated/resources/assets/create/blockstates/cyan_table_cloth.json new file mode 100644 index 0000000000..66a0514db9 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/cyan_table_cloth.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/cyan_table_cloth" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/factory_panel.json b/src/generated/resources/assets/create/blockstates/factory_gauge.json similarity index 64% rename from src/generated/resources/assets/create/blockstates/factory_panel.json rename to src/generated/resources/assets/create/blockstates/factory_gauge.json index 8240e5b6ca..d4f7371962 100644 --- a/src/generated/resources/assets/create/blockstates/factory_panel.json +++ b/src/generated/resources/assets/create/blockstates/factory_gauge.json @@ -1,214 +1,214 @@ { "variants": { "face=ceiling,facing=east,powered=false,waterlogged=false": { - "model": "create:block/factory_panel/block", + "model": "create:block/factory_gauge/block", "x": 180, "y": 270 }, "face=ceiling,facing=east,powered=false,waterlogged=true": { - "model": "create:block/factory_panel/block", + "model": "create:block/factory_gauge/block", "x": 180, "y": 270 }, "face=ceiling,facing=east,powered=true,waterlogged=false": { - "model": "create:block/factory_panel/block", + "model": "create:block/factory_gauge/block", "x": 180, "y": 270 }, "face=ceiling,facing=east,powered=true,waterlogged=true": { - "model": "create:block/factory_panel/block", + "model": "create:block/factory_gauge/block", "x": 180, "y": 270 }, "face=ceiling,facing=north,powered=false,waterlogged=false": { - "model": "create:block/factory_panel/block", + "model": "create:block/factory_gauge/block", "x": 180, "y": 180 }, "face=ceiling,facing=north,powered=false,waterlogged=true": { - "model": "create:block/factory_panel/block", + "model": "create:block/factory_gauge/block", "x": 180, "y": 180 }, "face=ceiling,facing=north,powered=true,waterlogged=false": { - "model": "create:block/factory_panel/block", + "model": "create:block/factory_gauge/block", "x": 180, "y": 180 }, "face=ceiling,facing=north,powered=true,waterlogged=true": { - "model": "create:block/factory_panel/block", + "model": "create:block/factory_gauge/block", "x": 180, "y": 180 }, "face=ceiling,facing=south,powered=false,waterlogged=false": { - "model": "create:block/factory_panel/block", + "model": "create:block/factory_gauge/block", "x": 180 }, "face=ceiling,facing=south,powered=false,waterlogged=true": { - "model": "create:block/factory_panel/block", + "model": "create:block/factory_gauge/block", "x": 180 }, "face=ceiling,facing=south,powered=true,waterlogged=false": { - "model": "create:block/factory_panel/block", + "model": "create:block/factory_gauge/block", "x": 180 }, "face=ceiling,facing=south,powered=true,waterlogged=true": { - "model": "create:block/factory_panel/block", + "model": "create:block/factory_gauge/block", "x": 180 }, "face=ceiling,facing=west,powered=false,waterlogged=false": { - "model": "create:block/factory_panel/block", + "model": "create:block/factory_gauge/block", "x": 180, "y": 90 }, "face=ceiling,facing=west,powered=false,waterlogged=true": { - "model": "create:block/factory_panel/block", + "model": "create:block/factory_gauge/block", "x": 180, "y": 90 }, "face=ceiling,facing=west,powered=true,waterlogged=false": { - "model": "create:block/factory_panel/block", + "model": "create:block/factory_gauge/block", "x": 180, "y": 90 }, "face=ceiling,facing=west,powered=true,waterlogged=true": { - "model": "create:block/factory_panel/block", + "model": "create:block/factory_gauge/block", "x": 180, "y": 90 }, "face=floor,facing=east,powered=false,waterlogged=false": { - "model": "create:block/factory_panel/block", + "model": "create:block/factory_gauge/block", "y": 90 }, "face=floor,facing=east,powered=false,waterlogged=true": { - "model": "create:block/factory_panel/block", + "model": "create:block/factory_gauge/block", "y": 90 }, "face=floor,facing=east,powered=true,waterlogged=false": { - "model": "create:block/factory_panel/block", + "model": "create:block/factory_gauge/block", "y": 90 }, "face=floor,facing=east,powered=true,waterlogged=true": { - "model": "create:block/factory_panel/block", + "model": "create:block/factory_gauge/block", "y": 90 }, "face=floor,facing=north,powered=false,waterlogged=false": { - "model": "create:block/factory_panel/block" + "model": "create:block/factory_gauge/block" }, "face=floor,facing=north,powered=false,waterlogged=true": { - "model": "create:block/factory_panel/block" + "model": "create:block/factory_gauge/block" }, "face=floor,facing=north,powered=true,waterlogged=false": { - "model": "create:block/factory_panel/block" + "model": "create:block/factory_gauge/block" }, "face=floor,facing=north,powered=true,waterlogged=true": { - "model": "create:block/factory_panel/block" + "model": "create:block/factory_gauge/block" }, "face=floor,facing=south,powered=false,waterlogged=false": { - "model": "create:block/factory_panel/block", + "model": "create:block/factory_gauge/block", "y": 180 }, "face=floor,facing=south,powered=false,waterlogged=true": { - "model": "create:block/factory_panel/block", + "model": "create:block/factory_gauge/block", "y": 180 }, "face=floor,facing=south,powered=true,waterlogged=false": { - "model": "create:block/factory_panel/block", + "model": "create:block/factory_gauge/block", "y": 180 }, "face=floor,facing=south,powered=true,waterlogged=true": { - "model": "create:block/factory_panel/block", + "model": "create:block/factory_gauge/block", "y": 180 }, "face=floor,facing=west,powered=false,waterlogged=false": { - "model": "create:block/factory_panel/block", + "model": "create:block/factory_gauge/block", "y": 270 }, "face=floor,facing=west,powered=false,waterlogged=true": { - "model": "create:block/factory_panel/block", + "model": "create:block/factory_gauge/block", "y": 270 }, "face=floor,facing=west,powered=true,waterlogged=false": { - "model": "create:block/factory_panel/block", + "model": "create:block/factory_gauge/block", "y": 270 }, "face=floor,facing=west,powered=true,waterlogged=true": { - "model": "create:block/factory_panel/block", + "model": "create:block/factory_gauge/block", "y": 270 }, "face=wall,facing=east,powered=false,waterlogged=false": { - "model": "create:block/factory_panel/block", + "model": "create:block/factory_gauge/block", "x": 90, "y": 90 }, "face=wall,facing=east,powered=false,waterlogged=true": { - "model": "create:block/factory_panel/block", + "model": "create:block/factory_gauge/block", "x": 90, "y": 90 }, "face=wall,facing=east,powered=true,waterlogged=false": { - "model": "create:block/factory_panel/block", + "model": "create:block/factory_gauge/block", "x": 90, "y": 90 }, "face=wall,facing=east,powered=true,waterlogged=true": { - "model": "create:block/factory_panel/block", + "model": "create:block/factory_gauge/block", "x": 90, "y": 90 }, "face=wall,facing=north,powered=false,waterlogged=false": { - "model": "create:block/factory_panel/block", + "model": "create:block/factory_gauge/block", "x": 90 }, "face=wall,facing=north,powered=false,waterlogged=true": { - "model": "create:block/factory_panel/block", + "model": "create:block/factory_gauge/block", "x": 90 }, "face=wall,facing=north,powered=true,waterlogged=false": { - "model": "create:block/factory_panel/block", + "model": "create:block/factory_gauge/block", "x": 90 }, "face=wall,facing=north,powered=true,waterlogged=true": { - "model": "create:block/factory_panel/block", + "model": "create:block/factory_gauge/block", "x": 90 }, "face=wall,facing=south,powered=false,waterlogged=false": { - "model": "create:block/factory_panel/block", + "model": "create:block/factory_gauge/block", "x": 90, "y": 180 }, "face=wall,facing=south,powered=false,waterlogged=true": { - "model": "create:block/factory_panel/block", + "model": "create:block/factory_gauge/block", "x": 90, "y": 180 }, "face=wall,facing=south,powered=true,waterlogged=false": { - "model": "create:block/factory_panel/block", + "model": "create:block/factory_gauge/block", "x": 90, "y": 180 }, "face=wall,facing=south,powered=true,waterlogged=true": { - "model": "create:block/factory_panel/block", + "model": "create:block/factory_gauge/block", "x": 90, "y": 180 }, "face=wall,facing=west,powered=false,waterlogged=false": { - "model": "create:block/factory_panel/block", + "model": "create:block/factory_gauge/block", "x": 90, "y": 270 }, "face=wall,facing=west,powered=false,waterlogged=true": { - "model": "create:block/factory_panel/block", + "model": "create:block/factory_gauge/block", "x": 90, "y": 270 }, "face=wall,facing=west,powered=true,waterlogged=false": { - "model": "create:block/factory_panel/block", + "model": "create:block/factory_gauge/block", "x": 90, "y": 270 }, "face=wall,facing=west,powered=true,waterlogged=true": { - "model": "create:block/factory_panel/block", + "model": "create:block/factory_gauge/block", "x": 90, "y": 270 } diff --git a/src/generated/resources/assets/create/blockstates/gray_display_cloth.json b/src/generated/resources/assets/create/blockstates/gray_display_cloth.json deleted file mode 100644 index 4f732a35eb..0000000000 --- a/src/generated/resources/assets/create/blockstates/gray_display_cloth.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "create:block/gray_display_cloth" - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/gray_table_cloth.json b/src/generated/resources/assets/create/blockstates/gray_table_cloth.json new file mode 100644 index 0000000000..1e5e2e933e --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/gray_table_cloth.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/gray_table_cloth" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/green_display_cloth.json b/src/generated/resources/assets/create/blockstates/green_display_cloth.json deleted file mode 100644 index 10b831420e..0000000000 --- a/src/generated/resources/assets/create/blockstates/green_display_cloth.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "create:block/green_display_cloth" - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/green_table_cloth.json b/src/generated/resources/assets/create/blockstates/green_table_cloth.json new file mode 100644 index 0000000000..4ccbf5efee --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/green_table_cloth.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/green_table_cloth" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/light_blue_display_cloth.json b/src/generated/resources/assets/create/blockstates/light_blue_display_cloth.json deleted file mode 100644 index 49d1e681f4..0000000000 --- a/src/generated/resources/assets/create/blockstates/light_blue_display_cloth.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "create:block/light_blue_display_cloth" - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/light_blue_table_cloth.json b/src/generated/resources/assets/create/blockstates/light_blue_table_cloth.json new file mode 100644 index 0000000000..8159350160 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/light_blue_table_cloth.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/light_blue_table_cloth" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/light_gray_display_cloth.json b/src/generated/resources/assets/create/blockstates/light_gray_display_cloth.json deleted file mode 100644 index e8ed847946..0000000000 --- a/src/generated/resources/assets/create/blockstates/light_gray_display_cloth.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "create:block/light_gray_display_cloth" - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/light_gray_table_cloth.json b/src/generated/resources/assets/create/blockstates/light_gray_table_cloth.json new file mode 100644 index 0000000000..78cfebd35b --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/light_gray_table_cloth.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/light_gray_table_cloth" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/lime_display_cloth.json b/src/generated/resources/assets/create/blockstates/lime_display_cloth.json deleted file mode 100644 index c9a5e0cf94..0000000000 --- a/src/generated/resources/assets/create/blockstates/lime_display_cloth.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "create:block/lime_display_cloth" - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/lime_table_cloth.json b/src/generated/resources/assets/create/blockstates/lime_table_cloth.json new file mode 100644 index 0000000000..f289b982f0 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/lime_table_cloth.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/lime_table_cloth" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/magenta_display_cloth.json b/src/generated/resources/assets/create/blockstates/magenta_display_cloth.json deleted file mode 100644 index caccd48ad9..0000000000 --- a/src/generated/resources/assets/create/blockstates/magenta_display_cloth.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "create:block/magenta_display_cloth" - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/magenta_table_cloth.json b/src/generated/resources/assets/create/blockstates/magenta_table_cloth.json new file mode 100644 index 0000000000..723a59f08c --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/magenta_table_cloth.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/magenta_table_cloth" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/orange_display_cloth.json b/src/generated/resources/assets/create/blockstates/orange_display_cloth.json deleted file mode 100644 index 9409655142..0000000000 --- a/src/generated/resources/assets/create/blockstates/orange_display_cloth.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "create:block/orange_display_cloth" - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/orange_table_cloth.json b/src/generated/resources/assets/create/blockstates/orange_table_cloth.json new file mode 100644 index 0000000000..2bfe470433 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/orange_table_cloth.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/orange_table_cloth" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/pink_display_cloth.json b/src/generated/resources/assets/create/blockstates/pink_display_cloth.json deleted file mode 100644 index 78e64c62fa..0000000000 --- a/src/generated/resources/assets/create/blockstates/pink_display_cloth.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "create:block/pink_display_cloth" - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/pink_table_cloth.json b/src/generated/resources/assets/create/blockstates/pink_table_cloth.json new file mode 100644 index 0000000000..1d3cb73684 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/pink_table_cloth.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/pink_table_cloth" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/purple_display_cloth.json b/src/generated/resources/assets/create/blockstates/purple_display_cloth.json deleted file mode 100644 index 46a87f6699..0000000000 --- a/src/generated/resources/assets/create/blockstates/purple_display_cloth.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "create:block/purple_display_cloth" - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/purple_table_cloth.json b/src/generated/resources/assets/create/blockstates/purple_table_cloth.json new file mode 100644 index 0000000000..2e1621cac0 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/purple_table_cloth.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/purple_table_cloth" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/red_display_cloth.json b/src/generated/resources/assets/create/blockstates/red_display_cloth.json deleted file mode 100644 index d493d8cda3..0000000000 --- a/src/generated/resources/assets/create/blockstates/red_display_cloth.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "create:block/red_display_cloth" - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/red_table_cloth.json b/src/generated/resources/assets/create/blockstates/red_table_cloth.json new file mode 100644 index 0000000000..bb9720b06c --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/red_table_cloth.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/red_table_cloth" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/packager_link.json b/src/generated/resources/assets/create/blockstates/stock_link.json similarity index 53% rename from src/generated/resources/assets/create/blockstates/packager_link.json rename to src/generated/resources/assets/create/blockstates/stock_link.json index e0d5a89a8c..3d9674a1d2 100644 --- a/src/generated/resources/assets/create/blockstates/packager_link.json +++ b/src/generated/resources/assets/create/blockstates/stock_link.json @@ -1,54 +1,54 @@ { "variants": { "facing=down,powered=false": { - "model": "create:block/packager_link/block", + "model": "create:block/stock_link/block", "x": 180 }, "facing=down,powered=true": { - "model": "create:block/packager_link/block_powered", + "model": "create:block/stock_link/block_powered", "x": 180 }, "facing=east,powered=false": { - "model": "create:block/packager_link/block", + "model": "create:block/stock_link/block", "x": 90, "y": 90 }, "facing=east,powered=true": { - "model": "create:block/packager_link/block_powered", + "model": "create:block/stock_link/block_powered", "x": 90, "y": 90 }, "facing=north,powered=false": { - "model": "create:block/packager_link/block", + "model": "create:block/stock_link/block", "x": 90 }, "facing=north,powered=true": { - "model": "create:block/packager_link/block_powered", + "model": "create:block/stock_link/block_powered", "x": 90 }, "facing=south,powered=false": { - "model": "create:block/packager_link/block", + "model": "create:block/stock_link/block", "x": 90, "y": 180 }, "facing=south,powered=true": { - "model": "create:block/packager_link/block_powered", + "model": "create:block/stock_link/block_powered", "x": 90, "y": 180 }, "facing=up,powered=false": { - "model": "create:block/packager_link/block" + "model": "create:block/stock_link/block" }, "facing=up,powered=true": { - "model": "create:block/packager_link/block_powered" + "model": "create:block/stock_link/block_powered" }, "facing=west,powered=false": { - "model": "create:block/packager_link/block", + "model": "create:block/stock_link/block", "x": 90, "y": 270 }, "facing=west,powered=true": { - "model": "create:block/packager_link/block_powered", + "model": "create:block/stock_link/block_powered", "x": 90, "y": 270 } diff --git a/src/generated/resources/assets/create/blockstates/white_display_cloth.json b/src/generated/resources/assets/create/blockstates/white_display_cloth.json deleted file mode 100644 index 0f9b9fd8cd..0000000000 --- a/src/generated/resources/assets/create/blockstates/white_display_cloth.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "create:block/white_display_cloth" - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/white_table_cloth.json b/src/generated/resources/assets/create/blockstates/white_table_cloth.json new file mode 100644 index 0000000000..235e7d8443 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/white_table_cloth.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/white_table_cloth" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/yellow_display_cloth.json b/src/generated/resources/assets/create/blockstates/yellow_display_cloth.json deleted file mode 100644 index dc1d17c581..0000000000 --- a/src/generated/resources/assets/create/blockstates/yellow_display_cloth.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "create:block/yellow_display_cloth" - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/yellow_table_cloth.json b/src/generated/resources/assets/create/blockstates/yellow_table_cloth.json new file mode 100644 index 0000000000..1ba52c6649 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/yellow_table_cloth.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/yellow_table_cloth" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index d3adf51dc3..280c346555 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -193,7 +193,6 @@ "block.create.andesite_bars": "sɹɐᗺ ǝʇısǝpuⱯ", "block.create.andesite_belt_funnel": "ןǝuunℲ ʇןǝᗺ ǝʇısǝpuⱯ", "block.create.andesite_casing": "buısɐƆ ǝʇısǝpuⱯ", - "block.create.andesite_display_cloth": "ɥʇoןƆ ʎɐןdsıᗡ ǝʇısǝpuⱯ", "block.create.andesite_door": "ɹooᗡ ǝʇısǝpuⱯ", "block.create.andesite_encased_cogwheel": "ןǝǝɥʍboƆ pǝsɐɔuƎ ǝʇısǝpuⱯ", "block.create.andesite_encased_large_cogwheel": "ןǝǝɥʍboƆ ǝbɹɐꞀ pǝsɐɔuƎ ǝʇısǝpuⱯ", @@ -202,6 +201,7 @@ "block.create.andesite_ladder": "ɹǝppɐꞀ ǝʇısǝpuⱯ", "block.create.andesite_pillar": "ɹɐןןıԀ ǝʇısǝpuⱯ", "block.create.andesite_scaffolding": "buıpןoɟɟɐɔS ǝʇısǝpuⱯ", + "block.create.andesite_table_cloth": "ɥʇoןƆ ǝןqɐ⟘ ǝʇısǝpuⱯ", "block.create.andesite_tunnel": "ןǝuun⟘ ǝʇısǝpuⱯ", "block.create.asurine": "ǝuıɹnsⱯ", "block.create.asurine_pillar": "ɹɐןןıԀ ǝuıɹnsⱯ", @@ -211,19 +211,19 @@ "block.create.belt": "ʇןǝᗺ", "block.create.birch_window": "ʍopuıM ɥɔɹıᗺ", "block.create.birch_window_pane": "ǝuɐԀ ʍopuıM ɥɔɹıᗺ", - "block.create.black_display_cloth": "ɥʇoןƆ ʎɐןdsıᗡ ʞɔɐןᗺ", "block.create.black_nixie_tube": "ǝqn⟘ ǝıxıN ʞɔɐןᗺ", "block.create.black_postbox": "xoqʇsoԀ ʞɔɐןᗺ", "block.create.black_sail": "ןıɐS ʞɔɐןᗺ", "block.create.black_seat": "ʇɐǝS ʞɔɐןᗺ", + "block.create.black_table_cloth": "ɥʇoןƆ ǝןqɐ⟘ ʞɔɐןᗺ", "block.create.black_toolbox": "xoqןoo⟘ ʞɔɐןᗺ", "block.create.black_valve_handle": "ǝןpuɐH ǝʌןɐΛ ʞɔɐןᗺ", "block.create.blaze_burner": "ɹǝuɹnᗺ ǝzɐןᗺ", - "block.create.blue_display_cloth": "ɥʇoןƆ ʎɐןdsıᗡ ǝnןᗺ", "block.create.blue_nixie_tube": "ǝqn⟘ ǝıxıN ǝnןᗺ", "block.create.blue_postbox": "xoqʇsoԀ ǝnןᗺ", "block.create.blue_sail": "ןıɐS ǝnןᗺ", "block.create.blue_seat": "ʇɐǝS ǝnןᗺ", + "block.create.blue_table_cloth": "ɥʇoןƆ ǝןqɐ⟘ ǝnןᗺ", "block.create.blue_toolbox": "xoqןoo⟘ ǝnןᗺ", "block.create.blue_valve_handle": "ǝןpuɐH ǝʌןɐΛ ǝnןᗺ", "block.create.bound_cardboard_block": "pɹɐoqpɹɐƆ ɟo ʞɔoןq punoᗺ", @@ -231,7 +231,6 @@ "block.create.brass_belt_funnel": "ןǝuunℲ ʇןǝᗺ ssɐɹᗺ", "block.create.brass_block": "ssɐɹᗺ ɟo ʞɔoןᗺ", "block.create.brass_casing": "buısɐƆ ssɐɹᗺ", - "block.create.brass_display_cloth": "ɥʇoןƆ ʎɐןdsıᗡ ssɐɹᗺ", "block.create.brass_door": "ɹooᗡ ssɐɹᗺ", "block.create.brass_encased_cogwheel": "ןǝǝɥʍboƆ pǝsɐɔuƎ ssɐɹᗺ", "block.create.brass_encased_large_cogwheel": "ןǝǝɥʍboƆ ǝbɹɐꞀ pǝsɐɔuƎ ssɐɹᗺ", @@ -239,12 +238,13 @@ "block.create.brass_funnel": "ןǝuunℲ ssɐɹᗺ", "block.create.brass_ladder": "ɹǝppɐꞀ ssɐɹᗺ", "block.create.brass_scaffolding": "buıpןoɟɟɐɔS ssɐɹᗺ", + "block.create.brass_table_cloth": "ɥʇoןƆ ǝןqɐ⟘ ssɐɹᗺ", "block.create.brass_tunnel": "ןǝuun⟘ ssɐɹᗺ", - "block.create.brown_display_cloth": "ɥʇoןƆ ʎɐןdsıᗡ uʍoɹᗺ", "block.create.brown_nixie_tube": "ǝqn⟘ ǝıxıN uʍoɹᗺ", "block.create.brown_postbox": "xoqʇsoԀ uʍoɹᗺ", "block.create.brown_sail": "ןıɐS uʍoɹᗺ", "block.create.brown_seat": "ʇɐǝS uʍoɹᗺ", + "block.create.brown_table_cloth": "ɥʇoןƆ ǝןqɐ⟘ uʍoɹᗺ", "block.create.brown_toolbox": "xoqןoo⟘ uʍoɹᗺ", "block.create.brown_valve_handle": "ǝןpuɐH ǝʌןɐΛ uʍoɹᗺ", "block.create.calcite_pillar": "ɹɐןןıԀ ǝʇıɔןɐƆ", @@ -273,13 +273,13 @@ "block.create.copper_backtank": "ʞuɐʇʞɔɐᗺ ɹǝddoƆ", "block.create.copper_bars": "sɹɐᗺ ɹǝddoƆ", "block.create.copper_casing": "buısɐƆ ɹǝddoƆ", - "block.create.copper_display_cloth": "ɥʇoןƆ ʎɐןdsıᗡ ɹǝddoƆ", "block.create.copper_door": "ɹooᗡ ɹǝddoƆ", "block.create.copper_ladder": "ɹǝppɐꞀ ɹǝddoƆ", "block.create.copper_scaffolding": "buıpןoɟɟɐɔS ɹǝddoƆ", "block.create.copper_shingle_slab": "qɐןS ǝןbuıɥS ɹǝddoƆ", "block.create.copper_shingle_stairs": "sɹıɐʇS ǝןbuıɥS ɹǝddoƆ", "block.create.copper_shingles": "sǝןbuıɥS ɹǝddoƆ", + "block.create.copper_table_cloth": "ɥʇoןƆ ǝןqɐ⟘ ɹǝddoƆ", "block.create.copper_tile_slab": "qɐןS ǝןı⟘ ɹǝddoƆ", "block.create.copper_tile_stairs": "sɹıɐʇS ǝןı⟘ ɹǝddoƆ", "block.create.copper_tiles": "sǝןı⟘ ɹǝddoƆ", @@ -424,11 +424,11 @@ "block.create.cut_veridium_slab": "qɐןS ɯnıpıɹǝΛ ʇnƆ", "block.create.cut_veridium_stairs": "sɹıɐʇS ɯnıpıɹǝΛ ʇnƆ", "block.create.cut_veridium_wall": "ןןɐM ɯnıpıɹǝΛ ʇnƆ", - "block.create.cyan_display_cloth": "ɥʇoןƆ ʎɐןdsıᗡ uɐʎƆ", "block.create.cyan_nixie_tube": "ǝqn⟘ ǝıxıN uɐʎƆ", "block.create.cyan_postbox": "xoqʇsoԀ uɐʎƆ", "block.create.cyan_sail": "ןıɐS uɐʎƆ", "block.create.cyan_seat": "ʇɐǝS uɐʎƆ", + "block.create.cyan_table_cloth": "ɥʇoןƆ ǝןqɐ⟘ uɐʎƆ", "block.create.cyan_toolbox": "xoqןoo⟘ uɐʎƆ", "block.create.cyan_valve_handle": "ǝןpuɐH ǝʌןɐΛ uɐʎƆ", "block.create.dark_oak_window": "ʍopuıM ʞɐO ʞɹɐᗡ", @@ -443,7 +443,6 @@ "block.create.desk_bell.tooltip.summary": "˙pǝʇɐʌıʇɔɐ uǝɥʍ ‾ןɐubıs ǝuoʇspǝɹ‾ ɐ sʇıɯƎ ¡ǝɔıʌɹǝS ɹoɟ buıᴚ", "block.create.diorite_pillar": "ɹɐןןıԀ ǝʇıɹoıᗡ", "block.create.display_board": "pɹɐoᗺ ʎɐןdsıᗡ", - "block.create.display_cloth.tooltip.summary": "˙ɥʇoןɔ ʎɐןdsıp pǝɹnbıɟuoɔ ǝɥʇ buıɔɐןd ɹǝʇɟɐ pǝıɟıɔǝds ǝq uɐɔ ʇsoɔ ǝɥ⟘ ˙sɹǝʎɐןd ɹǝɥʇo ʎq pǝsɐɥɔɹnd ǝq uɐɔ ʇɐɥʇ ʞɹoʍʇǝu ɹnoʎ ɯoɹɟ ʇsǝnbǝɹ ɐ ʎɟıɔǝds 'ɹǝdǝǝʞ ʞɔoʇs ɐ uo pǝsn uǝɥʍ 'ʎןǝʌıʇɐuɹǝʇןⱯ ˙ɯǝɥʇ ʎɐןdsıp oʇ ɯǝʇı ɥʇıʍ ʞɔıןɔ 'uoıʇɐɹoɔǝp ɹoɟ pǝsn ǝq uɐƆ ]ɹǝpuod[", "block.create.display_link": "ʞuıꞀ ʎɐןdsıᗡ", "block.create.dripstone_pillar": "ɹɐןןıԀ ǝuoʇsdıɹᗡ", "block.create.elevator_contact": "ʇɔɐʇuoƆ ɹoʇɐʌǝןƎ", @@ -458,12 +457,12 @@ "block.create.exposed_copper_tile_slab": "qɐןS ǝןı⟘ ɹǝddoƆ pǝsodxƎ", "block.create.exposed_copper_tile_stairs": "sɹıɐʇS ǝןı⟘ ɹǝddoƆ pǝsodxƎ", "block.create.exposed_copper_tiles": "sǝןı⟘ ɹǝddoƆ pǝsodxƎ", - "block.create.factory_panel": "ןǝuɐԀ ʎɹoʇɔɐℲ", - "block.create.factory_panel.tooltip.behaviour1": "˙ssǝɹppɐ uɐ ʇǝs oʇ ןǝuɐd ǝɥʇ ʞɔıןɔ ʇɹoɥS ˙ɹǝuıɐʇuoɔ ǝɥʇ uı sı ʇunoɯɐ ʇǝbɹɐʇ ǝɥʇ ןıʇun ssǝɹppɐ pǝıɟıɔǝds ǝɥʇ oʇ ʞɹoʍʇǝu ǝɥʇ ɯoɹɟ sɯǝʇı sʇsǝnbǝɹ ןǝuɐԀ :ǝpoɯ ɹǝʞɔoʇsǝᴚ", - "block.create.factory_panel.tooltip.behaviour2": "˙sןǝuɐd ɹǝɥʇo ɹoɟ ʇnduı uɐ sɐ pǝsnǝɹ ǝq osןɐ uɐɔ ɯǝʇı ʇndʇno uɐ buıʎɟıɔǝds sןǝuɐԀ ˙sɯǝʇı ʇnduı sɐ sןǝuɐd ɹǝɥʇo ʇɔǝuuoɔ puɐ ssǝɹppɐ uɐ ʇǝs oʇ ןǝuɐd ǝɥʇ ʞɔıןɔ ʇɹoɥS ˙)ʞɹoʍʇǝu uo sʞuɐןԀ ㄣ9 ʇsɐǝן ʇɐ ןıʇun 'sʞuɐןԀ 9 ʇɔǝdxǝ puɐ ,ʍɐs, oʇ boꞀ Ɩ puǝS ˙b˙ǝ( ʞɹoʍʇǝu ǝɥʇ uo punoɟ sı ɯǝʇı ʇndʇno ǝɥʇ ɟo pǝʇunoɯɐ ʇǝbɹɐʇ ǝɥʇ ןıʇun ssǝɹppɐ uɐ oʇ sʇuǝıpǝɹbuı sʇsǝnbǝɹ ןǝuɐԀ :ǝpoɯ ǝdıɔǝᴚ", - "block.create.factory_panel.tooltip.condition1": "ɹǝbɐʞɔɐԀ oʇ pǝɥɔɐʇʇɐ uǝɥM", - "block.create.factory_panel.tooltip.condition2": "ɹǝbɐʞɔɐԀ oʇ pǝɥɔɐʇʇɐ ʇou uǝɥM", - "block.create.factory_panel.tooltip.summary": "˙ǝbɐɹoʇs uı uıɐʇuıɐɯ oʇ ʇunoɯɐ ʇǝbɹɐʇ ɐ ʎɟıɔǝds oʇ ʞɔıןɔ pןoH ˙ʇoןs ɹǝʇןıɟ uı ɹoʇıuoɯ oʇ ɯǝʇı ǝɔɐןԀ ˙ʎɔuǝnbǝɹɟ sʇı ǝsn oʇ ʇuǝɯǝɔɐןd ǝɹoɟǝq ʞuıן ɹǝbɐʞɔɐd ʞɔıןƆ ]ɹǝpuod[", + "block.create.factory_gauge": "ǝbnɐ⅁ ʎɹoʇɔɐℲ", + "block.create.factory_gauge.tooltip.behaviour1": "˙ssǝɹppɐ uɐ ʇǝs oʇ ןǝuɐd ǝɥʇ ʞɔıןɔ ʇɹoɥS ˙ɹǝuıɐʇuoɔ ǝɥʇ uı sı ʇunoɯɐ ʇǝbɹɐʇ ǝɥʇ ןıʇun ssǝɹppɐ pǝıɟıɔǝds ǝɥʇ oʇ ʞɹoʍʇǝu ǝɥʇ ɯoɹɟ sɯǝʇı sʇsǝnbǝɹ ןǝuɐԀ :ǝpoɯ ɹǝʞɔoʇsǝᴚ", + "block.create.factory_gauge.tooltip.behaviour2": "˙sןǝuɐd ɹǝɥʇo ɹoɟ ʇnduı uɐ sɐ pǝsnǝɹ ǝq osןɐ uɐɔ ɯǝʇı ʇndʇno uɐ buıʎɟıɔǝds sןǝuɐԀ ˙sɯǝʇı ʇnduı sɐ sןǝuɐd ɹǝɥʇo ʇɔǝuuoɔ puɐ ssǝɹppɐ uɐ ʇǝs oʇ ןǝuɐd ǝɥʇ ʞɔıןɔ ʇɹoɥS ˙)ʞɹoʍʇǝu uo sʞuɐןԀ ㄣ9 ʇsɐǝן ʇɐ ןıʇun 'sʞuɐןԀ 9 ʇɔǝdxǝ puɐ ,ʍɐs, oʇ boꞀ Ɩ puǝS ˙b˙ǝ( ʞɹoʍʇǝu ǝɥʇ uo punoɟ sı ɯǝʇı ʇndʇno ǝɥʇ ɟo pǝʇunoɯɐ ʇǝbɹɐʇ ǝɥʇ ןıʇun ssǝɹppɐ uɐ oʇ sʇuǝıpǝɹbuı sʇsǝnbǝɹ ןǝuɐԀ :ǝpoɯ ǝdıɔǝᴚ", + "block.create.factory_gauge.tooltip.condition1": "ɹǝbɐʞɔɐԀ oʇ pǝɥɔɐʇʇɐ uǝɥM", + "block.create.factory_gauge.tooltip.condition2": "ɹǝbɐʞɔɐԀ oʇ pǝɥɔɐʇʇɐ ʇou uǝɥM", + "block.create.factory_gauge.tooltip.summary": "˙ǝbɐɹoʇs uı uıɐʇuıɐɯ oʇ ʇunoɯɐ ʇǝbɹɐʇ ɐ ʎɟıɔǝds oʇ ʞɔıןɔ pןoH ˙ʇoןs ɹǝʇןıɟ uı ɹoʇıuoɯ oʇ ɯǝʇı ǝɔɐןԀ ˙ʎɔuǝnbǝɹɟ sʇı ǝsn oʇ ʇuǝɯǝɔɐןd ǝɹoɟǝq ʞuıן ʞɔoʇs ʞɔıןƆ ]ɹǝpuod[", "block.create.fake_track": "sdɐW ɹoɟ ɹǝʞɹɐW ʞɔɐɹ⟘", "block.create.fluid_pipe": "ǝdıԀ pınןℲ", "block.create.fluid_tank": "ʞuɐ⟘ pınןℲ", @@ -482,18 +481,18 @@ "block.create.gearshift": "ʇɟıɥsɹɐǝ⅁", "block.create.glass_fluid_pipe": "ǝdıԀ pınןℲ ssɐן⅁", "block.create.granite_pillar": "ɹɐןןıԀ ǝʇıuɐɹ⅁", - "block.create.gray_display_cloth": "ɥʇoןƆ ʎɐןdsıᗡ ʎɐɹ⅁", "block.create.gray_nixie_tube": "ǝqn⟘ ǝıxıN ʎɐɹ⅁", "block.create.gray_postbox": "xoqʇsoԀ ʎɐɹ⅁", "block.create.gray_sail": "ןıɐS ʎɐɹ⅁", "block.create.gray_seat": "ʇɐǝS ʎɐɹ⅁", + "block.create.gray_table_cloth": "ɥʇoןƆ ǝןqɐ⟘ ʎɐɹ⅁", "block.create.gray_toolbox": "xoqןoo⟘ ʎɐɹ⅁", "block.create.gray_valve_handle": "ǝןpuɐH ǝʌןɐΛ ʎɐɹ⅁", - "block.create.green_display_cloth": "ɥʇoןƆ ʎɐןdsıᗡ uǝǝɹ⅁", "block.create.green_nixie_tube": "ǝqn⟘ ǝıxıN uǝǝɹ⅁", "block.create.green_postbox": "xoqʇsoԀ uǝǝɹ⅁", "block.create.green_sail": "ןıɐS uǝǝɹ⅁", "block.create.green_seat": "ʇɐǝS uǝǝɹ⅁", + "block.create.green_table_cloth": "ɥʇoןƆ ǝןqɐ⟘ uǝǝɹ⅁", "block.create.green_toolbox": "xoqןoo⟘ uǝǝɹ⅁", "block.create.green_valve_handle": "ǝןpuɐH ǝʌןɐΛ uǝǝɹ⅁", "block.create.hand_crank": "ʞuɐɹƆ puɐH", @@ -534,36 +533,36 @@ "block.create.layered_tuff": "ɟɟn⟘ pǝɹǝʎɐꞀ", "block.create.layered_veridium": "ɯnıpıɹǝΛ pǝɹǝʎɐꞀ", "block.create.lectern_controller": "ɹǝןןoɹʇuoƆ uɹǝʇɔǝꞀ", - "block.create.light_blue_display_cloth": "ɥʇoןƆ ʎɐןdsıᗡ ǝnןᗺ ʇɥbıꞀ", "block.create.light_blue_nixie_tube": "ǝqn⟘ ǝıxıN ǝnןᗺ ʇɥbıꞀ", "block.create.light_blue_postbox": "xoqʇsoԀ ǝnןᗺ ʇɥbıꞀ", "block.create.light_blue_sail": "ןıɐS ǝnןᗺ ʇɥbıꞀ", "block.create.light_blue_seat": "ʇɐǝS ǝnןᗺ ʇɥbıꞀ", + "block.create.light_blue_table_cloth": "ɥʇoןƆ ǝןqɐ⟘ ǝnןᗺ ʇɥbıꞀ", "block.create.light_blue_toolbox": "xoqןoo⟘ ǝnןᗺ ʇɥbıꞀ", "block.create.light_blue_valve_handle": "ǝןpuɐH ǝʌןɐΛ ǝnןᗺ ʇɥbıꞀ", - "block.create.light_gray_display_cloth": "ɥʇoןƆ ʎɐןdsıᗡ ʎɐɹ⅁ ʇɥbıꞀ", "block.create.light_gray_nixie_tube": "ǝqn⟘ ǝıxıN ʎɐɹ⅁ ʇɥbıꞀ", "block.create.light_gray_postbox": "xoqʇsoԀ ʎɐɹ⅁ ʇɥbıꞀ", "block.create.light_gray_sail": "ןıɐS ʎɐɹ⅁ ʇɥbıꞀ", "block.create.light_gray_seat": "ʇɐǝS ʎɐɹ⅁ ʇɥbıꞀ", + "block.create.light_gray_table_cloth": "ɥʇoןƆ ǝןqɐ⟘ ʎɐɹ⅁ ʇɥbıꞀ", "block.create.light_gray_toolbox": "xoqןoo⟘ ʎɐɹ⅁ ʇɥbıꞀ", "block.create.light_gray_valve_handle": "ǝןpuɐH ǝʌןɐΛ ʎɐɹ⅁ ʇɥbıꞀ", - "block.create.lime_display_cloth": "ɥʇoןƆ ʎɐןdsıᗡ ǝɯıꞀ", "block.create.lime_nixie_tube": "ǝqn⟘ ǝıxıN ǝɯıꞀ", "block.create.lime_postbox": "xoqʇsoԀ ǝɯıꞀ", "block.create.lime_sail": "ןıɐS ǝɯıꞀ", "block.create.lime_seat": "ʇɐǝS ǝɯıꞀ", + "block.create.lime_table_cloth": "ɥʇoןƆ ǝןqɐ⟘ ǝɯıꞀ", "block.create.lime_toolbox": "xoqןoo⟘ ǝɯıꞀ", "block.create.lime_valve_handle": "ǝןpuɐH ǝʌןɐΛ ǝɯıꞀ", "block.create.limestone": "ǝuoʇsǝɯıꞀ", "block.create.limestone_pillar": "ɹɐןןıԀ ǝuoʇsǝɯıꞀ", "block.create.linear_chassis": "sıssɐɥƆ ɹɐǝuıꞀ", "block.create.lit_blaze_burner": "ɹǝuɹnᗺ ǝzɐןᗺ ʇıꞀ", - "block.create.magenta_display_cloth": "ɥʇoןƆ ʎɐןdsıᗡ ɐʇuǝbɐW", "block.create.magenta_nixie_tube": "ǝqn⟘ ǝıxıN ɐʇuǝbɐW", "block.create.magenta_postbox": "xoqʇsoԀ ɐʇuǝbɐW", "block.create.magenta_sail": "ןıɐS ɐʇuǝbɐW", "block.create.magenta_seat": "ʇɐǝS ɐʇuǝbɐW", + "block.create.magenta_table_cloth": "ɥʇoןƆ ǝןqɐ⟘ ɐʇuǝbɐW", "block.create.magenta_toolbox": "xoqןoo⟘ ɐʇuǝbɐW", "block.create.magenta_valve_handle": "ǝןpuɐH ǝʌןɐΛ ɐʇuǝbɐW", "block.create.mangrove_window": "ʍopuıM ǝʌoɹbuɐW", @@ -596,10 +595,10 @@ "block.create.oak_window_pane": "ǝuɐԀ ʍopuıM ʞɐO", "block.create.ochrum": "ɯnɹɥɔO", "block.create.ochrum_pillar": "ɹɐןןıԀ ɯnɹɥɔO", - "block.create.orange_display_cloth": "ɥʇoןƆ ʎɐןdsıᗡ ǝbuɐɹO", "block.create.orange_postbox": "xoqʇsoԀ ǝbuɐɹO", "block.create.orange_sail": "ןıɐS ǝbuɐɹO", "block.create.orange_seat": "ʇɐǝS ǝbuɐɹO", + "block.create.orange_table_cloth": "ɥʇoןƆ ǝןqɐ⟘ ǝbuɐɹO", "block.create.orange_toolbox": "xoqןoo⟘ ǝbuɐɹO", "block.create.orange_valve_handle": "ǝןpuɐH ǝʌןɐΛ ǝbuɐɹO", "block.create.ornate_iron_window": "ʍopuıM uoɹI ǝʇɐuɹO", @@ -614,16 +613,14 @@ "block.create.package_frogport.tooltip.summary": "˙ɐsɹǝʌ ǝɔıʌ puɐ suıɐɥɔ ɯoɹɟ pǝʌoɯǝɹ ǝq ןןıʍ sǝbɐʞɔɐd buıɥɔʇɐW ˙I∩ uı ɹǝʇןıɟ ssǝɹppɐ ʇǝS ˙ssǝɹppɐ ɹıǝɥʇ uo pǝsɐq suıɐɥɔ ɯoɹɟ puɐ oʇ sǝbɐʞɔɐd sǝʌoW ˙ǝɔɐןd uǝɥʇ ʞuıן oʇ ɹoʎǝʌuoɔ uıɐɥɔ ɐ ʞɔıןƆ ]ɹǝpuod[", "block.create.package_postbox.tooltip.summary": "˙ɐsɹǝʌ ǝɔıʌ puɐ suıɐɹʇ ɯoɹɟ pǝʌoɯǝɹ ǝq ןןıʍ sǝbɐʞɔɐd buıɥɔʇɐW ˙I∩ uı ɹǝʇןıɟ ssǝɹppɐ ʇǝS ˙ssǝɹppɐ ɹıǝɥʇ uo pǝsɐq suıɐɹʇ ɯoɹɟ puɐ oʇ sǝbɐʞɔɐd sǝʌoW ˙ǝɔɐןd uǝɥʇ ʞuıן oʇ uoıʇɐʇs uıɐɹʇ ɐ ʞɔıןƆ ]ɹǝpuod[", "block.create.packager": "ɹǝbɐʞɔɐԀ", - "block.create.packager.tooltip.summary": "˙ʞɹoʍʇǝu sɔıʇsıboן ɐ oʇ sʇuǝʇuoɔ ʎɹoʇuǝʌuı ʇıɯqns oʇ ʞuıן ɹǝbɐʞɔɐd ɥɔɐʇʇɐ 'ʎןǝʌıʇɐuɹǝʇןⱯ ˙ssǝɹppɐ ʇǝbɹɐʇ ʎɟıɔǝds oʇ ubıs ɥɔɐʇʇⱯ ˙ǝuoʇspǝɹ uo ʎɹoʇuǝʌuı pǝɥɔɐʇʇɐ ɯoɹɟ sǝbɐʞɔɐd sǝʇɐǝɹƆ ]ɹǝpuod[", - "block.create.packager_link": "ʞuıꞀ ɹǝbɐʞɔɐԀ", - "block.create.packager_link.tooltip.summary": "suoıʇɐʇıɯıן ǝbuɐɹ oN ˙ʎɔuǝnbǝɹɟ ɹıǝɥʇ ǝɹɐɥs oʇ ʇuǝɯǝɔɐןd ǝɹoɟǝq sʞuıן ɹǝɥʇo ʞɔıןƆ ˙ɯoɹɟ ʇsǝnbǝɹ oʇ ǝןqɐןıɐʌɐ ʎɹoʇuǝʌuı ʇǝbɹɐʇ sʇı ǝʞɐɯ oʇ ɹǝbɐʞɔɐd oʇ ɥɔɐʇʇⱯ ]ɹǝpuod[", + "block.create.packager.tooltip.summary": "˙ʞɹoʍʇǝu sɔıʇsıboן ɐ oʇ sʇuǝʇuoɔ ʎɹoʇuǝʌuı ʇıɯqns oʇ ʞuıן ʞɔoʇs ɥɔɐʇʇɐ 'ʎןǝʌıʇɐuɹǝʇןⱯ ˙ssǝɹppɐ ʇǝbɹɐʇ ʎɟıɔǝds oʇ ubıs ɥɔɐʇʇⱯ ˙ǝuoʇspǝɹ uo ʎɹoʇuǝʌuı pǝɥɔɐʇʇɐ ɯoɹɟ sǝbɐʞɔɐd sǝʇɐǝɹƆ ]ɹǝpuod[", "block.create.peculiar_bell": "ןןǝᗺ ɹɐıןnɔǝԀ", "block.create.peculiar_bell.tooltip.summary": "˙˙˙sʇɔǝɟɟǝ-ǝpıs ǝʌɐɥ ʎɐɯ ‾ǝɹıℲ ןnoS‾ uǝdo ǝʌoqɐ ʇɥbıɹ ʇı buıɔɐןԀ ˙‾ןןǝᗺ ssɐɹᗺ‾ ǝʌıʇɐɹoɔǝp Ɐ", - "block.create.pink_display_cloth": "ɥʇoןƆ ʎɐןdsıᗡ ʞuıԀ", "block.create.pink_nixie_tube": "ǝqn⟘ ǝıxıN ʞuıԀ", "block.create.pink_postbox": "xoqʇsoԀ ʞuıԀ", "block.create.pink_sail": "ןıɐS ʞuıԀ", "block.create.pink_seat": "ʇɐǝS ʞuıԀ", + "block.create.pink_table_cloth": "ɥʇoןƆ ǝןqɐ⟘ ʞuıԀ", "block.create.pink_toolbox": "xoqןoo⟘ ʞuıԀ", "block.create.pink_valve_handle": "ǝןpuɐH ǝʌןɐΛ ʞuıԀ", "block.create.piston_extension_pole": "ǝןoԀ uoısuǝʇxƎ uoʇsıԀ", @@ -699,27 +696,27 @@ "block.create.pulse_repeater": "ɹǝʇɐǝdǝᴚ ǝsןnԀ", "block.create.pulse_timer": "ɹǝɯı⟘ ǝsןnԀ", "block.create.pulse_timer.tooltip.summary": "˙ןɐubıs ʇuɐʇsuoɔ ɐ ʎq pǝɹǝʍod sı ǝpıs ʇnduı ǝɥʇ ssǝןun sǝsןnd ǝuoʇspǝɹ sʇıɯǝ ʎןpǝʇɐǝdǝᴚ ˙ʇoןs ʇnduı ǝɥʇ buısn ʎɐןǝp ɐ ʇǝS ]ɹǝpuod[", - "block.create.purple_display_cloth": "ɥʇoןƆ ʎɐןdsıᗡ ǝןdɹnԀ", "block.create.purple_nixie_tube": "ǝqn⟘ ǝıxıN ǝןdɹnԀ", "block.create.purple_postbox": "xoqʇsoԀ ǝןdɹnԀ", "block.create.purple_sail": "ןıɐS ǝןdɹnԀ", "block.create.purple_seat": "ʇɐǝS ǝןdɹnԀ", + "block.create.purple_table_cloth": "ɥʇoןƆ ǝןqɐ⟘ ǝןdɹnԀ", "block.create.purple_toolbox": "xoqןoo⟘ ǝןdɹnԀ", "block.create.purple_valve_handle": "ǝןpuɐH ǝʌןɐΛ ǝןdɹnԀ", "block.create.radial_chassis": "sıssɐɥƆ ןɐıpɐᴚ", "block.create.railway_casing": "buısɐƆ uıɐɹ⟘", "block.create.raw_zinc_block": "ɔuıZ ʍɐᴚ ɟo ʞɔoןᗺ", - "block.create.red_display_cloth": "ɥʇoןƆ ʎɐןdsıᗡ pǝᴚ", "block.create.red_nixie_tube": "ǝqn⟘ ǝıxıN pǝᴚ", "block.create.red_postbox": "xoqʇsoԀ pǝᴚ", "block.create.red_sail": "ןıɐS pǝᴚ", "block.create.red_seat": "ʇɐǝS pǝᴚ", + "block.create.red_table_cloth": "ɥʇoןƆ ǝןqɐ⟘ pǝᴚ", "block.create.red_toolbox": "xoqןoo⟘ pǝᴚ", "block.create.red_valve_handle": "ǝןpuɐH ǝʌןɐΛ pǝᴚ", "block.create.redstone_contact": "ʇɔɐʇuoƆ ǝuoʇspǝᴚ", "block.create.redstone_link": "ʞuıꞀ ǝuoʇspǝᴚ", "block.create.redstone_requester": "ɹǝʇsǝnbǝᴚ ǝuoʇspǝᴚ", - "block.create.redstone_requester.tooltip.summary": "˙ʇuǝɯǝɔɐןd ǝɹoɟǝq ɹǝdǝǝʞ ʞɔoʇs ɐ ʇɐ pǝɹnbıɟuoɔ ǝq uɐɔ ʇsǝnbǝɹ sıɥʇ ʎןǝʌıʇɐuɹǝʇןⱯ ˙pǝʌıǝɔǝɹ sı ǝsןnd ǝuoʇspǝɹ ɐ uǝɥʍ ssǝɹppɐ uɐ oʇ pǝʇsǝnbǝɹ sɯǝʇı ʎɟıɔǝds oʇ I∩ uǝdO ˙ʎɔuǝnbǝɹɟ sʇı ǝsn oʇ ʇuǝɯǝɔɐןd ǝɹoɟǝq ʞuıן ɹǝbɐʞɔɐd ʞɔıןƆ ]ɹǝpuod[", + "block.create.redstone_requester.tooltip.summary": "˙ʇuǝɯǝɔɐןd ǝɹoɟǝq ɹǝdǝǝʞ ʞɔoʇs ɐ ʇɐ pǝɹnbıɟuoɔ ǝq uɐɔ ʇsǝnbǝɹ sıɥʇ ʎןǝʌıʇɐuɹǝʇןⱯ ˙pǝʌıǝɔǝɹ sı ǝsןnd ǝuoʇspǝɹ ɐ uǝɥʍ ssǝɹppɐ uɐ oʇ pǝʇsǝnbǝɹ sɯǝʇı ʎɟıɔǝds oʇ I∩ uǝdO ˙ʎɔuǝnbǝɹɟ sʇı ǝsn oʇ ʇuǝɯǝɔɐןd ǝɹoɟǝq ʞuıן ʞɔoʇs ʞɔıןƆ ]ɹǝpuod[", "block.create.refined_radiance_casing": "buısɐƆ ʇuɐıpɐᴚ", "block.create.rope": "ǝdoᴚ", "block.create.rope_pulley": "ʎǝןןnԀ ǝdoᴚ", @@ -816,10 +813,13 @@ "block.create.steam_whistle_extension": "uoısuǝʇxƎ ǝןʇsıɥM ɯɐǝʇS", "block.create.sticker": "ɹǝʞɔıʇS", "block.create.sticky_mechanical_piston": "uoʇsıԀ ןɐɔıuɐɥɔǝW ʎʞɔıʇS", + "block.create.stock_link": "ʞuıꞀ ʞɔoʇS", + "block.create.stock_link.tooltip.summary": "suoıʇɐʇıɯıן ǝbuɐɹ oN ˙ʎɔuǝnbǝɹɟ ɹıǝɥʇ ǝɹɐɥs oʇ ʇuǝɯǝɔɐןd ǝɹoɟǝq sʞuıן ɹǝɥʇo ʞɔıןƆ ˙ɯoɹɟ ʇsǝnbǝɹ oʇ ǝןqɐןıɐʌɐ ʎɹoʇuǝʌuı ʇǝbɹɐʇ sʇı ǝʞɐɯ oʇ ɹǝbɐʞɔɐd oʇ ɥɔɐʇʇⱯ ]ɹǝpuod[", "block.create.stock_ticker": "ɹǝʞɔı⟘ ʞɔoʇS", - "block.create.stock_ticker.tooltip.summary": "˙sǝıɹobǝʇɐɔ oʇuı sɯǝʇı pǝʎɐןdsıp ǝsıuɐbɹo oʇ ʞɔoןq ɹǝʞɔıʇ ʞɔoʇs ǝɥʇ ʞɔıןƆ ˙ssǝɹppɐ uǝʌıb ɐ oʇ sɹǝbɐʞɔɐd pǝʞuıן ʎuɐ ɯoɹɟ sɯǝʇı ʇsǝnbǝɹ oʇ ʎʇıʇuǝ ǝɥʇ ʞɔıןƆ ˙ɹǝdǝǝʞ ʞɔoʇs sʇı sɐ ʇɐǝs ɐ uo ʎʇıʇuǝ ʇuǝɔɐظpɐ uɐ spǝǝN ˙ʎɔuǝnbǝɹɟ sʇı ǝsn oʇ ʇuǝɯǝɔɐןd ǝɹoɟǝq ʞuıן ɹǝbɐʞɔɐd ʞɔıןƆ ]ɹǝpuod[", + "block.create.stock_ticker.tooltip.summary": "˙sǝıɹobǝʇɐɔ oʇuı sɯǝʇı pǝʎɐןdsıp ǝsıuɐbɹo oʇ ʞɔoןq ɹǝʞɔıʇ ʞɔoʇs ǝɥʇ ʞɔıןƆ ˙ssǝɹppɐ uǝʌıb ɐ oʇ sɹǝbɐʞɔɐd pǝʞuıן ʎuɐ ɯoɹɟ sɯǝʇı ʇsǝnbǝɹ oʇ ʎʇıʇuǝ ǝɥʇ ʞɔıןƆ ˙ɹǝdǝǝʞ ʞɔoʇs sʇı sɐ ʇɐǝs ɐ uo ʎʇıʇuǝ ʇuǝɔɐظpɐ uɐ spǝǝN ˙ʎɔuǝnbǝɹɟ sʇı ǝsn oʇ ʇuǝɯǝɔɐןd ǝɹoɟǝq ʞuıן ʞɔoʇs ʞɔıןƆ ]ɹǝpuod[", "block.create.stockpile_switch": "ɥɔʇıʍS pןoɥsǝɹɥ⟘", "block.create.stressometer": "ɹǝʇǝɯossǝɹʇS", + "block.create.table_cloth.tooltip.summary": "˙ɥʇoןɔ ǝןqɐʇ pǝɹnbıɟuoɔ ǝɥʇ buıɔɐןd ɹǝʇɟɐ pǝıɟıɔǝds ǝq uɐɔ ʇsoɔ ǝɥ⟘ ˙sɹǝʎɐןd ɹǝɥʇo ʎq pǝsɐɥɔɹnd ǝq uɐɔ ʇɐɥʇ ʞɹoʍʇǝu ɹnoʎ ɯoɹɟ ʇsǝnbǝɹ ɐ ʎɟıɔǝds 'ɹǝdǝǝʞ ʞɔoʇs ɐ uo pǝsn uǝɥʍ 'ʎןǝʌıʇɐuɹǝʇןⱯ ˙ɯǝɥʇ ʎɐןdsıp oʇ ɯǝʇı ɥʇıʍ ʞɔıןɔ 'uoıʇɐɹoɔǝp ɹoɟ pǝsn ǝq uɐƆ ]ɹǝpuod[", "block.create.tiled_glass": "ssɐן⅁ pǝןı⟘", "block.create.tiled_glass_pane": "ǝuɐԀ ssɐן⅁ pǝןı⟘", "block.create.toolbox.tooltip.behaviour1": "˙‾sʇuǝʇuoƆ‾ ʎɹoʇuǝʌuI ‾suıɐʇǝᴚ‾", @@ -877,21 +877,21 @@ "block.create.weathered_copper_tile_stairs": "sɹıɐʇS ǝןı⟘ ɹǝddoƆ pǝɹǝɥʇɐǝM", "block.create.weathered_copper_tiles": "sǝןı⟘ ɹǝddoƆ pǝɹǝɥʇɐǝM", "block.create.weighted_ejector": "ɹoʇɔǝظƎ pǝʇɥbıǝM", - "block.create.white_display_cloth": "ɥʇoןƆ ʎɐןdsıᗡ ǝʇıɥM", "block.create.white_nixie_tube": "ǝqn⟘ ǝıxıN ǝʇıɥM", "block.create.white_postbox": "xoqʇsoԀ ǝʇıɥM", "block.create.white_sail": "ןıɐS ןןıɯpuıM", "block.create.white_seat": "ʇɐǝS ǝʇıɥM", + "block.create.white_table_cloth": "ɥʇoןƆ ǝןqɐ⟘ ǝʇıɥM", "block.create.white_toolbox": "xoqןoo⟘ ǝʇıɥM", "block.create.white_valve_handle": "ǝןpuɐH ǝʌןɐΛ ǝʇıɥM", "block.create.windmill_bearing": "buıɹɐǝᗺ ןןıɯpuıM", "block.create.wooden_bracket": "ʇǝʞɔɐɹᗺ uǝpooM", "block.create.wooden_bracket.tooltip.summary": "˙ʇuǝɯǝɔɹoɟuıǝɹ ɟo ʇıq uǝpooʍ puɐ ʎzoɔ ɐ ɥʇıʍ ‾sǝdıԀ‾ puɐ ‾sןǝǝɥʍboƆ 'sʇɟɐɥS‾ ɹnoʎ ‾ǝʇɐɹoɔǝᗡ‾", - "block.create.yellow_display_cloth": "ɥʇoןƆ ʎɐןdsıᗡ ʍoןןǝʎ", "block.create.yellow_nixie_tube": "ǝqn⟘ ǝıxıN ʍoןןǝʎ", "block.create.yellow_postbox": "xoqʇsoԀ ʍoןןǝʎ", "block.create.yellow_sail": "ןıɐS ʍoןןǝʎ", "block.create.yellow_seat": "ʇɐǝS ʍoןןǝʎ", + "block.create.yellow_table_cloth": "ɥʇoןƆ ǝןqɐ⟘ ʍoןןǝʎ", "block.create.yellow_toolbox": "xoqןoo⟘ ʍoןןǝʎ", "block.create.yellow_valve_handle": "ǝןpuɐH ǝʌןɐΛ ʍoןןǝʎ", "block.create.zinc_block": "ɔuıZ ɟo ʞɔoןᗺ", @@ -1114,7 +1114,7 @@ "create.factory_panel.some_links_unloaded": "pǝpɐoן ʇou ǝɹɐ sʞuıן ǝɯoS", "create.factory_panel.target_amount": "ǝbɐɹoʇS uı ʇunoɯⱯ ʇǝbɹɐ⟘", "create.factory_panel.too_far_apart": "ɹǝɥʇo ɥɔɐǝ ɯoɹɟ ʎɐʍɐ ɹɐɟ ooʇ ǝɹɐ sןǝuɐԀ", - "create.factory_panel.tune_before_placing": "buıɔɐןd ǝɹoɟǝq ɹǝʇʇıɯsuɐɹʇ ɐ oʇ ǝun⟘", + "create.factory_panel.tune_before_placing": "buıɔɐןd ǝɹoɟǝq ʞuıן ʞɔoʇs ɐ oʇ ǝun⟘", "create.flap_display.cycles.alphabet": "Z؛ʎ؛X؛Λ؛∩؛⟘؛S؛ᴚ؛Ὁ؛Ԁ؛O؛N؛W؛Ꞁ؛ʞ؛ſ؛I؛H؛⅁؛Ⅎ؛Ǝ؛ᗡ؛Ɔ؛ᗺ؛Ɐ؛ ", "create.flap_display.cycles.arrival_time": "sϛㄣ؛s0Ɛ؛sϛƖ؛ʍou؛uıɯ ؛ ", "create.flap_display.cycles.fluid_units": " ᗺ؛ᗺɯ", @@ -1247,7 +1247,7 @@ "create.gui.package_port.catch_packages": "˙˙˙oʇ pǝssǝɹppɐ sǝbɐʞɔɐd ɥɔʇɐƆ", "create.gui.package_port.catch_packages_empty": "pǝssǝɹppɐ-uou ɥɔʇɐɯ oʇ ʎʇdɯǝ ǝʌɐǝꞀ", "create.gui.package_port.catch_packages_wildcard": "pɹɐɔpןıʍ ʇxǝʇ ɐ sɐ * ǝs∩", - "create.gui.package_port.not_targeting_anything": "buıɥʇʎuɐ buıʇǝbɹɐʇ ʇou sı ʇɹod ǝbɐʞɔɐԀ", + "create.gui.package_port.not_targeting_anything": "pǝʇɔǝןǝs ʇǝbɹɐʇ oN", "create.gui.package_port.send_and_receive": "sǝbɐʞɔɐd ǝʌıǝɔǝɹ puɐ puǝS", "create.gui.package_port.send_only": "sǝbɐʞɔɐd puǝs ʎןuO", "create.gui.redstone_requester.allow_partial": "sɹǝpɹo ןɐıʇɹɐd ʍoןןⱯ", @@ -1493,12 +1493,12 @@ "create.linked_controller.frequency_slot_2": "ᄅ# ˙bǝɹℲ '%1$s :puıqʎǝʞ", "create.linked_controller.key_bound": "%1$s oʇ punoq ʎɔuǝnbǝɹℲ", "create.linked_controller.press_keybind": "ʎǝʞ ǝʌıʇɔǝdsǝɹ ǝɥʇ oʇ ʎɔuǝnbǝɹɟ sıɥʇ puıq oʇ '%6$s ɹo %5$s '%4$s '%3$s '%2$s '%1$s ssǝɹԀ", - "create.logistically_linked.connected": "ʎןןnɟssǝɔɔns sɹǝʇʇıɯsuɐɹ⟘ ɹǝɥʇo oʇ pǝʇɔǝuuoƆ", - "create.logistically_linked.new_network_started": "pǝʇɹɐʇs ʞɹoʍʇǝu ɹǝʇʇıɯsuɐɹʇ ʍǝN", + "create.logistically_linked.connected": "ʎןןnɟssǝɔɔns ʞɹoʍʇǝu buıʇsıxǝ oʇ pǝʇɔǝuuoƆ", + "create.logistically_linked.new_network_started": "pǝʇɹɐʇs ʞɹoʍʇǝu ʞuıן ʍǝN", "create.logistically_linked.protected": "pǝʇɔǝʇoɹԀ sı ʞɹoʍʇǝN sɔıʇsıboꞀ", "create.logistically_linked.tooltip": "pǝɹnbıɟuoɔ ʎɔuǝnbǝɹℲ", "create.logistically_linked.tooltip_clear": "ʇǝsǝɹ oʇ pıɹb buıʇɟɐɹɔ uı ǝɔɐןԀ", - "create.logistically_linked.tuned": "ɹǝʇʇıɯsuɐɹʇ sıɥʇ oʇ pǝun⟘", + "create.logistically_linked.tuned": "ʞuıן sıɥʇ oʇ pǝun⟘", "create.logistics.crafter.click_to_merge": "sǝıɹoʇuǝʌuI ǝbɹǝɯ oʇ ʞɔıןƆ", "create.logistics.crafter.click_to_separate": "sǝıɹoʇuǝʌuI ǝʇɐɹɐdǝs oʇ ʞɔıןƆ", "create.logistics.crafter.connected": "sɹǝʇɟɐɹƆ pǝʇɔǝuuoƆ", @@ -2950,7 +2950,6 @@ "item.create.cardboard_package_10x8": "ǝbɐʞɔɐԀ pɹɐoqpɹɐƆ", "item.create.cardboard_package_12x10": "ǝbɐʞɔɐԀ pɹɐoqpɹɐƆ", "item.create.cardboard_package_12x12": "ǝbɐʞɔɐԀ pɹɐoqpɹɐƆ", - "item.create.cardboard_pulp": "dןnԀ pɹɐoqpɹɐƆ", "item.create.cardboard_sword": "pɹoʍS pɹɐoqpɹɐƆ", "item.create.cardboard_sword.tooltip.summary": "˙ǝɔıoɥɔ ɟo uodɐǝʍ ןnɟɹǝʍod ʇǝʎ '‾ssǝןɯɹɐɥ‾ ‾ʎןʇsoɯ‾ Ɐ ˙ʞuoᗺ", "item.create.chest_minecart_contraption": "uoıʇdɐɹʇuoƆ ʇɹɐɔǝuıW ʇsǝɥƆ", @@ -3079,6 +3078,7 @@ "item.create.powdered_obsidian": "uɐıpısqO pǝɹǝpʍoԀ", "item.create.precision_mechanism": "ɯsıuɐɥɔǝW uoısıɔǝɹԀ", "item.create.propeller": "ɹǝןןǝdoɹԀ", + "item.create.pulp": "dןnԀ", "item.create.raw_zinc": "ɔuıZ ʍɐᴚ", "item.create.red_sand_paper": "ɹǝdɐԀ puɐS pǝᴚ", "item.create.refined_radiance": "ǝɔuɐıpɐᴚ pǝuıɟǝᴚ", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index c9f1097921..c77cec505d 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -193,7 +193,6 @@ "block.create.andesite_bars": "Andesite Bars", "block.create.andesite_belt_funnel": "Andesite Belt Funnel", "block.create.andesite_casing": "Andesite Casing", - "block.create.andesite_display_cloth": "Andesite Display Cloth", "block.create.andesite_door": "Andesite Door", "block.create.andesite_encased_cogwheel": "Andesite Encased Cogwheel", "block.create.andesite_encased_large_cogwheel": "Andesite Encased Large Cogwheel", @@ -202,6 +201,7 @@ "block.create.andesite_ladder": "Andesite Ladder", "block.create.andesite_pillar": "Andesite Pillar", "block.create.andesite_scaffolding": "Andesite Scaffolding", + "block.create.andesite_table_cloth": "Andesite Table Cloth", "block.create.andesite_tunnel": "Andesite Tunnel", "block.create.asurine": "Asurine", "block.create.asurine_pillar": "Asurine Pillar", @@ -211,19 +211,19 @@ "block.create.belt": "Belt", "block.create.birch_window": "Birch Window", "block.create.birch_window_pane": "Birch Window Pane", - "block.create.black_display_cloth": "Black Display Cloth", "block.create.black_nixie_tube": "Black Nixie Tube", "block.create.black_postbox": "Black Postbox", "block.create.black_sail": "Black Sail", "block.create.black_seat": "Black Seat", + "block.create.black_table_cloth": "Black Table Cloth", "block.create.black_toolbox": "Black Toolbox", "block.create.black_valve_handle": "Black Valve Handle", "block.create.blaze_burner": "Blaze Burner", - "block.create.blue_display_cloth": "Blue Display Cloth", "block.create.blue_nixie_tube": "Blue Nixie Tube", "block.create.blue_postbox": "Blue Postbox", "block.create.blue_sail": "Blue Sail", "block.create.blue_seat": "Blue Seat", + "block.create.blue_table_cloth": "Blue Table Cloth", "block.create.blue_toolbox": "Blue Toolbox", "block.create.blue_valve_handle": "Blue Valve Handle", "block.create.bound_cardboard_block": "Bound block of Cardboard", @@ -231,7 +231,6 @@ "block.create.brass_belt_funnel": "Brass Belt Funnel", "block.create.brass_block": "Block of Brass", "block.create.brass_casing": "Brass Casing", - "block.create.brass_display_cloth": "Brass Display Cloth", "block.create.brass_door": "Brass Door", "block.create.brass_encased_cogwheel": "Brass Encased Cogwheel", "block.create.brass_encased_large_cogwheel": "Brass Encased Large Cogwheel", @@ -239,12 +238,13 @@ "block.create.brass_funnel": "Brass Funnel", "block.create.brass_ladder": "Brass Ladder", "block.create.brass_scaffolding": "Brass Scaffolding", + "block.create.brass_table_cloth": "Brass Table Cloth", "block.create.brass_tunnel": "Brass Tunnel", - "block.create.brown_display_cloth": "Brown Display Cloth", "block.create.brown_nixie_tube": "Brown Nixie Tube", "block.create.brown_postbox": "Brown Postbox", "block.create.brown_sail": "Brown Sail", "block.create.brown_seat": "Brown Seat", + "block.create.brown_table_cloth": "Brown Table Cloth", "block.create.brown_toolbox": "Brown Toolbox", "block.create.brown_valve_handle": "Brown Valve Handle", "block.create.calcite_pillar": "Calcite Pillar", @@ -273,13 +273,13 @@ "block.create.copper_backtank": "Copper Backtank", "block.create.copper_bars": "Copper Bars", "block.create.copper_casing": "Copper Casing", - "block.create.copper_display_cloth": "Copper Display Cloth", "block.create.copper_door": "Copper Door", "block.create.copper_ladder": "Copper Ladder", "block.create.copper_scaffolding": "Copper Scaffolding", "block.create.copper_shingle_slab": "Copper Shingle Slab", "block.create.copper_shingle_stairs": "Copper Shingle Stairs", "block.create.copper_shingles": "Copper Shingles", + "block.create.copper_table_cloth": "Copper Table Cloth", "block.create.copper_tile_slab": "Copper Tile Slab", "block.create.copper_tile_stairs": "Copper Tile Stairs", "block.create.copper_tiles": "Copper Tiles", @@ -424,11 +424,11 @@ "block.create.cut_veridium_slab": "Cut Veridium Slab", "block.create.cut_veridium_stairs": "Cut Veridium Stairs", "block.create.cut_veridium_wall": "Cut Veridium Wall", - "block.create.cyan_display_cloth": "Cyan Display Cloth", "block.create.cyan_nixie_tube": "Cyan Nixie Tube", "block.create.cyan_postbox": "Cyan Postbox", "block.create.cyan_sail": "Cyan Sail", "block.create.cyan_seat": "Cyan Seat", + "block.create.cyan_table_cloth": "Cyan Table Cloth", "block.create.cyan_toolbox": "Cyan Toolbox", "block.create.cyan_valve_handle": "Cyan Valve Handle", "block.create.dark_oak_window": "Dark Oak Window", @@ -443,7 +443,6 @@ "block.create.desk_bell.tooltip.summary": "Ring for Service! Emits a _redstone signal_ when activated.", "block.create.diorite_pillar": "Diorite Pillar", "block.create.display_board": "Display Board", - "block.create.display_cloth.tooltip.summary": "[ponder] Can be used for decoration, click with item to display them. Alternatively, when used on a stock keeper, specify a request from your network that can be purchased by other players. The cost can be specified after placing the configured display cloth.", "block.create.display_link": "Display Link", "block.create.dripstone_pillar": "Dripstone Pillar", "block.create.elevator_contact": "Elevator Contact", @@ -458,12 +457,12 @@ "block.create.exposed_copper_tile_slab": "Exposed Copper Tile Slab", "block.create.exposed_copper_tile_stairs": "Exposed Copper Tile Stairs", "block.create.exposed_copper_tiles": "Exposed Copper Tiles", - "block.create.factory_panel": "Factory Panel", - "block.create.factory_panel.tooltip.behaviour1": "Restocker mode: Panel requests items from the network to the specified address until the target amount is in the container. Short click the panel to set an address.", - "block.create.factory_panel.tooltip.behaviour2": "Recipe mode: Panel requests ingredients to an address until the target amounted of the output item is found on the network (e.g. Send 1 Log to 'saw' and expect 6 Planks, until at least 64 Planks on network). Short click the panel to set an address and connect other panels as input items. Panels specifying an output item can also be reused as an input for other panels.", - "block.create.factory_panel.tooltip.condition1": "When attached to Packager", - "block.create.factory_panel.tooltip.condition2": "When not attached to Packager", - "block.create.factory_panel.tooltip.summary": "[ponder] Click packager link before placement to use its frequency. Place item to monitor in filter slot. Hold click to specify a target amount to maintain in storage.", + "block.create.factory_gauge": "Factory Gauge", + "block.create.factory_gauge.tooltip.behaviour1": "Restocker mode: Panel requests items from the network to the specified address until the target amount is in the container. Short click the panel to set an address.", + "block.create.factory_gauge.tooltip.behaviour2": "Recipe mode: Panel requests ingredients to an address until the target amounted of the output item is found on the network (e.g. Send 1 Log to 'saw' and expect 6 Planks, until at least 64 Planks on network). Short click the panel to set an address and connect other panels as input items. Panels specifying an output item can also be reused as an input for other panels.", + "block.create.factory_gauge.tooltip.condition1": "When attached to Packager", + "block.create.factory_gauge.tooltip.condition2": "When not attached to Packager", + "block.create.factory_gauge.tooltip.summary": "[ponder] Click stock link before placement to use its frequency. Place item to monitor in filter slot. Hold click to specify a target amount to maintain in storage.", "block.create.fake_track": "Track Marker for Maps", "block.create.fluid_pipe": "Fluid Pipe", "block.create.fluid_tank": "Fluid Tank", @@ -482,18 +481,18 @@ "block.create.gearshift": "Gearshift", "block.create.glass_fluid_pipe": "Glass Fluid Pipe", "block.create.granite_pillar": "Granite Pillar", - "block.create.gray_display_cloth": "Gray Display Cloth", "block.create.gray_nixie_tube": "Gray Nixie Tube", "block.create.gray_postbox": "Gray Postbox", "block.create.gray_sail": "Gray Sail", "block.create.gray_seat": "Gray Seat", + "block.create.gray_table_cloth": "Gray Table Cloth", "block.create.gray_toolbox": "Gray Toolbox", "block.create.gray_valve_handle": "Gray Valve Handle", - "block.create.green_display_cloth": "Green Display Cloth", "block.create.green_nixie_tube": "Green Nixie Tube", "block.create.green_postbox": "Green Postbox", "block.create.green_sail": "Green Sail", "block.create.green_seat": "Green Seat", + "block.create.green_table_cloth": "Green Table Cloth", "block.create.green_toolbox": "Green Toolbox", "block.create.green_valve_handle": "Green Valve Handle", "block.create.hand_crank": "Hand Crank", @@ -534,36 +533,36 @@ "block.create.layered_tuff": "Layered Tuff", "block.create.layered_veridium": "Layered Veridium", "block.create.lectern_controller": "Lectern Controller", - "block.create.light_blue_display_cloth": "Light Blue Display Cloth", "block.create.light_blue_nixie_tube": "Light Blue Nixie Tube", "block.create.light_blue_postbox": "Light Blue Postbox", "block.create.light_blue_sail": "Light Blue Sail", "block.create.light_blue_seat": "Light Blue Seat", + "block.create.light_blue_table_cloth": "Light Blue Table Cloth", "block.create.light_blue_toolbox": "Light Blue Toolbox", "block.create.light_blue_valve_handle": "Light Blue Valve Handle", - "block.create.light_gray_display_cloth": "Light Gray Display Cloth", "block.create.light_gray_nixie_tube": "Light Gray Nixie Tube", "block.create.light_gray_postbox": "Light Gray Postbox", "block.create.light_gray_sail": "Light Gray Sail", "block.create.light_gray_seat": "Light Gray Seat", + "block.create.light_gray_table_cloth": "Light Gray Table Cloth", "block.create.light_gray_toolbox": "Light Gray Toolbox", "block.create.light_gray_valve_handle": "Light Gray Valve Handle", - "block.create.lime_display_cloth": "Lime Display Cloth", "block.create.lime_nixie_tube": "Lime Nixie Tube", "block.create.lime_postbox": "Lime Postbox", "block.create.lime_sail": "Lime Sail", "block.create.lime_seat": "Lime Seat", + "block.create.lime_table_cloth": "Lime Table Cloth", "block.create.lime_toolbox": "Lime Toolbox", "block.create.lime_valve_handle": "Lime Valve Handle", "block.create.limestone": "Limestone", "block.create.limestone_pillar": "Limestone Pillar", "block.create.linear_chassis": "Linear Chassis", "block.create.lit_blaze_burner": "Lit Blaze Burner", - "block.create.magenta_display_cloth": "Magenta Display Cloth", "block.create.magenta_nixie_tube": "Magenta Nixie Tube", "block.create.magenta_postbox": "Magenta Postbox", "block.create.magenta_sail": "Magenta Sail", "block.create.magenta_seat": "Magenta Seat", + "block.create.magenta_table_cloth": "Magenta Table Cloth", "block.create.magenta_toolbox": "Magenta Toolbox", "block.create.magenta_valve_handle": "Magenta Valve Handle", "block.create.mangrove_window": "Mangrove Window", @@ -596,10 +595,10 @@ "block.create.oak_window_pane": "Oak Window Pane", "block.create.ochrum": "Ochrum", "block.create.ochrum_pillar": "Ochrum Pillar", - "block.create.orange_display_cloth": "Orange Display Cloth", "block.create.orange_postbox": "Orange Postbox", "block.create.orange_sail": "Orange Sail", "block.create.orange_seat": "Orange Seat", + "block.create.orange_table_cloth": "Orange Table Cloth", "block.create.orange_toolbox": "Orange Toolbox", "block.create.orange_valve_handle": "Orange Valve Handle", "block.create.ornate_iron_window": "Ornate Iron Window", @@ -614,16 +613,14 @@ "block.create.package_frogport.tooltip.summary": "[ponder] Click a chain conveyor to link then place. Moves packages to and from chains based on their address. Set address filter in UI. Matching packages will be removed from chains and vice versa.", "block.create.package_postbox.tooltip.summary": "[ponder] Click a train station to link then place. Moves packages to and from trains based on their address. Set address filter in UI. Matching packages will be removed from trains and vice versa.", "block.create.packager": "Packager", - "block.create.packager.tooltip.summary": "[ponder] Creates packages from attached inventory on redstone. Attach sign to specify target address. Alternatively, attach packager link to submit inventory contents to a logistics network.", - "block.create.packager_link": "Packager Link", - "block.create.packager_link.tooltip.summary": "[ponder] Attach to packager to make its target inventory available to request from. Click other links before placement to share their frequency. No range limitations", + "block.create.packager.tooltip.summary": "[ponder] Creates packages from attached inventory on redstone. Attach sign to specify target address. Alternatively, attach stock link to submit inventory contents to a logistics network.", "block.create.peculiar_bell": "Peculiar Bell", "block.create.peculiar_bell.tooltip.summary": "A decorative _Brass Bell_. Placing it right above open _Soul Fire_ may have side-effects...", - "block.create.pink_display_cloth": "Pink Display Cloth", "block.create.pink_nixie_tube": "Pink Nixie Tube", "block.create.pink_postbox": "Pink Postbox", "block.create.pink_sail": "Pink Sail", "block.create.pink_seat": "Pink Seat", + "block.create.pink_table_cloth": "Pink Table Cloth", "block.create.pink_toolbox": "Pink Toolbox", "block.create.pink_valve_handle": "Pink Valve Handle", "block.create.piston_extension_pole": "Piston Extension Pole", @@ -699,27 +696,27 @@ "block.create.pulse_repeater": "Pulse Repeater", "block.create.pulse_timer": "Pulse Timer", "block.create.pulse_timer.tooltip.summary": "[ponder] Set a delay using the input slot. Repeatedly emits redstone pulses unless the input side is powered by a constant signal.", - "block.create.purple_display_cloth": "Purple Display Cloth", "block.create.purple_nixie_tube": "Purple Nixie Tube", "block.create.purple_postbox": "Purple Postbox", "block.create.purple_sail": "Purple Sail", "block.create.purple_seat": "Purple Seat", + "block.create.purple_table_cloth": "Purple Table Cloth", "block.create.purple_toolbox": "Purple Toolbox", "block.create.purple_valve_handle": "Purple Valve Handle", "block.create.radial_chassis": "Radial Chassis", "block.create.railway_casing": "Train Casing", "block.create.raw_zinc_block": "Block of Raw Zinc", - "block.create.red_display_cloth": "Red Display Cloth", "block.create.red_nixie_tube": "Red Nixie Tube", "block.create.red_postbox": "Red Postbox", "block.create.red_sail": "Red Sail", "block.create.red_seat": "Red Seat", + "block.create.red_table_cloth": "Red Table Cloth", "block.create.red_toolbox": "Red Toolbox", "block.create.red_valve_handle": "Red Valve Handle", "block.create.redstone_contact": "Redstone Contact", "block.create.redstone_link": "Redstone Link", "block.create.redstone_requester": "Redstone Requester", - "block.create.redstone_requester.tooltip.summary": "[ponder] Click packager link before placement to use its frequency. Open UI to specify items requested to an address when a redstone pulse is received. Alternatively this request can be configured at a stock keeper before placement.", + "block.create.redstone_requester.tooltip.summary": "[ponder] Click stock link before placement to use its frequency. Open UI to specify items requested to an address when a redstone pulse is received. Alternatively this request can be configured at a stock keeper before placement.", "block.create.refined_radiance_casing": "Radiant Casing", "block.create.rope": "Rope", "block.create.rope_pulley": "Rope Pulley", @@ -816,10 +813,13 @@ "block.create.steam_whistle_extension": "Steam Whistle Extension", "block.create.sticker": "Sticker", "block.create.sticky_mechanical_piston": "Sticky Mechanical Piston", + "block.create.stock_link": "Stock Link", + "block.create.stock_link.tooltip.summary": "[ponder] Attach to packager to make its target inventory available to request from. Click other links before placement to share their frequency. No range limitations", "block.create.stock_ticker": "Stock Ticker", - "block.create.stock_ticker.tooltip.summary": "[ponder] Click packager link before placement to use its frequency. Needs an adjacent entity on a seat as its stock keeper. Click the entity to request items from any linked packagers to a given address. Click the stock ticker block to organise displayed items into categories.", + "block.create.stock_ticker.tooltip.summary": "[ponder] Click stock link before placement to use its frequency. Needs an adjacent entity on a seat as its stock keeper. Click the entity to request items from any linked packagers to a given address. Click the stock ticker block to organise displayed items into categories.", "block.create.stockpile_switch": "Threshold Switch", "block.create.stressometer": "Stressometer", + "block.create.table_cloth.tooltip.summary": "[ponder] Can be used for decoration, click with item to display them. Alternatively, when used on a stock keeper, specify a request from your network that can be purchased by other players. The cost can be specified after placing the configured table cloth.", "block.create.tiled_glass": "Tiled Glass", "block.create.tiled_glass_pane": "Tiled Glass Pane", "block.create.toolbox.tooltip.behaviour1": "_Retains_ Inventory _Contents_.", @@ -877,21 +877,21 @@ "block.create.weathered_copper_tile_stairs": "Weathered Copper Tile Stairs", "block.create.weathered_copper_tiles": "Weathered Copper Tiles", "block.create.weighted_ejector": "Weighted Ejector", - "block.create.white_display_cloth": "White Display Cloth", "block.create.white_nixie_tube": "White Nixie Tube", "block.create.white_postbox": "White Postbox", "block.create.white_sail": "Windmill Sail", "block.create.white_seat": "White Seat", + "block.create.white_table_cloth": "White Table Cloth", "block.create.white_toolbox": "White Toolbox", "block.create.white_valve_handle": "White Valve Handle", "block.create.windmill_bearing": "Windmill Bearing", "block.create.wooden_bracket": "Wooden Bracket", "block.create.wooden_bracket.tooltip.summary": "_Decorate_ your _Shafts, Cogwheels_ and _Pipes_ with a cozy and wooden bit of reinforcement.", - "block.create.yellow_display_cloth": "Yellow Display Cloth", "block.create.yellow_nixie_tube": "Yellow Nixie Tube", "block.create.yellow_postbox": "Yellow Postbox", "block.create.yellow_sail": "Yellow Sail", "block.create.yellow_seat": "Yellow Seat", + "block.create.yellow_table_cloth": "Yellow Table Cloth", "block.create.yellow_toolbox": "Yellow Toolbox", "block.create.yellow_valve_handle": "Yellow Valve Handle", "block.create.zinc_block": "Block of Zinc", @@ -1114,7 +1114,7 @@ "create.factory_panel.some_links_unloaded": "Some links are not loaded", "create.factory_panel.target_amount": "Target Amount in Storage", "create.factory_panel.too_far_apart": "Panels are too far away from each other", - "create.factory_panel.tune_before_placing": "Tune to a transmitter before placing", + "create.factory_panel.tune_before_placing": "Tune to a stock link before placing", "create.flap_display.cycles.alphabet": " ;A;B;C;D;E;F;G;H;I;J;K;L;M;N;O;P;Q;R;S;T;U;V;X;Y;Z", "create.flap_display.cycles.arrival_time": " ; min;now;15s;30s;45s", "create.flap_display.cycles.fluid_units": "mB;B ", @@ -1247,7 +1247,7 @@ "create.gui.package_port.catch_packages": "Catch packages addressed to...", "create.gui.package_port.catch_packages_empty": "Leave empty to match non-addressed", "create.gui.package_port.catch_packages_wildcard": "Use * as a text wildcard", - "create.gui.package_port.not_targeting_anything": "Package port is not targeting anything", + "create.gui.package_port.not_targeting_anything": "No target selected", "create.gui.package_port.send_and_receive": "Send and receive packages", "create.gui.package_port.send_only": "Only send packages", "create.gui.redstone_requester.allow_partial": "Allow partial orders", @@ -1493,12 +1493,12 @@ "create.linked_controller.frequency_slot_2": "Keybind: %1$s, Freq. #2", "create.linked_controller.key_bound": "Frequency bound to %1$s", "create.linked_controller.press_keybind": "Press %1$s, %2$s, %3$s, %4$s, %5$s or %6$s, to bind this frequency to the respective key", - "create.logistically_linked.connected": "Connected to other Transmitters successfully", - "create.logistically_linked.new_network_started": "New transmitter network started", + "create.logistically_linked.connected": "Connected to existing network successfully", + "create.logistically_linked.new_network_started": "New link network started", "create.logistically_linked.protected": "Logistics Network is Protected", "create.logistically_linked.tooltip": "Frequency configured", "create.logistically_linked.tooltip_clear": "Place in crafting grid to reset", - "create.logistically_linked.tuned": "Tuned to this transmitter", + "create.logistically_linked.tuned": "Tuned to this link", "create.logistics.crafter.click_to_merge": "Click to merge Inventories", "create.logistics.crafter.click_to_separate": "Click to separate Inventories", "create.logistics.crafter.connected": "Connected Crafters", @@ -2950,7 +2950,6 @@ "item.create.cardboard_package_10x8": "Cardboard Package", "item.create.cardboard_package_12x10": "Cardboard Package", "item.create.cardboard_package_12x12": "Cardboard Package", - "item.create.cardboard_pulp": "Cardboard Pulp", "item.create.cardboard_sword": "Cardboard Sword", "item.create.cardboard_sword.tooltip.summary": "Bonk. A _mostly_ _harmless_, yet powerful weapon of choice.", "item.create.chest_minecart_contraption": "Chest Minecart Contraption", @@ -3079,6 +3078,7 @@ "item.create.powdered_obsidian": "Powdered Obsidian", "item.create.precision_mechanism": "Precision Mechanism", "item.create.propeller": "Propeller", + "item.create.pulp": "Pulp", "item.create.raw_zinc": "Raw Zinc", "item.create.red_sand_paper": "Red Sand Paper", "item.create.refined_radiance": "Refined Radiance", diff --git a/src/generated/resources/assets/create/models/block/andesite_display_cloth.json b/src/generated/resources/assets/create/models/block/andesite_display_cloth.json deleted file mode 100644 index c4fce81046..0000000000 --- a/src/generated/resources/assets/create/models/block/andesite_display_cloth.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/display_cloth/block", - "textures": { - "0": "create:block/display_cloth/andesite" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/andesite_table_cloth.json b/src/generated/resources/assets/create/models/block/andesite_table_cloth.json new file mode 100644 index 0000000000..04982e5c02 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/andesite_table_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/table_cloth/block", + "textures": { + "0": "create:block/table_cloth/andesite" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/black_display_cloth.json b/src/generated/resources/assets/create/models/block/black_display_cloth.json deleted file mode 100644 index 32cb26841c..0000000000 --- a/src/generated/resources/assets/create/models/block/black_display_cloth.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/display_cloth/block", - "textures": { - "0": "create:block/display_cloth/black" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/black_table_cloth.json b/src/generated/resources/assets/create/models/block/black_table_cloth.json new file mode 100644 index 0000000000..9221b40e52 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/black_table_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/table_cloth/block", + "textures": { + "0": "create:block/table_cloth/black" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/blue_display_cloth.json b/src/generated/resources/assets/create/models/block/blue_display_cloth.json deleted file mode 100644 index 9f92093212..0000000000 --- a/src/generated/resources/assets/create/models/block/blue_display_cloth.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/display_cloth/block", - "textures": { - "0": "create:block/display_cloth/blue" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/blue_table_cloth.json b/src/generated/resources/assets/create/models/block/blue_table_cloth.json new file mode 100644 index 0000000000..68064dfdf1 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/blue_table_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/table_cloth/block", + "textures": { + "0": "create:block/table_cloth/blue" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_display_cloth.json b/src/generated/resources/assets/create/models/block/brass_display_cloth.json deleted file mode 100644 index f97c2cd063..0000000000 --- a/src/generated/resources/assets/create/models/block/brass_display_cloth.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/display_cloth/block", - "textures": { - "0": "create:block/display_cloth/brass" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_table_cloth.json b/src/generated/resources/assets/create/models/block/brass_table_cloth.json new file mode 100644 index 0000000000..d209590f23 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/brass_table_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/table_cloth/block", + "textures": { + "0": "create:block/table_cloth/brass" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brown_display_cloth.json b/src/generated/resources/assets/create/models/block/brown_display_cloth.json deleted file mode 100644 index 0165cc7143..0000000000 --- a/src/generated/resources/assets/create/models/block/brown_display_cloth.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/display_cloth/block", - "textures": { - "0": "create:block/display_cloth/brown" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brown_table_cloth.json b/src/generated/resources/assets/create/models/block/brown_table_cloth.json new file mode 100644 index 0000000000..565a2631ff --- /dev/null +++ b/src/generated/resources/assets/create/models/block/brown_table_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/table_cloth/block", + "textures": { + "0": "create:block/table_cloth/brown" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/copper_display_cloth.json b/src/generated/resources/assets/create/models/block/copper_display_cloth.json deleted file mode 100644 index 3b1246118c..0000000000 --- a/src/generated/resources/assets/create/models/block/copper_display_cloth.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/display_cloth/block", - "textures": { - "0": "create:block/display_cloth/copper" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/copper_table_cloth.json b/src/generated/resources/assets/create/models/block/copper_table_cloth.json new file mode 100644 index 0000000000..85a080aa46 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/copper_table_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/table_cloth/block", + "textures": { + "0": "create:block/table_cloth/copper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/cyan_display_cloth.json b/src/generated/resources/assets/create/models/block/cyan_display_cloth.json deleted file mode 100644 index ed8319921c..0000000000 --- a/src/generated/resources/assets/create/models/block/cyan_display_cloth.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/display_cloth/block", - "textures": { - "0": "create:block/display_cloth/cyan" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/cyan_table_cloth.json b/src/generated/resources/assets/create/models/block/cyan_table_cloth.json new file mode 100644 index 0000000000..244f28041f --- /dev/null +++ b/src/generated/resources/assets/create/models/block/cyan_table_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/table_cloth/block", + "textures": { + "0": "create:block/table_cloth/cyan" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/gray_display_cloth.json b/src/generated/resources/assets/create/models/block/gray_display_cloth.json deleted file mode 100644 index df41d93c15..0000000000 --- a/src/generated/resources/assets/create/models/block/gray_display_cloth.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/display_cloth/block", - "textures": { - "0": "create:block/display_cloth/gray" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/gray_table_cloth.json b/src/generated/resources/assets/create/models/block/gray_table_cloth.json new file mode 100644 index 0000000000..8490fd85ed --- /dev/null +++ b/src/generated/resources/assets/create/models/block/gray_table_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/table_cloth/block", + "textures": { + "0": "create:block/table_cloth/gray" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/green_display_cloth.json b/src/generated/resources/assets/create/models/block/green_display_cloth.json deleted file mode 100644 index 7ec205fbc6..0000000000 --- a/src/generated/resources/assets/create/models/block/green_display_cloth.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/display_cloth/block", - "textures": { - "0": "create:block/display_cloth/green" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/green_table_cloth.json b/src/generated/resources/assets/create/models/block/green_table_cloth.json new file mode 100644 index 0000000000..654ac65e34 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/green_table_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/table_cloth/block", + "textures": { + "0": "create:block/table_cloth/green" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/light_blue_display_cloth.json b/src/generated/resources/assets/create/models/block/light_blue_display_cloth.json deleted file mode 100644 index d2cc0320df..0000000000 --- a/src/generated/resources/assets/create/models/block/light_blue_display_cloth.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/display_cloth/block", - "textures": { - "0": "create:block/display_cloth/light_blue" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/light_blue_table_cloth.json b/src/generated/resources/assets/create/models/block/light_blue_table_cloth.json new file mode 100644 index 0000000000..56847ef6cc --- /dev/null +++ b/src/generated/resources/assets/create/models/block/light_blue_table_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/table_cloth/block", + "textures": { + "0": "create:block/table_cloth/light_blue" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/light_gray_display_cloth.json b/src/generated/resources/assets/create/models/block/light_gray_display_cloth.json deleted file mode 100644 index 74a3723ff0..0000000000 --- a/src/generated/resources/assets/create/models/block/light_gray_display_cloth.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/display_cloth/block", - "textures": { - "0": "create:block/display_cloth/light_gray" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/light_gray_table_cloth.json b/src/generated/resources/assets/create/models/block/light_gray_table_cloth.json new file mode 100644 index 0000000000..c2d9dbfbfd --- /dev/null +++ b/src/generated/resources/assets/create/models/block/light_gray_table_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/table_cloth/block", + "textures": { + "0": "create:block/table_cloth/light_gray" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/lime_display_cloth.json b/src/generated/resources/assets/create/models/block/lime_display_cloth.json deleted file mode 100644 index 1b059a9307..0000000000 --- a/src/generated/resources/assets/create/models/block/lime_display_cloth.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/display_cloth/block", - "textures": { - "0": "create:block/display_cloth/lime" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/lime_table_cloth.json b/src/generated/resources/assets/create/models/block/lime_table_cloth.json new file mode 100644 index 0000000000..3b5e46589b --- /dev/null +++ b/src/generated/resources/assets/create/models/block/lime_table_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/table_cloth/block", + "textures": { + "0": "create:block/table_cloth/lime" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/magenta_display_cloth.json b/src/generated/resources/assets/create/models/block/magenta_display_cloth.json deleted file mode 100644 index 15b3ac900c..0000000000 --- a/src/generated/resources/assets/create/models/block/magenta_display_cloth.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/display_cloth/block", - "textures": { - "0": "create:block/display_cloth/magenta" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/magenta_table_cloth.json b/src/generated/resources/assets/create/models/block/magenta_table_cloth.json new file mode 100644 index 0000000000..400f011ec4 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/magenta_table_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/table_cloth/block", + "textures": { + "0": "create:block/table_cloth/magenta" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/orange_display_cloth.json b/src/generated/resources/assets/create/models/block/orange_display_cloth.json deleted file mode 100644 index d69cb111e4..0000000000 --- a/src/generated/resources/assets/create/models/block/orange_display_cloth.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/display_cloth/block", - "textures": { - "0": "create:block/display_cloth/orange" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/orange_table_cloth.json b/src/generated/resources/assets/create/models/block/orange_table_cloth.json new file mode 100644 index 0000000000..6a0ed67b57 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/orange_table_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/table_cloth/block", + "textures": { + "0": "create:block/table_cloth/orange" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/pink_display_cloth.json b/src/generated/resources/assets/create/models/block/pink_display_cloth.json deleted file mode 100644 index e93fc7db9d..0000000000 --- a/src/generated/resources/assets/create/models/block/pink_display_cloth.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/display_cloth/block", - "textures": { - "0": "create:block/display_cloth/pink" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/pink_table_cloth.json b/src/generated/resources/assets/create/models/block/pink_table_cloth.json new file mode 100644 index 0000000000..19f9c1958b --- /dev/null +++ b/src/generated/resources/assets/create/models/block/pink_table_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/table_cloth/block", + "textures": { + "0": "create:block/table_cloth/pink" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/purple_display_cloth.json b/src/generated/resources/assets/create/models/block/purple_display_cloth.json deleted file mode 100644 index 71dee5ed3f..0000000000 --- a/src/generated/resources/assets/create/models/block/purple_display_cloth.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/display_cloth/block", - "textures": { - "0": "create:block/display_cloth/purple" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/purple_table_cloth.json b/src/generated/resources/assets/create/models/block/purple_table_cloth.json new file mode 100644 index 0000000000..be140a0db7 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/purple_table_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/table_cloth/block", + "textures": { + "0": "create:block/table_cloth/purple" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/red_display_cloth.json b/src/generated/resources/assets/create/models/block/red_display_cloth.json deleted file mode 100644 index f22c642b56..0000000000 --- a/src/generated/resources/assets/create/models/block/red_display_cloth.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/display_cloth/block", - "textures": { - "0": "create:block/display_cloth/red" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/red_table_cloth.json b/src/generated/resources/assets/create/models/block/red_table_cloth.json new file mode 100644 index 0000000000..7800278c4e --- /dev/null +++ b/src/generated/resources/assets/create/models/block/red_table_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/table_cloth/block", + "textures": { + "0": "create:block/table_cloth/red" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/white_display_cloth.json b/src/generated/resources/assets/create/models/block/white_display_cloth.json deleted file mode 100644 index 4e18cf5c5e..0000000000 --- a/src/generated/resources/assets/create/models/block/white_display_cloth.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/display_cloth/block", - "textures": { - "0": "create:block/display_cloth/white" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/white_table_cloth.json b/src/generated/resources/assets/create/models/block/white_table_cloth.json new file mode 100644 index 0000000000..6b450c27c3 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/white_table_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/table_cloth/block", + "textures": { + "0": "create:block/table_cloth/white" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/yellow_display_cloth.json b/src/generated/resources/assets/create/models/block/yellow_display_cloth.json deleted file mode 100644 index 128428a55d..0000000000 --- a/src/generated/resources/assets/create/models/block/yellow_display_cloth.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/display_cloth/block", - "textures": { - "0": "create:block/display_cloth/yellow" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/yellow_table_cloth.json b/src/generated/resources/assets/create/models/block/yellow_table_cloth.json new file mode 100644 index 0000000000..2b5ff22b31 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/yellow_table_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/table_cloth/block", + "textures": { + "0": "create:block/table_cloth/yellow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/andesite_display_cloth.json b/src/generated/resources/assets/create/models/item/andesite_display_cloth.json deleted file mode 100644 index 200d15200e..0000000000 --- a/src/generated/resources/assets/create/models/item/andesite_display_cloth.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/display_cloth/item_lower", - "textures": { - "0": "create:block/display_cloth/andesite" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/andesite_table_cloth.json b/src/generated/resources/assets/create/models/item/andesite_table_cloth.json new file mode 100644 index 0000000000..b2b803cb53 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/andesite_table_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/table_cloth/item_lower", + "textures": { + "0": "create:block/table_cloth/andesite" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/black_display_cloth.json b/src/generated/resources/assets/create/models/item/black_display_cloth.json deleted file mode 100644 index 3d909f280b..0000000000 --- a/src/generated/resources/assets/create/models/item/black_display_cloth.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/display_cloth/item", - "textures": { - "0": "create:block/display_cloth/black" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/black_table_cloth.json b/src/generated/resources/assets/create/models/item/black_table_cloth.json new file mode 100644 index 0000000000..caa880e12b --- /dev/null +++ b/src/generated/resources/assets/create/models/item/black_table_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/table_cloth/item", + "textures": { + "0": "create:block/table_cloth/black" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/blue_display_cloth.json b/src/generated/resources/assets/create/models/item/blue_display_cloth.json deleted file mode 100644 index b82a4eef9f..0000000000 --- a/src/generated/resources/assets/create/models/item/blue_display_cloth.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/display_cloth/item", - "textures": { - "0": "create:block/display_cloth/blue" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/blue_table_cloth.json b/src/generated/resources/assets/create/models/item/blue_table_cloth.json new file mode 100644 index 0000000000..60affaec7b --- /dev/null +++ b/src/generated/resources/assets/create/models/item/blue_table_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/table_cloth/item", + "textures": { + "0": "create:block/table_cloth/blue" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/brass_display_cloth.json b/src/generated/resources/assets/create/models/item/brass_display_cloth.json deleted file mode 100644 index a13a858004..0000000000 --- a/src/generated/resources/assets/create/models/item/brass_display_cloth.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/display_cloth/item_lower", - "textures": { - "0": "create:block/display_cloth/brass" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/brass_table_cloth.json b/src/generated/resources/assets/create/models/item/brass_table_cloth.json new file mode 100644 index 0000000000..cc7353de21 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/brass_table_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/table_cloth/item_lower", + "textures": { + "0": "create:block/table_cloth/brass" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/brown_display_cloth.json b/src/generated/resources/assets/create/models/item/brown_display_cloth.json deleted file mode 100644 index b6576ff3e7..0000000000 --- a/src/generated/resources/assets/create/models/item/brown_display_cloth.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/display_cloth/item", - "textures": { - "0": "create:block/display_cloth/brown" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/brown_table_cloth.json b/src/generated/resources/assets/create/models/item/brown_table_cloth.json new file mode 100644 index 0000000000..04aad3977e --- /dev/null +++ b/src/generated/resources/assets/create/models/item/brown_table_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/table_cloth/item", + "textures": { + "0": "create:block/table_cloth/brown" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/copper_display_cloth.json b/src/generated/resources/assets/create/models/item/copper_display_cloth.json deleted file mode 100644 index 91cf020ec4..0000000000 --- a/src/generated/resources/assets/create/models/item/copper_display_cloth.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/display_cloth/item_lower", - "textures": { - "0": "create:block/display_cloth/copper" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/copper_table_cloth.json b/src/generated/resources/assets/create/models/item/copper_table_cloth.json new file mode 100644 index 0000000000..8aad981335 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/copper_table_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/table_cloth/item_lower", + "textures": { + "0": "create:block/table_cloth/copper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cyan_display_cloth.json b/src/generated/resources/assets/create/models/item/cyan_display_cloth.json deleted file mode 100644 index ed634c3d4c..0000000000 --- a/src/generated/resources/assets/create/models/item/cyan_display_cloth.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/display_cloth/item", - "textures": { - "0": "create:block/display_cloth/cyan" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cyan_table_cloth.json b/src/generated/resources/assets/create/models/item/cyan_table_cloth.json new file mode 100644 index 0000000000..b6aad4d9ec --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cyan_table_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/table_cloth/item", + "textures": { + "0": "create:block/table_cloth/cyan" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/factory_gauge.json b/src/generated/resources/assets/create/models/item/factory_gauge.json new file mode 100644 index 0000000000..47ba842ada --- /dev/null +++ b/src/generated/resources/assets/create/models/item/factory_gauge.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/factory_gauge/item" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/factory_panel.json b/src/generated/resources/assets/create/models/item/factory_panel.json deleted file mode 100644 index 52a5b2b366..0000000000 --- a/src/generated/resources/assets/create/models/item/factory_panel.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "create:block/factory_panel/item" -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/gray_display_cloth.json b/src/generated/resources/assets/create/models/item/gray_display_cloth.json deleted file mode 100644 index 8498172f77..0000000000 --- a/src/generated/resources/assets/create/models/item/gray_display_cloth.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/display_cloth/item", - "textures": { - "0": "create:block/display_cloth/gray" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/gray_table_cloth.json b/src/generated/resources/assets/create/models/item/gray_table_cloth.json new file mode 100644 index 0000000000..2e4f480cac --- /dev/null +++ b/src/generated/resources/assets/create/models/item/gray_table_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/table_cloth/item", + "textures": { + "0": "create:block/table_cloth/gray" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/green_display_cloth.json b/src/generated/resources/assets/create/models/item/green_display_cloth.json deleted file mode 100644 index a1a2dc7827..0000000000 --- a/src/generated/resources/assets/create/models/item/green_display_cloth.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/display_cloth/item", - "textures": { - "0": "create:block/display_cloth/green" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/green_table_cloth.json b/src/generated/resources/assets/create/models/item/green_table_cloth.json new file mode 100644 index 0000000000..3370bf8000 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/green_table_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/table_cloth/item", + "textures": { + "0": "create:block/table_cloth/green" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/light_blue_display_cloth.json b/src/generated/resources/assets/create/models/item/light_blue_display_cloth.json deleted file mode 100644 index a4661e4813..0000000000 --- a/src/generated/resources/assets/create/models/item/light_blue_display_cloth.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/display_cloth/item", - "textures": { - "0": "create:block/display_cloth/light_blue" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/light_blue_table_cloth.json b/src/generated/resources/assets/create/models/item/light_blue_table_cloth.json new file mode 100644 index 0000000000..3c20d0734e --- /dev/null +++ b/src/generated/resources/assets/create/models/item/light_blue_table_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/table_cloth/item", + "textures": { + "0": "create:block/table_cloth/light_blue" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/light_gray_display_cloth.json b/src/generated/resources/assets/create/models/item/light_gray_display_cloth.json deleted file mode 100644 index bd0cb7cca7..0000000000 --- a/src/generated/resources/assets/create/models/item/light_gray_display_cloth.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/display_cloth/item", - "textures": { - "0": "create:block/display_cloth/light_gray" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/light_gray_table_cloth.json b/src/generated/resources/assets/create/models/item/light_gray_table_cloth.json new file mode 100644 index 0000000000..bc2e6ce8b8 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/light_gray_table_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/table_cloth/item", + "textures": { + "0": "create:block/table_cloth/light_gray" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/lime_display_cloth.json b/src/generated/resources/assets/create/models/item/lime_display_cloth.json deleted file mode 100644 index f23caad29a..0000000000 --- a/src/generated/resources/assets/create/models/item/lime_display_cloth.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/display_cloth/item", - "textures": { - "0": "create:block/display_cloth/lime" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/lime_table_cloth.json b/src/generated/resources/assets/create/models/item/lime_table_cloth.json new file mode 100644 index 0000000000..860775ebc2 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/lime_table_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/table_cloth/item", + "textures": { + "0": "create:block/table_cloth/lime" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/magenta_display_cloth.json b/src/generated/resources/assets/create/models/item/magenta_display_cloth.json deleted file mode 100644 index 6e7eb4ccd1..0000000000 --- a/src/generated/resources/assets/create/models/item/magenta_display_cloth.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/display_cloth/item", - "textures": { - "0": "create:block/display_cloth/magenta" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/magenta_table_cloth.json b/src/generated/resources/assets/create/models/item/magenta_table_cloth.json new file mode 100644 index 0000000000..d5c88a89f1 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/magenta_table_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/table_cloth/item", + "textures": { + "0": "create:block/table_cloth/magenta" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/orange_display_cloth.json b/src/generated/resources/assets/create/models/item/orange_display_cloth.json deleted file mode 100644 index 372428c1e2..0000000000 --- a/src/generated/resources/assets/create/models/item/orange_display_cloth.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/display_cloth/item", - "textures": { - "0": "create:block/display_cloth/orange" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/orange_table_cloth.json b/src/generated/resources/assets/create/models/item/orange_table_cloth.json new file mode 100644 index 0000000000..aa170587db --- /dev/null +++ b/src/generated/resources/assets/create/models/item/orange_table_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/table_cloth/item", + "textures": { + "0": "create:block/table_cloth/orange" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/packager_link.json b/src/generated/resources/assets/create/models/item/packager_link.json deleted file mode 100644 index ac0ea65870..0000000000 --- a/src/generated/resources/assets/create/models/item/packager_link.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "create:block/packager_link/block" -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/pink_display_cloth.json b/src/generated/resources/assets/create/models/item/pink_display_cloth.json deleted file mode 100644 index 92ef2f7f13..0000000000 --- a/src/generated/resources/assets/create/models/item/pink_display_cloth.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/display_cloth/item", - "textures": { - "0": "create:block/display_cloth/pink" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/pink_table_cloth.json b/src/generated/resources/assets/create/models/item/pink_table_cloth.json new file mode 100644 index 0000000000..4ab7a28bd8 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/pink_table_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/table_cloth/item", + "textures": { + "0": "create:block/table_cloth/pink" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_pulp.json b/src/generated/resources/assets/create/models/item/pulp.json similarity index 59% rename from src/generated/resources/assets/create/models/item/cardboard_pulp.json rename to src/generated/resources/assets/create/models/item/pulp.json index ca956b9090..7ea580f56a 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_pulp.json +++ b/src/generated/resources/assets/create/models/item/pulp.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "create:item/cardboard_pulp" + "layer0": "create:item/pulp" } } \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/purple_display_cloth.json b/src/generated/resources/assets/create/models/item/purple_display_cloth.json deleted file mode 100644 index 4c0a364458..0000000000 --- a/src/generated/resources/assets/create/models/item/purple_display_cloth.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/display_cloth/item", - "textures": { - "0": "create:block/display_cloth/purple" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/purple_table_cloth.json b/src/generated/resources/assets/create/models/item/purple_table_cloth.json new file mode 100644 index 0000000000..7737fb6800 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/purple_table_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/table_cloth/item", + "textures": { + "0": "create:block/table_cloth/purple" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/red_display_cloth.json b/src/generated/resources/assets/create/models/item/red_display_cloth.json deleted file mode 100644 index e51e59a708..0000000000 --- a/src/generated/resources/assets/create/models/item/red_display_cloth.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/display_cloth/item", - "textures": { - "0": "create:block/display_cloth/red" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/red_table_cloth.json b/src/generated/resources/assets/create/models/item/red_table_cloth.json new file mode 100644 index 0000000000..4e2cf2433c --- /dev/null +++ b/src/generated/resources/assets/create/models/item/red_table_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/table_cloth/item", + "textures": { + "0": "create:block/table_cloth/red" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/stock_link.json b/src/generated/resources/assets/create/models/item/stock_link.json new file mode 100644 index 0000000000..65fae657f8 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/stock_link.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/stock_link/block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/white_display_cloth.json b/src/generated/resources/assets/create/models/item/white_display_cloth.json deleted file mode 100644 index 7fa7b43e54..0000000000 --- a/src/generated/resources/assets/create/models/item/white_display_cloth.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/display_cloth/item", - "textures": { - "0": "create:block/display_cloth/white" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/white_table_cloth.json b/src/generated/resources/assets/create/models/item/white_table_cloth.json new file mode 100644 index 0000000000..9a384f722c --- /dev/null +++ b/src/generated/resources/assets/create/models/item/white_table_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/table_cloth/item", + "textures": { + "0": "create:block/table_cloth/white" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/yellow_display_cloth.json b/src/generated/resources/assets/create/models/item/yellow_display_cloth.json deleted file mode 100644 index 406b931942..0000000000 --- a/src/generated/resources/assets/create/models/item/yellow_display_cloth.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/display_cloth/item", - "textures": { - "0": "create:block/display_cloth/yellow" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/yellow_table_cloth.json b/src/generated/resources/assets/create/models/item/yellow_table_cloth.json new file mode 100644 index 0000000000..2c35c28e48 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/yellow_table_cloth.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/table_cloth/item", + "textures": { + "0": "create:block/table_cloth/yellow" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/copper_display_cloth_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/andesite_table_cloth_clear.json similarity index 67% rename from src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/copper_display_cloth_clear.json rename to src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/andesite_table_cloth_clear.json index d69d15a7fb..fcd76c7616 100644 --- a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/copper_display_cloth_clear.json +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/andesite_table_cloth_clear.json @@ -1,12 +1,12 @@ { "parent": "minecraft:recipes/root", "criteria": { - "has_copper_display_cloth": { + "has_andesite_table_cloth": { "conditions": { "items": [ { "items": [ - "create:copper_display_cloth" + "create:andesite_table_cloth" ] } ] @@ -15,20 +15,20 @@ }, "has_the_recipe": { "conditions": { - "recipe": "create:crafting/logistics/copper_display_cloth_clear" + "recipe": "create:crafting/logistics/andesite_table_cloth_clear" }, "trigger": "minecraft:recipe_unlocked" } }, "requirements": [ [ - "has_copper_display_cloth", + "has_andesite_table_cloth", "has_the_recipe" ] ], "rewards": { "recipes": [ - "create:crafting/logistics/copper_display_cloth_clear" + "create:crafting/logistics/andesite_table_cloth_clear" ] }, "sends_telemetry_event": false diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/red_display_cloth_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/black_table_cloth_clear.json similarity index 68% rename from src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/red_display_cloth_clear.json rename to src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/black_table_cloth_clear.json index ea469a34a5..f03a28bf6a 100644 --- a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/red_display_cloth_clear.json +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/black_table_cloth_clear.json @@ -1,12 +1,12 @@ { "parent": "minecraft:recipes/root", "criteria": { - "has_red_display_cloth": { + "has_black_table_cloth": { "conditions": { "items": [ { "items": [ - "create:red_display_cloth" + "create:black_table_cloth" ] } ] @@ -15,20 +15,20 @@ }, "has_the_recipe": { "conditions": { - "recipe": "create:crafting/logistics/red_display_cloth_clear" + "recipe": "create:crafting/logistics/black_table_cloth_clear" }, "trigger": "minecraft:recipe_unlocked" } }, "requirements": [ [ - "has_red_display_cloth", + "has_black_table_cloth", "has_the_recipe" ] ], "rewards": { "recipes": [ - "create:crafting/logistics/red_display_cloth_clear" + "create:crafting/logistics/black_table_cloth_clear" ] }, "sends_telemetry_event": false diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/blue_table_cloth_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/blue_table_cloth_clear.json new file mode 100644 index 0000000000..4d22f1722c --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/blue_table_cloth_clear.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_blue_table_cloth": { + "conditions": { + "items": [ + { + "items": [ + "create:blue_table_cloth" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/blue_table_cloth_clear" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_blue_table_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/blue_table_cloth_clear" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/brass_table_cloth_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/brass_table_cloth_clear.json new file mode 100644 index 0000000000..8ffcdd2bbc --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/brass_table_cloth_clear.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_brass_table_cloth": { + "conditions": { + "items": [ + { + "items": [ + "create:brass_table_cloth" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/brass_table_cloth_clear" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_brass_table_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/brass_table_cloth_clear" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/brown_display_cloth_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/brown_display_cloth_clear.json deleted file mode 100644 index 32da213a8c..0000000000 --- a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/brown_display_cloth_clear.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_brown_display_cloth": { - "conditions": { - "items": [ - { - "items": [ - "create:brown_display_cloth" - ] - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "create:crafting/logistics/brown_display_cloth_clear" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_brown_display_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "create:crafting/logistics/brown_display_cloth_clear" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/brown_table_cloth_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/brown_table_cloth_clear.json new file mode 100644 index 0000000000..7f6b2e5b6a --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/brown_table_cloth_clear.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_brown_table_cloth": { + "conditions": { + "items": [ + { + "items": [ + "create:brown_table_cloth" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/brown_table_cloth_clear" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_brown_table_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/brown_table_cloth_clear" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/cyan_display_cloth_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/copper_table_cloth_clear.json similarity index 67% rename from src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/cyan_display_cloth_clear.json rename to src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/copper_table_cloth_clear.json index 158fe29580..79f4422a3a 100644 --- a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/cyan_display_cloth_clear.json +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/copper_table_cloth_clear.json @@ -1,12 +1,12 @@ { "parent": "minecraft:recipes/root", "criteria": { - "has_cyan_display_cloth": { + "has_copper_table_cloth": { "conditions": { "items": [ { "items": [ - "create:cyan_display_cloth" + "create:copper_table_cloth" ] } ] @@ -15,20 +15,20 @@ }, "has_the_recipe": { "conditions": { - "recipe": "create:crafting/logistics/cyan_display_cloth_clear" + "recipe": "create:crafting/logistics/copper_table_cloth_clear" }, "trigger": "minecraft:recipe_unlocked" } }, "requirements": [ [ - "has_cyan_display_cloth", + "has_copper_table_cloth", "has_the_recipe" ] ], "rewards": { "recipes": [ - "create:crafting/logistics/cyan_display_cloth_clear" + "create:crafting/logistics/copper_table_cloth_clear" ] }, "sends_telemetry_event": false diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/cyan_table_cloth_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/cyan_table_cloth_clear.json new file mode 100644 index 0000000000..685671db78 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/cyan_table_cloth_clear.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cyan_table_cloth": { + "conditions": { + "items": [ + { + "items": [ + "create:cyan_table_cloth" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/cyan_table_cloth_clear" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_cyan_table_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/cyan_table_cloth_clear" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/packager_link_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/factory_gauge_clear.json similarity index 76% rename from src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/packager_link_clear.json rename to src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/factory_gauge_clear.json index b997f1c451..5df5d7367e 100644 --- a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/packager_link_clear.json +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/factory_gauge_clear.json @@ -6,7 +6,7 @@ "items": [ { "items": [ - "create:packager_link" + "create:factory_gauge" ] } ] @@ -15,7 +15,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "create:crafting/logistics/packager_link_clear" + "recipe": "create:crafting/logistics/factory_gauge_clear" }, "trigger": "minecraft:recipe_unlocked" } @@ -28,7 +28,7 @@ ], "rewards": { "recipes": [ - "create:crafting/logistics/packager_link_clear" + "create:crafting/logistics/factory_gauge_clear" ] }, "sends_telemetry_event": false diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/gray_table_cloth_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/gray_table_cloth_clear.json new file mode 100644 index 0000000000..2f6efc30ad --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/gray_table_cloth_clear.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_gray_table_cloth": { + "conditions": { + "items": [ + { + "items": [ + "create:gray_table_cloth" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/gray_table_cloth_clear" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_gray_table_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/gray_table_cloth_clear" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/green_display_cloth_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/green_display_cloth_clear.json deleted file mode 100644 index 05a1bff75d..0000000000 --- a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/green_display_cloth_clear.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_green_display_cloth": { - "conditions": { - "items": [ - { - "items": [ - "create:green_display_cloth" - ] - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "create:crafting/logistics/green_display_cloth_clear" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_green_display_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "create:crafting/logistics/green_display_cloth_clear" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/green_table_cloth_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/green_table_cloth_clear.json new file mode 100644 index 0000000000..c073c21afa --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/green_table_cloth_clear.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_green_table_cloth": { + "conditions": { + "items": [ + { + "items": [ + "create:green_table_cloth" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/green_table_cloth_clear" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_green_table_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/green_table_cloth_clear" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/light_blue_display_cloth_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/light_blue_display_cloth_clear.json deleted file mode 100644 index d70b8537e5..0000000000 --- a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/light_blue_display_cloth_clear.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_light_blue_display_cloth": { - "conditions": { - "items": [ - { - "items": [ - "create:light_blue_display_cloth" - ] - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "create:crafting/logistics/light_blue_display_cloth_clear" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_light_blue_display_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "create:crafting/logistics/light_blue_display_cloth_clear" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/andesite_display_cloth_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/light_blue_table_cloth_clear.json similarity index 66% rename from src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/andesite_display_cloth_clear.json rename to src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/light_blue_table_cloth_clear.json index 86c211c770..876ec3fde7 100644 --- a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/andesite_display_cloth_clear.json +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/light_blue_table_cloth_clear.json @@ -1,12 +1,12 @@ { "parent": "minecraft:recipes/root", "criteria": { - "has_andesite_display_cloth": { + "has_light_blue_table_cloth": { "conditions": { "items": [ { "items": [ - "create:andesite_display_cloth" + "create:light_blue_table_cloth" ] } ] @@ -15,20 +15,20 @@ }, "has_the_recipe": { "conditions": { - "recipe": "create:crafting/logistics/andesite_display_cloth_clear" + "recipe": "create:crafting/logistics/light_blue_table_cloth_clear" }, "trigger": "minecraft:recipe_unlocked" } }, "requirements": [ [ - "has_andesite_display_cloth", + "has_light_blue_table_cloth", "has_the_recipe" ] ], "rewards": { "recipes": [ - "create:crafting/logistics/andesite_display_cloth_clear" + "create:crafting/logistics/light_blue_table_cloth_clear" ] }, "sends_telemetry_event": false diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/light_gray_display_cloth_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/light_gray_display_cloth_clear.json deleted file mode 100644 index 040e1e283c..0000000000 --- a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/light_gray_display_cloth_clear.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_light_gray_display_cloth": { - "conditions": { - "items": [ - { - "items": [ - "create:light_gray_display_cloth" - ] - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "create:crafting/logistics/light_gray_display_cloth_clear" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_light_gray_display_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "create:crafting/logistics/light_gray_display_cloth_clear" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/black_display_cloth_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/light_gray_table_cloth_clear.json similarity index 65% rename from src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/black_display_cloth_clear.json rename to src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/light_gray_table_cloth_clear.json index 3eb81cee9d..ecd289800a 100644 --- a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/black_display_cloth_clear.json +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/light_gray_table_cloth_clear.json @@ -1,12 +1,12 @@ { "parent": "minecraft:recipes/root", "criteria": { - "has_black_display_cloth": { + "has_light_gray_table_cloth": { "conditions": { "items": [ { "items": [ - "create:black_display_cloth" + "create:light_gray_table_cloth" ] } ] @@ -15,20 +15,20 @@ }, "has_the_recipe": { "conditions": { - "recipe": "create:crafting/logistics/black_display_cloth_clear" + "recipe": "create:crafting/logistics/light_gray_table_cloth_clear" }, "trigger": "minecraft:recipe_unlocked" } }, "requirements": [ [ - "has_black_display_cloth", + "has_light_gray_table_cloth", "has_the_recipe" ] ], "rewards": { "recipes": [ - "create:crafting/logistics/black_display_cloth_clear" + "create:crafting/logistics/light_gray_table_cloth_clear" ] }, "sends_telemetry_event": false diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/lime_table_cloth_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/lime_table_cloth_clear.json new file mode 100644 index 0000000000..6b24da20fe --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/lime_table_cloth_clear.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_lime_table_cloth": { + "conditions": { + "items": [ + { + "items": [ + "create:lime_table_cloth" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/lime_table_cloth_clear" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_lime_table_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/lime_table_cloth_clear" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/magenta_display_cloth_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/magenta_display_cloth_clear.json deleted file mode 100644 index e753652b05..0000000000 --- a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/magenta_display_cloth_clear.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_magenta_display_cloth": { - "conditions": { - "items": [ - { - "items": [ - "create:magenta_display_cloth" - ] - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "create:crafting/logistics/magenta_display_cloth_clear" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_magenta_display_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "create:crafting/logistics/magenta_display_cloth_clear" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/brass_display_cloth_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/magenta_table_cloth_clear.json similarity index 67% rename from src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/brass_display_cloth_clear.json rename to src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/magenta_table_cloth_clear.json index 7729f2062c..219a3912b1 100644 --- a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/brass_display_cloth_clear.json +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/magenta_table_cloth_clear.json @@ -1,12 +1,12 @@ { "parent": "minecraft:recipes/root", "criteria": { - "has_brass_display_cloth": { + "has_magenta_table_cloth": { "conditions": { "items": [ { "items": [ - "create:brass_display_cloth" + "create:magenta_table_cloth" ] } ] @@ -15,20 +15,20 @@ }, "has_the_recipe": { "conditions": { - "recipe": "create:crafting/logistics/brass_display_cloth_clear" + "recipe": "create:crafting/logistics/magenta_table_cloth_clear" }, "trigger": "minecraft:recipe_unlocked" } }, "requirements": [ [ - "has_brass_display_cloth", + "has_magenta_table_cloth", "has_the_recipe" ] ], "rewards": { "recipes": [ - "create:crafting/logistics/brass_display_cloth_clear" + "create:crafting/logistics/magenta_table_cloth_clear" ] }, "sends_telemetry_event": false diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/orange_display_cloth_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/orange_display_cloth_clear.json deleted file mode 100644 index 0145f1f8f3..0000000000 --- a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/orange_display_cloth_clear.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_orange_display_cloth": { - "conditions": { - "items": [ - { - "items": [ - "create:orange_display_cloth" - ] - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "create:crafting/logistics/orange_display_cloth_clear" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_orange_display_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "create:crafting/logistics/orange_display_cloth_clear" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/lime_display_cloth_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/orange_table_cloth_clear.json similarity index 67% rename from src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/lime_display_cloth_clear.json rename to src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/orange_table_cloth_clear.json index 1d189e6402..1b274ecc83 100644 --- a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/lime_display_cloth_clear.json +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/orange_table_cloth_clear.json @@ -1,12 +1,12 @@ { "parent": "minecraft:recipes/root", "criteria": { - "has_lime_display_cloth": { + "has_orange_table_cloth": { "conditions": { "items": [ { "items": [ - "create:lime_display_cloth" + "create:orange_table_cloth" ] } ] @@ -15,20 +15,20 @@ }, "has_the_recipe": { "conditions": { - "recipe": "create:crafting/logistics/lime_display_cloth_clear" + "recipe": "create:crafting/logistics/orange_table_cloth_clear" }, "trigger": "minecraft:recipe_unlocked" } }, "requirements": [ [ - "has_lime_display_cloth", + "has_orange_table_cloth", "has_the_recipe" ] ], "rewards": { "recipes": [ - "create:crafting/logistics/lime_display_cloth_clear" + "create:crafting/logistics/orange_table_cloth_clear" ] }, "sends_telemetry_event": false diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/pink_display_cloth_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/pink_display_cloth_clear.json deleted file mode 100644 index 491cb4a3bc..0000000000 --- a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/pink_display_cloth_clear.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_pink_display_cloth": { - "conditions": { - "items": [ - { - "items": [ - "create:pink_display_cloth" - ] - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "create:crafting/logistics/pink_display_cloth_clear" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_pink_display_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "create:crafting/logistics/pink_display_cloth_clear" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/pink_table_cloth_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/pink_table_cloth_clear.json new file mode 100644 index 0000000000..6c4e146467 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/pink_table_cloth_clear.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_pink_table_cloth": { + "conditions": { + "items": [ + { + "items": [ + "create:pink_table_cloth" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/pink_table_cloth_clear" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_pink_table_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/pink_table_cloth_clear" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/purple_display_cloth_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/purple_display_cloth_clear.json deleted file mode 100644 index 68c0c1a7b3..0000000000 --- a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/purple_display_cloth_clear.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_purple_display_cloth": { - "conditions": { - "items": [ - { - "items": [ - "create:purple_display_cloth" - ] - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "create:crafting/logistics/purple_display_cloth_clear" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_purple_display_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "create:crafting/logistics/purple_display_cloth_clear" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/gray_display_cloth_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/purple_table_cloth_clear.json similarity index 67% rename from src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/gray_display_cloth_clear.json rename to src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/purple_table_cloth_clear.json index 20f6f29660..e96da828c8 100644 --- a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/gray_display_cloth_clear.json +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/purple_table_cloth_clear.json @@ -1,12 +1,12 @@ { "parent": "minecraft:recipes/root", "criteria": { - "has_gray_display_cloth": { + "has_purple_table_cloth": { "conditions": { "items": [ { "items": [ - "create:gray_display_cloth" + "create:purple_table_cloth" ] } ] @@ -15,20 +15,20 @@ }, "has_the_recipe": { "conditions": { - "recipe": "create:crafting/logistics/gray_display_cloth_clear" + "recipe": "create:crafting/logistics/purple_table_cloth_clear" }, "trigger": "minecraft:recipe_unlocked" } }, "requirements": [ [ - "has_gray_display_cloth", + "has_purple_table_cloth", "has_the_recipe" ] ], "rewards": { "recipes": [ - "create:crafting/logistics/gray_display_cloth_clear" + "create:crafting/logistics/purple_table_cloth_clear" ] }, "sends_telemetry_event": false diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/red_table_cloth_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/red_table_cloth_clear.json new file mode 100644 index 0000000000..00a7133594 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/red_table_cloth_clear.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_red_table_cloth": { + "conditions": { + "items": [ + { + "items": [ + "create:red_table_cloth" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/red_table_cloth_clear" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_red_table_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/red_table_cloth_clear" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/factory_panel_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/stock_link_clear.json similarity index 76% rename from src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/factory_panel_clear.json rename to src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/stock_link_clear.json index 46c891e915..1201d91963 100644 --- a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/factory_panel_clear.json +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/stock_link_clear.json @@ -6,7 +6,7 @@ "items": [ { "items": [ - "create:factory_panel" + "create:stock_link" ] } ] @@ -15,7 +15,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "create:crafting/logistics/factory_panel_clear" + "recipe": "create:crafting/logistics/stock_link_clear" }, "trigger": "minecraft:recipe_unlocked" } @@ -28,7 +28,7 @@ ], "rewards": { "recipes": [ - "create:crafting/logistics/factory_panel_clear" + "create:crafting/logistics/stock_link_clear" ] }, "sends_telemetry_event": false diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/white_display_cloth_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/white_display_cloth_clear.json deleted file mode 100644 index f496913211..0000000000 --- a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/white_display_cloth_clear.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_the_recipe": { - "conditions": { - "recipe": "create:crafting/logistics/white_display_cloth_clear" - }, - "trigger": "minecraft:recipe_unlocked" - }, - "has_white_display_cloth": { - "conditions": { - "items": [ - { - "items": [ - "create:white_display_cloth" - ] - } - ] - }, - "trigger": "minecraft:inventory_changed" - } - }, - "requirements": [ - [ - "has_white_display_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "create:crafting/logistics/white_display_cloth_clear" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/white_table_cloth_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/white_table_cloth_clear.json new file mode 100644 index 0000000000..19d8524c68 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/white_table_cloth_clear.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/white_table_cloth_clear" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_white_table_cloth": { + "conditions": { + "items": [ + { + "items": [ + "create:white_table_cloth" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_white_table_cloth", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/white_table_cloth_clear" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/yellow_display_cloth_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/yellow_display_cloth_clear.json deleted file mode 100644 index 7c2dd1f190..0000000000 --- a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/yellow_display_cloth_clear.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_the_recipe": { - "conditions": { - "recipe": "create:crafting/logistics/yellow_display_cloth_clear" - }, - "trigger": "minecraft:recipe_unlocked" - }, - "has_yellow_display_cloth": { - "conditions": { - "items": [ - { - "items": [ - "create:yellow_display_cloth" - ] - } - ] - }, - "trigger": "minecraft:inventory_changed" - } - }, - "requirements": [ - [ - "has_yellow_display_cloth", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "create:crafting/logistics/yellow_display_cloth_clear" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/blue_display_cloth_clear.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/yellow_table_cloth_clear.json similarity index 67% rename from src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/blue_display_cloth_clear.json rename to src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/yellow_table_cloth_clear.json index e81088e36e..c2ed4252d2 100644 --- a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/blue_display_cloth_clear.json +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/yellow_table_cloth_clear.json @@ -1,34 +1,34 @@ { "parent": "minecraft:recipes/root", "criteria": { - "has_blue_display_cloth": { + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/yellow_table_cloth_clear" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_yellow_table_cloth": { "conditions": { "items": [ { "items": [ - "create:blue_display_cloth" + "create:yellow_table_cloth" ] } ] }, "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "create:crafting/logistics/blue_display_cloth_clear" - }, - "trigger": "minecraft:recipe_unlocked" } }, "requirements": [ [ - "has_blue_display_cloth", + "has_yellow_table_cloth", "has_the_recipe" ] ], "rewards": { "recipes": [ - "create:crafting/logistics/blue_display_cloth_clear" + "create:crafting/logistics/yellow_table_cloth_clear" ] }, "sends_telemetry_event": false diff --git a/src/generated/resources/data/create/loot_tables/blocks/black_display_cloth.json b/src/generated/resources/data/create/loot_tables/blocks/andesite_table_cloth.json similarity index 73% rename from src/generated/resources/data/create/loot_tables/blocks/black_display_cloth.json rename to src/generated/resources/data/create/loot_tables/blocks/andesite_table_cloth.json index f7837b51a5..d5dcbb5a9e 100644 --- a/src/generated/resources/data/create/loot_tables/blocks/black_display_cloth.json +++ b/src/generated/resources/data/create/loot_tables/blocks/andesite_table_cloth.json @@ -11,11 +11,11 @@ "entries": [ { "type": "minecraft:item", - "name": "create:black_display_cloth" + "name": "create:andesite_table_cloth" } ], "rolls": 1.0 } ], - "random_sequence": "create:blocks/black_display_cloth" + "random_sequence": "create:blocks/andesite_table_cloth" } \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/red_display_cloth.json b/src/generated/resources/data/create/loot_tables/blocks/black_table_cloth.json similarity index 74% rename from src/generated/resources/data/create/loot_tables/blocks/red_display_cloth.json rename to src/generated/resources/data/create/loot_tables/blocks/black_table_cloth.json index 5e7dfdfc3a..bcfb49077d 100644 --- a/src/generated/resources/data/create/loot_tables/blocks/red_display_cloth.json +++ b/src/generated/resources/data/create/loot_tables/blocks/black_table_cloth.json @@ -11,11 +11,11 @@ "entries": [ { "type": "minecraft:item", - "name": "create:red_display_cloth" + "name": "create:black_table_cloth" } ], "rolls": 1.0 } ], - "random_sequence": "create:blocks/red_display_cloth" + "random_sequence": "create:blocks/black_table_cloth" } \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/gray_display_cloth.json b/src/generated/resources/data/create/loot_tables/blocks/blue_table_cloth.json similarity index 74% rename from src/generated/resources/data/create/loot_tables/blocks/gray_display_cloth.json rename to src/generated/resources/data/create/loot_tables/blocks/blue_table_cloth.json index 9e5f5ae419..8d0aa383a8 100644 --- a/src/generated/resources/data/create/loot_tables/blocks/gray_display_cloth.json +++ b/src/generated/resources/data/create/loot_tables/blocks/blue_table_cloth.json @@ -11,11 +11,11 @@ "entries": [ { "type": "minecraft:item", - "name": "create:gray_display_cloth" + "name": "create:blue_table_cloth" } ], "rolls": 1.0 } ], - "random_sequence": "create:blocks/gray_display_cloth" + "random_sequence": "create:blocks/blue_table_cloth" } \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/brass_table_cloth.json b/src/generated/resources/data/create/loot_tables/blocks/brass_table_cloth.json new file mode 100644 index 0000000000..28df84a681 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/brass_table_cloth.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:brass_table_cloth" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/brass_table_cloth" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/brown_display_cloth.json b/src/generated/resources/data/create/loot_tables/blocks/brown_display_cloth.json deleted file mode 100644 index 60a66f5fda..0000000000 --- a/src/generated/resources/data/create/loot_tables/blocks/brown_display_cloth.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "create:brown_display_cloth" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "create:blocks/brown_display_cloth" -} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/brown_table_cloth.json b/src/generated/resources/data/create/loot_tables/blocks/brown_table_cloth.json new file mode 100644 index 0000000000..d8c66cdb82 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/brown_table_cloth.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:brown_table_cloth" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/brown_table_cloth" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/copper_display_cloth.json b/src/generated/resources/data/create/loot_tables/blocks/copper_display_cloth.json deleted file mode 100644 index 46253d68b7..0000000000 --- a/src/generated/resources/data/create/loot_tables/blocks/copper_display_cloth.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "create:copper_display_cloth" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "create:blocks/copper_display_cloth" -} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/blue_display_cloth.json b/src/generated/resources/data/create/loot_tables/blocks/copper_table_cloth.json similarity index 74% rename from src/generated/resources/data/create/loot_tables/blocks/blue_display_cloth.json rename to src/generated/resources/data/create/loot_tables/blocks/copper_table_cloth.json index 42b8fc647d..ce500397b5 100644 --- a/src/generated/resources/data/create/loot_tables/blocks/blue_display_cloth.json +++ b/src/generated/resources/data/create/loot_tables/blocks/copper_table_cloth.json @@ -11,11 +11,11 @@ "entries": [ { "type": "minecraft:item", - "name": "create:blue_display_cloth" + "name": "create:copper_table_cloth" } ], "rolls": 1.0 } ], - "random_sequence": "create:blocks/blue_display_cloth" + "random_sequence": "create:blocks/copper_table_cloth" } \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/cyan_table_cloth.json b/src/generated/resources/data/create/loot_tables/blocks/cyan_table_cloth.json new file mode 100644 index 0000000000..f6214c3ff5 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/cyan_table_cloth.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:cyan_table_cloth" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/cyan_table_cloth" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/packager_link.json b/src/generated/resources/data/create/loot_tables/blocks/factory_gauge.json similarity index 76% rename from src/generated/resources/data/create/loot_tables/blocks/packager_link.json rename to src/generated/resources/data/create/loot_tables/blocks/factory_gauge.json index 9d3e886eb6..ea2899df42 100644 --- a/src/generated/resources/data/create/loot_tables/blocks/packager_link.json +++ b/src/generated/resources/data/create/loot_tables/blocks/factory_gauge.json @@ -11,11 +11,11 @@ "entries": [ { "type": "minecraft:item", - "name": "create:packager_link" + "name": "create:factory_gauge" } ], "rolls": 1.0 } ], - "random_sequence": "create:blocks/packager_link" + "random_sequence": "create:blocks/factory_gauge" } \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/gray_table_cloth.json b/src/generated/resources/data/create/loot_tables/blocks/gray_table_cloth.json new file mode 100644 index 0000000000..9faaacff04 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/gray_table_cloth.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:gray_table_cloth" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/gray_table_cloth" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/green_display_cloth.json b/src/generated/resources/data/create/loot_tables/blocks/green_display_cloth.json deleted file mode 100644 index 5e674e3030..0000000000 --- a/src/generated/resources/data/create/loot_tables/blocks/green_display_cloth.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "create:green_display_cloth" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "create:blocks/green_display_cloth" -} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/green_table_cloth.json b/src/generated/resources/data/create/loot_tables/blocks/green_table_cloth.json new file mode 100644 index 0000000000..e9cd8e03f0 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/green_table_cloth.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:green_table_cloth" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/green_table_cloth" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/light_blue_display_cloth.json b/src/generated/resources/data/create/loot_tables/blocks/light_blue_display_cloth.json deleted file mode 100644 index 6327e1f71b..0000000000 --- a/src/generated/resources/data/create/loot_tables/blocks/light_blue_display_cloth.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "create:light_blue_display_cloth" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "create:blocks/light_blue_display_cloth" -} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/andesite_display_cloth.json b/src/generated/resources/data/create/loot_tables/blocks/light_blue_table_cloth.json similarity index 72% rename from src/generated/resources/data/create/loot_tables/blocks/andesite_display_cloth.json rename to src/generated/resources/data/create/loot_tables/blocks/light_blue_table_cloth.json index 4004c91a6c..e8a961e43e 100644 --- a/src/generated/resources/data/create/loot_tables/blocks/andesite_display_cloth.json +++ b/src/generated/resources/data/create/loot_tables/blocks/light_blue_table_cloth.json @@ -11,11 +11,11 @@ "entries": [ { "type": "minecraft:item", - "name": "create:andesite_display_cloth" + "name": "create:light_blue_table_cloth" } ], "rolls": 1.0 } ], - "random_sequence": "create:blocks/andesite_display_cloth" + "random_sequence": "create:blocks/light_blue_table_cloth" } \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/light_gray_display_cloth.json b/src/generated/resources/data/create/loot_tables/blocks/light_gray_display_cloth.json deleted file mode 100644 index 72c4e5cfb1..0000000000 --- a/src/generated/resources/data/create/loot_tables/blocks/light_gray_display_cloth.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "create:light_gray_display_cloth" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "create:blocks/light_gray_display_cloth" -} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/light_gray_table_cloth.json b/src/generated/resources/data/create/loot_tables/blocks/light_gray_table_cloth.json new file mode 100644 index 0000000000..0135623941 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/light_gray_table_cloth.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:light_gray_table_cloth" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/light_gray_table_cloth" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/lime_display_cloth.json b/src/generated/resources/data/create/loot_tables/blocks/lime_display_cloth.json deleted file mode 100644 index 643e5f7726..0000000000 --- a/src/generated/resources/data/create/loot_tables/blocks/lime_display_cloth.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "create:lime_display_cloth" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "create:blocks/lime_display_cloth" -} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/lime_table_cloth.json b/src/generated/resources/data/create/loot_tables/blocks/lime_table_cloth.json new file mode 100644 index 0000000000..1270bdee85 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/lime_table_cloth.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:lime_table_cloth" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/lime_table_cloth" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/magenta_display_cloth.json b/src/generated/resources/data/create/loot_tables/blocks/magenta_display_cloth.json deleted file mode 100644 index b363e398fb..0000000000 --- a/src/generated/resources/data/create/loot_tables/blocks/magenta_display_cloth.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "create:magenta_display_cloth" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "create:blocks/magenta_display_cloth" -} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/brass_display_cloth.json b/src/generated/resources/data/create/loot_tables/blocks/magenta_table_cloth.json similarity index 74% rename from src/generated/resources/data/create/loot_tables/blocks/brass_display_cloth.json rename to src/generated/resources/data/create/loot_tables/blocks/magenta_table_cloth.json index c3d73dc479..e75a70ea66 100644 --- a/src/generated/resources/data/create/loot_tables/blocks/brass_display_cloth.json +++ b/src/generated/resources/data/create/loot_tables/blocks/magenta_table_cloth.json @@ -11,11 +11,11 @@ "entries": [ { "type": "minecraft:item", - "name": "create:brass_display_cloth" + "name": "create:magenta_table_cloth" } ], "rolls": 1.0 } ], - "random_sequence": "create:blocks/brass_display_cloth" + "random_sequence": "create:blocks/magenta_table_cloth" } \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/orange_display_cloth.json b/src/generated/resources/data/create/loot_tables/blocks/orange_display_cloth.json deleted file mode 100644 index ff910cea81..0000000000 --- a/src/generated/resources/data/create/loot_tables/blocks/orange_display_cloth.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "create:orange_display_cloth" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "create:blocks/orange_display_cloth" -} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/cyan_display_cloth.json b/src/generated/resources/data/create/loot_tables/blocks/orange_table_cloth.json similarity index 74% rename from src/generated/resources/data/create/loot_tables/blocks/cyan_display_cloth.json rename to src/generated/resources/data/create/loot_tables/blocks/orange_table_cloth.json index a43f36bdc2..df88a6a9c0 100644 --- a/src/generated/resources/data/create/loot_tables/blocks/cyan_display_cloth.json +++ b/src/generated/resources/data/create/loot_tables/blocks/orange_table_cloth.json @@ -11,11 +11,11 @@ "entries": [ { "type": "minecraft:item", - "name": "create:cyan_display_cloth" + "name": "create:orange_table_cloth" } ], "rolls": 1.0 } ], - "random_sequence": "create:blocks/cyan_display_cloth" + "random_sequence": "create:blocks/orange_table_cloth" } \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/pink_display_cloth.json b/src/generated/resources/data/create/loot_tables/blocks/pink_display_cloth.json deleted file mode 100644 index 758c81f90e..0000000000 --- a/src/generated/resources/data/create/loot_tables/blocks/pink_display_cloth.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "create:pink_display_cloth" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "create:blocks/pink_display_cloth" -} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/pink_table_cloth.json b/src/generated/resources/data/create/loot_tables/blocks/pink_table_cloth.json new file mode 100644 index 0000000000..dbd7471d90 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/pink_table_cloth.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:pink_table_cloth" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/pink_table_cloth" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/purple_display_cloth.json b/src/generated/resources/data/create/loot_tables/blocks/purple_display_cloth.json deleted file mode 100644 index c64d6bb2fa..0000000000 --- a/src/generated/resources/data/create/loot_tables/blocks/purple_display_cloth.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "create:purple_display_cloth" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "create:blocks/purple_display_cloth" -} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/purple_table_cloth.json b/src/generated/resources/data/create/loot_tables/blocks/purple_table_cloth.json new file mode 100644 index 0000000000..87822b1e51 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/purple_table_cloth.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:purple_table_cloth" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/purple_table_cloth" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/red_table_cloth.json b/src/generated/resources/data/create/loot_tables/blocks/red_table_cloth.json new file mode 100644 index 0000000000..8132ffe194 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/red_table_cloth.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:red_table_cloth" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/red_table_cloth" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/factory_panel.json b/src/generated/resources/data/create/loot_tables/blocks/stock_link.json similarity index 76% rename from src/generated/resources/data/create/loot_tables/blocks/factory_panel.json rename to src/generated/resources/data/create/loot_tables/blocks/stock_link.json index d94feba672..e41b77898f 100644 --- a/src/generated/resources/data/create/loot_tables/blocks/factory_panel.json +++ b/src/generated/resources/data/create/loot_tables/blocks/stock_link.json @@ -11,11 +11,11 @@ "entries": [ { "type": "minecraft:item", - "name": "create:factory_panel" + "name": "create:stock_link" } ], "rolls": 1.0 } ], - "random_sequence": "create:blocks/factory_panel" + "random_sequence": "create:blocks/stock_link" } \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/white_display_cloth.json b/src/generated/resources/data/create/loot_tables/blocks/white_display_cloth.json deleted file mode 100644 index f35d918210..0000000000 --- a/src/generated/resources/data/create/loot_tables/blocks/white_display_cloth.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "create:white_display_cloth" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "create:blocks/white_display_cloth" -} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/white_table_cloth.json b/src/generated/resources/data/create/loot_tables/blocks/white_table_cloth.json new file mode 100644 index 0000000000..43d3518de4 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/white_table_cloth.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:white_table_cloth" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/white_table_cloth" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/yellow_display_cloth.json b/src/generated/resources/data/create/loot_tables/blocks/yellow_display_cloth.json deleted file mode 100644 index 9cde6dcc3d..0000000000 --- a/src/generated/resources/data/create/loot_tables/blocks/yellow_display_cloth.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "create:yellow_display_cloth" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "create:blocks/yellow_display_cloth" -} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/yellow_table_cloth.json b/src/generated/resources/data/create/loot_tables/blocks/yellow_table_cloth.json new file mode 100644 index 0000000000..e36894d645 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/yellow_table_cloth.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:yellow_table_cloth" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/yellow_table_cloth" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/black_display_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/andesite_table_cloth_clear.json similarity index 58% rename from src/generated/resources/data/create/recipes/crafting/logistics/black_display_cloth_clear.json rename to src/generated/resources/data/create/recipes/crafting/logistics/andesite_table_cloth_clear.json index 5afcddb78d..b3464448a6 100644 --- a/src/generated/resources/data/create/recipes/crafting/logistics/black_display_cloth_clear.json +++ b/src/generated/resources/data/create/recipes/crafting/logistics/andesite_table_cloth_clear.json @@ -3,10 +3,10 @@ "category": "misc", "ingredients": [ { - "item": "create:black_display_cloth" + "item": "create:andesite_table_cloth" } ], "result": { - "item": "create:black_display_cloth" + "item": "create:andesite_table_cloth" } } \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/red_display_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/black_table_cloth_clear.json similarity index 60% rename from src/generated/resources/data/create/recipes/crafting/logistics/red_display_cloth_clear.json rename to src/generated/resources/data/create/recipes/crafting/logistics/black_table_cloth_clear.json index 8cf2651fe2..26f12a1e8f 100644 --- a/src/generated/resources/data/create/recipes/crafting/logistics/red_display_cloth_clear.json +++ b/src/generated/resources/data/create/recipes/crafting/logistics/black_table_cloth_clear.json @@ -3,10 +3,10 @@ "category": "misc", "ingredients": [ { - "item": "create:red_display_cloth" + "item": "create:black_table_cloth" } ], "result": { - "item": "create:red_display_cloth" + "item": "create:black_table_cloth" } } \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/gray_display_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/blue_table_cloth_clear.json similarity index 59% rename from src/generated/resources/data/create/recipes/crafting/logistics/gray_display_cloth_clear.json rename to src/generated/resources/data/create/recipes/crafting/logistics/blue_table_cloth_clear.json index 3135ef4869..9aa16db25f 100644 --- a/src/generated/resources/data/create/recipes/crafting/logistics/gray_display_cloth_clear.json +++ b/src/generated/resources/data/create/recipes/crafting/logistics/blue_table_cloth_clear.json @@ -3,10 +3,10 @@ "category": "misc", "ingredients": [ { - "item": "create:gray_display_cloth" + "item": "create:blue_table_cloth" } ], "result": { - "item": "create:gray_display_cloth" + "item": "create:blue_table_cloth" } } \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/brass_table_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/brass_table_cloth_clear.json new file mode 100644 index 0000000000..2e472384a7 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/brass_table_cloth_clear.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "create:brass_table_cloth" + } + ], + "result": { + "item": "create:brass_table_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/brown_display_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/brown_display_cloth_clear.json deleted file mode 100644 index 241edc37a0..0000000000 --- a/src/generated/resources/data/create/recipes/crafting/logistics/brown_display_cloth_clear.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "category": "misc", - "ingredients": [ - { - "item": "create:brown_display_cloth" - } - ], - "result": { - "item": "create:brown_display_cloth" - } -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/brown_table_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/brown_table_cloth_clear.json new file mode 100644 index 0000000000..61788e6d84 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/brown_table_cloth_clear.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "create:brown_table_cloth" + } + ], + "result": { + "item": "create:brown_table_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/copper_display_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/copper_display_cloth_clear.json deleted file mode 100644 index 9bc05b0179..0000000000 --- a/src/generated/resources/data/create/recipes/crafting/logistics/copper_display_cloth_clear.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "category": "misc", - "ingredients": [ - { - "item": "create:copper_display_cloth" - } - ], - "result": { - "item": "create:copper_display_cloth" - } -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/blue_display_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/copper_table_cloth_clear.json similarity index 59% rename from src/generated/resources/data/create/recipes/crafting/logistics/blue_display_cloth_clear.json rename to src/generated/resources/data/create/recipes/crafting/logistics/copper_table_cloth_clear.json index ac50b05228..e2122b765e 100644 --- a/src/generated/resources/data/create/recipes/crafting/logistics/blue_display_cloth_clear.json +++ b/src/generated/resources/data/create/recipes/crafting/logistics/copper_table_cloth_clear.json @@ -3,10 +3,10 @@ "category": "misc", "ingredients": [ { - "item": "create:blue_display_cloth" + "item": "create:copper_table_cloth" } ], "result": { - "item": "create:blue_display_cloth" + "item": "create:copper_table_cloth" } } \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/cyan_table_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/cyan_table_cloth_clear.json new file mode 100644 index 0000000000..b2944a9512 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/cyan_table_cloth_clear.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "create:cyan_table_cloth" + } + ], + "result": { + "item": "create:cyan_table_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/packager_link_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/factory_gauge_clear.json similarity index 62% rename from src/generated/resources/data/create/recipes/crafting/logistics/packager_link_clear.json rename to src/generated/resources/data/create/recipes/crafting/logistics/factory_gauge_clear.json index bf9a09cdb2..256575f2b3 100644 --- a/src/generated/resources/data/create/recipes/crafting/logistics/packager_link_clear.json +++ b/src/generated/resources/data/create/recipes/crafting/logistics/factory_gauge_clear.json @@ -3,10 +3,10 @@ "category": "misc", "ingredients": [ { - "item": "create:packager_link" + "item": "create:factory_gauge" } ], "result": { - "item": "create:packager_link" + "item": "create:factory_gauge" } } \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/gray_table_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/gray_table_cloth_clear.json new file mode 100644 index 0000000000..9142cc8fd8 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/gray_table_cloth_clear.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "create:gray_table_cloth" + } + ], + "result": { + "item": "create:gray_table_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/green_display_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/green_display_cloth_clear.json deleted file mode 100644 index 444005f84a..0000000000 --- a/src/generated/resources/data/create/recipes/crafting/logistics/green_display_cloth_clear.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "category": "misc", - "ingredients": [ - { - "item": "create:green_display_cloth" - } - ], - "result": { - "item": "create:green_display_cloth" - } -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/green_table_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/green_table_cloth_clear.json new file mode 100644 index 0000000000..53926f8e5c --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/green_table_cloth_clear.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "create:green_table_cloth" + } + ], + "result": { + "item": "create:green_table_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/light_blue_display_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/light_blue_display_cloth_clear.json deleted file mode 100644 index 52ef7f71a7..0000000000 --- a/src/generated/resources/data/create/recipes/crafting/logistics/light_blue_display_cloth_clear.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "category": "misc", - "ingredients": [ - { - "item": "create:light_blue_display_cloth" - } - ], - "result": { - "item": "create:light_blue_display_cloth" - } -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/andesite_display_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/light_blue_table_cloth_clear.json similarity index 57% rename from src/generated/resources/data/create/recipes/crafting/logistics/andesite_display_cloth_clear.json rename to src/generated/resources/data/create/recipes/crafting/logistics/light_blue_table_cloth_clear.json index 8b82fdb751..4bcc6e7636 100644 --- a/src/generated/resources/data/create/recipes/crafting/logistics/andesite_display_cloth_clear.json +++ b/src/generated/resources/data/create/recipes/crafting/logistics/light_blue_table_cloth_clear.json @@ -3,10 +3,10 @@ "category": "misc", "ingredients": [ { - "item": "create:andesite_display_cloth" + "item": "create:light_blue_table_cloth" } ], "result": { - "item": "create:andesite_display_cloth" + "item": "create:light_blue_table_cloth" } } \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/light_gray_display_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/light_gray_display_cloth_clear.json deleted file mode 100644 index 31333780a9..0000000000 --- a/src/generated/resources/data/create/recipes/crafting/logistics/light_gray_display_cloth_clear.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "category": "misc", - "ingredients": [ - { - "item": "create:light_gray_display_cloth" - } - ], - "result": { - "item": "create:light_gray_display_cloth" - } -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/light_gray_table_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/light_gray_table_cloth_clear.json new file mode 100644 index 0000000000..1247175e3e --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/light_gray_table_cloth_clear.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "create:light_gray_table_cloth" + } + ], + "result": { + "item": "create:light_gray_table_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/lime_display_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/lime_display_cloth_clear.json deleted file mode 100644 index 88e6129ddc..0000000000 --- a/src/generated/resources/data/create/recipes/crafting/logistics/lime_display_cloth_clear.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "category": "misc", - "ingredients": [ - { - "item": "create:lime_display_cloth" - } - ], - "result": { - "item": "create:lime_display_cloth" - } -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/lime_table_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/lime_table_cloth_clear.json new file mode 100644 index 0000000000..c86168830f --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/lime_table_cloth_clear.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "create:lime_table_cloth" + } + ], + "result": { + "item": "create:lime_table_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/magenta_display_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/magenta_display_cloth_clear.json deleted file mode 100644 index 6915f14279..0000000000 --- a/src/generated/resources/data/create/recipes/crafting/logistics/magenta_display_cloth_clear.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "category": "misc", - "ingredients": [ - { - "item": "create:magenta_display_cloth" - } - ], - "result": { - "item": "create:magenta_display_cloth" - } -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/brass_display_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/magenta_table_cloth_clear.json similarity index 59% rename from src/generated/resources/data/create/recipes/crafting/logistics/brass_display_cloth_clear.json rename to src/generated/resources/data/create/recipes/crafting/logistics/magenta_table_cloth_clear.json index f6255c9412..b671d67f97 100644 --- a/src/generated/resources/data/create/recipes/crafting/logistics/brass_display_cloth_clear.json +++ b/src/generated/resources/data/create/recipes/crafting/logistics/magenta_table_cloth_clear.json @@ -3,10 +3,10 @@ "category": "misc", "ingredients": [ { - "item": "create:brass_display_cloth" + "item": "create:magenta_table_cloth" } ], "result": { - "item": "create:brass_display_cloth" + "item": "create:magenta_table_cloth" } } \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/orange_display_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/orange_display_cloth_clear.json deleted file mode 100644 index 809509582a..0000000000 --- a/src/generated/resources/data/create/recipes/crafting/logistics/orange_display_cloth_clear.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "category": "misc", - "ingredients": [ - { - "item": "create:orange_display_cloth" - } - ], - "result": { - "item": "create:orange_display_cloth" - } -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/cyan_display_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/orange_table_cloth_clear.json similarity index 59% rename from src/generated/resources/data/create/recipes/crafting/logistics/cyan_display_cloth_clear.json rename to src/generated/resources/data/create/recipes/crafting/logistics/orange_table_cloth_clear.json index f554283e14..1d5b3419d9 100644 --- a/src/generated/resources/data/create/recipes/crafting/logistics/cyan_display_cloth_clear.json +++ b/src/generated/resources/data/create/recipes/crafting/logistics/orange_table_cloth_clear.json @@ -3,10 +3,10 @@ "category": "misc", "ingredients": [ { - "item": "create:cyan_display_cloth" + "item": "create:orange_table_cloth" } ], "result": { - "item": "create:cyan_display_cloth" + "item": "create:orange_table_cloth" } } \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/pink_display_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/pink_display_cloth_clear.json deleted file mode 100644 index affc56fd10..0000000000 --- a/src/generated/resources/data/create/recipes/crafting/logistics/pink_display_cloth_clear.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "category": "misc", - "ingredients": [ - { - "item": "create:pink_display_cloth" - } - ], - "result": { - "item": "create:pink_display_cloth" - } -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/pink_table_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/pink_table_cloth_clear.json new file mode 100644 index 0000000000..9211cadc57 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/pink_table_cloth_clear.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "create:pink_table_cloth" + } + ], + "result": { + "item": "create:pink_table_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/purple_display_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/purple_display_cloth_clear.json deleted file mode 100644 index 21b206c49e..0000000000 --- a/src/generated/resources/data/create/recipes/crafting/logistics/purple_display_cloth_clear.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "category": "misc", - "ingredients": [ - { - "item": "create:purple_display_cloth" - } - ], - "result": { - "item": "create:purple_display_cloth" - } -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/purple_table_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/purple_table_cloth_clear.json new file mode 100644 index 0000000000..62a9651f69 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/purple_table_cloth_clear.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "create:purple_table_cloth" + } + ], + "result": { + "item": "create:purple_table_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/red_table_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/red_table_cloth_clear.json new file mode 100644 index 0000000000..cf50fc4af2 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/red_table_cloth_clear.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "create:red_table_cloth" + } + ], + "result": { + "item": "create:red_table_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/factory_panel_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/stock_link_clear.json similarity index 62% rename from src/generated/resources/data/create/recipes/crafting/logistics/factory_panel_clear.json rename to src/generated/resources/data/create/recipes/crafting/logistics/stock_link_clear.json index 00ec03d887..f527b6de23 100644 --- a/src/generated/resources/data/create/recipes/crafting/logistics/factory_panel_clear.json +++ b/src/generated/resources/data/create/recipes/crafting/logistics/stock_link_clear.json @@ -3,10 +3,10 @@ "category": "misc", "ingredients": [ { - "item": "create:factory_panel" + "item": "create:stock_link" } ], "result": { - "item": "create:factory_panel" + "item": "create:stock_link" } } \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/white_display_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/white_display_cloth_clear.json deleted file mode 100644 index 8d0979f17d..0000000000 --- a/src/generated/resources/data/create/recipes/crafting/logistics/white_display_cloth_clear.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "category": "misc", - "ingredients": [ - { - "item": "create:white_display_cloth" - } - ], - "result": { - "item": "create:white_display_cloth" - } -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/white_table_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/white_table_cloth_clear.json new file mode 100644 index 0000000000..64a1cbf4fc --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/white_table_cloth_clear.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "create:white_table_cloth" + } + ], + "result": { + "item": "create:white_table_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/yellow_display_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/yellow_display_cloth_clear.json deleted file mode 100644 index b6a8e7b247..0000000000 --- a/src/generated/resources/data/create/recipes/crafting/logistics/yellow_display_cloth_clear.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "category": "misc", - "ingredients": [ - { - "item": "create:yellow_display_cloth" - } - ], - "result": { - "item": "create:yellow_display_cloth" - } -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/yellow_table_cloth_clear.json b/src/generated/resources/data/create/recipes/crafting/logistics/yellow_table_cloth_clear.json new file mode 100644 index 0000000000..e8a2a99a0a --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/yellow_table_cloth_clear.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "create:yellow_table_cloth" + } + ], + "result": { + "item": "create:yellow_table_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/mixing/cardboard_pulp.json b/src/generated/resources/data/create/recipes/mixing/cardboard_pulp.json index 3431023d90..c6b7bd0bb1 100644 --- a/src/generated/resources/data/create/recipes/mixing/cardboard_pulp.json +++ b/src/generated/resources/data/create/recipes/mixing/cardboard_pulp.json @@ -36,7 +36,7 @@ ], "results": [ { - "item": "create:cardboard_pulp" + "item": "create:pulp" } ] } \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/pressing/cardboard.json b/src/generated/resources/data/create/recipes/pressing/cardboard.json index 3b9533b931..6222e2cc86 100644 --- a/src/generated/resources/data/create/recipes/pressing/cardboard.json +++ b/src/generated/resources/data/create/recipes/pressing/cardboard.json @@ -2,7 +2,7 @@ "type": "create:pressing", "ingredients": [ { - "item": "create:cardboard_pulp" + "item": "create:pulp" } ], "results": [ diff --git a/src/generated/resources/data/create/tags/blocks/display_cloths.json b/src/generated/resources/data/create/tags/blocks/display_cloths.json deleted file mode 100644 index 3bb263867a..0000000000 --- a/src/generated/resources/data/create/tags/blocks/display_cloths.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "values": [ - "create:white_display_cloth", - "create:orange_display_cloth", - "create:magenta_display_cloth", - "create:light_blue_display_cloth", - "create:yellow_display_cloth", - "create:lime_display_cloth", - "create:pink_display_cloth", - "create:gray_display_cloth", - "create:light_gray_display_cloth", - "create:cyan_display_cloth", - "create:purple_display_cloth", - "create:blue_display_cloth", - "create:brown_display_cloth", - "create:green_display_cloth", - "create:red_display_cloth", - "create:black_display_cloth", - "create:andesite_display_cloth", - "create:brass_display_cloth", - "create:copper_display_cloth" - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/tags/blocks/table_cloths.json b/src/generated/resources/data/create/tags/blocks/table_cloths.json new file mode 100644 index 0000000000..20c8f0ada5 --- /dev/null +++ b/src/generated/resources/data/create/tags/blocks/table_cloths.json @@ -0,0 +1,23 @@ +{ + "values": [ + "create:white_table_cloth", + "create:orange_table_cloth", + "create:magenta_table_cloth", + "create:light_blue_table_cloth", + "create:yellow_table_cloth", + "create:lime_table_cloth", + "create:pink_table_cloth", + "create:gray_table_cloth", + "create:light_gray_table_cloth", + "create:cyan_table_cloth", + "create:purple_table_cloth", + "create:blue_table_cloth", + "create:brown_table_cloth", + "create:green_table_cloth", + "create:red_table_cloth", + "create:black_table_cloth", + "create:andesite_table_cloth", + "create:brass_table_cloth", + "create:copper_table_cloth" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/tags/items/display_cloths.json b/src/generated/resources/data/create/tags/items/display_cloths.json deleted file mode 100644 index 3bb263867a..0000000000 --- a/src/generated/resources/data/create/tags/items/display_cloths.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "values": [ - "create:white_display_cloth", - "create:orange_display_cloth", - "create:magenta_display_cloth", - "create:light_blue_display_cloth", - "create:yellow_display_cloth", - "create:lime_display_cloth", - "create:pink_display_cloth", - "create:gray_display_cloth", - "create:light_gray_display_cloth", - "create:cyan_display_cloth", - "create:purple_display_cloth", - "create:blue_display_cloth", - "create:brown_display_cloth", - "create:green_display_cloth", - "create:red_display_cloth", - "create:black_display_cloth", - "create:andesite_display_cloth", - "create:brass_display_cloth", - "create:copper_display_cloth" - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/tags/items/table_cloths.json b/src/generated/resources/data/create/tags/items/table_cloths.json new file mode 100644 index 0000000000..20c8f0ada5 --- /dev/null +++ b/src/generated/resources/data/create/tags/items/table_cloths.json @@ -0,0 +1,23 @@ +{ + "values": [ + "create:white_table_cloth", + "create:orange_table_cloth", + "create:magenta_table_cloth", + "create:light_blue_table_cloth", + "create:yellow_table_cloth", + "create:lime_table_cloth", + "create:pink_table_cloth", + "create:gray_table_cloth", + "create:light_gray_table_cloth", + "create:cyan_table_cloth", + "create:purple_table_cloth", + "create:blue_table_cloth", + "create:brown_table_cloth", + "create:green_table_cloth", + "create:red_table_cloth", + "create:black_table_cloth", + "create:andesite_table_cloth", + "create:brass_table_cloth", + "create:copper_table_cloth" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json b/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json index c1d4637403..f676ea6278 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json @@ -87,6 +87,9 @@ "create:rotation_speed_controller", "create:mechanical_arm", "create:railway_casing", + "create:content_observer", + "create:stockpile_switch", + "create:creative_crate", "create:white_postbox", "create:orange_postbox", "create:magenta_postbox", @@ -105,9 +108,6 @@ "create:black_postbox", "create:stock_ticker", "create:redstone_requester", - "create:content_observer", - "create:stockpile_switch", - "create:creative_crate", "create:display_link", "create:redstone_link", "create:analog_lever", diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json index b928713753..f37e5e2b7c 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json @@ -121,17 +121,6 @@ "create:small_bogey", "create:large_bogey", "create:controls", - "create:item_vault", - "create:item_hatch", - "create:packager", - "create:package_frogport", - "create:packager_link", - "create:stock_ticker", - "create:redstone_requester", - "create:factory_panel", - "create:andesite_display_cloth", - "create:brass_display_cloth", - "create:copper_display_cloth", "create:andesite_funnel", "create:andesite_belt_funnel", "create:brass_funnel", @@ -141,6 +130,17 @@ "create:content_observer", "create:stockpile_switch", "create:creative_crate", + "create:item_vault", + "create:item_hatch", + "create:packager", + "create:package_frogport", + "create:stock_link", + "create:stock_ticker", + "create:redstone_requester", + "create:factory_gauge", + "create:andesite_table_cloth", + "create:brass_table_cloth", + "create:copper_table_cloth", "create:display_link", "create:display_board", "create:nixie_tube", diff --git a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java index 1c64d3ef39..9a8370f912 100644 --- a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java +++ b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java @@ -519,7 +519,7 @@ public class AllBlockEntityTypes { public static final BlockEntityEntry DISPLAY_CLOTH = REGISTRATE.blockEntity("display_cloth", DisplayClothBlockEntity::new) - .validBlocks(AllBlocks.DISPLAY_CLOTHS.toArray()) + .validBlocks(AllBlocks.TABLE_CLOTHS.toArray()) .validBlock(AllBlocks.ANDESITE_DISPLAY_CLOTH) .validBlock(AllBlocks.BRASS_DISPLAY_CLOTH) .validBlock(AllBlocks.COPPER_DISPLAY_CLOTH) @@ -528,7 +528,7 @@ public class AllBlockEntityTypes { public static final BlockEntityEntry PACKAGER_LINK = REGISTRATE .blockEntity("packager_link", PackagerLinkBlockEntity::new) - .validBlocks(AllBlocks.PACKAGER_LINK) + .validBlocks(AllBlocks.STOCK_LINK) .renderer(() -> LinkBulbRenderer::new) .register(); @@ -796,7 +796,7 @@ public class AllBlockEntityTypes { public static final BlockEntityEntry FACTORY_PANEL = REGISTRATE.blockEntity("factory_panel", FactoryPanelBlockEntity::new) - .validBlocks(AllBlocks.FACTORY_PANEL) + .validBlocks(AllBlocks.FACTORY_GAUGE) .renderer(() -> FactoryPanelRenderer::new) .register(); diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 4620c0fcb6..fcf43f631c 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -1703,168 +1703,6 @@ public class AllBlocks { .transform(customItemModel()) .register(); - public static final BlockEntry ITEM_VAULT = REGISTRATE.block("item_vault", ItemVaultBlock::new) - .initialProperties(SharedProperties::softMetal) - .properties(p -> p.mapColor(MapColor.TERRACOTTA_BLUE) - .sound(SoundType.NETHERITE_BLOCK) - .explosionResistance(1200)) - .transform(pickaxeOnly()) - .blockstate((c, p) -> p.getVariantBuilder(c.get()) - .forAllStates(s -> ConfiguredModel.builder() - .modelFile(AssetLookup.standardModel(c, p)) - .rotationY(s.getValue(ItemVaultBlock.HORIZONTAL_AXIS) == Axis.X ? 90 : 0) - .build())) - .onRegister(connectedTextures(ItemVaultCTBehaviour::new)) - .item(ItemVaultItem::new) - .build() - .register(); - - public static final BlockEntry ITEM_HATCH = REGISTRATE.block("item_hatch", ItemHatchBlock::new) - .initialProperties(SharedProperties::softMetal) - .properties(p -> p.mapColor(MapColor.TERRACOTTA_BLUE) - .sound(SoundType.NETHERITE_BLOCK)) - .transform(pickaxeOnly()) - .addLayer(() -> RenderType::cutoutMipped) - .blockstate((c, p) -> p.horizontalBlock(c.get(), - s -> AssetLookup.partialBaseModel(c, p, s.getValue(ItemHatchBlock.OPEN) ? "open" : "closed"))) - .item() - .transform(customItemModel("_", "block_closed")) - .register(); - - public static final BlockEntry PACKAGER = REGISTRATE.block("packager", PackagerBlock::new) - .initialProperties(SharedProperties::softMetal) - .properties(p -> p.noOcclusion()) - .properties(p -> p.isRedstoneConductor(($1, $2, $3) -> false)) - .properties(p -> p.mapColor(MapColor.TERRACOTTA_BLUE) - .sound(SoundType.NETHERITE_BLOCK)) - .transform(pickaxeOnly()) - .addLayer(() -> RenderType::cutoutMipped) - .blockstate(new PackagerGenerator()::generate) - .transform(BlockStressDefaults.setImpact(1.0)) - .item() - .model(AssetLookup::customItemModel) - .build() - .register(); - - public static final BlockEntry PACKAGE_FROGPORT = - REGISTRATE.block("package_frogport", FrogportBlock::new) - .initialProperties(SharedProperties::softMetal) - .properties(p -> p.noOcclusion()) - .properties(p -> p.mapColor(MapColor.TERRACOTTA_BLUE) - .sound(SoundType.NETHERITE_BLOCK)) - .transform(pickaxeOnly()) - .addLayer(() -> RenderType::cutoutMipped) - .blockstate((c, p) -> p.simpleBlock(c.getEntry(), AssetLookup.partialBaseModel(c, p))) - .item(PackagePortItem::new) - .model(AssetLookup::customItemModel) - .build() - .register(); - - public static final DyedBlockList PACKAGE_POSTBOXES = new DyedBlockList<>(colour -> { - String colourName = colour.getSerializedName(); - return REGISTRATE.block(colourName + "_postbox", p -> new PostboxBlock(p, colour)) - .initialProperties(SharedProperties::wooden) - .properties(p -> p.mapColor(colour)) - .transform(axeOnly()) - .blockstate((c, p) -> { - p.horizontalBlock(c.get(), s -> { - String suffix = s.getValue(PostboxBlock.OPEN) ? "open" : "closed"; - return p.models() - .withExistingParent(colourName + "_postbox_" + suffix, - p.modLoc("block/package_postbox/block_" + suffix)) - .texture("0", p.modLoc("block/post_box/post_box_" + colourName)) - .texture("1", p.modLoc("block/post_box/post_box_" + colourName + "_" + suffix)); - }); - }) - .tag(AllBlockTags.POSTBOXES.tag) - .onRegisterAfter(Registries.ITEM, v -> ItemDescription.useKey(v, "block.create.package_postbox")) - .item(PackagePortItem::new) - .model((c, p) -> p.withExistingParent(colourName + "_postbox", p.modLoc("block/package_postbox/item")) - .texture("0", p.modLoc("block/post_box/post_box_" + colourName)) - .texture("1", p.modLoc("block/post_box/post_box_" + colourName + "_closed"))) - .tag(AllItemTags.POSTBOXES.tag) - .build() - .register(); - }); - - public static final BlockEntry PACKAGER_LINK = - REGISTRATE.block("packager_link", PackagerLinkBlock::new) - .initialProperties(SharedProperties::softMetal) - .properties(p -> p.mapColor(MapColor.TERRACOTTA_BLUE) - .sound(SoundType.NETHERITE_BLOCK)) - .addLayer(() -> RenderType::translucent) - .transform(pickaxeOnly()) - .blockstate((c, p) -> p.directionalBlock(c.get(), AssetLookup.forPowered(c, p))) - .item(LogisticallyLinkedBlockItem::new) - .transform(customItemModel("_", "block")) - .register(); - - public static final BlockEntry STOCK_TICKER = - REGISTRATE.block("stock_ticker", StockTickerBlock::new) - .initialProperties(SharedProperties::softMetal) - .properties(p -> p.sound(SoundType.GLASS)) - .transform(axeOrPickaxe()) - .addLayer(() -> RenderType::cutoutMipped) - .blockstate((c, p) -> p.horizontalBlock(c.get(), AssetLookup.standardModel(c, p))) - .item(LogisticallyLinkedBlockItem::new) - .build() - .register(); - - public static final BlockEntry REDSTONE_REQUESTER = - REGISTRATE.block("redstone_requester", RedstoneRequesterBlock::new) - .initialProperties(SharedProperties::stone) - .properties(p -> p.sound(SoundType.WOOD)) - .transform(axeOrPickaxe()) - .blockstate((c, p) -> BlockStateGen.simpleBlock(c, p, AssetLookup.forPowered(c, p))) - .item(RedstoneRequesterBlockItem::new) - .transform(customItemModel("_", "block")) - .register(); - - public static final BlockEntry FACTORY_PANEL = - REGISTRATE.block("factory_panel", FactoryPanelBlock::new) - .addLayer(() -> RenderType::cutoutMipped) - .initialProperties(SharedProperties::copperMetal) - .properties(p -> p.noOcclusion()) - .properties(p -> p.forceSolidOn()) - .transform(pickaxeOnly()) - .blockstate((c, p) -> p.horizontalFaceBlock(c.get(), AssetLookup.partialBaseModel(c, p))) - .onRegister(CreateRegistrate.blockModel(() -> FactoryPanelModel::new)) - .item(FactoryPanelBlockItem::new) - .model(AssetLookup::customItemModel) - .build() - .register(); - - public static final DyedBlockList DISPLAY_CLOTHS = new DyedBlockList<>(colour -> { - String colourName = colour.getSerializedName(); - return REGISTRATE.block(colourName + "_display_cloth", p -> new DisplayClothBlock(p, colour)) - .transform(BuilderTransformers.displayCloth(colourName, () -> Blocks.BLACK_CARPET, false)) - .properties(p -> p.mapColor(colour)) - .register(); - }); - - public static final BlockEntry ANDESITE_DISPLAY_CLOTH = - REGISTRATE.block("andesite_display_cloth", p -> new DisplayClothBlock(p, "andesite")) - .transform(BuilderTransformers.displayCloth("andesite", SharedProperties::stone, true)) - .properties(p -> p.mapColor(MapColor.STONE) - .requiresCorrectToolForDrops()) - .transform(pickaxeOnly()) - .register(); - - public static final BlockEntry BRASS_DISPLAY_CLOTH = - REGISTRATE.block("brass_display_cloth", p -> new DisplayClothBlock(p, "brass")) - .transform(BuilderTransformers.displayCloth("brass", SharedProperties::softMetal, true)) - .properties(p -> p.mapColor(MapColor.TERRACOTTA_YELLOW) - .requiresCorrectToolForDrops()) - .transform(pickaxeOnly()) - .register(); - - public static final BlockEntry COPPER_DISPLAY_CLOTH = - REGISTRATE.block("copper_display_cloth", p -> new DisplayClothBlock(p, "copper")) - .transform(BuilderTransformers.displayCloth("copper", SharedProperties::copperMetal, true)) - .properties(p -> p.requiresCorrectToolForDrops()) - .transform(pickaxeOnly()) - .register(); - public static final BlockEntry ANDESITE_FUNNEL = REGISTRATE.block("andesite_funnel", AndesiteFunnelBlock::new) .addLayer(() -> RenderType::cutoutMipped) @@ -1970,6 +1808,168 @@ public class AllBlocks { .transform(BuilderTransformers.crate("creative")) .properties(p -> p.mapColor(MapColor.COLOR_PURPLE)) .register(); + + public static final BlockEntry ITEM_VAULT = REGISTRATE.block("item_vault", ItemVaultBlock::new) + .initialProperties(SharedProperties::softMetal) + .properties(p -> p.mapColor(MapColor.TERRACOTTA_BLUE) + .sound(SoundType.NETHERITE_BLOCK) + .explosionResistance(1200)) + .transform(pickaxeOnly()) + .blockstate((c, p) -> p.getVariantBuilder(c.get()) + .forAllStates(s -> ConfiguredModel.builder() + .modelFile(AssetLookup.standardModel(c, p)) + .rotationY(s.getValue(ItemVaultBlock.HORIZONTAL_AXIS) == Axis.X ? 90 : 0) + .build())) + .onRegister(connectedTextures(ItemVaultCTBehaviour::new)) + .item(ItemVaultItem::new) + .build() + .register(); + + public static final BlockEntry ITEM_HATCH = REGISTRATE.block("item_hatch", ItemHatchBlock::new) + .initialProperties(SharedProperties::softMetal) + .properties(p -> p.mapColor(MapColor.TERRACOTTA_BLUE) + .sound(SoundType.NETHERITE_BLOCK)) + .transform(pickaxeOnly()) + .addLayer(() -> RenderType::cutoutMipped) + .blockstate((c, p) -> p.horizontalBlock(c.get(), + s -> AssetLookup.partialBaseModel(c, p, s.getValue(ItemHatchBlock.OPEN) ? "open" : "closed"))) + .item() + .transform(customItemModel("_", "block_closed")) + .register(); + + public static final BlockEntry PACKAGER = REGISTRATE.block("packager", PackagerBlock::new) + .initialProperties(SharedProperties::softMetal) + .properties(p -> p.noOcclusion()) + .properties(p -> p.isRedstoneConductor(($1, $2, $3) -> false)) + .properties(p -> p.mapColor(MapColor.TERRACOTTA_BLUE) + .sound(SoundType.NETHERITE_BLOCK)) + .transform(pickaxeOnly()) + .addLayer(() -> RenderType::cutoutMipped) + .blockstate(new PackagerGenerator()::generate) + .transform(BlockStressDefaults.setImpact(1.0)) + .item() + .model(AssetLookup::customItemModel) + .build() + .register(); + + public static final BlockEntry PACKAGE_FROGPORT = + REGISTRATE.block("package_frogport", FrogportBlock::new) + .initialProperties(SharedProperties::softMetal) + .properties(p -> p.noOcclusion()) + .properties(p -> p.mapColor(MapColor.TERRACOTTA_BLUE) + .sound(SoundType.NETHERITE_BLOCK)) + .transform(pickaxeOnly()) + .addLayer(() -> RenderType::cutoutMipped) + .blockstate((c, p) -> p.simpleBlock(c.getEntry(), AssetLookup.partialBaseModel(c, p))) + .item(PackagePortItem::new) + .model(AssetLookup::customItemModel) + .build() + .register(); + + public static final DyedBlockList PACKAGE_POSTBOXES = new DyedBlockList<>(colour -> { + String colourName = colour.getSerializedName(); + return REGISTRATE.block(colourName + "_postbox", p -> new PostboxBlock(p, colour)) + .initialProperties(SharedProperties::wooden) + .properties(p -> p.mapColor(colour)) + .transform(axeOnly()) + .blockstate((c, p) -> { + p.horizontalBlock(c.get(), s -> { + String suffix = s.getValue(PostboxBlock.OPEN) ? "open" : "closed"; + return p.models() + .withExistingParent(colourName + "_postbox_" + suffix, + p.modLoc("block/package_postbox/block_" + suffix)) + .texture("0", p.modLoc("block/post_box/post_box_" + colourName)) + .texture("1", p.modLoc("block/post_box/post_box_" + colourName + "_" + suffix)); + }); + }) + .tag(AllBlockTags.POSTBOXES.tag) + .onRegisterAfter(Registries.ITEM, v -> ItemDescription.useKey(v, "block.create.package_postbox")) + .item(PackagePortItem::new) + .model((c, p) -> p.withExistingParent(colourName + "_postbox", p.modLoc("block/package_postbox/item")) + .texture("0", p.modLoc("block/post_box/post_box_" + colourName)) + .texture("1", p.modLoc("block/post_box/post_box_" + colourName + "_closed"))) + .tag(AllItemTags.POSTBOXES.tag) + .build() + .register(); + }); + + public static final BlockEntry STOCK_LINK = + REGISTRATE.block("stock_link", PackagerLinkBlock::new) + .initialProperties(SharedProperties::softMetal) + .properties(p -> p.mapColor(MapColor.TERRACOTTA_BLUE) + .sound(SoundType.NETHERITE_BLOCK)) + .addLayer(() -> RenderType::translucent) + .transform(pickaxeOnly()) + .blockstate((c, p) -> p.directionalBlock(c.get(), AssetLookup.forPowered(c, p))) + .item(LogisticallyLinkedBlockItem::new) + .transform(customItemModel("_", "block")) + .register(); + + public static final BlockEntry STOCK_TICKER = + REGISTRATE.block("stock_ticker", StockTickerBlock::new) + .initialProperties(SharedProperties::softMetal) + .properties(p -> p.sound(SoundType.GLASS)) + .transform(axeOrPickaxe()) + .addLayer(() -> RenderType::cutoutMipped) + .blockstate((c, p) -> p.horizontalBlock(c.get(), AssetLookup.standardModel(c, p))) + .item(LogisticallyLinkedBlockItem::new) + .build() + .register(); + + public static final BlockEntry REDSTONE_REQUESTER = + REGISTRATE.block("redstone_requester", RedstoneRequesterBlock::new) + .initialProperties(SharedProperties::stone) + .properties(p -> p.sound(SoundType.WOOD)) + .transform(axeOrPickaxe()) + .blockstate((c, p) -> BlockStateGen.simpleBlock(c, p, AssetLookup.forPowered(c, p))) + .item(RedstoneRequesterBlockItem::new) + .transform(customItemModel("_", "block")) + .register(); + + public static final BlockEntry FACTORY_GAUGE = + REGISTRATE.block("factory_gauge", FactoryPanelBlock::new) + .addLayer(() -> RenderType::cutoutMipped) + .initialProperties(SharedProperties::copperMetal) + .properties(p -> p.noOcclusion()) + .properties(p -> p.forceSolidOn()) + .transform(pickaxeOnly()) + .blockstate((c, p) -> p.horizontalFaceBlock(c.get(), AssetLookup.partialBaseModel(c, p))) + .onRegister(CreateRegistrate.blockModel(() -> FactoryPanelModel::new)) + .item(FactoryPanelBlockItem::new) + .model(AssetLookup::customItemModel) + .build() + .register(); + + public static final DyedBlockList TABLE_CLOTHS = new DyedBlockList<>(colour -> { + String colourName = colour.getSerializedName(); + return REGISTRATE.block(colourName + "_table_cloth", p -> new DisplayClothBlock(p, colour)) + .transform(BuilderTransformers.tableCloth(colourName, () -> Blocks.BLACK_CARPET, false)) + .properties(p -> p.mapColor(colour)) + .register(); + }); + + public static final BlockEntry ANDESITE_DISPLAY_CLOTH = + REGISTRATE.block("andesite_table_cloth", p -> new DisplayClothBlock(p, "andesite")) + .transform(BuilderTransformers.tableCloth("andesite", SharedProperties::stone, true)) + .properties(p -> p.mapColor(MapColor.STONE) + .requiresCorrectToolForDrops()) + .transform(pickaxeOnly()) + .register(); + + public static final BlockEntry BRASS_DISPLAY_CLOTH = + REGISTRATE.block("brass_table_cloth", p -> new DisplayClothBlock(p, "brass")) + .transform(BuilderTransformers.tableCloth("brass", SharedProperties::softMetal, true)) + .properties(p -> p.mapColor(MapColor.TERRACOTTA_YELLOW) + .requiresCorrectToolForDrops()) + .transform(pickaxeOnly()) + .register(); + + public static final BlockEntry COPPER_DISPLAY_CLOTH = + REGISTRATE.block("copper_table_cloth", p -> new DisplayClothBlock(p, "copper")) + .transform(BuilderTransformers.tableCloth("copper", SharedProperties::copperMetal, true)) + .properties(p -> p.requiresCorrectToolForDrops()) + .transform(pickaxeOnly()) + .register(); public static final BlockEntry DISPLAY_LINK = REGISTRATE.block("display_link", DisplayLinkBlock::new) diff --git a/src/main/java/com/simibubi/create/AllCreativeModeTabs.java b/src/main/java/com/simibubi/create/AllCreativeModeTabs.java index 98177e85a7..ba447a3b3a 100644 --- a/src/main/java/com/simibubi/create/AllCreativeModeTabs.java +++ b/src/main/java/com/simibubi/create/AllCreativeModeTabs.java @@ -177,7 +177,11 @@ public class AllCreativeModeTabs { ); Map, ItemProviderEntry> simpleAfterOrderings = Map.of( - AllItems.VERTICAL_GEARBOX, AllBlocks.GEARBOX + AllItems.VERTICAL_GEARBOX, AllBlocks.GEARBOX, + AllItems.CARDBOARD_PACKAGE_10x12, AllBlocks.PACKAGER, + AllItems.CARDBOARD_PACKAGE_12x12, AllBlocks.PACKAGER, + AllItems.CARDBOARD_PACKAGE_10x8, AllBlocks.PACKAGER, + AllItems.CARDBOARD_PACKAGE_12x10, AllBlocks.PACKAGER ); simpleBeforeOrderings.forEach((entry, otherEntry) -> { @@ -242,7 +246,7 @@ public class AllCreativeModeTabs { } } - for (BlockEntry entry : AllBlocks.DISPLAY_CLOTHS) { + for (BlockEntry entry : AllBlocks.TABLE_CLOTHS) { DisplayClothBlock block = entry.get(); if (block.getColor() != DyeColor.RED) { visibilities.put(entry.asItem(), TabVisibility.SEARCH_TAB_ONLY); diff --git a/src/main/java/com/simibubi/create/AllItems.java b/src/main/java/com/simibubi/create/AllItems.java index 106ceda5be..7d9e9940f2 100644 --- a/src/main/java/com/simibubi/create/AllItems.java +++ b/src/main/java/com/simibubi/create/AllItems.java @@ -88,7 +88,7 @@ public class AllItems { STURDY_SHEET = taggedIngredient("sturdy_sheet", forgeItemTag("plates/obsidian"), PLATES.tag), PROPELLER = ingredient("propeller"), WHISK = ingredient("whisk"), BRASS_HAND = ingredient("brass_hand"), CRAFTER_SLOT_COVER = ingredient("crafter_slot_cover"), ELECTRON_TUBE = ingredient("electron_tube"), - CARDBOARD_PULP = ingredient("cardboard_pulp"); + PULP = ingredient("pulp"); public static final ItemEntry CARDBOARD = REGISTRATE.item("cardboard", CombustibleItem::new) .tag(forgeItemTag("plates/cardboard")) diff --git a/src/main/java/com/simibubi/create/AllPartialModels.java b/src/main/java/com/simibubi/create/AllPartialModels.java index 2d1b4683a4..2ce86166a0 100644 --- a/src/main/java/com/simibubi/create/AllPartialModels.java +++ b/src/main/java/com/simibubi/create/AllPartialModels.java @@ -183,18 +183,16 @@ public class AllPartialModels { WATER_WHEEL = block("water_wheel/wheel"), LARGE_WATER_WHEEL = block("large_water_wheel/block"), LARGE_WATER_WHEEL_EXTENSION = block("large_water_wheel/block_extension"), - FACTORY_PANEL = block("factory_panel/panel"), - FACTORY_PANEL_WITH_BULB = block("factory_panel/panel_with_bulb"), - FACTORY_PANEL_RESTOCKER = block("factory_panel/panel_restocker"), - FACTORY_PANEL_RESTOCKER_WITH_BULB = block("factory_panel/panel_restocker_with_bulb"), - FACTORY_PANEL_LIGHT = block("factory_panel/bulb_light"), + FACTORY_PANEL = block("factory_gauge/panel"), + FACTORY_PANEL_WITH_BULB = block("factory_gauge/panel_with_bulb"), + FACTORY_PANEL_RESTOCKER = block("factory_gauge/panel_restocker"), + FACTORY_PANEL_RESTOCKER_WITH_BULB = block("factory_gauge/panel_restocker_with_bulb"), + FACTORY_PANEL_LIGHT = block("factory_gauge/bulb_light"), - DISPLAY_CLOTH_NW = block("display_cloth/north_west"), - DISPLAY_CLOTH_NE = block("display_cloth/north_east"), - DISPLAY_CLOTH_SW = block("display_cloth/south_west"), - DISPLAY_CLOTH_SE = block("display_cloth/south_east"), - - DISPLAY_CLOTH = entity("display_cloth"), + DISPLAY_CLOTH_NW = block("table_cloth/north_west"), + DISPLAY_CLOTH_NE = block("table_cloth/north_east"), + DISPLAY_CLOTH_SW = block("table_cloth/south_west"), + DISPLAY_CLOTH_SE = block("table_cloth/south_east"), CRAFTING_BLUEPRINT_1x1 = entity("crafting_blueprint_small"), CRAFTING_BLUEPRINT_2x2 = entity("crafting_blueprint_medium"), @@ -236,8 +234,8 @@ public class AllPartialModels { TOOLBOX_LIDS.put(color, block("toolbox/lid/" + Lang.asId(color.name()))); for (Direction d : Iterate.horizontalDirections) { METAL_GIRDER_BRACKETS.put(d, block("metal_girder/bracket_" + Lang.asId(d.name()))); - FACTORY_PANEL_ARROWS.put(d, block("factory_panel/connections/arrow_" + Lang.asId(d.name()))); - FACTORY_PANEL_LINES.put(d, block("factory_panel/connections/line_" + Lang.asId(d.name()))); + FACTORY_PANEL_ARROWS.put(d, block("factory_gauge/connections/arrow_" + Lang.asId(d.name()))); + FACTORY_PANEL_LINES.put(d, block("factory_gauge/connections/line_" + Lang.asId(d.name()))); } for (int i = 0; i < 8; i++) CONTRAPTION_CONTROLS_INDICATOR.add(block("contraption_controls/indicator_" + i)); diff --git a/src/main/java/com/simibubi/create/AllTags.java b/src/main/java/com/simibubi/create/AllTags.java index 8746b07c0f..c5da22d2a4 100644 --- a/src/main/java/com/simibubi/create/AllTags.java +++ b/src/main/java/com/simibubi/create/AllTags.java @@ -97,7 +97,7 @@ public class AllTags { SAFE_NBT, SEATS, POSTBOXES, - DISPLAY_CLOTHS, + TABLE_CLOTHS, TOOLBOXES, TRACKS, TREE_ATTACHMENTS, @@ -178,7 +178,7 @@ public class AllTags { SANDPAPER, SEATS, POSTBOXES, - DISPLAY_CLOTHS, + TABLE_CLOTHS, SLEEPERS, TOOLBOXES, TRACKS, diff --git a/src/main/java/com/simibubi/create/content/contraptions/actors/seat/SeatBlock.java b/src/main/java/com/simibubi/create/content/contraptions/actors/seat/SeatBlock.java index 2e2e85cf64..11c6c964af 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/actors/seat/SeatBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/actors/seat/SeatBlock.java @@ -42,6 +42,7 @@ import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.EntityCollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; +import net.minecraftforge.common.util.FakePlayer; @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault @@ -128,7 +129,7 @@ public class SeatBlock extends Block implements ProperWaterloggedBlock { @Override public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult p_225533_6_) { - if (player.isShiftKeyDown()) + if (player.isShiftKeyDown() || player instanceof FakePlayer) return InteractionResult.PASS; ItemStack heldItem = player.getItemInHand(hand); diff --git a/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorHandler.java b/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorHandler.java index 8f218b44a2..ecdc242952 100644 --- a/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorHandler.java +++ b/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorHandler.java @@ -12,8 +12,10 @@ import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.NeutralMob; import net.minecraft.world.entity.Pose; import net.minecraft.world.entity.ai.goal.target.TargetGoal; +import net.minecraft.world.entity.player.Player; import net.minecraftforge.event.entity.living.LivingEvent.LivingTickEvent; import net.minecraftforge.event.entity.living.LivingEvent.LivingVisibilityEvent; +import net.minecraftforge.event.level.NoteBlockEvent.Play; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; @@ -63,6 +65,8 @@ public class CardboardArmorHandler { return false; if (entity.getPose() != Pose.CROUCHING) return false; + if (entity instanceof Player player && player.getAbilities().flying) + return false; if (!AllItems.CARDBOARD_HELMET.isIn(entity.getItemBySlot(EquipmentSlot.HEAD))) return false; if (!AllItems.CARDBOARD_CHESTPLATE.isIn(entity.getItemBySlot(EquipmentSlot.CHEST))) diff --git a/src/main/java/com/simibubi/create/content/kinetics/drill/DrillBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/drill/DrillBlockEntity.java index a115449680..64fd8b6f5f 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/drill/DrillBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/drill/DrillBlockEntity.java @@ -65,10 +65,13 @@ public class DrillBlockEntity extends BlockBreakingKineticBlockEntity { inv.handleInsertion(stack, Direction.UP, false); else { BlockEntity blockEntity = level.getBlockEntity(breakingPos.below()); - if (blockEntity instanceof HopperBlockEntity hbe && hbe.getCapability(ForgeCapabilities.ITEM_HANDLER) - .orElse(null) instanceof IItemHandler handler) - for (ItemStack stack : Block.getDrops(stateToBreak, sl, breakingPos, null)) - ItemHandlerHelper.insertItemStacked(handler, stack, false); + if (blockEntity instanceof HopperBlockEntity hbe) { + IItemHandler handler = hbe.getCapability(ForgeCapabilities.ITEM_HANDLER) + .orElse(null); + if (handler != null) + for (ItemStack stack : Block.getDrops(stateToBreak, sl, breakingPos, null)) + ItemHandlerHelper.insertItemStacked(handler, stack, false); + } } level.levelEvent(2001, breakingPos, Block.getId(stateToBreak)); diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothBlock.java b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothBlock.java index 484ed06e1b..148317bfdc 100644 --- a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothBlock.java @@ -126,7 +126,7 @@ public class DisplayClothBlock extends Block implements IHaveBigOutline, IWrench return drops; for (ItemStack stack : drops) { - if (AllItemTags.DISPLAY_CLOTHS.matches(stack)) { + if (AllItemTags.TABLE_CLOTHS.matches(stack)) { ItemStack drop = new ItemStack(this); dcbe.requestData.writeToItem(dcbe.getBlockPos(), drop); return List.of(drop); @@ -196,7 +196,7 @@ public class DisplayClothBlock extends Block implements IHaveBigOutline, IWrench @Override public Predicate getItemPredicate() { - return i -> AllItemTags.DISPLAY_CLOTHS.matches(i.getItem()); + return i -> AllItemTags.TABLE_CLOTHS.matches(i.getItem()); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java index fdac6383ef..1e913c63f8 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java @@ -355,7 +355,7 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { return; if (getFilter().isEmpty()) { - if (AllBlocks.FACTORY_PANEL.isIn(player.getItemInHand(hand))) + if (AllBlocks.FACTORY_GAUGE.isIn(player.getItemInHand(hand))) return; super.onShortInteract(player, hand, side, hitResult); diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java index d37c86d83e..8a8a0cc3db 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java @@ -146,7 +146,7 @@ public class FactoryPanelBlock extends FaceAttachedHorizontalDirectionalBlock if (!player.isCreative()) player.getInventory() - .placeItemBackInInventory(AllBlocks.FACTORY_PANEL.asStack()); + .placeItemBackInInventory(AllBlocks.FACTORY_GAUGE.asStack()); playRemoveSound(world, pos); if (be.activePanels() == 0) @@ -180,7 +180,7 @@ public class FactoryPanelBlock extends FaceAttachedHorizontalDirectionalBlock ItemStack item = pPlayer.getItemInHand(pHand); if (pLevel.isClientSide) return InteractionResult.SUCCESS; - if (!AllBlocks.FACTORY_PANEL.isIn(item)) + if (!AllBlocks.FACTORY_GAUGE.isIn(item)) return InteractionResult.SUCCESS; Vec3 location = pHit.getLocation(); if (location == null) @@ -229,7 +229,7 @@ public class FactoryPanelBlock extends FaceAttachedHorizontalDirectionalBlock if (!fpbe.removePanel(destroyedSlot)) return InteractionResult.FAIL; if (!player.isCreative()) - popResource(level, pos, AllBlocks.FACTORY_PANEL.asStack()); + popResource(level, pos, AllBlocks.FACTORY_GAUGE.asStack()); return InteractionResult.SUCCESS; }); } @@ -253,7 +253,7 @@ public class FactoryPanelBlock extends FaceAttachedHorizontalDirectionalBlock public boolean canBeReplaced(BlockState pState, BlockPlaceContext pUseContext) { if (pUseContext.isSecondaryUseActive()) return false; - if (!AllBlocks.FACTORY_PANEL.isIn(pUseContext.getItemInHand())) + if (!AllBlocks.FACTORY_GAUGE.isIn(pUseContext.getItemInHand())) return false; Vec3 location = pUseContext.getClickLocation(); if (location == null) diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java index 0a2fc566a4..ad4b6bcc47 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java @@ -62,7 +62,7 @@ public class FactoryPanelBlockEntity extends SmartBlockEntity { if (activePanels() == 0) level.destroyBlock(worldPosition, false); - if (AllBlocks.FACTORY_PANEL.has(getBlockState())) { + if (AllBlocks.FACTORY_GAUGE.has(getBlockState())) { boolean shouldBeRestocker = AllBlocks.PACKAGER .has(level.getBlockState(worldPosition.relative(FactoryPanelBlock.connectedDirection(getBlockState()) .getOpposite()))); @@ -77,7 +77,7 @@ public class FactoryPanelBlockEntity extends SmartBlockEntity { @Nullable public PackagerBlockEntity getRestockedPackager() { BlockState state = getBlockState(); - if (!restocker || !AllBlocks.FACTORY_PANEL.has(state)) + if (!restocker || !AllBlocks.FACTORY_GAUGE.has(state)) return null; BlockPos packagerPos = worldPosition.relative(FactoryPanelBlock.connectedDirection(state) .getOpposite()); @@ -102,7 +102,7 @@ public class FactoryPanelBlockEntity extends SmartBlockEntity { super.destroy(); int panelCount = activePanels(); if (panelCount > 1) - Block.popResource(level, worldPosition, AllBlocks.FACTORY_PANEL.asStack(panelCount - 1)); + Block.popResource(level, worldPosition, AllBlocks.FACTORY_GAUGE.asStack(panelCount - 1)); } public boolean addPanel(PanelSlot slot, UUID frequency) { diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelEffectPacket.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelEffectPacket.java index f92592e46d..3f3a1110c2 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelEffectPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelEffectPacket.java @@ -46,7 +46,7 @@ public class FactoryPanelEffectPacket extends SimplePacketBase { public boolean handle(Context context) { ClientLevel level = Minecraft.getInstance().level; BlockState blockState = level.getBlockState(fromPos.pos()); - if (!AllBlocks.FACTORY_PANEL.has(blockState)) + if (!AllBlocks.FACTORY_GAUGE.has(blockState)) return true; FactoryPanelBehaviour panelBehaviour = FactoryPanelBehaviour.at(level, toPos); if (panelBehaviour != null) { diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java index 91aade7ff3..aee258ba11 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java @@ -41,6 +41,7 @@ import net.minecraft.world.item.crafting.CraftingRecipe; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.RecipeType; +import net.minecraftforge.items.ItemHandlerHelper; public class FactoryPanelScreen extends AbstractSimiScreen { @@ -77,7 +78,8 @@ public class FactoryPanelScreen extends AbstractSimiScreen { return b == null ? new BigItemStack(ItemStack.EMPTY, 0) : new BigItemStack(b.getFilter(), c.amount); }) .toList(); - searchForCraftingRecipe(); + +// searchForCraftingRecipe(); TODO finish crafter integration craftingActive = false; if (availableCraftingRecipe == null) @@ -260,7 +262,7 @@ public class FactoryPanelScreen extends AbstractSimiScreen { // ITEM PREVIEW ms.pushPose(); ms.translate(0, middleHeight() - 25, 0); - GuiGameElement.of(AllBlocks.FACTORY_PANEL.asStack()) + GuiGameElement.of(AllBlocks.FACTORY_GAUGE.asStack()) .scale(4) .at(0, 0, -200) .render(graphics, x + 175, y + 55); @@ -538,9 +540,15 @@ public class FactoryPanelScreen extends AbstractSimiScreen { private void sendIt(@Nullable FactoryPanelPosition toRemove, boolean clearPromises) { Map inputs = new HashMap<>(); + if (inputConfig.size() == connections.size()) - for (int i = 0; i < inputConfig.size(); i++) - inputs.put(connections.get(i).from, inputConfig.get(i).count); + for (int i = 0; i < inputConfig.size(); i++) { + BigItemStack stackInConfig = inputConfig.get(i); + inputs.put(connections.get(i).from, craftingActive ? (int) craftingIngredients.stream() + .filter( + b -> !b.stack.isEmpty() && ItemHandlerHelper.canItemStacksStack(b.stack, stackInConfig.stack)) + .count() : stackInConfig.count); + } List craftingArrangement = craftingActive ? craftingIngredients.stream() .map(b -> b.stack) diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/postbox/PostboxBlock.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/postbox/PostboxBlock.java index baa0dc05ed..24820e3066 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/postbox/PostboxBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/postbox/PostboxBlock.java @@ -2,6 +2,7 @@ package com.simibubi.create.content.logistics.packagePort.postbox; import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllShapes; +import com.simibubi.create.content.equipment.wrench.IWrenchable; import com.simibubi.create.foundation.block.IBE; import net.minecraft.core.BlockPos; @@ -24,7 +25,7 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; -public class PostboxBlock extends HorizontalDirectionalBlock implements IBE { +public class PostboxBlock extends HorizontalDirectionalBlock implements IBE, IWrenchable { public static final BooleanProperty OPEN = BlockStateProperties.OPEN; diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java index a6ac22062b..9a1e6a361d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java @@ -92,7 +92,7 @@ public class PackagerBlock extends WrenchableDirectionalBlock implements IBE { diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java index 36b7c0b37e..d2fa7c97cc 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java @@ -178,7 +178,7 @@ public class PackagerBlockEntity extends SmartBlockEntity { continue; BlockState adjacentState = level.getBlockState(worldPosition.relative(d)); - if (AllBlocks.FACTORY_PANEL.has(adjacentState)) { + if (AllBlocks.FACTORY_GAUGE.has(adjacentState)) { if (FactoryPanelBlock.connectedDirection(adjacentState) != d) continue; if (!(level.getBlockEntity(worldPosition.relative(d)) instanceof FactoryPanelBlockEntity fpbe)) @@ -192,7 +192,7 @@ public class PackagerBlockEntity extends SmartBlockEntity { } } - if (AllBlocks.PACKAGER_LINK.has(adjacentState)) { + if (AllBlocks.STOCK_LINK.has(adjacentState)) { if (adjacentState.getValue(PackagerLinkBlock.FACING) != d) continue; if (!(level.getBlockEntity(worldPosition.relative(d)) instanceof PackagerLinkBlockEntity plbe)) @@ -246,7 +246,7 @@ public class PackagerBlockEntity extends SmartBlockEntity { return; for (Direction d : Iterate.directions) { BlockState adjacentState = level.getBlockState(worldPosition.relative(d)); - if (!AllBlocks.PACKAGER_LINK.has(adjacentState)) + if (!AllBlocks.STOCK_LINK.has(adjacentState)) continue; if (adjacentState.getValue(PackagerLinkBlock.FACING) != d) continue; @@ -446,6 +446,9 @@ public class PackagerBlockEntity extends SmartBlockEntity { .setValue(previousCount); finalPackageAtLink = false; continuePacking = true; + if (nextRequest.context() != null) + orderContext = nextRequest.context(); + if (bulky) break Outer; break; diff --git a/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlock.java b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlock.java index a36c8f76b0..800bab0049 100644 --- a/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlock.java @@ -84,7 +84,7 @@ public class RedstoneRequesterBlock extends Block implements IBE { +public class StockTickerBlock extends HorizontalDirectionalBlock implements IBE, IWrenchable { public StockTickerBlock(Properties pProperties) { super(pProperties); diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java index 3f5323b91b..2d092c333d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java @@ -369,7 +369,7 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre GuiGameElement.of(AllBlocks.PACKAGER.asStack()) .render(graphics); ms.translate(0, -9, 15); - GuiGameElement.of(AllBlocks.PACKAGER_LINK.asStack()) + GuiGameElement.of(AllBlocks.STOCK_LINK.asStack()) .render(graphics); ms.popPose(); ms.pushPose(); diff --git a/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java b/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java index 85f0328555..be92acee75 100644 --- a/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java +++ b/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java @@ -479,22 +479,22 @@ public class BuilderTransformers { .toUpperCase(Locale.ROOT) + material.substring(1) + " Package"); } - public static NonNullUnaryOperator> displayCloth(String name, + public static NonNullUnaryOperator> tableCloth(String name, NonNullSupplier initialProps, boolean lowerItem) { return b -> b.initialProperties(initialProps) .addLayer(() -> RenderType::cutoutMipped) .blockstate((c, p) -> p.simpleBlock(c.get(), p.models() - .withExistingParent(name + "_display_cloth", p.modLoc("block/display_cloth/block")) - .texture("0", p.modLoc("block/display_cloth/" + name)))) + .withExistingParent(name + "_table_cloth", p.modLoc("block/table_cloth/block")) + .texture("0", p.modLoc("block/table_cloth/" + name)))) .onRegister(CreateRegistrate.blockModel(() -> DisplayClothModel::new)) - .tag(AllBlockTags.DISPLAY_CLOTHS.tag) - .onRegisterAfter(Registries.ITEM, v -> ItemDescription.useKey(v, "block.create.display_cloth")) + .tag(AllBlockTags.TABLE_CLOTHS.tag) + .onRegisterAfter(Registries.ITEM, v -> ItemDescription.useKey(v, "block.create.table_cloth")) .item(DisplayClothBlockItem::new) .model((c, p) -> p - .withExistingParent(name + "_display_cloth", - p.modLoc("block/display_cloth/item" + (lowerItem ? "_lower" : ""))) - .texture("0", p.modLoc("block/display_cloth/" + name))) - .tag(AllItemTags.DISPLAY_CLOTHS.tag) + .withExistingParent(name + "_table_cloth", + p.modLoc("block/table_cloth/item" + (lowerItem ? "_lower" : ""))) + .texture("0", p.modLoc("block/table_cloth/" + name))) + .tag(AllItemTags.TABLE_CLOTHS.tag) .recipe((c, p) -> ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, c.get()) .requires(c.get()) .unlockedBy("has_" + c.getName(), RegistrateRecipeProvider.has(c.get())) diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/MixingRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/MixingRecipeGen.java index 980fa79658..1b564b83f7 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/MixingRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/MixingRecipeGen.java @@ -74,7 +74,7 @@ public class MixingRecipeGen extends ProcessingRecipeGen { .require(Items.PAPER) .require(Items.PAPER) .require(Fluids.WATER, 1000) - .output(AllItems.CARDBOARD_PULP, 1)), + .output(AllItems.PULP, 1)), // AE2 diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/PressingRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/PressingRecipeGen.java index 2867cae28a..61edc14726 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/PressingRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/PressingRecipeGen.java @@ -26,7 +26,7 @@ public class PressingRecipeGen extends ProcessingRecipeGen { BRASS = create("brass_ingot", b -> b.require(I.brass()) .output(AllItems.BRASS_SHEET.get())), - CARDBOARD = create("cardboard", b -> b.require(AllItems.CARDBOARD_PULP) + CARDBOARD = create("cardboard", b -> b.require(AllItems.PULP) .output(AllItems.CARDBOARD.get())), // Atmospheric diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java index 2f810e1a94..070cca85f2 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java @@ -1021,10 +1021,10 @@ public class StandardRecipeGen extends CreateRecipeProvider { .pattern("C") .pattern("S")), - LOGISTICS_LINK_CLEAR = clearData(AllBlocks.PACKAGER_LINK), + LOGISTICS_LINK_CLEAR = clearData(AllBlocks.STOCK_LINK), STOCK_TICKER_CLEAR = clearData(AllBlocks.STOCK_TICKER), REDSTONE_REQUESTER_CLEAR = clearData(AllBlocks.REDSTONE_REQUESTER), - FACTORY_PANEL_CLEAR = clearData(AllBlocks.FACTORY_PANEL), + FACTORY_PANEL_CLEAR = clearData(AllBlocks.FACTORY_GAUGE), DISPLAY_LINK = create(AllBlocks.DISPLAY_LINK).unlockedBy(I::brassCasing) .viaShaped(b -> b.define('C', Blocks.REDSTONE_TORCH) diff --git a/src/main/resources/assets/create/lang/default/interface.json b/src/main/resources/assets/create/lang/default/interface.json index 8e8deb9db0..d611db67f9 100644 --- a/src/main/resources/assets/create/lang/default/interface.json +++ b/src/main/resources/assets/create/lang/default/interface.json @@ -516,7 +516,7 @@ "create.gui.package_port.catch_packages": "Catch packages addressed to...", "create.gui.package_port.catch_packages_wildcard": "Use * as a text wildcard", "create.gui.package_port.catch_packages_empty": "Leave empty to match non-addressed", - "create.gui.package_port.not_targeting_anything": "Package port is not targeting anything", + "create.gui.package_port.not_targeting_anything": "No target selected", "create.item_attributes.placeable": "is placeable", "create.item_attributes.placeable.inverted": "is not placeable", @@ -1021,9 +1021,9 @@ "create.display_link.display_on": "Write data to:", "create.display_link.display_on_multiline": "Start writing at:", - "create.logistically_linked.tuned": "Tuned to this transmitter", - "create.logistically_linked.new_network_started": "New transmitter network started", - "create.logistically_linked.connected": "Connected to other Transmitters successfully", + "create.logistically_linked.tuned": "Tuned to this link", + "create.logistically_linked.new_network_started": "New link network started", + "create.logistically_linked.connected": "Connected to existing network successfully", "create.logistically_linked.tooltip": "Frequency configured", "create.logistically_linked.tooltip_clear": "Place in crafting grid to reset", "create.logistically_linked.protected": "Logistics Network is Protected", @@ -1080,7 +1080,7 @@ "create.factory_panel.some_links_unloaded": "Some links are not loaded", "create.factory_panel.in_progress": "(In Progress)", "create.factory_panel.cycled_arrow_path": "Cycled arrow pathing mode %1$s", - "create.factory_panel.tune_before_placing": "Tune to a transmitter before placing", + "create.factory_panel.tune_before_placing": "Tune to a stock link before placing", "create.factory_panel.same_orientation": "Panels must have the same orientation", "create.factory_panel.same_surface": "Panels must be on the same surface", "create.factory_panel.too_far_apart": "Panels are too far away from each other", diff --git a/src/main/resources/assets/create/lang/default/tooltips.json b/src/main/resources/assets/create/lang/default/tooltips.json index ccddab5f4f..7afe86eac8 100644 --- a/src/main/resources/assets/create/lang/default/tooltips.json +++ b/src/main/resources/assets/create/lang/default/tooltips.json @@ -208,18 +208,18 @@ "block.create.chain_conveyor.tooltip.summary": "[ponder] Connect with chains to form conveyor networks. Use frogports to transport packages on them. Use wrench to take a ride.", - "block.create.packager.tooltip.summary": "[ponder] Creates packages from attached inventory on redstone. Attach sign to specify target address. Alternatively, attach packager link to submit inventory contents to a logistics network.", + "block.create.packager.tooltip.summary": "[ponder] Creates packages from attached inventory on redstone. Attach sign to specify target address. Alternatively, attach stock link to submit inventory contents to a logistics network.", "block.create.package_frogport.tooltip.summary": "[ponder] Click a chain conveyor to link then place. Moves packages to and from chains based on their address. Set address filter in UI. Matching packages will be removed from chains and vice versa.", "block.create.package_postbox.tooltip.summary": "[ponder] Click a train station to link then place. Moves packages to and from trains based on their address. Set address filter in UI. Matching packages will be removed from trains and vice versa.", - "block.create.packager_link.tooltip.summary": "[ponder] Attach to packager to make its target inventory available to request from. Click other links before placement to share their frequency. No range limitations", - "block.create.stock_ticker.tooltip.summary": "[ponder] Click packager link before placement to use its frequency. Needs an adjacent entity on a seat as its stock keeper. Click the entity to request items from any linked packagers to a given address. Click the stock ticker block to organise displayed items into categories.", - "block.create.redstone_requester.tooltip.summary": "[ponder] Click packager link before placement to use its frequency. Open UI to specify items requested to an address when a redstone pulse is received. Alternatively this request can be configured at a stock keeper before placement.", - "block.create.factory_panel.tooltip.summary": "[ponder] Click packager link before placement to use its frequency. Place item to monitor in filter slot. Hold click to specify a target amount to maintain in storage.", - "block.create.factory_panel.tooltip.condition1": "When attached to Packager", - "block.create.factory_panel.tooltip.behaviour1": "Restocker mode: Panel requests items from the network to the specified address until the target amount is in the container. Short click the panel to set an address.", - "block.create.factory_panel.tooltip.condition2": "When not attached to Packager", - "block.create.factory_panel.tooltip.behaviour2": "Recipe mode: Panel requests ingredients to an address until the target amounted of the output item is found on the network (e.g. Send 1 Log to 'saw' and expect 6 Planks, until at least 64 Planks on network). Short click the panel to set an address and connect other panels as input items. Panels specifying an output item can also be reused as an input for other panels.", - "block.create.display_cloth.tooltip.summary": "[ponder] Can be used for decoration, click with item to display them. Alternatively, when used on a stock keeper, specify a request from your network that can be purchased by other players. The cost can be specified after placing the configured display cloth.", + "block.create.stock_link.tooltip.summary": "[ponder] Attach to packager to make its target inventory available to request from. Click other links before placement to share their frequency. No range limitations", + "block.create.stock_ticker.tooltip.summary": "[ponder] Click stock link before placement to use its frequency. Needs an adjacent entity on a seat as its stock keeper. Click the entity to request items from any linked packagers to a given address. Click the stock ticker block to organise displayed items into categories.", + "block.create.redstone_requester.tooltip.summary": "[ponder] Click stock link before placement to use its frequency. Open UI to specify items requested to an address when a redstone pulse is received. Alternatively this request can be configured at a stock keeper before placement.", + "block.create.factory_gauge.tooltip.summary": "[ponder] Click stock link before placement to use its frequency. Place item to monitor in filter slot. Hold click to specify a target amount to maintain in storage.", + "block.create.factory_gauge.tooltip.condition1": "When attached to Packager", + "block.create.factory_gauge.tooltip.behaviour1": "Restocker mode: Panel requests items from the network to the specified address until the target amount is in the container. Short click the panel to set an address.", + "block.create.factory_gauge.tooltip.condition2": "When not attached to Packager", + "block.create.factory_gauge.tooltip.behaviour2": "Recipe mode: Panel requests ingredients to an address until the target amounted of the output item is found on the network (e.g. Send 1 Log to 'saw' and expect 6 Planks, until at least 64 Planks on network). Short click the panel to set an address and connect other panels as input items. Panels specifying an output item can also be reused as an input for other panels.", + "block.create.table_cloth.tooltip.summary": "[ponder] Can be used for decoration, click with item to display them. Alternatively, when used on a stock keeper, specify a request from your network that can be purchased by other players. The cost can be specified after placing the configured table cloth.", "block.create.pulse_timer.tooltip.summary": "[ponder] Set a delay using the input slot. Repeatedly emits redstone pulses unless the input side is powered by a constant signal.", "block.create.clipboard.tooltip.summary": "_Keeps your notes_ and makes you look more professional.", diff --git a/src/main/resources/assets/create/models/block/factory_panel/block.json b/src/main/resources/assets/create/models/block/factory_gauge/block.json similarity index 100% rename from src/main/resources/assets/create/models/block/factory_panel/block.json rename to src/main/resources/assets/create/models/block/factory_gauge/block.json diff --git a/src/main/resources/assets/create/models/block/factory_panel/bulb_light.json b/src/main/resources/assets/create/models/block/factory_gauge/bulb_light.json similarity index 100% rename from src/main/resources/assets/create/models/block/factory_panel/bulb_light.json rename to src/main/resources/assets/create/models/block/factory_gauge/bulb_light.json diff --git a/src/main/resources/assets/create/models/block/factory_panel/connections/arrow_east.json b/src/main/resources/assets/create/models/block/factory_gauge/connections/arrow_east.json similarity index 100% rename from src/main/resources/assets/create/models/block/factory_panel/connections/arrow_east.json rename to src/main/resources/assets/create/models/block/factory_gauge/connections/arrow_east.json diff --git a/src/main/resources/assets/create/models/block/factory_panel/connections/arrow_north.json b/src/main/resources/assets/create/models/block/factory_gauge/connections/arrow_north.json similarity index 100% rename from src/main/resources/assets/create/models/block/factory_panel/connections/arrow_north.json rename to src/main/resources/assets/create/models/block/factory_gauge/connections/arrow_north.json diff --git a/src/main/resources/assets/create/models/block/factory_panel/connections/arrow_south.json b/src/main/resources/assets/create/models/block/factory_gauge/connections/arrow_south.json similarity index 100% rename from src/main/resources/assets/create/models/block/factory_panel/connections/arrow_south.json rename to src/main/resources/assets/create/models/block/factory_gauge/connections/arrow_south.json diff --git a/src/main/resources/assets/create/models/block/factory_panel/connections/arrow_west.json b/src/main/resources/assets/create/models/block/factory_gauge/connections/arrow_west.json similarity index 100% rename from src/main/resources/assets/create/models/block/factory_panel/connections/arrow_west.json rename to src/main/resources/assets/create/models/block/factory_gauge/connections/arrow_west.json diff --git a/src/main/resources/assets/create/models/block/factory_panel/connections/line_east.json b/src/main/resources/assets/create/models/block/factory_gauge/connections/line_east.json similarity index 100% rename from src/main/resources/assets/create/models/block/factory_panel/connections/line_east.json rename to src/main/resources/assets/create/models/block/factory_gauge/connections/line_east.json diff --git a/src/main/resources/assets/create/models/block/factory_panel/connections/line_north.json b/src/main/resources/assets/create/models/block/factory_gauge/connections/line_north.json similarity index 100% rename from src/main/resources/assets/create/models/block/factory_panel/connections/line_north.json rename to src/main/resources/assets/create/models/block/factory_gauge/connections/line_north.json diff --git a/src/main/resources/assets/create/models/block/factory_panel/connections/line_south.json b/src/main/resources/assets/create/models/block/factory_gauge/connections/line_south.json similarity index 100% rename from src/main/resources/assets/create/models/block/factory_panel/connections/line_south.json rename to src/main/resources/assets/create/models/block/factory_gauge/connections/line_south.json diff --git a/src/main/resources/assets/create/models/block/factory_panel/connections/line_west.json b/src/main/resources/assets/create/models/block/factory_gauge/connections/line_west.json similarity index 100% rename from src/main/resources/assets/create/models/block/factory_panel/connections/line_west.json rename to src/main/resources/assets/create/models/block/factory_gauge/connections/line_west.json diff --git a/src/main/resources/assets/create/models/block/factory_panel/item.json b/src/main/resources/assets/create/models/block/factory_gauge/item.json similarity index 100% rename from src/main/resources/assets/create/models/block/factory_panel/item.json rename to src/main/resources/assets/create/models/block/factory_gauge/item.json diff --git a/src/main/resources/assets/create/models/block/factory_panel/panel.json b/src/main/resources/assets/create/models/block/factory_gauge/panel.json similarity index 100% rename from src/main/resources/assets/create/models/block/factory_panel/panel.json rename to src/main/resources/assets/create/models/block/factory_gauge/panel.json diff --git a/src/main/resources/assets/create/models/block/factory_panel/panel_restocker.json b/src/main/resources/assets/create/models/block/factory_gauge/panel_restocker.json similarity index 73% rename from src/main/resources/assets/create/models/block/factory_panel/panel_restocker.json rename to src/main/resources/assets/create/models/block/factory_gauge/panel_restocker.json index a90d41d5ec..46e5e6e410 100644 --- a/src/main/resources/assets/create/models/block/factory_panel/panel_restocker.json +++ b/src/main/resources/assets/create/models/block/factory_gauge/panel_restocker.json @@ -1,5 +1,5 @@ { - "parent": "create:block/factory_panel/panel", + "parent": "create:block/factory_gauge/panel", "textures": { "0": "create:block/factory_panel_packager_mode", "particle": "create:block/factory_panel_packager_mode" diff --git a/src/main/resources/assets/create/models/block/factory_panel/panel_restocker_with_bulb.json b/src/main/resources/assets/create/models/block/factory_gauge/panel_restocker_with_bulb.json similarity index 69% rename from src/main/resources/assets/create/models/block/factory_panel/panel_restocker_with_bulb.json rename to src/main/resources/assets/create/models/block/factory_gauge/panel_restocker_with_bulb.json index 84f36d5a49..3692440721 100644 --- a/src/main/resources/assets/create/models/block/factory_panel/panel_restocker_with_bulb.json +++ b/src/main/resources/assets/create/models/block/factory_gauge/panel_restocker_with_bulb.json @@ -1,5 +1,5 @@ { - "parent": "create:block/factory_panel/panel_with_bulb", + "parent": "create:block/factory_gauge/panel_with_bulb", "textures": { "0": "create:block/factory_panel_packager_mode", "particle": "create:block/factory_panel_packager_mode" diff --git a/src/main/resources/assets/create/models/block/factory_panel/panel_with_bulb.json b/src/main/resources/assets/create/models/block/factory_gauge/panel_with_bulb.json similarity index 100% rename from src/main/resources/assets/create/models/block/factory_panel/panel_with_bulb.json rename to src/main/resources/assets/create/models/block/factory_gauge/panel_with_bulb.json diff --git a/src/main/resources/assets/create/models/block/packager_link/block.json b/src/main/resources/assets/create/models/block/stock_link/block.json similarity index 100% rename from src/main/resources/assets/create/models/block/packager_link/block.json rename to src/main/resources/assets/create/models/block/stock_link/block.json diff --git a/src/main/resources/assets/create/models/block/packager_link/block_powered.json b/src/main/resources/assets/create/models/block/stock_link/block_powered.json similarity index 100% rename from src/main/resources/assets/create/models/block/packager_link/block_powered.json rename to src/main/resources/assets/create/models/block/stock_link/block_powered.json diff --git a/src/main/resources/assets/create/models/block/display_cloth/block.json b/src/main/resources/assets/create/models/block/table_cloth/block.json similarity index 98% rename from src/main/resources/assets/create/models/block/display_cloth/block.json rename to src/main/resources/assets/create/models/block/table_cloth/block.json index defda713c4..e67a39ee68 100644 --- a/src/main/resources/assets/create/models/block/display_cloth/block.json +++ b/src/main/resources/assets/create/models/block/table_cloth/block.json @@ -2,7 +2,7 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "0": "create:block/display_cloth/red", + "0": "create:block/table_cloth/red", "particle": "#0" }, "elements": [ diff --git a/src/main/resources/assets/create/models/block/display_cloth/item.json b/src/main/resources/assets/create/models/block/table_cloth/item.json similarity index 99% rename from src/main/resources/assets/create/models/block/display_cloth/item.json rename to src/main/resources/assets/create/models/block/table_cloth/item.json index f39e64867a..1b5822d47b 100644 --- a/src/main/resources/assets/create/models/block/display_cloth/item.json +++ b/src/main/resources/assets/create/models/block/table_cloth/item.json @@ -2,7 +2,7 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "0": "create:block/display_cloth/red", + "0": "create:block/table_cloth/red", "particle": "#0" }, "elements": [ diff --git a/src/main/resources/assets/create/models/block/display_cloth/item_lower.json b/src/main/resources/assets/create/models/block/table_cloth/item_lower.json similarity index 98% rename from src/main/resources/assets/create/models/block/display_cloth/item_lower.json rename to src/main/resources/assets/create/models/block/table_cloth/item_lower.json index 51d1dd6364..02ce8977e7 100644 --- a/src/main/resources/assets/create/models/block/display_cloth/item_lower.json +++ b/src/main/resources/assets/create/models/block/table_cloth/item_lower.json @@ -2,8 +2,8 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "0": "create:block/display_cloth/red", - "particle": "create:block/display_cloth/red" + "0": "create:block/table_cloth/red", + "particle": "create:block/table_cloth/red" }, "elements": [ { diff --git a/src/main/resources/assets/create/models/block/display_cloth/north_east.json b/src/main/resources/assets/create/models/block/table_cloth/north_east.json similarity index 87% rename from src/main/resources/assets/create/models/block/display_cloth/north_east.json rename to src/main/resources/assets/create/models/block/table_cloth/north_east.json index ca7bf618f7..ccbb85a023 100644 --- a/src/main/resources/assets/create/models/block/display_cloth/north_east.json +++ b/src/main/resources/assets/create/models/block/table_cloth/north_east.json @@ -2,8 +2,8 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "0": "create:block/display_cloth/red", - "particle": "create:block/display_cloth/red" + "0": "create:block/table_cloth/red", + "particle": "create:block/table_cloth/red" }, "elements": [ { diff --git a/src/main/resources/assets/create/models/block/display_cloth/north_west.json b/src/main/resources/assets/create/models/block/table_cloth/north_west.json similarity index 87% rename from src/main/resources/assets/create/models/block/display_cloth/north_west.json rename to src/main/resources/assets/create/models/block/table_cloth/north_west.json index d563854def..211e7561ad 100644 --- a/src/main/resources/assets/create/models/block/display_cloth/north_west.json +++ b/src/main/resources/assets/create/models/block/table_cloth/north_west.json @@ -2,8 +2,8 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "0": "create:block/display_cloth/red", - "particle": "create:block/display_cloth/red" + "0": "create:block/table_cloth/red", + "particle": "create:block/table_cloth/red" }, "elements": [ { diff --git a/src/main/resources/assets/create/models/block/display_cloth/south_east.json b/src/main/resources/assets/create/models/block/table_cloth/south_east.json similarity index 87% rename from src/main/resources/assets/create/models/block/display_cloth/south_east.json rename to src/main/resources/assets/create/models/block/table_cloth/south_east.json index b018b7fa65..63a4872116 100644 --- a/src/main/resources/assets/create/models/block/display_cloth/south_east.json +++ b/src/main/resources/assets/create/models/block/table_cloth/south_east.json @@ -2,8 +2,8 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "0": "create:block/display_cloth/red", - "particle": "create:block/display_cloth/red" + "0": "create:block/table_cloth/red", + "particle": "create:block/table_cloth/red" }, "elements": [ { diff --git a/src/main/resources/assets/create/models/block/display_cloth/south_west.json b/src/main/resources/assets/create/models/block/table_cloth/south_west.json similarity index 87% rename from src/main/resources/assets/create/models/block/display_cloth/south_west.json rename to src/main/resources/assets/create/models/block/table_cloth/south_west.json index e1e5463bf6..bad6d3278c 100644 --- a/src/main/resources/assets/create/models/block/display_cloth/south_west.json +++ b/src/main/resources/assets/create/models/block/table_cloth/south_west.json @@ -2,8 +2,8 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "0": "create:block/display_cloth/red", - "particle": "create:block/display_cloth/red" + "0": "create:block/table_cloth/red", + "particle": "create:block/table_cloth/red" }, "elements": [ { diff --git a/src/main/resources/assets/create/models/entity/display_cloth.json b/src/main/resources/assets/create/models/entity/display_cloth.json deleted file mode 100644 index a6a95e517a..0000000000 --- a/src/main/resources/assets/create/models/entity/display_cloth.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "credit": "Made with Blockbench", - "textures": { - "0": "create:entity/display_cloth", - "particle": "create:entity/display_cloth" - }, - "elements": [ - { - "from": [ - 0, - 0, - 0 - ], - "to": [ - 16, - 1, - 16 - ], - "faces": { - "north": { - "uv": [ - 0, - 0, - 16, - 1 - ], - "rotation": 180, - "texture": "#0" - }, - "east": { - "uv": [ - 0, - 15, - 16, - 16 - ], - "rotation": 180, - "texture": "#0" - }, - "south": { - "uv": [ - 0, - 15, - 16, - 16 - ], - "texture": "#0" - }, - "west": { - "uv": [ - 0, - 0, - 1, - 16 - ], - "rotation": 270, - "texture": "#0" - }, - "up": { - "uv": [ - 0, - 0, - 16, - 16 - ], - "texture": "#0" - }, - "down": { - "uv": [ - 0, - 0, - 16, - 16 - ], - "rotation": 270, - "texture": "#0" - } - } - } - ] -} diff --git a/src/main/resources/assets/create/textures/block/display_cloth/andesite.png b/src/main/resources/assets/create/textures/block/table_cloth/andesite.png similarity index 100% rename from src/main/resources/assets/create/textures/block/display_cloth/andesite.png rename to src/main/resources/assets/create/textures/block/table_cloth/andesite.png diff --git a/src/main/resources/assets/create/textures/block/display_cloth/black.png b/src/main/resources/assets/create/textures/block/table_cloth/black.png similarity index 100% rename from src/main/resources/assets/create/textures/block/display_cloth/black.png rename to src/main/resources/assets/create/textures/block/table_cloth/black.png diff --git a/src/main/resources/assets/create/textures/block/display_cloth/blue.png b/src/main/resources/assets/create/textures/block/table_cloth/blue.png similarity index 100% rename from src/main/resources/assets/create/textures/block/display_cloth/blue.png rename to src/main/resources/assets/create/textures/block/table_cloth/blue.png diff --git a/src/main/resources/assets/create/textures/block/display_cloth/brass.png b/src/main/resources/assets/create/textures/block/table_cloth/brass.png similarity index 100% rename from src/main/resources/assets/create/textures/block/display_cloth/brass.png rename to src/main/resources/assets/create/textures/block/table_cloth/brass.png diff --git a/src/main/resources/assets/create/textures/block/display_cloth/brown.png b/src/main/resources/assets/create/textures/block/table_cloth/brown.png similarity index 100% rename from src/main/resources/assets/create/textures/block/display_cloth/brown.png rename to src/main/resources/assets/create/textures/block/table_cloth/brown.png diff --git a/src/main/resources/assets/create/textures/block/display_cloth/copper.png b/src/main/resources/assets/create/textures/block/table_cloth/copper.png similarity index 100% rename from src/main/resources/assets/create/textures/block/display_cloth/copper.png rename to src/main/resources/assets/create/textures/block/table_cloth/copper.png diff --git a/src/main/resources/assets/create/textures/block/display_cloth/cyan.png b/src/main/resources/assets/create/textures/block/table_cloth/cyan.png similarity index 100% rename from src/main/resources/assets/create/textures/block/display_cloth/cyan.png rename to src/main/resources/assets/create/textures/block/table_cloth/cyan.png diff --git a/src/main/resources/assets/create/textures/block/display_cloth/gray.png b/src/main/resources/assets/create/textures/block/table_cloth/gray.png similarity index 100% rename from src/main/resources/assets/create/textures/block/display_cloth/gray.png rename to src/main/resources/assets/create/textures/block/table_cloth/gray.png diff --git a/src/main/resources/assets/create/textures/block/display_cloth/green.png b/src/main/resources/assets/create/textures/block/table_cloth/green.png similarity index 100% rename from src/main/resources/assets/create/textures/block/display_cloth/green.png rename to src/main/resources/assets/create/textures/block/table_cloth/green.png diff --git a/src/main/resources/assets/create/textures/block/display_cloth/light_blue.png b/src/main/resources/assets/create/textures/block/table_cloth/light_blue.png similarity index 100% rename from src/main/resources/assets/create/textures/block/display_cloth/light_blue.png rename to src/main/resources/assets/create/textures/block/table_cloth/light_blue.png diff --git a/src/main/resources/assets/create/textures/block/display_cloth/light_gray.png b/src/main/resources/assets/create/textures/block/table_cloth/light_gray.png similarity index 100% rename from src/main/resources/assets/create/textures/block/display_cloth/light_gray.png rename to src/main/resources/assets/create/textures/block/table_cloth/light_gray.png diff --git a/src/main/resources/assets/create/textures/block/display_cloth/lime.png b/src/main/resources/assets/create/textures/block/table_cloth/lime.png similarity index 100% rename from src/main/resources/assets/create/textures/block/display_cloth/lime.png rename to src/main/resources/assets/create/textures/block/table_cloth/lime.png diff --git a/src/main/resources/assets/create/textures/block/display_cloth/magenta.png b/src/main/resources/assets/create/textures/block/table_cloth/magenta.png similarity index 100% rename from src/main/resources/assets/create/textures/block/display_cloth/magenta.png rename to src/main/resources/assets/create/textures/block/table_cloth/magenta.png diff --git a/src/main/resources/assets/create/textures/block/display_cloth/orange.png b/src/main/resources/assets/create/textures/block/table_cloth/orange.png similarity index 100% rename from src/main/resources/assets/create/textures/block/display_cloth/orange.png rename to src/main/resources/assets/create/textures/block/table_cloth/orange.png diff --git a/src/main/resources/assets/create/textures/block/display_cloth/pink.png b/src/main/resources/assets/create/textures/block/table_cloth/pink.png similarity index 100% rename from src/main/resources/assets/create/textures/block/display_cloth/pink.png rename to src/main/resources/assets/create/textures/block/table_cloth/pink.png diff --git a/src/main/resources/assets/create/textures/block/display_cloth/purple.png b/src/main/resources/assets/create/textures/block/table_cloth/purple.png similarity index 100% rename from src/main/resources/assets/create/textures/block/display_cloth/purple.png rename to src/main/resources/assets/create/textures/block/table_cloth/purple.png diff --git a/src/main/resources/assets/create/textures/block/display_cloth/red.png b/src/main/resources/assets/create/textures/block/table_cloth/red.png similarity index 100% rename from src/main/resources/assets/create/textures/block/display_cloth/red.png rename to src/main/resources/assets/create/textures/block/table_cloth/red.png diff --git a/src/main/resources/assets/create/textures/block/display_cloth/white.png b/src/main/resources/assets/create/textures/block/table_cloth/white.png similarity index 100% rename from src/main/resources/assets/create/textures/block/display_cloth/white.png rename to src/main/resources/assets/create/textures/block/table_cloth/white.png diff --git a/src/main/resources/assets/create/textures/block/display_cloth/yellow.png b/src/main/resources/assets/create/textures/block/table_cloth/yellow.png similarity index 100% rename from src/main/resources/assets/create/textures/block/display_cloth/yellow.png rename to src/main/resources/assets/create/textures/block/table_cloth/yellow.png diff --git a/src/main/resources/assets/create/textures/item/cardboard_pulp.png b/src/main/resources/assets/create/textures/item/pulp.png similarity index 100% rename from src/main/resources/assets/create/textures/item/cardboard_pulp.png rename to src/main/resources/assets/create/textures/item/pulp.png From 38a0cf0e0ec0a7de101b14a8e6d43615c5a087cf Mon Sep 17 00:00:00 2001 From: zelophed Date: Tue, 5 Nov 2024 23:48:16 +0100 Subject: [PATCH 111/515] barely hanging on --- .../java/com/simibubi/create/AllPackets.java | 8 +- .../ChainConveyorRidingHandler.java | 8 +- .../ClientboundChainConveyorRidingPacket.java | 36 ++++++++ .../ServerChainConveyorHandler.java | 59 ++++++++++++ ...ServerboundChainConveyorRidingPacket.java} | 9 +- .../foundation/events/CommonEvents.java | 2 + .../mixin/client/HumanoidModelMixin.java | 40 +++++++++ .../mixin/client/PlayerRendererMixin.java | 2 + .../render/PlayerSkyhookRenderer.java | 89 +++++++++++++++++++ src/main/resources/create.mixins.json | 7 +- 10 files changed, 246 insertions(+), 14 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ClientboundChainConveyorRidingPacket.java create mode 100644 src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ServerChainConveyorHandler.java rename src/main/java/com/simibubi/create/content/kinetics/chainConveyor/{ChainConveyorRidingPacket.java => ServerboundChainConveyorRidingPacket.java} (71%) create mode 100644 src/main/java/com/simibubi/create/foundation/mixin/client/HumanoidModelMixin.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/PlayerSkyhookRenderer.java diff --git a/src/main/java/com/simibubi/create/AllPackets.java b/src/main/java/com/simibubi/create/AllPackets.java index 182b1c0e79..a459fb8726 100644 --- a/src/main/java/com/simibubi/create/AllPackets.java +++ b/src/main/java/com/simibubi/create/AllPackets.java @@ -50,8 +50,9 @@ import com.simibubi.create.content.equipment.zapper.ZapperBeamPacket; import com.simibubi.create.content.equipment.zapper.terrainzapper.ConfigureWorldshaperPacket; import com.simibubi.create.content.fluids.transfer.FluidSplashPacket; import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorConnectionPacket; -import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorRidingPacket; import com.simibubi.create.content.kinetics.chainConveyor.ChainPackageInteractionPacket; +import com.simibubi.create.content.kinetics.chainConveyor.ClientboundChainConveyorRidingPacket; +import com.simibubi.create.content.kinetics.chainConveyor.ServerboundChainConveyorRidingPacket; import com.simibubi.create.content.kinetics.gauge.GaugeObservedPacket; import com.simibubi.create.content.kinetics.mechanicalArm.ArmPlacementPacket; import com.simibubi.create.content.kinetics.transmission.sequencer.ConfigureSequencedGearshiftPacket; @@ -191,7 +192,7 @@ public enum AllPackets { LOGISTICS_STOCK_REQUEST(LogisticalStockRequestPacket.class, LogisticalStockRequestPacket::new, PLAY_TO_SERVER), LOGISTICS_PACKAGE_REQUEST(PackageOrderRequestPacket.class, PackageOrderRequestPacket::new, PLAY_TO_SERVER), CHAIN_CONVEYOR_CONNECT(ChainConveyorConnectionPacket.class, ChainConveyorConnectionPacket::new, PLAY_TO_SERVER), - CHAIN_CONVEYOR_RIDING(ChainConveyorRidingPacket.class, ChainConveyorRidingPacket::new, PLAY_TO_SERVER), + CHAIN_CONVEYOR_RIDING(ServerboundChainConveyorRidingPacket.class, ServerboundChainConveyorRidingPacket::new, PLAY_TO_SERVER), CHAIN_PACKAGE_INTERACTION(ChainPackageInteractionPacket.class, ChainPackageInteractionPacket::new, PLAY_TO_SERVER), DISPLAY_CLOTH_CONFIGURATION(DisplayClothConfigurationPacket.class, DisplayClothConfigurationPacket::new, PLAY_TO_SERVER), PACKAGE_PORT_CONFIGURATION(PackagePortConfigurationPacket.class, PackagePortConfigurationPacket::new, PLAY_TO_SERVER), @@ -253,7 +254,8 @@ public enum AllPackets { FACTORY_PANEL_EFFECT(FactoryPanelEffectPacket.class, FactoryPanelEffectPacket::new, PLAY_TO_CLIENT), KNOCKBACK(KnockbackPacket.class, KnockbackPacket::new, PLAY_TO_CLIENT), STOCK_KEEPER_OPEN_GUI(StockKeeperOpenRequestScreenPacket.class, StockKeeperOpenRequestScreenPacket::new, PLAY_TO_CLIENT), - TRAIN_MAP_SYNC(TrainMapSyncPacket.class, TrainMapSyncPacket::new, PLAY_TO_CLIENT); + TRAIN_MAP_SYNC(TrainMapSyncPacket.class, TrainMapSyncPacket::new, PLAY_TO_CLIENT), + CLIENTBOUND_CHAIN_CONVEYOR(ClientboundChainConveyorRidingPacket.class, ClientboundChainConveyorRidingPacket::new, PLAY_TO_CLIENT); static { ClientboundSimpleActionPacket.addAction("rainbowDebug", () -> SimpleCreateActions::rainbowDebug); diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRidingHandler.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRidingHandler.java index 0210ec1b0c..671088eae6 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRidingHandler.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRidingHandler.java @@ -55,7 +55,7 @@ public class ChainConveyorRidingHandler { Vec3 playerPosition = mc.player.position() .add(0, mc.player.getBoundingBox() - .getYsize() + 0.75, 0); + .getYsize() + 0.5, 0); updateTargetPosition(mc, clbe); @@ -66,7 +66,7 @@ public class ChainConveyorRidingHandler { clbe = (ChainConveyorBlockEntity) blockEntity; clbe.prepareStats(); - Vec3 targetPosition = playerPosition; + Vec3 targetPosition; if (ridingConnection != null) { ConnectionStats stats = clbe.connectionStats.get(ridingConnection); @@ -78,7 +78,7 @@ public class ChainConveyorRidingHandler { targetPosition = Vec3.atBottomCenterOf(ridingChainConveyor) .add(VecHelper.rotate(new Vec3(0, 0.25, 1), chainPosition, Axis.Y)); } - + if (catchingUp > 0) catchingUp--; @@ -94,7 +94,7 @@ public class ChainConveyorRidingHandler { .add(diff.scale(0.25))); if (AnimationTickHolder.getTicks() % 10 == 0) AllPackets.getChannel() - .sendToServer(new ChainConveyorRidingPacket(ridingChainConveyor)); + .sendToServer(new ServerboundChainConveyorRidingPacket(ridingChainConveyor)); } private static void updateTargetPosition(Minecraft mc, ChainConveyorBlockEntity clbe) { diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ClientboundChainConveyorRidingPacket.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ClientboundChainConveyorRidingPacket.java new file mode 100644 index 0000000000..be2fb7c734 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ClientboundChainConveyorRidingPacket.java @@ -0,0 +1,36 @@ +package com.simibubi.create.content.kinetics.chainConveyor; + +import java.util.Collection; +import java.util.UUID; + +import com.simibubi.create.foundation.networking.SimplePacketBase; +import com.simibubi.create.foundation.render.PlayerSkyhookRenderer; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraftforge.network.NetworkEvent; + +public class ClientboundChainConveyorRidingPacket extends SimplePacketBase { + + private final Collection uuids; + + public ClientboundChainConveyorRidingPacket(Collection uuids) { + this.uuids = uuids; + } + + public ClientboundChainConveyorRidingPacket(FriendlyByteBuf buffer) { + this.uuids = buffer.readList(FriendlyByteBuf::readUUID); + } + + @Override + public void write(FriendlyByteBuf buffer) { + buffer.writeCollection(uuids, FriendlyByteBuf::writeUUID); + } + + @Override + public boolean handle(NetworkEvent.Context context) { + context.enqueueWork(() -> { + PlayerSkyhookRenderer.updatePlayerList(this.uuids); + }); + return true; + } +} diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ServerChainConveyorHandler.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ServerChainConveyorHandler.java new file mode 100644 index 0000000000..d0a1bef4b3 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ServerChainConveyorHandler.java @@ -0,0 +1,59 @@ +package com.simibubi.create.content.kinetics.chainConveyor; + +import java.util.Map; +import java.util.UUID; + +import com.simibubi.create.AllPackets; + +import it.unimi.dsi.fastutil.objects.Object2IntMap; +import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; +import it.unimi.dsi.fastutil.objects.ObjectIterator; +import net.minecraft.world.entity.player.Player; +import net.minecraftforge.network.PacketDistributor; + +public class ServerChainConveyorHandler { + + + public static Object2IntMap hangingPlayers = new Object2IntOpenHashMap<>(); + + public static int ticks; + + public static void handleTTLPacket(Player player) { + int count = hangingPlayers.size(); + hangingPlayers.put(player.getUUID(), 20); + + if (hangingPlayers.size() != count) + sync(); + } + + public static void tick() { + ticks++; + + int before = hangingPlayers.size(); + + ObjectIterator> iterator = hangingPlayers.object2IntEntrySet().iterator(); + while (iterator.hasNext()) { + Map.Entry entry = iterator.next(); + int newTTL = entry.getValue() - 1; + if (newTTL <= 0) { + iterator.remove(); + } else { + entry.setValue(newTTL); + } + } + + int after = hangingPlayers.size(); + + if (ticks % 10 != 0 && before == after) + return; + + sync(); + + } + + public static void sync() { + ClientboundChainConveyorRidingPacket packet = new ClientboundChainConveyorRidingPacket(hangingPlayers.keySet()); + AllPackets.getChannel().send(PacketDistributor.ALL.noArg(), packet); + } + +} diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRidingPacket.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ServerboundChainConveyorRidingPacket.java similarity index 71% rename from src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRidingPacket.java rename to src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ServerboundChainConveyorRidingPacket.java index b286ae1502..97fbd1f153 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRidingPacket.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ServerboundChainConveyorRidingPacket.java @@ -6,13 +6,13 @@ import net.minecraft.core.BlockPos; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.level.ServerPlayer; -public class ChainConveyorRidingPacket extends BlockEntityConfigurationPacket { +public class ServerboundChainConveyorRidingPacket extends BlockEntityConfigurationPacket { - public ChainConveyorRidingPacket(BlockPos pos) { + public ServerboundChainConveyorRidingPacket(BlockPos pos) { super(pos); } - - public ChainConveyorRidingPacket(FriendlyByteBuf buffer) { + + public ServerboundChainConveyorRidingPacket(FriendlyByteBuf buffer) { super(buffer); } @@ -30,6 +30,7 @@ public class ChainConveyorRidingPacket extends BlockEntityConfigurationPacket { + + @Shadow + @Final + public ModelPart body; + + @Inject(method = "setupAnim*", at = @At("RETURN")) + private void create$afterSetupAnim(T pEntity, float pLimbSwing, float pLimbSwingAmount, float pAgeInTicks, float pNetHeadYaw, float pHeadPitch, CallbackInfo callbackInfo) { + if (!(pEntity instanceof AbstractClientPlayer player)) + return; + + PlayerSkyhookRenderer.afterSetupAnim(player, (HumanoidModel) (Object) this); + } + + @Inject(method = "setupAnim*", at = @At("HEAD")) + private void create$beforeSetupAnim(T pEntity, float pLimbSwing, float pLimbSwingAmount, float pAgeInTicks, float pNetHeadYaw, float pHeadPitch, CallbackInfo callbackInfo) { + if (!(pEntity instanceof AbstractClientPlayer player)) + return; + + PlayerSkyhookRenderer.beforeSetupAnim(player, (HumanoidModel) (Object) this); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/mixin/client/PlayerRendererMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/client/PlayerRendererMixin.java index fb27d9f157..47b0519628 100644 --- a/src/main/java/com/simibubi/create/foundation/mixin/client/PlayerRendererMixin.java +++ b/src/main/java/com/simibubi/create/foundation/mixin/client/PlayerRendererMixin.java @@ -25,4 +25,6 @@ public class PlayerRendererMixin { } } } + + } diff --git a/src/main/java/com/simibubi/create/foundation/render/PlayerSkyhookRenderer.java b/src/main/java/com/simibubi/create/foundation/render/PlayerSkyhookRenderer.java new file mode 100644 index 0000000000..d80d7f8188 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/PlayerSkyhookRenderer.java @@ -0,0 +1,89 @@ +package com.simibubi.create.foundation.render; + +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; + +import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.math.AngleHelper; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; + +public class PlayerSkyhookRenderer { + + private static final Set hangingPlayers = new HashSet<>(); + + public static void updatePlayerList(Collection uuids) { + hangingPlayers.clear(); + hangingPlayers.addAll(uuids); + } + + public static void beforeSetupAnim(Player player, HumanoidModel model) { + if (hangingPlayers.contains(player.getUUID())) + return; + + model.head.resetPose(); + model.body.resetPose(); + model.leftArm.resetPose(); + model.rightArm.resetPose(); + model.leftLeg.resetPose(); + model.rightLeg.resetPose(); + } + + public static void afterSetupAnim(Player player, HumanoidModel model) { + if (hangingPlayers.contains(player.getUUID())) + setHangingPose(model); + } + + private static void setHangingPose(HumanoidModel model) { + + //model.head.resetPose(); + model.body.resetPose(); + model.leftArm.resetPose(); + model.rightArm.resetPose(); + model.leftLeg.resetPose(); + model.rightLeg.resetPose(); + + float time = AnimationTickHolder.getTicks(true) + AnimationTickHolder.getPartialTicks(); + float mainCycle = Mth.sin(((float) ((time + 10) * 0.3f / Math.PI))); + float limbCycle = Mth.sin(((float) (time * 0.3f / Math.PI))); + float bodySwing = AngleHelper.rad(15 + (mainCycle * 10)); + float limbSwing = AngleHelper.rad(limbCycle * 15); + + model.body.zRot = bodySwing; + model.head.zRot = bodySwing; + + float offsetX = model.rightArm.x; + float offsetY = model.rightArm.y; + model.rightArm.x = offsetX * Mth.cos(bodySwing) - offsetY * Mth.sin(bodySwing); + model.rightArm.y = offsetX * Mth.sin(bodySwing) + offsetY * Mth.cos(bodySwing); + model.rightArm.xRot = -AngleHelper.rad(135); + model.rightArm.zRot = AngleHelper.rad(15); + + offsetX = model.leftArm.x; + offsetY = model.leftArm.y; + model.leftArm.x = offsetX * Mth.cos(bodySwing) - offsetY * Mth.sin(bodySwing); + model.leftArm.y = offsetX * Mth.sin(bodySwing) + offsetY * Mth.cos(bodySwing); + model.leftArm.zRot = -AngleHelper.rad(5) + 0.5f * bodySwing + limbSwing; + + model.rightLeg.y -= 0.2f; + offsetX = model.rightLeg.x; + offsetY = model.rightLeg.y; + model.rightLeg.x = offsetX * Mth.cos(bodySwing) - offsetY * Mth.sin(bodySwing); + model.rightLeg.y = offsetX * Mth.sin(bodySwing) + offsetY * Mth.cos(bodySwing); + model.rightLeg.xRot = -AngleHelper.rad(10); + model.rightLeg.zRot = AngleHelper.rad(10) + 0.5f * bodySwing + limbSwing; + + model.leftLeg.y -= 0.2f; + offsetX = model.leftLeg.x; + offsetY = model.leftLeg.y; + model.leftLeg.x = offsetX * Mth.cos(bodySwing) - offsetY * Mth.sin(bodySwing); + model.leftLeg.y = offsetX * Mth.sin(bodySwing) + offsetY * Mth.cos(bodySwing); + model.leftLeg.xRot = AngleHelper.rad(10); + model.leftLeg.zRot = -AngleHelper.rad(10) + 0.5f * bodySwing + limbSwing; + + } + +} diff --git a/src/main/resources/create.mixins.json b/src/main/resources/create.mixins.json index 53d8ba2031..986e3867fa 100644 --- a/src/main/resources/create.mixins.json +++ b/src/main/resources/create.mixins.json @@ -20,13 +20,13 @@ "accessor.AbstractProjectileDispenseBehaviorAccessor", "accessor.DispenserBlockAccessor", "accessor.FallingBlockEntityAccessor", + "accessor.FluidInteractionRegistryAccessor", "accessor.GameTestHelperAccessor", "accessor.LivingEntityAccessor", "accessor.NbtAccounterAccessor", "accessor.ServerLevelAccessor", "accessor.SystemReportAccessor", - "accessor.UseOnContextAccessor", - "accessor.FluidInteractionRegistryAccessor" + "accessor.UseOnContextAccessor" ], "client": [ "accessor.AgeableListModelAccessor", @@ -39,11 +39,12 @@ "client.GameRendererMixin", "client.HeavyBootsOnPlayerMixin", "client.HumanoidArmorLayerMixin", + "client.HumanoidModelMixin", "client.LevelRendererMixin", "client.MapRendererMapInstanceMixin", "client.PlayerRendererMixin", "client.WindowResizeMixin", - "compat.JourneyFullscreenMapMixin" + "compat.JourneyFullscreenMapMixin" ], "injectors": { "defaultRequire": 1 From 3106332c5760c61608943ee3c591fe7cd7e8db12 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Wed, 6 Nov 2024 08:59:07 +0100 Subject: [PATCH 112/515] Crafting recipes --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 138 ++++++++++++- .../82992cbf8f2794d83ac94034835eac0acd7915b9 | 26 ++- .../b256105d8411632b0d585496ea8944a751a08034 | 4 +- .../crafting/logistics/black_postbox.json | 35 ++++ .../black_postbox_from_other_postbox.json | 33 ++++ .../crafting/logistics/black_table_cloth.json | 33 ++++ ...ck_table_cloth_from_other_table_cloth.json | 33 ++++ .../crafting/logistics/blue_postbox.json | 35 ++++ .../blue_postbox_from_other_postbox.json | 33 ++++ .../crafting/logistics/blue_table_cloth.json | 33 ++++ ...ue_table_cloth_from_other_table_cloth.json | 33 ++++ .../crafting/logistics/brown_postbox.json | 35 ++++ .../brown_postbox_from_other_postbox.json | 33 ++++ .../crafting/logistics/brown_table_cloth.json | 33 ++++ ...wn_table_cloth_from_other_table_cloth.json | 33 ++++ .../crafting/logistics/cyan_postbox.json | 35 ++++ .../cyan_postbox_from_other_postbox.json | 33 ++++ .../crafting/logistics/cyan_table_cloth.json | 33 ++++ ...an_table_cloth_from_other_table_cloth.json | 33 ++++ .../crafting/logistics/gray_postbox.json | 35 ++++ .../gray_postbox_from_other_postbox.json | 33 ++++ .../crafting/logistics/gray_table_cloth.json | 33 ++++ ...ay_table_cloth_from_other_table_cloth.json | 33 ++++ .../crafting/logistics/green_postbox.json | 35 ++++ .../green_postbox_from_other_postbox.json | 33 ++++ .../crafting/logistics/green_table_cloth.json | 33 ++++ ...en_table_cloth_from_other_table_cloth.json | 33 ++++ .../logistics/light_blue_postbox.json | 35 ++++ ...light_blue_postbox_from_other_postbox.json | 33 ++++ .../logistics/light_blue_table_cloth.json | 33 ++++ ...ue_table_cloth_from_other_table_cloth.json | 33 ++++ .../logistics/light_gray_postbox.json | 35 ++++ ...light_gray_postbox_from_other_postbox.json | 33 ++++ .../logistics/light_gray_table_cloth.json | 33 ++++ ...ay_table_cloth_from_other_table_cloth.json | 33 ++++ .../crafting/logistics/lime_postbox.json | 35 ++++ .../lime_postbox_from_other_postbox.json | 33 ++++ .../crafting/logistics/lime_table_cloth.json | 33 ++++ ...me_table_cloth_from_other_table_cloth.json | 33 ++++ .../crafting/logistics/magenta_postbox.json | 35 ++++ .../magenta_postbox_from_other_postbox.json | 33 ++++ .../logistics/magenta_table_cloth.json | 33 ++++ ...ta_table_cloth_from_other_table_cloth.json | 33 ++++ .../crafting/logistics/orange_postbox.json | 35 ++++ .../orange_postbox_from_other_postbox.json | 33 ++++ .../logistics/orange_table_cloth.json | 33 ++++ ...ge_table_cloth_from_other_table_cloth.json | 33 ++++ .../crafting/logistics/pink_postbox.json | 35 ++++ .../pink_postbox_from_other_postbox.json | 33 ++++ .../crafting/logistics/pink_table_cloth.json | 33 ++++ ...nk_table_cloth_from_other_table_cloth.json | 33 ++++ .../crafting/logistics/purple_postbox.json | 35 ++++ .../purple_postbox_from_other_postbox.json | 33 ++++ .../logistics/purple_table_cloth.json | 33 ++++ ...le_table_cloth_from_other_table_cloth.json | 33 ++++ .../crafting/logistics/red_postbox.json | 35 ++++ .../red_postbox_from_other_postbox.json | 33 ++++ .../crafting/logistics/red_table_cloth.json | 33 ++++ ...ed_table_cloth_from_other_table_cloth.json | 33 ++++ .../crafting/logistics/white_postbox.json | 35 ++++ .../white_postbox_from_other_postbox.json | 33 ++++ .../crafting/logistics/white_table_cloth.json | 33 ++++ ...te_table_cloth_from_other_table_cloth.json | 33 ++++ .../crafting/logistics/yellow_postbox.json | 35 ++++ .../yellow_postbox_from_other_postbox.json | 33 ++++ .../logistics/yellow_table_cloth.json | 33 ++++ ...ow_table_cloth_from_other_table_cloth.json | 33 ++++ ...loth_from_andesite_alloy_stonecutting.json | 35 ++++ ..._cloth_from_ingots_brass_stonecutting.json | 33 ++++ ...cloth_from_ingots_copper_stonecutting.json | 33 ++++ .../crafting/appliances/cardboard_sword.json | 35 ++++ .../crafting/kinetics/chain_conveyor.json | 35 ++++ .../crafting/kinetics/package_filter.json | 33 ++++ .../misc/crafting/logistics/desk_bell.json | 35 ++++ .../crafting/logistics/factory_gauge.json | 35 ++++ .../misc/crafting/logistics/item_hatch.json | 35 ++++ .../crafting/logistics/package_frogport.json | 35 ++++ .../misc/crafting/logistics/packager.json | 35 ++++ .../misc/crafting/logistics/pulse_timer.json | 33 ++++ .../logistics/redstone_requester.json | 35 ++++ .../misc/crafting/logistics/stock_link.json | 35 ++++ .../misc/crafting/logistics/stock_ticker.json | 35 ++++ ...loth_from_andesite_alloy_stonecutting.json | 8 + ..._cloth_from_ingots_brass_stonecutting.json | 8 + ...cloth_from_ingots_copper_stonecutting.json | 8 + .../crafting/appliances/cardboard_sword.json | 21 ++ .../crafting/kinetics/chain_conveyor.json | 22 +++ .../crafting/kinetics/package_filter.json | 19 ++ .../crafting/logistics/black_postbox.json | 24 +++ .../black_postbox_from_other_postbox.json | 15 ++ .../crafting/logistics/black_table_cloth.json | 16 ++ ...ck_table_cloth_from_other_table_cloth.json | 15 ++ .../crafting/logistics/blue_postbox.json | 24 +++ .../blue_postbox_from_other_postbox.json | 15 ++ .../crafting/logistics/blue_table_cloth.json | 16 ++ ...ue_table_cloth_from_other_table_cloth.json | 15 ++ .../crafting/logistics/brown_postbox.json | 24 +++ .../brown_postbox_from_other_postbox.json | 15 ++ .../crafting/logistics/brown_table_cloth.json | 16 ++ ...wn_table_cloth_from_other_table_cloth.json | 15 ++ .../crafting/logistics/cyan_postbox.json | 24 +++ .../cyan_postbox_from_other_postbox.json | 15 ++ .../crafting/logistics/cyan_table_cloth.json | 16 ++ ...an_table_cloth_from_other_table_cloth.json | 15 ++ .../recipes/crafting/logistics/desk_bell.json | 15 ++ .../crafting/logistics/factory_gauge.json | 16 ++ .../crafting/logistics/gray_postbox.json | 24 +++ .../gray_postbox_from_other_postbox.json | 15 ++ .../crafting/logistics/gray_table_cloth.json | 16 ++ ...ay_table_cloth_from_other_table_cloth.json | 15 ++ .../crafting/logistics/green_postbox.json | 24 +++ .../green_postbox_from_other_postbox.json | 15 ++ .../crafting/logistics/green_table_cloth.json | 16 ++ ...en_table_cloth_from_other_table_cloth.json | 15 ++ .../crafting/logistics/item_hatch.json | 15 ++ .../logistics/light_blue_postbox.json | 24 +++ ...light_blue_postbox_from_other_postbox.json | 15 ++ .../logistics/light_blue_table_cloth.json | 16 ++ ...ue_table_cloth_from_other_table_cloth.json | 15 ++ .../logistics/light_gray_postbox.json | 24 +++ ...light_gray_postbox_from_other_postbox.json | 15 ++ .../logistics/light_gray_table_cloth.json | 16 ++ ...ay_table_cloth_from_other_table_cloth.json | 15 ++ .../crafting/logistics/lime_postbox.json | 24 +++ .../lime_postbox_from_other_postbox.json | 15 ++ .../crafting/logistics/lime_table_cloth.json | 16 ++ ...me_table_cloth_from_other_table_cloth.json | 15 ++ .../crafting/logistics/magenta_postbox.json | 24 +++ .../magenta_postbox_from_other_postbox.json | 15 ++ .../logistics/magenta_table_cloth.json | 16 ++ ...ta_table_cloth_from_other_table_cloth.json | 15 ++ .../crafting/logistics/orange_postbox.json | 24 +++ .../orange_postbox_from_other_postbox.json | 15 ++ .../logistics/orange_table_cloth.json | 16 ++ ...ge_table_cloth_from_other_table_cloth.json | 15 ++ .../crafting/logistics/package_frogport.json | 24 +++ .../recipes/crafting/logistics/packager.json | 21 ++ .../crafting/logistics/pink_postbox.json | 24 +++ .../pink_postbox_from_other_postbox.json | 15 ++ .../crafting/logistics/pink_table_cloth.json | 16 ++ ...nk_table_cloth_from_other_table_cloth.json | 15 ++ .../crafting/logistics/pulse_timer.json | 26 +++ .../crafting/logistics/purple_postbox.json | 24 +++ .../purple_postbox_from_other_postbox.json | 15 ++ .../logistics/purple_table_cloth.json | 16 ++ ...le_table_cloth_from_other_table_cloth.json | 15 ++ .../crafting/logistics/red_postbox.json | 24 +++ .../red_postbox_from_other_postbox.json | 15 ++ .../crafting/logistics/red_table_cloth.json | 16 ++ ...ed_table_cloth_from_other_table_cloth.json | 15 ++ .../logistics/redstone_requester.json | 24 +++ .../crafting/logistics/stock_link.json | 24 +++ .../crafting/logistics/stock_ticker.json | 24 +++ .../crafting/logistics/white_postbox.json | 24 +++ .../white_postbox_from_other_postbox.json | 15 ++ .../crafting/logistics/white_table_cloth.json | 16 ++ ...te_table_cloth_from_other_table_cloth.json | 15 ++ .../crafting/logistics/yellow_postbox.json | 24 +++ .../yellow_postbox_from_other_postbox.json | 15 ++ .../logistics/yellow_table_cloth.json | 16 ++ ...ow_table_cloth_from_other_table_cloth.json | 15 ++ .../create/recipes/mixing/cardboard_pulp.json | 18 +- .../create/tags/items/dyed_table_cloths.json | 20 ++ .../data/create/tags/items/pulpifiable.json | 7 + .../java/com/simibubi/create/AllBlocks.java | 45 ++++- .../java/com/simibubi/create/AllTags.java | 2 + .../StockKeeperOpenRequestScreenPacket.java | 3 + .../foundation/data/BuilderTransformers.java | 47 +++-- .../data/recipe/CreateRecipeProvider.java | 8 + .../data/recipe/MixingRecipeGen.java | 19 +- .../data/recipe/StandardRecipeGen.java | 186 +++++++++++++----- .../foundation/fluid/FluidRenderer.java | 4 +- .../data/CreateRegistrateTags.java | 4 + 173 files changed, 4489 insertions(+), 98 deletions(-) create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/black_postbox.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/black_postbox_from_other_postbox.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/black_table_cloth.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/black_table_cloth_from_other_table_cloth.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/blue_postbox.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/blue_postbox_from_other_postbox.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/blue_table_cloth.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/blue_table_cloth_from_other_table_cloth.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/brown_postbox.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/brown_postbox_from_other_postbox.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/brown_table_cloth.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/brown_table_cloth_from_other_table_cloth.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/cyan_postbox.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/cyan_postbox_from_other_postbox.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/cyan_table_cloth.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/cyan_table_cloth_from_other_table_cloth.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/gray_postbox.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/gray_postbox_from_other_postbox.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/gray_table_cloth.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/gray_table_cloth_from_other_table_cloth.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/green_postbox.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/green_postbox_from_other_postbox.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/green_table_cloth.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/green_table_cloth_from_other_table_cloth.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/light_blue_postbox.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/light_blue_postbox_from_other_postbox.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/light_blue_table_cloth.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/light_blue_table_cloth_from_other_table_cloth.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/light_gray_postbox.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/light_gray_postbox_from_other_postbox.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/light_gray_table_cloth.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/light_gray_table_cloth_from_other_table_cloth.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/lime_postbox.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/lime_postbox_from_other_postbox.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/lime_table_cloth.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/lime_table_cloth_from_other_table_cloth.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/magenta_postbox.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/magenta_postbox_from_other_postbox.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/magenta_table_cloth.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/magenta_table_cloth_from_other_table_cloth.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/orange_postbox.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/orange_postbox_from_other_postbox.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/orange_table_cloth.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/orange_table_cloth_from_other_table_cloth.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/pink_postbox.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/pink_postbox_from_other_postbox.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/pink_table_cloth.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/pink_table_cloth_from_other_table_cloth.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/purple_postbox.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/purple_postbox_from_other_postbox.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/purple_table_cloth.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/purple_table_cloth_from_other_table_cloth.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/red_postbox.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/red_postbox_from_other_postbox.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/red_table_cloth.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/red_table_cloth_from_other_table_cloth.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/white_postbox.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/white_postbox_from_other_postbox.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/white_table_cloth.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/white_table_cloth_from_other_table_cloth.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/yellow_postbox.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/yellow_postbox_from_other_postbox.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/yellow_table_cloth.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/yellow_table_cloth_from_other_table_cloth.json create mode 100644 src/generated/resources/data/create/advancements/recipes/decorations/andesite_table_cloth_from_andesite_alloy_stonecutting.json create mode 100644 src/generated/resources/data/create/advancements/recipes/decorations/brass_table_cloth_from_ingots_brass_stonecutting.json create mode 100644 src/generated/resources/data/create/advancements/recipes/decorations/copper_table_cloth_from_ingots_copper_stonecutting.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/appliances/cardboard_sword.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/chain_conveyor.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/package_filter.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/desk_bell.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/factory_gauge.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/item_hatch.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/package_frogport.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/packager.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/pulse_timer.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/redstone_requester.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/stock_link.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/stock_ticker.json create mode 100644 src/generated/resources/data/create/recipes/andesite_table_cloth_from_andesite_alloy_stonecutting.json create mode 100644 src/generated/resources/data/create/recipes/brass_table_cloth_from_ingots_brass_stonecutting.json create mode 100644 src/generated/resources/data/create/recipes/copper_table_cloth_from_ingots_copper_stonecutting.json create mode 100644 src/generated/resources/data/create/recipes/crafting/appliances/cardboard_sword.json create mode 100644 src/generated/resources/data/create/recipes/crafting/kinetics/chain_conveyor.json create mode 100644 src/generated/resources/data/create/recipes/crafting/kinetics/package_filter.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/black_postbox.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/black_postbox_from_other_postbox.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/black_table_cloth.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/black_table_cloth_from_other_table_cloth.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/blue_postbox.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/blue_postbox_from_other_postbox.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/blue_table_cloth.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/blue_table_cloth_from_other_table_cloth.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/brown_postbox.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/brown_postbox_from_other_postbox.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/brown_table_cloth.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/brown_table_cloth_from_other_table_cloth.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/cyan_postbox.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/cyan_postbox_from_other_postbox.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/cyan_table_cloth.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/cyan_table_cloth_from_other_table_cloth.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/desk_bell.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/factory_gauge.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/gray_postbox.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/gray_postbox_from_other_postbox.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/gray_table_cloth.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/gray_table_cloth_from_other_table_cloth.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/green_postbox.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/green_postbox_from_other_postbox.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/green_table_cloth.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/green_table_cloth_from_other_table_cloth.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/item_hatch.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/light_blue_postbox.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/light_blue_postbox_from_other_postbox.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/light_blue_table_cloth.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/light_blue_table_cloth_from_other_table_cloth.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/light_gray_postbox.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/light_gray_postbox_from_other_postbox.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/light_gray_table_cloth.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/light_gray_table_cloth_from_other_table_cloth.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/lime_postbox.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/lime_postbox_from_other_postbox.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/lime_table_cloth.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/lime_table_cloth_from_other_table_cloth.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/magenta_postbox.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/magenta_postbox_from_other_postbox.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/magenta_table_cloth.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/magenta_table_cloth_from_other_table_cloth.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/orange_postbox.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/orange_postbox_from_other_postbox.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/orange_table_cloth.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/orange_table_cloth_from_other_table_cloth.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/package_frogport.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/packager.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/pink_postbox.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/pink_postbox_from_other_postbox.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/pink_table_cloth.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/pink_table_cloth_from_other_table_cloth.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/pulse_timer.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/purple_postbox.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/purple_postbox_from_other_postbox.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/purple_table_cloth.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/purple_table_cloth_from_other_table_cloth.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/red_postbox.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/red_postbox_from_other_postbox.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/red_table_cloth.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/red_table_cloth_from_other_table_cloth.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/redstone_requester.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/stock_link.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/stock_ticker.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/white_postbox.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/white_postbox_from_other_postbox.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/white_table_cloth.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/white_table_cloth_from_other_table_cloth.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/yellow_postbox.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/yellow_postbox_from_other_postbox.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/yellow_table_cloth.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/yellow_table_cloth_from_other_table_cloth.json create mode 100644 src/generated/resources/data/create/tags/items/dyed_table_cloths.json create mode 100644 src/generated/resources/data/create/tags/items/pulpifiable.json diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index d5af5e8104..da29cb5a51 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-11-05T20:56:43.0602251 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-11-05T22:14:55.5235978 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -2578,6 +2578,70 @@ fc6babcc211f6ed7f231ed8da12f42f0ab858f4f data/create/advancements/recipes/buildi 8ef5d43ae4344f548efb55793ecc889cc011c0a1 data/create/advancements/recipes/building_blocks/crafting/kinetics/white_seat_from_other_seat.json 415435d450d42d97335416c6faa12538dc8e0fb6 data/create/advancements/recipes/building_blocks/crafting/kinetics/yellow_seat.json e71219bcfe8c712fc7e7368c2933533b3c5ef121 data/create/advancements/recipes/building_blocks/crafting/kinetics/yellow_seat_from_other_seat.json +2171371d683e03c5d6b5b7e89be6c674804adab7 data/create/advancements/recipes/building_blocks/crafting/logistics/black_postbox.json +f62a87aaa90fd82730c7bc0b2f6fcecfbdaa8042 data/create/advancements/recipes/building_blocks/crafting/logistics/black_postbox_from_other_postbox.json +f598f4689e6e02c7e4325085ee3bb9f43a96377e data/create/advancements/recipes/building_blocks/crafting/logistics/black_table_cloth.json +123399acf7acf989d92735600d74c14ef5849ffc data/create/advancements/recipes/building_blocks/crafting/logistics/black_table_cloth_from_other_table_cloth.json +f2dda3b77262a1d14ab3bc39fbe0bc10a519b947 data/create/advancements/recipes/building_blocks/crafting/logistics/blue_postbox.json +8997db26c93945f3ef6deb87b51c12e2f28789b9 data/create/advancements/recipes/building_blocks/crafting/logistics/blue_postbox_from_other_postbox.json +06207bb81c2ee103d79dc8b8f9d38119b6b6bf55 data/create/advancements/recipes/building_blocks/crafting/logistics/blue_table_cloth.json +5383fc14b57fb591ebfee9962a774c354f5e99f4 data/create/advancements/recipes/building_blocks/crafting/logistics/blue_table_cloth_from_other_table_cloth.json +29f34e0859d0ff8476dcd23d3076d0ed27656a06 data/create/advancements/recipes/building_blocks/crafting/logistics/brown_postbox.json +6fafc9beff44de0c4f0636dd2f24580b5a357621 data/create/advancements/recipes/building_blocks/crafting/logistics/brown_postbox_from_other_postbox.json +5237f007a87e119f9083234f825ac757b9fd7883 data/create/advancements/recipes/building_blocks/crafting/logistics/brown_table_cloth.json +366e5c9fdcd9cf9d1189eed5074b3e7cb1759970 data/create/advancements/recipes/building_blocks/crafting/logistics/brown_table_cloth_from_other_table_cloth.json +35afab0036df98cc60d4e728492694a416c75309 data/create/advancements/recipes/building_blocks/crafting/logistics/cyan_postbox.json +661c1356fe0c8a13c11c6026cc2526e10dcd039f data/create/advancements/recipes/building_blocks/crafting/logistics/cyan_postbox_from_other_postbox.json +607e923aeb6ce8b346f4da35ed67a17c69df570f data/create/advancements/recipes/building_blocks/crafting/logistics/cyan_table_cloth.json +ec07ec408fb4beb8189f827d8c5b53007944c693 data/create/advancements/recipes/building_blocks/crafting/logistics/cyan_table_cloth_from_other_table_cloth.json +958fab294f6a55a9ae18b21196600d7764de095a data/create/advancements/recipes/building_blocks/crafting/logistics/gray_postbox.json +93d63182b51e66a76dbea7f2f27ac0ada953cfa8 data/create/advancements/recipes/building_blocks/crafting/logistics/gray_postbox_from_other_postbox.json +da207311c49105b9bb3cb7cf53ebdb8d0121f1a1 data/create/advancements/recipes/building_blocks/crafting/logistics/gray_table_cloth.json +6102c4f5d72c16b2b2e6aedd53c91c9a00585620 data/create/advancements/recipes/building_blocks/crafting/logistics/gray_table_cloth_from_other_table_cloth.json +e23b3d1e71a5b81093f6e71ad3ae1fa60923ad86 data/create/advancements/recipes/building_blocks/crafting/logistics/green_postbox.json +0be2943dfe2c6a98092dd44cbe2437b9c142f81a data/create/advancements/recipes/building_blocks/crafting/logistics/green_postbox_from_other_postbox.json +7c091e9a30e29cdb934c0bdb9c04b57f0a9a369a data/create/advancements/recipes/building_blocks/crafting/logistics/green_table_cloth.json +7c5cbfaccf7d14241c97c04fe5baf7f6031cc620 data/create/advancements/recipes/building_blocks/crafting/logistics/green_table_cloth_from_other_table_cloth.json +8f4bc79097e67045ec7b7394d47f845809f9851f data/create/advancements/recipes/building_blocks/crafting/logistics/light_blue_postbox.json +1a4b12a60b3b971fd7222a90425908b33fa7985d data/create/advancements/recipes/building_blocks/crafting/logistics/light_blue_postbox_from_other_postbox.json +166ee7c019768be4b9494608d13a7265e1e97a80 data/create/advancements/recipes/building_blocks/crafting/logistics/light_blue_table_cloth.json +64189712c7c89ddb53860e4ecbbb1cfe84173e90 data/create/advancements/recipes/building_blocks/crafting/logistics/light_blue_table_cloth_from_other_table_cloth.json +12b80ed2b31d3b65a831463538fc8d7788d9a77a data/create/advancements/recipes/building_blocks/crafting/logistics/light_gray_postbox.json +bd0ebfb2379f37aeb3c03d39a6d8aa005ef3d4cf data/create/advancements/recipes/building_blocks/crafting/logistics/light_gray_postbox_from_other_postbox.json +e1ce7076edd98e38e8d749c046ed6d289dae204e data/create/advancements/recipes/building_blocks/crafting/logistics/light_gray_table_cloth.json +70e7e4df0f8b00490ac85cc7c38e501baf799d88 data/create/advancements/recipes/building_blocks/crafting/logistics/light_gray_table_cloth_from_other_table_cloth.json +39182b8805ecd20842cd9d94825f5504d0bd8a0a data/create/advancements/recipes/building_blocks/crafting/logistics/lime_postbox.json +d7ddb4841e306859b471be6c32f91d4bd471eae6 data/create/advancements/recipes/building_blocks/crafting/logistics/lime_postbox_from_other_postbox.json +96f70bf632c5ec0dcead6ea9b03967a92321c767 data/create/advancements/recipes/building_blocks/crafting/logistics/lime_table_cloth.json +e0192fb9ef0422d25deaa1801228357f135097cc data/create/advancements/recipes/building_blocks/crafting/logistics/lime_table_cloth_from_other_table_cloth.json +e6b6ba626266d2ea84cce1a389df27cd44eeb15b data/create/advancements/recipes/building_blocks/crafting/logistics/magenta_postbox.json +7da22d10a137d0e1a953c2cb6b0c15f64cf4f453 data/create/advancements/recipes/building_blocks/crafting/logistics/magenta_postbox_from_other_postbox.json +416ef49b1c7cd1738c7329901dacad1688febae6 data/create/advancements/recipes/building_blocks/crafting/logistics/magenta_table_cloth.json +fc94c20112d6a0a8c85dd63dc6b036d7a8d6c9d4 data/create/advancements/recipes/building_blocks/crafting/logistics/magenta_table_cloth_from_other_table_cloth.json +13b2e283564460e095069fb9723a6d4cdcee6931 data/create/advancements/recipes/building_blocks/crafting/logistics/orange_postbox.json +1f38371e0896d74abeb6616dde615345d57e3f1d data/create/advancements/recipes/building_blocks/crafting/logistics/orange_postbox_from_other_postbox.json +1c49627c32669b053945c1dc6b99868e03224a05 data/create/advancements/recipes/building_blocks/crafting/logistics/orange_table_cloth.json +0b302e3ab914de973e1a836b7babb0bfb89b8e79 data/create/advancements/recipes/building_blocks/crafting/logistics/orange_table_cloth_from_other_table_cloth.json +f7ec699ff45bba54777c0b824a30b5e9a72e093a data/create/advancements/recipes/building_blocks/crafting/logistics/pink_postbox.json +8e1188506d566763fddf96d5452aae6c409504e9 data/create/advancements/recipes/building_blocks/crafting/logistics/pink_postbox_from_other_postbox.json +fa809c6e9eb3f7ff752976516ad57fa06cc2df6f data/create/advancements/recipes/building_blocks/crafting/logistics/pink_table_cloth.json +dde27c90e1a922b75ac35939d44ce4a3c2557371 data/create/advancements/recipes/building_blocks/crafting/logistics/pink_table_cloth_from_other_table_cloth.json +b99839abaeec938e903068ade927913e752df6ae data/create/advancements/recipes/building_blocks/crafting/logistics/purple_postbox.json +5ff2cf3a429f02f067ee0cfe5317937e69b816fd data/create/advancements/recipes/building_blocks/crafting/logistics/purple_postbox_from_other_postbox.json +9ba73de4e8069ecaf76b87b1746751264e8924b4 data/create/advancements/recipes/building_blocks/crafting/logistics/purple_table_cloth.json +8d27b828d4a39ccae7fb77ffd5774458850cb7ef data/create/advancements/recipes/building_blocks/crafting/logistics/purple_table_cloth_from_other_table_cloth.json +a9f13b04c89f2511b4ad83a14d6a1c64c16da745 data/create/advancements/recipes/building_blocks/crafting/logistics/red_postbox.json +6cb3089269221dc534c514bbcc1377a5199a273f data/create/advancements/recipes/building_blocks/crafting/logistics/red_postbox_from_other_postbox.json +675b04c5050796702e0fa970bc5f4a4153d12be2 data/create/advancements/recipes/building_blocks/crafting/logistics/red_table_cloth.json +489e033281e72dd1dee6a16bdee524f58a7b6679 data/create/advancements/recipes/building_blocks/crafting/logistics/red_table_cloth_from_other_table_cloth.json +ab72539b2ebe8cc2874a62dc32463421c9c685d1 data/create/advancements/recipes/building_blocks/crafting/logistics/white_postbox.json +b4bd005477650d6f6b5bbc244e5b25f8ad9f5f14 data/create/advancements/recipes/building_blocks/crafting/logistics/white_postbox_from_other_postbox.json +84040091909e565b1390576e3ed58cdc9735f24e data/create/advancements/recipes/building_blocks/crafting/logistics/white_table_cloth.json +113d0c96d61d27e419ef414550667379e37c5bf6 data/create/advancements/recipes/building_blocks/crafting/logistics/white_table_cloth_from_other_table_cloth.json +7d2c65210628be4a3d0c09dbf1e6fbbe868a9e56 data/create/advancements/recipes/building_blocks/crafting/logistics/yellow_postbox.json +9c2e00b2ac4f81f0cac0d9be6b06a0d077a23310 data/create/advancements/recipes/building_blocks/crafting/logistics/yellow_postbox_from_other_postbox.json +f116a1d549313a99135282a2a13262aada1a1dee data/create/advancements/recipes/building_blocks/crafting/logistics/yellow_table_cloth.json +2d0f3dc8fb9620ef3085ebbb932c7f0705ed893d data/create/advancements/recipes/building_blocks/crafting/logistics/yellow_table_cloth_from_other_table_cloth.json f3188b24f8108be4219016689a4768f826b4fef3 data/create/advancements/recipes/building_blocks/crimsite_from_stone_types_crimsite_stonecutting.json e88373b83226d860b0c2131213f5d3b09f31ab96 data/create/advancements/recipes/building_blocks/crimsite_pillar_from_stone_types_crimsite_stonecutting.json 09f7122cf360fd56bde2b1659bbed526f9a119c4 data/create/advancements/recipes/building_blocks/crimson_window.json @@ -3119,12 +3183,15 @@ f093326ca1f341bede9f7cbefecadf7d73d3f9d7 data/create/advancements/recipes/buildi 39c93330e07e58d79db13d132d7f1a8f33670e9b data/create/advancements/recipes/decorations/andesite_bars_from_andesite_alloy_stonecutting.json 769926b9bb00dea3bf0534c8d828873b13def961 data/create/advancements/recipes/decorations/andesite_ladder_from_andesite_alloy_stonecutting.json 266700212dece6cba8c338a1e0a8507bb41f92e6 data/create/advancements/recipes/decorations/andesite_scaffolding_from_andesite_alloy_stonecutting.json +f6513fa4fdf26848b2f9ce9bd015377a2583c439 data/create/advancements/recipes/decorations/andesite_table_cloth_from_andesite_alloy_stonecutting.json 07ad89608ed200f4c8051a398f5da9d29769c39f data/create/advancements/recipes/decorations/brass_bars_from_ingots_brass_stonecutting.json d11ca4dc890089326eede1bd5b7a32a97cc91886 data/create/advancements/recipes/decorations/brass_ladder_from_ingots_brass_stonecutting.json cbeb1685b639f0b0b2a637374ff548251c0a932e data/create/advancements/recipes/decorations/brass_scaffolding_from_ingots_brass_stonecutting.json +b3c785f2f494ab60bbe295eafecf9292379a5ff2 data/create/advancements/recipes/decorations/brass_table_cloth_from_ingots_brass_stonecutting.json 2ed97c748d8fe0c9fd060b53a4095a37a10ce67f data/create/advancements/recipes/decorations/copper_bars_from_ingots_copper_stonecutting.json e55c465683e664a0205b62d2e132afeb89ee4dce data/create/advancements/recipes/decorations/copper_ladder_from_ingots_copper_stonecutting.json d3a0524f9fce7293f8c3adbd757c5d5afe74af27 data/create/advancements/recipes/decorations/copper_scaffolding_from_ingots_copper_stonecutting.json +1762dee3f3c416d8867d90e3ce9b68c3c5fe650f data/create/advancements/recipes/decorations/copper_table_cloth_from_ingots_copper_stonecutting.json 34ae39bca445f80d431b3e329de3c1bf847a8eef data/create/advancements/recipes/misc/crafting/kinetics/black_valve_handle_from_other_valve_handle.json e222002ee051e7b72b3658655bb53b5adb825272 data/create/advancements/recipes/misc/crafting/kinetics/blue_valve_handle_from_other_valve_handle.json 472c9e1d515f5f34d97efc334cefe3eb62d860e4 data/create/advancements/recipes/misc/crafting/kinetics/brown_valve_handle_from_other_valve_handle.json @@ -3803,6 +3870,7 @@ b9648ec56e55fe2b9d54adf172405519a46bfa66 data/create/loot_tables/blocks/yellow_v 20bd65d72f1762edf473b2fafc71fcf7d55c01f9 data/create/recipes/andesite_ladder_from_andesite_alloy_stonecutting.json 0b3896151533d220c2d1f3768c6f8e428516ff5b data/create/recipes/andesite_pillar_from_stone_types_andesite_stonecutting.json 367e57a760156a19fc6805a0f23c3f8194cd4255 data/create/recipes/andesite_scaffolding_from_andesite_alloy_stonecutting.json +24e5ad71ab310105a5cb3cf3d0a1fe46b162bd41 data/create/recipes/andesite_table_cloth_from_andesite_alloy_stonecutting.json 5272c61c8c17eb7a528cade93bbc80fd9ef51521 data/create/recipes/asurine_from_stone_types_asurine_stonecutting.json 5bf4b9baf782a461efc36d463b99b9acb0ab4607 data/create/recipes/asurine_pillar_from_stone_types_asurine_stonecutting.json 6e54f07090c60a8163038672bcbf47464219bb9b data/create/recipes/bamboo_window.json @@ -3812,6 +3880,7 @@ b9648ec56e55fe2b9d54adf172405519a46bfa66 data/create/loot_tables/blocks/yellow_v 5965f3abe435ac0b3a39d8ec31af71808592642b data/create/recipes/brass_bars_from_ingots_brass_stonecutting.json 4b29884cd866dcda1b93899d81fcd3a2ae4c541b data/create/recipes/brass_ladder_from_ingots_brass_stonecutting.json 9c685014019a7a4f1ef47f235cd1e9b3f9093295 data/create/recipes/brass_scaffolding_from_ingots_brass_stonecutting.json +6f6c35d06c926e7d11e4b3d4e63d867c5546da46 data/create/recipes/brass_table_cloth_from_ingots_brass_stonecutting.json 8f21b67e168a14d354b6c00b5ec795355fdd4209 data/create/recipes/calcite_from_stone_types_calcite_stonecutting.json da3692808565988e21ec5b1d5e976338ccc4a037 data/create/recipes/calcite_pillar_from_stone_types_calcite_stonecutting.json 79bd6c532172149ede8e161f2809362d90f87e7d data/create/recipes/cherry_window.json @@ -3824,6 +3893,7 @@ bb083ae1d057dc0106946e4c68f9469b81724396 data/create/recipes/copper_shingle_slab 3689feaca2bd5355fa2d4226cd2cc519fa9b97c1 data/create/recipes/copper_shingle_slab_from_copper_shingles_stonecutting.json bd4cd7119f8371164b278afc679795a3c2a53406 data/create/recipes/copper_shingle_stairs.json 59f672e8e88d5f4655467e2696616b552debaf46 data/create/recipes/copper_shingle_stairs_from_copper_shingles_stonecutting.json +0225fc8d7b7a5027b8a61e6a043c3a8e505d876a data/create/recipes/copper_table_cloth_from_ingots_copper_stonecutting.json d463aa891c7ae1b2eb1a758e4100c5a1c16cfffd data/create/recipes/copper_tiles_from_ingots_copper_stonecutting.json f64ba3f3c607b43ea77e5bccb7ec2048e5c6e424 data/create/recipes/copper_tile_slab.json 91b0390e0c772d43eb46b94a0113323f0f6a4387 data/create/recipes/copper_tile_slab_from_copper_tiles_stonecutting.json @@ -3904,24 +3974,88 @@ b04c1cebcfbcf44c4ced04252f54dbfeb8f9ff12 data/create/recipes/crafting/kinetics/w 75633a46c374230fab4096a45628b42d6012627d data/create/recipes/crafting/kinetics/yellow_seat_from_other_seat.json 2be097bb4f1e47a6b3a4a6f0ef222dffe31a1e22 data/create/recipes/crafting/kinetics/yellow_valve_handle_from_other_valve_handle.json 113186f64e29efebd628fe3d88ae69f1ef0537f0 data/create/recipes/crafting/logistics/andesite_table_cloth_clear.json +f4eec2dbb24d5fdd6971f8be965d4c908d8d39ea data/create/recipes/crafting/logistics/black_postbox.json +bf48cc90d8269c3c443007ce224c13fa5a2e741b data/create/recipes/crafting/logistics/black_postbox_from_other_postbox.json +a5dd78419a491f70c12e036769ec8244b561806e data/create/recipes/crafting/logistics/black_table_cloth.json ab88f259eb1ea6767c97969e205241e91c0fe048 data/create/recipes/crafting/logistics/black_table_cloth_clear.json +b1a32a62d0e90fe01fdad31151dc269a2ed38e3f data/create/recipes/crafting/logistics/black_table_cloth_from_other_table_cloth.json +7e010aa7f5d22ac505bf04ad00ab3c56e0a78f3b data/create/recipes/crafting/logistics/blue_postbox.json +888a8202521f186fb7af27770e708f0fd4bb9659 data/create/recipes/crafting/logistics/blue_postbox_from_other_postbox.json +e48d20a774d0004eda8fc94b4589df42dfbb90ef data/create/recipes/crafting/logistics/blue_table_cloth.json 4002ef4244d7556fc132075d38ceb36e50cf1ed1 data/create/recipes/crafting/logistics/blue_table_cloth_clear.json +f34c1edaf347bb7dc863a00cf18650c0b0ee8dc5 data/create/recipes/crafting/logistics/blue_table_cloth_from_other_table_cloth.json 45a400f1b48d12af82615eba8bec4cdefb738333 data/create/recipes/crafting/logistics/brass_table_cloth_clear.json +c12ad278627aeba957aae502bb1762335918aa20 data/create/recipes/crafting/logistics/brown_postbox.json +9b481ac9d99aeb7d8bf334803628f0f200ca0ade data/create/recipes/crafting/logistics/brown_postbox_from_other_postbox.json +ce3245d64c34c3ca8374275a945004228b8cdaaf data/create/recipes/crafting/logistics/brown_table_cloth.json 850593663b67399a027d5126593e98109e626fea data/create/recipes/crafting/logistics/brown_table_cloth_clear.json +faf9a84bb5227353006f2406461a5a04e15e4111 data/create/recipes/crafting/logistics/brown_table_cloth_from_other_table_cloth.json 7c1fa243e64073d435ff2c4117dc04e002abc465 data/create/recipes/crafting/logistics/copper_table_cloth_clear.json +e899b7e0fd04525a362b62e4ee76aaaa43a33c2e data/create/recipes/crafting/logistics/cyan_postbox.json +062ea448224fea069f6455f430e01198a73aa386 data/create/recipes/crafting/logistics/cyan_postbox_from_other_postbox.json +65a946a8eecf693c8ec701d5ddbf1900c60e0744 data/create/recipes/crafting/logistics/cyan_table_cloth.json 5486c2bc2f263dd901e201bc3bad7015cf9e8d49 data/create/recipes/crafting/logistics/cyan_table_cloth_clear.json +4847ea28034779bcd922b1346afbe083ab06031f data/create/recipes/crafting/logistics/cyan_table_cloth_from_other_table_cloth.json +1bb34be88d5d690ed00e708fbe85d119f97f7abe data/create/recipes/crafting/logistics/gray_postbox.json +19cd2ea89699860c7870f1f38ac4fad3a5efd274 data/create/recipes/crafting/logistics/gray_postbox_from_other_postbox.json +e11f331c5bf91a1865efb5486c0314b0b5812be6 data/create/recipes/crafting/logistics/gray_table_cloth.json 8e04ba7eed8faff3c16e1a841c72d3a778c970f3 data/create/recipes/crafting/logistics/gray_table_cloth_clear.json +d21603c4548c977d043a2ff5a2fa4099343424d4 data/create/recipes/crafting/logistics/gray_table_cloth_from_other_table_cloth.json +25842442f3123e92702e502757de6558c710741a data/create/recipes/crafting/logistics/green_postbox.json +98f88f8462004a734db6928b20b1cb11b8efe03c data/create/recipes/crafting/logistics/green_postbox_from_other_postbox.json +85867127ec54aeca64b316b969d0f6b3cab559e5 data/create/recipes/crafting/logistics/green_table_cloth.json 2c630a129fe21227412803d42dc3211ec95b1a38 data/create/recipes/crafting/logistics/green_table_cloth_clear.json +e3056c024840fe30dd5fec142334cf8fbae4306e data/create/recipes/crafting/logistics/green_table_cloth_from_other_table_cloth.json +d84a6c6a145dc74fbbda8b4762c207c4f28674bd data/create/recipes/crafting/logistics/light_blue_postbox.json +1d5e8eb1be029acdb79a02224530d97e52aa791e data/create/recipes/crafting/logistics/light_blue_postbox_from_other_postbox.json +1cfb864aed59cd9b9f6512aff13eda74995f6f4b data/create/recipes/crafting/logistics/light_blue_table_cloth.json 1763f06ba76551bf5c4950d50561dd491a3fb86f data/create/recipes/crafting/logistics/light_blue_table_cloth_clear.json +ed9bffdeb2e60e9a5f219c5a7d3e999db7f3651f data/create/recipes/crafting/logistics/light_blue_table_cloth_from_other_table_cloth.json +49f73e661cdf8974be04cfe46d8aba6de63ed14a data/create/recipes/crafting/logistics/light_gray_postbox.json +b8b16c25f0336449e9a2d165bf40474fed381353 data/create/recipes/crafting/logistics/light_gray_postbox_from_other_postbox.json +976da2180c5da522d07e98284439e9ec89ec21af data/create/recipes/crafting/logistics/light_gray_table_cloth.json ea87dec016be2987fdc77c82c8ea792f93af3a7b data/create/recipes/crafting/logistics/light_gray_table_cloth_clear.json +7c1e33c5354150e028924a854e8f4dea1232e967 data/create/recipes/crafting/logistics/light_gray_table_cloth_from_other_table_cloth.json +e72d0c641ad9a12c3c388601948cf274c9a8c62a data/create/recipes/crafting/logistics/lime_postbox.json +8f6f03db69e3f96d9dc178236a205971ca920b15 data/create/recipes/crafting/logistics/lime_postbox_from_other_postbox.json +1057fe838babd5a390df5445d5266a87326c0bb6 data/create/recipes/crafting/logistics/lime_table_cloth.json 468f4c27ac1134484ea81bafbc81055aab86ed21 data/create/recipes/crafting/logistics/lime_table_cloth_clear.json +13377a12a40705c8ab25137db21f184e4612600a data/create/recipes/crafting/logistics/lime_table_cloth_from_other_table_cloth.json +b46d3a58d318c38df93327789712c1b41681ea7d data/create/recipes/crafting/logistics/magenta_postbox.json +05886ad239c84fd019e1d378450da89137631317 data/create/recipes/crafting/logistics/magenta_postbox_from_other_postbox.json +49be11385f2164fb55bc49445297a41bf8682d0b data/create/recipes/crafting/logistics/magenta_table_cloth.json 9dd457949a6f5ff746c974f8fbf5ebbfa151e31e data/create/recipes/crafting/logistics/magenta_table_cloth_clear.json +a2e1b7080484cc5114196d01d8472aeebaa0df40 data/create/recipes/crafting/logistics/magenta_table_cloth_from_other_table_cloth.json +5dd83b47f9b5406534060662ed37fcea308f3b5b data/create/recipes/crafting/logistics/orange_postbox.json +72596b49737bf7a5fbbf01b2aec20565d2e1a01b data/create/recipes/crafting/logistics/orange_postbox_from_other_postbox.json +2f61600a28d6aaa3d7b0e7a54ed38ad9650b161e data/create/recipes/crafting/logistics/orange_table_cloth.json ed88c2ba5ea1a41e97e80aa97979587945919233 data/create/recipes/crafting/logistics/orange_table_cloth_clear.json +6c488a8c66ff3aab59b08ef1d1cb98fce5b2976e data/create/recipes/crafting/logistics/orange_table_cloth_from_other_table_cloth.json +9c53c8e6d8e7bcac36f611995c320ebee4a0778a data/create/recipes/crafting/logistics/pink_postbox.json +75622ad3e1fe195399404ae26efeeb6be310fd92 data/create/recipes/crafting/logistics/pink_postbox_from_other_postbox.json +2ef97ee1ade0ea40e275939870dc34ca941e443c data/create/recipes/crafting/logistics/pink_table_cloth.json b19c6ae1d968c0966815a78f2c112ea872dc1550 data/create/recipes/crafting/logistics/pink_table_cloth_clear.json +ff9044505caf27fb51922a26aa45edca75c8335c data/create/recipes/crafting/logistics/pink_table_cloth_from_other_table_cloth.json +c75f7138e92a54b6841950c5108ee03ede6af4f2 data/create/recipes/crafting/logistics/purple_postbox.json +b4f58bfe14f0b8b0070b71832150b983192ac52f data/create/recipes/crafting/logistics/purple_postbox_from_other_postbox.json +2fe939437431b6a26e0d9d6ce9453fb66fe45d9a data/create/recipes/crafting/logistics/purple_table_cloth.json 36cefcb804b1806428a6ff33bf4e5408d8f7a07f data/create/recipes/crafting/logistics/purple_table_cloth_clear.json +cb44dfbbcccd626f698d3aae8ff65ce3c9620dd2 data/create/recipes/crafting/logistics/purple_table_cloth_from_other_table_cloth.json +6deeeb05693bc98ecfd33cc11e4c098ecd76563b data/create/recipes/crafting/logistics/red_postbox.json +15310750906f41364522e0a27e8f5c2e5fd6c225 data/create/recipes/crafting/logistics/red_postbox_from_other_postbox.json +50876ccdd85879a29ae6181f2c330799a28f1365 data/create/recipes/crafting/logistics/red_table_cloth.json bddd8bfab2124ea63df317f74d37a6e4b65a583c data/create/recipes/crafting/logistics/red_table_cloth_clear.json +7c6e582effa01018b6f4048378079150c8cb5e8b data/create/recipes/crafting/logistics/red_table_cloth_from_other_table_cloth.json +3b062eeac9c5b9917f3eed67e7525912fb32dfca data/create/recipes/crafting/logistics/white_postbox.json +ace9f83cc4cba51a8564526044ccf6e51abbdf3e data/create/recipes/crafting/logistics/white_postbox_from_other_postbox.json +fc356d74038607c44c6f7d6e7ec56b84a557ebf1 data/create/recipes/crafting/logistics/white_table_cloth.json 8d292e87ac51ea1f1683d67c53a26601d8b89495 data/create/recipes/crafting/logistics/white_table_cloth_clear.json +a9f10b38ae6a44afee64e4ed590a7fd5bb505420 data/create/recipes/crafting/logistics/white_table_cloth_from_other_table_cloth.json +a005bbb2217a7e2c985d88a1255c4285c11dbe0b data/create/recipes/crafting/logistics/yellow_postbox.json +2e387f66250e68d0dadced19d8a93197ff2481f3 data/create/recipes/crafting/logistics/yellow_postbox_from_other_postbox.json +0b2aa56bbbae1189424207afb312fc2bb69b43a1 data/create/recipes/crafting/logistics/yellow_table_cloth.json 655446f2504c7d57d11a893b0c5b1177e4217e58 data/create/recipes/crafting/logistics/yellow_table_cloth_clear.json +db333d47f9e1d6b02aa670ea0aa10dabbcb0e319 data/create/recipes/crafting/logistics/yellow_table_cloth_from_other_table_cloth.json 44a59669177a5a1b0b0eb7cb3dd46826311f4dfe data/create/recipes/crimsite_from_stone_types_crimsite_stonecutting.json c3f4fd2206f3885904913289761f2b8b758e4c95 data/create/recipes/crimsite_pillar_from_stone_types_crimsite_stonecutting.json e1815f97fbc2786d77f5378a2696e36050d8a1fd data/create/recipes/crimson_window.json @@ -4502,10 +4636,12 @@ f43cac8216e2a9347e48cf93a43de95dd810ca20 data/create/tags/items/contraption_cont d371dfd35e49a7bef19f59c03e7f4ae20992f03d data/create/tags/items/create_ingots.json 910d0f5ccbc4c84b224eca1f1588b1695f41447b data/create/tags/items/crushed_raw_materials.json 0fa526e7e742573b603ad26b09526cf724efa1dc data/create/tags/items/deployable_drink.json +ebd7b09daf2f64c0c04d821696b0e145683d8693 data/create/tags/items/dyed_table_cloths.json 1cebeb92bd514b75d54ac6d5708047801f0501c5 data/create/tags/items/modded_stripped_logs.json 586f8fc5a8b8559c9dc0017e13c78ad918688fae data/create/tags/items/modded_stripped_wood.json f400870b8dbcd14238be3ec99c419093073ba3a6 data/create/tags/items/postboxes.json 695d75b352fd190b303c724d1aaee9bb786a903b data/create/tags/items/pressurized_air_sources.json +22c4d4e033a61942b170aa309ed46a89a0ba0c65 data/create/tags/items/pulpifiable.json 2cd3adffd8b151354df137a990dcb97996a665bb data/create/tags/items/sandpaper.json 79418bd729cef417b322cef9b491e7ae83317d61 data/create/tags/items/seats.json e02cb3bc2373336dc04495b0b414107f6f754b61 data/create/tags/items/sleepers.json diff --git a/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 b/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 index 65f707061a..436e2cc535 100644 --- a/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 +++ b/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 @@ -1,4 +1,4 @@ -// 1.20.1 2024-11-05T20:29:59.0953128 Create's Standard Recipes +// 1.20.1 2024-11-05T22:14:55.6025876 Create's Standard Recipes a8cc4af26f6c7c45a9eef12e92af1452fe042454 data/create/advancements/recipes/combat/crafting/appliances/netherite_backtank.json 2c2639c7b307ee7c7a4e97e5efebf496788998ad data/create/advancements/recipes/combat/crafting/appliances/netherite_backtank_from_netherite.json 81dcf0cb1aa99e39bc7d1a386e07cad4cee7d8b9 data/create/advancements/recipes/combat/crafting/appliances/netherite_diving_boots.json @@ -39,6 +39,7 @@ b90af96817d6c38ec446f7464642a473a55c2027 data/create/advancements/recipes/misc/b 52a32f67c9303fe18c51c40b49ca359cc556eb26 data/create/advancements/recipes/misc/crafting/appliances/cardboard_chestplate.json 6a0d06d354aa7f81e6141a03aeef9a51d03e3cd4 data/create/advancements/recipes/misc/crafting/appliances/cardboard_helmet.json dd3d469cc9899f3f7299cbd6903a2b541df5c7ff data/create/advancements/recipes/misc/crafting/appliances/cardboard_leggings.json +f94a848698e7e52e0fb15b240a4e0ef89a3974fd data/create/advancements/recipes/misc/crafting/appliances/cardboard_sword.json 8b0f0b4342adbd3466c81298c87b5ed8993c3636 data/create/advancements/recipes/misc/crafting/appliances/clipboard.json 42f06a32b53c954a54fa1d5ffb1afd2e161cbde2 data/create/advancements/recipes/misc/crafting/appliances/clipboard_clear.json 6fa2794d2d8d8d5ffeea22701862d79578adf7f2 data/create/advancements/recipes/misc/crafting/appliances/copper_backtank.json @@ -67,6 +68,7 @@ a8a3a16f1990f73cc0a6b7bca23a96ffa22f416d data/create/advancements/recipes/misc/c f7517ad35e98d11c7244be86ba4a7bde85eeaf13 data/create/advancements/recipes/misc/crafting/kinetics/brass_door.json 627b0ebad7cbc45d8a0c5803de626fa520bb2023 data/create/advancements/recipes/misc/crafting/kinetics/brass_hand.json 2408e2a5b5ca63f196a90a20bcf7f0d301fa2aa0 data/create/advancements/recipes/misc/crafting/kinetics/cart_assembler.json +ab387bedffc75758e85c66c7004c13f329611cf1 data/create/advancements/recipes/misc/crafting/kinetics/chain_conveyor.json aaaf7e0649acebf491229781c56a7b95a71a1c84 data/create/advancements/recipes/misc/crafting/kinetics/chute.json e8ba77b35a1f6cb364e143a9397a6314125b592f data/create/advancements/recipes/misc/crafting/kinetics/clockwork_bearing.json 71f386d073b9e0fb647a751cd6b75c0b70f1b001 data/create/advancements/recipes/misc/crafting/kinetics/clutch.json @@ -129,6 +131,7 @@ e918e8844c6ef4f5adcc95665a05f64c5372abcc data/create/advancements/recipes/misc/c 4c03ca9d953e800c23ca049c4428d9dd40a18d26 data/create/advancements/recipes/misc/crafting/kinetics/mysterious_cuckoo_clock.json d283b37887dc62e22965dbafbd3a3eb98d0488cf data/create/advancements/recipes/misc/crafting/kinetics/nixie_tube.json 27e3d4b5011ce17cc687a4a8b38b574dfff279d3 data/create/advancements/recipes/misc/crafting/kinetics/nozzle.json +fd5c479e8ad77d130a5e3be292f8d0b54baa13f2 data/create/advancements/recipes/misc/crafting/kinetics/package_filter.json df79a596a5b07701620a8bb86a7df4601b58c77d data/create/advancements/recipes/misc/crafting/kinetics/piston_extension_pole.json 384efeea25b1968b3131905da2d7cd73455768c5 data/create/advancements/recipes/misc/crafting/kinetics/placard.json 293f057653f70b25e9f94ddb514c8b95be3169ed data/create/advancements/recipes/misc/crafting/kinetics/portable_fluid_interface.json @@ -176,17 +179,26 @@ aa20a408807e09045d1f50b8c50311229272593c data/create/advancements/recipes/misc/c f3e387ae41a55cdb5ff745f40e2ddb5e2595e9b8 data/create/advancements/recipes/misc/crafting/logistics/brass_funnel.json dc61a327753684a0d8a7bcc408d656b53ac633b1 data/create/advancements/recipes/misc/crafting/logistics/brass_tunnel.json 03c367840951af268047c407b15aad52f0b094b4 data/create/advancements/recipes/misc/crafting/logistics/content_observer.json +4f8c6d91cff3e24e39847d23dc9e3015fff5fb0d data/create/advancements/recipes/misc/crafting/logistics/desk_bell.json 09454f1d4db813c89a0a2f3af966298fc5f7da7b data/create/advancements/recipes/misc/crafting/logistics/display_link.json +17a2c0315685dcb732eab1939676c95175820e54 data/create/advancements/recipes/misc/crafting/logistics/factory_gauge.json 02fd978c4f9f3c247710b052486cb498aebce95b data/create/advancements/recipes/misc/crafting/logistics/factory_gauge_clear.json +0e7dbb15985de28fd5e2e60cfbee409143fdff73 data/create/advancements/recipes/misc/crafting/logistics/item_hatch.json +fd14b161b827719d7ea709b88cb1d16adb1d5fbb data/create/advancements/recipes/misc/crafting/logistics/packager.json +802efaee476f8be8cba6754fe584324957be76e8 data/create/advancements/recipes/misc/crafting/logistics/package_frogport.json 95b357cbac39acfbc68ac04d0d4681a4d91746ee data/create/advancements/recipes/misc/crafting/logistics/powered_latch.json ef84b382bd4f6ba9558574f2c8e63030813594e9 data/create/advancements/recipes/misc/crafting/logistics/powered_toggle_latch.json c443707391ce79dc1ec8cfacee74757b0c00bd3e data/create/advancements/recipes/misc/crafting/logistics/pulse_extender.json 77c3df89a06fc10cd8bd1cc35f0353441860ec11 data/create/advancements/recipes/misc/crafting/logistics/pulse_repeater.json +95484003dc94bb919402f72115cdbae9a4eedfb9 data/create/advancements/recipes/misc/crafting/logistics/pulse_timer.json 96b4998626e624fb79c79fb754c28b21ddc27254 data/create/advancements/recipes/misc/crafting/logistics/redstone_contact.json 1b50ed47c37e48d1112c76059574eed71ecea4e5 data/create/advancements/recipes/misc/crafting/logistics/redstone_link.json +8ed69a5a2fcbc6e1cb2de901017ebd3fc3fb3dc3 data/create/advancements/recipes/misc/crafting/logistics/redstone_requester.json cea78bc9b093a8a6a85ef1df53ddf11d9c37a114 data/create/advancements/recipes/misc/crafting/logistics/redstone_requester_clear.json 831588b3f29411d5c4b358006051152eb2b23e6b data/create/advancements/recipes/misc/crafting/logistics/stockpile_switch.json +2408cdbac7edb7857223d716e466ed6d16dd50ee data/create/advancements/recipes/misc/crafting/logistics/stock_link.json 972ce787e625ad95588ba1fdd36098173798f198 data/create/advancements/recipes/misc/crafting/logistics/stock_link_clear.json +d4b4da954149a3ab94966639b1fbfb7f3820c3a1 data/create/advancements/recipes/misc/crafting/logistics/stock_ticker.json 1e0fc9f4971286a69d9706006bd8358931382c9c data/create/advancements/recipes/misc/crafting/logistics/stock_ticker_clear.json cb416511a219d2bc5806c6880c01820a8b563b80 data/create/advancements/recipes/misc/crafting/materials/andesite_alloy.json 3b65a04da4e16442bfa8accfe209b7c5342b1db9 data/create/advancements/recipes/misc/crafting/materials/andesite_alloy_block.json @@ -294,6 +306,7 @@ dad85e5945795a3f61f5e6b2bb13c36cf11a3966 data/create/recipes/crafting/appliances b42fe3c262a33657b098b036ae0864af988b9f10 data/create/recipes/crafting/appliances/cardboard_chestplate.json efbfccade226b34d22abb77138dab8726725752e data/create/recipes/crafting/appliances/cardboard_helmet.json 1f49a67c1698a56cfd017a9e89a17c640052e1e3 data/create/recipes/crafting/appliances/cardboard_leggings.json +c063d8143b5f93b258b2e5ce7c8b828af6a49e93 data/create/recipes/crafting/appliances/cardboard_sword.json 66c24da136abee4521d788df83f55b1c224d19fe data/create/recipes/crafting/appliances/clipboard.json 28d1dabd689b855964151100a80247b2ea150bd4 data/create/recipes/crafting/appliances/clipboard_clear.json 97932adf38574c2baf0ed2d5e3d62e7514e0c2bf data/create/recipes/crafting/appliances/copper_backtank.json @@ -329,6 +342,7 @@ ea6479a3cb257bfe0bfaac380973ed068195620e data/create/recipes/crafting/kinetics/a 989bd8580e18c716d588fbf3cf863ea238fffee8 data/create/recipes/crafting/kinetics/brass_door.json a2e433b367baf9df12ced3a99c38940d67450440 data/create/recipes/crafting/kinetics/brass_hand.json 3c7cacaace022bd8b40e92d1e7ce0b371ed822d5 data/create/recipes/crafting/kinetics/cart_assembler.json +06c11a79bfcaf40e93216b84e6e78884f8ca18e3 data/create/recipes/crafting/kinetics/chain_conveyor.json d0ac43c060418f273245316d62b4d87651d76c78 data/create/recipes/crafting/kinetics/chute.json e51a22443987fdddbc7b3e48ca07fd341811f0e9 data/create/recipes/crafting/kinetics/clockwork_bearing.json de55cc506471580096b73c66e14d0d1de2c01f11 data/create/recipes/crafting/kinetics/clutch.json @@ -391,6 +405,7 @@ dfd470b78af59f937893e71b6545e1ef0b05950e data/create/recipes/crafting/kinetics/m 768c1afbd543a11b1b7c029c8c58c9c02c360a19 data/create/recipes/crafting/kinetics/mysterious_cuckoo_clock.json c3463cbc2b2305b5f3ac28950c8deaead6838814 data/create/recipes/crafting/kinetics/nixie_tube.json 8384b63525d3412a00dbc8f4cd61b4f585d67c1d data/create/recipes/crafting/kinetics/nozzle.json +79cb0e11b402636391ce889b02fca1f961c8b317 data/create/recipes/crafting/kinetics/package_filter.json d1cc2faa5dc722f435008ad93e9e27e932607690 data/create/recipes/crafting/kinetics/piston_extension_pole.json a653f85993ea7749beb57c93ebbe29aa2634e2ef data/create/recipes/crafting/kinetics/placard.json 041369b6aaca1cf870f970fd9d505b812f4e3c0b data/create/recipes/crafting/kinetics/portable_fluid_interface.json @@ -438,17 +453,26 @@ e18098af26d3e0d28fb7f2ac49379787384f0d03 data/create/recipes/crafting/logistics/ a24f11d979f40994b9f881b0f49fff5d93185296 data/create/recipes/crafting/logistics/brass_funnel.json d994ef262b16357984d3ed62f6563d2f37266193 data/create/recipes/crafting/logistics/brass_tunnel.json 0b18d9964f2d580eb465cc72208f7a7fdba7b63e data/create/recipes/crafting/logistics/content_observer.json +4f3ce7533d77e5bcab8da815d0fd5d41c95efe4e data/create/recipes/crafting/logistics/desk_bell.json cc837e8b014c121ed9d959baddea134ebf669350 data/create/recipes/crafting/logistics/display_link.json +4daadd2c67fe8bbf5594fb50dcf051dad7f9997a data/create/recipes/crafting/logistics/factory_gauge.json 2fb7722137990b9b9be967a1f766e138678d0573 data/create/recipes/crafting/logistics/factory_gauge_clear.json +f3ba21e8979256fb78cd618ac4f1082b0b2f9e0c data/create/recipes/crafting/logistics/item_hatch.json +38c6236d7ac157a75ac5a98ab9b712eabb0c78c4 data/create/recipes/crafting/logistics/packager.json +6852cb8ff6916981920ab9c987c6e357e9236511 data/create/recipes/crafting/logistics/package_frogport.json dd28b63ceb46a1e9071549c4f8ff32f520c667f6 data/create/recipes/crafting/logistics/powered_latch.json 9ee6e19644928dc78e6f8a5e59f30cd42ac3e454 data/create/recipes/crafting/logistics/powered_toggle_latch.json aa8a704ad643ff5f06db34f4047f7f740a556236 data/create/recipes/crafting/logistics/pulse_extender.json 8b0b342baa18cc47c7a60a3c9812fece28210cf6 data/create/recipes/crafting/logistics/pulse_repeater.json +ade2e66f03bab8843e2dff82b0f04ca92fff956e data/create/recipes/crafting/logistics/pulse_timer.json c81f852f1d1514184ff235e790a6ca907f7b6ad4 data/create/recipes/crafting/logistics/redstone_contact.json 00877e6b56f28d8691080ef18b654f0a141835ce data/create/recipes/crafting/logistics/redstone_link.json +06670fd44389b2b1755c80d02898a68c7c490620 data/create/recipes/crafting/logistics/redstone_requester.json 8446b3ca07575ea978ddde4121900207d54be8b3 data/create/recipes/crafting/logistics/redstone_requester_clear.json eff0d37e98e8badd8d2c3c9de17ee5560b110dbd data/create/recipes/crafting/logistics/stockpile_switch.json +900dc578ab8dd26014cf473f2c5a8b5fbf23ccf8 data/create/recipes/crafting/logistics/stock_link.json e19544e2ef88a4d10f6dc8a3a973793cb00085ba data/create/recipes/crafting/logistics/stock_link_clear.json +d4671c9d3c654aadd3fd238dfaa6939587f8a81b data/create/recipes/crafting/logistics/stock_ticker.json 38aa7b9b3c4724ec8b8d94f00a98d684110ad5ca data/create/recipes/crafting/logistics/stock_ticker_clear.json ac524c110f66a7433208a888c5f3bb69e5e95743 data/create/recipes/crafting/materials/andesite_alloy.json e6bb68a1d2ed5a629c83f5a0eefb843bb890736d data/create/recipes/crafting/materials/andesite_alloy_block.json diff --git a/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 b/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 index bc01caf90a..f7b9a0c89e 100644 --- a/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 +++ b/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 @@ -1,4 +1,4 @@ -// 1.20.1 2024-11-05T20:25:45.1913258 Create's Processing Recipes +// 1.20.1 2024-11-05T22:14:55.5116289 Create's Processing Recipes 3c94326fb730f68c1e44fe1e2ef09c9db6ffd92b data/create/recipes/compacting/andesite_from_flint.json 8d3d5b31f3601b9f681ff710e0545a483a1494c6 data/create/recipes/compacting/blaze_cake.json 8bd7f4e3a686ab520b2d55594d2018d0e9a50c91 data/create/recipes/compacting/chocolate.json @@ -969,7 +969,7 @@ a91dae829938d3f69a7007d3cf8db02b70fe3a7f data/create/recipes/milling/white_tulip 5f1b8a82af091cd4589ecfa5c13a4db6ad9c51b9 data/create/recipes/mixing/andesite_alloy.json 48604c2205b18fe1401eac58d14aa1677cbd9c2b data/create/recipes/mixing/andesite_alloy_from_zinc.json d06c1d0362dccc4e5f8b22f851dc8316b35c06b0 data/create/recipes/mixing/brass_ingot.json -85056d50f7fd86393e2345e678e2497724615d4f data/create/recipes/mixing/cardboard_pulp.json +4a27a38be383bf9561658f8498905eef28ca7ddb data/create/recipes/mixing/cardboard_pulp.json 840a9008d4531425beadfcf224d21e938acc4502 data/create/recipes/mixing/chocolate.json e7b86d4ca5de2df474794424d93b447e5f9dcdc3 data/create/recipes/mixing/chocolate_melting.json 39e832016fa5e360434271505d09ced17a40e7eb data/create/recipes/mixing/compat/ae2/fluix_crystal.json diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/black_postbox.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/black_postbox.json new file mode 100644 index 0000000000..9455f284ae --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/black_postbox.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_barrel": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:barrel" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/black_postbox" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_barrel", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/black_postbox" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/black_postbox_from_other_postbox.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/black_postbox_from_other_postbox.json new file mode 100644 index 0000000000..5770488593 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/black_postbox_from_other_postbox.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_postbox": { + "conditions": { + "items": [ + { + "tag": "create:postboxes" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/black_postbox_from_other_postbox" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_postbox", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/black_postbox_from_other_postbox" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/black_table_cloth.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/black_table_cloth.json new file mode 100644 index 0000000000..94e3684cf2 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/black_table_cloth.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/black_table_cloth" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_wool": { + "conditions": { + "items": [ + { + "tag": "minecraft:wool" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_wool", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/black_table_cloth" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/black_table_cloth_from_other_table_cloth.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/black_table_cloth_from_other_table_cloth.json new file mode 100644 index 0000000000..b81c071e9f --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/black_table_cloth_from_other_table_cloth.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_postbox": { + "conditions": { + "items": [ + { + "tag": "create:dyed_table_cloths" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/black_table_cloth_from_other_table_cloth" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_postbox", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/black_table_cloth_from_other_table_cloth" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/blue_postbox.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/blue_postbox.json new file mode 100644 index 0000000000..323db16066 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/blue_postbox.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_barrel": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:barrel" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/blue_postbox" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_barrel", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/blue_postbox" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/blue_postbox_from_other_postbox.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/blue_postbox_from_other_postbox.json new file mode 100644 index 0000000000..8e6b664448 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/blue_postbox_from_other_postbox.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_postbox": { + "conditions": { + "items": [ + { + "tag": "create:postboxes" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/blue_postbox_from_other_postbox" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_postbox", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/blue_postbox_from_other_postbox" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/blue_table_cloth.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/blue_table_cloth.json new file mode 100644 index 0000000000..4db03d9125 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/blue_table_cloth.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/blue_table_cloth" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_wool": { + "conditions": { + "items": [ + { + "tag": "minecraft:wool" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_wool", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/blue_table_cloth" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/blue_table_cloth_from_other_table_cloth.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/blue_table_cloth_from_other_table_cloth.json new file mode 100644 index 0000000000..aff5b1901f --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/blue_table_cloth_from_other_table_cloth.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_postbox": { + "conditions": { + "items": [ + { + "tag": "create:dyed_table_cloths" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/blue_table_cloth_from_other_table_cloth" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_postbox", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/blue_table_cloth_from_other_table_cloth" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/brown_postbox.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/brown_postbox.json new file mode 100644 index 0000000000..d0004b543c --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/brown_postbox.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_barrel": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:barrel" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/brown_postbox" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_barrel", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/brown_postbox" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/brown_postbox_from_other_postbox.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/brown_postbox_from_other_postbox.json new file mode 100644 index 0000000000..44f4d27789 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/brown_postbox_from_other_postbox.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_postbox": { + "conditions": { + "items": [ + { + "tag": "create:postboxes" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/brown_postbox_from_other_postbox" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_postbox", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/brown_postbox_from_other_postbox" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/brown_table_cloth.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/brown_table_cloth.json new file mode 100644 index 0000000000..32b6d59c26 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/brown_table_cloth.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/brown_table_cloth" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_wool": { + "conditions": { + "items": [ + { + "tag": "minecraft:wool" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_wool", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/brown_table_cloth" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/brown_table_cloth_from_other_table_cloth.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/brown_table_cloth_from_other_table_cloth.json new file mode 100644 index 0000000000..f0c7562da4 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/brown_table_cloth_from_other_table_cloth.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_postbox": { + "conditions": { + "items": [ + { + "tag": "create:dyed_table_cloths" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/brown_table_cloth_from_other_table_cloth" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_postbox", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/brown_table_cloth_from_other_table_cloth" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/cyan_postbox.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/cyan_postbox.json new file mode 100644 index 0000000000..d75be5c56a --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/cyan_postbox.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_barrel": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:barrel" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/cyan_postbox" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_barrel", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/cyan_postbox" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/cyan_postbox_from_other_postbox.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/cyan_postbox_from_other_postbox.json new file mode 100644 index 0000000000..d0daebfd7b --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/cyan_postbox_from_other_postbox.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_postbox": { + "conditions": { + "items": [ + { + "tag": "create:postboxes" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/cyan_postbox_from_other_postbox" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_postbox", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/cyan_postbox_from_other_postbox" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/cyan_table_cloth.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/cyan_table_cloth.json new file mode 100644 index 0000000000..e6158620b3 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/cyan_table_cloth.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/cyan_table_cloth" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_wool": { + "conditions": { + "items": [ + { + "tag": "minecraft:wool" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_wool", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/cyan_table_cloth" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/cyan_table_cloth_from_other_table_cloth.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/cyan_table_cloth_from_other_table_cloth.json new file mode 100644 index 0000000000..860ae51c90 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/cyan_table_cloth_from_other_table_cloth.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_postbox": { + "conditions": { + "items": [ + { + "tag": "create:dyed_table_cloths" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/cyan_table_cloth_from_other_table_cloth" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_postbox", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/cyan_table_cloth_from_other_table_cloth" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/gray_postbox.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/gray_postbox.json new file mode 100644 index 0000000000..e0fe7da1e4 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/gray_postbox.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_barrel": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:barrel" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/gray_postbox" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_barrel", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/gray_postbox" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/gray_postbox_from_other_postbox.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/gray_postbox_from_other_postbox.json new file mode 100644 index 0000000000..64b0408d25 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/gray_postbox_from_other_postbox.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_postbox": { + "conditions": { + "items": [ + { + "tag": "create:postboxes" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/gray_postbox_from_other_postbox" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_postbox", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/gray_postbox_from_other_postbox" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/gray_table_cloth.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/gray_table_cloth.json new file mode 100644 index 0000000000..0d861b32fb --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/gray_table_cloth.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/gray_table_cloth" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_wool": { + "conditions": { + "items": [ + { + "tag": "minecraft:wool" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_wool", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/gray_table_cloth" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/gray_table_cloth_from_other_table_cloth.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/gray_table_cloth_from_other_table_cloth.json new file mode 100644 index 0000000000..5b52243471 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/gray_table_cloth_from_other_table_cloth.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_postbox": { + "conditions": { + "items": [ + { + "tag": "create:dyed_table_cloths" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/gray_table_cloth_from_other_table_cloth" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_postbox", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/gray_table_cloth_from_other_table_cloth" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/green_postbox.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/green_postbox.json new file mode 100644 index 0000000000..8a2872fd28 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/green_postbox.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_barrel": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:barrel" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/green_postbox" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_barrel", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/green_postbox" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/green_postbox_from_other_postbox.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/green_postbox_from_other_postbox.json new file mode 100644 index 0000000000..d4a7136535 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/green_postbox_from_other_postbox.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_postbox": { + "conditions": { + "items": [ + { + "tag": "create:postboxes" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/green_postbox_from_other_postbox" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_postbox", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/green_postbox_from_other_postbox" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/green_table_cloth.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/green_table_cloth.json new file mode 100644 index 0000000000..45c71516a4 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/green_table_cloth.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/green_table_cloth" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_wool": { + "conditions": { + "items": [ + { + "tag": "minecraft:wool" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_wool", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/green_table_cloth" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/green_table_cloth_from_other_table_cloth.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/green_table_cloth_from_other_table_cloth.json new file mode 100644 index 0000000000..d926c70dcd --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/green_table_cloth_from_other_table_cloth.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_postbox": { + "conditions": { + "items": [ + { + "tag": "create:dyed_table_cloths" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/green_table_cloth_from_other_table_cloth" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_postbox", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/green_table_cloth_from_other_table_cloth" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/light_blue_postbox.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/light_blue_postbox.json new file mode 100644 index 0000000000..d8c8cddfaf --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/light_blue_postbox.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_barrel": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:barrel" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/light_blue_postbox" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_barrel", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/light_blue_postbox" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/light_blue_postbox_from_other_postbox.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/light_blue_postbox_from_other_postbox.json new file mode 100644 index 0000000000..617aa273b8 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/light_blue_postbox_from_other_postbox.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_postbox": { + "conditions": { + "items": [ + { + "tag": "create:postboxes" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/light_blue_postbox_from_other_postbox" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_postbox", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/light_blue_postbox_from_other_postbox" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/light_blue_table_cloth.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/light_blue_table_cloth.json new file mode 100644 index 0000000000..1572eb7842 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/light_blue_table_cloth.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/light_blue_table_cloth" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_wool": { + "conditions": { + "items": [ + { + "tag": "minecraft:wool" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_wool", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/light_blue_table_cloth" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/light_blue_table_cloth_from_other_table_cloth.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/light_blue_table_cloth_from_other_table_cloth.json new file mode 100644 index 0000000000..816bd6116e --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/light_blue_table_cloth_from_other_table_cloth.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_postbox": { + "conditions": { + "items": [ + { + "tag": "create:dyed_table_cloths" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/light_blue_table_cloth_from_other_table_cloth" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_postbox", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/light_blue_table_cloth_from_other_table_cloth" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/light_gray_postbox.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/light_gray_postbox.json new file mode 100644 index 0000000000..39666afab0 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/light_gray_postbox.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_barrel": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:barrel" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/light_gray_postbox" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_barrel", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/light_gray_postbox" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/light_gray_postbox_from_other_postbox.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/light_gray_postbox_from_other_postbox.json new file mode 100644 index 0000000000..1e87b3ca98 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/light_gray_postbox_from_other_postbox.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_postbox": { + "conditions": { + "items": [ + { + "tag": "create:postboxes" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/light_gray_postbox_from_other_postbox" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_postbox", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/light_gray_postbox_from_other_postbox" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/light_gray_table_cloth.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/light_gray_table_cloth.json new file mode 100644 index 0000000000..66b9b258a2 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/light_gray_table_cloth.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/light_gray_table_cloth" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_wool": { + "conditions": { + "items": [ + { + "tag": "minecraft:wool" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_wool", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/light_gray_table_cloth" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/light_gray_table_cloth_from_other_table_cloth.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/light_gray_table_cloth_from_other_table_cloth.json new file mode 100644 index 0000000000..4e7a9322c9 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/light_gray_table_cloth_from_other_table_cloth.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_postbox": { + "conditions": { + "items": [ + { + "tag": "create:dyed_table_cloths" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/light_gray_table_cloth_from_other_table_cloth" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_postbox", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/light_gray_table_cloth_from_other_table_cloth" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/lime_postbox.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/lime_postbox.json new file mode 100644 index 0000000000..9839e8cc00 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/lime_postbox.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_barrel": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:barrel" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/lime_postbox" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_barrel", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/lime_postbox" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/lime_postbox_from_other_postbox.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/lime_postbox_from_other_postbox.json new file mode 100644 index 0000000000..e0dcf1f083 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/lime_postbox_from_other_postbox.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_postbox": { + "conditions": { + "items": [ + { + "tag": "create:postboxes" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/lime_postbox_from_other_postbox" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_postbox", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/lime_postbox_from_other_postbox" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/lime_table_cloth.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/lime_table_cloth.json new file mode 100644 index 0000000000..93d5783ed0 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/lime_table_cloth.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/lime_table_cloth" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_wool": { + "conditions": { + "items": [ + { + "tag": "minecraft:wool" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_wool", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/lime_table_cloth" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/lime_table_cloth_from_other_table_cloth.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/lime_table_cloth_from_other_table_cloth.json new file mode 100644 index 0000000000..60f3afa997 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/lime_table_cloth_from_other_table_cloth.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_postbox": { + "conditions": { + "items": [ + { + "tag": "create:dyed_table_cloths" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/lime_table_cloth_from_other_table_cloth" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_postbox", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/lime_table_cloth_from_other_table_cloth" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/magenta_postbox.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/magenta_postbox.json new file mode 100644 index 0000000000..91a28b4532 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/magenta_postbox.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_barrel": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:barrel" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/magenta_postbox" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_barrel", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/magenta_postbox" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/magenta_postbox_from_other_postbox.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/magenta_postbox_from_other_postbox.json new file mode 100644 index 0000000000..eac643a415 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/magenta_postbox_from_other_postbox.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_postbox": { + "conditions": { + "items": [ + { + "tag": "create:postboxes" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/magenta_postbox_from_other_postbox" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_postbox", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/magenta_postbox_from_other_postbox" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/magenta_table_cloth.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/magenta_table_cloth.json new file mode 100644 index 0000000000..10d4a9c9a1 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/magenta_table_cloth.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/magenta_table_cloth" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_wool": { + "conditions": { + "items": [ + { + "tag": "minecraft:wool" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_wool", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/magenta_table_cloth" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/magenta_table_cloth_from_other_table_cloth.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/magenta_table_cloth_from_other_table_cloth.json new file mode 100644 index 0000000000..8cb0ad152d --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/magenta_table_cloth_from_other_table_cloth.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_postbox": { + "conditions": { + "items": [ + { + "tag": "create:dyed_table_cloths" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/magenta_table_cloth_from_other_table_cloth" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_postbox", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/magenta_table_cloth_from_other_table_cloth" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/orange_postbox.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/orange_postbox.json new file mode 100644 index 0000000000..ba16928747 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/orange_postbox.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_barrel": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:barrel" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/orange_postbox" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_barrel", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/orange_postbox" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/orange_postbox_from_other_postbox.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/orange_postbox_from_other_postbox.json new file mode 100644 index 0000000000..0e68c5682f --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/orange_postbox_from_other_postbox.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_postbox": { + "conditions": { + "items": [ + { + "tag": "create:postboxes" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/orange_postbox_from_other_postbox" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_postbox", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/orange_postbox_from_other_postbox" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/orange_table_cloth.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/orange_table_cloth.json new file mode 100644 index 0000000000..da4c9251a7 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/orange_table_cloth.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/orange_table_cloth" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_wool": { + "conditions": { + "items": [ + { + "tag": "minecraft:wool" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_wool", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/orange_table_cloth" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/orange_table_cloth_from_other_table_cloth.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/orange_table_cloth_from_other_table_cloth.json new file mode 100644 index 0000000000..dadec6a3e2 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/orange_table_cloth_from_other_table_cloth.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_postbox": { + "conditions": { + "items": [ + { + "tag": "create:dyed_table_cloths" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/orange_table_cloth_from_other_table_cloth" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_postbox", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/orange_table_cloth_from_other_table_cloth" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/pink_postbox.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/pink_postbox.json new file mode 100644 index 0000000000..1287653c1c --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/pink_postbox.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_barrel": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:barrel" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/pink_postbox" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_barrel", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/pink_postbox" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/pink_postbox_from_other_postbox.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/pink_postbox_from_other_postbox.json new file mode 100644 index 0000000000..9f23ccc8a8 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/pink_postbox_from_other_postbox.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_postbox": { + "conditions": { + "items": [ + { + "tag": "create:postboxes" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/pink_postbox_from_other_postbox" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_postbox", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/pink_postbox_from_other_postbox" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/pink_table_cloth.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/pink_table_cloth.json new file mode 100644 index 0000000000..3ae9169d7f --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/pink_table_cloth.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/pink_table_cloth" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_wool": { + "conditions": { + "items": [ + { + "tag": "minecraft:wool" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_wool", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/pink_table_cloth" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/pink_table_cloth_from_other_table_cloth.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/pink_table_cloth_from_other_table_cloth.json new file mode 100644 index 0000000000..5b918b9d90 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/pink_table_cloth_from_other_table_cloth.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_postbox": { + "conditions": { + "items": [ + { + "tag": "create:dyed_table_cloths" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/pink_table_cloth_from_other_table_cloth" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_postbox", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/pink_table_cloth_from_other_table_cloth" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/purple_postbox.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/purple_postbox.json new file mode 100644 index 0000000000..6de1c644bc --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/purple_postbox.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_barrel": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:barrel" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/purple_postbox" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_barrel", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/purple_postbox" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/purple_postbox_from_other_postbox.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/purple_postbox_from_other_postbox.json new file mode 100644 index 0000000000..47e29f4f00 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/purple_postbox_from_other_postbox.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_postbox": { + "conditions": { + "items": [ + { + "tag": "create:postboxes" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/purple_postbox_from_other_postbox" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_postbox", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/purple_postbox_from_other_postbox" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/purple_table_cloth.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/purple_table_cloth.json new file mode 100644 index 0000000000..8bbf544db4 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/purple_table_cloth.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/purple_table_cloth" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_wool": { + "conditions": { + "items": [ + { + "tag": "minecraft:wool" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_wool", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/purple_table_cloth" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/purple_table_cloth_from_other_table_cloth.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/purple_table_cloth_from_other_table_cloth.json new file mode 100644 index 0000000000..bb546cec12 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/purple_table_cloth_from_other_table_cloth.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_postbox": { + "conditions": { + "items": [ + { + "tag": "create:dyed_table_cloths" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/purple_table_cloth_from_other_table_cloth" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_postbox", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/purple_table_cloth_from_other_table_cloth" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/red_postbox.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/red_postbox.json new file mode 100644 index 0000000000..647c481081 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/red_postbox.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_barrel": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:barrel" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/red_postbox" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_barrel", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/red_postbox" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/red_postbox_from_other_postbox.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/red_postbox_from_other_postbox.json new file mode 100644 index 0000000000..59feffbe43 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/red_postbox_from_other_postbox.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_postbox": { + "conditions": { + "items": [ + { + "tag": "create:postboxes" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/red_postbox_from_other_postbox" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_postbox", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/red_postbox_from_other_postbox" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/red_table_cloth.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/red_table_cloth.json new file mode 100644 index 0000000000..cb55224528 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/red_table_cloth.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/red_table_cloth" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_wool": { + "conditions": { + "items": [ + { + "tag": "minecraft:wool" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_wool", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/red_table_cloth" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/red_table_cloth_from_other_table_cloth.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/red_table_cloth_from_other_table_cloth.json new file mode 100644 index 0000000000..90203767fa --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/red_table_cloth_from_other_table_cloth.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_postbox": { + "conditions": { + "items": [ + { + "tag": "create:dyed_table_cloths" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/red_table_cloth_from_other_table_cloth" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_postbox", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/red_table_cloth_from_other_table_cloth" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/white_postbox.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/white_postbox.json new file mode 100644 index 0000000000..8319328f74 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/white_postbox.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_barrel": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:barrel" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/white_postbox" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_barrel", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/white_postbox" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/white_postbox_from_other_postbox.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/white_postbox_from_other_postbox.json new file mode 100644 index 0000000000..8cc0bb2ea7 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/white_postbox_from_other_postbox.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_postbox": { + "conditions": { + "items": [ + { + "tag": "create:postboxes" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/white_postbox_from_other_postbox" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_postbox", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/white_postbox_from_other_postbox" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/white_table_cloth.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/white_table_cloth.json new file mode 100644 index 0000000000..00424338b8 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/white_table_cloth.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/white_table_cloth" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_wool": { + "conditions": { + "items": [ + { + "tag": "minecraft:wool" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_wool", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/white_table_cloth" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/white_table_cloth_from_other_table_cloth.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/white_table_cloth_from_other_table_cloth.json new file mode 100644 index 0000000000..ee94fc5f33 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/white_table_cloth_from_other_table_cloth.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_postbox": { + "conditions": { + "items": [ + { + "tag": "create:dyed_table_cloths" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/white_table_cloth_from_other_table_cloth" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_postbox", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/white_table_cloth_from_other_table_cloth" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/yellow_postbox.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/yellow_postbox.json new file mode 100644 index 0000000000..1b04dd3c03 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/yellow_postbox.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_barrel": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:barrel" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/yellow_postbox" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_barrel", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/yellow_postbox" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/yellow_postbox_from_other_postbox.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/yellow_postbox_from_other_postbox.json new file mode 100644 index 0000000000..d7ec15bf68 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/yellow_postbox_from_other_postbox.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_postbox": { + "conditions": { + "items": [ + { + "tag": "create:postboxes" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/yellow_postbox_from_other_postbox" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_postbox", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/yellow_postbox_from_other_postbox" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/yellow_table_cloth.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/yellow_table_cloth.json new file mode 100644 index 0000000000..0eb1f4b163 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/yellow_table_cloth.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/yellow_table_cloth" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_wool": { + "conditions": { + "items": [ + { + "tag": "minecraft:wool" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_wool", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/yellow_table_cloth" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/yellow_table_cloth_from_other_table_cloth.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/yellow_table_cloth_from_other_table_cloth.json new file mode 100644 index 0000000000..a0661931dc --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/crafting/logistics/yellow_table_cloth_from_other_table_cloth.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_postbox": { + "conditions": { + "items": [ + { + "tag": "create:dyed_table_cloths" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/yellow_table_cloth_from_other_table_cloth" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_postbox", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/yellow_table_cloth_from_other_table_cloth" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/decorations/andesite_table_cloth_from_andesite_alloy_stonecutting.json b/src/generated/resources/data/create/advancements/recipes/decorations/andesite_table_cloth_from_andesite_alloy_stonecutting.json new file mode 100644 index 0000000000..cd9c833117 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/decorations/andesite_table_cloth_from_andesite_alloy_stonecutting.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_andesite_alloy": { + "conditions": { + "items": [ + { + "items": [ + "create:andesite_alloy" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:andesite_table_cloth_from_andesite_alloy_stonecutting" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_andesite_alloy", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:andesite_table_cloth_from_andesite_alloy_stonecutting" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/decorations/brass_table_cloth_from_ingots_brass_stonecutting.json b/src/generated/resources/data/create/advancements/recipes/decorations/brass_table_cloth_from_ingots_brass_stonecutting.json new file mode 100644 index 0000000000..476021814c --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/decorations/brass_table_cloth_from_ingots_brass_stonecutting.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_ingots_brass": { + "conditions": { + "items": [ + { + "tag": "forge:ingots/brass" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:brass_table_cloth_from_ingots_brass_stonecutting" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_ingots_brass", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:brass_table_cloth_from_ingots_brass_stonecutting" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/decorations/copper_table_cloth_from_ingots_copper_stonecutting.json b/src/generated/resources/data/create/advancements/recipes/decorations/copper_table_cloth_from_ingots_copper_stonecutting.json new file mode 100644 index 0000000000..cc3060eda4 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/decorations/copper_table_cloth_from_ingots_copper_stonecutting.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_ingots_copper": { + "conditions": { + "items": [ + { + "tag": "forge:ingots/copper" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:copper_table_cloth_from_ingots_copper_stonecutting" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_ingots_copper", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:copper_table_cloth_from_ingots_copper_stonecutting" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/appliances/cardboard_sword.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/appliances/cardboard_sword.json new file mode 100644 index 0000000000..2a69134ba1 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/appliances/cardboard_sword.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "create:cardboard" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/appliances/cardboard_sword" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/appliances/cardboard_sword" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/chain_conveyor.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/chain_conveyor.json new file mode 100644 index 0000000000..e794c42efa --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/chain_conveyor.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "create:andesite_casing" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/kinetics/chain_conveyor" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/kinetics/chain_conveyor" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/package_filter.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/package_filter.json new file mode 100644 index 0000000000..77f4083f7a --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/package_filter.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "tag": "forge:ingots/zinc" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/kinetics/package_filter" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/kinetics/package_filter" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/desk_bell.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/desk_bell.json new file mode 100644 index 0000000000..368f5ce2f2 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/desk_bell.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "create:andesite_casing" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/desk_bell" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/desk_bell" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/factory_gauge.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/factory_gauge.json new file mode 100644 index 0000000000..09ad4ad72e --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/factory_gauge.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "create:stock_link" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/factory_gauge" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/factory_gauge" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/item_hatch.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/item_hatch.json new file mode 100644 index 0000000000..a50e5e1ebf --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/item_hatch.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "create:andesite_alloy" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/item_hatch" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/item_hatch" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/package_frogport.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/package_frogport.json new file mode 100644 index 0000000000..c19e60c9c0 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/package_frogport.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "create:cardboard" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/package_frogport" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/package_frogport" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/packager.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/packager.json new file mode 100644 index 0000000000..e8489b071a --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/packager.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "create:cardboard" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/packager" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/packager" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/pulse_timer.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/pulse_timer.json new file mode 100644 index 0000000000..4c373171a0 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/pulse_timer.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "tag": "forge:dusts/redstone" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/pulse_timer" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/pulse_timer" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/redstone_requester.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/redstone_requester.json new file mode 100644 index 0000000000..d493e3f614 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/redstone_requester.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "create:cardboard" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/redstone_requester" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/redstone_requester" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/stock_link.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/stock_link.json new file mode 100644 index 0000000000..690e33a489 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/stock_link.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "create:cardboard" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/stock_link" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/stock_link" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/stock_ticker.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/stock_ticker.json new file mode 100644 index 0000000000..0e873c2ae6 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/stock_ticker.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "create:cardboard" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/stock_ticker" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/stock_ticker" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/andesite_table_cloth_from_andesite_alloy_stonecutting.json b/src/generated/resources/data/create/recipes/andesite_table_cloth_from_andesite_alloy_stonecutting.json new file mode 100644 index 0000000000..01d9083f3e --- /dev/null +++ b/src/generated/resources/data/create/recipes/andesite_table_cloth_from_andesite_alloy_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 2, + "ingredient": { + "item": "create:andesite_alloy" + }, + "result": "create:andesite_table_cloth" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/brass_table_cloth_from_ingots_brass_stonecutting.json b/src/generated/resources/data/create/recipes/brass_table_cloth_from_ingots_brass_stonecutting.json new file mode 100644 index 0000000000..5953f95720 --- /dev/null +++ b/src/generated/resources/data/create/recipes/brass_table_cloth_from_ingots_brass_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 2, + "ingredient": { + "tag": "forge:ingots/brass" + }, + "result": "create:brass_table_cloth" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/copper_table_cloth_from_ingots_copper_stonecutting.json b/src/generated/resources/data/create/recipes/copper_table_cloth_from_ingots_copper_stonecutting.json new file mode 100644 index 0000000000..868b7ddac8 --- /dev/null +++ b/src/generated/resources/data/create/recipes/copper_table_cloth_from_ingots_copper_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 2, + "ingredient": { + "tag": "forge:ingots/copper" + }, + "result": "create:copper_table_cloth" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/appliances/cardboard_sword.json b/src/generated/resources/data/create/recipes/crafting/appliances/cardboard_sword.json new file mode 100644 index 0000000000..9bab6b2faa --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/appliances/cardboard_sword.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "P": { + "item": "create:cardboard" + }, + "S": { + "tag": "forge:rods/wooden" + } + }, + "pattern": [ + "P", + "P", + "S" + ], + "result": { + "item": "create:cardboard_sword" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/chain_conveyor.json b/src/generated/resources/data/create/recipes/crafting/kinetics/chain_conveyor.json new file mode 100644 index 0000000000..2e3e3d9099 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/chain_conveyor.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "A": { + "item": "create:large_cogwheel" + }, + "C": { + "item": "create:andesite_casing" + } + }, + "pattern": [ + " C ", + "CAC", + " C " + ], + "result": { + "count": 2, + "item": "create:chain_conveyor" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/package_filter.json b/src/generated/resources/data/create/recipes/crafting/kinetics/package_filter.json new file mode 100644 index 0000000000..d87d953a39 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/package_filter.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "A": { + "tag": "forge:nuggets/zinc" + }, + "S": { + "tag": "minecraft:wool" + } + }, + "pattern": [ + "ASA" + ], + "result": { + "item": "create:package_filter" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/black_postbox.json b/src/generated/resources/data/create/recipes/crafting/logistics/black_postbox.json new file mode 100644 index 0000000000..ffce897af1 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/black_postbox.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "A": { + "item": "create:andesite_alloy" + }, + "B": { + "item": "minecraft:barrel" + }, + "D": { + "tag": "forge:dyes/black" + } + }, + "pattern": [ + "D", + "B", + "A" + ], + "result": { + "item": "create:black_postbox" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/black_postbox_from_other_postbox.json b/src/generated/resources/data/create/recipes/crafting/logistics/black_postbox_from_other_postbox.json new file mode 100644 index 0000000000..4f035cfc6a --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/black_postbox_from_other_postbox.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "tag": "forge:dyes/black" + }, + { + "tag": "create:postboxes" + } + ], + "result": { + "item": "create:black_postbox" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/black_table_cloth.json b/src/generated/resources/data/create/recipes/crafting/logistics/black_table_cloth.json new file mode 100644 index 0000000000..d38d7e9257 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/black_table_cloth.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "minecraft:black_wool" + }, + { + "item": "create:andesite_alloy" + } + ], + "result": { + "count": 2, + "item": "create:black_table_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/black_table_cloth_from_other_table_cloth.json b/src/generated/resources/data/create/recipes/crafting/logistics/black_table_cloth_from_other_table_cloth.json new file mode 100644 index 0000000000..cea95f2e43 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/black_table_cloth_from_other_table_cloth.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "tag": "forge:dyes/black" + }, + { + "tag": "create:dyed_table_cloths" + } + ], + "result": { + "item": "create:black_table_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/blue_postbox.json b/src/generated/resources/data/create/recipes/crafting/logistics/blue_postbox.json new file mode 100644 index 0000000000..761fa1d4bb --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/blue_postbox.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "A": { + "item": "create:andesite_alloy" + }, + "B": { + "item": "minecraft:barrel" + }, + "D": { + "tag": "forge:dyes/blue" + } + }, + "pattern": [ + "D", + "B", + "A" + ], + "result": { + "item": "create:blue_postbox" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/blue_postbox_from_other_postbox.json b/src/generated/resources/data/create/recipes/crafting/logistics/blue_postbox_from_other_postbox.json new file mode 100644 index 0000000000..4948ec4fb7 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/blue_postbox_from_other_postbox.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "tag": "forge:dyes/blue" + }, + { + "tag": "create:postboxes" + } + ], + "result": { + "item": "create:blue_postbox" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/blue_table_cloth.json b/src/generated/resources/data/create/recipes/crafting/logistics/blue_table_cloth.json new file mode 100644 index 0000000000..93adf3511c --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/blue_table_cloth.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "minecraft:blue_wool" + }, + { + "item": "create:andesite_alloy" + } + ], + "result": { + "count": 2, + "item": "create:blue_table_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/blue_table_cloth_from_other_table_cloth.json b/src/generated/resources/data/create/recipes/crafting/logistics/blue_table_cloth_from_other_table_cloth.json new file mode 100644 index 0000000000..0a3e3131b3 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/blue_table_cloth_from_other_table_cloth.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "tag": "forge:dyes/blue" + }, + { + "tag": "create:dyed_table_cloths" + } + ], + "result": { + "item": "create:blue_table_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/brown_postbox.json b/src/generated/resources/data/create/recipes/crafting/logistics/brown_postbox.json new file mode 100644 index 0000000000..4b99a08c94 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/brown_postbox.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "A": { + "item": "create:andesite_alloy" + }, + "B": { + "item": "minecraft:barrel" + }, + "D": { + "tag": "forge:dyes/brown" + } + }, + "pattern": [ + "D", + "B", + "A" + ], + "result": { + "item": "create:brown_postbox" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/brown_postbox_from_other_postbox.json b/src/generated/resources/data/create/recipes/crafting/logistics/brown_postbox_from_other_postbox.json new file mode 100644 index 0000000000..72a84beab9 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/brown_postbox_from_other_postbox.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "tag": "forge:dyes/brown" + }, + { + "tag": "create:postboxes" + } + ], + "result": { + "item": "create:brown_postbox" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/brown_table_cloth.json b/src/generated/resources/data/create/recipes/crafting/logistics/brown_table_cloth.json new file mode 100644 index 0000000000..86519c9865 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/brown_table_cloth.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "minecraft:brown_wool" + }, + { + "item": "create:andesite_alloy" + } + ], + "result": { + "count": 2, + "item": "create:brown_table_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/brown_table_cloth_from_other_table_cloth.json b/src/generated/resources/data/create/recipes/crafting/logistics/brown_table_cloth_from_other_table_cloth.json new file mode 100644 index 0000000000..196afdd360 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/brown_table_cloth_from_other_table_cloth.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "tag": "forge:dyes/brown" + }, + { + "tag": "create:dyed_table_cloths" + } + ], + "result": { + "item": "create:brown_table_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/cyan_postbox.json b/src/generated/resources/data/create/recipes/crafting/logistics/cyan_postbox.json new file mode 100644 index 0000000000..28e498e393 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/cyan_postbox.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "A": { + "item": "create:andesite_alloy" + }, + "B": { + "item": "minecraft:barrel" + }, + "D": { + "tag": "forge:dyes/cyan" + } + }, + "pattern": [ + "D", + "B", + "A" + ], + "result": { + "item": "create:cyan_postbox" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/cyan_postbox_from_other_postbox.json b/src/generated/resources/data/create/recipes/crafting/logistics/cyan_postbox_from_other_postbox.json new file mode 100644 index 0000000000..2d8f0948be --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/cyan_postbox_from_other_postbox.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "tag": "forge:dyes/cyan" + }, + { + "tag": "create:postboxes" + } + ], + "result": { + "item": "create:cyan_postbox" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/cyan_table_cloth.json b/src/generated/resources/data/create/recipes/crafting/logistics/cyan_table_cloth.json new file mode 100644 index 0000000000..fadf7feb36 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/cyan_table_cloth.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "minecraft:cyan_wool" + }, + { + "item": "create:andesite_alloy" + } + ], + "result": { + "count": 2, + "item": "create:cyan_table_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/cyan_table_cloth_from_other_table_cloth.json b/src/generated/resources/data/create/recipes/crafting/logistics/cyan_table_cloth_from_other_table_cloth.json new file mode 100644 index 0000000000..15e0877f1d --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/cyan_table_cloth_from_other_table_cloth.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "tag": "forge:dyes/cyan" + }, + { + "tag": "create:dyed_table_cloths" + } + ], + "result": { + "item": "create:cyan_table_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/desk_bell.json b/src/generated/resources/data/create/recipes/crafting/logistics/desk_bell.json new file mode 100644 index 0000000000..50dd659c6f --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/desk_bell.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "create:andesite_casing" + }, + { + "tag": "forge:plates/gold" + } + ], + "result": { + "item": "create:desk_bell" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/factory_gauge.json b/src/generated/resources/data/create/recipes/crafting/logistics/factory_gauge.json new file mode 100644 index 0000000000..3b322bb65a --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/factory_gauge.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "create:stock_link" + }, + { + "item": "create:precision_mechanism" + } + ], + "result": { + "count": 2, + "item": "create:factory_gauge" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/gray_postbox.json b/src/generated/resources/data/create/recipes/crafting/logistics/gray_postbox.json new file mode 100644 index 0000000000..6051a24b72 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/gray_postbox.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "A": { + "item": "create:andesite_alloy" + }, + "B": { + "item": "minecraft:barrel" + }, + "D": { + "tag": "forge:dyes/gray" + } + }, + "pattern": [ + "D", + "B", + "A" + ], + "result": { + "item": "create:gray_postbox" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/gray_postbox_from_other_postbox.json b/src/generated/resources/data/create/recipes/crafting/logistics/gray_postbox_from_other_postbox.json new file mode 100644 index 0000000000..a360c12759 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/gray_postbox_from_other_postbox.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "tag": "forge:dyes/gray" + }, + { + "tag": "create:postboxes" + } + ], + "result": { + "item": "create:gray_postbox" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/gray_table_cloth.json b/src/generated/resources/data/create/recipes/crafting/logistics/gray_table_cloth.json new file mode 100644 index 0000000000..86a484fe1c --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/gray_table_cloth.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "minecraft:gray_wool" + }, + { + "item": "create:andesite_alloy" + } + ], + "result": { + "count": 2, + "item": "create:gray_table_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/gray_table_cloth_from_other_table_cloth.json b/src/generated/resources/data/create/recipes/crafting/logistics/gray_table_cloth_from_other_table_cloth.json new file mode 100644 index 0000000000..ddb17f2877 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/gray_table_cloth_from_other_table_cloth.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "tag": "forge:dyes/gray" + }, + { + "tag": "create:dyed_table_cloths" + } + ], + "result": { + "item": "create:gray_table_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/green_postbox.json b/src/generated/resources/data/create/recipes/crafting/logistics/green_postbox.json new file mode 100644 index 0000000000..78610f80cf --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/green_postbox.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "A": { + "item": "create:andesite_alloy" + }, + "B": { + "item": "minecraft:barrel" + }, + "D": { + "tag": "forge:dyes/green" + } + }, + "pattern": [ + "D", + "B", + "A" + ], + "result": { + "item": "create:green_postbox" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/green_postbox_from_other_postbox.json b/src/generated/resources/data/create/recipes/crafting/logistics/green_postbox_from_other_postbox.json new file mode 100644 index 0000000000..2de4f3edc7 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/green_postbox_from_other_postbox.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "tag": "forge:dyes/green" + }, + { + "tag": "create:postboxes" + } + ], + "result": { + "item": "create:green_postbox" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/green_table_cloth.json b/src/generated/resources/data/create/recipes/crafting/logistics/green_table_cloth.json new file mode 100644 index 0000000000..bf535b5f7e --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/green_table_cloth.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "minecraft:green_wool" + }, + { + "item": "create:andesite_alloy" + } + ], + "result": { + "count": 2, + "item": "create:green_table_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/green_table_cloth_from_other_table_cloth.json b/src/generated/resources/data/create/recipes/crafting/logistics/green_table_cloth_from_other_table_cloth.json new file mode 100644 index 0000000000..eade701d34 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/green_table_cloth_from_other_table_cloth.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "tag": "forge:dyes/green" + }, + { + "tag": "create:dyed_table_cloths" + } + ], + "result": { + "item": "create:green_table_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/item_hatch.json b/src/generated/resources/data/create/recipes/crafting/logistics/item_hatch.json new file mode 100644 index 0000000000..e8551b281f --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/item_hatch.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "create:andesite_alloy" + }, + { + "item": "minecraft:iron_trapdoor" + } + ], + "result": { + "item": "create:item_hatch" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/light_blue_postbox.json b/src/generated/resources/data/create/recipes/crafting/logistics/light_blue_postbox.json new file mode 100644 index 0000000000..1f7dbded3e --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/light_blue_postbox.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "A": { + "item": "create:andesite_alloy" + }, + "B": { + "item": "minecraft:barrel" + }, + "D": { + "tag": "forge:dyes/light_blue" + } + }, + "pattern": [ + "D", + "B", + "A" + ], + "result": { + "item": "create:light_blue_postbox" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/light_blue_postbox_from_other_postbox.json b/src/generated/resources/data/create/recipes/crafting/logistics/light_blue_postbox_from_other_postbox.json new file mode 100644 index 0000000000..8873226dc6 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/light_blue_postbox_from_other_postbox.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "tag": "forge:dyes/light_blue" + }, + { + "tag": "create:postboxes" + } + ], + "result": { + "item": "create:light_blue_postbox" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/light_blue_table_cloth.json b/src/generated/resources/data/create/recipes/crafting/logistics/light_blue_table_cloth.json new file mode 100644 index 0000000000..c4724abc94 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/light_blue_table_cloth.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "minecraft:light_blue_wool" + }, + { + "item": "create:andesite_alloy" + } + ], + "result": { + "count": 2, + "item": "create:light_blue_table_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/light_blue_table_cloth_from_other_table_cloth.json b/src/generated/resources/data/create/recipes/crafting/logistics/light_blue_table_cloth_from_other_table_cloth.json new file mode 100644 index 0000000000..70f2f233ca --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/light_blue_table_cloth_from_other_table_cloth.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "tag": "forge:dyes/light_blue" + }, + { + "tag": "create:dyed_table_cloths" + } + ], + "result": { + "item": "create:light_blue_table_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/light_gray_postbox.json b/src/generated/resources/data/create/recipes/crafting/logistics/light_gray_postbox.json new file mode 100644 index 0000000000..7f6cd8b075 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/light_gray_postbox.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "A": { + "item": "create:andesite_alloy" + }, + "B": { + "item": "minecraft:barrel" + }, + "D": { + "tag": "forge:dyes/light_gray" + } + }, + "pattern": [ + "D", + "B", + "A" + ], + "result": { + "item": "create:light_gray_postbox" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/light_gray_postbox_from_other_postbox.json b/src/generated/resources/data/create/recipes/crafting/logistics/light_gray_postbox_from_other_postbox.json new file mode 100644 index 0000000000..3c557a9de5 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/light_gray_postbox_from_other_postbox.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "tag": "forge:dyes/light_gray" + }, + { + "tag": "create:postboxes" + } + ], + "result": { + "item": "create:light_gray_postbox" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/light_gray_table_cloth.json b/src/generated/resources/data/create/recipes/crafting/logistics/light_gray_table_cloth.json new file mode 100644 index 0000000000..6f661b8e5e --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/light_gray_table_cloth.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "minecraft:light_gray_wool" + }, + { + "item": "create:andesite_alloy" + } + ], + "result": { + "count": 2, + "item": "create:light_gray_table_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/light_gray_table_cloth_from_other_table_cloth.json b/src/generated/resources/data/create/recipes/crafting/logistics/light_gray_table_cloth_from_other_table_cloth.json new file mode 100644 index 0000000000..14bc7acf4a --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/light_gray_table_cloth_from_other_table_cloth.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "tag": "forge:dyes/light_gray" + }, + { + "tag": "create:dyed_table_cloths" + } + ], + "result": { + "item": "create:light_gray_table_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/lime_postbox.json b/src/generated/resources/data/create/recipes/crafting/logistics/lime_postbox.json new file mode 100644 index 0000000000..fcc3b9a8c1 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/lime_postbox.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "A": { + "item": "create:andesite_alloy" + }, + "B": { + "item": "minecraft:barrel" + }, + "D": { + "tag": "forge:dyes/lime" + } + }, + "pattern": [ + "D", + "B", + "A" + ], + "result": { + "item": "create:lime_postbox" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/lime_postbox_from_other_postbox.json b/src/generated/resources/data/create/recipes/crafting/logistics/lime_postbox_from_other_postbox.json new file mode 100644 index 0000000000..0cf86b05f8 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/lime_postbox_from_other_postbox.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "tag": "forge:dyes/lime" + }, + { + "tag": "create:postboxes" + } + ], + "result": { + "item": "create:lime_postbox" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/lime_table_cloth.json b/src/generated/resources/data/create/recipes/crafting/logistics/lime_table_cloth.json new file mode 100644 index 0000000000..1fc64203d4 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/lime_table_cloth.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "minecraft:lime_wool" + }, + { + "item": "create:andesite_alloy" + } + ], + "result": { + "count": 2, + "item": "create:lime_table_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/lime_table_cloth_from_other_table_cloth.json b/src/generated/resources/data/create/recipes/crafting/logistics/lime_table_cloth_from_other_table_cloth.json new file mode 100644 index 0000000000..9468e4d977 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/lime_table_cloth_from_other_table_cloth.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "tag": "forge:dyes/lime" + }, + { + "tag": "create:dyed_table_cloths" + } + ], + "result": { + "item": "create:lime_table_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/magenta_postbox.json b/src/generated/resources/data/create/recipes/crafting/logistics/magenta_postbox.json new file mode 100644 index 0000000000..42a7a90806 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/magenta_postbox.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "A": { + "item": "create:andesite_alloy" + }, + "B": { + "item": "minecraft:barrel" + }, + "D": { + "tag": "forge:dyes/magenta" + } + }, + "pattern": [ + "D", + "B", + "A" + ], + "result": { + "item": "create:magenta_postbox" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/magenta_postbox_from_other_postbox.json b/src/generated/resources/data/create/recipes/crafting/logistics/magenta_postbox_from_other_postbox.json new file mode 100644 index 0000000000..20b372938b --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/magenta_postbox_from_other_postbox.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "tag": "forge:dyes/magenta" + }, + { + "tag": "create:postboxes" + } + ], + "result": { + "item": "create:magenta_postbox" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/magenta_table_cloth.json b/src/generated/resources/data/create/recipes/crafting/logistics/magenta_table_cloth.json new file mode 100644 index 0000000000..d8a46169fd --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/magenta_table_cloth.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "minecraft:magenta_wool" + }, + { + "item": "create:andesite_alloy" + } + ], + "result": { + "count": 2, + "item": "create:magenta_table_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/magenta_table_cloth_from_other_table_cloth.json b/src/generated/resources/data/create/recipes/crafting/logistics/magenta_table_cloth_from_other_table_cloth.json new file mode 100644 index 0000000000..74a693e884 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/magenta_table_cloth_from_other_table_cloth.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "tag": "forge:dyes/magenta" + }, + { + "tag": "create:dyed_table_cloths" + } + ], + "result": { + "item": "create:magenta_table_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/orange_postbox.json b/src/generated/resources/data/create/recipes/crafting/logistics/orange_postbox.json new file mode 100644 index 0000000000..9036d90c49 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/orange_postbox.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "A": { + "item": "create:andesite_alloy" + }, + "B": { + "item": "minecraft:barrel" + }, + "D": { + "tag": "forge:dyes/orange" + } + }, + "pattern": [ + "D", + "B", + "A" + ], + "result": { + "item": "create:orange_postbox" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/orange_postbox_from_other_postbox.json b/src/generated/resources/data/create/recipes/crafting/logistics/orange_postbox_from_other_postbox.json new file mode 100644 index 0000000000..0fad6790dd --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/orange_postbox_from_other_postbox.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "tag": "forge:dyes/orange" + }, + { + "tag": "create:postboxes" + } + ], + "result": { + "item": "create:orange_postbox" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/orange_table_cloth.json b/src/generated/resources/data/create/recipes/crafting/logistics/orange_table_cloth.json new file mode 100644 index 0000000000..87f85bc00c --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/orange_table_cloth.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "minecraft:orange_wool" + }, + { + "item": "create:andesite_alloy" + } + ], + "result": { + "count": 2, + "item": "create:orange_table_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/orange_table_cloth_from_other_table_cloth.json b/src/generated/resources/data/create/recipes/crafting/logistics/orange_table_cloth_from_other_table_cloth.json new file mode 100644 index 0000000000..3432a92c60 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/orange_table_cloth_from_other_table_cloth.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "tag": "forge:dyes/orange" + }, + { + "tag": "create:dyed_table_cloths" + } + ], + "result": { + "item": "create:orange_table_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/package_frogport.json b/src/generated/resources/data/create/recipes/crafting/logistics/package_frogport.json new file mode 100644 index 0000000000..478d820f42 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/package_frogport.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "A": { + "item": "create:item_vault" + }, + "B": { + "tag": "forge:slimeballs" + }, + "C": { + "item": "create:andesite_alloy" + } + }, + "pattern": [ + "B", + "A", + "C" + ], + "result": { + "item": "create:package_frogport" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/packager.json b/src/generated/resources/data/create/recipes/crafting/logistics/packager.json new file mode 100644 index 0000000000..9a2af88c13 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/packager.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "A": { + "item": "create:cardboard_block" + }, + "C": { + "tag": "forge:ingots/iron" + } + }, + "pattern": [ + " C ", + "CAC", + " C " + ], + "result": { + "item": "create:packager" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/pink_postbox.json b/src/generated/resources/data/create/recipes/crafting/logistics/pink_postbox.json new file mode 100644 index 0000000000..7a6dd0f2a9 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/pink_postbox.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "A": { + "item": "create:andesite_alloy" + }, + "B": { + "item": "minecraft:barrel" + }, + "D": { + "tag": "forge:dyes/pink" + } + }, + "pattern": [ + "D", + "B", + "A" + ], + "result": { + "item": "create:pink_postbox" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/pink_postbox_from_other_postbox.json b/src/generated/resources/data/create/recipes/crafting/logistics/pink_postbox_from_other_postbox.json new file mode 100644 index 0000000000..5f406728fe --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/pink_postbox_from_other_postbox.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "tag": "forge:dyes/pink" + }, + { + "tag": "create:postboxes" + } + ], + "result": { + "item": "create:pink_postbox" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/pink_table_cloth.json b/src/generated/resources/data/create/recipes/crafting/logistics/pink_table_cloth.json new file mode 100644 index 0000000000..f7e3ca05c2 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/pink_table_cloth.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "minecraft:pink_wool" + }, + { + "item": "create:andesite_alloy" + } + ], + "result": { + "count": 2, + "item": "create:pink_table_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/pink_table_cloth_from_other_table_cloth.json b/src/generated/resources/data/create/recipes/crafting/logistics/pink_table_cloth_from_other_table_cloth.json new file mode 100644 index 0000000000..28e6476ac5 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/pink_table_cloth_from_other_table_cloth.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "tag": "forge:dyes/pink" + }, + { + "tag": "create:dyed_table_cloths" + } + ], + "result": { + "item": "create:pink_table_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/pulse_timer.json b/src/generated/resources/data/create/recipes/crafting/logistics/pulse_timer.json new file mode 100644 index 0000000000..6a49256b22 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/pulse_timer.json @@ -0,0 +1,26 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "C": { + "tag": "forge:plates/brass" + }, + "R": { + "item": "minecraft:amethyst_shard" + }, + "S": { + "tag": "forge:stone" + }, + "T": { + "item": "minecraft:redstone_torch" + } + }, + "pattern": [ + "RCT", + "SSS" + ], + "result": { + "item": "create:pulse_timer" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/purple_postbox.json b/src/generated/resources/data/create/recipes/crafting/logistics/purple_postbox.json new file mode 100644 index 0000000000..27ea357ced --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/purple_postbox.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "A": { + "item": "create:andesite_alloy" + }, + "B": { + "item": "minecraft:barrel" + }, + "D": { + "tag": "forge:dyes/purple" + } + }, + "pattern": [ + "D", + "B", + "A" + ], + "result": { + "item": "create:purple_postbox" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/purple_postbox_from_other_postbox.json b/src/generated/resources/data/create/recipes/crafting/logistics/purple_postbox_from_other_postbox.json new file mode 100644 index 0000000000..29677aa06d --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/purple_postbox_from_other_postbox.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "tag": "forge:dyes/purple" + }, + { + "tag": "create:postboxes" + } + ], + "result": { + "item": "create:purple_postbox" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/purple_table_cloth.json b/src/generated/resources/data/create/recipes/crafting/logistics/purple_table_cloth.json new file mode 100644 index 0000000000..891011b6b9 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/purple_table_cloth.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "minecraft:purple_wool" + }, + { + "item": "create:andesite_alloy" + } + ], + "result": { + "count": 2, + "item": "create:purple_table_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/purple_table_cloth_from_other_table_cloth.json b/src/generated/resources/data/create/recipes/crafting/logistics/purple_table_cloth_from_other_table_cloth.json new file mode 100644 index 0000000000..1bc8c9ef24 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/purple_table_cloth_from_other_table_cloth.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "tag": "forge:dyes/purple" + }, + { + "tag": "create:dyed_table_cloths" + } + ], + "result": { + "item": "create:purple_table_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/red_postbox.json b/src/generated/resources/data/create/recipes/crafting/logistics/red_postbox.json new file mode 100644 index 0000000000..dbb97a7020 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/red_postbox.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "A": { + "item": "create:andesite_alloy" + }, + "B": { + "item": "minecraft:barrel" + }, + "D": { + "tag": "forge:dyes/red" + } + }, + "pattern": [ + "D", + "B", + "A" + ], + "result": { + "item": "create:red_postbox" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/red_postbox_from_other_postbox.json b/src/generated/resources/data/create/recipes/crafting/logistics/red_postbox_from_other_postbox.json new file mode 100644 index 0000000000..8d36060325 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/red_postbox_from_other_postbox.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "tag": "forge:dyes/red" + }, + { + "tag": "create:postboxes" + } + ], + "result": { + "item": "create:red_postbox" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/red_table_cloth.json b/src/generated/resources/data/create/recipes/crafting/logistics/red_table_cloth.json new file mode 100644 index 0000000000..bdec39f0f4 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/red_table_cloth.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "minecraft:red_wool" + }, + { + "item": "create:andesite_alloy" + } + ], + "result": { + "count": 2, + "item": "create:red_table_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/red_table_cloth_from_other_table_cloth.json b/src/generated/resources/data/create/recipes/crafting/logistics/red_table_cloth_from_other_table_cloth.json new file mode 100644 index 0000000000..2ecc377857 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/red_table_cloth_from_other_table_cloth.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "tag": "forge:dyes/red" + }, + { + "tag": "create:dyed_table_cloths" + } + ], + "result": { + "item": "create:red_table_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/redstone_requester.json b/src/generated/resources/data/create/recipes/crafting/logistics/redstone_requester.json new file mode 100644 index 0000000000..d79d381032 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/redstone_requester.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "A": { + "item": "create:stock_link" + }, + "B": { + "tag": "forge:ingots/iron" + }, + "C": { + "tag": "forge:dusts/redstone" + } + }, + "pattern": [ + "C", + "A", + "B" + ], + "result": { + "item": "create:redstone_requester" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/stock_link.json b/src/generated/resources/data/create/recipes/crafting/logistics/stock_link.json new file mode 100644 index 0000000000..515a4d0e4b --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/stock_link.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "A": { + "tag": "forge:plates/copper" + }, + "B": { + "item": "create:item_vault" + }, + "C": { + "item": "minecraft:redstone_torch" + } + }, + "pattern": [ + "C", + "A", + "B" + ], + "result": { + "item": "create:stock_link" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/stock_ticker.json b/src/generated/resources/data/create/recipes/crafting/logistics/stock_ticker.json new file mode 100644 index 0000000000..35c438462e --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/stock_ticker.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "A": { + "item": "create:stock_link" + }, + "B": { + "tag": "forge:ingots/gold" + }, + "C": { + "tag": "forge:glass" + } + }, + "pattern": [ + "C", + "A", + "B" + ], + "result": { + "item": "create:stock_ticker" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/white_postbox.json b/src/generated/resources/data/create/recipes/crafting/logistics/white_postbox.json new file mode 100644 index 0000000000..ffb9a6c2c7 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/white_postbox.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "A": { + "item": "create:andesite_alloy" + }, + "B": { + "item": "minecraft:barrel" + }, + "D": { + "tag": "forge:dyes/white" + } + }, + "pattern": [ + "D", + "B", + "A" + ], + "result": { + "item": "create:white_postbox" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/white_postbox_from_other_postbox.json b/src/generated/resources/data/create/recipes/crafting/logistics/white_postbox_from_other_postbox.json new file mode 100644 index 0000000000..7467a76ef1 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/white_postbox_from_other_postbox.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "tag": "forge:dyes/white" + }, + { + "tag": "create:postboxes" + } + ], + "result": { + "item": "create:white_postbox" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/white_table_cloth.json b/src/generated/resources/data/create/recipes/crafting/logistics/white_table_cloth.json new file mode 100644 index 0000000000..5371e1d780 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/white_table_cloth.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "minecraft:white_wool" + }, + { + "item": "create:andesite_alloy" + } + ], + "result": { + "count": 2, + "item": "create:white_table_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/white_table_cloth_from_other_table_cloth.json b/src/generated/resources/data/create/recipes/crafting/logistics/white_table_cloth_from_other_table_cloth.json new file mode 100644 index 0000000000..ad1f97dd6c --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/white_table_cloth_from_other_table_cloth.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "tag": "forge:dyes/white" + }, + { + "tag": "create:dyed_table_cloths" + } + ], + "result": { + "item": "create:white_table_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/yellow_postbox.json b/src/generated/resources/data/create/recipes/crafting/logistics/yellow_postbox.json new file mode 100644 index 0000000000..658d8dc1c9 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/yellow_postbox.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "A": { + "item": "create:andesite_alloy" + }, + "B": { + "item": "minecraft:barrel" + }, + "D": { + "tag": "forge:dyes/yellow" + } + }, + "pattern": [ + "D", + "B", + "A" + ], + "result": { + "item": "create:yellow_postbox" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/yellow_postbox_from_other_postbox.json b/src/generated/resources/data/create/recipes/crafting/logistics/yellow_postbox_from_other_postbox.json new file mode 100644 index 0000000000..1b3d6866bb --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/yellow_postbox_from_other_postbox.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "tag": "forge:dyes/yellow" + }, + { + "tag": "create:postboxes" + } + ], + "result": { + "item": "create:yellow_postbox" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/yellow_table_cloth.json b/src/generated/resources/data/create/recipes/crafting/logistics/yellow_table_cloth.json new file mode 100644 index 0000000000..abe0aae4f1 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/yellow_table_cloth.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "minecraft:yellow_wool" + }, + { + "item": "create:andesite_alloy" + } + ], + "result": { + "count": 2, + "item": "create:yellow_table_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/yellow_table_cloth_from_other_table_cloth.json b/src/generated/resources/data/create/recipes/crafting/logistics/yellow_table_cloth_from_other_table_cloth.json new file mode 100644 index 0000000000..fcfeb4243b --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/yellow_table_cloth_from_other_table_cloth.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "tag": "forge:dyes/yellow" + }, + { + "tag": "create:dyed_table_cloths" + } + ], + "result": { + "item": "create:yellow_table_cloth" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/mixing/cardboard_pulp.json b/src/generated/resources/data/create/recipes/mixing/cardboard_pulp.json index c6b7bd0bb1..c1a9383d8a 100644 --- a/src/generated/resources/data/create/recipes/mixing/cardboard_pulp.json +++ b/src/generated/resources/data/create/recipes/mixing/cardboard_pulp.json @@ -2,31 +2,31 @@ "type": "create:mixing", "ingredients": [ { - "item": "minecraft:paper" + "tag": "create:pulpifiable" }, { - "item": "minecraft:paper" + "tag": "create:pulpifiable" }, { - "item": "minecraft:paper" + "tag": "create:pulpifiable" }, { - "item": "minecraft:paper" + "tag": "create:pulpifiable" }, { - "item": "minecraft:paper" + "tag": "create:pulpifiable" }, { - "item": "minecraft:paper" + "tag": "create:pulpifiable" }, { - "item": "minecraft:paper" + "tag": "create:pulpifiable" }, { - "item": "minecraft:paper" + "tag": "create:pulpifiable" }, { - "item": "minecraft:paper" + "tag": "create:pulpifiable" }, { "amount": 1000, diff --git a/src/generated/resources/data/create/tags/items/dyed_table_cloths.json b/src/generated/resources/data/create/tags/items/dyed_table_cloths.json new file mode 100644 index 0000000000..08032250b4 --- /dev/null +++ b/src/generated/resources/data/create/tags/items/dyed_table_cloths.json @@ -0,0 +1,20 @@ +{ + "values": [ + "create:white_table_cloth", + "create:orange_table_cloth", + "create:magenta_table_cloth", + "create:light_blue_table_cloth", + "create:yellow_table_cloth", + "create:lime_table_cloth", + "create:pink_table_cloth", + "create:gray_table_cloth", + "create:light_gray_table_cloth", + "create:cyan_table_cloth", + "create:purple_table_cloth", + "create:blue_table_cloth", + "create:brown_table_cloth", + "create:green_table_cloth", + "create:red_table_cloth", + "create:black_table_cloth" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/tags/items/pulpifiable.json b/src/generated/resources/data/create/tags/items/pulpifiable.json new file mode 100644 index 0000000000..ecbbc85abf --- /dev/null +++ b/src/generated/resources/data/create/tags/items/pulpifiable.json @@ -0,0 +1,7 @@ +{ + "values": [ + "minecraft:bamboo", + "minecraft:sugar_cane", + "#minecraft:saplings" + ] +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index fcf43f631c..242c58bf98 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -293,6 +293,7 @@ import net.minecraft.core.Direction.AxisDirection; import net.minecraft.core.registries.Registries; import net.minecraft.data.loot.BlockLootSubProvider; import net.minecraft.data.recipes.RecipeCategory; +import net.minecraft.data.recipes.ShapedRecipeBuilder; import net.minecraft.data.recipes.ShapelessRecipeBuilder; import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvents; @@ -1808,7 +1809,7 @@ public class AllBlocks { .transform(BuilderTransformers.crate("creative")) .properties(p -> p.mapColor(MapColor.COLOR_PURPLE)) .register(); - + public static final BlockEntry ITEM_VAULT = REGISTRATE.block("item_vault", ItemVaultBlock::new) .initialProperties(SharedProperties::softMetal) .properties(p -> p.mapColor(MapColor.TERRACOTTA_BLUE) @@ -1885,6 +1886,22 @@ public class AllBlocks { .tag(AllBlockTags.POSTBOXES.tag) .onRegisterAfter(Registries.ITEM, v -> ItemDescription.useKey(v, "block.create.package_postbox")) .item(PackagePortItem::new) + .recipe((c, p) -> { + ShapedRecipeBuilder.shaped(RecipeCategory.BUILDING_BLOCKS, c.get()) + .define('D', colour.getTag()) + .define('B', Items.BARREL) + .define('A', AllItems.ANDESITE_ALLOY) + .pattern("D") + .pattern("B") + .pattern("A") + .unlockedBy("has_barrel", RegistrateRecipeProvider.has(Items.BARREL)) + .save(p, Create.asResource("crafting/logistics/" + c.getName())); + ShapelessRecipeBuilder.shapeless(RecipeCategory.BUILDING_BLOCKS, c.get()) + .requires(colour.getTag()) + .requires(AllItemTags.POSTBOXES.tag) + .unlockedBy("has_postbox", RegistrateRecipeProvider.has(AllItemTags.POSTBOXES.tag)) + .save(p, Create.asResource("crafting/logistics/" + c.getName() + "_from_other_postbox")); + }) .model((c, p) -> p.withExistingParent(colourName + "_postbox", p.modLoc("block/package_postbox/item")) .texture("0", p.modLoc("block/post_box/post_box_" + colourName)) .texture("1", p.modLoc("block/post_box/post_box_" + colourName + "_closed"))) @@ -1943,31 +1960,49 @@ public class AllBlocks { public static final DyedBlockList TABLE_CLOTHS = new DyedBlockList<>(colour -> { String colourName = colour.getSerializedName(); return REGISTRATE.block(colourName + "_table_cloth", p -> new DisplayClothBlock(p, colour)) - .transform(BuilderTransformers.tableCloth(colourName, () -> Blocks.BLACK_CARPET, false)) + .transform(BuilderTransformers.tableCloth(colourName, () -> Blocks.BLACK_CARPET, true)) .properties(p -> p.mapColor(colour)) + .recipe((c, p) -> { + ShapelessRecipeBuilder.shapeless(RecipeCategory.BUILDING_BLOCKS, c.get(), 2) + .requires(DyeHelper.getWoolOfDye(colour)) + .requires(AllItems.ANDESITE_ALLOY) + .unlockedBy("has_wool", RegistrateRecipeProvider.has(ItemTags.WOOL)) + .save(p, Create.asResource("crafting/logistics/" + c.getName())); + ShapelessRecipeBuilder.shapeless(RecipeCategory.BUILDING_BLOCKS, c.get()) + .requires(colour.getTag()) + .requires(AllItemTags.DYED_TABLE_CLOTHS.tag) + .unlockedBy("has_postbox", RegistrateRecipeProvider.has(AllItemTags.DYED_TABLE_CLOTHS.tag)) + .save(p, Create.asResource("crafting/logistics/" + c.getName() + "_from_other_table_cloth")); + }) .register(); }); public static final BlockEntry ANDESITE_DISPLAY_CLOTH = REGISTRATE.block("andesite_table_cloth", p -> new DisplayClothBlock(p, "andesite")) - .transform(BuilderTransformers.tableCloth("andesite", SharedProperties::stone, true)) + .transform(BuilderTransformers.tableCloth("andesite", SharedProperties::stone, false)) .properties(p -> p.mapColor(MapColor.STONE) .requiresCorrectToolForDrops()) + .recipe((c, p) -> p.stonecutting(DataIngredient.items(AllItems.ANDESITE_ALLOY.get()), + RecipeCategory.DECORATIONS, c::get, 2)) .transform(pickaxeOnly()) .register(); public static final BlockEntry BRASS_DISPLAY_CLOTH = REGISTRATE.block("brass_table_cloth", p -> new DisplayClothBlock(p, "brass")) - .transform(BuilderTransformers.tableCloth("brass", SharedProperties::softMetal, true)) + .transform(BuilderTransformers.tableCloth("brass", SharedProperties::softMetal, false)) .properties(p -> p.mapColor(MapColor.TERRACOTTA_YELLOW) .requiresCorrectToolForDrops()) + .recipe((c, p) -> p.stonecutting(DataIngredient.tag(AllTags.forgeItemTag("ingots/brass")), + RecipeCategory.DECORATIONS, c::get, 2)) .transform(pickaxeOnly()) .register(); public static final BlockEntry COPPER_DISPLAY_CLOTH = REGISTRATE.block("copper_table_cloth", p -> new DisplayClothBlock(p, "copper")) - .transform(BuilderTransformers.tableCloth("copper", SharedProperties::copperMetal, true)) + .transform(BuilderTransformers.tableCloth("copper", SharedProperties::copperMetal, false)) .properties(p -> p.requiresCorrectToolForDrops()) + .recipe((c, p) -> p.stonecutting(DataIngredient.tag(AllTags.forgeItemTag("ingots/copper")), + RecipeCategory.DECORATIONS, c::get, 2)) .transform(pickaxeOnly()) .register(); diff --git a/src/main/java/com/simibubi/create/AllTags.java b/src/main/java/com/simibubi/create/AllTags.java index c5da22d2a4..3475753998 100644 --- a/src/main/java/com/simibubi/create/AllTags.java +++ b/src/main/java/com/simibubi/create/AllTags.java @@ -179,6 +179,8 @@ public class AllTags { SEATS, POSTBOXES, TABLE_CLOTHS, + DYED_TABLE_CLOTHS, + PULPIFIABLE, SLEEPERS, TOOLBOXES, TRACKS, diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperOpenRequestScreenPacket.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperOpenRequestScreenPacket.java index 721d16b46c..ed8b05d977 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperOpenRequestScreenPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperOpenRequestScreenPacket.java @@ -10,6 +10,8 @@ import net.minecraft.client.player.LocalPlayer; import net.minecraft.core.BlockPos; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.item.ItemStack; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.network.NetworkEvent.Context; public class StockKeeperOpenRequestScreenPacket extends SimplePacketBase { @@ -38,6 +40,7 @@ public class StockKeeperOpenRequestScreenPacket extends SimplePacketBase { } @Override + @OnlyIn(Dist.CLIENT) public boolean handle(Context context) { LocalPlayer player = Minecraft.getInstance().player; if (player == null) diff --git a/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java b/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java index be92acee75..2d8cb6ef7c 100644 --- a/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java +++ b/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java @@ -480,26 +480,33 @@ public class BuilderTransformers { } public static NonNullUnaryOperator> tableCloth(String name, - NonNullSupplier initialProps, boolean lowerItem) { - return b -> b.initialProperties(initialProps) - .addLayer(() -> RenderType::cutoutMipped) - .blockstate((c, p) -> p.simpleBlock(c.get(), p.models() - .withExistingParent(name + "_table_cloth", p.modLoc("block/table_cloth/block")) - .texture("0", p.modLoc("block/table_cloth/" + name)))) - .onRegister(CreateRegistrate.blockModel(() -> DisplayClothModel::new)) - .tag(AllBlockTags.TABLE_CLOTHS.tag) - .onRegisterAfter(Registries.ITEM, v -> ItemDescription.useKey(v, "block.create.table_cloth")) - .item(DisplayClothBlockItem::new) - .model((c, p) -> p - .withExistingParent(name + "_table_cloth", - p.modLoc("block/table_cloth/item" + (lowerItem ? "_lower" : ""))) - .texture("0", p.modLoc("block/table_cloth/" + name))) - .tag(AllItemTags.TABLE_CLOTHS.tag) - .recipe((c, p) -> ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, c.get()) - .requires(c.get()) - .unlockedBy("has_" + c.getName(), RegistrateRecipeProvider.has(c.get())) - .save(p, Create.asResource("crafting/logistics/" + c.getName() + "_clear"))) - .build(); + NonNullSupplier initialProps, boolean dyed) { + return b -> { + ItemBuilder> item = b.initialProperties(initialProps) + .addLayer(() -> RenderType::cutoutMipped) + .blockstate((c, p) -> p.simpleBlock(c.get(), p.models() + .withExistingParent(name + "_table_cloth", p.modLoc("block/table_cloth/block")) + .texture("0", p.modLoc("block/table_cloth/" + name)))) + .onRegister(CreateRegistrate.blockModel(() -> DisplayClothModel::new)) + .tag(AllBlockTags.TABLE_CLOTHS.tag) + .onRegisterAfter(Registries.ITEM, v -> ItemDescription.useKey(v, "block.create.table_cloth")) + .item(DisplayClothBlockItem::new); + + if (dyed) + item.tag(AllItemTags.DYED_TABLE_CLOTHS.tag); + + return item + .model((c, p) -> p + .withExistingParent(name + "_table_cloth", + p.modLoc("block/table_cloth/item" + (!dyed ? "_lower" : ""))) + .texture("0", p.modLoc("block/table_cloth/" + name))) + .tag(AllItemTags.TABLE_CLOTHS.tag) + .recipe((c, p) -> ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, c.get()) + .requires(c.get()) + .unlockedBy("has_" + c.getName(), RegistrateRecipeProvider.has(c.get())) + .save(p, Create.asResource("crafting/logistics/" + c.getName() + "_clear"))) + .build(); + }; } } diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/CreateRecipeProvider.java b/src/main/java/com/simibubi/create/foundation/data/recipe/CreateRecipeProvider.java index e68a6d4b94..cba414b013 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/CreateRecipeProvider.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/CreateRecipeProvider.java @@ -91,6 +91,14 @@ public abstract class CreateRecipeProvider extends RecipeProvider { static ItemLike andesiteCasing() { return AllBlocks.ANDESITE_CASING.get(); } + + static ItemLike vault() { + return AllBlocks.ITEM_VAULT.get(); + } + + static ItemLike stockLink() { + return AllBlocks.STOCK_LINK.get(); + } static TagKey brass() { return AllTags.forgeItemTag("ingots/brass"); diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/MixingRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/MixingRecipeGen.java index 1b564b83f7..ecc2212411 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/MixingRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/MixingRecipeGen.java @@ -3,6 +3,7 @@ package com.simibubi.create.foundation.data.recipe; import com.simibubi.create.AllFluids; import com.simibubi.create.AllItems; import com.simibubi.create.AllRecipeTypes; +import com.simibubi.create.AllTags.AllItemTags; import com.simibubi.create.content.processing.recipe.HeatCondition; import com.simibubi.create.foundation.recipe.BlockTagIngredient; @@ -64,15 +65,15 @@ public class MixingRecipeGen extends ProcessingRecipeGen { .output(Blocks.MUD, 1)), PULP = create("cardboard_pulp", b -> b - .require(Items.PAPER) - .require(Items.PAPER) - .require(Items.PAPER) - .require(Items.PAPER) - .require(Items.PAPER) - .require(Items.PAPER) - .require(Items.PAPER) - .require(Items.PAPER) - .require(Items.PAPER) + .require(AllItemTags.PULPIFIABLE.tag) + .require(AllItemTags.PULPIFIABLE.tag) + .require(AllItemTags.PULPIFIABLE.tag) + .require(AllItemTags.PULPIFIABLE.tag) + .require(AllItemTags.PULPIFIABLE.tag) + .require(AllItemTags.PULPIFIABLE.tag) + .require(AllItemTags.PULPIFIABLE.tag) + .require(AllItemTags.PULPIFIABLE.tag) + .require(AllItemTags.PULPIFIABLE.tag) .require(Fluids.WATER, 1000) .output(AllItems.PULP, 1)), diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java index 070cca85f2..0ea2813832 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java @@ -251,6 +251,11 @@ public class StandardRecipeGen extends CreateRecipeProvider { .define('A', I.brassNugget()) .pattern("ASA")), + PACKAGE_FILTER = create(AllItems.PACKAGE_FILTER).unlockedByTag(I::zinc) + .viaShaped(b -> b.define('S', ItemTags.WOOL) + .define('A', I.zincNugget()) + .pattern("ASA")), + BRASS_HAND = create(AllItems.BRASS_HAND).unlockedByTag(I::brass) .viaShaped(b -> b.define('A', I.andesiteAlloy()) .define('B', I.brassSheet()) @@ -826,10 +831,10 @@ public class StandardRecipeGen extends CreateRecipeProvider { VERTICAL_GEARBOX = create(AllItems.VERTICAL_GEARBOX).unlockedBy(I::cog) .viaShaped(b -> b.define('C', I.cog()) - .define('B', I.andesiteCasing()) - .pattern("C C") - .pattern(" B ") - .pattern("C C")), + .define('B', I.andesiteCasing()) + .pattern("C C") + .pattern(" B ") + .pattern("C C")), GEARBOX_CYCLE = conversionCycle(ImmutableList.of(AllBlocks.GEARBOX, AllItems.VERTICAL_GEARBOX)), @@ -912,6 +917,14 @@ public class StandardRecipeGen extends CreateRecipeProvider { .pattern("AIA") .pattern(" C ")), + CHAIN_CONVEYOR = create(AllBlocks.CHAIN_CONVEYOR).unlockedBy(I::andesiteCasing) + .returns(2) + .viaShaped(b -> b.define('C', I.andesiteCasing()) + .define('A', I.largeCog()) + .pattern(" C ") + .pattern("CAC") + .pattern(" C ")), + SEQUENCED_GEARSHIFT = create(AllBlocks.SEQUENCED_GEARSHIFT).unlockedBy(I::brassCasing) .viaShapeless(b -> b.requires(I.brassCasing()) .requires(I.cog()) @@ -996,6 +1009,14 @@ public class StandardRecipeGen extends CreateRecipeProvider { .define('S', I.stone()) .pattern("RCT") .pattern("SSS")), + + PULSE_TIMER = create(AllBlocks.PULSE_TIMER).unlockedByTag(I::redstone) + .viaShaped(b -> b.define('T', Blocks.REDSTONE_TORCH) + .define('C', I.brassSheet()) + .define('R', Items.AMETHYST_SHARD) + .define('S', I.stone()) + .pattern("RCT") + .pattern("SSS")), POWERED_TOGGLE_LATCH = create(AllBlocks.POWERED_TOGGLE_LATCH).unlockedByTag(I::redstone) .viaShaped(b -> b.define('T', Blocks.REDSTONE_TORCH) @@ -1020,9 +1041,60 @@ public class StandardRecipeGen extends CreateRecipeProvider { .define('S', I.brassCasing()) .pattern("C") .pattern("S")), + + ITEM_HATCH = create(AllBlocks.ITEM_HATCH).unlockedBy(I::andesiteAlloy) + .viaShapeless(b -> b.requires(I.andesiteAlloy()) + .requires(Items.IRON_TRAPDOOR)), - LOGISTICS_LINK_CLEAR = clearData(AllBlocks.STOCK_LINK), - STOCK_TICKER_CLEAR = clearData(AllBlocks.STOCK_TICKER), + PACKAGER = create(AllBlocks.PACKAGER).unlockedBy(I::cardboard) + .viaShaped(b -> b.define('C', I.iron()) + .define('A', AllBlocks.CARDBOARD_BLOCK) + .pattern(" C ") + .pattern("CAC") + .pattern(" C ")), + + PACKAGE_FROGPORT = create(AllBlocks.PACKAGE_FROGPORT).unlockedBy(I::cardboard) + .viaShaped(b -> b.define('C', I.andesiteAlloy()) + .define('B', Tags.Items.SLIMEBALLS) + .define('A', I.vault()) + .pattern("B") + .pattern("A") + .pattern("C")), + + STOCK_LINK = create(AllBlocks.STOCK_LINK).unlockedBy(I::cardboard) + .viaShaped(b -> b.define('C', Items.REDSTONE_TORCH) + .define('B', I.vault()) + .define('A', I.copperSheet()) + .pattern("C") + .pattern("A") + .pattern("B")), + + STOCK_TICKER = create(AllBlocks.STOCK_TICKER).unlockedBy(I::cardboard) + .viaShaped(b -> b.define('C', Tags.Items.GLASS) + .define('B', I.gold()) + .define('A', I.stockLink()) + .pattern("C") + .pattern("A") + .pattern("B")), + + REDSTONE_REQUESTER = create(AllBlocks.REDSTONE_REQUESTER).unlockedBy(I::cardboard) + .viaShaped(b -> b.define('C', I.redstone()) + .define('B', I.iron()) + .define('A', I.stockLink()) + .pattern("C") + .pattern("A") + .pattern("B")), + + FACTORY_GAUGE = create(AllBlocks.FACTORY_GAUGE).unlockedBy(I::stockLink) + .returns(2) + .viaShapeless(b -> b.requires(I.stockLink()) + .requires(I.precisionMechanism())), + + DESK_BELL = create(AllBlocks.DESK_BELL).unlockedBy(I::andesiteCasing) + .viaShapeless(b -> b.requires(I.andesiteCasing()) + .requires(I.goldSheet())), + + LOGISTICS_LINK_CLEAR = clearData(AllBlocks.STOCK_LINK), STOCK_TICKER_CLEAR = clearData(AllBlocks.STOCK_TICKER), REDSTONE_REQUESTER_CLEAR = clearData(AllBlocks.REDSTONE_REQUESTER), FACTORY_PANEL_CLEAR = clearData(AllBlocks.FACTORY_GAUGE), @@ -1101,6 +1173,13 @@ public class StandardRecipeGen extends CreateRecipeProvider { FILTER_CLEAR = clearData(AllItems.FILTER), ATTRIBUTE_FILTER_CLEAR = clearData(AllItems.ATTRIBUTE_FILTER), PACKAGE_FILTER_CLEAR = clearData(AllItems.PACKAGE_FILTER), + CARDBOARD_SWORD = create(AllItems.CARDBOARD_SWORD).unlockedBy(I::cardboard) + .viaShaped(b -> b.define('P', I.cardboard()) + .define('S', Tags.Items.RODS_WOODEN) + .pattern("P") + .pattern("P") + .pattern("S")), + CARDBOARD_HELMET = create(AllItems.CARDBOARD_HELMET).unlockedBy(I::cardboard) .viaShaped(b -> b.define('P', I.cardboard()) .pattern("PPP") @@ -1185,17 +1264,19 @@ public class StandardRecipeGen extends CreateRecipeProvider { Items.FIRE_CORAL)) .requires(Items.BONE_MEAL)), - NETHERITE_DIVING_HELMET = - create(AllItems.NETHERITE_DIVING_HELMET).viaNetheriteSmithing(AllItems.COPPER_DIVING_HELMET::get, I::netherite), + NETHERITE_DIVING_HELMET = create(AllItems.NETHERITE_DIVING_HELMET) + .viaNetheriteSmithing(AllItems.COPPER_DIVING_HELMET::get, I::netherite), NETHERITE_BACKTANK = create(AllItems.NETHERITE_BACKTANK).viaNetheriteSmithing(AllItems.COPPER_BACKTANK::get, I::netherite), - NETHERITE_DIVING_BOOTS = - create(AllItems.NETHERITE_DIVING_BOOTS).viaNetheriteSmithing(AllItems.COPPER_DIVING_BOOTS::get, I::netherite), + NETHERITE_DIVING_BOOTS = create(AllItems.NETHERITE_DIVING_BOOTS) + .viaNetheriteSmithing(AllItems.COPPER_DIVING_BOOTS::get, I::netherite), NETHERITE_DIVING_HELMET_2 = create(AllItems.NETHERITE_DIVING_HELMET).withSuffix("_from_netherite") - .viaNetheriteSmithing(() -> Items.NETHERITE_HELMET, () -> Ingredient.of(AllItems.COPPER_DIVING_HELMET.get())), + .viaNetheriteSmithing(() -> Items.NETHERITE_HELMET, + () -> Ingredient.of(AllItems.COPPER_DIVING_HELMET.get())), NETHERITE_BACKTANK_2 = create(AllItems.NETHERITE_BACKTANK).withSuffix("_from_netherite") - .viaNetheriteSmithing(() -> Items.NETHERITE_CHESTPLATE, () -> Ingredient.of(AllItems.COPPER_BACKTANK.get())), + .viaNetheriteSmithing(() -> Items.NETHERITE_CHESTPLATE, + () -> Ingredient.of(AllItems.COPPER_BACKTANK.get())), NETHERITE_DIVING_BOOTS_2 = create(AllItems.NETHERITE_DIVING_BOOTS).withSuffix("_from_netherite") .viaNetheriteSmithing(() -> Items.NETHERITE_BOOTS, () -> Ingredient.of(AllItems.COPPER_DIVING_BOOTS.get())) @@ -1249,7 +1330,8 @@ public class StandardRecipeGen extends CreateRecipeProvider { .unlockedBy(() -> Items.BONE_MEAL) .whenModLoaded(Mods.UA.getId()) .viaShapeless(b -> b.requires(Ingredient.of(ItemTags.SMALL_FLOWERS), 2) - .requires(AllItemTags.UA_CORAL.tag).requires(Items.BONE_MEAL)) + .requires(AllItemTags.UA_CORAL.tag) + .requires(Items.BONE_MEAL)) ; @@ -1432,7 +1514,8 @@ public class StandardRecipeGen extends CreateRecipeProvider { // FIXME 5.1 refactor - recipe categories as markers instead of sections? GeneratedRecipe viaShaped(UnaryOperator builder) { return register(consumer -> { - ShapedRecipeBuilder b = builder.apply(ShapedRecipeBuilder.shaped(RecipeCategory.MISC, result.get(), amount)); + ShapedRecipeBuilder b = + builder.apply(ShapedRecipeBuilder.shaped(RecipeCategory.MISC, result.get(), amount)); if (unlockedBy != null) b.unlockedBy("has_item", inventoryTrigger(unlockedBy.get())); b.save(consumer, createLocation("crafting")); @@ -1441,14 +1524,15 @@ public class StandardRecipeGen extends CreateRecipeProvider { GeneratedRecipe viaShapeless(UnaryOperator builder) { return register(consumer -> { - ShapelessRecipeBuilder b = builder.apply(ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, result.get(), amount)); + ShapelessRecipeBuilder b = + builder.apply(ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, result.get(), amount)); if (unlockedBy != null) b.unlockedBy("has_item", inventoryTrigger(unlockedBy.get())); b.save(result -> { - consumer.accept( - !recipeConditions.isEmpty() ? new ConditionSupportingShapelessRecipeResult(result, recipeConditions) - : result); + consumer.accept(!recipeConditions.isEmpty() + ? new ConditionSupportingShapelessRecipeResult(result, recipeConditions) + : result); }, createLocation("crafting")); }); } @@ -1476,7 +1560,7 @@ public class StandardRecipeGen extends CreateRecipeProvider { private ResourceLocation getRegistryName() { return compatDatagenOutput == null ? CatnipServices.REGISTRIES.getKeyOrThrow(result.get() - .asItem()) : compatDatagenOutput; + .asItem()) : compatDatagenOutput; } GeneratedCookingRecipeBuilder viaCooking(Supplier item) { @@ -1576,39 +1660,41 @@ public class StandardRecipeGen extends CreateRecipeProvider { super(p_i48262_1_); } - private record ModdedCookingRecipeResult(FinishedRecipe wrapped, ResourceLocation outputOverride, List conditions) implements FinishedRecipe { - @Override - public ResourceLocation getId() { - return wrapped.getId(); - } - - @Override - public RecipeSerializer getType() { - return wrapped.getType(); - } - - @Override - public JsonObject serializeAdvancement() { - return wrapped.serializeAdvancement(); - } - - @Override - public ResourceLocation getAdvancementId() { - return wrapped.getAdvancementId(); - } - - @Override - public void serializeRecipeData(JsonObject object) { - wrapped.serializeRecipeData(object); - object.addProperty("result", outputOverride.toString()); - - JsonArray conds = new JsonArray(); - conditions.forEach(c -> conds.add(CraftingHelper.serialize(c))); - object.add("conditions", conds); - } + private record ModdedCookingRecipeResult(FinishedRecipe wrapped, ResourceLocation outputOverride, + List conditions) implements FinishedRecipe { + @Override + public ResourceLocation getId() { + return wrapped.getId(); } - private record ConditionSupportingShapelessRecipeResult(FinishedRecipe wrapped, List conditions) implements FinishedRecipe { + @Override + public RecipeSerializer getType() { + return wrapped.getType(); + } + + @Override + public JsonObject serializeAdvancement() { + return wrapped.serializeAdvancement(); + } + + @Override + public ResourceLocation getAdvancementId() { + return wrapped.getAdvancementId(); + } + + @Override + public void serializeRecipeData(JsonObject object) { + wrapped.serializeRecipeData(object); + object.addProperty("result", outputOverride.toString()); + + JsonArray conds = new JsonArray(); + conditions.forEach(c -> conds.add(CraftingHelper.serialize(c))); + object.add("conditions", conds); + } + } + + private record ConditionSupportingShapelessRecipeResult(FinishedRecipe wrapped, List conditions) + implements FinishedRecipe { @Override public ResourceLocation getId() { return wrapped.getId(); diff --git a/src/main/java/com/simibubi/create/foundation/fluid/FluidRenderer.java b/src/main/java/com/simibubi/create/foundation/fluid/FluidRenderer.java index e0406dd7f8..59fe5d5c75 100644 --- a/src/main/java/com/simibubi/create/foundation/fluid/FluidRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/fluid/FluidRenderer.java @@ -4,12 +4,14 @@ import java.util.function.Function; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; +import com.simibubi.create.foundation.render.RenderTypes; import dev.engine_room.flywheel.lib.transform.TransformStack; import net.createmod.catnip.utility.BasicFluidRenderer; import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.core.Direction; import net.minecraft.resources.ResourceLocation; @@ -27,7 +29,7 @@ public class FluidRenderer extends BasicFluidRenderer { public static void renderFluidStream(FluidStack fluidStack, Direction direction, float radius, float progress, boolean inbound, MultiBufferSource buffer, PoseStack ms, int light) { - renderFluidStream(fluidStack, direction, radius, progress, inbound, getFluidBuilder(buffer), ms, light); + renderFluidStream(fluidStack, direction, radius, progress, inbound, buffer.getBuffer(RenderTypes.fluid()), ms, light); } public static void renderFluidStream(FluidStack fluidStack, Direction direction, float radius, float progress, diff --git a/src/main/java/com/simibubi/create/infrastructure/data/CreateRegistrateTags.java b/src/main/java/com/simibubi/create/infrastructure/data/CreateRegistrateTags.java index f2bbdd4203..986309bb66 100644 --- a/src/main/java/com/simibubi/create/infrastructure/data/CreateRegistrateTags.java +++ b/src/main/java/com/simibubi/create/infrastructure/data/CreateRegistrateTags.java @@ -146,6 +146,10 @@ public class CreateRegistrateTags { private static void genItemTags(RegistrateTagsProvider provIn) { CreateTagsProvider prov = new CreateTagsProvider<>(provIn, Item::builtInRegistryHolder); + prov.tag(AllItemTags.PULPIFIABLE.tag) + .add(Items.BAMBOO, Items.SUGAR_CANE) + .addTag(ItemTags.SAPLINGS); + prov.tag(AllItemTags.SLEEPERS.tag) .add(Items.STONE_SLAB, Items.SMOOTH_STONE_SLAB, Items.ANDESITE_SLAB); From 45c73d5c7b58e19b02cd37d7659a6390f8b5819e Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Wed, 6 Nov 2024 09:29:30 +0100 Subject: [PATCH 113/515] Port changes --- gradle.properties | 2 +- .../com/simibubi/create/content/trains/bogey/BogeyStyle.java | 4 ++-- .../create/content/trains/bogey/StandardBogeyVisual.java | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/gradle.properties b/gradle.properties index eb59a4f6bc..98f19a66a0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -28,7 +28,7 @@ jei_minecraft_version = 1.20.1 jei_version = 15.10.0.39 curios_minecraft_version = 1.20.1 curios_version = 5.3.1 -catnip_version = 0.8.15 +catnip_version = 0.8.17 ponder_version = 0.8.8 cc_tweaked_enable = true diff --git a/src/main/java/com/simibubi/create/content/trains/bogey/BogeyStyle.java b/src/main/java/com/simibubi/create/content/trains/bogey/BogeyStyle.java index d7ece27df3..54316e437e 100644 --- a/src/main/java/com/simibubi/create/content/trains/bogey/BogeyStyle.java +++ b/src/main/java/com/simibubi/create/content/trains/bogey/BogeyStyle.java @@ -12,7 +12,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllBogeyStyles; import com.simibubi.create.AllSoundEvents; import com.simibubi.create.content.trains.bogey.BogeySizes.BogeySize; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.CreateLang; import dev.engine_room.flywheel.api.visualization.VisualizationContext; import net.minecraft.client.renderer.MultiBufferSource; @@ -112,7 +112,7 @@ public class BogeyStyle { protected final ResourceLocation cycleGroup; protected final Map>> sizes = new HashMap<>(); - protected Component displayName = Lang.translateDirect("bogey.style.invalid"); + protected Component displayName = CreateLang.translateDirect("bogey.style.invalid"); protected Supplier soundEvent = AllSoundEvents.TRAIN2::getMainEvent; protected ParticleOptions contactParticle = ParticleTypes.CRIT; protected ParticleOptions smokeParticle = ParticleTypes.POOF; diff --git a/src/main/java/com/simibubi/create/content/trains/bogey/StandardBogeyVisual.java b/src/main/java/com/simibubi/create/content/trains/bogey/StandardBogeyVisual.java index 0bb70cd1d1..deead25eb8 100644 --- a/src/main/java/com/simibubi/create/content/trains/bogey/StandardBogeyVisual.java +++ b/src/main/java/com/simibubi/create/content/trains/bogey/StandardBogeyVisual.java @@ -8,14 +8,14 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.kinetics.simpleRelays.ShaftBlock; -import com.simibubi.create.foundation.render.VirtualRenderHelper; -import com.simibubi.create.foundation.utility.AngleHelper; import dev.engine_room.flywheel.api.instance.Instance; import dev.engine_room.flywheel.api.visualization.VisualizationContext; import dev.engine_room.flywheel.lib.instance.InstanceTypes; import dev.engine_room.flywheel.lib.instance.TransformedInstance; import dev.engine_room.flywheel.lib.model.Models; +import net.createmod.catnip.render.VirtualRenderHelper; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; From 6f1979df0a2c3808854ae4fd6b6690f6c4dd8eed Mon Sep 17 00:00:00 2001 From: zelophed Date: Fri, 8 Nov 2024 15:56:39 +0100 Subject: [PATCH 114/515] adjust block updates from rotation menu - remove unused ponder keybind --- build.gradle | 10 +++---- gradle.properties | 6 ++--- .../java/com/simibubi/create/AllKeys.java | 1 - .../wrench/RadialWrenchMenuSubmitPacket.java | 7 ++++- .../steamWhistle/WhistleExtenderBlock.java | 2 +- .../bell/CustomRotationParticle.java | 4 +-- .../content/equipment/wrench/IWrenchable.java | 27 +++++++------------ .../create/content/fluids/pump/PumpBlock.java | 6 ----- .../kinetics/base/KineticBlockEntity.java | 4 +++ .../encased/EncasedCogwheelBlock.java | 3 ++- .../factoryBoard/FactoryPanelBlock.java | 2 +- .../trains/station/StationBlockEntity.java | 7 ++--- .../foundation/fluid/FluidRenderer.java | 4 +-- 13 files changed, 39 insertions(+), 44 deletions(-) diff --git a/build.gradle b/build.gradle index b00694a74d..7cd2b3ecb1 100644 --- a/build.gradle +++ b/build.gradle @@ -51,7 +51,7 @@ mixin { config 'flywheel.backend.mixins.json' config 'flywheel.impl.mixins.json' - config 'flywheel.impl.sodium.mixins.json' + //config 'flywheel.impl.sodium.mixins.json' config 'create.mixins.json' debug.verbose = true @@ -126,7 +126,7 @@ minecraft { arg '-mixin.config=flywheel.backend.mixins.json' arg '-mixin.config=flywheel.impl.mixins.json' - arg '-mixin.config=flywheel.impl.sodium.mixins.json' + //arg '-mixin.config=flywheel.impl.sodium.mixins.json' } server { @@ -235,7 +235,7 @@ dependencies { jarJar("dev.engine_room.flywheel:flywheel-forge-${flywheel_minecraft_version}:${flywheel_version}") { jarJar.ranged(it, '[1.0,2.0)') } - + jarJar("net.createmod.catnip:Catnip-Forge-${minecraft_version}:${catnip_version}") { jarJar.ranged(it, '[0.7.5,)') } @@ -282,12 +282,12 @@ dependencies { // implementation fg.deobf("curse.maven:ic2-classic-242942:5555152") // implementation fg.deobf("curse.maven:druidcraft-340991:3101903") // implementation fg.deobf("com.railwayteam.railways:railways-1.19.2-1.6.4:all") { transitive = false } - + implementation fg.deobf("dev.architectury:architectury-forge:9.1.12") implementation fg.deobf("dev.ftb.mods:ftb-chunks-forge:2001.3.1") implementation fg.deobf("dev.ftb.mods:ftb-teams-forge:2001.3.0") implementation fg.deobf("dev.ftb.mods:ftb-library-forge:2001.2.4") - + implementation fg.deobf("curse.maven:journeymap-32274:5457831") // implementation fg.deobf("ignored:journeymap-1.20.1-5.10.1-forge") diff --git a/gradle.properties b/gradle.properties index c7a0108638..b922e9a094 100644 --- a/gradle.properties +++ b/gradle.properties @@ -23,13 +23,13 @@ use_parchment = true # dependency versions registrate_version = MC1.20-1.3.3 flywheel_minecraft_version = 1.20.1 -flywheel_version = 1.0.0-beta-145 +flywheel_version = 1.0.0-beta-154 jei_minecraft_version = 1.20.1 jei_version = 15.10.0.39 curios_minecraft_version = 1.20.1 curios_version = 5.3.1 -catnip_version = 0.8.17 -ponder_version = 0.8.11 +catnip_version = 0.8.20 +ponder_version = 0.8.12 cc_tweaked_enable = true cc_tweaked_minecraft_version = 1.20.1 diff --git a/src/main/java/com/simibubi/create/AllKeys.java b/src/main/java/com/simibubi/create/AllKeys.java index 4afb2b21d8..0b1f1338be 100644 --- a/src/main/java/com/simibubi/create/AllKeys.java +++ b/src/main/java/com/simibubi/create/AllKeys.java @@ -18,7 +18,6 @@ public enum AllKeys { TOOL_MENU("toolmenu", GLFW.GLFW_KEY_LEFT_ALT), ACTIVATE_TOOL("", GLFW.GLFW_KEY_LEFT_CONTROL), TOOLBELT("toolbelt", GLFW.GLFW_KEY_LEFT_ALT), - PONDER("ponder", GLFW.GLFW_KEY_W), ROTATE_MENU("rotate_menu", GLFW.GLFW_KEY_UNKNOWN), ; diff --git a/src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchMenuSubmitPacket.java b/src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchMenuSubmitPacket.java index 8b5b9611de..a8c98a9cc0 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchMenuSubmitPacket.java +++ b/src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchMenuSubmitPacket.java @@ -1,5 +1,6 @@ package com.simibubi.create.content.contraptions.wrench; +import com.simibubi.create.content.equipment.wrench.IWrenchable; import com.simibubi.create.content.kinetics.base.KineticBlockEntity; import com.simibubi.create.foundation.networking.SimplePacketBase; @@ -7,6 +8,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.network.NetworkEvent; import net.minecraftforge.registries.GameData; @@ -38,7 +40,10 @@ public class RadialWrenchMenuSubmitPacket extends SimplePacketBase { ServerPlayer player = context.getSender(); Level level = player.level(); - KineticBlockEntity.switchToBlockState(level, blockPos, newState); + BlockState updatedState = Block.updateFromNeighbourShapes(newState, level, blockPos); + KineticBlockEntity.switchToBlockState(level, blockPos, updatedState); + + IWrenchable.playRotateSound(level, blockPos); }); return true; } diff --git a/src/main/java/com/simibubi/create/content/decoration/steamWhistle/WhistleExtenderBlock.java b/src/main/java/com/simibubi/create/content/decoration/steamWhistle/WhistleExtenderBlock.java index c194c4bfd9..0663c00ec0 100644 --- a/src/main/java/com/simibubi/create/content/decoration/steamWhistle/WhistleExtenderBlock.java +++ b/src/main/java/com/simibubi/create/content/decoration/steamWhistle/WhistleExtenderBlock.java @@ -62,7 +62,7 @@ public class WhistleExtenderBlock extends Block implements IWrenchable { if (!(world instanceof ServerLevel)) return InteractionResult.SUCCESS; world.setBlock(pos, state.setValue(SHAPE, WhistleExtenderShape.SINGLE), 3); - playRemoveSound(world, pos); + IWrenchable.playRemoveSound(world, pos); return InteractionResult.SUCCESS; } diff --git a/src/main/java/com/simibubi/create/content/equipment/bell/CustomRotationParticle.java b/src/main/java/com/simibubi/create/content/equipment/bell/CustomRotationParticle.java index 227b68f7e0..f0de0c17a7 100644 --- a/src/main/java/com/simibubi/create/content/equipment/bell/CustomRotationParticle.java +++ b/src/main/java/com/simibubi/create/content/equipment/bell/CustomRotationParticle.java @@ -6,7 +6,7 @@ import org.joml.Vector3f; import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.math.Axis; -import dev.engine_room.flywheel.lib.util.ShadersModHandler; +import dev.engine_room.flywheel.lib.util.ShadersModHelper; import net.minecraft.client.Camera; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.particle.SimpleAnimatedParticle; @@ -65,7 +65,7 @@ public class CustomRotationParticle extends SimpleAnimatedParticle { float maxU = mirror ? getU0() : getU1(); float minV = getV0(); float maxV = getV1(); - int brightness = ShadersModHandler.isShaderPackInUse() ? LightTexture.pack(12, 15) : getLightColor(partialTicks); + int brightness = ShadersModHelper.isShaderPackInUse() ? LightTexture.pack(12, 15) : getLightColor(partialTicks); builder.vertex(vertices[0].x(), vertices[0].y(), vertices[0].z()).uv(maxU, maxV).color(rCol, gCol, bCol, alpha).uv2(brightness).endVertex(); builder.vertex(vertices[1].x(), vertices[1].y(), vertices[1].z()).uv(maxU, minV).color(rCol, gCol, bCol, alpha).uv2(brightness).endVertex(); builder.vertex(vertices[2].x(), vertices[2].y(), vertices[2].z()).uv(minU, minV).color(rCol, gCol, bCol, alpha).uv2(brightness).endVertex(); diff --git a/src/main/java/com/simibubi/create/content/equipment/wrench/IWrenchable.java b/src/main/java/com/simibubi/create/content/equipment/wrench/IWrenchable.java index 8bf8e31cfb..877b7f815c 100644 --- a/src/main/java/com/simibubi/create/content/equipment/wrench/IWrenchable.java +++ b/src/main/java/com/simibubi/create/content/equipment/wrench/IWrenchable.java @@ -4,7 +4,6 @@ import com.simibubi.create.AllSoundEvents; import com.simibubi.create.Create; import com.simibubi.create.content.kinetics.base.DirectionalAxisKineticBlock; import com.simibubi.create.content.kinetics.base.DirectionalKineticBlock; -import com.simibubi.create.content.kinetics.base.GeneratingKineticBlockEntity; import com.simibubi.create.content.kinetics.base.HorizontalAxisKineticBlock; import com.simibubi.create.content.kinetics.base.HorizontalKineticBlock; import com.simibubi.create.content.kinetics.base.KineticBlockEntity; @@ -20,7 +19,6 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.level.BlockEvent; @@ -28,21 +26,16 @@ import net.minecraftforge.event.level.BlockEvent; public interface IWrenchable { default InteractionResult onWrenched(BlockState state, UseOnContext context) { - Level world = context.getLevel(); + Level level = context.getLevel(); + BlockPos pos = context.getClickedPos(); BlockState rotated = getRotatedBlockState(state, context.getClickedFace()); - if (!rotated.canSurvive(world, context.getClickedPos())) + if (!rotated.canSurvive(level, context.getClickedPos())) return InteractionResult.PASS; - KineticBlockEntity.switchToBlockState(world, context.getClickedPos(), updateAfterWrenched(rotated, context)); + KineticBlockEntity.switchToBlockState(level, pos, updateAfterWrenched(rotated, context)); - BlockEntity be = context.getLevel() - .getBlockEntity(context.getClickedPos()); - if (be instanceof GeneratingKineticBlockEntity) { - ((GeneratingKineticBlockEntity) be).reActivateSource = true; - } - - if (world.getBlockState(context.getClickedPos()) != state) - playRotateSound(world, context.getClickedPos()); + if (level.getBlockState(pos) != state) + playRotateSound(level, pos); return InteractionResult.SUCCESS; } @@ -79,12 +72,12 @@ public interface IWrenchable { return InteractionResult.SUCCESS; } - default void playRemoveSound(Level world, BlockPos pos) { - AllSoundEvents.WRENCH_REMOVE.playOnServer(world, pos, 1, Create.RANDOM.nextFloat() * .5f + .5f); + static void playRemoveSound(Level level, BlockPos pos) { + AllSoundEvents.WRENCH_REMOVE.playOnServer(level, pos, 1, Create.RANDOM.nextFloat() * .5f + .5f); } - default void playRotateSound(Level world, BlockPos pos) { - AllSoundEvents.WRENCH_ROTATE.playOnServer(world, pos, 1, Create.RANDOM.nextFloat() + .5f); + static void playRotateSound(Level level, BlockPos pos) { + AllSoundEvents.WRENCH_ROTATE.playOnServer(level, pos, 1, Create.RANDOM.nextFloat() + .5f); } default BlockState getRotatedBlockState(BlockState originalState, Direction targetedFace) { diff --git a/src/main/java/com/simibubi/create/content/fluids/pump/PumpBlock.java b/src/main/java/com/simibubi/create/content/fluids/pump/PumpBlock.java index 9fc083254d..276ab112ef 100644 --- a/src/main/java/com/simibubi/create/content/fluids/pump/PumpBlock.java +++ b/src/main/java/com/simibubi/create/content/fluids/pump/PumpBlock.java @@ -18,7 +18,6 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.util.RandomSource; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.context.BlockPlaceContext; -import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; @@ -51,11 +50,6 @@ public class PumpBlock extends DirectionalKineticBlock .getOpposite()); } - @Override - public BlockState updateAfterWrenched(BlockState newState, UseOnContext context) { - return super.updateAfterWrenched(newState, context); - } - @Override public Axis getRotationAxis(BlockState state) { return state.getValue(FACING) diff --git a/src/main/java/com/simibubi/create/content/kinetics/base/KineticBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/base/KineticBlockEntity.java index afdb20fc7f..f164a1b6a6 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/base/KineticBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/base/KineticBlockEntity.java @@ -393,6 +393,10 @@ public class KineticBlockEntity extends SmartBlockEntity implements IHaveGoggleI kineticBlockEntity.removeSource(); } + if (blockEntity instanceof GeneratingKineticBlockEntity generatingBlockEntity) { + generatingBlockEntity.reActivateSource = true; + } + world.setBlock(pos, state, 3); } diff --git a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogwheelBlock.java b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogwheelBlock.java index a1b605e12e..a1e5d2b729 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogwheelBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogwheelBlock.java @@ -7,6 +7,7 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.ITransformableBlock; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.decoration.encasing.EncasedBlock; +import com.simibubi.create.content.equipment.wrench.IWrenchable; import com.simibubi.create.content.kinetics.base.IRotate; import com.simibubi.create.content.kinetics.base.KineticBlockEntity; import com.simibubi.create.content.kinetics.base.RotatedPillarKineticBlock; @@ -107,7 +108,7 @@ public class EncasedCogwheelBlock extends RotatedPillarKineticBlock BlockPos pos = context.getClickedPos(); KineticBlockEntity.switchToBlockState(level, pos, state.cycle(context.getClickedFace() .getAxisDirection() == AxisDirection.POSITIVE ? TOP_SHAFT : BOTTOM_SHAFT)); - playRotateSound(level, pos); + IWrenchable.playRotateSound(level, pos); return InteractionResult.SUCCESS; } diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java index 8a8a0cc3db..3553937019 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java @@ -148,7 +148,7 @@ public class FactoryPanelBlock extends FaceAttachedHorizontalDirectionalBlock player.getInventory() .placeItemBackInInventory(AllBlocks.FACTORY_GAUGE.asStack()); - playRemoveSound(world, pos); + IWrenchable.playRemoveSound(world, pos); if (be.activePanels() == 0) world.destroyBlock(pos, false); diff --git a/src/main/java/com/simibubi/create/content/trains/station/StationBlockEntity.java b/src/main/java/com/simibubi/create/content/trains/station/StationBlockEntity.java index 696332a314..24981d3c6f 100644 --- a/src/main/java/com/simibubi/create/content/trains/station/StationBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/trains/station/StationBlockEntity.java @@ -27,6 +27,7 @@ import com.simibubi.create.content.contraptions.AssemblyException; import com.simibubi.create.content.contraptions.ITransformableBlockEntity; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.decoration.slidingDoor.DoorControlBehaviour; +import com.simibubi.create.content.equipment.wrench.IWrenchable; import com.simibubi.create.content.logistics.depot.DepotBehaviour; import com.simibubi.create.content.logistics.packagePort.PackagePortBlockEntity; import com.simibubi.create.content.logistics.packagePort.postbox.PostboxBlockEntity; @@ -314,7 +315,7 @@ public class StationBlockEntity extends SmartBlockEntity implements ITransformab if (!(newEntity instanceof AbstractBogeyBlockEntity newBE)) continue; newBE.setBogeyData(oldData); - bogey.playRotateSound(level, bogeyPos); + IWrenchable.playRotateSound(level, bogeyPos); return true; } } @@ -476,7 +477,7 @@ public class StationBlockEntity extends SmartBlockEntity implements ITransformab itemEntity.setDeltaMovement(Vec3.ZERO); getLevel().addFreshEntity(itemEntity); } - + public void updateMapColor(int color) { GlobalStation station = getStation(); if (station == null) @@ -979,7 +980,7 @@ public class StationBlockEntity extends SmartBlockEntity implements ITransformab if (ppbe instanceof PostboxBlockEntity pbe) pbe.trackedGlobalStation = new WeakReference(station); - + if (station.connectedPorts.containsKey(ppbe.getBlockPos())) restoreOfflineBuffer(ppbe, station.connectedPorts.get(ppbe.getBlockPos())); diff --git a/src/main/java/com/simibubi/create/foundation/fluid/FluidRenderer.java b/src/main/java/com/simibubi/create/foundation/fluid/FluidRenderer.java index 59fe5d5c75..e0406dd7f8 100644 --- a/src/main/java/com/simibubi/create/foundation/fluid/FluidRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/fluid/FluidRenderer.java @@ -4,14 +4,12 @@ import java.util.function.Function; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; -import com.simibubi.create.foundation.render.RenderTypes; import dev.engine_room.flywheel.lib.transform.TransformStack; import net.createmod.catnip.utility.BasicFluidRenderer; import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.core.Direction; import net.minecraft.resources.ResourceLocation; @@ -29,7 +27,7 @@ public class FluidRenderer extends BasicFluidRenderer { public static void renderFluidStream(FluidStack fluidStack, Direction direction, float radius, float progress, boolean inbound, MultiBufferSource buffer, PoseStack ms, int light) { - renderFluidStream(fluidStack, direction, radius, progress, inbound, buffer.getBuffer(RenderTypes.fluid()), ms, light); + renderFluidStream(fluidStack, direction, radius, progress, inbound, getFluidBuilder(buffer), ms, light); } public static void renderFluidStream(FluidStack fluidStack, Direction direction, float radius, float progress, From bdd51e349e033863bbe0cdaf826b9168342dbc30 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 8 Nov 2024 16:20:34 +0100 Subject: [PATCH 115/515] You must play for this - Fixed stock ticker returning payments client side - Fixed package sneak right click voiding items - Fixed factory gauge not using an item when added to a block space - Halved cost of conveyor chain connections, added a chain recipe using zinc - Made stock keeper screen more resistant to issues with low tps and latency - Item hatch deposits held item before inventory - Fixed funnels not able to extract when any entity is nearby, even glue - Cardboard box no longer renders in first person mode - Fixed stock keeper not telling item durability - Pulp recipe is now more generous - Fixed server startup issue with new bogey registration - Fully emptied stacks in stock keeper view will show as empty slots --- build.gradle | 4 +- gradle.properties | 6 +-- .../82992cbf8f2794d83ac94034835eac0acd7915b9 | 4 +- .../b256105d8411632b0d585496ea8944a751a08034 | 4 +- .../crafting/appliances/chain_from_zinc.json | 33 ++++++++++++ .../crafting/appliances/chain_from_zinc.json | 21 ++++++++ .../create/recipes/mixing/cardboard_pulp.json | 17 +------ .../com/simibubi/create/AllBogeyStyles.java | 4 +- .../armor/CardboardArmorHandlerClient.java | 6 +++ .../bell/CustomRotationParticle.java | 4 +- .../ChainConveyorBlockEntity.java | 2 +- .../content/logistics/box/PackageItem.java | 51 ++++++++++--------- .../factoryBoard/FactoryPanelBlock.java | 21 ++++++-- .../FactoryPanelEffectPacket.java | 24 +++++---- .../logistics/funnel/FunnelBlockEntity.java | 7 +-- .../logistics/itemHatch/ItemHatchBlock.java | 6 ++- .../LogisticallyLinkedBehaviour.java | 2 +- .../LogisticalStockResponsePacket.java | 2 +- .../StockKeeperOpenRequestScreenPacket.java | 20 ++++---- .../stockTicker/StockTickerBlock.java | 2 +- .../stockTicker/StockTickerRequestScreen.java | 27 +++++++--- .../content/trains/bogey/BogeyStyle.java | 10 ++-- .../data/recipe/MixingRecipeGen.java | 7 +-- .../data/recipe/StandardRecipeGen.java | 10 +++- .../foundation/fluid/FluidRenderer.java | 4 +- .../create/foundation/render/RenderTypes.java | 14 ----- .../infrastructure/command/AllCommands.java | 2 +- 27 files changed, 195 insertions(+), 119 deletions(-) create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/appliances/chain_from_zinc.json create mode 100644 src/generated/resources/data/create/recipes/crafting/appliances/chain_from_zinc.json diff --git a/build.gradle b/build.gradle index b00694a74d..567109336a 100644 --- a/build.gradle +++ b/build.gradle @@ -51,7 +51,7 @@ mixin { config 'flywheel.backend.mixins.json' config 'flywheel.impl.mixins.json' - config 'flywheel.impl.sodium.mixins.json' +// config 'flywheel.impl.sodium.mixins.json' config 'create.mixins.json' debug.verbose = true @@ -126,7 +126,7 @@ minecraft { arg '-mixin.config=flywheel.backend.mixins.json' arg '-mixin.config=flywheel.impl.mixins.json' - arg '-mixin.config=flywheel.impl.sodium.mixins.json' +// arg '-mixin.config=flywheel.impl.sodium.mixins.json' } server { diff --git a/gradle.properties b/gradle.properties index c7a0108638..b922e9a094 100644 --- a/gradle.properties +++ b/gradle.properties @@ -23,13 +23,13 @@ use_parchment = true # dependency versions registrate_version = MC1.20-1.3.3 flywheel_minecraft_version = 1.20.1 -flywheel_version = 1.0.0-beta-145 +flywheel_version = 1.0.0-beta-154 jei_minecraft_version = 1.20.1 jei_version = 15.10.0.39 curios_minecraft_version = 1.20.1 curios_version = 5.3.1 -catnip_version = 0.8.17 -ponder_version = 0.8.11 +catnip_version = 0.8.20 +ponder_version = 0.8.12 cc_tweaked_enable = true cc_tweaked_minecraft_version = 1.20.1 diff --git a/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 b/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 index 436e2cc535..7fce810441 100644 --- a/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 +++ b/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 @@ -1,4 +1,4 @@ -// 1.20.1 2024-11-05T22:14:55.6025876 Create's Standard Recipes +// 1.20.1 2024-11-08T10:52:38.0073058 Create's Standard Recipes a8cc4af26f6c7c45a9eef12e92af1452fe042454 data/create/advancements/recipes/combat/crafting/appliances/netherite_backtank.json 2c2639c7b307ee7c7a4e97e5efebf496788998ad data/create/advancements/recipes/combat/crafting/appliances/netherite_backtank_from_netherite.json 81dcf0cb1aa99e39bc7d1a386e07cad4cee7d8b9 data/create/advancements/recipes/combat/crafting/appliances/netherite_diving_boots.json @@ -40,6 +40,7 @@ b90af96817d6c38ec446f7464642a473a55c2027 data/create/advancements/recipes/misc/b 6a0d06d354aa7f81e6141a03aeef9a51d03e3cd4 data/create/advancements/recipes/misc/crafting/appliances/cardboard_helmet.json dd3d469cc9899f3f7299cbd6903a2b541df5c7ff data/create/advancements/recipes/misc/crafting/appliances/cardboard_leggings.json f94a848698e7e52e0fb15b240a4e0ef89a3974fd data/create/advancements/recipes/misc/crafting/appliances/cardboard_sword.json +52f97cc60de343ce7980113b2b458376dd8cbd74 data/create/advancements/recipes/misc/crafting/appliances/chain_from_zinc.json 8b0f0b4342adbd3466c81298c87b5ed8993c3636 data/create/advancements/recipes/misc/crafting/appliances/clipboard.json 42f06a32b53c954a54fa1d5ffb1afd2e161cbde2 data/create/advancements/recipes/misc/crafting/appliances/clipboard_clear.json 6fa2794d2d8d8d5ffeea22701862d79578adf7f2 data/create/advancements/recipes/misc/crafting/appliances/copper_backtank.json @@ -307,6 +308,7 @@ b42fe3c262a33657b098b036ae0864af988b9f10 data/create/recipes/crafting/appliances efbfccade226b34d22abb77138dab8726725752e data/create/recipes/crafting/appliances/cardboard_helmet.json 1f49a67c1698a56cfd017a9e89a17c640052e1e3 data/create/recipes/crafting/appliances/cardboard_leggings.json c063d8143b5f93b258b2e5ce7c8b828af6a49e93 data/create/recipes/crafting/appliances/cardboard_sword.json +cbd0357cfa7afdd877b6e772cad34df7e19a2ad3 data/create/recipes/crafting/appliances/chain_from_zinc.json 66c24da136abee4521d788df83f55b1c224d19fe data/create/recipes/crafting/appliances/clipboard.json 28d1dabd689b855964151100a80247b2ea150bd4 data/create/recipes/crafting/appliances/clipboard_clear.json 97932adf38574c2baf0ed2d5e3d62e7514e0c2bf data/create/recipes/crafting/appliances/copper_backtank.json diff --git a/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 b/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 index f7b9a0c89e..4d079592c9 100644 --- a/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 +++ b/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 @@ -1,4 +1,4 @@ -// 1.20.1 2024-11-05T22:14:55.5116289 Create's Processing Recipes +// 1.20.1 2024-11-08T15:43:24.6478256 Create's Processing Recipes 3c94326fb730f68c1e44fe1e2ef09c9db6ffd92b data/create/recipes/compacting/andesite_from_flint.json 8d3d5b31f3601b9f681ff710e0545a483a1494c6 data/create/recipes/compacting/blaze_cake.json 8bd7f4e3a686ab520b2d55594d2018d0e9a50c91 data/create/recipes/compacting/chocolate.json @@ -969,7 +969,7 @@ a91dae829938d3f69a7007d3cf8db02b70fe3a7f data/create/recipes/milling/white_tulip 5f1b8a82af091cd4589ecfa5c13a4db6ad9c51b9 data/create/recipes/mixing/andesite_alloy.json 48604c2205b18fe1401eac58d14aa1677cbd9c2b data/create/recipes/mixing/andesite_alloy_from_zinc.json d06c1d0362dccc4e5f8b22f851dc8316b35c06b0 data/create/recipes/mixing/brass_ingot.json -4a27a38be383bf9561658f8498905eef28ca7ddb data/create/recipes/mixing/cardboard_pulp.json +84a789f57691cb1e515f98cb162d7eda416eae7a data/create/recipes/mixing/cardboard_pulp.json 840a9008d4531425beadfcf224d21e938acc4502 data/create/recipes/mixing/chocolate.json e7b86d4ca5de2df474794424d93b447e5f9dcdc3 data/create/recipes/mixing/chocolate_melting.json 39e832016fa5e360434271505d09ced17a40e7eb data/create/recipes/mixing/compat/ae2/fluix_crystal.json diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/appliances/chain_from_zinc.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/appliances/chain_from_zinc.json new file mode 100644 index 0000000000..f4e6f1def5 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/appliances/chain_from_zinc.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "tag": "forge:ingots/zinc" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/appliances/chain_from_zinc" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/appliances/chain_from_zinc" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/appliances/chain_from_zinc.json b/src/generated/resources/data/create/recipes/crafting/appliances/chain_from_zinc.json new file mode 100644 index 0000000000..5808314ab5 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/appliances/chain_from_zinc.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "C": { + "tag": "forge:ingots/zinc" + }, + "S": { + "tag": "forge:nuggets/zinc" + } + }, + "pattern": [ + "S", + "C", + "S" + ], + "result": { + "item": "minecraft:chain" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/mixing/cardboard_pulp.json b/src/generated/resources/data/create/recipes/mixing/cardboard_pulp.json index c1a9383d8a..e79f9ddf5e 100644 --- a/src/generated/resources/data/create/recipes/mixing/cardboard_pulp.json +++ b/src/generated/resources/data/create/recipes/mixing/cardboard_pulp.json @@ -14,22 +14,7 @@ "tag": "create:pulpifiable" }, { - "tag": "create:pulpifiable" - }, - { - "tag": "create:pulpifiable" - }, - { - "tag": "create:pulpifiable" - }, - { - "tag": "create:pulpifiable" - }, - { - "tag": "create:pulpifiable" - }, - { - "amount": 1000, + "amount": 250, "fluid": "minecraft:water", "nbt": {} } diff --git a/src/main/java/com/simibubi/create/AllBogeyStyles.java b/src/main/java/com/simibubi/create/AllBogeyStyles.java index c558e4f7a9..ee82c4067e 100644 --- a/src/main/java/com/simibubi/create/AllBogeyStyles.java +++ b/src/main/java/com/simibubi/create/AllBogeyStyles.java @@ -24,8 +24,8 @@ public class AllBogeyStyles { public static final BogeyStyle STANDARD = builder("standard", STANDARD_CYCLE_GROUP).displayName(Components.translatable("create.bogey.style.standard")) - .size(BogeySizes.SMALL, AllBlocks.SMALL_BOGEY, () -> new SizeRenderer(new StandardBogeyRenderer.Small(), StandardBogeyVisual.Small::new)) - .size(BogeySizes.LARGE, AllBlocks.LARGE_BOGEY, () -> new SizeRenderer(new StandardBogeyRenderer.Large(), StandardBogeyVisual.Large::new)) + .size(BogeySizes.SMALL, AllBlocks.SMALL_BOGEY, () -> () -> new SizeRenderer(new StandardBogeyRenderer.Small(), StandardBogeyVisual.Small::new)) + .size(BogeySizes.LARGE, AllBlocks.LARGE_BOGEY, () -> () -> new SizeRenderer(new StandardBogeyRenderer.Large(), StandardBogeyVisual.Large::new)) .build(); public static Map getCycleGroup(ResourceLocation cycleGroup) { diff --git a/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorHandlerClient.java b/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorHandlerClient.java index 56eddb14f2..cd61dee774 100644 --- a/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorHandlerClient.java +++ b/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorHandlerClient.java @@ -12,6 +12,8 @@ import com.simibubi.create.content.logistics.box.PackageRenderer; import dev.engine_room.flywheel.lib.model.baked.PartialModel; import net.createmod.catnip.utility.AnimationTickHolder; +import net.minecraft.client.CameraType; +import net.minecraft.client.Minecraft; import net.minecraft.util.Mth; import net.minecraft.world.entity.player.Player; import net.minecraftforge.api.distmarker.Dist; @@ -51,6 +53,10 @@ public class CardboardArmorHandlerClient { event.setCanceled(true); + if (player == Minecraft.getInstance().player + && Minecraft.getInstance().options.getCameraType() == CameraType.FIRST_PERSON) + return; + PoseStack ms = event.getPoseStack(); ms.pushPose(); ms.translate(0, 2 / 16f, 0); diff --git a/src/main/java/com/simibubi/create/content/equipment/bell/CustomRotationParticle.java b/src/main/java/com/simibubi/create/content/equipment/bell/CustomRotationParticle.java index 227b68f7e0..f0de0c17a7 100644 --- a/src/main/java/com/simibubi/create/content/equipment/bell/CustomRotationParticle.java +++ b/src/main/java/com/simibubi/create/content/equipment/bell/CustomRotationParticle.java @@ -6,7 +6,7 @@ import org.joml.Vector3f; import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.math.Axis; -import dev.engine_room.flywheel.lib.util.ShadersModHandler; +import dev.engine_room.flywheel.lib.util.ShadersModHelper; import net.minecraft.client.Camera; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.particle.SimpleAnimatedParticle; @@ -65,7 +65,7 @@ public class CustomRotationParticle extends SimpleAnimatedParticle { float maxU = mirror ? getU0() : getU1(); float minV = getV0(); float maxV = getV1(); - int brightness = ShadersModHandler.isShaderPackInUse() ? LightTexture.pack(12, 15) : getLightColor(partialTicks); + int brightness = ShadersModHelper.isShaderPackInUse() ? LightTexture.pack(12, 15) : getLightColor(partialTicks); builder.vertex(vertices[0].x(), vertices[0].y(), vertices[0].z()).uv(maxU, maxV).color(rCol, gCol, bCol, alpha).uv2(brightness).endVertex(); builder.vertex(vertices[1].x(), vertices[1].y(), vertices[1].z()).uv(maxU, minV).color(rCol, gCol, bCol, alpha).uv2(brightness).endVertex(); builder.vertex(vertices[2].x(), vertices[2].y(), vertices[2].z()).uv(minU, minV).color(rCol, gCol, bCol, alpha).uv2(brightness).endVertex(); diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java index 15e2784a78..1a1bc9ad2a 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java @@ -663,7 +663,7 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity { public static int getChainCost(BlockPos connection) { return (int) Math.max(Math.round(Vec3.atLowerCornerOf(connection) - .length() / 1.25), 1); + .length() / 2.5), 1); } public static boolean getChainsFromInventory(Player player, ItemStack chain, int cost, boolean simulate) { diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java index c02a9f9170..943fe27f4b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java @@ -249,39 +249,41 @@ public class PackageItem extends Item { public InteractionResultHolder open(Level worldIn, Player playerIn, InteractionHand handIn) { ItemStack box = playerIn.getItemInHand(handIn); ItemStackHandler contents = getContents(box); - ItemStack particle = box.copy(); - box.shrink(1); + box = box.copyWithCount(box.getCount() - 1); if (box.isEmpty()) - playerIn.getInventory() - .removeItem(box); + box = ItemStack.EMPTY; - for (int i = 0; i < contents.getSlots(); i++) { - ItemStack itemstack = contents.getStackInSlot(i); + playerIn.setItemInHand(handIn, box); - if (itemstack.getItem() instanceof SpawnEggItem sei && worldIn instanceof ServerLevel sl) { - EntityType entitytype = sei.getType(itemstack.getTag()); - Entity entity = entitytype.spawn(sl, itemstack, null, BlockPos.containing(playerIn.position() - .add(playerIn.getLookAngle() - .multiply(1, 0, 1) - .normalize())), - MobSpawnType.SPAWN_EGG, false, false); - if (entity != null) - itemstack.shrink(1); + if (!worldIn.isClientSide()) { + for (int i = 0; i < contents.getSlots(); i++) { + ItemStack itemstack = contents.getStackInSlot(i); + + if (itemstack.getItem() instanceof SpawnEggItem sei && worldIn instanceof ServerLevel sl) { + EntityType entitytype = sei.getType(itemstack.getTag()); + Entity entity = entitytype.spawn(sl, itemstack, null, BlockPos.containing(playerIn.position() + .add(playerIn.getLookAngle() + .multiply(1, 0, 1) + .normalize())), + MobSpawnType.SPAWN_EGG, false, false); + if (entity != null) + itemstack.shrink(1); + } + + if (itemstack.isEmpty()) + continue; + playerIn.getInventory() + .placeItemBackInInventory(itemstack); } - - if (itemstack.isEmpty()) - continue; - playerIn.getInventory() - .placeItemBackInInventory(itemstack); } Vec3 position = playerIn.position(); worldIn.playSound((Player) null, position.x, position.y, position.z, SoundEvents.ARMOR_STAND_BREAK, SoundSource.PLAYERS, 0.5F, 1.0F); - if (worldIn.isClientSide()) + if (worldIn.isClientSide()) { for (int i = 0; i < 10; i++) { Vec3 motion = VecHelper.offsetRandomly(Vec3.ZERO, worldIn.getRandom(), .125f); Vec3 pos = position.add(0, 0.5, 0) @@ -291,14 +293,15 @@ public class PackageItem extends Item { worldIn.addParticle(new ItemParticleOption(ParticleTypes.ITEM, particle), pos.x, pos.y, pos.z, motion.x, motion.y, motion.z); } + } - return new InteractionResultHolder<>(InteractionResult.SUCCESS, box); + return new InteractionResultHolder<>(InteractionResult.SUCCESS, playerIn.getItemInHand(handIn)); } @Override public InteractionResult useOn(UseOnContext context) { if (context.getPlayer() - .isSteppingCarefully()) + .isShiftKeyDown()) return open(context.getLevel(), context.getPlayer(), context.getHand()).getResult(); Vec3 point = context.getClickLocation(); @@ -331,7 +334,7 @@ public class PackageItem extends Item { @Override public InteractionResultHolder use(Level world, Player player, InteractionHand hand) { - if (player.isSteppingCarefully()) + if (player.isShiftKeyDown()) return open(world, player, hand); ItemStack itemstack = player.getItemInHand(hand); player.startUsingItem(hand); diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java index 8a8a0cc3db..c08cac6c25 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java @@ -1,5 +1,7 @@ package com.simibubi.create.content.logistics.factoryBoard; +import java.util.UUID; + import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; @@ -112,10 +114,21 @@ public class FactoryPanelBlock extends FaceAttachedHorizontalDirectionalBlock Vec3 location = pContext.getClickLocation(); if (blockState.is(this) && location != null && fpbe != null && !level.isClientSide()) { - if (fpbe.addPanel(getTargetedSlot(pos, blockState, location), - LogisticallyLinkedBlockItem.networkFromStack(pContext.getItemInHand())) && pContext.getPlayer() != null) - pContext.getPlayer() - .displayClientMessage(CreateLang.translateDirect("logistically_linked.connected"), true); + PanelSlot targetedSlot = getTargetedSlot(pos, blockState, location); + UUID networkFromStack = LogisticallyLinkedBlockItem.networkFromStack(pContext.getItemInHand()); + Player pPlayer = pContext.getPlayer(); + + if (fpbe.addPanel(targetedSlot, networkFromStack) && pPlayer != null) { + pPlayer.displayClientMessage(CreateLang.translateDirect("logistically_linked.connected"), true); + + if (!pPlayer.isCreative()) { + ItemStack item = pContext.getItemInHand(); + item.shrink(1); + if (item.isEmpty()) + pPlayer.setItemInHand(pContext.getHand(), ItemStack.EMPTY); + } + } + } return withWater(stateForPlacement, pContext); diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelEffectPacket.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelEffectPacket.java index 3f3a1110c2..fedd42d225 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelEffectPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelEffectPacket.java @@ -44,17 +44,19 @@ public class FactoryPanelEffectPacket extends SimplePacketBase { @Override @OnlyIn(Dist.CLIENT) public boolean handle(Context context) { - ClientLevel level = Minecraft.getInstance().level; - BlockState blockState = level.getBlockState(fromPos.pos()); - if (!AllBlocks.FACTORY_GAUGE.has(blockState)) - return true; - FactoryPanelBehaviour panelBehaviour = FactoryPanelBehaviour.at(level, toPos); - if (panelBehaviour != null) { - panelBehaviour.bulb.setValue(1); - FactoryPanelConnection connection = panelBehaviour.targetedBy.get(fromPos); - if (connection != null) - connection.success = success; - } + context.enqueueWork(() -> { + ClientLevel level = Minecraft.getInstance().level; + BlockState blockState = level.getBlockState(fromPos.pos()); + if (!AllBlocks.FACTORY_GAUGE.has(blockState)) + return; + FactoryPanelBehaviour panelBehaviour = FactoryPanelBehaviour.at(level, toPos); + if (panelBehaviour != null) { + panelBehaviour.bulb.setValue(1); + FactoryPanelConnection connection = panelBehaviour.targetedBy.get(fromPos); + if (connection != null) + connection.success = success; + } + }); return true; } } diff --git a/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelBlockEntity.java index 961e32765d..fa2070434c 100644 --- a/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelBlockEntity.java @@ -154,9 +154,10 @@ public class FunnelBlockEntity extends SmartBlockEntity implements IHaveHovering return; } for (Entity entity : level.getEntities(null, area)) { - if (entity instanceof ItemEntity || entity instanceof PackageEntity) + if (entity instanceof ItemEntity || entity instanceof PackageEntity) { lastObserved = new WeakReference<>(entity); - return; + return; + } } // Extract @@ -190,7 +191,7 @@ public class FunnelBlockEntity extends SmartBlockEntity implements IHaveHovering startCooldown(); } - static final AABB coreBB = new AABB(VecHelper.CENTER_OF_ORIGIN, VecHelper.CENTER_OF_ORIGIN).inflate(.75f); + static final AABB coreBB = new AABB(BlockPos.ZERO); private AABB getEntityOverflowScanningArea() { Direction facing = AbstractFunnelBlock.getFunnelFacing(getBlockState()); diff --git a/src/main/java/com/simibubi/create/content/logistics/itemHatch/ItemHatchBlock.java b/src/main/java/com/simibubi/create/content/logistics/itemHatch/ItemHatchBlock.java index 86fcff91fe..a5f3226075 100644 --- a/src/main/java/com/simibubi/create/content/logistics/itemHatch/ItemHatchBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/itemHatch/ItemHatchBlock.java @@ -90,9 +90,13 @@ public class ItemHatchBlock extends HorizontalDirectionalBlock implements IBE failedInsertions = new ArrayList<>(); boolean anyInserted = false; + boolean itemInHand = !pPlayer.getMainHandItem() + .isEmpty(); for (int i = 0; i < inventory.items.size(); i++) { - if (Inventory.isHotbarSlot(i)) + if (Inventory.isHotbarSlot(i) != itemInHand) + continue; + if (itemInHand && i != inventory.selected) continue; ItemStack item = inventory.getItem(i); if (item.isEmpty()) diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java index 7816e369e5..ab8375eaea 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java @@ -85,7 +85,7 @@ public class LogisticallyLinkedBehaviour extends BlockEntityBehaviour { try { Cache> cache = LINKS.get(behaviour.freqId, () -> CacheBuilder.newBuilder() - .expireAfterAccess(1, TimeUnit.SECONDS) + .expireAfterAccess(60, TimeUnit.SECONDS) .build()); if (cache == null) diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalStockResponsePacket.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalStockResponsePacket.java index d873c96890..eb5fb4d99e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalStockResponsePacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/LogisticalStockResponsePacket.java @@ -44,7 +44,7 @@ public class LogisticalStockResponsePacket extends SimplePacketBase { @Override public boolean handle(Context context) { - handleClient(); + context.enqueueWork(this::handleClient); return true; } diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperOpenRequestScreenPacket.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperOpenRequestScreenPacket.java index ed8b05d977..41e87326ab 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperOpenRequestScreenPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperOpenRequestScreenPacket.java @@ -42,15 +42,17 @@ public class StockKeeperOpenRequestScreenPacket extends SimplePacketBase { @Override @OnlyIn(Dist.CLIENT) public boolean handle(Context context) { - LocalPlayer player = Minecraft.getInstance().player; - if (player == null) - return true; - ItemStack mainHandItem = player.getMainHandItem(); - final boolean encodeMode = - AllItemTags.TABLE_CLOTHS.matches(mainHandItem) || AllBlocks.REDSTONE_REQUESTER.isIn(mainHandItem); - if (player.level() - .getBlockEntity(pos) instanceof StockTickerBlockEntity be) - ScreenOpener.open(new StockTickerRequestScreen(be, isAdmin, isLocked, encodeMode)); + context.enqueueWork(() -> { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) + return; + ItemStack mainHandItem = player.getMainHandItem(); + final boolean encodeMode = + AllItemTags.TABLE_CLOTHS.matches(mainHandItem) || AllBlocks.REDSTONE_REQUESTER.isIn(mainHandItem); + if (player.level() + .getBlockEntity(pos) instanceof StockTickerBlockEntity be) + ScreenOpener.open(new StockTickerRequestScreen(be, isAdmin, isLocked, encodeMode)); + }); return true; } diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlock.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlock.java index 6f0c71621e..0d4015c3a6 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlock.java @@ -62,7 +62,7 @@ public class StockTickerBlock extends HorizontalDirectionalBlock implements IBE< if (!stbe.behaviour.mayInteractMessage(pPlayer)) return InteractionResult.SUCCESS; - if (!stbe.receivedPayments.isEmpty()) { + if (!pLevel.isClientSide() && !stbe.receivedPayments.isEmpty()) { for (int i = 0; i < stbe.receivedPayments.getSlots(); i++) pPlayer.getInventory() .placeItemBackInInventory( diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java index 2d092c333d..644d397081 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java @@ -92,6 +92,8 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre private boolean isAdmin; private boolean isLocked; + private boolean refreshSearchNextTick; + public StockTickerRequestScreen(StockTickerBlockEntity be, boolean isAdmin, boolean isLocked, boolean encodeRequester) { super(be.getBlockState() @@ -111,6 +113,7 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre itemScroll = LerpedFloat.linear() .startWithValue(0); stockKeeper = new WeakReference(null); + refreshSearchNextTick = false; // Find the keeper for rendering for (int yOffset : Iterate.zeroAndOne) { @@ -227,6 +230,9 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre categories.get(categoryIndex) .setSecond(categoryY); + if (displayedItems.size() <= categoryIndex) + break; + List displayedItemsInCategory = displayedItems.get(categoryIndex); for (BigItemStack entry : category) { ItemStack stack = entry.stack; @@ -300,6 +306,11 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre revalidateOrders(); } + if (refreshSearchNextTick) { + refreshSearchNextTick = false; + refreshSearchResults(true); + } + itemScroll.tickChaser(); if (Math.abs(itemScroll.getValue() - itemScroll.getChaseTarget()) < 1 / 16f) itemScroll.setValue(itemScroll.getChaseTarget()); @@ -558,12 +569,16 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre ms.scale(scale, scale, scale); ms.scale(scaleFromHover, scaleFromHover, scaleFromHover); ms.translate(-18 / 2.0, -18 / 2.0, 0); - GuiGameElement.of(entry.stack) - .render(graphics); + if (customCount != 0) + GuiGameElement.of(entry.stack) + .render(graphics); ms.popPose(); ms.pushPose(); - ms.translate(0, 0, 200); + ms.translate(0, 0, 190); + if (customCount != 0) + graphics.renderItemDecorations(font, entry.stack, 1, 1, ""); + ms.translate(0, 0, 10); drawItemCount(graphics, entry.count, customCount); ms.popPose(); } @@ -750,7 +765,7 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre if (rmb && searchBox.isMouseOver(pMouseX, pMouseY)) { searchBox.setValue(""); - refreshSearchResults(true); + refreshSearchNextTick = true; searchBox.setFocused(true); return true; } @@ -837,7 +852,7 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre if (!searchBox.charTyped(pCodePoint, pModifiers)) return false; if (!Objects.equals(s, searchBox.getValue())) - refreshSearchResults(true); + refreshSearchNextTick = true; return true; } @@ -861,7 +876,7 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre return searchBox.isFocused() && searchBox.isVisible() && pKeyCode != 256 ? true : super.keyPressed(pKeyCode, pScanCode, pModifiers); if (!Objects.equals(s, searchBox.getValue())) - refreshSearchResults(true); + refreshSearchNextTick = true; return true; } diff --git a/src/main/java/com/simibubi/create/content/trains/bogey/BogeyStyle.java b/src/main/java/com/simibubi/create/content/trains/bogey/BogeyStyle.java index 54316e437e..d0d95ab303 100644 --- a/src/main/java/com/simibubi/create/content/trains/bogey/BogeyStyle.java +++ b/src/main/java/com/simibubi/create/content/trains/bogey/BogeyStyle.java @@ -42,7 +42,7 @@ public class BogeyStyle { public BogeyStyle(ResourceLocation id, ResourceLocation cycleGroup, Component displayName, Supplier soundEvent, ParticleOptions contactParticle, ParticleOptions smokeParticle, CompoundTag defaultData, Map>> sizes, - Map> sizeRenderers) { + Map>> sizeRenderers) { this.id = id; this.cycleGroup = cycleGroup; @@ -55,7 +55,8 @@ public class BogeyStyle { DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { this.sizeRenderers = new HashMap<>(); - sizeRenderers.forEach((k, v) -> this.sizeRenderers.put(k, v.get())); + sizeRenderers.forEach((k, v) -> this.sizeRenderers.put(k, v.get() + .get())); }); } @@ -118,7 +119,8 @@ public class BogeyStyle { protected ParticleOptions smokeParticle = ParticleTypes.POOF; protected CompoundTag defaultData = new CompoundTag(); - protected final Map> sizeRenderers = new HashMap<>(); + protected final Map>> sizeRenderers = + new HashMap<>(); public Builder(ResourceLocation id, ResourceLocation cycleGroup) { this.id = id; @@ -151,7 +153,7 @@ public class BogeyStyle { } public Builder size(BogeySizes.BogeySize size, Supplier> block, - Supplier renderer) { + Supplier> renderer) { this.sizes.put(size, block); DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { this.sizeRenderers.put(size, renderer); diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/MixingRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/MixingRecipeGen.java index ecc2212411..5a55108ee0 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/MixingRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/MixingRecipeGen.java @@ -69,12 +69,7 @@ public class MixingRecipeGen extends ProcessingRecipeGen { .require(AllItemTags.PULPIFIABLE.tag) .require(AllItemTags.PULPIFIABLE.tag) .require(AllItemTags.PULPIFIABLE.tag) - .require(AllItemTags.PULPIFIABLE.tag) - .require(AllItemTags.PULPIFIABLE.tag) - .require(AllItemTags.PULPIFIABLE.tag) - .require(AllItemTags.PULPIFIABLE.tag) - .require(AllItemTags.PULPIFIABLE.tag) - .require(Fluids.WATER, 1000) + .require(Fluids.WATER, 250) .output(AllItems.PULP, 1)), // AE2 diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java index 0ea2813832..9b9ec4ab63 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java @@ -323,7 +323,7 @@ public class StandardRecipeGen extends CreateRecipeProvider { .pattern("C") .pattern("S") .pattern("I")), - + MECHANICAL_PISTON = create(AllBlocks.MECHANICAL_PISTON).unlockedBy(I::andesiteCasing) .viaShaped(b -> b.define('B', ItemTags.WOODEN_SLABS) .define('C', I.andesiteCasing()) @@ -1161,6 +1161,14 @@ public class StandardRecipeGen extends CreateRecipeProvider { .viaShapeless(b -> b.requires(I.wheatFlour()) .requires(Items.WATER_BUCKET)), + CHAIN_FROM_ZINC = create(() -> Items.CHAIN).withSuffix("_from_zinc") + .unlockedByTag(I::zinc) + .viaShaped(b -> b.define('C', I.zinc()) + .define('S', I.zincNugget()) + .pattern("S") + .pattern("C") + .pattern("S")), + CLIPBOARD = create(AllBlocks.CLIPBOARD).unlockedBy(I::andesiteAlloy) .viaShaped(b -> b.define('G', I.planks()) .define('P', Items.PAPER) diff --git a/src/main/java/com/simibubi/create/foundation/fluid/FluidRenderer.java b/src/main/java/com/simibubi/create/foundation/fluid/FluidRenderer.java index 59fe5d5c75..e0406dd7f8 100644 --- a/src/main/java/com/simibubi/create/foundation/fluid/FluidRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/fluid/FluidRenderer.java @@ -4,14 +4,12 @@ import java.util.function.Function; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; -import com.simibubi.create.foundation.render.RenderTypes; import dev.engine_room.flywheel.lib.transform.TransformStack; import net.createmod.catnip.utility.BasicFluidRenderer; import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.core.Direction; import net.minecraft.resources.ResourceLocation; @@ -29,7 +27,7 @@ public class FluidRenderer extends BasicFluidRenderer { public static void renderFluidStream(FluidStack fluidStack, Direction direction, float radius, float progress, boolean inbound, MultiBufferSource buffer, PoseStack ms, int light) { - renderFluidStream(fluidStack, direction, radius, progress, inbound, buffer.getBuffer(RenderTypes.fluid()), ms, light); + renderFluidStream(fluidStack, direction, radius, progress, inbound, getFluidBuilder(buffer), ms, light); } public static void renderFluidStream(FluidStack fluidStack, Direction direction, float radius, float progress, diff --git a/src/main/java/com/simibubi/create/foundation/render/RenderTypes.java b/src/main/java/com/simibubi/create/foundation/render/RenderTypes.java index 0f86d06f9e..3d58ce4cbc 100644 --- a/src/main/java/com/simibubi/create/foundation/render/RenderTypes.java +++ b/src/main/java/com/simibubi/create/foundation/render/RenderTypes.java @@ -62,16 +62,6 @@ public class RenderTypes extends RenderStateShard { .setOverlayState(OVERLAY) .createCompositeState(true)); - private static final RenderType FLUID = RenderType.create(createLayerName("fluid"), - DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, false, true, RenderType.CompositeState.builder() - .setShaderState(RENDERTYPE_ENTITY_TRANSLUCENT_CULL_SHADER) - .setTextureState(BLOCK_SHEET_MIPPED) - .setCullState(NO_CULL) - .setTransparencyState(TRANSLUCENT_TRANSPARENCY) - .setLightmapState(LIGHTMAP) - .setOverlayState(OVERLAY) - .createCompositeState(true)); - private static final RenderType ITEM_GLOWING_SOLID = RenderType.create(createLayerName("item_glowing_solid"), DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, true, false, RenderType.CompositeState.builder() .setShaderState(GLOWING_SHADER) @@ -130,10 +120,6 @@ public class RenderTypes extends RenderStateShard { VertexFormat.Mode.QUADS, 256, false, true, rendertype$state); } - public static RenderType fluid() { - return FLUID; - } - public static RenderType itemGlowingSolid() { return ITEM_GLOWING_SOLID; } diff --git a/src/main/java/com/simibubi/create/infrastructure/command/AllCommands.java b/src/main/java/com/simibubi/create/infrastructure/command/AllCommands.java index d30753e9eb..5d1986d8bb 100644 --- a/src/main/java/com/simibubi/create/infrastructure/command/AllCommands.java +++ b/src/main/java/com/simibubi/create/infrastructure/command/AllCommands.java @@ -60,7 +60,7 @@ public class AllCommands { .then(CameraDistanceCommand.register()) .then(CameraAngleCommand.register()) //.then(DebugValueCommand.register()) - //.then(KillTPSCommand.register()) + .then(KillTPSCommand.register()) .build(); } From 71a0a6e28f4ad5878d71a9def04ddec02030eda4 Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Fri, 8 Nov 2024 10:25:23 -0800 Subject: [PATCH 116/515] Twofold bump - Bump flywheel version to fix visual issues and crashes --- build.gradle | 9 --------- gradle.properties | 2 +- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/build.gradle b/build.gradle index 7cd2b3ecb1..e61210d3b7 100644 --- a/build.gradle +++ b/build.gradle @@ -49,11 +49,6 @@ println "Java: ${System.getProperty 'java.version'}, JVM: ${System.getProperty ' mixin { add sourceSets.main, 'create.refmap.json' - config 'flywheel.backend.mixins.json' - config 'flywheel.impl.mixins.json' - //config 'flywheel.impl.sodium.mixins.json' - config 'create.mixins.json' - debug.verbose = true debug.export = true } @@ -123,10 +118,6 @@ minecraft { client { workingDirectory project.file('run') - - arg '-mixin.config=flywheel.backend.mixins.json' - arg '-mixin.config=flywheel.impl.mixins.json' - //arg '-mixin.config=flywheel.impl.sodium.mixins.json' } server { diff --git a/gradle.properties b/gradle.properties index b922e9a094..6c5381162c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -23,7 +23,7 @@ use_parchment = true # dependency versions registrate_version = MC1.20-1.3.3 flywheel_minecraft_version = 1.20.1 -flywheel_version = 1.0.0-beta-154 +flywheel_version = 1.0.0-beta-158 jei_minecraft_version = 1.20.1 jei_version = 15.10.0.39 curios_minecraft_version = 1.20.1 From 1ea0af468128640a4ccbe6e247882a7c5136aeeb Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Fri, 8 Nov 2024 14:12:21 -0800 Subject: [PATCH 117/515] The origin of all troubles - Fix contraptions appearing at the wrong place --- .../content/contraptions/render/ContraptionVisual.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionVisual.java b/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionVisual.java index b0d03ed6a3..c86cbc5095 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionVisual.java +++ b/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionVisual.java @@ -183,9 +183,10 @@ public class ContraptionVisual extends Abst } private void setEmbeddingMatrices(float partialTick) { - double x = Mth.lerp(partialTick, entity.xOld, entity.getX()); - double y = Mth.lerp(partialTick, entity.yOld, entity.getY()); - double z = Mth.lerp(partialTick, entity.zOld, entity.getZ()); + var origin = renderOrigin(); + double x = Mth.lerp(partialTick, entity.xOld, entity.getX()) - origin.getX(); + double y = Mth.lerp(partialTick, entity.yOld, entity.getY()) - origin.getY(); + double z = Mth.lerp(partialTick, entity.zOld, entity.getZ()) - origin.getZ(); contraptionMatrix.setIdentity(); contraptionMatrix.translate(x, y, z); From 1d0391522557af34dcf67f29f04ebb16518e3eeb Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Sat, 9 Nov 2024 15:28:41 +0100 Subject: [PATCH 118/515] Funnel fix --- .../simibubi/create/content/logistics/funnel/FunnelBlock.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelBlock.java index e159de86b6..6bf909ff63 100644 --- a/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelBlock.java @@ -125,7 +125,7 @@ public abstract class FunnelBlock extends AbstractDirectionalFunnelBlock { Direction direction = getFunnelFacing(state); Vec3 openPos = VecHelper.getCenterOf(pos) .add(Vec3.atLowerCornerOf(direction.getNormal()) - .scale(-.125f)); + .scale(entityIn instanceof ItemEntity ? -.25f : -.125f)); Vec3 diff = entityIn.position() .subtract(openPos); double projectedDiff = direction.getAxis() From 7ac52a89e5e1e56b11e2ffba97510a57e5beb8f3 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Sun, 10 Nov 2024 11:18:49 +0100 Subject: [PATCH 119/515] Shaping up --- .../crafter/MechanicalCrafterBlockEntity.java | 2 +- .../kinetics/crafter/RecipeGridHandler.java | 6 +- .../content/logistics/box/PackageItem.java | 18 +++++ .../factoryBoard/FactoryPanelBehaviour.java | 6 +- .../factoryBoard/FactoryPanelScreen.java | 80 +++++++++++++------ .../packager/PackageDefragmenter.java | 9 ++- .../packager/PackagerBlockEntity.java | 36 +++++++-- 7 files changed, 117 insertions(+), 40 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/kinetics/crafter/MechanicalCrafterBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/crafter/MechanicalCrafterBlockEntity.java index 2d24b1fc2f..79fe8b3d6a 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/crafter/MechanicalCrafterBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/crafter/MechanicalCrafterBlockEntity.java @@ -476,7 +476,7 @@ public class MechanicalCrafterBlockEntity extends KineticBlockEntity { .isEmpty() || covered; } - protected void checkCompletedRecipe(boolean poweredStart) { + public void checkCompletedRecipe(boolean poweredStart) { if (getSpeed() == 0) return; if (level.isClientSide && !isVirtual()) diff --git a/src/main/java/com/simibubi/create/content/kinetics/crafter/RecipeGridHandler.java b/src/main/java/com/simibubi/create/content/kinetics/crafter/RecipeGridHandler.java index df09f3ba7d..8ff15ae150 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/crafter/RecipeGridHandler.java +++ b/src/main/java/com/simibubi/create/content/kinetics/crafter/RecipeGridHandler.java @@ -51,7 +51,6 @@ public class RecipeGridHandler { Set visited = new HashSet<>(); frontier.add(Pair.of(root, null)); - boolean powered = false; boolean empty = false; boolean allEmpty = true; @@ -66,9 +65,6 @@ public class RecipeGridHandler { empty = true; else allEmpty = false; - if (poweredStart && current.getLevel() - .hasNeighborSignal(current.getBlockPos())) - powered = true; crafters.add(current); visited.add(current); @@ -81,7 +77,7 @@ public class RecipeGridHandler { frontier.add(Pair.of(preceding, current)); } - return empty && !powered || allEmpty ? null : crafters; + return empty && !poweredStart || allEmpty ? null : crafters; } public static MechanicalCrafterBlockEntity getTargetingCrafter(MechanicalCrafterBlockEntity crafter) { diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java index 943fe27f4b..7ad0e0cc3f 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java @@ -131,6 +131,24 @@ public class PackageItem extends Item { .getInt("OrderId"); } + public static PackageOrder getOrderContext(ItemStack box) { + CompoundTag tag = box.getTag(); + if (tag == null || !tag.contains("Fragment")) + return null; + CompoundTag frag = tag.getCompound("Fragment"); + if (!frag.contains("OrderContext")) + return null; + return PackageOrder.read(frag.getCompound("OrderContext")); + } + + public static void addOrderContext(ItemStack box, PackageOrder orderContext) { + CompoundTag tag = box.getOrCreateTagElement("Fragment"); + if (orderContext != null) + tag.put("OrderContext", orderContext.write()); + box.getOrCreateTag() + .put("Fragment", tag); + } + public static boolean matchAddress(ItemStack box, String address) { return matchAddress(getAddress(box), address); } diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java index 1e913c63f8..43b42d7ff3 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java @@ -186,14 +186,14 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { timer = REQUEST_INTERVAL; + if (recipeAddress.isBlank()) + return; + if (panelBE.restocker) { tryRestock(); return; } - if (recipeAddress.isBlank()) - return; - boolean failed = false; Multimap toRequest = HashMultimap.create(); diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java index aee258ba11..8f1b2b4731 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java @@ -32,6 +32,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.EditBox; import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.core.NonNullList; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.util.Mth; @@ -41,6 +42,7 @@ import net.minecraft.world.item.crafting.CraftingRecipe; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.RecipeType; +import net.minecraftforge.common.crafting.IShapedRecipe; import net.minecraftforge.items.ItemHandlerHelper; public class FactoryPanelScreen extends AbstractSimiScreen { @@ -48,6 +50,7 @@ public class FactoryPanelScreen extends AbstractSimiScreen { private EditBox addressBox; private IconButton confirmButton; private IconButton newInputButton; + private IconButton activateCraftingButton; private ScrollInput promiseExpiration; private FactoryPanelBehaviour behaviour; private int displayedExtraRows; @@ -66,6 +69,7 @@ public class FactoryPanelScreen extends AbstractSimiScreen { minecraft = Minecraft.getInstance(); restocker = behaviour.panelBE().restocker; availableCraftingRecipe = null; + craftingActive = !behaviour.activeCraftingArrangement.isEmpty(); updateConfigs(); } @@ -78,32 +82,40 @@ public class FactoryPanelScreen extends AbstractSimiScreen { return b == null ? new BigItemStack(ItemStack.EMPTY, 0) : new BigItemStack(b.getFilter(), c.amount); }) .toList(); - -// searchForCraftingRecipe(); TODO finish crafter integration - craftingActive = false; - if (availableCraftingRecipe == null) + searchForCraftingRecipe(); + + if (availableCraftingRecipe == null) { + craftingActive = false; return; - - outputConfig.count = availableCraftingRecipe.getResultItem(minecraft.level.registryAccess()) - .getCount(); - craftingIngredients = new ArrayList<>(); - craftingActive = true; - - Ingredients: for (Ingredient ingredient : availableCraftingRecipe.getIngredients()) { - if (ingredient.isEmpty()) { - craftingIngredients.add(new BigItemStack(ItemStack.EMPTY, 1)); - continue; - } - for (BigItemStack bigItemStack : inputConfig) { - if (!ingredient.test(bigItemStack.stack)) - continue; - craftingIngredients.add(bigItemStack); - continue Ingredients; - } - while (craftingIngredients.size() < 9) - craftingIngredients.add(new BigItemStack(ItemStack.EMPTY, 1)); } + + craftingIngredients = new ArrayList<>(); + + int width = 3; + if (availableCraftingRecipe instanceof IShapedRecipe shaped) + width = shaped.getRecipeWidth(); + + NonNullList ingredients = availableCraftingRecipe.getIngredients(); + BigItemStack emptyIngredient = new BigItemStack(ItemStack.EMPTY, 1); + + for (int i = 0; i < ingredients.size(); i++) { + Ingredient ingredient = ingredients.get(i); + BigItemStack craftingIngredient = emptyIngredient; + + if (!ingredient.isEmpty()) + for (BigItemStack bigItemStack : inputConfig) + if (ingredient.test(bigItemStack.stack)) + craftingIngredient = bigItemStack; + + craftingIngredients.add(craftingIngredient); + if (width < 3 && (i + 1) % width == 0) + for (int j = 0; j < 3 - width; j++) + craftingIngredients.add(emptyIngredient); + } + + while (craftingIngredients.size() < 9) + craftingIngredients.add(emptyIngredient); } @Override @@ -148,6 +160,24 @@ public class FactoryPanelScreen extends AbstractSimiScreen { addRenderableWidget(newInputButton); } + activateCraftingButton = null; + if (availableCraftingRecipe != null) { + int outputX = x + 130; + int outputY = y + 15 + middleHeight() / 2; + activateCraftingButton = new IconButton(outputX + 17, outputY, AllIcons.I_3x3); + activateCraftingButton.withCallback(() -> { + craftingActive = !craftingActive; + init(); + if (craftingActive) { + outputConfig.count = availableCraftingRecipe.getResultItem(minecraft.level.registryAccess()) + .getCount(); + } + }); + activateCraftingButton.setToolTip(CreateLang.translate("gui.factory_panel.activate_crafting") + .component()); + addRenderableWidget(activateCraftingButton); + } + displayedExtraRows = rowsToDisplay(); } @@ -166,6 +196,8 @@ public class FactoryPanelScreen extends AbstractSimiScreen { updateConfigs(); init(); } + if (activateCraftingButton != null) + activateCraftingButton.green = craftingActive; addressBox.tick(); promiseExpiration.titled(CreateLang .translate(promiseExpiration.getState() == -1 ? "gui.factory_panel.promises_do_not_expire" @@ -217,6 +249,8 @@ public class FactoryPanelScreen extends AbstractSimiScreen { AllGuiTextures.FACTORY_PANEL_ARROW.render(graphics, x + 75 + arrowOffset * 9, y + 16 + middleHeight() / 2); int outputX = x + 130; int outputY = y + 16 + middleHeight() / 2; + if (availableCraftingRecipe != null) + AllGuiTextures.FACTORY_PANEL_SLOT_FRAME.render(graphics, outputX + 16, outputY - 2); AllGuiTextures.FACTORY_PANEL_SLOT_FRAME.render(graphics, outputX - 2, outputY - 2); graphics.renderItem(outputConfig.stack, outputX, outputY); graphics.renderItemDecorations(font, behaviour.getFilter(), outputX, outputY, outputConfig.count + ""); diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackageDefragmenter.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackageDefragmenter.java index 28baa2d2c2..bbdfeae5bd 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackageDefragmenter.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackageDefragmenter.java @@ -53,7 +53,7 @@ public class PackageDefragmenter { public List repack(int orderId) { List exportingPackages = new ArrayList<>(); String address = ""; - PackageOrder order = null; + PackageOrder orderContext = null; List allItems = new ArrayList<>(); for (ItemStack box : collectedPackages.get(orderId)) { @@ -61,7 +61,7 @@ public class PackageDefragmenter { if (box.hasTag() && box.getTag() .getCompound("Fragment") .contains("OrderContext")) - order = PackageOrder.read(box.getTag() + orderContext = PackageOrder.read(box.getTag() .getCompound("Fragment") .getCompound("OrderContext")); ItemStackHandler contents = PackageItem.getContents(box); @@ -77,7 +77,7 @@ public class PackageDefragmenter { } } - List orderedStacks = order == null ? Collections.emptyList() : order.stacks(); + List orderedStacks = orderContext == null ? Collections.emptyList() : new ArrayList<>(orderContext.stacks()); List outputSlots = new ArrayList<>(); Repack: while (true) { @@ -131,6 +131,9 @@ public class PackageDefragmenter { for (ItemStack box : exportingPackages) PackageItem.addAddress(box, address); + + if (!exportingPackages.isEmpty()) + PackageItem.addOrderContext(exportingPackages.get(0), orderContext); return exportingPackages; } diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java index d2fa7c97cc..ba01e4ab48 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java @@ -1,5 +1,6 @@ package com.simibubi.create.content.logistics.packager; +import java.util.ArrayList; import java.util.HashSet; import java.util.LinkedList; import java.util.List; @@ -9,6 +10,7 @@ import java.util.UUID; import com.simibubi.create.AllBlocks; import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.actors.psi.PortableStorageInterfaceBlockEntity; +import com.simibubi.create.content.kinetics.crafter.MechanicalCrafterBlockEntity; import com.simibubi.create.content.logistics.BigItemStack; import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.content.logistics.crate.BottomlessItemHandler; @@ -151,7 +153,7 @@ public class PackagerBlockEntity extends SmartBlockEntity { this.availableItems = availableItems; return availableItems; } - + if (targetInv instanceof BottomlessItemHandler bih) { availableItems.add(bih.getStackInSlot(0), BigItemStack.INF); this.availableItems = availableItems; @@ -271,11 +273,18 @@ public class PackagerBlockEntity extends SmartBlockEntity { return false; ItemStackHandler contents = PackageItem.getContents(box); + PackageOrder orderContext = PackageItem.getOrderContext(box); IItemHandler targetInv = targetInventory.getInventory(); + BlockEntity targetBE = + level.getBlockEntity(worldPosition.relative(getBlockState().getOptionalValue(PackagerBlock.FACING) + .orElse(Direction.UP) + .getOpposite())); + if (targetInv == null) return false; boolean targetIsCreativeCrate = targetInv instanceof BottomlessItemHandler; + boolean targetIsCrafter = targetBE instanceof MechanicalCrafterBlockEntity; if (defragmenterActive) { boolean anySpace = false; @@ -295,10 +304,21 @@ public class PackagerBlockEntity extends SmartBlockEntity { for (int slot = 0; slot < targetInv.getSlots(); slot++) { ItemStack itemInSlot = targetInv.getStackInSlot(slot); int itemsAddedToSlot = 0; + for (int boxSlot = 0; boxSlot < contents.getSlots(); boxSlot++) { ItemStack toInsert = contents.getStackInSlot(boxSlot); - if (toInsert.isEmpty()) - continue; + + // Follow crafting arrangement + if (targetIsCrafter && orderContext != null && orderContext.stacks() + .size() > slot) { + BigItemStack targetStack = orderContext.stacks() + .get(slot); + if (targetStack.stack.isEmpty()) + break; + if (!ItemHandlerHelper.canItemStacksStack(toInsert, targetStack.stack)) + continue; + } + if (targetInv.insertItem(slot, toInsert, true) .getCount() == toInsert.getCount()) continue; @@ -311,17 +331,20 @@ public class PackagerBlockEntity extends SmartBlockEntity { contents.setStackInSlot(boxSlot, ItemStack.EMPTY); itemInSlot = toInsert; targetInv.insertItem(slot, toInsert, simulate); + itemsAddedToSlot += toInsert.getCount(); continue; } if (!ItemHandlerHelper.canItemStacksStack(toInsert, itemInSlot)) continue; + int insertedAmount = toInsert.getCount() - targetInv.insertItem(slot, toInsert, simulate) .getCount(); int slotLimit = (int) ((targetInv.getStackInSlot(slot) .isEmpty() ? itemInSlot.getMaxStackSize() / 64f : 1) * targetInv.getSlotLimit(slot)); int insertableAmountWithPreviousItems = Math.min(toInsert.getCount(), slotLimit - itemInSlot.getCount() - itemsAddedToSlot); - int added = Math.min(insertedAmount, insertableAmountWithPreviousItems); + + int added = Math.min(insertedAmount, Math.max(0, insertableAmountWithPreviousItems)); contents.setStackInSlot(boxSlot, ItemHandlerHelper.copyStackWithSize(toInsert, toInsert.getCount() - added)); } @@ -337,6 +360,9 @@ public class PackagerBlockEntity extends SmartBlockEntity { if (simulate) return true; + if (targetBE instanceof MechanicalCrafterBlockEntity mcbe) + mcbe.checkCompletedRecipe(true); + previouslyUnwrapped = box; animationInward = true; animationTicks = CYCLE; @@ -448,7 +474,7 @@ public class PackagerBlockEntity extends SmartBlockEntity { continuePacking = true; if (nextRequest.context() != null) orderContext = nextRequest.context(); - + if (bulky) break Outer; break; From 9c1e0d5886f82d998d0f5fbbdbb8196a664e3d68 Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Mon, 11 Nov 2024 15:05:41 -0800 Subject: [PATCH 120/515] Infinite water source simulator 2024 - Don't update block states when a pipe is removing a fluid that would be an infinite source - Add accessor mixin for FlowingFluid#getNewLiquid to test --- .../create/content/fluids/OpenEndedPipe.java | 22 ++++++++++++++++--- .../mixin/accessor/FlowingFluidAccessor.java | 16 ++++++++++++++ src/main/resources/create.mixins.json | 1 + 3 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/mixin/accessor/FlowingFluidAccessor.java diff --git a/src/main/java/com/simibubi/create/content/fluids/OpenEndedPipe.java b/src/main/java/com/simibubi/create/content/fluids/OpenEndedPipe.java index 17a3e0c061..29c525f3b3 100644 --- a/src/main/java/com/simibubi/create/content/fluids/OpenEndedPipe.java +++ b/src/main/java/com/simibubi/create/content/fluids/OpenEndedPipe.java @@ -13,6 +13,7 @@ import com.simibubi.create.content.fluids.potion.PotionFluidHandler; import com.simibubi.create.foundation.advancement.AdvancementBehaviour; import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.fluid.FluidHelper; +import com.simibubi.create.foundation.mixin.accessor.FlowingFluidAccessor; import com.simibubi.create.infrastructure.config.AllConfigs; import net.createmod.catnip.utility.BlockFace; @@ -166,10 +167,25 @@ public class OpenEndedPipe extends FlowSource { if (waterlog) { world.setBlock(outputPos, state.setValue(WATERLOGGED, false), 3); world.scheduleTick(outputPos, Fluids.WATER, 1); - return stack; + } else { + var newState = fluidState.createLegacyBlock() + .setValue(LiquidBlock.LEVEL, 14); + + var newFluidState = newState.getFluidState(); + + if (newFluidState.getType() instanceof FlowingFluidAccessor flowing) { + var potentiallyFilled = flowing.create$getNewLiquid(world, outputPos, newState); + + // Check if we'd immediately become the same fluid again. + if (potentiallyFilled.equals(fluidState)) { + // If so, no need to update the block state. + return stack; + } + } + + world.setBlock(outputPos, newState, 3); } - world.setBlock(outputPos, fluidState.createLegacyBlock() - .setValue(LiquidBlock.LEVEL, 14), 3); + return stack; } diff --git a/src/main/java/com/simibubi/create/foundation/mixin/accessor/FlowingFluidAccessor.java b/src/main/java/com/simibubi/create/foundation/mixin/accessor/FlowingFluidAccessor.java new file mode 100644 index 0000000000..6d154f7ad5 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/mixin/accessor/FlowingFluidAccessor.java @@ -0,0 +1,16 @@ +package com.simibubi.create.foundation.mixin.accessor; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.FlowingFluid; +import net.minecraft.world.level.material.FluidState; + +@Mixin(FlowingFluid.class) +public interface FlowingFluidAccessor { + @Invoker("getNewLiquid") + FluidState create$getNewLiquid(Level pLevel, BlockPos pPos, BlockState pBlockState); +} diff --git a/src/main/resources/create.mixins.json b/src/main/resources/create.mixins.json index 986e3867fa..1627d31007 100644 --- a/src/main/resources/create.mixins.json +++ b/src/main/resources/create.mixins.json @@ -20,6 +20,7 @@ "accessor.AbstractProjectileDispenseBehaviorAccessor", "accessor.DispenserBlockAccessor", "accessor.FallingBlockEntityAccessor", + "accessor.FlowingFluidAccessor", "accessor.FluidInteractionRegistryAccessor", "accessor.GameTestHelperAccessor", "accessor.LivingEntityAccessor", From e201ce73211565694f2baaf0f54b8c93f549dc0d Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Mon, 11 Nov 2024 15:06:43 -0800 Subject: [PATCH 121/515] What is your name? - Fix frogport nametags not rendering with flywheel on - Bump flywheel version --- gradle.properties | 2 +- .../java/com/simibubi/create/AllBlockEntityTypes.java | 8 ++++---- .../logistics/packagePort/frogport/FrogportRenderer.java | 7 ++++++- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/gradle.properties b/gradle.properties index 6c5381162c..43fade102b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -23,7 +23,7 @@ use_parchment = true # dependency versions registrate_version = MC1.20-1.3.3 flywheel_minecraft_version = 1.20.1 -flywheel_version = 1.0.0-beta-158 +flywheel_version = 1.0.0-beta-160 jei_minecraft_version = 1.20.1 jei_version = 15.10.0.39 curios_minecraft_version = 1.20.1 diff --git a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java index 6934e588af..2c59ddf951 100644 --- a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java +++ b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java @@ -492,7 +492,7 @@ public class AllBlockEntityTypes { .blockEntity("item_vault", ItemVaultBlockEntity::new) .validBlocks(AllBlocks.ITEM_VAULT) .register(); - + public static final BlockEntityEntry ITEM_HATCH = REGISTRATE .blockEntity("item_hatch", ItemHatchBlockEntity::new) .validBlocks(AllBlocks.ITEM_HATCH) @@ -507,11 +507,11 @@ public class AllBlockEntityTypes { public static final BlockEntityEntry PACKAGE_FROGPORT = REGISTRATE .blockEntity("package_frogport", FrogportBlockEntity::new) - .visual(() -> FrogportVisual::new, false) + .visual(() -> FrogportVisual::new, true) .validBlocks(AllBlocks.PACKAGE_FROGPORT) .renderer(() -> FrogportRenderer::new) .register(); - + public static final BlockEntityEntry PACKAGE_POSTBOX = REGISTRATE .blockEntity("package_postbox", PostboxBlockEntity::new) .validBlocks(AllBlocks.PACKAGE_POSTBOXES.toArray()) @@ -914,7 +914,7 @@ public class AllBlockEntityTypes { .validBlocks(AllBlocks.HAUNTED_BELL) .renderer(() -> BellRenderer::new) .register(); - + public static final BlockEntityEntry DESK_BELL = REGISTRATE .blockEntity("desk_bell", DeskBellBlockEntity::new) .validBlocks(AllBlocks.DESK_BELL) diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportRenderer.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportRenderer.java index 44f9bf945b..508a7ad6e6 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportRenderer.java @@ -4,6 +4,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllPartialModels; import com.simibubi.create.foundation.blockEntity.renderer.SmartBlockEntityRenderer; +import dev.engine_room.flywheel.api.visualization.VisualizationManager; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.lang.Components; @@ -42,6 +43,10 @@ public class FrogportRenderer extends SmartBlockEntityRenderer Date: Mon, 11 Nov 2024 17:27:24 -0800 Subject: [PATCH 122/515] Quit yer flappin - Make flap visuals use TransformedInstance, as FlapInstance had similar size but a much more complicated shader - Remove flap instance and associated shaders - Remove double negative in tunnel flap rendering - Make negative flapness the inward direction - Move common rendering code into FlapStuffs - Add FlapStuffs.Visual to share visualization code between tunnels and funnels --- .../create/content/logistics/FlapStuffs.java | 127 ++++++++++++++++++ .../logistics/flwdata/FlapInstance.java | 96 ------------- .../logistics/flwdata/package-info.java | 6 - .../logistics/funnel/FunnelBlockEntity.java | 2 +- .../logistics/funnel/FunnelRenderer.java | 38 +----- .../logistics/funnel/FunnelVisual.java | 67 +++------ .../tunnel/BeltTunnelBlockEntity.java | 2 +- .../logistics/tunnel/BeltTunnelRenderer.java | 37 +---- .../logistics/tunnel/BeltTunnelVisual.java | 100 +++++--------- .../foundation/render/AllInstanceTypes.java | 33 ----- .../create/flywheel/instance/cull/flap.glsl | 27 ---- .../assets/create/flywheel/instance/flap.vert | 29 ---- 12 files changed, 186 insertions(+), 378 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/logistics/FlapStuffs.java delete mode 100644 src/main/java/com/simibubi/create/content/logistics/flwdata/FlapInstance.java delete mode 100644 src/main/java/com/simibubi/create/content/logistics/flwdata/package-info.java delete mode 100644 src/main/resources/assets/create/flywheel/instance/cull/flap.glsl delete mode 100644 src/main/resources/assets/create/flywheel/instance/flap.vert diff --git a/src/main/java/com/simibubi/create/content/logistics/FlapStuffs.java b/src/main/java/com/simibubi/create/content/logistics/FlapStuffs.java new file mode 100644 index 0000000000..a735e298f1 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/FlapStuffs.java @@ -0,0 +1,127 @@ +package com.simibubi.create.content.logistics; + +import java.util.function.Consumer; + +import org.joml.Matrix4f; +import org.joml.Matrix4fc; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; + +import dev.engine_room.flywheel.api.instance.Instance; +import dev.engine_room.flywheel.api.instance.InstancerProvider; +import dev.engine_room.flywheel.api.model.Model; +import dev.engine_room.flywheel.lib.instance.InstanceTypes; +import dev.engine_room.flywheel.lib.instance.TransformedInstance; +import dev.engine_room.flywheel.lib.transform.TransformStack; +import dev.engine_room.flywheel.lib.transform.Translate; +import net.createmod.catnip.render.SuperByteBuffer; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.math.AngleHelper; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.util.Mth; +import net.minecraft.world.phys.Vec3; + +public class FlapStuffs { + public static final int FLAP_COUNT = 4; + public static final float X_OFFSET = 0.075f / 16f; + public static final float SEGMENT_STEP = -3.05f / 16f; + public static final Vec3 TUNNEL_PIVOT = VecHelper.voxelSpace(0, 10, 1f); + public static final Vec3 FUNNEL_PIVOT = VecHelper.voxelSpace(0, 10, 9.5f); + + public static void renderFlaps(PoseStack ms, VertexConsumer vb, SuperByteBuffer flapBuffer, Vec3 pivot, Direction funnelFacing, float flapness, float zOffset, int light) { + float horizontalAngle = AngleHelper.horizontalAngle(funnelFacing.getOpposite()); + + var msr = TransformStack.of(ms); + ms.pushPose(); + msr.center() + .rotateYDegrees(horizontalAngle) + .uncenter(); + ms.translate(X_OFFSET, 0, zOffset); + + for (int segment = 0; segment < FLAP_COUNT; segment++) { + ms.pushPose(); + + msr.translate(pivot) + .rotateXDegrees(flapAngle(flapness, segment)) + .translateBack(pivot); + + flapBuffer.light(light) + .renderInto(ms, vb); + + ms.popPose(); + ms.translate(SEGMENT_STEP, 0, 0); + } + ms.popPose(); + } + + public static float flapAngle(float flapness, int segment) { + float intensity = segment == 3 ? 1.5f : segment + 1; + float abs = Math.abs(flapness); + float flapAngle = Mth.sin((float) ((1 - abs) * Math.PI * intensity)) * 30 * flapness; + if (flapness < 0) + flapAngle *= .5f; + return flapAngle; + } + + public static Matrix4f commonTransform(BlockPos visualPosition, Direction side, float baseZOffset) { + float horizontalAngle = AngleHelper.horizontalAngle(side.getOpposite()); + + return new Matrix4f() + .translate(visualPosition.getX(), visualPosition.getY(), visualPosition.getZ()) + .translate(Translate.CENTER, Translate.CENTER, Translate.CENTER) + .rotateY(Mth.DEG_TO_RAD * horizontalAngle) + .translate(-Translate.CENTER, -Translate.CENTER, -Translate.CENTER) + .translate(X_OFFSET, 0, baseZOffset); + } + + public static class Visual { + private final TransformedInstance[] flaps; + + private final Matrix4f commonTransform = new Matrix4f(); + private final Vec3 pivot; + + public Visual(InstancerProvider instancerProvider, Matrix4fc commonTransform, Vec3 pivot, Model flapModel) { + this.pivot = pivot; + this.commonTransform.set(commonTransform) + .translate((float) pivot.x, (float) pivot.y, (float) pivot.z); + + flaps = new TransformedInstance[FLAP_COUNT]; + + instancerProvider.instancer(InstanceTypes.TRANSFORMED, flapModel) + .createInstances(flaps); + } + + public void update(float f) { + for (int segment = 0; segment < FLAP_COUNT; segment++) { + var flap = flaps[segment]; + + flap.setTransform(commonTransform) + .rotateXDegrees(flapAngle(f, segment)) + .translateBack(pivot) + .translate(segment * SEGMENT_STEP, 0, 0) + .setChanged(); + } + } + + public void delete() { + for (TransformedInstance flap : flaps) { + flap.delete(); + } + } + + public void updateLight(int light) { + for (TransformedInstance flap : flaps) { + flap.light(light) + .setChanged(); + } + } + + public void collectCrumblingInstances(Consumer consumer) { + for (TransformedInstance flap : flaps) { + consumer.accept(flap); + } + } + } +} diff --git a/src/main/java/com/simibubi/create/content/logistics/flwdata/FlapInstance.java b/src/main/java/com/simibubi/create/content/logistics/flwdata/FlapInstance.java deleted file mode 100644 index 30e5251262..0000000000 --- a/src/main/java/com/simibubi/create/content/logistics/flwdata/FlapInstance.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.simibubi.create.content.logistics.flwdata; - -import org.joml.Vector3f; - -import dev.engine_room.flywheel.api.instance.InstanceHandle; -import dev.engine_room.flywheel.api.instance.InstanceType; -import dev.engine_room.flywheel.lib.instance.AbstractInstance; -import dev.engine_room.flywheel.lib.instance.FlatLit; -import net.minecraft.client.renderer.LightTexture; -import net.minecraft.core.BlockPos; - -public class FlapInstance extends AbstractInstance implements FlatLit { - - public float x; - public float y; - public float z; - public byte blockLight; - public byte skyLight; - public int packedLight; - public float segmentOffsetX; - public float segmentOffsetY; - public float segmentOffsetZ; - public float pivotX; - public float pivotY; - public float pivotZ; - public float horizontalAngle; - public float intensity; - public float flapScale; - public float flapness; - - public FlapInstance(InstanceType type, InstanceHandle handle) { - super(type, handle); - } - - - public FlapInstance setPosition(BlockPos pos) { - return setPosition(pos.getX(), pos.getY(), pos.getZ()); - } - - public FlapInstance setPosition(Vector3f pos) { - return setPosition(pos.x(), pos.y(), pos.z()); - } - - public FlapInstance setPosition(float x, float y, float z) { - this.x = x; - this.y = y; - this.z = z; - return this; - } - - @Override - public FlapInstance light(int blockLight, int skyLight) { - return this.light(LightTexture.pack(blockLight, skyLight)); - } - - @Override - public FlapInstance light(int packedLight) { - this.packedLight = packedLight; - return this; - } - - public FlapInstance setSegmentOffset(float x, float y, float z) { - this.segmentOffsetX = x; - this.segmentOffsetY = y; - this.segmentOffsetZ = z; - return this; - } - - public FlapInstance setIntensity(float intensity) { - this.intensity = intensity; - return this; - } - - public FlapInstance setHorizontalAngle(float horizontalAngle) { - this.horizontalAngle = horizontalAngle; - return this; - } - - public FlapInstance setFlapScale(float flapScale) { - this.flapScale = flapScale; - return this; - } - - public FlapInstance setFlapness(float flapness) { - this.flapness = flapness; - return this; - } - - public FlapInstance setPivotVoxelSpace(float x, float y, float z) { - pivotX = x / 16f; - pivotY = y / 16f; - pivotZ = z / 16f; - return this; - } - -} diff --git a/src/main/java/com/simibubi/create/content/logistics/flwdata/package-info.java b/src/main/java/com/simibubi/create/content/logistics/flwdata/package-info.java deleted file mode 100644 index 5f4c5ce95a..0000000000 --- a/src/main/java/com/simibubi/create/content/logistics/flwdata/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -@ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -package com.simibubi.create.content.logistics.flwdata; - -import javax.annotation.ParametersAreNonnullByDefault; - -import net.minecraft.MethodsReturnNonnullByDefault; diff --git a/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelBlockEntity.java index fa2070434c..6bcdf7d6ba 100644 --- a/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelBlockEntity.java @@ -325,7 +325,7 @@ public class FunnelBlockEntity extends SmartBlockEntity implements IHaveHovering AllPackets.getChannel() .send(packetTarget(), new FunnelFlapPacket(this, inward)); } else { - flap.setValue(inward ? 1 : -1); + flap.setValue(inward ? -1 : 1); AllSoundEvents.FUNNEL_FLAP.playAt(level, worldPosition, 1, 1, true); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelRenderer.java b/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelRenderer.java index c62c0228c3..298021e510 100644 --- a/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelRenderer.java @@ -3,21 +3,17 @@ package com.simibubi.create.content.logistics.funnel; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.simibubi.create.AllPartialModels; +import com.simibubi.create.content.logistics.FlapStuffs; import com.simibubi.create.foundation.blockEntity.renderer.SmartBlockEntityRenderer; import dev.engine_room.flywheel.api.visualization.VisualizationManager; import dev.engine_room.flywheel.lib.model.baked.PartialModel; -import dev.engine_room.flywheel.lib.transform.TransformStack; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; -import net.minecraft.util.Mth; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.Vec3; public class FunnelRenderer extends SmartBlockEntityRenderer { @@ -38,39 +34,11 @@ public class FunnelRenderer extends SmartBlockEntityRenderer PartialModel partialModel = (blockState.getBlock() instanceof FunnelBlock ? AllPartialModels.FUNNEL_FLAP : AllPartialModels.BELT_FUNNEL_FLAP); SuperByteBuffer flapBuffer = CachedBuffers.partial(partialModel, blockState); - Vec3 pivot = VecHelper.voxelSpace(0, 10, 9.5f); - var msr = TransformStack.of(ms); - float horizontalAngle = AngleHelper.horizontalAngle(FunnelBlock.getFunnelFacing(blockState) - .getOpposite()); + var funnelFacing = FunnelBlock.getFunnelFacing(blockState); float f = be.flap.getValue(partialTicks); - ms.pushPose(); - msr.center() - .rotateYDegrees(horizontalAngle) - .uncenter(); - ms.translate(0.075f / 16f, 0, -be.getFlapOffset()); - - for (int segment = 0; segment <= 3; segment++) { - ms.pushPose(); - - float intensity = segment == 3 ? 1.5f : segment + 1; - float abs = Math.abs(f); - float flapAngle = Mth.sin((float) ((1 - abs) * Math.PI * intensity)) * 30 * -f; - if (f > 0) - flapAngle *= .5f; - - msr.translate(pivot) - .rotateXDegrees(flapAngle) - .translateBack(pivot); - - flapBuffer.light(light) - .renderInto(ms, vb); - - ms.popPose(); - ms.translate(-3.05f / 16f, 0, 0); - } - ms.popPose(); + FlapStuffs.renderFlaps(ms, vb, flapBuffer, FlapStuffs.FUNNEL_PIVOT, funnelFacing, f, -be.getFlapOffset(), light); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelVisual.java b/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelVisual.java index ed8ba99e29..66baad2406 100644 --- a/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelVisual.java +++ b/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelVisual.java @@ -1,98 +1,63 @@ package com.simibubi.create.content.logistics.funnel; -import java.util.ArrayList; import java.util.function.Consumer; import com.simibubi.create.AllPartialModels; -import com.simibubi.create.content.logistics.flwdata.FlapInstance; -import com.simibubi.create.foundation.render.AllInstanceTypes; +import com.simibubi.create.content.logistics.FlapStuffs; import dev.engine_room.flywheel.api.instance.Instance; -import dev.engine_room.flywheel.api.instance.Instancer; import dev.engine_room.flywheel.api.visual.DynamicVisual; import dev.engine_room.flywheel.api.visualization.VisualizationContext; -import dev.engine_room.flywheel.lib.instance.AbstractInstance; -import dev.engine_room.flywheel.lib.instance.FlatLit; import dev.engine_room.flywheel.lib.model.Models; import dev.engine_room.flywheel.lib.model.baked.PartialModel; import dev.engine_room.flywheel.lib.visual.AbstractBlockEntityVisual; import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; -import net.createmod.catnip.utility.AnimationTickHolder; -import net.minecraft.core.Direction; -import net.minecraft.world.level.LightLayer; public class FunnelVisual extends AbstractBlockEntityVisual implements SimpleDynamicVisual { - private final ArrayList flaps; + private final FlapStuffs.Visual flaps; public FunnelVisual(VisualizationContext context, FunnelBlockEntity blockEntity, float partialTick) { super(context, blockEntity, partialTick); - flaps = new ArrayList<>(4); - - if (!blockEntity.hasFlap()) return; + if (!blockEntity.hasFlap()) { + flaps = null; + return; + } + var funnelFacing = FunnelBlock.getFunnelFacing(blockState); PartialModel flapPartial = (blockState.getBlock() instanceof FunnelBlock ? AllPartialModels.FUNNEL_FLAP - : AllPartialModels.BELT_FUNNEL_FLAP); - Instancer model = instancerProvider().instancer(AllInstanceTypes.FLAP, Models.partial(flapPartial)); + : AllPartialModels.BELT_FUNNEL_FLAP); - int blockLight = level.getBrightness(LightLayer.BLOCK, pos); - int skyLight = level.getBrightness(LightLayer.SKY, pos); - - Direction direction = FunnelBlock.getFunnelFacing(blockState); - - float flapness = blockEntity.flap.getValue(AnimationTickHolder.getPartialTicks()); - float horizontalAngle = direction.getOpposite().toYRot(); - - for (int segment = 0; segment <= 3; segment++) { - float intensity = segment == 3 ? 1.5f : segment + 1; - float segmentOffset = -3.05f / 16f * segment + 0.075f / 16f; - - FlapInstance key = model.createInstance(); - - key.setPosition(getVisualPosition()) - .setSegmentOffset(segmentOffset, 0, -blockEntity.getFlapOffset()) - .light(blockLight, skyLight) - .setHorizontalAngle(horizontalAngle) - .setFlapness(flapness) - .setFlapScale(-1) - .setPivotVoxelSpace(0, 10, 9.5f) - .setIntensity(intensity) - .setChanged(); - - flaps.add(key); - } + var commonTransform = FlapStuffs.commonTransform(getVisualPosition(), funnelFacing, -blockEntity.getFlapOffset()); + flaps = new FlapStuffs.Visual(instancerProvider(), commonTransform, FlapStuffs.FUNNEL_PIVOT, Models.partial(flapPartial)); } @Override public void beginFrame(DynamicVisual.Context ctx) { if (flaps == null) return; - float flapness = blockEntity.flap.getValue(ctx.partialTick()); - - for (FlapInstance flap : flaps) { - flap.setFlapness(flapness) - .setChanged(); - } + flaps.update(blockEntity.flap.getValue(ctx.partialTick())); } @Override public void updateLight(float partialTick) { if (flaps != null) - relight(flaps.toArray(FlatLit[]::new)); + flaps.updateLight(computePackedLight()); } @Override protected void _delete() { - if (flaps == null) return; + if (flaps == null) return; - flaps.forEach(AbstractInstance::delete); + flaps.delete(); } @Override public void collectCrumblingInstances(Consumer consumer) { if (flaps == null) return; - flaps.forEach(consumer); + flaps.collectCrumblingInstances(consumer); } + } diff --git a/src/main/java/com/simibubi/create/content/logistics/tunnel/BeltTunnelBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/tunnel/BeltTunnelBlockEntity.java index 44e66b564d..7039bd322a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/tunnel/BeltTunnelBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/tunnel/BeltTunnelBlockEntity.java @@ -155,7 +155,7 @@ public class BeltTunnelBlockEntity extends SmartBlockEntity { if (level.isClientSide) { if (flaps.containsKey(side)) flaps.get(side) - .setValue(inward ^ side.getAxis() == Axis.Z ? -1 : 1); + .setValue(inward ? -1 : 1); return; } diff --git a/src/main/java/com/simibubi/create/content/logistics/tunnel/BeltTunnelRenderer.java b/src/main/java/com/simibubi/create/content/logistics/tunnel/BeltTunnelRenderer.java index 820b49f2b7..4e4b93595c 100644 --- a/src/main/java/com/simibubi/create/content/logistics/tunnel/BeltTunnelRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/tunnel/BeltTunnelRenderer.java @@ -3,22 +3,17 @@ package com.simibubi.create.content.logistics.tunnel; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.simibubi.create.AllPartialModels; +import com.simibubi.create.content.logistics.FlapStuffs; import com.simibubi.create.foundation.blockEntity.renderer.SmartBlockEntityRenderer; import dev.engine_room.flywheel.api.visualization.VisualizationManager; -import dev.engine_room.flywheel.lib.transform.TransformStack; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.minecraft.core.Direction; -import net.minecraft.core.Direction.Axis; -import net.minecraft.util.Mth; -import net.minecraft.world.phys.Vec3; public class BeltTunnelRenderer extends SmartBlockEntityRenderer { @@ -36,43 +31,15 @@ public class BeltTunnelRenderer extends SmartBlockEntityRenderer 0) - flapAngle *= .5f; - - msr.translate(pivot) - .rotateXDegrees(flapAngle) - .translateBack(pivot); - flapBuffer.light(light) - .renderInto(ms, vb); - - ms.popPose(); - ms.translate(-3.05f / 16f, 0, 0); - } - ms.popPose(); + FlapStuffs.renderFlaps(ms, vb, flapBuffer, FlapStuffs.TUNNEL_PIVOT, direction, f, 0, light); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/tunnel/BeltTunnelVisual.java b/src/main/java/com/simibubi/create/content/logistics/tunnel/BeltTunnelVisual.java index 3e43718448..321fdfb8d2 100644 --- a/src/main/java/com/simibubi/create/content/logistics/tunnel/BeltTunnelVisual.java +++ b/src/main/java/com/simibubi/create/content/logistics/tunnel/BeltTunnelVisual.java @@ -1,74 +1,41 @@ package com.simibubi.create.content.logistics.tunnel; -import java.util.ArrayList; -import java.util.Collection; import java.util.EnumMap; import java.util.Map; import java.util.function.Consumer; import com.simibubi.create.AllPartialModels; -import com.simibubi.create.content.logistics.flwdata.FlapInstance; -import com.simibubi.create.foundation.render.AllInstanceTypes; +import com.simibubi.create.content.logistics.FlapStuffs; import dev.engine_room.flywheel.api.instance.Instance; -import dev.engine_room.flywheel.api.instance.Instancer; import dev.engine_room.flywheel.api.visual.DynamicVisual; import dev.engine_room.flywheel.api.visualization.VisualizationContext; -import dev.engine_room.flywheel.lib.instance.AbstractInstance; -import dev.engine_room.flywheel.lib.instance.FlatLit; import dev.engine_room.flywheel.lib.model.Models; import dev.engine_room.flywheel.lib.visual.AbstractBlockEntityVisual; import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; import net.createmod.catnip.utility.animation.LerpedFloat; import net.minecraft.core.Direction; -import net.minecraft.world.level.LightLayer; public class BeltTunnelVisual extends AbstractBlockEntityVisual implements SimpleDynamicVisual { - private final Map> tunnelFlaps = new EnumMap<>(Direction.class); + private final Map tunnelFlaps = new EnumMap<>(Direction.class); + private int light; - public BeltTunnelVisual(VisualizationContext context, BeltTunnelBlockEntity blockEntity, float partialTick) { + public BeltTunnelVisual(VisualizationContext context, BeltTunnelBlockEntity blockEntity, float partialTick) { super(context, blockEntity, partialTick); - setupFlaps(partialTick); + createFlaps(); + updateFlaps(partialTick); } - private void setupFlaps(float partialTick) { - Instancer model = instancerProvider().instancer(AllInstanceTypes.FLAP, Models.partial(AllPartialModels.BELT_TUNNEL_FLAP)); - - int blockLight = level.getBrightness(LightLayer.BLOCK, pos); - int skyLight = level.getBrightness(LightLayer.SKY, pos); - + private void createFlaps() { blockEntity.flaps.forEach((direction, flapValue) -> { + var commonTransform = FlapStuffs.commonTransform(visualPos, direction, 0); + var flapSide = new FlapStuffs.Visual(instancerProvider(), commonTransform, FlapStuffs.TUNNEL_PIVOT, Models.partial(AllPartialModels.BELT_TUNNEL_FLAP)); - float flapness = flapValue.getValue(partialTick); + flapSide.updateLight(light); - float horizontalAngle = direction.getOpposite().toYRot(); - - float flapScale = direction.getAxis() == Direction.Axis.X ? 1 : -1; - - ArrayList flaps = new ArrayList<>(4); - - for (int segment = 0; segment <= 3; segment++) { - float intensity = segment == 3 ? 1.5f : segment + 1; - float segmentOffset = -3.05f / 16f * segment + 0.075f / 16f; - - FlapInstance key = model.createInstance(); - - key.setPosition(getVisualPosition()) - .setSegmentOffset(segmentOffset, 0, 0) - .light(blockLight, skyLight) - .setHorizontalAngle(horizontalAngle) - .setFlapness(flapness) - .setFlapScale(flapScale) - .setPivotVoxelSpace(0, 10, 1) - .setIntensity(intensity) - .setChanged(); - - flaps.add(key); - } - - tunnelFlaps.put(direction, flaps); + tunnelFlaps.put(direction, flapSide); }); } @@ -77,42 +44,47 @@ public class BeltTunnelVisual extends AbstractBlockEntityVisual { - LerpedFloat lerpedFloat = blockEntity.flaps.get(direction); - if (lerpedFloat == null) - return; + updateFlaps(ctx.partialTick()); + } - float flapness = lerpedFloat.getValue(ctx.partialTick()); - for (FlapInstance flap : keys) { - flap.setFlapness(flapness) - .setChanged(); - } + private void updateFlaps(float partialTicks) { + tunnelFlaps.forEach((direction, keys) -> { + LerpedFloat lerpedFloat = blockEntity.flaps.get(direction); + if (lerpedFloat == null) { + return; + } + + keys.update(lerpedFloat.getValue(partialTicks)); }); - } + } - @Override + @Override public void updateLight(float partialTick) { - relight(tunnelFlaps.values().stream().flatMap(Collection::stream).toArray(FlatLit[]::new)); + // Need to save the packed light in case we need to recreate the instances. + light = computePackedLight(); + for (FlapStuffs.Visual value : tunnelFlaps.values()) { + value.updateLight(light); + } } @Override protected void _delete() { tunnelFlaps.values() - .stream() - .flatMap(Collection::stream) - .forEach(AbstractInstance::delete); + .forEach(FlapStuffs.Visual::delete); + + tunnelFlaps.clear(); } @Override public void collectCrumblingInstances(Consumer consumer) { - tunnelFlaps.values() - .stream() - .flatMap(Collection::stream) - .forEach(consumer); + for (FlapStuffs.Visual value : tunnelFlaps.values()) { + value.collectCrumblingInstances(consumer); + } } } diff --git a/src/main/java/com/simibubi/create/foundation/render/AllInstanceTypes.java b/src/main/java/com/simibubi/create/foundation/render/AllInstanceTypes.java index bda99f70a7..e004e3789c 100644 --- a/src/main/java/com/simibubi/create/foundation/render/AllInstanceTypes.java +++ b/src/main/java/com/simibubi/create/foundation/render/AllInstanceTypes.java @@ -7,7 +7,6 @@ import org.lwjgl.system.MemoryUtil; import com.simibubi.create.content.contraptions.actors.ActorInstance; import com.simibubi.create.content.kinetics.base.RotatingInstance; import com.simibubi.create.content.kinetics.belt.BeltInstance; -import com.simibubi.create.content.logistics.flwdata.FlapInstance; import com.simibubi.create.content.processing.burner.ScrollInstance; import dev.engine_room.flywheel.api.instance.InstanceType; @@ -153,38 +152,6 @@ public class AllInstanceTypes { }) .build(); - // TODO: remove - public static final InstanceType FLAP = SimpleInstanceType.builder(FlapInstance::new) - .cullShader(asResource("instance/cull/flap.glsl")) - .vertexShader(asResource("instance/flap.vert")) - .layout(LayoutBuilder.create() - .vector("instancePos", FloatRepr.FLOAT, 3) - .vector("light", IntegerRepr.SHORT, 2) - .vector("segmentOffset", FloatRepr.FLOAT, 3) - .vector("pivot", FloatRepr.FLOAT, 3) - .scalar("horizontalAngle", FloatRepr.FLOAT) - .scalar("intensity", FloatRepr.FLOAT) - .scalar("flapScale", FloatRepr.FLOAT) - .scalar("flapness", FloatRepr.FLOAT) - .build()) - .writer((ptr, instance) -> { - MemoryUtil.memPutFloat(ptr, instance.x); - MemoryUtil.memPutFloat(ptr + 4, instance.y); - MemoryUtil.memPutFloat(ptr + 8, instance.z); - ExtraMemoryOps.put2x16(ptr + 12, instance.packedLight); - MemoryUtil.memPutFloat(ptr + 16, instance.segmentOffsetX); - MemoryUtil.memPutFloat(ptr + 20, instance.segmentOffsetY); - MemoryUtil.memPutFloat(ptr + 24, instance.segmentOffsetZ); - MemoryUtil.memPutFloat(ptr + 28, instance.pivotX); - MemoryUtil.memPutFloat(ptr + 32, instance.pivotY); - MemoryUtil.memPutFloat(ptr + 36, instance.pivotZ); - MemoryUtil.memPutFloat(ptr + 40, instance.horizontalAngle); - MemoryUtil.memPutFloat(ptr + 44, instance.intensity); - MemoryUtil.memPutFloat(ptr + 48, instance.flapScale); - MemoryUtil.memPutFloat(ptr + 52, instance.flapness); - }) - .build(); - public static void init() { // noop } diff --git a/src/main/resources/assets/create/flywheel/instance/cull/flap.glsl b/src/main/resources/assets/create/flywheel/instance/cull/flap.glsl deleted file mode 100644 index 1a4fed42bf..0000000000 --- a/src/main/resources/assets/create/flywheel/instance/cull/flap.glsl +++ /dev/null @@ -1,27 +0,0 @@ -#define PI 3.1415926538 - -#include "flywheel:util/quaternion.glsl" - -float getFlapAngle(float flapness, float intensity, float scale) { - float absFlap = abs(flapness); - - float angle = sin((1. - absFlap) * PI * intensity) * 30. * flapness * scale; - - float halfAngle = angle * 0.5; - - float which = step(0., flapness); // 0 if negative, 1 if positive - float degrees = which * halfAngle + (1. - which) * angle; // branchless conditional multiply - - return degrees; -} - -void flw_transformBoundingSphere(in FlwInstance flap, inout vec3 center, inout float radius) { - // FIXME: this is incorrect, but it compiles - float flapAngle = getFlapAngle(flap.flapness, flap.intensity, flap.flapScale); - - vec4 orientation = quaternion(vec3(0., 1., 0.), -flap.horizontalAngle); - vec4 flapRotation = quaternion(vec3(1., 0., 0.), flapAngle); - - vec3 rotated = rotateByQuaternion(center - flap.pivot, flapRotation) + flap.pivot + flap.segmentOffset; - center = rotateByQuaternion(rotated - .5, orientation) + flap.instancePos + .5; -} diff --git a/src/main/resources/assets/create/flywheel/instance/flap.vert b/src/main/resources/assets/create/flywheel/instance/flap.vert deleted file mode 100644 index bc655cd448..0000000000 --- a/src/main/resources/assets/create/flywheel/instance/flap.vert +++ /dev/null @@ -1,29 +0,0 @@ -#define PI 3.1415926538 - -#include "flywheel:util/quaternion.glsl" - -float getFlapAngle(float flapness, float intensity, float scale) { - float absFlap = abs(flapness); - - float angle = sin((1. - absFlap) * PI * intensity) * 30. * flapness * scale; - - float halfAngle = angle * 0.5; - - float which = step(0., flapness); // 0 if negative, 1 if positive - float degrees = which * halfAngle + (1. - which) * angle; // branchless conditional multiply - - return degrees; -} - -void flw_instanceVertex(in FlwInstance flap) { - float flapAngle = getFlapAngle(flap.flapness, flap.intensity, flap.flapScale); - - vec4 orientation = quaternionDegrees(vec3(0., 1., 0.), -flap.horizontalAngle); - vec4 flapRotation = quaternionDegrees(vec3(1., 0., 0.), flapAngle); - - vec3 rotated = rotateByQuaternion(flw_vertexPos.xyz - flap.pivot, flapRotation) + flap.pivot + flap.segmentOffset; - - flw_vertexPos.xyz = rotateByQuaternion(rotated - .5, orientation) + flap.instancePos + .5; - flw_vertexNormal = rotateByQuaternion(rotateByQuaternion(flw_vertexNormal, flapRotation), orientation); - flw_vertexLight = vec2(flap.light) / 256.; -} From 3b7b5a9eee416f84ebc4b45571bd0bb70f0f8196 Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Mon, 11 Nov 2024 22:49:26 -0800 Subject: [PATCH 123/515] Burying the lighting bugs - This may not be worth it, but it definitely looks better - Switch to flat shader lighting for curved track segments - Fixes dark track segments when clipped into hills - Bump flywheel version --- gradle.properties | 2 +- .../content/trains/track/TrackVisual.java | 73 +++++++++++-------- .../foundation/render/ShaderLightPartial.java | 38 ++++++++++ 3 files changed, 80 insertions(+), 33 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/render/ShaderLightPartial.java diff --git a/gradle.properties b/gradle.properties index 43fade102b..4527abb8e4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -23,7 +23,7 @@ use_parchment = true # dependency versions registrate_version = MC1.20-1.3.3 flywheel_minecraft_version = 1.20.1 -flywheel_version = 1.0.0-beta-160 +flywheel_version = 1.0.0-beta-163 jei_minecraft_version = 1.20.1 jei_version = 15.10.0.39 curios_minecraft_version = 1.20.1 diff --git a/src/main/java/com/simibubi/create/content/trains/track/TrackVisual.java b/src/main/java/com/simibubi/create/content/trains/track/TrackVisual.java index 1c344e726d..d37765931e 100644 --- a/src/main/java/com/simibubi/create/content/trains/track/TrackVisual.java +++ b/src/main/java/com/simibubi/create/content/trains/track/TrackVisual.java @@ -10,10 +10,13 @@ import javax.annotation.Nullable; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack.Pose; import com.simibubi.create.AllPartialModels; +import com.simibubi.create.content.contraptions.render.ContraptionVisual; import com.simibubi.create.content.trains.track.BezierConnection.GirderAngles; import com.simibubi.create.content.trains.track.BezierConnection.SegmentAngles; +import com.simibubi.create.foundation.render.ShaderLightPartial; import dev.engine_room.flywheel.api.instance.Instance; +import dev.engine_room.flywheel.api.visual.ShaderLightVisual; import dev.engine_room.flywheel.api.visualization.VisualizationContext; import dev.engine_room.flywheel.lib.instance.FlatLit; import dev.engine_room.flywheel.lib.instance.InstanceTypes; @@ -30,7 +33,7 @@ import net.minecraft.core.SectionPos; import net.minecraft.world.level.Level; import net.minecraft.world.level.LightLayer; -public class TrackVisual extends AbstractBlockEntityVisual { +public class TrackVisual extends AbstractBlockEntityVisual implements ShaderLightVisual { private final List visuals = new ArrayList<>(); @@ -40,6 +43,12 @@ public class TrackVisual extends AbstractBlockEntityVisual { collectConnections(); } + @Override + public void setSectionCollector(SectionCollector sectionCollector) { + super.setSectionCollector(sectionCollector); + lightSections.sections(collectLightSections()); + } + @Override public void update(float pt) { if (blockEntity.connections.isEmpty()) @@ -79,8 +88,6 @@ public class TrackVisual extends AbstractBlockEntityVisual { } public LongSet collectLightSections() { - LongSet longSet = new LongArraySet(); - if (blockEntity.connections.isEmpty()) { return LongSet.of(); } @@ -90,19 +97,35 @@ public class TrackVisual extends AbstractBlockEntityVisual { int maxX = Integer.MIN_VALUE; int maxY = Integer.MIN_VALUE; int maxZ = Integer.MIN_VALUE; - for (BlockPos pos : blockEntity.connections.keySet()) { - minX = Math.min(minX, pos.getX()); - minY = Math.min(minY, pos.getY()); - minZ = Math.min(minZ, pos.getZ()); - maxX = Math.max(maxX, pos.getX()); - maxY = Math.max(maxY, pos.getY()); - maxZ = Math.max(maxZ, pos.getZ()); + for (BezierConnection connection : blockEntity.connections.values()) { + for (BlockPos pos : connection.bePositions) { + minX = Math.min(minX, pos.getX()); + minY = Math.min(minY, pos.getY()); + minZ = Math.min(minZ, pos.getZ()); + maxX = Math.max(maxX, pos.getX()); + maxY = Math.max(maxY, pos.getY()); + maxZ = Math.max(maxZ, pos.getZ()); + } } - SectionPos.betweenClosedStream(SectionPos.blockToSectionCoord(minX), SectionPos.blockToSectionCoord(minY), SectionPos.blockToSectionCoord(minZ), SectionPos.blockToSectionCoord(maxX), SectionPos.blockToSectionCoord(maxY), SectionPos.blockToSectionCoord(maxZ)) - .mapToLong(SectionPos::asLong) - .forEach(longSet::add); - return longSet; + var minSectionX = ContraptionVisual.minLightSection(minX); + var minSectionY = ContraptionVisual.minLightSection(minY); + var minSectionZ = ContraptionVisual.minLightSection(minZ); + int maxSectionX = ContraptionVisual.maxLightSection(maxX); + int maxSectionY = ContraptionVisual.maxLightSection(maxY); + int maxSectionZ = ContraptionVisual.maxLightSection(maxZ); + + LongSet out = new LongArraySet(); + + for (int x = minSectionX; x <= maxSectionX; x++) { + for (int y = minSectionY; y <= maxSectionY; y++) { + for (int z = minSectionZ; z <= maxSectionZ; z++) { + out.add(SectionPos.asLong(x, y, z)); + } + } + } + + return out; } @Override @@ -117,14 +140,10 @@ public class TrackVisual extends AbstractBlockEntityVisual { private final TransformedInstance[] ties; private final TransformedInstance[] left; private final TransformedInstance[] right; - private final BlockPos[] tiesLightPos; - private final BlockPos[] leftLightPos; - private final BlockPos[] rightLightPos; private @Nullable GirderVisual girder; private BezierTrackVisual(BezierConnection bc) { - BlockPos tePosition = bc.bePositions.getFirst(); girder = bc.hasGirder ? new GirderVisual(bc) : null; PoseStack pose = new PoseStack(); @@ -135,17 +154,14 @@ public class TrackVisual extends AbstractBlockEntityVisual { ties = new TransformedInstance[segCount]; left = new TransformedInstance[segCount]; right = new TransformedInstance[segCount]; - tiesLightPos = new BlockPos[segCount]; - leftLightPos = new BlockPos[segCount]; - rightLightPos = new BlockPos[segCount]; TrackMaterial.TrackModelHolder modelHolder = bc.getMaterial().getModelHolder(); - instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(modelHolder.tie())) + instancerProvider().instancer(InstanceTypes.TRANSFORMED, ShaderLightPartial.flat(modelHolder.tie())) .createInstances(ties); - instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(modelHolder.leftSegment())) + instancerProvider().instancer(InstanceTypes.TRANSFORMED, ShaderLightPartial.flat(modelHolder.leftSegment())) .createInstances(left); - instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(modelHolder.rightSegment())) + instancerProvider().instancer(InstanceTypes.TRANSFORMED, ShaderLightPartial.flat(modelHolder.rightSegment())) .createInstances(right); SegmentAngles[] segments = bc.getBakedSegments(); @@ -156,14 +172,12 @@ public class TrackVisual extends AbstractBlockEntityVisual { ties[modelIndex].setTransform(pose) .mul(segment.tieTransform) .setChanged(); - tiesLightPos[modelIndex] = segment.lightPosition.offset(tePosition); for (boolean first : Iterate.trueAndFalse) { Pose transform = segment.railTransforms.get(first); (first ? this.left : this.right)[modelIndex].setTransform(pose) .mul(transform) .setChanged(); - (first ? leftLightPos : rightLightPos)[modelIndex] = segment.lightPosition.offset(tePosition); } } @@ -182,12 +196,7 @@ public class TrackVisual extends AbstractBlockEntityVisual { } void updateLight() { - for (int i = 0; i < ties.length; i++) - TrackVisual.updateLight(ties[i], level, tiesLightPos[i]); - for (int i = 0; i < left.length; i++) - TrackVisual.updateLight(left[i], level, leftLightPos[i]); - for (int i = 0; i < right.length; i++) - TrackVisual.updateLight(right[i], level, rightLightPos[i]); + // Light for ties/rails handled by shader light since they tend to clip into blocks if (girder != null) girder.updateLight(); } diff --git a/src/main/java/com/simibubi/create/foundation/render/ShaderLightPartial.java b/src/main/java/com/simibubi/create/foundation/render/ShaderLightPartial.java new file mode 100644 index 0000000000..c7013b9794 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/ShaderLightPartial.java @@ -0,0 +1,38 @@ +package com.simibubi.create.foundation.render; + +import org.jetbrains.annotations.Nullable; + +import dev.engine_room.flywheel.api.material.LightShader; +import dev.engine_room.flywheel.api.model.Model; +import dev.engine_room.flywheel.lib.material.LightShaders; +import dev.engine_room.flywheel.lib.material.SimpleMaterial; +import dev.engine_room.flywheel.lib.model.ModelUtil; +import dev.engine_room.flywheel.lib.model.baked.BakedModelBuilder; +import dev.engine_room.flywheel.lib.model.baked.PartialModel; +import dev.engine_room.flywheel.lib.util.ResourceReloadCache; +import net.minecraft.client.renderer.RenderType; + +public class ShaderLightPartial { + private static final ResourceReloadCache FLAT = new ResourceReloadCache<>(it -> BakedModelBuilder.create(it.get()) + .materialFunc((renderType, aBoolean) -> getMaterial(renderType, aBoolean, LightShaders.FLAT)) + .build()); + + private static final ResourceReloadCache SMOOTH = new ResourceReloadCache<>(it -> BakedModelBuilder.create(it.get()) + .materialFunc((renderType, aBoolean) -> getMaterial(renderType, aBoolean, LightShaders.SMOOTH)) + .build()); + + public static Model flat(PartialModel partial) { + return FLAT.get(partial); + } + + @Nullable + private static SimpleMaterial getMaterial(RenderType renderType, Boolean aBoolean, LightShader lightShader) { + var material = ModelUtil.getMaterial(renderType, aBoolean); + if (material == null) { + return null; + } + return SimpleMaterial.builderOf(material) + .light(lightShader) + .build(); + } +} From 3eae6fbf32786ce06fe904e803fcfe8a5d2559b0 Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Fri, 15 Nov 2024 11:11:46 -0800 Subject: [PATCH 124/515] Going up! - Round the scroll delta away from zero when interacting with elevator contraption controls - Fixes issue where I wasn't able to scroll up to select a higher floor --- .../content/contraptions/elevator/ElevatorControlsHandler.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorControlsHandler.java b/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorControlsHandler.java index 1c55bcbde7..5f5e85288d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorControlsHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorControlsHandler.java @@ -112,7 +112,8 @@ public class ElevatorControlsHandler { ElevatorFloorSelection efs = (ElevatorFloorSelection) ctx.temporaryData; int prev = efs.currentIndex; - efs.currentIndex += delta; + // Round away from 0. delta may be ~0.9, which is implicitly floor'd during a pure cast. + efs.currentIndex += (int) (delta > 0 ? Math.ceil(delta) : Math.floor(delta)); ContraptionControlsMovement.tickFloorSelection(efs, ec); if (prev != efs.currentIndex && !ec.namesList.isEmpty()) { From a7a85c7296d4cad107c5736b23313f61cfa9eba1 Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Fri, 15 Nov 2024 13:12:16 -0800 Subject: [PATCH 125/515] Elevating the look - Implement ElevatorPulleyVisual - Makes good use of recycling and instance hiding - Fixes issue where the elevator belt cannot be seen at the bottom of very tall elevators - Add offset field to scroll instance to support the elevator belt's CPU driven animation - Use shader light for the elevator belt to simplify tracking. Might be better off copying what the other pulleys do, but this achieves the effect quite well. - Bump flywheel version --- gradle.properties | 2 +- .../simibubi/create/AllBlockEntityTypes.java | 3 +- .../elevator/ElevatorPulleyRenderer.java | 10 +- .../elevator/ElevatorPulleyVisual.java | 187 +++++++++++++++++- .../processing/burner/ScrollInstance.java | 44 +++++ .../foundation/render/AllInstanceTypes.java | 3 + .../create/flywheel/instance/scrolling.vert | 2 +- 7 files changed, 237 insertions(+), 14 deletions(-) diff --git a/gradle.properties b/gradle.properties index 4527abb8e4..d563c0e489 100644 --- a/gradle.properties +++ b/gradle.properties @@ -23,7 +23,7 @@ use_parchment = true # dependency versions registrate_version = MC1.20-1.3.3 flywheel_minecraft_version = 1.20.1 -flywheel_version = 1.0.0-beta-163 +flywheel_version = 1.0.0-beta-165 jei_minecraft_version = 1.20.1 jei_version = 15.10.0.39 curios_minecraft_version = 1.20.1 diff --git a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java index 2c59ddf951..432a3c7a9b 100644 --- a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java +++ b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java @@ -25,6 +25,7 @@ import com.simibubi.create.content.contraptions.chassis.StickerVisual; import com.simibubi.create.content.contraptions.elevator.ElevatorContactBlockEntity; import com.simibubi.create.content.contraptions.elevator.ElevatorPulleyBlockEntity; import com.simibubi.create.content.contraptions.elevator.ElevatorPulleyRenderer; +import com.simibubi.create.content.contraptions.elevator.ElevatorPulleyVisual; import com.simibubi.create.content.contraptions.gantry.GantryCarriageBlockEntity; import com.simibubi.create.content.contraptions.gantry.GantryCarriageRenderer; import com.simibubi.create.content.contraptions.gantry.GantryCarriageVisual; @@ -580,7 +581,7 @@ public class AllBlockEntityTypes { public static final BlockEntityEntry ELEVATOR_PULLEY = REGISTRATE.blockEntity("elevator_pulley", ElevatorPulleyBlockEntity::new) -// .instance(() -> ElevatorPulleyInstance::new, false) + .visual(() -> ElevatorPulleyVisual::new, false) .validBlocks(AllBlocks.ELEVATOR_PULLEY) .renderer(() -> ElevatorPulleyRenderer::new) .register(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorPulleyRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorPulleyRenderer.java index 5a139eb7d4..c985a5efeb 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorPulleyRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorPulleyRenderer.java @@ -29,15 +29,7 @@ public class ElevatorPulleyRenderer extends KineticBlockEntityRenderer implements SimpleDynamicVisual { +public class ElevatorPulleyVisual extends ShaftVisual implements SimpleDynamicVisual, ShaderLightVisual { + private final InstanceRecycler belt; + private final ScrollInstance halfBelt; + + private final ScrollInstance coil; + + private final TransformedInstance magnet; + + private final Matrix4fc cachedMagnetTransform; + + private float lastOffset = Float.NaN; + + private final long topSection; + + private long lastBottomSection; public ElevatorPulleyVisual(VisualizationContext context, ElevatorPulleyBlockEntity blockEntity, float partialTick) { super(context, blockEntity, partialTick); + + float blockStateAngle = + AngleHelper.horizontalAngle(blockState.getValue(ElevatorPulleyBlock.HORIZONTAL_FACING)); + + Quaternionfc rotation = new Quaternionf().rotationY(Mth.DEG_TO_RAD * blockStateAngle); + + topSection = SectionPos.of(pos).asLong(); + + belt = new InstanceRecycler<>(() -> context.instancerProvider() + .instancer(AllInstanceTypes.SCROLLING, ShaderLightPartial.flat(AllPartialModels.ELEVATOR_BELT)) + .createInstance() + .rotation(rotation) + .setSpriteShift(AllSpriteShifts.ELEVATOR_BELT)); + + halfBelt = context.instancerProvider() + .instancer(AllInstanceTypes.SCROLLING, ShaderLightPartial.flat(AllPartialModels.ELEVATOR_BELT_HALF)) + .createInstance() + .rotation(rotation) + .setSpriteShift(AllSpriteShifts.ELEVATOR_BELT); + + coil = context.instancerProvider() + .instancer(AllInstanceTypes.SCROLLING, Models.partial(AllPartialModels.ELEVATOR_COIL)) + .createInstance() + .position(getVisualPosition()) + .rotation(rotation) + .setSpriteShift(AllSpriteShifts.ELEVATOR_COIL); + + coil.setChanged(); + + magnet = context.instancerProvider() + .instancer(InstanceTypes.TRANSFORMED, ShaderLightPartial.flat(AllPartialModels.ELEVATOR_MAGNET)) + .createInstance(); + + // Cache the magnet's transform to avoid recalculating this unchanging bit every frame + magnet.setIdentityTransform() + .translate(getVisualPosition()) + .center() + .rotateYDegrees(blockStateAngle) + .uncenter(); + + cachedMagnetTransform = new Matrix4f(magnet.pose); + + setup(PulleyRenderer.getBlockEntityOffset(partialTick, blockEntity)); + } + + @Override + public void updateLight(float partialTick) { + super.updateLight(partialTick); + + relight(coil); + } + + @Override + public void setSectionCollector(SectionCollector sectionCollector) { + super.setSectionCollector(sectionCollector); + + sectionCollector.sections(getLightSections(lastOffset)); } @Override public void beginFrame(DynamicVisual.Context ctx) { + boolean running = PulleyRenderer.isPulleyRunning(blockEntity); + + setup(PulleyRenderer.getBlockEntityOffset(ctx.partialTick(), blockEntity)); + } + + private void setup(float offset) { + if (offset == lastOffset) { + return; + } + lastOffset = offset; + + maybeUpdateSections(offset); + + animateCoil(offset); + + animateHalfBelt(offset); + + animateBelt(offset); + + animateMagnet(offset); + } + + private void maybeUpdateSections(float offset) { + if (lightSections == null) { + return; + } + if (lastBottomSection == SectionPos.offset(topSection, 0, -offset2SectionCount(offset), 0)) { + return; + } + + lightSections.sections(getLightSections(offset)); + } + + private void animateMagnet(float offset) { + magnet.setTransform(cachedMagnetTransform) + .translateY(-offset) + .setChanged(); + } + + private void animateBelt(float offset) { + belt.resetCount(); + + for (int i = 0; i < offset - .25f; i++) { + var segment = belt.get() + .position(getVisualPosition()) + .shift(0, -(offset - i), 0); + + segment.offsetV = offset; + + segment.setChanged(); + } + + belt.discardExtra(); + } + + private void animateHalfBelt(float offset) { + float f = offset % 1; + if (f < .25f || f > .75f) { + halfBelt.setVisible(true); + halfBelt.position(getVisualPosition()) + .shift(0, -(f > .75f ? f - 1 : f), 0); + + halfBelt.offsetV = offset; + + halfBelt.setChanged(); + } else { + halfBelt.setVisible(false); + } + } + + private void animateCoil(float offset) { + coil.offsetV = -offset * 2; + + coil.setChanged(); + } + + private LongSet getLightSections(float offset) { + var out = new LongArraySet(); + + int sectionCount = offset2SectionCount(offset); + + for (int i = 0; i < sectionCount; i++) { + out.add(SectionPos.offset(topSection, 0, -i, 0)); + } + + lastBottomSection = SectionPos.offset(topSection, 0, -sectionCount, 0); + + return out; + } + + private static int offset2SectionCount(float offset) { + return (int) Math.ceil(offset / 16); } } diff --git a/src/main/java/com/simibubi/create/content/processing/burner/ScrollInstance.java b/src/main/java/com/simibubi/create/content/processing/burner/ScrollInstance.java index 12bcc25e1a..ad2e8af545 100644 --- a/src/main/java/com/simibubi/create/content/processing/burner/ScrollInstance.java +++ b/src/main/java/com/simibubi/create/content/processing/burner/ScrollInstance.java @@ -1,10 +1,12 @@ package com.simibubi.create.content.processing.burner; import org.joml.Quaternionf; +import org.joml.Quaternionfc; import dev.engine_room.flywheel.api.instance.InstanceHandle; import dev.engine_room.flywheel.api.instance.InstanceType; import dev.engine_room.flywheel.lib.instance.ColoredLitInstance; +import net.createmod.catnip.render.SpriteShiftEntry; import net.minecraft.core.Vec3i; public class ScrollInstance extends ColoredLitInstance { @@ -16,6 +18,9 @@ public class ScrollInstance extends ColoredLitInstance { public float speedU; public float speedV; + public float offsetU; + public float offsetV; + public float diffU; public float diffV; @@ -32,4 +37,43 @@ public class ScrollInstance extends ColoredLitInstance { this.z = position.getZ(); return this; } + + public ScrollInstance position(float x, float y, float z) { + this.x = x; + this.y = y; + this.z = z; + return this; + } + + public ScrollInstance shift(float x, float y, float z) { + this.x += x; + this.y += y; + this.z += z; + return this; + } + + public ScrollInstance rotation(Quaternionfc rotation) { + this.rotation.set(rotation); + return this; + } + + public ScrollInstance setSpriteShift(SpriteShiftEntry spriteShift) { + float spriteWidth = spriteShift.getTarget() + .getU1() + - spriteShift.getTarget() + .getU0(); + + float spriteHeight = spriteShift.getTarget() + .getV1() + - spriteShift.getTarget() + .getV0(); + + scaleU = spriteWidth / 2; + scaleV = spriteHeight / 2; + + diffU = spriteShift.getTarget().getU0() - spriteShift.getOriginal().getU0(); + diffV = spriteShift.getTarget().getV0() - spriteShift.getOriginal().getV0(); + + return this; + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/AllInstanceTypes.java b/src/main/java/com/simibubi/create/foundation/render/AllInstanceTypes.java index e004e3789c..e9144162a1 100644 --- a/src/main/java/com/simibubi/create/foundation/render/AllInstanceTypes.java +++ b/src/main/java/com/simibubi/create/foundation/render/AllInstanceTypes.java @@ -101,6 +101,7 @@ public class AllInstanceTypes { .vector("speed", FloatRepr.FLOAT, 2) .vector("diff", FloatRepr.FLOAT, 2) .vector("scale", FloatRepr.FLOAT, 2) + .vector("offset", FloatRepr.FLOAT, 2) .build()) .writer((ptr, instance) -> { MemoryUtil.memPutByte(ptr, instance.red); @@ -119,6 +120,8 @@ public class AllInstanceTypes { MemoryUtil.memPutFloat(ptr + 52, instance.diffV); MemoryUtil.memPutFloat(ptr + 56, instance.scaleU); MemoryUtil.memPutFloat(ptr + 60, instance.scaleV); + MemoryUtil.memPutFloat(ptr + 64, instance.offsetU); + MemoryUtil.memPutFloat(ptr + 68, instance.offsetV); }) .build(); diff --git a/src/main/resources/assets/create/flywheel/instance/scrolling.vert b/src/main/resources/assets/create/flywheel/instance/scrolling.vert index 73a97f002e..29d1c27e6d 100644 --- a/src/main/resources/assets/create/flywheel/instance/scrolling.vert +++ b/src/main/resources/assets/create/flywheel/instance/scrolling.vert @@ -6,7 +6,7 @@ void flw_instanceVertex(in FlwInstance instance) { flw_vertexNormal = rotateByQuaternion(flw_vertexNormal, instance.rotation); - vec2 scroll = fract(instance.speed * flw_renderTicks) * instance.scale; + vec2 scroll = fract(instance.speed * flw_renderTicks + instance.offset) * instance.scale; flw_vertexTexCoord = flw_vertexTexCoord + instance.diff + scroll; flw_vertexLight = vec2(instance.light) / 256.; From 57db100bc3b84db6432a053e7747891521c81e78 Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Fri, 15 Nov 2024 13:21:26 -0800 Subject: [PATCH 126/515] Please step off - Actually delete elevator instances - Fix off-by-one error causing the magnet to appear dark when placed --- .../elevator/ElevatorPulleyVisual.java | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorPulleyVisual.java b/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorPulleyVisual.java index edacf453ca..5678ab1470 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorPulleyVisual.java +++ b/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorPulleyVisual.java @@ -87,7 +87,7 @@ public class ElevatorPulleyVisual extends ShaftVisual cachedMagnetTransform = new Matrix4f(magnet.pose); - setup(PulleyRenderer.getBlockEntityOffset(partialTick, blockEntity)); + animate(PulleyRenderer.getBlockEntityOffset(partialTick, blockEntity)); } @Override @@ -106,12 +106,20 @@ public class ElevatorPulleyVisual extends ShaftVisual @Override public void beginFrame(DynamicVisual.Context ctx) { - boolean running = PulleyRenderer.isPulleyRunning(blockEntity); - - setup(PulleyRenderer.getBlockEntityOffset(ctx.partialTick(), blockEntity)); + animate(PulleyRenderer.getBlockEntityOffset(ctx.partialTick(), blockEntity)); } - private void setup(float offset) { + @Override + protected void _delete() { + super._delete(); + + belt.delete(); + halfBelt.delete(); + coil.delete(); + magnet.delete(); + } + + private void animate(float offset) { if (offset == lastOffset) { return; } @@ -197,7 +205,7 @@ public class ElevatorPulleyVisual extends ShaftVisual } private static int offset2SectionCount(float offset) { - return (int) Math.ceil(offset / 16); + return (int) Math.ceil((offset + 1) / 16); } } From 6155883de04b049f709a50839663ebeeb24f464a Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Sat, 16 Nov 2024 16:13:51 -0800 Subject: [PATCH 127/515] Know your place! - Using new debug tool, fix all visuals that initialize their instances at the render origin - Update ArmVisual and SteamEngineVisual to use instance hiding - Update SchematicannonVisual, SteamEngineVisual, and ToolBoxVisual to avoid re-calculating animations when nothing is happening - Use RecyclingPoseStacks in ArmVisual and CarriageContraptionVisual - Bump flywheel version --- gradle.properties | 2 +- .../contraptions/actors/psi/PIInstance.java | 6 +- .../actors/psi/PSIActorVisual.java | 3 +- .../contraptions/actors/psi/PSIVisual.java | 5 +- .../pulley/AbstractPulleyVisual.java | 5 ++ .../render/ContraptionVisual.java | 4 -- .../equipment/toolbox/ToolBoxVisual.java | 42 ++++++++---- .../kinetics/mechanicalArm/ArmVisual.java | 67 ++++++++++--------- .../steamEngine/SteamEngineVisual.java | 30 +++++++-- .../logistics/funnel/FunnelVisual.java | 4 +- .../cannon/SchematicannonVisual.java | 65 ++++++++++-------- .../entity/CarriageContraptionVisual.java | 50 ++++++++------ 12 files changed, 168 insertions(+), 115 deletions(-) diff --git a/gradle.properties b/gradle.properties index d563c0e489..db65d49e1b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -23,7 +23,7 @@ use_parchment = true # dependency versions registrate_version = MC1.20-1.3.3 flywheel_minecraft_version = 1.20.1 -flywheel_version = 1.0.0-beta-165 +flywheel_version = 1.0.0-beta-167 jei_minecraft_version = 1.20.1 jei_version = 15.10.0.39 curios_minecraft_version = 1.20.1 diff --git a/src/main/java/com/simibubi/create/content/contraptions/actors/psi/PIInstance.java b/src/main/java/com/simibubi/create/content/contraptions/actors/psi/PIInstance.java index 6b20b99f88..d0fbc8abfd 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/actors/psi/PIInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/actors/psi/PIInstance.java @@ -23,17 +23,15 @@ public class PIInstance { TransformedInstance middle; TransformedInstance top; - public PIInstance(InstancerProvider instancerProvider, BlockState blockState, BlockPos instancePos) { + public PIInstance(InstancerProvider instancerProvider, BlockState blockState, BlockPos instancePos, boolean lit) { this.instancerProvider = instancerProvider; this.blockState = blockState; this.instancePos = instancePos; Direction facing = blockState.getValue(PortableStorageInterfaceBlock.FACING); angleX = facing == Direction.UP ? 0 : facing == Direction.DOWN ? 180 : 90; angleY = AngleHelper.horizontalAngle(facing); - } - - public void init(boolean lit) { this.lit = lit; + middle = instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(PortableStorageInterfaceRenderer.getMiddleForState(blockState, lit))) .createInstance(); top = instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(PortableStorageInterfaceRenderer.getTopForState(blockState))) diff --git a/src/main/java/com/simibubi/create/content/contraptions/actors/psi/PSIActorVisual.java b/src/main/java/com/simibubi/create/content/contraptions/actors/psi/PSIActorVisual.java index 6dc04fb5cc..b1f44c61b5 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/actors/psi/PSIActorVisual.java +++ b/src/main/java/com/simibubi/create/content/contraptions/actors/psi/PSIActorVisual.java @@ -15,9 +15,8 @@ public class PSIActorVisual extends ActorVisual { public PSIActorVisual(VisualizationContext context, VirtualRenderWorld world, MovementContext movementContext) { super(context, world, movementContext); - instance = new PIInstance(context.instancerProvider(), movementContext.state, movementContext.localPos); + instance = new PIInstance(context.instancerProvider(), movementContext.state, movementContext.localPos, false); - instance.init(false); instance.middle.light(localBlockLight(), 0); instance.top.light(localBlockLight(), 0); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/actors/psi/PSIVisual.java b/src/main/java/com/simibubi/create/content/contraptions/actors/psi/PSIVisual.java index e92d39b744..557c9a6372 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/actors/psi/PSIVisual.java +++ b/src/main/java/com/simibubi/create/content/contraptions/actors/psi/PSIVisual.java @@ -17,9 +17,8 @@ public class PSIVisual extends AbstractBlockEntityVisual extends updateOffset(partialTick); updateLight(partialTick); + animate(); } @Override @@ -83,6 +84,10 @@ public abstract class AbstractPulleyVisual extends @Override public void beginFrame(DynamicVisual.Context ctx) { updateOffset(ctx.partialTick()); + animate(); + } + + private void animate() { coil.rotation(rotationAxis.rotationDegrees(offset * 180)) .setChanged(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionVisual.java b/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionVisual.java index c86cbc5095..a48b484cb8 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionVisual.java +++ b/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionVisual.java @@ -68,10 +68,6 @@ public class ContraptionVisual extends Abst super(ctx, entity, partialTick); embedding = ctx.createEmbedding(Vec3i.ZERO); - init(partialTick); - } - - protected void init(float partialTick) { setEmbeddingMatrices(partialTick); Contraption contraption = entity.getContraption(); diff --git a/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolBoxVisual.java b/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolBoxVisual.java index 523e4d8622..c661193f2d 100644 --- a/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolBoxVisual.java +++ b/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolBoxVisual.java @@ -22,6 +22,9 @@ public class ToolBoxVisual extends AbstractBlockEntityVisual private final TransformedInstance lid; private final TransformedInstance[] drawers; + private float lastLidAngle = Float.NaN; + private float lastDrawerOffset = Float.NaN; + public ToolBoxVisual(VisualizationContext context, ToolboxBlockEntity blockEntity, float partialTick) { super(context, blockEntity, partialTick); @@ -33,6 +36,8 @@ public class ToolBoxVisual extends AbstractBlockEntityVisual drawers = new TransformedInstance[]{drawerModel.createInstance(), drawerModel.createInstance()}; lid = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.TOOLBOX_LIDS.get(blockEntity.getColor()))) .createInstance(); + + animate(partialTick); } @Override @@ -46,30 +51,39 @@ public class ToolBoxVisual extends AbstractBlockEntityVisual @Override public void beginFrame(DynamicVisual.Context ctx) { - float partialTicks = ctx.partialTick(); + animate(ctx.partialTick()); + } + private void animate(float partialTicks) { float lidAngle = blockEntity.lid.getValue(partialTicks); float drawerOffset = blockEntity.drawers.getValue(partialTicks); - lid.setIdentityTransform() - .translate(getVisualPosition()) - .center() - .rotateYDegrees(-facing.toYRot()) - .uncenter() - .translate(0, 6 / 16f, 12 / 16f) - .rotateXDegrees(135 * lidAngle) - .translateBack(0, 6 / 16f, 12 / 16f) - .setChanged(); - - for (int offset : Iterate.zeroAndOne) { - drawers[offset].setIdentityTransform() + if (lidAngle != lastLidAngle) { + lid.setIdentityTransform() .translate(getVisualPosition()) .center() .rotateYDegrees(-facing.toYRot()) .uncenter() - .translate(0, offset * 1 / 8f, -drawerOffset * .175f * (2 - offset)) + .translate(0, 6 / 16f, 12 / 16f) + .rotateXDegrees(135 * lidAngle) + .translateBack(0, 6 / 16f, 12 / 16f) .setChanged(); } + + if (drawerOffset != lastDrawerOffset) { + for (int offset : Iterate.zeroAndOne) { + drawers[offset].setIdentityTransform() + .translate(getVisualPosition()) + .center() + .rotateYDegrees(-facing.toYRot()) + .uncenter() + .translate(0, offset * 1 / 8f, -drawerOffset * .175f * (2 - offset)) + .setChanged(); + } + } + + lastLidAngle = lidAngle; + lastDrawerOffset = drawerOffset; } @Override diff --git a/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmVisual.java b/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmVisual.java index ef6f6554a5..538b09776a 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmVisual.java @@ -4,7 +4,6 @@ import java.util.ArrayList; import java.util.function.Consumer; import com.google.common.collect.Lists; -import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.kinetics.base.SingleRotatingVisual; @@ -18,6 +17,7 @@ import dev.engine_room.flywheel.lib.instance.InstanceTypes; import dev.engine_room.flywheel.lib.instance.TransformedInstance; import dev.engine_room.flywheel.lib.model.Models; import dev.engine_room.flywheel.lib.transform.TransformStack; +import dev.engine_room.flywheel.lib.util.RecyclingPoseStack; import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; import net.createmod.catnip.utility.Iterate; import net.createmod.catnip.utility.theme.Color; @@ -33,14 +33,15 @@ public class ArmVisual extends SingleRotatingVisual implements S final TransformedInstance base; final TransformedInstance lowerBody; final TransformedInstance upperBody; - TransformedInstance claw; + final TransformedInstance claw; private final ArrayList clawGrips; private final ArrayList models; - private final Boolean ceiling; + private final boolean ceiling; - private boolean firstRender = true; + private final RecyclingPoseStack poseStack = new RecyclingPoseStack(); + private boolean wasDancing = false; private float baseAngle = Float.NaN; private float lowerArmAngle = Float.NaN; private float upperArmAngle = Float.NaN; @@ -67,19 +68,28 @@ public class ArmVisual extends SingleRotatingVisual implements S models = Lists.newArrayList(base, lowerBody, upperBody, claw, clawGrip1, clawGrip2); ceiling = blockState.getValue(ArmBlock.CEILING); - animateArm(); + var msr = TransformStack.of(poseStack); + msr.translate(getVisualPosition()); + msr.center(); + + if (ceiling) + msr.rotateXDegrees(180); + + animate(partialTick); } @Override public void beginFrame(DynamicVisual.Context ctx) { + animate(ctx.partialTick()); + } + + private void animate(float pt) { if (blockEntity.phase == ArmBlockEntity.Phase.DANCING && blockEntity.getSpeed() != 0) { - animateRave(ctx.partialTick()); - firstRender = true; + animateRave(pt); + wasDancing = true; return; } - float pt = ctx.partialTick(); - float baseAngleNow = blockEntity.baseAngle.getValue(pt); float lowerArmAngleNow = blockEntity.lowerArmAngle.getValue(pt); float upperArmAngleNow = blockEntity.upperArmAngle.getValue(pt); @@ -93,11 +103,11 @@ public class ArmVisual extends SingleRotatingVisual implements S this.upperArmAngle = upperArmAngleNow; this.headAngle = headAngleNow; - if (!settled || firstRender) + // Need to reset the animation if the arm is dancing. We'd very likely be settled + if (!settled || wasDancing) animateArm(); - if (firstRender) - firstRender = false; + wasDancing = false; } private void animateRave(float partialTick) { @@ -118,25 +128,21 @@ public class ArmVisual extends SingleRotatingVisual implements S } private void updateAngles(float baseAngle, float lowerArmAngle, float upperArmAngle, float headAngle, int color) { - PoseStack msLocal = new PoseStack(); - var msr = TransformStack.of(msLocal); - msr.translate(getVisualPosition()); - msr.center(); + poseStack.pushPose(); - if (ceiling) - msr.rotateXDegrees(180); + var msr = TransformStack.of(poseStack); ArmRenderer.transformBase(msr, baseAngle); - base.setTransform(msLocal) + base.setTransform(poseStack) .setChanged(); ArmRenderer.transformLowerArm(msr, lowerArmAngle); - lowerBody.setTransform(msLocal) + lowerBody.setTransform(poseStack) .colorRgb(color) .setChanged(); ArmRenderer.transformUpperArm(msr, upperArmAngle); - upperBody.setTransform(msLocal) + upperBody.setTransform(poseStack) .colorRgb(color) .setChanged(); @@ -145,7 +151,7 @@ public class ArmVisual extends SingleRotatingVisual implements S if (ceiling && blockEntity.goggles) msr.rotateZDegrees(180); - claw.setTransform(msLocal) + claw.setTransform(poseStack) .setChanged(); if (ceiling && blockEntity.goggles) @@ -160,26 +166,23 @@ public class ArmVisual extends SingleRotatingVisual implements S .isGui3d(); for (int index : Iterate.zeroAndOne) { - msLocal.pushPose(); + poseStack.pushPose(); int flip = index * 2 - 1; ArmRenderer.transformClawHalf(msr, hasItem, isBlockItem, flip); clawGrips.get(index) - .setTransform(msLocal) + .setTransform(poseStack) .setChanged(); - msLocal.popPose(); + poseStack.popPose(); } + + poseStack.popPose(); } @Override public void update(float pt) { super.update(pt); - models.remove(claw); - claw.delete(); - claw = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(blockEntity.goggles ? AllPartialModels.ARM_CLAW_BASE_GOGGLES : AllPartialModels.ARM_CLAW_BASE)) - .createInstance(); - models.add(claw); - updateLight(pt); - animateArm(); + instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(blockEntity.goggles ? AllPartialModels.ARM_CLAW_BASE_GOGGLES : AllPartialModels.ARM_CLAW_BASE)) + .stealInstance(claw); } @Override diff --git a/src/main/java/com/simibubi/create/content/kinetics/steamEngine/SteamEngineVisual.java b/src/main/java/com/simibubi/create/content/kinetics/steamEngine/SteamEngineVisual.java index 07393e5d57..4e17c05061 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/steamEngine/SteamEngineVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/steamEngine/SteamEngineVisual.java @@ -1,7 +1,10 @@ package com.simibubi.create.content.kinetics.steamEngine; +import java.util.Objects; import java.util.function.Consumer; +import org.jetbrains.annotations.Nullable; + import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.kinetics.base.KineticBlockEntityRenderer; @@ -24,6 +27,9 @@ public class SteamEngineVisual extends AbstractBlockEntityVisual i var commonTransform = FlapStuffs.commonTransform(getVisualPosition(), funnelFacing, -blockEntity.getFlapOffset()); flaps = new FlapStuffs.Visual(instancerProvider(), commonTransform, FlapStuffs.FUNNEL_PIVOT, Models.partial(flapPartial)); - } + + flaps.update(blockEntity.flap.getValue(partialTick)); + } @Override public void beginFrame(DynamicVisual.Context ctx) { diff --git a/src/main/java/com/simibubi/create/content/schematics/cannon/SchematicannonVisual.java b/src/main/java/com/simibubi/create/content/schematics/cannon/SchematicannonVisual.java index c71cd5151d..3b601520c1 100644 --- a/src/main/java/com/simibubi/create/content/schematics/cannon/SchematicannonVisual.java +++ b/src/main/java/com/simibubi/create/content/schematics/cannon/SchematicannonVisual.java @@ -2,7 +2,6 @@ package com.simibubi.create.content.schematics.cannon; import java.util.function.Consumer; -import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllPartialModels; import dev.engine_room.flywheel.api.instance.Instance; @@ -11,7 +10,6 @@ import dev.engine_room.flywheel.api.visualization.VisualizationContext; import dev.engine_room.flywheel.lib.instance.InstanceTypes; import dev.engine_room.flywheel.lib.instance.TransformedInstance; import dev.engine_room.flywheel.lib.model.Models; -import dev.engine_room.flywheel.lib.transform.TransformStack; import dev.engine_room.flywheel.lib.visual.AbstractBlockEntityVisual; import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; import net.minecraft.core.Direction; @@ -21,49 +19,58 @@ public class SchematicannonVisual extends AbstractBlockEntityVisual { - private final PoseStack poseStack = new PoseStack(); + private final PoseStack poseStack = new RecyclingPoseStack(); - @Nullable - private Carriage carriage; @Nullable private Couple<@Nullable VisualizedBogey> bogeys; private Couple bogeyHidden = Couple.create(() -> false); @@ -26,17 +25,8 @@ public class CarriageContraptionVisual extends ContraptionVisual VisualizedBogey.of(visualizationContext, bogey, pt)); - } - - super.init(pt); + animate(partialTick); } public void setBogeyVisibility(boolean first, boolean visible) { @@ -46,19 +36,37 @@ public class CarriageContraptionVisual extends ContraptionVisual VisualizedBogey.of(visualizationContext, bogey, pt)); + updateLight(pt); + return true; + } + + return false; + } + + private void animate(float partialTick) { + if (!checkCarriage(partialTick)) { return; } - float partialTick = ctx.partialTick(); - float viewYRot = entity.getViewYRot(partialTick); float viewXRot = entity.getViewXRot(partialTick); - int bogeySpacing = carriage.bogeySpacing; + int bogeySpacing = entity.getCarriage().bogeySpacing; poseStack.pushPose(); From b703de3b781d0834ff802d11e7472be4116694d2 Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Sun, 17 Nov 2024 14:08:50 -0800 Subject: [PATCH 128/515] Whisked away - Remove BeltInstance - Belt visuals now use ScrollInstance - Improve ScrollInstance setters to work well with belts - Simultaneously simplify belt visual and make it more complicated - Deduplicate setup code - Inline speed calculation and all random constants that were stored in the visual. Those are cheap enough that we can just re-calculate as necessary to save on the memory cost - Move magic constants to statics - Make instances final --- gradle.properties | 2 +- .../kinetics/base/KineticInstance.java | 13 +- .../content/kinetics/belt/BeltInstance.java | 50 ------ .../content/kinetics/belt/BeltRenderer.java | 8 +- .../content/kinetics/belt/BeltVisual.java | 159 +++++++++--------- .../processing/burner/ScrollInstance.java | 19 ++- .../foundation/render/AllInstanceTypes.java | 40 ----- .../assets/create/flywheel/instance/belt.vert | 19 --- .../create/flywheel/instance/cull/belt.glsl | 4 - 9 files changed, 107 insertions(+), 207 deletions(-) delete mode 100644 src/main/java/com/simibubi/create/content/kinetics/belt/BeltInstance.java delete mode 100644 src/main/resources/assets/create/flywheel/instance/belt.vert delete mode 100644 src/main/resources/assets/create/flywheel/instance/cull/belt.glsl diff --git a/gradle.properties b/gradle.properties index db65d49e1b..2a78b40f28 100644 --- a/gradle.properties +++ b/gradle.properties @@ -23,7 +23,7 @@ use_parchment = true # dependency versions registrate_version = MC1.20-1.3.3 flywheel_minecraft_version = 1.20.1 -flywheel_version = 1.0.0-beta-167 +flywheel_version = 1.0.0-beta-168 jei_minecraft_version = 1.20.1 jei_version = 15.10.0.39 curios_minecraft_version = 1.20.1 diff --git a/src/main/java/com/simibubi/create/content/kinetics/base/KineticInstance.java b/src/main/java/com/simibubi/create/content/kinetics/base/KineticInstance.java index 362a63ba63..15f8f45ddf 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/base/KineticInstance.java +++ b/src/main/java/com/simibubi/create/content/kinetics/base/KineticInstance.java @@ -42,12 +42,8 @@ public class KineticInstance extends ColoredLitInstance { } public KineticInstance setColor(KineticBlockEntity blockEntity) { - if (blockEntity.hasNetwork()) { - setColor(Color.generateFromLong(blockEntity.network)); - }else { - color(0xFF, 0xFF, 0xFF); - } - return this; + colorRgb(colorFromBE(blockEntity)); + return this; } public KineticInstance setColor(Color c) { @@ -65,4 +61,9 @@ public class KineticInstance extends ColoredLitInstance { return this; } + public static int colorFromBE(KineticBlockEntity be) { + if (be.hasNetwork()) + return Color.generateFromLong(be.network).getRGB(); + return 0xFFFFFF; + } } diff --git a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltInstance.java b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltInstance.java deleted file mode 100644 index 5866b8ff72..0000000000 --- a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltInstance.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.simibubi.create.content.kinetics.belt; - -import org.joml.Quaternionf; -import org.joml.Quaternionfc; - -import com.simibubi.create.content.kinetics.base.KineticInstance; - -import dev.engine_room.flywheel.api.instance.InstanceHandle; -import dev.engine_room.flywheel.api.instance.InstanceType; -import net.createmod.catnip.render.SpriteShiftEntry; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; - -public class BeltInstance extends KineticInstance { - public final Quaternionf rotation = new Quaternionf(); - public float sourceU; - public float sourceV; - public float minU; - public float minV; - public float maxU; - public float maxV; - public float scrollMult; - - public BeltInstance(InstanceType type, InstanceHandle handle) { - super(type, handle); - } - - public BeltInstance setRotation(Quaternionfc q) { - this.rotation.set(q); - return this; - } - - public BeltInstance setScrollTexture(SpriteShiftEntry spriteShift) { - TextureAtlasSprite source = spriteShift.getOriginal(); - TextureAtlasSprite target = spriteShift.getTarget(); - - this.sourceU = source.getU0(); - this.sourceV = source.getV0(); - this.minU = target.getU0(); - this.minV = target.getV0(); - this.maxU = target.getU1(); - this.maxV = target.getV1(); - - return this; - } - - public BeltInstance setScrollMult(float scrollMult) { - this.scrollMult = scrollMult; - return this; - } -} diff --git a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltRenderer.java b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltRenderer.java index 04bea7e747..d0bf158d92 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltRenderer.java +++ b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltRenderer.java @@ -337,10 +337,12 @@ public class BeltRenderer extends SafeBlockEntityRenderer { if (box) { ms.translate(0, 4 / 16f, 0); ms.scale(1.5f, 1.5f, 1.5f); - } else + } else { ms.scale(.5f, .5f, .5f); - itemRenderer.render(transported.stack, ItemDisplayContext.FIXED, false, ms, buffer, stackLight, overlay, bakedModel); - ms.popPose(); + } + + itemRenderer.render(transported.stack, ItemDisplayContext.FIXED, false, ms, buffer, stackLight, overlay, bakedModel); + ms.popPose(); if (!renderUpright) { if (!blockItem) diff --git a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltVisual.java b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltVisual.java index 181618dd96..3546a7cf6b 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltVisual.java @@ -1,21 +1,21 @@ package com.simibubi.create.content.kinetics.belt; -import java.util.ArrayList; import java.util.function.Consumer; +import org.jetbrains.annotations.Nullable; import org.joml.Quaternionf; -import com.simibubi.create.AllBlocks; import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.kinetics.base.KineticBlockEntityVisual; +import com.simibubi.create.content.kinetics.base.KineticInstance; import com.simibubi.create.content.kinetics.base.RotatingInstance; +import com.simibubi.create.content.processing.burner.ScrollInstance; import com.simibubi.create.foundation.render.AllInstanceTypes; import dev.engine_room.flywheel.api.instance.Instance; import dev.engine_room.flywheel.api.instance.Instancer; +import dev.engine_room.flywheel.api.model.Model; import dev.engine_room.flywheel.api.visualization.VisualizationContext; -import dev.engine_room.flywheel.lib.instance.AbstractInstance; -import dev.engine_room.flywheel.lib.instance.FlatLit; import dev.engine_room.flywheel.lib.model.Models; import dev.engine_room.flywheel.lib.model.baked.PartialModel; import dev.engine_room.flywheel.lib.transform.TransformStack; @@ -24,112 +24,90 @@ import net.createmod.catnip.utility.Iterate; import net.minecraft.core.Direction; import net.minecraft.util.Mth; import net.minecraft.world.item.DyeColor; -import net.minecraft.world.level.LightLayer; public class BeltVisual extends KineticBlockEntityVisual { + public static final float MAGIC_SCROLL_MULTIPLIER = 1f / (31.5f * 16f); + public static final float SCROLL_FACTOR_DIAGONAL = 3f / 8f; + public static final float SCROLL_FACTOR_OTHERWISE = 0.5f; + public static final float SCROLL_OFFSET_BOTTOM = 0.5f; + public static final float SCROLL_OFFSET_OTHERWISE = 0f; - boolean upward; - boolean diagonal; - boolean sideways; - boolean vertical; - boolean alongX; - boolean alongZ; - BeltSlope beltSlope; - Direction facing; - protected ArrayList keys; - protected RotatingInstance pulleyKey; + protected final ScrollInstance[] belts; + @Nullable + protected final RotatingInstance pulley; public BeltVisual(VisualizationContext context, BeltBlockEntity blockEntity, float partialTick) { super(context, blockEntity, partialTick); - if (!AllBlocks.BELT.has(blockState)) - return; - keys = new ArrayList<>(2); + BeltPart part = blockState.getValue(BeltBlock.PART); + boolean start = part == BeltPart.START; + boolean end = part == BeltPart.END; + DyeColor color = blockEntity.color.orElse(null); - beltSlope = blockState.getValue(BeltBlock.SLOPE); - facing = blockState.getValue(BeltBlock.HORIZONTAL_FACING); - upward = beltSlope == BeltSlope.UPWARD; - diagonal = beltSlope.isDiagonal(); - sideways = beltSlope == BeltSlope.SIDEWAYS; - vertical = beltSlope == BeltSlope.VERTICAL; - alongX = facing.getAxis() == Direction.Axis.X; - alongZ = facing.getAxis() == Direction.Axis.Z; + boolean diagonal = blockState.getValue(BeltBlock.SLOPE) + .isDiagonal(); + belts = new ScrollInstance[diagonal ? 1 : 2]; - BeltPart part = blockState.getValue(BeltBlock.PART); - boolean start = part == BeltPart.START; - boolean end = part == BeltPart.END; - DyeColor color = blockEntity.color.orElse(null); - - for (boolean bottom : Iterate.trueAndFalse) { + for (boolean bottom : Iterate.trueAndFalse) { PartialModel beltPartial = BeltRenderer.getBeltPartial(diagonal, start, end, bottom); SpriteShiftEntry spriteShift = BeltRenderer.getSpriteShiftEntry(color, diagonal, bottom); - Instancer beltModel = instancerProvider().instancer(AllInstanceTypes.BELT, Models.partial(beltPartial)); + Instancer beltModel = instancerProvider().instancer(AllInstanceTypes.SCROLLING, Models.partial(beltPartial)); - keys.add(setup(beltModel.createInstance(), bottom, spriteShift)); + belts[bottom ? 0 : 1] = setup(beltModel.createInstance(), bottom, spriteShift); if (diagonal) break; } if (blockEntity.hasPulley()) { - Instancer pulleyModel = getPulleyModel(); - - pulleyKey = setup(pulleyModel.createInstance()); - } + pulley = setup(instancerProvider() + .instancer(AllInstanceTypes.ROTATING, getPulleyModel()) + .createInstance()); + } else { + pulley = null; + } } @Override public void update(float pt) { DyeColor color = blockEntity.color.orElse(null); - boolean bottom = true; - for (BeltInstance key : keys) { + boolean diagonal = blockState.getValue(BeltBlock.SLOPE) + .isDiagonal(); - SpriteShiftEntry spriteShiftEntry = BeltRenderer.getSpriteShiftEntry(color, diagonal, bottom); - key.setScrollTexture(spriteShiftEntry) - .setColor(blockEntity) - .setRotationalSpeed(getScrollSpeed()) - .setChanged(); + boolean bottom = true; + for (ScrollInstance key : belts) { + setup(key, bottom, BeltRenderer.getSpriteShiftEntry(color, diagonal, bottom)); bottom = false; } - if (pulleyKey != null) { - updateRotation(pulleyKey); + if (pulley != null) { + updateRotation(pulley); } } @Override public void updateLight(float partialTick) { - relight(keys.toArray(FlatLit[]::new)); + relight(belts); - if (pulleyKey != null) relight(pulleyKey); + if (pulley != null) relight(pulley); } @Override protected void _delete() { - keys.forEach(AbstractInstance::delete); - keys.clear(); - if (pulleyKey != null) pulleyKey.delete(); - pulleyKey = null; + for (var key : belts) { + key.delete(); + } + if (pulley != null) { + pulley.delete(); + } } - private float getScrollSpeed() { - float speed = blockEntity.getSpeed(); - if (((facing.getAxisDirection() == Direction.AxisDirection.NEGATIVE) ^ upward) ^ - ((alongX && !diagonal) || (alongZ && diagonal))) { - speed = -speed; - } - if (sideways && (facing == Direction.SOUTH || facing == Direction.WEST) || (vertical && facing == Direction.EAST)) - speed = -speed; - - return speed; - } - - private Instancer getPulleyModel() { + private Model getPulleyModel() { Direction dir = getOrientation(); - var model = Models.partial(AllPartialModels.BELT_PULLEY, dir.getAxis(), (axis11, modelTransform1) -> { + return Models.partial(AllPartialModels.BELT_PULLEY, dir.getAxis(), (axis11, modelTransform1) -> { var msr = TransformStack.of(modelTransform1); msr.center(); if (axis11 == Direction.Axis.X) msr.rotateYDegrees(90); @@ -137,35 +115,50 @@ public class BeltVisual extends KineticBlockEntityVisual { msr.rotateXDegrees(90); msr.uncenter(); }); - - return instancerProvider().instancer(AllInstanceTypes.ROTATING, model); } private Direction getOrientation() { Direction dir = blockState.getValue(BeltBlock.HORIZONTAL_FACING) .getClockWise(); - if (beltSlope == BeltSlope.SIDEWAYS) + + if (blockState.getValue(BeltBlock.SLOPE) == BeltSlope.SIDEWAYS) dir = Direction.UP; return dir; } - private BeltInstance setup(BeltInstance key, boolean bottom, SpriteShiftEntry spriteShift) { + private ScrollInstance setup(ScrollInstance key, boolean bottom, SpriteShiftEntry spriteShift) { + BeltSlope beltSlope = blockState.getValue(BeltBlock.SLOPE); + Direction facing = blockState.getValue(BeltBlock.HORIZONTAL_FACING); + boolean diagonal = beltSlope.isDiagonal(); + boolean sideways = beltSlope == BeltSlope.SIDEWAYS; + boolean vertical = beltSlope == BeltSlope.VERTICAL; + boolean upward = beltSlope == BeltSlope.UPWARD; + boolean alongX = facing.getAxis() == Direction.Axis.X; + boolean alongZ = facing.getAxis() == Direction.Axis.Z; boolean downward = beltSlope == BeltSlope.DOWNWARD; + + float speed = blockEntity.getSpeed(); + if (((facing.getAxisDirection() == Direction.AxisDirection.NEGATIVE) ^ upward) ^ + ((alongX && !diagonal) || (alongZ && diagonal))) { + speed = -speed; + } + if (sideways && (facing == Direction.SOUTH || facing == Direction.WEST) || (vertical && facing == Direction.EAST)) { + speed = -speed; + } + float rotX = (!diagonal && beltSlope != BeltSlope.HORIZONTAL ? 90 : 0) + (downward ? 180 : 0) + (sideways ? 90 : 0) + (vertical && alongZ ? 180 : 0); float rotY = facing.toYRot() + ((diagonal ^ alongX) && !downward ? 180 : 0) + (sideways && alongZ ? 180 : 0) + (vertical && alongX ? 90 : 0); float rotZ = (sideways ? 90 : 0) + (vertical && alongX ? 90 : 0); Quaternionf q = new Quaternionf().rotationXYZ(rotX * Mth.DEG_TO_RAD, rotY * Mth.DEG_TO_RAD, rotZ * Mth.DEG_TO_RAD); - key.setScrollTexture(spriteShift) - .setScrollMult(diagonal ? 3f / 8f : 0.5f) - .setRotation(q) - .setRotationalSpeed(getScrollSpeed()) - .setRotationOffset(bottom ? 0.5f : 0f) - .setColor(blockEntity) - .setPosition(getVisualPosition()) - .light(level.getBrightness(LightLayer.BLOCK, pos), level.getBrightness(LightLayer.SKY, pos)) + key.setSpriteShift(spriteShift, 1f, (diagonal ? SCROLL_FACTOR_DIAGONAL : SCROLL_FACTOR_OTHERWISE)) + .position(getVisualPosition()) + .rotation(q) + .speed(0, speed * MAGIC_SCROLL_MULTIPLIER) + .offset(0, bottom ? SCROLL_OFFSET_BOTTOM : SCROLL_OFFSET_OTHERWISE) + .colorRgb(KineticInstance.colorFromBE(blockEntity)) .setChanged(); return key; @@ -173,9 +166,11 @@ public class BeltVisual extends KineticBlockEntityVisual { @Override public void collectCrumblingInstances(Consumer consumer) { - if (pulleyKey != null) { - consumer.accept(pulleyKey); + if (pulley != null) { + consumer.accept(pulley); + } + for (var key : belts) { + consumer.accept(key); } - keys.forEach(consumer); } } diff --git a/src/main/java/com/simibubi/create/content/processing/burner/ScrollInstance.java b/src/main/java/com/simibubi/create/content/processing/burner/ScrollInstance.java index ad2e8af545..0861e31679 100644 --- a/src/main/java/com/simibubi/create/content/processing/burner/ScrollInstance.java +++ b/src/main/java/com/simibubi/create/content/processing/burner/ScrollInstance.java @@ -58,6 +58,9 @@ public class ScrollInstance extends ColoredLitInstance { } public ScrollInstance setSpriteShift(SpriteShiftEntry spriteShift) { + return setSpriteShift(spriteShift, 0.5f, 0.5f); + } + public ScrollInstance setSpriteShift(SpriteShiftEntry spriteShift, float factorU, float factorV) { float spriteWidth = spriteShift.getTarget() .getU1() - spriteShift.getTarget() @@ -68,12 +71,24 @@ public class ScrollInstance extends ColoredLitInstance { - spriteShift.getTarget() .getV0(); - scaleU = spriteWidth / 2; - scaleV = spriteHeight / 2; + scaleU = spriteWidth * factorU; + scaleV = spriteHeight * factorV; diffU = spriteShift.getTarget().getU0() - spriteShift.getOriginal().getU0(); diffV = spriteShift.getTarget().getV0() - spriteShift.getOriginal().getV0(); return this; } + + public ScrollInstance speed(float speedU, float speedV) { + this.speedU = speedU; + this.speedV = speedV; + return this; + } + + public ScrollInstance offset(float offsetU, float offsetV) { + this.offsetU = offsetU; + this.offsetV = offsetV; + return this; + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/AllInstanceTypes.java b/src/main/java/com/simibubi/create/foundation/render/AllInstanceTypes.java index e9144162a1..36b83b0fdf 100644 --- a/src/main/java/com/simibubi/create/foundation/render/AllInstanceTypes.java +++ b/src/main/java/com/simibubi/create/foundation/render/AllInstanceTypes.java @@ -6,7 +6,6 @@ import org.lwjgl.system.MemoryUtil; import com.simibubi.create.content.contraptions.actors.ActorInstance; import com.simibubi.create.content.kinetics.base.RotatingInstance; -import com.simibubi.create.content.kinetics.belt.BeltInstance; import com.simibubi.create.content.processing.burner.ScrollInstance; import dev.engine_room.flywheel.api.instance.InstanceType; @@ -50,45 +49,6 @@ public class AllInstanceTypes { }) .build(); - public static final InstanceType BELT = SimpleInstanceType.builder(BeltInstance::new) - .cullShader(asResource("instance/cull/belt.glsl")) - .vertexShader(asResource("instance/belt.vert")) - .layout(LayoutBuilder.create() - .vector("color", FloatRepr.NORMALIZED_UNSIGNED_BYTE, 4) - .vector("light", IntegerRepr.SHORT, 2) - .vector("overlay", IntegerRepr.SHORT, 2) - .vector("pos", FloatRepr.FLOAT, 3) - .scalar("speed", FloatRepr.FLOAT) - .scalar("offset", FloatRepr.FLOAT) - .vector("rotation", FloatRepr.FLOAT, 4) - .vector("sourceTexture", FloatRepr.FLOAT, 2) - .vector("scrollTexture", FloatRepr.FLOAT, 4) - .scalar("scrollMult", FloatRepr.FLOAT) - .build()) - .writer((ptr, instance) -> { - MemoryUtil.memPutByte(ptr, instance.red); - MemoryUtil.memPutByte(ptr + 1, instance.green); - MemoryUtil.memPutByte(ptr + 2, instance.blue); - MemoryUtil.memPutByte(ptr + 3, instance.alpha); - ExtraMemoryOps.put2x16(ptr + 4, instance.light); - ExtraMemoryOps.put2x16(ptr + 8, instance.overlay); - MemoryUtil.memPutFloat(ptr + 12, instance.x); - MemoryUtil.memPutFloat(ptr + 16, instance.y); - MemoryUtil.memPutFloat(ptr + 20, instance.z); - MemoryUtil.memPutFloat(ptr + 24, instance.rotationalSpeed); - MemoryUtil.memPutFloat(ptr + 28, instance.rotationOffset); - ExtraMemoryOps.putQuaternionf(ptr + 32, instance.rotation); - MemoryUtil.memPutFloat(ptr + 48, instance.sourceU); - MemoryUtil.memPutFloat(ptr + 52, instance.sourceV); - MemoryUtil.memPutFloat(ptr + 56, instance.minU); - MemoryUtil.memPutFloat(ptr + 60, instance.minV); - MemoryUtil.memPutFloat(ptr + 64, instance.maxU); - MemoryUtil.memPutFloat(ptr + 68, instance.maxV); - MemoryUtil.memPutFloat(ptr + 72, instance.scrollMult); - }) - .build(); - - // TODO: use this for belts too public static final InstanceType SCROLLING = SimpleInstanceType.builder(ScrollInstance::new) .cullShader(asResource("instance/cull/scrolling.glsl")) .vertexShader(asResource("instance/scrolling.vert")) diff --git a/src/main/resources/assets/create/flywheel/instance/belt.vert b/src/main/resources/assets/create/flywheel/instance/belt.vert deleted file mode 100644 index 91180c79d5..0000000000 --- a/src/main/resources/assets/create/flywheel/instance/belt.vert +++ /dev/null @@ -1,19 +0,0 @@ -#include "flywheel:util/quaternion.glsl" -#include "flywheel:util/matrix.glsl" - -void flw_instanceVertex(in FlwInstance instance) { - flw_vertexPos = vec4(rotateByQuaternion(flw_vertexPos.xyz - .5, instance.rotation) + instance.pos + .5, 1.); - - flw_vertexNormal = rotateByQuaternion(flw_vertexNormal, instance.rotation); - - float scrollSize = instance.scrollTexture.w - instance.scrollTexture.y; - float scroll = fract(instance.speed * flw_renderTicks / (31.5 * 16.) + instance.offset) * scrollSize * instance.scrollMult; - - flw_vertexTexCoord = flw_vertexTexCoord - instance.sourceTexture + instance.scrollTexture.xy + vec2(0, scroll); - flw_vertexLight = vec2(instance.light) / 256.; - flw_vertexOverlay = instance.overlay; - - #if defined(DEBUG_RAINBOW) - flw_vertexColor = instance.color; - #endif -} diff --git a/src/main/resources/assets/create/flywheel/instance/cull/belt.glsl b/src/main/resources/assets/create/flywheel/instance/cull/belt.glsl deleted file mode 100644 index f16aeef0f9..0000000000 --- a/src/main/resources/assets/create/flywheel/instance/cull/belt.glsl +++ /dev/null @@ -1,4 +0,0 @@ -void flw_transformBoundingSphere(in FlwInstance instance, inout vec3 center, inout float radius) { - radius += length(center - 0.5); - center += instance.pos; -} From 1ba938d8d46fcc46c4447ecfffd54795041a3b29 Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Sun, 17 Nov 2024 14:24:55 -0800 Subject: [PATCH 129/515] Just wear them for the frames - Mark goggles models as cutout --- .../assets/create/models/block/blaze_burner/goggles.json | 3 ++- .../assets/create/models/block/blaze_burner/goggles_small.json | 3 ++- .../create/models/block/mechanical_arm/claw_base_goggles.json | 1 + 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/create/models/block/blaze_burner/goggles.json b/src/main/resources/assets/create/models/block/blaze_burner/goggles.json index dc212e3c6a..eb8a6ad4b2 100644 --- a/src/main/resources/assets/create/models/block/blaze_burner/goggles.json +++ b/src/main/resources/assets/create/models/block/blaze_burner/goggles.json @@ -4,6 +4,7 @@ "0": "create:block/hat_test", "particle": "create:block/hat_test" }, + "render_type": "minecraft:cutout", "elements": [ { "from": [3.95, 0, 3.95], @@ -16,4 +17,4 @@ } } ] -} \ No newline at end of file +} diff --git a/src/main/resources/assets/create/models/block/blaze_burner/goggles_small.json b/src/main/resources/assets/create/models/block/blaze_burner/goggles_small.json index 4c0adfb1cd..019ec31f9c 100644 --- a/src/main/resources/assets/create/models/block/blaze_burner/goggles_small.json +++ b/src/main/resources/assets/create/models/block/blaze_burner/goggles_small.json @@ -4,6 +4,7 @@ "0": "create:block/hat_test", "particle": "create:block/hat_test" }, + "render_type": "minecraft:cutout", "elements": [ { "from": [4.95, 0, 4.95], @@ -16,4 +17,4 @@ } } ] -} \ No newline at end of file +} diff --git a/src/main/resources/assets/create/models/block/mechanical_arm/claw_base_goggles.json b/src/main/resources/assets/create/models/block/mechanical_arm/claw_base_goggles.json index e610d582ee..7b64f9f253 100644 --- a/src/main/resources/assets/create/models/block/mechanical_arm/claw_base_goggles.json +++ b/src/main/resources/assets/create/models/block/mechanical_arm/claw_base_goggles.json @@ -6,6 +6,7 @@ "5": "create:block/mechanical_arm", "particle": "create:block/hat_test" }, + "render_type": "minecraft:cutout", "elements": [ { "name": "Joint 4", From 8da3ab3262b80174440307de30a1a42baf629453 Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Mon, 18 Nov 2024 12:43:39 -0800 Subject: [PATCH 130/515] Quite offsetting - Add missing shaft to saw actors - Fix stabilized bearings rendering 2 sticky faces - Remove axis field from KBEV - Make most helper methods from KBEV available as public static - Rewrite offset control logic to be easier to read and consolidate the duplications I found - Simplify per-frame logic in DeployerActorVisual by saving the base transforms as fields - Fix deployers and stabilized bearings not animating on contraptions - Fix bogey block entities not initializing their animations in the ctor - Fix shafts on actors not being aligned with other kinetic components - Fix Visuals not respecting KBE#getRotationAngleOffset --- .../contraptions/bearing/BearingVisual.java | 2 +- .../StabilizedBearingMovementBehaviour.java | 2 +- .../bearing/StabilizedBearingVisual.java | 17 ++- .../pulley/AbstractPulleyVisual.java | 2 +- .../base/KineticBlockEntityRenderer.java | 8 +- .../base/KineticBlockEntityVisual.java | 50 +++++--- .../deployer/DeployerActorVisual.java | 112 +++++++++--------- .../kinetics/flywheel/FlywheelVisual.java | 2 +- .../content/kinetics/saw/SawActorVisual.java | 35 ++++++ .../kinetics/saw/SawMovementBehaviour.java | 9 ++ .../content/kinetics/saw/SawVisual.java | 17 ++- .../BracketedKineticBlockEntityRenderer.java | 12 +- .../BracketedKineticBlockEntityVisual.java | 2 +- .../encased/EncasedCogVisual.java | 4 +- .../transmission/SplitShaftVisual.java | 2 +- .../trains/bogey/BogeyBlockEntityVisual.java | 8 +- 16 files changed, 181 insertions(+), 103 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/kinetics/saw/SawActorVisual.java diff --git a/src/main/java/com/simibubi/create/content/contraptions/bearing/BearingVisual.java b/src/main/java/com/simibubi/create/content/contraptions/bearing/BearingVisual.java index 065b1a0aa4..3678eb8998 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/bearing/BearingVisual.java +++ b/src/main/java/com/simibubi/create/content/contraptions/bearing/BearingVisual.java @@ -31,7 +31,7 @@ public class BearingVisual e super(context, blockEntity, partialTick); Direction facing = blockState.getValue(BlockStateProperties.FACING); - rotationAxis = Axis.of(Direction.get(Direction.AxisDirection.POSITIVE, axis).step()); + rotationAxis = Axis.of(Direction.get(Direction.AxisDirection.POSITIVE, rotationAxis()).step()); blockOrientation = getBlockStateOrientation(facing); diff --git a/src/main/java/com/simibubi/create/content/contraptions/bearing/StabilizedBearingMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/bearing/StabilizedBearingMovementBehaviour.java index b16da0f309..93befc6caf 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/bearing/StabilizedBearingMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/bearing/StabilizedBearingMovementBehaviour.java @@ -44,7 +44,7 @@ public class StabilizedBearingMovementBehaviour implements MovementBehaviour { @OnlyIn(Dist.CLIENT) public void renderInContraption(MovementContext context, VirtualRenderWorld renderWorld, ContraptionMatrices matrices, MultiBufferSource buffer) { - if (!VisualizationManager.supportsVisualization(context.world)) + if (VisualizationManager.supportsVisualization(context.world)) return; Direction facing = context.state.getValue(BlockStateProperties.FACING); diff --git a/src/main/java/com/simibubi/create/content/contraptions/bearing/StabilizedBearingVisual.java b/src/main/java/com/simibubi/create/content/contraptions/bearing/StabilizedBearingVisual.java index 7b72db056b..431aa38023 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/bearing/StabilizedBearingVisual.java +++ b/src/main/java/com/simibubi/create/content/contraptions/bearing/StabilizedBearingVisual.java @@ -6,6 +6,7 @@ import com.mojang.math.Axis; import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.contraptions.behaviour.MovementContext; import com.simibubi.create.content.contraptions.render.ActorVisual; +import com.simibubi.create.content.kinetics.base.KineticBlockEntityVisual; import com.simibubi.create.content.kinetics.base.RotatingInstance; import com.simibubi.create.foundation.render.AllInstanceTypes; import com.simibubi.create.foundation.virtualWorld.VirtualRenderWorld; @@ -44,14 +45,19 @@ public class StabilizedBearingVisual extends ActorVisual { int blockLight = localBlockLight(); topInstance.position(movementContext.localPos) .rotation(blockOrientation) - .light(blockLight, 0); + .light(blockLight, 0) + .setChanged(); shaft = instancerProvider.instancer(AllInstanceTypes.ROTATING, Models.partial(AllPartialModels.SHAFT_HALF, blockState.getValue(BlockStateProperties.FACING).getOpposite())) .createInstance(); - // not rotating so no need to set speed, axis, etc. - shaft.setPosition(movementContext.localPos) - .light(blockLight, 0); + // not rotating so no need to set speed. + var axis = KineticBlockEntityVisual.rotationAxis(blockState); + shaft.setRotationAxis(axis) + .setRotationOffset(KineticBlockEntityVisual.rotationOffset(blockState, axis, movementContext.localPos)) + .setPosition(movementContext.localPos) + .light(blockLight, 0) + .setChanged(); } @Override @@ -62,7 +68,8 @@ public class StabilizedBearingVisual extends ActorVisual { rotation.mul(blockOrientation); - topInstance.rotation(rotation); + topInstance.rotation(rotation) + .setChanged(); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/pulley/AbstractPulleyVisual.java b/src/main/java/com/simibubi/create/content/contraptions/pulley/AbstractPulleyVisual.java index 808f75d829..766273a74e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/pulley/AbstractPulleyVisual.java +++ b/src/main/java/com/simibubi/create/content/contraptions/pulley/AbstractPulleyVisual.java @@ -41,7 +41,7 @@ public abstract class AbstractPulleyVisual extends public AbstractPulleyVisual(VisualizationContext dispatcher, T blockEntity, float partialTick) { super(dispatcher, blockEntity, partialTick); - rotatingAbout = Direction.get(Direction.AxisDirection.POSITIVE, axis); + rotatingAbout = Direction.get(Direction.AxisDirection.POSITIVE, rotationAxis()); rotationAxis = Axis.of(rotatingAbout.step()); coil = getCoilModel().createInstance() diff --git a/src/main/java/com/simibubi/create/content/kinetics/base/KineticBlockEntityRenderer.java b/src/main/java/com/simibubi/create/content/kinetics/base/KineticBlockEntityRenderer.java index 30817f282e..a6eb85f684 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/base/KineticBlockEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/kinetics/base/KineticBlockEntityRenderer.java @@ -6,7 +6,6 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.kinetics.KineticDebugger; -import com.simibubi.create.content.kinetics.simpleRelays.ICogWheel; import com.simibubi.create.foundation.blockEntity.renderer.SafeBlockEntityRenderer; import dev.engine_room.flywheel.api.visualization.VisualizationManager; @@ -121,12 +120,7 @@ public class KineticBlockEntityRenderer extends Sa } public static float getRotationOffsetForPosition(KineticBlockEntity be, final BlockPos pos, final Axis axis) { - float offset = ICogWheel.isLargeCog(be.getBlockState()) ? 11.25f : 0; - double d = (((axis == Axis.X) ? 0 : pos.getX()) + ((axis == Axis.Y) ? 0 : pos.getY()) - + ((axis == Axis.Z) ? 0 : pos.getZ())) % 2; - if (d == 0) - offset = 22.5f; - return offset + be.getRotationAngleOffset(axis); + return KineticBlockEntityVisual.rotationOffset(be.getBlockState(), axis, pos) + be.getRotationAngleOffset(axis); } public static BlockState shaft(Axis axis) { diff --git a/src/main/java/com/simibubi/create/content/kinetics/base/KineticBlockEntityVisual.java b/src/main/java/com/simibubi/create/content/kinetics/base/KineticBlockEntityVisual.java index da80dd7943..bbd66e8faf 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/base/KineticBlockEntityVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/base/KineticBlockEntityVisual.java @@ -6,21 +6,19 @@ import com.simibubi.create.content.kinetics.simpleRelays.ShaftBlock; import dev.engine_room.flywheel.api.visualization.VisualizationContext; import dev.engine_room.flywheel.lib.visual.AbstractBlockEntityVisual; +import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; import net.minecraft.world.level.block.state.BlockState; public abstract class KineticBlockEntityVisual extends AbstractBlockEntityVisual { - protected final Direction.Axis axis; - public KineticBlockEntityVisual(VisualizationContext context, T blockEntity, float partialTick) { super(context, blockEntity, partialTick); - axis = (blockState.getBlock() instanceof IRotate irotate) ? irotate.getRotationAxis(blockState) : Axis.Y; } protected final void updateRotation(RotatingInstance instance) { - updateRotation(instance, getRotationAxis(), getBlockEntitySpeed()); + updateRotation(instance, rotationAxis(), getBlockEntitySpeed()); } protected final void updateRotation(RotatingInstance instance, Direction.Axis axis) { @@ -28,7 +26,7 @@ public abstract class KineticBlockEntityVisual ext } protected final void updateRotation(RotatingInstance instance, float speed) { - updateRotation(instance, getRotationAxis(), speed); + updateRotation(instance, rotationAxis(), speed); } protected final void updateRotation(RotatingInstance instance, Direction.Axis axis, float speed) { @@ -40,7 +38,7 @@ public abstract class KineticBlockEntityVisual ext } protected final RotatingInstance setup(RotatingInstance key) { - return setup(key, getRotationAxis(), getBlockEntitySpeed()); + return setup(key, rotationAxis(), getBlockEntitySpeed()); } protected final RotatingInstance setup(RotatingInstance key, Direction.Axis axis) { @@ -48,7 +46,7 @@ public abstract class KineticBlockEntityVisual ext } protected final RotatingInstance setup(RotatingInstance key, float speed) { - return setup(key, getRotationAxis(), speed); + return setup(key, rotationAxis(), speed); } protected final RotatingInstance setup(RotatingInstance key, Direction.Axis axis, float speed) { @@ -63,17 +61,11 @@ public abstract class KineticBlockEntityVisual ext } protected float getRotationOffset(final Direction.Axis axis) { - float offset = ICogWheel.isLargeCog(blockState) ? 11.25f : 0; - double d = (((axis == Direction.Axis.X) ? 0 : pos.getX()) + ((axis == Direction.Axis.Y) ? 0 : pos.getY()) - + ((axis == Direction.Axis.Z) ? 0 : pos.getZ())) % 2; - if (d == 0) { - offset = 22.5f; - } - return offset; + return rotationOffset(blockState, axis, pos) + blockEntity.getRotationAngleOffset(axis); } - protected Direction.Axis getRotationAxis() { - return axis; + protected Direction.Axis rotationAxis() { + return rotationAxis(blockState); } protected float getBlockEntitySpeed() { @@ -81,11 +73,35 @@ public abstract class KineticBlockEntityVisual ext } protected BlockState shaft() { - return shaft(getRotationAxis()); + return shaft(rotationAxis()); + } + + public static float rotationOffset(BlockState state, Axis axis, BlockPos pos) { + if (shouldOffset(axis, pos)) { + return 22.5f; + } else { + return ICogWheel.isLargeCog(state) ? 11.25f : 0; + } + } + + public static boolean shouldOffset(Axis axis, BlockPos pos) { + // Sum the components of the other 2 axes. + int x = (axis == Axis.X) ? 0 : pos.getX(); + int y = (axis == Axis.Y) ? 0 : pos.getY(); + int z = (axis == Axis.Z) ? 0 : pos.getZ(); + return ((x + y + z) % 2) == 0; + } + + public static Axis rotationAxis(BlockState blockState) { + return (blockState.getBlock() instanceof IRotate irotate) ? irotate.getRotationAxis(blockState) : Axis.Y; } public static BlockState shaft(Direction.Axis axis) { return AllBlocks.SHAFT.getDefaultState() .setValue(ShaftBlock.AXIS, axis); } + + public static BlockState shaft(BlockState blockState) { + return shaft(rotationAxis(blockState)); + } } diff --git a/src/main/java/com/simibubi/create/content/kinetics/deployer/DeployerActorVisual.java b/src/main/java/com/simibubi/create/content/kinetics/deployer/DeployerActorVisual.java index 39532f1bdf..b8e01e8ac2 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/deployer/DeployerActorVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/deployer/DeployerActorVisual.java @@ -3,11 +3,12 @@ package com.simibubi.create.content.kinetics.deployer; import static com.simibubi.create.content.kinetics.base.DirectionalAxisKineticBlock.AXIS_ALONG_FIRST_COORDINATE; import static com.simibubi.create.content.kinetics.base.DirectionalKineticBlock.FACING; -import com.mojang.blaze3d.vertex.PoseStack; +import org.joml.Matrix4f; +import org.joml.Matrix4fc; + import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.contraptions.behaviour.MovementContext; import com.simibubi.create.content.contraptions.render.ActorVisual; -import com.simibubi.create.content.kinetics.base.IRotate; import com.simibubi.create.content.kinetics.base.KineticBlockEntityVisual; import com.simibubi.create.content.kinetics.base.RotatingInstance; import com.simibubi.create.foundation.render.AllInstanceTypes; @@ -18,7 +19,6 @@ import dev.engine_room.flywheel.lib.instance.InstanceTypes; import dev.engine_room.flywheel.lib.instance.TransformedInstance; import dev.engine_room.flywheel.lib.model.Models; import dev.engine_room.flywheel.lib.model.baked.PartialModel; -import dev.engine_room.flywheel.lib.transform.TransformStack; import net.createmod.catnip.render.VirtualRenderHelper; import net.createmod.catnip.utility.AnimationTickHolder; import net.createmod.catnip.utility.NBTHelper; @@ -32,18 +32,16 @@ import net.minecraft.world.phys.Vec3; public class DeployerActorVisual extends ActorVisual { - private final PoseStack stack = new PoseStack(); Direction facing; boolean stationaryTimer; - float yRot; - float xRot; - float zRot; - TransformedInstance pole; TransformedInstance hand; RotatingInstance shaft; + Matrix4fc baseHandTransform; + Matrix4fc basePoleTransform; + public DeployerActorVisual(VisualizationContext visualizationContext, VirtualRenderWorld simulationWorld, MovementContext context) { super(visualizationContext, simulationWorld, context); BlockState state = context.state; @@ -54,69 +52,75 @@ public class DeployerActorVisual extends ActorVisual { facing = state.getValue(FACING); boolean rotatePole = state.getValue(AXIS_ALONG_FIRST_COORDINATE) ^ facing.getAxis() == Direction.Axis.Z; - yRot = AngleHelper.horizontalAngle(facing); - xRot = facing == Direction.UP ? 270 : facing == Direction.DOWN ? 90 : 0; - zRot = rotatePole ? 90 : 0; + float yRot = AngleHelper.horizontalAngle(facing); + float xRot = facing == Direction.UP ? 270 : facing == Direction.DOWN ? 90 : 0; + float zRot = rotatePole ? 90 : 0; pole = instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.DEPLOYER_POLE)).createInstance(); hand = instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(handPose)).createInstance(); - Direction.Axis axis = ((IRotate) state.getBlock()).getRotationAxis(state); + Direction.Axis axis = KineticBlockEntityVisual.rotationAxis(state); shaft = instancerProvider.instancer(AllInstanceTypes.ROTATING, VirtualRenderHelper.blockModel(KineticBlockEntityVisual.shaft(axis))) .createInstance(); int blockLight = localBlockLight(); shaft.setRotationAxis(axis) - .setPosition(context.localPos) - .light(blockLight, 0); + .setRotationOffset(KineticBlockEntityVisual.rotationOffset(state, axis, context.localPos)) + .setPosition(context.localPos) + .light(blockLight, 0) + .setChanged(); - pole.light(blockLight, 0); - hand.light(blockLight, 0); - } + pole.translate(context.localPos) + .center() + .rotate(yRot * Mth.DEG_TO_RAD, Direction.UP) + .rotate(xRot * Mth.DEG_TO_RAD, Direction.EAST) + .rotate(zRot * Mth.DEG_TO_RAD, Direction.SOUTH) + .uncenter() + .light(blockLight, 0) + .setChanged(); + + basePoleTransform = new Matrix4f(pole.pose); + + hand.translate(context.localPos) + .center() + .rotate(yRot * Mth.DEG_TO_RAD, Direction.UP) + .rotate(xRot * Mth.DEG_TO_RAD, Direction.EAST) + .uncenter() + .light(blockLight, 0) + .setChanged(); + + baseHandTransform = new Matrix4f(hand.pose); + } @Override public void beginFrame() { - double factor; - if (context.disabled) { - factor = 0; - } else if (context.contraption.stalled || context.position == null || context.data.contains("StationaryTimer")) { - factor = Mth.sin(AnimationTickHolder.getRenderTime() * .5f) * .25f + .25f; - } else { - Vec3 center = VecHelper.getCenterOf(BlockPos.containing(context.position)); - double distance = context.position.distanceTo(center); - double nextDistance = context.position.add(context.motion) - .distanceTo(center); - factor = .5f - Mth.clamp(Mth.lerp(AnimationTickHolder.getPartialTicks(), distance, nextDistance), 0, 1); - } + float distance = deploymentDistance(); - Vec3 offset = Vec3.atLowerCornerOf(facing.getNormal()).scale(factor); + pole.setTransform(basePoleTransform) + .translateZ(distance) + .setChanged(); - var tstack = TransformStack.of(stack); - stack.setIdentity(); - tstack.translate(context.localPos) - .translate(offset); + hand.setTransform(baseHandTransform) + .translateZ(distance) + .setChanged(); + } - transformModel(stack, pole, hand, yRot, xRot, zRot); - } - - static void transformModel(PoseStack stack, TransformedInstance pole, TransformedInstance hand, float yRot, float xRot, float zRot) { - var tstack = TransformStack.of(stack); - - tstack.center(); - tstack.rotate((float) ((yRot) / 180 * Math.PI), Direction.UP); - tstack.rotate((float) ((xRot) / 180 * Math.PI), Direction.EAST); - - stack.pushPose(); - tstack.rotate((float) ((zRot) / 180 * Math.PI), Direction.SOUTH); - tstack.uncenter(); - pole.setTransform(stack); - stack.popPose(); - - tstack.uncenter(); - - hand.setTransform(stack); - } + private float deploymentDistance() { + double factor; + if (context.disabled) { + factor = 0; + } else if (context.contraption.stalled || context.position == null || context.data.contains("StationaryTimer")) { + factor = Mth.sin(AnimationTickHolder.getRenderTime() * .5f) * .25f + .25f; + } else { + Vec3 center = VecHelper.getCenterOf(BlockPos.containing(context.position)); + double distance = context.position.distanceTo(center); + double nextDistance = context.position.add(context.motion) + .distanceTo(center); + factor = .5f - Mth.clamp(Mth.lerp(AnimationTickHolder.getPartialTicks(), distance, nextDistance), 0, 1); + } + return (float) factor; + } @Override protected void _delete() { diff --git a/src/main/java/com/simibubi/create/content/kinetics/flywheel/FlywheelVisual.java b/src/main/java/com/simibubi/create/content/kinetics/flywheel/FlywheelVisual.java index 16829f24f8..81274b8d15 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/flywheel/FlywheelVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/flywheel/FlywheelVisual.java @@ -57,7 +57,7 @@ public class FlywheelVisual extends KineticBlockEntityVisual { @Override protected Model model() { - if (blockState.getValue(BlockStateProperties.FACING) - .getAxis() - .isHorizontal()) { - BlockState referenceState = blockState.rotate(blockEntity.getLevel(), blockEntity.getBlockPos(), Rotation.CLOCKWISE_180); + return shaftModel(level, pos, blockState); + } + + public static Model shaftModel(LevelAccessor level, BlockPos pos, BlockState state) { + if (state.getValue(BlockStateProperties.FACING) + .getAxis() + .isHorizontal()) { + BlockState referenceState = state.rotate(level, pos, Rotation.CLOCKWISE_180); Direction facing = referenceState.getValue(BlockStateProperties.FACING); return Models.partial(AllPartialModels.SHAFT_HALF, facing); } else { - return VirtualRenderHelper.blockModel(shaft()); + return VirtualRenderHelper.blockModel(KineticBlockEntityVisual.shaft(state)); } } } diff --git a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/BracketedKineticBlockEntityRenderer.java b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/BracketedKineticBlockEntityRenderer.java index d28c45f82d..2f035ded91 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/BracketedKineticBlockEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/BracketedKineticBlockEntityRenderer.java @@ -5,6 +5,7 @@ import com.mojang.blaze3d.vertex.VertexConsumer; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.kinetics.base.KineticBlockEntityRenderer; +import com.simibubi.create.content.kinetics.base.KineticBlockEntityVisual; import dev.engine_room.flywheel.api.visualization.VisualizationManager; import net.createmod.catnip.render.CachedBuffers; @@ -63,12 +64,11 @@ public class BracketedKineticBlockEntityRenderer extends KineticBlockEntityRende } public static float getShaftAngleOffset(Axis axis, BlockPos pos) { - float offset = 0; - double d = (((axis == Axis.X) ? 0 : pos.getX()) + ((axis == Axis.Y) ? 0 : pos.getY()) - + ((axis == Axis.Z) ? 0 : pos.getZ())) % 2; - if (d == 0) - offset = 22.5f; - return offset; + if (KineticBlockEntityVisual.shouldOffset(axis, pos)) { + return 22.5f; + } else { + return 0; + } } } diff --git a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/BracketedKineticBlockEntityVisual.java b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/BracketedKineticBlockEntityVisual.java index 0b6b5b7fa0..ceb9513cb1 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/BracketedKineticBlockEntityVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/BracketedKineticBlockEntityVisual.java @@ -70,7 +70,7 @@ public class BracketedKineticBlockEntityVisual extends SingleRotatingVisual Date: Thu, 21 Nov 2024 20:52:40 -0500 Subject: [PATCH 131/515] Holes in the schedule - Scheduling ticks with a delay of 0 messes up the order of existing block ticks causing bugs (Create#7141) --- .../contraptions/piston/MechanicalPistonBlock.java | 8 ++++---- .../sequencer/SequencedGearshiftBlock.java | 8 ++++---- .../content/logistics/chute/SmartChuteBlock.java | 10 +++++----- .../logistics/funnel/AbstractFunnelBlock.java | 14 +++++++------- .../content/redstone/link/RedstoneLinkBlock.java | 12 ++++++------ .../content/redstone/nixieTube/NixieTubeBlock.java | 10 +++++----- 6 files changed, 31 insertions(+), 31 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/piston/MechanicalPistonBlock.java b/src/main/java/com/simibubi/create/content/contraptions/piston/MechanicalPistonBlock.java index 8f04766561..5c56a87360 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/piston/MechanicalPistonBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/piston/MechanicalPistonBlock.java @@ -99,14 +99,14 @@ public class MechanicalPistonBlock extends DirectionalAxisKineticBlock implement } @Override - public void neighborChanged(BlockState state, Level world, BlockPos pos, Block p_220069_4_, BlockPos fromPos, - boolean p_220069_6_) { + public void neighborChanged(BlockState state, Level level, BlockPos pos, Block block, BlockPos fromPos, + boolean isMoving) { Direction direction = state.getValue(FACING); if (!fromPos.equals(pos.relative(direction.getOpposite()))) return; - if (!world.isClientSide && !world.getBlockTicks() + if (!level.isClientSide && !level.getBlockTicks() .willTickThisTick(pos, this)) - world.scheduleTick(pos, this, 0); + level.scheduleTick(pos, this, 1); } @Override diff --git a/src/main/java/com/simibubi/create/content/kinetics/transmission/sequencer/SequencedGearshiftBlock.java b/src/main/java/com/simibubi/create/content/kinetics/transmission/sequencer/SequencedGearshiftBlock.java index 44a31225e9..753b6aa1d8 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/transmission/sequencer/SequencedGearshiftBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/transmission/sequencer/SequencedGearshiftBlock.java @@ -57,13 +57,13 @@ public class SequencedGearshiftBlock extends HorizontalAxisKineticBlock implemen } @Override - public void neighborChanged(BlockState state, Level worldIn, BlockPos pos, Block blockIn, BlockPos fromPos, + public void neighborChanged(BlockState state, Level level, BlockPos pos, Block block, BlockPos fromPos, boolean isMoving) { - if (worldIn.isClientSide) + if (level.isClientSide) return; - if (!worldIn.getBlockTicks() + if (!level.getBlockTicks() .willTickThisTick(pos, this)) - worldIn.scheduleTick(pos, this, 0); + level.scheduleTick(pos, this, 1); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/chute/SmartChuteBlock.java b/src/main/java/com/simibubi/create/content/logistics/chute/SmartChuteBlock.java index fd0efdcb51..8b64939394 100644 --- a/src/main/java/com/simibubi/create/content/logistics/chute/SmartChuteBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/chute/SmartChuteBlock.java @@ -26,14 +26,14 @@ public class SmartChuteBlock extends AbstractChuteBlock { public static final BooleanProperty POWERED = BlockStateProperties.POWERED; @Override - public void neighborChanged(BlockState state, Level worldIn, BlockPos pos, Block blockIn, BlockPos fromPos, + public void neighborChanged(BlockState state, Level level, BlockPos pos, Block block, BlockPos fromPos, boolean isMoving) { - super.neighborChanged(state, worldIn, pos, blockIn, fromPos, isMoving); - if (worldIn.isClientSide) + super.neighborChanged(state, level, pos, block, fromPos, isMoving); + if (level.isClientSide) return; - if (!worldIn.getBlockTicks() + if (!level.getBlockTicks() .willTickThisTick(pos, this)) - worldIn.scheduleTick(pos, this, 0); + level.scheduleTick(pos, this, 1); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/funnel/AbstractFunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/funnel/AbstractFunnelBlock.java index f24c093700..2fe7a5ce46 100644 --- a/src/main/java/com/simibubi/create/content/logistics/funnel/AbstractFunnelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/funnel/AbstractFunnelBlock.java @@ -57,7 +57,7 @@ public abstract class AbstractFunnelBlock extends Block return withWater(defaultBlockState().setValue(POWERED, context.getLevel() .hasNeighborSignal(context.getClickedPos())), context); } - + @Override public FluidState getFluidState(BlockState pState) { return fluidState(pState); @@ -69,7 +69,7 @@ public abstract class AbstractFunnelBlock extends Block updateWater(pLevel, pState, pCurrentPos); return pState; } - + @Override public boolean isPathfindable(BlockState state, BlockGetter reader, BlockPos pos, PathComputationType type) { return false; @@ -81,16 +81,16 @@ public abstract class AbstractFunnelBlock extends Block } @Override - public void neighborChanged(BlockState state, Level worldIn, BlockPos pos, Block blockIn, BlockPos fromPos, + public void neighborChanged(BlockState state, Level level, BlockPos pos, Block block, BlockPos fromPos, boolean isMoving) { - if (worldIn.isClientSide) + if (level.isClientSide) return; - InvManipulationBehaviour behaviour = BlockEntityBehaviour.get(worldIn, pos, InvManipulationBehaviour.TYPE); + InvManipulationBehaviour behaviour = BlockEntityBehaviour.get(level, pos, InvManipulationBehaviour.TYPE); if (behaviour != null) behaviour.onNeighborChanged(fromPos); - if (!worldIn.getBlockTicks() + if (!level.getBlockTicks() .willTickThisTick(pos, this)) - worldIn.scheduleTick(pos, this, 0); + level.scheduleTick(pos, this, 1); } @Override diff --git a/src/main/java/com/simibubi/create/content/redstone/link/RedstoneLinkBlock.java b/src/main/java/com/simibubi/create/content/redstone/link/RedstoneLinkBlock.java index e134700ce2..ec54756062 100644 --- a/src/main/java/com/simibubi/create/content/redstone/link/RedstoneLinkBlock.java +++ b/src/main/java/com/simibubi/create/content/redstone/link/RedstoneLinkBlock.java @@ -41,22 +41,22 @@ public class RedstoneLinkBlock extends WrenchableDirectionalBlock implements IBE } @Override - public void neighborChanged(BlockState state, Level worldIn, BlockPos pos, Block blockIn, BlockPos fromPos, + public void neighborChanged(BlockState state, Level level, BlockPos pos, Block block, BlockPos fromPos, boolean isMoving) { - if (worldIn.isClientSide) + if (level.isClientSide) return; Direction blockFacing = state.getValue(FACING); if (fromPos.equals(pos.relative(blockFacing.getOpposite()))) { - if (!canSurvive(state, worldIn, pos)) { - worldIn.destroyBlock(pos, true); + if (!canSurvive(state, level, pos)) { + level.destroyBlock(pos, true); return; } } - if (!worldIn.getBlockTicks() + if (!level.getBlockTicks() .willTickThisTick(pos, this)) - worldIn.scheduleTick(pos, this, 0); + level.scheduleTick(pos, this, 1); } @Override diff --git a/src/main/java/com/simibubi/create/content/redstone/nixieTube/NixieTubeBlock.java b/src/main/java/com/simibubi/create/content/redstone/nixieTube/NixieTubeBlock.java index 54d4a1a8f4..fb59ee4679 100644 --- a/src/main/java/com/simibubi/create/content/redstone/nixieTube/NixieTubeBlock.java +++ b/src/main/java/com/simibubi/create/content/redstone/nixieTube/NixieTubeBlock.java @@ -221,13 +221,13 @@ public class NixieTubeBlock extends DoubleFaceAttachedBlock } @Override - public void neighborChanged(BlockState state, Level worldIn, BlockPos pos, Block p_220069_4_, BlockPos p_220069_5_, - boolean p_220069_6_) { - if (worldIn.isClientSide) + public void neighborChanged(BlockState state, Level level, BlockPos pos, Block block, BlockPos fromPos, + boolean isMoving) { + if (level.isClientSide) return; - if (!worldIn.getBlockTicks() + if (!level.getBlockTicks() .willTickThisTick(pos, this)) - worldIn.scheduleTick(pos, this, 0); + level.scheduleTick(pos, this, 1); } @Override From 64cc0e9f266e9854cff884e29ad446377dd9578a Mon Sep 17 00:00:00 2001 From: IThundxr Date: Thu, 21 Nov 2024 21:11:10 -0500 Subject: [PATCH 132/515] Broken glue cap - Fix unbreakable superglue not being usable (Creators-of-Create/Create#6253) --- .../content/contraptions/glue/SuperGlueSelectionHelper.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/simibubi/create/content/contraptions/glue/SuperGlueSelectionHelper.java b/src/main/java/com/simibubi/create/content/contraptions/glue/SuperGlueSelectionHelper.java index 503f8f4107..c051d205d7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/glue/SuperGlueSelectionHelper.java +++ b/src/main/java/com/simibubi/create/content/contraptions/glue/SuperGlueSelectionHelper.java @@ -74,6 +74,8 @@ public class SuperGlueSelectionHelper { ItemStack stack = items.get(slot); if (stack.isEmpty()) continue; + if (stack.getTag() != null && stack.getTag().contains("Unbreakable")) + return true; if (!stack.isDamageableItem()) continue; if (!(stack.getItem() instanceof SuperGlueItem)) From 6529b8f74e678f556e57474dc92854f3c1d4ad4f Mon Sep 17 00:00:00 2001 From: IThundxr Date: Thu, 21 Nov 2024 21:37:49 -0500 Subject: [PATCH 133/515] Offset visuals - Fix extended belt funnels placing items at the wrong spot leading to de-synced flap visuals (Creators-of-Create/Create#7095) --- .../content/logistics/funnel/FunnelBlockEntity.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelBlockEntity.java index 6bcdf7d6ba..f2d4f7b841 100644 --- a/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelBlockEntity.java @@ -207,8 +207,14 @@ public class FunnelBlockEntity extends SmartBlockEntity implements IHaveHovering BlockState blockState = getBlockState(); Direction facing = blockState.getValue(BeltFunnelBlock.HORIZONTAL_FACING); + + BlockPos behaviourPos = worldPosition.below(); + + if (blockState.getValue(BeltFunnelBlock.SHAPE) == Shape.EXTENDED) + behaviourPos = behaviourPos.relative(facing); + DirectBeltInputBehaviour inputBehaviour = - BlockEntityBehaviour.get(level, worldPosition.below(), DirectBeltInputBehaviour.TYPE); + BlockEntityBehaviour.get(level, behaviourPos, DirectBeltInputBehaviour.TYPE); if (inputBehaviour == null) return; From 4dfe5aae17c0a7c4340f425512a2099fbd83ffbe Mon Sep 17 00:00:00 2001 From: IThundxr Date: Fri, 22 Nov 2024 09:21:09 -0500 Subject: [PATCH 134/515] Revert "Offset visuals" This reverts commit 6529b8f74e678f556e57474dc92854f3c1d4ad4f. --- .../content/logistics/funnel/FunnelBlockEntity.java | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelBlockEntity.java index f2d4f7b841..6bcdf7d6ba 100644 --- a/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelBlockEntity.java @@ -207,14 +207,8 @@ public class FunnelBlockEntity extends SmartBlockEntity implements IHaveHovering BlockState blockState = getBlockState(); Direction facing = blockState.getValue(BeltFunnelBlock.HORIZONTAL_FACING); - - BlockPos behaviourPos = worldPosition.below(); - - if (blockState.getValue(BeltFunnelBlock.SHAPE) == Shape.EXTENDED) - behaviourPos = behaviourPos.relative(facing); - DirectBeltInputBehaviour inputBehaviour = - BlockEntityBehaviour.get(level, behaviourPos, DirectBeltInputBehaviour.TYPE); + BlockEntityBehaviour.get(level, worldPosition.below(), DirectBeltInputBehaviour.TYPE); if (inputBehaviour == null) return; From b7914ed894d00e03b643b10f0e960b8fb882610c Mon Sep 17 00:00:00 2001 From: IThundxr Date: Sat, 23 Nov 2024 18:30:16 -0500 Subject: [PATCH 135/515] Deprecation Quadrivium - Remove LangMerger & associated classes - Remove ChainedDataProvider --- .../foundation/data/ChainedDataProvider.java | 30 --- .../create/foundation/data/LangEntry.java | 25 -- .../create/foundation/data/LangMerger.java | 222 ------------------ .../create/foundation/data/LangPartial.java | 24 -- 4 files changed, 301 deletions(-) delete mode 100644 src/main/java/com/simibubi/create/foundation/data/ChainedDataProvider.java delete mode 100644 src/main/java/com/simibubi/create/foundation/data/LangEntry.java delete mode 100644 src/main/java/com/simibubi/create/foundation/data/LangMerger.java delete mode 100644 src/main/java/com/simibubi/create/foundation/data/LangPartial.java diff --git a/src/main/java/com/simibubi/create/foundation/data/ChainedDataProvider.java b/src/main/java/com/simibubi/create/foundation/data/ChainedDataProvider.java deleted file mode 100644 index 20275af25a..0000000000 --- a/src/main/java/com/simibubi/create/foundation/data/ChainedDataProvider.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.simibubi.create.foundation.data; - -import java.util.concurrent.CompletableFuture; - -import net.minecraft.data.CachedOutput; -import net.minecraft.data.DataProvider; - -@Deprecated(forRemoval = true) -public class ChainedDataProvider implements DataProvider { - - private DataProvider mainProvider; - private DataProvider addedProvider; - - public ChainedDataProvider(DataProvider mainProvider, DataProvider addedProvider) { - this.mainProvider = mainProvider; - this.addedProvider = addedProvider; - } - - @Override - public CompletableFuture run(CachedOutput pOutput) { - return mainProvider.run(pOutput) - .thenCompose(s -> addedProvider.run(pOutput)); - } - - @Override - public String getName() { - return mainProvider.getName() + " with " + addedProvider.getName(); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/data/LangEntry.java b/src/main/java/com/simibubi/create/foundation/data/LangEntry.java deleted file mode 100644 index 83b2cb4c01..0000000000 --- a/src/main/java/com/simibubi/create/foundation/data/LangEntry.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.simibubi.create.foundation.data; - -import com.tterrag.registrate.AbstractRegistrate; -import com.tterrag.registrate.providers.ProviderType; - -/** - * @deprecated Use {@link AbstractRegistrate#addRawLang} or {@link AbstractRegistrate#addDataGenerator} with {@link ProviderType#LANG} instead. - */ -public class LangEntry { - static final String ENTRY_FORMAT = "\t\"%s\": %s,\n"; - - private String key; - private String value; - - LangEntry(String key, String value) { - this.key = key; - this.value = value; - } - - @Override - public String toString() { - return String.format(ENTRY_FORMAT, key, LangMerger.GSON.toJson(value, String.class)); - } - -} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/foundation/data/LangMerger.java b/src/main/java/com/simibubi/create/foundation/data/LangMerger.java deleted file mode 100644 index 71103e84ad..0000000000 --- a/src/main/java/com/simibubi/create/foundation/data/LangMerger.java +++ /dev/null @@ -1,222 +0,0 @@ -package com.simibubi.create.foundation.data; - -import java.io.BufferedReader; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.OutputStreamWriter; -import java.io.Writer; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.concurrent.CompletableFuture; - -import org.apache.commons.lang3.mutable.MutableBoolean; -import org.apache.commons.lang3.mutable.MutableObject; - -import com.google.common.hash.HashCode; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonObject; -import com.simibubi.create.Create; -import com.tterrag.registrate.AbstractRegistrate; -import com.tterrag.registrate.providers.ProviderType; - -import net.createmod.ponder.foundation.PonderScene; -import net.minecraft.Util; -import net.minecraft.data.CachedOutput; -import net.minecraft.data.DataProvider; -import net.minecraft.data.PackOutput; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.GsonHelper; - -/** - * @deprecated Use {@link AbstractRegistrate#addRawLang} or {@link AbstractRegistrate#addDataGenerator} with {@link ProviderType#LANG} instead. - */ -@Deprecated(forRemoval = true) -public class LangMerger implements DataProvider { - - static final Gson GSON = new GsonBuilder().setPrettyPrinting() - .disableHtmlEscaping() - .create(); - private static final String CATEGORY_HEADER = - "\t\"_\": \"->------------------------] %s [------------------------<-\","; - - private final String modid; - private final String displayName; - private final LangPartial[] langPartials; - - private List mergedLangData; - private List langIgnore; - private PackOutput output; - - public LangMerger(PackOutput output, String modid, String displayName, - T[] allLangPartials) { - this.output = output; - this.modid = modid; - this.displayName = displayName; - this.langPartials = allLangPartials; - this.mergedLangData = new ArrayList<>(); - this.langIgnore = new ArrayList<>(); - populateLangIgnore(); - } - - protected void populateLangIgnore() { - // Key prefixes added here will NOT be transferred to lang templates - langIgnore.add("create.ponder.debug_"); // Ponder debug scene text - langIgnore.add("create.gui.chromatic_projector"); - } - - private boolean shouldIgnore(String key) { - for (String string : langIgnore) - if (key.startsWith(string)) - return true; - return false; - } - - @Override - public String getName() { - return displayName + "'s lang merger"; - } - - @Override - public CompletableFuture run(CachedOutput pOutput) { - Path path = output.createPathProvider(PackOutput.Target.RESOURCE_PACK, "lang") - .json(new ResourceLocation(modid, "en_us")); - - return CompletableFuture.runAsync(() -> { - try { - collectExistingEntries(path); - collectEntries(); - if (mergedLangData.isEmpty()) - return; - save(pOutput, mergedLangData, path, - "Merging en_us.json with hand-written lang entries..."); - - } catch (IOException ioexception) { - LOGGER.error("Failed to run LangMerger", ioexception); - } - - }, Util.backgroundExecutor()); - } - - private void collectExistingEntries(Path path) throws IOException { - if (!Files.exists(path)) { - Create.LOGGER.warn("Nothing to merge! It appears no lang was generated before me."); - return; - } - - try (BufferedReader reader = Files.newBufferedReader(path)) { - JsonObject jsonobject = GsonHelper.fromJson(GSON, reader, JsonObject.class); - - /* - * Erase additional sections from previous lang in case registrate did not - * create a new one (this assumes advancements to be the first section after - * game elements) - */ - Set keysToRemove = new HashSet<>(); - MutableBoolean startErasing = new MutableBoolean(); - jsonobject.entrySet() - .stream() - .forEachOrdered(entry -> { - String key = entry.getKey(); - if (key.startsWith("advancement")) - startErasing.setTrue(); - if (startErasing.isFalse()) - return; - keysToRemove.add(key); - }); - jsonobject.remove("_"); - keysToRemove.forEach(jsonobject::remove); - - addAll("Game Elements", jsonobject); - reader.close(); - } - } - - protected void addAll(String header, JsonObject jsonobject) { - if (jsonobject == null) - return; - header = String.format(CATEGORY_HEADER, header); - - writeData("\n"); - writeData(header); - writeData("\n\n"); - - MutableObject previousKey = new MutableObject<>(""); - jsonobject.entrySet() - .stream() - .forEachOrdered(entry -> { - String key = entry.getKey(); - if (shouldIgnore(key)) - return; - String value = entry.getValue() - .getAsString(); - if (!previousKey.getValue() - .isEmpty() && shouldAddLineBreak(key, previousKey.getValue())) - writeData("\n"); - writeEntry(key, value); - previousKey.setValue(key); - }); - - writeData("\n"); - } - - private void writeData(String data) { - mergedLangData.add(data); - } - - private void writeEntry(String key, String value) { - mergedLangData.add(new LangEntry(key, value)); - } - - protected boolean shouldAddLineBreak(String key, String previousKey) { - // Always put tooltips and ponder scenes in their own paragraphs - if (key.endsWith(".tooltip")) - return true; - if (key.startsWith(modid + ".ponder") && key.endsWith(PonderScene.TITLE_KEY)) - return true; - - key = key.replaceFirst("\\.", ""); - previousKey = previousKey.replaceFirst("\\.", ""); - - String[] split = key.split("\\."); - String[] split2 = previousKey.split("\\."); - if (split.length == 0 || split2.length == 0) - return false; - - // Start new paragraph if keys before second point do not match - return !split[0].equals(split2[0]); - } - - private void collectEntries() { - for (LangPartial partial : langPartials) - addAll(partial.getDisplayName(), partial.provide() - .getAsJsonObject()); - } - - private void save(CachedOutput cache, List dataIn, Path target, String message) throws IOException { - ByteArrayOutputStream bytearrayoutputstream = new ByteArrayOutputStream(); - Writer writer = new OutputStreamWriter(bytearrayoutputstream, StandardCharsets.UTF_8); - writer.append(createString(dataIn)); - writer.close(); - - CachedOutput.NO_CACHE.writeIfNeeded(target, bytearrayoutputstream.toByteArray(), HashCode.fromInt(0)); - Create.LOGGER.info(message); - } - - protected String createString(List data) { - StringBuilder builder = new StringBuilder(); - builder.append("{\n"); - data.forEach(builder::append); - builder.append("\t\"_\": \"Thank you for translating ") - .append(displayName) - .append("!\"\n\n"); - builder.append("}"); - return builder.toString(); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/data/LangPartial.java b/src/main/java/com/simibubi/create/foundation/data/LangPartial.java deleted file mode 100644 index 303e0f6d79..0000000000 --- a/src/main/java/com/simibubi/create/foundation/data/LangPartial.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.simibubi.create.foundation.data; - -import com.google.gson.JsonElement; -import com.simibubi.create.foundation.utility.FilesHelper; -import com.tterrag.registrate.AbstractRegistrate; -import com.tterrag.registrate.providers.ProviderType; - -/** - * @deprecated Use {@link AbstractRegistrate#addRawLang} or {@link AbstractRegistrate#addDataGenerator} with {@link ProviderType#LANG} instead. - */ -@Deprecated(forRemoval = true) -public interface LangPartial { - String getDisplayName(); - - JsonElement provide(); - - static JsonElement fromResource(String namespace, String fileName) { - String path = "assets/" + namespace + "/lang/default/" + fileName + ".json"; - JsonElement element = FilesHelper.loadJsonResource(path); - if (element == null) - throw new IllegalStateException(String.format("Could not find default lang file: %s", path)); - return element; - } -} From dcbb3c70c9505b14dd4bfc981c4153026c0d4121 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Sat, 23 Nov 2024 19:35:37 -0500 Subject: [PATCH 136/515] Deduplication Deprecation - Remove deprecated methods in IHaveGoggleInformation - Remove deprecated method in TreeCutter --- .../equipment/goggles/IHaveGoggleInformation.java | 13 ------------- .../create/foundation/utility/TreeCutter.java | 5 ----- 2 files changed, 18 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/equipment/goggles/IHaveGoggleInformation.java b/src/main/java/com/simibubi/create/content/equipment/goggles/IHaveGoggleInformation.java index 031393bb9f..570aa2008b 100644 --- a/src/main/java/com/simibubi/create/content/equipment/goggles/IHaveGoggleInformation.java +++ b/src/main/java/com/simibubi/create/content/equipment/goggles/IHaveGoggleInformation.java @@ -6,7 +6,6 @@ import java.util.Optional; import com.simibubi.create.AllItems; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.lang.Components; import net.createmod.catnip.utility.lang.LangBuilder; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; @@ -19,18 +18,6 @@ import net.minecraftforge.fluids.capability.IFluidHandler; * Implement this Interface in the BlockEntity class that wants to add info to the screen * */ public interface IHaveGoggleInformation { - - /** - * Use Lang.[...].forGoggles(list) - */ - String spacing = " "; - - /** - * Use Lang.[...].forGoggles(list) - */ - @Deprecated - Component componentSpacing = Components.literal(spacing); - /** * this method will be called when looking at a BlockEntity that implemented this * interface diff --git a/src/main/java/com/simibubi/create/foundation/utility/TreeCutter.java b/src/main/java/com/simibubi/create/foundation/utility/TreeCutter.java index 16b52b08a6..7422940357 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/TreeCutter.java +++ b/src/main/java/com/simibubi/create/foundation/utility/TreeCutter.java @@ -58,11 +58,6 @@ public class TreeCutter { return Optional.empty(); } - @Deprecated(forRemoval = true) - public static Tree findTree(@Nullable BlockGetter reader, BlockPos pos) { - return findTree(reader, pos, Blocks.AIR.defaultBlockState()); - } - /** * Finds a tree at the given pos. Block at the position should be air * From 37134bd6aebf9b14ab92392abbbfd9db8fffa395 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Sat, 23 Nov 2024 21:04:57 -0500 Subject: [PATCH 137/515] Long forgotten - Remove unneeded mixin that was missed during the move to catnip --- .../mixin/client/WindowResizeMixin.java | 25 ------------------- src/main/resources/create.mixins.json | 1 - 2 files changed, 26 deletions(-) delete mode 100644 src/main/java/com/simibubi/create/foundation/mixin/client/WindowResizeMixin.java diff --git a/src/main/java/com/simibubi/create/foundation/mixin/client/WindowResizeMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/client/WindowResizeMixin.java deleted file mode 100644 index 4ac7890ce1..0000000000 --- a/src/main/java/com/simibubi/create/foundation/mixin/client/WindowResizeMixin.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.simibubi.create.foundation.mixin.client; - -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import com.mojang.blaze3d.platform.Window; - -import net.createmod.catnip.gui.UIRenderHelper; -import net.minecraft.client.Minecraft; - -@Mixin(Minecraft.class) -public class WindowResizeMixin { - @Shadow - @Final - private Window window; - - @Inject(method = "resizeDisplay()V", at = @At("TAIL")) - private void create$updateWindowSize(CallbackInfo ci) { - UIRenderHelper.updateWindowSize(window); - } -} diff --git a/src/main/resources/create.mixins.json b/src/main/resources/create.mixins.json index 1627d31007..b0f46c966b 100644 --- a/src/main/resources/create.mixins.json +++ b/src/main/resources/create.mixins.json @@ -44,7 +44,6 @@ "client.LevelRendererMixin", "client.MapRendererMapInstanceMixin", "client.PlayerRendererMixin", - "client.WindowResizeMixin", "compat.JourneyFullscreenMapMixin" ], "injectors": { From d92b47d0ef81a13130338cf56d08b8e91b44418e Mon Sep 17 00:00:00 2001 From: IThundxr Date: Sun, 24 Nov 2024 11:46:20 -0500 Subject: [PATCH 138/515] Box in the vents - Make the player hitbox smaller when hiding as a box and allow them to go into 1x1 spaces --- build.gradle | 9 ++++++++- gradle.properties | 1 + .../equipment/armor/CardboardArmorHandler.java | 11 ++++++++++- .../create/foundation/mixin/EntityMixin.java | 14 ++++++++++++-- src/main/resources/create.mixins.json | 1 + 5 files changed, 32 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index e61210d3b7..a2cce5cff6 100644 --- a/build.gradle +++ b/build.gradle @@ -85,10 +85,11 @@ minecraft { property 'forge.logging.markers', '' property 'forge.logging.console.level', 'info' - jvmArgs '-XX:+IgnoreUnrecognizedVMOptions', '-XX:+AllowEnhancedClassRedefinition' // uncomment with jbr + jvmArgs '-XX:+IgnoreUnrecognizedVMOptions', '-XX:+AllowEnhancedClassRedefinition' //jvmArgs("-XX:-OmitStackTraceInFastThrow") // uncomment when you get exceptions with null messages etc //jvmArgs '-XX:+UnlockCommercialFeatures' // uncomment for profiling + property 'mixin.debug.export', 'true' property 'mixin.env.remapRefMap', 'true' property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" @@ -234,6 +235,10 @@ dependencies { jarJar.ranged(it, '[0.7.5,)') } + implementation(jarJar("io.github.llamalad7:mixinextras-forge:${mixin_extras_version}")) { + jarJar.ranged(it, "[${mixin_extras_version},)") + } + implementation fg.deobf("com.tterrag.registrate:Registrate:${registrate_version}") compileOnly fg.deobf("dev.engine_room.flywheel:flywheel-forge-api-${flywheel_minecraft_version}:${flywheel_version}") @@ -253,6 +258,8 @@ dependencies { implementation fg.deobf("net.createmod.ponder:Ponder-Forge-${minecraft_version}:${ponder_version}") } + compileOnly(annotationProcessor("io.github.llamalad7:mixinextras-common:${mixin_extras_version}")) + compileOnly fg.deobf("mezz.jei:jei-${jei_minecraft_version}-common-api:${jei_version}") compileOnly fg.deobf("mezz.jei:jei-${jei_minecraft_version}-forge-api:${jei_version}") runtimeOnly fg.deobf("mezz.jei:jei-${jei_minecraft_version}-forge:${jei_version}") diff --git a/gradle.properties b/gradle.properties index 2a78b40f28..5ef9b99f7c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -30,6 +30,7 @@ curios_minecraft_version = 1.20.1 curios_version = 5.3.1 catnip_version = 0.8.20 ponder_version = 0.8.12 +mixin_extras_version = 0.4.1 cc_tweaked_enable = true cc_tweaked_minecraft_version = 1.20.1 diff --git a/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorHandler.java b/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorHandler.java index ecdc242952..233afc3e34 100644 --- a/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorHandler.java +++ b/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorHandler.java @@ -6,6 +6,7 @@ import com.simibubi.create.AllItems; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityDimensions; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.Mob; @@ -13,15 +14,23 @@ import net.minecraft.world.entity.NeutralMob; import net.minecraft.world.entity.Pose; import net.minecraft.world.entity.ai.goal.target.TargetGoal; import net.minecraft.world.entity.player.Player; +import net.minecraftforge.event.entity.EntityEvent; import net.minecraftforge.event.entity.living.LivingEvent.LivingTickEvent; import net.minecraftforge.event.entity.living.LivingEvent.LivingVisibilityEvent; -import net.minecraftforge.event.level.NoteBlockEvent.Play; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; @EventBusSubscriber public class CardboardArmorHandler { + @SubscribeEvent + public static void playerHitboxChangesWhenHidingAsBox(EntityEvent.Size event) { + if (event.getEntity().isAddedToWorld() && testForStealth(event.getEntity())) { + event.setNewSize(EntityDimensions.fixed(0.8F, 0.8F)); + event.setNewEyeHeight(0.6F); + } + } + @SubscribeEvent public static void playersStealthWhenWearingCardboard(LivingVisibilityEvent event) { LivingEntity entity = event.getEntity(); diff --git a/src/main/java/com/simibubi/create/foundation/mixin/EntityMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/EntityMixin.java index 45728dcfe5..e9383a7062 100644 --- a/src/main/java/com/simibubi/create/foundation/mixin/EntityMixin.java +++ b/src/main/java/com/simibubi/create/foundation/mixin/EntityMixin.java @@ -1,5 +1,12 @@ package com.simibubi.create.foundation.mixin; +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; + +import com.llamalad7.mixinextras.sugar.Local; +import com.simibubi.create.content.equipment.armor.CardboardArmorHandler; + +import net.minecraft.world.entity.Pose; + import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -11,7 +18,11 @@ import net.minecraft.world.entity.Entity; @Mixin(value = Entity.class, priority = 900) public class EntityMixin { - + @ModifyExpressionValue(method = "canEnterPose", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/Level;noCollision(Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/phys/AABB;)Z")) + public boolean create$playerHidingAsBoxIsCrouchingNotSwimming(boolean original, @Local(argsOnly = true) Pose pose) { + return original || (pose == Pose.CROUCHING && CardboardArmorHandler.testForStealth((Entity) (Object) this)); + } + @Inject(method = "fireImmune()Z", at = @At("RETURN"), cancellable = true) public void create$onFireImmune(CallbackInfoReturnable cir) { if (!cir.getReturnValueZ()) { @@ -21,5 +32,4 @@ public class EntityMixin { cir.setReturnValue(immune); } } - } diff --git a/src/main/resources/create.mixins.json b/src/main/resources/create.mixins.json index b0f46c966b..f5704cff09 100644 --- a/src/main/resources/create.mixins.json +++ b/src/main/resources/create.mixins.json @@ -15,6 +15,7 @@ "LavaSwimmingMixin", "MainMixin", "MapItemSavedDataMixin", + "PlayerMixin", "TestCommandMixin", "WaterWheelFluidSpreadMixin", "accessor.AbstractProjectileDispenseBehaviorAccessor", From 844419b937b06ab28e24f61e433298888c3ca52c Mon Sep 17 00:00:00 2001 From: IThundxr Date: Sun, 24 Nov 2024 11:48:13 -0500 Subject: [PATCH 139/515] The tale of the forgotten mixin - Remove removed mixin from create.mixins.json --- src/main/resources/create.mixins.json | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/resources/create.mixins.json b/src/main/resources/create.mixins.json index f5704cff09..b0f46c966b 100644 --- a/src/main/resources/create.mixins.json +++ b/src/main/resources/create.mixins.json @@ -15,7 +15,6 @@ "LavaSwimmingMixin", "MainMixin", "MapItemSavedDataMixin", - "PlayerMixin", "TestCommandMixin", "WaterWheelFluidSpreadMixin", "accessor.AbstractProjectileDispenseBehaviorAccessor", From 3547b72f7304112974361e73b2514523ff1b5407 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Sun, 24 Nov 2024 12:12:01 -0500 Subject: [PATCH 140/515] Repair threshold reached - Fix threshold switch gametests to account for the recent changes --- .../gametest/tests/TestMisc.java | 4 ++-- .../gametest/fluids/threshold_switch.nbt | Bin 1664 -> 1907 bytes 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/simibubi/create/infrastructure/gametest/tests/TestMisc.java b/src/main/java/com/simibubi/create/infrastructure/gametest/tests/TestMisc.java index c8bd01749a..4a090ae176 100644 --- a/src/main/java/com/simibubi/create/infrastructure/gametest/tests/TestMisc.java +++ b/src/main/java/com/simibubi/create/infrastructure/gametest/tests/TestMisc.java @@ -90,8 +90,8 @@ public class TestMisc { helper.pullLever(lever); helper.succeedWhen(() -> { ThresholdSwitchBlockEntity switchBe = helper.getBlockEntity(AllBlockEntityTypes.THRESHOLD_SWITCH.get(), switchPos); - float level = switchBe.getStockLevel(); - if (level < 0 || level > 1) + int level = switchBe.getStockLevel(); + if (level < 0 || level > 100) helper.fail("Invalid level: " + level); }); } diff --git a/src/main/resources/data/create/structures/gametest/fluids/threshold_switch.nbt b/src/main/resources/data/create/structures/gametest/fluids/threshold_switch.nbt index ba193c37129be03128fd03186c678ba75dab2b33..5a0ea04e5c9606f8578c3a2a50fb37e6c7608631 100644 GIT binary patch literal 1907 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 HRRG{`!GK37 From 6f8a9199178339733d43a69ac59660b140be7eb4 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Mon, 25 Nov 2024 18:35:17 +0100 Subject: [PATCH 141/515] Autocraft a better life - lang entries for panel auto-crafting - Mechanical crafters waste less time on empty animation frames - panel auto-crafting centres its recipes --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 6 +- .../resources/assets/create/lang/en_ud.json | 6 +- .../resources/assets/create/lang/en_us.json | 6 +- .../crafter/MechanicalCrafterBlockEntity.java | 13 ++-- .../kinetics/crafter/RecipeGridHandler.java | 7 ++ .../factoryBoard/FactoryPanelScreen.java | 67 ++++++++++++------- .../assets/create/lang/default/interface.json | 6 +- 7 files changed, 77 insertions(+), 34 deletions(-) diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index da29cb5a51..950b672860 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-11-05T22:14:55.5235978 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-11-25T18:00:08.2851015 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -638,8 +638,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -57831942f845db5cd15c5ad08d643b25eaf5d6e1 assets/create/lang/en_ud.json -0f661f60a043ebcf20c52ad99e928d97cb0cd355 assets/create/lang/en_us.json +553a69a3cfe418452f126632905c039e89d3f47a assets/create/lang/en_ud.json +084c76dda84efc8a2a4c82615a0e411444e53afc assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 280c346555..86b1eb8c30 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -1191,9 +1191,13 @@ "create.gui.config.overlay8": "uoıʇısod ʇןnɐɟǝp ǝɥʇ oʇ ʇǝsǝɹ oʇ", "create.gui.contraptions.network_overstressed": "˙‾ʇɔɐdɯı‾ ‾ssǝɹʇs‾ ɥbıɥ ɐ ɥʇıʍ sʇuǝuodɯoɔ ǝɥʇ ‾uʍop‾ ‾ʍoןs‾ ɹo sǝɔɹnos ǝɹoɯ ppⱯ ˙‾pǝssǝɹʇsɹǝʌo‾ sı uoıʇdɐɹʇuoɔ sıɥʇ ʇɐɥʇ sɹɐǝddɐ ʇI", "create.gui.contraptions.not_fast_enough": "˙‾pǝǝds‾ ‾ɥbnouǝ‾ ɥʇıʍ buıʇɐʇoɹ ‾ʇou‾ sı %1$s sıɥʇ ʇɐɥʇ sɹɐǝddɐ ʇI", + "create.gui.factory_panel.activate_crafting": "buıʇɟɐɹƆ pǝbuɐɹɹɐ-ǝɹd ǝןbbo⟘", "create.gui.factory_panel.connect_input": "ןǝuɐd ʇnduı uɐ ʇɔǝuuoƆ", + "create.gui.factory_panel.crafting_input": "sʇuǝıpǝɹbuI pǝbɐʞɔɐԀ", + "create.gui.factory_panel.crafting_input_tip": "pǝʇɔǝuuoɔ oʇuı ǝbɐʞɔɐdu∩", + "create.gui.factory_panel.crafting_input_tip_1": ")ƐxƐ( sɹǝʇɟɐɹɔ ןɐɔıuɐɥɔǝɯ", "create.gui.factory_panel.empty_panel": "ןǝuɐd ʎʇdɯƎ", - "create.gui.factory_panel.expected_output": "%1$s ʇɔǝdxƎ", + "create.gui.factory_panel.expected_output": "%1$s buıʇɔǝdxƎ", "create.gui.factory_panel.expected_output_tip": "buıuɹnʇǝɹ ʇndʇno ɟo ʇunoɯɐ ǝɥ⟘", "create.gui.factory_panel.expected_output_tip_1": "ʇsǝnbǝɹ ןnɟssǝɔɔns ɥɔɐǝ ɹǝʇɟɐ", "create.gui.factory_panel.expected_output_tip_2": "ǝbuɐɥɔ oʇ ןןoɹɔS", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index c77cec505d..551a28dcdb 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1191,9 +1191,13 @@ "create.gui.config.overlay8": "to reset to the default position", "create.gui.contraptions.network_overstressed": "It appears that this contraption is _overstressed_. Add more sources or _slow_ _down_ the components with a high _stress_ _impact_.", "create.gui.contraptions.not_fast_enough": "It appears that this %1$s is _not_ rotating with _enough_ _speed_.", + "create.gui.factory_panel.activate_crafting": "Toggle pre-arranged Crafting", "create.gui.factory_panel.connect_input": "Connect an input panel", + "create.gui.factory_panel.crafting_input": "Packaged Ingredients", + "create.gui.factory_panel.crafting_input_tip": "Unpackage into connected", + "create.gui.factory_panel.crafting_input_tip_1": "mechanical crafters (3x3)", "create.gui.factory_panel.empty_panel": "Empty panel", - "create.gui.factory_panel.expected_output": "Expect %1$s", + "create.gui.factory_panel.expected_output": "Expecting %1$s", "create.gui.factory_panel.expected_output_tip": "The amount of output returning", "create.gui.factory_panel.expected_output_tip_1": "after each successful request", "create.gui.factory_panel.expected_output_tip_2": "Scroll to change", diff --git a/src/main/java/com/simibubi/create/content/kinetics/crafter/MechanicalCrafterBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/crafter/MechanicalCrafterBlockEntity.java index 79fe8b3d6a..4dac8c256b 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/crafter/MechanicalCrafterBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/crafter/MechanicalCrafterBlockEntity.java @@ -203,6 +203,8 @@ public class MechanicalCrafterBlockEntity extends KineticBlockEntity { if (phaseBefore != phase && phase == Phase.CRAFTING) groupedItemsBeforeCraft = before; if (phaseBefore == Phase.EXPORTING && phase == Phase.WAITING) { + if (before.onlyEmptyItems()) + return; Direction facing = getBlockState().getValue(MechanicalCrafterBlock.HORIZONTAL_FACING); Vec3 vec = Vec3.atLowerCornerOf(facing.getNormal()) .scale(.75) @@ -253,7 +255,7 @@ public class MechanicalCrafterBlockEntity extends KineticBlockEntity { return; if (RecipeGridHandler.getTargetingCrafter(this) != null) { phase = Phase.EXPORTING; - countDown = 1000; + countDown = groupedItems.onlyEmptyItems() ? 0 : 1000; sendData(); return; } @@ -305,12 +307,15 @@ public class MechanicalCrafterBlockEntity extends KineticBlockEntity { return; } + boolean empty = groupedItems.onlyEmptyItems(); Pointing pointing = getBlockState().getValue(MechanicalCrafterBlock.POINTING); groupedItems.mergeOnto(targetingCrafter.groupedItems, pointing); groupedItems = new GroupedItems(); float pitch = targetingCrafter.groupedItems.grid.size() * 1 / 16f + .5f; - AllSoundEvents.CRAFTER_CLICK.playOnServer(level, worldPosition, 1, pitch); + + if (!empty) + AllSoundEvents.CRAFTER_CLICK.playOnServer(level, worldPosition, 1, pitch); phase = Phase.WAITING; countDown = 0; @@ -497,7 +502,7 @@ public class MechanicalCrafterBlockEntity extends KineticBlockEntity { if (RecipeGridHandler.getPrecedingCrafters(this) .isEmpty()) { phase = Phase.ASSEMBLING; - countDown = 500; + countDown = 1; } sendData(); } @@ -514,7 +519,7 @@ public class MechanicalCrafterBlockEntity extends KineticBlockEntity { return; phase = Phase.ASSEMBLING; - countDown = Math.max(100, getCountDownSpeed() + 1); + countDown = 1; } @Override diff --git a/src/main/java/com/simibubi/create/content/kinetics/crafter/RecipeGridHandler.java b/src/main/java/com/simibubi/create/content/kinetics/crafter/RecipeGridHandler.java index 8ff15ae150..2dd08289b0 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/crafter/RecipeGridHandler.java +++ b/src/main/java/com/simibubi/create/content/kinetics/crafter/RecipeGridHandler.java @@ -239,6 +239,13 @@ public class RecipeGridHandler { height = maxY - minY + 1; } + public boolean onlyEmptyItems() { + for (ItemStack stack : grid.values()) + if (!stack.isEmpty()) + return false; + return true; + } + } } diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java index 8f1b2b4731..0bb098795a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java @@ -91,14 +91,23 @@ public class FactoryPanelScreen extends AbstractSimiScreen { } craftingIngredients = new ArrayList<>(); - - int width = 3; - if (availableCraftingRecipe instanceof IShapedRecipe shaped) - width = shaped.getRecipeWidth(); - NonNullList ingredients = availableCraftingRecipe.getIngredients(); BigItemStack emptyIngredient = new BigItemStack(ItemStack.EMPTY, 1); + int width = Math.min(3, ingredients.size()); + int height = Math.min(3, ingredients.size() / 3 + 1); + + if (availableCraftingRecipe instanceof IShapedRecipe shaped) { + width = shaped.getRecipeWidth(); + height = shaped.getRecipeHeight(); + } + + if (height == 1) + for (int i = 0; i < 3; i++) + craftingIngredients.add(emptyIngredient); + if (width == 1) + craftingIngredients.add(emptyIngredient); + for (int i = 0; i < ingredients.size(); i++) { Ingredient ingredient = ingredients.get(i); BigItemStack craftingIngredient = emptyIngredient; @@ -257,24 +266,23 @@ public class FactoryPanelScreen extends AbstractSimiScreen { if (mouseX >= outputX - 1 && mouseX < outputX - 1 + 18 && mouseY >= outputY - 1 && mouseY < outputY - 1 + 18) { - graphics.renderComponentTooltip(font, - List.of( - CreateLang - .translate("gui.factory_panel.expected_output", CreateLang.itemName(outputConfig.stack) - .add(CreateLang.text(" x" + outputConfig.count)) - .string()) - .color(ScrollInput.HEADER_RGB) - .component(), - CreateLang.translate("gui.factory_panel.expected_output_tip") - .style(ChatFormatting.GRAY) - .component(), - CreateLang.translate("gui.factory_panel.expected_output_tip_1") - .style(ChatFormatting.GRAY) - .component(), - CreateLang.translate("gui.factory_panel.expected_output_tip_2") - .style(ChatFormatting.DARK_GRAY) - .style(ChatFormatting.ITALIC) - .component()), + MutableComponent c1 = CreateLang + .translate("gui.factory_panel.expected_output", CreateLang.itemName(outputConfig.stack) + .add(CreateLang.text(" x" + outputConfig.count)) + .string()) + .color(ScrollInput.HEADER_RGB) + .component(); + MutableComponent c2 = CreateLang.translate("gui.factory_panel.expected_output_tip") + .style(ChatFormatting.GRAY) + .component(); + MutableComponent c3 = CreateLang.translate("gui.factory_panel.expected_output_tip_1") + .style(ChatFormatting.GRAY) + .component(); + MutableComponent c4 = CreateLang.translate("gui.factory_panel.expected_output_tip_2") + .style(ChatFormatting.DARK_GRAY) + .style(ChatFormatting.ITALIC) + .component(); + graphics.renderComponentTooltip(font, craftingActive ? List.of(c1, c2, c3) : List.of(c1, c2, c3, c4), mouseX, mouseY); } } @@ -383,8 +391,19 @@ public class FactoryPanelScreen extends AbstractSimiScreen { if (mouseX < inputX - 1 || mouseX >= inputX - 1 + 18 || mouseY < inputY - 1 || mouseY >= inputY - 1 + 18) return; - if (craftingActive) + if (craftingActive) { + graphics.renderComponentTooltip(font, List.of(CreateLang.translate("gui.factory_panel.crafting_input") + .color(ScrollInput.HEADER_RGB) + .component(), + CreateLang.translate("gui.factory_panel.crafting_input_tip") + .style(ChatFormatting.GRAY) + .component(), + CreateLang.translate("gui.factory_panel.crafting_input_tip_1") + .style(ChatFormatting.GRAY) + .component()), + mouseX, mouseY); return; + } if (itemStack.stack.isEmpty()) { graphics.renderComponentTooltip(font, List.of(CreateLang.translate("gui.factory_panel.empty_panel") diff --git a/src/main/resources/assets/create/lang/default/interface.json b/src/main/resources/assets/create/lang/default/interface.json index d611db67f9..8fc0e3ccf5 100644 --- a/src/main/resources/assets/create/lang/default/interface.json +++ b/src/main/resources/assets/create/lang/default/interface.json @@ -1036,7 +1036,7 @@ "create.gui.factory_panel.left_click_reset": "Left-Click to reset", "create.gui.factory_panel.promises_expire_title": "Promises expire after", "create.gui.factory_panel.promises_do_not_expire": "Promises do not expire", - "create.gui.factory_panel.expected_output": "Expect %1$s", + "create.gui.factory_panel.expected_output": "Expecting %1$s", "create.gui.factory_panel.restocker_promises_tip": "When items are sent, a promise", "create.gui.factory_panel.restocker_promises_tip_1": "is held until they arrive.", "create.gui.factory_panel.recipe_promises_tip": "When inputs are sent, a promise", @@ -1062,6 +1062,10 @@ "create.gui.factory_panel.restocker_address_given": "Sending to", "create.gui.factory_panel.restocker_address_tip": "Enter an address that will", "create.gui.factory_panel.restocker_address_tip_1": "cause packages to arrive here.", + "create.gui.factory_panel.activate_crafting": "Toggle pre-arranged Crafting", + "create.gui.factory_panel.crafting_input": "Packaged Ingredients", + "create.gui.factory_panel.crafting_input_tip": "Unpackage into connected", + "create.gui.factory_panel.crafting_input_tip_1": "mechanical crafters (3x3)", "create.gui.redstone_requester.allow_partial": "Allow partial orders", "create.gui.redstone_requester.dont_allow_partial": "Must send all items", From 289e1a64c397f922f6645a6d2f4c50fa2111b3f1 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Mon, 25 Nov 2024 22:12:02 +0100 Subject: [PATCH 142/515] Order 420 - Mechanical arms can interact with packagers directly - Blaze burners can be stock keepers --- .../AllArmInteractionPointTypes.java | 17 +++++++ .../packager/PackagerBlockEntity.java | 1 - .../stockTicker/StockTickerBlockEntity.java | 3 ++ .../StockTickerInteractionHandler.java | 33 ++++++------- .../stockTicker/StockTickerRequestScreen.java | 41 ++++++++++++++++ .../processing/burner/BlazeBurnerBlock.java | 10 ++++ .../burner/BlazeBurnerBlockEntity.java | 48 +++++++++++++++++-- .../burner/BlazeBurnerRenderer.java | 19 ++++---- .../processing/burner/BlazeBurnerVisual.java | 12 +++-- 9 files changed, 149 insertions(+), 35 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/AllArmInteractionPointTypes.java b/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/AllArmInteractionPointTypes.java index 0bd79ebb9d..f08dbd7c83 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/AllArmInteractionPointTypes.java +++ b/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/AllArmInteractionPointTypes.java @@ -74,6 +74,7 @@ public class AllArmInteractionPointTypes { public static final DepotType DEPOT = register("depot", DepotType::new); public static final FunnelType FUNNEL = register("funnel", FunnelType::new); public static final MillstoneType MILLSTONE = register("millstone", MillstoneType::new); + public static final PackagerType PACKAGER = register("packager", PackagerType::new); public static final SawType SAW = register("saw", SawType::new); public static final CampfireType CAMPFIRE = register("campfire", CampfireType::new); @@ -255,6 +256,22 @@ public class AllArmInteractionPointTypes { return new ArmInteractionPoint(this, level, pos, state); } } + + public static class PackagerType extends ArmInteractionPointType { + public PackagerType(ResourceLocation id) { + super(id); + } + + @Override + public boolean canCreatePoint(Level level, BlockPos pos, BlockState state) { + return AllBlocks.PACKAGER.has(state); + } + + @Override + public ArmInteractionPoint createPoint(Level level, BlockPos pos, BlockState state) { + return new ArmInteractionPoint(this, level, pos, state); + } + } public static class SawType extends ArmInteractionPointType { public SawType(ResourceLocation id) { diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java index ba01e4ab48..200926c3b6 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java @@ -1,6 +1,5 @@ package com.simibubi.create.content.logistics.packager; -import java.util.ArrayList; import java.util.HashSet; import java.util.LinkedList; import java.util.List; diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java index 433ebc36dc..70040b11dc 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java @@ -7,6 +7,7 @@ import java.util.List; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllPackets; import com.simibubi.create.content.contraptions.actors.seat.SeatEntity; import com.simibubi.create.content.equipment.goggles.IHaveHoveringInformation; @@ -175,6 +176,8 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity implements for (SeatEntity seatEntity : level.getEntitiesOfClass(SeatEntity.class, new AABB(seatPos))) if (seatEntity.isVehicle()) return true; + if (yOffset == 0 && AllBlockEntityTypes.HEATER.is(level.getBlockEntity(seatPos))) + return true; } } return false; diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java index 12a72cba5b..05b0d285c6 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java @@ -53,23 +53,30 @@ public class StockTickerInteractionHandler { if (targetPos == null) return; + if (interactWithLogisticsManagerAt(player, level, targetPos)) { + event.setCancellationResult(InteractionResult.SUCCESS); + event.setCanceled(true); + } + } + + public static boolean interactWithLogisticsManagerAt(Player player, Level level, BlockPos targetPos) { ItemStack mainHandItem = player.getMainHandItem(); if (AllItems.SHOPPING_LIST.isIn(mainHandItem)) { - interactWithShop(event, player, level, targetPos, mainHandItem); - return; + interactWithShop(player, level, targetPos, mainHandItem); + return true; } if (level.isClientSide()) - return; + return true; if (!(level.getBlockEntity(targetPos) instanceof StockTickerBlockEntity stbe)) - return; + return false; if (!stbe.behaviour.mayInteract(player)) { player.displayClientMessage(CreateLang.translate("stock_keeper.locked") .style(ChatFormatting.RED) .component(), true); - return; + return true; } if (player instanceof ServerPlayer sp) { @@ -83,17 +90,11 @@ public class StockTickerInteractionHandler { stbe.getRecentSummary() .divideAndSendTo(sp, targetPos); } - - event.setCancellationResult(InteractionResult.SUCCESS); - event.setCanceled(true); - return; + + return true; } - private static void interactWithShop(EntityInteractSpecific event, Player player, Level level, BlockPos targetPos, - ItemStack mainHandItem) { - event.setCancellationResult(InteractionResult.SUCCESS); - event.setCanceled(true); - + private static void interactWithShop(Player player, Level level, BlockPos targetPos, ItemStack mainHandItem) { if (level.isClientSide()) return; if (!(level.getBlockEntity(targetPos) instanceof StockTickerBlockEntity tickerBE)) @@ -188,7 +189,7 @@ public class StockTickerInteractionHandler { Entity rootVehicle = entity.getRootVehicle(); if (!(rootVehicle instanceof SeatEntity)) return null; - if (!(entity instanceof LivingEntity living)) + if (!(entity instanceof LivingEntity)) return null; if (AllEntityTypes.PACKAGE.is(entity)) return null; @@ -203,7 +204,7 @@ public class StockTickerInteractionHandler { .above(y); if (!(entity.level() .getBlockState(workstationPos) - .getBlock() instanceof StockTickerBlock lw)) + .getBlock() instanceof StockTickerBlock)) continue; targetPos = workstationPos; stations++; diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java index 644d397081..b90201a5b3 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java @@ -12,34 +12,44 @@ import javax.annotation.Nullable; import org.lwjgl.glfw.GLFW; +import com.mojang.blaze3d.platform.Lighting; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.AllPackets; +import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.contraptions.actors.seat.SeatEntity; import com.simibubi.create.content.logistics.AddressEditBox; import com.simibubi.create.content.logistics.BigItemStack; import com.simibubi.create.content.logistics.packager.InventorySummary; +import com.simibubi.create.content.processing.burner.BlazeBurnerBlock.HeatLevel; +import com.simibubi.create.content.processing.burner.BlazeBurnerBlockEntity; +import com.simibubi.create.content.processing.burner.BlazeBurnerRenderer; import com.simibubi.create.content.trains.station.NoShadowFontWrapper; import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.ScreenWithStencils; import com.simibubi.create.foundation.utility.CreateLang; +import dev.engine_room.flywheel.lib.model.baked.PartialModel; import net.createmod.catnip.gui.AbstractSimiScreen; import net.createmod.catnip.gui.UIRenderHelper; import net.createmod.catnip.gui.element.GuiGameElement; +import net.createmod.catnip.utility.AnimationTickHolder; import net.createmod.catnip.utility.Couple; import net.createmod.catnip.utility.Iterate; import net.createmod.catnip.utility.Pair; import net.createmod.catnip.utility.animation.LerpedFloat; import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.utility.math.AngleHelper; import net.createmod.catnip.utility.theme.Color; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.EditBox; import net.minecraft.client.gui.screens.inventory.InventoryScreen; +import net.minecraft.client.renderer.RenderType; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; @@ -86,6 +96,7 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre List itemsToOrder; WeakReference stockKeeper; + WeakReference blaze; boolean encodeRequester; // Redstone requesters @@ -128,6 +139,11 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre && seatEntity.getPassengers() .get(0) instanceof LivingEntity keeper) stockKeeper = new WeakReference<>(keeper); + if (yOffset == 0 && be.getLevel() + .getBlockEntity(seatPos) instanceof BlazeBurnerBlockEntity bbbe) { + blaze = new WeakReference<>(bbbe); + return; + } } } } @@ -365,6 +381,31 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre ms.popPose(); } + BlazeBurnerBlockEntity keeperBE = blaze.get(); + if (keeperBE != null && !keeperBE.isRemoved()) { + ms.pushPose(); + int entityX = x + windowWidth + 10; + int entityY = y + windowHeight - 80; + AllGuiTextures.STOCK_KEEPER_REQUEST_SAYS.render(graphics, x + 226, (entityY - 22) / 2 * 2); + ms.translate(entityX, entityY, 300); + ms.mulPose(Axis.XP.rotationDegrees(-22.5f)); + ms.mulPose(Axis.YP.rotationDegrees(-45)); + ms.scale(48, -48, 48); + float animation = keeperBE.headAnimation.getValue(AnimationTickHolder.getPartialTicks()) * .175f; + float horizontalAngle = AngleHelper.rad(180); + HeatLevel heatLevel = keeperBE.getHeatLevelForRender(); + boolean canDrawFlame = heatLevel.isAtLeast(HeatLevel.FADING); + boolean drawGoggles = keeperBE.goggles; + PartialModel drawHat = AllPartialModels.LOGISTICS_HAT; + int hashCode = keeperBE.hashCode(); + Lighting.setupForEntityInInventory(); + BlazeBurnerRenderer.renderShared(ms, null, graphics.bufferSource(), minecraft.level, + keeperBE.getBlockState(), heatLevel, animation, horizontalAngle, canDrawFlame, drawGoggles, drawHat, + hashCode); + Lighting.setupFor3DItems(); + ms.popPose(); + } + // Render static item icons ms.pushPose(); ms.translate(x - 30, y + windowHeight - 80, 0); diff --git a/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerBlock.java b/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerBlock.java index 03646604d9..d39b378dc8 100644 --- a/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerBlock.java +++ b/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerBlock.java @@ -10,6 +10,8 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.AllShapes; import com.simibubi.create.content.equipment.wrench.IWrenchable; +import com.simibubi.create.content.logistics.stockTicker.StockTickerBlockEntity; +import com.simibubi.create.content.logistics.stockTicker.StockTickerInteractionHandler; import com.simibubi.create.content.processing.basin.BasinBlockEntity; import com.simibubi.create.foundation.block.IBE; @@ -114,6 +116,14 @@ public class BlazeBurnerBlock extends HorizontalDirectionalBlock implements IBE< return InteractionResult.SUCCESS; }); + BlazeBurnerBlockEntity be = getBlockEntity(world, pos); + if (be != null && be.stockKeeper) { + StockTickerBlockEntity stockTicker = BlazeBurnerBlockEntity.getStockTicker(world, pos); + if (stockTicker != null) + StockTickerInteractionHandler.interactWithLogisticsManagerAt(player, world, stockTicker.getBlockPos()); + return InteractionResult.SUCCESS; + } + if (heldItem.isEmpty() && heat != HeatLevel.NONE) return onBlockEntityUse(world, pos, bbte -> { if (!bbte.goggles) diff --git a/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerBlockEntity.java b/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerBlockEntity.java index 04b42f1614..dfcc5097dc 100644 --- a/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerBlockEntity.java @@ -2,15 +2,21 @@ package com.simibubi.create.content.processing.burner; import java.util.List; +import javax.annotation.Nullable; + +import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.AllTags.AllItemTags; import com.simibubi.create.content.fluids.tank.FluidTankBlock; +import com.simibubi.create.content.logistics.stockTicker.StockTickerBlock; +import com.simibubi.create.content.logistics.stockTicker.StockTickerBlockEntity; import com.simibubi.create.content.processing.basin.BasinBlock; import com.simibubi.create.content.processing.burner.BlazeBurnerBlock.HeatLevel; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import dev.engine_room.flywheel.api.backend.BackendManager; +import net.createmod.catnip.utility.Iterate; import net.createmod.catnip.utility.VecHelper; import net.createmod.catnip.utility.animation.LerpedFloat; import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; @@ -26,6 +32,8 @@ import net.minecraft.sounds.SoundSource; import net.minecraft.util.Mth; import net.minecraft.util.RandomSource; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; @@ -38,13 +46,16 @@ public class BlazeBurnerBlockEntity extends SmartBlockEntity { public static final int MAX_HEAT_CAPACITY = 10000; public static final int INSERTION_THRESHOLD = 500; + public LerpedFloat headAnimation; + public boolean stockKeeper; + public boolean isCreative; + public boolean goggles; + public boolean hat; + protected FuelType activeFuel; protected int remainingBurnTime; - protected LerpedFloat headAnimation; protected LerpedFloat headAngle; - protected boolean isCreative; - protected boolean goggles; - protected boolean hat; + public BlazeBurnerBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); @@ -54,6 +65,7 @@ public class BlazeBurnerBlockEntity extends SmartBlockEntity { headAngle = LerpedFloat.angular(); isCreative = false; goggles = false; + stockKeeper = false; headAngle.startWithValue((AngleHelper.horizontalAngle(state.getOptionalValue(BlazeBurnerBlock.FACING) .orElse(Direction.SOUTH)) + 180) % 360); @@ -103,6 +115,27 @@ public class BlazeBurnerBlockEntity extends SmartBlockEntity { updateBlockState(); } + @Override + public void lazyTick() { + super.lazyTick(); + stockKeeper = getStockTicker(level, worldPosition) != null; + } + + @Nullable + public static StockTickerBlockEntity getStockTicker(LevelAccessor level, BlockPos pos) { + for (Direction direction : Iterate.horizontalDirections) { + if (level instanceof Level l && !l.isLoaded(pos)) + return null; + BlockState blockState = level.getBlockState(pos.relative(direction)); + if (!AllBlocks.STOCK_TICKER.has(blockState) + || blockState.getValue(StockTickerBlock.FACING) != direction.getOpposite()) + continue; + if (level.getBlockEntity(pos.relative(direction)) instanceof StockTickerBlockEntity stbe) + return stbe; + } + return null; + } + @OnlyIn(Dist.CLIENT) private boolean shouldTickAnimation() { // Offload the animation tick to the visual when flywheel in enabled @@ -173,6 +206,13 @@ public class BlazeBurnerBlockEntity extends SmartBlockEntity { public BlazeBurnerBlock.HeatLevel getHeatLevelFromBlock() { return BlazeBurnerBlock.getHeatLevelOf(getBlockState()); } + + public BlazeBurnerBlock.HeatLevel getHeatLevelForRender() { + HeatLevel heatLevel = getHeatLevelFromBlock(); + if (!heatLevel.isAtLeast(HeatLevel.FADING) && stockKeeper) + return HeatLevel.FADING; + return heatLevel; + } public void updateBlockState() { setBlockHeat(getHeatLevel()); diff --git a/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerRenderer.java b/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerRenderer.java index 3176beb2cf..896014c598 100644 --- a/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerRenderer.java +++ b/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerRenderer.java @@ -35,7 +35,7 @@ public class BlazeBurnerRenderer extends SafeBlockEntityRenderer 0.125f; float time = LevelTickHolder.getRenderTime(level); @@ -143,8 +142,8 @@ public class BlazeBurnerRenderer extends SafeBlockEntityRenderer Date: Tue, 26 Nov 2024 22:21:21 +0100 Subject: [PATCH 143/515] Re-packaged - Fixed logistics hat not using cutout layer - Stock ticker categories can be moved to top or bottom of list - Packager block shows a redstone indicator - Defragmenting Packager is now its own block - Stock links no longer prevent packager activation by redstone --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 13 +- .../assets/create/blockstates/packager.json | 90 ++------ .../assets/create/blockstates/repackager.json | 46 ++++ .../resources/assets/create/lang/en_ud.json | 5 +- .../resources/assets/create/lang/en_us.json | 5 +- .../assets/create/models/item/repackager.json | 3 + .../create/loot_tables/blocks/repackager.json | 21 ++ .../tags/blocks/mineable/pickaxe.json | 1 + .../simibubi/create/AllBlockEntityTypes.java | 7 + .../java/com/simibubi/create/AllBlocks.java | 19 +- .../com/simibubi/create/AllPartialModels.java | 2 +- .../factoryBoard/FactoryPanelBlockEntity.java | 3 + .../logistics/packager/PackagerBlock.java | 43 +--- .../packager/PackagerBlockEntity.java | 207 ++++-------------- .../logistics/packager/PackagerGenerator.java | 7 +- .../logistics/packager/PackagerRenderer.java | 8 +- .../packager/repackager/RepackagerBlock.java | 20 ++ .../repackager/RepackagerBlockEntity.java | 121 ++++++++++ .../packagerLink/PackagerLinkBlockEntity.java | 10 +- .../StockKeeperCategoryScreen.java | 18 +- .../processing/burner/BlazeBurnerVisual.java | 1 + .../create/foundation/data/AssetLookup.java | 3 +- .../foundation/data/BuilderTransformers.java | 15 ++ .../assets/create/lang/default/interface.json | 5 +- .../{block_regular.json => block.json} | 0 .../models/block/packager/block_powered.json | 7 + ...ular_vertical.json => block_vertical.json} | 0 .../packager/block_vertical_powered.json | 7 + .../packager/{tray_regular.json => tray.json} | 0 .../block.json} | 2 +- .../block/repackager/block_powered.json | 7 + .../block_vertical.json} | 2 +- .../repackager/block_vertical_powered.json | 7 + .../create/models/block/repackager/item.json | 7 + .../tray_defrag.json => repackager/tray.json} | 2 +- .../create/models/entity/logistics_hat.json | 1 + .../create/textures/block/packager_block.png | Bin 2324 -> 508 bytes .../textures/block/packager_block_defrag.png | Bin 1131 -> 508 bytes .../block/packager_block_defrag_powered.png | Bin 0 -> 508 bytes .../textures/block/packager_block_powered.png | Bin 0 -> 508 bytes 40 files changed, 402 insertions(+), 313 deletions(-) create mode 100644 src/generated/resources/assets/create/blockstates/repackager.json create mode 100644 src/generated/resources/assets/create/models/item/repackager.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/repackager.json create mode 100644 src/main/java/com/simibubi/create/content/logistics/packager/repackager/RepackagerBlock.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/packager/repackager/RepackagerBlockEntity.java rename src/main/resources/assets/create/models/block/packager/{block_regular.json => block.json} (100%) create mode 100644 src/main/resources/assets/create/models/block/packager/block_powered.json rename src/main/resources/assets/create/models/block/packager/{block_regular_vertical.json => block_vertical.json} (100%) create mode 100644 src/main/resources/assets/create/models/block/packager/block_vertical_powered.json rename src/main/resources/assets/create/models/block/packager/{tray_regular.json => tray.json} (100%) rename src/main/resources/assets/create/models/block/{packager/block_defrag.json => repackager/block.json} (70%) create mode 100644 src/main/resources/assets/create/models/block/repackager/block_powered.json rename src/main/resources/assets/create/models/block/{packager/block_defrag_vertical.json => repackager/block_vertical.json} (66%) create mode 100644 src/main/resources/assets/create/models/block/repackager/block_vertical_powered.json create mode 100644 src/main/resources/assets/create/models/block/repackager/item.json rename src/main/resources/assets/create/models/block/{packager/tray_defrag.json => repackager/tray.json} (57%) create mode 100644 src/main/resources/assets/create/textures/block/packager_block_defrag_powered.png create mode 100644 src/main/resources/assets/create/textures/block/packager_block_powered.png diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 950b672860..0b5644fd5d 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-11-25T18:00:08.2851015 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-11-26T21:37:36.7230879 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -383,7 +383,7 @@ ac536ae742c12e97bfd0b2483c87ff29f3935eaf assets/create/blockstates/oxidized_copp 110a6c19bcc9f044e5e982ac6e4b295b03ec0145 assets/create/blockstates/oxidized_copper_tiles.json 3f3924f0f0e368edfa04f4fdd6d6c2319276ddfe assets/create/blockstates/oxidized_copper_tile_slab.json 5e634cfb9abb06d8b29f39d751fc56b28ea5a9cd assets/create/blockstates/oxidized_copper_tile_stairs.json -ef3af446b56c69e71a156d5998d9dc8e6d9ea4f5 assets/create/blockstates/packager.json +f32b0a23c1aed1c92684146e9746851091872519 assets/create/blockstates/packager.json 887565a0f89f089d6be888c87394dde4878afda7 assets/create/blockstates/package_frogport.json 36742cc6ce052ead143366d31b11e828a525c1b8 assets/create/blockstates/peculiar_bell.json 53d102e706d53cb2c0dbc0bc11da828084a43519 assets/create/blockstates/pink_nixie_tube.json @@ -481,6 +481,7 @@ e003cc60f957419c178d5b4ee215485ebeb3191f assets/create/blockstates/red_postbox.j 380f46b7cb72b13c0f16fd4a4287a1a33adeff41 assets/create/blockstates/red_toolbox.json b689d87a27ed0cb2cab190a2ad2b599818bff56c assets/create/blockstates/red_valve_handle.json 87ab7ca62ecf24d60d7e5c61bd5af97714dad0ad assets/create/blockstates/refined_radiance_casing.json +64a5b256e5af2dc8cb7ed77f0feadcf5134f7335 assets/create/blockstates/repackager.json 3807bcc6ccc3dad0dbfcc8fcf260a361aa488659 assets/create/blockstates/rope.json baa7da231c6c45d5eabaf04985d46e206a3346f8 assets/create/blockstates/rope_pulley.json a8b42f047fe9099f81334e2e1082067de67549db assets/create/blockstates/rose_quartz_block.json @@ -638,8 +639,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -553a69a3cfe418452f126632905c039e89d3f47a assets/create/lang/en_ud.json -084c76dda84efc8a2a4c82615a0e411444e53afc assets/create/lang/en_us.json +cad795752419b1047d2dcd4507c6c4914643aa7d assets/create/lang/en_ud.json +86a26f6cc4518dcb602e445b9e3719531b89e315 assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -2309,6 +2310,7 @@ ac4695cc465d094b4adba1a4e9efec42c916f37d assets/create/models/item/red_toolbox.j 02473f42ef4b53dc809c7c58ae657c014bfaf652 assets/create/models/item/red_valve_handle.json 9926bbe6dad7c4c1a146492116d232e941c80d2b assets/create/models/item/refined_radiance.json bf827486dc7a1b3aeae577844d2dab2a97051db9 assets/create/models/item/refined_radiance_casing.json +a982c29763d90556cca03074c168462a52cb9526 assets/create/models/item/repackager.json 69dc8139280bce3a7e08532afbbc5c41e7942be1 assets/create/models/item/rope_pulley.json 7a93e1b9557422f6b5dfc17e44524805ec4575c6 assets/create/models/item/rose_quartz.json bfbe599cada68962c66cbc6a3e88019fbd9cffd5 assets/create/models/item/rose_quartz_block.json @@ -3706,6 +3708,7 @@ f36f1e69e4fb8723238f81aadbac892f54b5ac62 data/create/loot_tables/blocks/red_post 9713071cab536e8c1550a6309dc4563fecc2c4e0 data/create/loot_tables/blocks/red_toolbox.json 17d75711f4ef5d76aa931175364642732fb0c60d data/create/loot_tables/blocks/red_valve_handle.json 632067fe6309e31e78637eb0272209b630750242 data/create/loot_tables/blocks/refined_radiance_casing.json +ee2c4d66d1264ec613e9e84fcac814d2f5806258 data/create/loot_tables/blocks/repackager.json 354a3b6c73379b7100b0dd12b3f3b008830c4d2d data/create/loot_tables/blocks/rope.json f74fdd78961619d712891c36e0a0778c25e145dc data/create/loot_tables/blocks/rope_pulley.json 77d2da2217689608095866de4af4b41104348354 data/create/loot_tables/blocks/rose_quartz_block.json @@ -4738,7 +4741,7 @@ c741ba83b562ae3459d7c4f2db69537f549ea411 data/forge/tags/items/tools/wrench.json 4fffa6fa3be0722121611a1c1393e39cc5281b24 data/minecraft/tags/blocks/impermeable.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/lush_ground_replaceable.json 632b3589bae819777af7129b534f1c10e810cf5d data/minecraft/tags/blocks/mineable/axe.json -276f0a42a366034f24acce80a93b5981c6ec46d1 data/minecraft/tags/blocks/mineable/pickaxe.json +b57faf9231efb408e49810b962cccb10566e1f05 data/minecraft/tags/blocks/mineable/pickaxe.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/moss_replaceable.json 0c13aae0eeb99e89febe8dbe5e002af2ff843a9e data/minecraft/tags/blocks/needs_iron_tool.json 3cb2a92cbdf32ed5978f740dc378d363306c3e84 data/minecraft/tags/blocks/needs_stone_tool.json diff --git a/src/generated/resources/assets/create/blockstates/packager.json b/src/generated/resources/assets/create/blockstates/packager.json index 6111c70071..c0a70c4ad3 100644 --- a/src/generated/resources/assets/create/blockstates/packager.json +++ b/src/generated/resources/assets/create/blockstates/packager.json @@ -1,87 +1,45 @@ { "variants": { - "facing=down,powered=false,type=defrag": { - "model": "create:block/packager/block_defrag_vertical" + "facing=down,powered=false": { + "model": "create:block/packager/block_vertical" }, - "facing=down,powered=false,type=regular": { - "model": "create:block/packager/block_regular_vertical" + "facing=down,powered=true": { + "model": "create:block/packager/block_vertical_powered" }, - "facing=down,powered=true,type=defrag": { - "model": "create:block/packager/block_defrag_vertical" - }, - "facing=down,powered=true,type=regular": { - "model": "create:block/packager/block_regular_vertical" - }, - "facing=east,powered=false,type=defrag": { - "model": "create:block/packager/block_defrag", + "facing=east,powered=false": { + "model": "create:block/packager/block", "y": 270 }, - "facing=east,powered=false,type=regular": { - "model": "create:block/packager/block_regular", + "facing=east,powered=true": { + "model": "create:block/packager/block_powered", "y": 270 }, - "facing=east,powered=true,type=defrag": { - "model": "create:block/packager/block_defrag", - "y": 270 - }, - "facing=east,powered=true,type=regular": { - "model": "create:block/packager/block_regular", - "y": 270 - }, - "facing=north,powered=false,type=defrag": { - "model": "create:block/packager/block_defrag", + "facing=north,powered=false": { + "model": "create:block/packager/block", "y": 180 }, - "facing=north,powered=false,type=regular": { - "model": "create:block/packager/block_regular", + "facing=north,powered=true": { + "model": "create:block/packager/block_powered", "y": 180 }, - "facing=north,powered=true,type=defrag": { - "model": "create:block/packager/block_defrag", - "y": 180 + "facing=south,powered=false": { + "model": "create:block/packager/block" }, - "facing=north,powered=true,type=regular": { - "model": "create:block/packager/block_regular", - "y": 180 + "facing=south,powered=true": { + "model": "create:block/packager/block_powered" }, - "facing=south,powered=false,type=defrag": { - "model": "create:block/packager/block_defrag" + "facing=up,powered=false": { + "model": "create:block/packager/block_vertical" }, - "facing=south,powered=false,type=regular": { - "model": "create:block/packager/block_regular" + "facing=up,powered=true": { + "model": "create:block/packager/block_vertical_powered" }, - "facing=south,powered=true,type=defrag": { - "model": "create:block/packager/block_defrag" - }, - "facing=south,powered=true,type=regular": { - "model": "create:block/packager/block_regular" - }, - "facing=up,powered=false,type=defrag": { - "model": "create:block/packager/block_defrag_vertical" - }, - "facing=up,powered=false,type=regular": { - "model": "create:block/packager/block_regular_vertical" - }, - "facing=up,powered=true,type=defrag": { - "model": "create:block/packager/block_defrag_vertical" - }, - "facing=up,powered=true,type=regular": { - "model": "create:block/packager/block_regular_vertical" - }, - "facing=west,powered=false,type=defrag": { - "model": "create:block/packager/block_defrag", + "facing=west,powered=false": { + "model": "create:block/packager/block", "y": 90 }, - "facing=west,powered=false,type=regular": { - "model": "create:block/packager/block_regular", - "y": 90 - }, - "facing=west,powered=true,type=defrag": { - "model": "create:block/packager/block_defrag", - "y": 90 - }, - "facing=west,powered=true,type=regular": { - "model": "create:block/packager/block_regular", + "facing=west,powered=true": { + "model": "create:block/packager/block_powered", "y": 90 } } diff --git a/src/generated/resources/assets/create/blockstates/repackager.json b/src/generated/resources/assets/create/blockstates/repackager.json new file mode 100644 index 0000000000..dcd004db3c --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/repackager.json @@ -0,0 +1,46 @@ +{ + "variants": { + "facing=down,powered=false": { + "model": "create:block/repackager/block_vertical" + }, + "facing=down,powered=true": { + "model": "create:block/repackager/block_vertical_powered" + }, + "facing=east,powered=false": { + "model": "create:block/repackager/block", + "y": 270 + }, + "facing=east,powered=true": { + "model": "create:block/repackager/block_powered", + "y": 270 + }, + "facing=north,powered=false": { + "model": "create:block/repackager/block", + "y": 180 + }, + "facing=north,powered=true": { + "model": "create:block/repackager/block_powered", + "y": 180 + }, + "facing=south,powered=false": { + "model": "create:block/repackager/block" + }, + "facing=south,powered=true": { + "model": "create:block/repackager/block_powered" + }, + "facing=up,powered=false": { + "model": "create:block/repackager/block_vertical" + }, + "facing=up,powered=true": { + "model": "create:block/repackager/block_vertical_powered" + }, + "facing=west,powered=false": { + "model": "create:block/repackager/block", + "y": 90 + }, + "facing=west,powered=true": { + "model": "create:block/repackager/block_powered", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 86b1eb8c30..1910479e0d 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -718,6 +718,7 @@ "block.create.redstone_requester": "ɹǝʇsǝnbǝᴚ ǝuoʇspǝᴚ", "block.create.redstone_requester.tooltip.summary": "˙ʇuǝɯǝɔɐןd ǝɹoɟǝq ɹǝdǝǝʞ ʞɔoʇs ɐ ʇɐ pǝɹnbıɟuoɔ ǝq uɐɔ ʇsǝnbǝɹ sıɥʇ ʎןǝʌıʇɐuɹǝʇןⱯ ˙pǝʌıǝɔǝɹ sı ǝsןnd ǝuoʇspǝɹ ɐ uǝɥʍ ssǝɹppɐ uɐ oʇ pǝʇsǝnbǝɹ sɯǝʇı ʎɟıɔǝds oʇ I∩ uǝdO ˙ʎɔuǝnbǝɹɟ sʇı ǝsn oʇ ʇuǝɯǝɔɐןd ǝɹoɟǝq ʞuıן ʞɔoʇs ʞɔıןƆ ]ɹǝpuod[", "block.create.refined_radiance_casing": "buısɐƆ ʇuɐıpɐᴚ", + "block.create.repackager": "ɹǝbɐʞɔɐԀ-ǝᴚ", "block.create.rope": "ǝdoᴚ", "block.create.rope_pulley": "ʎǝןןnԀ ǝdoᴚ", "block.create.rose_quartz_block": "zʇɹɐnὉ ǝsoᴚ ɟo ʞɔoןᗺ", @@ -1351,6 +1352,8 @@ "create.gui.stock_ticker.delete_category": "ʎɹobǝʇɐƆ ǝʇǝןǝᗡ", "create.gui.stock_ticker.empty_category_name_placeholder": ")ʎʇdɯƎ(", "create.gui.stock_ticker.new_category": "ʎɹobǝʇɐƆ ʍǝN", + "create.gui.stock_ticker.shift_moves_bottom": "ɯoʇʇoq oʇ sǝʌoɯ ʇɟıɥS", + "create.gui.stock_ticker.shift_moves_top": "doʇ oʇ sǝʌoɯ ʇɟıɥS", "create.gui.stressometer.capacity": "ʎʇıɔɐdɐƆ buıuıɐɯǝᴚ", "create.gui.stressometer.no_rotation": "uoıʇɐʇoᴚ oN", "create.gui.stressometer.overstressed": "pǝssǝɹʇsɹǝʌO", @@ -1552,8 +1555,6 @@ "create.package_port.cannot_reach_down": "pɹɐʍuʍop ʇɔǝuuoɔ ʇouuɐƆ", "create.package_port.too_far": "ʎɐʍɐ ɹɐɟ oo⟘", "create.package_port.valid": "✔ ʇɔǝuuoƆ uɐƆ", - "create.packager.mode_change.defrag": "pǝʇǝןdɯoɔ ʇndʇno puɐ sʇuǝɯbɐɹɟ ʇɔǝןןoƆ >-", - "create.packager.mode_change.regular": "sɯǝʇı xoqun puɐ ǝbɐʞɔɐԀ >-", "create.packager_link.clear": "uoıʇɔǝןǝs pǝɹɐǝןƆ", "create.packager_link.set": "pǝʇɔǝןǝs ʇǝbɹɐ⟘", "create.packager_link.success": "ʇǝbɹɐʇ oʇ punoq ʎןןnɟssǝɔɔnS", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 551a28dcdb..44aa80825d 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -718,6 +718,7 @@ "block.create.redstone_requester": "Redstone Requester", "block.create.redstone_requester.tooltip.summary": "[ponder] Click stock link before placement to use its frequency. Open UI to specify items requested to an address when a redstone pulse is received. Alternatively this request can be configured at a stock keeper before placement.", "block.create.refined_radiance_casing": "Radiant Casing", + "block.create.repackager": "Re-Packager", "block.create.rope": "Rope", "block.create.rope_pulley": "Rope Pulley", "block.create.rose_quartz_block": "Block of Rose Quartz", @@ -1351,6 +1352,8 @@ "create.gui.stock_ticker.delete_category": "Delete Category", "create.gui.stock_ticker.empty_category_name_placeholder": "(Empty)", "create.gui.stock_ticker.new_category": "New Category", + "create.gui.stock_ticker.shift_moves_bottom": "Shift moves to bottom", + "create.gui.stock_ticker.shift_moves_top": "Shift moves to top", "create.gui.stressometer.capacity": "Remaining Capacity", "create.gui.stressometer.no_rotation": "No Rotation", "create.gui.stressometer.overstressed": "Overstressed", @@ -1552,8 +1555,6 @@ "create.package_port.cannot_reach_down": "Cannot connect downward", "create.package_port.too_far": "Too far away", "create.package_port.valid": "Can Connect ✔", - "create.packager.mode_change.defrag": "-> Collect fragments and output completed", - "create.packager.mode_change.regular": "-> Package and unbox items", "create.packager_link.clear": "Cleared selection", "create.packager_link.set": "Target selected", "create.packager_link.success": "Successfully bound to target", diff --git a/src/generated/resources/assets/create/models/item/repackager.json b/src/generated/resources/assets/create/models/item/repackager.json new file mode 100644 index 0000000000..a4acf1aa3a --- /dev/null +++ b/src/generated/resources/assets/create/models/item/repackager.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/repackager/item" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/repackager.json b/src/generated/resources/data/create/loot_tables/blocks/repackager.json new file mode 100644 index 0000000000..b541c71ed8 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/repackager.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:repackager" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/repackager" +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json index f37e5e2b7c..885596fd88 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json @@ -133,6 +133,7 @@ "create:item_vault", "create:item_hatch", "create:packager", + "create:repackager", "create:package_frogport", "create:stock_link", "create:stock_ticker", diff --git a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java index 432a3c7a9b..5d63d1e5fa 100644 --- a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java +++ b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java @@ -182,6 +182,7 @@ import com.simibubi.create.content.logistics.packagePort.postbox.PostboxBlockEnt import com.simibubi.create.content.logistics.packagePort.postbox.PostboxRenderer; import com.simibubi.create.content.logistics.packager.PackagerBlockEntity; import com.simibubi.create.content.logistics.packager.PackagerRenderer; +import com.simibubi.create.content.logistics.packager.repackager.RepackagerBlockEntity; import com.simibubi.create.content.logistics.packagerLink.PackagerLinkBlockEntity; import com.simibubi.create.content.logistics.redstoneRequester.RedstoneRequesterBlockEntity; import com.simibubi.create.content.logistics.stockTicker.StockTickerBlockEntity; @@ -505,6 +506,12 @@ public class AllBlockEntityTypes { .validBlocks(AllBlocks.PACKAGER) .renderer(() -> PackagerRenderer::new) .register(); + + public static final BlockEntityEntry REPACKAGER = REGISTRATE + .blockEntity("repackager", RepackagerBlockEntity::new) + .validBlocks(AllBlocks.REPACKAGER) + .renderer(() -> PackagerRenderer::new) + .register(); public static final BlockEntityEntry PACKAGE_FROGPORT = REGISTRATE .blockEntity("package_frogport", FrogportBlockEntity::new) diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 242c58bf98..907cebb6ee 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -184,6 +184,7 @@ import com.simibubi.create.content.logistics.packagePort.frogport.FrogportBlock; import com.simibubi.create.content.logistics.packagePort.postbox.PostboxBlock; import com.simibubi.create.content.logistics.packager.PackagerBlock; import com.simibubi.create.content.logistics.packager.PackagerGenerator; +import com.simibubi.create.content.logistics.packager.repackager.RepackagerBlock; import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedBlockItem; import com.simibubi.create.content.logistics.packagerLink.PackagerLinkBlock; import com.simibubi.create.content.logistics.redstoneRequester.RedstoneRequesterBlock; @@ -1839,18 +1840,12 @@ public class AllBlocks { .register(); public static final BlockEntry PACKAGER = REGISTRATE.block("packager", PackagerBlock::new) - .initialProperties(SharedProperties::softMetal) - .properties(p -> p.noOcclusion()) - .properties(p -> p.isRedstoneConductor(($1, $2, $3) -> false)) - .properties(p -> p.mapColor(MapColor.TERRACOTTA_BLUE) - .sound(SoundType.NETHERITE_BLOCK)) - .transform(pickaxeOnly()) - .addLayer(() -> RenderType::cutoutMipped) - .blockstate(new PackagerGenerator()::generate) - .transform(BlockStressDefaults.setImpact(1.0)) - .item() - .model(AssetLookup::customItemModel) - .build() + .transform(BuilderTransformers.packager()) + .register(); + + public static final BlockEntry REPACKAGER = REGISTRATE.block("repackager", RepackagerBlock::new) + .transform(BuilderTransformers.packager()) + .lang("Re-Packager") .register(); public static final BlockEntry PACKAGE_FROGPORT = diff --git a/src/main/java/com/simibubi/create/AllPartialModels.java b/src/main/java/com/simibubi/create/AllPartialModels.java index 2ce86166a0..edb83b22f9 100644 --- a/src/main/java/com/simibubi/create/AllPartialModels.java +++ b/src/main/java/com/simibubi/create/AllPartialModels.java @@ -123,7 +123,7 @@ public class AllPartialModels { FROGPORT_TONGUE = block("package_frogport/tongue"), POSTBOX_FLAG = block("package_postbox/flag"), - PACKAGER_TRAY_REGULAR = block("packager/tray_regular"), PACKAGER_TRAY_DEFRAG = block("packager/tray_defrag"), + PACKAGER_TRAY_REGULAR = block("packager/tray"), PACKAGER_TRAY_DEFRAG = block("repackager/tray"), PACKAGER_HATCH_OPEN = block("packager/hatch_open"), PACKAGER_HATCH_CLOSED = block("packager/hatch_closed"), COPPER_BACKTANK_SHAFT = block("copper_backtank/block_shaft_input"), diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java index ad4b6bcc47..70829ea56b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java @@ -9,6 +9,7 @@ import javax.annotation.Nullable; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBlock.PanelSlot; import com.simibubi.create.content.logistics.packager.PackagerBlockEntity; +import com.simibubi.create.content.logistics.packager.repackager.RepackagerBlockEntity; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; @@ -86,6 +87,8 @@ public class FactoryPanelBlockEntity extends SmartBlockEntity { BlockEntity be = level.getBlockEntity(packagerPos); if (be == null || !(be instanceof PackagerBlockEntity pbe)) return null; + if (pbe instanceof RepackagerBlockEntity) + return null; return pbe; } diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java index 9a1e6a361d..4e11447ee7 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java @@ -7,18 +7,14 @@ import com.simibubi.create.content.equipment.wrench.IWrenchable; import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.foundation.block.IBE; import com.simibubi.create.foundation.block.WrenchableDirectionalBlock; -import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.lang.Lang; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.util.StringRepresentable; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.BlockPlaceContext; -import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.SignalGetter; @@ -29,7 +25,6 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition.Builder; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.block.state.properties.BooleanProperty; -import net.minecraft.world.level.block.state.properties.EnumProperty; import net.minecraft.world.phys.BlockHitResult; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.ForgeCapabilities; @@ -37,22 +32,11 @@ import net.minecraftforge.items.IItemHandler; public class PackagerBlock extends WrenchableDirectionalBlock implements IBE, IWrenchable { - public static final EnumProperty TYPE = EnumProperty.create("type", PackagerType.class); public static final BooleanProperty POWERED = BlockStateProperties.POWERED; - public enum PackagerType implements StringRepresentable { - REGULAR, DEFRAG; - - @Override - public String getSerializedName() { - return Lang.asId(name()); - } - } - public PackagerBlock(Properties properties) { super(properties); - registerDefaultState(defaultBlockState().setValue(TYPE, PackagerType.REGULAR) - .setValue(POWERED, false)); + registerDefaultState(defaultBlockState().setValue(POWERED, false)); } @Override @@ -130,30 +114,7 @@ public class PackagerBlock extends WrenchableDirectionalBlock implements IBE builder) { - super.createBlockStateDefinition(builder.add(POWERED, TYPE)); - } - - @Override - public InteractionResult onWrenched(BlockState state, UseOnContext context) { - Level level = context.getLevel(); - BlockPos pos = context.getClickedPos(); - if (level.isClientSide) - return InteractionResult.SUCCESS; - - level.setBlockAndUpdate(pos, state.cycle(TYPE)); - - withBlockEntityDo(level, pos, pte -> { - Player player = context.getPlayer(); - PackagerType value = state.cycle(TYPE) - .getValue(TYPE); - pte.defragmenterActive = value == PackagerType.DEFRAG; - - if (player != null) - player.displayClientMessage( - CreateLang.translateDirect("packager.mode_change." + value.getSerializedName()), true); - }); - - return InteractionResult.SUCCESS; + super.createBlockStateDefinition(builder.add(POWERED)); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java index 200926c3b6..0faafecc9f 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java @@ -17,7 +17,6 @@ import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBehaviour; import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBlock; import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBlockEntity; import com.simibubi.create.content.logistics.packagePort.frogport.FrogportBlockEntity; -import com.simibubi.create.content.logistics.packager.PackagerBlock.PackagerType; import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedBehaviour.RequestType; import com.simibubi.create.content.logistics.packagerLink.PackagerLinkBlock; import com.simibubi.create.content.logistics.packagerLink.PackagerLinkBlockEntity; @@ -54,7 +53,6 @@ import net.minecraftforge.items.ItemStackHandler; public class PackagerBlockEntity extends SmartBlockEntity { - public boolean redstoneModeActive; public boolean redstonePowered; public String signBasedAddress; @@ -76,14 +74,10 @@ public class PackagerBlockEntity extends SmartBlockEntity { // - public boolean defragmenterActive; - public PackageDefragmenter defragmenter; - public PackagerBlockEntity(BlockEntityType typeIn, BlockPos pos, BlockState state) { super(typeIn, pos, state); redstonePowered = state.getOptionalValue(PackagerBlock.POWERED) .orElse(false); - redstoneModeActive = true; heldBox = ItemStack.EMPTY; previouslyUnwrapped = ItemStack.EMPTY; inventory = new PackagerItemHandler(this); @@ -92,9 +86,6 @@ public class PackagerBlockEntity extends SmartBlockEntity { animationInward = true; queuedExitingPackages = new LinkedList<>(); signBasedAddress = ""; - if (AllBlocks.PACKAGER.has(state)) - defragmenterActive = state.getValue(PackagerBlock.TYPE) == PackagerType.DEFRAG; - defragmenter = new PackageDefragmenter(); } @Override @@ -108,12 +99,6 @@ public class PackagerBlockEntity extends SmartBlockEntity { return target != null && !(target instanceof PortableStorageInterfaceBlockEntity); } - @Override - public void initialize() { - super.initialize(); - recheckIfLinksPresent(); - } - @Override public void tick() { super.tick(); @@ -225,9 +210,6 @@ public class PackagerBlockEntity extends SmartBlockEntity { .orElse(false); if (!redstonePowered) return; - recheckIfLinksPresent(); - if (!redstoneModeActive) - return; updateSignAddress(); attemptToSend(null); } @@ -241,28 +223,9 @@ public class PackagerBlockEntity extends SmartBlockEntity { }; } - public void recheckIfLinksPresent() { - redstoneModeActive = true; - if (defragmenterActive) - return; - for (Direction d : Iterate.directions) { - BlockState adjacentState = level.getBlockState(worldPosition.relative(d)); - if (!AllBlocks.STOCK_LINK.has(adjacentState)) - continue; - if (adjacentState.getValue(PackagerLinkBlock.FACING) != d) - continue; - redstoneModeActive = false; - return; - } - } - public void activate() { redstonePowered = true; setChanged(); - - recheckIfLinksPresent(); - if (!redstoneModeActive) - return; updateSignAddress(); attemptToSend(null); } @@ -285,77 +248,61 @@ public class PackagerBlockEntity extends SmartBlockEntity { boolean targetIsCreativeCrate = targetInv instanceof BottomlessItemHandler; boolean targetIsCrafter = targetBE instanceof MechanicalCrafterBlockEntity; - if (defragmenterActive) { - boolean anySpace = false; - for (int slot = 0; slot < targetInv.getSlots(); slot++) { - ItemStack remainder = targetInv.insertItem(slot, box, simulate); - if (!remainder.isEmpty()) - continue; - anySpace = true; - break; - } + for (int slot = 0; slot < targetInv.getSlots(); slot++) { + ItemStack itemInSlot = targetInv.getStackInSlot(slot); + int itemsAddedToSlot = 0; - if (!targetIsCreativeCrate && !anySpace) - return false; - } + for (int boxSlot = 0; boxSlot < contents.getSlots(); boxSlot++) { + ItemStack toInsert = contents.getStackInSlot(boxSlot); - if (!defragmenterActive) { - for (int slot = 0; slot < targetInv.getSlots(); slot++) { - ItemStack itemInSlot = targetInv.getStackInSlot(slot); - int itemsAddedToSlot = 0; - - for (int boxSlot = 0; boxSlot < contents.getSlots(); boxSlot++) { - ItemStack toInsert = contents.getStackInSlot(boxSlot); - - // Follow crafting arrangement - if (targetIsCrafter && orderContext != null && orderContext.stacks() - .size() > slot) { - BigItemStack targetStack = orderContext.stacks() - .get(slot); - if (targetStack.stack.isEmpty()) - break; - if (!ItemHandlerHelper.canItemStacksStack(toInsert, targetStack.stack)) - continue; - } - - if (targetInv.insertItem(slot, toInsert, true) - .getCount() == toInsert.getCount()) + // Follow crafting arrangement + if (targetIsCrafter && orderContext != null && orderContext.stacks() + .size() > slot) { + BigItemStack targetStack = orderContext.stacks() + .get(slot); + if (targetStack.stack.isEmpty()) + break; + if (!ItemHandlerHelper.canItemStacksStack(toInsert, targetStack.stack)) continue; - if (itemInSlot.isEmpty()) { - int maxStackSize = targetInv.getSlotLimit(slot); - if (maxStackSize < toInsert.getCount()) { - toInsert.shrink(maxStackSize); - toInsert = ItemHandlerHelper.copyStackWithSize(toInsert, maxStackSize); - } else - contents.setStackInSlot(boxSlot, ItemStack.EMPTY); - itemInSlot = toInsert; - targetInv.insertItem(slot, toInsert, simulate); - itemsAddedToSlot += toInsert.getCount(); - continue; - } - if (!ItemHandlerHelper.canItemStacksStack(toInsert, itemInSlot)) - continue; - - int insertedAmount = toInsert.getCount() - targetInv.insertItem(slot, toInsert, simulate) - .getCount(); - int slotLimit = (int) ((targetInv.getStackInSlot(slot) - .isEmpty() ? itemInSlot.getMaxStackSize() / 64f : 1) * targetInv.getSlotLimit(slot)); - int insertableAmountWithPreviousItems = - Math.min(toInsert.getCount(), slotLimit - itemInSlot.getCount() - itemsAddedToSlot); - - int added = Math.min(insertedAmount, Math.max(0, insertableAmountWithPreviousItems)); - contents.setStackInSlot(boxSlot, - ItemHandlerHelper.copyStackWithSize(toInsert, toInsert.getCount() - added)); } - } - if (!targetIsCreativeCrate) - for (int boxSlot = 0; boxSlot < contents.getSlots(); boxSlot++) - if (!contents.getStackInSlot(boxSlot) - .isEmpty()) - return false; + if (targetInv.insertItem(slot, toInsert, true) + .getCount() == toInsert.getCount()) + continue; + if (itemInSlot.isEmpty()) { + int maxStackSize = targetInv.getSlotLimit(slot); + if (maxStackSize < toInsert.getCount()) { + toInsert.shrink(maxStackSize); + toInsert = ItemHandlerHelper.copyStackWithSize(toInsert, maxStackSize); + } else + contents.setStackInSlot(boxSlot, ItemStack.EMPTY); + itemInSlot = toInsert; + targetInv.insertItem(slot, toInsert, simulate); + itemsAddedToSlot += toInsert.getCount(); + continue; + } + if (!ItemHandlerHelper.canItemStacksStack(toInsert, itemInSlot)) + continue; + + int insertedAmount = toInsert.getCount() - targetInv.insertItem(slot, toInsert, simulate) + .getCount(); + int slotLimit = (int) ((targetInv.getStackInSlot(slot) + .isEmpty() ? itemInSlot.getMaxStackSize() / 64f : 1) * targetInv.getSlotLimit(slot)); + int insertableAmountWithPreviousItems = + Math.min(toInsert.getCount(), slotLimit - itemInSlot.getCount() - itemsAddedToSlot); + + int added = Math.min(insertedAmount, Math.max(0, insertableAmountWithPreviousItems)); + contents.setStackInSlot(boxSlot, + ItemHandlerHelper.copyStackWithSize(toInsert, toInsert.getCount() - added)); + } } + if (!targetIsCreativeCrate) + for (int boxSlot = 0; boxSlot < contents.getSlots(); boxSlot++) + if (!contents.getStackInSlot(boxSlot) + .isEmpty()) + return false; + if (simulate) return true; @@ -377,11 +324,6 @@ public class PackagerBlockEntity extends SmartBlockEntity { if (targetInv == null || targetInv instanceof PackagerItemHandler) return; - if (defragmenterActive) { - attemptToDefrag(targetInv); - return; - } - boolean anyItemPresent = false; ItemStackHandler extractedItems = new ItemStackHandler(PackageItem.SLOTS); ItemStack extractedPackageItem = ItemStack.EMPTY; @@ -512,57 +454,6 @@ public class PackagerBlockEntity extends SmartBlockEntity { notifyUpdate(); } - protected void attemptToDefrag(IItemHandler targetInv) { - defragmenter.clear(); - int completedOrderId = -1; - - for (int slot = 0; slot < targetInv.getSlots(); slot++) { - ItemStack extracted = targetInv.extractItem(slot, 1, true); - if (extracted.isEmpty() || !PackageItem.isPackage(extracted)) - continue; - - if (!defragmenter.isFragmented(extracted)) { - targetInv.extractItem(slot, 1, false); - heldBox = extracted.copy(); - animationInward = false; - animationTicks = CYCLE; - notifyUpdate(); - return; - } - - completedOrderId = defragmenter.addPackageFragment(extracted); - if (completedOrderId != -1) - break; - } - - if (completedOrderId == -1) - return; - - List boxesToExport = defragmenter.repack(completedOrderId); - - for (int slot = 0; slot < targetInv.getSlots(); slot++) { - ItemStack extracted = targetInv.extractItem(slot, 1, true); - if (extracted.isEmpty() || !PackageItem.isPackage(extracted)) - continue; - if (PackageItem.getOrderId(extracted) != completedOrderId) - continue; - targetInv.extractItem(slot, 1, false); - } - - if (boxesToExport.isEmpty()) - return; - - heldBox = boxesToExport.get(0) - .copy(); - animationInward = false; - animationTicks = CYCLE; - - for (int i = 1; i < boxesToExport.size(); i++) - ItemHandlerHelper.insertItem(targetInv, boxesToExport.get(i), false); - - notifyUpdate(); - } - protected void updateSignAddress() { signBasedAddress = ""; for (Direction side : Iterate.directions) { @@ -602,7 +493,6 @@ public class PackagerBlockEntity extends SmartBlockEntity { signBasedAddress = compound.getString("SignAddress"); heldBox = ItemStack.of(compound.getCompound("HeldBox")); previouslyUnwrapped = ItemStack.of(compound.getCompound("InsertedBox")); - defragmenterActive = compound.getBoolean("Defrag"); if (clientPacket) return; queuedExitingPackages = NBTHelper.readItemList(compound.getList("QueuedPackages", Tag.TAG_COMPOUND)); @@ -619,7 +509,6 @@ public class PackagerBlockEntity extends SmartBlockEntity { compound.putString("SignAddress", signBasedAddress); compound.put("HeldBox", heldBox.serializeNBT()); compound.put("InsertedBox", previouslyUnwrapped.serializeNBT()); - compound.putBoolean("Defrag", defragmenterActive); if (clientPacket) return; compound.put("QueuedPackages", NBTHelper.writeItemList(queuedExitingPackages)); diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerGenerator.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerGenerator.java index 13d1b9c2c0..878a600b0a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerGenerator.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerGenerator.java @@ -25,11 +25,10 @@ public class PackagerGenerator extends SpecialBlockStateGen { @Override public ModelFile getModel(DataGenContext ctx, RegistrateBlockstateProvider prov, BlockState state) { - String type = state.getValue(PackagerBlock.TYPE) - .getSerializedName(); + String suffix = state.getValue(PackagerBlock.POWERED) ? "powered" : ""; return state.getValue(PackagerBlock.FACING) - .getAxis() == Axis.Y ? AssetLookup.partialBaseModel(ctx, prov, type, "vertical") - : AssetLookup.partialBaseModel(ctx, prov, type); + .getAxis() == Axis.Y ? AssetLookup.partialBaseModel(ctx, prov, "vertical", suffix) + : AssetLookup.partialBaseModel(ctx, prov, suffix); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerRenderer.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerRenderer.java index f5b4672e97..af93d76a80 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerRenderer.java @@ -1,8 +1,8 @@ package com.simibubi.create.content.logistics.packager; import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.AllBlocks; import com.simibubi.create.AllPartialModels; -import com.simibubi.create.content.logistics.packager.PackagerBlock.PackagerType; import com.simibubi.create.foundation.blockEntity.renderer.SmartBlockEntityRenderer; import dev.engine_room.flywheel.lib.model.baked.PartialModel; @@ -54,10 +54,8 @@ public class PackagerRenderer extends SmartBlockEntityRenderer getBlockEntityType() { + return AllBlockEntityTypes.REPACKAGER.get(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/repackager/RepackagerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packager/repackager/RepackagerBlockEntity.java new file mode 100644 index 0000000000..e937474577 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/packager/repackager/RepackagerBlockEntity.java @@ -0,0 +1,121 @@ +package com.simibubi.create.content.logistics.packager.repackager; + +import java.util.List; + +import com.simibubi.create.content.logistics.box.PackageItem; +import com.simibubi.create.content.logistics.crate.BottomlessItemHandler; +import com.simibubi.create.content.logistics.packager.PackageDefragmenter; +import com.simibubi.create.content.logistics.packager.PackagerBlockEntity; +import com.simibubi.create.content.logistics.packager.PackagerItemHandler; +import com.simibubi.create.content.logistics.packager.PackagingRequest; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.ItemHandlerHelper; + +public class RepackagerBlockEntity extends PackagerBlockEntity { + + public PackageDefragmenter defragmenter; + + public RepackagerBlockEntity(BlockEntityType typeIn, BlockPos pos, BlockState state) { + super(typeIn, pos, state); + defragmenter = new PackageDefragmenter(); + } + + public boolean unwrapBox(ItemStack box, boolean simulate) { + if (animationTicks > 0) + return false; + + IItemHandler targetInv = targetInventory.getInventory(); + if (targetInv == null) + return false; + + boolean targetIsCreativeCrate = targetInv instanceof BottomlessItemHandler; + boolean anySpace = false; + + for (int slot = 0; slot < targetInv.getSlots(); slot++) { + ItemStack remainder = targetInv.insertItem(slot, box, simulate); + if (!remainder.isEmpty()) + continue; + anySpace = true; + break; + } + + if (!targetIsCreativeCrate && !anySpace) + return false; + if (simulate) + return true; + + previouslyUnwrapped = box; + animationInward = true; + animationTicks = CYCLE; + notifyUpdate(); + return true; + } + + public void attemptToSend(List queuedRequests) { + if (queuedRequests == null && (!heldBox.isEmpty() || animationTicks != 0)) + return; + + IItemHandler targetInv = targetInventory.getInventory(); + if (targetInv == null || targetInv instanceof PackagerItemHandler) + return; + + attemptToDefrag(targetInv); + } + + protected void attemptToDefrag(IItemHandler targetInv) { + defragmenter.clear(); + int completedOrderId = -1; + + for (int slot = 0; slot < targetInv.getSlots(); slot++) { + ItemStack extracted = targetInv.extractItem(slot, 1, true); + if (extracted.isEmpty() || !PackageItem.isPackage(extracted)) + continue; + + if (!defragmenter.isFragmented(extracted)) { + targetInv.extractItem(slot, 1, false); + heldBox = extracted.copy(); + animationInward = false; + animationTicks = CYCLE; + notifyUpdate(); + return; + } + + completedOrderId = defragmenter.addPackageFragment(extracted); + if (completedOrderId != -1) + break; + } + + if (completedOrderId == -1) + return; + + List boxesToExport = defragmenter.repack(completedOrderId); + + for (int slot = 0; slot < targetInv.getSlots(); slot++) { + ItemStack extracted = targetInv.extractItem(slot, 1, true); + if (extracted.isEmpty() || !PackageItem.isPackage(extracted)) + continue; + if (PackageItem.getOrderId(extracted) != completedOrderId) + continue; + targetInv.extractItem(slot, 1, false); + } + + if (boxesToExport.isEmpty()) + return; + + heldBox = boxesToExport.get(0) + .copy(); + animationInward = false; + animationTicks = CYCLE; + + for (int i = 1; i < boxesToExport.size(); i++) + ItemHandlerHelper.insertItem(targetInv, boxesToExport.get(i), false); + + notifyUpdate(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java index 0eccf7dd17..a3f247e86c 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java @@ -10,6 +10,7 @@ import org.apache.commons.lang3.mutable.MutableBoolean; import com.simibubi.create.content.logistics.packager.InventorySummary; import com.simibubi.create.content.logistics.packager.PackagerBlockEntity; import com.simibubi.create.content.logistics.packager.PackagingRequest; +import com.simibubi.create.content.logistics.packager.repackager.RepackagerBlockEntity; import com.simibubi.create.content.logistics.stockTicker.PackageOrder; import com.simibubi.create.content.redstone.displayLink.LinkWithBulbBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; @@ -36,7 +37,7 @@ public class PackagerLinkBlockEntity extends LinkWithBulbBlockEntity { public InventorySummary fetchSummaryFromPackager(@Nullable IItemHandler ignoredHandler) { PackagerBlockEntity packager = getPackager(); - if (packager == null || packager.defragmenterActive) + if (packager == null) return InventorySummary.EMPTY; if (packager.isTargetingSameInventory(ignoredHandler)) return InventorySummary.EMPTY; @@ -50,7 +51,7 @@ public class PackagerLinkBlockEntity extends LinkWithBulbBlockEntity { int linkIndex, MutableBoolean finalLink, int orderId, @Nullable PackageOrder orderContext, @Nullable IItemHandler ignoredHandler) { PackagerBlockEntity packager = getPackager(); - if (packager == null || packager.defragmenterActive) + if (packager == null) return null; if (packager.isTargetingSameInventory(ignoredHandler)) return null; @@ -90,9 +91,6 @@ public class PackagerLinkBlockEntity extends LinkWithBulbBlockEntity { public void initialize() { super.initialize(); behaviour.redstonePowerChanged(PackagerLinkBlock.getPower(getBlockState(), level, worldPosition)); - PackagerBlockEntity packager = getPackager(); - if (packager != null) - packager.recheckIfLinksPresent(); } @Nullable @@ -105,6 +103,8 @@ public class PackagerLinkBlockEntity extends LinkWithBulbBlockEntity { .getOpposite()); if (!(level.getBlockEntity(source) instanceof PackagerBlockEntity packager)) return null; + if (packager instanceof RepackagerBlockEntity) + return null; return packager; } diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryScreen.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryScreen.java index afcec1baa5..1406d206ef 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryScreen.java @@ -297,21 +297,31 @@ public class StockKeeperCategoryScreen extends AbstractSimiContainerScreen 158 && x < 170) { if (y > 2 && y <= 10 && i > 0) { - renderActionTooltip(graphics, ImmutableList.of(CreateLang.translateDirect("gui.schedule.move_up")), + renderActionTooltip(graphics, + ImmutableList.of(CreateLang.translateDirect("gui.schedule.move_up"), + CreateLang.translate("gui.stock_ticker.shift_moves_top") + .style(ChatFormatting.DARK_GRAY) + .style(ChatFormatting.ITALIC) + .component()), mx, my); if (click == 0) { entries.remove(entry); - entries.add(i - 1, entry); + entries.add(hasShiftDown() ? 0 : i - 1, entry); init(); } return true; } if (y > 10 && y <= 22 && i < entries.size() - 1) { renderActionTooltip(graphics, - ImmutableList.of(CreateLang.translateDirect("gui.schedule.move_down")), mx, my); + ImmutableList.of(CreateLang.translateDirect("gui.schedule.move_down"), + CreateLang.translate("gui.stock_ticker.shift_moves_bottom") + .style(ChatFormatting.DARK_GRAY) + .style(ChatFormatting.ITALIC) + .component()), + mx, my); if (click == 0) { entries.remove(entry); - entries.add(i + 1, entry); + entries.add(hasShiftDown() ? entries.size() : i + 1, entry); init(); } return true; diff --git a/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerVisual.java b/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerVisual.java index 3b6eca0380..63656ff96d 100644 --- a/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerVisual.java +++ b/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerVisual.java @@ -6,6 +6,7 @@ import org.jetbrains.annotations.Nullable; import com.simibubi.create.AllPartialModels; import com.simibubi.create.AllSpriteShifts; +import com.simibubi.create.content.processing.burner.BlazeBurnerBlock.HeatLevel; import com.simibubi.create.foundation.render.AllInstanceTypes; import dev.engine_room.flywheel.api.instance.Instance; diff --git a/src/main/java/com/simibubi/create/foundation/data/AssetLookup.java b/src/main/java/com/simibubi/create/foundation/data/AssetLookup.java index 4cbc165440..48c11a94ad 100644 --- a/src/main/java/com/simibubi/create/foundation/data/AssetLookup.java +++ b/src/main/java/com/simibubi/create/foundation/data/AssetLookup.java @@ -28,7 +28,8 @@ public class AssetLookup { String... suffix) { String string = "/block"; for (String suf : suffix) - string += "_" + suf; + if (!suf.isEmpty()) + string += "_" + suf; final String location = "block/" + ctx.getName() + string; return prov.models() .getExistingFile(prov.modLoc(location)); diff --git a/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java b/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java index 2d8cb6ef7c..da5aa61329 100644 --- a/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java +++ b/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java @@ -39,6 +39,7 @@ import com.simibubi.create.content.kinetics.simpleRelays.encased.EncasedShaftBlo import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.content.logistics.displayCloth.DisplayClothBlockItem; import com.simibubi.create.content.logistics.displayCloth.DisplayClothModel; +import com.simibubi.create.content.logistics.packager.PackagerGenerator; import com.simibubi.create.content.logistics.tunnel.BeltTunnelBlock; import com.simibubi.create.content.logistics.tunnel.BeltTunnelBlock.Shape; import com.simibubi.create.content.logistics.tunnel.BeltTunnelItem; @@ -509,4 +510,18 @@ public class BuilderTransformers { }; } + public static NonNullUnaryOperator> packager() { + return b -> b.initialProperties(SharedProperties::softMetal) + .properties(p -> p.noOcclusion()) + .properties(p -> p.isRedstoneConductor(($1, $2, $3) -> false)) + .properties(p -> p.mapColor(MapColor.TERRACOTTA_BLUE) + .sound(SoundType.NETHERITE_BLOCK)) + .transform(pickaxeOnly()) + .addLayer(() -> RenderType::cutoutMipped) + .blockstate(new PackagerGenerator()::generate) + .item() + .model(AssetLookup::customItemModel) + .build(); + } + } diff --git a/src/main/resources/assets/create/lang/default/interface.json b/src/main/resources/assets/create/lang/default/interface.json index 8fc0e3ccf5..63f8ae7a54 100644 --- a/src/main/resources/assets/create/lang/default/interface.json +++ b/src/main/resources/assets/create/lang/default/interface.json @@ -352,6 +352,8 @@ "create.stock_ticker.click_to_retrieve": "Click to retrieve", "create.gui.stock_ticker.category_editor": "Category Editor", + "create.gui.stock_ticker.shift_moves_top": "Shift moves to top", + "create.gui.stock_ticker.shift_moves_bottom": "Shift moves to bottom", "create.gui.stock_ticker.category_filter": "Category Filter", "create.gui.stock_ticker.category_filter_tip": "Place a List or Attribute Filter", "create.gui.stock_ticker.category_filter_tip_1": "to specify which items are included", @@ -1001,9 +1003,6 @@ "create.packager_link.success": "Successfully bound to target", "create.packager_link.clear": "Cleared selection", - "create.packager.mode_change.regular": "-> Package and unbox items", - "create.packager.mode_change.defrag": "-> Collect fragments and output completed", - "create.display_link.set": "Targeted position selected", "create.display_link.success": "Successfully bound to targeted position", "create.display_link.clear": "Cleared position selection", diff --git a/src/main/resources/assets/create/models/block/packager/block_regular.json b/src/main/resources/assets/create/models/block/packager/block.json similarity index 100% rename from src/main/resources/assets/create/models/block/packager/block_regular.json rename to src/main/resources/assets/create/models/block/packager/block.json diff --git a/src/main/resources/assets/create/models/block/packager/block_powered.json b/src/main/resources/assets/create/models/block/packager/block_powered.json new file mode 100644 index 0000000000..7feebe1734 --- /dev/null +++ b/src/main/resources/assets/create/models/block/packager/block_powered.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/packager/block", + "textures": { + "0": "create:block/packager_block_powered", + "particle": "create:block/packager_block_powered" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/packager/block_regular_vertical.json b/src/main/resources/assets/create/models/block/packager/block_vertical.json similarity index 100% rename from src/main/resources/assets/create/models/block/packager/block_regular_vertical.json rename to src/main/resources/assets/create/models/block/packager/block_vertical.json diff --git a/src/main/resources/assets/create/models/block/packager/block_vertical_powered.json b/src/main/resources/assets/create/models/block/packager/block_vertical_powered.json new file mode 100644 index 0000000000..9118c59d10 --- /dev/null +++ b/src/main/resources/assets/create/models/block/packager/block_vertical_powered.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/packager/block_vertical", + "textures": { + "0": "create:block/packager_block_powered", + "particle": "create:block/packager_block_powered" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/packager/tray_regular.json b/src/main/resources/assets/create/models/block/packager/tray.json similarity index 100% rename from src/main/resources/assets/create/models/block/packager/tray_regular.json rename to src/main/resources/assets/create/models/block/packager/tray.json diff --git a/src/main/resources/assets/create/models/block/packager/block_defrag.json b/src/main/resources/assets/create/models/block/repackager/block.json similarity index 70% rename from src/main/resources/assets/create/models/block/packager/block_defrag.json rename to src/main/resources/assets/create/models/block/repackager/block.json index 305cabc9e4..8ca39c1759 100644 --- a/src/main/resources/assets/create/models/block/packager/block_defrag.json +++ b/src/main/resources/assets/create/models/block/repackager/block.json @@ -1,5 +1,5 @@ { - "parent": "create:block/packager/block_regular", + "parent": "create:block/packager/block", "textures": { "0": "create:block/packager_block_defrag", "particle": "create:block/packager_block_defrag" diff --git a/src/main/resources/assets/create/models/block/repackager/block_powered.json b/src/main/resources/assets/create/models/block/repackager/block_powered.json new file mode 100644 index 0000000000..3909bd2381 --- /dev/null +++ b/src/main/resources/assets/create/models/block/repackager/block_powered.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/packager/block", + "textures": { + "0": "create:block/packager_block_defrag_powered", + "particle": "create:block/packager_block_defrag_powered" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/packager/block_defrag_vertical.json b/src/main/resources/assets/create/models/block/repackager/block_vertical.json similarity index 66% rename from src/main/resources/assets/create/models/block/packager/block_defrag_vertical.json rename to src/main/resources/assets/create/models/block/repackager/block_vertical.json index fc39fe031e..7153841ad2 100644 --- a/src/main/resources/assets/create/models/block/packager/block_defrag_vertical.json +++ b/src/main/resources/assets/create/models/block/repackager/block_vertical.json @@ -1,5 +1,5 @@ { - "parent": "create:block/packager/block_regular_vertical", + "parent": "create:block/packager/block_vertical", "textures": { "0": "create:block/packager_block_defrag", "particle": "create:block/packager_block_defrag" diff --git a/src/main/resources/assets/create/models/block/repackager/block_vertical_powered.json b/src/main/resources/assets/create/models/block/repackager/block_vertical_powered.json new file mode 100644 index 0000000000..da5df312ce --- /dev/null +++ b/src/main/resources/assets/create/models/block/repackager/block_vertical_powered.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/packager/block_vertical", + "textures": { + "0": "create:block/packager_block_defrag_powered", + "particle": "create:block/packager_block_defrag_powered" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/repackager/item.json b/src/main/resources/assets/create/models/block/repackager/item.json new file mode 100644 index 0000000000..562b192e82 --- /dev/null +++ b/src/main/resources/assets/create/models/block/repackager/item.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/packager/item", + "textures": { + "1": "create:block/packager_block_defrag", + "particle": "create:block/packager_block_defrag" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/packager/tray_defrag.json b/src/main/resources/assets/create/models/block/repackager/tray.json similarity index 57% rename from src/main/resources/assets/create/models/block/packager/tray_defrag.json rename to src/main/resources/assets/create/models/block/repackager/tray.json index 9f7cb24766..d32f72f9f1 100644 --- a/src/main/resources/assets/create/models/block/packager/tray_defrag.json +++ b/src/main/resources/assets/create/models/block/repackager/tray.json @@ -1,5 +1,5 @@ { - "parent": "create:block/packager/tray_regular", + "parent": "create:block/packager/tray", "textures": { "1": "create:block/packager_block_defrag" } diff --git a/src/main/resources/assets/create/models/entity/logistics_hat.json b/src/main/resources/assets/create/models/entity/logistics_hat.json index 2fc5062932..8e44bec7e2 100644 --- a/src/main/resources/assets/create/models/entity/logistics_hat.json +++ b/src/main/resources/assets/create/models/entity/logistics_hat.json @@ -1,5 +1,6 @@ { "parent": "create:entity/train_hat", + "render_type": "minecraft:cutout", "textures": { "0": "create:entity/logistics_hat", "particle": "create:entity/logistics_hat" diff --git a/src/main/resources/assets/create/textures/block/packager_block.png b/src/main/resources/assets/create/textures/block/packager_block.png index 01293aecb1cee668e34088632480e398bd1430e5..87b976180b2db74e780a915782443bd7983a541e 100644 GIT binary patch delta 493 zcmbOt^oMzZWIZzj1B1(wu46!ou{g-xiDBJ2nU_EgOS+@4BLl<6e(pbstU$hBfKQ04 zft7`$hf8pHU}k1gOH=v$*^~EdTc@pUXlvu);t}P>z~Iiv6v4>o&B$oYz+h@(YtF!s zo|qUJ5#jIeZ)9XO>_ z%)p?h1j3A~9^IV;bg`hPi(`m|f9piX@)iY-T%x9`uZ=sdZ z`JXwBD|vD_SMs3+0)iW6ippMDk-(fYd5iI!Du(TM-t}*P{`>Rey68KVS2#}Zs{_|=o&8ZSli-a)4(pF} zirU6`&d!n7zLlnOWJ>YMCv$#?2q+YY{ajW4EO%8vh5zob8>eFwMFqufx~4I%Iv}+m z-gMa+?}C-TqMn{_@NVsv)BAtu*@xgm&kQ6>?N6TE^efiq+T4oAz895GnpbezK3G;D R8w(6G22WQ%mvv4FO#r-O*FgXP literal 2324 zcmd^BjaL&_7Jnf@5D*Zm#ZQ73vDis7A4w)z6)}9JZ72%1_<=gfOg@l&Y%&rEttC*( za&{L`L>DX;YXKKlP(fH^rN~k68#!W&tfI1K#oATM*45%3+Idd?g)GEgOK*t%JQeH{Wp z9FT0$u@1_{fT?U<7|E%G=u8fc%`)l~N=t^tmTaZ83_!z3aWe$-IdCoI5L#^(oiT$E zve{Nf2m{dqA8z##x(6Zk!ASxm?i!4Fq{}J992?^QW0a(Za2Y`s$ziNXtFA3i`Gaho~cqo zLrF*mA$2kdLeN?q(P%X?M61JSg3`$`jL<}M-7bNA%cuBMW;;unwG8CTGFe4NNQU8r zL{7^k2&$7(2q9x6h(5n4;iX_V1WjF@=B)6M>$xM2SEMl+T1U-5B#G~^SLB+LU& zAS6!E2q7nBh=!sm1X5|`av86I$hP#=--k}GO*wtQ*z8fNvI^y7Q`wgs;V?A0s38h8{Rl(e(Hx-in2)L=jcM@sS&!VR9^M|)Z(egED8v*C;-u=BZ{3r441smHEuJ&v%(3fSH(>Kgi zMplW=udl1?oV|a2cGSd~dmrQlG}}KfDOR7owoO(wYj}kqZ8WhX$06~p$ZdNVwY2yB z{o@7e>?NTqtc9Du-W6!nk4`=beJafrg&YwSAFxgL8w_04)bh)PYK?cE-|ly}c2$D& zo_~G1+ht!Pa`EPoxx&Pgd4BVA_jFw_$g$v6r8fnqvOIMj-pA&hv6kiq4T^8SlX>vc zp&P=_;^Wkdao#=ic}d>SXBt0k?@6muq)A7ZcmIC=TEN$QJrJ{PQAS;NQ+s$(uQWlO zw&_96KWip_M<2U-toCSJ2tVxMqLWpR?-%_L_@(c(x9mW9Wkj?2ZfA`kVspUQ6&E|L zpd#IGw$nNKU}Iy|YITJz_fOkHTo2mWQ)kbfKHB`qvV?CD|L(C03i^r86j>@omH~ze%ru6dqHT(wGzZTr$rFV@9)@8iua5_aD1G~;1 zsta9I@Yu`mRB)1IY{9MIb(3!`bKTl`F>D}ZZC*sa<-N(|GJMy@)Y2~s^d{5cJNLaC zu`K1CXxUeF{Y`ei0}XXs;?eo}p-Wb(A|>J9J!+xxb|wHDK5)=AZDE|i!x)v@Y&X#K z;GC@Si$yW%0&`P#q5p}AkAAi+ULCmm(NMR_l=jA=qL}W<{gYw+h7`q6$%+2dli78) zZ?|8vd{mhjG9V{^#ZQl@c&{>TFk^*Je0p?d`gpyJrB>Ump5gx9c4F%_pZ7#kc(Z&rLjhs7XJnYCys_W;QkTP4F{X ZQ+-J4pcS^{|HEGZpo&e5X|JE0qy_* diff --git a/src/main/resources/assets/create/textures/block/packager_block_defrag.png b/src/main/resources/assets/create/textures/block/packager_block_defrag.png index 12af6c944f247983b6d8641839941ef4542a86ab..37302e3530345621216cccfafb160f6c8096bd4b 100644 GIT binary patch delta 493 zcmaFO@rQYWWIZzj1B1(wu46!ou{g-xiDBJ2nU_EgOS+@4BLl<6e(pbstU$hffKQ04 zft7`$hf8pHU}k1gOH=v$*^~EdTUQlj(v)b`k!qRft>?zT;LgYt!N};%$Y{;L5NaiF z&cG1mqEZl~2Q*`y=Zi)lC0Y{X7yKUr>Y+4*V$i->`wFOnv%n*=n1Ml034|F}J-Ryy z=sHzT7sn6_|JI=HqQeS2hZ8=(+Esbs|NmXtsa?<{*f zHE%AdX3D!*^vd<~Tb_*h><^!b@wSBQUdASG7IxUvR6A69&K;fCd%Dl=Dm2*7UbJ4m Y++4Rbr1i5aFdP{?UHx3vIVCg!0K4zcXaE2J delta 1121 zcmV-n1fKi+1M3Ko8Gi-<0047(dh`GQ00v@9M??Vs0RI60puMM)00009a7bBm001r{ z001r{0eGc9b^rhX2XskIMF;2x9Sas2Z&tfo0000PbVXQnLvL+uWo~o;Lvm$dbY)~9 zcWHEJAV*0}P*;Ht7XSbQ(@8`@R9M5cmrrOTWf;bPDfv^fX@9~58VHjVda#x)(k&L6 z-GhR9Se6y75$eG|xZt54JPCq|2T{SRf_qr-ARg?YTfHnETn`@FR9d?gT0%v#bn-DU z(HSRAhfHQ+Jd87&>^7QzK9@{}@Av>d4f@I z05A+cEF}}nPJd4!XD5-fIr6gn5J3?lxUUF-P^$>FM!9kfFcd$WPE8E4py@TKzuxkZniLOkN4BJH`p`cNXZ0anrt7y8x z?DP~;GC{*I5o(o&VNzB!?rMLb)h)ET69GBY(VFe2%;<6B^czU%dPzLanj2e;C;E zzrp8SoIj78oh0u?r!PH@P-`87$%D1y-}7r>Yya^6MAVP^^|g)A>gqMOTsfw& zxPQd$&0PwMOO$rD+5i3<4&xC3VzD>?wrv66SWd9V{N_jTQ^O`?q55WLp1D?kW%DjnRIGm zcmeGZXb*ckns$rixyYHk|0M!V+iSsoD}T0{o`6U^LhD`#+qQ!BL)SnzME)tn_;|F# zltwlYb%SkNjK`uKhx@;d<aZQDW-0^K}e%&0dgSC0Fh2g;RWjCup1Rs+iwY8A(F_*%76 z!?7I7iiT=>Z-Q3$y5VnkYr*=Fn~~Sy`t$-hI|;z=irVvlY1A9R7qM^0cQ#90xKwbZ nN&?vJIv42XNwCMA%~I%ZjCeOdfc3Yn00000NkvXXu0mjf8cP@y diff --git a/src/main/resources/assets/create/textures/block/packager_block_defrag_powered.png b/src/main/resources/assets/create/textures/block/packager_block_defrag_powered.png new file mode 100644 index 0000000000000000000000000000000000000000..ceb005ed8d5934abd709931f4d895d63f387f485 GIT binary patch literal 508 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCil=1AIbU4Xi92JzRpr12Z#|TAIq|&z`(z+q$YKlcq$gj#SG;Z@rle4AU7H z&N478WngGzU(x@u+L0=~0?A-MKRt+tWd)SqBD;Ud7cu?8K{3g~Syv20Cz@Ny%P>1gQoYt+S zC;p3EYjRa&<1&_M2wdG{IipC^a(YTxT$)1oQaihO^Uv$Eyvr(8Nc~%PgP*bW`=%#* z=V%;BN;rKXDOP{+G5-W7Id=8}gW0kLD`q`ySh@4EZTz*QwuY?=+g9c%%|5wr#m^!J z=b)6_wb!nNOnvDjAe0#yd{&Zwr_cg{-V4Rof)?M`3Q=Cd#I$W^@CwiB_e-B{3;dzF zrBCiV%N|e7n@g&h@-7y=a{c_4Cu2VQ!)Ic=Eg`#?vB{f-9riTU4wasBN9XmP?z6iJ e4feAat(Px1*DVcc{p<=1MFvk-KbLh*2~7a#b< zEM;J5WMD8gv8`ZWNKZ_RjEL~}_ct;!v$J*d^zd+Taj~~^0vdTdE_e-)k}3)E3;vG_ zFo-BI+ybiNEbxddW?7JM6~k7)4P* zv74@GjH?bvEr>T=cE-D4<*%rx=Nr6RyXEx$AA0s7_|P*0$x{21CpZ0y^|>~;;<4{V b<&)+WoVE{^70AW{LyW=G)z4*}Q$iB}IrrE{ literal 0 HcmV?d00001 From f0cb204da4b9ff135b440c94a404fe7f04cc5066 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Wed, 27 Nov 2024 13:50:28 +0100 Subject: [PATCH 144/515] Nice pricing - Table cloth order costs are set in-world using a filter slot --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 6 +- .../resources/assets/create/lang/en_ud.json | 12 +- .../resources/assets/create/lang/en_us.json | 12 +- .../simibubi/create/AllBlockEntityTypes.java | 16 +- .../java/com/simibubi/create/AllBlocks.java | 19 ++- .../simibubi/create/AllCreativeModeTabs.java | 6 +- .../java/com/simibubi/create/AllItems.java | 2 +- .../com/simibubi/create/AllMenuTypes.java | 5 - .../java/com/simibubi/create/AllPackets.java | 2 - .../com/simibubi/create/AllPartialModels.java | 11 +- .../java/com/simibubi/create/AllShapes.java | 4 +- .../simibubi/create/compat/jei/CreateJEI.java | 2 - .../blueprint/BlueprintOverlayRenderer.java | 12 +- .../DisplayClothConfigurationPacket.java | 49 ------- .../displayCloth/DisplayClothPricingMenu.java | 77 ---------- .../DisplayClothPricingScreen.java | 138 ------------------ .../StockTickerInteractionHandler.java | 4 +- .../stockTicker/StockTickerRequestScreen.java | 3 +- .../BlueprintOverlayShopContext.java | 2 +- .../ShoppingListItem.java | 18 +-- .../TableClothBlock.java} | 34 ++--- .../TableClothBlockEntity.java} | 92 ++++++------ .../TableClothBlockItem.java} | 8 +- .../tableCloth/TableClothFilterSlot.java | 35 +++++ .../TableClothFilteringBehaviour.java | 79 ++++++++++ .../TableClothModel.java} | 16 +- .../TableClothOverlayRenderer.java} | 10 +- .../TableClothRenderer.java} | 30 +++- .../ClientResourceReloadListener.java | 4 +- .../behaviour/ValueSettingsBehaviour.java | 4 + .../behaviour/ValueSettingsInputHandler.java | 2 + .../filtering/FilteringBehaviour.java | 4 +- .../filtering/FilteringRenderer.java | 2 + .../foundation/data/BuilderTransformers.java | 10 +- .../foundation/events/ClientEvents.java | 4 +- .../assets/create/lang/default/interface.json | 12 +- .../block/table_cloth/price_tag_side.json | 62 ++++++++ .../block/table_cloth/price_tag_top.json | 62 ++++++++ .../textures/block/table_cloth/price_tag.png | Bin 0 -> 222 bytes 39 files changed, 444 insertions(+), 426 deletions(-) delete mode 100644 src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothConfigurationPacket.java delete mode 100644 src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothPricingMenu.java delete mode 100644 src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothPricingScreen.java rename src/main/java/com/simibubi/create/content/logistics/{displayCloth => tableCloth}/BlueprintOverlayShopContext.java (61%) rename src/main/java/com/simibubi/create/content/logistics/{displayCloth => tableCloth}/ShoppingListItem.java (90%) rename src/main/java/com/simibubi/create/content/logistics/{displayCloth/DisplayClothBlock.java => tableCloth/TableClothBlock.java} (86%) rename src/main/java/com/simibubi/create/content/logistics/{displayCloth/DisplayClothBlockEntity.java => tableCloth/TableClothBlockEntity.java} (80%) rename src/main/java/com/simibubi/create/content/logistics/{displayCloth/DisplayClothBlockItem.java => tableCloth/TableClothBlockItem.java} (81%) create mode 100644 src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothFilterSlot.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothFilteringBehaviour.java rename src/main/java/com/simibubi/create/content/logistics/{displayCloth/DisplayClothModel.java => tableCloth/TableClothModel.java} (86%) rename src/main/java/com/simibubi/create/content/logistics/{displayCloth/DisplayClothOverlayRenderer.java => tableCloth/TableClothOverlayRenderer.java} (85%) rename src/main/java/com/simibubi/create/content/logistics/{displayCloth/DisplayClothRenderer.java => tableCloth/TableClothRenderer.java} (55%) create mode 100644 src/main/resources/assets/create/models/block/table_cloth/price_tag_side.json create mode 100644 src/main/resources/assets/create/models/block/table_cloth/price_tag_top.json create mode 100644 src/main/resources/assets/create/textures/block/table_cloth/price_tag.png diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 0b5644fd5d..a7b2a45d17 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-11-26T21:37:36.7230879 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-11-27T13:30:40.8866274 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -639,8 +639,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -cad795752419b1047d2dcd4507c6c4914643aa7d assets/create/lang/en_ud.json -86a26f6cc4518dcb602e445b9e3719531b89e315 assets/create/lang/en_us.json +ba633d3681eb322596d533121632f0df758bec32 assets/create/lang/en_ud.json +90f581b095b45774d0c11829c03a24477281bf8a assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 1910479e0d..5e2fea744b 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -1012,11 +1012,6 @@ "create.crafting_blueprint.manually_assigned": "pǝubıssɐ ʎןןɐnuɐW", "create.crafting_blueprint.optional": "ןɐuoıʇdO", "create.crafting_blueprint.secondary_display_slot": "ʇoןS ʎɐןdsıᗡ ʎɹɐpuoɔǝS", - "create.display_cloth.hand_to_shop_keeper": "ɹǝdǝǝʞ doɥs ɐ oʇ sıɥʇ puɐH", - "create.display_cloth.shop_configured": "pǝɹnbıɟuoɔ doɥs ɯǝʇI", - "create.display_cloth.shopping_list_discarded": "pǝpɹɐɔsıp ʇsıן buıddoɥS", - "create.display_cloth.sneak_click_discard": "pɹɐɔsıp oʇ ʞɔıןƆ-ʞɐǝuS", - "create.display_cloth.total_cost": " :ʇsoɔ ןɐʇo⟘", "create.display_link.attached_side": "ǝpıs pǝɥɔɐʇʇɐ uo ʞɔoןᗺ", "create.display_link.clear": "uoıʇɔǝןǝs uoıʇısod pǝɹɐǝןƆ", "create.display_link.display_on": ":oʇ ɐʇɐp ǝʇıɹM", @@ -2755,6 +2750,13 @@ "create.symmetry.mirror.doublePlane": "ɹɐןnbuɐʇɔǝᴚ", "create.symmetry.mirror.plane": "ǝɔuO ɹoɹɹıW", "create.symmetry.mirror.triplePlane": "ןɐuobɐʇɔO", + "create.table_cloth.amount": "ʇunoɯⱯ", + "create.table_cloth.hand_to_shop_keeper": "ɹǝdǝǝʞ doɥs ɐ oʇ sıɥʇ puɐH", + "create.table_cloth.price_per_order": "ɹǝpɹO ɹǝd ǝɔıɹԀ", + "create.table_cloth.shop_configured": "pǝɹnbıɟuoɔ doɥs ɯǝʇI", + "create.table_cloth.shopping_list_discarded": "pǝpɹɐɔsıp ʇsıן buıddoɥS", + "create.table_cloth.sneak_click_discard": "pɹɐɔsıp oʇ ʞɔıןƆ-ʞɐǝuS", + "create.table_cloth.total_cost": " :ʇsoɔ ןɐʇo⟘", "create.terrainzapper.leftClickToSet": "ןɐıɹǝʇɐW ʇǝs oʇ ʞɔoןᗺ ɐ ʞɔıןƆ-ʇɟǝꞀ", "create.terrainzapper.shiftRightClickToSet": "ǝdɐɥS ɐ ʇɔǝןǝS oʇ ʞɔıןƆ-ʇɥbıᴚ-ʇɟıɥS", "create.terrainzapper.usingBlock": "%1$s :buıs∩", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 44aa80825d..a036b69e52 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1012,11 +1012,6 @@ "create.crafting_blueprint.manually_assigned": "Manually assigned", "create.crafting_blueprint.optional": "Optional", "create.crafting_blueprint.secondary_display_slot": "Secondary Display Slot", - "create.display_cloth.hand_to_shop_keeper": "Hand this to a shop keeper", - "create.display_cloth.shop_configured": "Item shop configured", - "create.display_cloth.shopping_list_discarded": "Shopping list discarded", - "create.display_cloth.sneak_click_discard": "Sneak-Click to discard", - "create.display_cloth.total_cost": "Total cost: ", "create.display_link.attached_side": "Block on attached side", "create.display_link.clear": "Cleared position selection", "create.display_link.display_on": "Write data to:", @@ -2755,6 +2750,13 @@ "create.symmetry.mirror.doublePlane": "Rectangular", "create.symmetry.mirror.plane": "Mirror Once", "create.symmetry.mirror.triplePlane": "Octagonal", + "create.table_cloth.amount": "Amount", + "create.table_cloth.hand_to_shop_keeper": "Hand this to a shop keeper", + "create.table_cloth.price_per_order": "Price per Order", + "create.table_cloth.shop_configured": "Item shop configured", + "create.table_cloth.shopping_list_discarded": "Shopping list discarded", + "create.table_cloth.sneak_click_discard": "Sneak-Click to discard", + "create.table_cloth.total_cost": "Total cost: ", "create.terrainzapper.leftClickToSet": "Left-Click a Block to set Material", "create.terrainzapper.shiftRightClickToSet": "Shift-Right-Click to Select a Shape", "create.terrainzapper.usingBlock": "Using: %1$s", diff --git a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java index 5d63d1e5fa..e507d8eeb6 100644 --- a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java +++ b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java @@ -167,8 +167,6 @@ import com.simibubi.create.content.logistics.depot.DepotRenderer; import com.simibubi.create.content.logistics.depot.EjectorBlockEntity; import com.simibubi.create.content.logistics.depot.EjectorRenderer; import com.simibubi.create.content.logistics.depot.EjectorVisual; -import com.simibubi.create.content.logistics.displayCloth.DisplayClothBlockEntity; -import com.simibubi.create.content.logistics.displayCloth.DisplayClothRenderer; import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBlockEntity; import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelRenderer; import com.simibubi.create.content.logistics.funnel.FunnelBlockEntity; @@ -186,6 +184,8 @@ import com.simibubi.create.content.logistics.packager.repackager.RepackagerBlock import com.simibubi.create.content.logistics.packagerLink.PackagerLinkBlockEntity; import com.simibubi.create.content.logistics.redstoneRequester.RedstoneRequesterBlockEntity; import com.simibubi.create.content.logistics.stockTicker.StockTickerBlockEntity; +import com.simibubi.create.content.logistics.tableCloth.TableClothBlockEntity; +import com.simibubi.create.content.logistics.tableCloth.TableClothRenderer; import com.simibubi.create.content.logistics.tunnel.BeltTunnelBlockEntity; import com.simibubi.create.content.logistics.tunnel.BeltTunnelRenderer; import com.simibubi.create.content.logistics.tunnel.BeltTunnelVisual; @@ -526,13 +526,13 @@ public class AllBlockEntityTypes { .renderer(() -> PostboxRenderer::new) .register(); - public static final BlockEntityEntry DISPLAY_CLOTH = - REGISTRATE.blockEntity("display_cloth", DisplayClothBlockEntity::new) + public static final BlockEntityEntry TABLE_CLOTH = + REGISTRATE.blockEntity("table_cloth", TableClothBlockEntity::new) .validBlocks(AllBlocks.TABLE_CLOTHS.toArray()) - .validBlock(AllBlocks.ANDESITE_DISPLAY_CLOTH) - .validBlock(AllBlocks.BRASS_DISPLAY_CLOTH) - .validBlock(AllBlocks.COPPER_DISPLAY_CLOTH) - .renderer(() -> DisplayClothRenderer::new) + .validBlock(AllBlocks.ANDESITE_TABLE_CLOTH) + .validBlock(AllBlocks.BRASS_TABLE_CLOTH) + .validBlock(AllBlocks.COPPER_TABLE_CLOTH) + .renderer(() -> TableClothRenderer::new) .register(); public static final BlockEntityEntry PACKAGER_LINK = REGISTRATE diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 907cebb6ee..e8c51dbe7e 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -167,7 +167,6 @@ import com.simibubi.create.content.logistics.crate.CreativeCrateBlock; import com.simibubi.create.content.logistics.depot.DepotBlock; import com.simibubi.create.content.logistics.depot.EjectorBlock; import com.simibubi.create.content.logistics.depot.EjectorItem; -import com.simibubi.create.content.logistics.displayCloth.DisplayClothBlock; import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBlock; import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBlockItem; import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelModel; @@ -183,13 +182,13 @@ import com.simibubi.create.content.logistics.packagePort.PackagePortItem; import com.simibubi.create.content.logistics.packagePort.frogport.FrogportBlock; import com.simibubi.create.content.logistics.packagePort.postbox.PostboxBlock; import com.simibubi.create.content.logistics.packager.PackagerBlock; -import com.simibubi.create.content.logistics.packager.PackagerGenerator; import com.simibubi.create.content.logistics.packager.repackager.RepackagerBlock; import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedBlockItem; import com.simibubi.create.content.logistics.packagerLink.PackagerLinkBlock; import com.simibubi.create.content.logistics.redstoneRequester.RedstoneRequesterBlock; import com.simibubi.create.content.logistics.redstoneRequester.RedstoneRequesterBlockItem; import com.simibubi.create.content.logistics.stockTicker.StockTickerBlock; +import com.simibubi.create.content.logistics.tableCloth.TableClothBlock; import com.simibubi.create.content.logistics.tunnel.BeltTunnelBlock; import com.simibubi.create.content.logistics.tunnel.BrassTunnelBlock; import com.simibubi.create.content.logistics.tunnel.BrassTunnelCTBehaviour; @@ -1952,9 +1951,9 @@ public class AllBlocks { .build() .register(); - public static final DyedBlockList TABLE_CLOTHS = new DyedBlockList<>(colour -> { + public static final DyedBlockList TABLE_CLOTHS = new DyedBlockList<>(colour -> { String colourName = colour.getSerializedName(); - return REGISTRATE.block(colourName + "_table_cloth", p -> new DisplayClothBlock(p, colour)) + return REGISTRATE.block(colourName + "_table_cloth", p -> new TableClothBlock(p, colour)) .transform(BuilderTransformers.tableCloth(colourName, () -> Blocks.BLACK_CARPET, true)) .properties(p -> p.mapColor(colour)) .recipe((c, p) -> { @@ -1972,8 +1971,8 @@ public class AllBlocks { .register(); }); - public static final BlockEntry ANDESITE_DISPLAY_CLOTH = - REGISTRATE.block("andesite_table_cloth", p -> new DisplayClothBlock(p, "andesite")) + public static final BlockEntry ANDESITE_TABLE_CLOTH = + REGISTRATE.block("andesite_table_cloth", p -> new TableClothBlock(p, "andesite")) .transform(BuilderTransformers.tableCloth("andesite", SharedProperties::stone, false)) .properties(p -> p.mapColor(MapColor.STONE) .requiresCorrectToolForDrops()) @@ -1982,8 +1981,8 @@ public class AllBlocks { .transform(pickaxeOnly()) .register(); - public static final BlockEntry BRASS_DISPLAY_CLOTH = - REGISTRATE.block("brass_table_cloth", p -> new DisplayClothBlock(p, "brass")) + public static final BlockEntry BRASS_TABLE_CLOTH = + REGISTRATE.block("brass_table_cloth", p -> new TableClothBlock(p, "brass")) .transform(BuilderTransformers.tableCloth("brass", SharedProperties::softMetal, false)) .properties(p -> p.mapColor(MapColor.TERRACOTTA_YELLOW) .requiresCorrectToolForDrops()) @@ -1992,8 +1991,8 @@ public class AllBlocks { .transform(pickaxeOnly()) .register(); - public static final BlockEntry COPPER_DISPLAY_CLOTH = - REGISTRATE.block("copper_table_cloth", p -> new DisplayClothBlock(p, "copper")) + public static final BlockEntry COPPER_TABLE_CLOTH = + REGISTRATE.block("copper_table_cloth", p -> new TableClothBlock(p, "copper")) .transform(BuilderTransformers.tableCloth("copper", SharedProperties::copperMetal, false)) .properties(p -> p.requiresCorrectToolForDrops()) .recipe((c, p) -> p.stonecutting(DataIngredient.tag(AllTags.forgeItemTag("ingots/copper")), diff --git a/src/main/java/com/simibubi/create/AllCreativeModeTabs.java b/src/main/java/com/simibubi/create/AllCreativeModeTabs.java index ba447a3b3a..a8dd580808 100644 --- a/src/main/java/com/simibubi/create/AllCreativeModeTabs.java +++ b/src/main/java/com/simibubi/create/AllCreativeModeTabs.java @@ -14,8 +14,8 @@ import com.simibubi.create.content.decoration.palettes.AllPaletteBlocks; import com.simibubi.create.content.equipment.armor.BacktankUtil; import com.simibubi.create.content.equipment.toolbox.ToolboxBlock; import com.simibubi.create.content.kinetics.crank.ValveHandleBlock; -import com.simibubi.create.content.logistics.displayCloth.DisplayClothBlock; import com.simibubi.create.content.logistics.packagePort.postbox.PostboxBlock; +import com.simibubi.create.content.logistics.tableCloth.TableClothBlock; import com.simibubi.create.foundation.data.CreateRegistrate; import com.simibubi.create.foundation.item.TagDependentIngredientItem; import com.tterrag.registrate.util.entry.BlockEntry; @@ -246,8 +246,8 @@ public class AllCreativeModeTabs { } } - for (BlockEntry entry : AllBlocks.TABLE_CLOTHS) { - DisplayClothBlock block = entry.get(); + for (BlockEntry entry : AllBlocks.TABLE_CLOTHS) { + TableClothBlock block = entry.get(); if (block.getColor() != DyeColor.RED) { visibilities.put(entry.asItem(), TabVisibility.SEARCH_TAB_ONLY); } diff --git a/src/main/java/com/simibubi/create/AllItems.java b/src/main/java/com/simibubi/create/AllItems.java index 7d9e9940f2..52e2227bf2 100644 --- a/src/main/java/com/simibubi/create/AllItems.java +++ b/src/main/java/com/simibubi/create/AllItems.java @@ -46,8 +46,8 @@ import com.simibubi.create.content.legacy.ChromaticCompoundItem; import com.simibubi.create.content.legacy.RefinedRadianceItem; import com.simibubi.create.content.legacy.ShadowSteelItem; import com.simibubi.create.content.logistics.box.PackageItem; -import com.simibubi.create.content.logistics.displayCloth.ShoppingListItem; import com.simibubi.create.content.logistics.filter.FilterItem; +import com.simibubi.create.content.logistics.tableCloth.ShoppingListItem; import com.simibubi.create.content.materials.ExperienceNuggetItem; import com.simibubi.create.content.processing.burner.BlazeBurnerBlockItem; import com.simibubi.create.content.processing.sequenced.SequencedAssemblyItem; diff --git a/src/main/java/com/simibubi/create/AllMenuTypes.java b/src/main/java/com/simibubi/create/AllMenuTypes.java index 0f1c02bf07..3a5b7c2427 100644 --- a/src/main/java/com/simibubi/create/AllMenuTypes.java +++ b/src/main/java/com/simibubi/create/AllMenuTypes.java @@ -4,8 +4,6 @@ import com.simibubi.create.content.equipment.blueprint.BlueprintMenu; import com.simibubi.create.content.equipment.blueprint.BlueprintScreen; import com.simibubi.create.content.equipment.toolbox.ToolboxMenu; import com.simibubi.create.content.equipment.toolbox.ToolboxScreen; -import com.simibubi.create.content.logistics.displayCloth.DisplayClothPricingMenu; -import com.simibubi.create.content.logistics.displayCloth.DisplayClothPricingScreen; import com.simibubi.create.content.logistics.filter.AttributeFilterMenu; import com.simibubi.create.content.logistics.filter.AttributeFilterScreen; import com.simibubi.create.content.logistics.filter.FilterMenu; @@ -67,9 +65,6 @@ public class AllMenuTypes { public static final MenuEntry STOCK_KEEPER_CATEGORY = register("stock_keeper_category", StockKeeperCategoryMenu::new, () -> StockKeeperCategoryScreen::new); - public static final MenuEntry DISPLAY_CLOTH = - register("display_cloth", DisplayClothPricingMenu::new, () -> DisplayClothPricingScreen::new); - public static final MenuEntry PACKAGE_PORT = register("package_port", PackagePortMenu::new, () -> PackagePortScreen::new); diff --git a/src/main/java/com/simibubi/create/AllPackets.java b/src/main/java/com/simibubi/create/AllPackets.java index a459fb8726..b812b79f15 100644 --- a/src/main/java/com/simibubi/create/AllPackets.java +++ b/src/main/java/com/simibubi/create/AllPackets.java @@ -61,7 +61,6 @@ import com.simibubi.create.content.logistics.depot.EjectorAwardPacket; import com.simibubi.create.content.logistics.depot.EjectorElytraPacket; import com.simibubi.create.content.logistics.depot.EjectorPlacementPacket; import com.simibubi.create.content.logistics.depot.EjectorTriggerPacket; -import com.simibubi.create.content.logistics.displayCloth.DisplayClothConfigurationPacket; import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelConfigurationPacket; import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelConnectionPacket; import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelEffectPacket; @@ -194,7 +193,6 @@ public enum AllPackets { CHAIN_CONVEYOR_CONNECT(ChainConveyorConnectionPacket.class, ChainConveyorConnectionPacket::new, PLAY_TO_SERVER), CHAIN_CONVEYOR_RIDING(ServerboundChainConveyorRidingPacket.class, ServerboundChainConveyorRidingPacket::new, PLAY_TO_SERVER), CHAIN_PACKAGE_INTERACTION(ChainPackageInteractionPacket.class, ChainPackageInteractionPacket::new, PLAY_TO_SERVER), - DISPLAY_CLOTH_CONFIGURATION(DisplayClothConfigurationPacket.class, DisplayClothConfigurationPacket::new, PLAY_TO_SERVER), PACKAGE_PORT_CONFIGURATION(PackagePortConfigurationPacket.class, PackagePortConfigurationPacket::new, PLAY_TO_SERVER), TRAIN_MAP_REQUEST(TrainMapSyncRequestPacket.class, TrainMapSyncRequestPacket::new, PLAY_TO_SERVER), CONNECT_FACTORY_PANEL(FactoryPanelConnectionPacket.class, FactoryPanelConnectionPacket::new, PLAY_TO_SERVER), diff --git a/src/main/java/com/simibubi/create/AllPartialModels.java b/src/main/java/com/simibubi/create/AllPartialModels.java index edb83b22f9..8457b60621 100644 --- a/src/main/java/com/simibubi/create/AllPartialModels.java +++ b/src/main/java/com/simibubi/create/AllPartialModels.java @@ -125,6 +125,9 @@ public class AllPartialModels { PACKAGER_TRAY_REGULAR = block("packager/tray"), PACKAGER_TRAY_DEFRAG = block("repackager/tray"), PACKAGER_HATCH_OPEN = block("packager/hatch_open"), PACKAGER_HATCH_CLOSED = block("packager/hatch_closed"), + + TABLE_CLOTH_PRICE_SIDE = block("table_cloth/price_tag_side"), + TABLE_CLOTH_PRICE_TOP = block("table_cloth/price_tag_top"), COPPER_BACKTANK_SHAFT = block("copper_backtank/block_shaft_input"), COPPER_BACKTANK_COGS = block("copper_backtank/block_cogs"), @@ -189,10 +192,10 @@ public class AllPartialModels { FACTORY_PANEL_RESTOCKER_WITH_BULB = block("factory_gauge/panel_restocker_with_bulb"), FACTORY_PANEL_LIGHT = block("factory_gauge/bulb_light"), - DISPLAY_CLOTH_NW = block("table_cloth/north_west"), - DISPLAY_CLOTH_NE = block("table_cloth/north_east"), - DISPLAY_CLOTH_SW = block("table_cloth/south_west"), - DISPLAY_CLOTH_SE = block("table_cloth/south_east"), + TABLE_CLOTH_NW = block("table_cloth/north_west"), + TABLE_CLOTH_NE = block("table_cloth/north_east"), + TABLE_CLOTH_SW = block("table_cloth/south_west"), + TABLE_CLOTH_SE = block("table_cloth/south_east"), CRAFTING_BLUEPRINT_1x1 = entity("crafting_blueprint_small"), CRAFTING_BLUEPRINT_2x2 = entity("crafting_blueprint_medium"), diff --git a/src/main/java/com/simibubi/create/AllShapes.java b/src/main/java/com/simibubi/create/AllShapes.java index 367e9bbf4e..3c39d322f3 100644 --- a/src/main/java/com/simibubi/create/AllShapes.java +++ b/src/main/java/com/simibubi/create/AllShapes.java @@ -239,8 +239,8 @@ public class AllShapes { PACKAGE_PORT = shape(0, 0, 0, 16, 4, 16).add(2, 2, 2, 14, 14, 14) .build(), - DISPLAY_CLOTH = shape(-1, -9, -1, 17, 1, 17).build(), - DISPLAY_CLOTH_OCCLUSION = shape(0, 0, 0, 16, 1, 16).build(), + TABLE_CLOTH = shape(-1, -9, -1, 17, 1, 17).build(), + TABLE_CLOTH_OCCLUSION = shape(0, 0, 0, 16, 1, 16).build(), CHAIN_CONVEYOR_INTERACTION = shape(-10, 2, 0, 26, 14, 16).add(0, 2, -10, 16, 14, 26) .add(-5, 2, -5, 21, 14, 21) diff --git a/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java b/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java index a5d28647e9..c8548a31fa 100644 --- a/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java +++ b/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java @@ -57,7 +57,6 @@ import com.simibubi.create.content.kinetics.press.MechanicalPressBlockEntity; import com.simibubi.create.content.kinetics.press.PressingRecipe; import com.simibubi.create.content.kinetics.saw.CuttingRecipe; import com.simibubi.create.content.kinetics.saw.SawBlockEntity; -import com.simibubi.create.content.logistics.displayCloth.DisplayClothPricingScreen; import com.simibubi.create.content.logistics.filter.AbstractFilterScreen; import com.simibubi.create.content.logistics.redstoneRequester.RedstoneRequesterScreen; import com.simibubi.create.content.processing.basin.BasinRecipe; @@ -374,7 +373,6 @@ public class CreateJEI implements IModPlugin { registration.addGhostIngredientHandler(BlueprintScreen.class, new GhostIngredientHandler()); registration.addGhostIngredientHandler(LinkedControllerScreen.class, new GhostIngredientHandler()); registration.addGhostIngredientHandler(ScheduleScreen.class, new GhostIngredientHandler()); - registration.addGhostIngredientHandler(DisplayClothPricingScreen.class, new GhostIngredientHandler()); registration.addGhostIngredientHandler(RedstoneRequesterScreen.class, new GhostIngredientHandler()); } diff --git a/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintOverlayRenderer.java b/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintOverlayRenderer.java index 6c6d6d262c..fc19aba4b9 100644 --- a/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintOverlayRenderer.java +++ b/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintOverlayRenderer.java @@ -12,14 +12,14 @@ import com.simibubi.create.AllItems; import com.simibubi.create.content.equipment.blueprint.BlueprintEntity.BlueprintCraftingInventory; import com.simibubi.create.content.equipment.blueprint.BlueprintEntity.BlueprintSection; import com.simibubi.create.content.logistics.BigItemStack; -import com.simibubi.create.content.logistics.displayCloth.BlueprintOverlayShopContext; -import com.simibubi.create.content.logistics.displayCloth.DisplayClothBlockEntity; -import com.simibubi.create.content.logistics.displayCloth.ShoppingListItem.ShoppingList; import com.simibubi.create.content.logistics.filter.AttributeFilterMenu.WhitelistMode; import com.simibubi.create.content.logistics.filter.FilterItem; import com.simibubi.create.content.logistics.filter.FilterItemStack; import com.simibubi.create.content.logistics.filter.ItemAttribute; import com.simibubi.create.content.logistics.packager.InventorySummary; +import com.simibubi.create.content.logistics.tableCloth.BlueprintOverlayShopContext; +import com.simibubi.create.content.logistics.tableCloth.TableClothBlockEntity; +import com.simibubi.create.content.logistics.tableCloth.ShoppingListItem.ShoppingList; import com.simibubi.create.content.trains.track.TrackPlacement.PlacementInfo; import com.simibubi.create.foundation.gui.AllGuiTextures; @@ -139,7 +139,7 @@ public class BlueprintOverlayRenderer { } } - public static void displayClothShop(DisplayClothBlockEntity dce, int alreadyPurchased, ShoppingList list) { + public static void displayClothShop(TableClothBlockEntity dce, int alreadyPurchased, ShoppingList list) { if (active) return; prepareCustomOverlay(); @@ -147,8 +147,8 @@ public class BlueprintOverlayRenderer { shopContext = new BlueprintOverlayShopContext(false, dce.getStockLevelForTrade(list), alreadyPurchased); - ingredients.add(Pair.of(dce.paymentItem.copyWithCount(dce.paymentAmount), - !dce.paymentItem.isEmpty() && shopContext.stockLevel() > shopContext.purchases())); + ingredients.add(Pair.of(dce.getPaymentItem().copyWithCount(dce.getPaymentAmount()), + !dce.getPaymentItem().isEmpty() && shopContext.stockLevel() > shopContext.purchases())); for (BigItemStack entry : dce.requestData.encodedRequest.stacks()) results.add(entry.stack.copyWithCount(entry.count)); } diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothConfigurationPacket.java b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothConfigurationPacket.java deleted file mode 100644 index fcf299750b..0000000000 --- a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothConfigurationPacket.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.simibubi.create.content.logistics.displayCloth; - -import com.simibubi.create.content.logistics.stockTicker.PackageOrder; -import com.simibubi.create.foundation.networking.BlockEntityConfigurationPacket; - -import net.minecraft.core.BlockPos; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.world.item.ItemStack; - -public class DisplayClothConfigurationPacket extends BlockEntityConfigurationPacket { - - protected PackageOrder order; - protected ItemStack costItem; - protected int costAmount; - - public DisplayClothConfigurationPacket(BlockPos pos, PackageOrder order, ItemStack costItem, int costAmount) { - super(pos); - this.order = order; - this.costItem = costItem; - this.costAmount = costAmount; - } - - public DisplayClothConfigurationPacket(FriendlyByteBuf buffer) { - super(buffer); - } - - @Override - protected void writeSettings(FriendlyByteBuf buffer) { - order.write(buffer); - buffer.writeItem(costItem); - buffer.writeVarInt(costAmount); - } - - @Override - protected void readSettings(FriendlyByteBuf buffer) { - order = PackageOrder.read(buffer); - costItem = buffer.readItem(); - costAmount = buffer.readVarInt(); - } - - @Override - protected void applySettings(DisplayClothBlockEntity be) { - be.requestData.encodedRequest = order; - be.paymentItem = costItem; - be.paymentAmount = costAmount; - be.notifyUpdate(); - } - -} diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothPricingMenu.java b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothPricingMenu.java deleted file mode 100644 index cb97039b2a..0000000000 --- a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothPricingMenu.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.simibubi.create.content.logistics.displayCloth; - -import com.simibubi.create.AllMenuTypes; -import com.simibubi.create.AllPackets; -import com.simibubi.create.foundation.gui.menu.GhostItemMenu; - -import net.minecraft.client.Minecraft; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.world.entity.player.Inventory; -import net.minecraft.world.inventory.MenuType; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraftforge.items.ItemStackHandler; -import net.minecraftforge.items.SlotItemHandler; - -public class DisplayClothPricingMenu extends GhostItemMenu { - - int pricingAmount; - - public DisplayClothPricingMenu(MenuType type, int id, Inventory inv, DisplayClothBlockEntity contentHolder) { - super(type, id, inv, contentHolder); - pricingAmount = contentHolder.paymentAmount; - } - - public DisplayClothPricingMenu(MenuType type, int id, Inventory inv, FriendlyByteBuf extraData) { - super(type, id, inv, extraData); - } - - public static DisplayClothPricingMenu create(int id, Inventory inv, DisplayClothBlockEntity contentHolder) { - return new DisplayClothPricingMenu(AllMenuTypes.DISPLAY_CLOTH.get(), id, inv, contentHolder); - } - - @Override - protected ItemStackHandler createGhostInventory() { - ItemStackHandler handler = new ItemStackHandler(1); - handler.setStackInSlot(0, contentHolder.paymentItem.isEmpty() ? contentHolder.paymentItem - : contentHolder.paymentItem.copyWithCount(1)); - return handler; - } - - @Override - protected boolean allowRepeats() { - return true; - } - - @Override - protected DisplayClothBlockEntity createOnClient(FriendlyByteBuf extraData) { - BlockEntity blockEntity = Minecraft.getInstance().level.getBlockEntity(extraData.readBlockPos()); - if (blockEntity instanceof DisplayClothBlockEntity dcbe) - return dcbe; - return null; - } - - @Override - protected void addSlots() { - int playerX = 33; - int playerY = 118; - int slotX = 0; - int slotY = 70; - - addPlayerSlots(playerX, playerY); - addSlot(new SlotItemHandler(ghostInventory, 0, slotX, slotY)); - } - - @Override - protected void saveData(DisplayClothBlockEntity contentHolder) { - if (!contentHolder.getLevel().isClientSide) - return; - - contentHolder.paymentItem = ghostInventory.getStackInSlot(0); - contentHolder.paymentAmount = Math.max(1, pricingAmount); - - AllPackets.getChannel() - .sendToServer(new DisplayClothConfigurationPacket(contentHolder.getBlockPos(), - contentHolder.requestData.encodedRequest, contentHolder.paymentItem, contentHolder.paymentAmount)); - } - -} diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothPricingScreen.java b/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothPricingScreen.java deleted file mode 100644 index bc37766039..0000000000 --- a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothPricingScreen.java +++ /dev/null @@ -1,138 +0,0 @@ -package com.simibubi.create.content.logistics.displayCloth; - -import static com.simibubi.create.foundation.gui.AllGuiTextures.PLAYER_INVENTORY; - -import java.util.List; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.content.logistics.BigItemStack; -import com.simibubi.create.foundation.gui.AllGuiTextures; -import com.simibubi.create.foundation.gui.menu.AbstractSimiContainerScreen; -import com.simibubi.create.foundation.gui.widget.ScrollInput; -import com.simibubi.create.foundation.utility.CreateLang; - -import net.createmod.catnip.gui.element.GuiGameElement; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.lang.Components; -import net.createmod.catnip.utility.theme.Color; -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.network.chat.Component; -import net.minecraft.world.entity.player.Inventory; - -public class DisplayClothPricingScreen extends AbstractSimiContainerScreen { - - private ScrollInput scrollInput; - - public DisplayClothPricingScreen(DisplayClothPricingMenu container, Inventory inv, Component title) { - super(container, inv, title); - } - - @Override - protected void init() { - setWindowSize(PLAYER_INVENTORY.getWidth() + 50, PLAYER_INVENTORY.getHeight() + 100); - super.init(); - clearWidgets(); - - int x = getGuiLeft(); - int y = getGuiTop(); - - scrollInput = new ScrollInput(x + 33, y - 4 + 72, 100, 20).withRange(1, 513) - .withShiftStep(10) - .calling(s -> menu.pricingAmount = s); - scrollInput.setState(menu.contentHolder.paymentAmount); - addRenderableWidget(scrollInput); - } - - final int cols = 8; - final int rowHeight = 18; - final int colWidth = 26; - - @Override - protected void renderBg(GuiGraphics graphics, float pPartialTick, int mouseX, int mouseY) { - int x = getGuiLeft(); - int y = getGuiTop(); - - AllGuiTextures.PLAYER_INVENTORY.render(graphics, x + 25, y + 100); - graphics.drawString(font, playerInventoryTitle, x + 8 + 25, y + 6 + 100, 0x404040, false); - - Color color = new Color(255, 255, 255, 50); - int hoveredSlot = getHoveredSlot(mouseX, mouseY); - - // Render some boxes - graphics.renderOutline(x - 2, y - 4 + 20, cols * colWidth + 6, rowHeight + 8, color.getRGB()); - graphics.renderOutline(x - 2, y - 4 + 72, 20, 20, color.getRGB()); - graphics.renderOutline(scrollInput.getX(), scrollInput.getY(), scrollInput.getWidth(), scrollInput.getHeight(), - color.getRGB()); - - graphics.drawString(font, Components.literal("Price per Order:"), x, y + 52, 0x88dddddd); - graphics.drawString(font, Components.literal("x"), scrollInput.getX() - 10, scrollInput.getY() + 6, 0x88dddddd, - true); - graphics.drawString(font, Components.literal(scrollInput.getState() + ""), scrollInput.getX() + 6, - scrollInput.getY() + 6, 0x88dddddd, true); - - PoseStack ms = graphics.pose(); - - for (int i = 0; i < currentStacks().size(); i++) { - BigItemStack entry = currentStacks().get(i); - ms.pushPose(); - - ms.translate(x + i % cols * colWidth, y + 20 + i / cols * rowHeight, 200); - - int customCount = currentStacks().get(i).count; - drawItemCount(graphics, customCount, customCount); - ms.translate(0, 0, -200); - - float scaleFromHover = hoveredSlot == i ? 1.075f : 1; - ms.translate((colWidth - 18) / 2.0, (rowHeight - 18) / 2.0, 0); - ms.translate(18 / 2.0, 18 / 2.0, 0); - ms.scale(scaleFromHover, scaleFromHover, scaleFromHover); - ms.translate(-18 / 2.0, -18 / 2.0, 0); - GuiGameElement.of(entry.stack) - .render(graphics); - ms.popPose(); - } - - if (hoveredSlot != -1) - graphics.renderTooltip(font, currentStacks().get(hoveredSlot).stack, mouseX, mouseY); - } - - private List currentStacks() { - return menu.contentHolder.requestData.encodedRequest.stacks(); - } - - private int getHoveredSlot(int mouseX, int mouseY) { - if (mouseY < getGuiTop() + 20 || mouseY > getGuiTop() + 20 + rowHeight) - return -1; - int slot = (mouseX - getGuiLeft()) / colWidth; - if (slot >= currentStacks().size()) - return -1; - return Math.max(-1, slot); - } - - private void drawItemCount(GuiGraphics graphics, int count, int customCount) { // TODO same methods in stock ticker - // screens - boolean special = customCount != count; - if (!special && count == 1) - return; - - count = customCount; - String text = count >= 1000000 ? (count / 1000000) + "m" - : count >= 10000 ? (count / 1000) + "k" - : count >= 1000 ? ((count * 10) / 1000) / 10f + "k" - : count >= 100 ? count + "" : count > 0 ? " " + count : " \u2714"; - - int lightOutline = 0x444444; - int darkOutline = 0x222222; - int middleColor = special ? 0xaaffaa : 0xdddddd; - - for (int xi : Iterate.positiveAndNegative) - graphics.drawString(font, CreateLang.text(text) - .component(), 11 + xi, 10, xi < 0 ? lightOutline : darkOutline, false); - for (int yi : Iterate.positiveAndNegative) - graphics.drawString(font, CreateLang.text(text) - .component(), 11, 10 + yi, yi < 0 ? lightOutline : darkOutline, false); - graphics.drawString(font, CreateLang.text(text) - .component(), 11, 10, middleColor, false); - } - -} diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java index 05b0d285c6..b5d024169e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java @@ -10,10 +10,10 @@ import com.simibubi.create.AllSoundEvents; import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.actors.seat.SeatEntity; import com.simibubi.create.content.logistics.BigItemStack; -import com.simibubi.create.content.logistics.displayCloth.ShoppingListItem; -import com.simibubi.create.content.logistics.displayCloth.ShoppingListItem.ShoppingList; import com.simibubi.create.content.logistics.packager.InventorySummary; import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedBehaviour.RequestType; +import com.simibubi.create.content.logistics.tableCloth.ShoppingListItem; +import com.simibubi.create.content.logistics.tableCloth.ShoppingListItem.ShoppingList; import com.simibubi.create.foundation.utility.CreateLang; import net.createmod.catnip.utility.Couple; diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java index b90201a5b3..3f1d3e2e3b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java @@ -123,7 +123,8 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre successTicks = 0; itemScroll = LerpedFloat.linear() .startWithValue(0); - stockKeeper = new WeakReference(null); + stockKeeper = new WeakReference<>(null); + blaze = new WeakReference<>(null); refreshSearchNextTick = false; // Find the keeper for rendering diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/BlueprintOverlayShopContext.java b/src/main/java/com/simibubi/create/content/logistics/tableCloth/BlueprintOverlayShopContext.java similarity index 61% rename from src/main/java/com/simibubi/create/content/logistics/displayCloth/BlueprintOverlayShopContext.java rename to src/main/java/com/simibubi/create/content/logistics/tableCloth/BlueprintOverlayShopContext.java index ff03d622e3..3472eb64e2 100644 --- a/src/main/java/com/simibubi/create/content/logistics/displayCloth/BlueprintOverlayShopContext.java +++ b/src/main/java/com/simibubi/create/content/logistics/tableCloth/BlueprintOverlayShopContext.java @@ -1,4 +1,4 @@ -package com.simibubi.create.content.logistics.displayCloth; +package com.simibubi.create.content.logistics.tableCloth; public record BlueprintOverlayShopContext(boolean checkout, int stockLevel, int purchases) { diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/ShoppingListItem.java b/src/main/java/com/simibubi/create/content/logistics/tableCloth/ShoppingListItem.java similarity index 90% rename from src/main/java/com/simibubi/create/content/logistics/displayCloth/ShoppingListItem.java rename to src/main/java/com/simibubi/create/content/logistics/tableCloth/ShoppingListItem.java index 09995203cc..21b97476f1 100644 --- a/src/main/java/com/simibubi/create/content/logistics/displayCloth/ShoppingListItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/tableCloth/ShoppingListItem.java @@ -1,4 +1,4 @@ -package com.simibubi.create.content.logistics.displayCloth; +package com.simibubi.create.content.logistics.tableCloth; import java.util.List; import java.util.UUID; @@ -76,9 +76,9 @@ public class ShoppingListItem extends Item { for (IntAttached entry : purchases) { if (clothPosToIgnore != null && clothPosToIgnore.equals(entry.getValue())) continue; - if (!(level.getBlockEntity(entry.getValue()) instanceof DisplayClothBlockEntity dcbe)) + if (!(level.getBlockEntity(entry.getValue()) instanceof TableClothBlockEntity dcbe)) continue; - input.add(dcbe.paymentItem, dcbe.paymentAmount * entry.getFirst()); + input.add(dcbe.getPaymentItem(), dcbe.getPaymentAmount() * entry.getFirst()); for (BigItemStack stackEntry : dcbe.requestData.encodedRequest.stacks()) output.add(stackEntry.stack, stackEntry.count * entry.getFirst()); } @@ -131,7 +131,7 @@ public class ShoppingListItem extends Item { if (entries.size() == 1) { BigItemStack entry = entries.get(0); - (cost ? CreateLang.translate("display_cloth.total_cost") : CreateLang.text("")) + (cost ? CreateLang.translate("table_cloth.total_cost") : CreateLang.text("")) .style(ChatFormatting.GOLD) .add(CreateLang.builder() .add(entry.stack.getHoverName()) @@ -142,7 +142,7 @@ public class ShoppingListItem extends Item { } else { if (cost) - CreateLang.translate("display_cloth.total_cost") + CreateLang.translate("table_cloth.total_cost") .style(ChatFormatting.GOLD) .addTo(pTooltipComponents); for (BigItemStack entry : entries) { @@ -158,11 +158,11 @@ public class ShoppingListItem extends Item { } } - CreateLang.translate("display_cloth.hand_to_shop_keeper") + CreateLang.translate("table_cloth.hand_to_shop_keeper") .style(ChatFormatting.GRAY) .addTo(pTooltipComponents); - CreateLang.translate("display_cloth.sneak_click_discard") + CreateLang.translate("table_cloth.sneak_click_discard") .style(ChatFormatting.DARK_GRAY) .addTo(pTooltipComponents); } @@ -172,7 +172,7 @@ public class ShoppingListItem extends Item { if (pUsedHand == InteractionHand.OFF_HAND || pPlayer == null || !pPlayer.isShiftKeyDown()) return new InteractionResultHolder(InteractionResult.PASS, pPlayer.getItemInHand(pUsedHand)); - CreateLang.translate("display_cloth.shopping_list_discarded") + CreateLang.translate("table_cloth.shopping_list_discarded") .sendStatus(pPlayer); pPlayer.playSound(SoundEvents.BOOK_PAGE_TURN); return new InteractionResultHolder(InteractionResult.SUCCESS, ItemStack.EMPTY); @@ -186,7 +186,7 @@ public class ShoppingListItem extends Item { return InteractionResult.PASS; pPlayer.setItemInHand(pUsedHand, ItemStack.EMPTY); - CreateLang.translate("display_cloth.shopping_list_discarded") + CreateLang.translate("table_cloth.shopping_list_discarded") .sendStatus(pPlayer); pPlayer.playSound(SoundEvents.BOOK_PAGE_TURN); return InteractionResult.SUCCESS; diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothBlock.java b/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothBlock.java similarity index 86% rename from src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothBlock.java rename to src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothBlock.java index 148317bfdc..d21029fec6 100644 --- a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothBlock.java @@ -1,4 +1,4 @@ -package com.simibubi.create.content.logistics.displayCloth; +package com.simibubi.create.content.logistics.tableCloth; import java.util.List; import java.util.function.Predicate; @@ -41,7 +41,7 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; -public class DisplayClothBlock extends Block implements IHaveBigOutline, IWrenchable, IBE { +public class TableClothBlock extends Block implements IHaveBigOutline, IWrenchable, IBE { public static final BooleanProperty HAS_BE = BooleanProperty.create("entity"); @@ -49,13 +49,13 @@ public class DisplayClothBlock extends Block implements IHaveBigOutline, IWrench private DyeColor colour; - public DisplayClothBlock(Properties pProperties, DyeColor colour) { + public TableClothBlock(Properties pProperties, DyeColor colour) { super(pProperties); this.colour = colour; registerDefaultState(defaultBlockState().setValue(HAS_BE, false)); } - public DisplayClothBlock(Properties pProperties, String type) { + public TableClothBlock(Properties pProperties, String type) { super(pProperties); } @@ -78,8 +78,8 @@ public class DisplayClothBlock extends Block implements IHaveBigOutline, IWrench withBlockEntityDo(pLevel, pPos, dcbe -> { dcbe.requestData = requestData; dcbe.owner = player.getUUID(); - if (dcbe.requestData.isValid) - dcbe.interactAsOwner(player); + dcbe.facing = player.getDirection() + .getOpposite(); }); } @@ -111,7 +111,7 @@ public class DisplayClothBlock extends Block implements IHaveBigOutline, IWrench if (world.isClientSide()) return InteractionResult.SUCCESS; - return onBlockEntityUse(world, pos, dcbe -> dcbe.use(player)); + return onBlockEntityUse(world, pos, dcbe -> dcbe.use(player, ray)); } @SuppressWarnings("deprecation") @@ -120,7 +120,7 @@ public class DisplayClothBlock extends Block implements IHaveBigOutline, IWrench net.minecraft.world.level.storage.loot.LootParams.Builder pParams) { List drops = super.getDrops(pState, pParams); - if (!(pParams.getOptionalParameter(LootContextParams.BLOCK_ENTITY) instanceof DisplayClothBlockEntity dcbe)) + if (!(pParams.getOptionalParameter(LootContextParams.BLOCK_ENTITY) instanceof TableClothBlockEntity dcbe)) return drops; if (!dcbe.isShop()) return drops; @@ -138,23 +138,23 @@ public class DisplayClothBlock extends Block implements IHaveBigOutline, IWrench @Override public VoxelShape getShape(BlockState pState, BlockGetter pLevel, BlockPos pPos, CollisionContext pContext) { - return colour == null ? AllShapes.DISPLAY_CLOTH_OCCLUSION : AllShapes.DISPLAY_CLOTH; + return colour == null ? AllShapes.TABLE_CLOTH_OCCLUSION : AllShapes.TABLE_CLOTH; } @Override public VoxelShape getInteractionShape(BlockState pState, BlockGetter pLevel, BlockPos pPos) { - return colour == null ? AllShapes.DISPLAY_CLOTH_OCCLUSION : AllShapes.DISPLAY_CLOTH; + return colour == null ? AllShapes.TABLE_CLOTH_OCCLUSION : AllShapes.TABLE_CLOTH; } @Override public VoxelShape getOcclusionShape(BlockState pState, BlockGetter pLevel, BlockPos pPos) { - return AllShapes.DISPLAY_CLOTH_OCCLUSION; + return AllShapes.TABLE_CLOTH_OCCLUSION; } @Override public VoxelShape getCollisionShape(BlockState pState, BlockGetter pLevel, BlockPos pPos, CollisionContext pContext) { - return AllShapes.DISPLAY_CLOTH_OCCLUSION; + return AllShapes.TABLE_CLOTH_OCCLUSION; } @Override @@ -183,13 +183,13 @@ public class DisplayClothBlock extends Block implements IHaveBigOutline, IWrench } @Override - public Class getBlockEntityClass() { - return DisplayClothBlockEntity.class; + public Class getBlockEntityClass() { + return TableClothBlockEntity.class; } @Override - public BlockEntityType getBlockEntityType() { - return AllBlockEntityTypes.DISPLAY_CLOTH.get(); + public BlockEntityType getBlockEntityType() { + return AllBlockEntityTypes.TABLE_CLOTH.get(); } private static class PlacementHelper implements IPlacementHelper { @@ -201,7 +201,7 @@ public class DisplayClothBlock extends Block implements IHaveBigOutline, IWrench @Override public Predicate getStatePredicate() { - return s -> s.getBlock() instanceof DisplayClothBlock; + return s -> s.getBlock() instanceof TableClothBlock; } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothBlockEntity.java similarity index 80% rename from src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothBlockEntity.java rename to src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothBlockEntity.java index 58b0e2a20c..02dded2afc 100644 --- a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothBlockEntity.java @@ -1,4 +1,4 @@ -package com.simibubi.create.content.logistics.displayCloth; +package com.simibubi.create.content.logistics.tableCloth; import java.util.ArrayList; import java.util.List; @@ -9,59 +9,62 @@ import javax.annotation.Nullable; import com.simibubi.create.AllItems; import com.simibubi.create.AllPackets; import com.simibubi.create.AllSoundEvents; +import com.simibubi.create.AllTags.AllBlockTags; import com.simibubi.create.content.logistics.BigItemStack; -import com.simibubi.create.content.logistics.displayCloth.ShoppingListItem.ShoppingList; import com.simibubi.create.content.logistics.packager.InventorySummary; import com.simibubi.create.content.logistics.redstoneRequester.AutoRequestData; import com.simibubi.create.content.logistics.stockTicker.StockTickerBlockEntity; +import com.simibubi.create.content.logistics.tableCloth.ShoppingListItem.ShoppingList; import com.simibubi.create.foundation.blockEntity.RemoveBlockEntityPacket; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; +import com.simibubi.create.foundation.blockEntity.behaviour.filtering.FilteringBehaviour; import com.simibubi.create.foundation.utility.CreateLang; import net.createmod.catnip.utility.NBTHelper; -import net.createmod.catnip.utility.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; -import net.minecraft.network.chat.Component; -import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; +import net.minecraft.util.Mth; import net.minecraft.world.Containers; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; -import net.minecraft.world.MenuProvider; -import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.network.NetworkHooks; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; -public class DisplayClothBlockEntity extends SmartBlockEntity implements MenuProvider { +public class TableClothBlockEntity extends SmartBlockEntity { public AutoRequestData requestData; public List manuallyAddedItems; - public ItemStack paymentItem; - public int paymentAmount; public UUID owner; + public Direction facing; + public boolean sideOccluded; + public FilteringBehaviour priceTag; + private List renderedItemsForShop; - public DisplayClothBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { + public TableClothBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); manuallyAddedItems = new ArrayList<>(); requestData = new AutoRequestData(); - paymentItem = ItemStack.EMPTY; - paymentAmount = 1; owner = null; + facing = Direction.SOUTH; } @Override - public void addBehaviours(List behaviours) {} + public void addBehaviours(List behaviours) { + behaviours.add(priceTag = new TableClothFilteringBehaviour(this)); + } public List getItemsForRender() { if (isShop()) { @@ -77,11 +80,21 @@ public class DisplayClothBlockEntity extends SmartBlockEntity implements MenuPro return manuallyAddedItems; } + @Override + public void lazyTick() { + super.lazyTick(); + BlockPos relativePos = worldPosition.relative(facing); + sideOccluded = level.getBlockState(relativePos) + .is(AllBlockTags.TABLE_CLOTHS.tag) + || Block.isFaceFull(level.getBlockState(relativePos.below()) + .getOcclusionShape(level, relativePos.below()), facing.getOpposite()); + } + public boolean isShop() { return !requestData.encodedRequest.isEmpty(); } - public InteractionResult use(Player player) { + public InteractionResult use(Player player, BlockHitResult ray) { if (isShop()) return useShop(player); @@ -93,7 +106,7 @@ public class DisplayClothBlockEntity extends SmartBlockEntity implements MenuPro player.setItemInHand(InteractionHand.MAIN_HAND, manuallyAddedItems.remove(manuallyAddedItems.size() - 1)); if (manuallyAddedItems.isEmpty()) { - level.setBlock(worldPosition, getBlockState().setValue(DisplayClothBlock.HAS_BE, false), 3); + level.setBlock(worldPosition, getBlockState().setValue(TableClothBlock.HAS_BE, false), 3); AllPackets.getChannel() .send(packetTarget(), new RemoveBlockEntityPacket(worldPosition)); } else @@ -106,6 +119,7 @@ public class DisplayClothBlockEntity extends SmartBlockEntity implements MenuPro return InteractionResult.SUCCESS; manuallyAddedItems.add(heldItem.copyWithCount(1)); + facing = player.getDirection(); heldItem.shrink(1); if (heldItem.isEmpty()) player.setItemInHand(InteractionHand.MAIN_HAND, ItemStack.EMPTY); @@ -113,22 +127,16 @@ public class DisplayClothBlockEntity extends SmartBlockEntity implements MenuPro return InteractionResult.SUCCESS; } + public boolean targetsPriceTag(Player player, BlockHitResult ray) { + return priceTag != null && priceTag.mayInteract(player) && priceTag.getSlotPositioning() + .testHit(level, worldPosition, getBlockState(), ray.getLocation() + .subtract(Vec3.atLowerCornerOf(worldPosition))); + } + public InteractionResult useShop(Player player) { if (level.isClientSide()) return InteractionResult.SUCCESS; - if (!owner.equals(player.getUUID()) || (!paymentItem.isEmpty() && !player.isShiftKeyDown())) - return interactAsCustomer(player); - return interactAsOwner(player); - } - - public InteractionResult interactAsOwner(Player player) { - if (player instanceof ServerPlayer sp) - NetworkHooks.openScreen(sp, this, worldPosition); - return InteractionResult.SUCCESS; - } - - public InteractionResult interactAsCustomer(Player player) { ItemStack itemInHand = player.getItemInHand(InteractionHand.MAIN_HAND); ItemStack prevListItem = ItemStack.EMPTY; boolean addOntoList = false; @@ -158,7 +166,7 @@ public class DisplayClothBlockEntity extends SmartBlockEntity implements MenuPro return InteractionResult.SUCCESS; } - if (paymentItem.isEmpty()) { + if (getPaymentItem().isEmpty()) { CreateLang.translate("stock_keeper.no_price_set") .sendStatus(player); AllSoundEvents.DENY.playOnServer(level, worldPosition); @@ -273,8 +281,7 @@ public class DisplayClothBlockEntity extends SmartBlockEntity implements MenuPro protected void write(CompoundTag tag, boolean clientPacket) { super.write(tag, clientPacket); tag.put("Items", NBTHelper.writeItemList(manuallyAddedItems)); - tag.put("Payment", paymentItem.serializeNBT()); - tag.putInt("PaymentAmount", paymentAmount); + tag.putInt("Facing", facing.get2DDataValue()); requestData.write(tag); if (owner != null) tag.putUUID("OwnerUUID", owner); @@ -285,10 +292,14 @@ public class DisplayClothBlockEntity extends SmartBlockEntity implements MenuPro super.read(tag, clientPacket); manuallyAddedItems = NBTHelper.readItemList(tag.getList("Items", Tag.TAG_COMPOUND)); requestData = AutoRequestData.read(tag); - paymentItem = ItemStack.of(tag.getCompound("Payment")); - paymentAmount = tag.getInt("PaymentAmount"); owner = tag.contains("OwnerUUID") ? tag.getUUID("OwnerUUID") : null; + facing = Direction.from2DDataValue(Mth.positiveModulo(tag.getInt("Facing"), 4)); } +// +// @Override +// protected AABB createRenderBoundingBox() { +// return new AABB(worldPosition).inflate(1); +// } @Override public void destroy() { @@ -298,14 +309,13 @@ public class DisplayClothBlockEntity extends SmartBlockEntity implements MenuPro manuallyAddedItems.clear(); } - @Override - public AbstractContainerMenu createMenu(int pContainerId, Inventory pPlayerInventory, Player pPlayer) { - return DisplayClothPricingMenu.create(pContainerId, pPlayerInventory, this); + public ItemStack getPaymentItem() { + return priceTag.getFilter(); } - @Override - public Component getDisplayName() { - return Components.empty(); + public int getPaymentAmount() { + return priceTag.getFilter() + .isEmpty() ? 1 : priceTag.count; } } diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothBlockItem.java b/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothBlockItem.java similarity index 81% rename from src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothBlockItem.java rename to src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothBlockItem.java index 87c9a4852b..4577f254a4 100644 --- a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothBlockItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothBlockItem.java @@ -1,4 +1,4 @@ -package com.simibubi.create.content.logistics.displayCloth; +package com.simibubi.create.content.logistics.tableCloth; import java.util.List; @@ -14,9 +14,9 @@ import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; -public class DisplayClothBlockItem extends BlockItem { +public class TableClothBlockItem extends BlockItem { - public DisplayClothBlockItem(Block pBlock, Properties pProperties) { + public TableClothBlockItem(Block pBlock, Properties pProperties) { super(pBlock, pProperties); } @@ -32,7 +32,7 @@ public class DisplayClothBlockItem extends BlockItem { if (!isFoil(pStack)) return; - CreateLang.translate("display_cloth.shop_configured") + CreateLang.translate("table_cloth.shop_configured") .style(ChatFormatting.GOLD) .addTo(pTooltip); diff --git a/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothFilterSlot.java b/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothFilterSlot.java new file mode 100644 index 0000000000..bab1fb3eaa --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothFilterSlot.java @@ -0,0 +1,35 @@ +package com.simibubi.create.content.logistics.tableCloth; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform; + +import dev.engine_room.flywheel.lib.transform.TransformStack; +import net.createmod.catnip.utility.VecHelper; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction.Axis; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; + +class TableClothFilterSlot extends ValueBoxTransform { + + private TableClothBlockEntity be; + + public TableClothFilterSlot(TableClothBlockEntity be) { + this.be = be; + } + + @Override + public Vec3 getLocalOffset(LevelAccessor level, BlockPos pos, BlockState state) { + Vec3 v = be.sideOccluded ? VecHelper.voxelSpace(8, 0.75, 14.25) : VecHelper.voxelSpace(12, -2.75, 16.75); + return VecHelper.rotateCentered(v, -be.facing.toYRot(), Axis.Y); + } + + @Override + public void rotate(LevelAccessor level, BlockPos pos, BlockState state, PoseStack ms) { + TransformStack.of(ms) + .rotateZDegrees(be.sideOccluded ? -90 : 0) + .rotateYDegrees(180 - be.facing.toYRot()); + } + +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothFilteringBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothFilteringBehaviour.java new file mode 100644 index 0000000000..08d6861142 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothFilteringBehaviour.java @@ -0,0 +1,79 @@ +package com.simibubi.create.content.logistics.tableCloth; + +import com.simibubi.create.content.logistics.filter.FilterItem; +import com.simibubi.create.foundation.blockEntity.behaviour.ValueSettingsBoard; +import com.simibubi.create.foundation.blockEntity.behaviour.ValueSettingsFormatter; +import com.simibubi.create.foundation.blockEntity.behaviour.filtering.FilteringBehaviour; +import com.simibubi.create.foundation.utility.CreateLang; + +import net.createmod.catnip.utility.lang.Components; +import net.minecraft.core.Direction; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.phys.BlockHitResult; + +public class TableClothFilteringBehaviour extends FilteringBehaviour { + + public TableClothFilteringBehaviour(TableClothBlockEntity be) { + super(be, new TableClothFilterSlot(be)); + showCountWhen(() -> !filter.isEmpty()); + withPredicate(is -> !(is.getItem() instanceof FilterItem)); + count = 1; + } + + @Override + public void onShortInteract(Player player, InteractionHand hand, Direction side, BlockHitResult hitResult) { + super.onShortInteract(player, hand, side, hitResult); + } + + @Override + public float getRenderDistance() { + return 32; + } + + private TableClothBlockEntity dbe() { + return (TableClothBlockEntity) blockEntity; + } + + @Override + public boolean mayInteract(Player player) { + return dbe().owner == null || player.getUUID() + .equals(dbe().owner); + } + + @Override + public MutableComponent getLabel() { + return CreateLang.translateDirect("table_cloth.price_per_order"); + } + + @Override + public boolean setFilter(ItemStack stack) { + int before = count; + boolean result = super.setFilter(stack); + count = before; + return result; + } + + @Override + public ValueSettingsBoard createBoard(Player player, BlockHitResult hitResult) { + return new ValueSettingsBoard(getLabel(), 100, 10, CreateLang.translatedOptions("table_cloth", "amount"), + new ValueSettingsFormatter(this::formatValue)); + } + + public MutableComponent formatValue(ValueSettings value) { + return Components.literal(String.valueOf(Math.max(1, value.value()))); + } + + @Override + public MutableComponent getCountLabelForValueBox() { + return Components.literal(isCountVisible() ? String.valueOf(count) : ""); + } + + @Override + public boolean isActive() { + return dbe().isShop(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothModel.java b/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothModel.java similarity index 86% rename from src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothModel.java rename to src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothModel.java index 1f59080804..79bd2905b3 100644 --- a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothModel.java +++ b/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothModel.java @@ -1,4 +1,4 @@ -package com.simibubi.create.content.logistics.displayCloth; +package com.simibubi.create.content.logistics.tableCloth; import java.util.ArrayList; import java.util.EnumSet; @@ -31,13 +31,13 @@ import net.minecraftforge.client.model.data.ModelData; import net.minecraftforge.client.model.data.ModelData.Builder; import net.minecraftforge.client.model.data.ModelProperty; -public class DisplayClothModel extends BakedModelWrapperWithData { +public class TableClothModel extends BakedModelWrapperWithData { private static final ModelProperty CULL_PROPERTY = new ModelProperty<>(); - private static final Map>> CORNERS = new HashMap<>(); + private static final Map>> CORNERS = new HashMap<>(); - public DisplayClothModel(BakedModel originalModel) { + public TableClothModel(BakedModel originalModel) { super(originalModel); } @@ -50,14 +50,14 @@ public class DisplayClothModel extends BakedModelWrapperWithData { return false; } - private List getCorner(DisplayClothBlock block, int corner, @NotNull RandomSource rand, + private List getCorner(TableClothBlock block, int corner, @NotNull RandomSource rand, @Nullable RenderType renderType) { if (!CORNERS.containsKey(block)) { TextureAtlasSprite targetSprite = getParticleIcon(ModelData.EMPTY); List> list = new ArrayList<>(); - for (PartialModel pm : List.of(AllPartialModels.DISPLAY_CLOTH_SW, AllPartialModels.DISPLAY_CLOTH_NW, - AllPartialModels.DISPLAY_CLOTH_NE, AllPartialModels.DISPLAY_CLOTH_SE)) + for (PartialModel pm : List.of(AllPartialModels.TABLE_CLOTH_SW, AllPartialModels.TABLE_CLOTH_NW, + AllPartialModels.TABLE_CLOTH_NE, AllPartialModels.TABLE_CLOTH_SE)) list.add(getCornerQuads(rand, renderType, targetSprite, pm)); CORNERS.put(block, list); @@ -112,7 +112,7 @@ public class DisplayClothModel extends BakedModelWrapperWithData { if (cullData != null && cullData.culled() .contains(side.getClockWise())) return mainQuads; - if (state == null || !(state.getBlock() instanceof DisplayClothBlock dcb)) + if (state == null || !(state.getBlock() instanceof TableClothBlock dcb)) return mainQuads; List copyOf = new ArrayList<>(mainQuads); diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothOverlayRenderer.java b/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothOverlayRenderer.java similarity index 85% rename from src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothOverlayRenderer.java rename to src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothOverlayRenderer.java index 2fb4321e89..24c9c58887 100644 --- a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothOverlayRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothOverlayRenderer.java @@ -1,10 +1,10 @@ -package com.simibubi.create.content.logistics.displayCloth; +package com.simibubi.create.content.logistics.tableCloth; import com.simibubi.create.AllItems; import com.simibubi.create.content.equipment.blueprint.BlueprintOverlayRenderer; -import com.simibubi.create.content.logistics.displayCloth.ShoppingListItem.ShoppingList; import com.simibubi.create.content.logistics.stockTicker.StockTickerBlockEntity; import com.simibubi.create.content.logistics.stockTicker.StockTickerInteractionHandler; +import com.simibubi.create.content.logistics.tableCloth.ShoppingListItem.ShoppingList; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; @@ -15,7 +15,7 @@ import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.HitResult.Type; -public class DisplayClothOverlayRenderer { +public class TableClothOverlayRenderer { public static void tick() { Minecraft mc = Minecraft.getInstance(); @@ -30,10 +30,12 @@ public class DisplayClothOverlayRenderer { if (mouseOver.getType() != Type.ENTITY) { if (!(mouseOver instanceof BlockHitResult bhr)) return; - if (!(mc.level.getBlockEntity(bhr.getBlockPos()) instanceof DisplayClothBlockEntity dcbe)) + if (!(mc.level.getBlockEntity(bhr.getBlockPos()) instanceof TableClothBlockEntity dcbe)) return; if (!dcbe.isShop()) return; + if (dcbe.targetsPriceTag(mc.player, bhr)) + return; int alreadyPurchased = 0; ShoppingList list = ShoppingListItem.getList(heldItem); diff --git a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothRenderer.java b/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothRenderer.java similarity index 55% rename from src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothRenderer.java rename to src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothRenderer.java index 9d7c2286b2..c62e65751c 100644 --- a/src/main/java/com/simibubi/create/content/logistics/displayCloth/DisplayClothRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothRenderer.java @@ -1,30 +1,50 @@ -package com.simibubi.create.content.logistics.displayCloth; +package com.simibubi.create.content.logistics.tableCloth; import java.util.List; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Axis; +import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.logistics.depot.DepotRenderer; import com.simibubi.create.foundation.blockEntity.renderer.SmartBlockEntityRenderer; +import dev.engine_room.flywheel.lib.transform.TransformStack; +import net.createmod.catnip.render.CachedBuffers; import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider.Context; import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.core.Direction; +import net.minecraft.util.Mth; import net.minecraft.world.item.ItemStack; import net.minecraft.world.phys.Vec3; -public class DisplayClothRenderer extends SmartBlockEntityRenderer { +public class TableClothRenderer extends SmartBlockEntityRenderer { - public DisplayClothRenderer(Context context) { + public TableClothRenderer(Context context) { super(context); } @Override - protected void renderSafe(DisplayClothBlockEntity blockEntity, float partialTicks, PoseStack ms, + protected void renderSafe(TableClothBlockEntity blockEntity, float partialTicks, PoseStack ms, MultiBufferSource buffer, int light, int overlay) { super.renderSafe(blockEntity, partialTicks, ms, buffer, light, overlay); List stacks = blockEntity.getItemsForRender(); + float rotationInRadians = Mth.DEG_TO_RAD * (180 - blockEntity.facing.toYRot()); + if (blockEntity.isShop()) { + CachedBuffers + .partial(blockEntity.sideOccluded ? AllPartialModels.TABLE_CLOTH_PRICE_TOP + : AllPartialModels.TABLE_CLOTH_PRICE_SIDE, blockEntity.getBlockState()) + .rotateCentered(rotationInRadians, Direction.UP) + .light(light) + .overlay(overlay) + .renderInto(ms, buffer.getBuffer(RenderType.cutout())); + } + + ms.pushPose(); + TransformStack.of(ms) + .rotateCentered(rotationInRadians, Direction.UP); for (int i = 0; i < stacks.size(); i++) { ItemStack entry = stacks.get(i); ms.pushPose(); @@ -41,6 +61,8 @@ public class DisplayClothRenderer extends SmartBlockEntityRenderer NonNullUnaryOperator> tableCloth(String name, NonNullSupplier initialProps, boolean dyed) { return b -> { - ItemBuilder> item = b.initialProperties(initialProps) + ItemBuilder> item = b.initialProperties(initialProps) .addLayer(() -> RenderType::cutoutMipped) .blockstate((c, p) -> p.simpleBlock(c.get(), p.models() .withExistingParent(name + "_table_cloth", p.modLoc("block/table_cloth/block")) .texture("0", p.modLoc("block/table_cloth/" + name)))) - .onRegister(CreateRegistrate.blockModel(() -> DisplayClothModel::new)) + .onRegister(CreateRegistrate.blockModel(() -> TableClothModel::new)) .tag(AllBlockTags.TABLE_CLOTHS.tag) .onRegisterAfter(Registries.ITEM, v -> ItemDescription.useKey(v, "block.create.table_cloth")) - .item(DisplayClothBlockItem::new); + .item(TableClothBlockItem::new); if (dyed) item.tag(AllItemTags.DYED_TABLE_CLOTHS.tag); diff --git a/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java b/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java index 5e9f55bb5a..24767f34bf 100644 --- a/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java @@ -39,10 +39,10 @@ import com.simibubi.create.content.kinetics.fan.AirCurrent; import com.simibubi.create.content.kinetics.mechanicalArm.ArmInteractionPointHandler; import com.simibubi.create.content.kinetics.turntable.TurntableHandler; import com.simibubi.create.content.logistics.depot.EjectorTargetHandler; -import com.simibubi.create.content.logistics.displayCloth.DisplayClothOverlayRenderer; import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelConnectionHandler; import com.simibubi.create.content.logistics.packagePort.PackagePortTargetSelectionHandler; import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedClientHandler; +import com.simibubi.create.content.logistics.tableCloth.TableClothOverlayRenderer; import com.simibubi.create.content.processing.sequenced.SequencedAssemblyRecipe; import com.simibubi.create.content.redstone.displayLink.ClickToLinkBlockItem; import com.simibubi.create.content.redstone.link.LinkRenderer; @@ -184,7 +184,7 @@ public class ClientEvents { ChainConveyorConnectionHandler.clientTick(); PackagePortTargetSelectionHandler.tick(); LogisticallyLinkedClientHandler.tick(); - DisplayClothOverlayRenderer.tick(); + TableClothOverlayRenderer.tick(); CardboardArmorStealthOverlay.clientTick(); FactoryPanelConnectionHandler.clientTick(); } diff --git a/src/main/resources/assets/create/lang/default/interface.json b/src/main/resources/assets/create/lang/default/interface.json index 63f8ae7a54..3832fd6f74 100644 --- a/src/main/resources/assets/create/lang/default/interface.json +++ b/src/main/resources/assets/create/lang/default/interface.json @@ -362,11 +362,13 @@ "create.gui.stock_ticker.delete_category": "Delete Category", "create.gui.stock_ticker.empty_category_name_placeholder": "(Empty)", - "create.display_cloth.shop_configured": "Item shop configured", - "create.display_cloth.total_cost": "Total cost: ", - "create.display_cloth.hand_to_shop_keeper": "Hand this to a shop keeper", - "create.display_cloth.sneak_click_discard": "Sneak-Click to discard", - "create.display_cloth.shopping_list_discarded": "Shopping list discarded", + "create.table_cloth.price_per_order": "Price per Order", + "create.table_cloth.amount": "Amount", + "create.table_cloth.shop_configured": "Item shop configured", + "create.table_cloth.total_cost": "Total cost: ", + "create.table_cloth.hand_to_shop_keeper": "Hand this to a shop keeper", + "create.table_cloth.sneak_click_discard": "Sneak-Click to discard", + "create.table_cloth.shopping_list_discarded": "Shopping list discarded", "create.gui.address_box.clipboard_tip": "Keeping Track", "create.gui.address_box.clipboard_tip_1": "Entries starting with '#' on", diff --git a/src/main/resources/assets/create/models/block/table_cloth/price_tag_side.json b/src/main/resources/assets/create/models/block/table_cloth/price_tag_side.json new file mode 100644 index 0000000000..ea0c459ca7 --- /dev/null +++ b/src/main/resources/assets/create/models/block/table_cloth/price_tag_side.json @@ -0,0 +1,62 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "1": "create:block/table_cloth/price_tag", + "particle": "create:block/table_cloth/red" + }, + "elements": [ + { + "from": [1, -5.75, -1.25], + "to": [7, 1.25, -0.25], + "rotation": {"angle": 0, "axis": "y", "origin": [5, -0.75, -2.25]}, + "faces": { + "north": {"uv": [0, 0, 6, 7], "texture": "#1"}, + "up": {"uv": [0, 0, 6, 1], "texture": "#1"} + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 3.25], + "scale": [0.375, 0.375, 0.375] + }, + "thirdperson_lefthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 3.5], + "scale": [0.375, 0.375, 0.375] + }, + "firstperson_righthand": { + "rotation": [0, 45, 0], + "translation": [0, 3.25, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 45, 0], + "translation": [0, 3.25, 0], + "scale": [0.4, 0.4, 0.4] + }, + "ground": { + "translation": [0, 3.5, 0], + "scale": [0.25, 0.25, 0.25] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0, 6.75, 0], + "scale": [0.625, 0.625, 0.625] + }, + "fixed": { + "translation": [0, 5.75, 0], + "scale": [0.5, 0.5, 0.5] + } + }, + "groups": [ + { + "name": "group", + "origin": [8, 8, 8], + "color": 0, + "children": [0] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/table_cloth/price_tag_top.json b/src/main/resources/assets/create/models/block/table_cloth/price_tag_top.json new file mode 100644 index 0000000000..edbfa3dd42 --- /dev/null +++ b/src/main/resources/assets/create/models/block/table_cloth/price_tag_top.json @@ -0,0 +1,62 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "1": "create:block/table_cloth/price_tag", + "particle": "create:block/table_cloth/red" + }, + "elements": [ + { + "from": [5, 0.25, -1.25], + "to": [11, 1.25, 4.75], + "rotation": {"angle": 0, "axis": "y", "origin": [5, 0.25, -1.25]}, + "faces": { + "north": {"uv": [7, 1, 13, 2], "texture": "#1"}, + "up": {"uv": [7, 1, 13, 7], "texture": "#1"} + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 3.25], + "scale": [0.375, 0.375, 0.375] + }, + "thirdperson_lefthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 3.5], + "scale": [0.375, 0.375, 0.375] + }, + "firstperson_righthand": { + "rotation": [0, 45, 0], + "translation": [0, 3.25, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 45, 0], + "translation": [0, 3.25, 0], + "scale": [0.4, 0.4, 0.4] + }, + "ground": { + "translation": [0, 3.5, 0], + "scale": [0.25, 0.25, 0.25] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0, 6.75, 0], + "scale": [0.625, 0.625, 0.625] + }, + "fixed": { + "translation": [0, 5.75, 0], + "scale": [0.5, 0.5, 0.5] + } + }, + "groups": [ + { + "name": "group", + "origin": [8, 8, 8], + "color": 0, + "children": [0] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/block/table_cloth/price_tag.png b/src/main/resources/assets/create/textures/block/table_cloth/price_tag.png new file mode 100644 index 0000000000000000000000000000000000000000..f32cfa0cff8bd4d1ab7f09392c1a7aa253ed3249 GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}f0G|-oqOzuH>8hnbncP$zS0Ke+666>B9}F0zyqVpA zLYxI2k;M!QdI})ScvVJD8YpP*>Ealo5q!3Xk&8irgSqtDzyD9RaVfoEl;wFkg;nyD zq6Fv6tVKFnj8jZ&F4TWpm)pNxK&*I2^47UQPap9+@_BQzJW~*OegJ3`gQu&X%Q~lo FCIGW_Lt6j< literal 0 HcmV?d00001 From ef1f494c08294b65bc99d9527bfdaa91ab2c7ebe Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Wed, 27 Nov 2024 19:54:22 +0100 Subject: [PATCH 145/515] Kryppers and Keepers - New design for Stock keeper UI --- .../content/logistics/AddressEditBox.java | 2 +- .../stockTicker/StockTickerRequestScreen.java | 210 ++++++++++-------- .../create/foundation/gui/AllGuiTextures.java | 21 +- .../create/textures/gui/stock_keeper.png | Bin 1645 -> 3095 bytes .../assets/create/textures/gui/widgets.png | Bin 12014 -> 11596 bytes 5 files changed, 132 insertions(+), 101 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/AddressEditBox.java b/src/main/java/com/simibubi/create/content/logistics/AddressEditBox.java index 6c967db507..b1103e7ef4 100644 --- a/src/main/java/com/simibubi/create/content/logistics/AddressEditBox.java +++ b/src/main/java/com/simibubi/create/content/logistics/AddressEditBox.java @@ -80,7 +80,7 @@ public class AddressEditBox extends EditBox { return; int itemX = getX() + width + 4; - int itemY = getY() - 3; + int itemY = getY() - 4; pGuiGraphics.renderItem(AllBlocks.CLIPBOARD.asStack(), itemX, itemY); if (pMouseX >= itemX && pMouseX < itemX + 16 && pMouseY >= itemY && pMouseY < itemY + 16) { List promiseTip = List.of(); diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java index 3f1d3e2e3b..5e771168bc 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java @@ -49,7 +49,6 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.EditBox; import net.minecraft.client.gui.screens.inventory.InventoryScreen; -import net.minecraft.client.renderer.RenderType; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; @@ -166,22 +165,22 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre int y = guiTop; itemsX = x + (windowWidth - cols * colWidth) / 2 + 1; - itemsY = y + 35; - orderY = y + windowHeight - 60; - lockX = x + 230; - lockY = y + 15; + itemsY = y + 33; + orderY = y + windowHeight - 72; + lockX = x + 200; + lockY = y + 18; MutableComponent searchLabel = CreateLang.translateDirect("gui.stock_keeper.search_items"); - searchBox = new EditBox(this.font, x + 81, y + 25, 110, 9, searchLabel); + searchBox = new EditBox(new NoShadowFontWrapper(font), x + 86, y + 22, 100, 9, searchLabel); searchBox.setMaxLength(50); searchBox.setBordered(false); - searchBox.setTextColor(0xffffff); + searchBox.setTextColor(0x4A2D31); addWidget(searchBox); boolean initial = addressBox == null; addressBox = - new AddressEditBox(this, new NoShadowFontWrapper(font), x + 60, y + windowHeight - 32, 112, 10, true); - addressBox.setTextColor(0x555555); + new AddressEditBox(this, new NoShadowFontWrapper(font), x + 42, y + windowHeight - 36, 90, 10, true); + addressBox.setTextColor(0x714A40); if (initial) addressBox.setValue(blockEntity.previouslyUsedAddress); addRenderableWidget(addressBox); @@ -343,7 +342,6 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre @Override protected void renderWindow(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { PoseStack ms = graphics.pose(); - Color color = new Color(255, 255, 255, 50); float currentScroll = itemScroll.getValue(partialTicks); Couple hoveredSlot = getHoveredSlot(mouseX, mouseY); @@ -373,7 +371,7 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre ms.translate(0, 0, 300); entitySizeOffset = (int) (Math.max(0, keeper.getBoundingBox() .getXsize() - 1) * 50); - int entityX = x + windowWidth + 10 + entitySizeOffset; + int entityX = x - 10 - entitySizeOffset; int entityY = y + windowHeight - 70; AllGuiTextures.STOCK_KEEPER_REQUEST_SAYS.render(graphics, x + 226, entityY - (int) (keeper.getEyeHeight(Pose.STANDING) * 50) / 2 * 2); @@ -385,7 +383,7 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre BlazeBurnerBlockEntity keeperBE = blaze.get(); if (keeperBE != null && !keeperBE.isRemoved()) { ms.pushPose(); - int entityX = x + windowWidth + 10; + int entityX = x - 10; int entityY = y + windowHeight - 80; AllGuiTextures.STOCK_KEEPER_REQUEST_SAYS.render(graphics, x + 226, (entityY - 22) / 2 * 2); ms.translate(entityX, entityY, 300); @@ -393,7 +391,7 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre ms.mulPose(Axis.YP.rotationDegrees(-45)); ms.scale(48, -48, 48); float animation = keeperBE.headAnimation.getValue(AnimationTickHolder.getPartialTicks()) * .175f; - float horizontalAngle = AngleHelper.rad(180); + float horizontalAngle = AngleHelper.rad(270); HeatLevel heatLevel = keeperBE.getHeatLevelForRender(); boolean canDrawFlame = heatLevel.isAtLeast(HeatLevel.FADING); boolean drawGoggles = keeperBE.goggles; @@ -409,27 +407,28 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre // Render static item icons ms.pushPose(); - ms.translate(x - 30, y + windowHeight - 80, 0); + ms.translate(x + windowWidth - 10, y + windowHeight - 65, 0); ms.scale(3.5f, 3.5f, 3.5f); GuiGameElement .of(encodeRequester ? AllBlocks.REDSTONE_REQUESTER.asStack() : AllItems.CARDBOARD_PACKAGE_12x12.asStack()) .render(graphics); ms.popPose(); - ms.pushPose(); - ms.translate(x + windowWidth + 39 + entitySizeOffset, y + windowHeight - 105, 0); - ms.scale(2.25f, 2.25f, 2.25f); - GuiGameElement.of(AllBlocks.PACKAGER.asStack()) - .render(graphics); - ms.translate(0, -9, 15); - GuiGameElement.of(AllBlocks.STOCK_LINK.asStack()) - .render(graphics); - ms.popPose(); - ms.pushPose(); - ms.translate(0, 0, 300); - graphics.drawString(font, CreateLang.text(blockEntity.activeLinks + "") - .component(), x + windowWidth + 76 + entitySizeOffset, y + windowHeight - 105, 0x88dddddd); - ms.popPose(); + // Linked packager count +// ms.pushPose(); +// ms.translate(x + windowWidth + 39 + entitySizeOffset, y + windowHeight - 105, 0); +// ms.scale(2.25f, 2.25f, 2.25f); +// GuiGameElement.of(AllBlocks.PACKAGER.asStack()) +// .render(graphics); +// ms.translate(0, -9, 15); +// GuiGameElement.of(AllBlocks.STOCK_LINK.asStack()) +// .render(graphics); +// ms.popPose(); +// ms.pushPose(); +// ms.translate(0, 0, 300); +// graphics.drawString(font, CreateLang.text(blockEntity.activeLinks + "") +// .component(), x + windowWidth + 76 + entitySizeOffset, y + windowHeight - 105, 0x88dddddd); +// ms.popPose(); // Render ordered items for (int index = 0; index < cols; index++) { @@ -445,30 +444,35 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre ms.popPose(); } + if (isConfirmHovered(mouseX, mouseY)) + AllGuiTextures.STOCK_KEEPER_REQUEST_SEND_HOVER.render(graphics, x + windowWidth - 96, + y + windowHeight - 41); + MutableComponent headerTitle = CreateLang.translate("gui.stock_keeper.title") .component(); - graphics.drawString(font, headerTitle, x + windowWidth / 2 - font.width(headerTitle) / 2, y + 4, 0x505050, + graphics.drawString(font, headerTitle, x + windowWidth / 2 - font.width(headerTitle) / 2, y + 4, 0x714A40, false); - graphics.drawString(font, + MutableComponent component = CreateLang.translate(encodeRequester ? "gui.stock_keeper.configure" : "gui.stock_keeper.send") - .component(), - x + windowWidth - 52, y + windowHeight - 32, isConfirmHovered(mouseX, mouseY) ? 0xffffff : 0x505050, false); + .component(); + graphics.drawString(font, component, x + windowWidth - 57 - font.width(component) / 2, y + windowHeight - 35, + 0x252525, false); // Request just sent - if (itemsToOrder.isEmpty() && successTicks > 0) { - Component msg = CreateLang.translateDirect("gui.stock_keeper.request_sent"); - float alpha = Mth.clamp((successTicks - 10f) / 5f, 0f, 1f); - if (alpha > 0) - graphics.drawString(font, msg, x + windowWidth / 2 - font.width(msg) / 2, orderY + 4, - new Color(0x7A5A3A).setAlpha(alpha) - .getRGB(), - false); - } +// if (itemsToOrder.isEmpty() && successTicks > 0) { +// Component msg = CreateLang.translateDirect("gui.stock_keeper.request_sent"); +// float alpha = Mth.clamp((successTicks - 10f) / 5f, 0f, 1f); +// if (alpha > 0) +// graphics.drawString(font, msg, x + windowWidth / 2 - font.width(msg) / 2, orderY + 4, +// new Color(0x7A5A3A).setAlpha(alpha) +// .getRGB(), +// false); +// } int itemWindowX = x + 36; int itemWindowX2 = itemWindowX + 184; - int itemWindowY = y + 16; - int itemWindowY2 = y + windowHeight - 68; + int itemWindowY = y + 17; + int itemWindowY2 = y + windowHeight - 80; UIRenderHelper.swapAndBlitColor(minecraft.getMainRenderTarget(), UIRenderHelper.framebuffer); startStencil(graphics, itemWindowX - 5, itemWindowY, itemWindowX2 - itemWindowX + 10, @@ -477,13 +481,23 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre ms.pushPose(); ms.translate(0, -currentScroll * rowHeight, 0); + // BG + for (int sliceY = -2; sliceY < getMaxScroll() * rowHeight + windowHeight - 72; sliceY += + AllGuiTextures.STOCK_KEEPER_REQUEST_BG.getHeight()) { + if (sliceY - currentScroll * rowHeight < -20) + continue; + if (sliceY - currentScroll * rowHeight > windowHeight - 72) + continue; + AllGuiTextures.STOCK_KEEPER_REQUEST_BG.render(graphics, x + 37, y + sliceY + 18); + } + // Search bar - AllGuiTextures.STOCK_KEEPER_REQUEST_SEARCH.render(graphics, x, searchBox.getY() - 4); + AllGuiTextures.STOCK_KEEPER_REQUEST_SEARCH.render(graphics, x + 57, searchBox.getY() - 5); searchBox.render(graphics, mouseX, mouseY, partialTicks); if (searchBox.getValue() - .isBlank()) + .isBlank() && !searchBox.isFocused()) graphics.drawString(font, searchBox.getMessage(), - x + windowWidth / 2 - font.width(searchBox.getMessage()) / 2, searchBox.getY(), 0x88dddddd); + x + windowWidth / 2 - font.width(searchBox.getMessage()) / 2, searchBox.getY(), 0xff4A2D31, false); // Something isnt right boolean allEmpty = true; @@ -492,9 +506,16 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre if (allEmpty) { Component msg = getTroubleshootingMessage(); float alpha = Mth.clamp((emptyTicks - 10f) / 5f, 0f, 1f); - if (alpha > 0) + if (alpha > 0) { + graphics.drawString(font, msg, x + windowWidth / 2 - font.width(msg) / 2 + 1, itemsY + 20 + 1, + new Color(0x4A2D31).setAlpha(alpha) + .getRGB(), + false); graphics.drawString(font, msg, x + windowWidth / 2 - font.width(msg) / 2, itemsY + 20, - new Color(.8f, .8f, .8f, alpha).getRGB()); + new Color(0xF8F8EC).setAlpha(alpha) + .getRGB(), + false); + } } // Items @@ -506,9 +527,12 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre if (category.isEmpty()) continue; - if (!categories.isEmpty()) + if (!categories.isEmpty()) { graphics.drawString(font, categories.get(categoryIndex) - .getFirst(), itemsX + 4, itemsY + categoryY + 6, 0xFF_FFFFFF); + .getFirst(), itemsX + 5, itemsY + categoryY + 8, 0x4A2D31, false); + graphics.drawString(font, categories.get(categoryIndex) + .getFirst(), itemsX + 4, itemsY + categoryY + 7, 0xF8F8EC, false); + } for (int index = 0; index < category.size(); index++) { int pY = itemsY + categoryY + (categories.isEmpty() ? 4 : rowHeight) + (index / cols) * rowHeight; @@ -516,7 +540,7 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre if (cullY < y) continue; - if (cullY > y + windowHeight - 60) + if (cullY > y + windowHeight - 72) break; boolean isStackHovered = index == hoveredSlot.getSecond() && categoryIndex == hoveredSlot.getFirst(); @@ -529,17 +553,30 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre } } + // Render lock option + if (isAdmin) + (isLocked ? AllGuiTextures.STOCK_KEEPER_REQUEST_LOCKED : AllGuiTextures.STOCK_KEEPER_REQUEST_UNLOCKED) + .render(graphics, lockX, lockY); + ms.popPose(); endStencil(); // Scroll bar - int windowH = windowHeight - 84; + int windowH = windowHeight - 92; int totalH = getMaxScroll() * rowHeight + windowH; - int barSize = Mth.floor((float) windowH / totalH * (windowH - 2)); + int barSize = Math.max(5, Mth.floor((float) windowH / totalH * (windowH - 2))); if (barSize < windowH - 2) { + int barX = itemsX + cols * colWidth; + int barY = y + 15; ms.pushPose(); ms.translate(0, (currentScroll * rowHeight) / totalH * (windowH - 2), 0); - graphics.renderOutline(itemsX + cols * colWidth + 2, y + 17, 1, barSize, color.getRGB()); + AllGuiTextures pad = AllGuiTextures.STOCK_KEEPER_REQUEST_SCROLL_PAD; + graphics.blit(pad.location, barX, barY, pad.getWidth(), barSize, pad.getStartX(), pad.getStartY(), + pad.getWidth(), pad.getHeight(), 256, 256); + AllGuiTextures.STOCK_KEEPER_REQUEST_SCROLL_TOP.render(graphics, barX, barY); + if (barSize > 16) + AllGuiTextures.STOCK_KEEPER_REQUEST_SCROLL_MID.render(graphics, barX, barY + barSize / 2 - 4); + AllGuiTextures.STOCK_KEEPER_REQUEST_SCROLL_BOT.render(graphics, barX, barY + barSize - 5); ms.popPose(); } @@ -551,39 +588,27 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre .get(hoveredSlot.getSecond()).stack, mouseX, mouseY); - RenderSystem.enableBlend(); - int zLevel = 200; - graphics.fillGradient(itemWindowX, itemWindowY, itemWindowX2, itemWindowY + 10, zLevel, 0x77000000, 0x00000000); - graphics.fillGradient(itemWindowX, itemWindowY2 - 10, itemWindowX2, itemWindowY2, zLevel, 0x00000000, - 0x77000000); + // Render tooltip of lock option + if (currentScroll < 1 && isAdmin && mouseX > lockX && mouseX <= lockX + 15 && mouseY > lockY + && mouseY <= lockY + 15) { + graphics.renderComponentTooltip(font, + List.of( + CreateLang.translate(isLocked ? "gui.stock_keeper.network_locked" : "gui.stock_keeper.network_open") + .component(), + CreateLang.translate("gui.stock_keeper.network_lock_tip") + .style(ChatFormatting.GRAY) + .component(), + CreateLang.translate("gui.stock_keeper.network_lock_tip_1") + .style(ChatFormatting.GRAY) + .component(), + CreateLang.translate("gui.stock_keeper.network_lock_tip_2") + .style(ChatFormatting.DARK_GRAY) + .style(ChatFormatting.ITALIC) + .component()), + mouseX, mouseY); + } UIRenderHelper.swapAndBlitColor(UIRenderHelper.framebuffer, minecraft.getMainRenderTarget()); - - // Render lock option - if (isAdmin) { - (isLocked ? AllGuiTextures.STOCK_KEEPER_REQUEST_LOCKED : AllGuiTextures.STOCK_KEEPER_REQUEST_UNLOCKED) - .render(graphics, lockX, lockY); - if (mouseX > lockX && mouseX <= lockX + 15 && mouseY > lockY && mouseY <= lockY + 15) { - graphics - .renderComponentTooltip(font, - List.of( - CreateLang - .translate( - isLocked ? "gui.stock_keeper.network_locked" : "gui.stock_keeper.network_open") - .component(), - CreateLang.translate("gui.stock_keeper.network_lock_tip") - .style(ChatFormatting.GRAY) - .component(), - CreateLang.translate("gui.stock_keeper.network_lock_tip_1") - .style(ChatFormatting.GRAY) - .component(), - CreateLang.translate("gui.stock_keeper.network_lock_tip_2") - .style(ChatFormatting.DARK_GRAY) - .style(ChatFormatting.ITALIC) - .component()), - mouseX, mouseY); - } - } } private void renderItemEntry(GuiGraphics graphics, float scale, BigItemStack entry, boolean isStackHovered, @@ -594,9 +619,7 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre BigItemStack order = getOrderForItem(entry.stack); if (order != null) customCount -= order.count; - - graphics.renderOutline(0, 0, 18, 18, - isStackHovered ? 0x44_ffffff : customCount != entry.count ? 0x22_ffffff : 0x22_000000); + AllGuiTextures.STOCK_KEEPER_REQUEST_SLOT.render(graphics, 0, 0); } PoseStack ms = graphics.pose(); @@ -754,10 +777,10 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre } private boolean isConfirmHovered(int mouseX, int mouseY) { - int confirmX = addressBox.getX() + addressBox.getWidth() + 25; - int confirmY = addressBox.getY() - 4; - int confirmW = 40; - int confirmH = addressBox.getHeight() + 7; + int confirmX = guiLeft + 161; + int confirmY = guiTop + windowHeight - 39; + int confirmW = 78; + int confirmH = 18; if (mouseX < confirmX || mouseX >= confirmX + confirmW) return false; @@ -798,7 +821,8 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre boolean lmb = pButton == 0; boolean rmb = pButton == 1; - if (lmb && pMouseX > lockX && pMouseX <= lockX + 15 && pMouseY > lockY && pMouseY <= lockY + 15) { + if (isAdmin && itemScroll.getChaseTarget() == 0 && lmb && pMouseX > lockX && pMouseX <= lockX + 15 + && pMouseY > lockY && pMouseY <= lockY + 15) { isLocked = !isLocked; AllPackets.getChannel() .sendToServer(new StockKeeperLockPacket(blockEntity.getBlockPos(), isLocked)); diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java index 603fd81507..bce4719d32 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java @@ -161,14 +161,21 @@ public enum AllGuiTextures implements ScreenElement, TextureSheetSegment { FACTORY_PANEL_ARROW("restocker_and_requester", 27, 108, 22, 16), FACTORY_PANEL_ARROW_FILLED("restocker_and_requester", 50, 108, 22, 16), - STOCK_KEEPER_REQUEST_HEADER("stock_keeper", 256, 22), - STOCK_KEEPER_REQUEST_BODY("stock_keeper", 0, 23, 256, 20), - STOCK_KEEPER_REQUEST_FOOTER("stock_keeper", 0, 44, 256, 74), - STOCK_KEEPER_REQUEST_SEARCH("stock_keeper", 0, 137, 256, 15), + STOCK_KEEPER_REQUEST_HEADER("stock_keeper", 0, 0, 256, 36), + STOCK_KEEPER_REQUEST_BODY("stock_keeper", 0, 48, 256, 20), + STOCK_KEEPER_REQUEST_FOOTER("stock_keeper", 0, 80, 256, 80), + STOCK_KEEPER_REQUEST_SEARCH("stock_keeper", 57, 17, 142, 18), STOCK_KEEPER_REQUEST_SAYS("stock_keeper", 4, 163, 8, 16), - STOCK_KEEPER_REQUEST_LOCKED("stock_keeper", 29, 163, 15, 15), - STOCK_KEEPER_REQUEST_UNLOCKED("stock_keeper", 45, 163, 15, 15), - NUMBERS("widgets", 100, 20, 5, 8), + STOCK_KEEPER_REQUEST_LOCKED("stock_keeper", 16, 176, 15, 15), + STOCK_KEEPER_REQUEST_UNLOCKED("stock_keeper", 32, 176, 15, 15), + STOCK_KEEPER_REQUEST_SLOT("stock_keeper", 32, 200, 18, 18), + STOCK_KEEPER_REQUEST_SEND_HOVER("stock_keeper", 55, 200, 80, 20), + STOCK_KEEPER_REQUEST_SCROLL_TOP("stock_keeper", 219, 192, 5, 4), + STOCK_KEEPER_REQUEST_SCROLL_PAD("stock_keeper", 219, 196, 5, 1), + STOCK_KEEPER_REQUEST_SCROLL_MID("stock_keeper", 219, 197, 5, 9), + STOCK_KEEPER_REQUEST_SCROLL_BOT("stock_keeper", 219, 207, 5, 5), + STOCK_KEEPER_REQUEST_BG("stock_keeper", 37, 48, 182, 20), + NUMBERS("stock_keeper", 48, 176, 5, 8), STOCK_KEEPER_CATEGORY("stock_keeper_categories", 210, 190), STOCK_KEEPER_CATEGORY_HEADER("stock_keeper_categories", 202, 15), diff --git a/src/main/resources/assets/create/textures/gui/stock_keeper.png b/src/main/resources/assets/create/textures/gui/stock_keeper.png index 71382df3e38abf77f2f1ace3ad337f0db09a5448..a0350abeaae8f3f26521c73dc4366d08bd5f875f 100644 GIT binary patch literal 3095 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 V4|=Z+KR~`(;O2bfaFr7?^G_W_#I^tc diff --git a/src/main/resources/assets/create/textures/gui/widgets.png b/src/main/resources/assets/create/textures/gui/widgets.png index 0e8ca0bcfc5800ed30cc5bf7cc4cd91a28a995ac..81d94b961dc278b30214783dbd31fa8a27475b33 100644 GIT binary patch literal 11596 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 From 8b94639b6dc57ba36fbff41cfad3fee4ef1a7fc4 Mon Sep 17 00:00:00 2001 From: Kryppers <65094918+Kryppers@users.noreply.github.com> Date: Thu, 28 Nov 2024 11:36:24 +0000 Subject: [PATCH 146/515] stock check Minor tweaks to the stock keeper UI --- .../create/textures/gui/stock_keeper.png | Bin 3095 -> 5204 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/create/textures/gui/stock_keeper.png b/src/main/resources/assets/create/textures/gui/stock_keeper.png index a0350abeaae8f3f26521c73dc4366d08bd5f875f..42f8a407f61ab423f1137df7d561beaea561a8b5 100644 GIT binary patch literal 5204 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 literal 3095 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 Date: Thu, 28 Nov 2024 09:48:42 -0500 Subject: [PATCH 147/515] Risky spell casting - Fix ClassCastExpression suppression - Fix #7176 --- .../mixin/ShulkerBoxBlockMixin.java | 19 +++++++++++++++++++ src/main/resources/create.mixins.json | 1 + 2 files changed, 20 insertions(+) create mode 100644 src/main/java/com/simibubi/create/foundation/mixin/ShulkerBoxBlockMixin.java diff --git a/src/main/java/com/simibubi/create/foundation/mixin/ShulkerBoxBlockMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/ShulkerBoxBlockMixin.java new file mode 100644 index 0000000000..ed3102bbe2 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/mixin/ShulkerBoxBlockMixin.java @@ -0,0 +1,19 @@ +package com.simibubi.create.foundation.mixin; + +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; + +import net.minecraft.world.Container; +import net.minecraft.world.level.block.ShulkerBoxBlock; + +import net.minecraft.world.level.block.entity.BlockEntity; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(ShulkerBoxBlock.class) +public class ShulkerBoxBlockMixin { + @ModifyExpressionValue(method = "getAnalogOutputSignal",at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/Level;getBlockEntity(Lnet/minecraft/core/BlockPos;)Lnet/minecraft/world/level/block/entity/BlockEntity;")) + private BlockEntity create$backportCCESuppressionFix(BlockEntity original) { + return original instanceof Container ? original : null; + } +} diff --git a/src/main/resources/create.mixins.json b/src/main/resources/create.mixins.json index b0f46c966b..447aff9543 100644 --- a/src/main/resources/create.mixins.json +++ b/src/main/resources/create.mixins.json @@ -15,6 +15,7 @@ "LavaSwimmingMixin", "MainMixin", "MapItemSavedDataMixin", + "ShulkerBoxBlockMixin", "TestCommandMixin", "WaterWheelFluidSpreadMixin", "accessor.AbstractProjectileDispenseBehaviorAccessor", From 8d38a411b6e2bcefe1df3340575dcc0faf1586fa Mon Sep 17 00:00:00 2001 From: zelophed Date: Fri, 29 Nov 2024 20:47:14 +0100 Subject: [PATCH 148/515] consistent order for states in wrench menu --- .../contraptions/wrench/RadialWrenchMenu.java | 36 ++++++++++++++----- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchMenu.java b/src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchMenu.java index c6ef81e7b1..e23b1709ab 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchMenu.java +++ b/src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchMenu.java @@ -28,6 +28,7 @@ import com.simibubi.create.content.kinetics.base.HorizontalAxisKineticBlock; import com.simibubi.create.content.kinetics.base.HorizontalKineticBlock; import com.simibubi.create.content.kinetics.base.RotatedPillarKineticBlock; import com.simibubi.create.content.kinetics.transmission.sequencer.SequencedGearshiftBlock; +import com.simibubi.create.content.redstone.DirectedDirectionalBlock; import com.simibubi.create.foundation.gui.AllIcons; import dev.engine_room.flywheel.lib.transform.TransformStack; @@ -63,6 +64,7 @@ public class RadialWrenchMenu extends AbstractSimiScreen { registerRotationProperty(HorizontalAxisKineticBlock.HORIZONTAL_AXIS, "Axis"); registerRotationProperty(HorizontalKineticBlock.HORIZONTAL_FACING, "Facing"); registerRotationProperty(HopperBlock.FACING, "Facing"); + registerRotationProperty(DirectedDirectionalBlock.TARGET, "Target"); registerRotationProperty(SequencedGearshiftBlock.VERTICAL, "Vertical"); } @@ -132,22 +134,40 @@ public class RadialWrenchMenu extends AbstractSimiScreen { Map.Entry, String> entry = propertiesForState.get(selectedPropertyIndex); allStates = new ArrayList<>(); - allStates.add(state); - cycleAllPropertyValues(entry.getKey(), allStates); + //allStates.add(state); + cycleAllPropertyValues(state, entry.getKey(), allStates); propertyLabel = entry.getValue(); } - private static void cycleAllPropertyValues(Property property, List states) { - while (true) { - BlockState lastState = states.get(states.size() - 1); - BlockState cycledState = lastState.cycle(property); + private void cycleAllPropertyValues(BlockState state, Property property, List states) { + Optional> first = property.getPossibleValues().stream().findFirst(); + if (first.isEmpty()) + return; - if (states.contains(cycledState)) + int offset = 0; + int safety = 100; + while (safety-- > 0) { + if (state.getValue(property).equals(first.get())) { + offset = 99 - safety; + break; + } + + state = state.cycle(property); + } + + safety = 100; + while (safety-- > 0) { + if (states.contains(state)) break; - states.add(cycledState); + states.add(state); + + state = state.cycle(property); } + + offset = Mth.clamp(offset, 0, states.size() - 1); + selectedStateIndex = (offset == 0) ? 0 : (states.size() - offset); } @Override From 06f34d3a2327564116aaf3f91ac839a580d12501 Mon Sep 17 00:00:00 2001 From: Kryppers <65094918+Kryppers@users.noreply.github.com> Date: Fri, 29 Nov 2024 21:29:09 +0000 Subject: [PATCH 149/515] Packing peanuts Updated the card armour on the correct repository tweaked conveyor bullwheel updated ticker model Updated panel model and textures tweaks to stock keeper UI --- .../block/factory_gauge/bulb_light.json | 12 +- .../models/block/factory_gauge/panel.json | 32 ++- .../block/factory_gauge/panel_with_bulb.json | 35 +++- .../create/models/block/stock_ticker.json | 198 +++++++++--------- .../create/textures/block/basin_canal.png | Bin 241 -> 295 bytes .../create/textures/block/bullwheel.png | Bin 601 -> 586 bytes .../create/textures/block/factory_panel.png | Bin 478 -> 477 bytes .../block/factory_panel_packager_mode.png | Bin 468 -> 550 bytes .../create/textures/block/stock_ticker.png | Bin 1122 -> 1522 bytes .../create/textures/gui/stock_keeper.png | Bin 5204 -> 5136 bytes .../textures/gui/stock_keeper_categories.png | Bin 1431 -> 1094 bytes .../create/textures/item/cardboard_boots.png | Bin 224 -> 291 bytes .../textures/item/cardboard_chestplate.png | Bin 251 -> 327 bytes .../create/textures/item/cardboard_helmet.png | Bin 224 -> 277 bytes .../textures/item/cardboard_leggings.png | Bin 234 -> 270 bytes .../models/armor/cardboard_layer_1.png | Bin 563 -> 1017 bytes .../models/armor/cardboard_layer_2.png | Bin 278 -> 610 bytes 17 files changed, 156 insertions(+), 121 deletions(-) diff --git a/src/main/resources/assets/create/models/block/factory_gauge/bulb_light.json b/src/main/resources/assets/create/models/block/factory_gauge/bulb_light.json index 57e05a3be1..a601853c99 100644 --- a/src/main/resources/assets/create/models/block/factory_gauge/bulb_light.json +++ b/src/main/resources/assets/create/models/block/factory_gauge/bulb_light.json @@ -10,12 +10,12 @@ "to": [2, 3, 8], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [3, 8, 5, 10], "texture": "#0"}, - "east": {"uv": [3, 8, 5, 10], "rotation": 90, "texture": "#0"}, - "south": {"uv": [3, 8, 5, 10], "rotation": 270, "texture": "#0"}, - "west": {"uv": [3, 8, 5, 10], "texture": "#0"}, - "up": {"uv": [3, 8, 5, 10], "rotation": 180, "texture": "#0"}, - "down": {"uv": [3, 8, 5, 10], "texture": "#0"} + "north": {"uv": [9, 8, 11, 10], "texture": "#0"}, + "east": {"uv": [9, 8, 11, 10], "rotation": 90, "texture": "#0"}, + "south": {"uv": [9, 8, 11, 10], "rotation": 270, "texture": "#0"}, + "west": {"uv": [9, 9, 11, 11], "texture": "#0"}, + "up": {"uv": [9, 8, 11, 10], "rotation": 180, "texture": "#0"}, + "down": {"uv": [9, 8, 11, 10], "texture": "#0"} } } ] diff --git a/src/main/resources/assets/create/models/block/factory_gauge/panel.json b/src/main/resources/assets/create/models/block/factory_gauge/panel.json index f0b0f9ae91..9310eaacd6 100644 --- a/src/main/resources/assets/create/models/block/factory_gauge/panel.json +++ b/src/main/resources/assets/create/models/block/factory_gauge/panel.json @@ -10,20 +10,34 @@ "to": [7, 2, 7], "rotation": {"angle": 0, "axis": "y", "origin": [5, 0, 5]}, "faces": { - "north": {"uv": [9, 6, 15, 8], "texture": "#0"}, - "east": {"uv": [8, 1, 10, 7], "rotation": 270, "texture": "#0"}, - "south": {"uv": [9, 0, 15, 2], "rotation": 180, "texture": "#0"}, - "west": {"uv": [14, 1, 16, 7], "rotation": 90, "texture": "#0"}, - "up": {"uv": [1, 1, 7, 7], "rotation": 180, "texture": "#0"} + "north": {"uv": [1, 6, 7, 8], "texture": "#0"}, + "east": {"uv": [0, 1, 2, 7], "rotation": 270, "texture": "#0"}, + "south": {"uv": [1, 0, 7, 2], "rotation": 180, "texture": "#0"}, + "west": {"uv": [6, 1, 8, 7], "rotation": 90, "texture": "#0"}, + "up": {"uv": [1, 1, 7, 7], "rotation": 180, "texture": "#0"}, + "down": {"uv": [1, 9, 7, 15], "texture": "#0"} + } + }, + { + "from": [1, 2, 1], + "to": [7, 1.5, 7], + "rotation": {"angle": 0, "axis": "y", "origin": [5, 2, 5]}, + "faces": { + "north": {"uv": [1, 1, 2, 2], "texture": "#0"}, + "east": {"uv": [1, 1, 2, 2], "texture": "#0"}, + "south": {"uv": [1, 1, 2, 2], "texture": "#0"}, + "west": {"uv": [1, 1, 2, 2], "texture": "#0"}, + "up": {"uv": [9, 1, 15, 7], "rotation": 180, "texture": "#0"}, + "down": {"uv": [1, 9, 7, 15], "texture": "#0"} } }, { "from": [0, 0.05, 2], "to": [8, 0.05, 6], - "rotation": {"angle": 0, "axis": "y", "origin": [5, 0, 5]}, + "rotation": {"angle": 0, "axis": "y", "origin": [5, 1, 5]}, "faces": { - "up": {"uv": [0, 2, 8, 6], "rotation": 180, "texture": "#0"}, - "down": {"uv": [10, 8, 14, 16], "rotation": 270, "texture": "#0"} + "up": {"uv": [0, 10, 8, 14], "rotation": 180, "texture": "#0"}, + "down": {"uv": [0, 10, 8, 14], "texture": "#0"} } } ], @@ -32,7 +46,7 @@ "name": "group", "origin": [9, 0.5, 7], "color": 0, - "children": [0, 1] + "children": [0, 1, 2] } ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/factory_gauge/panel_with_bulb.json b/src/main/resources/assets/create/models/block/factory_gauge/panel_with_bulb.json index a8ed3dcbc7..9ec77d600f 100644 --- a/src/main/resources/assets/create/models/block/factory_gauge/panel_with_bulb.json +++ b/src/main/resources/assets/create/models/block/factory_gauge/panel_with_bulb.json @@ -10,20 +10,33 @@ "to": [7, 2, 7], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [9, 6, 15, 8], "texture": "#0"}, - "east": {"uv": [8, 1, 10, 7], "rotation": 270, "texture": "#0"}, - "south": {"uv": [9, 0, 15, 2], "rotation": 180, "texture": "#0"}, - "west": {"uv": [14, 1, 16, 7], "rotation": 90, "texture": "#0"}, + "north": {"uv": [1, 6, 7, 8], "texture": "#0"}, + "east": {"uv": [0, 1, 2, 7], "rotation": 270, "texture": "#0"}, + "south": {"uv": [1, 0, 7, 2], "rotation": 180, "texture": "#0"}, + "west": {"uv": [6, 1, 8, 7], "rotation": 90, "texture": "#0"}, "up": {"uv": [1, 1, 7, 7], "rotation": 180, "texture": "#0"} } }, + { + "from": [1, 2, 1], + "to": [7, 1.5, 7], + "rotation": {"angle": 0, "axis": "y", "origin": [5, 2, 5]}, + "faces": { + "north": {"uv": [1, 1, 2, 2], "texture": "#0"}, + "east": {"uv": [1, 1, 2, 2], "texture": "#0"}, + "south": {"uv": [1, 1, 2, 2], "texture": "#0"}, + "west": {"uv": [1, 1, 2, 2], "texture": "#0"}, + "up": {"uv": [9, 1, 15, 7], "rotation": 180, "texture": "#0"}, + "down": {"uv": [1, 9, 7, 15], "texture": "#0"} + } + }, { "from": [0, 0.05, 0], "to": [8, 0.05, 8], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "rotation": {"angle": 0, "axis": "y", "origin": [8, 15, 8]}, "faces": { - "up": {"uv": [0, 0, 8, 8], "rotation": 180, "texture": "#0"}, - "down": {"uv": [8, 8, 16, 16], "rotation": 270, "texture": "#0"} + "up": {"uv": [0, 8, 8, 16], "rotation": 180, "texture": "#0"}, + "down": {"uv": [0, 16, 8, 8], "rotation": 180, "texture": "#0"} } }, { @@ -31,7 +44,7 @@ "to": [1.5, 2.25, 7.5], "rotation": {"angle": 45, "axis": "y", "origin": [1, 1.75, 7]}, "faces": { - "up": {"uv": [7, 8, 8, 9], "texture": "#0"} + "up": {"uv": [14, 8, 15, 9], "texture": "#0"} } }, { @@ -40,7 +53,7 @@ "rotation": {"angle": 45, "axis": "y", "origin": [1, 0.5, 7]}, "faces": { "east": {"uv": [6, 8, 8, 10], "texture": "#0"}, - "west": {"uv": [6, 8, 8, 10], "texture": "#0"} + "west": {"uv": [13, 8, 15, 10], "texture": "#0"} } }, { @@ -49,7 +62,7 @@ "rotation": {"angle": -45, "axis": "y", "origin": [1, 0.5, 7]}, "faces": { "east": {"uv": [6, 8, 8, 10], "texture": "#0"}, - "west": {"uv": [6, 8, 8, 10], "texture": "#0"} + "west": {"uv": [13, 8, 15, 10], "texture": "#0"} } } ], @@ -58,7 +71,7 @@ "name": "group", "origin": [9, 0.5, 7], "color": 0, - "children": [0, 1, 2, 3, 4] + "children": [0, 1, 2, 3, 4, 5] } ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/stock_ticker.json b/src/main/resources/assets/create/models/block/stock_ticker.json index 9ead23d295..c01e40c180 100644 --- a/src/main/resources/assets/create/models/block/stock_ticker.json +++ b/src/main/resources/assets/create/models/block/stock_ticker.json @@ -1,129 +1,137 @@ { "credit": "Made with Blockbench", - "parent": "block/block", "textures": { "0": "create:block/stock_ticker", - "particle": "create:block/stock_ticker" + "particle": "create:block/andesite_casing" }, "elements": [ { "from": [1, 0, 1], "to": [15, 4, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [1, 0, 1]}, "faces": { - "north": {"uv": [8.5, 8, 15.5, 10], "texture": "#0"}, - "east": {"uv": [8.5, 8, 15.5, 10], "texture": "#0"}, - "south": {"uv": [8.5, 8, 15.5, 10], "texture": "#0"}, - "west": {"uv": [8.5, 8, 15.5, 10], "texture": "#0"}, - "up": {"uv": [8.5, 0.5, 15.5, 7.5], "texture": "#0"}, - "down": {"uv": [0.5, 8.5, 7.5, 15.5], "texture": "#0"} + "north": {"uv": [0, 7, 7, 9], "texture": "#0"}, + "east": {"uv": [0, 7, 7, 9], "texture": "#0"}, + "south": {"uv": [0, 7, 7, 9], "texture": "#0"}, + "west": {"uv": [0, 7, 7, 9], "texture": "#0"}, + "up": {"uv": [0, 0, 7, 7], "texture": "#0"}, + "down": {"uv": [0, 9, 7, 16], "texture": "#0"} } }, { - "from": [6, 4, 3], - "to": [10, 11, 11], + "from": [5.5, 0, 0], + "to": [10.5, 4, 1], + "rotation": {"angle": 0, "axis": "y", "origin": [5, 0, 0]}, "faces": { - "east": {"uv": [4.5, 0.5, 0.5, 4], "texture": "#0"}, - "west": {"uv": [0.5, 0.5, 4.5, 4], "texture": "#0"} + "north": {"uv": [8, 0, 10, 2.5], "rotation": 270, "texture": "#0"}, + "east": {"uv": [8, 2.5, 10, 3], "rotation": 270, "texture": "#0"}, + "west": {"uv": [8, 2.5, 10, 3], "rotation": 270, "texture": "#0"}, + "up": {"uv": [10, 0, 10.5, 2.5], "rotation": 90, "texture": "#0"}, + "down": {"uv": [8, 2.5, 8.5, 3], "texture": "#0"} } }, { - "from": [10, 4, 3], - "to": [6, 11, 11], + "from": [6.5, -3, -0.1], + "to": [9.5, 2, -0.1], + "rotation": {"angle": 0, "axis": "y", "origin": [6, -3, 0]}, "faces": { - "east": {"uv": [4.5, 0.5, 0.5, 4], "texture": "#0"}, - "west": {"uv": [0.5, 0.5, 4.5, 4], "texture": "#0"} + "north": {"uv": [14, 0, 15.5, 2.5], "texture": "#0"}, + "south": {"uv": [14, 0, 15.5, 2.5], "texture": "#0"} + } + }, + { + "from": [6.5, 2, -0.1], + "to": [9.5, 2, 0.9], + "rotation": {"angle": 0, "axis": "x", "origin": [6, 2, -0.1]}, + "faces": { + "up": {"uv": [14, 2.5, 15.5, 3], "rotation": 180, "texture": "#0"}, + "down": {"uv": [14, 2.5, 15.5, 3], "texture": "#0"} + } + }, + { + "from": [6.5, 7, 3], + "to": [9.5, 7, 7], + "rotation": {"angle": 0, "axis": "x", "origin": [6, 7, 3]}, + "faces": { + "up": {"uv": [14, 1, 15.5, 3], "rotation": 180, "texture": "#0"}, + "down": {"uv": [14, 1, 15.5, 3], "texture": "#0"} + } + }, + { + "from": [5.5, 4, 3], + "to": [10.5, 11, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [5, 4, 3]}, + "faces": { + "north": {"uv": [7.5, 3, 10, 6.5], "texture": "#0"}, + "east": {"uv": [13.5, 3, 10, 6.5], "texture": "#0"}, + "south": {"uv": [13.5, 3, 16, 6.5], "texture": "#0"}, + "west": {"uv": [10, 3, 13.5, 6.5], "texture": "#0"} + } + }, + { + "from": [10.5, 4, 3], + "to": [5.5, 11, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 4, 3]}, + "faces": { + "north": {"uv": [13, 7, 15.5, 10.5], "texture": "#0"}, + "east": {"uv": [16, 7, 15.5, 10.5], "texture": "#0"}, + "south": {"uv": [13, 7, 15.5, 10.5], "texture": "#0"}, + "west": {"uv": [15.5, 7, 16, 10.5], "texture": "#0"} + } + }, + { + "from": [5, 9, 9], + "to": [11, 11, 11], + "rotation": {"angle": 0, "axis": "y", "origin": [5, 9, 9]}, + "faces": { + "north": {"uv": [8, 7, 11, 8], "rotation": 180, "texture": "#0"}, + "east": {"uv": [11.5, 7, 12.5, 8], "texture": "#0"}, + "south": {"uv": [8, 7, 11, 8], "rotation": 180, "texture": "#0"}, + "west": {"uv": [11.5, 7, 12.5, 8], "texture": "#0"}, + "up": {"uv": [8, 7, 11, 8], "rotation": 180, "texture": "#0"}, + "down": {"uv": [8, 7, 11, 7.5], "texture": "#0"} } }, { "from": [6.5, 7, 7], "to": [9.5, 13, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [6, 7, 7]}, "faces": { - "north": {"uv": [5.5, 4.5, 7, 7.5], "texture": "#0"}, - "east": {"uv": [1.5, 4.5, 4.5, 7.5], "texture": "#0"}, - "south": {"uv": [5.5, 4.5, 7, 7.5], "texture": "#0"}, - "west": {"uv": [1.5, 4.5, 4.5, 7.5], "texture": "#0"}, - "up": {"uv": [5.5, 4.5, 7, 7.5], "texture": "#0"}, - "down": {"uv": [5.5, 4.5, 7, 7.5], "texture": "#0"} - } - }, - { - "from": [6.5, 4, 4], - "to": [9.5, 7, 7], - "faces": { - "north": {"uv": [5.5, 4.5, 7, 6], "texture": "#0"}, - "up": {"uv": [5.5, 4.5, 7, 6], "texture": "#0"} - } - }, - { - "from": [6.5, 4, 7], - "to": [9.5, 7, 4], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 5.5, -6.5]}, - "faces": { - "south": {"uv": [5.5, 4.5, 7, 6], "texture": "#0"}, - "up": {"uv": [5.5, 4.5, 7, 6], "rotation": 180, "texture": "#0"} - } - }, - { - "from": [6.5, -3.5, -0.05], - "to": [9.5, 2.5, 2.95], - "faces": { - "north": {"uv": [5.5, 4.5, 7, 7.5], "texture": "#0"}, - "up": {"uv": [5.5, 4.5, 7, 6], "texture": "#0"} - } - }, - { - "from": [5.5, 1, 0.1], - "to": [10.5, 4, 1], - "faces": { - "north": {"uv": [5, 1, 7.5, 2.5], "texture": "#0"}, - "east": {"uv": [5, 1, 5.5, 2.5], "texture": "#0"}, - "west": {"uv": [7, 1, 7.5, 2.5], "texture": "#0"}, - "up": {"uv": [5, 0.5, 7.5, 1], "texture": "#0"}, - "down": {"uv": [5, 2, 7.5, 2.5], "texture": "#0"} - } - }, - { - "from": [6, 6.1, 4.1], - "to": [10, 6.9, 4.9], - "faces": { - "north": {"uv": [2, 4, 2.5, 4.5], "texture": "#0"}, - "south": {"uv": [2, 4, 2.5, 4.5], "texture": "#0"}, - "up": {"uv": [1.5, 4, 2, 4.5], "texture": "#0"}, - "down": {"uv": [2.5, 4, 3, 4.5], "texture": "#0"} - } - }, - { - "from": [6, 7.1, 6.1], - "to": [10, 7.9, 6.9], - "faces": { - "north": {"uv": [2, 4, 2.5, 4.5], "texture": "#0"}, - "south": {"uv": [2, 4, 2.5, 4.5], "texture": "#0"}, - "up": {"uv": [1.5, 4, 2, 4.5], "texture": "#0"}, - "down": {"uv": [2.5, 4, 3, 4.5], "texture": "#0"} - } - }, - { - "from": [5.9, 9.5, 9.5], - "to": [10.1, 10.5, 10.5], - "faces": { - "north": {"uv": [2, 4, 2.5, 4.5], "texture": "#0"}, - "east": {"uv": [3, 4, 3.5, 4.5], "texture": "#0"}, - "south": {"uv": [2, 4, 2.5, 4.5], "texture": "#0"}, - "west": {"uv": [3, 4, 3.5, 4.5], "texture": "#0"}, - "up": {"uv": [1.5, 4, 2, 4.5], "texture": "#0"}, - "down": {"uv": [2.5, 4, 3, 4.5], "texture": "#0"} + "north": {"uv": [14, 0, 15.5, 3], "texture": "#0"}, + "east": {"uv": [10.5, 0, 13.5, 3], "texture": "#0"}, + "south": {"uv": [14, 0, 15.5, 3], "texture": "#0"}, + "west": {"uv": [10.5, 0, 13.5, 3], "texture": "#0"}, + "up": {"uv": [14, 0, 15.5, 3], "texture": "#0"}, + "down": {"uv": [14, 0, 15.5, 3], "texture": "#0"} } }, { "from": [2, 4, 2], "to": [14, 16, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 4, 2]}, "faces": { - "north": {"uv": [9, 10, 15, 16], "texture": "#0"}, - "east": {"uv": [9, 10, 15, 16], "texture": "#0"}, - "south": {"uv": [9, 10, 15, 16], "texture": "#0"}, - "west": {"uv": [9, 10, 15, 16], "texture": "#0"}, - "up": {"uv": [9, 10, 15, 16], "texture": "#0"} + "north": {"uv": [7, 10, 13, 16], "texture": "#0"}, + "east": {"uv": [7, 10, 13, 16], "texture": "#0"}, + "south": {"uv": [7, 10, 13, 16], "texture": "#0"}, + "west": {"uv": [7, 10, 13, 16], "texture": "#0"}, + "up": {"uv": [7, 10, 13, 16], "texture": "#0"} } } + ], + "groups": [ + { + "name": "base", + "origin": [5, 0, 0], + "color": 0, + "children": [0, 1] + }, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/block/basin_canal.png b/src/main/resources/assets/create/textures/block/basin_canal.png index 66ccea0ea85cd84cf89bccc63d5911bffb95dec0..28f6a888942fe1c1b46cbc3618e005a050e01f6c 100644 GIT binary patch delta 226 zcmey!xSVN%3Wq^}Pl&62LEc17-FlD6`DqLc42&f~e!&b5&u)M@N#5=*3>~bp9zYq+ z0*}aI1_o|n5N2eUHAey{$X?><>&pIuTSmZ$V@cptFQ8C?r;B3<$MxibpfbZC&j)jk zCdf>imUZXA)>#LqHa03QX(%>rmYy*25<^N0qvT3ngNaNtPO$j-s~kP&@K!B$cbKuu zxjB}_S;x*q@?^f0P0dVye=m`P(J1Eqy}jKD7PDGfXEjL3zI`exn;>}of`IUXB!;Z* WMh!PzrK*9JGkCiCxvXz delta 172 zcmV;d08{^`0`UQmBn2%{OjJdYEG>U4Y10A#0004WQchCZ0?j42@Aj9?U-Ma{eqe)n(35YRsMn~sNu!tOMXo$(# ayLSM9_c}$3c5?s#0000y{D4^000SaNLh0L04^f{04^f|c%?sf00007bV*G` z2j~kN4l*7_J+5JqTPT0BNkl1RN=_|XFzlz{WFO@%747erup$K&1E4bja4EJ>OsNtz}k2EXoWaCR&}g!8IXfZ3d1Y;+TKBgPs*c6bXtVdl_{H zJp*=%l2=~A_vaTwqW*YPn~DB-WB?2?yxZ{O?VV)<=bR%>JmP1`ZN5P|uwJeh5)P-6 zLMDdOi2)$^Tug|v0Rch?K|+Y!GneEUC((CgJ3l^d>D@)*-JjVb8 z1AU7YLN()Vi%x%^Wr2uDD@{a1N*%uM)AaDU-Q`;I>cfcnI6XW)T03Den>)wjK1JyB z+eH8%fs`_L+Qn?naQChtY6HkB9I9PPNm{A14sele?vh+9eb#E)m|Pp8`s;$I1dyGC zrwXT)KDL|fKSfitHUR7bN=YYqT`yM*{a>|D@TyH_pQcKMQ%xy(6dKzUh4_?hMZ7fm zc2_yitM&;fpVv-Uw#k4UoYFUj@NsgrvUox71)%p|zZu=^7vxRfzBVfO)Bpeg07*qo IM6N<$f}1bs1^@s6 delta 533 zcmV+w0_y$B1la_TDlr)V7625M!bLLx000SaNLh0L04^f{04^f|c%?sf00007bV*G` z2j~U_7cL+l;mxU$TPT0QNkl?Z?&HDF9$PnK7$2d>KEpBycL(5#Wy4BB%RZ z> zwJ45KZAhzMRm4sK$z3h$aM4@F;^17RZcQRyPA}8 zV>H=F=9Ha^cp3RB2$i^jdm73fLNsV zDhpA9mWgmh3L%gb;qJ`dN{Fn*c}GGt5!7jB*_m(W|7SITa$!X!^b|{(Gyol^M_>9_ zPj!tce-SSiR@BknD#cQcWIoTpb!poz?1l%Rtf#tmYh9^@%sgGkV>qvE>}v6Zo}yUF zp>Lj#Op~>JmAGyK@D<#3yg0omg2ikWUrMUg>O>ncAq2n(Y#2s#H!Wge^DrEOVeMZPXx}aIC;tB= a7Cr#a17(4>RW zU}~&lCSf!*@fRqO2yc)`L?et?FklgpSM^%aa`~RP$s_F}@qbC~JHOsJ_ug}^fhH_2 z=SgI4We3616>1N6Fp?wKUSIxp+NsQ(QkMq^ zxUMUenbgshM1MTdE0R9Ocx=717y1|rn5HQX?p$%ph?r54M92IH@WVUt1Ui|LKEj4+ z-3xt;`8IKPGcObHZK8O7!EcP>(4^*vi(^aUMe4R~DR#ouJ7AmE;kgC6k zess8po9lDYIcmyCI4pLhTE+3n1<;SbU4aESQsSLVp*>JAWD3pDSJ26Xx?aS$fbj|C u&-dW9eG7PDl3v;-e=b0D6Ny*<2fzovl;*Z z0kcU&K~y-)t&%}&6G0Tme_PVDvm0Yl(&QSD9$Gy`3k4}XSn!xH;790P#G7~&FZSla z4wR;^~198_)GVxe?~AKYM} zbe8r3Oq1kFpKhXqwMsL<+#nv)k9wD&e$-RXNQwt8(#-NlU2m+K+EZ1siW9W1`SK25jrSOHw!9frJpp?or+pjOI zUwiWD=_z7;*DJW@S=b%wYA()?j|o2yNro4!td`S%;HLbI0)S+A!Of-lY(FQZ^t3T7 v*J}7eWLX=7lrrc4`!~bNYMFXN@ZaJmX8P(19J<=O00000NkvXXu0mjfCgt_m delta 442 zcmV;r0Y(0%1k?kNB!2;OQb$4nuFf3k00004XF*Lt006O%3;baP00009a7bBm000ib z000ib0l1NC?EnA)X-PyuR5(wilFuszQ546|ydE_(=uzn9?fh8Sd59<$?B{QwEZ)Le zN*1!Qv9Wjy#lK)SHm0}Ko5T`jAt6QS`7tvRUGqIUb?MD`<$qIm&bjA1=iDFX8kE5L z+LG$Y7iex_(U>g`s%F!ou3QUi_qA7gk3#ZJPK_)ArP6%-b0;AI+}_>9HT?n=?Lq&+`;up$_Q6?)H}AcOZmMpH1rHjs5E30bO67 zv5!{6TBgbKFp9XvG)#>h0R_-fpm)Y~U4y%jgd9PV0W*9VAhm!I1N-|u==0P9I!KZs kbI@=BAeRVq{~r*20b~xXUwWtR!TeR$M ztPj@gYK^Cle8k0b=eS;&W81?!m>3^NRa=l1nWr{`thPqZS=uaHcOQw3Uq0zs+AOl# zO7E5fv3NR_+s(DkDDvaDPuL)00yey5?VQSe*am zR}Q`TI-OnXkyVWwS4L6VQ~->k#)eHB0Z^2d$QTb^m|3gfEtuS~eQU&fT{p#^a>*bi zC7GElpj8}Llc13(Z7Lssc>#cTUf#i-Bo2^BCr~8F>whM?X)f6m=z1h5FX%LFj*_LL zDD_ZR%reuHQ*2h7SgFJTT-${#^mx~qsu(oiyC8=~NQCT3goJbSep^P1UKPJElmFWmxE1DFiq~ z&cO$yrGNQ2GmJSg2Z)Cee>b9=Cg#}tp4|JSuPEPxHERJja_?jHjpg6C^247bfRWP& zz1}ScV!_hL>4RQ8d}%&*A9}Nit4DF5H}~VlvOLISJ>Ry?+2iMV_HcdQ+2iK{=kS`aPU}P*$mOz;aq*g6stImzs(ssvzFXBam}iiAwaHlk(z1KDdn)MH4Fz732LTI&PzuQU;6!G3?BDB`QRs^d+Duh zShJ=u4&aolNZAzK{YxXz-7iNYupIExDc@0d#)z!H@ZMnpX2bfK6F;}`#uIbGIN(RZ z^nd3c9@ynIEW?6PLy;CrGB8XOpamoP+nP05x1r8#H^)p~?9-8&*Wpwgq)ZB_St6O1 zkeVf&io-L{rNntDld4xixn$rh)OfyF2Tkzed{Gz91!vBj8s|_524_x<1JK(b-{Xbb z{#r*oqKh?ZM$0v%pcxH*b1B9uNZfD${C`V>JckJ>ok|L40=<96mw}@LUVdzXp1y8B zQVa9JV}r4QqXV94 z*Gi~ri=gQ6JZNM=3KmOj;OKy-sx7p4b&yrEn1)HkEYqCLkX5o2Ca3*Yoy`FFU4KxU zWANDEU8P_#`b7ltV-x6FiLq-}{d_kyQJtR`qrgFv-{GqB^Ws%^E3>n-Oq zi!UNo$uKozkZwz2I5kwoPf5|VQI!lvu`E*bNN0}iZR=tHL&Kxq{_Pv@2+E=1QE&gr z^RZf zviA_}T^)kuEW<)pFFM5U4Q(q8>uE z7pWp5c&UgMDK)o<^`b%#qKF3twHJlnTJaD)v(>-hSgXtKR zIbQngmI9Dn&wnua{dH&i(=VKH*5c-U9U%g$4}fbwUOnF4ba~mpl{$v)tcjxXe$7Pe2LY6YSFU^xQfk<`Q^%E{Q;-C&K+d=Lm;wV?JNx#KQxQ{di|Luv~r0Skuc=udn|4hh(px1D+88 z2!~sU^h5yA5?X^JFKoo)91AsZ{J|gr)kjdZkAF2vm4@|N)*xFbkzCn=z<$sijiQ%K z3WiCOY1N9*vdHGjfL#N+UO^4`&`TzrT^=a_JM7}-`FwF#1jJNJ<&3RIaZXNwX9To_ zCgogw6Ie|yvyjLG%hI0NnGAQXp9AdNiUM=Lr&C3eD@8iHT1c)GnffKYtIPf8*mIwI z;eX2bv)0IHyK_5{-+I(XVC?cu<-mFl@Wj9|tG)xEu?qmH6K>C~+5ZCv(Q{#I=m3zr zz;6fJ-3d@FLN7fR%nP{^fuQ}(OV0t`eEuZ+OhK&+>h)YN+KN@KY(kZ-ThHAXyL?lb z`e4OM0X`t*>Aq(B>+f~O&Yw`62#7Gc^?!V)6o^sk#z<$^u8R7TTlbv*ODO_wJr_kI z;H0Fg=k8v2V=B2~?L=ffopjdHAad)ukj|QnmL-|>iU8~`3a#y(-UOhg=Wb_W?bh?d zf<(Zr=LN%b^c$dLT9TfNS$=2)>h(ON`q7PA9n=@$R;{)#0teCaLm{vqJ>L(!I!DBb z0PIcA55u`bz)R0Xo4LoQbl@KK-0i&gXxRCFC~^$&&D4EsDVyJMpK$*2h&_t`1;3_> UExc;=s{jB107*qoM6N<$f*utpt^fc4 diff --git a/src/main/resources/assets/create/textures/gui/stock_keeper.png b/src/main/resources/assets/create/textures/gui/stock_keeper.png index 42f8a407f61ab423f1137df7d561beaea561a8b5..6807d14902ed1679af4b6472713607b9c4516d9d 100644 GIT binary patch delta 5022 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 E4@Q~3;s5{u literal 5204 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 diff --git a/src/main/resources/assets/create/textures/gui/stock_keeper_categories.png b/src/main/resources/assets/create/textures/gui/stock_keeper_categories.png index cffb32aacf3a7ad830549a68a72fe0d728aabe7a..bd8a87f20b7f3def4dc3140a7405ab2e4c6d381d 100644 GIT binary patch literal 1094 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911MRQ8&P5Fiy5;1lA?aAz}+x$X4Bx`|6{ zZ9LM7+b*xJe|~1&iiY5s`Og3U|37x@SZHWyT3XtpM~_NMN^ab^dE>^7>({R@S+eBS zt5-8-%n%Y1+P{DQwQJW7&dfD8H}CH5Uc7iQ(9GE#W*2}IV@Z%-FoVOh8)+a;lDE4H zLkFv@2av;A;1OBOz`%DHgc*gnPbQgQ3; zows4P90VF3Zke%_<)_h_EmMB)KPS|oa}O zX`eJx@WJw?NF5Fb1}1?91{MVdMh=IDPR6)6F)cS4g|GM7&PV2n_~_l)&y^5YfAoLa zGnRl2|5rOAsUC{Vh8rwT+zvi@#8BlXm9R1;jYUIg=GFRjFKRJob8#XvRVbp6sP|Xn8xPy6(HDlM^x~j$%%rW2dSv9`> zuALUpaQoj|h9;&!wjH{0@9%SNh+2DzV?*AzeD)dp>X(=|{<7O3?XaPK&GCk7|9lxv z{<|p0GW+j)Mwj2(yVNyq$NMup{FlY#@x9;Rz_N0?KVk|WgOfnfvV`&8{cv!cu)Ck{ z1^p{%Ci&Wt;e=Xec1C^AY-kYhgc)&KeL`0sn_=iX~)(MfP) z_-)g``~CO-N}d^V3qIz~zt55*`NzNUbYQ|0!3FgKTh8-0ZR4rjp&oJecq-5>i4Bk4 zv-_GE`=)=lzWh_CzIcxO0m~!2vOdmsT(_$JUgZ4soH-|*&HiMY_4U=|x9@W?Ye-nv z)h}Ist)u)Ste>;ke`1L-R%zn>TP?VM_7xN%<+C8Q}yvZB~d>a_-m{>ONU(WFG z&3knRhu_s)8+>dWJXmXFS*CZgKd571+@XEuJyYf#7Qem!*Il&Pb>OmuUuR*^6b68%?6kU89ZJ6T-G@yGywqb+@P8O literal 1431 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911MRQ8&P5D>38$lZxy-8q?;Kn_c~qpu?a z!^VE@KZ&eBet3XSh%1oZcKTu6#3i;i9%;pGmsi(6KeKK{L-5Re=l}ozA3Js|G&D3V zE$z{xM(`eoS@P=Ds~Iz92nh-8-@pIbwQC1w=9-(EcXxL$Uc4A+ z=8iOt8$e37B*-rqXbw)m5ZU%T3#gE@z$3Dlfr0NZ2s0kfUy%ZI?*dO3$B>G+w{yD7 zE?Wt>p4Bxp(XDlGUijqy{?E5Qb=np(^`&%~oVwR^ZR6xftMs=!)`(@iN}TULspp*Qzs=&Rm~rt-`uq3tm!(!LZFu|mac~gxRgn#~RbE*O<}nFL7sNS~ zbIWjhWFIJJ{CmA&Wy9Oc#Wl?9xH*3MGTwgv{P_(w8*zgt+gVji9&Bn*-0?|Xw4l7a zT$WYF?hIGQ`S)LRFSN>kp3Nlmsd_K_j6cDQnm_N}V_E(unbGs-U9p4!#>}6uH5Cl& zO<9*bD~~wPypP*XaGffMSqV)hnX}f%@3zihRS^&1^%C)Xbox~z)0dxF3mIzX{U~ek zlUtmvx=1$eoF}7{$)d|*v6_<)i?yFWeI@ch#ReZ;);)V(9Nuzp!*$nJnh#X}y!*a7 zc)F>9zQcN1skav^oApH8rrW*QdHX@$_4zm6w!PI8;JUHpt(wiOLua`yK2JF$@rnPp zEdMl4)-4ai-Txn&7w|m5(W3sD=F-9&A9tKA*l?zh@!;G(gSRz|?aM{n_TSy`bi>Ji zJ{A#a-^3&yYyPu%ekQm}=}oy#!gWEuX*2J$sI!+W_}u0sD{$+{(KFl@mHn@`xQ3rn zdGn##-6Eom=}Vp2KJ?^~Nhg);!7k*h)ld=DAqD92BB@H)q z-`zR8<;m`Z{r3Z0k8ilm>c_&TsV;W^R>=`{0E2r zOclGZ*Rynk$5Pf9KGu-WhYeY~TI(%$<=;BX|3CYx{XDbcJL^J0IZm8yjn)DtV9<+b zOxw)*B7612?czlXd3*m{Wx6%L_+H!dIdLbB9Ih7sVD|W1K!e|ygg97kXXH8&*6>ebmNbZ# zd;V-Mcg5xUOBM^6{Pa^E)pGCnmET#}0xTjLlU{Ng*e4e4z9yNVZW$}lz{n-y9e&{I pf6&6h2cL4F4((#^29uediD}eUsv`Q+%nu6y8hhX z-GQn$c)B=-Se#BykYHWhz||mlEW>ltzkZ!S%IJ1cx`L_e*Y* zw>W7~cvy6Y%`O>`*b&}viJ1v%Y0K3NPMq>GwyFL$qtpmDtYFt zu7r*3nMg@F`|6ViK!7Q@;L{UMHXvv-o}OngXLk|z;q{xRVl2}dCY1r8<$qrV>ir!&u8w$ZyVAmYeWe}*5QL=t#zZ$D_WpsP|L yn>qi$v&6h2cL4F4((#GEjuGz$3Dlfr0NZ2s0kfUy%Y7 zWH0gbb!C6SEyJy0bcp%aCZNz2PZ!4!i_^&o5}z6bV;88N{Pq8JxxA#DeRZdjp0?^a z1+63J1B~BmbjhjZEUU7bVSK`?b8&({d-0ljy@Z2mD^{*NdH@JMd^%gr1_FhGj%>cZ zx^2eO^B$OkjN89viUqU0ynOS{oveqK`_DJnGf{rQ=lVx&+C3Jr4-&G^e)#b*c+ELc zaY27en_t7o@ZO#BWSI`wx{ms>Ealo5uAJWHeZ7QPcl=0yZ-dDdR5SwAyvG>E)VcTe1CPRxcU+&6h2cL4F4((#GEjuGz$3Dlfr0N32s4Umcr^e8 z*-JcqUD;o7%W!LGUCd8<0u);0>Eak-aXL9cg0<(woM|er|8EL+a2qFs=LbrSswAO4u62iL}^v<4$JMfx`jg75s z=V^s=K7Cw{538+aB(HEaeDHO5f5ErU;rS2!>i)gbZC*0NAWS@QM?-kbyoC!k%y{_u zbbGYj`;FdrjIlD92giBx-9=bQY!|s7#KWV{an^L HB{Ts5$vbU( delta 207 zcmbQr^nh`KWIZzj1A~Sxe=v|@EDmyaVpw-h<|UBBlJ4m1$iT3%pZiZDE08Z5;1lB7 zl4KoZCVFXA!^54uJ0>K*KRz2Mb6eBP14yx#1o;L32LlEvZ)P{35NCl$WHAE+-yslY z6xHx*017&Kx;Tbt1kXL=$;Y6;;lbi~?dSi=qMcp$w&VvZ3aqPZG@9qIXkz3EhSGA; wiA;YVFg#ju;KrUh1%8V%CWGfqca0f%yDzX@NL&&+6=)iRr>mdKI;Vst0Hw@E{r~^~ diff --git a/src/main/resources/assets/create/textures/item/cardboard_leggings.png b/src/main/resources/assets/create/textures/item/cardboard_leggings.png index 4d5bf57446c5e1120e91bb7ef43616a25b16305a..de799ce0650be382543af2cb9ffefabf49efaad5 100644 GIT binary patch delta 253 zcmaFG*vB+MvYw5BfkFQB|3o0gmgMd3!tfsi7wla=87RV8;1OBOz`%D1gc(IOyc&Rl z>?NMQuIw+kWwP_#v`2_B1z0;=jYj`Rs4CQ+9e^pH1R;wyZ!z0_Qp2V z-)7h_O8|jX)v`(NnF1B-*nqg_f?MC*>+kK13=H-hlV#iZ(2=K3ZXM5&E@MIITQ0|$ v)@dA3^(!JwTGarQxoghR52V;jg8YL2g8_q-H?td1h_k>WvY3H^?+^$x zifVX)lzV%+IEH8h*Pip_V^HJ?Vm?^0>CgX@Dr_bV0<{~Q=1#EK)%?Z4ai7;!FSd-Q z_D>F%7aR}^I4i7u)YOWB!_^*e#)GI+ZBxvXIH?hg=An{OVx|?R3#5Bz&1A)xGZyqz>`!Vm012!K&-p*IU;ZR*!GO1v4 zX5P_`{u6d5z~hlYsb2Tz@yG&K`1Z2;Kl%skPJlNwVJRCr0{ylpAilK)uV=Wfte_VA zpMddb)Kcd62Y>pXfIr1lNA=sD08J}GlBBvaO6h*Cxbo1^mjtM)2CHi@lgakJ2P{0e zS`7ySxIH_E_|_K2qfxwHUfR3oQ)%G^jn)G=pd*<|BQ|}*bY0ex+jRnr8|2x3>iRXY z!BWZk@TF4mzybZPKSGD9YM`_NRfR!x*)^B1wZ`x|R3%K!i?9RZ&g z!C=@je7f!d7bYi#6}gKNLd2#|Uz%|=>K2Wjz;(FY!w3e$4ZFpz6X0^W;B*oI#;a=Y zzpk?u)}uy8bL$<=xG2Am!@&UVFT88GW_59{`hVihis{>~ZS?YSo9m{(_y_mC# z!@eY-mqt@LfR~!B6gSO$>j?syiFqs1jJcyx&iMG{y9s}5>hiJVjDb$&fM`S!^JwJE zp*f&cd{4Xwj735ii-bCcw>1HjRuBw^;c~eE0OfM|(1xZ}{85g!W30AL@XBuZeEtKq zJ%3{ixm*?nt%PRrnzqyNJkYiW1bkkMojWV)Z(fEPt;x$%N-J+eG}Y`JpUq~32XGlLyQ)n~=Is`0gCbkr~2*i=i_@%07*qoM6N<$f{l*hS^xk5 delta 549 zcmey#zL{l$WIZzj1H)A3zHLB?u{g-xiDBJ2nU_EgOS+@4BLl<6e(pbstU$g^fKQ0) z<<<3fwzMCcS9oSg#gn6p?jM|gX2ZlQ+owN2v+m%`+?n~#D;k2Y@0_`3O4g>Hl=CZU zY9oyoR(LP2_5&K=u4?@UNQsmL`33)ngL*iN!QcP6AW#8kfk$L90|Vbd5N6ylG5amh zWeJ`xjv*f2N2m0bH7oG6Du;w`IJ)Zn|8=`L6?YkxWo$40_H~KMteBt6V;4GZ*deYh zG3WEW-HwOz_!x!miSOt+(3p$ecIz*y!-q5k8gDvD)!7v zI-BjJcy4=UpW=k)@eVe3RmwVIFYHk}(yDmJx#@1R$xp$5VjNj?tznA8}xj{4j6eFWqfhy|90|urNo0mKB?Jf+8FpYai+w_hnuim$dq>a_O;YC zQp;GxAy10^$Ua85#xv005$$euMx300v@9M??Vs0RI60puMM)k!~1&2XskIMF;2$ z91A8n%Tf-s0005+NklWk6zQMq=oIM2Cu07H(*Y9qT5U%uudnJ3(?ntv1ztrhCqL{h`mjY7FAYrry5iUEWE&q6sp0)P4O z?MqxFcV#=^B0J_%bihR}&DA%%-Pmo_0q~Aba9eep^|iCFaQZvRsXCB}pT7FEvdkT@ z8iYeEQvjgO*F^<@NRG(YfvI?@JD@)Z0I;nZay-ElRSe_I08>d$rBniSHN~_4n z$pZVnUnsYz{#*^%-rB@%)rsT?Xe5QnWK1MSh>C$_3fxv5`}hRQ6to-b0QkR7VQ>0H z&9z3M+@ktYM!*!+Ou;ZJn4*ep)iUFdZu_3+liwkhDR7z_ynFdL&bRd2=a1qrlFXxj z^5XqUsRpP+BuDgrJfDu+{^t&u#lhjx)cM0smwR_^XLP$eT{>=i=Cwujr5IpawdCuo zb9x8l>nfj)l|fC%2H@7s8&eN@aQ`kn&tFJissRUwM@d`v2LVAiOq}m|ev(Tsy>z_2 zwV5$w);K9TZksTYbLmSr;Pu}Af6dslhs1eM1 zMG8=`+SA1`#KZgTq=#Gw6gXP;ZuwqU|8%M4ikkIhnc@+z8?w|Pku)q=?v!ePL_AGC{vxVv$x^wlO zJV$gTe~DWM4f D+oolG From 4e5b2c51072d21a64e7d2a87533ddf6dae422bd9 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Sat, 30 Nov 2024 18:46:47 +0100 Subject: [PATCH 150/515] Signs of Tweakness - readded sent prompt in stock keeper screen - fixed some broken item icons - keeper now renders anchored to the bottom and behind the window --- .../stockTicker/StockTickerRequestScreen.java | 77 ++++++++++---- .../create/foundation/gui/AllGuiTextures.java | 4 +- .../block/factory_gauge/bulb_light.json | 2 +- .../models/block/factory_gauge/item.json | 96 ++++++++++++------ .../create/models/block/stock_ticker.json | 1 + .../create/textures/gui/stock_keeper.png | Bin 5136 -> 3087 bytes 6 files changed, 126 insertions(+), 54 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java index 5e771168bc..86c528c471 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java @@ -49,6 +49,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.EditBox; import net.minecraft.client.gui.screens.inventory.InventoryScreen; +import net.minecraft.client.gui.screens.inventory.tooltip.TooltipRenderUtil; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; @@ -339,6 +340,15 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre removed(); } + @Override + public void renderBackground(GuiGraphics graphics) { + PoseStack ms = graphics.pose(); + ms.pushPose(); + ms.translate(0, 0, -300); + super.renderBackground(graphics); + ms.popPose(); + } + @Override protected void renderWindow(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { PoseStack ms = graphics.pose(); @@ -368,11 +378,11 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre LivingEntity keeper = stockKeeper.get(); if (keeper != null && keeper.isAlive()) { ms.pushPose(); - ms.translate(0, 0, 300); + ms.translate(0, 0, -300); entitySizeOffset = (int) (Math.max(0, keeper.getBoundingBox() .getXsize() - 1) * 50); - int entityX = x - 10 - entitySizeOffset; - int entityY = y + windowHeight - 70; + int entityX = x - 20 - entitySizeOffset; + int entityY = y + windowHeight - 17; AllGuiTextures.STOCK_KEEPER_REQUEST_SAYS.render(graphics, x + 226, entityY - (int) (keeper.getEyeHeight(Pose.STANDING) * 50) / 2 * 2); InventoryScreen.renderEntityInInventoryFollowsMouse(graphics, entityX, entityY, 50, entityX - mouseX, @@ -383,10 +393,10 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre BlazeBurnerBlockEntity keeperBE = blaze.get(); if (keeperBE != null && !keeperBE.isRemoved()) { ms.pushPose(); - int entityX = x - 10; - int entityY = y + windowHeight - 80; + int entityX = x - 20; + int entityY = y + windowHeight - 23; AllGuiTextures.STOCK_KEEPER_REQUEST_SAYS.render(graphics, x + 226, (entityY - 22) / 2 * 2); - ms.translate(entityX, entityY, 300); + ms.translate(entityX, entityY, -100); ms.mulPose(Axis.XP.rotationDegrees(-22.5f)); ms.mulPose(Axis.YP.rotationDegrees(-45)); ms.scale(48, -48, 48); @@ -407,7 +417,7 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre // Render static item icons ms.pushPose(); - ms.translate(x + windowWidth - 10, y + windowHeight - 65, 0); + ms.translate(x + windowWidth - 10, y + windowHeight - 67, 0); ms.scale(3.5f, 3.5f, 3.5f); GuiGameElement .of(encodeRequester ? AllBlocks.REDSTONE_REQUESTER.asStack() : AllItems.CARDBOARD_PACKAGE_12x12.asStack()) @@ -444,7 +454,8 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre ms.popPose(); } - if (isConfirmHovered(mouseX, mouseY)) + boolean justSent = itemsToOrder.isEmpty() && successTicks > 0; + if (isConfirmHovered(mouseX, mouseY) && !justSent) AllGuiTextures.STOCK_KEEPER_REQUEST_SEND_HOVER.render(graphics, x + windowWidth - 96, y + windowHeight - 41); @@ -455,19 +466,41 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre MutableComponent component = CreateLang.translate(encodeRequester ? "gui.stock_keeper.configure" : "gui.stock_keeper.send") .component(); - graphics.drawString(font, component, x + windowWidth - 57 - font.width(component) / 2, y + windowHeight - 35, - 0x252525, false); + + if (justSent) { + float alpha = Mth.clamp((successTicks + partialTicks - 5f) / 5f, 0f, 1f); + ms.pushPose(); + ms.translate(alpha * alpha * 50, 0, 0); + if (successTicks < 10) + graphics.drawString(font, component, x + windowWidth - 57 - font.width(component) / 2, + y + windowHeight - 35, new Color(0x252525).setAlpha(1 - alpha * alpha) + .getRGB(), + false); + ms.popPose(); + + } else { + graphics.drawString(font, component, x + windowWidth - 57 - font.width(component) / 2, + y + windowHeight - 35, 0x252525, false); + } // Request just sent -// if (itemsToOrder.isEmpty() && successTicks > 0) { -// Component msg = CreateLang.translateDirect("gui.stock_keeper.request_sent"); -// float alpha = Mth.clamp((successTicks - 10f) / 5f, 0f, 1f); -// if (alpha > 0) -// graphics.drawString(font, msg, x + windowWidth / 2 - font.width(msg) / 2, orderY + 4, -// new Color(0x7A5A3A).setAlpha(alpha) -// .getRGB(), -// false); -// } + if (justSent) { + Component msg = CreateLang.translateDirect("gui.stock_keeper.request_sent"); + float alpha = Mth.clamp((successTicks + partialTicks - 10f) / 5f, 0f, 1f); + int msgX = x + windowWidth / 2 - font.width(msg) / 2; + int msgY = orderY + 5; + if (alpha > 0) { + int c1 = new Color(0xB59370).setAlpha(alpha * 0.75f) + .getRGB(); + int c2 = new Color(0xEDD8BB).setAlpha(alpha * 0) + .getRGB(); + int c3 = new Color(0x714A40).setAlpha(alpha) + .getRGB(); + TooltipRenderUtil.renderTooltipBackground(graphics, msgX - 2, msgY + 2, font.width(msg) + 4, + font.lineHeight - 5, 0, c1, c1, c2, c2); + graphics.drawString(font, msg, msgX, msgY, c3, false); + } + } int itemWindowX = x + 36; int itemWindowX2 = itemWindowX + 184; @@ -617,7 +650,7 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre int customCount = entry.count; if (!isRenderingOrders) { BigItemStack order = getOrderForItem(entry.stack); - if (order != null) + if (order != null && entry.count < BigItemStack.INF) customCount -= order.count; AllGuiTextures.STOCK_KEEPER_REQUEST_SLOT.render(graphics, 0, 0); } @@ -702,6 +735,10 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre spriteWidth = 7; xOffset = 70; break; + case '+': + spriteWidth = 9; + xOffset = 84; + break; } RenderSystem.enableBlend(); diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java index bce4719d32..046775ec48 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java @@ -166,8 +166,8 @@ public enum AllGuiTextures implements ScreenElement, TextureSheetSegment { STOCK_KEEPER_REQUEST_FOOTER("stock_keeper", 0, 80, 256, 80), STOCK_KEEPER_REQUEST_SEARCH("stock_keeper", 57, 17, 142, 18), STOCK_KEEPER_REQUEST_SAYS("stock_keeper", 4, 163, 8, 16), - STOCK_KEEPER_REQUEST_LOCKED("stock_keeper", 16, 176, 15, 15), - STOCK_KEEPER_REQUEST_UNLOCKED("stock_keeper", 32, 176, 15, 15), + STOCK_KEEPER_REQUEST_LOCKED("stock_keeper", 16, 176, 15, 16), + STOCK_KEEPER_REQUEST_UNLOCKED("stock_keeper", 32, 176, 15, 16), STOCK_KEEPER_REQUEST_SLOT("stock_keeper", 32, 200, 18, 18), STOCK_KEEPER_REQUEST_SEND_HOVER("stock_keeper", 55, 200, 80, 20), STOCK_KEEPER_REQUEST_SCROLL_TOP("stock_keeper", 219, 192, 5, 4), diff --git a/src/main/resources/assets/create/models/block/factory_gauge/bulb_light.json b/src/main/resources/assets/create/models/block/factory_gauge/bulb_light.json index a601853c99..4d77206b4b 100644 --- a/src/main/resources/assets/create/models/block/factory_gauge/bulb_light.json +++ b/src/main/resources/assets/create/models/block/factory_gauge/bulb_light.json @@ -13,7 +13,7 @@ "north": {"uv": [9, 8, 11, 10], "texture": "#0"}, "east": {"uv": [9, 8, 11, 10], "rotation": 90, "texture": "#0"}, "south": {"uv": [9, 8, 11, 10], "rotation": 270, "texture": "#0"}, - "west": {"uv": [9, 9, 11, 11], "texture": "#0"}, + "west": {"uv": [9, 8, 11, 10], "texture": "#0"}, "up": {"uv": [9, 8, 11, 10], "rotation": 180, "texture": "#0"}, "down": {"uv": [9, 8, 11, 10], "texture": "#0"} } diff --git a/src/main/resources/assets/create/models/block/factory_gauge/item.json b/src/main/resources/assets/create/models/block/factory_gauge/item.json index 7a0049e96b..e905a4f160 100644 --- a/src/main/resources/assets/create/models/block/factory_gauge/item.json +++ b/src/main/resources/assets/create/models/block/factory_gauge/item.json @@ -6,27 +6,6 @@ "particle": "create:block/factory_panel" }, "elements": [ - { - "from": [5, 0, 5], - "to": [11, 2, 11], - "rotation": {"angle": 0, "axis": "y", "origin": [9, 0, 9]}, - "faces": { - "north": {"uv": [9, 6, 15, 8], "texture": "#0"}, - "east": {"uv": [8, 1, 10, 7], "rotation": 270, "texture": "#0"}, - "south": {"uv": [9, 0, 15, 2], "rotation": 180, "texture": "#0"}, - "west": {"uv": [14, 1, 16, 7], "rotation": 90, "texture": "#0"}, - "up": {"uv": [1, 1, 7, 7], "rotation": 180, "texture": "#0"} - } - }, - { - "from": [4, 0, 4], - "to": [12, 0, 12], - "rotation": {"angle": 0, "axis": "y", "origin": [9, 0, 9]}, - "faces": { - "up": {"uv": [0, 0, 8, 8], "rotation": 180, "texture": "#0"}, - "down": {"uv": [8, 8, 16, 16], "rotation": 270, "texture": "#0"} - } - }, { "from": [4, 1, 10], "to": [6, 3, 12], @@ -41,21 +20,63 @@ } }, { - "from": [4.975, 0, 10], - "to": [5.025, 1, 12], - "rotation": {"angle": -45, "axis": "y", "origin": [5, 0.5, 11]}, + "from": [5, 0, 5], + "to": [11, 2, 11], + "rotation": {"angle": 0, "axis": "y", "origin": [12, 8, 12]}, "faces": { - "east": {"uv": [14, 8, 16, 9], "texture": "#0"}, - "west": {"uv": [14, 8, 16, 9], "texture": "#0"} + "north": {"uv": [1, 6, 7, 8], "texture": "#0"}, + "east": {"uv": [0, 1, 2, 7], "rotation": 270, "texture": "#0"}, + "south": {"uv": [1, 0, 7, 2], "rotation": 180, "texture": "#0"}, + "west": {"uv": [6, 1, 8, 7], "rotation": 90, "texture": "#0"}, + "up": {"uv": [1, 1, 7, 7], "rotation": 180, "texture": "#0"} } }, { - "from": [4, 0, 10.975], - "to": [6, 1, 11.025], + "from": [5, 2, 5], + "to": [11, 1.5, 11], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 2, 9]}, + "faces": { + "north": {"uv": [1, 1, 2, 2], "texture": "#0"}, + "east": {"uv": [1, 1, 2, 2], "texture": "#0"}, + "south": {"uv": [1, 1, 2, 2], "texture": "#0"}, + "west": {"uv": [1, 1, 2, 2], "texture": "#0"}, + "up": {"uv": [9, 1, 15, 7], "rotation": 180, "texture": "#0"}, + "down": {"uv": [1, 9, 7, 15], "texture": "#0"} + } + }, + { + "from": [4, 0.05, 4], + "to": [12, 0.05, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [12, 15, 12]}, + "faces": { + "up": {"uv": [0, 8, 8, 16], "rotation": 180, "texture": "#0"}, + "down": {"uv": [0, 16, 8, 8], "rotation": 180, "texture": "#0"} + } + }, + { + "from": [4.5, 1.25, 10.5], + "to": [5.5, 2.25, 11.5], + "rotation": {"angle": 45, "axis": "y", "origin": [5, 1.75, 11]}, + "faces": { + "up": {"uv": [14, 8, 15, 9], "texture": "#0"} + } + }, + { + "from": [5, 0, 10], + "to": [5, 2, 12], + "rotation": {"angle": 45, "axis": "y", "origin": [5, 0.5, 11]}, + "faces": { + "east": {"uv": [6, 8, 8, 10], "texture": "#0"}, + "west": {"uv": [13, 8, 15, 10], "texture": "#0"} + } + }, + { + "from": [5, 0, 10], + "to": [5, 2, 12], "rotation": {"angle": -45, "axis": "y", "origin": [5, 0.5, 11]}, "faces": { - "north": {"uv": [14, 8, 16, 9], "texture": "#0"}, - "south": {"uv": [14, 8, 16, 9], "texture": "#0"} + "east": {"uv": [6, 8, 8, 10], "texture": "#0"}, + "west": {"uv": [13, 8, 15, 10], "texture": "#0"} } } ], @@ -100,7 +121,20 @@ "name": "group", "origin": [9, 0.5, 7], "color": 0, - "children": [0, 1, 2, 3, 4] + "children": [0] + }, + { + "name": "panel_with_bulb", + "origin": [8, 8, 8], + "color": 0, + "children": [ + { + "name": "group", + "origin": [9, 0.5, 7], + "color": 0, + "children": [1, 2, 3, 4, 5, 6] + } + ] } ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/stock_ticker.json b/src/main/resources/assets/create/models/block/stock_ticker.json index c01e40c180..2047d1835a 100644 --- a/src/main/resources/assets/create/models/block/stock_ticker.json +++ b/src/main/resources/assets/create/models/block/stock_ticker.json @@ -1,5 +1,6 @@ { "credit": "Made with Blockbench", + "parent": "block/block", "textures": { "0": "create:block/stock_ticker", "particle": "create:block/andesite_casing" diff --git a/src/main/resources/assets/create/textures/gui/stock_keeper.png b/src/main/resources/assets/create/textures/gui/stock_keeper.png index 6807d14902ed1679af4b6472713607b9c4516d9d..a414ee6d4c72b0fb21be596302fb7416f72f1498 100644 GIT binary patch literal 3087 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 literal 5136 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 From 213cdb78232483e5120a43558d6a7cbe62cca8c7 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Sat, 30 Nov 2024 20:09:31 -0500 Subject: [PATCH 151/515] Lying depots - Fixes Creators-of-Create/Create#7179 --- .../create/content/logistics/depot/DepotBehaviour.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/depot/DepotBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/depot/DepotBehaviour.java index 46248487f0..acdf76a9ba 100644 --- a/src/main/java/com/simibubi/create/content/logistics/depot/DepotBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/depot/DepotBehaviour.java @@ -59,7 +59,7 @@ public class DepotBehaviour extends BlockEntityBehaviour { public DepotBehaviour(SmartBlockEntity be) { super(be); - maxStackSize = () -> 64; + maxStackSize = () -> heldItem.stack.getMaxStackSize(); canAcceptItems = () -> true; canFunnelsPullFrom = $ -> true; acceptedItems = $ -> true; @@ -316,7 +316,7 @@ public class DepotBehaviour extends BlockEntityBehaviour { if (simulate) return returned; - + if (this.isEmpty()) { if (heldItem.insertedFrom.getAxis() .isHorizontal()) @@ -329,7 +329,7 @@ public class DepotBehaviour extends BlockEntityBehaviour { heldItem = heldItem.copy(); heldItem.stack.setCount(maxCount); } - + this.heldItem = heldItem; onHeldInserted.accept(heldItem.stack); return returned; @@ -362,7 +362,7 @@ public class DepotBehaviour extends BlockEntityBehaviour { return true; return false; } - + private ItemStack tryInsertingFromSide(TransportedItemStack transportedStack, Direction side, boolean simulate) { ItemStack inserted = transportedStack.stack; From ba9086a35e49567e3099f2d21a439924f947765c Mon Sep 17 00:00:00 2001 From: IThundxr Date: Sat, 30 Nov 2024 21:55:56 -0500 Subject: [PATCH 152/515] Lukewarm fix - Fix NPE caused by previous commit --- .../simibubi/create/content/logistics/depot/DepotBehaviour.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/depot/DepotBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/depot/DepotBehaviour.java index acdf76a9ba..16ea84c1ef 100644 --- a/src/main/java/com/simibubi/create/content/logistics/depot/DepotBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/depot/DepotBehaviour.java @@ -59,7 +59,7 @@ public class DepotBehaviour extends BlockEntityBehaviour { public DepotBehaviour(SmartBlockEntity be) { super(be); - maxStackSize = () -> heldItem.stack.getMaxStackSize(); + maxStackSize = () -> heldItem != null ? heldItem.stack.getMaxStackSize() : 64; canAcceptItems = () -> true; canFunnelsPullFrom = $ -> true; acceptedItems = $ -> true; From 1805140910c8fb36f1eb500ff682e62b79d0400e Mon Sep 17 00:00:00 2001 From: IThundxr Date: Sat, 30 Nov 2024 22:22:22 -0500 Subject: [PATCH 153/515] Interrogated Depots - Add gametest for depot comparator output --- .../infrastructure/gametest/tests/TestItems.java | 15 +++++++++++++++ .../gametest/items/depot_comparator_output.nbt | Bin 0 -> 740 bytes 2 files changed, 15 insertions(+) create mode 100644 src/main/resources/data/create/structures/gametest/items/depot_comparator_output.nbt diff --git a/src/main/java/com/simibubi/create/infrastructure/gametest/tests/TestItems.java b/src/main/java/com/simibubi/create/infrastructure/gametest/tests/TestItems.java index 1f55296dcd..ee1e080d09 100644 --- a/src/main/java/com/simibubi/create/infrastructure/gametest/tests/TestItems.java +++ b/src/main/java/com/simibubi/create/infrastructure/gametest/tests/TestItems.java @@ -375,4 +375,19 @@ public class TestItems { helper.assertNixiePower(bigNixie, 7); }); } + + @GameTest(template = "depot_comparator_output") + public static void depotComparatorOutput(CreateGameTestHelper helper) { + BlockPos swordNixie = new BlockPos(7, 2, 1); + BlockPos diamondNixie = new BlockPos(5, 2, 1); + BlockPos fullPearlNixie = new BlockPos(3, 2, 1); + BlockPos halfPearlNixie = new BlockPos(1, 2, 1); + + helper.succeedWhen(() -> { + helper.assertNixiePower(swordNixie, 15); + helper.assertNixiePower(diamondNixie, 15); + helper.assertNixiePower(fullPearlNixie, 15); + helper.assertNixiePower(halfPearlNixie, 8); + }); + } } diff --git a/src/main/resources/data/create/structures/gametest/items/depot_comparator_output.nbt b/src/main/resources/data/create/structures/gametest/items/depot_comparator_output.nbt new file mode 100644 index 0000000000000000000000000000000000000000..671aef051755a3268a933ad037bb9ae5e15d04d0 GIT binary patch literal 740 zcmb2|=3oGW|68Z~=3RCWX^2m`RE^3#EOzcl0RsI+=EjuCHH7>0 zu(z)_yyhlmVZ_yaWKVJUmxZ&B6_|u(e0;3*cgCX|A;LL7MBc{SbX`7gk3^xmKldCh zL*wJYGp9RoDo>n=86mheg&K09}j(Asn;)- zXZ~>a0P(gj{QU(7J|8JDuHLd(s)+e?kr6{TvAo*yf!}lREoz!{^)0 z84*1OC*N-Wtn~8U1`AJ7KVL2Ga;1iQTZI5?f2e(&N6e}U0I*Z+SNU|q1HDHD#EYwU0+>$Kj7{2pWEB7uXy%BH|%p+nC^|x ztq+b}?F-{RzVbw>VDQG}uaExA(fIb`ZS(o-8bC#2++|@pcS1LQICk{i-|(C@&x3S# zm%cGj7UHi`R}$yE7H_nA+IRCUf416dt-pBbVRVk9*|r`99oM#F3w|3u{eG}swW#Ix z*Ct`rEpq;?e%(jzx$KsVTvW9G$gd6N+gnbhOiJK6=#wJ#_GCoZWS-;3hOX5{lY_o4 zOuxUA@t@3A#;C;)C3kLWntxhCG3Lqk!-s>;1>U?`vsf$UEbo>zZ!WtxOV6Jp_U$y| e^t|ofB}zRN&0g^;yS|G4V{GhIC|S$LzyJVmW^wNT literal 0 HcmV?d00001 From c3a0ffbb0d4aaeb8f6357b8f0931263f56525999 Mon Sep 17 00:00:00 2001 From: Kryppers <65094918+Kryppers@users.noreply.github.com> Date: Sun, 1 Dec 2024 15:40:17 +0000 Subject: [PATCH 154/515] polish pass updated card blocks, sword and industrial iron windows --- .../block/bound_cardboard_block_front.png | Bin 253 -> 268 bytes .../block/bound_cardboard_block_side.png | Bin 237 -> 250 bytes .../block/bound_cardboard_block_top.png | Bin 268 -> 519 bytes .../textures/block/cardboard_block_front.png | Bin 216 -> 231 bytes .../textures/block/cardboard_block_side.png | Bin 205 -> 220 bytes .../textures/block/cardboard_block_top.png | Bin 223 -> 233 bytes .../block/palettes/industrial_iron_window.png | Bin 351 -> 551 bytes .../industrial_iron_window_connected.png | Bin 1415 -> 1609 bytes .../palettes/industrial_iron_window_end.png | Bin 268 -> 354 bytes .../textures/item/cardboard_sword_in_hand.png | Bin 485 -> 467 bytes 10 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/create/textures/block/bound_cardboard_block_front.png b/src/main/resources/assets/create/textures/block/bound_cardboard_block_front.png index 4a659a42cfd125b32a41e2b4f6ffb444d861d90e..a9d49c67227f3d957326ea886b602a7cfd1b6172 100644 GIT binary patch delta 172 zcmV;d08{_{0gM8WB#}Wg3ISqEM??UK1szC{aTtFGbV*G`2j~m|3k4F%6w}85003)A zL_t&t*ENkj4uCKSh3O5-4QgDP9tf;Eo0}mq?K!xwP~$?v`}rOq;=cKT-uuBs9WX;H zp{VMZA_D%@l3XF?gPAy#R#Hx2V$ak+6D?<)?6Ba}MOKqB)$D7*+9Ka#&tPtg?DjoP at``(00Us*`zCADi0000{Lep0000< KMNUMnLSTYgcR1_- diff --git a/src/main/resources/assets/create/textures/block/bound_cardboard_block_side.png b/src/main/resources/assets/create/textures/block/bound_cardboard_block_side.png index e1c791df3a346cfdccdaf077b78460d195d4cb8f..be2665fc5bbe35a79f2fef21a4869e2515705590 100644 GIT binary patch delta 186 zcmaFM_=|CZ%0x%?dd4JgcNc~ZR#^`Q1_sUokH}&M2EIce%qXhi)c_P^FY)wsWq-lL z$jxkh_s<($piru(i(?4Kb=RJQybT6C%$Ip*@jBQfOmH!9kp1Dj_? zIdfT}eNR&8>Q;-(mpUEz$|YQ9T5D#l<@lp)Inl{%M)@a$D1p1$Ea&H65BibM`z0sg lEMw=K=ZdU5ulRMI<<)YK%J?$r=U$+V44$rjF6*2UngBDTL-YUu delta 171 zcmeyx_?B^kiWFmUkh>GZx^prw85kH?(j9#r85lP9bN@+Xov5f)&spFRS!5~a{0!QyA=($!Wb?u^O)cE{nY(uKNW4I|MR9@u3)?t XAag=z|GNmFH4L7vY<@25oD!Mr2JH-4yf8M4yM|qo_`wdcDw&(kUJ=fBDas!r)D-+?#77FJU-z1o?bOM1Bfx=y+g|D8)9g1 z*3ITVJwD(!Tdu4_f9z+uOzuJ(k@oJEUX_<@ZU84j@!{jpto(%EY$-;O7#aXd>yVXq zvkY>j-}gURw|mwAzxGU+l?zFriK-G~oFzZy;oonmzjA+lm5q*>c<%-droDEZBF3bo z#X3y3f%6Prad5tYJ~aHzC_U$(uAc@DR5ekUzaC}`T;xDiIUbJ}Z^2nd6Jt_6zlEx* vkgiiE7x}5yrzT;&+pM!wF93JJm82d>=LX`=p200000NkvXXu0mjfMP1#< delta 252 zcmZo?>0z26QP0B6z`*eK?xP?e#aJBV?!>U}oXkrghb7(7*O7r?V?XzwL{=bQI>0By z_44ZaJ6qasY-m2eqUOTkt=G>SI5w~F%#w;Dn-|{Nc<2I98E1hbJ$pwr&8HqcW2FmQi-&H zW4!Firc!1Ni|Sj#_dV54Q(v<2iz=^oTwt zH{GN&*g9rOjHkrXrGC1@60VP@vCRtWF*PFA^&z0&>0M#u6{1-oD!MM1MG8=my~NYkmHh>` zoVYsk>VlFRK%r1i7sn8e>#n_yyax<;m}A*=#m!lm4hlFW{xLP5ZKgecj-S~z>5ye1 zp)dH88&h)F=P%x(sQRpebLYGZx^prw85kH?(j9#r85lP9bN@+Xov5f@%vsLjk7mdKI;Vst E0P9;hEdT%j diff --git a/src/main/resources/assets/create/textures/block/cardboard_block_side.png b/src/main/resources/assets/create/textures/block/cardboard_block_side.png index b367d333e803840d111647c7cfd7cfec45720bb0..dd8c058d58c5453e980104b7188bcf1af123d143 100644 GIT binary patch delta 168 zcmX@hc!zO<%0x%$dd4JgcNc~ZR#^`Q1_sUokH}&M2EM}}%y>M1MG8=my~NYkmHh>` zoVYrxlkmm2K%rny7sn8e>#n`G1sN21m^L!!GOlOZ*nFYhH{Iy_3HdXd4p#6LA78XB zkTX{yh26EL=jh7_;k|o%otIoY|H9)^h_Ao@x^3N#ZylD(MVGZx^prw85kH?(j9#r85lP9bN@+Xov0{R$XVbKS?|7P6!^4R74Y}ww|Kg;_AR5i*q zZ?P`oZYX&A<`XB=nY#tHnZ_pQuT|`IGWlc1D)xeb<sKj#nRil!u5U(pQV8{Rf002ovPDHLkV1kic BIGq3h diff --git a/src/main/resources/assets/create/textures/block/palettes/industrial_iron_window.png b/src/main/resources/assets/create/textures/block/palettes/industrial_iron_window.png index 3c5792d14d30517231d3048df8210b6c5edb4b87..092fe54be70c60c13289558fc082db77b5ccd420 100644 GIT binary patch delta 505 zcmVlfP;kK@i4&cL<5QLM%kcXk#md!BH0n|3Os@shlQt$UCGAA_C zdwf@+*E=OyfdSZ6LeV;ZuXmcqRa|>oHvurlU_~%@_be9+tX<|7APfRJ+fT{>u0j+I zIlnmb0N#H2n*RFy5rDyuOV7m}>~~ZBcq0e!f2*|`i3ss@o+ksm?(Wgv(lj15N|Qgo zIP>D^oJ52$tm4PhIZ-skiUr`)_n#?1M=Ml8g_3+?iJ~E+ag1-pV#P8TTzdVRdHVin z&npJI9dW<_&)$8&ibZ6B9|j@qEzL>)I^AtqyZoom(eqv%AE!zw>OoN2_2M4@{`v>W vYHz%Q{chT5sI_Q}#&JerG>+E-5LxgCQabC7&gNYV00000NkvXXu0mjfXz%W$ delta 324 zcmV-K0lWUE1m6OXB!2;OQb$4nuFf3k00004XF*Lt006O%3;baP00009a7bBm000id z000id0mpBsWB>pF^hrcPR5(v#)YjJf&&A2bKo0o!{TlNaQR<32B+y$m47XL*=1Q-Ma1fasifqxGlJ}|s_^8w-o0YP4d zUq63BrHBJ;?CcEBp1y<_z{SNzz6(HM02Lz(zytC0nG=jqF*tx3e)Z}l3^`EPfdY|9 zL|6nWgb6@$_+kho&jezqs3?F1NC8sP;$RwVfQ+Ohm_rEcJbZX6lnG8u-@XC80OCA( z{v0fb4}dhg+dbN5L%Hx2O0)}*HG=>wX;UvV9XfIZEC}`+p3DRSATc`|8){^xZwvs> WfNK_!;$tSBK~U^8zNCR(>J$Qnl3SqX-U>Yy zLfU^K|3Gi0P!Wjb91P9H0V^$}m_SidN46!|`n6c~PF9w^J;bw_UGJ{evs!PAHJ6d} z=9_u@f9B2TeQ$Pz8=rrnOHwa*imEmN0OuJWmE{qPjgDeZQ7{mX8$ze=Y+b6=Ac-Qz zMn@gnS&LmicJ14Z@6@i{IIO%>tDz@3Hg<1hco;LO6zbI~wu(gz^!KA&uLFmNM!iRf z@%yK9b5Qs9@#1A3hldBa6pLXdmBOnRFHox0e-IM{qkdH=nCeok2J-qf>W#*Unzmzq zFO|!t{wTgwE}v-U)SlKugM;|z8T3B6O!w2&F*e>oM7VAMWnZ)v=6--S{qFS%x2*5$BWvci0_dyO0 zf6&x49O*igdIN`t2WT{iQL7p;eYgJZB)8Tr9HFUc5Ta3&9x*|{e}o{r_Lrf5l)8f~ zj{pD^MS)5PlzIbAO@pd7jT!(XQN$;gCr-Fre6Sx|#p2sO)FzaA1C?q8>+8=1Yx{41 z{7KLL{u=;b{c&*e#83hN(9|^S5dr{^f8`PEDGC4}Vr&S6;LpFGV=0pn(&@A?dHn|R zn*~&=6)a^k!XJ-UgmgMBG*)oMlu)PVHC3)?$b%4CGe>o-uTR!mC${L8O8{k*WS zfbpbkC>Vqs04miA(&@CYl*tIW+y<0-!=zKRx33R-grKm!gSG4vf$d=T>8dgFf3&P+ zp9oj6pi80%N$Q1H{KKbN{j0foLp~u7As&xIRd)lEk0)i5{U6B1yfD@_}O`^Ws_kA3n|M zckkR5tolb(qCzDq*4Lj2Y$J96f2(`VfBg+qqJj_&Uhv=D`qEbU0Z{}1M>$=yym%)A zvie6PQNnmqwzVQ1;QoVU(}U6VCyIUWf)A=t1GOtw1F`x?sH@mn(P;)IQJ`c7f1o@Bnc6%1mf-Dig)NH=7_03Rptn zMm8qoA={YSD;@ymuY8E-A<3yMzgc)22RMbY?Z}87Ve z(8h~|JriLW$dd;Iy;eK1iMU|0zeKL#@80~AF$bv}SCr^Wl_^IrS+lFu;m0o0o9 zPIg%fviX1kQMAn;SaDvsyi-4?%^$esA-0OeH~E08^9wpJpFi*Ufc$2mn-2&r9}uRT z)t@^b5I^SAy!n7If90(HuK55rzHR*rIxW5v`2aup0#hKw%jdne34+i2%@>$LVV*$7 z%fZN5u(=COhB^@mMtEn?%iv+>1H6=uoDTEOWYA0G%n~BJ4-)qK18p}!uQSVw57Pta z*sg5Q%jqf){;b%doBsLZcN$G>(Cyt?E90^|9p+(mb{H=#f6|Wiah(odbT$|@Xdy=- zM1v$s-1x8yAsV8R#6N@dElj`o?tOvoeSz+Mf$n{Qpyb{A0^R!p-TMNDfx7nvZ1nHm z7oe`vy)WRy`sew+0CzsXdS4)je1KoMuY7y@pC-8g3jhEBNkvXXu0mjft*-w~ delta 1396 zcmV-)1&jL042KJlB!2;OQb$4nuFf3k00004XF*Lt006O%3;baP00009a7bBm000id z000id0mpBsWB>pK97#k$RCr$Po6m1dQ547D2$fEiVi5H+(FGACidguOAQ1~1Y*Cle%J@1`ydVlBrxbNPXc{A;Nl9zYq zUEg=lJ@4Fm-o0KkyLay`W!tlk35DqbolW&=1N$?_kDVx;JA1|%9vSg3dlaUp>6~qE zr!&LXj~zMU^xq$Fve~Qy{o}zwy56>Yd8lS;YKqRxvZYJ?QgZ(M{p*)1>FDU7bC4ay znHegdI(d@pFMmhCs;(7Oq06uF-{e8CbxSv$x%1!hdHSuwhDlT-bz!Flp*osbm&?s_ z!utW;-Y`wAt&rK5P6g)UUS%4?O z=flr3bXCC4dHwojMI9msH^{BcImM#apzL%|XVo^M?hj1sgNC(q3Y-Dj+Op0PbRZ1W zMLjjt=YPNFspB~CZ}~uH(I^g-gB+}Lf0KG{Pqxo?;b41VJ5Ad?J=;l`1Ub|4jk#eQ zxE|MmS|i(+wz0i{9I$!gM*0!QqoJW&e$l-_JEajc0=UyrNWBTw(#r=#4*2-_Gft5} zeER6o>;6wSwEn+{=tPjJPfE4*9KqTVpf)bw;D1c?NvXD;BbXd8F<$x75{HZc6MfpS z{j?bB?p|NMK%Q~S{DkFohU-U1-_eVZsa}@T(8GQQ4!CyZN=4oT$fulZRiHt=sUDItKpcNYD%rNAbGSSE3>R)HOmET9927BJDL4S(BD4hYKQLCD-H$CQcQ1f)m5Xhe|x+7S?y zTW$3^pz}8AF|2)ZfbDv|PWu5?=`pN*F9KTo0j>Q2%9koS>*>~hKm<{GkY+vGubl-{ zIJAI?K5f{3azKOb2h>#0_6J5lSk4T?R|gW|pgjjHRLVm@{=God5a7B4y??z6=kEpRiUoM%0!{h3JkJ60Lr2b;QSZ{&PxFiA z2AlG8c?fPtuxOp>?11?{>R2m!mO68{hTpk6J|Jh-0E{MXEu(zxEK|cLV?D zJZ$wkR9nw)iP}TJrg6}y`qq8`a(!z*V9`cE!TARPio4dz=`u9{0000D00(qQO+^Rj3;_-~8nXA`;Q#;t?@2^KR5;7klQC|>KoCXWS~PZ% zVw+gx2$pCd5;wpgQPLr$ponq^Qg8(#`2y}-B4Kj}yG~=tcYmPph-y=yl}w@#<5c`| zr2pp6?5qlcf$?0AE~=%b=eZuM)eC8s;cLxNga_CC)pQi07GWBOY(FA;0BM%-`o3=6 zIsdFklNjI(@U;eDHXNxofK8kjUu#M#92={teUY2LAlBmm7c=jR+_XtzJx;S2?GC2x z7*-d6xA{cf`b?A#|I{4>rv06vFSfOGF&WgN>U^-Wm%n1c^ZbK lN!;l(sUR4bt_u`7@dd1UT9kFLk_7+&002ovPDHLkV1k^jk2L@Q delta 252 zcmaFF)WbAEqMn7Bfq~)e-A6${im^Dz-HBn{IhmJ04okYDuOkD)#(wTUiL5}rVt`MG ztG2eDsfopm>C^rF{nHZ@BO@a0?VMa(TpH`@JUu*03k&}XbZY|@a~60+7BevL9R^{> zzQeNMW5^r6DUgzHBW yOlM9!=`b=4-=ONuEMqj3=E48tL_T4S>ptB0E4HipUXO@geCy_L|c3S diff --git a/src/main/resources/assets/create/textures/item/cardboard_sword_in_hand.png b/src/main/resources/assets/create/textures/item/cardboard_sword_in_hand.png index 43cba80ff5429a61427aff0360c4e7f359a159d7..a55bf190f4e73f929fced6528e09fd6357a523ff 100644 GIT binary patch delta 435 zcmV;k0Zjho1JeVLDu1W|&;Z%Xk}zlh000SaNLh0L01m?d01m?e$8V@)00007bV*G` z2j~m|3OOWnpH-Fs00Cf0L_t(I%Y~D%O2beXh0hIzG@&hNpu>$;a22diAijZP@c|TH zK^3 zK(BWPN(~f=&3N)%Q{?%A;qVER8qjqeuInZjoQDewj7B{fu2j_d0!j@~YGejvxeU%j zOeSLhNSHGSihrUCZKrd2xG?$Oy|h|5~erPVg`9pv%m<&t*bc?_+# zNv1d5sFddI4;}#kaV}xV3mrJl8>BSv`r0Z0KvC3;t2{lwj>J8X}6sN(?Ii00DAIL_t(I%Z-vTOT$1M#a|>^TcVPol%y1KO>O-IegzkypP+8K z34&8sp^Kx`(aEu^lQ_6YK`X^kt>zGtoH=9C=x`3P*ESxtZ-2TZh8Ca|6RLCq85{ixbZ*ip6<3n-OP~5F3_N0i~|E4FKYJ zFfqW)>*8lk%YTgq@84hOe!Eo>6 v3W6{Raas?iiA8ZTK-L4xs{Ff!zWs(DS1`-zBo`=C00000NkvXXu0mjf=V-|q From 04e4ec5f6aaa77160596dc032f82523a8257dee0 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Sun, 1 Dec 2024 13:41:31 -0500 Subject: [PATCH 155/515] Retro goggles *Spamton seems to like these* - Convert getIcon method in IHaveGoggleInformation into an interface to allow it to work with IHaveHoveringInformation --- .../goggles/GoggleOverlayRenderer.java | 12 ++++++---- .../goggles/IHaveCustomOverlayIcon.java | 20 ++++++++++++++++ .../goggles/IHaveGoggleInformation.java | 23 ++++--------------- .../goggles/IHaveHoveringInformation.java | 15 ++++++++---- .../goggles/IProxyHoveringInformation.java | 8 ++++--- 5 files changed, 47 insertions(+), 31 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/equipment/goggles/IHaveCustomOverlayIcon.java diff --git a/src/main/java/com/simibubi/create/content/equipment/goggles/GoggleOverlayRenderer.java b/src/main/java/com/simibubi/create/content/equipment/goggles/GoggleOverlayRenderer.java index 0b357f9735..9988290791 100644 --- a/src/main/java/com/simibubi/create/content/equipment/goggles/GoggleOverlayRenderer.java +++ b/src/main/java/com/simibubi/create/content/equipment/goggles/GoggleOverlayRenderer.java @@ -90,6 +90,8 @@ public class GoggleOverlayRenderer { BlockEntity be = world.getBlockEntity(pos); boolean wearingGoggles = GogglesItem.isWearingGoggles(mc.player); + boolean isShifting = mc.player.isShiftKeyDown(); + boolean hasGoggleInformation = be instanceof IHaveGoggleInformation; boolean hasHoveringInformation = be instanceof IHaveHoveringInformation; @@ -98,21 +100,21 @@ public class GoggleOverlayRenderer { ItemStack item = AllItems.GOGGLES.asStack(); + if (be instanceof IHaveCustomOverlayIcon customOverlayIcon) + item = customOverlayIcon.getIcon(isShifting); + List tooltip = new ArrayList<>(); if (hasGoggleInformation && wearingGoggles) { - boolean isShifting = mc.player.isShiftKeyDown(); - IHaveGoggleInformation gte = (IHaveGoggleInformation) be; goggleAddedInformation = gte.addToGoggleTooltip(tooltip, isShifting); - item = gte.getIcon(isShifting); } if (hasHoveringInformation) { if (!tooltip.isEmpty()) tooltip.add(Components.immutableEmpty()); IHaveHoveringInformation hte = (IHaveHoveringInformation) be; - hoverAddedInformation = hte.addToTooltip(tooltip, mc.player.isShiftKeyDown()); + hoverAddedInformation = hte.addToTooltip(tooltip, isShifting); if (goggleAddedInformation && !hoverAddedInformation) tooltip.remove(tooltip.size() - 1); @@ -128,7 +130,7 @@ public class GoggleOverlayRenderer { if (!hasHoveringInformation) if (hasHoveringInformation = - hoverAddedInformation = TrainRelocator.addToTooltip(tooltip, mc.player.isShiftKeyDown())) + hoverAddedInformation = TrainRelocator.addToTooltip(tooltip, isShifting)) hoverTicks = prevHoverTicks + 1; // break early if goggle or hover returned false when present diff --git a/src/main/java/com/simibubi/create/content/equipment/goggles/IHaveCustomOverlayIcon.java b/src/main/java/com/simibubi/create/content/equipment/goggles/IHaveCustomOverlayIcon.java new file mode 100644 index 0000000000..42cef95642 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/equipment/goggles/IHaveCustomOverlayIcon.java @@ -0,0 +1,20 @@ +package com.simibubi.create.content.equipment.goggles; + +import com.simibubi.create.AllItems; + +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.entity.BlockEntity; + +/** + * Implement this interface on the {@link BlockEntity} that wants to change the icon on the goggle overlay + */ +public interface IHaveCustomOverlayIcon { + /** + * This method will be called when looking at a {@link BlockEntity} that implements this interface + *

+ * @return The {@link ItemStack} you want the overlay to show instead of the goggles + */ + default ItemStack getIcon(boolean isPlayerSneaking) { + return AllItems.GOGGLES.asStack(); + } +} diff --git a/src/main/java/com/simibubi/create/content/equipment/goggles/IHaveGoggleInformation.java b/src/main/java/com/simibubi/create/content/equipment/goggles/IHaveGoggleInformation.java index 570aa2008b..0e1de50d03 100644 --- a/src/main/java/com/simibubi/create/content/equipment/goggles/IHaveGoggleInformation.java +++ b/src/main/java/com/simibubi/create/content/equipment/goggles/IHaveGoggleInformation.java @@ -3,24 +3,22 @@ package com.simibubi.create.content.equipment.goggles; import java.util.List; import java.util.Optional; -import com.simibubi.create.AllItems; import com.simibubi.create.foundation.utility.CreateLang; import net.createmod.catnip.utility.lang.LangBuilder; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; -import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.IFluidHandler; -/* -* Implement this Interface in the BlockEntity class that wants to add info to the screen -* */ +/** + * Implement this interface on the {@link BlockEntity} that wants to add info to the goggle overlay + */ public interface IHaveGoggleInformation { /** - * this method will be called when looking at a BlockEntity that implemented this - * interface + * This method will be called when looking at a {@link BlockEntity} that implements this interface * * @return {@code true} if the tooltip creation was successful and should be * displayed, or {@code false} if the overlay should not be displayed @@ -29,17 +27,6 @@ public interface IHaveGoggleInformation { return false; } - /** - * this method will be called when looking at a BlockEntity that implemented this - * interface - *

- * return the item of your choosing after checking for any logic you wish, and the goggle on the goggle - * tooltip will be replaced with the item you have returned - */ - default ItemStack getIcon(boolean isPlayerSneaking) { - return AllItems.GOGGLES.asStack(); - } - default boolean containedFluidTooltip(List tooltip, boolean isPlayerSneaking, LazyOptional handler) { Optional resolve = handler.resolve(); diff --git a/src/main/java/com/simibubi/create/content/equipment/goggles/IHaveHoveringInformation.java b/src/main/java/com/simibubi/create/content/equipment/goggles/IHaveHoveringInformation.java index ea97e262a5..042464a7e8 100644 --- a/src/main/java/com/simibubi/create/content/equipment/goggles/IHaveHoveringInformation.java +++ b/src/main/java/com/simibubi/create/content/equipment/goggles/IHaveHoveringInformation.java @@ -3,14 +3,19 @@ package com.simibubi.create.content.equipment.goggles; import java.util.List; import net.minecraft.network.chat.Component; +import net.minecraft.world.level.block.entity.BlockEntity; -/* -* Implement this Interface in the BlockEntity class that wants to add info to the screen -* */ +/** + * Implement this interface on the {@link BlockEntity} that wants to add info to the goggle overlay + */ public interface IHaveHoveringInformation { - + /** + * This method will be called when looking at a {@link BlockEntity} that implements this interface + * + * @return {@code true} if the tooltip creation was successful and should be + * displayed, or {@code false} if the overlay should not be displayed + */ default boolean addToTooltip(List tooltip, boolean isPlayerSneaking) { return false; } - } diff --git a/src/main/java/com/simibubi/create/content/equipment/goggles/IProxyHoveringInformation.java b/src/main/java/com/simibubi/create/content/equipment/goggles/IProxyHoveringInformation.java index dad2d3051c..c276066a94 100644 --- a/src/main/java/com/simibubi/create/content/equipment/goggles/IProxyHoveringInformation.java +++ b/src/main/java/com/simibubi/create/content/equipment/goggles/IProxyHoveringInformation.java @@ -2,10 +2,12 @@ package com.simibubi.create.content.equipment.goggles; import net.minecraft.core.BlockPos; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; +/** + * Implement this interface on the {@link BlockEntity} that wants to add info to the goggle overlay + */ public interface IProxyHoveringInformation { - - public BlockPos getInformationSource(Level level, BlockPos pos, BlockState state); - + BlockPos getInformationSource(Level level, BlockPos pos, BlockState state); } From 9761362c0877f22d16f21a07d1917fafd6c6aacc Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Mon, 2 Dec 2024 14:06:21 +0100 Subject: [PATCH 156/515] Crafting Chaos - workspace switch, incomplete --- .../com/simibubi/create/AllMenuTypes.java | 5 + .../java/com/simibubi/create/AllPackets.java | 2 - .../simibubi/create/compat/jei/CreateJEI.java | 1 + .../jei/StockKeeperTransferHandler.java | 134 ++++++ .../content/logistics/AddressEditBox.java | 8 +- .../content/logistics/BigItemStack.java | 2 +- .../logistics/packager/InventorySummary.java | 4 + .../stockTicker/CraftableBigItemStack.java | 24 ++ .../stockTicker/RequestCraftableHelper.java | 108 ----- .../StockKeeperOpenRequestScreenPacket.java | 59 --- .../stockTicker/StockKeeperRequestMenu.java | 64 +++ ...een.java => StockKeeperRequestScreen.java} | 381 +++++++++++++----- .../stockTicker/StockTickerBlock.java | 4 +- .../stockTicker/StockTickerBlockEntity.java | 32 +- .../StockTickerInteractionHandler.java | 11 +- .../create/foundation/gui/AllGuiTextures.java | 2 + .../create/textures/gui/stock_keeper.png | Bin 3087 -> 3486 bytes 17 files changed, 557 insertions(+), 284 deletions(-) create mode 100644 src/main/java/com/simibubi/create/compat/jei/StockKeeperTransferHandler.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/stockTicker/CraftableBigItemStack.java delete mode 100644 src/main/java/com/simibubi/create/content/logistics/stockTicker/RequestCraftableHelper.java delete mode 100644 src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperOpenRequestScreenPacket.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperRequestMenu.java rename src/main/java/com/simibubi/create/content/logistics/stockTicker/{StockTickerRequestScreen.java => StockKeeperRequestScreen.java} (73%) diff --git a/src/main/java/com/simibubi/create/AllMenuTypes.java b/src/main/java/com/simibubi/create/AllMenuTypes.java index 3a5b7c2427..9ebd08fe2b 100644 --- a/src/main/java/com/simibubi/create/AllMenuTypes.java +++ b/src/main/java/com/simibubi/create/AllMenuTypes.java @@ -16,6 +16,8 @@ import com.simibubi.create.content.logistics.redstoneRequester.RedstoneRequester import com.simibubi.create.content.logistics.redstoneRequester.RedstoneRequesterScreen; import com.simibubi.create.content.logistics.stockTicker.StockKeeperCategoryMenu; import com.simibubi.create.content.logistics.stockTicker.StockKeeperCategoryScreen; +import com.simibubi.create.content.logistics.stockTicker.StockKeeperRequestMenu; +import com.simibubi.create.content.logistics.stockTicker.StockKeeperRequestScreen; import com.simibubi.create.content.redstone.link.controller.LinkedControllerMenu; import com.simibubi.create.content.redstone.link.controller.LinkedControllerScreen; import com.simibubi.create.content.schematics.cannon.SchematicannonMenu; @@ -65,6 +67,9 @@ public class AllMenuTypes { public static final MenuEntry STOCK_KEEPER_CATEGORY = register("stock_keeper_category", StockKeeperCategoryMenu::new, () -> StockKeeperCategoryScreen::new); + public static final MenuEntry STOCK_KEEPER_REQUEST = + register("stock_keeper_request", StockKeeperRequestMenu::new, () -> StockKeeperRequestScreen::new); + public static final MenuEntry PACKAGE_PORT = register("package_port", PackagePortMenu::new, () -> PackagePortScreen::new); diff --git a/src/main/java/com/simibubi/create/AllPackets.java b/src/main/java/com/simibubi/create/AllPackets.java index b812b79f15..c46e1e7101 100644 --- a/src/main/java/com/simibubi/create/AllPackets.java +++ b/src/main/java/com/simibubi/create/AllPackets.java @@ -75,7 +75,6 @@ import com.simibubi.create.content.logistics.stockTicker.PackageOrderRequestPack import com.simibubi.create.content.logistics.stockTicker.StockKeeperCategoryEditPacket; import com.simibubi.create.content.logistics.stockTicker.StockKeeperCategoryRefundPacket; import com.simibubi.create.content.logistics.stockTicker.StockKeeperLockPacket; -import com.simibubi.create.content.logistics.stockTicker.StockKeeperOpenRequestScreenPacket; import com.simibubi.create.content.logistics.tunnel.TunnelFlapPacket; import com.simibubi.create.content.redstone.displayLink.DisplayLinkConfigurationPacket; import com.simibubi.create.content.redstone.link.controller.LinkedControllerBindPacket; @@ -251,7 +250,6 @@ public enum AllPackets { LOGISTICS_STOCK_RESPONSE(LogisticalStockResponsePacket.class, LogisticalStockResponsePacket::new, PLAY_TO_CLIENT), FACTORY_PANEL_EFFECT(FactoryPanelEffectPacket.class, FactoryPanelEffectPacket::new, PLAY_TO_CLIENT), KNOCKBACK(KnockbackPacket.class, KnockbackPacket::new, PLAY_TO_CLIENT), - STOCK_KEEPER_OPEN_GUI(StockKeeperOpenRequestScreenPacket.class, StockKeeperOpenRequestScreenPacket::new, PLAY_TO_CLIENT), TRAIN_MAP_SYNC(TrainMapSyncPacket.class, TrainMapSyncPacket::new, PLAY_TO_CLIENT), CLIENTBOUND_CHAIN_CONVEYOR(ClientboundChainConveyorRidingPacket.class, ClientboundChainConveyorRidingPacket::new, PLAY_TO_CLIENT); diff --git a/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java b/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java index c8548a31fa..5c61dbc2c9 100644 --- a/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java +++ b/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java @@ -354,6 +354,7 @@ public class CreateJEI implements IModPlugin { @Override public void registerRecipeTransferHandlers(IRecipeTransferRegistration registration) { registration.addRecipeTransferHandler(new BlueprintTransferHandler(), RecipeTypes.CRAFTING); + registration.addUniversalRecipeTransferHandler(new StockKeeperTransferHandler(registration.getJeiHelpers())); } @Override diff --git a/src/main/java/com/simibubi/create/compat/jei/StockKeeperTransferHandler.java b/src/main/java/com/simibubi/create/compat/jei/StockKeeperTransferHandler.java new file mode 100644 index 0000000000..a9fb5e301e --- /dev/null +++ b/src/main/java/com/simibubi/create/compat/jei/StockKeeperTransferHandler.java @@ -0,0 +1,134 @@ +package com.simibubi.create.compat.jei; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import javax.annotation.ParametersAreNonnullByDefault; + +import org.apache.commons.lang3.mutable.MutableObject; +import org.jetbrains.annotations.Nullable; + +import com.simibubi.create.AllMenuTypes; +import com.simibubi.create.content.logistics.BigItemStack; +import com.simibubi.create.content.logistics.packager.InventorySummary; +import com.simibubi.create.content.logistics.stockTicker.CraftableBigItemStack; +import com.simibubi.create.content.logistics.stockTicker.StockKeeperRequestMenu; +import com.simibubi.create.content.logistics.stockTicker.StockKeeperRequestScreen; +import com.simibubi.create.foundation.utility.CreateLang; + +import mezz.jei.api.gui.ingredient.IRecipeSlotsView; +import mezz.jei.api.helpers.IJeiHelpers; +import mezz.jei.api.recipe.RecipeIngredientRole; +import mezz.jei.api.recipe.RecipeType; +import mezz.jei.api.recipe.transfer.IRecipeTransferError; +import mezz.jei.api.recipe.transfer.IRecipeTransferHandler; +import mezz.jei.common.transfer.RecipeTransferOperationsResult; +import mezz.jei.common.transfer.RecipeTransferUtil; +import mezz.jei.library.transfer.RecipeTransferErrorMissingSlots; +import mezz.jei.library.transfer.RecipeTransferErrorTooltip; +import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.world.Container; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.level.Level; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.DistExecutor; +import net.minecraftforge.items.ItemStackHandler; +import net.minecraftforge.items.wrapper.RecipeWrapper; + +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +public class StockKeeperTransferHandler implements IRecipeTransferHandler { + + private IJeiHelpers helpers; + + public StockKeeperTransferHandler(IJeiHelpers helpers) { + this.helpers = helpers; + } + + @Override + public Class getContainerClass() { + return StockKeeperRequestMenu.class; + } + + @Override + public Optional> getMenuType() { + return Optional.of(AllMenuTypes.STOCK_KEEPER_REQUEST.get()); + } + + @Override + public RecipeType getRecipeType() { + return null; + } + + @Override + public @Nullable IRecipeTransferError transferRecipe(StockKeeperRequestMenu container, Object object, + IRecipeSlotsView recipeSlots, Player player, boolean maxTransfer, boolean doTransfer) { + Level level = player.level(); + if (!(object instanceof Recipe recipe)) + return null; + MutableObject result = new MutableObject<>(); + if (level.isClientSide()) + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> result + .setValue(transferRecipeOnClient(container, recipe, recipeSlots, player, maxTransfer, doTransfer))); + return result.getValue(); + } + + private @Nullable IRecipeTransferError transferRecipeOnClient(StockKeeperRequestMenu container, Recipe recipe, + IRecipeSlotsView recipeSlots, Player player, boolean maxTransfer, boolean doTransfer) { + if (!(container.screenReference instanceof StockKeeperRequestScreen screen)) + return null; + + for (BigItemStack order : screen.recipesToOrder) + if (order instanceof CraftableBigItemStack cbis && cbis.recipe == recipe) + return new RecipeTransferErrorTooltip(CreateLang.temporaryText( + "Already ordering this recipe") + .component()); + + if (screen.itemsToOrder.size() >= 9) + return new RecipeTransferErrorTooltip(CreateLang.temporaryText("Order slots already full") + .component()); + + InventorySummary summary = screen.getMenu().contentHolder.getLastClientsideStockSnapshotAsSummary(); + if (summary == null) + return null; + + Container outputDummy = new RecipeWrapper(new ItemStackHandler(9)); + List craftingSlots = new ArrayList<>(); + for (int i = 0; i < outputDummy.getContainerSize(); i++) + craftingSlots.add(new Slot(outputDummy, i, 0, 0)); + + List stacksByCount = summary.getStacksByCount(); + Container inputDummy = new RecipeWrapper(new ItemStackHandler(stacksByCount.size())); + Map availableItemStacks = new HashMap<>(); + for (int j = 0; j < stacksByCount.size(); j++) { + BigItemStack bigItemStack = stacksByCount.get(j); + availableItemStacks.put(new Slot(inputDummy, j, 0, 0), + bigItemStack.stack.copyWithCount(bigItemStack.count)); + } + + RecipeTransferOperationsResult transferOperations = + RecipeTransferUtil.getRecipeTransferOperations(helpers.getStackHelper(), availableItemStacks, + recipeSlots.getSlotViews(RecipeIngredientRole.INPUT), craftingSlots); + + if (!transferOperations.missingItems.isEmpty()) + return new RecipeTransferErrorMissingSlots(CreateLang.temporaryText("Required items are not in Stock") + .component(), transferOperations.missingItems); + + if (!doTransfer) + return null; + + screen.recipesToOrder.add(new CraftableBigItemStack(recipe.getResultItem(player.level() + .registryAccess()), recipe)); + screen.searchBox.setValue(""); + screen.refreshSearchNextTick = true; + return null; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/AddressEditBox.java b/src/main/java/com/simibubi/create/content/logistics/AddressEditBox.java index b1103e7ef4..6dd887100a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/AddressEditBox.java +++ b/src/main/java/com/simibubi/create/content/logistics/AddressEditBox.java @@ -78,7 +78,7 @@ public class AddressEditBox extends EditBox { if (!destinationSuggestions.isEmpty()) return; - + int itemX = getX() + width + 4; int itemY = getY() - 4; pGuiGraphics.renderItem(AllBlocks.CLIPBOARD.asStack(), itemX, itemY); @@ -90,13 +90,13 @@ public class AddressEditBox extends EditBox { CreateLang.translate("gui.address_box.clipboard_tip_1") .style(ChatFormatting.GRAY) .component(), - CreateLang.translate("gui.address_box.clipboard_tip_2") + CreateLang.translate("gui.address_box.clipboard_tip_2") .style(ChatFormatting.GRAY) .component(), - CreateLang.translate("gui.address_box.clipboard_tip_3") + CreateLang.translate("gui.address_box.clipboard_tip_3") .style(ChatFormatting.GRAY) .component(), - CreateLang.translate("gui.address_box.clipboard_tip_4") + CreateLang.translate("gui.address_box.clipboard_tip_4") .style(ChatFormatting.DARK_GRAY) .component()); pGuiGraphics.renderComponentTooltip(Minecraft.getInstance().font, promiseTip, pMouseX, pMouseY); diff --git a/src/main/java/com/simibubi/create/content/logistics/BigItemStack.java b/src/main/java/com/simibubi/create/content/logistics/BigItemStack.java index 19bda7497c..c6517e1e7a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/BigItemStack.java +++ b/src/main/java/com/simibubi/create/content/logistics/BigItemStack.java @@ -74,5 +74,5 @@ public class BigItemStack { return "(" + stack.getHoverName() .getString() + " x" + count + ")"; } - + } diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/InventorySummary.java b/src/main/java/com/simibubi/create/content/logistics/packager/InventorySummary.java index efb6d3aa7a..2e8c9e8b76 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/InventorySummary.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/InventorySummary.java @@ -47,6 +47,10 @@ public class InventorySummary { public void add(BigItemStack entry) { add(entry.stack, entry.count); } + + public Map> getItemMap() { + return items; + } public InventorySummary copy() { InventorySummary inventorySummary = new InventorySummary(); diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/CraftableBigItemStack.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/CraftableBigItemStack.java new file mode 100644 index 0000000000..58649c783a --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/CraftableBigItemStack.java @@ -0,0 +1,24 @@ +package com.simibubi.create.content.logistics.stockTicker; + +import java.util.List; + +import com.simibubi.create.content.logistics.BigItemStack; + +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.Recipe; + +public class CraftableBigItemStack extends BigItemStack { + + public Recipe recipe; + + public CraftableBigItemStack(ItemStack stack, Recipe recipe) { + super(stack); + this.recipe = recipe; + } + + public List getIngredients() { + return recipe.getIngredients(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/RequestCraftableHelper.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/RequestCraftableHelper.java deleted file mode 100644 index e772d2425d..0000000000 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/RequestCraftableHelper.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.simibubi.create.content.logistics.stockTicker; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import com.simibubi.create.content.logistics.BigItemStack; -import com.simibubi.create.content.logistics.packager.InventorySummary; - -import net.createmod.catnip.utility.IntAttached; -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.core.RegistryAccess; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.crafting.Ingredient; -import net.minecraft.world.item.crafting.Recipe; -import net.minecraft.world.item.crafting.RecipeManager; -import net.minecraft.world.item.crafting.RecipeSerializer; -import net.minecraft.world.item.crafting.RecipeType; - -public class RequestCraftableHelper { - - class CraftingDependency { - - private int amount; - private List options; - - CraftingDependency(int amount, List options) { - this.amount = amount; - this.options = options; - } - - boolean canReuseFor(Ingredient ingredient) { - return options.stream() - .allMatch(ingredient); - } - - } - - record CraftableItem(ItemStack result, List dependencies) { - } - - private List> craftableByDepth; - - public void rebuild(InventorySummary baseItems) { - List stacksByCount = baseItems.getStacksByCount(); - ClientLevel level = Minecraft.getInstance().level; - RecipeManager recipeManager = level.getRecipeManager(); - RegistryAccess registryAccess = level.registryAccess(); - Set> checked = new HashSet<>(); - - for (int depth = 0; depth < 3; depth++) { - List itemsOnThisDepth = new ArrayList<>(); - - recipeManager.getAllRecipesFor(RecipeType.CRAFTING) - .parallelStream() - .filter(r -> r.getSerializer() == RecipeSerializer.SHAPED_RECIPE - || r.getSerializer() == RecipeSerializer.SHAPELESS_RECIPE) - .filter(r -> r.getIngredients() - .stream() - .allMatch(i -> stacksByCount.stream() - .anyMatch(b -> i.test(b.stack)) - || craftableByDepth.stream() - .anyMatch(l -> l.stream() - .anyMatch(s -> i.test(s.result))))) - - .forEachOrdered(r -> { - ItemStack resultItem = r.getResultItem(registryAccess); - List dependencies = new ArrayList<>(); - - Ingredients: for (Ingredient ingredient : r.getIngredients()) { - if (ingredient.isEmpty()) - continue; - - for (CraftingDependency existing : dependencies) { - if (!existing.canReuseFor(ingredient)) - continue; - existing.amount++; - continue Ingredients; - } - - List list = stacksByCount.stream() - .map(b -> b.stack) - .filter(ingredient) - .toList(); - - for (List layer : craftableByDepth) { - if (!list.isEmpty()) - break; - list = layer.stream() - .map(b -> b.result) - .filter(ingredient) - .toList(); - } - - dependencies.add(new CraftingDependency(1, list)); - } - - itemsOnThisDepth.add(new CraftableItem(resultItem, dependencies)); - }); - - craftableByDepth.add(itemsOnThisDepth); - } - - } - -} diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperOpenRequestScreenPacket.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperOpenRequestScreenPacket.java deleted file mode 100644 index 41e87326ab..0000000000 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperOpenRequestScreenPacket.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.simibubi.create.content.logistics.stockTicker; - -import com.simibubi.create.AllBlocks; -import com.simibubi.create.AllTags.AllItemTags; -import com.simibubi.create.foundation.networking.SimplePacketBase; - -import net.createmod.catnip.gui.ScreenOpener; -import net.minecraft.client.Minecraft; -import net.minecraft.client.player.LocalPlayer; -import net.minecraft.core.BlockPos; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.world.item.ItemStack; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.network.NetworkEvent.Context; - -public class StockKeeperOpenRequestScreenPacket extends SimplePacketBase { - - private BlockPos pos; - private boolean isAdmin; - private boolean isLocked; - - public StockKeeperOpenRequestScreenPacket(BlockPos pos, boolean isAdmin, boolean isLocked) { - this.pos = pos; - this.isAdmin = isAdmin; - this.isLocked = isLocked; - } - - public StockKeeperOpenRequestScreenPacket(FriendlyByteBuf buffer) { - pos = buffer.readBlockPos(); - isAdmin = buffer.readBoolean(); - isLocked = buffer.readBoolean(); - } - - @Override - public void write(FriendlyByteBuf buffer) { - buffer.writeBlockPos(pos); - buffer.writeBoolean(isAdmin); - buffer.writeBoolean(isLocked); - } - - @Override - @OnlyIn(Dist.CLIENT) - public boolean handle(Context context) { - context.enqueueWork(() -> { - LocalPlayer player = Minecraft.getInstance().player; - if (player == null) - return; - ItemStack mainHandItem = player.getMainHandItem(); - final boolean encodeMode = - AllItemTags.TABLE_CLOTHS.matches(mainHandItem) || AllBlocks.REDSTONE_REQUESTER.isIn(mainHandItem); - if (player.level() - .getBlockEntity(pos) instanceof StockTickerBlockEntity be) - ScreenOpener.open(new StockTickerRequestScreen(be, isAdmin, isLocked, encodeMode)); - }); - return true; - } - -} diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperRequestMenu.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperRequestMenu.java new file mode 100644 index 0000000000..e52968d8e7 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperRequestMenu.java @@ -0,0 +1,64 @@ +package com.simibubi.create.content.logistics.stockTicker; + +import java.util.List; + +import com.simibubi.create.AllMenuTypes; +import com.simibubi.create.foundation.gui.menu.MenuBase; + +import net.minecraft.client.Minecraft; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.item.ItemStack; + +public class StockKeeperRequestMenu extends MenuBase { + + boolean isAdmin; + boolean isLocked; + + public Object screenReference; + + public StockKeeperRequestMenu(MenuType type, int id, Inventory inv, FriendlyByteBuf extraData) { + super(type, id, inv, extraData); + } + + public StockKeeperRequestMenu(MenuType type, int id, Inventory inv, StockTickerBlockEntity contentHolder) { + super(type, id, inv, contentHolder); + } + + public static AbstractContainerMenu create(int pContainerId, Inventory pPlayerInventory, + StockTickerBlockEntity stockTickerBlockEntity) { + return new StockKeeperCategoryMenu(AllMenuTypes.STOCK_KEEPER_REQUEST.get(), pContainerId, pPlayerInventory, + stockTickerBlockEntity); + } + + @Override + protected StockTickerBlockEntity createOnClient(FriendlyByteBuf extraData) { + isAdmin = extraData.readBoolean(); + isLocked = extraData.readBoolean(); + if (Minecraft.getInstance().level + .getBlockEntity(extraData.readBlockPos()) instanceof StockTickerBlockEntity stbe) + return stbe; + return null; + } + + @Override + protected void initAndReadInventory(StockTickerBlockEntity contentHolder) {} + + @Override + public void initializeContents(int pStateId, List pItems, ItemStack pCarried) {} + + @Override + protected void addSlots() {} + + @Override + protected void saveData(StockTickerBlockEntity contentHolder) {} + + @Override + public ItemStack quickMoveStack(Player pPlayer, int pIndex) { + return ItemStack.EMPTY; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperRequestScreen.java similarity index 73% rename from src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java rename to src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperRequestScreen.java index 86c528c471..b620c19c64 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerRequestScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperRequestScreen.java @@ -17,9 +17,9 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Axis; import com.simibubi.create.AllBlocks; -import com.simibubi.create.AllItems; import com.simibubi.create.AllPackets; import com.simibubi.create.AllPartialModels; +import com.simibubi.create.AllTags.AllItemTags; import com.simibubi.create.content.contraptions.actors.seat.SeatEntity; import com.simibubi.create.content.logistics.AddressEditBox; import com.simibubi.create.content.logistics.BigItemStack; @@ -30,10 +30,10 @@ import com.simibubi.create.content.processing.burner.BlazeBurnerRenderer; import com.simibubi.create.content.trains.station.NoShadowFontWrapper; import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.ScreenWithStencils; +import com.simibubi.create.foundation.gui.menu.AbstractSimiContainerScreen; import com.simibubi.create.foundation.utility.CreateLang; import dev.engine_room.flywheel.lib.model.baked.PartialModel; -import net.createmod.catnip.gui.AbstractSimiScreen; import net.createmod.catnip.gui.UIRenderHelper; import net.createmod.catnip.gui.element.GuiGameElement; import net.createmod.catnip.utility.AnimationTickHolder; @@ -50,19 +50,22 @@ import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.EditBox; import net.minecraft.client.gui.screens.inventory.InventoryScreen; import net.minecraft.client.gui.screens.inventory.tooltip.TooltipRenderUtil; +import net.minecraft.client.renderer.Rect2i; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.util.Mth; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.Pose; +import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.phys.AABB; import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.registries.ForgeRegistries; -public class StockTickerRequestScreen extends AbstractSimiScreen implements ScreenWithStencils { +public class StockKeeperRequestScreen extends AbstractSimiContainerScreen + implements ScreenWithStencils { private static final AllGuiTextures NUMBERS = AllGuiTextures.NUMBERS; private static final AllGuiTextures HEADER = AllGuiTextures.STOCK_KEEPER_REQUEST_HEADER; @@ -70,7 +73,7 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre private static final AllGuiTextures FOOTER = AllGuiTextures.STOCK_KEEPER_REQUEST_FOOTER; StockTickerBlockEntity blockEntity; - LerpedFloat itemScroll; + public LerpedFloat itemScroll; final int rows = 9; final int cols = 9; @@ -82,41 +85,43 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre int orderY; int lockX; int lockY; + int windowWidth; + int windowHeight; - EditBox searchBox; + public EditBox searchBox; EditBox addressBox; int emptyTicks = 0; int successTicks = 0; - List> currentItemSource; - List> displayedItems; - List> categories; + public List> currentItemSource; + public List> displayedItems; + public List> categories; - List itemsToOrder; + public List itemsToOrder; + public List recipesToOrder; WeakReference stockKeeper; WeakReference blaze; boolean encodeRequester; // Redstone requesters + ItemStack itemToProgram; private boolean isAdmin; private boolean isLocked; - private boolean refreshSearchNextTick; + public boolean refreshSearchNextTick; + private List extraAreas = Collections.emptyList(); - public StockTickerRequestScreen(StockTickerBlockEntity be, boolean isAdmin, boolean isLocked, - boolean encodeRequester) { - super(be.getBlockState() - .getBlock() - .getName()); - this.isAdmin = isAdmin; - this.isLocked = isLocked; - this.encodeRequester = encodeRequester; + public StockKeeperRequestScreen(StockKeeperRequestMenu container, Inventory inv, Component title) { + super(container, inv, title); displayedItems = new ArrayList<>(); itemsToOrder = new ArrayList<>(); + recipesToOrder = new ArrayList<>(); categories = new ArrayList<>(); - blockEntity = be; + isAdmin = menu.isAdmin; + isLocked = menu.isLocked; + blockEntity = container.contentHolder; blockEntity.lastClientsideStockSnapshot = null; blockEntity.ticksSinceLastUpdate = 15; emptyTicks = 0; @@ -126,21 +131,26 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre stockKeeper = new WeakReference<>(null); blaze = new WeakReference<>(null); refreshSearchNextTick = false; + menu.screenReference = this; + + itemToProgram = Minecraft.getInstance().player.getMainHandItem(); + encodeRequester = + AllItemTags.TABLE_CLOTHS.matches(itemToProgram) || AllBlocks.REDSTONE_REQUESTER.isIn(itemToProgram); // Find the keeper for rendering for (int yOffset : Iterate.zeroAndOne) { for (Direction side : Iterate.horizontalDirections) { - BlockPos seatPos = be.getBlockPos() + BlockPos seatPos = blockEntity.getBlockPos() .below(yOffset) .relative(side); - for (SeatEntity seatEntity : be.getLevel() + for (SeatEntity seatEntity : blockEntity.getLevel() .getEntitiesOfClass(SeatEntity.class, new AABB(seatPos))) if (!seatEntity.getPassengers() .isEmpty() && seatEntity.getPassengers() .get(0) instanceof LivingEntity keeper) stockKeeper = new WeakReference<>(keeper); - if (yOffset == 0 && be.getLevel() + if (yOffset == 0 && blockEntity.getLevel() .getBlockEntity(seatPos) instanceof BlazeBurnerBlockEntity bbbe) { blaze = new WeakReference<>(bbbe); return; @@ -159,20 +169,21 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre appropriateHeight = Math.min(appropriateHeight, HEADER.getHeight() + FOOTER.getHeight() + BODY.getHeight() * 17); - setWindowSize(256, appropriateHeight); + setWindowSize(windowWidth = 226, windowHeight = appropriateHeight); super.init(); + clearWidgets(); - int x = guiLeft; - int y = guiTop; + int x = getGuiLeft(); + int y = getGuiTop(); itemsX = x + (windowWidth - cols * colWidth) / 2 + 1; itemsY = y + 33; orderY = y + windowHeight - 72; - lockX = x + 200; + lockX = x + 186; lockY = y + 18; MutableComponent searchLabel = CreateLang.translateDirect("gui.stock_keeper.search_items"); - searchBox = new EditBox(new NoShadowFontWrapper(font), x + 86, y + 22, 100, 9, searchLabel); + searchBox = new EditBox(new NoShadowFontWrapper(font), x + 71, y + 22, 100, 9, searchLabel); searchBox.setMaxLength(50); searchBox.setBordered(false); searchBox.setTextColor(0x4A2D31); @@ -180,11 +191,24 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre boolean initial = addressBox == null; addressBox = - new AddressEditBox(this, new NoShadowFontWrapper(font), x + 42, y + windowHeight - 36, 90, 10, true); + new AddressEditBox(this, new NoShadowFontWrapper(font), x + 27, y + windowHeight - 36, 90, 10, true); addressBox.setTextColor(0x714A40); if (initial) addressBox.setValue(blockEntity.previouslyUsedAddress); addRenderableWidget(addressBox); + + extraAreas = new ArrayList<>(); + int leftHeight = 40; + int rightHeight = 50; + + LivingEntity keeper = stockKeeper.get(); + if (keeper != null && keeper.isAlive()) + leftHeight = (int) (Math.max(0, keeper.getBoundingBox() + .getYsize()) * 50); + + extraAreas.add(new Rect2i(0, y + windowHeight - 15 - leftHeight, x, height)); + if (encodeRequester) + extraAreas.add(new Rect2i(x + windowWidth, y + windowHeight - 15 - rightHeight, rightHeight, rightHeight)); } private void refreshSearchResults(boolean scrollBackUp) { @@ -197,28 +221,41 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre return; } + boolean hasCraftables = hasCraftables(); + categories = new ArrayList<>(); + if (hasCraftables) + categories.add(Pair.of(CreateLang.translate("gui.stock_keeper.jei_category") + .string(), 0)); + blockEntity.categories.forEach(stack -> categories.add(Pair.of(stack.isEmpty() ? "" : stack.getHoverName() .getString(), 0))); - categories.add(Pair.of(CreateLang.translate("gui.stock_keeper.unsorted_category") + categories.add(Pair.of(CreateLang + .translate(blockEntity.categories.isEmpty() ? "gui.stock_keeper.storage_category" + : "gui.stock_keeper.unsorted_category") .string(), 0)); String valueWithPrefix = searchBox.getValue(); boolean anyItemsInCategory = false; + int extraCategories = hasCraftables ? 1 : 0; + // Nothing is being filtered out if (valueWithPrefix.isBlank()) { - displayedItems = currentItemSource; + displayedItems = new ArrayList<>(currentItemSource); + + if (hasCraftables) + displayedItems.add(0, getCraftables()); int categoryY = 0; - for (int categoryIndex = 0; categoryIndex < currentItemSource.size(); categoryIndex++) { + for (int categoryIndex = 0; categoryIndex < currentItemSource.size() + extraCategories; categoryIndex++) { categories.get(categoryIndex) .setSecond(categoryY); List displayedItemsInCategory = displayedItems.get(categoryIndex); if (displayedItemsInCategory.isEmpty()) continue; - if (categoryIndex < currentItemSource.size() - 1) + if (categoryIndex - extraCategories < currentItemSource.size() - 1) anyItemsInCategory = true; categoryY += rowHeight; @@ -232,6 +269,7 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre return; } + // Filter by search string boolean modSearch = false; boolean tagSearch = false; if ((modSearch = valueWithPrefix.startsWith("@")) || (tagSearch = valueWithPrefix.startsWith("#"))) @@ -241,9 +279,13 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre displayedItems = new ArrayList<>(); currentItemSource.forEach($ -> displayedItems.add(new ArrayList<>())); + if (hasCraftables) + displayedItems.add(new ArrayList<>()); + int categoryY = 0; - for (int categoryIndex = 0; categoryIndex < currentItemSource.size(); categoryIndex++) { - List category = currentItemSource.get(categoryIndex); + for (int categoryIndex = 0; categoryIndex < displayedItems.size(); categoryIndex++) { + List category = categoryIndex - extraCategories < 0 ? getCraftables() + : currentItemSource.get(categoryIndex - extraCategories); categories.get(categoryIndex) .setSecond(categoryY); @@ -286,7 +328,7 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre if (displayedItemsInCategory.isEmpty()) continue; - if (categoryIndex < currentItemSource.size() - 1) + if (categoryIndex - extraCategories < currentItemSource.size() - 1) anyItemsInCategory = true; categoryY += rowHeight; categoryY += Math.ceil(displayedItemsInCategory.size() / (float) cols) * rowHeight; @@ -299,8 +341,8 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre } @Override - public void tick() { - super.tick(); + protected void containerTick() { + super.containerTick(); addressBox.tick(); boolean allEmpty = true; @@ -350,23 +392,23 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre } @Override - protected void renderWindow(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + protected void renderBg(GuiGraphics graphics, float partialTicks, int mouseX, int mouseY) { PoseStack ms = graphics.pose(); float currentScroll = itemScroll.getValue(partialTicks); Couple hoveredSlot = getHoveredSlot(mouseX, mouseY); - int x = guiLeft; - int y = guiTop; + int x = getGuiLeft(); + int y = getGuiTop(); // BG - HEADER.render(graphics, x, y); + HEADER.render(graphics, x - 15, y); y += HEADER.getHeight(); for (int i = 0; i < (windowHeight - HEADER.getHeight() - FOOTER.getHeight()) / BODY.getHeight(); i++) { - BODY.render(graphics, x, y); + BODY.render(graphics, x - 15, y); y += BODY.getHeight(); } - FOOTER.render(graphics, x, y); - y = guiTop; + FOOTER.render(graphics, x - 15, y); + y = getGuiTop(); // Render text input hints if (addressBox.getValue() @@ -381,10 +423,8 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre ms.translate(0, 0, -300); entitySizeOffset = (int) (Math.max(0, keeper.getBoundingBox() .getXsize() - 1) * 50); - int entityX = x - 20 - entitySizeOffset; + int entityX = x - 35 - entitySizeOffset; int entityY = y + windowHeight - 17; - AllGuiTextures.STOCK_KEEPER_REQUEST_SAYS.render(graphics, x + 226, - entityY - (int) (keeper.getEyeHeight(Pose.STANDING) * 50) / 2 * 2); InventoryScreen.renderEntityInInventoryFollowsMouse(graphics, entityX, entityY, 50, entityX - mouseX, Mth.clamp(entityY - mouseY, -50, 10), keeper); ms.popPose(); @@ -393,9 +433,8 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre BlazeBurnerBlockEntity keeperBE = blaze.get(); if (keeperBE != null && !keeperBE.isRemoved()) { ms.pushPose(); - int entityX = x - 20; + int entityX = x - 35; int entityY = y + windowHeight - 23; - AllGuiTextures.STOCK_KEEPER_REQUEST_SAYS.render(graphics, x + 226, (entityY - 22) / 2 * 2); ms.translate(entityX, entityY, -100); ms.mulPose(Axis.XP.rotationDegrees(-22.5f)); ms.mulPose(Axis.YP.rotationDegrees(-45)); @@ -416,29 +455,14 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre } // Render static item icons - ms.pushPose(); - ms.translate(x + windowWidth - 10, y + windowHeight - 67, 0); - ms.scale(3.5f, 3.5f, 3.5f); - GuiGameElement - .of(encodeRequester ? AllBlocks.REDSTONE_REQUESTER.asStack() : AllItems.CARDBOARD_PACKAGE_12x12.asStack()) - .render(graphics); - ms.popPose(); - - // Linked packager count -// ms.pushPose(); -// ms.translate(x + windowWidth + 39 + entitySizeOffset, y + windowHeight - 105, 0); -// ms.scale(2.25f, 2.25f, 2.25f); -// GuiGameElement.of(AllBlocks.PACKAGER.asStack()) -// .render(graphics); -// ms.translate(0, -9, 15); -// GuiGameElement.of(AllBlocks.STOCK_LINK.asStack()) -// .render(graphics); -// ms.popPose(); -// ms.pushPose(); -// ms.translate(0, 0, 300); -// graphics.drawString(font, CreateLang.text(blockEntity.activeLinks + "") -// .component(), x + windowWidth + 76 + entitySizeOffset, y + windowHeight - 105, 0x88dddddd); -// ms.popPose(); + if (encodeRequester) { + ms.pushPose(); + ms.translate(x + windowWidth + 5, y + windowHeight - 70, 0); + ms.scale(3.5f, 3.5f, 3.5f); + GuiGameElement.of(itemToProgram) + .render(graphics); + ms.popPose(); + } // Render ordered items for (int index = 0; index < cols; index++) { @@ -456,7 +480,7 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre boolean justSent = itemsToOrder.isEmpty() && successTicks > 0; if (isConfirmHovered(mouseX, mouseY) && !justSent) - AllGuiTextures.STOCK_KEEPER_REQUEST_SEND_HOVER.render(graphics, x + windowWidth - 96, + AllGuiTextures.STOCK_KEEPER_REQUEST_SEND_HOVER.render(graphics, x + windowWidth - 81, y + windowHeight - 41); MutableComponent headerTitle = CreateLang.translate("gui.stock_keeper.title") @@ -472,14 +496,14 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre ms.pushPose(); ms.translate(alpha * alpha * 50, 0, 0); if (successTicks < 10) - graphics.drawString(font, component, x + windowWidth - 57 - font.width(component) / 2, + graphics.drawString(font, component, x + windowWidth - 42 - font.width(component) / 2, y + windowHeight - 35, new Color(0x252525).setAlpha(1 - alpha * alpha) .getRGB(), false); ms.popPose(); } else { - graphics.drawString(font, component, x + windowWidth - 57 - font.width(component) / 2, + graphics.drawString(font, component, x + windowWidth - 42 - font.width(component) / 2, y + windowHeight - 35, 0x252525, false); } @@ -490,7 +514,7 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre int msgX = x + windowWidth / 2 - font.width(msg) / 2; int msgY = orderY + 5; if (alpha > 0) { - int c1 = new Color(0xB59370).setAlpha(alpha * 0.75f) + int c1 = new Color(0xB59370).setAlpha(alpha) .getRGB(); int c2 = new Color(0xEDD8BB).setAlpha(alpha * 0) .getRGB(); @@ -502,7 +526,7 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre } } - int itemWindowX = x + 36; + int itemWindowX = x + 21; int itemWindowX2 = itemWindowX + 184; int itemWindowY = y + 17; int itemWindowY2 = y + windowHeight - 80; @@ -521,11 +545,11 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre continue; if (sliceY - currentScroll * rowHeight > windowHeight - 72) continue; - AllGuiTextures.STOCK_KEEPER_REQUEST_BG.render(graphics, x + 37, y + sliceY + 18); + AllGuiTextures.STOCK_KEEPER_REQUEST_BG.render(graphics, x + 22, y + sliceY + 18); } // Search bar - AllGuiTextures.STOCK_KEEPER_REQUEST_SEARCH.render(graphics, x + 57, searchBox.getY() - 5); + AllGuiTextures.STOCK_KEEPER_REQUEST_SEARCH.render(graphics, x + 42, searchBox.getY() - 5); searchBox.render(graphics, mouseX, mouseY, partialTicks); if (searchBox.getValue() .isBlank() && !searchBox.isFocused()) @@ -614,12 +638,15 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre } // Render tooltip of hovered item - if (hoveredSlot != noneHovered) - graphics.renderTooltip(font, - hoveredSlot.getFirst() == -1 ? itemsToOrder.get(hoveredSlot.getSecond()).stack - : displayedItems.get(hoveredSlot.getFirst()) - .get(hoveredSlot.getSecond()).stack, - mouseX, mouseY); + if (hoveredSlot != noneHovered) { + BigItemStack entry = hoveredSlot.getFirst() == -1 ? itemsToOrder.get(hoveredSlot.getSecond()) + : displayedItems.get(hoveredSlot.getFirst()) + .get(hoveredSlot.getSecond()); + if (entry instanceof CraftableBigItemStack cbis) { + // TODO: what is being used to craft this? + } else + graphics.renderTooltip(font, entry.stack, mouseX, mouseY); + } // Render tooltip of lock option if (currentScroll < 1 && isAdmin && mouseX > lockX && mouseX <= lockX + 15 && mouseY > lockY @@ -649,12 +676,16 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre int customCount = entry.count; if (!isRenderingOrders) { - BigItemStack order = getOrderForItem(entry.stack); + BigItemStack order = getOrderForItem(entry); if (order != null && entry.count < BigItemStack.INF) customCount -= order.count; AllGuiTextures.STOCK_KEEPER_REQUEST_SLOT.render(graphics, 0, 0); } + if (entry instanceof CraftableBigItemStack) + (isRenderingOrders ? AllGuiTextures.STOCK_KEEPER_REQUEST_ORDERED_CRAFTING_SLOT + : AllGuiTextures.STOCK_KEEPER_REQUEST_CRAFTING_SLOT).render(graphics, 0, 0); + PoseStack ms = graphics.pose(); ms.pushPose(); @@ -714,7 +745,7 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre // return; // } - int x = -text.length() * 2; + int x = (int) Math.floor(-text.length() * 2.5); for (char c : text.toCharArray()) { int index = c - '0'; int xOffset = index * 6; @@ -750,10 +781,16 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre } @Nullable - private BigItemStack getOrderForItem(ItemStack stack) { - for (BigItemStack entry : itemsToOrder) - if (ItemHandlerHelper.canItemStacksStack(stack, entry.stack)) + private BigItemStack getOrderForItem(BigItemStack stack) { + for (BigItemStack entry : itemsToOrder) { + if (entry instanceof CraftableBigItemStack != stack instanceof CraftableBigItemStack) + continue; + if (entry instanceof CraftableBigItemStack c1 && stack instanceof CraftableBigItemStack c2 + && c1.recipe != c2.recipe) + continue; + if (ItemHandlerHelper.canItemStacksStack(stack.stack, entry.stack)) return entry; + } return null; } @@ -765,11 +802,23 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre return; } for (BigItemStack entry : itemsToOrder) { + if (entry instanceof CraftableBigItemStack cbis) { + for (BigItemStack entry2 : recipesToOrder) + if (entry2 instanceof CraftableBigItemStack cbis2 && cbis.recipe == cbis2.recipe) + cbis.count = Math.min(cbis2.count, cbis.count); + invalid.remove(cbis); + continue; + } entry.count = Math.min(summary.getCountOf(entry.stack), entry.count); if (entry.count > 0) invalid.remove(entry); } + itemsToOrder.removeAll(invalid); + if (invalid.stream() + .anyMatch(i -> i instanceof CraftableBigItemStack)) { + refreshSearchNextTick = true; + } } private Couple getHoveredSlot(int x, int y) { @@ -784,7 +833,7 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre return Couple.create(-1, col); } - if (y < guiTop + 16 || y > guiTop + windowHeight - 69) + if (y < getGuiTop() + 16 || y > getGuiTop() + windowHeight - 80) return noneHovered; if (!itemScroll.settled()) return noneHovered; @@ -814,8 +863,8 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre } private boolean isConfirmHovered(int mouseX, int mouseY) { - int confirmX = guiLeft + 161; - int confirmY = guiTop + windowHeight - 39; + int confirmX = getGuiLeft() + 161; + int confirmY = getGuiTop() + windowHeight - 39; int confirmW = 78; int confirmH = 18; @@ -887,25 +936,42 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre boolean orderClicked = hoveredSlot.getFirst() == -1; ItemStack itemStack = entry.stack; - BigItemStack existingOrder = getOrderForItem(itemStack); + BigItemStack existingOrder = getOrderForItem(entry); if (existingOrder == null) { if (itemsToOrder.size() >= cols || rmb) return true; - itemsToOrder.add(existingOrder = new BigItemStack(itemStack.copyWithCount(1), 0)); + if (entry instanceof CraftableBigItemStack cbis) { + itemsToOrder.add(existingOrder = new CraftableBigItemStack(itemStack.copyWithCount(1), cbis.recipe)); + existingOrder.count = 0; + } else + itemsToOrder.add(existingOrder = new BigItemStack(itemStack.copyWithCount(1), 0)); } + boolean isCrafted = existingOrder instanceof CraftableBigItemStack; int transfer = hasShiftDown() ? itemStack.getMaxStackSize() : hasControlDown() ? 10 : 1; + + if (existingOrder instanceof CraftableBigItemStack cbis) { + int increments = cbis.recipe.getResultItem(blockEntity.getLevel() + .registryAccess()) + .getCount(); + transfer = Mth.ceil(transfer / (float) increments) * increments; + } + int current = existingOrder.count; if (rmb || orderClicked) { existingOrder.count = current - transfer; if (existingOrder.count <= 0) itemsToOrder.remove(existingOrder); + if (isCrafted) + refreshSearchResults(false); return true; } existingOrder.count = current + Math.min(transfer, entry.count - current); + if (isCrafted) + refreshSearchResults(false); return true; } @@ -996,11 +1062,14 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre if (itemsToOrder.isEmpty()) return; + // TODO convert craftable to their respective ingredients + AllPackets.getChannel() .sendToServer(new PackageOrderRequestPacket(blockEntity.getBlockPos(), new PackageOrder(itemsToOrder), addressBox.getValue(), encodeRequester)); itemsToOrder = new ArrayList<>(); + recipesToOrder = new ArrayList<>(); blockEntity.ticksSinceLastUpdate = 10; successTicks = 1; @@ -1013,4 +1082,124 @@ public class StockTickerRequestScreen extends AbstractSimiScreen implements Scre return super.keyReleased(pKeyCode, pScanCode, pModifiers); } + @Override + public List getExtraAreas() { + return extraAreas; + } + + private boolean hasCraftables() { + return !recipesToOrder.isEmpty(); + } + + private ArrayList getCraftables() { + ArrayList list = new ArrayList<>(); + for (BigItemStack ordered : recipesToOrder) + if (ordered instanceof CraftableBigItemStack cbis) + list.add(new CraftableBigItemStack(cbis.stack, cbis.recipe)); + updateCraftableAmounts(list); + return list; + } + + private void updateCraftableAmounts(List craftables) { + InventorySummary usedItems = new InventorySummary(); + InventorySummary availableItems = blockEntity.lastClientsideStockSnapshotAsSummary; + if (availableItems == null) + return; + + List craftablesOrderedFirst = new ArrayList<>(); + for (BigItemStack bis : itemsToOrder) + if (bis instanceof CraftableBigItemStack cbis) + for (BigItemStack bis2 : craftables) + if (bis2 instanceof CraftableBigItemStack cbis2 && cbis.recipe == cbis2.recipe) + craftablesOrderedFirst.add(cbis2); + + for (BigItemStack bis : craftables) + if (!craftablesOrderedFirst.contains(bis)) + craftablesOrderedFirst.add(bis); + + Orders: for (BigItemStack ordered : craftablesOrderedFirst) { + if (!(ordered instanceof CraftableBigItemStack cbis)) + continue; + + List ingredients = cbis.getIngredients(); + List> validEntriesByIngredient = new ArrayList<>(); + List visited = new ArrayList<>(); + + for (Ingredient ingredient : ingredients) { + if (ingredient.isEmpty()) + continue; + List valid = new ArrayList<>(); + for (List list : availableItems.getItemMap() + .values()) + Entries: for (BigItemStack entry : list) { + if (!ingredient.test(entry.stack)) + continue; + BigItemStack asBis = new BigItemStack(entry.stack, entry.count); + BigItemStack orderForItem = getOrderForItem(asBis); + if (orderForItem != null) + asBis.count -= orderForItem.count; + asBis.count = Math.max(0, asBis.count - usedItems.getCountOf(entry.stack)); + valid.add(asBis); + for (ItemStack visitedStack : visited) { + if (!ItemHandlerHelper.canItemStacksStack(visitedStack, entry.stack)) + continue; + visitedStack.grow(1); + continue Entries; + } + visited.add(entry.stack.copyWithCount(1)); + } + + if (valid.isEmpty()) { + cbis.count = 0; + continue Orders; + } + + validEntriesByIngredient.add(valid); + } + + // Ingredients with shared items must divide counts + for (ItemStack visitedItem : visited) { + for (List list : validEntriesByIngredient) { + for (BigItemStack entry : list) { + if (!ItemHandlerHelper.canItemStacksStack(entry.stack, visitedItem)) + continue; + entry.count = entry.count / visitedItem.getCount(); + } + } + } + + // Determine the bottlenecking ingredient + int minCount = Integer.MAX_VALUE; + for (List list : validEntriesByIngredient) { + int sum = 0; + for (BigItemStack entry : list) + sum += entry.count; + minCount = Math.min(sum, minCount); + } + + int outputCount = cbis.recipe.getResultItem(blockEntity.getLevel() + .registryAccess()) + .getCount(); + + cbis.count = minCount * outputCount; + + // Use ingredients up before checking next recipe + BigItemStack orderForItem = getOrderForItem(cbis); + if (orderForItem == null) + continue Orders; + for (List list : validEntriesByIngredient) { + int remaining = orderForItem.count / outputCount; + for (BigItemStack entry : list) { + if (remaining <= 0) + break; + usedItems.add(entry.stack, Math.min(remaining, entry.count)); + remaining -= entry.count; + } + } + + continue Orders; + } + + } + } diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlock.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlock.java index 0d4015c3a6..0a96b4dd21 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlock.java @@ -57,7 +57,7 @@ public class StockTickerBlock extends HorizontalDirectionalBlock implements IBE< if (pPlayer != null && pPlayer.getItemInHand(pHand) .getItem() instanceof LogisticallyLinkedBlockItem) return InteractionResult.PASS; - + return onBlockEntityUse(pLevel, pPos, stbe -> { if (!stbe.behaviour.mayInteractMessage(pPlayer)) return InteractionResult.SUCCESS; @@ -72,7 +72,7 @@ public class StockTickerBlock extends HorizontalDirectionalBlock implements IBE< } if (pPlayer instanceof ServerPlayer sp && stbe.isKeeperPresent()) - NetworkHooks.openScreen(sp, stbe, stbe.getBlockPos()); + NetworkHooks.openScreen(sp, stbe.new CategoryMenuProvider(), stbe.getBlockPos()); return InteractionResult.SUCCESS; }); diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java index 70040b11dc..338921f317 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java @@ -45,7 +45,7 @@ import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.items.IItemHandler; -public class StockTickerBlockEntity extends StockCheckingBlockEntity implements IHaveHoveringInformation, MenuProvider { +public class StockTickerBlockEntity extends StockCheckingBlockEntity implements IHaveHoveringInformation { // Player-interface Feature protected List> lastClientsideStockSnapshot; @@ -234,14 +234,32 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity implements super.invalidate(); } - @Override - public AbstractContainerMenu createMenu(int pContainerId, Inventory pPlayerInventory, Player pPlayer) { - return StockKeeperCategoryMenu.create(pContainerId, pPlayerInventory, this); + public class CategoryMenuProvider implements MenuProvider { + + @Override + public AbstractContainerMenu createMenu(int pContainerId, Inventory pPlayerInventory, Player pPlayer) { + return StockKeeperCategoryMenu.create(pContainerId, pPlayerInventory, StockTickerBlockEntity.this); + } + + @Override + public Component getDisplayName() { + return Components.empty(); + } + } - @Override - public Component getDisplayName() { - return Components.empty(); + public class RequestMenuProvider implements MenuProvider { + + @Override + public AbstractContainerMenu createMenu(int pContainerId, Inventory pPlayerInventory, Player pPlayer) { + return StockKeeperRequestMenu.create(pContainerId, pPlayerInventory, StockTickerBlockEntity.this); + } + + @Override + public Component getDisplayName() { + return Components.empty(); + } + } } diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java index b5d024169e..9bb9903125 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java @@ -5,7 +5,6 @@ import java.util.List; import com.simibubi.create.AllEntityTypes; import com.simibubi.create.AllItems; -import com.simibubi.create.AllPackets; import com.simibubi.create.AllSoundEvents; import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.actors.seat.SeatEntity; @@ -34,7 +33,7 @@ import net.minecraftforge.event.entity.player.PlayerInteractEvent.EntityInteract import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; import net.minecraftforge.items.ItemHandlerHelper; -import net.minecraftforge.network.PacketDistributor; +import net.minecraftforge.network.NetworkHooks; @EventBusSubscriber public class StockTickerInteractionHandler { @@ -84,9 +83,11 @@ public class StockTickerInteractionHandler { stbe.behaviour.mayAdministrate(player) && Create.LOGISTICS.isLockable(stbe.behaviour.freqId); boolean isCurrentlyLocked = Create.LOGISTICS.isLocked(stbe.behaviour.freqId); - AllPackets.getChannel() - .send(PacketDistributor.PLAYER.with(() -> sp), - new StockKeeperOpenRequestScreenPacket(targetPos, showLockOption, isCurrentlyLocked)); + NetworkHooks.openScreen(sp, stbe.new RequestMenuProvider(), buf -> { + buf.writeBoolean(showLockOption); + buf.writeBoolean(isCurrentlyLocked); + buf.writeBlockPos(targetPos); + }); stbe.getRecentSummary() .divideAndSendTo(sp, targetPos); } diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java index 046775ec48..7d0d057399 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java @@ -169,6 +169,8 @@ public enum AllGuiTextures implements ScreenElement, TextureSheetSegment { STOCK_KEEPER_REQUEST_LOCKED("stock_keeper", 16, 176, 15, 16), STOCK_KEEPER_REQUEST_UNLOCKED("stock_keeper", 32, 176, 15, 16), STOCK_KEEPER_REQUEST_SLOT("stock_keeper", 32, 200, 18, 18), + STOCK_KEEPER_REQUEST_ORDERED_CRAFTING_SLOT("stock_keeper", 32, 219, 18, 18), + STOCK_KEEPER_REQUEST_CRAFTING_SLOT("stock_keeper", 32, 237, 18, 18), STOCK_KEEPER_REQUEST_SEND_HOVER("stock_keeper", 55, 200, 80, 20), STOCK_KEEPER_REQUEST_SCROLL_TOP("stock_keeper", 219, 192, 5, 4), STOCK_KEEPER_REQUEST_SCROLL_PAD("stock_keeper", 219, 196, 5, 1), diff --git a/src/main/resources/assets/create/textures/gui/stock_keeper.png b/src/main/resources/assets/create/textures/gui/stock_keeper.png index a414ee6d4c72b0fb21be596302fb7416f72f1498..97fa109d40dc6048a2711b9bcc0e39e2a8bd8ffd 100644 GIT binary patch delta 3171 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 CnN1h~ delta 2771 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 Date: Mon, 2 Dec 2024 14:14:29 +0000 Subject: [PATCH 157/515] fixed it fixed a UI getting messed up by colour indexing --- .../textures/gui/stock_keeper_categories.png | Bin 1094 -> 2229 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/create/textures/gui/stock_keeper_categories.png b/src/main/resources/assets/create/textures/gui/stock_keeper_categories.png index bd8a87f20b7f3def4dc3140a7405ab2e4c6d381d..d73440df93589eed57703aff32ffd59b90249203 100644 GIT binary patch literal 2229 zcmd5-{WsKU8^4Ckh#?cg80+;MomFD(Lt#r1jYmU!TH9d9Y%JNvLV7&wVwB z;-{xW)BylJ@-d$;0Wjzl1KL`A+_x7>zo?ZnRe-mvLd zw2J{Yw#x~hWvCNtt;}$fyIXf*E-i?_qP0DB*D#m@GHLHQ+{B4 zbVO&(*^z6^S2X_edDrU}r$YytXNHr+n>|N;2tbK&YzvkjFcYdQfHQ4bs4I!$>s7hbs<=A;)%rKz?Eg8P-u%o zdV8<;pGgby$=IPq1Vo!L-eOVr?7Y&OZcohiP4q?%z>96E&Ea>{VGVpf|H`A1{m}qr z`svcg6J80Z>A2!#Hzv1>xNg`W2`-AeykTIUA7uhZ8{ z&wJN>c^BLH<@nttO+ibQ=>q5J&%7&Z>zOIeonNS*=OYRE2~_T9x`Hu=y?oj>g0DGi zf84ly;Jd?(JPy0RG{upAbL}_=-8G!z{@B?3PrnVG`8?~c#N97Wl(4Yg)wIXUEE6NK z(ElaA?DPI=az(I5!UTVYj0`&JI_X8dAK{j4*UoQJr?~UImEYEmh~DNbdV*C19u5EX zFfOCsTuf_D6_z%zWv7SU$Opth>Y99+Qqn-{xD+$r>cY~e=jO#_``#V0C+{a*S)Q8R zJiqc(z56Rqlb~m2YY7(_#J(J&q6YHbwbq4HuvcdLtJR7>v(0a$`3hL>TK+AX?(W;} zHLhU-Vzim={5ylMjk1h7nCNN%2!19hH@*W&W!{vjCt-GddTh3J9m{=C^w{o#1?~f3 zXwS3q)Dyztf?CCmvprLpqqm=Epq7N|P50JBUGrdk%2w(X0`|IwO6BcAVZ)Zx0u3uVh9K_H0d!hF>}##eUov3MM9Sng@&cBMgM6s zYb&o$`g9ouy*i5}%Bpi>Hvy@58@kjmvV*%Rv35?ntcgTFbXGFyQLC?!ZXK&+Y^lB~ zZJB}ontWr->g#t5$#9Y4@)L5SCNhnsd}EJ_Yx^Qco_s4d8oOz@r8V+VicjScdd6S! C|B{6O literal 1094 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911MRQ8&P5Fiy5;1lA?aAz}+x$X4Bx`|6{ zZ9LM7+b*xJe|~1&iiY5s`Og3U|37x@SZHWyT3XtpM~_NMN^ab^dE>^7>({R@S+eBS zt5-8-%n%Y1+P{DQwQJW7&dfD8H}CH5Uc7iQ(9GE#W*2}IV@Z%-FoVOh8)+a;lDE4H zLkFv@2av;A;1OBOz`%DHgc*gnPbQgQ3; zows4P90VF3Zke%_<)_h_EmMB)KPS|oa}O zX`eJx@WJw?NF5Fb1}1?91{MVdMh=IDPR6)6F)cS4g|GM7&PV2n_~_l)&y^5YfAoLa zGnRl2|5rOAsUC{Vh8rwT+zvi@#8BlXm9R1;jYUIg=GFRjFKRJob8#XvRVbp6sP|Xn8xPy6(HDlM^x~j$%%rW2dSv9`> zuALUpaQoj|h9;&!wjH{0@9%SNh+2DzV?*AzeD)dp>X(=|{<7O3?XaPK&GCk7|9lxv z{<|p0GW+j)Mwj2(yVNyq$NMup{FlY#@x9;Rz_N0?KVk|WgOfnfvV`&8{cv!cu)Ck{ z1^p{%Ci&Wt;e=Xec1C^AY-kYhgc)&KeL`0sn_=iX~)(MfP) z_-)g``~CO-N}d^V3qIz~zt55*`NzNUbYQ|0!3FgKTh8-0ZR4rjp&oJecq-5>i4Bk4 zv-_GE`=)=lzWh_CzIcxO0m~!2vOdmsT(_$JUgZ4soH-|*&HiMY_4U=|x9@W?Ye-nv z)h}Ist)u)Ste>;ke`1L-R%zn>TP?VM_7xN%<+C8Q}yvZB~d>a_-m{>ONU(WFG z&3knRhu_s)8+>dWJXmXFS*CZgKd571+@XEuJyYf#7Qem!*Il&Pb>OmuUuR*^6b68%?6kU89ZJ6T-G@yGywqb+@P8O From b2ddec57ef31616d041789d6b9a89b358d141516 Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Mon, 2 Dec 2024 18:26:35 -0800 Subject: [PATCH 158/515] Thinking with portals - Fix contraption visuals not actually being invalidated, motivated by getting carriage contraption visuals to go through portals correctly - Fix bogey visuals initially appearing with incorrect transforms - Fix contraption visuals initially appearing lerp'd between the origin and their actual pos - Use max of mesh/instance light in instance shaders - Bump flywheel version to fix contraption self lighting --- gradle.properties | 2 +- .../AbstractContraptionEntity.java | 9 ++- .../render/ContraptionVisual.java | 62 ++++++++++++++++--- .../entity/CarriageContraptionVisual.java | 2 +- .../create/flywheel/instance/actor.vert | 2 +- .../create/flywheel/instance/rotating.vert | 2 +- .../create/flywheel/instance/scrolling.vert | 2 +- 7 files changed, 66 insertions(+), 15 deletions(-) diff --git a/gradle.properties b/gradle.properties index 5ef9b99f7c..68d6d2c99e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -23,7 +23,7 @@ use_parchment = true # dependency versions registrate_version = MC1.20-1.3.3 flywheel_minecraft_version = 1.20.1 -flywheel_version = 1.0.0-beta-168 +flywheel_version = 1.0.0-beta-171 jei_minecraft_version = 1.20.1 jei_version = 15.10.0.39 curios_minecraft_version = 1.20.1 diff --git a/src/main/java/com/simibubi/create/content/contraptions/AbstractContraptionEntity.java b/src/main/java/com/simibubi/create/content/contraptions/AbstractContraptionEntity.java index e6688475fa..29bb1d8258 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/AbstractContraptionEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/AbstractContraptionEntity.java @@ -38,6 +38,7 @@ import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.collision.Matrix3d; import com.simibubi.create.foundation.mixin.accessor.ServerLevelAccessor; +import dev.engine_room.flywheel.api.backend.BackendManager; import net.createmod.catnip.utility.VecHelper; import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.Minecraft; @@ -380,7 +381,8 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit if (level().isClientSide()) DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { - if (!contraption.deferInvalidate) + // The visual will handle this with flywheel on. + if (!contraption.deferInvalidate || BackendManager.isBackendOn()) return; contraption.deferInvalidate = false; ContraptionRenderInfo.invalidate(contraption); @@ -878,7 +880,7 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit public float yRotation = 0; public float zRotation = 0; public float secondYRotation = 0; - + Matrix3d matrix; public Matrix3d asMatrix() { @@ -933,4 +935,7 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit return isAlive() || level().isClientSide() ? staleTicks > 0 : false; } + public boolean isPrevPosInvalid() { + return prevPosInvalid; + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionVisual.java b/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionVisual.java index a48b484cb8..30ca7f229b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionVisual.java +++ b/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionVisual.java @@ -71,6 +71,16 @@ public class ContraptionVisual extends Abst setEmbeddingMatrices(partialTick); Contraption contraption = entity.getContraption(); + + setupModel(contraption); + + setupChildren(partialTick, contraption); + + setupActors(partialTick, contraption); + } + + // Must be called before setup children or setup actors as this creates the render world + private void setupModel(Contraption contraption) { virtualRenderWorld = ContraptionRenderInfo.setupRenderWorld(level, contraption); RenderedBlocks blocks = contraption.getRenderedBlocks(); @@ -82,19 +92,35 @@ public class ContraptionVisual extends Abst }; model = new ForgeMultiBlockModelBuilder(modelWorld, blocks.positions()) - .modelDataLookup(pos -> contraption.modelData.getOrDefault(pos, ModelData.EMPTY)) - .build(); + .modelDataLookup(pos -> contraption.modelData.getOrDefault(pos, ModelData.EMPTY)) + .build(); - structure = embedding.instancerProvider() - .instancer(InstanceTypes.TRANSFORMED, model) - .createInstance(); + var instancer = embedding.instancerProvider() + .instancer(InstanceTypes.TRANSFORMED, model); + + // Null in ctor, so we need to create it + // But we can steal it if it already exists + if (structure == null) { + structure = instancer.createInstance(); + } else { + instancer.stealInstance(structure); + } structure.setChanged(); + } + + private void setupChildren(float partialTick, Contraption contraption) { + children.forEach(BlockEntityVisual::delete); + children.clear(); for (BlockEntity be : contraption.getRenderedBEs()) { setupVisualizer(be, partialTick); } + } + private void setupActors(float partialTick, Contraption contraption) { + actors.forEach(ActorVisual::delete); + actors.clear(); for (var actor : contraption.getActors()) { setupActor(actor, partialTick); } @@ -176,13 +202,33 @@ public class ContraptionVisual extends Abst if (hasMovedBlocks()) { updateLight(partialTick); } + + var contraption = entity.getContraption(); + if (contraption.deferInvalidate) { + setupModel(contraption); + setupChildren(partialTick, contraption); + setupActors(partialTick, contraption); + + contraption.deferInvalidate = false; + } } private void setEmbeddingMatrices(float partialTick) { var origin = renderOrigin(); - double x = Mth.lerp(partialTick, entity.xOld, entity.getX()) - origin.getX(); - double y = Mth.lerp(partialTick, entity.yOld, entity.getY()) - origin.getY(); - double z = Mth.lerp(partialTick, entity.zOld, entity.getZ()) - origin.getZ(); + double x; + double y; + double z; + if (entity.isPrevPosInvalid()) { + // When the visual is created the entity's old position is often zero + x = entity.getX() - origin.getX(); + y = entity.getY() - origin.getY(); + z = entity.getZ() - origin.getZ(); + + } else { + x = Mth.lerp(partialTick, entity.xo, entity.getX()) - origin.getX(); + y = Mth.lerp(partialTick, entity.yo, entity.getY()) - origin.getY(); + z = Mth.lerp(partialTick, entity.zo, entity.getZ()) - origin.getZ(); + } contraptionMatrix.setIdentity(); contraptionMatrix.translate(x, y, z); diff --git a/src/main/java/com/simibubi/create/content/trains/entity/CarriageContraptionVisual.java b/src/main/java/com/simibubi/create/content/trains/entity/CarriageContraptionVisual.java index d350b523e1..fffaa42f1e 100644 --- a/src/main/java/com/simibubi/create/content/trains/entity/CarriageContraptionVisual.java +++ b/src/main/java/com/simibubi/create/content/trains/entity/CarriageContraptionVisual.java @@ -50,7 +50,7 @@ public class CarriageContraptionVisual extends ContraptionVisual VisualizedBogey.of(visualizationContext, bogey, pt)); updateLight(pt); return true; diff --git a/src/main/resources/assets/create/flywheel/instance/actor.vert b/src/main/resources/assets/create/flywheel/instance/actor.vert index 5a84191125..7c06bd569f 100644 --- a/src/main/resources/assets/create/flywheel/instance/actor.vert +++ b/src/main/resources/assets/create/flywheel/instance/actor.vert @@ -9,5 +9,5 @@ void flw_instanceVertex(in FlwInstance instance) { flw_vertexPos.xyz = rotateByQuaternion(rotated - .5, instance.rotation) + instance.pos + .5; flw_vertexNormal = rotateByQuaternion(rotateByQuaternion(flw_vertexNormal, kineticRot), instance.rotation); - flw_vertexLight = vec2(instance.light) / 256.; + flw_vertexLight = max(vec2(instance.light) / 256., flw_vertexLight); } diff --git a/src/main/resources/assets/create/flywheel/instance/rotating.vert b/src/main/resources/assets/create/flywheel/instance/rotating.vert index 9f5e7d23e2..066ccd071a 100644 --- a/src/main/resources/assets/create/flywheel/instance/rotating.vert +++ b/src/main/resources/assets/create/flywheel/instance/rotating.vert @@ -14,8 +14,8 @@ void flw_instanceVertex(in FlwInstance instance) { flw_vertexPos.xyz = worldPos.xyz + instance.pos + .5; flw_vertexNormal = spin * flw_vertexNormal; - flw_vertexLight = vec2(instance.light) / 256.; flw_vertexOverlay = instance.overlay; + flw_vertexLight = max(vec2(instance.light) / 256., flw_vertexLight); #if defined(DEBUG_RAINBOW) flw_vertexColor = instance.color; diff --git a/src/main/resources/assets/create/flywheel/instance/scrolling.vert b/src/main/resources/assets/create/flywheel/instance/scrolling.vert index 29d1c27e6d..5746e3848d 100644 --- a/src/main/resources/assets/create/flywheel/instance/scrolling.vert +++ b/src/main/resources/assets/create/flywheel/instance/scrolling.vert @@ -9,6 +9,6 @@ void flw_instanceVertex(in FlwInstance instance) { vec2 scroll = fract(instance.speed * flw_renderTicks + instance.offset) * instance.scale; flw_vertexTexCoord = flw_vertexTexCoord + instance.diff + scroll; - flw_vertexLight = vec2(instance.light) / 256.; flw_vertexOverlay = instance.overlay; + flw_vertexLight = max(vec2(instance.light) / 256., flw_vertexLight); } From fda01cc4a86c46886b64ffc3f85b6b1238649964 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Wed, 4 Dec 2024 16:21:01 +0100 Subject: [PATCH 159/515] He is LoCs-maxxing - More code glorp for jei recipe transfer handling in stock keeper UI - FTB buttons no longer show in create screens --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 6 +- .../resources/assets/create/lang/en_ud.json | 4 + .../resources/assets/create/lang/en_us.json | 4 + .../com/simibubi/create/CreateClient.java | 4 + .../java/com/simibubi/create/compat/Mods.java | 3 +- .../create/compat/ftb/FTBIntegration.java | 40 ++ .../simibubi/create/compat/jei/CreateJEI.java | 8 +- .../jei/StockKeeperTransferHandler.java | 23 +- .../stockTicker/CraftableBigItemStack.java | 8 +- .../stockTicker/StockKeeperRequestScreen.java | 462 +++++++++++------- .../create/foundation/gui/AllGuiTextures.java | 5 +- .../assets/create/lang/default/interface.json | 4 + .../create/textures/gui/stock_keeper.png | Bin 3486 -> 3468 bytes 13 files changed, 377 insertions(+), 194 deletions(-) create mode 100644 src/main/java/com/simibubi/create/compat/ftb/FTBIntegration.java diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index a7b2a45d17..0e9d8e8670 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-11-27T13:30:40.8866274 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-12-04T14:14:42.4263137 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -639,8 +639,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -ba633d3681eb322596d533121632f0df758bec32 assets/create/lang/en_ud.json -90f581b095b45774d0c11829c03a24477281bf8a assets/create/lang/en_us.json +d6be09d59223690e77b1788ae958b91e481d038d assets/create/lang/en_ud.json +369693e0ce3c225d5ec204096c3869ec59493735 assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 5e2fea744b..9386d2799c 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -1321,9 +1321,11 @@ "create.gui.sequenced_gearshift.speed.forward_fast": "spɹɐʍɹoℲ 'pǝǝds ǝןqnoᗡ", "create.gui.sequenced_gearshift.title": "ʇɟıɥsɹɐǝ⅁ pǝɔuǝnbǝS", "create.gui.speedometer.title": "pǝǝdS uoıʇɐʇoᴚ", + "create.gui.stock_keeper.already_ordering_recipe": "ǝdıɔǝɹ sıɥʇ buıɹǝpɹo ʎpɐǝɹןⱯ", "create.gui.stock_keeper.checking_stocks": "˙˙˙sʞɔoʇs buıʞɔǝɥƆ", "create.gui.stock_keeper.configure": "ǝɹnbıɟuoƆ", "create.gui.stock_keeper.confirm_order": "ɹǝpɹO ɯɹıɟuoƆ", + "create.gui.stock_keeper.craft": "%1$s ʇɟɐɹƆ", "create.gui.stock_keeper.inventories_empty": "ʎʇdɯƎ ǝɹɐ sǝıɹoʇuǝʌuI pǝʞuıꞀ", "create.gui.stock_keeper.network_lock_tip": "sɹǝʎɐןԀ ɹǝɥʇo sʇuǝʌǝɹd buıʞɔoꞀ", "create.gui.stock_keeper.network_lock_tip_1": "ʎןʇɔǝɹıp sɯǝʇı buıɹǝpɹo ɯoɹɟ", @@ -1332,11 +1334,13 @@ "create.gui.stock_keeper.network_open": "uǝdo sı ʞɹoʍʇǝN", "create.gui.stock_keeper.no_packagers_linked": "pǝʞuıꞀ sɹǝbɐʞɔɐԀ oN", "create.gui.stock_keeper.no_search_results": "punoɟ sɯǝʇı buıɥɔʇɐɯ oN", + "create.gui.stock_keeper.not_in_stock": "ʞɔoʇS uı ʇou ǝɹɐ sɯǝʇı pǝɹınbǝᴚ", "create.gui.stock_keeper.package_adress": "ssǝɹppⱯ ǝbɐʞɔɐԀ", "create.gui.stock_keeper.program_requester": "ɹǝʇsǝnbǝᴚ ɯɐɹboɹԀ", "create.gui.stock_keeper.request_sent": "¡ʇuǝS ʇsǝnbǝᴚ", "create.gui.stock_keeper.search_items": "sɯǝʇI ɥɔɹɐǝS", "create.gui.stock_keeper.send": "puǝS", + "create.gui.stock_keeper.slots_full": "ןןnɟ ʎpɐǝɹןɐ sʇoןs ɹǝpɹO", "create.gui.stock_keeper.title": "ɹǝdǝǝʞ ʞɔoʇS", "create.gui.stock_keeper.unsorted_category": "pǝʇɹosu∩", "create.gui.stock_ticker.category_editor": "ɹoʇıpƎ ʎɹobǝʇɐƆ", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index a036b69e52..3d3f92bc0c 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1321,9 +1321,11 @@ "create.gui.sequenced_gearshift.speed.forward_fast": "Double speed, Forwards", "create.gui.sequenced_gearshift.title": "Sequenced Gearshift", "create.gui.speedometer.title": "Rotation Speed", + "create.gui.stock_keeper.already_ordering_recipe": "Already ordering this recipe", "create.gui.stock_keeper.checking_stocks": "Checking stocks...", "create.gui.stock_keeper.configure": "Configure", "create.gui.stock_keeper.confirm_order": "Confirm Order", + "create.gui.stock_keeper.craft": "Craft %1$s", "create.gui.stock_keeper.inventories_empty": "Linked Inventories are Empty", "create.gui.stock_keeper.network_lock_tip": "Locking prevents other Players", "create.gui.stock_keeper.network_lock_tip_1": "from ordering items directly", @@ -1332,11 +1334,13 @@ "create.gui.stock_keeper.network_open": "Network is open", "create.gui.stock_keeper.no_packagers_linked": "No Packagers Linked", "create.gui.stock_keeper.no_search_results": "No matching items found", + "create.gui.stock_keeper.not_in_stock": "Required items are not in Stock", "create.gui.stock_keeper.package_adress": "Package Address", "create.gui.stock_keeper.program_requester": "Program Requester", "create.gui.stock_keeper.request_sent": "Request Sent!", "create.gui.stock_keeper.search_items": "Search Items", "create.gui.stock_keeper.send": "Send", + "create.gui.stock_keeper.slots_full": "Order slots already full", "create.gui.stock_keeper.title": "Stock Keeper", "create.gui.stock_keeper.unsorted_category": "Unsorted", "create.gui.stock_ticker.category_editor": "Category Editor", diff --git a/src/main/java/com/simibubi/create/CreateClient.java b/src/main/java/com/simibubi/create/CreateClient.java index 8809a3c2da..689b9f24b4 100644 --- a/src/main/java/com/simibubi/create/CreateClient.java +++ b/src/main/java/com/simibubi/create/CreateClient.java @@ -2,6 +2,8 @@ package com.simibubi.create; import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; +import com.simibubi.create.compat.Mods; +import com.simibubi.create.compat.ftb.FTBIntegration; import com.simibubi.create.content.contraptions.glue.SuperGlueSelectionHandler; import com.simibubi.create.content.contraptions.render.ContraptionRenderInfo; import com.simibubi.create.content.contraptions.render.ContraptionRenderInfoManager; @@ -69,6 +71,8 @@ public class CreateClient { ZAPPER_RENDER_HANDLER.registerListeners(forgeEventBus); POTATO_CANNON_RENDER_HANDLER.registerListeners(forgeEventBus); + + Mods.FTBLIBRARY.executeIfInstalled(() -> () -> FTBIntegration.init(modEventBus, forgeEventBus)); } public static void clientInit(final FMLClientSetupEvent event) { diff --git a/src/main/java/com/simibubi/create/compat/Mods.java b/src/main/java/com/simibubi/create/compat/Mods.java index ad9503ce6c..e4ce3adaaa 100644 --- a/src/main/java/com/simibubi/create/compat/Mods.java +++ b/src/main/java/com/simibubi/create/compat/Mods.java @@ -32,7 +32,8 @@ public enum Mods { XLPACKETS, MODERNUI, FTBCHUNKS, - JOURNEYMAP; + JOURNEYMAP, + FTBLIBRARY; private final String id; diff --git a/src/main/java/com/simibubi/create/compat/ftb/FTBIntegration.java b/src/main/java/com/simibubi/create/compat/ftb/FTBIntegration.java new file mode 100644 index 0000000000..32864b7aae --- /dev/null +++ b/src/main/java/com/simibubi/create/compat/ftb/FTBIntegration.java @@ -0,0 +1,40 @@ +package com.simibubi.create.compat.ftb; + +import com.simibubi.create.foundation.gui.menu.AbstractSimiContainerScreen; + +import dev.ftb.mods.ftblibrary.FTBLibraryClient; +import net.createmod.catnip.gui.AbstractSimiScreen; +import net.minecraft.client.gui.screens.Screen; +import net.minecraftforge.client.event.ScreenEvent; +import net.minecraftforge.eventbus.api.EventPriority; +import net.minecraftforge.eventbus.api.IEventBus; + +public class FTBIntegration { + + private static int buttonStatePreviously = 0; + + public static void init(IEventBus modEventBus, IEventBus forgeEventBus) { + forgeEventBus.addListener(EventPriority.HIGH, FTBIntegration::removeGUIClutterOpen); + forgeEventBus.addListener(EventPriority.LOW, FTBIntegration::removeGUIClutterClose); + } + + private static void removeGUIClutterOpen(ScreenEvent.Opening event) { + if (isCreate(event.getCurrentScreen())) + return; + if (!isCreate(event.getNewScreen())) + return; + buttonStatePreviously = FTBLibraryClient.showButtons; + FTBLibraryClient.showButtons = 0; + } + + private static void removeGUIClutterClose(ScreenEvent.Closing event) { + if (!isCreate(event.getScreen())) + return; + FTBLibraryClient.showButtons = buttonStatePreviously; + } + + private static boolean isCreate(Screen screen) { + return screen instanceof AbstractSimiContainerScreen || screen instanceof AbstractSimiScreen; + } + +} diff --git a/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java b/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java index 5c61dbc2c9..39d36d8672 100644 --- a/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java +++ b/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java @@ -410,11 +410,11 @@ public class CreateJEI implements IModPlugin { return addRecipeListConsumer(recipes -> recipes.addAll(collection.get())); } + @SuppressWarnings("unchecked") public CategoryBuilder addAllRecipesIf(Predicate> pred) { return addRecipeListConsumer(recipes -> consumeAllRecipes(recipe -> { - if (pred.test(recipe)) { + if (pred.test(recipe)) recipes.add((T) recipe); - } })); } @@ -542,13 +542,13 @@ public class CreateJEI implements IModPlugin { .forEach(consumer); } + @SuppressWarnings("unchecked") public static > void consumeTypedRecipes(Consumer consumer, RecipeType type) { Map> map = Minecraft.getInstance() .getConnection() .getRecipeManager().recipes.get(type); - if (map != null) { + if (map != null) map.values().forEach(recipe -> consumer.accept((T) recipe)); - } } public static List> getTypedRecipes(RecipeType type) { diff --git a/src/main/java/com/simibubi/create/compat/jei/StockKeeperTransferHandler.java b/src/main/java/com/simibubi/create/compat/jei/StockKeeperTransferHandler.java index a9fb5e301e..705014a65c 100644 --- a/src/main/java/com/simibubi/create/compat/jei/StockKeeperTransferHandler.java +++ b/src/main/java/com/simibubi/create/compat/jei/StockKeeperTransferHandler.java @@ -84,15 +84,14 @@ public class StockKeeperTransferHandler implements IRecipeTransferHandler= 9) - return new RecipeTransferErrorTooltip(CreateLang.temporaryText("Order slots already full") + return new RecipeTransferErrorTooltip(CreateLang.translate("gui.stock_keeper.slots_full") .component()); InventorySummary summary = screen.getMenu().contentHolder.getLastClientsideStockSnapshotAsSummary(); @@ -118,16 +117,20 @@ public class StockKeeperTransferHandler implements IRecipeTransferHandler getIngredients() { return recipe.getIngredients(); } + public int getOutputCount(Level level) { + return recipe.getResultItem(level.registryAccess()) + .getCount(); + } + } diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperRequestScreen.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperRequestScreen.java index b620c19c64..ed9d9c4042 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperRequestScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperRequestScreen.java @@ -7,6 +7,7 @@ import java.util.HashSet; import java.util.List; import java.util.Objects; import java.util.Set; +import java.util.function.Function; import javax.annotation.Nullable; @@ -59,6 +60,7 @@ import net.minecraft.util.Mth; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.phys.AABB; import net.minecraftforge.items.ItemHandlerHelper; @@ -99,7 +101,7 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen> categories; public List itemsToOrder; - public List recipesToOrder; + public List recipesToOrder; WeakReference stockKeeper; WeakReference blaze; @@ -221,41 +223,29 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen(); - if (hasCraftables) - categories.add(Pair.of(CreateLang.translate("gui.stock_keeper.jei_category") - .string(), 0)); - blockEntity.categories.forEach(stack -> categories.add(Pair.of(stack.isEmpty() ? "" : stack.getHoverName() .getString(), 0))); - categories.add(Pair.of(CreateLang - .translate(blockEntity.categories.isEmpty() ? "gui.stock_keeper.storage_category" - : "gui.stock_keeper.unsorted_category") + categories.add(Pair.of(CreateLang.translate("gui.stock_keeper.unsorted_category") .string(), 0)); String valueWithPrefix = searchBox.getValue(); boolean anyItemsInCategory = false; - int extraCategories = hasCraftables ? 1 : 0; // Nothing is being filtered out if (valueWithPrefix.isBlank()) { displayedItems = new ArrayList<>(currentItemSource); - if (hasCraftables) - displayedItems.add(0, getCraftables()); - int categoryY = 0; - for (int categoryIndex = 0; categoryIndex < currentItemSource.size() + extraCategories; categoryIndex++) { + for (int categoryIndex = 0; categoryIndex < currentItemSource.size(); categoryIndex++) { categories.get(categoryIndex) .setSecond(categoryY); List displayedItemsInCategory = displayedItems.get(categoryIndex); if (displayedItemsInCategory.isEmpty()) continue; - if (categoryIndex - extraCategories < currentItemSource.size() - 1) + if (categoryIndex < currentItemSource.size() - 1) anyItemsInCategory = true; categoryY += rowHeight; @@ -266,6 +256,7 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen(); currentItemSource.forEach($ -> displayedItems.add(new ArrayList<>())); - if (hasCraftables) - displayedItems.add(new ArrayList<>()); - int categoryY = 0; for (int categoryIndex = 0; categoryIndex < displayedItems.size(); categoryIndex++) { - List category = categoryIndex - extraCategories < 0 ? getCraftables() - : currentItemSource.get(categoryIndex - extraCategories); + List category = currentItemSource.get(categoryIndex); categories.get(categoryIndex) .setSecond(categoryY); @@ -328,7 +315,7 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen 0) { + int jeiX = x + (windowWidth - colWidth * recipesToOrder.size()) / 2 + 1; + int jeiY = orderY - 31; + ms.pushPose(); + ms.translate(jeiX, jeiY, 200); + int xoffset = -3; + AllGuiTextures.STOCK_KEEPER_REQUEST_BLUEPRINT_LEFT.render(graphics, xoffset, -3); + xoffset += 10; + for (int i = 0; i <= (recipesToOrder.size() - 1) * 5; i++) { + AllGuiTextures.STOCK_KEEPER_REQUEST_BLUEPRINT_MIDDLE.render(graphics, xoffset, -3); + xoffset += 4; + } + AllGuiTextures.STOCK_KEEPER_REQUEST_BLUEPRINT_RIGHT.render(graphics, xoffset, -3); + + for (int index = 0; index < recipesToOrder.size(); index++) { + CraftableBigItemStack craftableBigItemStack = recipesToOrder.get(index); + boolean isStackHovered = index == hoveredSlot.getSecond() && -2 == hoveredSlot.getFirst(); + ms.pushPose(); + ms.translate(index * colWidth, 0, 0); + renderItemEntry(graphics, 1, craftableBigItemStack, isStackHovered, true); + ms.popPose(); + } + + ms.popPose(); + } + // Render tooltip of hovered item if (hoveredSlot != noneHovered) { - BigItemStack entry = hoveredSlot.getFirst() == -1 ? itemsToOrder.get(hoveredSlot.getSecond()) - : displayedItems.get(hoveredSlot.getFirst()) - .get(hoveredSlot.getSecond()); - if (entry instanceof CraftableBigItemStack cbis) { - // TODO: what is being used to craft this? + int slot = hoveredSlot.getSecond(); + boolean recipeHovered = hoveredSlot.getFirst() == -2; + boolean orderHovered = hoveredSlot.getFirst() == -1; + BigItemStack entry = recipeHovered ? recipesToOrder.get(slot) + : orderHovered ? itemsToOrder.get(slot) + : displayedItems.get(hoveredSlot.getFirst()) + .get(slot); + + if (recipeHovered) { + ArrayList lines = + new ArrayList<>(entry.stack.getTooltipLines(minecraft.player, TooltipFlag.NORMAL)); + if (lines.size() > 0) + lines.set(0, CreateLang.translateDirect("gui.stock_keeper.craft", lines.get(0) + .copy())); + graphics.renderComponentTooltip(font, lines, mouseX, mouseY); } else graphics.renderTooltip(font, entry.stack, mouseX, mouseY); } @@ -676,16 +701,13 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen 1 || craftable) + drawItemCount(graphics, entry.count, customCount); ms.popPose(); } private void drawItemCount(GuiGraphics graphics, int count, int customCount) { - boolean special = customCount != count; - if (!special && count == 1) - return; - count = customCount; - String text = count >= 1000000 ? (count / 1000000) + "m" : count >= 10000 ? (count / 1000) + "k" - : count >= 1000 ? ((count * 10) / 1000) / 10f + "k" - : count >= 100 ? count + "" : count > 0 ? " " + count : "";// " \u2714"; + : count >= 1000 ? ((count * 10) / 1000) / 10f + "k" : count >= 100 ? count + "" : " " + count; if (count >= BigItemStack.INF) text = "+"; @@ -781,16 +798,10 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen 0) invalid.remove(entry); @@ -833,6 +837,14 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen= orderY - 31 && y < orderY - 31 + rowHeight) { + int jeiX = getGuiLeft() + (windowWidth - colWidth * recipesToOrder.size()) / 2 + 1; + int col = Mth.floorDiv(x - jeiX, colWidth); + if (recipesToOrder.size() > col && col >= 0) + return Couple.create(-2, col); + } + if (y < getGuiTop() + 16 || y > getGuiTop() + windowHeight - 80) return noneHovered; if (!itemScroll.settled()) @@ -930,32 +942,26 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen= cols || rmb) return true; - if (entry instanceof CraftableBigItemStack cbis) { - itemsToOrder.add(existingOrder = new CraftableBigItemStack(itemStack.copyWithCount(1), cbis.recipe)); - existingOrder.count = 0; - } else - itemsToOrder.add(existingOrder = new BigItemStack(itemStack.copyWithCount(1), 0)); - } - - boolean isCrafted = existingOrder instanceof CraftableBigItemStack; - int transfer = hasShiftDown() ? itemStack.getMaxStackSize() : hasControlDown() ? 10 : 1; - - if (existingOrder instanceof CraftableBigItemStack cbis) { - int increments = cbis.recipe.getResultItem(blockEntity.getLevel() - .registryAccess()) - .getCount(); - transfer = Mth.ceil(transfer / (float) increments) * increments; + itemsToOrder.add(existingOrder = new BigItemStack(itemStack.copyWithCount(1), 0)); } int current = existingOrder.count; @@ -964,14 +970,10 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen hoveredOrderSlot = getHoveredSlot((int) mouseX, (int) mouseY); - if (hoveredOrderSlot == noneHovered || hoveredOrderSlot.getFirst() != -1) { + Couple hoveredSlot = getHoveredSlot((int) mouseX, (int) mouseY); + boolean noHover = hoveredSlot == noneHovered; + + if (noHover || hoveredSlot.getFirst() >= 0 && !hasShiftDown() && getMaxScroll() != 0) { int maxScroll = getMaxScroll(); int direction = (int) (Math.ceil(Math.abs(delta)) * -Math.signum(delta)); float newTarget = Mth.clamp(itemScroll.getChaseTarget() + direction, 0, maxScroll); itemScroll.chase(newTarget, 0.5, Chaser.EXP); + return true; } + + boolean orderClicked = hoveredSlot.getFirst() == -1; + boolean recipeClicked = hoveredSlot.getFirst() == -2; + BigItemStack entry = recipeClicked ? recipesToOrder.get(hoveredSlot.getSecond()) + : orderClicked ? itemsToOrder.get(hoveredSlot.getSecond()) + : displayedItems.get(hoveredSlot.getFirst()) + .get(hoveredSlot.getSecond()); + + boolean remove = delta < 0; + int transfer = Mth.ceil(Math.abs(delta)) * (hasControlDown() ? 10 : 1); + + if (recipeClicked && entry instanceof CraftableBigItemStack cbis) { + requestCraftable(cbis, remove ? -transfer : transfer); + return true; + } + + BigItemStack existingOrder = orderClicked ? entry : getOrderForItem(entry.stack); + if (existingOrder == null) { + if (itemsToOrder.size() >= cols || remove) + return true; + itemsToOrder.add(existingOrder = new BigItemStack(entry.stack.copyWithCount(1), 0)); + } + + int current = existingOrder.count; + + if (remove) { + existingOrder.count = current - transfer; + if (existingOrder.count <= 0) + itemsToOrder.remove(existingOrder); + return true; + } + + existingOrder.count = current + Math.min(transfer, blockEntity.getLastClientsideStockSnapshotAsSummary() + .getCountOf(entry.stack) - current); return true; } @@ -1062,8 +1101,6 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen getCraftables() { - ArrayList list = new ArrayList<>(); - for (BigItemStack ordered : recipesToOrder) - if (ordered instanceof CraftableBigItemStack cbis) - list.add(new CraftableBigItemStack(cbis.stack, cbis.recipe)); - updateCraftableAmounts(list); - return list; - } - - private void updateCraftableAmounts(List craftables) { - InventorySummary usedItems = new InventorySummary(); - InventorySummary availableItems = blockEntity.lastClientsideStockSnapshotAsSummary; - if (availableItems == null) + public void requestCraftable(CraftableBigItemStack cbis, int requestedDifference) { + boolean takeOrdersAway = requestedDifference < 0; + if (takeOrdersAway) + requestedDifference = Math.max(-cbis.count, requestedDifference); + if (requestedDifference == 0) return; - List craftablesOrderedFirst = new ArrayList<>(); - for (BigItemStack bis : itemsToOrder) - if (bis instanceof CraftableBigItemStack cbis) - for (BigItemStack bis2 : craftables) - if (bis2 instanceof CraftableBigItemStack cbis2 && cbis.recipe == cbis2.recipe) - craftablesOrderedFirst.add(cbis2); + InventorySummary availableItems = blockEntity.getLastClientsideStockSnapshotAsSummary(); + Function countModifier = stack -> { + BigItemStack ordered = getOrderForItem(stack); + return ordered == null ? 0 : -ordered.count; + }; - for (BigItemStack bis : craftables) - if (!craftablesOrderedFirst.contains(bis)) - craftablesOrderedFirst.add(bis); + if (takeOrdersAway) { + availableItems = new InventorySummary(); + for (BigItemStack ordered : itemsToOrder) + availableItems.add(ordered.stack, ordered.count); + countModifier = stack -> 0; + } - Orders: for (BigItemStack ordered : craftablesOrderedFirst) { - if (!(ordered instanceof CraftableBigItemStack cbis)) - continue; + Pair>> craftingResult = + maxCraftable(cbis, availableItems, countModifier, takeOrdersAway ? -1 : 9 - itemsToOrder.size()); + int outputCount = cbis.getOutputCount(blockEntity.getLevel()); + int adjustToRecipeAmount = Mth.ceil(Math.abs(requestedDifference) / (float) outputCount) * outputCount; + int maxCraftable = Math.min(adjustToRecipeAmount, craftingResult.getFirst()); - List ingredients = cbis.getIngredients(); - List> validEntriesByIngredient = new ArrayList<>(); - List visited = new ArrayList<>(); + if (maxCraftable == 0) + return; - for (Ingredient ingredient : ingredients) { - if (ingredient.isEmpty()) - continue; - List valid = new ArrayList<>(); - for (List list : availableItems.getItemMap() - .values()) - Entries: for (BigItemStack entry : list) { - if (!ingredient.test(entry.stack)) - continue; - BigItemStack asBis = new BigItemStack(entry.stack, entry.count); - BigItemStack orderForItem = getOrderForItem(asBis); - if (orderForItem != null) - asBis.count -= orderForItem.count; - asBis.count = Math.max(0, asBis.count - usedItems.getCountOf(entry.stack)); - valid.add(asBis); - for (ItemStack visitedStack : visited) { - if (!ItemHandlerHelper.canItemStacksStack(visitedStack, entry.stack)) - continue; - visitedStack.grow(1); - continue Entries; - } - visited.add(entry.stack.copyWithCount(1)); + cbis.count += takeOrdersAway ? -maxCraftable : maxCraftable; + + List> validEntriesByIngredient = craftingResult.getSecond(); + for (List list : validEntriesByIngredient) { + int remaining = maxCraftable / outputCount; + for (BigItemStack entry : list) { + if (remaining <= 0) + break; + + int toTransfer = Math.min(remaining, entry.count); + BigItemStack order = getOrderForItem(entry.stack); + + if (takeOrdersAway) { + if (order != null) { + order.count -= toTransfer; + if (order.count == 0) + itemsToOrder.remove(order); } - - if (valid.isEmpty()) { - cbis.count = 0; - continue Orders; + } else { + if (order == null) + itemsToOrder.add(order = new BigItemStack(entry.stack.copyWithCount(1), 0)); + order.count += toTransfer; } - validEntriesByIngredient.add(valid); + remaining -= entry.count; } + } - // Ingredients with shared items must divide counts - for (ItemStack visitedItem : visited) { - for (List list : validEntriesByIngredient) { - for (BigItemStack entry : list) { - if (!ItemHandlerHelper.canItemStacksStack(entry.stack, visitedItem)) - continue; - entry.count = entry.count / visitedItem.getCount(); - } - } - } + updateCraftableAmounts(); + } - // Determine the bottlenecking ingredient - int minCount = Integer.MAX_VALUE; - for (List list : validEntriesByIngredient) { - int sum = 0; - for (BigItemStack entry : list) - sum += entry.count; - minCount = Math.min(sum, minCount); - } + private void updateCraftableAmounts() { + InventorySummary usedItems = new InventorySummary(); + InventorySummary availableItems = new InventorySummary(); - int outputCount = cbis.recipe.getResultItem(blockEntity.getLevel() - .registryAccess()) - .getCount(); + for (BigItemStack ordered : itemsToOrder) + availableItems.add(ordered.stack, ordered.count); - cbis.count = minCount * outputCount; + for (CraftableBigItemStack cbis : recipesToOrder) { + Pair>> craftingResult = + maxCraftable(cbis, availableItems, stack -> -usedItems.getCountOf(stack), -1); + int maxCraftable = craftingResult.getFirst(); + List> validEntriesByIngredient = craftingResult.getSecond(); + int outputCount = cbis.getOutputCount(blockEntity.getLevel()); + + // Only tweak amounts downward + cbis.count = Math.min(cbis.count, maxCraftable); // Use ingredients up before checking next recipe - BigItemStack orderForItem = getOrderForItem(cbis); - if (orderForItem == null) - continue Orders; for (List list : validEntriesByIngredient) { - int remaining = orderForItem.count / outputCount; + int remaining = cbis.count / outputCount; for (BigItemStack entry : list) { if (remaining <= 0) break; @@ -1196,10 +1211,111 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen>> maxCraftable(CraftableBigItemStack cbis, InventorySummary summary, + Function countModifier, int newTypeLimit) { + List ingredients = cbis.getIngredients(); + List> validEntriesByIngredient = new ArrayList<>(); + List visited = new ArrayList<>(); + + for (Ingredient ingredient : ingredients) { + if (ingredient.isEmpty()) + continue; + List valid = new ArrayList<>(); + for (List list : summary.getItemMap() + .values()) + Entries: for (BigItemStack entry : list) { + if (!ingredient.test(entry.stack)) + continue; + BigItemStack asBis = new BigItemStack(entry.stack, + summary.getCountOf(entry.stack) + countModifier.apply(entry.stack)); + if (asBis.count > 0) + valid.add(asBis); + for (ItemStack visitedStack : visited) { + if (!ItemHandlerHelper.canItemStacksStack(visitedStack, entry.stack)) + continue; + visitedStack.grow(1); + continue Entries; + } + visited.add(entry.stack.copyWithCount(1)); + } + + if (valid.isEmpty()) + return Pair.of(0, List.of()); + + Collections.sort(valid, + (bis1, bis2) -> -Integer.compare(summary.getCountOf(bis1.stack), summary.getCountOf(bis2.stack))); + validEntriesByIngredient.add(valid); } + // Used new items may have to be trimmed + if (newTypeLimit != -1) { + int toRemove = (int) validEntriesByIngredient.stream() + .flatMap(l -> l.stream()) + .filter(entry -> getOrderForItem(entry.stack) == null) + .distinct() + .count() - newTypeLimit; + + for (int i = 0; i < toRemove; i++) + removeLeastEssentialItemStack(validEntriesByIngredient); + } + + // Ingredients with shared items must divide counts + for (ItemStack visitedItem : visited) { + for (List list : validEntriesByIngredient) { + for (BigItemStack entry : list) { + if (!ItemHandlerHelper.canItemStacksStack(entry.stack, visitedItem)) + continue; + entry.count = entry.count / visitedItem.getCount(); + } + } + } + + // Determine the bottlenecking ingredient + int minCount = Integer.MAX_VALUE; + for (List list : validEntriesByIngredient) { + int sum = 0; + for (BigItemStack entry : list) + sum += entry.count; + minCount = Math.min(sum, minCount); + } + + if (minCount == 0) + return Pair.of(0, List.of()); + + int outputCount = cbis.getOutputCount(blockEntity.getLevel()); + return Pair.of(minCount * outputCount, validEntriesByIngredient); + } + + private void removeLeastEssentialItemStack(List> validIngredients) { + List longest = null; + int most = 0; + for (List list : validIngredients) { + int count = (int) list.stream() + .filter(entry -> getOrderForItem(entry.stack) == null) + .count(); + if (longest != null && count <= most) + continue; + longest = list; + most = count; + } + + if (longest.isEmpty()) + return; + + BigItemStack chosen = null; + for (int i = 0; i < longest.size(); i++) { + BigItemStack entry = longest.get(longest.size() - 1 - i); + if (getOrderForItem(entry.stack) != null) + continue; + chosen = entry; + break; + } + + for (List list : validIngredients) + list.remove(chosen); } } diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java index 7d0d057399..c9b8a20eca 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java @@ -169,8 +169,9 @@ public enum AllGuiTextures implements ScreenElement, TextureSheetSegment { STOCK_KEEPER_REQUEST_LOCKED("stock_keeper", 16, 176, 15, 16), STOCK_KEEPER_REQUEST_UNLOCKED("stock_keeper", 32, 176, 15, 16), STOCK_KEEPER_REQUEST_SLOT("stock_keeper", 32, 200, 18, 18), - STOCK_KEEPER_REQUEST_ORDERED_CRAFTING_SLOT("stock_keeper", 32, 219, 18, 18), - STOCK_KEEPER_REQUEST_CRAFTING_SLOT("stock_keeper", 32, 237, 18, 18), + STOCK_KEEPER_REQUEST_BLUEPRINT_LEFT("stock_keeper", 28, 220, 10, 25), + STOCK_KEEPER_REQUEST_BLUEPRINT_MIDDLE("stock_keeper", 38, 220, 4, 25), + STOCK_KEEPER_REQUEST_BLUEPRINT_RIGHT("stock_keeper", 42, 220, 10, 25), STOCK_KEEPER_REQUEST_SEND_HOVER("stock_keeper", 55, 200, 80, 20), STOCK_KEEPER_REQUEST_SCROLL_TOP("stock_keeper", 219, 192, 5, 4), STOCK_KEEPER_REQUEST_SCROLL_PAD("stock_keeper", 219, 196, 5, 1), diff --git a/src/main/resources/assets/create/lang/default/interface.json b/src/main/resources/assets/create/lang/default/interface.json index 3832fd6f74..8a6a2cf8cd 100644 --- a/src/main/resources/assets/create/lang/default/interface.json +++ b/src/main/resources/assets/create/lang/default/interface.json @@ -330,12 +330,16 @@ "create.gui.stock_keeper.program_requester": "Program Requester", "create.gui.stock_keeper.unsorted_category": "Unsorted", "create.gui.stock_keeper.send": "Send", + "create.gui.stock_keeper.craft": "Craft %1$s", "create.gui.stock_keeper.configure": "Configure", "create.gui.stock_keeper.network_locked": "Network is locked", "create.gui.stock_keeper.network_open": "Network is open", "create.gui.stock_keeper.network_lock_tip": "Locking prevents other Players", "create.gui.stock_keeper.network_lock_tip_1": "from ordering items directly", "create.gui.stock_keeper.network_lock_tip_2": "Click to toggle", + "create.gui.stock_keeper.already_ordering_recipe": "Already ordering this recipe", + "create.gui.stock_keeper.slots_full": "Order slots already full", + "create.gui.stock_keeper.not_in_stock": "Required items are not in Stock", "create.stock_keeper.shopping_list_empty_hand": "Empty hand required to start a shopping list", "create.stock_keeper.no_price_set": "Shop owner must set a price first", diff --git a/src/main/resources/assets/create/textures/gui/stock_keeper.png b/src/main/resources/assets/create/textures/gui/stock_keeper.png index 97fa109d40dc6048a2711b9bcc0e39e2a8bd8ffd..dd71cc8710af48de60a846cc7125f7c9493d5729 100644 GIT binary patch delta 2852 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 delta 2896 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 From 2c4b6510272becbd34fd9c8054abb2e35c5815fe Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Wed, 4 Dec 2024 19:14:58 +0100 Subject: [PATCH 160/515] Hide and seek - Categories in the stock keeper interface can now be collapsed - Stock keeper scroll bar can now be dragged by mouse --- .../java/com/simibubi/create/AllPackets.java | 2 + .../StockKeeperCategoryHidingPacket.java | 53 +++++ .../stockTicker/StockKeeperRequestScreen.java | 211 +++++++++++++----- .../stockTicker/StockTickerBlockEntity.java | 19 +- .../create/foundation/gui/AllGuiTextures.java | 2 + .../create/textures/gui/stock_keeper.png | Bin 3468 -> 3492 bytes 6 files changed, 230 insertions(+), 57 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryHidingPacket.java diff --git a/src/main/java/com/simibubi/create/AllPackets.java b/src/main/java/com/simibubi/create/AllPackets.java index c46e1e7101..04b14b45b4 100644 --- a/src/main/java/com/simibubi/create/AllPackets.java +++ b/src/main/java/com/simibubi/create/AllPackets.java @@ -73,6 +73,7 @@ import com.simibubi.create.content.logistics.stockTicker.LogisticalStockRequestP import com.simibubi.create.content.logistics.stockTicker.LogisticalStockResponsePacket; import com.simibubi.create.content.logistics.stockTicker.PackageOrderRequestPacket; import com.simibubi.create.content.logistics.stockTicker.StockKeeperCategoryEditPacket; +import com.simibubi.create.content.logistics.stockTicker.StockKeeperCategoryHidingPacket; import com.simibubi.create.content.logistics.stockTicker.StockKeeperCategoryRefundPacket; import com.simibubi.create.content.logistics.stockTicker.StockKeeperLockPacket; import com.simibubi.create.content.logistics.tunnel.TunnelFlapPacket; @@ -200,6 +201,7 @@ public enum AllPackets { CONFIGURE_STOCK_KEEPER_CATEGORIES(StockKeeperCategoryEditPacket.class, StockKeeperCategoryEditPacket::new, PLAY_TO_SERVER), REFUND_STOCK_KEEPER_CATEGORY(StockKeeperCategoryRefundPacket.class, StockKeeperCategoryRefundPacket::new, PLAY_TO_SERVER), LOCK_STOCK_KEEPER(StockKeeperLockPacket.class, StockKeeperLockPacket::new, PLAY_TO_SERVER), + STOCK_KEEPER_HIDE_CATEGORY(StockKeeperCategoryHidingPacket.class, StockKeeperCategoryHidingPacket::new, PLAY_TO_SERVER), // Server to Client SYMMETRY_EFFECT(SymmetryEffectPacket.class, SymmetryEffectPacket::new, PLAY_TO_CLIENT), diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryHidingPacket.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryHidingPacket.java new file mode 100644 index 0000000000..d8cb2d7cc3 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryHidingPacket.java @@ -0,0 +1,53 @@ +package com.simibubi.create.content.logistics.stockTicker; + +import java.util.List; +import java.util.stream.IntStream; + +import com.simibubi.create.foundation.networking.BlockEntityConfigurationPacket; + +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.level.ServerPlayer; + +public class StockKeeperCategoryHidingPacket extends BlockEntityConfigurationPacket { + + private List indices; + + public StockKeeperCategoryHidingPacket(BlockPos pos, List indices) { + super(pos); + this.indices = indices; + } + + public StockKeeperCategoryHidingPacket(FriendlyByteBuf buffer) { + super(buffer); + } + + @Override + protected void writeSettings(FriendlyByteBuf buffer) { + buffer.writeVarIntArray(indices.stream() + .mapToInt(i -> i) + .toArray()); + } + + @Override + protected void readSettings(FriendlyByteBuf buffer) { + indices = IntStream.of(buffer.readVarIntArray()) + .boxed() + .toList(); + } + + @Override + protected void applySettings(StockTickerBlockEntity be) {} + + @Override + protected void applySettings(ServerPlayer player, StockTickerBlockEntity be) { + if (indices.isEmpty()) { + be.hiddenCategoriesByPlayer.remove(player.getUUID()); + } else { + be.hiddenCategoriesByPlayer.put(player.getUUID(), indices); + be.notifyUpdate(); + } + return; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperRequestScreen.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperRequestScreen.java index ed9d9c4042..ee273512e3 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperRequestScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperRequestScreen.java @@ -14,6 +14,7 @@ import javax.annotation.Nullable; import org.lwjgl.glfw.GLFW; import com.mojang.blaze3d.platform.Lighting; +import com.mojang.blaze3d.platform.Window; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Axis; @@ -64,11 +65,26 @@ import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.phys.AABB; import net.minecraftforge.items.ItemHandlerHelper; +import net.minecraftforge.network.simple.SimpleChannel; import net.minecraftforge.registries.ForgeRegistries; public class StockKeeperRequestScreen extends AbstractSimiContainerScreen implements ScreenWithStencils { + public static class CategoryEntry { + ItemStack filterStack; + boolean hidden; + String name; + int y; + + public CategoryEntry(ItemStack filterStack, String name, int y) { + this.filterStack = filterStack; + this.name = name; + hidden = false; + this.y = y; + } + }; + private static final AllGuiTextures NUMBERS = AllGuiTextures.NUMBERS; private static final AllGuiTextures HEADER = AllGuiTextures.STOCK_KEEPER_REQUEST_HEADER; private static final AllGuiTextures BODY = AllGuiTextures.STOCK_KEEPER_REQUEST_BODY; @@ -98,7 +114,7 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen> currentItemSource; public List> displayedItems; - public List> categories; + public List categories; public List itemsToOrder; public List recipesToOrder; @@ -111,10 +127,14 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen extraAreas = Collections.emptyList(); + private Set hiddenCategories; + public StockKeeperRequestScreen(StockKeeperRequestMenu container, Inventory inv, Component title) { super(container, inv, title); displayedItems = new ArrayList<>(); @@ -133,9 +153,12 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen(null); blaze = new WeakReference<>(null); refreshSearchNextTick = false; + moveToTopNextTick = false; menu.screenReference = this; + hiddenCategories = + new HashSet<>(blockEntity.hiddenCategoriesByPlayer.getOrDefault(menu.player.getUUID(), List.of())); - itemToProgram = Minecraft.getInstance().player.getMainHandItem(); + itemToProgram = menu.player.getMainHandItem(); encodeRequester = AllItemTags.TABLE_CLOTHS.matches(itemToProgram) || AllBlocks.REDSTONE_REQUESTER.isIn(itemToProgram); @@ -224,12 +247,20 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen(); - blockEntity.categories.forEach(stack -> categories.add(Pair.of(stack.isEmpty() ? "" - : stack.getHoverName() - .getString(), - 0))); - categories.add(Pair.of(CreateLang.translate("gui.stock_keeper.unsorted_category") - .string(), 0)); + for (int i = 0; i < blockEntity.categories.size(); i++) { + ItemStack stack = blockEntity.categories.get(i); + CategoryEntry entry = new CategoryEntry(stack, stack.isEmpty() ? "" + : stack.getHoverName() + .getString(), + 0); + entry.hidden = hiddenCategories.contains(i); + categories.add(entry); + } + + CategoryEntry unsorted = new CategoryEntry(null, CreateLang.translate("gui.stock_keeper.unsorted_category") + .string(), 0); + unsorted.hidden = hiddenCategories.contains(-1); + categories.add(unsorted); String valueWithPrefix = searchBox.getValue(); boolean anyItemsInCategory = false; @@ -240,8 +271,7 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen displayedItemsInCategory = displayedItems.get(categoryIndex); if (displayedItemsInCategory.isEmpty()) continue; @@ -249,7 +279,8 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen category = currentItemSource.get(categoryIndex); - categories.get(categoryIndex) - .setSecond(categoryY); + categories.get(categoryIndex).y = categoryY; if (displayedItems.size() <= categoryIndex) break; @@ -314,11 +344,13 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen category = displayedItems.get(categoryIndex); - int categoryY = categories.isEmpty() ? 0 - : categories.get(categoryIndex) - .getSecond(); + CategoryEntry categoryEntry = categories.isEmpty() ? null : categories.get(categoryIndex); + int categoryY = categories.isEmpty() ? 0 : categoryEntry.y; if (category.isEmpty()) continue; if (!categories.isEmpty()) { - graphics.drawString(font, categories.get(categoryIndex) - .getFirst(), itemsX + 5, itemsY + categoryY + 8, 0x4A2D31, false); - graphics.drawString(font, categories.get(categoryIndex) - .getFirst(), itemsX + 4, itemsY + categoryY + 7, 0xF8F8EC, false); + (categoryEntry.hidden ? AllGuiTextures.STOCK_KEEPER_CATEGORY_HIDDEN + : AllGuiTextures.STOCK_KEEPER_CATEGORY_SHOWN).render(graphics, itemsX, itemsY + categoryY + 6); + graphics.drawString(font, categoryEntry.name, itemsX + 10, itemsY + categoryY + 8, 0x4A2D31, false); + graphics.drawString(font, categoryEntry.name, itemsX + 9, itemsY + categoryY + 7, 0xF8F8EC, false); + if (categoryEntry.hidden) + continue; } for (int index = 0; index < category.size(); index++) { @@ -747,21 +781,6 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen i instanceof CraftableBigItemStack)) { - refreshSearchNextTick = true; - } } private Couple getHoveredSlot(int x, int y) { + x += 1; if (x < itemsX || x >= itemsX + cols * colWidth) return noneHovered; @@ -853,11 +869,12 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen entry = categories.isEmpty() ? Pair.of("", 0) : categories.get(categoryIndex); + CategoryEntry entry = categories.isEmpty() ? new CategoryEntry(null, "", 0) : categories.get(categoryIndex); + if (entry.hidden) + continue; - int row = - Mth.floor((localY - (categories.isEmpty() ? 4 : rowHeight) - entry.getSecond()) / (float) rowHeight) - + (int) itemScroll.getChaseTarget(); + int row = Mth.floor((localY - (categories.isEmpty() ? 4 : rowHeight) - entry.y) / (float) rowHeight + + itemScroll.getChaseTarget()); int col = (x - itemsX) / colWidth; int slot = row * cols + col; @@ -914,11 +931,23 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen 0 && lmb && pMouseX > barX && pMouseX <= barX + 8 && pMouseY > getGuiTop() + 15 + && pMouseY < getGuiTop() + windowHeight - 82) { + scrollHandleActive = true; + if (minecraft.isWindowActive()) + GLFW.glfwSetInputMode(minecraft.getWindow() + .getWindow(), 208897, GLFW.GLFW_CURSOR_HIDDEN); + return true; + } + Couple hoveredSlot = getHoveredSlot((int) pMouseX, (int) pMouseY); - boolean lmb = pButton == 0; - boolean rmb = pButton == 1; - + // Lock if (isAdmin && itemScroll.getChaseTarget() == 0 && lmb && pMouseX > lockX && pMouseX <= lockX + 15 && pMouseY > lockY && pMouseY <= lockY + 15) { isLocked = !isLocked; @@ -927,21 +956,44 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen= itemsX + && pMouseX < itemsX + cols * colWidth && pMouseY >= getGuiTop() + 16 + && pMouseY <= getGuiTop() + windowHeight - 80) { + for (int categoryIndex = 0; categoryIndex < displayedItems.size(); categoryIndex++) { + CategoryEntry entry = categories.get(categoryIndex); + if (Mth.floor((localY - entry.y) / (float) rowHeight + itemScroll.getChaseTarget()) != 0) + continue; + int indexOf = entry.filterStack == null ? -1 : blockEntity.categories.indexOf(entry.filterStack); + hiddenCategories.remove(indexOf); + if (!entry.hidden) + hiddenCategories.add(indexOf); + refreshSearchNextTick = true; + moveToTopNextTick = false; + return true; + } + } + if (hoveredSlot == noneHovered || !lmb && !rmb) return super.mouseClicked(pMouseX, pMouseY, pButton); + // Items boolean orderClicked = hoveredSlot.getFirst() == -1; boolean recipeClicked = hoveredSlot.getFirst() == -2; BigItemStack entry = recipeClicked ? recipesToOrder.get(hoveredSlot.getSecond()) @@ -979,6 +1031,12 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen= 0 && !hasShiftDown() && getMaxScroll() != 0) { int maxScroll = getMaxScroll(); int direction = (int) (Math.ceil(Math.abs(delta)) * -Math.signum(delta)); - float newTarget = Mth.clamp(itemScroll.getChaseTarget() + direction, 0, maxScroll); + float newTarget = Mth.clamp(Math.round(itemScroll.getChaseTarget() + direction), 0, maxScroll); itemScroll.chase(newTarget, 0.5, Chaser.EXP); return true; } @@ -1042,16 +1100,51 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen list : displayedItems) { + for (int i = 0; i < displayedItems.size(); i++) { + List list = displayedItems.get(i); if (list.isEmpty()) continue; totalRows++; + if (categories.size() > i && categories.get(i).hidden) + continue; totalRows += Math.ceil(list.size() / (float) cols); } int maxScroll = (int) Math.max(0, (totalRows * rowHeight - visibleHeight + 50) / rowHeight); return maxScroll; } + @Override + public boolean mouseDragged(double pMouseX, double pMouseY, int pButton, double pDragX, double pDragY) { + if (pButton != GLFW.GLFW_MOUSE_BUTTON_LEFT || !scrollHandleActive) + return super.mouseDragged(pMouseX, pMouseY, pButton, pDragX, pDragY); + + Window window = minecraft.getWindow(); + double scaleX = window.getGuiScaledWidth() / (double) window.getScreenWidth(); + double scaleY = window.getGuiScaledHeight() / (double) window.getScreenHeight(); + + int windowH = windowHeight - 92; + int totalH = getMaxScroll() * rowHeight + windowH; + int barSize = Math.max(5, Mth.floor((float) windowH / totalH * (windowH - 2))); + + int minY = getGuiTop() + 15 + barSize / 2; + int maxY = getGuiTop() + 15 + windowH - barSize / 2; + + if (barSize >= windowH - 2) + return true; + + int barX = itemsX + cols * colWidth; + double target = (pMouseY - getGuiTop() - 15 - barSize / 2.0) * totalH / (windowH - 2) / rowHeight; + itemScroll.chase(Mth.clamp(target, 0, getMaxScroll()), 0.8, Chaser.EXP); + + if (minecraft.isWindowActive()) { + double forceX = (barX + 2) / scaleX; + double forceY = Mth.clamp(pMouseY, minY, maxY) / scaleY; + GLFW.glfwSetCursorPos(window.getWindow(), forceX, forceY); + } + + return true; + } + @Override public boolean charTyped(char pCodePoint, int pModifiers) { if (addressBox.isFocused() && addressBox.charTyped(pCodePoint, pModifiers)) @@ -1059,8 +1152,10 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen(hiddenCategories))); super.removed(); } diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java index 338921f317..76370ef54f 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java @@ -1,8 +1,12 @@ package com.simibubi.create.content.logistics.stockTicker; import java.util.ArrayList; +import java.util.HashMap; import java.util.Iterator; import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.stream.IntStream; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -55,6 +59,7 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity implements protected int activeLinks; protected int ticksSinceLastUpdate; protected List categories; + protected Map> hiddenCategoriesByPlayer; // Shop feature protected SmartInventory receivedPayments; @@ -66,6 +71,7 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity implements receivedPayments = new SmartInventory(27, this, 64, false); capability = LazyOptional.of(() -> receivedPayments); categories = new ArrayList<>(); + hiddenCategoriesByPlayer = new HashMap<>(); } public void refreshClientStockSnapshot() { @@ -116,6 +122,12 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity implements tag.putString("PreviousAddress", previouslyUsedAddress); tag.put("ReceivedPayments", receivedPayments.serializeNBT()); tag.put("Categories", NBTHelper.writeItemList(categories)); + tag.put("HiddenCategories", NBTHelper.writeCompoundList(hiddenCategoriesByPlayer.entrySet(), e -> { + CompoundTag c = new CompoundTag(); + c.putUUID("Id", e.getKey()); + c.putIntArray("Indices", e.getValue()); + return c; + })); if (clientPacket) tag.putInt("ActiveLinks", activeLinks); @@ -128,6 +140,12 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity implements receivedPayments.deserializeNBT(tag.getCompound("ReceivedPayments")); categories = NBTHelper.readItemList(tag.getList("Categories", Tag.TAG_COMPOUND)); categories.removeIf(stack -> !stack.isEmpty() && !(stack.getItem() instanceof FilterItem)); + hiddenCategoriesByPlayer.clear(); + + NBTHelper.iterateCompoundList(tag.getList("HiddenCategories", Tag.TAG_COMPOUND), + c -> hiddenCategoriesByPlayer.put(c.getUUID("Id"), IntStream.of(c.getIntArray("Indices")) + .boxed() + .toList())); if (clientPacket) activeLinks = tag.getInt("ActiveLinks"); @@ -164,7 +182,6 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity implements List unsorted = new ArrayList<>(newlyReceivedStockSnapshot); lastClientsideStockSnapshot.add(unsorted); - newlyReceivedStockSnapshot = null; } diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java index c9b8a20eca..f256039b0e 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java @@ -178,6 +178,8 @@ public enum AllGuiTextures implements ScreenElement, TextureSheetSegment { STOCK_KEEPER_REQUEST_SCROLL_MID("stock_keeper", 219, 197, 5, 9), STOCK_KEEPER_REQUEST_SCROLL_BOT("stock_keeper", 219, 207, 5, 5), STOCK_KEEPER_REQUEST_BG("stock_keeper", 37, 48, 182, 20), + STOCK_KEEPER_CATEGORY_HIDDEN("stock_keeper", 143, 176, 8, 8), + STOCK_KEEPER_CATEGORY_SHOWN("stock_keeper", 151, 176, 8, 8), NUMBERS("stock_keeper", 48, 176, 5, 8), STOCK_KEEPER_CATEGORY("stock_keeper_categories", 210, 190), diff --git a/src/main/resources/assets/create/textures/gui/stock_keeper.png b/src/main/resources/assets/create/textures/gui/stock_keeper.png index dd71cc8710af48de60a846cc7125f7c9493d5729..5e7f3cfe49d1316f69fdda3a6d01f4ecb352b1fa 100644 GIT binary patch delta 2473 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 delta 2470 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 From 62b8e5644a01094ec3d9221e6439a90c390eea88 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Thu, 5 Dec 2024 10:57:43 +0100 Subject: [PATCH 161/515] Factory Settings - added a new window type with randomised blockstates --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 17 +++++-- .../blockstates/old_factory_window.json | 18 ++++++++ .../resources/assets/create/lang/en_ud.json | 1 + .../resources/assets/create/lang/en_us.json | 1 + .../models/block/old_factory_window_1.json | 7 +++ .../models/block/old_factory_window_2.json | 7 +++ .../models/block/old_factory_window_3.json | 7 +++ .../models/block/old_factory_window_4.json | 7 +++ .../models/item/old_factory_window.json | 7 +++ .../building_blocks/old_factory_window.json | 35 ++++++++++++++ .../blocks/old_factory_window.json | 31 +++++++++++++ .../create/recipes/old_factory_window.json | 21 +++++++++ .../minecraft/tags/blocks/impermeable.json | 3 +- .../com/simibubi/create/AllSpriteShifts.java | 7 ++- .../decoration/palettes/AllPaletteBlocks.java | 17 +++++-- .../palettes/RandomisedWindowCTBehaviour.java | 43 ++++++++++++++++++ .../create/foundation/data/WindowGen.java | 40 +++++++++++++--- .../block/palettes/old_factory_window_1.png | Bin 0 -> 858 bytes .../old_factory_window_1_connected.png | Bin 0 -> 3966 bytes .../palettes/old_factory_window_1_end.png | Bin 0 -> 234 bytes .../block/palettes/old_factory_window_2.png | Bin 0 -> 858 bytes .../old_factory_window_2_connected.png | Bin 0 -> 4038 bytes .../palettes/old_factory_window_2_end.png | Bin 0 -> 234 bytes .../block/palettes/old_factory_window_3.png | Bin 0 -> 858 bytes .../old_factory_window_3_connected.png | Bin 0 -> 3944 bytes .../palettes/old_factory_window_3_end.png | Bin 0 -> 234 bytes .../block/palettes/old_factory_window_4.png | Bin 0 -> 865 bytes .../old_factory_window_4_connected.png | Bin 0 -> 3966 bytes .../palettes/old_factory_window_4_end.png | Bin 0 -> 234 bytes 29 files changed, 253 insertions(+), 16 deletions(-) create mode 100644 src/generated/resources/assets/create/blockstates/old_factory_window.json create mode 100644 src/generated/resources/assets/create/models/block/old_factory_window_1.json create mode 100644 src/generated/resources/assets/create/models/block/old_factory_window_2.json create mode 100644 src/generated/resources/assets/create/models/block/old_factory_window_3.json create mode 100644 src/generated/resources/assets/create/models/block/old_factory_window_4.json create mode 100644 src/generated/resources/assets/create/models/item/old_factory_window.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/old_factory_window.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/old_factory_window.json create mode 100644 src/generated/resources/data/create/recipes/old_factory_window.json create mode 100644 src/main/java/com/simibubi/create/content/decoration/palettes/RandomisedWindowCTBehaviour.java create mode 100644 src/main/resources/assets/create/textures/block/palettes/old_factory_window_1.png create mode 100644 src/main/resources/assets/create/textures/block/palettes/old_factory_window_1_connected.png create mode 100644 src/main/resources/assets/create/textures/block/palettes/old_factory_window_1_end.png create mode 100644 src/main/resources/assets/create/textures/block/palettes/old_factory_window_2.png create mode 100644 src/main/resources/assets/create/textures/block/palettes/old_factory_window_2_connected.png create mode 100644 src/main/resources/assets/create/textures/block/palettes/old_factory_window_2_end.png create mode 100644 src/main/resources/assets/create/textures/block/palettes/old_factory_window_3.png create mode 100644 src/main/resources/assets/create/textures/block/palettes/old_factory_window_3_connected.png create mode 100644 src/main/resources/assets/create/textures/block/palettes/old_factory_window_3_end.png create mode 100644 src/main/resources/assets/create/textures/block/palettes/old_factory_window_4.png create mode 100644 src/main/resources/assets/create/textures/block/palettes/old_factory_window_4_connected.png create mode 100644 src/main/resources/assets/create/textures/block/palettes/old_factory_window_4_end.png diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 0e9d8e8670..5474b77f58 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-12-04T14:14:42.4263137 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-12-05T10:47:38.4659572 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -369,6 +369,7 @@ ba9c3ecfacbd398048440d247decffeaefc714b5 assets/create/blockstates/mysterious_cu 7f2c5728e24d60ed2f7a095e3a954d7ca4e410e9 assets/create/blockstates/oak_window_pane.json df91d0ca68934c1afd9858a8d1591dd4cb88df65 assets/create/blockstates/ochrum.json 09c9bee3d26edc4b87cb7a5042f125c439ee5956 assets/create/blockstates/ochrum_pillar.json +8c81b5846605f5c7efecd335534a2c8660c9b206 assets/create/blockstates/old_factory_window.json 8ff85f8171ff60ebf95f574d6c9f275ae6e98ee0 assets/create/blockstates/orange_postbox.json af4c2c4861d1410e1b7371a5bf3fe09ed3ab0077 assets/create/blockstates/orange_sail.json aab812cecf7d10d4e7587f4dead8a98238a15f41 assets/create/blockstates/orange_seat.json @@ -639,8 +640,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -d6be09d59223690e77b1788ae958b91e481d038d assets/create/lang/en_ud.json -369693e0ce3c225d5ec204096c3869ec59493735 assets/create/lang/en_us.json +66a0a2bb4cee8929559b5e9ae06528149f8b0cbe assets/create/lang/en_ud.json +618696fd789b959def3ea03a8ce67b27ca2c8c8e assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -1309,6 +1310,10 @@ af50363d603d61340b336569d58c1febde253665 assets/create/models/block/ochrum_natur d69effa0a811cb93fead8257bcaad4bbf0094002 assets/create/models/block/ochrum_natural_3.json 24669a4e93925940477fcfc0aca10ab9d87368e0 assets/create/models/block/ochrum_pillar.json c8dd33a0b71dce37712788a61729de89574b117f assets/create/models/block/ochrum_pillar_horizontal.json +3f19a949a272f1115f05edf5bf68f15db6321fc9 assets/create/models/block/old_factory_window_1.json +32c6b9d4a4965abc8dd01b82a3f63fd965fd62c9 assets/create/models/block/old_factory_window_2.json +b7db5faead0af7b85ef9b96d3ef33b497bb67e76 assets/create/models/block/old_factory_window_3.json +8c9e45d0f2c8eb08884a1272a7e8c8c27115951b assets/create/models/block/old_factory_window_4.json dbd0cbfa1c6cfaddd7ac954379b4b1f3056730f2 assets/create/models/block/orange_postbox_closed.json 88cda1f606e502cf0df9430b75a70fd3161fd6ba assets/create/models/block/orange_postbox_open.json cb4cd4e4bfb0d105a09c56454abf4795b155d12b assets/create/models/block/orange_sail.json @@ -2197,6 +2202,7 @@ f80358eba19bc8d1741e4e25753866799631a118 assets/create/models/item/nixie_tube.js 061587faf0e53e4fac0c8f2f3bd6b22020b2a3ee assets/create/models/item/oak_window_pane.json af50363d603d61340b336569d58c1febde253665 assets/create/models/item/ochrum.json 62ec1afee14f9de3f5b02ee930d002a240a3c337 assets/create/models/item/ochrum_pillar.json +3f19a949a272f1115f05edf5bf68f15db6321fc9 assets/create/models/item/old_factory_window.json 226f99c241b1d8b03d8fc57db32c1bee0721b64f assets/create/models/item/orange_postbox.json 56e7d28824d3fc566b5f551babbe423a550ef08c assets/create/models/item/orange_seat.json 9f122183a1b04ac6346631db4f505e53ed333acf assets/create/models/item/orange_table_cloth.json @@ -2921,6 +2927,7 @@ e5a41a95a03ef12c8d002f7b884da164b9fe5adf data/create/advancements/recipes/buildi be72964ed354ab3772c9103ca089b48369a3f4df data/create/advancements/recipes/building_blocks/oak_window_pane.json ee4586fa007fd595b90172f246153130dd9a10f6 data/create/advancements/recipes/building_blocks/ochrum_from_stone_types_ochrum_stonecutting.json 15642e7fe5f36a84382a33e0ca90c328e9906155 data/create/advancements/recipes/building_blocks/ochrum_pillar_from_stone_types_ochrum_stonecutting.json +71847992255d1ff09a24104b1854345f4022fb7c data/create/advancements/recipes/building_blocks/old_factory_window.json 8779e790fe3f51319a9a03388adb87ff98826159 data/create/advancements/recipes/building_blocks/ornate_iron_window.json c8b8f792d2e9ffea70330f2c1659d567c12913b1 data/create/advancements/recipes/building_blocks/ornate_iron_window_pane.json ad88d3e8914d3caeda60553894182dfd498e51ae data/create/advancements/recipes/building_blocks/oxidized_copper_shingle_slab.json @@ -3596,6 +3603,7 @@ fe79cb4cbea87efc84d61d3d31f073bf3c64c73d data/create/loot_tables/blocks/netherit 5dcb11160a51ce17fb06f5fecc14e87d92b1a641 data/create/loot_tables/blocks/oak_window_pane.json 461e9818f41aab34905757a423455cdcee780e67 data/create/loot_tables/blocks/ochrum.json 1259a439286385d5b7c48bff89d0839f1f2e02c2 data/create/loot_tables/blocks/ochrum_pillar.json +b124ea55ec522e0f314b972efed525647a2912cb data/create/loot_tables/blocks/old_factory_window.json 3f6940f13ca705bad7cdb9a9b80a3ae84f70f80c data/create/loot_tables/blocks/orange_postbox.json d6323d4b30faa87cd4b5b8b815cb16f78296f203 data/create/loot_tables/blocks/orange_sail.json 119fc4c3055c09c7958ac405925a6b7be2081c6b data/create/loot_tables/blocks/orange_seat.json @@ -4336,6 +4344,7 @@ efcbb602a5274a037af323bf5ef40756cbb8683c data/create/recipes/layered_tuff_from_s cd98d5d6b0ff6b56e8948a862070199c14f2ec10 data/create/recipes/oak_window_pane.json 9e1eaa83597afe00485940018be874885f02b1f7 data/create/recipes/ochrum_from_stone_types_ochrum_stonecutting.json 308dbf17a3a418849d9db74e7f88af442f50025a data/create/recipes/ochrum_pillar_from_stone_types_ochrum_stonecutting.json +b621fdf08968117bb16bdfdf1ae2f1d53229fb15 data/create/recipes/old_factory_window.json 4faec6e4889dac615eeda631ea346c5fe745ee86 data/create/recipes/ornate_iron_window.json f5e5a1c293b16690ab3e5c3941e24a99181133e5 data/create/recipes/ornate_iron_window_pane.json f07589f1079d13e0b93ce11a2d6e953e0842c5d0 data/create/recipes/oxidized_copper_shingle_slab.json @@ -4738,7 +4747,7 @@ c741ba83b562ae3459d7c4f2db69537f549ea411 data/forge/tags/items/tools/wrench.json 82274e06b6a9f3bfd83c8b59be38dee4a15b8bf3 data/minecraft/tags/blocks/climbable.json 71aef080a900d9e86818cf579438c3d826d6567e data/minecraft/tags/blocks/doors.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/dripstone_replaceable_blocks.json -4fffa6fa3be0722121611a1c1393e39cc5281b24 data/minecraft/tags/blocks/impermeable.json +480664a5d834f0c1168aaa6de8359d4faf720314 data/minecraft/tags/blocks/impermeable.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/lush_ground_replaceable.json 632b3589bae819777af7129b534f1c10e810cf5d data/minecraft/tags/blocks/mineable/axe.json b57faf9231efb408e49810b962cccb10566e1f05 data/minecraft/tags/blocks/mineable/pickaxe.json diff --git a/src/generated/resources/assets/create/blockstates/old_factory_window.json b/src/generated/resources/assets/create/blockstates/old_factory_window.json new file mode 100644 index 0000000000..5141afdf12 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/old_factory_window.json @@ -0,0 +1,18 @@ +{ + "variants": { + "": [ + { + "model": "create:block/old_factory_window_1" + }, + { + "model": "create:block/old_factory_window_2" + }, + { + "model": "create:block/old_factory_window_3" + }, + { + "model": "create:block/old_factory_window_4" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 9386d2799c..c461c45715 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -595,6 +595,7 @@ "block.create.oak_window_pane": "ǝuɐԀ ʍopuıM ʞɐO", "block.create.ochrum": "ɯnɹɥɔO", "block.create.ochrum_pillar": "ɹɐןןıԀ ɯnɹɥɔO", + "block.create.old_factory_window": "ʍopuıM ʎɹoʇɔɐℲ pןO", "block.create.orange_postbox": "xoqʇsoԀ ǝbuɐɹO", "block.create.orange_sail": "ןıɐS ǝbuɐɹO", "block.create.orange_seat": "ʇɐǝS ǝbuɐɹO", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 3d3f92bc0c..8649238194 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -595,6 +595,7 @@ "block.create.oak_window_pane": "Oak Window Pane", "block.create.ochrum": "Ochrum", "block.create.ochrum_pillar": "Ochrum Pillar", + "block.create.old_factory_window": "Old Factory Window", "block.create.orange_postbox": "Orange Postbox", "block.create.orange_sail": "Orange Sail", "block.create.orange_seat": "Orange Seat", diff --git a/src/generated/resources/assets/create/models/block/old_factory_window_1.json b/src/generated/resources/assets/create/models/block/old_factory_window_1.json new file mode 100644 index 0000000000..a6613d26bf --- /dev/null +++ b/src/generated/resources/assets/create/models/block/old_factory_window_1.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "create:block/palettes/old_factory_window_1_end", + "side": "create:block/palettes/old_factory_window_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/old_factory_window_2.json b/src/generated/resources/assets/create/models/block/old_factory_window_2.json new file mode 100644 index 0000000000..fcc5631125 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/old_factory_window_2.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "create:block/palettes/old_factory_window_2_end", + "side": "create:block/palettes/old_factory_window_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/old_factory_window_3.json b/src/generated/resources/assets/create/models/block/old_factory_window_3.json new file mode 100644 index 0000000000..9bb5fb2b0d --- /dev/null +++ b/src/generated/resources/assets/create/models/block/old_factory_window_3.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "create:block/palettes/old_factory_window_3_end", + "side": "create:block/palettes/old_factory_window_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/old_factory_window_4.json b/src/generated/resources/assets/create/models/block/old_factory_window_4.json new file mode 100644 index 0000000000..55edc182e8 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/old_factory_window_4.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "create:block/palettes/old_factory_window_4_end", + "side": "create:block/palettes/old_factory_window_4" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/old_factory_window.json b/src/generated/resources/assets/create/models/item/old_factory_window.json new file mode 100644 index 0000000000..a6613d26bf --- /dev/null +++ b/src/generated/resources/assets/create/models/item/old_factory_window.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "create:block/palettes/old_factory_window_1_end", + "side": "create:block/palettes/old_factory_window_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/old_factory_window.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/old_factory_window.json new file mode 100644 index 0000000000..dbc44c3cfa --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/old_factory_window.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_ingredient": { + "conditions": { + "items": [ + { + "items": [ + "create:industrial_iron_block" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:old_factory_window" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_ingredient", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:old_factory_window" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/old_factory_window.json b/src/generated/resources/data/create/loot_tables/blocks/old_factory_window.json new file mode 100644 index 0000000000..0da5907102 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/old_factory_window.json @@ -0,0 +1,31 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:old_factory_window" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/old_factory_window" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/old_factory_window.json b/src/generated/resources/data/create/recipes/old_factory_window.json new file mode 100644 index 0000000000..89c8f60ea4 --- /dev/null +++ b/src/generated/resources/data/create/recipes/old_factory_window.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "create:industrial_iron_block" + }, + "X": { + "tag": "forge:glass/colorless" + } + }, + "pattern": [ + " # ", + "#X#" + ], + "result": { + "count": 2, + "item": "create:old_factory_window" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/impermeable.json b/src/generated/resources/data/minecraft/tags/blocks/impermeable.json index 5b6acee1f8..673ef4c6eb 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/impermeable.json +++ b/src/generated/resources/data/minecraft/tags/blocks/impermeable.json @@ -16,6 +16,7 @@ "create:cherry_window", "create:bamboo_window", "create:ornate_iron_window", - "create:industrial_iron_window" + "create:industrial_iron_window", + "create:old_factory_window" ] } \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllSpriteShifts.java b/src/main/java/com/simibubi/create/AllSpriteShifts.java index ea0744a3c9..2fa7541792 100644 --- a/src/main/java/com/simibubi/create/AllSpriteShifts.java +++ b/src/main/java/com/simibubi/create/AllSpriteShifts.java @@ -41,7 +41,12 @@ public class AllSpriteShifts { getCT(AllCTTypes.HORIZONTAL_KRYPPERS, "palettes/framed_glass", "palettes/horizontal_framed_glass"), VERTICAL_FRAMED_GLASS = getCT(AllCTTypes.VERTICAL, "palettes/framed_glass", "palettes/vertical_framed_glass"), ORNATE_IRON_WINDOW = vertical("palettes/ornate_iron_window"), - INDUSTRIAL_IRON_WINDOW = getCT(AllCTTypes.RECTANGLE, "palettes/industrial_iron_window"); + INDUSTRIAL_IRON_WINDOW = getCT(AllCTTypes.RECTANGLE, "palettes/industrial_iron_window"), + + OLD_FACTORY_WINDOW_1 = getCT(AllCTTypes.RECTANGLE, "palettes/old_factory_window_1"), + OLD_FACTORY_WINDOW_2 = getCT(AllCTTypes.RECTANGLE, "palettes/old_factory_window_2"), + OLD_FACTORY_WINDOW_3 = getCT(AllCTTypes.RECTANGLE, "palettes/old_factory_window_3"), + OLD_FACTORY_WINDOW_4 = getCT(AllCTTypes.RECTANGLE, "palettes/old_factory_window_4"); public static final CTSpriteShiftEntry CRAFTER_SIDE = vertical("crafter_side"), CRAFTER_OTHERSIDE = horizontal("crafter_side"), diff --git a/src/main/java/com/simibubi/create/content/decoration/palettes/AllPaletteBlocks.java b/src/main/java/com/simibubi/create/content/decoration/palettes/AllPaletteBlocks.java index f7bc31151a..6c41c3815d 100644 --- a/src/main/java/com/simibubi/create/content/decoration/palettes/AllPaletteBlocks.java +++ b/src/main/java/com/simibubi/create/content/decoration/palettes/AllPaletteBlocks.java @@ -8,6 +8,8 @@ import static com.simibubi.create.foundation.data.WindowGen.framedGlassPane; import static com.simibubi.create.foundation.data.WindowGen.woodenWindowBlock; import static com.simibubi.create.foundation.data.WindowGen.woodenWindowPane; +import java.util.List; + import com.simibubi.create.AllBlocks; import com.simibubi.create.AllCreativeModeTabs; import com.simibubi.create.AllSpriteShifts; @@ -15,6 +17,7 @@ import com.simibubi.create.Create; import com.simibubi.create.foundation.block.connected.HorizontalCTBehaviour; import com.simibubi.create.foundation.block.connected.SimpleCTBehaviour; import com.simibubi.create.foundation.data.BlockStateGen; +import com.simibubi.create.foundation.data.CreateRegistrate; import com.simibubi.create.foundation.data.WindowGen; import com.tterrag.registrate.util.DataIngredient; import com.tterrag.registrate.util.entry.BlockEntry; @@ -80,11 +83,17 @@ public class AllPaletteBlocks { WARPED_WINDOW = woodenWindowBlock(WoodType.WARPED, Blocks.WARPED_PLANKS), CHERRY_WINDOW = woodenWindowBlock(WoodType.CHERRY, Blocks.CHERRY_PLANKS), BAMBOO_WINDOW = woodenWindowBlock(WoodType.BAMBOO, Blocks.BAMBOO_PLANKS), - ORNATE_IRON_WINDOW = - customWindowBlock("ornate_iron_window", () -> Items.IRON_NUGGET, () -> AllSpriteShifts.ORNATE_IRON_WINDOW, - () -> RenderType::cutout, false, () -> MapColor.TERRACOTTA_LIGHT_GRAY), + ORNATE_IRON_WINDOW = customWindowBlock("ornate_iron_window", () -> Items.IRON_NUGGET, null, + () -> RenderType::cutout, false, () -> MapColor.TERRACOTTA_LIGHT_GRAY), INDUSTRIAL_IRON_WINDOW = customWindowBlock("industrial_iron_window", AllBlocks.INDUSTRIAL_IRON_BLOCK, - () -> AllSpriteShifts.INDUSTRIAL_IRON_WINDOW, () -> RenderType::cutout, false, () -> MapColor.COLOR_GRAY); + () -> AllSpriteShifts.INDUSTRIAL_IRON_WINDOW, () -> RenderType::cutout, false, () -> MapColor.COLOR_GRAY), + OLD_FACTORY_WINDOW = WindowGen + .randomisedWindowBlock("old_factory_window", AllBlocks.INDUSTRIAL_IRON_BLOCK, () -> RenderType::translucent, + true, () -> MapColor.TERRACOTTA_LIGHT_GRAY) + .onRegister(CreateRegistrate.connectedTextures(() -> new RandomisedWindowCTBehaviour( + List.of(AllSpriteShifts.OLD_FACTORY_WINDOW_1, AllSpriteShifts.OLD_FACTORY_WINDOW_2, + AllSpriteShifts.OLD_FACTORY_WINDOW_3, AllSpriteShifts.OLD_FACTORY_WINDOW_4)))) + .register(); public static final BlockEntry OAK_WINDOW_PANE = woodenWindowPane(WoodType.OAK, OAK_WINDOW), diff --git a/src/main/java/com/simibubi/create/content/decoration/palettes/RandomisedWindowCTBehaviour.java b/src/main/java/com/simibubi/create/content/decoration/palettes/RandomisedWindowCTBehaviour.java new file mode 100644 index 0000000000..f2afdeb7a8 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/decoration/palettes/RandomisedWindowCTBehaviour.java @@ -0,0 +1,43 @@ +package com.simibubi.create.content.decoration.palettes; + +import java.util.List; + +import org.jetbrains.annotations.Nullable; + +import com.simibubi.create.foundation.block.connected.AllCTTypes; +import com.simibubi.create.foundation.block.connected.CTSpriteShiftEntry; +import com.simibubi.create.foundation.block.connected.CTType; +import com.simibubi.create.foundation.block.connected.ConnectedTextureBehaviour; + +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Direction.Axis; +import net.minecraft.world.level.BlockAndTintGetter; +import net.minecraft.world.level.block.state.BlockState; + +public class RandomisedWindowCTBehaviour extends ConnectedTextureBehaviour.Base { + + private List shifts; + + public RandomisedWindowCTBehaviour(List shifts) { + this.shifts = shifts; + } + + @Override + public @Nullable CTSpriteShiftEntry getShift(BlockState state, Direction direction, + @Nullable TextureAtlasSprite sprite) { + if (direction.getAxis() == Axis.Y || sprite == null) + return null; + for (CTSpriteShiftEntry entry : shifts) + if (entry.getOriginal() == sprite) + return entry; + return null; + } + + @Override + public @Nullable CTType getDataType(BlockAndTintGetter world, BlockPos pos, BlockState state, Direction direction) { + return AllCTTypes.RECTANGLE; + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/data/WindowGen.java b/src/main/java/com/simibubi/create/foundation/data/WindowGen.java index a51f5aef18..6f3a276e8b 100644 --- a/src/main/java/com/simibubi/create/foundation/data/WindowGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/WindowGen.java @@ -16,6 +16,7 @@ import com.simibubi.create.foundation.block.connected.CTSpriteShiftEntry; import com.simibubi.create.foundation.block.connected.ConnectedTextureBehaviour; import com.simibubi.create.foundation.block.connected.GlassPaneCTBehaviour; import com.simibubi.create.foundation.block.connected.HorizontalCTBehaviour; +import com.tterrag.registrate.builders.BlockBuilder; import com.tterrag.registrate.providers.DataGenContext; import com.tterrag.registrate.providers.RegistrateBlockstateProvider; import com.tterrag.registrate.providers.RegistrateRecipeProvider; @@ -40,6 +41,7 @@ import net.minecraft.world.level.block.state.BlockBehaviour.Properties; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.WoodType; import net.minecraft.world.level.material.MapColor; +import net.minecraftforge.client.model.generators.ConfiguredModel; import net.minecraftforge.client.model.generators.ModelFile; import net.minecraftforge.common.Tags; @@ -65,12 +67,38 @@ public class WindowGen { return woodenWindowBlock(woodType, planksBlock, () -> RenderType::cutoutMipped, false); } + public static BlockBuilder randomisedWindowBlock(String name, + Supplier ingredient, Supplier> renderType, boolean translucent, + Supplier color) { + ResourceLocation end_texture = Create.asResource(palettesDir() + name + "_end"); + ResourceLocation side_texture = Create.asResource(palettesDir() + name); + Function sides = i -> Create.asResource(palettesDir() + name + "_" + i); + Function ends = i -> Create.asResource(palettesDir() + name + "_" + i + "_end"); + return windowBlock(name, ingredient, null, renderType, translucent, n -> end_texture, n -> side_texture, color) + .blockstate((c, p) -> p.simpleBlock(c.get(), ConfiguredModel.builder() + .modelFile(p.models() + .cubeColumn(c.getName() + "_1", sides.apply(1), ends.apply(1))) + .nextModel() + .modelFile(p.models() + .cubeColumn(c.getName() + "_2", sides.apply(2), ends.apply(2))) + .nextModel() + .modelFile(p.models() + .cubeColumn(c.getName() + "_3", sides.apply(3), ends.apply(3))) + .nextModel() + .modelFile(p.models() + .cubeColumn(c.getName() + "_4", sides.apply(4), ends.apply(4))) + .build())) + .item() + .model((c, p) -> p.cubeColumn(c.getName(), sides.apply(1), ends.apply(1))) + .build(); + } + public static BlockEntry customWindowBlock(String name, Supplier ingredient, Supplier ct, Supplier> renderType, boolean translucent, Supplier color) { NonNullFunction end_texture = n -> Create.asResource(palettesDir() + name + "_end"); NonNullFunction side_texture = n -> Create.asResource(palettesDir() + n); - return windowBlock(name, ingredient, ct, renderType, translucent, end_texture, side_texture, color); + return windowBlock(name, ingredient, ct, renderType, translucent, end_texture, side_texture, color).register(); } public static BlockEntry woodenWindowBlock(WoodType woodType, Block planksBlock, @@ -81,15 +109,16 @@ public class WindowGen { $ -> new ResourceLocation("block/" + woodName + "_planks"); NonNullFunction side_texture = n -> Create.asResource(palettesDir() + n); return windowBlock(name, () -> planksBlock, () -> AllSpriteShifts.getWoodenWindow(woodType), renderType, - translucent, end_texture, side_texture, planksBlock::defaultMapColor); + translucent, end_texture, side_texture, planksBlock::defaultMapColor).register(); } - public static BlockEntry windowBlock(String name, Supplier ingredient, + public static BlockBuilder windowBlock(String name, Supplier ingredient, Supplier ct, Supplier> renderType, boolean translucent, NonNullFunction endTexture, NonNullFunction sideTexture, Supplier color) { return REGISTRATE.block(name, p -> new WindowBlock(p, translucent)) - .onRegister(connectedTextures(() -> new HorizontalCTBehaviour(ct.get()))) + .onRegister(ct == null ? $ -> { + } : connectedTextures(() -> new HorizontalCTBehaviour(ct.get()))) .addLayer(renderType) .recipe((c, p) -> ShapedRecipeBuilder.shaped(RecipeCategory.BUILDING_BLOCKS, c.get(), 2) .pattern(" # ") @@ -105,8 +134,7 @@ public class WindowGen { .blockstate((c, p) -> p.simpleBlock(c.get(), p.models() .cubeColumn(c.getName(), sideTexture.apply(c.getName()), endTexture.apply(c.getName())))) .tag(BlockTags.IMPERMEABLE) - .simpleItem() - .register(); + .simpleItem(); } public static BlockEntry framedGlass(String name, diff --git a/src/main/resources/assets/create/textures/block/palettes/old_factory_window_1.png b/src/main/resources/assets/create/textures/block/palettes/old_factory_window_1.png new file mode 100644 index 0000000000000000000000000000000000000000..f1a25bed075aa3960a7bcfa82ba70bb1ec95a20a GIT binary patch literal 858 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBuf-vKbiP>*~f?_4E5hcO-X(i=}MX3w{iJ5sNdVa1U3Z{C7 z-8ZuQ0pzeUNHMZ9FalX#Kr9VqgWRIQ$P5-|0b$b#xJG%x_k3hrDTv7XNi=rAT;PZ!4!3;(&nr}Hj5h}dp>Z1bl>);!dCX^5kf zN60D{7l97DFa@n`cR#b%2xM=|nfOcHBd5YkcWI{Y=NzH)Jm2FUuW-2e#Us4@nO)!c zGqTaU_pVzRmUD;Y`L?#w4>jl4s0zA0=4876d+wq7@8Pxe7Hzf?y-O3ye^2}|`7`&& z$2Xn2D$dXQ?z*SC-rJ+?u;jE`@%yc(9Adis^N)P|llyyYMeJ89sy}c!&aHZ)%dX!3 zsHfTCk2lZT+jytliSs{VJdNuI_j`NU$6N0D+Pjrs>YdyC=5|5L$D=GC4=;at_g-Dp z-I_^tman)4>#xifYK$&>8e{*9Ip$vV9II0CwSMdmUuoS+WU&8~;Ki3!=<+N%Ip6-T zm5c|!|M_QbX>+5v&XxsVxnZVy%IsC+{P(ib(~?hGWtvVrD{43A>p`yEycF%PWkD+y zbiT0Yot-f;BWoMa#Ahr$;`;HaK8q$ETqnu?S|wDP)j2Itmb0O;DZX&&!3?Q|ksjw3 z#a!umQeo!xQ*~3w(q{%)jO|M{Nlw*GU*CB^LshFtm1}!glEs!NzeY|G(P=AgF7AC#3p0PwdT0@USQbe|Oz zd35dWBXe)pM?p@0E`X_%hu0%{<7*buSL79Up6sNuDr#Ns8oC-9UI4gR4hL`o!~uX< z>^ck3|MA1U$b#7Zje}WS5d;SKS=O2bj~MoU6x?EgRe|CR*U03ewQU}xoF zmz7{3+>p5`$)p^O{hXc$~0smWRc2$+d{@0}lgB@m_^Urpe8SnSAj;d&=r)?2z zziMNXBw+wSXey~U`G0-8wNl>FR4?kL_~&JZ>n(mMw~Gms{KuV~Gr=)8&R!LKEwQ-dL3V%{Wad7+C%` z&Yu={EsD_g*{$8BD~*)?xwo*A+C-a;IGCK@Q&@U1N+X|Z)su<{k3m>PXpM~sd!pgb z+hF*$TD6}2K8KK~@d^0P_9^HW-X>+M?)U@s^_gRN(bA~$598|scD}7+Ya@$mGu^kT z89Nh_XuhxJnCTBxI%PSa-ufL>iuB%1LG#Q(D<A3vhD5N&Mg$T$U{YxxlsOP1#2hwqE^Vt`FSg z$qw7qsa1x{Y1(FF;ih)hM)iDkBs!+COY9RZcTl6Fsh1a01loTMN@4!09xS_P)TdKF z`TBJ|+d(MAJerTlE*H9{_+^pqpK{B+tKkuBZrAMGg ziik;8vhqTa)*C`MUGU<-xGdZ%SA5*&u6=>orR?+}&;}HN@p+h7UvKT_kfQ6Iw=);K z`b88r4N=5zpcADti4`>SbLYeu6gdQPK@yv54^)iTX~#x zY|+?!m!o(3=vCuX8mflk6aQO}KayLpMIUu^wyE-epyo3RT>3OXJPMG5Ec)_Z0{ zItZs1c=U?c-D1ODk+bgnq18p|NDBTlnCEb8Qxm$uOO(CCJfr^Xdc_3!)#~vi4Sta5 zkT?y?cK0gmBS`IwquAZ41|u8wO$|`Oq<-{KMvJ}8h}br_kEDmER?Yz~Qax)?u%lg4 zn}+{rd+<=EXmEd9=hR6nORB~@VIGd>3~bz+PZ*hNPE-6L&e1enlxN6eUfcE~*~7zm zD7o-m9%a*{7|jzELla#^itiwnIP@dO5uo&AnMfR)P;(@ANW1f$qndFzn2W3P&ziuX z{m;@#E>Pb|6I#R0&=VnB?d~(JiXBQ@XChFOM#90ZL|rWPD6&l~je9+U=EXEln4YB^>o+IWylN7b)e(o(p@N7O~Gmj+t~o+f<|l}hKQ z(-2$*MS1`F`(AZ(duoYq(RRfJOVSKu<823g%b~vQ^)a+Qmu&oqD$b*JHgWOQMWuSg z?5L9XSJe%ARD*}n=o_v|GIsG6^F2t<4{(%u>asC()O$%%2aR64EO0gG`iWVt7m58P z6-@1N6>%$TwbOd+(051djUsDAPFbmHn6$cG24^I#?8W!+XX{F3^o&TQUwlu`krSp? zp9d6l=+iW&lT=K3qd)ID|PM^6^oq|#^)1cqj^tZg2R{Z!6cUPg1{E*9% zQJvKVN=vkJmwU#C9+WOWqke6!lUzl^9GtYXG7RshAmN=0C^!f3O3|+OU!(5dvcR)PQ0+j(*%9eu*2;`g|5l}i)mjOTnW%NMx>4K2BGyK=k z&CdYmTOE7xG46=2(R)rh^Kr>xpi~nCyr(*M;hMFa`|<g}F|G5cprM{_Mcnw{`ReTRv$i9zn#+(n15jgbx)HUG|VdznfjY zuC6e|kD^An^TT2Y_@KbIkjcuc_?|8$I^jKULS6-=U&GtyPetOg1jzBG7|0sCTuS`J zeQpWNwd+Md7GX074_^lXpI`U{>sw@aA-q)_ z8xJZY@|HOA4#Etul*Lomc?km_HRMcjpiVK0Se8UfGB!+96HUbgw2hPHMfUa9hE1@_ zT#RPNZo(-`rV9kN1e7V4c7VHMTpm3OclgUi=~bC7EI(!E5iAjruh`kz zIQe@(B02$l1;%X)^9Y#av~-N**3aR8$a>p z)u*SjG!h3Dr0j&{%a=ey3c(aDQr84?d}-MuT#DL{enwa~$so}NmBQU1VHZ=8`ou&` zxFnPBTevM=b?~d7B(_1pmx zceeJWH9J6+apyY-d0xL;-DR8(@1P1)cUs>%`(pi~a~My~<7$(ix^N%I>OV}g)u!JC zjnxqSdq_0DWsQ%AmVxBhPSur8ZRW}PNCPc{r~{KD`D2$t*lp3qCo8{-&GURWY^40P zyHXloMqi1~8fD3i5XCpfZq~PT1G@4mg&YZ$iZ7<33&}mM54jjYlbn(ue_>hM0CN-@ zz;N=9eaH)rZKB8?I57E_xy@de0B3d53dcOPo)KSvy6+#GnH-l-u9|#ZU6&7j<+T#8 z$Q4Xmz2z>G65lf1I0w&Q51BTEiGL+Vf--fImDxCtWB%Q7UF4JY#@=mV#C`{o(=|c^ z{D%ScU12+p&-0SCSp*UQsmyka%acG;6%OgOzSQmY${rOv(5?sCWR*>f@@L2L$3U3+ zb3#%vSQl+-^*ST~bh&ozZJ15Jd<8m;9i~^>!6X8{p)W0I5Kn;tGzGp@77h4XC zjA)L?T$4nSf-3^6tNeaVQCfftFh>2LX5 zeIl^@yu@`zjZA(+@+YWo~dX+%whs=2a!V@BN{^wnxo*i(o=i~K$^TfUW zj-On-`{3&}5NkX|hb`?XzpDc^?8)MD^Tgc@UcNHm0yl;PmHsIh68%j4&2k49Wzx`C z-8kVmzKf83{sCLMR7h=#gU0!{+&Sc0L)O{s9S{D5qle4^Q-`c`7}Ct1J+QOU0zx#v zh<0QU|X$zXq>kdas z_aTrf9Z5;wD#kcT>Zrh@kcsEUW&j+JXp_~#)@<*9WeQb1c70xZ7EQA{_+AIxtMz7- zW@<=M`cTN>xw^C%2+xENGGG zK@o2I3naU~4=0wcS(6cr->rQg`l`DVdUON$dV$fDY^3OXcI0JbW7qX|3sS+#P@ zHqggpUsNsJ6v3>_;p%Q}Cr|+*2EI6*{3`_edy0P3t6WV*IZ21wKv~wb>3Vt|zI8L~ d0!b#92`GrNf1{lOG7dkIhS!Ys%5@y0{sXYify)2@ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/palettes/old_factory_window_1_end.png b/src/main/resources/assets/create/textures/block/palettes/old_factory_window_1_end.png new file mode 100644 index 0000000000000000000000000000000000000000..f6cc3536710205b5a98a0229e47bd5a79e192756 GIT binary patch literal 234 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 B#<>6h literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/palettes/old_factory_window_2_end.png b/src/main/resources/assets/create/textures/block/palettes/old_factory_window_2_end.png new file mode 100644 index 0000000000000000000000000000000000000000..f6cc3536710205b5a98a0229e47bd5a79e192756 GIT binary patch literal 234 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 PzKr_XcWxKnvZV{{c!Nn;a%Pcay1+{`6%9NNr z(E8x?xz#NBzG7>6G=tbxgmvWp^gbw;Q~A$q#&cj-_zZ?!+ZaD=Ox*RI`Bg;tJr@3F i8M7bc*u7JIVb2(*~f?_4E5hcO-X(i=}MX3w{iJ5sNdVa1U3Z{C7 z-8ZuQ0pzeUNHMZ9FalX#Kr9VqgWRIQ$P5-|0b$b#xJG%x_k3hrDTv7XNi=rAS`PZ!4!3;(&n-uc3Y0&>;mlWX6X39k&$VCCZo zU9})9KrpbHDX{S2fw}Pq_#d5_svY#-Q&rDq>9k8*GAHL;%DHA{EL;}4Am*3nwHu#* z{JELjz4qL$!r4OWnuJ$6?y1_BE4G=%?We?{1OH{4{;$)&b=FEuVU?&E%oa+ zUoH=y|7HKX?=w2gzN&jXFp;sle*PZAx%c_=PTgocI#u*^cIpP1Rsj_|iQ7#2z6C4= z+11Pc=UP0FdNpr}Q_@@x*0oQ~w1tG2w>4PsM9kfy!r}eFX7{zWO#vT1?l{h+Dtc*y z`7Y*j4pXWY<#>O#xg4Rx<6)_;u&3hhG8G|SRgd!#8(M<4YUU=3s6Fmm(frKu@1#aF0pg3^fW>n z4!KBo%O2NTxuVI*DAh}C+efFZVWyVC0q>Qse?GkI_4dhE@{fAT?2!9?ez}yBeTUQa z{!Jx{rzV+XnMu{yv~GPAS$_C};EBSIYr|K>-M|08K_o!kB|Z15&XFH#>lk2X9m7W%Rye|&S!Gxxb=?%aFM%sDeptu0OX;9_t90Qk&IjjnT~ z!EYSm=FCMtfs-5o3chZF1WJ1(mN*L69YYI40H{dh*>{6-^gjYjZv_JY|EJ#owfn#G zN#~)5dOb8f5$`d|IPD)!+#GjCky!B$m`k{IP8C`)Kpb}dp+{ce7*J+gF5OQCs;m|ASt19;#BR4j%!Cx!}0?znV+IcBqdFC zut_ckr&9 zX>{$SbC|>4604Yuel<9BesOn#Z~3yMn2LxIdp43Rl=nr(v@C2;n%^mqI6&>2r%v|W z*nUkPlJeslw!w_oZ8Nr3LjSp0keNd+Oe@t@If$eMM8mBS)BAUHhW?` ze~Kci^5sgE`j3wTn`(`FQzzn6+ddn{@!huyn7C`Kp{=caTZ++_b+A8j=j2{nXJx;l zXVY4(uEYaUPu`jCY+}FMV`!1BeE(V-ZSgyImUeLL!4}oOO!R_P!2FlXYP^DI93@k{ zy0Oum9loBmQl4BOz+kMi@z;2f8B?*(?Flt4W`&knZ^~%}oRjA?kzE914512Inm`dNAwpZEGcdqqE@VkTv56Yn0*;3S(h04|exQ)&~Ds z4MIc9rMg`&WwFPA!Ibd^fpB+;IJ6&tuB{H*??!uZ1| z^LVdUB0igQW@eWXz@AIb-?+4Hebb1UMP<0RFeoT_t3PLticJmfkF>D_Ma6R_Z{?Mg zyc)NA?Cn>LkjO!>N-n!8O5G=M=>zr=%ju7ESTw)Jy4tfBy)gsrElus&_k?o7b915g zRAE(K2s|p?K`DZ7_it^>6G{52VK>jQgcb&eTye ziFsd<3+4(;Luw8CtOvQmW}j?7kqeA+NdxPQ$2;^-Bk|>?d6~%U!o>Y|`S+@OnR`AL zOYqK6JJB;f2XiOKO!tYOe(#eTF^#+wq(0i@I3C(`v>oERKeM1OB6}os?pddTGvUSZ zx`~CD!YL2zx9_+AmR~lP`THF5gmwZL4B}RekU}1I@0$U|&3d0UEJbt;i~nJ0q&9ZR zNx@pdzJkegFobYW#s#f#tHr*U!3(d zXwUKBl0u~^z>A+Zz~C)eM6zEa>b<_FI8-dju~F`DVGS6=WWgsFH0Uza-9vACh39K} zH)%UbE|=5%-JO*-u-6quPT%vWyg2ZDbMY@*eu>sg8~h>+kcY0kY-zclNpm@}(S>Aq zyLwTM3AeRQYtn<;tuEya$vF|GN4!bZVEgF1N-ualnz2vrx90ITx_0KDtB3Z%JyuWA zV9qDHv}Ve4ZoVy0U}$G`ZqrUj8rfeFLbs4^W4Dj>)~(8x9-_CUeEfWb=qLf-Kk6og zJ0eIQTK_)S9I9d7-|++cWOGSxT{xwD36J`otreyQN=`o(+22TSOzq7@H_ zm0d;ml%38UZ1NhhW24T-fm*#nu$6N0kc`WGlfL)9YIv+b5PB)e@!%YlCz-VxC1}8r z-&<@wpNl_Z5vM#c0U z>n$K9N-&8_OM4wX#ProEJzDZ>vij?_KwM&P$$#i~UCL~bCZ4fMC5Mr^ z>B0eh?F)kFT7o~(KwPGao!kZtIky@nbD7B5c5&GL|>x-7+7Y#f!)Z3HE~w;7WJF1HChQF0s9`b8Di%CGsHIEonPtenbhApnEGEBSa`;TP!0~eJxIH4OU1%}YVxrQQ?OJLp(5Y49TPbvz`ms;8i=9_k7fsH?YJI2(**>lEwuiuUP?Tls#>hjDTTx@Z7)mSN7vq)>6$u*S8b1~#@(mcH00yDV#y(g=OScVJw4w; zBuuQe&iHWi<}(v?i`G5vVqmb))U^@P-uh@TZK*KGWMsqlIHV6kiu1kvkMGqHyyQy@ z(38C_PnM2vrG*_9F)RTTm6iz97O|}p->%DxXY=uv8=~Ci2cR9+O>`;WuSf`Up5Ar_ zqCTr!A0qTXpifu6ZhP!+AWf+|?;!H5)*&sZ@%q}6;+p_4sBd=56}Lre%K%6fyi^L{P6WeA22i>z58G`GtI^C>Kjb% zBbBc2oJW@%06q*W->9#tF-v@9rAas#6%TR-HZZ+qjyKT@pvoS>CxmuH`Q*J$ZP*($ zNp!~BUT_Hw3fCgmF~cD_O#+hki+Xrnn}XE4Wm?vzi>@@yUU3bp?0fxoDw@@RoD2=) zg2fxp35t1nmrBZZ2>z+PHoR#@k=mQjew!V7f4lRBwiJ+qsx#+wOFzJ_gA6c%3ABd~ zx0?a#bTf$GDIIE{QW55DNgs@n&@fxDU0R?s zHa@*c{>ci&{qJY){l1lX*E6$TQe*rA_tm2A4@Pe6Ch%e{cw+q9O{d2;zr#DL1YAwb z!cssxE|q!3ylX`Px){I?kU**!V5>eYK*!mw5C(a>DJ-rUj0=w@oan6*7=HL{X+?<` zw<;-_?bzTrJ>8h+E{2o6MLx{CR25zRT?PNJ-88w*W3FmF>VQ$)`wC8?Y2KJ;y!eD{ z>2bR`(^*$6h`K3fgL!ZniE=-AwmRKZ>&zL28%2TXITW8KJ9jC6>XHEa3A8>L-W zEFTf8BADx?lrfD3V+RUiZ&@E}A+!c%_G(T|2v{#l_;&^v=c+NI&BvG-F1d8zXTry7 zo?okRV8>n*jNTua`w2(cPTY&Y?(3|M2>|0^f<1h%sjzp1Eb`oZk;kQNIgLaG;$&6m j)$|}6a&_UB-bto(UT61i5nJ@a?~kOJv87Qd(lzQoXW^0M literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/palettes/old_factory_window_4_end.png b/src/main/resources/assets/create/textures/block/palettes/old_factory_window_4_end.png new file mode 100644 index 0000000000000000000000000000000000000000..f6cc3536710205b5a98a0229e47bd5a79e192756 GIT binary patch literal 234 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`8$DedLo9laPB!E^WFXSEe@YWy z|0QXQGJ&cdzqe0bsM@rIzr3+>ZV{{c!Nn;a%Pcay1+{`6%9NNr z(E8x?xz#NBzG7>6G=tbxgmvWp^gbw;Q~A$q#&cj-_zZ?!+ZaD=Ox*RI`Bg;tJr@3F i8M7bc*u7JIVb2( Date: Thu, 5 Dec 2024 16:19:54 +0100 Subject: [PATCH 162/515] Panel power - Factory and restock gauges can now be paused with a redstone signal - Factory and restock gauges can now output comparator signals when completed - Gauge connection handler now aborts when something other than a gauge is clicked - Fixed arms not taking from repackagers - Restore missing train map icons --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 6 +- .../resources/assets/create/lang/en_ud.json | 1 + .../resources/assets/create/lang/en_us.json | 1 + .../com/simibubi/create/AllPartialModels.java | 1 + .../AllArmInteractionPointTypes.java | 2 +- .../factoryBoard/FactoryPanelBehaviour.java | 56 ++++++++++++++++-- .../factoryBoard/FactoryPanelBlock.java | 22 +++++++ .../FactoryPanelConnectionHandler.java | 8 ++- .../factoryBoard/FactoryPanelRenderer.java | 19 +++--- .../assets/create/lang/default/interface.json | 1 + .../models/block/factory_gauge/bulb_red.json | 22 +++++++ .../create/textures/block/factory_panel.png | Bin 477 -> 692 bytes .../block/factory_panel_packager_mode.png | Bin 550 -> 540 bytes .../assets/create/textures/gui/widgets.png | Bin 11596 -> 12084 bytes 14 files changed, 120 insertions(+), 19 deletions(-) create mode 100644 src/main/resources/assets/create/models/block/factory_gauge/bulb_red.json diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 5474b77f58..b48befb2a3 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-12-05T10:47:38.4659572 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-12-05T16:08:22.0352298 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -640,8 +640,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -66a0a2bb4cee8929559b5e9ae06528149f8b0cbe assets/create/lang/en_ud.json -618696fd789b959def3ea03a8ce67b27ca2c8c8e assets/create/lang/en_us.json +a32412bd9acc0409b78d878e7ea4ecd3a49a97d2 assets/create/lang/en_ud.json +8bd05b90f21f54644f72787a7cc44b094c1c40dc assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index c461c45715..ab767b2ffa 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -1106,6 +1106,7 @@ "create.factory_panel.new_factory_task": "ʞsɐʇ ʎɹoʇɔɐɟ ʍǝN", "create.factory_panel.no_item": "ʇsɹıɟ ɯǝʇı uɐ ǝʌɐɥ ʇsnɯ ןǝuɐd ʇnduI", "create.factory_panel.panels_connected": "%2$s ǝʇɐǝɹɔ oʇ %1$s buısn ʍoN", + "create.factory_panel.redstone_paused": ")pǝsnɐԀ ǝuoʇspǝᴚ(", "create.factory_panel.same_orientation": "uoıʇɐʇuǝıɹo ǝɯɐs ǝɥʇ ǝʌɐɥ ʇsnɯ sןǝuɐԀ", "create.factory_panel.same_surface": "ǝɔɐɟɹns ǝɯɐs ǝɥʇ uo ǝq ʇsnɯ sןǝuɐԀ", "create.factory_panel.some_links_unloaded": "pǝpɐoן ʇou ǝɹɐ sʞuıן ǝɯoS", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 8649238194..447d6dcbc2 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1106,6 +1106,7 @@ "create.factory_panel.new_factory_task": "New factory task", "create.factory_panel.no_item": "Input panel must have an item first", "create.factory_panel.panels_connected": "Now using %1$s to create %2$s", + "create.factory_panel.redstone_paused": "(Redstone Paused)", "create.factory_panel.same_orientation": "Panels must have the same orientation", "create.factory_panel.same_surface": "Panels must be on the same surface", "create.factory_panel.some_links_unloaded": "Some links are not loaded", diff --git a/src/main/java/com/simibubi/create/AllPartialModels.java b/src/main/java/com/simibubi/create/AllPartialModels.java index 8457b60621..c15800e9ce 100644 --- a/src/main/java/com/simibubi/create/AllPartialModels.java +++ b/src/main/java/com/simibubi/create/AllPartialModels.java @@ -191,6 +191,7 @@ public class AllPartialModels { FACTORY_PANEL_RESTOCKER = block("factory_gauge/panel_restocker"), FACTORY_PANEL_RESTOCKER_WITH_BULB = block("factory_gauge/panel_restocker_with_bulb"), FACTORY_PANEL_LIGHT = block("factory_gauge/bulb_light"), + FACTORY_PANEL_RED_LIGHT = block("factory_gauge/bulb_red"), TABLE_CLOTH_NW = block("table_cloth/north_west"), TABLE_CLOTH_NE = block("table_cloth/north_east"), diff --git a/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/AllArmInteractionPointTypes.java b/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/AllArmInteractionPointTypes.java index f08dbd7c83..88af365e56 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/AllArmInteractionPointTypes.java +++ b/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/AllArmInteractionPointTypes.java @@ -264,7 +264,7 @@ public class AllArmInteractionPointTypes { @Override public boolean canCreatePoint(Level level, BlockPos pos, BlockState state) { - return AllBlocks.PACKAGER.has(state); + return AllBlocks.PACKAGER.has(state) || AllBlocks.REPACKAGER.has(state); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java index 43b42d7ff3..6a2c7be28c 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java @@ -39,6 +39,7 @@ import com.simibubi.create.foundation.blockEntity.behaviour.filtering.FilteringB import com.simibubi.create.foundation.utility.CreateLang; import net.createmod.catnip.gui.ScreenOpener; +import net.createmod.catnip.utility.Iterate; import net.createmod.catnip.utility.NBTHelper; import net.createmod.catnip.utility.animation.LerpedFloat; import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; @@ -54,7 +55,9 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fml.DistExecutor; @@ -82,6 +85,8 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { public boolean forceClearPromises; public UUID network; + public boolean redstonePowered; + public RequestPromiseQueue restockerPromises; private boolean promisePrimedForMarkDirty; @@ -105,6 +110,7 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { this.recipeOutput = 1; this.active = false; this.forceClearPromises = false; + this.redstonePowered = false; this.promiseClearingInterval = -1; this.bulb = LerpedFloat.linear() .startWithValue(0) @@ -112,6 +118,7 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { this.restockerPromises = new RequestPromiseQueue(be::setChanged); this.promisePrimedForMarkDirty = true; this.network = UUID.randomUUID(); + setLazyTickRate(40); } public void setNetwork(UUID network) { @@ -134,7 +141,7 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { public void tick() { super.tick(); if (getWorld().isClientSide()) { - bulb.updateChaseTarget(satisfied ? 1 : 0); + bulb.updateChaseTarget(redstonePowered || satisfied ? 1 : 0); bulb.tickChaser(); return; } @@ -148,6 +155,36 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { tickRequests(); } + @Override + public void lazyTick() { + super.lazyTick(); + if (getWorld().isClientSide()) + return; + checkForRedstoneInput(); + } + + public void checkForRedstoneInput() { + if (!active) + return; + + boolean shouldPower = false; + BlockState blockState = blockEntity.getBlockState(); + Vec3 localOffset = getSlotPositioning().getLocalOffset(getWorld(), getPos(), blockState); + + for (Direction d : Iterate.directions) { + if (!localOffset.subtract(0.5, 0.5, 0.5) + .closerThan(Vec3.atLowerCornerOf(d.getNormal()), 1.25)) + continue; + shouldPower |= getWorld().getSignal(getPos().relative(d), d) > 0; + } + + if (shouldPower == redstonePowered) + return; + redstonePowered = shouldPower; + blockEntity.notifyUpdate(); + timer = 1; + } + private void tickStorageMonitor() { ItemStack filter = getFilter(); int inStorage = getLevelInStorage(); @@ -163,6 +200,7 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { && promisedSatisfied == shouldPromiseSatisfy && waitingForNetwork == shouldWait) return; + boolean comparator = satisfied != shouldSatisfy; lastReportedLevelInStorage = inStorage; satisfied = shouldSatisfy; lastReportedPromises = promised; @@ -170,13 +208,15 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { lastReportedUnloadedLinks = unloadedLinkCount; waitingForNetwork = shouldWait; blockEntity.sendData(); + if (comparator) + blockEntity.setChanged(); } private void tickRequests() { FactoryPanelBlockEntity panelBE = panelBE(); if (targetedBy.isEmpty() && !panelBE.restocker) return; - if (satisfied || promisedSatisfied || waitingForNetwork) + if (satisfied || promisedSatisfied || waitingForNetwork || redstonePowered) return; if (timer > 0) { timer = Math.min(timer, REQUEST_INTERVAL); @@ -188,7 +228,7 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { if (recipeAddress.isBlank()) return; - + if (panelBE.restocker) { tryRestock(); return; @@ -488,6 +528,7 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { panelTag.putBoolean("Satisfied", satisfied); panelTag.putBoolean("PromisedSatisfied", promisedSatisfied); panelTag.putBoolean("Waiting", waitingForNetwork); + panelTag.putBoolean("RedstonePowered", redstonePowered); panelTag.put("Targeting", NBTHelper.writeCompoundList(targeting, FactoryPanelPosition::write)); panelTag.put("TargetedBy", NBTHelper.writeCompoundList(targetedBy.values(), FactoryPanelConnection::write)); panelTag.putString("RecipeAddress", recipeAddress); @@ -520,6 +561,7 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { satisfied = panelTag.getBoolean("Satisfied"); promisedSatisfied = panelTag.getBoolean("PromisedSatisfied"); waitingForNetwork = panelTag.getBoolean("Waiting"); + redstonePowered = panelTag.getBoolean("RedstonePowered"); promiseClearingInterval = panelTag.getInt("PromiseClearingInterval"); if (panelTag.hasUUID("Freq")) network = panelTag.getUUID("Freq"); @@ -601,10 +643,12 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { return getFilter().getHoverName() .plainCopy(); else { - String stacks = upTo ? "" : "\u25A4"; key = getFilter().getHoverName() - .getString() + " -> " + getAmount() + stacks; - if (!satisfied) + .getString(); + if (redstonePowered) + key += " " + CreateLang.translate("factory_panel.redstone_paused") + .string(); + else if (!satisfied) key += " " + CreateLang.translate("factory_panel.in_progress") .string(); return CreateLang.text(key) diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java index 6747c4fc34..fc9b9d68a7 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java @@ -221,6 +221,28 @@ public class FactoryPanelBlock extends FaceAttachedHorizontalDirectionalBlock return InteractionResult.SUCCESS; } + @Override + public void neighborChanged(BlockState pState, Level pLevel, BlockPos pPos, Block pNeighborBlock, + BlockPos pNeighborPos, boolean pMovedByPiston) { + withBlockEntityDo(pLevel, pPos, fpbe -> fpbe.panels.values() + .forEach(FactoryPanelBehaviour::checkForRedstoneInput)); + } + + @Override + public boolean hasAnalogOutputSignal(BlockState pState) { + return true; + } + + @Override + public int getAnalogOutputSignal(BlockState pState, Level pLevel, BlockPos pPos) { + return getBlockEntityOptional(pLevel, pPos).map(fpbe -> fpbe.panels.values() + .stream() + .filter(fpb -> fpb.isActive() && fpb.satisfied && fpb.count != 0) + .count()) + .orElse(0L) + .intValue(); + } + @Override public boolean onDestroyedByPlayer(BlockState state, Level level, BlockPos pos, Player player, boolean willHarvest, FluidState fluid) { diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionHandler.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionHandler.java index 73ae6dca43..ad76c900c1 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionHandler.java @@ -17,6 +17,8 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.HitResult.Type; import net.minecraft.world.phys.Vec3; public class FactoryPanelConnectionHandler { @@ -124,7 +126,11 @@ public class FactoryPanelConnectionHandler { if (connectingFrom == null || connectingFromBox == null) return false; Minecraft mc = Minecraft.getInstance(); - if (!mc.player.isShiftKeyDown()) + boolean missed = false; + if (mc.hitResult instanceof BlockHitResult bhr && bhr.getType() != Type.MISS) + if (!(mc.level.getBlockEntity(bhr.getBlockPos()) instanceof FactoryPanelBlockEntity)) + missed = true; + if (!mc.player.isShiftKeyDown() && !missed) return false; connectingFrom = null; connectingFromBox = null; diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelRenderer.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelRenderer.java index bd5059921a..2d8db4e482 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelRenderer.java @@ -8,6 +8,7 @@ import com.simibubi.create.AllSpriteShifts; import com.simibubi.create.foundation.blockEntity.renderer.SmartBlockEntityRenderer; import com.simibubi.create.foundation.render.RenderTypes; +import dev.engine_room.flywheel.lib.model.baked.PartialModel; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.theme.Color; @@ -47,7 +48,10 @@ public class FactoryPanelRenderer extends SmartBlockEntityRenderer 0 && !behaviour.satisfied) { + if (!behaviour.redstonePowered && !behaviour.waitingForNetwork && glow > 0 && !behaviour.satisfied) { color = Color.mixColors(color, success ? 0xEAF2EC : 0xE5654B, glow); if (!behaviour.satisfied && !behaviour.promisedSatisfied) yOffset += (success ? 1 : 2) * glow; diff --git a/src/main/resources/assets/create/lang/default/interface.json b/src/main/resources/assets/create/lang/default/interface.json index 8a6a2cf8cd..5ff689a054 100644 --- a/src/main/resources/assets/create/lang/default/interface.json +++ b/src/main/resources/assets/create/lang/default/interface.json @@ -1088,6 +1088,7 @@ "create.factory_panel.new_factory_task": "New factory task", "create.factory_panel.some_links_unloaded": "Some links are not loaded", "create.factory_panel.in_progress": "(In Progress)", + "create.factory_panel.redstone_paused": "(Redstone Paused)", "create.factory_panel.cycled_arrow_path": "Cycled arrow pathing mode %1$s", "create.factory_panel.tune_before_placing": "Tune to a stock link before placing", "create.factory_panel.same_orientation": "Panels must have the same orientation", diff --git a/src/main/resources/assets/create/models/block/factory_gauge/bulb_red.json b/src/main/resources/assets/create/models/block/factory_gauge/bulb_red.json new file mode 100644 index 0000000000..4aa4a66808 --- /dev/null +++ b/src/main/resources/assets/create/models/block/factory_gauge/bulb_red.json @@ -0,0 +1,22 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/factory_panel", + "particle": "create:block/factory_panel" + }, + "elements": [ + { + "from": [0, 1, 6], + "to": [2, 3, 8], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11, 8, 13, 10], "texture": "#0"}, + "east": {"uv": [11, 8, 13, 10], "rotation": 90, "texture": "#0"}, + "south": {"uv": [11, 8, 13, 10], "rotation": 270, "texture": "#0"}, + "west": {"uv": [11, 8, 13, 10], "texture": "#0"}, + "up": {"uv": [11, 8, 13, 10], "rotation": 180, "texture": "#0"}, + "down": {"uv": [11, 8, 13, 10], "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/block/factory_panel.png b/src/main/resources/assets/create/textures/block/factory_panel.png index 0cd09c0812f0e568f8935fe6e18085b2d3449ee9..d5eb4624b5550db909613a67569ffd0a3181dc26 100644 GIT binary patch literal 692 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBufG}g$wN6f;pje4(L`iUdT1k0gQ7S_~VrE{6o}X)of~lV2 z_vY`DfhxA7MtG)qdTKFn06DA-QjDw&j6jwb5KBYZAh&2RGK0mLfNVoXCI&tr9R_Lng-ykJJqC{{86B_^;lumIH=7#SNdE`XQ`vX6BE#GFY$HV7~QO=SYB z46?KUvY@&Q4GciCCoDv^1XgGQz0H{J>Eak-;lFmGt@q&oiB^B7HNKawN{R{H4bZ1Z>RZlB-XQW2Xb#IfvhhN;w! z_4gJ=Wg6-In0WcoM2SAWha2y;gfCAE7ww&zdF?sh{*dBRvy}>BiqG#o6S8PiZrD3F zV_Oq>pY1@3C z2uUh$YCibkJKwK=z4mG{Z}Ph@rf|KMj`m7R|EMIypH#WNCByq*$wGtqXVVsLxj19a z>8CCp*JBqisi|Z>Q#0@FvEL0Ddk+|~-n&)*{?8kh?OVH~gO}ValZlwdde|VQ_juB~ zSiAY(Wt~%vKF(VC>79AV%r~aqi+g@vEN6dLvv=B$=|BH7K47lCa%Nf;`@18c;P-U( Kb6Mw<&;$VYyz=}2 delta 451 zcmV;!0X+V+1>FOXB!32COGiWi{{a60|De66lK=n!32;bRa{vGi!TSfutU3sHiWiEu>9_Pj!tc5ib{3)Y0B5#Zr!BKF`2)Y1=LAh6kXmr@D4) zU8#l4JYC0QIInH&YVm}gqFBnIZ=R1#leK-7xNZXQ72I{aK*3TbO){S!mu8xgr4TZ6 z%gm-xzy)18N~W?7a}N~vgxl}bgWbbaK3 z+T$~<2WQ`XpHYLisCIvM!%MRfSO{TXN`w#?hJg@*#XM{lUrMUg>O>ncAq2n(Y#2s# tH!Wge^DrEOVeMZPXx}aIC;tB=J^;@J%>RfHn0){M002ovPDHLkV1mX*$YKBh diff --git a/src/main/resources/assets/create/textures/block/factory_panel_packager_mode.png b/src/main/resources/assets/create/textures/block/factory_panel_packager_mode.png index 56e67c2631a2bf4d70420b1341b4a4915bb41f2e..62a87fab0882a66910a0e5b87ac1a9a1443a848d 100644 GIT binary patch literal 540 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}x0G|+77b7h%Ym)?Thy8t_-%scKf8F!@PVJNJ$%po=zH(;g)5mvi-#G8@ z?;jZv;o{A|Lx^`v~P?EF2BeIx*fp0$uGg`0)s{jSX zN?apKg7ec#$`gxH83GbB^GfvmTtgI0^$fo^f1eCgu_ZOaGtJXei-7~kVP%kFWMyCk zvb=y;8p;OwQ-hHiEY1XE8!|F6@BwL%%QD+pz~UJ|HV7;$V`O*%3=SBLVkHAmVgfq@ z3s9Ybk+A{e0*IL)`&bu1%$Wpag8&oIR3@;>AWI7%3#!Y|zyKs$)wx3@bz^WgkXh{M z;uxY4oZ1^HbU=Z_IZ$wo>*>G#w{L8${&T^`Sz)*eM&%kQ%| zYSZAN@+vBvVP=Bn2T^6KhBocSAWN_FNAln9(VrOIoD;>6eQoXima69M*FK(8`s4Ls m+Lx&hwlLawiT+wwdY^I4dhRW~4^~@&oZ{)~=d#Wzp$Pzd_MpE2 delta 536 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 ML}f&Zh4g&?AHscvH~;_u delta 11406 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 Vi~l=Y^#wg{Z{$_vN@Pp|{tvdVvQ+>8 From 0170da95552809b5dc7bda58b83efc2709f1f14b Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Thu, 5 Dec 2024 19:41:45 +0100 Subject: [PATCH 163/515] Pause and Effect - Chain conveyor connections are now easier to abort - Fixed various issues with gameplay-related caches not using in-game ticks for invalidation - Fixed stock keeper tooltips rendering below icons --- .../create/compat/trainmap/TrainMapSync.java | 7 +- .../armor/CardboardArmorHandlerClient.java | 7 +- .../ChainConveyorConnectionHandler.java | 18 +++ .../ChainConveyorInteractionHandler.java | 7 +- .../chainConveyor/ChainConveyorPackage.java | 9 +- .../ChainConveyorRidingHandler.java | 2 + .../logistics/AddressEditBoxHelper.java | 7 +- .../LogisticallyLinkedBehaviour.java | 5 +- .../packagerLink/LogisticsManager.java | 12 +- .../stockTicker/StockKeeperRequestScreen.java | 13 +- .../foundation/events/CommonEvents.java | 2 + .../create/foundation/events/InputEvents.java | 8 +- .../foundation/utility/TickBasedCache.java | 136 ++++++++++++++++++ 13 files changed, 189 insertions(+), 44 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/utility/TickBasedCache.java diff --git a/src/main/java/com/simibubi/create/compat/trainmap/TrainMapSync.java b/src/main/java/com/simibubi/create/compat/trainmap/TrainMapSync.java index 2a8f5a0a8f..d58fea1fd1 100644 --- a/src/main/java/com/simibubi/create/compat/trainmap/TrainMapSync.java +++ b/src/main/java/com/simibubi/create/compat/trainmap/TrainMapSync.java @@ -1,13 +1,11 @@ package com.simibubi.create.compat.trainmap; import java.lang.ref.WeakReference; -import java.time.Duration; import java.util.ArrayList; import java.util.List; import java.util.UUID; import com.google.common.cache.Cache; -import com.google.common.cache.CacheBuilder; import com.simibubi.create.AllPackets; import com.simibubi.create.Create; import com.simibubi.create.content.trains.entity.Carriage; @@ -21,6 +19,7 @@ import com.simibubi.create.content.trains.signal.SignalBlock.SignalType; import com.simibubi.create.content.trains.signal.SignalBoundary; import com.simibubi.create.content.trains.signal.SignalEdgeGroup; import com.simibubi.create.content.trains.station.GlobalStation; +import com.simibubi.create.foundation.utility.TickBasedCache; import net.createmod.catnip.utility.Pair; import net.minecraft.network.FriendlyByteBuf; @@ -169,9 +168,7 @@ public class TrainMapSync { } - public static Cache> requestingPlayers = CacheBuilder.newBuilder() - .expireAfterWrite(Duration.ofSeconds(1)) - .build(); + public static Cache> requestingPlayers = new TickBasedCache<>(20, false); public static void requestReceived(ServerPlayer sender) { boolean sendImmediately = requestingPlayers.getIfPresent(sender.getUUID()) == null; diff --git a/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorHandlerClient.java b/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorHandlerClient.java index cd61dee774..a49ffef24f 100644 --- a/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorHandlerClient.java +++ b/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorHandlerClient.java @@ -2,13 +2,12 @@ package com.simibubi.create.content.equipment.armor; import java.util.UUID; import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; import com.google.common.cache.Cache; -import com.google.common.cache.CacheBuilder; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.logistics.box.PackageRenderer; +import com.simibubi.create.foundation.utility.TickBasedCache; import dev.engine_room.flywheel.lib.model.baked.PartialModel; import net.createmod.catnip.utility.AnimationTickHolder; @@ -27,9 +26,7 @@ import net.minecraftforge.fml.common.Mod.EventBusSubscriber; @EventBusSubscriber(value = Dist.CLIENT) public class CardboardArmorHandlerClient { - private static final Cache BOXES_PLAYERS_ARE_HIDING_AS = CacheBuilder.newBuilder() - .expireAfterAccess(1, TimeUnit.SECONDS) - .build(); + private static final Cache BOXES_PLAYERS_ARE_HIDING_AS = new TickBasedCache<>(20, true); @SubscribeEvent public static void keepCacheAliveDesignDespiteNotRendering(PlayerTickEvent event) { diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorConnectionHandler.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorConnectionHandler.java index a3c457eb46..fd5d965572 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorConnectionHandler.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorConnectionHandler.java @@ -43,6 +43,24 @@ public class ChainConveyorConnectionHandler { private static BlockPos firstPos; private static ResourceKey firstDim; + public static boolean onRightClick() { + Minecraft mc = Minecraft.getInstance(); + if (!isChain(mc.player.getMainHandItem())) + return false; + if (firstPos == null) + return false; + boolean missed = false; + if (mc.hitResult instanceof BlockHitResult bhr && bhr.getType() != Type.MISS) + if (!(mc.level.getBlockEntity(bhr.getBlockPos()) instanceof ChainConveyorBlockEntity)) + missed = true; + if (!mc.player.isShiftKeyDown() && !missed) + return false; + firstPos = null; + CreateLang.translate("chain_conveyor.selection_cleared") + .sendStatus(mc.player); + return true; + } + @SubscribeEvent public static void onItemUsedOnBlock(PlayerInteractEvent.RightClickBlock event) { ItemStack itemStack = event.getItemStack(); diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorInteractionHandler.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorInteractionHandler.java index 5bde6488ae..e559057a39 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorInteractionHandler.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorInteractionHandler.java @@ -2,10 +2,8 @@ package com.simibubi.create.content.kinetics.chainConveyor; import java.util.List; import java.util.Map.Entry; -import java.util.concurrent.TimeUnit; import com.google.common.cache.Cache; -import com.google.common.cache.CacheBuilder; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.simibubi.create.AllBlocks; @@ -15,6 +13,7 @@ import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.content.logistics.packagePort.PackagePortTarget; import com.simibubi.create.content.logistics.packagePort.PackagePortTargetSelectionHandler; import com.simibubi.create.foundation.utility.RaycastHelper; +import com.simibubi.create.foundation.utility.TickBasedCache; import net.createmod.catnip.CatnipClient; import net.createmod.catnip.utility.WorldAttached; @@ -37,9 +36,7 @@ import net.minecraftforge.fml.common.Mod.EventBusSubscriber; public class ChainConveyorInteractionHandler { public static WorldAttached>> loadedChains = - new WorldAttached<>($ -> CacheBuilder.newBuilder() - .expireAfterAccess(3, TimeUnit.SECONDS) - .build()); + new WorldAttached<>($ -> new TickBasedCache<>(60, true)); public static BlockPos selectedLift; public static float selectedChainPosition; diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorPackage.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorPackage.java index b7b0015bf5..6ba67be9ad 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorPackage.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorPackage.java @@ -2,11 +2,10 @@ package com.simibubi.create.content.kinetics.chainConveyor; import java.lang.ref.WeakReference; import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import com.google.common.cache.Cache; -import com.google.common.cache.CacheBuilder; +import com.simibubi.create.foundation.utility.TickBasedCache; import net.createmod.catnip.utility.AnimationTickHolder; import net.createmod.catnip.utility.WorldAttached; @@ -24,10 +23,8 @@ public class ChainConveyorPackage { // Client tracks physics data by id so it can travel between BEs private static final int ticksUntilExpired = 30; public static final WorldAttached> physicsDataCache = - new WorldAttached<>($ -> CacheBuilder.newBuilder() - .expireAfterAccess(ticksUntilExpired * 50, TimeUnit.MILLISECONDS) - .build()); - + new WorldAttached<>($ -> new TickBasedCache<>(ticksUntilExpired, true)); + public class ChainConveyorPackagePhysicsData { public Vec3 targetPos; public Vec3 prevTargetPos; diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRidingHandler.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRidingHandler.java index 671088eae6..fbbbf0b5d1 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRidingHandler.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRidingHandler.java @@ -39,6 +39,8 @@ public class ChainConveyorRidingHandler { if (ridingChainConveyor == null) return; Minecraft mc = Minecraft.getInstance(); + if (mc.isPaused()) + return; BlockEntity blockEntity = mc.level.getBlockEntity(ridingChainConveyor); if (mc.player.isShiftKeyDown() || !(blockEntity instanceof ChainConveyorBlockEntity clbe)) { ridingChainConveyor = null; diff --git a/src/main/java/com/simibubi/create/content/logistics/AddressEditBoxHelper.java b/src/main/java/com/simibubi/create/content/logistics/AddressEditBoxHelper.java index 0d4923dc80..1bd4356ae5 100644 --- a/src/main/java/com/simibubi/create/content/logistics/AddressEditBoxHelper.java +++ b/src/main/java/com/simibubi/create/content/logistics/AddressEditBoxHelper.java @@ -5,14 +5,13 @@ import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; -import java.util.concurrent.TimeUnit; import com.google.common.cache.Cache; -import com.google.common.cache.CacheBuilder; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.equipment.clipboard.ClipboardBlockEntity; import com.simibubi.create.content.equipment.clipboard.ClipboardEntry; import com.simibubi.create.content.trains.schedule.DestinationSuggestions; +import com.simibubi.create.foundation.utility.TickBasedCache; import net.createmod.catnip.utility.IntAttached; import net.minecraft.client.Minecraft; @@ -26,9 +25,7 @@ import net.minecraft.world.phys.Vec3; public class AddressEditBoxHelper { - private static Cache> NEARBY_CLIPBOARDS = CacheBuilder.newBuilder() - .expireAfterWrite(1, TimeUnit.SECONDS) - .build(); + private static final Cache> NEARBY_CLIPBOARDS = new TickBasedCache<>(20, false); public static void advertiseClipboard(ClipboardBlockEntity blockEntity) { Minecraft mc = Minecraft.getInstance(); diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java index ab8375eaea..c6851ce9c7 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java @@ -25,6 +25,7 @@ import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BehaviourType; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import com.simibubi.create.foundation.utility.CreateLang; +import com.simibubi.create.foundation.utility.TickBasedCache; import net.createmod.catnip.utility.Pair; import net.minecraft.ChatFormatting; @@ -53,9 +54,7 @@ public class LogisticallyLinkedBehaviour extends BlockEntityBehaviour { } private static final Cache>> LINKS = - CacheBuilder.newBuilder() - .expireAfterAccess(1, TimeUnit.SECONDS) - .build(); + new TickBasedCache<>(20, true); public LogisticallyLinkedBehaviour(SmartBlockEntity be, boolean global) { super(be); diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsManager.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsManager.java index 67e206ed1b..a4473487ad 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsManager.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsManager.java @@ -8,14 +8,12 @@ import java.util.Map.Entry; import java.util.Random; import java.util.UUID; import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; import javax.annotation.Nullable; import org.apache.commons.lang3.mutable.MutableBoolean; import com.google.common.cache.Cache; -import com.google.common.cache.CacheBuilder; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; import com.simibubi.create.content.logistics.BigItemStack; @@ -24,6 +22,7 @@ import com.simibubi.create.content.logistics.packager.PackagerBlockEntity; import com.simibubi.create.content.logistics.packager.PackagingRequest; import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedBehaviour.RequestType; import com.simibubi.create.content.logistics.stockTicker.PackageOrder; +import com.simibubi.create.foundation.utility.TickBasedCache; import net.createmod.catnip.utility.Pair; import net.minecraft.world.item.ItemStack; @@ -33,13 +32,8 @@ public class LogisticsManager { private static Random r = new Random(); - public static final Cache ACCURATE_SUMMARIES = CacheBuilder.newBuilder() - .expireAfterWrite(100, TimeUnit.MILLISECONDS) - .build(); - - public static final Cache SUMMARIES = CacheBuilder.newBuilder() - .expireAfterWrite(1, TimeUnit.SECONDS) - .build(); + public static final Cache ACCURATE_SUMMARIES = new TickBasedCache<>(1, false); + public static final Cache SUMMARIES = new TickBasedCache<>(20, false); public static InventorySummary getSummaryOfNetwork(UUID freqId, boolean accurate) { try { diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperRequestScreen.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperRequestScreen.java index ee273512e3..4d66c9abd6 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperRequestScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperRequestScreen.java @@ -686,6 +686,15 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen hoveredSlot = getHoveredSlot(mouseX, mouseY); + // Render tooltip of hovered item if (hoveredSlot != noneHovered) { int slot = hoveredSlot.getSecond(); @@ -726,8 +735,6 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen= 1000000 ? (count / 1000000) + "m" diff --git a/src/main/java/com/simibubi/create/foundation/events/CommonEvents.java b/src/main/java/com/simibubi/create/foundation/events/CommonEvents.java index d8caba5741..30136e0f7c 100644 --- a/src/main/java/com/simibubi/create/foundation/events/CommonEvents.java +++ b/src/main/java/com/simibubi/create/foundation/events/CommonEvents.java @@ -18,6 +18,7 @@ import com.simibubi.create.content.trains.entity.CarriageEntityHandler; import com.simibubi.create.foundation.ModFilePackResources; import com.simibubi.create.foundation.recipe.RecipeFinder; import com.simibubi.create.foundation.utility.ServerSpeedProvider; +import com.simibubi.create.foundation.utility.TickBasedCache; import com.simibubi.create.infrastructure.command.AllCommands; import net.createmod.catnip.utility.WorldAttached; @@ -71,6 +72,7 @@ public class CommonEvents { Create.RAILWAYS.sync.serverTick(); TrainMapSync.serverTick(event); ServerChainConveyorHandler.tick(); + TickBasedCache.tick(); } @SubscribeEvent diff --git a/src/main/java/com/simibubi/create/foundation/events/InputEvents.java b/src/main/java/com/simibubi/create/foundation/events/InputEvents.java index 50c52ba69f..2d75de0d3c 100644 --- a/src/main/java/com/simibubi/create/foundation/events/InputEvents.java +++ b/src/main/java/com/simibubi/create/foundation/events/InputEvents.java @@ -4,6 +4,7 @@ import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.elevator.ElevatorControlsHandler; import com.simibubi.create.content.contraptions.wrench.RadialWrenchHandler; import com.simibubi.create.content.equipment.toolbox.ToolboxHandlerClient; +import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorConnectionHandler; import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorInteractionHandler; import com.simibubi.create.content.kinetics.chainConveyor.ChainPackageInteractionHandler; import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelConnectionHandler; @@ -81,8 +82,9 @@ public class InputEvents { if (CreateClient.GLUE_HANDLER.onMouseInput(key == mc.options.keyAttack)) event.setCanceled(true); } - - if (key == mc.options.keyUse && FactoryPanelConnectionHandler.onRightClick()) { + + if (key == mc.options.keyUse + && (FactoryPanelConnectionHandler.onRightClick() || ChainConveyorConnectionHandler.onRightClick())) { event.setCanceled(true); return; } @@ -106,7 +108,7 @@ public class InputEvents { event.setCanceled(true); return; } - + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { if (ChainPackageInteractionHandler.onUse()) event.setCanceled(true); diff --git a/src/main/java/com/simibubi/create/foundation/utility/TickBasedCache.java b/src/main/java/com/simibubi/create/foundation/utility/TickBasedCache.java new file mode 100644 index 0000000000..a8b4700592 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/TickBasedCache.java @@ -0,0 +1,136 @@ +package com.simibubi.create.foundation.utility; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.Callable; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.ExecutionException; + +import org.apache.commons.lang3.mutable.MutableInt; + +import com.google.common.cache.Cache; +import com.google.common.cache.CacheStats; +import com.google.common.collect.ImmutableMap; + +public class TickBasedCache implements Cache { + + private static int currentTick = 0; + + public static void tick() { + currentTick++; + } + + // + + private Map timestamps = new HashMap<>(); + private ConcurrentHashMap map = new ConcurrentHashMap<>(); + + private int ticksUntilTimeout; + private boolean resetTimerOnAccess; + + public TickBasedCache(int ticksUntilTimeout, boolean resetTimerOnAccess) { + this.ticksUntilTimeout = ticksUntilTimeout; + this.resetTimerOnAccess = resetTimerOnAccess; + } + + @Override + public V getIfPresent(Object key) { + MutableInt timestamp = timestamps.get(key); + if (timestamp == null) + return null; + if (timestamp.intValue() < currentTick - ticksUntilTimeout) { + timestamps.remove(key); + map.remove(key); + return null; + } + if (resetTimerOnAccess) + timestamp.setValue(currentTick); + return map.get(key); + } + + @Override + public V get(K key, Callable loader) throws ExecutionException { + V ifPresent = getIfPresent(key); + if (ifPresent != null) + return ifPresent; + try { + V entry = loader.call(); + map.put(key, entry); + timestamps.put(key, now()); + return entry; + } catch (Exception e) { + throw new ExecutionException(e); + } + } + + private MutableInt now() { + return new MutableInt(currentTick); + } + + @Override + public ImmutableMap getAllPresent(Iterable keys) { + cleanUp(); + return ImmutableMap.copyOf(map); + } + + @Override + public void put(K key, V value) { + map.put(key, value); + timestamps.put(key, now()); + } + + @Override + public void putAll(Map m) { + m.forEach(this::put); + } + + @Override + public void invalidate(Object key) { + map.remove(key); + timestamps.remove(key); + } + + @Override + public void invalidateAll(Iterable keys) { + keys.forEach(this::invalidate); + } + + @Override + public void invalidateAll() { + map.clear(); + timestamps.clear(); + } + + @Override + public long size() { + cleanUp(); + return timestamps.size(); + } + + @Override + public CacheStats stats() { + return new CacheStats(0, 0, 0, 0, 0, 0); + } + + @Override + public ConcurrentMap asMap() { + return map; + } + + @Override + public void cleanUp() { + Set outdated = new HashSet<>(); + timestamps.forEach((k, v) -> { + if (v.intValue() < currentTick - ticksUntilTimeout) + outdated.add(k); + if (resetTimerOnAccess) + v.setValue(currentTick); + }); + outdated.forEach(map::remove); + outdated.forEach(timestamps::remove); + } + +} From 081fa6f4ae95412eb4d10c195f06017077423eb5 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Thu, 5 Dec 2024 17:13:44 -0500 Subject: [PATCH 164/515] Update catnip --- gradle.properties | 2 +- .../content/schematics/SchematicPrinter.java | 27 ++++++++----------- 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/gradle.properties b/gradle.properties index 68d6d2c99e..91e2530f58 100644 --- a/gradle.properties +++ b/gradle.properties @@ -28,7 +28,7 @@ jei_minecraft_version = 1.20.1 jei_version = 15.10.0.39 curios_minecraft_version = 1.20.1 curios_version = 5.3.1 -catnip_version = 0.8.20 +catnip_version = 0.8.29 ponder_version = 0.8.12 mixin_extras_version = 0.4.1 diff --git a/src/main/java/com/simibubi/create/content/schematics/SchematicPrinter.java b/src/main/java/com/simibubi/create/content/schematics/SchematicPrinter.java index c6605590d0..67b03d7709 100644 --- a/src/main/java/com/simibubi/create/content/schematics/SchematicPrinter.java +++ b/src/main/java/com/simibubi/create/content/schematics/SchematicPrinter.java @@ -178,9 +178,7 @@ public class SchematicPrinter { BlockPos target = getCurrentTarget(); if (printStage == PrintStage.ENTITIES) { - Entity entity = blockReader.getEntityStream() - .collect(Collectors.toList()) - .get(printingEntityIndex); + Entity entity = blockReader.getEntityList().get(printingEntityIndex); entityHandler.handle(target, entity); } else { BlockState blockState = BlockHelper.setZeroAge(blockReader.getBlockState(target)); @@ -241,9 +239,7 @@ public class SchematicPrinter { public ItemRequirement getCurrentRequirement() { if (printStage == PrintStage.ENTITIES) - return ItemRequirement.of(blockReader.getEntityStream() - .collect(Collectors.toList()) - .get(printingEntityIndex)); + return ItemRequirement.of(blockReader.getEntityList().get(printingEntityIndex)); BlockPos target = getCurrentTarget(); BlockState blockState = BlockHelper.setZeroAge(blockReader.getBlockState(target)); @@ -276,19 +272,18 @@ public class SchematicPrinter { } public void markAllEntityRequirements(MaterialChecklist checklist) { - blockReader.getEntityStream() - .forEach(entity -> { - ItemRequirement requirement = ItemRequirement.of(entity); - if (requirement.isEmpty()) - return; - if (requirement.isInvalid()) - return; - checklist.require(requirement); - }); + for (Entity entity : blockReader.getEntityList()) { + ItemRequirement requirement = ItemRequirement.of(entity); + if (requirement.isEmpty()) + return; + if (requirement.isInvalid()) + return; + checklist.require(requirement); + } } public boolean advanceCurrentPos() { - List entities = blockReader.getEntityStream().collect(Collectors.toList()); + List entities = blockReader.getEntityList(); do { if (printStage == PrintStage.BLOCKS) { From 72d720d7d77bda88d7b88633c88db8f73d952cce Mon Sep 17 00:00:00 2001 From: Kryppers <65094918+Kryppers@users.noreply.github.com> Date: Fri, 6 Dec 2024 00:39:57 +0000 Subject: [PATCH 165/515] Windowcleaning Test textures replacement for old factory windows using vanilla tinted glass colours --- .../block/palettes/old_factory_window_1.png | Bin 858 -> 560 bytes .../old_factory_window_1_connected.png | Bin 3966 -> 3065 bytes .../palettes/old_factory_window_1_end.png | Bin 234 -> 316 bytes .../block/palettes/old_factory_window_2.png | Bin 858 -> 560 bytes .../old_factory_window_2_connected.png | Bin 4038 -> 3027 bytes .../palettes/old_factory_window_2_end.png | Bin 234 -> 313 bytes .../block/palettes/old_factory_window_3.png | Bin 858 -> 560 bytes .../old_factory_window_3_connected.png | Bin 3944 -> 2950 bytes .../palettes/old_factory_window_3_end.png | Bin 234 -> 313 bytes .../block/palettes/old_factory_window_4.png | Bin 865 -> 560 bytes .../old_factory_window_4_connected.png | Bin 3966 -> 2953 bytes .../palettes/old_factory_window_4_end.png | Bin 234 -> 316 bytes 12 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/create/textures/block/palettes/old_factory_window_1.png b/src/main/resources/assets/create/textures/block/palettes/old_factory_window_1.png index f1a25bed075aa3960a7bcfa82ba70bb1ec95a20a..0b5e2c77d11338f64c50297a42d4e621247e607b 100644 GIT binary patch delta 514 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 diff --git a/src/main/resources/assets/create/textures/block/palettes/old_factory_window_1_end.png b/src/main/resources/assets/create/textures/block/palettes/old_factory_window_1_end.png index f6cc3536710205b5a98a0229e47bd5a79e192756..b909b6c2403f74dd0da922a45cb7a9b52cd6a69d 100644 GIT binary patch delta 289 zcmaFGxQA(iNx@1WYrnDJyax)kM?B}bgG9*4ca>Rl0hto<%k=+gH z2Vx!e8Z<0p4rA delta 206 zcmV;<05Si(0_p*fB!96y!J}kIrZ{Lz5Gte*d|UGJKfd>qUmfbo3){*7xd4~*iE+|MSzxR~_PceFbzmJ` z+i>j%a)5Et=-Wd@0(gK7K*}N-f7WCRR%99LkcHsO&Z`7(O-B~33@K6vBoizi{Egsu z9wh$*HVnYJSC|00wgK?5VY>GN>R4Ca1P|tDo8W9d?j`6y0aYtJWf0F@aR2}S07*qo IM6N<$g6+^+;{X5v diff --git a/src/main/resources/assets/create/textures/block/palettes/old_factory_window_2.png b/src/main/resources/assets/create/textures/block/palettes/old_factory_window_2.png index f1a25bed075aa3960a7bcfa82ba70bb1ec95a20a..b1f11e8ab367a616fa42e938758497dd646f15fd 100644 GIT binary patch delta 514 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 B#<>6h diff --git a/src/main/resources/assets/create/textures/block/palettes/old_factory_window_2_end.png b/src/main/resources/assets/create/textures/block/palettes/old_factory_window_2_end.png index f6cc3536710205b5a98a0229e47bd5a79e192756..dcdd747682d6042e9fafc8f3233822d1fd5f722d 100644 GIT binary patch delta 286 zcmV+(0pb4Y0l5N@B!32COGiWi{{a60|De66lK=n!32;bRa{vGf6951U69E94oEQKA z00(qQO+^Rj3O2#FRO!VN4bOz5}*jZj%? zsj>ACUV_j$*6nfGRA=UJP;?|%f}K?05du7^EkRUOc1{00J8#p;9AuW6F?G2lzEmK4AUuzBOb*aYa95T koPCWpNU!B=Ul&ZypSWd1`eJX%0{{R307*qoM6N<$f)_DuJ^%m! delta 206 zcmV;<05Si$0_p*fB!96y!J}kIrZ{Lz5Gte*d|UGJKfd>qUmfbo3){*7xd4~*iE+|MSzxR~_PceFbzmJ` z+i>j%a)5Et=-Wd@0(gK7K*}N-f7WCRR%99LkcHsO&Z`7(O-B~33@K6vBoizi{Egsu z9wh$*HVnYJSC|00wgK?5VY>GN>R4Ca1P|tDo8W9d?j`6y0aYtJWf0F@aR2}S07*qo IM6N<$g6n2l-~a#s diff --git a/src/main/resources/assets/create/textures/block/palettes/old_factory_window_3.png b/src/main/resources/assets/create/textures/block/palettes/old_factory_window_3.png index f1a25bed075aa3960a7bcfa82ba70bb1ec95a20a..41d63400e74af1d0cf6e59fa6a68167b734399db 100644 GIT binary patch delta 514 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 PzKr_XcWxKnvO2#FRO!VN4bOz5}*jZj%? zsj>ACUV_j$*6nfGRA=UJP;?|%f}K?05du7^EkRUOc1{00J8#p;9AuW6F?G2lzEmK4AUuzBOb*aYa95T koPCWpNU!B=Ul&ZypSWd1`eJX%0{{R307*qoM6N<$f>l3lg8%>k delta 206 zcmV;<05Si$0_p*fB!96y!J}kIrZ{Lz5Gte*d|UGJKfd>qUmfbo3){*7xd4~*iE+|MSzxR~_PceFbzmJ` z+i>j%a)5Et=-Wd@0(gK7K*}N-f7WCRR%99LkcHsO&Z`7(O-B~33@K6vBoizi{Egsu z9wh$*HVnYJSC|00wgK?5VY>GN>R4Ca1P|tDo8W9d?j`6y0aYtJWf0F@aR2}S07*qo IM6N<$g6n2l-~a#s diff --git a/src/main/resources/assets/create/textures/block/palettes/old_factory_window_4.png b/src/main/resources/assets/create/textures/block/palettes/old_factory_window_4.png index dbbf7718737f8b174ad58262dd1eb1afd540734d..c8917d847c3f1d80fd78ec4997e626f69cd195bf 100644 GIT binary patch delta 514 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 literal 3966 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 diff --git a/src/main/resources/assets/create/textures/block/palettes/old_factory_window_4_end.png b/src/main/resources/assets/create/textures/block/palettes/old_factory_window_4_end.png index f6cc3536710205b5a98a0229e47bd5a79e192756..e22fced31b02644e226e857f19333437c82d4c59 100644 GIT binary patch delta 289 zcmV++0p9-V0lWf`B!32COGiWi{{a60|De66lK=n!32;bRa{vGf6951U69E94oEQKA z00(qQO+^Rj3(R5;6Hl-E=L&%;0-_`<-zz{118z)%n!%&>XO zE(RU}K87zpelqZIu;bSB<0k{dkDm;_K5h&xOV=_mYU`>0SAXW`W%%cmnhsTC%D}*I znvm^G`)1F)`0+CX69WSS1CIb711Xx3^)SJmMS^CS9v+whP(Pn0B>-XJ#Kb@W_(G`x z6uW?Dz+FJSFo325Qh+H+I$$8p07!!S@e`7n7#J8Be0|&)HgB0dlZ4Ea;_Ktaa1oZ7 nzMw@7EP!DAFB)j#JV^2YcLGLRcv_9k00000NkvXXu0mjff4z4h delta 206 zcmV;<05Si(0_p*fB!96y!J}kIrZ{Lz5Gte*d|UGJKfd>qUmfbo3){*7xd4~*iE+|MSzxR~_PceFbzmJ` z+i>j%a)5Et=-Wd@0(gK7K*}N-f7WCRR%99LkcHsO&Z`7(O-B~33@K6vBoizi{Egsu z9wh$*HVnYJSC|00wgK?5VY>GN>R4Ca1P|tDo8W9d?j`6y0aYtJWf0F@aR2}S07*qo IM6N<$g6+^+;{X5v From f5c0df06a806ee47ea2eb491b1eabae3a722fdb9 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 6 Dec 2024 10:11:06 +0100 Subject: [PATCH 166/515] Fix build errors - JEI util classes are only used within the plugin, but must be present for compiling --- build.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index a2cce5cff6..2118bcf1a4 100644 --- a/build.gradle +++ b/build.gradle @@ -260,9 +260,9 @@ dependencies { compileOnly(annotationProcessor("io.github.llamalad7:mixinextras-common:${mixin_extras_version}")) - compileOnly fg.deobf("mezz.jei:jei-${jei_minecraft_version}-common-api:${jei_version}") - compileOnly fg.deobf("mezz.jei:jei-${jei_minecraft_version}-forge-api:${jei_version}") - runtimeOnly fg.deobf("mezz.jei:jei-${jei_minecraft_version}-forge:${jei_version}") + // compileOnly fg.deobf("mezz.jei:jei-${jei_minecraft_version}-common-api:${jei_version}") + // compileOnly fg.deobf("mezz.jei:jei-${jei_minecraft_version}-forge-api:${jei_version}") + implementation fg.deobf("mezz.jei:jei-${jei_minecraft_version}-forge:${jei_version}") compileOnly fg.deobf("top.theillusivec4.curios:curios-forge:${curios_version}+${curios_minecraft_version}:api") runtimeOnly fg.deobf("top.theillusivec4.curios:curios-forge:${curios_version}+${curios_minecraft_version}") From 311c88b1a291ca83ac9e00c0f74909ebd690585d Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 6 Dec 2024 12:34:49 +0100 Subject: [PATCH 167/515] Update catnip --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 91e2530f58..f1f6951b98 100644 --- a/gradle.properties +++ b/gradle.properties @@ -28,7 +28,7 @@ jei_minecraft_version = 1.20.1 jei_version = 15.10.0.39 curios_minecraft_version = 1.20.1 curios_version = 5.3.1 -catnip_version = 0.8.29 +catnip_version = 0.8.30 ponder_version = 0.8.12 mixin_extras_version = 0.4.1 From eec0dc1de31dea699aca5fdedd89e9f39badbc3f Mon Sep 17 00:00:00 2001 From: IThundxr Date: Fri, 6 Dec 2024 17:44:00 -0500 Subject: [PATCH 168/515] Fix potion fluids being rendered with no color --- gradle.properties | 2 +- .../create/content/fluids/drain/ItemDrainRenderer.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/gradle.properties b/gradle.properties index f1f6951b98..0d9a67dd8d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -28,7 +28,7 @@ jei_minecraft_version = 1.20.1 jei_version = 15.10.0.39 curios_minecraft_version = 1.20.1 curios_version = 5.3.1 -catnip_version = 0.8.30 +catnip_version = 0.8.35 ponder_version = 0.8.12 mixin_extras_version = 0.4.1 diff --git a/src/main/java/com/simibubi/create/content/fluids/drain/ItemDrainRenderer.java b/src/main/java/com/simibubi/create/content/fluids/drain/ItemDrainRenderer.java index a174e48c62..501e18c77c 100644 --- a/src/main/java/com/simibubi/create/content/fluids/drain/ItemDrainRenderer.java +++ b/src/main/java/com/simibubi/create/content/fluids/drain/ItemDrainRenderer.java @@ -150,7 +150,7 @@ public class ItemDrainRenderer extends SmartBlockEntityRenderer Date: Fri, 6 Dec 2024 18:59:24 -0500 Subject: [PATCH 169/515] Accessing Internals - Remove unused accesstransformers - Replace LevelRenderer AT's with Accessor's --- .../renderer/SafeBlockEntityRenderer.java | 9 ++++++--- .../mixin/accessor/LevelRendererAccessor.java | 17 +++++++++++++++++ .../resources/META-INF/accesstransformer.cfg | 9 --------- src/main/resources/create.mixins.json | 1 + 4 files changed, 24 insertions(+), 12 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/mixin/accessor/LevelRendererAccessor.java diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/renderer/SafeBlockEntityRenderer.java b/src/main/java/com/simibubi/create/foundation/blockEntity/renderer/SafeBlockEntityRenderer.java index 2a12be7f67..7351196146 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/renderer/SafeBlockEntityRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/renderer/SafeBlockEntityRenderer.java @@ -2,6 +2,8 @@ package com.simibubi.create.foundation.blockEntity.renderer; import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.foundation.mixin.accessor.LevelRendererAccessor; + import net.createmod.ponder.api.level.PonderLevel; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; @@ -34,9 +36,10 @@ public abstract class SafeBlockEntityRenderer implements if (level instanceof PonderLevel) return false; - Frustum frustum = Minecraft.getInstance().levelRenderer.capturedFrustum != null ? - Minecraft.getInstance().levelRenderer.capturedFrustum : - Minecraft.getInstance().levelRenderer.cullingFrustum; + LevelRendererAccessor accessor = (LevelRendererAccessor) Minecraft.getInstance().levelRenderer; + Frustum frustum = accessor.create$getCapturedFrustum() != null ? + accessor.create$getCapturedFrustum() : + accessor.create$getCullingFrustum(); AABB itemBB = new AABB( itemPos.x - 0.25, diff --git a/src/main/java/com/simibubi/create/foundation/mixin/accessor/LevelRendererAccessor.java b/src/main/java/com/simibubi/create/foundation/mixin/accessor/LevelRendererAccessor.java new file mode 100644 index 0000000000..57270d6bff --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/mixin/accessor/LevelRendererAccessor.java @@ -0,0 +1,17 @@ +package com.simibubi.create.foundation.mixin.accessor; + +import net.minecraft.client.renderer.LevelRenderer; + +import net.minecraft.client.renderer.culling.Frustum; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(LevelRenderer.class) +public interface LevelRendererAccessor { + @Accessor("cullingFrustum") + Frustum create$getCullingFrustum(); + + @Accessor("capturedFrustum") + Frustum create$getCapturedFrustum(); +} diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 81d6915d19..dd45123ce9 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -1,17 +1,14 @@ public net.minecraft.client.gui.Font m_92863_(Lnet/minecraft/resources/ResourceLocation;)Lnet/minecraft/client/gui/font/FontSet; # getFontSet public net.minecraft.client.gui.screens.TitleScreen f_96729_ # panorama -public net.minecraft.client.multiplayer.ClientPacketListener f_104897_ # serverChunkRadius protected net.minecraft.client.particle.Particle f_107205_ # stoppedByCollision public net.minecraft.client.renderer.ItemInHandRenderer f_109300_ # mainHandItem public net.minecraft.client.renderer.ItemInHandRenderer f_109301_ # offHandItem -public net.minecraft.client.renderer.entity.ItemRenderer f_115096_ # textureManager public net.minecraft.server.MinecraftServer f_129744_ # storageSource public net.minecraft.server.network.ServerGamePacketListenerImpl f_9737_ # aboveGroundTickCount public net.minecraft.server.network.ServerGamePacketListenerImpl f_9739_ # aboveGroundVehicleTickCount public net.minecraft.world.entity.Entity f_146795_ # removalReason -protected net.minecraft.world.entity.Entity m_19956_(Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/entity/Entity$MoveFunction;)V # positionRider public net.minecraft.world.entity.LivingEntity f_20899_ # jumping public-f net.minecraft.world.item.HoneycombItem f_150863_ # WAXABLES @@ -23,7 +20,6 @@ public net.minecraft.world.item.crafting.RecipeManager f_44007_ # recipes public net.minecraft.world.level.BaseSpawner f_45443_ # spawnPotentials public net.minecraft.world.level.BaseSpawner f_45444_ # nextSpawnData -public net.minecraft.world.level.biome.BiomeManager f_47863_ # biomeZoomSeed public net.minecraft.world.level.block.entity.BeaconBlockEntity f_58648_ # beamSections public net.minecraft.world.level.chunk.HashMapPalette f_62658_ # values public net.minecraft.world.level.chunk.PaletteResize @@ -34,13 +30,8 @@ public net.minecraft.client.model.AgeableListModel f_102007_ # scaleHead public net.minecraft.client.model.AgeableListModel f_170338_ # babyYHeadOffset public net.minecraft.client.model.AgeableListModel f_170339_ # babyZHeadOffset public net.minecraft.client.model.AgeableListModel f_102010_ # babyHeadScale -public net.minecraft.client.model.AgeableListModel f_102011_ # babyBodyScale -public net.minecraft.client.model.AgeableListModel f_102012_ # bodyYOffset public net.minecraft.client.gui.components.CommandSuggestions f_93866_ # suggestions public net.minecraft.client.gui.components.CommandSuggestions$SuggestionsList (Lnet/minecraft/client/gui/components/CommandSuggestions;IIILjava/util/List;Z)V # public-f net.minecraft.data.recipes.RecipeProvider m_6055_()Ljava/lang/String; # getName - -public net.minecraft.client.renderer.LevelRenderer f_172938_ # cullingFrustum -public net.minecraft.client.renderer.LevelRenderer f_109442_ # capturedFrustum diff --git a/src/main/resources/create.mixins.json b/src/main/resources/create.mixins.json index 447aff9543..428ae98b5d 100644 --- a/src/main/resources/create.mixins.json +++ b/src/main/resources/create.mixins.json @@ -34,6 +34,7 @@ "accessor.AgeableListModelAccessor", "accessor.FontAccessor", "accessor.HumanoidArmorLayerAccessor", + "accessor.LevelRendererAccessor", "accessor.MouseHandlerAccessor", "client.BlockDestructionProgressMixin", "client.CameraMixin", From b6455e5d7ce3d652541ce5ecf10c59554dd7e866 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Tue, 10 Dec 2024 18:28:40 +0100 Subject: [PATCH 170/515] Input Scheming - Tweaks to the factory gauge screen --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 6 +- .../resources/assets/create/lang/en_ud.json | 11 +- .../resources/assets/create/lang/en_us.json | 11 +- .../factoryBoard/FactoryPanelBehaviour.java | 9 +- .../FactoryPanelConfigurationPacket.java | 26 ++- .../factoryBoard/FactoryPanelMenu.java | 50 +++++ .../factoryBoard/FactoryPanelRenderer.java | 2 +- .../factoryBoard/FactoryPanelScreen.java | 172 +++++++----------- .../create/foundation/gui/AllGuiTextures.java | 10 +- .../assets/create/lang/default/interface.json | 11 +- .../block/factory_panel_arrows_animated.png | Bin 573 -> 906 bytes .../block/factory_panel_connections.png | Bin 233 -> 489 bytes .../factory_panel_connections_animated.png | Bin 572 -> 906 bytes .../create/textures/gui/factory_gauge.png | Bin 0 -> 2461 bytes 14 files changed, 160 insertions(+), 148 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelMenu.java create mode 100644 src/main/resources/assets/create/textures/gui/factory_gauge.png diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index b48befb2a3..2df4c3ff9b 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-12-05T16:08:22.0352298 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-12-10T17:47:26.9305006 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -640,8 +640,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -a32412bd9acc0409b78d878e7ea4ecd3a49a97d2 assets/create/lang/en_ud.json -8bd05b90f21f54644f72787a7cc44b094c1c40dc assets/create/lang/en_us.json +b0846becbdff1db28265621f9cdf7e1e88bcd0d1 assets/create/lang/en_ud.json +966950f91561bc1883eda230690ee8ca4fe7021e assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index ab767b2ffa..f394fd2798 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -1189,8 +1189,8 @@ "create.gui.config.overlay8": "uoıʇısod ʇןnɐɟǝp ǝɥʇ oʇ ʇǝsǝɹ oʇ", "create.gui.contraptions.network_overstressed": "˙‾ʇɔɐdɯı‾ ‾ssǝɹʇs‾ ɥbıɥ ɐ ɥʇıʍ sʇuǝuodɯoɔ ǝɥʇ ‾uʍop‾ ‾ʍoןs‾ ɹo sǝɔɹnos ǝɹoɯ ppⱯ ˙‾pǝssǝɹʇsɹǝʌo‾ sı uoıʇdɐɹʇuoɔ sıɥʇ ʇɐɥʇ sɹɐǝddɐ ʇI", "create.gui.contraptions.not_fast_enough": "˙‾pǝǝds‾ ‾ɥbnouǝ‾ ɥʇıʍ buıʇɐʇoɹ ‾ʇou‾ sı %1$s sıɥʇ ʇɐɥʇ sɹɐǝddɐ ʇI", - "create.gui.factory_panel.activate_crafting": "buıʇɟɐɹƆ pǝbuɐɹɹɐ-ǝɹd ǝןbbo⟘", - "create.gui.factory_panel.connect_input": "ןǝuɐd ʇnduı uɐ ʇɔǝuuoƆ", + "create.gui.factory_panel.activate_crafting": "buıʇɟɐɹƆ ןɐɔıuɐɥɔǝW ǝs∩", + "create.gui.factory_panel.connect_input": "uoıʇɔǝuuoɔ ʍǝu ppⱯ", "create.gui.factory_panel.crafting_input": "sʇuǝıpǝɹbuI pǝbɐʞɔɐԀ", "create.gui.factory_panel.crafting_input_tip": "pǝʇɔǝuuoɔ oʇuı ǝbɐʞɔɐdu∩", "create.gui.factory_panel.crafting_input_tip_1": ")ƐxƐ( sɹǝʇɟɐɹɔ ןɐɔıuɐɥɔǝɯ", @@ -1212,22 +1212,19 @@ "create.gui.factory_panel.recipe_address_tip_1": "˙ʇno pǝıɹɹɐɔ sı ǝdıɔǝɹ sıɥʇ", "create.gui.factory_panel.recipe_promises_tip": "ǝsıɯoɹd ɐ 'ʇuǝs ǝɹɐ sʇnduı uǝɥM", "create.gui.factory_panel.recipe_promises_tip_1": "˙ǝʌıɹɹɐ sʇndʇno ןıʇun pןǝɥ sı", + "create.gui.factory_panel.reset": "sbuıʇʇǝs ןןɐ ʇǝsǝᴚ", "create.gui.factory_panel.restocker_address": "˙˙˙oʇ sɯǝʇı puǝS", "create.gui.factory_panel.restocker_address_given": "oʇ buıpuǝS", "create.gui.factory_panel.restocker_address_tip": "ןןıʍ ʇɐɥʇ ssǝɹppɐ uɐ ɹǝʇuƎ", "create.gui.factory_panel.restocker_address_tip_1": "˙ǝɹǝɥ ǝʌıɹɹɐ oʇ sǝbɐʞɔɐd ǝsnɐɔ", "create.gui.factory_panel.restocker_promises_tip": "ǝsıɯoɹd ɐ 'ʇuǝs ǝɹɐ sɯǝʇı uǝɥM", "create.gui.factory_panel.restocker_promises_tip_1": "˙ǝʌıɹɹɐ ʎǝɥʇ ןıʇun pןǝɥ sı", + "create.gui.factory_panel.save_and_close": "ǝsoןɔ puɐ ǝʌɐS", "create.gui.factory_panel.scroll_to_change_amount": "ʇunoɯɐ ǝbuɐɥɔ oʇ ןןoɹɔS", "create.gui.factory_panel.send_item": "%1$s puǝS", "create.gui.factory_panel.sending_item": "%1$s buıpuǝS", "create.gui.factory_panel.sending_item_tip": "ןǝʌǝן ʞɔoʇs ןɐɔoן ɹǝʌǝuǝɥʍ", "create.gui.factory_panel.sending_item_tip_1": "ʇunoɯɐ ʇǝbɹɐʇ ǝɥʇ ʍoןǝq sı", - "create.gui.factory_panel.storage_level": "ןǝʌǝן ǝbɐɹoʇS", - "create.gui.factory_panel.storage_level_and_target": "ʇǝbɹɐʇ puɐ ןǝʌǝן ǝbɐɹoʇS", - "create.gui.factory_panel.storage_level_tip": "ʇǝs ǝq uɐɔ ʇunoɯɐ pǝʇǝbɹɐ⟘", - "create.gui.factory_panel.storage_level_tip_1": "ʇoןs ɹǝʇןıɟ ǝɥʇ buısn ʎq", - "create.gui.factory_panel.storage_level_tip_2": "ǝɔɐɟɹǝʇuı sıɥʇ ɟo ǝpısʇno", "create.gui.factory_panel.title_as_recipe": "sbuıʇʇǝS ǝdıɔǝᴚ", "create.gui.factory_panel.title_as_restocker": "sbuıʇʇǝS ɹǝʞɔoʇsǝᴚ", "create.gui.filter.allow_list": "ʇsıꞀ-ʍoןןⱯ", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 447d6dcbc2..7241b62ab7 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1189,8 +1189,8 @@ "create.gui.config.overlay8": "to reset to the default position", "create.gui.contraptions.network_overstressed": "It appears that this contraption is _overstressed_. Add more sources or _slow_ _down_ the components with a high _stress_ _impact_.", "create.gui.contraptions.not_fast_enough": "It appears that this %1$s is _not_ rotating with _enough_ _speed_.", - "create.gui.factory_panel.activate_crafting": "Toggle pre-arranged Crafting", - "create.gui.factory_panel.connect_input": "Connect an input panel", + "create.gui.factory_panel.activate_crafting": "Use Mechanical Crafting", + "create.gui.factory_panel.connect_input": "Add new connection", "create.gui.factory_panel.crafting_input": "Packaged Ingredients", "create.gui.factory_panel.crafting_input_tip": "Unpackage into connected", "create.gui.factory_panel.crafting_input_tip_1": "mechanical crafters (3x3)", @@ -1212,22 +1212,19 @@ "create.gui.factory_panel.recipe_address_tip_1": "this recipe is carried out.", "create.gui.factory_panel.recipe_promises_tip": "When inputs are sent, a promise", "create.gui.factory_panel.recipe_promises_tip_1": "is held until outputs arrive.", + "create.gui.factory_panel.reset": "Reset all settings", "create.gui.factory_panel.restocker_address": "Send items to...", "create.gui.factory_panel.restocker_address_given": "Sending to", "create.gui.factory_panel.restocker_address_tip": "Enter an address that will", "create.gui.factory_panel.restocker_address_tip_1": "cause packages to arrive here.", "create.gui.factory_panel.restocker_promises_tip": "When items are sent, a promise", "create.gui.factory_panel.restocker_promises_tip_1": "is held until they arrive.", + "create.gui.factory_panel.save_and_close": "Save and close", "create.gui.factory_panel.scroll_to_change_amount": "Scroll to change amount", "create.gui.factory_panel.send_item": "Send %1$s", "create.gui.factory_panel.sending_item": "Sending %1$s", "create.gui.factory_panel.sending_item_tip": "whenever local stock level", "create.gui.factory_panel.sending_item_tip_1": "is below the target amount", - "create.gui.factory_panel.storage_level": "Storage level", - "create.gui.factory_panel.storage_level_and_target": "Storage level and target", - "create.gui.factory_panel.storage_level_tip": "Targeted amount can be set", - "create.gui.factory_panel.storage_level_tip_1": "by using the filter slot", - "create.gui.factory_panel.storage_level_tip_2": "outside of this interface", "create.gui.factory_panel.title_as_recipe": "Recipe Settings", "create.gui.factory_panel.title_as_restocker": "Restocker Settings", "create.gui.filter.allow_list": "Allow-List", diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java index 6a2c7be28c..42c80652b9 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java @@ -432,6 +432,11 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { @Override public void destroy() { + disconnectAll(); + super.destroy(); + } + + public void disconnectAll() { FactoryPanelPosition panelPosition = getPanelPosition(); for (FactoryPanelPosition position : targetedBy.keySet()) { FactoryPanelBehaviour source = at(getWorld(), position); @@ -447,8 +452,8 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { target.blockEntity.sendData(); } } - - super.destroy(); + targetedBy.clear(); + targeting.clear(); } public int getUnloadedLinks() { diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConfigurationPacket.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConfigurationPacket.java index 28ce4c8b4b..99d994e5cd 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConfigurationPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConfigurationPacket.java @@ -24,10 +24,12 @@ public class FactoryPanelConfigurationPacket extends BlockEntityConfigurationPac private int promiseClearingInterval; private FactoryPanelPosition removeConnection; private boolean clearPromises; + private boolean reset; public FactoryPanelConfigurationPacket(FactoryPanelPosition position, String address, Map inputAmounts, List craftingArrangement, int outputAmount, - int promiseClearingInterval, @Nullable FactoryPanelPosition removeConnection, boolean clearPromises) { + int promiseClearingInterval, @Nullable FactoryPanelPosition removeConnection, boolean clearPromises, + boolean reset) { super(position.pos()); this.address = address; this.inputAmounts = inputAmounts; @@ -36,6 +38,7 @@ public class FactoryPanelConfigurationPacket extends BlockEntityConfigurationPac this.promiseClearingInterval = promiseClearingInterval; this.removeConnection = removeConnection; this.clearPromises = clearPromises; + this.reset = reset; this.slot = position.slot(); } @@ -61,6 +64,7 @@ public class FactoryPanelConfigurationPacket extends BlockEntityConfigurationPac if (removeConnection != null) removeConnection.send(buffer); buffer.writeBoolean(clearPromises); + buffer.writeBoolean(reset); } @Override @@ -80,6 +84,7 @@ public class FactoryPanelConfigurationPacket extends BlockEntityConfigurationPac if (buffer.readBoolean()) removeConnection = FactoryPanelPosition.receive(buffer); clearPromises = buffer.readBoolean(); + reset = buffer.readBoolean(); } @Override @@ -88,8 +93,21 @@ public class FactoryPanelConfigurationPacket extends BlockEntityConfigurationPac if (behaviour == null) return; - behaviour.recipeAddress = address; + behaviour.recipeAddress = reset ? "" : address; + behaviour.recipeOutput = reset ? 1 : outputAmount; + behaviour.promiseClearingInterval = reset ? -1 : promiseClearingInterval; + behaviour.activeCraftingArrangement = reset ? List.of() : craftingArrangement; + if (reset) { + behaviour.forceClearPromises = true; + behaviour.disconnectAll(); + behaviour.setFilter(ItemStack.EMPTY); + behaviour.count = 0; + be.redraw = true; + be.notifyUpdate(); + return; + } + for (Entry entry : inputAmounts.entrySet()) { FactoryPanelPosition key = entry.getKey(); FactoryPanelConnection connection = behaviour.targetedBy.get(key); @@ -97,10 +115,6 @@ public class FactoryPanelConfigurationPacket extends BlockEntityConfigurationPac connection.amount = entry.getValue(); } - behaviour.recipeOutput = outputAmount; - behaviour.promiseClearingInterval = promiseClearingInterval; - behaviour.activeCraftingArrangement = craftingArrangement; - if (removeConnection != null) { behaviour.targetedBy.remove(removeConnection); FactoryPanelBehaviour source = FactoryPanelBehaviour.at(be.getLevel(), removeConnection); diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelMenu.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelMenu.java new file mode 100644 index 0000000000..77154cd436 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelMenu.java @@ -0,0 +1,50 @@ +package com.simibubi.create.content.logistics.factoryBoard; + +import com.simibubi.create.foundation.gui.menu.GhostItemMenu; + +import net.minecraft.client.Minecraft; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.inventory.MenuType; +import net.minecraftforge.items.ItemStackHandler; +import net.minecraftforge.items.SlotItemHandler; + +public class FactoryPanelMenu extends GhostItemMenu { + + public FactoryPanelMenu(MenuType type, int id, Inventory inv, FriendlyByteBuf extraData) { + super(type, id, inv, extraData); + } + + public FactoryPanelMenu(MenuType type, int id, Inventory inv, FactoryPanelBehaviour contentHolder) { + super(type, id, inv, contentHolder); + } + + @Override + protected ItemStackHandler createGhostInventory() { + ItemStackHandler itemStackHandler = new ItemStackHandler(1); + if (contentHolder != null) + itemStackHandler.setStackInSlot(0, contentHolder.getFilter() + .copyWithCount(1)); + return itemStackHandler; + } + + @Override + protected boolean allowRepeats() { + return true; + } + + @Override + protected FactoryPanelBehaviour createOnClient(FriendlyByteBuf extraData) { + return FactoryPanelBehaviour.at(Minecraft.getInstance().level, FactoryPanelPosition.receive(extraData)); + } + + @Override + protected void addSlots() { + addSlot(new SlotItemHandler(ghostInventory, 0, 16, 24)); + addPlayerSlots(0, 0); + } + + @Override + protected void saveData(FactoryPanelBehaviour contentHolder) {} + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelRenderer.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelRenderer.java index 2d8db4e482..ba7d3cf6b2 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelRenderer.java @@ -90,7 +90,7 @@ public class FactoryPanelRenderer extends SmartBlockEntityRenderer inputConfig; @@ -129,51 +133,59 @@ public class FactoryPanelScreen extends AbstractSimiScreen { @Override protected void init() { - int sizeX = 200; - int sizeY = 75 + middleHeight(); + int sizeX = FACTORY_GAUGE_BOTTOM.getWidth(); + int sizeY = + (restocker ? FACTORY_GAUGE_RESTOCK : FACTORY_GAUGE_RECIPE).getHeight() + FACTORY_GAUGE_BOTTOM.getHeight(); + setWindowSize(sizeX, sizeY); super.init(); clearWidgets(); + int x = guiLeft; int y = guiTop; if (addressBox == null) { - addressBox = new AddressEditBox(this, new NoShadowFontWrapper(font), x + 38, y + 30 + middleHeight(), 110, - 10, false); + addressBox = new AddressEditBox(this, new NoShadowFontWrapper(font), 0, 0, 108, 10, false); addressBox.setValue(behaviour.recipeAddress); addressBox.setTextColor(0x555555); } - addressBox.setX(x + 38); - addressBox.setY(y + 30 + middleHeight()); + addressBox.setX(x + 36); + addressBox.setY(y + windowHeight - 51); addRenderableWidget(addressBox); - confirmButton = new IconButton(x + sizeX - 51, y + sizeY - 22, AllIcons.I_CONFIRM); + confirmButton = new IconButton(x + sizeX - 33, y + sizeY - 25, AllIcons.I_CONFIRM); confirmButton.withCallback(() -> minecraft.setScreen(null)); + confirmButton.setToolTip(CreateLang.translate("gui.factory_panel.save_and_close") + .component()); addRenderableWidget(confirmButton); - promiseExpiration = new ScrollInput(x + 112, y + 54 + middleHeight(), 25, 16).withRange(-1, 31) + deleteButton = new IconButton(x + sizeX - 55, y + sizeY - 25, AllIcons.I_TRASH); + deleteButton.withCallback(() -> { + sendReset = true; + minecraft.setScreen(null); + }); + deleteButton.setToolTip(CreateLang.translate("gui.factory_panel.reset") + .component()); + addRenderableWidget(deleteButton); + + promiseExpiration = new ScrollInput(x + 97, y + windowHeight - 24, 28, 16).withRange(-1, 31) .titled(CreateLang.translate("gui.factory_panel.promises_expire_title") .component()); promiseExpiration.setState(behaviour.promiseClearingInterval); addRenderableWidget(promiseExpiration); - if (!craftingActive && !restocker && behaviour.targetedBy.size() < 9) { - int slot = behaviour.targetedBy.size(); - newInputButton = new IconButton(x + 24 + (slot % 3 * 18), y + 27 + (slot / 3 * 18), AllIcons.I_ADD); - newInputButton.withCallback(() -> { - FactoryPanelConnectionHandler.startConnection(behaviour); - minecraft.setScreen(null); - }); - newInputButton.setToolTip(CreateLang.translate("gui.factory_panel.connect_input") - .component()); - addRenderableWidget(newInputButton); - } + newInputButton = new IconButton(x + (restocker ? 54 : 34), y + (restocker ? 25 : 65), AllIcons.I_ADD); + newInputButton.withCallback(() -> { + FactoryPanelConnectionHandler.startConnection(behaviour); + minecraft.setScreen(null); + }); + newInputButton.setToolTip(CreateLang.translate("gui.factory_panel.connect_input") + .component()); + addRenderableWidget(newInputButton); activateCraftingButton = null; if (availableCraftingRecipe != null) { - int outputX = x + 130; - int outputY = y + 15 + middleHeight() / 2; - activateCraftingButton = new IconButton(outputX + 17, outputY, AllIcons.I_3x3); + activateCraftingButton = new IconButton(x + 34, y + 44, AllIcons.I_3x3); activateCraftingButton.withCallback(() -> { craftingActive = !craftingActive; init(); @@ -186,22 +198,12 @@ public class FactoryPanelScreen extends AbstractSimiScreen { .component()); addRenderableWidget(activateCraftingButton); } - - displayedExtraRows = rowsToDisplay(); - } - - private int rowsToDisplay() { - return craftingActive ? 2 : Math.min((behaviour.targetedBy.size() / 3), 2); - } - - private int middleHeight() { - return AllGuiTextures.FACTORY_PANEL_MIDDLE.getHeight() + rowsToDisplay() * 18; } @Override public void tick() { super.tick(); - if (inputConfig.size() != behaviour.targetedBy.size() || displayedExtraRows != rowsToDisplay()) { + if (inputConfig.size() != behaviour.targetedBy.size()) { updateConfigs(); init(); } @@ -220,32 +222,15 @@ public class FactoryPanelScreen extends AbstractSimiScreen { int y = guiTop; // BG - AllGuiTextures.FACTORY_PANEL_TOP.render(graphics, x, y); - y += AllGuiTextures.FACTORY_PANEL_TOP.getHeight(); - for (int i = 0; i < displayedExtraRows + 1; i++) - AllGuiTextures.FACTORY_PANEL_MIDDLE.render(graphics, x, y + i * 18); - y += middleHeight(); - AllGuiTextures.FACTORY_PANEL_BOTTOM.render(graphics, x, y); - y = guiTop; + AllGuiTextures bg = restocker ? FACTORY_GAUGE_RESTOCK : FACTORY_GAUGE_RECIPE; + bg.render(graphics, x, y); + FACTORY_GAUGE_BOTTOM.render(graphics, x, y + bg.getHeight()); // RECIPE int slot = 0; - int slotsToRender = craftingActive ? 9 : behaviour.targetedBy.size(); - for (int frame : Iterate.zeroAndOne) { - AllGuiTextures sprite = - frame == 0 ? AllGuiTextures.FACTORY_PANEL_SLOT_FRAME : AllGuiTextures.FACTORY_PANEL_SLOT; - for (slot = 0; slot < slotsToRender; slot++) - sprite.render(graphics, x + 23 + frame + (slot % 3 * 18), y + 26 + frame + (slot / 3 * 18)); - if (slot < 9) - sprite.render(graphics, x + 23 + frame + (slot % 3 * 18), y + 26 + frame + (slot / 3 * 18)); - } - - slot = 0; - if (craftingActive) { for (BigItemStack itemStack : craftingIngredients) renderInputItem(graphics, slot++, itemStack, mouseX, mouseY); - } else for (BigItemStack itemStack : inputConfig) renderInputItem(graphics, slot++, itemStack, mouseX, mouseY); @@ -253,14 +238,9 @@ public class FactoryPanelScreen extends AbstractSimiScreen { if (restocker) renderInputItem(graphics, slot, new BigItemStack(behaviour.getFilter(), 1), mouseX, mouseY); - if (inputConfig.size() > 0) { - int arrowOffset = Mth.clamp(slotsToRender, 0, 2); - AllGuiTextures.FACTORY_PANEL_ARROW.render(graphics, x + 75 + arrowOffset * 9, y + 16 + middleHeight() / 2); - int outputX = x + 130; - int outputY = y + 16 + middleHeight() / 2; - if (availableCraftingRecipe != null) - AllGuiTextures.FACTORY_PANEL_SLOT_FRAME.render(graphics, outputX + 16, outputY - 2); - AllGuiTextures.FACTORY_PANEL_SLOT_FRAME.render(graphics, outputX - 2, outputY - 2); + if (!restocker) { + int outputX = x + 141; + int outputY = y + 66; graphics.renderItem(outputConfig.stack, outputX, outputY); graphics.renderItemDecorations(font, behaviour.getFilter(), outputX, outputY, outputConfig.count + ""); @@ -299,41 +279,35 @@ public class FactoryPanelScreen extends AbstractSimiScreen { Component title = CreateLang .translate(restocker ? "gui.factory_panel.title_as_restocker" : "gui.factory_panel.title_as_recipe") .component(); - graphics.drawString(font, title, x + 87 - font.width(title) / 2, y + 7, 0x3D3C48, false); + graphics.drawString(font, title, x + 97 - font.width(title) / 2, y + 4, 0x3D3C48, false); // ITEM PREVIEW + int previewY = restocker ? 10 : 50; + ms.pushPose(); - ms.translate(0, middleHeight() - 25, 0); + ms.translate(0, previewY, 0); GuiGameElement.of(AllBlocks.FACTORY_GAUGE.asStack()) .scale(4) .at(0, 0, -200) - .render(graphics, x + 175, y + 55); + .render(graphics, x + 195, y + 55); if (!behaviour.getFilter() .isEmpty()) { GuiGameElement.of(behaviour.getFilter()) .scale(1.625) .at(0, 0, 100) - .render(graphics, x + 194, y + 68); + .render(graphics, x + 214, y + 68); } - ms.translate(0, 0, 350); - MutableComponent countLabelForValueBox = behaviour.getCountLabelForValueBox(); - graphics.drawString(font, countLabelForValueBox, x + 210 - font.width(countLabelForValueBox) / 2, y + 98, - 0xffffffff); ms.popPose(); - if (mouseX >= x + 190 - 1 && mouseX < x + 190 - 1 + 48 && mouseY >= y + middleHeight() - 25 + 90 - 1 - && mouseY < y + middleHeight() - 25 + 94 - 1 + 26) - showStockLevelTooltip(graphics, mouseX, mouseY); - // PROMISES int state = promiseExpiration.getState(); graphics.drawString(font, CreateLang.text(state == -1 ? " /" : state == 0 ? "30s" : state + "m") .component(), promiseExpiration.getX() + 3, promiseExpiration.getY() + 4, 0xffeeeeee, true); ItemStack asStack = AllItems.CARDBOARD_PACKAGE_12x12.asStack(); - int itemY = y + 54 + middleHeight(); - int itemX = x + 88; + int itemX = x + 68; + int itemY = y + windowHeight - 24; graphics.renderItem(asStack, itemX, itemY); int promised = behaviour.getPromised(); graphics.renderItemDecorations(font, asStack, itemX, itemY, promised + ""); @@ -381,14 +355,14 @@ public class FactoryPanelScreen extends AbstractSimiScreen { // private void renderInputItem(GuiGraphics graphics, int slot, BigItemStack itemStack, int mouseX, int mouseY) { - int inputX = guiLeft + 25 + (slot % 3 * 18); - int inputY = guiTop + 28 + (slot / 3 * 18); + int inputX = guiLeft + (restocker ? 88 : 68 + (slot % 3 * 20)); + int inputY = guiTop + 26 + (slot / 3 * 20); graphics.renderItem(itemStack.stack, inputX, inputY); if (!craftingActive && !restocker && !itemStack.stack.isEmpty()) graphics.renderItemDecorations(font, itemStack.stack, inputX, inputY, itemStack.count + ""); - if (mouseX < inputX - 1 || mouseX >= inputX - 1 + 18 || mouseY < inputY - 1 || mouseY >= inputY - 1 + 18) + if (mouseX < inputX - 2 || mouseX >= inputX - 2 + 20 || mouseY < inputY - 2 || mouseY >= inputY - 2 + 20) return; if (craftingActive) { @@ -450,24 +424,6 @@ public class FactoryPanelScreen extends AbstractSimiScreen { mouseX, mouseY); } - private void showStockLevelTooltip(GuiGraphics graphics, int mouseX, int mouseY) { - graphics.renderComponentTooltip(font, - List.of( - (behaviour.count > 0 ? CreateLang.translate("gui.factory_panel.storage_level_and_target") - : CreateLang.translate("gui.factory_panel.storage_level")).color(ScrollInput.HEADER_RGB) - .component(), - CreateLang.translate("gui.factory_panel.storage_level_tip") - .style(ChatFormatting.GRAY) - .component(), - CreateLang.translate("gui.factory_panel.storage_level_tip_1") - .style(ChatFormatting.GRAY) - .component(), - CreateLang.translate("gui.factory_panel.storage_level_tip_2") - .style(ChatFormatting.GRAY) - .component()), - mouseX, mouseY); - } - private void showAddressBoxTooltip(GuiGraphics graphics, int mouseX, int mouseY) { if (addressBox.getValue() .isBlank()) { @@ -531,8 +487,8 @@ public class FactoryPanelScreen extends AbstractSimiScreen { // Remove connections if (!craftingActive) for (int i = 0; i < connections.size(); i++) { - int inputX = x + 25 + (i % 3 * 18); - int inputY = y + 28 + (i / 3 * 18); + int inputX = x + 68 + (i % 3 * 20); + int inputY = y + 26 + (i / 3 * 20); if (mouseX >= inputX && mouseX < inputX + 16 && mouseY >= inputY && mouseY < inputY + 16) { sendIt(connections.get(i).from, false); return true; @@ -540,8 +496,8 @@ public class FactoryPanelScreen extends AbstractSimiScreen { } // Clear promises - int itemY = y + 54 + middleHeight(); - int itemX = x + 88; + int itemX = x + 103; + int itemY = y + windowHeight - 24; if (mouseX >= itemX && mouseX < itemX + 16 && mouseY >= itemY && mouseY < itemY + 16) { sendIt(null, true); return true; @@ -559,8 +515,8 @@ public class FactoryPanelScreen extends AbstractSimiScreen { return super.mouseScrolled(mouseX, mouseY, pDelta); for (int i = 0; i < inputConfig.size(); i++) { - int inputX = x + 25 + (i % 3 * 18); - int inputY = y + 28 + (i / 3 * 18); + int inputX = x + 68 + (i % 3 * 20); + int inputY = y + 26 + (i / 3 * 20); if (mouseX >= inputX && mouseX < inputX + 16 && mouseY >= inputY && mouseY < inputY + 16) { BigItemStack itemStack = inputConfig.get(i); if (itemStack.stack.isEmpty()) @@ -571,9 +527,9 @@ public class FactoryPanelScreen extends AbstractSimiScreen { } } - if (inputConfig.size() > 0) { - int outputX = x + 130; - int outputY = y + 16 + middleHeight() / 2; + if (!restocker) { + int outputX = x + 141; + int outputY = y + 66; if (mouseX >= outputX && mouseX < outputX + 16 && mouseY >= outputY && mouseY < outputY + 16) { BigItemStack itemStack = outputConfig; itemStack.count = @@ -612,7 +568,7 @@ public class FactoryPanelScreen extends AbstractSimiScreen { String address = addressBox.getValue(); FactoryPanelConfigurationPacket packet = new FactoryPanelConfigurationPacket(pos, address, inputs, - craftingArrangement, outputConfig.count, promiseExp, toRemove, clearPromises); + craftingArrangement, outputConfig.count, promiseExp, toRemove, clearPromises, sendReset); AllPackets.getChannel() .sendToServer(packet); } diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java index f256039b0e..8abd8ecc88 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java @@ -153,13 +153,9 @@ public enum AllGuiTextures implements ScreenElement, TextureSheetSegment { VALUE_SETTINGS_LABEL_BG("value_settings", 0, 31, 81, 11), // HILO - FACTORY_PANEL_TOP("restocker_and_requester", 0, 0, 182, 23), - FACTORY_PANEL_MIDDLE("restocker_and_requester", 0, 23, 182, 26), - FACTORY_PANEL_BOTTOM("restocker_and_requester", 0, 49, 182, 54), - FACTORY_PANEL_SLOT_FRAME("restocker_and_requester", 3, 106, 20, 20), - FACTORY_PANEL_SLOT("restocker_and_requester", 4, 107, 18, 18), - FACTORY_PANEL_ARROW("restocker_and_requester", 27, 108, 22, 16), - FACTORY_PANEL_ARROW_FILLED("restocker_and_requester", 50, 108, 22, 16), + FACTORY_GAUGE_RECIPE("factory_gauge", 32, 4, 192, 95), + FACTORY_GAUGE_RESTOCK("factory_gauge", 32, 109, 192, 55), + FACTORY_GAUGE_BOTTOM("factory_gauge", 32, 174, 200, 57), STOCK_KEEPER_REQUEST_HEADER("stock_keeper", 0, 0, 256, 36), STOCK_KEEPER_REQUEST_BODY("stock_keeper", 0, 48, 256, 20), diff --git a/src/main/resources/assets/create/lang/default/interface.json b/src/main/resources/assets/create/lang/default/interface.json index 5ff689a054..32f92e59eb 100644 --- a/src/main/resources/assets/create/lang/default/interface.json +++ b/src/main/resources/assets/create/lang/default/interface.json @@ -1035,7 +1035,9 @@ "create.gui.factory_panel.title_as_recipe": "Recipe Settings", "create.gui.factory_panel.title_as_restocker": "Restocker Settings", - "create.gui.factory_panel.connect_input": "Connect an input panel", + "create.gui.factory_panel.connect_input": "Add new connection", + "create.gui.factory_panel.reset": "Reset all settings", + "create.gui.factory_panel.save_and_close": "Save and close", "create.gui.factory_panel.no_open_promises": "No open promises", "create.gui.factory_panel.promised_items": "Promised items", "create.gui.factory_panel.left_click_reset": "Left-Click to reset", @@ -1054,11 +1056,6 @@ "create.gui.factory_panel.send_item": "Send %1$s", "create.gui.factory_panel.left_click_disconnect": "Left-Click to disconnect", "create.gui.factory_panel.scroll_to_change_amount": "Scroll to change amount", - "create.gui.factory_panel.storage_level": "Storage level", - "create.gui.factory_panel.storage_level_and_target": "Storage level and target", - "create.gui.factory_panel.storage_level_tip": "Targeted amount can be set", - "create.gui.factory_panel.storage_level_tip_1": "by using the filter slot", - "create.gui.factory_panel.storage_level_tip_2": "outside of this interface", "create.gui.factory_panel.recipe_address": "Send inputs to...", "create.gui.factory_panel.recipe_address_given": "Sending inputs to", "create.gui.factory_panel.recipe_address_tip": "Enter an address where", @@ -1067,7 +1064,7 @@ "create.gui.factory_panel.restocker_address_given": "Sending to", "create.gui.factory_panel.restocker_address_tip": "Enter an address that will", "create.gui.factory_panel.restocker_address_tip_1": "cause packages to arrive here.", - "create.gui.factory_panel.activate_crafting": "Toggle pre-arranged Crafting", + "create.gui.factory_panel.activate_crafting": "Use Mechanical Crafting", "create.gui.factory_panel.crafting_input": "Packaged Ingredients", "create.gui.factory_panel.crafting_input_tip": "Unpackage into connected", "create.gui.factory_panel.crafting_input_tip_1": "mechanical crafters (3x3)", diff --git a/src/main/resources/assets/create/textures/block/factory_panel_arrows_animated.png b/src/main/resources/assets/create/textures/block/factory_panel_arrows_animated.png index b1e4a37c202da45ff128c0eee266ea361076934f..ca91d61b83914866bb5b7c02a0ba962ef0f04747 100644 GIT binary patch literal 906 zcmeAS@N?(olHy`uVBq!ia0vp^0zllr!3-o#y(K{$#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6-A0X`wF4<9}}eE9H*6DOLQnl4?sv})C=ii(P!o}L8@7QBA_dgsoa&!0bE zyLRo}yLY#5-wxDtZRf=MKuVw_$S?RmDqwh^94iTw<1FxqEM{QfI|Ravq8eTeKtZt* z*NBqf{Irtt#G+J&fW*wa5 zP@RF1u>s=(h?yY!SQkLdnFM5m029zuCa}sNOA8{&803<6b6|wRhCu=S+sGoYe zIEHw5ubtXBsab)?MLB?Vz3spM`T6FGQ{t}PdTltl%lfR+d6y-pLQE|Rrb;DUeQ+Q& z>kx1AW24{*1p__PB~vCgNxN`_=ry~~GkyK;V$BjUotFy_88A6<-3j7gEnXwo<>TFR zS}2^u^5_n`B`HTVRQ{Fp3l%N8WVz@9($FIE@>#u)*Z4(hc+a@pktPwxI zuvE9RT+RL&%S*VAHNO{k^1J_0g#XI)t2ftvbf}G-8*Bgg;`f9Pn?!k>zrOQ)g0)rL)mh1 zuVv=4f4^91@V}Ei`-!sLw>-mgAfdSDpmTQ4lZB?=`1seCikemau-j1mdit}*s~2^4 z+px_~mb<3E_Pe3JMf`!qU+w-ke100U|H02I>dVg^u1PDE3y#{q<=*v;XOk<|*W1OL zRaVShX~6UJVLJ1(2xgl34Hd%F6$ JtaD0e0sybjT8#hz delta 518 zcmV+h0{Q)l2fYN4L4O-iOjJex|Nq6s#oOE4b#-;1prB@EX8HN~v$L}R003SmUXTC) z010$bPE-H?|NsC0|Nj6}Pk0gl000SaNLh0L01m?d01m?e$8V@)0004&NklS?_Aw%phbZMDheIz0}@q=`!?1&VQxQ)+AW#X4a-ahvFWA za9WyzHih)+qNkgom4a+E`qs=!U4}tuwl2$IN<+&6r}apI9tkLT3Zz=G&f^sNX<_oJ z3%*MBN8xKcf`z~O%tMu+7Wycs%vvCjM}2|E4#ar`)A~0LUnTn?TmpKR$Eo~?V3Uw6 z@hBYg9p*eLApkwL6miWX%11aYO+kAuB-?r5N#7nAjyn9j zY%iXd0D=S*lt8w9#v_EeKUgt7UcsK6<2OCoARUy#Xd2rf$JhalNMB~9@RKkEe{}(-RAyZHSrCCR2hPhpxmt4Mt9C6@r zeSbv6fk#T5a)gj3!P!59m}ZVQ#AR9RL6T07*qo IM6N<$f(VWE-~a#s diff --git a/src/main/resources/assets/create/textures/block/factory_panel_connections.png b/src/main/resources/assets/create/textures/block/factory_panel_connections.png index 8d7417bcbf5b4bfc8783d8e0a4ff47580c3a5631..ccd8c1c6b41ddb2af1aba486a5e3c2678f430605 100644 GIT binary patch literal 489 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G|s0G|-o6DLme^z<|}HC?)NY1OJ#6%`c=7Ayct3cQzT0#Y0$L4LviA%Njt z^WI3H7-xY;WHAE+-+mBgv|tTZ0SbzhxJHx&=ckpFCl;kL1SDqWmFW4ohA5co8Gdj6 zJ{hQDOKOB?ny0500|$`9${@wa%D@O@c>%FBlnwHO1|u_AoC(M_WMpFC1JY4IoY~F- z7S8~(L10-KBf|@zS79`Yl?*_M3G56kKy?O2#s-WFAZCK>V_g6-XA+PN0!%X6s4hbT1CVT0=MI(BjltPKW{RhaV~9p@Xdffr0R;|b?ztcS%dc1M4o*^zdm_^N zqSJe~!>T~GB@CqnG3Sjgd_8$tA={ckcvA#0T4~z9%6^ZFf0?>WSgu{X_4N_RZckS~mvv4FO#nt#fIt8M delta 176 zcmaFK{E~5kV?BR>Pl)U7+qX+gOBXCykd~Ilz`($<@M1iWVl4^s3;quT48OPW1p@^* z3p^r=85sBufG}g$wN6f;V34PaV~9p@YhNRmgCYm>^DqDR|2!+2_+bIFC%^1Mfu~tt z>{yC9HZXkXkkdKec5QayqF>_8a#OYz_?vE=sGw=|$ZBC0*LUp$8Vip039PKYr#@@7 ZUBpkOUipO!YJkQwc)I$ztaD0e0szAoMb-cS diff --git a/src/main/resources/assets/create/textures/block/factory_panel_connections_animated.png b/src/main/resources/assets/create/textures/block/factory_panel_connections_animated.png index 8c0d2ce47b5537b7802f9fbace387735cec8d827..ca91d61b83914866bb5b7c02a0ba962ef0f04747 100644 GIT binary patch literal 906 zcmeAS@N?(olHy`uVBq!ia0vp^0zllr!3-o#y(K{$#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6-A0X`wF4<9}}eE9H*6DOLQnl4?sv})C=ii(P!o}L8@7QBA_dgsoa&!0bE zyLRo}yLY#5-wxDtZRf=MKuVw_$S?RmDqwh^94iTw<1FxqEM{QfI|Ravq8eTeKtZt* z*NBqf{Irtt#G+J&fW*wa5 zP@RF1u>s=(h?yY!SQkLdnFM5m029zuCa}sNOA8{&803<6b6|wRhCu=S+sGoYe zIEHw5ubtXBsab)?MLB?Vz3spM`T6FGQ{t}PdTltl%lfR+d6y-pLQE|Rrb;DUeQ+Q& z>kx1AW24{*1p__PB~vCgNxN`_=ry~~GkyK;V$BjUotFy_88A6<-3j7gEnXwo<>TFR zS}2^u^5_n`B`HTVRQ{Fp3l%N8WVz@9($FIE@>#u)*Z4(hc+a@pktPwxI zuvE9RT+RL&%S*VAHNO{k^1J_0g#XI)t2ftvbf}G-8*Bgg;`f9Pn?!k>zrOQ)g0)rL)mh1 zuVv=4f4^91@V}Ei`-!sLw>-mgAfdSDpmTQ4lZB?=`1seCikemau-j1mdit}*s~2^4 z+px_~mb<3E_Pe3JMf`!qU+w-ke100U|H02I>dVg^u1PDE3y#{q<=*v;XOk<|*W1OL zRaVShX~6UJVLJ1(2xgl34Hd%F6$ JtaD0e0sybjT8#hz delta 517 zcmV+g0{Z=m2fPH3L4O-iOjJex|Nq6s#oOE4b#-;1prB@EX8HN~v$L}R003SmUXTC) z010$bPE-H?|NsC0|Nj6}Pk0gl000SaNLh0L01m?d01m?e$8V@)0004%Nkls@V|8HDUWWM9Ebm(sf~-2%N>a(^k*H3?d~s@5qmp}5b$ zbVgc&Hih(Rv8RWkiJ%&TxmHyv%LoWn*JU{@sc2c?vK}SSqW}djfl@2>d0fIgZOpRb zg71?3QTQ2;VBxPm^Drmy!W?#FdVxS5-R@z+(H3M+ozL(6KZeNomtQ6BFl>>-%yNQZO+id~nR4*LctkgeK45kA{{7 z8*{k>sbWRF1Y*TLk4uKxlXVU+jqwG6gGOWmbLWadls^eG~GG1CQ(P zN6a|zNQG045K;^V!wtu@10H_TA>8}FWf$L53l@6$J?;Gg${Q@P)v{7@00000NkvXX Hu0mjfB#Q6G diff --git a/src/main/resources/assets/create/textures/gui/factory_gauge.png b/src/main/resources/assets/create/textures/gui/factory_gauge.png new file mode 100644 index 0000000000000000000000000000000000000000..3a9d6770e1c5cb43c9f1e5ad4e050c5b5afed884 GIT binary patch literal 2461 zcmai02~ZPh7XG`_4I$x3j2t2&LW$uHVB}bi1``m)7`X)Gh;j=eXc$m*Xpl=#K~X_L zjDW}yITVytfe;sT)+;-r;>qC!DkY34s8P0~GgCFSQ?-B9tM}gbj{o)R|MlN{_&iTF ziY^5JpysuL;{yOhh!7x?2o^66^iyctd_3Jj(=EL*LP28OR=WYvT11s^KnXpL@9oDW z`1$L@KOd-Zc3Kg=EjKTCwZPdSc_mi0Q?NI5)k+KN_L8KY`r@0H>&6Ez9gJS<&9XRK zw7F$p{Os(kP$;ysvnwnt92pr|?`StO^VWqqr?0Qi-`_tvI=cKsV|8`)nKNf^#%aSVlR%HUs~As@xtI5dz#0C6s3O-@ZP;{+m@Wz zHM^W=DwmN>e$50b_3!I5ujTbG@|SHUJy<`I588e)gk@(V5A0?IzNN|;>@Y+=-y${D z5Nv26jOKf!}qc=Yn?a*5!^N zpR;KAcyg5;+u}vbUnH(ReIKc0ax1^TuWQF^bk$6caQI~ZwUaCF^>)dk}aGLFF zz+R?OJ(T~CFMRl#KyKw2JK-5}#vN>aX z0)5vJax$!PpO0j({<)~2xjVvd)iRHL5Tqo&H4~i--a0<@Y|QV%{o4`kyo5t=N#wX? zh3DGQR@V|1GGsGwG?u`d5GH&>qPZ>wQZv0c!s~2F-(!j@g$=07PX8P>GH$g*=Crl+bidOZ81oA zwsD7%QcIYK1! z*aUKxu(3^eKPU(0T{?6F6Ium6R&J^{>)ca2oY)`>b59@Al?l4)rPA`nWkgkAn{Q5( z-6|Hn30ziNW)K1maJz;q>%xR5+x8FzmTDx5Xidbs4{sw{kA|AD0d+>2K^e^$7VL1D zyob-TY#~%9lv-!Q;+s{oj#pz?N_f2^&fh@w_{9Y!CB0we^TwpI;DwM(=pY$7<{b0!sVTB%}_C^TVL^?snWo zO_ZUbY5Gmvw`b;CnQPEXSG3;&xD5Lr@~@2Pc`k`-d=GZ4!NNy44kA^=M(K5eP*beH)^^q`*D};EWz%l=R7E?k`sdq5^mvYNcPRoCNz6PNeM8%B3&}Q z2wXiH>!xG=5uHf53TF1-L#^O0WohI4Bl4L=FiokDj9oW`Ig*Xgi9Gr9pRI?oUSLMx z#n*q^4qiHkUq7`+AeY2G**w#W_k`yHr@@Ox&(bsGXZ4luGbYNby5#|`X;61!9keoW Date: Tue, 10 Dec 2024 16:07:34 -0500 Subject: [PATCH 171/515] Happy little mistakes - Fix typo in better end compat recipe --- .../b256105d8411632b0d585496ea8944a751a08034 | 30 +++++++++---------- ...clium_path.json => end_mycelium_path.json} | 4 +-- .../data/recipe/PressingRecipeGen.java | 2 +- 3 files changed, 18 insertions(+), 18 deletions(-) rename src/generated/resources/data/create/recipes/pressing/compat/betterendforge/{end_myclium_path.json => end_mycelium_path.json} (68%) diff --git a/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 b/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 index 4d079592c9..fc0bf1cf7b 100644 --- a/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 +++ b/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 @@ -1,4 +1,4 @@ -// 1.20.1 2024-11-08T15:43:24.6478256 Create's Processing Recipes +// 1.20.1 2024-12-10T16:06:18.900023688 Create's Processing Recipes 3c94326fb730f68c1e44fe1e2ef09c9db6ffd92b data/create/recipes/compacting/andesite_from_flint.json 8d3d5b31f3601b9f681ff710e0545a483a1494c6 data/create/recipes/compacting/blaze_cake.json 8bd7f4e3a686ab520b2d55594d2018d0e9a50c91 data/create/recipes/compacting/chocolate.json @@ -97,18 +97,18 @@ df364151c75a7d84446b2c6213e339115bc9d298 data/create/recipes/crushing/diorite_re 9e89294e53a94a05af47948c21ad192ef18f7710 data/create/recipes/crushing/emerald_ore.json 9c3989fd9e72e21353803f475a08b8f199717c1f data/create/recipes/crushing/gilded_blackstone.json 3c4c78e3a7137022f8f6e90324af6c8f97050e80 data/create/recipes/crushing/glowstone.json -95b76da439260151355fff74b3b7398ce13d6968 data/create/recipes/crushing/golden_horse_armor.json b036b1654d2deec20aca95ff43b60c7d0b28b2fc data/create/recipes/crushing/gold_ore.json +95b76da439260151355fff74b3b7398ce13d6968 data/create/recipes/crushing/golden_horse_armor.json cc939ba59b95db1c7a034df6f9e656772074a5fd data/create/recipes/crushing/gravel.json 17ab2d789c9c2df122b6a96ab06bbe2c02592a93 data/create/recipes/crushing/iron_horse_armor.json c9a47b29ba75ba29c8cb630fe32c4bf2f1f1d1ae data/create/recipes/crushing/iron_ore.json 855b6655dea911724ee68d07b993f17440ac422e data/create/recipes/crushing/lapis_ore.json 492827ab3d55ca3edfef5eb006b1f77d62e1b446 data/create/recipes/crushing/lead_ore.json e170bc17a796c73a05d2d77a85c086cfaac55c31 data/create/recipes/crushing/leather_horse_armor.json -606ccdf3119a62ab461028192d191ffb10332e21 data/create/recipes/crushing/netherrack.json 07e8991a2161aab4dd73bb74900fd0c70aad2847 data/create/recipes/crushing/nether_gold_ore.json c7c0d94707c2858a87d01cff6b284d7fb85acdbe data/create/recipes/crushing/nether_quartz_ore.json 0380b9416b263de2ee6a6cd1f4064df2e243c047 data/create/recipes/crushing/nether_wart_block.json +606ccdf3119a62ab461028192d191ffb10332e21 data/create/recipes/crushing/netherrack.json d3534d606382ec7c1d34275c5f069543d0955906 data/create/recipes/crushing/nickel_ore.json 66f75530e30d8572bdbf4696a32edc5a7850ac00 data/create/recipes/crushing/obsidian.json 17cacb19493b9bbe7236b19a2a50a817c449a915 data/create/recipes/crushing/ochrum.json @@ -666,42 +666,42 @@ ddb27a32c1b01812db7cc317c962e35d794dae88 data/create/recipes/cutting/warped_hyph 7a01147d3c7d8fb9acb870b33e5a792328f88c3c data/create/recipes/deploying/cogwheel.json 1230f449873262e79585752d3430e5f7f383bcb2 data/create/recipes/deploying/large_cogwheel.json dc35369da8514a5650704fd39e84861cce084b5d data/create/recipes/deploying/waxed_copper_block_from_adding_wax.json -7b7d596cdaa4000222177b405c04c6e8906561b4 data/create/recipes/deploying/waxed_copper_shingles_from_adding_wax.json afbe0c612651ee90651ee7b39683c8baac2a115e data/create/recipes/deploying/waxed_copper_shingle_slab_from_adding_wax.json 66cd83c15d46692f27deaac280ef782bb2bd7909 data/create/recipes/deploying/waxed_copper_shingle_stairs_from_adding_wax.json -bcb9750b7c3504996d6177d5980128af018942a8 data/create/recipes/deploying/waxed_copper_tiles_from_adding_wax.json +7b7d596cdaa4000222177b405c04c6e8906561b4 data/create/recipes/deploying/waxed_copper_shingles_from_adding_wax.json eecd6194b0efc2bee321ba7fac7348cd3f5911ab data/create/recipes/deploying/waxed_copper_tile_slab_from_adding_wax.json dfc1f8f6b0d1b6d23c9125c97eba31dadc370904 data/create/recipes/deploying/waxed_copper_tile_stairs_from_adding_wax.json +bcb9750b7c3504996d6177d5980128af018942a8 data/create/recipes/deploying/waxed_copper_tiles_from_adding_wax.json e260cded2b746bd79afaaa1e086cf2f0faffde76 data/create/recipes/deploying/waxed_cut_copper_from_adding_wax.json 33e338242aff64f9d52169392d2eb8e617b8da5c data/create/recipes/deploying/waxed_cut_copper_slab_from_adding_wax.json 5f4671548b18634ae440d7c64c4c97e5e533601b data/create/recipes/deploying/waxed_cut_copper_stairs_from_adding_wax.json ff182d5c0c4b832ff566691d9b680c9039c55c16 data/create/recipes/deploying/waxed_exposed_copper_from_adding_wax.json -eff2e77f004873e695e419afc71a7011328d3de8 data/create/recipes/deploying/waxed_exposed_copper_shingles_from_adding_wax.json 5a7a622d5b340f83ba2d32fe53620744c5193a32 data/create/recipes/deploying/waxed_exposed_copper_shingle_slab_from_adding_wax.json b895ef423e64936b5d94ee54a6527316ed48d9d6 data/create/recipes/deploying/waxed_exposed_copper_shingle_stairs_from_adding_wax.json -9d566e599cc05aefde637faab1957813a5b6f3f7 data/create/recipes/deploying/waxed_exposed_copper_tiles_from_adding_wax.json +eff2e77f004873e695e419afc71a7011328d3de8 data/create/recipes/deploying/waxed_exposed_copper_shingles_from_adding_wax.json 582083e0fed8760cde2c53aa2b02237eb59a3df0 data/create/recipes/deploying/waxed_exposed_copper_tile_slab_from_adding_wax.json fec9d744770bfc517a72a2be45701aab6f3040b2 data/create/recipes/deploying/waxed_exposed_copper_tile_stairs_from_adding_wax.json +9d566e599cc05aefde637faab1957813a5b6f3f7 data/create/recipes/deploying/waxed_exposed_copper_tiles_from_adding_wax.json 0f18c91f36e3abae99a7dca72f3d80e59f03cf7d data/create/recipes/deploying/waxed_exposed_cut_copper_from_adding_wax.json 7ed36f4f3abfd37aec13a273b87d97c8ccc36cb4 data/create/recipes/deploying/waxed_exposed_cut_copper_slab_from_adding_wax.json 9cd5a6c71b5102ef2660e8a5c650cbd2c2327580 data/create/recipes/deploying/waxed_exposed_cut_copper_stairs_from_adding_wax.json 97b7b3f65807328d0a036cb66ee53d898504da77 data/create/recipes/deploying/waxed_oxidized_copper_from_adding_wax.json -bd37d658666b2912c07b6daa6adaff99a479223a data/create/recipes/deploying/waxed_oxidized_copper_shingles_from_adding_wax.json 07c82e555617f9d9166f2d2c9068ac421eb0b37a data/create/recipes/deploying/waxed_oxidized_copper_shingle_slab_from_adding_wax.json d0c7805681e3ed6a6bc5775d42c702af924e8785 data/create/recipes/deploying/waxed_oxidized_copper_shingle_stairs_from_adding_wax.json -41c879946a24ff330466476bdee9148859398842 data/create/recipes/deploying/waxed_oxidized_copper_tiles_from_adding_wax.json +bd37d658666b2912c07b6daa6adaff99a479223a data/create/recipes/deploying/waxed_oxidized_copper_shingles_from_adding_wax.json af72234311a9abf5c57c767c05274c466dceac53 data/create/recipes/deploying/waxed_oxidized_copper_tile_slab_from_adding_wax.json b35d22f891d1c9cab4340399e3426c96132b3fc7 data/create/recipes/deploying/waxed_oxidized_copper_tile_stairs_from_adding_wax.json +41c879946a24ff330466476bdee9148859398842 data/create/recipes/deploying/waxed_oxidized_copper_tiles_from_adding_wax.json 9d78f4d16273015d181be586f91e77f3b82ee18f data/create/recipes/deploying/waxed_oxidized_cut_copper_from_adding_wax.json 2a9c57a8ca9b013b7bc11d2588d4ba00b402f97f data/create/recipes/deploying/waxed_oxidized_cut_copper_slab_from_adding_wax.json 5670c074c0f1961a5e499953a49c7e3f1f617ebf data/create/recipes/deploying/waxed_oxidized_cut_copper_stairs_from_adding_wax.json 58679c5c37eaa5a52ef9e0f4f7cc695c58ddee96 data/create/recipes/deploying/waxed_weathered_copper_from_adding_wax.json -5817055c1cf3ae572ffbe2765f3e519fda4c3342 data/create/recipes/deploying/waxed_weathered_copper_shingles_from_adding_wax.json e962429c48ed12bb2d7b299719513c23a2088879 data/create/recipes/deploying/waxed_weathered_copper_shingle_slab_from_adding_wax.json 2321ea4ed39d09b12a80be8df2c7c1dc4c6d2c18 data/create/recipes/deploying/waxed_weathered_copper_shingle_stairs_from_adding_wax.json -b635490492a22f88e24003bffb09c4d5e3fa2d61 data/create/recipes/deploying/waxed_weathered_copper_tiles_from_adding_wax.json +5817055c1cf3ae572ffbe2765f3e519fda4c3342 data/create/recipes/deploying/waxed_weathered_copper_shingles_from_adding_wax.json d0fc937a3e7ae42fb1891b7b87adb2b57292e01d data/create/recipes/deploying/waxed_weathered_copper_tile_slab_from_adding_wax.json 6852ea4c7f27520fb3388ec641be4cb94d907199 data/create/recipes/deploying/waxed_weathered_copper_tile_stairs_from_adding_wax.json +b635490492a22f88e24003bffb09c4d5e3fa2d61 data/create/recipes/deploying/waxed_weathered_copper_tiles_from_adding_wax.json 9ab3ba5847c3abbc17c476436978141f2c039ce9 data/create/recipes/deploying/waxed_weathered_cut_copper_from_adding_wax.json 733dd94b46186c19fdecced5d8231e46ea612cf2 data/create/recipes/deploying/waxed_weathered_cut_copper_slab_from_adding_wax.json cd4c050e6ad9227bf293768f2d8b965c0ecafeab data/create/recipes/deploying/waxed_weathered_cut_copper_stairs_from_adding_wax.json @@ -724,8 +724,8 @@ ff16c74f09edbc67ed969f64270ca376bb8ea955 data/create/recipes/filling/compat/regi 12c19b46eec5bd371300dfcff5d2a9dd7169bb1b data/create/recipes/filling/glowstone.json afeb566e5f989c58d239a2f66084ce3d813d111a data/create/recipes/filling/grass_block.json 36d0f06ea9fa065ed85fc596e08725a2e6c8d4af data/create/recipes/filling/gunpowder.json -c07c662c2ba8d7e5c72437096acfd7fdb99704f3 data/create/recipes/filling/honeyed_apple.json c4e0373516bc98def80d0a13803cf980e3f905e0 data/create/recipes/filling/honey_bottle.json +c07c662c2ba8d7e5c72437096acfd7fdb99704f3 data/create/recipes/filling/honeyed_apple.json 3acf4a649751c23c8e39d649131939659c105a53 data/create/recipes/filling/redstone.json deab6ea169b756376d89ea2200e0387a865ed2fc data/create/recipes/filling/sweet_roll.json 788cce637f455ea33408e5be5b75ce0e4cc57c95 data/create/recipes/haunting/blackstone.json @@ -871,8 +871,8 @@ eb9606bbb2e4c6fb82b6607c8d5c23834d9e44a8 data/create/recipes/milling/compat/byg/ fda00f49b9a5758ee7d24f2aeab81a3cc690544a data/create/recipes/milling/compat/byg/yellow_tulip.json 2e6a7a1b0e8ab1d6e514a30a21d47b404cfdcd45 data/create/recipes/milling/compat/druidcraft/lavender.json 5be32cdd48cf7d9e3f8273fc3479d559070b9872 data/create/recipes/milling/compat/environmental/bird_of_paradise.json -102130e75ea8f2b8c99ad9641d293a4e588912cf data/create/recipes/milling/compat/environmental/bluebell.json 50df88584dd6086c0dbb23fb16b7f36fee381534 data/create/recipes/milling/compat/environmental/blue_delphinium.json +102130e75ea8f2b8c99ad9641d293a4e588912cf data/create/recipes/milling/compat/environmental/bluebell.json a4beb691042be811eee8a130ff023065620b20b9 data/create/recipes/milling/compat/environmental/cartwheel.json d1d388667f9c8a5666cc2a1ef2eb77716a0b18ed data/create/recipes/milling/compat/environmental/dianthus.json ee3d1989d4a1069909aaeb99374602d0e92d6dfc data/create/recipes/milling/compat/environmental/magenta_hibiscus.json @@ -990,7 +990,7 @@ ac2a2456e2f0ccd74db6dc5ad029eb4e6781a25d data/create/recipes/mixing/honey.json e715dd1d3961de8a817ddcd6a1c411761966e57e data/create/recipes/pressing/compat/betterendforge/chorus_nylium_path.json 29a514bea64e7e3f7fe04c2d19749d174b4e42b3 data/create/recipes/pressing/compat/betterendforge/crystal_moss_path.json 7b377ce79e3e32a7b3fece940fb0b234d255e3fe data/create/recipes/pressing/compat/betterendforge/end_moss_path.json -17c68db229cef447679eeba25da1fe7de17be50d data/create/recipes/pressing/compat/betterendforge/end_myclium_path.json +e4df3cd1f80b62382ea0941c3dde030c67dba03f data/create/recipes/pressing/compat/betterendforge/end_mycelium_path.json fb6d54e0ee3c8831060a8573d16814217888ae0e data/create/recipes/pressing/compat/betterendforge/jungle_moss_path.json 77dbbdd01f36f1ede5018bc1feb3dff960988129 data/create/recipes/pressing/compat/betterendforge/pink_moss_path.json 200b0a7f459b4c5f5bd7d6fe46ad1959923b9cb0 data/create/recipes/pressing/compat/betterendforge/shadow_grass_path.json @@ -1069,11 +1069,11 @@ cccf4ef0891992687dcb7ce5c644499d93210b8a data/create/recipes/splashing/sand.json 0ee6d52e8966b6189f2841bcdf41417df1ab072c data/create/recipes/splashing/stained_glass.json f241ec6a8ad063b28281c18e1fbb03c482d7af8b data/create/recipes/splashing/stained_glass_pane.json 712b367223067cc468346d2fa485779f1501d5ec data/create/recipes/splashing/supplementaries/blackboard.json +a8fd822419fbb47b37412742fe13a785ae147d21 data/create/recipes/splashing/the_vault/ornate_chain_rusty.json 43bcc2f22cca830f11a48f4b48f699001f4ffbb5 data/create/recipes/splashing/thermal/crushed_raw_lead.json 4bc875e07f963f417e0a427ca7a6f9f9a40213ac data/create/recipes/splashing/thermal/crushed_raw_nickel.json 0ceeb253b478dde532e4de01d1ff60ed09819388 data/create/recipes/splashing/thermal/crushed_raw_silver.json 5fa818c04cb65048be0246ade3946cc1e01a0772 data/create/recipes/splashing/thermal/crushed_raw_tin.json -a8fd822419fbb47b37412742fe13a785ae147d21 data/create/recipes/splashing/the_vault/ornate_chain_rusty.json 23d70b869e50a1e11df264f3640becac4ec9100d data/create/recipes/splashing/wheat_flour.json a883796342143a5f2b5bc68d230b725964abdb8f data/create/recipes/splashing/white_concrete_powder.json d09bcaa2334e05e6cce37b7342c7de84ce954bb9 data/create/recipes/splashing/wool.json diff --git a/src/generated/resources/data/create/recipes/pressing/compat/betterendforge/end_myclium_path.json b/src/generated/resources/data/create/recipes/pressing/compat/betterendforge/end_mycelium_path.json similarity index 68% rename from src/generated/resources/data/create/recipes/pressing/compat/betterendforge/end_myclium_path.json rename to src/generated/resources/data/create/recipes/pressing/compat/betterendforge/end_mycelium_path.json index 744bdef32a..ed24b21116 100644 --- a/src/generated/resources/data/create/recipes/pressing/compat/betterendforge/end_myclium_path.json +++ b/src/generated/resources/data/create/recipes/pressing/compat/betterendforge/end_mycelium_path.json @@ -8,12 +8,12 @@ ], "ingredients": [ { - "item": "betterendforge:end_myclium" + "item": "betterendforge:end_mycelium" } ], "results": [ { - "item": "betterendforge:end_myclium_path" + "item": "betterendforge:end_mycelium_path" } ] } \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/PressingRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/PressingRecipeGen.java index 61edc14726..b51b41c9b3 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/PressingRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/PressingRecipeGen.java @@ -35,7 +35,7 @@ public class PressingRecipeGen extends ProcessingRecipeGen { // Better End Forge BEF = moddedPaths(Mods.BEF, "amber_moss", "cave_moss", "chorus_nylium", "crystal_moss", - "end_moss", "end_myclium", "jungle_moss", "pink_moss", "shadow_grass"), + "end_moss", "end_mycelium", "jungle_moss", "pink_moss", "shadow_grass"), // Environmental ENV_MYCELIUM = create("compat/environmental/mycelium_path", b -> b.require(Blocks.MYCELIUM) .output(Mods.ENV, "mycelium_path") From 7a9870ed9281cafefc85662bceb39612c2af68df Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Wed, 11 Dec 2024 11:48:45 +0100 Subject: [PATCH 172/515] Bug hunt - Right click removes stock keeper jei slots - Fixed a train map issue - Fixed drawer integration with stock tickers - Fixed client and server using the same link cache - Fixed repackager emitting empty packages --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 6 ++-- .../b256105d8411632b0d585496ea8944a751a08034 | 28 +++++++++--------- .../resources/assets/create/lang/en_ud.json | 4 +-- .../resources/assets/create/lang/en_us.json | 4 +-- .../compat/trainmap/FTBChunksTrainMap.java | 9 ++++-- .../compat/trainmap/TrainMapManager.java | 15 ++++++---- .../factoryBoard/FactoryPanelModel.java | 8 ++--- .../logistics/packager/InventorySummary.java | 3 ++ .../packager/PackageDefragmenter.java | 12 ++++++-- .../packager/PackagerBlockEntity.java | 10 +++++-- .../LogisticallyLinkedBehaviour.java | 29 +++++++++++-------- .../LogisticallyLinkedClientHandler.java | 2 +- .../stockTicker/StockKeeperRequestScreen.java | 6 +++- .../stockTicker/StockTickerBlockEntity.java | 16 ++++++---- .../foundation/events/ClientEvents.java | 2 ++ .../foundation/utility/TickBasedCache.java | 26 +++++++++++++---- .../assets/create/lang/default/interface.json | 4 +-- 17 files changed, 119 insertions(+), 65 deletions(-) diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 2df4c3ff9b..a5e82fa559 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-12-10T17:47:26.9305006 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-12-11T11:40:56.5489573 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -640,8 +640,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -b0846becbdff1db28265621f9cdf7e1e88bcd0d1 assets/create/lang/en_ud.json -966950f91561bc1883eda230690ee8ca4fe7021e assets/create/lang/en_us.json +3608bc5c03238eed54df85df9b76e6149cbb6219 assets/create/lang/en_ud.json +bd16815584184efb990402b2936f3a531dc6a1d2 assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json diff --git a/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 b/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 index fc0bf1cf7b..fef88f8bc8 100644 --- a/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 +++ b/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 @@ -1,4 +1,4 @@ -// 1.20.1 2024-12-10T16:06:18.900023688 Create's Processing Recipes +// 1.20.1 2024-12-11T11:42:35.0350518 Create's Processing Recipes 3c94326fb730f68c1e44fe1e2ef09c9db6ffd92b data/create/recipes/compacting/andesite_from_flint.json 8d3d5b31f3601b9f681ff710e0545a483a1494c6 data/create/recipes/compacting/blaze_cake.json 8bd7f4e3a686ab520b2d55594d2018d0e9a50c91 data/create/recipes/compacting/chocolate.json @@ -97,18 +97,18 @@ df364151c75a7d84446b2c6213e339115bc9d298 data/create/recipes/crushing/diorite_re 9e89294e53a94a05af47948c21ad192ef18f7710 data/create/recipes/crushing/emerald_ore.json 9c3989fd9e72e21353803f475a08b8f199717c1f data/create/recipes/crushing/gilded_blackstone.json 3c4c78e3a7137022f8f6e90324af6c8f97050e80 data/create/recipes/crushing/glowstone.json -b036b1654d2deec20aca95ff43b60c7d0b28b2fc data/create/recipes/crushing/gold_ore.json 95b76da439260151355fff74b3b7398ce13d6968 data/create/recipes/crushing/golden_horse_armor.json +b036b1654d2deec20aca95ff43b60c7d0b28b2fc data/create/recipes/crushing/gold_ore.json cc939ba59b95db1c7a034df6f9e656772074a5fd data/create/recipes/crushing/gravel.json 17ab2d789c9c2df122b6a96ab06bbe2c02592a93 data/create/recipes/crushing/iron_horse_armor.json c9a47b29ba75ba29c8cb630fe32c4bf2f1f1d1ae data/create/recipes/crushing/iron_ore.json 855b6655dea911724ee68d07b993f17440ac422e data/create/recipes/crushing/lapis_ore.json 492827ab3d55ca3edfef5eb006b1f77d62e1b446 data/create/recipes/crushing/lead_ore.json e170bc17a796c73a05d2d77a85c086cfaac55c31 data/create/recipes/crushing/leather_horse_armor.json +606ccdf3119a62ab461028192d191ffb10332e21 data/create/recipes/crushing/netherrack.json 07e8991a2161aab4dd73bb74900fd0c70aad2847 data/create/recipes/crushing/nether_gold_ore.json c7c0d94707c2858a87d01cff6b284d7fb85acdbe data/create/recipes/crushing/nether_quartz_ore.json 0380b9416b263de2ee6a6cd1f4064df2e243c047 data/create/recipes/crushing/nether_wart_block.json -606ccdf3119a62ab461028192d191ffb10332e21 data/create/recipes/crushing/netherrack.json d3534d606382ec7c1d34275c5f069543d0955906 data/create/recipes/crushing/nickel_ore.json 66f75530e30d8572bdbf4696a32edc5a7850ac00 data/create/recipes/crushing/obsidian.json 17cacb19493b9bbe7236b19a2a50a817c449a915 data/create/recipes/crushing/ochrum.json @@ -666,42 +666,42 @@ ddb27a32c1b01812db7cc317c962e35d794dae88 data/create/recipes/cutting/warped_hyph 7a01147d3c7d8fb9acb870b33e5a792328f88c3c data/create/recipes/deploying/cogwheel.json 1230f449873262e79585752d3430e5f7f383bcb2 data/create/recipes/deploying/large_cogwheel.json dc35369da8514a5650704fd39e84861cce084b5d data/create/recipes/deploying/waxed_copper_block_from_adding_wax.json +7b7d596cdaa4000222177b405c04c6e8906561b4 data/create/recipes/deploying/waxed_copper_shingles_from_adding_wax.json afbe0c612651ee90651ee7b39683c8baac2a115e data/create/recipes/deploying/waxed_copper_shingle_slab_from_adding_wax.json 66cd83c15d46692f27deaac280ef782bb2bd7909 data/create/recipes/deploying/waxed_copper_shingle_stairs_from_adding_wax.json -7b7d596cdaa4000222177b405c04c6e8906561b4 data/create/recipes/deploying/waxed_copper_shingles_from_adding_wax.json +bcb9750b7c3504996d6177d5980128af018942a8 data/create/recipes/deploying/waxed_copper_tiles_from_adding_wax.json eecd6194b0efc2bee321ba7fac7348cd3f5911ab data/create/recipes/deploying/waxed_copper_tile_slab_from_adding_wax.json dfc1f8f6b0d1b6d23c9125c97eba31dadc370904 data/create/recipes/deploying/waxed_copper_tile_stairs_from_adding_wax.json -bcb9750b7c3504996d6177d5980128af018942a8 data/create/recipes/deploying/waxed_copper_tiles_from_adding_wax.json e260cded2b746bd79afaaa1e086cf2f0faffde76 data/create/recipes/deploying/waxed_cut_copper_from_adding_wax.json 33e338242aff64f9d52169392d2eb8e617b8da5c data/create/recipes/deploying/waxed_cut_copper_slab_from_adding_wax.json 5f4671548b18634ae440d7c64c4c97e5e533601b data/create/recipes/deploying/waxed_cut_copper_stairs_from_adding_wax.json ff182d5c0c4b832ff566691d9b680c9039c55c16 data/create/recipes/deploying/waxed_exposed_copper_from_adding_wax.json +eff2e77f004873e695e419afc71a7011328d3de8 data/create/recipes/deploying/waxed_exposed_copper_shingles_from_adding_wax.json 5a7a622d5b340f83ba2d32fe53620744c5193a32 data/create/recipes/deploying/waxed_exposed_copper_shingle_slab_from_adding_wax.json b895ef423e64936b5d94ee54a6527316ed48d9d6 data/create/recipes/deploying/waxed_exposed_copper_shingle_stairs_from_adding_wax.json -eff2e77f004873e695e419afc71a7011328d3de8 data/create/recipes/deploying/waxed_exposed_copper_shingles_from_adding_wax.json +9d566e599cc05aefde637faab1957813a5b6f3f7 data/create/recipes/deploying/waxed_exposed_copper_tiles_from_adding_wax.json 582083e0fed8760cde2c53aa2b02237eb59a3df0 data/create/recipes/deploying/waxed_exposed_copper_tile_slab_from_adding_wax.json fec9d744770bfc517a72a2be45701aab6f3040b2 data/create/recipes/deploying/waxed_exposed_copper_tile_stairs_from_adding_wax.json -9d566e599cc05aefde637faab1957813a5b6f3f7 data/create/recipes/deploying/waxed_exposed_copper_tiles_from_adding_wax.json 0f18c91f36e3abae99a7dca72f3d80e59f03cf7d data/create/recipes/deploying/waxed_exposed_cut_copper_from_adding_wax.json 7ed36f4f3abfd37aec13a273b87d97c8ccc36cb4 data/create/recipes/deploying/waxed_exposed_cut_copper_slab_from_adding_wax.json 9cd5a6c71b5102ef2660e8a5c650cbd2c2327580 data/create/recipes/deploying/waxed_exposed_cut_copper_stairs_from_adding_wax.json 97b7b3f65807328d0a036cb66ee53d898504da77 data/create/recipes/deploying/waxed_oxidized_copper_from_adding_wax.json +bd37d658666b2912c07b6daa6adaff99a479223a data/create/recipes/deploying/waxed_oxidized_copper_shingles_from_adding_wax.json 07c82e555617f9d9166f2d2c9068ac421eb0b37a data/create/recipes/deploying/waxed_oxidized_copper_shingle_slab_from_adding_wax.json d0c7805681e3ed6a6bc5775d42c702af924e8785 data/create/recipes/deploying/waxed_oxidized_copper_shingle_stairs_from_adding_wax.json -bd37d658666b2912c07b6daa6adaff99a479223a data/create/recipes/deploying/waxed_oxidized_copper_shingles_from_adding_wax.json +41c879946a24ff330466476bdee9148859398842 data/create/recipes/deploying/waxed_oxidized_copper_tiles_from_adding_wax.json af72234311a9abf5c57c767c05274c466dceac53 data/create/recipes/deploying/waxed_oxidized_copper_tile_slab_from_adding_wax.json b35d22f891d1c9cab4340399e3426c96132b3fc7 data/create/recipes/deploying/waxed_oxidized_copper_tile_stairs_from_adding_wax.json -41c879946a24ff330466476bdee9148859398842 data/create/recipes/deploying/waxed_oxidized_copper_tiles_from_adding_wax.json 9d78f4d16273015d181be586f91e77f3b82ee18f data/create/recipes/deploying/waxed_oxidized_cut_copper_from_adding_wax.json 2a9c57a8ca9b013b7bc11d2588d4ba00b402f97f data/create/recipes/deploying/waxed_oxidized_cut_copper_slab_from_adding_wax.json 5670c074c0f1961a5e499953a49c7e3f1f617ebf data/create/recipes/deploying/waxed_oxidized_cut_copper_stairs_from_adding_wax.json 58679c5c37eaa5a52ef9e0f4f7cc695c58ddee96 data/create/recipes/deploying/waxed_weathered_copper_from_adding_wax.json +5817055c1cf3ae572ffbe2765f3e519fda4c3342 data/create/recipes/deploying/waxed_weathered_copper_shingles_from_adding_wax.json e962429c48ed12bb2d7b299719513c23a2088879 data/create/recipes/deploying/waxed_weathered_copper_shingle_slab_from_adding_wax.json 2321ea4ed39d09b12a80be8df2c7c1dc4c6d2c18 data/create/recipes/deploying/waxed_weathered_copper_shingle_stairs_from_adding_wax.json -5817055c1cf3ae572ffbe2765f3e519fda4c3342 data/create/recipes/deploying/waxed_weathered_copper_shingles_from_adding_wax.json +b635490492a22f88e24003bffb09c4d5e3fa2d61 data/create/recipes/deploying/waxed_weathered_copper_tiles_from_adding_wax.json d0fc937a3e7ae42fb1891b7b87adb2b57292e01d data/create/recipes/deploying/waxed_weathered_copper_tile_slab_from_adding_wax.json 6852ea4c7f27520fb3388ec641be4cb94d907199 data/create/recipes/deploying/waxed_weathered_copper_tile_stairs_from_adding_wax.json -b635490492a22f88e24003bffb09c4d5e3fa2d61 data/create/recipes/deploying/waxed_weathered_copper_tiles_from_adding_wax.json 9ab3ba5847c3abbc17c476436978141f2c039ce9 data/create/recipes/deploying/waxed_weathered_cut_copper_from_adding_wax.json 733dd94b46186c19fdecced5d8231e46ea612cf2 data/create/recipes/deploying/waxed_weathered_cut_copper_slab_from_adding_wax.json cd4c050e6ad9227bf293768f2d8b965c0ecafeab data/create/recipes/deploying/waxed_weathered_cut_copper_stairs_from_adding_wax.json @@ -724,8 +724,8 @@ ff16c74f09edbc67ed969f64270ca376bb8ea955 data/create/recipes/filling/compat/regi 12c19b46eec5bd371300dfcff5d2a9dd7169bb1b data/create/recipes/filling/glowstone.json afeb566e5f989c58d239a2f66084ce3d813d111a data/create/recipes/filling/grass_block.json 36d0f06ea9fa065ed85fc596e08725a2e6c8d4af data/create/recipes/filling/gunpowder.json -c4e0373516bc98def80d0a13803cf980e3f905e0 data/create/recipes/filling/honey_bottle.json c07c662c2ba8d7e5c72437096acfd7fdb99704f3 data/create/recipes/filling/honeyed_apple.json +c4e0373516bc98def80d0a13803cf980e3f905e0 data/create/recipes/filling/honey_bottle.json 3acf4a649751c23c8e39d649131939659c105a53 data/create/recipes/filling/redstone.json deab6ea169b756376d89ea2200e0387a865ed2fc data/create/recipes/filling/sweet_roll.json 788cce637f455ea33408e5be5b75ce0e4cc57c95 data/create/recipes/haunting/blackstone.json @@ -871,8 +871,8 @@ eb9606bbb2e4c6fb82b6607c8d5c23834d9e44a8 data/create/recipes/milling/compat/byg/ fda00f49b9a5758ee7d24f2aeab81a3cc690544a data/create/recipes/milling/compat/byg/yellow_tulip.json 2e6a7a1b0e8ab1d6e514a30a21d47b404cfdcd45 data/create/recipes/milling/compat/druidcraft/lavender.json 5be32cdd48cf7d9e3f8273fc3479d559070b9872 data/create/recipes/milling/compat/environmental/bird_of_paradise.json -50df88584dd6086c0dbb23fb16b7f36fee381534 data/create/recipes/milling/compat/environmental/blue_delphinium.json 102130e75ea8f2b8c99ad9641d293a4e588912cf data/create/recipes/milling/compat/environmental/bluebell.json +50df88584dd6086c0dbb23fb16b7f36fee381534 data/create/recipes/milling/compat/environmental/blue_delphinium.json a4beb691042be811eee8a130ff023065620b20b9 data/create/recipes/milling/compat/environmental/cartwheel.json d1d388667f9c8a5666cc2a1ef2eb77716a0b18ed data/create/recipes/milling/compat/environmental/dianthus.json ee3d1989d4a1069909aaeb99374602d0e92d6dfc data/create/recipes/milling/compat/environmental/magenta_hibiscus.json @@ -1069,11 +1069,11 @@ cccf4ef0891992687dcb7ce5c644499d93210b8a data/create/recipes/splashing/sand.json 0ee6d52e8966b6189f2841bcdf41417df1ab072c data/create/recipes/splashing/stained_glass.json f241ec6a8ad063b28281c18e1fbb03c482d7af8b data/create/recipes/splashing/stained_glass_pane.json 712b367223067cc468346d2fa485779f1501d5ec data/create/recipes/splashing/supplementaries/blackboard.json -a8fd822419fbb47b37412742fe13a785ae147d21 data/create/recipes/splashing/the_vault/ornate_chain_rusty.json 43bcc2f22cca830f11a48f4b48f699001f4ffbb5 data/create/recipes/splashing/thermal/crushed_raw_lead.json 4bc875e07f963f417e0a427ca7a6f9f9a40213ac data/create/recipes/splashing/thermal/crushed_raw_nickel.json 0ceeb253b478dde532e4de01d1ff60ed09819388 data/create/recipes/splashing/thermal/crushed_raw_silver.json 5fa818c04cb65048be0246ade3946cc1e01a0772 data/create/recipes/splashing/thermal/crushed_raw_tin.json +a8fd822419fbb47b37412742fe13a785ae147d21 data/create/recipes/splashing/the_vault/ornate_chain_rusty.json 23d70b869e50a1e11df264f3640becac4ec9100d data/create/recipes/splashing/wheat_flour.json a883796342143a5f2b5bc68d230b725964abdb8f data/create/recipes/splashing/white_concrete_powder.json d09bcaa2334e05e6cce37b7342c7de84ce954bb9 data/create/recipes/splashing/wool.json diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index f394fd2798..ed6cc2c862 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -1208,8 +1208,8 @@ "create.gui.factory_panel.promises_expire_title": "ɹǝʇɟɐ ǝɹıdxǝ sǝsıɯoɹԀ", "create.gui.factory_panel.recipe_address": "˙˙˙oʇ sʇnduı puǝS", "create.gui.factory_panel.recipe_address_given": "oʇ sʇnduı buıpuǝS", - "create.gui.factory_panel.recipe_address_tip": "ǝɹǝɥʍ ssǝɹppɐ uɐ ɹǝʇuƎ", - "create.gui.factory_panel.recipe_address_tip_1": "˙ʇno pǝıɹɹɐɔ sı ǝdıɔǝɹ sıɥʇ", + "create.gui.factory_panel.recipe_address_tip": "ǝɹǝɥʍ ssǝɹppɐ ǝɥʇ ɹǝʇuƎ", + "create.gui.factory_panel.recipe_address_tip_1": "˙pǝʇɟɐɹɔ sı ǝdıɔǝɹ sıɥʇ", "create.gui.factory_panel.recipe_promises_tip": "ǝsıɯoɹd ɐ 'ʇuǝs ǝɹɐ sʇnduı uǝɥM", "create.gui.factory_panel.recipe_promises_tip_1": "˙ǝʌıɹɹɐ sʇndʇno ןıʇun pןǝɥ sı", "create.gui.factory_panel.reset": "sbuıʇʇǝs ןןɐ ʇǝsǝᴚ", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 7241b62ab7..db133fcf13 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1208,8 +1208,8 @@ "create.gui.factory_panel.promises_expire_title": "Promises expire after", "create.gui.factory_panel.recipe_address": "Send inputs to...", "create.gui.factory_panel.recipe_address_given": "Sending inputs to", - "create.gui.factory_panel.recipe_address_tip": "Enter an address where", - "create.gui.factory_panel.recipe_address_tip_1": "this recipe is carried out.", + "create.gui.factory_panel.recipe_address_tip": "Enter the address where", + "create.gui.factory_panel.recipe_address_tip_1": "this recipe is crafted.", "create.gui.factory_panel.recipe_promises_tip": "When inputs are sent, a promise", "create.gui.factory_panel.recipe_promises_tip_1": "is held until outputs arrive.", "create.gui.factory_panel.reset": "Reset all settings", diff --git a/src/main/java/com/simibubi/create/compat/trainmap/FTBChunksTrainMap.java b/src/main/java/com/simibubi/create/compat/trainmap/FTBChunksTrainMap.java index dad6921fc3..a1285a3d9f 100644 --- a/src/main/java/com/simibubi/create/compat/trainmap/FTBChunksTrainMap.java +++ b/src/main/java/com/simibubi/create/compat/trainmap/FTBChunksTrainMap.java @@ -31,14 +31,17 @@ public class FTBChunksTrainMap { public static void tick() { if (cancelTooltips > 0) cancelTooltips--; - if (!AllConfigs.client().showTrainMapOverlay.get() - || getAsLargeMapScreen(Minecraft.getInstance().screen) == null) { + + LargeMapScreen mapScreen = getAsLargeMapScreen(Minecraft.getInstance().screen); + + if (!AllConfigs.client().showTrainMapOverlay.get() || mapScreen == null) { if (requesting) TrainMapSyncClient.stopRequesting(); requesting = false; return; } - TrainMapManager.tick(); + + TrainMapManager.tick(mapScreen.currentDimension()); requesting = true; TrainMapSyncClient.requestData(); } diff --git a/src/main/java/com/simibubi/create/compat/trainmap/TrainMapManager.java b/src/main/java/com/simibubi/create/compat/trainmap/TrainMapManager.java index 1d138b7467..76f19b08e2 100644 --- a/src/main/java/com/simibubi/create/compat/trainmap/TrainMapManager.java +++ b/src/main/java/com/simibubi/create/compat/trainmap/TrainMapManager.java @@ -48,18 +48,21 @@ import net.minecraft.world.phys.Vec3; public class TrainMapManager { public static void tick() { + tick(Minecraft.getInstance().level.dimension()); + } + + public static void tick(ResourceKey dimension) { TrainMapRenderer map = TrainMapRenderer.INSTANCE; - if (map.trackingVersion != CreateClient.RAILWAYS.version - || map.trackingDim != Minecraft.getInstance().level.dimension() + if (map.trackingVersion != CreateClient.RAILWAYS.version || map.trackingDim != dimension || map.trackingTheme != AllConfigs.client().trainMapColorTheme.get()) { - redrawAll(); + redrawAll(dimension); } } public static List renderAndPick(GuiGraphics graphics, int mouseX, int mouseY, float pt, boolean linearFiltering, Rect2i bounds) { Object hoveredElement = null; - + int offScreenMargin = 32; bounds.setX(bounds.getX() - offScreenMargin); bounds.setY(bounds.getY() - offScreenMargin); @@ -444,10 +447,10 @@ public class TrainMapManager { static final int PHASE_STRAIGHTS = 1; static final int PHASE_CURVES = 2; - public static void redrawAll() { + public static void redrawAll(ResourceKey dimension) { TrainMapRenderer map = TrainMapRenderer.INSTANCE; map.trackingVersion = CreateClient.RAILWAYS.version; - map.trackingDim = Minecraft.getInstance().level.dimension(); + map.trackingDim = dimension; map.trackingTheme = AllConfigs.client().trainMapColorTheme.get(); map.startDrawing(); diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelModel.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelModel.java index e25af4c6bc..3f6e78e798 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelModel.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelModel.java @@ -76,13 +76,13 @@ public class FactoryPanelModel extends BakedModelWrapperWithData { List quadsToAdd = factoryPanel.get() .getQuads(state, null, rand, data, RenderType.solid()); + float xRot = Mth.RAD_TO_DEG * FactoryPanelBlock.getXRot(state); + float yRot = Mth.RAD_TO_DEG * FactoryPanelBlock.getYRot(state); + for (BakedQuad bakedQuad : quadsToAdd) { int[] vertices = bakedQuad.getVertices(); int[] transformedVertices = Arrays.copyOf(vertices, vertices.length); - - float xRot = Mth.RAD_TO_DEG * FactoryPanelBlock.getXRot(state); - float yRot = Mth.RAD_TO_DEG * FactoryPanelBlock.getYRot(state); - + for (int i = 0; i < vertices.length / BakedQuadHelper.VERTEX_STRIDE; i++) { Vec3 vertex = BakedQuadHelper.getXYZ(vertices, i); vertex = vertex.add(slot.xOffset * .5, 0, slot.yOffset * .5); diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/InventorySummary.java b/src/main/java/com/simibubi/create/content/logistics/packager/InventorySummary.java index 2e8c9e8b76..6128ccb90d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/InventorySummary.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/InventorySummary.java @@ -74,6 +74,9 @@ public class InventorySummary { return; } } + + if (stack.getCount() > stack.getMaxStackSize()) + stack = stack.copyWithCount(1); BigItemStack newEntry = new BigItemStack(stack, count); stacks.add(newEntry); diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackageDefragmenter.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackageDefragmenter.java index bbdfeae5bd..5d35669bd0 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackageDefragmenter.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackageDefragmenter.java @@ -77,7 +77,8 @@ public class PackageDefragmenter { } } - List orderedStacks = orderContext == null ? Collections.emptyList() : new ArrayList<>(orderContext.stacks()); + List orderedStacks = + orderContext == null ? Collections.emptyList() : new ArrayList<>(orderContext.stacks()); List outputSlots = new ArrayList<>(); Repack: while (true) { @@ -127,11 +128,16 @@ public class PackageDefragmenter { currentSlot = 0; } - exportingPackages.add(PackageItem.containing(target)); + for (int slot = 0; slot < target.getSlots(); slot++) + if (!target.getStackInSlot(slot) + .isEmpty()) { + exportingPackages.add(PackageItem.containing(target)); + break; + } for (ItemStack box : exportingPackages) PackageItem.addAddress(box, address); - + if (!exportingPackages.isEmpty()) PackageItem.addOrderContext(exportingPackages.get(0), orderContext); diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java index 0faafecc9f..e6fe125974 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java @@ -6,6 +6,8 @@ import java.util.List; import java.util.Set; import java.util.UUID; +import org.jetbrains.annotations.NotNull; + import com.simibubi.create.AllBlocks; import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.actors.psi.PortableStorageInterfaceBlockEntity; @@ -144,8 +146,12 @@ public class PackagerBlockEntity extends SmartBlockEntity { return availableItems; } - for (int slot = 0; slot < targetInv.getSlots(); slot++) - availableItems.add(targetInv.getStackInSlot(slot)); + for (int slot = 0; slot < targetInv.getSlots(); slot++) { + int slotLimit = targetInv.getSlotLimit(slot); + @NotNull + ItemStack extractItem = targetInv.extractItem(slot, slotLimit, true); + availableItems.add(extractItem); + } invVersionTracker.awaitNewVersion(targetInventory.getInventory()); submitNewArrivals(this.availableItems, availableItems); diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java index c6851ce9c7..ddf40f7310 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java @@ -6,7 +6,6 @@ import java.util.Collections; import java.util.LinkedList; import java.util.UUID; import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Stream; @@ -15,7 +14,6 @@ import javax.annotation.Nullable; import org.apache.commons.lang3.mutable.MutableBoolean; import com.google.common.cache.Cache; -import com.google.common.cache.CacheBuilder; import com.simibubi.create.Create; import com.simibubi.create.content.logistics.packager.InventorySummary; import com.simibubi.create.content.logistics.packager.PackagerBlockEntity; @@ -56,6 +54,9 @@ public class LogisticallyLinkedBehaviour extends BlockEntityBehaviour { private static final Cache>> LINKS = new TickBasedCache<>(20, true); + private static final Cache>> CLIENT_LINKS = + new TickBasedCache<>(20, true, true); + public LogisticallyLinkedBehaviour(SmartBlockEntity be, boolean global) { super(be); this.global = global; @@ -64,7 +65,13 @@ public class LogisticallyLinkedBehaviour extends BlockEntityBehaviour { } public static Collection getAllPresent(UUID freq, boolean sortByPriority) { - Cache> cache = LINKS.getIfPresent(freq); + return getAllPresent(freq, sortByPriority, false); + } + + public static Collection getAllPresent(UUID freq, boolean sortByPriority, + boolean clientSide) { + Cache> cache = + (clientSide ? CLIENT_LINKS : LINKS).getIfPresent(freq); if (cache == null) return Collections.emptyList(); Stream stream = new LinkedList<>(cache.asMap() @@ -79,21 +86,19 @@ public class LogisticallyLinkedBehaviour extends BlockEntityBehaviour { } public static void keepAlive(LogisticallyLinkedBehaviour behaviour) { + boolean onClient = behaviour.blockEntity.getLevel().isClientSide; if (behaviour.redstonePower == 15) return; try { - Cache> cache = LINKS.get(behaviour.freqId, - () -> CacheBuilder.newBuilder() - .expireAfterAccess(60, TimeUnit.SECONDS) - .build()); + Cache> cache = + (onClient ? CLIENT_LINKS : LINKS).get(behaviour.freqId, () -> new TickBasedCache<>(400, false)); if (cache == null) return; WeakReference reference = cache.get(behaviour.linkId, () -> new WeakReference<>(behaviour)); - if (reference.get() != behaviour) - cache.put(behaviour.linkId, new WeakReference<>(behaviour)); + cache.put(behaviour.linkId, reference.get() != behaviour ? new WeakReference<>(behaviour) : reference); } catch (ExecutionException e) { e.printStackTrace(); @@ -182,11 +187,11 @@ public class LogisticallyLinkedBehaviour extends BlockEntityBehaviour { } // - + public boolean mayInteract(Player player) { return Create.LOGISTICS.mayInteract(freqId, player); } - + public boolean mayInteractMessage(Player player) { boolean mayInteract = Create.LOGISTICS.mayInteract(freqId, player); if (!mayInteract) @@ -195,7 +200,7 @@ public class LogisticallyLinkedBehaviour extends BlockEntityBehaviour { .component(), true); return mayInteract; } - + public boolean mayAdministrate(Player player) { return Create.LOGISTICS.mayAdministrate(freqId, player); } diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedClientHandler.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedClientHandler.java index db0bcab98c..1bd998668a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedClientHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedClientHandler.java @@ -33,7 +33,7 @@ public class LogisticallyLinkedClientHandler { return; UUID uuid = tag.getUUID("Freq"); - for (LogisticallyLinkedBehaviour behaviour : LogisticallyLinkedBehaviour.getAllPresent(uuid, false)) { + for (LogisticallyLinkedBehaviour behaviour : LogisticallyLinkedBehaviour.getAllPresent(uuid, false, true)) { SmartBlockEntity be = behaviour.blockEntity; VoxelShape shape = be.getBlockState() .getShape(player.level(), be.getBlockPos()); diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperRequestScreen.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperRequestScreen.java index 4d66c9abd6..fe3ea89d2e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperRequestScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperRequestScreen.java @@ -1012,6 +1012,10 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen list = displayedItems.get(i); if (list.isEmpty()) diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java index 76370ef54f..142ace2827 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java @@ -100,6 +100,17 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity implements notifyUpdate(); return result; } + + @Override + public InventorySummary getRecentSummary() { + InventorySummary recentSummary = super.getRecentSummary(); + int contributingLinks = recentSummary.contributingLinks; + if (activeLinks != contributingLinks && !isRemoved()) { + activeLinks = contributingLinks; + sendData(); + } + return recentSummary; + } @Override public void tick() { @@ -109,11 +120,6 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity implements ticksSinceLastUpdate += 1; return; } - int contributingLinks = getRecentSummary().contributingLinks; - if (activeLinks != contributingLinks && !isRemoved()) { - activeLinks = contributingLinks; - sendData(); - } } @Override diff --git a/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java b/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java index 24767f34bf..1f13ea16ed 100644 --- a/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java @@ -68,6 +68,7 @@ import com.simibubi.create.foundation.networking.LeftClickPacket; import com.simibubi.create.foundation.sound.SoundScapes; import com.simibubi.create.foundation.utility.CameraAngleAnimationService; import com.simibubi.create.foundation.utility.ServerSpeedProvider; +import com.simibubi.create.foundation.utility.TickBasedCache; import com.simibubi.create.infrastructure.config.AllConfigs; import net.createmod.catnip.config.ui.BaseConfigScreen; @@ -187,6 +188,7 @@ public class ClientEvents { TableClothOverlayRenderer.tick(); CardboardArmorStealthOverlay.clientTick(); FactoryPanelConnectionHandler.clientTick(); + TickBasedCache.clientTick(); } @SubscribeEvent diff --git a/src/main/java/com/simibubi/create/foundation/utility/TickBasedCache.java b/src/main/java/com/simibubi/create/foundation/utility/TickBasedCache.java index a8b4700592..a234c2308b 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/TickBasedCache.java +++ b/src/main/java/com/simibubi/create/foundation/utility/TickBasedCache.java @@ -18,11 +18,16 @@ import com.google.common.collect.ImmutableMap; public class TickBasedCache implements Cache { private static int currentTick = 0; + private static int currentClientTick = 0; public static void tick() { currentTick++; } + public static void clientTick() { + currentClientTick++; + } + // private Map timestamps = new HashMap<>(); @@ -30,10 +35,16 @@ public class TickBasedCache implements Cache { private int ticksUntilTimeout; private boolean resetTimerOnAccess; + private boolean clientSide; public TickBasedCache(int ticksUntilTimeout, boolean resetTimerOnAccess) { + this(ticksUntilTimeout, resetTimerOnAccess, false); + } + + public TickBasedCache(int ticksUntilTimeout, boolean resetTimerOnAccess, boolean clientSide) { this.ticksUntilTimeout = ticksUntilTimeout; this.resetTimerOnAccess = resetTimerOnAccess; + this.clientSide = clientSide; } @Override @@ -41,16 +52,20 @@ public class TickBasedCache implements Cache { MutableInt timestamp = timestamps.get(key); if (timestamp == null) return null; - if (timestamp.intValue() < currentTick - ticksUntilTimeout) { + if (timestamp.intValue() < ticks() - ticksUntilTimeout) { timestamps.remove(key); map.remove(key); return null; } if (resetTimerOnAccess) - timestamp.setValue(currentTick); + timestamp.setValue(ticks()); return map.get(key); } + public int ticks() { + return clientSide ? currentClientTick : currentTick; + } + @Override public V get(K key, Callable loader) throws ExecutionException { V ifPresent = getIfPresent(key); @@ -67,7 +82,7 @@ public class TickBasedCache implements Cache { } private MutableInt now() { - return new MutableInt(currentTick); + return new MutableInt(ticks()); } @Override @@ -117,6 +132,7 @@ public class TickBasedCache implements Cache { @Override public ConcurrentMap asMap() { + cleanUp(); return map; } @@ -124,10 +140,10 @@ public class TickBasedCache implements Cache { public void cleanUp() { Set outdated = new HashSet<>(); timestamps.forEach((k, v) -> { - if (v.intValue() < currentTick - ticksUntilTimeout) + if (v.intValue() < ticks() - ticksUntilTimeout) outdated.add(k); if (resetTimerOnAccess) - v.setValue(currentTick); + v.setValue(ticks()); }); outdated.forEach(map::remove); outdated.forEach(timestamps::remove); diff --git a/src/main/resources/assets/create/lang/default/interface.json b/src/main/resources/assets/create/lang/default/interface.json index 32f92e59eb..75626a75f5 100644 --- a/src/main/resources/assets/create/lang/default/interface.json +++ b/src/main/resources/assets/create/lang/default/interface.json @@ -1058,8 +1058,8 @@ "create.gui.factory_panel.scroll_to_change_amount": "Scroll to change amount", "create.gui.factory_panel.recipe_address": "Send inputs to...", "create.gui.factory_panel.recipe_address_given": "Sending inputs to", - "create.gui.factory_panel.recipe_address_tip": "Enter an address where", - "create.gui.factory_panel.recipe_address_tip_1": "this recipe is carried out.", + "create.gui.factory_panel.recipe_address_tip": "Enter the address where", + "create.gui.factory_panel.recipe_address_tip_1": "this recipe is crafted.", "create.gui.factory_panel.restocker_address": "Send items to...", "create.gui.factory_panel.restocker_address_given": "Sending to", "create.gui.factory_panel.restocker_address_tip": "Enter an address that will", From de60a86abfc56a5cf59fb78d84f23af7b72d6275 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Wed, 11 Dec 2024 17:58:39 +0100 Subject: [PATCH 173/515] Shoptimisation - Table cloths now show a tooltip when sold items have extra information - Fixed inventory desync when encoding blocks at the stock keeper - Fixed table cloth item orientations - Metal table cloths now have side textures --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 8 +- .../models/item/andesite_table_cloth.json | 2 +- .../create/models/item/brass_table_cloth.json | 2 +- .../models/item/copper_table_cloth.json | 2 +- .../blueprint/BlueprintOverlayRenderer.java | 34 ++- .../factoryBoard/FactoryPanelMenu.java | 50 ---- .../PackageOrderRequestPacket.java | 1 + .../stockTicker/StockKeeperRequestMenu.java | 4 +- .../stockTicker/StockKeeperRequestScreen.java | 8 +- .../logistics/tableCloth/TableClothBlock.java | 4 +- .../tableCloth/TableClothBlockEntity.java | 6 + .../tableCloth/TableClothRenderer.java | 11 +- .../foundation/data/BuilderTransformers.java | 7 +- .../models/block/table_cloth/item_lower.json | 260 ------------------ .../textures/block/table_cloth/andesite.png | Bin 365 -> 735 bytes .../textures/block/table_cloth/brass.png | Bin 349 -> 695 bytes .../textures/block/table_cloth/copper.png | Bin 353 -> 685 bytes 17 files changed, 63 insertions(+), 336 deletions(-) delete mode 100644 src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelMenu.java delete mode 100644 src/main/resources/assets/create/models/block/table_cloth/item_lower.json diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index a5e82fa559..863acc3303 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-12-11T11:40:56.5489573 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-12-11T17:40:40.6073681 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -1814,7 +1814,7 @@ af792bb7d70029e66cc8aa21ed61322f899fb134 assets/create/models/item/andesite_enca 113fb6cb131bc3cdf63f558be71b8d77f9ae64c9 assets/create/models/item/andesite_ladder.json f187d676688c728804ab3758eb4b78a431c7ec21 assets/create/models/item/andesite_pillar.json d0dd86f6c7418c27c0f930cfd20e0867936eca3d assets/create/models/item/andesite_scaffolding.json -bfff8b148eb612a0d801cb044e3266a7245d2792 assets/create/models/item/andesite_table_cloth.json +2ef7426efa3c2609e67d2eef73f6f84a1b13d46c assets/create/models/item/andesite_table_cloth.json d5375c3de6272a00f3e3787fee6b8255f828d686 assets/create/models/item/andesite_tunnel.json d6eb7105dd9b42adde48bd70e3f2fba70751c1db assets/create/models/item/asurine.json 8b61987c61ae461e4bea0fccf5b1bb3399ac9226 assets/create/models/item/asurine_pillar.json @@ -1854,7 +1854,7 @@ a51a28424e75dbd11c845f455c778d4c578b9da4 assets/create/models/item/brass_ladder. 55208677f9135c3ca897c2432caa332bb1b858f2 assets/create/models/item/brass_nugget.json af97ba84be90381e2cc9434e31e2199c2e7e3aa6 assets/create/models/item/brass_scaffolding.json b78e9274156f5027a9a3b6fb7725c57a7aecc8bb assets/create/models/item/brass_sheet.json -56a3fa52f2e68c3cc27841f094cf85f55cddce5c assets/create/models/item/brass_table_cloth.json +7085ab446db5fa59aafe9bbba41c0e0f43bf749a assets/create/models/item/brass_table_cloth.json 28e104d5041c1f4676704c0f6b4e2e80aac43106 assets/create/models/item/brass_tunnel.json 35c8539a0b2f927e65a43c3a2c3cb82db429c2eb assets/create/models/item/brown_postbox.json fce64539b36fc8a5ffa39d7a3f73765818437cbf assets/create/models/item/brown_seat.json @@ -1908,7 +1908,7 @@ a4fd2f4f00e03b2ac5d863e93827d39a984cc2ff assets/create/models/item/copper_sheet. 13b18ba2938e283d507fbca70518cf52198cdc71 assets/create/models/item/copper_shingles.json 79d9f8667965072f12e51e6601b5c36f8acc125f assets/create/models/item/copper_shingle_slab.json 9fe6f0bdea4595b403ed2d2cbc2023a9abeb79f0 assets/create/models/item/copper_shingle_stairs.json -f8353c0830e1ce5511104196551e8adf73894563 assets/create/models/item/copper_table_cloth.json +9a33eeb0f7c682ee2f8c0abbfa174f8828acc2b5 assets/create/models/item/copper_table_cloth.json 19642e4ea5deecaf57059827c4c13a19d2e73822 assets/create/models/item/copper_tiles.json a7147444fc28a4cce21b6cf38e9528537e27c352 assets/create/models/item/copper_tile_slab.json 7330324d6c64f0340d676ecef83a930515d9130e assets/create/models/item/copper_tile_stairs.json diff --git a/src/generated/resources/assets/create/models/item/andesite_table_cloth.json b/src/generated/resources/assets/create/models/item/andesite_table_cloth.json index b2b803cb53..7249d5519e 100644 --- a/src/generated/resources/assets/create/models/item/andesite_table_cloth.json +++ b/src/generated/resources/assets/create/models/item/andesite_table_cloth.json @@ -1,5 +1,5 @@ { - "parent": "create:block/table_cloth/item_lower", + "parent": "create:block/table_cloth/item", "textures": { "0": "create:block/table_cloth/andesite" } diff --git a/src/generated/resources/assets/create/models/item/brass_table_cloth.json b/src/generated/resources/assets/create/models/item/brass_table_cloth.json index cc7353de21..f97c05bb55 100644 --- a/src/generated/resources/assets/create/models/item/brass_table_cloth.json +++ b/src/generated/resources/assets/create/models/item/brass_table_cloth.json @@ -1,5 +1,5 @@ { - "parent": "create:block/table_cloth/item_lower", + "parent": "create:block/table_cloth/item", "textures": { "0": "create:block/table_cloth/brass" } diff --git a/src/generated/resources/assets/create/models/item/copper_table_cloth.json b/src/generated/resources/assets/create/models/item/copper_table_cloth.json index 8aad981335..339e836882 100644 --- a/src/generated/resources/assets/create/models/item/copper_table_cloth.json +++ b/src/generated/resources/assets/create/models/item/copper_table_cloth.json @@ -1,5 +1,5 @@ { - "parent": "create:block/table_cloth/item_lower", + "parent": "create:block/table_cloth/item", "textures": { "0": "create:block/table_cloth/copper" } diff --git a/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintOverlayRenderer.java b/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintOverlayRenderer.java index fc19aba4b9..779daa429b 100644 --- a/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintOverlayRenderer.java +++ b/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintOverlayRenderer.java @@ -26,6 +26,7 @@ import com.simibubi.create.foundation.gui.AllGuiTextures; import net.createmod.catnip.gui.element.GuiGameElement; import net.createmod.catnip.utility.AnimationTickHolder; import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.Iterate; import net.createmod.catnip.utility.Pair; import net.createmod.catnip.utility.lang.Components; import net.createmod.ponder.utility.LevelTickHolder; @@ -35,11 +36,13 @@ import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.screens.inventory.tooltip.TooltipRenderUtil; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; +import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.CraftingContainer; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; +import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.crafting.CraftingRecipe; import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.level.GameType; @@ -147,8 +150,10 @@ public class BlueprintOverlayRenderer { shopContext = new BlueprintOverlayShopContext(false, dce.getStockLevelForTrade(list), alreadyPurchased); - ingredients.add(Pair.of(dce.getPaymentItem().copyWithCount(dce.getPaymentAmount()), - !dce.getPaymentItem().isEmpty() && shopContext.stockLevel() > shopContext.purchases())); + ingredients.add(Pair.of(dce.getPaymentItem() + .copyWithCount(dce.getPaymentAmount()), + !dce.getPaymentItem() + .isEmpty() && shopContext.stockLevel() > shopContext.purchases())); for (BigItemStack entry : dce.requestData.encodedRequest.stacks()) results.add(entry.stack.copyWithCount(entry.count)); } @@ -319,7 +324,7 @@ public class BlueprintOverlayRenderer { public static void renderOverlay(ForgeGui gui, GuiGraphics graphics, float partialTicks, int width, int height) { Minecraft mc = Minecraft.getInstance(); - if (mc.options.hideGui) + if (mc.options.hideGui || mc.screen != null) return; if (!active || empty) @@ -391,9 +396,26 @@ public class BlueprintOverlayRenderer { } } -// if (shopContext != null) Display stock level? -// graphics.drawString(mc.font, Components.literal(shopContext.stockLevel() + "x in Stock"), x + 2, y + 13, -// 0xff_797979, true); + if (shopContext != null && !shopContext.checkout()) { + int cycle = 0; + for (boolean count : Iterate.trueAndFalse) + for (int i = 0; i < results.size(); i++) { + ItemStack result = results.get(i); + List tooltipLines = result.getTooltipLines(mc.player, TooltipFlag.NORMAL); + if (tooltipLines.size() <= 1) + continue; + if (count) { + cycle++; + continue; + } + if ((gui.getGuiTicks() / 40) % cycle != i) + continue; + graphics.renderComponentTooltip(gui.getFont(), tooltipLines, mc.getWindow() + .getGuiScaledWidth(), + mc.getWindow() + .getGuiScaledHeight()); + } + } RenderSystem.disableBlend(); } diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelMenu.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelMenu.java deleted file mode 100644 index 77154cd436..0000000000 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelMenu.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.simibubi.create.content.logistics.factoryBoard; - -import com.simibubi.create.foundation.gui.menu.GhostItemMenu; - -import net.minecraft.client.Minecraft; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.world.entity.player.Inventory; -import net.minecraft.world.inventory.MenuType; -import net.minecraftforge.items.ItemStackHandler; -import net.minecraftforge.items.SlotItemHandler; - -public class FactoryPanelMenu extends GhostItemMenu { - - public FactoryPanelMenu(MenuType type, int id, Inventory inv, FriendlyByteBuf extraData) { - super(type, id, inv, extraData); - } - - public FactoryPanelMenu(MenuType type, int id, Inventory inv, FactoryPanelBehaviour contentHolder) { - super(type, id, inv, contentHolder); - } - - @Override - protected ItemStackHandler createGhostInventory() { - ItemStackHandler itemStackHandler = new ItemStackHandler(1); - if (contentHolder != null) - itemStackHandler.setStackInSlot(0, contentHolder.getFilter() - .copyWithCount(1)); - return itemStackHandler; - } - - @Override - protected boolean allowRepeats() { - return true; - } - - @Override - protected FactoryPanelBehaviour createOnClient(FriendlyByteBuf extraData) { - return FactoryPanelBehaviour.at(Minecraft.getInstance().level, FactoryPanelPosition.receive(extraData)); - } - - @Override - protected void addSlots() { - addSlot(new SlotItemHandler(ghostInventory, 0, 16, 24)); - addPlayerSlots(0, 0); - } - - @Override - protected void saveData(FactoryPanelBehaviour contentHolder) {} - -} diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrderRequestPacket.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrderRequestPacket.java index 74bec9f4c6..f73e21217a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrderRequestPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrderRequestPacket.java @@ -45,6 +45,7 @@ public class PackageOrderRequestPacket extends BlockEntityConfigurationPacket { public void initializeContents(int pStateId, List pItems, ItemStack pCarried) {} @Override - protected void addSlots() {} + protected void addSlots() { + addPlayerSlots(-1000, 0); + } @Override protected void saveData(StockTickerBlockEntity contentHolder) {} diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperRequestScreen.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperRequestScreen.java index fe3ea89d2e..a1182a9698 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperRequestScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperRequestScreen.java @@ -414,6 +414,9 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen hoveredSlot = getHoveredSlot(mouseX, mouseY); @@ -899,7 +902,7 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen(); blockEntity.ticksSinceLastUpdate = 10; successTicks = 1; - - if (encodeRequester) - minecraft.setScreen(null); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothBlock.java b/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothBlock.java index d21029fec6..b150cd2805 100644 --- a/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothBlock.java @@ -138,12 +138,12 @@ public class TableClothBlock extends Block implements IHaveBigOutline, IWrenchab @Override public VoxelShape getShape(BlockState pState, BlockGetter pLevel, BlockPos pPos, CollisionContext pContext) { - return colour == null ? AllShapes.TABLE_CLOTH_OCCLUSION : AllShapes.TABLE_CLOTH; + return AllShapes.TABLE_CLOTH; } @Override public VoxelShape getInteractionShape(BlockState pState, BlockGetter pLevel, BlockPos pPos) { - return colour == null ? AllShapes.TABLE_CLOTH_OCCLUSION : AllShapes.TABLE_CLOTH; + return AllShapes.TABLE_CLOTH; } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothBlockEntity.java index 02dded2afc..052306c136 100644 --- a/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothBlockEntity.java @@ -38,6 +38,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.Vec3; @@ -90,6 +91,11 @@ public class TableClothBlockEntity extends SmartBlockEntity { .getOcclusionShape(level, relativePos.below()), facing.getOpposite()); } + @Override + protected AABB createRenderBoundingBox() { + return super.createRenderBoundingBox().inflate(1); + } + public boolean isShop() { return !requestData.encodedRequest.isEmpty(); } diff --git a/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothRenderer.java b/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothRenderer.java index c62e65751c..8bde680a94 100644 --- a/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothRenderer.java @@ -10,10 +10,12 @@ import com.simibubi.create.foundation.blockEntity.renderer.SmartBlockEntityRende import dev.engine_room.flywheel.lib.transform.TransformStack; import net.createmod.catnip.render.CachedBuffers; +import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider.Context; import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.client.resources.model.BakedModel; import net.minecraft.core.Direction; import net.minecraft.util.Mth; import net.minecraft.world.item.ItemStack; @@ -56,7 +58,14 @@ public class TableClothRenderer extends SmartBlockEntityRenderer p - .withExistingParent(name + "_table_cloth", - p.modLoc("block/table_cloth/item" + (!dyed ? "_lower" : ""))) - .texture("0", p.modLoc("block/table_cloth/" + name))) + return item.model((c, p) -> p.withExistingParent(name + "_table_cloth", p.modLoc("block/table_cloth/item")) + .texture("0", p.modLoc("block/table_cloth/" + name))) .tag(AllItemTags.TABLE_CLOTHS.tag) .recipe((c, p) -> ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, c.get()) .requires(c.get()) diff --git a/src/main/resources/assets/create/models/block/table_cloth/item_lower.json b/src/main/resources/assets/create/models/block/table_cloth/item_lower.json deleted file mode 100644 index 02ce8977e7..0000000000 --- a/src/main/resources/assets/create/models/block/table_cloth/item_lower.json +++ /dev/null @@ -1,260 +0,0 @@ -{ - "credit": "Made with Blockbench", - "parent": "block/block", - "textures": { - "0": "create:block/table_cloth/red", - "particle": "create:block/table_cloth/red" - }, - "elements": [ - { - "from": [0, 0, 0], - "to": [16, 1, 16], - "faces": { - "north": {"uv": [0, 7.5, 8, 8], "texture": "#0", "cullface": "north"}, - "east": {"uv": [0, 7.5, 8, 8], "texture": "#0", "cullface": "east"}, - "south": {"uv": [0, 7.5, 8, 8], "texture": "#0", "cullface": "south"}, - "west": {"uv": [0, 7.5, 8, 8], "texture": "#0", "cullface": "west"}, - "up": {"uv": [0, 0, 8, 8], "texture": "#0"}, - "down": {"uv": [0, 0, 8, 8], "texture": "#0", "cullface": "down"} - } - }, - { - "from": [-1, -10, 0], - "to": [0.1, 1, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [11.45, 9, 12, 14.5], "texture": "#0", "cullface": "west"}, - "east": {"uv": [0, 9, 8, 14.5], "texture": "#0", "cullface": "west"}, - "south": {"uv": [12, 9, 11.45, 14.5], "texture": "#0", "cullface": "west"}, - "west": {"uv": [0, 9, 8, 14.5], "texture": "#0", "cullface": "west"}, - "up": {"uv": [0, 8.45, 8, 9], "rotation": 90, "texture": "#0", "cullface": "west"} - } - }, - { - "from": [-1, -8, 0], - "to": [0.1, -8, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "down": {"uv": [0, 15.5, 8, 16], "rotation": 90, "texture": "#0", "cullface": "west"} - } - }, - { - "from": [0, -10, -1], - "to": [16, 1, 0.1], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [0, 9, 8, 14.5], "texture": "#0", "cullface": "west"}, - "east": {"uv": [11.45, 9, 12, 14.5], "texture": "#0", "cullface": "west"}, - "south": {"uv": [0, 9, 8, 14.5], "texture": "#0", "cullface": "west"}, - "west": {"uv": [12, 9, 11.45, 14.5], "texture": "#0", "cullface": "west"}, - "up": {"uv": [0, 8.45, 8, 9], "rotation": 180, "texture": "#0", "cullface": "west"} - } - }, - { - "from": [0, -8, -1], - "to": [16, -8, 0.1], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "down": {"uv": [0, 15.5, 8, 16], "texture": "#0", "cullface": "west"} - } - }, - { - "from": [15.9, -10, 0], - "to": [17, 1, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [12, 9, 11.45, 14.5], "texture": "#0", "cullface": "west"}, - "east": {"uv": [0, 9, 8, 14.5], "texture": "#0", "cullface": "west"}, - "south": {"uv": [11.45, 9, 12, 14.5], "texture": "#0", "cullface": "west"}, - "west": {"uv": [0, 9, 8, 14.5], "texture": "#0", "cullface": "west"}, - "up": {"uv": [0, 8.45, 8, 9], "rotation": 270, "texture": "#0", "cullface": "west"} - } - }, - { - "from": [15.9, -8, 0], - "to": [17, -8, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "down": {"uv": [0, 15.5, 8, 16], "rotation": 270, "texture": "#0", "cullface": "west"} - } - }, - { - "from": [0, -10, 15.9], - "to": [16, 1, 17], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [0, 9, 8, 14.5], "texture": "#0", "cullface": "west"}, - "east": {"uv": [12, 9, 11.45, 14.5], "texture": "#0", "cullface": "west"}, - "south": {"uv": [0, 9, 8, 14.5], "texture": "#0", "cullface": "west"}, - "west": {"uv": [11.45, 9, 12, 14.5], "texture": "#0", "cullface": "west"}, - "up": {"uv": [0, 8.45, 8, 9], "texture": "#0", "cullface": "west"} - } - }, - { - "from": [0, -8, 15.9], - "to": [16, -8, 17], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "down": {"uv": [0, 15.5, 8, 16], "rotation": 180, "texture": "#0", "cullface": "west"} - } - }, - { - "from": [-1, -10, -1], - "to": [0, 1, 0], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [9, 9, 9.5, 14.5], "texture": "#0"}, - "west": {"uv": [9.5, 9, 10, 14.5], "texture": "#0"}, - "up": {"uv": [9.5, 8.5, 10, 9], "texture": "#0"} - } - }, - { - "from": [-1, -8, -1], - "to": [0, -7, 0], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 9, 8]}, - "faces": { - "down": {"uv": [7.5, 15.5, 8, 16], "texture": "#0"} - } - }, - { - "from": [16, -10, -1], - "to": [17, 1, 0], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [9.5, 9, 10, 14.5], "texture": "#0"}, - "east": {"uv": [9, 9, 9.5, 14.5], "texture": "#0"}, - "up": {"uv": [9.5, 8.5, 10, 9], "rotation": 90, "texture": "#0"} - } - }, - { - "from": [16, -8, -1], - "to": [17, -7, 0], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 9, 8]}, - "faces": { - "down": {"uv": [7.5, 15.5, 8, 16], "rotation": 270, "texture": "#0"} - } - }, - { - "from": [16, -10, 16], - "to": [17, 1, 17], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "east": {"uv": [9.5, 9, 10, 14.5], "texture": "#0"}, - "south": {"uv": [9, 9, 9.5, 14.5], "texture": "#0"}, - "up": {"uv": [9.5, 8.5, 10, 9], "rotation": 180, "texture": "#0"} - } - }, - { - "from": [16, -8, 16], - "to": [17, -7, 17], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 9, 8]}, - "faces": { - "down": {"uv": [7.5, 15.5, 8, 16], "rotation": 180, "texture": "#0"} - } - }, - { - "from": [-1, -10, 16], - "to": [0, 1, 17], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "south": {"uv": [9.5, 9, 10, 14.5], "texture": "#0"}, - "west": {"uv": [9, 9, 9.5, 14.5], "texture": "#0"}, - "up": {"uv": [9.5, 8.5, 10, 9], "rotation": 270, "texture": "#0"} - } - }, - { - "from": [-1, -8, 16], - "to": [0, -7, 17], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 9, 8]}, - "faces": { - "down": {"uv": [7.5, 15.5, 8, 16], "rotation": 90, "texture": "#0"} - } - } - ], - "display": { - "thirdperson_righthand": { - "rotation": [75, 45, 0], - "translation": [0, 2.5, 3.25], - "scale": [0.375, 0.375, 0.375] - }, - "thirdperson_lefthand": { - "rotation": [75, 45, 0], - "translation": [0, 2.5, 3.5], - "scale": [0.375, 0.375, 0.375] - }, - "firstperson_righthand": { - "rotation": [0, 45, 0], - "translation": [0, 3.25, 0], - "scale": [0.4, 0.4, 0.4] - }, - "firstperson_lefthand": { - "rotation": [0, 45, 0], - "translation": [0, 3.25, 0], - "scale": [0.4, 0.4, 0.4] - }, - "ground": { - "translation": [0, 3.5, 0], - "scale": [0.25, 0.25, 0.25] - }, - "gui": { - "rotation": [30, 225, 0], - "translation": [0, 3.75, 0], - "scale": [0.625, 0.625, 0.625] - }, - "fixed": { - "translation": [0, 5.75, 0], - "scale": [0.5, 0.5, 0.5] - } - }, - "groups": [ - 0, - { - "name": "west", - "origin": [-2, 2, 0], - "color": 0, - "children": [1, 2] - }, - { - "name": "north", - "origin": [-2, 2, 0], - "color": 0, - "children": [3, 4] - }, - { - "name": "east", - "origin": [-2, 2, 0], - "color": 0, - "children": [5, 6] - }, - { - "name": "south", - "origin": [-2, 2, 0], - "color": 0, - "children": [7, 8] - }, - { - "name": "northwest", - "origin": [-1, 2, -1], - "color": 0, - "children": [9, 10] - }, - { - "name": "northeast", - "origin": [-1, 2, -1], - "color": 0, - "children": [11, 12] - }, - { - "name": "southeast", - "origin": [-1, 2, -1], - "color": 0, - "children": [13, 14] - }, - { - "name": "southwest", - "origin": [-1, 2, -1], - "color": 0, - "children": [15, 16] - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/block/table_cloth/andesite.png b/src/main/resources/assets/create/textures/block/table_cloth/andesite.png index d12113f87ee301c538a958541e0615faeac72d8f..c41449947ac7dc0a9e8a8b2ff219bc672bbd22df 100644 GIT binary patch delta 642 zcmaFMbf0yCBcshkC++&^gy@uv3u0hkc)a+_1|TI;666>B9}_V6 z`#%>1%5xTYL>4nJ=qZ3O<5d|sX`rB3iEBhjaDG}zd16s2LqK9?UWuNcYlwoWp5gcA z?~{QlwxmXQrg?g5F>o+2)HAR$NHMZ9FapKBfLI#J2Dw6mkr^z`1Y{dBGBNN0=_nx1 zY-a(BX8_qCux2s~!wY5vjbbMQP+|f*0}D`{fswHR;{u48Ap2MsurSnv7?Xe)1ek!v zGJ%x_Sy}*DP;G_=1|ZqX$5#K(RC)J+fq_xW)5S5w!hi3i+eL>JcwAhY9J9C-pZ)*8 z)xE94im&#qP-6d`>zxiQTb8!$--TSyj%i6| z^@|V8O5k)dIjwoKsi4_`!>MJ$zGeSgSoR#*lp3{0>w;31!DaS$i&%eJ8b4Lg)td0k zkmE~aXo6?byt7LR4OQa$9Z&4hi*ga~dbMxuIu6N&#bqlmR)39GU=mum^!r8sL$Oa3 zAM9}1xBUMR_hX`u;t!S8@IU5_pHt=#v!Ixb<@Mb%p8dBO12wPmUkGYF@YyoQ;ZV)Y z3-`Pw%@iIk^eTE97TQ>_vLLcqY%8C1gg}(EnL~HbJ?CptHy&9n@s6-i5?y>K^~AL} z{q5=*Z|DA9eW>PN=YNF_37Wsptt!3$y~@x2!f$@hMHU@aH#XXV!qC&z&t;ucLK6TG C9p=mc delta 270 zcmcc5`j%;eBcs+tC+&I$1_pDL0(Bt8R}$nG{2v)GxE{E30w}{-;1OBOz@VoH!i?;l-xX!cz`$TNB~Kqn36%u-1^-6}43GBj7Xr$1 z7I;J!Gcf2WfH31#898a7pje4(L`iUdT1k0gQ7S_~VrE{6o}X)of~lV2_vY`DfhxA7 zMtG)qdTKFn06DA-QjDw&jP*dK7Z6K>I6yiGh&33Q!E7cV+mMlofe%PW0dZzK3s^h@ z$OeHmlUW#EFe7LbI~jly6WAG8fa(m4j13qUK+FW$!MXrq&LkikWIqEF&{!t0(jZF< zAPcI^(7*sBd->Sv|CuW99xyO4a(TKqhFJLT4Zc`(M1kW7v#4r$`2YXuyE7(zllpXP zuHx$xT-|;hm)PYV^J{E;5>%wO(?f7s?SB^4m8W_mMX#s`q&&^zopen{MC9Gxt-L?; zawgU@u;1RMcz<@AZo#$B*QB#U7@5B9G1WOFX7#u7UR1=v1F^!h4OzV`I!Q?k8dYo9Yajf&V|~9#qIK_|SBX8gx09Rh9O`Em zmzX5S{iP<6sdlc7+gfe07phNVyKF9>OJ1@isqu`vx}WRcqtnIAwyu=v(G8z>dE#xh zd+hxOBdT;J=uKVnOSzw51?S9{*QB%Je4fy4TUr`JmJoa5|Xty}Iz zzh3JtKIQe_-k{WQi3O(;CUML=IgDqV9W(M3fW^{3C tN;olX>s0A|*K3cu|6x_Hb1IP0|8A&r@6byPR-khkJYD@<);T3K0Ra3TZ;=21 diff --git a/src/main/resources/assets/create/textures/block/table_cloth/copper.png b/src/main/resources/assets/create/textures/block/table_cloth/copper.png index e5861a7214010b6ed01bb481675547b536b7251c..8fe48660eedce9bc4ef6b80e09340f3b1980d122 100644 GIT binary patch delta 589 zcmaFJw3c;(Bct&|C%yXl-mYJER536xEadtr4x|K2g8YL2qX7ohwKJ1|lAHw|k;M!Q zdI})ScvVJD8Yn1M;u=vBoS#-wo>-L15RjOeSEA?V8lqsTXZXGO`(&VsEvXTnX`Y^1 z3>-iXD}xjxD+42t2!0mMv@g{%u8=1c;zL4b*Yu^vc(lm=N^09jCNh6V;8 z>C4Af|Ibu;_ke+ck;T)+F~q`uZ&384BMKZxJ{S}V9sfPQOnRfy*2Oo^zZEjMbZLR2 z7pHQ=(QEr0I$d?sH|H$cbNR-8N6#;l9V^u)2+3Q@r-j8W;pX&ipQp|oj(?ZQB4IG8CN~dkPFL>Uwrm!QQXn|l{T?g zroM37B_>p}vSPl{n(IzU%JPiy{ePt|cjn&_`ZV!DqHIX^(p4W;ePCfyej%ptPSk1w z^8qoBJjPqwZbiA~8t#@BTd;Sgr~i%g*{XkXQVQm8bo|i2J63>aSDW0O?cb*){*OJZ zBlvb_>-?^ijem}1ck!E8r%HTQ{@48B`~M5K_%H3(`LMNh@oG@$c)I$ztaD0e0svDR B$5j9T delta 254 zcmZ3>`jBaYBctv_C%t+G1_s`pX}&;;za+>n_&*9@xN>L4LZB39fk$L91B0F-2s5%r z|M?FTT;%EE7-Hf7c0x8^ivmx}@^4#}D*iu?YT40wP56!9uVw>zpXdgSEDgTXb;2F4 zXYZczonk-Z`*epz_vNR|XAs%5YkgXnSy6^i;+CwnGMAVUXbF|mpg#YW$<+Mb6Mw<&;$TeCUo-v From f8fc832a1839a9b0e3afd9618ce39e7cc7da6bc5 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Wed, 11 Dec 2024 19:04:19 +0100 Subject: [PATCH 174/515] Graphics Programming 0 - Fixed factory gauges not rendering with correct normals. Probably. --- .../factoryBoard/FactoryPanelModel.java | 21 +++++++++++++++++-- .../foundation/model/BakedQuadHelper.java | 17 +++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelModel.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelModel.java index 3f6e78e798..62fe717d5a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelModel.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelModel.java @@ -82,17 +82,34 @@ public class FactoryPanelModel extends BakedModelWrapperWithData { for (BakedQuad bakedQuad : quadsToAdd) { int[] vertices = bakedQuad.getVertices(); int[] transformedVertices = Arrays.copyOf(vertices, vertices.length); - + + Vec3 quadNormal = Vec3.atLowerCornerOf(bakedQuad.getDirection() + .getNormal()); + quadNormal = VecHelper.rotate(quadNormal, 180, Axis.Y); + quadNormal = VecHelper.rotate(quadNormal, xRot + 90, Axis.X); + quadNormal = VecHelper.rotate(quadNormal, yRot, Axis.Y); + for (int i = 0; i < vertices.length / BakedQuadHelper.VERTEX_STRIDE; i++) { Vec3 vertex = BakedQuadHelper.getXYZ(vertices, i); + Vec3 normal = BakedQuadHelper.getNormalXYZ(vertices, i); + vertex = vertex.add(slot.xOffset * .5, 0, slot.yOffset * .5); vertex = VecHelper.rotateCentered(vertex, 180, Axis.Y); vertex = VecHelper.rotateCentered(vertex, xRot + 90, Axis.X); vertex = VecHelper.rotateCentered(vertex, yRot, Axis.Y); + + normal = VecHelper.rotate(normal, 180, Axis.Y); + normal = VecHelper.rotate(normal, xRot + 90, Axis.X); + normal = VecHelper.rotate(normal, yRot, Axis.Y); + BakedQuadHelper.setXYZ(transformedVertices, i, vertex); + BakedQuadHelper.setNormalXYZ(transformedVertices, i, new Vec3(0, 1, 0)); } - quads.add(BakedQuadHelper.cloneWithCustomGeometry(bakedQuad, transformedVertices)); + Direction newNormal = Direction.fromDelta((int) Math.round(quadNormal.x), (int) Math.round(quadNormal.y), + (int) Math.round(quadNormal.z)); + quads.add(new BakedQuad(transformedVertices, bakedQuad.getTintIndex(), newNormal, bakedQuad.getSprite(), + bakedQuad.isShade())); } } diff --git a/src/main/java/com/simibubi/create/foundation/model/BakedQuadHelper.java b/src/main/java/com/simibubi/create/foundation/model/BakedQuadHelper.java index 6a9b760364..861e274651 100644 --- a/src/main/java/com/simibubi/create/foundation/model/BakedQuadHelper.java +++ b/src/main/java/com/simibubi/create/foundation/model/BakedQuadHelper.java @@ -6,6 +6,7 @@ import com.mojang.blaze3d.vertex.DefaultVertexFormat; import com.mojang.blaze3d.vertex.VertexFormat; import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.util.Mth; import net.minecraft.world.phys.Vec3; public final class BakedQuadHelper { @@ -46,6 +47,22 @@ public final class BakedQuadHelper { vertexData[vertex * VERTEX_STRIDE + Z_OFFSET] = Float.floatToRawIntBits((float) xyz.z); } + public static Vec3 getNormalXYZ(int[] vertexData, int vertex) { + int data = vertexData[vertex * VERTEX_STRIDE + NORMAL_OFFSET]; + float x = (byte) (data >> 24 & 0xFF) / 127f; + float y = (byte) (data >> 16 & 0xFF) / 127f; + float z = (byte) (data >> 8 & 0xFF) / 127f; + return new Vec3(x, y, z); + } + + public static void setNormalXYZ(int[] vertexData, int vertex, Vec3 xyz) { + int x = Byte.toUnsignedInt((byte) (Mth.clamp(xyz.x, -1.0f, 1.0f) * 127)); + int y = Byte.toUnsignedInt((byte) (Mth.clamp(xyz.y, -1.0f, 1.0f) * 127)); + int z = Byte.toUnsignedInt((byte) (Mth.clamp(xyz.z, -1.0f, 1.0f) * 127)); + int data = (x << 24) | (y << 16) | (z << 8); + vertexData[vertex * VERTEX_STRIDE + NORMAL_OFFSET] = data; + } + public static float getU(int[] vertexData, int vertex) { return Float.intBitsToFloat(vertexData[vertex * VERTEX_STRIDE + U_OFFSET]); } From f3743f5a188f3feff84b9626bfcf80ca4823b598 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Wed, 11 Dec 2024 20:46:20 +0100 Subject: [PATCH 175/515] Old factory panes --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 30 ++++--- .../blockstates/old_factory_window_pane.json | 77 ++++++++++++++++++ .../resources/assets/create/lang/en_ud.json | 1 + .../resources/assets/create/lang/en_us.json | 1 + .../models/block/old_factory_window_1.json | 2 +- .../models/block/old_factory_window_2.json | 2 +- .../models/block/old_factory_window_3.json | 2 +- .../models/block/old_factory_window_4.json | 2 +- .../block/old_factory_window_pane_noside.json | 7 ++ .../old_factory_window_pane_noside_alt.json | 7 ++ .../block/old_factory_window_pane_post.json | 7 ++ .../block/old_factory_window_pane_side.json | 7 ++ .../old_factory_window_pane_side_alt.json | 7 ++ .../models/item/old_factory_window.json | 2 +- .../models/item/old_factory_window_pane.json | 7 ++ .../old_factory_window_pane.json | 35 ++++++++ .../blocks/old_factory_window_pane.json | 31 +++++++ .../recipes/old_factory_window_pane.json | 18 ++++ .../data/forge/tags/blocks/glass_panes.json | 3 +- .../data/forge/tags/items/glass_panes.json | 3 +- .../com/simibubi/create/AllSpriteShifts.java | 8 +- .../decoration/palettes/AllPaletteBlocks.java | 14 ++-- ....java => OldFactoryWindowCTBehaviour.java} | 28 +++++-- .../OldFactoryWindowPaneCTBehaviour.java | 54 ++++++++++++ .../foundation/block/connected/CTModel.java | 2 +- .../connected/ConnectedTextureBehaviour.java | 7 ++ .../create/foundation/data/WindowGen.java | 48 +++++------ ...ry_window_1.png => old_factory_window.png} | Bin .../block/palettes/old_factory_window_2.png | Bin 560 -> 0 bytes .../block/palettes/old_factory_window_3.png | Bin 560 -> 0 bytes .../block/palettes/old_factory_window_4.png | Bin 560 -> 0 bytes .../palettes/old_factory_window_pane_top.png | Bin 0 -> 431 bytes 32 files changed, 351 insertions(+), 61 deletions(-) create mode 100644 src/generated/resources/assets/create/blockstates/old_factory_window_pane.json create mode 100644 src/generated/resources/assets/create/models/block/old_factory_window_pane_noside.json create mode 100644 src/generated/resources/assets/create/models/block/old_factory_window_pane_noside_alt.json create mode 100644 src/generated/resources/assets/create/models/block/old_factory_window_pane_post.json create mode 100644 src/generated/resources/assets/create/models/block/old_factory_window_pane_side.json create mode 100644 src/generated/resources/assets/create/models/block/old_factory_window_pane_side_alt.json create mode 100644 src/generated/resources/assets/create/models/item/old_factory_window_pane.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/old_factory_window_pane.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/old_factory_window_pane.json create mode 100644 src/generated/resources/data/create/recipes/old_factory_window_pane.json rename src/main/java/com/simibubi/create/content/decoration/palettes/{RandomisedWindowCTBehaviour.java => OldFactoryWindowCTBehaviour.java} (60%) create mode 100644 src/main/java/com/simibubi/create/content/decoration/palettes/OldFactoryWindowPaneCTBehaviour.java rename src/main/resources/assets/create/textures/block/palettes/{old_factory_window_1.png => old_factory_window.png} (100%) delete mode 100644 src/main/resources/assets/create/textures/block/palettes/old_factory_window_2.png delete mode 100644 src/main/resources/assets/create/textures/block/palettes/old_factory_window_3.png delete mode 100644 src/main/resources/assets/create/textures/block/palettes/old_factory_window_4.png create mode 100644 src/main/resources/assets/create/textures/block/palettes/old_factory_window_pane_top.png diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 863acc3303..ca65ebabfe 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-12-11T17:40:40.6073681 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-12-11T20:27:35.4702846 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -370,6 +370,7 @@ ba9c3ecfacbd398048440d247decffeaefc714b5 assets/create/blockstates/mysterious_cu df91d0ca68934c1afd9858a8d1591dd4cb88df65 assets/create/blockstates/ochrum.json 09c9bee3d26edc4b87cb7a5042f125c439ee5956 assets/create/blockstates/ochrum_pillar.json 8c81b5846605f5c7efecd335534a2c8660c9b206 assets/create/blockstates/old_factory_window.json +3d3233a4de308b39e4237a21cb3227377d9089d4 assets/create/blockstates/old_factory_window_pane.json 8ff85f8171ff60ebf95f574d6c9f275ae6e98ee0 assets/create/blockstates/orange_postbox.json af4c2c4861d1410e1b7371a5bf3fe09ed3ab0077 assets/create/blockstates/orange_sail.json aab812cecf7d10d4e7587f4dead8a98238a15f41 assets/create/blockstates/orange_seat.json @@ -640,8 +641,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -3608bc5c03238eed54df85df9b76e6149cbb6219 assets/create/lang/en_ud.json -bd16815584184efb990402b2936f3a531dc6a1d2 assets/create/lang/en_us.json +53bf0593121af72930af270346e9ce2822f914df assets/create/lang/en_ud.json +b92519d5a3d1776b892a41ccc1757cfd4a10f088 assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -1310,10 +1311,15 @@ af50363d603d61340b336569d58c1febde253665 assets/create/models/block/ochrum_natur d69effa0a811cb93fead8257bcaad4bbf0094002 assets/create/models/block/ochrum_natural_3.json 24669a4e93925940477fcfc0aca10ab9d87368e0 assets/create/models/block/ochrum_pillar.json c8dd33a0b71dce37712788a61729de89574b117f assets/create/models/block/ochrum_pillar_horizontal.json -3f19a949a272f1115f05edf5bf68f15db6321fc9 assets/create/models/block/old_factory_window_1.json -32c6b9d4a4965abc8dd01b82a3f63fd965fd62c9 assets/create/models/block/old_factory_window_2.json -b7db5faead0af7b85ef9b96d3ef33b497bb67e76 assets/create/models/block/old_factory_window_3.json -8c9e45d0f2c8eb08884a1272a7e8c8c27115951b assets/create/models/block/old_factory_window_4.json +8661da1ba4f5397a8141daa76db81d43e28d1772 assets/create/models/block/old_factory_window_1.json +bf22ea3157df302d5a1bbf4afc8d83b37a56ff0b assets/create/models/block/old_factory_window_2.json +17e6a1289531703d0ad3b2fc8c61740ba4c38093 assets/create/models/block/old_factory_window_3.json +142ff0861e6460129767921a797d13d7fb040f92 assets/create/models/block/old_factory_window_4.json +b0871493a8b1429521fb612ab60d49af8a355f8e assets/create/models/block/old_factory_window_pane_noside.json +298ba4fa0a9ebf6422a05885e132a26e6bdbb57c assets/create/models/block/old_factory_window_pane_noside_alt.json +9e7342c64b694b5a5b69f21139ef9fce5bf60979 assets/create/models/block/old_factory_window_pane_post.json +5519cb7d69657c02f24d2768adf4f6d2a52d76e8 assets/create/models/block/old_factory_window_pane_side.json +08a677e330d0d54e0bfe8b58a91d39866af64a29 assets/create/models/block/old_factory_window_pane_side_alt.json dbd0cbfa1c6cfaddd7ac954379b4b1f3056730f2 assets/create/models/block/orange_postbox_closed.json 88cda1f606e502cf0df9430b75a70fd3161fd6ba assets/create/models/block/orange_postbox_open.json cb4cd4e4bfb0d105a09c56454abf4795b155d12b assets/create/models/block/orange_sail.json @@ -2202,7 +2208,8 @@ f80358eba19bc8d1741e4e25753866799631a118 assets/create/models/item/nixie_tube.js 061587faf0e53e4fac0c8f2f3bd6b22020b2a3ee assets/create/models/item/oak_window_pane.json af50363d603d61340b336569d58c1febde253665 assets/create/models/item/ochrum.json 62ec1afee14f9de3f5b02ee930d002a240a3c337 assets/create/models/item/ochrum_pillar.json -3f19a949a272f1115f05edf5bf68f15db6321fc9 assets/create/models/item/old_factory_window.json +8661da1ba4f5397a8141daa76db81d43e28d1772 assets/create/models/item/old_factory_window.json +057526bde18263f4a9e1230ea3a65ea399363c72 assets/create/models/item/old_factory_window_pane.json 226f99c241b1d8b03d8fc57db32c1bee0721b64f assets/create/models/item/orange_postbox.json 56e7d28824d3fc566b5f551babbe423a550ef08c assets/create/models/item/orange_seat.json 9f122183a1b04ac6346631db4f505e53ed333acf assets/create/models/item/orange_table_cloth.json @@ -2928,6 +2935,7 @@ be72964ed354ab3772c9103ca089b48369a3f4df data/create/advancements/recipes/buildi ee4586fa007fd595b90172f246153130dd9a10f6 data/create/advancements/recipes/building_blocks/ochrum_from_stone_types_ochrum_stonecutting.json 15642e7fe5f36a84382a33e0ca90c328e9906155 data/create/advancements/recipes/building_blocks/ochrum_pillar_from_stone_types_ochrum_stonecutting.json 71847992255d1ff09a24104b1854345f4022fb7c data/create/advancements/recipes/building_blocks/old_factory_window.json +fea0f527914a812bdf0e60002aa407855ecb4328 data/create/advancements/recipes/building_blocks/old_factory_window_pane.json 8779e790fe3f51319a9a03388adb87ff98826159 data/create/advancements/recipes/building_blocks/ornate_iron_window.json c8b8f792d2e9ffea70330f2c1659d567c12913b1 data/create/advancements/recipes/building_blocks/ornate_iron_window_pane.json ad88d3e8914d3caeda60553894182dfd498e51ae data/create/advancements/recipes/building_blocks/oxidized_copper_shingle_slab.json @@ -3604,6 +3612,7 @@ fe79cb4cbea87efc84d61d3d31f073bf3c64c73d data/create/loot_tables/blocks/netherit 461e9818f41aab34905757a423455cdcee780e67 data/create/loot_tables/blocks/ochrum.json 1259a439286385d5b7c48bff89d0839f1f2e02c2 data/create/loot_tables/blocks/ochrum_pillar.json b124ea55ec522e0f314b972efed525647a2912cb data/create/loot_tables/blocks/old_factory_window.json +fae5fe1ab6b83f5488e82d6b95da1cb0a6582446 data/create/loot_tables/blocks/old_factory_window_pane.json 3f6940f13ca705bad7cdb9a9b80a3ae84f70f80c data/create/loot_tables/blocks/orange_postbox.json d6323d4b30faa87cd4b5b8b815cb16f78296f203 data/create/loot_tables/blocks/orange_sail.json 119fc4c3055c09c7958ac405925a6b7be2081c6b data/create/loot_tables/blocks/orange_seat.json @@ -4345,6 +4354,7 @@ cd98d5d6b0ff6b56e8948a862070199c14f2ec10 data/create/recipes/oak_window_pane.jso 9e1eaa83597afe00485940018be874885f02b1f7 data/create/recipes/ochrum_from_stone_types_ochrum_stonecutting.json 308dbf17a3a418849d9db74e7f88af442f50025a data/create/recipes/ochrum_pillar_from_stone_types_ochrum_stonecutting.json b621fdf08968117bb16bdfdf1ae2f1d53229fb15 data/create/recipes/old_factory_window.json +30cf6728c6e7206d6fd0fb8bf72c4c9ec8e40669 data/create/recipes/old_factory_window_pane.json 4faec6e4889dac615eeda631ea346c5fe745ee86 data/create/recipes/ornate_iron_window.json f5e5a1c293b16690ab3e5c3941e24a99181133e5 data/create/recipes/ornate_iron_window_pane.json f07589f1079d13e0b93ce11a2d6e953e0842c5d0 data/create/recipes/oxidized_copper_shingle_slab.json @@ -4684,7 +4694,7 @@ c59c9fc0cdd45de659aa8023d36f9decb90f708c data/create/tags/items/vanilla_stripped 64441ac1daa64c81601b94b82b21c0ee862b6344 data/create/tags/items/vanilla_stripped_wood.json edf7390f09e622193bbc720ec51ba128ea1e96e6 data/curios/tags/items/head.json 10d5f0c1763f80860a39398ecc33dbbe43099471 data/forge/tags/blocks/glass/colorless.json -6f715416c891aaff77831878d1970c4dd7d24742 data/forge/tags/blocks/glass_panes.json +331218cbfb06e415de8af903418f192f2d875642 data/forge/tags/blocks/glass_panes.json 81b107ada9c6ac5679a21f8c6a006bf230f69c39 data/forge/tags/blocks/ores.json 81b107ada9c6ac5679a21f8c6a006bf230f69c39 data/forge/tags/blocks/ores/zinc.json e475ad1c52bffedfc544e5331a87c1f5c45149fd data/forge/tags/blocks/ores_in_ground/deepslate.json @@ -4712,7 +4722,7 @@ afdac448376ff5624f49cbf31feedf691ecbc4c5 data/forge/tags/items/armors/leggings.j 745512f10c4ba52f2c224607377e41011fb2ecfe data/forge/tags/items/flour.json 745512f10c4ba52f2c224607377e41011fb2ecfe data/forge/tags/items/flour/wheat.json 10d5f0c1763f80860a39398ecc33dbbe43099471 data/forge/tags/items/glass/colorless.json -6f715416c891aaff77831878d1970c4dd7d24742 data/forge/tags/items/glass_panes.json +331218cbfb06e415de8af903418f192f2d875642 data/forge/tags/items/glass_panes.json 01d32d3b7b033aff44c047bf289d696de0b0c715 data/forge/tags/items/ingots.json 5a7bffd1d604bc6ea8b35714ef02b95773240f90 data/forge/tags/items/ingots/brass.json ccf5b08295f6362a3f6b3b595f1de1bba4b224ec data/forge/tags/items/ingots/zinc.json diff --git a/src/generated/resources/assets/create/blockstates/old_factory_window_pane.json b/src/generated/resources/assets/create/blockstates/old_factory_window_pane.json new file mode 100644 index 0000000000..9a647d2106 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/old_factory_window_pane.json @@ -0,0 +1,77 @@ +{ + "multipart": [ + { + "apply": { + "model": "create:block/old_factory_window_pane_post" + } + }, + { + "apply": { + "model": "create:block/old_factory_window_pane_side" + }, + "when": { + "north": "true" + } + }, + { + "apply": { + "model": "create:block/old_factory_window_pane_noside" + }, + "when": { + "north": "false" + } + }, + { + "apply": { + "model": "create:block/old_factory_window_pane_side_alt" + }, + "when": { + "south": "true" + } + }, + { + "apply": { + "model": "create:block/old_factory_window_pane_noside_alt", + "y": 90 + }, + "when": { + "south": "false" + } + }, + { + "apply": { + "model": "create:block/old_factory_window_pane_side_alt", + "y": 90 + }, + "when": { + "west": "true" + } + }, + { + "apply": { + "model": "create:block/old_factory_window_pane_noside", + "y": 270 + }, + "when": { + "west": "false" + } + }, + { + "apply": { + "model": "create:block/old_factory_window_pane_side", + "y": 90 + }, + "when": { + "east": "true" + } + }, + { + "apply": { + "model": "create:block/old_factory_window_pane_noside_alt" + }, + "when": { + "east": "false" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index ed6cc2c862..90c6c8b5cf 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -596,6 +596,7 @@ "block.create.ochrum": "ɯnɹɥɔO", "block.create.ochrum_pillar": "ɹɐןןıԀ ɯnɹɥɔO", "block.create.old_factory_window": "ʍopuıM ʎɹoʇɔɐℲ pןO", + "block.create.old_factory_window_pane": "ǝuɐԀ ʍopuıM ʎɹoʇɔɐℲ pןO", "block.create.orange_postbox": "xoqʇsoԀ ǝbuɐɹO", "block.create.orange_sail": "ןıɐS ǝbuɐɹO", "block.create.orange_seat": "ʇɐǝS ǝbuɐɹO", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index db133fcf13..fb81e919f1 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -596,6 +596,7 @@ "block.create.ochrum": "Ochrum", "block.create.ochrum_pillar": "Ochrum Pillar", "block.create.old_factory_window": "Old Factory Window", + "block.create.old_factory_window_pane": "Old Factory Window Pane", "block.create.orange_postbox": "Orange Postbox", "block.create.orange_sail": "Orange Sail", "block.create.orange_seat": "Orange Seat", diff --git a/src/generated/resources/assets/create/models/block/old_factory_window_1.json b/src/generated/resources/assets/create/models/block/old_factory_window_1.json index a6613d26bf..53f0c301ff 100644 --- a/src/generated/resources/assets/create/models/block/old_factory_window_1.json +++ b/src/generated/resources/assets/create/models/block/old_factory_window_1.json @@ -2,6 +2,6 @@ "parent": "minecraft:block/cube_column", "textures": { "end": "create:block/palettes/old_factory_window_1_end", - "side": "create:block/palettes/old_factory_window_1" + "side": "create:block/palettes/old_factory_window" } } \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/old_factory_window_2.json b/src/generated/resources/assets/create/models/block/old_factory_window_2.json index fcc5631125..57b7462780 100644 --- a/src/generated/resources/assets/create/models/block/old_factory_window_2.json +++ b/src/generated/resources/assets/create/models/block/old_factory_window_2.json @@ -2,6 +2,6 @@ "parent": "minecraft:block/cube_column", "textures": { "end": "create:block/palettes/old_factory_window_2_end", - "side": "create:block/palettes/old_factory_window_2" + "side": "create:block/palettes/old_factory_window" } } \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/old_factory_window_3.json b/src/generated/resources/assets/create/models/block/old_factory_window_3.json index 9bb5fb2b0d..47d62a7a19 100644 --- a/src/generated/resources/assets/create/models/block/old_factory_window_3.json +++ b/src/generated/resources/assets/create/models/block/old_factory_window_3.json @@ -2,6 +2,6 @@ "parent": "minecraft:block/cube_column", "textures": { "end": "create:block/palettes/old_factory_window_3_end", - "side": "create:block/palettes/old_factory_window_3" + "side": "create:block/palettes/old_factory_window" } } \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/old_factory_window_4.json b/src/generated/resources/assets/create/models/block/old_factory_window_4.json index 55edc182e8..a4ec0f60aa 100644 --- a/src/generated/resources/assets/create/models/block/old_factory_window_4.json +++ b/src/generated/resources/assets/create/models/block/old_factory_window_4.json @@ -2,6 +2,6 @@ "parent": "minecraft:block/cube_column", "textures": { "end": "create:block/palettes/old_factory_window_4_end", - "side": "create:block/palettes/old_factory_window_4" + "side": "create:block/palettes/old_factory_window" } } \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/old_factory_window_pane_noside.json b/src/generated/resources/assets/create/models/block/old_factory_window_pane_noside.json new file mode 100644 index 0000000000..6f79e0c920 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/old_factory_window_pane_noside.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/connected_glass_pane/noside", + "textures": { + "edge": "create:block/palettes/old_factory_window_pane_top", + "pane": "create:block/palettes/old_factory_window" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/old_factory_window_pane_noside_alt.json b/src/generated/resources/assets/create/models/block/old_factory_window_pane_noside_alt.json new file mode 100644 index 0000000000..ca3ca515b8 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/old_factory_window_pane_noside_alt.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/connected_glass_pane/noside_alt", + "textures": { + "edge": "create:block/palettes/old_factory_window_pane_top", + "pane": "create:block/palettes/old_factory_window" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/old_factory_window_pane_post.json b/src/generated/resources/assets/create/models/block/old_factory_window_pane_post.json new file mode 100644 index 0000000000..de1b880cb0 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/old_factory_window_pane_post.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/connected_glass_pane/post", + "textures": { + "edge": "create:block/palettes/old_factory_window_pane_top", + "pane": "create:block/palettes/old_factory_window" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/old_factory_window_pane_side.json b/src/generated/resources/assets/create/models/block/old_factory_window_pane_side.json new file mode 100644 index 0000000000..2d2a2ca1fd --- /dev/null +++ b/src/generated/resources/assets/create/models/block/old_factory_window_pane_side.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/connected_glass_pane/side", + "textures": { + "edge": "create:block/palettes/old_factory_window_pane_top", + "pane": "create:block/palettes/old_factory_window" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/old_factory_window_pane_side_alt.json b/src/generated/resources/assets/create/models/block/old_factory_window_pane_side_alt.json new file mode 100644 index 0000000000..6c2bfc1ba5 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/old_factory_window_pane_side_alt.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/connected_glass_pane/side_alt", + "textures": { + "edge": "create:block/palettes/old_factory_window_pane_top", + "pane": "create:block/palettes/old_factory_window" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/old_factory_window.json b/src/generated/resources/assets/create/models/item/old_factory_window.json index a6613d26bf..53f0c301ff 100644 --- a/src/generated/resources/assets/create/models/item/old_factory_window.json +++ b/src/generated/resources/assets/create/models/item/old_factory_window.json @@ -2,6 +2,6 @@ "parent": "minecraft:block/cube_column", "textures": { "end": "create:block/palettes/old_factory_window_1_end", - "side": "create:block/palettes/old_factory_window_1" + "side": "create:block/palettes/old_factory_window" } } \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/old_factory_window_pane.json b/src/generated/resources/assets/create/models/item/old_factory_window_pane.json new file mode 100644 index 0000000000..de6e6cf3a9 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/old_factory_window_pane.json @@ -0,0 +1,7 @@ +{ + "parent": "create:item/pane", + "textures": { + "edge": "create:block/palettes/old_factory_window_pane_top", + "pane": "create:block/palettes/old_factory_window" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/old_factory_window_pane.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/old_factory_window_pane.json new file mode 100644 index 0000000000..ef43ce9f98 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/old_factory_window_pane.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_ingredient": { + "conditions": { + "items": [ + { + "items": [ + "create:old_factory_window" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:old_factory_window_pane" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_ingredient", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:old_factory_window_pane" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/old_factory_window_pane.json b/src/generated/resources/data/create/loot_tables/blocks/old_factory_window_pane.json new file mode 100644 index 0000000000..fefa4592dc --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/old_factory_window_pane.json @@ -0,0 +1,31 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:old_factory_window_pane" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/old_factory_window_pane" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/old_factory_window_pane.json b/src/generated/resources/data/create/recipes/old_factory_window_pane.json new file mode 100644 index 0000000000..20874e2bef --- /dev/null +++ b/src/generated/resources/data/create/recipes/old_factory_window_pane.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "create:old_factory_window" + } + }, + "pattern": [ + "###", + "###" + ], + "result": { + "count": 16, + "item": "create:old_factory_window_pane" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/blocks/glass_panes.json b/src/generated/resources/data/forge/tags/blocks/glass_panes.json index 378292fc8e..a5e8adda59 100644 --- a/src/generated/resources/data/forge/tags/blocks/glass_panes.json +++ b/src/generated/resources/data/forge/tags/blocks/glass_panes.json @@ -16,6 +16,7 @@ "create:cherry_window_pane", "create:bamboo_window_pane", "create:ornate_iron_window_pane", - "create:industrial_iron_window_pane" + "create:industrial_iron_window_pane", + "create:old_factory_window_pane" ] } \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/glass_panes.json b/src/generated/resources/data/forge/tags/items/glass_panes.json index 378292fc8e..a5e8adda59 100644 --- a/src/generated/resources/data/forge/tags/items/glass_panes.json +++ b/src/generated/resources/data/forge/tags/items/glass_panes.json @@ -16,6 +16,7 @@ "create:cherry_window_pane", "create:bamboo_window_pane", "create:ornate_iron_window_pane", - "create:industrial_iron_window_pane" + "create:industrial_iron_window_pane", + "create:old_factory_window_pane" ] } \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllSpriteShifts.java b/src/main/java/com/simibubi/create/AllSpriteShifts.java index 2fa7541792..a9a49c9e1e 100644 --- a/src/main/java/com/simibubi/create/AllSpriteShifts.java +++ b/src/main/java/com/simibubi/create/AllSpriteShifts.java @@ -43,10 +43,10 @@ public class AllSpriteShifts { ORNATE_IRON_WINDOW = vertical("palettes/ornate_iron_window"), INDUSTRIAL_IRON_WINDOW = getCT(AllCTTypes.RECTANGLE, "palettes/industrial_iron_window"), - OLD_FACTORY_WINDOW_1 = getCT(AllCTTypes.RECTANGLE, "palettes/old_factory_window_1"), - OLD_FACTORY_WINDOW_2 = getCT(AllCTTypes.RECTANGLE, "palettes/old_factory_window_2"), - OLD_FACTORY_WINDOW_3 = getCT(AllCTTypes.RECTANGLE, "palettes/old_factory_window_3"), - OLD_FACTORY_WINDOW_4 = getCT(AllCTTypes.RECTANGLE, "palettes/old_factory_window_4"); + OLD_FACTORY_WINDOW_1 = getCT(AllCTTypes.RECTANGLE, "palettes/old_factory_window", "palettes/old_factory_window_1"), + OLD_FACTORY_WINDOW_2 = getCT(AllCTTypes.RECTANGLE, "palettes/old_factory_window", "palettes/old_factory_window_2"), + OLD_FACTORY_WINDOW_3 = getCT(AllCTTypes.RECTANGLE, "palettes/old_factory_window", "palettes/old_factory_window_3"), + OLD_FACTORY_WINDOW_4 = getCT(AllCTTypes.RECTANGLE, "palettes/old_factory_window", "palettes/old_factory_window_4"); public static final CTSpriteShiftEntry CRAFTER_SIDE = vertical("crafter_side"), CRAFTER_OTHERSIDE = horizontal("crafter_side"), diff --git a/src/main/java/com/simibubi/create/content/decoration/palettes/AllPaletteBlocks.java b/src/main/java/com/simibubi/create/content/decoration/palettes/AllPaletteBlocks.java index 6c41c3815d..694c23327f 100644 --- a/src/main/java/com/simibubi/create/content/decoration/palettes/AllPaletteBlocks.java +++ b/src/main/java/com/simibubi/create/content/decoration/palettes/AllPaletteBlocks.java @@ -8,8 +8,6 @@ import static com.simibubi.create.foundation.data.WindowGen.framedGlassPane; import static com.simibubi.create.foundation.data.WindowGen.woodenWindowBlock; import static com.simibubi.create.foundation.data.WindowGen.woodenWindowPane; -import java.util.List; - import com.simibubi.create.AllBlocks; import com.simibubi.create.AllCreativeModeTabs; import com.simibubi.create.AllSpriteShifts; @@ -90,9 +88,7 @@ public class AllPaletteBlocks { OLD_FACTORY_WINDOW = WindowGen .randomisedWindowBlock("old_factory_window", AllBlocks.INDUSTRIAL_IRON_BLOCK, () -> RenderType::translucent, true, () -> MapColor.TERRACOTTA_LIGHT_GRAY) - .onRegister(CreateRegistrate.connectedTextures(() -> new RandomisedWindowCTBehaviour( - List.of(AllSpriteShifts.OLD_FACTORY_WINDOW_1, AllSpriteShifts.OLD_FACTORY_WINDOW_2, - AllSpriteShifts.OLD_FACTORY_WINDOW_3, AllSpriteShifts.OLD_FACTORY_WINDOW_4)))) + .onRegister(CreateRegistrate.connectedTextures(() -> new OldFactoryWindowCTBehaviour())) .register(); public static final BlockEntry OAK_WINDOW_PANE = @@ -108,9 +104,13 @@ public class AllPaletteBlocks { CHERRY_WINDOW_PANE = woodenWindowPane(WoodType.CHERRY, CHERRY_WINDOW), BAMBOO_WINDOW_PANE = woodenWindowPane(WoodType.BAMBOO, BAMBOO_WINDOW), ORNATE_IRON_WINDOW_PANE = customWindowPane("ornate_iron_window", ORNATE_IRON_WINDOW, - () -> AllSpriteShifts.ORNATE_IRON_WINDOW, () -> RenderType::cutoutMipped), + () -> AllSpriteShifts.ORNATE_IRON_WINDOW, () -> RenderType::cutoutMipped).register(), INDUSTRIAL_IRON_WINDOW_PANE = customWindowPane("industrial_iron_window", INDUSTRIAL_IRON_WINDOW, - () -> AllSpriteShifts.INDUSTRIAL_IRON_WINDOW, () -> RenderType::cutoutMipped); + () -> AllSpriteShifts.INDUSTRIAL_IRON_WINDOW, () -> RenderType::cutoutMipped).register(), + OLD_FACTORY_WINDOW_PANE = + customWindowPane("old_factory_window", OLD_FACTORY_WINDOW, null, () -> RenderType::translucent) + .onRegister(CreateRegistrate.connectedTextures(() -> new OldFactoryWindowPaneCTBehaviour())) + .register(); static { AllPaletteStoneTypes.register(REGISTRATE); diff --git a/src/main/java/com/simibubi/create/content/decoration/palettes/RandomisedWindowCTBehaviour.java b/src/main/java/com/simibubi/create/content/decoration/palettes/OldFactoryWindowCTBehaviour.java similarity index 60% rename from src/main/java/com/simibubi/create/content/decoration/palettes/RandomisedWindowCTBehaviour.java rename to src/main/java/com/simibubi/create/content/decoration/palettes/OldFactoryWindowCTBehaviour.java index f2afdeb7a8..dcc849408f 100644 --- a/src/main/java/com/simibubi/create/content/decoration/palettes/RandomisedWindowCTBehaviour.java +++ b/src/main/java/com/simibubi/create/content/decoration/palettes/OldFactoryWindowCTBehaviour.java @@ -2,8 +2,10 @@ package com.simibubi.create.content.decoration.palettes; import java.util.List; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import com.simibubi.create.AllSpriteShifts; import com.simibubi.create.foundation.block.connected.AllCTTypes; import com.simibubi.create.foundation.block.connected.CTSpriteShiftEntry; import com.simibubi.create.foundation.block.connected.CTType; @@ -13,28 +15,36 @@ import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; +import net.minecraft.util.RandomSource; import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.block.state.BlockState; -public class RandomisedWindowCTBehaviour extends ConnectedTextureBehaviour.Base { +public class OldFactoryWindowCTBehaviour extends ConnectedTextureBehaviour.Base { private List shifts; - public RandomisedWindowCTBehaviour(List shifts) { - this.shifts = shifts; + public OldFactoryWindowCTBehaviour() { + this.shifts = List.of(AllSpriteShifts.OLD_FACTORY_WINDOW_1, AllSpriteShifts.OLD_FACTORY_WINDOW_2, + AllSpriteShifts.OLD_FACTORY_WINDOW_3, AllSpriteShifts.OLD_FACTORY_WINDOW_4); + } + + @Override + public @Nullable CTSpriteShiftEntry getShift(BlockState state, RandomSource rand, Direction direction, + @NotNull TextureAtlasSprite sprite) { + if (direction.getAxis() == Axis.Y || sprite == null) + return null; + CTSpriteShiftEntry entry = shifts.get(rand.nextInt(shifts.size())); + if (entry.getOriginal() == sprite) + return entry; + return super.getShift(state, rand, direction, sprite); } @Override public @Nullable CTSpriteShiftEntry getShift(BlockState state, Direction direction, @Nullable TextureAtlasSprite sprite) { - if (direction.getAxis() == Axis.Y || sprite == null) - return null; - for (CTSpriteShiftEntry entry : shifts) - if (entry.getOriginal() == sprite) - return entry; return null; } - + @Override public @Nullable CTType getDataType(BlockAndTintGetter world, BlockPos pos, BlockState state, Direction direction) { return AllCTTypes.RECTANGLE; diff --git a/src/main/java/com/simibubi/create/content/decoration/palettes/OldFactoryWindowPaneCTBehaviour.java b/src/main/java/com/simibubi/create/content/decoration/palettes/OldFactoryWindowPaneCTBehaviour.java new file mode 100644 index 0000000000..767cb328e4 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/decoration/palettes/OldFactoryWindowPaneCTBehaviour.java @@ -0,0 +1,54 @@ +package com.simibubi.create.content.decoration.palettes; + +import java.util.List; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import com.simibubi.create.AllSpriteShifts; +import com.simibubi.create.foundation.block.connected.AllCTTypes; +import com.simibubi.create.foundation.block.connected.CTSpriteShiftEntry; +import com.simibubi.create.foundation.block.connected.CTType; +import com.simibubi.create.foundation.block.connected.GlassPaneCTBehaviour; + +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Direction.Axis; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.BlockAndTintGetter; +import net.minecraft.world.level.block.state.BlockState; + +public class OldFactoryWindowPaneCTBehaviour extends GlassPaneCTBehaviour { + + private List shifts; + + public OldFactoryWindowPaneCTBehaviour() { + super(null); + this.shifts = List.of(AllSpriteShifts.OLD_FACTORY_WINDOW_1, AllSpriteShifts.OLD_FACTORY_WINDOW_2, + AllSpriteShifts.OLD_FACTORY_WINDOW_3, AllSpriteShifts.OLD_FACTORY_WINDOW_4); + } + + @Override + public @Nullable CTSpriteShiftEntry getShift(BlockState state, RandomSource rand, Direction direction, + @NotNull TextureAtlasSprite sprite) { + if (direction.getAxis() == Axis.Y || sprite == null) + return null; + CTSpriteShiftEntry entry = shifts.get(rand.nextInt(shifts.size())); + if (entry.getOriginal() == sprite) + return entry; + return super.getShift(state, rand, direction, sprite); + } + + @Override + public @Nullable CTSpriteShiftEntry getShift(BlockState state, Direction direction, + @Nullable TextureAtlasSprite sprite) { + return null; + } + + @Override + public @Nullable CTType getDataType(BlockAndTintGetter world, BlockPos pos, BlockState state, Direction direction) { + return AllCTTypes.RECTANGLE; + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/block/connected/CTModel.java b/src/main/java/com/simibubi/create/foundation/block/connected/CTModel.java index 20ddde4b4f..29c54f9989 100644 --- a/src/main/java/com/simibubi/create/foundation/block/connected/CTModel.java +++ b/src/main/java/com/simibubi/create/foundation/block/connected/CTModel.java @@ -76,7 +76,7 @@ public class CTModel extends BakedModelWrapperWithData { if (index == -1) continue; - CTSpriteShiftEntry spriteShift = behaviour.getShift(state, quad.getDirection(), quad.getSprite()); + CTSpriteShiftEntry spriteShift = behaviour.getShift(state, rand, quad.getDirection(), quad.getSprite()); if (spriteShift == null) continue; if (quad.getSprite() != spriteShift.getOriginal()) diff --git a/src/main/java/com/simibubi/create/foundation/block/connected/ConnectedTextureBehaviour.java b/src/main/java/com/simibubi/create/foundation/block/connected/ConnectedTextureBehaviour.java index 14ddabc41a..d6ca27b432 100644 --- a/src/main/java/com/simibubi/create/foundation/block/connected/ConnectedTextureBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/block/connected/ConnectedTextureBehaviour.java @@ -8,12 +8,19 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; import net.minecraft.core.Direction.AxisDirection; +import net.minecraft.util.RandomSource; import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; public abstract class ConnectedTextureBehaviour { + @Nullable + public CTSpriteShiftEntry getShift(BlockState state, RandomSource rand, Direction direction, + @NotNull TextureAtlasSprite sprite) { + return getShift(state, direction, sprite); + } + @Nullable public abstract CTSpriteShiftEntry getShift(BlockState state, Direction direction, @NotNull TextureAtlasSprite sprite); diff --git a/src/main/java/com/simibubi/create/foundation/data/WindowGen.java b/src/main/java/com/simibubi/create/foundation/data/WindowGen.java index 6f3a276e8b..b94a1e6604 100644 --- a/src/main/java/com/simibubi/create/foundation/data/WindowGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/WindowGen.java @@ -72,24 +72,23 @@ public class WindowGen { Supplier color) { ResourceLocation end_texture = Create.asResource(palettesDir() + name + "_end"); ResourceLocation side_texture = Create.asResource(palettesDir() + name); - Function sides = i -> Create.asResource(palettesDir() + name + "_" + i); Function ends = i -> Create.asResource(palettesDir() + name + "_" + i + "_end"); return windowBlock(name, ingredient, null, renderType, translucent, n -> end_texture, n -> side_texture, color) .blockstate((c, p) -> p.simpleBlock(c.get(), ConfiguredModel.builder() .modelFile(p.models() - .cubeColumn(c.getName() + "_1", sides.apply(1), ends.apply(1))) + .cubeColumn(c.getName() + "_1", side_texture, ends.apply(1))) .nextModel() .modelFile(p.models() - .cubeColumn(c.getName() + "_2", sides.apply(2), ends.apply(2))) + .cubeColumn(c.getName() + "_2", side_texture, ends.apply(2))) .nextModel() .modelFile(p.models() - .cubeColumn(c.getName() + "_3", sides.apply(3), ends.apply(3))) + .cubeColumn(c.getName() + "_3", side_texture, ends.apply(3))) .nextModel() .modelFile(p.models() - .cubeColumn(c.getName() + "_4", sides.apply(4), ends.apply(4))) + .cubeColumn(c.getName() + "_4", side_texture, ends.apply(4))) .build())) .item() - .model((c, p) -> p.cubeColumn(c.getName(), sides.apply(1), ends.apply(1))) + .model((c, p) -> p.cubeColumn(c.getName(), side_texture, ends.apply(1))) .build(); } @@ -112,8 +111,9 @@ public class WindowGen { translucent, end_texture, side_texture, planksBlock::defaultMapColor).register(); } - public static BlockBuilder windowBlock(String name, Supplier ingredient, - Supplier ct, Supplier> renderType, boolean translucent, + public static BlockBuilder windowBlock(String name, + Supplier ingredient, Supplier ct, + Supplier> renderType, boolean translucent, NonNullFunction endTexture, NonNullFunction sideTexture, Supplier color) { return REGISTRATE.block(name, p -> new WindowBlock(p, translucent)) @@ -163,11 +163,13 @@ public class WindowGen { ResourceLocation itemSideTexture = Create.asResource(palettesDir() + name); ResourceLocation topTexture = Create.asResource(palettesDir() + "framed_glass_pane_top"); Supplier> renderType = () -> RenderType::cutoutMipped; - return connectedGlassPane(name, parent, ctshift, sideTexture, itemSideTexture, topTexture, renderType); + return connectedGlassPane(name, parent, ctshift, sideTexture, itemSideTexture, topTexture, renderType) + .register(); } - public static BlockEntry customWindowPane(String name, Supplier parent, - Supplier ctshift, Supplier> renderType) { + public static BlockBuilder customWindowPane(String name, + Supplier parent, Supplier ctshift, + Supplier> renderType) { ResourceLocation topTexture = Create.asResource(palettesDir() + name + "_pane_top"); ResourceLocation sideTexture = Create.asResource(palettesDir() + name); return connectedGlassPane(name, parent, ctshift, sideTexture, sideTexture, topTexture, renderType); @@ -185,7 +187,7 @@ public class WindowGen { ResourceLocation topTexture = new ResourceLocation("block/" + woodName + "_planks"); ResourceLocation sideTexture = Create.asResource(palettesDir() + name); return connectedGlassPane(name, parent, () -> AllSpriteShifts.getWoodenWindow(woodType), sideTexture, - sideTexture, topTexture, renderType); + sideTexture, topTexture, renderType).register(); } public static BlockEntry standardGlassPane(String name, Supplier parent, @@ -193,14 +195,14 @@ public class WindowGen { NonNullBiConsumer, RegistrateBlockstateProvider> stateProvider = (c, p) -> p.paneBlock(c.get(), sideTexture, topTexture); return glassPane(name, parent, sideTexture, topTexture, GlassPaneBlock::new, renderType, $ -> { - }, stateProvider); + }, stateProvider).register(); } - private static BlockEntry connectedGlassPane(String name, Supplier parent, - Supplier ctshift, ResourceLocation sideTexture, ResourceLocation itemSideTexture, - ResourceLocation topTexture, Supplier> renderType) { - NonNullConsumer connectedTextures = - connectedTextures(() -> new GlassPaneCTBehaviour(ctshift.get())); + private static BlockBuilder connectedGlassPane(String name, + Supplier parent, Supplier ctshift, ResourceLocation sideTexture, + ResourceLocation itemSideTexture, ResourceLocation topTexture, Supplier> renderType) { + NonNullConsumer connectedTextures = ctshift == null ? $ -> { + } : connectedTextures(() -> new GlassPaneCTBehaviour(ctshift.get())); String CGPparents = "block/connected_glass_pane/"; String prefix = name + "_pane_"; @@ -227,9 +229,10 @@ public class WindowGen { .texture("edge", topTexture); } - private static BlockEntry glassPane(String name, Supplier parent, - ResourceLocation sideTexture, ResourceLocation topTexture, NonNullFunction factory, - Supplier> renderType, NonNullConsumer connectedTextures, + private static BlockBuilder glassPane(String name, + Supplier parent, ResourceLocation sideTexture, ResourceLocation topTexture, + NonNullFunction factory, Supplier> renderType, + NonNullConsumer connectedTextures, NonNullBiConsumer, RegistrateBlockstateProvider> stateProvider) { name += "_pane"; @@ -253,8 +256,7 @@ public class WindowGen { .model((c, p) -> p.withExistingParent(c.getName(), Create.asResource("item/pane")) .texture("pane", sideTexture) .texture("edge", topTexture)) - .build() - .register(); + .build(); } private static String palettesDir() { diff --git a/src/main/resources/assets/create/textures/block/palettes/old_factory_window_1.png b/src/main/resources/assets/create/textures/block/palettes/old_factory_window.png similarity index 100% rename from src/main/resources/assets/create/textures/block/palettes/old_factory_window_1.png rename to src/main/resources/assets/create/textures/block/palettes/old_factory_window.png diff --git a/src/main/resources/assets/create/textures/block/palettes/old_factory_window_2.png b/src/main/resources/assets/create/textures/block/palettes/old_factory_window_2.png deleted file mode 100644 index b1f11e8ab367a616fa42e938758497dd646f15fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 560 zcmV-00?+-4P)@)CW7K11Jtp%W_-EJ)pX z0K{4`!B8nx5>ngO#(%>Q`^qTE0CzdM-}!XEKj&QI{LSfdrz7~EGZ!W1{+`S8{w|@4 zkWN>V+wM)Y0)_BH1;F|6EdZ1G696j72vx*n{zRxERFdiV>FZZWr%Mnd=-%Ibz9UqT zt{A838rJ;#4|f1WHkfsLM_m^HKUBnN$|O(7W*Ku)Y9s)=-RAh9uM3&Yia#Ev494~~ zWQ&&w@5`s~2Hh9@KH&|PDfxqPW@E}Mo}jo0p9?6(qSG2b$n5A-}AKKel{gf3q))b#74nzB(FAU z-7nWYaxs#(d0J4CBkX0116MZN)aZ1qttL8jB?5CLV^2C8lWOf7Bk1#D&!YwWi-)~U zkBeISD&YjMD#Q;Jzmrm{(&U_uMFAL>!?R^iIyfEcFRwTM0I>ECRFZK&n_~X*@)CW7K11Jtp%W_-EJ)pX z0K{4`!B8nx5>ngO#(%>Q`^qTE0CzdM-}!XEKj&QI{LSfdrz7~EGZ!W1{+`S8{w|@4 zkWN>V+wM)Y0)_BH1;F|6EdZ1G696j72vx*n{zRxERFdiV>FZZWr%Mnd=-%Ibz9UqT zt{A838rJ;#4|f1WHkfsLM_m^HKUBnN$|O(7W*Ku)Y9s)=-RAh9uM3&Yia#Ev494~~ zWQ&&w@5`s~2Hh9@KH&|PDfxqPW@E}Mo}jo0p9?6(qSG2b$n5A-}AKKel{gf3q))b#74nzB(FAU z-7nWYaxs#(d0J4CBkX0116MZN)aZ1qttL8jB?5CLV^2C8lWOf7Bk1#D&!YwWi-)~U zkBeISD&YjMD#Q;Jzmrm{(&U_uMFAL>!?R^iIyfEcFRwTM0I>ECRFZK&n_~X*@)CW7K11Jtp%W_-EJ)pX z0K{4`!B8nx5>ngO#(%>Q`^qTE0CzdM-}!XEKj&QI{LSfdrz7~EGZ!W1{+`S8{w|@4 zkWN>V+wM)Y0)_BH1;F|6EdZ1G696j72vx*n{zRxERFdiV>FZZWr%Mnd=-%Ibz9UqT zt{A838rJ;#4|f1WHkfsLM_m^HKUBnN$|O(7W*Ku)Y9s)=-RAh9uM3&Yia#Ev494~~ zWQ&&w@5`s~2Hh9@KH&|PDfxqPW@E}Mo}jo0p9?6(qSG2b$n5A-}AKKel{gf3q))b#74nzB(FAU z-7nWYaxs#(d0J4CBkX0116MZN)aZ1qttL8jB?5CLV^2C8lWOf7Bk1#D&!YwWi-)~U zkBeISD&YjMD#Q;Jzmrm{(&U_uMFAL>!?R^iIyfEcFRwTM0I>ECRFZK&n_~X*NS%G|s0G|-oV0SxP6T_@XUsr46I6vn=7i(i%L!e}OMiC2;;wTC73;quQ4ELJ% zMgqk+3p^r=85sBuf-vKbiP>*~f?_4E5hcO-X(i=}MX3w{iJ5sNdVa1U3Z{C7-8ZuQ0pzeUNHMZ9FalX#Kr9VqgZ!Yu$P5-|0!~j15jcDI|IlE21dpPj0+%Ug6v~m05NA0kPQM%KvS8(DuXO7 zfGnskLjwbltl-Yo5$pNPKn~OLba4#P2u@CDXJB)aVD>ULbe25Ay6Fgo0T-G@yGywqTN?Sz$ literal 0 HcmV?d00001 From b0749144863859c5953fdc57f49fb694a8740358 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Wed, 11 Dec 2024 21:55:35 +0100 Subject: [PATCH 176/515] New textures for category screen --- .../stockTicker/StockKeeperCategoryMenu.java | 4 +- .../StockKeeperCategoryScreen.java | 78 +++++++++++------- .../create/foundation/gui/AllGuiTextures.java | 17 ++-- .../textures/gui/stock_keeper_categories.png | Bin 2229 -> 1728 bytes 4 files changed, 61 insertions(+), 38 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryMenu.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryMenu.java index d30e6d21ff..a76b1fad23 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryMenu.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryMenu.java @@ -55,8 +55,8 @@ public class StockKeeperCategoryMenu extends MenuBase { @Override protected void addSlots() { - addSlot(new InactiveItemHandlerSlot(proxyInventory, 0, 23, 41)); - addPlayerSlots(26, 123); + addSlot(new InactiveItemHandlerSlot(proxyInventory, 0, 16, 24)); + addPlayerSlots(18, 106); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryScreen.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryScreen.java index 1406d206ef..3950a9e9e0 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryScreen.java @@ -59,6 +59,8 @@ public class StockKeeperCategoryScreen extends AbstractSimiContainerScreen(menu.contentHolder.categories); @@ -68,26 +70,27 @@ public class StockKeeperCategoryScreen extends AbstractSimiContainerScreen minecraft.player.closeContainer()); addRenderableWidget(confirmButton); stopEditing(); - extraAreas = ImmutableList.of(new Rect2i(leftPos + bg.getWidth(), topPos + bg.getHeight() - 40, 48, 40)); + extraAreas = ImmutableList.of(new Rect2i(leftPos + bg.getWidth(), topPos + imageHeight - 40, 48, 40)); } protected void startEditing(int index) { confirmButton.visible = false; - editorConfirm = new IconButton(leftPos + 36 + 143, topPos + 55 + 18, AllIcons.I_CONFIRM); + editorConfirm = new IconButton(leftPos + 36 + 131, topPos + 59, AllIcons.I_CONFIRM); menu.slotsActive = true; - editorEditBox = new EditBox(font, leftPos + 53, topPos + 45, 128, 10, Components.empty()); + editorEditBox = new EditBox(font, leftPos + 47, topPos + 28, 124, 10, Components.empty()); editorEditBox.setTextColor(0xffeeeeee); editorEditBox.setBordered(false); editorEditBox.setFocused(false); @@ -170,7 +173,7 @@ public class StockKeeperCategoryScreen extends AbstractSimiContainerScreen 20 ? "..." : ""), - 36, 4, 0x656565, false); + 35, 5, 0x656565, false); matrixStack.popPose(); return cardHeight; @@ -359,7 +358,15 @@ public class StockKeeperCategoryScreen extends AbstractSimiContainerScreen 0) { chaseTarget -= pDelta * 12; @@ -402,8 +409,8 @@ public class StockKeeperCategoryScreen extends AbstractSimiContainerScreenat(leftPos + AllGuiTextures.STOCK_KEEPER_CATEGORY.getWidth() + 3, - topPos + AllGuiTextures.STOCK_KEEPER_CATEGORY.getHeight() - 44, -190) + .GuiRenderBuilder>at(leftPos + AllGuiTextures.STOCK_KEEPER_CATEGORY.getWidth() + 12, + topPos + imageHeight - 39, -190) .scale(3) .render(graphics); @@ -436,30 +443,45 @@ public class StockKeeperCategoryScreen extends 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 C|B{6O From 7ac229c8dfd532589471fa2fdd39ca57bdd28bcf Mon Sep 17 00:00:00 2001 From: zelophed Date: Wed, 11 Dec 2024 21:58:33 +0100 Subject: [PATCH 177/515] for the acute observer --- .../create/foundation/render/PlayerSkyhookRenderer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/simibubi/create/foundation/render/PlayerSkyhookRenderer.java b/src/main/java/com/simibubi/create/foundation/render/PlayerSkyhookRenderer.java index d80d7f8188..d122c39144 100644 --- a/src/main/java/com/simibubi/create/foundation/render/PlayerSkyhookRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/render/PlayerSkyhookRenderer.java @@ -66,14 +66,14 @@ public class PlayerSkyhookRenderer { offsetY = model.leftArm.y; model.leftArm.x = offsetX * Mth.cos(bodySwing) - offsetY * Mth.sin(bodySwing); model.leftArm.y = offsetX * Mth.sin(bodySwing) + offsetY * Mth.cos(bodySwing); - model.leftArm.zRot = -AngleHelper.rad(5) + 0.5f * bodySwing + limbSwing; + model.leftArm.zRot = -AngleHelper.rad(20) + 0.5f * bodySwing + limbSwing; model.rightLeg.y -= 0.2f; offsetX = model.rightLeg.x; offsetY = model.rightLeg.y; model.rightLeg.x = offsetX * Mth.cos(bodySwing) - offsetY * Mth.sin(bodySwing); model.rightLeg.y = offsetX * Mth.sin(bodySwing) + offsetY * Mth.cos(bodySwing); - model.rightLeg.xRot = -AngleHelper.rad(10); + model.rightLeg.xRot = -AngleHelper.rad(25); model.rightLeg.zRot = AngleHelper.rad(10) + 0.5f * bodySwing + limbSwing; model.leftLeg.y -= 0.2f; From db36ecb10329b3acabb44e4b91b82a25f90849f7 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Wed, 11 Dec 2024 21:29:36 -0500 Subject: [PATCH 178/515] Reaching new heights - Bump the default max rope length to 384 to account for the changed world height in recent minecraft updates --- .../com/simibubi/create/infrastructure/config/CKinetics.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/simibubi/create/infrastructure/config/CKinetics.java b/src/main/java/com/simibubi/create/infrastructure/config/CKinetics.java index 68f41d60ce..707e12238f 100644 --- a/src/main/java/com/simibubi/create/infrastructure/config/CKinetics.java +++ b/src/main/java/com/simibubi/create/infrastructure/config/CKinetics.java @@ -36,7 +36,7 @@ public class CKinetics extends ConfigBase { i(ContraptionData.DEFAULT_LIMIT, 0, "maxDataSize", Comments.bytes, Comments.maxDataDisable, Comments.maxDataSize, Comments.maxDataSize2); public final ConfigInt maxChassisRange = i(16, 1, "maxChassisRange", Comments.maxChassisRange); public final ConfigInt maxPistonPoles = i(64, 1, "maxPistonPoles", Comments.maxPistonPoles); - public final ConfigInt maxRopeLength = i(256, 1, "maxRopeLength", Comments.maxRopeLength); + public final ConfigInt maxRopeLength = i(384, 1, "maxRopeLength", Comments.maxRopeLength); public final ConfigInt maxCartCouplingLength = i(32, 1, "maxCartCouplingLength", Comments.maxCartCouplingLength); public final ConfigInt rollerFillDepth = i(12, 1, "rollerFillDepth", Comments.rollerFillDepth); public final ConfigBool survivalContraptionPickup = b(true, "survivalContraptionPickup", Comments.survivalContraptionPickup); From 13316ac7061dfd0f812858ad98a64b641f86257d Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Thu, 12 Dec 2024 12:48:38 +0100 Subject: [PATCH 179/515] Collectors Edition - Standard filters now ignore package style and fragment data when comparing them - Refactored package type registration - Added placeholders for rare, custom packages --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 18 +++--- .../resources/assets/create/lang/en_ud.json | 3 + .../resources/assets/create/lang/en_us.json | 3 + .../models/item/cardboard_package_10x12.json | 2 +- .../models/item/cardboard_package_10x8.json | 2 +- .../models/item/cardboard_package_12x10.json | 2 +- .../models/item/cardboard_package_12x12.json | 2 +- .../models/item/rare_creeper_package.json | 6 ++ .../models/item/rare_kryppers_package.json | 6 ++ .../create/models/item/rare_simi_package.json | 6 ++ .../data/create/tags/items/packages.json | 11 ++++ .../simibubi/create/AllCreativeModeTabs.java | 13 ++-- .../java/com/simibubi/create/AllItems.java | 23 +++---- .../com/simibubi/create/AllPartialModels.java | 11 ++-- .../java/com/simibubi/create/AllTags.java | 1 + .../content/kinetics/belt/BeltBlock.java | 2 +- .../belt/transport/TransportedItemStack.java | 2 +- .../content/logistics/box/PackageItem.java | 41 ++++--------- .../logistics/box/PackageRenderer.java | 5 +- .../content/logistics/box/PackageStyles.java | 58 ++++++++++++++++++ .../factoryBoard/FactoryPanelScreen.java | 4 +- .../content/logistics/filter/FilterItem.java | 34 +++++++++- .../logistics/filter/FilterItemStack.java | 2 +- .../logistics/filter/PackageFilterScreen.java | 4 +- .../frogport/FrogportBlockEntity.java | 6 +- .../logistics/packager/PackagerBlock.java | 2 +- .../packager/PackagerItemHandler.java | 2 +- .../foundation/data/BuilderTransformers.java | 29 ++++++--- .../cardboard_10x12.json | 4 +- .../{packages => package}/cardboard_10x8.json | 4 +- .../cardboard_12x10.json | 4 +- .../cardboard_12x12.json | 4 +- .../models/item/package/custom_12x10.json | 24 ++++++++ .../rigging_10x12.json} | 4 +- .../rigging_10x8.json} | 4 +- .../rigging_12x10.json} | 4 +- .../rigging_12x12.json} | 4 +- .../{entity => item}/package/cardboard.png | Bin .../package/cardboard_particle.png | Bin .../textures/item/package/rare_creeper.png | Bin 0 -> 762 bytes .../textures/item/package/rare_kryppers.png | Bin 0 -> 762 bytes .../textures/item/package/rare_simi.png | Bin 0 -> 762 bytes .../assets/minecraft/atlases/blocks.json | 8 --- 43 files changed, 254 insertions(+), 110 deletions(-) create mode 100644 src/generated/resources/assets/create/models/item/rare_creeper_package.json create mode 100644 src/generated/resources/assets/create/models/item/rare_kryppers_package.json create mode 100644 src/generated/resources/assets/create/models/item/rare_simi_package.json create mode 100644 src/generated/resources/data/create/tags/items/packages.json create mode 100644 src/main/java/com/simibubi/create/content/logistics/box/PackageStyles.java rename src/main/resources/assets/create/models/item/{packages => package}/cardboard_10x12.json (88%) rename src/main/resources/assets/create/models/item/{packages => package}/cardboard_10x8.json (88%) rename src/main/resources/assets/create/models/item/{packages => package}/cardboard_12x10.json (88%) rename src/main/resources/assets/create/models/item/{packages => package}/cardboard_12x12.json (88%) create mode 100644 src/main/resources/assets/create/models/item/package/custom_12x10.json rename src/main/resources/assets/create/models/item/{packages/cardboard_10x12_rigging.json => package/rigging_10x12.json} (97%) rename src/main/resources/assets/create/models/item/{packages/cardboard_10x8_rigging.json => package/rigging_10x8.json} (97%) rename src/main/resources/assets/create/models/item/{packages/cardboard_12x10_rigging.json => package/rigging_12x10.json} (97%) rename src/main/resources/assets/create/models/item/{packages/cardboard_12x12_rigging.json => package/rigging_12x12.json} (97%) rename src/main/resources/assets/create/textures/{entity => item}/package/cardboard.png (100%) rename src/main/resources/assets/create/textures/{entity => item}/package/cardboard_particle.png (100%) create mode 100644 src/main/resources/assets/create/textures/item/package/rare_creeper.png create mode 100644 src/main/resources/assets/create/textures/item/package/rare_kryppers.png create mode 100644 src/main/resources/assets/create/textures/item/package/rare_simi.png diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index ca65ebabfe..e3e806196b 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-12-11T20:27:35.4702846 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-12-12T12:00:31.2596435 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -641,8 +641,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -53bf0593121af72930af270346e9ce2822f914df assets/create/lang/en_ud.json -b92519d5a3d1776b892a41ccc1757cfd4a10f088 assets/create/lang/en_us.json +f35ebbd1687a026fa7ec7f1e2518947b6a7ef551 assets/create/lang/en_ud.json +7747351385cd2d6d4b8e6ea3d7fe4ebd32a1beb6 assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -1875,10 +1875,10 @@ cc2692f7964f4266ecf00fcab176b1ef0b78673f assets/create/models/item/cardboard.jso d6a3f139fca5ac6aff94d11d75fe239283bb4a09 assets/create/models/item/cardboard_chestplate.json 82236ea8e939c46f0d2c9142336190eca2a0425e assets/create/models/item/cardboard_helmet.json 416a4d33a2b3b1921285f96436853dd7690447ac assets/create/models/item/cardboard_leggings.json -45d7fa87d102a0373a06a13592f58baafa4e5a33 assets/create/models/item/cardboard_package_10x12.json -f998f36d9a6f469bbd3822a17b2b45f81e6810c6 assets/create/models/item/cardboard_package_10x8.json -b7a24a7dd21a464815b2fd8cd6037e854be3f485 assets/create/models/item/cardboard_package_12x10.json -d5396690e7813c67ee3600555d7e47d0097b1f56 assets/create/models/item/cardboard_package_12x12.json +123f7b8f5129e07beead05846744ff06161ec7a1 assets/create/models/item/cardboard_package_10x12.json +4f22bc19ebf19be0efc32b5d2fe449349e6f5b2f assets/create/models/item/cardboard_package_10x8.json +599d305569d025d8771993d0b56a377f910e2a95 assets/create/models/item/cardboard_package_12x10.json +563720f20bee58dfc5b2c628cd037f7b6daf6a34 assets/create/models/item/cardboard_package_12x12.json 9dccb21720687bbd516c8598c5449028077f8467 assets/create/models/item/cardboard_sword.json 1cdb2b8801551c1540bb9b2a9cc3d725a2b433e7 assets/create/models/item/cart_assembler.json 390a06d81c8c2a0ff83196bd0154dd292206e3b6 assets/create/models/item/chain_conveyor.json @@ -2310,6 +2310,9 @@ d75c4969334f2ee1ae4a3d8ac28b001735c76b97 assets/create/models/item/purple_toolbo ebffb05119f499fcec051a4337aadc47654baed2 assets/create/models/item/purple_valve_handle.json f91405b9aec1e0142c1b90582e03a1973251da05 assets/create/models/item/radial_chassis.json 1c984ea9dbaec02e88dba1b81906c9acca7ed672 assets/create/models/item/railway_casing.json +87c4c0e13441cf0238103ca065c0c16f80f60f26 assets/create/models/item/rare_creeper_package.json +9f4de06da4d9c2b54b758b2b01e0595811338b94 assets/create/models/item/rare_kryppers_package.json +7830b48ef4292922f0ef13f9a7c2ee7d47366169 assets/create/models/item/rare_simi_package.json 5f8e5283fbebb452f1a1141b33ee73f08879c75d assets/create/models/item/raw_zinc.json 4631d67976cef148c346a7016baaa6703e4f243e assets/create/models/item/raw_zinc_block.json 9dc6c52e258b00cac6ed23147983045c43218b5d assets/create/models/item/redstone_contact.json @@ -4661,6 +4664,7 @@ d371dfd35e49a7bef19f59c03e7f4ae20992f03d data/create/tags/items/create_ingots.js ebd7b09daf2f64c0c04d821696b0e145683d8693 data/create/tags/items/dyed_table_cloths.json 1cebeb92bd514b75d54ac6d5708047801f0501c5 data/create/tags/items/modded_stripped_logs.json 586f8fc5a8b8559c9dc0017e13c78ad918688fae data/create/tags/items/modded_stripped_wood.json +bd0be367b9610c8b2df8403b1a20da9dfc264aaa data/create/tags/items/packages.json f400870b8dbcd14238be3ec99c419093073ba3a6 data/create/tags/items/postboxes.json 695d75b352fd190b303c724d1aaee9bb786a903b data/create/tags/items/pressurized_air_sources.json 22c4d4e033a61942b170aa309ed46a89a0ba0c65 data/create/tags/items/pulpifiable.json diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 90c6c8b5cf..9864da8916 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -3090,6 +3090,9 @@ "item.create.precision_mechanism": "ɯsıuɐɥɔǝW uoısıɔǝɹԀ", "item.create.propeller": "ɹǝןןǝdoɹԀ", "item.create.pulp": "dןnԀ", + "item.create.rare_creeper_package": "ǝbɐʞɔɐԀ ǝɹɐᴚ", + "item.create.rare_kryppers_package": "ǝbɐʞɔɐԀ ǝɹɐᴚ", + "item.create.rare_simi_package": "ǝbɐʞɔɐԀ ǝɹɐᴚ", "item.create.raw_zinc": "ɔuıZ ʍɐᴚ", "item.create.red_sand_paper": "ɹǝdɐԀ puɐS pǝᴚ", "item.create.refined_radiance": "ǝɔuɐıpɐᴚ pǝuıɟǝᴚ", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index fb81e919f1..7cdd09a161 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -3090,6 +3090,9 @@ "item.create.precision_mechanism": "Precision Mechanism", "item.create.propeller": "Propeller", "item.create.pulp": "Pulp", + "item.create.rare_creeper_package": "Rare Package", + "item.create.rare_kryppers_package": "Rare Package", + "item.create.rare_simi_package": "Rare Package", "item.create.raw_zinc": "Raw Zinc", "item.create.red_sand_paper": "Red Sand Paper", "item.create.refined_radiance": "Refined Radiance", diff --git a/src/generated/resources/assets/create/models/item/cardboard_package_10x12.json b/src/generated/resources/assets/create/models/item/cardboard_package_10x12.json index ec8db3c943..5e66034af1 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_package_10x12.json +++ b/src/generated/resources/assets/create/models/item/cardboard_package_10x12.json @@ -1,3 +1,3 @@ { - "parent": "create:item/packages/cardboard_10x12" + "parent": "create:item/package/cardboard_10x12" } \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_package_10x8.json b/src/generated/resources/assets/create/models/item/cardboard_package_10x8.json index 573d55b468..11eed5824e 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_package_10x8.json +++ b/src/generated/resources/assets/create/models/item/cardboard_package_10x8.json @@ -1,3 +1,3 @@ { - "parent": "create:item/packages/cardboard_10x8" + "parent": "create:item/package/cardboard_10x8" } \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_package_12x10.json b/src/generated/resources/assets/create/models/item/cardboard_package_12x10.json index 7dbbc45d1f..90326f1358 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_package_12x10.json +++ b/src/generated/resources/assets/create/models/item/cardboard_package_12x10.json @@ -1,3 +1,3 @@ { - "parent": "create:item/packages/cardboard_12x10" + "parent": "create:item/package/cardboard_12x10" } \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_package_12x12.json b/src/generated/resources/assets/create/models/item/cardboard_package_12x12.json index 8d9337ae86..aa52db09e3 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_package_12x12.json +++ b/src/generated/resources/assets/create/models/item/cardboard_package_12x12.json @@ -1,3 +1,3 @@ { - "parent": "create:item/packages/cardboard_12x12" + "parent": "create:item/package/cardboard_12x12" } \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/rare_creeper_package.json b/src/generated/resources/assets/create/models/item/rare_creeper_package.json new file mode 100644 index 0000000000..b90f949880 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/rare_creeper_package.json @@ -0,0 +1,6 @@ +{ + "parent": "create:item/package/custom_12x10", + "textures": { + "2": "create:item/package/rare_creeper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/rare_kryppers_package.json b/src/generated/resources/assets/create/models/item/rare_kryppers_package.json new file mode 100644 index 0000000000..4e26296658 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/rare_kryppers_package.json @@ -0,0 +1,6 @@ +{ + "parent": "create:item/package/custom_12x10", + "textures": { + "2": "create:item/package/rare_kryppers" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/rare_simi_package.json b/src/generated/resources/assets/create/models/item/rare_simi_package.json new file mode 100644 index 0000000000..5a4bfd3481 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/rare_simi_package.json @@ -0,0 +1,6 @@ +{ + "parent": "create:item/package/custom_12x10", + "textures": { + "2": "create:item/package/rare_simi" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/tags/items/packages.json b/src/generated/resources/data/create/tags/items/packages.json new file mode 100644 index 0000000000..bedde62cf9 --- /dev/null +++ b/src/generated/resources/data/create/tags/items/packages.json @@ -0,0 +1,11 @@ +{ + "values": [ + "create:cardboard_package_12x12", + "create:cardboard_package_10x12", + "create:cardboard_package_10x8", + "create:cardboard_package_12x10", + "create:rare_kryppers_package", + "create:rare_creeper_package", + "create:rare_simi_package" + ] +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllCreativeModeTabs.java b/src/main/java/com/simibubi/create/AllCreativeModeTabs.java index a8dd580808..aee0f12cdf 100644 --- a/src/main/java/com/simibubi/create/AllCreativeModeTabs.java +++ b/src/main/java/com/simibubi/create/AllCreativeModeTabs.java @@ -14,6 +14,7 @@ import com.simibubi.create.content.decoration.palettes.AllPaletteBlocks; import com.simibubi.create.content.equipment.armor.BacktankUtil; import com.simibubi.create.content.equipment.toolbox.ToolboxBlock; import com.simibubi.create.content.kinetics.crank.ValveHandleBlock; +import com.simibubi.create.content.logistics.box.PackageStyles; import com.simibubi.create.content.logistics.packagePort.postbox.PostboxBlock; import com.simibubi.create.content.logistics.tableCloth.TableClothBlock; import com.simibubi.create.foundation.data.CreateRegistrate; @@ -153,6 +154,8 @@ public class AllCreativeModeTabs { AllItems.CRUSHED_URANIUM, AllItems.CRUSHED_NICKEL ); + + exclusions.addAll(PackageStyles.RARE_BOXES); for (ItemProviderEntry entry : simpleExclusions) { exclusions.add(entry.asItem()); @@ -177,11 +180,7 @@ public class AllCreativeModeTabs { ); Map, ItemProviderEntry> simpleAfterOrderings = Map.of( - AllItems.VERTICAL_GEARBOX, AllBlocks.GEARBOX, - AllItems.CARDBOARD_PACKAGE_10x12, AllBlocks.PACKAGER, - AllItems.CARDBOARD_PACKAGE_12x12, AllBlocks.PACKAGER, - AllItems.CARDBOARD_PACKAGE_10x8, AllBlocks.PACKAGER, - AllItems.CARDBOARD_PACKAGE_12x10, AllBlocks.PACKAGER + AllItems.VERTICAL_GEARBOX, AllBlocks.GEARBOX ); simpleBeforeOrderings.forEach((entry, otherEntry) -> { @@ -191,6 +190,10 @@ public class AllCreativeModeTabs { simpleAfterOrderings.forEach((entry, otherEntry) -> { orderings.add(ItemOrdering.after(entry.asItem(), otherEntry.asItem())); }); + + PackageStyles.STANDARD_BOXES.forEach(item -> { + orderings.add(ItemOrdering.after(item, AllBlocks.PACKAGER.asItem())); + }); return orderings; } diff --git a/src/main/java/com/simibubi/create/AllItems.java b/src/main/java/com/simibubi/create/AllItems.java index 52e2227bf2..273cb798ed 100644 --- a/src/main/java/com/simibubi/create/AllItems.java +++ b/src/main/java/com/simibubi/create/AllItems.java @@ -45,7 +45,8 @@ import com.simibubi.create.content.legacy.ChromaticCompoundColor; import com.simibubi.create.content.legacy.ChromaticCompoundItem; import com.simibubi.create.content.legacy.RefinedRadianceItem; import com.simibubi.create.content.legacy.ShadowSteelItem; -import com.simibubi.create.content.logistics.box.PackageItem; +import com.simibubi.create.content.logistics.box.PackageStyles; +import com.simibubi.create.content.logistics.box.PackageStyles.PackageStyle; import com.simibubi.create.content.logistics.filter.FilterItem; import com.simibubi.create.content.logistics.tableCloth.ShoppingListItem; import com.simibubi.create.content.materials.ExperienceNuggetItem; @@ -403,20 +404,12 @@ public class AllItems { // Logistics - public static final ItemEntry CARDBOARD_PACKAGE_12x12 = - REGISTRATE.item("cardboard_package_12x12", p -> new PackageItem(p, 12, 12, 23f)) - .transform(BuilderTransformers.packageItem("cardboard", 12, 12)) - .register(), - CARDBOARD_PACKAGE_10x12 = REGISTRATE.item("cardboard_package_10x12", p -> new PackageItem(p, 10, 12, 22f)) - .transform(BuilderTransformers.packageItem("cardboard", 10, 12)) - .register(), - CARDBOARD_PACKAGE_10x8 = REGISTRATE.item("cardboard_package_10x8", p -> new PackageItem(p, 10, 8, 18f)) - .transform(BuilderTransformers.packageItem("cardboard", 10, 8)) - .register(), - CARDBOARD_PACKAGE_12x10 = REGISTRATE.item("cardboard_package_12x10", p -> new PackageItem(p, 12, 10, 21f)) - .transform(BuilderTransformers.packageItem("cardboard", 12, 10)) - .register(); - + static { + for (PackageStyle style : PackageStyles.STYLES) + BuilderTransformers.packageItem(style) + .register(); + } + public static final ItemEntry FILTER = REGISTRATE.item("filter", FilterItem::regular) .lang("List Filter") .register(), diff --git a/src/main/java/com/simibubi/create/AllPartialModels.java b/src/main/java/com/simibubi/create/AllPartialModels.java index c15800e9ce..adcfe28e64 100644 --- a/src/main/java/com/simibubi/create/AllPartialModels.java +++ b/src/main/java/com/simibubi/create/AllPartialModels.java @@ -7,6 +7,8 @@ import java.util.List; import java.util.Map; import com.simibubi.create.content.fluids.FluidTransportBehaviour; +import com.simibubi.create.content.logistics.box.PackageStyles; +import com.simibubi.create.content.logistics.box.PackageStyles.PackageStyle; import dev.engine_room.flywheel.lib.model.baked.PartialModel; import net.createmod.catnip.utility.Couple; @@ -247,13 +249,12 @@ public class AllPartialModels { putFoldingDoor("andesite_door"); putFoldingDoor("copper_door"); - for (String size : new String[] { "12x12", "10x12", "12x10", "10x8" }) { - ResourceLocation key = Create.asResource("cardboard_package_" + size); - PartialModel model = PartialModel.of(Create.asResource("item/packages/cardboard_" + size)); + for (PackageStyle style : PackageStyles.STYLES) { + ResourceLocation key = style.getItemId(); + PartialModel model = PartialModel.of(Create.asResource("item/" + key.getPath())); PACKAGES.put(key, model); PACKAGES_AS_LIST.add(model); - PACKAGE_RIGGING.put(key, - PartialModel.of(Create.asResource("item/packages/cardboard_" + size + "_rigging"))); + PACKAGE_RIGGING.put(key, PartialModel.of(style.getRiggingModel())); } } diff --git a/src/main/java/com/simibubi/create/AllTags.java b/src/main/java/com/simibubi/create/AllTags.java index 3475753998..c99802271f 100644 --- a/src/main/java/com/simibubi/create/AllTags.java +++ b/src/main/java/com/simibubi/create/AllTags.java @@ -183,6 +183,7 @@ public class AllTags { PULPIFIABLE, SLEEPERS, TOOLBOXES, + PACKAGES, TRACKS, UPRIGHT_ON_BELT, VALVE_HANDLES, diff --git a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltBlock.java b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltBlock.java index 6817e648f9..f077e3821d 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltBlock.java @@ -280,7 +280,7 @@ public class BeltBlock extends HorizontalKineticBlock if (belt == null) return InteractionResult.PASS; - if (heldItem.getItem() instanceof PackageItem) { + if (PackageItem.isPackage(heldItem)) { ItemStack toInsert = heldItem.copy(); IItemHandler handler = belt.getCapability(ForgeCapabilities.ITEM_HANDLER) .orElse(null); diff --git a/src/main/java/com/simibubi/create/content/kinetics/belt/transport/TransportedItemStack.java b/src/main/java/com/simibubi/create/content/kinetics/belt/transport/TransportedItemStack.java index 6f454c6f90..5ad1801a17 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/belt/transport/TransportedItemStack.java +++ b/src/main/java/com/simibubi/create/content/kinetics/belt/transport/TransportedItemStack.java @@ -33,7 +33,7 @@ public class TransportedItemStack implements Comparable { this.stack = stack; boolean centered = BeltHelper.isItemUpright(stack); angle = centered ? 180 : R.nextInt(360); - if (stack.getItem() instanceof PackageItem) + if (PackageItem.isPackage(stack)) angle = 180 + R.nextInt(10); sideOffset = prevSideOffset = getTargetSideOffset(); insertedFrom = Direction.UP; diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java index 7ad0e0cc3f..41824fc48e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java @@ -1,12 +1,11 @@ package com.simibubi.create.content.logistics.box; -import java.util.ArrayList; import java.util.List; -import java.util.Random; import javax.annotation.Nullable; import com.simibubi.create.AllEntityTypes; +import com.simibubi.create.content.logistics.box.PackageStyles.PackageStyle; import com.simibubi.create.content.logistics.stockTicker.PackageOrder; import net.createmod.catnip.utility.VecHelper; @@ -44,25 +43,15 @@ import net.minecraftforge.items.ItemStackHandler; public class PackageItem extends Item { - public static final List ALL_BOXES = new ArrayList<>(); - public static ItemStack FALLBACK_BOX = ItemStack.EMPTY; public static final int SLOTS = 9; - int width, height; - float hookDistance; + public PackageStyle style; - public PackageItem(Properties properties, int width, int height, float hookDistance) { + public PackageItem(Properties properties, PackageStyle style) { super(properties); - this.width = width; - this.height = height; - this.hookDistance = hookDistance; - ALL_BOXES.add(this); - } - - public static ItemStack getFallbackBox() { - if (FALLBACK_BOX.isEmpty()) - FALLBACK_BOX = new ItemStack(ALL_BOXES.get(0)); - return FALLBACK_BOX; + this.style = style; + PackageStyles.ALL_BOXES.add(this); + (style.rare() ? PackageStyles.RARE_BOXES : PackageStyles.STANDARD_BOXES).add(this); } public static boolean isPackage(ItemStack stack) { @@ -91,7 +80,7 @@ public class PackageItem extends Item { } public static ItemStack containing(ItemStackHandler stacks) { - ItemStack box = new ItemStack(randomBox()); + ItemStack box = PackageStyles.getRandomBox(); CompoundTag compound = new CompoundTag(); compound.put("Items", stacks.serializeNBT()); box.setTag(compound); @@ -140,7 +129,7 @@ public class PackageItem extends Item { return null; return PackageOrder.read(frag.getCompound("OrderContext")); } - + public static void addOrderContext(ItemStack box, PackageOrder orderContext) { CompoundTag tag = box.getOrCreateTagElement("Fragment"); if (orderContext != null) @@ -172,19 +161,19 @@ public class PackageItem extends Item { public static float getWidth(ItemStack box) { if (box.getItem() instanceof PackageItem pi) - return pi.width / 16f; + return pi.style.width() / 16f; return 1; } public static float getHeight(ItemStack box) { if (box.getItem() instanceof PackageItem pi) - return pi.height / 16f; + return pi.style.height() / 16f; return 1; } public static float getHookDistance(ItemStack box) { if (box.getItem() instanceof PackageItem pi) - return pi.hookDistance / 16f; + return pi.style.riggingOffset() / 16f; return 1; } @@ -196,10 +185,6 @@ public class PackageItem extends Item { return newInv; } - public static PackageItem randomBox() { - return ALL_BOXES.get(new Random().nextInt(ALL_BOXES.size())); - } - @Override public void appendHoverText(ItemStack pStack, Level pLevel, List pTooltipComponents, TooltipFlag pIsAdvanced) { @@ -323,8 +308,8 @@ public class PackageItem extends Item { return open(context.getLevel(), context.getPlayer(), context.getHand()).getResult(); Vec3 point = context.getClickLocation(); - float h = height / 16f; - float r = width / 2f / 16f; + float h = style.height() / 16f; + float r = style.width() / 2f / 16f; if (context.getClickedFace() == Direction.DOWN) point = point.subtract(0, h + .25f, 0); diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageRenderer.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageRenderer.java index adfd933622..94cbd04984 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageRenderer.java @@ -1,6 +1,7 @@ package com.simibubi.create.content.logistics.box; import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.AllBlocks; import com.simibubi.create.AllPartialModels; import dev.engine_room.flywheel.lib.model.baked.PartialModel; @@ -29,7 +30,7 @@ public class PackageRenderer extends EntityRenderer { public void render(PackageEntity entity, float yaw, float pt, PoseStack ms, MultiBufferSource buffer, int light) { ItemStack box = entity.box; if (box.isEmpty() || !PackageItem.isPackage(box)) - box = PackageItem.getFallbackBox(); + box = AllBlocks.CARDBOARD_BLOCK.asStack(); PartialModel model = AllPartialModels.PACKAGES.get(ForgeRegistries.ITEMS.getKey(box.getItem())); renderBox(entity, yaw, ms, buffer, light, model); super.render(entity, yaw, pt, ms, buffer, light); @@ -37,6 +38,8 @@ public class PackageRenderer extends EntityRenderer { public static void renderBox(Entity entity, float yaw, PoseStack ms, MultiBufferSource buffer, int light, PartialModel model) { + if (model == null) + return; SuperByteBuffer sbb = CachedBuffers.partial(model, Blocks.AIR.defaultBlockState()); sbb.translate(-.5, 0, -.5) .rotateCentered(AngleHelper.rad(yaw), Direction.UP) diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageStyles.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageStyles.java new file mode 100644 index 0000000000..048b2afa99 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageStyles.java @@ -0,0 +1,58 @@ +package com.simibubi.create.content.logistics.box; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +import com.simibubi.create.Create; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; + +public class PackageStyles { + + public static record PackageStyle(String type, int width, int height, float riggingOffset, boolean rare) { + + public ResourceLocation getItemId() { + String size = "_" + width + "x" + height; + String id = type + "_package" + (rare ? "" : size); + return Create.asResource(id); + } + + public ResourceLocation getRiggingModel() { + String size = width + "x" + height; + return Create.asResource("item/package/rigging_" + size); + } + + }; + + public static final List STYLES = new ArrayList<>(List.of( + + new PackageStyle("cardboard", 12, 12, 23f, false), + new PackageStyle("cardboard", 10, 12, 22f, false), + new PackageStyle("cardboard", 10, 8, 18f, false), + new PackageStyle("cardboard", 12, 10, 21f, false), + + new PackageStyle("rare_kryppers", 12, 10, 21f, true), + new PackageStyle("rare_creeper", 12, 10, 21f, true), + new PackageStyle("rare_simi", 12, 10, 21f, true) + + )); + + public static final List ALL_BOXES = new ArrayList<>(); + public static final List STANDARD_BOXES = new ArrayList<>(); + public static final List RARE_BOXES = new ArrayList<>(); + + private static final Random STYLE_PICKER = new Random(); + private static final int RARE_CHANCE = 5000; // addons, have mercy + + public static ItemStack getRandomBox() { + List pool = STYLE_PICKER.nextInt(RARE_CHANCE) == 0 ? RARE_BOXES : STANDARD_BOXES; + return new ItemStack(pool.get(STYLE_PICKER.nextInt(pool.size()))); + } + + public static ItemStack getDefaultBox() { + return new ItemStack(ALL_BOXES.get(0)); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java index 4b33a191c7..4ea5468e8c 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java @@ -16,11 +16,11 @@ import javax.annotation.Nullable; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllBlocks; -import com.simibubi.create.AllItems; import com.simibubi.create.AllPackets; import com.simibubi.create.AllRecipeTypes; import com.simibubi.create.content.logistics.AddressEditBox; import com.simibubi.create.content.logistics.BigItemStack; +import com.simibubi.create.content.logistics.box.PackageStyles; import com.simibubi.create.content.trains.station.NoShadowFontWrapper; import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllIcons; @@ -305,7 +305,7 @@ public class FactoryPanelScreen extends AbstractSimiScreen { graphics.drawString(font, CreateLang.text(state == -1 ? " /" : state == 0 ? "30s" : state + "m") .component(), promiseExpiration.getX() + 3, promiseExpiration.getY() + 4, 0xffeeeeee, true); - ItemStack asStack = AllItems.CARDBOARD_PACKAGE_12x12.asStack(); + ItemStack asStack = PackageStyles.getDefaultBox(); int itemX = x + 68; int itemY = y + windowHeight - 24; graphics.renderItem(asStack, itemX, itemY); diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/FilterItem.java b/src/main/java/com/simibubi/create/content/logistics/filter/FilterItem.java index 844c39aee2..7150ebaf91 100644 --- a/src/main/java/com/simibubi/create/content/logistics/filter/FilterItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/filter/FilterItem.java @@ -3,11 +3,15 @@ package com.simibubi.create.content.logistics.filter; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Objects; import javax.annotation.Nonnull; +import org.jetbrains.annotations.NotNull; + import com.simibubi.create.AllItems; import com.simibubi.create.AllKeys; +import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.content.logistics.filter.AttributeFilterMenu.WhitelistMode; import com.simibubi.create.foundation.item.ItemHelper; import com.simibubi.create.foundation.utility.CreateLang; @@ -206,10 +210,36 @@ public class FilterItem extends Item implements MenuProvider { public static boolean testDirect(ItemStack filter, ItemStack stack, boolean matchNBT) { if (matchNBT) { + if (PackageItem.isPackage(filter) && PackageItem.isPackage(stack)) + return doPackagesHaveSameData(filter, stack); + return ItemHandlerHelper.canItemStacksStack(filter, stack); - } else { - return ItemHelper.sameItem(filter, stack); } + + if (PackageItem.isPackage(filter) && PackageItem.isPackage(stack)) + return true; + + return ItemHelper.sameItem(filter, stack); + } + + public static boolean doPackagesHaveSameData(@NotNull ItemStack a, @NotNull ItemStack b) { + if (a.isEmpty() || a.hasTag() != b.hasTag()) + return false; + if (!a.hasTag()) + return true; + if (!a.areCapsCompatible(b)) + return false; + for (String key : a.getTag() + .getAllKeys()) { + if (key.equals("Fragment")) + continue; + if (!Objects.equals(a.getTag() + .get(key), + b.getTag() + .get(key))) + return false; + } + return true; } } diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/FilterItemStack.java b/src/main/java/com/simibubi/create/content/logistics/filter/FilterItemStack.java index d3e588658b..7495fa84ec 100644 --- a/src/main/java/com/simibubi/create/content/logistics/filter/FilterItemStack.java +++ b/src/main/java/com/simibubi/create/content/logistics/filter/FilterItemStack.java @@ -252,7 +252,7 @@ public class FilterItemStack { @Override public boolean test(Level world, ItemStack stack, boolean matchNBT) { return (filterString.isBlank() && super.test(world, stack, matchNBT)) - || stack.getItem() instanceof PackageItem && PackageItem.matchAddress(stack, filterString); + || PackageItem.isPackage(stack) && PackageItem.matchAddress(stack, filterString); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/PackageFilterScreen.java b/src/main/java/com/simibubi/create/content/logistics/filter/PackageFilterScreen.java index afd3ebbccb..f36871d26b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/filter/PackageFilterScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/filter/PackageFilterScreen.java @@ -3,9 +3,9 @@ package com.simibubi.create.content.logistics.filter; import org.lwjgl.glfw.GLFW; import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.AllItems; import com.simibubi.create.AllPackets; import com.simibubi.create.content.logistics.AddressEditBox; +import com.simibubi.create.content.logistics.box.PackageStyles; import com.simibubi.create.content.logistics.filter.FilterScreenPacket.Option; import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.widget.IconButton; @@ -61,7 +61,7 @@ public class PackageFilterScreen extends AbstractFilterScreen PoseStack ms = graphics.pose(); ms.pushPose(); ms.translate(leftPos + 16, topPos + 23, 0); - GuiGameElement.of(AllItems.CARDBOARD_PACKAGE_12x12.asStack()) + GuiGameElement.of(PackageStyles.getDefaultBox()) .render(graphics); ms.popPose(); } diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportBlockEntity.java index e39c8b3434..f0e71af69d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportBlockEntity.java @@ -1,8 +1,8 @@ package com.simibubi.create.content.logistics.packagePort.frogport; import com.simibubi.create.AllBlocks; -import com.simibubi.create.AllItems; import com.simibubi.create.content.logistics.box.PackageItem; +import com.simibubi.create.content.logistics.box.PackageStyles; import com.simibubi.create.content.logistics.packagePort.PackagePortBlockEntity; import com.simibubi.create.content.logistics.packager.PackagerItemHandler; import com.simibubi.create.foundation.item.ItemHelper; @@ -136,7 +136,7 @@ public class FrogportBlockEntity extends PackagePortBlockEntity { } public void startAnimation(ItemStack box, boolean deposit) { - if (!(box.getItem() instanceof PackageItem)) + if (!PackageItem.isPackage(box)) return; if (deposit && (target == null @@ -196,7 +196,7 @@ public class FrogportBlockEntity extends PackagePortBlockEntity { public void tryPullingFromOwnAndAdjacentInventories() { if (isAnimationInProgress()) return; - if (target == null || !target.export(level, worldPosition, AllItems.CARDBOARD_PACKAGE_10x12.asStack(), true)) + if (target == null || !target.export(level, worldPosition, PackageStyles.getDefaultBox(), true)) return; if (tryPullingFrom(inventory)) return; diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java index 4e11447ee7..d1203dec95 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java @@ -83,7 +83,7 @@ public class PackagerBlock extends WrenchableDirectionalBlock implements IBE 0) return InteractionResult.SUCCESS; - if (itemInHand.getItem() instanceof PackageItem) { + if (PackageItem.isPackage(itemInHand)) { if (worldIn.isClientSide()) return InteractionResult.SUCCESS; if (!be.unwrapBox(itemInHand.copy(), true)) diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerItemHandler.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerItemHandler.java index 1752c55c31..6b487c8fd8 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerItemHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerItemHandler.java @@ -64,7 +64,7 @@ public class PackagerItemHandler implements IItemHandlerModifiable { @Override public boolean isItemValid(int slot, ItemStack stack) { - return stack.getItem() instanceof PackageItem; + return PackageItem.isPackage(stack); } } diff --git a/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java b/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java index df5f4658ce..15a3b1c264 100644 --- a/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java +++ b/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java @@ -2,6 +2,7 @@ package com.simibubi.create.foundation.data; import static com.simibubi.create.AllInteractionBehaviours.interactionBehaviour; import static com.simibubi.create.AllMovementBehaviours.movementBehaviour; +import static com.simibubi.create.Create.REGISTRATE; import static com.simibubi.create.foundation.data.BlockStateGen.axisBlock; import static com.simibubi.create.foundation.data.CreateRegistrate.casingConnectivity; import static com.simibubi.create.foundation.data.CreateRegistrate.connectedTextures; @@ -37,6 +38,7 @@ import com.simibubi.create.content.kinetics.simpleRelays.encased.EncasedCogCTBeh import com.simibubi.create.content.kinetics.simpleRelays.encased.EncasedCogwheelBlock; import com.simibubi.create.content.kinetics.simpleRelays.encased.EncasedShaftBlock; import com.simibubi.create.content.logistics.box.PackageItem; +import com.simibubi.create.content.logistics.box.PackageStyles.PackageStyle; import com.simibubi.create.content.logistics.packager.PackagerGenerator; import com.simibubi.create.content.logistics.tableCloth.TableClothBlockItem; import com.simibubi.create.content.logistics.tableCloth.TableClothModel; @@ -471,13 +473,26 @@ public class BuilderTransformers { .build(); } - public static NonNullUnaryOperator> packageItem( - String material, int diameter, int height) { - return b -> b.properties(p -> p.stacksTo(1)) - .model((c, p) -> p.withExistingParent(c.getName(), - p.modLoc("item/packages/" + material + "_" + diameter + "x" + height))) - .lang(material.substring(0, 1) - .toUpperCase(Locale.ROOT) + material.substring(1) + " Package"); + public static ItemBuilder packageItem(PackageStyle style) { + String size = "_" + style.width() + "x" + style.height(); + return REGISTRATE.item(style.getItemId() + .getPath(), p -> new PackageItem(p, style)) + .properties(p -> p.stacksTo(1)) + .tag(AllItemTags.PACKAGES.tag) + .model((c, p) -> { + if (style.rare()) + p.withExistingParent(c.getName(), p.modLoc("item/package/custom" + size)) + .texture("2", p.modLoc("item/package/" + style.type())); + else + p.withExistingParent(c.getName(), p.modLoc("item/package/" + style.type() + size)); + }) + .lang((style.rare() ? "Rare" + : style.type() + .substring(0, 1) + .toUpperCase(Locale.ROOT) + + style.type() + .substring(1)) + + " Package"); } public static NonNullUnaryOperator> tableCloth(String name, diff --git a/src/main/resources/assets/create/models/item/packages/cardboard_10x12.json b/src/main/resources/assets/create/models/item/package/cardboard_10x12.json similarity index 88% rename from src/main/resources/assets/create/models/item/packages/cardboard_10x12.json rename to src/main/resources/assets/create/models/item/package/cardboard_10x12.json index c6d3e90b3c..81c55b8871 100644 --- a/src/main/resources/assets/create/models/item/packages/cardboard_10x12.json +++ b/src/main/resources/assets/create/models/item/package/cardboard_10x12.json @@ -2,8 +2,8 @@ "credit": "Made with Blockbench", "parent": "create:item/package_transforms", "textures": { - "0": "create:entity/package/cardboard", - "particle": "create:entity/package/cardboard_particle" + "0": "create:item/package/cardboard", + "particle": "create:item/package/cardboard_particle" }, "elements": [ { diff --git a/src/main/resources/assets/create/models/item/packages/cardboard_10x8.json b/src/main/resources/assets/create/models/item/package/cardboard_10x8.json similarity index 88% rename from src/main/resources/assets/create/models/item/packages/cardboard_10x8.json rename to src/main/resources/assets/create/models/item/package/cardboard_10x8.json index f0873badd1..f04ea7d3e0 100644 --- a/src/main/resources/assets/create/models/item/packages/cardboard_10x8.json +++ b/src/main/resources/assets/create/models/item/package/cardboard_10x8.json @@ -2,8 +2,8 @@ "credit": "Made with Blockbench", "parent": "create:item/package_transforms", "textures": { - "0": "create:entity/package/cardboard", - "particle": "create:entity/package/cardboard_particle" + "0": "create:item/package/cardboard", + "particle": "create:item/package/cardboard_particle" }, "elements": [ { diff --git a/src/main/resources/assets/create/models/item/packages/cardboard_12x10.json b/src/main/resources/assets/create/models/item/package/cardboard_12x10.json similarity index 88% rename from src/main/resources/assets/create/models/item/packages/cardboard_12x10.json rename to src/main/resources/assets/create/models/item/package/cardboard_12x10.json index 00a4cb1281..35d192112e 100644 --- a/src/main/resources/assets/create/models/item/packages/cardboard_12x10.json +++ b/src/main/resources/assets/create/models/item/package/cardboard_12x10.json @@ -2,8 +2,8 @@ "credit": "Made with Blockbench", "parent": "create:item/package_transforms", "textures": { - "0": "create:entity/package/cardboard", - "particle": "create:entity/package/cardboard_particle" + "0": "create:item/package/cardboard", + "particle": "create:item/package/cardboard_particle" }, "elements": [ { diff --git a/src/main/resources/assets/create/models/item/packages/cardboard_12x12.json b/src/main/resources/assets/create/models/item/package/cardboard_12x12.json similarity index 88% rename from src/main/resources/assets/create/models/item/packages/cardboard_12x12.json rename to src/main/resources/assets/create/models/item/package/cardboard_12x12.json index 5c8abece06..ce36a7eec7 100644 --- a/src/main/resources/assets/create/models/item/packages/cardboard_12x12.json +++ b/src/main/resources/assets/create/models/item/package/cardboard_12x12.json @@ -2,8 +2,8 @@ "credit": "Made with Blockbench", "parent": "create:item/package_transforms", "textures": { - "0": "create:entity/package/cardboard", - "particle": "create:entity/package/cardboard_particle" + "0": "create:item/package/cardboard", + "particle": "create:item/package/cardboard_particle" }, "elements": [ { diff --git a/src/main/resources/assets/create/models/item/package/custom_12x10.json b/src/main/resources/assets/create/models/item/package/custom_12x10.json new file mode 100644 index 0000000000..185359c85a --- /dev/null +++ b/src/main/resources/assets/create/models/item/package/custom_12x10.json @@ -0,0 +1,24 @@ +{ + "credit": "Made with Blockbench", + "parent": "create:item/package_transforms", + "textures": { + "2": "create:item/package/rare_kryppers", + "particle": "#2" + }, + "elements": [ + { + "name": "box", + "from": [2, 0, 2], + "to": [14, 10, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 5, 8]}, + "faces": { + "north": {"uv": [1, 5.5, 7, 10.5], "texture": "#2"}, + "east": {"uv": [1, 0.5, 7, 5.5], "texture": "#2"}, + "south": {"uv": [7, 5.5, 1, 10.5], "texture": "#2"}, + "west": {"uv": [1, 10.5, 7, 15.5], "texture": "#2"}, + "up": {"uv": [9, 2, 15, 8], "rotation": 180, "texture": "#2"}, + "down": {"uv": [9, 8, 15, 14], "rotation": 270, "texture": "#2"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/packages/cardboard_10x12_rigging.json b/src/main/resources/assets/create/models/item/package/rigging_10x12.json similarity index 97% rename from src/main/resources/assets/create/models/item/packages/cardboard_10x12_rigging.json rename to src/main/resources/assets/create/models/item/package/rigging_10x12.json index 45cda7e6be..392204921c 100644 --- a/src/main/resources/assets/create/models/item/packages/cardboard_10x12_rigging.json +++ b/src/main/resources/assets/create/models/item/package/rigging_10x12.json @@ -2,8 +2,8 @@ "credit": "Made with Blockbench", "parent": "create:item/package_transforms", "textures": { - "0": "create:entity/package/cardboard", - "particle": "create:entity/package/cardboard_particle" + "0": "create:item/package/cardboard", + "particle": "create:item/package/cardboard_particle" }, "render_type": "minecraft:cutout", "elements": [ diff --git a/src/main/resources/assets/create/models/item/packages/cardboard_10x8_rigging.json b/src/main/resources/assets/create/models/item/package/rigging_10x8.json similarity index 97% rename from src/main/resources/assets/create/models/item/packages/cardboard_10x8_rigging.json rename to src/main/resources/assets/create/models/item/package/rigging_10x8.json index 4e777b6bcf..ba89ce6511 100644 --- a/src/main/resources/assets/create/models/item/packages/cardboard_10x8_rigging.json +++ b/src/main/resources/assets/create/models/item/package/rigging_10x8.json @@ -2,8 +2,8 @@ "credit": "Made with Blockbench", "parent": "create:item/package_transforms", "textures": { - "0": "create:entity/package/cardboard", - "particle": "create:entity/package/cardboard_particle" + "0": "create:item/package/cardboard", + "particle": "create:item/package/cardboard_particle" }, "render_type": "minecraft:cutout", "elements": [ diff --git a/src/main/resources/assets/create/models/item/packages/cardboard_12x10_rigging.json b/src/main/resources/assets/create/models/item/package/rigging_12x10.json similarity index 97% rename from src/main/resources/assets/create/models/item/packages/cardboard_12x10_rigging.json rename to src/main/resources/assets/create/models/item/package/rigging_12x10.json index 2072e61a06..75a51fec81 100644 --- a/src/main/resources/assets/create/models/item/packages/cardboard_12x10_rigging.json +++ b/src/main/resources/assets/create/models/item/package/rigging_12x10.json @@ -2,8 +2,8 @@ "credit": "Made with Blockbench", "parent": "create:item/package_transforms", "textures": { - "0": "create:entity/package/cardboard", - "particle": "create:entity/package/cardboard_particle" + "0": "create:item/package/cardboard", + "particle": "create:item/package/cardboard_particle" }, "render_type": "minecraft:cutout", "elements": [ diff --git a/src/main/resources/assets/create/models/item/packages/cardboard_12x12_rigging.json b/src/main/resources/assets/create/models/item/package/rigging_12x12.json similarity index 97% rename from src/main/resources/assets/create/models/item/packages/cardboard_12x12_rigging.json rename to src/main/resources/assets/create/models/item/package/rigging_12x12.json index 4440967d4f..c51a2b50dc 100644 --- a/src/main/resources/assets/create/models/item/packages/cardboard_12x12_rigging.json +++ b/src/main/resources/assets/create/models/item/package/rigging_12x12.json @@ -2,8 +2,8 @@ "credit": "Made with Blockbench", "parent": "create:item/package_transforms", "textures": { - "0": "create:entity/package/cardboard", - "particle": "create:entity/package/cardboard_particle" + "0": "create:item/package/cardboard", + "particle": "create:item/package/cardboard_particle" }, "render_type": "minecraft:cutout", "elements": [ diff --git a/src/main/resources/assets/create/textures/entity/package/cardboard.png b/src/main/resources/assets/create/textures/item/package/cardboard.png similarity index 100% rename from src/main/resources/assets/create/textures/entity/package/cardboard.png rename to src/main/resources/assets/create/textures/item/package/cardboard.png diff --git a/src/main/resources/assets/create/textures/entity/package/cardboard_particle.png b/src/main/resources/assets/create/textures/item/package/cardboard_particle.png similarity index 100% rename from src/main/resources/assets/create/textures/entity/package/cardboard_particle.png rename to src/main/resources/assets/create/textures/item/package/cardboard_particle.png diff --git a/src/main/resources/assets/create/textures/item/package/rare_creeper.png b/src/main/resources/assets/create/textures/item/package/rare_creeper.png new file mode 100644 index 0000000000000000000000000000000000000000..c249883e4cf0278c94fdb704a0bfd1fae21f0679 GIT binary patch literal 762 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCim50(?STrylE>dv0p;ma5);Eq(i2Cm!moTw0*vqrCUt_63J$ZN9m-ZAbm` zQw!H$UFlxrxbE_bm1h@s?rLaQUmn#Rm^mwP+MbE-h4zV)Ba^4b0FB(8(`5ssq)LMP zg8$(jWCn{f0ojI(ObmQL zItqw0+gZTk89+7&>@Q!~j15jcDI|B<)oq>_D0pkLQnIQXE7eLIJ1Z0B% z6VOy9u*x7y3m^-s%h138BzwX_WJ_R$CNS6;bv<1iLoEDTCv_Gz8}PWWnzqdnnB(;5 z!+-l*Q=b^CzN}JfuUr#uz3j0(;{v_cEXTwA<0IO_<;%4>6Ec4A+?d#Sk&o%a#LM5G zeDNri`1yCD$cqfM@|n|S`b=-oX1-qG(tiK-QAP=&4HbS5r%OeMze#1+@hj{;pul${ z^uQw@x3pc6tZ9rNyjXtCpVxYxL!u>y@eJ1lL$>6~nuqa44|oJ$Y_I)ZUVs1lTB*s6 zHfm0l&)e@X%O8}S#B3H;B(b&Uq-!XjO*4NwHzopr0Gqr6 A{{R30 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/item/package/rare_kryppers.png b/src/main/resources/assets/create/textures/item/package/rare_kryppers.png new file mode 100644 index 0000000000000000000000000000000000000000..48dc589b1b8689be1b4e057aeae7e7460d3a97fa GIT binary patch literal 762 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCim50(?ST8^Z(IV?)b)Tx){7YlD62L;Z4H?M=i4`-*aF6QX;v(<=Qvno{CB zGgEvul{zw#TT&CM0z8X7onwu((``(vqCb$b#xJG%x_kR(0-BN!=Kn4U7_9PZ!4!3;)(hokh(CJT9!JZLExEGhVSLd89>EveYrmJ*-~YZ=YI38Enp5TT z_B+h-2PG#ln}rogZ0$Me8p>zW%%gQ6@@gjMhZ~#ZES-53iZ6vR22Ep9Y+0_Mk??dQ zL(mm@c5Pj+*<3BlEe?1zUbn8Cr0Aw2d4xescS2Q#vFqatehc}S_7->aujVQ2k6n999M?Mpgz!Aj=DgrJ-z4SZFXZgTkOkFcXkY-6t?JyNlDaWC8yF?Jo-U3d7XGc1I*XbOcwAUb+hz&OaeDOOzx}PL zPmEPxR;jgDt_inZ_E?^Af!=GD<6-{s5pCh}<=UJH89#V#Ol-W!$Mj+1vZ+SvvD76kiHs44THI*s@$hBjM>r zhM+6*?Ap3sv$N?u4oeW7o$Q{1);t?Je%;U(Hk4Bc Date: Thu, 12 Dec 2024 12:51:42 +0100 Subject: [PATCH 180/515] Skyhook bandaid - Closes the gap between wrench and chain in the player renderer; revert this when a better solution is found --- .../render/PlayerSkyhookRenderer.java | 26 ++++++++++++++----- .../create/models/item/wrench/item.json | 10 +++---- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/simibubi/create/foundation/render/PlayerSkyhookRenderer.java b/src/main/java/com/simibubi/create/foundation/render/PlayerSkyhookRenderer.java index d122c39144..78f650ddc5 100644 --- a/src/main/java/com/simibubi/create/foundation/render/PlayerSkyhookRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/render/PlayerSkyhookRenderer.java @@ -38,8 +38,7 @@ public class PlayerSkyhookRenderer { } private static void setHangingPose(HumanoidModel model) { - - //model.head.resetPose(); + model.head.x = 0; model.body.resetPose(); model.leftArm.resetPose(); model.rightArm.resetPose(); @@ -55,11 +54,15 @@ public class PlayerSkyhookRenderer { model.body.zRot = bodySwing; model.head.zRot = bodySwing; + model.rightArm.y -= 3; + float offsetX = model.rightArm.x; float offsetY = model.rightArm.y; - model.rightArm.x = offsetX * Mth.cos(bodySwing) - offsetY * Mth.sin(bodySwing); - model.rightArm.y = offsetX * Mth.sin(bodySwing) + offsetY * Mth.cos(bodySwing); - model.rightArm.xRot = -AngleHelper.rad(135); +// model.rightArm.x = offsetX * Mth.cos(bodySwing) - offsetY * Mth.sin(bodySwing); +// model.rightArm.y = offsetX * Mth.sin(bodySwing) + offsetY * Mth.cos(bodySwing); + float armPivotX = offsetX * Mth.cos(bodySwing) - offsetY * Mth.sin(bodySwing) + 4.5f; + float armPivotY = offsetX * Mth.sin(bodySwing) + offsetY * Mth.cos(bodySwing) + 2; + model.rightArm.xRot = -AngleHelper.rad(150); model.rightArm.zRot = AngleHelper.rad(15); offsetX = model.leftArm.x; @@ -76,7 +79,7 @@ public class PlayerSkyhookRenderer { model.rightLeg.xRot = -AngleHelper.rad(25); model.rightLeg.zRot = AngleHelper.rad(10) + 0.5f * bodySwing + limbSwing; - model.leftLeg.y -= 0.2f; + model.leftLeg.y -= 0.8f; offsetX = model.leftLeg.x; offsetY = model.leftLeg.y; model.leftLeg.x = offsetX * Mth.cos(bodySwing) - offsetY * Mth.sin(bodySwing); @@ -84,6 +87,17 @@ public class PlayerSkyhookRenderer { model.leftLeg.xRot = AngleHelper.rad(10); model.leftLeg.zRot = -AngleHelper.rad(10) + 0.5f * bodySwing + limbSwing; + model.head.x -= armPivotX; + model.body.x -= armPivotX; + model.leftArm.x -= armPivotX; + model.leftLeg.x -= armPivotX; + model.rightLeg.x -= armPivotX; + + model.head.y -= armPivotY; + model.body.y -= armPivotY; + model.leftArm.y -= armPivotY; + model.leftLeg.y -= armPivotY; + model.rightLeg.y -= armPivotY; } } diff --git a/src/main/resources/assets/create/models/item/wrench/item.json b/src/main/resources/assets/create/models/item/wrench/item.json index 1507d8f730..abcf12d893 100644 --- a/src/main/resources/assets/create/models/item/wrench/item.json +++ b/src/main/resources/assets/create/models/item/wrench/item.json @@ -108,12 +108,12 @@ ], "display": { "thirdperson_righthand": { - "rotation": [0, 90, 0], - "translation": [0, 3.25, 0] + "rotation": [-21.5, 90, 0], + "translation": [0, 3.25, -2.25] }, "thirdperson_lefthand": { - "rotation": [0, -90, 0], - "translation": [0, 3.75, 0] + "rotation": [-22.5, -90, 1], + "translation": [0, 3.25, -2.25] }, "firstperson_righthand": { "rotation": [-4.5, 100.25, 10], @@ -146,4 +146,4 @@ "children": [0, 1, 2, 3, 4, 5, 6] } ] -} +} \ No newline at end of file From 9c0b557fec27509f5845a4cd46bee3ec5f47f9e0 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Thu, 12 Dec 2024 16:44:16 +0100 Subject: [PATCH 181/515] Weathered Iron Block --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 60 ++++++++++-------- .../b256105d8411632b0d585496ea8944a751a08034 | 5 +- .../blockstates/old_factory_window.json | 18 ------ .../blockstates/weathered_iron_block.json | 7 ++ .../blockstates/weathered_iron_window.json | 18 ++++++ ...e.json => weathered_iron_window_pane.json} | 18 +++--- .../resources/assets/create/lang/en_ud.json | 5 +- .../resources/assets/create/lang/en_us.json | 5 +- .../models/block/old_factory_window_1.json | 7 -- .../models/block/old_factory_window_2.json | 7 -- .../models/block/old_factory_window_3.json | 7 -- .../models/block/old_factory_window_4.json | 7 -- .../block/old_factory_window_pane_noside.json | 7 -- .../old_factory_window_pane_noside_alt.json | 7 -- .../block/old_factory_window_pane_post.json | 7 -- .../block/old_factory_window_pane_side.json | 7 -- .../old_factory_window_pane_side_alt.json | 7 -- .../models/block/weathered_iron_block.json | 7 ++ .../models/block/weathered_iron_window_1.json | 7 ++ .../models/block/weathered_iron_window_2.json | 7 ++ .../models/block/weathered_iron_window_3.json | 7 ++ .../models/block/weathered_iron_window_4.json | 7 ++ .../weathered_iron_window_pane_noside.json | 7 ++ ...weathered_iron_window_pane_noside_alt.json | 7 ++ .../weathered_iron_window_pane_post.json | 7 ++ .../weathered_iron_window_pane_side.json | 7 ++ .../weathered_iron_window_pane_side_alt.json | 7 ++ .../models/item/old_factory_window.json | 7 -- .../models/item/old_factory_window_pane.json | 7 -- .../models/item/weathered_iron_block.json | 3 + .../models/item/weathered_iron_window.json | 7 ++ .../item/weathered_iron_window_pane.json | 7 ++ ...n_block_from_ingots_iron_stonecutting.json | 33 ++++++++++ ...window.json => weathered_iron_window.json} | 6 +- ...e.json => weathered_iron_window_pane.json} | 6 +- .../blocks/weathered_iron_block.json | 21 ++++++ ...window.json => weathered_iron_window.json} | 4 +- ...e.json => weathered_iron_window_pane.json} | 4 +- .../splashing/industrial_iron_block.json | 13 ++++ .../splashing/industrial_iron_window.json | 13 ++++ .../industrial_iron_window_pane.json | 13 ++++ ...n_block_from_ingots_iron_stonecutting.json | 8 +++ ...window.json => weathered_iron_window.json} | 4 +- ...e.json => weathered_iron_window_pane.json} | 4 +- .../create/tags/blocks/wrench_pickup.json | 1 + .../data/forge/tags/blocks/glass_panes.json | 2 +- .../data/forge/tags/items/glass_panes.json | 2 +- .../minecraft/tags/blocks/impermeable.json | 2 +- .../tags/blocks/mineable/pickaxe.json | 1 + .../java/com/simibubi/create/AllBlocks.java | 18 ++---- .../com/simibubi/create/AllSpriteShifts.java | 8 +-- .../decoration/palettes/AllPaletteBlocks.java | 14 ++-- ...va => WeatheredIronWindowCTBehaviour.java} | 4 +- ...> WeatheredIronWindowPaneCTBehaviour.java} | 4 +- .../foundation/data/BuilderTransformers.java | 16 ++++- .../data/recipe/WashingRecipeGen.java | 11 +++- ...y_window.png => weathered_iron_window.png} | Bin ... => weathered_iron_window_1_connected.png} | Bin ...nd.png => weathered_iron_window_1_end.png} | Bin ... => weathered_iron_window_2_connected.png} | Bin ...nd.png => weathered_iron_window_2_end.png} | Bin ... => weathered_iron_window_3_connected.png} | Bin ...nd.png => weathered_iron_window_3_end.png} | Bin ... => weathered_iron_window_4_connected.png} | Bin ...nd.png => weathered_iron_window_4_end.png} | Bin ...png => weathered_iron_window_pane_top.png} | Bin .../textures/block/weathered_iron_block.png | Bin 0 -> 789 bytes .../block/weathered_iron_block_top.png | Bin 0 -> 782 bytes 68 files changed, 330 insertions(+), 182 deletions(-) delete mode 100644 src/generated/resources/assets/create/blockstates/old_factory_window.json create mode 100644 src/generated/resources/assets/create/blockstates/weathered_iron_block.json create mode 100644 src/generated/resources/assets/create/blockstates/weathered_iron_window.json rename src/generated/resources/assets/create/blockstates/{old_factory_window_pane.json => weathered_iron_window_pane.json} (57%) delete mode 100644 src/generated/resources/assets/create/models/block/old_factory_window_1.json delete mode 100644 src/generated/resources/assets/create/models/block/old_factory_window_2.json delete mode 100644 src/generated/resources/assets/create/models/block/old_factory_window_3.json delete mode 100644 src/generated/resources/assets/create/models/block/old_factory_window_4.json delete mode 100644 src/generated/resources/assets/create/models/block/old_factory_window_pane_noside.json delete mode 100644 src/generated/resources/assets/create/models/block/old_factory_window_pane_noside_alt.json delete mode 100644 src/generated/resources/assets/create/models/block/old_factory_window_pane_post.json delete mode 100644 src/generated/resources/assets/create/models/block/old_factory_window_pane_side.json delete mode 100644 src/generated/resources/assets/create/models/block/old_factory_window_pane_side_alt.json create mode 100644 src/generated/resources/assets/create/models/block/weathered_iron_block.json create mode 100644 src/generated/resources/assets/create/models/block/weathered_iron_window_1.json create mode 100644 src/generated/resources/assets/create/models/block/weathered_iron_window_2.json create mode 100644 src/generated/resources/assets/create/models/block/weathered_iron_window_3.json create mode 100644 src/generated/resources/assets/create/models/block/weathered_iron_window_4.json create mode 100644 src/generated/resources/assets/create/models/block/weathered_iron_window_pane_noside.json create mode 100644 src/generated/resources/assets/create/models/block/weathered_iron_window_pane_noside_alt.json create mode 100644 src/generated/resources/assets/create/models/block/weathered_iron_window_pane_post.json create mode 100644 src/generated/resources/assets/create/models/block/weathered_iron_window_pane_side.json create mode 100644 src/generated/resources/assets/create/models/block/weathered_iron_window_pane_side_alt.json delete mode 100644 src/generated/resources/assets/create/models/item/old_factory_window.json delete mode 100644 src/generated/resources/assets/create/models/item/old_factory_window_pane.json create mode 100644 src/generated/resources/assets/create/models/item/weathered_iron_block.json create mode 100644 src/generated/resources/assets/create/models/item/weathered_iron_window.json create mode 100644 src/generated/resources/assets/create/models/item/weathered_iron_window_pane.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/weathered_iron_block_from_ingots_iron_stonecutting.json rename src/generated/resources/data/create/advancements/recipes/building_blocks/{old_factory_window.json => weathered_iron_window.json} (80%) rename src/generated/resources/data/create/advancements/recipes/building_blocks/{old_factory_window_pane.json => weathered_iron_window_pane.json} (78%) create mode 100644 src/generated/resources/data/create/loot_tables/blocks/weathered_iron_block.json rename src/generated/resources/data/create/loot_tables/blocks/{old_factory_window.json => weathered_iron_window.json} (83%) rename src/generated/resources/data/create/loot_tables/blocks/{old_factory_window_pane.json => weathered_iron_window_pane.json} (81%) create mode 100644 src/generated/resources/data/create/recipes/splashing/industrial_iron_block.json create mode 100644 src/generated/resources/data/create/recipes/splashing/industrial_iron_window.json create mode 100644 src/generated/resources/data/create/recipes/splashing/industrial_iron_window_pane.json create mode 100644 src/generated/resources/data/create/recipes/weathered_iron_block_from_ingots_iron_stonecutting.json rename src/generated/resources/data/create/recipes/{old_factory_window.json => weathered_iron_window.json} (74%) rename src/generated/resources/data/create/recipes/{old_factory_window_pane.json => weathered_iron_window_pane.json} (68%) rename src/main/java/com/simibubi/create/content/decoration/palettes/{OldFactoryWindowCTBehaviour.java => WeatheredIronWindowCTBehaviour.java} (93%) rename src/main/java/com/simibubi/create/content/decoration/palettes/{OldFactoryWindowPaneCTBehaviour.java => WeatheredIronWindowPaneCTBehaviour.java} (93%) rename src/main/resources/assets/create/textures/block/palettes/{old_factory_window.png => weathered_iron_window.png} (100%) rename src/main/resources/assets/create/textures/block/palettes/{old_factory_window_1_connected.png => weathered_iron_window_1_connected.png} (100%) rename src/main/resources/assets/create/textures/block/palettes/{old_factory_window_1_end.png => weathered_iron_window_1_end.png} (100%) rename src/main/resources/assets/create/textures/block/palettes/{old_factory_window_2_connected.png => weathered_iron_window_2_connected.png} (100%) rename src/main/resources/assets/create/textures/block/palettes/{old_factory_window_2_end.png => weathered_iron_window_2_end.png} (100%) rename src/main/resources/assets/create/textures/block/palettes/{old_factory_window_3_connected.png => weathered_iron_window_3_connected.png} (100%) rename src/main/resources/assets/create/textures/block/palettes/{old_factory_window_3_end.png => weathered_iron_window_3_end.png} (100%) rename src/main/resources/assets/create/textures/block/palettes/{old_factory_window_4_connected.png => weathered_iron_window_4_connected.png} (100%) rename src/main/resources/assets/create/textures/block/palettes/{old_factory_window_4_end.png => weathered_iron_window_4_end.png} (100%) rename src/main/resources/assets/create/textures/block/palettes/{old_factory_window_pane_top.png => weathered_iron_window_pane_top.png} (100%) create mode 100644 src/main/resources/assets/create/textures/block/weathered_iron_block.png create mode 100644 src/main/resources/assets/create/textures/block/weathered_iron_block_top.png diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index e3e806196b..ca58b49674 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-12-12T12:00:31.2596435 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-12-12T16:37:04.2481578 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -369,8 +369,6 @@ ba9c3ecfacbd398048440d247decffeaefc714b5 assets/create/blockstates/mysterious_cu 7f2c5728e24d60ed2f7a095e3a954d7ca4e410e9 assets/create/blockstates/oak_window_pane.json df91d0ca68934c1afd9858a8d1591dd4cb88df65 assets/create/blockstates/ochrum.json 09c9bee3d26edc4b87cb7a5042f125c439ee5956 assets/create/blockstates/ochrum_pillar.json -8c81b5846605f5c7efecd335534a2c8660c9b206 assets/create/blockstates/old_factory_window.json -3d3233a4de308b39e4237a21cb3227377d9089d4 assets/create/blockstates/old_factory_window_pane.json 8ff85f8171ff60ebf95f574d6c9f275ae6e98ee0 assets/create/blockstates/orange_postbox.json af4c2c4861d1410e1b7371a5bf3fe09ed3ab0077 assets/create/blockstates/orange_sail.json aab812cecf7d10d4e7587f4dead8a98238a15f41 assets/create/blockstates/orange_seat.json @@ -622,6 +620,9 @@ c11562afd9a5f85945e521dcea5f911d1b6d13c6 assets/create/blockstates/weathered_cop 236e072d9056c0dbffdf5d7d973a85a56c2c8de1 assets/create/blockstates/weathered_copper_tiles.json fee668eb9a45dca0d287fee5811219d69f9ec3e2 assets/create/blockstates/weathered_copper_tile_slab.json da110f382368257e15431c77164aef82e014e3f8 assets/create/blockstates/weathered_copper_tile_stairs.json +64fb3e569da401635b64e71e01ea0b3ff6360611 assets/create/blockstates/weathered_iron_block.json +6fd81f1eb48fbfc44df9db8eedc613690c9b8ef5 assets/create/blockstates/weathered_iron_window.json +1aed351050d73989c4553bf49ce03b3a8fdd210e assets/create/blockstates/weathered_iron_window_pane.json 25ce64b7af5d244f194da91ccf964a9bf5762327 assets/create/blockstates/weighted_ejector.json 2974b34a8cfb0d4e8e010f8bd085584ea631d541 assets/create/blockstates/white_nixie_tube.json f128f18e0baa69c94ac9149960cfe810a6c9ecf9 assets/create/blockstates/white_postbox.json @@ -641,8 +642,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -f35ebbd1687a026fa7ec7f1e2518947b6a7ef551 assets/create/lang/en_ud.json -7747351385cd2d6d4b8e6ea3d7fe4ebd32a1beb6 assets/create/lang/en_us.json +5aefb46c4d0deb079dddc182c65d4f312113b884 assets/create/lang/en_ud.json +be5597dbc2784544de3552d791dccfffe92429e1 assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -1311,15 +1312,6 @@ af50363d603d61340b336569d58c1febde253665 assets/create/models/block/ochrum_natur d69effa0a811cb93fead8257bcaad4bbf0094002 assets/create/models/block/ochrum_natural_3.json 24669a4e93925940477fcfc0aca10ab9d87368e0 assets/create/models/block/ochrum_pillar.json c8dd33a0b71dce37712788a61729de89574b117f assets/create/models/block/ochrum_pillar_horizontal.json -8661da1ba4f5397a8141daa76db81d43e28d1772 assets/create/models/block/old_factory_window_1.json -bf22ea3157df302d5a1bbf4afc8d83b37a56ff0b assets/create/models/block/old_factory_window_2.json -17e6a1289531703d0ad3b2fc8c61740ba4c38093 assets/create/models/block/old_factory_window_3.json -142ff0861e6460129767921a797d13d7fb040f92 assets/create/models/block/old_factory_window_4.json -b0871493a8b1429521fb612ab60d49af8a355f8e assets/create/models/block/old_factory_window_pane_noside.json -298ba4fa0a9ebf6422a05885e132a26e6bdbb57c assets/create/models/block/old_factory_window_pane_noside_alt.json -9e7342c64b694b5a5b69f21139ef9fce5bf60979 assets/create/models/block/old_factory_window_pane_post.json -5519cb7d69657c02f24d2768adf4f6d2a52d76e8 assets/create/models/block/old_factory_window_pane_side.json -08a677e330d0d54e0bfe8b58a91d39866af64a29 assets/create/models/block/old_factory_window_pane_side_alt.json dbd0cbfa1c6cfaddd7ac954379b4b1f3056730f2 assets/create/models/block/orange_postbox_closed.json 88cda1f606e502cf0df9430b75a70fd3161fd6ba assets/create/models/block/orange_postbox_open.json cb4cd4e4bfb0d105a09c56454abf4795b155d12b assets/create/models/block/orange_sail.json @@ -1786,6 +1778,16 @@ f32a18c76cfaca2153f6321880a8da1347be37ce assets/create/models/block/weathered_co e26dd64495ff8801593e9c22203cbf364075badd assets/create/models/block/weathered_copper_tile_stairs.json b658c1022587bd670b5acee267607719c1544332 assets/create/models/block/weathered_copper_tile_stairs_inner.json e7ae89577be9d26a071bf96cbd7ed80293902b63 assets/create/models/block/weathered_copper_tile_stairs_outer.json +045b812ddb1ca8dd6cd9b49852ddbd37f86cd2a6 assets/create/models/block/weathered_iron_block.json +a569ddd725898a86f8745e46723edeff7fe7f2e9 assets/create/models/block/weathered_iron_window_1.json +133928d853037efb81022b69377669f0b16239bc assets/create/models/block/weathered_iron_window_2.json +06b0109b8dd43f433de00ff271042b416be7d86c assets/create/models/block/weathered_iron_window_3.json +f7199168a6ac364a03c52dd186bf8a3ec79954e4 assets/create/models/block/weathered_iron_window_4.json +847adaa7197d84669d4c69146595980f179f44e7 assets/create/models/block/weathered_iron_window_pane_noside.json +c0f40f2f698ebc2f2a3affd8aa7520735debb577 assets/create/models/block/weathered_iron_window_pane_noside_alt.json +48a7646b44a34d9721311bbf489214a02ca5cf83 assets/create/models/block/weathered_iron_window_pane_post.json +f6d98f8518f48feb8faf5691ce1de02e9430eefa assets/create/models/block/weathered_iron_window_pane_side.json +94a6c852930e980640a5733536bac21b1c327d18 assets/create/models/block/weathered_iron_window_pane_side_alt.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/white_nixie_tube.json 998d838964c6c5bc2a1903b5098491abf5d819bc assets/create/models/block/white_postbox_closed.json e89fe63260b94fc70e360eceb3d04b74242c248f assets/create/models/block/white_postbox_open.json @@ -2208,8 +2210,6 @@ f80358eba19bc8d1741e4e25753866799631a118 assets/create/models/item/nixie_tube.js 061587faf0e53e4fac0c8f2f3bd6b22020b2a3ee assets/create/models/item/oak_window_pane.json af50363d603d61340b336569d58c1febde253665 assets/create/models/item/ochrum.json 62ec1afee14f9de3f5b02ee930d002a240a3c337 assets/create/models/item/ochrum_pillar.json -8661da1ba4f5397a8141daa76db81d43e28d1772 assets/create/models/item/old_factory_window.json -057526bde18263f4a9e1230ea3a65ea399363c72 assets/create/models/item/old_factory_window_pane.json 226f99c241b1d8b03d8fc57db32c1bee0721b64f assets/create/models/item/orange_postbox.json 56e7d28824d3fc566b5f551babbe423a550ef08c assets/create/models/item/orange_seat.json 9f122183a1b04ac6346631db4f505e53ed333acf assets/create/models/item/orange_table_cloth.json @@ -2475,6 +2475,9 @@ dadc7b65a4527e288c21a20df978796a8c444fd2 assets/create/models/item/waxed_weather 99f17b16b68201aefb78298b3e6c657e3c2235e0 assets/create/models/item/weathered_copper_tiles.json 0b1b299d6dfab65b6060305a8b3e51f6e2df09f4 assets/create/models/item/weathered_copper_tile_slab.json 0c3989b44fde934ba8b88b071887e5ede522c417 assets/create/models/item/weathered_copper_tile_stairs.json +b5d591fbb40e062efe301b3b3b49580e5ad64566 assets/create/models/item/weathered_iron_block.json +a569ddd725898a86f8745e46723edeff7fe7f2e9 assets/create/models/item/weathered_iron_window.json +a262cbdf9aa0c240f623dcadd42864d280d36978 assets/create/models/item/weathered_iron_window_pane.json 79431edb868e6560f4f6d5b3441c0176c7699f5e assets/create/models/item/weighted_ejector.json 0fd2214cdff8a92e05d9d5ee888329b3235143c0 assets/create/models/item/wheat_flour.json aacced59d21212090d508a9684bb46c9472a8a2f assets/create/models/item/whisk.json @@ -2937,8 +2940,6 @@ e5a41a95a03ef12c8d002f7b884da164b9fe5adf data/create/advancements/recipes/buildi be72964ed354ab3772c9103ca089b48369a3f4df data/create/advancements/recipes/building_blocks/oak_window_pane.json ee4586fa007fd595b90172f246153130dd9a10f6 data/create/advancements/recipes/building_blocks/ochrum_from_stone_types_ochrum_stonecutting.json 15642e7fe5f36a84382a33e0ca90c328e9906155 data/create/advancements/recipes/building_blocks/ochrum_pillar_from_stone_types_ochrum_stonecutting.json -71847992255d1ff09a24104b1854345f4022fb7c data/create/advancements/recipes/building_blocks/old_factory_window.json -fea0f527914a812bdf0e60002aa407855ecb4328 data/create/advancements/recipes/building_blocks/old_factory_window_pane.json 8779e790fe3f51319a9a03388adb87ff98826159 data/create/advancements/recipes/building_blocks/ornate_iron_window.json c8b8f792d2e9ffea70330f2c1659d567c12913b1 data/create/advancements/recipes/building_blocks/ornate_iron_window_pane.json ad88d3e8914d3caeda60553894182dfd498e51ae data/create/advancements/recipes/building_blocks/oxidized_copper_shingle_slab.json @@ -3200,6 +3201,9 @@ a9e35aaf621cdb2648f4b9e9beacc91092e8d3b3 data/create/advancements/recipes/buildi 7eeaf1b7cf0a788d4b9a61274cf4752ba1fe57cb data/create/advancements/recipes/building_blocks/weathered_copper_tile_slab_from_weathered_copper_tiles_stonecutting.json 86e0a3eb797ecdfd1626ce84f26e25c503a68587 data/create/advancements/recipes/building_blocks/weathered_copper_tile_stairs.json f093326ca1f341bede9f7cbefecadf7d73d3f9d7 data/create/advancements/recipes/building_blocks/weathered_copper_tile_stairs_from_weathered_copper_tiles_stonecutting.json +c1b0ce558aad75210d8b95c982dbe063982fe567 data/create/advancements/recipes/building_blocks/weathered_iron_block_from_ingots_iron_stonecutting.json +587dd224181b7008f65ebf3b198bb23475cdec47 data/create/advancements/recipes/building_blocks/weathered_iron_window.json +0847f40c57682514297b0dbf520fd88728507bd1 data/create/advancements/recipes/building_blocks/weathered_iron_window_pane.json 39c93330e07e58d79db13d132d7f1a8f33670e9b data/create/advancements/recipes/decorations/andesite_bars_from_andesite_alloy_stonecutting.json 769926b9bb00dea3bf0534c8d828873b13def961 data/create/advancements/recipes/decorations/andesite_ladder_from_andesite_alloy_stonecutting.json 266700212dece6cba8c338a1e0a8507bb41f92e6 data/create/advancements/recipes/decorations/andesite_scaffolding_from_andesite_alloy_stonecutting.json @@ -3614,8 +3618,6 @@ fe79cb4cbea87efc84d61d3d31f073bf3c64c73d data/create/loot_tables/blocks/netherit 5dcb11160a51ce17fb06f5fecc14e87d92b1a641 data/create/loot_tables/blocks/oak_window_pane.json 461e9818f41aab34905757a423455cdcee780e67 data/create/loot_tables/blocks/ochrum.json 1259a439286385d5b7c48bff89d0839f1f2e02c2 data/create/loot_tables/blocks/ochrum_pillar.json -b124ea55ec522e0f314b972efed525647a2912cb data/create/loot_tables/blocks/old_factory_window.json -fae5fe1ab6b83f5488e82d6b95da1cb0a6582446 data/create/loot_tables/blocks/old_factory_window_pane.json 3f6940f13ca705bad7cdb9a9b80a3ae84f70f80c data/create/loot_tables/blocks/orange_postbox.json d6323d4b30faa87cd4b5b8b815cb16f78296f203 data/create/loot_tables/blocks/orange_sail.json 119fc4c3055c09c7958ac405925a6b7be2081c6b data/create/loot_tables/blocks/orange_seat.json @@ -3867,6 +3869,9 @@ f309ffd94dfb3591efd2fab337a871a0ceff1084 data/create/loot_tables/blocks/waxed_we 771d98a6627d707228719e843bc80636b02dc985 data/create/loot_tables/blocks/weathered_copper_tiles.json d6862dc9f7d291df618fbce71eebf613711a5517 data/create/loot_tables/blocks/weathered_copper_tile_slab.json 57d5065d53016e4b1ef0fbad9b84605b1546bcc4 data/create/loot_tables/blocks/weathered_copper_tile_stairs.json +013deea9b687ce96e5042de13ab0cba9dadce364 data/create/loot_tables/blocks/weathered_iron_block.json +f0c51ad0a713aab00dff913361b8e5e8448b912a data/create/loot_tables/blocks/weathered_iron_window.json +1d3ea471ec3f2bbf10c7a11f040f8bbf0d1576a8 data/create/loot_tables/blocks/weathered_iron_window_pane.json f6ba0623b4bcea2f3796df4c65c494fc072d2c21 data/create/loot_tables/blocks/weighted_ejector.json 978263272f632ed79a61d52a0080de0b7b8102d6 data/create/loot_tables/blocks/white_nixie_tube.json 3d8a4d4a9634d49b20f65ebcdddaef2d0f21b36b data/create/loot_tables/blocks/white_postbox.json @@ -4356,8 +4361,6 @@ efcbb602a5274a037af323bf5ef40756cbb8683c data/create/recipes/layered_tuff_from_s cd98d5d6b0ff6b56e8948a862070199c14f2ec10 data/create/recipes/oak_window_pane.json 9e1eaa83597afe00485940018be874885f02b1f7 data/create/recipes/ochrum_from_stone_types_ochrum_stonecutting.json 308dbf17a3a418849d9db74e7f88af442f50025a data/create/recipes/ochrum_pillar_from_stone_types_ochrum_stonecutting.json -b621fdf08968117bb16bdfdf1ae2f1d53229fb15 data/create/recipes/old_factory_window.json -30cf6728c6e7206d6fd0fb8bf72c4c9ec8e40669 data/create/recipes/old_factory_window_pane.json 4faec6e4889dac615eeda631ea346c5fe745ee86 data/create/recipes/ornate_iron_window.json f5e5a1c293b16690ab3e5c3941e24a99181133e5 data/create/recipes/ornate_iron_window_pane.json f07589f1079d13e0b93ce11a2d6e953e0842c5d0 data/create/recipes/oxidized_copper_shingle_slab.json @@ -4619,6 +4622,9 @@ fdd28fc956dbec71ba24cdea5adfc049d6eb31e3 data/create/recipes/tuff_pillar_from_st 93c61ebeda451ebeb37c3047459f95f14fa9f1f9 data/create/recipes/weathered_copper_tile_slab_from_weathered_copper_tiles_stonecutting.json 8a32b955b4320eddff017378785d1c95e1434229 data/create/recipes/weathered_copper_tile_stairs.json f1a03ac86925e26cbec6aeeada2eafb40008fc8e data/create/recipes/weathered_copper_tile_stairs_from_weathered_copper_tiles_stonecutting.json +4b5fc518830e3c57471f930deacf0abee4ae6313 data/create/recipes/weathered_iron_block_from_ingots_iron_stonecutting.json +a57dfe9974b8b6d338b9ab4ae124297fda7780b9 data/create/recipes/weathered_iron_window.json +11034a79e8f167249b78e6e3863e01991ac9d778 data/create/recipes/weathered_iron_window_pane.json f365be4eda73234b73aa49c97b065f1a8baafbf6 data/create/tags/blocks/brittle.json 8b6c0b444b15f7fb2d55b9cbcb68537c1269f877 data/create/tags/blocks/casing.json 35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/create/tags/blocks/contraption_inventory_deny.json @@ -4645,7 +4651,7 @@ f400870b8dbcd14238be3ec99c419093073ba3a6 data/create/tags/blocks/postboxes.json 1b6977d9a399cf6ee042e3f8f5e64e4d3cda5489 data/create/tags/blocks/tree_attachments.json da739ad2160e7df4e0e5cc89587670ce5e9450c3 data/create/tags/blocks/valve_handles.json 72143286fb5cb372a0696550e2eac76ca50e6fbc data/create/tags/blocks/windmill_sails.json -58987ea71d488cc48192ceb00c00aa2903e51304 data/create/tags/blocks/wrench_pickup.json +30a54ad8eb06f2335705f5f01d12085ab4841dff data/create/tags/blocks/wrench_pickup.json 76c0522664726c09461ad4565b6fba80b4f816b2 data/create/tags/entity_types/blaze_burner_capturable.json 35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/create/tags/entity_types/ignore_seat.json 894e1e4fd1e32712abdda18ec64ab13750d3c039 data/create/tags/fluids/bottomless/allow.json @@ -4698,7 +4704,7 @@ c59c9fc0cdd45de659aa8023d36f9decb90f708c data/create/tags/items/vanilla_stripped 64441ac1daa64c81601b94b82b21c0ee862b6344 data/create/tags/items/vanilla_stripped_wood.json edf7390f09e622193bbc720ec51ba128ea1e96e6 data/curios/tags/items/head.json 10d5f0c1763f80860a39398ecc33dbbe43099471 data/forge/tags/blocks/glass/colorless.json -331218cbfb06e415de8af903418f192f2d875642 data/forge/tags/blocks/glass_panes.json +220b4c682f6cf536534e7cd6a79a9acc811bacd2 data/forge/tags/blocks/glass_panes.json 81b107ada9c6ac5679a21f8c6a006bf230f69c39 data/forge/tags/blocks/ores.json 81b107ada9c6ac5679a21f8c6a006bf230f69c39 data/forge/tags/blocks/ores/zinc.json e475ad1c52bffedfc544e5331a87c1f5c45149fd data/forge/tags/blocks/ores_in_ground/deepslate.json @@ -4726,7 +4732,7 @@ afdac448376ff5624f49cbf31feedf691ecbc4c5 data/forge/tags/items/armors/leggings.j 745512f10c4ba52f2c224607377e41011fb2ecfe data/forge/tags/items/flour.json 745512f10c4ba52f2c224607377e41011fb2ecfe data/forge/tags/items/flour/wheat.json 10d5f0c1763f80860a39398ecc33dbbe43099471 data/forge/tags/items/glass/colorless.json -331218cbfb06e415de8af903418f192f2d875642 data/forge/tags/items/glass_panes.json +220b4c682f6cf536534e7cd6a79a9acc811bacd2 data/forge/tags/items/glass_panes.json 01d32d3b7b033aff44c047bf289d696de0b0c715 data/forge/tags/items/ingots.json 5a7bffd1d604bc6ea8b35714ef02b95773240f90 data/forge/tags/items/ingots/brass.json ccf5b08295f6362a3f6b3b595f1de1bba4b224ec data/forge/tags/items/ingots/zinc.json @@ -4761,10 +4767,10 @@ c741ba83b562ae3459d7c4f2db69537f549ea411 data/forge/tags/items/tools/wrench.json 82274e06b6a9f3bfd83c8b59be38dee4a15b8bf3 data/minecraft/tags/blocks/climbable.json 71aef080a900d9e86818cf579438c3d826d6567e data/minecraft/tags/blocks/doors.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/dripstone_replaceable_blocks.json -480664a5d834f0c1168aaa6de8359d4faf720314 data/minecraft/tags/blocks/impermeable.json +f8bd9b33238ab9f2f2a83b63bf0c52fbf705b452 data/minecraft/tags/blocks/impermeable.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/lush_ground_replaceable.json 632b3589bae819777af7129b534f1c10e810cf5d data/minecraft/tags/blocks/mineable/axe.json -b57faf9231efb408e49810b962cccb10566e1f05 data/minecraft/tags/blocks/mineable/pickaxe.json +47df6c90d9474d7a708063b0207e520ad01f1998 data/minecraft/tags/blocks/mineable/pickaxe.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/moss_replaceable.json 0c13aae0eeb99e89febe8dbe5e002af2ff843a9e data/minecraft/tags/blocks/needs_iron_tool.json 3cb2a92cbdf32ed5978f740dc378d363306c3e84 data/minecraft/tags/blocks/needs_stone_tool.json diff --git a/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 b/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 index fef88f8bc8..be9555e776 100644 --- a/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 +++ b/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 @@ -1,4 +1,4 @@ -// 1.20.1 2024-12-11T11:42:35.0350518 Create's Processing Recipes +// 1.20.1 2024-12-12T16:30:46.5531873 Create's Processing Recipes 3c94326fb730f68c1e44fe1e2ef09c9db6ffd92b data/create/recipes/compacting/andesite_from_flint.json 8d3d5b31f3601b9f681ff710e0545a483a1494c6 data/create/recipes/compacting/blaze_cake.json 8bd7f4e3a686ab520b2d55594d2018d0e9a50c91 data/create/recipes/compacting/chocolate.json @@ -1047,6 +1047,9 @@ b5a0a0fc79bf310965aa16e78044b3f6a8a9998f data/create/recipes/splashing/ic2/crush 6707b4319280ce28e1edd594e58549f65cd8376c data/create/recipes/splashing/immersiveengineering/crushed_raw_nickel.json d379607eda7fba5048751d806a245d58e91acc1f data/create/recipes/splashing/immersiveengineering/crushed_raw_silver.json 8afc0810a0166a62d8d394f2841d27e7f7a3e6c5 data/create/recipes/splashing/immersiveengineering/crushed_raw_uranium.json +cafec636b007eeb5df2092824464c91661a13004 data/create/recipes/splashing/industrial_iron_block.json +38ed0fb231d19ed30ba3debc0bebf8ffbc5f5a72 data/create/recipes/splashing/industrial_iron_window.json +ffede841a2104f7266425288bd328e7236ebd9e4 data/create/recipes/splashing/industrial_iron_window_pane.json 676a409aadcbf2497b366234c5186c6192a67c8d data/create/recipes/splashing/light_blue_concrete_powder.json d4053dba524524329f43df5bdde81d9ee07838b5 data/create/recipes/splashing/light_gray_concrete_powder.json 3d87975758344a4e420c3c5a138dd300e97cf3c4 data/create/recipes/splashing/lime_concrete_powder.json diff --git a/src/generated/resources/assets/create/blockstates/old_factory_window.json b/src/generated/resources/assets/create/blockstates/old_factory_window.json deleted file mode 100644 index 5141afdf12..0000000000 --- a/src/generated/resources/assets/create/blockstates/old_factory_window.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "variants": { - "": [ - { - "model": "create:block/old_factory_window_1" - }, - { - "model": "create:block/old_factory_window_2" - }, - { - "model": "create:block/old_factory_window_3" - }, - { - "model": "create:block/old_factory_window_4" - } - ] - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/weathered_iron_block.json b/src/generated/resources/assets/create/blockstates/weathered_iron_block.json new file mode 100644 index 0000000000..e16d717b98 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/weathered_iron_block.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/weathered_iron_block" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/weathered_iron_window.json b/src/generated/resources/assets/create/blockstates/weathered_iron_window.json new file mode 100644 index 0000000000..95b1ba318a --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/weathered_iron_window.json @@ -0,0 +1,18 @@ +{ + "variants": { + "": [ + { + "model": "create:block/weathered_iron_window_1" + }, + { + "model": "create:block/weathered_iron_window_2" + }, + { + "model": "create:block/weathered_iron_window_3" + }, + { + "model": "create:block/weathered_iron_window_4" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/old_factory_window_pane.json b/src/generated/resources/assets/create/blockstates/weathered_iron_window_pane.json similarity index 57% rename from src/generated/resources/assets/create/blockstates/old_factory_window_pane.json rename to src/generated/resources/assets/create/blockstates/weathered_iron_window_pane.json index 9a647d2106..7fa9fb0536 100644 --- a/src/generated/resources/assets/create/blockstates/old_factory_window_pane.json +++ b/src/generated/resources/assets/create/blockstates/weathered_iron_window_pane.json @@ -2,12 +2,12 @@ "multipart": [ { "apply": { - "model": "create:block/old_factory_window_pane_post" + "model": "create:block/weathered_iron_window_pane_post" } }, { "apply": { - "model": "create:block/old_factory_window_pane_side" + "model": "create:block/weathered_iron_window_pane_side" }, "when": { "north": "true" @@ -15,7 +15,7 @@ }, { "apply": { - "model": "create:block/old_factory_window_pane_noside" + "model": "create:block/weathered_iron_window_pane_noside" }, "when": { "north": "false" @@ -23,7 +23,7 @@ }, { "apply": { - "model": "create:block/old_factory_window_pane_side_alt" + "model": "create:block/weathered_iron_window_pane_side_alt" }, "when": { "south": "true" @@ -31,7 +31,7 @@ }, { "apply": { - "model": "create:block/old_factory_window_pane_noside_alt", + "model": "create:block/weathered_iron_window_pane_noside_alt", "y": 90 }, "when": { @@ -40,7 +40,7 @@ }, { "apply": { - "model": "create:block/old_factory_window_pane_side_alt", + "model": "create:block/weathered_iron_window_pane_side_alt", "y": 90 }, "when": { @@ -49,7 +49,7 @@ }, { "apply": { - "model": "create:block/old_factory_window_pane_noside", + "model": "create:block/weathered_iron_window_pane_noside", "y": 270 }, "when": { @@ -58,7 +58,7 @@ }, { "apply": { - "model": "create:block/old_factory_window_pane_side", + "model": "create:block/weathered_iron_window_pane_side", "y": 90 }, "when": { @@ -67,7 +67,7 @@ }, { "apply": { - "model": "create:block/old_factory_window_pane_noside_alt" + "model": "create:block/weathered_iron_window_pane_noside_alt" }, "when": { "east": "false" diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 9864da8916..138e1c1d95 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -595,8 +595,6 @@ "block.create.oak_window_pane": "ǝuɐԀ ʍopuıM ʞɐO", "block.create.ochrum": "ɯnɹɥɔO", "block.create.ochrum_pillar": "ɹɐןןıԀ ɯnɹɥɔO", - "block.create.old_factory_window": "ʍopuıM ʎɹoʇɔɐℲ pןO", - "block.create.old_factory_window_pane": "ǝuɐԀ ʍopuıM ʎɹoʇɔɐℲ pןO", "block.create.orange_postbox": "xoqʇsoԀ ǝbuɐɹO", "block.create.orange_sail": "ןıɐS ǝbuɐɹO", "block.create.orange_seat": "ʇɐǝS ǝbuɐɹO", @@ -879,6 +877,9 @@ "block.create.weathered_copper_tile_slab": "qɐןS ǝןı⟘ ɹǝddoƆ pǝɹǝɥʇɐǝM", "block.create.weathered_copper_tile_stairs": "sɹıɐʇS ǝןı⟘ ɹǝddoƆ pǝɹǝɥʇɐǝM", "block.create.weathered_copper_tiles": "sǝןı⟘ ɹǝddoƆ pǝɹǝɥʇɐǝM", + "block.create.weathered_iron_block": "uoɹI pǝɹǝɥʇɐǝM ɟo ʞɔoןᗺ", + "block.create.weathered_iron_window": "ʍopuıM uoɹI pǝɹǝɥʇɐǝM", + "block.create.weathered_iron_window_pane": "ǝuɐԀ ʍopuıM uoɹI pǝɹǝɥʇɐǝM", "block.create.weighted_ejector": "ɹoʇɔǝظƎ pǝʇɥbıǝM", "block.create.white_nixie_tube": "ǝqn⟘ ǝıxıN ǝʇıɥM", "block.create.white_postbox": "xoqʇsoԀ ǝʇıɥM", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 7cdd09a161..86250c07cb 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -595,8 +595,6 @@ "block.create.oak_window_pane": "Oak Window Pane", "block.create.ochrum": "Ochrum", "block.create.ochrum_pillar": "Ochrum Pillar", - "block.create.old_factory_window": "Old Factory Window", - "block.create.old_factory_window_pane": "Old Factory Window Pane", "block.create.orange_postbox": "Orange Postbox", "block.create.orange_sail": "Orange Sail", "block.create.orange_seat": "Orange Seat", @@ -879,6 +877,9 @@ "block.create.weathered_copper_tile_slab": "Weathered Copper Tile Slab", "block.create.weathered_copper_tile_stairs": "Weathered Copper Tile Stairs", "block.create.weathered_copper_tiles": "Weathered Copper Tiles", + "block.create.weathered_iron_block": "Block of Weathered Iron", + "block.create.weathered_iron_window": "Weathered Iron Window", + "block.create.weathered_iron_window_pane": "Weathered Iron Window Pane", "block.create.weighted_ejector": "Weighted Ejector", "block.create.white_nixie_tube": "White Nixie Tube", "block.create.white_postbox": "White Postbox", diff --git a/src/generated/resources/assets/create/models/block/old_factory_window_1.json b/src/generated/resources/assets/create/models/block/old_factory_window_1.json deleted file mode 100644 index 53f0c301ff..0000000000 --- a/src/generated/resources/assets/create/models/block/old_factory_window_1.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/cube_column", - "textures": { - "end": "create:block/palettes/old_factory_window_1_end", - "side": "create:block/palettes/old_factory_window" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/old_factory_window_2.json b/src/generated/resources/assets/create/models/block/old_factory_window_2.json deleted file mode 100644 index 57b7462780..0000000000 --- a/src/generated/resources/assets/create/models/block/old_factory_window_2.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/cube_column", - "textures": { - "end": "create:block/palettes/old_factory_window_2_end", - "side": "create:block/palettes/old_factory_window" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/old_factory_window_3.json b/src/generated/resources/assets/create/models/block/old_factory_window_3.json deleted file mode 100644 index 47d62a7a19..0000000000 --- a/src/generated/resources/assets/create/models/block/old_factory_window_3.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/cube_column", - "textures": { - "end": "create:block/palettes/old_factory_window_3_end", - "side": "create:block/palettes/old_factory_window" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/old_factory_window_4.json b/src/generated/resources/assets/create/models/block/old_factory_window_4.json deleted file mode 100644 index a4ec0f60aa..0000000000 --- a/src/generated/resources/assets/create/models/block/old_factory_window_4.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/cube_column", - "textures": { - "end": "create:block/palettes/old_factory_window_4_end", - "side": "create:block/palettes/old_factory_window" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/old_factory_window_pane_noside.json b/src/generated/resources/assets/create/models/block/old_factory_window_pane_noside.json deleted file mode 100644 index 6f79e0c920..0000000000 --- a/src/generated/resources/assets/create/models/block/old_factory_window_pane_noside.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "create:block/connected_glass_pane/noside", - "textures": { - "edge": "create:block/palettes/old_factory_window_pane_top", - "pane": "create:block/palettes/old_factory_window" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/old_factory_window_pane_noside_alt.json b/src/generated/resources/assets/create/models/block/old_factory_window_pane_noside_alt.json deleted file mode 100644 index ca3ca515b8..0000000000 --- a/src/generated/resources/assets/create/models/block/old_factory_window_pane_noside_alt.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "create:block/connected_glass_pane/noside_alt", - "textures": { - "edge": "create:block/palettes/old_factory_window_pane_top", - "pane": "create:block/palettes/old_factory_window" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/old_factory_window_pane_post.json b/src/generated/resources/assets/create/models/block/old_factory_window_pane_post.json deleted file mode 100644 index de1b880cb0..0000000000 --- a/src/generated/resources/assets/create/models/block/old_factory_window_pane_post.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "create:block/connected_glass_pane/post", - "textures": { - "edge": "create:block/palettes/old_factory_window_pane_top", - "pane": "create:block/palettes/old_factory_window" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/old_factory_window_pane_side.json b/src/generated/resources/assets/create/models/block/old_factory_window_pane_side.json deleted file mode 100644 index 2d2a2ca1fd..0000000000 --- a/src/generated/resources/assets/create/models/block/old_factory_window_pane_side.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "create:block/connected_glass_pane/side", - "textures": { - "edge": "create:block/palettes/old_factory_window_pane_top", - "pane": "create:block/palettes/old_factory_window" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/old_factory_window_pane_side_alt.json b/src/generated/resources/assets/create/models/block/old_factory_window_pane_side_alt.json deleted file mode 100644 index 6c2bfc1ba5..0000000000 --- a/src/generated/resources/assets/create/models/block/old_factory_window_pane_side_alt.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "create:block/connected_glass_pane/side_alt", - "textures": { - "edge": "create:block/palettes/old_factory_window_pane_top", - "pane": "create:block/palettes/old_factory_window" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/weathered_iron_block.json b/src/generated/resources/assets/create/models/block/weathered_iron_block.json new file mode 100644 index 0000000000..5f7ccdebe4 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/weathered_iron_block.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "create:block/weathered_iron_block_top", + "side": "create:block/weathered_iron_block" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/weathered_iron_window_1.json b/src/generated/resources/assets/create/models/block/weathered_iron_window_1.json new file mode 100644 index 0000000000..6376f886b3 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/weathered_iron_window_1.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "create:block/palettes/weathered_iron_window_1_end", + "side": "create:block/palettes/weathered_iron_window" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/weathered_iron_window_2.json b/src/generated/resources/assets/create/models/block/weathered_iron_window_2.json new file mode 100644 index 0000000000..14f0a36ec5 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/weathered_iron_window_2.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "create:block/palettes/weathered_iron_window_2_end", + "side": "create:block/palettes/weathered_iron_window" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/weathered_iron_window_3.json b/src/generated/resources/assets/create/models/block/weathered_iron_window_3.json new file mode 100644 index 0000000000..18b50dc166 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/weathered_iron_window_3.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "create:block/palettes/weathered_iron_window_3_end", + "side": "create:block/palettes/weathered_iron_window" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/weathered_iron_window_4.json b/src/generated/resources/assets/create/models/block/weathered_iron_window_4.json new file mode 100644 index 0000000000..6eee07195b --- /dev/null +++ b/src/generated/resources/assets/create/models/block/weathered_iron_window_4.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "create:block/palettes/weathered_iron_window_4_end", + "side": "create:block/palettes/weathered_iron_window" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/weathered_iron_window_pane_noside.json b/src/generated/resources/assets/create/models/block/weathered_iron_window_pane_noside.json new file mode 100644 index 0000000000..a7c2623e9c --- /dev/null +++ b/src/generated/resources/assets/create/models/block/weathered_iron_window_pane_noside.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/connected_glass_pane/noside", + "textures": { + "edge": "create:block/palettes/weathered_iron_window_pane_top", + "pane": "create:block/palettes/weathered_iron_window" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/weathered_iron_window_pane_noside_alt.json b/src/generated/resources/assets/create/models/block/weathered_iron_window_pane_noside_alt.json new file mode 100644 index 0000000000..c1b049e593 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/weathered_iron_window_pane_noside_alt.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/connected_glass_pane/noside_alt", + "textures": { + "edge": "create:block/palettes/weathered_iron_window_pane_top", + "pane": "create:block/palettes/weathered_iron_window" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/weathered_iron_window_pane_post.json b/src/generated/resources/assets/create/models/block/weathered_iron_window_pane_post.json new file mode 100644 index 0000000000..836f61fc95 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/weathered_iron_window_pane_post.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/connected_glass_pane/post", + "textures": { + "edge": "create:block/palettes/weathered_iron_window_pane_top", + "pane": "create:block/palettes/weathered_iron_window" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/weathered_iron_window_pane_side.json b/src/generated/resources/assets/create/models/block/weathered_iron_window_pane_side.json new file mode 100644 index 0000000000..c6bb36f691 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/weathered_iron_window_pane_side.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/connected_glass_pane/side", + "textures": { + "edge": "create:block/palettes/weathered_iron_window_pane_top", + "pane": "create:block/palettes/weathered_iron_window" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/weathered_iron_window_pane_side_alt.json b/src/generated/resources/assets/create/models/block/weathered_iron_window_pane_side_alt.json new file mode 100644 index 0000000000..73c130b128 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/weathered_iron_window_pane_side_alt.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/connected_glass_pane/side_alt", + "textures": { + "edge": "create:block/palettes/weathered_iron_window_pane_top", + "pane": "create:block/palettes/weathered_iron_window" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/old_factory_window.json b/src/generated/resources/assets/create/models/item/old_factory_window.json deleted file mode 100644 index 53f0c301ff..0000000000 --- a/src/generated/resources/assets/create/models/item/old_factory_window.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/cube_column", - "textures": { - "end": "create:block/palettes/old_factory_window_1_end", - "side": "create:block/palettes/old_factory_window" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/old_factory_window_pane.json b/src/generated/resources/assets/create/models/item/old_factory_window_pane.json deleted file mode 100644 index de6e6cf3a9..0000000000 --- a/src/generated/resources/assets/create/models/item/old_factory_window_pane.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "create:item/pane", - "textures": { - "edge": "create:block/palettes/old_factory_window_pane_top", - "pane": "create:block/palettes/old_factory_window" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/weathered_iron_block.json b/src/generated/resources/assets/create/models/item/weathered_iron_block.json new file mode 100644 index 0000000000..beab17e2e1 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/weathered_iron_block.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/weathered_iron_block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/weathered_iron_window.json b/src/generated/resources/assets/create/models/item/weathered_iron_window.json new file mode 100644 index 0000000000..6376f886b3 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/weathered_iron_window.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "create:block/palettes/weathered_iron_window_1_end", + "side": "create:block/palettes/weathered_iron_window" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/weathered_iron_window_pane.json b/src/generated/resources/assets/create/models/item/weathered_iron_window_pane.json new file mode 100644 index 0000000000..23fc86eb14 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/weathered_iron_window_pane.json @@ -0,0 +1,7 @@ +{ + "parent": "create:item/pane", + "textures": { + "edge": "create:block/palettes/weathered_iron_window_pane_top", + "pane": "create:block/palettes/weathered_iron_window" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/weathered_iron_block_from_ingots_iron_stonecutting.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/weathered_iron_block_from_ingots_iron_stonecutting.json new file mode 100644 index 0000000000..536e814bf9 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/weathered_iron_block_from_ingots_iron_stonecutting.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_ingots_iron": { + "conditions": { + "items": [ + { + "tag": "forge:ingots/iron" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:weathered_iron_block_from_ingots_iron_stonecutting" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_ingots_iron", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:weathered_iron_block_from_ingots_iron_stonecutting" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/old_factory_window.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/weathered_iron_window.json similarity index 80% rename from src/generated/resources/data/create/advancements/recipes/building_blocks/old_factory_window.json rename to src/generated/resources/data/create/advancements/recipes/building_blocks/weathered_iron_window.json index dbc44c3cfa..b2d722cdbf 100644 --- a/src/generated/resources/data/create/advancements/recipes/building_blocks/old_factory_window.json +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/weathered_iron_window.json @@ -6,7 +6,7 @@ "items": [ { "items": [ - "create:industrial_iron_block" + "create:weathered_iron_block" ] } ] @@ -15,7 +15,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "create:old_factory_window" + "recipe": "create:weathered_iron_window" }, "trigger": "minecraft:recipe_unlocked" } @@ -28,7 +28,7 @@ ], "rewards": { "recipes": [ - "create:old_factory_window" + "create:weathered_iron_window" ] }, "sends_telemetry_event": false diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/old_factory_window_pane.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/weathered_iron_window_pane.json similarity index 78% rename from src/generated/resources/data/create/advancements/recipes/building_blocks/old_factory_window_pane.json rename to src/generated/resources/data/create/advancements/recipes/building_blocks/weathered_iron_window_pane.json index ef43ce9f98..9f5ea0d6b5 100644 --- a/src/generated/resources/data/create/advancements/recipes/building_blocks/old_factory_window_pane.json +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/weathered_iron_window_pane.json @@ -6,7 +6,7 @@ "items": [ { "items": [ - "create:old_factory_window" + "create:weathered_iron_window" ] } ] @@ -15,7 +15,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "create:old_factory_window_pane" + "recipe": "create:weathered_iron_window_pane" }, "trigger": "minecraft:recipe_unlocked" } @@ -28,7 +28,7 @@ ], "rewards": { "recipes": [ - "create:old_factory_window_pane" + "create:weathered_iron_window_pane" ] }, "sends_telemetry_event": false diff --git a/src/generated/resources/data/create/loot_tables/blocks/weathered_iron_block.json b/src/generated/resources/data/create/loot_tables/blocks/weathered_iron_block.json new file mode 100644 index 0000000000..a17ac769e5 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/weathered_iron_block.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "create:weathered_iron_block" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "create:blocks/weathered_iron_block" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/old_factory_window.json b/src/generated/resources/data/create/loot_tables/blocks/weathered_iron_window.json similarity index 83% rename from src/generated/resources/data/create/loot_tables/blocks/old_factory_window.json rename to src/generated/resources/data/create/loot_tables/blocks/weathered_iron_window.json index 0da5907102..eacfb06c5e 100644 --- a/src/generated/resources/data/create/loot_tables/blocks/old_factory_window.json +++ b/src/generated/resources/data/create/loot_tables/blocks/weathered_iron_window.json @@ -21,11 +21,11 @@ "entries": [ { "type": "minecraft:item", - "name": "create:old_factory_window" + "name": "create:weathered_iron_window" } ], "rolls": 1.0 } ], - "random_sequence": "create:blocks/old_factory_window" + "random_sequence": "create:blocks/weathered_iron_window" } \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/old_factory_window_pane.json b/src/generated/resources/data/create/loot_tables/blocks/weathered_iron_window_pane.json similarity index 81% rename from src/generated/resources/data/create/loot_tables/blocks/old_factory_window_pane.json rename to src/generated/resources/data/create/loot_tables/blocks/weathered_iron_window_pane.json index fefa4592dc..59be15f4ad 100644 --- a/src/generated/resources/data/create/loot_tables/blocks/old_factory_window_pane.json +++ b/src/generated/resources/data/create/loot_tables/blocks/weathered_iron_window_pane.json @@ -21,11 +21,11 @@ "entries": [ { "type": "minecraft:item", - "name": "create:old_factory_window_pane" + "name": "create:weathered_iron_window_pane" } ], "rolls": 1.0 } ], - "random_sequence": "create:blocks/old_factory_window_pane" + "random_sequence": "create:blocks/weathered_iron_window_pane" } \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/splashing/industrial_iron_block.json b/src/generated/resources/data/create/recipes/splashing/industrial_iron_block.json new file mode 100644 index 0000000000..52a2aa5cf6 --- /dev/null +++ b/src/generated/resources/data/create/recipes/splashing/industrial_iron_block.json @@ -0,0 +1,13 @@ +{ + "type": "create:splashing", + "ingredients": [ + { + "item": "create:industrial_iron_block" + } + ], + "results": [ + { + "item": "create:weathered_iron_block" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/splashing/industrial_iron_window.json b/src/generated/resources/data/create/recipes/splashing/industrial_iron_window.json new file mode 100644 index 0000000000..01250ef1a3 --- /dev/null +++ b/src/generated/resources/data/create/recipes/splashing/industrial_iron_window.json @@ -0,0 +1,13 @@ +{ + "type": "create:splashing", + "ingredients": [ + { + "item": "create:industrial_iron_window" + } + ], + "results": [ + { + "item": "create:weathered_iron_window" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/splashing/industrial_iron_window_pane.json b/src/generated/resources/data/create/recipes/splashing/industrial_iron_window_pane.json new file mode 100644 index 0000000000..7ccbc88881 --- /dev/null +++ b/src/generated/resources/data/create/recipes/splashing/industrial_iron_window_pane.json @@ -0,0 +1,13 @@ +{ + "type": "create:splashing", + "ingredients": [ + { + "item": "create:industrial_iron_window_pane" + } + ], + "results": [ + { + "item": "create:weathered_iron_window_pane" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/weathered_iron_block_from_ingots_iron_stonecutting.json b/src/generated/resources/data/create/recipes/weathered_iron_block_from_ingots_iron_stonecutting.json new file mode 100644 index 0000000000..66caa8bb5d --- /dev/null +++ b/src/generated/resources/data/create/recipes/weathered_iron_block_from_ingots_iron_stonecutting.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 2, + "ingredient": { + "tag": "forge:ingots/iron" + }, + "result": "create:weathered_iron_block" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/old_factory_window.json b/src/generated/resources/data/create/recipes/weathered_iron_window.json similarity index 74% rename from src/generated/resources/data/create/recipes/old_factory_window.json rename to src/generated/resources/data/create/recipes/weathered_iron_window.json index 89c8f60ea4..78014a9503 100644 --- a/src/generated/resources/data/create/recipes/old_factory_window.json +++ b/src/generated/resources/data/create/recipes/weathered_iron_window.json @@ -3,7 +3,7 @@ "category": "building", "key": { "#": { - "item": "create:industrial_iron_block" + "item": "create:weathered_iron_block" }, "X": { "tag": "forge:glass/colorless" @@ -15,7 +15,7 @@ ], "result": { "count": 2, - "item": "create:old_factory_window" + "item": "create:weathered_iron_window" }, "show_notification": true } \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/old_factory_window_pane.json b/src/generated/resources/data/create/recipes/weathered_iron_window_pane.json similarity index 68% rename from src/generated/resources/data/create/recipes/old_factory_window_pane.json rename to src/generated/resources/data/create/recipes/weathered_iron_window_pane.json index 20874e2bef..773c390796 100644 --- a/src/generated/resources/data/create/recipes/old_factory_window_pane.json +++ b/src/generated/resources/data/create/recipes/weathered_iron_window_pane.json @@ -3,7 +3,7 @@ "category": "building", "key": { "#": { - "item": "create:old_factory_window" + "item": "create:weathered_iron_window" } }, "pattern": [ @@ -12,7 +12,7 @@ ], "result": { "count": 16, - "item": "create:old_factory_window_pane" + "item": "create:weathered_iron_window_pane" }, "show_notification": true } \ No newline at end of file diff --git a/src/generated/resources/data/create/tags/blocks/wrench_pickup.json b/src/generated/resources/data/create/tags/blocks/wrench_pickup.json index 6037359262..ec5718f41d 100644 --- a/src/generated/resources/data/create/tags/blocks/wrench_pickup.json +++ b/src/generated/resources/data/create/tags/blocks/wrench_pickup.json @@ -4,6 +4,7 @@ "create:brass_bars", "create:copper_bars", "create:industrial_iron_block", + "create:weathered_iron_block", "minecraft:redstone_wire", "minecraft:redstone_torch", "minecraft:repeater", diff --git a/src/generated/resources/data/forge/tags/blocks/glass_panes.json b/src/generated/resources/data/forge/tags/blocks/glass_panes.json index a5e8adda59..4b82571bf4 100644 --- a/src/generated/resources/data/forge/tags/blocks/glass_panes.json +++ b/src/generated/resources/data/forge/tags/blocks/glass_panes.json @@ -17,6 +17,6 @@ "create:bamboo_window_pane", "create:ornate_iron_window_pane", "create:industrial_iron_window_pane", - "create:old_factory_window_pane" + "create:weathered_iron_window_pane" ] } \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/glass_panes.json b/src/generated/resources/data/forge/tags/items/glass_panes.json index a5e8adda59..4b82571bf4 100644 --- a/src/generated/resources/data/forge/tags/items/glass_panes.json +++ b/src/generated/resources/data/forge/tags/items/glass_panes.json @@ -17,6 +17,6 @@ "create:bamboo_window_pane", "create:ornate_iron_window_pane", "create:industrial_iron_window_pane", - "create:old_factory_window_pane" + "create:weathered_iron_window_pane" ] } \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/impermeable.json b/src/generated/resources/data/minecraft/tags/blocks/impermeable.json index 673ef4c6eb..7397212c94 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/impermeable.json +++ b/src/generated/resources/data/minecraft/tags/blocks/impermeable.json @@ -17,6 +17,6 @@ "create:bamboo_window", "create:ornate_iron_window", "create:industrial_iron_window", - "create:old_factory_window" + "create:weathered_iron_window" ] } \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json index 885596fd88..07d3648425 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json @@ -196,6 +196,7 @@ "create:zinc_block", "create:andesite_alloy_block", "create:industrial_iron_block", + "create:weathered_iron_block", "create:brass_block", "create:experience_block", "create:rose_quartz_block", diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index e8c51dbe7e..893c99b978 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -2531,19 +2531,13 @@ public class AllBlocks { .register(); public static final BlockEntry INDUSTRIAL_IRON_BLOCK = REGISTRATE.block("industrial_iron_block", Block::new) - .initialProperties(SharedProperties::softMetal) - .properties(p -> p.mapColor(MapColor.COLOR_GRAY) - .sound(SoundType.NETHERITE_BLOCK) - .requiresCorrectToolForDrops()) - .transform(pickaxeOnly()) - .blockstate((c, p) -> p.simpleBlock(c.get(), p.models() - .cubeColumn(c.getName(), p.modLoc("block/industrial_iron_block"), - p.modLoc("block/industrial_iron_block_top")))) - .tag(AllBlockTags.WRENCH_PICKUP.tag) + .transform(BuilderTransformers.palettesIronBlock()) .lang("Block of Industrial Iron") - .recipe((c, p) -> p.stonecutting(DataIngredient.tag(Tags.Items.INGOTS_IRON), RecipeCategory.BUILDING_BLOCKS, - c::get, 2)) - .simpleItem() + .register(); + + public static final BlockEntry WEATHERED_IRON_BLOCK = REGISTRATE.block("weathered_iron_block", Block::new) + .transform(BuilderTransformers.palettesIronBlock()) + .lang("Block of Weathered Iron") .register(); public static final BlockEntry BRASS_BLOCK = REGISTRATE.block("brass_block", Block::new) diff --git a/src/main/java/com/simibubi/create/AllSpriteShifts.java b/src/main/java/com/simibubi/create/AllSpriteShifts.java index a9a49c9e1e..9434ad0a06 100644 --- a/src/main/java/com/simibubi/create/AllSpriteShifts.java +++ b/src/main/java/com/simibubi/create/AllSpriteShifts.java @@ -43,10 +43,10 @@ public class AllSpriteShifts { ORNATE_IRON_WINDOW = vertical("palettes/ornate_iron_window"), INDUSTRIAL_IRON_WINDOW = getCT(AllCTTypes.RECTANGLE, "palettes/industrial_iron_window"), - OLD_FACTORY_WINDOW_1 = getCT(AllCTTypes.RECTANGLE, "palettes/old_factory_window", "palettes/old_factory_window_1"), - OLD_FACTORY_WINDOW_2 = getCT(AllCTTypes.RECTANGLE, "palettes/old_factory_window", "palettes/old_factory_window_2"), - OLD_FACTORY_WINDOW_3 = getCT(AllCTTypes.RECTANGLE, "palettes/old_factory_window", "palettes/old_factory_window_3"), - OLD_FACTORY_WINDOW_4 = getCT(AllCTTypes.RECTANGLE, "palettes/old_factory_window", "palettes/old_factory_window_4"); + OLD_FACTORY_WINDOW_1 = getCT(AllCTTypes.RECTANGLE, "palettes/weathered_iron_window", "palettes/weathered_iron_window_1"), + OLD_FACTORY_WINDOW_2 = getCT(AllCTTypes.RECTANGLE, "palettes/weathered_iron_window", "palettes/weathered_iron_window_2"), + OLD_FACTORY_WINDOW_3 = getCT(AllCTTypes.RECTANGLE, "palettes/weathered_iron_window", "palettes/weathered_iron_window_3"), + OLD_FACTORY_WINDOW_4 = getCT(AllCTTypes.RECTANGLE, "palettes/weathered_iron_window", "palettes/weathered_iron_window_4"); public static final CTSpriteShiftEntry CRAFTER_SIDE = vertical("crafter_side"), CRAFTER_OTHERSIDE = horizontal("crafter_side"), diff --git a/src/main/java/com/simibubi/create/content/decoration/palettes/AllPaletteBlocks.java b/src/main/java/com/simibubi/create/content/decoration/palettes/AllPaletteBlocks.java index 694c23327f..59b5088bd2 100644 --- a/src/main/java/com/simibubi/create/content/decoration/palettes/AllPaletteBlocks.java +++ b/src/main/java/com/simibubi/create/content/decoration/palettes/AllPaletteBlocks.java @@ -85,10 +85,10 @@ public class AllPaletteBlocks { () -> RenderType::cutout, false, () -> MapColor.TERRACOTTA_LIGHT_GRAY), INDUSTRIAL_IRON_WINDOW = customWindowBlock("industrial_iron_window", AllBlocks.INDUSTRIAL_IRON_BLOCK, () -> AllSpriteShifts.INDUSTRIAL_IRON_WINDOW, () -> RenderType::cutout, false, () -> MapColor.COLOR_GRAY), - OLD_FACTORY_WINDOW = WindowGen - .randomisedWindowBlock("old_factory_window", AllBlocks.INDUSTRIAL_IRON_BLOCK, () -> RenderType::translucent, - true, () -> MapColor.TERRACOTTA_LIGHT_GRAY) - .onRegister(CreateRegistrate.connectedTextures(() -> new OldFactoryWindowCTBehaviour())) + WEATHERED_IRON_WINDOW = WindowGen + .randomisedWindowBlock("weathered_iron_window", AllBlocks.WEATHERED_IRON_BLOCK, + () -> RenderType::translucent, true, () -> MapColor.TERRACOTTA_LIGHT_GRAY) + .onRegister(CreateRegistrate.connectedTextures(() -> new WeatheredIronWindowCTBehaviour())) .register(); public static final BlockEntry OAK_WINDOW_PANE = @@ -107,9 +107,9 @@ public class AllPaletteBlocks { () -> AllSpriteShifts.ORNATE_IRON_WINDOW, () -> RenderType::cutoutMipped).register(), INDUSTRIAL_IRON_WINDOW_PANE = customWindowPane("industrial_iron_window", INDUSTRIAL_IRON_WINDOW, () -> AllSpriteShifts.INDUSTRIAL_IRON_WINDOW, () -> RenderType::cutoutMipped).register(), - OLD_FACTORY_WINDOW_PANE = - customWindowPane("old_factory_window", OLD_FACTORY_WINDOW, null, () -> RenderType::translucent) - .onRegister(CreateRegistrate.connectedTextures(() -> new OldFactoryWindowPaneCTBehaviour())) + WEATHERED_IRON_WINDOW_PANE = + customWindowPane("weathered_iron_window", WEATHERED_IRON_WINDOW, null, () -> RenderType::translucent) + .onRegister(CreateRegistrate.connectedTextures(() -> new WeatheredIronWindowPaneCTBehaviour())) .register(); static { diff --git a/src/main/java/com/simibubi/create/content/decoration/palettes/OldFactoryWindowCTBehaviour.java b/src/main/java/com/simibubi/create/content/decoration/palettes/WeatheredIronWindowCTBehaviour.java similarity index 93% rename from src/main/java/com/simibubi/create/content/decoration/palettes/OldFactoryWindowCTBehaviour.java rename to src/main/java/com/simibubi/create/content/decoration/palettes/WeatheredIronWindowCTBehaviour.java index dcc849408f..e578b8f990 100644 --- a/src/main/java/com/simibubi/create/content/decoration/palettes/OldFactoryWindowCTBehaviour.java +++ b/src/main/java/com/simibubi/create/content/decoration/palettes/WeatheredIronWindowCTBehaviour.java @@ -19,11 +19,11 @@ import net.minecraft.util.RandomSource; import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.block.state.BlockState; -public class OldFactoryWindowCTBehaviour extends ConnectedTextureBehaviour.Base { +public class WeatheredIronWindowCTBehaviour extends ConnectedTextureBehaviour.Base { private List shifts; - public OldFactoryWindowCTBehaviour() { + public WeatheredIronWindowCTBehaviour() { this.shifts = List.of(AllSpriteShifts.OLD_FACTORY_WINDOW_1, AllSpriteShifts.OLD_FACTORY_WINDOW_2, AllSpriteShifts.OLD_FACTORY_WINDOW_3, AllSpriteShifts.OLD_FACTORY_WINDOW_4); } diff --git a/src/main/java/com/simibubi/create/content/decoration/palettes/OldFactoryWindowPaneCTBehaviour.java b/src/main/java/com/simibubi/create/content/decoration/palettes/WeatheredIronWindowPaneCTBehaviour.java similarity index 93% rename from src/main/java/com/simibubi/create/content/decoration/palettes/OldFactoryWindowPaneCTBehaviour.java rename to src/main/java/com/simibubi/create/content/decoration/palettes/WeatheredIronWindowPaneCTBehaviour.java index 767cb328e4..4f4188988d 100644 --- a/src/main/java/com/simibubi/create/content/decoration/palettes/OldFactoryWindowPaneCTBehaviour.java +++ b/src/main/java/com/simibubi/create/content/decoration/palettes/WeatheredIronWindowPaneCTBehaviour.java @@ -19,11 +19,11 @@ import net.minecraft.util.RandomSource; import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.block.state.BlockState; -public class OldFactoryWindowPaneCTBehaviour extends GlassPaneCTBehaviour { +public class WeatheredIronWindowPaneCTBehaviour extends GlassPaneCTBehaviour { private List shifts; - public OldFactoryWindowPaneCTBehaviour() { + public WeatheredIronWindowPaneCTBehaviour() { super(null); this.shifts = List.of(AllSpriteShifts.OLD_FACTORY_WINDOW_1, AllSpriteShifts.OLD_FACTORY_WINDOW_2, AllSpriteShifts.OLD_FACTORY_WINDOW_3, AllSpriteShifts.OLD_FACTORY_WINDOW_4); diff --git a/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java b/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java index 15a3b1c264..a9035726d1 100644 --- a/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java +++ b/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java @@ -90,6 +90,7 @@ import net.minecraft.world.level.storage.loot.providers.nbt.ContextNbtProvider; import net.minecraft.world.level.storage.loot.providers.number.ConstantValue; import net.minecraftforge.client.model.generators.ConfiguredModel; import net.minecraftforge.client.model.generators.ModelFile; +import net.minecraftforge.common.Tags; public class BuilderTransformers { @@ -106,7 +107,6 @@ public class BuilderTransformers { .build(); } - @SuppressWarnings("deprecation") public static NonNullUnaryOperator> bogey() { return b -> b.initialProperties(SharedProperties::softMetal) .properties(p -> p.sound(SoundType.NETHERITE_BLOCK)) @@ -536,4 +536,18 @@ public class BuilderTransformers { .build(); } + public static NonNullUnaryOperator> palettesIronBlock() { + return b -> b.initialProperties(SharedProperties::softMetal) + .properties(p -> p.mapColor(MapColor.COLOR_GRAY) + .sound(SoundType.NETHERITE_BLOCK) + .requiresCorrectToolForDrops()) + .transform(pickaxeOnly()) + .blockstate((c, p) -> p.simpleBlock(c.get(), p.models() + .cubeColumn(c.getName(), p.modLoc("block/" + c.getName()), p.modLoc("block/" + c.getName() + "_top")))) + .tag(AllBlockTags.WRENCH_PICKUP.tag) + .recipe((c, p) -> p.stonecutting(DataIngredient.tag(Tags.Items.INGOTS_IRON), RecipeCategory.BUILDING_BLOCKS, + c::get, 2)) + .simpleItem(); + } + } diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/WashingRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/WashingRecipeGen.java index 28b4e20630..54644334ee 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/WashingRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/WashingRecipeGen.java @@ -12,8 +12,10 @@ import static com.simibubi.create.foundation.data.recipe.CompatMetals.URANIUM; import java.util.function.Supplier; +import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.AllRecipeTypes; +import com.simibubi.create.content.decoration.palettes.AllPaletteBlocks; import com.tterrag.registrate.util.entry.ItemEntry; import net.minecraft.data.PackOutput; @@ -47,6 +49,13 @@ public class WashingRecipeGen extends ProcessingRecipeGen { .output(.05f, Items.DEAD_BUSH)), SAND = create(() -> Blocks.SAND, b -> b.output(.25f, Items.CLAY_BALL)), + WEATHERED_IRON_BLOCK = + create(AllBlocks.INDUSTRIAL_IRON_BLOCK::get, b -> b.output(AllBlocks.WEATHERED_IRON_BLOCK)), + WEATHERED_IRON_WINDOW = + create(AllPaletteBlocks.INDUSTRIAL_IRON_WINDOW::get, b -> b.output(AllPaletteBlocks.WEATHERED_IRON_WINDOW)), + WEATHERED_IRON_WINDOW_PANE = create(AllPaletteBlocks.INDUSTRIAL_IRON_WINDOW_PANE::get, + b -> b.output(AllPaletteBlocks.WEATHERED_IRON_WINDOW_PANE)), + CRUSHED_COPPER = crushedOre(AllItems.CRUSHED_COPPER, AllItems.COPPER_NUGGET::get, () -> Items.CLAY_BALL, .5f), CRUSHED_ZINC = crushedOre(AllItems.CRUSHED_ZINC, AllItems.ZINC_NUGGET::get, () -> Items.GUNPOWDER, .25f), CRUSHED_GOLD = crushedOre(AllItems.CRUSHED_GOLD, () -> Items.GOLD_NUGGET, () -> Items.QUARTZ, .5f), @@ -80,7 +89,7 @@ public class WashingRecipeGen extends ProcessingRecipeGen { BLUE_CONCRETE = convert(Blocks.BLUE_CONCRETE_POWDER, Blocks.BLUE_CONCRETE), CYAN_CONCRETE = convert(Blocks.CYAN_CONCRETE_POWDER, Blocks.CYAN_CONCRETE), BLACK_CONCRETE = convert(Blocks.BLACK_CONCRETE_POWDER, Blocks.BLACK_CONCRETE), - + FLOUR = create("wheat_flour", b -> b.require(I.wheatFlour()) .output(AllItems.DOUGH.get())), diff --git a/src/main/resources/assets/create/textures/block/palettes/old_factory_window.png b/src/main/resources/assets/create/textures/block/palettes/weathered_iron_window.png similarity index 100% rename from src/main/resources/assets/create/textures/block/palettes/old_factory_window.png rename to src/main/resources/assets/create/textures/block/palettes/weathered_iron_window.png diff --git a/src/main/resources/assets/create/textures/block/palettes/old_factory_window_1_connected.png b/src/main/resources/assets/create/textures/block/palettes/weathered_iron_window_1_connected.png similarity index 100% rename from src/main/resources/assets/create/textures/block/palettes/old_factory_window_1_connected.png rename to src/main/resources/assets/create/textures/block/palettes/weathered_iron_window_1_connected.png diff --git a/src/main/resources/assets/create/textures/block/palettes/old_factory_window_1_end.png b/src/main/resources/assets/create/textures/block/palettes/weathered_iron_window_1_end.png similarity index 100% rename from src/main/resources/assets/create/textures/block/palettes/old_factory_window_1_end.png rename to src/main/resources/assets/create/textures/block/palettes/weathered_iron_window_1_end.png diff --git a/src/main/resources/assets/create/textures/block/palettes/old_factory_window_2_connected.png b/src/main/resources/assets/create/textures/block/palettes/weathered_iron_window_2_connected.png similarity index 100% rename from src/main/resources/assets/create/textures/block/palettes/old_factory_window_2_connected.png rename to src/main/resources/assets/create/textures/block/palettes/weathered_iron_window_2_connected.png diff --git a/src/main/resources/assets/create/textures/block/palettes/old_factory_window_2_end.png b/src/main/resources/assets/create/textures/block/palettes/weathered_iron_window_2_end.png similarity index 100% rename from src/main/resources/assets/create/textures/block/palettes/old_factory_window_2_end.png rename to src/main/resources/assets/create/textures/block/palettes/weathered_iron_window_2_end.png diff --git a/src/main/resources/assets/create/textures/block/palettes/old_factory_window_3_connected.png b/src/main/resources/assets/create/textures/block/palettes/weathered_iron_window_3_connected.png similarity index 100% rename from src/main/resources/assets/create/textures/block/palettes/old_factory_window_3_connected.png rename to src/main/resources/assets/create/textures/block/palettes/weathered_iron_window_3_connected.png diff --git a/src/main/resources/assets/create/textures/block/palettes/old_factory_window_3_end.png b/src/main/resources/assets/create/textures/block/palettes/weathered_iron_window_3_end.png similarity index 100% rename from src/main/resources/assets/create/textures/block/palettes/old_factory_window_3_end.png rename to src/main/resources/assets/create/textures/block/palettes/weathered_iron_window_3_end.png diff --git a/src/main/resources/assets/create/textures/block/palettes/old_factory_window_4_connected.png b/src/main/resources/assets/create/textures/block/palettes/weathered_iron_window_4_connected.png similarity index 100% rename from src/main/resources/assets/create/textures/block/palettes/old_factory_window_4_connected.png rename to src/main/resources/assets/create/textures/block/palettes/weathered_iron_window_4_connected.png diff --git a/src/main/resources/assets/create/textures/block/palettes/old_factory_window_4_end.png b/src/main/resources/assets/create/textures/block/palettes/weathered_iron_window_4_end.png similarity index 100% rename from src/main/resources/assets/create/textures/block/palettes/old_factory_window_4_end.png rename to src/main/resources/assets/create/textures/block/palettes/weathered_iron_window_4_end.png diff --git a/src/main/resources/assets/create/textures/block/palettes/old_factory_window_pane_top.png b/src/main/resources/assets/create/textures/block/palettes/weathered_iron_window_pane_top.png similarity index 100% rename from src/main/resources/assets/create/textures/block/palettes/old_factory_window_pane_top.png rename to src/main/resources/assets/create/textures/block/palettes/weathered_iron_window_pane_top.png diff --git a/src/main/resources/assets/create/textures/block/weathered_iron_block.png b/src/main/resources/assets/create/textures/block/weathered_iron_block.png new file mode 100644 index 0000000000000000000000000000000000000000..46ec902faa5a16709acdb23ba278a3d9acceea45 GIT binary patch literal 789 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%Lh|0X`wFrY08lc23&bdNZa^_xJZNEi6n=OpJ_-jE#wRadC-_iAhXI2oHeQbEZF|)2B_FHpN6oSCy7#CMU07zdkT9u(YJ)&6_vv z?d@;hym|TJMMrykS6A1$bLaN%-Meb#%8M5-CL|RtvY3H^?+^$xifVW@00qTLTq8>w%JcWI z1s`%q$WYwEuyDF`mHHQ=ZKz}_*o!2qGZ8W)vL!oom%xu>bmTLos2noTemgNjZI1J z|6Ns3aU^+;iD~nu+Nxupx#QwKT1juXb@uJt`#bA1W~UsM`+0?N-p@-L8$WvOTe)wt zJafRb(mJLekIH8@9{F+k>;AXfrIYVn6mDd=7q?fS>x22i7tFVLg%hWWuG0Z|(9_k= JWt~$(69DHQF8%-j literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/weathered_iron_block_top.png b/src/main/resources/assets/create/textures/block/weathered_iron_block_top.png new file mode 100644 index 0000000000000000000000000000000000000000..0a6a24d60acc9514cdb18fb68fa067fef7093bec GIT binary patch literal 782 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%Lh|0X`wF+S+=iCKfZMPxtrtPftvYjEIPgjEs$mx3_b0ad8O=4v&e62@i|R z%*o<1o+BIY9)OT;+Zr!@Ix~i(YsA$o`#UDO=*tKKFiQ~tQ9X2!0mMv@eXI*0 z=1c;zL4XNpDic^`kfjBX1=VF}U;vVpm5Nw-j*~SP$UNlf;uxY49D6=G+%Zvr?ZMxf zGtXRW)PGs(q2k0hw`57c6t9>6|4SX-cd6Pi`|RdtN%s^Aq&M2S>BzWhJY(7}dOhIq zk!`+rZ<^llUbbiY-!0<4vMD@#6GcxkR(=ezFnaLFFnDEvU1I#fmt3n%r){oUe6l3& ziRhLK)BL_OO)o0l%jSFkOF?z}Z+08E4_D57?_@u(f7qZ&@YwoKW(U8-D*s?eJ2L;k z^40B=QSRNnB^83G$hztDnm{r-UW| D>*Ft( literal 0 HcmV?d00001 From 0fd7693c76863f14534d8e63285eea6d5552a299 Mon Sep 17 00:00:00 2001 From: Kryppers <65094918+Kryppers@users.noreply.github.com> Date: Thu, 12 Dec 2024 16:06:19 +0000 Subject: [PATCH 182/515] pixels and fixes fixed bound card side texture corrected restock gauge to vault blue minor UI adjustments swapped in rare package textures --- .../block/bound_cardboard_block_front.png | Bin 268 -> 270 bytes .../create/textures/block/factory_panel.png | Bin 692 -> 494 bytes .../block/factory_panel_packager_mode.png | Bin 540 -> 484 bytes .../create/textures/block/packager_link.png | Bin 3988 -> 1236 bytes .../assets/create/textures/gui/filters_2.png | Bin 1049 -> 1269 bytes .../textures/gui/frogport_and_mailbox.png | Bin 1286 -> 1681 bytes .../textures/item/package/rare_creeper.png | Bin 762 -> 890 bytes .../textures/item/package/rare_kryppers.png | Bin 762 -> 1101 bytes .../textures/item/package/rare_simi.png | Bin 762 -> 1102 bytes 9 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/create/textures/block/bound_cardboard_block_front.png b/src/main/resources/assets/create/textures/block/bound_cardboard_block_front.png index a9d49c67227f3d957326ea886b602a7cfd1b6172..82fb61dd1432a917b8047c87519acf7d1037e886 100644 GIT binary patch delta 149 zcmV;G0BZk?0*(TZfqx7SDjQd~BM$%o0BuP`K~xCWC5^!ez%UF0oeh!=8u|%Yr(oCp z>(jrXix@gl=c<$FVX%-+R7%-v9CG0C5XI9gr9#YnNhqA$wiFqIy>14|Dfii8mQ$2< zwA$jh-v-!n21ivcVI3UmljDX5m|MATqxG>K62Tw5MIZV~M-<3hsw`5qwRzWIUP`@uvVFheV$sOp#^0{+yJTp{LznK+bIQchrE&(uE? zEoYqUu;A21R+BN+>}$c=BHv=qU~Y@-_B~Cm7bXE8D+RtiFbn_y002ovPDHLkV1m@k BKDGb= diff --git a/src/main/resources/assets/create/textures/block/factory_panel.png b/src/main/resources/assets/create/textures/block/factory_panel.png index d5eb4624b5550db909613a67569ffd0a3181dc26..5b0609398ee8bf358733ad09a982f94a36083cd2 100644 GIT binary patch delta 448 zcmV;x0YCn<1?~foBo78+OGiWi{{a60|De66laW3ce+P6)O+^Rj3Ot^im}jO%bDN?$w%K-sQPRUX-^ zYe9=Je-;ztdV6Jp%PZ*G7A49lup3LvY0g!b4IQL~fw*puG}fLr+1 zXRtAVJ?UqFP}#0fbDR&*L+PHfU1?I#2z&Bfe?e7wDuob27y#*XT1O+1rUCgv5vKjK z=e)M*+B4G9ytr_2e!|`DjjtepJ*ALRVwxsWN_u;G@RTBx$$V=gB&7ssf=$z`*IGp= qCTMPi12DMzR|Vp$NBoKZKZ!R{1Ip8lg(!Rg0000_Lng-ykJJqC{{86B_^;lumIH=7#SNdE`XQ`vX6BE#GFY$HV7~QO=SYB z46?KUvY@&Q4GciCCoDv^1XgGQz0H{J>Eak-;lFmGt@q&oiB^B7HNKawN{R{H4bZ1Z>RZlB-XQW2Xb#IfvhhN;w! z_4gJ=Wg6-In0WcoM2SAWha2y;gfCAE7ww&zdF?sh{*dBRvy}>BiqG#o6S8PiZrD3F zV_Oq>pY1@3C z2uUh$YCibkJKwK=z4mG{Z}Ph@rf|KMj`m7R|EMIypH#WNCByq*$wGtqXVVsLxj19a z>8CCp*JBqisi|Z>Q#0@FvEL0Ddk+|~-n&)*{?8kh?OVH~gO}ValZlwdde|VQ_juB~ zSiAY(Wt~%vKF(VC>79AV%r~aqi+g@vEN6dLvv=B$=|BH7K47lCa%Nf;`@18c;P-U( Kb6Mw<&;$VYyz=}2 diff --git a/src/main/resources/assets/create/textures/block/factory_panel_packager_mode.png b/src/main/resources/assets/create/textures/block/factory_panel_packager_mode.png index 62a87fab0882a66910a0e5b87ac1a9a1443a848d..8141af9cbbeda21d090472a6e7b2fa7e4684a7d9 100644 GIT binary patch delta 469 zcmV;`0V@8S1mpvd8Gi-<001BJ|6u?C00v@9M??Vs0RI60puMM)00009a7bBm000iZ z000iZ0XPLyBme*a2XskIMF;2%1`jG4PYv_^0004TNklf2HwwC4BEi;7!+a2Dg80^luiVILL=I=ZoPUPso{sO3mW z^m+e)okoeunt$vx%0&a-f#jIP-YpoQeq*PI(*7fIrDbZTl?3Zz@0JOkf~RIJ{lQtx zmZP}RGP9QF;5Q}^A3fuTApr6`k4nnQgAak>aJVr+Es1>y+>Xa9R#KAZdEEFDopUHD zan6xt*@^+2bCu$FdmiVL2>|o^d*sOvQBTF|;?y*~B~CnEU-S2}U{cKJ9<~-EB$xLj z0GJdrKDD=AcVLVWJ_Po5cTrNV*oS~Irn1DlaiDwHqO&jm-x*&3vc1T3Dg@c&00000 LNkvXXu0mjfDI(JR literal 540 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}x0G|+77b7h%Ym)?Thy8t_-%scKf8F!@PVJNJ$%po=zH(;g)5mvi-#G8@ z?;jZv;o{A|Lx^`v~P?EF2BeIx*fp0$uGg`0)s{jSX zN?apKg7ec#$`gxH83GbB^GfvmTtgI0^$fo^f1eCgu_ZOaGtJXei-7~kVP%kFWMyCk zvb=y;8p;OwQ-hHiEY1XE8!|F6@BwL%%QD+pz~UJ|HV7;$V`O*%3=SBLVkHAmVgfq@ z3s9Ybk+A{e0*IL)`&bu1%$Wpag8&oIR3@;>AWI7%3#!Y|zyKs$)wx3@bz^WgkXh{M z;uxY4oZ1^HbU=Z_IZ$wo>*>G#w{L8${&T^`Sz)*eM&%kQ%| zYSZAN@+vBvVP=Bn2T^6KhBocSAWN_FNAln9(VrOIoD;>6eQoXima69M*FK(8`s4Ls m+Lx&hwlLawiT+wwdY^I4dhRW~4^~@&oZ{)~=d#Wzp$Pzd_MpE2 diff --git a/src/main/resources/assets/create/textures/block/packager_link.png b/src/main/resources/assets/create/textures/block/packager_link.png index c98a911671bdae7a02fc2ef62883f6a42be20d33..5c143c2147c94e3ede1bb93fa6b2eeaee9136a2a 100644 GIT binary patch delta 68 zcmbOte}!{`vIPTMlDE4H!+#K5uy^@n1_lPs0*}aI1_o|n5N2eUHAey{$X?><>&pIu Shli2PIB@ORz|GR!l`H_K^b&6X delta 2841 zcmV+!3+D9H36vj@BYz6CdQ@0+Qek%>aB^>EX>4U6ba`-PAZ2)IW&i+q+O3#rvfMTd zg#YstIRZBj0euIEA+%Co8G74B^sZX84@-Ny=t@>lq-_h=lI z*UXUp^3xBF8Cr-T`4e(jF7$B14vTSy$r^LqQ5j>LG2Lr5X>4&OpF+xZgcCKjv{Fqm z&A3xa*`@ftmVa>H+wS{jsJwXvZjFJ-0+0OkaKF0YcaC$WCq^N#`|yet>x$8E2o}a< zXKn+Ka9+5{4e;CX{&AmxO&};Y%#{sxKb|Rugb!||OMt|E!uaqj=rYveWl84U!eT-K z0$)OsP=ePOHH4gE1)$E#W6E)WKoE(GMaG;`0hkz&}a;JXV22=fk6PI$-e1G(SE%@ONg;TC@f zIcL!Q0pz0F=^Na>Ky8`a&5PKRg%(qv$Uc7GV}IAskK@j~7FYQ54GqL;> z_}%%s`}CDXkC7z}A6l~*4T9b7KisY&Gc466h+QgWu(p1B;Y}s?R_m$~vINP|_gMMk zzZ%{1^Uq%5r0C+*z@dI@`-z>#VI+0(`J=tDuPp>n)sQO zoXKgBH?^ET7Zep}HA{T}340W&ylOR4duLa-sGb4&^vsYZAvr>6EC))AG?nK`Iab73 zfosp0C!wo_kdSOdiGW47D4mSmf+{e$x917Ml-J%l6}Wh>3{M&d(m|<*H!>VIMt`2s zy?yy+)G?PL#ch)l%I zL@b%FudCRHlJaTwL=ew?4$iKhva`;Hd@Wu#)R@$fv1XgSr$U`t&r+#Fc9cNvfz z-t)98+46C`W=2(es{0Zb6L3?Bz<>R49BY>`1L*~7eWxkIz?H)e^p#gEFAh==##+3j ztmO|1C?YUmT65vl)?ly5Gxwg68sUEx>=$_|D8DrCx<0Z1};SsOw8y zwe^GZe^j=fQ1&A8b+QAi4S#YBOek*r0CEHt9HAa0B@F%(`tVk7UHcR0C-;ZYHxuz4 z>IYAb&;h%Ql_#Z|_tjJDgFWyQ zFcn74V*1{i6@5YtEnowFYwLieh&e=t{|;|O5lg}LsYpB-RvX2JIynrsTPKxbPJN+1 zk`Y!a>!@>EMR};Zy?;79a$J^55(safrjbuwoH(F)vY7PWD^+Iy;qKihxwrOqV4Ya- zlsYDt{DwD2Z4D9*-V1+FNJmt54-jlo$X+X#7_D>Lm9=o8RE8TLGAL6&&6IR32z?mj zGU7+OmUylyB6H{&dY@v%b>>vEVoX4wTdBp;mga9&95hZSn)=GD>716*bo?y zU=o-??|?ZYDHnGz1C@=8q`*o$vblF#g3+Yrg8-SFU<=(b4Cls&m67pe9PEPvYp7An zF^0=3C&sNtV}DmM$70c82G&43h8sd^aXuts%J`*P#()46R35E|y0~MK$3eiUbwX+z zKmG!`zE?LM5XT;Y1I5Iq!BKDphh=gn?#_9N8t)*T#mlT_P5GkYyGy!Hs4ytbf)mwB3&VCkx%Y&=6=UsEd^k z1B$t$Wg3N}5N#TfX~44jjm7p!2glFq0)^_a4=Jm zEk&MSlpnj>gUFau$1KooWTCaSN~wb;xZ*DI-n0;AQq8YjdutUaWf&>RY7XV)sXT+q zW7fkOTx*%FIiU=Zn2Pl=g>y_}or`)(11Q97jsWkJtn#Gh0~Kl!?MU>AsoHOia#t4kpL_3l*{U$?P!4(f|Me24YJ`L;!#QfB=9*D3eV9000Sa rNLh0L01FcU01FcV0GgZ_00007bPh>PMF-~#4goF{K!tGLv0Hfrt!!+~ diff --git a/src/main/resources/assets/create/textures/gui/filters_2.png b/src/main/resources/assets/create/textures/gui/filters_2.png index 569a05fe21de87a55edaf2f14af9e2d9c76ff401..08b1d9605c4949fb62aeb751212441fcf4755f5f 100644 GIT binary patch literal 1269 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G$6&6|H(?D8gCb z5n0T@z;_6Q8AUa`8i0cAC7!;n>@RpYcy&~LvTjK;Ft9Xvx;TbZ+LT@rZVnq9}*cf2hk8*e9VH&a*=Wvv^-wq;}VOC)r6 z{ql=1o=9wIva9_iA}uX_lJ8%7F~im<-Msw#$N&DtgsuKnL7`h6 zbeq$84>*QieYCX%M2B)ZfbrE$>J7(lH**$*4DuR`8EhU5Aisak zW3d0M*l{wtq50qe76l=PJkA3T+?h_8FiQOKV31UA==kt~U&vt{=YqKP?yIkMmF<43 zuta0;Z<8);q2S3gO#Xtk!A1`NgV4A?-!1N)O;e%bnBI*5Gx0-Ig z`KwZ2UZvr^ZMEu+qeopI_U_-gbLPt~pM7na*G{)DQj7Qh9(DKTP0xQ*6ZY4v-v9pX z+oM;nhCXE3uxXPJH#fKO>d$feR*9{3wP%?=eR^_zy}i<-{vaQws@tnq{fcD>4YlQ5 zv1%2|0x-_%te0GI|9$lfwz>~Dr}p;tF3D#OQ%ZUhaOjMk&*Y%q4vGG+442AlYh_oj zUj6=G{kpYlRd=6XHCdW@rIm$6$JMJ>%dPwS`}!u`Pv`cNJ~5q*L5g9*;#IK@H+6M& zefRd{ZI|wKb7pQ3DcyZ{<-dKGU+%fVaP9i_#~(fzXiYt3A+$$y1>*tfx9{HB-7Ayn zKkjM9Sj=G1x_rCLep`RzYYYy;7Z?;m&!!pAI-B-#b^{xOKF`0HNkDo%&%f<=EIrn8 zW-u5mJ~%%~xIlV>4*Sn14D+u(_<#S~w=$vM&P)ow{eMUD|7&h;K3+e6-aNOO2kFcv z44XccH29zU^4#o)DZ{3GCQJT0UIt%<#|PyTg#>&RZXeWVbU4-=&)m?%zTcZ+Q|GU_ ze(8Cq{YyV&Go&oMm@(y3uALqu124k`hKB8D80XBHbL8jGoqHWW1^pB{=l<}xV`5n{ gCor22C2-#G*+j{!N`)78&qol`;+0G^oU!T38$lZxy-8q?;Kn_c~qpu?a z!^VE@KZ&eBzH5L_h%1oZcKTu6#3i;i9%;pGhYlTDwQAL?SFgIeyB9BBoS&a>Zf;&u zQu6=*|6|9Fg@%TvrKLT3^ytQon>TLUxPJZmk|j%kCOr6T>kFjBOM?7@fhw^8hG!1X z;($sx3p^r=85sBufiR<}hF1dv1GANZ8<$xzYx+ z=54y&aQ?aWBWv>qJn?hacl>?5zlxcyK4v##v;7?g^M-@J9(18WytsC_a@^Y^HhONlRXF*~SW8?F&&2H($Trw8Ej7 zG3|6}VBSCb<|Nk)m7psu3v;QC1(Dbvtj@M$=e}M%l{|?5p@PB^K zEOOTV2ZOu7f}DRqo6g;jX}I*0T_)jB{6YR4`!I|D4a{?nL!xcT>wEX^t)IgiD6_y4 z7^$uE@5!+p*eJnpJc&W3o3TJ=l!F=u8n3^`hbXUIms-EM3z)SSJYD@<);T3K0RW+) Bx7Yvx diff --git a/src/main/resources/assets/create/textures/gui/frogport_and_mailbox.png b/src/main/resources/assets/create/textures/gui/frogport_and_mailbox.png index 794f0723b13b1c788931bcbf8a4bdd025b625782..a4e8a5460c5366cd4ead5a235f71017da5e37ef3 100644 GIT binary patch literal 1681 zcmcgsdouR?8BJ@k~-4O%f6kvp;qA?CFpG-Fwgdem>`Ozvq6w=X~$I$u3T|7_p9Co;wm-dUEUo;QwOe?o|G)OwZ z5%PrcmXawwfq$I3#lsJW8MW0*E4954)!jq6c!!3DCJmB2wqm!8OkY0yK%eH1Xm*Xo zpP3y2k9eT8pgCW>$CBM$J1jHegkWc953i(Dcvg)(3uov|EXJ9}y$hpt7mO~e7-`*) znC&~9C6m8iEk?dsTb#=4FcQSaos3jVCLdKC6VK0RDQ(SIvBzIRsTBU&5j?6lq&8AS zmaC}p*3NBD$Qcs9`fH(auV8I0)+A=KKvxEJH)1(ja+33ShezhKo#x*-h0re^8P1zA z9!G7g9J*)TF^J%!-z=@1&K4GXgR27WlT1T!@V1WgS}<_A*_N7!W7O8x@}ii8rls<> zo?W|>2V}Dc6`-bl8Uj!s_SGX&r6rhQSl}QQt((vz5&ouP>~L@)I0Z3UHt_eAnzTWH=t!O}^#}H=3eLkQnkz zzg6PffTnBFg<*PZe`KbjmeTJfN*zczBC91BkY^Z5yi#Z5?UqDMZT8 z5p+6kWZHdUpwGzIcv~=_`R-+;gy4$R9fTmvt?&d~UnNDJ(HEo>3Li4Y+^wxuRI|9q zp0ghr8q)W)_Lsq6&Nd|E;}a}$j(z`aXRv^%CZ%y%?o8tk1FL#R&CU0DczEb^M5Z?8 zMDulFs)OM7RMLEOTp;2tB|hGwva-@E^@VDjsVC1TLRMoT3b#q}!5b@#C*^ z_91nnuO+FbOfM(?xNM1Yeh*#TM4xl5KPNSvN?=W;5_(`J#8y*K18A^=N*i@Z29hjh zfpo}upFHHir;{`|JyFWi>TfX=!QA%Wo>80Fly8tbroa7K(*P4VW_2A0!!P52~FI zys9dGEGjkDzwh~TYGywpw>doEq~-Maa^@Y8y#U*XxawCifTmC=^2-_WoKM!3#mvEIL5 zZ*OnsVaNdi`^We(dXGbDvDP@nQWznh78n>)ye|WrTrOpT0()k2B0of$I~Kqg2e>do z<@EG)>)4o2FbBHTD20UK3<#4H#1S;vfMB=^p!$3;Fog9p+!`LN?vC|nZ~l%(EAAB? zhZD4vT^5Zw-MM%@J-s9sK_~(T4wcmiR`cen>=#2p5d7;VkHKd`(2F!fH-)sTU&>&l zlO{X7KF9+q_D^Vo+uFV$$LO@#gbGj8#ovLX(#*25GS~6$4o$#?0Ts~u(3D}Drp6o? wa1Uk9DsJK@6_`6w%$9-wp8vn!!2gQ2%j#yR1hfNMZvVC~$;Qc=XGy;F4-qk?HUIzs literal 1286 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911MRQ8&P5D>38$lZxy-8q?;Kn_c~qpu?a z!^VE@KZ&eBzIT96h%1o(|NsB7W5+^6Lv3w5ww-=hH*rZ?aoe#d>Cc6VhYlTDwQAL? zSFgIeyB9BBoS&a>Zf>5ImiFk;qmq)68#iv=xN+n9_3KNPECHG$92}Dhq$Ep%{DOgI zVg(G0CS2QriZ}~AB8wRq`1XS^qXlcQ3ebJ>o-U3d6>)Fp^7`L45OKX7V0SFxf}{8U z|N5~q_m{+Zs!OX%eX~9OYTcJvId$pl7kaVg_&v+q`vL=Qch<*BI9rp!6!K+Gp8)nZ-V`)iCV|`J-f4*=y z<73D9tQC7$*ci84=QD2K9m!ajlP4u$P*&vX@S@)DK$`lO?;+i{Zk*jC$i>w5FP&wM z*~3#e`1UeRLi%w&i)mwNDrbNjB- z3LF>O)2L4hzB^@m@U;R1BZq^7F;iRrkGZU0BDgz10s;Av zER1aP`Qp_%GWfnubG4}W{A07CT=%bjrg`(~w{D)dPf5XY|F5sAj3<9y)mLla?3kN+ zh^6KD8Y6d?ub*zCeg4n$Q{EuHIpg~C;yL@HQ{Qr4*l)ZsNjrYE0prWM z<40Kx7&mVAnbGhefoam`YGQQ5OS$XP| z@P{?>r;48K4!t(7!8>fv_Qf`nLmx^_cvl`1!#tzmMx>gLLxlm*S(lTTuHF6-B&w!x z_x+9;3~CBx(>R3%;}%OfB)@0;!w@B>-%@-#zr>Ql6D{^#wsG2;pR}!IfrG6M24%w z52*sN3$lGX*`x#wzRc%%(RVy~UZWYyk$=IAH`%nr1*F6O*K^MJTkCBcqMz{Rv6DmI z|Ev31emz_MPnhxM-|O|f9>46lPrTpX*!^JVe@_R;|GXR?6B;J{ixvsEQs2yU>eu?H z1GC>X&6k{~{c3*}<7asM%FF+qx>>P{)ug@Z^r9CJfd0B9#-fosEU77%U-I9PRtTMS Ts<9AQelU2t`njxgN@xNAlw={O diff --git a/src/main/resources/assets/create/textures/item/package/rare_creeper.png b/src/main/resources/assets/create/textures/item/package/rare_creeper.png index c249883e4cf0278c94fdb704a0bfd1fae21f0679..ff4baef479e29722de7fe6abbdd096043514c6b6 100644 GIT binary patch delta 878 zcmV-!1Cjjt1^Nb%8Gi-<0047(dh`GQ00v@9M??Vf0I~p?guc1l00009a7bBm000ib z000ib0l1NC?EnA(2XskIMF;2$84&;h2I1qH0009ANklljA7=5F&@>6meZ0ouz%xHEgYi*rw!^h!e`}@B?Ul-Bg5h`sy)|(PPAkv z+}`;D%YQ14D#@*ZF@^)DjdsVu*XFm;l-M0yzH}j#iGTqaL&6r^x^Wdl--E7dAX*Nm ziX{|I7ywEr6wgCfH4J?Z?QS=<1(QHr&kr>aZ^6_QL{zHoPOYc;Ks*ex6!~5v1C!Ai ze1u5|es;HE5+YUcq`l@11A!eIWC_f6MoBa^bbr6VF;fAEm=TF6h-a_gqf(v}=N16q zgJ5s7Wy=AiRVs^0*$M?b*V|AwR#}45u|cVtxDem-!~mQgMY%MlIw`Tt2~E>XN2%+e zl*^qk?tCI=OkzOQH29u3#X!7rp%Z346P8#q1G+A(d<>M!&xE2gVAeBXpaD_!0W&j; zaA%h3kZK^P{`e}@KvJSKADDXzWQk_+g}J9d#6*_LMH>~a^8f$< literal 762 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCim50(?STrylE>dv0p;ma5);Eq(i2Cm!moTw0*vqrCUt_63J$ZN9m-ZAbm` zQw!H$UFlxrxbE_bm1h@s?rLaQUmn#Rm^mwP+MbE-h4zV)Ba^4b0FB(8(`5ssq)LMP zg8$(jWCn{f0ojI(ObmQL zItqw0+gZTk89+7&>@Q!~j15jcDI|B<)oq>_D0pkLQnIQXE7eLIJ1Z0B% z6VOy9u*x7y3m^-s%h138BzwX_WJ_R$CNS6;bv<1iLoEDTCv_Gz8}PWWnzqdnnB(;5 z!+-l*Q=b^CzN}JfuUr#uz3j0(;{v_cEXTwA<0IO_<;%4>6Ec4A+?d#Sk&o%a#LM5G zeDNri`1yCD$cqfM@|n|S`b=-oX1-qG(tiK-QAP=&4HbS5r%OeMze#1+@hj{;pul${ z^uQw@x3pc6tZ9rNyjXtCpVxYxL!u>y@eJ1lL$>6~nuqa44|oJ$Y_I)ZUVs1lTB*s6 zHfm0l&)e@X%O8}S#B3H;B(b&Uq-!XjO*4NwHzopr0Gqr6 A{{R30 diff --git a/src/main/resources/assets/create/textures/item/package/rare_kryppers.png b/src/main/resources/assets/create/textures/item/package/rare_kryppers.png index 48dc589b1b8689be1b4e057aeae7e7460d3a97fa..1e50635e8820e4c40be6aededb065d0a56b11ba2 100644 GIT binary patch delta 1091 zcmV-J1ibtD1n6u>dEn{u6Z=tsE)VMUI<{@&x-Pj~E?Pa$!!*sP^Biz_nXL{x^q1VCPzM*Vk zgn)d=yUmAqXLFXNb0?@)ic~8_7EaAa`Gr&SR4c`So#gX59LJ?rtKm2R?P4*TVaX>geD?e|t7Fja5sse zqQX*Duz30;g+c*4~HX~UiH+SRK}9xV5DJT;5& zb!lvEvfZe&_WN)BR&6(!J9=~^5)y$lgp@6qKYxClUKpZl8itYOVA;kh<^h}h-2Ld9 zMlTF$HJc+_kR+kxK(Yl92^T*2dVr<9*3AJjCRscxG_x4HFBO4mrO0a+F7ff(Pw>JU zmoTy#eh{XvsyAdlpNm{hGmE(1HUL>&qgE*_lsIpmH6$hjjB%M#?jKdJf zXd1V|Z~%ei&XrC$?o4R!*?|%P)ikvyr+-91&V;HNaNLu3WiE zZL1T@jpD$#N{9-0^ZCc3kxWYN&y6~h6_W$`Ld+e75PbjBwE=sLTXA|Qtr);GO+4D| z7M4{4;Mjv|RjA^v&zA4%Q!O*f-R{H*|IxQ$+Dv#SPWZo!zX9u!Q=$0ZSOWk6002ov JPDHLkV1oTF5>NmD literal 762 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCim50(?ST8^Z(IV?)b)Tx){7YlD62L;Z4H?M=i4`-*aF6QX;v(<=Qvno{CB zGgEvul{zw#TT&CM0z8X7onwu((``(vqCb$b#xJG%x_kR(0-BN!=Kn4U7_9PZ!4!3;)(hokh(CJT9!JZLExEGhVSLd89>EveYrmJ*-~YZ=YI38Enp5TT z_B+h-2PG#ln}rogZ0$Me8p>zW%%gQ6@@gjMhZ~#ZES-53iZ6vR22Ep9Y+0_Mk??dQ zL(mm@c5Pj+*<3BlEe?1zUbn8Cr0Aw2d4xescS2Q#vFqatehc}S_7->aujVQ2k?W210D4>pSpMH*>$@JMj z{_IOOHn&Hf0)IVjIDhV000Q4f*R;O1*_mnlAV~aBJcSeI=GoqQ$aM920@X&gwi8o0 z5P^xxEDLkhfejYss_2vFQ%{o5=Wra!&dv^wBMDTSoRI~<^MlB4nijo|MiE$9t}<0A z^TPCtym{#+x4-y~%(%y^S88njvB_-ZeeT?9FkgF()qlJ7R7bK|0|4dvhmln6zI9F4 zlQm%NS{!t`{Pe^3JY0VOK%p=}$8n-H04e3EavVAmI+m&d(=zGa54dpgB5ND#T)ujl zUzUGHS`xE;xYku&{NMmv6Zn3z18=?KGCPxFtd1j9YJ?I&^v2Q>eh{E* z8rf`ysZyC@ArF+vFI+;`H2ff7&$3QTL0p8P2I46g08y_>{k=y6_PB~q8k$k)d+*o? z^p4i{8irx;c%zPC7^y1m#cMvFizufV1*B>LkkK_tr89lR9B{ziy2i@#J*FyEnhzSx z*MDlP-mO!4Zkl$x!`$K=_g3q?{8BBEgkRtOmg?D3k7fCgunEp??U;iONTslLElLxm zKH`mMG(68mD#h5?SSkstXG@WQpXfGR`)w_vVK4C<+rje#l=5hGc5y8~m4vFtx$%UO z1L($X)5w9vYa6_M!~(;3hW-6rip9x@fPYHuV;G0?qsPf4G;%|9RGADiNdqAZ0BqaF z^8!3iM003A_TrI}aZRHe1OpN1rt}egBpkLUEIY|Mh$0Z{rsB552!uUhQV%$6PZ(+- z>GWY_PHf4By=IS%K-%e#=2Q(Fw^7<6n999M?Mpgz!Aj=DgrJ-z4SZFXZgTkOkFcXkY-6t?JyNlDaWC8yF?Jo-U3d7XGc1I*XbOcwAUb+hz&OaeDOOzx}PL zPmEPxR;jgDt_inZ_E?^Af!=GD<6-{s5pCh}<=UJH89#V#Ol-W!$Mj+1vZ+SvvD76kiHs44THI*s@$hBjM>r zhM+6*?Ap3sv$N?u4oeW7o$Q{1);t?Je%;U(Hk4Bc Date: Thu, 12 Dec 2024 18:05:49 +0100 Subject: [PATCH 183/515] Weathered Iron Textures --- .../block/palettes/weathered_iron_window.png | Bin 560 -> 757 bytes .../weathered_iron_window_1_connected.png | Bin 3065 -> 2997 bytes .../palettes/weathered_iron_window_1_end.png | Bin 316 -> 355 bytes .../weathered_iron_window_2_connected.png | Bin 3027 -> 3033 bytes .../palettes/weathered_iron_window_2_end.png | Bin 313 -> 355 bytes .../weathered_iron_window_3_connected.png | Bin 2950 -> 3066 bytes .../palettes/weathered_iron_window_3_end.png | Bin 313 -> 351 bytes .../weathered_iron_window_4_connected.png | Bin 2953 -> 3096 bytes .../palettes/weathered_iron_window_4_end.png | Bin 316 -> 355 bytes .../textures/block/weathered_iron_block.png | Bin 789 -> 643 bytes .../block/weathered_iron_block_top.png | Bin 782 -> 617 bytes 11 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/create/textures/block/palettes/weathered_iron_window.png b/src/main/resources/assets/create/textures/block/palettes/weathered_iron_window.png index 0b5e2c77d11338f64c50297a42d4e621247e607b..b4d8d225e439f9c791fa5e3c1d2258796da6f21d 100644 GIT binary patch literal 757 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBufG}g$wN6f;pje4(L`iUdT1k0gQ7S_~VrE{6o}X)of~lV2 z_vY`DfhxA7MtG)qdTKFn06DA-QjDw&j6jwb5KBYZAh&2RGK0mLfNVoXCI&tr9R_Lng-ykJJqC{{86B_^;lumIH=7#SNdE`XQ`vX6BE#GFY$HV7~QO=SYB z46?KUvY@&Q4GciCCoDv^1XgGQz0J77)5S5w!hde?X}?1O0&~R#8$Sv3x-H_=xiMox z$AldU8;sXo?EfJAgYDk|R_*O-y9^WGv+pp^t5MP5V$o!6yi|4mg4xrDZIkcJxi@pC zar(QtUac|5?tD18h3nQP$4f^eFW%{OU9tSDCnuYZ_}|^-#lcrS-hDIS(|F=PL;9_J zTCT-2g*OLp-2QeZaMt7%uO`U64gYS+x5ZGRSM0{O`1@C8{H~j&)}SoNu~D!q&Tjw8 zh5RoUU!9rg!8Ylmgz<(n!|;l=<}ZKTiC2><|K{0ecjv3thg5Gb%adD=eW|#;_DxQE z;<5t{8XwkG?_9q=O}t(Irm^cQg(U$7k780pypM$3zoIw);OmnX9jBNxjd+#4B7726 zGinX3k`zyFwwrY!c(v#Ito{_4Bd4Z|l$Wv_CKtMOsV?nOVSB0a+n4`nYY6v>2L%_N zKRs)-z&0{QarykouMX5zb7vepcrR>g%hyBiRuE}(9@X~p~w)t;)#slFQ z9~auj>@JygepUt}+xIoMH!RQpXWziIr)7$_{H)oDhLg1y=*^obydy1v?ey9s)7j@c bTK#407rJPCOMi1WDE>TM{an^LB{Ts5d+!S# delta 535 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 delta 3059 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 diff --git a/src/main/resources/assets/create/textures/block/palettes/weathered_iron_window_1_end.png b/src/main/resources/assets/create/textures/block/palettes/weathered_iron_window_1_end.png index b909b6c2403f74dd0da922a45cb7a9b52cd6a69d..51c8a8fcee946bf3e74b8fd5e0f18ee6bce9f8b7 100644 GIT binary patch delta 280 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 VnK7Zs*W~~J002ovPDHLkV1mHs0}}uM delta 3021 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 P00000NkvXXu0mjfli~p5 diff --git a/src/main/resources/assets/create/textures/block/palettes/weathered_iron_window_2_end.png b/src/main/resources/assets/create/textures/block/palettes/weathered_iron_window_2_end.png index dcdd747682d6042e9fafc8f3233822d1fd5f722d..274398cf6d1e0a1485563d768a6e3be56071d343 100644 GIT binary patch delta 280 zcmV+z0q6d?0^t=# zT~Rti=kx^(vO)q3AHMx$5a43Rsp-SFpA4UWd}k=nOkgN$p31=J?`Za)os*q`mxGhR z%sse<7@JS+T-);b$9IOeZ@w}xF)%PN$O;LdYgRzQ0!U&E41Wv^3})`Zb7X}e!b~t{ zL4g1cO9ilb1#SR7KjQ*0Jxs*dh7T}NqL~yI2;h=qVxSO^Y5;}{aHZi7#D)ucIv^UL zq=U~tzB8QKxwZw(RskHgE1cT7Hs$k=?+7oHXC^RoPG7)q>+qHok~5Q;p7wuU4tBC) e;Pa243;>1ZQ4x;&#W5ZL00000=WW^RDS>@5IP5NPyhe`#z{m$R5;7UlRXZCKoo>O2#FRO!VN4bOz5}* zjZj%?sj>ACUV_j$*6nfGRA=UJP;?*!jL0*(N#hdpIg zBRm(`D#UvAp42L66-gX%EABV|WmU5~o-f0l5NJMiFY_z~ux0^-=VC&ha_mu-0aOc1{00J8#p;9AuW6F?G2lzEmK4AUuzBOb*a nYa95ToPCWpNU!B=Urf%QxMf57VsFU<00000NkvXXu0mjf;ILr# diff --git a/src/main/resources/assets/create/textures/block/palettes/weathered_iron_window_3_connected.png b/src/main/resources/assets/create/textures/block/palettes/weathered_iron_window_3_connected.png index 63d08cd6bdfc2f8a5222e0de16d93dd73e6df69d..1b5dd37265848e50739a567589605342b47bac3b 100644 GIT binary patch delta 3060 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 diff --git a/src/main/resources/assets/create/textures/block/palettes/weathered_iron_window_4_connected.png b/src/main/resources/assets/create/textures/block/palettes/weathered_iron_window_4_connected.png index 53953a05a814e81d2470f2c58cb4ad0f11c4d8b6..94fc1ddd3b5552b967e332ac4385834619bb9db3 100644 GIT binary patch delta 3091 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 delta 2946 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 diff --git a/src/main/resources/assets/create/textures/block/palettes/weathered_iron_window_4_end.png b/src/main/resources/assets/create/textures/block/palettes/weathered_iron_window_4_end.png index e22fced31b02644e226e857f19333437c82d4c59..cf8121b5154e98b293668c443768534950c31f4b 100644 GIT binary patch delta 280 zcmV+z0q6d_0^t=# zT~Rti=kx^(vO)q3AHMx$5a43Rsp-SFpA4UWd}k=nOkgN$p31=J?`Za)os*q`mxGhx zrEYKyF*b`|Ufc5d$9IOeZ@w}xF)%PN$O;LdYgRzQ0!U&E41Wv^3@>$q=g0~{gqdK@ zf&u{?mI`3=3fusEe#Ql0dYFi@4If~lL^CNa5WpqJ#6Te+)c_0^;7Y?Ehz%F?bU-vf zNe7>Qd}k29ytW0+RskHgD~MlSoAUX`cZ3(pGZPp(r!Qbozq=)c@3$S9jyZ`_I$w@>(R5;6Hl-E=L&%;0-_`<-zz{118z)%n! z%&>XOE(RU}K87zpelqZIu;bSB<0k{dkDm;_K5h&xOV=_mYU`>0SLWws_~(?G4pn2y zz`$^tknK$SX3xC%@iPMx0|NsCj{qM7DVmY>Fu|Qgf@YW=9%+~XP(Pn0B>-XJ#Kb@W z_(G`x6uW?Dz+FJSFo325Qh+H+I$$8p07!!S@e`7n7#J8Be0|&)HgB0dlZ4Ea;_Kta qa1oZ7zMw@7EP!DAFKFUCNb&%80!CYST8+&B0000q$gGR5;6Rlg)0^Koo_){B>+gZhstO6+skLw5(dB?8=&L zHxUci^ik-mu%i#qO`imHfe=NiYKbVd$C%7`^3$+zJc$F|c;@)dx#t|;X}mc*UAevh z;N?@B-6w7?{`)O%E>M$#w(AQnKYrlq`i9~0p)E+#jIh_Ot&=nZ;69ODj^6X>^A{SU zcV{c%3hvAlfPcs|EXiJ{1;A{+1Yjao=-dEs5{2AO650U6<3r5XZ@lh5M=HZn|DYzf zQt;zpOz=YR{oxmbFxU`OU2cEI`1@X2=m|?8l|ia8d7+8Nj~4R^N`fTK*z2^2dVxK- z?f`$YbuV7Gf-X!bg-dInM%X7eS&1>bRPhbjliEOBL_ zmO=?VgKoq*P;QE4#(K%Pw zH>C~7B`>rMGcPp$8mGI-<6?APUZ#`b>8iPzTD+osD`&G;P93kXCj);0-L?eu?7uhJ P00000NkvXXu0mjfti&Lb literal 789 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%Lh|0X`wFrY08lc23&bdNZa^_xJZNEi6n=OpJ_-jE#wRadC-_iAhXI2oHeQbEZF|)2B_FHpN6oSCy7#CMU07zdkT9u(YJ)&6_vv z?d@;hym|TJMMrykS6A1$bLaN%-Meb#%8M5-CL|RtvY3H^?+^$xifVW@00qTLTq8>w%JcWI z1s`%q$WYwEuyDF`mHHQ=ZKz}_*o!2qGZ8W)vL!oom%xu>bmTLos2noTemgNjZI1J z|6Ns3aU^+;iD~nu+Nxupx#QwKT1juXb@uJt`#bA1W~UsM`+0?N-p@-L8$WvOTe)wt zJafRb(mJLekIH8@9{F+k>;AXfrIYVn6mDd=7q?fS>x22i7tFVLg%hWWuG0Z|(9_k= JWt~$(69DHQF8%-j diff --git a/src/main/resources/assets/create/textures/block/weathered_iron_block_top.png b/src/main/resources/assets/create/textures/block/weathered_iron_block_top.png index 0a6a24d60acc9514cdb18fb68fa067fef7093bec..ce90fed4e251e547e072c0365a9045975a6d2c1a 100644 GIT binary patch delta 603 zcmV-h0;K(p2I&Nl8Gi-<001BJ|6u?C00v@9M??Vs0RI60puMM)00009a7bBm001r{ z001r{0eGc9b^rhX2XskIMF;2%3=SDK=fQA&0000PbVXQnLvL+uWo~o;Lvm$dbY)~9 zcWHEJAV*0}P*;Ht7XSbO(Md!>R5;6ZlRt0MU=YTCHo<2*HGgrOs6#{q2#LW#WNUZE zE@dwpAA^~X!3H0Ig|U0tkWdCBgis|0n*s)Hvc0 z*6g&>XQ!|9!Kk6x%|M&mw5jnO=5ybc$TJkw{J1I?lIXP5k$gd zf5cvYjRBq>rg)yiG>HLlOMl%Kz=uzt84qJ55aLjHAbsLckYGL1Ucbl3FW>AaVGV9r zLmUcs3Tz-iG8_>30m*OxVE;#cKqkgwxAZpxX{DCbwSN}31*$^rOSoO41Y#?;wp?9q zbp$Z=HdSqcpAk0(wz#OPElybf(}7lMiOFz4QCI&ZY6Z6)bhk_bv4rL7(u&wk6o*14 zW~0F_5w%jgacy8;Dq1P$%iM}+HONb)DwKoAkH}WJb$-<=8`#c2e|T?e4|-vZb)KFr z@VxaZH&j0^s2b(FUeGj#=GSjBF`S+)Fls33iqeN3z{&B^)-k1jmn7YFOao=qJ*IR% pGp=kuO)F4~yC>a#mp)u8`~gIf=}RF(cZ&c3002ovPDHLkV1nQq1?2z$ literal 782 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%Lh|0X`wF+S+=iCKfZMPxtrtPftvYjEIPgjEs$mx3_b0ad8O=4v&e62@i|R z%*o<1o+BIY9)OT;+Zr!@Ix~i(YsA$o`#UDO=*tKKFiQ~tQ9X2!0mMv@eXI*0 z=1c;zL4XNpDic^`kfjBX1=VF}U;vVpm5Nw-j*~SP$UNlf;uxY49D6=G+%Zvr?ZMxf zGtXRW)PGs(q2k0hw`57c6t9>6|4SX-cd6Pi`|RdtN%s^Aq&M2S>BzWhJY(7}dOhIq zk!`+rZ<^llUbbiY-!0<4vMD@#6GcxkR(=ezFnaLFFnDEvU1I#fmt3n%r){oUe6l3& ziRhLK)BL_OO)o0l%jSFkOF?z}Z+08E4_D57?_@u(f7qZ&@YwoKW(U8-D*s?eJ2L;k z^40B=QSRNnB^83G$hztDnm{r-UW| D>*Ft( From 9b042e51e53a04e7b87c9f28cc03b063d7baf2e7 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Thu, 12 Dec 2024 22:28:13 +0100 Subject: [PATCH 184/515] Bug hunt II - Update catnip (Fixes doubled models in ponder) - Add burn time for cardboard blocks - Remove train colour scroll input when no map mods are present - Fixed desyncs when picking up packages at the player reach limit - Fixed stock keeper search results not comparing names in lowercase - Fixed packages leaving encased chutes 'dying' through suffocation - Fixed categories not collapsing on click when invalid filters are present --- gradle.properties | 2 +- .../java/com/simibubi/create/AllBlocks.java | 13 +++++++++--- .../decoration/CardboardBlockItem.java | 21 +++++++++++++++++++ .../content/logistics/box/PackageEntity.java | 10 +++++---- .../stockTicker/StockKeeperRequestScreen.java | 10 ++++++--- .../content/trains/station/StationScreen.java | 16 +++++++++----- 6 files changed, 56 insertions(+), 16 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/decoration/CardboardBlockItem.java diff --git a/gradle.properties b/gradle.properties index 0d9a67dd8d..c64b29174b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -28,7 +28,7 @@ jei_minecraft_version = 1.20.1 jei_version = 15.10.0.39 curios_minecraft_version = 1.20.1 curios_version = 5.3.1 -catnip_version = 0.8.35 +catnip_version = 0.8.36 ponder_version = 0.8.12 mixin_extras_version = 0.4.1 diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 893c99b978..e82b7d1875 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -55,6 +55,7 @@ import com.simibubi.create.content.contraptions.piston.MechanicalPistonHeadBlock import com.simibubi.create.content.contraptions.piston.PistonExtensionPoleBlock; import com.simibubi.create.content.contraptions.pulley.PulleyBlock; import com.simibubi.create.content.decoration.CardboardBlock; +import com.simibubi.create.content.decoration.CardboardBlockItem; import com.simibubi.create.content.decoration.MetalLadderBlock; import com.simibubi.create.content.decoration.MetalScaffoldingBlock; import com.simibubi.create.content.decoration.TrainTrapdoorBlock; @@ -811,7 +812,10 @@ public class AllBlocks { public static final BlockEntry CHUTE = REGISTRATE.block("chute", ChuteBlock::new) .initialProperties(SharedProperties::softMetal) .properties(p -> p.mapColor(MapColor.COLOR_GRAY) - .sound(SoundType.NETHERITE_BLOCK)) + .sound(SoundType.NETHERITE_BLOCK) + .noOcclusion() + .isSuffocating((level, pos, state) -> false) + .isRedstoneConductor((level, pos, state) -> false)) .transform(pickaxeOnly()) .addLayer(() -> RenderType::cutoutMipped) .blockstate(new ChuteGenerator()::generate) @@ -2563,7 +2567,9 @@ public class AllBlocks { .transform(axeOnly()) .blockstate(BlockStateGen.horizontalAxisBlockProvider(false)) .tag(Tags.Blocks.STORAGE_BLOCKS) - .transform(tagBlockAndItem("storage_blocks/cardboard")) + .tag(AllTags.forgeBlockTag("storage_blocks/cardboard")) + .item(CardboardBlockItem::new) + .tag(AllTags.forgeItemTag("storage_blocks/cardboard")) .tag(Tags.Items.STORAGE_BLOCKS) .build() .lang("Block of Cardboard") @@ -2583,7 +2589,8 @@ public class AllBlocks { .withPool(r.applyExplosionCondition(b, LootPool.lootPool() .setRolls(ConstantValue.exactly(1.0F)) .add(LootItem.lootTableItem(AllBlocks.CARDBOARD_BLOCK.asItem())))))) - .simpleItem() + .item(CardboardBlockItem::new) + .build() .lang("Bound block of Cardboard") .register(); diff --git a/src/main/java/com/simibubi/create/content/decoration/CardboardBlockItem.java b/src/main/java/com/simibubi/create/content/decoration/CardboardBlockItem.java new file mode 100644 index 0000000000..bcad7baa70 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/decoration/CardboardBlockItem.java @@ -0,0 +1,21 @@ +package com.simibubi.create.content.decoration; + +import org.jetbrains.annotations.Nullable; + +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.block.Block; + +public class CardboardBlockItem extends BlockItem { + + public CardboardBlockItem(Block pBlock, Properties pProperties) { + super(pBlock, pProperties); + } + + @Override + public int getBurnTime(ItemStack itemStack, @Nullable RecipeType recipeType) { + return 4000; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java index d312886c75..3eea0fc1ce 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java @@ -253,6 +253,8 @@ public class PackageEntity extends LivingEntity implements IEntityAdditionalSpaw if (!pPlayer.getItemInHand(pHand) .isEmpty()) return super.interact(pPlayer, pHand); + if (pPlayer.level().isClientSide) + return InteractionResult.SUCCESS; pPlayer.setItemInHand(pHand, box); level().playSound(null, blockPosition(), SoundEvents.ITEM_PICKUP, SoundSource.PLAYERS, .2f, .75f + level().random.nextFloat()); @@ -359,15 +361,15 @@ public class PackageEntity extends LivingEntity implements IEntityAdditionalSpaw ItemStackHandler contents = PackageItem.getContents(box); for (int i = 0; i < contents.getSlots(); i++) { ItemStack itemstack = contents.getStackInSlot(i); - + if (itemstack.getItem() instanceof SpawnEggItem sei && level() instanceof ServerLevel sl) { EntityType entitytype = sei.getType(itemstack.getTag()); - Entity entity = entitytype.spawn(sl, itemstack, null, blockPosition(), - MobSpawnType.SPAWN_EGG, false, false); + Entity entity = + entitytype.spawn(sl, itemstack, null, blockPosition(), MobSpawnType.SPAWN_EGG, false, false); if (entity != null) itemstack.shrink(1); } - + if (itemstack.isEmpty()) continue; ItemEntity entityIn = new ItemEntity(level(), getX(), getY(), getZ(), itemstack); diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperRequestScreen.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperRequestScreen.java index a1182a9698..7ffb0376b0 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperRequestScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperRequestScreen.java @@ -5,6 +5,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; +import java.util.Locale; import java.util.Objects; import java.util.Set; import java.util.function.Function; @@ -296,7 +297,7 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen(); currentItemSource.forEach($ -> displayedItems.add(new ArrayList<>())); @@ -333,6 +334,7 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen hoveredSlot = getHoveredSlot(mouseX, mouseY); @@ -778,7 +780,7 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen= 1000000 ? (count / 1000000) + "m" @@ -990,6 +992,8 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen -colorTypeScroll.standardStep() + colorTypeScroll.withStepFunction(ctx -> colorTypeScroll.standardStep() .apply(ctx)); colorTypeScroll.calling(s -> { Train train = displayedTrain.get(); @@ -188,9 +188,11 @@ public class StationScreen extends AbstractStationScreen { disassembleTrainButton.visible = true; dropScheduleButton.active = blockEntity.trainHasSchedule; dropScheduleButton.visible = true; - colorTypeScroll.setState(imminentTrain.mapColorIndex); - colorTypeScroll.visible = true; - colorTypeScroll.active = true; + if (mapModsPresent()) { + colorTypeScroll.setState(imminentTrain.mapColorIndex); + colorTypeScroll.visible = true; + colorTypeScroll.active = true; + } trainNameBox.active = true; trainNameBox.setValue(imminentTrain.name.getString()); trainNameBox.setX(nameBoxX(trainNameBox.getValue(), trainNameBox)); @@ -333,7 +335,7 @@ public class StationScreen extends AbstractStationScreen { graphics.drawString(font, "...", guiLeft + 26, guiTop + 47, 0xa6a6a6); } - if (!Mods.FTBCHUNKS.isLoaded()) + if (!mapModsPresent()) return; AllGuiTextures sprite = AllGuiTextures.TRAINMAP_SPRITES; @@ -355,6 +357,10 @@ public class StationScreen extends AbstractStationScreen { } } + public boolean mapModsPresent() { + return Mods.FTBCHUNKS.isLoaded() || Mods.JOURNEYMAP.isLoaded(); + } + @Override public boolean mouseClicked(double pMouseX, double pMouseY, int pButton) { if (!nameBox.isFocused() && pMouseY > guiTop && pMouseY < guiTop + 14 && pMouseX > guiLeft From db42377a0f20bda90666f5bc3f213ae13a9b6aba Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 13 Dec 2024 12:01:34 +0100 Subject: [PATCH 185/515] A new era of duping technology - Basins no longer limit to 16 items per slot - Packagers now bypass basin's unique-item-per-slot limitations - Fixed packagers not inserting correct item amounts into toolboxes - Fixed packagers on creative crates or drawers packaging stacks into individual boxes - Fixed packages opened in creative mode resetting hotbar item count to 1 --- .../content/logistics/box/PackageItem.java | 17 +++++------ .../packager/PackagerBlockEntity.java | 29 ++++++++++++++----- .../content/processing/basin/BasinBlock.java | 6 ---- .../processing/basin/BasinInventory.java | 7 ++++- 4 files changed, 35 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java index 41824fc48e..8a8c526952 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java @@ -254,15 +254,13 @@ public class PackageItem extends Item { ItemStackHandler contents = getContents(box); ItemStack particle = box.copy(); - box = box.copyWithCount(box.getCount() - 1); - if (box.isEmpty()) - box = ItemStack.EMPTY; - - playerIn.setItemInHand(handIn, box); + playerIn.setItemInHand(handIn, box.getCount() <= 1 ? ItemStack.EMPTY : box.copyWithCount(box.getCount() - 1)); if (!worldIn.isClientSide()) { for (int i = 0; i < contents.getSlots(); i++) { ItemStack itemstack = contents.getStackInSlot(i); + if (itemstack.isEmpty()) + continue; if (itemstack.getItem() instanceof SpawnEggItem sei && worldIn instanceof ServerLevel sl) { EntityType entitytype = sei.getType(itemstack.getTag()); @@ -275,10 +273,8 @@ public class PackageItem extends Item { itemstack.shrink(1); } - if (itemstack.isEmpty()) - continue; playerIn.getInventory() - .placeItemBackInInventory(itemstack); + .placeItemBackInInventory(itemstack.copy()); } } @@ -298,14 +294,15 @@ public class PackageItem extends Item { } } - return new InteractionResultHolder<>(InteractionResult.SUCCESS, playerIn.getItemInHand(handIn)); + return new InteractionResultHolder<>(InteractionResult.SUCCESS, box); } @Override public InteractionResult useOn(UseOnContext context) { if (context.getPlayer() - .isShiftKeyDown()) + .isShiftKeyDown()) { return open(context.getLevel(), context.getPlayer(), context.getHand()).getResult(); + } Vec3 point = context.getClickLocation(); float h = style.height() / 16f; diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java index e6fe125974..5f59eee4e9 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java @@ -24,6 +24,7 @@ import com.simibubi.create.content.logistics.packagerLink.PackagerLinkBlock; import com.simibubi.create.content.logistics.packagerLink.PackagerLinkBlockEntity; import com.simibubi.create.content.logistics.packagerLink.RequestPromiseQueue; import com.simibubi.create.content.logistics.stockTicker.PackageOrder; +import com.simibubi.create.content.processing.basin.BasinBlockEntity; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import com.simibubi.create.foundation.blockEntity.behaviour.inventory.CapManipulationBehaviourBase.InterfaceProvider; @@ -253,13 +254,21 @@ public class PackagerBlockEntity extends SmartBlockEntity { boolean targetIsCreativeCrate = targetInv instanceof BottomlessItemHandler; boolean targetIsCrafter = targetBE instanceof MechanicalCrafterBlockEntity; + + if (targetBE instanceof BasinBlockEntity basin) + basin.inputInventory.packagerMode = true; for (int slot = 0; slot < targetInv.getSlots(); slot++) { ItemStack itemInSlot = targetInv.getStackInSlot(slot); + if (!simulate) + itemInSlot = itemInSlot.copy(); + int itemsAddedToSlot = 0; for (int boxSlot = 0; boxSlot < contents.getSlots(); boxSlot++) { ItemStack toInsert = contents.getStackInSlot(boxSlot); + if (toInsert.isEmpty()) + continue; // Follow crafting arrangement if (targetIsCrafter && orderContext != null && orderContext.stacks() @@ -275,6 +284,7 @@ public class PackagerBlockEntity extends SmartBlockEntity { if (targetInv.insertItem(slot, toInsert, true) .getCount() == toInsert.getCount()) continue; + if (itemInSlot.isEmpty()) { int maxStackSize = targetInv.getSlotLimit(slot); if (maxStackSize < toInsert.getCount()) { @@ -282,11 +292,15 @@ public class PackagerBlockEntity extends SmartBlockEntity { toInsert = ItemHandlerHelper.copyStackWithSize(toInsert, maxStackSize); } else contents.setStackInSlot(boxSlot, ItemStack.EMPTY); + itemInSlot = toInsert; + if (!simulate) + itemInSlot = itemInSlot.copy(); + targetInv.insertItem(slot, toInsert, simulate); - itemsAddedToSlot += toInsert.getCount(); continue; } + if (!ItemHandlerHelper.canItemStacksStack(toInsert, itemInSlot)) continue; @@ -298,10 +312,15 @@ public class PackagerBlockEntity extends SmartBlockEntity { Math.min(toInsert.getCount(), slotLimit - itemInSlot.getCount() - itemsAddedToSlot); int added = Math.min(insertedAmount, Math.max(0, insertableAmountWithPreviousItems)); + itemsAddedToSlot += added; + contents.setStackInSlot(boxSlot, ItemHandlerHelper.copyStackWithSize(toInsert, toInsert.getCount() - added)); } } + + if (targetBE instanceof BasinBlockEntity basin) + basin.inputInventory.packagerMode = false; if (!targetIsCreativeCrate) for (int boxSlot = 0; boxSlot < contents.getSlots(); boxSlot++) @@ -337,8 +356,6 @@ public class PackagerBlockEntity extends SmartBlockEntity { String fixedAddress = null; int fixedOrderId = 0; - boolean continuePacking = true; - // Data written to packages for defrags int linkIndexInOrder = 0; boolean finalLinkInOrder = false; @@ -360,6 +377,8 @@ public class PackagerBlockEntity extends SmartBlockEntity { } Outer: for (int i = 0; i < PackageItem.SLOTS; i++) { + boolean continuePacking = true; + while (continuePacking) { continuePacking = false; @@ -386,10 +405,6 @@ public class PackagerBlockEntity extends SmartBlockEntity { extractedPackageItem = extracted; if (!requestQueue) { - if (targetInv instanceof BottomlessItemHandler) { - continuePacking = true; - continue Outer; - } if (bulky) break Outer; continue; diff --git a/src/main/java/com/simibubi/create/content/processing/basin/BasinBlock.java b/src/main/java/com/simibubi/create/content/processing/basin/BasinBlock.java index 26cafec475..f17ed8b511 100644 --- a/src/main/java/com/simibubi/create/content/processing/basin/BasinBlock.java +++ b/src/main/java/com/simibubi/create/content/processing/basin/BasinBlock.java @@ -139,18 +139,12 @@ public class BasinBlock extends Block implements IBE, IWrencha return; ItemEntity itemEntity = (ItemEntity) entityIn; withBlockEntityDo(worldIn, entityIn.blockPosition(), be -> { - - // Tossed items bypass the quarter-stack limit - be.inputInventory.withMaxStackSize(64); ItemStack insertItem = ItemHandlerHelper.insertItem(be.inputInventory, itemEntity.getItem() .copy(), false); - be.inputInventory.withMaxStackSize(16); - if (insertItem.isEmpty()) { itemEntity.discard(); return; } - itemEntity.setItem(insertItem); }); } diff --git a/src/main/java/com/simibubi/create/content/processing/basin/BasinInventory.java b/src/main/java/com/simibubi/create/content/processing/basin/BasinInventory.java index 63121355dc..8cb674203a 100644 --- a/src/main/java/com/simibubi/create/content/processing/basin/BasinInventory.java +++ b/src/main/java/com/simibubi/create/content/processing/basin/BasinInventory.java @@ -8,14 +8,19 @@ import net.minecraftforge.items.ItemHandlerHelper; public class BasinInventory extends SmartInventory { private BasinBlockEntity blockEntity; + + public boolean packagerMode; public BasinInventory(int slots, BasinBlockEntity be) { - super(slots, be, 16, true); + super(slots, be, 64, true); this.blockEntity = be; } @Override public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) { + if (packagerMode) // Unique stack insertion only matters for belt setups + return inv.insertItem(slot, stack, simulate); + int firstFreeSlot = -1; for (int i = 0; i < getSlots(); i++) { From 44517237a60c174bf8ed102df1b20747155be87f Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 13 Dec 2024 16:51:44 +0100 Subject: [PATCH 186/515] Down the hatch - Frogports display a tooltip when packages cannot be exported to their attached inventory - Item hatch now deposits inventory on shift - Added a conversion recipe for the re-packager - Added pathfinding blockers for any non-solid new blocks --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 6 +- .../82992cbf8f2794d83ac94034835eac0acd7915b9 | 46 ++++++------ .../resources/assets/create/lang/en_ud.json | 4 ++ .../resources/assets/create/lang/en_us.json | 4 ++ ...sion.json => gearbox_from_conversion.json} | 4 +- ...on => linear_chassis_from_conversion.json} | 4 +- ...n.json => sail_frame_from_conversion.json} | 4 +- ...ndary_linear_chassis_from_conversion.json} | 4 +- ....json => speedometer_from_conversion.json} | 4 +- ...json => stressometer_from_conversion.json} | 4 +- ... => vertical_gearbox_from_conversion.json} | 4 +- ...n.json => white_sail_from_conversion.json} | 4 +- .../logistics/packager_from_conversion.json | 35 +++++++++ .../logistics/repackager_from_conversion.json | 35 +++++++++ ...=> rose_quartz_tiles_from_conversion.json} | 4 +- ...ll_rose_quartz_tiles_from_conversion.json} | 4 +- ...sion.json => gearbox_from_conversion.json} | 0 ...on => linear_chassis_from_conversion.json} | 0 ...n.json => sail_frame_from_conversion.json} | 0 ...ndary_linear_chassis_from_conversion.json} | 0 ....json => speedometer_from_conversion.json} | 0 ...json => stressometer_from_conversion.json} | 0 ... => vertical_gearbox_from_conversion.json} | 0 ...n.json => white_sail_from_conversion.json} | 0 .../logistics/packager_from_conversion.json | 12 ++++ .../logistics/repackager_from_conversion.json | 12 ++++ ...=> rose_quartz_tiles_from_conversion.json} | 0 ...ll_rose_quartz_tiles_from_conversion.json} | 0 .../logistics/itemHatch/ItemHatchBlock.java | 18 +++-- .../logistics/itemHatch/ItemHatchHandler.java | 22 ++++++ .../packagePort/PackagePortBlockEntity.java | 2 +- .../packagePort/frogport/FrogportBlock.java | 6 ++ .../frogport/FrogportBlockEntity.java | 72 +++++++++++++------ .../packagePort/postbox/PostboxBlock.java | 6 ++ .../logistics/packager/PackagerBlock.java | 7 ++ .../stockTicker/StockTickerBlock.java | 6 ++ .../redstone/deskBell/DeskBellBlock.java | 6 ++ .../data/recipe/StandardRecipeGen.java | 4 +- .../assets/create/lang/default/interface.json | 5 ++ 39 files changed, 277 insertions(+), 71 deletions(-) rename src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/{gearboxfrom_conversion.json => gearbox_from_conversion.json} (81%) rename src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/{linear_chassisfrom_conversion.json => linear_chassis_from_conversion.json} (80%) rename src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/{sail_framefrom_conversion.json => sail_frame_from_conversion.json} (80%) rename src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/{secondary_linear_chassisfrom_conversion.json => secondary_linear_chassis_from_conversion.json} (86%) rename src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/{speedometerfrom_conversion.json => speedometer_from_conversion.json} (80%) rename src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/{stressometerfrom_conversion.json => stressometer_from_conversion.json} (80%) rename src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/{vertical_gearboxfrom_conversion.json => vertical_gearbox_from_conversion.json} (79%) rename src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/{white_sailfrom_conversion.json => white_sail_from_conversion.json} (80%) create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/packager_from_conversion.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/repackager_from_conversion.json rename src/generated/resources/data/create/advancements/recipes/misc/crafting/materials/{rose_quartz_tilesfrom_conversion.json => rose_quartz_tiles_from_conversion.json} (79%) rename src/generated/resources/data/create/advancements/recipes/misc/crafting/materials/{small_rose_quartz_tilesfrom_conversion.json => small_rose_quartz_tiles_from_conversion.json} (86%) rename src/generated/resources/data/create/recipes/crafting/kinetics/{gearboxfrom_conversion.json => gearbox_from_conversion.json} (100%) rename src/generated/resources/data/create/recipes/crafting/kinetics/{linear_chassisfrom_conversion.json => linear_chassis_from_conversion.json} (100%) rename src/generated/resources/data/create/recipes/crafting/kinetics/{sail_framefrom_conversion.json => sail_frame_from_conversion.json} (100%) rename src/generated/resources/data/create/recipes/crafting/kinetics/{secondary_linear_chassisfrom_conversion.json => secondary_linear_chassis_from_conversion.json} (100%) rename src/generated/resources/data/create/recipes/crafting/kinetics/{speedometerfrom_conversion.json => speedometer_from_conversion.json} (100%) rename src/generated/resources/data/create/recipes/crafting/kinetics/{stressometerfrom_conversion.json => stressometer_from_conversion.json} (100%) rename src/generated/resources/data/create/recipes/crafting/kinetics/{vertical_gearboxfrom_conversion.json => vertical_gearbox_from_conversion.json} (100%) rename src/generated/resources/data/create/recipes/crafting/kinetics/{white_sailfrom_conversion.json => white_sail_from_conversion.json} (100%) create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/packager_from_conversion.json create mode 100644 src/generated/resources/data/create/recipes/crafting/logistics/repackager_from_conversion.json rename src/generated/resources/data/create/recipes/crafting/materials/{rose_quartz_tilesfrom_conversion.json => rose_quartz_tiles_from_conversion.json} (100%) rename src/generated/resources/data/create/recipes/crafting/materials/{small_rose_quartz_tilesfrom_conversion.json => small_rose_quartz_tiles_from_conversion.json} (100%) create mode 100644 src/main/java/com/simibubi/create/content/logistics/itemHatch/ItemHatchHandler.java diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index ca58b49674..54f772746b 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-12-12T16:37:04.2481578 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-12-13T16:26:00.0986028 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -642,8 +642,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -5aefb46c4d0deb079dddc182c65d4f312113b884 assets/create/lang/en_ud.json -be5597dbc2784544de3552d791dccfffe92429e1 assets/create/lang/en_us.json +e6c336785b83d73c677a5a996c39324959f90965 assets/create/lang/en_ud.json +59435160c92774cb6c0dc6961ae8ed967c891316 assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json diff --git a/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 b/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 index 7fce810441..d02e2034c5 100644 --- a/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 +++ b/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 @@ -1,4 +1,4 @@ -// 1.20.1 2024-11-08T10:52:38.0073058 Create's Standard Recipes +// 1.20.1 2024-12-13T16:37:18.6553347 Create's Standard Recipes a8cc4af26f6c7c45a9eef12e92af1452fe042454 data/create/advancements/recipes/combat/crafting/appliances/netherite_backtank.json 2c2639c7b307ee7c7a4e97e5efebf496788998ad data/create/advancements/recipes/combat/crafting/appliances/netherite_backtank_from_netherite.json 81dcf0cb1aa99e39bc7d1a386e07cad4cee7d8b9 data/create/advancements/recipes/combat/crafting/appliances/netherite_diving_boots.json @@ -101,7 +101,7 @@ a11a4e11fe9b762ccf8be72adffd59e45f6d47fe data/create/advancements/recipes/misc/c 8eb770396aa27283baabbc708698f5419a65a657 data/create/advancements/recipes/misc/crafting/kinetics/gantry_carriage.json 1c5e47b8dde41e2947c2f6111616cc0493a4aa7e data/create/advancements/recipes/misc/crafting/kinetics/gantry_shaft.json 2d413928c4305a5bf2b7bc9787ec2cb7ae5a062d data/create/advancements/recipes/misc/crafting/kinetics/gearbox.json -005c2d4110a88f08561edf23835b626103e1ebdd data/create/advancements/recipes/misc/crafting/kinetics/gearboxfrom_conversion.json +2fe7506d05f1fffbbcc6b870d3fc343bb587faef data/create/advancements/recipes/misc/crafting/kinetics/gearbox_from_conversion.json d2dded1337838b08b79e6648dba326eca1cf3a1a data/create/advancements/recipes/misc/crafting/kinetics/gearshift.json 146325fa3698e3622fd848e8e6852e9a345d9919 data/create/advancements/recipes/misc/crafting/kinetics/goggles.json 5afa3600386e6a4cd00827d8c8ba6f48d186d968 data/create/advancements/recipes/misc/crafting/kinetics/hand_crank.json @@ -112,7 +112,7 @@ d2dded1337838b08b79e6648dba326eca1cf3a1a data/create/advancements/recipes/misc/c 7c29cbb89566ed33f44e77cba339c52f70929359 data/create/advancements/recipes/misc/crafting/kinetics/large_cogwheel_from_little.json 3085e5ac3822c41d5b52c19114149dc59aa5a976 data/create/advancements/recipes/misc/crafting/kinetics/large_water_wheel.json 73c5818c85cf3908a77ca2380b71ffd8e2f6eb44 data/create/advancements/recipes/misc/crafting/kinetics/linear_chassis.json -c7f3dfb1fdca94ad9d54992f0217786674705a23 data/create/advancements/recipes/misc/crafting/kinetics/linear_chassisfrom_conversion.json +42e85c0a63282d052b2dd979caaa50280af2a4d7 data/create/advancements/recipes/misc/crafting/kinetics/linear_chassis_from_conversion.json ba22885e1a95a0deaa8546dd977978c60b515f65 data/create/advancements/recipes/misc/crafting/kinetics/mechanical_arm.json d00bc56d415fd2c5a073961838173704fdcc43a7 data/create/advancements/recipes/misc/crafting/kinetics/mechanical_bearing.json 88142129f4c99e4266cfb1c172db6a6c1de83799 data/create/advancements/recipes/misc/crafting/kinetics/mechanical_crafter.json @@ -142,21 +142,21 @@ c56ed6c06c97571d88e1dd270e6ed8dc917c1c4c data/create/advancements/recipes/misc/c 0cc198acbc6355e66febbb10c890a15517043290 data/create/advancements/recipes/misc/crafting/kinetics/rope_pulley.json 0171ff48525e4f52556d4052ce61a2651c94ee4e data/create/advancements/recipes/misc/crafting/kinetics/rose_quartz_lamp.json a48ba9ff9296828767929cdece32b105911def6b data/create/advancements/recipes/misc/crafting/kinetics/rotation_speed_controller.json -b0015a697c8c9e4de401822be7146b503b2a9517 data/create/advancements/recipes/misc/crafting/kinetics/sail_framefrom_conversion.json +9ba063e03d56eef75cffcb1b3b1e6e9dfe594704 data/create/advancements/recipes/misc/crafting/kinetics/sail_frame_from_conversion.json df5d477fe7e901ac33187160081061ace0a291a9 data/create/advancements/recipes/misc/crafting/kinetics/schedule.json -b3222b4ad0e076b5dbedb93e49e947a960572f95 data/create/advancements/recipes/misc/crafting/kinetics/secondary_linear_chassisfrom_conversion.json +98b67a463a5988cd318b9ed1123ca51f4121dbd4 data/create/advancements/recipes/misc/crafting/kinetics/secondary_linear_chassis_from_conversion.json 319154470d3c5289e1657947b312323e6bc0da52 data/create/advancements/recipes/misc/crafting/kinetics/sequenced_gearshift.json b7b1cddd6964faf54efa794aa6697c16855c968c data/create/advancements/recipes/misc/crafting/kinetics/shaft.json 28b94c9f030cd0f4c4c68f2c6123566066af4a0f data/create/advancements/recipes/misc/crafting/kinetics/smart_chute.json 298f59618e269714385fb9cf7a2e973d61380a40 data/create/advancements/recipes/misc/crafting/kinetics/smart_fluid_pipe.json a6dfc4c646a359ebfb4fc839bde6ebcde54ae1a6 data/create/advancements/recipes/misc/crafting/kinetics/speedometer.json -a48f86ff4efc8f322feef41db862a39e681043b9 data/create/advancements/recipes/misc/crafting/kinetics/speedometerfrom_conversion.json +ba1bb5ce9a0dc8438fe128b31cb97dc0892a6d55 data/create/advancements/recipes/misc/crafting/kinetics/speedometer_from_conversion.json d2315557fb6d9c5086c8801033b6562c775e35e6 data/create/advancements/recipes/misc/crafting/kinetics/spout.json 31c0a0d5d6d1a01b4f9702e5a23c9341727fe4e8 data/create/advancements/recipes/misc/crafting/kinetics/steam_engine.json a5396817b5978fd150f8c3ef33a0cbff22a9e315 data/create/advancements/recipes/misc/crafting/kinetics/steam_whistle.json 0123b8926c6e37551b8e3fdb72f44da181cd4e03 data/create/advancements/recipes/misc/crafting/kinetics/sticker.json c510077aaf3b7b8cea230578f835bf4e679089bf data/create/advancements/recipes/misc/crafting/kinetics/sticky_mechanical_piston.json -8e2048e5e795b971ede965d56b2eb46eb71e106e data/create/advancements/recipes/misc/crafting/kinetics/stressometerfrom_conversion.json +2ff567b433359b6b59ba95219abbeb2e874da663 data/create/advancements/recipes/misc/crafting/kinetics/stressometer_from_conversion.json fc9a10e60637cb2da98825a1d79359431fdd8e9b data/create/advancements/recipes/misc/crafting/kinetics/super_glue.json 32086aec6acc2e236ccd1bdcad8077355cfbc801 data/create/advancements/recipes/misc/crafting/kinetics/track_observer.json 4c109779fa881db7589ced1b7816b48700ad9d17 data/create/advancements/recipes/misc/crafting/kinetics/track_observer_from_other_plates.json @@ -166,12 +166,12 @@ d05bf9eb0708fd08727414a05432119547683c82 data/create/advancements/recipes/misc/c 13c05d4a0d21a98633f332cf4e29fa9d984c2b97 data/create/advancements/recipes/misc/crafting/kinetics/train_trapdoor.json 2a765b5135e700fc7051d4b66e6be8d971445bda data/create/advancements/recipes/misc/crafting/kinetics/turntable.json 32a8453e28678b0efb9cc70cf38e72801a718793 data/create/advancements/recipes/misc/crafting/kinetics/vertical_gearbox.json -8eca7b132f53c805ef71bbe148a4b6eb482d5d0d data/create/advancements/recipes/misc/crafting/kinetics/vertical_gearboxfrom_conversion.json +a7c1f6598b040fa90f8e27b3c4ac5512cf124e0b data/create/advancements/recipes/misc/crafting/kinetics/vertical_gearbox_from_conversion.json dd4849e6ac91a82a4663477dd2ea51375d184bb3 data/create/advancements/recipes/misc/crafting/kinetics/water_wheel.json 3bee8e0d4e324868eff29a6a86080d7a8656f298 data/create/advancements/recipes/misc/crafting/kinetics/weighted_ejector.json 370503ffc2272ceac8e48cabb745d9b3fd255745 data/create/advancements/recipes/misc/crafting/kinetics/whisk.json 45e1e9501b61eebec228cd2b9832103ec837f391 data/create/advancements/recipes/misc/crafting/kinetics/white_sail.json -7f4908fac450a7a8d74ad7d4fbbe970f177d272c data/create/advancements/recipes/misc/crafting/kinetics/white_sailfrom_conversion.json +49fedb2b8097c115b363021580f078a48db3bb6e data/create/advancements/recipes/misc/crafting/kinetics/white_sail_from_conversion.json 74f446a14c9b70174d2a4d59d99907322ea74c61 data/create/advancements/recipes/misc/crafting/kinetics/windmill_bearing.json 28e5044c7c9cfdefa23f9371ee995c04ecb10d2c data/create/advancements/recipes/misc/crafting/kinetics/wooden_bracket.json fddb0494d761952a22046cd17b74ff3de1e50246 data/create/advancements/recipes/misc/crafting/kinetics/wrench.json @@ -186,6 +186,7 @@ dc61a327753684a0d8a7bcc408d656b53ac633b1 data/create/advancements/recipes/misc/c 02fd978c4f9f3c247710b052486cb498aebce95b data/create/advancements/recipes/misc/crafting/logistics/factory_gauge_clear.json 0e7dbb15985de28fd5e2e60cfbee409143fdff73 data/create/advancements/recipes/misc/crafting/logistics/item_hatch.json fd14b161b827719d7ea709b88cb1d16adb1d5fbb data/create/advancements/recipes/misc/crafting/logistics/packager.json +375fa83a5c6f1e33ec42e2a3fa56403b4c0546f7 data/create/advancements/recipes/misc/crafting/logistics/packager_from_conversion.json 802efaee476f8be8cba6754fe584324957be76e8 data/create/advancements/recipes/misc/crafting/logistics/package_frogport.json 95b357cbac39acfbc68ac04d0d4681a4d91746ee data/create/advancements/recipes/misc/crafting/logistics/powered_latch.json ef84b382bd4f6ba9558574f2c8e63030813594e9 data/create/advancements/recipes/misc/crafting/logistics/powered_toggle_latch.json @@ -196,6 +197,7 @@ c443707391ce79dc1ec8cfacee74757b0c00bd3e data/create/advancements/recipes/misc/c 1b50ed47c37e48d1112c76059574eed71ecea4e5 data/create/advancements/recipes/misc/crafting/logistics/redstone_link.json 8ed69a5a2fcbc6e1cb2de901017ebd3fc3fb3dc3 data/create/advancements/recipes/misc/crafting/logistics/redstone_requester.json cea78bc9b093a8a6a85ef1df53ddf11d9c37a114 data/create/advancements/recipes/misc/crafting/logistics/redstone_requester_clear.json +8ec1937280c6d6ba8b79de8652f3b1c588f4b4e2 data/create/advancements/recipes/misc/crafting/logistics/repackager_from_conversion.json 831588b3f29411d5c4b358006051152eb2b23e6b data/create/advancements/recipes/misc/crafting/logistics/stockpile_switch.json 2408cdbac7edb7857223d716e466ed6d16dd50ee data/create/advancements/recipes/misc/crafting/logistics/stock_link.json 972ce787e625ad95588ba1fdd36098173798f198 data/create/advancements/recipes/misc/crafting/logistics/stock_link_clear.json @@ -222,9 +224,9 @@ aa2067bedd73d45dcf4bf2c1a30d227d4de4f57d data/create/advancements/recipes/misc/c 06a3797c9c16641e05a257980a6afc522d2635b5 data/create/advancements/recipes/misc/crafting/materials/raw_zinc_block.json 59018ba1b05242dfc25d5de72fcff572ab18d424 data/create/advancements/recipes/misc/crafting/materials/red_sand_paper.json 03560f4fe648ea51160efaff89d3b7ef0cd87d69 data/create/advancements/recipes/misc/crafting/materials/rose_quartz.json -5aeaf7bdfb4a8abec97af7b055ea9209221fef9d data/create/advancements/recipes/misc/crafting/materials/rose_quartz_tilesfrom_conversion.json +4fb6101ff037b9da3f030729dd991dab4c934267 data/create/advancements/recipes/misc/crafting/materials/rose_quartz_tiles_from_conversion.json 489c20709121bfe0408566b0b89dfa685efef8e4 data/create/advancements/recipes/misc/crafting/materials/sand_paper.json -4fa119d82266d6b8390433842d610effb1a8ace1 data/create/advancements/recipes/misc/crafting/materials/small_rose_quartz_tilesfrom_conversion.json +6cd07e204c574b1419ba81cfffc1967a1c7d4f75 data/create/advancements/recipes/misc/crafting/materials/small_rose_quartz_tiles_from_conversion.json 0d60ad8d0436ed33a8013616390ca5e970e042ee data/create/advancements/recipes/misc/crafting/materials/zinc_block_from_compacting.json 8b9692de75d0c1d694bb3a2ce2316200ef3ff197 data/create/advancements/recipes/misc/crafting/materials/zinc_ingot_from_compacting.json dd7c250fa8e41cbaae65754f38b8861397718ae4 data/create/advancements/recipes/misc/crafting/materials/zinc_ingot_from_decompacting.json @@ -376,7 +378,7 @@ be87c0108dae97d6bcb637715749b96fbc656002 data/create/recipes/crafting/kinetics/f 5ee1c8ad641287e649fd56505e673f37c16089fa data/create/recipes/crafting/kinetics/gantry_carriage.json f9550471dcd0e446034d0c7010779ec10247ccf8 data/create/recipes/crafting/kinetics/gantry_shaft.json 32baae49676966ef04019c6c54e2e8363a23d883 data/create/recipes/crafting/kinetics/gearbox.json -a98b568daee4051397176d2fa2b6b2992b412a52 data/create/recipes/crafting/kinetics/gearboxfrom_conversion.json +a98b568daee4051397176d2fa2b6b2992b412a52 data/create/recipes/crafting/kinetics/gearbox_from_conversion.json 096d09e6021e0c47f9daa259c0a9200ff36b3fbb data/create/recipes/crafting/kinetics/gearshift.json 18d983aaef9e32073ec656e60855cd2d56ef168f data/create/recipes/crafting/kinetics/goggles.json bc69dfe59b369eead6f3da593eae5a107933d339 data/create/recipes/crafting/kinetics/hand_crank.json @@ -387,7 +389,7 @@ ef525f4a19bc17fdfdd73c1e7ad65da0c8423b59 data/create/recipes/crafting/kinetics/l 04a9cd133f7e1f88a35653ea205bb5a7e63cbecd data/create/recipes/crafting/kinetics/large_cogwheel_from_little.json b24ff0cffeb7c69e3c8f6fdc55e88e8067454142 data/create/recipes/crafting/kinetics/large_water_wheel.json 984f2dcd5d43959f5830231fbf0f535de9fb4b41 data/create/recipes/crafting/kinetics/linear_chassis.json -27944146a510a98193140b5bed5feef2c05c8014 data/create/recipes/crafting/kinetics/linear_chassisfrom_conversion.json +27944146a510a98193140b5bed5feef2c05c8014 data/create/recipes/crafting/kinetics/linear_chassis_from_conversion.json d3c5afadd966993262a89cad0c6892bacf15f4e0 data/create/recipes/crafting/kinetics/mechanical_arm.json 68ccedb968fb15507f553eba8e0f38730209c076 data/create/recipes/crafting/kinetics/mechanical_bearing.json 355d65ca635d657423dab36c22bfb6cdb6c66d67 data/create/recipes/crafting/kinetics/mechanical_crafter.json @@ -417,21 +419,21 @@ fa58c3eeca2d2cd2a42a60f8e72021288773d20f data/create/recipes/crafting/kinetics/r d772312c83aff31d1fc27156e254cb95fd27fc2c data/create/recipes/crafting/kinetics/rope_pulley.json bb59333590f4408750a8e86ab6dabb4f8ea145ac data/create/recipes/crafting/kinetics/rose_quartz_lamp.json 42d334d81633d5f346b7e0c5005c1811fed293d9 data/create/recipes/crafting/kinetics/rotation_speed_controller.json -faaa02462c428daeefc7bc2d32d491afa49128c3 data/create/recipes/crafting/kinetics/sail_framefrom_conversion.json +faaa02462c428daeefc7bc2d32d491afa49128c3 data/create/recipes/crafting/kinetics/sail_frame_from_conversion.json dda3e44d83e8e2e4c45eda27758fc6f87118eb9d data/create/recipes/crafting/kinetics/schedule.json -0f3f10a756d32e438fdb51fb1e6d00ee1c05bc3f data/create/recipes/crafting/kinetics/secondary_linear_chassisfrom_conversion.json +0f3f10a756d32e438fdb51fb1e6d00ee1c05bc3f data/create/recipes/crafting/kinetics/secondary_linear_chassis_from_conversion.json a282f8e372b14819c20319736a52506f508f9c17 data/create/recipes/crafting/kinetics/sequenced_gearshift.json b80b9bf1a36aab395cdd6200bcd3497c8e693ce1 data/create/recipes/crafting/kinetics/shaft.json a1d7e73399044cab19fd564d71d5fdfa754181ae data/create/recipes/crafting/kinetics/smart_chute.json 31698b810c00c5bff2b213d465614bbde2cae2aa data/create/recipes/crafting/kinetics/smart_fluid_pipe.json 001868b8959c6d1583daa08ce7098a0bda349d08 data/create/recipes/crafting/kinetics/speedometer.json -fcd251937ad8ec78213d8d4277fefff3ae998061 data/create/recipes/crafting/kinetics/speedometerfrom_conversion.json +fcd251937ad8ec78213d8d4277fefff3ae998061 data/create/recipes/crafting/kinetics/speedometer_from_conversion.json 4549864bccf0fafeb190fe0fc0427c1feb6602cb data/create/recipes/crafting/kinetics/spout.json ff9fa17b98d37c1814962fafb1ca60f07a3d0e8f data/create/recipes/crafting/kinetics/steam_engine.json 2b24f72c4d33d035db32005ff72623a61819ddcf data/create/recipes/crafting/kinetics/steam_whistle.json 87c25c7aa34b699586696344c83cdc181a93761c data/create/recipes/crafting/kinetics/sticker.json 19cc465a5e738785e91e2663f1b0c0e03f656b3a data/create/recipes/crafting/kinetics/sticky_mechanical_piston.json -27879de3fe0dbea5e4b6cec110459ce01cfa2556 data/create/recipes/crafting/kinetics/stressometerfrom_conversion.json +27879de3fe0dbea5e4b6cec110459ce01cfa2556 data/create/recipes/crafting/kinetics/stressometer_from_conversion.json 1fd12eac975ce2ffb6212e25f2309ad08537a4b6 data/create/recipes/crafting/kinetics/super_glue.json ae836d3103b16bb7084109c4d25295f0a3bc6f7c data/create/recipes/crafting/kinetics/track_observer.json 1747771e1eb570c0cfdc97681d8b9d0ccb1db73d data/create/recipes/crafting/kinetics/track_observer_from_other_plates.json @@ -441,12 +443,12 @@ af645fe446e0df755fb748383a51facbe9101ede data/create/recipes/crafting/kinetics/t 26d9401533332cbc7580b32b45cdebf6ad3c523d data/create/recipes/crafting/kinetics/train_trapdoor.json a02e799451c8051250ab077ee94bec8f17705d5f data/create/recipes/crafting/kinetics/turntable.json c2644263571eb8a14ed535c1e88924a6098e2e6f data/create/recipes/crafting/kinetics/vertical_gearbox.json -613d2ef5c381445d9a0bb1020f9d0ab9fb04d766 data/create/recipes/crafting/kinetics/vertical_gearboxfrom_conversion.json +613d2ef5c381445d9a0bb1020f9d0ab9fb04d766 data/create/recipes/crafting/kinetics/vertical_gearbox_from_conversion.json af2fc528dacef0300115977c681976b793329c8d data/create/recipes/crafting/kinetics/water_wheel.json 97054ad290c974f60d9be41c642e661442a98bca data/create/recipes/crafting/kinetics/weighted_ejector.json 9ab4fa87c54b6580d3f7a1f8be8790c8f30f41fa data/create/recipes/crafting/kinetics/whisk.json 7a933e80436c256804e8e448e954399933ccdcf4 data/create/recipes/crafting/kinetics/white_sail.json -9c7a4511aa52c4ab80ff692f0d7eca5cbf3fc470 data/create/recipes/crafting/kinetics/white_sailfrom_conversion.json +9c7a4511aa52c4ab80ff692f0d7eca5cbf3fc470 data/create/recipes/crafting/kinetics/white_sail_from_conversion.json 2e1e7414ec81f21640efb72f74eec8b4f6e9e105 data/create/recipes/crafting/kinetics/windmill_bearing.json 04162aed9da6d5c8f5da33d041d95c960bd743f8 data/create/recipes/crafting/kinetics/wooden_bracket.json 4818f756d9198fe17a27176c51fda90a830504e7 data/create/recipes/crafting/kinetics/wrench.json @@ -461,6 +463,7 @@ cc837e8b014c121ed9d959baddea134ebf669350 data/create/recipes/crafting/logistics/ 2fb7722137990b9b9be967a1f766e138678d0573 data/create/recipes/crafting/logistics/factory_gauge_clear.json f3ba21e8979256fb78cd618ac4f1082b0b2f9e0c data/create/recipes/crafting/logistics/item_hatch.json 38c6236d7ac157a75ac5a98ab9b712eabb0c78c4 data/create/recipes/crafting/logistics/packager.json +6b51fa6a5bd1e9dc8e7387269d985cd622ab8ada data/create/recipes/crafting/logistics/packager_from_conversion.json 6852cb8ff6916981920ab9c987c6e357e9236511 data/create/recipes/crafting/logistics/package_frogport.json dd28b63ceb46a1e9071549c4f8ff32f520c667f6 data/create/recipes/crafting/logistics/powered_latch.json 9ee6e19644928dc78e6f8a5e59f30cd42ac3e454 data/create/recipes/crafting/logistics/powered_toggle_latch.json @@ -471,6 +474,7 @@ c81f852f1d1514184ff235e790a6ca907f7b6ad4 data/create/recipes/crafting/logistics/ 00877e6b56f28d8691080ef18b654f0a141835ce data/create/recipes/crafting/logistics/redstone_link.json 06670fd44389b2b1755c80d02898a68c7c490620 data/create/recipes/crafting/logistics/redstone_requester.json 8446b3ca07575ea978ddde4121900207d54be8b3 data/create/recipes/crafting/logistics/redstone_requester_clear.json +e156e092a9c719e91cd62e23f8ee2201dce4c2a8 data/create/recipes/crafting/logistics/repackager_from_conversion.json eff0d37e98e8badd8d2c3c9de17ee5560b110dbd data/create/recipes/crafting/logistics/stockpile_switch.json 900dc578ab8dd26014cf473f2c5a8b5fbf23ccf8 data/create/recipes/crafting/logistics/stock_link.json e19544e2ef88a4d10f6dc8a3a973793cb00085ba data/create/recipes/crafting/logistics/stock_link_clear.json @@ -497,9 +501,9 @@ bc0a0b576a8895c5e31374cd3e6f9f2c8e20d542 data/create/recipes/crafting/materials/ e89aa3ab801e3ce25387ae67c5e47bab518b9225 data/create/recipes/crafting/materials/raw_zinc_block.json 388654485ad957c58c4d6019273a85cebd468cca data/create/recipes/crafting/materials/red_sand_paper.json 712255438e212e37cad4bbf65b995385d37b3ce1 data/create/recipes/crafting/materials/rose_quartz.json -46cb889dd23d9a8a47f8b340abcbdbec35b21ee3 data/create/recipes/crafting/materials/rose_quartz_tilesfrom_conversion.json +46cb889dd23d9a8a47f8b340abcbdbec35b21ee3 data/create/recipes/crafting/materials/rose_quartz_tiles_from_conversion.json cde25f253da4d9800fd8f879a7d208e40510df82 data/create/recipes/crafting/materials/sand_paper.json -39d9f3238bffd32a0bbe85f300bee0c71161f2df data/create/recipes/crafting/materials/small_rose_quartz_tilesfrom_conversion.json +39d9f3238bffd32a0bbe85f300bee0c71161f2df data/create/recipes/crafting/materials/small_rose_quartz_tiles_from_conversion.json 24c99b98a2acb744a05f9ff4f22b783689e2b2f9 data/create/recipes/crafting/materials/zinc_block_from_compacting.json 5effb47ad68c8bacc4b1984a37b63ae3b02b3e88 data/create/recipes/crafting/materials/zinc_ingot_from_compacting.json 2636700eda7f06a9297af688c8b7963b2611ea42 data/create/recipes/crafting/materials/zinc_ingot_from_decompacting.json diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 138e1c1d95..6751a460ad 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -1403,6 +1403,8 @@ "create.gui.toolmenu.focusKey": "snɔoℲ oʇ ]%1$s[ pןoH", "create.gui.value_settings.hold_to_edit": "ʇıpǝ oʇ pןoɥ puɐ ʞɔıןƆ", "create.gui.value_settings.release_to_confirm": "ɯɹıɟuoƆ oʇ %1$s ǝsɐǝןǝᴚ", + "create.hint.blocked_frogport": "¿ןןnɟ ǝq ʇı pןnoƆ ‾˙ʍoןǝq‾ ‾ʎɹoʇuǝʌuı‾ ǝɥʇ oʇ pǝɹɹǝɟsuɐɹʇ ǝq ʇou pןnoɔ ‾ʇɹodboɹℲ‾ sıɥʇ ʎq ʇɥbnɐɔ ‾ǝbɐʞɔɐԀ‾ Ɐ", + "create.hint.blocked_frogport.title": "sǝbɐʞɔɐԀ suıɐʇuoƆ", "create.hint.derailed_train": "˙ʞɔɐɹʇ ʎqɹɐǝu ɐ oʇ ʇı ǝʇɐɔoןǝɹ oʇ ɹǝpɹo uı ‾ɥɔuǝɹʍ‾ ɐ buısn ‾ʞɔıןƆ-ʇɥbıᴚ‾ ˙ǝɔǝıd ʞɔɐɹʇ pǝʇɔǝuuoɔ ɐ uo buıʇʇıs ɹǝbuoן ou sı ‾uıɐɹ⟘‾ sıɥʇ sɹɐǝddɐ ʇI", "create.hint.derailed_train.title": "uıɐɹ⟘ pǝןıɐɹǝᗡ", "create.hint.empty_bearing": "˙ʇı ɟo ʇuoɹɟ uı ʇןınq ʇsnظ noʎ ǝɹnʇɔnɹʇs ǝɥʇ ‾ɥɔɐʇʇɐ‾ oʇ ‾puɐɥ‾ ‾ʎʇdɯǝ‾ uɐ ɥʇıʍ buıɹɐǝq ǝɥʇ ‾ʞɔıןɔ-ʇɥbıᴚ‾", @@ -1486,6 +1488,8 @@ "create.item_attributes.smokable.inverted": "pǝʞoɯS ǝq ʇouuɐɔ", "create.item_attributes.washable": "pǝɥsɐM ǝq uɐɔ", "create.item_attributes.washable.inverted": "pǝɥsɐM ǝq ʇouuɐɔ", + "create.item_hatch.deposit_inventory": "pǝʇısodǝp sɯǝʇı ʎɹoʇuǝʌuI", + "create.item_hatch.deposit_item": "pǝʇısodǝp ɯǝʇı pןǝH", "create.keyinfo.ponder": "ɹǝpuoԀ", "create.keyinfo.scrolldown": ")pןɹoʍuı( uʍoᗡ ןǝǝɥʍǝsnoW ǝʇɐןnɯıS", "create.keyinfo.scrollup": ")pןɹoʍuı( d∩ ןǝǝɥʍǝsnoW ǝʇɐןnɯıS", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 86250c07cb..c8770d0d6a 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1403,6 +1403,8 @@ "create.gui.toolmenu.focusKey": "Hold [%1$s] to Focus", "create.gui.value_settings.hold_to_edit": "Click and hold to edit", "create.gui.value_settings.release_to_confirm": "Release %1$s to Confirm", + "create.hint.blocked_frogport": "A _Package_ caught by this _Frogport_ could not be transferred to the _inventory_ _below._ Could it be full?", + "create.hint.blocked_frogport.title": "Contains Packages", "create.hint.derailed_train": "It appears this _Train_ is no longer sitting on a connected track piece. _Right-Click_ using a _wrench_ in order to relocate it to a nearby track.", "create.hint.derailed_train.title": "Derailed Train", "create.hint.empty_bearing": "_Right-click_ the bearing with an _empty_ _hand_ to _attach_ the structure you just built in front of it.", @@ -1486,6 +1488,8 @@ "create.item_attributes.smokable.inverted": "cannot be Smoked", "create.item_attributes.washable": "can be Washed", "create.item_attributes.washable.inverted": "cannot be Washed", + "create.item_hatch.deposit_inventory": "Inventory items deposited", + "create.item_hatch.deposit_item": "Held item deposited", "create.keyinfo.ponder": "Ponder", "create.keyinfo.scrolldown": "Simulate Mousewheel Down (inworld)", "create.keyinfo.scrollup": "Simulate Mousewheel Up (inworld)", diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/gearboxfrom_conversion.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/gearbox_from_conversion.json similarity index 81% rename from src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/gearboxfrom_conversion.json rename to src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/gearbox_from_conversion.json index 73608851b5..e7aebadd26 100644 --- a/src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/gearboxfrom_conversion.json +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/gearbox_from_conversion.json @@ -15,7 +15,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "create:crafting/kinetics/gearboxfrom_conversion" + "recipe": "create:crafting/kinetics/gearbox_from_conversion" }, "trigger": "minecraft:recipe_unlocked" } @@ -28,7 +28,7 @@ ], "rewards": { "recipes": [ - "create:crafting/kinetics/gearboxfrom_conversion" + "create:crafting/kinetics/gearbox_from_conversion" ] }, "sends_telemetry_event": false diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/linear_chassisfrom_conversion.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/linear_chassis_from_conversion.json similarity index 80% rename from src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/linear_chassisfrom_conversion.json rename to src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/linear_chassis_from_conversion.json index 852eeac204..360f8910b0 100644 --- a/src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/linear_chassisfrom_conversion.json +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/linear_chassis_from_conversion.json @@ -15,7 +15,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "create:crafting/kinetics/linear_chassisfrom_conversion" + "recipe": "create:crafting/kinetics/linear_chassis_from_conversion" }, "trigger": "minecraft:recipe_unlocked" } @@ -28,7 +28,7 @@ ], "rewards": { "recipes": [ - "create:crafting/kinetics/linear_chassisfrom_conversion" + "create:crafting/kinetics/linear_chassis_from_conversion" ] }, "sends_telemetry_event": false diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/sail_framefrom_conversion.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/sail_frame_from_conversion.json similarity index 80% rename from src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/sail_framefrom_conversion.json rename to src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/sail_frame_from_conversion.json index 1cf800e0f5..ced30f9ffc 100644 --- a/src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/sail_framefrom_conversion.json +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/sail_frame_from_conversion.json @@ -15,7 +15,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "create:crafting/kinetics/sail_framefrom_conversion" + "recipe": "create:crafting/kinetics/sail_frame_from_conversion" }, "trigger": "minecraft:recipe_unlocked" } @@ -28,7 +28,7 @@ ], "rewards": { "recipes": [ - "create:crafting/kinetics/sail_framefrom_conversion" + "create:crafting/kinetics/sail_frame_from_conversion" ] }, "sends_telemetry_event": false diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/secondary_linear_chassisfrom_conversion.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/secondary_linear_chassis_from_conversion.json similarity index 86% rename from src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/secondary_linear_chassisfrom_conversion.json rename to src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/secondary_linear_chassis_from_conversion.json index df18e75007..4422f2854a 100644 --- a/src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/secondary_linear_chassisfrom_conversion.json +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/secondary_linear_chassis_from_conversion.json @@ -15,7 +15,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "create:crafting/kinetics/secondary_linear_chassisfrom_conversion" + "recipe": "create:crafting/kinetics/secondary_linear_chassis_from_conversion" }, "trigger": "minecraft:recipe_unlocked" } @@ -28,7 +28,7 @@ ], "rewards": { "recipes": [ - "create:crafting/kinetics/secondary_linear_chassisfrom_conversion" + "create:crafting/kinetics/secondary_linear_chassis_from_conversion" ] }, "sends_telemetry_event": false diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/speedometerfrom_conversion.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/speedometer_from_conversion.json similarity index 80% rename from src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/speedometerfrom_conversion.json rename to src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/speedometer_from_conversion.json index 24b423c1dd..68452abb78 100644 --- a/src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/speedometerfrom_conversion.json +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/speedometer_from_conversion.json @@ -15,7 +15,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "create:crafting/kinetics/speedometerfrom_conversion" + "recipe": "create:crafting/kinetics/speedometer_from_conversion" }, "trigger": "minecraft:recipe_unlocked" } @@ -28,7 +28,7 @@ ], "rewards": { "recipes": [ - "create:crafting/kinetics/speedometerfrom_conversion" + "create:crafting/kinetics/speedometer_from_conversion" ] }, "sends_telemetry_event": false diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/stressometerfrom_conversion.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/stressometer_from_conversion.json similarity index 80% rename from src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/stressometerfrom_conversion.json rename to src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/stressometer_from_conversion.json index dbef87455c..ad84b318c4 100644 --- a/src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/stressometerfrom_conversion.json +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/stressometer_from_conversion.json @@ -15,7 +15,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "create:crafting/kinetics/stressometerfrom_conversion" + "recipe": "create:crafting/kinetics/stressometer_from_conversion" }, "trigger": "minecraft:recipe_unlocked" } @@ -28,7 +28,7 @@ ], "rewards": { "recipes": [ - "create:crafting/kinetics/stressometerfrom_conversion" + "create:crafting/kinetics/stressometer_from_conversion" ] }, "sends_telemetry_event": false diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/vertical_gearboxfrom_conversion.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/vertical_gearbox_from_conversion.json similarity index 79% rename from src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/vertical_gearboxfrom_conversion.json rename to src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/vertical_gearbox_from_conversion.json index d83456a830..4055ece96f 100644 --- a/src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/vertical_gearboxfrom_conversion.json +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/vertical_gearbox_from_conversion.json @@ -15,7 +15,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "create:crafting/kinetics/vertical_gearboxfrom_conversion" + "recipe": "create:crafting/kinetics/vertical_gearbox_from_conversion" }, "trigger": "minecraft:recipe_unlocked" } @@ -28,7 +28,7 @@ ], "rewards": { "recipes": [ - "create:crafting/kinetics/vertical_gearboxfrom_conversion" + "create:crafting/kinetics/vertical_gearbox_from_conversion" ] }, "sends_telemetry_event": false diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/white_sailfrom_conversion.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/white_sail_from_conversion.json similarity index 80% rename from src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/white_sailfrom_conversion.json rename to src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/white_sail_from_conversion.json index 6d896ea997..19c522ced9 100644 --- a/src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/white_sailfrom_conversion.json +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/white_sail_from_conversion.json @@ -15,7 +15,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "create:crafting/kinetics/white_sailfrom_conversion" + "recipe": "create:crafting/kinetics/white_sail_from_conversion" }, "trigger": "minecraft:recipe_unlocked" } @@ -28,7 +28,7 @@ ], "rewards": { "recipes": [ - "create:crafting/kinetics/white_sailfrom_conversion" + "create:crafting/kinetics/white_sail_from_conversion" ] }, "sends_telemetry_event": false diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/packager_from_conversion.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/packager_from_conversion.json new file mode 100644 index 0000000000..b95f744e22 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/packager_from_conversion.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "create:repackager" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/packager_from_conversion" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/packager_from_conversion" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/repackager_from_conversion.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/repackager_from_conversion.json new file mode 100644 index 0000000000..c7e40de1fc --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/repackager_from_conversion.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "create:packager" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/logistics/repackager_from_conversion" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/logistics/repackager_from_conversion" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/materials/rose_quartz_tilesfrom_conversion.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/materials/rose_quartz_tiles_from_conversion.json similarity index 79% rename from src/generated/resources/data/create/advancements/recipes/misc/crafting/materials/rose_quartz_tilesfrom_conversion.json rename to src/generated/resources/data/create/advancements/recipes/misc/crafting/materials/rose_quartz_tiles_from_conversion.json index a5e61d9c7c..512be36112 100644 --- a/src/generated/resources/data/create/advancements/recipes/misc/crafting/materials/rose_quartz_tilesfrom_conversion.json +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/materials/rose_quartz_tiles_from_conversion.json @@ -15,7 +15,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "create:crafting/materials/rose_quartz_tilesfrom_conversion" + "recipe": "create:crafting/materials/rose_quartz_tiles_from_conversion" }, "trigger": "minecraft:recipe_unlocked" } @@ -28,7 +28,7 @@ ], "rewards": { "recipes": [ - "create:crafting/materials/rose_quartz_tilesfrom_conversion" + "create:crafting/materials/rose_quartz_tiles_from_conversion" ] }, "sends_telemetry_event": false diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/materials/small_rose_quartz_tilesfrom_conversion.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/materials/small_rose_quartz_tiles_from_conversion.json similarity index 86% rename from src/generated/resources/data/create/advancements/recipes/misc/crafting/materials/small_rose_quartz_tilesfrom_conversion.json rename to src/generated/resources/data/create/advancements/recipes/misc/crafting/materials/small_rose_quartz_tiles_from_conversion.json index aa32e8b300..0851dea3d6 100644 --- a/src/generated/resources/data/create/advancements/recipes/misc/crafting/materials/small_rose_quartz_tilesfrom_conversion.json +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/materials/small_rose_quartz_tiles_from_conversion.json @@ -15,7 +15,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "create:crafting/materials/small_rose_quartz_tilesfrom_conversion" + "recipe": "create:crafting/materials/small_rose_quartz_tiles_from_conversion" }, "trigger": "minecraft:recipe_unlocked" } @@ -28,7 +28,7 @@ ], "rewards": { "recipes": [ - "create:crafting/materials/small_rose_quartz_tilesfrom_conversion" + "create:crafting/materials/small_rose_quartz_tiles_from_conversion" ] }, "sends_telemetry_event": false diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/gearboxfrom_conversion.json b/src/generated/resources/data/create/recipes/crafting/kinetics/gearbox_from_conversion.json similarity index 100% rename from src/generated/resources/data/create/recipes/crafting/kinetics/gearboxfrom_conversion.json rename to src/generated/resources/data/create/recipes/crafting/kinetics/gearbox_from_conversion.json diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/linear_chassisfrom_conversion.json b/src/generated/resources/data/create/recipes/crafting/kinetics/linear_chassis_from_conversion.json similarity index 100% rename from src/generated/resources/data/create/recipes/crafting/kinetics/linear_chassisfrom_conversion.json rename to src/generated/resources/data/create/recipes/crafting/kinetics/linear_chassis_from_conversion.json diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/sail_framefrom_conversion.json b/src/generated/resources/data/create/recipes/crafting/kinetics/sail_frame_from_conversion.json similarity index 100% rename from src/generated/resources/data/create/recipes/crafting/kinetics/sail_framefrom_conversion.json rename to src/generated/resources/data/create/recipes/crafting/kinetics/sail_frame_from_conversion.json diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/secondary_linear_chassisfrom_conversion.json b/src/generated/resources/data/create/recipes/crafting/kinetics/secondary_linear_chassis_from_conversion.json similarity index 100% rename from src/generated/resources/data/create/recipes/crafting/kinetics/secondary_linear_chassisfrom_conversion.json rename to src/generated/resources/data/create/recipes/crafting/kinetics/secondary_linear_chassis_from_conversion.json diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/speedometerfrom_conversion.json b/src/generated/resources/data/create/recipes/crafting/kinetics/speedometer_from_conversion.json similarity index 100% rename from src/generated/resources/data/create/recipes/crafting/kinetics/speedometerfrom_conversion.json rename to src/generated/resources/data/create/recipes/crafting/kinetics/speedometer_from_conversion.json diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/stressometerfrom_conversion.json b/src/generated/resources/data/create/recipes/crafting/kinetics/stressometer_from_conversion.json similarity index 100% rename from src/generated/resources/data/create/recipes/crafting/kinetics/stressometerfrom_conversion.json rename to src/generated/resources/data/create/recipes/crafting/kinetics/stressometer_from_conversion.json diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/vertical_gearboxfrom_conversion.json b/src/generated/resources/data/create/recipes/crafting/kinetics/vertical_gearbox_from_conversion.json similarity index 100% rename from src/generated/resources/data/create/recipes/crafting/kinetics/vertical_gearboxfrom_conversion.json rename to src/generated/resources/data/create/recipes/crafting/kinetics/vertical_gearbox_from_conversion.json diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/white_sailfrom_conversion.json b/src/generated/resources/data/create/recipes/crafting/kinetics/white_sail_from_conversion.json similarity index 100% rename from src/generated/resources/data/create/recipes/crafting/kinetics/white_sailfrom_conversion.json rename to src/generated/resources/data/create/recipes/crafting/kinetics/white_sail_from_conversion.json diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/packager_from_conversion.json b/src/generated/resources/data/create/recipes/crafting/logistics/packager_from_conversion.json new file mode 100644 index 0000000000..2d68d2e8f8 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/packager_from_conversion.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "create:repackager" + } + ], + "result": { + "item": "create:packager" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/repackager_from_conversion.json b/src/generated/resources/data/create/recipes/crafting/logistics/repackager_from_conversion.json new file mode 100644 index 0000000000..32d8ce6133 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/logistics/repackager_from_conversion.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "create:packager" + } + ], + "result": { + "item": "create:repackager" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/materials/rose_quartz_tilesfrom_conversion.json b/src/generated/resources/data/create/recipes/crafting/materials/rose_quartz_tiles_from_conversion.json similarity index 100% rename from src/generated/resources/data/create/recipes/crafting/materials/rose_quartz_tilesfrom_conversion.json rename to src/generated/resources/data/create/recipes/crafting/materials/rose_quartz_tiles_from_conversion.json diff --git a/src/generated/resources/data/create/recipes/crafting/materials/small_rose_quartz_tilesfrom_conversion.json b/src/generated/resources/data/create/recipes/crafting/materials/small_rose_quartz_tiles_from_conversion.json similarity index 100% rename from src/generated/resources/data/create/recipes/crafting/materials/small_rose_quartz_tilesfrom_conversion.json rename to src/generated/resources/data/create/recipes/crafting/materials/small_rose_quartz_tiles_from_conversion.json diff --git a/src/main/java/com/simibubi/create/content/logistics/itemHatch/ItemHatchBlock.java b/src/main/java/com/simibubi/create/content/logistics/itemHatch/ItemHatchBlock.java index a5f3226075..8899a879f3 100644 --- a/src/main/java/com/simibubi/create/content/logistics/itemHatch/ItemHatchBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/itemHatch/ItemHatchBlock.java @@ -11,6 +11,7 @@ import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.foundation.block.IBE; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import com.simibubi.create.foundation.blockEntity.behaviour.filtering.FilteringBehaviour; +import com.simibubi.create.foundation.utility.CreateLang; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; @@ -30,6 +31,7 @@ import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition.Builder; import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.pathfinder.PathComputationType; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; @@ -90,13 +92,12 @@ public class ItemHatchBlock extends HorizontalDirectionalBlock implements IBE failedInsertions = new ArrayList<>(); boolean anyInserted = false; - boolean itemInHand = !pPlayer.getMainHandItem() - .isEmpty(); + boolean depositItemInHand = !pPlayer.isShiftKeyDown(); for (int i = 0; i < inventory.items.size(); i++) { - if (Inventory.isHotbarSlot(i) != itemInHand) + if (Inventory.isHotbarSlot(i) != depositItemInHand) continue; - if (itemInHand && i != inventory.selected) + if (depositItemInHand && i != inventory.selected) continue; ItemStack item = inventory.getItem(i); if (item.isEmpty()) @@ -129,6 +130,10 @@ public class ItemHatchBlock extends HorizontalDirectionalBlock implements IBE openTracker; - private LazyOptional itemHandler; + protected LazyOptional itemHandler; public PackagePortBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportBlock.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportBlock.java index 71618eebc0..e3268f01e1 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportBlock.java @@ -22,6 +22,7 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.PushReaction; +import net.minecraft.world.level.pathfinder.PathComputationType; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.CollisionContext; @@ -79,5 +80,10 @@ public class FrogportBlock extends Block implements IBE, IW public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pMovedByPiston) { IBE.onRemove(pState, pLevel, pPos, pNewState); } + + @Override + public boolean isPathfindable(BlockState state, BlockGetter reader, BlockPos pos, PathComputationType type) { + return false; + } } diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportBlockEntity.java index f0e71af69d..f378330bdf 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportBlockEntity.java @@ -1,13 +1,18 @@ package com.simibubi.create.content.logistics.packagePort.frogport; +import java.util.List; + import com.simibubi.create.AllBlocks; +import com.simibubi.create.content.equipment.goggles.IHaveHoveringInformation; import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.content.logistics.box.PackageStyles; import com.simibubi.create.content.logistics.packagePort.PackagePortBlockEntity; import com.simibubi.create.content.logistics.packager.PackagerItemHandler; import com.simibubi.create.foundation.item.ItemHelper; +import com.simibubi.create.foundation.item.TooltipHelper; import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.utility.NBTHelper; import net.createmod.catnip.utility.animation.LerpedFloat; import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; import net.minecraft.core.BlockPos; @@ -15,6 +20,7 @@ import net.minecraft.core.Direction; import net.minecraft.core.particles.BlockParticleOption; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; import net.minecraft.util.Mth; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntity; @@ -26,7 +32,7 @@ import net.minecraftforge.common.capabilities.ForgeCapabilities; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.ItemHandlerHelper; -public class FrogportBlockEntity extends PackagePortBlockEntity { +public class FrogportBlockEntity extends PackagePortBlockEntity implements IHaveHoveringInformation { public ItemStack animatedPackage; public LerpedFloat manualOpenAnimationProgress; @@ -38,6 +44,8 @@ public class FrogportBlockEntity extends PackagePortBlockEntity { public float passiveYaw; + private boolean failedLastExport; + public FrogportBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); animationProgress = LerpedFloat.linear(); @@ -65,8 +73,13 @@ public class FrogportBlockEntity extends PackagePortBlockEntity { super.lazyTick(); if (level.isClientSide() || isAnimationInProgress()) return; + + boolean prevFail = failedLastExport; tryPushingToAdjacentInventories(); tryPullingFromOwnAndAdjacentInventories(); + + if (failedLastExport != prevFail) + sendData(); } public void sendAnticipate() { @@ -165,28 +178,33 @@ public class FrogportBlockEntity extends PackagePortBlockEntity { } protected void tryPushingToAdjacentInventories() { - if (inventory.isEmpty()) + failedLastExport = false; + IItemHandler inventory = itemHandler.orElse(null); + + if (inventory == null) return; - for (Direction side : Iterate.directions) { - if (side != Direction.DOWN) + + boolean empty = true; + for (int i = 0; i < inventory.getSlots(); i++) + if (!inventory.getStackInSlot(i) + .isEmpty()) + empty = false; + if (empty) + return; + IItemHandler handler = getAdjacentInventory(Direction.DOWN); + if (handler == null) + return; + + for (int i = 0; i < inventory.getSlots(); i++) { + ItemStack stackInSlot = inventory.extractItem(i, 1, true); + if (stackInSlot.isEmpty()) continue; - IItemHandler handler = getAdjacentInventory(side); - if (handler == null) - continue; - boolean anyLeft = false; - for (int i = 0; i < inventory.getSlots(); i++) { - ItemStack stackInSlot = inventory.getStackInSlot(i); - if (stackInSlot.isEmpty()) - continue; - ItemStack remainder = ItemHandlerHelper.insertItemStacked(handler, stackInSlot, false); - if (remainder.isEmpty()) { - inventory.setStackInSlot(i, ItemStack.EMPTY); - level.blockEntityChanged(worldPosition); - } else - anyLeft = true; - } - if (!anyLeft) - break; + ItemStack remainder = ItemHandlerHelper.insertItemStacked(handler, stackInSlot, false); + if (remainder.isEmpty()) { + inventory.extractItem(i, 1, false); + level.blockEntityChanged(worldPosition); + } else + failedLastExport = true; } } @@ -246,12 +264,15 @@ public class FrogportBlockEntity extends PackagePortBlockEntity { sendAnticipate = false; tag.putBoolean("Anticipate", true); } + if (failedLastExport) + NBTHelper.putMarker(tag, "FailedLastExport"); } @Override protected void read(CompoundTag tag, boolean clientPacket) { super.read(tag, clientPacket); passiveYaw = tag.getFloat("PlacedYaw"); + failedLastExport = tag.getBoolean("FailedLastExport"); if (!clientPacket) animatedPackage = null; if (tag.contains("AnimatedPackage")) @@ -268,4 +289,13 @@ public class FrogportBlockEntity extends PackagePortBlockEntity { return (float) (Mth.atan2(diff.x, diff.z) * Mth.RAD_TO_DEG) + 180; } + @Override + public boolean addToTooltip(List tooltip, boolean isPlayerSneaking) { + boolean superTip = IHaveHoveringInformation.super.addToTooltip(tooltip, isPlayerSneaking); + if (!failedLastExport) + return superTip; + TooltipHelper.addHint(tooltip, "hint.blocked_frogport"); + return true; + } + } diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/postbox/PostboxBlock.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/postbox/PostboxBlock.java index 24820e3066..95e6d44916 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/postbox/PostboxBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/postbox/PostboxBlock.java @@ -21,6 +21,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition.Builder; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.pathfinder.PathComputationType; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; @@ -73,5 +74,10 @@ public class PostboxBlock extends HorizontalDirectionalBlock implements IBE getBlockEntityType() { return AllBlockEntityTypes.PACKAGE_POSTBOX.get(); } + + @Override + public boolean isPathfindable(BlockState state, BlockGetter reader, BlockPos pos, PathComputationType type) { + return false; + } } diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java index d1203dec95..52e01baa06 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java @@ -15,6 +15,7 @@ import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.SignalGetter; @@ -25,6 +26,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition.Builder; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.pathfinder.PathComputationType; import net.minecraft.world.phys.BlockHitResult; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.ForgeCapabilities; @@ -158,5 +160,10 @@ public class PackagerBlock extends WrenchableDirectionalBlock implements IBE getBlockEntityType() { return AllBlockEntityTypes.PACKAGER.get(); } + + @Override + public boolean isPathfindable(BlockState pState, BlockGetter pLevel, BlockPos pPos, PathComputationType pType) { + return false; + } } diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlock.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlock.java index 0a96b4dd21..6120054104 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlock.java @@ -24,6 +24,7 @@ import net.minecraft.world.level.block.HorizontalDirectionalBlock; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition.Builder; +import net.minecraft.world.level.pathfinder.PathComputationType; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; @@ -102,5 +103,10 @@ public class StockTickerBlock extends HorizontalDirectionalBlock implements IBE< public BlockEntityType getBlockEntityType() { return AllBlockEntityTypes.STOCK_TICKER.get(); } + + @Override + public boolean isPathfindable(BlockState pState, BlockGetter pLevel, BlockPos pPos, PathComputationType pType) { + return false; + } } diff --git a/src/main/java/com/simibubi/create/content/redstone/deskBell/DeskBellBlock.java b/src/main/java/com/simibubi/create/content/redstone/deskBell/DeskBellBlock.java index e687a5a28f..71e3fed2cd 100644 --- a/src/main/java/com/simibubi/create/content/redstone/deskBell/DeskBellBlock.java +++ b/src/main/java/com/simibubi/create/content/redstone/deskBell/DeskBellBlock.java @@ -25,6 +25,7 @@ import net.minecraft.world.level.block.state.StateDefinition.Builder; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.block.state.properties.BooleanProperty; import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.pathfinder.PathComputationType; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; @@ -132,5 +133,10 @@ public class DeskBellBlock extends WrenchableDirectionalBlock public BlockEntityType getBlockEntityType() { return AllBlockEntityTypes.DESK_BELL.get(); } + + @Override + public boolean isPathfindable(BlockState pState, BlockGetter pLevel, BlockPos pPos, PathComputationType pType) { + return false; + } } diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java index 9b9ec4ab63..4539a713be 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java @@ -1053,6 +1053,8 @@ public class StandardRecipeGen extends CreateRecipeProvider { .pattern("CAC") .pattern(" C ")), + PACKAGER_CYCLE = conversionCycle(ImmutableList.of(AllBlocks.PACKAGER, AllBlocks.REPACKAGER)), + PACKAGE_FROGPORT = create(AllBlocks.PACKAGE_FROGPORT).unlockedBy(I::cardboard) .viaShaped(b -> b.define('C', I.andesiteAlloy()) .define('B', Tags.Items.SLIMEBALLS) @@ -1441,7 +1443,7 @@ public class StandardRecipeGen extends CreateRecipeProvider { for (int i = 0; i < cycle.size(); i++) { ItemProviderEntry currentEntry = cycle.get(i); ItemProviderEntry nextEntry = cycle.get((i + 1) % cycle.size()); - result = create(nextEntry).withSuffix("from_conversion") + result = create(nextEntry).withSuffix("_from_conversion") .unlockedBy(currentEntry::get) .viaShapeless(b -> b.requires(currentEntry.get())); } diff --git a/src/main/resources/assets/create/lang/default/interface.json b/src/main/resources/assets/create/lang/default/interface.json index 75626a75f5..21ad2c81a1 100644 --- a/src/main/resources/assets/create/lang/default/interface.json +++ b/src/main/resources/assets/create/lang/default/interface.json @@ -710,6 +710,8 @@ "create.hint.empty_bearing": "_Right-click_ the bearing with an _empty_ _hand_ to _attach_ the structure you just built in front of it.", "create.hint.full_deployer.title": "Deployer cannot activate", "create.hint.full_deployer": "It appears this _Deployer_ contains _excess_ _items_ that need to be _extracted._ Use a _hopper,_ _funnel_ or other means to free it from its overflow.", + "create.hint.blocked_frogport.title": "Contains Packages", + "create.hint.blocked_frogport": "A _Package_ caught by this _Frogport_ could not be transferred to the _inventory_ _below._ Could it be full?", "create.backtank.low": "Backtank pressure low", "create.backtank.depleted": "Backtank pressure depleted", @@ -717,6 +719,9 @@ "create.hint.derailed_train.title": "Derailed Train", "create.hint.derailed_train": "It appears this _Train_ is no longer sitting on a connected track piece. _Right-Click_ using a _wrench_ in order to relocate it to a nearby track.", + "create.item_hatch.deposit_item": "Held item deposited", + "create.item_hatch.deposit_inventory": "Inventory items deposited", + "create.boiler.status": "Boiler Status: %1$s", "create.boiler.status_short": "Boiler: %1$s", "create.boiler.passive": "Passive", From d2053278f63bce8672574c7c1c89c92c266d0035 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Fri, 13 Dec 2024 17:23:02 -0500 Subject: [PATCH 187/515] Spouted refactors - Cleanup BlockSpoutingBehaviour --- src/main/java/com/simibubi/create/Create.java | 3 +- .../api/behaviour/BlockSpoutingBehaviour.java | 47 ++++++++----------- .../compat/tconstruct/SpoutCasting.java | 4 +- .../fluids/spout/SpoutBlockEntity.java | 8 ++-- .../behaviour/BlockSpoutingBehaviourImpl.java | 25 ++++++++++ 5 files changed, 53 insertions(+), 34 deletions(-) create mode 100644 src/main/java/com/simibubi/create/impl/behaviour/BlockSpoutingBehaviourImpl.java diff --git a/src/main/java/com/simibubi/create/Create.java b/src/main/java/com/simibubi/create/Create.java index 372711189a..2324f7ebdc 100644 --- a/src/main/java/com/simibubi/create/Create.java +++ b/src/main/java/com/simibubi/create/Create.java @@ -130,6 +130,8 @@ public class Create { AllConfigs.register(modLoadingContext); + BlockSpoutingBehaviour.registerDefaults(); + // FIXME: some of these registrations are not thread-safe AllMovementBehaviours.registerDefaults(); AllInteractionBehaviours.registerDefaults(); @@ -138,7 +140,6 @@ public class Create { ContraptionMovementSetting.registerDefaults(); AllArmInteractionPointTypes.register(); AllFanProcessingTypes.register(); - BlockSpoutingBehaviour.registerDefaults(); BogeySizes.init(); AllBogeyStyles.init(); // ---- diff --git a/src/main/java/com/simibubi/create/api/behaviour/BlockSpoutingBehaviour.java b/src/main/java/com/simibubi/create/api/behaviour/BlockSpoutingBehaviour.java index 9bdcf69d49..f3590e4b0b 100644 --- a/src/main/java/com/simibubi/create/api/behaviour/BlockSpoutingBehaviour.java +++ b/src/main/java/com/simibubi/create/api/behaviour/BlockSpoutingBehaviour.java @@ -1,12 +1,9 @@ package com.simibubi.create.api.behaviour; -import java.util.HashMap; -import java.util.Map; -import java.util.function.Consumer; - import com.simibubi.create.Create; import com.simibubi.create.compat.tconstruct.SpoutCasting; import com.simibubi.create.content.fluids.spout.SpoutBlockEntity; +import com.simibubi.create.impl.behaviour.BlockSpoutingBehaviourImpl; import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceLocation; @@ -14,17 +11,18 @@ import net.minecraft.world.level.Level; import net.minecraftforge.fluids.FluidStack; public abstract class BlockSpoutingBehaviour { - - private static final Map BLOCK_SPOUTING_BEHAVIOURS = new HashMap<>(); - - public static void addCustomSpoutInteraction(ResourceLocation resourceLocation, - BlockSpoutingBehaviour movementBehaviour) { - BLOCK_SPOUTING_BEHAVIOURS.put(resourceLocation, movementBehaviour); + /** + * Register a new custom spout interaction + * + * @param resourceLocation The interaction id + * @param spoutingBehaviour An instance of your behaviour class + */ + public static void addCustomSpoutInteraction(ResourceLocation resourceLocation, BlockSpoutingBehaviour spoutingBehaviour) { + BlockSpoutingBehaviourImpl.addCustomSpoutInteraction(resourceLocation, spoutingBehaviour); } - public static void forEach(Consumer accept) { - BLOCK_SPOUTING_BEHAVIOURS.values() - .forEach(accept); + public static void registerDefaults() { + addCustomSpoutInteraction(Create.asResource("ticon_casting"), new SpoutCasting()); } /** @@ -33,21 +31,16 @@ public abstract class BlockSpoutingBehaviour { *
* During this animation cycle, fillBlock is called once again with simulate == false but only on the relevant SpoutingBehaviour
* When fillBlock returns > 0 once again, the Spout will drain its content by the returned amount of units
- * Perform any other side-effects in this method
+ * Perform any other side effects in this method
* This method is called server-side only (except in ponder)
- * - * @param world - * @param pos of the affected block - * @param spout - * @param availableFluid do not modify, return the amount to be subtracted instead - * @param simulate whether the spout is testing or actually performing this behaviour - * @return amount filled into the block, 0 to idle/cancel + * + * @param level The current level + * @param pos The position of the affected block + * @param spout The spout block entity that is calling this + * @param availableFluid A copy of the fluidStack that is available, modifying this will do nothing, return the amount to be subtracted instead + * @param simulate Whether the spout is testing or actually performing this behaviour + * @return The amount filled into the block, 0 to idle/cancel */ - public abstract int fillBlock(Level world, BlockPos pos, SpoutBlockEntity spout, FluidStack availableFluid, - boolean simulate); - - public static void registerDefaults() { - addCustomSpoutInteraction(Create.asResource("ticon_casting"), new SpoutCasting()); - } + public abstract int fillBlock(Level level, BlockPos pos, SpoutBlockEntity spout, FluidStack availableFluid, boolean simulate); } diff --git a/src/main/java/com/simibubi/create/compat/tconstruct/SpoutCasting.java b/src/main/java/com/simibubi/create/compat/tconstruct/SpoutCasting.java index 4a35b2b037..18df35cd14 100644 --- a/src/main/java/com/simibubi/create/compat/tconstruct/SpoutCasting.java +++ b/src/main/java/com/simibubi/create/compat/tconstruct/SpoutCasting.java @@ -18,7 +18,7 @@ import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction; public class SpoutCasting extends BlockSpoutingBehaviour { - static Boolean TICON_PRESENT = null; + private static final boolean TICON_PRESENT = Mods.TCONSTRUCT.isLoaded(); ResourceLocation TABLE = new ResourceLocation("tconstruct", "table"); ResourceLocation BASIN = new ResourceLocation("tconstruct", "basin"); @@ -61,8 +61,6 @@ public class SpoutCasting extends BlockSpoutingBehaviour { } private boolean enabled() { - if (TICON_PRESENT == null) - TICON_PRESENT = Mods.TCONSTRUCT.isLoaded(); if (!TICON_PRESENT) return false; return AllConfigs.server().recipes.allowCastingBySpout.get(); diff --git a/src/main/java/com/simibubi/create/content/fluids/spout/SpoutBlockEntity.java b/src/main/java/com/simibubi/create/content/fluids/spout/SpoutBlockEntity.java index e47c747b27..ea509d7843 100644 --- a/src/main/java/com/simibubi/create/content/fluids/spout/SpoutBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/fluids/spout/SpoutBlockEntity.java @@ -23,6 +23,8 @@ import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour import com.simibubi.create.foundation.blockEntity.behaviour.fluid.SmartFluidTankBehaviour; import com.simibubi.create.foundation.fluid.FluidHelper; +import com.simibubi.create.impl.behaviour.BlockSpoutingBehaviourImpl; + import net.createmod.catnip.utility.NBTHelper; import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; @@ -197,10 +199,10 @@ public class SpoutBlockEntity extends SmartBlockEntity implements IHaveGoggleInf FluidStack currentFluidInTank = getCurrentFluidInTank(); if (processingTicks == -1 && (isVirtual() || !level.isClientSide()) && !currentFluidInTank.isEmpty()) { - BlockSpoutingBehaviour.forEach(behaviour -> { + BlockSpoutingBehaviourImpl.forEach(behaviour -> { if (customProcess != null) return; - if (behaviour.fillBlock(level, worldPosition.below(2), this, currentFluidInTank, true) > 0) { + if (behaviour.fillBlock(level, worldPosition.below(2), this, currentFluidInTank.copy(), true) > 0) { processingTicks = FILLING_TIME; customProcess = behaviour; notifyUpdate(); @@ -211,7 +213,7 @@ public class SpoutBlockEntity extends SmartBlockEntity implements IHaveGoggleInf if (processingTicks >= 0) { processingTicks--; if (processingTicks == 5 && customProcess != null) { - int fillBlock = customProcess.fillBlock(level, worldPosition.below(2), this, currentFluidInTank, false); + int fillBlock = customProcess.fillBlock(level, worldPosition.below(2), this, currentFluidInTank.copy(), false); customProcess = null; if (fillBlock > 0) { tank.getPrimaryHandler() diff --git a/src/main/java/com/simibubi/create/impl/behaviour/BlockSpoutingBehaviourImpl.java b/src/main/java/com/simibubi/create/impl/behaviour/BlockSpoutingBehaviourImpl.java new file mode 100644 index 0000000000..952a4d9b1d --- /dev/null +++ b/src/main/java/com/simibubi/create/impl/behaviour/BlockSpoutingBehaviourImpl.java @@ -0,0 +1,25 @@ +package com.simibubi.create.impl.behaviour; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Consumer; + +import org.jetbrains.annotations.ApiStatus; + +import com.simibubi.create.api.behaviour.BlockSpoutingBehaviour; + +import net.minecraft.resources.ResourceLocation; + +// TODO - Make this use AttachedRegistry later +@ApiStatus.Internal +public class BlockSpoutingBehaviourImpl { + private static final Map BLOCK_SPOUTING_BEHAVIOURS = new ConcurrentHashMap<>(); + + public static void addCustomSpoutInteraction(ResourceLocation resourceLocation, BlockSpoutingBehaviour spoutingBehaviour) { + BLOCK_SPOUTING_BEHAVIOURS.put(resourceLocation, spoutingBehaviour); + } + + public static void forEach(Consumer accept) { + BLOCK_SPOUTING_BEHAVIOURS.values().forEach(accept); + } +} From 1bd0117dd1f639212dd081ce9979fe8d4591f834 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Sat, 14 Dec 2024 10:24:12 +0100 Subject: [PATCH 188/515] Blockstate chores - Added waterlogging and comparator output where applicable --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 38 +++++----- .../create/blockstates/black_postbox.json | 46 +++++++++-- .../create/blockstates/blue_postbox.json | 46 +++++++++-- .../create/blockstates/brown_postbox.json | 46 +++++++++-- .../create/blockstates/cyan_postbox.json | 46 +++++++++-- .../create/blockstates/gray_postbox.json | 46 +++++++++-- .../create/blockstates/green_postbox.json | 46 +++++++++-- .../assets/create/blockstates/item_hatch.json | 46 +++++++++-- .../blockstates/light_blue_postbox.json | 46 +++++++++-- .../blockstates/light_gray_postbox.json | 46 +++++++++-- .../create/blockstates/lime_postbox.json | 46 +++++++++-- .../create/blockstates/magenta_postbox.json | 46 +++++++++-- .../create/blockstates/orange_postbox.json | 46 +++++++++-- .../create/blockstates/pink_postbox.json | 46 +++++++++-- .../create/blockstates/purple_postbox.json | 46 +++++++++-- .../create/blockstates/red_postbox.json | 46 +++++++++-- .../assets/create/blockstates/stock_link.json | 76 ++++++++++++++++--- .../create/blockstates/white_postbox.json | 46 +++++++++-- .../create/blockstates/yellow_postbox.json | 46 +++++++++-- .../logistics/itemHatch/ItemHatchBlock.java | 29 +++++-- .../packagePort/PackagePortBlockEntity.java | 5 ++ .../packagePort/frogport/FrogportBlock.java | 11 +++ .../packagePort/postbox/PostboxBlock.java | 38 ++++++++-- .../logistics/packager/PackagerBlock.java | 19 ++++- .../packager/PackagerBlockEntity.java | 4 +- .../packagerLink/PackagerLinkBlock.java | 25 +++++- 26 files changed, 844 insertions(+), 183 deletions(-) diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 54f772746b..201a66957b 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-12-13T16:26:00.0986028 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-12-14T09:57:52.522427 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -26,7 +26,7 @@ a97910c7516e7cedec9e34eca51f1183f1e3e681 assets/create/blockstates/belt.json 0ea03133af234921a3313f52521d8cfd02bf5d81 assets/create/blockstates/birch_window.json 2003c43151b731bf19cae58290c63bcb3785848a assets/create/blockstates/birch_window_pane.json c8b65faf51122eb411f5895e718869da9b260c2e assets/create/blockstates/black_nixie_tube.json -2449479f4d81a6d16bbd1a469daa2d8f9ba2782e assets/create/blockstates/black_postbox.json +fdc7dad3daa231e3d1906a1f0a84f254a31cf2c7 assets/create/blockstates/black_postbox.json 980ae9ba3f6d4e0faea8f3878985f9a9dadc0796 assets/create/blockstates/black_sail.json da3ad0225984a0dcbfb4ed800e307e45aff5aaa1 assets/create/blockstates/black_seat.json 1ea958c40f0cbf63c31d9b5422b6b86f9268e393 assets/create/blockstates/black_table_cloth.json @@ -34,7 +34,7 @@ da3ad0225984a0dcbfb4ed800e307e45aff5aaa1 assets/create/blockstates/black_seat.js 28f2fb355e80171403e540afd2aed44e9c19659a assets/create/blockstates/black_valve_handle.json 06ecd28cd97f4e8200dc396858695cad57b871c8 assets/create/blockstates/blaze_burner.json 37caf031254b5171a1fbfe9906f4bc65e8dbc909 assets/create/blockstates/blue_nixie_tube.json -eec6f598fc517c5f6b36d13f3928364b16f0ae3d assets/create/blockstates/blue_postbox.json +80cd0b998a2e21d6ca77419139c24a7ad97c2538 assets/create/blockstates/blue_postbox.json d540f0f23e0d7c03f8e147cf3eebbaf7caec9f93 assets/create/blockstates/blue_sail.json d2fdb432bb037de781260c789e905b223fab408c assets/create/blockstates/blue_seat.json 27241e0fd5a034c461f6920f94b852c6e825ce56 assets/create/blockstates/blue_table_cloth.json @@ -55,7 +55,7 @@ a408005aae4c1caa7aaae5a0ddf9d1ad73cd0254 assets/create/blockstates/brass_funnel. 61f5242e85c36ecf0f7963954236c60596ec9cbe assets/create/blockstates/brass_table_cloth.json 8ee948f9e87b82bb27aaecc522127fa1297b3d9d assets/create/blockstates/brass_tunnel.json debf33346bf410216f21082e1e8d07aa6250b84c assets/create/blockstates/brown_nixie_tube.json -ad42a677da8d381d6a8d909a602d73c1b9b3bbb7 assets/create/blockstates/brown_postbox.json +bc6719074acbec67e345005aeee352fd7bc54c09 assets/create/blockstates/brown_postbox.json 1334fc9e71d9f2a6117f448817263467a9c695de assets/create/blockstates/brown_sail.json 19524b2c0672632e63372f405a87dbea35f1d160 assets/create/blockstates/brown_seat.json 41a93cdd7ef066a844b750b657dce766df29d301 assets/create/blockstates/brown_table_cloth.json @@ -218,7 +218,7 @@ beb9e47f8d811c2146f68daf992fb805342a65cb assets/create/blockstates/cut_veridium. c11f09df4a23e951bdf9a345515183f4fac7cde3 assets/create/blockstates/cut_veridium_stairs.json 3aa6f5e613ff73952e3de00408051f92316e7f81 assets/create/blockstates/cut_veridium_wall.json bb627b2e78dba6833cf2d357033f253fc89aa1b8 assets/create/blockstates/cyan_nixie_tube.json -d7d497e5495cd7e8e74422f42caa27682fd06b2d assets/create/blockstates/cyan_postbox.json +21b830af3dc477c527885d6590e0a8419ffb4fa2 assets/create/blockstates/cyan_postbox.json f1061b8f9757374d6608fda07e301a2623e79f72 assets/create/blockstates/cyan_sail.json 538c6d95da5cc460e99c91647dac61726a91479f assets/create/blockstates/cyan_seat.json c2fc64da0466fe9daa63c18c35221736c1e091df assets/create/blockstates/cyan_table_cloth.json @@ -264,14 +264,14 @@ ff9f56912d8ac4069df90505232820f9c45f5e06 assets/create/blockstates/gantry_carria 5a193991f33a1af8659192f3693e4d8d3ed0082b assets/create/blockstates/glass_fluid_pipe.json e3f2a093c436cb65c5a7ac049a14cc4dadb22526 assets/create/blockstates/granite_pillar.json 921cf220c44a67195c90a30c4c296e65311738da assets/create/blockstates/gray_nixie_tube.json -f09f7a6f184992b21610e244310e22a99a01e247 assets/create/blockstates/gray_postbox.json +024b9e82cc5802e8a9ff22880f8098d07fd192e7 assets/create/blockstates/gray_postbox.json 30ba031a6b5a327d2a4caa12169676da573c2133 assets/create/blockstates/gray_sail.json f35a502c4a5e2703e7c6811b3d2ba16a9c47d4c8 assets/create/blockstates/gray_seat.json 612058f415131fb127280c24d5d089793c103a7a assets/create/blockstates/gray_table_cloth.json 87457e0eddae80225dbb3145f2d120296ea1bfcd assets/create/blockstates/gray_toolbox.json f18b87db39836eef20154b239d488eebb64b3455 assets/create/blockstates/gray_valve_handle.json 0f0fe2bf83f763e04cd2d7a979beb547feac3191 assets/create/blockstates/green_nixie_tube.json -67aefcca975866a40717725d34770acd8f8908f6 assets/create/blockstates/green_postbox.json +587c4f761858d888097c83f132c0a2d66ded3c56 assets/create/blockstates/green_postbox.json 0a2a5fbf2cf084e1be0426a224c291dc22a826fd assets/create/blockstates/green_sail.json b4aede1847d204ecdb7847559066d9d2ffb66903 assets/create/blockstates/green_seat.json 98587a931a565d4196f71ac4928846a7d55b3645 assets/create/blockstates/green_table_cloth.json @@ -287,7 +287,7 @@ bffc2169f5fc3a8e22f8952a90767e0bb8d726b5 assets/create/blockstates/horizontal_fr 3727801604445df291112fd9b99f99bbdcfa0f6d assets/create/blockstates/industrial_iron_window.json 877418ed76fdc589788db119663ca3e52e26a2aa assets/create/blockstates/industrial_iron_window_pane.json 2788ad2d29996076f7f18ab8d47e40c1ad10b348 assets/create/blockstates/item_drain.json -e840d746532f350ee2977c00036163f73c3f4147 assets/create/blockstates/item_hatch.json +3151ed4019d851ab2a7b07f1327bc4bfb6ed7227 assets/create/blockstates/item_hatch.json 3e99569e978c0fe17ec18b97881434a9da1a8421 assets/create/blockstates/item_vault.json 8680e9d2a94231f4bbad87b26ab2efdb714903d3 assets/create/blockstates/jungle_window.json ddcf1010e43c5d4a8c93aad37cc97a94343fd9f5 assets/create/blockstates/jungle_window_pane.json @@ -310,14 +310,14 @@ ca124508c59130d21f23d7b1ef354d78bdd24dd4 assets/create/blockstates/layered_tuff. 2ff5466f9ea3b1292c24a8ddb31666d74635c592 assets/create/blockstates/layered_veridium.json fcf02725651ab5973fab1cfc09fdd68cb4b93579 assets/create/blockstates/lectern_controller.json 5d7e1b08b1ec7c7c11b70db11df09311fcd7cf45 assets/create/blockstates/light_blue_nixie_tube.json -117eb12e69c9c978474104a749d1071e4980af76 assets/create/blockstates/light_blue_postbox.json +3a7ceaefb2f7a24eac6bb3676a8fee01290a535f assets/create/blockstates/light_blue_postbox.json f2354e8cb6086473ac97a5228b99706858dcad8a assets/create/blockstates/light_blue_sail.json 6b7045eaf9efe3a90f2d9a6785be6a5fd534b8e7 assets/create/blockstates/light_blue_seat.json ba0ae5046b643f82338e98ae56a48c01cf2d5972 assets/create/blockstates/light_blue_table_cloth.json b7065e7871c3c7f1a0656c2f92f82544e606f2fb assets/create/blockstates/light_blue_toolbox.json 549882a0f4de60906ca870a6197330f81d4e1afe assets/create/blockstates/light_blue_valve_handle.json fa5fb2be73c7c54b70e927b66adf3f4d64c5cb6b assets/create/blockstates/light_gray_nixie_tube.json -36817126602128d1c463047c9f54a671ed71e04c assets/create/blockstates/light_gray_postbox.json +9af388892d4ae6c4a91dc6021e4f15a504b82695 assets/create/blockstates/light_gray_postbox.json 3d95c9c4442d1bdd660bae382c72c68134db86dd assets/create/blockstates/light_gray_sail.json 8ec5144da4a49dd5b497af07b0d4b88c9c0b6cc0 assets/create/blockstates/light_gray_seat.json f1901887cd166296e465133c3b0d7ad0d664a614 assets/create/blockstates/light_gray_table_cloth.json @@ -326,7 +326,7 @@ f1901887cd166296e465133c3b0d7ad0d664a614 assets/create/blockstates/light_gray_ta a6f319c803c03e34bbf841ea52d82f0f7ec7a413 assets/create/blockstates/limestone.json 7ff65e1c4c8e48a0b694cd17506a192e6a7e6e44 assets/create/blockstates/limestone_pillar.json 7f20b548dd535942b2d6f41c39de7ad4fafe637e assets/create/blockstates/lime_nixie_tube.json -1478770b73bf498bd6fa35bd40a38027fd6fd4c8 assets/create/blockstates/lime_postbox.json +c6ac740bf37477ad170576983230b130ac01f355 assets/create/blockstates/lime_postbox.json ad1ec304729fd6d336c0d4d0c27c9345af636695 assets/create/blockstates/lime_sail.json b9934a558e1b495403dc2c71ffb43cce7d396013 assets/create/blockstates/lime_seat.json 7c5dc2ffd0bd44ba8785b6a788030714a009bcbc assets/create/blockstates/lime_table_cloth.json @@ -335,7 +335,7 @@ ba181485f219d3ae23509a7edf28e25d9edb10f4 assets/create/blockstates/lime_valve_ha 654e845cebed82b7afbcf81380921e0a475b01e9 assets/create/blockstates/linear_chassis.json e195e82e4d0c1fc20474535bc9068cbb77a5e175 assets/create/blockstates/lit_blaze_burner.json 296186b196af94e1ab3f7e8a3254f6d31ae47a5c assets/create/blockstates/magenta_nixie_tube.json -f14f13217b4eb7d897e1ed55c790186cc0cecaf5 assets/create/blockstates/magenta_postbox.json +725e695b70bc6aac379fae422c86bed92612e504 assets/create/blockstates/magenta_postbox.json f150922cbed1c05fb3892d4ac91eb471234252e2 assets/create/blockstates/magenta_sail.json bb1ab5c70647933400b3a99ef9d166ba5e3d4709 assets/create/blockstates/magenta_seat.json a09b8c51cfbb1c9c8a4f670a83cd81c376fe4ba3 assets/create/blockstates/magenta_table_cloth.json @@ -369,7 +369,7 @@ ba9c3ecfacbd398048440d247decffeaefc714b5 assets/create/blockstates/mysterious_cu 7f2c5728e24d60ed2f7a095e3a954d7ca4e410e9 assets/create/blockstates/oak_window_pane.json df91d0ca68934c1afd9858a8d1591dd4cb88df65 assets/create/blockstates/ochrum.json 09c9bee3d26edc4b87cb7a5042f125c439ee5956 assets/create/blockstates/ochrum_pillar.json -8ff85f8171ff60ebf95f574d6c9f275ae6e98ee0 assets/create/blockstates/orange_postbox.json +42f108813ed68f4492d0a168d52f31bbe2e5635b assets/create/blockstates/orange_postbox.json af4c2c4861d1410e1b7371a5bf3fe09ed3ab0077 assets/create/blockstates/orange_sail.json aab812cecf7d10d4e7587f4dead8a98238a15f41 assets/create/blockstates/orange_seat.json 27d90736a8d64fe7f742a6e5874b8d5843f5dd2d assets/create/blockstates/orange_table_cloth.json @@ -387,7 +387,7 @@ f32b0a23c1aed1c92684146e9746851091872519 assets/create/blockstates/packager.json 887565a0f89f089d6be888c87394dde4878afda7 assets/create/blockstates/package_frogport.json 36742cc6ce052ead143366d31b11e828a525c1b8 assets/create/blockstates/peculiar_bell.json 53d102e706d53cb2c0dbc0bc11da828084a43519 assets/create/blockstates/pink_nixie_tube.json -a238a92b88c32f513c405cde5bd1898d6fe930b7 assets/create/blockstates/pink_postbox.json +db7ef5acb1ce2d3b8f881f34b5d9f40633c3973d assets/create/blockstates/pink_postbox.json 213da5c04a33ae8ae7c0a4dec9844bbb6d670e33 assets/create/blockstates/pink_sail.json 8d5c80d5dc561240dfe8d7f212ffc33ac4e0fcd8 assets/create/blockstates/pink_seat.json 2698986d23ccd7b828af6150d04f0139255a5bf1 assets/create/blockstates/pink_table_cloth.json @@ -461,7 +461,7 @@ df7af1e49c53ae99ac3f0b2fca5d948b8ea91938 assets/create/blockstates/pulley_magnet 81281435b8d1eeb4f1e318c6d14d49fa1fd86820 assets/create/blockstates/pulse_repeater.json 65bfd8283749117663f7199204691758fd286e38 assets/create/blockstates/pulse_timer.json b658654aa97e8dd2c897f432a601835a3f8aca10 assets/create/blockstates/purple_nixie_tube.json -ee36eb7d8b7575f884a1d89c3ee1b4f3a5972a45 assets/create/blockstates/purple_postbox.json +6fa2954396474f97dab79955e4bd75346b04acc5 assets/create/blockstates/purple_postbox.json f8f9802df9c0b4e39edeefc3b1abb38255d79801 assets/create/blockstates/purple_sail.json 91b5ab66d7ec5235d278ee2bed6ddd88f39ce81d assets/create/blockstates/purple_seat.json a4b6bd4e55cd292abf752efeda93cf8d23162657 assets/create/blockstates/purple_table_cloth.json @@ -474,7 +474,7 @@ ec546afd3ec8036e4393b97d535f05a86f57dbc1 assets/create/blockstates/redstone_cont ff205f032b36486753dddb1f2029ef8d53e9c86f assets/create/blockstates/redstone_link.json 9ae6198e13b456ef18582364644071a18cf9324e assets/create/blockstates/redstone_requester.json e3fd62e466e3e6e7bd6fc8661f764ba972a466fc assets/create/blockstates/red_nixie_tube.json -e003cc60f957419c178d5b4ee215485ebeb3191f assets/create/blockstates/red_postbox.json +d14d6437a6727da13cea5f7eeb815720c80dde6f assets/create/blockstates/red_postbox.json 4c36b562da58ef2af57009da7cf2426059249228 assets/create/blockstates/red_sail.json 145f4e9ffaeff9be180e6c4e4989f2cf44cf0686 assets/create/blockstates/red_seat.json 90bf31515faa2e7e6d73414a6c5498911910710e assets/create/blockstates/red_table_cloth.json @@ -569,7 +569,7 @@ a60c9c8241e40c2e28f5760c0ca6e80cfe9d59f3 assets/create/blockstates/steam_whistle 8865500bcd2e4d467e74edb3509850fa92a5809f assets/create/blockstates/sticker.json bed0534e618105184bc877b104230403ca85bb58 assets/create/blockstates/sticky_mechanical_piston.json bab242ab794e6d439645c2d5a0242ae7c81942ff assets/create/blockstates/stockpile_switch.json -fef93db4bec71f83431800675f19f6c8ba749200 assets/create/blockstates/stock_link.json +9867b7abbab1c9e848df4bb8557c4b41604e71fc assets/create/blockstates/stock_link.json 9989bda294fbffc5f659d2e608e01dea424c7694 assets/create/blockstates/stock_ticker.json a70c025de5d85180f371ff05bbdc531d8bdfaab1 assets/create/blockstates/stressometer.json 8086f80c532fad42b37fcdc590b890ed7e8c3fe9 assets/create/blockstates/tiled_glass.json @@ -625,7 +625,7 @@ da110f382368257e15431c77164aef82e014e3f8 assets/create/blockstates/weathered_cop 1aed351050d73989c4553bf49ce03b3a8fdd210e assets/create/blockstates/weathered_iron_window_pane.json 25ce64b7af5d244f194da91ccf964a9bf5762327 assets/create/blockstates/weighted_ejector.json 2974b34a8cfb0d4e8e010f8bd085584ea631d541 assets/create/blockstates/white_nixie_tube.json -f128f18e0baa69c94ac9149960cfe810a6c9ecf9 assets/create/blockstates/white_postbox.json +3de81b9e34425a9d3a25c657dabd24d74bf01456 assets/create/blockstates/white_postbox.json f079469d186087d23f0d91b384040f777b0088b1 assets/create/blockstates/white_sail.json 317a6463db64b66d215d25b65ab52fe7f26ba9f8 assets/create/blockstates/white_seat.json 9013272715c2ed3104457a50a6f0795a7c33fc43 assets/create/blockstates/white_table_cloth.json @@ -634,7 +634,7 @@ c0bfe8416173868f9916c4a54dd9f983887c5bac assets/create/blockstates/white_valve_h ec2720e3f1bc84304d0c81cd23ff1e155b0c2f2c assets/create/blockstates/windmill_bearing.json d688e80dfbd5b17970814887c3698fc721981caa assets/create/blockstates/wooden_bracket.json 157942a838aa02909fb2238ad9ce77edc82f6142 assets/create/blockstates/yellow_nixie_tube.json -c11d93cd5a64e80c7ad2d11d88b656dd7705138b assets/create/blockstates/yellow_postbox.json +f3d0a1335e0d9cd592e177d51a36206749346676 assets/create/blockstates/yellow_postbox.json 68b6e267e93b96dbc0596ea4a1cd26636aa0e04a assets/create/blockstates/yellow_sail.json 4face2dd50a30bda0b21742319e701e666d51f8c assets/create/blockstates/yellow_seat.json 38135a1fda544b7b9624ebfa08d46351bd31ec89 assets/create/blockstates/yellow_table_cloth.json diff --git a/src/generated/resources/assets/create/blockstates/black_postbox.json b/src/generated/resources/assets/create/blockstates/black_postbox.json index f5654df01e..767cf098ed 100644 --- a/src/generated/resources/assets/create/blockstates/black_postbox.json +++ b/src/generated/resources/assets/create/blockstates/black_postbox.json @@ -1,32 +1,62 @@ { "variants": { - "facing=east,open=false": { + "facing=east,open=false,waterlogged=false": { "model": "create:block/black_postbox_closed", "y": 90 }, - "facing=east,open=true": { + "facing=east,open=false,waterlogged=true": { + "model": "create:block/black_postbox_closed", + "y": 90 + }, + "facing=east,open=true,waterlogged=false": { "model": "create:block/black_postbox_open", "y": 90 }, - "facing=north,open=false": { + "facing=east,open=true,waterlogged=true": { + "model": "create:block/black_postbox_open", + "y": 90 + }, + "facing=north,open=false,waterlogged=false": { "model": "create:block/black_postbox_closed" }, - "facing=north,open=true": { + "facing=north,open=false,waterlogged=true": { + "model": "create:block/black_postbox_closed" + }, + "facing=north,open=true,waterlogged=false": { "model": "create:block/black_postbox_open" }, - "facing=south,open=false": { + "facing=north,open=true,waterlogged=true": { + "model": "create:block/black_postbox_open" + }, + "facing=south,open=false,waterlogged=false": { "model": "create:block/black_postbox_closed", "y": 180 }, - "facing=south,open=true": { + "facing=south,open=false,waterlogged=true": { + "model": "create:block/black_postbox_closed", + "y": 180 + }, + "facing=south,open=true,waterlogged=false": { "model": "create:block/black_postbox_open", "y": 180 }, - "facing=west,open=false": { + "facing=south,open=true,waterlogged=true": { + "model": "create:block/black_postbox_open", + "y": 180 + }, + "facing=west,open=false,waterlogged=false": { "model": "create:block/black_postbox_closed", "y": 270 }, - "facing=west,open=true": { + "facing=west,open=false,waterlogged=true": { + "model": "create:block/black_postbox_closed", + "y": 270 + }, + "facing=west,open=true,waterlogged=false": { + "model": "create:block/black_postbox_open", + "y": 270 + }, + "facing=west,open=true,waterlogged=true": { "model": "create:block/black_postbox_open", "y": 270 } diff --git a/src/generated/resources/assets/create/blockstates/blue_postbox.json b/src/generated/resources/assets/create/blockstates/blue_postbox.json index ab1d61e9ed..2397fcbcea 100644 --- a/src/generated/resources/assets/create/blockstates/blue_postbox.json +++ b/src/generated/resources/assets/create/blockstates/blue_postbox.json @@ -1,32 +1,62 @@ { "variants": { - "facing=east,open=false": { + "facing=east,open=false,waterlogged=false": { "model": "create:block/blue_postbox_closed", "y": 90 }, - "facing=east,open=true": { + "facing=east,open=false,waterlogged=true": { + "model": "create:block/blue_postbox_closed", + "y": 90 + }, + "facing=east,open=true,waterlogged=false": { "model": "create:block/blue_postbox_open", "y": 90 }, - "facing=north,open=false": { + "facing=east,open=true,waterlogged=true": { + "model": "create:block/blue_postbox_open", + "y": 90 + }, + "facing=north,open=false,waterlogged=false": { "model": "create:block/blue_postbox_closed" }, - "facing=north,open=true": { + "facing=north,open=false,waterlogged=true": { + "model": "create:block/blue_postbox_closed" + }, + "facing=north,open=true,waterlogged=false": { "model": "create:block/blue_postbox_open" }, - "facing=south,open=false": { + "facing=north,open=true,waterlogged=true": { + "model": "create:block/blue_postbox_open" + }, + "facing=south,open=false,waterlogged=false": { "model": "create:block/blue_postbox_closed", "y": 180 }, - "facing=south,open=true": { + "facing=south,open=false,waterlogged=true": { + "model": "create:block/blue_postbox_closed", + "y": 180 + }, + "facing=south,open=true,waterlogged=false": { "model": "create:block/blue_postbox_open", "y": 180 }, - "facing=west,open=false": { + "facing=south,open=true,waterlogged=true": { + "model": "create:block/blue_postbox_open", + "y": 180 + }, + "facing=west,open=false,waterlogged=false": { "model": "create:block/blue_postbox_closed", "y": 270 }, - "facing=west,open=true": { + "facing=west,open=false,waterlogged=true": { + "model": "create:block/blue_postbox_closed", + "y": 270 + }, + "facing=west,open=true,waterlogged=false": { + "model": "create:block/blue_postbox_open", + "y": 270 + }, + "facing=west,open=true,waterlogged=true": { "model": "create:block/blue_postbox_open", "y": 270 } diff --git a/src/generated/resources/assets/create/blockstates/brown_postbox.json b/src/generated/resources/assets/create/blockstates/brown_postbox.json index 77f3075357..ae56daf98b 100644 --- a/src/generated/resources/assets/create/blockstates/brown_postbox.json +++ b/src/generated/resources/assets/create/blockstates/brown_postbox.json @@ -1,32 +1,62 @@ { "variants": { - "facing=east,open=false": { + "facing=east,open=false,waterlogged=false": { "model": "create:block/brown_postbox_closed", "y": 90 }, - "facing=east,open=true": { + "facing=east,open=false,waterlogged=true": { + "model": "create:block/brown_postbox_closed", + "y": 90 + }, + "facing=east,open=true,waterlogged=false": { "model": "create:block/brown_postbox_open", "y": 90 }, - "facing=north,open=false": { + "facing=east,open=true,waterlogged=true": { + "model": "create:block/brown_postbox_open", + "y": 90 + }, + "facing=north,open=false,waterlogged=false": { "model": "create:block/brown_postbox_closed" }, - "facing=north,open=true": { + "facing=north,open=false,waterlogged=true": { + "model": "create:block/brown_postbox_closed" + }, + "facing=north,open=true,waterlogged=false": { "model": "create:block/brown_postbox_open" }, - "facing=south,open=false": { + "facing=north,open=true,waterlogged=true": { + "model": "create:block/brown_postbox_open" + }, + "facing=south,open=false,waterlogged=false": { "model": "create:block/brown_postbox_closed", "y": 180 }, - "facing=south,open=true": { + "facing=south,open=false,waterlogged=true": { + "model": "create:block/brown_postbox_closed", + "y": 180 + }, + "facing=south,open=true,waterlogged=false": { "model": "create:block/brown_postbox_open", "y": 180 }, - "facing=west,open=false": { + "facing=south,open=true,waterlogged=true": { + "model": "create:block/brown_postbox_open", + "y": 180 + }, + "facing=west,open=false,waterlogged=false": { "model": "create:block/brown_postbox_closed", "y": 270 }, - "facing=west,open=true": { + "facing=west,open=false,waterlogged=true": { + "model": "create:block/brown_postbox_closed", + "y": 270 + }, + "facing=west,open=true,waterlogged=false": { + "model": "create:block/brown_postbox_open", + "y": 270 + }, + "facing=west,open=true,waterlogged=true": { "model": "create:block/brown_postbox_open", "y": 270 } diff --git a/src/generated/resources/assets/create/blockstates/cyan_postbox.json b/src/generated/resources/assets/create/blockstates/cyan_postbox.json index 0dab80b26c..cdd8d6cdbe 100644 --- a/src/generated/resources/assets/create/blockstates/cyan_postbox.json +++ b/src/generated/resources/assets/create/blockstates/cyan_postbox.json @@ -1,32 +1,62 @@ { "variants": { - "facing=east,open=false": { + "facing=east,open=false,waterlogged=false": { "model": "create:block/cyan_postbox_closed", "y": 90 }, - "facing=east,open=true": { + "facing=east,open=false,waterlogged=true": { + "model": "create:block/cyan_postbox_closed", + "y": 90 + }, + "facing=east,open=true,waterlogged=false": { "model": "create:block/cyan_postbox_open", "y": 90 }, - "facing=north,open=false": { + "facing=east,open=true,waterlogged=true": { + "model": "create:block/cyan_postbox_open", + "y": 90 + }, + "facing=north,open=false,waterlogged=false": { "model": "create:block/cyan_postbox_closed" }, - "facing=north,open=true": { + "facing=north,open=false,waterlogged=true": { + "model": "create:block/cyan_postbox_closed" + }, + "facing=north,open=true,waterlogged=false": { "model": "create:block/cyan_postbox_open" }, - "facing=south,open=false": { + "facing=north,open=true,waterlogged=true": { + "model": "create:block/cyan_postbox_open" + }, + "facing=south,open=false,waterlogged=false": { "model": "create:block/cyan_postbox_closed", "y": 180 }, - "facing=south,open=true": { + "facing=south,open=false,waterlogged=true": { + "model": "create:block/cyan_postbox_closed", + "y": 180 + }, + "facing=south,open=true,waterlogged=false": { "model": "create:block/cyan_postbox_open", "y": 180 }, - "facing=west,open=false": { + "facing=south,open=true,waterlogged=true": { + "model": "create:block/cyan_postbox_open", + "y": 180 + }, + "facing=west,open=false,waterlogged=false": { "model": "create:block/cyan_postbox_closed", "y": 270 }, - "facing=west,open=true": { + "facing=west,open=false,waterlogged=true": { + "model": "create:block/cyan_postbox_closed", + "y": 270 + }, + "facing=west,open=true,waterlogged=false": { + "model": "create:block/cyan_postbox_open", + "y": 270 + }, + "facing=west,open=true,waterlogged=true": { "model": "create:block/cyan_postbox_open", "y": 270 } diff --git a/src/generated/resources/assets/create/blockstates/gray_postbox.json b/src/generated/resources/assets/create/blockstates/gray_postbox.json index c4b241be33..57cccf10f3 100644 --- a/src/generated/resources/assets/create/blockstates/gray_postbox.json +++ b/src/generated/resources/assets/create/blockstates/gray_postbox.json @@ -1,32 +1,62 @@ { "variants": { - "facing=east,open=false": { + "facing=east,open=false,waterlogged=false": { "model": "create:block/gray_postbox_closed", "y": 90 }, - "facing=east,open=true": { + "facing=east,open=false,waterlogged=true": { + "model": "create:block/gray_postbox_closed", + "y": 90 + }, + "facing=east,open=true,waterlogged=false": { "model": "create:block/gray_postbox_open", "y": 90 }, - "facing=north,open=false": { + "facing=east,open=true,waterlogged=true": { + "model": "create:block/gray_postbox_open", + "y": 90 + }, + "facing=north,open=false,waterlogged=false": { "model": "create:block/gray_postbox_closed" }, - "facing=north,open=true": { + "facing=north,open=false,waterlogged=true": { + "model": "create:block/gray_postbox_closed" + }, + "facing=north,open=true,waterlogged=false": { "model": "create:block/gray_postbox_open" }, - "facing=south,open=false": { + "facing=north,open=true,waterlogged=true": { + "model": "create:block/gray_postbox_open" + }, + "facing=south,open=false,waterlogged=false": { "model": "create:block/gray_postbox_closed", "y": 180 }, - "facing=south,open=true": { + "facing=south,open=false,waterlogged=true": { + "model": "create:block/gray_postbox_closed", + "y": 180 + }, + "facing=south,open=true,waterlogged=false": { "model": "create:block/gray_postbox_open", "y": 180 }, - "facing=west,open=false": { + "facing=south,open=true,waterlogged=true": { + "model": "create:block/gray_postbox_open", + "y": 180 + }, + "facing=west,open=false,waterlogged=false": { "model": "create:block/gray_postbox_closed", "y": 270 }, - "facing=west,open=true": { + "facing=west,open=false,waterlogged=true": { + "model": "create:block/gray_postbox_closed", + "y": 270 + }, + "facing=west,open=true,waterlogged=false": { + "model": "create:block/gray_postbox_open", + "y": 270 + }, + "facing=west,open=true,waterlogged=true": { "model": "create:block/gray_postbox_open", "y": 270 } diff --git a/src/generated/resources/assets/create/blockstates/green_postbox.json b/src/generated/resources/assets/create/blockstates/green_postbox.json index 127f9c2e90..eca9b46cbe 100644 --- a/src/generated/resources/assets/create/blockstates/green_postbox.json +++ b/src/generated/resources/assets/create/blockstates/green_postbox.json @@ -1,32 +1,62 @@ { "variants": { - "facing=east,open=false": { + "facing=east,open=false,waterlogged=false": { "model": "create:block/green_postbox_closed", "y": 90 }, - "facing=east,open=true": { + "facing=east,open=false,waterlogged=true": { + "model": "create:block/green_postbox_closed", + "y": 90 + }, + "facing=east,open=true,waterlogged=false": { "model": "create:block/green_postbox_open", "y": 90 }, - "facing=north,open=false": { + "facing=east,open=true,waterlogged=true": { + "model": "create:block/green_postbox_open", + "y": 90 + }, + "facing=north,open=false,waterlogged=false": { "model": "create:block/green_postbox_closed" }, - "facing=north,open=true": { + "facing=north,open=false,waterlogged=true": { + "model": "create:block/green_postbox_closed" + }, + "facing=north,open=true,waterlogged=false": { "model": "create:block/green_postbox_open" }, - "facing=south,open=false": { + "facing=north,open=true,waterlogged=true": { + "model": "create:block/green_postbox_open" + }, + "facing=south,open=false,waterlogged=false": { "model": "create:block/green_postbox_closed", "y": 180 }, - "facing=south,open=true": { + "facing=south,open=false,waterlogged=true": { + "model": "create:block/green_postbox_closed", + "y": 180 + }, + "facing=south,open=true,waterlogged=false": { "model": "create:block/green_postbox_open", "y": 180 }, - "facing=west,open=false": { + "facing=south,open=true,waterlogged=true": { + "model": "create:block/green_postbox_open", + "y": 180 + }, + "facing=west,open=false,waterlogged=false": { "model": "create:block/green_postbox_closed", "y": 270 }, - "facing=west,open=true": { + "facing=west,open=false,waterlogged=true": { + "model": "create:block/green_postbox_closed", + "y": 270 + }, + "facing=west,open=true,waterlogged=false": { + "model": "create:block/green_postbox_open", + "y": 270 + }, + "facing=west,open=true,waterlogged=true": { "model": "create:block/green_postbox_open", "y": 270 } diff --git a/src/generated/resources/assets/create/blockstates/item_hatch.json b/src/generated/resources/assets/create/blockstates/item_hatch.json index 5c806a8a23..24bcd00bca 100644 --- a/src/generated/resources/assets/create/blockstates/item_hatch.json +++ b/src/generated/resources/assets/create/blockstates/item_hatch.json @@ -1,32 +1,62 @@ { "variants": { - "facing=east,open=false": { + "facing=east,open=false,waterlogged=false": { "model": "create:block/item_hatch/block_closed", "y": 90 }, - "facing=east,open=true": { + "facing=east,open=false,waterlogged=true": { + "model": "create:block/item_hatch/block_closed", + "y": 90 + }, + "facing=east,open=true,waterlogged=false": { "model": "create:block/item_hatch/block_open", "y": 90 }, - "facing=north,open=false": { + "facing=east,open=true,waterlogged=true": { + "model": "create:block/item_hatch/block_open", + "y": 90 + }, + "facing=north,open=false,waterlogged=false": { "model": "create:block/item_hatch/block_closed" }, - "facing=north,open=true": { + "facing=north,open=false,waterlogged=true": { + "model": "create:block/item_hatch/block_closed" + }, + "facing=north,open=true,waterlogged=false": { "model": "create:block/item_hatch/block_open" }, - "facing=south,open=false": { + "facing=north,open=true,waterlogged=true": { + "model": "create:block/item_hatch/block_open" + }, + "facing=south,open=false,waterlogged=false": { "model": "create:block/item_hatch/block_closed", "y": 180 }, - "facing=south,open=true": { + "facing=south,open=false,waterlogged=true": { + "model": "create:block/item_hatch/block_closed", + "y": 180 + }, + "facing=south,open=true,waterlogged=false": { "model": "create:block/item_hatch/block_open", "y": 180 }, - "facing=west,open=false": { + "facing=south,open=true,waterlogged=true": { + "model": "create:block/item_hatch/block_open", + "y": 180 + }, + "facing=west,open=false,waterlogged=false": { "model": "create:block/item_hatch/block_closed", "y": 270 }, - "facing=west,open=true": { + "facing=west,open=false,waterlogged=true": { + "model": "create:block/item_hatch/block_closed", + "y": 270 + }, + "facing=west,open=true,waterlogged=false": { + "model": "create:block/item_hatch/block_open", + "y": 270 + }, + "facing=west,open=true,waterlogged=true": { "model": "create:block/item_hatch/block_open", "y": 270 } diff --git a/src/generated/resources/assets/create/blockstates/light_blue_postbox.json b/src/generated/resources/assets/create/blockstates/light_blue_postbox.json index 1e42fef094..c173112b4a 100644 --- a/src/generated/resources/assets/create/blockstates/light_blue_postbox.json +++ b/src/generated/resources/assets/create/blockstates/light_blue_postbox.json @@ -1,32 +1,62 @@ { "variants": { - "facing=east,open=false": { + "facing=east,open=false,waterlogged=false": { "model": "create:block/light_blue_postbox_closed", "y": 90 }, - "facing=east,open=true": { + "facing=east,open=false,waterlogged=true": { + "model": "create:block/light_blue_postbox_closed", + "y": 90 + }, + "facing=east,open=true,waterlogged=false": { "model": "create:block/light_blue_postbox_open", "y": 90 }, - "facing=north,open=false": { + "facing=east,open=true,waterlogged=true": { + "model": "create:block/light_blue_postbox_open", + "y": 90 + }, + "facing=north,open=false,waterlogged=false": { "model": "create:block/light_blue_postbox_closed" }, - "facing=north,open=true": { + "facing=north,open=false,waterlogged=true": { + "model": "create:block/light_blue_postbox_closed" + }, + "facing=north,open=true,waterlogged=false": { "model": "create:block/light_blue_postbox_open" }, - "facing=south,open=false": { + "facing=north,open=true,waterlogged=true": { + "model": "create:block/light_blue_postbox_open" + }, + "facing=south,open=false,waterlogged=false": { "model": "create:block/light_blue_postbox_closed", "y": 180 }, - "facing=south,open=true": { + "facing=south,open=false,waterlogged=true": { + "model": "create:block/light_blue_postbox_closed", + "y": 180 + }, + "facing=south,open=true,waterlogged=false": { "model": "create:block/light_blue_postbox_open", "y": 180 }, - "facing=west,open=false": { + "facing=south,open=true,waterlogged=true": { + "model": "create:block/light_blue_postbox_open", + "y": 180 + }, + "facing=west,open=false,waterlogged=false": { "model": "create:block/light_blue_postbox_closed", "y": 270 }, - "facing=west,open=true": { + "facing=west,open=false,waterlogged=true": { + "model": "create:block/light_blue_postbox_closed", + "y": 270 + }, + "facing=west,open=true,waterlogged=false": { + "model": "create:block/light_blue_postbox_open", + "y": 270 + }, + "facing=west,open=true,waterlogged=true": { "model": "create:block/light_blue_postbox_open", "y": 270 } diff --git a/src/generated/resources/assets/create/blockstates/light_gray_postbox.json b/src/generated/resources/assets/create/blockstates/light_gray_postbox.json index 3561ff37c9..349cdb096d 100644 --- a/src/generated/resources/assets/create/blockstates/light_gray_postbox.json +++ b/src/generated/resources/assets/create/blockstates/light_gray_postbox.json @@ -1,32 +1,62 @@ { "variants": { - "facing=east,open=false": { + "facing=east,open=false,waterlogged=false": { "model": "create:block/light_gray_postbox_closed", "y": 90 }, - "facing=east,open=true": { + "facing=east,open=false,waterlogged=true": { + "model": "create:block/light_gray_postbox_closed", + "y": 90 + }, + "facing=east,open=true,waterlogged=false": { "model": "create:block/light_gray_postbox_open", "y": 90 }, - "facing=north,open=false": { + "facing=east,open=true,waterlogged=true": { + "model": "create:block/light_gray_postbox_open", + "y": 90 + }, + "facing=north,open=false,waterlogged=false": { "model": "create:block/light_gray_postbox_closed" }, - "facing=north,open=true": { + "facing=north,open=false,waterlogged=true": { + "model": "create:block/light_gray_postbox_closed" + }, + "facing=north,open=true,waterlogged=false": { "model": "create:block/light_gray_postbox_open" }, - "facing=south,open=false": { + "facing=north,open=true,waterlogged=true": { + "model": "create:block/light_gray_postbox_open" + }, + "facing=south,open=false,waterlogged=false": { "model": "create:block/light_gray_postbox_closed", "y": 180 }, - "facing=south,open=true": { + "facing=south,open=false,waterlogged=true": { + "model": "create:block/light_gray_postbox_closed", + "y": 180 + }, + "facing=south,open=true,waterlogged=false": { "model": "create:block/light_gray_postbox_open", "y": 180 }, - "facing=west,open=false": { + "facing=south,open=true,waterlogged=true": { + "model": "create:block/light_gray_postbox_open", + "y": 180 + }, + "facing=west,open=false,waterlogged=false": { "model": "create:block/light_gray_postbox_closed", "y": 270 }, - "facing=west,open=true": { + "facing=west,open=false,waterlogged=true": { + "model": "create:block/light_gray_postbox_closed", + "y": 270 + }, + "facing=west,open=true,waterlogged=false": { + "model": "create:block/light_gray_postbox_open", + "y": 270 + }, + "facing=west,open=true,waterlogged=true": { "model": "create:block/light_gray_postbox_open", "y": 270 } diff --git a/src/generated/resources/assets/create/blockstates/lime_postbox.json b/src/generated/resources/assets/create/blockstates/lime_postbox.json index b60e715c60..fa172a8a21 100644 --- a/src/generated/resources/assets/create/blockstates/lime_postbox.json +++ b/src/generated/resources/assets/create/blockstates/lime_postbox.json @@ -1,32 +1,62 @@ { "variants": { - "facing=east,open=false": { + "facing=east,open=false,waterlogged=false": { "model": "create:block/lime_postbox_closed", "y": 90 }, - "facing=east,open=true": { + "facing=east,open=false,waterlogged=true": { + "model": "create:block/lime_postbox_closed", + "y": 90 + }, + "facing=east,open=true,waterlogged=false": { "model": "create:block/lime_postbox_open", "y": 90 }, - "facing=north,open=false": { + "facing=east,open=true,waterlogged=true": { + "model": "create:block/lime_postbox_open", + "y": 90 + }, + "facing=north,open=false,waterlogged=false": { "model": "create:block/lime_postbox_closed" }, - "facing=north,open=true": { + "facing=north,open=false,waterlogged=true": { + "model": "create:block/lime_postbox_closed" + }, + "facing=north,open=true,waterlogged=false": { "model": "create:block/lime_postbox_open" }, - "facing=south,open=false": { + "facing=north,open=true,waterlogged=true": { + "model": "create:block/lime_postbox_open" + }, + "facing=south,open=false,waterlogged=false": { "model": "create:block/lime_postbox_closed", "y": 180 }, - "facing=south,open=true": { + "facing=south,open=false,waterlogged=true": { + "model": "create:block/lime_postbox_closed", + "y": 180 + }, + "facing=south,open=true,waterlogged=false": { "model": "create:block/lime_postbox_open", "y": 180 }, - "facing=west,open=false": { + "facing=south,open=true,waterlogged=true": { + "model": "create:block/lime_postbox_open", + "y": 180 + }, + "facing=west,open=false,waterlogged=false": { "model": "create:block/lime_postbox_closed", "y": 270 }, - "facing=west,open=true": { + "facing=west,open=false,waterlogged=true": { + "model": "create:block/lime_postbox_closed", + "y": 270 + }, + "facing=west,open=true,waterlogged=false": { + "model": "create:block/lime_postbox_open", + "y": 270 + }, + "facing=west,open=true,waterlogged=true": { "model": "create:block/lime_postbox_open", "y": 270 } diff --git a/src/generated/resources/assets/create/blockstates/magenta_postbox.json b/src/generated/resources/assets/create/blockstates/magenta_postbox.json index 13b16c5cec..cfcf86db84 100644 --- a/src/generated/resources/assets/create/blockstates/magenta_postbox.json +++ b/src/generated/resources/assets/create/blockstates/magenta_postbox.json @@ -1,32 +1,62 @@ { "variants": { - "facing=east,open=false": { + "facing=east,open=false,waterlogged=false": { "model": "create:block/magenta_postbox_closed", "y": 90 }, - "facing=east,open=true": { + "facing=east,open=false,waterlogged=true": { + "model": "create:block/magenta_postbox_closed", + "y": 90 + }, + "facing=east,open=true,waterlogged=false": { "model": "create:block/magenta_postbox_open", "y": 90 }, - "facing=north,open=false": { + "facing=east,open=true,waterlogged=true": { + "model": "create:block/magenta_postbox_open", + "y": 90 + }, + "facing=north,open=false,waterlogged=false": { "model": "create:block/magenta_postbox_closed" }, - "facing=north,open=true": { + "facing=north,open=false,waterlogged=true": { + "model": "create:block/magenta_postbox_closed" + }, + "facing=north,open=true,waterlogged=false": { "model": "create:block/magenta_postbox_open" }, - "facing=south,open=false": { + "facing=north,open=true,waterlogged=true": { + "model": "create:block/magenta_postbox_open" + }, + "facing=south,open=false,waterlogged=false": { "model": "create:block/magenta_postbox_closed", "y": 180 }, - "facing=south,open=true": { + "facing=south,open=false,waterlogged=true": { + "model": "create:block/magenta_postbox_closed", + "y": 180 + }, + "facing=south,open=true,waterlogged=false": { "model": "create:block/magenta_postbox_open", "y": 180 }, - "facing=west,open=false": { + "facing=south,open=true,waterlogged=true": { + "model": "create:block/magenta_postbox_open", + "y": 180 + }, + "facing=west,open=false,waterlogged=false": { "model": "create:block/magenta_postbox_closed", "y": 270 }, - "facing=west,open=true": { + "facing=west,open=false,waterlogged=true": { + "model": "create:block/magenta_postbox_closed", + "y": 270 + }, + "facing=west,open=true,waterlogged=false": { + "model": "create:block/magenta_postbox_open", + "y": 270 + }, + "facing=west,open=true,waterlogged=true": { "model": "create:block/magenta_postbox_open", "y": 270 } diff --git a/src/generated/resources/assets/create/blockstates/orange_postbox.json b/src/generated/resources/assets/create/blockstates/orange_postbox.json index fe6665e0dc..d55bdc68e5 100644 --- a/src/generated/resources/assets/create/blockstates/orange_postbox.json +++ b/src/generated/resources/assets/create/blockstates/orange_postbox.json @@ -1,32 +1,62 @@ { "variants": { - "facing=east,open=false": { + "facing=east,open=false,waterlogged=false": { "model": "create:block/orange_postbox_closed", "y": 90 }, - "facing=east,open=true": { + "facing=east,open=false,waterlogged=true": { + "model": "create:block/orange_postbox_closed", + "y": 90 + }, + "facing=east,open=true,waterlogged=false": { "model": "create:block/orange_postbox_open", "y": 90 }, - "facing=north,open=false": { + "facing=east,open=true,waterlogged=true": { + "model": "create:block/orange_postbox_open", + "y": 90 + }, + "facing=north,open=false,waterlogged=false": { "model": "create:block/orange_postbox_closed" }, - "facing=north,open=true": { + "facing=north,open=false,waterlogged=true": { + "model": "create:block/orange_postbox_closed" + }, + "facing=north,open=true,waterlogged=false": { "model": "create:block/orange_postbox_open" }, - "facing=south,open=false": { + "facing=north,open=true,waterlogged=true": { + "model": "create:block/orange_postbox_open" + }, + "facing=south,open=false,waterlogged=false": { "model": "create:block/orange_postbox_closed", "y": 180 }, - "facing=south,open=true": { + "facing=south,open=false,waterlogged=true": { + "model": "create:block/orange_postbox_closed", + "y": 180 + }, + "facing=south,open=true,waterlogged=false": { "model": "create:block/orange_postbox_open", "y": 180 }, - "facing=west,open=false": { + "facing=south,open=true,waterlogged=true": { + "model": "create:block/orange_postbox_open", + "y": 180 + }, + "facing=west,open=false,waterlogged=false": { "model": "create:block/orange_postbox_closed", "y": 270 }, - "facing=west,open=true": { + "facing=west,open=false,waterlogged=true": { + "model": "create:block/orange_postbox_closed", + "y": 270 + }, + "facing=west,open=true,waterlogged=false": { + "model": "create:block/orange_postbox_open", + "y": 270 + }, + "facing=west,open=true,waterlogged=true": { "model": "create:block/orange_postbox_open", "y": 270 } diff --git a/src/generated/resources/assets/create/blockstates/pink_postbox.json b/src/generated/resources/assets/create/blockstates/pink_postbox.json index ee0556c3dd..6f81984689 100644 --- a/src/generated/resources/assets/create/blockstates/pink_postbox.json +++ b/src/generated/resources/assets/create/blockstates/pink_postbox.json @@ -1,32 +1,62 @@ { "variants": { - "facing=east,open=false": { + "facing=east,open=false,waterlogged=false": { "model": "create:block/pink_postbox_closed", "y": 90 }, - "facing=east,open=true": { + "facing=east,open=false,waterlogged=true": { + "model": "create:block/pink_postbox_closed", + "y": 90 + }, + "facing=east,open=true,waterlogged=false": { "model": "create:block/pink_postbox_open", "y": 90 }, - "facing=north,open=false": { + "facing=east,open=true,waterlogged=true": { + "model": "create:block/pink_postbox_open", + "y": 90 + }, + "facing=north,open=false,waterlogged=false": { "model": "create:block/pink_postbox_closed" }, - "facing=north,open=true": { + "facing=north,open=false,waterlogged=true": { + "model": "create:block/pink_postbox_closed" + }, + "facing=north,open=true,waterlogged=false": { "model": "create:block/pink_postbox_open" }, - "facing=south,open=false": { + "facing=north,open=true,waterlogged=true": { + "model": "create:block/pink_postbox_open" + }, + "facing=south,open=false,waterlogged=false": { "model": "create:block/pink_postbox_closed", "y": 180 }, - "facing=south,open=true": { + "facing=south,open=false,waterlogged=true": { + "model": "create:block/pink_postbox_closed", + "y": 180 + }, + "facing=south,open=true,waterlogged=false": { "model": "create:block/pink_postbox_open", "y": 180 }, - "facing=west,open=false": { + "facing=south,open=true,waterlogged=true": { + "model": "create:block/pink_postbox_open", + "y": 180 + }, + "facing=west,open=false,waterlogged=false": { "model": "create:block/pink_postbox_closed", "y": 270 }, - "facing=west,open=true": { + "facing=west,open=false,waterlogged=true": { + "model": "create:block/pink_postbox_closed", + "y": 270 + }, + "facing=west,open=true,waterlogged=false": { + "model": "create:block/pink_postbox_open", + "y": 270 + }, + "facing=west,open=true,waterlogged=true": { "model": "create:block/pink_postbox_open", "y": 270 } diff --git a/src/generated/resources/assets/create/blockstates/purple_postbox.json b/src/generated/resources/assets/create/blockstates/purple_postbox.json index 7f9542a5bf..63b5e90a41 100644 --- a/src/generated/resources/assets/create/blockstates/purple_postbox.json +++ b/src/generated/resources/assets/create/blockstates/purple_postbox.json @@ -1,32 +1,62 @@ { "variants": { - "facing=east,open=false": { + "facing=east,open=false,waterlogged=false": { "model": "create:block/purple_postbox_closed", "y": 90 }, - "facing=east,open=true": { + "facing=east,open=false,waterlogged=true": { + "model": "create:block/purple_postbox_closed", + "y": 90 + }, + "facing=east,open=true,waterlogged=false": { "model": "create:block/purple_postbox_open", "y": 90 }, - "facing=north,open=false": { + "facing=east,open=true,waterlogged=true": { + "model": "create:block/purple_postbox_open", + "y": 90 + }, + "facing=north,open=false,waterlogged=false": { "model": "create:block/purple_postbox_closed" }, - "facing=north,open=true": { + "facing=north,open=false,waterlogged=true": { + "model": "create:block/purple_postbox_closed" + }, + "facing=north,open=true,waterlogged=false": { "model": "create:block/purple_postbox_open" }, - "facing=south,open=false": { + "facing=north,open=true,waterlogged=true": { + "model": "create:block/purple_postbox_open" + }, + "facing=south,open=false,waterlogged=false": { "model": "create:block/purple_postbox_closed", "y": 180 }, - "facing=south,open=true": { + "facing=south,open=false,waterlogged=true": { + "model": "create:block/purple_postbox_closed", + "y": 180 + }, + "facing=south,open=true,waterlogged=false": { "model": "create:block/purple_postbox_open", "y": 180 }, - "facing=west,open=false": { + "facing=south,open=true,waterlogged=true": { + "model": "create:block/purple_postbox_open", + "y": 180 + }, + "facing=west,open=false,waterlogged=false": { "model": "create:block/purple_postbox_closed", "y": 270 }, - "facing=west,open=true": { + "facing=west,open=false,waterlogged=true": { + "model": "create:block/purple_postbox_closed", + "y": 270 + }, + "facing=west,open=true,waterlogged=false": { + "model": "create:block/purple_postbox_open", + "y": 270 + }, + "facing=west,open=true,waterlogged=true": { "model": "create:block/purple_postbox_open", "y": 270 } diff --git a/src/generated/resources/assets/create/blockstates/red_postbox.json b/src/generated/resources/assets/create/blockstates/red_postbox.json index bc58c6661a..932b9a2520 100644 --- a/src/generated/resources/assets/create/blockstates/red_postbox.json +++ b/src/generated/resources/assets/create/blockstates/red_postbox.json @@ -1,32 +1,62 @@ { "variants": { - "facing=east,open=false": { + "facing=east,open=false,waterlogged=false": { "model": "create:block/red_postbox_closed", "y": 90 }, - "facing=east,open=true": { + "facing=east,open=false,waterlogged=true": { + "model": "create:block/red_postbox_closed", + "y": 90 + }, + "facing=east,open=true,waterlogged=false": { "model": "create:block/red_postbox_open", "y": 90 }, - "facing=north,open=false": { + "facing=east,open=true,waterlogged=true": { + "model": "create:block/red_postbox_open", + "y": 90 + }, + "facing=north,open=false,waterlogged=false": { "model": "create:block/red_postbox_closed" }, - "facing=north,open=true": { + "facing=north,open=false,waterlogged=true": { + "model": "create:block/red_postbox_closed" + }, + "facing=north,open=true,waterlogged=false": { "model": "create:block/red_postbox_open" }, - "facing=south,open=false": { + "facing=north,open=true,waterlogged=true": { + "model": "create:block/red_postbox_open" + }, + "facing=south,open=false,waterlogged=false": { "model": "create:block/red_postbox_closed", "y": 180 }, - "facing=south,open=true": { + "facing=south,open=false,waterlogged=true": { + "model": "create:block/red_postbox_closed", + "y": 180 + }, + "facing=south,open=true,waterlogged=false": { "model": "create:block/red_postbox_open", "y": 180 }, - "facing=west,open=false": { + "facing=south,open=true,waterlogged=true": { + "model": "create:block/red_postbox_open", + "y": 180 + }, + "facing=west,open=false,waterlogged=false": { "model": "create:block/red_postbox_closed", "y": 270 }, - "facing=west,open=true": { + "facing=west,open=false,waterlogged=true": { + "model": "create:block/red_postbox_closed", + "y": 270 + }, + "facing=west,open=true,waterlogged=false": { + "model": "create:block/red_postbox_open", + "y": 270 + }, + "facing=west,open=true,waterlogged=true": { "model": "create:block/red_postbox_open", "y": 270 } diff --git a/src/generated/resources/assets/create/blockstates/stock_link.json b/src/generated/resources/assets/create/blockstates/stock_link.json index 3d9674a1d2..23c5629bee 100644 --- a/src/generated/resources/assets/create/blockstates/stock_link.json +++ b/src/generated/resources/assets/create/blockstates/stock_link.json @@ -1,53 +1,105 @@ { "variants": { - "facing=down,powered=false": { + "facing=down,powered=false,waterlogged=false": { "model": "create:block/stock_link/block", "x": 180 }, - "facing=down,powered=true": { + "facing=down,powered=false,waterlogged=true": { + "model": "create:block/stock_link/block", + "x": 180 + }, + "facing=down,powered=true,waterlogged=false": { "model": "create:block/stock_link/block_powered", "x": 180 }, - "facing=east,powered=false": { + "facing=down,powered=true,waterlogged=true": { + "model": "create:block/stock_link/block_powered", + "x": 180 + }, + "facing=east,powered=false,waterlogged=false": { "model": "create:block/stock_link/block", "x": 90, "y": 90 }, - "facing=east,powered=true": { + "facing=east,powered=false,waterlogged=true": { + "model": "create:block/stock_link/block", + "x": 90, + "y": 90 + }, + "facing=east,powered=true,waterlogged=false": { "model": "create:block/stock_link/block_powered", "x": 90, "y": 90 }, - "facing=north,powered=false": { + "facing=east,powered=true,waterlogged=true": { + "model": "create:block/stock_link/block_powered", + "x": 90, + "y": 90 + }, + "facing=north,powered=false,waterlogged=false": { "model": "create:block/stock_link/block", "x": 90 }, - "facing=north,powered=true": { + "facing=north,powered=false,waterlogged=true": { + "model": "create:block/stock_link/block", + "x": 90 + }, + "facing=north,powered=true,waterlogged=false": { "model": "create:block/stock_link/block_powered", "x": 90 }, - "facing=south,powered=false": { + "facing=north,powered=true,waterlogged=true": { + "model": "create:block/stock_link/block_powered", + "x": 90 + }, + "facing=south,powered=false,waterlogged=false": { "model": "create:block/stock_link/block", "x": 90, "y": 180 }, - "facing=south,powered=true": { + "facing=south,powered=false,waterlogged=true": { + "model": "create:block/stock_link/block", + "x": 90, + "y": 180 + }, + "facing=south,powered=true,waterlogged=false": { "model": "create:block/stock_link/block_powered", "x": 90, "y": 180 }, - "facing=up,powered=false": { + "facing=south,powered=true,waterlogged=true": { + "model": "create:block/stock_link/block_powered", + "x": 90, + "y": 180 + }, + "facing=up,powered=false,waterlogged=false": { "model": "create:block/stock_link/block" }, - "facing=up,powered=true": { + "facing=up,powered=false,waterlogged=true": { + "model": "create:block/stock_link/block" + }, + "facing=up,powered=true,waterlogged=false": { "model": "create:block/stock_link/block_powered" }, - "facing=west,powered=false": { + "facing=up,powered=true,waterlogged=true": { + "model": "create:block/stock_link/block_powered" + }, + "facing=west,powered=false,waterlogged=false": { "model": "create:block/stock_link/block", "x": 90, "y": 270 }, - "facing=west,powered=true": { + "facing=west,powered=false,waterlogged=true": { + "model": "create:block/stock_link/block", + "x": 90, + "y": 270 + }, + "facing=west,powered=true,waterlogged=false": { + "model": "create:block/stock_link/block_powered", + "x": 90, + "y": 270 + }, + "facing=west,powered=true,waterlogged=true": { "model": "create:block/stock_link/block_powered", "x": 90, "y": 270 diff --git a/src/generated/resources/assets/create/blockstates/white_postbox.json b/src/generated/resources/assets/create/blockstates/white_postbox.json index 1471a51fec..4bdaba7cb8 100644 --- a/src/generated/resources/assets/create/blockstates/white_postbox.json +++ b/src/generated/resources/assets/create/blockstates/white_postbox.json @@ -1,32 +1,62 @@ { "variants": { - "facing=east,open=false": { + "facing=east,open=false,waterlogged=false": { "model": "create:block/white_postbox_closed", "y": 90 }, - "facing=east,open=true": { + "facing=east,open=false,waterlogged=true": { + "model": "create:block/white_postbox_closed", + "y": 90 + }, + "facing=east,open=true,waterlogged=false": { "model": "create:block/white_postbox_open", "y": 90 }, - "facing=north,open=false": { + "facing=east,open=true,waterlogged=true": { + "model": "create:block/white_postbox_open", + "y": 90 + }, + "facing=north,open=false,waterlogged=false": { "model": "create:block/white_postbox_closed" }, - "facing=north,open=true": { + "facing=north,open=false,waterlogged=true": { + "model": "create:block/white_postbox_closed" + }, + "facing=north,open=true,waterlogged=false": { "model": "create:block/white_postbox_open" }, - "facing=south,open=false": { + "facing=north,open=true,waterlogged=true": { + "model": "create:block/white_postbox_open" + }, + "facing=south,open=false,waterlogged=false": { "model": "create:block/white_postbox_closed", "y": 180 }, - "facing=south,open=true": { + "facing=south,open=false,waterlogged=true": { + "model": "create:block/white_postbox_closed", + "y": 180 + }, + "facing=south,open=true,waterlogged=false": { "model": "create:block/white_postbox_open", "y": 180 }, - "facing=west,open=false": { + "facing=south,open=true,waterlogged=true": { + "model": "create:block/white_postbox_open", + "y": 180 + }, + "facing=west,open=false,waterlogged=false": { "model": "create:block/white_postbox_closed", "y": 270 }, - "facing=west,open=true": { + "facing=west,open=false,waterlogged=true": { + "model": "create:block/white_postbox_closed", + "y": 270 + }, + "facing=west,open=true,waterlogged=false": { + "model": "create:block/white_postbox_open", + "y": 270 + }, + "facing=west,open=true,waterlogged=true": { "model": "create:block/white_postbox_open", "y": 270 } diff --git a/src/generated/resources/assets/create/blockstates/yellow_postbox.json b/src/generated/resources/assets/create/blockstates/yellow_postbox.json index 1959f2eb7d..850b13511c 100644 --- a/src/generated/resources/assets/create/blockstates/yellow_postbox.json +++ b/src/generated/resources/assets/create/blockstates/yellow_postbox.json @@ -1,32 +1,62 @@ { "variants": { - "facing=east,open=false": { + "facing=east,open=false,waterlogged=false": { "model": "create:block/yellow_postbox_closed", "y": 90 }, - "facing=east,open=true": { + "facing=east,open=false,waterlogged=true": { + "model": "create:block/yellow_postbox_closed", + "y": 90 + }, + "facing=east,open=true,waterlogged=false": { "model": "create:block/yellow_postbox_open", "y": 90 }, - "facing=north,open=false": { + "facing=east,open=true,waterlogged=true": { + "model": "create:block/yellow_postbox_open", + "y": 90 + }, + "facing=north,open=false,waterlogged=false": { "model": "create:block/yellow_postbox_closed" }, - "facing=north,open=true": { + "facing=north,open=false,waterlogged=true": { + "model": "create:block/yellow_postbox_closed" + }, + "facing=north,open=true,waterlogged=false": { "model": "create:block/yellow_postbox_open" }, - "facing=south,open=false": { + "facing=north,open=true,waterlogged=true": { + "model": "create:block/yellow_postbox_open" + }, + "facing=south,open=false,waterlogged=false": { "model": "create:block/yellow_postbox_closed", "y": 180 }, - "facing=south,open=true": { + "facing=south,open=false,waterlogged=true": { + "model": "create:block/yellow_postbox_closed", + "y": 180 + }, + "facing=south,open=true,waterlogged=false": { "model": "create:block/yellow_postbox_open", "y": 180 }, - "facing=west,open=false": { + "facing=south,open=true,waterlogged=true": { + "model": "create:block/yellow_postbox_open", + "y": 180 + }, + "facing=west,open=false,waterlogged=false": { "model": "create:block/yellow_postbox_closed", "y": 270 }, - "facing=west,open=true": { + "facing=west,open=false,waterlogged=true": { + "model": "create:block/yellow_postbox_closed", + "y": 270 + }, + "facing=west,open=true,waterlogged=false": { + "model": "create:block/yellow_postbox_open", + "y": 270 + }, + "facing=west,open=true,waterlogged=true": { "model": "create:block/yellow_postbox_open", "y": 270 } diff --git a/src/main/java/com/simibubi/create/content/logistics/itemHatch/ItemHatchBlock.java b/src/main/java/com/simibubi/create/content/logistics/itemHatch/ItemHatchBlock.java index 8899a879f3..36861d607f 100644 --- a/src/main/java/com/simibubi/create/content/logistics/itemHatch/ItemHatchBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/itemHatch/ItemHatchBlock.java @@ -9,11 +9,13 @@ import com.simibubi.create.AllSoundEvents; import com.simibubi.create.content.equipment.wrench.IWrenchable; import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.foundation.block.IBE; +import com.simibubi.create.foundation.block.ProperWaterloggedBlock; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import com.simibubi.create.foundation.blockEntity.behaviour.filtering.FilteringBehaviour; import com.simibubi.create.foundation.utility.CreateLang; import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; import net.minecraft.util.RandomSource; import net.minecraft.world.InteractionHand; @@ -24,6 +26,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.HorizontalDirectionalBlock; import net.minecraft.world.level.block.entity.BlockEntity; @@ -31,6 +34,7 @@ import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition.Builder; import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.material.FluidState; import net.minecraft.world.level.pathfinder.PathComputationType; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.shapes.CollisionContext; @@ -41,17 +45,20 @@ import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.ItemHandlerHelper; -public class ItemHatchBlock extends HorizontalDirectionalBlock implements IBE, IWrenchable { +public class ItemHatchBlock extends HorizontalDirectionalBlock + implements IBE, IWrenchable, ProperWaterloggedBlock { public static final BooleanProperty OPEN = BooleanProperty.create("open"); public ItemHatchBlock(Properties pProperties) { super(pProperties); + registerDefaultState(defaultBlockState().setValue(OPEN, false) + .setValue(WATERLOGGED, false)); } @Override protected void createBlockStateDefinition(Builder pBuilder) { - super.createBlockStateDefinition(pBuilder.add(OPEN, FACING)); + super.createBlockStateDefinition(pBuilder.add(OPEN, FACING, WATERLOGGED)); } @Override @@ -64,9 +71,21 @@ public class ItemHatchBlock extends HorizontalDirectionalBlock implements IBE, IW public boolean isPathfindable(BlockState state, BlockGetter reader, BlockPos pos, PathComputationType type) { return false; } + + @Override + public boolean hasAnalogOutputSignal(BlockState pState) { + return true; + } + + @Override + public int getAnalogOutputSignal(BlockState pState, Level pLevel, BlockPos pPos) { + return getBlockEntityOptional(pLevel, pPos).map(pbe -> pbe.getComparatorOutput()) + .orElse(0); + } } diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/postbox/PostboxBlock.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/postbox/PostboxBlock.java index 95e6d44916..fe257d22a0 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/postbox/PostboxBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/postbox/PostboxBlock.java @@ -4,6 +4,7 @@ import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllShapes; import com.simibubi.create.content.equipment.wrench.IWrenchable; import com.simibubi.create.foundation.block.IBE; +import com.simibubi.create.foundation.block.ProperWaterloggedBlock; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -14,6 +15,7 @@ import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.HorizontalDirectionalBlock; import net.minecraft.world.level.block.entity.BlockEntityType; @@ -21,12 +23,14 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition.Builder; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.material.FluidState; import net.minecraft.world.level.pathfinder.PathComputationType; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; -public class PostboxBlock extends HorizontalDirectionalBlock implements IBE, IWrenchable { +public class PostboxBlock extends HorizontalDirectionalBlock + implements IBE, IWrenchable, ProperWaterloggedBlock { public static final BooleanProperty OPEN = BlockStateProperties.OPEN; @@ -35,7 +39,8 @@ public class PostboxBlock extends HorizontalDirectionalBlock implements IBE pBuilder) { - super.createBlockStateDefinition(pBuilder.add(FACING, OPEN)); + super.createBlockStateDefinition(pBuilder.add(FACING, OPEN, WATERLOGGED)); } @Override @@ -74,10 +91,21 @@ public class PostboxBlock extends HorizontalDirectionalBlock implements IBE getBlockEntityType() { return AllBlockEntityTypes.PACKAGE_POSTBOX.get(); } - + @Override public boolean isPathfindable(BlockState state, BlockGetter reader, BlockPos pos, PathComputationType type) { return false; } + @Override + public boolean hasAnalogOutputSignal(BlockState pState) { + return true; + } + + @Override + public int getAnalogOutputSignal(BlockState pState, Level pLevel, BlockPos pPos) { + return getBlockEntityOptional(pLevel, pPos).map(pbe -> pbe.getComparatorOutput()) + .orElse(0); + } + } diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java index 52e01baa06..ad9dfccb7d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java @@ -160,10 +160,27 @@ public class PackagerBlock extends WrenchableDirectionalBlock implements IBE getBlockEntityType() { return AllBlockEntityTypes.PACKAGER.get(); } - + @Override public boolean isPathfindable(BlockState pState, BlockGetter pLevel, BlockPos pPos, PathComputationType pType) { return false; } + @Override + public boolean hasAnalogOutputSignal(BlockState pState) { + return true; + } + + @Override + public int getAnalogOutputSignal(BlockState pState, Level pLevel, BlockPos pPos) { + return getBlockEntityOptional(pLevel, pPos).map(pbe -> { + boolean empty = pbe.inventory.getStackInSlot(0) + .isEmpty(); + if (pbe.animationTicks != 0) + empty = false; + return empty ? 0 : 15; + }) + .orElse(0); + } + } diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java index 5f59eee4e9..82cc73fdaa 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java @@ -121,8 +121,10 @@ public class PackagerBlockEntity extends SmartBlockEntity { animationTicks--; - if (animationTicks == 0 && !level.isClientSide()) + if (animationTicks == 0 && !level.isClientSide()) { wakeTheFrogs(); + setChanged(); + } } public void triggerStockCheck() { diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlock.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlock.java index fbade84b13..d02387217f 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlock.java @@ -3,6 +3,7 @@ package com.simibubi.create.content.logistics.packagerLink; import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllShapes; import com.simibubi.create.foundation.block.IBE; +import com.simibubi.create.foundation.block.ProperWaterloggedBlock; import com.simibubi.create.foundation.block.WrenchableDirectionalBlock; import net.createmod.catnip.utility.Iterate; @@ -14,23 +15,27 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition.Builder; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.material.FluidState; import net.minecraft.world.level.pathfinder.PathComputationType; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; -public class PackagerLinkBlock extends WrenchableDirectionalBlock implements IBE { +public class PackagerLinkBlock extends WrenchableDirectionalBlock + implements IBE, ProperWaterloggedBlock { public static final BooleanProperty POWERED = BlockStateProperties.POWERED; public PackagerLinkBlock(Properties properties) { super(properties); - registerDefaultState(defaultBlockState().setValue(POWERED, false)); + registerDefaultState(defaultBlockState().setValue(POWERED, false) + .setValue(WATERLOGGED, false)); } @Override @@ -38,7 +43,19 @@ public class PackagerLinkBlock extends WrenchableDirectionalBlock implements IBE BlockPos pos = context.getClickedPos(); Direction face = context.getClickedFace(); BlockState placed = super.getStateForPlacement(context).setValue(FACING, face); - return placed.setValue(POWERED, getPower(placed, context.getLevel(), pos) > 0); + return withWater(placed.setValue(POWERED, getPower(placed, context.getLevel(), pos) > 0), context); + } + + @Override + public FluidState getFluidState(BlockState pState) { + return fluidState(pState); + } + + @Override + public BlockState updateShape(BlockState pState, Direction pDirection, BlockState pNeighborState, + LevelAccessor pLevel, BlockPos pPos, BlockPos pNeighborPos) { + updateWater(pLevel, pState, pPos); + return pState; } @Override @@ -81,7 +98,7 @@ public class PackagerLinkBlock extends WrenchableDirectionalBlock implements IBE @Override protected void createBlockStateDefinition(Builder builder) { - super.createBlockStateDefinition(builder.add(POWERED)); + super.createBlockStateDefinition(builder.add(POWERED, WATERLOGGED)); } @Override From 06a9bcf6d15e646bff777c8c81e2eb8b7decd5e7 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Mon, 16 Dec 2024 15:26:41 +0100 Subject: [PATCH 189/515] The Multiverse - Fixed cobble gen optimisation creating new level instances as part of every check --- .../kinetics/drill/CobbleGenOptimisation.java | 18 +++++++++++++++--- .../create/foundation/events/CommonEvents.java | 2 ++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/kinetics/drill/CobbleGenOptimisation.java b/src/main/java/com/simibubi/create/content/kinetics/drill/CobbleGenOptimisation.java index 2102def98d..310b961c53 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/drill/CobbleGenOptimisation.java +++ b/src/main/java/com/simibubi/create/content/kinetics/drill/CobbleGenOptimisation.java @@ -29,6 +29,8 @@ import net.minecraftforge.fluids.FluidType; public class CobbleGenOptimisation { + static PlacementSimulationServerLevel cachedLevel; + public record CobbleGenBlockConfiguration(List statesAroundDrill) { } @@ -89,13 +91,23 @@ public class CobbleGenOptimisation { } // TODO Catnip: add empty methods to PSSL overriding levelEvent() side-effects - PlacementSimulationServerLevel simulation = new PlacementSimulationServerLevel(level); + if (cachedLevel == null || cachedLevel.getLevel() != level) + cachedLevel = new PlacementSimulationServerLevel(level); + BlockState result = Blocks.AIR.defaultBlockState(); if (interaction == null) return result; - interaction.interact(simulation, pos, pos.relative(affected.getFirst()), affected.getSecond()); - return simulation.blocksAdded.getOrDefault(pos, result); + interaction.interact(cachedLevel, pos, pos.relative(affected.getFirst()), affected.getSecond()); + BlockState output = cachedLevel.blocksAdded.getOrDefault(pos, result); + cachedLevel.clear(); + + return output; + } + + public static void invalidateWorld(LevelAccessor world) { + if (cachedLevel != null && cachedLevel.getLevel() == world) + cachedLevel = null; } } diff --git a/src/main/java/com/simibubi/create/foundation/events/CommonEvents.java b/src/main/java/com/simibubi/create/foundation/events/CommonEvents.java index 30136e0f7c..5999f879cd 100644 --- a/src/main/java/com/simibubi/create/foundation/events/CommonEvents.java +++ b/src/main/java/com/simibubi/create/foundation/events/CommonEvents.java @@ -13,6 +13,7 @@ import com.simibubi.create.content.equipment.zapper.ZapperInteractionHandler; import com.simibubi.create.content.equipment.zapper.ZapperItem; import com.simibubi.create.content.kinetics.belt.BeltHelper; import com.simibubi.create.content.kinetics.chainConveyor.ServerChainConveyorHandler; +import com.simibubi.create.content.kinetics.drill.CobbleGenOptimisation; import com.simibubi.create.content.redstone.link.controller.LinkedControllerServerHandler; import com.simibubi.create.content.trains.entity.CarriageEntityHandler; import com.simibubi.create.foundation.ModFilePackResources; @@ -178,6 +179,7 @@ public class CommonEvents { Create.REDSTONE_LINK_NETWORK_HANDLER.onUnloadWorld(world); Create.TORQUE_PROPAGATOR.onUnloadWorld(world); WorldAttached.invalidateWorld(world); + CobbleGenOptimisation.invalidateWorld(world); } @SubscribeEvent From d1c598b3888788fecaa32d5b3bee31df92c74da7 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Mon, 16 Dec 2024 09:35:42 -0500 Subject: [PATCH 190/515] Fancy abstractions - Switch to loader agnostic methods provided by catnip --- build.gradle | 5 +++++ gradle.properties | 2 +- .../simibubi/create/infrastructure/command/AllCommands.java | 5 ++--- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index 2118bcf1a4..89d9b78bb1 100644 --- a/build.gradle +++ b/build.gradle @@ -206,6 +206,11 @@ repositories { } maven { url = "https://raw.githubusercontent.com/Fuzss/modresources/main/maven/" } + // Mirror of maven.createmod.net + if (System.getProperty("os.name").contains("Mac") && System.getenv("USER") == "ithundxr") { + maven { url = "https://maven.ithundxr.dev/mirror" } + } + mavenCentral() mavenLocal() flatDir { diff --git a/gradle.properties b/gradle.properties index c64b29174b..260686f4f2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -28,7 +28,7 @@ jei_minecraft_version = 1.20.1 jei_version = 15.10.0.39 curios_minecraft_version = 1.20.1 curios_version = 5.3.1 -catnip_version = 0.8.36 +catnip_version = 0.8.37 ponder_version = 0.8.12 mixin_extras_version = 0.4.1 diff --git a/src/main/java/com/simibubi/create/infrastructure/command/AllCommands.java b/src/main/java/com/simibubi/create/infrastructure/command/AllCommands.java index 5d1986d8bb..b2cddfaf2e 100644 --- a/src/main/java/com/simibubi/create/infrastructure/command/AllCommands.java +++ b/src/main/java/com/simibubi/create/infrastructure/command/AllCommands.java @@ -7,11 +7,10 @@ import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.tree.LiteralCommandNode; import net.createmod.catnip.command.CatnipCommands; +import net.createmod.catnip.platform.CatnipServices; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; import net.minecraft.world.entity.player.Player; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.fml.loading.FMLLoader; public class AllCommands { @@ -41,7 +40,7 @@ public class AllCommands { // utility .then(util); - if (!FMLLoader.isProduction() && FMLLoader.getDist() == Dist.CLIENT) + if (CatnipServices.PLATFORM.isDevelopmentEnvironment() && CatnipServices.PLATFORM.getEnv().isClient()) root.then(CreateTestCommand.register()); LiteralCommandNode createRoot = dispatcher.register(root); From 4b0136d319af88c5a4c6c03697d5cf07e8cd853c Mon Sep 17 00:00:00 2001 From: IThundxr Date: Mon, 16 Dec 2024 15:38:37 -0500 Subject: [PATCH 191/515] Sneaky Deployers - Fix deployers retaining the damage attribute of the last equipped weapon - Fixes Creators-of-Create/Create#4870 --- .../create/content/kinetics/deployer/DeployerHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/simibubi/create/content/kinetics/deployer/DeployerHandler.java b/src/main/java/com/simibubi/create/content/kinetics/deployer/DeployerHandler.java index f80423c486..48f7b001f4 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/deployer/DeployerHandler.java +++ b/src/main/java/com/simibubi/create/content/kinetics/deployer/DeployerHandler.java @@ -133,7 +133,7 @@ public class DeployerHandler { .addTransientAttributeModifiers(attributeModifiers); activateInner(player, vec, clickedPos, extensionVector, mode); player.getAttributes() - .addTransientAttributeModifiers(attributeModifiers); + .removeAttributeModifiers(attributeModifiers); } private static void activateInner(DeployerFakePlayer player, Vec3 vec, BlockPos clickedPos, Vec3 extensionVector, From 06677083ff21a1dba4402675749cd209d9d8d422 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Mon, 16 Dec 2024 15:58:58 -0500 Subject: [PATCH 192/515] Catastrophic clipboards - Don't blindly trust clients with what they send as clipboard data - Fixes Creators-of-Create/Create#7218 --- .../clipboard/ClipboardEditPacket.java | 6 +++ .../utility/CreateNBTProcessors.java | 40 +++++++++---------- 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardEditPacket.java b/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardEditPacket.java index c8f48bc155..3512e2fb19 100644 --- a/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardEditPacket.java +++ b/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardEditPacket.java @@ -2,6 +2,9 @@ package com.simibubi.create.content.equipment.clipboard; import com.simibubi.create.AllBlocks; import com.simibubi.create.foundation.networking.SimplePacketBase; + +import com.simibubi.create.foundation.utility.CreateNBTProcessors; + import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; @@ -43,6 +46,9 @@ public class ClipboardEditPacket extends SimplePacketBase { @Override public boolean handle(Context context) { context.enqueueWork(() -> { + // Get rid of any unsafe data + data = CreateNBTProcessors.clipboardProcessor(data); + ServerPlayer sender = context.getSender(); if (targetedBlock != null) { diff --git a/src/main/java/com/simibubi/create/foundation/utility/CreateNBTProcessors.java b/src/main/java/com/simibubi/create/foundation/utility/CreateNBTProcessors.java index 5b7c672656..2d3f36e8fd 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/CreateNBTProcessors.java +++ b/src/main/java/com/simibubi/create/foundation/utility/CreateNBTProcessors.java @@ -12,7 +12,6 @@ import net.minecraft.nbt.Tag; import net.minecraft.world.level.block.entity.BlockEntityType; public class CreateNBTProcessors { - public static void register() { NBTProcessors.addProcessor(BlockEntityType.SIGN, data -> { @@ -42,28 +41,29 @@ public class CreateNBTProcessors { } return data; }); - - NBTProcessors.addProcessor(AllBlockEntityTypes.CLIPBOARD.get(), data -> { - if (!data.contains("Item", Tag.TAG_COMPOUND)) - return data; - CompoundTag book = data.getCompound("Item"); - - if (!book.contains("tag", Tag.TAG_COMPOUND)) - return data; - CompoundTag itemData = book.getCompound("tag"); - - for (List entries : NBTHelper.readCompoundList(itemData.getList("Pages", Tag.TAG_COMPOUND), - pageTag -> NBTHelper.readCompoundList(pageTag.getList("Entries", Tag.TAG_COMPOUND), - tag -> tag.getString("Text")))) { - for (String entry : entries) - if (NBTProcessors.textComponentHasClickEvent(entry)) - return null; - } - return data; - }); + + NBTProcessors.addProcessor(AllBlockEntityTypes.CLIPBOARD.get(), CreateNBTProcessors::clipboardProcessor); NBTProcessors.addProcessor(AllBlockEntityTypes.CREATIVE_CRATE.get(), NBTProcessors.itemProcessor("Filter")); NBTProcessors.addProcessor(AllBlockEntityTypes.PLACARD.get(), NBTProcessors.itemProcessor("Item")); } + public static CompoundTag clipboardProcessor(CompoundTag data) { + if (!data.contains("Item", Tag.TAG_COMPOUND)) + return data; + CompoundTag book = data.getCompound("Item"); + + if (!book.contains("tag", Tag.TAG_COMPOUND)) + return data; + CompoundTag itemData = book.getCompound("tag"); + + for (List entries : NBTHelper.readCompoundList(itemData.getList("Pages", Tag.TAG_COMPOUND), + pageTag -> NBTHelper.readCompoundList(pageTag.getList("Entries", Tag.TAG_COMPOUND), + tag -> tag.getString("Text")))) { + for (String entry : entries) + if (NBTProcessors.textComponentHasClickEvent(entry)) + return null; + } + return data; + } } From 97130ccfc5b8b3d3565c3c9ecbcdf40abc764809 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Tue, 17 Dec 2024 12:01:03 +0100 Subject: [PATCH 193/515] Asset push - New models for packager, re-packager, stock link, requester --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 42 ++--- .../blockstates/redstone_requester.json | 12 +- .../create/blockstates/stockpile_switch.json | 144 +++++++------- .../threshold_switch/block_ceiling_0.json | 0 .../threshold_switch/block_ceiling_1.json | 0 .../threshold_switch/block_ceiling_2.json | 0 .../threshold_switch/block_ceiling_3.json | 0 .../threshold_switch/block_ceiling_4.json | 0 .../threshold_switch/block_ceiling_5.json | 0 .../threshold_switch/block_floor_0.json | 0 .../threshold_switch/block_floor_1.json | 0 .../threshold_switch/block_floor_2.json | 0 .../threshold_switch/block_floor_3.json | 0 .../threshold_switch/block_floor_4.json | 0 .../threshold_switch/block_floor_5.json | 0 .../threshold_switch/block_wall_0.json | 0 .../threshold_switch/block_wall_1.json | 0 .../threshold_switch/block_wall_2.json | 0 .../threshold_switch/block_wall_3.json | 0 .../threshold_switch/block_wall_4.json | 0 .../threshold_switch/block_wall_5.json | 0 .../simibubi/create/AllBlockEntityTypes.java | 1 - .../java/com/simibubi/create/AllBlocks.java | 3 +- .../java/com/simibubi/create/AllShapes.java | 1 + .../packagerLink/PackagerLinkBlock.java | 2 +- .../RedstoneRequesterBlock.java | 21 ++- .../ThresholdSwitchGenerator.java | 4 +- .../create/models/block/packager/block.json | 89 +++++---- .../models/block/packager/block_powered.json | 3 +- .../models/block/packager/block_vertical.json | 125 ++++++++----- .../packager/block_vertical_powered.json | 3 +- .../models/block/packager/hatch_closed.json | 23 +-- .../models/block/packager/hatch_open.json | 2 +- .../create/models/block/packager/item.json | 177 ++++++++++-------- .../create/models/block/packager/tray.json | 26 +-- .../block/redstone_requester/block.json | 35 ++-- .../redstone_requester/block_powered.json | 4 +- .../create/models/block/repackager/block.json | 99 +++++++++- .../block/repackager/block_powered.json | 5 +- .../block/repackager/block_vertical.json | 128 ++++++++++++- .../repackager/block_vertical_powered.json | 5 +- .../create/models/block/repackager/item.json | 140 +++++++++++++- .../create/models/block/repackager/tray.json | 30 ++- .../create/models/block/stock_link/block.json | 151 ++++----------- .../block/stock_link/block_powered.json | 121 +----------- .../create/textures/block/packager_block.png | Bin 508 -> 0 bytes .../textures/block/packager_block_defrag.png | Bin 508 -> 0 bytes .../block/packager_block_defrag_powered.png | Bin 508 -> 0 bytes .../textures/block/packager_block_powered.png | Bin 508 -> 0 bytes .../textures/block/packager_details.png | Bin 0 -> 1057 bytes .../textures/block/packager_door_closed.png | Bin 675 -> 0 bytes .../textures/block/packager_door_open.png | Bin 376 -> 0 bytes .../create/textures/block/packager_frame.png | Bin 0 -> 464 bytes .../block/packager_horizontal_powered.png | Bin 0 -> 983 bytes .../block/packager_horizontal_unpowered.png | Bin 0 -> 886 bytes .../textures/block/packager_iris_closed.png | Bin 0 -> 347 bytes .../textures/block/packager_iris_open.png | Bin 0 -> 278 bytes .../create/textures/block/packager_link.png | Bin 1236 -> 0 bytes .../textures/block/packager_link_side.png | Bin 278 -> 0 bytes .../block/packager_link_side_powered.png | Bin 276 -> 0 bytes .../textures/block/packager_particle.png | Bin 0 -> 493 bytes .../block/packager_vertical_powered.png | Bin 0 -> 1028 bytes .../block/packager_vertical_unpowered.png | Bin 0 -> 929 bytes .../textures/block/redstone_requester.png | Bin 0 -> 704 bytes .../block/redstone_requester_powered.png | Bin 0 -> 561 bytes .../block/redstone_requester_side.png | Bin 303 -> 0 bytes .../block/redstone_requester_side_powered.png | Bin 305 -> 0 bytes .../textures/block/redstone_requester_top.png | Bin 260 -> 0 bytes .../block/redstone_requester_unpowered.png | Bin 0 -> 546 bytes .../textures/block/repackager_particle.png | Bin 0 -> 488 bytes .../create/textures/block/stock_link.png | Bin 0 -> 1110 bytes .../textures/block/stock_link_powered.png | Bin 0 -> 384 bytes .../textures/block/stock_link_unpowered.png | Bin 0 -> 360 bytes 73 files changed, 836 insertions(+), 560 deletions(-) rename src/generated/resources/assets/create/models/{ => block}/threshold_switch/block_ceiling_0.json (100%) rename src/generated/resources/assets/create/models/{ => block}/threshold_switch/block_ceiling_1.json (100%) rename src/generated/resources/assets/create/models/{ => block}/threshold_switch/block_ceiling_2.json (100%) rename src/generated/resources/assets/create/models/{ => block}/threshold_switch/block_ceiling_3.json (100%) rename src/generated/resources/assets/create/models/{ => block}/threshold_switch/block_ceiling_4.json (100%) rename src/generated/resources/assets/create/models/{ => block}/threshold_switch/block_ceiling_5.json (100%) rename src/generated/resources/assets/create/models/{ => block}/threshold_switch/block_floor_0.json (100%) rename src/generated/resources/assets/create/models/{ => block}/threshold_switch/block_floor_1.json (100%) rename src/generated/resources/assets/create/models/{ => block}/threshold_switch/block_floor_2.json (100%) rename src/generated/resources/assets/create/models/{ => block}/threshold_switch/block_floor_3.json (100%) rename src/generated/resources/assets/create/models/{ => block}/threshold_switch/block_floor_4.json (100%) rename src/generated/resources/assets/create/models/{ => block}/threshold_switch/block_floor_5.json (100%) rename src/generated/resources/assets/create/models/{ => block}/threshold_switch/block_wall_0.json (100%) rename src/generated/resources/assets/create/models/{ => block}/threshold_switch/block_wall_1.json (100%) rename src/generated/resources/assets/create/models/{ => block}/threshold_switch/block_wall_2.json (100%) rename src/generated/resources/assets/create/models/{ => block}/threshold_switch/block_wall_3.json (100%) rename src/generated/resources/assets/create/models/{ => block}/threshold_switch/block_wall_4.json (100%) rename src/generated/resources/assets/create/models/{ => block}/threshold_switch/block_wall_5.json (100%) delete mode 100644 src/main/resources/assets/create/textures/block/packager_block.png delete mode 100644 src/main/resources/assets/create/textures/block/packager_block_defrag.png delete mode 100644 src/main/resources/assets/create/textures/block/packager_block_defrag_powered.png delete mode 100644 src/main/resources/assets/create/textures/block/packager_block_powered.png create mode 100644 src/main/resources/assets/create/textures/block/packager_details.png delete mode 100644 src/main/resources/assets/create/textures/block/packager_door_closed.png delete mode 100644 src/main/resources/assets/create/textures/block/packager_door_open.png create mode 100644 src/main/resources/assets/create/textures/block/packager_frame.png create mode 100644 src/main/resources/assets/create/textures/block/packager_horizontal_powered.png create mode 100644 src/main/resources/assets/create/textures/block/packager_horizontal_unpowered.png create mode 100644 src/main/resources/assets/create/textures/block/packager_iris_closed.png create mode 100644 src/main/resources/assets/create/textures/block/packager_iris_open.png delete mode 100644 src/main/resources/assets/create/textures/block/packager_link.png delete mode 100644 src/main/resources/assets/create/textures/block/packager_link_side.png delete mode 100644 src/main/resources/assets/create/textures/block/packager_link_side_powered.png create mode 100644 src/main/resources/assets/create/textures/block/packager_particle.png create mode 100644 src/main/resources/assets/create/textures/block/packager_vertical_powered.png create mode 100644 src/main/resources/assets/create/textures/block/packager_vertical_unpowered.png create mode 100644 src/main/resources/assets/create/textures/block/redstone_requester.png create mode 100644 src/main/resources/assets/create/textures/block/redstone_requester_powered.png delete mode 100644 src/main/resources/assets/create/textures/block/redstone_requester_side.png delete mode 100644 src/main/resources/assets/create/textures/block/redstone_requester_side_powered.png delete mode 100644 src/main/resources/assets/create/textures/block/redstone_requester_top.png create mode 100644 src/main/resources/assets/create/textures/block/redstone_requester_unpowered.png create mode 100644 src/main/resources/assets/create/textures/block/repackager_particle.png create mode 100644 src/main/resources/assets/create/textures/block/stock_link.png create mode 100644 src/main/resources/assets/create/textures/block/stock_link_powered.png create mode 100644 src/main/resources/assets/create/textures/block/stock_link_unpowered.png diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 201a66957b..486ed75bdc 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-12-14T09:57:52.522427 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-12-17T11:49:49.8195572 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -472,7 +472,7 @@ a4b6bd4e55cd292abf752efeda93cf8d23162657 assets/create/blockstates/purple_table_ 7ce346fa18702f6fe6e2a939efcfa26eda63fe38 assets/create/blockstates/raw_zinc_block.json ec546afd3ec8036e4393b97d535f05a86f57dbc1 assets/create/blockstates/redstone_contact.json ff205f032b36486753dddb1f2029ef8d53e9c86f assets/create/blockstates/redstone_link.json -9ae6198e13b456ef18582364644071a18cf9324e assets/create/blockstates/redstone_requester.json +e4c645b199a2d7e89c91065071a0a91df5ca8e3c assets/create/blockstates/redstone_requester.json e3fd62e466e3e6e7bd6fc8661f764ba972a466fc assets/create/blockstates/red_nixie_tube.json d14d6437a6727da13cea5f7eeb815720c80dde6f assets/create/blockstates/red_postbox.json 4c36b562da58ef2af57009da7cf2426059249228 assets/create/blockstates/red_sail.json @@ -568,7 +568,7 @@ a60c9c8241e40c2e28f5760c0ca6e80cfe9d59f3 assets/create/blockstates/steam_whistle 636ec6c7e1ef3b737edc716200f138bc63681d78 assets/create/blockstates/steam_whistle_extension.json 8865500bcd2e4d467e74edb3509850fa92a5809f assets/create/blockstates/sticker.json bed0534e618105184bc877b104230403ca85bb58 assets/create/blockstates/sticky_mechanical_piston.json -bab242ab794e6d439645c2d5a0242ae7c81942ff assets/create/blockstates/stockpile_switch.json +c7c17ff17b98ce85d355f2f9b4509271bc283843 assets/create/blockstates/stockpile_switch.json 9867b7abbab1c9e848df4bb8557c4b41604e71fc assets/create/blockstates/stock_link.json 9989bda294fbffc5f659d2e608e01dea424c7694 assets/create/blockstates/stock_ticker.json a70c025de5d85180f371ff05bbdc531d8bdfaab1 assets/create/blockstates/stressometer.json @@ -1682,6 +1682,24 @@ e13aabf77b949a4eaf33c772e8b7112b1a7f1e72 assets/create/models/block/spruce_windo 9bf5008df74b7caea128580021605a6abcae6841 assets/create/models/block/steam_whistle/block_medium_wall_powered.json 92eba6564e2c65e08bc628107fbf89a5ff7ab53e assets/create/models/block/steam_whistle/block_small_floor_powered.json d768a02c31606cc46a4bbd619906e313099cce2d assets/create/models/block/steam_whistle/block_small_wall_powered.json +63d74987f8461b4e94c00030d380d4891707d2ae assets/create/models/block/threshold_switch/block_ceiling_0.json +12496e505374e7fff2d1f800218848635d86ec71 assets/create/models/block/threshold_switch/block_ceiling_1.json +523bc69211b6e90cc381356f103b01b8d7e15771 assets/create/models/block/threshold_switch/block_ceiling_2.json +c62cbd9fe144326c46702ba4e512c832484ea4e8 assets/create/models/block/threshold_switch/block_ceiling_3.json +fe1017b4338d3027771d5eb8b4e2444ddb842b36 assets/create/models/block/threshold_switch/block_ceiling_4.json +d090a659a8df0b86d9892214ac5b06641aaabc9a assets/create/models/block/threshold_switch/block_ceiling_5.json +dffc869ccce392b1908c833631e3df374c6a3012 assets/create/models/block/threshold_switch/block_floor_0.json +ab3d51ab5dd8ef6c1cad5d65406180915340dd7e assets/create/models/block/threshold_switch/block_floor_1.json +7a69fb5a6e77b457c381495c951aa0ba9c7df7f0 assets/create/models/block/threshold_switch/block_floor_2.json +3a6bbc80eea8d824a981e257f8025997946b3260 assets/create/models/block/threshold_switch/block_floor_3.json +a76fae0415604615be0e822394e0879ca81bf166 assets/create/models/block/threshold_switch/block_floor_4.json +28ddae97613f1a06885f06faa20b1b2a5bcaa7db assets/create/models/block/threshold_switch/block_floor_5.json +ab50d142c25c95b0865dd41176cc07a0c76109ac assets/create/models/block/threshold_switch/block_wall_0.json +be730f505bf937db4b3658b2bd3763b514d295c2 assets/create/models/block/threshold_switch/block_wall_1.json +f7f6d92ab5dea5a85ec3d570cdd169329dd4225f assets/create/models/block/threshold_switch/block_wall_2.json +41009d15d22c946a2ed4c6ba98447c3c7cc26315 assets/create/models/block/threshold_switch/block_wall_3.json +ad3204842128db2c7bebdbf3c40fccc45c82de44 assets/create/models/block/threshold_switch/block_wall_4.json +197a6ed7fd9514de13daf58605c24a7156c00bd1 assets/create/models/block/threshold_switch/block_wall_5.json 9e74256a37ee71de978395fb911e6e6db9fcc41e assets/create/models/block/tiled_glass.json 49c76af85635454ba3b6278f7317bb1729c4c58a assets/create/models/block/tiled_glass_pane_noside.json 4319255a3fcb0b9b60cba96273c513329a480a6b assets/create/models/block/tiled_glass_pane_noside_alt.json @@ -2499,24 +2517,6 @@ bcf63b7198d31d3a94b2566171b7e3e84464601c assets/create/models/item/zinc_block.js d4a3290393c1c659f3d4dd4e267a87d287bd49a6 assets/create/models/item/zinc_ingot.json 1e9656f81ec01a89796b175cf029d1de45b758fe assets/create/models/item/zinc_nugget.json f3719d4d3a8d1e0d9f36db5d1317894ecacf3bf3 assets/create/models/item/zinc_ore.json -63d74987f8461b4e94c00030d380d4891707d2ae assets/create/models/threshold_switch/block_ceiling_0.json -12496e505374e7fff2d1f800218848635d86ec71 assets/create/models/threshold_switch/block_ceiling_1.json -523bc69211b6e90cc381356f103b01b8d7e15771 assets/create/models/threshold_switch/block_ceiling_2.json -c62cbd9fe144326c46702ba4e512c832484ea4e8 assets/create/models/threshold_switch/block_ceiling_3.json -fe1017b4338d3027771d5eb8b4e2444ddb842b36 assets/create/models/threshold_switch/block_ceiling_4.json -d090a659a8df0b86d9892214ac5b06641aaabc9a assets/create/models/threshold_switch/block_ceiling_5.json -dffc869ccce392b1908c833631e3df374c6a3012 assets/create/models/threshold_switch/block_floor_0.json -ab3d51ab5dd8ef6c1cad5d65406180915340dd7e assets/create/models/threshold_switch/block_floor_1.json -7a69fb5a6e77b457c381495c951aa0ba9c7df7f0 assets/create/models/threshold_switch/block_floor_2.json -3a6bbc80eea8d824a981e257f8025997946b3260 assets/create/models/threshold_switch/block_floor_3.json -a76fae0415604615be0e822394e0879ca81bf166 assets/create/models/threshold_switch/block_floor_4.json -28ddae97613f1a06885f06faa20b1b2a5bcaa7db assets/create/models/threshold_switch/block_floor_5.json -ab50d142c25c95b0865dd41176cc07a0c76109ac assets/create/models/threshold_switch/block_wall_0.json -be730f505bf937db4b3658b2bd3763b514d295c2 assets/create/models/threshold_switch/block_wall_1.json -f7f6d92ab5dea5a85ec3d570cdd169329dd4225f assets/create/models/threshold_switch/block_wall_2.json -41009d15d22c946a2ed4c6ba98447c3c7cc26315 assets/create/models/threshold_switch/block_wall_3.json -ad3204842128db2c7bebdbf3c40fccc45c82de44 assets/create/models/threshold_switch/block_wall_4.json -197a6ed7fd9514de13daf58605c24a7156c00bd1 assets/create/models/threshold_switch/block_wall_5.json 7dbef6df108c395c2481c8183517c9ea568a7d88 data/create/advancements/recipes/building_blocks/acacia_window.json 8005cd18b80bcee4f5a2111ee78f87d117d6fcdf data/create/advancements/recipes/building_blocks/acacia_window_pane.json a2b7fe4d1b1c8d173da0e6dfcf41379648a92a80 data/create/advancements/recipes/building_blocks/andesite_from_stone_types_andesite_stonecutting.json diff --git a/src/generated/resources/assets/create/blockstates/redstone_requester.json b/src/generated/resources/assets/create/blockstates/redstone_requester.json index 498215dec0..2dad3ceb28 100644 --- a/src/generated/resources/assets/create/blockstates/redstone_requester.json +++ b/src/generated/resources/assets/create/blockstates/redstone_requester.json @@ -1,9 +1,17 @@ { "variants": { - "powered=false": { + "axis=x,powered=false": { + "model": "create:block/redstone_requester/block", + "y": 90 + }, + "axis=x,powered=true": { + "model": "create:block/redstone_requester/block_powered", + "y": 90 + }, + "axis=z,powered=false": { "model": "create:block/redstone_requester/block" }, - "powered=true": { + "axis=z,powered=true": { "model": "create:block/redstone_requester/block_powered" } } diff --git a/src/generated/resources/assets/create/blockstates/stockpile_switch.json b/src/generated/resources/assets/create/blockstates/stockpile_switch.json index 10e03d9c43..85016aac51 100644 --- a/src/generated/resources/assets/create/blockstates/stockpile_switch.json +++ b/src/generated/resources/assets/create/blockstates/stockpile_switch.json @@ -1,273 +1,273 @@ { "variants": { "facing=east,level=0,target=ceiling": { - "model": "create:threshold_switch/block_ceiling_0", + "model": "create:block/threshold_switch/block_ceiling_0", "y": 90 }, "facing=east,level=0,target=floor": { - "model": "create:threshold_switch/block_floor_0", + "model": "create:block/threshold_switch/block_floor_0", "y": 90 }, "facing=east,level=0,target=wall": { - "model": "create:threshold_switch/block_wall_0", + "model": "create:block/threshold_switch/block_wall_0", "y": 90 }, "facing=east,level=1,target=ceiling": { - "model": "create:threshold_switch/block_ceiling_1", + "model": "create:block/threshold_switch/block_ceiling_1", "y": 90 }, "facing=east,level=1,target=floor": { - "model": "create:threshold_switch/block_floor_1", + "model": "create:block/threshold_switch/block_floor_1", "y": 90 }, "facing=east,level=1,target=wall": { - "model": "create:threshold_switch/block_wall_1", + "model": "create:block/threshold_switch/block_wall_1", "y": 90 }, "facing=east,level=2,target=ceiling": { - "model": "create:threshold_switch/block_ceiling_2", + "model": "create:block/threshold_switch/block_ceiling_2", "y": 90 }, "facing=east,level=2,target=floor": { - "model": "create:threshold_switch/block_floor_2", + "model": "create:block/threshold_switch/block_floor_2", "y": 90 }, "facing=east,level=2,target=wall": { - "model": "create:threshold_switch/block_wall_2", + "model": "create:block/threshold_switch/block_wall_2", "y": 90 }, "facing=east,level=3,target=ceiling": { - "model": "create:threshold_switch/block_ceiling_3", + "model": "create:block/threshold_switch/block_ceiling_3", "y": 90 }, "facing=east,level=3,target=floor": { - "model": "create:threshold_switch/block_floor_3", + "model": "create:block/threshold_switch/block_floor_3", "y": 90 }, "facing=east,level=3,target=wall": { - "model": "create:threshold_switch/block_wall_3", + "model": "create:block/threshold_switch/block_wall_3", "y": 90 }, "facing=east,level=4,target=ceiling": { - "model": "create:threshold_switch/block_ceiling_4", + "model": "create:block/threshold_switch/block_ceiling_4", "y": 90 }, "facing=east,level=4,target=floor": { - "model": "create:threshold_switch/block_floor_4", + "model": "create:block/threshold_switch/block_floor_4", "y": 90 }, "facing=east,level=4,target=wall": { - "model": "create:threshold_switch/block_wall_4", + "model": "create:block/threshold_switch/block_wall_4", "y": 90 }, "facing=east,level=5,target=ceiling": { - "model": "create:threshold_switch/block_ceiling_5", + "model": "create:block/threshold_switch/block_ceiling_5", "y": 90 }, "facing=east,level=5,target=floor": { - "model": "create:threshold_switch/block_floor_5", + "model": "create:block/threshold_switch/block_floor_5", "y": 90 }, "facing=east,level=5,target=wall": { - "model": "create:threshold_switch/block_wall_5", + "model": "create:block/threshold_switch/block_wall_5", "y": 90 }, "facing=north,level=0,target=ceiling": { - "model": "create:threshold_switch/block_ceiling_0" + "model": "create:block/threshold_switch/block_ceiling_0" }, "facing=north,level=0,target=floor": { - "model": "create:threshold_switch/block_floor_0" + "model": "create:block/threshold_switch/block_floor_0" }, "facing=north,level=0,target=wall": { - "model": "create:threshold_switch/block_wall_0" + "model": "create:block/threshold_switch/block_wall_0" }, "facing=north,level=1,target=ceiling": { - "model": "create:threshold_switch/block_ceiling_1" + "model": "create:block/threshold_switch/block_ceiling_1" }, "facing=north,level=1,target=floor": { - "model": "create:threshold_switch/block_floor_1" + "model": "create:block/threshold_switch/block_floor_1" }, "facing=north,level=1,target=wall": { - "model": "create:threshold_switch/block_wall_1" + "model": "create:block/threshold_switch/block_wall_1" }, "facing=north,level=2,target=ceiling": { - "model": "create:threshold_switch/block_ceiling_2" + "model": "create:block/threshold_switch/block_ceiling_2" }, "facing=north,level=2,target=floor": { - "model": "create:threshold_switch/block_floor_2" + "model": "create:block/threshold_switch/block_floor_2" }, "facing=north,level=2,target=wall": { - "model": "create:threshold_switch/block_wall_2" + "model": "create:block/threshold_switch/block_wall_2" }, "facing=north,level=3,target=ceiling": { - "model": "create:threshold_switch/block_ceiling_3" + "model": "create:block/threshold_switch/block_ceiling_3" }, "facing=north,level=3,target=floor": { - "model": "create:threshold_switch/block_floor_3" + "model": "create:block/threshold_switch/block_floor_3" }, "facing=north,level=3,target=wall": { - "model": "create:threshold_switch/block_wall_3" + "model": "create:block/threshold_switch/block_wall_3" }, "facing=north,level=4,target=ceiling": { - "model": "create:threshold_switch/block_ceiling_4" + "model": "create:block/threshold_switch/block_ceiling_4" }, "facing=north,level=4,target=floor": { - "model": "create:threshold_switch/block_floor_4" + "model": "create:block/threshold_switch/block_floor_4" }, "facing=north,level=4,target=wall": { - "model": "create:threshold_switch/block_wall_4" + "model": "create:block/threshold_switch/block_wall_4" }, "facing=north,level=5,target=ceiling": { - "model": "create:threshold_switch/block_ceiling_5" + "model": "create:block/threshold_switch/block_ceiling_5" }, "facing=north,level=5,target=floor": { - "model": "create:threshold_switch/block_floor_5" + "model": "create:block/threshold_switch/block_floor_5" }, "facing=north,level=5,target=wall": { - "model": "create:threshold_switch/block_wall_5" + "model": "create:block/threshold_switch/block_wall_5" }, "facing=south,level=0,target=ceiling": { - "model": "create:threshold_switch/block_ceiling_0", + "model": "create:block/threshold_switch/block_ceiling_0", "y": 180 }, "facing=south,level=0,target=floor": { - "model": "create:threshold_switch/block_floor_0", + "model": "create:block/threshold_switch/block_floor_0", "y": 180 }, "facing=south,level=0,target=wall": { - "model": "create:threshold_switch/block_wall_0", + "model": "create:block/threshold_switch/block_wall_0", "y": 180 }, "facing=south,level=1,target=ceiling": { - "model": "create:threshold_switch/block_ceiling_1", + "model": "create:block/threshold_switch/block_ceiling_1", "y": 180 }, "facing=south,level=1,target=floor": { - "model": "create:threshold_switch/block_floor_1", + "model": "create:block/threshold_switch/block_floor_1", "y": 180 }, "facing=south,level=1,target=wall": { - "model": "create:threshold_switch/block_wall_1", + "model": "create:block/threshold_switch/block_wall_1", "y": 180 }, "facing=south,level=2,target=ceiling": { - "model": "create:threshold_switch/block_ceiling_2", + "model": "create:block/threshold_switch/block_ceiling_2", "y": 180 }, "facing=south,level=2,target=floor": { - "model": "create:threshold_switch/block_floor_2", + "model": "create:block/threshold_switch/block_floor_2", "y": 180 }, "facing=south,level=2,target=wall": { - "model": "create:threshold_switch/block_wall_2", + "model": "create:block/threshold_switch/block_wall_2", "y": 180 }, "facing=south,level=3,target=ceiling": { - "model": "create:threshold_switch/block_ceiling_3", + "model": "create:block/threshold_switch/block_ceiling_3", "y": 180 }, "facing=south,level=3,target=floor": { - "model": "create:threshold_switch/block_floor_3", + "model": "create:block/threshold_switch/block_floor_3", "y": 180 }, "facing=south,level=3,target=wall": { - "model": "create:threshold_switch/block_wall_3", + "model": "create:block/threshold_switch/block_wall_3", "y": 180 }, "facing=south,level=4,target=ceiling": { - "model": "create:threshold_switch/block_ceiling_4", + "model": "create:block/threshold_switch/block_ceiling_4", "y": 180 }, "facing=south,level=4,target=floor": { - "model": "create:threshold_switch/block_floor_4", + "model": "create:block/threshold_switch/block_floor_4", "y": 180 }, "facing=south,level=4,target=wall": { - "model": "create:threshold_switch/block_wall_4", + "model": "create:block/threshold_switch/block_wall_4", "y": 180 }, "facing=south,level=5,target=ceiling": { - "model": "create:threshold_switch/block_ceiling_5", + "model": "create:block/threshold_switch/block_ceiling_5", "y": 180 }, "facing=south,level=5,target=floor": { - "model": "create:threshold_switch/block_floor_5", + "model": "create:block/threshold_switch/block_floor_5", "y": 180 }, "facing=south,level=5,target=wall": { - "model": "create:threshold_switch/block_wall_5", + "model": "create:block/threshold_switch/block_wall_5", "y": 180 }, "facing=west,level=0,target=ceiling": { - "model": "create:threshold_switch/block_ceiling_0", + "model": "create:block/threshold_switch/block_ceiling_0", "y": 270 }, "facing=west,level=0,target=floor": { - "model": "create:threshold_switch/block_floor_0", + "model": "create:block/threshold_switch/block_floor_0", "y": 270 }, "facing=west,level=0,target=wall": { - "model": "create:threshold_switch/block_wall_0", + "model": "create:block/threshold_switch/block_wall_0", "y": 270 }, "facing=west,level=1,target=ceiling": { - "model": "create:threshold_switch/block_ceiling_1", + "model": "create:block/threshold_switch/block_ceiling_1", "y": 270 }, "facing=west,level=1,target=floor": { - "model": "create:threshold_switch/block_floor_1", + "model": "create:block/threshold_switch/block_floor_1", "y": 270 }, "facing=west,level=1,target=wall": { - "model": "create:threshold_switch/block_wall_1", + "model": "create:block/threshold_switch/block_wall_1", "y": 270 }, "facing=west,level=2,target=ceiling": { - "model": "create:threshold_switch/block_ceiling_2", + "model": "create:block/threshold_switch/block_ceiling_2", "y": 270 }, "facing=west,level=2,target=floor": { - "model": "create:threshold_switch/block_floor_2", + "model": "create:block/threshold_switch/block_floor_2", "y": 270 }, "facing=west,level=2,target=wall": { - "model": "create:threshold_switch/block_wall_2", + "model": "create:block/threshold_switch/block_wall_2", "y": 270 }, "facing=west,level=3,target=ceiling": { - "model": "create:threshold_switch/block_ceiling_3", + "model": "create:block/threshold_switch/block_ceiling_3", "y": 270 }, "facing=west,level=3,target=floor": { - "model": "create:threshold_switch/block_floor_3", + "model": "create:block/threshold_switch/block_floor_3", "y": 270 }, "facing=west,level=3,target=wall": { - "model": "create:threshold_switch/block_wall_3", + "model": "create:block/threshold_switch/block_wall_3", "y": 270 }, "facing=west,level=4,target=ceiling": { - "model": "create:threshold_switch/block_ceiling_4", + "model": "create:block/threshold_switch/block_ceiling_4", "y": 270 }, "facing=west,level=4,target=floor": { - "model": "create:threshold_switch/block_floor_4", + "model": "create:block/threshold_switch/block_floor_4", "y": 270 }, "facing=west,level=4,target=wall": { - "model": "create:threshold_switch/block_wall_4", + "model": "create:block/threshold_switch/block_wall_4", "y": 270 }, "facing=west,level=5,target=ceiling": { - "model": "create:threshold_switch/block_ceiling_5", + "model": "create:block/threshold_switch/block_ceiling_5", "y": 270 }, "facing=west,level=5,target=floor": { - "model": "create:threshold_switch/block_floor_5", + "model": "create:block/threshold_switch/block_floor_5", "y": 270 }, "facing=west,level=5,target=wall": { - "model": "create:threshold_switch/block_wall_5", + "model": "create:block/threshold_switch/block_wall_5", "y": 270 } } diff --git a/src/generated/resources/assets/create/models/threshold_switch/block_ceiling_0.json b/src/generated/resources/assets/create/models/block/threshold_switch/block_ceiling_0.json similarity index 100% rename from src/generated/resources/assets/create/models/threshold_switch/block_ceiling_0.json rename to src/generated/resources/assets/create/models/block/threshold_switch/block_ceiling_0.json diff --git a/src/generated/resources/assets/create/models/threshold_switch/block_ceiling_1.json b/src/generated/resources/assets/create/models/block/threshold_switch/block_ceiling_1.json similarity index 100% rename from src/generated/resources/assets/create/models/threshold_switch/block_ceiling_1.json rename to src/generated/resources/assets/create/models/block/threshold_switch/block_ceiling_1.json diff --git a/src/generated/resources/assets/create/models/threshold_switch/block_ceiling_2.json b/src/generated/resources/assets/create/models/block/threshold_switch/block_ceiling_2.json similarity index 100% rename from src/generated/resources/assets/create/models/threshold_switch/block_ceiling_2.json rename to src/generated/resources/assets/create/models/block/threshold_switch/block_ceiling_2.json diff --git a/src/generated/resources/assets/create/models/threshold_switch/block_ceiling_3.json b/src/generated/resources/assets/create/models/block/threshold_switch/block_ceiling_3.json similarity index 100% rename from src/generated/resources/assets/create/models/threshold_switch/block_ceiling_3.json rename to src/generated/resources/assets/create/models/block/threshold_switch/block_ceiling_3.json diff --git a/src/generated/resources/assets/create/models/threshold_switch/block_ceiling_4.json b/src/generated/resources/assets/create/models/block/threshold_switch/block_ceiling_4.json similarity index 100% rename from src/generated/resources/assets/create/models/threshold_switch/block_ceiling_4.json rename to src/generated/resources/assets/create/models/block/threshold_switch/block_ceiling_4.json diff --git a/src/generated/resources/assets/create/models/threshold_switch/block_ceiling_5.json b/src/generated/resources/assets/create/models/block/threshold_switch/block_ceiling_5.json similarity index 100% rename from src/generated/resources/assets/create/models/threshold_switch/block_ceiling_5.json rename to src/generated/resources/assets/create/models/block/threshold_switch/block_ceiling_5.json diff --git a/src/generated/resources/assets/create/models/threshold_switch/block_floor_0.json b/src/generated/resources/assets/create/models/block/threshold_switch/block_floor_0.json similarity index 100% rename from src/generated/resources/assets/create/models/threshold_switch/block_floor_0.json rename to src/generated/resources/assets/create/models/block/threshold_switch/block_floor_0.json diff --git a/src/generated/resources/assets/create/models/threshold_switch/block_floor_1.json b/src/generated/resources/assets/create/models/block/threshold_switch/block_floor_1.json similarity index 100% rename from src/generated/resources/assets/create/models/threshold_switch/block_floor_1.json rename to src/generated/resources/assets/create/models/block/threshold_switch/block_floor_1.json diff --git a/src/generated/resources/assets/create/models/threshold_switch/block_floor_2.json b/src/generated/resources/assets/create/models/block/threshold_switch/block_floor_2.json similarity index 100% rename from src/generated/resources/assets/create/models/threshold_switch/block_floor_2.json rename to src/generated/resources/assets/create/models/block/threshold_switch/block_floor_2.json diff --git a/src/generated/resources/assets/create/models/threshold_switch/block_floor_3.json b/src/generated/resources/assets/create/models/block/threshold_switch/block_floor_3.json similarity index 100% rename from src/generated/resources/assets/create/models/threshold_switch/block_floor_3.json rename to src/generated/resources/assets/create/models/block/threshold_switch/block_floor_3.json diff --git a/src/generated/resources/assets/create/models/threshold_switch/block_floor_4.json b/src/generated/resources/assets/create/models/block/threshold_switch/block_floor_4.json similarity index 100% rename from src/generated/resources/assets/create/models/threshold_switch/block_floor_4.json rename to src/generated/resources/assets/create/models/block/threshold_switch/block_floor_4.json diff --git a/src/generated/resources/assets/create/models/threshold_switch/block_floor_5.json b/src/generated/resources/assets/create/models/block/threshold_switch/block_floor_5.json similarity index 100% rename from src/generated/resources/assets/create/models/threshold_switch/block_floor_5.json rename to src/generated/resources/assets/create/models/block/threshold_switch/block_floor_5.json diff --git a/src/generated/resources/assets/create/models/threshold_switch/block_wall_0.json b/src/generated/resources/assets/create/models/block/threshold_switch/block_wall_0.json similarity index 100% rename from src/generated/resources/assets/create/models/threshold_switch/block_wall_0.json rename to src/generated/resources/assets/create/models/block/threshold_switch/block_wall_0.json diff --git a/src/generated/resources/assets/create/models/threshold_switch/block_wall_1.json b/src/generated/resources/assets/create/models/block/threshold_switch/block_wall_1.json similarity index 100% rename from src/generated/resources/assets/create/models/threshold_switch/block_wall_1.json rename to src/generated/resources/assets/create/models/block/threshold_switch/block_wall_1.json diff --git a/src/generated/resources/assets/create/models/threshold_switch/block_wall_2.json b/src/generated/resources/assets/create/models/block/threshold_switch/block_wall_2.json similarity index 100% rename from src/generated/resources/assets/create/models/threshold_switch/block_wall_2.json rename to src/generated/resources/assets/create/models/block/threshold_switch/block_wall_2.json diff --git a/src/generated/resources/assets/create/models/threshold_switch/block_wall_3.json b/src/generated/resources/assets/create/models/block/threshold_switch/block_wall_3.json similarity index 100% rename from src/generated/resources/assets/create/models/threshold_switch/block_wall_3.json rename to src/generated/resources/assets/create/models/block/threshold_switch/block_wall_3.json diff --git a/src/generated/resources/assets/create/models/threshold_switch/block_wall_4.json b/src/generated/resources/assets/create/models/block/threshold_switch/block_wall_4.json similarity index 100% rename from src/generated/resources/assets/create/models/threshold_switch/block_wall_4.json rename to src/generated/resources/assets/create/models/block/threshold_switch/block_wall_4.json diff --git a/src/generated/resources/assets/create/models/threshold_switch/block_wall_5.json b/src/generated/resources/assets/create/models/block/threshold_switch/block_wall_5.json similarity index 100% rename from src/generated/resources/assets/create/models/threshold_switch/block_wall_5.json rename to src/generated/resources/assets/create/models/block/threshold_switch/block_wall_5.json diff --git a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java index e507d8eeb6..2bbcc0c19e 100644 --- a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java +++ b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java @@ -538,7 +538,6 @@ public class AllBlockEntityTypes { public static final BlockEntityEntry PACKAGER_LINK = REGISTRATE .blockEntity("packager_link", PackagerLinkBlockEntity::new) .validBlocks(AllBlocks.STOCK_LINK) - .renderer(() -> LinkBulbRenderer::new) .register(); public static final BlockEntityEntry STOCK_TICKER = REGISTRATE diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index e82b7d1875..8b6bb9592c 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -1935,8 +1935,9 @@ public class AllBlocks { REGISTRATE.block("redstone_requester", RedstoneRequesterBlock::new) .initialProperties(SharedProperties::stone) .properties(p -> p.sound(SoundType.WOOD)) + .properties(p -> p.noOcclusion()) .transform(axeOrPickaxe()) - .blockstate((c, p) -> BlockStateGen.simpleBlock(c, p, AssetLookup.forPowered(c, p))) + .blockstate((c, p) -> BlockStateGen.horizontalAxisBlock(c, p, AssetLookup.forPowered(c, p))) .item(RedstoneRequesterBlockItem::new) .transform(customItemModel("_", "block")) .register(); diff --git a/src/main/java/com/simibubi/create/AllShapes.java b/src/main/java/com/simibubi/create/AllShapes.java index 3c39d322f3..73350e5dc3 100644 --- a/src/main/java/com/simibubi/create/AllShapes.java +++ b/src/main/java/com/simibubi/create/AllShapes.java @@ -157,6 +157,7 @@ public class AllShapes { DATA_GATHERER = shape(1, 0, 1, 15, 6, 15).add(3, 5, 3, 13, 9, 13) .forDirectional(), + STOCK_LINK = shape(1, 0, 1, 15, 6, 15).forDirectional(), STEAM_ENGINE = shape(1, 0, 1, 15, 3, 15).add(3, 0, 3, 13, 15, 13) .add(1, 5, 4, 15, 13, 12) diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlock.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlock.java index d02387217f..55c883af39 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlock.java @@ -93,7 +93,7 @@ public class PackagerLinkBlock extends WrenchableDirectionalBlock @Override public VoxelShape getShape(BlockState pState, BlockGetter pLevel, BlockPos pPos, CollisionContext pContext) { - return AllShapes.DATA_GATHERER.get(pState.getValue(FACING)); + return AllShapes.STOCK_LINK.get(pState.getValue(FACING)); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlock.java b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlock.java index 800bab0049..41a628633a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlock.java @@ -5,6 +5,7 @@ import java.util.List; import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllTags.AllItemTags; +import com.simibubi.create.content.equipment.wrench.IWrenchable; import com.simibubi.create.content.logistics.BigItemStack; import com.simibubi.create.content.logistics.stockTicker.PackageOrder; import com.simibubi.create.content.logistics.stockTicker.StockTickerBlockEntity; @@ -14,6 +15,7 @@ import com.simibubi.create.foundation.utility.CreateLang; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.core.Direction.Axis; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; @@ -25,6 +27,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.SignalGetter; import net.minecraft.world.level.block.Block; @@ -32,11 +35,14 @@ import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.level.pathfinder.PathComputationType; import net.minecraft.world.phys.BlockHitResult; -public class RedstoneRequesterBlock extends Block implements IBE { +public class RedstoneRequesterBlock extends Block implements IBE, IWrenchable { public static final BooleanProperty POWERED = BlockStateProperties.POWERED; + public static final EnumProperty AXIS = BlockStateProperties.HORIZONTAL_AXIS; public RedstoneRequesterBlock(Properties pProperties) { super(pProperties); @@ -46,7 +52,7 @@ public class RedstoneRequesterBlock extends Block implements IBE pBuilder) { - super.createBlockStateDefinition(pBuilder.add(POWERED)); + super.createBlockStateDefinition(pBuilder.add(POWERED, AXIS)); } @Override @@ -54,8 +60,10 @@ public class RedstoneRequesterBlock extends Block implements IBE ModelFile getModel(DataGenContext ctx, RegistrateBlockstateProvider prov, BlockState state) { int level = state.getValue(ThresholdSwitchBlock.LEVEL); - String path = "threshold_switch/block_" + Lang.asId(state.getValue(ThresholdSwitchBlock.TARGET) + String path = "block/threshold_switch/block_" + Lang.asId(state.getValue(ThresholdSwitchBlock.TARGET) .name()); return prov.models() - .withExistingParent(path + "_" + level, Create.asResource("block/" + path)) + .withExistingParent(path + "_" + level, Create.asResource(path)) .texture("level", Create.asResource("block/threshold_switch/level_" + level)); } diff --git a/src/main/resources/assets/create/models/block/packager/block.json b/src/main/resources/assets/create/models/block/packager/block.json index 0dc6dbfeb3..80ea4f629f 100644 --- a/src/main/resources/assets/create/models/block/packager/block.json +++ b/src/main/resources/assets/create/models/block/packager/block.json @@ -1,74 +1,99 @@ { "credit": "Made with Blockbench", + "parent": "block/block", "textures": { - "0": "create:block/packager_block", - "3": "create:block/axis", - "particle": "create:block/packager_block" + "0": "create:block/packager_frame", + "1": "create:block/packager_details", + "2": "create:block/packager_horizontal_unpowered", + "particle": "create:block/packager_particle" }, "elements": [ { - "name": "exterior", + "name": "frame", "from": [0, 0, 0], "to": [16, 16, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [8, 0, 16, 8], "texture": "#0"}, - "east": {"uv": [8, 0, 16, 8], "texture": "#0"}, - "south": {"uv": [8, 0, 16, 8], "texture": "#0"}, - "west": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "north": {"uv": [0, 0, 8, 8], "texture": "#2"}, + "east": {"uv": [0, 0, 8, 8], "texture": "#2"}, + "south": {"uv": [0, 0, 8, 8], "texture": "#2"}, + "west": {"uv": [0, 0, 8, 8], "texture": "#2"}, "up": {"uv": [0, 0, 8, 8], "texture": "#0"}, - "down": {"uv": [0, 8, 8, 16], "texture": "#0"} + "down": {"uv": [8, 0, 16, 8], "texture": "#0"} } }, { - "name": "interior", - "from": [15.95, 0.05, 0.05], - "to": [0.05, 15.95, 15.95], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "name": "frame_interior", + "from": [0.1, 0.1, 15.9], + "to": [15.9, 15.9, 0.1], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 16]}, "faces": { - "north": {"uv": [8, 0, 16, 8], "texture": "#0"}, - "east": {"uv": [8, 0, 16, 8], "texture": "#0"}, - "south": {"uv": [8, 0, 16, 8], "texture": "#0"}, - "west": {"uv": [8, 0, 16, 8], "texture": "#0"}, - "up": {"uv": [0, 0, 8, 8], "texture": "#0"}, + "north": {"uv": [8, 8, 16, 16], "texture": "#0"}, + "east": {"uv": [8, 8, 16, 16], "texture": "#0"}, + "south": {"uv": [8, 8, 16, 16], "texture": "#0"}, + "west": {"uv": [8, 8, 16, 16], "texture": "#0"}, + "up": {"uv": [0, 8, 8, 16], "texture": "#0"}, "down": {"uv": [0, 8, 8, 16], "texture": "#0"} } }, { "from": [4, 1, 0], "to": [6, 3, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "rotation": {"angle": 0, "axis": "y", "origin": [4, 1, 0]}, "faces": { - "east": {"uv": [7, 0, 9, 16], "rotation": 90, "texture": "#3"}, - "west": {"uv": [7, 0, 9, 16], "rotation": 270, "texture": "#3"}, - "up": {"uv": [7, 0, 9, 16], "texture": "#3"}, - "down": {"uv": [9, 0, 7, 16], "texture": "#3"} + "east": {"uv": [12.5, 8, 13.5, 16], "rotation": 90, "texture": "#1"}, + "west": {"uv": [12.5, 8, 13.5, 16], "rotation": 90, "texture": "#1"}, + "up": {"uv": [12.5, 8, 13.5, 16], "texture": "#1"}, + "down": {"uv": [12.5, 8, 13.5, 16], "texture": "#1"} } }, { "from": [10, 1, 0], "to": [12, 3, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "rotation": {"angle": 0, "axis": "y", "origin": [10, 1, 0]}, "faces": { - "east": {"uv": [7, 0, 9, 16], "rotation": 90, "texture": "#3"}, - "west": {"uv": [7, 0, 9, 16], "rotation": 270, "texture": "#3"}, - "up": {"uv": [7, 0, 9, 16], "texture": "#3"}, - "down": {"uv": [9, 0, 7, 16], "texture": "#3"} + "east": {"uv": [12.5, 8, 13.5, 16], "rotation": 90, "texture": "#1"}, + "west": {"uv": [12.5, 8, 13.5, 16], "rotation": 90, "texture": "#1"}, + "up": {"uv": [12.5, 8, 13.5, 16], "texture": "#1"}, + "down": {"uv": [12.5, 8, 13.5, 16], "texture": "#1"} + } + }, + { + "from": [0, 4, 0], + "to": [16, 4, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 4, 0]}, + "faces": { + "up": {"uv": [8, 0, 16, 8], "texture": "#2"} + } + }, + { + "from": [1.9, 4, 0.9], + "to": [14.1, 0, 14.1], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 4, 1]}, + "faces": { + "east": {"uv": [8.5, 2, 15, 0], "texture": "#1"}, + "south": {"uv": [9, 6, 15, 4], "texture": "#1"}, + "west": {"uv": [8.5, 2, 15, 0], "texture": "#1"} } } ], "groups": [ { - "name": "Main Block", + "name": "frame", "origin": [0, 0, 0], "color": 0, "children": [0, 1] }, { - "name": "Rails Horizontal", - "origin": [0, 0, 0], + "name": "tracks", + "origin": [8, 8, 8], "color": 0, "children": [2, 3] + }, + { + "name": "interior", + "origin": [8, 8, 8], + "color": 0, + "children": [4, 5] } ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/packager/block_powered.json b/src/main/resources/assets/create/models/block/packager/block_powered.json index 7feebe1734..07ec419290 100644 --- a/src/main/resources/assets/create/models/block/packager/block_powered.json +++ b/src/main/resources/assets/create/models/block/packager/block_powered.json @@ -1,7 +1,6 @@ { "parent": "create:block/packager/block", "textures": { - "0": "create:block/packager_block_powered", - "particle": "create:block/packager_block_powered" + "2": "create:block/packager_horizontal_powered" } } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/packager/block_vertical.json b/src/main/resources/assets/create/models/block/packager/block_vertical.json index 9433ce5e21..2182a609f1 100644 --- a/src/main/resources/assets/create/models/block/packager/block_vertical.json +++ b/src/main/resources/assets/create/models/block/packager/block_vertical.json @@ -1,96 +1,121 @@ { "credit": "Made with Blockbench", "textures": { - "0": "create:block/packager_block", - "3": "create:block/axis", - "particle": "create:block/packager_block" + "0": "create:block/packager_frame", + "1": "create:block/packager_details", + "5": "create:block/packager_vertical_unpowered", + "particle": "create:block/packager_particle" }, "elements": [ { - "name": "exterior", + "name": "frame", "from": [0, 0, 0], "to": [16, 16, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [8, 0, 16, 8], "texture": "#0"}, - "east": {"uv": [8, 0, 16, 8], "texture": "#0"}, - "south": {"uv": [8, 0, 16, 8], "texture": "#0"}, - "west": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "north": {"uv": [0, 0, 8, 8], "texture": "#5"}, + "east": {"uv": [0, 0, 8, 8], "texture": "#5"}, + "south": {"uv": [0, 0, 8, 8], "texture": "#5"}, + "west": {"uv": [0, 0, 8, 8], "texture": "#5"}, "up": {"uv": [0, 0, 8, 8], "texture": "#0"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#0"} + } + }, + { + "name": "frame_interior", + "from": [0.1, 0.1, 15.9], + "to": [15.9, 15.9, 0.1], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 16]}, + "faces": { + "north": {"uv": [8, 8, 16, 16], "texture": "#0"}, + "east": {"uv": [8, 8, 16, 16], "texture": "#0"}, + "south": {"uv": [8, 8, 16, 16], "texture": "#0"}, + "west": {"uv": [8, 8, 16, 16], "texture": "#0"}, + "up": {"uv": [0, 8, 8, 16], "texture": "#0"}, "down": {"uv": [0, 8, 8, 16], "texture": "#0"} } }, { - "name": "interior", - "from": [15.95, 0.05, 0.05], - "to": [0.05, 15.95, 15.95], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "from": [1, 0, 1], + "to": [3, 16, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [1, 16, 1]}, "faces": { - "north": {"uv": [8, 0, 16, 8], "texture": "#0"}, - "east": {"uv": [8, 0, 16, 8], "texture": "#0"}, - "south": {"uv": [8, 0, 16, 8], "texture": "#0"}, - "west": {"uv": [8, 0, 16, 8], "texture": "#0"}, - "up": {"uv": [0, 0, 8, 8], "texture": "#0"}, - "down": {"uv": [0, 8, 8, 16], "texture": "#0"} + "north": {"uv": [12.5, 8, 13.5, 16], "rotation": 180, "texture": "#1"}, + "east": {"uv": [12.5, 8, 13.5, 16], "texture": "#1"}, + "south": {"uv": [12.5, 8, 13.5, 16], "texture": "#1"}, + "west": {"uv": [12.5, 8, 13.5, 16], "rotation": 180, "texture": "#1"} } }, { - "from": [13.5, 0, 0.5], - "to": [15.5, 16, 2.5], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "from": [13, 0, 1], + "to": [15, 16, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [13, 16, 1]}, "faces": { - "north": {"uv": [9, 0, 7, 16], "rotation": 180, "texture": "#3"}, - "east": {"uv": [7, 0, 9, 16], "texture": "#3"}, - "south": {"uv": [7, 0, 9, 16], "texture": "#3"}, - "west": {"uv": [7, 0, 9, 16], "texture": "#3"} + "north": {"uv": [12.5, 8, 13.5, 16], "rotation": 180, "texture": "#1"}, + "east": {"uv": [12.5, 8, 13.5, 16], "texture": "#1"}, + "south": {"uv": [12.5, 8, 13.5, 16], "texture": "#1"}, + "west": {"uv": [12.5, 8, 13.5, 16], "rotation": 180, "texture": "#1"} } }, { - "from": [0.5, 0, 0.5], - "to": [2.5, 16, 2.5], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "from": [1, 0, 13], + "to": [3, 16, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [1, 16, 13]}, "faces": { - "north": {"uv": [9, 0, 7, 16], "rotation": 180, "texture": "#3"}, - "east": {"uv": [7, 0, 9, 16], "texture": "#3"}, - "south": {"uv": [7, 0, 9, 16], "texture": "#3"}, - "west": {"uv": [7, 0, 9, 16], "texture": "#3"} + "north": {"uv": [12.5, 8, 13.5, 16], "rotation": 180, "texture": "#1"}, + "east": {"uv": [12.5, 8, 13.5, 16], "texture": "#1"}, + "south": {"uv": [12.5, 8, 13.5, 16], "texture": "#1"}, + "west": {"uv": [12.5, 8, 13.5, 16], "rotation": 180, "texture": "#1"} } }, { - "from": [13.5, 0, 13.5], - "to": [15.5, 16, 15.5], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "from": [13, 0, 13], + "to": [15, 16, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [13, 16, 13]}, "faces": { - "north": {"uv": [9, 0, 7, 16], "rotation": 180, "texture": "#3"}, - "east": {"uv": [7, 0, 9, 16], "texture": "#3"}, - "south": {"uv": [7, 0, 9, 16], "texture": "#3"}, - "west": {"uv": [7, 0, 9, 16], "texture": "#3"} + "north": {"uv": [12.5, 8, 13.5, 16], "rotation": 180, "texture": "#1"}, + "east": {"uv": [12.5, 8, 13.5, 16], "texture": "#1"}, + "south": {"uv": [12.5, 8, 13.5, 16], "texture": "#1"}, + "west": {"uv": [12.5, 8, 13.5, 16], "rotation": 180, "texture": "#1"} } }, { - "from": [0.5, 0, 13.5], - "to": [2.5, 16, 15.5], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "from": [0, 4, 0], + "to": [16, 4, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 4, 0]}, "faces": { - "north": {"uv": [9, 0, 7, 16], "rotation": 180, "texture": "#3"}, - "east": {"uv": [7, 0, 9, 16], "texture": "#3"}, - "south": {"uv": [7, 0, 9, 16], "texture": "#3"}, - "west": {"uv": [7, 0, 9, 16], "texture": "#3"} + "up": {"uv": [8, 0, 16, 8], "texture": "#5"} + } + }, + { + "from": [1.9, 4, 1.9], + "to": [14.1, 0, 14.1], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 4, 2]}, + "faces": { + "north": {"uv": [9, 6, 15, 4], "texture": "#1"}, + "east": {"uv": [9, 6, 15, 4], "texture": "#1"}, + "south": {"uv": [9, 6, 15, 4], "texture": "#1"}, + "west": {"uv": [9, 6, 15, 4], "texture": "#1"} } } ], "groups": [ { - "name": "Main Block", + "name": "frame", "origin": [0, 0, 0], "color": 0, "children": [0, 1] }, { - "name": "Rails vertical", - "origin": [0, 0, 0], + "name": "tracks", + "origin": [8, 8, 8], "color": 0, "children": [2, 3, 4, 5] + }, + { + "name": "interior", + "origin": [8, 8, 8], + "color": 0, + "children": [6, 7] } ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/packager/block_vertical_powered.json b/src/main/resources/assets/create/models/block/packager/block_vertical_powered.json index 9118c59d10..7463a153a1 100644 --- a/src/main/resources/assets/create/models/block/packager/block_vertical_powered.json +++ b/src/main/resources/assets/create/models/block/packager/block_vertical_powered.json @@ -1,7 +1,6 @@ { "parent": "create:block/packager/block_vertical", "textures": { - "0": "create:block/packager_block_powered", - "particle": "create:block/packager_block_powered" + "5": "create:block/packager_vertical_powered" } } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/packager/hatch_closed.json b/src/main/resources/assets/create/models/block/packager/hatch_closed.json index 355858bf2d..a0868fceed 100644 --- a/src/main/resources/assets/create/models/block/packager/hatch_closed.json +++ b/src/main/resources/assets/create/models/block/packager/hatch_closed.json @@ -1,28 +1,29 @@ { "credit": "Made with Blockbench", "textures": { - "0": "create:block/packager_block", - "1": "create:block/packager_door_closed" + "1": "create:block/packager_details", + "3": "create:block/packager_iris_closed", + "particle": "create:block/vault/vault_front_small" }, "elements": [ { "from": [1.05, 1.05, 7], "to": [14.95, 14.95, 10.05], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "rotation": {"angle": 0, "axis": "y", "origin": [1, 1, -2]}, "faces": { - "north": {"uv": [1, 1, 15, 15], "texture": "#1"}, - "east": {"uv": [8, 15.5, 9.5, 8.5], "texture": "#0"}, - "south": {"uv": [15, 1, 1, 15], "texture": "#1"}, - "west": {"uv": [8, 15.5, 9.5, 8.5], "texture": "#0"}, - "up": {"uv": [8, 15.5, 9.5, 8.5], "rotation": 90, "texture": "#0"}, - "down": {"uv": [8, 15.5, 9.5, 8.5], "rotation": 90, "texture": "#0"} + "north": {"uv": [1, 1, 15, 15], "texture": "#3"}, + "east": {"uv": [8, 8.5, 9.5, 15.5], "texture": "#1"}, + "south": {"uv": [1, 1, 15, 15], "texture": "#3"}, + "west": {"uv": [8, 8.5, 9.5, 15.5], "texture": "#1"}, + "up": {"uv": [8, 8.5, 9.5, 15.5], "rotation": 90, "texture": "#1"}, + "down": {"uv": [8, 8.5, 9.5, 15.5], "rotation": 90, "texture": "#1"} } } ], "groups": [ { - "name": "Door", - "origin": [0, 0, 0], + "name": "door", + "origin": [8, 8, 8], "color": 0, "children": [0] } diff --git a/src/main/resources/assets/create/models/block/packager/hatch_open.json b/src/main/resources/assets/create/models/block/packager/hatch_open.json index 4c8f540e07..b264568e12 100644 --- a/src/main/resources/assets/create/models/block/packager/hatch_open.json +++ b/src/main/resources/assets/create/models/block/packager/hatch_open.json @@ -1,6 +1,6 @@ { "parent": "create:block/packager/hatch_closed", "textures": { - "1": "create:block/packager_door_open" + "3": "create:block/packager_iris_open" } } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/packager/item.json b/src/main/resources/assets/create/models/block/packager/item.json index 2a3af21094..d93e51c521 100644 --- a/src/main/resources/assets/create/models/block/packager/item.json +++ b/src/main/resources/assets/create/models/block/packager/item.json @@ -1,61 +1,40 @@ { - "credit": "Made with Blockbench", "parent": "block/block", + "credit": "Made with Blockbench", "textures": { - "1": "create:block/packager_block", - "2": "create:block/packager_door_closed", - "3": "create:block/axis", - "particle": "create:block/packager_block" + "0": "create:block/packager_frame", + "1": "create:block/packager_details", + "2": "create:block/packager_horizontal_unpowered", + "3": "create:block/packager_iris_closed", + "particle": "create:block/packager_particle" }, "elements": [ { - "name": "exterior", + "name": "frame", "from": [0, 0, 0], "to": [16, 16, 16], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [8, 0, 16, 8], "texture": "#1"}, - "east": {"uv": [8, 0, 16, 8], "texture": "#1"}, - "south": {"uv": [8, 0, 16, 8], "texture": "#1"}, - "west": {"uv": [8, 0, 16, 8], "texture": "#1"}, - "up": {"uv": [0, 0, 8, 8], "rotation": 180, "texture": "#1"}, - "down": {"uv": [0, 8, 8, 16], "rotation": 180, "texture": "#1"} + "north": {"uv": [0, 0, 8, 8], "texture": "#2"}, + "east": {"uv": [0, 0, 8, 8], "texture": "#2"}, + "south": {"uv": [0, 0, 8, 8], "texture": "#2"}, + "west": {"uv": [0, 0, 8, 8], "texture": "#2"}, + "up": {"uv": [0, 0, 8, 8], "rotation": 180, "texture": "#0"}, + "down": {"uv": [8, 0, 16, 8], "rotation": 180, "texture": "#0"} } }, { - "name": "interior", - "from": [16, 0, 0], - "to": [0, 16, 16], + "name": "frame_interior", + "from": [0.1, 0.1, 15.9], + "to": [15.9, 15.9, 0.1], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [8, 0, 16, 8], "texture": "#1"}, - "east": {"uv": [8, 0, 16, 8], "texture": "#1"}, - "south": {"uv": [8, 0, 16, 8], "texture": "#1"}, - "west": {"uv": [8, 0, 16, 8], "texture": "#1"}, - "up": {"uv": [0, 0, 8, 8], "rotation": 180, "texture": "#1"}, - "down": {"uv": [0, 8, 8, 16], "rotation": 180, "texture": "#1"} - } - }, - { - "from": [10, 1, 0], - "to": [12, 3, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "east": {"uv": [7, 0, 9, 16], "rotation": 270, "texture": "#3"}, - "west": {"uv": [7, 0, 9, 16], "rotation": 90, "texture": "#3"}, - "up": {"uv": [7, 0, 9, 16], "rotation": 180, "texture": "#3"}, - "down": {"uv": [9, 0, 7, 16], "rotation": 180, "texture": "#3"} - } - }, - { - "from": [4, 1, 0], - "to": [6, 3, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "east": {"uv": [7, 0, 9, 16], "rotation": 270, "texture": "#3"}, - "west": {"uv": [7, 0, 9, 16], "rotation": 90, "texture": "#3"}, - "up": {"uv": [7, 0, 9, 16], "rotation": 180, "texture": "#3"}, - "down": {"uv": [9, 0, 7, 16], "rotation": 180, "texture": "#3"} + "north": {"uv": [8, 8, 16, 16], "texture": "#0"}, + "east": {"uv": [8, 8, 16, 16], "texture": "#0"}, + "south": {"uv": [8, 8, 16, 16], "texture": "#0"}, + "west": {"uv": [8, 8, 16, 16], "texture": "#0"}, + "up": {"uv": [0, 8, 8, 16], "rotation": 180, "texture": "#0"}, + "down": {"uv": [0, 8, 8, 16], "rotation": 180, "texture": "#0"} } }, { @@ -63,58 +42,98 @@ "to": [15, 15, 18], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [15, 1, 1, 15], "texture": "#2"}, - "east": {"uv": [8, 15.5, 9.5, 8.5], "texture": "#1"}, - "south": {"uv": [1, 1, 15, 15], "texture": "#2"}, - "west": {"uv": [8, 15.5, 9.5, 8.5], "texture": "#1"}, - "up": {"uv": [8, 15.5, 9.5, 8.5], "rotation": 270, "texture": "#1"}, - "down": {"uv": [8, 15.5, 9.5, 8.5], "rotation": 270, "texture": "#1"} + "north": {"uv": [1, 1, 15, 15], "texture": "#3"}, + "east": {"uv": [8, 8.5, 9.5, 15.5], "texture": "#1"}, + "south": {"uv": [1, 1, 15, 15], "texture": "#3"}, + "west": {"uv": [8, 8.5, 9.5, 15.5], "texture": "#1"}, + "up": {"uv": [8, 8.5, 9.5, 15.5], "rotation": 270, "texture": "#1"}, + "down": {"uv": [8, 8.5, 9.5, 15.5], "rotation": 270, "texture": "#1"} } }, { - "from": [2, 2, 1.5], - "to": [14, 4, 14.5], + "from": [10, 1, 0], + "to": [12, 3, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [9.5, 15, 15.5, 16], "texture": "#1"}, - "east": {"uv": [15, 9, 16, 15.5], "rotation": 90, "texture": "#1"}, - "south": {"uv": [9.5, 15, 15.5, 16], "texture": "#1"}, - "west": {"uv": [15, 9, 16, 15.5], "rotation": 90, "texture": "#1"}, - "up": {"uv": [9.5, 9, 15.5, 15.5], "texture": "#1"}, - "down": {"uv": [9.5, 9, 15.5, 15.5], "texture": "#1"} + "east": {"uv": [12.5, 8, 13.5, 16], "rotation": 90, "texture": "#1"}, + "west": {"uv": [12.5, 8, 13.5, 16], "rotation": 90, "texture": "#1"}, + "up": {"uv": [12.5, 8, 13.5, 16], "rotation": 180, "texture": "#1"}, + "down": {"uv": [12.5, 8, 13.5, 16], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [4, 1, 0], + "to": [6, 3, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "east": {"uv": [12.5, 8, 13.5, 16], "rotation": 90, "texture": "#1"}, + "west": {"uv": [12.5, 8, 13.5, 16], "rotation": 90, "texture": "#1"}, + "up": {"uv": [12.5, 8, 13.5, 16], "rotation": 180, "texture": "#1"}, + "down": {"uv": [12.5, 8, 13.5, 16], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [2, 2, 2], + "to": [14, 4, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [1, 6.5, 7, 7.5], "texture": "#1"}, + "east": {"uv": [1, 6.5, 7, 7.5], "texture": "#1"}, + "south": {"uv": [1, 6.5, 7, 7.5], "texture": "#1"}, + "west": {"uv": [1, 6.5, 7, 7.5], "texture": "#1"}, + "up": {"uv": [1, 1, 7, 7], "rotation": 180, "texture": "#1"}, + "down": {"uv": [1, 1, 7, 7], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [0, 4, 0], + "to": [16, 4, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "up": {"uv": [8, 0, 16, 8], "rotation": 180, "texture": "#2"} + } + }, + { + "from": [1.9, 4, 1.9], + "to": [14.1, 0, 15.1], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [9, 6, 15, 4], "texture": "#1"}, + "east": {"uv": [8.5, 2, 15, 0], "texture": "#1"}, + "west": {"uv": [8.5, 2, 15, 0], "texture": "#1"} } } ], "groups": [ { - "name": "Main Block", + "name": "frame", "origin": [0, 0, 0], "color": 0, "children": [0, 1] }, { - "name": "Rails Horizontal", - "origin": [0, 0, 0], - "color": 0, - "children": [2, 3] - }, - { - "name": "Door", - "origin": [0, 0, 0], - "color": 0, - "children": [4] - }, - { - "name": "tray_regular", + "name": "door", "origin": [8, 8, 8], "color": 0, - "children": [ - { - "name": "Tray", - "origin": [0, 0, 0], - "color": 0, - "children": [5] - } - ] + "children": [2] + }, + { + "name": "tracks", + "origin": [8, 8, 8], + "color": 0, + "children": [3, 4] + }, + { + "name": "sled", + "origin": [8, 8, 8], + "color": 0, + "children": [5] + }, + { + "name": "interior", + "origin": [8, 8, 8], + "color": 0, + "children": [6, 7] } ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/packager/tray.json b/src/main/resources/assets/create/models/block/packager/tray.json index 0c30ea499a..8fe778bb0f 100644 --- a/src/main/resources/assets/create/models/block/packager/tray.json +++ b/src/main/resources/assets/create/models/block/packager/tray.json @@ -1,28 +1,28 @@ { "credit": "Made with Blockbench", - "texture_size": [32, 32], + "render_type": "cutout", "textures": { - "1": "create:block/packager_block", - "particle": "create:block/packager_block" + "1": "create:block/packager_details" }, "elements": [ { - "from": [2, 2, 1.5], - "to": [14, 4, 14.5], + "from": [2, 2, 2], + "to": [14, 4, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 2, 2]}, "faces": { - "north": {"uv": [9.5, 15, 15.5, 16], "texture": "#1"}, - "east": {"uv": [15, 9, 16, 15.5], "rotation": 90, "texture": "#1"}, - "south": {"uv": [9.5, 15, 15.5, 16], "texture": "#1"}, - "west": {"uv": [15, 9, 16, 15.5], "rotation": 90, "texture": "#1"}, - "up": {"uv": [9.5, 9, 15.5, 15.5], "texture": "#1"}, - "down": {"uv": [9.5, 9, 15.5, 15.5], "texture": "#1"} + "north": {"uv": [1, 6.5, 7, 7.5], "texture": "#1"}, + "east": {"uv": [1, 6.5, 7, 7.5], "texture": "#1"}, + "south": {"uv": [1, 6.5, 7, 7.5], "texture": "#1"}, + "west": {"uv": [1, 6.5, 7, 7.5], "texture": "#1"}, + "up": {"uv": [1, 1, 7, 7], "texture": "#1"}, + "down": {"uv": [1, 1, 7, 7], "texture": "#1"} } } ], "groups": [ { - "name": "Tray", - "origin": [0, 0, 0], + "name": "sled", + "origin": [8, 8, 8], "color": 0, "children": [0] } diff --git a/src/main/resources/assets/create/models/block/redstone_requester/block.json b/src/main/resources/assets/create/models/block/redstone_requester/block.json index d64305fff7..84db4ee1e7 100644 --- a/src/main/resources/assets/create/models/block/redstone_requester/block.json +++ b/src/main/resources/assets/create/models/block/redstone_requester/block.json @@ -1,22 +1,35 @@ { - "parent": "block/block", "credit": "Made with Blockbench", + "parent": "block/block", "textures": { - "0": "create:block/redstone_requester_side", - "2": "create:block/redstone_requester_top", - "particle": "create:block/redstone_requester_side" + "0": "create:block/redstone_requester", + "1": "create:block/redstone_requester_unpowered", + "particle": "create:block/redstone_requester_unpowered" }, "elements": [ { - "from": [0, 0, 0], + "from": [0, 2, 0], "to": [16, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 2, 0]}, "faces": { - "north": {"uv": [0, 0, 16, 16], "texture": "#0", "cullface": "north"}, - "east": {"uv": [0, 0, 16, 16], "texture": "#0", "cullface": "east"}, - "south": {"uv": [0, 0, 16, 16], "texture": "#0", "cullface": "south"}, - "west": {"uv": [0, 0, 16, 16], "texture": "#0", "cullface": "west"}, - "up": {"uv": [0, 0, 16, 16], "texture": "#2", "cullface": "up"}, - "down": {"uv": [0, 0, 16, 16], "texture": "#2", "cullface": "down"} + "north": {"uv": [0, 0, 8, 7], "texture": "#0"}, + "east": {"uv": [0, 2, 16, 16], "texture": "#1"}, + "south": {"uv": [0, 0, 8, 7], "texture": "#0"}, + "west": {"uv": [0, 2, 16, 16], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "rotation": 90, "texture": "#0"}, + "down": {"uv": [8, 8, 16, 16], "texture": "#0"} + } + }, + { + "from": [1, 0, 1], + "to": [15, 2, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [1, 0, 1]}, + "faces": { + "north": {"uv": [0.5, 7, 7.5, 8], "texture": "#0"}, + "east": {"uv": [0.5, 7, 7.5, 8], "texture": "#0"}, + "south": {"uv": [0.5, 7, 7.5, 8], "texture": "#0"}, + "west": {"uv": [0.5, 7, 7.5, 8], "texture": "#0"}, + "down": {"uv": [8.5, 8.5, 15.5, 15.5], "texture": "#0"} } } ] diff --git a/src/main/resources/assets/create/models/block/redstone_requester/block_powered.json b/src/main/resources/assets/create/models/block/redstone_requester/block_powered.json index 6a88c28128..2aecfcaa71 100644 --- a/src/main/resources/assets/create/models/block/redstone_requester/block_powered.json +++ b/src/main/resources/assets/create/models/block/redstone_requester/block_powered.json @@ -1,7 +1,7 @@ { "parent": "create:block/redstone_requester/block", "textures": { - "0": "create:block/redstone_requester_side_powered", - "particle": "create:block/redstone_requester_side_powered" + "1": "create:block/redstone_requester_powered", + "particle": "create:block/redstone_requester_powered" } } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/repackager/block.json b/src/main/resources/assets/create/models/block/repackager/block.json index 8ca39c1759..b5aec39e4d 100644 --- a/src/main/resources/assets/create/models/block/repackager/block.json +++ b/src/main/resources/assets/create/models/block/repackager/block.json @@ -1,7 +1,98 @@ { - "parent": "create:block/packager/block", + "credit": "Made with Blockbench", "textures": { - "0": "create:block/packager_block_defrag", - "particle": "create:block/packager_block_defrag" - } + "0": "create:block/packager_frame", + "1": "create:block/packager_details", + "2": "create:block/packager_horizontal_unpowered", + "particle": "create:block/repackager_particle" + }, + "elements": [ + { + "name": "frame", + "from": [0, 0, 0], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [0, 8, 8, 16], "texture": "#2"}, + "east": {"uv": [0, 8, 8, 16], "texture": "#2"}, + "south": {"uv": [0, 8, 8, 16], "texture": "#2"}, + "west": {"uv": [0, 8, 8, 16], "texture": "#2"}, + "up": {"uv": [0, 0, 8, 8], "texture": "#0"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#0"} + } + }, + { + "name": "frame_interior", + "from": [0.1, 0.1, 15.9], + "to": [15.9, 15.9, 0.1], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 16]}, + "faces": { + "north": {"uv": [8, 8, 16, 16], "texture": "#0"}, + "east": {"uv": [8, 8, 16, 16], "texture": "#0"}, + "south": {"uv": [8, 8, 16, 16], "texture": "#0"}, + "west": {"uv": [8, 8, 16, 16], "texture": "#0"}, + "up": {"uv": [0, 8, 8, 16], "texture": "#0"}, + "down": {"uv": [0, 8, 8, 16], "texture": "#0"} + } + }, + { + "from": [4, 1, 0], + "to": [6, 3, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [4, 1, 0]}, + "faces": { + "east": {"uv": [12.5, 8, 13.5, 16], "rotation": 90, "texture": "#1"}, + "west": {"uv": [12.5, 8, 13.5, 16], "rotation": 90, "texture": "#1"}, + "up": {"uv": [12.5, 8, 13.5, 16], "texture": "#1"}, + "down": {"uv": [12.5, 8, 13.5, 16], "texture": "#1"} + } + }, + { + "from": [10, 1, 0], + "to": [12, 3, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 1, 0]}, + "faces": { + "east": {"uv": [12.5, 8, 13.5, 16], "rotation": 90, "texture": "#1"}, + "west": {"uv": [12.5, 8, 13.5, 16], "rotation": 90, "texture": "#1"}, + "up": {"uv": [12.5, 8, 13.5, 16], "texture": "#1"}, + "down": {"uv": [12.5, 8, 13.5, 16], "texture": "#1"} + } + }, + { + "from": [0, 4, 0], + "to": [16, 4, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 4, 0]}, + "faces": { + "up": {"uv": [8, 8, 16, 16], "texture": "#2"} + } + }, + { + "from": [1.9, 4, 0.9], + "to": [14.1, 0, 14.1], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 4, 1]}, + "faces": { + "east": {"uv": [8.5, 4, 15, 2], "texture": "#1"}, + "south": {"uv": [9, 8, 15, 6], "texture": "#1"}, + "west": {"uv": [8.5, 4, 15, 2], "texture": "#1"} + } + } + ], + "groups": [ + { + "name": "frame", + "origin": [0, 0, 0], + "color": 0, + "children": [0, 1] + }, + { + "name": "tracks", + "origin": [8, 8, 8], + "color": 0, + "children": [2, 3] + }, + { + "name": "interior", + "origin": [8, 8, 8], + "color": 0, + "children": [4, 5] + } + ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/repackager/block_powered.json b/src/main/resources/assets/create/models/block/repackager/block_powered.json index 3909bd2381..eab20105b2 100644 --- a/src/main/resources/assets/create/models/block/repackager/block_powered.json +++ b/src/main/resources/assets/create/models/block/repackager/block_powered.json @@ -1,7 +1,6 @@ { - "parent": "create:block/packager/block", + "parent": "create:block/repackager/block", "textures": { - "0": "create:block/packager_block_defrag_powered", - "particle": "create:block/packager_block_defrag_powered" + "2": "create:block/packager_horizontal_powered" } } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/repackager/block_vertical.json b/src/main/resources/assets/create/models/block/repackager/block_vertical.json index 7153841ad2..53a6fba4cd 100644 --- a/src/main/resources/assets/create/models/block/repackager/block_vertical.json +++ b/src/main/resources/assets/create/models/block/repackager/block_vertical.json @@ -1,7 +1,127 @@ { - "parent": "create:block/packager/block_vertical", + "credit": "Made with Blockbench", "textures": { - "0": "create:block/packager_block_defrag", - "particle": "create:block/packager_block_defrag" - } + "0": "create:block/packager_frame", + "1": "create:block/packager_details", + "5": "create:block/packager_vertical_unpowered", + "particle": "create:block/repackager_particle" + }, + "elements": [ + { + "name": "frame", + "from": [0, 0, 0], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [0, 8, 8, 16], "texture": "#5"}, + "east": {"uv": [0, 8, 8, 16], "texture": "#5"}, + "south": {"uv": [0, 8, 8, 16], "texture": "#5"}, + "west": {"uv": [0, 8, 8, 16], "texture": "#5"}, + "up": {"uv": [0, 0, 8, 8], "texture": "#0"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#0"} + } + }, + { + "name": "frame_interior", + "from": [0.1, 0.1, 15.9], + "to": [15.9, 15.9, 0.1], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 16]}, + "faces": { + "north": {"uv": [8, 8, 16, 16], "texture": "#0"}, + "east": {"uv": [8, 8, 16, 16], "texture": "#0"}, + "south": {"uv": [8, 8, 16, 16], "texture": "#0"}, + "west": {"uv": [8, 8, 16, 16], "texture": "#0"}, + "up": {"uv": [0, 8, 8, 16], "texture": "#0"}, + "down": {"uv": [0, 8, 8, 16], "texture": "#0"} + } + }, + { + "from": [1, 0, 1], + "to": [3, 16, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [1, 16, 1]}, + "faces": { + "north": {"uv": [12.5, 8, 13.5, 16], "rotation": 180, "texture": "#1"}, + "east": {"uv": [12.5, 8, 13.5, 16], "texture": "#1"}, + "south": {"uv": [12.5, 8, 13.5, 16], "texture": "#1"}, + "west": {"uv": [12.5, 8, 13.5, 16], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [13, 0, 1], + "to": [15, 16, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [13, 16, 1]}, + "faces": { + "north": {"uv": [12.5, 8, 13.5, 16], "rotation": 180, "texture": "#1"}, + "east": {"uv": [12.5, 8, 13.5, 16], "texture": "#1"}, + "south": {"uv": [12.5, 8, 13.5, 16], "texture": "#1"}, + "west": {"uv": [12.5, 8, 13.5, 16], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [1, 0, 13], + "to": [3, 16, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [1, 16, 13]}, + "faces": { + "north": {"uv": [12.5, 8, 13.5, 16], "rotation": 180, "texture": "#1"}, + "east": {"uv": [12.5, 8, 13.5, 16], "texture": "#1"}, + "south": {"uv": [12.5, 8, 13.5, 16], "texture": "#1"}, + "west": {"uv": [12.5, 8, 13.5, 16], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [13, 0, 13], + "to": [15, 16, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [13, 16, 13]}, + "faces": { + "north": {"uv": [12.5, 8, 13.5, 16], "rotation": 180, "texture": "#1"}, + "east": {"uv": [12.5, 8, 13.5, 16], "texture": "#1"}, + "south": {"uv": [12.5, 8, 13.5, 16], "texture": "#1"}, + "west": {"uv": [12.5, 8, 13.5, 16], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [0, 4, 0], + "to": [16, 4, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 4, 0]}, + "faces": { + "up": {"uv": [8, 8, 16, 16], "texture": "#5"} + } + }, + { + "from": [1.9, 4, 1.9], + "to": [14.1, 0, 14.1], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 4, 2]}, + "faces": { + "north": {"uv": [9, 8, 15, 6], "texture": "#1"}, + "east": {"uv": [9, 8, 15, 6], "texture": "#1"}, + "south": {"uv": [9, 8, 15, 6], "texture": "#1"}, + "west": {"uv": [9, 8, 15, 6], "texture": "#1"} + } + } + ], + "groups": [ + { + "name": "frame", + "origin": [0, 0, 0], + "color": 0, + "children": [0, 1] + }, + { + "name": "door", + "origin": [8, 8, 8], + "color": 0, + "children": [] + }, + { + "name": "tracks", + "origin": [8, 8, 8], + "color": 0, + "children": [2, 3, 4, 5] + }, + { + "name": "interior", + "origin": [8, 8, 8], + "color": 0, + "children": [6, 7] + } + ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/repackager/block_vertical_powered.json b/src/main/resources/assets/create/models/block/repackager/block_vertical_powered.json index da5df312ce..473d6244e4 100644 --- a/src/main/resources/assets/create/models/block/repackager/block_vertical_powered.json +++ b/src/main/resources/assets/create/models/block/repackager/block_vertical_powered.json @@ -1,7 +1,6 @@ { - "parent": "create:block/packager/block_vertical", + "parent": "create:block/repackager/block_vertical", "textures": { - "0": "create:block/packager_block_defrag_powered", - "particle": "create:block/packager_block_defrag_powered" + "5": "create:block/packager_vertical_powered" } } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/repackager/item.json b/src/main/resources/assets/create/models/block/repackager/item.json index 562b192e82..47b0e0e3cc 100644 --- a/src/main/resources/assets/create/models/block/repackager/item.json +++ b/src/main/resources/assets/create/models/block/repackager/item.json @@ -1,7 +1,139 @@ { - "parent": "create:block/packager/item", + "credit": "Made with Blockbench", + "parent": "block/block", "textures": { - "1": "create:block/packager_block_defrag", - "particle": "create:block/packager_block_defrag" - } + "0": "create:block/packager_frame", + "1": "create:block/packager_details", + "2": "create:block/packager_horizontal_unpowered", + "3": "create:block/packager_iris_closed", + "particle": "create:block/repackager_particle" + }, + "elements": [ + { + "name": "frame", + "from": [0, 0, 0], + "to": [16, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 8, 8, 16], "texture": "#2"}, + "east": {"uv": [0, 8, 8, 16], "texture": "#2"}, + "south": {"uv": [0, 8, 8, 16], "texture": "#2"}, + "west": {"uv": [0, 8, 8, 16], "texture": "#2"}, + "up": {"uv": [0, 0, 8, 8], "rotation": 180, "texture": "#0"}, + "down": {"uv": [8, 0, 16, 8], "rotation": 180, "texture": "#0"} + } + }, + { + "name": "frame_interior", + "from": [0.1, 0.1, 15.9], + "to": [15.9, 15.9, 0.1], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [8, 8, 16, 16], "texture": "#0"}, + "east": {"uv": [8, 8, 16, 16], "texture": "#0"}, + "south": {"uv": [8, 8, 16, 16], "texture": "#0"}, + "west": {"uv": [8, 8, 16, 16], "texture": "#0"}, + "up": {"uv": [0, 8, 8, 16], "rotation": 180, "texture": "#0"}, + "down": {"uv": [0, 8, 8, 16], "rotation": 180, "texture": "#0"} + } + }, + { + "from": [1, 1, 15], + "to": [15, 15, 18], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [1, 1, 15, 15], "texture": "#3"}, + "east": {"uv": [8, 8.5, 9.5, 15.5], "texture": "#1"}, + "south": {"uv": [1, 1, 15, 15], "texture": "#3"}, + "west": {"uv": [8, 8.5, 9.5, 15.5], "texture": "#1"}, + "up": {"uv": [8, 8.5, 9.5, 15.5], "rotation": 270, "texture": "#1"}, + "down": {"uv": [8, 8.5, 9.5, 15.5], "rotation": 270, "texture": "#1"} + } + }, + { + "from": [10, 1, 0], + "to": [12, 3, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "east": {"uv": [12.5, 8, 13.5, 16], "rotation": 90, "texture": "#1"}, + "west": {"uv": [12.5, 8, 13.5, 16], "rotation": 90, "texture": "#1"}, + "up": {"uv": [12.5, 8, 13.5, 16], "rotation": 180, "texture": "#1"}, + "down": {"uv": [12.5, 8, 13.5, 16], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [4, 1, 0], + "to": [6, 3, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "east": {"uv": [12.5, 8, 13.5, 16], "rotation": 90, "texture": "#1"}, + "west": {"uv": [12.5, 8, 13.5, 16], "rotation": 90, "texture": "#1"}, + "up": {"uv": [12.5, 8, 13.5, 16], "rotation": 180, "texture": "#1"}, + "down": {"uv": [12.5, 8, 13.5, 16], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [2, 2, 2], + "to": [14, 4, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [1, 14.5, 7, 15.5], "texture": "#1"}, + "east": {"uv": [1, 14.5, 7, 15.5], "texture": "#1"}, + "south": {"uv": [1, 14.5, 7, 15.5], "texture": "#1"}, + "west": {"uv": [1, 14.5, 7, 15.5], "texture": "#1"}, + "up": {"uv": [1, 9, 7, 15], "rotation": 180, "texture": "#1"}, + "down": {"uv": [1, 1, 7, 7], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [0, 4, 0], + "to": [16, 4, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "up": {"uv": [8, 8, 16, 16], "rotation": 180, "texture": "#2"} + } + }, + { + "from": [1.9, 4, 1.9], + "to": [14.1, 0, 15.1], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [9, 8, 15, 6], "texture": "#1"}, + "east": {"uv": [8.5, 4, 15, 2], "texture": "#1"}, + "west": {"uv": [8.5, 4, 15, 2], "texture": "#1"} + } + } + ], + "groups": [ + { + "name": "frame", + "origin": [0, 0, 0], + "color": 0, + "children": [0, 1] + }, + { + "name": "door", + "origin": [8, 8, 8], + "color": 0, + "children": [2] + }, + { + "name": "tracks", + "origin": [8, 8, 8], + "color": 0, + "children": [3, 4] + }, + { + "name": "sled", + "origin": [8, 8, 8], + "color": 0, + "children": [5] + }, + { + "name": "interior", + "origin": [8, 8, 8], + "color": 0, + "children": [6, 7] + } + ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/repackager/tray.json b/src/main/resources/assets/create/models/block/repackager/tray.json index d32f72f9f1..31e2f797cd 100644 --- a/src/main/resources/assets/create/models/block/repackager/tray.json +++ b/src/main/resources/assets/create/models/block/repackager/tray.json @@ -1,6 +1,30 @@ { - "parent": "create:block/packager/tray", + "credit": "Made with Blockbench", + "render_type": "cutout", "textures": { - "1": "create:block/packager_block_defrag" - } + "1": "create:block/packager_details" + }, + "elements": [ + { + "from": [2, 2, 2], + "to": [14, 4, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 2, 2]}, + "faces": { + "north": {"uv": [1, 14.5, 7, 15.5], "texture": "#1"}, + "east": {"uv": [1, 14.5, 7, 15.5], "texture": "#1"}, + "south": {"uv": [1, 14.5, 7, 15.5], "texture": "#1"}, + "west": {"uv": [1, 14.5, 7, 15.5], "texture": "#1"}, + "up": {"uv": [1, 9, 7, 15], "texture": "#1"}, + "down": {"uv": [1, 1, 7, 7], "texture": "#1"} + } + } + ], + "groups": [ + { + "name": "sled", + "origin": [8, 8, 8], + "color": 0, + "children": [0] + } + ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/stock_link/block.json b/src/main/resources/assets/create/models/block/stock_link/block.json index b71481b1bc..1c4ad6780a 100644 --- a/src/main/resources/assets/create/models/block/stock_link/block.json +++ b/src/main/resources/assets/create/models/block/stock_link/block.json @@ -1,123 +1,48 @@ { "credit": "Made with Blockbench", - "loader": "forge:composite", "parent": "block/block", "textures": { + "0": "create:block/stock_link", + "2": "create:block/stock_link_unpowered", "particle": "create:block/vault/vault_front_small" }, - "children": { - "base": { - "render_type": "minecraft:solid", - "textures": { - "1": "create:block/packager_link", - "2": "create:block/packager_link_side" - }, - "elements": [ - { - "from": [9, 6, 3.5], - "to": [13, 9, 12.5], - "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, - "faces": { - "north": {"uv": [14.5, 0, 12.5, 1.5], "texture": "#1"}, - "east": {"uv": [14.5, 6, 16, 1.5], "rotation": 90, "texture": "#1"}, - "south": {"uv": [12.5, 0, 14.5, 1.5], "texture": "#1"}, - "west": {"uv": [14.5, 6, 16, 1.5], "rotation": 90, "texture": "#1"}, - "up": {"uv": [14.5, 1.5, 12.5, 6], "rotation": 180, "texture": "#1"} - } - }, - { - "from": [1, 1, 1], - "to": [15, 6, 15], - "faces": { - "north": {"uv": [0, 0, 14, 5], "texture": "#2"}, - "east": {"uv": [7.5, 9, 10, 16], "rotation": 90, "texture": "#1"}, - "south": {"uv": [0, 0, 14, 5], "texture": "#2"}, - "west": {"uv": [7.5, 9, 10, 16], "rotation": 90, "texture": "#1"}, - "up": {"uv": [0, 9, 7, 16], "texture": "#1"}, - "down": {"uv": [0, 1.5, 7, 8.5], "texture": "#1"} - } - }, - { - "from": [2, -1, 2], - "to": [14, 1, 14], - "faces": { - "north": {"uv": [0.5, 0, 6.5, 1], "texture": "#1"}, - "east": {"uv": [0.5, 0, 6.5, 1], "texture": "#1"}, - "south": {"uv": [0.5, 0, 6.5, 1], "texture": "#1"}, - "west": {"uv": [0.5, 0, 6.5, 1], "texture": "#1"}, - "down": {"uv": [0.5, 2, 6.5, 8], "texture": "#1"} - } - }, - { - "from": [3, 5, 2], - "to": [7, 7, 7], - "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, - "faces": { - "north": {"uv": [13.5, 11.5, 11.5, 12], "texture": "#1"}, - "east": {"uv": [11, 11.5, 11.5, 9], "rotation": 90, "texture": "#1"}, - "south": {"uv": [13.5, 11.5, 11.5, 12], "texture": "#1"}, - "west": {"uv": [11, 11.5, 11.5, 9], "rotation": 90, "texture": "#1"}, - "up": {"uv": [13.5, 9, 11.5, 11.5], "texture": "#1"} - } - }, - { - "from": [3, 6, 8], - "to": [7, 8, 12], - "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, - "faces": { - "north": {"uv": [13.5, 7.5, 11.5, 8.5], "texture": "#1"}, - "east": {"uv": [13.5, 7.5, 11.5, 8.5], "texture": "#1"}, - "south": {"uv": [13.5, 7.5, 11.5, 8.5], "texture": "#1"}, - "west": {"uv": [13.5, 7.5, 11.5, 8.5], "texture": "#1"}, - "up": {"uv": [13.5, 6, 11.5, 8], "texture": "#1"} - } - } - ] + "elements": [ + { + "from": [2, -1, 2], + "to": [14, 1, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [9, 8.5, 15, 9.5], "texture": "#0"}, + "east": {"uv": [9, 8.5, 15, 9.5], "texture": "#0"}, + "south": {"uv": [9, 8.5, 15, 9.5], "texture": "#0"}, + "west": {"uv": [9, 8.5, 15, 9.5], "texture": "#0"}, + "down": {"uv": [1, 9, 7, 15], "rotation": 180, "texture": "#0"} + } }, - "bulb_inner": { - "render_type": "minecraft:cutout", - "textures": { - "1": "create:block/packager_link" - }, - "elements": [ - { - "from": [2.5, 8, 9], - "to": [7.5, 13, 10], - "rotation": {"angle": 0, "axis": "y", "origin": [6, 7.5, 19]}, - "faces": { - "south": {"uv": [16, 13.5, 13.5, 16], "texture": "#1"} - } - }, - { - "from": [2.5, 8, 10], - "to": [7.5, 13, 11], - "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, - "faces": { - "north": {"uv": [16, 13.5, 13.5, 16], "texture": "#1"} - } - } - ] + { + "from": [1, 1, 1], + "to": [15, 6, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [8.5, 5.5, 15.5, 3], "texture": "#0"}, + "east": {"uv": [1, 1, 6, 15], "rotation": 90, "texture": "#2"}, + "south": {"uv": [8.5, 2.5, 15.5, 0], "texture": "#0"}, + "west": {"uv": [1, 1, 6, 15], "rotation": 90, "texture": "#2"}, + "up": {"uv": [0.5, 0.5, 7.5, 7.5], "rotation": 180, "texture": "#0"}, + "down": {"uv": [0.5, 8.5, 7.5, 15.5], "rotation": 180, "texture": "#0"} + } }, - "bulb": { - "render_type": "minecraft:translucent", - "textures": { - "1": "create:block/packager_link" - }, - "elements": [ - { - "from": [2.5, 8, 7.5], - "to": [7.5, 13, 12.5], - "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, - "faces": { - "north": {"uv": [16, 8.5, 13.5, 11], "texture": "#1"}, - "east": {"uv": [16, 8.5, 13.5, 11], "texture": "#1"}, - "south": {"uv": [16, 8.5, 13.5, 11], "texture": "#1"}, - "west": {"uv": [16, 8.5, 13.5, 11], "texture": "#1"}, - "up": {"uv": [16, 6, 13.5, 8.5], "texture": "#1"}, - "down": {"uv": [16, 11, 13.5, 13.5], "texture": "#1"} - } - } - ] + { + "from": [4, 2, 0], + "to": [12, 6, 1], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10, 6, 14, 8], "texture": "#0"}, + "east": {"uv": [9.5, 6, 10, 8], "texture": "#0"}, + "west": {"uv": [9.5, 6, 10, 8], "texture": "#0"}, + "up": {"uv": [2, 7.5, 6, 8], "rotation": 180, "texture": "#0"}, + "down": {"uv": [2, 7.5, 6, 8], "rotation": 180, "texture": "#0"} + } } - } + ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/stock_link/block_powered.json b/src/main/resources/assets/create/models/block/stock_link/block_powered.json index 751d5cf377..4f39b8edad 100644 --- a/src/main/resources/assets/create/models/block/stock_link/block_powered.json +++ b/src/main/resources/assets/create/models/block/stock_link/block_powered.json @@ -1,123 +1,6 @@ { - "credit": "Made with Blockbench", - "loader": "forge:composite", - "parent": "block/block", + "parent": "create:block/stock_link/block", "textures": { - "particle": "create:block/vault/vault_front_small" - }, - "children": { - "base": { - "render_type": "minecraft:solid", - "textures": { - "1": "create:block/packager_link", - "2": "create:block/packager_link_side_powered" - }, - "elements": [ - { - "from": [9, 6, 3.5], - "to": [13, 9, 12.5], - "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, - "faces": { - "north": {"uv": [14.5, 0, 12.5, 1.5], "texture": "#1"}, - "east": {"uv": [14.5, 6, 16, 1.5], "rotation": 90, "texture": "#1"}, - "south": {"uv": [12.5, 0, 14.5, 1.5], "texture": "#1"}, - "west": {"uv": [14.5, 6, 16, 1.5], "rotation": 90, "texture": "#1"}, - "up": {"uv": [14.5, 1.5, 12.5, 6], "rotation": 180, "texture": "#1"} - } - }, - { - "from": [1, 1, 1], - "to": [15, 6, 15], - "faces": { - "north": {"uv": [0, 0, 14, 5], "texture": "#2"}, - "east": {"uv": [7.5, 9, 10, 16], "rotation": 90, "texture": "#1"}, - "south": {"uv": [0, 0, 14, 5], "texture": "#2"}, - "west": {"uv": [7.5, 9, 10, 16], "rotation": 90, "texture": "#1"}, - "up": {"uv": [0, 9, 7, 16], "texture": "#1"}, - "down": {"uv": [0, 1.5, 7, 8.5], "texture": "#1"} - } - }, - { - "from": [2, -1, 2], - "to": [14, 1, 14], - "faces": { - "north": {"uv": [0.5, 0, 6.5, 1], "texture": "#1"}, - "east": {"uv": [0.5, 0, 6.5, 1], "texture": "#1"}, - "south": {"uv": [0.5, 0, 6.5, 1], "texture": "#1"}, - "west": {"uv": [0.5, 0, 6.5, 1], "texture": "#1"}, - "down": {"uv": [0.5, 2, 6.5, 8], "texture": "#1"} - } - }, - { - "from": [3, 5, 2], - "to": [7, 7, 7], - "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, - "faces": { - "north": {"uv": [13.5, 11.5, 11.5, 12], "texture": "#1"}, - "east": {"uv": [11, 11.5, 11.5, 9], "rotation": 90, "texture": "#1"}, - "south": {"uv": [13.5, 11.5, 11.5, 12], "texture": "#1"}, - "west": {"uv": [11, 11.5, 11.5, 9], "rotation": 90, "texture": "#1"}, - "up": {"uv": [13.5, 9, 11.5, 11.5], "texture": "#1"} - } - }, - { - "from": [3, 6, 8], - "to": [7, 8, 12], - "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, - "faces": { - "north": {"uv": [13.5, 7.5, 11.5, 8.5], "texture": "#1"}, - "east": {"uv": [13.5, 7.5, 11.5, 8.5], "texture": "#1"}, - "south": {"uv": [13.5, 7.5, 11.5, 8.5], "texture": "#1"}, - "west": {"uv": [13.5, 7.5, 11.5, 8.5], "texture": "#1"}, - "up": {"uv": [13.5, 6, 11.5, 8], "texture": "#1"} - } - } - ] - }, - "bulb_inner": { - "render_type": "minecraft:cutout", - "textures": { - "1": "create:block/packager_link" - }, - "elements": [ - { - "from": [2.5, 8, 9], - "to": [7.5, 13, 10], - "rotation": {"angle": 0, "axis": "y", "origin": [6, 7.5, 19]}, - "faces": { - "south": {"uv": [16, 13.5, 13.5, 16], "texture": "#1"} - } - }, - { - "from": [2.5, 8, 10], - "to": [7.5, 13, 11], - "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, - "faces": { - "north": {"uv": [16, 13.5, 13.5, 16], "texture": "#1"} - } - } - ] - }, - "bulb": { - "render_type": "minecraft:translucent", - "textures": { - "1": "create:block/packager_link" - }, - "elements": [ - { - "from": [2.5, 8, 7.5], - "to": [7.5, 13, 12.5], - "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, - "faces": { - "north": {"uv": [16, 8.5, 13.5, 11], "texture": "#1"}, - "east": {"uv": [16, 8.5, 13.5, 11], "texture": "#1"}, - "south": {"uv": [16, 8.5, 13.5, 11], "texture": "#1"}, - "west": {"uv": [16, 8.5, 13.5, 11], "texture": "#1"}, - "up": {"uv": [16, 6, 13.5, 8.5], "texture": "#1"}, - "down": {"uv": [16, 11, 13.5, 13.5], "texture": "#1"} - } - } - ] - } + "2": "create:block/stock_link_powered" } } \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/block/packager_block.png b/src/main/resources/assets/create/textures/block/packager_block.png deleted file mode 100644 index 87b976180b2db74e780a915782443bd7983a541e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 508 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCim50(?ST4Xi92JzRpr12Z#|TAIq|&z`(z+d6G+Lt7gU7mp}61_pOVrU*tx zZ$?II1_o0TTXP16^u)x-hzNgwewJO9ae7ys-J7WEtRKoFLoZAdW)3hou}8rFwd&cAyl*GG>SnIJ*d=RmHtS{A%AN1* zk9wH|ZxnJ^f232?HqLW)j=c6Ql_OJ%S3a5ZLqtHKKhut_GqbMpU zcGESDan%8-1@WfK&UhEB{1x@|e1msux18SpL(e`0A9`jWS!#dse1avK*yd?KP)4H|v z#D9@%O|FV;T*fjDfvcM=XB25#PERR|OH&A6YG*fZ{&{_tcUh$hsekKk@H4i4-}Gef z9E~GM38yb4#p*9U=AYms$If10Fk7}@#jK|dD|cSDjlY)E*05D!+sYiJ*(dj{_*ul@ z9F&r~_S&_OsV|)bgfb(8&r0&|6j~tAd!hJR(Bk`AA<9dbn6~WI(x@u+L0=~0?A-MKRt+tWd)SqBD;Ud7cu?8K{3g~Syv20Cz@Ny%P>1gQoYt+S zC;p3EYjRa&<1&_M2wdG{IipC^a(YTxT$)1oQaihO^Uv$Eyvr(8Nc~%PgP*bW`=%#* z=V%;BN;rKXDOP{+G5-W7Id=8}gW0kLD`q`ySh@4EZTz*QwuY?=+g9c%%|5wr#m^!J z=b)6_wb!nNOnvDjAe0#yd{&Zwr_cg{-V4Rof)?M`3Q=Cd#I$W^@CwiB_e-B{3;dzF zrBCiV%N|e7n@g&h@-7y=a{c_4Cu2VQ!)Ic=Eg`#?vB{f-9riTU4wasBN9XmP?z6iJ e4feAat(Px1*DVcc{p<=1MFvk-KbLh*2~7a#b< zEM;J5WMD8gv8`ZWNKZ_RjEL~}_ct;!v$J*d^zd+Taj~~^0vdTdE_e-)k}3)E3;vG_ zFo-BI+ybiNEbxddW?7JM6~k7)4P* zv74@GjH?bvEr>T=cE-D4<*%rx=Nr6RyXEx$AA0s7_|P*0$x{21CpZ0y^|>~;;<4{V b<&)+WoVE{^70AW{LyW=G)z4*}Q$iB}IrrE{ diff --git a/src/main/resources/assets/create/textures/block/packager_details.png b/src/main/resources/assets/create/textures/block/packager_details.png new file mode 100644 index 0000000000000000000000000000000000000000..5d5e57d20f542e79478a80b6e49a2131f2ee1d16 GIT binary patch literal 1057 zcmV++1m63JP)Px&+et)0R9J<*R?TZ0M;v{dXuX<|99ae%#737w8xtrgCL|_A3eL$lU2}~uMYmjf zD24tzHT2|LE-kbvj{A`i=OB_6sv3Dwv8Xp%OEVg+!}K7{c)uk#Y2IZ=^Z9=7H@`PB z@E%aRyCng@DlX5QD+VV3fG0maHUJ>^J_rOi&zbqu@iTuE>(c~2fA~;(oP%)=N(dO| zp^2)G5`rs)z~da>?Cco9IkObFY*DR1jDW{EUjP0l0H9bX#1^~oFc=O20M|bGC`52H z8tQL8A72}tmqru)cmvGR`p^o^ST?QWus* zQL+GO#px;&JPq~a+qb&SoDbsCrXva8?j0JnyIT^YX(hZ( zIN|N2EiS1lI7}vxBzrI&Qp(sJ2qMc1GJSv&0v8_C%@4{ROh>)8DYMkb@`6ksV4UkZ zM@AJ4hC@W}0Os_9Odn9PuCL#c#X7+ zFPO^*)H|T0jY=Hti@pQ%dO@lWL^r%B(!5}n4}1_j`r?uN^6Re>tLM_YZr*He%g^p? z$YygpwLFjiKE`3Yoj9gb&}?o?yRrhiaurqEM#phbwQT^jBE`A^>3H=52hp_Y501 zZ>Ju@IR{B`Pn`n0aup^uu~uD$&wNx$lUux2UBy~;6(%+D=`~x=Rp>ZQ=$lL+UQsau zO70+3NnxtMLQbMsE}?4MSS~Gw)+Mc15JIGmX#yR`(Xt0I5@Rgn!uKmH+BEQpvBe0e z2u4%aQZ}l-CN(iWGav-Zj5Z0DWu=ZKmZ3Slh|0~zXYb@u05JO!b{q#nFyyVtq06PB zp0tpYx(Y0dUN{AWr2kV6rNFXiDBp@q6cUH>!7c)e_=^nvnK3=wa@R^TSonu`U$KJ$@{`jj0lbUe4M|y*K%5Y8sJ>1xOFt-)E z-T(lw|J%=@ZxRS0sb#1MJUwVl?e&>9nJAR(t~bDoy?sLwcfA3eZZDOFdh=oSR2bOyNLda5m7~ zOivfb5DUSz!Kb|r2MEknnLjrA`PX321}lKCdJ@8Yv#Qmqd?%(4zY6mYzmQ8dTT zZ1KT{)pz6i7e85+sb#>ohT(oVPjkVF1AMd2y5DQmc-_m%dYENXpyEu?RQ4uMjUQ+E zTpD+=Pv2^#f8sl{DuejSrxvf2R=U*)u=*(ExVQh_vU{(wH5 rEnjlub$PF5(|fK1f4XZKZ?aBq*wkNg0vHdpPZJEDu6{1-oD!Mz_Q!oa}D>gnPbVsZNHiT?nbNv6Nv-dXKT=Y`GFX-86(a%r2zGUvY%JWF&ssAI{XLd>M UZmPK_fnmhp>FVdQ&MBb@0IRN>cK`qY diff --git a/src/main/resources/assets/create/textures/block/packager_frame.png b/src/main/resources/assets/create/textures/block/packager_frame.png new file mode 100644 index 0000000000000000000000000000000000000000..4ef8da9e64484f6c51fc6f4ff62d0bd61a7854c0 GIT binary patch literal 464 zcmV;>0WbcEP)Px$ib+I4R9J=Wl_77!P!xr~lDYy-n*eDF4uK+*%Nz*;u?d1eBar+WBmzCLOl$%{ zf}5F}nwTRmB#^X$Qr(Hsrh;v+?Gh$>RNK7ozSAqtQ3k_)P&Ex~t3ncq&5o_(QZ)^> zj?3Ho2b!iyvA*xqZZ)Zz25Qwb7~I_guoi-bZT|?z&pbRmvvphm>Q)U?FG(42_8tIR z$3+eQd@Tf{@kEgsFrQ6>hHYb86_zir)UDc=q5DTEzSHXl&fdd494REd9AGq_C~F}A z&@>HGFR@xIrTNujsf61q0KcyNoYFAoRQQuAxq;k3ZXm0HFjSH#4fCymhHW#SO#@jd zjABm3;_N*-y{2n zmR{X=!?H*XAB=J_5$GO{aB9OWyc&mPE49<>21dCU4avesIgqr^WxmPq|09TU1G$0R zz$K+hoRLzJI*u#aK+-->bJ;mXZJ4%9(y;LvYWyXwvap}#Xt@!XAKR4x0000`r) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/packager_horizontal_powered.png b/src/main/resources/assets/create/textures/block/packager_horizontal_powered.png new file mode 100644 index 0000000000000000000000000000000000000000..e15bda38ca9ac14cf08d0045d81e0d063e4089e7 GIT binary patch literal 983 zcmV;|11S87P)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00TcsL_t(o!|j&AYui>F$3M1S z6Wh_E+QUmUB@4SWh0wB$(3G;n+U>Z*7;KOccG#_uL;rwL=%p~op@%@Aha5&}V1=DZ z*`e#DU0Fhy4;Py zm>*R+{pK6U#LvI}j??h?%k2VC$d5_sZKno+h!;2XB8EP}q+uNRxN4gH_f^xxw08PQ z`010_PK}3;zD>y_Ff%h77V=|=g7ylAUc|KOd~x;5BmLy^<UYo+9LHND-((&}&4c?J{2TPnK`2@%F0*C15uCuogW_z@GUV%QwC! zmsKfkmjUS1t$`ir)Gbo??|lZSEyT04}s%Y5+uB_<7nYu9gLJGK5i zn2fsO^SvRilWOEvtPwwKZD3k;eyLj6Zj*vme(@M}n>Y=R%^yqsI*12Lrl^xu6z0}f zIQNg^t3*z2Ei9o10iC+lPdJs72i_fTV?K2UIs#){OU?rYEsgoq<<8@Z6c2oSVJa+W zYH}VJ5-rrcCcS$#uQ4RT|t7UY`2L&nWoWJq!(`pgPx&FiAu~R9J=WmrrOMRUF4ZGfdZKyJmJ5HqAJRK?}AJS}b^w1<|UIiw6k)}`@Y}%z4!Z$_FCx;nV-mV;^mi6!LN7!CV0@~VYmlCA%9ef?+04|7;$jh zDq>sH%-Ht8%XP;|p4S}*$K6aswDlZ*u*L1~ztL0#%*~yah5S*Bg82frRm5>UKKuN_ zNFO85MhXgu+ZB4VXvO4k#R#sLu+nNSI6fNc8F+|bo2pE?3 zCn4tOLX0gy7u^h`!S>p6Dy~kquv8IqW;Bf`+EM05(GEpTOTPt?GV?zONS}f6E1)A@ z2aSmoj|@a^*#3Zj4-c5yKA~0Gv7Vfh?bWmut8G zWP5FyqNX9bDHcFoN^<2zK6>*N)~?(Hzz-XUiSajKKZ-B_s_QkHjel9XxXR?@ENx&{ zN?gDMT)+T!>vvhY_$`N@&r)5l0T6la*a9NYMZ59!m$L3Se0Ad%r{`XMVm&zSCe`&C z@4xpBGq%n7FD~H+TLb-||8D57lbB=taOX!H*W-`6iyt;9n6<|W@WTedgC;-yTutgA zZY-i`p$ozG+A_y9E!n=PTdcYABKuK9J?Rn3h zGSmBkf~n)&3%Od^=elF~3mi z_yNcD`1He5^03GN@ZFU=L+|pp&b|)7Zq&kYJ^ZjiW@5;dJ0dcM?D&EEet_QBP=@(| z-~aNG`TavdG9LFBPQmDYz;QRRt?2Px$6-h)vR5*>Tld(?2Fcd{kQKXV40)eQi;ACgzGx`NpSGImpH`a4-7_2>_ujbMy#g?wO#%2cNL_IpML#kT%0SSh`0V@yfKeEFMUAzdfz&txLDR-~ zB-$9_C_)=UmL<-_BM=EeRo0F~8{<(`)E?Q<{`&-d6ox#kA9;Ry`8JP^fkza^XsbJU zv=w}{(OApH tZ=X3hNHPn3>I_m|Y?;rdzy3`BqIcQ}h>jbX&L02(002ovPDHLkV1g1_l`8-M literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/packager_iris_open.png b/src/main/resources/assets/create/textures/block/packager_iris_open.png new file mode 100644 index 0000000000000000000000000000000000000000..1df9067cbd2b2b6da32a509fd4aa2cbded9e2f10 GIT binary patch literal 278 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|E_k{)hFJ8j z4c^V$Y#>mpP&4m<&@sJBE;pMEH8d_63dVMcNGew=NOdWQ=QwmN@#xubpk~UROXcs2 zze)ZOWMmLI`g7@$hDlOuD;+#-Z|7vMtz2L#d+L*r3&VmX2i{h>-wl}^)88(<$%d7o zMV@i*Odf{PU|vmU>0EuCbdL?#ih!A-6(Sq7o>9^kA6~8=q3hp?^beDdZ4H4<#Y)!3650 z(3X_alc8U?_E0E2v?-xAjVaXFX^4HOY1-g4iL|U^#geVnN~@K$+k>o?S8?RXByJCV zKxo*VcjlevnR%aC0pRk~grjO1W@Z+UBniv1kR%DfZCjSbi4&v5q7f!9zAw-LZl62p zD2X6aZ-Cs=I)^{}%8eHRV$mT~ErTRUghPFprhzOg0B$?4=V-5S$R|>o7K?*FM8ey!{cL4UpPoEU!byCM)FHo6${C~ zCBatPs#y4Y0yO$A&CLsYk-*w0W85pCB!U?C3Uvk=uq?~--}=l?fW1J?7=(=aIC`-H zK*+Grixos8qth3z>oRmG%Eqb=;4;u?55@<`iqglEYkx)biOrVOd zU=-Yd!T7)v2iyK`drT*2P7a}nOt&H;Dv^-eA-$rx*4tW&(<>T{zDgtncXpp}{^kN# zCNH?{;%3e7R85qD0LFTml2P+YAW4#230q6?o_4>MA*HHy4=5BV>4HcV?23hHAebfy z>?0B<$Nvb(J_6kW<&s0$wCi?!C>|xd<{(F+)JzlGDtiKbQh+X5#>{B+4+^ZLG?wP( zT`TYJsY{dH)VY3bMgTZ-<_+iANRoIg20%(xdH0vE?@F?-DX(cG9*Rdv9(je?%@jUa zre>P>B(Lob4V20052*xtNgjyl;9SPl#AF!i`&teDe9X-c!@xM=JwA{&ZKg zD+1NBgD7=TwH(A)G~#wrLcQqbYFi!Sv6#E6M)FsG_zk7^C2Hkj)4q3LpjyIjR~K4&vEs29a(9^H<8fx^Qf(QydjGD!R)d=9crT^y?KRYk!A?nRwoRfd z@B+X7p7%VPp8i6JO-(q>Bbf$U@KN$DHY<~zd}gKCC(DrcCffS_aNzaV@{h&wFXNdp zV4LPs8iJjCVgiP~vGYJm`!Q?fBFA5iGdtIQuROSRJ=|6TCDhyT%2TR}S;{jzm+~CL zcKGz8_uS3t+in<7a|~0e>K3B4Yz|dRGn`CdY^-9I^1H@gnmp&6e(P=F{Ml0ufUhx# zOQ&f*_VYSinzd}st^KN&;n+x$OBc^FoJ{PRz~)A_9&6OAtGJTVwsdq{{aei_y&j-T yK1i*svAFyfjhI}%!0o>ucoNzTjfrzxZ2tqb4`4K?-^@h-0000NS%G}B0G|+711k$h4;M$r0MD>YH@`#|kEqPdB=5LFLj!Y53#Z`lz?Pp}xWcK%Pjx@7ge1)FP5GAL}cQBQO_!J-p#)h}x0gT`yU zwLO;V(fQ(sQr13wmsH5;{L=Ta-p`l%6LvE8_40Y1H0-zyG?u~B)z4*}Q$iB}QF~rX diff --git a/src/main/resources/assets/create/textures/block/packager_link_side_powered.png b/src/main/resources/assets/create/textures/block/packager_link_side_powered.png deleted file mode 100644 index b6139f8fdd86494f3d2a4748a289519323c87780..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 276 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}B0G|+711k$h4;M$r0MD>YH@`#|kEqPdB=5LFLj!Y53#Z`lz?P=+=?n~8 z7#PknFwCDlxfH08fx*ZB;&~t?R1)MD{2v`KJlels2q?>0;1OBOz`%DHgc*NS%G|&0G|+711k$h50}i$q?V@g`LieQ*|sh?JkZfGz&ozc)WlX>+YqSGEXQgi zkm4x`@(cct01QI+&z%E`a~60+7BevL9R^{>e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00V4EL_t(o!|j$&XxnBO#(%by z`fuym!8oeoh924!3Z)q(8KXU<>!GkQ#twswFxK7*Idu0i7>vQ7haL)HJ7i;&6?W*U z8#}bUEQ2MO83u(eV|1>g%86zf$5L#kmbHT<_;JfH)E*nw2;x2%NfcjT|rml-zX{D9kPJ$g*f@DxJqI z07A3p&)LTgA3~P0$kI4@S^m#uWku0G-zM zGiQj=xPuo&fF4H7r1m3ASrk>{<4?W_?d9(;UAkz?QkG4rcG!C@ds zoVsx>5H{>Jmf!F&(|sClFVSgjlLIG#ASEaTU~j@pAP55!0TL*A2`K8iZ?K0M3IpDg z@)I6r<0+Bx6Jj*Z>M$56%q_*qPoJIS+wbn6 zs2X~`!S(?Q!IPU==BD*ErZqHioHI_q;tJ-9COF<^i$<4xl9)37D&3| z*h@GR)DIlNDS6eiwqe=DF9XR4pqrE};n~sz^#gJ|MZFDQ|M0snKXBpA6Lu;>a6d3Mni%*M zjEyFO4b8@xX8hLKTor{OUC y06;3@XuH_#lDNLo*AJNUGfc+9RH`P1i~ASZ3DqRez|cMb0000Px&TS-JgR9J=WmrrOER~*MbvrOD)5;NHio9r-&qNO4�nMK&`{C}5!yo$PaXp4 z&0BLXg+eJ51igiNNFWDK(o6rKpi;3|Tcn`{i=?zEZpK+NWY)>0;~r$EMLZbCrv2((`Tf%7Q<+gXZD zjySs#f#^xaLBw&D+SX)RGA_C(D3v?{y%SThxe|5tSW^lIFaQV8fwjUS=Pvw6 z=iY9Xy`XVQ*J;}U={jiFe)vWeY@6?{-Qd{khj*+8+gZXg2eF+c=I<@=;fePcvMfIT z@?x@Kbm#6b*pAEJ1qaVBlQkB0^mzW>0-j%{v|8cU-{u>2kj)Hi8^^C`S|fcjEY{|6 z9679CzH*aHPd9HLeXXUi^=C5>>Vcns|C3hjA6Nz^}pV_kYCF z1Ct*NDaP!jL=jwrX&%6o1np|(_fjvE{?N^Z3 z)utXug~I{ZQ4jp}uiH4Y(NO||{@yN%E7jzB;Oj2}N!Fb)Ak1xa!)83YUnzyta5wZo zWFX(y#d=-i>g?^{hoxyGFDS+M=w!8J1~aWwB@5I`6o` zuKP_&4dMZ+*_ImNnda%K#lQjNurf$7vNA9N zSzbUa4P}FTs=>$%7H0yo4H=mj1b}oD5NEctfW@Eak-;Xij$K=i%hDOoGMk zWp~5zIZc{RU!0t5B)V$H%qcd@Wj1L(Ia2YO`&iJ*B(-&!)lAW=7|#7=eK_N?ZvL_w zYo!GH{=aLKo8GqfaZHzCh*2teFwwbxGs~AB`<@yw#@U9i6HwE6#-a3a%85BDTHhZO zx{ADdJHxLjRF3PSZ>y5$`DZE%S6@zT}e1?Tv@3%s@fq>FVdQ&MBb@0GWH_ AiU0rr literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/redstone_requester_powered.png b/src/main/resources/assets/create/textures/block/redstone_requester_powered.png new file mode 100644 index 0000000000000000000000000000000000000000..c2692101eb917780dd8022dd541af724e45e4763 GIT binary patch literal 561 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}}0G|+7M-LZE3nw?fL`TN}7mujS%p}jS%$BC|`LidRn%IWunuHlz85)>R zXJA;zz;KpO>_%)p?h z1j3A~9^IV;6qG1&jVKAuPb(=;EJ|evNX*PD(erZ+Q83jr)H6)l8pH!svn@5kGtJXe zi-7~kVP%kFWMyCkvb=y;8p;OwT!WDrEY1XE8!|G1Lm~>u&TMA^i)R7ZAaH*&3&RUw z0KsT9OBsMt6WAG8fGQ1)j13qUKuiVM$hrVx(i9*Y1ek#4GJ#bFSy}*DP+f)w1|Zpl zenppyrH@tunI)bsjv*Sssl9K7ngTdne%`27bT)qbcfM)JG9CWz$EHSczn6hjZbVL4>`PD>mG%H+~Vo#=d#Wzp$P!FNS%G|;0G|+711k$h50~KZz|72~mZtLgvnTJ_wl2y>vpT?XN~~j)iGrhsgtoS! zt&N8p1A{pOgEa$#sfld_BcnSbll`W+MxZ&I1s;*b3=DjSL74G){)!Z!V2!7XV~9p@ zsDHOmg8~P$Aggip-~apDGD-`5`gzM38XE6$WSF}8*}i$|!J(LTQF2l;L(;`fQy3GO zymnak(u6{1-oD!MNS%G|;0G|+711k$h50~KZz|72~mZtLgvnTJ_wl2y>vpT?XN~~j)iGrhsgtoS! zt&PV_28Id-hDHX4bqoxqCbnl882AnDT?U%NS>O>_%)r2R7=#&*=dVZs3f6hLIEH8h zhx#)L9ai9A7G%v{TlW9|Yk}PI!`yP51uP8Adj&6Kb;On08TiQZhr*#iA*! ziA-Kq8Ic0M-8Xg}=Y&R~D%{rr4G!1=PR_kO)d u-#Tf-z3b^`%-?l=nemy?{CmFqL+(o{Zw_T)X=)D~&Z?)crfN4yo=H2;bm&})Lb9p{$B7rSY*$x@sRwW^Qk!{DWX&>LiB)VWM%-)I zR#d2Y@CHoJH23gzH#o$#VCl*PZ^d&4LJSOgK9(KJr3_C1EoJa@^>bP0l+XkKUldau diff --git a/src/main/resources/assets/create/textures/block/redstone_requester_unpowered.png b/src/main/resources/assets/create/textures/block/redstone_requester_unpowered.png new file mode 100644 index 0000000000000000000000000000000000000000..7073fd01a1065f6f52c338349d47602309ac69f0 GIT binary patch literal 546 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}B0G|+7M-LZE3nw?fL`TN}7mujS%p}jS%$BC|`LidRn%Ei|m|HV21TZp2 zFfzI^Fa(DO?%B2usP(Ab;RirUs3gcQ_&+*ec(i}N5Kxx0z$3Dlfk96Rgc(;ox;qId zC{f}XQ4*Y=R#Ki=l*$m0n3-3i=jR%tV5(=RXPC4#hzF=%FBlnwH&1|u_AoC(M_WMl&SJ_^XrY-a(BX93wDaDOrj!wX=bz-Tl}8Gup~ z*cn)WDh-T`4Hy?dOa|*-Da`A zNzd_h>mdo%eQI6_j^D$cDz1z7JJ|m~af-Io(zYE+*VPt&H8afrUaq!D&FI-;W93-4 mtauHR_8htDH|n83zA;^Y!1n(xm(D7XLp)vmT-G@yGywp)kCK-F literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/repackager_particle.png b/src/main/resources/assets/create/textures/block/repackager_particle.png new file mode 100644 index 0000000000000000000000000000000000000000..e520c2c3521c14d45eb9c33734c8779c5c0d0557 GIT binary patch literal 488 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}T0G|+711k$h50}i$q?V@g`LieQ*|sh?Jg^{0uPVwU)Jh(xs(H%UM?i|Z zB*-uLKO8W4`7?e33Ud~CL>4nJ@ErzW#^d=bQhV4UCKp7#Bdy1gU3T05NA0kPQM% zKvS5&DuXO7fGnskLjwblZ1NJdBSC(D&j6X>o-U3d8o{mS0=W(ta4-j$Ud-G5zwxs6Ns2z`BzHLT{EDFu&jVL+{7_PnipzZ>s%vH$eKh$*0#+ n&y_;vFp3E{ibqVF)%B3=fF`@N$tI@@AnQC`{an^LB{Ts5p~rjw literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/stock_link.png b/src/main/resources/assets/create/textures/block/stock_link.png new file mode 100644 index 0000000000000000000000000000000000000000..62be510a1178e56f8bb770a5a48d47e27cab589c GIT binary patch literal 1110 zcmV-c1gZOpP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00X{BL_t(o!|j$`Xj^3%$A8J% zlcPzRwplvkX<@Z&4BCO+g^HIYUMRiVg?J@0*kD(iI1y3C7>Y;*x2s+V!W?+#5G-Rz zD6?~2s$msOp{|CB$-AS8`Di}6lap=nqRr{~%2utQNdGs_pZ7e^`~LHMyl*`G1BhR~ z)OvsFGvr7VuPoya_EN8w@dtYW3|_C6d7x=%d6jqGe3jTshdo^Y$B!RrrGC7FFVIgY zbeGB41Vf5qIV6!>U~%adtE-REs1+GI_$1TQpL)zb_ce_-UVDK=a)Il4jXGrj9%vfJ zUO7l2xxieqY}wZfphP2fS`Rr6y79Bl zF9n|?#%p#`qJu1_(uDiN3@HlX{xF4N!QjiOv~jSxL_*DSuc@(1mW>{0TQm2{GP`7% zdrb|YW&!9j3m8%qPMti;N9R5PpinFj?hhOM)XAfc-T-*_^oO3m+PK%gz2X!A@ZHTt z&QF~IFfssee(DTgd^O`LAb$B$>+RDY69|U4ba<^=;DfWTZ%%=^E^~89a>Wvpu?Zss z86k|`c;?W!>!z~or#slUB>{3%vo@i*1npYed!XHnZW(A}M0s>2>^@$*gT3x<+>Ulf zcN$G=qem<;juNzg^~1P*^n{v4)9PHE&v3u7_D}&==No8R-8lt~T5-!6Xw-_9Qv97M z_&#~fnE|0@IWRWzNN&$S8|PjeZykC{VOjja0cE$VJ@#e7BDTw%LZRk4vAek*@OzVi z#zx@HZ#c2B!J^t{Nue2`!$%lae?pXM4DZ?NYF)45_8q-)TVr_7UV@Ly9qr0(4Ree= zgQAjK=N+saU4Z3P6Jsy8s%sjelEcl$uYB$?*U*f>jjzc?2dJ)Tr+czgj#lF)S>N!p0t z;JU68i#>}HjTn>Tcnfr0w^;jHH@*%R%pgL|BS{iH!SzO!Wj}zyE7g+YDfa;E+c(-8 z9Enn@)adI8Q2wpznt|RYf`(5vt+KMR(<1xY1QyE$7~0Vw?L94;|gwD cJO5wdPj><^>qd5#aR2}S07*qoM6N<$f@y9BVgLXD literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/stock_link_powered.png b/src/main/resources/assets/create/textures/block/stock_link_powered.png new file mode 100644 index 0000000000000000000000000000000000000000..0e880bfbdafd2041abe8c2bf95944dafb11e9171 GIT binary patch literal 384 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkEbHUgGKN%Km~!K)_g+Z-?*`ppayVYeb22er|4RUI~M9QEFmIYKlU6 zW=V#EyQgnJcq5-UP|*ud7sn8b(|adx%wlpBXxney-z&&>a-v3{VXOayOGXKa^DkK~ z^;gzVOh|po+_5+IjI)c23RjzI;I-Y|)17R5o@W%Civ02HcY685BbylHR!u$Oy*p*k z>K_ZPW<|F%$S~-?UG!BoN_t}>?~%#b{i$5rde`cuH2itXyVKx^&DFrYd^-&$Ffu6B zyNc~#H``ZlaG-Ph%Ah-MS9qP|WpF#tUeI~2u4Qhc%Ax-fKFf+5ZYX>T|CIfQlV`od z{~7HjGtWt?%S_Ve-FI5_p7}zZLpdKi4ZUZbzng0wahiequj|H=zt4?%@3YNWTF2;g X&gH^FMeP)zpBX$|{an^LB{Ts58FY}t literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/stock_link_unpowered.png b/src/main/resources/assets/create/textures/block/stock_link_unpowered.png new file mode 100644 index 0000000000000000000000000000000000000000..6edf906ac321b950da7d16aed47f11835049fde7 GIT binary patch literal 360 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkEbHUgGKN%Km~!K)}#yf9#iqKq1Kz*N775{M_8syb=cIqSVBa)D(sC z%#sWRcTeAd@J2pyprQ+&E{-7SqR^1IFZpN;ZM8Mo}7dqMBX${R;_Jh0$?E6vP& zK<|m5Qnx_ROb7Ny=l;eC+vYA>?rYi{wUy^Ujm4o@{i~b|Oz-_7FK=kLemL0NW2U81 z1NSRICC>w1Mn^Q9TqbB7@@Hv(EUBQzv1j)$slUrp!;x%EbIYDesE((*E>Y@67(V=HGegz&fE|LJ!by44$rjF6*2UngAAogW>=H literal 0 HcmV?d00001 From 42381395c67400ea810f0c42da7e0d6e252e4fe8 Mon Sep 17 00:00:00 2001 From: Kryppers <65094918+Kryppers@users.noreply.github.com> Date: Tue, 17 Dec 2024 11:10:08 +0000 Subject: [PATCH 194/515] asset tweaks small changes to a couple of the remaining HL components --- .../block/factory_panel_packager_mode.png | Bin 484 -> 489 bytes .../assets/create/textures/block/port.png | Bin 1632 -> 1630 bytes .../assets/create/textures/block/port2.png | Bin 1163 -> 1163 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/create/textures/block/factory_panel_packager_mode.png b/src/main/resources/assets/create/textures/block/factory_panel_packager_mode.png index 8141af9cbbeda21d090472a6e7b2fa7e4684a7d9..0041a319d202238eee9b2d775d24bfb0d443ec6f 100644 GIT binary patch delta 457 zcmV;)0XF{R1L*^hDt`a~0002_L%V+f000SaNLh0L01m$Z01m$aI0aKA00007bV*G` z2j~nC5F`OPv+}K70WQL1Fu0RSB{ePE#@cGaGpK~k#dYc<@ zK`Oes1;B+JaTh%1@K`Vd&EDolY<${6XpL`c07PkNSW6G0IXo8s%%8ZdI~4YYY5wx{ zhiEQHh0vP6zYl6|+q*wwyix$XCNAtvm7uFz6X$7UZH;;wDT$U=KeN~>QCXYCR#`RR z4M>hj>|MnG&3_9!LX`G}$d#6n9n}&{i@keFa2Gre=cjz%*^BeK8f9!P{`{1=;AbWf z?>*zYApr6`k4nnggAajzzdtiUBZ++oTn+{kR#KAZd7SwZopUHDan6xt*@OX{bG71l zxgYO`LjdltuaVz=iDoLE7N@4^E#da;jFY2+VKHWHy+TuskX+u90AN^*`LI0yyaQv5 z@FDPVWd$YWgnbAYV`@vh8U)tXJ9Jm&|2yL&%>Kv@TyeC000000NkvXXu0mjfUHHm& delta 452 zcmV;#0XzQb1LOmcDu4d~{{a7>y{D4^000SaNLh0L01m$Z01m$aI0aKA00007bV*G` z2j~n24=Nf@4fFi~00D7HL_t(I%dL{JPFpb)hCfFEWZxupBM3`3lmXNU74ZU*I%K$S zkayrckXZTzT{~sy=BW>m4Z1QzxH#O{MkK-vi9@c66eRjD|9{}~pZ`DSSOD~nkK(pe zbaVrN8$0DGc+BWZumSbn@lmXOIYnrVZ)yNUX{lLD526`ei9hC7Z0i<@>!QV z0P;MKO3KQE4}sxuxG_O3iG2v%j>jujQj+I+-1rlnb0{fs&XHx=iUFK+mEw4N9_Nz@ z0Q38MCEJiU1K&R)5N$b|oXyvW=~c68^QS z3Z)tL+j4VcXY5b z)B!*~m&M9vdGtshiFh10lB&w7*ZxXdVh>frpdOX=wH=B=i=udRRt~gpRVAOx;yd}L=WSI>p=wKf{@EgdXp9|-B9s<08V7IhCLY^GJhodX zSG5#>x$p^rXiTgXGgSv=h2Ubq6 znb_YZ)>f92HR7cuu@?S8k4FZeVixG>iE>@Fk*u7~^z<1YTfn{d{@iw6>Q-7Y3jip} zP5>5{7qH6Z8o}0YP%N)|3?olE^}kMAAi`_5b16bj$AYJ5A4G*^5XyXg`~LO zyRXpnnL?pJYpaChETl6!>5Se$VE*zo{vVVrL-^hEQD0oAZQlWW1O0)WRnYmaM>~l z#RHpK&Z!Met-7Mq671e1z6QWd-)w4y$rqmTndzJ2zZ{AX?B27bIH;Hfteh@>PT?|5 z6KQSnM$H$pf|b)zcEuPTKW@Kw>W>~0!++z)?W$p5ENPy)e{MbZH-cg0!IdFyt7KQ# zkb>QNgnuraJ-MO(-GqilCTw}V)ourhveVPNsF+CSCQtYV`UmYxvopS}D!Op?-)TuHV-`b3#QJ$#--UAckOSAp^*u8D1Qq6 zu3H)g5&*MQMzU5{XleB~O%r#g`(I$?bo9k4r^BnnRaLd<5x<*`@o#BVKbRtztCXXKJ zS3}74bE99c&j3N!3#PZMLRx@`EeL?P1myZy?Evhz%>Zc_T{1H_{&2}O}H41Wtnk?Uf{ z5_@K;Oj1>O=z;r4sw$b49D5TnVSxq$)sjgf9w5b#qh zngjy=hQM<6ta6!mr#__jz-`Q5zQ+AOxkFs1&rdbC0Kn*xhc-0p*D1}nom3o-M(lWO zH>$RT`zkD8t*&r%^iFYbcz^Z}r#uRr>38h#ei4M*K{}(OYN>{+1K;rYaZfdCmWFO< zAD`P+49tCcbyI?p(_%%%OL$vsA$h}NiS5R~_dz;3dM5xE=jOS3HAB@fL`pgZrKcyl zo)K`$EFgy>;?P+y@2ph}11qQVb?VIK1l)&_FK#sYc!$4@`a_GA(?F?~+F*61w%}Y{ z_gn2DQhlBG9Hq(9Qdb$%>Hh%G76>*Sxt!inD6VaZz_$$EAoguCO(OsR002ovPDHLk FV1iue7kvN# delta 1609 zcmV-P2DbU$4B!lqDu2cR#sJ26Gb?id000SaNLh0L01FTR01FTSts}j400007bV*G` z2j~eF4jDUcG&D;900r$yL_t(o!=;y7Y#UV?$A3;{;&B?su{Q)9*AJx>MQwLQLyE*D zNL(6$LIYCSNKkE-NJxn7!>VGXeL)})JOB?oAXEt+DvAIRQGY1q($a=TB3yRcC|MR- zRV^jiIumc5)?>%9J>#)GJUDYYV>=;%zhs^9Ip3V~pYMJ=qo03h0mM|5_dc0KZfj$m zzYTzFCWVUZFtqDIil#0OFV!JYE*Jm|?%2!+ z<39uNaPRfJ_sJwNRVABA;o1M@YnB?HMUBt%;}3KALSY&eMQoZ+#@YJEP9ouJh=kXR z&DHoUUmW`$Unnf*^2vA&3129TnbDB_K>+c5XHN&;{C~KBr*B}`abSOB)q=H(VPya#%Fo@nU{WzsI@c- zxxRs6>wnnc{X(Gkj{5+RT8dz_AdPUs%Wr z6NEbJt16q#BFi$;$A`ZKplAE08c%nUu;uEZXMg)9bUiEnUzmxB=Z%|kb>GS5ax^tb zNcKb`sgX!(H3X(kpX2wSXzIf5u8%r@f#ywHt`bP5GlT+uPEJnM2q)8-6%RQ(eG!1| zJ-sz+x}GJ_9z|{q)MUx?=T9RAJ8uwi-PnE;`(A%`MNc2x^PDw*W=bR$zps)tLjgYr z-+%w8M&2gn%#^lcKK|IBk@Cqnl3dArsn`ttLwl`t{x(Lchz#y|&dO#|q+&CIaM9H9 zM|>-4$IcD)u$b0pXzAP_z6QWZT&g)7VC3~@Jx1b^_%Hi|v~+G*l^>Lh9A-unKRa<5 zhJmy=H(f~#vVxh>P_7BnKeX5S?7*uo5`X@Nph&w?XDoLWgO zEF!gZZV>i4c6k4?_IDEM8yL3arBb^VD9Sol@uFlP9U0l@+1}G@othZ;tahVghxf1g zoj`lkG8U7fGCE1?W&_gwgHKuj{hNDSX|}q~+xh(7`yOTV=)0Vn7 z?f<`Y8A)ypFmn8i_?p|dwu*wJ#%K9zqO#%0@iWM+0T$<`kz_^qhM8Hp5Je*q_PzBs zPyY2UgaUpp#Nup>UJXU5`lU#CJ)e%Apd%FImhNpp!fld;8N5vriXx-yCVz?|SNV)7 z){H`tn5y!?y>}B+Rg&op8>3-Yag(as=x8KTX)ux+(MW`H;XBs>my>B^Ny6vzlFu9X zeBK(zve(RFkxxfYux-nYOr1W*J-6K~#<8QL^)&#nYv%*Ys`cV*+_RQY><-d0G+-{I*}dyladCL@m45@S4eaiBaK~ohglj<}siDSaYepNM{-M3DY*sG}orwSE z$eMg$^1o+SBq-S>R%E=WyTs;V(=JV{)dzkJ((YZi0&sG2inC{vlyzN%q@7T@xB@vX zI-XZsL!|0F@48BpqM<4?CKCSxpxM__x8<^HM=rm(DgwU%yh11y(foX&00000NkvXX Hu0mjfu_+mo diff --git a/src/main/resources/assets/create/textures/block/port2.png b/src/main/resources/assets/create/textures/block/port2.png index cbe74b02160595a9f572ac58e8ac4e1573d2585f..68fe5fd6e990ff5f897528c6bbff629190d8e494 100644 GIT binary patch delta 60 zcmeC??B<-HWyk;mKb?2i11Zh|kH}&M25un`X1sK_?hjCqy~NYkmHh>efPjis#|xpY I8>0 Date: Tue, 17 Dec 2024 17:06:54 +0100 Subject: [PATCH 195/515] Requesting with a plan - Conveyors now have a stress impact by default - Fixed shops secretly not allowing higher cost counts than the items' stack size - Stock keepers can now request items from a schematic checklist clipboard - Fixed item hatch not able to be wrench-picked --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 6 +- .../resources/assets/create/lang/en_ud.json | 2 + .../resources/assets/create/lang/en_us.json | 2 + .../java/com/simibubi/create/AllBlocks.java | 3 +- .../equipment/clipboard/ClipboardEntry.java | 7 +- .../logistics/itemHatch/ItemHatchBlock.java | 4 ++ .../stockTicker/StockKeeperRequestScreen.java | 69 ++++++++++++++++--- .../TableClothFilteringBehaviour.java | 15 +++- .../tableCloth/TableClothOverlayRenderer.java | 3 + .../schematics/cannon/MaterialChecklist.java | 4 +- .../assets/create/lang/default/interface.json | 2 + 11 files changed, 97 insertions(+), 20 deletions(-) diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 486ed75bdc..f78e4413d2 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-12-17T11:49:49.8195572 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-12-17T16:42:52.2059277 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -642,8 +642,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -e6c336785b83d73c677a5a996c39324959f90965 assets/create/lang/en_ud.json -59435160c92774cb6c0dc6961ae8ed967c891316 assets/create/lang/en_us.json +33f0bde213177bcffadeead5af35318609ab0005 assets/create/lang/en_ud.json +806d0feae84b76dd2b16b484668dbb4cf48d3979 assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 6751a460ad..7167aafc63 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -1339,6 +1339,8 @@ "create.gui.stock_keeper.package_adress": "ssǝɹppⱯ ǝbɐʞɔɐԀ", "create.gui.stock_keeper.program_requester": "ɹǝʇsǝnbǝᴚ ɯɐɹboɹԀ", "create.gui.stock_keeper.request_sent": "¡ʇuǝS ʇsǝnbǝᴚ", + "create.gui.stock_keeper.schematic_list.no_results": "ʞɔoʇs uı ǝɹɐ ʇsıןʞɔǝɥɔ ɹnoʎ ɯoɹɟ sɯǝʇı oN", + "create.gui.stock_keeper.schematic_list.requesting": "ʇsıןʞɔǝɥɔ ɹnoʎ ɯoɹɟ sɯǝʇı ǝןqɐןıɐʌɐ ןןɐ ʇsǝnbǝɹ oʇ ,puǝS, ʞɔıןƆ", "create.gui.stock_keeper.search_items": "sɯǝʇI ɥɔɹɐǝS", "create.gui.stock_keeper.send": "puǝS", "create.gui.stock_keeper.slots_full": "ןןnɟ ʎpɐǝɹןɐ sʇoןs ɹǝpɹO", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index c8770d0d6a..c6b6d3760d 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1339,6 +1339,8 @@ "create.gui.stock_keeper.package_adress": "Package Address", "create.gui.stock_keeper.program_requester": "Program Requester", "create.gui.stock_keeper.request_sent": "Request Sent!", + "create.gui.stock_keeper.schematic_list.no_results": "No items from your checklist are in stock", + "create.gui.stock_keeper.schematic_list.requesting": "Click 'Send' to request all available items from your checklist", "create.gui.stock_keeper.search_items": "Search Items", "create.gui.stock_keeper.send": "Send", "create.gui.stock_keeper.slots_full": "Order slots already full", diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 8b6bb9592c..8b1dab8a85 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -552,7 +552,7 @@ public class AllBlocks { .properties(p -> p.noOcclusion() .mapColor(MapColor.PODZOL)) .transform(axeOrPickaxe()) - .transform(BlockStressDefaults.setNoImpact()) + .transform(BlockStressDefaults.setImpact(1)) .tag(AllBlockTags.RELOCATION_NOT_SUPPORTED.tag) .blockstate((c, p) -> p.simpleBlock(c.getEntry(), AssetLookup.partialBaseModel(c, p))) .item() @@ -1913,7 +1913,6 @@ public class AllBlocks { .initialProperties(SharedProperties::softMetal) .properties(p -> p.mapColor(MapColor.TERRACOTTA_BLUE) .sound(SoundType.NETHERITE_BLOCK)) - .addLayer(() -> RenderType::translucent) .transform(pickaxeOnly()) .blockstate((c, p) -> p.directionalBlock(c.get(), AssetLookup.forPowered(c, p))) .item(LogisticallyLinkedBlockItem::new) diff --git a/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardEntry.java b/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardEntry.java index 57e9cacf04..c8676d4f24 100644 --- a/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardEntry.java +++ b/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardEntry.java @@ -15,6 +15,7 @@ public class ClipboardEntry { public boolean checked; public MutableComponent text; public ItemStack icon; + public int itemAmount; public ClipboardEntry(boolean checked, MutableComponent text) { this.checked = checked; @@ -22,8 +23,9 @@ public class ClipboardEntry { this.icon = ItemStack.EMPTY; } - public ClipboardEntry displayItem(ItemStack icon) { + public ClipboardEntry displayItem(ItemStack icon, int amount) { this.icon = icon; + this.itemAmount = amount; return this; } @@ -62,6 +64,7 @@ public class ClipboardEntry { if (icon.isEmpty()) return nbt; nbt.put("Icon", icon.serializeNBT()); + nbt.putInt("ItemAmount", itemAmount); return nbt; } @@ -69,7 +72,7 @@ public class ClipboardEntry { ClipboardEntry clipboardEntry = new ClipboardEntry(tag.getBoolean("Checked"), Component.Serializer.fromJson(tag.getString("Text"))); if (tag.contains("Icon")) - clipboardEntry.displayItem(ItemStack.of(tag.getCompound("Icon"))); + clipboardEntry.displayItem(ItemStack.of(tag.getCompound("Icon")), tag.getInt("ItemAmount")); return clipboardEntry; } diff --git a/src/main/java/com/simibubi/create/content/logistics/itemHatch/ItemHatchBlock.java b/src/main/java/com/simibubi/create/content/logistics/itemHatch/ItemHatchBlock.java index 36861d607f..052ab25a97 100644 --- a/src/main/java/com/simibubi/create/content/logistics/itemHatch/ItemHatchBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/itemHatch/ItemHatchBlock.java @@ -6,6 +6,7 @@ import java.util.List; import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllShapes; import com.simibubi.create.AllSoundEvents; +import com.simibubi.create.AllTags.AllItemTags; import com.simibubi.create.content.equipment.wrench.IWrenchable; import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.foundation.block.IBE; @@ -113,6 +114,9 @@ public class ItemHatchBlock extends HorizontalDirectionalBlock boolean anyInserted = false; boolean depositItemInHand = !pPlayer.isShiftKeyDown(); + if (!depositItemInHand && AllItemTags.WRENCH.matches(pPlayer.getItemInHand(pHand))) + return InteractionResult.PASS; + for (int i = 0; i < inventory.items.size(); i++) { if (Inventory.isHotbarSlot(i) != depositItemInHand) continue; diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperRequestScreen.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperRequestScreen.java index 7ffb0376b0..495bf75903 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperRequestScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperRequestScreen.java @@ -24,6 +24,7 @@ import com.simibubi.create.AllPackets; import com.simibubi.create.AllPartialModels; import com.simibubi.create.AllTags.AllItemTags; import com.simibubi.create.content.contraptions.actors.seat.SeatEntity; +import com.simibubi.create.content.equipment.clipboard.ClipboardEntry; import com.simibubi.create.content.logistics.AddressEditBox; import com.simibubi.create.content.logistics.BigItemStack; import com.simibubi.create.content.logistics.packager.InventorySummary; @@ -45,6 +46,7 @@ import net.createmod.catnip.utility.Iterate; import net.createmod.catnip.utility.Pair; import net.createmod.catnip.utility.animation.LerpedFloat; import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.utility.lang.Components; import net.createmod.catnip.utility.math.AngleHelper; import net.createmod.catnip.utility.theme.Color; import net.minecraft.ChatFormatting; @@ -58,6 +60,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; +import net.minecraft.util.FormattedCharSequence; import net.minecraft.util.Mth; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Inventory; @@ -125,6 +128,7 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen> clipboardItem; private boolean isAdmin; private boolean isLocked; @@ -163,6 +167,9 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen(); for (int i = 0; i < blockEntity.categories.size(); i++) { ItemStack stack = blockEntity.categories.get(i); @@ -504,6 +517,10 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen 8) + graphics.drawString(font, Components.literal("[+" + (itemsToOrder.size() - 8) + "]"), x + windowWidth - 40, + orderY + 21, 0xB59370); + boolean justSent = itemsToOrder.isEmpty() && successTicks > 0; if (isConfirmHovered(mouseX, mouseY) && !justSent) AllGuiTextures.STOCK_KEEPER_REQUEST_SEND_HOVER.render(graphics, x + windowWidth - 81, @@ -590,14 +607,19 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen 0) { - graphics.drawString(font, msg, x + windowWidth / 2 - font.width(msg) / 2 + 1, itemsY + 20 + 1, - new Color(0x4A2D31).setAlpha(alpha) - .getRGB(), - false); - graphics.drawString(font, msg, x + windowWidth / 2 - font.width(msg) / 2, itemsY + 20, - new Color(0xF8F8EC).setAlpha(alpha) - .getRGB(), - false); + List split = font.split(msg, 160); + for (int i = 0; i < split.size(); i++) { + FormattedCharSequence sequence = split.get(i); + int lineWidth = font.width(sequence); + graphics.drawString(font, sequence, x + windowWidth / 2 - lineWidth / 2 + 1, + itemsY + 20 + 1 + i * (font.lineHeight + 1), new Color(0x4A2D31).setAlpha(alpha) + .getRGB(), + false); + graphics.drawString(font, sequence, x + windowWidth / 2 - lineWidth / 2, + itemsY + 20 + i * (font.lineHeight + 1), new Color(0xF8F8EC).setAlpha(alpha) + .getRGB(), + false); + } } } @@ -854,7 +876,7 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen getHoveredSlot(int x, int y) { x += 1; - if (x < itemsX || x >= itemsX + cols * colWidth) + if (x < itemsX || x >= itemsX + cols * colWidth || isSchematicListMode()) return noneHovered; // Ordered item is hovered @@ -926,6 +948,11 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen(); blockEntity.ticksSinceLastUpdate = 10; successTicks = 1; + + if (isSchematicListMode()) + menu.player.closeContainer(); } @Override @@ -1238,6 +1269,24 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen list : clipboardItem) { + for (ClipboardEntry entry : list) { + ItemStack stack = entry.icon; + int toOrder = Math.min(entry.itemAmount, availableItems.getCountOf(stack)); + if (toOrder == 0) + continue; + itemsToOrder.add(new BigItemStack(stack, toOrder)); + } + } + } + public void requestCraftable(CraftableBigItemStack cbis, int requestedDifference) { boolean takeOrdersAway = requestedDifference < 0; if (takeOrdersAway) diff --git a/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothFilteringBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothFilteringBehaviour.java index 08d6861142..bfbd5495fd 100644 --- a/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothFilteringBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothFilteringBehaviour.java @@ -18,7 +18,6 @@ public class TableClothFilteringBehaviour extends FilteringBehaviour { public TableClothFilteringBehaviour(TableClothBlockEntity be) { super(be, new TableClothFilterSlot(be)); - showCountWhen(() -> !filter.isEmpty()); withPredicate(is -> !(is.getItem() instanceof FilterItem)); count = 1; } @@ -48,6 +47,10 @@ public class TableClothFilteringBehaviour extends FilteringBehaviour { return CreateLang.translateDirect("table_cloth.price_per_order"); } + public boolean isCountVisible() { + return !filter.isEmpty(); + } + @Override public boolean setFilter(ItemStack stack) { int before = count; @@ -55,6 +58,16 @@ public class TableClothFilteringBehaviour extends FilteringBehaviour { count = before; return result; } + + @Override + public void setValueSettings(Player player, ValueSettings settings, boolean ctrlDown) { + if (getValueSettings().equals(settings)) + return; + count = settings.value(); + blockEntity.setChanged(); + blockEntity.sendData(); + playFeedbackSound(this); + } @Override public ValueSettingsBoard createBoard(Player player, BlockHitResult hitResult) { diff --git a/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothOverlayRenderer.java b/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothOverlayRenderer.java index 24c9c58887..1256ce6c0a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothOverlayRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothOverlayRenderer.java @@ -1,5 +1,6 @@ package com.simibubi.create.content.logistics.tableCloth; +import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.content.equipment.blueprint.BlueprintOverlayRenderer; import com.simibubi.create.content.logistics.stockTicker.StockTickerBlockEntity; @@ -34,6 +35,8 @@ public class TableClothOverlayRenderer { return; if (!dcbe.isShop()) return; + if (AllBlocks.CLIPBOARD.isIn(heldItem)) + return; if (dcbe.targetsPriceTag(mc.player, bhr)) return; diff --git a/src/main/java/com/simibubi/create/content/schematics/cannon/MaterialChecklist.java b/src/main/java/com/simibubi/create/content/schematics/cannon/MaterialChecklist.java index 5174e31967..f79bc00a2b 100644 --- a/src/main/java/com/simibubi/create/content/schematics/cannon/MaterialChecklist.java +++ b/src/main/java/com/simibubi/create/content/schematics/cannon/MaterialChecklist.java @@ -202,7 +202,7 @@ public class MaterialChecklist { itemsWritten++; currentPage.add(new ClipboardEntry(false, entry(new ItemStack(item), amount, true, false)) - .displayItem(new ItemStack(item))); + .displayItem(new ItemStack(item), amount)); } for (Item item : completed) { @@ -216,7 +216,7 @@ public class MaterialChecklist { itemsWritten++; currentPage.add(new ClipboardEntry(true, entry(new ItemStack(item), getRequiredAmount(item), false, false)) - .displayItem(new ItemStack(item))); + .displayItem(new ItemStack(item), 0)); } pages.add(currentPage); diff --git a/src/main/resources/assets/create/lang/default/interface.json b/src/main/resources/assets/create/lang/default/interface.json index 21ad2c81a1..a10d42f29b 100644 --- a/src/main/resources/assets/create/lang/default/interface.json +++ b/src/main/resources/assets/create/lang/default/interface.json @@ -340,6 +340,8 @@ "create.gui.stock_keeper.already_ordering_recipe": "Already ordering this recipe", "create.gui.stock_keeper.slots_full": "Order slots already full", "create.gui.stock_keeper.not_in_stock": "Required items are not in Stock", + "create.gui.stock_keeper.schematic_list.no_results": "No items from your checklist are in stock", + "create.gui.stock_keeper.schematic_list.requesting": "Click 'Send' to request all available items from your checklist", "create.stock_keeper.shopping_list_empty_hand": "Empty hand required to start a shopping list", "create.stock_keeper.no_price_set": "Shop owner must set a price first", From 838b918760a456a3167002a0e4770a4496d6d302 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Tue, 17 Dec 2024 17:41:09 +0100 Subject: [PATCH 196/515] Link takeover - Packagers switch to a bespoke state when a stock link is attached --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 4 +- .../assets/create/blockstates/packager.json | 66 ++++++++++++++---- .../logistics/packager/PackagerBlock.java | 8 ++- .../packager/PackagerBlockEntity.java | 66 +++++++++++++++--- .../logistics/packager/PackagerGenerator.java | 3 +- .../packager/repackager/RepackagerBlock.java | 8 +++ .../repackager/RepackagerBlockEntity.java | 8 +++ .../packagerLink/PackagerLinkBlockEntity.java | 3 + .../models/block/packager/block_linked.json | 6 ++ .../block/packager/block_vertical_linked.json | 6 ++ .../block/packager_horizontal_linked.png | Bin 0 -> 593 bytes .../block/packager_vertical_linked.png | Bin 0 -> 605 bytes 12 files changed, 150 insertions(+), 28 deletions(-) create mode 100644 src/main/resources/assets/create/models/block/packager/block_linked.json create mode 100644 src/main/resources/assets/create/models/block/packager/block_vertical_linked.json create mode 100644 src/main/resources/assets/create/textures/block/packager_horizontal_linked.png create mode 100644 src/main/resources/assets/create/textures/block/packager_vertical_linked.png diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index f78e4413d2..534cb12173 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-12-17T16:42:52.2059277 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-12-17T17:30:42.0875961 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -383,7 +383,7 @@ ac536ae742c12e97bfd0b2483c87ff29f3935eaf assets/create/blockstates/oxidized_copp 110a6c19bcc9f044e5e982ac6e4b295b03ec0145 assets/create/blockstates/oxidized_copper_tiles.json 3f3924f0f0e368edfa04f4fdd6d6c2319276ddfe assets/create/blockstates/oxidized_copper_tile_slab.json 5e634cfb9abb06d8b29f39d751fc56b28ea5a9cd assets/create/blockstates/oxidized_copper_tile_stairs.json -f32b0a23c1aed1c92684146e9746851091872519 assets/create/blockstates/packager.json +65f3fa5a068189c1c2971af1a1052f69c0e26005 assets/create/blockstates/packager.json 887565a0f89f089d6be888c87394dde4878afda7 assets/create/blockstates/package_frogport.json 36742cc6ce052ead143366d31b11e828a525c1b8 assets/create/blockstates/peculiar_bell.json 53d102e706d53cb2c0dbc0bc11da828084a43519 assets/create/blockstates/pink_nixie_tube.json diff --git a/src/generated/resources/assets/create/blockstates/packager.json b/src/generated/resources/assets/create/blockstates/packager.json index c0a70c4ad3..fc7a5a9466 100644 --- a/src/generated/resources/assets/create/blockstates/packager.json +++ b/src/generated/resources/assets/create/blockstates/packager.json @@ -1,46 +1,88 @@ { "variants": { - "facing=down,powered=false": { + "facing=down,linked=false,powered=false": { "model": "create:block/packager/block_vertical" }, - "facing=down,powered=true": { + "facing=down,linked=false,powered=true": { "model": "create:block/packager/block_vertical_powered" }, - "facing=east,powered=false": { + "facing=down,linked=true,powered=false": { + "model": "create:block/packager/block_vertical_linked" + }, + "facing=down,linked=true,powered=true": { + "model": "create:block/packager/block_vertical_linked" + }, + "facing=east,linked=false,powered=false": { "model": "create:block/packager/block", "y": 270 }, - "facing=east,powered=true": { + "facing=east,linked=false,powered=true": { "model": "create:block/packager/block_powered", "y": 270 }, - "facing=north,powered=false": { + "facing=east,linked=true,powered=false": { + "model": "create:block/packager/block_linked", + "y": 270 + }, + "facing=east,linked=true,powered=true": { + "model": "create:block/packager/block_linked", + "y": 270 + }, + "facing=north,linked=false,powered=false": { "model": "create:block/packager/block", "y": 180 }, - "facing=north,powered=true": { + "facing=north,linked=false,powered=true": { "model": "create:block/packager/block_powered", "y": 180 }, - "facing=south,powered=false": { + "facing=north,linked=true,powered=false": { + "model": "create:block/packager/block_linked", + "y": 180 + }, + "facing=north,linked=true,powered=true": { + "model": "create:block/packager/block_linked", + "y": 180 + }, + "facing=south,linked=false,powered=false": { "model": "create:block/packager/block" }, - "facing=south,powered=true": { + "facing=south,linked=false,powered=true": { "model": "create:block/packager/block_powered" }, - "facing=up,powered=false": { + "facing=south,linked=true,powered=false": { + "model": "create:block/packager/block_linked" + }, + "facing=south,linked=true,powered=true": { + "model": "create:block/packager/block_linked" + }, + "facing=up,linked=false,powered=false": { "model": "create:block/packager/block_vertical" }, - "facing=up,powered=true": { + "facing=up,linked=false,powered=true": { "model": "create:block/packager/block_vertical_powered" }, - "facing=west,powered=false": { + "facing=up,linked=true,powered=false": { + "model": "create:block/packager/block_vertical_linked" + }, + "facing=up,linked=true,powered=true": { + "model": "create:block/packager/block_vertical_linked" + }, + "facing=west,linked=false,powered=false": { "model": "create:block/packager/block", "y": 90 }, - "facing=west,powered=true": { + "facing=west,linked=false,powered=true": { "model": "create:block/packager/block_powered", "y": 90 + }, + "facing=west,linked=true,powered=false": { + "model": "create:block/packager/block_linked", + "y": 90 + }, + "facing=west,linked=true,powered=true": { + "model": "create:block/packager/block_linked", + "y": 90 } } } \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java index ad9dfccb7d..31d2b31a16 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java @@ -35,10 +35,14 @@ import net.minecraftforge.items.IItemHandler; public class PackagerBlock extends WrenchableDirectionalBlock implements IBE, IWrenchable { public static final BooleanProperty POWERED = BlockStateProperties.POWERED; + public static final BooleanProperty LINKED = BooleanProperty.create("linked"); public PackagerBlock(Properties properties) { super(properties); - registerDefaultState(defaultBlockState().setValue(POWERED, false)); + BlockState defaultBlockState = defaultBlockState(); + if (defaultBlockState.hasProperty(LINKED)) + defaultBlockState = defaultBlockState.setValue(LINKED, false); + registerDefaultState(defaultBlockState.setValue(POWERED, false)); } @Override @@ -116,7 +120,7 @@ public class PackagerBlock extends WrenchableDirectionalBlock implements IBE builder) { - super.createBlockStateDefinition(builder.add(POWERED)); + super.createBlockStateDefinition(builder.add(POWERED, LINKED)); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java index 82cc73fdaa..8fdfdfdc39 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java @@ -102,6 +102,12 @@ public class PackagerBlockEntity extends SmartBlockEntity { return target != null && !(target instanceof PortableStorageInterfaceBlockEntity); } + @Override + public void initialize() { + super.initialize(); + recheckIfLinksPresent(); + } + @Override public void tick() { super.tick(); @@ -213,16 +219,49 @@ public class PackagerBlockEntity extends SmartBlockEntity { @Override public void lazyTick() { super.lazyTick(); - if (!redstonePowered || level.isClientSide()) + if (level.isClientSide()) + return; + recheckIfLinksPresent(); + if (!redstonePowered) return; redstonePowered = getBlockState().getOptionalValue(PackagerBlock.POWERED) .orElse(false); - if (!redstonePowered) + if (!redstoneModeActive()) return; updateSignAddress(); attemptToSend(null); } + public void recheckIfLinksPresent() { + if (level.isClientSide()) + return; + BlockState blockState = getBlockState(); + if (!blockState.hasProperty(PackagerBlock.LINKED)) + return; + boolean shouldBeLinked = shouldBeLinked(); + boolean isLinked = blockState.getValue(PackagerBlock.LINKED); + if (shouldBeLinked == isLinked) + return; + level.setBlockAndUpdate(worldPosition, blockState.cycle(PackagerBlock.LINKED)); + } + + public boolean redstoneModeActive() { + return !getBlockState().getOptionalValue(PackagerBlock.LINKED) + .orElse(false); + } + + private boolean shouldBeLinked() { + for (Direction d : Iterate.directions) { + BlockState adjacentState = level.getBlockState(worldPosition.relative(d)); + if (!AllBlocks.STOCK_LINK.has(adjacentState)) + continue; + if (adjacentState.getValue(PackagerLinkBlock.FACING) != d) + continue; + return true; + } + return false; + } + public boolean isTooBusyFor(RequestType type) { int queue = queuedExitingPackages.size(); return queue >= switch (type) { @@ -235,6 +274,11 @@ public class PackagerBlockEntity extends SmartBlockEntity { public void activate() { redstonePowered = true; setChanged(); + + recheckIfLinksPresent(); + if (!redstoneModeActive()) + return; + updateSignAddress(); attemptToSend(null); } @@ -256,7 +300,7 @@ public class PackagerBlockEntity extends SmartBlockEntity { boolean targetIsCreativeCrate = targetInv instanceof BottomlessItemHandler; boolean targetIsCrafter = targetBE instanceof MechanicalCrafterBlockEntity; - + if (targetBE instanceof BasinBlockEntity basin) basin.inputInventory.packagerMode = true; @@ -264,7 +308,7 @@ public class PackagerBlockEntity extends SmartBlockEntity { ItemStack itemInSlot = targetInv.getStackInSlot(slot); if (!simulate) itemInSlot = itemInSlot.copy(); - + int itemsAddedToSlot = 0; for (int boxSlot = 0; boxSlot < contents.getSlots(); boxSlot++) { @@ -286,7 +330,7 @@ public class PackagerBlockEntity extends SmartBlockEntity { if (targetInv.insertItem(slot, toInsert, true) .getCount() == toInsert.getCount()) continue; - + if (itemInSlot.isEmpty()) { int maxStackSize = targetInv.getSlotLimit(slot); if (maxStackSize < toInsert.getCount()) { @@ -294,15 +338,15 @@ public class PackagerBlockEntity extends SmartBlockEntity { toInsert = ItemHandlerHelper.copyStackWithSize(toInsert, maxStackSize); } else contents.setStackInSlot(boxSlot, ItemStack.EMPTY); - + itemInSlot = toInsert; if (!simulate) itemInSlot = itemInSlot.copy(); - + targetInv.insertItem(slot, toInsert, simulate); continue; } - + if (!ItemHandlerHelper.canItemStacksStack(toInsert, itemInSlot)) continue; @@ -315,12 +359,12 @@ public class PackagerBlockEntity extends SmartBlockEntity { int added = Math.min(insertedAmount, Math.max(0, insertableAmountWithPreviousItems)); itemsAddedToSlot += added; - + contents.setStackInSlot(boxSlot, ItemHandlerHelper.copyStackWithSize(toInsert, toInsert.getCount() - added)); } } - + if (targetBE instanceof BasinBlockEntity basin) basin.inputInventory.packagerMode = false; @@ -380,7 +424,7 @@ public class PackagerBlockEntity extends SmartBlockEntity { Outer: for (int i = 0; i < PackageItem.SLOTS; i++) { boolean continuePacking = true; - + while (continuePacking) { continuePacking = false; diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerGenerator.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerGenerator.java index 878a600b0a..bcfddd8d0f 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerGenerator.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerGenerator.java @@ -25,7 +25,8 @@ public class PackagerGenerator extends SpecialBlockStateGen { @Override public ModelFile getModel(DataGenContext ctx, RegistrateBlockstateProvider prov, BlockState state) { - String suffix = state.getValue(PackagerBlock.POWERED) ? "powered" : ""; + String suffix = state.getOptionalValue(PackagerBlock.LINKED) + .orElse(false) ? "linked" : state.getValue(PackagerBlock.POWERED) ? "powered" : ""; return state.getValue(PackagerBlock.FACING) .getAxis() == Axis.Y ? AssetLookup.partialBaseModel(ctx, prov, "vertical", suffix) : AssetLookup.partialBaseModel(ctx, prov, suffix); diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/repackager/RepackagerBlock.java b/src/main/java/com/simibubi/create/content/logistics/packager/repackager/RepackagerBlock.java index 25b6f5fe31..c54c231aea 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/repackager/RepackagerBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/repackager/RepackagerBlock.java @@ -4,7 +4,10 @@ import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.content.logistics.packager.PackagerBlock; import com.simibubi.create.content.logistics.packager.PackagerBlockEntity; +import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition.Builder; public class RepackagerBlock extends PackagerBlock { @@ -16,5 +19,10 @@ public class RepackagerBlock extends PackagerBlock { public BlockEntityType getBlockEntityType() { return AllBlockEntityTypes.REPACKAGER.get(); } + + @Override + protected void createBlockStateDefinition(Builder builder) { + builder.add(FACING, POWERED); + } } diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/repackager/RepackagerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packager/repackager/RepackagerBlockEntity.java index e937474577..14d54f3ba7 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/repackager/RepackagerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/repackager/RepackagerBlockEntity.java @@ -56,6 +56,14 @@ public class RepackagerBlockEntity extends PackagerBlockEntity { return true; } + @Override + public void recheckIfLinksPresent() {} + + @Override + public boolean redstoneModeActive() { + return true; + } + public void attemptToSend(List queuedRequests) { if (queuedRequests == null && (!heldBox.isEmpty() || animationTicks != 0)) return; diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java index a3f247e86c..f9c5be1422 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java @@ -91,6 +91,9 @@ public class PackagerLinkBlockEntity extends LinkWithBulbBlockEntity { public void initialize() { super.initialize(); behaviour.redstonePowerChanged(PackagerLinkBlock.getPower(getBlockState(), level, worldPosition)); + PackagerBlockEntity packager = getPackager(); + if (packager != null) + packager.recheckIfLinksPresent(); } @Nullable diff --git a/src/main/resources/assets/create/models/block/packager/block_linked.json b/src/main/resources/assets/create/models/block/packager/block_linked.json new file mode 100644 index 0000000000..0862307db9 --- /dev/null +++ b/src/main/resources/assets/create/models/block/packager/block_linked.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/packager/block", + "textures": { + "2": "create:block/packager_horizontal_linked" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/packager/block_vertical_linked.json b/src/main/resources/assets/create/models/block/packager/block_vertical_linked.json new file mode 100644 index 0000000000..a351222e38 --- /dev/null +++ b/src/main/resources/assets/create/models/block/packager/block_vertical_linked.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/packager/block_vertical", + "textures": { + "5": "create:block/packager_vertical_linked" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/block/packager_horizontal_linked.png b/src/main/resources/assets/create/textures/block/packager_horizontal_linked.png new file mode 100644 index 0000000000000000000000000000000000000000..2041f078958d2124d8139f9f6107c46c1537962c GIT binary patch literal 593 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCijq1AIbU4Xi92JzO#~leD!BZEZYSn#$+Tp1fzA)cwtzXFiY;E(!7r{*M6|Hr3wY07`QfctjR6Fz_7)VaDV6 zD^h@h5+$w?CBgY=CFO}lsSE*$nRz98ey$-3rh0~YhDlq4cz|lQrABzBd3tIwfJ|X! zkYZ$IU<9(ffLI#J2KiWnkr^z`1Y{dBGBF4M=_nx1Y-a(BX93wDkO0IW{V*EMQU+j{ zO<-qW0je-CGB#jb05KJ$gLMJKq$xl)2rvQ7VFIfRva|rQpt=kV3_!BdC6}jM;b`Lq zGUs@@IEGmGzn$pKcUXbPCHK$4wk4Ux{|}3;5O-X$`^_zLA*mx70&EPISy`0!Ib1pC zTD*L%7U#@!+(!~7C0+JNI`@$MO@dV2g0N=}jHe&6-+U#r!aHF$^Y5agcI?}%rBwbn zwFX?UmYGQ9>dmJHo-nV*024c(W^CTQXQGkews_FY@NiQ$hmp?uD7vUEsR~R hhyQEjw->ZHZ@xs&)_ae~nrR?6d%F6$taD0e0sv7Jsu2JH literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/packager_vertical_linked.png b/src/main/resources/assets/create/textures/block/packager_vertical_linked.png new file mode 100644 index 0000000000000000000000000000000000000000..0cd73feec3fd1936414d2d1876d1a2d395a60724 GIT binary patch literal 605 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCijq1AIbU4Xi92JzO#~lWc7~932BZ!!o_&3TFja9Ln}-X)2#Td-9%b>$J5E zO-*cr!vh~T<(w!9TOQ>A)V=a!?|mR8ToU9L{2v1_Y^uG(0hHz}@Q5sCVBk9p!i>lB zSEK+1B}!Z)N`mv#O3D+9QW*jgGxJLH{9Hp6O!W-)43oA7@c`9qOO5bM^YqkW0GYzd zAjQbazzAe{0kJfc4f3%DBQsc>3CK2NWMU8i(osO1+0FtM&jPYRAOVO$`e8Jhr3}C@ zo50S%0#spOWNg5=0Aeag2kQceNmGDq5MTnD!vt0tWN86pL3J4#7=UD@OD<2j!qLVJ zWUlaZaSXBWe>?Fu7qcRd%URdEF21+_{_kI#wlrkPh40^3N)9AmQDHe?t{_n8^HXA~ zlJM8!i$*V2b1{X!+H&rOHmk5r`~r!~SNIAI=H3eIUaiQc9c+E{QkKW;hY`G$yOp+U z&MkYxx%%O3mYKIE>I+?Sf5&;-oH6pUZok(lj_Ab)qMrUv7P+3bVe76HomPvIqP8V+ uew)C_A|k)t-#Y&Byh!<<(t34=3g-D2v)TTb(o^^s Date: Tue, 17 Dec 2024 15:51:01 -0500 Subject: [PATCH 197/515] Stunned links - Fix links not updating their redstone output when they've been taken out of receive mode - Creators-of-Create/Create#7226 --- .../kinetics/transmission/GearshiftBlock.java | 4 ++-- .../content/redstone/link/RedstoneLinkBlock.java | 12 ++++++++---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/kinetics/transmission/GearshiftBlock.java b/src/main/java/com/simibubi/create/content/kinetics/transmission/GearshiftBlock.java index b67d01d474..5e0e154ecd 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/transmission/GearshiftBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/transmission/GearshiftBlock.java @@ -58,7 +58,7 @@ public class GearshiftBlock extends AbstractEncasedShaftBlock implements IBE getBlockEntityClass() { return SplitShaftBlockEntity.class; } - + @Override public BlockEntityType getBlockEntityType() { return AllBlockEntityTypes.GEARSHIFT.get(); @@ -72,7 +72,7 @@ public class GearshiftBlock extends AbstractEncasedShaftBlock implements IBE Date: Tue, 17 Dec 2024 17:59:06 -0500 Subject: [PATCH 198/515] "Lite" Vaults - Add a limit to vaultCapacity to prevent players from OOM-ing themselves - Fixes Creators-of-Create/Create#6168 --- .../com/simibubi/create/infrastructure/config/CLogistics.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/simibubi/create/infrastructure/config/CLogistics.java b/src/main/java/com/simibubi/create/infrastructure/config/CLogistics.java index b49b116864..67c28b8df4 100644 --- a/src/main/java/com/simibubi/create/infrastructure/config/CLogistics.java +++ b/src/main/java/com/simibubi/create/infrastructure/config/CLogistics.java @@ -11,7 +11,7 @@ public class CLogistics extends ConfigBase { public final ConfigInt packagePortRange = i(5, 1, "packagePortRange", Comments.packagePortRange); public final ConfigInt linkRange = i(256, 1, "linkRange", Comments.linkRange); public final ConfigInt displayLinkRange = i(64, 1, "displayLinkRange", Comments.displayLinkRange); - public final ConfigInt vaultCapacity = i(20, 1, "vaultCapacity", Comments.vaultCapacity); + public final ConfigInt vaultCapacity = i(20, 1, 2048, "vaultCapacity", Comments.vaultCapacity); public final ConfigInt chainConveyorCapacity = i(20, 1, "chainConveyorCapacity", Comments.chainConveyorCapacity); public final ConfigInt brassTunnelTimer = i(10, 1, 10, "brassTunnelTimer", Comments.brassTunnelTimer); public final ConfigBool seatHostileMobs = b(true, "seatHostileMobs", Comments.seatHostileMobs); From d378f2e529de0b4049fe8cba8767591c480d974a Mon Sep 17 00:00:00 2001 From: IThundxr Date: Wed, 18 Dec 2024 09:34:53 -0500 Subject: [PATCH 199/515] NullPointerException: null - Fix sliding doors missing a null-check - Fixes Creators-of-Create/Create#6184 --- .../content/contraptions/behaviour/DoorMovingInteraction.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/behaviour/DoorMovingInteraction.java b/src/main/java/com/simibubi/create/content/contraptions/behaviour/DoorMovingInteraction.java index c4132ba4ba..b7762b9100 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/behaviour/DoorMovingInteraction.java +++ b/src/main/java/com/simibubi/create/content/contraptions/behaviour/DoorMovingInteraction.java @@ -29,13 +29,13 @@ public class DoorMovingInteraction extends SimpleBlockMovingInteraction { BlockPos otherPos = currentState.getValue(DoorBlock.HALF) == DoubleBlockHalf.LOWER ? pos.above() : pos.below(); StructureBlockInfo info = contraption.getBlocks() .get(otherPos); - if (info.state().hasProperty(DoorBlock.OPEN)) { + if (info != null && info.state().hasProperty(DoorBlock.OPEN)) { BlockState newState = info.state().cycle(DoorBlock.OPEN); setContraptionBlockData(contraption.entity, otherPos, new StructureBlockInfo(info.pos(), newState, info.nbt())); } currentState = currentState.cycle(DoorBlock.OPEN); - + if (player != null) { if (trainDoor) { From 03b9e6a3963476466b4fe364ff08aaebf2230de9 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Fri, 13 Dec 2024 10:00:49 -0500 Subject: [PATCH 200/515] API Blueprints - Implement an api for registering schematic requirements for PartialSafeNBT providers for block entities - Related issue: Creators-of-Create/Create#4702 --- .../api/schematic/nbt/IPartialSafeNBT.java | 11 ++ .../nbt/SchematicSafeNBTRegistry.java | 35 +++++ .../ISpecialBlockEntityItemRequirement.java | 9 ++ .../ISpecialBlockItemRequirement.java | 9 ++ .../ISpecialEntityItemRequirement.java | 7 + .../SchematicRequirementsRegistry.java | 121 ++++++++++++++++++ .../elevator/ElevatorContactBlock.java | 2 +- .../contraptions/glue/SuperGlueEntity.java | 2 +- .../mounted/CartAssemblerBlock.java | 2 +- .../copycat/CopycatBlockEntity.java | 4 +- .../girder/GirderEncasedShaftBlock.java | 2 +- .../decoration/placard/PlacardBlock.java | 2 +- .../equipment/armor/BacktankBlock.java | 2 +- .../equipment/blueprint/BlueprintEntity.java | 4 +- .../fluids/pipes/EncasedPipeBlock.java | 2 +- .../fluids/pipes/GlassFluidPipeBlock.java | 2 +- .../content/kinetics/belt/BeltBlock.java | 4 +- .../encased/EncasedCogwheelBlock.java | 2 +- .../encased/EncasedShaftBlock.java | 2 +- .../logistics/funnel/BeltFunnelBlock.java | 2 +- .../controller/LecternControllerBlock.java | 2 +- .../redstone/nixieTube/NixieTubeBlock.java | 2 +- .../ISpecialBlockEntityItemRequirement.java | 9 -- .../ISpecialBlockItemRequirement.java | 10 -- .../ISpecialEntityItemRequirement.java | 7 - .../requirement/ItemRequirement.java | 28 +++- .../trains/bogey/AbstractBogeyBlock.java | 2 +- .../trains/bogey/StandardBogeyBlock.java | 2 +- .../content/trains/track/TrackBlock.java | 2 +- .../blockEntity/SmartBlockEntity.java | 4 +- .../foundation/utility/BlockHelper.java | 24 ++-- .../foundation/utility/IPartialSafeNBT.java | 8 -- .../nbt/SchematicSafeNBTRegistryImpl.java | 23 ++++ .../SchematicRequirementsRegistryImpl.java | 61 +++++++++ 34 files changed, 339 insertions(+), 71 deletions(-) create mode 100644 src/main/java/com/simibubi/create/api/schematic/nbt/IPartialSafeNBT.java create mode 100644 src/main/java/com/simibubi/create/api/schematic/nbt/SchematicSafeNBTRegistry.java create mode 100644 src/main/java/com/simibubi/create/api/schematic/requirement/ISpecialBlockEntityItemRequirement.java create mode 100644 src/main/java/com/simibubi/create/api/schematic/requirement/ISpecialBlockItemRequirement.java create mode 100644 src/main/java/com/simibubi/create/api/schematic/requirement/ISpecialEntityItemRequirement.java create mode 100644 src/main/java/com/simibubi/create/api/schematic/requirement/SchematicRequirementsRegistry.java delete mode 100644 src/main/java/com/simibubi/create/content/schematics/requirement/ISpecialBlockEntityItemRequirement.java delete mode 100644 src/main/java/com/simibubi/create/content/schematics/requirement/ISpecialBlockItemRequirement.java delete mode 100644 src/main/java/com/simibubi/create/content/schematics/requirement/ISpecialEntityItemRequirement.java delete mode 100644 src/main/java/com/simibubi/create/foundation/utility/IPartialSafeNBT.java create mode 100644 src/main/java/com/simibubi/create/impl/schematic/nbt/SchematicSafeNBTRegistryImpl.java create mode 100644 src/main/java/com/simibubi/create/impl/schematic/requirement/SchematicRequirementsRegistryImpl.java diff --git a/src/main/java/com/simibubi/create/api/schematic/nbt/IPartialSafeNBT.java b/src/main/java/com/simibubi/create/api/schematic/nbt/IPartialSafeNBT.java new file mode 100644 index 0000000000..f3b112f403 --- /dev/null +++ b/src/main/java/com/simibubi/create/api/schematic/nbt/IPartialSafeNBT.java @@ -0,0 +1,11 @@ +package com.simibubi.create.api.schematic.nbt; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.level.block.entity.BlockEntity; + +import org.jetbrains.annotations.ApiStatus; + +public interface IPartialSafeNBT { + /** This will always be called from the logical server */ + void writeSafe(CompoundTag compound); +} diff --git a/src/main/java/com/simibubi/create/api/schematic/nbt/SchematicSafeNBTRegistry.java b/src/main/java/com/simibubi/create/api/schematic/nbt/SchematicSafeNBTRegistry.java new file mode 100644 index 0000000000..4d3210d04e --- /dev/null +++ b/src/main/java/com/simibubi/create/api/schematic/nbt/SchematicSafeNBTRegistry.java @@ -0,0 +1,35 @@ +package com.simibubi.create.api.schematic.nbt; + +import com.simibubi.create.impl.schematic.nbt.SchematicSafeNBTRegistryImpl; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; + +/** + * Registry for modifying the data of BlockEntities when being placed with the schematic system. + *
+ * Mostly used to exclude specific tags that would result in exploits from being written. + */ +public class SchematicSafeNBTRegistry { + /** + * Register a new partial safe nbt provider for a specific blockEntityType + * + * @param blockEntityType The block entity type you would like to register this for + * @param safeNBT The custom PartialSafeNBT provider you would like to register for this blockEntityType, + * your {@link ContextProvidingPartialSafeNBT#writeSafe(BlockEntity, CompoundTag)} method will be + * called on the passed {@link ContextProvidingPartialSafeNBT} + * when the block entities data is being prepared for placement. + */ + public static void register(BlockEntityType blockEntityType, ContextProvidingPartialSafeNBT safeNBT) { + SchematicSafeNBTRegistryImpl.register(blockEntityType, safeNBT); + } + + // --- Interface that provides the context that would be available if you were to implement IPartialSafeNBT instead --- + + @FunctionalInterface + public interface ContextProvidingPartialSafeNBT { + /** This will always be called from the logical server */ + void writeSafe(BlockEntity blockEntity, CompoundTag tag); + } +} diff --git a/src/main/java/com/simibubi/create/api/schematic/requirement/ISpecialBlockEntityItemRequirement.java b/src/main/java/com/simibubi/create/api/schematic/requirement/ISpecialBlockEntityItemRequirement.java new file mode 100644 index 0000000000..de6e29561b --- /dev/null +++ b/src/main/java/com/simibubi/create/api/schematic/requirement/ISpecialBlockEntityItemRequirement.java @@ -0,0 +1,9 @@ +package com.simibubi.create.api.schematic.requirement; + +import com.simibubi.create.content.schematics.requirement.ItemRequirement; + +import net.minecraft.world.level.block.state.BlockState; + +public interface ISpecialBlockEntityItemRequirement { + ItemRequirement getRequiredItems(BlockState state); +} diff --git a/src/main/java/com/simibubi/create/api/schematic/requirement/ISpecialBlockItemRequirement.java b/src/main/java/com/simibubi/create/api/schematic/requirement/ISpecialBlockItemRequirement.java new file mode 100644 index 0000000000..06eb4c972d --- /dev/null +++ b/src/main/java/com/simibubi/create/api/schematic/requirement/ISpecialBlockItemRequirement.java @@ -0,0 +1,9 @@ +package com.simibubi.create.api.schematic.requirement; + +import com.simibubi.create.content.schematics.requirement.ItemRequirement; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; + +public interface ISpecialBlockItemRequirement { + ItemRequirement getRequiredItems(BlockState state, BlockEntity blockEntity); +} diff --git a/src/main/java/com/simibubi/create/api/schematic/requirement/ISpecialEntityItemRequirement.java b/src/main/java/com/simibubi/create/api/schematic/requirement/ISpecialEntityItemRequirement.java new file mode 100644 index 0000000000..38bb16f779 --- /dev/null +++ b/src/main/java/com/simibubi/create/api/schematic/requirement/ISpecialEntityItemRequirement.java @@ -0,0 +1,7 @@ +package com.simibubi.create.api.schematic.requirement; + +import com.simibubi.create.content.schematics.requirement.ItemRequirement; + +public interface ISpecialEntityItemRequirement { + ItemRequirement getRequiredItems(); +} diff --git a/src/main/java/com/simibubi/create/api/schematic/requirement/SchematicRequirementsRegistry.java b/src/main/java/com/simibubi/create/api/schematic/requirement/SchematicRequirementsRegistry.java new file mode 100644 index 0000000000..992f6db404 --- /dev/null +++ b/src/main/java/com/simibubi/create/api/schematic/requirement/SchematicRequirementsRegistry.java @@ -0,0 +1,121 @@ +package com.simibubi.create.api.schematic.requirement; + +import com.simibubi.create.content.schematics.requirement.ItemRequirement; +import com.simibubi.create.foundation.utility.AttachedRegistry; + +import com.simibubi.create.impl.schematic.requirement.SchematicRequirementsRegistryImpl; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.registries.ForgeRegistries; + +import org.jetbrains.annotations.ApiStatus; + +import java.util.function.BiFunction; +import java.util.function.Function; + +/** + * Registry for schematic requirements for blocks, block entities, and entities. + */ +public class SchematicRequirementsRegistry { + /** + * Register a new special requirement for a specified block + * + * @param block The block you want to register a {@link BlockRequirement} for + * @param requirement The requirement you would like to add to this block, + * the {@link BlockRequirement#getRequiredItems(BlockState, BlockEntity)} + * method will be called on the {@link BlockRequirement} you have provided, + * and you will be able to insert requirements based off the context that is given + */ + public static void registerForBlock(Block block, BlockRequirement requirement) { + SchematicRequirementsRegistryImpl.registerForBlock(block, requirement); + } + + /** + * Register a new special requirement for a specified block + * + * @param block The id of the block you want to register a {@link BlockRequirement} for + * @param requirement The requirement you would like to add to this block, + * the {@link BlockRequirement#getRequiredItems(BlockState, BlockEntity)} + * method will be called on the {@link BlockRequirement} you have provided, + * and you will be able to insert requirements based off the context that is given + */ + public static void registerForBlock(ResourceLocation block, BlockRequirement requirement) { + SchematicRequirementsRegistryImpl.registerForBlock(block, requirement); + } + + /** + * Register a new special requirement for a specified block entity type + * + * @param blockEntityType The blockEntityType you want to register a {@link BlockEntityRequirement} for + * @param requirement The requirement you would like to add to this block entity type, + * the {@link BlockEntityRequirement#getRequiredItems(BlockEntity, BlockState)} + * method will be called on the {@link BlockEntityRequirement} you have provided, + * and you will be able to insert requirements based off the context that is given + */ + public static void registerForBlockEntity(BlockEntityType blockEntityType, BlockEntityRequirement requirement) { + SchematicRequirementsRegistryImpl.registerForBlockEntity(blockEntityType, requirement); + } + + /** + * Register a new special requirement for a specified block entity type + * + * @param blockEntityType The id of the blockEntityType you want to register a {@link BlockEntityRequirement} for + * @param requirement The requirement you would like to add to this block entity type, + * the {@link BlockEntityRequirement#getRequiredItems(BlockEntity, BlockState)} + * method will be called on the {@link BlockEntityRequirement} you have provided, + * and you will be able to insert requirements based off the context that is given + */ + public static void registerForBlockEntity(ResourceLocation blockEntityType, BlockEntityRequirement requirement) { + SchematicRequirementsRegistryImpl.registerForBlockEntity(blockEntityType, requirement); + } + + /** + * Register a new special requirement for a specified entity type + * + * @param entityType The entityType you want to register a {@link EntityRequirement} for + * @param requirement The requirement you would like to add to this entity type, + * the {@link EntityRequirement#getRequiredItems(Entity)} + * method will be called on the {@link EntityRequirement} you have provided, + * and you will be able to insert requirements based off the context that is given + */ + public static void registerForEntity(EntityType entityType, EntityRequirement requirement) { + SchematicRequirementsRegistryImpl.registerForEntity(entityType, requirement); + } + + /** + * Register a new special requirement for a specified entity type + * + * @param entityType The id of the entityType you want to register a {@link EntityRequirement} for + * @param requirement The requirement you would like to add to this entity type, + * the {@link EntityRequirement#getRequiredItems(Entity)} + * method will be called on the {@link EntityRequirement} you have provided, + * and you will be able to insert requirements based off the context that is given + */ + public static void registerForEntity(ResourceLocation entityType, EntityRequirement requirement) { + SchematicRequirementsRegistryImpl.registerForEntity(entityType, requirement); + } + + // --- Interfaces that provide the context that would be accessible if you implemented the ISpecial* interfaces --- + + @FunctionalInterface + public interface BlockRequirement { + ItemRequirement getRequiredItems(BlockState state, BlockEntity blockEntity); + } + + @FunctionalInterface + public interface BlockEntityRequirement { + ItemRequirement getRequiredItems(BlockEntity blockEntity, BlockState state); + } + + @FunctionalInterface + public interface EntityRequirement { + ItemRequirement getRequiredItems(Entity entity); + } +} + diff --git a/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorContactBlock.java b/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorContactBlock.java index 9beec26b12..cc9696235e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorContactBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorContactBlock.java @@ -6,7 +6,7 @@ import com.simibubi.create.AllItems; import com.simibubi.create.content.contraptions.elevator.ElevatorColumn.ColumnCoords; import com.simibubi.create.content.redstone.contact.RedstoneContactBlock; import com.simibubi.create.content.redstone.diodes.BrassDiodeBlock; -import com.simibubi.create.content.schematics.requirement.ISpecialBlockItemRequirement; +import com.simibubi.create.api.schematic.requirement.ISpecialBlockItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.foundation.block.IBE; import com.simibubi.create.foundation.block.WrenchableDirectionalBlock; diff --git a/src/main/java/com/simibubi/create/content/contraptions/glue/SuperGlueEntity.java b/src/main/java/com/simibubi/create/content/contraptions/glue/SuperGlueEntity.java index 28060cdfbe..54d7add7cf 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/glue/SuperGlueEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/glue/SuperGlueEntity.java @@ -12,7 +12,7 @@ import com.simibubi.create.content.contraptions.BlockMovementChecks; import com.simibubi.create.content.contraptions.bearing.BearingBlock; import com.simibubi.create.content.contraptions.chassis.AbstractChassisBlock; import com.simibubi.create.content.kinetics.base.DirectionalKineticBlock; -import com.simibubi.create.content.schematics.requirement.ISpecialEntityItemRequirement; +import com.simibubi.create.api.schematic.requirement.ISpecialEntityItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement.ItemUseType; diff --git a/src/main/java/com/simibubi/create/content/contraptions/mounted/CartAssemblerBlock.java b/src/main/java/com/simibubi/create/content/contraptions/mounted/CartAssemblerBlock.java index f7d9451176..4d03db03a3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/mounted/CartAssemblerBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/mounted/CartAssemblerBlock.java @@ -5,7 +5,7 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; import com.simibubi.create.content.equipment.wrench.IWrenchable; import com.simibubi.create.content.redstone.rail.ControllerRailBlock; -import com.simibubi.create.content.schematics.requirement.ISpecialBlockItemRequirement; +import com.simibubi.create.api.schematic.requirement.ISpecialBlockItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement.ItemUseType; import com.simibubi.create.foundation.block.IBE; diff --git a/src/main/java/com/simibubi/create/content/decoration/copycat/CopycatBlockEntity.java b/src/main/java/com/simibubi/create/content/decoration/copycat/CopycatBlockEntity.java index 625275f1a3..4db512b1a1 100644 --- a/src/main/java/com/simibubi/create/content/decoration/copycat/CopycatBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/decoration/copycat/CopycatBlockEntity.java @@ -4,12 +4,12 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.ITransformableBlockEntity; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.redstone.RoseQuartzLampBlock; -import com.simibubi.create.content.schematics.requirement.ISpecialBlockEntityItemRequirement; +import com.simibubi.create.api.schematic.requirement.ISpecialBlockEntityItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement.ItemUseType; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; -import com.simibubi.create.foundation.utility.IPartialSafeNBT; +import com.simibubi.create.api.schematic.nbt.IPartialSafeNBT; import net.createmod.catnip.utility.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/decoration/girder/GirderEncasedShaftBlock.java b/src/main/java/com/simibubi/create/content/decoration/girder/GirderEncasedShaftBlock.java index 4a46cae8f7..6b04d80e81 100644 --- a/src/main/java/com/simibubi/create/content/decoration/girder/GirderEncasedShaftBlock.java +++ b/src/main/java/com/simibubi/create/content/decoration/girder/GirderEncasedShaftBlock.java @@ -8,7 +8,7 @@ import com.simibubi.create.AllShapes; import com.simibubi.create.content.equipment.wrench.IWrenchable; import com.simibubi.create.content.kinetics.base.HorizontalAxisKineticBlock; import com.simibubi.create.content.kinetics.base.KineticBlockEntity; -import com.simibubi.create.content.schematics.requirement.ISpecialBlockItemRequirement; +import com.simibubi.create.api.schematic.requirement.ISpecialBlockItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.foundation.block.IBE; diff --git a/src/main/java/com/simibubi/create/content/decoration/placard/PlacardBlock.java b/src/main/java/com/simibubi/create/content/decoration/placard/PlacardBlock.java index 8a73cda1bd..d19809b56b 100644 --- a/src/main/java/com/simibubi/create/content/decoration/placard/PlacardBlock.java +++ b/src/main/java/com/simibubi/create/content/decoration/placard/PlacardBlock.java @@ -9,7 +9,7 @@ import com.simibubi.create.AllSoundEvents; import com.simibubi.create.content.equipment.wrench.IWrenchable; import com.simibubi.create.content.logistics.filter.FilterItem; import com.simibubi.create.content.logistics.filter.FilterItemStack; -import com.simibubi.create.content.schematics.requirement.ISpecialBlockItemRequirement; +import com.simibubi.create.api.schematic.requirement.ISpecialBlockItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement.ItemUseType; import com.simibubi.create.foundation.block.IBE; diff --git a/src/main/java/com/simibubi/create/content/equipment/armor/BacktankBlock.java b/src/main/java/com/simibubi/create/content/equipment/armor/BacktankBlock.java index 967f0a7f67..d27598596e 100644 --- a/src/main/java/com/simibubi/create/content/equipment/armor/BacktankBlock.java +++ b/src/main/java/com/simibubi/create/content/equipment/armor/BacktankBlock.java @@ -7,7 +7,7 @@ import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllEnchantments; import com.simibubi.create.AllShapes; import com.simibubi.create.content.kinetics.base.HorizontalKineticBlock; -import com.simibubi.create.content.schematics.requirement.ISpecialBlockItemRequirement; +import com.simibubi.create.api.schematic.requirement.ISpecialBlockItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement.ItemUseType; import com.simibubi.create.foundation.block.IBE; diff --git a/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintEntity.java b/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintEntity.java index d142654beb..82ad2fed9b 100644 --- a/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintEntity.java +++ b/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintEntity.java @@ -13,7 +13,7 @@ import com.simibubi.create.AllEntityTypes; import com.simibubi.create.AllItems; import com.simibubi.create.Create; import com.simibubi.create.content.logistics.filter.FilterItemStack; -import com.simibubi.create.content.schematics.requirement.ISpecialEntityItemRequirement; +import com.simibubi.create.api.schematic.requirement.ISpecialEntityItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement.ItemUseType; import com.simibubi.create.foundation.networking.ISyncPersistentData; @@ -207,7 +207,7 @@ public class BlueprintEntity extends HangingEntity d6 = d6 / 32.0D; this.setBoundingBox(new AABB(d1 - d4, d2 - d5, d3 - d6, d1 + d4, d2 + d5, d3 + d6)); } - + @Override public void setPos(double pX, double pY, double pZ) { setPosRaw(pX, pY, pZ); diff --git a/src/main/java/com/simibubi/create/content/fluids/pipes/EncasedPipeBlock.java b/src/main/java/com/simibubi/create/content/fluids/pipes/EncasedPipeBlock.java index 70d6a89883..398bbeb5d8 100644 --- a/src/main/java/com/simibubi/create/content/fluids/pipes/EncasedPipeBlock.java +++ b/src/main/java/com/simibubi/create/content/fluids/pipes/EncasedPipeBlock.java @@ -18,7 +18,7 @@ import com.simibubi.create.content.decoration.encasing.EncasedBlock; import com.simibubi.create.content.equipment.wrench.IWrenchable; import com.simibubi.create.content.fluids.FluidPropagator; import com.simibubi.create.content.fluids.FluidTransportBehaviour; -import com.simibubi.create.content.schematics.requirement.ISpecialBlockItemRequirement; +import com.simibubi.create.api.schematic.requirement.ISpecialBlockItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.foundation.advancement.AdvancementBehaviour; import com.simibubi.create.foundation.block.IBE; diff --git a/src/main/java/com/simibubi/create/content/fluids/pipes/GlassFluidPipeBlock.java b/src/main/java/com/simibubi/create/content/fluids/pipes/GlassFluidPipeBlock.java index 4752f03ae1..8250c9cb4d 100644 --- a/src/main/java/com/simibubi/create/content/fluids/pipes/GlassFluidPipeBlock.java +++ b/src/main/java/com/simibubi/create/content/fluids/pipes/GlassFluidPipeBlock.java @@ -5,7 +5,7 @@ import javax.annotation.ParametersAreNonnullByDefault; import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.fluids.FluidTransportBehaviour; -import com.simibubi.create.content.schematics.requirement.ISpecialBlockItemRequirement; +import com.simibubi.create.api.schematic.requirement.ISpecialBlockItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.foundation.block.IBE; diff --git a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltBlock.java b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltBlock.java index f077e3821d..9f496cdd51 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltBlock.java @@ -28,7 +28,7 @@ import com.simibubi.create.content.logistics.box.PackageEntity; import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.content.logistics.funnel.FunnelBlock; import com.simibubi.create.content.logistics.tunnel.BeltTunnelBlock; -import com.simibubi.create.content.schematics.requirement.ISpecialBlockItemRequirement; +import com.simibubi.create.api.schematic.requirement.ISpecialBlockItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement.ItemUseType; import com.simibubi.create.foundation.block.IBE; @@ -292,7 +292,7 @@ public class BeltBlock extends HorizontalKineticBlock return InteractionResult.SUCCESS; } } - + if (isHand) { BeltBlockEntity controllerBelt = belt.getControllerBE(); if (controllerBelt == null) diff --git a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogwheelBlock.java b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogwheelBlock.java index a1e5d2b729..d5b736c6aa 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogwheelBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogwheelBlock.java @@ -14,7 +14,7 @@ import com.simibubi.create.content.kinetics.base.RotatedPillarKineticBlock; import com.simibubi.create.content.kinetics.simpleRelays.CogWheelBlock; import com.simibubi.create.content.kinetics.simpleRelays.ICogWheel; import com.simibubi.create.content.kinetics.simpleRelays.SimpleKineticBlockEntity; -import com.simibubi.create.content.schematics.requirement.ISpecialBlockItemRequirement; +import com.simibubi.create.api.schematic.requirement.ISpecialBlockItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.foundation.block.IBE; diff --git a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedShaftBlock.java b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedShaftBlock.java index 584bc197c5..752d562f59 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedShaftBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedShaftBlock.java @@ -8,7 +8,7 @@ import com.simibubi.create.content.decoration.encasing.EncasedBlock; import com.simibubi.create.content.kinetics.base.AbstractEncasedShaftBlock; import com.simibubi.create.content.kinetics.base.KineticBlockEntity; import com.simibubi.create.content.kinetics.base.RotatedPillarKineticBlock; -import com.simibubi.create.content.schematics.requirement.ISpecialBlockItemRequirement; +import com.simibubi.create.api.schematic.requirement.ISpecialBlockItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.foundation.block.IBE; diff --git a/src/main/java/com/simibubi/create/content/logistics/funnel/BeltFunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/funnel/BeltFunnelBlock.java index 538cb80808..227bc8e29b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/funnel/BeltFunnelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/funnel/BeltFunnelBlock.java @@ -5,7 +5,7 @@ import com.simibubi.create.AllShapes; import com.simibubi.create.content.kinetics.belt.BeltBlock; import com.simibubi.create.content.kinetics.belt.BeltSlope; import com.simibubi.create.content.kinetics.belt.behaviour.DirectBeltInputBehaviour; -import com.simibubi.create.content.schematics.requirement.ISpecialBlockItemRequirement; +import com.simibubi.create.api.schematic.requirement.ISpecialBlockItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.block.ProperWaterloggedBlock; diff --git a/src/main/java/com/simibubi/create/content/redstone/link/controller/LecternControllerBlock.java b/src/main/java/com/simibubi/create/content/redstone/link/controller/LecternControllerBlock.java index a2b793a585..c0d214391f 100644 --- a/src/main/java/com/simibubi/create/content/redstone/link/controller/LecternControllerBlock.java +++ b/src/main/java/com/simibubi/create/content/redstone/link/controller/LecternControllerBlock.java @@ -5,7 +5,7 @@ import java.util.ArrayList; import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllItems; import com.simibubi.create.AllSoundEvents; -import com.simibubi.create.content.schematics.requirement.ISpecialBlockItemRequirement; +import com.simibubi.create.api.schematic.requirement.ISpecialBlockItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.foundation.block.IBE; diff --git a/src/main/java/com/simibubi/create/content/redstone/nixieTube/NixieTubeBlock.java b/src/main/java/com/simibubi/create/content/redstone/nixieTube/NixieTubeBlock.java index fb59ee4679..fb0ee5e94d 100644 --- a/src/main/java/com/simibubi/create/content/redstone/nixieTube/NixieTubeBlock.java +++ b/src/main/java/com/simibubi/create/content/redstone/nixieTube/NixieTubeBlock.java @@ -10,7 +10,7 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; import com.simibubi.create.content.equipment.clipboard.ClipboardEntry; import com.simibubi.create.content.equipment.wrench.IWrenchable; -import com.simibubi.create.content.schematics.requirement.ISpecialBlockItemRequirement; +import com.simibubi.create.api.schematic.requirement.ISpecialBlockItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement.ItemUseType; import com.simibubi.create.foundation.block.IBE; diff --git a/src/main/java/com/simibubi/create/content/schematics/requirement/ISpecialBlockEntityItemRequirement.java b/src/main/java/com/simibubi/create/content/schematics/requirement/ISpecialBlockEntityItemRequirement.java deleted file mode 100644 index 3e2c9a2a55..0000000000 --- a/src/main/java/com/simibubi/create/content/schematics/requirement/ISpecialBlockEntityItemRequirement.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.simibubi.create.content.schematics.requirement; - -import net.minecraft.world.level.block.state.BlockState; - -public interface ISpecialBlockEntityItemRequirement { - - public ItemRequirement getRequiredItems(BlockState state); - -} diff --git a/src/main/java/com/simibubi/create/content/schematics/requirement/ISpecialBlockItemRequirement.java b/src/main/java/com/simibubi/create/content/schematics/requirement/ISpecialBlockItemRequirement.java deleted file mode 100644 index f55d451215..0000000000 --- a/src/main/java/com/simibubi/create/content/schematics/requirement/ISpecialBlockItemRequirement.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.simibubi.create.content.schematics.requirement; - -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.state.BlockState; - -public interface ISpecialBlockItemRequirement { - - public ItemRequirement getRequiredItems(BlockState state, BlockEntity blockEntity); - -} diff --git a/src/main/java/com/simibubi/create/content/schematics/requirement/ISpecialEntityItemRequirement.java b/src/main/java/com/simibubi/create/content/schematics/requirement/ISpecialEntityItemRequirement.java deleted file mode 100644 index 3095009078..0000000000 --- a/src/main/java/com/simibubi/create/content/schematics/requirement/ISpecialEntityItemRequirement.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.simibubi.create.content.schematics.requirement; - -public interface ISpecialEntityItemRequirement { - - public ItemRequirement getRequiredItems(); - -} diff --git a/src/main/java/com/simibubi/create/content/schematics/requirement/ItemRequirement.java b/src/main/java/com/simibubi/create/content/schematics/requirement/ItemRequirement.java index b7f827fc0e..be6019c04f 100644 --- a/src/main/java/com/simibubi/create/content/schematics/requirement/ItemRequirement.java +++ b/src/main/java/com/simibubi/create/content/schematics/requirement/ItemRequirement.java @@ -3,12 +3,20 @@ package com.simibubi.create.content.schematics.requirement; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.function.BiFunction; +import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; +import com.simibubi.create.api.schematic.requirement.ISpecialBlockEntityItemRequirement; +import com.simibubi.create.api.schematic.requirement.ISpecialBlockItemRequirement; +import com.simibubi.create.api.schematic.requirement.ISpecialEntityItemRequirement; +import com.simibubi.create.api.schematic.requirement.SchematicRequirementsRegistry; import com.simibubi.create.compat.framedblocks.FramedBlocksInSchematics; import com.simibubi.create.foundation.data.recipe.Mods; +import com.simibubi.create.impl.schematic.requirement.SchematicRequirementsRegistryImpl; + import net.createmod.catnip.utility.NBTProcessors; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.decoration.ArmorStand; @@ -63,17 +71,23 @@ public class ItemRequirement { Block block = state.getBlock(); ItemRequirement requirement; - if (block instanceof ISpecialBlockItemRequirement specialBlock) { + SchematicRequirementsRegistry.BlockRequirement blockItemRequirement = SchematicRequirementsRegistryImpl.getRequirementForBlock(block); + if (blockItemRequirement != null) { + requirement = blockItemRequirement.getRequiredItems(state, be); + } else if (block instanceof ISpecialBlockItemRequirement specialBlock) { requirement = specialBlock.getRequiredItems(state, be); } else { requirement = defaultOf(state, be); } - if (be instanceof ISpecialBlockEntityItemRequirement specialBE) + SchematicRequirementsRegistry.BlockEntityRequirement blockEntityItemRequirement = SchematicRequirementsRegistryImpl.getRequirementForBlockEntityType(be.getType()); + if (blockEntityItemRequirement != null) { + requirement = requirement.union(blockEntityItemRequirement.getRequiredItems(be, state)); + } else if (be instanceof ISpecialBlockEntityItemRequirement specialBE) { requirement = requirement.union(specialBE.getRequiredItems(state)); - - if (com.simibubi.create.compat.Mods.FRAMEDBLOCKS.contains(block)) + } else if (com.simibubi.create.compat.Mods.FRAMEDBLOCKS.contains(block)) { requirement = requirement.union(FramedBlocksInSchematics.getRequiredItems(state, be)); + } return requirement; } @@ -118,8 +132,12 @@ public class ItemRequirement { } public static ItemRequirement of(Entity entity) { - if (entity instanceof ISpecialEntityItemRequirement specialEntity) + SchematicRequirementsRegistry.EntityRequirement entityItemRequirement = SchematicRequirementsRegistryImpl.getRequirementForEntityType(entity.getType()); + if (entityItemRequirement != null) { + return entityItemRequirement.getRequiredItems(entity); + } else if (entity instanceof ISpecialEntityItemRequirement specialEntity) { return specialEntity.getRequiredItems(); + } if (entity instanceof ItemFrame itemFrame) { ItemStack frame = new ItemStack(Items.ITEM_FRAME); diff --git a/src/main/java/com/simibubi/create/content/trains/bogey/AbstractBogeyBlock.java b/src/main/java/com/simibubi/create/content/trains/bogey/AbstractBogeyBlock.java index 955a7f6cce..d57ee8c94e 100644 --- a/src/main/java/com/simibubi/create/content/trains/bogey/AbstractBogeyBlock.java +++ b/src/main/java/com/simibubi/create/content/trains/bogey/AbstractBogeyBlock.java @@ -17,7 +17,7 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBogeyStyles; import com.simibubi.create.AllItems; import com.simibubi.create.content.equipment.wrench.IWrenchable; -import com.simibubi.create.content.schematics.requirement.ISpecialBlockItemRequirement; +import com.simibubi.create.api.schematic.requirement.ISpecialBlockItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.content.trains.entity.Carriage; import com.simibubi.create.content.trains.entity.CarriageBogey; diff --git a/src/main/java/com/simibubi/create/content/trains/bogey/StandardBogeyBlock.java b/src/main/java/com/simibubi/create/content/trains/bogey/StandardBogeyBlock.java index b4bceecfae..91e5c7548a 100644 --- a/src/main/java/com/simibubi/create/content/trains/bogey/StandardBogeyBlock.java +++ b/src/main/java/com/simibubi/create/content/trains/bogey/StandardBogeyBlock.java @@ -3,7 +3,7 @@ package com.simibubi.create.content.trains.bogey; import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBogeyStyles; -import com.simibubi.create.content.schematics.requirement.ISpecialBlockItemRequirement; +import com.simibubi.create.api.schematic.requirement.ISpecialBlockItemRequirement; import com.simibubi.create.content.trains.track.TrackMaterial; import com.simibubi.create.foundation.block.IBE; import com.simibubi.create.foundation.block.ProperWaterloggedBlock; diff --git a/src/main/java/com/simibubi/create/content/trains/track/TrackBlock.java b/src/main/java/com/simibubi/create/content/trains/track/TrackBlock.java index 02148df016..9474c423e6 100644 --- a/src/main/java/com/simibubi/create/content/trains/track/TrackBlock.java +++ b/src/main/java/com/simibubi/create/content/trains/track/TrackBlock.java @@ -30,7 +30,7 @@ import com.simibubi.create.AllShapes; import com.simibubi.create.AllTags; import com.simibubi.create.content.decoration.girder.GirderBlock; import com.simibubi.create.content.equipment.wrench.IWrenchable; -import com.simibubi.create.content.schematics.requirement.ISpecialBlockItemRequirement; +import com.simibubi.create.api.schematic.requirement.ISpecialBlockItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement.ItemUseType; import com.simibubi.create.content.trains.CubeParticleData; diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/SmartBlockEntity.java b/src/main/java/com/simibubi/create/foundation/blockEntity/SmartBlockEntity.java index 746dff2097..a6b130156a 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/SmartBlockEntity.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/SmartBlockEntity.java @@ -8,14 +8,14 @@ import java.util.Map; import java.util.function.Consumer; import com.simibubi.create.api.event.BlockEntityBehaviourEvent; -import com.simibubi.create.content.schematics.requirement.ISpecialBlockEntityItemRequirement; +import com.simibubi.create.api.schematic.requirement.ISpecialBlockEntityItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.foundation.advancement.AdvancementBehaviour; import com.simibubi.create.foundation.advancement.CreateAdvancement; import com.simibubi.create.foundation.blockEntity.behaviour.BehaviourType; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import com.simibubi.create.foundation.utility.IInteractionChecker; -import com.simibubi.create.foundation.utility.IPartialSafeNBT; +import com.simibubi.create.api.schematic.nbt.IPartialSafeNBT; import net.createmod.ponder.api.VirtualBlockEntity; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/simibubi/create/foundation/utility/BlockHelper.java b/src/main/java/com/simibubi/create/foundation/utility/BlockHelper.java index 1a1ec49e82..95110014ab 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/BlockHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/BlockHelper.java @@ -1,11 +1,14 @@ package com.simibubi.create.foundation.utility; +import java.util.function.BiConsumer; import java.util.function.Consumer; import javax.annotation.Nullable; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllTags.AllBlockTags; +import com.simibubi.create.api.schematic.nbt.IPartialSafeNBT; +import com.simibubi.create.api.schematic.nbt.SchematicSafeNBTRegistry; import com.simibubi.create.compat.Mods; import com.simibubi.create.compat.framedblocks.FramedBlocksInSchematics; import com.simibubi.create.content.kinetics.base.KineticBlockEntity; @@ -14,6 +17,8 @@ import com.simibubi.create.content.processing.burner.BlazeBurnerBlock.HeatLevel; import com.simibubi.create.foundation.blockEntity.IMergeableBE; import com.simibubi.create.foundation.blockEntity.IMultiBlockEntityContainer; +import com.simibubi.create.impl.schematic.nbt.SchematicSafeNBTRegistryImpl; + import net.createmod.catnip.utility.NBTProcessors; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -243,18 +248,21 @@ public class BlockHelper { public static CompoundTag prepareBlockEntityData(BlockState blockState, BlockEntity blockEntity) { CompoundTag data = null; if (blockEntity == null) - return data; - + return null; + + SchematicSafeNBTRegistry.ContextProvidingPartialSafeNBT safeNBT = SchematicSafeNBTRegistryImpl.getPartialSafeNBT(blockEntity.getType()); if (AllBlockTags.SAFE_NBT.matches(blockState)) { data = blockEntity.saveWithFullMetadata(); - - } else if (blockEntity instanceof IPartialSafeNBT) { + } else if (safeNBT != null) { data = new CompoundTag(); - ((IPartialSafeNBT) blockEntity).writeSafe(data); - - } else if (Mods.FRAMEDBLOCKS.contains(blockState.getBlock())) + safeNBT.writeSafe(blockEntity, data); + } else if (blockEntity instanceof IPartialSafeNBT safeNbtBE) { + data = new CompoundTag(); + safeNbtBE.writeSafe(data); + } else if (Mods.FRAMEDBLOCKS.contains(blockState.getBlock())) { data = FramedBlocksInSchematics.prepareBlockEntityData(blockState, blockEntity); - + } + return NBTProcessors.process(blockState, blockEntity, data, true); } diff --git a/src/main/java/com/simibubi/create/foundation/utility/IPartialSafeNBT.java b/src/main/java/com/simibubi/create/foundation/utility/IPartialSafeNBT.java deleted file mode 100644 index c8854bb0b9..0000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/IPartialSafeNBT.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.simibubi.create.foundation.utility; - -import net.minecraft.nbt.CompoundTag; - -public interface IPartialSafeNBT { - /** This method always runs on the logical server. */ - public void writeSafe(CompoundTag compound); -} diff --git a/src/main/java/com/simibubi/create/impl/schematic/nbt/SchematicSafeNBTRegistryImpl.java b/src/main/java/com/simibubi/create/impl/schematic/nbt/SchematicSafeNBTRegistryImpl.java new file mode 100644 index 0000000000..900504450a --- /dev/null +++ b/src/main/java/com/simibubi/create/impl/schematic/nbt/SchematicSafeNBTRegistryImpl.java @@ -0,0 +1,23 @@ +package com.simibubi.create.impl.schematic.nbt; + +import com.simibubi.create.api.schematic.nbt.SchematicSafeNBTRegistry; +import com.simibubi.create.foundation.utility.AttachedRegistry; + +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraftforge.registries.ForgeRegistries; + +import org.jetbrains.annotations.ApiStatus; + +@ApiStatus.Internal +public class SchematicSafeNBTRegistryImpl { + private static final AttachedRegistry, SchematicSafeNBTRegistry.ContextProvidingPartialSafeNBT> BLOCK_ENTITY_PARTIAL_SAFE_NBT = new AttachedRegistry<>(ForgeRegistries.BLOCK_ENTITY_TYPES); + + public static void register(BlockEntityType blockEntityType, SchematicSafeNBTRegistry.ContextProvidingPartialSafeNBT safeNBT) { + BLOCK_ENTITY_PARTIAL_SAFE_NBT.register(blockEntityType, safeNBT); + } + + public static SchematicSafeNBTRegistry.ContextProvidingPartialSafeNBT getPartialSafeNBT(BlockEntityType blockEntityType) { + return BLOCK_ENTITY_PARTIAL_SAFE_NBT.get(blockEntityType); + } +} diff --git a/src/main/java/com/simibubi/create/impl/schematic/requirement/SchematicRequirementsRegistryImpl.java b/src/main/java/com/simibubi/create/impl/schematic/requirement/SchematicRequirementsRegistryImpl.java new file mode 100644 index 0000000000..4eac5aa185 --- /dev/null +++ b/src/main/java/com/simibubi/create/impl/schematic/requirement/SchematicRequirementsRegistryImpl.java @@ -0,0 +1,61 @@ +package com.simibubi.create.impl.schematic.requirement; + +import com.simibubi.create.api.schematic.requirement.SchematicRequirementsRegistry; + +import com.simibubi.create.foundation.utility.AttachedRegistry; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; + +import net.minecraftforge.registries.ForgeRegistries; + +import org.jetbrains.annotations.ApiStatus; + +@ApiStatus.Internal +public class SchematicRequirementsRegistryImpl { + private static final AttachedRegistry BLOCK_REQUIREMENTS = new AttachedRegistry<>(ForgeRegistries.BLOCKS); + private static final AttachedRegistry, SchematicRequirementsRegistry.BlockEntityRequirement> BLOCK_ENTITY_REQUIREMENTS = new AttachedRegistry<>(ForgeRegistries.BLOCK_ENTITY_TYPES); + private static final AttachedRegistry, SchematicRequirementsRegistry.EntityRequirement> ENTITY_REQUIREMENTS = new AttachedRegistry<>(ForgeRegistries.ENTITY_TYPES); + + public static void registerForBlock(Block block, SchematicRequirementsRegistry.BlockRequirement requirement) { + BLOCK_REQUIREMENTS.register(block, requirement); + } + + public static void registerForBlock(ResourceLocation block, SchematicRequirementsRegistry.BlockRequirement requirement) { + BLOCK_REQUIREMENTS.register(block, requirement); + } + + public static void registerForBlockEntity(BlockEntityType blockEntityType, SchematicRequirementsRegistry.BlockEntityRequirement requirement) { + BLOCK_ENTITY_REQUIREMENTS.register(blockEntityType, requirement); + } + + public static void registerForBlockEntity(ResourceLocation blockEntityType, SchematicRequirementsRegistry.BlockEntityRequirement requirement) { + BLOCK_ENTITY_REQUIREMENTS.register(blockEntityType, requirement); + } + + public static void registerForEntity(EntityType entityType, SchematicRequirementsRegistry.EntityRequirement requirement) { + ENTITY_REQUIREMENTS.register(entityType, requirement); + } + + // --- + + public static void registerForEntity(ResourceLocation entityType, SchematicRequirementsRegistry.EntityRequirement requirement) { + ENTITY_REQUIREMENTS.register(entityType, requirement); + } + + public static SchematicRequirementsRegistry.BlockRequirement getRequirementForBlock(Block block) { + return BLOCK_REQUIREMENTS.get(block); + } + + public static SchematicRequirementsRegistry.BlockEntityRequirement getRequirementForBlockEntityType(BlockEntityType blockEntityType) { + return BLOCK_ENTITY_REQUIREMENTS.get(blockEntityType); + } + + public static SchematicRequirementsRegistry.EntityRequirement getRequirementForEntityType(EntityType entityType) { + return ENTITY_REQUIREMENTS.get(entityType); + } +} From 9060a9642432ce36dad8f5a5bcbf71a6f7bb2116 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Wed, 18 Dec 2024 14:19:11 -0500 Subject: [PATCH 201/515] Generic trouble - Fix messed up generics --- .../impl/schematic/nbt/SchematicSafeNBTRegistryImpl.java | 2 +- .../requirement/SchematicRequirementsRegistryImpl.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/simibubi/create/impl/schematic/nbt/SchematicSafeNBTRegistryImpl.java b/src/main/java/com/simibubi/create/impl/schematic/nbt/SchematicSafeNBTRegistryImpl.java index 900504450a..aa664971ee 100644 --- a/src/main/java/com/simibubi/create/impl/schematic/nbt/SchematicSafeNBTRegistryImpl.java +++ b/src/main/java/com/simibubi/create/impl/schematic/nbt/SchematicSafeNBTRegistryImpl.java @@ -11,7 +11,7 @@ import org.jetbrains.annotations.ApiStatus; @ApiStatus.Internal public class SchematicSafeNBTRegistryImpl { - private static final AttachedRegistry, SchematicSafeNBTRegistry.ContextProvidingPartialSafeNBT> BLOCK_ENTITY_PARTIAL_SAFE_NBT = new AttachedRegistry<>(ForgeRegistries.BLOCK_ENTITY_TYPES); + private static final AttachedRegistry, SchematicSafeNBTRegistry.ContextProvidingPartialSafeNBT> BLOCK_ENTITY_PARTIAL_SAFE_NBT = new AttachedRegistry<>(ForgeRegistries.BLOCK_ENTITY_TYPES); public static void register(BlockEntityType blockEntityType, SchematicSafeNBTRegistry.ContextProvidingPartialSafeNBT safeNBT) { BLOCK_ENTITY_PARTIAL_SAFE_NBT.register(blockEntityType, safeNBT); diff --git a/src/main/java/com/simibubi/create/impl/schematic/requirement/SchematicRequirementsRegistryImpl.java b/src/main/java/com/simibubi/create/impl/schematic/requirement/SchematicRequirementsRegistryImpl.java index 4eac5aa185..53646dc22e 100644 --- a/src/main/java/com/simibubi/create/impl/schematic/requirement/SchematicRequirementsRegistryImpl.java +++ b/src/main/java/com/simibubi/create/impl/schematic/requirement/SchematicRequirementsRegistryImpl.java @@ -18,8 +18,8 @@ import org.jetbrains.annotations.ApiStatus; @ApiStatus.Internal public class SchematicRequirementsRegistryImpl { private static final AttachedRegistry BLOCK_REQUIREMENTS = new AttachedRegistry<>(ForgeRegistries.BLOCKS); - private static final AttachedRegistry, SchematicRequirementsRegistry.BlockEntityRequirement> BLOCK_ENTITY_REQUIREMENTS = new AttachedRegistry<>(ForgeRegistries.BLOCK_ENTITY_TYPES); - private static final AttachedRegistry, SchematicRequirementsRegistry.EntityRequirement> ENTITY_REQUIREMENTS = new AttachedRegistry<>(ForgeRegistries.ENTITY_TYPES); + private static final AttachedRegistry, SchematicRequirementsRegistry.BlockEntityRequirement> BLOCK_ENTITY_REQUIREMENTS = new AttachedRegistry<>(ForgeRegistries.BLOCK_ENTITY_TYPES); + private static final AttachedRegistry, SchematicRequirementsRegistry.EntityRequirement> ENTITY_REQUIREMENTS = new AttachedRegistry<>(ForgeRegistries.ENTITY_TYPES); public static void registerForBlock(Block block, SchematicRequirementsRegistry.BlockRequirement requirement) { BLOCK_REQUIREMENTS.register(block, requirement); From 5f49bddeba4b2a5eb097c76bfc58e1136c04545b Mon Sep 17 00:00:00 2001 From: IThundxr Date: Wed, 18 Dec 2024 14:21:19 -0500 Subject: [PATCH 202/515] Nulltastic issues - Fix missing nullcheck and @Nullable annotations --- .../SchematicRequirementsRegistry.java | 4 +++- .../requirement/ItemRequirement.java | 20 +++++++++++-------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/simibubi/create/api/schematic/requirement/SchematicRequirementsRegistry.java b/src/main/java/com/simibubi/create/api/schematic/requirement/SchematicRequirementsRegistry.java index 992f6db404..bc5ad5e111 100644 --- a/src/main/java/com/simibubi/create/api/schematic/requirement/SchematicRequirementsRegistry.java +++ b/src/main/java/com/simibubi/create/api/schematic/requirement/SchematicRequirementsRegistry.java @@ -16,6 +16,8 @@ import net.minecraftforge.registries.ForgeRegistries; import org.jetbrains.annotations.ApiStatus; +import javax.annotation.Nullable; + import java.util.function.BiFunction; import java.util.function.Function; @@ -105,7 +107,7 @@ public class SchematicRequirementsRegistry { @FunctionalInterface public interface BlockRequirement { - ItemRequirement getRequiredItems(BlockState state, BlockEntity blockEntity); + ItemRequirement getRequiredItems(BlockState state, @Nullable BlockEntity blockEntity); } @FunctionalInterface diff --git a/src/main/java/com/simibubi/create/content/schematics/requirement/ItemRequirement.java b/src/main/java/com/simibubi/create/content/schematics/requirement/ItemRequirement.java index be6019c04f..be145e15d3 100644 --- a/src/main/java/com/simibubi/create/content/schematics/requirement/ItemRequirement.java +++ b/src/main/java/com/simibubi/create/content/schematics/requirement/ItemRequirement.java @@ -39,6 +39,8 @@ import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.block.state.properties.SlabType; import net.minecraftforge.registries.ForgeRegistries; +import org.jetbrains.annotations.Nullable; + public class ItemRequirement { public static final ItemRequirement NONE = new ItemRequirement(Collections.emptyList()); public static final ItemRequirement INVALID = new ItemRequirement(Collections.emptyList()); @@ -67,7 +69,7 @@ public class ItemRequirement { .collect(Collectors.toList())); } - public static ItemRequirement of(BlockState state, BlockEntity be) { + public static ItemRequirement of(BlockState state, @Nullable BlockEntity be) { Block block = state.getBlock(); ItemRequirement requirement; @@ -80,13 +82,15 @@ public class ItemRequirement { requirement = defaultOf(state, be); } - SchematicRequirementsRegistry.BlockEntityRequirement blockEntityItemRequirement = SchematicRequirementsRegistryImpl.getRequirementForBlockEntityType(be.getType()); - if (blockEntityItemRequirement != null) { - requirement = requirement.union(blockEntityItemRequirement.getRequiredItems(be, state)); - } else if (be instanceof ISpecialBlockEntityItemRequirement specialBE) { - requirement = requirement.union(specialBE.getRequiredItems(state)); - } else if (com.simibubi.create.compat.Mods.FRAMEDBLOCKS.contains(block)) { - requirement = requirement.union(FramedBlocksInSchematics.getRequiredItems(state, be)); + if (be != null) { + SchematicRequirementsRegistry.BlockEntityRequirement blockEntityItemRequirement = SchematicRequirementsRegistryImpl.getRequirementForBlockEntityType(be.getType()); + if (blockEntityItemRequirement != null) { + requirement = requirement.union(blockEntityItemRequirement.getRequiredItems(be, state)); + } else if (be instanceof ISpecialBlockEntityItemRequirement specialBE) { + requirement = requirement.union(specialBE.getRequiredItems(state)); + } else if (com.simibubi.create.compat.Mods.FRAMEDBLOCKS.contains(block)) { + requirement = requirement.union(FramedBlocksInSchematics.getRequiredItems(state, be)); + } } return requirement; From 1a4d2bcee545b2802b87010e895512ce6f983c98 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Wed, 18 Dec 2024 14:27:58 -0500 Subject: [PATCH 203/515] Consistency is key - Fix usage of javax annotation and optimize imports --- .../requirement/SchematicRequirementsRegistry.java | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/main/java/com/simibubi/create/api/schematic/requirement/SchematicRequirementsRegistry.java b/src/main/java/com/simibubi/create/api/schematic/requirement/SchematicRequirementsRegistry.java index bc5ad5e111..1b7174df03 100644 --- a/src/main/java/com/simibubi/create/api/schematic/requirement/SchematicRequirementsRegistry.java +++ b/src/main/java/com/simibubi/create/api/schematic/requirement/SchematicRequirementsRegistry.java @@ -1,7 +1,6 @@ package com.simibubi.create.api.schematic.requirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement; -import com.simibubi.create.foundation.utility.AttachedRegistry; import com.simibubi.create.impl.schematic.requirement.SchematicRequirementsRegistryImpl; @@ -12,14 +11,8 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.registries.ForgeRegistries; -import org.jetbrains.annotations.ApiStatus; - -import javax.annotation.Nullable; - -import java.util.function.BiFunction; -import java.util.function.Function; +import org.jetbrains.annotations.Nullable; /** * Registry for schematic requirements for blocks, block entities, and entities. From 71edc5f2bb873acb6635c6af03d39f42f2b5f56c Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Wed, 18 Dec 2024 23:55:47 +0100 Subject: [PATCH 204/515] Gauges and links - Factory gauges no longer respond to standard redstone inputs or comparators - Factory gauges can now be connected to redstone links --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 6 +- .../resources/assets/create/lang/en_ud.json | 4 +- .../resources/assets/create/lang/en_us.json | 4 +- .../com/simibubi/create/AllPartialModels.java | 2 + .../factoryBoard/FactoryPanelBehaviour.java | 126 +++++++++++++--- .../factoryBoard/FactoryPanelBlock.java | 22 --- .../factoryBoard/FactoryPanelConnection.java | 35 +++-- .../FactoryPanelConnectionHandler.java | 41 ++++- .../factoryBoard/FactoryPanelRenderer.java | 70 +++++++-- .../factoryBoard/FactoryPanelScreen.java | 5 +- .../FactoryPanelSupportBehaviour.java | 141 ++++++++++++++++++ .../stockTicker/StockKeeperRequestScreen.java | 2 +- .../displayLink/DisplayLinkBlock.java | 5 + .../displayLink/DisplayLinkBlockEntity.java | 7 +- .../redstone/link/RedstoneLinkBlock.java | 27 +++- .../link/RedstoneLinkBlockEntity.java | 10 +- .../filtering/FilteringBehaviour.java | 4 + .../filtering/FilteringRenderer.java | 3 +- .../assets/create/lang/default/interface.json | 4 +- .../connections/dotted_east.json | 18 +++ .../connections/dotted_north.json | 18 +++ .../connections/dotted_south.json | 17 +++ .../connections/dotted_west.json | 18 +++ .../factory_panel_dotted_connections.png | Bin 0 -> 461 bytes 24 files changed, 498 insertions(+), 91 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelSupportBehaviour.java create mode 100644 src/main/resources/assets/create/models/block/factory_gauge/connections/dotted_east.json create mode 100644 src/main/resources/assets/create/models/block/factory_gauge/connections/dotted_north.json create mode 100644 src/main/resources/assets/create/models/block/factory_gauge/connections/dotted_south.json create mode 100644 src/main/resources/assets/create/models/block/factory_gauge/connections/dotted_west.json create mode 100644 src/main/resources/assets/create/textures/block/factory_panel_dotted_connections.png diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 534cb12173..63312954aa 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-12-17T17:30:42.0875961 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-12-18T12:24:49.4666737 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -642,8 +642,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -33f0bde213177bcffadeead5af35318609ab0005 assets/create/lang/en_ud.json -806d0feae84b76dd2b16b484668dbb4cf48d3979 assets/create/lang/en_us.json +6fd813eef2a597ff9a766f1100f8712bc765a88c assets/create/lang/en_ud.json +ff7c050e5ba7fd497e015e2477ef9b56918bb14b assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 7167aafc63..66db8b3c5d 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -1100,9 +1100,10 @@ "create.elevator_contact.floor_identifier": "ɹǝıɟıʇuǝpI ɹooןℲ", "create.elevator_contact.title": "ʇɔɐʇuoƆ ɹoʇɐʌǝןƎ", "create.factory_panel.click_second_panel": "˙˙˙ʇɔǝuuoɔ oʇ ןǝuɐd puoɔǝs ɐ ʞɔıןƆ", - "create.factory_panel.click_to_configure": "ǝdıɔǝɹ ɐ ʎɟıɔǝds oʇ ʞɔıןƆ", + "create.factory_panel.click_to_configure": "ǝɹnbıɟuoɔ oʇ ʞɔıןƆ", "create.factory_panel.connection_aborted": "pǝʇɹoqɐ uoıʇɔǝuuoɔ ʇnduI", "create.factory_panel.cycled_arrow_path": "%1$s ǝpoɯ buıɥʇɐd ʍoɹɹɐ pǝןɔʎƆ", + "create.factory_panel.hold_to_set_amount": "ʇunoɯɐ ʇǝbɹɐʇ ɹoɟ pןoɥ puɐ ʞɔıןƆ", "create.factory_panel.in_progress": ")ssǝɹboɹԀ uI(", "create.factory_panel.input_in_restock_mode": "ǝpoɯ ʞɔoʇsǝɹ uı ǝq ʇouuɐɔ ןǝuɐd ʇnduI", "create.factory_panel.new_factory_task": "ʞsɐʇ ʎɹoʇɔɐɟ ʍǝN", @@ -1201,6 +1202,7 @@ "create.gui.factory_panel.expected_output_tip": "buıuɹnʇǝɹ ʇndʇno ɟo ʇunoɯɐ ǝɥ⟘", "create.gui.factory_panel.expected_output_tip_1": "ʇsǝnbǝɹ ןnɟssǝɔɔns ɥɔɐǝ ɹǝʇɟɐ", "create.gui.factory_panel.expected_output_tip_2": "ǝbuɐɥɔ oʇ ןןoɹɔS", + "create.gui.factory_panel.inactive": " ǝʌıʇɔɐuI ", "create.gui.factory_panel.left_click_disconnect": "ʇɔǝuuoɔsıp oʇ ʞɔıןƆ-ʇɟǝꞀ", "create.gui.factory_panel.left_click_reset": "ʇǝsǝɹ oʇ ʞɔıןƆ-ʇɟǝꞀ", "create.gui.factory_panel.no_open_promises": "sǝsıɯoɹd uǝdo oN", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index c6b6d3760d..47143ae5d0 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1100,9 +1100,10 @@ "create.elevator_contact.floor_identifier": "Floor Identifier", "create.elevator_contact.title": "Elevator Contact", "create.factory_panel.click_second_panel": "Click a second panel to connect...", - "create.factory_panel.click_to_configure": "Click to specify a recipe", + "create.factory_panel.click_to_configure": "Click to configure", "create.factory_panel.connection_aborted": "Input connection aborted", "create.factory_panel.cycled_arrow_path": "Cycled arrow pathing mode %1$s", + "create.factory_panel.hold_to_set_amount": "Click and hold for target amount", "create.factory_panel.in_progress": "(In Progress)", "create.factory_panel.input_in_restock_mode": "Input panel cannot be in restock mode", "create.factory_panel.new_factory_task": "New factory task", @@ -1201,6 +1202,7 @@ "create.gui.factory_panel.expected_output_tip": "The amount of output returning", "create.gui.factory_panel.expected_output_tip_1": "after each successful request", "create.gui.factory_panel.expected_output_tip_2": "Scroll to change", + "create.gui.factory_panel.inactive": " Inactive ", "create.gui.factory_panel.left_click_disconnect": "Left-Click to disconnect", "create.gui.factory_panel.left_click_reset": "Left-Click to reset", "create.gui.factory_panel.no_open_promises": "No open promises", diff --git a/src/main/java/com/simibubi/create/AllPartialModels.java b/src/main/java/com/simibubi/create/AllPartialModels.java index adcfe28e64..a9b6901714 100644 --- a/src/main/java/com/simibubi/create/AllPartialModels.java +++ b/src/main/java/com/simibubi/create/AllPartialModels.java @@ -216,6 +216,7 @@ public class AllPartialModels { public static final Map FACTORY_PANEL_ARROWS = new EnumMap<>(Direction.class); public static final Map FACTORY_PANEL_LINES = new EnumMap<>(Direction.class); + public static final Map FACTORY_PANEL_DOTTED = new EnumMap<>(Direction.class); public static final Map METAL_GIRDER_BRACKETS = new EnumMap<>(Direction.class); public static final Map TOOLBOX_LIDS = new EnumMap<>(DyeColor.class); @@ -242,6 +243,7 @@ public class AllPartialModels { METAL_GIRDER_BRACKETS.put(d, block("metal_girder/bracket_" + Lang.asId(d.name()))); FACTORY_PANEL_ARROWS.put(d, block("factory_gauge/connections/arrow_" + Lang.asId(d.name()))); FACTORY_PANEL_LINES.put(d, block("factory_gauge/connections/line_" + Lang.asId(d.name()))); + FACTORY_PANEL_DOTTED.put(d, block("factory_gauge/connections/dotted_" + Lang.asId(d.name()))); } for (int i = 0; i < 8; i++) CONTRAPTION_CONTROLS_INDICATOR.add(block("contraption_controls/indicator_" + i)); diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java index 42c80652b9..9f066b95f9 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java @@ -1,5 +1,6 @@ package com.simibubi.create.content.logistics.factoryBoard; +import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -33,19 +34,20 @@ import com.simibubi.create.content.logistics.packagerLink.RequestPromise; import com.simibubi.create.content.logistics.packagerLink.RequestPromiseQueue; import com.simibubi.create.content.logistics.stockTicker.PackageOrder; import com.simibubi.create.foundation.blockEntity.behaviour.BehaviourType; +import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import com.simibubi.create.foundation.blockEntity.behaviour.ValueSettingsBoard; import com.simibubi.create.foundation.blockEntity.behaviour.ValueSettingsFormatter; import com.simibubi.create.foundation.blockEntity.behaviour.filtering.FilteringBehaviour; import com.simibubi.create.foundation.utility.CreateLang; import net.createmod.catnip.gui.ScreenOpener; -import net.createmod.catnip.utility.Iterate; import net.createmod.catnip.utility.NBTHelper; import net.createmod.catnip.utility.animation.LerpedFloat; import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; import net.createmod.catnip.utility.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.client.player.LocalPlayer; +import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; @@ -55,9 +57,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; -import net.minecraft.world.phys.Vec3; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fml.DistExecutor; @@ -71,6 +71,7 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { public static final int REQUEST_INTERVAL = 100; public Map targetedBy; + public Map targetedByLinks; public Set targeting; public List activeCraftingArrangement; @@ -100,6 +101,7 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { super(be, new FactoryPanelSlotPositioning(slot)); this.slot = slot; this.targetedBy = new HashMap<>(); + this.targetedByLinks = new HashMap<>(); this.targeting = new HashSet<>(); this.count = 0; this.satisfied = false; @@ -114,7 +116,7 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { this.promiseClearingInterval = -1; this.bulb = LerpedFloat.linear() .startWithValue(0) - .chase(0, 0.45, Chaser.EXP); + .chase(0, 0.125, Chaser.EXP); this.restockerPromises = new RequestPromiseQueue(be::setChanged); this.promisePrimedForMarkDirty = true; this.network = UUID.randomUUID(); @@ -125,6 +127,16 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { this.network = network; } + @Nullable + public static FactoryPanelBehaviour at(BlockAndTintGetter world, FactoryPanelConnection connection) { + Object cached = connection.cachedSource.get(); + if (cached instanceof FactoryPanelBehaviour fbe && !fbe.blockEntity.isRemoved()) + return fbe; + FactoryPanelBehaviour result = at(world, connection.from); + connection.cachedSource = new WeakReference(result); + return result; + } + @Nullable public static FactoryPanelBehaviour at(BlockAndTintGetter world, FactoryPanelPosition pos) { if (world instanceof Level l && !l.isLoaded(pos.pos())) @@ -137,6 +149,29 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { return behaviour; } + @Nullable + public static FactoryPanelSupportBehaviour linkAt(BlockAndTintGetter world, FactoryPanelConnection connection) { + Object cached = connection.cachedSource.get(); + if (cached instanceof FactoryPanelSupportBehaviour fpsb && !fpsb.blockEntity.isRemoved()) + return fpsb; + FactoryPanelSupportBehaviour result = linkAt(world, connection.from); + connection.cachedSource = new WeakReference(result); + return result; + } + + @Nullable + public static FactoryPanelSupportBehaviour linkAt(BlockAndTintGetter world, FactoryPanelPosition pos) { + if (world instanceof Level l && !l.isLoaded(pos.pos())) + return null; + return BlockEntityBehaviour.get(world, pos.pos(), FactoryPanelSupportBehaviour.TYPE); + } + + @Override + public void initialize() { + super.initialize(); + notifyRedstoneOutputs(); + } + @Override public void tick() { super.tick(); @@ -168,23 +203,34 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { return; boolean shouldPower = false; - BlockState blockState = blockEntity.getBlockState(); - Vec3 localOffset = getSlotPositioning().getLocalOffset(getWorld(), getPos(), blockState); - - for (Direction d : Iterate.directions) { - if (!localOffset.subtract(0.5, 0.5, 0.5) - .closerThan(Vec3.atLowerCornerOf(d.getNormal()), 1.25)) - continue; - shouldPower |= getWorld().getSignal(getPos().relative(d), d) > 0; + for (FactoryPanelConnection connection : targetedByLinks.values()) { + if (!getWorld().isLoaded(connection.from.pos())) + return; + FactoryPanelSupportBehaviour linkAt = linkAt(getWorld(), connection); + if (linkAt == null) + return; + shouldPower |= linkAt.shouldPanelBePowered(); } if (shouldPower == redstonePowered) return; + redstonePowered = shouldPower; blockEntity.notifyUpdate(); timer = 1; } + private void notifyRedstoneOutputs() { + for (FactoryPanelConnection connection : targetedByLinks.values()) { + if (!getWorld().isLoaded(connection.from.pos())) + return; + FactoryPanelSupportBehaviour linkAt = linkAt(getWorld(), connection); + if (linkAt == null || linkAt.isOutput()) + return; + linkAt.notifyLink(); + } + } + private void tickStorageMonitor() { ItemStack filter = getFilter(); int inStorage = getLevelInStorage(); @@ -200,7 +246,7 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { && promisedSatisfied == shouldPromiseSatisfy && waitingForNetwork == shouldWait) return; - boolean comparator = satisfied != shouldSatisfy; + boolean notifyOutputs = satisfied != shouldSatisfy; lastReportedLevelInStorage = inStorage; satisfied = shouldSatisfy; lastReportedPromises = promised; @@ -208,8 +254,8 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { lastReportedUnloadedLinks = unloadedLinkCount; waitingForNetwork = shouldWait; blockEntity.sendData(); - if (comparator) - blockEntity.setChanged(); + if (notifyOutputs) + notifyRedstoneOutputs(); } private void tickRequests() { @@ -240,7 +286,7 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { List toRequestAsList = new ArrayList<>(); for (FactoryPanelConnection connection : targetedBy.values()) { - FactoryPanelBehaviour source = at(getWorld(), connection.from); + FactoryPanelBehaviour source = at(getWorld(), connection); if (source == null) return; @@ -337,11 +383,23 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { } public void addConnection(FactoryPanelPosition fromPos) { + FactoryPanelSupportBehaviour link = linkAt(getWorld(), fromPos); + if (link != null) { + targetedByLinks.put(fromPos.pos(), new FactoryPanelConnection(fromPos, 1)); + link.connect(this); + blockEntity.notifyUpdate(); + return; + } + + if (panelBE().restocker) + return; if (targetedBy.size() >= 9) return; + FactoryPanelBehaviour source = at(getWorld(), fromPos); if (source == null) return; + source.targeting.add(getPanelPosition()); targetedBy.put(fromPos, new FactoryPanelConnection(fromPos, 1)); blockEntity.notifyUpdate(); @@ -366,6 +424,8 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { if (AllItemTags.WRENCH.matches(player.getItemInHand(hand))) { int sharedMode = -1; + boolean notifySelf = false; + for (FactoryPanelPosition target : targeting) { FactoryPanelBehaviour at = at(getWorld(), target); if (at == null) @@ -379,6 +439,15 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { if (!player.level().isClientSide) at.blockEntity.notifyUpdate(); } + + for (FactoryPanelConnection connection : targetedByLinks.values()) { + if (sharedMode == -1) + sharedMode = (connection.arrowBendMode + 1) % 4; + connection.arrowBendMode = sharedMode; + if (!player.level().isClientSide) + notifySelf = true; + } + if (sharedMode == -1) return; @@ -386,6 +455,8 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { boxes[sharedMode] = '\u25a0'; player.displayClientMessage(CreateLang.translate("factory_panel.cycled_arrow_path", new String(boxes)) .component(), true); + if (notifySelf) + blockEntity.notifyUpdate(); return; } @@ -438,8 +509,13 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { public void disconnectAll() { FactoryPanelPosition panelPosition = getPanelPosition(); - for (FactoryPanelPosition position : targetedBy.keySet()) { - FactoryPanelBehaviour source = at(getWorld(), position); + for (FactoryPanelConnection connection : targetedByLinks.values()) { + FactoryPanelSupportBehaviour source = linkAt(getWorld(), connection); + if (source != null) + source.disconnect(this); + } + for (FactoryPanelConnection connection : targetedBy.values()) { + FactoryPanelBehaviour source = at(getWorld(), connection); if (source != null) { source.targeting.remove(panelPosition); source.blockEntity.sendData(); @@ -452,6 +528,7 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { target.blockEntity.sendData(); } } + targetedByLinks.clear(); targetedBy.clear(); targeting.clear(); } @@ -536,6 +613,8 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { panelTag.putBoolean("RedstonePowered", redstonePowered); panelTag.put("Targeting", NBTHelper.writeCompoundList(targeting, FactoryPanelPosition::write)); panelTag.put("TargetedBy", NBTHelper.writeCompoundList(targetedBy.values(), FactoryPanelConnection::write)); + panelTag.put("TargetedByLinks", + NBTHelper.writeCompoundList(targetedByLinks.values(), FactoryPanelConnection::write)); panelTag.putString("RecipeAddress", recipeAddress); panelTag.putInt("RecipeOutput", recipeOutput); panelTag.putInt("PromiseClearingInterval", promiseClearingInterval); @@ -579,6 +658,11 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { NBTHelper.iterateCompoundList(panelTag.getList("TargetedBy", Tag.TAG_COMPOUND), c -> targetedBy.put(FactoryPanelPosition.read(c), FactoryPanelConnection.read(c))); + targetedByLinks.clear(); + NBTHelper.iterateCompoundList(panelTag.getList("TargetedByLinks", Tag.TAG_COMPOUND), + c -> targetedByLinks.put(FactoryPanelPosition.read(c) + .pos(), FactoryPanelConnection.read(c))); + activeCraftingArrangement = NBTHelper.readItemList(panelTag.getList("Craft", Tag.TAG_COMPOUND)); recipeAddress = panelTag.getString("RecipeAddress"); recipeOutput = panelTag.getInt("RecipeOutput"); @@ -597,7 +681,7 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { @Override public MutableComponent formatValue(ValueSettings value) { - return value.value() == 0 ? Components.literal("*") + return value.value() == 0 ? CreateLang.translateDirect("gui.factory_panel.inactive") : Components.literal(Math.max(0, value.value()) + ((value.row() == 0) ? "" : "\u25A4")); } @@ -675,6 +759,10 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { .translateDirect(filter.isEmpty() ? "logistics.filter.click_to_set" : "factory_panel.click_to_configure"); } + public MutableComponent getAmountTip() { + return CreateLang.translateDirect("factory_panel.hold_to_set_amount"); + } + @Override public MutableComponent getCountLabelForValueBox() { if (filter.isEmpty()) diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java index fc9b9d68a7..6747c4fc34 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java @@ -221,28 +221,6 @@ public class FactoryPanelBlock extends FaceAttachedHorizontalDirectionalBlock return InteractionResult.SUCCESS; } - @Override - public void neighborChanged(BlockState pState, Level pLevel, BlockPos pPos, Block pNeighborBlock, - BlockPos pNeighborPos, boolean pMovedByPiston) { - withBlockEntityDo(pLevel, pPos, fpbe -> fpbe.panels.values() - .forEach(FactoryPanelBehaviour::checkForRedstoneInput)); - } - - @Override - public boolean hasAnalogOutputSignal(BlockState pState) { - return true; - } - - @Override - public int getAnalogOutputSignal(BlockState pState, Level pLevel, BlockPos pPos) { - return getBlockEntityOptional(pLevel, pPos).map(fpbe -> fpbe.panels.values() - .stream() - .filter(fpb -> fpb.isActive() && fpb.satisfied && fpb.count != 0) - .count()) - .orElse(0L) - .intValue(); - } - @Override public boolean onDestroyedByPlayer(BlockState state, Level level, BlockPos pos, Player player, boolean willHarvest, FluidState fluid) { diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnection.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnection.java index 3c70bbc40a..2d3b9263dd 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnection.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnection.java @@ -1,5 +1,6 @@ package com.simibubi.create.content.logistics.factoryBoard; +import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; @@ -20,6 +21,8 @@ public class FactoryPanelConnection { public int arrowBendMode; public boolean success; + public WeakReference cachedSource; + private int arrowBendModeCurrentPathUses; public FactoryPanelConnection(FactoryPanelPosition from, int amount) { @@ -29,6 +32,7 @@ public class FactoryPanelConnection { success = true; arrowBendMode = -1; arrowBendModeCurrentPathUses = 0; + cachedSource = new WeakReference(null); } public static FactoryPanelConnection read(CompoundTag nbt) { @@ -52,20 +56,7 @@ public class FactoryPanelConnection { arrowBendModeCurrentPathUses = arrowBendMode; path.clear(); - float xRot = Mth.RAD_TO_DEG * FactoryPanelBlock.getXRot(state); - float yRot = Mth.RAD_TO_DEG * FactoryPanelBlock.getYRot(state); - - int slotDiffx = to.slot().xOffset - from.slot().xOffset; - int slotDiffY = to.slot().yOffset - from.slot().yOffset; - Vec3 diff = Vec3.atLowerCornerOf(to.pos() - .subtract(from.pos())); - - diff = VecHelper.rotate(diff, -yRot, Axis.Y); - diff = VecHelper.rotate(diff, -xRot - 90, Axis.X); - diff = VecHelper.rotate(diff, -180, Axis.Y); - diff = diff.add(slotDiffx * .5, 0, slotDiffY * .5); - diff = diff.multiply(1, 0, 1); - + Vec3 diff = calculatePathDiff(state, to); BlockPos toTravelFirst = BlockPos.ZERO; BlockPos toTravelLast = BlockPos.containing(diff.scale(2) .add(0.1, 0.1, 0.1)); @@ -113,4 +104,20 @@ public class FactoryPanelConnection { return path; } + public Vec3 calculatePathDiff(BlockState state, FactoryPanelPosition to) { + float xRot = Mth.RAD_TO_DEG * FactoryPanelBlock.getXRot(state); + float yRot = Mth.RAD_TO_DEG * FactoryPanelBlock.getYRot(state); + int slotDiffx = to.slot().xOffset - from.slot().xOffset; + int slotDiffY = to.slot().yOffset - from.slot().yOffset; + + Vec3 diff = Vec3.atLowerCornerOf(to.pos() + .subtract(from.pos())); + diff = VecHelper.rotate(diff, -yRot, Axis.Y); + diff = VecHelper.rotate(diff, -xRot - 90, Axis.X); + diff = VecHelper.rotate(diff, -180, Axis.Y); + diff = diff.add(slotDiffx * .5, 0, slotDiffY * .5); + diff = diff.multiply(1, 0, 1); + return diff; + } + } diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionHandler.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionHandler.java index ad76c900c1..7dd0f2943c 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionHandler.java @@ -3,6 +3,9 @@ package com.simibubi.create.content.logistics.factoryBoard; import javax.annotation.Nullable; import com.simibubi.create.AllPackets; +import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBlock.PanelSlot; +import com.simibubi.create.content.redstone.displayLink.DisplayLinkBlockEntity; +import com.simibubi.create.content.redstone.link.RedstoneLinkBlockEntity; import com.simibubi.create.foundation.utility.CreateLang; import net.createmod.catnip.CatnipClient; @@ -15,6 +18,7 @@ import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.BlockHitResult; @@ -127,9 +131,42 @@ public class FactoryPanelConnectionHandler { return false; Minecraft mc = Minecraft.getInstance(); boolean missed = false; - if (mc.hitResult instanceof BlockHitResult bhr && bhr.getType() != Type.MISS) - if (!(mc.level.getBlockEntity(bhr.getBlockPos()) instanceof FactoryPanelBlockEntity)) + + if (mc.hitResult instanceof BlockHitResult bhr && bhr.getType() != Type.MISS) { + BlockEntity blockEntity = mc.level.getBlockEntity(bhr.getBlockPos()); + + // Connecting redstone or display links + if (blockEntity instanceof RedstoneLinkBlockEntity || blockEntity instanceof DisplayLinkBlockEntity) { + FactoryPanelPosition bestPosition = null; + double bestDistance = Double.POSITIVE_INFINITY; + + for (PanelSlot slot : PanelSlot.values()) { + FactoryPanelPosition panelPosition = new FactoryPanelPosition(blockEntity.getBlockPos(), slot); + FactoryPanelConnection connection = new FactoryPanelConnection(panelPosition, 1); + Vec3 diff = + connection.calculatePathDiff(mc.level.getBlockState(connectingFrom.pos()), connectingFrom); + if (bestDistance < diff.lengthSqr()) + continue; + bestDistance = diff.lengthSqr(); + bestPosition = panelPosition; + } + + AllPackets.getChannel() + .sendToServer(new FactoryPanelConnectionPacket(bestPosition, connectingFrom)); + + mc.player.displayClientMessage(CreateLang.translate("factory_panel.link_connected") + .style(ChatFormatting.GREEN) + .component(), true); + + connectingFrom = null; + connectingFromBox = null; + return true; + } + + if (!(blockEntity instanceof FactoryPanelBlockEntity)) missed = true; + } + if (!mc.player.isShiftKeyDown() && !missed) return false; connectingFrom = null; diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelRenderer.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelRenderer.java index ba7d3cf6b2..6391b05855 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelRenderer.java @@ -5,6 +5,8 @@ import java.util.List; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllPartialModels; import com.simibubi.create.AllSpriteShifts; +import com.simibubi.create.content.redstone.displayLink.DisplayLinkBlockEntity; +import com.simibubi.create.content.redstone.link.RedstoneLinkBlockEntity; import com.simibubi.create.foundation.blockEntity.renderer.SmartBlockEntityRenderer; import com.simibubi.create.foundation.render.RenderTypes; @@ -37,6 +39,8 @@ public class FactoryPanelRenderer extends SmartBlockEntityRenderer 0 && !behaviour.satisfied) { - color = Color.mixColors(color, success ? 0xEAF2EC : 0xE5654B, glow); - if (!behaviour.satisfied && !behaviour.promisedSatisfied) - yOffset += (success ? 1 : 2) * glow; + } else if (redstoneLinkMode) { + // Link status + color = pathReversed ? (behaviour.count == 0 ? 0x888898 : behaviour.satisfied ? 0xEF0000 : 0x580101) + : (behaviour.redstonePowered ? 0xEF0000 : 0x580101); + yOffset = 0.5f; + + } else { + // Regular ingredient status + color = behaviour.count == 0 ? 0x888898 + : behaviour.redstonePowered ? 0x888898 + : behaviour.waitingForNetwork ? 0x5B3B3B + : behaviour.satisfied ? 0x9EFF7F : behaviour.promisedSatisfied ? 0x22AFAF : 0x3D6EBD; + + yOffset = 1; + yOffset += behaviour.promisedSatisfied ? 1 : behaviour.satisfied ? 0 : 2; + + if (!behaviour.redstonePowered && !behaviour.waitingForNetwork && glow > 0 && !behaviour.satisfied) { + float p = (1 - (1 - glow) * (1 - glow)); + color = Color.mixColors(color, success ? 0xEAF2EC : 0xE5654B, p); + if (!behaviour.satisfied && !behaviour.promisedSatisfied) + yOffset += (success ? 1 : 2) * p; + } } float currentX = 0; @@ -108,25 +136,35 @@ public class FactoryPanelRenderer extends SmartBlockEntityRenderer= itemX && mouseX < itemX + 16 && mouseY >= itemY && mouseY < itemY + 16) { sendIt(null, true); diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelSupportBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelSupportBehaviour.java new file mode 100644 index 0000000000..b7c56832f9 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelSupportBehaviour.java @@ -0,0 +1,141 @@ +package com.simibubi.create.content.logistics.factoryBoard; + +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; +import java.util.function.Supplier; + +import javax.annotation.Nullable; + +import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; +import com.simibubi.create.foundation.blockEntity.behaviour.BehaviourType; +import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; + +import net.createmod.catnip.utility.NBTHelper; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; + +public class FactoryPanelSupportBehaviour extends BlockEntityBehaviour { + + public static final BehaviourType TYPE = new BehaviourType<>(); + + private Set linkedPanels; + private boolean changed; + + private Supplier outputPower; + private Supplier isOutput; + private Runnable onNotify; + + public FactoryPanelSupportBehaviour(SmartBlockEntity be, Supplier isOutput, Supplier outputPower, + Runnable onNotify) { + super(be); + this.isOutput = isOutput; + this.outputPower = outputPower; + this.onNotify = onNotify; + linkedPanels = new HashSet<>(); + } + + public boolean shouldPanelBePowered() { + return isOutput() && outputPower.get(); + } + + public boolean isOutput() { + return isOutput.get(); + } + + public void notifyLink() { + onNotify.run(); + } + + @Override + public void destroy() { + for (Iterator iterator = linkedPanels.iterator(); iterator.hasNext();) { + FactoryPanelPosition panelPos = iterator.next(); + if (!getWorld().isLoaded(panelPos.pos())) + continue; + FactoryPanelBehaviour behaviour = FactoryPanelBehaviour.at(getWorld(), panelPos); + behaviour.targetedByLinks.remove(getPos()); + behaviour.blockEntity.notifyUpdate(); + } + super.destroy(); + } + + public void notifyPanels() { + if (getWorld().isClientSide()) + return; + for (Iterator iterator = linkedPanels.iterator(); iterator.hasNext();) { + FactoryPanelPosition panelPos = iterator.next(); + if (!getWorld().isLoaded(panelPos.pos())) + continue; + FactoryPanelBehaviour behaviour = FactoryPanelBehaviour.at(getWorld(), panelPos); + if (behaviour == null) { + iterator.remove(); + changed = true; + continue; + } + behaviour.checkForRedstoneInput(); + } + } + + @Nullable + public Boolean shouldBePoweredTristate() { + for (Iterator iterator = linkedPanels.iterator(); iterator.hasNext();) { + FactoryPanelPosition panelPos = iterator.next(); + if (!getWorld().isLoaded(panelPos.pos())) + return null; + FactoryPanelBehaviour behaviour = FactoryPanelBehaviour.at(getWorld(), panelPos); + if (behaviour == null) { + iterator.remove(); + changed = true; + continue; + } + if (behaviour.isActive() && behaviour.satisfied && behaviour.count != 0) + return true; + } + return false; + } + + public Set getLinkedPanels() { + return linkedPanels; + } + + public void connect(FactoryPanelBehaviour panel) { + linkedPanels.add(panel.getPanelPosition()); + changed = true; + } + + public void disconnect(FactoryPanelBehaviour panel) { + linkedPanels.remove(panel.getPanelPosition()); + changed = true; + } + + @Override + public void tick() { + super.tick(); + if (changed) { + changed = false; + if (!isOutput()) + notifyLink(); + blockEntity.setChanged(); + } + } + + @Override + public void write(CompoundTag nbt, boolean clientPacket) { + if (!linkedPanels.isEmpty()) + nbt.put("LinkedGauges", NBTHelper.writeCompoundList(linkedPanels, FactoryPanelPosition::write)); + } + + @Override + public void read(CompoundTag nbt, boolean clientPacket) { + linkedPanels.clear(); + linkedPanels.addAll( + NBTHelper.readCompoundList(nbt.getList("LinkedGauges", Tag.TAG_COMPOUND), FactoryPanelPosition::read)); + } + + @Override + public BehaviourType getType() { + return TYPE; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperRequestScreen.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperRequestScreen.java index 495bf75903..63fccad956 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperRequestScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperRequestScreen.java @@ -519,7 +519,7 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen 8) graphics.drawString(font, Components.literal("[+" + (itemsToOrder.size() - 8) + "]"), x + windowWidth - 40, - orderY + 21, 0xB59370); + orderY + 21, 0xF8F8EC); boolean justSent = itemsToOrder.isEmpty() && successTicks > 0; if (isConfirmHovered(mouseX, mouseY) && !justSent) diff --git a/src/main/java/com/simibubi/create/content/redstone/displayLink/DisplayLinkBlock.java b/src/main/java/com/simibubi/create/content/redstone/displayLink/DisplayLinkBlock.java index 36612c8f45..d0fb308c80 100644 --- a/src/main/java/com/simibubi/create/content/redstone/displayLink/DisplayLinkBlock.java +++ b/src/main/java/com/simibubi/create/content/redstone/displayLink/DisplayLinkBlock.java @@ -63,6 +63,11 @@ public class DisplayLinkBlock extends WrenchableDirectionalBlock implements IBE< super.setPlacedBy(pLevel, pPos, pState, pPlacer, pStack); AdvancementBehaviour.setPlacedBy(pLevel, pPos, pPlacer); } + + @Override + public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pMovedByPiston) { + IBE.onRemove(pState, pLevel, pPos, pNewState); + } public static void notifyGatherers(LevelAccessor level, BlockPos pos) { forEachAttachedGatherer(level, pos, DisplayLinkBlockEntity::tickSource); diff --git a/src/main/java/com/simibubi/create/content/redstone/displayLink/DisplayLinkBlockEntity.java b/src/main/java/com/simibubi/create/content/redstone/displayLink/DisplayLinkBlockEntity.java index 96d24df5cf..11427c0260 100644 --- a/src/main/java/com/simibubi/create/content/redstone/displayLink/DisplayLinkBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/redstone/displayLink/DisplayLinkBlockEntity.java @@ -7,14 +7,12 @@ import org.jetbrains.annotations.Nullable; import com.simibubi.create.compat.computercraft.AbstractComputerBehaviour; import com.simibubi.create.compat.computercraft.ComputerCraftProxy; +import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelSupportBehaviour; import com.simibubi.create.content.redstone.displayLink.source.DisplaySource; import com.simibubi.create.content.redstone.displayLink.target.DisplayTarget; import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; -import net.createmod.catnip.utility.NBTHelper; -import net.createmod.catnip.utility.animation.LerpedFloat; -import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; @@ -37,6 +35,7 @@ public class DisplayLinkBlockEntity extends LinkWithBulbBlockEntity { public int refreshTicks; public AbstractComputerBehaviour computerBehaviour; + public FactoryPanelSupportBehaviour factoryPanelSupport; public DisplayLinkBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); @@ -48,6 +47,8 @@ public class DisplayLinkBlockEntity extends LinkWithBulbBlockEntity { @Override public void addBehaviours(List behaviours) { behaviours.add(computerBehaviour = ComputerCraftProxy.behaviour(this)); + behaviours.add(factoryPanelSupport = new FactoryPanelSupportBehaviour(this, () -> false, () -> false, () -> { + })); registerAwardables(behaviours, AllAdvancements.DISPLAY_LINK, AllAdvancements.DISPLAY_BOARD); } diff --git a/src/main/java/com/simibubi/create/content/redstone/link/RedstoneLinkBlock.java b/src/main/java/com/simibubi/create/content/redstone/link/RedstoneLinkBlock.java index 1df343d5fb..dd3896f2e3 100644 --- a/src/main/java/com/simibubi/create/content/redstone/link/RedstoneLinkBlock.java +++ b/src/main/java/com/simibubi/create/content/redstone/link/RedstoneLinkBlock.java @@ -71,6 +71,11 @@ public class RedstoneLinkBlock extends WrenchableDirectionalBlock implements IBE updateTransmittedSignal(state, worldIn, pos); } + @Override + public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pMovedByPiston) { + IBE.onRemove(pState, pLevel, pPos, pNewState); + } + public void updateTransmittedSignal(BlockState state, Level worldIn, BlockPos pos) { if (worldIn.isClientSide) return; @@ -78,6 +83,21 @@ public class RedstoneLinkBlock extends WrenchableDirectionalBlock implements IBE return; int power = getPower(worldIn, pos); + int powerFromPanels = getBlockEntityOptional(worldIn, pos).map(be -> { + if (be.panelSupport == null) + return 0; + Boolean tri = be.panelSupport.shouldBePoweredTristate(); + if (tri == null) + return -1; + return tri ? 15 : 0; + }) + .orElse(0); + + // Suppress update if an input panel exists but is not loaded + if (powerFromPanels == -1) + return; + + power = Math.max(power, powerFromPanels); boolean previouslyPowered = state.getValue(POWERED); if (previouslyPowered != power > 0) @@ -113,7 +133,7 @@ public class RedstoneLinkBlock extends WrenchableDirectionalBlock implements IBE if (!state.getValue(RECEIVER)) return 0; return getBlockEntityOptional(blockAccess, pos).map(RedstoneLinkBlockEntity::getReceivedSignal) - .orElse(0); + .orElse(0); } @Override @@ -140,7 +160,7 @@ public class RedstoneLinkBlock extends WrenchableDirectionalBlock implements IBE Boolean wasReceiver = state.getValue(RECEIVER); boolean blockPowered = worldIn.hasNeighborSignal(pos); worldIn.setBlock(pos, state.cycle(RECEIVER) - .setValue(POWERED, blockPowered), 3); + .setValue(POWERED, blockPowered), 3); be.transmit(wasReceiver ? 0 : getPower(worldIn, pos)); return InteractionResult.SUCCESS; }); @@ -149,7 +169,8 @@ public class RedstoneLinkBlock extends WrenchableDirectionalBlock implements IBE @Override public InteractionResult onWrenched(BlockState state, UseOnContext context) { if (toggleMode(state, context.getLevel(), context.getClickedPos()) == InteractionResult.SUCCESS) { - context.getLevel().scheduleTick(context.getClickedPos(), this, 1); + context.getLevel() + .scheduleTick(context.getClickedPos(), this, 1); return InteractionResult.SUCCESS; } return super.onWrenched(state, context); diff --git a/src/main/java/com/simibubi/create/content/redstone/link/RedstoneLinkBlockEntity.java b/src/main/java/com/simibubi/create/content/redstone/link/RedstoneLinkBlockEntity.java index 7b5b706d22..707f1b83ab 100644 --- a/src/main/java/com/simibubi/create/content/redstone/link/RedstoneLinkBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/redstone/link/RedstoneLinkBlockEntity.java @@ -5,6 +5,7 @@ import java.util.List; import org.apache.commons.lang3.tuple.Pair; import com.simibubi.create.AllBlocks; +import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelSupportBehaviour; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform; @@ -23,12 +24,18 @@ public class RedstoneLinkBlockEntity extends SmartBlockEntity { private LinkBehaviour link; private boolean transmitter; + public FactoryPanelSupportBehaviour panelSupport; + public RedstoneLinkBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); } @Override - public void addBehaviours(List behaviours) {} + public void addBehaviours(List behaviours) { + behaviours.add(panelSupport = new FactoryPanelSupportBehaviour(this, () -> link != null && link.isListening(), + () -> receivedSignal > 0, () -> AllBlocks.REDSTONE_LINK.get() + .updateTransmittedSignal(getBlockState(), level, worldPosition))); + } @Override public void addBehavioursDeferred(List behaviours) { @@ -115,6 +122,7 @@ public class RedstoneLinkBlockEntity extends SmartBlockEntity { level.blockUpdated(attachedPos, level.getBlockState(attachedPos) .getBlock()); receivedSignalChanged = false; + panelSupport.notifyPanels(); } } diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringBehaviour.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringBehaviour.java index 4673a6374b..0f31d3ab57 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringBehaviour.java @@ -330,6 +330,10 @@ public class FilteringBehaviour extends BlockEntityBehaviour implements ValueSet .translateDirect(filter.isEmpty() ? "logistics.filter.click_to_set" : "logistics.filter.click_to_replace"); } + public MutableComponent getAmountTip() { + return CreateLang.translateDirect("logistics.filter.hold_to_set_amount"); + } + public MutableComponent getCountLabelForValueBox() { return Components.literal(isCountVisible() ? upTo && filter.item() .getMaxStackSize() == count ? "*" : String.valueOf(count) : ""); diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringRenderer.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringRenderer.java index eae9a599d2..fc055722fb 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringRenderer.java @@ -15,7 +15,6 @@ import com.simibubi.create.foundation.blockEntity.behaviour.ValueBox.ItemValueBo import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxRenderer; import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform; import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform.Sided; -import com.simibubi.create.foundation.utility.CreateLang; import net.createmod.catnip.CatnipClient; import net.createmod.catnip.utility.Iterate; @@ -103,7 +102,7 @@ public class FilteringRenderer { tip.add(label.copy()); tip.add(behaviour.getTip()); if (showCount) - tip.add(CreateLang.translateDirect("logistics.filter.hold_to_set_amount")); + tip.add(behaviour.getAmountTip()); CreateClient.VALUE_SETTINGS_HANDLER.showHoverTip(tip); } diff --git a/src/main/resources/assets/create/lang/default/interface.json b/src/main/resources/assets/create/lang/default/interface.json index a10d42f29b..1449f65175 100644 --- a/src/main/resources/assets/create/lang/default/interface.json +++ b/src/main/resources/assets/create/lang/default/interface.json @@ -1075,6 +1075,7 @@ "create.gui.factory_panel.crafting_input": "Packaged Ingredients", "create.gui.factory_panel.crafting_input_tip": "Unpackage into connected", "create.gui.factory_panel.crafting_input_tip_1": "mechanical crafters (3x3)", + "create.gui.factory_panel.inactive": " Inactive ", "create.gui.redstone_requester.allow_partial": "Allow partial orders", "create.gui.redstone_requester.dont_allow_partial": "Must send all items", @@ -1087,7 +1088,8 @@ "create.gui.factory_panel.expected_output_tip_1": "after each successful request", "create.gui.factory_panel.expected_output_tip_2": "Scroll to change", - "create.factory_panel.click_to_configure": "Click to specify a recipe", + "create.factory_panel.click_to_configure": "Click to configure", + "create.factory_panel.hold_to_set_amount": "Click and hold for target amount", "create.factory_panel.target_amount": "Target Amount in Storage", "create.factory_panel.new_factory_task": "New factory task", "create.factory_panel.some_links_unloaded": "Some links are not loaded", diff --git a/src/main/resources/assets/create/models/block/factory_gauge/connections/dotted_east.json b/src/main/resources/assets/create/models/block/factory_gauge/connections/dotted_east.json new file mode 100644 index 0000000000..f859958985 --- /dev/null +++ b/src/main/resources/assets/create/models/block/factory_gauge/connections/dotted_east.json @@ -0,0 +1,18 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/factory_panel_dotted_connections", + "particle": "create:block/factory_panel_dotted_connections" + }, + "elements": [ + { + "from": [0, 0.1, -2], + "to": [8, 0.15, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 0, -2]}, + "faces": { + "up": {"uv": [0, 8, 8, 12], "rotation": 180, "texture": "#0"}, + "down": {"uv": [0, 12, 8, 8], "rotation": 180, "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/factory_gauge/connections/dotted_north.json b/src/main/resources/assets/create/models/block/factory_gauge/connections/dotted_north.json new file mode 100644 index 0000000000..e379b0339c --- /dev/null +++ b/src/main/resources/assets/create/models/block/factory_gauge/connections/dotted_north.json @@ -0,0 +1,18 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/factory_panel_dotted_connections", + "particle": "create:block/factory_panel_dotted_connections" + }, + "elements": [ + { + "from": [-2, 0.1, -8], + "to": [2, 0.15, 0], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, -8]}, + "faces": { + "up": {"uv": [4, 0, 8, 8], "rotation": 180, "texture": "#0"}, + "down": {"uv": [4, 8, 8, 0], "rotation": 180, "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/factory_gauge/connections/dotted_south.json b/src/main/resources/assets/create/models/block/factory_gauge/connections/dotted_south.json new file mode 100644 index 0000000000..386390ec71 --- /dev/null +++ b/src/main/resources/assets/create/models/block/factory_gauge/connections/dotted_south.json @@ -0,0 +1,17 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/factory_panel_dotted_connections", + "particle": "create:block/factory_panel_dotted_connections" + }, + "elements": [ + { + "from": [-2, 0.1, 0], + "to": [2, 0.15, 8], + "faces": { + "up": {"uv": [0, 0, 4, 8], "rotation": 180, "texture": "#0"}, + "down": {"uv": [0, 8, 4, 0], "rotation": 180, "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/factory_gauge/connections/dotted_west.json b/src/main/resources/assets/create/models/block/factory_gauge/connections/dotted_west.json new file mode 100644 index 0000000000..b2434e2546 --- /dev/null +++ b/src/main/resources/assets/create/models/block/factory_gauge/connections/dotted_west.json @@ -0,0 +1,18 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/factory_panel_dotted_connections", + "particle": "create:block/factory_panel_dotted_connections" + }, + "elements": [ + { + "from": [-8, 0.1, -2], + "to": [0, 0.15, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [-6, 0, -2]}, + "faces": { + "up": {"uv": [0, 12, 8, 16], "rotation": 180, "texture": "#0"}, + "down": {"uv": [0, 16, 8, 12], "rotation": 180, "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/block/factory_panel_dotted_connections.png b/src/main/resources/assets/create/textures/block/factory_panel_dotted_connections.png new file mode 100644 index 0000000000000000000000000000000000000000..c85742dc6410f1a311cdfa39a03eaac0cc404265 GIT binary patch literal 461 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}%0G|-o{{H^>`1nhgE`^7OpEz-%r>AH7^yy7aO+b0s%?)ZminAohFZe$c zFa-No2!R9(JR*x382I*sFrx))unJI6qQo_#Bsf2L5h);ff2~^0%B<>8{`uWMrN=$6Oe7l$OQIT6p)?S z&H@(C0pt($7 zl|hykKo(S&p@9KNwtC%<_X$_Rl7LJHPZ!4!jo`ICj$8*61ehPMdj04B(MLj68gX2* z5>9-b0gFwPtdaN?&Vi*&vO5M`pC}@Kbg%Ion`y@`UhVf$XriX KKbLh*2~7YWz;d4e literal 0 HcmV?d00001 From c235cbb898681ee6ea897ba391fed8cf06d693fc Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Thu, 19 Dec 2024 13:55:17 +0100 Subject: [PATCH 205/515] Gauges and links, part II - Added more safety checks for invalid factory gauge connections - Factory gauges now show visual feedback when the target address is missing - Fixed factory gauges rotating when more gauges are placed into the space - Added a display source for factory gauges - Factory gauge ui can now clear connections to links --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 6 +- .../resources/assets/create/lang/en_ud.json | 18 +++-- .../resources/assets/create/lang/en_us.json | 18 +++-- .../java/com/simibubi/create/AllBlocks.java | 2 + .../factoryBoard/FactoryPanelBehaviour.java | 38 +++++++--- .../factoryBoard/FactoryPanelBlock.java | 26 +++---- .../FactoryPanelConfigurationPacket.java | 12 +++- .../FactoryPanelConnectionHandler.java | 57 +++++++++++++-- .../factoryBoard/FactoryPanelRenderer.java | 15 ++-- .../factoryBoard/FactoryPanelScreen.java | 32 ++++++++- .../FactoryPanelSupportBehaviour.java | 15 ++-- .../displayLink/DisplayLinkBlockEntity.java | 4 ++ .../source/FactoryGaugeDisplaySource.java | 71 +++++++++++++++++++ .../source/TimeOfDayDisplaySource.java | 5 +- .../assets/create/lang/default/interface.json | 18 +++-- 15 files changed, 271 insertions(+), 66 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/redstone/displayLink/source/FactoryGaugeDisplaySource.java diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 63312954aa..f4a2e1332c 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-12-18T12:24:49.4666737 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-12-19T12:55:10.6405074 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -642,8 +642,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -6fd813eef2a597ff9a766f1100f8712bc765a88c assets/create/lang/en_ud.json -ff7c050e5ba7fd497e015e2477ef9b56918bb14b assets/create/lang/en_us.json +1bd5d472e6cdb275bd026df08bf6d84be741f937 assets/create/lang/en_ud.json +281d7171755d22ebdd6748fa1c927a6fe87fc78b assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 66db8b3c5d..6875a65c37 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -1045,6 +1045,7 @@ "create.display_source.fill_level.percent": "ʇuǝɔɹǝԀ", "create.display_source.fill_level.progress_bar": "ɹɐᗺ ssǝɹboɹԀ", "create.display_source.fluid_amount": "spınןℲ buıɥɔʇɐɯ ɟo ʇunoɯⱯ", + "create.display_source.gauge_status": "snʇɐʇs ǝbnɐb ʎɹoʇɔɐℲ", "create.display_source.item_throughput": "ʇndɥbnoɹɥ⟘ ɯǝʇI", "create.display_source.item_throughput.interval": "ןɐʌɹǝʇuI", "create.display_source.item_throughput.interval.hour": "ɹnoH ɹǝd", @@ -1099,22 +1100,25 @@ "create.elevator_contact.floor_description": "uoıʇdıɹɔsǝᗡ ɹooןℲ", "create.elevator_contact.floor_identifier": "ɹǝıɟıʇuǝpI ɹooןℲ", "create.elevator_contact.title": "ʇɔɐʇuoƆ ɹoʇɐʌǝןƎ", - "create.factory_panel.click_second_panel": "˙˙˙ʇɔǝuuoɔ oʇ ןǝuɐd puoɔǝs ɐ ʞɔıןƆ", + "create.factory_panel.already_connected": "pǝʇɔǝuuoɔ ʎpɐǝɹןɐ ǝɹɐ sǝbnɐ⅁", + "create.factory_panel.cannot_add_more_inputs": "ǝbnɐb sıɥʇ oʇ sʇnduı ǝɹoɯ ppɐ ʇouuɐƆ", + "create.factory_panel.click_second_panel": "˙˙˙ʇɔǝuuoɔ oʇ ǝbnɐb puoɔǝs ɐ ʞɔıןƆ", "create.factory_panel.click_to_configure": "ǝɹnbıɟuoɔ oʇ ʞɔıןƆ", "create.factory_panel.connection_aborted": "pǝʇɹoqɐ uoıʇɔǝuuoɔ ʇnduI", "create.factory_panel.cycled_arrow_path": "%1$s ǝpoɯ buıɥʇɐd ʍoɹɹɐ pǝןɔʎƆ", "create.factory_panel.hold_to_set_amount": "ʇunoɯɐ ʇǝbɹɐʇ ɹoɟ pןoɥ puɐ ʞɔıןƆ", "create.factory_panel.in_progress": ")ssǝɹboɹԀ uI(", - "create.factory_panel.input_in_restock_mode": "ǝpoɯ ʞɔoʇsǝɹ uı ǝq ʇouuɐɔ ןǝuɐd ʇnduI", + "create.factory_panel.input_in_restock_mode": "ǝpoɯ ʞɔoʇsǝɹ uı ǝq ʇouuɐɔ ǝbnɐb ʇnduI", + "create.factory_panel.link_connected": "%1$s oʇ pǝʇɔǝuuoɔ ǝbnɐ⅁", "create.factory_panel.new_factory_task": "ʞsɐʇ ʎɹoʇɔɐɟ ʍǝN", - "create.factory_panel.no_item": "ʇsɹıɟ ɯǝʇı uɐ ǝʌɐɥ ʇsnɯ ןǝuɐd ʇnduI", + "create.factory_panel.no_item": "ʇsɹıɟ ɯǝʇı uɐ ǝʌɐɥ ʇsnɯ ǝbnɐb ʇnduI", "create.factory_panel.panels_connected": "%2$s ǝʇɐǝɹɔ oʇ %1$s buısn ʍoN", "create.factory_panel.redstone_paused": ")pǝsnɐԀ ǝuoʇspǝᴚ(", - "create.factory_panel.same_orientation": "uoıʇɐʇuǝıɹo ǝɯɐs ǝɥʇ ǝʌɐɥ ʇsnɯ sןǝuɐԀ", - "create.factory_panel.same_surface": "ǝɔɐɟɹns ǝɯɐs ǝɥʇ uo ǝq ʇsnɯ sןǝuɐԀ", + "create.factory_panel.same_orientation": "uoıʇɐʇuǝıɹo ǝɯɐs ǝɥʇ ǝʌɐɥ ʇsnɯ sʞɔoןᗺ", + "create.factory_panel.same_surface": "ǝɔɐɟɹns ǝɯɐs ǝɥʇ uo ǝq ʇsnɯ sʞɔoןᗺ", "create.factory_panel.some_links_unloaded": "pǝpɐoן ʇou ǝɹɐ sʞuıן ǝɯoS", "create.factory_panel.target_amount": "ǝbɐɹoʇS uı ʇunoɯⱯ ʇǝbɹɐ⟘", - "create.factory_panel.too_far_apart": "ɹǝɥʇo ɥɔɐǝ ɯoɹɟ ʎɐʍɐ ɹɐɟ ooʇ ǝɹɐ sןǝuɐԀ", + "create.factory_panel.too_far_apart": "ɹǝɥʇo ɥɔɐǝ ɯoɹɟ ʎɐʍɐ ɹɐɟ ooʇ ǝɹɐ sʞɔoןᗺ", "create.factory_panel.tune_before_placing": "buıɔɐןd ǝɹoɟǝq ʞuıן ʞɔoʇs ɐ oʇ ǝun⟘", "create.flap_display.cycles.alphabet": "Z؛ʎ؛X؛Λ؛∩؛⟘؛S؛ᴚ؛Ὁ؛Ԁ؛O؛N؛W؛Ꞁ؛ʞ؛ſ؛I؛H؛⅁؛Ⅎ؛Ǝ؛ᗡ؛Ɔ؛ᗺ؛Ɐ؛ ", "create.flap_display.cycles.arrival_time": "sϛㄣ؛s0Ɛ؛sϛƖ؛ʍou؛uıɯ ؛ ", @@ -1193,6 +1197,7 @@ "create.gui.contraptions.network_overstressed": "˙‾ʇɔɐdɯı‾ ‾ssǝɹʇs‾ ɥbıɥ ɐ ɥʇıʍ sʇuǝuodɯoɔ ǝɥʇ ‾uʍop‾ ‾ʍoןs‾ ɹo sǝɔɹnos ǝɹoɯ ppⱯ ˙‾pǝssǝɹʇsɹǝʌo‾ sı uoıʇdɐɹʇuoɔ sıɥʇ ʇɐɥʇ sɹɐǝddɐ ʇI", "create.gui.contraptions.not_fast_enough": "˙‾pǝǝds‾ ‾ɥbnouǝ‾ ɥʇıʍ buıʇɐʇoɹ ‾ʇou‾ sı %1$s sıɥʇ ʇɐɥʇ sɹɐǝddɐ ʇI", "create.gui.factory_panel.activate_crafting": "buıʇɟɐɹƆ ןɐɔıuɐɥɔǝW ǝs∩", + "create.gui.factory_panel.address_missing": "ssǝɹppɐ ʇǝbɹɐʇ ɐ buıssıW", "create.gui.factory_panel.connect_input": "uoıʇɔǝuuoɔ ʍǝu ppⱯ", "create.gui.factory_panel.crafting_input": "sʇuǝıpǝɹbuI pǝbɐʞɔɐԀ", "create.gui.factory_panel.crafting_input_tip": "pǝʇɔǝuuoɔ oʇuı ǝbɐʞɔɐdu∩", @@ -1202,6 +1207,7 @@ "create.gui.factory_panel.expected_output_tip": "buıuɹnʇǝɹ ʇndʇno ɟo ʇunoɯɐ ǝɥ⟘", "create.gui.factory_panel.expected_output_tip_1": "ʇsǝnbǝɹ ןnɟssǝɔɔns ɥɔɐǝ ɹǝʇɟɐ", "create.gui.factory_panel.expected_output_tip_2": "ǝbuɐɥɔ oʇ ןןoɹɔS", + "create.gui.factory_panel.has_link_connections": "sʞuıן pǝʇɔǝuuoɔ sɐɥ ǝbnɐ⅁", "create.gui.factory_panel.inactive": " ǝʌıʇɔɐuI ", "create.gui.factory_panel.left_click_disconnect": "ʇɔǝuuoɔsıp oʇ ʞɔıןƆ-ʇɟǝꞀ", "create.gui.factory_panel.left_click_reset": "ʇǝsǝɹ oʇ ʞɔıןƆ-ʇɟǝꞀ", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 47143ae5d0..17c448a1ef 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1045,6 +1045,7 @@ "create.display_source.fill_level.percent": "Percent", "create.display_source.fill_level.progress_bar": "Progress Bar", "create.display_source.fluid_amount": "Amount of matching Fluids", + "create.display_source.gauge_status": "Factory gauge status", "create.display_source.item_throughput": "Item Throughput", "create.display_source.item_throughput.interval": "Interval", "create.display_source.item_throughput.interval.hour": "per Hour", @@ -1099,22 +1100,25 @@ "create.elevator_contact.floor_description": "Floor Description", "create.elevator_contact.floor_identifier": "Floor Identifier", "create.elevator_contact.title": "Elevator Contact", - "create.factory_panel.click_second_panel": "Click a second panel to connect...", + "create.factory_panel.already_connected": "Gauges are already connected", + "create.factory_panel.cannot_add_more_inputs": "Cannot add more inputs to this gauge", + "create.factory_panel.click_second_panel": "Click a second gauge to connect...", "create.factory_panel.click_to_configure": "Click to configure", "create.factory_panel.connection_aborted": "Input connection aborted", "create.factory_panel.cycled_arrow_path": "Cycled arrow pathing mode %1$s", "create.factory_panel.hold_to_set_amount": "Click and hold for target amount", "create.factory_panel.in_progress": "(In Progress)", - "create.factory_panel.input_in_restock_mode": "Input panel cannot be in restock mode", + "create.factory_panel.input_in_restock_mode": "Input gauge cannot be in restock mode", + "create.factory_panel.link_connected": "Gauge connected to %1$s", "create.factory_panel.new_factory_task": "New factory task", - "create.factory_panel.no_item": "Input panel must have an item first", + "create.factory_panel.no_item": "Input gauge must have an item first", "create.factory_panel.panels_connected": "Now using %1$s to create %2$s", "create.factory_panel.redstone_paused": "(Redstone Paused)", - "create.factory_panel.same_orientation": "Panels must have the same orientation", - "create.factory_panel.same_surface": "Panels must be on the same surface", + "create.factory_panel.same_orientation": "Blocks must have the same orientation", + "create.factory_panel.same_surface": "Blocks must be on the same surface", "create.factory_panel.some_links_unloaded": "Some links are not loaded", "create.factory_panel.target_amount": "Target Amount in Storage", - "create.factory_panel.too_far_apart": "Panels are too far away from each other", + "create.factory_panel.too_far_apart": "Blocks are too far away from each other", "create.factory_panel.tune_before_placing": "Tune to a stock link before placing", "create.flap_display.cycles.alphabet": " ;A;B;C;D;E;F;G;H;I;J;K;L;M;N;O;P;Q;R;S;T;U;V;X;Y;Z", "create.flap_display.cycles.arrival_time": " ; min;now;15s;30s;45s", @@ -1193,6 +1197,7 @@ "create.gui.contraptions.network_overstressed": "It appears that this contraption is _overstressed_. Add more sources or _slow_ _down_ the components with a high _stress_ _impact_.", "create.gui.contraptions.not_fast_enough": "It appears that this %1$s is _not_ rotating with _enough_ _speed_.", "create.gui.factory_panel.activate_crafting": "Use Mechanical Crafting", + "create.gui.factory_panel.address_missing": "Missing a target address", "create.gui.factory_panel.connect_input": "Add new connection", "create.gui.factory_panel.crafting_input": "Packaged Ingredients", "create.gui.factory_panel.crafting_input_tip": "Unpackage into connected", @@ -1202,6 +1207,7 @@ "create.gui.factory_panel.expected_output_tip": "The amount of output returning", "create.gui.factory_panel.expected_output_tip_1": "after each successful request", "create.gui.factory_panel.expected_output_tip_2": "Scroll to change", + "create.gui.factory_panel.has_link_connections": "Gauge has connected links", "create.gui.factory_panel.inactive": " Inactive ", "create.gui.factory_panel.left_click_disconnect": "Left-Click to disconnect", "create.gui.factory_panel.left_click_reset": "Left-Click to reset", diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 8b1dab8a85..469fd4cf5d 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -225,6 +225,7 @@ import com.simibubi.create.content.redstone.displayLink.source.AccumulatedItemCo import com.simibubi.create.content.redstone.displayLink.source.BoilerDisplaySource; import com.simibubi.create.content.redstone.displayLink.source.CurrentFloorDisplaySource; import com.simibubi.create.content.redstone.displayLink.source.EntityNameDisplaySource; +import com.simibubi.create.content.redstone.displayLink.source.FactoryGaugeDisplaySource; import com.simibubi.create.content.redstone.displayLink.source.FillLevelDisplaySource; import com.simibubi.create.content.redstone.displayLink.source.FluidAmountDisplaySource; import com.simibubi.create.content.redstone.displayLink.source.FluidListDisplaySource; @@ -1950,6 +1951,7 @@ public class AllBlocks { .transform(pickaxeOnly()) .blockstate((c, p) -> p.horizontalFaceBlock(c.get(), AssetLookup.partialBaseModel(c, p))) .onRegister(CreateRegistrate.blockModel(() -> FactoryPanelModel::new)) + .onRegister(assignDataBehaviour(new FactoryGaugeDisplaySource(), "gauge_status")) .item(FactoryPanelBlockItem::new) .model(AssetLookup::customItemModel) .build() diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java index 9f066b95f9..b6d5ef01f1 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java @@ -501,6 +501,10 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { return active; } + public boolean isMissingAddress() { + return !targetedBy.isEmpty() && count != 0 && recipeAddress.isBlank(); + } + @Override public void destroy() { disconnectAll(); @@ -509,11 +513,7 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { public void disconnectAll() { FactoryPanelPosition panelPosition = getPanelPosition(); - for (FactoryPanelConnection connection : targetedByLinks.values()) { - FactoryPanelSupportBehaviour source = linkAt(getWorld(), connection); - if (source != null) - source.disconnect(this); - } + disconnectAllLinks(); for (FactoryPanelConnection connection : targetedBy.values()) { FactoryPanelBehaviour source = at(getWorld(), connection); if (source != null) { @@ -528,11 +528,19 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { target.blockEntity.sendData(); } } - targetedByLinks.clear(); targetedBy.clear(); targeting.clear(); } + public void disconnectAllLinks() { + for (FactoryPanelConnection connection : targetedByLinks.values()) { + FactoryPanelSupportBehaviour source = linkAt(getWorld(), connection); + if (source != null) + source.disconnect(this); + } + targetedByLinks.clear(); + } + public int getUnloadedLinks() { if (getWorld().isClientSide()) return lastReportedUnloadedLinks; @@ -724,6 +732,11 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { public MutableComponent getLabel() { String key = ""; + if (isMissingAddress()) + return CreateLang.translate("gui.factory_panel.address_missing") + .style(ChatFormatting.RED) + .component(); + if (getFilter().isEmpty()) key = "factory_panel.new_factory_task"; else if (waitingForNetwork) @@ -770,17 +783,19 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { if (waitingForNetwork) return Components.literal("?"); - int inStorage = getLevelInStorage() / (upTo ? 1 : getFilter().getMaxStackSize()); + int levelInStorage = getLevelInStorage(); + boolean inf = levelInStorage >= BigItemStack.INF; + int inStorage = levelInStorage / (upTo ? 1 : getFilter().getMaxStackSize()); int promised = getPromised(); String stacks = upTo ? "" : "\u25A4"; if (count == 0) { - return CreateLang.text(inStorage + stacks) + return CreateLang.text(inf ? " \u221e" : inStorage + stacks) .color(0xF1EFE8) .component(); } - return CreateLang.text(" " + inStorage + stacks) + return CreateLang.text(inf ? " \u221e" : " " + inStorage + stacks) .color(satisfied ? 0xD7FFA8 : promisedSatisfied ? 0xffcd75 : 0xFFBFA8) .add(CreateLang.text(promised == 0 ? "" : "\u23F6")) .add(CreateLang.text("/") @@ -820,4 +835,9 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { ScreenOpener.open(new FactoryPanelScreen(this)); } + public int getIngredientStatusColor() { + return count == 0 || isMissingAddress() || redstonePowered ? 0x888898 + : waitingForNetwork ? 0x5B3B3B : satisfied ? 0x9EFF7F : promisedSatisfied ? 0x22AFAF : 0x3D6EBD; + } + } diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java index 6747c4fc34..f180774c4b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java @@ -113,22 +113,24 @@ public class FactoryPanelBlock extends FaceAttachedHorizontalDirectionalBlock FactoryPanelBlockEntity fpbe = getBlockEntity(level, pos); Vec3 location = pContext.getClickLocation(); - if (blockState.is(this) && location != null && fpbe != null && !level.isClientSide()) { - PanelSlot targetedSlot = getTargetedSlot(pos, blockState, location); - UUID networkFromStack = LogisticallyLinkedBlockItem.networkFromStack(pContext.getItemInHand()); - Player pPlayer = pContext.getPlayer(); + if (blockState.is(this) && location != null && fpbe != null) { + if (!level.isClientSide()) { + PanelSlot targetedSlot = getTargetedSlot(pos, blockState, location); + UUID networkFromStack = LogisticallyLinkedBlockItem.networkFromStack(pContext.getItemInHand()); + Player pPlayer = pContext.getPlayer(); - if (fpbe.addPanel(targetedSlot, networkFromStack) && pPlayer != null) { - pPlayer.displayClientMessage(CreateLang.translateDirect("logistically_linked.connected"), true); + if (fpbe.addPanel(targetedSlot, networkFromStack) && pPlayer != null) { + pPlayer.displayClientMessage(CreateLang.translateDirect("logistically_linked.connected"), true); - if (!pPlayer.isCreative()) { - ItemStack item = pContext.getItemInHand(); - item.shrink(1); - if (item.isEmpty()) - pPlayer.setItemInHand(pContext.getHand(), ItemStack.EMPTY); + if (!pPlayer.isCreative()) { + ItemStack item = pContext.getItemInHand(); + item.shrink(1); + if (item.isEmpty()) + pPlayer.setItemInHand(pContext.getHand(), ItemStack.EMPTY); + } } } - + stateForPlacement = blockState; } return withWater(stateForPlacement, pContext); diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConfigurationPacket.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConfigurationPacket.java index 99d994e5cd..5ec94a67fd 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConfigurationPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConfigurationPacket.java @@ -25,11 +25,12 @@ public class FactoryPanelConfigurationPacket extends BlockEntityConfigurationPac private FactoryPanelPosition removeConnection; private boolean clearPromises; private boolean reset; + private boolean redstoneReset; public FactoryPanelConfigurationPacket(FactoryPanelPosition position, String address, Map inputAmounts, List craftingArrangement, int outputAmount, int promiseClearingInterval, @Nullable FactoryPanelPosition removeConnection, boolean clearPromises, - boolean reset) { + boolean reset, boolean sendRedstoneReset) { super(position.pos()); this.address = address; this.inputAmounts = inputAmounts; @@ -39,6 +40,7 @@ public class FactoryPanelConfigurationPacket extends BlockEntityConfigurationPac this.removeConnection = removeConnection; this.clearPromises = clearPromises; this.reset = reset; + this.redstoneReset = sendRedstoneReset; this.slot = position.slot(); } @@ -65,6 +67,7 @@ public class FactoryPanelConfigurationPacket extends BlockEntityConfigurationPac removeConnection.send(buffer); buffer.writeBoolean(clearPromises); buffer.writeBoolean(reset); + buffer.writeBoolean(redstoneReset); } @Override @@ -85,6 +88,7 @@ public class FactoryPanelConfigurationPacket extends BlockEntityConfigurationPac removeConnection = FactoryPanelPosition.receive(buffer); clearPromises = buffer.readBoolean(); reset = buffer.readBoolean(); + redstoneReset = buffer.readBoolean(); } @Override @@ -108,6 +112,12 @@ public class FactoryPanelConfigurationPacket extends BlockEntityConfigurationPac return; } + if (redstoneReset) { + behaviour.disconnectAllLinks(); + be.notifyUpdate(); + return; + } + for (Entry entry : inputAmounts.entrySet()) { FactoryPanelPosition key = entry.getKey(); FactoryPanelConnection connection = behaviour.targetedBy.get(key); diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionHandler.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionHandler.java index 7dd0f2943c..59abe207f0 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionHandler.java @@ -4,8 +4,8 @@ import javax.annotation.Nullable; import com.simibubi.create.AllPackets; import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBlock.PanelSlot; -import com.simibubi.create.content.redstone.displayLink.DisplayLinkBlockEntity; -import com.simibubi.create.content.redstone.link.RedstoneLinkBlockEntity; +import com.simibubi.create.foundation.block.WrenchableDirectionalBlock; +import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import com.simibubi.create.foundation.utility.CreateLang; import net.createmod.catnip.CatnipClient; @@ -14,6 +14,7 @@ import net.createmod.catnip.utility.VecHelper; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -73,6 +74,13 @@ public class FactoryPanelConnectionHandler { @Nullable private static String checkForIssues(FactoryPanelBehaviour from, FactoryPanelBehaviour to) { + if (from == null) + return "factory_panel.connection_aborted"; + if (from.targetedBy.containsKey(to.getPanelPosition())) + return "factory_panel.already_connected"; + if (from.targetedBy.size() >= 9) + return "factory_panel.cannot_add_more_inputs"; + BlockState state1 = to.blockEntity.getBlockState(); BlockState state2 = from.blockEntity.getBlockState(); BlockPos diff = to.getPos() @@ -103,6 +111,31 @@ public class FactoryPanelConnectionHandler { return null; } + @Nullable + private static String checkForIssues(FactoryPanelBehaviour from, FactoryPanelSupportBehaviour to) { + if (from == null) + return "factory_panel.connection_aborted"; + + BlockState state1 = from.blockEntity.getBlockState(); + BlockState state2 = to.blockEntity.getBlockState(); + BlockPos diff = to.getPos() + .subtract(from.getPos()); + Direction connectedDirection = FactoryPanelBlock.connectedDirection(state1); + + if (connectedDirection != state2.getOptionalValue(WrenchableDirectionalBlock.FACING) + .orElse(connectedDirection)) + return "factory_panel.same_orientation"; + + if (connectedDirection.getAxis() + .choose(diff.getX(), diff.getY(), diff.getZ()) != 0) + return "factory_panel.same_surface"; + + if (!diff.closerThan(BlockPos.ZERO, 16)) + return "factory_panel.too_far_apart"; + + return null; + } + public static void clientTick() { if (connectingFrom == null || connectingFromBox == null) return; @@ -134,9 +167,22 @@ public class FactoryPanelConnectionHandler { if (mc.hitResult instanceof BlockHitResult bhr && bhr.getType() != Type.MISS) { BlockEntity blockEntity = mc.level.getBlockEntity(bhr.getBlockPos()); + FactoryPanelSupportBehaviour behaviour = + BlockEntityBehaviour.get(mc.level, bhr.getBlockPos(), FactoryPanelSupportBehaviour.TYPE); // Connecting redstone or display links - if (blockEntity instanceof RedstoneLinkBlockEntity || blockEntity instanceof DisplayLinkBlockEntity) { + if (behaviour != null) { + FactoryPanelBehaviour at = FactoryPanelBehaviour.at(mc.level, connectingFrom); + String checkForIssues = checkForIssues(at, behaviour); + if (checkForIssues != null) { + mc.player.displayClientMessage(CreateLang.translate(checkForIssues) + .style(ChatFormatting.RED) + .component(), true); + connectingFrom = null; + connectingFromBox = null; + return true; + } + FactoryPanelPosition bestPosition = null; double bestDistance = Double.POSITIVE_INFINITY; @@ -154,7 +200,10 @@ public class FactoryPanelConnectionHandler { AllPackets.getChannel() .sendToServer(new FactoryPanelConnectionPacket(bestPosition, connectingFrom)); - mc.player.displayClientMessage(CreateLang.translate("factory_panel.link_connected") + mc.player.displayClientMessage(CreateLang + .translate("factory_panel.link_connected", blockEntity.getBlockState() + .getBlock() + .getName()) .style(ChatFormatting.GREEN) .component(), true); diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelRenderer.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelRenderer.java index 6391b05855..b5d6c1f7c8 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelRenderer.java @@ -52,8 +52,9 @@ public class FactoryPanelRenderer extends SmartBlockEntityRenderer inputConfig; @@ -301,6 +302,26 @@ public class FactoryPanelScreen extends AbstractSimiScreen { ms.popPose(); + // REDSTONE LINKS + if (!behaviour.targetedByLinks.isEmpty()) { + ItemStack asStack = AllBlocks.REDSTONE_LINK.asStack(); + int itemX = x + 9; + int itemY = y + windowHeight - 24; + AllGuiTextures.FROGPORT_SLOT.render(graphics, itemX - 1, itemY - 1); + graphics.renderItem(asStack, itemX, itemY); + + if (mouseX >= itemX && mouseX < itemX + 16 && mouseY >= itemY && mouseY < itemY + 16) { + List linkTip = List.of(CreateLang.translate("gui.factory_panel.has_link_connections") + .color(ScrollInput.HEADER_RGB) + .component(), + CreateLang.translate("gui.factory_panel.left_click_disconnect") + .style(ChatFormatting.DARK_GRAY) + .style(ChatFormatting.ITALIC) + .component()); + graphics.renderComponentTooltip(font, linkTip, mouseX, mouseY); + } + } + // PROMISES int state = promiseExpiration.getState(); graphics.drawString(font, CreateLang.text(state == -1 ? " /" : state == 0 ? "30s" : state + "m") @@ -503,6 +524,15 @@ public class FactoryPanelScreen extends AbstractSimiScreen { sendIt(null, true); return true; } + + // remove redstone connections + itemX = x + 9; + itemY = y + windowHeight - 24; + if (mouseX >= itemX && mouseX < itemX + 16 && mouseY >= itemY && mouseY < itemY + 16) { + sendRedstoneReset = true; + sendIt(null, false); + return true; + } return super.mouseClicked(mouseX, mouseY, pButton); } @@ -569,7 +599,7 @@ public class FactoryPanelScreen extends AbstractSimiScreen { String address = addressBox.getValue(); FactoryPanelConfigurationPacket packet = new FactoryPanelConfigurationPacket(pos, address, inputs, - craftingArrangement, outputConfig.count, promiseExp, toRemove, clearPromises, sendReset); + craftingArrangement, outputConfig.count, promiseExp, toRemove, clearPromises, sendReset, sendRedstoneReset); AllPackets.getChannel() .sendToServer(packet); } diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelSupportBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelSupportBehaviour.java index b7c56832f9..8314431745 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelSupportBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelSupportBehaviour.java @@ -1,8 +1,8 @@ package com.simibubi.create.content.logistics.factoryBoard; -import java.util.HashSet; +import java.util.ArrayList; import java.util.Iterator; -import java.util.Set; +import java.util.List; import java.util.function.Supplier; import javax.annotation.Nullable; @@ -19,7 +19,7 @@ public class FactoryPanelSupportBehaviour extends BlockEntityBehaviour { public static final BehaviourType TYPE = new BehaviourType<>(); - private Set linkedPanels; + private List linkedPanels; private boolean changed; private Supplier outputPower; @@ -32,7 +32,7 @@ public class FactoryPanelSupportBehaviour extends BlockEntityBehaviour { this.isOutput = isOutput; this.outputPower = outputPower; this.onNotify = onNotify; - linkedPanels = new HashSet<>(); + linkedPanels = new ArrayList<>(); } public boolean shouldPanelBePowered() { @@ -95,12 +95,15 @@ public class FactoryPanelSupportBehaviour extends BlockEntityBehaviour { return false; } - public Set getLinkedPanels() { + public List getLinkedPanels() { return linkedPanels; } public void connect(FactoryPanelBehaviour panel) { - linkedPanels.add(panel.getPanelPosition()); + FactoryPanelPosition panelPosition = panel.getPanelPosition(); + if (linkedPanels.contains(panelPosition)) + return; + linkedPanels.add(panelPosition); changed = true; } diff --git a/src/main/java/com/simibubi/create/content/redstone/displayLink/DisplayLinkBlockEntity.java b/src/main/java/com/simibubi/create/content/redstone/displayLink/DisplayLinkBlockEntity.java index 11427c0260..dc2912b079 100644 --- a/src/main/java/com/simibubi/create/content/redstone/displayLink/DisplayLinkBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/redstone/displayLink/DisplayLinkBlockEntity.java @@ -7,6 +7,7 @@ import org.jetbrains.annotations.Nullable; import com.simibubi.create.compat.computercraft.AbstractComputerBehaviour; import com.simibubi.create.compat.computercraft.ComputerCraftProxy; +import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelPosition; import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelSupportBehaviour; import com.simibubi.create.content.redstone.displayLink.source.DisplaySource; import com.simibubi.create.content.redstone.displayLink.target.DisplayTarget; @@ -48,6 +49,7 @@ public class DisplayLinkBlockEntity extends LinkWithBulbBlockEntity { public void addBehaviours(List behaviours) { behaviours.add(computerBehaviour = ComputerCraftProxy.behaviour(this)); behaviours.add(factoryPanelSupport = new FactoryPanelSupportBehaviour(this, () -> false, () -> false, () -> { + updateGatheredData(); })); registerAwardables(behaviours, AllAdvancements.DISPLAY_LINK, AllAdvancements.DISPLAY_BOARD); } @@ -184,6 +186,8 @@ public class DisplayLinkBlockEntity extends LinkWithBulbBlockEntity { } public BlockPos getSourcePosition() { + for (FactoryPanelPosition position : factoryPanelSupport.getLinkedPanels()) + return position.pos(); return worldPosition.relative(getDirection()); } diff --git a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/FactoryGaugeDisplaySource.java b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/FactoryGaugeDisplaySource.java new file mode 100644 index 0000000000..ca62f10f32 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/FactoryGaugeDisplaySource.java @@ -0,0 +1,71 @@ +package com.simibubi.create.content.redstone.displayLink.source; + +import java.util.List; +import java.util.Objects; +import java.util.stream.Stream; + +import javax.annotation.Nullable; + +import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBehaviour; +import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelPosition; +import com.simibubi.create.content.redstone.displayLink.DisplayLinkContext; + +import net.createmod.catnip.utility.IntAttached; +import net.createmod.catnip.utility.lang.Components; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; + +public class FactoryGaugeDisplaySource extends ValueListDisplaySource { + + @Override + protected Stream> provideEntries(DisplayLinkContext context, int maxRows) { + List panels = context.blockEntity().factoryPanelSupport.getLinkedPanels(); + if (panels.isEmpty()) + return Stream.empty(); + return panels.stream() + .map(fpp -> createEntry(context.level(), fpp)) +// .sorted(IntAttached.comparator()) + .filter(Objects::nonNull) + .limit(maxRows); + } + + @Nullable + public IntAttached createEntry(Level level, FactoryPanelPosition pos) { + FactoryPanelBehaviour panel = FactoryPanelBehaviour.at(level, pos); + ItemStack filter = panel.getFilter(); + if (filter == null) + return null; + + int demand = panel.getAmount() * (panel.upTo ? 1 : filter.getMaxStackSize()); + String s = " "; + + if (demand != 0) { + int promised = panel.getPromised(); + if (panel.satisfied) + s = "\u2714"; + else if (promised != 0) + s = "\u2191"; + else + s = "\u25aa"; + } + + return IntAttached.with(panel.getLevelInStorage(), Components.literal(s + " ") + .withStyle(style -> style.withColor(panel.getIngredientStatusColor())) + .append(filter.getHoverName() + .plainCopy() + .withStyle(ChatFormatting.RESET))); + } + + @Override + protected String getTranslationKey() { + return "gauge_status"; + } + + @Override + protected boolean valueFirst() { + return true; + } + +} diff --git a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/TimeOfDayDisplaySource.java b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/TimeOfDayDisplaySource.java index 59fac741df..546686dec3 100644 --- a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/TimeOfDayDisplaySource.java +++ b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/TimeOfDayDisplaySource.java @@ -1,6 +1,5 @@ package com.simibubi.create.content.redstone.displayLink.source; -import com.simibubi.create.Create; import com.simibubi.create.content.kinetics.clock.CuckooClockBlockEntity; import com.simibubi.create.content.redstone.displayLink.DisplayLinkContext; import com.simibubi.create.content.redstone.displayLink.target.DisplayTargetStats; @@ -45,8 +44,8 @@ public class TimeOfDayDisplaySource extends SingleLineDisplaySource { } if (!isNatural) { - hours = Create.RANDOM.nextInt(70) + 24; - minutes = Create.RANDOM.nextInt(40) + 60; + hours = sLevel.random.nextInt(70) + 24; + minutes = sLevel.random.nextInt(40) + 60; } MutableComponent component = Components.literal( diff --git a/src/main/resources/assets/create/lang/default/interface.json b/src/main/resources/assets/create/lang/default/interface.json index 1449f65175..0598c9dce6 100644 --- a/src/main/resources/assets/create/lang/default/interface.json +++ b/src/main/resources/assets/create/lang/default/interface.json @@ -1076,6 +1076,8 @@ "create.gui.factory_panel.crafting_input_tip": "Unpackage into connected", "create.gui.factory_panel.crafting_input_tip_1": "mechanical crafters (3x3)", "create.gui.factory_panel.inactive": " Inactive ", + "create.gui.factory_panel.address_missing": "Missing a target address", + "create.gui.factory_panel.has_link_connections": "Gauge has connected links", "create.gui.redstone_requester.allow_partial": "Allow partial orders", "create.gui.redstone_requester.dont_allow_partial": "Must send all items", @@ -1097,14 +1099,17 @@ "create.factory_panel.redstone_paused": "(Redstone Paused)", "create.factory_panel.cycled_arrow_path": "Cycled arrow pathing mode %1$s", "create.factory_panel.tune_before_placing": "Tune to a stock link before placing", - "create.factory_panel.same_orientation": "Panels must have the same orientation", - "create.factory_panel.same_surface": "Panels must be on the same surface", - "create.factory_panel.too_far_apart": "Panels are too far away from each other", - "create.factory_panel.input_in_restock_mode": "Input panel cannot be in restock mode", - "create.factory_panel.no_item": "Input panel must have an item first", + "create.factory_panel.same_orientation": "Blocks must have the same orientation", + "create.factory_panel.same_surface": "Blocks must be on the same surface", + "create.factory_panel.too_far_apart": "Blocks are too far away from each other", + "create.factory_panel.input_in_restock_mode": "Input gauge cannot be in restock mode", + "create.factory_panel.no_item": "Input gauge must have an item first", "create.factory_panel.panels_connected": "Now using %1$s to create %2$s", - "create.factory_panel.click_second_panel": "Click a second panel to connect...", + "create.factory_panel.link_connected": "Gauge connected to %1$s", + "create.factory_panel.click_second_panel": "Click a second gauge to connect...", "create.factory_panel.connection_aborted": "Input connection aborted", + "create.factory_panel.cannot_add_more_inputs": "Cannot add more inputs to this gauge", + "create.factory_panel.already_connected": "Gauges are already connected", "create.display_source.label": "Attached Label", "create.display_source.combine_item_names": "Combine Item Names", @@ -1168,6 +1173,7 @@ "create.display_source.boiler.not_enough_space": "Not enough space ", "create.display_source.boiler.for_boiler_status": "for Boiler Status", "create.display_source.computer_display_source": "From Computer", + "create.display_source.gauge_status": "Factory gauge status", "create.display_target.line": "Line %1$s", "create.display_target.page": "Page %1$s", From 5359d7591e97a7355a60131056d83d8ee7ba112d Mon Sep 17 00:00:00 2001 From: IThundxr Date: Wed, 18 Dec 2024 10:41:48 -0500 Subject: [PATCH 206/515] Transformers Ready to roll - Implement a registry for contraption transforms - Closes Creators-of-Create/Create#4702 --- .../ContraptionTransformableRegistry.java | 49 ++++++++++++++++++ .../contraption}/ITransformableBlock.java | 4 +- .../ITransformableBlockEntity.java | 7 +++ .../SchematicRequirementsRegistry.java | 51 +++++++++---------- .../ITransformableBlockEntity.java | 7 --- .../contraptions/StructureTransform.java | 20 ++++++-- .../chassis/AbstractChassisBlock.java | 2 +- .../copycat/CopycatBlockEntity.java | 2 +- .../fluids/pipes/EncasedPipeBlock.java | 2 +- .../content/fluids/pipes/FluidPipeBlock.java | 2 +- .../fluids/pipes/FluidPipeBlockEntity.java | 2 +- .../base/DirectionalAxisKineticBlock.java | 2 +- .../content/kinetics/belt/BeltBlock.java | 2 +- .../kinetics/chainDrive/ChainDriveBlock.java | 2 +- .../mechanicalArm/ArmBlockEntity.java | 2 +- .../BracketedKineticBlockEntity.java | 2 +- .../encased/EncasedCogwheelBlock.java | 2 +- .../sequencer/SequencedGearshiftBlock.java | 2 +- .../redstone/DirectedDirectionalBlock.java | 2 +- .../requirement/ItemRequirement.java | 2 +- .../observer/TrackObserverBlockEntity.java | 2 +- .../trains/signal/SignalBlockEntity.java | 2 +- .../trains/station/StationBlockEntity.java | 2 +- .../trains/track/TrackBlockEntity.java | 2 +- .../ContraptionTransformableRegistryImpl.java | 33 ++++++++++++ 25 files changed, 152 insertions(+), 55 deletions(-) create mode 100644 src/main/java/com/simibubi/create/api/contraption/ContraptionTransformableRegistry.java rename src/main/java/com/simibubi/create/{content/contraptions => api/contraption}/ITransformableBlock.java (60%) create mode 100644 src/main/java/com/simibubi/create/api/contraption/ITransformableBlockEntity.java delete mode 100644 src/main/java/com/simibubi/create/content/contraptions/ITransformableBlockEntity.java create mode 100644 src/main/java/com/simibubi/create/impl/contraption/ContraptionTransformableRegistryImpl.java diff --git a/src/main/java/com/simibubi/create/api/contraption/ContraptionTransformableRegistry.java b/src/main/java/com/simibubi/create/api/contraption/ContraptionTransformableRegistry.java new file mode 100644 index 0000000000..8a4d97ff64 --- /dev/null +++ b/src/main/java/com/simibubi/create/api/contraption/ContraptionTransformableRegistry.java @@ -0,0 +1,49 @@ +package com.simibubi.create.api.contraption; + +import com.simibubi.create.content.contraptions.StructureTransform; +import com.simibubi.create.impl.contraption.ContraptionTransformableRegistryImpl; + +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; + +/** + * Registry for registering new contraption transformations + * to properly place blocks when disassembled after being part of a contraption + */ +public class ContraptionTransformableRegistry { + /** + * Register a new transform for a provided block + * + * @param block The block you want to register a new {@link TransformableBlock} for + * @param transformableBlock The transform that should be applied whenever this block is being placed from + * contraption disassembly + */ + public static void registerForBlock(Block block, TransformableBlock transformableBlock) { + ContraptionTransformableRegistryImpl.registerForBlock(block, transformableBlock); + } + + /** + * Register a new transform for a provided block entity type + * + * @param blockEntityType The blockEntityType you want to register a new {@link TransformableBlockEntity} for + * @param transformableBlockEntity The transform that should be applied whenever this block entity type is + * being placed from contraption disassembly + */ + public static void registerForBlockEntity(BlockEntityType blockEntityType, TransformableBlockEntity transformableBlockEntity) { + ContraptionTransformableRegistryImpl.registerForBlockEntity(blockEntityType, transformableBlockEntity); + } + + // --- Interfaces that provide the context that would be accessible if you implemented the ITransformable* interfaces --- + + @FunctionalInterface + public interface TransformableBlock { + BlockState transform(Block block, BlockState state, StructureTransform transform); + } + + @FunctionalInterface + public interface TransformableBlockEntity { + void transform(BlockEntity blockEntity, StructureTransform transform); + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/ITransformableBlock.java b/src/main/java/com/simibubi/create/api/contraption/ITransformableBlock.java similarity index 60% rename from src/main/java/com/simibubi/create/content/contraptions/ITransformableBlock.java rename to src/main/java/com/simibubi/create/api/contraption/ITransformableBlock.java index 61c4cb0aa7..6aefd0ab80 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/ITransformableBlock.java +++ b/src/main/java/com/simibubi/create/api/contraption/ITransformableBlock.java @@ -1,4 +1,6 @@ -package com.simibubi.create.content.contraptions; +package com.simibubi.create.api.contraption; + +import com.simibubi.create.content.contraptions.StructureTransform; import net.minecraft.world.level.block.state.BlockState; diff --git a/src/main/java/com/simibubi/create/api/contraption/ITransformableBlockEntity.java b/src/main/java/com/simibubi/create/api/contraption/ITransformableBlockEntity.java new file mode 100644 index 0000000000..e130f10b11 --- /dev/null +++ b/src/main/java/com/simibubi/create/api/contraption/ITransformableBlockEntity.java @@ -0,0 +1,7 @@ +package com.simibubi.create.api.contraption; + +import com.simibubi.create.content.contraptions.StructureTransform; + +public interface ITransformableBlockEntity { + void transform(StructureTransform transform); +} diff --git a/src/main/java/com/simibubi/create/api/schematic/requirement/SchematicRequirementsRegistry.java b/src/main/java/com/simibubi/create/api/schematic/requirement/SchematicRequirementsRegistry.java index 1b7174df03..c00cdb713d 100644 --- a/src/main/java/com/simibubi/create/api/schematic/requirement/SchematicRequirementsRegistry.java +++ b/src/main/java/com/simibubi/create/api/schematic/requirement/SchematicRequirementsRegistry.java @@ -1,7 +1,6 @@ package com.simibubi.create.api.schematic.requirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement; - import com.simibubi.create.impl.schematic.requirement.SchematicRequirementsRegistryImpl; import net.minecraft.resources.ResourceLocation; @@ -21,11 +20,11 @@ public class SchematicRequirementsRegistry { /** * Register a new special requirement for a specified block * - * @param block The block you want to register a {@link BlockRequirement} for + * @param block The block you want to register a {@link BlockRequirement} for * @param requirement The requirement you would like to add to this block, - * the {@link BlockRequirement#getRequiredItems(BlockState, BlockEntity)} - * method will be called on the {@link BlockRequirement} you have provided, - * and you will be able to insert requirements based off the context that is given + * the {@link BlockRequirement#getRequiredItems(BlockState, BlockEntity)} + * method will be called on the {@link BlockRequirement} you have provided, + * and you will be able to insert requirements based off the context that is given */ public static void registerForBlock(Block block, BlockRequirement requirement) { SchematicRequirementsRegistryImpl.registerForBlock(block, requirement); @@ -34,11 +33,11 @@ public class SchematicRequirementsRegistry { /** * Register a new special requirement for a specified block * - * @param block The id of the block you want to register a {@link BlockRequirement} for + * @param block The id of the block you want to register a {@link BlockRequirement} for * @param requirement The requirement you would like to add to this block, - * the {@link BlockRequirement#getRequiredItems(BlockState, BlockEntity)} - * method will be called on the {@link BlockRequirement} you have provided, - * and you will be able to insert requirements based off the context that is given + * the {@link BlockRequirement#getRequiredItems(Block, BlockState, BlockEntity)} + * method will be called on the {@link BlockRequirement} you have provided, + * and you will be able to insert requirements based off the context that is given */ public static void registerForBlock(ResourceLocation block, BlockRequirement requirement) { SchematicRequirementsRegistryImpl.registerForBlock(block, requirement); @@ -48,10 +47,10 @@ public class SchematicRequirementsRegistry { * Register a new special requirement for a specified block entity type * * @param blockEntityType The blockEntityType you want to register a {@link BlockEntityRequirement} for - * @param requirement The requirement you would like to add to this block entity type, - * the {@link BlockEntityRequirement#getRequiredItems(BlockEntity, BlockState)} - * method will be called on the {@link BlockEntityRequirement} you have provided, - * and you will be able to insert requirements based off the context that is given + * @param requirement The requirement you would like to add to this block entity type, + * the {@link BlockEntityRequirement#getRequiredItems(BlockEntity, BlockState)} + * method will be called on the {@link BlockEntityRequirement} you have provided, + * and you will be able to insert requirements based off the context that is given */ public static void registerForBlockEntity(BlockEntityType blockEntityType, BlockEntityRequirement requirement) { SchematicRequirementsRegistryImpl.registerForBlockEntity(blockEntityType, requirement); @@ -61,10 +60,10 @@ public class SchematicRequirementsRegistry { * Register a new special requirement for a specified block entity type * * @param blockEntityType The id of the blockEntityType you want to register a {@link BlockEntityRequirement} for - * @param requirement The requirement you would like to add to this block entity type, - * the {@link BlockEntityRequirement#getRequiredItems(BlockEntity, BlockState)} - * method will be called on the {@link BlockEntityRequirement} you have provided, - * and you will be able to insert requirements based off the context that is given + * @param requirement The requirement you would like to add to this block entity type, + * the {@link BlockEntityRequirement#getRequiredItems(BlockEntity, BlockState)} + * method will be called on the {@link BlockEntityRequirement} you have provided, + * and you will be able to insert requirements based off the context that is given */ public static void registerForBlockEntity(ResourceLocation blockEntityType, BlockEntityRequirement requirement) { SchematicRequirementsRegistryImpl.registerForBlockEntity(blockEntityType, requirement); @@ -73,11 +72,11 @@ public class SchematicRequirementsRegistry { /** * Register a new special requirement for a specified entity type * - * @param entityType The entityType you want to register a {@link EntityRequirement} for + * @param entityType The entityType you want to register a {@link EntityRequirement} for * @param requirement The requirement you would like to add to this entity type, - * the {@link EntityRequirement#getRequiredItems(Entity)} - * method will be called on the {@link EntityRequirement} you have provided, - * and you will be able to insert requirements based off the context that is given + * the {@link EntityRequirement#getRequiredItems(Entity)} + * method will be called on the {@link EntityRequirement} you have provided, + * and you will be able to insert requirements based off the context that is given */ public static void registerForEntity(EntityType entityType, EntityRequirement requirement) { SchematicRequirementsRegistryImpl.registerForEntity(entityType, requirement); @@ -86,11 +85,11 @@ public class SchematicRequirementsRegistry { /** * Register a new special requirement for a specified entity type * - * @param entityType The id of the entityType you want to register a {@link EntityRequirement} for + * @param entityType The id of the entityType you want to register a {@link EntityRequirement} for * @param requirement The requirement you would like to add to this entity type, - * the {@link EntityRequirement#getRequiredItems(Entity)} - * method will be called on the {@link EntityRequirement} you have provided, - * and you will be able to insert requirements based off the context that is given + * the {@link EntityRequirement#getRequiredItems(Entity)} + * method will be called on the {@link EntityRequirement} you have provided, + * and you will be able to insert requirements based off the context that is given */ public static void registerForEntity(ResourceLocation entityType, EntityRequirement requirement) { SchematicRequirementsRegistryImpl.registerForEntity(entityType, requirement); @@ -100,7 +99,7 @@ public class SchematicRequirementsRegistry { @FunctionalInterface public interface BlockRequirement { - ItemRequirement getRequiredItems(BlockState state, @Nullable BlockEntity blockEntity); + ItemRequirement getRequiredItems(Block block, BlockState state, @Nullable BlockEntity blockEntity); } @FunctionalInterface diff --git a/src/main/java/com/simibubi/create/content/contraptions/ITransformableBlockEntity.java b/src/main/java/com/simibubi/create/content/contraptions/ITransformableBlockEntity.java deleted file mode 100644 index cadd35946a..0000000000 --- a/src/main/java/com/simibubi/create/content/contraptions/ITransformableBlockEntity.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.simibubi.create.content.contraptions; - -public interface ITransformableBlockEntity { - - void transform(StructureTransform transform); - -} diff --git a/src/main/java/com/simibubi/create/content/contraptions/StructureTransform.java b/src/main/java/com/simibubi/create/content/contraptions/StructureTransform.java index 31ea4946bd..50f6104fac 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/StructureTransform.java +++ b/src/main/java/com/simibubi/create/content/contraptions/StructureTransform.java @@ -4,6 +4,12 @@ import static net.minecraft.world.level.block.state.properties.BlockStatePropert import static net.minecraft.world.level.block.state.properties.BlockStateProperties.FACING; import static net.minecraft.world.level.block.state.properties.BlockStateProperties.HORIZONTAL_FACING; +import com.simibubi.create.api.contraption.ContraptionTransformableRegistry; +import com.simibubi.create.api.contraption.ITransformableBlock; +import com.simibubi.create.api.contraption.ITransformableBlockEntity; + +import com.simibubi.create.impl.contraption.ContraptionTransformableRegistryImpl; + import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -128,8 +134,12 @@ public class StructureTransform { } public void apply(BlockEntity be) { - if (be instanceof ITransformableBlockEntity) - ((ITransformableBlockEntity) be).transform(this); + ContraptionTransformableRegistry.TransformableBlockEntity transformableBlockEntity = ContraptionTransformableRegistryImpl.get(be.getType()); + if (transformableBlockEntity != null) { + transformableBlockEntity.transform(be, this); + } else if (be instanceof ITransformableBlockEntity itbe) { + itbe.transform(this); + } } /** @@ -139,8 +149,12 @@ public class StructureTransform { */ public BlockState apply(BlockState state) { Block block = state.getBlock(); - if (block instanceof ITransformableBlock transformable) + ContraptionTransformableRegistry.TransformableBlock transformableBlock = ContraptionTransformableRegistryImpl.get(block); + if (transformableBlock != null) { + return transformableBlock.transform(block, state, this); + } else if (block instanceof ITransformableBlock transformable) { return transformable.transform(state, this); + } if (mirror != null) state = state.mirror(mirror); diff --git a/src/main/java/com/simibubi/create/content/contraptions/chassis/AbstractChassisBlock.java b/src/main/java/com/simibubi/create/content/contraptions/chassis/AbstractChassisBlock.java index d68bb7ded3..eee3278b0a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/chassis/AbstractChassisBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/chassis/AbstractChassisBlock.java @@ -3,7 +3,7 @@ package com.simibubi.create.content.contraptions.chassis; import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllItems; import com.simibubi.create.AllSoundEvents; -import com.simibubi.create.content.contraptions.ITransformableBlock; +import com.simibubi.create.api.contraption.ITransformableBlock; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.equipment.wrench.IWrenchable; import com.simibubi.create.foundation.block.IBE; diff --git a/src/main/java/com/simibubi/create/content/decoration/copycat/CopycatBlockEntity.java b/src/main/java/com/simibubi/create/content/decoration/copycat/CopycatBlockEntity.java index 4db512b1a1..9dcc53a88c 100644 --- a/src/main/java/com/simibubi/create/content/decoration/copycat/CopycatBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/decoration/copycat/CopycatBlockEntity.java @@ -1,7 +1,7 @@ package com.simibubi.create.content.decoration.copycat; import com.simibubi.create.AllBlocks; -import com.simibubi.create.content.contraptions.ITransformableBlockEntity; +import com.simibubi.create.api.contraption.ITransformableBlockEntity; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.redstone.RoseQuartzLampBlock; import com.simibubi.create.api.schematic.requirement.ISpecialBlockEntityItemRequirement; diff --git a/src/main/java/com/simibubi/create/content/fluids/pipes/EncasedPipeBlock.java b/src/main/java/com/simibubi/create/content/fluids/pipes/EncasedPipeBlock.java index 398bbeb5d8..c6b0e3e763 100644 --- a/src/main/java/com/simibubi/create/content/fluids/pipes/EncasedPipeBlock.java +++ b/src/main/java/com/simibubi/create/content/fluids/pipes/EncasedPipeBlock.java @@ -12,7 +12,7 @@ import java.util.function.Supplier; import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllBlocks; -import com.simibubi.create.content.contraptions.ITransformableBlock; +import com.simibubi.create.api.contraption.ITransformableBlock; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.decoration.encasing.EncasedBlock; import com.simibubi.create.content.equipment.wrench.IWrenchable; diff --git a/src/main/java/com/simibubi/create/content/fluids/pipes/FluidPipeBlock.java b/src/main/java/com/simibubi/create/content/fluids/pipes/FluidPipeBlock.java index 976825ccc0..1a6fb055f5 100644 --- a/src/main/java/com/simibubi/create/content/fluids/pipes/FluidPipeBlock.java +++ b/src/main/java/com/simibubi/create/content/fluids/pipes/FluidPipeBlock.java @@ -7,7 +7,7 @@ import javax.annotation.Nullable; import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllBlocks; -import com.simibubi.create.content.contraptions.ITransformableBlock; +import com.simibubi.create.api.contraption.ITransformableBlock; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.decoration.bracket.BracketedBlockEntityBehaviour; import com.simibubi.create.content.decoration.encasing.EncasableBlock; diff --git a/src/main/java/com/simibubi/create/content/fluids/pipes/FluidPipeBlockEntity.java b/src/main/java/com/simibubi/create/content/fluids/pipes/FluidPipeBlockEntity.java index a7021c604b..d421d42a00 100644 --- a/src/main/java/com/simibubi/create/content/fluids/pipes/FluidPipeBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/fluids/pipes/FluidPipeBlockEntity.java @@ -3,7 +3,7 @@ package com.simibubi.create.content.fluids.pipes; import java.util.List; import com.simibubi.create.AllBlocks; -import com.simibubi.create.content.contraptions.ITransformableBlockEntity; +import com.simibubi.create.api.contraption.ITransformableBlockEntity; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.decoration.bracket.BracketedBlockEntityBehaviour; import com.simibubi.create.content.fluids.FluidPropagator; diff --git a/src/main/java/com/simibubi/create/content/kinetics/base/DirectionalAxisKineticBlock.java b/src/main/java/com/simibubi/create/content/kinetics/base/DirectionalAxisKineticBlock.java index bfcf0548fb..9494cb3288 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/base/DirectionalAxisKineticBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/base/DirectionalAxisKineticBlock.java @@ -1,6 +1,6 @@ package com.simibubi.create.content.kinetics.base; -import com.simibubi.create.content.contraptions.ITransformableBlock; +import com.simibubi.create.api.contraption.ITransformableBlock; import com.simibubi.create.content.contraptions.StructureTransform; import net.createmod.catnip.utility.Iterate; diff --git a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltBlock.java b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltBlock.java index 9f496cdd51..18fd91fe08 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltBlock.java @@ -13,7 +13,7 @@ import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.Create; -import com.simibubi.create.content.contraptions.ITransformableBlock; +import com.simibubi.create.api.contraption.ITransformableBlock; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.equipment.armor.DivingBootsItem; import com.simibubi.create.content.fluids.transfer.GenericItemEmptying; diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainDrive/ChainDriveBlock.java b/src/main/java/com/simibubi/create/content/kinetics/chainDrive/ChainDriveBlock.java index e97724456f..caeb94102b 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainDrive/ChainDriveBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainDrive/ChainDriveBlock.java @@ -1,7 +1,7 @@ package com.simibubi.create.content.kinetics.chainDrive; import com.simibubi.create.AllBlockEntityTypes; -import com.simibubi.create.content.contraptions.ITransformableBlock; +import com.simibubi.create.api.contraption.ITransformableBlock; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.kinetics.base.DirectionalAxisKineticBlock; import com.simibubi.create.content.kinetics.base.KineticBlockEntity; diff --git a/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmBlockEntity.java index f988c67b11..0612fdf56d 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmBlockEntity.java @@ -6,7 +6,7 @@ import java.util.List; import javax.annotation.Nullable; import com.simibubi.create.Create; -import com.simibubi.create.content.contraptions.ITransformableBlockEntity; +import com.simibubi.create.api.contraption.ITransformableBlockEntity; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.kinetics.base.KineticBlockEntity; import com.simibubi.create.content.kinetics.mechanicalArm.AllArmInteractionPointTypes.JukeboxPoint; diff --git a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/BracketedKineticBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/BracketedKineticBlockEntity.java index ad1191d6d6..31d285dfaa 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/BracketedKineticBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/BracketedKineticBlockEntity.java @@ -2,7 +2,7 @@ package com.simibubi.create.content.kinetics.simpleRelays; import java.util.List; -import com.simibubi.create.content.contraptions.ITransformableBlockEntity; +import com.simibubi.create.api.contraption.ITransformableBlockEntity; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.decoration.bracket.BracketedBlockEntityBehaviour; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; diff --git a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogwheelBlock.java b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogwheelBlock.java index d5b736c6aa..e08d76a1dc 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogwheelBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogwheelBlock.java @@ -4,7 +4,7 @@ import java.util.function.Supplier; import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllBlocks; -import com.simibubi.create.content.contraptions.ITransformableBlock; +import com.simibubi.create.api.contraption.ITransformableBlock; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.decoration.encasing.EncasedBlock; import com.simibubi.create.content.equipment.wrench.IWrenchable; diff --git a/src/main/java/com/simibubi/create/content/kinetics/transmission/sequencer/SequencedGearshiftBlock.java b/src/main/java/com/simibubi/create/content/kinetics/transmission/sequencer/SequencedGearshiftBlock.java index 753b6aa1d8..988e7ac285 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/transmission/sequencer/SequencedGearshiftBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/transmission/sequencer/SequencedGearshiftBlock.java @@ -2,7 +2,7 @@ package com.simibubi.create.content.kinetics.transmission.sequencer; import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllItems; -import com.simibubi.create.content.contraptions.ITransformableBlock; +import com.simibubi.create.api.contraption.ITransformableBlock; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.kinetics.base.HorizontalAxisKineticBlock; import com.simibubi.create.content.kinetics.base.KineticBlock; diff --git a/src/main/java/com/simibubi/create/content/redstone/DirectedDirectionalBlock.java b/src/main/java/com/simibubi/create/content/redstone/DirectedDirectionalBlock.java index 50c77a6981..9e9ffab215 100644 --- a/src/main/java/com/simibubi/create/content/redstone/DirectedDirectionalBlock.java +++ b/src/main/java/com/simibubi/create/content/redstone/DirectedDirectionalBlock.java @@ -2,7 +2,7 @@ package com.simibubi.create.content.redstone; import javax.annotation.Nullable; -import com.simibubi.create.content.contraptions.ITransformableBlock; +import com.simibubi.create.api.contraption.ITransformableBlock; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.equipment.wrench.IWrenchable; diff --git a/src/main/java/com/simibubi/create/content/schematics/requirement/ItemRequirement.java b/src/main/java/com/simibubi/create/content/schematics/requirement/ItemRequirement.java index be145e15d3..32eeaa6e29 100644 --- a/src/main/java/com/simibubi/create/content/schematics/requirement/ItemRequirement.java +++ b/src/main/java/com/simibubi/create/content/schematics/requirement/ItemRequirement.java @@ -75,7 +75,7 @@ public class ItemRequirement { ItemRequirement requirement; SchematicRequirementsRegistry.BlockRequirement blockItemRequirement = SchematicRequirementsRegistryImpl.getRequirementForBlock(block); if (blockItemRequirement != null) { - requirement = blockItemRequirement.getRequiredItems(state, be); + requirement = blockItemRequirement.getRequiredItems(block, state, be); } else if (block instanceof ISpecialBlockItemRequirement specialBlock) { requirement = specialBlock.getRequiredItems(state, be); } else { diff --git a/src/main/java/com/simibubi/create/content/trains/observer/TrackObserverBlockEntity.java b/src/main/java/com/simibubi/create/content/trains/observer/TrackObserverBlockEntity.java index e17e36f293..90cc8d9d5e 100644 --- a/src/main/java/com/simibubi/create/content/trains/observer/TrackObserverBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/trains/observer/TrackObserverBlockEntity.java @@ -5,7 +5,7 @@ import java.util.List; import javax.annotation.Nullable; import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.content.contraptions.ITransformableBlockEntity; +import com.simibubi.create.api.contraption.ITransformableBlockEntity; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.redstone.displayLink.DisplayLinkBlock; import com.simibubi.create.content.trains.graph.EdgePointType; diff --git a/src/main/java/com/simibubi/create/content/trains/signal/SignalBlockEntity.java b/src/main/java/com/simibubi/create/content/trains/signal/SignalBlockEntity.java index b1a3d3411b..fb96e1b190 100644 --- a/src/main/java/com/simibubi/create/content/trains/signal/SignalBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/trains/signal/SignalBlockEntity.java @@ -4,7 +4,7 @@ import java.util.List; import javax.annotation.Nullable; -import com.simibubi.create.content.contraptions.ITransformableBlockEntity; +import com.simibubi.create.api.contraption.ITransformableBlockEntity; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.trains.graph.EdgePointType; import com.simibubi.create.content.trains.signal.SignalBlock.SignalType; diff --git a/src/main/java/com/simibubi/create/content/trains/station/StationBlockEntity.java b/src/main/java/com/simibubi/create/content/trains/station/StationBlockEntity.java index 24981d3c6f..7f4f2a8a05 100644 --- a/src/main/java/com/simibubi/create/content/trains/station/StationBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/trains/station/StationBlockEntity.java @@ -24,7 +24,7 @@ import com.simibubi.create.Create; import com.simibubi.create.compat.computercraft.AbstractComputerBehaviour; import com.simibubi.create.compat.computercraft.ComputerCraftProxy; import com.simibubi.create.content.contraptions.AssemblyException; -import com.simibubi.create.content.contraptions.ITransformableBlockEntity; +import com.simibubi.create.api.contraption.ITransformableBlockEntity; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.decoration.slidingDoor.DoorControlBehaviour; import com.simibubi.create.content.equipment.wrench.IWrenchable; diff --git a/src/main/java/com/simibubi/create/content/trains/track/TrackBlockEntity.java b/src/main/java/com/simibubi/create/content/trains/track/TrackBlockEntity.java index 97c5fa1922..5207de5232 100644 --- a/src/main/java/com/simibubi/create/content/trains/track/TrackBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/trains/track/TrackBlockEntity.java @@ -11,7 +11,7 @@ import java.util.Set; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllPackets; import com.simibubi.create.AllTags; -import com.simibubi.create.content.contraptions.ITransformableBlockEntity; +import com.simibubi.create.api.contraption.ITransformableBlockEntity; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.trains.graph.TrackNodeLocation; import com.simibubi.create.foundation.block.ProperWaterloggedBlock; diff --git a/src/main/java/com/simibubi/create/impl/contraption/ContraptionTransformableRegistryImpl.java b/src/main/java/com/simibubi/create/impl/contraption/ContraptionTransformableRegistryImpl.java new file mode 100644 index 0000000000..485aeb4c5e --- /dev/null +++ b/src/main/java/com/simibubi/create/impl/contraption/ContraptionTransformableRegistryImpl.java @@ -0,0 +1,33 @@ +package com.simibubi.create.impl.contraption; + +import org.jetbrains.annotations.ApiStatus; + +import com.simibubi.create.api.contraption.ContraptionTransformableRegistry.TransformableBlock; +import com.simibubi.create.api.contraption.ContraptionTransformableRegistry.TransformableBlockEntity; +import com.simibubi.create.foundation.utility.AttachedRegistry; + +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraftforge.registries.ForgeRegistries; + +@ApiStatus.Internal +public class ContraptionTransformableRegistryImpl { + private static final AttachedRegistry TRANSFORMABLE_BLOCKS = new AttachedRegistry<>(ForgeRegistries.BLOCKS); + private static final AttachedRegistry, TransformableBlockEntity> TRANSFORMABLE_BLOCK_ENTITIES = new AttachedRegistry<>(ForgeRegistries.BLOCK_ENTITY_TYPES); + + public static void registerForBlock(Block block, TransformableBlock transformableBlock) { + TRANSFORMABLE_BLOCKS.register(block, transformableBlock); + } + + public static void registerForBlockEntity(BlockEntityType blockEntityType, TransformableBlockEntity transformableBlockEntity) { + TRANSFORMABLE_BLOCK_ENTITIES.register(blockEntityType, transformableBlockEntity); + } + + public static TransformableBlock get(Block block) { + return TRANSFORMABLE_BLOCKS.get(block); + } + + public static TransformableBlockEntity get(BlockEntityType blockEntityType) { + return TRANSFORMABLE_BLOCK_ENTITIES.get(blockEntityType); + } +} From 5183d1029ac91a159d5af01d2c298d0bf00f8df2 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Thu, 19 Dec 2024 10:01:22 -0500 Subject: [PATCH 207/515] Misleading documents - Fix bad javadoc caused by cherry-picking conflicts - Format files in api/ and impl/ --- .../api/connectivity/ConnectivityHandler.java | 58 ++++++++++--------- .../create/api/data/TrainHatInfoProvider.java | 12 ++-- .../api/event/BlockEntityBehaviourEvent.java | 4 +- .../create/api/event/PipeCollisionEvent.java | 5 +- .../api/event/TrackGraphMergeEvent.java | 11 ++-- .../api/schematic/nbt/IPartialSafeNBT.java | 7 +-- .../nbt/SchematicSafeNBTRegistry.java | 12 ++-- .../ISpecialBlockItemRequirement.java | 1 + .../SchematicRequirementsRegistry.java | 6 +- .../nbt/SchematicSafeNBTRegistryImpl.java | 4 +- .../SchematicRequirementsRegistryImpl.java | 6 +- 11 files changed, 65 insertions(+), 61 deletions(-) diff --git a/src/main/java/com/simibubi/create/api/connectivity/ConnectivityHandler.java b/src/main/java/com/simibubi/create/api/connectivity/ConnectivityHandler.java index 23eb9d9394..c844b1bda1 100644 --- a/src/main/java/com/simibubi/create/api/connectivity/ConnectivityHandler.java +++ b/src/main/java/com/simibubi/create/api/connectivity/ConnectivityHandler.java @@ -1,7 +1,21 @@ package com.simibubi.create.api.connectivity; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.PriorityQueue; +import java.util.Set; + +import javax.annotation.Nullable; + +import org.apache.commons.lang3.tuple.Pair; + import com.simibubi.create.content.fluids.tank.CreativeFluidTankBlockEntity; import com.simibubi.create.foundation.blockEntity.IMultiBlockEntityContainer; + import net.createmod.catnip.utility.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -13,17 +27,6 @@ import net.minecraftforge.common.capabilities.ForgeCapabilities; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.IFluidTank; import net.minecraftforge.fluids.capability.IFluidHandler; -import org.apache.commons.lang3.tuple.Pair; - -import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.PriorityQueue; -import java.util.Set; public class ConnectivityHandler { @@ -35,7 +38,7 @@ public class ConnectivityHandler { } private static void formMulti(BlockEntityType type, - BlockGetter level, SearchCache cache, List frontier) { + BlockGetter level, SearchCache cache, List frontier) { PriorityQueue> creationQueue = makeCreationQueue(); Set visited = new HashSet<>(); Direction.Axis mainAxis = frontier.get(0) @@ -107,7 +110,7 @@ public class ConnectivityHandler { } private static int tryToFormNewMulti(T be, SearchCache cache, - boolean simulate) { + boolean simulate) { int bestWidth = 1; int bestAmount = -1; if (!be.isController()) @@ -142,7 +145,7 @@ public class ConnectivityHandler { } private static int tryToFormNewMultiOfWidth(T be, int width, - SearchCache cache, boolean simulate) { + SearchCache cache, boolean simulate) { int amount = 0; int height = 0; BlockEntityType type = be.getType(); @@ -160,13 +163,14 @@ public class ConnectivityHandler { } Direction.Axis axis = be.getMainConnectionAxis(); - Search: for (int yOffset = 0; yOffset < be.getMaxLength(axis, width); yOffset++) { + Search: + for (int yOffset = 0; yOffset < be.getMaxLength(axis, width); yOffset++) { for (int xOffset = 0; xOffset < width; xOffset++) { for (int zOffset = 0; zOffset < width; zOffset++) { BlockPos pos = switch (axis) { - case X -> origin.offset(yOffset, xOffset, zOffset); - case Y -> origin.offset(xOffset, yOffset, zOffset); - case Z -> origin.offset(xOffset, zOffset, yOffset); + case X -> origin.offset(yOffset, xOffset, zOffset); + case Y -> origin.offset(xOffset, yOffset, zOffset); + case Z -> origin.offset(xOffset, zOffset, yOffset); }; Optional part = cache.getOrCache(type, level, pos); if (part.isEmpty()) @@ -229,9 +233,9 @@ public class ConnectivityHandler { for (int xOffset = 0; xOffset < width; xOffset++) { for (int zOffset = 0; zOffset < width; zOffset++) { BlockPos pos = switch (axis) { - case X -> origin.offset(yOffset, xOffset, zOffset); - case Y -> origin.offset(xOffset, yOffset, zOffset); - case Z -> origin.offset(xOffset, zOffset, yOffset); + case X -> origin.offset(yOffset, xOffset, zOffset); + case Y -> origin.offset(xOffset, yOffset, zOffset); + case Z -> origin.offset(xOffset, zOffset, yOffset); }; T part = partAt(type, level, pos); if (part == null) @@ -280,7 +284,7 @@ public class ConnectivityHandler { // tryReconnect helps whenever only a few tanks have been removed private static void splitMultiAndInvalidate(T be, - @Nullable SearchCache cache, boolean tryReconnect) { + @Nullable SearchCache cache, boolean tryReconnect) { Level level = be.getLevel(); if (level == null) return; @@ -314,9 +318,9 @@ public class ConnectivityHandler { for (int zOffset = 0; zOffset < width; zOffset++) { BlockPos pos = switch (axis) { - case X -> origin.offset(yOffset, xOffset, zOffset); - case Y -> origin.offset(xOffset, yOffset, zOffset); - case Z -> origin.offset(xOffset, zOffset, yOffset); + case X -> origin.offset(yOffset, xOffset, zOffset); + case Y -> origin.offset(xOffset, yOffset, zOffset); + case Z -> origin.offset(xOffset, zOffset, yOffset); }; T partAt = partAt(be.getType(), level, pos); @@ -373,7 +377,7 @@ public class ConnectivityHandler { @Nullable public static T partAt(BlockEntityType type, BlockGetter level, - BlockPos pos) { + BlockPos pos) { BlockEntity be = level.getBlockEntity(pos); if (be != null && be.getType() == type && !be.isRemoved()) return checked(be); @@ -381,7 +385,7 @@ public class ConnectivityHandler { } public static boolean isConnected(BlockGetter level, BlockPos pos, - BlockPos other) { + BlockPos other) { T one = checked(level.getBlockEntity(pos)); T two = checked(level.getBlockEntity(other)); if (one == null || two == null) diff --git a/src/main/java/com/simibubi/create/api/data/TrainHatInfoProvider.java b/src/main/java/com/simibubi/create/api/data/TrainHatInfoProvider.java index 8004d1e2bb..0ed91ec8d1 100644 --- a/src/main/java/com/simibubi/create/api/data/TrainHatInfoProvider.java +++ b/src/main/java/com/simibubi/create/api/data/TrainHatInfoProvider.java @@ -18,8 +18,8 @@ import net.minecraft.world.phys.Vec3; import net.minecraftforge.registries.ForgeRegistries; public abstract class TrainHatInfoProvider implements DataProvider { - private final PackOutput.PathProvider path; protected final Map trainHatOffsets = new HashMap<>(); + private final PackOutput.PathProvider path; public TrainHatInfoProvider(PackOutput output) { this.path = output.createPathProvider(PackOutput.Target.RESOURCE_PACK, TrainHatInfoReloadListener.HAT_INFO_DIRECTORY); @@ -52,11 +52,11 @@ public abstract class TrainHatInfoProvider implements DataProvider { this.trainHatOffsets.clear(); this.createOffsets(); return CompletableFuture.allOf( - this.trainHatOffsets.entrySet().stream().map(entry -> - DataProvider.saveStable(output, - TrainHatInfo.CODEC.encodeStart(JsonOps.INSTANCE, entry.getValue()).resultOrPartial(Create.LOGGER::error).orElseThrow(), - this.path.json(entry.getKey())) - ).toArray(CompletableFuture[]::new)); + this.trainHatOffsets.entrySet().stream().map(entry -> + DataProvider.saveStable(output, + TrainHatInfo.CODEC.encodeStart(JsonOps.INSTANCE, entry.getValue()).resultOrPartial(Create.LOGGER::error).orElseThrow(), + this.path.json(entry.getKey())) + ).toArray(CompletableFuture[]::new)); } @Override diff --git a/src/main/java/com/simibubi/create/api/event/BlockEntityBehaviourEvent.java b/src/main/java/com/simibubi/create/api/event/BlockEntityBehaviourEvent.java index 398783d74a..b0154691eb 100644 --- a/src/main/java/com/simibubi/create/api/event/BlockEntityBehaviourEvent.java +++ b/src/main/java/com/simibubi/create/api/event/BlockEntityBehaviourEvent.java @@ -26,8 +26,8 @@ import net.minecraftforge.eventbus.api.GenericEvent; */ public class BlockEntityBehaviourEvent extends GenericEvent { - private T smartBlockEntity; - private Map, BlockEntityBehaviour> behaviours; + private final T smartBlockEntity; + private final Map, BlockEntityBehaviour> behaviours; public BlockEntityBehaviourEvent(T blockEntity, Map, BlockEntityBehaviour> behaviours) { smartBlockEntity = blockEntity; diff --git a/src/main/java/com/simibubi/create/api/event/PipeCollisionEvent.java b/src/main/java/com/simibubi/create/api/event/PipeCollisionEvent.java index 995199c02c..753f15ebca 100644 --- a/src/main/java/com/simibubi/create/api/event/PipeCollisionEvent.java +++ b/src/main/java/com/simibubi/create/api/event/PipeCollisionEvent.java @@ -18,15 +18,14 @@ import net.minecraftforge.eventbus.api.Event; */ public class PipeCollisionEvent extends Event { + protected final Fluid firstFluid, secondFluid; private final Level level; private final BlockPos pos; - protected final Fluid firstFluid, secondFluid; - @Nullable private BlockState state; protected PipeCollisionEvent(Level level, BlockPos pos, Fluid firstFluid, Fluid secondFluid, - @Nullable BlockState defaultState) { + @Nullable BlockState defaultState) { this.level = level; this.pos = pos; this.firstFluid = firstFluid; diff --git a/src/main/java/com/simibubi/create/api/event/TrackGraphMergeEvent.java b/src/main/java/com/simibubi/create/api/event/TrackGraphMergeEvent.java index d48e2a3a79..137f8f4f53 100644 --- a/src/main/java/com/simibubi/create/api/event/TrackGraphMergeEvent.java +++ b/src/main/java/com/simibubi/create/api/event/TrackGraphMergeEvent.java @@ -4,18 +4,19 @@ import com.simibubi.create.content.trains.graph.TrackGraph; import net.minecraftforge.eventbus.api.Event; -public class TrackGraphMergeEvent extends Event{ - private TrackGraph mergedInto, mergedFrom; - +public class TrackGraphMergeEvent extends Event { + private final TrackGraph mergedInto; + private final TrackGraph mergedFrom; + public TrackGraphMergeEvent(TrackGraph from, TrackGraph into) { mergedInto = into; mergedFrom = from; } - + public TrackGraph getGraphMergedInto() { return mergedInto; } - + public TrackGraph getGraphMergedFrom() { return mergedFrom; } diff --git a/src/main/java/com/simibubi/create/api/schematic/nbt/IPartialSafeNBT.java b/src/main/java/com/simibubi/create/api/schematic/nbt/IPartialSafeNBT.java index f3b112f403..2cd7948168 100644 --- a/src/main/java/com/simibubi/create/api/schematic/nbt/IPartialSafeNBT.java +++ b/src/main/java/com/simibubi/create/api/schematic/nbt/IPartialSafeNBT.java @@ -1,11 +1,10 @@ package com.simibubi.create.api.schematic.nbt; import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.level.block.entity.BlockEntity; - -import org.jetbrains.annotations.ApiStatus; public interface IPartialSafeNBT { - /** This will always be called from the logical server */ + /** + * This will always be called from the logical server + */ void writeSafe(CompoundTag compound); } diff --git a/src/main/java/com/simibubi/create/api/schematic/nbt/SchematicSafeNBTRegistry.java b/src/main/java/com/simibubi/create/api/schematic/nbt/SchematicSafeNBTRegistry.java index 4d3210d04e..846f96a4ab 100644 --- a/src/main/java/com/simibubi/create/api/schematic/nbt/SchematicSafeNBTRegistry.java +++ b/src/main/java/com/simibubi/create/api/schematic/nbt/SchematicSafeNBTRegistry.java @@ -16,10 +16,10 @@ public class SchematicSafeNBTRegistry { * Register a new partial safe nbt provider for a specific blockEntityType * * @param blockEntityType The block entity type you would like to register this for - * @param safeNBT The custom PartialSafeNBT provider you would like to register for this blockEntityType, - * your {@link ContextProvidingPartialSafeNBT#writeSafe(BlockEntity, CompoundTag)} method will be - * called on the passed {@link ContextProvidingPartialSafeNBT} - * when the block entities data is being prepared for placement. + * @param safeNBT The custom PartialSafeNBT provider you would like to register for this blockEntityType, + * your {@link ContextProvidingPartialSafeNBT#writeSafe(BlockEntity, CompoundTag)} method will be + * called on the passed {@link ContextProvidingPartialSafeNBT} + * when the block entities data is being prepared for placement. */ public static void register(BlockEntityType blockEntityType, ContextProvidingPartialSafeNBT safeNBT) { SchematicSafeNBTRegistryImpl.register(blockEntityType, safeNBT); @@ -29,7 +29,9 @@ public class SchematicSafeNBTRegistry { @FunctionalInterface public interface ContextProvidingPartialSafeNBT { - /** This will always be called from the logical server */ + /** + * This will always be called from the logical server + */ void writeSafe(BlockEntity blockEntity, CompoundTag tag); } } diff --git a/src/main/java/com/simibubi/create/api/schematic/requirement/ISpecialBlockItemRequirement.java b/src/main/java/com/simibubi/create/api/schematic/requirement/ISpecialBlockItemRequirement.java index 06eb4c972d..dc89bd0f49 100644 --- a/src/main/java/com/simibubi/create/api/schematic/requirement/ISpecialBlockItemRequirement.java +++ b/src/main/java/com/simibubi/create/api/schematic/requirement/ISpecialBlockItemRequirement.java @@ -1,6 +1,7 @@ package com.simibubi.create.api.schematic.requirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement; + import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; diff --git a/src/main/java/com/simibubi/create/api/schematic/requirement/SchematicRequirementsRegistry.java b/src/main/java/com/simibubi/create/api/schematic/requirement/SchematicRequirementsRegistry.java index c00cdb713d..3df156e6bd 100644 --- a/src/main/java/com/simibubi/create/api/schematic/requirement/SchematicRequirementsRegistry.java +++ b/src/main/java/com/simibubi/create/api/schematic/requirement/SchematicRequirementsRegistry.java @@ -1,5 +1,7 @@ package com.simibubi.create.api.schematic.requirement; +import org.jetbrains.annotations.Nullable; + import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.impl.schematic.requirement.SchematicRequirementsRegistryImpl; @@ -11,8 +13,6 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -import org.jetbrains.annotations.Nullable; - /** * Registry for schematic requirements for blocks, block entities, and entities. */ @@ -22,7 +22,7 @@ public class SchematicRequirementsRegistry { * * @param block The block you want to register a {@link BlockRequirement} for * @param requirement The requirement you would like to add to this block, - * the {@link BlockRequirement#getRequiredItems(BlockState, BlockEntity)} + * the {@link BlockRequirement#getRequiredItems(Block, BlockState, BlockEntity)} * method will be called on the {@link BlockRequirement} you have provided, * and you will be able to insert requirements based off the context that is given */ diff --git a/src/main/java/com/simibubi/create/impl/schematic/nbt/SchematicSafeNBTRegistryImpl.java b/src/main/java/com/simibubi/create/impl/schematic/nbt/SchematicSafeNBTRegistryImpl.java index aa664971ee..d650d77bb1 100644 --- a/src/main/java/com/simibubi/create/impl/schematic/nbt/SchematicSafeNBTRegistryImpl.java +++ b/src/main/java/com/simibubi/create/impl/schematic/nbt/SchematicSafeNBTRegistryImpl.java @@ -1,5 +1,7 @@ package com.simibubi.create.impl.schematic.nbt; +import org.jetbrains.annotations.ApiStatus; + import com.simibubi.create.api.schematic.nbt.SchematicSafeNBTRegistry; import com.simibubi.create.foundation.utility.AttachedRegistry; @@ -7,8 +9,6 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraftforge.registries.ForgeRegistries; -import org.jetbrains.annotations.ApiStatus; - @ApiStatus.Internal public class SchematicSafeNBTRegistryImpl { private static final AttachedRegistry, SchematicSafeNBTRegistry.ContextProvidingPartialSafeNBT> BLOCK_ENTITY_PARTIAL_SAFE_NBT = new AttachedRegistry<>(ForgeRegistries.BLOCK_ENTITY_TYPES); diff --git a/src/main/java/com/simibubi/create/impl/schematic/requirement/SchematicRequirementsRegistryImpl.java b/src/main/java/com/simibubi/create/impl/schematic/requirement/SchematicRequirementsRegistryImpl.java index 53646dc22e..c5044f254b 100644 --- a/src/main/java/com/simibubi/create/impl/schematic/requirement/SchematicRequirementsRegistryImpl.java +++ b/src/main/java/com/simibubi/create/impl/schematic/requirement/SchematicRequirementsRegistryImpl.java @@ -1,7 +1,8 @@ package com.simibubi.create.impl.schematic.requirement; -import com.simibubi.create.api.schematic.requirement.SchematicRequirementsRegistry; +import org.jetbrains.annotations.ApiStatus; +import com.simibubi.create.api.schematic.requirement.SchematicRequirementsRegistry; import com.simibubi.create.foundation.utility.AttachedRegistry; import net.minecraft.resources.ResourceLocation; @@ -10,11 +11,8 @@ import net.minecraft.world.entity.EntityType; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; - import net.minecraftforge.registries.ForgeRegistries; -import org.jetbrains.annotations.ApiStatus; - @ApiStatus.Internal public class SchematicRequirementsRegistryImpl { private static final AttachedRegistry BLOCK_REQUIREMENTS = new AttachedRegistry<>(ForgeRegistries.BLOCKS); From 94ddf439e82e35469ad0016f4024192310e973ca Mon Sep 17 00:00:00 2001 From: Kryppers <65094918+Kryppers@users.noreply.github.com> Date: Fri, 20 Dec 2024 00:59:55 +0000 Subject: [PATCH 208/515] Copperpocalypse: part 1 First batch of texture swaps. Changes to pipe models and adjusted UVs. --- .../block/copper_door/block_bottom.json | 8 +- .../models/block/copper_door/block_top.json | 6 +- .../models/block/copper_door/fold_left.json | 14 +- .../models/block/copper_door/fold_right.json | 14 +- .../block/fluid_pipe/connection/down.json | 1 + .../block/fluid_pipe/connection/east.json | 7 +- .../block/fluid_pipe/connection/north.json | 5 +- .../block/fluid_pipe/connection/south.json | 5 +- .../block/fluid_pipe/connection/up.json | 1 + .../block/fluid_pipe/connection/west.json | 7 +- .../models/block/fluid_pipe/core_x.json | 5 +- .../models/block/fluid_pipe/core_y.json | 5 +- .../models/block/fluid_pipe/core_z.json | 5 +- .../models/block/fluid_pipe/drain/down.json | 12 +- .../models/block/fluid_pipe/drain/east.json | 10 +- .../models/block/fluid_pipe/drain/north.json | 10 +- .../models/block/fluid_pipe/drain/south.json | 10 +- .../models/block/fluid_pipe/drain/up.json | 12 +- .../models/block/fluid_pipe/drain/west.json | 10 +- .../create/models/block/fluid_pipe/item.json | 61 ++-- .../models/block/fluid_pipe/rim/down.json | 10 +- .../models/block/fluid_pipe/rim/east.json | 10 +- .../models/block/fluid_pipe/rim/north.json | 10 +- .../models/block/fluid_pipe/rim/south.json | 10 +- .../models/block/fluid_pipe/rim/up.json | 10 +- .../models/block/fluid_pipe/rim/west.json | 10 +- .../block/fluid_pipe/rim_connector/down.json | 12 +- .../block/fluid_pipe/rim_connector/east.json | 12 +- .../block/fluid_pipe/rim_connector/north.json | 13 +- .../block/fluid_pipe/rim_connector/south.json | 13 +- .../block/fluid_pipe/rim_connector/up.json | 12 +- .../block/fluid_pipe/rim_connector/west.json | 12 +- .../models/block/fluid_pipe/window.json | 64 +---- .../models/block/fluid_pipe/window_alt.json | 58 ---- .../models/block/mechanical_pump/block.json | 121 ++------ .../models/block/mechanical_pump/cog.json | 141 +++++---- .../models/block/mechanical_pump/item.json | 267 +++++++----------- .../models/block/smart_fluid_pipe/block.json | 40 +-- .../models/block/smart_fluid_pipe/item.json | 57 ++-- .../textures/block/bars/copper_bars.png | Bin 234 -> 2263 bytes .../textures/block/bars/copper_bars_edge.png | Bin 139 -> 1152 bytes .../create/textures/block/cam_linkage.png | Bin 463 -> 1091 bytes .../textures/block/copper/copper_roof_top.png | Bin 158 -> 1654 bytes .../textures/block/copper/copper_shingles.png | Bin 205 -> 504 bytes .../textures/block/copper/copper_tiles.png | Bin 147 -> 544 bytes .../block/copper/exposed_copper_roof_top.png | Bin 158 -> 1691 bytes .../block/copper/exposed_copper_shingles.png | Bin 205 -> 516 bytes .../block/copper/exposed_copper_tiles.png | Bin 147 -> 512 bytes .../block/copper/oxidized_copper_roof_top.png | Bin 391 -> 1708 bytes .../block/copper/oxidized_copper_shingles.png | Bin 426 -> 521 bytes .../block/copper/oxidized_copper_tiles.png | Bin 437 -> 557 bytes .../copper/weathered_copper_roof_top.png | Bin 158 -> 1806 bytes .../copper/weathered_copper_shingles.png | Bin 205 -> 551 bytes .../block/copper/weathered_copper_tiles.png | Bin 147 -> 589 bytes .../create/textures/block/copper_backtank.png | Bin 545 -> 1375 bytes .../create/textures/block/copper_casing.png | Bin 250 -> 537 bytes .../textures/block/copper_door_bottom.png | Bin 2022 -> 495 bytes .../textures/block/copper_door_side.png | Bin 253 -> 420 bytes .../create/textures/block/copper_door_top.png | Bin 2197 -> 531 bytes .../create/textures/block/encased_pipe.png | Bin 247 -> 451 bytes .../block/funnel/copper_funnel_frame.png | Bin 193 -> 396 bytes .../textures/block/glass_fluid_pipe.png | Bin 198 -> 369 bytes .../assets/create/textures/block/pipes.png | Bin 435 -> 882 bytes .../create/textures/block/pipes_connected.png | Bin 426 -> 809 bytes .../assets/create/textures/block/pump.png | Bin 255 -> 800 bytes .../block/scaffold/copper_scaffold.png | Bin 208 -> 461 bytes .../scaffold/copper_scaffold_connected.png | Bin 259 -> 551 bytes .../block/scaffold/copper_scaffold_inside.png | Bin 144 -> 248 bytes .../copper_scaffold_inside_connected.png | Bin 190 -> 333 bytes .../create/textures/block/smart_pipe_1.png | Bin 234 -> 362 bytes .../create/textures/block/smart_pipe_2.png | Bin 269 -> 537 bytes .../valve_handle/valve_handle_copper.png | Bin 250 -> 517 bytes .../create/textures/item/copper_door.png | Bin 315 -> 359 bytes .../create/textures/item/copper_ingot.png | Bin 212 -> 419 bytes .../create/textures/item/copper_nugget.png | Bin 156 -> 304 bytes .../create/textures/item/copper_sheet.png | Bin 178 -> 448 bytes .../textures/item/crushed_raw_copper.png | Bin 191 -> 491 bytes .../models/armor/copper_diving_layer_1.png | Bin 664 -> 1877 bytes 78 files changed, 423 insertions(+), 667 deletions(-) delete mode 100644 src/main/resources/assets/create/models/block/fluid_pipe/window_alt.json diff --git a/src/main/resources/assets/create/models/block/copper_door/block_bottom.json b/src/main/resources/assets/create/models/block/copper_door/block_bottom.json index 0611f158e0..7a39e7c5d1 100644 --- a/src/main/resources/assets/create/models/block/copper_door/block_bottom.json +++ b/src/main/resources/assets/create/models/block/copper_door/block_bottom.json @@ -11,11 +11,11 @@ "from": [0, 0, 0], "to": [3, 16, 16], "faces": { - "north": {"uv": [0, 12, 16, 15], "rotation": 270, "texture": "#0"}, - "east": {"uv": [0, 0, 16, 16], "texture": "#2"}, - "south": {"uv": [0, 12, 16, 15], "rotation": 270, "texture": "#0"}, + "north": {"uv": [16, 9, 0, 12], "rotation": 270, "texture": "#0"}, + "east": {"uv": [16, 0, 0, 16], "texture": "#2"}, + "south": {"uv": [16, 15, 0, 12], "rotation": 270, "texture": "#0"}, "west": {"uv": [0, 0, 16, 16], "texture": "#2"}, - "down": {"uv": [0, 8, 16, 11], "rotation": 90, "texture": "#0"} + "down": {"uv": [16, 3, 0, 6], "rotation": 90, "texture": "#0"} } } ] diff --git a/src/main/resources/assets/create/models/block/copper_door/block_top.json b/src/main/resources/assets/create/models/block/copper_door/block_top.json index ec3bcee261..25f98beb60 100644 --- a/src/main/resources/assets/create/models/block/copper_door/block_top.json +++ b/src/main/resources/assets/create/models/block/copper_door/block_top.json @@ -11,9 +11,9 @@ "from": [0, 0, 0], "to": [3, 16, 16], "faces": { - "north": {"uv": [0, 4, 16, 7], "rotation": 90, "texture": "#0"}, - "east": {"uv": [0, 0, 16, 16], "texture": "#2"}, - "south": {"uv": [0, 4, 16, 7], "rotation": 90, "texture": "#0"}, + "north": {"uv": [0, 9, 16, 6], "rotation": 90, "texture": "#0"}, + "east": {"uv": [16, 0, 0, 16], "texture": "#2"}, + "south": {"uv": [16, 12, 0, 15], "rotation": 90, "texture": "#0"}, "west": {"uv": [0, 0, 16, 16], "texture": "#2"}, "up": {"uv": [0, 0, 16, 3], "rotation": 90, "texture": "#0"} } diff --git a/src/main/resources/assets/create/models/block/copper_door/fold_left.json b/src/main/resources/assets/create/models/block/copper_door/fold_left.json index 02f85e1a94..8d4b64fd69 100644 --- a/src/main/resources/assets/create/models/block/copper_door/fold_left.json +++ b/src/main/resources/assets/create/models/block/copper_door/fold_left.json @@ -12,9 +12,9 @@ "from": [0, 16, 0], "to": [3, 32, 8], "faces": { - "north": {"uv": [0, 4, 16, 7], "rotation": 90, "texture": "#0"}, - "east": {"uv": [8, 0, 16, 16], "texture": "#2"}, - "south": {"uv": [0, 4, 16, 7], "rotation": 90, "texture": "#0"}, + "north": {"uv": [0, 6, 16, 9], "rotation": 90, "texture": "#0"}, + "east": {"uv": [8, 0, 0, 16], "texture": "#2"}, + "south": {"uv": [0, 6, 16, 9], "rotation": 90, "texture": "#0"}, "west": {"uv": [0, 0, 8, 16], "texture": "#2"}, "up": {"uv": [0, 0, 8, 3], "rotation": 90, "texture": "#0"} } @@ -23,11 +23,11 @@ "from": [0, 0, 0], "to": [3, 16, 8], "faces": { - "north": {"uv": [16, 4, 0, 7], "rotation": 90, "texture": "#0"}, - "east": {"uv": [8, 0, 16, 16], "texture": "#3"}, - "south": {"uv": [16, 4, 0, 7], "rotation": 90, "texture": "#0"}, + "north": {"uv": [0, 12, 16, 9], "rotation": 90, "texture": "#0"}, + "east": {"uv": [8, 0, 0, 16], "texture": "#3"}, + "south": {"uv": [0, 9, 16, 12], "rotation": 90, "texture": "#0"}, "west": {"uv": [0, 0, 8, 16], "texture": "#3"}, - "down": {"uv": [0, 8, 8, 11], "rotation": 270, "texture": "#0"} + "down": {"uv": [0, 6, 8, 3], "rotation": 270, "texture": "#0"} } } ] diff --git a/src/main/resources/assets/create/models/block/copper_door/fold_right.json b/src/main/resources/assets/create/models/block/copper_door/fold_right.json index c13051b645..6fb4cc46e6 100644 --- a/src/main/resources/assets/create/models/block/copper_door/fold_right.json +++ b/src/main/resources/assets/create/models/block/copper_door/fold_right.json @@ -12,9 +12,9 @@ "from": [0, 16, 0], "to": [3, 32, 8], "faces": { - "north": {"uv": [0, 4, 16, 7], "rotation": 90, "texture": "#0"}, - "east": {"uv": [0, 0, 8, 16], "texture": "#2"}, - "south": {"uv": [0, 4, 16, 7], "rotation": 90, "texture": "#0"}, + "north": {"uv": [0, 9, 16, 6], "rotation": 90, "texture": "#0"}, + "east": {"uv": [16, 0, 8, 16], "texture": "#2"}, + "south": {"uv": [16, 12, 0, 15], "rotation": 90, "texture": "#0"}, "west": {"uv": [8, 0, 16, 16], "texture": "#2"}, "up": {"uv": [8, 0, 16, 3], "rotation": 90, "texture": "#0"} } @@ -23,11 +23,11 @@ "from": [0, 0, 0], "to": [3, 16, 8], "faces": { - "north": {"uv": [16, 4, 0, 7], "rotation": 90, "texture": "#0"}, - "east": {"uv": [0, 0, 8, 16], "texture": "#3"}, - "south": {"uv": [16, 4, 0, 7], "rotation": 90, "texture": "#0"}, + "north": {"uv": [0, 12, 16, 9], "rotation": 90, "texture": "#0"}, + "east": {"uv": [16, 0, 8, 16], "texture": "#3"}, + "south": {"uv": [0, 12, 16, 15], "rotation": 90, "texture": "#0"}, "west": {"uv": [8, 0, 16, 16], "texture": "#3"}, - "down": {"uv": [8, 8, 16, 11], "rotation": 270, "texture": "#0"} + "down": {"uv": [8, 6, 16, 3], "rotation": 270, "texture": "#0"} } } ] diff --git a/src/main/resources/assets/create/models/block/fluid_pipe/connection/down.json b/src/main/resources/assets/create/models/block/fluid_pipe/connection/down.json index a5c404bbe7..7f3041ce8a 100644 --- a/src/main/resources/assets/create/models/block/fluid_pipe/connection/down.json +++ b/src/main/resources/assets/create/models/block/fluid_pipe/connection/down.json @@ -7,6 +7,7 @@ }, "elements": [ { + "name": "connection_down", "from": [4, 0, 4], "to": [12, 4, 12], "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, -16]}, diff --git a/src/main/resources/assets/create/models/block/fluid_pipe/connection/east.json b/src/main/resources/assets/create/models/block/fluid_pipe/connection/east.json index f41e9f67b5..d714c2a5f4 100644 --- a/src/main/resources/assets/create/models/block/fluid_pipe/connection/east.json +++ b/src/main/resources/assets/create/models/block/fluid_pipe/connection/east.json @@ -7,14 +7,15 @@ }, "elements": [ { + "name": "connection_east", "from": [12, 4, 4], "to": [16, 12, 12], "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, -16]}, "faces": { "north": {"uv": [0, 6, 4, 8], "rotation": 90, "texture": "#0"}, - "south": {"uv": [0, 0, 4, 2], "rotation": 90, "texture": "#0"}, - "up": {"uv": [4, 0, 0, 2], "rotation": 90, "texture": "#0"}, - "down": {"uv": [4, 6, 0, 8], "rotation": 270, "texture": "#0"} + "south": {"uv": [0, 8, 4, 6], "rotation": 90, "texture": "#0"}, + "up": {"uv": [0, 8, 4, 6], "rotation": 90, "texture": "#0"}, + "down": {"uv": [0, 6, 4, 8], "rotation": 270, "texture": "#0"} } } ] diff --git a/src/main/resources/assets/create/models/block/fluid_pipe/connection/north.json b/src/main/resources/assets/create/models/block/fluid_pipe/connection/north.json index f8afab833a..2091fd28e3 100644 --- a/src/main/resources/assets/create/models/block/fluid_pipe/connection/north.json +++ b/src/main/resources/assets/create/models/block/fluid_pipe/connection/north.json @@ -7,13 +7,14 @@ }, "elements": [ { + "name": "connection_north", "from": [4, 4, 0], "to": [12, 12, 4], "rotation": {"angle": 0, "axis": "y", "origin": [0, 8, 0]}, "faces": { "east": {"uv": [0, 0, 4, 2], "rotation": 90, "texture": "#0"}, - "west": {"uv": [0, 6, 4, 8], "rotation": 90, "texture": "#0"}, - "up": {"uv": [0, 6, 4, 8], "rotation": 180, "texture": "#0"}, + "west": {"uv": [0, 2, 4, 0], "rotation": 90, "texture": "#0"}, + "up": {"uv": [0, 2, 4, 0], "rotation": 180, "texture": "#0"}, "down": {"uv": [0, 0, 4, 2], "rotation": 180, "texture": "#0"} } } diff --git a/src/main/resources/assets/create/models/block/fluid_pipe/connection/south.json b/src/main/resources/assets/create/models/block/fluid_pipe/connection/south.json index 84fcda0a0e..67a2994475 100644 --- a/src/main/resources/assets/create/models/block/fluid_pipe/connection/south.json +++ b/src/main/resources/assets/create/models/block/fluid_pipe/connection/south.json @@ -7,13 +7,14 @@ }, "elements": [ { + "name": "connection_south", "from": [4, 4, 12], "to": [12, 12, 16], "rotation": {"angle": 0, "axis": "y", "origin": [0, 8, 0]}, "faces": { "east": {"uv": [0, 6, 4, 8], "rotation": 90, "texture": "#0"}, - "west": {"uv": [0, 0, 4, 2], "rotation": 90, "texture": "#0"}, - "up": {"uv": [0, 0, 4, 2], "rotation": 180, "texture": "#0"}, + "west": {"uv": [0, 8, 4, 6], "rotation": 90, "texture": "#0"}, + "up": {"uv": [0, 8, 4, 6], "rotation": 180, "texture": "#0"}, "down": {"uv": [0, 6, 4, 8], "rotation": 180, "texture": "#0"} } } diff --git a/src/main/resources/assets/create/models/block/fluid_pipe/connection/up.json b/src/main/resources/assets/create/models/block/fluid_pipe/connection/up.json index 7b6830c429..7dbccfc07f 100644 --- a/src/main/resources/assets/create/models/block/fluid_pipe/connection/up.json +++ b/src/main/resources/assets/create/models/block/fluid_pipe/connection/up.json @@ -7,6 +7,7 @@ }, "elements": [ { + "name": "connection_up", "from": [4, 12, 4], "to": [12, 16, 12], "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, -16]}, diff --git a/src/main/resources/assets/create/models/block/fluid_pipe/connection/west.json b/src/main/resources/assets/create/models/block/fluid_pipe/connection/west.json index e28c729d29..bdee4e024c 100644 --- a/src/main/resources/assets/create/models/block/fluid_pipe/connection/west.json +++ b/src/main/resources/assets/create/models/block/fluid_pipe/connection/west.json @@ -7,14 +7,15 @@ }, "elements": [ { + "name": "connection_west", "from": [0, 4, 4], "to": [4, 12, 12], "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, -16]}, "faces": { "north": {"uv": [0, 0, 4, 2], "rotation": 90, "texture": "#0"}, - "south": {"uv": [0, 6, 4, 8], "rotation": 90, "texture": "#0"}, - "up": {"uv": [4, 6, 0, 8], "rotation": 90, "texture": "#0"}, - "down": {"uv": [4, 0, 0, 2], "rotation": 270, "texture": "#0"} + "south": {"uv": [0, 2, 4, 0], "rotation": 90, "texture": "#0"}, + "up": {"uv": [0, 2, 4, 0], "rotation": 90, "texture": "#0"}, + "down": {"uv": [0, 0, 4, 2], "rotation": 270, "texture": "#0"} } } ] diff --git a/src/main/resources/assets/create/models/block/fluid_pipe/core_x.json b/src/main/resources/assets/create/models/block/fluid_pipe/core_x.json index 53f7ce4d03..55c1936e33 100644 --- a/src/main/resources/assets/create/models/block/fluid_pipe/core_x.json +++ b/src/main/resources/assets/create/models/block/fluid_pipe/core_x.json @@ -6,11 +6,12 @@ }, "elements": [ { + "name": "core_x", "from": [4, 4, 4], "to": [12, 12, 12], "faces": { - "east": {"uv": [16, 8, 12, 12], "rotation": 180, "texture": "#0"}, - "west": {"uv": [16, 8, 12, 12], "rotation": 180, "texture": "#0"} + "east": {"uv": [12, 8, 16, 12], "texture": "#0"}, + "west": {"uv": [16, 8, 12, 12], "texture": "#0"} } } ] diff --git a/src/main/resources/assets/create/models/block/fluid_pipe/core_y.json b/src/main/resources/assets/create/models/block/fluid_pipe/core_y.json index 82d4926b29..6ddf32ea58 100644 --- a/src/main/resources/assets/create/models/block/fluid_pipe/core_y.json +++ b/src/main/resources/assets/create/models/block/fluid_pipe/core_y.json @@ -6,11 +6,12 @@ }, "elements": [ { + "name": "core_y", "from": [4, 4, 4], "to": [12, 12, 12], "faces": { - "up": {"uv": [16, 8, 12, 12], "rotation": 180, "texture": "#0"}, - "down": {"uv": [16, 8, 12, 12], "rotation": 180, "texture": "#0"} + "up": {"uv": [12, 12, 16, 8], "rotation": 180, "texture": "#0"}, + "down": {"uv": [12, 8, 16, 12], "rotation": 180, "texture": "#0"} } } ] diff --git a/src/main/resources/assets/create/models/block/fluid_pipe/core_z.json b/src/main/resources/assets/create/models/block/fluid_pipe/core_z.json index 1605b22434..984be9bbd2 100644 --- a/src/main/resources/assets/create/models/block/fluid_pipe/core_z.json +++ b/src/main/resources/assets/create/models/block/fluid_pipe/core_z.json @@ -6,11 +6,12 @@ }, "elements": [ { + "name": "core_z", "from": [4, 4, 4], "to": [12, 12, 12], "faces": { - "north": {"uv": [12, 8, 16, 12], "rotation": 180, "texture": "#0"}, - "south": {"uv": [12, 8, 16, 12], "rotation": 180, "texture": "#0"} + "north": {"uv": [12, 8, 16, 12], "texture": "#0"}, + "south": {"uv": [16, 8, 12, 12], "texture": "#0"} } } ] diff --git a/src/main/resources/assets/create/models/block/fluid_pipe/drain/down.json b/src/main/resources/assets/create/models/block/fluid_pipe/drain/down.json index 0460250ae5..30e4c8c06f 100644 --- a/src/main/resources/assets/create/models/block/fluid_pipe/drain/down.json +++ b/src/main/resources/assets/create/models/block/fluid_pipe/drain/down.json @@ -15,7 +15,7 @@ "east": {"uv": [12, 8, 13.5, 11], "rotation": 90, "texture": "#0"}, "south": {"uv": [12, 8, 13.5, 11], "rotation": 90, "texture": "#0"}, "west": {"uv": [12, 8, 13.5, 11], "rotation": 90, "texture": "#0"}, - "down": {"uv": [13, 8, 16, 11], "rotation": 90, "texture": "#0"} + "down": {"uv": [13, 8, 16, 11], "rotation": 180, "texture": "#0"} } }, { @@ -23,11 +23,11 @@ "to": [13.05, 2, 13.05], "rotation": {"angle": 0, "axis": "z", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [9, 9.5, 4, 8], "texture": "#0"}, - "east": {"uv": [4, 8, 9, 9.5], "rotation": 180, "texture": "#0"}, - "south": {"uv": [4, 8, 9, 9.5], "rotation": 180, "texture": "#0"}, - "west": {"uv": [9, 9.5, 4, 8], "texture": "#0"}, - "up": {"uv": [6, 11, 11, 16], "rotation": 90, "texture": "#0"}, + "north": {"uv": [10.5, 16, 9, 11], "rotation": 90, "texture": "#0"}, + "east": {"uv": [10.5, 16, 9, 11], "rotation": 90, "texture": "#0"}, + "south": {"uv": [10.5, 16, 9, 11], "rotation": 90, "texture": "#0"}, + "west": {"uv": [10.5, 16, 9, 11], "rotation": 90, "texture": "#0"}, + "up": {"uv": [11, 11, 16, 16], "rotation": 90, "texture": "#0"}, "down": {"uv": [11, 11, 16, 16], "rotation": 90, "texture": "#0"} } } diff --git a/src/main/resources/assets/create/models/block/fluid_pipe/drain/east.json b/src/main/resources/assets/create/models/block/fluid_pipe/drain/east.json index 051248f8b8..fd197a2e6f 100644 --- a/src/main/resources/assets/create/models/block/fluid_pipe/drain/east.json +++ b/src/main/resources/assets/create/models/block/fluid_pipe/drain/east.json @@ -23,12 +23,12 @@ "to": [16.95, 13.05, 13.05], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [9, 9.5, 4, 8], "rotation": 90, "texture": "#0"}, + "north": {"uv": [9, 16, 10.5, 11], "texture": "#0"}, "east": {"uv": [11, 11, 16, 16], "texture": "#0"}, - "south": {"uv": [4, 8, 9, 9.5], "rotation": 90, "texture": "#0"}, - "west": {"uv": [6, 11, 11, 16], "texture": "#0"}, - "up": {"uv": [4, 8, 9, 9.5], "rotation": 90, "texture": "#0"}, - "down": {"uv": [9, 9.5, 4, 8], "rotation": 270, "texture": "#0"} + "south": {"uv": [10.5, 11, 9, 16], "texture": "#0"}, + "west": {"uv": [11, 11, 16, 16], "texture": "#0"}, + "up": {"uv": [10.5, 11, 9, 16], "texture": "#0"}, + "down": {"uv": [10.5, 16, 9, 11], "texture": "#0"} } } ] diff --git a/src/main/resources/assets/create/models/block/fluid_pipe/drain/north.json b/src/main/resources/assets/create/models/block/fluid_pipe/drain/north.json index 3cb49dd1d9..46505c8c63 100644 --- a/src/main/resources/assets/create/models/block/fluid_pipe/drain/north.json +++ b/src/main/resources/assets/create/models/block/fluid_pipe/drain/north.json @@ -12,11 +12,11 @@ "rotation": {"angle": 0, "axis": "y", "origin": [8, 34, 8]}, "faces": { "north": {"uv": [11, 11, 16, 16], "texture": "#0"}, - "east": {"uv": [4, 8, 9, 9.5], "rotation": 90, "texture": "#0"}, - "south": {"uv": [6, 11, 11, 16], "texture": "#0"}, - "west": {"uv": [9, 9.5, 4, 8], "rotation": 90, "texture": "#0"}, - "up": {"uv": [4, 8, 9, 9.5], "texture": "#0"}, - "down": {"uv": [9, 9.5, 4, 8], "texture": "#0"} + "east": {"uv": [10.5, 11, 9, 16], "texture": "#0"}, + "south": {"uv": [11, 11, 16, 16], "texture": "#0"}, + "west": {"uv": [9, 16, 10.5, 11], "texture": "#0"}, + "up": {"uv": [9, 11, 10.5, 16], "rotation": 90, "texture": "#0"}, + "down": {"uv": [10.5, 16, 9, 11], "rotation": 90, "texture": "#0"} } }, { diff --git a/src/main/resources/assets/create/models/block/fluid_pipe/drain/south.json b/src/main/resources/assets/create/models/block/fluid_pipe/drain/south.json index 1a854f973b..cdc0648c45 100644 --- a/src/main/resources/assets/create/models/block/fluid_pipe/drain/south.json +++ b/src/main/resources/assets/create/models/block/fluid_pipe/drain/south.json @@ -23,12 +23,12 @@ "to": [13.05, 13.05, 16.95], "rotation": {"angle": 0, "axis": "y", "origin": [8, 34, 8]}, "faces": { - "north": {"uv": [11, 11, 6, 16], "texture": "#0"}, - "east": {"uv": [4, 9.5, 9, 8], "rotation": 90, "texture": "#0"}, + "north": {"uv": [16, 11, 11, 16], "texture": "#0"}, + "east": {"uv": [9, 11, 10.5, 16], "texture": "#0"}, "south": {"uv": [16, 11, 11, 16], "texture": "#0"}, - "west": {"uv": [9, 8, 4, 9.5], "rotation": 90, "texture": "#0"}, - "up": {"uv": [4, 9.5, 9, 8], "texture": "#0"}, - "down": {"uv": [9, 8, 4, 9.5], "texture": "#0"} + "west": {"uv": [10.5, 16, 9, 11], "texture": "#0"}, + "up": {"uv": [10.5, 11, 9, 16], "rotation": 90, "texture": "#0"}, + "down": {"uv": [9, 16, 10.5, 11], "rotation": 90, "texture": "#0"} } } ] diff --git a/src/main/resources/assets/create/models/block/fluid_pipe/drain/up.json b/src/main/resources/assets/create/models/block/fluid_pipe/drain/up.json index f675569681..cd72a28410 100644 --- a/src/main/resources/assets/create/models/block/fluid_pipe/drain/up.json +++ b/src/main/resources/assets/create/models/block/fluid_pipe/drain/up.json @@ -11,12 +11,12 @@ "to": [13.05, 16.95, 13.05], "rotation": {"angle": 0, "axis": "z", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [9, 8, 4, 9.5], "texture": "#0"}, - "east": {"uv": [4, 9.5, 9, 8], "rotation": 180, "texture": "#0"}, - "south": {"uv": [4, 9.5, 9, 8], "rotation": 180, "texture": "#0"}, - "west": {"uv": [9, 8, 4, 9.5], "texture": "#0"}, + "north": {"uv": [9, 16, 10.5, 11], "rotation": 90, "texture": "#0"}, + "east": {"uv": [9, 16, 10.5, 11], "rotation": 90, "texture": "#0"}, + "south": {"uv": [9, 16, 10.5, 11], "rotation": 90, "texture": "#0"}, + "west": {"uv": [9, 16, 10.5, 11], "rotation": 90, "texture": "#0"}, "up": {"uv": [16, 11, 11, 16], "rotation": 90, "texture": "#0"}, - "down": {"uv": [11, 11, 6, 16], "rotation": 90, "texture": "#0"} + "down": {"uv": [16, 11, 11, 16], "rotation": 90, "texture": "#0"} } }, { @@ -28,7 +28,7 @@ "east": {"uv": [13.5, 8, 12, 11], "rotation": 90, "texture": "#0"}, "south": {"uv": [13.5, 8, 12, 11], "rotation": 90, "texture": "#0"}, "west": {"uv": [13.5, 8, 12, 11], "rotation": 90, "texture": "#0"}, - "up": {"uv": [16, 8, 13, 11], "rotation": 90, "texture": "#0"} + "up": {"uv": [13, 11, 16, 8], "rotation": 180, "texture": "#0"} } } ] diff --git a/src/main/resources/assets/create/models/block/fluid_pipe/drain/west.json b/src/main/resources/assets/create/models/block/fluid_pipe/drain/west.json index 6df3cce3a2..a315454598 100644 --- a/src/main/resources/assets/create/models/block/fluid_pipe/drain/west.json +++ b/src/main/resources/assets/create/models/block/fluid_pipe/drain/west.json @@ -11,12 +11,12 @@ "to": [2, 13.05, 13.05], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [9, 8, 4, 9.5], "rotation": 90, "texture": "#0"}, - "east": {"uv": [11, 11, 6, 16], "texture": "#0"}, - "south": {"uv": [4, 9.5, 9, 8], "rotation": 90, "texture": "#0"}, + "north": {"uv": [10.5, 16, 9, 11], "texture": "#0"}, + "east": {"uv": [16, 11, 11, 16], "texture": "#0"}, + "south": {"uv": [9, 11, 10.5, 16], "texture": "#0"}, "west": {"uv": [16, 11, 11, 16], "texture": "#0"}, - "up": {"uv": [4, 9.5, 9, 8], "rotation": 90, "texture": "#0"}, - "down": {"uv": [9, 8, 4, 9.5], "rotation": 270, "texture": "#0"} + "up": {"uv": [9, 11, 10.5, 16], "texture": "#0"}, + "down": {"uv": [9, 16, 10.5, 11], "texture": "#0"} } }, { diff --git a/src/main/resources/assets/create/models/block/fluid_pipe/item.json b/src/main/resources/assets/create/models/block/fluid_pipe/item.json index 290c4511fc..8589a5065b 100644 --- a/src/main/resources/assets/create/models/block/fluid_pipe/item.json +++ b/src/main/resources/assets/create/models/block/fluid_pipe/item.json @@ -7,39 +7,14 @@ }, "elements": [ { - "from": [4, 4, 4], - "to": [12, 12, 12], - "faces": { - "east": {"uv": [0, 0, 4, 4], "rotation": 90, "texture": "#1"}, - "west": {"uv": [0, 0, 4, 4], "rotation": 90, "texture": "#1"}, - "up": {"uv": [0, 0, 4, 4], "rotation": 180, "texture": "#1"}, - "down": {"uv": [0, 0, 4, 4], "rotation": 180, "texture": "#1"} - } - }, - { - "from": [4, 4, 12], - "to": [12, 12, 14], + "from": [4, 4, 0], + "to": [12, 12, 16], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [0, 0, 0, 0], "texture": "#1"}, - "east": {"uv": [0, 9, 4, 10], "rotation": 90, "texture": "#1"}, - "south": {"uv": [0, 0, 0, 0], "texture": "#1"}, - "west": {"uv": [0, 8, 4, 9], "rotation": 90, "texture": "#1"}, - "up": {"uv": [0, 8, 4, 9], "rotation": 180, "texture": "#1"}, - "down": {"uv": [0, 9, 4, 10], "rotation": 180, "texture": "#1"} - } - }, - { - "from": [4, 4, 2], - "to": [12, 12, 4], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [0, 0, 0, 0], "texture": "#1"}, - "east": {"uv": [0, 8, 4, 9], "rotation": 90, "texture": "#1"}, - "south": {"uv": [0, 0, 0, 0], "texture": "#1"}, - "west": {"uv": [0, 9, 4, 10], "rotation": 90, "texture": "#1"}, - "up": {"uv": [0, 9, 4, 10], "rotation": 180, "texture": "#1"}, - "down": {"uv": [0, 8, 4, 9], "rotation": 180, "texture": "#1"} + "east": {"uv": [4, 8, 8, 0], "rotation": 90, "texture": "#1"}, + "west": {"uv": [4, 0, 8, 8], "rotation": 90, "texture": "#1"}, + "up": {"uv": [4, 8, 8, 0], "texture": "#1"}, + "down": {"uv": [4, 8, 8, 0], "rotation": 180, "texture": "#1"} } }, { @@ -48,24 +23,24 @@ "rotation": {"angle": 0, "axis": "y", "origin": [8, 28, 8]}, "faces": { "north": {"uv": [11, 11, 16, 16], "texture": "#1"}, - "east": {"uv": [10.5, 11, 11.5, 16], "texture": "#1"}, - "south": {"uv": [6, 11, 11, 16], "texture": "#1"}, - "west": {"uv": [11.5, 16, 10.5, 11], "texture": "#1"}, - "up": {"uv": [10.5, 11, 11.5, 16], "rotation": 270, "texture": "#1"}, - "down": {"uv": [11.5, 16, 10.5, 11], "rotation": 270, "texture": "#1"} + "east": {"uv": [10.5, 16, 9.5, 11], "texture": "#1"}, + "south": {"uv": [11, 11, 16, 16], "texture": "#1"}, + "west": {"uv": [9.5, 16, 10.5, 11], "texture": "#1"}, + "up": {"uv": [9.5, 11, 10.5, 16], "rotation": 90, "texture": "#1"}, + "down": {"uv": [10.5, 11, 9.5, 16], "rotation": 90, "texture": "#1"} } }, { "from": [3, 3, 14], "to": [13, 13, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 28, 8]}, + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 15]}, "faces": { - "north": {"uv": [6, 11, 11, 16], "texture": "#1"}, - "east": {"uv": [11.5, 16, 10.5, 11], "texture": "#1"}, - "south": {"uv": [11, 11, 16, 16], "texture": "#1"}, - "west": {"uv": [10.5, 11, 11.5, 16], "texture": "#1"}, - "up": {"uv": [11.5, 16, 10.5, 11], "rotation": 270, "texture": "#1"}, - "down": {"uv": [10.5, 11, 11.5, 16], "rotation": 270, "texture": "#1"} + "north": {"uv": [11, 11, 16, 16], "rotation": 180, "texture": "#1"}, + "east": {"uv": [10.5, 16, 9.5, 11], "rotation": 180, "texture": "#1"}, + "south": {"uv": [11, 11, 16, 16], "rotation": 180, "texture": "#1"}, + "west": {"uv": [9.5, 16, 10.5, 11], "rotation": 180, "texture": "#1"}, + "up": {"uv": [10.5, 11, 9.5, 16], "rotation": 90, "texture": "#1"}, + "down": {"uv": [9.5, 11, 10.5, 16], "rotation": 90, "texture": "#1"} } } ], diff --git a/src/main/resources/assets/create/models/block/fluid_pipe/rim/down.json b/src/main/resources/assets/create/models/block/fluid_pipe/rim/down.json index 0548e16b11..bc2f4cc859 100644 --- a/src/main/resources/assets/create/models/block/fluid_pipe/rim/down.json +++ b/src/main/resources/assets/create/models/block/fluid_pipe/rim/down.json @@ -10,11 +10,11 @@ "from": [3, 0, 3], "to": [13, 2, 13], "faces": { - "north": {"uv": [10.5, 11, 11.5, 16], "rotation": 90, "texture": "#0"}, - "east": {"uv": [10.5, 11, 11.5, 16], "rotation": 90, "texture": "#0"}, - "south": {"uv": [10.5, 11, 11.5, 16], "rotation": 90, "texture": "#0"}, - "west": {"uv": [10.5, 11, 11.5, 16], "rotation": 90, "texture": "#0"}, - "up": {"uv": [6, 11, 11, 16], "rotation": 90, "texture": "#0"}, + "north": {"uv": [10.5, 11, 9.5, 16], "rotation": 90, "texture": "#0"}, + "east": {"uv": [10.5, 11, 9.5, 16], "rotation": 90, "texture": "#0"}, + "south": {"uv": [10.5, 11, 9.5, 16], "rotation": 90, "texture": "#0"}, + "west": {"uv": [10.5, 11, 9.5, 16], "rotation": 90, "texture": "#0"}, + "up": {"uv": [11, 11, 16, 16], "rotation": 90, "texture": "#0"}, "down": {"uv": [11, 11, 16, 16], "rotation": 270, "texture": "#0", "cullface": "down"} } } diff --git a/src/main/resources/assets/create/models/block/fluid_pipe/rim/east.json b/src/main/resources/assets/create/models/block/fluid_pipe/rim/east.json index 6267b7e7b7..0b5dcf4a64 100644 --- a/src/main/resources/assets/create/models/block/fluid_pipe/rim/east.json +++ b/src/main/resources/assets/create/models/block/fluid_pipe/rim/east.json @@ -10,12 +10,12 @@ "from": [14, 3, 3], "to": [16, 13, 13], "faces": { - "north": {"uv": [11.5, 16, 10.5, 11], "texture": "#0"}, + "north": {"uv": [9.5, 16, 10.5, 11], "texture": "#0"}, "east": {"uv": [11, 11, 16, 16], "texture": "#0", "cullface": "east"}, - "south": {"uv": [10.5, 11, 11.5, 16], "texture": "#0"}, - "west": {"uv": [6, 11, 11, 16], "texture": "#0"}, - "up": {"uv": [11.5, 16, 10.5, 11], "rotation": 180, "texture": "#0"}, - "down": {"uv": [10.5, 11, 11.5, 16], "texture": "#0"} + "south": {"uv": [10.5, 11, 9.5, 16], "texture": "#0"}, + "west": {"uv": [11, 11, 16, 16], "texture": "#0"}, + "up": {"uv": [9.5, 16, 10.5, 11], "rotation": 180, "texture": "#0"}, + "down": {"uv": [10.5, 11, 9.5, 16], "texture": "#0"} } } ] diff --git a/src/main/resources/assets/create/models/block/fluid_pipe/rim/north.json b/src/main/resources/assets/create/models/block/fluid_pipe/rim/north.json index 64aa7fc576..4a156087cd 100644 --- a/src/main/resources/assets/create/models/block/fluid_pipe/rim/north.json +++ b/src/main/resources/assets/create/models/block/fluid_pipe/rim/north.json @@ -12,11 +12,11 @@ "rotation": {"angle": 0, "axis": "y", "origin": [8, 28, 8]}, "faces": { "north": {"uv": [11, 11, 16, 16], "texture": "#0", "cullface": "north"}, - "east": {"uv": [10.5, 11, 11.5, 16], "texture": "#0"}, - "south": {"uv": [6, 11, 11, 16], "texture": "#0"}, - "west": {"uv": [11.5, 16, 10.5, 11], "texture": "#0"}, - "up": {"uv": [10.5, 11, 11.5, 16], "rotation": 270, "texture": "#0"}, - "down": {"uv": [11.5, 16, 10.5, 11], "rotation": 270, "texture": "#0"} + "east": {"uv": [10.5, 11, 9.5, 16], "texture": "#0"}, + "south": {"uv": [11, 11, 16, 16], "texture": "#0"}, + "west": {"uv": [9.5, 16, 10.5, 11], "texture": "#0"}, + "up": {"uv": [10.5, 11, 9.5, 16], "rotation": 270, "texture": "#0"}, + "down": {"uv": [9.5, 16, 10.5, 11], "rotation": 270, "texture": "#0"} } } ] diff --git a/src/main/resources/assets/create/models/block/fluid_pipe/rim/south.json b/src/main/resources/assets/create/models/block/fluid_pipe/rim/south.json index 60e2628b8c..b5149551d4 100644 --- a/src/main/resources/assets/create/models/block/fluid_pipe/rim/south.json +++ b/src/main/resources/assets/create/models/block/fluid_pipe/rim/south.json @@ -11,12 +11,12 @@ "to": [13, 13, 16], "rotation": {"angle": 0, "axis": "y", "origin": [8, 28, 8]}, "faces": { - "north": {"uv": [6, 11, 11, 16], "texture": "#0"}, - "east": {"uv": [11.5, 16, 10.5, 11], "texture": "#0"}, + "north": {"uv": [11, 11, 16, 16], "texture": "#0"}, + "east": {"uv": [9.5, 16, 10.5, 11], "texture": "#0"}, "south": {"uv": [11, 11, 16, 16], "texture": "#0", "cullface": "south"}, - "west": {"uv": [10.5, 11, 11.5, 16], "texture": "#0"}, - "up": {"uv": [11.5, 16, 10.5, 11], "rotation": 270, "texture": "#0"}, - "down": {"uv": [10.5, 11, 11.5, 16], "rotation": 270, "texture": "#0"} + "west": {"uv": [10.5, 11, 9.5, 16], "texture": "#0"}, + "up": {"uv": [9.5, 16, 10.5, 11], "rotation": 270, "texture": "#0"}, + "down": {"uv": [10.5, 11, 9.5, 16], "rotation": 270, "texture": "#0"} } } ] diff --git a/src/main/resources/assets/create/models/block/fluid_pipe/rim/up.json b/src/main/resources/assets/create/models/block/fluid_pipe/rim/up.json index 8bbeb696c4..0c43110415 100644 --- a/src/main/resources/assets/create/models/block/fluid_pipe/rim/up.json +++ b/src/main/resources/assets/create/models/block/fluid_pipe/rim/up.json @@ -10,12 +10,12 @@ "from": [3, 14, 3], "to": [13, 16, 13], "faces": { - "north": {"uv": [11.5, 16, 10.5, 11], "rotation": 90, "texture": "#0"}, - "east": {"uv": [11.5, 16, 10.5, 11], "rotation": 90, "texture": "#0"}, - "south": {"uv": [11.5, 16, 10.5, 11], "rotation": 90, "texture": "#0"}, - "west": {"uv": [11.5, 16, 10.5, 11], "rotation": 90, "texture": "#0"}, + "north": {"uv": [9.5, 16, 10.5, 11], "rotation": 90, "texture": "#0"}, + "east": {"uv": [9.5, 16, 10.5, 11], "rotation": 90, "texture": "#0"}, + "south": {"uv": [9.5, 16, 10.5, 11], "rotation": 90, "texture": "#0"}, + "west": {"uv": [9.5, 16, 10.5, 11], "rotation": 90, "texture": "#0"}, "up": {"uv": [11, 11, 16, 16], "rotation": 90, "texture": "#0", "cullface": "up"}, - "down": {"uv": [6, 11, 11, 16], "rotation": 270, "texture": "#0"} + "down": {"uv": [11, 11, 16, 16], "rotation": 270, "texture": "#0"} } } ] diff --git a/src/main/resources/assets/create/models/block/fluid_pipe/rim/west.json b/src/main/resources/assets/create/models/block/fluid_pipe/rim/west.json index 35edc6555b..31647f043f 100644 --- a/src/main/resources/assets/create/models/block/fluid_pipe/rim/west.json +++ b/src/main/resources/assets/create/models/block/fluid_pipe/rim/west.json @@ -10,12 +10,12 @@ "from": [0, 3, 3], "to": [2, 13, 13], "faces": { - "north": {"uv": [10.5, 11, 11.5, 16], "texture": "#0"}, - "east": {"uv": [6, 11, 11, 16], "texture": "#0"}, - "south": {"uv": [11.5, 16, 10.5, 11], "texture": "#0"}, + "north": {"uv": [10.5, 11, 9.5, 16], "texture": "#0"}, + "east": {"uv": [11, 11, 16, 16], "texture": "#0"}, + "south": {"uv": [9.5, 16, 10.5, 11], "texture": "#0"}, "west": {"uv": [11, 11, 16, 16], "texture": "#0", "cullface": "west"}, - "up": {"uv": [10.5, 11, 11.5, 16], "rotation": 180, "texture": "#0"}, - "down": {"uv": [11.5, 16, 10.5, 11], "texture": "#0"} + "up": {"uv": [10.5, 11, 9.5, 16], "rotation": 180, "texture": "#0"}, + "down": {"uv": [9.5, 16, 10.5, 11], "texture": "#0"} } } ] diff --git a/src/main/resources/assets/create/models/block/fluid_pipe/rim_connector/down.json b/src/main/resources/assets/create/models/block/fluid_pipe/rim_connector/down.json index 648120364a..3cadc6daca 100644 --- a/src/main/resources/assets/create/models/block/fluid_pipe/rim_connector/down.json +++ b/src/main/resources/assets/create/models/block/fluid_pipe/rim_connector/down.json @@ -7,13 +7,15 @@ }, "elements": [ { - "from": [4, 2, 4], + "name": "rim_down", + "from": [4, 0, 4], "to": [12, 4, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, -16]}, "faces": { - "north": {"uv": [0, 9, 4, 10], "texture": "#0"}, - "east": {"uv": [0, 9, 4, 10], "texture": "#0"}, - "south": {"uv": [4, 9, 0, 10], "texture": "#0"}, - "west": {"uv": [4, 9, 0, 10], "texture": "#0"} + "north": {"uv": [4, 6, 8, 8], "texture": "#0"}, + "east": {"uv": [4, 6, 8, 8], "texture": "#0"}, + "south": {"uv": [8, 6, 4, 8], "texture": "#0"}, + "west": {"uv": [8, 6, 4, 8], "texture": "#0"} } } ] diff --git a/src/main/resources/assets/create/models/block/fluid_pipe/rim_connector/east.json b/src/main/resources/assets/create/models/block/fluid_pipe/rim_connector/east.json index cf0f16ca97..2d2e212f3f 100644 --- a/src/main/resources/assets/create/models/block/fluid_pipe/rim_connector/east.json +++ b/src/main/resources/assets/create/models/block/fluid_pipe/rim_connector/east.json @@ -7,13 +7,15 @@ }, "elements": [ { + "name": "rim_east", "from": [12, 4, 4], - "to": [14, 12, 12], + "to": [16, 12, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, -16]}, "faces": { - "north": {"uv": [0, 9, 4, 10], "rotation": 90, "texture": "#0"}, - "south": {"uv": [0, 8, 4, 9], "rotation": 90, "texture": "#0"}, - "up": {"uv": [4, 8, 0, 9], "rotation": 90, "texture": "#0"}, - "down": {"uv": [4, 9, 0, 10], "rotation": 270, "texture": "#0"} + "north": {"uv": [4, 6, 8, 8], "rotation": 90, "texture": "#0"}, + "south": {"uv": [4, 8, 8, 6], "rotation": 90, "texture": "#0"}, + "up": {"uv": [4, 8, 8, 6], "rotation": 90, "texture": "#0"}, + "down": {"uv": [4, 6, 8, 8], "rotation": 270, "texture": "#0"} } } ] diff --git a/src/main/resources/assets/create/models/block/fluid_pipe/rim_connector/north.json b/src/main/resources/assets/create/models/block/fluid_pipe/rim_connector/north.json index c333936ec7..3760310c4d 100644 --- a/src/main/resources/assets/create/models/block/fluid_pipe/rim_connector/north.json +++ b/src/main/resources/assets/create/models/block/fluid_pipe/rim_connector/north.json @@ -7,14 +7,15 @@ }, "elements": [ { - "from": [4, 4, 2], + "name": "rim_north", + "from": [4, 4, 0], "to": [12, 12, 4], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "rotation": {"angle": 0, "axis": "y", "origin": [0, 8, 0]}, "faces": { - "east": {"uv": [0, 8, 4, 9], "rotation": 90, "texture": "#0"}, - "west": {"uv": [0, 9, 4, 10], "rotation": 90, "texture": "#0"}, - "up": {"uv": [0, 9, 4, 10], "rotation": 180, "texture": "#0"}, - "down": {"uv": [0, 8, 4, 9], "rotation": 180, "texture": "#0"} + "east": {"uv": [4, 0, 8, 2], "rotation": 90, "texture": "#0"}, + "west": {"uv": [4, 2, 8, 0], "rotation": 90, "texture": "#0"}, + "up": {"uv": [4, 2, 8, 0], "rotation": 180, "texture": "#0"}, + "down": {"uv": [4, 0, 8, 2], "rotation": 180, "texture": "#0"} } } ] diff --git a/src/main/resources/assets/create/models/block/fluid_pipe/rim_connector/south.json b/src/main/resources/assets/create/models/block/fluid_pipe/rim_connector/south.json index 2263f7fd37..0c4d98571a 100644 --- a/src/main/resources/assets/create/models/block/fluid_pipe/rim_connector/south.json +++ b/src/main/resources/assets/create/models/block/fluid_pipe/rim_connector/south.json @@ -7,14 +7,15 @@ }, "elements": [ { + "name": "rim_south", "from": [4, 4, 12], - "to": [12, 12, 14], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "to": [12, 12, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 8, 0]}, "faces": { - "east": {"uv": [0, 9, 4, 10], "rotation": 90, "texture": "#0"}, - "west": {"uv": [0, 8, 4, 9], "rotation": 90, "texture": "#0"}, - "up": {"uv": [0, 8, 4, 9], "rotation": 180, "texture": "#0"}, - "down": {"uv": [0, 9, 4, 10], "rotation": 180, "texture": "#0"} + "east": {"uv": [4, 6, 8, 8], "rotation": 90, "texture": "#0"}, + "west": {"uv": [4, 8, 8, 6], "rotation": 90, "texture": "#0"}, + "up": {"uv": [4, 8, 8, 6], "rotation": 180, "texture": "#0"}, + "down": {"uv": [4, 6, 8, 8], "rotation": 180, "texture": "#0"} } } ] diff --git a/src/main/resources/assets/create/models/block/fluid_pipe/rim_connector/up.json b/src/main/resources/assets/create/models/block/fluid_pipe/rim_connector/up.json index ea375691d6..b003499856 100644 --- a/src/main/resources/assets/create/models/block/fluid_pipe/rim_connector/up.json +++ b/src/main/resources/assets/create/models/block/fluid_pipe/rim_connector/up.json @@ -7,13 +7,15 @@ }, "elements": [ { + "name": "rim_up", "from": [4, 12, 4], - "to": [12, 14, 12], + "to": [12, 16, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, -16]}, "faces": { - "north": {"uv": [0, 8, 4, 9], "texture": "#0"}, - "east": {"uv": [0, 8, 4, 9], "texture": "#0"}, - "south": {"uv": [4, 8, 0, 9], "texture": "#0"}, - "west": {"uv": [4, 8, 0, 9], "texture": "#0"} + "north": {"uv": [4, 0, 8, 2], "texture": "#0"}, + "east": {"uv": [4, 0, 8, 2], "texture": "#0"}, + "south": {"uv": [8, 0, 4, 2], "texture": "#0"}, + "west": {"uv": [8, 0, 4, 2], "texture": "#0"} } } ] diff --git a/src/main/resources/assets/create/models/block/fluid_pipe/rim_connector/west.json b/src/main/resources/assets/create/models/block/fluid_pipe/rim_connector/west.json index d9f97cb89a..3bd38ddfa9 100644 --- a/src/main/resources/assets/create/models/block/fluid_pipe/rim_connector/west.json +++ b/src/main/resources/assets/create/models/block/fluid_pipe/rim_connector/west.json @@ -7,13 +7,15 @@ }, "elements": [ { - "from": [2, 4, 4], + "name": "rim_west", + "from": [0, 4, 4], "to": [4, 12, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, -16]}, "faces": { - "north": {"uv": [0, 8, 4, 9], "rotation": 90, "texture": "#0"}, - "south": {"uv": [0, 9, 4, 10], "rotation": 90, "texture": "#0"}, - "up": {"uv": [4, 9, 0, 10], "rotation": 90, "texture": "#0"}, - "down": {"uv": [4, 8, 0, 9], "rotation": 270, "texture": "#0"} + "north": {"uv": [4, 0, 8, 2], "rotation": 90, "texture": "#0"}, + "south": {"uv": [4, 2, 8, 0], "rotation": 90, "texture": "#0"}, + "up": {"uv": [4, 2, 8, 0], "rotation": 90, "texture": "#0"}, + "down": {"uv": [4, 0, 8, 2], "rotation": 270, "texture": "#0"} } } ] diff --git a/src/main/resources/assets/create/models/block/fluid_pipe/window.json b/src/main/resources/assets/create/models/block/fluid_pipe/window.json index 65c4c2ad45..ad3d20fc45 100644 --- a/src/main/resources/assets/create/models/block/fluid_pipe/window.json +++ b/src/main/resources/assets/create/models/block/fluid_pipe/window.json @@ -3,7 +3,7 @@ "parent": "block/block", "textures": { "0": "create:block/glass_fluid_pipe", - "particle": "create:block/copper_plating" + "particle": "block/copper_block" }, "elements": [ { @@ -19,66 +19,32 @@ }, { "name": "Inner", - "from": [4, 0, 11.9], - "to": [12, 16, 11.9], - "faces": { - "north": {"uv": [0, 8, 16, 16], "rotation": 90, "texture": "#0"} - } - }, - { - "name": "Inner", - "from": [4.1, 0, 4], - "to": [4.1, 16, 12], - "faces": { - "east": {"uv": [0, 8, 16, 16], "rotation": 90, "texture": "#0"} - } - }, - { - "name": "Inner", - "from": [4, 0, 4.1], - "to": [12, 16, 4.1], - "faces": { - "south": {"uv": [0, 8, 16, 16], "rotation": 90, "texture": "#0"} - } - }, - { - "name": "Inner", - "from": [11.9, 0, 4], - "to": [11.9, 16, 12], + "from": [4.1, 0, 11.9], + "to": [11.9, 16, 4.1], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 8]}, "faces": { + "north": {"uv": [0, 16, 16, 8], "rotation": 90, "texture": "#0"}, + "east": {"uv": [0, 16, 16, 8], "rotation": 90, "texture": "#0"}, + "south": {"uv": [0, 8, 16, 16], "rotation": 90, "texture": "#0"}, "west": {"uv": [0, 8, 16, 16], "rotation": 90, "texture": "#0"} } }, { - "from": [4, 0, 4], - "to": [6, 16, 6], + "from": [10, 0, 4], + "to": [6, 16, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "east": {"uv": [0, 14, 16, 16], "rotation": 90, "texture": "#0"}, - "south": {"uv": [0, 8, 16, 10], "rotation": 90, "texture": "#0"} + "east": {"uv": [0, 0, 16, 8], "rotation": 90, "texture": "#0"}, + "west": {"uv": [0, 0, 16, 8], "rotation": 90, "texture": "#0"} } }, { "from": [4, 0, 10], - "to": [6, 16, 12], - "faces": { - "north": {"uv": [0, 10, 16, 8], "rotation": 90, "texture": "#0"}, - "east": {"uv": [0, 16, 16, 14], "rotation": 90, "texture": "#0"} - } - }, - { - "from": [10, 0, 4], "to": [12, 16, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [4, 0, 10]}, "faces": { - "south": {"uv": [0, 14, 16, 16], "rotation": 90, "texture": "#0"}, - "west": {"uv": [0, 8, 16, 10], "rotation": 90, "texture": "#0"} - } - }, - { - "from": [10, 0, 10], - "to": [12, 16, 12], - "faces": { - "north": {"uv": [0, 16, 16, 14], "rotation": 90, "texture": "#0"}, - "west": {"uv": [0, 10, 16, 8], "rotation": 90, "texture": "#0"} + "north": {"uv": [0, 0, 16, 8], "rotation": 90, "texture": "#0"}, + "south": {"uv": [0, 0, 16, 8], "rotation": 90, "texture": "#0"} } } ] diff --git a/src/main/resources/assets/create/models/block/fluid_pipe/window_alt.json b/src/main/resources/assets/create/models/block/fluid_pipe/window_alt.json deleted file mode 100644 index 6670d228d3..0000000000 --- a/src/main/resources/assets/create/models/block/fluid_pipe/window_alt.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "credit": "Made with Blockbench", - "parent": "block/block", - "textures": { - "0": "create:block/glass_fluid_pipe", - "particle": "#0" - }, - "elements": [ - { - "name": "Outer", - "from": [4, 0, 4], - "to": [12, 16, 12], - "shade": false, - "faces": { - "north": {"uv": [0, 0, 16, 8], "rotation": 90, "texture": "#0"}, - "east": {"uv": [0, 0, 16, 8], "rotation": 90, "texture": "#0"}, - "south": {"uv": [0, 0, 16, 8], "rotation": 90, "texture": "#0"}, - "west": {"uv": [0, 0, 16, 8], "rotation": 90, "texture": "#0"} - } - }, - { - "name": "Inner", - "from": [4, 0, 11.5], - "to": [12, 16, 11.5], - "shade": false, - "faces": { - "north": {"uv": [0, 0, 16, 8], "rotation": 90, "texture": "#0"} - } - }, - { - "name": "Inner", - "from": [4, 0, 4.5], - "to": [12, 16, 4.5], - "shade": false, - "faces": { - "south": {"uv": [0, 0, 16, 8], "rotation": 90, "texture": "#0"} - } - }, - { - "name": "Inner", - "from": [4.5, 0, 4], - "to": [4.5, 16, 12], - "shade": false, - "faces": { - "east": {"uv": [0, 0, 16, 8], "rotation": 90, "texture": "#0"} - } - }, - { - "name": "Inner", - "from": [11.5, 0, 4], - "to": [11.5, 16, 12], - "shade": false, - "faces": { - "west": {"uv": [0, 0, 16, 8], "rotation": 90, "texture": "#0"} - } - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/mechanical_pump/block.json b/src/main/resources/assets/create/models/block/mechanical_pump/block.json index a38904e464..34cb63ef75 100644 --- a/src/main/resources/assets/create/models/block/mechanical_pump/block.json +++ b/src/main/resources/assets/create/models/block/mechanical_pump/block.json @@ -2,105 +2,34 @@ "credit": "Made with Blockbench", "parent": "create:block/block", "textures": { - "2": "create:block/pipes", "4": "create:block/pump", "particle": "create:block/pump" }, "elements": [ { - "name": "middle", - "from": [4, 4, 4], - "to": [12, 12, 12], - "rotation": {"angle": 0, "axis": "z", "origin": [8.33333, 8.5, 8]}, + "from": [2, 13, 2], + "to": [14, 16, 14], + "rotation": {"angle": 0, "axis": "z", "origin": [8, 14.5, 8]}, "faces": { - "north": {"uv": [0, 6.5, 4, 2.5], "rotation": 90, "texture": "#2"}, - "east": {"uv": [0, 6.5, 4, 2.5], "rotation": 90, "texture": "#2"}, - "south": {"uv": [0, 6.5, 4, 2.5], "rotation": 90, "texture": "#2"}, - "west": {"uv": [0, 6.5, 4, 2.5], "rotation": 90, "texture": "#2"}, - "up": {"uv": [0, 6.5, 4, 2.5], "rotation": 90, "texture": "#2"}, - "down": {"uv": [0, 6.5, 4, 2.5], "rotation": 90, "texture": "#2"} + "north": {"uv": [8, 0, 6.5, 6], "rotation": 270, "texture": "#4"}, + "east": {"uv": [8, 0, 6.5, 6], "rotation": 270, "texture": "#4"}, + "south": {"uv": [8, 0, 6.5, 6], "rotation": 270, "texture": "#4"}, + "west": {"uv": [8, 0, 6.5, 6], "rotation": 270, "texture": "#4"}, + "up": {"uv": [0, 0, 6, 6], "rotation": 180, "texture": "#4"}, + "down": {"uv": [0, 0, 6, 6], "texture": "#4"} } }, { - "name": "back", "from": [2, 0, 2], - "to": [14, 5, 14], - "rotation": {"angle": 0, "axis": "z", "origin": [8.33333, 8.5, 8]}, + "to": [14, 3, 14], + "rotation": {"angle": 0, "axis": "z", "origin": [8, 1.5, 8]}, "faces": { - "north": {"uv": [13.5, 2, 16, 8], "rotation": 270, "texture": "#2"}, - "east": {"uv": [13.5, 2, 16, 8], "rotation": 270, "texture": "#2"}, - "south": {"uv": [13.5, 2, 16, 8], "rotation": 270, "texture": "#2"}, - "west": {"uv": [13.5, 2, 16, 8], "rotation": 270, "texture": "#2"}, - "up": {"uv": [0, 0, 12, 12], "rotation": 180, "texture": "#4"}, - "down": {"uv": [0, 0, 12, 12], "texture": "#4"} - } - }, - { - "name": "front", - "from": [3, 11, 3], - "to": [13, 16, 13], - "rotation": {"angle": 0, "axis": "z", "origin": [8.33333, 8.5, 8]}, - "faces": { - "north": {"uv": [10.5, 2.5, 13, 7.5], "rotation": 90, "texture": "#2"}, - "east": {"uv": [10.5, 2.5, 13, 7.5], "rotation": 90, "texture": "#2"}, - "south": {"uv": [10.5, 2.5, 13, 7.5], "rotation": 90, "texture": "#2"}, - "west": {"uv": [10.5, 2.5, 13, 7.5], "rotation": 90, "texture": "#2"}, - "up": {"uv": [11, 11, 16, 16], "texture": "#2"}, - "down": {"uv": [6, 11, 11, 16], "texture": "#2"} - } - }, - { - "from": [5.85355, 13.25, 1.75], - "to": [9.85355, 15.25, 13.75], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": 45, "axis": "z", "origin": [8.35355, 13.25, 7.75]}, - "faces": { - "north": {"uv": [16, 0, 12, 2], "texture": "#4"}, - "east": {"uv": [15, 0, 16, 2], "texture": "#4"}, - "south": {"uv": [12, 0, 16, 2], "texture": "#4"}, - "west": {"uv": [12, 0, 13, 2], "texture": "#4"}, - "up": {"uv": [12, 0, 16, 1], "texture": "#4"}, - "down": {"uv": [12, 1, 16, 2], "texture": "#4"} - } - }, - { - "from": [7.85355, 11.25, 1.75], - "to": [9.85355, 13.25, 13.75], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": 45, "axis": "z", "origin": [8.35355, 13.25, 7.75]}, - "faces": { - "north": {"uv": [16, 2, 14, 4], "texture": "#4"}, - "east": {"uv": [15, 2, 16, 4], "texture": "#4"}, - "south": {"uv": [14, 2, 16, 4], "texture": "#4"}, - "west": {"uv": [14, 2, 15, 4], "texture": "#4"}, - "down": {"uv": [14, 3, 16, 4], "texture": "#4"} - } - }, - { - "from": [2.35355, 10.75, 7.75], - "to": [14.35355, 12.75, 9.75], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": -45, "axis": "x", "origin": [8.35355, 13.25, 7.75]}, - "faces": { - "north": {"uv": [14, 2, 15, 4], "texture": "#4"}, - "east": {"uv": [16, 2, 14, 4], "texture": "#4"}, - "south": {"uv": [15, 2, 16, 4], "texture": "#4"}, - "west": {"uv": [14, 2, 16, 4], "texture": "#4"}, - "down": {"uv": [14, 3, 16, 4], "rotation": 270, "texture": "#4"} - } - }, - { - "from": [2.35355, 12.75, 5.75], - "to": [14.35355, 14.75, 9.75], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": -45, "axis": "x", "origin": [8.35355, 13.25, 7.75]}, - "faces": { - "north": {"uv": [12, 0, 13, 2], "texture": "#4"}, - "east": {"uv": [16, 0, 12, 2], "texture": "#4"}, - "south": {"uv": [15, 0, 16, 2], "texture": "#4"}, - "west": {"uv": [12, 0, 16, 2], "texture": "#4"}, - "up": {"uv": [12, 0, 16, 1], "rotation": 90, "texture": "#4"}, - "down": {"uv": [12, 1, 16, 2], "rotation": 270, "texture": "#4"} + "north": {"uv": [8, 0, 6.5, 6], "rotation": 270, "texture": "#4"}, + "east": {"uv": [8, 0, 6.5, 6], "rotation": 270, "texture": "#4"}, + "south": {"uv": [8, 0, 6.5, 6], "rotation": 270, "texture": "#4"}, + "west": {"uv": [8, 0, 6.5, 6], "rotation": 270, "texture": "#4"}, + "up": {"uv": [0, 0, 6, 6], "rotation": 180, "texture": "#4"}, + "down": {"uv": [0, 0, 6, 6], "texture": "#4"} } } ], @@ -134,17 +63,5 @@ "fixed": { "scale": [0.5, 0.5, 0.5] } - }, - "groups": [ - { - "name": "pump", - "origin": [8, 8, 8], - "color": 0, - "children": [0, 1, 2] - }, - 3, - 4, - 5, - 6 - ] -} + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/mechanical_pump/cog.json b/src/main/resources/assets/create/models/block/mechanical_pump/cog.json index 53cbe69bd2..007f00c0c1 100644 --- a/src/main/resources/assets/create/models/block/mechanical_pump/cog.json +++ b/src/main/resources/assets/create/models/block/mechanical_pump/cog.json @@ -3,80 +3,103 @@ "parent": "block/block", "texture_size": [32, 32], "textures": { - "5": "create:block/millstone", - "particle": "create:block/palettes/stone_types/cut/andesite_cut" + "2": "create:block/pump" }, "elements": [ { - "name": "Gear6", - "from": [6.5, -1, 5], - "to": [9.5, 17, 11], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 6.5]}, + "from": [6.5, -1, 3], + "to": [9.5, 17, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [0, 8.5, 9, 10], "rotation": 90, "texture": "#5"}, - "east": {"uv": [0, 10, 9, 13], "rotation": 270, "texture": "#5"}, - "south": {"uv": [0, 8.5, 9, 10], "rotation": 90, "texture": "#5"}, - "west": {"uv": [0, 10, 9, 13], "rotation": 90, "texture": "#5"}, - "up": {"uv": [9, 10, 10.5, 13], "rotation": 180, "texture": "#5"}, - "down": {"uv": [9, 10, 10.5, 13], "texture": "#5"} + "north": {"uv": [0, 6.5, 9, 8], "rotation": 90, "texture": "#2"}, + "east": {"uv": [0, 9, 9, 14], "rotation": 270, "texture": "#2"}, + "south": {"uv": [0, 6.5, 9, 8], "rotation": 90, "texture": "#2"}, + "west": {"uv": [0, 9, 9, 14], "rotation": 90, "texture": "#2"}, + "up": {"uv": [10, 6.5, 15, 8], "rotation": 90, "texture": "#2"}, + "down": {"uv": [10, 6.5, 15, 8], "rotation": 90, "texture": "#2"} } }, { - "name": "Gear7", - "from": [6.5, -1, 5], - "to": [9.5, 17, 11], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": 45, "axis": "z", "origin": [8, 8, 6.5]}, + "from": [-1, 6.5, 3], + "to": [17, 9.5, 13], + "rotation": {"angle": 0, "axis": "z", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [0, 8.5, 9, 10], "rotation": 90, "texture": "#5"}, - "east": {"uv": [0, 10, 9, 13], "rotation": 270, "texture": "#5"}, - "south": {"uv": [0, 8.5, 9, 10], "rotation": 90, "texture": "#5"}, - "west": {"uv": [0, 10, 9, 13], "rotation": 90, "texture": "#5"}, - "up": {"uv": [9, 10, 10.5, 13], "rotation": 180, "texture": "#5"}, - "down": {"uv": [9, 10, 10.5, 13], "texture": "#5"} + "north": {"uv": [0, 6.5, 9, 8], "rotation": 180, "texture": "#2"}, + "east": {"uv": [10, 6.5, 15, 8], "texture": "#2"}, + "south": {"uv": [0, 6.5, 9, 8], "texture": "#2"}, + "west": {"uv": [10, 6.5, 15, 8], "texture": "#2"}, + "up": {"uv": [0, 9, 9, 14], "rotation": 180, "texture": "#2"}, + "down": {"uv": [0, 9, 9, 14], "texture": "#2"} } }, { - "name": "Gear8", - "from": [-1, 6.5, 5], - "to": [17, 9.5, 11], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": 45, "axis": "z", "origin": [8, 8, 6.5]}, + "from": [6.5, -1, 3], + "to": [9.5, 17, 13], + "rotation": {"angle": 45, "axis": "z", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [0, 8.5, 9, 10], "texture": "#5"}, - "east": {"uv": [9, 10, 10.5, 13], "rotation": 270, "texture": "#5"}, - "south": {"uv": [0, 8.5, 9, 10], "texture": "#5"}, - "west": {"uv": [9, 10, 10.5, 13], "rotation": 90, "texture": "#5"}, - "up": {"uv": [0, 10, 9, 13], "rotation": 180, "texture": "#5"}, - "down": {"uv": [0, 10, 9, 13], "texture": "#5"} + "north": {"uv": [0, 6.5, 9, 8], "rotation": 90, "texture": "#2"}, + "east": {"uv": [0, 9, 9, 14], "rotation": 270, "texture": "#2"}, + "south": {"uv": [0, 6.5, 9, 8], "rotation": 90, "texture": "#2"}, + "west": {"uv": [0, 9, 9, 14], "rotation": 90, "texture": "#2"}, + "up": {"uv": [10, 6.5, 15, 8], "rotation": 90, "texture": "#2"}, + "down": {"uv": [10, 6.5, 15, 8], "rotation": 90, "texture": "#2"} } }, { - "name": "Gear8", - "from": [-1, 6.5, 5], - "to": [17, 9.5, 11], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 6.5]}, + "from": [-1, 6.5, 3], + "to": [17, 9.5, 13], + "rotation": {"angle": 45, "axis": "z", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [0, 8.5, 9, 10], "texture": "#5"}, - "east": {"uv": [9, 10, 10.5, 13], "rotation": 270, "texture": "#5"}, - "south": {"uv": [0, 8.5, 9, 10], "texture": "#5"}, - "west": {"uv": [9, 10, 10.5, 13], "rotation": 90, "texture": "#5"}, - "up": {"uv": [0, 10, 9, 13], "rotation": 180, "texture": "#5"}, - "down": {"uv": [0, 10, 9, 13], "texture": "#5"} + "north": {"uv": [0, 6.5, 9, 8], "rotation": 180, "texture": "#2"}, + "east": {"uv": [10, 6.5, 15, 8], "texture": "#2"}, + "south": {"uv": [0, 6.5, 9, 8], "texture": "#2"}, + "west": {"uv": [10, 6.5, 15, 8], "texture": "#2"}, + "up": {"uv": [0, 9, 9, 14], "rotation": 180, "texture": "#2"}, + "down": {"uv": [0, 9, 9, 14], "texture": "#2"} } }, { - "name": "GearCaseInner", - "from": [2, 2, 5.5], - "to": [14, 14, 10.5], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 7]}, + "from": [5.5, 0.9, 3.05], + "to": [10.5, 15.1, 12.95], + "rotation": {"angle": 22.5, "axis": "z", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [0, 0, 6, 6], "rotation": 180, "texture": "#5"}, - "east": {"uv": [0, 6, 6, 8.5], "rotation": 270, "texture": "#5"}, - "south": {"uv": [0, 0, 6, 6], "texture": "#5"}, - "west": {"uv": [0, 6, 6, 8.5], "rotation": 90, "texture": "#5"}, - "up": {"uv": [0, 6, 6, 8.5], "rotation": 180, "texture": "#5"}, - "down": {"uv": [0, 6, 6, 8.5], "texture": "#5"} + "north": {"uv": [1, 7, 1.5, 7.5], "texture": "#2"}, + "south": {"uv": [1, 7, 1.5, 7.5], "texture": "#2"}, + "up": {"uv": [10, 9, 15, 11.5], "rotation": 90, "texture": "#2"}, + "down": {"uv": [10, 9, 15, 11.5], "rotation": 90, "texture": "#2"} + } + }, + { + "from": [0.9, 5.5, 3.05], + "to": [15.1, 10.5, 12.95], + "rotation": {"angle": -22.5, "axis": "z", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [1, 7, 1.5, 7.5], "rotation": 90, "texture": "#2"}, + "east": {"uv": [10, 9, 15, 11.5], "texture": "#2"}, + "south": {"uv": [1, 7, 1.5, 7.5], "rotation": 270, "texture": "#2"}, + "west": {"uv": [10, 9, 15, 11.5], "texture": "#2"} + } + }, + { + "from": [0.9, 5.5, 3.05], + "to": [15.1, 10.5, 12.95], + "rotation": {"angle": 22.5, "axis": "z", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [1, 7, 1.5, 7.5], "rotation": 90, "texture": "#2"}, + "east": {"uv": [10, 9, 15, 11.5], "texture": "#2"}, + "south": {"uv": [1, 7, 1.5, 7.5], "rotation": 270, "texture": "#2"}, + "west": {"uv": [10, 9, 15, 11.5], "texture": "#2"} + } + }, + { + "from": [5.5, 0.9, 3.05], + "to": [10.5, 15.1, 12.95], + "rotation": {"angle": -22.5, "axis": "z", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [1, 7, 1.5, 7.5], "texture": "#2"}, + "south": {"uv": [1, 7, 1.5, 7.5], "texture": "#2"}, + "up": {"uv": [10, 9, 15, 11.5], "rotation": 90, "texture": "#2"}, + "down": {"uv": [10, 9, 15, 11.5], "rotation": 90, "texture": "#2"} } } ], @@ -119,7 +142,13 @@ "name": "cogwheel", "origin": [8, 8, 8], "color": 0, - "children": [0, 1, 2, 3, 4] + "children": [0, 1, 2, 3] + }, + { + "name": "group", + "origin": [8, 8, 8], + "color": 0, + "children": [4, 5, 6, 7] } ] -} +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/mechanical_pump/item.json b/src/main/resources/assets/create/models/block/mechanical_pump/item.json index 0e52322468..c7c386ec63 100644 --- a/src/main/resources/assets/create/models/block/mechanical_pump/item.json +++ b/src/main/resources/assets/create/models/block/mechanical_pump/item.json @@ -1,179 +1,132 @@ { "credit": "Made with Blockbench", "parent": "create:block/block", + "texture_size": [32, 32], "textures": { - "2": "create:block/pipes", "4": "create:block/pump", - "5": "create:block/millstone", "particle": "create:block/pump" }, "elements": [ { - "name": "Gear5", - "from": [5.5, 7, -1], - "to": [11.5, 10, 17], - "rotation": {"angle": 0, "axis": "y", "origin": [8.5, 8.5, 8]}, - "faces": { - "north": {"uv": [9, 10, 10.5, 13], "rotation": 90, "texture": "#5"}, - "east": {"uv": [0, 8.5, 9, 10], "texture": "#5"}, - "south": {"uv": [9, 10, 10.5, 13], "rotation": 270, "texture": "#5"}, - "west": {"uv": [0, 8.5, 9, 10], "texture": "#5"}, - "up": {"uv": [0, 10, 9, 13], "rotation": 270, "texture": "#5"}, - "down": {"uv": [0, 10, 9, 13], "rotation": 270, "texture": "#5"} - } - }, - { - "name": "Gear6", - "from": [5.5, 7, -1], - "to": [11.5, 10, 17], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": -45, "axis": "x", "origin": [8.5, 8.5, 8]}, - "faces": { - "north": {"uv": [9, 10, 10.5, 13], "rotation": 90, "texture": "#5"}, - "east": {"uv": [0, 8.5, 9, 10], "texture": "#5"}, - "south": {"uv": [9, 10, 10.5, 13], "rotation": 270, "texture": "#5"}, - "west": {"uv": [0, 8.5, 9, 10], "texture": "#5"}, - "up": {"uv": [0, 10, 9, 13], "rotation": 270, "texture": "#5"}, - "down": {"uv": [0, 10, 9, 13], "rotation": 270, "texture": "#5"} - } - }, - { - "name": "Gear7", - "from": [5.5, -0.5, 6.5], - "to": [11.5, 17.5, 9.5], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": -45, "axis": "x", "origin": [8.5, 8.5, 8]}, - "faces": { - "north": {"uv": [0, 10, 9, 13], "rotation": 90, "texture": "#5"}, - "east": {"uv": [0, 8.5, 9, 10], "rotation": 90, "texture": "#5"}, - "south": {"uv": [0, 10, 9, 13], "rotation": 270, "texture": "#5"}, - "west": {"uv": [0, 8.5, 9, 10], "rotation": 270, "texture": "#5"}, - "up": {"uv": [9, 10, 10.5, 13], "rotation": 270, "texture": "#5"}, - "down": {"uv": [9, 10, 10.5, 13], "rotation": 270, "texture": "#5"} - } - }, - { - "name": "Gear7", - "from": [5.5, -0.5, 6.5], - "to": [11.5, 17.5, 9.5], - "rotation": {"angle": 0, "axis": "y", "origin": [8.5, 8.5, 8]}, - "faces": { - "north": {"uv": [0, 10, 9, 13], "rotation": 90, "texture": "#5"}, - "east": {"uv": [0, 8.5, 9, 10], "rotation": 90, "texture": "#5"}, - "south": {"uv": [0, 10, 9, 13], "rotation": 270, "texture": "#5"}, - "west": {"uv": [0, 8.5, 9, 10], "rotation": 270, "texture": "#5"}, - "up": {"uv": [9, 10, 10.5, 13], "rotation": 270, "texture": "#5"}, - "down": {"uv": [9, 10, 10.5, 13], "rotation": 270, "texture": "#5"} - } - }, - { - "name": "GearCaseInner", - "from": [6, 2.5, 2], - "to": [11, 14.5, 14], - "rotation": {"angle": 0, "axis": "y", "origin": [8.5, 8.5, 8]}, - "faces": { - "north": {"uv": [0, 6, 6, 8.5], "rotation": 90, "texture": "#5"}, - "east": {"uv": [0, 0, 6, 6], "rotation": 270, "texture": "#5"}, - "south": {"uv": [0, 6, 6, 8.5], "rotation": 270, "texture": "#5"}, - "west": {"uv": [0, 0, 6, 6], "rotation": 270, "texture": "#5"}, - "up": {"uv": [0, 6, 6, 8.5], "rotation": 270, "texture": "#5"}, - "down": {"uv": [0, 6, 6, 8.5], "rotation": 270, "texture": "#5"} - } - }, - { - "name": "middle", - "from": [4.5, 4.5, 4], - "to": [12.5, 12.5, 12], - "rotation": {"angle": 0, "axis": "y", "origin": [8.5, 8.5, 8]}, - "faces": { - "north": {"uv": [11.5, 15.5, 15.5, 11.5], "texture": "#2"}, - "east": {"uv": [11.5, 15.5, 15.5, 11.5], "texture": "#2"}, - "south": {"uv": [11.5, 15.5, 15.5, 11.5], "texture": "#2"}, - "west": {"uv": [11.5, 15.5, 15.5, 11.5], "texture": "#2"}, - "up": {"uv": [11.5, 15.5, 15.5, 11.5], "texture": "#2"}, - "down": {"uv": [11.5, 15.5, 15.5, 11.5], "texture": "#2"} - } - }, - { - "name": "front", - "from": [0.5, 3.5, 3], - "to": [5.5, 13.5, 13], + "from": [0, 2, 2], + "to": [3, 14, 14], "rotation": {"angle": 0, "axis": "z", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [10.5, 2.5, 13, 7.5], "rotation": 180, "texture": "#2"}, - "east": {"uv": [6, 11, 11, 16], "rotation": 270, "texture": "#2"}, - "south": {"uv": [10.5, 2.5, 13, 7.5], "texture": "#2"}, - "west": {"uv": [11, 11, 16, 16], "rotation": 270, "texture": "#2"}, - "up": {"uv": [10.5, 2.5, 13, 7.5], "texture": "#2"}, - "down": {"uv": [10.5, 2.5, 13, 7.5], "texture": "#2"} + "north": {"uv": [8, 0, 6.5, 6], "texture": "#4"}, + "east": {"uv": [0, 0, 6, 6], "rotation": 270, "texture": "#4"}, + "south": {"uv": [8, 0, 6.5, 6], "rotation": 180, "texture": "#4"}, + "west": {"uv": [0, 0, 6, 6], "rotation": 90, "texture": "#4"}, + "up": {"uv": [8, 0, 6.5, 6], "rotation": 180, "texture": "#4"}, + "down": {"uv": [8, 0, 6.5, 6], "rotation": 180, "texture": "#4"} } }, { - "name": "back", - "from": [11.5, 2.5, 2], - "to": [16.5, 14.5, 14], - "rotation": {"angle": 0, "axis": "y", "origin": [8.5, 11.5, 8]}, + "from": [13, 2, 2], + "to": [16, 14, 14], + "rotation": {"angle": 0, "axis": "z", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [13.5, 2, 16, 8], "texture": "#2"}, - "east": {"uv": [0, 0, 12, 12], "rotation": 270, "texture": "#4"}, - "south": {"uv": [13.5, 2, 16, 8], "rotation": 180, "texture": "#2"}, - "west": {"uv": [0, 0, 12, 12], "rotation": 90, "texture": "#4"}, - "up": {"uv": [13.5, 2, 16, 8], "rotation": 180, "texture": "#2"}, - "down": {"uv": [13.5, 2, 16, 8], "rotation": 180, "texture": "#2"} + "north": {"uv": [8, 0, 6.5, 6], "texture": "#4"}, + "east": {"uv": [0, 0, 6, 6], "rotation": 270, "texture": "#4"}, + "south": {"uv": [8, 0, 6.5, 6], "rotation": 180, "texture": "#4"}, + "west": {"uv": [0, 0, 6, 6], "rotation": 90, "texture": "#4"}, + "up": {"uv": [8, 0, 6.5, 6], "rotation": 180, "texture": "#4"}, + "down": {"uv": [8, 0, 6.5, 6], "rotation": 180, "texture": "#4"} } }, { - "from": [1.70355, 6.15, 2], - "to": [3.70355, 10.15, 14], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": 45, "axis": "z", "origin": [3.35355, 8.25, 7.75]}, + "from": [3, -1, 6.5], + "to": [13, 17, 9.5], + "rotation": {"angle": 45, "axis": "x", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [16, 0, 12, 2], "rotation": 90, "texture": "#4"}, - "east": {"uv": [12, 1, 16, 2], "rotation": 270, "texture": "#4"}, - "south": {"uv": [12, 0, 16, 2], "rotation": 270, "texture": "#4"}, - "west": {"uv": [12, 0, 16, 1], "rotation": 270, "texture": "#4"}, - "up": {"uv": [15, 0, 16, 2], "rotation": 270, "texture": "#4"}, - "down": {"uv": [12, 0, 13, 2], "rotation": 270, "texture": "#4"} + "north": {"uv": [0, 9, 9, 14], "rotation": 270, "texture": "#4"}, + "east": {"uv": [0, 6.5, 9, 8], "rotation": 90, "texture": "#4"}, + "south": {"uv": [0, 9, 9, 14], "rotation": 90, "texture": "#4"}, + "west": {"uv": [0, 6.5, 9, 8], "rotation": 90, "texture": "#4"}, + "up": {"uv": [10, 6.5, 15, 8], "texture": "#4"}, + "down": {"uv": [10, 6.5, 15, 8], "rotation": 180, "texture": "#4"} } }, { - "from": [3.70355, 8.15, 2], - "to": [5.70355, 10.15, 14], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": 45, "axis": "z", "origin": [3.35355, 8.25, 7.75]}, + "from": [3, 6.5, -1], + "to": [13, 9.5, 17], + "rotation": {"angle": 45, "axis": "x", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [16, 2, 14, 4], "rotation": 90, "texture": "#4"}, - "east": {"uv": [14, 3, 16, 4], "rotation": 270, "texture": "#4"}, - "south": {"uv": [14, 2, 16, 4], "rotation": 270, "texture": "#4"}, - "up": {"uv": [15, 2, 16, 4], "rotation": 270, "texture": "#4"}, - "down": {"uv": [14, 2, 15, 4], "rotation": 270, "texture": "#4"} + "north": {"uv": [10, 6.5, 15, 8], "texture": "#4"}, + "east": {"uv": [0, 6.5, 9, 8], "texture": "#4"}, + "south": {"uv": [10, 6.5, 15, 8], "texture": "#4"}, + "west": {"uv": [0, 6.5, 9, 8], "rotation": 180, "texture": "#4"}, + "up": {"uv": [0, 9, 9, 14], "rotation": 90, "texture": "#4"}, + "down": {"uv": [0, 9, 9, 14], "rotation": 90, "texture": "#4"} } }, { - "from": [3.85355, 2.5, 7.75], - "to": [5.85355, 14.5, 9.75], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": -45, "axis": "y", "origin": [3.35355, 8.25, 7.75]}, + "from": [3, -1, 6.5], + "to": [13, 17, 9.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [14, 2, 15, 4], "rotation": 90, "texture": "#4"}, - "east": {"uv": [14, 3, 16, 4], "rotation": 180, "texture": "#4"}, - "south": {"uv": [15, 2, 16, 4], "rotation": 270, "texture": "#4"}, - "up": {"uv": [16, 2, 14, 4], "rotation": 270, "texture": "#4"}, - "down": {"uv": [14, 2, 16, 4], "rotation": 270, "texture": "#4"} + "north": {"uv": [0, 14, 9, 9], "rotation": 270, "texture": "#4"}, + "east": {"uv": [0, 6.5, 9, 8], "rotation": 90, "texture": "#4"}, + "south": {"uv": [0, 9, 9, 14], "rotation": 90, "texture": "#4"}, + "west": {"uv": [0, 6.5, 9, 8], "rotation": 90, "texture": "#4"}, + "up": {"uv": [10, 6.5, 15, 8], "texture": "#4"}, + "down": {"uv": [10, 8, 15, 6.5], "rotation": 180, "texture": "#4"} } }, { - "from": [1.85355, 2.5, 5.75], - "to": [3.85355, 14.5, 9.75], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": -45, "axis": "y", "origin": [3.35355, 8.25, 7.75]}, + "from": [3, 6.5, -1], + "to": [13, 9.5, 17], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [12, 0, 13, 2], "rotation": 90, "texture": "#4"}, - "east": {"uv": [12, 1, 16, 2], "rotation": 180, "texture": "#4"}, - "south": {"uv": [15, 0, 16, 2], "rotation": 270, "texture": "#4"}, - "west": {"uv": [12, 0, 16, 1], "texture": "#4"}, - "up": {"uv": [16, 0, 12, 2], "rotation": 270, "texture": "#4"}, - "down": {"uv": [12, 0, 16, 2], "rotation": 270, "texture": "#4"} + "north": {"uv": [10, 6.5, 15, 8], "texture": "#4"}, + "east": {"uv": [0, 6.5, 9, 8], "texture": "#4"}, + "south": {"uv": [10, 6.5, 15, 8], "texture": "#4"}, + "west": {"uv": [0, 6.5, 9, 8], "rotation": 180, "texture": "#4"}, + "up": {"uv": [0, 9, 9, 14], "rotation": 90, "texture": "#4"}, + "down": {"uv": [0, 9, 9, 14], "rotation": 90, "texture": "#4"} + } + }, + { + "from": [3.05, 0.9, 5.5], + "to": [12.95, 15.1, 10.5], + "rotation": {"angle": 22.5, "axis": "x", "origin": [8, 8, 8]}, + "faces": { + "east": {"uv": [1, 7, 1.5, 7.5], "texture": "#4"}, + "west": {"uv": [1, 7, 1.5, 7.5], "texture": "#4"}, + "up": {"uv": [10, 9, 15, 11.5], "texture": "#4"}, + "down": {"uv": [10, 9, 15, 11.5], "rotation": 180, "texture": "#4"} + } + }, + { + "from": [3.05, 5.5, 0.9], + "to": [12.95, 10.5, 15.1], + "rotation": {"angle": 22.5, "axis": "x", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10, 9, 15, 11.5], "texture": "#4"}, + "east": {"uv": [1, 7, 1.5, 7.5], "rotation": 270, "texture": "#4"}, + "south": {"uv": [10, 9, 15, 11.5], "texture": "#4"}, + "west": {"uv": [1, 7, 1.5, 7.5], "rotation": 90, "texture": "#4"} + } + }, + { + "from": [3.05, 0.9, 5.5], + "to": [12.95, 15.1, 10.5], + "rotation": {"angle": -22.5, "axis": "x", "origin": [8, 8, 8]}, + "faces": { + "east": {"uv": [1, 7, 1.5, 7.5], "rotation": 180, "texture": "#4"}, + "west": {"uv": [1, 7, 1.5, 7.5], "rotation": 180, "texture": "#4"}, + "up": {"uv": [10, 9, 15, 11.5], "rotation": 180, "texture": "#4"}, + "down": {"uv": [10, 9, 15, 11.5], "texture": "#4"} + } + }, + { + "from": [3.05, 5.5, 0.9], + "to": [12.95, 10.5, 15.1], + "rotation": {"angle": -22.5, "axis": "x", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10, 9, 15, 11.5], "texture": "#4"}, + "east": {"uv": [1, 7, 1.5, 7.5], "rotation": 270, "texture": "#4"}, + "south": {"uv": [10, 9, 15, 11.5], "texture": "#4"}, + "west": {"uv": [1, 7, 1.5, 7.5], "rotation": 90, "texture": "#4"} } } ], @@ -207,25 +160,5 @@ "fixed": { "scale": [0.5, 0.5, 0.5] } - }, - "groups": [ - { - "name": "cogwheel", - "origin": [8, 8, 8], - "color": 0, - "children": [0, 1, 2, 3, 4] - }, - { - "name": "pump", - "origin": [8, 8, 8], - "color": 0, - "children": [5, 6, 7] - }, - { - "name": "Arrow", - "origin": [8, 8, 8], - "color": 0, - "children": [8, 9, 10, 11] - } - ] -} + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/smart_fluid_pipe/block.json b/src/main/resources/assets/create/models/block/smart_fluid_pipe/block.json index 613fdf15a4..87269c7a9b 100644 --- a/src/main/resources/assets/create/models/block/smart_fluid_pipe/block.json +++ b/src/main/resources/assets/create/models/block/smart_fluid_pipe/block.json @@ -4,20 +4,10 @@ "textures": { "2": "create:block/smart_pipe_1", "3": "create:block/smart_pipe_2", - "particle": "create:block/smart_pipe_2" + "4": "create:block/pipes", + "particle": "block/copper_block" }, "elements": [ - { - "from": [4.05, 4.05, 12], - "to": [11.95, 11.95, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 14]}, - "faces": { - "east": {"uv": [6, 3, 10, 11], "texture": "#2"}, - "west": {"uv": [6, 3, 10, 11], "texture": "#2"}, - "up": {"uv": [6, 11, 10, 3], "rotation": 90, "texture": "#2"}, - "down": {"uv": [10, 11, 6, 3], "rotation": 90, "texture": "#2"} - } - }, { "from": [3, 3, 3], "to": [13, 13, 13], @@ -30,21 +20,9 @@ "down": {"uv": [3, 3, 13, 13], "rotation": 270, "texture": "#2"} } }, - { - "from": [4.05, 4.05, 0], - "to": [11.95, 11.95, 4], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 0]}, - "faces": { - "east": {"uv": [6, 3, 10, 11], "texture": "#2"}, - "west": {"uv": [6, 3, 10, 11], "texture": "#2"}, - "up": {"uv": [6, 11, 10, 3], "rotation": 90, "texture": "#2"}, - "down": {"uv": [10, 11, 6, 3], "rotation": 90, "texture": "#2"} - } - }, { "from": [4.5, 5, 7.15], "to": [11.5, 12, 13.15], - "forge_data": {"calculate_normals": true}, "rotation": {"angle": 45, "axis": "x", "origin": [8, 12, 13]}, "faces": { "north": {"uv": [1, 9, 7, 15], "texture": "#3"}, @@ -57,7 +35,6 @@ { "from": [3.9, 4.4, 4.15], "to": [12.1, 12.6, 7.15], - "forge_data": {"calculate_normals": true}, "rotation": {"angle": 45, "axis": "x", "origin": [8, 12, 13]}, "faces": { "north": {"uv": [8, 8, 16, 16], "texture": "#3"}, @@ -67,6 +44,17 @@ "up": {"uv": [13, 8, 16, 0], "rotation": 270, "texture": "#3"}, "down": {"uv": [13, 0, 16, 8], "rotation": 90, "texture": "#3"} } + }, + { + "from": [4, 4, 0], + "to": [12, 12, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [4, 4, 0]}, + "faces": { + "east": {"uv": [4, 8, 8, 0], "rotation": 90, "texture": "#4"}, + "west": {"uv": [4, 0, 8, 8], "rotation": 90, "texture": "#4"}, + "up": {"uv": [4, 8, 8, 0], "texture": "#4"}, + "down": {"uv": [4, 0, 8, 8], "texture": "#4"} + } } ] -} +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/smart_fluid_pipe/item.json b/src/main/resources/assets/create/models/block/smart_fluid_pipe/item.json index 1f445f3e38..985a8098fb 100644 --- a/src/main/resources/assets/create/models/block/smart_fluid_pipe/item.json +++ b/src/main/resources/assets/create/models/block/smart_fluid_pipe/item.json @@ -13,11 +13,11 @@ "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 0]}, "faces": { "north": {"uv": [11, 11, 16, 16], "rotation": 180, "texture": "#1"}, - "east": {"uv": [4, 9.5, 9, 8.5], "rotation": 270, "texture": "#1"}, - "south": {"uv": [6, 11, 11, 16], "rotation": 180, "texture": "#1"}, - "west": {"uv": [4, 9.5, 9, 8.5], "rotation": 90, "texture": "#1"}, - "up": {"uv": [4, 9.5, 9, 8.5], "rotation": 180, "texture": "#1"}, - "down": {"uv": [4, 9.5, 9, 8.5], "texture": "#1"} + "east": {"uv": [10.5, 11, 9.5, 16], "texture": "#1"}, + "south": {"uv": [11, 11, 16, 16], "rotation": 180, "texture": "#1"}, + "west": {"uv": [9.5, 11, 10.5, 16], "texture": "#1"}, + "up": {"uv": [9.5, 11, 10.5, 16], "rotation": 90, "texture": "#1"}, + "down": {"uv": [10.5, 11, 9.5, 16], "rotation": 90, "texture": "#1"} } }, { @@ -25,12 +25,12 @@ "to": [13, 13, 16], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 16]}, "faces": { - "north": {"uv": [11, 11, 6, 16], "rotation": 180, "texture": "#1"}, - "east": {"uv": [4, 8.5, 9, 9.5], "rotation": 270, "texture": "#1"}, + "north": {"uv": [16, 11, 11, 16], "rotation": 180, "texture": "#1"}, + "east": {"uv": [9.5, 11, 10.5, 16], "texture": "#1"}, "south": {"uv": [16, 11, 11, 16], "rotation": 180, "texture": "#1"}, - "west": {"uv": [4, 8.5, 9, 9.5], "rotation": 90, "texture": "#1"}, - "up": {"uv": [4, 8.5, 9, 9.5], "rotation": 180, "texture": "#1"}, - "down": {"uv": [4, 8.5, 9, 9.5], "texture": "#1"} + "west": {"uv": [10.5, 11, 9.5, 16], "texture": "#1"}, + "up": {"uv": [10.5, 11, 9.5, 16], "rotation": 90, "texture": "#1"}, + "down": {"uv": [9.5, 11, 10.5, 16], "rotation": 90, "texture": "#1"} } }, { @@ -45,32 +45,9 @@ "down": {"uv": [3, 3, 13, 13], "rotation": 270, "texture": "#2"} } }, - { - "from": [4.05, 4.05, 0], - "to": [11.95, 11.95, 4], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 0]}, - "faces": { - "east": {"uv": [6, 3, 10, 11], "texture": "#2"}, - "west": {"uv": [6, 3, 10, 11], "texture": "#2"}, - "up": {"uv": [6, 11, 10, 3], "rotation": 90, "texture": "#2"}, - "down": {"uv": [10, 11, 6, 3], "rotation": 90, "texture": "#2"} - } - }, - { - "from": [4.05, 4.05, 12], - "to": [11.95, 11.95, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 14]}, - "faces": { - "east": {"uv": [6, 3, 10, 11], "texture": "#2"}, - "west": {"uv": [6, 3, 10, 11], "texture": "#2"}, - "up": {"uv": [6, 11, 10, 3], "rotation": 90, "texture": "#2"}, - "down": {"uv": [10, 11, 6, 3], "rotation": 90, "texture": "#2"} - } - }, { "from": [4.5, 5, 7.15], "to": [11.5, 12, 13.15], - "forge_data": {"calculate_normals": true}, "rotation": {"angle": 45, "axis": "x", "origin": [8, 12, 13]}, "faces": { "north": {"uv": [1, 9, 7, 15], "texture": "#3"}, @@ -83,7 +60,6 @@ { "from": [3.9, 4.4, 4.15], "to": [12.1, 12.6, 7.15], - "forge_data": {"calculate_normals": true}, "rotation": {"angle": 45, "axis": "x", "origin": [8, 12, 13]}, "faces": { "north": {"uv": [8, 8, 16, 16], "texture": "#3"}, @@ -93,6 +69,17 @@ "up": {"uv": [13, 8, 16, 0], "rotation": 270, "texture": "#3"}, "down": {"uv": [13, 0, 16, 8], "rotation": 90, "texture": "#3"} } + }, + { + "from": [4, 4, 0], + "to": [12, 12, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [4, 4, 0]}, + "faces": { + "east": {"uv": [4, 8, 8, 0], "rotation": 90, "texture": "#1"}, + "west": {"uv": [4, 0, 8, 8], "rotation": 90, "texture": "#1"}, + "up": {"uv": [4, 8, 8, 0], "texture": "#1"}, + "down": {"uv": [4, 0, 8, 8], "texture": "#1"} + } } ], "display": { @@ -126,4 +113,4 @@ "scale": [0.5, 0.5, 0.5] } } -} +} \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/block/bars/copper_bars.png b/src/main/resources/assets/create/textures/block/bars/copper_bars.png index 774fc8d3f584babed2fb9a8fa094cebf47b0474c..1a98809d1f6abf2dbc2552ae2b7ea9e214b1c56d 100644 GIT binary patch literal 2263 zcmV;|2q^c7P) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1bvk}M|-{O1%t0+Lw7aabdK10UbXQdPaovmLg( zq6dZ&NXpbgoBqe|!~BL1lUL(>)R023__*W}XH3*SpMJ(;mu! z$EnMeHG^OQFtWAG( z)|yJ>#8s@2I3rFR4UUqei3&^QE`n9QZK0(%Ep?R?iW@ zMDYH?3U)D18fc;@^Dm@82#qU_`~vuTK0hE9hd4-0m=z9YTlNvf(-T`_7SRGhkJ0VT zv7G||5p;VPLjneDAn_E)M&?Ka92NXzSk7V`7f?XnbAy%aL;}cBp1QFo(voG*dl@MN zBD@5Npe9KMSI&7CjEhbYL)nXW-uvLASD$LaDp%d+4!iPdyKW+K}OfA7R9yBaM8swpcZ9oP9I**R0WD4TPD+nS;>9 z8kS?cj-Xji{NxObu_G`ZCj$s*o}5`F=Xf$_CTBJ=vcfa0^pl)MlQA&pI^W(VVh|z%bet#>B7c5Uzkr~H{_pfva9TCuCGZ53tgn%zh56>m7`$Jxb^ zF1^lD)w8ij&c_($w)e7Jr(rbv*jwmU^d&5^M(|+EQH^IS#AvqW(3eoUZMj4UM644N zmD|qabe0#B%)6&>)Q9ylYpspXw7Ca&)R}b*`pyBAS&NwcUSHjP8!w)cDzbSU(Q5Z! z;^smCj4Y|)-AG;9adxl{l)y_WZXp$S6u8OhoEaeO><2KPBc<(F3^VFw&k31|_`Lu$ z7jn)&_-@X9?SaD)%?PX%4-N=-PJ3P>v`l~vglu##(HCiKnU1E3)Hy0q4mQY1+>PHR z16I;7a@6;h25QuaP4toDfog0nRktDUDb)bI`<FQ!q}i3U_!osRqnmAz zrX3f)C5?B_V~NK_Ts$1g-9a$rWc-G(AeHXOh<(vmBF}LXE;jQdchWoH_`(U9*>=)F0&LeGiu?)Z$>czIZ!SU| zX_pc+i$g1iBenyL6P4k_8^nOIp7^a!dUjizy`vfz)QWz!YIg2;T{l+Dd^P7;<7YoXrGzX>VLxcZ!|&V6z@W*ON;;ilv7 z><_1WWYx=+vNxhqQ*9@klitn2{6zqrSg7*?P)j-H!GNcq^nOA_O^2OVSqpr1QVl+z z9BZGj-l$%-_OMyY{e^qD9L!l?xlcAJWatt!4^PbJ(%L|wPlm30JEH1 z2w>=up0eQ(=%<_ll)aLlap^R_=&c`t z`^3u%mlK6_f!62x@g2nvb2o(Tl%rZ+E*RCc(=7S&;-1Y*;dSzdhL_umqz$S; z>%1%EuSS15iMo5`E|S+fqZ5a9IJ=*&bnno8-R$s#v?cQ=*De@LYzLI{00006VoOIv z0I~pL07o#dD|P??010qNS#tmY3ljhU3ljkVnw%H_000McNliru=nN7JAqs4BM8g08 z0u)I^K~y-)ZIdxbTTv8-zZ*{OA1VKj;49_xm@> zmo5NT@*04gmE=lZQ_M}_OBbi(aVwoMIe@HH0ATFk_&a_OkqLtM*qy(mcb?ZVZg%1p0M36o3*k6`11ON z(mQcFo{=@Pwk5JwfunaX6+o-8tVDdQX1%J4g>gFJHN8kunV#dcea5lv@akjBU|Wr4 z1<(%z63u#5#f#%IeCg5&2g{AK0+iQx1c2DAl~p#AVzjtfud2%Q9EWE=xw!PG%sw)g z(!~IYY$nCZ_P)^C<1D^($)}U%%;ohR(GLTIYu2m7JJ5wWE6KN0oB2|alXHiQOK)fg zyQ_<;7fEiXEE1!v@$mpNfyV8wE-HYP?R}9?ClR}=i)!l5#0_oDdR5JriZ~sQW7}c6 zIBBkxFguijRCO+8$(~1B9002ovPDHLkV1f;AQ(OQ5 delta 218 zcmV<0044v|5$XYu7=Hu<0002(-QrRJ001FSOjJbx0095Wh4i?3>7#Aoj%3(#TE%5j zuvAK)OGS)8KzKGgNtZf800001bW%=J06^y0W&i*HcS%G+RCwBD&9Mo?Fc5{|7hMYB zH8Mfa4Is#=KXBBi&H`!OSG+ z$@gvY4G4)oApt{aH$8#`cFJHg>-RKH&7fD(UV(e0af}qvVGAmV)#(v4zL~ka@0`gd U0ZUW@O#lD@07*qoM6N<$f?~~F4*&oF diff --git a/src/main/resources/assets/create/textures/block/bars/copper_bars_edge.png b/src/main/resources/assets/create/textures/block/bars/copper_bars_edge.png index a8c8dc3466691a343ad555e403974ff2095815b9..372e71836b54e7e5526cf33d13bd88f1d2cbbcc7 100644 GIT binary patch delta 1143 zcmV--1c>{K0e}gR7=H)`0000V^Z#K000XFcR9JLUVRs;Ka&Km7Y-J#Hd2nSQWq4_3 z004N}y;g0O<0uUL&ne~zNJ0pX!-siqZ?MOo0^3PCoy=@^`>lD2K!&1BNr2n_{b#se zcqnspK`q4`qsJ3+$XrlK{{C!-&EAh$5BSmHqgyX>A6}d_LVtPXXIO!i-Fcf&CXhS~ zh&M~G{G?BQxlO|#7^M@4Q6BuG+@`owIeugGH1N%C_6{XPtWP{X>im>dL&u7Rku@x$ z7=DVnt&&laFTObnzWe4YN~26n;s*ulRA|t)Y@-H>fj2f-=EkyoNsKc$@j?=u1PL_Q zBukehER8o2cz^lEh1R@zP1h)4;!fzv1TeygRoq$mX?Y1WMw?4S`1*6Lz>9gxKywvk z{-YNJp>f8Mt_42J^8;Z463}ZdbHWD}Uw4SAbdN1@OK3qyg$?^)>jwaq2y-jQkU#++ zNt7aaV>TkJV}d>f%voIE3JFM+J6LiMi4Z68oEu||R)1es-rYzc2%!?iAWfD6twPX% zT(gi6Lq$b{szx}#;>^WjV!_m+nI+3slBAF{#bha^oQlhw1-Ys@X3Ht( zTnZ*FKrR?vQh}p#l^UwnSgod-YiS6d7Mix$tfiJ)ah<#L(6z^IJ@wqnMjJwD3!83n zvn_3TD}Mu_He`gMBMuvB#HMq@A2%6i8PR*bg z2ZG`@6+l4q)XXOefv0kAYUVQ|E0n=fr#PLaVo)$_#5(Av-Cem)x;fILbC4u4xJoX~^6W*zp?u#X+SjZ%>!tA#BS z6qJIJZaoifvlOY7df_^O>i zf;C#c+Eliw;-bWyzCg*9izqFiD=4{i5v3jI0!ofAqI3W~Q)+FsO3FBS`JjXZDsPco zxqpb#2_(HA8Ar%Cg!SI42yfci)ef%qHg_F=FWKJ%J#7LfW!d6MsL7`9@!Um(Za_aJ zv{K{>LMPBLJHp5iMxoU`j2gnojxbVePwoGVY@BpEC6TSPcC-TSng1=coxdow-Cdub zadH=J*^fYg%IKP0B`^R zSxH1eR5;6HV88>eRY(6nl}H%GQOv~5z`&3+SNs!@;tB8xah>n&x*^1?$H4(8P`YpTS0Kew666>B|Nnmm z2d$M~fP5`a7srr_TggBEAOB~6`2YTdMRLb}ZT@f1?D9x{&X3LV!H@iHeQwXM>R@5W XUu!1))Q|HrP#1%ztDnm{r-UW|f@3dH diff --git a/src/main/resources/assets/create/textures/block/cam_linkage.png b/src/main/resources/assets/create/textures/block/cam_linkage.png index a587382e29f91092d5ac30da895d5ce45fd52435..fb1ca2134d3589d2b7cabd8fab78d5089819f7f2 100644 GIT binary patch delta 1081 zcmV-91jhT%1H%ZA8Gi-<0047(dh`GQ00v@9M??U!0Ac_~Ft00i00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF;2%6AT<3J@oG1000BfNklG*xh#9t^E1E+sf=2!R@sLPO3uhx`jIw1+@$`F|5a65`%MV~Rky4%COb zHc`@o!e%XRSMp({-I0)$h-?n49nWfKRav$lEWG`8XWsYTydM+5A<4qRRf`bf!c5b| z;^LzKj~zKI0?nog(==Vin@!X6Uyy&9`{pa_WHti;c%@WOEG!2`B``itz(=4z8bSi+ zznsCh7q4JrZGR29bPC17@}9%qY?>G!Culas9uFiSs~Y6j3e;K!va0RbYsX7MYyz!T z3+;9r01$~p5RFDXYg{=n84U^bQAhwlyWPfjm%helXHPLA0|@{Ct?T8K$3X?kKKuu%pXn!et)*g z%I}p@0RX&Q`pvUQgdGThVqrN@?EB&Q%9dx52C5qNle&N?%D0;lIM!mO5{ zZdCAmWq%8@*7YnBVWSGGg6xz8l8oWUpZ~_KpEf~~F=VGCcL!V*Xw87S0nqJ5q^G}tSuKHXn=q>eXw4Akz)ks z3F?LqfxrHF30c+f;@@@7(*`R|5za>Ly~~zTrmUavN8lRQgN|T75lEl?2*4)O9YcI4 z&833KPDzjwF);z7(VKv4V1^ks2nQe?Cx1N>wr*ApC}oOgt97n&dUpvw0`~mh-Pma8 z-2K20?`3^2!}%(3Ja5$9{Uhsl1pOqumlH4Uh`PRs-5fBOE|UIlj6j_>5SJ!gADv|L z!}(2jyW_3_$9qRlWu*U~1tJdz;Q%}r)L(v>wM5<0#w7n~$a^-7?kBu)qtRw_L^9OI z83A4QGS+qKiyzLdnA><5-A_^(NjSuuZ@jz*^DQ*W$xw+e00000NkvXXu0mjf5CiMZ delta 448 zcmV;x0YCo32+sqM8Gi!+002a!ipBr{08UU$R7C&)0RQx(%*4Uu#%imiqRE#`o|BNO zb3cQ8b98KBiCQ~iVOn5dV^UI8QB+EBJuXU0OGZXVKSDh_J3L@4B{nuVGBPtTFfdUZ z94jj;q()CQ00001bW%=J06^y0W&i*IFG)l}RCwBjkOh*%Fn<(7>$+wNdYk)SbmeHu z0Zm2$J%7k$TPZ?mGopGBseil;Aq{Z*3v`_u2$A@sU;T?!6_G7K%6L2@{K7bhe zYD0Yi`U^+^LjD5G9Wu`u>ax_&7ODYi6X1|?y5A@H`1ApAP0;|c3Ghd$2BJC q`h_ZGS}(p0EgI;X05atC-xmLd=o!N!w2LSJ0000Uh$qG;M* ztO5&kt~|0mz^lDKAQnaht6G=?985Y76WP+0TSj%F4HjDTGB*1<4Io4~+X4(3FrXb7 zOOCW>_C$zd06z)H*(l)*3dmZnK*?f^137`)+1TT$uYYCBV;Us{BCK)7gPLd(xDv5~ zTJsW+L&+K|)>>!14K~{3j1y;_bKbRDOx}3$);sTg@X@DWf&?2}@F9d4l8PJ+YSl&; zeGDQkAQzQf+nB*HB|k2OUVI zLk@em!+#&)h(|h+YNt8nw5L1$8P0g7&01$wy>Rx)+^<=q$r=b#oio9r#Tur)UnZ!@ ziEW&LF%|;jzA=D==Ej*0B*Kk3)i~3UQ5BYf(l&A`HO9c89K`md&E3V^2X6{>|EIk1 zojKL0`y0%uM%@E*pS(S=R-3+;R)-qG*2=I2RezhaF(H=P_aJ$QN*hA2^cOu@fL0t5 z{?bGAyNxRnUm#Whqs%Sqm!n1u0ay z1AkNl8Ru>ra)4(JfpLLhcaF&rGr8?U8q`=y!Kya`CNvnK=_+Jx`VvE^W_pD>DBXQ2 zvBycZK*ZNrEahncJrN>tSJdIwh0q($VmGg==E|>RuU&W0@v#hG#YNtNs?$1Wnoq~k^82`eWGf; zdQpxoNw*Kg)Vg-`Cj3*yt$Nq1>snJj@o!=LygI2b?odlf5w8&{;@7HwsDJ+V-k-SK zMfD%c541jF`Hjs0000JJOGiWivH)TLM=-A|b^rhX32;bRa{vGf6951U69E94oEQKA z00(qQO+^Rj3=$VKGZe69P5=M_1xZ9fR4C7dkxfp+Fc5_wk2S5#QYq4mj4~J z(0h%W*O$k&9Pa2gTDQz0nw{nVs!FN>0PQjdH9PfNg;gkW$01wuJ6+~V4vQ~c&mo;T v=jNi{jzgDI+qwcU%OQ3BoNKs$7K|e}dG+=w00000NkvXXu0mjfg4P33 delta 142 zcmeyyGmmkCL_G^L0|Ud`yN`l^lyrbki0l6ci~pZ${j#m{<>K52-N`qKqc((i>~Y zac~fu9d#6_%+AxrF{I*FGDl%yA#-AzgQ_aOKpIDy$V!I9wgl$wTncPPKDV_RBu;Rg tUI7%kuw@IMK-!5HFJ3StX3b<~2so&nc)ChA4rmgCC%dbk%Q~loCIGQWHRk{T diff --git a/src/main/resources/assets/create/textures/block/copper/copper_shingles.png b/src/main/resources/assets/create/textures/block/copper/copper_shingles.png index 1fe2d15c1f1233e65dc27c34ace990d364bd9e3c..26aaaeb4b56d0f914e21d938ee6de4f7385f834a 100644 GIT binary patch delta 490 zcmVSg-Jv~R4C6~lFd#VF%*T*OzmEK z275fiC>oRvLaNj*`vyD*FUX6qV3!S*kRnx4HdUbzk~GfT41Y*n++qeSFMQAalfL8Z z^5VQSgxB-)*WKC41i-Fm0NdE7lq<|O_IYV2SS^w~Qdk=LI&HhA>Y6GtPwS(usq$1B ztZqXE;Il2H`a{3yD#ZXcJQPHp^ucPWIP4=vCs>_JLb^Ta$UL4W4;ku715hc^hRRW0 z5IL$hc1Tk_>3#axO+Onat&5}9X})aT;W^8)AIqhR%n5vHXxHo#N&nfu zm8L;sX8|Yy>Qm|A? zo=Qb>#mE-`003}FL_t(|0R_QP5yDUq1HeoSfCx0y0S;RDXNFcmv55n2YT%L@cwv|K zWnP#0{a|@?+RY4|Qkyy*8=-^X0uu?~fPf>UIO;$j)6R9>Z#LT+v8q*7&FWSvW+QId rge6;`g9tLm7r(l8bK9rw^LoDj(KT16U2h!{00000NkvXXu0mjfk}gqk diff --git a/src/main/resources/assets/create/textures/block/copper/copper_tiles.png b/src/main/resources/assets/create/textures/block/copper/copper_tiles.png index 5fae33d7af03478aeb69f7614686922be8b8e6d5..4b44f42378be9060760a05e17f1fc8d4b4b59203 100644 GIT binary patch delta 531 zcmV+u0_^>h0iXns7=H)?0001xk!Usm000JJOGiWivH)TLM=-A|b^rhX32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rj3=<166&6Y=hX4Qptw}^dR4C7VlCf$VK@>%=b~XEU zMmw`RMy$XCPV5*WliBGD8?%QQuF6uP^Lju6%WCq|_9<*Y*`1wPVH6#oPP4;p!YsKVj zvdf)K0szh?z2QKU)nt3afwM^_MI_Zf{BS=9(D?H4eI(VxeKow9DWcQk0{{>A6~joX z{?%9!oxgd-*?*dmRE7j7?bsD(`d-?Bo+4@O~;ySc#;N3uJgEAM^f=E@YKI9zE3BwU+h0_)}asr zPo6imia9R+o_3b%a-~)5OunQo50vV16*!wrZht$I`+t_Z9wMo{pTO_incR@LxcbF? zwmldU><2)TW1Joz^oE0~uFsBKBvppW^UvSDdOsPeCWi)~RjgHf*m=3E%LSC@?7^9w zdGP=LQ_Sz4@!<3A{-1m=Wj~&WCuz`iZC-OIL@0!nqJLc!^V_a#+eB>|A^Tze2WKtK VD(gd{f(!rv002ovPDHLkV1n;p@q_>X delta 130 zcmZ3$GMRCLL^TUD0|Ud`yN`l^lth3}i0l7TtzWiPzFeI9pgZ|SanzCIpba5j^SoS( zj-C()sxk9)aSW-rmFy8<7{;8~W}tR7L?DgBH=&dEgqL#;*3GGkEicGS$mAJ!;iL&u32Qhyf{aM_J7XK=motjHggXCw7ms7jygg_IQn=6_sPUS^aKh*0qoKuwYiuAEbc zS_>{Bhq8(~RrMM)YSQe*JFnjR;72XyAi)I5$7`4(DispU=`snlK9 z?tAF5r+=Ogq}m~eJM{2JIO36xe6coJHD5S;W$rU;v{?gTW^(2*>0}M&5Kagha-xGX zFvgC+co+;Ip?Pp-BRR)|IWsu3iBT2G@KOgkjRs?2&~;)x=;H3d+zW38b^p7(@trv{ zsQW*dGlRM}%)RpVhP5{Iy^cDx5VlcKH7?+6Z1*6Z{T>Sy9-qK)s@HNB6W?wX<$^82h!CqBnzdJZ;U4si8dP(Gt~%TdD06 z_MGl>&_+*W|7#4G*RHmIn!9LcsHfS<1;5`&gcZ6xHGZvJw<>@|;+$csC#@2DTl zo7lE*R^3j(axLE!;CAzCWAI+{o>ptqy&=3cS311nJoh);TMRdt8EAhB#!E)*FMrF$ zr~bEq?kREF%$wYJr&}LoYhaikKzr&uYqQZVAu(23m+@1<0GA3C2Lur zE!KxMG=AvO+akS}e0;t+UL?S*GXAmj-O9Bo%i6cu-_*~%mA`u#e6IdWwheS!g!ff; z;P0sm{!+k)JbZHrTnTx<4aD|6mw!b1COYC{XqQo+!uqPK=CcIeV)v;3D;e(kZ?0SL zjsCyAG_LLPKJXG;vlLhSzVThJcl}E{)Pd`Ba&Cdc*Y|`p6Z1#*$4A!WpzBLYEguX% zyxvFhlitSHFC2469iR^d_xZdPYz6W9e00A&bL_t(2&yA76PJ=)YhJWa`DiG2{;NY!2kQfi%^qG7YAHXN- zftxqu0pmd$x=3^jD1^;=n15zU(I##-+1YPqHnab4J>1{naLr{~7$c(7zxiCYakKzX z)DZrn)PHE;h)^&}=^ zZgXyxr;qOnfb5%L&ni#XS;<#H$2u!%j8XNT`%NgEPHDR^hA99Jet&a%OT3lak$hBi zjEn1YAHYX=GSWM+tRdX{03ePQYy#^YOx8!9rzHq9&Ofp=Sf`wVBRThAJdzA z06cGASXnXDTlP&ToY7y2k9~N3k`$2MoMt}rClpMsZsThErQ6-yx;5=ocS?)1S^lX; hT(?HBHUISC2PowOBM`B?7C-<1002ovPDHLkV1kTGEQbI9 delta 142 zcmbQuJCAXKL_G^L0|Ud`yN`l^lyrbki0gqR@jGXRZ|nKxh zaZbp#LRcXR?EpNu`G^*RBVu@-#2!Gq_W;UZ$R}bNR)~aD&X_CJ#hL||mcal>;-JuO zEtUY*VmaMi27klW>b%e{A*c+->U^`U2;yP9hwWxtS)HfF+l$90{CxcL-NB~^TG<9U= z2Vhk!GLzCrhLcK;I`{*CXdeJNXlMG{^FBU>QP!z^Q*T?MgMJ9nnIsBFnWxaWmH*6; z6xbraRllI-i_@%07*qoM6N<$g5y}^&j0`b delta 189 zcmV;u07CzS1kC}E7=Hu<0002(-QrRJ000UIO;$j)6R9>Z#LT+v8q*7&FWSvW+QId rge6;`g9tLm7r(l8bK9rw^LoDj(KT16U2h!{00000NkvXXu0mjf6)8<< diff --git a/src/main/resources/assets/create/textures/block/copper/exposed_copper_tiles.png b/src/main/resources/assets/create/textures/block/copper/exposed_copper_tiles.png index f15739052b24c770e519949a0b4fd8b54a28ad88..e3449a01e703a0204edf1d22b817b727344d2949 100644 GIT binary patch delta 498 zcmV0e}RM7=H)?0001xk!Usm000JJOGiWivH)TLM=-A|b^rhX32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rj3=<167x+X=s{jB2jY&j7R4C77lEF$NK@>%ARad7a zucsU;Re~KzW_n<-LC7w9zrdyc;ScyhS@{DqE3wDy7MMW+}InPv)~KB`bt?8S}9ym>(7ffa1Fm^khB*Fg$V| z_`cq-$?(WAKYtngs`27oCcVqbpbfc>PVo8TtBy`OI$>u3vhCM5-`@T;V^Q$au_&0g zb4pA3bX8X=0kA??A*QREy_tKLan9+gwv;Dk&@;pRy|DEzuNd0(M+ynE56!*jY1D!D z4R1P7jhUy5V@SoVWRC#DFy_QI1GS?e0%;t+38jpQY|}p^r3<7ntYk=Jo4|!&ESqM@ Y@aTj>;L)OTZlDPap00i_>zopr02H+Ld$Wq*j2efj-RK+OLu#wXEL#>TNIWM@Zia2`{(c7{Dp_D zXX7+PpS-ttTylvsglMm4TXV8@@3O;>mX6L&Z zq5Y^M9SJ_h`vYKM#9>uWb3}mImT96WU9}}<04-RknBCkQ+A@F?;cSI7BtXD=5+#pf zU=BpcV+1}Kp0gOo1rU%bH+acT!~>kj{cP+BG}f~6RDYv|0ECK{0BDkAVC9@TZ(MK@ zHI!A!F2VoE7z z9GYP{V|R`jio!*TD_VRBC6-ijMfp@$wfY)rtf^+xxJh$On{T1TmRjCuLn&=;)6H*T zi(A_Aj(<|yWp}&oeh+)x)1FV%2CC)-vrpuHjv6i00GJt=IV?I*gF1x61a&&mju{YR zM?gGu1W?f2F+)E)#~nG-F|&!$70U2ZJ2;IxVnEPs#Jbao-G$r-ZU%k-Uvc9*a;8J~ ze;{W%bPvdV;`V@A>-=7OA6gJwZ^NEcD`>xxoPQDmq#bXEXur;G2u8s~CFvG3$Gl}q zVTuSA)YT;*{AEVAvgzBAMlP)z)`m{3I>ee;kgL8r$9h_=b*id+am_$bJ6;tAs5I9j zQ?`|ZOKtOyW2LM3qt9ryNt`pfc8?yihbNALt+B zTYp=N{5u?;=l(*6vpH@Nehp`9E#fCIsHSSt!YhIg$Kq(O_vH#P-dwapa`x`3`Ju0; zUzf|zE>6k7foESIT)pQlrFFcf93bMe#>W@6^Q$1epvML<(mU~sUGrvm*gbP_vtQO* z_TKG7#P&#an}M?lcOTBPRuY}(voL5T#ecQ9WxsN<=~-C@rL~2_Qm(6B6E)|`umR4y z+4X69fXgg^F{YEj0X5qe5VazLAt&H7MTgT*FLfP};t_eLD(G@A60<@CIk{B^HOO=F zc{Ut)kGRcquGTZ9Ee7h$xMInunepBsvpSUc&^cUtp3UcrD~3cfh}ynV(rDVdVt;GX zmm)R)+=bi8T`+(y)mHPW4YjpQ(Iuc8C+7CU=s|?utZgxzhqZSN(p7Gt}y-AkZVCiA>Y_Yhi zs52+8n#%`C7u*gH>}xvxmgxev9e*8wOYdO0M{4_IU-RdbHW|(Q8l`<_U-Lk}U)lHR zDll+nLD}q!ufNH@=7D}+S@Kt04N}Z%hvsh-cofu)8Lkt4z`y2^fWPtY15cVsl+Qf* z;N<&!I*m`i`~5R_7B4B@3OUP4Ksht_!BpUESp-`1g9mZaviI@JhnxBQl7G7{kCUVA zTQ@$;=Cxh%ftf(${{sFW)A@m@KnVZ<00v@9M??U!0Ac_~Ft00i00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF;2%5*IWqnYe4a0003mNkly*T5LjmknG@Fh8%^Zmio%QKFb zv_;#5lVv!{rL@KE`X0ciZs_92qSo6uiblBrkmePav8`*Hu+xTltfE*&!~qC;m*y4G z;p5A1gZ`v>#a!^++iO;C5&*T{`hS=oCZVI;B-BQIJZQN|hHU3%vVR5^YSn2Y+a|2v zlOfv)z|CZ*&4s!GK)ln2dg!#N0kQ8VYQ02x@DTJa=-qGg9rVst8f6po&gTH+_2a{T zIn1Ym)iD>+7I!z7^QquXb4y#WQ=bcVdg7Z3Q))rFtb=N*f@rCMXQ_Z?sDEUre`BbBV5WUvrhQ(fd|jn{SfqMZqj^)J zcT%BuQK5EDpmj~3bxWUgN1Ss;n{zysaWRf?F^+FAjc+fFZ+|U}Z!C*%CWme%hi)W> zZ6AYe9)fHgf@~atY!7*A%V^V>0002BNklV{{tTc V82&A z9YtG*1Be3`BoIHq5AhZIU;F`wE@-)Mh!9KFN~|d)QAnuCa(|fC#EPu(n>RD@d)~VE zb!pkbW-V`TlG8H)DEu4%R{kZX20UK*7iHOzsoHWE0LWCb%h9r_9i_vEjyHI zG8LI>m}CGD^kmK6)C)&&jAsC-+pZfaO(^xk=r1xAN~z>DAvU4kPXcMG2>}3OVwhwp zn{K31HvQh3Fn{QY;KL-tgKSR|YQmIFKAj0kz&Ph1+ruX0(^<-98+Y|<{`8tZJujB+ zd$p~9)NlV2XLmHMK33UJyQ3+e&gwTG;PdbGAB9bb!drHQpBH}q`)V!@JZu~o@Yu2| z05A$C_E~oFVH5cHWWZxSK8g3S?9^HZSO7rZJ_%A|+H(@(Qy^2RZlu2DgGFEUpeL$c zM5-W&O%UNkmPn0_#Kf3VA}|0v`!d?M&*onfG+_;ELu8aDL;w)^Q#N9VAaR0#@inLc wkNy3fzrXAMz35mz7Dwm%GF%hZZC5@PU%JM$?4(nMRsaA107*qoM6N<$f>?3bIRF3v delta 411 zcmV;M0c8G(1gZm&8Gi!+001a04^sdD0Hsh&R7Hlys(!tld%Bo;xRrLakae?;aj%GR zu8482hi|QgY^#H7tAc5&foG|JWvG8+r+#9meqg43U8Q_mrF&STc~_%(R-<`Vqj*)K zcvPZzQlWQIp>|N9c2A&nPM~#7pLIi;b3&PNL6~wtm~uXsa(_IPaXXZ8I+SrWk#I4N za4CsyCx~t)hi)Z@ZX||nBZh4wg>52*Z6Snh8-Z*ZfNU9mY!7*AQ_WoC0002MNkl(IUe@5Jm5HN3o+CdMhi6AuQ;o0{Q<>>*PF~ojorXG$+@=y*<44BZQvLZEK`h z&lbxKSG&0Dsec-Hp+ro|Cer^BTnePT$qPT%3hFX@Xi~OYn`Uw`Ta-x{`U8i&Fs6>C$k5na$ih%^R-X=Px2NqJ(rKD4rGJ@p&-F$B+E{Up+3zJQ0M*We+x>3>CGk%|-|D=`(iOE7d? zJUkpQ6`aEyes6~PzxSKgv)3;k9zI?ytJS&zAO!)K&k6wlu5gd^EF( z=f0oT%gLM1v$;?;{;YKsZ$BCUVD4o4>su{U%{-u3s@-k6uANMIZ_{NlJ}pm*_`wcc z*G&|+>C*Es(ziLTf1$l)BV7T=Y_eFA^B#nabVVjtKYu=c%537hyy?No)cYYn@60Ar z(3j(PCRcpfdys*R`cl-bV002ovPDHLkV1g0Q_ErD@ delta 422 zcmV;X0a^a71hoT@8Gi!+001a04^sdD0I^U^R7Hlys(!tld%Bo;xRrLakae?;bh3?f zv5axAh;OZhY^#H7tAc8(f@rCMXQ_Z=r+#9meqg43U8Q_jqj^`Oc~+x&Rib!QqIgrH zcT%BuQK5EFpmt86bxogjOP_Q{oO4E-b3>YQLYZROybK;c?x&GM>rsMPQT^`uD1IV5E5qtznIwvjN$LaL6>($>{s`Bz_8<5%XP}|+zj?jER?HFS%#7b)s1mwW6P5bN5ZvMdI zY_djt)R023cqB=384I!|z+s9h)(vs1oMdt0pUJ=HV+<#$a%shpcKOTnowjo?I zJ;}*`k@Mxoy+x$kki)piQ?t?DAAP;OSM4~n8QPL1AU|OpY9HlXLGeIh_}msSB3_Sm zJV(M%n{6>9w%TG3j6#VVvF#*ODO0C*&V>p>6xUqD>|Akt%9Nu^uCQfdF)S?9UF5`- zl^qw?m?3pnEPr(RO{cp;3dfb8=?KOMJI-PD;=hhZL%o-gBEso+t`L`V0|pvd$JYnI!iYd?q*-ymY>#Q;@bs!JHYd;wMUPqL=2({jqzJw}f*}S1HV}IX zWTSJD2zgZClM%UNBklkMJ2?67dp@ zL{ZdG_Uy%bAAI!clh1*J1Rp|(Vf12-93}b~VvHJ7%*rb2HE2}Tq}e2w7`^IKNHJ+j zDQ7s%u$-|wYlh%(2Oo0yBOLM2BOSS*e2NrbLWxC7D%n(5xk~jl)L6Bqnj1BgQj_Le zXt8NaEq`~ETIVj^_t0b4o_fAeJ5e=nn0-g?XVhq+2EfdTnLufy262qr1Pwaz12Z7z zgn)P)2%wsdMd9!P!rrKC2Etii3QbOEhOJhoj`fDQv=( zT%9Iri0R2*sdHN@vcocavBL5R@6xhe0Mm}J#la!NA}-Rr#A3@bZf?=-;PjTV!c$79 zSbyMm#+ehD~ zo{e3uXnq~Fy9>rhYW%fg=$KnV#tk;lQ#9~&s9eiFn6o?S4ODwaXrV8-D3|wPZEWJ& zZrjAg9eq1axmh3B&7)@Y^ixvzOlf&)jeq6=d}*jaHuJRAj+Wmge^Ut4eml4{7Z#d{ zdHIUCo@Wf^4B`TFRb}EUgioP9ttf)&LiAONodvyQu4-TXlnK;ur33#cBp1G(VMmK}4I9 zTB6mJDCVSnX?Ad%P8~lB*!;xmI&Fl}K(hmiqLgH|i3Oqy=ca7ZojpF$`;Ardu?fCu zx;2owcaSW((l=sBYdk_q41CVd?)`+GX^~K);4{eQ#zGZK_5so zth6=fQYEtp!|S$yyQAD2BrPLtH$14ig(vd==lneAIbCO;`7}tRTr34@Zp**kIpcw& z#mVB}bf&;e^j?+!;RcecENgfS);vawzgg36k9xZzA86=`+w5E5Ip7`dTYnj*Sr49$ zi{|rT=B1F7_;n2=jk7l#KrU16@CWq{>@CosS$_oFG2iD&`ypE& zjXna9?UE&xS}J}9;EK={A&&)MaE^O8J(#u|bF)3W`iLuw0FNx{_q2S_AY{7E6aboc zQDX`r)3?kCplA-S^0ZXOl1d@dNIDz%0QmL*n76N5Dzaz;fAaMFz|m0!_&UqY-}{w+ z-owhDc7!Da%Kg`aU4L9u(_2@B03di{Af1jq?DKAeb*^aKq9u~=o zhdg~3`sh{O=r2benhA@ftUtebcm4G2kgl`1&keiSE|PMc#jOXjNJ|wccXntzY~V-I t;U3f0$2Q$8UIK8?K&PD+Ne6KL0L01VuTlw#bN~PV07*qoLYK8y+ delta 142 zcmeCB tR{(`BY}vvmkapt5ix&)uSu>d#0uE{?p03i31DeF($?odsvd$@?2>_QvGo=6k diff --git a/src/main/resources/assets/create/textures/block/copper/weathered_copper_shingles.png b/src/main/resources/assets/create/textures/block/copper/weathered_copper_shingles.png index f482d21b9138782c6f7b78331d5e8ffb5fbd9105..3a81a8d1eacfd0f0b91f395ea18a8f828081e130 100644 GIT binary patch delta 538 zcmV+#0_FY90jC6z7=H)?0001xk!Usm000JJOGiWivH)TLM=-A|b^rhX32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rj3=<182uFG(+yDRpv`IukR4C6)Qo)YXFc5v~O}BB> zjf~QDvCliFsV0l z8js(b8NcU?PaoeKQQ;ixAO2E~0F+lHfN$Gt00}k#f~h!eYi2}cc}!?Z9AC9+{>m=p zXf88@nGFVWnX#lE6V&opPEtoxtsa97UAtx<}sM6_&>`Oc7#* z!!p;0+wAhS{A<_Rt~EQA50?*v(3d;gyu1O>JpHi_@%07*qoM6N<$g0?U4cmMzZ delta 189 zcmV;u07Cz#1kC}E7=Hu<0002(-QrRJ000UIO;$j)6R9>Z#LT+v8q*7&FWSvW+QId rge6;`g9tLm7r(l8bK9rw^LoDj(KT16U2h!{00000NkvXXu0mjft#M9W diff --git a/src/main/resources/assets/create/textures/block/copper/weathered_copper_tiles.png b/src/main/resources/assets/create/textures/block/copper/weathered_copper_tiles.png index 020eb2b7eff12b52e58000e325d93730a4329ebd..1316c668412065e721fd9ba91673caeedab1e71c 100644 GIT binary patch delta 576 zcmV-G0>Ax}0nG%E7=H)?0001xk!Usm000JJOGiWivH)TLM=-A|b^rhX32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rj3=<1686W&+tN;K3+DSw~R4C77l0l2pKpe$i#-zIw za11*!AxwlA#6_2-y$GKDEaKVQegsc`2d`fG0ea|J3Wa!SPJf#QY!9nh3F$(n(`@zd zFX@VxfqC<1c<=rG*5^+jZ%3~HR80ZE7irZLVpRedyna_T#l8gq#^H<9ET#;ASxjlv z7byU-DkBqV*D;H!FH**j)3r<(fLbQ?WDEd6JsE4)$)giv4OuD{ZoYKoI*RG?v0-#+- zW;uXIm%;AWW&EcDgVyTE1; zzNs3Z{YPiDOvI`r4`ls+4w|c8XN(^>JnWk)>Ny1AQMW#Pz1p{69QLNmMfAZ*rLic+` zc}QP+6*=WOa4^FWL9iTH4s7?noz3-i&R#y<3$cT+yN%|`d2-**=6?bCwEY43=Z;MP O0000sY>srDc(N|h8ED1{!Z5GZ;R3hk+aSbr6T9u%QyFZBcTU|Ym~ zAXr6d#UhmojU={~x=Fg7>_>JppBu-+>`Z2}X-#Va{x7>P|M#8ed7t zeMwPS+u1|SDKq1ExR%LN?|+pDd0oqqmGk%HB}JuE76ID$I7UWBd`;7ET^G|d5dcOD z23a-5&52?(v43XT(f`qcLAG263isyKR7;>ZABU={=(>(=+enf`;>`XXeot4fCHqcU zWXAC*mZ|_Og$G*Z02E7AUN~{Sr3wcR9`rMr44&svtJM%@ZHK{kK2HFg*}uaF7;G;3 zZ0|Nd{7@0llpw%(DF`stOdy2Y&{^D51NaX!*RjE_T6l;}3Nu1f;o z$hHl>rU)$)D^`Oe7q2Y~AIH9Z`}|xkhpy{POn*!SKCpgGH|dldsk~x&Q5lzmU(5?a zbO7u*ypyR?l|s2rpwPVJ`?xNr^tKc|UYxpaevfoYnN4ur4+j!zoQ z+Cj5Pr)2tib+U4vn`)72#pBnjvFrAKPr#^D z37=bG@T{C?#wlV{0x!67=|+p-rs^z9@c#uOL2TdL@4Ma{q?;}_JA))9x$yJY1AiIK z_RamiBqnjaIV3U3t50v>-S4j9dUG6lW)nxhxk{Yx2p39X5=l(rI1L=95sl;c_>&L) zw~rn3@0UQSYEd`c=y!0-s%V_k#5O*$eRIDbUu-9Xvrf&~bmbH#>H+=R_3^|TZyxnc zE4T%(zjkEFm9f5j#h)%&tb6IBwtqE3sTw?`R_hrus)Q&63CNAVk;Ej~w16xJ9qg}y z@lfZi?0WB>$qM0)U2l%M=^}Op9$h!x<`K-d&q`%-*+nSCHIPvyLXXR+QjkE*aW$=X z`4dRZ+06M!yo(`V002ovPDHLkV1m8Pf+zq0 delta 531 zcmV+u0_^?Y3ZVp$8Gi!+002a!ipBr{0CG@FR7C&)0RP~l|H_5(!EN-mdFi8V)2~~k zrJUf4W7u&O?kZ#J1I~2V@Tz)Z#;>$Qi5(aEx^)5AePN z8by9QcbGx#fmx&3$=;gF;#D6zu=I)LY|5X2F@7Bnpb?NhY_;z2uu@7m=gRgKtO~5O z%rteL>Gl=8W}tZ%BU6w#vDfwAVB*GzDAwi?aSi4R@_#ljdD-FpV2;1e$O4C<7>1!9 zGl{;aO6?@~KjN5qdu0e8Yk@zY*Xq2vG1|m9->m?Q(ta}-<3M_P-?Ot@K{6wf5@xFv zF7*4y-)SznsiJ8bJQBf_lBy`BJpJ%NL*`k-&WA_H{zRJeClkEltlDS VN29BKpbP*2002ovPDHLkV1j&p_yhm| diff --git a/src/main/resources/assets/create/textures/block/copper_casing.png b/src/main/resources/assets/create/textures/block/copper_casing.png index 9f7fe91f33c9c74a1dadfebcb3af747b1b4c8b2f..792cb6cca5151445ceeca44db39950c55d340e48 100644 GIT binary patch delta 523 zcmV+m0`&d*0ht7l8Gix*005AYXf^-<00v@9M??U!0Ac_~Ft00i00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF;2%6AT<75}T4(0004|Nkl$>v2GJV5Qcv{>ziGl zeU2~D*^UDWNJt1FAu1$5i07cC<3W%R9WTKP(9zOUAqv1LqJIDZ$Cu;m-5L836cZgL z@l-QA|LlD8H(oz^99shLeO3(99yUeYTCkYd(%pj_rR3YLb!~7^N)Dh){q=$O_@tV5 zAHEm>Dta-gF!?OZWUcTqSqnf*pz(5)>+sgSVKV3C^N*!5W`8vBEIVmxqA2NhukH;` zeohBj7D9M)n1An8<=K4Eygtev-n>oL?xbnlZUb=Cazp?Y-fP*8W3qPK@3e`UHBzn6 z2qHmN3Z}8U-2>39PYfdK>gB51=vZ^T2(r>d)s9;0kN*a0B(+5qy-s}L?_aX|Z-XP+ z?e~-?Y8e3Pfwll7)VhcSfUHfEjw8~OgjvBh-%z_0M1LI7G%qeAnaQ^w3l?FV&Sv|g zfiNpW5J{7cN>67qVLtrIUS#XpqdT{*3?F3f?NQ-bepi)e2_ekOvMz=B)%~$){3-m> zELe2c(-Fpf6S?f%*3#qJ delta 233 zcmVQm|A?a%^d5 zVqcz0MP6H4j6gtDR8vn+Pk1&vOG!vXK|nh=H*dlB0{{R3f=NU{RCoae!C7ttAP@yG z&jY$iz5hA;5h)5`s9is8ZNS>r>}T1HQl6D*`1+_L>da038e;FWPF?dg=8^rl+WYof z-}^Yzy$2naOQ;|P2v;aA5KwUdQToVrX$0JNN3|lV6zKtFu2X|_SSn*=?{ASBRpU>l jcx@MDg}Gt?j8Eeqw68fgj=-9;00000NkvXXu0mjfkhx(# diff --git a/src/main/resources/assets/create/textures/block/copper_door_bottom.png b/src/main/resources/assets/create/textures/block/copper_door_bottom.png index 8cc2fcd35629d8f455d5d262adb3fabdccc36169..a733474a20c9ebf05830d64144c55efe29f0575d 100644 GIT binary patch delta 480 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 B*#`gs diff --git a/src/main/resources/assets/create/textures/block/copper_door_side.png b/src/main/resources/assets/create/textures/block/copper_door_side.png index d9feb0edcd995d202c894501430f94101920f852..af62e27f8c9f20b46493379062483381d0f0cfc2 100644 GIT binary patch delta 384 zcmV-`0e}Ae0i*+v85#xv001BJ|6u?C00v@9M??U!0Ac_~Ft00ik$xC|2XskIMF;2% z6AT_2k)|2`0003oNkl3&t{ zv5Je#5h80y{BE0v`xl<}-jdLgi-)F4tz7%G5ss=4A2ls0DHZdGgTvje)NkgCn$@C)^YJ?XTC3TJ`2(WcAFiGBy7h6@ eL)1N&f8`yvo{eM%{2-_R0000lBSEK+1gFI7R978mMd(S!YH8^lEAK0X)@c;h?(MaWE&B8)e3mF9@ zgCy8eW-pq2W{RYQ<@7TjFIoAW=QCb+ZQ`ph-#)f$-6=0(FMj>w_wiQ+kFsP}`gtE= YJmJiI#`-SbE}-!Yp00i_>zopr07Zgac>n+a diff --git a/src/main/resources/assets/create/textures/block/copper_door_top.png b/src/main/resources/assets/create/textures/block/copper_door_top.png index e069387743946b93423529b37edc1c179f836fb4..e332069bf86d918e72598b52f2a613c1150b335d 100644 GIT binary patch delta 481 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 diff --git a/src/main/resources/assets/create/textures/block/encased_pipe.png b/src/main/resources/assets/create/textures/block/encased_pipe.png index 0eb5c9136c138d7c952a4ca42feff1c4df94118a..e74562e576939ac93598d9ca707fe0b6afee1cae 100644 GIT binary patch delta 437 zcmV;m0ZRV&0mB237=H)`0000V^Z#K0000JJOGiWiKma=cFt1nH>i_@%32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rj3=--G=FPZ04`3?xP5#;iy{@w6d9%HJM)bT>^pNZN>MOV@iVkd%lav_-wLBk zwbiZuTY{w>`~_OFB)$mMQhFn~T1w-K;LbwcC0s62gk~+v<;nIUd4bR!*oz_^SN38@ z%TRHZSK-b=yg)cVJYeKbnEC;_7f37yC>QhO)WRS-%Py%DX)~lduo=0FKcc^mznr3o f(Yy&sjxWL|5bmt~f_N%G00000NkvXXu0mjf{bje1 delta 231 zcmVu}@|lNY h819@s0|a-@0stgHOxWm3tbYIi002ovPDHLkV1nN7XQcoD diff --git a/src/main/resources/assets/create/textures/block/funnel/copper_funnel_frame.png b/src/main/resources/assets/create/textures/block/funnel/copper_funnel_frame.png index 5304fcb7f6134f7e6f9355c997b74f953dbefc35..e091eeaa99c2c2519f405334ace0299e908cb1a3 100644 GIT binary patch delta 381 zcmV-@0fPR)0gMBX7=H)`0000V^Z#K0000JJOGiWivH)TLM=-A|b^rhX32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rj3=<3mIhyyQ761SN8A(JzR5;6}lD|sBU=+oF36T^V zEh(ZxmUa-N2;wf%r*NpR;num2;3Jg2fREtdCLQb|QkO!6l7Byzq`5f6LB7vu5t8&w z_k(-Rz4v^_m<;-Pvta{}WP;~9{6)0>)OC^x#eS>Vu({}*u#%8v6w^KGu#ymfJ=@(7 zdwP4({SVKtSb!#6-Q63Mz-)MstJ?H~nCW~$Z!|7N2I!5(#&o_Q6~R1ix41k#qbfYt zVb``XizifpGIrMd&#baA>k<#!tsj9pCv3gJzP+=Zfby-jfI8dqgP0_f$^yTFbl&xN zyuHrLl4rx4Tm{KWGT}qMLopfjbI)~jNYqy;!_?$u6zjM39>%QF41iQb*8qMHZ%i-t bq#}F)(|~%~m_66700000NkvXXu0mjf^%|`a delta 177 zcmeBSKFByhqMn7Bfq~)e-A6${N-n@B#1%;YKh^qjaqh#ulpDoSN0Ng!gm}&Ka_w<& zs4%ncjtRaGRKZvh-Am4tvwfsXVQ({Jc)7wMy}*^6@wv zcy!QUG9yo#k%+T|7>}!qL6@O~sz4k2VG|DJ$qPBOa#$y`J9oNAWn@Hkvmfp`$EPsk bA}524tk`MGX_cperZafD`njxgN@xNApEEo^ diff --git a/src/main/resources/assets/create/textures/block/glass_fluid_pipe.png b/src/main/resources/assets/create/textures/block/glass_fluid_pipe.png index 78cd6cf1f5a65019e8e33a3982921744ce151248..ad1af8e9d4a999bd29244e6f101458d5dc046ff0 100644 GIT binary patch delta 354 zcmV-o0iFKF0r3Km7=H)`0000V^Z#K0000JJOGiWivH)TLM=-A|b^rhX32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rj3=mCEn17!VV=|Dq+8$R z@E!Pmc%N5VPsVvqnC$%k!<_^0y7K`TI-;zHjws*c`2j<1u=fL`<^4@QusXaQKB+2- z6LhUb6es1MuC)O8uIE3hwu#EX>d+G=0Grz<0Q`@407Ta&IM#H}$spowp!tXUN5*V(TR;JTlYJY~pr zbD*Thm`FX~%pRF~+q{aA3P#QtBVm#rl5XP>vQUIa!T@+uwij{bVip)j!S_}KbzZGbjHCwa}vc`Hcm=BpLRJR hIQjKup7MnZ3>q87W;VX}H3AyT;OXk;vd$@?2>>quMAZNQ diff --git a/src/main/resources/assets/create/textures/block/pipes.png b/src/main/resources/assets/create/textures/block/pipes.png index 4c4bc34a42fc483e1f3ad6877536d955556abf84..64ba384eaf4df7f03112ec79c1d7d62fbab034c3 100644 GIT binary patch delta 870 zcmV-s1DX7@1M&ut8Gi-<0047(dh`GQ00v@9M??TX06PFMuUFaY00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF;2%6Bi*C(7iKw00092Nkl*oa<8wV30OSS|4Om%K|`7R)$X4{?&v+ zT2PfdfTlNYP=5=Qv2+0N=H6a69RNUMsp5r4oY#MWon!zEYQZ)sKnj5n7}UZ(wNM8D z&A;%+?-u@?ClA5YFoz~f2+I%mCBpov0q8JiqS1<XzQ)x1U2R=grf5JpiazN_g=4V}{?4Cpx#6&_Mkm&}0dVS8CWfI>4b& z-|O{T*f~Fl?1EG!?~#@!OW1F=hO(tX2_`9^SQ>rvqYWLSI1;E%9)EY?esjJRnjn zf3vt22W+4raa(lpa7~s{QNCCmk^3Ly4|hK)<5=9zd5T}K*;vJNo}g)@s07ExZhElMVprri04d w402b?BZ+9_?WyJcn03=Zy;2%VMDBk707TZ2zh)-C?EnA(07*qoM6N<$f&kix-2eap delta 420 zcmeywwwZZ?WIZzj1B1(wu46#TEWjtkb#I*igYM)n+bU0Gglq`$n&IYLVP<`!IBJQn zTaSao|5L3m7v~;H4hmJ!{{Q`ut(aV@rYTVC?cVQtKuV}2$S?RmI$(ITf4>j|1EZ9u zi(^Q|t=0?CWz32^%mJLqPaNu(^Zve{!+y!L$f*C-Z@Fl*11_iIetAyV+O%UX^NN4W z77g)DoB6WVCN*qh&Xe57$ot_U;~$~0fZGf!Bi}T1%-g*Cym7hklqpwK9Z$HchO%d5 zUC^myyYNY#!#;*FHK*T7|0hFudQn{AM~!8#!>!LKc{R?s7VyIOXs-%yq{ubCdbed! z!kPRVba=|2vn*c1Jc;FpS>rs3IoblL*Ap3pTmdK II;Vst0GAWG=>Px# diff --git a/src/main/resources/assets/create/textures/block/pipes_connected.png b/src/main/resources/assets/create/textures/block/pipes_connected.png index 6da2916c7e8eb5d36905689284ad688e6727a69a..b95aae0e288d865a31fe1c1ab977c8be99a9219f 100644 GIT binary patch delta 797 zcmV+&1LFLu1E~g(8Gi-<0047(dh`GQ00v@9M??TX06PFMuUFaY00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF;2%6Bi*G*$aPD0008ENklyK>V&6o$WKB+Jso zvYp9z09R1K3=crZE70)-(DDRybX2sw0UfVE#S<`-A_JAc^bNE&mMh#_2TNm>6DpkqarS9R-1&0H>M9+UTWV%>xLlqTYx-#y3H*Xd%Z{sDJCt@n!3TrG?R%lU0#Sff&1RrR zrm=r4LasWY<*Ic^{PscYHxEjynzX95y{7%+A){(hs!oXis?(kPrfbrwW>@6wik!5n z3DR}1eXGxa$Q?i!C)%7SR5eX~SZ|blMZ)5A+H2p+@_!PP3Rc6FIlAo9aDLJn zjpWS%e*S50{p8_7ON*G#^0JA*c@Q#*F59})xt--DPnTz$&8AwBhH=7q5OP;orUHP_d1kT zwYEmB_7qR5VuyxtQ8RNJZ5O=OM5v`{7$=B@h<0O0D| zCjgFKzPnDrzFyFI4~YM_=>6jGK_R-S7j)hVcYu0x>45o^(pslCmYn`yI5yvQ>f^$k zQ`_-&*ijaarG6S_X?yXuYThQ~AQ8q2jaqa$rd7fBjx-+%;)<7rgzLa=-xx b92W2w=4hw}(6v-X00000NkvXXu0mjf?vR4A delta 411 zcmV;M0c8HE2C4&)8Gi!+002a!ipBr{07XztR7C&)0RPH`{>g;&wt4flc z0004WQchC^rt5xW==nMp33mOZM zMeug1MPX+sw$cDtfq0F|OeG3cEFpvozV-6okiaMa02D%KfCMnoqSOEY002ovPDHLk FV1mC2y&wPp diff --git a/src/main/resources/assets/create/textures/block/pump.png b/src/main/resources/assets/create/textures/block/pump.png index eb1d541458db0fbf339c59ab07163f8bba665b4f..3eb0e4f85f361055d1af0b42644f3af91626073f 100644 GIT binary patch literal 800 zcmV+*1K<3KP)^iOXU+|t1Dk~+08PpsRI5%`h2gM;Rf)ht| zZr{2W0$5ylU0d5IkT2N)ScZ`%H4^DGZ-vl6XgYHD zU4rI~BI>6=Xb{l^s#5D&KrjK(Cds7(`I23qMDSfY9HPAm%Uk|zdNCnD?1Y0ss}5120{*S(uOSwT6Vb#T-!gR8bp@gHe!Yq| zbvurvTrMI#v%Xc~u!igT>vFlsjw72dqkft<)>($$k`22@(Q`ZGN5d8jipCrW%+(q5 zfBzxbPwhdFo;y&uj97;5Kg9O>Yi@gOld$XSSZMy)><4>wr~4NGaOUiJ%3BU|kJEhx e(IE~o2>t*IX%`C#13bk50000|zxF literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!aez;V>z8enFBj+Tjq|@z9OVsE z>FBT_#49d3swgLOhMV&eU$-6yhfoD=TQRv)86g%1IzWAAtTyBWDZ!E;zu^C9fI)Tb z%p{;>mZytjNX4z*Gmcz`4R~BGO7<%q4}J9N-}1GA3m&*GtY3JPnU}$AVh+ohHw-G% zUoH6lnc-+);29fU{r=Z+vG3;Hzopr0BX`^%>V!Z diff --git a/src/main/resources/assets/create/textures/block/scaffold/copper_scaffold.png b/src/main/resources/assets/create/textures/block/scaffold/copper_scaffold.png index 44e018a7d52eb1989616c688aebe36281b47b806..22716e6f48e1ee21325fddc609f3ac2216b66265 100644 GIT binary patch delta 447 zcmV;w0YLuH0nG!D7=H)`0000V^Z#K0000JJOGiWivH)TLM=-A|b^rhX32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rj3=<3m7e*nj*#H0mT1iAfR5;6}ld(%eK^(`wPtHz` zo+UgQdXr6W2qJMvjA(t(5V+Oel7oAje?d!2|3FjV5WGEz9DgFQAshlBdE0|ipPZf! z*I@V1l+yex2jBaCf5&}~GafHbl(o45lcoRwq2w@WDq4RMN{+4^0RV=50pjx>8h!u( z5K>N=8KqM?qZC5QNHtz8pk}ka)cy}N2g9Q>}YDMTvU#2O${u0HN&wjw8}-LwL&fr$F^X+U!AL< z-GR@0*h||8+8rF-JQ(w?qYJM${m5(FogJ%C3}CXvxMeZGZ%q13mHaLA!%x(YY8_WH{vkq~7%Ze7bq)965A$$0b&( pOAXLD;=R7i{K7@Je|`d^6kl&)vh=5+%`N}{002ovPDHLkV1hUlx`6-y delta 192 zcmX@he1UO-L_G^L0|Ud`yN`l^lw5#Mh%1o(f2#G%j;fc7b07Al+$fIP5aKo8+qK8R zp~B2Mh@+JUsDiO1$S;_|;n|HeASc1o#WAGfRx*cSh*_DLA!n+FxAuFD^%~mg9HoVY zoSeM8sVh6 zX$jKMP1Yh6NQXnBgi|0i1a7vswCzo#y z*OG^N=XpN{iSD!9@!a!$c;1KSx%Xl2&W^O$+A6{%3II^3j4+An&uJ7Yqeq7TfbTCA z0N_Q>igF)KQ33#{lukHvgiP2uLZDKr+r!)v0C>`~d~^k&jdesw5N7n~5D^m8vmR$u z0WW&CDN0Z&MSruXof zREs%HQ3rZMDeAy7$hhCEcPDx_{@Xxq$0)SSdD62lZ+{<#CbWZ-CbS}u7g9JBwjB!# z=?tK8fz0W2><{907*qoM6N<$f-!aGr~m)} delta 243 zcmV7#Aoj%3(#TCh|~ zpG!rIKtOmlJ5mUR3;+NC0d!JMQvg8b*k%9#0Fy~XK~#9!&5%I~!Y~j;ABu74Cu{Ut(uGe);W>yk#**AeV1d6M;CG801x zT@=)etlyhE6F|0;;UWXY{?Wqfcm;~(vp&f&Q(}FI6*H2VFubaM;Y`NXWZYEMC%>`Q thx*?>$mrr^ltl~VK9ptNs(qN52_LIqM19=~3@`uy002ovPDHLkV1ny#We)%V diff --git a/src/main/resources/assets/create/textures/block/scaffold/copper_scaffold_inside.png b/src/main/resources/assets/create/textures/block/scaffold/copper_scaffold_inside.png index 817149e036346a002784f267135e174d8f2d71a5..10ecd86eac81dd56adfcf85b73bbd8af18a860b5 100644 GIT binary patch delta 232 zcmbQh_=9nRL_G%^0|SHn=l_X7iY>|8-GyNjLlT3#!Fug7pa^GyM`SSr1Gg{;GcwGY zBLNg-FY)wsWq-jV%)=^k@pE|~P^i_@#WBR<^wCKhc^eFPSnN4kMR=T!vW4WhIv$ME zIjAG@Y<7U8t3#uV!2O@8`{#7uyyT~;e1R3Uij1crvfxH+?e?;pEj zef3n>YLyZ^`MSt))!{JQU4=f;IO6U fp|-$g^Batph5e5E+pqc!bPSpkC^>bP0l+XkK)9fkp diff --git a/src/main/resources/assets/create/textures/block/scaffold/copper_scaffold_inside_connected.png b/src/main/resources/assets/create/textures/block/scaffold/copper_scaffold_inside_connected.png index 4afcd96a025b024e39fc39c2e0539d6f4028c86e..589e7f540bd2505b6566d2a80fe1ca0a6bf157eb 100644 GIT binary patch delta 318 zcmV-E0m1&h0nGxC7=H)`0001UdV2H#000JJOGiWivH)TLM=-A|b^rhX32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rj3=<3m9zXpSeE(FbqY1qAFzI zAWXdhQ*Xt<(1BYqaRVj}(joN{CZkZ%C^(TCRrynE<-4x+9Di9|&L?k;fkci7QZM^E zYYdL|AWo9w1ptkW)j1*n!1exA92|$y4I+t*1W+o1 QqW}N^07*qoM6N<$g3xt&c>n+a delta 174 zcmX@hw2yIuL_HHT0|Nt}$fR^2#S`EY;tHgD92_dltWz~jv(C;b0P-12g8YIR9G=}s z19B2PT^vIyZmsRw$k|{Z!rIRvmNrpG{860vvy0bekPTGB7#*qh%772eR$eo|Bu2uWwhPey#1EGw{rII@4lYcC? YO}b!wotIms6lfWPr>mdKI;Vst0C>$lpa1{> diff --git a/src/main/resources/assets/create/textures/block/smart_pipe_1.png b/src/main/resources/assets/create/textures/block/smart_pipe_1.png index 6ac3dc7c547fe2acb1cfc57edb42740c9a7e8b3b..9f4fa882e809c343288a8e1dfa36d449f86f997e 100644 GIT binary patch delta 346 zcmV-g0j2)x0qO#f8Gi-<001BJ|6u?C00v@9M??TX06PFMuUFaY00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF;2%6Bi*NXaJUX0002@Nkl#^LJ+8 z&ttDk?yk?jFRo6}s$%u<%H(hiK$aI=-Yi&!DNm0t+}=O8eWPxGbOmP%pKz%-@g<%( z03aDV90!86Z;-Conqa?6+#?5o*}OIdo+R*O`#zhC)?*C-7)_@D?e9(9=sW(Q15KQ| zDMI&pb|(0W<5Ml3m9bUt4X`y2p*J8gm9-wcLHbz&uzojeijpX)ci$AhdgHMM=+qD{ s6o5vMpR-2eap07*qoM6N<$g8ns)p#T5? delta 217 zcmV;~04D$H0_p*f8Gi!+001a04^sdD076hqR7C&)0Q=m1_seYbwt3{YW9Xu6&Y)V~ ziekTxRmx~o$!AlfYe&3YPOwx;uTx2uUqGZyMx#tchfz0}MnjB1KzKGg9l^5u00001 zbW%=J06^y0W&i*HR!KxbRCwB*&p{4=APhuNskKmOMGM~ls!|$*LALzm+e~Je%P6Sm ziNP9VAofv!a)SiOtB-)`1NVX(U>g9Cy%+d{Fpr?RA00AKEv5EZqi{W8u(@M5!!!ea T?r76Y00000NkvXXu0mjfQSDnS diff --git a/src/main/resources/assets/create/textures/block/smart_pipe_2.png b/src/main/resources/assets/create/textures/block/smart_pipe_2.png index f730a8ebacc3f9a85979a28b6b86cddb2b7f843e..e7882a80a4e4945be5fe850bf3d9dc8fdc22afa8 100644 GIT binary patch delta 523 zcmV+m0`&cj0+|Gm8Gi-<001BJ|6u?C00v@9M??TX06PFMuUFaY00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF;2%6Bi*LsbP!U0004|Nkl#FkD?{{yG=6qin#tzS zoy){xNmUsWC4UZ!ybdV}R28rQ=mz2rhB=S)9fvXRCcwJ%={pXV?a~dL=o>sor|l1m zx}J|~_b^XvE^L?E`+$jbN+`OlwxYOddSHOGy?2yg??@gg$5g+*XX-$)Wvb#BCi)-E)a5mdWv~s)bT{>+a>FVwQMtps0W7YK7*)7I?q){9H0??ACJc0J+7XSbN N07*qoL(~GQ delta 252 zcmVSGFJ+Op7|XD- z?{BG*S$yPGu(eGrA}b;B+WolzsL(6W_Gk-KE08w=2#Mi2=Q(PWU+39s;$!7TRe&a= zt_HnF2mhe`rV7^tD8>ZnutG-yk{Nh-^kF)Si1q~_4hVP?zh=t-0000lg~;UQ5431Q|>sK z#H3>gAu(7`y3mEyWmlz-QT06pY4HiVaN{djD1~+rN_YNQh<_^=fl8sFg@l=g8pi8r zW^yxyaWR=`hj!8NtnNMMeBV9acevV{&F4|6VDM**#)^%DBkkhlR^+LWr?1~?NuOov z0LUO@G**bU#TEc%V-A2Db(Ipmn_a=33;`$=3iOdZkb_TmYOg?IvgoPtgdPmt0}@4iw@0v{QK6pdK6SZ>t- zm@$h0OaeazY&U-4&FOrYY6kdX57W8~LWB%LEK|<_ljfnk&KSGYtp9Cdz50-fp=Y)* zW5xu}_S;<b!?F`f66}mpJ?U6(H5*E5*N})9q0%7H~*bJ{qfxU-u3Tpnd!)a{4v^ zgZ>Y8cV21#OCSK8zRkz?ZKUV1zP_4kf(NPdo`+SbR;VaOXe6%#N8{2V?s8{$S`x>tIO$N-+Qx zb2NYyr?|K=fC!Kp28J1FoeV(0!~g<}#sMr~2J^WBHi)nsREo8H0VkNj9$LT+W^krW k-~}_dXKvtUU|?VX02TQqa;YX?^8f$<07*qoM6N<$f*ayqNB{r; diff --git a/src/main/resources/assets/create/textures/item/copper_door.png b/src/main/resources/assets/create/textures/item/copper_door.png index fb5356c31fdf0b1db8d62e77ed65c2044819692c..cf0b967b41df2af4035244aa88944ee0d5bfd852 100644 GIT binary patch delta 343 zcmdnZ^qgseWIY=L1B3kM|A|0~Ey>&6g~5Trn!#Xw_|4Zq5zYdS$YKTtzC$3)D5~Mr z02E{|@$_|Nf59WdAZWHhdj&sG=!>U|V~EA+4nlv<_D%f6lP{_)?n5bXOAh)o}jMG%*=eaHC+FHeU?w#X+>tWm^x7bvE+!thtKMr z5)ZZb8y#|(J28XV%=klMsKW_SpO%~sgMjosAKx(hRrWZvFn$jG$|D}P_fP%fo9t{W zZys$4;5{%aLu#_*5)Dq5B!+7ae?I&*Z*$5?iilmHp?d7Y*W>;?t?~7LQUaz39hUEK mUsu=UedouwX2xhEcXoycfBmBUZ%hV-9fPN6*{&CS!=}Ga`>$Z0vJR2Gk{GdDe!mF1nF5E22$pq>P zpIPe$qy$TX{DS|Z0S48z^)r)zvYZ7Tk;M!Qe1|}oQB=dL0Vr7F>Ealo5uAIjk?W`e z2W!CQ)!S~(`u~4xaigJ}ztM*R!ISl`^aCP~?rD4BB&rm(QYFN+BlE7pt-gD0Dswg* z{wrlsp7iCXlbXch^(^U5%+J^(bcHT|;9H%zBdvy$XLn=TCdW0ADmEu&MW)Znx-(CJ eX@OYLclNi8T+MD(yE%alVDNPHb6Mw<&;$TUb9k2k diff --git a/src/main/resources/assets/create/textures/item/copper_ingot.png b/src/main/resources/assets/create/textures/item/copper_ingot.png index 8fbd9863ba323f284fc8893b839172caef957dc3..e206323f0a3c8624dbc6087e48f32fdee7af44ec 100644 GIT binary patch delta 405 zcmV;G0c!r#0iy$u7=H)`0000V^Z#K0000JJOGiWiKma=cFt1nH>i_@%32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rj3={wh4_^b?+yDRpFiAu~R5;7klCes|P!xv0NCFX( zrI4{8LJEO&7VO}ZNkWNv9I>k_hoI(cTP6U{Zv_ueOUbES(B;{XWVInJYtpjD zHZ*QWLjcj3DEm4MPEPVLb^cpe7QI4i234CY}VO?II?i=}B=*1Q)LJyUOon3gq!0q6IRC@+gv zC)?0kaHB=Q(e@9dWqlCtnL1ffF->wNi?yPTXG_HgVOyqz_QBEXr+oKhv2O3dc(zo0 z&k-E!GDzFdm?pWLZX5b_6PtaAKB`XWZ`Buo{jA-60uGu<00000NkvXXu0mjf7UZg2 delta 196 zcmZ3?e1&m>L_G^L0|Ud`yN`l^lwyESh%1o(|L4{JFFXETYkM^@=~hzEK^M0f&dw7Z zoXQO?VpR;v(z=y^iWp0R{DK)Ap4~_TauPjV978H@B_CkCq#zPK%bR(|?4+DWjE}6e zHKmzbCr#<;ozgQ^Ng}FsO7GMucUDV8$xfXTa_aPE3EQaH7MrwlbLJi0aOP;zvon&B w+!8y2bkfS!L@}78MY>$q+ORXmK`)Gf!J<-;7NB{r; diff --git a/src/main/resources/assets/create/textures/item/copper_nugget.png b/src/main/resources/assets/create/textures/item/copper_nugget.png index 96f0cade2cace0140fbdf326ff1806ab656300a0..49841cbe6424805f9aea3f67c1756852c70fb35e 100644 GIT binary patch delta 289 zcmbQkxPfVcL_G%^0|SHn=l_X7iY>|8-G#w{!J5HfefZ7SKoQOYkH}&M25w;xW@MN( zM*=9wUgGKN%Km~!gn?VghIJb&P-w5Gi(`nz>Er|n){27%H8%e*jxqiJIQVdr|K?ef zn3`t^F&~y;Yx}Rcd%bZ|@bMP!&0F{KH?LU3$6U|M%;-5~LD&eWR+KE$7H zX#@htBesnXUmVos5x@UGLE%)x?f5$5JvVnYfaD(TpT>E3<4ay1_4)P3B-wm+sPy^f zCnW4CV_ToLhHXiX)%hJiUZk=CLEH8I^#&kd^Y2e{;-{IvBbX-&PCpsjH|xKAecKOd fsp-!G85kM*-R&PnaxJX|dWFH$)z4*}Q$iB}u375L_G^L0|Ud`yN`l^lyrbkh%1o(|L4{JFFXETYkM^@=~hzEK^M1)4op4R)76jFWt~$(6954mFQ)(i diff --git a/src/main/resources/assets/create/textures/item/copper_sheet.png b/src/main/resources/assets/create/textures/item/copper_sheet.png index 89ffb0e65af3bc2e771edd55bcecabf0d4308547..3482b5526044e7e76afb862c00da0d948bfa5d96 100644 GIT binary patch delta 434 zcmV;j0Zsn00l)*07=H)`0000V^Z#K0000JJOGiWiKma=cFt1nH>i_@%32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rj3={wh6xC)EFaQ7nO-V#SR5;7MlQC<;Kp2Lfh}p7s zELb4{OBD)22M6iUDN^VUD0Fb`>QCs?|tvPz#mK7wc(r}CvvfhsrNkP+3YT%T{4-@<^WhF69*C%MB5f$ z*%ttW!32QLlaBzl+%b**CM2^iwo4|-VHtqE{Ua$9pvy{;+tWg#1c+L6n@Wgj=uBtx z6eJ_Mn}#m!E`PdB2^0`3p97GP>+(UObRZyMFiAN9@WY7CaGZ`%sn#$JU3OV_;ttw$ zhGT{=5u;_yXc=#faTOB=6Drjj4B8T6<#V`$HhvgM(cR;-rW~VlR!HoVq7?gY@0f-z z#oNMEgnG}@L^dm*lW|@@etyaumssz4TFd>0_+dm4?JMrCoI<1TX*c%|zy6uBs*hhC c6aJ$<0VV;OA6_`XOaK4?07*qoM6N<$f(;6@p8x;= delta 162 zcmX@WyoqswL_G^L0|Ud`yN`l^lth3}h%1o(|L4{JFFXETYkM^@>7a|-L6@%@Q z-<=1_F_r}R1v5B2yO9RuczC)vhE&{2R$z!=Rw&8nkZvg}EA(Wzd`wL(&!JK^H90x` zDGOVfyK1uP(k)DEZ9i_@%32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rj3={whItj2I{{R31cu7P-R5;7slD$hpVHC!Hw}iro zD66TcFoG^Y8ZIU@^?^+dMT?6?&{9)FM00C{&=f?FLtEg`5`RR4IA~}jBBJQ!CYLmg zAcdRMZMfb(tbd@M>2S{TJm)>{Iq>HpG$tmuRyBZ8C4;@|6@bq4J#rPcuTnqwrbhAn z<_h8DEgWZ9YVXkt_8xgSn4&)fQ^zABX=hQ;1Rn4G+!hum<;jqf`=y2LGk>MXt~Tq zG|qJ0Aa^H|EmB78L+Ce=yi@Ws$>AT%01&&^}Hee^^m?|*yYfSI30`#{7<|CH}91; TWx^Tr}uCgOSWsFDLCY(h?Rit*1`UJ}oUFp%LXYJ0x1Wq07=L%E`KcDM77H an(^sdq0pONqI^K(89ZJ6T-G@yGywo-FF{ZM diff --git a/src/main/resources/assets/create/textures/models/armor/copper_diving_layer_1.png b/src/main/resources/assets/create/textures/models/armor/copper_diving_layer_1.png index c9c4964384c294f3d5203f2631dfe752589948b1..40eb6574660d6b12726e933b8fc2027e1909aea8 100644 GIT binary patch delta 1873 zcmV-X2d?;-1=S9a8Gi-<005$$euMx300v@9M??TX06PFMuUFaY00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF;2%6aX1Ec=93#000K!NklNp z+96d)9RkV(l)@-0wT|6t}Jb-H0ge4y% zle5Iaaetz1K?Zh3h&D@jV-WyK=`0HwgG-mQEF|-!)f7GLaq_0+x=aNrt3#zwnVh=~3c$6c@&!C4>n29MKeznXW?}NTxndCJQ)v!^GGST%?ySI_d zXv-%xD?k>&L4iT_{OvM8!Lra)n*;aW>B78}&bn|1C=D-g0)~bLNu>?`{c;*}QFCvuU|Dp%>kh(E zKhT0cpJL>~Sk>Zx{NW1fLXm6NUw0z~fY_wab!U*Fp+NxGu-=G5DXUfS2&c~9UIQHb z(Vq}S|C%)R7hk&Dbph>k62N)$fSH&=yMLLaZ%+hzAsqGd^^ySZC0@_qd+sV%!d4}5se~}U&&$zI4WNX5 zeE!T$f{~cR?%6cI`B)2@YV+9dFS)ua*Vn2JS0_oPWz!l9p(qNe`8ndP?e3^)8h?tS zplKSNUE9g28GiNMeU#E!zWVGHLg8j+u1&c*|7{Pz)j7JaAKkL~;mGnjPw)0S%BvHZ z%Kyq6{Z>~y!AO9PZU+&w(>nQVfoB#}^hLwft+mJM>(%p#sn^#X21kB;xU8u*_dI#> ze+r$y{n`U%fX_Vr;xYp2E!wwdSARK|Hwgtra(T0EeShr1z2%=zs#WDNfE)_&jh--% zoI3BJfuwFGC3wH;n--t3)nuy5oAv=ZcT7 z^!Jr>4OI)g-3^}l#QVyv5e0zxtdm0jayE~?Xt*u0qFq96lK4tTkb-5gQh&cSqL3?? z+)(pX`)&&d2?fLruNB_53#dkkLnqF94xKpbQH>IzfXMwpkeejrkm&rHB<>G79I#ry zt*eDlKqM?J(@|LR5(R_TlYhQY zQ?K6myMJEUSPuAN%nR5^{VlZ1fu%m6f?rxHUgQ9e1|35X^AZpQ+M1m(mdtG7*l3of zfS<)ev1;7=!B!SezkkAFp@{ delta 651 zcmV;60(AY=4wway8Gi!+005OkjEg-1bzMnG6m zL@ZcYDpXQRLpDi5HB34vK|C=)J1{~zD@HXXIyEghG%P?cB7ZV2C@d)?G$tG*As#rl z4xj)400DGTPE!Ct=GbNc00GNML_t(|+ND!rbDJ;>Wn^;5Ww2tcYg#3jX~bu0y6;+@BfLxLT$hDl3(!!t3Bg$~)`kD?RibSON?OT^m(=&(_kFs=c)7&a7hS(!UjLM6UW)?C z_UOE7sL=bHuH)PL&l1gRQNVlWT!Z4ghQ2B|9;=mTz%+0$(1_`-w!%Af4rOZ_h<+=- lW;`LbEy{=4Io>Mp52{l>>n9>2R{#J207*qoL Date: Fri, 20 Dec 2024 09:31:12 +0100 Subject: [PATCH 209/515] Copperpocalypse: the last pipe bender --- .../java/com/simibubi/create/AllBlocks.java | 2 +- .../java/com/simibubi/create/AllShapes.java | 4 +-- .../fluids/FluidTransportBehaviour.java | 1 + .../fluids/pipes/FluidPipeBlockEntity.java | 29 +++++++++++-------- .../fluids/pipes/StraightPipeBlockEntity.java | 6 +++- .../models/block/fluid_pipe/casing.json | 2 +- .../models/block/fluid_pipe/core_x.json | 2 +- .../models/block/fluid_pipe/core_y.json | 2 +- .../models/block/fluid_pipe/core_z.json | 2 +- .../create/models/block/fluid_pipe/item.json | 2 +- 10 files changed, 30 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 469fd4cf5d..756353fe53 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -906,7 +906,7 @@ public class AllBlocks { public static final BlockEntry GLASS_FLUID_PIPE = REGISTRATE.block("glass_fluid_pipe", GlassFluidPipeBlock::new) .initialProperties(SharedProperties::copperMetal) - .properties(p -> p.forceSolidOn()) + .properties(p -> p.noOcclusion()) .addLayer(() -> RenderType::cutoutMipped) .transform(pickaxeOnly()) .blockstate((c, p) -> { diff --git a/src/main/java/com/simibubi/create/AllShapes.java b/src/main/java/com/simibubi/create/AllShapes.java index 73350e5dc3..26cd6db24c 100644 --- a/src/main/java/com/simibubi/create/AllShapes.java +++ b/src/main/java/com/simibubi/create/AllShapes.java @@ -111,9 +111,7 @@ public class AllShapes { .add(5, 0, 5, 11, 1, 9) .add(5, -1, 6, 11, 0, 8) .forHorizontal(SOUTH), - PUMP = shape(2, 0, 2, 14, 5, 14).add(4, 0, 4, 12, 16, 12) - .add(3, 11, 3, 13, 16, 13) - .forDirectional(Direction.UP), + PUMP = shape(2, 0, 2, 14, 16, 14).forDirectional(Direction.UP), CRUSHING_WHEEL_CONTROLLER_COLLISION = shape(0, 0, 0, 16, 13, 16).forDirectional(Direction.DOWN), BELL_FLOOR = shape(0, 0, 5, 16, 11, 11).add(3, 1, 3, 13, 13, 13) diff --git a/src/main/java/com/simibubi/create/content/fluids/FluidTransportBehaviour.java b/src/main/java/com/simibubi/create/content/fluids/FluidTransportBehaviour.java index 82ba047df8..e011f98a8d 100644 --- a/src/main/java/com/simibubi/create/content/fluids/FluidTransportBehaviour.java +++ b/src/main/java/com/simibubi/create/content/fluids/FluidTransportBehaviour.java @@ -260,6 +260,7 @@ public abstract class FluidTransportBehaviour extends BlockEntityBehaviour { public enum AttachmentTypes { NONE, CONNECTION(ComponentPartials.CONNECTION), + DETAILED_CONNECTION(ComponentPartials.RIM_CONNECTOR), RIM(ComponentPartials.RIM_CONNECTOR, ComponentPartials.RIM), PARTIAL_RIM(ComponentPartials.RIM), DRAIN(ComponentPartials.RIM_CONNECTOR, ComponentPartials.DRAIN), diff --git a/src/main/java/com/simibubi/create/content/fluids/pipes/FluidPipeBlockEntity.java b/src/main/java/com/simibubi/create/content/fluids/pipes/FluidPipeBlockEntity.java index d421d42a00..4d4f79db11 100644 --- a/src/main/java/com/simibubi/create/content/fluids/pipes/FluidPipeBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/fluids/pipes/FluidPipeBlockEntity.java @@ -2,7 +2,6 @@ package com.simibubi.create.content.fluids.pipes; import java.util.List; -import com.simibubi.create.AllBlocks; import com.simibubi.create.api.contraption.ITransformableBlockEntity; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.decoration.bracket.BracketedBlockEntityBehaviour; @@ -65,19 +64,25 @@ public class FluidPipeBlockEntity extends SmartBlockEntity implements ITransform if (state.getBlock() instanceof EncasedPipeBlock && attachment != AttachmentTypes.DRAIN) return AttachmentTypes.NONE; - if (attachment == AttachmentTypes.RIM && !FluidPipeBlock.isPipe(otherState) - && !AllBlocks.MECHANICAL_PUMP.has(otherState) && !AllBlocks.ENCASED_FLUID_PIPE.has(otherState)) { - FluidTransportBehaviour pipeBehaviour = - BlockEntityBehaviour.get(world, offsetPos, FluidTransportBehaviour.TYPE); - if (pipeBehaviour != null) - if (pipeBehaviour.canHaveFlowToward(otherState, direction.getOpposite())) - return AttachmentTypes.CONNECTION; + if (attachment == AttachmentTypes.RIM) { + if (!FluidPipeBlock.isPipe(otherState) && !(otherState.getBlock() instanceof EncasedPipeBlock) + && !(otherState.getBlock() instanceof GlassFluidPipeBlock)) { + FluidTransportBehaviour pipeBehaviour = + BlockEntityBehaviour.get(world, offsetPos, FluidTransportBehaviour.TYPE); + if (pipeBehaviour != null && pipeBehaviour.canHaveFlowToward(otherState, direction.getOpposite())) + return AttachmentTypes.DETAILED_CONNECTION; + } + + if (!FluidPipeBlock.shouldDrawRim(world, pos, state, direction)) + return FluidPropagator.getStraightPipeAxis(state) == direction.getAxis() + ? AttachmentTypes.CONNECTION + : AttachmentTypes.DETAILED_CONNECTION; } - if (attachment == AttachmentTypes.RIM && !FluidPipeBlock.shouldDrawRim(world, pos, state, direction)) - return AttachmentTypes.CONNECTION; - if (attachment == AttachmentTypes.NONE && state.getValue(FluidPipeBlock.PROPERTY_BY_DIRECTION.get(direction))) - return AttachmentTypes.CONNECTION; + if (attachment == AttachmentTypes.NONE + && state.getValue(FluidPipeBlock.PROPERTY_BY_DIRECTION.get(direction))) + return AttachmentTypes.DETAILED_CONNECTION; + return attachment; } diff --git a/src/main/java/com/simibubi/create/content/fluids/pipes/StraightPipeBlockEntity.java b/src/main/java/com/simibubi/create/content/fluids/pipes/StraightPipeBlockEntity.java index de8a98ca84..2a4dc3d92d 100644 --- a/src/main/java/com/simibubi/create/content/fluids/pipes/StraightPipeBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/fluids/pipes/StraightPipeBlockEntity.java @@ -51,8 +51,12 @@ public class StraightPipeBlockEntity extends SmartBlockEntity { if (attachment == AttachmentTypes.RIM && state.getBlock() instanceof FluidValveBlock) return AttachmentTypes.NONE; - if (attachment == AttachmentTypes.RIM && FluidPipeBlock.isPipe(otherState)) + if (attachment == AttachmentTypes.RIM && !(state.getBlock() instanceof GlassFluidPipeBlock) + && otherState.getBlock() instanceof GlassFluidPipeBlock) return AttachmentTypes.PARTIAL_RIM; + + if (attachment == AttachmentTypes.RIM && FluidPipeBlock.isPipe(otherState)) + return AttachmentTypes.NONE; if (axis == otherAxis && axis != null) return AttachmentTypes.NONE; diff --git a/src/main/resources/assets/create/models/block/fluid_pipe/casing.json b/src/main/resources/assets/create/models/block/fluid_pipe/casing.json index 7cec3a5d75..28f15e5d5e 100644 --- a/src/main/resources/assets/create/models/block/fluid_pipe/casing.json +++ b/src/main/resources/assets/create/models/block/fluid_pipe/casing.json @@ -2,7 +2,7 @@ "credit": "Made with Blockbench", "textures": { "0": "create:block/pipes", - "particle": "create:block/pipes" + "particle": "block/copper_block" }, "elements": [ { diff --git a/src/main/resources/assets/create/models/block/fluid_pipe/core_x.json b/src/main/resources/assets/create/models/block/fluid_pipe/core_x.json index 55c1936e33..3f5f3639e2 100644 --- a/src/main/resources/assets/create/models/block/fluid_pipe/core_x.json +++ b/src/main/resources/assets/create/models/block/fluid_pipe/core_x.json @@ -2,7 +2,7 @@ "credit": "Made with Blockbench", "textures": { "0": "create:block/pipes_connected", - "particle": "create:block/pipes_connected" + "particle": "block/copper_block" }, "elements": [ { diff --git a/src/main/resources/assets/create/models/block/fluid_pipe/core_y.json b/src/main/resources/assets/create/models/block/fluid_pipe/core_y.json index 6ddf32ea58..d0791dd097 100644 --- a/src/main/resources/assets/create/models/block/fluid_pipe/core_y.json +++ b/src/main/resources/assets/create/models/block/fluid_pipe/core_y.json @@ -2,7 +2,7 @@ "credit": "Made with Blockbench", "textures": { "0": "create:block/pipes_connected", - "particle": "create:block/pipes_connected" + "particle": "block/copper_block" }, "elements": [ { diff --git a/src/main/resources/assets/create/models/block/fluid_pipe/core_z.json b/src/main/resources/assets/create/models/block/fluid_pipe/core_z.json index 984be9bbd2..36e6ee5b1c 100644 --- a/src/main/resources/assets/create/models/block/fluid_pipe/core_z.json +++ b/src/main/resources/assets/create/models/block/fluid_pipe/core_z.json @@ -2,7 +2,7 @@ "credit": "Made with Blockbench", "textures": { "0": "create:block/pipes_connected", - "particle": "create:block/pipes_connected" + "particle": "block/copper_block" }, "elements": [ { diff --git a/src/main/resources/assets/create/models/block/fluid_pipe/item.json b/src/main/resources/assets/create/models/block/fluid_pipe/item.json index 8589a5065b..ecde71aaa8 100644 --- a/src/main/resources/assets/create/models/block/fluid_pipe/item.json +++ b/src/main/resources/assets/create/models/block/fluid_pipe/item.json @@ -3,7 +3,7 @@ "parent": "block/block", "textures": { "1": "create:block/pipes", - "particle": "create:block/pipes" + "particle": "block/copper_block" }, "elements": [ { From ad1ea7a4978fb67e2fd49c434f8ab59070662a2a Mon Sep 17 00:00:00 2001 From: Kryppers <65094918+Kryppers@users.noreply.github.com> Date: Fri, 20 Dec 2024 18:11:27 +0000 Subject: [PATCH 210/515] Copperpocalypse: 2 Fast 2 Fluidous Bunch more texture and model updates for the copper assets. --- .../fluid_valve/block_horizontal_closed.json | 66 +++-- .../fluid_valve/block_horizontal_open.json | 66 +++-- .../fluid_valve/block_vertical_closed.json | 64 +++-- .../fluid_valve/block_vertical_open.json | 68 +++-- .../create/models/block/fluid_valve/item.json | 193 ++++++------- .../models/block/fluid_valve/pointer.json | 118 +------- .../create/models/block/item_drain.json | 70 +---- .../block/portable_fluid_interface/block.json | 54 +--- .../block_middle.json | 15 +- .../block_middle_powered.json | 18 +- .../portable_fluid_interface/block_top.json | 138 +--------- .../block/portable_fluid_interface/item.json | 194 +++---------- .../create/models/block/spout/block.json | 204 ++++---------- .../create/models/block/spout/bottom.json | 13 +- .../create/models/block/spout/item.json | 257 +++++------------- .../create/models/block/spout/middle.json | 14 +- .../assets/create/models/block/spout/top.json | 14 +- .../models/block/steam_engine/block.json | 26 +- .../models/block/steam_engine/item.json | 31 +-- .../block/steam_engine/steam_engine.bbmodel | 1 - .../create/models/item/potato_cannon/cog.json | 78 +++--- .../models/item/potato_cannon/item.json | 69 +++-- .../block/copper_casing_connected.png | Bin 1467 -> 12835 bytes .../textures/block/copper_redstone_plate.png | Bin 277 -> 5690 bytes .../block/copper_redstone_plate_powered.png | Bin 269 -> 5697 bytes .../textures/block/copper_underside.png | Bin 147 -> 5224 bytes .../create/textures/block/encased_pipe.png | Bin 451 -> 451 bytes .../assets/create/textures/block/engine.png | Bin 491 -> 7143 bytes .../textures/block/fluid_chute_powered.png | Bin 0 -> 370 bytes .../textures/block/fluid_chute_unpowered.png | Bin 0 -> 365 bytes .../create/textures/block/fluid_valve.png | Bin 474 -> 6817 bytes .../create/textures/block/item_drain_side.png | Bin 241 -> 5048 bytes .../create/textures/block/item_drain_top.png | Bin 218 -> 5258 bytes .../create/textures/block/ladder_copper.png | Bin 145 -> 5000 bytes .../textures/block/ladder_copper_hoop.png | Bin 133 -> 4593 bytes .../assets/create/textures/block/pipes.png | Bin 882 -> 882 bytes .../create/textures/block/pipes_connected.png | Bin 809 -> 809 bytes .../block/portable_fluid_interface.png | Bin 679 -> 7624 bytes .../assets/create/textures/block/pump.png | Bin 800 -> 6357 bytes .../create/textures/block/smart_pipe_1.png | Bin 362 -> 362 bytes .../create/textures/block/smart_pipe_2.png | Bin 537 -> 537 bytes .../assets/create/textures/block/spout.png | Bin 594 -> 7275 bytes .../create/textures/block/spout_nozzle.png | Bin 0 -> 392 bytes .../create/textures/block/valve_closed.png | Bin 0 -> 506 bytes .../create/textures/block/valve_open.png | Bin 0 -> 512 bytes .../create/textures/item/copper_door.png | Bin 359 -> 359 bytes .../create/textures/item/copper_ingot.png | Bin 419 -> 419 bytes .../create/textures/item/copper_nugget.png | Bin 304 -> 304 bytes .../create/textures/item/copper_sheet.png | Bin 448 -> 448 bytes .../textures/item/crushed_raw_copper.png | Bin 491 -> 491 bytes .../create/textures/item/potato_cannon.png | Bin 824 -> 11791 bytes .../models/armor/copper_diving_layer_1.png | Bin 1877 -> 1877 bytes 52 files changed, 612 insertions(+), 1159 deletions(-) delete mode 100644 src/main/resources/assets/create/models/block/steam_engine/steam_engine.bbmodel create mode 100644 src/main/resources/assets/create/textures/block/fluid_chute_powered.png create mode 100644 src/main/resources/assets/create/textures/block/fluid_chute_unpowered.png create mode 100644 src/main/resources/assets/create/textures/block/spout_nozzle.png create mode 100644 src/main/resources/assets/create/textures/block/valve_closed.png create mode 100644 src/main/resources/assets/create/textures/block/valve_open.png diff --git a/src/main/resources/assets/create/models/block/fluid_valve/block_horizontal_closed.json b/src/main/resources/assets/create/models/block/fluid_valve/block_horizontal_closed.json index aa081f5577..c0f6d1e8b5 100644 --- a/src/main/resources/assets/create/models/block/fluid_valve/block_horizontal_closed.json +++ b/src/main/resources/assets/create/models/block/fluid_valve/block_horizontal_closed.json @@ -2,8 +2,8 @@ "credit": "Made with Blockbench", "textures": { "2": "create:block/fluid_valve", - "4": "create:block/pipes", - "particle": "create:block/copper_plating" + "3": "create:block/valve_closed", + "particle": "create:block/copper_underside" }, "elements": [ { @@ -12,12 +12,38 @@ "to": [14, 14, 14], "rotation": {"angle": 0, "axis": "y", "origin": [24, 11, 11]}, "faces": { - "north": {"uv": [6, 6, 12, 12], "texture": "#2"}, - "east": {"uv": [6, 0, 12, 6], "texture": "#2"}, - "south": {"uv": [0, 0, 6, 6], "texture": "#2"}, - "west": {"uv": [6, 0, 12, 6], "texture": "#2"}, - "up": {"uv": [0, 0, 6, 6], "rotation": 90, "texture": "#2"}, - "down": {"uv": [0, 0, 6, 6], "rotation": 90, "texture": "#2"} + "north": {"uv": [1, 1, 7, 7], "rotation": 90, "texture": "#2"}, + "east": {"uv": [9, 1, 15, 7], "rotation": 90, "texture": "#2"}, + "south": {"uv": [1, 1, 7, 7], "rotation": 90, "texture": "#2"}, + "west": {"uv": [9, 1, 15, 7], "rotation": 90, "texture": "#2"}, + "up": {"uv": [1, 9, 7, 15], "rotation": 90, "texture": "#2"}, + "down": {"uv": [1, 9, 7, 15], "rotation": 90, "texture": "#2"} + } + }, + { + "name": "ValveCenter", + "from": [2, 2, 3], + "to": [14, 14, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [24, 11, 12]}, + "faces": { + "north": {"uv": [2, 2, 14, 14], "rotation": 90, "texture": "#3"}, + "east": {"uv": [7.5, 1, 8, 7], "texture": "#2"}, + "west": {"uv": [7.5, 1, 8, 7], "texture": "#2"}, + "up": {"uv": [7.5, 1, 8, 7], "rotation": 90, "texture": "#2"}, + "down": {"uv": [7.5, 1, 8, 7], "rotation": 90, "texture": "#2"} + } + }, + { + "name": "ValveCenter", + "from": [2, 2, 14], + "to": [14, 14, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 13.5]}, + "faces": { + "east": {"uv": [7.5, 1, 8, 7], "texture": "#2"}, + "south": {"uv": [2, 2, 14, 14], "rotation": 90, "texture": "#3"}, + "west": {"uv": [7.5, 1, 8, 7], "texture": "#2"}, + "up": {"uv": [7.5, 1, 8, 7], "rotation": 270, "texture": "#2"}, + "down": {"uv": [7.5, 1, 8, 7], "rotation": 270, "texture": "#2"} } }, { @@ -25,12 +51,12 @@ "to": [13, 16, 13], "rotation": {"angle": 0, "axis": "z", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [4, 8.5, 9, 9.5], "texture": "#4"}, - "east": {"uv": [4, 8.5, 9, 9.5], "texture": "#4"}, - "south": {"uv": [4, 8.5, 9, 9.5], "texture": "#4"}, - "west": {"uv": [4, 8.5, 9, 9.5], "texture": "#4"}, - "up": {"uv": [11, 11, 16, 16], "rotation": 90, "texture": "#4"}, - "down": {"uv": [0, 0, 0, 0], "rotation": 90, "texture": "#4"} + "north": {"uv": [7.5, 1.5, 8.5, 6.5], "rotation": 90, "texture": "#2"}, + "east": {"uv": [7.5, 1.5, 8.5, 6.5], "rotation": 90, "texture": "#2"}, + "south": {"uv": [7.5, 1.5, 8.5, 6.5], "rotation": 90, "texture": "#2"}, + "west": {"uv": [7.5, 1.5, 8.5, 6.5], "rotation": 90, "texture": "#2"}, + "up": {"uv": [1.5, 9.5, 6.5, 14.5], "rotation": 90, "texture": "#2"}, + "down": {"uv": [0, 0, 0, 0], "rotation": 90, "texture": "#2"} } }, { @@ -38,12 +64,12 @@ "to": [13, 2, 13], "rotation": {"angle": 0, "axis": "z", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [4, 9.5, 9, 8.5], "texture": "#4"}, - "east": {"uv": [4, 9.5, 9, 8.5], "texture": "#4"}, - "south": {"uv": [4, 9.5, 9, 8.5], "texture": "#4"}, - "west": {"uv": [4, 9.5, 9, 8.5], "texture": "#4"}, - "up": {"uv": [0, 0, 0, 0], "rotation": 90, "texture": "#4"}, - "down": {"uv": [16, 11, 11, 16], "rotation": 90, "texture": "#4"} + "north": {"uv": [8.5, 1.5, 7.5, 6.5], "rotation": 90, "texture": "#2"}, + "east": {"uv": [8.5, 1.5, 7.5, 6.5], "rotation": 90, "texture": "#2"}, + "south": {"uv": [8.5, 1.5, 7.5, 6.5], "rotation": 90, "texture": "#2"}, + "west": {"uv": [8.5, 1.5, 7.5, 6.5], "rotation": 90, "texture": "#2"}, + "up": {"uv": [0, 0, 0, 0], "rotation": 90, "texture": "#2"}, + "down": {"uv": [7, 9, 1, 15], "rotation": 90, "texture": "#2"} } } ] diff --git a/src/main/resources/assets/create/models/block/fluid_valve/block_horizontal_open.json b/src/main/resources/assets/create/models/block/fluid_valve/block_horizontal_open.json index 4f830bff58..a74c0fcd2a 100644 --- a/src/main/resources/assets/create/models/block/fluid_valve/block_horizontal_open.json +++ b/src/main/resources/assets/create/models/block/fluid_valve/block_horizontal_open.json @@ -2,8 +2,8 @@ "credit": "Made with Blockbench", "textures": { "2": "create:block/fluid_valve", - "4": "create:block/pipes", - "particle": "create:block/copper_plating" + "3": "create:block/valve_open", + "particle": "create:block/copper_underside" }, "elements": [ { @@ -12,12 +12,12 @@ "to": [14, 14, 14], "rotation": {"angle": 0, "axis": "y", "origin": [24, 11, 11]}, "faces": { - "north": {"uv": [6, 6, 12, 12], "texture": "#2"}, - "east": {"uv": [6, 0, 12, 6], "texture": "#2"}, - "south": {"uv": [0, 6, 6, 12], "texture": "#2"}, - "west": {"uv": [6, 0, 12, 6], "texture": "#2"}, - "up": {"uv": [0, 0, 6, 6], "rotation": 90, "texture": "#2"}, - "down": {"uv": [0, 0, 6, 6], "rotation": 90, "texture": "#2"} + "north": {"uv": [1, 1, 7, 7], "rotation": 90, "texture": "#2"}, + "east": {"uv": [9, 1, 15, 7], "rotation": 90, "texture": "#2"}, + "south": {"uv": [1, 1, 7, 7], "rotation": 90, "texture": "#2"}, + "west": {"uv": [9, 1, 15, 7], "rotation": 90, "texture": "#2"}, + "up": {"uv": [1, 9, 7, 15], "rotation": 90, "texture": "#2"}, + "down": {"uv": [1, 9, 7, 15], "rotation": 90, "texture": "#2"} } }, { @@ -25,12 +25,12 @@ "to": [13, 16, 13], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [4, 8.5, 9, 9.5], "texture": "#4"}, - "east": {"uv": [4, 8.5, 9, 9.5], "texture": "#4"}, - "south": {"uv": [4, 8.5, 9, 9.5], "texture": "#4"}, - "west": {"uv": [4, 8.5, 9, 9.5], "texture": "#4"}, - "up": {"uv": [11, 11, 16, 16], "rotation": 90, "texture": "#4"}, - "down": {"uv": [0, 0, 0, 0], "rotation": 90, "texture": "#4"} + "north": {"uv": [7.5, 1.5, 8.5, 6.5], "rotation": 90, "texture": "#2"}, + "east": {"uv": [7.5, 1.5, 8.5, 6.5], "rotation": 90, "texture": "#2"}, + "south": {"uv": [7.5, 1.5, 8.5, 6.5], "rotation": 90, "texture": "#2"}, + "west": {"uv": [7.5, 1.5, 8.5, 6.5], "rotation": 90, "texture": "#2"}, + "up": {"uv": [1.5, 9.5, 6.5, 14.5], "rotation": 90, "texture": "#2"}, + "down": {"uv": [0, 0, 0, 0], "rotation": 90, "texture": "#2"} } }, { @@ -38,12 +38,38 @@ "to": [13, 2, 13], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [4, 9.5, 9, 8.5], "texture": "#4"}, - "east": {"uv": [4, 9.5, 9, 8.5], "texture": "#4"}, - "south": {"uv": [4, 9.5, 9, 8.5], "texture": "#4"}, - "west": {"uv": [4, 9.5, 9, 8.5], "texture": "#4"}, - "up": {"uv": [0, 0, 0, 0], "rotation": 90, "texture": "#4"}, - "down": {"uv": [16, 11, 11, 16], "rotation": 90, "texture": "#4"} + "north": {"uv": [8.5, 1.5, 7.5, 6.5], "rotation": 90, "texture": "#2"}, + "east": {"uv": [8.5, 1.5, 7.5, 6.5], "rotation": 90, "texture": "#2"}, + "south": {"uv": [8.5, 1.5, 7.5, 6.5], "rotation": 90, "texture": "#2"}, + "west": {"uv": [8.5, 1.5, 7.5, 6.5], "rotation": 90, "texture": "#2"}, + "up": {"uv": [0, 0, 0, 0], "rotation": 90, "texture": "#2"}, + "down": {"uv": [7, 9, 1, 15], "rotation": 90, "texture": "#2"} + } + }, + { + "name": "ValveCenter", + "from": [2, 2, 3], + "to": [14, 14, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [24, 11, 12]}, + "faces": { + "north": {"uv": [2, 2, 14, 14], "rotation": 90, "texture": "#3"}, + "east": {"uv": [7.5, 1, 8, 7], "texture": "#2"}, + "west": {"uv": [7.5, 1, 8, 7], "texture": "#2"}, + "up": {"uv": [7.5, 1, 8, 7], "rotation": 90, "texture": "#2"}, + "down": {"uv": [7.5, 1, 8, 7], "rotation": 90, "texture": "#2"} + } + }, + { + "name": "ValveCenter", + "from": [2, 2, 14], + "to": [14, 14, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 13.5]}, + "faces": { + "east": {"uv": [7.5, 1, 8, 7], "texture": "#2"}, + "south": {"uv": [2, 2, 14, 14], "rotation": 90, "texture": "#3"}, + "west": {"uv": [7.5, 1, 8, 7], "texture": "#2"}, + "up": {"uv": [7.5, 1, 8, 7], "rotation": 270, "texture": "#2"}, + "down": {"uv": [7.5, 1, 8, 7], "rotation": 270, "texture": "#2"} } } ] diff --git a/src/main/resources/assets/create/models/block/fluid_valve/block_vertical_closed.json b/src/main/resources/assets/create/models/block/fluid_valve/block_vertical_closed.json index 1f7b5fee65..2676824a36 100644 --- a/src/main/resources/assets/create/models/block/fluid_valve/block_vertical_closed.json +++ b/src/main/resources/assets/create/models/block/fluid_valve/block_vertical_closed.json @@ -2,8 +2,8 @@ "credit": "Made with Blockbench", "textures": { "2": "create:block/fluid_valve", - "3": "create:block/pipes", - "particle": "create:block/copper_plating" + "4": "create:block/valve_closed", + "particle": "create:block/copper_underside" }, "elements": [ { @@ -12,12 +12,38 @@ "to": [14, 14, 14], "rotation": {"angle": 0, "axis": "y", "origin": [24, 11, 11]}, "faces": { - "north": {"uv": [6, 6, 12, 12], "rotation": 90, "texture": "#2"}, - "east": {"uv": [6, 6, 12, 12], "rotation": 90, "texture": "#2"}, - "south": {"uv": [0, 0, 6, 6], "rotation": 90, "texture": "#2"}, - "west": {"uv": [6, 6, 12, 12], "rotation": 90, "texture": "#2"}, - "up": {"uv": [6, 0, 12, 6], "rotation": 90, "texture": "#2"}, - "down": {"uv": [6, 0, 12, 6], "rotation": 90, "texture": "#2"} + "north": {"uv": [1, 1, 7, 7], "texture": "#2"}, + "east": {"uv": [1, 9, 7, 15], "rotation": 90, "texture": "#2"}, + "south": {"uv": [1, 1, 7, 7], "texture": "#2"}, + "west": {"uv": [1, 9, 7, 15], "rotation": 90, "texture": "#2"}, + "up": {"uv": [9, 1, 15, 7], "texture": "#2"}, + "down": {"uv": [9, 1, 15, 7], "texture": "#2"} + } + }, + { + "name": "ValveCenter", + "from": [2, 2, 3], + "to": [14, 14, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [24, 11, 12]}, + "faces": { + "north": {"uv": [2, 2, 14, 14], "texture": "#4"}, + "east": {"uv": [7.5, 1, 8, 7], "texture": "#2"}, + "west": {"uv": [7.5, 1, 8, 7], "texture": "#2"}, + "up": {"uv": [7.5, 1, 8, 7], "rotation": 90, "texture": "#2"}, + "down": {"uv": [7.5, 1, 8, 7], "rotation": 90, "texture": "#2"} + } + }, + { + "name": "ValveCenter", + "from": [2, 2, 14], + "to": [14, 14, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 13.5]}, + "faces": { + "east": {"uv": [7.5, 1, 8, 7], "texture": "#2"}, + "south": {"uv": [2, 2, 14, 14], "texture": "#4"}, + "west": {"uv": [7.5, 1, 8, 7], "texture": "#2"}, + "up": {"uv": [7.5, 1, 8, 7], "rotation": 270, "texture": "#2"}, + "down": {"uv": [7.5, 1, 8, 7], "rotation": 270, "texture": "#2"} } }, { @@ -25,12 +51,11 @@ "to": [2, 13, 13], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [4, 8.5, 9, 9.5], "rotation": 90, "texture": "#3"}, - "east": {"uv": [0, 0, 0, 0], "texture": "#3"}, - "south": {"uv": [4, 8.5, 9, 9.5], "rotation": 270, "texture": "#3"}, - "west": {"uv": [11, 11, 16, 16], "texture": "#3"}, - "up": {"uv": [4, 8.5, 9, 9.5], "rotation": 270, "texture": "#3"}, - "down": {"uv": [4, 8.5, 9, 9.5], "rotation": 270, "texture": "#3"} + "north": {"uv": [7.5, 1.5, 8.5, 6.5], "texture": "#2"}, + "south": {"uv": [8.5, 1.5, 7.5, 6.5], "texture": "#2"}, + "west": {"uv": [1.5, 9.5, 6.5, 14.5], "texture": "#2"}, + "up": {"uv": [8.5, 1.5, 7.5, 6.5], "texture": "#2"}, + "down": {"uv": [8.5, 1.5, 7.5, 6.5], "texture": "#2"} } }, { @@ -38,12 +63,11 @@ "to": [16, 13, 13], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [4, 9.5, 9, 8.5], "rotation": 90, "texture": "#3"}, - "east": {"uv": [16, 11, 11, 16], "texture": "#3"}, - "south": {"uv": [4, 9.5, 9, 8.5], "rotation": 270, "texture": "#3"}, - "west": {"uv": [0, 0, 0, 0], "texture": "#3"}, - "up": {"uv": [4, 9.5, 9, 8.5], "rotation": 270, "texture": "#3"}, - "down": {"uv": [4, 9.5, 9, 8.5], "rotation": 270, "texture": "#3"} + "north": {"uv": [7.5, 1.5, 8.5, 6.5], "texture": "#2"}, + "east": {"uv": [6.5, 9.5, 1.5, 14.5], "texture": "#2"}, + "south": {"uv": [8.5, 1.5, 7.5, 6.5], "texture": "#2"}, + "up": {"uv": [8.5, 1.5, 7.5, 6.5], "texture": "#2"}, + "down": {"uv": [8.5, 1.5, 7.5, 6.5], "texture": "#2"} } } ] diff --git a/src/main/resources/assets/create/models/block/fluid_valve/block_vertical_open.json b/src/main/resources/assets/create/models/block/fluid_valve/block_vertical_open.json index b95cd9a339..ab4846eb9a 100644 --- a/src/main/resources/assets/create/models/block/fluid_valve/block_vertical_open.json +++ b/src/main/resources/assets/create/models/block/fluid_valve/block_vertical_open.json @@ -2,8 +2,8 @@ "credit": "Made with Blockbench", "textures": { "2": "create:block/fluid_valve", - "3": "create:block/pipes", - "particle": "create:block/copper_plating" + "4": "create:block/valve_open", + "particle": "create:block/copper_underside" }, "elements": [ { @@ -12,38 +12,62 @@ "to": [14, 14, 14], "rotation": {"angle": 0, "axis": "y", "origin": [24, 11, 11]}, "faces": { - "north": {"uv": [6, 6, 12, 12], "rotation": 90, "texture": "#2"}, - "east": {"uv": [6, 6, 12, 12], "rotation": 90, "texture": "#2"}, - "south": {"uv": [0, 6, 6, 12], "rotation": 90, "texture": "#2"}, - "west": {"uv": [6, 6, 12, 12], "rotation": 90, "texture": "#2"}, - "up": {"uv": [6, 0, 12, 6], "rotation": 90, "texture": "#2"}, - "down": {"uv": [6, 0, 12, 6], "rotation": 90, "texture": "#2"} + "north": {"uv": [1, 1, 7, 7], "texture": "#2"}, + "east": {"uv": [1, 9, 7, 15], "rotation": 90, "texture": "#2"}, + "south": {"uv": [1, 1, 7, 7], "texture": "#2"}, + "west": {"uv": [1, 9, 7, 15], "rotation": 90, "texture": "#2"}, + "up": {"uv": [9, 1, 15, 7], "texture": "#2"}, + "down": {"uv": [9, 1, 15, 7], "texture": "#2"} + } + }, + { + "name": "ValveCenter", + "from": [2, 2, 3], + "to": [14, 14, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [24, 11, 12]}, + "faces": { + "north": {"uv": [2, 2, 14, 14], "texture": "#4"}, + "east": {"uv": [7.5, 1, 8, 7], "texture": "#2"}, + "west": {"uv": [7.5, 1, 8, 7], "texture": "#2"}, + "up": {"uv": [7.5, 1, 8, 7], "rotation": 90, "texture": "#2"}, + "down": {"uv": [7.5, 1, 8, 7], "rotation": 90, "texture": "#2"} + } + }, + { + "name": "ValveCenter", + "from": [2, 2, 14], + "to": [14, 14, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 13.5]}, + "faces": { + "east": {"uv": [7.5, 1, 8, 7], "texture": "#2"}, + "south": {"uv": [2, 2, 14, 14], "texture": "#4"}, + "west": {"uv": [7.5, 1, 8, 7], "texture": "#2"}, + "up": {"uv": [7.5, 1, 8, 7], "rotation": 270, "texture": "#2"}, + "down": {"uv": [7.5, 1, 8, 7], "rotation": 270, "texture": "#2"} } }, { "from": [0, 3, 3], "to": [2, 13, 13], - "rotation": {"angle": 0, "axis": "z", "origin": [8, 8, 8]}, + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [4, 8.5, 9, 9.5], "rotation": 90, "texture": "#3"}, - "east": {"uv": [0, 0, 0, 0], "texture": "#3"}, - "south": {"uv": [4, 8.5, 9, 9.5], "rotation": 270, "texture": "#3"}, - "west": {"uv": [11, 11, 16, 16], "texture": "#3"}, - "up": {"uv": [4, 8.5, 9, 9.5], "rotation": 270, "texture": "#3"}, - "down": {"uv": [4, 8.5, 9, 9.5], "rotation": 270, "texture": "#3"} + "north": {"uv": [7.5, 1.5, 8.5, 6.5], "texture": "#2"}, + "south": {"uv": [8.5, 1.5, 7.5, 6.5], "texture": "#2"}, + "west": {"uv": [1.5, 9.5, 6.5, 14.5], "texture": "#2"}, + "up": {"uv": [8.5, 1.5, 7.5, 6.5], "texture": "#2"}, + "down": {"uv": [8.5, 1.5, 7.5, 6.5], "texture": "#2"} } }, { "from": [14, 3, 3], "to": [16, 13, 13], - "rotation": {"angle": 0, "axis": "z", "origin": [8, 8, 8]}, + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [4, 9.5, 9, 8.5], "rotation": 90, "texture": "#3"}, - "east": {"uv": [16, 11, 11, 16], "texture": "#3"}, - "south": {"uv": [4, 9.5, 9, 8.5], "rotation": 270, "texture": "#3"}, - "west": {"uv": [0, 0, 0, 0], "texture": "#3"}, - "up": {"uv": [4, 9.5, 9, 8.5], "rotation": 270, "texture": "#3"}, - "down": {"uv": [4, 9.5, 9, 8.5], "rotation": 270, "texture": "#3"} + "north": {"uv": [7.5, 1.5, 8.5, 6.5], "texture": "#2"}, + "east": {"uv": [6.5, 9.5, 1.5, 14.5], "texture": "#2"}, + "south": {"uv": [8.5, 1.5, 7.5, 6.5], "texture": "#2"}, + "up": {"uv": [8.5, 1.5, 7.5, 6.5], "texture": "#2"}, + "down": {"uv": [8.5, 1.5, 7.5, 6.5], "texture": "#2"} } } ] diff --git a/src/main/resources/assets/create/models/block/fluid_valve/item.json b/src/main/resources/assets/create/models/block/fluid_valve/item.json index ad326cb73c..622e7600dd 100644 --- a/src/main/resources/assets/create/models/block/fluid_valve/item.json +++ b/src/main/resources/assets/create/models/block/fluid_valve/item.json @@ -2,11 +2,10 @@ "credit": "Made with Blockbench", "textures": { "2": "create:block/fluid_valve", - "3": "create:block/pipes", - "4": "create:block/pump", + "4": "create:block/valve_open", "1_1": "create:block/axis_top", "1_0": "create:block/axis", - "particle": "create:block/copper_plating" + "particle": "create:block/valve_closed" }, "elements": [ { @@ -15,12 +14,60 @@ "to": [14, 14, 14], "rotation": {"angle": 0, "axis": "y", "origin": [24, 11, 11]}, "faces": { - "north": {"uv": [6, 0, 12, 6], "texture": "#2"}, - "east": {"uv": [6, 6, 12, 12], "texture": "#2"}, - "south": {"uv": [6, 0, 12, 6], "texture": "#2"}, - "west": {"uv": [6, 6, 12, 12], "texture": "#2"}, - "up": {"uv": [0, 0, 6, 6], "rotation": 90, "texture": "#2"}, - "down": {"uv": [6, 6, 12, 12], "texture": "#2"} + "north": {"uv": [9, 1, 15, 7], "texture": "#2"}, + "east": {"uv": [1, 9, 7, 15], "texture": "#2"}, + "south": {"uv": [9, 1, 15, 7], "texture": "#2"}, + "west": {"uv": [1, 9, 7, 15], "texture": "#2"}, + "up": {"uv": [1, 1, 7, 7], "texture": "#2"}, + "down": {"uv": [1, 1, 7, 7], "texture": "#2"} + } + }, + { + "from": [2, 14, 2], + "to": [14, 13, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [24, 23, 11]}, + "faces": { + "north": {"uv": [7.5, 1, 8, 7], "rotation": 90, "texture": "#2"}, + "east": {"uv": [7.5, 1, 8, 7], "rotation": 90, "texture": "#2"}, + "south": {"uv": [7.5, 1, 8, 7], "rotation": 90, "texture": "#2"}, + "west": {"uv": [7.5, 1, 8, 7], "rotation": 90, "texture": "#2"}, + "up": {"uv": [2, 2, 14, 14], "texture": "#4"} + } + }, + { + "from": [2, 3, 2], + "to": [14, 2, 14], + "rotation": {"angle": 0, "axis": "z", "origin": [8, 2.5, 8]}, + "faces": { + "north": {"uv": [7.5, 1, 8, 7], "rotation": 270, "texture": "#2"}, + "east": {"uv": [7.5, 1, 8, 7], "rotation": 270, "texture": "#2"}, + "south": {"uv": [7.5, 1, 8, 7], "rotation": 270, "texture": "#2"}, + "west": {"uv": [7.5, 1, 8, 7], "rotation": 270, "texture": "#2"}, + "down": {"uv": [2, 2, 14, 14], "rotation": 180, "texture": "#4"} + } + }, + { + "from": [0, 3, 3], + "to": [2, 13, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [1, 8, 8]}, + "faces": { + "north": {"uv": [7.5, 1.5, 8.5, 6.5], "texture": "#2"}, + "south": {"uv": [8.5, 1.5, 7.5, 6.5], "texture": "#2"}, + "west": {"uv": [6.5, 9.5, 1.5, 14.5], "texture": "#2"}, + "up": {"uv": [7.5, 1.5, 8.5, 6.5], "rotation": 180, "texture": "#2"}, + "down": {"uv": [7.5, 1.5, 8.5, 6.5], "rotation": 180, "texture": "#2"} + } + }, + { + "from": [14, 3, 3], + "to": [16, 13, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "faces": { + "north": {"uv": [8.5, 1.5, 7.5, 6.5], "texture": "#2"}, + "east": {"uv": [6.5, 9.5, 1.5, 14.5], "texture": "#2"}, + "south": {"uv": [7.5, 1.5, 8.5, 6.5], "texture": "#2"}, + "up": {"uv": [7.5, 1.5, 8.5, 6.5], "texture": "#2"}, + "down": {"uv": [7.5, 1.5, 8.5, 6.5], "texture": "#2"} } }, { @@ -37,96 +84,19 @@ } }, { - "from": [7, 14.1, 5], - "to": [9, 15.1, 7], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]}, + "from": [4.5, 13.5, 7.5], + "to": [11.5, 13.5, 8.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 13.5, 8]}, "faces": { - "north": {"uv": [14, 0, 12, 1], "rotation": 180, "texture": "#4"}, - "east": {"uv": [14, 3, 12, 4], "texture": "#4"}, - "south": {"uv": [14, 2, 12, 3], "rotation": 180, "texture": "#4"}, - "west": {"uv": [12, 0, 13, 2], "rotation": 270, "texture": "#4"}, - "up": {"uv": [14, 2, 12, 0], "rotation": 180, "texture": "#4"}, - "down": {"uv": [12, 2, 14, 4], "texture": "#4"} + "up": {"uv": [2, 7.5, 5.5, 8], "texture": "#2"} } }, { - "from": [9, 14.1, 5], - "to": [11, 15.1, 9], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]}, + "from": [4.5, 2.5, 7.5], + "to": [11.5, 2.5, 8.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 2.5, 8]}, "faces": { - "north": {"uv": [16, 0, 14, 1], "texture": "#4"}, - "east": {"uv": [15, 0, 16, 4], "rotation": 90, "texture": "#4"}, - "south": {"uv": [16, 0, 14, 1], "rotation": 180, "texture": "#4"}, - "west": {"uv": [12, 4, 13, 0], "rotation": 90, "texture": "#4"}, - "up": {"uv": [16, 4, 14, 0], "rotation": 180, "texture": "#4"}, - "down": {"uv": [14, 0, 16, 4], "texture": "#4"} - } - }, - { - "from": [5, 14.1, 7], - "to": [7, 15.1, 11], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [16, 0, 14, 1], "rotation": 180, "texture": "#4"}, - "east": {"uv": [12, 4, 13, 0], "rotation": 90, "texture": "#4"}, - "south": {"uv": [16, 0, 14, 1], "texture": "#4"}, - "west": {"uv": [15, 0, 16, 4], "rotation": 90, "texture": "#4"}, - "up": {"uv": [16, 4, 14, 0], "texture": "#4"}, - "down": {"uv": [14, 0, 16, 4], "rotation": 180, "texture": "#4"} - } - }, - { - "from": [7, 14.1, 9], - "to": [9, 15.1, 11], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [14, 2, 12, 3], "rotation": 180, "texture": "#4"}, - "east": {"uv": [12, 0, 13, 2], "rotation": 270, "texture": "#4"}, - "south": {"uv": [14, 0, 12, 1], "rotation": 180, "texture": "#4"}, - "west": {"uv": [14, 3, 12, 4], "texture": "#4"}, - "up": {"uv": [14, 2, 12, 0], "texture": "#4"}, - "down": {"uv": [12, 2, 14, 4], "rotation": 180, "texture": "#4"} - } - }, - { - "name": "Center", - "from": [7, 14, 7], - "to": [9, 16, 9], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": 45, "axis": "y", "origin": [8, 15, 8]}, - "faces": { - "north": {"uv": [12.5, 0, 12, 1], "rotation": 90, "texture": "#2"}, - "east": {"uv": [13, 0.5, 12, 1], "texture": "#2"}, - "south": {"uv": [12, 0.5, 13, 1], "texture": "#2"}, - "west": {"uv": [12, 1, 12.5, 0], "rotation": 90, "texture": "#2"}, - "up": {"uv": [12, 0, 13, 1], "texture": "#2"} - } - }, - { - "from": [0, 3, 3], - "to": [2, 13, 13], - "faces": { - "north": {"uv": [4, 8.5, 9, 9.5], "rotation": 90, "texture": "#3"}, - "south": {"uv": [4, 8.5, 9, 9.5], "rotation": 270, "texture": "#3"}, - "west": {"uv": [11, 11, 16, 16], "texture": "#3"}, - "up": {"uv": [4, 8.5, 9, 9.5], "rotation": 270, "texture": "#3"}, - "down": {"uv": [4, 8.5, 9, 9.5], "rotation": 270, "texture": "#3"} - } - }, - { - "from": [14, 3, 3], - "to": [16, 13, 13], - "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, - "faces": { - "north": {"uv": [4, 9.5, 9, 8.5], "rotation": 90, "texture": "#3"}, - "east": {"uv": [16, 11, 11, 16], "texture": "#3"}, - "south": {"uv": [4, 9.5, 9, 8.5], "rotation": 270, "texture": "#3"}, - "up": {"uv": [4, 9.5, 9, 8.5], "rotation": 270, "texture": "#3"}, - "down": {"uv": [4, 9.5, 9, 8.5], "rotation": 270, "texture": "#3"} + "down": {"uv": [2, 7.5, 5.5, 8], "rotation": 180, "texture": "#2"} } } ], @@ -162,34 +132,23 @@ } }, "groups": [ - 0, + { + "name": "group", + "origin": [16, 0, 0], + "color": 0, + "children": [0, 1, 2, 3, 4] + }, { "name": "shaft", "origin": [8, 8, 8], "color": 0, - "children": [1] + "children": [5] }, { - "name": "Pointer", - "origin": [7.5, 14, 8], + "name": "hands", + "origin": [7, 14, 4], "color": 0, - "children": [ - { - "name": "arrow", - "origin": [8, 8, 8], - "color": 0, - "children": [] - }, - { - "name": "arrow", - "origin": [8, 8, 8], - "color": 0, - "children": [2, 3, 4, 5] - }, - 6 - ] - }, - 7, - 8 + "children": [6, 7] + } ] -} +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/fluid_valve/pointer.json b/src/main/resources/assets/create/models/block/fluid_valve/pointer.json index b29464403d..eadfc7f945 100644 --- a/src/main/resources/assets/create/models/block/fluid_valve/pointer.json +++ b/src/main/resources/assets/create/models/block/fluid_valve/pointer.json @@ -2,103 +2,23 @@ "credit": "Made with Blockbench", "textures": { "2": "create:block/fluid_valve", - "4": "create:block/pump", - "particle": "create:block/copper_plating" + "particle": "create:block/copper_underside" }, "elements": [ { - "from": [7, 14.1, 5], - "to": [9, 15.1, 7], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]}, + "from": [7.5, 13.5, 4.5], + "to": [8.5, 13.5, 11.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [14, 0, 12, 1], "rotation": 180, "texture": "#4"}, - "east": {"uv": [14, 3, 12, 4], "texture": "#4"}, - "south": {"uv": [14, 2, 12, 3], "rotation": 180, "texture": "#4"}, - "west": {"uv": [12, 0, 13, 2], "rotation": 270, "texture": "#4"}, - "up": {"uv": [12, 0, 14, 2], "texture": "#4"}, - "down": {"uv": [14, 0, 12, 2], "rotation": 180, "texture": "#4"} + "up": {"uv": [2, 7.5, 5.5, 8], "rotation": 270, "texture": "#2"} } }, { - "from": [9, 14.1, 5], - "to": [11, 15.1, 9], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]}, + "from": [7.5, 2.5, 4.5], + "to": [8.5, 2.5, 11.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [16, 0, 14, 1], "texture": "#4"}, - "east": {"uv": [15, 0, 16, 4], "rotation": 90, "texture": "#4"}, - "south": {"uv": [16, 0, 14, 1], "rotation": 180, "texture": "#4"}, - "up": {"uv": [14, 0, 16, 4], "texture": "#4"}, - "down": {"uv": [16, 0, 14, 4], "rotation": 180, "texture": "#4"} - } - }, - { - "from": [7, 14.1, 9], - "to": [11, 15.1, 11], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": -45, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "east": {"uv": [16, 0, 14, 1], "texture": "#4"}, - "south": {"uv": [15, 0, 16, 4], "rotation": 90, "texture": "#4"}, - "west": {"uv": [16, 0, 14, 1], "rotation": 180, "texture": "#4"}, - "up": {"uv": [14, 0, 16, 4], "rotation": 90, "texture": "#4"}, - "down": {"uv": [16, 0, 14, 4], "rotation": 90, "texture": "#4"} - } - }, - { - "from": [9, 14.1, 7], - "to": [11, 15.1, 9], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": -45, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [12, 0, 13, 2], "rotation": 270, "texture": "#4"}, - "east": {"uv": [14, 0, 12, 1], "rotation": 180, "texture": "#4"}, - "south": {"uv": [14, 3, 12, 4], "texture": "#4"}, - "west": {"uv": [14, 2, 12, 3], "rotation": 180, "texture": "#4"}, - "up": {"uv": [12, 0, 14, 2], "rotation": 90, "texture": "#4"}, - "down": {"uv": [14, 0, 12, 2], "rotation": 90, "texture": "#4"} - } - }, - { - "from": [9, 14.1, 5], - "to": [11, 15.1, 9], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [16, 0, 14, 1], "texture": "#4"}, - "east": {"uv": [15, 0, 16, 4], "rotation": 90, "texture": "#4"}, - "south": {"uv": [16, 0, 14, 1], "rotation": 180, "texture": "#4"}, - "up": {"uv": [14, 0, 16, 4], "texture": "#4"}, - "down": {"uv": [16, 0, 14, 4], "rotation": 180, "texture": "#4"} - } - }, - { - "from": [7, 14.1, 5], - "to": [9, 15.1, 7], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [14, 0, 12, 1], "rotation": 180, "texture": "#4"}, - "east": {"uv": [14, 3, 12, 4], "texture": "#4"}, - "south": {"uv": [14, 2, 12, 3], "rotation": 180, "texture": "#4"}, - "west": {"uv": [12, 0, 13, 2], "rotation": 270, "texture": "#4"}, - "up": {"uv": [12, 0, 14, 2], "texture": "#4"}, - "down": {"uv": [14, 0, 12, 2], "rotation": 180, "texture": "#4"} - } - }, - { - "name": "Center", - "from": [7, 14, 7], - "to": [9, 16, 9], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": 45, "axis": "y", "origin": [8, 15, 8]}, - "faces": { - "north": {"uv": [12.5, 0, 12, 1], "rotation": 90, "texture": "#2"}, - "east": {"uv": [13, 0.5, 12, 1], "texture": "#2"}, - "south": {"uv": [12, 0.5, 13, 1], "texture": "#2"}, - "west": {"uv": [12, 1, 12.5, 0], "rotation": 90, "texture": "#2"}, - "up": {"uv": [12, 0, 13, 1], "texture": "#2"} + "down": {"uv": [2, 7.5, 5.5, 8], "rotation": 270, "texture": "#2"} } } ], @@ -135,24 +55,10 @@ }, "groups": [ { - "name": "Pointer", + "name": "group", "origin": [7.5, 14, 8], "color": 0, - "children": [ - { - "name": "arrow", - "origin": [8, 8, 8], - "color": 0, - "children": [] - }, - { - "name": "arrow", - "origin": [8, 8, 8], - "color": 0, - "children": [0, 1, 2, 3, 4, 5] - }, - 6 - ] + "children": [0, 1] } ] -} +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/item_drain.json b/src/main/resources/assets/create/models/block/item_drain.json index 60751792d3..f9a94fb462 100644 --- a/src/main/resources/assets/create/models/block/item_drain.json +++ b/src/main/resources/assets/create/models/block/item_drain.json @@ -4,75 +4,33 @@ "textures": { "0": "create:block/item_drain_side", "1": "create:block/item_drain_top", - "2": "create:block/copper_casing", "3": "create:block/pump", + "4": "create:block/copper_underside", "particle": "create:block/item_drain_side" }, "elements": [ { "from": [0, 0, 0], - "to": [16, 2, 16], - "faces": { - "north": {"uv": [0, 14, 16, 16], "texture": "#0"}, - "east": {"uv": [0, 14, 16, 16], "texture": "#0"}, - "south": {"uv": [0, 14, 16, 16], "texture": "#0"}, - "west": {"uv": [0, 14, 16, 16], "texture": "#0"}, - "up": {"uv": [0, 0, 16, 16], "texture": "#2"}, - "down": {"uv": [0, 0, 16, 16], "texture": "#2"} - } - }, - { - "from": [0, 2, 0], - "to": [16, 13, 2], - "faces": { - "north": {"uv": [0, 3, 16, 14], "texture": "#0"}, - "east": {"uv": [14, 3, 16, 14], "texture": "#0"}, - "south": {"uv": [0, 3, 16, 14], "texture": "#0"}, - "west": {"uv": [0, 3, 2, 14], "texture": "#0"}, - "up": {"uv": [0, 0, 16, 2], "texture": "#1"} - } - }, - { - "from": [0, 2, 14], "to": [16, 13, 16], "faces": { - "north": {"uv": [0, 3, 16, 14], "texture": "#0"}, - "east": {"uv": [0, 3, 2, 14], "texture": "#0"}, - "south": {"uv": [0, 3, 16, 14], "texture": "#0"}, - "west": {"uv": [14, 3, 16, 14], "texture": "#0"}, - "up": {"uv": [0, 14, 16, 16], "texture": "#1"} + "north": {"uv": [0, 3, 16, 16], "texture": "#0"}, + "east": {"uv": [0, 3, 16, 16], "texture": "#0"}, + "south": {"uv": [0, 3, 16, 16], "texture": "#0"}, + "west": {"uv": [0, 3, 16, 16], "texture": "#0"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#4"} } }, { - "from": [14, 2, 2], - "to": [16, 13, 14], - "faces": { - "east": {"uv": [2, 3, 14, 14], "texture": "#0"}, - "west": {"uv": [2, 3, 14, 14], "texture": "#0"}, - "up": {"uv": [14, 2, 16, 14], "texture": "#1"} - } - }, - { - "from": [0, 2, 2], + "from": [14, 5, 2], "to": [2, 13, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [14, 5, 2]}, "faces": { - "east": {"uv": [2, 3, 14, 14], "texture": "#0"}, - "west": {"uv": [2, 3, 14, 14], "texture": "#0"}, - "up": {"uv": [0, 2, 2, 14], "texture": "#1"} - } - }, - { - "from": [2, 12, 2], - "to": [14, 13, 14], - "faces": { - "up": {"uv": [2, 2, 14, 14], "texture": "#1"} - } - }, - { - "from": [2, 4, 2], - "to": [14, 5, 14], - "faces": { - "up": {"uv": [0, 0, 12, 12], "texture": "#3"} + "north": {"uv": [2, 3, 14, 11], "texture": "#0"}, + "east": {"uv": [2, 3, 14, 11], "texture": "#0"}, + "south": {"uv": [2, 3, 14, 11], "texture": "#0"}, + "west": {"uv": [2, 3, 14, 11], "texture": "#0"}, + "down": {"uv": [0, 0, 6, 6], "texture": "#3"} } } ] diff --git a/src/main/resources/assets/create/models/block/portable_fluid_interface/block.json b/src/main/resources/assets/create/models/block/portable_fluid_interface/block.json index 421f217dd2..b55a1f850f 100644 --- a/src/main/resources/assets/create/models/block/portable_fluid_interface/block.json +++ b/src/main/resources/assets/create/models/block/portable_fluid_interface/block.json @@ -2,55 +2,20 @@ "credit": "Made with Blockbench", "textures": { "0": "create:block/portable_fluid_interface", - "1": "create:block/copper_casing", "2": "create:block/copper_underside", "particle": "create:block/copper_casing" }, "elements": [ { "from": [0, 0, 0], - "to": [16, 12, 16], + "to": [16, 14, 16], "faces": { - "north": {"uv": [0, 10, 8, 16], "texture": "#0"}, - "east": {"uv": [0, 10, 8, 16], "texture": "#0"}, - "south": {"uv": [0, 10, 8, 16], "texture": "#0"}, - "west": {"uv": [0, 10, 8, 16], "texture": "#0"}, - "up": {"uv": [0, 0, 16, 16], "texture": "#2"}, - "down": {"uv": [0, 0, 16, 16], "texture": "#1"} - } - }, - { - "from": [0, 12, 1.9], - "to": [2, 14.1, 14.1], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 20, 10]}, - "faces": { - "north": {"uv": [14, 13, 16, 15], "texture": "#2"}, - "south": {"uv": [0, 13, 2, 15], "texture": "#2"}, - "west": {"uv": [1, 9, 7, 10], "texture": "#0"}, - "up": {"uv": [0, 2, 2, 14], "texture": "#2"} - } - }, - { - "from": [14, 12, 2], - "to": [16, 14, 14], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 20, 6]}, - "faces": { - "north": {"uv": [0, 13, 2, 15], "texture": "#2"}, - "east": {"uv": [1, 9, 7, 10], "texture": "#0"}, - "south": {"uv": [14, 13, 16, 15], "texture": "#2"}, - "up": {"uv": [0, 2, 2, 14], "rotation": 180, "texture": "#2"} - } - }, - { - "from": [2, 12, 0], - "to": [14, 14, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [10, 20, 8]}, - "faces": { - "north": {"uv": [1, 9, 7, 10], "texture": "#0"}, - "east": {"uv": [0, 13, 16, 15], "texture": "#2"}, - "south": {"uv": [1, 9, 7, 10], "texture": "#0"}, - "west": {"uv": [0, 13, 16, 15], "texture": "#2"}, - "up": {"uv": [2, 0, 14, 16], "texture": "#2"} + "north": {"uv": [0, 9, 8, 16], "texture": "#0"}, + "east": {"uv": [0, 9, 8, 16], "texture": "#0"}, + "south": {"uv": [0, 9, 8, 16], "texture": "#0"}, + "west": {"uv": [0, 9, 8, 16], "texture": "#0"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#2"} } } ], @@ -101,9 +66,10 @@ "name": "Base", "origin": [10, 20, 8], "color": 0, - "children": [0, 1, 2, 3] + "children": [] } ] - } + }, + 0 ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/portable_fluid_interface/block_middle.json b/src/main/resources/assets/create/models/block/portable_fluid_interface/block_middle.json index eaf9347edf..ff338bfc2c 100644 --- a/src/main/resources/assets/create/models/block/portable_fluid_interface/block_middle.json +++ b/src/main/resources/assets/create/models/block/portable_fluid_interface/block_middle.json @@ -1,20 +1,21 @@ { "credit": "Made with Blockbench", "textures": { - "0": "create:block/portable_fluid_interface", + "1": "create:block/fluid_chute_unpowered", + "2": "create:block/portable_fluid_interface", "particle": "create:block/copper_casing" }, "elements": [ { "from": [2, 0, 2], "to": [14, 9, 14], - "rotation": {"angle": 0, "axis": "y", "origin": [10, 18, 10]}, + "rotation": {"angle": 0, "axis": "y", "origin": [10, 11, 10]}, "faces": { - "north": {"uv": [1, 3.5, 7, 8], "texture": "#0"}, - "east": {"uv": [1, 3.5, 7, 8], "texture": "#0"}, - "south": {"uv": [1, 3.5, 7, 8], "texture": "#0"}, - "west": {"uv": [1, 3.5, 7, 8], "texture": "#0"}, - "up": {"uv": [2, 6.5, 2.5, 7], "texture": "#0"} + "north": {"uv": [2, 4, 14, 13], "texture": "#1"}, + "east": {"uv": [2, 4, 14, 13], "texture": "#1"}, + "south": {"uv": [2, 4, 14, 13], "texture": "#1"}, + "west": {"uv": [2, 4, 14, 13], "texture": "#1"}, + "up": {"uv": [9, 1, 15, 7], "texture": "#2"} } } ], diff --git a/src/main/resources/assets/create/models/block/portable_fluid_interface/block_middle_powered.json b/src/main/resources/assets/create/models/block/portable_fluid_interface/block_middle_powered.json index 1f14dde7a5..5548176421 100644 --- a/src/main/resources/assets/create/models/block/portable_fluid_interface/block_middle_powered.json +++ b/src/main/resources/assets/create/models/block/portable_fluid_interface/block_middle_powered.json @@ -2,19 +2,20 @@ "credit": "Made with Blockbench", "textures": { "0": "create:block/portable_fluid_interface", + "2": "create:block/fluid_chute_powered", "particle": "create:block/copper_casing" }, "elements": [ { "from": [2, 0, 2], "to": [14, 9, 14], - "rotation": {"angle": 0, "axis": "y", "origin": [10, 18, 10]}, + "rotation": {"angle": 0, "axis": "y", "origin": [10, 11, 10]}, "faces": { - "north": {"uv": [9, 3.5, 15, 8], "texture": "#0"}, - "east": {"uv": [9, 3.5, 15, 8], "texture": "#0"}, - "south": {"uv": [9, 3.5, 15, 8], "texture": "#0"}, - "west": {"uv": [9, 3.5, 15, 8], "texture": "#0"}, - "up": {"uv": [2, 6.5, 2.5, 7], "texture": "#0"} + "north": {"uv": [2, 4, 14, 13], "texture": "#2"}, + "east": {"uv": [2, 4, 14, 13], "texture": "#2"}, + "south": {"uv": [2, 4, 14, 13], "texture": "#2"}, + "west": {"uv": [2, 4, 14, 13], "texture": "#2"}, + "up": {"uv": [9, 1, 15, 7], "texture": "#0"} } } ], @@ -60,7 +61,8 @@ "name": "Middle", "origin": [10, 22, 10], "color": 0, - "children": [0] - } + "children": [] + }, + 0 ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/portable_fluid_interface/block_top.json b/src/main/resources/assets/create/models/block/portable_fluid_interface/block_top.json index 7c160d25eb..6e5251ad4d 100644 --- a/src/main/resources/assets/create/models/block/portable_fluid_interface/block_top.json +++ b/src/main/resources/assets/create/models/block/portable_fluid_interface/block_top.json @@ -16,6 +16,18 @@ "west": {"uv": [1.5, 0, 6.5, 3.5], "texture": "#0"} } }, + { + "from": [2.1, 13, 2.1], + "to": [13.9, 14, 13.9], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 13, 2]}, + "faces": { + "north": {"uv": [1, 0, 7, 0.5], "texture": "#0"}, + "east": {"uv": [1, 0, 7, 0.5], "texture": "#0"}, + "south": {"uv": [1, 0, 7, 0.5], "texture": "#0"}, + "west": {"uv": [1, 0, 7, 0.5], "texture": "#0"}, + "down": {"uv": [9, 8.5, 15, 14.5], "texture": "#0"} + } + }, { "from": [1, 14, 1], "to": [15, 16, 15], @@ -28,94 +40,6 @@ "up": {"uv": [8.5, 8, 15.5, 15], "texture": "#0"}, "down": {"uv": [8.5, 8, 15.5, 15], "texture": "#0"} } - }, - { - "from": [4, 13.1, 13], - "to": [6, 15.1, 14], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": 45, "axis": "x", "origin": [8, 14, 13]}, - "faces": { - "east": {"uv": [6.5, 7.5, 7, 8], "texture": "#0"}, - "south": {"uv": [10, 15, 11, 16], "texture": "#0"}, - "west": {"uv": [6.5, 7.5, 7, 8], "texture": "#0"} - } - }, - { - "from": [10, 13.1, 2], - "to": [12, 15.1, 3], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": -45, "axis": "x", "origin": [8, 14, 3]}, - "faces": { - "north": {"uv": [10, 15, 11, 16], "texture": "#0"}, - "east": {"uv": [6.5, 7.5, 7, 8], "texture": "#0"}, - "west": {"uv": [6.5, 7.5, 7, 8], "texture": "#0"} - } - }, - { - "from": [2, 13.1, 4], - "to": [3, 15.1, 6], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": 45, "axis": "z", "origin": [3, 14, 8]}, - "faces": { - "north": {"uv": [6.5, 7.5, 7, 8], "texture": "#0"}, - "south": {"uv": [6.5, 7.5, 7, 8], "texture": "#0"}, - "west": {"uv": [10, 15, 11, 16], "texture": "#0"} - } - }, - { - "from": [13, 13.1, 10], - "to": [14, 15.1, 12], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": -45, "axis": "z", "origin": [13, 14, 8]}, - "faces": { - "north": {"uv": [6.5, 7.5, 7, 8], "texture": "#0"}, - "east": {"uv": [10, 15, 11, 16], "texture": "#0"}, - "south": {"uv": [6.5, 7.5, 7, 8], "texture": "#0"} - } - }, - { - "from": [10, 13.1, 13], - "to": [12, 15.1, 14], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": 45, "axis": "x", "origin": [8, 14, 13]}, - "faces": { - "east": {"uv": [6.5, 7.5, 7, 8], "texture": "#0"}, - "south": {"uv": [13, 15, 14, 16], "texture": "#0"}, - "west": {"uv": [6.5, 7.5, 7, 8], "texture": "#0"} - } - }, - { - "from": [4, 13.1, 2], - "to": [6, 15.1, 3], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": -45, "axis": "x", "origin": [8, 14, 3]}, - "faces": { - "north": {"uv": [13, 15, 14, 16], "texture": "#0"}, - "east": {"uv": [6.5, 7.5, 7, 8], "texture": "#0"}, - "west": {"uv": [6.5, 7.5, 7, 8], "texture": "#0"} - } - }, - { - "from": [2, 13.1, 10], - "to": [3, 15.1, 12], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": 45, "axis": "z", "origin": [3, 14, 8]}, - "faces": { - "north": {"uv": [6.5, 7.5, 7, 8], "texture": "#0"}, - "south": {"uv": [6.5, 7.5, 7, 8], "texture": "#0"}, - "west": {"uv": [13, 15, 14, 16], "texture": "#0"} - } - }, - { - "from": [13, 13.1, 4], - "to": [14, 15.1, 6], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": -45, "axis": "z", "origin": [13, 14, 8]}, - "faces": { - "north": {"uv": [6.5, 7.5, 7, 8], "texture": "#0"}, - "east": {"uv": [13, 15, 14, 16], "texture": "#0"}, - "south": {"uv": [6.5, 7.5, 7, 8], "texture": "#0"} - } } ], "display": { @@ -154,39 +78,5 @@ "translation": [0, -1.25, 0], "scale": [0.5, 0.5, 0.5] } - }, - "groups": [ - { - "name": "Middle", - "origin": [10, 22, 10], - "color": 0, - "children": [] - }, - { - "name": "block", - "origin": [8, 8, 8], - "color": 0, - "children": [ - { - "name": "Base", - "origin": [10, 20, 8], - "color": 0, - "children": [] - } - ] - }, - { - "name": "block_top", - "origin": [8, 8, 8], - "color": 0, - "children": [ - { - "name": "Top", - "origin": [10, 22, 10], - "color": 0, - "children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] - } - ] - } - ] -} + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/portable_fluid_interface/item.json b/src/main/resources/assets/create/models/block/portable_fluid_interface/item.json index f2aa756a7f..7520a46564 100644 --- a/src/main/resources/assets/create/models/block/portable_fluid_interface/item.json +++ b/src/main/resources/assets/create/models/block/portable_fluid_interface/item.json @@ -2,69 +2,11 @@ "credit": "Made with Blockbench", "textures": { "0": "create:block/portable_fluid_interface", - "1": "create:block/copper_casing", "2": "create:block/copper_underside", + "3": "create:block/fluid_chute_unpowered", "particle": "create:block/copper_casing" }, "elements": [ - { - "from": [2, 7, 2], - "to": [14, 16, 14], - "rotation": {"angle": 0, "axis": "y", "origin": [10, 18, 10]}, - "faces": { - "north": {"uv": [1, 3.5, 7, 8], "texture": "#0"}, - "east": {"uv": [1, 3.5, 7, 8], "texture": "#0"}, - "south": {"uv": [1, 3.5, 7, 8], "texture": "#0"}, - "west": {"uv": [1, 3.5, 7, 8], "texture": "#0"}, - "up": {"uv": [2, 6.5, 2.5, 7], "texture": "#0"} - } - }, - { - "from": [0, 0, 0], - "to": [16, 12, 16], - "faces": { - "north": {"uv": [0, 10, 8, 16], "texture": "#0"}, - "east": {"uv": [0, 10, 8, 16], "texture": "#0"}, - "south": {"uv": [0, 10, 8, 16], "texture": "#0"}, - "west": {"uv": [0, 10, 8, 16], "texture": "#0"}, - "up": {"uv": [0, 0, 16, 16], "texture": "#2"}, - "down": {"uv": [0, 0, 16, 16], "texture": "#1"} - } - }, - { - "from": [0, 12, 1.9], - "to": [2, 14.1, 14.1], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 20, 10]}, - "faces": { - "north": {"uv": [14, 13, 16, 15], "texture": "#2"}, - "south": {"uv": [0, 13, 2, 15], "texture": "#2"}, - "west": {"uv": [1, 9, 7, 10], "texture": "#0"}, - "up": {"uv": [0, 2, 2, 14], "texture": "#2"} - } - }, - { - "from": [14, 12, 2], - "to": [16, 14, 14], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 20, 6]}, - "faces": { - "north": {"uv": [0, 13, 2, 15], "texture": "#2"}, - "east": {"uv": [1, 9, 7, 10], "texture": "#0"}, - "south": {"uv": [14, 13, 16, 15], "texture": "#2"}, - "up": {"uv": [0, 2, 2, 14], "rotation": 180, "texture": "#2"} - } - }, - { - "from": [2, 12, 0], - "to": [14, 14, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [10, 20, 8]}, - "faces": { - "north": {"uv": [1, 9, 7, 10], "texture": "#0"}, - "east": {"uv": [0, 13, 16, 15], "texture": "#2"}, - "south": {"uv": [1, 9, 7, 10], "texture": "#0"}, - "west": {"uv": [0, 13, 16, 15], "texture": "#2"}, - "up": {"uv": [2, 0, 14, 16], "texture": "#2"} - } - }, { "from": [3, 10, 3], "to": [13, 17.1, 13], @@ -90,91 +32,40 @@ } }, { - "from": [4, 16.1, 13], - "to": [6, 18.1, 14], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": 45, "axis": "x", "origin": [8, 17, 13]}, + "from": [2, 7, 2], + "to": [14, 16, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 18, 10]}, "faces": { - "east": {"uv": [6.5, 7.5, 7, 8], "texture": "#0"}, - "south": {"uv": [10, 15, 11, 16], "texture": "#0"}, - "west": {"uv": [6.5, 7.5, 7, 8], "texture": "#0"} + "north": {"uv": [2, 4, 14, 13], "texture": "#3"}, + "east": {"uv": [2, 4, 14, 13], "texture": "#3"}, + "south": {"uv": [2, 4, 14, 13], "texture": "#3"}, + "west": {"uv": [2, 4, 14, 13], "texture": "#3"}, + "up": {"uv": [9, 1, 15, 7], "texture": "#0"}, + "down": {"uv": [0, 0, 0, 0], "texture": "#3"} } }, { - "from": [10, 16.1, 2], - "to": [12, 18.1, 3], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": -45, "axis": "x", "origin": [8, 17, 3]}, + "from": [0, 0, 0], + "to": [16, 14, 16], "faces": { - "north": {"uv": [10, 15, 11, 16], "texture": "#0"}, - "east": {"uv": [6.5, 7.5, 7, 8], "texture": "#0"}, - "west": {"uv": [6.5, 7.5, 7, 8], "texture": "#0"} + "north": {"uv": [0, 9, 8, 16], "texture": "#0"}, + "east": {"uv": [0, 9, 8, 16], "texture": "#0"}, + "south": {"uv": [0, 9, 8, 16], "texture": "#0"}, + "west": {"uv": [0, 9, 8, 16], "texture": "#0"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#2"} } }, { - "from": [2, 16.1, 4], - "to": [3, 18.1, 6], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": 45, "axis": "z", "origin": [3, 17, 8]}, + "from": [2.1, 16, 2.1], + "to": [13.9, 17, 13.9], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 16, 2]}, "faces": { - "north": {"uv": [6.5, 7.5, 7, 8], "texture": "#0"}, - "south": {"uv": [6.5, 7.5, 7, 8], "texture": "#0"}, - "west": {"uv": [10, 15, 11, 16], "texture": "#0"} - } - }, - { - "from": [13, 16.1, 10], - "to": [14, 18.1, 12], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": -45, "axis": "z", "origin": [13, 17, 8]}, - "faces": { - "north": {"uv": [6.5, 7.5, 7, 8], "texture": "#0"}, - "east": {"uv": [10, 15, 11, 16], "texture": "#0"}, - "south": {"uv": [6.5, 7.5, 7, 8], "texture": "#0"} - } - }, - { - "from": [10, 16.1, 13], - "to": [12, 18.1, 14], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": 45, "axis": "x", "origin": [8, 17, 13]}, - "faces": { - "east": {"uv": [6.5, 7.5, 7, 8], "texture": "#0"}, - "south": {"uv": [13, 15, 14, 16], "texture": "#0"}, - "west": {"uv": [6.5, 7.5, 7, 8], "texture": "#0"} - } - }, - { - "from": [4, 16.1, 2], - "to": [6, 18.1, 3], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": -45, "axis": "x", "origin": [8, 17, 3]}, - "faces": { - "north": {"uv": [13, 15, 14, 16], "texture": "#0"}, - "east": {"uv": [6.5, 7.5, 7, 8], "texture": "#0"}, - "west": {"uv": [6.5, 7.5, 7, 8], "texture": "#0"} - } - }, - { - "from": [2, 16.1, 10], - "to": [3, 18.1, 12], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": 45, "axis": "z", "origin": [3, 17, 8]}, - "faces": { - "north": {"uv": [6.5, 7.5, 7, 8], "texture": "#0"}, - "south": {"uv": [6.5, 7.5, 7, 8], "texture": "#0"}, - "west": {"uv": [13, 15, 14, 16], "texture": "#0"} - } - }, - { - "from": [13, 16.1, 4], - "to": [14, 18.1, 6], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": -45, "axis": "z", "origin": [13, 17, 8]}, - "faces": { - "north": {"uv": [6.5, 7.5, 7, 8], "texture": "#0"}, - "east": {"uv": [13, 15, 14, 16], "texture": "#0"}, - "south": {"uv": [6.5, 7.5, 7, 8], "texture": "#0"} + "north": {"uv": [1, 0, 7, 0.5], "texture": "#0"}, + "east": {"uv": [1, 0, 7, 0.5], "texture": "#0"}, + "south": {"uv": [1, 0, 7, 0.5], "texture": "#0"}, + "west": {"uv": [1, 0, 7, 0.5], "texture": "#0"}, + "down": {"uv": [9, 8.5, 15, 14.5], "texture": "#0"} } } ], @@ -216,11 +107,24 @@ } }, "groups": [ + { + "name": "block_top", + "origin": [8, 8, 8], + "color": 0, + "children": [ + { + "name": "Top", + "origin": [10, 22, 10], + "color": 0, + "children": [0, 1] + } + ] + }, { "name": "Middle", "origin": [10, 22, 10], "color": 0, - "children": [0] + "children": [2] }, { "name": "block", @@ -231,22 +135,10 @@ "name": "Base", "origin": [10, 20, 8], "color": 0, - "children": [1, 2, 3, 4] + "children": [3] } ] }, - { - "name": "block_top", - "origin": [8, 8, 8], - "color": 0, - "children": [ - { - "name": "Top", - "origin": [10, 22, 10], - "color": 0, - "children": [5, 6, 7, 8, 9, 10, 11, 12, 13, 14] - } - ] - } + 4 ] -} +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/spout/block.json b/src/main/resources/assets/create/models/block/spout/block.json index 6f42dc418d..877ed28f42 100644 --- a/src/main/resources/assets/create/models/block/spout/block.json +++ b/src/main/resources/assets/create/models/block/spout/block.json @@ -3,182 +3,78 @@ "parent": "block/block", "textures": { "0": "create:block/spout", - "particle": "create:block/copper_plating" + "3": "create:block/encased_pipe", + "particle": "create:block/copper_underside" }, "elements": [ { - "name": "Top 1", - "from": [1.95, 14, 1.95], - "to": [14.05, 16, 14.05], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -23]}, - "faces": { - "north": {"uv": [1, 0, 7, 1], "texture": "#0"}, - "east": {"uv": [1, 0, 7, 1], "texture": "#0"}, - "south": {"uv": [1, 0, 7, 1], "texture": "#0"}, - "west": {"uv": [1, 0, 7, 1], "texture": "#0"}, - "up": {"uv": [1, 9, 7, 15], "texture": "#0"} - } - }, - { - "name": "Top 2", - "from": [1, 12, 1], + "from": [1, 2, 1], "to": [15, 14, 15], - "rotation": {"angle": 0, "axis": "y", "origin": [7, 6, -24]}, + "rotation": {"angle": 0, "axis": "y", "origin": [1, 2, 1]}, "faces": { - "north": {"uv": [0.5, 1, 7.5, 2], "texture": "#0"}, - "east": {"uv": [0.5, 1, 7.5, 2], "texture": "#0"}, - "south": {"uv": [0.5, 1, 7.5, 2], "texture": "#0"}, - "west": {"uv": [0.5, 1, 7.5, 2], "texture": "#0"}, - "up": {"uv": [0.5, 8.5, 7.5, 15.5], "texture": "#0"}, - "down": {"uv": [0.5, 8.5, 7.5, 15.5], "texture": "#0"} + "north": {"uv": [0.5, 9, 7.5, 15], "texture": "#0"}, + "east": {"uv": [0.5, 9, 7.5, 15], "texture": "#0"}, + "south": {"uv": [0.5, 9, 7.5, 15], "texture": "#0"}, + "west": {"uv": [0.5, 9, 7.5, 15], "texture": "#0"}, + "up": {"uv": [8.5, 8.5, 15.5, 15.5], "texture": "#0"}, + "down": {"uv": [8.5, 8.5, 15.5, 15.5], "texture": "#0"} } }, { - "name": "Bottom", "from": [2, 0, 2], - "to": [14, 2, 14], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -23]}, + "to": [14, 16, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 0, 2]}, "faces": { - "north": {"uv": [1, 7, 7, 8], "texture": "#0"}, - "east": {"uv": [1, 7, 7, 8], "texture": "#0"}, - "south": {"uv": [1, 7, 7, 8], "texture": "#0"}, - "west": {"uv": [1, 7, 7, 8], "texture": "#0"}, + "north": {"uv": [1, 0, 7, 8], "texture": "#0"}, + "east": {"uv": [1, 0, 7, 8], "texture": "#0"}, + "south": {"uv": [1, 0, 7, 8], "texture": "#0"}, + "west": {"uv": [1, 0, 7, 8], "texture": "#0"}, + "up": {"uv": [9, 9, 15, 15], "texture": "#0"}, "down": {"uv": [9, 9, 15, 15], "texture": "#0"} } }, { - "name": "Bottom 2", - "from": [1, 2, 1], - "to": [15, 4, 15], - "rotation": {"angle": 0, "axis": "y", "origin": [7, -4, -24]}, - "faces": { - "north": {"uv": [0.5, 6, 7.5, 7], "texture": "#0"}, - "east": {"uv": [1, 6, 7.5, 7], "texture": "#0"}, - "south": {"uv": [0.5, 6, 7.5, 7], "texture": "#0"}, - "west": {"uv": [0.5, 6, 7.5, 7], "texture": "#0"}, - "up": {"uv": [8.5, 8.5, 15.5, 15.5], "texture": "#0"}, - "down": {"uv": [0.5, 8.5, 7.5, 15.5], "texture": "#0"} - } - }, - { - "name": "Window", - "from": [6, 4, 1.95], - "to": [10, 12, 1.95], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [9, 0, 11, 4], "texture": "#0"}, - "south": {"uv": [9, 0, 11, 4], "texture": "#0"} - } - }, - { - "name": "Window", - "from": [14.05, 4, 6], - "to": [14.05, 12, 10], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "east": {"uv": [9, 0, 11, 4], "texture": "#0"}, - "west": {"uv": [9, 0, 11, 4], "texture": "#0"} - } - }, - { - "name": "Window", - "from": [6, 4, 14.05], - "to": [10, 12, 14.05], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [9, 0, 11, 4], "texture": "#0"}, - "south": {"uv": [9, 0, 11, 4], "texture": "#0"} - } - }, - { - "name": "Window", - "from": [1.95, 4, 6], - "to": [1.95, 12, 10], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "east": {"uv": [9, 0, 11, 4], "texture": "#0"}, - "west": {"uv": [9, 0, 11, 4], "texture": "#0"} - } - }, - { - "name": "SideLeft", - "from": [1, 4, 1], - "to": [2, 12, 6], - "faces": { - "east": {"uv": [5, 2, 7.5, 6], "texture": "#0"}, - "south": {"uv": [7, 4.5, 7.5, 5], "texture": "#0"}, - "west": {"uv": [0.5, 2, 3, 6], "texture": "#0"} - } - }, - { - "name": "SideLeft", - "from": [10, 4, 1], - "to": [15, 12, 2], - "faces": { - "north": {"uv": [0.5, 2, 3, 6], "texture": "#0"}, - "south": {"uv": [5, 2, 7.5, 6], "texture": "#0"}, - "west": {"uv": [7, 4.5, 7.5, 5], "texture": "#0"} - } - }, - { - "name": "SideLeft", - "from": [14, 4, 10], - "to": [15, 12, 15], - "faces": { - "north": {"uv": [7, 4.5, 7.5, 5], "texture": "#0"}, - "east": {"uv": [0.5, 2, 3, 6], "texture": "#0"}, - "west": {"uv": [5, 2, 7.5, 6], "texture": "#0"} - } - }, - { - "name": "SideLeft", - "from": [1, 4, 14], - "to": [6, 12, 15], - "faces": { - "north": {"uv": [5, 2, 7.5, 6], "texture": "#0"}, - "east": {"uv": [7, 4.5, 7.5, 5], "texture": "#0"}, - "south": {"uv": [0.5, 2, 3, 6], "texture": "#0"} - } - }, - { - "name": "SideRight", "from": [1, 4, 10], - "to": [2, 12, 15], - "faces": { - "north": {"uv": [7, 3.5, 7.5, 4], "texture": "#0"}, - "east": {"uv": [0.5, 2, 3, 6], "texture": "#0"}, - "west": {"uv": [5, 2, 7.5, 6], "texture": "#0"} - } - }, - { - "name": "SideRight", - "from": [1, 4, 1], - "to": [6, 12, 2], - "faces": { - "north": {"uv": [5, 2, 7.5, 6], "texture": "#0"}, - "east": {"uv": [7, 3.5, 7.5, 4], "texture": "#0"}, - "south": {"uv": [0.5, 2, 3, 6], "texture": "#0"} - } - }, - { - "name": "SideRight", - "from": [14, 4, 1], "to": [15, 12, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "east": {"uv": [5, 2, 7.5, 6], "texture": "#0"}, - "south": {"uv": [7, 3.5, 7.5, 4], "texture": "#0"}, - "west": {"uv": [0.5, 2, 3, 6], "texture": "#0"} + "north": {"uv": [8.5, 2, 15.5, 6], "texture": "#0"}, + "south": {"uv": [8.5, 2, 15.5, 6], "texture": "#0"}, + "up": {"uv": [11, 0.5, 13, 7.5], "rotation": 90, "texture": "#0"}, + "down": {"uv": [11, 0.5, 13, 7.5], "rotation": 90, "texture": "#0"} } }, { - "name": "SideRight", - "from": [10, 4, 14], - "to": [15, 12, 15], + "from": [10, 4, 1], + "to": [6, 12, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [0.5, 2, 3, 6], "texture": "#0"}, - "south": {"uv": [5, 2, 7.5, 6], "texture": "#0"}, - "west": {"uv": [7, 3.5, 7.5, 4], "texture": "#0"} + "east": {"uv": [8.5, 2, 15.5, 6], "texture": "#0"}, + "west": {"uv": [8.5, 2, 15.5, 6], "texture": "#0"}, + "up": {"uv": [11, 0.5, 13, 7.5], "texture": "#0"}, + "down": {"uv": [11, 0.5, 13, 7.5], "rotation": 180, "texture": "#0"} } + }, + { + "from": [2, 12, 2], + "to": [14, 4, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 12, 2]}, + "faces": { + "north": {"uv": [1, 2, 7, 6], "texture": "#0"}, + "east": {"uv": [1, 2, 7, 6], "texture": "#0"}, + "south": {"uv": [1, 2, 7, 6], "texture": "#0"}, + "west": {"uv": [1, 2, 7, 6], "texture": "#0"}, + "up": {"uv": [2, 2, 14, 14], "texture": "#3"}, + "down": {"uv": [9, 9, 15, 15], "texture": "#0"} + } + } + ], + "groups": [ + { + "name": "group", + "origin": [8, 8, 8], + "color": 0, + "children": [0, 1, 2, 3, 4] } ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/spout/bottom.json b/src/main/resources/assets/create/models/block/spout/bottom.json index 9e80c71d80..2bf68fae3e 100644 --- a/src/main/resources/assets/create/models/block/spout/bottom.json +++ b/src/main/resources/assets/create/models/block/spout/bottom.json @@ -2,8 +2,7 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "0": "create:block/spout", - "particle": "create:block/copper_plating" + "2": "create:block/spout_nozzle" }, "elements": [ { @@ -11,11 +10,11 @@ "to": [10, -4, 10], "rotation": {"angle": 0, "axis": "y", "origin": [16.5, 3.5, 16.5]}, "faces": { - "north": {"uv": [12, 0.5, 14, 2], "texture": "#0"}, - "east": {"uv": [12, 0.5, 14, 2], "texture": "#0"}, - "south": {"uv": [12, 0.5, 14, 2], "texture": "#0"}, - "west": {"uv": [12, 0.5, 14, 2], "texture": "#0"}, - "down": {"uv": [14, 0, 16, 2], "texture": "#0"} + "north": {"uv": [4, 1, 8, 4], "texture": "#2"}, + "east": {"uv": [4, 1, 8, 4], "texture": "#2"}, + "south": {"uv": [4, 1, 8, 4], "texture": "#2"}, + "west": {"uv": [4, 1, 8, 4], "texture": "#2"}, + "down": {"uv": [8, 0, 12, 4], "texture": "#2"} } } ] diff --git a/src/main/resources/assets/create/models/block/spout/item.json b/src/main/resources/assets/create/models/block/spout/item.json index ab0a476b09..208cf721e2 100644 --- a/src/main/resources/assets/create/models/block/spout/item.json +++ b/src/main/resources/assets/create/models/block/spout/item.json @@ -3,193 +3,70 @@ "parent": "block/block", "textures": { "0": "create:block/spout", - "particle": "create:block/copper_plating" + "3": "create:block/spout_nozzle", + "4": "create:block/encased_pipe", + "particle": "create:block/copper_underside" }, "elements": [ { - "name": "Top 1", - "from": [2, 14, 2], - "to": [14, 16, 14], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -23]}, - "faces": { - "north": {"uv": [1, 0, 7, 1], "texture": "#0", "cullface": "north"}, - "east": {"uv": [1, 0, 7, 1], "texture": "#0", "cullface": "east"}, - "south": {"uv": [1, 0, 7, 1], "texture": "#0", "cullface": "south"}, - "west": {"uv": [1, 0, 7, 1], "texture": "#0", "cullface": "west"}, - "up": {"uv": [1, 9, 7, 15], "texture": "#0"} - } - }, - { - "name": "Top 2", - "from": [1, 12, 1], - "to": [15, 14, 15], - "rotation": {"angle": 0, "axis": "y", "origin": [7, 6, -24]}, - "faces": { - "north": {"uv": [0.5, 1, 7.5, 2], "texture": "#0", "cullface": "north"}, - "east": {"uv": [0.5, 1, 7.5, 2], "texture": "#0", "cullface": "east"}, - "south": {"uv": [0.5, 1, 7.5, 2], "texture": "#0", "cullface": "south"}, - "west": {"uv": [0.5, 1, 7.5, 2], "texture": "#0", "cullface": "west"}, - "up": {"uv": [0.5, 8.5, 7.5, 15.5], "texture": "#0"}, - "down": {"uv": [0.5, 8.5, 7.5, 15.5], "texture": "#0", "cullface": "down"} - } - }, - { - "name": "Bottom", - "from": [2, 0, 2], - "to": [14, 2, 14], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -23]}, - "faces": { - "north": {"uv": [1, 7, 7, 8], "texture": "#0", "cullface": "north"}, - "east": {"uv": [1, 7, 7, 8], "texture": "#0", "cullface": "east"}, - "south": {"uv": [1, 7, 7, 8], "texture": "#0", "cullface": "south"}, - "west": {"uv": [1, 7, 7, 8], "texture": "#0", "cullface": "west"}, - "down": {"uv": [9, 9, 15, 15], "texture": "#0", "cullface": "down"} - } - }, - { - "name": "Bottom 2", "from": [1, 2, 1], - "to": [15, 4, 15], - "rotation": {"angle": 0, "axis": "y", "origin": [7, -4, -24]}, + "to": [15, 14, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [1, 2, 1]}, "faces": { - "north": {"uv": [0.5, 6, 7.5, 7], "texture": "#0", "cullface": "north"}, - "east": {"uv": [1, 6, 7.5, 7], "texture": "#0", "cullface": "east"}, - "south": {"uv": [0.5, 6, 7.5, 7], "texture": "#0", "cullface": "south"}, - "west": {"uv": [0.5, 6, 7.5, 7], "texture": "#0", "cullface": "west"}, + "north": {"uv": [0.5, 9, 7.5, 15], "texture": "#0"}, + "east": {"uv": [0.5, 9, 7.5, 15], "texture": "#0"}, + "south": {"uv": [0.5, 9, 7.5, 15], "texture": "#0"}, + "west": {"uv": [0.5, 9, 7.5, 15], "texture": "#0"}, "up": {"uv": [8.5, 8.5, 15.5, 15.5], "texture": "#0"}, - "down": {"uv": [0.5, 8.5, 7.5, 15.5], "texture": "#0", "cullface": "down"} + "down": {"uv": [8.5, 8.5, 15.5, 15.5], "texture": "#0"} } }, { - "name": "Window", - "from": [2, 4, 6], - "to": [2, 12, 10], + "from": [2, 0, 2], + "to": [14, 16, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 0, 2]}, "faces": { - "north": {"uv": [0, 0, 0, 0], "texture": "#0"}, - "east": {"uv": [9, 0, 11, 4], "texture": "#0", "cullface": "west"}, - "south": {"uv": [0, 0, 0, 0], "texture": "#0"}, - "west": {"uv": [9, 0, 11, 4], "texture": "#0", "cullface": "west"}, - "up": {"uv": [0, 0, 0, 0], "texture": "#0"}, - "down": {"uv": [0, 0, 0, 0], "texture": "#0"} + "north": {"uv": [1, 0, 7, 8], "texture": "#0"}, + "east": {"uv": [1, 0, 7, 8], "texture": "#0"}, + "south": {"uv": [1, 0, 7, 8], "texture": "#0"}, + "west": {"uv": [1, 0, 7, 8], "texture": "#0"}, + "up": {"uv": [9, 9, 15, 15], "texture": "#0"}, + "down": {"uv": [9, 9, 15, 15], "texture": "#0"} } }, { - "name": "Window", - "from": [6, 4, 2], - "to": [10, 12, 2], - "faces": { - "north": {"uv": [9, 0, 11, 4], "texture": "#0", "cullface": "west"}, - "east": {"uv": [0, 0, 0, 0], "texture": "#0", "cullface": "west"}, - "south": {"uv": [9, 0, 11, 4], "texture": "#0", "cullface": "west"}, - "west": {"uv": [0, 0, 0, 0], "texture": "#0", "cullface": "west"}, - "up": {"uv": [0, 0, 0, 0], "rotation": 90, "texture": "#0"}, - "down": {"uv": [0, 0, 0, 0], "rotation": 270, "texture": "#0"} - } - }, - { - "name": "Window", - "from": [14, 4, 6], - "to": [14, 12, 10], - "faces": { - "north": {"uv": [0, 0, 0, 0], "texture": "#0", "cullface": "west"}, - "east": {"uv": [9, 0, 11, 4], "texture": "#0", "cullface": "west"}, - "south": {"uv": [0, 0, 0, 0], "texture": "#0", "cullface": "west"}, - "west": {"uv": [9, 0, 11, 4], "texture": "#0", "cullface": "west"}, - "up": {"uv": [0, 0, 0, 0], "rotation": 180, "texture": "#0"}, - "down": {"uv": [0, 0, 0, 0], "rotation": 180, "texture": "#0"} - } - }, - { - "name": "Window", - "from": [6, 4, 14], - "to": [10, 12, 14], - "faces": { - "north": {"uv": [9, 0, 11, 4], "texture": "#0", "cullface": "west"}, - "east": {"uv": [0, 0, 0, 0], "texture": "#0", "cullface": "west"}, - "south": {"uv": [9, 0, 11, 4], "texture": "#0", "cullface": "west"}, - "west": {"uv": [0, 0, 0, 0], "texture": "#0", "cullface": "west"}, - "up": {"uv": [0, 0, 0, 0], "rotation": 270, "texture": "#0"}, - "down": {"uv": [0, 0, 0, 0], "rotation": 90, "texture": "#0"} - } - }, - { - "name": "SideLeft", - "from": [1, 4, 1], - "to": [2, 12, 6], - "faces": { - "east": {"uv": [5, 2, 7.5, 6], "texture": "#0", "cullface": "west"}, - "south": {"uv": [7, 4.5, 7.5, 5], "texture": "#0", "cullface": "west"}, - "west": {"uv": [0.5, 2, 3, 6], "texture": "#0", "cullface": "west"} - } - }, - { - "name": "SideLeft", - "from": [10, 4, 1], - "to": [15, 12, 2], - "faces": { - "north": {"uv": [0.5, 2, 3, 6], "texture": "#0", "cullface": "west"}, - "south": {"uv": [5, 2, 7.5, 6], "texture": "#0", "cullface": "west"}, - "west": {"uv": [7, 4.5, 7.5, 5], "texture": "#0", "cullface": "west"} - } - }, - { - "name": "SideLeft", - "from": [14, 4, 10], - "to": [15, 12, 15], - "faces": { - "north": {"uv": [7, 4.5, 7.5, 5], "texture": "#0", "cullface": "west"}, - "east": {"uv": [0.5, 2, 3, 6], "texture": "#0", "cullface": "west"}, - "west": {"uv": [5, 2, 7.5, 6], "texture": "#0", "cullface": "west"} - } - }, - { - "name": "SideLeft", - "from": [1, 4, 14], - "to": [6, 12, 15], - "faces": { - "north": {"uv": [5, 2, 7.5, 6], "texture": "#0", "cullface": "west"}, - "east": {"uv": [7, 4.5, 7.5, 5], "texture": "#0", "cullface": "west"}, - "south": {"uv": [0.5, 2, 3, 6], "texture": "#0", "cullface": "west"} - } - }, - { - "name": "SideRight", "from": [1, 4, 10], - "to": [2, 12, 15], - "faces": { - "north": {"uv": [7, 3.5, 7.5, 4], "texture": "#0", "cullface": "west"}, - "east": {"uv": [0.5, 2, 3, 6], "texture": "#0", "cullface": "west"}, - "west": {"uv": [5, 2, 7.5, 6], "texture": "#0", "cullface": "west"} - } - }, - { - "name": "SideRight", - "from": [1, 4, 1], - "to": [6, 12, 2], - "faces": { - "north": {"uv": [5, 2, 7.5, 6], "texture": "#0", "cullface": "west"}, - "east": {"uv": [7, 3.5, 7.5, 4], "texture": "#0", "cullface": "west"}, - "south": {"uv": [0.5, 2, 3, 6], "texture": "#0", "cullface": "west"} - } - }, - { - "name": "SideRight", - "from": [14, 4, 1], "to": [15, 12, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "east": {"uv": [5, 2, 7.5, 6], "texture": "#0", "cullface": "west"}, - "south": {"uv": [7, 3.5, 7.5, 4], "texture": "#0", "cullface": "west"}, - "west": {"uv": [0.5, 2, 3, 6], "texture": "#0", "cullface": "west"} + "north": {"uv": [8.5, 2, 15.5, 6], "texture": "#0"}, + "south": {"uv": [8.5, 2, 15.5, 6], "texture": "#0"}, + "up": {"uv": [11, 0.5, 13, 7.5], "rotation": 90, "texture": "#0"}, + "down": {"uv": [11, 0.5, 13, 7.5], "rotation": 90, "texture": "#0"} } }, { - "name": "SideRight", - "from": [10, 4, 14], - "to": [15, 12, 15], + "from": [10, 4, 1], + "to": [6, 12, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [0.5, 2, 3, 6], "texture": "#0", "cullface": "west"}, - "south": {"uv": [5, 2, 7.5, 6], "texture": "#0", "cullface": "west"}, - "west": {"uv": [7, 3.5, 7.5, 4], "texture": "#0", "cullface": "west"} + "east": {"uv": [8.5, 2, 15.5, 6], "texture": "#0"}, + "west": {"uv": [8.5, 2, 15.5, 6], "texture": "#0"}, + "up": {"uv": [11, 0.5, 13, 7.5], "texture": "#0"}, + "down": {"uv": [11, 0.5, 13, 7.5], "rotation": 180, "texture": "#0"} + } + }, + { + "from": [2, 12, 2], + "to": [14, 4, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 12, 2]}, + "faces": { + "north": {"uv": [1, 2, 7, 6], "texture": "#0"}, + "east": {"uv": [1, 2, 7, 6], "texture": "#0"}, + "south": {"uv": [1, 2, 7, 6], "texture": "#0"}, + "west": {"uv": [1, 2, 7, 6], "texture": "#0"}, + "up": {"uv": [2, 2, 14, 14], "texture": "#4"}, + "down": {"uv": [9, 9, 15, 15], "texture": "#0"} } }, { @@ -197,11 +74,11 @@ "to": [12, 0, 12], "rotation": {"angle": 0, "axis": "y", "origin": [15.5, 5.5, 15.5]}, "faces": { - "north": {"uv": [12, 6, 16, 7], "texture": "#0"}, - "east": {"uv": [12, 6, 16, 7], "texture": "#0"}, - "south": {"uv": [12, 6, 16, 7], "texture": "#0"}, - "west": {"uv": [12, 6, 16, 7], "texture": "#0"}, - "down": {"uv": [12, 2, 16, 6], "texture": "#0"} + "north": {"uv": [4, 12, 12, 14], "texture": "#3"}, + "east": {"uv": [4, 12, 12, 14], "texture": "#3"}, + "south": {"uv": [4, 12, 12, 14], "texture": "#3"}, + "west": {"uv": [4, 12, 12, 14], "texture": "#3"}, + "down": {"uv": [4, 4, 12, 12], "texture": "#3"} } }, { @@ -209,11 +86,11 @@ "to": [11, -2, 11], "rotation": {"angle": 0, "axis": "y", "origin": [16.5, 3.5, 16.5]}, "faces": { - "north": {"uv": [12.5, 7, 15.5, 8], "texture": "#0"}, - "east": {"uv": [12.5, 7, 15.5, 8], "texture": "#0"}, - "south": {"uv": [12.5, 7, 15.5, 8], "texture": "#0"}, - "west": {"uv": [12.5, 7, 15.5, 8], "texture": "#0"}, - "down": {"uv": [12.5, 2.5, 15.5, 5.5], "texture": "#0"} + "north": {"uv": [5, 14, 11, 16], "texture": "#3"}, + "east": {"uv": [5, 14, 11, 16], "texture": "#3"}, + "south": {"uv": [5, 14, 11, 16], "texture": "#3"}, + "west": {"uv": [5, 14, 11, 16], "texture": "#3"}, + "down": {"uv": [5, 5, 11, 11], "texture": "#3"} } }, { @@ -221,11 +98,11 @@ "to": [10, -4, 10], "rotation": {"angle": 0, "axis": "y", "origin": [16.5, 3.5, 16.5]}, "faces": { - "north": {"uv": [12, 0.5, 14, 2], "texture": "#0"}, - "east": {"uv": [12, 0.5, 14, 2], "texture": "#0"}, - "south": {"uv": [12, 0.5, 14, 2], "texture": "#0"}, - "west": {"uv": [12, 0.5, 14, 2], "texture": "#0"}, - "down": {"uv": [14, 0, 16, 2], "texture": "#0"} + "north": {"uv": [4, 1, 8, 4], "texture": "#3"}, + "east": {"uv": [4, 1, 8, 4], "texture": "#3"}, + "south": {"uv": [4, 1, 8, 4], "texture": "#3"}, + "west": {"uv": [4, 1, 8, 4], "texture": "#3"}, + "down": {"uv": [8, 0, 12, 4], "texture": "#3"} } } ], @@ -260,5 +137,19 @@ "fixed": { "scale": [0.5, 0.5, 0.5] } - } + }, + "groups": [ + { + "name": "new", + "origin": [8, 8, 8], + "color": 0, + "children": [0, 1, 2, 3, 4] + }, + { + "name": "nozzle", + "origin": [16.5, 3.5, 16.5], + "color": 0, + "children": [5, 6, 7] + } + ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/spout/middle.json b/src/main/resources/assets/create/models/block/spout/middle.json index 8698882af6..11ca0a3399 100644 --- a/src/main/resources/assets/create/models/block/spout/middle.json +++ b/src/main/resources/assets/create/models/block/spout/middle.json @@ -2,8 +2,8 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "0": "create:block/spout", - "particle": "create:block/copper_plating" + "0": "create:block/spout_nozzle", + "particle": "create:block/spout_nozzle" }, "elements": [ { @@ -11,11 +11,11 @@ "to": [11, -2, 11], "rotation": {"angle": 0, "axis": "y", "origin": [16.5, 3.5, 16.5]}, "faces": { - "north": {"uv": [12.5, 7, 15.5, 8], "texture": "#0"}, - "east": {"uv": [12.5, 7, 15.5, 8], "texture": "#0"}, - "south": {"uv": [12.5, 7, 15.5, 8], "texture": "#0"}, - "west": {"uv": [12.5, 7, 15.5, 8], "texture": "#0"}, - "down": {"uv": [12.5, 2.5, 15.5, 5.5], "texture": "#0"} + "north": {"uv": [5, 14, 11, 16], "texture": "#0"}, + "east": {"uv": [5, 14, 11, 16], "texture": "#0"}, + "south": {"uv": [5, 14, 11, 16], "texture": "#0"}, + "west": {"uv": [5, 14, 11, 16], "texture": "#0"}, + "down": {"uv": [5, 5, 11, 11], "texture": "#0"} } } ] diff --git a/src/main/resources/assets/create/models/block/spout/top.json b/src/main/resources/assets/create/models/block/spout/top.json index 10930fb8f5..be77a74756 100644 --- a/src/main/resources/assets/create/models/block/spout/top.json +++ b/src/main/resources/assets/create/models/block/spout/top.json @@ -2,8 +2,8 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "0": "create:block/spout", - "particle": "create:block/copper_plating" + "0": "create:block/spout_nozzle", + "particle": "create:block/spout_nozzle" }, "elements": [ { @@ -11,11 +11,11 @@ "to": [12, 0, 12], "rotation": {"angle": 0, "axis": "y", "origin": [15.5, 5.5, 15.5]}, "faces": { - "north": {"uv": [12, 6, 16, 7], "texture": "#0"}, - "east": {"uv": [12, 6, 16, 7], "texture": "#0"}, - "south": {"uv": [12, 6, 16, 7], "texture": "#0"}, - "west": {"uv": [12, 6, 16, 7], "texture": "#0"}, - "down": {"uv": [12, 2, 16, 6], "texture": "#0"} + "north": {"uv": [4, 12, 12, 14], "texture": "#0"}, + "east": {"uv": [4, 12, 12, 14], "texture": "#0"}, + "south": {"uv": [4, 12, 12, 14], "texture": "#0"}, + "west": {"uv": [4, 12, 12, 14], "texture": "#0"}, + "down": {"uv": [4, 4, 12, 12], "texture": "#0"} } } ] diff --git a/src/main/resources/assets/create/models/block/steam_engine/block.json b/src/main/resources/assets/create/models/block/steam_engine/block.json index 553241d179..97e2ec417e 100644 --- a/src/main/resources/assets/create/models/block/steam_engine/block.json +++ b/src/main/resources/assets/create/models/block/steam_engine/block.json @@ -2,7 +2,7 @@ "credit": "Made with Blockbench", "textures": { "1": "create:block/engine", - "particle": "create:block/copper_plating" + "particle": "create:block/copper_underside" }, "elements": [ { @@ -14,7 +14,7 @@ "south": {"uv": [0.5, 6.5, 7.5, 8], "texture": "#1"}, "west": {"uv": [0.5, 6.5, 7.5, 8], "texture": "#1"}, "up": {"uv": [0.5, 8.5, 7.5, 15.5], "rotation": 90, "texture": "#1"}, - "down": {"uv": [8.5, 8.5, 15.5, 15.5], "rotation": 270, "texture": "#1"} + "down": {"uv": [0.5, 8.5, 7.5, 15.5], "rotation": 270, "texture": "#1"} } }, { @@ -25,18 +25,18 @@ "east": {"uv": [1.5, 0.5, 6.5, 6.5], "texture": "#1"}, "south": {"uv": [1.5, 0.5, 6.5, 6.5], "texture": "#1"}, "west": {"uv": [1.5, 0.5, 6.5, 6.5], "texture": "#1"}, - "up": {"uv": [6.5, 0, 11.5, 5], "rotation": 90, "texture": "#1"} + "up": {"uv": [9.5, 9.5, 14.5, 14.5], "rotation": 90, "texture": "#1"} } }, { "from": [13, 5, 4], "to": [15, 13, 12], "faces": { - "north": {"uv": [11.5, 0, 15.5, 1], "rotation": 90, "texture": "#1"}, - "east": {"uv": [11.5, 1, 15.5, 5], "texture": "#1"}, - "south": {"uv": [11.5, 0, 15.5, 1], "rotation": 270, "texture": "#1"}, - "up": {"uv": [11.5, 0, 15.5, 1], "rotation": 270, "texture": "#1"}, - "down": {"uv": [11.5, 0, 15.5, 1], "rotation": 270, "texture": "#1"} + "north": {"uv": [10, 1, 14, 2], "rotation": 90, "texture": "#1"}, + "east": {"uv": [10, 2, 14, 6], "texture": "#1"}, + "south": {"uv": [10, 1, 14, 2], "rotation": 270, "texture": "#1"}, + "up": {"uv": [10, 1, 14, 2], "rotation": 270, "texture": "#1"}, + "down": {"uv": [10, 1, 14, 2], "rotation": 270, "texture": "#1"} } }, { @@ -44,11 +44,11 @@ "to": [3, 13, 12], "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 8]}, "faces": { - "north": {"uv": [11.5, 0, 15.5, 1], "rotation": 270, "texture": "#1"}, - "south": {"uv": [11.5, 0, 15.5, 1], "rotation": 90, "texture": "#1"}, - "west": {"uv": [11.5, 1, 15.5, 5], "texture": "#1"}, - "up": {"uv": [11.5, 0, 15.5, 1], "rotation": 90, "texture": "#1"}, - "down": {"uv": [11.5, 0, 15.5, 1], "rotation": 90, "texture": "#1"} + "north": {"uv": [10, 1, 14, 2], "rotation": 270, "texture": "#1"}, + "south": {"uv": [10, 1, 14, 2], "rotation": 90, "texture": "#1"}, + "west": {"uv": [10, 2, 14, 6], "texture": "#1"}, + "up": {"uv": [10, 1, 14, 2], "rotation": 90, "texture": "#1"}, + "down": {"uv": [10, 1, 14, 2], "rotation": 90, "texture": "#1"} } } ], diff --git a/src/main/resources/assets/create/models/block/steam_engine/item.json b/src/main/resources/assets/create/models/block/steam_engine/item.json index b6757a18f3..8cd46193f2 100644 --- a/src/main/resources/assets/create/models/block/steam_engine/item.json +++ b/src/main/resources/assets/create/models/block/steam_engine/item.json @@ -3,7 +3,7 @@ "textures": { "0": "create:block/cam_linkage", "1": "create:block/engine", - "particle": "create:block/copper_plating" + "particle": "create:block/copper_underside" }, "elements": [ { @@ -27,7 +27,7 @@ "south": {"uv": [0.5, 6.5, 7.5, 8], "texture": "#1"}, "west": {"uv": [0.5, 6.5, 7.5, 8], "texture": "#1"}, "up": {"uv": [0.5, 8.5, 7.5, 15.5], "rotation": 90, "texture": "#1"}, - "down": {"uv": [8.5, 8.5, 15.5, 15.5], "rotation": 270, "texture": "#1"} + "down": {"uv": [0.5, 8.5, 7.5, 15.5], "rotation": 270, "texture": "#1"} } }, { @@ -38,18 +38,18 @@ "east": {"uv": [1.5, 0.5, 6.5, 6.5], "texture": "#1"}, "south": {"uv": [1.5, 0.5, 6.5, 6.5], "texture": "#1"}, "west": {"uv": [1.5, 0.5, 6.5, 6.5], "texture": "#1"}, - "up": {"uv": [6.5, 0, 11.5, 5], "rotation": 90, "texture": "#1"} + "up": {"uv": [9.5, 9.5, 14.5, 14.5], "rotation": 90, "texture": "#1"} } }, { "from": [13, 5, 4], "to": [15, 13, 12], "faces": { - "north": {"uv": [11.5, 0, 15.5, 1], "rotation": 90, "texture": "#1"}, - "east": {"uv": [11.5, 1, 15.5, 5], "texture": "#1"}, - "south": {"uv": [11.5, 0, 15.5, 1], "rotation": 270, "texture": "#1"}, - "up": {"uv": [11.5, 0, 15.5, 1], "rotation": 270, "texture": "#1"}, - "down": {"uv": [11.5, 0, 15.5, 1], "rotation": 270, "texture": "#1"} + "north": {"uv": [10, 1, 14, 2], "rotation": 90, "texture": "#1"}, + "east": {"uv": [10, 2, 14, 6], "texture": "#1"}, + "south": {"uv": [10, 1, 14, 2], "rotation": 270, "texture": "#1"}, + "up": {"uv": [10, 1, 14, 2], "rotation": 270, "texture": "#1"}, + "down": {"uv": [10, 1, 14, 2], "rotation": 270, "texture": "#1"} } }, { @@ -57,17 +57,16 @@ "to": [3, 13, 12], "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 8]}, "faces": { - "north": {"uv": [11.5, 0, 15.5, 1], "rotation": 270, "texture": "#1"}, - "south": {"uv": [11.5, 0, 15.5, 1], "rotation": 90, "texture": "#1"}, - "west": {"uv": [11.5, 1, 15.5, 5], "texture": "#1"}, - "up": {"uv": [11.5, 0, 15.5, 1], "rotation": 90, "texture": "#1"}, - "down": {"uv": [11.5, 0, 15.5, 1], "rotation": 90, "texture": "#1"} + "north": {"uv": [10, 1, 14, 2], "rotation": 270, "texture": "#1"}, + "south": {"uv": [10, 1, 14, 2], "rotation": 90, "texture": "#1"}, + "west": {"uv": [10, 2, 14, 6], "texture": "#1"}, + "up": {"uv": [10, 1, 14, 2], "rotation": 90, "texture": "#1"}, + "down": {"uv": [10, 1, 14, 2], "rotation": 90, "texture": "#1"} } }, { "from": [6, 22, 4], "to": [10, 28, 12], - "forge_data": {"calculate_normals": true}, "rotation": {"angle": 45, "axis": "x", "origin": [15, 25, 8]}, "faces": { "north": {"uv": [8.5, 11, 10.5, 14], "rotation": 180, "texture": "#0"}, @@ -81,7 +80,6 @@ { "from": [6, 8, 4], "to": [10, 14, 12], - "forge_data": {"calculate_normals": true}, "rotation": {"angle": 45, "axis": "x", "origin": [15, 25, 8]}, "faces": { "north": {"uv": [8.5, 11, 10.5, 14], "rotation": 180, "texture": "#0"}, @@ -95,7 +93,6 @@ { "from": [6, 14, 6], "to": [10, 22, 10], - "forge_data": {"calculate_normals": true}, "rotation": {"angle": 45, "axis": "x", "origin": [15, 25, 8]}, "faces": { "north": {"uv": [1.5, 1, 3.5, 6], "rotation": 180, "texture": "#0"}, @@ -157,4 +154,4 @@ "children": [5, 6, 7] } ] -} +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/steam_engine/steam_engine.bbmodel b/src/main/resources/assets/create/models/block/steam_engine/steam_engine.bbmodel deleted file mode 100644 index c1e8ec7c6b..0000000000 --- a/src/main/resources/assets/create/models/block/steam_engine/steam_engine.bbmodel +++ /dev/null @@ -1 +0,0 @@ -{"meta":{"format_version":"4.0","creation_time":1645009708,"model_format":"java_block","box_uv":false},"name":"Steam Piston","parent":"","ambientocclusion":true,"front_gui_light":false,"visible_box":[1,1,0],"variable_placeholders":"","resolution":{"width":16,"height":16},"elements":[{"name":"cube","rescale":false,"locked":false,"from":[5,3,5],"to":[11,22,11],"autouv":0,"color":7,"origin":[0,0,0],"faces":{"north":{"uv":[4,6.5,7,16],"texture":0},"east":{"uv":[1,6.5,4,16],"texture":0},"south":{"uv":[4,6.5,7,16],"texture":0},"west":{"uv":[1,6.5,4,16],"texture":0},"up":{"uv":[4,3.5,7,6.5],"texture":0},"down":{"uv":[0,0,0,0],"texture":null}},"uuid":"bb5f68d8-d633-6589-b61a-ac1f08516ef1"},{"name":"cube","rescale":false,"locked":false,"from":[1,0,1],"to":[15,3,15],"autouv":0,"color":4,"origin":[0,0,0],"faces":{"north":{"uv":[0.5,6.5,7.5,8],"texture":1},"east":{"uv":[0.5,6.5,7.5,8],"texture":1},"south":{"uv":[0.5,6.5,7.5,8],"texture":1},"west":{"uv":[0.5,6.5,7.5,8],"texture":1},"up":{"uv":[0.5,8.5,7.5,15.5],"rotation":90,"texture":1},"down":{"uv":[8.5,8.5,15.5,15.5],"rotation":270,"texture":1}},"uuid":"1758ddcd-ecbd-3569-9c40-06e40b82914b"},{"name":"cube","rescale":false,"locked":false,"from":[3,3,3],"to":[13,15,13],"autouv":0,"color":3,"origin":[0,0,0],"faces":{"north":{"uv":[1.5,0.5,6.5,6.5],"texture":1},"east":{"uv":[1.5,0.5,6.5,6.5],"texture":1},"south":{"uv":[1.5,0.5,6.5,6.5],"texture":1},"west":{"uv":[1.5,0.5,6.5,6.5],"texture":1},"up":{"uv":[6.5,0,11.5,5],"rotation":90,"texture":1},"down":{"uv":[0,0,0,0],"rotation":270,"texture":null}},"uuid":"10fc7e13-136d-fe5a-12e8-5ab0d56572d2"},{"name":"cube","rescale":false,"locked":false,"from":[13,5,4],"to":[15,13,12],"autouv":0,"color":5,"origin":[0,0,0],"faces":{"north":{"uv":[11.5,0,15.5,1],"rotation":90,"texture":1},"east":{"uv":[11.5,1,15.5,5],"texture":1},"south":{"uv":[11.5,0,15.5,1],"rotation":270,"texture":1},"west":{"uv":[0,0,0,0],"texture":null},"up":{"uv":[11.5,0,15.5,1],"rotation":270,"texture":1},"down":{"uv":[11.5,0,15.5,1],"rotation":270,"texture":1}},"uuid":"84d1f78c-210d-d43e-7c3e-c44dbccd739e"},{"name":"cube","rescale":false,"locked":false,"from":[1,5,4],"to":[3,13,12],"autouv":0,"color":3,"origin":[0,0,8],"faces":{"north":{"uv":[11.5,0,15.5,1],"rotation":270,"texture":1},"east":{"uv":[0,0,0,0],"texture":null},"south":{"uv":[11.5,0,15.5,1],"rotation":90,"texture":1},"west":{"uv":[11.5,1,15.5,5],"texture":1},"up":{"uv":[11.5,0,15.5,1],"rotation":90,"texture":1},"down":{"uv":[11.5,0,15.5,1],"rotation":90,"texture":1}},"uuid":"18bdbdbf-c454-d659-4a8c-a8858d177eef"},{"name":"cube","rescale":false,"locked":false,"from":[6,17,4],"to":[10,23,12],"autouv":0,"color":3,"origin":[0,0,0],"faces":{"north":{"uv":[8.5,11,10.5,14],"texture":0},"east":{"uv":[10.5,11,14.5,14],"texture":0},"south":{"uv":[8.5,11,10.5,14],"texture":0},"west":{"uv":[10.5,11,14.5,14],"texture":0},"up":{"uv":[10.5,9,14.5,11],"rotation":90,"texture":0},"down":{"uv":[10.5,14,14.5,16],"rotation":90,"texture":0}},"uuid":"af28fce2-d208-0379-54b4-7dc0c86a7ea3"},{"name":"cube","rescale":false,"locked":false,"from":[6,31,4],"to":[10,37,12],"autouv":0,"color":5,"origin":[0,0,0],"faces":{"north":{"uv":[8.5,11,10.5,14],"texture":0},"east":{"uv":[10.5,11,14.5,14],"texture":0},"south":{"uv":[8.5,11,10.5,14],"texture":0},"west":{"uv":[10.5,11,14.5,14],"texture":0},"up":{"uv":[10.5,9,14.5,11],"rotation":90,"texture":0},"down":{"uv":[10.5,14,14.5,16],"rotation":90,"texture":0}},"uuid":"3e9020ae-d9d2-cf05-68cc-0f8c69f877e0"},{"name":"cube","rescale":false,"locked":false,"from":[6,23,6],"to":[10,31,10],"autouv":0,"color":4,"origin":[0,0,0],"faces":{"north":{"uv":[1.5,1,3.5,6],"texture":0},"east":{"uv":[1.5,1,3.5,6],"texture":0},"south":{"uv":[1.5,1,3.5,6],"texture":0},"west":{"uv":[1.5,1,3.5,6],"texture":0},"up":{"uv":[0,0,0,0],"texture":null},"down":{"uv":[0,0,0,0],"texture":null}},"uuid":"1efd911a-c293-52f1-caf1-c5c9950b283d"},{"name":"cube","rescale":false,"locked":false,"from":[2,37,5],"to":[5,43,11],"autouv":0,"color":4,"origin":[8,24,8],"faces":{"north":{"uv":[9.5,1.5,11,4.5],"texture":0},"east":{"uv":[11,1.5,14,4.5],"texture":0},"south":{"uv":[9.5,1.5,11,4.5],"texture":0},"west":{"uv":[11,1.5,14,4.5],"texture":0},"up":{"uv":[11,0,14,1.5],"rotation":90,"texture":0},"down":{"uv":[11,4.5,14,6],"rotation":90,"texture":0}},"uuid":"13918418-0f93-bf99-b472-24afd4156970"},{"name":"cube","rescale":false,"locked":false,"from":[11,37,5],"to":[14,43,11],"autouv":0,"color":1,"origin":[8,24,8],"faces":{"north":{"uv":[9.5,1.5,11,4.5],"texture":0},"east":{"uv":[11,1.5,14,4.5],"texture":0},"south":{"uv":[9.5,1.5,11,4.5],"texture":0},"west":{"uv":[11,1.5,14,4.5],"texture":0},"up":{"uv":[11,0,14,1.5],"rotation":90,"texture":0},"down":{"uv":[11,4.5,14,6],"rotation":90,"texture":0}},"uuid":"2899e055-4fd8-4120-d61e-504018a868dd"},{"name":"cube","rescale":false,"locked":false,"from":[0,38,6],"to":[2,42,10],"autouv":0,"color":4,"origin":[0,0,0],"faces":{"north":{"uv":[6,0,10,2],"rotation":90,"texture":3},"east":{"uv":[0,0,0,0],"texture":null},"south":{"uv":[6,0,10,2],"rotation":90,"texture":3},"west":{"uv":[6,6,10,10],"texture":2},"up":{"uv":[6,0,10,2],"rotation":90,"texture":3},"down":{"uv":[6,0,10,2],"rotation":90,"texture":3}},"uuid":"26c50f51-a6e4-9674-ae96-9054706335aa"},{"name":"cube","rescale":false,"locked":false,"from":[14,38,6],"to":[16,42,10],"autouv":0,"color":6,"origin":[15,24,8],"faces":{"north":{"uv":[6,0,10,2],"rotation":90,"texture":3},"east":{"uv":[6,6,10,10],"texture":2},"south":{"uv":[6,0,10,2],"rotation":90,"texture":3},"west":{"uv":[0,0,0,0],"texture":null},"up":{"uv":[6,0,10,2],"rotation":270,"texture":3},"down":{"uv":[6,0,10,2],"rotation":270,"texture":3}},"uuid":"f2ab5727-659d-b068-2849-7438bbd0f2a4"},{"name":"cube","rescale":false,"locked":false,"from":[3,31,5],"to":[6,37,11],"autouv":0,"color":5,"origin":[-7.5,18,8],"faces":{"north":{"uv":[9.5,1.5,11,4.5],"rotation":180,"texture":0},"east":{"uv":[11,1.5,14,4.5],"rotation":180,"texture":0},"south":{"uv":[9.5,1.5,11,4.5],"rotation":180,"texture":0},"west":{"uv":[11,1.5,14,4.5],"rotation":180,"texture":0},"up":{"uv":[11,4.5,14,6],"rotation":90,"texture":0},"down":{"uv":[11,0,14,1.5],"rotation":90,"texture":0}},"uuid":"d16d9c0b-c1b9-65c3-169f-6511041f08c4"},{"name":"cube","rescale":false,"locked":false,"from":[10,31,5],"to":[13,37,11],"autouv":0,"color":0,"origin":[-7.5,18,8],"faces":{"north":{"uv":[9.5,1.5,11,4.5],"rotation":180,"texture":0},"east":{"uv":[11,1.5,14,4.5],"rotation":180,"texture":0},"south":{"uv":[9.5,1.5,11,4.5],"rotation":180,"texture":0},"west":{"uv":[11,1.5,14,4.5],"rotation":180,"texture":0},"up":{"uv":[11,4.5,14,6],"rotation":90,"texture":0},"down":{"uv":[11,0,14,1.5],"rotation":90,"texture":0}},"uuid":"0b46da4d-19b5-92d6-b592-dc1d22714f0d"}],"outliner":[{"name":"Housing","origin":[8,0,0],"color":0,"uuid":"599acd84-2b4c-3b15-3ff1-43e46c4a58f1","export":true,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"children":["1758ddcd-ecbd-3569-9c40-06e40b82914b","10fc7e13-136d-fe5a-12e8-5ab0d56572d2","84d1f78c-210d-d43e-7c3e-c44dbccd739e","18bdbdbf-c454-d659-4a8c-a8858d177eef"]},{"name":"Piston","origin":[0,0,0],"color":0,"uuid":"7d34f50a-dfb1-51df-666c-1f7cb7055eb1","export":true,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"children":["bb5f68d8-d633-6589-b61a-ac1f08516ef1"]},{"name":"Linkage","origin":[8,8,8],"color":0,"uuid":"5e49a9d4-7c65-c86f-eb33-d42733debbcf","export":true,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"children":["af28fce2-d208-0379-54b4-7dc0c86a7ea3","3e9020ae-d9d2-cf05-68cc-0f8c69f877e0","1efd911a-c293-52f1-caf1-c5c9950b283d"]},{"name":"Cam","origin":[-7.5,18,8],"color":0,"uuid":"851f342b-9502-2a1b-248a-6da25144590d","export":true,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"children":["13918418-0f93-bf99-b472-24afd4156970","2899e055-4fd8-4120-d61e-504018a868dd","26c50f51-a6e4-9674-ae96-9054706335aa","f2ab5727-659d-b068-2849-7438bbd0f2a4","d16d9c0b-c1b9-65c3-169f-6511041f08c4","0b46da4d-19b5-92d6-b592-dc1d22714f0d"]}],"textures":[{"path":"C:\\Users\\simon\\Desktop\\Modding\\Forge 18 Concealed\\Create\\src\\main\\resources\\assets\\create\\textures\\block\\cam_linkage.png","name":"cam_linkage.png","folder":"block","namespace":"create","id":"0","particle":true,"render_mode":"normal","visible":true,"mode":"bitmap","saved":true,"uuid":"ccfa89b2-739d-ff62-a4cb-d963e94195ab","relative_path":"../../../../textures/block/cam_linkage.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAA59JREFUWEfFl21IU1EYxx9hqWu65hBCzJYYGAlTv6QWphWYSghKGgmC9vKhKIgMKnqjNypICIz6UOSHwEjDIELID4FJb598AcEgW0vnmshcm8OXhBv/Y+dy7vVuc9dFz5d5n3nP8zv/5+WcxdE/spqaWslsNitW9/v91NXVGSc6FQ+xZCkr2yslJZmJQyD4zIyfenrehAYo2V0sZdkyGMeoc4x63/bpBtSlwPWLzVJFeRUN9feTyzNGl260RAWAoNgldo5PLQurwKGmeqliTzmNjAySw+WmJ23tUQE0Nh6WIDVkn5gYp2AwSLOzs4zDaDSSyWQKn4IzJ5qkgsJdDOCXz0t377dFDcB3DYCpqSmqrixlmxkY/EKpqamRAbZm5zL59QKICgAgLzebpgM+cn7z6APoaC6Rnj0fVaTz4IEsqmvpXaaOugYAMD8/x95NSEhcGYA6BZ8f7pNu3xxQAJy7kEcFx17HHkCrCMc/HJdO1r1SALR2VNGG7Q/C1gfmQNQKaLWhNPNUqtlyXgHQNXKL4pIaYg+gNYiiSYFIqUsBrcERTRHqGeWyjAhk25xM2xoOkGvoI7kGf5Dza4Ac7kX69M6pWLtwp43Otr+PakaEgpMXgdTpuRuprdvIBse1oxYZYqVtuCoFOMDlRz42OFpPb/o/AJAeBjV4GlaiQE5OjoRhYzCsoYWFOYqPT2Tr8L8XF3/LAmE4DQ8PM/VjVgMAsFhS2IFjMBgoMXEtO5QmJ3+ywHiGeTxu8vmmlwPcqd8hZaYZCIUI4wXoHguQ0+FVpNeWaaV7fUMhi5CnM91epHiPF7c4RSMqgBU4FF8NcFpnAf+edxTSyNJpL1J0lviuDFC9v1JKSbaQ1ZTAXvIG51kxwrT8L190h1RAVFOrrcUWlhfBGE5fn0H2/HxyfHdSYNrLjmW2Aw1/uNuSrhSsRgEE5DVTWpwidxFPCU8BntFZmjWwGgVwYortywMBSjTUEupCPEnlFOA6ts5iZXJz6XErgmn5xesaTkxUOC84fHZeeawIzh9qrx5RnKQyAO4CKEAEgyE4ChGm5RcvrDwFYseod88BoIJmCgDAg/EuELcgdgf8IgDaDocWDLMkksW8DdF2GFiwtIylQRbONNuQd4H4ojgH1P5Ic4ADqUEAGBIA/4yhA+PB+QJqfziAU8V2ST2+5RpQjXG5CHEds1qTFQBe75KsWv5wvxt1A/BgrAj/BufkgBD94QDEmoiUgj9fr/M/8yY+nQAAAABJRU5ErkJggg=="},{"path":"C:\\Users\\simon\\Desktop\\Modding\\Forge 18 Concealed\\Create\\src\\main\\resources\\assets\\create\\textures\\block\\engine.png","name":"engine.png","folder":"block","namespace":"create","id":"1","particle":false,"render_mode":"normal","visible":true,"mode":"bitmap","saved":true,"uuid":"ba8f5076-d10e-7dbe-f689-60fc0a6e475e","relative_path":"../../../../textures/block/engine.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAABNNJREFUWEfFV2toW2UYfrM0ze2krUuytGvZ7E28bYsoVlrHZCudjFF1ihc6/eGvOaHDH1oQ2Y86hDH94QTdLxV1KKJThwqObkwdUaFiOx0Dt15W2qVZE2yak1uT7Mjznn2n56RpSJaK75+cc77vfb/ne95rTHQTMnb4acVsd5CrycXa0gYv/8pTc/wbm45RLpmgI99NU221lZxrFMMp8esmii6m6dhP50wm/UqphnH4mZ+D5LZbyOkgcq2zqQdfS1E8QRRJZmj71gbes8FtIUe1mcx1Ft6Tm89QYjFHU5EM9Q10kQHAYM92pdWrGpPMVQbUci7L72NzKXpx3yY69/UEjc7K5JFsZDOrN0zlTBSWU7SlXqIHH23mPd469XCfR+I9obDMIObmc7zHAODdPbuURqlKU2rzNzCdeqUZOUtP7W2nP05N0N/XsnTbuiq+IQRGsY5v9/Q08x7cdDqapqZaK+8Rz2Cm7U6PEcDxvl0Kbg5aYXR92y3a4aAN9IKJJ17qpJGT5+nCxRjd3mDT6IULcOBdd7jI37uZ9/zwa5h2PuAhXAZyeSSofcO7gYFvnutVxOFYBHWgCwIAEIB4uP9+Nv77XzL5m6zaPuwBK/feLTGAYGCc4wDxABYhcIX4dvXyP8UB5DMgAMB3oDcwLrO/AVoIvnW2SOwC3BYgAQjsQMDsyHRa+1aQAbExP3L1ABBggatxTjGkFUQ8d653coDpQSIYRZwgeAESbBoA5MeA3gVCGTHQ1VFfUhqODoc5KJEZepDIHAR7IpEpnAXFghAGd3bUUCmF6MfhaNFakcukb64OHDx1xsDcUgSU9/Rmb7diMPTbwScVj3MN1bX72BJKrCiveJ+/FKJw/Dp1DH6+KgAO9TxkBCAKkXAB0koUGVEH4IL9J75fFQCvb7sBIND/mOJrtLJfIcWaDNbRaEIzaeo8+lVFQAa6tqkMoAcgMmvtRD6X2gNw83wGQrEs9whkAnrCasQCAxjo3qEghwECAiCFmlE0qQaZSKvDQ6crYgC2KjZQXtwv380AKo2BShhkABhEPj09q8Gz2YyzgFhIpdSZAPLMjnpqHfhMi6F4XG1WUpWJ7LWF9ZPRLMlZdXZwOs0cQ2xg8ujzyiffjlNrjX1FRh0OC5dOBryQpL27W+jW/vdZH+l7JRQnf4OuK+VZ0uuPBBO00efkdNYAfDE0RY3VFppZzFB7nUPrcKIOsKsmY7z25+zCMgCRSILavPaS9ddKjiUAkRMHlA8+vMAAgFS01/xZDiAw9QDAC/u2kHvP23wBNLFgbLEs/Wavg/qO32BAD8DrUYdIiGjHGCL0Y1k+AAwyl+YTDKBU/U31NfTIRydVF6SHDynvDJ5lekXfFhMQ5jYcjoECwAQDL7/RTdb7XmN9AaAc/WUAjrw6RPgIAOJwMW6LURoDBNzzy8UFeuUtIwCwUo7+5o06BuCC946NchaAQshKh2MNAPYfWIoBMAAA5egXBaA/HAfqGZmdTNH5K0YACMKJuYQGoBT9liZdEKIOfPzlOAEVgmmrf632R0KfzkhV+BkAnn3cWAeQhuXou926NBQAkMdIQ65UeTUF/hdSCIAoRKXoB8aixkIkSrGSXrEQaiWU48NpKlqKC1kRJVisGUrx/96MVr73f7/yLxn0juUSP7i0AAAAAElFTkSuQmCC"},{"path":"C:\\Users\\simon\\Desktop\\Modding\\Forge 18 Concealed\\Create\\src\\main\\resources\\assets\\create\\textures\\block\\axis_top.png","name":"axis_top.png","folder":"block","namespace":"create","id":"2","particle":false,"render_mode":"normal","visible":true,"mode":"bitmap","saved":true,"uuid":"07072ef3-cbb1-53ec-389b-0005d44ab5c9","relative_path":"../../../../textures/block/axis_top.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAGpJREFUOE/tkjEOABEQRb9eoeVuWrXKIVRq1yQToZi9wNqwWtPPS/7LEzg8cfiPC8DcgXOOlVLovYOIkHN+9TWV6L1nYwxaa6i1Isa4BwghsJQSYwyUUpBS2gNYa1lr/X/CamA3pI+QViU+DW8oEedEdfMAAAAASUVORK5CYII="},{"path":"C:\\Users\\simon\\Desktop\\Modding\\Forge 18 Concealed\\Create\\src\\main\\resources\\assets\\create\\textures\\block\\axis.png","name":"axis.png","folder":"block","namespace":"create","id":"3","particle":false,"render_mode":"normal","visible":true,"mode":"bitmap","saved":true,"uuid":"b699b2d2-5f79-2328-a547-b19b3b3f640d","relative_path":"../../../../textures/block/axis.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAKNJREFUOE+lkyEOBCEMRTuCESBAgIC7ITAcCjvnwoIFg2VTkklWzCY7pZKUx//l94Af5b2f1loYY0DvHa7rOp5aHw+xMYQwhRDrDhnAGAPnHOSc3yuIMU58XSkFtVYa4DxP0FrvKUALpRRIKb0b4reF1hoNgBY450ACYA6klGsGJAt3kFABCYBBMsYsC6QcbAPwFzBEWFtBQgskwL1MZMC/6/wBkRp2ERiWaKEAAAAASUVORK5CYII="}]} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/potato_cannon/cog.json b/src/main/resources/assets/create/models/item/potato_cannon/cog.json index 7f2cb673f2..2d52317f75 100644 --- a/src/main/resources/assets/create/models/item/potato_cannon/cog.json +++ b/src/main/resources/assets/create/models/item/potato_cannon/cog.json @@ -9,60 +9,58 @@ "elements": [ { "name": "Cog", - "from": [5.5, 8, 6.5], - "to": [10.5, 9, 9.5], - "rotation": {"angle": 0, "axis": "z", "origin": [8, 8.5, 7.5]}, + "from": [7.5, 6, 6.5], + "to": [8.5, 11, 9.5], + "rotation": {"angle": 0, "axis": "z", "origin": [8, 8.5, 8]}, "faces": { - "north": {"uv": [6.5, 9.75, 9, 10], "texture": "#1"}, - "east": {"uv": [8.75, 10, 9, 8.5], "rotation": 90, "texture": "#1"}, - "south": {"uv": [6.5, 8.5, 9, 8.75], "texture": "#1"}, - "west": {"uv": [8.75, 8.5, 9, 10], "rotation": 90, "texture": "#1"}, - "up": {"uv": [6.5, 8.5, 9, 10], "rotation": 180, "texture": "#1"}, - "down": {"uv": [6.5, 8.5, 9, 10], "texture": "#1"} + "north": {"uv": [0.25, 13.25, 2.75, 13.75], "rotation": 90, "texture": "#1"}, + "east": {"uv": [0.25, 14, 2.75, 15.5], "rotation": 270, "texture": "#1"}, + "south": {"uv": [0.25, 13.25, 2.75, 13.75], "rotation": 270, "texture": "#1"}, + "west": {"uv": [0.25, 14, 2.75, 15.5], "rotation": 90, "texture": "#1"}, + "up": {"uv": [1.75, 12.25, 0.25, 12.75], "rotation": 90, "texture": "#1"}, + "down": {"uv": [0.25, 12.5, 1.75, 13], "rotation": 90, "texture": "#1"} } }, { "name": "Cog", "from": [7.5, 6, 6.5], "to": [8.5, 11, 9.5], - "rotation": {"angle": 0, "axis": "z", "origin": [8, 8.5, 7.5]}, + "rotation": {"angle": 45, "axis": "z", "origin": [8, 8.5, 8]}, "faces": { - "north": {"uv": [6.5, 9.75, 9, 10], "rotation": 90, "texture": "#1"}, - "east": {"uv": [6.5, 8.5, 9, 10], "rotation": 270, "texture": "#1"}, - "south": {"uv": [6.5, 8.5, 9, 8.75], "rotation": 270, "texture": "#1"}, - "west": {"uv": [6.5, 8.5, 9, 10], "rotation": 90, "texture": "#1"}, - "up": {"uv": [8.75, 10, 9, 8.5], "texture": "#1"}, - "down": {"uv": [8.75, 8.5, 9, 10], "texture": "#1"} - } - }, - { - "name": "Cog", - "from": [7.5, 6, 6.5], - "to": [8.5, 11, 9.5], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": 45, "axis": "z", "origin": [8, 8.5, 7.5]}, - "faces": { - "north": {"uv": [6.5, 9.75, 9, 10], "rotation": 90, "texture": "#1"}, - "east": {"uv": [6.5, 8.5, 9, 10], "rotation": 270, "texture": "#1"}, - "south": {"uv": [6.5, 8.5, 9, 8.75], "rotation": 270, "texture": "#1"}, - "west": {"uv": [6.5, 8.5, 9, 10], "rotation": 90, "texture": "#1"}, - "up": {"uv": [8.75, 10, 9, 8.5], "texture": "#1"}, - "down": {"uv": [8.75, 8.5, 9, 10], "texture": "#1"} + "north": {"uv": [0.25, 13.25, 2.75, 13.75], "rotation": 90, "texture": "#1"}, + "east": {"uv": [0.25, 14, 2.75, 15.5], "rotation": 270, "texture": "#1"}, + "south": {"uv": [0.25, 13.25, 2.75, 13.75], "rotation": 270, "texture": "#1"}, + "west": {"uv": [0.25, 14, 2.75, 15.5], "rotation": 90, "texture": "#1"}, + "up": {"uv": [1.75, 12.25, 0.25, 12.75], "rotation": 90, "texture": "#1"}, + "down": {"uv": [0.25, 12.5, 1.75, 13], "rotation": 90, "texture": "#1"} } }, { "name": "Cog", "from": [5.5, 8, 6.5], "to": [10.5, 9, 9.5], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": 45, "axis": "z", "origin": [8, 8.5, 7.5]}, + "rotation": {"angle": 0, "axis": "z", "origin": [8, 8.5, 8]}, "faces": { - "north": {"uv": [6.5, 9.75, 9, 10], "texture": "#1"}, - "east": {"uv": [8.75, 10, 9, 8.5], "rotation": 90, "texture": "#1"}, - "south": {"uv": [6.5, 8.5, 9, 8.75], "texture": "#1"}, - "west": {"uv": [8.75, 8.5, 9, 10], "rotation": 90, "texture": "#1"}, - "up": {"uv": [6.5, 8.5, 9, 10], "rotation": 180, "texture": "#1"}, - "down": {"uv": [6.5, 8.5, 9, 10], "texture": "#1"} + "north": {"uv": [0.25, 13.25, 2.75, 13.75], "rotation": 180, "texture": "#1"}, + "east": {"uv": [0.25, 12.5, 1.75, 13], "texture": "#1"}, + "south": {"uv": [0.25, 13.25, 2.75, 13.75], "rotation": 180, "texture": "#1"}, + "west": {"uv": [1.75, 12.25, 0.25, 12.75], "texture": "#1"}, + "up": {"uv": [0.25, 14, 2.75, 15.5], "rotation": 180, "texture": "#1"}, + "down": {"uv": [0.25, 14, 2.75, 15.5], "texture": "#1"} + } + }, + { + "name": "Cog", + "from": [5.5, 8, 6.5], + "to": [10.5, 9, 9.5], + "rotation": {"angle": 45, "axis": "z", "origin": [8, 8.5, 8]}, + "faces": { + "north": {"uv": [0.25, 13.25, 2.75, 13.75], "rotation": 180, "texture": "#1"}, + "east": {"uv": [0.25, 12.5, 1.75, 13], "texture": "#1"}, + "south": {"uv": [0.25, 13.25, 2.75, 13.75], "rotation": 180, "texture": "#1"}, + "west": {"uv": [1.75, 12.25, 0.25, 12.75], "texture": "#1"}, + "up": {"uv": [0.25, 14, 2.75, 15.5], "rotation": 180, "texture": "#1"}, + "down": {"uv": [0.25, 14, 2.75, 15.5], "texture": "#1"} } } ], @@ -116,4 +114,4 @@ ] } ] -} +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/potato_cannon/item.json b/src/main/resources/assets/create/models/item/potato_cannon/item.json index 37b7f4cc28..e8482cc412 100644 --- a/src/main/resources/assets/create/models/item/potato_cannon/item.json +++ b/src/main/resources/assets/create/models/item/potato_cannon/item.json @@ -12,7 +12,7 @@ "rotation": {"angle": 0, "axis": "y", "origin": [7, 7.6, 11]}, "faces": { "east": {"uv": [4, 2, 0, 3.5], "texture": "#1"}, - "south": {"uv": [10, 6, 11.5, 7.5], "texture": "#1"}, + "south": {"uv": [4.5, 0.5, 6, 2], "texture": "#1"}, "west": {"uv": [0, 2, 4, 3.5], "texture": "#1"}, "up": {"uv": [0, 0, 4, 1.5], "rotation": 90, "texture": "#1"}, "down": {"uv": [0, 4, 4, 5.5], "rotation": 270, "texture": "#1"} @@ -23,12 +23,12 @@ "to": [10, 10.5, -1.5], "rotation": {"angle": 0, "axis": "y", "origin": [7, 7.6, 11]}, "faces": { - "north": {"uv": [4, 0.5, 6, 2.5], "texture": "#1"}, - "east": {"uv": [6.25, 0.5, 5.75, 2.5], "texture": "#1"}, - "south": {"uv": [4, 3.5, 6, 5.5], "texture": "#1"}, - "west": {"uv": [5.75, 0.5, 6.25, 2.5], "texture": "#1"}, - "up": {"uv": [4, 0.75, 6, 0.25], "texture": "#1"}, - "down": {"uv": [4, 2.75, 6, 2.25], "texture": "#1"} + "north": {"uv": [4.25, 0.25, 6.25, 2.25], "texture": "#1"}, + "east": {"uv": [6.5, 0.25, 6, 2.25], "texture": "#1"}, + "south": {"uv": [4.25, 2.75, 6.25, 4.75], "texture": "#1"}, + "west": {"uv": [6, 0.25, 6.5, 2.25], "texture": "#1"}, + "up": {"uv": [4.25, 0.5, 6.25, 0], "texture": "#1"}, + "down": {"uv": [4.25, 2.5, 6.25, 2], "texture": "#1"} } }, { @@ -36,23 +36,23 @@ "to": [9.5, 10, 10.5], "rotation": {"angle": 0, "axis": "y", "origin": [8, 7.6, 11]}, "faces": { - "north": {"uv": [0, 6, 1.5, 7.5], "texture": "#1"}, - "east": {"uv": [4, 2, 3.5, 3.5], "texture": "#1"}, - "west": {"uv": [3.5, 2, 4, 3.5], "texture": "#1"}, - "up": {"uv": [3.5, 0, 4, 1.5], "rotation": 90, "texture": "#1"}, - "down": {"uv": [3.5, 4, 4, 5.5], "texture": "#1"} + "north": {"uv": [4.5, 0.5, 6, 2], "texture": "#1"}, + "east": {"uv": [3.5, 2, 4, 3.5], "texture": "#1"}, + "west": {"uv": [4, 2, 3.5, 3.5], "texture": "#1"}, + "up": {"uv": [4, 0, 3.5, 1.5], "rotation": 90, "texture": "#1"}, + "down": {"uv": [3.5, 4, 4, 5.5], "rotation": 90, "texture": "#1"} } }, { - "from": [6, 7, 10.5], - "to": [10, 11, 15.5], + "from": [6, 6.5, 10.5], + "to": [10, 10.5, 15.5], "rotation": {"angle": 0, "axis": "y", "origin": [8, 9.6, 11]}, "faces": { - "north": {"uv": [10, 3.5, 12, 5.5], "texture": "#1"}, - "east": {"uv": [9.5, 1, 7, 3], "texture": "#1"}, - "south": {"uv": [10, 1, 12, 3], "texture": "#1"}, - "west": {"uv": [7, 1, 9.5, 3], "texture": "#1"}, - "up": {"uv": [7, 3.5, 9.5, 5.5], "rotation": 90, "texture": "#1"}, + "north": {"uv": [10, 2.5, 12, 4.5], "texture": "#1"}, + "east": {"uv": [9.5, 0, 7, 2], "texture": "#1"}, + "south": {"uv": [10, 0, 12, 2], "texture": "#1"}, + "west": {"uv": [7, 0, 9.5, 2], "texture": "#1"}, + "up": {"uv": [7, 2.5, 9.5, 4.5], "rotation": 90, "texture": "#1"}, "down": {"uv": [7, 6, 9.5, 8], "rotation": 270, "texture": "#1"} } }, @@ -68,30 +68,29 @@ } }, { - "from": [6.5, 4.5, 8.5], - "to": [9.5, 7.5, 14.5], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": -45, "axis": "z", "origin": [8, 6, 11.5]}, + "from": [6.5, 4.5, 9.75], + "to": [9.5, 7.5, 15.75], + "rotation": {"angle": -45, "axis": "z", "origin": [8, 6, 12.5]}, "faces": { "north": {"uv": [3, 6, 4.5, 7.5], "rotation": 90, "texture": "#1"}, - "east": {"uv": [6, 9.25, 3, 10.75], "texture": "#1"}, - "south": {"uv": [5, 6, 6.5, 7.5], "texture": "#1"}, - "west": {"uv": [3, 8, 6, 9.5], "texture": "#1"}, - "up": {"uv": [3, 9.5, 6, 8], "rotation": 90, "texture": "#1"}, - "down": {"uv": [6, 10.75, 3, 9.25], "rotation": 90, "texture": "#1"} + "east": {"uv": [7, 9.5, 4, 11], "texture": "#1"}, + "south": {"uv": [3, 6, 4.5, 7.5], "texture": "#1"}, + "west": {"uv": [4, 8, 7, 9.5], "texture": "#1"}, + "up": {"uv": [4, 9.5, 7, 8], "rotation": 90, "texture": "#1"}, + "down": {"uv": [7, 11, 4, 9.5], "rotation": 90, "texture": "#1"} } }, { "from": [7, 5, 15.5], - "to": [9, 10, 17.5], + "to": [9, 9.5, 17.5], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8.6, 11]}, "faces": { "north": {"uv": [1.25, 8.5, 0.25, 11], "texture": "#1"}, - "east": {"uv": [2, 8.5, 1, 11], "texture": "#1"}, - "south": {"uv": [3, 8.5, 2, 11], "texture": "#1"}, - "west": {"uv": [1, 8.5, 2, 11], "texture": "#1"}, - "up": {"uv": [2, 7.5, 3, 8.5], "texture": "#1"}, - "down": {"uv": [1.5, 10.75, 2.5, 11], "rotation": 90, "texture": "#1"} + "east": {"uv": [1.25, 6.75, 0.25, 9], "texture": "#1"}, + "south": {"uv": [2.25, 6.75, 1.25, 9], "texture": "#1"}, + "west": {"uv": [0.25, 6.75, 1.25, 9], "texture": "#1"}, + "up": {"uv": [1.25, 5.75, 2.25, 6.75], "texture": "#1"}, + "down": {"uv": [1.25, 9, 2.25, 10], "texture": "#1"} } } ], @@ -132,4 +131,4 @@ "scale": [0.72, 0.72, 0.72] } } -} +} \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/block/copper_casing_connected.png b/src/main/resources/assets/create/textures/block/copper_casing_connected.png index 1a8258fe4d8da118e10cb129f2118359bce16629..c715296526f6e9d334fe0f0fe31e6bb394ba2da4 100644 GIT binary patch literal 12835 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 delta 1460 zcmYk6X;4!K5XTcEM9x@Hp;m~Mv7&v&DW3Gp2jFGDRMj=;~zC~sDakhz-1{x5sy1$#geJ*D* zpnjr4FU9*G;-0rP__cz9g)rqVX$0B4FvG)8F2ruRgy->0T8>8U1&s#7C0B2N{;;EWcPoSL*Jg zR1%$K9lQD#6_`4a@v89o7Q4R1{kpRAh3~HAugWyi=A2lp~ zCGw!-1j9o2C-W+w{f&Ae6cx-~aC>N)pB-N-%LSW@-UNr_7rt!<5Z&y^Jh;c(%0qzoDp9Vk2QP0Z zQ`bjo9Q0#_sn2e3&`f?FdaJngNsgbL7a-Z#gaXi(V)MO_a#oeRew*P43fh{?w=-~q zCG+?Z;bRDW8V8gr^(0|)3YN`!ccduN2~j)V&1 zo_(~op%a50C6jLg05bTrM@1r=#W+jN0xDG4=Zw?76(r0YV~UWu>I42fv8RI2;Ap9Q zfZ%%^3}%z=o3@6tcHTFo03v(>s~;gUiP}3r><5EVQwmXmE6KRJAS3l&3lb(@DQX_$ z3ez=Ye$*J6LOFfTgpq zg$DU&l%{X1p2C`rH(19VCX(NJU9C~FI$|~m&4dD*(H34Oi;N@{Wq}&D`i{Dl z&?P|DfKKq(dr;Vjf zzDUb-88|Ga6MBnnKuGE(g1Pu{V^$5*dI-%GGTRjBRDxynf9~oPNoK$ETCtA8xvd3? zaUs--;{&uN*kVX)O6t^N)@KZT!Cbrq;Th-=I#?x%7%|k8E%~hYKP&-#UQ%Aw+-QYf zRvuQmBra9mjxu3{7$4S zXvS>$PB}rLVtdwDl70j15AajnUp7N3CKYT<*`D>%MbM-DshDGKCta%#2VeOYXx0+E diff --git a/src/main/resources/assets/create/textures/block/copper_redstone_plate.png b/src/main/resources/assets/create/textures/block/copper_redstone_plate.png index be241d21c9ea2fc08417dae364339f1947b6ad06..f9c06f21f1670c6894cb729ffed21f96a7ff9170 100644 GIT binary patch literal 5690 zcmeHKc~DbV7k`KZWU(MBDu|B=g6PXeb_t3kEQL^HFN*e&ypXUYF$pAqRB%H;sZd3$ zh$4zCDlQ1fQp8e31*w8nP;slELP3S1Rw&;~u!{3_<{M|e{%2<1c9!2g=XcJ%H#gPC z+s#OSjy?bYMjq~LU-W6LzVtBYecs?03;>vK;{AgazOWLM$|M3&6ap&ZqzH(pL;?U% zbsh;4{n}SBb)?n)^yD3T$}Ae?T~oVW`X%+nzPjnr&+R-K-3(gq^1mP$8C%~rl05I! ztHzX_`3=GsgAX_B&*{ir)1eF>{joQ_c8+AU+Y(d|bJwkwx4#LhJ0r|0lr_X!vtk5;Ipl@b( zK-8)7tC(U=)3&X7+j^=d2f6ywHZ8Ac30&2ZI{!Rnzw+)3+TB~N-E;hh$c8rLt#e-V zH|Mw)zPKQPd+r`?xUk>hd6ao$bWyZ+`MZ&p^4j18|`S;U!~aomk<)c^D3nq+~Op(@ux zQB(p{>aEnZdo)WApj@oygqyCAP0eTq3YW!L8wY^*mmi#Jb7_8U61U(iCEL2zUjVR3m;n- z@vl0iSjaCkJaNk}fGyyPEWXJ?orIb0xZqGi-p(&~m6X=E2m7@IM2PebbgvYiI+DGw z?0S)0cm2>Uzt+(B*r5C+i7A_H^{s9Nm29LbJZrqDjt|P7->>R+!17(&+`& zCmj^Vp-rQhYYe{PxEf!ti0C;9gfDUUb(z!yktZQb)ABR z8}!K`or77gH^s~1Y%DV${-&CAZex5*^!KF)lk;4m+TFz_=3i{L3p_T`aXTd@joEtt zh7aMe-M0A#8BV%+Nz+1ndmdHqbbEG<;>07K>J5LiBQz+l+iLW2W6I^oZP{VEHs^fo zGXn+3x-7o3sO5w1ZUJr6(kLls27>>BB5uY$9ok*Jzxm{bwnCe)cXTHdl-#TTOBZUP zQNGLOw3Xbxm{x3MX4Y!Rsp@QRUiT+0!oI#O=J55QmW>y3lmFy$2d{LE_zz~~Wk$u? zRm4~6ijU_S<1JIinyE%totvs1Hx^h5RVjsEH*m%<178@m9DkTn?B=%uVmA5kPF9(8 zJ<7g*iL!3)k*S9~&2)U)!Mx`b9`4t;guR@E(WVOGSksZ8tg%B__E8hvz!I5havY(4 z?pYV@y(VX$tXKeRmCQR6^c1qEH_n|Zu-zgvV!h56YP~qHWtF8wIU8VEwClgIx~N@V zk$OE&xbz@)s3Of6Uj;cD+g>bjqRkju-WNnpxHSZDw%Mh&rE8@PckI)$4dv9YO&>r! zrHVhC@RjHI(L$v=08#Myv9(?%l zS>sCwg9CH2Flns|*v3_+T+{Tnz))9QIL-V@zT;S8N4;BA&2n=$n*c&m#PLMtIVG#* zSfL*6d}*2YG26l|1NFK6LzD`0-Tly7Z;qEe65Q`c`#JR>E5ps>sGITXmm#Nv1`X~> zAFWNeTe~PXX4A{XUZJf!8cM+%Q0fff;!@|tH3!QBU!3;t>1p2DdSZ6eDkcgLjVNGH6&)p(GgU0C2A7GxtHpRMs4-DQvarEiAJ9c2LqIZ)j3YoCl_-{k zb28dg9el7WDOLb$8?p*qG7b0qG&iA z!Ar&A8iks0rn8R+3roTgK1h6`V1)p6K<9u+%$F$TA5{LLXv9wetNA3-9LQ7#oys6n z=>!Uu@xdq%k;&0sRHG6JI0vdmqb>{+O$VhGR(C22ppm25FkNH_tdPk3C6Xu>Rvi?m z_I$7Aq7#Y_D_}OPKu}NuiOeLDm?VNfdMA^a6!Ibhfk~KPFX4*>asSI&J$*pO@uItn zENki)SEUlS*aHLl_bVR1Nut{?9j_HVi9 zADV#*3j}<$BOo3L7C>agAq+yx#)o)Rx`2$(84QFpPV0MgxkR8)!ZO4;9OV(^3T;pg zSD@XyQZ4*A8l@0X*8!yrB9fp9lwtAjlEtf6jK8yW#Qzr`jv9jrOAP8aE<=|tbS1>U zUkcyxg~s}C{@&H$-y8x2KM(Rr{C=kEGhLs=z$Y1h?yk>teG&toWc<0i{%>^Ye>hAb zV)P%751|9XC4OmhRbg}QRa`6M z)mbg+9}hb^O>jWZ0UX1LZk?%R+vYII(A$=0@!**RNHtUqJ==b*yI|UE<15oHmRG(W z)=9E`bP-sWn~~CWBHhjJKkQWk z7Pk*Yrn%+Z$r-a%E>dpR44@2P-4xRAKNzj9nlHBasm2yW3XU;r*Z8$nCscc7%S8GJll|Sop#!dkFn3^2N8)my^-LmU? zb_>YyZls(y!HKNQuNG5NtFwQ38&NXEC=Xy=!}JjF9d|n#*SOv|aeBkxW5kH=L~lq> z42&zV8cVzJ64O7o+_EpwIsWabN!Fx;wq9XT(E)ad_b999yG=$jJd%?6$2sN3@ovx7yw-jyGW#p?&_Fm^cff<=%|5aGn+^W~gTlbo delta 260 zcmV+f0sH>CER_O~8Gi!+001a04^sdD06b7kR7Dm500000|H_5wqix@mV&IEo)Ob|b zb6Ub?PsC$VuvAK(N=1x7K!Q6xcs4t3FF1Gv0b>CHQ2_!!0R^57D)j&W00MMUPE!B? zc9YFG0001nNkl)c63#tIK;BgeC~Ocb=BR~sZZYP+AD9nsovu%&GR247D!Amg|zJe0000< KMNUMnLSTYo`fslQ diff --git a/src/main/resources/assets/create/textures/block/copper_redstone_plate_powered.png b/src/main/resources/assets/create/textures/block/copper_redstone_plate_powered.png index 0c2d9bc838bcb79aa46a0175d301e06d18696a68..1908d226f4b52d567ea5eab905d7c9e4e87b34e0 100644 GIT binary patch literal 5697 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 C!p`~t delta 252 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 delta 130 zcmaE%F`03KL^TUD0|Ud`yN`l^lu&?Ai0h5ws3XZi8$!J1d%N~HI8>Nf-{x501(db% zba4!+xRuONSjyNW5YCqF%E-p%rYOv&E^ZKz$Wg+}+9VLj=H4MC$i~jm+^WJBV|~YA ghiHNK!*dJ_&3EP09l7PM0nK6XboFyt=akR{04cmCGXMYp diff --git a/src/main/resources/assets/create/textures/block/encased_pipe.png b/src/main/resources/assets/create/textures/block/encased_pipe.png index e74562e576939ac93598d9ca707fe0b6afee1cae..7393e18468a823bde6dc69a2300079d7e013c7e1 100644 GIT binary patch delta 19 bcmX@ie3*GcFoy`EfboqP?B6yIL}# diff --git a/src/main/resources/assets/create/textures/block/engine.png b/src/main/resources/assets/create/textures/block/engine.png index ac89aac8bc896c0eb05e81af853c6abffb2dde35..3cf96c02adb9b357d87100001b9f431c774baaad 100644 GIT binary patch literal 7143 zcmeHMcTiJXw~r!S1f)n2jR9#Al8^*QXwsAxq)Aa)DnuZ`6d+UuL_tug0!mXv6cH7W zj$osSpi-4`m8wWl5EK#L0li-Dyl>{soq6AXH!~;aoW0ljt+jq@tv!3siM6rbFC-u% z00M!8%*{;ffIE2Y;^P7SnZdyeAdnzeu!A$p4j%~iXV58BUox1*@h5}HK~xF|6!fw^ z-6d_bTFB&kl>qEGvU$v3w@GL2W0;|8Y0S;=aKG=`rIvOU;=Cqc5#Q3)PaS@%jY`p( zI4e6wd;iB+wBvB4@?!W)3|6+|L+Hx~Y~*6)%Dbm&)#G;$Pv{PK z#yx|LoDiHnDLg^pe^a#6@Wbh4_AARmeB@=}k%k>n5gm`R@I`Xt@s3g)Y-aF&FN>1~ ztCmg(MYjFfDhdehiKdx%e|#s+|Ej6OyOF7=AkW^@f2p-jZ1wBW~d~E z(`JdP#nD?WRjbTYuB17J37w)`ud;xa_w-1WK4Xqd?~CfGp3Q5@w(4*Tep_C#A#C4v z>gcY^@z|FONUH_nxJv00>??+#YH{WBR!c`0cDYb@0948%n=u?MY$R) zFCKVRcMG`+x!(NkK&5o7hyVO{C}UsVSL4y}N7G7O1!;LlMQU6M4a@O9Cwx|FCNgXM zkZdePk$Ho%ulZ(&e&D-n5644XuO!?G9%M$2z6(jX-CIyJw%|P?RVII@cv>^CJh+!t zqSOhy!@Jc?D>-0HGchY!f7_N|b$$8xYy4*KRq#vomTxae9sTxh(|dlrFEcemt8ur! z^kz5Z6;{Rt0-IyS3(|*`qvqMu5iCV3H->N(GTr>eOySg2>>nM4hDRRWPIPiPw7>eW zEOM-;>Z5dnQp)uKpKuXxq2S^c)N!wJj&LKz9a$QgX;L-xE|N*}a=9ZbBbj_Tp{u|N zac!j1i@&AeYqoBkMfskslEOkN&RW3=_g1JZZ-rjE&}4Klv{aH|^ruG^sMt}8vKBexl6826A&9p{UX`pWHnmv?7eekPi~UwY&z=v#0OEOI;d ziRtN0-ZKMEFBR%yB3IKJ7RC-*8+}v1$zbn6)7q zeN$2akw+r(NMoQx+-Sw9zwVV9Eo)WpcsMj0Q z)wUx~yXT7A6k*3KB%-Zm*rgtYxD`vuXlpW-?@(e; zc@1{CjmCOy(9Xi9AcbZFawyf#Ai=uNQL#MoU`9+dkE{q9$>r`;>io#^4WvM<#{IUR zN2*MkoE`)$ZZhCM8B}A9xo>|KJYb8vHTPNJdWcc{ytA`#^vtC$>lu6bWm$y{C#u^A zgg0jjUX88A6=<9u(vMeeNoG+Q9JXtrZ=p-H#gv1P$hd&59H+$Y+)I&rwSDGpt7<%g zPB%u}cz2~u*C>k76k>U|V>rbJjpov?irhFQ_bm0yX=Tl)nxD>|A;{h0UTQ+icA-^8 zzY5J(=gh}rt<9UC5_#IY)}>w1WZa0a+Q>FO#2+N+fG z$wbeXCvk-DechN!Jzt<`iA_ORTcVCuSE|tl3$q8odCq;XjPn;&=FKWLkoytKfw6Co zh9FTB!P-rbo7bfsBiu@#taeJ@HrgJloyl!jy6P0GC)1?aM#*j1QE~O1_YQl_@}QIQ z%RJ4-f_2x_0rn@DMrLyjMa z{gAjVrmB+dy$$wtYvKDQxAM=_h>u4=&oY-aR$67-&)lk`5YR7}pKCc%c9%o!Oxy7` z?VEK9pH1TPcFA2X4vB3T589p+0}>H#>DY9!rpLil{;cbP-XkxG)X}!KcS9e;t@3x3 z<%zd8e$FiV*xHSd804C{ny)<<-V-=q)Q}ut|44|>*0B5?v)e^-ORXI8t z@`U-#rrXi8(|v~bui01Jc$@;^UOKTnS~lY?EqGPQUA^gZHlaXB?ZkdgQMuB&Z$3Wd zm`5jF>=Vi)!_@U7=n3O>&2{%m=FWd|6MHP?HtaT7lRzsCuee)*Ohs<~Op?~z;+n~(lrS3 z#}j?XEHHuWMWyLMW^3+2z*LeR#0iaq=n`N4kI zV6sdD0Fa*!{YMR^18}N<*^!xaHiJku4ItB4^1nlnh`;px*$m(Ha7aWL*_Z4Gh%y1I zh`*WKZ;rG1rLjhV7uC;yT?-)lZ;~u3Qn#+i9nDEL_7&f)fA?w)iUdFr5f~%}uZ4nY6121cC=C=;8;{U};*oF+9EsK z52Taohxa1G{Aph66KjNH4Q2y6)Z!W{0^g{rpPp42NVb#m2{7LNdU(z9)jh56VP6e4hUZ2)ISA` z@cWy&Fo91MVr$n1Q07G`V33z(jx*(*+$=7NMHY2?-vog+j+mPmIygTVbj0~|?Uf3@ z>l={d@}fPBoF^&J6Raw}FltyE2VUhXabHn!uU(cm5h=;8mEbnCxxshs6}dmukD}3% zx8qLoI57#g8?ro<^kg(_oHNWB;{DwAtj(Y{WO|GlDI|ko+3iF^Lcg}QU z>BFEWE|2%QS=|s-cKKuIS^NDB`WIiG6LJ>>?|fylhZXS(-Xf*gjZZ>Yciek0#=j*{ zsr3Rk=&)b7>RY-Pr$POIr}Uw_9_;juT*g@r)mo-miwzCAQXlgroL}X5DJ_{s9y4u? z5(kBT#WeZ8ZOmVm>FlN(K9SxisUnLQm!&mkMd?}Hu+4Kk?ynlT=^`ppTYtc5=u!g6 zE^qGEvGb{r@y+!|tNI6RB8ysC!XS4&jz3~hTEgbMw9VVbk@NJBtS6EEhg=E9QFMj4 z$C*wF>>i_YhqyeAJnt@u*va`jmS;w!QdYb!DTN*L#a=shVTSX>MX5el7{nFzW~6s# zzZuP;x_l>Kb++eRx53zwvynyA>uz_YaSkNl}rW$vpgRjm$%TRH>U9bGP=_M*a_4>5div delta 476 zcmV<20VDqBH|qnC8Gi!+002a!ipBr{07XztR7C&)0Q9zb>7#AqlV;zPV&IEo+l5`- zgJ9HnRM>M`%4|`>W>3UpQo&(Pv0hH4TS~B0N|sVeo=Qc6Mna50K!Q6xcs4uaiGOnd z0004WQchCHWCnzP~pi^DXkN3sspja^8dtgS!x6a2GZpZl{|- zcYqpz<&wfVK6)`KGZ4W$KQ7>04uEP62x>-Y*7VG%V??z^O%rzzp&=^6v;F$@ z&gH1U>Ciiu@GQ?q*Ek((HZg`S>KI1_vi=s*%ibf$3OQCM!it&>xPPF207=?zSNsLn Q;Q#;t07*qoM6N<$g77<&oB#j- literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/fluid_chute_unpowered.png b/src/main/resources/assets/create/textures/block/fluid_chute_unpowered.png new file mode 100644 index 0000000000000000000000000000000000000000..5acd68410e5f306d8680a70163092fc15a34ab61 GIT binary patch literal 365 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 BxKscD diff --git a/src/main/resources/assets/create/textures/block/item_drain_side.png b/src/main/resources/assets/create/textures/block/item_drain_side.png index e09cb2dbda947c4d806885520a0a608a127c4d90..70c0e2b9c0a8072ec21dffb468a48c011d4b6c7d 100644 GIT binary patch literal 5048 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 VoxZ5#ye-B&;N#`TDfC#g=|9~1^5p;k delta 202 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 delta 128 zcmeBBpU5~tqLPJ~fq~)e-A6${N+Q4~#1%-tT%3EOIO=F>(1sAN9tVdCGwW1M)1?Ml zLO?mjk|4ie28U-i(tsRwPZ!6Kid)GE1*r)M48l&1O{Z2l@$m3yr7m3fQVYmPiG+i1W2{En z1o&)@4e)`JHu8ARn~#f9*ZnEPOVgdI5e>QJcYzu1QQ^3JzV&=z-N$FHCY|_nXHjSZ zk2t&LDG__UyM5`=lTQwgY|fvw28%A3+*tUIi&#R#TrHelK9#7#Yg=UCz9|l4=ai{>rD&k$G&o|Ae&< z7dvk~TygG1bnD}mEwk@j)$GWByR~Wl@t|dk3p-SunT=_CY6_ku9@+G>{+pexeiv&> zq{jCmqV_gyxn>UCw<>Sks^ZA4D;KtnI1nNDY}0zLea8$TvPE4VCWnl6zrHJct*7^+ zefyK|8t$~HN>49HE&Ar&%zL357ZtDen2eeXcT&ea_}{M+5sdp zq{}httQ+!RZ}9U8<=58nB0eY``*q>_yuIs#H9xJ!{t#H`5k9PvbbmU`t^AyKJX8J5 zEuaCD4#KbtafM!Xx=Zr&niRk{)-MeR`lueRfoVWWcA9+o2eb|_p z8^$cSGA1dmhzXtKI}4d7Ic%C}_kFvhgp99azWyZbf?HGmqH%0+Q~k_JTgCDEkA=s7 zN(n8}d#5bfUor3E=Q7I`Ti!ozBpxoB|M1$OO}P(llKR`ZEg-GJJ2S{@d}cWjRKV=X zK3G+*PbiCAJFcQme7oXQ$rWAxz0BPk{olXq8|b4SJ;Yb0H+~;HbVuVP=}!OS5&rRy zsBbeyxu3ecI_vVC?Vl{Vu`Hu? z_KkC2HZP2OzHil~qJoIB57ZByWNn(+`Qo(Lf7POtsuFF%GeJ{T%lW0H?_H^UD_@_I zv7GqVC7+g}xiRbV+CSP_zp16}$)2V)g)F-0)Lt$AR@=dx~J52y}3s4 zZ~xNPpeoqB*)(j@xw=_6X*CN8%4z^Yr`ZOZn8yp7?z9o)62S5eAf2|T1+B+V3ivdo z7R-_BP@OFjWYDp>3`ok2PbPDhkQgPHKFu@Ci9-N0U0y(~aJL{7pc5(`n0*(~aBVP`ej5TrMt-?XqN!&xUv1a@l{Ljp}Uu&_b>AtCfT%1UN&;c27P0?t29SxK70U5`pqN{9`p5dkQwL}ZkKLNJt+AWBqj zAOHm9MpO`pKlcyB7$MnoE#<-L`oGcT`RXtQEbt$Y10I!R+M$=> zG0Vd+GbV}`&YQ|Z56r3i5lTkbVpHur-kYPjYY4Aon;#Uu!D@AyHy(J6@e<<`-LZNo znxl=Hk*qpTQvA^i_N{xd{C<0Y$0Wx44j4!I+@U7^!1GHBOgS@Df2KQbgTZU(@~ZS- zo^&a5gunc!Ve*;n_pN>lzw9_$9b0*Ia}3sb|6W?U->|YYc=q$J^>ZNGO(UTTo>mhd JRT+_%|6h*Xx3K^K delta 116 zcmeyU+{!pXBA11kfq~)e-A6${N+Q4~#1%-tT%3EOIBG+PSC4~3g_(7#rfH~x_S(yy zT|ha;k|4ie28U-i(tsRkPZ!6Kid)GIOrjFb5_2bVP1Y)I^_*#Nfro)%&veGaNe32- Q0F^O#y85}Sb4q9e0CZ?29smFU diff --git a/src/main/resources/assets/create/textures/block/pipes.png b/src/main/resources/assets/create/textures/block/pipes.png index 64ba384eaf4df7f03112ec79c1d7d62fbab034c3..014b7cb96756182a10266ca2dfb5f34d70b2e47c 100644 GIT binary patch delta 19 acmeyw_K9smFoy`EAot70KFy8M;>-X=M+Q^? delta 19 acmeyw_K9smFo&?XqS%GK#uXc*#hC#|bq1RN diff --git a/src/main/resources/assets/create/textures/block/pipes_connected.png b/src/main/resources/assets/create/textures/block/pipes_connected.png index b95aae0e288d865a31fe1c1ab977c8be99a9219f..99f144c75a32b1ca8f1ef66c59f737833115eaa2 100644 GIT binary patch delta 19 acmZ3LA0R?FQ delta 19 acmZ3LHI|e}j diff --git a/src/main/resources/assets/create/textures/block/portable_fluid_interface.png b/src/main/resources/assets/create/textures/block/portable_fluid_interface.png index a1adebfcf6f98b8581cb9f36d9ea36b77838029e..812c17896902b742445deb1fa0213140368c78b7 100644 GIT binary patch literal 7624 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 delta 666 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 E4>P73VgLXD delta 733 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/valve_open.png b/src/main/resources/assets/create/textures/block/valve_open.png new file mode 100644 index 0000000000000000000000000000000000000000..086b5a8915aa856e9b957a410b8e9ceb7375e80c GIT binary patch literal 512 zcmV+b0{{JqP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00C%8L_t(I%f*tfO9NpT$3Hht z&bxPv3kGM9O@nCgM-z+1qG`>d#b6SV8AM@%EXWi^!DJGPMQ~sc#A0w*#0A@e;QoPQ z?C$om;TdEvJEtfZ_LS%OK0H6Z58nqmZCW!pnw#A^TdJ&1n!Tq_)-R&OGx=3%GoXTa0C&qCr4kBh_0T9qPFoKBLxD|&~F2n8ip6ZEw zr6+xtZqq{gE*@Zk!Xjq3ofBeEbv)t;p%|Q%pVa22uR7k(16Cg{(8`yPjBqu$!^`eA zj$dbH|CqV!G$bQXerLX=Cv<|=-}PDa`i@}=9KViRlhk}q<%75S_cETQCWEQ;3jIT4 z=z158M!n4&rl3?TP&hncIsd4&F^Jk0hAF7|9)>Ac>KSICcT{1w;t;j15QA@35HUNX zLKFY0LVhDlDwk1;NHidzR4k~?`HgJok^cS4owpCCHIg>y6I=xV0000D8W04x{DgXcg diff --git a/src/main/resources/assets/create/textures/item/copper_sheet.png b/src/main/resources/assets/create/textures/item/copper_sheet.png index 3482b5526044e7e76afb862c00da0d948bfa5d96..312b7afcb3da02a7e322b48dacaeff116efbee0c 100644 GIT binary patch delta 18 acmX@We1LgE2s@*I)GV#}vo=PjG6DcOQ3ebE delta 18 ZcmX@We1LgE2s;C}$kjAqgN@Oti~u(P1%Utn diff --git a/src/main/resources/assets/create/textures/item/crushed_raw_copper.png b/src/main/resources/assets/create/textures/item/crushed_raw_copper.png index 3a1c6c7810950b82901194c51bcc3010c58f00c4..786d9c41171f51970b6e574326dc44b4281a773c 100644 GIT binary patch delta 18 ZcmaFO{F-?}2s@(yujEgu*p1N>7y&#w1`GfI delta 18 acmaFO{F-?}2s;C}73T)I{~MzxFaiKRRR(|n diff --git a/src/main/resources/assets/create/textures/item/potato_cannon.png b/src/main/resources/assets/create/textures/item/potato_cannon.png index 8909c95527c46bc05285c819f7ffbe52009d39a6..4e9d848cc76307cb14ed70adef1a298710446668 100644 GIT binary patch literal 11791 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 b7G()qhOfHDqobpd zk&)PQTFPitfq{XKtNSgQ%_G%cs4srNk~LN zKxHX4RUj)zz*+HVB8YT3T9$Lqsg6 zd;bR=I=n_Xer~jTUyq#sPX;4_5N?qFFg%MOh6ec$J4F8P2|?IE|KaLGWY9rDI%cY1 zq=b-ub&eqm=6OCG;({mu(zq4$P0WI?^i>5ho??tk2w9-!sK6dBNMGsb8H3e1pU+ib zg?#}X{R+~NvVUMc`4S(8A;=Ii9 zbXewnffb5iS=LMu#M<2WxP(^2rC`pJ6xT9|tFdG2V}F5@tP_+$il?OrW@8byc~@W! za6En31hER@Q-VXBFG^6y)~5tZ?PA>vT#%h6c7pCUS_A%lAclYl1tttg0H!J;{bu3< z+!D+QP#_Ui7w9HP8!kxBJpty{E*ZTQ*gZi#f}nt! zUsZuxFMqJ~;3l>j3q;K7&r3e_g5A?X9O&qpxDPoug38YX=rF4dk8GYNB2_7D-&6!R!?PrrCd~gN3+Mo&hLQ)4Flwm9 z%4tO4hHZ>=8OVEBwmGtOB=6yEGo0{nvl92ZP&GlgNn6tbX>^6(giI?CgQ qnk64MwEVcC=Eq4bKTd-G8NUG)bx)C6wkJaX0000 Date: Sat, 21 Dec 2024 22:55:21 +0000 Subject: [PATCH 211/515] minor touchups --- .../models/block/mechanical_pump/cog.json | 8 ++++++++ .../create/models/block/packager/tray.json | 15 +++++++++++---- .../textures/block/packager_details.png | Bin 1057 -> 3398 bytes .../textures/gui/stock_keeper_categories.png | Bin 1728 -> 7491 bytes 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/main/resources/assets/create/models/block/mechanical_pump/cog.json b/src/main/resources/assets/create/models/block/mechanical_pump/cog.json index 007f00c0c1..49f96ddf43 100644 --- a/src/main/resources/assets/create/models/block/mechanical_pump/cog.json +++ b/src/main/resources/assets/create/models/block/mechanical_pump/cog.json @@ -9,6 +9,7 @@ { "from": [6.5, -1, 3], "to": [9.5, 17, 13], + "forge_data": {"calculate_normals": true}, "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { "north": {"uv": [0, 6.5, 9, 8], "rotation": 90, "texture": "#2"}, @@ -22,6 +23,7 @@ { "from": [-1, 6.5, 3], "to": [17, 9.5, 13], + "forge_data": {"calculate_normals": true}, "rotation": {"angle": 0, "axis": "z", "origin": [8, 8, 8]}, "faces": { "north": {"uv": [0, 6.5, 9, 8], "rotation": 180, "texture": "#2"}, @@ -35,6 +37,7 @@ { "from": [6.5, -1, 3], "to": [9.5, 17, 13], + "forge_data": {"calculate_normals": true}, "rotation": {"angle": 45, "axis": "z", "origin": [8, 8, 8]}, "faces": { "north": {"uv": [0, 6.5, 9, 8], "rotation": 90, "texture": "#2"}, @@ -48,6 +51,7 @@ { "from": [-1, 6.5, 3], "to": [17, 9.5, 13], + "forge_data": {"calculate_normals": true}, "rotation": {"angle": 45, "axis": "z", "origin": [8, 8, 8]}, "faces": { "north": {"uv": [0, 6.5, 9, 8], "rotation": 180, "texture": "#2"}, @@ -61,6 +65,7 @@ { "from": [5.5, 0.9, 3.05], "to": [10.5, 15.1, 12.95], + "forge_data": {"calculate_normals": true}, "rotation": {"angle": 22.5, "axis": "z", "origin": [8, 8, 8]}, "faces": { "north": {"uv": [1, 7, 1.5, 7.5], "texture": "#2"}, @@ -72,6 +77,7 @@ { "from": [0.9, 5.5, 3.05], "to": [15.1, 10.5, 12.95], + "forge_data": {"calculate_normals": true}, "rotation": {"angle": -22.5, "axis": "z", "origin": [8, 8, 8]}, "faces": { "north": {"uv": [1, 7, 1.5, 7.5], "rotation": 90, "texture": "#2"}, @@ -83,6 +89,7 @@ { "from": [0.9, 5.5, 3.05], "to": [15.1, 10.5, 12.95], + "forge_data": {"calculate_normals": true}, "rotation": {"angle": 22.5, "axis": "z", "origin": [8, 8, 8]}, "faces": { "north": {"uv": [1, 7, 1.5, 7.5], "rotation": 90, "texture": "#2"}, @@ -94,6 +101,7 @@ { "from": [5.5, 0.9, 3.05], "to": [10.5, 15.1, 12.95], + "forge_data": {"calculate_normals": true}, "rotation": {"angle": -22.5, "axis": "z", "origin": [8, 8, 8]}, "faces": { "north": {"uv": [1, 7, 1.5, 7.5], "texture": "#2"}, diff --git a/src/main/resources/assets/create/models/block/packager/tray.json b/src/main/resources/assets/create/models/block/packager/tray.json index 8fe778bb0f..b259128f02 100644 --- a/src/main/resources/assets/create/models/block/packager/tray.json +++ b/src/main/resources/assets/create/models/block/packager/tray.json @@ -9,13 +9,20 @@ "from": [2, 2, 2], "to": [14, 4, 14], "rotation": {"angle": 0, "axis": "y", "origin": [2, 2, 2]}, + "faces": { + "up": {"uv": [1, 1, 7, 7], "texture": "#1"}, + "down": {"uv": [1, 1, 7, 7], "texture": "#1"} + } + }, + { + "from": [2.1, 2, 2.1], + "to": [13.9, 4, 13.9], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 2, 2]}, "faces": { "north": {"uv": [1, 6.5, 7, 7.5], "texture": "#1"}, "east": {"uv": [1, 6.5, 7, 7.5], "texture": "#1"}, "south": {"uv": [1, 6.5, 7, 7.5], "texture": "#1"}, - "west": {"uv": [1, 6.5, 7, 7.5], "texture": "#1"}, - "up": {"uv": [1, 1, 7, 7], "texture": "#1"}, - "down": {"uv": [1, 1, 7, 7], "texture": "#1"} + "west": {"uv": [1, 6.5, 7, 7.5], "texture": "#1"} } } ], @@ -24,7 +31,7 @@ "name": "sled", "origin": [8, 8, 8], "color": 0, - "children": [0] + "children": [0, 1] } ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/block/packager_details.png b/src/main/resources/assets/create/textures/block/packager_details.png index 5d5e57d20f542e79478a80b6e49a2131f2ee1d16..b53402af5ec4bc450635efb1873ca94a1e6ead26 100644 GIT binary patch delta 3396 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 literal 1728 zcmZ`(X;4#F6u$Q*ktC9^OoXsh0;1vu2~<%52?``Z2$7{?WQ$dhq8K#_2ooOCf(R&! zLlFiWB_b|tVHp+F03%vgiXu@gn>s|4MGJ*d68gaU!&dLio%5Y@zIX0<-`sQ41$+*L zY)S?IPL8TrPifF=^mlg`=ZmMn(o!FqI?sCMB(b7>JAgnG6(h0bdjv36+Oj56Ch{;w?T#Q`1dq2A z5HW`UOd(-b058ll`xj%H02_##jUyOlK?G1SE5vqG8h$pu6T>s>=|Kq8m~@}*7e@jt zk*x#p7>{Z1z=X0-HD?4T$UfD{#qi8Ru&T%`({Igc4E_5Ri^-hH8eF*;R7qWhHHLq~ zb9W1f3mqz+>tDj8dpsQ$Zk=~w{F-)p`igaMH@?|>OYZZ8){{j>lJ~`nqTHP?$kSC#pM>?zfTzFOg`s-uf7x5tRe1R~Vvl4~<@7JN4bW{-$~|zqv96}!Gfi0t=ax;MDVkj9i(si!xH`o zuWs0Wu9NNwKCnscb%Md9?acWSVW8? z6~6JFuGmasoA9l{Yj-5qkSVpD2ZP48h7PT=f|WS?hTUGuts~cRd{L9-#gQb!7==kz zn{fS54lBMVEiM?&|S$Zp0I z(b^KQo*r?P0wtZqUYi3BK?{plW}MpRZ1zi8rm1FlRDV|TuL+Tf&!iUU^fDWuFX!$v zMDgPEttnUA<7fvmtkXtPF6&`HmHskAbWDDJI?*%5T{+O%8EG=~=Ha5=i#FE}Ro-Y? zwFR%T+Xg#mxB2xExGoxV`qq`qC!h!|d_V`=5w)w1I*83l8Sp>uP=u;{kErLQTmJVl zeD2KbNw0|>Y%u)ujwbadLDgwJ)@-gVC=~b0(U>y-IcXy5oQkXii7%=73R&ZYq&&U#d(A0A+^Lb2iv-5{i0aRz?D`C(zl zU94qsM`@%sS~j5dwQdBS0TM1+isEHN$54cMM)$Hs&8x0D(c(cZeU-sztgAYBEiJ1(Ii6eyY5|9V8I>b8p7ybx_sCZ*XWo~4o~Z%yGw!eRFfs6;6tns z*L*(d+{#`PJtX|xN`^VksT}svRgn~%EB)`f-`33W-mOY6eu9d-i4#Ix`#O5_5qmKo zPC2*q3|Ky(I3;W8^##Z#OK9euT=uom-q~ic$;1kN@%t|ksZ Date: Tue, 24 Dec 2024 13:25:22 -0500 Subject: [PATCH 212/515] Moving down the street - Move transformable registry into its own folder --- .../ContraptionTransformableRegistry.java | 4 ++-- .../{ => transformable}/ITransformableBlock.java | 2 +- .../{ => transformable}/ITransformableBlockEntity.java | 2 +- .../create/content/contraptions/StructureTransform.java | 8 ++++---- .../contraptions/chassis/AbstractChassisBlock.java | 2 +- .../content/decoration/copycat/CopycatBlockEntity.java | 2 +- .../create/content/fluids/pipes/EncasedPipeBlock.java | 2 +- .../create/content/fluids/pipes/FluidPipeBlock.java | 2 +- .../create/content/fluids/pipes/FluidPipeBlockEntity.java | 2 +- .../kinetics/base/DirectionalAxisKineticBlock.java | 2 +- .../simibubi/create/content/kinetics/belt/BeltBlock.java | 2 +- .../content/kinetics/chainDrive/ChainDriveBlock.java | 2 +- .../content/kinetics/mechanicalArm/ArmBlockEntity.java | 2 +- .../simpleRelays/BracketedKineticBlockEntity.java | 2 +- .../simpleRelays/encased/EncasedCogwheelBlock.java | 2 +- .../transmission/sequencer/SequencedGearshiftBlock.java | 2 +- .../create/content/redstone/DirectedDirectionalBlock.java | 2 +- .../content/trains/observer/TrackObserverBlockEntity.java | 2 +- .../create/content/trains/signal/SignalBlockEntity.java | 2 +- .../create/content/trains/station/StationBlockEntity.java | 2 +- .../create/content/trains/track/TrackBlockEntity.java | 2 +- .../ContraptionTransformableRegistryImpl.java | 6 +++--- 22 files changed, 28 insertions(+), 28 deletions(-) rename src/main/java/com/simibubi/create/api/contraption/{ => transformable}/ContraptionTransformableRegistry.java (92%) rename src/main/java/com/simibubi/create/api/contraption/{ => transformable}/ITransformableBlock.java (80%) rename src/main/java/com/simibubi/create/api/contraption/{ => transformable}/ITransformableBlockEntity.java (73%) rename src/main/java/com/simibubi/create/impl/contraption/{ => transformable}/ContraptionTransformableRegistryImpl.java (81%) diff --git a/src/main/java/com/simibubi/create/api/contraption/ContraptionTransformableRegistry.java b/src/main/java/com/simibubi/create/api/contraption/transformable/ContraptionTransformableRegistry.java similarity index 92% rename from src/main/java/com/simibubi/create/api/contraption/ContraptionTransformableRegistry.java rename to src/main/java/com/simibubi/create/api/contraption/transformable/ContraptionTransformableRegistry.java index 8a4d97ff64..15456daa18 100644 --- a/src/main/java/com/simibubi/create/api/contraption/ContraptionTransformableRegistry.java +++ b/src/main/java/com/simibubi/create/api/contraption/transformable/ContraptionTransformableRegistry.java @@ -1,7 +1,7 @@ -package com.simibubi.create.api.contraption; +package com.simibubi.create.api.contraption.transformable; import com.simibubi.create.content.contraptions.StructureTransform; -import com.simibubi.create.impl.contraption.ContraptionTransformableRegistryImpl; +import com.simibubi.create.impl.contraption.transformable.ContraptionTransformableRegistryImpl; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; diff --git a/src/main/java/com/simibubi/create/api/contraption/ITransformableBlock.java b/src/main/java/com/simibubi/create/api/contraption/transformable/ITransformableBlock.java similarity index 80% rename from src/main/java/com/simibubi/create/api/contraption/ITransformableBlock.java rename to src/main/java/com/simibubi/create/api/contraption/transformable/ITransformableBlock.java index 6aefd0ab80..5bdcdf1b0a 100644 --- a/src/main/java/com/simibubi/create/api/contraption/ITransformableBlock.java +++ b/src/main/java/com/simibubi/create/api/contraption/transformable/ITransformableBlock.java @@ -1,4 +1,4 @@ -package com.simibubi.create.api.contraption; +package com.simibubi.create.api.contraption.transformable; import com.simibubi.create.content.contraptions.StructureTransform; diff --git a/src/main/java/com/simibubi/create/api/contraption/ITransformableBlockEntity.java b/src/main/java/com/simibubi/create/api/contraption/transformable/ITransformableBlockEntity.java similarity index 73% rename from src/main/java/com/simibubi/create/api/contraption/ITransformableBlockEntity.java rename to src/main/java/com/simibubi/create/api/contraption/transformable/ITransformableBlockEntity.java index e130f10b11..59ca6fadc8 100644 --- a/src/main/java/com/simibubi/create/api/contraption/ITransformableBlockEntity.java +++ b/src/main/java/com/simibubi/create/api/contraption/transformable/ITransformableBlockEntity.java @@ -1,4 +1,4 @@ -package com.simibubi.create.api.contraption; +package com.simibubi.create.api.contraption.transformable; import com.simibubi.create.content.contraptions.StructureTransform; diff --git a/src/main/java/com/simibubi/create/content/contraptions/StructureTransform.java b/src/main/java/com/simibubi/create/content/contraptions/StructureTransform.java index 50f6104fac..68b412b96f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/StructureTransform.java +++ b/src/main/java/com/simibubi/create/content/contraptions/StructureTransform.java @@ -4,11 +4,11 @@ import static net.minecraft.world.level.block.state.properties.BlockStatePropert import static net.minecraft.world.level.block.state.properties.BlockStateProperties.FACING; import static net.minecraft.world.level.block.state.properties.BlockStateProperties.HORIZONTAL_FACING; -import com.simibubi.create.api.contraption.ContraptionTransformableRegistry; -import com.simibubi.create.api.contraption.ITransformableBlock; -import com.simibubi.create.api.contraption.ITransformableBlockEntity; +import com.simibubi.create.api.contraption.transformable.ContraptionTransformableRegistry; +import com.simibubi.create.api.contraption.transformable.ITransformableBlock; +import com.simibubi.create.api.contraption.transformable.ITransformableBlockEntity; -import com.simibubi.create.impl.contraption.ContraptionTransformableRegistryImpl; +import com.simibubi.create.impl.contraption.transformable.ContraptionTransformableRegistryImpl; import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/simibubi/create/content/contraptions/chassis/AbstractChassisBlock.java b/src/main/java/com/simibubi/create/content/contraptions/chassis/AbstractChassisBlock.java index eee3278b0a..1cc4bb98fb 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/chassis/AbstractChassisBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/chassis/AbstractChassisBlock.java @@ -3,7 +3,7 @@ package com.simibubi.create.content.contraptions.chassis; import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllItems; import com.simibubi.create.AllSoundEvents; -import com.simibubi.create.api.contraption.ITransformableBlock; +import com.simibubi.create.api.contraption.transformable.ITransformableBlock; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.equipment.wrench.IWrenchable; import com.simibubi.create.foundation.block.IBE; diff --git a/src/main/java/com/simibubi/create/content/decoration/copycat/CopycatBlockEntity.java b/src/main/java/com/simibubi/create/content/decoration/copycat/CopycatBlockEntity.java index 9dcc53a88c..c8b956d03c 100644 --- a/src/main/java/com/simibubi/create/content/decoration/copycat/CopycatBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/decoration/copycat/CopycatBlockEntity.java @@ -1,7 +1,7 @@ package com.simibubi.create.content.decoration.copycat; import com.simibubi.create.AllBlocks; -import com.simibubi.create.api.contraption.ITransformableBlockEntity; +import com.simibubi.create.api.contraption.transformable.ITransformableBlockEntity; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.redstone.RoseQuartzLampBlock; import com.simibubi.create.api.schematic.requirement.ISpecialBlockEntityItemRequirement; diff --git a/src/main/java/com/simibubi/create/content/fluids/pipes/EncasedPipeBlock.java b/src/main/java/com/simibubi/create/content/fluids/pipes/EncasedPipeBlock.java index c6b0e3e763..77cbe367e6 100644 --- a/src/main/java/com/simibubi/create/content/fluids/pipes/EncasedPipeBlock.java +++ b/src/main/java/com/simibubi/create/content/fluids/pipes/EncasedPipeBlock.java @@ -12,7 +12,7 @@ import java.util.function.Supplier; import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllBlocks; -import com.simibubi.create.api.contraption.ITransformableBlock; +import com.simibubi.create.api.contraption.transformable.ITransformableBlock; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.decoration.encasing.EncasedBlock; import com.simibubi.create.content.equipment.wrench.IWrenchable; diff --git a/src/main/java/com/simibubi/create/content/fluids/pipes/FluidPipeBlock.java b/src/main/java/com/simibubi/create/content/fluids/pipes/FluidPipeBlock.java index 1a6fb055f5..634b8b234e 100644 --- a/src/main/java/com/simibubi/create/content/fluids/pipes/FluidPipeBlock.java +++ b/src/main/java/com/simibubi/create/content/fluids/pipes/FluidPipeBlock.java @@ -7,7 +7,7 @@ import javax.annotation.Nullable; import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllBlocks; -import com.simibubi.create.api.contraption.ITransformableBlock; +import com.simibubi.create.api.contraption.transformable.ITransformableBlock; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.decoration.bracket.BracketedBlockEntityBehaviour; import com.simibubi.create.content.decoration.encasing.EncasableBlock; diff --git a/src/main/java/com/simibubi/create/content/fluids/pipes/FluidPipeBlockEntity.java b/src/main/java/com/simibubi/create/content/fluids/pipes/FluidPipeBlockEntity.java index 4d4f79db11..f101643750 100644 --- a/src/main/java/com/simibubi/create/content/fluids/pipes/FluidPipeBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/fluids/pipes/FluidPipeBlockEntity.java @@ -2,7 +2,7 @@ package com.simibubi.create.content.fluids.pipes; import java.util.List; -import com.simibubi.create.api.contraption.ITransformableBlockEntity; +import com.simibubi.create.api.contraption.transformable.ITransformableBlockEntity; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.decoration.bracket.BracketedBlockEntityBehaviour; import com.simibubi.create.content.fluids.FluidPropagator; diff --git a/src/main/java/com/simibubi/create/content/kinetics/base/DirectionalAxisKineticBlock.java b/src/main/java/com/simibubi/create/content/kinetics/base/DirectionalAxisKineticBlock.java index 9494cb3288..2a6f020994 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/base/DirectionalAxisKineticBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/base/DirectionalAxisKineticBlock.java @@ -1,6 +1,6 @@ package com.simibubi.create.content.kinetics.base; -import com.simibubi.create.api.contraption.ITransformableBlock; +import com.simibubi.create.api.contraption.transformable.ITransformableBlock; import com.simibubi.create.content.contraptions.StructureTransform; import net.createmod.catnip.utility.Iterate; diff --git a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltBlock.java b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltBlock.java index 18fd91fe08..c3e99aedc9 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltBlock.java @@ -13,7 +13,7 @@ import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.Create; -import com.simibubi.create.api.contraption.ITransformableBlock; +import com.simibubi.create.api.contraption.transformable.ITransformableBlock; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.equipment.armor.DivingBootsItem; import com.simibubi.create.content.fluids.transfer.GenericItemEmptying; diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainDrive/ChainDriveBlock.java b/src/main/java/com/simibubi/create/content/kinetics/chainDrive/ChainDriveBlock.java index caeb94102b..75306091dd 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainDrive/ChainDriveBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainDrive/ChainDriveBlock.java @@ -1,7 +1,7 @@ package com.simibubi.create.content.kinetics.chainDrive; import com.simibubi.create.AllBlockEntityTypes; -import com.simibubi.create.api.contraption.ITransformableBlock; +import com.simibubi.create.api.contraption.transformable.ITransformableBlock; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.kinetics.base.DirectionalAxisKineticBlock; import com.simibubi.create.content.kinetics.base.KineticBlockEntity; diff --git a/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmBlockEntity.java index 0612fdf56d..41d0213d3e 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmBlockEntity.java @@ -6,7 +6,7 @@ import java.util.List; import javax.annotation.Nullable; import com.simibubi.create.Create; -import com.simibubi.create.api.contraption.ITransformableBlockEntity; +import com.simibubi.create.api.contraption.transformable.ITransformableBlockEntity; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.kinetics.base.KineticBlockEntity; import com.simibubi.create.content.kinetics.mechanicalArm.AllArmInteractionPointTypes.JukeboxPoint; diff --git a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/BracketedKineticBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/BracketedKineticBlockEntity.java index 31d285dfaa..1b452758bc 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/BracketedKineticBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/BracketedKineticBlockEntity.java @@ -2,7 +2,7 @@ package com.simibubi.create.content.kinetics.simpleRelays; import java.util.List; -import com.simibubi.create.api.contraption.ITransformableBlockEntity; +import com.simibubi.create.api.contraption.transformable.ITransformableBlockEntity; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.decoration.bracket.BracketedBlockEntityBehaviour; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; diff --git a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogwheelBlock.java b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogwheelBlock.java index e08d76a1dc..6275f53cef 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogwheelBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogwheelBlock.java @@ -4,7 +4,7 @@ import java.util.function.Supplier; import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllBlocks; -import com.simibubi.create.api.contraption.ITransformableBlock; +import com.simibubi.create.api.contraption.transformable.ITransformableBlock; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.decoration.encasing.EncasedBlock; import com.simibubi.create.content.equipment.wrench.IWrenchable; diff --git a/src/main/java/com/simibubi/create/content/kinetics/transmission/sequencer/SequencedGearshiftBlock.java b/src/main/java/com/simibubi/create/content/kinetics/transmission/sequencer/SequencedGearshiftBlock.java index 988e7ac285..7f037975fe 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/transmission/sequencer/SequencedGearshiftBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/transmission/sequencer/SequencedGearshiftBlock.java @@ -2,7 +2,7 @@ package com.simibubi.create.content.kinetics.transmission.sequencer; import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllItems; -import com.simibubi.create.api.contraption.ITransformableBlock; +import com.simibubi.create.api.contraption.transformable.ITransformableBlock; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.kinetics.base.HorizontalAxisKineticBlock; import com.simibubi.create.content.kinetics.base.KineticBlock; diff --git a/src/main/java/com/simibubi/create/content/redstone/DirectedDirectionalBlock.java b/src/main/java/com/simibubi/create/content/redstone/DirectedDirectionalBlock.java index 9e9ffab215..aa7a6ddf97 100644 --- a/src/main/java/com/simibubi/create/content/redstone/DirectedDirectionalBlock.java +++ b/src/main/java/com/simibubi/create/content/redstone/DirectedDirectionalBlock.java @@ -2,7 +2,7 @@ package com.simibubi.create.content.redstone; import javax.annotation.Nullable; -import com.simibubi.create.api.contraption.ITransformableBlock; +import com.simibubi.create.api.contraption.transformable.ITransformableBlock; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.equipment.wrench.IWrenchable; diff --git a/src/main/java/com/simibubi/create/content/trains/observer/TrackObserverBlockEntity.java b/src/main/java/com/simibubi/create/content/trains/observer/TrackObserverBlockEntity.java index 90cc8d9d5e..9fd1ff282d 100644 --- a/src/main/java/com/simibubi/create/content/trains/observer/TrackObserverBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/trains/observer/TrackObserverBlockEntity.java @@ -5,7 +5,7 @@ import java.util.List; import javax.annotation.Nullable; import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.api.contraption.ITransformableBlockEntity; +import com.simibubi.create.api.contraption.transformable.ITransformableBlockEntity; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.redstone.displayLink.DisplayLinkBlock; import com.simibubi.create.content.trains.graph.EdgePointType; diff --git a/src/main/java/com/simibubi/create/content/trains/signal/SignalBlockEntity.java b/src/main/java/com/simibubi/create/content/trains/signal/SignalBlockEntity.java index fb96e1b190..fede195d88 100644 --- a/src/main/java/com/simibubi/create/content/trains/signal/SignalBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/trains/signal/SignalBlockEntity.java @@ -4,7 +4,7 @@ import java.util.List; import javax.annotation.Nullable; -import com.simibubi.create.api.contraption.ITransformableBlockEntity; +import com.simibubi.create.api.contraption.transformable.ITransformableBlockEntity; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.trains.graph.EdgePointType; import com.simibubi.create.content.trains.signal.SignalBlock.SignalType; diff --git a/src/main/java/com/simibubi/create/content/trains/station/StationBlockEntity.java b/src/main/java/com/simibubi/create/content/trains/station/StationBlockEntity.java index 7f4f2a8a05..16185df4b5 100644 --- a/src/main/java/com/simibubi/create/content/trains/station/StationBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/trains/station/StationBlockEntity.java @@ -24,7 +24,7 @@ import com.simibubi.create.Create; import com.simibubi.create.compat.computercraft.AbstractComputerBehaviour; import com.simibubi.create.compat.computercraft.ComputerCraftProxy; import com.simibubi.create.content.contraptions.AssemblyException; -import com.simibubi.create.api.contraption.ITransformableBlockEntity; +import com.simibubi.create.api.contraption.transformable.ITransformableBlockEntity; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.decoration.slidingDoor.DoorControlBehaviour; import com.simibubi.create.content.equipment.wrench.IWrenchable; diff --git a/src/main/java/com/simibubi/create/content/trains/track/TrackBlockEntity.java b/src/main/java/com/simibubi/create/content/trains/track/TrackBlockEntity.java index 5207de5232..6d425a57e4 100644 --- a/src/main/java/com/simibubi/create/content/trains/track/TrackBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/trains/track/TrackBlockEntity.java @@ -11,7 +11,7 @@ import java.util.Set; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllPackets; import com.simibubi.create.AllTags; -import com.simibubi.create.api.contraption.ITransformableBlockEntity; +import com.simibubi.create.api.contraption.transformable.ITransformableBlockEntity; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.trains.graph.TrackNodeLocation; import com.simibubi.create.foundation.block.ProperWaterloggedBlock; diff --git a/src/main/java/com/simibubi/create/impl/contraption/ContraptionTransformableRegistryImpl.java b/src/main/java/com/simibubi/create/impl/contraption/transformable/ContraptionTransformableRegistryImpl.java similarity index 81% rename from src/main/java/com/simibubi/create/impl/contraption/ContraptionTransformableRegistryImpl.java rename to src/main/java/com/simibubi/create/impl/contraption/transformable/ContraptionTransformableRegistryImpl.java index 485aeb4c5e..f8878919d2 100644 --- a/src/main/java/com/simibubi/create/impl/contraption/ContraptionTransformableRegistryImpl.java +++ b/src/main/java/com/simibubi/create/impl/contraption/transformable/ContraptionTransformableRegistryImpl.java @@ -1,9 +1,9 @@ -package com.simibubi.create.impl.contraption; +package com.simibubi.create.impl.contraption.transformable; import org.jetbrains.annotations.ApiStatus; -import com.simibubi.create.api.contraption.ContraptionTransformableRegistry.TransformableBlock; -import com.simibubi.create.api.contraption.ContraptionTransformableRegistry.TransformableBlockEntity; +import com.simibubi.create.api.contraption.transformable.ContraptionTransformableRegistry.TransformableBlock; +import com.simibubi.create.api.contraption.transformable.ContraptionTransformableRegistry.TransformableBlockEntity; import com.simibubi.create.foundation.utility.AttachedRegistry; import net.minecraft.world.level.block.Block; From cb19df09c17e11db4cfd8e0ae823554f3f4d960b Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Tue, 24 Dec 2024 15:46:04 -0800 Subject: [PATCH 213/515] Sound engine running full steam - Play at most 4 steam engine sounds at once per side of a boiler - 3 seems to be too few for this case as there's still a perceptible difference between 3 and 4 sounds per side - Track which positions want to play the sound in any given rolling window of ticks, and roll dice to decide which positions actually get to play - Introduce SoundPool to track that and explain the perception stuffs --- .../content/fluids/tank/BoilerData.java | 28 +++++ .../create/content/fluids/tank/SoundPool.java | 101 ++++++++++++++++++ .../steamEngine/SteamEngineBlockEntity.java | 9 +- 3 files changed, 130 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/fluids/tank/SoundPool.java diff --git a/src/main/java/com/simibubi/create/content/fluids/tank/BoilerData.java b/src/main/java/com/simibubi/create/content/fluids/tank/BoilerData.java index 3b519895d5..43c380b5ea 100644 --- a/src/main/java/com/simibubi/create/content/fluids/tank/BoilerData.java +++ b/src/main/java/com/simibubi/create/content/fluids/tank/BoilerData.java @@ -1,6 +1,7 @@ package com.simibubi.create.content.fluids.tank; import java.util.Arrays; +import java.util.EnumMap; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -8,6 +9,7 @@ import java.util.Set; import org.jetbrains.annotations.NotNull; import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllSoundEvents; import com.simibubi.create.Create; import com.simibubi.create.content.decoration.steamWhistle.WhistleBlock; import com.simibubi.create.content.decoration.steamWhistle.WhistleBlockEntity; @@ -29,6 +31,8 @@ import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; import net.minecraft.util.Mth; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; @@ -65,10 +69,25 @@ public class BoilerData { public LerpedFloat gauge = LerpedFloat.linear(); + // client only sound control + + // re-use the same lambda for each side + private final SoundPool.Sound sound = (level, pos) -> { + float volume = 3f / Math.max(2, attachedEngines / 6); + float pitch = 1.18f - level.random.nextFloat() * .25f; + level.playLocalSound(pos.getX(), pos.getY(), pos.getZ(), + SoundEvents.CANDLE_EXTINGUISH, SoundSource.BLOCKS, volume, pitch, false); + + AllSoundEvents.STEAM.playAt(level, pos, volume / 16, .8f, false); + }; + // separate pools for each side so they sound distinct when standing at corners of the boiler + private final EnumMap pools = new EnumMap<>(Direction.class); + public void tick(FluidTankBlockEntity controller) { if (!isActive()) return; if (controller.getLevel().isClientSide) { + pools.values().forEach(p -> p.play(controller.getLevel())); gauge.tickChaser(); float current = gauge.getValue(1); if (current > 1 && Create.RANDOM.nextFloat() < 1 / 2f) @@ -105,6 +124,15 @@ public class BoilerData { controller.notifyUpdate(); } + public void queueSoundOnSide(BlockPos pos, Direction side) { + SoundPool pool = pools.get(side); + if (pool == null) { + pool = new SoundPool(4, 2, sound); + pools.put(side, pool); + } + pool.queueAt(pos); + } + public int getTheoreticalHeatLevel() { return activeHeat; } diff --git a/src/main/java/com/simibubi/create/content/fluids/tank/SoundPool.java b/src/main/java/com/simibubi/create/content/fluids/tank/SoundPool.java new file mode 100644 index 0000000000..1a37870d36 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/fluids/tank/SoundPool.java @@ -0,0 +1,101 @@ +package com.simibubi.create.content.fluids.tank; + +import it.unimi.dsi.fastutil.longs.LongArrayList; +import it.unimi.dsi.fastutil.longs.LongList; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Vec3i; +import net.minecraft.world.level.Level; + +/** + * One person walking sounds like one person walking, and you can easily distinguish where they are. + * + *
With two people walking, you can still pick out which footsteps belong to which person. + * + *
Try and listen to three people walking in a group, however, and you'll find that you can't distinguish + * individual footsteps anymore. You now just hear the sound of a group of people walking. + * + *

You'll likely find that you perceive any number of people walking in a group as a single distinguishable sound. + * This class is a helper to take advantage of that for sound effects in Create to avoid saturating the sound engine + * without a perceptible loss in quality. + * + *

NOTE: It's up to the user of this class to decide how to group sounds such that they are perceived as a single + * sound. There are no spatial calculations made here. + */ +public class SoundPool { + /** + * The maximum number of sounds that can be played at once. + */ + private final int maxConcurrent; + /** + * The number of ticks to wait before playing sounds. Useful if sounds are queued across many block entities, + * and you don't have control over the tick order. + */ + private final int mergeTicks; + + private final Sound sound; + + private final LongList queuedPositions = new LongArrayList(); + + private final BlockPos.MutableBlockPos pos = new BlockPos.MutableBlockPos(); + + private int ticks = 0; + + public SoundPool(int maxConcurrent, int mergeTicks, Sound sound) { + this.maxConcurrent = maxConcurrent; + this.sound = sound; + this.mergeTicks = mergeTicks; + } + + public void queueAt(BlockPos pos) { + queueAt(pos.asLong()); + } + + public void queueAt(long pos) { + queuedPositions.add(pos); + } + + public void play(Level level) { + if (queuedPositions.isEmpty()) { + return; + } + + ticks++; + + if (ticks < mergeTicks) { + // Wait for more sounds to be queued in further ticks. + return; + } + + ticks = 0; + + var numberOfPositions = queuedPositions.size(); + + if (numberOfPositions <= maxConcurrent) { + // Fewer sound positions than maxConcurrent, play them all. + for (long pos : queuedPositions) { + playAt(level, pos); + } + } else { + // Roll for n random positions and play there. + while (!queuedPositions.isEmpty() && queuedPositions.size() > numberOfPositions - maxConcurrent) { + rollNextPosition(level); + } + } + + queuedPositions.clear(); + } + + private void rollNextPosition(Level level) { + int index = level.random.nextInt(queuedPositions.size()); + long pos = queuedPositions.removeLong(index); + playAt(level, pos); + } + + private void playAt(Level level, long pos) { + sound.playAt(level, this.pos.set(pos)); + } + + public interface Sound { + void playAt(Level level, Vec3i pos); + } +} diff --git a/src/main/java/com/simibubi/create/content/kinetics/steamEngine/SteamEngineBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/steamEngine/SteamEngineBlockEntity.java index 3aad3489e4..af1828d722 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/steamEngine/SteamEngineBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/steamEngine/SteamEngineBlockEntity.java @@ -6,7 +6,6 @@ import java.util.List; import javax.annotation.Nullable; import com.simibubi.create.AllBlocks; -import com.simibubi.create.AllSoundEvents; import com.simibubi.create.content.contraptions.bearing.WindmillBearingBlockEntity.RotationDirection; import com.simibubi.create.content.equipment.goggles.IHaveGoggleInformation; import com.simibubi.create.content.fluids.tank.FluidTankBlockEntity; @@ -26,8 +25,6 @@ import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; import net.minecraft.core.Direction.AxisDirection; import net.minecraft.network.chat.Component; -import net.minecraft.sounds.SoundEvents; -import net.minecraft.sounds.SoundSource; import net.minecraft.util.Mth; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; @@ -208,11 +205,7 @@ public class SteamEngineBlockEntity extends SmartBlockEntity implements IHaveGog if (sourceBE != null) { FluidTankBlockEntity controller = sourceBE.getControllerBE(); if (controller != null && controller.boiler != null) { - float volume = 3f / Math.max(2, controller.boiler.attachedEngines / 6); - float pitch = 1.18f - level.random.nextFloat() * .25f; - level.playLocalSound(worldPosition.getX(), worldPosition.getY(), worldPosition.getZ(), - SoundEvents.CANDLE_EXTINGUISH, SoundSource.BLOCKS, volume, pitch, false); - AllSoundEvents.STEAM.playAt(level, worldPosition, volume / 16, .8f, false); + controller.boiler.queueSoundOnSide(worldPosition, SteamEngineBlock.getFacing(getBlockState())); } } From 498e4a68dcb1d549264f0df6520e6f53915b7a73 Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Tue, 24 Dec 2024 15:47:11 -0800 Subject: [PATCH 214/515] Nullable or gullible? - Fix NPE disassembling contraption - No idea how this hasn't been encountered before --- .../com/simibubi/create/content/contraptions/Contraption.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/Contraption.java b/src/main/java/com/simibubi/create/content/contraptions/Contraption.java index eba9c17470..fae00e8c94 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/Contraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/Contraption.java @@ -1151,7 +1151,9 @@ public abstract class Contraption { storage.addStorageToWorld(block, blockEntity); } - transform.apply(blockEntity); + if (blockEntity != null) { + transform.apply(blockEntity); + } } } From 8036d5cdc31bdc91502e3150fde95ea9730e5a86 Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Tue, 24 Dec 2024 22:45:07 -0800 Subject: [PATCH 215/515] The wheel churns - Bump flywheel and catnip builds - Fix compile errors caused by upstream refactors - Unintentionally fixes some lighting issues when the forge pipeline is enabled --- gradle.properties | 4 ++-- .../content/contraptions/render/ContraptionRenderInfo.java | 4 ++-- .../content/kinetics/waterwheel/WaterWheelVisual.java | 4 ++-- .../create/content/schematics/client/SchematicRenderer.java | 4 ++-- .../create/foundation/render/ShaderLightPartial.java | 6 +++--- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/gradle.properties b/gradle.properties index 260686f4f2..0544449d67 100644 --- a/gradle.properties +++ b/gradle.properties @@ -23,12 +23,12 @@ use_parchment = true # dependency versions registrate_version = MC1.20-1.3.3 flywheel_minecraft_version = 1.20.1 -flywheel_version = 1.0.0-beta-171 +flywheel_version = 1.0.0-beta-175 jei_minecraft_version = 1.20.1 jei_version = 15.10.0.39 curios_minecraft_version = 1.20.1 curios_version = 5.3.1 -catnip_version = 0.8.37 +catnip_version = 0.8.38 ponder_version = 0.8.12 mixin_extras_version = 0.4.1 diff --git a/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionRenderInfo.java b/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionRenderInfo.java index 86dc1c41a7..d6f2d45835 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionRenderInfo.java +++ b/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionRenderInfo.java @@ -9,10 +9,10 @@ import com.simibubi.create.content.contraptions.ContraptionWorld; import com.simibubi.create.foundation.virtualWorld.VirtualRenderWorld; import dev.engine_room.flywheel.api.visualization.VisualizationManager; -import dev.engine_room.flywheel.lib.model.ModelUtil; import net.createmod.catnip.render.ShadedBlockSbbBuilder; import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.render.SuperByteBufferCache; +import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.BlockRenderDispatcher; import net.minecraft.client.renderer.block.ModelBlockRenderer; @@ -102,7 +102,7 @@ public class ContraptionRenderInfo { } private SuperByteBuffer buildStructureBuffer(RenderType layer) { - BlockRenderDispatcher dispatcher = ModelUtil.VANILLA_RENDERER; + BlockRenderDispatcher dispatcher = Minecraft.getInstance().getBlockRenderer(); ModelBlockRenderer renderer = dispatcher.getModelRenderer(); ThreadLocalObjects objects = THREAD_LOCAL_OBJECTS.get(); diff --git a/src/main/java/com/simibubi/create/content/kinetics/waterwheel/WaterWheelVisual.java b/src/main/java/com/simibubi/create/content/kinetics/waterwheel/WaterWheelVisual.java index 4d7ea8f148..f89364570e 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/waterwheel/WaterWheelVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/waterwheel/WaterWheelVisual.java @@ -11,7 +11,7 @@ import dev.engine_room.flywheel.api.instance.Instance; import dev.engine_room.flywheel.api.model.Model; import dev.engine_room.flywheel.api.visualization.VisualizationContext; import dev.engine_room.flywheel.lib.model.baked.BakedModelBuilder; -import dev.engine_room.flywheel.lib.util.ResourceReloadCache; +import dev.engine_room.flywheel.lib.util.RendererReloadCache; import net.createmod.catnip.render.CachedBuffers; import net.minecraft.client.resources.model.BakedModel; import net.minecraft.core.Direction; @@ -19,7 +19,7 @@ import net.minecraft.core.Direction.AxisDirection; import net.minecraft.world.level.block.state.BlockState; public class WaterWheelVisual extends KineticBlockEntityVisual { - private static final ResourceReloadCache MODEL_CACHE = new ResourceReloadCache<>(WaterWheelVisual::createModel); + private static final RendererReloadCache MODEL_CACHE = new RendererReloadCache<>(WaterWheelVisual::createModel); protected final boolean large; protected BlockState lastMaterial; diff --git a/src/main/java/com/simibubi/create/content/schematics/client/SchematicRenderer.java b/src/main/java/com/simibubi/create/content/schematics/client/SchematicRenderer.java index 6a89d61acc..072885a5b9 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/SchematicRenderer.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/SchematicRenderer.java @@ -6,7 +6,6 @@ import java.util.Map; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.foundation.render.BlockEntityRenderHelper; -import dev.engine_room.flywheel.lib.model.ModelUtil; import net.createmod.catnip.render.ShadedBlockSbbBuilder; import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.render.SuperRenderTypeBuffer; @@ -85,7 +84,8 @@ public class SchematicRenderer { } protected SuperByteBuffer drawLayer(RenderType layer) { - BlockRenderDispatcher dispatcher = ModelUtil.VANILLA_RENDERER; + BlockRenderDispatcher dispatcher = Minecraft.getInstance() + .getBlockRenderer(); ModelBlockRenderer renderer = dispatcher.getModelRenderer(); ThreadLocalObjects objects = THREAD_LOCAL_OBJECTS.get(); diff --git a/src/main/java/com/simibubi/create/foundation/render/ShaderLightPartial.java b/src/main/java/com/simibubi/create/foundation/render/ShaderLightPartial.java index c7013b9794..c71e136447 100644 --- a/src/main/java/com/simibubi/create/foundation/render/ShaderLightPartial.java +++ b/src/main/java/com/simibubi/create/foundation/render/ShaderLightPartial.java @@ -9,15 +9,15 @@ import dev.engine_room.flywheel.lib.material.SimpleMaterial; import dev.engine_room.flywheel.lib.model.ModelUtil; import dev.engine_room.flywheel.lib.model.baked.BakedModelBuilder; import dev.engine_room.flywheel.lib.model.baked.PartialModel; -import dev.engine_room.flywheel.lib.util.ResourceReloadCache; +import dev.engine_room.flywheel.lib.util.RendererReloadCache; import net.minecraft.client.renderer.RenderType; public class ShaderLightPartial { - private static final ResourceReloadCache FLAT = new ResourceReloadCache<>(it -> BakedModelBuilder.create(it.get()) + private static final RendererReloadCache FLAT = new RendererReloadCache<>(it -> BakedModelBuilder.create(it.get()) .materialFunc((renderType, aBoolean) -> getMaterial(renderType, aBoolean, LightShaders.FLAT)) .build()); - private static final ResourceReloadCache SMOOTH = new ResourceReloadCache<>(it -> BakedModelBuilder.create(it.get()) + private static final RendererReloadCache SMOOTH = new RendererReloadCache<>(it -> BakedModelBuilder.create(it.get()) .materialFunc((renderType, aBoolean) -> getMaterial(renderType, aBoolean, LightShaders.SMOOTH)) .build()); From c71f414f5b55558a21d71c645e1ac683e7281a89 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Thu, 26 Dec 2024 22:13:35 -0500 Subject: [PATCH 216/515] Zipped up - Verify that schematics are GZIP-encoded by checking the first two bytes for the magic number (0x1F, 0x8B) - Fixes Create-6087 --- .../resources/assets/create/lang/en_ud.json | 1 + .../resources/assets/create/lang/en_us.json | 1 + .../content/schematics/SchematicItem.java | 5 ++-- .../schematics/ServerSchematicLoader.java | 3 +- .../client/ClientSchematicLoader.java | 29 +++++++++++++++++++ .../assets/create/lang/default/interface.json | 1 + 6 files changed, 36 insertions(+), 4 deletions(-) diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 6875a65c37..ea2e23a18b 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -2669,6 +2669,7 @@ "create.schematics.maxAllowedSize": ":sı ǝzıs ǝןıɟ ɔıʇɐɯǝɥɔs pǝʍoןןɐ ɯnɯıxɐɯ ǝɥ⟘", "create.schematics.synchronizing": "˙˙˙buıɔuʎS", "create.schematics.uploadTooLarge": "˙ɹǝʌɹǝs ǝɥʇ ʎq pǝıɟıɔǝds suoıʇɐʇıɯıן spǝǝɔxǝ ɔıʇɐɯǝɥɔs ɹnoʎ", + "create.schematics.wrongFormat": "˙ʇɐɯɹoɟ ǝןqıʇɐdɯoɔ ԀIZ⅁ ɥʇıʍ pǝpoɔuǝ ǝq pןnoɥs ʇI ¡ʎןbuoɹʍ pǝpoɔuǝ ɹo ʇdnɹɹoɔ ɹǝɥʇıǝ sı pɐoןdn oʇ buıʎɹʇ ǝɹɐ noʎ ɔıʇɐɯǝɥɔs ǝɥ⟘", "create.station.assemble_train": "uıɐɹ⟘ ǝןqɯǝssⱯ", "create.station.assembly_title": "ʎןqɯǝssⱯ uıɐɹ⟘", "create.station.cancel": "ʎןqɯǝssⱯ ןǝɔuɐƆ", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 17c448a1ef..f7e3147b34 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -2669,6 +2669,7 @@ "create.schematics.maxAllowedSize": "The maximum allowed schematic file size is:", "create.schematics.synchronizing": "Syncing...", "create.schematics.uploadTooLarge": "Your schematic exceeds limitations specified by the server.", + "create.schematics.wrongFormat": "The schematic you are trying to upload is either corrupt or encoded wrongly! It should be encoded with GZIP compatible format.", "create.station.assemble_train": "Assemble Train", "create.station.assembly_title": "Train Assembly", "create.station.cancel": "Cancel Assembly", diff --git a/src/main/java/com/simibubi/create/content/schematics/SchematicItem.java b/src/main/java/com/simibubi/create/content/schematics/SchematicItem.java index 1ec370d356..1da29ad96e 100644 --- a/src/main/java/com/simibubi/create/content/schematics/SchematicItem.java +++ b/src/main/java/com/simibubi/create/content/schematics/SchematicItem.java @@ -12,6 +12,8 @@ import java.util.zip.GZIPInputStream; import javax.annotation.Nonnull; +import net.createmod.catnip.platform.CatnipServices; + import org.slf4j.Logger; import com.mojang.logging.LogUtils; @@ -47,7 +49,6 @@ import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemp import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fml.DistExecutor; -import net.minecraftforge.fml.util.thread.SidedThreadGroups; public class SchematicItem extends Item { @@ -122,7 +123,7 @@ public class SchematicItem extends Item { Path dir; Path file; - if (Thread.currentThread().getThreadGroup() == SidedThreadGroups.SERVER) { + if (CatnipServices.PLATFORM.getEnv().isServer()) { dir = Paths.get("schematics", "uploaded").toAbsolutePath(); file = Paths.get(owner, schematic); } else { diff --git a/src/main/java/com/simibubi/create/content/schematics/ServerSchematicLoader.java b/src/main/java/com/simibubi/create/content/schematics/ServerSchematicLoader.java index 1a2bc4d45e..c41dbe76c3 100644 --- a/src/main/java/com/simibubi/create/content/schematics/ServerSchematicLoader.java +++ b/src/main/java/com/simibubi/create/content/schematics/ServerSchematicLoader.java @@ -242,9 +242,8 @@ public class ServerSchematicLoader { public SchematicTableBlockEntity getTable(Level world, BlockPos pos) { BlockEntity be = world.getBlockEntity(pos); - if (!(be instanceof SchematicTableBlockEntity)) + if (!(be instanceof SchematicTableBlockEntity table)) return null; - SchematicTableBlockEntity table = (SchematicTableBlockEntity) be; return table; } diff --git a/src/main/java/com/simibubi/create/content/schematics/client/ClientSchematicLoader.java b/src/main/java/com/simibubi/create/content/schematics/client/ClientSchematicLoader.java index 841e2c5bc2..50c4b38589 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/ClientSchematicLoader.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/ClientSchematicLoader.java @@ -1,5 +1,7 @@ package com.simibubi.create.content.schematics.client; +import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; @@ -71,6 +73,14 @@ public class ClientSchematicLoader { if (!validateSizeLimitation(size)) return; + // Validate if the file is encoded in a GZIP compatible format + if (!isGZIPEncoded(path.toFile())) { + LocalPlayer player = Minecraft.getInstance().player; + if (player != null) + player.displayClientMessage(CreateLang.translateDirect("schematics.wrongFormat"), false); + return; + } + in = Files.newInputStream(path, StandardOpenOption.READ); activeUploads.put(schematic, in); AllPackets.getChannel().sendToServer(SchematicUploadPacket.begin(schematic, size)); @@ -94,6 +104,25 @@ public class ClientSchematicLoader { return true; } + /** + * Checks if a given file is GZIP-encoded by checking its header, + * of which the first two bytes should contain the magic number (0x1F, 0x8B) + */ + public static boolean isGZIPEncoded(File file) { + try (FileInputStream fis = new FileInputStream(file)) { + byte[] bytes = new byte[2]; + if (fis.read(bytes) != 2) + return false; + + int byte1 = bytes[0] & 0xFF; + int byte2 = bytes[1] & 0xFF; + + return byte1 == 0x1F && byte2 == 0x8B; + } catch (IOException exception) { + return false; + } + } + private void continueUpload(String schematic) { if (activeUploads.containsKey(schematic)) { Integer maxPacketSize = AllConfigs.server().schematics.maxSchematicPacketSize.get(); diff --git a/src/main/resources/assets/create/lang/default/interface.json b/src/main/resources/assets/create/lang/default/interface.json index 0598c9dce6..7e5f592a26 100644 --- a/src/main/resources/assets/create/lang/default/interface.json +++ b/src/main/resources/assets/create/lang/default/interface.json @@ -454,6 +454,7 @@ "create.schematics.synchronizing": "Syncing...", "create.schematics.uploadTooLarge": "Your schematic exceeds limitations specified by the server.", "create.schematics.maxAllowedSize": "The maximum allowed schematic file size is:", + "create.schematics.wrongFormat": "The schematic you are trying to upload is either corrupt or encoded wrongly! It should be encoded with GZIP compatible format.", "create.gui.schematicTable.refresh": "Refresh Files", "create.gui.schematicTable.open_folder": "Open Folder", From 00e56fad20782d9940ea34ba82c7104ccef9f4f1 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 27 Dec 2024 17:30:00 +0100 Subject: [PATCH 217/515] Friends with the polish - Stealthing as a box no longer shows rare package models - Added jinx's rare box texture - Fixed frogport able to connect to train stations - Fixed non-schematic clipboards triggering material checklist requests - Fixed destination suggestions in factory gauge screen - Factory gauge now shows a hint when inputs are configured but no target amount - Couple of ui tweaks --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 9 +++--- .../resources/assets/create/lang/en_ud.json | 12 +++----- .../resources/assets/create/lang/en_us.json | 12 +++----- .../create/models/item/rare_jinx_package.json | 6 ++++ .../data/create/tags/items/packages.json | 1 + .../java/com/simibubi/create/AllItems.java | 19 ++++++++++-- .../com/simibubi/create/AllPartialModels.java | 5 ++-- .../armor/CardboardArmorHandlerClient.java | 4 +-- .../content/logistics/box/PackageItem.java | 6 ++++ .../content/logistics/box/PackageStyles.java | 7 +++-- .../factoryBoard/FactoryPanelBehaviour.java | 5 ++++ .../factoryBoard/FactoryPanelScreen.java | 26 +++++++++------- .../PackagePortPlacementPacket.java | 4 ++- .../packagePort/PackagePortTarget.java | 13 ++++++++ .../RedstoneRequesterMenu.java | 8 ++--- .../RedstoneRequesterScreen.java | 16 +++++----- .../stockTicker/StockKeeperRequestScreen.java | 28 +++++++++++------- .../create/foundation/gui/AllGuiTextures.java | 11 ++++--- .../assets/create/lang/default/interface.json | 3 +- .../create/textures/gui/factory_gauge.png | Bin 2461 -> 2576 bytes .../assets/create/textures/gui/requester.png | Bin 0 -> 1858 bytes .../textures/gui/restocker_and_requester.png | Bin 2036 -> 0 bytes .../create/textures/gui/stock_keeper.png | Bin 3492 -> 3598 bytes .../textures/item/package/rare_jinx.png | Bin 0 -> 872 bytes 24 files changed, 125 insertions(+), 70 deletions(-) create mode 100644 src/generated/resources/assets/create/models/item/rare_jinx_package.json create mode 100644 src/main/resources/assets/create/textures/gui/requester.png delete mode 100644 src/main/resources/assets/create/textures/gui/restocker_and_requester.png create mode 100644 src/main/resources/assets/create/textures/item/package/rare_jinx.png diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index f4a2e1332c..2ccbc401bd 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-12-19T12:55:10.6405074 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-12-27T16:20:32.5134051 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -642,8 +642,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -1bd5d472e6cdb275bd026df08bf6d84be741f937 assets/create/lang/en_ud.json -281d7171755d22ebdd6748fa1c927a6fe87fc78b assets/create/lang/en_us.json +49aa0b1ee7abaa4bc8f314044da6952c9e503372 assets/create/lang/en_ud.json +c425530ef04826a17b96f335ef4bbef66994c45b assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -2329,6 +2329,7 @@ ebffb05119f499fcec051a4337aadc47654baed2 assets/create/models/item/purple_valve_ f91405b9aec1e0142c1b90582e03a1973251da05 assets/create/models/item/radial_chassis.json 1c984ea9dbaec02e88dba1b81906c9acca7ed672 assets/create/models/item/railway_casing.json 87c4c0e13441cf0238103ca065c0c16f80f60f26 assets/create/models/item/rare_creeper_package.json +f982794c2e01a70fcc2bb009bcb8cd06a2ea5510 assets/create/models/item/rare_jinx_package.json 9f4de06da4d9c2b54b758b2b01e0595811338b94 assets/create/models/item/rare_kryppers_package.json 7830b48ef4292922f0ef13f9a7c2ee7d47366169 assets/create/models/item/rare_simi_package.json 5f8e5283fbebb452f1a1141b33ee73f08879c75d assets/create/models/item/raw_zinc.json @@ -4670,7 +4671,7 @@ d371dfd35e49a7bef19f59c03e7f4ae20992f03d data/create/tags/items/create_ingots.js ebd7b09daf2f64c0c04d821696b0e145683d8693 data/create/tags/items/dyed_table_cloths.json 1cebeb92bd514b75d54ac6d5708047801f0501c5 data/create/tags/items/modded_stripped_logs.json 586f8fc5a8b8559c9dc0017e13c78ad918688fae data/create/tags/items/modded_stripped_wood.json -bd0be367b9610c8b2df8403b1a20da9dfc264aaa data/create/tags/items/packages.json +b96668734c9b7a90348235217512d49193e4ea7f data/create/tags/items/packages.json f400870b8dbcd14238be3ec99c419093073ba3a6 data/create/tags/items/postboxes.json 695d75b352fd190b303c724d1aaee9bb786a903b data/create/tags/items/pressurized_air_sources.json 22c4d4e033a61942b170aa309ed46a89a0ba0c65 data/create/tags/items/pulpifiable.json diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index ea2e23a18b..876719276d 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -1197,7 +1197,7 @@ "create.gui.contraptions.network_overstressed": "˙‾ʇɔɐdɯı‾ ‾ssǝɹʇs‾ ɥbıɥ ɐ ɥʇıʍ sʇuǝuodɯoɔ ǝɥʇ ‾uʍop‾ ‾ʍoןs‾ ɹo sǝɔɹnos ǝɹoɯ ppⱯ ˙‾pǝssǝɹʇsɹǝʌo‾ sı uoıʇdɐɹʇuoɔ sıɥʇ ʇɐɥʇ sɹɐǝddɐ ʇI", "create.gui.contraptions.not_fast_enough": "˙‾pǝǝds‾ ‾ɥbnouǝ‾ ɥʇıʍ buıʇɐʇoɹ ‾ʇou‾ sı %1$s sıɥʇ ʇɐɥʇ sɹɐǝddɐ ʇI", "create.gui.factory_panel.activate_crafting": "buıʇɟɐɹƆ ןɐɔıuɐɥɔǝW ǝs∩", - "create.gui.factory_panel.address_missing": "ssǝɹppɐ ʇǝbɹɐʇ ɐ buıssıW", + "create.gui.factory_panel.address_missing": "ssǝɹppɐ ʇǝbɹɐʇ ɐ buıssıɯ :ǝʌıʇɔɐuI", "create.gui.factory_panel.connect_input": "uoıʇɔǝuuoɔ ʍǝu ppⱯ", "create.gui.factory_panel.crafting_input": "sʇuǝıpǝɹbuI pǝbɐʞɔɐԀ", "create.gui.factory_panel.crafting_input_tip": "pǝʇɔǝuuoɔ oʇuı ǝbɐʞɔɐdu∩", @@ -1212,6 +1212,7 @@ "create.gui.factory_panel.left_click_disconnect": "ʇɔǝuuoɔsıp oʇ ʞɔıןƆ-ʇɟǝꞀ", "create.gui.factory_panel.left_click_reset": "ʇǝsǝɹ oʇ ʞɔıןƆ-ʇɟǝꞀ", "create.gui.factory_panel.no_open_promises": "sǝsıɯoɹd uǝdo oN", + "create.gui.factory_panel.no_target_amount_set": "ʇǝs ʇunoɯɐ ʇǝbɹɐʇ ou :ǝʌıʇɔɐuI", "create.gui.factory_panel.promise_prevents_oversending": "˙buıpuǝs-ɹǝʌo sʇuǝʌǝɹd sıɥ⟘", "create.gui.factory_panel.promised_items": "sɯǝʇı pǝsıɯoɹԀ", "create.gui.factory_panel.promises_do_not_expire": "ǝɹıdxǝ ʇou op sǝsıɯoɹԀ", @@ -2973,10 +2974,6 @@ "item.create.cardboard_chestplate": "ǝʇɐןdʇsǝɥƆ pɹɐoqpɹɐƆ", "item.create.cardboard_helmet": "ʇǝɯןǝH pɹɐoqpɹɐƆ", "item.create.cardboard_leggings": "sbuıbbǝꞀ pɹɐoqpɹɐƆ", - "item.create.cardboard_package_10x12": "ǝbɐʞɔɐԀ pɹɐoqpɹɐƆ", - "item.create.cardboard_package_10x8": "ǝbɐʞɔɐԀ pɹɐoqpɹɐƆ", - "item.create.cardboard_package_12x10": "ǝbɐʞɔɐԀ pɹɐoqpɹɐƆ", - "item.create.cardboard_package_12x12": "ǝbɐʞɔɐԀ pɹɐoqpɹɐƆ", "item.create.cardboard_sword": "pɹoʍS pɹɐoqpɹɐƆ", "item.create.cardboard_sword.tooltip.summary": "˙ǝɔıoɥɔ ɟo uodɐǝʍ ןnɟɹǝʍod ʇǝʎ '‾ssǝןɯɹɐɥ‾ ‾ʎןʇsoɯ‾ Ɐ ˙ʞuoᗺ", "item.create.chest_minecart_contraption": "uoıʇdɐɹʇuoƆ ʇɹɐɔǝuıW ʇsǝɥƆ", @@ -3091,6 +3088,7 @@ "item.create.netherite_diving_helmet.tooltip.behaviour1": "ɐʌɐꞀ uı ‾uoısıʌ pǝʌoɹdɯı‾ sʇuɐɹb osןⱯ ˙ʞuɐʇʞɔɐᗺ ǝɥʇ ɯoɹɟ ‾ǝɹnssǝɹԀ ɹıⱯ‾ buıuıɐɹp ʎןʍoןs '‾ɐʌɐꞀ‾ puɐ ‾ǝɹıℲ‾ oʇ ʎʇıunɯɯı sǝpıʌoɹԀ", "item.create.netherite_diving_helmet.tooltip.condition1": ")ʇǝs ןןnℲ( uɹoM uǝɥM", "item.create.netherite_diving_helmet.tooltip.summary": "˙ooʇ '‾ǝʇıɹǝɥʇǝN‾ uı pǝɹǝʌoɔ ǝq oʇ ǝʌɐɥ ‾ʇǝǝℲ puɐ sbǝꞀ‾ 'ǝʌıʇɔǝɟɟǝ ǝq o⟘ ˙‾ʇɐǝɥ ǝɯǝɹʇxǝ‾ ɯoɹɟ noʎ ʇɔǝʇoɹd uɐɔ sıɥʇ '‾ʞuɐʇʞɔɐᗺ ǝʇıɹǝɥʇǝN‾ ɐ ɥʇıʍ ɹǝɥʇǝbo⟘", + "item.create.package": "ǝbɐʞɔɐԀ pɹɐoqpɹɐƆ", "item.create.package_filter": "ɹǝʇןıℲ ǝbɐʞɔɐԀ", "item.create.package_filter.tooltip.behaviour1": "˙‾ǝɔɐɟɹǝʇuı uoıʇɐɹnbıɟuoɔ‾ ǝɥʇ suǝdO", "item.create.package_filter.tooltip.condition1": "pǝʞɔıןƆ-ᴚ uǝɥM", @@ -3106,9 +3104,7 @@ "item.create.precision_mechanism": "ɯsıuɐɥɔǝW uoısıɔǝɹԀ", "item.create.propeller": "ɹǝןןǝdoɹԀ", "item.create.pulp": "dןnԀ", - "item.create.rare_creeper_package": "ǝbɐʞɔɐԀ ǝɹɐᴚ", - "item.create.rare_kryppers_package": "ǝbɐʞɔɐԀ ǝɹɐᴚ", - "item.create.rare_simi_package": "ǝbɐʞɔɐԀ ǝɹɐᴚ", + "item.create.rare_package": "ǝbɐʞɔɐԀ ǝɹɐᴚ", "item.create.raw_zinc": "ɔuıZ ʍɐᴚ", "item.create.red_sand_paper": "ɹǝdɐԀ puɐS pǝᴚ", "item.create.refined_radiance": "ǝɔuɐıpɐᴚ pǝuıɟǝᴚ", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index f7e3147b34..213d7477dd 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1197,7 +1197,7 @@ "create.gui.contraptions.network_overstressed": "It appears that this contraption is _overstressed_. Add more sources or _slow_ _down_ the components with a high _stress_ _impact_.", "create.gui.contraptions.not_fast_enough": "It appears that this %1$s is _not_ rotating with _enough_ _speed_.", "create.gui.factory_panel.activate_crafting": "Use Mechanical Crafting", - "create.gui.factory_panel.address_missing": "Missing a target address", + "create.gui.factory_panel.address_missing": "Inactive: missing a target address", "create.gui.factory_panel.connect_input": "Add new connection", "create.gui.factory_panel.crafting_input": "Packaged Ingredients", "create.gui.factory_panel.crafting_input_tip": "Unpackage into connected", @@ -1212,6 +1212,7 @@ "create.gui.factory_panel.left_click_disconnect": "Left-Click to disconnect", "create.gui.factory_panel.left_click_reset": "Left-Click to reset", "create.gui.factory_panel.no_open_promises": "No open promises", + "create.gui.factory_panel.no_target_amount_set": "Inactive: no target amount set", "create.gui.factory_panel.promise_prevents_oversending": "This prevents over-sending.", "create.gui.factory_panel.promised_items": "Promised items", "create.gui.factory_panel.promises_do_not_expire": "Promises do not expire", @@ -2973,10 +2974,6 @@ "item.create.cardboard_chestplate": "Cardboard Chestplate", "item.create.cardboard_helmet": "Cardboard Helmet", "item.create.cardboard_leggings": "Cardboard Leggings", - "item.create.cardboard_package_10x12": "Cardboard Package", - "item.create.cardboard_package_10x8": "Cardboard Package", - "item.create.cardboard_package_12x10": "Cardboard Package", - "item.create.cardboard_package_12x12": "Cardboard Package", "item.create.cardboard_sword": "Cardboard Sword", "item.create.cardboard_sword.tooltip.summary": "Bonk. A _mostly_ _harmless_, yet powerful weapon of choice.", "item.create.chest_minecart_contraption": "Chest Minecart Contraption", @@ -3091,6 +3088,7 @@ "item.create.netherite_diving_helmet.tooltip.behaviour1": "Provides immunity to _Fire_ and _Lava_, slowly draining _Air Pressure_ from the Backtank. Also grants _improved vision_ in Lava", "item.create.netherite_diving_helmet.tooltip.condition1": "When Worn (Full set)", "item.create.netherite_diving_helmet.tooltip.summary": "Together with a _Netherite Backtank_, this can protect you from _extreme heat_. To be effective, _Legs and Feet_ have to be covered in _Netherite_, too.", + "item.create.package": "Cardboard Package", "item.create.package_filter": "Package Filter", "item.create.package_filter.tooltip.behaviour1": "Opens the _configuration interface_.", "item.create.package_filter.tooltip.condition1": "When R-Clicked", @@ -3106,9 +3104,7 @@ "item.create.precision_mechanism": "Precision Mechanism", "item.create.propeller": "Propeller", "item.create.pulp": "Pulp", - "item.create.rare_creeper_package": "Rare Package", - "item.create.rare_kryppers_package": "Rare Package", - "item.create.rare_simi_package": "Rare Package", + "item.create.rare_package": "Rare Package", "item.create.raw_zinc": "Raw Zinc", "item.create.red_sand_paper": "Red Sand Paper", "item.create.refined_radiance": "Refined Radiance", diff --git a/src/generated/resources/assets/create/models/item/rare_jinx_package.json b/src/generated/resources/assets/create/models/item/rare_jinx_package.json new file mode 100644 index 0000000000..f5c305b991 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/rare_jinx_package.json @@ -0,0 +1,6 @@ +{ + "parent": "create:item/package/custom_12x10", + "textures": { + "2": "create:item/package/rare_jinx" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/tags/items/packages.json b/src/generated/resources/data/create/tags/items/packages.json index bedde62cf9..a08a75211a 100644 --- a/src/generated/resources/data/create/tags/items/packages.json +++ b/src/generated/resources/data/create/tags/items/packages.json @@ -5,6 +5,7 @@ "create:cardboard_package_10x8", "create:cardboard_package_12x10", "create:rare_kryppers_package", + "create:rare_jinx_package", "create:rare_creeper_package", "create:rare_simi_package" ] diff --git a/src/main/java/com/simibubi/create/AllItems.java b/src/main/java/com/simibubi/create/AllItems.java index 273cb798ed..7d05a540ed 100644 --- a/src/main/java/com/simibubi/create/AllItems.java +++ b/src/main/java/com/simibubi/create/AllItems.java @@ -45,6 +45,7 @@ import com.simibubi.create.content.legacy.ChromaticCompoundColor; import com.simibubi.create.content.legacy.ChromaticCompoundItem; import com.simibubi.create.content.legacy.RefinedRadianceItem; import com.simibubi.create.content.legacy.ShadowSteelItem; +import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.content.logistics.box.PackageStyles; import com.simibubi.create.content.logistics.box.PackageStyles.PackageStyle; import com.simibubi.create.content.logistics.filter.FilterItem; @@ -63,7 +64,10 @@ import com.simibubi.create.foundation.data.recipe.CompatMetals; import com.simibubi.create.foundation.item.CombustibleItem; import com.simibubi.create.foundation.item.ItemDescription; import com.simibubi.create.foundation.item.TagDependentIngredientItem; +import com.tterrag.registrate.builders.ItemBuilder; +import com.tterrag.registrate.providers.ProviderType; import com.tterrag.registrate.util.entry.ItemEntry; +import com.tterrag.registrate.util.nullness.NonNullBiConsumer; import net.minecraft.core.registries.Registries; import net.minecraft.tags.ItemTags; @@ -405,9 +409,18 @@ public class AllItems { // Logistics static { - for (PackageStyle style : PackageStyles.STYLES) - BuilderTransformers.packageItem(style) - .register(); + boolean rareCreated = false; + boolean normalCreated = false; + for (PackageStyle style : PackageStyles.STYLES) { + ItemBuilder packageItem = BuilderTransformers.packageItem(style); + + if (rareCreated && style.rare() || normalCreated && !style.rare()) + packageItem.setData(ProviderType.LANG, NonNullBiConsumer.noop()); + + rareCreated |= style.rare(); + normalCreated |= !style.rare(); + packageItem.register(); + } } public static final ItemEntry FILTER = REGISTRATE.item("filter", FilterItem::regular) diff --git a/src/main/java/com/simibubi/create/AllPartialModels.java b/src/main/java/com/simibubi/create/AllPartialModels.java index a9b6901714..69aee39aa2 100644 --- a/src/main/java/com/simibubi/create/AllPartialModels.java +++ b/src/main/java/com/simibubi/create/AllPartialModels.java @@ -224,7 +224,7 @@ public class AllPartialModels { public static final List CONTRAPTION_CONTROLS_INDICATOR = new ArrayList<>(); public static final Map PACKAGES = new HashMap<>(); - public static final List PACKAGES_AS_LIST = new ArrayList<>(); + public static final List PACKAGES_TO_HIDE_AS = new ArrayList<>(); public static final Map PACKAGE_RIGGING = new HashMap<>(); static { @@ -255,7 +255,8 @@ public class AllPartialModels { ResourceLocation key = style.getItemId(); PartialModel model = PartialModel.of(Create.asResource("item/" + key.getPath())); PACKAGES.put(key, model); - PACKAGES_AS_LIST.add(model); + if (!style.rare()) + PACKAGES_TO_HIDE_AS.add(model); PACKAGE_RIGGING.put(key, PartialModel.of(style.getRiggingModel())); } } diff --git a/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorHandlerClient.java b/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorHandlerClient.java index a49ffef24f..0b523a6022 100644 --- a/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorHandlerClient.java +++ b/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorHandlerClient.java @@ -70,7 +70,7 @@ public class CardboardArmorHandlerClient { float interpolatedYaw = Mth.lerp(event.getPartialTick(), player.yRotO, player.getYRot()); try { - PartialModel model = AllPartialModels.PACKAGES_AS_LIST.get(getCurrentBoxIndex(player)); + PartialModel model = AllPartialModels.PACKAGES_TO_HIDE_AS.get(getCurrentBoxIndex(player)); PackageRenderer.renderBox(player, -interpolatedYaw + -90, ms, event.getMultiBufferSource(), event.getPackedLight(), model); } catch (ExecutionException e) { @@ -82,7 +82,7 @@ public class CardboardArmorHandlerClient { private static Integer getCurrentBoxIndex(Player player) throws ExecutionException { return BOXES_PLAYERS_ARE_HIDING_AS.get(player.getUUID(), - () -> player.level().random.nextInt(AllPartialModels.PACKAGES_AS_LIST.size())); + () -> player.level().random.nextInt(AllPartialModels.PACKAGES_TO_HIDE_AS.size())); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java index 8a8c526952..64e7e1fa25 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java @@ -5,6 +5,7 @@ import java.util.List; import javax.annotation.Nullable; import com.simibubi.create.AllEntityTypes; +import com.simibubi.create.Create; import com.simibubi.create.content.logistics.box.PackageStyles.PackageStyle; import com.simibubi.create.content.logistics.stockTicker.PackageOrder; @@ -54,6 +55,11 @@ public class PackageItem extends Item { (style.rare() ? PackageStyles.RARE_BOXES : PackageStyles.STANDARD_BOXES).add(this); } + @Override + public String getDescriptionId() { + return "item." + Create.ID + (style.rare() ? ".rare_package" : ".package"); + } + public static boolean isPackage(ItemStack stack) { return stack.getItem() instanceof PackageItem; } diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageStyles.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageStyles.java index 048b2afa99..57b391e93c 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageStyles.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageStyles.java @@ -28,12 +28,13 @@ public class PackageStyles { public static final List STYLES = new ArrayList<>(List.of( - new PackageStyle("cardboard", 12, 12, 23f, false), + new PackageStyle("cardboard", 12, 12, 23f, false), new PackageStyle("cardboard", 10, 12, 22f, false), - new PackageStyle("cardboard", 10, 8, 18f, false), + new PackageStyle("cardboard", 10, 8, 18f, false), new PackageStyle("cardboard", 12, 10, 21f, false), - new PackageStyle("rare_kryppers", 12, 10, 21f, true), + new PackageStyle("rare_kryppers", 12, 10, 21f, true), + new PackageStyle("rare_jinx", 12, 10, 21f, true), new PackageStyle("rare_creeper", 12, 10, 21f, true), new PackageStyle("rare_simi", 12, 10, 21f, true) diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java index b6d5ef01f1..c00d122086 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java @@ -732,6 +732,11 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { public MutableComponent getLabel() { String key = ""; + if (!targetedBy.isEmpty() && count == 0) + return CreateLang.translate("gui.factory_panel.no_target_amount_set") + .style(ChatFormatting.RED) + .component(); + if (isMissingAddress()) return CreateLang.translate("gui.factory_panel.address_missing") .style(ChatFormatting.RED) diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java index e67d2dc765..5459b6132e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java @@ -146,7 +146,8 @@ public class FactoryPanelScreen extends AbstractSimiScreen { int y = guiTop; if (addressBox == null) { - addressBox = new AddressEditBox(this, new NoShadowFontWrapper(font), 0, 0, 108, 10, false); + addressBox = + new AddressEditBox(this, new NoShadowFontWrapper(font), x + 36, y + windowHeight - 51, 108, 10, false); addressBox.setValue(behaviour.recipeAddress); addressBox.setTextColor(0x555555); } @@ -175,7 +176,7 @@ public class FactoryPanelScreen extends AbstractSimiScreen { promiseExpiration.setState(behaviour.promiseClearingInterval); addRenderableWidget(promiseExpiration); - newInputButton = new IconButton(x + (restocker ? 54 : 34), y + (restocker ? 25 : 65), AllIcons.I_ADD); + newInputButton = new IconButton(x + 31, y + 63, AllIcons.I_ADD); newInputButton.withCallback(() -> { FactoryPanelConnectionHandler.startConnection(behaviour); minecraft.setScreen(null); @@ -187,7 +188,7 @@ public class FactoryPanelScreen extends AbstractSimiScreen { activateCraftingButton = null; if (availableCraftingRecipe != null) { - activateCraftingButton = new IconButton(x + 34, y + 44, AllIcons.I_3x3); + activateCraftingButton = new IconButton(x + 31, y + 43, AllIcons.I_3x3); activateCraftingButton.withCallback(() -> { craftingActive = !craftingActive; init(); @@ -225,8 +226,11 @@ public class FactoryPanelScreen extends AbstractSimiScreen { // BG AllGuiTextures bg = restocker ? FACTORY_GAUGE_RESTOCK : FACTORY_GAUGE_RECIPE; + if (restocker) + FACTORY_GAUGE_RECIPE.render(graphics, x, y - 16); bg.render(graphics, x, y); FACTORY_GAUGE_BOTTOM.render(graphics, x, y + bg.getHeight()); + y = guiTop; // RECIPE int slot = 0; @@ -241,8 +245,8 @@ public class FactoryPanelScreen extends AbstractSimiScreen { renderInputItem(graphics, slot, new BigItemStack(behaviour.getFilter(), 1), mouseX, mouseY); if (!restocker) { - int outputX = x + 141; - int outputY = y + 66; + int outputX = x + 160; + int outputY = y + 48; graphics.renderItem(outputConfig.stack, outputX, outputY); graphics.renderItemDecorations(font, behaviour.getFilter(), outputX, outputY, outputConfig.count + ""); @@ -281,10 +285,10 @@ public class FactoryPanelScreen extends AbstractSimiScreen { Component title = CreateLang .translate(restocker ? "gui.factory_panel.title_as_restocker" : "gui.factory_panel.title_as_recipe") .component(); - graphics.drawString(font, title, x + 97 - font.width(title) / 2, y + 4, 0x3D3C48, false); + graphics.drawString(font, title, x + 97 - font.width(title) / 2, y + (restocker ? -12 : 4), 0x3D3C48, false); // ITEM PREVIEW - int previewY = restocker ? 10 : 50; + int previewY = restocker ? 0 : 60; ms.pushPose(); ms.translate(0, previewY, 0); @@ -378,7 +382,7 @@ public class FactoryPanelScreen extends AbstractSimiScreen { private void renderInputItem(GuiGraphics graphics, int slot, BigItemStack itemStack, int mouseX, int mouseY) { int inputX = guiLeft + (restocker ? 88 : 68 + (slot % 3 * 20)); - int inputY = guiTop + 26 + (slot / 3 * 20); + int inputY = guiTop + (restocker ? 12 : 28) + (slot / 3 * 20); graphics.renderItem(itemStack.stack, inputX, inputY); if (!craftingActive && !restocker && !itemStack.stack.isEmpty()) @@ -510,7 +514,7 @@ public class FactoryPanelScreen extends AbstractSimiScreen { if (!craftingActive) for (int i = 0; i < connections.size(); i++) { int inputX = x + 68 + (i % 3 * 20); - int inputY = y + 26 + (i / 3 * 20); + int inputY = y + 28 + (i / 3 * 20); if (mouseX >= inputX && mouseX < inputX + 16 && mouseY >= inputY && mouseY < inputY + 16) { sendIt(connections.get(i).from, false); return true; @@ -559,8 +563,8 @@ public class FactoryPanelScreen extends AbstractSimiScreen { } if (!restocker) { - int outputX = x + 141; - int outputY = y + 66; + int outputX = x + 160; + int outputY = y + 48; if (mouseX >= outputX && mouseX < outputX + 16 && mouseY >= outputY && mouseY < outputY + 16) { BigItemStack itemStack = outputConfig; itemStack.count = diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortPlacementPacket.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortPlacementPacket.java index dcf400401a..7dc29da673 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortPlacementPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortPlacementPacket.java @@ -46,7 +46,9 @@ public class PackagePortPlacementPacket extends SimplePacketBase { BlockEntity blockEntity = world.getBlockEntity(pos); if (!(blockEntity instanceof PackagePortBlockEntity ppbe)) return; - + if (!target.canSupport(ppbe)) + return; + Vec3 targetLocation = target.getExactTargetLocation(ppbe, world, pos); if (targetLocation == Vec3.ZERO || !targetLocation.closerThan(Vec3.atBottomCenterOf(pos), AllConfigs.server().logistics.packagePortRange.get() + 2)) diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTarget.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTarget.java index 96a17229ad..86e6203983 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTarget.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTarget.java @@ -4,6 +4,7 @@ import java.util.Map; import javax.annotation.Nullable; +import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorBlockEntity; import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorBlockEntity.ConnectedPort; @@ -42,6 +43,8 @@ public abstract class PackagePortTarget { public abstract ItemStack getIcon(); + public abstract boolean canSupport(BlockEntity be); + public boolean depositImmediately() { return false; } @@ -195,6 +198,11 @@ public abstract class PackagePortTarget { return clbe.getPackagePosition(chainPos, connection); } + @Override + public boolean canSupport(BlockEntity be) { + return AllBlockEntityTypes.PACKAGE_FROGPORT.is(be); + } + } public static class TrainStationFrogportTarget extends PackagePortTarget { @@ -241,6 +249,11 @@ public abstract class PackagePortTarget { @Override protected void readInternal(CompoundTag tag) {} + @Override + public boolean canSupport(BlockEntity be) { + return AllBlockEntityTypes.PACKAGE_POSTBOX.is(be); + } + } } diff --git a/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterMenu.java b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterMenu.java index 7a5539035c..878f42178f 100644 --- a/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterMenu.java +++ b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterMenu.java @@ -58,13 +58,13 @@ public class RedstoneRequesterMenu extends GhostItemMenu minecraft.player.closeContainer()); addRenderableWidget(confirmButton); - allowPartial = new IconButton(x + 12, y + bgHeight - 24, AllIcons.I_PARTIAL_REQUESTS); + allowPartial = new IconButton(x + 12, y + bgHeight - 25, AllIcons.I_PARTIAL_REQUESTS); allowPartial.withCallback(() -> { allowPartial.green = true; dontAllowPartial.green = false; @@ -90,7 +90,7 @@ public class RedstoneRequesterScreen extends AbstractSimiContainerScreen { allowPartial.green = false; dontAllowPartial.green = true; @@ -107,18 +107,18 @@ public class RedstoneRequesterScreen extends AbstractSimiContainerScreen list : clipboardItem) + for (ClipboardEntry entry : list) + if (!entry.icon.isEmpty()) + anyItems = true; + if (!anyItems) + clipboardItem = null; + } // Find the keeper for rendering for (int yOffset : Iterate.zeroAndOne) { @@ -554,18 +561,17 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen 0) { - int c1 = new Color(0xB59370).setAlpha(alpha) + int c3 = new Color(0x8C5D4B).setAlpha(alpha) .getRGB(); - int c2 = new Color(0xEDD8BB).setAlpha(alpha * 0) - .getRGB(); - int c3 = new Color(0x714A40).setAlpha(alpha) - .getRGB(); - TooltipRenderUtil.renderTooltipBackground(graphics, msgX - 2, msgY + 2, font.width(msg) + 4, - font.lineHeight - 5, 0, c1, c1, c2, c2); - graphics.drawString(font, msg, msgX, msgY, c3, false); + int w = font.width(msg) + 14; + AllGuiTextures.STOCK_KEEPER_REQUEST_BANNER_L.render(graphics, msgX - 8, msgY - 4); + UIRenderHelper.drawStretched(graphics, msgX, msgY - 4, w, 16, 0, + AllGuiTextures.STOCK_KEEPER_REQUEST_BANNER_M); + AllGuiTextures.STOCK_KEEPER_REQUEST_BANNER_R.render(graphics, msgX + font.width(msg) + 10, msgY - 4); + graphics.drawString(font, msg, msgX + 5, msgY, c3, false); } } diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java index 88d4dd6efd..519b0ae96a 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java @@ -153,9 +153,9 @@ public enum AllGuiTextures implements ScreenElement, TextureSheetSegment { VALUE_SETTINGS_LABEL_BG("value_settings", 0, 31, 81, 11), // HILO - FACTORY_GAUGE_RECIPE("factory_gauge", 32, 4, 192, 95), - FACTORY_GAUGE_RESTOCK("factory_gauge", 32, 109, 192, 55), - FACTORY_GAUGE_BOTTOM("factory_gauge", 32, 174, 200, 57), + FACTORY_GAUGE_RECIPE("factory_gauge", 32, 0, 192, 96), + FACTORY_GAUGE_RESTOCK("factory_gauge", 32, 112, 192, 40), + FACTORY_GAUGE_BOTTOM("factory_gauge", 32, 176, 200, 64), STOCK_KEEPER_REQUEST_HEADER("stock_keeper", 0, 0, 256, 36), STOCK_KEEPER_REQUEST_BODY("stock_keeper", 0, 48, 256, 20), @@ -173,6 +173,9 @@ public enum AllGuiTextures implements ScreenElement, TextureSheetSegment { STOCK_KEEPER_REQUEST_SCROLL_PAD("stock_keeper", 219, 196, 5, 1), STOCK_KEEPER_REQUEST_SCROLL_MID("stock_keeper", 219, 197, 5, 9), STOCK_KEEPER_REQUEST_SCROLL_BOT("stock_keeper", 219, 207, 5, 5), + STOCK_KEEPER_REQUEST_BANNER_L("stock_keeper", 64, 228, 8, 16), + STOCK_KEEPER_REQUEST_BANNER_M("stock_keeper", 73, 228, 1, 16), + STOCK_KEEPER_REQUEST_BANNER_R("stock_keeper", 75, 228, 8, 16), STOCK_KEEPER_REQUEST_BG("stock_keeper", 37, 48, 182, 20), STOCK_KEEPER_CATEGORY_HIDDEN("stock_keeper", 143, 176, 8, 8), STOCK_KEEPER_CATEGORY_SHOWN("stock_keeper", 151, 176, 8, 8), @@ -188,7 +191,7 @@ public enum AllGuiTextures implements ScreenElement, TextureSheetSegment { STOCK_KEEPER_CATEGORY_UP("stock_keeper_categories", 211, 160, 8, 8), STOCK_KEEPER_CATEGORY_DOWN("stock_keeper_categories", 211, 169, 8, 8), - REDSTONE_REQUESTER("restocker_and_requester", 0, 134, 210, 100), + REDSTONE_REQUESTER("requester", 16, 16, 232, 120), // JEI JEI_SLOT("jei/widgets", 18, 18), diff --git a/src/main/resources/assets/create/lang/default/interface.json b/src/main/resources/assets/create/lang/default/interface.json index 7e5f592a26..6354afbc0a 100644 --- a/src/main/resources/assets/create/lang/default/interface.json +++ b/src/main/resources/assets/create/lang/default/interface.json @@ -1077,7 +1077,8 @@ "create.gui.factory_panel.crafting_input_tip": "Unpackage into connected", "create.gui.factory_panel.crafting_input_tip_1": "mechanical crafters (3x3)", "create.gui.factory_panel.inactive": " Inactive ", - "create.gui.factory_panel.address_missing": "Missing a target address", + "create.gui.factory_panel.address_missing": "Inactive: missing a target address", + "create.gui.factory_panel.no_target_amount_set": "Inactive: no target amount set", "create.gui.factory_panel.has_link_connections": "Gauge has connected links", "create.gui.redstone_requester.allow_partial": "Allow partial orders", diff --git a/src/main/resources/assets/create/textures/gui/factory_gauge.png b/src/main/resources/assets/create/textures/gui/factory_gauge.png index 3a9d6770e1c5cb43c9f1e5ad4e050c5b5afed884..0ec2a53d934074b11d0e30cfcde69c825175098f 100644 GIT binary patch delta 2383 zcmai0dpMNa8vnj;E@ot=kunMyQ>0uPYK*&)YZudqQKU>4*U)Ixo`m`6xEyy8wJDQZ zQ@ThgyRGJv2s=zgkuH-I`-wt@(Ab}||2XG4f1L9^&+mEP^;>Jb?|RpI-{)E9G;){b zI*Eh1+k9LB0O;NsH$6QfefT!?AEhoH{-eFWcQi=r@&%cDwr(*s=i6IHZ(*0k@l*Xh z8!zRa3ie{LSQ!}^^YinyIgvG4hhk!41_lPAJe+phuv%JLcsyQkaBy*Hb$NOD)vH%4 zDk{(r#ot2`P(_c~!SO~n{!8-OmgdQED*=+cDH@$43OxLT06>1Q0C1Vn78oV9@@7}4 znpw;?U~Z$M+xfbnC5wVu{wTsyu>gqba1;wNaSQ~8G5^-wePK~CW*k=^8q>_&%pyMx zTm=^7UjYro*|v>4pHUk)06@^&?Be7j+BsYZB#jP*m&;dg9`w_#aXQdspvcd3* z#hFe?1Z<}KRlaYng7T40>UGm!<={V;TH&;BSBH5)K_WYAl|ma+fX`vsA`J%DyRxYtz>4OE-k!Rwpgy z>tAN$!JkadhXWM_O>3+=);yQCdsh_jw7{J0c@stuL}cfrlhtX?d}q*#6oT8ky#fig zXqeppOh5O-(ARO%6%K(-=5(H z91Esr0TIs^t%UB!8^^}o&q@V!NbCLWB`=6^FL$Yd5nUO+i@A4M{OlDpjgp@=g0e~)_n48D`;=`G8U5R@|uN3i!><_M*v>` z^sVoyY%j?syFi-;K6qm{Xo~qnVCPKGZvhd$q{Q0Q7*P)u#yxz4Rn!+oqI1aM$^HM- z=ifK=f^LDH{?-aZiFvLMS5qW^pwvtn7D>}7xt^e@1Hy<&q@YHvc*~V0TaSG z>R%6a@L|JqYvR1>ZiIHFM)n3c@<;mmF53aS6vSPlzyP3p;|30zJ4| z<8Y1MV+1Yy3FH_1J$L7>1@>MtBqbouKz2&9jlEhWaV1oMK19<4ub&G_U8S@x0=^Fqjv@9MSUox$|4eKU^}-#-o^ z_9|G|aIm+Ld{dcSPr46jiV9)UeP_0Ay$F!j)A#rN{tYmF~kof8BD%(yFKO6AitPmSnqrtE%61>rI(jG}cS_2;ViBWP) zLlWI-P{MSV<7N8%&{%fJ8^x8iM=YmR87fi^&a=%I?vwHBg@7*s7YIsY6ll+`TWZz6 z8&SQWScg~_2|7`SnxMtunhXN_tO*?ms!an5+UOA1@c$8FuH`qGH9^_a8!q@6C1BPk zFmJDThZ`m)NZr|E`rMMs4K~a!WytnW5EnJ%O&_3*QMlvP<$)y=c7IHi`Vs*V^>?MoYY=I@jkiCKuQ{z8+0FoiSd0 z5HV2(r2@Av%8Bsj;TJy~4;Jyu>!|x9(BU#wc#Z^W%X$G7KW8wN1*+Ml0~Pw!NxsIEd( z)M=0lu>J1~ZBu#=oe~jgv?CO^thqh!%>HK&Z5@Cd9F!{e2IB7=?B{tbd^k3{a$K%$ H;wSwD+RObE literal 2461 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/gui/restocker_and_requester.png b/src/main/resources/assets/create/textures/gui/restocker_and_requester.png deleted file mode 100644 index c923304efdd5b81fe30771de0b9bb29e54200d06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2036 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 Qt*accw6HTTJ4%WECn<+?s{jB1 delta 2971 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 MtQ;-t%zcyp3&#)*@Bjb+ diff --git a/src/main/resources/assets/create/textures/item/package/rare_jinx.png b/src/main/resources/assets/create/textures/item/package/rare_jinx.png new file mode 100644 index 0000000000000000000000000000000000000000..7860454b9e65d4c02138c8fcfebec9099f1a36ed GIT binary patch literal 872 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCijw1AIbUFR!k@v!(su%-qw9%g-#SsHrGBdHmp``!~DWTQqfTpPyNGX2ZlM zM;EDRm>ru}cxC(a`v>PMC>z|}KkxjCnoT_^$LAOCnUZyV=ggV;&MO*%kF9La$xM%n ziK>k>-mq@v!V2%j)qa6~zChc4?F!!qq?Aj7{DS`z1Pp1K&C`I&ISV`@iy0XB4uCLY z*0oMfprAyFYeY$Kep*R+Vo@qXKw@TIiJqTph=Qq}p`KyV)*v3Bnr*2Oo@t(*S_~XO z4l9EcBP#b$b#xJG%x_k{+Sa{ zH!ETbFzy(OJzX3_Ec{z1b5}PhNVIk~8ZDo4GU)KxH~;^inEO6ydgyJ%z{)tj8h4}T z^(+T+^s1VYPs}nmaX_r$&no@AFAv9=(>q-W4ASv zncA$X=(mdsrP(slE^p(l%JW!*x&-z0j!j{Caf2~bv%z%b zi3~f@4xSS619Cc?dztuV-(l`xl6Wq2>Q&+4+pip|0}k*#z9Iknu?63pB~v^b^d8o7 z+`C?zZpE6xd8^q<;pKuyD_B>olumVdBuXyds!{(aLRU8w~ zuV!P@@J#7cdTPV-*=BykW~Mnx%YPnf41Qw5I>Y}BgEC{?{FChL-p?*wv)#a`^Nz8` zma)W2rQv&BR8zc~&5FadqL)otkN#GD@Ngxw(6K*9+dU^OvCWWVQdl7n#O2t3$N9>& zBNKX0KfG$soo@8ltKr7OIF=jChioEB&NuEavHQ<(%`rsu+*%1CP*ixj`njxgN@xNA DYvMvf literal 0 HcmV?d00001 From 7795ee819107776268bcd88eb099b57cf7a911ff Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 27 Dec 2024 18:19:27 +0100 Subject: [PATCH 218/515] That explains it - Added the transmitter ingredient item - Stock links now have additional block orientations - Fixed frogports catching packages on chains they weren't targeting --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 9 +- .../82992cbf8f2794d83ac94034835eac0acd7915b9 | 8 +- .../assets/create/blockstates/stock_link.json | 204 +++++++++++++----- .../resources/assets/create/lang/en_ud.json | 1 + .../resources/assets/create/lang/en_us.json | 1 + .../create/models/item/transmitter.json | 6 + .../misc/crafting/materials/transmitter.json | 33 +++ .../crafting/logistics/display_link.json | 8 +- .../crafting/logistics/stock_link.json | 6 +- .../crafting/materials/transmitter.json | 24 +++ .../java/com/simibubi/create/AllBlocks.java | 2 +- .../java/com/simibubi/create/AllItems.java | 2 +- .../ChainConveyorBlockEntity.java | 3 + .../packager/PackagerBlockEntity.java | 4 +- .../packagerLink/PackagerLinkBlock.java | 29 ++- .../packagerLink/PackagerLinkBlockEntity.java | 4 +- .../data/recipe/StandardRecipeGen.java | 28 +-- .../create/textures/item/transmitter.png | Bin 0 -> 526 bytes 18 files changed, 280 insertions(+), 92 deletions(-) create mode 100644 src/generated/resources/assets/create/models/item/transmitter.json create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/materials/transmitter.json create mode 100644 src/generated/resources/data/create/recipes/crafting/materials/transmitter.json create mode 100644 src/main/resources/assets/create/textures/item/transmitter.png diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 2ccbc401bd..4aef998b54 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-12-27T16:20:32.5134051 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-12-27T18:05:56.7764077 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -569,7 +569,7 @@ a60c9c8241e40c2e28f5760c0ca6e80cfe9d59f3 assets/create/blockstates/steam_whistle 8865500bcd2e4d467e74edb3509850fa92a5809f assets/create/blockstates/sticker.json bed0534e618105184bc877b104230403ca85bb58 assets/create/blockstates/sticky_mechanical_piston.json c7c17ff17b98ce85d355f2f9b4509271bc283843 assets/create/blockstates/stockpile_switch.json -9867b7abbab1c9e848df4bb8557c4b41604e71fc assets/create/blockstates/stock_link.json +2d66ca4b6916eac170b3b8552705b699f569bae2 assets/create/blockstates/stock_link.json 9989bda294fbffc5f659d2e608e01dea424c7694 assets/create/blockstates/stock_ticker.json a70c025de5d85180f371ff05bbdc531d8bdfaab1 assets/create/blockstates/stressometer.json 8086f80c532fad42b37fcdc590b890ed7e8c3fe9 assets/create/blockstates/tiled_glass.json @@ -642,8 +642,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -49aa0b1ee7abaa4bc8f314044da6952c9e503372 assets/create/lang/en_ud.json -c425530ef04826a17b96f335ef4bbef66994c45b assets/create/lang/en_us.json +6a5bfb3525f178e198ef8fd4c0cb1a941c021ff5 assets/create/lang/en_ud.json +d3402f8a5a75f8c1f7ea6d2dfa56218d5f55d112 assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -2451,6 +2451,7 @@ c4bd1224b988ca10708fe9538a0baa8b88272eb5 assets/create/models/item/track_observe c08a82b94666ca81a6d9134c740cc9c28ddae892 assets/create/models/item/track_station.json be3b40aee1c62680ddcf9129fd9f926bab790590 assets/create/models/item/train_door.json 1d45bba128629e6c962a9260d49f2df83958ed16 assets/create/models/item/train_trapdoor.json +b3a5de0cddc4d9d2d1858535220cb527735e86bc assets/create/models/item/transmitter.json ba7a9f542e9f65bdce3d3330a95f1166a0be0673 assets/create/models/item/tree_fertilizer.json 55aafc103c38057faa3295ccc76da99f4a91de52 assets/create/models/item/tuff_pillar.json 0e199ab3e450156aae2d54c227383af9bb3f7082 assets/create/models/item/turntable.json diff --git a/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 b/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 index d02e2034c5..56f573e7d0 100644 --- a/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 +++ b/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 @@ -1,4 +1,4 @@ -// 1.20.1 2024-12-13T16:37:18.6553347 Create's Standard Recipes +// 1.20.1 2024-12-27T18:05:56.832873 Create's Standard Recipes a8cc4af26f6c7c45a9eef12e92af1452fe042454 data/create/advancements/recipes/combat/crafting/appliances/netherite_backtank.json 2c2639c7b307ee7c7a4e97e5efebf496788998ad data/create/advancements/recipes/combat/crafting/appliances/netherite_backtank_from_netherite.json 81dcf0cb1aa99e39bc7d1a386e07cad4cee7d8b9 data/create/advancements/recipes/combat/crafting/appliances/netherite_diving_boots.json @@ -227,6 +227,7 @@ aa2067bedd73d45dcf4bf2c1a30d227d4de4f57d data/create/advancements/recipes/misc/c 4fb6101ff037b9da3f030729dd991dab4c934267 data/create/advancements/recipes/misc/crafting/materials/rose_quartz_tiles_from_conversion.json 489c20709121bfe0408566b0b89dfa685efef8e4 data/create/advancements/recipes/misc/crafting/materials/sand_paper.json 6cd07e204c574b1419ba81cfffc1967a1c7d4f75 data/create/advancements/recipes/misc/crafting/materials/small_rose_quartz_tiles_from_conversion.json +dc1e07242564e81694f151cecfc2b6115e5862ca data/create/advancements/recipes/misc/crafting/materials/transmitter.json 0d60ad8d0436ed33a8013616390ca5e970e042ee data/create/advancements/recipes/misc/crafting/materials/zinc_block_from_compacting.json 8b9692de75d0c1d694bb3a2ce2316200ef3ff197 data/create/advancements/recipes/misc/crafting/materials/zinc_ingot_from_compacting.json dd7c250fa8e41cbaae65754f38b8861397718ae4 data/create/advancements/recipes/misc/crafting/materials/zinc_ingot_from_decompacting.json @@ -458,7 +459,7 @@ a24f11d979f40994b9f881b0f49fff5d93185296 data/create/recipes/crafting/logistics/ d994ef262b16357984d3ed62f6563d2f37266193 data/create/recipes/crafting/logistics/brass_tunnel.json 0b18d9964f2d580eb465cc72208f7a7fdba7b63e data/create/recipes/crafting/logistics/content_observer.json 4f3ce7533d77e5bcab8da815d0fd5d41c95efe4e data/create/recipes/crafting/logistics/desk_bell.json -cc837e8b014c121ed9d959baddea134ebf669350 data/create/recipes/crafting/logistics/display_link.json +5ed926477160d18871cce4306da2f8d4ae17f7e5 data/create/recipes/crafting/logistics/display_link.json 4daadd2c67fe8bbf5594fb50dcf051dad7f9997a data/create/recipes/crafting/logistics/factory_gauge.json 2fb7722137990b9b9be967a1f766e138678d0573 data/create/recipes/crafting/logistics/factory_gauge_clear.json f3ba21e8979256fb78cd618ac4f1082b0b2f9e0c data/create/recipes/crafting/logistics/item_hatch.json @@ -476,7 +477,7 @@ c81f852f1d1514184ff235e790a6ca907f7b6ad4 data/create/recipes/crafting/logistics/ 8446b3ca07575ea978ddde4121900207d54be8b3 data/create/recipes/crafting/logistics/redstone_requester_clear.json e156e092a9c719e91cd62e23f8ee2201dce4c2a8 data/create/recipes/crafting/logistics/repackager_from_conversion.json eff0d37e98e8badd8d2c3c9de17ee5560b110dbd data/create/recipes/crafting/logistics/stockpile_switch.json -900dc578ab8dd26014cf473f2c5a8b5fbf23ccf8 data/create/recipes/crafting/logistics/stock_link.json +8f8e7800431590b06f287fc6a24389ec71fc3eb4 data/create/recipes/crafting/logistics/stock_link.json e19544e2ef88a4d10f6dc8a3a973793cb00085ba data/create/recipes/crafting/logistics/stock_link_clear.json d4671c9d3c654aadd3fd238dfaa6939587f8a81b data/create/recipes/crafting/logistics/stock_ticker.json 38aa7b9b3c4724ec8b8d94f00a98d684110ad5ca data/create/recipes/crafting/logistics/stock_ticker_clear.json @@ -504,6 +505,7 @@ e89aa3ab801e3ce25387ae67c5e47bab518b9225 data/create/recipes/crafting/materials/ 46cb889dd23d9a8a47f8b340abcbdbec35b21ee3 data/create/recipes/crafting/materials/rose_quartz_tiles_from_conversion.json cde25f253da4d9800fd8f879a7d208e40510df82 data/create/recipes/crafting/materials/sand_paper.json 39d9f3238bffd32a0bbe85f300bee0c71161f2df data/create/recipes/crafting/materials/small_rose_quartz_tiles_from_conversion.json +909cb6ddb17b7db28d2c67c18762444feb3bfe2b data/create/recipes/crafting/materials/transmitter.json 24c99b98a2acb744a05f9ff4f22b783689e2b2f9 data/create/recipes/crafting/materials/zinc_block_from_compacting.json 5effb47ad68c8bacc4b1984a37b63ae3b02b3e88 data/create/recipes/crafting/materials/zinc_ingot_from_compacting.json 2636700eda7f06a9297af688c8b7963b2611ea42 data/create/recipes/crafting/materials/zinc_ingot_from_decompacting.json diff --git a/src/generated/resources/assets/create/blockstates/stock_link.json b/src/generated/resources/assets/create/blockstates/stock_link.json index 23c5629bee..8b1c44ce75 100644 --- a/src/generated/resources/assets/create/blockstates/stock_link.json +++ b/src/generated/resources/assets/create/blockstates/stock_link.json @@ -1,105 +1,213 @@ { "variants": { - "facing=down,powered=false,waterlogged=false": { + "face=ceiling,facing=east,powered=false,waterlogged=false": { + "model": "create:block/stock_link/block", + "x": 180, + "y": 270 + }, + "face=ceiling,facing=east,powered=false,waterlogged=true": { + "model": "create:block/stock_link/block", + "x": 180, + "y": 270 + }, + "face=ceiling,facing=east,powered=true,waterlogged=false": { + "model": "create:block/stock_link/block_powered", + "x": 180, + "y": 270 + }, + "face=ceiling,facing=east,powered=true,waterlogged=true": { + "model": "create:block/stock_link/block_powered", + "x": 180, + "y": 270 + }, + "face=ceiling,facing=north,powered=false,waterlogged=false": { + "model": "create:block/stock_link/block", + "x": 180, + "y": 180 + }, + "face=ceiling,facing=north,powered=false,waterlogged=true": { + "model": "create:block/stock_link/block", + "x": 180, + "y": 180 + }, + "face=ceiling,facing=north,powered=true,waterlogged=false": { + "model": "create:block/stock_link/block_powered", + "x": 180, + "y": 180 + }, + "face=ceiling,facing=north,powered=true,waterlogged=true": { + "model": "create:block/stock_link/block_powered", + "x": 180, + "y": 180 + }, + "face=ceiling,facing=south,powered=false,waterlogged=false": { "model": "create:block/stock_link/block", "x": 180 }, - "facing=down,powered=false,waterlogged=true": { + "face=ceiling,facing=south,powered=false,waterlogged=true": { "model": "create:block/stock_link/block", "x": 180 }, - "facing=down,powered=true,waterlogged=false": { + "face=ceiling,facing=south,powered=true,waterlogged=false": { "model": "create:block/stock_link/block_powered", "x": 180 }, - "facing=down,powered=true,waterlogged=true": { + "face=ceiling,facing=south,powered=true,waterlogged=true": { "model": "create:block/stock_link/block_powered", "x": 180 }, - "facing=east,powered=false,waterlogged=false": { + "face=ceiling,facing=west,powered=false,waterlogged=false": { "model": "create:block/stock_link/block", - "x": 90, + "x": 180, "y": 90 }, - "facing=east,powered=false,waterlogged=true": { + "face=ceiling,facing=west,powered=false,waterlogged=true": { "model": "create:block/stock_link/block", - "x": 90, + "x": 180, "y": 90 }, - "facing=east,powered=true,waterlogged=false": { + "face=ceiling,facing=west,powered=true,waterlogged=false": { "model": "create:block/stock_link/block_powered", - "x": 90, + "x": 180, "y": 90 }, - "facing=east,powered=true,waterlogged=true": { + "face=ceiling,facing=west,powered=true,waterlogged=true": { "model": "create:block/stock_link/block_powered", - "x": 90, + "x": 180, "y": 90 }, - "facing=north,powered=false,waterlogged=false": { + "face=floor,facing=east,powered=false,waterlogged=false": { "model": "create:block/stock_link/block", - "x": 90 + "y": 90 }, - "facing=north,powered=false,waterlogged=true": { + "face=floor,facing=east,powered=false,waterlogged=true": { "model": "create:block/stock_link/block", - "x": 90 + "y": 90 }, - "facing=north,powered=true,waterlogged=false": { + "face=floor,facing=east,powered=true,waterlogged=false": { "model": "create:block/stock_link/block_powered", - "x": 90 + "y": 90 }, - "facing=north,powered=true,waterlogged=true": { + "face=floor,facing=east,powered=true,waterlogged=true": { "model": "create:block/stock_link/block_powered", - "x": 90 + "y": 90 }, - "facing=south,powered=false,waterlogged=false": { - "model": "create:block/stock_link/block", - "x": 90, - "y": 180 - }, - "facing=south,powered=false,waterlogged=true": { - "model": "create:block/stock_link/block", - "x": 90, - "y": 180 - }, - "facing=south,powered=true,waterlogged=false": { - "model": "create:block/stock_link/block_powered", - "x": 90, - "y": 180 - }, - "facing=south,powered=true,waterlogged=true": { - "model": "create:block/stock_link/block_powered", - "x": 90, - "y": 180 - }, - "facing=up,powered=false,waterlogged=false": { + "face=floor,facing=north,powered=false,waterlogged=false": { "model": "create:block/stock_link/block" }, - "facing=up,powered=false,waterlogged=true": { + "face=floor,facing=north,powered=false,waterlogged=true": { "model": "create:block/stock_link/block" }, - "facing=up,powered=true,waterlogged=false": { + "face=floor,facing=north,powered=true,waterlogged=false": { "model": "create:block/stock_link/block_powered" }, - "facing=up,powered=true,waterlogged=true": { + "face=floor,facing=north,powered=true,waterlogged=true": { "model": "create:block/stock_link/block_powered" }, - "facing=west,powered=false,waterlogged=false": { + "face=floor,facing=south,powered=false,waterlogged=false": { + "model": "create:block/stock_link/block", + "y": 180 + }, + "face=floor,facing=south,powered=false,waterlogged=true": { + "model": "create:block/stock_link/block", + "y": 180 + }, + "face=floor,facing=south,powered=true,waterlogged=false": { + "model": "create:block/stock_link/block_powered", + "y": 180 + }, + "face=floor,facing=south,powered=true,waterlogged=true": { + "model": "create:block/stock_link/block_powered", + "y": 180 + }, + "face=floor,facing=west,powered=false,waterlogged=false": { + "model": "create:block/stock_link/block", + "y": 270 + }, + "face=floor,facing=west,powered=false,waterlogged=true": { + "model": "create:block/stock_link/block", + "y": 270 + }, + "face=floor,facing=west,powered=true,waterlogged=false": { + "model": "create:block/stock_link/block_powered", + "y": 270 + }, + "face=floor,facing=west,powered=true,waterlogged=true": { + "model": "create:block/stock_link/block_powered", + "y": 270 + }, + "face=wall,facing=east,powered=false,waterlogged=false": { + "model": "create:block/stock_link/block", + "x": 90, + "y": 90 + }, + "face=wall,facing=east,powered=false,waterlogged=true": { + "model": "create:block/stock_link/block", + "x": 90, + "y": 90 + }, + "face=wall,facing=east,powered=true,waterlogged=false": { + "model": "create:block/stock_link/block_powered", + "x": 90, + "y": 90 + }, + "face=wall,facing=east,powered=true,waterlogged=true": { + "model": "create:block/stock_link/block_powered", + "x": 90, + "y": 90 + }, + "face=wall,facing=north,powered=false,waterlogged=false": { + "model": "create:block/stock_link/block", + "x": 90 + }, + "face=wall,facing=north,powered=false,waterlogged=true": { + "model": "create:block/stock_link/block", + "x": 90 + }, + "face=wall,facing=north,powered=true,waterlogged=false": { + "model": "create:block/stock_link/block_powered", + "x": 90 + }, + "face=wall,facing=north,powered=true,waterlogged=true": { + "model": "create:block/stock_link/block_powered", + "x": 90 + }, + "face=wall,facing=south,powered=false,waterlogged=false": { + "model": "create:block/stock_link/block", + "x": 90, + "y": 180 + }, + "face=wall,facing=south,powered=false,waterlogged=true": { + "model": "create:block/stock_link/block", + "x": 90, + "y": 180 + }, + "face=wall,facing=south,powered=true,waterlogged=false": { + "model": "create:block/stock_link/block_powered", + "x": 90, + "y": 180 + }, + "face=wall,facing=south,powered=true,waterlogged=true": { + "model": "create:block/stock_link/block_powered", + "x": 90, + "y": 180 + }, + "face=wall,facing=west,powered=false,waterlogged=false": { "model": "create:block/stock_link/block", "x": 90, "y": 270 }, - "facing=west,powered=false,waterlogged=true": { + "face=wall,facing=west,powered=false,waterlogged=true": { "model": "create:block/stock_link/block", "x": 90, "y": 270 }, - "facing=west,powered=true,waterlogged=false": { + "face=wall,facing=west,powered=true,waterlogged=false": { "model": "create:block/stock_link/block_powered", "x": 90, "y": 270 }, - "facing=west,powered=true,waterlogged=true": { + "face=wall,facing=west,powered=true,waterlogged=true": { "model": "create:block/stock_link/block_powered", "x": 90, "y": 270 diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 876719276d..640e0e3f1f 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -3131,6 +3131,7 @@ "item.create.sturdy_sheet": "ʇǝǝɥS ʎpɹnʇS", "item.create.super_glue": "ǝnן⅁ ɹǝdnS", "item.create.sweet_roll": "ןןoᴚ ʇǝǝʍS", + "item.create.transmitter": "ɹǝʇʇıɯsuɐɹ⟘", "item.create.tree_fertilizer": "ɹǝzıןıʇɹǝℲ ǝǝɹ⟘", "item.create.tree_fertilizer.tooltip.behaviour1": "‾suoıʇıpuoɔ buıɔɐds‾ sʇı ɟo ‾ssǝןpɹɐbǝɹ‾ ǝǝɹʇ ɐ sǝʇɐǝɹƆ", "item.create.tree_fertilizer.tooltip.condition1": "buıןdɐS ɐ uo pǝsn uǝɥM", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 213d7477dd..a645aa8924 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -3131,6 +3131,7 @@ "item.create.sturdy_sheet": "Sturdy Sheet", "item.create.super_glue": "Super Glue", "item.create.sweet_roll": "Sweet Roll", + "item.create.transmitter": "Transmitter", "item.create.tree_fertilizer": "Tree Fertilizer", "item.create.tree_fertilizer.tooltip.behaviour1": "Creates a tree _regardless_ of its _spacing conditions_", "item.create.tree_fertilizer.tooltip.condition1": "When used on a Sapling", diff --git a/src/generated/resources/assets/create/models/item/transmitter.json b/src/generated/resources/assets/create/models/item/transmitter.json new file mode 100644 index 0000000000..2fca934ff3 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/transmitter.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/transmitter" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/materials/transmitter.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/materials/transmitter.json new file mode 100644 index 0000000000..62aad811a4 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/materials/transmitter.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "tag": "forge:ingots/copper" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/materials/transmitter" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/materials/transmitter" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/display_link.json b/src/generated/resources/data/create/recipes/crafting/logistics/display_link.json index 9ee5795ace..66e5df6b98 100644 --- a/src/generated/resources/data/create/recipes/crafting/logistics/display_link.json +++ b/src/generated/resources/data/create/recipes/crafting/logistics/display_link.json @@ -2,11 +2,8 @@ "type": "minecraft:crafting_shaped", "category": "misc", "key": { - "A": { - "tag": "forge:plates/copper" - }, "C": { - "item": "minecraft:redstone_torch" + "item": "create:transmitter" }, "S": { "item": "create:brass_casing" @@ -14,8 +11,7 @@ }, "pattern": [ "C", - "S", - "A" + "S" ], "result": { "item": "create:display_link" diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/stock_link.json b/src/generated/resources/data/create/recipes/crafting/logistics/stock_link.json index 515a4d0e4b..cf862beb7c 100644 --- a/src/generated/resources/data/create/recipes/crafting/logistics/stock_link.json +++ b/src/generated/resources/data/create/recipes/crafting/logistics/stock_link.json @@ -2,19 +2,15 @@ "type": "minecraft:crafting_shaped", "category": "misc", "key": { - "A": { - "tag": "forge:plates/copper" - }, "B": { "item": "create:item_vault" }, "C": { - "item": "minecraft:redstone_torch" + "item": "create:transmitter" } }, "pattern": [ "C", - "A", "B" ], "result": { diff --git a/src/generated/resources/data/create/recipes/crafting/materials/transmitter.json b/src/generated/resources/data/create/recipes/crafting/materials/transmitter.json new file mode 100644 index 0000000000..773daf2aad --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/materials/transmitter.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "L": { + "tag": "forge:plates/copper" + }, + "N": { + "item": "minecraft:lightning_rod" + }, + "R": { + "tag": "forge:dusts/redstone" + } + }, + "pattern": [ + " N ", + "LLL", + " R " + ], + "result": { + "item": "create:transmitter" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 756353fe53..9911639da2 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -1915,7 +1915,7 @@ public class AllBlocks { .properties(p -> p.mapColor(MapColor.TERRACOTTA_BLUE) .sound(SoundType.NETHERITE_BLOCK)) .transform(pickaxeOnly()) - .blockstate((c, p) -> p.directionalBlock(c.get(), AssetLookup.forPowered(c, p))) + .blockstate((c, p) -> p.horizontalFaceBlock(c.get(), AssetLookup.forPowered(c, p))) .item(LogisticallyLinkedBlockItem::new) .transform(customItemModel("_", "block")) .register(); diff --git a/src/main/java/com/simibubi/create/AllItems.java b/src/main/java/com/simibubi/create/AllItems.java index 7d05a540ed..2b4795bf55 100644 --- a/src/main/java/com/simibubi/create/AllItems.java +++ b/src/main/java/com/simibubi/create/AllItems.java @@ -93,7 +93,7 @@ public class AllItems { STURDY_SHEET = taggedIngredient("sturdy_sheet", forgeItemTag("plates/obsidian"), PLATES.tag), PROPELLER = ingredient("propeller"), WHISK = ingredient("whisk"), BRASS_HAND = ingredient("brass_hand"), CRAFTER_SLOT_COVER = ingredient("crafter_slot_cover"), ELECTRON_TUBE = ingredient("electron_tube"), - PULP = ingredient("pulp"); + TRANSMITTER = ingredient("transmitter"), PULP = ingredient("pulp"); public static final ItemEntry CARDBOARD = REGISTRATE.item("cardboard", CombustibleItem::new) .tag(forgeItemTag("plates/cardboard")) diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java index 1a1bc9ad2a..468b24323f 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java @@ -204,6 +204,9 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity { if (prevChainPosition > chainPosition) continue; + if (!target.equals(port.connection)) + continue; + boolean notAtPositionYet = box.chainPosition < chainPosition; if (notAtPositionYet && anticipatePosition < chainPosition) continue; diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java index 8fdfdfdc39..71d54caf59 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java @@ -194,7 +194,7 @@ public class PackagerBlockEntity extends SmartBlockEntity { } if (AllBlocks.STOCK_LINK.has(adjacentState)) { - if (adjacentState.getValue(PackagerLinkBlock.FACING) != d) + if (PackagerLinkBlock.getConnectedDirection(adjacentState) != d) continue; if (!(level.getBlockEntity(worldPosition.relative(d)) instanceof PackagerLinkBlockEntity plbe)) continue; @@ -255,7 +255,7 @@ public class PackagerBlockEntity extends SmartBlockEntity { BlockState adjacentState = level.getBlockState(worldPosition.relative(d)); if (!AllBlocks.STOCK_LINK.has(adjacentState)) continue; - if (adjacentState.getValue(PackagerLinkBlock.FACING) != d) + if (PackagerLinkBlock.getConnectedDirection(adjacentState) != d) continue; return true; } diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlock.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlock.java index 55c883af39..a844752ec5 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlock.java @@ -4,7 +4,6 @@ import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllShapes; import com.simibubi.create.foundation.block.IBE; import com.simibubi.create.foundation.block.ProperWaterloggedBlock; -import com.simibubi.create.foundation.block.WrenchableDirectionalBlock; import net.createmod.catnip.utility.Iterate; import net.minecraft.core.BlockPos; @@ -16,10 +15,13 @@ import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.FaceAttachedHorizontalDirectionalBlock; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition.Builder; +import net.minecraft.world.level.block.state.properties.AttachFace; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.block.state.properties.BooleanProperty; import net.minecraft.world.level.material.FluidState; @@ -27,7 +29,7 @@ import net.minecraft.world.level.pathfinder.PathComputationType; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; -public class PackagerLinkBlock extends WrenchableDirectionalBlock +public class PackagerLinkBlock extends FaceAttachedHorizontalDirectionalBlock implements IBE, ProperWaterloggedBlock { public static final BooleanProperty POWERED = BlockStateProperties.POWERED; @@ -41,11 +43,24 @@ public class PackagerLinkBlock extends WrenchableDirectionalBlock @Override public BlockState getStateForPlacement(BlockPlaceContext context) { BlockPos pos = context.getClickedPos(); - Direction face = context.getClickedFace(); - BlockState placed = super.getStateForPlacement(context).setValue(FACING, face); + BlockState placed = super.getStateForPlacement(context); + if (placed == null) + return null; + if (placed.getValue(FACE) == AttachFace.FLOOR) + placed = placed.setValue(FACING, placed.getValue(FACING) + .getOpposite()); return withWater(placed.setValue(POWERED, getPower(placed, context.getLevel(), pos) > 0), context); } + public static Direction getConnectedDirection(BlockState state) { + return FaceAttachedHorizontalDirectionalBlock.getConnectedDirection(state); + } + + @Override + public boolean canSurvive(BlockState pState, LevelReader pLevel, BlockPos pPos) { + return true; + } + @Override public FluidState getFluidState(BlockState pState) { return fluidState(pState); @@ -75,7 +90,7 @@ public class PackagerLinkBlock extends WrenchableDirectionalBlock public static int getPower(BlockState state, Level worldIn, BlockPos pos) { int power = 0; for (Direction d : Iterate.directions) - if (d.getOpposite() != state.getValue(FACING)) + if (d.getOpposite() != getConnectedDirection(state)) power = Math.max(power, worldIn.getSignal(pos.relative(d), d)); return power; } @@ -93,12 +108,12 @@ public class PackagerLinkBlock extends WrenchableDirectionalBlock @Override public VoxelShape getShape(BlockState pState, BlockGetter pLevel, BlockPos pPos, CollisionContext pContext) { - return AllShapes.STOCK_LINK.get(pState.getValue(FACING)); + return AllShapes.STOCK_LINK.get(getConnectedDirection(pState)); } @Override protected void createBlockStateDefinition(Builder builder) { - super.createBlockStateDefinition(builder.add(POWERED, WATERLOGGED)); + super.createBlockStateDefinition(builder.add(POWERED, WATERLOGGED, FACE, FACING)); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java index f9c5be1422..20b8db6ef2 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java @@ -17,7 +17,6 @@ import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour import net.createmod.catnip.utility.Pair; import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntityType; @@ -101,8 +100,7 @@ public class PackagerLinkBlockEntity extends LinkWithBulbBlockEntity { BlockState blockState = getBlockState(); if (behaviour.redstonePower == 15) return null; - BlockPos source = worldPosition.relative(blockState.getOptionalValue(PackagerLinkBlock.FACING) - .orElse(Direction.UP) + BlockPos source = worldPosition.relative(PackagerLinkBlock.getConnectedDirection(blockState) .getOpposite()); if (!(level.getBlockEntity(source) instanceof PackagerBlockEntity packager)) return null; diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java index 4539a713be..2d30fe8feb 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java @@ -166,6 +166,14 @@ public class StandardRecipeGen extends CreateRecipeProvider { .pattern("L") .pattern("N")), + TRANSMITTER = create(AllItems.TRANSMITTER).unlockedByTag(I::copper) + .viaShaped(b -> b.define('L', I.copperSheet()) + .define('N', Items.LIGHTNING_ROD) + .define('R', I.redstone()) + .pattern(" N ") + .pattern("LLL") + .pattern(" R ")), + ROSE_QUARTZ = create(AllItems.ROSE_QUARTZ).unlockedBy(() -> Items.REDSTONE) .viaShapeless(b -> b.requires(Tags.Items.GEMS_QUARTZ) .requires(Ingredient.of(I.redstone()), 8)), @@ -323,7 +331,7 @@ public class StandardRecipeGen extends CreateRecipeProvider { .pattern("C") .pattern("S") .pattern("I")), - + MECHANICAL_PISTON = create(AllBlocks.MECHANICAL_PISTON).unlockedBy(I::andesiteCasing) .viaShaped(b -> b.define('B', ItemTags.WOODEN_SLABS) .define('C', I.andesiteCasing()) @@ -1009,7 +1017,7 @@ public class StandardRecipeGen extends CreateRecipeProvider { .define('S', I.stone()) .pattern("RCT") .pattern("SSS")), - + PULSE_TIMER = create(AllBlocks.PULSE_TIMER).unlockedByTag(I::redstone) .viaShaped(b -> b.define('T', Blocks.REDSTONE_TORCH) .define('C', I.brassSheet()) @@ -1041,8 +1049,8 @@ public class StandardRecipeGen extends CreateRecipeProvider { .define('S', I.brassCasing()) .pattern("C") .pattern("S")), - - ITEM_HATCH = create(AllBlocks.ITEM_HATCH).unlockedBy(I::andesiteAlloy) + + ITEM_HATCH = create(AllBlocks.ITEM_HATCH).unlockedBy(I::andesiteAlloy) .viaShapeless(b -> b.requires(I.andesiteAlloy()) .requires(Items.IRON_TRAPDOOR)), @@ -1054,7 +1062,7 @@ public class StandardRecipeGen extends CreateRecipeProvider { .pattern(" C ")), PACKAGER_CYCLE = conversionCycle(ImmutableList.of(AllBlocks.PACKAGER, AllBlocks.REPACKAGER)), - + PACKAGE_FROGPORT = create(AllBlocks.PACKAGE_FROGPORT).unlockedBy(I::cardboard) .viaShaped(b -> b.define('C', I.andesiteAlloy()) .define('B', Tags.Items.SLIMEBALLS) @@ -1064,11 +1072,9 @@ public class StandardRecipeGen extends CreateRecipeProvider { .pattern("C")), STOCK_LINK = create(AllBlocks.STOCK_LINK).unlockedBy(I::cardboard) - .viaShaped(b -> b.define('C', Items.REDSTONE_TORCH) + .viaShaped(b -> b.define('C', AllItems.TRANSMITTER.get()) .define('B', I.vault()) - .define('A', I.copperSheet()) .pattern("C") - .pattern("A") .pattern("B")), STOCK_TICKER = create(AllBlocks.STOCK_TICKER).unlockedBy(I::cardboard) @@ -1101,12 +1107,10 @@ public class StandardRecipeGen extends CreateRecipeProvider { FACTORY_PANEL_CLEAR = clearData(AllBlocks.FACTORY_GAUGE), DISPLAY_LINK = create(AllBlocks.DISPLAY_LINK).unlockedBy(I::brassCasing) - .viaShaped(b -> b.define('C', Blocks.REDSTONE_TORCH) - .define('A', I.copperSheet()) + .viaShaped(b -> b.define('C', AllItems.TRANSMITTER.get()) .define('S', I.brassCasing()) .pattern("C") - .pattern("S") - .pattern("A")) + .pattern("S")) ; diff --git a/src/main/resources/assets/create/textures/item/transmitter.png b/src/main/resources/assets/create/textures/item/transmitter.png new file mode 100644 index 0000000000000000000000000000000000000000..cee6b9942ec0eee7bed90e6b3701333602cf5a58 GIT binary patch literal 526 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}x0G|-oEes5285sUDF#Ny4@V}qo|NrU#|No!ks=1zl;m^#bgHdMBYr=9( z6n`JyHpkDf%TW`kFYAa)D3B5?3GxdDDnM5`Y+_A4a2D$^Zw@+##ak;F)FDETK^A+u`njxgN@xNA^)Zmw literal 0 HcmV?d00001 From 6e57e1eb72fbf116dc39d90bb01bc26139d109b0 Mon Sep 17 00:00:00 2001 From: Kryppers <65094918+Kryppers@users.noreply.github.com> Date: Sat, 28 Dec 2024 15:53:51 +0000 Subject: [PATCH 219/515] keep on keepin' on. model/texture/fixes for whistles, control blocks and tablecloths --- .../block/contraption_controls/block.json | 19 +++++++++-------- .../block/contraption_controls/item.json | 19 +++++++++-------- .../models/block/controls/block_closed.json | 20 +++++++++--------- .../models/block/controls/block_open.json | 20 +++++++++--------- .../models/block/controls/block_virtual.json | 20 +++++++++--------- .../create/models/block/controls/item.json | 15 +++++++------ .../steam_whistle/block_large_floor.json | 2 +- .../block/steam_whistle/block_large_wall.json | 2 +- .../steam_whistle/block_medium_floor.json | 2 +- .../steam_whistle/block_medium_wall.json | 2 +- .../steam_whistle/block_small_floor.json | 2 +- .../block/steam_whistle/block_small_wall.json | 2 +- .../models/block/steam_whistle/item.json | 2 +- .../block/table_cloth/price_tag_side.json | 6 +++--- .../block/table_cloth/price_tag_top.json | 4 ++-- .../textures/block/contraption_controls.png | Bin 460 -> 1182 bytes .../block/contraption_controls_frame.png | Bin 1378 -> 1419 bytes .../assets/create/textures/block/controls.png | Bin 585 -> 1502 bytes .../create/textures/block/controls_frame.png | Bin 1056 -> 1107 bytes .../assets/create/textures/block/engine.png | Bin 7143 -> 4024 bytes .../create/textures/block/pipes_connected.png | Bin 809 -> 808 bytes .../textures/block/table_cloth/andesite.png | Bin 735 -> 2917 bytes .../textures/block/table_cloth/brass.png | Bin 695 -> 3301 bytes .../textures/block/table_cloth/copper.png | Bin 685 -> 3325 bytes .../textures/block/table_cloth/price_tag.png | Bin 222 -> 291 bytes 25 files changed, 70 insertions(+), 67 deletions(-) diff --git a/src/main/resources/assets/create/models/block/contraption_controls/block.json b/src/main/resources/assets/create/models/block/contraption_controls/block.json index e6fb5d0d95..6574460079 100644 --- a/src/main/resources/assets/create/models/block/contraption_controls/block.json +++ b/src/main/resources/assets/create/models/block/contraption_controls/block.json @@ -11,7 +11,7 @@ "to": [16, 16, 16], "faces": { "north": {"uv": [0, 9, 1, 16], "texture": "#4"}, - "east": {"uv": [13, 0, 8, 7], "texture": "#4"}, + "east": {"uv": [16, 0, 11, 7], "texture": "#4"}, "south": {"uv": [7, 0, 8, 7], "texture": "#4"}, "west": {"uv": [16, 9, 11, 16], "texture": "#4"}, "up": {"uv": [0, 0, 1, 5], "rotation": 180, "texture": "#1_7"}, @@ -35,7 +35,7 @@ "north": {"uv": [7, 9, 8, 16], "texture": "#4"}, "east": {"uv": [11, 9, 16, 16], "texture": "#4"}, "south": {"uv": [0, 0, 1, 7], "texture": "#4"}, - "west": {"uv": [8, 0, 13, 7], "texture": "#4"}, + "west": {"uv": [11, 0, 16, 7], "texture": "#4"}, "up": {"uv": [7, 0, 8, 5], "rotation": 180, "texture": "#1_7"}, "down": {"uv": [7, 11, 8, 16], "rotation": 180, "texture": "#1_7"} } @@ -67,15 +67,16 @@ } }, { - "from": [0, 0, 0], + "from": [0, 0, 4], "to": [16, 2, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 4]}, "faces": { - "north": {"uv": [0, 0, 16, 2], "texture": "#particle"}, - "east": {"uv": [0, 0, 16, 2], "texture": "#particle"}, - "south": {"uv": [0, 0, 16, 2], "texture": "#particle"}, - "west": {"uv": [0, 0, 16, 2], "texture": "#particle"}, - "up": {"uv": [0, 0, 16, 16], "texture": "#particle"}, - "down": {"uv": [0, 0, 16, 16], "texture": "#particle"} + "north": {"uv": [0, 7, 8, 8], "texture": "#4"}, + "east": {"uv": [16, 7, 10, 8], "texture": "#4"}, + "south": {"uv": [0, 7, 8, 8], "texture": "#4"}, + "west": {"uv": [10, 7, 16, 8], "texture": "#4"}, + "up": {"uv": [8, 10, 16, 16], "texture": "#1_7"}, + "down": {"uv": [16, 16, 8, 10], "texture": "#1_7"} } } ], diff --git a/src/main/resources/assets/create/models/block/contraption_controls/item.json b/src/main/resources/assets/create/models/block/contraption_controls/item.json index cd7f51f565..b2b0603903 100644 --- a/src/main/resources/assets/create/models/block/contraption_controls/item.json +++ b/src/main/resources/assets/create/models/block/contraption_controls/item.json @@ -12,7 +12,7 @@ "rotation": {"angle": 0, "axis": "y", "origin": [0, 2, 0]}, "faces": { "north": {"uv": [0, 9, 1, 16], "texture": "#4"}, - "east": {"uv": [13, 0, 8, 7], "texture": "#4"}, + "east": {"uv": [16, 0, 11, 7], "texture": "#4"}, "south": {"uv": [7, 0, 8, 7], "texture": "#4"}, "west": {"uv": [16, 9, 11, 16], "texture": "#4"}, "up": {"uv": [0, 0, 1, 5], "rotation": 180, "texture": "#1_7"}, @@ -37,7 +37,7 @@ "north": {"uv": [7, 9, 8, 16], "texture": "#4"}, "east": {"uv": [11, 9, 16, 16], "texture": "#4"}, "south": {"uv": [0, 0, 1, 7], "texture": "#4"}, - "west": {"uv": [8, 0, 13, 7], "texture": "#4"}, + "west": {"uv": [11, 0, 16, 7], "texture": "#4"}, "up": {"uv": [7, 0, 8, 5], "rotation": 180, "texture": "#1_7"}, "down": {"uv": [7, 11, 8, 16], "rotation": 180, "texture": "#1_7"} } @@ -90,15 +90,16 @@ } }, { - "from": [0, 0, 0], + "from": [0, 0, 4], "to": [16, 2, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 4]}, "faces": { - "north": {"uv": [0, 0, 16, 2], "texture": "#particle"}, - "east": {"uv": [0, 0, 16, 2], "texture": "#particle"}, - "south": {"uv": [0, 0, 16, 2], "texture": "#particle"}, - "west": {"uv": [0, 0, 16, 2], "texture": "#particle"}, - "up": {"uv": [0, 0, 16, 16], "texture": "#particle"}, - "down": {"uv": [0, 0, 16, 16], "texture": "#particle"} + "north": {"uv": [0, 7, 8, 8], "texture": "#4"}, + "east": {"uv": [16, 7, 10, 8], "texture": "#4"}, + "south": {"uv": [0, 7, 8, 8], "texture": "#4"}, + "west": {"uv": [10, 7, 16, 8], "texture": "#4"}, + "up": {"uv": [8, 10, 16, 16], "texture": "#1_7"}, + "down": {"uv": [16, 16, 8, 10], "texture": "#1_7"} } } ], diff --git a/src/main/resources/assets/create/models/block/controls/block_closed.json b/src/main/resources/assets/create/models/block/controls/block_closed.json index de8d33a474..8b42b4eefd 100644 --- a/src/main/resources/assets/create/models/block/controls/block_closed.json +++ b/src/main/resources/assets/create/models/block/controls/block_closed.json @@ -1,7 +1,6 @@ { "credit": "Made with Blockbench", "textures": { - "3": "create:block/train_controller_base", "4": "create:block/controls_frame", "1_7": "create:block/controls", "particle": "create:block/bogey/particle" @@ -13,7 +12,7 @@ "rotation": {"angle": 0, "axis": "y", "origin": [0, 2, 0]}, "faces": { "north": {"uv": [0, 9, 1, 16], "texture": "#4"}, - "east": {"uv": [13, 0, 8, 7], "texture": "#4"}, + "east": {"uv": [16, 0, 11, 7], "texture": "#4"}, "south": {"uv": [7, 0, 8, 7], "texture": "#4"}, "west": {"uv": [16, 9, 11, 16], "texture": "#4"}, "up": {"uv": [0, 0, 1, 5], "rotation": 180, "texture": "#1_7"}, @@ -38,7 +37,7 @@ "north": {"uv": [7, 9, 8, 16], "texture": "#4"}, "east": {"uv": [11, 9, 16, 16], "texture": "#4"}, "south": {"uv": [0, 0, 1, 7], "texture": "#4"}, - "west": {"uv": [8, 0, 13, 7], "texture": "#4"}, + "west": {"uv": [11, 0, 16, 7], "texture": "#4"}, "up": {"uv": [7, 0, 8, 5], "rotation": 180, "texture": "#1_7"}, "down": {"uv": [7, 11, 8, 16], "rotation": 180, "texture": "#1_7"} } @@ -64,15 +63,16 @@ } }, { - "from": [0, 0, 0], + "from": [0, 0, 4], "to": [16, 2, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 4]}, "faces": { - "north": {"uv": [0, 0, 16, 2], "texture": "#3"}, - "east": {"uv": [0, 0, 16, 2], "texture": "#3"}, - "south": {"uv": [0, 0, 16, 2], "texture": "#3"}, - "west": {"uv": [0, 0, 16, 2], "texture": "#3"}, - "up": {"uv": [0, 0, 16, 16], "texture": "#3"}, - "down": {"uv": [0, 0, 16, 16], "texture": "#3"} + "north": {"uv": [0, 7, 8, 8], "texture": "#4"}, + "east": {"uv": [16, 7, 10, 8], "texture": "#4"}, + "south": {"uv": [0, 7, 8, 8], "texture": "#4"}, + "west": {"uv": [10, 7, 16, 8], "texture": "#4"}, + "up": {"uv": [8, 10, 16, 16], "texture": "#1_7"}, + "down": {"uv": [8, 16, 16, 10], "texture": "#1_7"} } } ], diff --git a/src/main/resources/assets/create/models/block/controls/block_open.json b/src/main/resources/assets/create/models/block/controls/block_open.json index cf487782cb..8bdfc618e2 100644 --- a/src/main/resources/assets/create/models/block/controls/block_open.json +++ b/src/main/resources/assets/create/models/block/controls/block_open.json @@ -1,7 +1,6 @@ { "credit": "Made with Blockbench", "textures": { - "3": "create:block/train_controller_base", "4": "create:block/controls_frame", "1_7": "create:block/controls", "particle": "create:block/bogey/particle" @@ -13,7 +12,7 @@ "rotation": {"angle": 0, "axis": "y", "origin": [0, 2, 0]}, "faces": { "north": {"uv": [0, 9, 1, 16], "texture": "#4"}, - "east": {"uv": [13, 0, 8, 7], "texture": "#4"}, + "east": {"uv": [16, 0, 11, 7], "texture": "#4"}, "south": {"uv": [7, 0, 8, 7], "texture": "#4"}, "west": {"uv": [16, 9, 11, 16], "texture": "#4"}, "up": {"uv": [0, 0, 1, 5], "rotation": 180, "texture": "#1_7"}, @@ -38,7 +37,7 @@ "north": {"uv": [7, 9, 8, 16], "texture": "#4"}, "east": {"uv": [11, 9, 16, 16], "texture": "#4"}, "south": {"uv": [0, 0, 1, 7], "texture": "#4"}, - "west": {"uv": [8, 0, 13, 7], "texture": "#4"}, + "west": {"uv": [11, 0, 16, 7], "texture": "#4"}, "up": {"uv": [7, 0, 8, 5], "rotation": 180, "texture": "#1_7"}, "down": {"uv": [7, 11, 8, 16], "rotation": 180, "texture": "#1_7"} } @@ -64,15 +63,16 @@ } }, { - "from": [0, 0, 0], + "from": [0, 0, 4], "to": [16, 2, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 4]}, "faces": { - "north": {"uv": [0, 0, 16, 2], "texture": "#3"}, - "east": {"uv": [0, 0, 16, 2], "texture": "#3"}, - "south": {"uv": [0, 0, 16, 2], "texture": "#3"}, - "west": {"uv": [0, 0, 16, 2], "texture": "#3"}, - "up": {"uv": [0, 0, 16, 16], "texture": "#3"}, - "down": {"uv": [0, 0, 16, 16], "texture": "#3"} + "north": {"uv": [0, 7, 8, 8], "texture": "#4"}, + "east": {"uv": [16, 7, 10, 8], "texture": "#4"}, + "south": {"uv": [0, 7, 8, 8], "texture": "#4"}, + "west": {"uv": [10, 7, 16, 8], "texture": "#4"}, + "up": {"uv": [8, 10, 16, 16], "texture": "#1_7"}, + "down": {"uv": [8, 16, 16, 10], "texture": "#1_7"} } } ], diff --git a/src/main/resources/assets/create/models/block/controls/block_virtual.json b/src/main/resources/assets/create/models/block/controls/block_virtual.json index 6e2b4c4701..7bda285b6a 100644 --- a/src/main/resources/assets/create/models/block/controls/block_virtual.json +++ b/src/main/resources/assets/create/models/block/controls/block_virtual.json @@ -1,7 +1,6 @@ { "credit": "Made with Blockbench", "textures": { - "3": "create:block/train_controller_base", "4": "create:block/controls_frame", "1_7": "create:block/controls", "particle": "create:block/bogey/particle" @@ -47,7 +46,7 @@ "rotation": {"angle": 0, "axis": "y", "origin": [0, 2, 0]}, "faces": { "north": {"uv": [0, 9, 1, 16], "texture": "#4"}, - "east": {"uv": [13, 0, 8, 7], "texture": "#4"}, + "east": {"uv": [16, 0, 11, 7], "texture": "#4"}, "south": {"uv": [7, 0, 8, 7], "texture": "#4"}, "west": {"uv": [16, 9, 11, 16], "texture": "#4"}, "up": {"uv": [0, 0, 1, 5], "rotation": 180, "texture": "#1_7"}, @@ -72,7 +71,7 @@ "north": {"uv": [7, 9, 8, 16], "texture": "#4"}, "east": {"uv": [11, 9, 16, 16], "texture": "#4"}, "south": {"uv": [0, 0, 1, 7], "texture": "#4"}, - "west": {"uv": [8, 0, 13, 7], "texture": "#4"}, + "west": {"uv": [11, 0, 16, 7], "texture": "#4"}, "up": {"uv": [7, 0, 8, 5], "rotation": 180, "texture": "#1_7"}, "down": {"uv": [7, 11, 8, 16], "rotation": 180, "texture": "#1_7"} } @@ -98,15 +97,16 @@ } }, { - "from": [0, 0, 0], + "from": [0, 0, 4], "to": [16, 2, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 4]}, "faces": { - "north": {"uv": [0, 0, 16, 2], "texture": "#3"}, - "east": {"uv": [0, 0, 16, 2], "texture": "#3"}, - "south": {"uv": [0, 0, 16, 2], "texture": "#3"}, - "west": {"uv": [0, 0, 16, 2], "texture": "#3"}, - "up": {"uv": [0, 0, 16, 16], "texture": "#3"}, - "down": {"uv": [0, 0, 16, 16], "texture": "#3"} + "north": {"uv": [0, 7, 8, 8], "texture": "#4"}, + "east": {"uv": [16, 7, 10, 8], "texture": "#4"}, + "south": {"uv": [0, 7, 8, 8], "texture": "#4"}, + "west": {"uv": [10, 7, 16, 8], "texture": "#4"}, + "up": {"uv": [8, 10, 16, 16], "texture": "#1_7"}, + "down": {"uv": [8, 16, 16, 10], "texture": "#1_7"} } } ] diff --git a/src/main/resources/assets/create/models/block/controls/item.json b/src/main/resources/assets/create/models/block/controls/item.json index 70eebc097e..5e84fb86a4 100644 --- a/src/main/resources/assets/create/models/block/controls/item.json +++ b/src/main/resources/assets/create/models/block/controls/item.json @@ -47,7 +47,7 @@ "rotation": {"angle": 0, "axis": "y", "origin": [0, 2, 0]}, "faces": { "north": {"uv": [0, 9, 1, 16], "texture": "#4"}, - "east": {"uv": [13, 0, 8, 7], "texture": "#4"}, + "east": {"uv": [16, 0, 11, 7], "texture": "#4"}, "south": {"uv": [7, 0, 8, 7], "texture": "#4"}, "west": {"uv": [16, 9, 11, 16], "texture": "#4"}, "up": {"uv": [0, 0, 1, 5], "rotation": 180, "texture": "#1_7"}, @@ -72,7 +72,7 @@ "north": {"uv": [7, 9, 8, 16], "texture": "#4"}, "east": {"uv": [11, 9, 16, 16], "texture": "#4"}, "south": {"uv": [0, 0, 1, 7], "texture": "#4"}, - "west": {"uv": [8, 0, 13, 7], "texture": "#4"}, + "west": {"uv": [11, 0, 16, 7], "texture": "#4"}, "up": {"uv": [7, 0, 8, 5], "rotation": 180, "texture": "#1_7"}, "down": {"uv": [7, 11, 8, 16], "rotation": 180, "texture": "#1_7"} } @@ -98,15 +98,16 @@ } }, { - "from": [0, 0, 0], + "from": [0, 0, 4], "to": [16, 2, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 4]}, "faces": { "north": {"uv": [0, 0, 16, 2], "texture": "#3"}, - "east": {"uv": [0, 0, 16, 2], "texture": "#3"}, + "east": {"uv": [16, 7, 10, 8], "texture": "#4"}, "south": {"uv": [0, 0, 16, 2], "texture": "#3"}, - "west": {"uv": [0, 0, 16, 2], "texture": "#3"}, - "up": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#3"}, - "down": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#3"} + "west": {"uv": [10, 7, 16, 8], "texture": "#4"}, + "up": {"uv": [8, 10, 16, 16], "texture": "#1_7"}, + "down": {"uv": [16, 16, 8, 10], "texture": "#1_7"} } } ], diff --git a/src/main/resources/assets/create/models/block/steam_whistle/block_large_floor.json b/src/main/resources/assets/create/models/block/steam_whistle/block_large_floor.json index 554ce39a23..94080c1d1c 100644 --- a/src/main/resources/assets/create/models/block/steam_whistle/block_large_floor.json +++ b/src/main/resources/assets/create/models/block/steam_whistle/block_large_floor.json @@ -17,7 +17,7 @@ "south": {"uv": [1, 13, 15, 16], "texture": "#2"}, "west": {"uv": [1, 13, 15, 16], "texture": "#2"}, "up": {"uv": [1, 0, 15, 14], "texture": "#2"}, - "down": {"uv": [8.5, 8.5, 15.5, 15.5], "texture": "#1"} + "down": {"uv": [0.5, 8.5, 7.5, 15.5], "texture": "#1"} } }, { diff --git a/src/main/resources/assets/create/models/block/steam_whistle/block_large_wall.json b/src/main/resources/assets/create/models/block/steam_whistle/block_large_wall.json index 140012a727..a037884ba2 100644 --- a/src/main/resources/assets/create/models/block/steam_whistle/block_large_wall.json +++ b/src/main/resources/assets/create/models/block/steam_whistle/block_large_wall.json @@ -15,7 +15,7 @@ "faces": { "north": {"uv": [1, 0, 15, 14], "rotation": 180, "texture": "#2"}, "east": {"uv": [1, 13, 15, 16], "rotation": 90, "texture": "#2"}, - "south": {"uv": [8.5, 8.5, 15.5, 15.5], "texture": "#1"}, + "south": {"uv": [0.5, 8.5, 7.5, 15.5], "texture": "#1"}, "west": {"uv": [1, 13, 15, 16], "rotation": 270, "texture": "#2"}, "up": {"uv": [1, 13, 15, 16], "texture": "#2"}, "down": {"uv": [1, 13, 15, 16], "rotation": 180, "texture": "#2"} diff --git a/src/main/resources/assets/create/models/block/steam_whistle/block_medium_floor.json b/src/main/resources/assets/create/models/block/steam_whistle/block_medium_floor.json index 720041aa91..b23bce0e4e 100644 --- a/src/main/resources/assets/create/models/block/steam_whistle/block_medium_floor.json +++ b/src/main/resources/assets/create/models/block/steam_whistle/block_medium_floor.json @@ -17,7 +17,7 @@ "south": {"uv": [1, 13, 15, 16], "texture": "#2"}, "west": {"uv": [1, 13, 15, 16], "texture": "#2"}, "up": {"uv": [1, 0, 15, 14], "texture": "#2"}, - "down": {"uv": [8.5, 8.5, 15.5, 15.5], "texture": "#1"} + "down": {"uv": [0.5, 8.5, 7.5, 15.5], "texture": "#1"} } }, { diff --git a/src/main/resources/assets/create/models/block/steam_whistle/block_medium_wall.json b/src/main/resources/assets/create/models/block/steam_whistle/block_medium_wall.json index 5406f072f8..17468966d7 100644 --- a/src/main/resources/assets/create/models/block/steam_whistle/block_medium_wall.json +++ b/src/main/resources/assets/create/models/block/steam_whistle/block_medium_wall.json @@ -15,7 +15,7 @@ "faces": { "north": {"uv": [1, 0, 15, 14], "rotation": 180, "texture": "#2"}, "east": {"uv": [1, 13, 15, 16], "rotation": 90, "texture": "#2"}, - "south": {"uv": [8.5, 8.5, 15.5, 15.5], "texture": "#1"}, + "south": {"uv": [0.5, 8.5, 7.5, 15.5], "texture": "#1"}, "west": {"uv": [1, 13, 15, 16], "rotation": 270, "texture": "#2"}, "up": {"uv": [1, 13, 15, 16], "texture": "#2"}, "down": {"uv": [1, 13, 15, 16], "rotation": 180, "texture": "#2"} diff --git a/src/main/resources/assets/create/models/block/steam_whistle/block_small_floor.json b/src/main/resources/assets/create/models/block/steam_whistle/block_small_floor.json index 89a37f9c64..99205b611e 100644 --- a/src/main/resources/assets/create/models/block/steam_whistle/block_small_floor.json +++ b/src/main/resources/assets/create/models/block/steam_whistle/block_small_floor.json @@ -17,7 +17,7 @@ "south": {"uv": [1, 13, 15, 16], "texture": "#2"}, "west": {"uv": [1, 13, 15, 16], "texture": "#2"}, "up": {"uv": [1, 0, 15, 14], "texture": "#2"}, - "down": {"uv": [8.5, 8.5, 15.5, 15.5], "texture": "#1"} + "down": {"uv": [0.5, 8.5, 7.5, 15.5], "texture": "#1"} } }, { diff --git a/src/main/resources/assets/create/models/block/steam_whistle/block_small_wall.json b/src/main/resources/assets/create/models/block/steam_whistle/block_small_wall.json index 6540fb7255..649e7196a1 100644 --- a/src/main/resources/assets/create/models/block/steam_whistle/block_small_wall.json +++ b/src/main/resources/assets/create/models/block/steam_whistle/block_small_wall.json @@ -15,7 +15,7 @@ "faces": { "north": {"uv": [1, 0, 15, 14], "rotation": 180, "texture": "#2"}, "east": {"uv": [1, 13, 15, 16], "rotation": 90, "texture": "#2"}, - "south": {"uv": [8.5, 8.5, 15.5, 15.5], "texture": "#1"}, + "south": {"uv": [0.5, 8.5, 7.5, 15.5], "texture": "#1"}, "west": {"uv": [1, 13, 15, 16], "rotation": 270, "texture": "#2"}, "up": {"uv": [1, 13, 15, 16], "texture": "#2"}, "down": {"uv": [1, 13, 15, 16], "rotation": 180, "texture": "#2"} diff --git a/src/main/resources/assets/create/models/block/steam_whistle/item.json b/src/main/resources/assets/create/models/block/steam_whistle/item.json index 7e9e29a7c8..8be2aa4f0d 100644 --- a/src/main/resources/assets/create/models/block/steam_whistle/item.json +++ b/src/main/resources/assets/create/models/block/steam_whistle/item.json @@ -17,7 +17,7 @@ "south": {"uv": [1, 13, 15, 16], "texture": "#2"}, "west": {"uv": [1, 13, 15, 16], "texture": "#2"}, "up": {"uv": [1, 0, 15, 14], "texture": "#2"}, - "down": {"uv": [8.5, 8.5, 15.5, 15.5], "texture": "#1"} + "down": {"uv": [0.5, 8.5, 7.5, 15.5], "texture": "#1"} } }, { diff --git a/src/main/resources/assets/create/models/block/table_cloth/price_tag_side.json b/src/main/resources/assets/create/models/block/table_cloth/price_tag_side.json index ea0c459ca7..92023a83f5 100644 --- a/src/main/resources/assets/create/models/block/table_cloth/price_tag_side.json +++ b/src/main/resources/assets/create/models/block/table_cloth/price_tag_side.json @@ -8,11 +8,11 @@ "elements": [ { "from": [1, -5.75, -1.25], - "to": [7, 1.25, -0.25], + "to": [7, 1.25, 0.75], "rotation": {"angle": 0, "axis": "y", "origin": [5, -0.75, -2.25]}, "faces": { - "north": {"uv": [0, 0, 6, 7], "texture": "#1"}, - "up": {"uv": [0, 0, 6, 1], "texture": "#1"} + "north": {"uv": [0, 1, 6, 8], "texture": "#1"}, + "up": {"uv": [0, 0, 6, 2], "texture": "#1"} } } ], diff --git a/src/main/resources/assets/create/models/block/table_cloth/price_tag_top.json b/src/main/resources/assets/create/models/block/table_cloth/price_tag_top.json index edbfa3dd42..4a1b50513d 100644 --- a/src/main/resources/assets/create/models/block/table_cloth/price_tag_top.json +++ b/src/main/resources/assets/create/models/block/table_cloth/price_tag_top.json @@ -11,8 +11,8 @@ "to": [11, 1.25, 4.75], "rotation": {"angle": 0, "axis": "y", "origin": [5, 0.25, -1.25]}, "faces": { - "north": {"uv": [7, 1, 13, 2], "texture": "#1"}, - "up": {"uv": [7, 1, 13, 7], "texture": "#1"} + "north": {"uv": [0, 1, 6, 2], "texture": "#1"}, + "up": {"uv": [0, 2, 6, 8], "texture": "#1"} } } ], diff --git a/src/main/resources/assets/create/textures/block/contraption_controls.png b/src/main/resources/assets/create/textures/block/contraption_controls.png index 626874b1240ce78a39671583b6836857d0d56f42..9c66ffd2147bd78aa6255f3109c79e1f60b8aac9 100644 GIT binary patch delta 1173 zcmV;G1Zw-t1D*+x8Gi-<0047(dh`GQ00v@9M??Vs0RI60puMM)00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF;2%91kKR=XFK~000ClNkl)A<@!gC5l8V3Pi&nphIX8hysBYAyMrgpnsvFSbBuC6%x`yO+k@t z9NV!H$1|Sy*dB`Oxv}G9QDg%JM;dwN`1sDb=YHp5ZTH?@-e?F01CK^SVA(ct6sb>O zL08!BKW*{&r=K;JkV>N=cX{eM><15h@~)NF$wN*9a^{Wu--{-@u-6ISDZa0J_%Yt(F=?HATCD*1w; z7i0jmjt6*tjBo_2kP?9BdZby#-iKck#R*=J(LD|Df=peep#$*VN8e)T6+G8ljRTf# z%X6K;qlfp2l8ii;5eVayFix>dgCvy^c=Yf-`6MUse19yc2+D556noCXnon6S29 zCkr$5s*Y(^0dRXhNfMHU8Ge|MT({)PeLpJBkVZ90c-#Xy{-ih<&~ zjDgN!do>PpJI6B5rwoK~su*w+s9FYLoO0#`blg-iFm#6uyyZbuRc!ao?fm&>otkaX zbn1lBh<`YZ=ZveCffppSx@Y|OYfD>21S;x` z2v;Sg;--MG@A_93qA*SsgsT#Dj_wim4!m27?>$U{|^Q(7NUQJfq#6GQ(tqGfq&+zXaCHluvrxY|G6x^ zi(;m{I5*DDl*L>L%<1-@wpjWwmzgO6D!cdg^4H#YozFk{>{`+I;=z~s?@xYH3qStu z0j611={n0%q5Gq%E8WJc@5n4@Gz9IV*0p!uK5Efu$eBPmg4-Jnxv-G6!F1xevgtJGa$r z;Fz*w>eHQWIkJ^EojN@)r0LYb^>GtuPPwQ69JNmX&}Z_yT$UvwPR_@!@pwWIMr7GY zzF_k?ijnRhP8VAD>}M8c#7U|g>-SHHqkrfe!WVDIkW41|m0^#f6x)^yo}9XKbQdqP zO!>WK8mfPYnyz$(G@I+hQ7j!Oc3y<}SyDJrE|-X+lsJkAJYVf}wv1b*LB~zmocVp> znCbUT+FJYH-_9aru+3p4tzuk_v10KKZycYQf+#VOXbCRB>EEq?%; z4f9nmm!OW6-OwGf-y2|>RorP1dtRuzY0r~s=$hvvKK+w(2(xTNr+cc7Vivqv0MD~z zH0Mmef5Izoe=uj?@1Lkto4qfdi>j#I-Py@6hX1lClu8;|HYQC+7)AwMFH75TMni~c n!AUU9`F~57=?XdOcKHhcD5%IYbPhb+00000NkvXXu0mjffqE=~ delta 445 zcmV;u0Yd(s3CshK8Gi!+002a!ipBr{0C-SLR7C&)0JpcXsI#k@q@9nJk%EVWh-Eow zY-oaEI)Pw0U}Il;S~PiCGk91wSX)?dQZ8&yEl^WYW=bhxOD<(eC`m|2UPB~WL?lN> zM_WN8L_p4IDbMf7A`I{KPeNiPj>YH z0004WQchClu=wGN#Pnv3S*APMPWXWf*r7y@+JWX`MrQ z%r2BwBIu32cSgIov`&Q(y!Z2l_aPWU(Ape0V>}^v?KV!#>=MDu#+_(S2!5M=pf%B8 nLO2^^Byox(FQR+br^oyP7egP6tB0!_00000NkvXXu0mjfDO$A6OfDN-v+R{Vi9 zjuGdhM$;Z_pNc+04+(;v`T{)$D2f2R6gd}tg8)SzAV?1FA@5KpND=e{4cw%5BHOVk za!E=eDOo+pq$69B131UdWvSWO|IF_GXJ=HnaqDK^aRi?R*4I=rUW+ zlRUitpuh;pa5EW&>v(zniJggJ=n5rWrB*2ckfdEi#iXbi z7%B+cq~8ZCN|-9bl&)at3US;;*v8lZ97iB3f|9N>TPuo%sLV}Fjop08*qnQ^O=08lbC0Q~p} zs1qlsC3Q%jwo(w|og1b}B*Rm&i#b@fP#+jo^rOHsT?UZNO_EN#jV0_;v6VmC3n&W< z{N;IQy3Ri?B#I#F=_I`vw>QvXo#Tlcqv<+s4@wIrI{^GPHV9D>>`YxEZ0RSkOJ$P| zpuBpubANcuF@~-WeIM5y?L?=EoOl9;X(D||CyqyAH<4JDj(S8`D-wCq8nXwo){u&%4MZY{m6kgsm9YZvo)?ErO`S zpNW^hRsfxY9$PzJZWFd*e&2XAk%X4830pC*wtdu+N~@C+gu~d1bUtQwakv^5M^wY& zv43iqt%2ubtDvX|E`D|+$4P+cd4_P_do^5HTjlEYYuKVpC<8wK;>J(~%zOZBZ#MW} z3O8=u?60h?;<|g(YV~{^CC6+YdAj^OI`Yy5Ec z;oz>K2msr%2%`wwvWE28+}GdTVdMGV6MuL2V&f$*HeTl6$7N-06~*&pPKq#!NRos* zcfTDn%n0|>y&ne(%R>6{FbkO2luYWF%9Zlq1R@z?t*^uCDsGYx$&jb(k8=l(BXDYi zI#8=tvDVj#WH`~myGY;%gQwUMHgiDz$ihg!AD()v1PQNfx}h=1Ny z%9S!j!!!{UfnQYEoJt9!Xk>mGra>4*JX8Br4!VfS;L$qs33S?R8k?`#oJ#2}Et4e4 ziTiULk+ZnBw9GTLPh<0S{=%I_lJx_l*1p>n012d6D9zn3d; z-941-7~f8}M?XIrnTDFC4cVUc3V#5UtaGW=rUxvqP19~Cn5LHN0P6KRY1$)6x@ek0 zBty0vJ7;oUtJP8F=4Sy|t?#32DshtXV%KBFE>SWxdc6bs^x4`ESe$hzmz2Cg$=06f z3OemJfgkX);SK%mD)b;~x#*fox7VYU9H91_bPo!oX_xEQg7-&4fKYris6*LtOsNW? zu9N67{ljin19sy7=>Px# delta 1313 zcmV++1>X9L3*ripQhx~=3>^j=V%CTN00i$zL_t(o!|j(}Z_`#7#(!!3CytX7#|`}> zphGQ;bwiufb~pPJATIX>c8N4iNV}Q1p7srprhNbe7uyBjVFfWE7y@;$6w;Q~v5)N} zwv%QT#x7|RidHUpZjSrbUU4V1V&=nT-TKV zSe78exb?0pxpV7wfiX~4*Vm|2E105;s0ySf31yJ~-E6$V_j~~6&o1QeLK)zDKAX>; zvUL6etKX~x5J;c0sN~PmlWaGd+_`m|u?al<<0d=%KBwm_l3ou@RoU8ZQ4BTjm>WQUqC;LO*|pIzYR@4g+&aU7JQu29ld>}m;sIO!p(22)y* zq6(sHFc^Rt#!OGaw60Lp6{4tzC>NQs1fnV^=_+$}iKIWwQC5#h;QZn&y#feRe-qLP z;)GdI!izwd8bw`WcTeU?0`v-CixMs%JxQ%z#wh9-V}Cdns@miPvWIpz2B1_-CwtN1 zq;3?Wmeiqm(oR66q6=kkEXO2FlGnKTIr(WyIM#fNrOQDayxkOsv4;&LYa< zB2QcwP1pIyfmjiQeVw=;;q=oO<|*zw5t^>!^r5t9umk9Ts0wzbmk8SW2uG=6&;{VH z@d>=E`BxW_o}?Q^V>wz#OjDm+fpc1e*ZToqesT)% ziIX19#78X@DOV1=;NRUApUl+&kijmm_X7-3X1i$-%7B@8lh2k;k@Syns37#o?WmlY zvqrk0<+eFpKUDnuj7h8AVb-qDjbenU(<{KaS$_-1p2HO7kuEsO@m?a##F8mK6J6Xp zyhYy@R8iOHb~=PIIF@5#0@;FWJgWF?Oxg+E=y3C-ouDa$A+qB*#vXy=wF%l0j@Jgj z@!I%dm%n3o=oaf9^x4{R^Ep8~;?d@7q&3fzM~?~G5$$ePg%*A=%JC5&F%E^xSFa3K z*MHY=oIPy2o{!^jbk4m$HzqnAfNMWo8yw}VR8zC!dp?e{hhkZRPcL2Mmm7Cd7ZZj6 zlueT$3@MxDP&|A0{ZH4~eD?I6U-x|T1EA={1S$bzC#BnU$usspMAJw!FN@F%W7x6`57ctvA6p?|-; zLLA2<=Vw_WS8;!Ng@@{ZX5&@v`%eNTJA(f53ILj>;W&F(c8#U;7xEUWR4aLM+VaYY zk05JnB`f3G?RNL~yJOo>)3l+vCpiMwl~{HSWxKgUC#VPe9z}a(;fP^tI&tA?VxKay?&o|e1JM=(K{%RBt0%&^go;k z0Rr(wYQLh0QVjxKC)OhdZ(Obh>_(|A{}9ME;JOmW*`wvi5$pXfTkbe}#~NP6?}PsU Xa#g#n`rcBX00000NkvXXu0mjf%u0dC diff --git a/src/main/resources/assets/create/textures/block/controls.png b/src/main/resources/assets/create/textures/block/controls.png index 0244791e92a394f73cb324301ababb8a278e6eed..bad2610ca658e41ddb12f0874b338edc3c2b4aa3 100644 GIT binary patch delta 1495 zcmV;|1t|K-1l|jf8Gi-<0047(dh`GQ00v@9M??Vs0RI60puMM)00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF;2%91koq6GlsV000GRNklhr&+h|%mOezQ{>d8YZ|~iudMWiC+X|S@ag&AHGuuQ*8BfXmuM%~doxM4@9bsm za25c2V4$t>>VMc6u!28siMH=62{1Nm}=k}Jq8OCVi|;TTw!13)2HLI@Y> zN=mLk_tvm_I`MhpFjVIs;H$uWVmG-2v4%-&`Hi5JD_y=(F@$X z{ebW}(6G4}V2jG0?}L{(rZUMaE}}4IFT*o+3>_1jgN}$4s%z zM8Rv|!1zp&O@qB;(}@N{Zn@I3jy$f5oVs*Pi`Y9fxv-!N$7~DRv`JZwnOL4OF%2EL zut3D#p@mg&DN8{h#5{$$DrGrOLDXFr;bK`%K*GraC08^?Pc={40|QjY z#u&Xh&5heR^l&OZ^wp2gl#LVbZu7%NHngsjeFwf(x>i@%aDt&kx{|NYkMPCWQGX)6 znIx(sKEoQHDH4wJVdRNSiWhr=I-7db22vJuB^?aMpeyMp$Aak^^b4b-SXzX)xAyy? z=OOc(MG)?zQxjaDywBdP8&%XPD`?*oUDZ9^sz+xkL9Xc1nMy#Rgm7x(nVyZu$fO;X zrGutpTP9UuVp}HDg;MY@%OUoHL4QR^wI@u2nc3D&$Fa?ZUAj`umC}{u9|UtjB$Ia7 zJ#t(bH+7$6+`!a*da`kPvT+>SMAI~4mZA3DBge_4Ygv-6q#%Mb!n4A`Hmt0n%y0~{ z%Yu@u=kjx$J@Em3-D#@AYdem`YztHO@#Zzoojy#tA{Cw?1odUywoE1p9)CS`nF(i& z(VNqO14cB8T{nh@BY8p8Fm$UP1pz55&{srY*n70w0|P+@EFfP-y0QizFqto7IEIo* zSJrw#Jp@l0$67%UGFk|i`;!F#az$4~n=1w+&J|sRXylFd=9WG`nXu{WPCxo^G$@vv ze@J-qnu6fo)C}c{tG xq#X(SsjuP8gA%Tg3?-N2q>bmQq7%2~_z&O$^6yJS8&d!P002ovPDHLkV1l;a&I$kk delta 571 zcmV-B0>u5^3&{kK8Gi!+002a!ipBr{0H07yR7C&)0RH&C|LctY>WlZwY`3?u&7WDX zc~75zP=J7deSLkEbw-hKNOE#=aBy&lWjTjrID%n1fnYg|SU-ANGAtp`KjUWI300DGTPE!Ct=GbNc z00CG@L_t(|+QpOA(&|7EgggE_EIUCahP%W2KiiqeVhPu$Q>=bf-7~cy(K@(E>jao@ zVjwmnwC}ohC4blTH830#KxTw?Pp9MdD3bBy3J~?$K--K6+*ztxxroLaH~9MNQ+{Pe z1kTb6iHWE~-ogn!e>u#r%qYMr<&c>bQMz&hpt|B4aNJK<(=5xTtNqat3!)$3$BfX{ zV+Koq{^CgjEIlHzC^A@ju#4k(bcscmkqk(zB10xjmVd6Sk?S!0I(Ud>avL9 z4bT8Qh6KI~;F<&13U~}z0f!Pel)%#CvQg|UfI%HtEjU!FqlgzPlc59}GYrm8W!5vi z%4A?JGc;+nSc!rBWP$&pMB_m^sR25v<4-#7rAuX>Kx2-66VQhy8_4=Dmj=#P^C00ZDjL_t(o!|j*PZyQAvfWMfHvpWl^V=Iwb z>SRMCx2ZXh^bm0Iq%r>=~pW{0QHR=%B`=e0BAx0U`dH41eUxXFzC$5z<0xBzMQ98X|a5B zJ!0Q|RxZvI5r4Xdt~-4wu0b`fTC2tMDG$qosc(T1Y@WT zP?#*l>SxkMe-`m?L7YS!a1WN7ZvQA#T)oqZB7_KB!)J{qx-PtT|5&d{?>+Sv=vu&j z#DS;vok$_FVh)>s%}SY#R-;L)(e&&`99TMkNba15u02Q1sz4UIYdfbns|KDS>+EgU z##VN^T{$N z&Dbue8U~--cr&q^DzCpb#T!e7K-Wr&NHq-XT7QjdrNu8lL>&%y*X5OK5nX>b{a;2_ zt}mS2{rYp(K3-*RHpk2*JyF4JDl1>!;j<5J#}X01-H+Zr@e`4MYuxQt+ymp%i+^#@ z8E_y&_o(MI2)DI;z_;K0(VuIP{0Vc-$UX%m6-JI`3p442(%FH@r3sV#845g3Yr=)6-Q3K|)#?rt8vEI0%2K z&xFY(uFi+&>{=}~#wXR4O!&|xwOs$&u%eZgm@@x$9mx2}#Uia6u)1P9Uu#?5>HLRS}xff42j)B-C^z_^oLhUCSa=hoq$4^+?KfUUB}d zw)l1HPjoGdnt7?O9xkJ8?B~ZGPE{+V;e~3q6`4Ek9(ynY@DBzT0E=T8>$m^_00{s| KMNUMnLSTZ#=>nbr delta 988 zcmV<210(#?2%rd%Qhx~=3@afwbn=z}00XT_L_t(o!|j*PZyQAv$3HP^dv~^^#+D;O z>)25wx2aDFLOlTzmm&}%;!ttqF90d!UgchL;RY9uT)ELm<-`%FL}iR4S++^3P+U84 z=+3UaNyA~h+g-=&9}v+?-^rf$eY0=h%)I&R+~$q7)7M^^2Y+B?ImI+qs~-aJ=->!| zsQ936`|ka@QFCc;t}l_lVzOFF`-6I+0Q0ZI(a#~V(`XES<*1Z9G^;6U^+Voy_Y$k6 zw2BMpDrFOZW;Mn3-TNb7M*HmB3IK)>0N7Gu2!SoX3JKMi4Cw$qy}rn5DNUu^VdLh` znR$ZRkqKPR=YJ5UfoUpnv$03MkmL9AZb*2wRP=oSmL-vv&C2ox^g@A+n>(blnULQ! zg|GXgzB@XBcB_q)2GX(-rhyPD=xV7L5?Yq@ebTa#Qes;+wfeDNAt3~}-_vMTEw=8p z0eo#_1)?05C8yeuE6b_C-hgJ+@;Bc!rg09Y7Yf*Nhktepw(hCK#bEvamjt{e$Ye7J z)0inPb{-E8F2Sr8<2jq=mCZYbk6UfB3z?B(&!>);ffV+$B`}T9JX0s|u(@}p5!seK zQXKSo&87D0B9NogYSU@8{duNN;QC^Z)I|f+c#59Tfdo$9QM)^#hkipst$E+UvSS=} z?Lo`!uz$WF$)+#(^LTNV-RH1tQ;kYs|KN!dy2rS(OI*ZprAu7INhY5O_m4UxlY(AP zy}2u0_79%Gk~;fGPM>(!#&VAV>CfRxmv%%&U)T!+nA^Ouc6#T#FWCNMi7q1dztSF0cL!}os< zMjvqN%Ma9LH23!}Y;64mK=E3Uy~dAcD8>+iT;VdizbUY2zP~>4!Cyb@9r_q=iXvSI8T)`I@9K#$Bn|pqFjR>+0)6nX~V>tYE6+TT1RLUJyfl9f^^VgFHLS#kIp7}(mzq3>@TZN`+opW4$p08X2#P10000< KMNUMnLSTaYe)Pcr diff --git a/src/main/resources/assets/create/textures/block/engine.png b/src/main/resources/assets/create/textures/block/engine.png index 3cf96c02adb9b357d87100001b9f431c774baaad..699602cee2aac29a22bbf7c31c3f94f13c04f577 100644 GIT binary patch delta 4013 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 diff --git a/src/main/resources/assets/create/textures/block/pipes_connected.png b/src/main/resources/assets/create/textures/block/pipes_connected.png index 99f144c75a32b1ca8f1ef66c59f737833115eaa2..6e85df9c90a88ed3fcce2692f4511790105e1ccf 100644 GIT binary patch delta 779 zcmV+m1N8i<2B-#*Du4d~{{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G` z2j~nI4=Nzp7=6$H00Om1L_t(o!|hf(lG8vCeRfHfrLtss%jE(bK}5g-$hZO-H`tU5 z5Rws*asx81K*j+GHrRqltV^Y`q>(LYtiS})%=U~vi_1&qmw(urPft&Gzt=PR^7i%d z$<-XbZGs{xDr~kXTxW_dWO=E4_pR%L*lz%khfiz=0B|UB__m1+fc0Y5ZDBD}oa|lK zgP?K3aGfb8wgb;15wPZnlG^anpUYv!D*%9JnTV1UzHMUfO!55LN{&;|_4@d_al%l- zXf2TOSf)UX-G9$F;o~tTwu3{F%Qqv5d#?EEBie+WuICoI0W8s&PpCc0ugd z4`RFmT2F;-^lV3AQeo*mE|P@-EzEZ({M3sjDN=R<^b^PuDS_;{8H*IK}}fB+#- zr1Iu;ub4j+Ib3H7LmW=|F0=puf+plTCblEf(FK}w9iC-^q26!MTk8}7i2>u4)PaYv z_Et(gb${FKp`lWQ|G@pBy)7X$7)_hQOJj)z(i1A8UL#v&^k*e6DVNz7^?ONLf zuN4t$Xc{GHt3U-60|09PQPCeQeJ+T1H4Qi06dSFg_a$$&X5TiIuu~E0)QeNvG3B{P z!R=inTkXE&*q0nxUP^5cxc>HIG<49j&2251s7cK7ta8w-3Ygt9RL6T07*qo JL@Ip_b+9({iG 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 diff --git a/src/main/resources/assets/create/textures/block/table_cloth/brass.png b/src/main/resources/assets/create/textures/block/table_cloth/brass.png index 67588487569f7d2970efc5db2716a18eb409ecc8..098a492315fddb2bb7e68bfd447a6b8f74b18a6d 100644 GIT binary patch delta 3287 zcmV;|3@G!r1?3r#8Gi-<0047(dh`GQ2`ze5SaechcOY(o;rKjks0=Ty!W z4F`#d=e5Eid^6W_j>b_LW;&m)bJ6NTZ6Izp0;ZV;pr<`-il51|cmsnECr4%Wq#V%2jWGNz2rAe=` zrkZQ1QfqCsyB1nRtGSgXt+v*BXV6a1ows}K+!$fRkwzY6$f%=@KB3P{GtV+**4buv zE3CNE%73dYS#`D5x8G1{r=54%vg>ZUD^$~{NwXFet=hD|P&=r)A29nFxnHB^AE*JC zJD4RJJyGMf$g>M?c9IP<5DUqJxEKNuIv8eG^(h5I&KYJ`3#cLoqRa-)@`e})rtL#k z|HAGAxu0-z=>G5G7T%F_2Hn4boHOXYK<;PUzJEY%ncYp(;f1l83@xcwM1C40Arnm) zIE^rV9t1o>shyx>tBYudFBWpUVw+2Q-NOe*`1hS5Ij)>~sN)JH+wDeXR_~vA)TfzbNz8RIK=fJT@KvKbhrzRws8vu-KvGp%{IJn*9%!Bv6AvSR@rOl{Ew zQS2)nHPikoa_QGNxbKn3U!;bay+6|;*#N6Vs^0QA zd~>rLG3Pbn94A%U_Z|%jaanv>K_wQdMnR35VVE`_p6j50f5m<0oi8AZmUwD|;jpcN z-nW!q{8qHV7xw}u%wW{o7fxj&8@A}NC>*PpR2;IHayQ3DMOZC!!+*j@ZG9E?7`y1m z3fnhYTx!AN4{PV*X1 zII)w>yI5f5jx0@k4Em(dGJX}M{@F!FlBo~hUxDJ5zLzbZW}O;EvjEcSam%)D!QFA_Ukj$63I$SYA^|$-j0lamx__n45FAF9KKov9&^C53 zMyLf^jBdy9%v)7|8BeL{tWez9w2JnciRa+d;>-`6f(;HG(n)@9?$HY@xwHRu@=<|t zZFqaR3~FM}S|gh>7zi4E?G^YDf+4@D7i?U5QCbCjr$3@2N zBKy?B<|W%)N7OtqUS`WGL$6yYV^mSw6vU*GFw2h?h$yfEbN=m~^ z*;N*9m4BVgWQDxi+?GBBA1PTi#7$1ZJz{WR9DrE?Y#iQs=0QlmP-fICB?6N8;+;!Fi zGFT_NY{`0;TKwX<`(1-SeeV8g2i|sp?8qHLNVm|<>yi2lkN+sl-y-#XcAs1nsbC5J z2cl06uWn!10{{R324YJ`L;(K){{a7>y{D6ro)~`zbV*G`2j~nJ5he)k9CJAU00TKm zL_t(o!|hfz3i3Aotr(Mr1E;dRgs7!xAWn%l~cnQrA;^ctyP=PxDP%6PNDmDB7 zfM;{b=5QcW;x3HWGTi2Y6YpvsG=&4UvUQm=Tal?Vd*}X#<+Q&5^gOpQ4l&t*zm=&I z7U8FRoY{&@V`1X?3cdqi0RlbGw<3^hus2H9MN}p=TxkXb5~UI} zmEq;gO+2}K);?HM8A41(EUX|FR-ma2kn$5SiR?*3(mFQX()e*!<-k1JxyhP2 zVCXuirdjOQb(iDMb?bkjwN174)l?owE`N!~g&zgA*XiDMDg5$jIOX z-o8rV;`MHv9_VOj7qXhNIN_x?ZyAM zu$szaXl%NMsY7Ga1mPZRXZL443o>c%pUc9h$Joy9dlmq|@ffU002ovPDHLkV1iF2Ts{B* literal 695 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�N_@txPtT7sHeEL;z2J|83w0R|u-kE&w~t7WNxnKN~y$ zoTw*~aJp7uVXdwe?4wazSgUK(wF*_I#HH!;)SNuFVQ}f(X%^P%+Lcc}Q@<~q`9L|E zs!lRholMjd0bG9YL<6|?Xk9DVCeN;44fnm{Oqabpb^E^776J98*|6&ke2IK*2V-_Gn!Lcy|42UzQ!wWX#glh+e$+SnGPOvXj*t3V;lL`N0$IW%Gd5xtVZd zYnP6Dv<+noqFGD3sH4687JK`xL_Ki~ggXt?Sg*+UNNu-yN7hX00000NkvXX Hu0mjfrC)c} literal 685 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCik#1AIbUdmJ3*dAU}YS>Gs*df1n;A;jzD;@tnIT92j%ec4v|cyij2L>4nJ=qZ3O<5d|sX`rB3 ziEBhjaDG}zd16s2LqK9?UWuNcYlwoWp5gcA?~{QlwxmXQrg?g5F>nAmtPE0&tPG4m zmKP99L)jpIYA`Z`#hHL?Lq;YBJ|GAWI7%3#!Y|zyKtB`Pl0JnJVud0E3&w z)5S5w!hdg2^rRyS97jGF6bc>xJ-LPU`y4u5b<;QJ zEZTGV#(qc7FOwZB)g}nZTgs<}#Vz6H^lqQ0&K%_-CS>`vWB&4sPK$(<>Y}0q6$~Ho zx6H{ovePDoVc~Jd2vJQ17a3PQ&X5bsj$eHCYf;?M{FOGbSEjyj+a)Gcv$A5o(wgf| zNy_q!@%?|LFL&nO5&AUoL85F(_R>`!R()V$Qhp((@J`ff0`mbek37a(+ipd<<{Ivn z7F)1)rlaSDW0O?cb*){*OJZBlvb_>-?^ijem}1ck!E8 lr%HTQ{@48B`~M5K_%H3(`LMNh@oG@mc)I$ztaD0e0sx}+=9~Zk diff --git a/src/main/resources/assets/create/textures/block/table_cloth/price_tag.png b/src/main/resources/assets/create/textures/block/table_cloth/price_tag.png index f32cfa0cff8bd4d1ab7f09392c1a7aa253ed3249..6300c1482cd8565b49bd189c24fa9ed5f58ef5fd 100644 GIT binary patch delta 275 zcmcb|xR_~zWIY=L1B3kM|A|0~Ey>&6h2cL4F4((#GEjuGz$3Dlfk96Jgc+~O$VmeQ z*-JcqUD;pohzm(8Y-ZP00SayKba4!^IGyZs&g1v_2G%ok4Z9~cava$4{sZG0HjA59 z0;vqAx4bl#2$?!1fF=L_?&A(R2@jt?PUh&Z?`z=RQ~kN`;nhp2F46~BlGnuSYI^wU z>1mhjKOY~T{V#8S?@zn*g2l_v7CgNa$`-`Pedgw*Ntbwl7^vdc1Dhia{qyY%-`v~D z?fU8Qa(@@;BPSfxEOw_Kt)JqcBEDh5>W@di3iB|(ZhE~ukADOAx7Z3dS#bu2jLTN% V6<0^UWvY3HEPXUA( zugb_t0|o6pT^vI+g3tCaaxo}yxG|Sr`}hCJHZG+XjIumWr?5(%Qk3AFnYBnqi*br+ u&4v1J>vH?I3y2l(NZvX(=; Date: Sat, 28 Dec 2024 19:56:56 +0100 Subject: [PATCH 220/515] They don't like to move it - Removed AO from pipe models - Fixed InventorySorter able to take items from ghost inventories - Some damage control for HL blocks acting up in contraptions/schematics - Fixed slot offsets in requester screen --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 4 +- .../tags/blocks/relocation_not_supported.json | 1 - .../java/com/simibubi/create/AllBlocks.java | 14 ++-- .../contraptions/BlockMovementChecks.java | 4 +- .../content/contraptions/Contraption.java | 8 ++ .../content/fluids/PipeAttachmentModel.java | 27 +++++- .../ChainConveyorBlockEntity.java | 84 ++++++++++++++++++- .../chainConveyor/ChainConveyorRenderer.java | 12 +-- .../factoryBoard/FactoryPanelBehaviour.java | 22 +++++ .../factoryBoard/FactoryPanelBlock.java | 20 ++--- .../factoryBoard/FactoryPanelBlockEntity.java | 8 ++ .../logistics/filter/PackageFilterScreen.java | 2 +- .../packagePort/PackagePortBlockEntity.java | 4 +- .../LogisticallyLinkedBehaviour.java | 7 +- .../RedstoneRequesterBlock.java | 8 ++ .../RedstoneRequesterBlockEntity.java | 8 ++ .../RedstoneRequesterScreen.java | 20 ++++- .../tableCloth/TableClothBlockEntity.java | 5 -- .../TableClothFilteringBehaviour.java | 5 ++ .../blockEntity/SmartBlockEntity.java | 2 +- .../behaviour/BlockEntityBehaviour.java | 7 ++ .../foundation/gui/menu/GhostItemMenu.java | 5 ++ .../foundation/utility/BlockHelper.java | 2 - 23 files changed, 232 insertions(+), 47 deletions(-) diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 4aef998b54..85dd3fdf2b 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-12-27T18:05:56.7764077 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-12-28T14:25:56.9899499 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -4711,7 +4711,7 @@ edf7390f09e622193bbc720ec51ba128ea1e96e6 data/curios/tags/items/head.json 81b107ada9c6ac5679a21f8c6a006bf230f69c39 data/forge/tags/blocks/ores/zinc.json e475ad1c52bffedfc544e5331a87c1f5c45149fd data/forge/tags/blocks/ores_in_ground/deepslate.json 2f6068972e364599b6849dc46fcb0724d4219d53 data/forge/tags/blocks/ores_in_ground/stone.json -8a5988e68f3a41341b486784c29d00e16d5272f7 data/forge/tags/blocks/relocation_not_supported.json +2589b135c0e96ad29076569e144528fe32ea5b39 data/forge/tags/blocks/relocation_not_supported.json 807ea01d3b028bd226ed0befc142cbd23647e998 data/forge/tags/blocks/storage_blocks.json 7d10cdf9e46a79753d4437c7bb958e3ab8bf0c89 data/forge/tags/blocks/storage_blocks/andesite_alloy.json 70bba470740dc7a77f51b4cb1747a105b62d4bde data/forge/tags/blocks/storage_blocks/brass.json diff --git a/src/generated/resources/data/forge/tags/blocks/relocation_not_supported.json b/src/generated/resources/data/forge/tags/blocks/relocation_not_supported.json index ce295fd976..259661af42 100644 --- a/src/generated/resources/data/forge/tags/blocks/relocation_not_supported.json +++ b/src/generated/resources/data/forge/tags/blocks/relocation_not_supported.json @@ -1,6 +1,5 @@ { "values": [ - "create:chain_conveyor", "create:track" ] } \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 9911639da2..5d8690d1ae 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -554,7 +554,6 @@ public class AllBlocks { .mapColor(MapColor.PODZOL)) .transform(axeOrPickaxe()) .transform(BlockStressDefaults.setImpact(1)) - .tag(AllBlockTags.RELOCATION_NOT_SUPPORTED.tag) .blockstate((c, p) -> p.simpleBlock(c.getEntry(), AssetLookup.partialBaseModel(c, p))) .item() .transform(customItemModel()) @@ -883,7 +882,7 @@ public class AllBlocks { .properties(p -> p.forceSolidOn()) .transform(pickaxeOnly()) .blockstate(BlockStateGen.pipe()) - .onRegister(CreateRegistrate.blockModel(() -> PipeAttachmentModel::new)) + .onRegister(CreateRegistrate.blockModel(() -> PipeAttachmentModel::withoutAO)) .item() .transform(customItemModel()) .register(); @@ -898,7 +897,7 @@ public class AllBlocks { .onRegister(CreateRegistrate.connectedTextures(() -> new EncasedCTBehaviour(AllSpriteShifts.COPPER_CASING))) .onRegister(CreateRegistrate.casingConnectivity((block, cc) -> cc.make(block, AllSpriteShifts.COPPER_CASING, (s, f) -> !s.getValue(EncasedPipeBlock.FACING_TO_PROPERTY_MAP.get(f))))) - .onRegister(CreateRegistrate.blockModel(() -> PipeAttachmentModel::new)) + .onRegister(CreateRegistrate.blockModel(() -> PipeAttachmentModel::withAO)) .loot((p, b) -> p.dropOther(b, FLUID_PIPE.get())) .transform(EncasingRegistry.addVariantTo(AllBlocks.FLUID_PIPE)) .register(); @@ -922,7 +921,7 @@ public class AllBlocks { .build(); }, BlockStateProperties.WATERLOGGED); }) - .onRegister(CreateRegistrate.blockModel(() -> PipeAttachmentModel::new)) + .onRegister(CreateRegistrate.blockModel(() -> PipeAttachmentModel::withoutAO)) .loot((p, b) -> p.dropOther(b, FLUID_PIPE.get())) .register(); @@ -931,7 +930,7 @@ public class AllBlocks { .properties(p -> p.mapColor(MapColor.STONE)) .transform(pickaxeOnly()) .blockstate(BlockStateGen.directionalBlockProviderIgnoresWaterlogged(true)) - .onRegister(CreateRegistrate.blockModel(() -> PipeAttachmentModel::new)) + .onRegister(CreateRegistrate.blockModel(() -> PipeAttachmentModel::withoutAO)) .transform(BlockStressDefaults.setImpact(4.0)) .item() .transform(customItemModel()) @@ -943,7 +942,7 @@ public class AllBlocks { .properties(p -> p.mapColor(MapColor.TERRACOTTA_YELLOW)) .transform(pickaxeOnly()) .blockstate(new SmartFluidPipeGenerator()::generate) - .onRegister(CreateRegistrate.blockModel(() -> PipeAttachmentModel::new)) + .onRegister(CreateRegistrate.blockModel(() -> PipeAttachmentModel::withoutAO)) .item() .transform(customItemModel()) .register(); @@ -951,10 +950,11 @@ public class AllBlocks { public static final BlockEntry FLUID_VALVE = REGISTRATE.block("fluid_valve", FluidValveBlock::new) .initialProperties(SharedProperties::copperMetal) .transform(pickaxeOnly()) + .addLayer(() -> RenderType::cutoutMipped) .blockstate((c, p) -> BlockStateGen.directionalAxisBlock(c, p, (state, vertical) -> AssetLookup.partialBaseModel(c, p, vertical ? "vertical" : "horizontal", state.getValue(FluidValveBlock.ENABLED) ? "open" : "closed"))) - .onRegister(CreateRegistrate.blockModel(() -> PipeAttachmentModel::new)) + .onRegister(CreateRegistrate.blockModel(() -> PipeAttachmentModel::withoutAO)) .item() .transform(customItemModel()) .register(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/BlockMovementChecks.java b/src/main/java/com/simibubi/create/content/contraptions/BlockMovementChecks.java index 4a35e41bc4..7c917c10ff 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/BlockMovementChecks.java +++ b/src/main/java/com/simibubi/create/content/contraptions/BlockMovementChecks.java @@ -24,6 +24,7 @@ import com.simibubi.create.content.decoration.steamWhistle.WhistleExtenderBlock; import com.simibubi.create.content.fluids.tank.FluidTankBlock; import com.simibubi.create.content.kinetics.crank.HandCrankBlock; import com.simibubi.create.content.kinetics.fan.NozzleBlock; +import com.simibubi.create.content.logistics.packagerLink.PackagerLinkBlock; import com.simibubi.create.content.logistics.vault.ItemVaultBlock; import com.simibubi.create.content.redstone.link.RedstoneLinkBlock; import com.simibubi.create.content.trains.bogey.AbstractBogeyBlock; @@ -237,7 +238,8 @@ public class BlockMovementChecks { return true; if (block instanceof BasePressurePlateBlock) return true; - if (block instanceof FaceAttachedHorizontalDirectionalBlock && !(block instanceof GrindstoneBlock)) + if (block instanceof FaceAttachedHorizontalDirectionalBlock && !(block instanceof GrindstoneBlock) + && !(block instanceof PackagerLinkBlock)) return true; if (block instanceof CartAssemblerBlock) return false; diff --git a/src/main/java/com/simibubi/create/content/contraptions/Contraption.java b/src/main/java/com/simibubi/create/content/contraptions/Contraption.java index fae00e8c94..693ccdd9e1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/Contraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/Contraption.java @@ -61,10 +61,12 @@ import com.simibubi.create.content.kinetics.base.BlockBreakingMovementBehaviour; import com.simibubi.create.content.kinetics.base.IRotate; import com.simibubi.create.content.kinetics.base.KineticBlockEntity; import com.simibubi.create.content.kinetics.belt.BeltBlock; +import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorBlockEntity; import com.simibubi.create.content.kinetics.gantry.GantryShaftBlock; import com.simibubi.create.content.kinetics.simpleRelays.ShaftBlock; import com.simibubi.create.content.kinetics.steamEngine.PoweredShaftBlockEntity; import com.simibubi.create.content.logistics.crate.CreativeCrateBlockEntity; +import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBlockEntity; import com.simibubi.create.content.redstone.contact.RedstoneContactBlock; import com.simibubi.create.content.trains.bogey.AbstractBogeyBlock; import com.simibubi.create.foundation.blockEntity.IMultiBlockEntityContainer; @@ -338,6 +340,9 @@ public abstract class Contraption { && !BlockMovementChecks.isNotSupportive(world.getBlockState(attached), offset.getOpposite())) frontier.add(attached); } + + if (world.getBlockEntity(pos) instanceof ChainConveyorBlockEntity ccbe) + ccbe.notifyConnectedToValidate(); // Double Chest halves stick together if (state.hasProperty(ChestBlock.TYPE) && state.hasProperty(ChestBlock.FACING) @@ -626,6 +631,9 @@ public abstract class Contraption { BlockEntity blockEntity = world.getBlockEntity(pos); if (blockEntity instanceof PoweredShaftBlockEntity) blockEntity = AllBlockEntityTypes.BRACKETED_KINETIC.create(pos, blockstate); + if (blockEntity instanceof FactoryPanelBlockEntity fpbe) + fpbe.writeSafe(compoundnbt); + return Pair.of(new StructureBlockInfo(pos, blockstate, compoundnbt), blockEntity); } diff --git a/src/main/java/com/simibubi/create/content/fluids/PipeAttachmentModel.java b/src/main/java/com/simibubi/create/content/fluids/PipeAttachmentModel.java index 0dbf7fa2fc..eb17afba72 100644 --- a/src/main/java/com/simibubi/create/content/fluids/PipeAttachmentModel.java +++ b/src/main/java/com/simibubi/create/content/fluids/PipeAttachmentModel.java @@ -33,9 +33,19 @@ import net.minecraftforge.client.model.data.ModelProperty; public class PipeAttachmentModel extends BakedModelWrapperWithData { private static final ModelProperty PIPE_PROPERTY = new ModelProperty<>(); + private boolean ao; - public PipeAttachmentModel(BakedModel template) { + public static PipeAttachmentModel withAO(BakedModel template) { + return new PipeAttachmentModel(template, true); + } + + public static PipeAttachmentModel withoutAO(BakedModel template) { + return new PipeAttachmentModel(template, false); + } + + public PipeAttachmentModel(BakedModel template, boolean ao) { super(template); + this.ao = ao; } @Override @@ -75,6 +85,21 @@ public class PipeAttachmentModel extends BakedModelWrapperWithData { } return quads; } + + @Override + public boolean useAmbientOcclusion(BlockState state, RenderType renderType) { + return ao; + } + + @Override + public boolean useAmbientOcclusion(BlockState state) { + return ao; + } + + @Override + public boolean useAmbientOcclusion() { + return ao; + } private void addQuads(List quads, BlockState state, Direction side, RandomSource rand, ModelData data, PipeModelData pipeData, RenderType renderType) { diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java index 468b24323f..c8220c415e 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java @@ -12,6 +12,8 @@ import java.util.function.Consumer; import javax.annotation.Nullable; +import com.simibubi.create.api.contraption.transformable.ITransformableBlockEntity; +import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.kinetics.base.IRotate; import com.simibubi.create.content.kinetics.base.KineticBlockEntity; import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorPackage.ChainConveyorPackagePhysicsData; @@ -20,6 +22,8 @@ import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorShape.Cha import com.simibubi.create.content.logistics.box.PackageEntity; import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.content.logistics.packagePort.frogport.FrogportBlockEntity; +import com.simibubi.create.content.schematics.requirement.ItemRequirement; +import com.simibubi.create.content.schematics.requirement.ItemRequirement.ItemUseType; import com.simibubi.create.foundation.utility.ServerSpeedProvider; import com.simibubi.create.infrastructure.config.AllConfigs; @@ -51,7 +55,7 @@ import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; import net.minecraftforge.items.ItemHandlerHelper; -public class ChainConveyorBlockEntity extends KineticBlockEntity { +public class ChainConveyorBlockEntity extends KineticBlockEntity implements ITransformableBlockEntity { public record ConnectionStats(float tangentAngle, float chainLength, Vec3 start, Vec3 end) { } @@ -71,11 +75,13 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity { public boolean reversed; public boolean cancelDrops; + public boolean checkInvalid; BlockPos chainDestroyedEffectToSend; public ChainConveyorBlockEntity(BlockEntityType typeIn, BlockPos pos, BlockState state) { super(typeIn, pos, state); + checkInvalid = true; } @Override @@ -125,6 +131,11 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity { public void tick() { super.tick(); + if (checkInvalid && !level.isClientSide()) { + checkInvalid = false; + removeInvalidConnections(); + } + float serverSpeed = level.isClientSide() ? ServerSpeedProvider.get() : 1f; float speed = getSpeed() / 360f; float radius = 1.5f; @@ -181,6 +192,8 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity { for (Entry> entry : travellingPackages.entrySet()) { BlockPos target = entry.getKey(); ConnectionStats stats = connectionStats.get(target); + if (stats == null) + continue; Travelling: for (Iterator iterator = entry.getValue() .iterator(); iterator.hasNext();) { @@ -206,7 +219,7 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity { continue; if (!target.equals(port.connection)) continue; - + boolean notAtPositionYet = box.chainPosition < chainPosition; if (notAtPositionYet && anticipatePosition < chainPosition) continue; @@ -298,6 +311,33 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity { updateBoxWorldPositions(); } + public void removeInvalidConnections() { + boolean changed = false; + for (Iterator iterator = connections.iterator(); iterator.hasNext();) { + BlockPos next = iterator.next(); + BlockPos target = worldPosition.offset(next); + if (!level.isLoaded(target)) + continue; + if (level.getBlockEntity(target) instanceof ChainConveyorBlockEntity ccbe + && ccbe.connections.contains(next.multiply(-1))) + continue; + iterator.remove(); + changed = true; + } + if (changed) + notifyUpdate(); + } + + public void notifyConnectedToValidate() { + for (BlockPos blockPos : connections) { + BlockPos target = worldPosition.offset(blockPos); + if (!level.isLoaded(target)) + continue; + if (level.getBlockEntity(target) instanceof ChainConveyorBlockEntity ccbe) + ccbe.checkInvalid = true; + } + } + public void tickBoxVisuals() { for (ChainConveyorPackage box : loopingPackages) tickBoxVisuals(box); @@ -371,6 +411,8 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity { for (Entry> entry : travellingPackages.entrySet()) { BlockPos target = entry.getKey(); ConnectionStats stats = connectionStats.get(target); + if (stats == null) + continue; for (ChainConveyorPackage box : entry.getValue()) { box.worldPosition = getPackagePosition(box.chainPosition, target); if (level == null || !level.isClientSide()) @@ -596,7 +638,8 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity { } private void drop(ChainConveyorPackage box) { - level.addFreshEntity(PackageEntity.fromItemStack(level, box.worldPosition.subtract(0, 0.5, 0), box.item)); + if (box.worldPosition != null) + level.addFreshEntity(PackageEntity.fromItemStack(level, box.worldPosition.subtract(0, 0.5, 0), box.item)); } @Override @@ -617,6 +660,12 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity { return super.propagateRotationTo(target, stateFrom, stateTo, diff, connectedViaAxes, connectedViaCogs); } + @Override + public void writeSafe(CompoundTag tag) { + super.writeSafe(tag); + tag.put("Connections", NBTHelper.writeCompoundList(connections, NbtUtils::writeBlockPos)); + } + @Override protected void write(CompoundTag compound, boolean clientPacket) { super.write(compound, clientPacket); @@ -717,4 +766,33 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity { return travellingPackages; } + @Override + public ItemRequirement getRequiredItems(BlockState state) { + // Uncomment when Schematicannon is able to print these with chains +// int totalCost = 0; +// for (BlockPos pos : connections) +// totalCost += getChainCost(pos); +// if (totalCost > 0) +// return new ItemRequirement(ItemUseType.CONSUME, new ItemStack(Items.CHAIN, Mth.ceil(totalCost / 2.0))); + return super.getRequiredItems(state); + } + + @Override + public void transform(StructureTransform transform) { + if (connections == null || connections.isEmpty()) + return; + + connections = new HashSet<>(connections.stream() + .map(transform::applyWithoutOffset) + .toList()); + + HashMap> newMap = new HashMap<>(); + travellingPackages.entrySet() + .forEach(e -> newMap.put(transform.applyWithoutOffset(e.getKey()), e.getValue())); + travellingPackages = newMap; + + connectionStats = null; + notifyUpdate(); + } + } diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRenderer.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRenderer.java index c8036e9d8b..71024d1232 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRenderer.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRenderer.java @@ -64,8 +64,8 @@ public class ChainConveyorRenderer extends KineticBlockEntityRenderer, IWrenchable { + implements ProperWaterloggedBlock, IBE, IWrenchable, ISpecialBlockItemRequirement { public static final BooleanProperty POWERED = BlockStateProperties.POWERED; @@ -318,19 +321,9 @@ public class FactoryPanelBlock extends FaceAttachedHorizontalDirectionalBlock @Override public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pIsMoving) { - boolean blockChanged = !pState.is(pNewState.getBlock()); - if (!pIsMoving && blockChanged) - if (pState.getValue(POWERED)) - updateNeighbours(pState, pLevel, pPos); - IBE.onRemove(pState, pLevel, pPos, pNewState); } - public static void updateNeighbours(BlockState pState, Level pLevel, BlockPos pPos) { - pLevel.updateNeighborsAt(pPos, pState.getBlock()); - pLevel.updateNeighborsAt(pPos.relative(getConnectedDirection(pState).getOpposite()), pState.getBlock()); - } - public PanelSlot getTargetedSlot(BlockPos pos, BlockState blockState, Vec3 clickLocation) { double bestDistance = Double.MAX_VALUE; PanelSlot bestSlot = PanelSlot.BOTTOM_LEFT; @@ -378,4 +371,9 @@ public class FactoryPanelBlock extends FaceAttachedHorizontalDirectionalBlock return (face == AttachFace.CEILING ? Mth.PI : 0) + AngleHelper.rad(AngleHelper.horizontalAngle(facing)); } + @Override + public ItemRequirement getRequiredItems(BlockState state, BlockEntity blockEntity) { + return ItemRequirement.NONE; + } + } diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java index 70829ea56b..22f0acd988 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java @@ -99,6 +99,14 @@ public class FactoryPanelBlockEntity extends SmartBlockEntity { result++; return result; } + + @Override + public void remove() { + for (FactoryPanelBehaviour panelBehaviour : panels.values()) + if (panelBehaviour.isActive()) + panelBehaviour.disconnectAll(); + super.remove(); + } @Override public void destroy() { diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/PackageFilterScreen.java b/src/main/java/com/simibubi/create/content/logistics/filter/PackageFilterScreen.java index f36871d26b..e1defbc972 100644 --- a/src/main/java/com/simibubi/create/content/logistics/filter/PackageFilterScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/filter/PackageFilterScreen.java @@ -45,7 +45,7 @@ public class PackageFilterScreen extends AbstractFilterScreen int x = leftPos; int y = topPos; - addressBox = new AddressEditBox(this, this.font, x + 44, y + 28, 140, 9, false); + addressBox = new AddressEditBox(this, this.font, x + 44, y + 28, 129, 9, false); addressBox.setTextColor(0xffffff); addressBox.setValue(menu.address); addressBox.setResponder(this::onAddressEdited); diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java index 90e66251db..696f79d7a7 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java @@ -45,7 +45,7 @@ public abstract class PackagePortBlockEntity extends SmartBlockEntity implements public SmartInventory inventory; protected AnimatedContainerBehaviour openTracker; - + protected LazyOptional itemHandler; public PackagePortBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { @@ -203,7 +203,7 @@ public abstract class PackagePortBlockEntity extends SmartBlockEntity implements public AbstractContainerMenu createMenu(int pContainerId, Inventory pPlayerInventory, Player pPlayer) { return PackagePortMenu.create(pContainerId, pPlayerInventory, this); } - + public int getComparatorOutput() { return ItemHandlerHelper.calcRedstoneFromInventory(inventory); } diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java index ddf40f7310..dbb4ba1699 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java @@ -213,7 +213,12 @@ public class LogisticallyLinkedBehaviour extends BlockEntityBehaviour { public boolean isSafeNBT() { return true; } - + + @Override + public void writeSafe(CompoundTag tag) { + tag.putUUID("Freq", freqId); + } + @Override public void write(CompoundTag tag, boolean clientPacket) { super.write(tag, clientPacket); diff --git a/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlock.java b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlock.java index 41a628633a..1f261e2aa7 100644 --- a/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlock.java @@ -16,6 +16,7 @@ import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; +import net.minecraft.core.Direction.AxisDirection; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; @@ -31,6 +32,7 @@ import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.SignalGetter; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Rotation; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockStateProperties; @@ -176,4 +178,10 @@ public class RedstoneRequesterBlock extends Block implements IBE= inputX && mouseX < inputX + 16 && mouseY >= inputY && mouseY < inputY + 16) { ItemStack itemStack = menu.ghostInventory.getStackInSlot(i); if (itemStack.isEmpty()) @@ -191,6 +194,15 @@ public class RedstoneRequesterScreen extends AbstractSimiContainerScreen getTooltipFromContainerItem(ItemStack pStack) { List tooltip = super.getTooltipFromContainerItem(pStack); diff --git a/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothBlockEntity.java index 052306c136..aae1faa736 100644 --- a/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothBlockEntity.java @@ -301,11 +301,6 @@ public class TableClothBlockEntity extends SmartBlockEntity { owner = tag.contains("OwnerUUID") ? tag.getUUID("OwnerUUID") : null; facing = Direction.from2DDataValue(Mth.positiveModulo(tag.getInt("Facing"), 4)); } -// -// @Override -// protected AABB createRenderBoundingBox() { -// return new AABB(worldPosition).inflate(1); -// } @Override public void destroy() { diff --git a/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothFilteringBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothFilteringBehaviour.java index bfbd5495fd..7ab0815ea6 100644 --- a/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothFilteringBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothFilteringBehaviour.java @@ -41,6 +41,11 @@ public class TableClothFilteringBehaviour extends FilteringBehaviour { return dbe().owner == null || player.getUUID() .equals(dbe().owner); } + + @Override + public boolean isSafeNBT() { + return false; + } @Override public MutableComponent getLabel() { diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/SmartBlockEntity.java b/src/main/java/com/simibubi/create/foundation/blockEntity/SmartBlockEntity.java index a6b130156a..c41ee270cd 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/SmartBlockEntity.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/SmartBlockEntity.java @@ -98,7 +98,7 @@ public abstract class SmartBlockEntity extends CachedRenderBBBlockEntity super.saveAdditional(tag); forEachBehaviour(tb -> { if (tb.isSafeNBT()) - tb.write(tag, false); + tb.writeSafe(tag); }); } diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/BlockEntityBehaviour.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/BlockEntityBehaviour.java index d52125dea1..a15e57aef9 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/BlockEntityBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/BlockEntityBehaviour.java @@ -44,6 +44,13 @@ public abstract class BlockEntityBehaviour { public void write(CompoundTag nbt, boolean clientPacket) { } + + /** + * Called when isSafeNBT == true. Defaults to write() + */ + public void writeSafe(CompoundTag nbt) { + write(nbt, false); + } public boolean isSafeNBT() { return false; diff --git a/src/main/java/com/simibubi/create/foundation/gui/menu/GhostItemMenu.java b/src/main/java/com/simibubi/create/foundation/gui/menu/GhostItemMenu.java index b7d619cb82..a2cef80cf9 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/menu/GhostItemMenu.java +++ b/src/main/java/com/simibubi/create/foundation/gui/menu/GhostItemMenu.java @@ -81,6 +81,11 @@ public abstract class GhostItemMenu extends MenuBase implements IClearable ghostInventory.setStackInSlot(slot, insert); getSlot(slotId).setChanged(); } + + @Override + protected boolean moveItemStackTo(ItemStack pStack, int pStartIndex, int pEndIndex, boolean pReverseDirection) { + return false; + } @Override public ItemStack quickMoveStack(Player playerIn, int index) { diff --git a/src/main/java/com/simibubi/create/foundation/utility/BlockHelper.java b/src/main/java/com/simibubi/create/foundation/utility/BlockHelper.java index 95110014ab..637ec761da 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/BlockHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/BlockHelper.java @@ -1,6 +1,5 @@ package com.simibubi.create.foundation.utility; -import java.util.function.BiConsumer; import java.util.function.Consumer; import javax.annotation.Nullable; @@ -16,7 +15,6 @@ import com.simibubi.create.content.processing.burner.BlazeBurnerBlock; import com.simibubi.create.content.processing.burner.BlazeBurnerBlock.HeatLevel; import com.simibubi.create.foundation.blockEntity.IMergeableBE; import com.simibubi.create.foundation.blockEntity.IMultiBlockEntityContainer; - import com.simibubi.create.impl.schematic.nbt.SchematicSafeNBTRegistryImpl; import net.createmod.catnip.utility.NBTProcessors; From ef7a05d5e654f21d07aa7deb1eba139ad1781077 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Sat, 28 Dec 2024 14:20:55 -0500 Subject: [PATCH 221/515] Sealed records - Convert IHaveCustomOverlayIcon into a sealed interface that is used through IHaveGoggleInformation or IHaveHoveringInformation --- .../content/equipment/goggles/IHaveCustomOverlayIcon.java | 5 +---- .../content/equipment/goggles/IHaveGoggleInformation.java | 2 +- .../content/equipment/goggles/IHaveHoveringInformation.java | 2 +- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/equipment/goggles/IHaveCustomOverlayIcon.java b/src/main/java/com/simibubi/create/content/equipment/goggles/IHaveCustomOverlayIcon.java index 42cef95642..8500c6c0c0 100644 --- a/src/main/java/com/simibubi/create/content/equipment/goggles/IHaveCustomOverlayIcon.java +++ b/src/main/java/com/simibubi/create/content/equipment/goggles/IHaveCustomOverlayIcon.java @@ -5,10 +5,7 @@ import com.simibubi.create.AllItems; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntity; -/** - * Implement this interface on the {@link BlockEntity} that wants to change the icon on the goggle overlay - */ -public interface IHaveCustomOverlayIcon { +public sealed interface IHaveCustomOverlayIcon permits IHaveGoggleInformation, IHaveHoveringInformation { /** * This method will be called when looking at a {@link BlockEntity} that implements this interface *

diff --git a/src/main/java/com/simibubi/create/content/equipment/goggles/IHaveGoggleInformation.java b/src/main/java/com/simibubi/create/content/equipment/goggles/IHaveGoggleInformation.java index 0e1de50d03..9f83112e79 100644 --- a/src/main/java/com/simibubi/create/content/equipment/goggles/IHaveGoggleInformation.java +++ b/src/main/java/com/simibubi/create/content/equipment/goggles/IHaveGoggleInformation.java @@ -16,7 +16,7 @@ import net.minecraftforge.fluids.capability.IFluidHandler; /** * Implement this interface on the {@link BlockEntity} that wants to add info to the goggle overlay */ -public interface IHaveGoggleInformation { +public non-sealed interface IHaveGoggleInformation extends IHaveCustomOverlayIcon { /** * This method will be called when looking at a {@link BlockEntity} that implements this interface * diff --git a/src/main/java/com/simibubi/create/content/equipment/goggles/IHaveHoveringInformation.java b/src/main/java/com/simibubi/create/content/equipment/goggles/IHaveHoveringInformation.java index 042464a7e8..0b3a2fe36c 100644 --- a/src/main/java/com/simibubi/create/content/equipment/goggles/IHaveHoveringInformation.java +++ b/src/main/java/com/simibubi/create/content/equipment/goggles/IHaveHoveringInformation.java @@ -8,7 +8,7 @@ import net.minecraft.world.level.block.entity.BlockEntity; /** * Implement this interface on the {@link BlockEntity} that wants to add info to the goggle overlay */ -public interface IHaveHoveringInformation { +public non-sealed interface IHaveHoveringInformation extends IHaveCustomOverlayIcon{ /** * This method will be called when looking at a {@link BlockEntity} that implements this interface * From 3f96a137c7c30c9b473908cc895e1cdb4981e802 Mon Sep 17 00:00:00 2001 From: Kryppers <65094918+Kryppers@users.noreply.github.com> Date: Sun, 29 Dec 2024 16:36:10 +0000 Subject: [PATCH 222/515] downgrade changed the redstone link textures to andesite. fixed cog shading on the potato cannon --- .../models/item/linked_controller/button.json | 2 +- .../models/item/linked_controller/item.json | 16 ++++++++-------- .../models/item/linked_controller/powered.json | 4 ++-- .../create/models/item/potato_cannon/cog.json | 4 ++++ .../create/textures/block/redstone_bridge.png | Bin 586 -> 1509 bytes .../textures/block/redstone_bridge_powered.png | Bin 604 -> 1514 bytes .../create/textures/item/linked_controller.png | Bin 252 -> 564 bytes .../item/linked_controller_powered.png | Bin 252 -> 537 bytes 8 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/main/resources/assets/create/models/item/linked_controller/button.json b/src/main/resources/assets/create/models/item/linked_controller/button.json index 9859c72abd..331cac4ea0 100644 --- a/src/main/resources/assets/create/models/item/linked_controller/button.json +++ b/src/main/resources/assets/create/models/item/linked_controller/button.json @@ -12,7 +12,7 @@ "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 0.5]}, "faces": { "north": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, - "east": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, + "east": {"uv": [2, 13, 4, 14], "texture": "#redstone_bridge"}, "south": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, "west": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, "up": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"} diff --git a/src/main/resources/assets/create/models/item/linked_controller/item.json b/src/main/resources/assets/create/models/item/linked_controller/item.json index 88c8e9cdc6..0de153f60f 100644 --- a/src/main/resources/assets/create/models/item/linked_controller/item.json +++ b/src/main/resources/assets/create/models/item/linked_controller/item.json @@ -15,10 +15,10 @@ "faces": { "north": {"uv": [13, 0, 15, 8], "rotation": 90, "texture": "#redstone_bridge"}, "east": {"uv": [0, 8, 13, 10], "texture": "#redstone_bridge"}, - "south": {"uv": [13, 0, 15, 8], "rotation": 90, "texture": "#redstone_bridge"}, + "south": {"uv": [13, 8, 15, 0], "rotation": 90, "texture": "#redstone_bridge"}, "west": {"uv": [0, 8, 13, 10], "texture": "#redstone_bridge"}, "up": {"uv": [0, 0, 13, 8], "rotation": 270, "texture": "#redstone_bridge"}, - "down": {"uv": [0, 0, 13, 8], "rotation": 90, "texture": "#redstone_bridge"} + "down": {"uv": [0, 8, 13, 0], "rotation": 90, "texture": "#redstone_bridge"} } }, { @@ -57,7 +57,7 @@ "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 0.5]}, "faces": { "north": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, - "east": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, + "east": {"uv": [2, 13, 4, 14], "texture": "#redstone_bridge"}, "south": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, "west": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, "up": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"} @@ -69,7 +69,7 @@ "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 0.5]}, "faces": { "north": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, - "east": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, + "east": {"uv": [2, 13, 4, 14], "texture": "#redstone_bridge"}, "south": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, "west": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, "up": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"} @@ -81,7 +81,7 @@ "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 0.5]}, "faces": { "north": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, - "east": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, + "east": {"uv": [2, 13, 4, 14], "texture": "#redstone_bridge"}, "south": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, "west": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, "up": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"} @@ -93,7 +93,7 @@ "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 0.5]}, "faces": { "north": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, - "east": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, + "east": {"uv": [2, 13, 4, 14], "texture": "#redstone_bridge"}, "south": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, "west": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, "up": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"} @@ -105,7 +105,7 @@ "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 0.5]}, "faces": { "north": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, - "east": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, + "east": {"uv": [2, 13, 4, 14], "texture": "#redstone_bridge"}, "south": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, "west": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, "up": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"} @@ -117,7 +117,7 @@ "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 0.5]}, "faces": { "north": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, - "east": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, + "east": {"uv": [2, 13, 4, 14], "texture": "#redstone_bridge"}, "south": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, "west": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, "up": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"} diff --git a/src/main/resources/assets/create/models/item/linked_controller/powered.json b/src/main/resources/assets/create/models/item/linked_controller/powered.json index 1a747b4fa2..53d261f29c 100644 --- a/src/main/resources/assets/create/models/item/linked_controller/powered.json +++ b/src/main/resources/assets/create/models/item/linked_controller/powered.json @@ -15,10 +15,10 @@ "faces": { "north": {"uv": [13, 0, 15, 8], "rotation": 90, "texture": "#redstone_bridge"}, "east": {"uv": [0, 8, 13, 10], "texture": "#redstone_bridge"}, - "south": {"uv": [13, 0, 15, 8], "rotation": 90, "texture": "#redstone_bridge"}, + "south": {"uv": [13, 8, 15, 0], "rotation": 90, "texture": "#redstone_bridge"}, "west": {"uv": [0, 8, 13, 10], "texture": "#redstone_bridge"}, "up": {"uv": [0, 0, 13, 8], "rotation": 270, "texture": "#redstone_bridge"}, - "down": {"uv": [0, 0, 13, 8], "rotation": 90, "texture": "#redstone_bridge"} + "down": {"uv": [0, 8, 13, 0], "rotation": 90, "texture": "#redstone_bridge"} } }, { diff --git a/src/main/resources/assets/create/models/item/potato_cannon/cog.json b/src/main/resources/assets/create/models/item/potato_cannon/cog.json index 2d52317f75..f1ba8c7b68 100644 --- a/src/main/resources/assets/create/models/item/potato_cannon/cog.json +++ b/src/main/resources/assets/create/models/item/potato_cannon/cog.json @@ -11,6 +11,7 @@ "name": "Cog", "from": [7.5, 6, 6.5], "to": [8.5, 11, 9.5], + "forge_data": {"calculate_normals": true}, "rotation": {"angle": 0, "axis": "z", "origin": [8, 8.5, 8]}, "faces": { "north": {"uv": [0.25, 13.25, 2.75, 13.75], "rotation": 90, "texture": "#1"}, @@ -25,6 +26,7 @@ "name": "Cog", "from": [7.5, 6, 6.5], "to": [8.5, 11, 9.5], + "forge_data": {"calculate_normals": true}, "rotation": {"angle": 45, "axis": "z", "origin": [8, 8.5, 8]}, "faces": { "north": {"uv": [0.25, 13.25, 2.75, 13.75], "rotation": 90, "texture": "#1"}, @@ -39,6 +41,7 @@ "name": "Cog", "from": [5.5, 8, 6.5], "to": [10.5, 9, 9.5], + "forge_data": {"calculate_normals": true}, "rotation": {"angle": 0, "axis": "z", "origin": [8, 8.5, 8]}, "faces": { "north": {"uv": [0.25, 13.25, 2.75, 13.75], "rotation": 180, "texture": "#1"}, @@ -53,6 +56,7 @@ "name": "Cog", "from": [5.5, 8, 6.5], "to": [10.5, 9, 9.5], + "forge_data": {"calculate_normals": true}, "rotation": {"angle": 45, "axis": "z", "origin": [8, 8.5, 8]}, "faces": { "north": {"uv": [0.25, 13.25, 2.75, 13.75], "rotation": 180, "texture": "#1"}, diff --git a/src/main/resources/assets/create/textures/block/redstone_bridge.png b/src/main/resources/assets/create/textures/block/redstone_bridge.png index 7b6de01541144940adb55b856f2f3afe6358fc01..14b1b643b7b5fa60a99febb3a00cf71d99224dbe 100644 GIT binary patch delta 1502 zcmV<41tI#%1mz2m8Gi-<0047(dh`GQ00v@9M??Vs0RI60puMM)00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF;2%9S{p7l9A75000GYNkl=I&rPE<<)`!HK7Ys2~||EVnKz(k`*jivP43B1wKGmuzz5|2Ba=nR7h+9p^yNL zc!-w1(!@^E*yC%@^>}WKSxn|;#&#fxC1*3f<9q-2y#D8$$y~Vj!mwJYVAfa2x~8g)k+1sy~?R_k?fR(WegF%+B;+M+u9bg@C@sX25-Of7O^ze>Qrj8 zsr3i%y`KRv9Dmyez_d*stCdrr-B95aT|6Q5VI>u=V9YLu2BvM26eSf~ ztuCh%@8&Gn2=~{IRH_Ub>u{2^0x|F?XcEwu63-KqOMiJDKXsh!RHT|^4E6rypEvaH zX7i!8+-tS~s2QKa$^CW81Lablv$b*xR7s^bI<`%*=;GHw2K#0O{b)T?$ZG?9Df#io z)s!*Zf50R$l8c}pra(>G#PbBcl#wN#AofwLgq^jpvzAuc^P+tD>iU-%4k0N8MnMsh z;z$z4Vt;3?)R|i8$6 z*_IQ*lvGeaD}3k>#IYT9XAC&Xj52w)GBUj{X3e>O7Xl**oTOpQ>(YJ!(==RsdMsN+4F^_;X|2Wnj-qUBF7{*@ngrMj~`#d316g6TNm{Rdz(@QlYB^B~-ELwPe zkxFeAUvzQYJZ`~7v;}S%%rS1?x;gHFYNZm^Un<%^-XP!Cj`Oj=j{ApM9s(;Qs0dXs{{Q|={m9AXmfXVfraN6$CNN) zD`M@F*2ES7RBE#{*6K8y4|RQ)t!;gYrtYLFIb}k9g-Y$!aRt8o_(Mu=4$Cxn*pZw( zmS^y12BijsYL}Miak5fkRVlW1x&V}(dVi5qXXd%_eS@P;?r)Q9$L}!+2gqP|auS|D zSH;d+Oxp(6mu^!nmjLMX6}c&s?|xb1c*(}jT2#vgwp$Ya!4mVAFLCq6HicK7;L%!X z3|RPz?PizExA&KQ@!`zaMGyw5_c0j2%*?T|GcDn3rFAHX+H@y#fCu7iO-?q++2A0s>B2Od zXJ;680@|HG7cM2+X$#LDr2xoa7k^)L#}$~n@{G=b9ltl`g&n^~xEqCO@yfGN63Xbp zi|0@4SPzG313GedZ<3A@H|#4MH$Sex55KN!8Up-!XDda+K{(*|d)tH~G`x4`4(#!L zQXM!kv){tQej7ErKx3^wuE6Ct-_=D1BG=B==EjPWXp6BzbmqbvOc$nc+<*MUaxB^c zwN|HE-7m$X1B^wtbe6m`rT^^ueOCb5odD}Skl~ZPSsRsaA1 delta 572 zcmV-C0>k~~3(5qL8Gi!+002a!ipBr{0C-SLR7C&)0RQ>F|LctV+e2 z0004WQchCvF;%5JuCK1R>zY6}8dY6}|y@W5>(% zPrn&5aOSXqr3#)lo7IYZ2!4Rh0Ca;7_4~V$QB@UVp$u6yU`z)rtL?H;^I0dTnQ3f~<6@=ziBN%Sl{TT+KSE#S?!Dlo*Ru+`1 z>-z1jR&CpAFU0HLn*vy8opS(4q17U^)1Gk?!q{&9?0-m&LOSf@$LIc#c3&w4A1Nos z<1tr2u(9v4j|jLs=(Dqu9#5B2;R22<3*>;AK4Fj8Tk9s_j3T%N*{jey$0g6-ML3Co z4q0H9D=b*JOafRIdJ&lEL_`CRm~Mx3(IR4WD2D`NEC&EzT(k6nl^2a_|7x{=@>o+s zS(ZhKZ#9+tME>B*lIOB037Xc3xL%VEqo4_S&cb7gkJh2s|CJv(-!h7_SR}##0000< KMNUMnLSTa4{qi*c diff --git a/src/main/resources/assets/create/textures/block/redstone_bridge_powered.png b/src/main/resources/assets/create/textures/block/redstone_bridge_powered.png index 97c89edbd6dea08e6332d0110ceaf149b539c32e..dab404f6a47a6362be8a92a6b729d31f736d0ef3 100644 GIT binary patch delta 1507 zcmV<91swX^1nLWr8Gi-<0047(dh`GQ00v@9M??Vs0RI60puMM)00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF;2%9S{pUADP0F000GdNklXA(z_zR)Wb3h0$dSAKHlX&>5df~;+{;*@L|K~)@w6y#yAuahQem(z*{sd|+pAo?^$6Y6iHeen z<@zc!k!RBeJo47}V}%mk>LTnQP9Ojt1dRf^QsOv*e19&@o?Y8Wj{DRMtrwoZdh1d6 zyHvJ(>_~Rj?M2l|P9WMr|n>vmoaHaG$aRh;l0upA@z)Tt;X~*&7<-7A25^O?Z1O`D7 zlI%bb27h8Ejo6)NoQyiZk!%Tk8-1~Cdm(Vt0@@kw56zx`v zEr0#h>ifS?+|J>H&-JR6rBEA32-!*fD zXn__1`=~a71^|U}k?KN)TJ3RI-(`Izd`XzPqpIY%j@MBX%Ee&<7e4=#oSnkZH6Ax5 zJGQ3j{+U3jE}mMWE?Vp;x~Wd`~WP7g+Nl{Iyu`SIc^|a6%wiR zwPzy>6i4`_)$uR4y>{$*6l`*G>(HILaA~!>vF8i@b$$a2XhF0NY8lK18-Yz{Ciq}> zihQ$8quGuWE*T5LuV$whGsb9&4u8{Pb(p{xCk|ltV<3pws1=^LExfe^vhDH9i36$5Mju1GG7&#?HWmGeY5!i5e z2$)6~4|cL+uN?3FQ@b6!GvtD-ZO6JA5C%(N*1+_?&p(I{ptjAf-8;jSjJh)THW<7! zM8FY(`FnSnJ9nDQM3S^M9$fyp>iYG&(QISQ9@}u#nmczI-PEbsCaZ1-+3ljFqIC4l ze;!CSJHK=BvytWvzH;)m$@WQ;oNZATE{n2(Q>*{0`SAZKe*y90G85r4pCJGM002ov JPDHLkV1l@4+Is*1 delta 590 zcmV-U0d8Gi!+002a!ipBr{0DDkOR7C&)0RQ>F|LctV+J90-cW=bh!M<-rG zBwj-zT0|s$EjwF5BwIlvRy-h8JRem$AI$&&P&XX3002TS7Jruj06!@cH6agm0067D z_WS?<00DGTPE!Ct=GbNc00EClL_t(|+KrQoQo|q+MPnq05OCv)t+DF1rPTlbLU$oe zJAJ5kCNts8;f8D`O$@YLzP?h3F^te#fPM_Iy}ws-HBG}iwltPmf&@ zNN8!uG;%1j@PG2&smG@(WT6a2?R#r2%U#!LxoU$@Dgpuk${Ea*DhM5`fUH=)Z{~;~ zbP`xaxDbTS!nFpWRahbi=v)wbd`+T!CS;+x4$1=OqCsdKHG<`#ou6S8dVuDT5JN@t z$Et!-ZQI`6wMuJkf{W&s=vg9yw_CZdtAl#hq>$suC$D2D`V9R~n!yyi3qR&ESR|267x zCr8WrbCm|IHc8SOi1J_bfbU7S1C+I*)93oaVO} cPV0@?li0ki~=8Gi-<001BJ|6u?C00v@9M??Vs0RI60puMM)00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF;2%9SsO5r1ape0005ONklqNVu@1W9LQ6AS+VA%&y}1b+*QAPMP$iKr+_fl6HKJ#^Fhq=dd!YRb-i}O@mn^C`PgeudxwqRfOSYMn6ngB#$M9}F1AZ`kw z_olAm?S0~Jh<{Zd>tda=%ddz5iDpeBEP$%-8`7Yl@LgLl?74wi7{rD7P#^B377BP$qUF(Qft(ioPTbTsO*ou&y9E_Dr0iGNv%;w zh7y44$Z)0JB9H>Mr_N7{|+(e6kogD+NIMuAn0@n o0!bhxaUYV^2LO925r0RV&|=j;Fg00DGTPE!Ct z=GbNc003@DL_t(|+NF+55`ZuWLt~|)Enq+QzpKU1#&PF^1!RPo1WaKryHn;cQ38Au z5f#@81Ksq-_Sz!QOh=iih}If`Iwr~4+gfwMMAgrt)_c56PlLzQW8EM>v4QCRgD7B- lnBxU=!Z*wM61D~ZH~4C9002ovPDHLkV1jpnTW|mX diff --git a/src/main/resources/assets/create/textures/item/linked_controller_powered.png b/src/main/resources/assets/create/textures/item/linked_controller_powered.png index bb2d51aeb7512352009fe2b5dfd3effda2e14987..85b466dc480c16fd52c2f07ff3507280be1d533c 100644 GIT binary patch delta 523 zcmV+m0`&d-0ht7l8Gi-<001BJ|6u?C00v@9M??Vs0RI60puMM)00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF;2%9SsO8J^is40004|Nkl?lNA~yjSiZk3JZs)qTcIXhE(F!ms7;P^1;?t##@Y(d0U(JJqOYd_h)u{B zuU^4F`oQ0i>VH1Yc#8+mUvL0~z&r>KpdJMDjtbF;tds_T5m`aH0_jUc5CAYX6zm-g zh!p{NoZE~tZMhmC0zRJ|}B*&^p zoa*1gPQPp7RF|`<=}8*vtNeKMkk@m!iU1WWn(Y=dvwt1B+LXIXSJ3b!W1~J@ZJ3$u z&}_F*u>znz+9*~y42!Mow`BdCls@U8Ky6Gpx7wvUcSTv^r`;W*Nd0QHBFdn+ugiNB zDYo8hQm+U68{AvCo-f_LmY>(>SaNuhQ1vV4e%Q0*n@ZSK3I88{0=$~GwdE4M(f|Me N07*qoL Date: Mon, 30 Dec 2024 17:02:03 -0500 Subject: [PATCH 223/515] Shiny filters - Refactor item attributes --- .../com/simibubi/create/AllRegistries.java | 33 ++ src/main/java/com/simibubi/create/Create.java | 3 + .../equipment/blueprint/BlueprintItem.java | 7 +- .../blueprint/BlueprintOverlayRenderer.java | 9 +- .../logistics/filter/AttributeFilterMenu.java | 9 +- .../filter/AttributeFilterScreen.java | 17 +- .../content/logistics/filter/FilterItem.java | 7 +- .../logistics/filter/FilterItemStack.java | 3 +- .../logistics/filter/FilterScreenPacket.java | 5 +- .../logistics/filter/ItemAttribute.java | 412 ------------------ .../filter/attribute/BookAuthorAttribute.java | 61 --- .../filter/attribute/BookCopyAttribute.java | 71 --- .../filter/attribute/EnchantAttribute.java | 64 --- .../attribute/FluidContentsAttribute.java | 81 ---- .../filter/attribute/ItemNameAttribute.java | 69 --- .../AstralSorceryAmuletAttribute.java | 81 ---- .../AstralSorceryAttunementAttribute.java | 78 ---- .../AstralSorceryCrystalAttribute.java | 66 --- .../AstralSorceryPerkGemAttribute.java | 66 --- .../attribute/AllItemAttributeTypes.java | 128 ++++++ .../item/filter/attribute/ItemAttribute.java | 94 ++++ .../filter/attribute/ItemAttributeType.java | 14 + .../attribute/SingletonItemAttribute.java | 67 +++ .../attributes/AddedByAttribute.java | 77 ++++ .../attributes/BookAuthorAttribute.java | 79 ++++ .../attributes/BookCopyAttribute.java | 80 ++++ .../attribute/attributes}/ColorAttribute.java | 70 ++- .../attributes/EnchantAttribute.java | 87 ++++ .../attributes/FluidContentsAttribute.java | 102 +++++ .../attributes/InItemGroupAttribute.java | 109 +++++ .../attribute/attributes/InTagAttribute.java | 73 ++++ .../attributes/ItemNameAttribute.java | 87 ++++ .../ShulkerFillLevelAttribute.java | 60 ++- .../AstralSorceryAmuletAttribute.java | 101 +++++ .../AstralSorceryAttunementAttribute.java | 96 ++++ .../AstralSorceryCrystalAttribute.java | 84 ++++ .../AstralSorceryPerkGemAttribute.java | 84 ++++ .../AllItemAttributeLegacyDeserializers.java | 68 +++ .../StandardTraitsLegacyDeserializer.java | 51 +++ .../legacydeserializers/package-info.java | 5 + .../gametest/items/attribute_filters.nbt | Bin 1901 -> 1896 bytes 41 files changed, 1639 insertions(+), 1119 deletions(-) create mode 100644 src/main/java/com/simibubi/create/AllRegistries.java delete mode 100644 src/main/java/com/simibubi/create/content/logistics/filter/ItemAttribute.java delete mode 100644 src/main/java/com/simibubi/create/content/logistics/filter/attribute/BookAuthorAttribute.java delete mode 100644 src/main/java/com/simibubi/create/content/logistics/filter/attribute/BookCopyAttribute.java delete mode 100644 src/main/java/com/simibubi/create/content/logistics/filter/attribute/EnchantAttribute.java delete mode 100644 src/main/java/com/simibubi/create/content/logistics/filter/attribute/FluidContentsAttribute.java delete mode 100644 src/main/java/com/simibubi/create/content/logistics/filter/attribute/ItemNameAttribute.java delete mode 100644 src/main/java/com/simibubi/create/content/logistics/filter/attribute/astralsorcery/AstralSorceryAmuletAttribute.java delete mode 100644 src/main/java/com/simibubi/create/content/logistics/filter/attribute/astralsorcery/AstralSorceryAttunementAttribute.java delete mode 100644 src/main/java/com/simibubi/create/content/logistics/filter/attribute/astralsorcery/AstralSorceryCrystalAttribute.java delete mode 100644 src/main/java/com/simibubi/create/content/logistics/filter/attribute/astralsorcery/AstralSorceryPerkGemAttribute.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/AllItemAttributeTypes.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/ItemAttribute.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/ItemAttributeType.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/SingletonItemAttribute.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/AddedByAttribute.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/BookAuthorAttribute.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/BookCopyAttribute.java rename src/main/java/com/simibubi/create/content/logistics/{filter/attribute => item/filter/attribute/attributes}/ColorAttribute.java (58%) create mode 100644 src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/EnchantAttribute.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/FluidContentsAttribute.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/InItemGroupAttribute.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/InTagAttribute.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/ItemNameAttribute.java rename src/main/java/com/simibubi/create/content/logistics/{filter/attribute => item/filter/attribute/attributes}/ShulkerFillLevelAttribute.java (65%) create mode 100644 src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/astralsorcery/AstralSorceryAmuletAttribute.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/astralsorcery/AstralSorceryAttunementAttribute.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/astralsorcery/AstralSorceryCrystalAttribute.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/astralsorcery/AstralSorceryPerkGemAttribute.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/legacydeserializers/AllItemAttributeLegacyDeserializers.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/legacydeserializers/StandardTraitsLegacyDeserializer.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/legacydeserializers/package-info.java diff --git a/src/main/java/com/simibubi/create/AllRegistries.java b/src/main/java/com/simibubi/create/AllRegistries.java new file mode 100644 index 0000000000..27bb929c47 --- /dev/null +++ b/src/main/java/com/simibubi/create/AllRegistries.java @@ -0,0 +1,33 @@ +package com.simibubi.create; + +import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttributeType; + +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceKey; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.registries.IForgeRegistry; +import net.minecraftforge.registries.NewRegistryEvent; +import net.minecraftforge.registries.RegistryBuilder; + +import java.util.function.Supplier; + +@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) +public class AllRegistries { + public static Supplier> ITEM_ATTRIBUTE_TYPES; + + public static final class Keys { + public static final ResourceKey> ITEM_ATTRIBUTE_TYPES = key("item_attribute_types"); + + private static ResourceKey> key(String name) { + return ResourceKey.createRegistryKey(Create.asResource(name)); + } + } + + @SubscribeEvent + public static void registerRegistries(NewRegistryEvent event) { + ITEM_ATTRIBUTE_TYPES = event.create(new RegistryBuilder() + .setName(Keys.ITEM_ATTRIBUTE_TYPES.location()) + .disableSaving()); + } +} diff --git a/src/main/java/com/simibubi/create/Create.java b/src/main/java/com/simibubi/create/Create.java index 2324f7ebdc..8749046103 100644 --- a/src/main/java/com/simibubi/create/Create.java +++ b/src/main/java/com/simibubi/create/Create.java @@ -2,6 +2,8 @@ package com.simibubi.create; import java.util.Random; +import com.simibubi.create.content.logistics.item.filter.attribute.AllItemAttributeTypes; + import org.slf4j.Logger; import com.google.gson.Gson; @@ -130,6 +132,7 @@ public class Create { AllConfigs.register(modLoadingContext); + AllItemAttributeTypes.register(modEventBus); BlockSpoutingBehaviour.registerDefaults(); // FIXME: some of these registrations are not thread-safe diff --git a/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintItem.java b/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintItem.java index cb7d352f06..c87e275a60 100644 --- a/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintItem.java +++ b/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintItem.java @@ -3,7 +3,8 @@ package com.simibubi.create.content.equipment.blueprint; import com.simibubi.create.AllItems; import com.simibubi.create.content.logistics.filter.AttributeFilterMenu.WhitelistMode; import com.simibubi.create.content.logistics.filter.FilterItem; -import com.simibubi.create.content.logistics.filter.ItemAttribute; + +import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttribute;import com.simibubi.create.content.logistics.item.filter.attribute.attributes.InTagAttribute; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.NonNullList; @@ -121,9 +122,7 @@ public class BlueprintItem extends Item { filterItem.getOrCreateTag() .putInt("WhitelistMode", WhitelistMode.WHITELIST_DISJ.ordinal()); ListTag attributes = new ListTag(); - ItemAttribute at = new ItemAttribute.InTag(ItemTags.create(resourcelocation)); - CompoundTag compoundNBT = new CompoundTag(); - at.serializeNBT(compoundNBT); + CompoundTag compoundNBT = ItemAttribute.saveStatic(new InTagAttribute(ItemTags.create(resourcelocation))); compoundNBT.putBoolean("Inverted", false); attributes.add(compoundNBT); filterItem.getOrCreateTag() diff --git a/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintOverlayRenderer.java b/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintOverlayRenderer.java index 779daa429b..e291a6aa96 100644 --- a/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintOverlayRenderer.java +++ b/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintOverlayRenderer.java @@ -15,7 +15,8 @@ import com.simibubi.create.content.logistics.BigItemStack; import com.simibubi.create.content.logistics.filter.AttributeFilterMenu.WhitelistMode; import com.simibubi.create.content.logistics.filter.FilterItem; import com.simibubi.create.content.logistics.filter.FilterItemStack; -import com.simibubi.create.content.logistics.filter.ItemAttribute; +import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttribute; +import com.simibubi.create.content.logistics.item.filter.attribute.attributes.InTagAttribute; import com.simibubi.create.content.logistics.packager.InventorySummary; import com.simibubi.create.content.logistics.tableCloth.BlueprintOverlayShopContext; import com.simibubi.create.content.logistics.tableCloth.TableClothBlockEntity; @@ -447,15 +448,15 @@ public class BlueprintOverlayRenderer { if (!stackInSlot.isEmpty()) list.add(stackInSlot); } - return list.toArray(new ItemStack[list.size()]); + return list.toArray(ItemStack[]::new); } if (AllItems.ATTRIBUTE_FILTER.isIn(itemStack)) { WhitelistMode whitelistMode = WhitelistMode.values()[tag.getInt("WhitelistMode")]; ListTag attributes = tag.getList("MatchedAttributes", net.minecraft.nbt.Tag.TAG_COMPOUND); if (whitelistMode == WhitelistMode.WHITELIST_DISJ && attributes.size() == 1) { - ItemAttribute fromNBT = ItemAttribute.fromNBT((CompoundTag) attributes.get(0)); - if (fromNBT instanceof ItemAttribute.InTag inTag) { + ItemAttribute fromNBT = ItemAttribute.loadStatic((CompoundTag) attributes.get(0)); + if (fromNBT instanceof InTagAttribute inTag) { ITagManager tagManager = ForgeRegistries.ITEMS.tags(); if (tagManager.isKnownTagName(inTag.tag)) { ITag taggedItems = tagManager.getTag(inTag.tag); diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/AttributeFilterMenu.java b/src/main/java/com/simibubi/create/content/logistics/filter/AttributeFilterMenu.java index 12a3fbc625..f0ca76eebe 100644 --- a/src/main/java/com/simibubi/create/content/logistics/filter/AttributeFilterMenu.java +++ b/src/main/java/com/simibubi/create/content/logistics/filter/AttributeFilterMenu.java @@ -5,6 +5,8 @@ import java.util.List; import com.simibubi.create.AllMenuTypes; +import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttribute; + import net.createmod.catnip.utility.Pair; import net.createmod.catnip.utility.lang.Components; import net.minecraft.ChatFormatting; @@ -135,7 +137,7 @@ public class AttributeFilterMenu extends AbstractFilterMenu { .getList("MatchedAttributes", Tag.TAG_COMPOUND); attributes.forEach(inbt -> { CompoundTag compound = (CompoundTag) inbt; - selectedAttributes.add(Pair.of(ItemAttribute.fromNBT(compound), compound.getBoolean("Inverted"))); + selectedAttributes.add(Pair.of(ItemAttribute.loadStatic(compound), compound.getBoolean("Inverted"))); }); } @@ -147,9 +149,8 @@ public class AttributeFilterMenu extends AbstractFilterMenu { selectedAttributes.forEach(at -> { if (at == null) return; - CompoundTag compoundNBT = new CompoundTag(); - at.getFirst() - .serializeNBT(compoundNBT); + + CompoundTag compoundNBT = ItemAttribute.saveStatic(at.getFirst()); compoundNBT.putBoolean("Inverted", at.getSecond()); attributes.add(compoundNBT); }); diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/AttributeFilterScreen.java b/src/main/java/com/simibubi/create/content/logistics/filter/AttributeFilterScreen.java index f109618cbd..2ec44f8eba 100644 --- a/src/main/java/com/simibubi/create/content/logistics/filter/AttributeFilterScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/filter/AttributeFilterScreen.java @@ -7,8 +7,11 @@ import java.util.stream.Collectors; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllPackets; +import com.simibubi.create.AllRegistries; import com.simibubi.create.content.logistics.filter.AttributeFilterMenu.WhitelistMode; import com.simibubi.create.content.logistics.filter.FilterScreenPacket.Option; +import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttribute; +import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttributeType; import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.widget.IconButton; @@ -148,8 +151,8 @@ public class AttributeFilterScreen extends AbstractFilterScreen options = attributesOfItem.stream() .map(a -> a.format(false)) .collect(Collectors.toList()); @@ -161,11 +164,8 @@ public class AttributeFilterScreen extends AbstractFilterScreen existing : menu.selectedAttributes) { - CompoundTag testTag = new CompoundTag(); - CompoundTag testTag2 = new CompoundTag(); - existing.getFirst() - .serializeNBT(testTag); - selected.serializeNBT(testTag2); + CompoundTag testTag = ItemAttribute.saveStatic(existing.getFirst()); + CompoundTag testTag2 = ItemAttribute.saveStatic(selected); if (testTag.equals(testTag2)) { add.active = false; addInverted.active = false; @@ -232,9 +232,8 @@ public class AttributeFilterScreen extends AbstractFilterScreen { + if (!world.isClientSide && player instanceof ServerPlayer serverPlayer) + NetworkHooks.openScreen(serverPlayer, this, buf -> { buf.writeItem(heldItem); }); return InteractionResultHolder.success(heldItem); diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/FilterItemStack.java b/src/main/java/com/simibubi/create/content/logistics/filter/FilterItemStack.java index 7495fa84ec..dd2da3cc1e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/filter/FilterItemStack.java +++ b/src/main/java/com/simibubi/create/content/logistics/filter/FilterItemStack.java @@ -5,6 +5,7 @@ import java.util.List; import com.simibubi.create.AllItems; import com.simibubi.create.content.fluids.transfer.GenericItemEmptying; +import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttribute; import com.simibubi.create.content.logistics.box.PackageItem; import net.createmod.catnip.utility.Pair; @@ -186,7 +187,7 @@ public class FilterItemStack { .getList("MatchedAttributes", Tag.TAG_COMPOUND); for (Tag inbt : attributes) { CompoundTag compound = (CompoundTag) inbt; - ItemAttribute attribute = ItemAttribute.fromNBT(compound); + ItemAttribute attribute = ItemAttribute.loadStatic(compound); if (attribute != null) attributeTests.add(Pair.of(attribute, compound.getBoolean("Inverted"))); } diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/FilterScreenPacket.java b/src/main/java/com/simibubi/create/content/logistics/filter/FilterScreenPacket.java index 79caca9f9a..b97703851d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/filter/FilterScreenPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/filter/FilterScreenPacket.java @@ -1,6 +1,7 @@ package com.simibubi.create.content.logistics.filter; import com.simibubi.create.content.logistics.filter.AttributeFilterMenu.WhitelistMode; +import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttribute; import com.simibubi.create.foundation.networking.SimplePacketBase; import net.minecraft.nbt.CompoundTag; @@ -67,9 +68,9 @@ public class FilterScreenPacket extends SimplePacketBase { if (option == Option.BLACKLIST) c.whitelistMode = WhitelistMode.BLACKLIST; if (option == Option.ADD_TAG) - c.appendSelectedAttribute(ItemAttribute.fromNBT(data), false); + c.appendSelectedAttribute(ItemAttribute.loadStatic(data), false); if (option == Option.ADD_INVERTED_TAG) - c.appendSelectedAttribute(ItemAttribute.fromNBT(data), true); + c.appendSelectedAttribute(ItemAttribute.loadStatic(data), true); } if (player.containerMenu instanceof PackageFilterMenu c) { diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/ItemAttribute.java b/src/main/java/com/simibubi/create/content/logistics/filter/ItemAttribute.java deleted file mode 100644 index 59fd60d527..0000000000 --- a/src/main/java/com/simibubi/create/content/logistics/filter/ItemAttribute.java +++ /dev/null @@ -1,412 +0,0 @@ -package com.simibubi.create.content.logistics.filter; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.Optional; -import java.util.function.BiPredicate; -import java.util.function.Predicate; -import java.util.stream.Collectors; - -import org.apache.commons.lang3.StringUtils; -import org.jetbrains.annotations.Nullable; - -import com.simibubi.create.AllRecipeTypes; -import com.simibubi.create.Create; -import com.simibubi.create.content.kinetics.fan.processing.AllFanProcessingTypes; -import com.simibubi.create.content.logistics.filter.attribute.BookAuthorAttribute; -import com.simibubi.create.content.logistics.filter.attribute.BookCopyAttribute; -import com.simibubi.create.content.logistics.filter.attribute.ColorAttribute; -import com.simibubi.create.content.logistics.filter.attribute.EnchantAttribute; -import com.simibubi.create.content.logistics.filter.attribute.FluidContentsAttribute; -import com.simibubi.create.content.logistics.filter.attribute.ItemNameAttribute; -import com.simibubi.create.content.logistics.filter.attribute.ShulkerFillLevelAttribute; -import com.simibubi.create.content.logistics.filter.attribute.astralsorcery.AstralSorceryAmuletAttribute; -import com.simibubi.create.content.logistics.filter.attribute.astralsorcery.AstralSorceryAttunementAttribute; -import com.simibubi.create.content.logistics.filter.attribute.astralsorcery.AstralSorceryCrystalAttribute; -import com.simibubi.create.content.logistics.filter.attribute.astralsorcery.AstralSorceryPerkGemAttribute; -import com.simibubi.create.foundation.utility.CreateLang; - -import net.createmod.catnip.utility.lang.Lang; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.chat.MutableComponent; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.tags.ItemTags; -import net.minecraft.tags.TagKey; -import net.minecraft.world.Container; -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.item.BlockItem; -import net.minecraft.world.item.CreativeModeTab; -import net.minecraft.world.item.CreativeModeTabs; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.crafting.Recipe; -import net.minecraft.world.item.crafting.RecipeType; -import net.minecraft.world.item.enchantment.EnchantmentHelper; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.ComposterBlock; -import net.minecraft.world.level.block.entity.AbstractFurnaceBlockEntity; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.common.CreativeModeTabRegistry; -import net.minecraftforge.common.capabilities.ForgeCapabilities; -import net.minecraftforge.fml.ModContainer; -import net.minecraftforge.fml.ModList; -import net.minecraftforge.forgespi.language.IModInfo; -import net.minecraftforge.items.ItemStackHandler; -import net.minecraftforge.items.wrapper.RecipeWrapper; - -public interface ItemAttribute { - - static List types = new ArrayList<>(); - - static ItemAttribute standard = register(StandardTraits.DUMMY); - static ItemAttribute inTag = register(new InTag(ItemTags.LOGS)); - static ItemAttribute inItemGroup = register(InItemGroup.EMPTY); - static ItemAttribute addedBy = register(new AddedBy("dummy")); - static ItemAttribute hasEnchant = register(EnchantAttribute.EMPTY); - static ItemAttribute shulkerFillLevel = register(ShulkerFillLevelAttribute.EMPTY); - static ItemAttribute hasColor = register(ColorAttribute.EMPTY); - static ItemAttribute hasFluid = register(FluidContentsAttribute.EMPTY); - static ItemAttribute hasName = register(new ItemNameAttribute("dummy")); - static ItemAttribute bookAuthor = register(new BookAuthorAttribute("dummy")); - static ItemAttribute bookCopy = register(new BookCopyAttribute(-1)); - static ItemAttribute astralAmulet = register(new AstralSorceryAmuletAttribute("dummy", -1)); - static ItemAttribute astralAttunement = register(new AstralSorceryAttunementAttribute("dummy")); - static ItemAttribute astralCrystal = register(new AstralSorceryCrystalAttribute("dummy")); - static ItemAttribute astralPerkGem = register(new AstralSorceryPerkGemAttribute("dummy")); - - static ItemAttribute register(ItemAttribute attributeType) { - types.add(attributeType); - return attributeType; - } - - @Nullable - static ItemAttribute fromNBT(CompoundTag nbt) { - for (ItemAttribute itemAttribute : types) - if (itemAttribute.canRead(nbt)) - return itemAttribute.readNBT(nbt.getCompound(itemAttribute.getNBTKey())); - return null; - } - - default boolean appliesTo(ItemStack stack, Level world) { - return appliesTo(stack); - } - - boolean appliesTo(ItemStack stack); - - default List listAttributesOf(ItemStack stack, Level world) { - return listAttributesOf(stack); - } - - List listAttributesOf(ItemStack stack); - - String getTranslationKey(); - - void writeNBT(CompoundTag nbt); - - ItemAttribute readNBT(CompoundTag nbt); - - default void serializeNBT(CompoundTag nbt) { - CompoundTag compound = new CompoundTag(); - writeNBT(compound); - nbt.put(getNBTKey(), compound); - } - - default Object[] getTranslationParameters() { - return new String[0]; - } - - default boolean canRead(CompoundTag nbt) { - return nbt.contains(getNBTKey()); - } - - default String getNBTKey() { - return getTranslationKey(); - } - - @OnlyIn(value = Dist.CLIENT) - default MutableComponent format(boolean inverted) { - return CreateLang.translateDirect("item_attributes." + getTranslationKey() + (inverted ? ".inverted" : ""), - getTranslationParameters()); - } - - public static enum StandardTraits implements ItemAttribute { - - DUMMY(s -> false), - PLACEABLE(s -> s.getItem() instanceof BlockItem), - CONSUMABLE(ItemStack::isEdible), - FLUID_CONTAINER(s -> s.getCapability(ForgeCapabilities.FLUID_HANDLER_ITEM) - .isPresent()), - ENCHANTED(ItemStack::isEnchanted), - MAX_ENCHANTED(StandardTraits::maxEnchanted), - RENAMED(ItemStack::hasCustomHoverName), - DAMAGED(ItemStack::isDamaged), - BADLY_DAMAGED(s -> s.isDamaged() && (float) s.getDamageValue() / s.getMaxDamage() > 3 / 4f), - NOT_STACKABLE(((Predicate) ItemStack::isStackable).negate()), - EQUIPABLE(s -> LivingEntity.getEquipmentSlotForItem(s) - .getType() != EquipmentSlot.Type.HAND), - FURNACE_FUEL(AbstractFurnaceBlockEntity::isFuel), - WASHABLE(AllFanProcessingTypes.SPLASHING::canProcess), - HAUNTABLE(AllFanProcessingTypes.HAUNTING::canProcess), - CRUSHABLE((s, w) -> testRecipe(s, w, AllRecipeTypes.CRUSHING.getType()) - || testRecipe(s, w, AllRecipeTypes.MILLING.getType())), - SMELTABLE((s, w) -> testRecipe(s, w, RecipeType.SMELTING)), - SMOKABLE((s, w) -> testRecipe(s, w, RecipeType.SMOKING)), - BLASTABLE((s, w) -> testRecipe(s, w, RecipeType.BLASTING)), - COMPOSTABLE(s -> ComposterBlock.COMPOSTABLES.containsKey(s.getItem())); - - private static final RecipeWrapper RECIPE_WRAPPER = new RecipeWrapper(new ItemStackHandler(1)); - private Predicate test; - private BiPredicate testWithWorld; - - private StandardTraits(Predicate test) { - this.test = test; - } - - private static boolean testRecipe(ItemStack s, Level w, RecipeType> type) { - RECIPE_WRAPPER.setItem(0, s.copy()); - return w.getRecipeManager() - .getRecipeFor(type, RECIPE_WRAPPER, w) - .isPresent(); - } - - private static boolean maxEnchanted(ItemStack s) { - return EnchantmentHelper.getEnchantments(s) - .entrySet() - .stream() - .anyMatch(e -> e.getKey() - .getMaxLevel() <= e.getValue()); - } - - private StandardTraits(BiPredicate test) { - this.testWithWorld = test; - } - - @Override - public boolean appliesTo(ItemStack stack, Level world) { - if (testWithWorld != null) - return testWithWorld.test(stack, world); - return appliesTo(stack); - } - - @Override - public boolean appliesTo(ItemStack stack) { - return test.test(stack); - } - - @Override - public List listAttributesOf(ItemStack stack, Level world) { - List attributes = new ArrayList<>(); - for (StandardTraits trait : values()) - if (trait.appliesTo(stack, world)) - attributes.add(trait); - return attributes; - } - - @Override - public List listAttributesOf(ItemStack stack) { - return null; - } - - @Override - public String getTranslationKey() { - return Lang.asId(name()); - } - - @Override - public String getNBTKey() { - return "standard_trait"; - } - - @Override - public void writeNBT(CompoundTag nbt) { - nbt.putBoolean(name(), true); - } - - @Override - public ItemAttribute readNBT(CompoundTag nbt) { - for (StandardTraits trait : values()) - if (nbt.contains(trait.name())) - return trait; - return null; - } - - } - - public static class InTag implements ItemAttribute { - - public TagKey tag; - - public InTag(TagKey tag) { - this.tag = tag; - } - - @Override - public boolean appliesTo(ItemStack stack) { - return stack.is(tag); - } - - @Override - public List listAttributesOf(ItemStack stack) { - return stack.getTags() - .map(InTag::new) - .collect(Collectors.toList()); - } - - @Override - public String getTranslationKey() { - return "in_tag"; - } - - @Override - public Object[] getTranslationParameters() { - return new Object[] { "#" + tag.location() }; - } - - @Override - public void writeNBT(CompoundTag nbt) { - nbt.putString("space", tag.location().getNamespace()); - nbt.putString("path", tag.location().getPath()); - } - - @Override - public ItemAttribute readNBT(CompoundTag nbt) { - return new InTag(ItemTags.create(new ResourceLocation(nbt.getString("space"), nbt.getString("path")))); - } - - } - - public static class InItemGroup implements ItemAttribute { - public static final InItemGroup EMPTY = new InItemGroup(null); - - private CreativeModeTab group; - - public InItemGroup(CreativeModeTab group) { - this.group = group; - } - - @Override - public boolean appliesTo(ItemStack stack, Level world) { - if (group == null) - return false; - - if (group.getDisplayItems() - .isEmpty() - && group.getSearchTabDisplayItems() - .isEmpty()) { - - try { - group.buildContents(new CreativeModeTab.ItemDisplayParameters(world.enabledFeatures(), false, - world.registryAccess())); - } catch (RuntimeException | LinkageError e) { - Create.LOGGER.error("Attribute Filter: Item Group crashed while building contents.", - group.getDisplayName() - .getString(), - e); - group = null; - return false; - } - - } - - return tabContainsItem(group, stack); - } - - @Override - public boolean appliesTo(ItemStack stack) { - return false; - } - - @Override - public List listAttributesOf(ItemStack stack) { - return CreativeModeTabs.tabs() - .stream() - .filter(tab -> tab.getType() == CreativeModeTab.Type.CATEGORY) - .filter(tab -> tabContainsItem(tab, stack)) - .map(tab -> (ItemAttribute) new InItemGroup(tab)) - .toList(); - } - - private static boolean tabContainsItem(CreativeModeTab tab, ItemStack stack) { - return tab.contains(stack) || tab.contains(new ItemStack(stack.getItem())); - } - - @Override - public String getTranslationKey() { - return "in_item_group"; - } - - @Override - public Object[] getTranslationParameters() { - return new Object[] { group == null ? "" : group.getDisplayName().getString() }; - } - - @Override - public void writeNBT(CompoundTag nbt) { - if (group != null) { - ResourceLocation groupId = CreativeModeTabRegistry.getName(group); - - if (groupId != null) { - nbt.putString("group", groupId.toString()); - } - } - } - - @Override - public ItemAttribute readNBT(CompoundTag nbt) { - return nbt.contains("group") ? new InItemGroup(CreativeModeTabRegistry.getTab(new ResourceLocation(nbt.getString("group")))) : EMPTY; - } - } - - public static class AddedBy implements ItemAttribute { - - private String modId; - - public AddedBy(String modId) { - this.modId = modId; - } - - @Override - public boolean appliesTo(ItemStack stack) { - return modId.equals(stack.getItem() - .getCreatorModId(stack)); - } - - @Override - public List listAttributesOf(ItemStack stack) { - String id = stack.getItem() - .getCreatorModId(stack); - return id == null ? Collections.emptyList() : Arrays.asList(new AddedBy(id)); - } - - @Override - public String getTranslationKey() { - return "added_by"; - } - - @Override - public Object[] getTranslationParameters() { - Optional modContainerById = ModList.get() - .getModContainerById(modId); - String name = modContainerById.map(ModContainer::getModInfo) - .map(IModInfo::getDisplayName) - .orElse(StringUtils.capitalize(modId)); - return new Object[] { name }; - } - - @Override - public void writeNBT(CompoundTag nbt) { - nbt.putString("id", modId); - } - - @Override - public ItemAttribute readNBT(CompoundTag nbt) { - return new AddedBy(nbt.getString("id")); - } - - } - -} diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/attribute/BookAuthorAttribute.java b/src/main/java/com/simibubi/create/content/logistics/filter/attribute/BookAuthorAttribute.java deleted file mode 100644 index c0eaf419f5..0000000000 --- a/src/main/java/com/simibubi/create/content/logistics/filter/attribute/BookAuthorAttribute.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.simibubi.create.content.logistics.filter.attribute; - -import java.util.ArrayList; -import java.util.List; - -import com.simibubi.create.content.logistics.filter.ItemAttribute; - -import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.item.ItemStack; - -public class BookAuthorAttribute implements ItemAttribute { - String author; - - public BookAuthorAttribute(String author) { - this.author = author; - } - - @Override - public boolean appliesTo(ItemStack itemStack) { - return extractAuthor(itemStack).equals(author); - } - - @Override - public List listAttributesOf(ItemStack itemStack) { - String name = extractAuthor(itemStack); - - List atts = new ArrayList<>(); - if(name.length() > 0) { - atts.add(new BookAuthorAttribute(name)); - } - return atts; - } - - @Override - public String getTranslationKey() { - return "book_author"; - } - - @Override - public Object[] getTranslationParameters() { - return new Object[] {author}; - } - - @Override - public void writeNBT(CompoundTag nbt) { - nbt.putString("author", this.author); - } - - @Override - public ItemAttribute readNBT(CompoundTag nbt) { - return new BookAuthorAttribute(nbt.getString("author")); - } - - private String extractAuthor(ItemStack stack) { - CompoundTag nbt = stack.getTag(); - if (nbt != null && nbt.contains("author")) { - return nbt.getString("author"); - } - return ""; - } -} diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/attribute/BookCopyAttribute.java b/src/main/java/com/simibubi/create/content/logistics/filter/attribute/BookCopyAttribute.java deleted file mode 100644 index 04a60b8b31..0000000000 --- a/src/main/java/com/simibubi/create/content/logistics/filter/attribute/BookCopyAttribute.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.simibubi.create.content.logistics.filter.attribute; - -import java.util.ArrayList; -import java.util.List; - -import com.simibubi.create.content.logistics.filter.ItemAttribute; - -import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.WrittenBookItem; - -public class BookCopyAttribute implements ItemAttribute { - int generation; - - public BookCopyAttribute(int generation) { - this.generation = generation; - } - - @Override - public boolean appliesTo(ItemStack itemStack) { - return extractGeneration(itemStack) == generation; - } - - @Override - public List listAttributesOf(ItemStack itemStack) { - int generation = extractGeneration(itemStack); - - List atts = new ArrayList<>(); - if(generation >= 0) { - atts.add(new BookCopyAttribute(generation)); - } - return atts; - } - - @Override - public String getTranslationKey() { - switch(generation){ - case 0: - return "book_copy_original"; - case 1: - return "book_copy_first"; - case 2: - return "book_copy_second"; - default: - return "book_copy_tattered"; - } - } - - @Override - public void writeNBT(CompoundTag nbt) { - nbt.putInt("generation", this.generation); - } - - @Override - public ItemAttribute readNBT(CompoundTag nbt) { - return new BookCopyAttribute(nbt.getInt("generation")); - } - - @Override - public String getNBTKey() { - return "book_copy"; - } - - private int extractGeneration(ItemStack stack) { - CompoundTag nbt = stack.getTag(); - if (nbt != null && stack.getItem() instanceof WrittenBookItem) { - return nbt.getInt("generation"); - } - return -1; - } -} diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/attribute/EnchantAttribute.java b/src/main/java/com/simibubi/create/content/logistics/filter/attribute/EnchantAttribute.java deleted file mode 100644 index 1adefa478f..0000000000 --- a/src/main/java/com/simibubi/create/content/logistics/filter/attribute/EnchantAttribute.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.simibubi.create.content.logistics.filter.attribute; - -import java.util.List; -import java.util.stream.Collectors; - -import javax.annotation.Nullable; - -import com.simibubi.create.content.logistics.filter.ItemAttribute; - -import net.createmod.catnip.utility.lang.Components; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.enchantment.Enchantment; -import net.minecraft.world.item.enchantment.EnchantmentHelper; -import net.minecraftforge.registries.ForgeRegistries; - -public class EnchantAttribute implements ItemAttribute { - public static final EnchantAttribute EMPTY = new EnchantAttribute(null); - - private final Enchantment enchantment; - - public EnchantAttribute(@Nullable Enchantment enchantment) { - this.enchantment = enchantment; - } - - @Override - public boolean appliesTo(ItemStack itemStack) { - return EnchantmentHelper.getEnchantments(itemStack).containsKey(enchantment); - } - - @Override - public List listAttributesOf(ItemStack itemStack) { - return EnchantmentHelper.getEnchantments(itemStack).keySet().stream().map(EnchantAttribute::new).collect(Collectors.toList()); - } - - @Override - public String getTranslationKey() { - return "has_enchant"; - } - - @Override - public Object[] getTranslationParameters() { - String parameter = ""; - if(enchantment != null) - parameter = Components.translatable(enchantment.getDescriptionId()).getString(); - return new Object[] { parameter }; - } - - @Override - public void writeNBT(CompoundTag nbt) { - if (enchantment == null) - return; - ResourceLocation id = ForgeRegistries.ENCHANTMENTS.getKey(enchantment); - if (id == null) - return; - nbt.putString("id", id.toString()); - } - - @Override - public ItemAttribute readNBT(CompoundTag nbt) { - return nbt.contains("id") ? new EnchantAttribute(ForgeRegistries.ENCHANTMENTS.getValue(ResourceLocation.tryParse(nbt.getString("id")))) : EMPTY; - } -} diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/attribute/FluidContentsAttribute.java b/src/main/java/com/simibubi/create/content/logistics/filter/attribute/FluidContentsAttribute.java deleted file mode 100644 index 4859953b3a..0000000000 --- a/src/main/java/com/simibubi/create/content/logistics/filter/attribute/FluidContentsAttribute.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.simibubi.create.content.logistics.filter.attribute; - -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; - -import javax.annotation.Nullable; - -import com.simibubi.create.content.logistics.filter.ItemAttribute; - -import net.minecraft.nbt.CompoundTag; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.material.Fluid; -import net.minecraftforge.common.capabilities.ForgeCapabilities; -import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.fluids.capability.IFluidHandlerItem; -import net.minecraftforge.registries.ForgeRegistries; - -public class FluidContentsAttribute implements ItemAttribute { - public static final FluidContentsAttribute EMPTY = new FluidContentsAttribute(null); - - private final Fluid fluid; - - public FluidContentsAttribute(@Nullable Fluid fluid) { - this.fluid = fluid; - } - - @Override - public boolean appliesTo(ItemStack itemStack) { - return extractFluids(itemStack).contains(fluid); - } - - @Override - public List listAttributesOf(ItemStack itemStack) { - return extractFluids(itemStack).stream().map(FluidContentsAttribute::new).collect(Collectors.toList()); - } - - @Override - public String getTranslationKey() { - return "has_fluid"; - } - - @Override - public Object[] getTranslationParameters() { - String parameter = ""; - if (fluid != null) - parameter = fluid.getFluidType().getDescription().getString(); - return new Object[] { parameter }; - } - - @Override - public void writeNBT(CompoundTag nbt) { - if (fluid == null) - return; - ResourceLocation id = ForgeRegistries.FLUIDS.getKey(fluid); - if (id == null) - return; - nbt.putString("id", id.toString()); - } - - @Override - public ItemAttribute readNBT(CompoundTag nbt) { - return nbt.contains("id") ? new FluidContentsAttribute(ForgeRegistries.FLUIDS.getValue(ResourceLocation.tryParse(nbt.getString("id")))) : EMPTY; - } - - private List extractFluids(ItemStack stack) { - List fluids = new ArrayList<>(); - - LazyOptional capability = - stack.getCapability(ForgeCapabilities.FLUID_HANDLER_ITEM); - - capability.ifPresent((cap) -> { - for(int i = 0; i < cap.getTanks(); i++) { - fluids.add(cap.getFluidInTank(i).getFluid()); - } - }); - - return fluids; - } -} diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/attribute/ItemNameAttribute.java b/src/main/java/com/simibubi/create/content/logistics/filter/attribute/ItemNameAttribute.java deleted file mode 100644 index 83bab8d968..0000000000 --- a/src/main/java/com/simibubi/create/content/logistics/filter/attribute/ItemNameAttribute.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.simibubi.create.content.logistics.filter.attribute; - -import java.util.ArrayList; -import java.util.List; - -import com.google.gson.JsonParseException; -import com.simibubi.create.content.logistics.filter.ItemAttribute; - -import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.chat.Component; -import net.minecraft.world.item.ItemStack; - -public class ItemNameAttribute implements ItemAttribute { - String itemName; - - public ItemNameAttribute(String itemName) { - this.itemName = itemName; - } - - @Override - public boolean appliesTo(ItemStack itemStack) { - return extractCustomName(itemStack).equals(itemName); - } - - @Override - public List listAttributesOf(ItemStack itemStack) { - String name = extractCustomName(itemStack); - - List atts = new ArrayList<>(); - if(name.length() > 0) { - atts.add(new ItemNameAttribute(name)); - } - return atts; - } - - @Override - public String getTranslationKey() { - return "has_name"; - } - - @Override - public Object[] getTranslationParameters() { - return new Object[] { itemName }; - } - - @Override - public void writeNBT(CompoundTag nbt) { - nbt.putString("name", this.itemName); - } - - @Override - public ItemAttribute readNBT(CompoundTag nbt) { - return new ItemNameAttribute(nbt.getString("name")); - } - - private String extractCustomName(ItemStack stack) { - CompoundTag compoundnbt = stack.getTagElement("display"); - if (compoundnbt != null && compoundnbt.contains("Name", 8)) { - try { - Component itextcomponent = Component.Serializer.fromJson(compoundnbt.getString("Name")); - if (itextcomponent != null) { - return itextcomponent.getString(); - } - } catch (JsonParseException ignored) { - } - } - return ""; - } -} diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/attribute/astralsorcery/AstralSorceryAmuletAttribute.java b/src/main/java/com/simibubi/create/content/logistics/filter/attribute/astralsorcery/AstralSorceryAmuletAttribute.java deleted file mode 100644 index 68f132c840..0000000000 --- a/src/main/java/com/simibubi/create/content/logistics/filter/attribute/astralsorcery/AstralSorceryAmuletAttribute.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.simibubi.create.content.logistics.filter.attribute.astralsorcery; - -import java.util.ArrayList; -import java.util.List; - -import com.simibubi.create.content.logistics.filter.ItemAttribute; - -import net.createmod.catnip.utility.lang.Components; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListTag; -import net.minecraft.nbt.Tag; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.enchantment.Enchantment; -import net.minecraftforge.registries.ForgeRegistries; - -public class AstralSorceryAmuletAttribute implements ItemAttribute { - String enchName; - int enchType; - - public AstralSorceryAmuletAttribute(String enchName, int enchType) { - this.enchName = enchName; - this.enchType = enchType; - } - - @Override - public boolean appliesTo(ItemStack itemStack) { - for (Tag trait : extractTraitList(itemStack)) { - if(((CompoundTag) trait).getString("ench").equals(this.enchName) - && ((CompoundTag)trait).getInt("type") == this.enchType) - return true; - } - return false; - } - - @Override - public List listAttributesOf(ItemStack itemStack) { - ListTag traits = extractTraitList(itemStack); - List atts = new ArrayList<>(); - for (int i = 0; i < traits.size(); i++) { - atts.add(new AstralSorceryAmuletAttribute( - traits.getCompound(i).getString("ench"), - traits.getCompound(i).getInt("type"))); - } - return atts; - } - - @Override - public String getTranslationKey() { - return "astralsorcery_amulet"; - } - - @Override - public Object[] getTranslationParameters() { - String something = ""; - - Enchantment enchant = ForgeRegistries.ENCHANTMENTS.getValue(ResourceLocation.tryParse(enchName)); - if(enchant != null) { - something = Components.translatable(enchant.getDescriptionId()).getString(); - } - - if(enchType == 1) something = "existing " + something; - - return new Object[] { something }; - } - - @Override - public void writeNBT(CompoundTag nbt) { - nbt.putString("enchName", this.enchName); - nbt.putInt("enchType", this.enchType); - } - - @Override - public ItemAttribute readNBT(CompoundTag nbt) { - return new AstralSorceryAmuletAttribute(nbt.getString("enchName"), nbt.getInt("enchType")); - } - - private ListTag extractTraitList(ItemStack stack) { - return stack.getTag() != null ? stack.getTag().getCompound("astralsorcery").getList("amuletEnchantments", 10) : new ListTag(); - } -} diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/attribute/astralsorcery/AstralSorceryAttunementAttribute.java b/src/main/java/com/simibubi/create/content/logistics/filter/attribute/astralsorcery/AstralSorceryAttunementAttribute.java deleted file mode 100644 index 4373438142..0000000000 --- a/src/main/java/com/simibubi/create/content/logistics/filter/attribute/astralsorcery/AstralSorceryAttunementAttribute.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.simibubi.create.content.logistics.filter.attribute.astralsorcery; - -import java.util.ArrayList; -import java.util.List; - -import com.simibubi.create.content.logistics.filter.ItemAttribute; - -import net.createmod.catnip.utility.lang.Components; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.ItemStack; -import net.minecraftforge.registries.ForgeRegistries; - -public class AstralSorceryAttunementAttribute implements ItemAttribute { - String constellationName; - - public AstralSorceryAttunementAttribute(String constellationName) { - this.constellationName = constellationName; - } - - @Override - public boolean appliesTo(ItemStack itemStack) { - CompoundTag nbt = extractAstralNBT(itemStack); - String constellation = nbt.contains("constellation") ? nbt.getString("constellation") : nbt.getString("constellationName"); - - // Special handling for shifting stars - ResourceLocation itemResource = ForgeRegistries.ITEMS.getKey(itemStack.getItem()); - if (itemResource != null && itemResource.toString().contains("shifting_star_")) { - constellation = itemResource.toString().replace("shifting_star_", ""); - } - - return constellation.equals(constellationName); - } - - @Override - public List listAttributesOf(ItemStack itemStack) { - CompoundTag nbt = extractAstralNBT(itemStack); - String constellation = nbt.contains("constellation") ? nbt.getString("constellation") : nbt.getString("constellationName"); - - // Special handling for shifting stars - ResourceLocation itemResource = ForgeRegistries.ITEMS.getKey(itemStack.getItem()); - if (itemResource != null && itemResource.toString().contains("shifting_star_")) { - constellation = itemResource.toString().replace("shifting_star_", ""); - } - - List atts = new ArrayList<>(); - if(constellation.length() > 0) { - atts.add(new AstralSorceryAttunementAttribute(constellation)); - } - return atts; - } - - @Override - public String getTranslationKey() { - return "astralsorcery_constellation"; - } - - @Override - public Object[] getTranslationParameters() { - ResourceLocation constResource = new ResourceLocation(constellationName); - String something = Components.translatable(String.format("%s.constellation.%s", constResource.getNamespace(), constResource.getPath())).getString(); - return new Object[] { something }; - } - - @Override - public void writeNBT(CompoundTag nbt) { - nbt.putString("constellation", this.constellationName); - } - - @Override - public ItemAttribute readNBT(CompoundTag nbt) { - return new AstralSorceryAttunementAttribute(nbt.getString("constellation")); - } - - private CompoundTag extractAstralNBT(ItemStack stack) { - return stack.getTag() != null ? stack.getTag().getCompound("astralsorcery") : new CompoundTag(); - } -} diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/attribute/astralsorcery/AstralSorceryCrystalAttribute.java b/src/main/java/com/simibubi/create/content/logistics/filter/attribute/astralsorcery/AstralSorceryCrystalAttribute.java deleted file mode 100644 index 8ec6b1d1c1..0000000000 --- a/src/main/java/com/simibubi/create/content/logistics/filter/attribute/astralsorcery/AstralSorceryCrystalAttribute.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.simibubi.create.content.logistics.filter.attribute.astralsorcery; - -import java.util.ArrayList; -import java.util.List; - -import com.simibubi.create.content.logistics.filter.ItemAttribute; - -import net.createmod.catnip.utility.lang.Components; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListTag; -import net.minecraft.nbt.Tag; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.ItemStack; - -public class AstralSorceryCrystalAttribute implements ItemAttribute { - String traitName; - - public AstralSorceryCrystalAttribute(String traitName) { - this.traitName = traitName; - } - - @Override - public boolean appliesTo(ItemStack itemStack) { - for (Tag trait : extractTraitList(itemStack)) { - if(((CompoundTag) trait).getString("property").equals(this.traitName)) - return true; - } - return false; - } - - @Override - public List listAttributesOf(ItemStack itemStack) { - ListTag traits = extractTraitList(itemStack); - List atts = new ArrayList<>(); - for (int i = 0; i < traits.size(); i++) { - atts.add(new AstralSorceryCrystalAttribute(traits.getCompound(i).getString("property"))); - } - return atts; - } - - @Override - public String getTranslationKey() { - return "astralsorcery_crystal"; - } - - @Override - public Object[] getTranslationParameters() { - ResourceLocation traitResource = new ResourceLocation(traitName); - String something = Components.translatable(String.format("crystal.property.%s.%s.name", traitResource.getNamespace(), traitResource.getPath())).getString(); - return new Object[] { something }; - } - - @Override - public void writeNBT(CompoundTag nbt) { - nbt.putString("property", this.traitName); - } - - @Override - public ItemAttribute readNBT(CompoundTag nbt) { - return new AstralSorceryCrystalAttribute(nbt.getString("property")); - } - - private ListTag extractTraitList(ItemStack stack) { - return stack.getTag() != null ? stack.getTag().getCompound("astralsorcery").getCompound("crystalProperties").getList("attributes", 10) : new ListTag(); - } -} diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/attribute/astralsorcery/AstralSorceryPerkGemAttribute.java b/src/main/java/com/simibubi/create/content/logistics/filter/attribute/astralsorcery/AstralSorceryPerkGemAttribute.java deleted file mode 100644 index beacd4e8a9..0000000000 --- a/src/main/java/com/simibubi/create/content/logistics/filter/attribute/astralsorcery/AstralSorceryPerkGemAttribute.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.simibubi.create.content.logistics.filter.attribute.astralsorcery; - -import java.util.ArrayList; -import java.util.List; - -import com.simibubi.create.content.logistics.filter.ItemAttribute; - -import net.createmod.catnip.utility.lang.Components; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListTag; -import net.minecraft.nbt.Tag; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.ItemStack; - -public class AstralSorceryPerkGemAttribute implements ItemAttribute { - String traitName; - - public AstralSorceryPerkGemAttribute(String traitName) { - this.traitName = traitName; - } - - @Override - public boolean appliesTo(ItemStack itemStack) { - for (Tag trait : extractTraitList(itemStack)) { - if(((CompoundTag) trait).getString("type").equals(this.traitName)) - return true; - } - return false; - } - - @Override - public List listAttributesOf(ItemStack itemStack) { - ListTag traits = extractTraitList(itemStack); - List atts = new ArrayList<>(); - for (int i = 0; i < traits.size(); i++) { - atts.add(new AstralSorceryPerkGemAttribute(traits.getCompound(i).getString("type"))); - } - return atts; - } - - @Override - public String getTranslationKey() { - return "astralsorcery_perk_gem"; - } - - @Override - public Object[] getTranslationParameters() { - ResourceLocation traitResource = new ResourceLocation(traitName); - String something = Components.translatable(String.format("perk.attribute.%s.%s.name", traitResource.getNamespace(), traitResource.getPath())).getString(); - return new Object[] { something }; - } - - @Override - public void writeNBT(CompoundTag nbt) { - nbt.putString("type", this.traitName); - } - - @Override - public ItemAttribute readNBT(CompoundTag nbt) { - return new AstralSorceryPerkGemAttribute(nbt.getString("type")); - } - - private ListTag extractTraitList(ItemStack stack) { - return stack.getTag() != null ? stack.getTag().getCompound("astralsorcery").getList("attribute_modifiers", 10) : new ListTag(); - } -} diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/AllItemAttributeTypes.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/AllItemAttributeTypes.java new file mode 100644 index 0000000000..af5f8e631d --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/AllItemAttributeTypes.java @@ -0,0 +1,128 @@ +package com.simibubi.create.content.logistics.item.filter.attribute; + +import java.util.function.BiPredicate; +import java.util.function.Predicate; +import java.util.function.Supplier; + +import com.simibubi.create.content.logistics.item.filter.attribute.attributes.astralsorcery.AstralSorceryAttunementAttribute; + +import com.simibubi.create.content.logistics.item.filter.attribute.attributes.astralsorcery.AstralSorceryCrystalAttribute; + +import com.simibubi.create.content.logistics.item.filter.attribute.attributes.astralsorcery.AstralSorceryPerkGemAttribute; + +import com.simibubi.create.content.logistics.item.filter.attribute.legacydeserializers.AllItemAttributeLegacyDeserializers; + +import org.jetbrains.annotations.ApiStatus; + +import com.simibubi.create.AllRecipeTypes; +import com.simibubi.create.AllRegistries; +import com.simibubi.create.Create; +import com.simibubi.create.content.kinetics.fan.processing.AllFanProcessingTypes; +import com.simibubi.create.content.logistics.item.filter.attribute.attributes.AddedByAttribute; +import com.simibubi.create.content.logistics.item.filter.attribute.attributes.BookAuthorAttribute; +import com.simibubi.create.content.logistics.item.filter.attribute.attributes.BookCopyAttribute; +import com.simibubi.create.content.logistics.item.filter.attribute.attributes.ColorAttribute; +import com.simibubi.create.content.logistics.item.filter.attribute.attributes.EnchantAttribute; +import com.simibubi.create.content.logistics.item.filter.attribute.attributes.FluidContentsAttribute; +import com.simibubi.create.content.logistics.item.filter.attribute.attributes.InItemGroupAttribute; +import com.simibubi.create.content.logistics.item.filter.attribute.attributes.InTagAttribute; +import com.simibubi.create.content.logistics.item.filter.attribute.attributes.ItemNameAttribute; +import com.simibubi.create.content.logistics.item.filter.attribute.attributes.ShulkerFillLevelAttribute; +import com.simibubi.create.content.logistics.item.filter.attribute.attributes.astralsorcery.AstralSorceryAmuletAttribute; + +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.AbstractCookingRecipe; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.ComposterBlock; +import net.minecraft.world.level.block.entity.AbstractFurnaceBlockEntity; +import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.items.ItemStackHandler; +import net.minecraftforge.items.wrapper.RecipeWrapper; +import net.minecraftforge.registries.DeferredRegister; + +// TODO - Documentation +public class AllItemAttributeTypes { + private static final DeferredRegister REGISTER = DeferredRegister.create(AllRegistries.Keys.ITEM_ATTRIBUTE_TYPES, Create.ID); + private static final RecipeWrapper RECIPE_WRAPPER = new RecipeWrapper(new ItemStackHandler(1)); + + public static final Supplier + PLACEABLE = singleton("placeable", s -> s.getItem() instanceof BlockItem), + CONSUMABLE = singleton("consumable", ItemStack::isEdible), + FLUID_CONTAINER = singleton("fluid_container", s -> s.getCapability(ForgeCapabilities.FLUID_HANDLER_ITEM) + .isPresent()), + ENCHANTED = singleton("enchanted", ItemStack::isEnchanted), + MAX_ENCHANTED = singleton("max_enchanted", AllItemAttributeTypes::maxEnchanted), + RENAMED = singleton("renamed", ItemStack::hasCustomHoverName), + DAMAGED = singleton("damaged", ItemStack::isDamaged), + BADLY_DAMAGED = singleton("badly_damaged", s -> s.isDamaged() && (float) s.getDamageValue() / s.getMaxDamage() > 3 / 4f), + NOT_STACKABLE = singleton("not_stackable", ((Predicate) ItemStack::isStackable).negate()), + EQUIPABLE = singleton("equipable", s -> LivingEntity.getEquipmentSlotForItem(s) + .getType() != EquipmentSlot.Type.HAND), + FURNACE_FUEL = singleton("furnace_fuel", AbstractFurnaceBlockEntity::isFuel), + WASHABLE = singleton("washable", AllFanProcessingTypes.SPLASHING::canProcess), + HAUNTABLE = singleton("hauntable", AllFanProcessingTypes.HAUNTING::canProcess), + CRUSHABLE = singleton("crushable", (s, w) -> testRecipe(s, w, AllRecipeTypes.CRUSHING.getType()) + || testRecipe(s, w, AllRecipeTypes.MILLING.getType())), + SMELTABLE = singleton("smeltable", (s, w) -> testRecipe(s, w, RecipeType.SMELTING)), + SMOKABLE = singleton("smokable", (s, w) -> testRecipe(s, w, RecipeType.SMOKING)), + BLASTABLE = singleton("blastable", (s, w) -> testRecipe(s, w, RecipeType.BLASTING)), + COMPOSTABLE = singleton("compostable", s -> ComposterBlock.COMPOSTABLES.containsKey(s.getItem())), + + IN_TAG = register("in_tag", new InTagAttribute.Type()), + IN_ITEM_GROUP = register("in_item_group", new InItemGroupAttribute.Type()), + ADDED_BY = register("added_by", new AddedByAttribute.Type()), + HAS_ENCHANT = register("has_enchant", new EnchantAttribute.Type()), + SHULKER_FILL_LEVEL = register("shulker_fill_level", new ShulkerFillLevelAttribute.Type()), + HAS_COLOR = register("has_color", new ColorAttribute.Type()), + HAS_FLUID = register("has_fluid", new FluidContentsAttribute.Type()), + HAS_NAME = register("has_name", new ItemNameAttribute.Type()), + BOOK_AUTHOR = register("book_author", new BookAuthorAttribute.Type()), + BOOK_COPY = register("book_copy", new BookCopyAttribute.Type()), + + ASTRAL_AMULET = register("astral_amulet", new AstralSorceryAmuletAttribute.Type()), + ASTRAL_ATTUNMENT = register("astral_attunment", new AstralSorceryAttunementAttribute.Type()), + ASTRAL_CRYSTAL = register("astral_crystal", new AstralSorceryCrystalAttribute.Type()), + ASTRAL_PERK_GEM = register("astral_perk_gem", new AstralSorceryPerkGemAttribute.Type()); + + private static boolean testRecipe(ItemStack s, Level w, RecipeType type) { + RECIPE_WRAPPER.setItem(0, s.copy()); + return w.getRecipeManager() + .getRecipeFor(type, RECIPE_WRAPPER, w) + .isPresent(); + } + + // TODO - Move away from stream() + private static boolean maxEnchanted(ItemStack s) { + return EnchantmentHelper.getEnchantments(s) + .entrySet() + .stream() + .anyMatch(e -> e.getKey() + .getMaxLevel() <= e.getValue()); + } + + private static Supplier singleton(String id, Predicate predicate) { + return register(id, new SingletonItemAttribute.Type(type -> new SingletonItemAttribute(type, (stack, level) -> predicate.test(stack), id))); + } + + private static Supplier singleton(String id, BiPredicate predicate) { + return register(id, new SingletonItemAttribute.Type(type -> new SingletonItemAttribute(type, predicate, id))); + } + + private static Supplier register(String id, ItemAttributeType type) { + return REGISTER.register(id, () -> type); + } + + @ApiStatus.Internal + public static void register(IEventBus modEventBus) { + REGISTER.register(modEventBus); + + // Register legacy deserializers to maintain backwards compatability + AllItemAttributeLegacyDeserializers.register(); + } +} diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/ItemAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/ItemAttribute.java new file mode 100644 index 0000000000..0bf8a8dc25 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/ItemAttribute.java @@ -0,0 +1,94 @@ +package com.simibubi.create.content.logistics.item.filter.attribute; + +import java.util.ArrayList; +import java.util.List; + +import com.simibubi.create.foundation.utility.CreateLang; + +import org.jetbrains.annotations.Nullable; + +import com.simibubi.create.AllRegistries; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +public interface ItemAttribute { + static CompoundTag saveStatic(ItemAttribute attribute) { + CompoundTag nbt = new CompoundTag(); + ResourceLocation id = AllRegistries.ITEM_ATTRIBUTE_TYPES.get().getKey(attribute.getType()); + + if (id == null) + throw new IllegalArgumentException("Cannot get " + attribute.getType() + "as it does not exist in AllRegistries.ITEM_ATTRIBUTE_TYPES"); + + nbt.putString("id", id.toString()); + attribute.save(nbt); + return nbt; + } + + @Nullable + static ItemAttribute loadStatic(CompoundTag nbt) { + for (LegacyDeserializer deserializer : LegacyDeserializer.ALL) { + if (deserializer.canRead(nbt)) { + return deserializer.readNBT(nbt.getCompound(deserializer.getNBTKey())); + } + } + + ResourceLocation id = ResourceLocation.tryParse(nbt.getString("id")); + if (id == null) { + return null; + } + ItemAttributeType type = AllRegistries.ITEM_ATTRIBUTE_TYPES.get().getValue(id); + if (type == null) { + return null; + } + ItemAttribute attribute = type.createAttribute(); + attribute.load(nbt); + return attribute; + } + + static List getAllAttributes(ItemStack stack, Level level) { + List attributes = new ArrayList<>(); + for (ItemAttributeType type : AllRegistries.ITEM_ATTRIBUTE_TYPES.get()) { + attributes.addAll(type.getAllAttributes(stack, level)); + } + return attributes; + } + + boolean appliesTo(ItemStack stack, Level world); + + ItemAttributeType getType(); + + void save(CompoundTag nbt); + + void load(CompoundTag nbt); + + @OnlyIn(value = Dist.CLIENT) + default MutableComponent format(boolean inverted) { + return CreateLang.translateDirect("item_attributes." + getTranslationKey() + (inverted ? ".inverted" : ""), + getTranslationParameters()); + } + + String getTranslationKey(); + + default Object[] getTranslationParameters() { + return new String[0]; + } + + @Deprecated + interface LegacyDeserializer { + List ALL = new ArrayList<>(); + + default boolean canRead(CompoundTag nbt) { + return nbt.contains(getNBTKey()); + } + + String getNBTKey(); + + ItemAttribute readNBT(CompoundTag nbt); + } +} diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/ItemAttributeType.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/ItemAttributeType.java new file mode 100644 index 0000000000..7092ca4a93 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/ItemAttributeType.java @@ -0,0 +1,14 @@ +package com.simibubi.create.content.logistics.item.filter.attribute; + +import java.util.List; + +import org.jetbrains.annotations.NotNull; + +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; + +public interface ItemAttributeType { + @NotNull ItemAttribute createAttribute(); + + List getAllAttributes(ItemStack stack, Level level); +} diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/SingletonItemAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/SingletonItemAttribute.java new file mode 100644 index 0000000000..81c5f53c61 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/SingletonItemAttribute.java @@ -0,0 +1,67 @@ +package com.simibubi.create.content.logistics.item.filter.attribute; + +import java.util.List; +import java.util.function.BiPredicate; +import java.util.function.Function; + +import com.mojang.serialization.Codec; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; + +import org.jetbrains.annotations.NotNull; + +public final class SingletonItemAttribute implements ItemAttribute { + private final Type type; + private final BiPredicate predicate; + private final String translationKey; + + public SingletonItemAttribute(Type type, BiPredicate predicate, String translationKey) { + this.type = type; + this.predicate = predicate; + this.translationKey = translationKey; + } + + @Override + public boolean appliesTo(ItemStack stack, Level world) { + return predicate.test(stack, world); + } + + @Override + public ItemAttributeType getType() { + return type; + } + + @Override + public void save(CompoundTag nbt) {} // NO-OP + + @Override + public void load(CompoundTag nbt) {} // NO-OP + + @Override + public String getTranslationKey() { + return translationKey; + } + + public static final class Type implements ItemAttributeType { + private final SingletonItemAttribute attribute; + + public Type(Function singletonFunc) { + this.attribute = singletonFunc.apply(this); + } + + @Override + public @NotNull ItemAttribute createAttribute() { + return attribute; + } + + @Override + public List getAllAttributes(ItemStack stack, Level level) { + if (attribute.appliesTo(stack, level)) { + return List.of(attribute); + } + return List.of(); + } + } +} diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/AddedByAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/AddedByAttribute.java new file mode 100644 index 0000000000..53a32a1e95 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/AddedByAttribute.java @@ -0,0 +1,77 @@ +package com.simibubi.create.content.logistics.item.filter.attribute.attributes; + +import java.util.Collections; +import java.util.List; +import java.util.Optional; + +import org.apache.commons.lang3.StringUtils; +import org.jetbrains.annotations.NotNull; + +import com.simibubi.create.content.logistics.item.filter.attribute.AllItemAttributeTypes; +import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttribute; +import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttributeType; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraftforge.fml.ModContainer; +import net.minecraftforge.fml.ModList; +import net.minecraftforge.forgespi.language.IModInfo; + +public class AddedByAttribute implements ItemAttribute { + private String modId; + + public AddedByAttribute(String modId) { + this.modId = modId; + } + + @Override + public boolean appliesTo(ItemStack stack, Level world) { + return modId.equals(stack.getItem() + .getCreatorModId(stack)); + } + + @Override + public String getTranslationKey() { + return "added_by"; + } + + @Override + public Object[] getTranslationParameters() { + Optional modContainerById = ModList.get() + .getModContainerById(modId); + String name = modContainerById.map(ModContainer::getModInfo) + .map(IModInfo::getDisplayName) + .orElse(StringUtils.capitalize(modId)); + return new Object[]{name}; + } + + @Override + public void save(CompoundTag nbt) { + nbt.putString("id", modId); + } + + @Override + public void load(CompoundTag nbt) { + modId = nbt.getString("id"); + } + + @Override + public ItemAttributeType getType() { + return AllItemAttributeTypes.ADDED_BY.get(); + } + + public static class Type implements ItemAttributeType { + @Override + public @NotNull ItemAttribute createAttribute() { + return new AddedByAttribute("dummy"); + } + + @Override + public List getAllAttributes(ItemStack stack, Level level) { + String id = stack.getItem() + .getCreatorModId(stack); + return id == null ? Collections.emptyList() : List.of(new AddedByAttribute(id)); + } + } +} diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/BookAuthorAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/BookAuthorAttribute.java new file mode 100644 index 0000000000..85e402d458 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/BookAuthorAttribute.java @@ -0,0 +1,79 @@ +package com.simibubi.create.content.logistics.item.filter.attribute.attributes; + +import java.util.ArrayList; +import java.util.List; + +import org.jetbrains.annotations.NotNull; + +import com.simibubi.create.content.logistics.item.filter.attribute.AllItemAttributeTypes; +import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttribute; +import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttributeType; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; + +public class BookAuthorAttribute implements ItemAttribute { + private String author; + + public BookAuthorAttribute(String author) { + this.author = author; + } + + private static String extractAuthor(ItemStack stack) { + CompoundTag nbt = stack.getTag(); + if (nbt != null && nbt.contains("author")) { + return nbt.getString("author"); + } + return ""; + } + + @Override + public boolean appliesTo(ItemStack itemStack, Level level) { + return extractAuthor(itemStack).equals(author); + } + + @Override + public String getTranslationKey() { + return "book_author"; + } + + @Override + public Object[] getTranslationParameters() { + return new Object[]{author}; + } + + @Override + public ItemAttributeType getType() { + return AllItemAttributeTypes.BOOK_AUTHOR.get(); + } + + @Override + public void save(CompoundTag nbt) { + nbt.putString("author", author); + } + + @Override + public void load(CompoundTag nbt) { + author = nbt.getString("author"); + } + + public static class Type implements ItemAttributeType { + @Override + public @NotNull ItemAttribute createAttribute() { + return new BookAuthorAttribute("dummy"); + } + + @Override + public List getAllAttributes(ItemStack stack, Level level) { + List list = new ArrayList<>(); + + String name = BookAuthorAttribute.extractAuthor(stack); + if (!name.isEmpty()) { + list.add(new BookAuthorAttribute(name)); + } + + return list; + } + } +} diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/BookCopyAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/BookCopyAttribute.java new file mode 100644 index 0000000000..7ce11d2d69 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/BookCopyAttribute.java @@ -0,0 +1,80 @@ +package com.simibubi.create.content.logistics.item.filter.attribute.attributes; + +import java.util.ArrayList; +import java.util.List; + +import org.jetbrains.annotations.NotNull; + +import com.simibubi.create.content.logistics.item.filter.attribute.AllItemAttributeTypes; +import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttribute; +import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttributeType; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.WrittenBookItem; +import net.minecraft.world.level.Level; + +public class BookCopyAttribute implements ItemAttribute { + private int generation; + + public BookCopyAttribute(int generation) { + this.generation = generation; + } + + private static int extractGeneration(ItemStack stack) { + CompoundTag nbt = stack.getTag(); + if (nbt != null && stack.getItem() instanceof WrittenBookItem) { + return nbt.getInt("generation"); + } + return -1; + } + + @Override + public boolean appliesTo(ItemStack itemStack, Level level) { + return extractGeneration(itemStack) == generation; + } + + @Override + public String getTranslationKey() { + return switch (generation) { + case 0 -> "book_copy_original"; + case 1 -> "book_copy_first"; + case 2 -> "book_copy_second"; + default -> "book_copy_tattered"; + }; + } + + @Override + public ItemAttributeType getType() { + return AllItemAttributeTypes.BOOK_COPY.get(); + } + + @Override + public void save(CompoundTag nbt) { + nbt.putInt("generation", generation); + } + + @Override + public void load(CompoundTag nbt) { + generation = nbt.getInt("generation"); + } + + public static class Type implements ItemAttributeType { + @Override + public @NotNull ItemAttribute createAttribute() { + return new BookCopyAttribute(-1); + } + + @Override + public List getAllAttributes(ItemStack stack, Level level) { + List list = new ArrayList<>(); + + int generation = BookCopyAttribute.extractGeneration(stack); + if (generation >= 0) { + list.add(new BookCopyAttribute(generation)); + } + + return list; + } + } +} diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/attribute/ColorAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/ColorAttribute.java similarity index 58% rename from src/main/java/com/simibubi/create/content/logistics/filter/attribute/ColorAttribute.java rename to src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/ColorAttribute.java index ec03bbae00..95c543b073 100644 --- a/src/main/java/com/simibubi/create/content/logistics/filter/attribute/ColorAttribute.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/ColorAttribute.java @@ -1,14 +1,17 @@ -package com.simibubi.create.content.logistics.filter.attribute; +package com.simibubi.create.content.logistics.item.filter.attribute.attributes; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; -import java.util.stream.Collectors; -import com.simibubi.create.content.logistics.filter.ItemAttribute; +import com.simibubi.create.content.logistics.item.filter.attribute.AllItemAttributeTypes; +import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttribute; + +import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttributeType; import net.createmod.catnip.platform.CatnipServices; import net.minecraft.client.resources.language.I18n; @@ -18,27 +21,18 @@ import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.FireworkRocketItem; import net.minecraft.world.item.FireworkStarItem; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; + +import org.jetbrains.annotations.NotNull; public class ColorAttribute implements ItemAttribute { - public static final ColorAttribute EMPTY = new ColorAttribute(DyeColor.PURPLE); - - public final DyeColor color; + private DyeColor color; public ColorAttribute(DyeColor color) { this.color = color; } - @Override - public boolean appliesTo(ItemStack itemStack) { - return findMatchingDyeColors(itemStack).stream().anyMatch(color::equals); - } - - @Override - public List listAttributesOf(ItemStack itemStack) { - return findMatchingDyeColors(itemStack).stream().map(ColorAttribute::new).collect(Collectors.toList()); - } - - private Collection findMatchingDyeColors(ItemStack stack) { + private static Collection findMatchingDyeColors(ItemStack stack) { CompoundTag nbt = stack.getTag(); DyeColor color = DyeColor.getColor(stack); @@ -62,13 +56,18 @@ public class ColorAttribute implements ItemAttribute { return colors; } - private Collection getFireworkStarColors(CompoundTag compound) { + private static Collection getFireworkStarColors(CompoundTag compound) { Set colors = new HashSet<>(); Arrays.stream(compound.getIntArray("Colors")).mapToObj(DyeColor::byFireworkColor).forEach(colors::add); Arrays.stream(compound.getIntArray("FadeColors")).mapToObj(DyeColor::byFireworkColor).forEach(colors::add); return colors; } + @Override + public boolean appliesTo(ItemStack itemStack, Level level) { + return findMatchingDyeColors(itemStack).stream().anyMatch(color::equals); + } + @Override public String getTranslationKey() { return "color"; @@ -76,18 +75,41 @@ public class ColorAttribute implements ItemAttribute { @Override public Object[] getTranslationParameters() { - return new Object[] { I18n.get("color.minecraft." + color.getName()) }; + return new Object[]{I18n.get("color.minecraft." + color.getName())}; } @Override - public void writeNBT(CompoundTag nbt) { + public ItemAttributeType getType() { + return AllItemAttributeTypes.HAS_COLOR.get(); + } + + @Override + public void save(CompoundTag nbt) { nbt.putInt("id", color.getId()); } @Override - public ItemAttribute readNBT(CompoundTag nbt) { - return nbt.contains("id") ? - new ColorAttribute(DyeColor.byId(nbt.getInt("id"))) - : EMPTY; + public void load(CompoundTag nbt) { + if (nbt.contains("id")) { + color = DyeColor.byId(nbt.getInt("id")); + } + } + + public static class Type implements ItemAttributeType { + @Override + public @NotNull ItemAttribute createAttribute() { + return new ColorAttribute(DyeColor.PURPLE); + } + + @Override + public List getAllAttributes(ItemStack stack, Level level) { + List list = new ArrayList<>(); + + for (DyeColor color : ColorAttribute.findMatchingDyeColors(stack)) { + list.add(new ColorAttribute(color)); + } + + return list; + } } } diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/EnchantAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/EnchantAttribute.java new file mode 100644 index 0000000000..9d1e840448 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/EnchantAttribute.java @@ -0,0 +1,87 @@ +package com.simibubi.create.content.logistics.item.filter.attribute.attributes; + +import java.util.ArrayList; +import java.util.List; + +import net.createmod.catnip.utility.lang.Components; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import com.simibubi.create.content.logistics.item.filter.attribute.AllItemAttributeTypes; +import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttribute; +import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttributeType; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.level.Level; +import net.minecraftforge.registries.ForgeRegistries; + +public class EnchantAttribute implements ItemAttribute { + private @Nullable Enchantment enchantment; + + public EnchantAttribute(@Nullable Enchantment enchantment) { + this.enchantment = enchantment; + } + + @Override + public boolean appliesTo(ItemStack itemStack, Level level) { + return EnchantmentHelper.getEnchantments(itemStack).containsKey(enchantment); + } + + @Override + public String getTranslationKey() { + return "has_enchant"; + } + + @Override + public Object[] getTranslationParameters() { + String parameter = ""; + if (enchantment != null) + parameter = Components.translatable(enchantment.getDescriptionId()).getString(); + return new Object[]{parameter}; + } + + @Override + public ItemAttributeType getType() { + return AllItemAttributeTypes.HAS_ENCHANT.get(); + } + + @Override + public void save(CompoundTag nbt) { + if (enchantment == null) + return; + ResourceLocation id = ForgeRegistries.ENCHANTMENTS.getKey(enchantment); + if (id == null) + return; + nbt.putString("id", id.toString()); + } + + @Override + public void load(CompoundTag nbt) { + if (nbt.contains("id")) { + enchantment = ForgeRegistries.ENCHANTMENTS.getValue(ResourceLocation.tryParse(nbt.getString("id"))); + } + } + + public static class Type implements ItemAttributeType { + @Override + public @NotNull ItemAttribute createAttribute() { + return new EnchantAttribute(null); + } + + @Override + public List getAllAttributes(ItemStack stack, Level level) { + List list = new ArrayList<>(); + + for (Enchantment enchantment : EnchantmentHelper.getEnchantments(stack).keySet()) { + list.add(new EnchantAttribute(enchantment)); + } + + return list; + } + } +} diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/FluidContentsAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/FluidContentsAttribute.java new file mode 100644 index 0000000000..5c79cd08ec --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/FluidContentsAttribute.java @@ -0,0 +1,102 @@ +package com.simibubi.create.content.logistics.item.filter.attribute.attributes; + +import java.util.ArrayList; +import java.util.List; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import com.simibubi.create.content.logistics.item.filter.attribute.AllItemAttributeTypes; +import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttribute; +import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttributeType; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.material.Fluid; +import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.fluids.capability.IFluidHandlerItem; +import net.minecraftforge.registries.ForgeRegistries; + +public class FluidContentsAttribute implements ItemAttribute { + private @Nullable Fluid fluid; + + public FluidContentsAttribute(@Nullable Fluid fluid) { + this.fluid = fluid; + } + + private static List extractFluids(ItemStack stack) { + List fluids = new ArrayList<>(); + + LazyOptional capability = + stack.getCapability(ForgeCapabilities.FLUID_HANDLER_ITEM); + + capability.ifPresent((cap) -> { + for (int i = 0; i < cap.getTanks(); i++) { + fluids.add(cap.getFluidInTank(i).getFluid()); + } + }); + + return fluids; + } + + @Override + public boolean appliesTo(ItemStack itemStack, Level level) { + return extractFluids(itemStack).contains(fluid); + } + + @Override + public String getTranslationKey() { + return "has_fluid"; + } + + @Override + public Object[] getTranslationParameters() { + String parameter = ""; + if (fluid != null) + parameter = fluid.getFluidType().getDescription().getString(); + return new Object[]{parameter}; + } + + @Override + public ItemAttributeType getType() { + return AllItemAttributeTypes.HAS_FLUID.get(); + } + + @Override + public void save(CompoundTag nbt) { + if (fluid == null) + return; + ResourceLocation id = ForgeRegistries.FLUIDS.getKey(fluid); + if (id == null) + return; + nbt.putString("id", id.toString()); + } + + @Override + public void load(CompoundTag nbt) { + if (nbt.contains("id")) { + fluid = ForgeRegistries.FLUIDS.getValue(ResourceLocation.tryParse(nbt.getString("id"))); + } + } + + public static class Type implements ItemAttributeType { + @Override + public @NotNull ItemAttribute createAttribute() { + return new FluidContentsAttribute(null); + } + + @Override + public List getAllAttributes(ItemStack stack, Level level) { + List list = new ArrayList<>(); + + for (Fluid fluid : extractFluids(stack)) { + list.add(new FluidContentsAttribute(fluid)); + } + + return list; + } + } +} diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/InItemGroupAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/InItemGroupAttribute.java new file mode 100644 index 0000000000..fdcab3373b --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/InItemGroupAttribute.java @@ -0,0 +1,109 @@ +package com.simibubi.create.content.logistics.item.filter.attribute.attributes; + +import java.util.ArrayList; +import java.util.List; + +import org.jetbrains.annotations.NotNull; + +import com.simibubi.create.Create; +import com.simibubi.create.content.logistics.item.filter.attribute.AllItemAttributeTypes; +import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttribute; +import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttributeType; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.CreativeModeTabs; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraftforge.common.CreativeModeTabRegistry; + +public class InItemGroupAttribute implements ItemAttribute { + private CreativeModeTab group; + + public InItemGroupAttribute(CreativeModeTab group) { + this.group = group; + } + + private static boolean tabContainsItem(CreativeModeTab tab, ItemStack stack) { + return tab.contains(stack) || tab.contains(new ItemStack(stack.getItem())); + } + + @Override + public boolean appliesTo(ItemStack stack, Level world) { + if (group == null) + return false; + + if (group.getDisplayItems() + .isEmpty() + && group.getSearchTabDisplayItems() + .isEmpty()) { + + try { + group.buildContents(new CreativeModeTab.ItemDisplayParameters(world.enabledFeatures(), false, + world.registryAccess())); + } catch (RuntimeException | LinkageError e) { + Create.LOGGER.error("Attribute Filter: Item Group {} crashed while building contents.", + group.getDisplayName().getString(), e); + group = null; + return false; + } + + } + + return tabContainsItem(group, stack); + } + + @Override + public String getTranslationKey() { + return "in_item_group"; + } + + @Override + public Object[] getTranslationParameters() { + return new Object[]{group == null ? "" : group.getDisplayName().getString()}; + } + + @Override + public ItemAttributeType getType() { + return AllItemAttributeTypes.IN_ITEM_GROUP.get(); + } + + @Override + public void save(CompoundTag nbt) { + if (group != null) { + ResourceLocation groupId = CreativeModeTabRegistry.getName(group); + + if (groupId != null) { + nbt.putString("group", groupId.toString()); + } + } + } + + @Override + public void load(CompoundTag nbt) { + if (nbt.contains("group")) { + group = CreativeModeTabRegistry.getTab(new ResourceLocation(nbt.getString("group"))); + } + } + + public static class Type implements ItemAttributeType { + @Override + public @NotNull ItemAttribute createAttribute() { + return new InItemGroupAttribute(null); + } + + @Override + public List getAllAttributes(ItemStack stack, Level level) { + List list = new ArrayList<>(); + + for (CreativeModeTab tab : CreativeModeTabs.tabs()) { + if (tab.getType() == CreativeModeTab.Type.CATEGORY && tabContainsItem(tab, stack)) { + list.add(new InItemGroupAttribute(tab)); + } + } + + return list; + } + } +} diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/InTagAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/InTagAttribute.java new file mode 100644 index 0000000000..0ca1a8067b --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/InTagAttribute.java @@ -0,0 +1,73 @@ +package com.simibubi.create.content.logistics.item.filter.attribute.attributes; + +import java.util.List; +import java.util.stream.Collectors; + +import net.createmod.catnip.utility.NBTHelper; + +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NotNull; + +import com.simibubi.create.content.logistics.item.filter.attribute.AllItemAttributeTypes; +import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttribute; +import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttributeType; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.tags.ItemTags; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; + +public class InTagAttribute implements ItemAttribute { + @ApiStatus.Internal + public TagKey tag; + + public InTagAttribute(TagKey tag) { + this.tag = tag; + } + + @Override + public boolean appliesTo(ItemStack stack, Level level) { + return stack.is(tag); + } + + @Override + public String getTranslationKey() { + return "in_tag"; + } + + @Override + public Object[] getTranslationParameters() { + return new Object[]{"#" + tag.location()}; + } + + @Override + public ItemAttributeType getType() { + return AllItemAttributeTypes.IN_TAG.get(); + } + + @Override + public void save(CompoundTag nbt) { + NBTHelper.writeResourceLocation(nbt, "tag", tag.location()); + } + + @Override + public void load(CompoundTag nbt) { + tag = ItemTags.create(NBTHelper.readResourceLocation(nbt, "tag")); + } + + public static class Type implements ItemAttributeType { + @Override + public @NotNull ItemAttribute createAttribute() { + return new InTagAttribute(ItemTags.LOGS); + } + + @Override + public List getAllAttributes(ItemStack stack, Level level) { + return stack.getTags() + .map(InTagAttribute::new) + .collect(Collectors.toList()); + } + } +} diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/ItemNameAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/ItemNameAttribute.java new file mode 100644 index 0000000000..94c3d50d1f --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/ItemNameAttribute.java @@ -0,0 +1,87 @@ +package com.simibubi.create.content.logistics.item.filter.attribute.attributes; + +import java.util.ArrayList; +import java.util.List; + +import org.jetbrains.annotations.NotNull; + +import com.google.gson.JsonParseException; +import com.simibubi.create.content.logistics.item.filter.attribute.AllItemAttributeTypes; +import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttribute; +import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttributeType; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; + +public class ItemNameAttribute implements ItemAttribute { + private String itemName; + + public ItemNameAttribute(String itemName) { + this.itemName = itemName; + } + + private static String extractCustomName(ItemStack stack) { + CompoundTag compoundnbt = stack.getTagElement("display"); + if (compoundnbt != null && compoundnbt.contains("Name", 8)) { + try { + Component itextcomponent = Component.Serializer.fromJson(compoundnbt.getString("Name")); + if (itextcomponent != null) { + return itextcomponent.getString(); + } + } catch (JsonParseException ignored) { + } + } + return ""; + } + + @Override + public boolean appliesTo(ItemStack itemStack, Level level) { + return extractCustomName(itemStack).equals(itemName); + } + + @Override + public String getTranslationKey() { + return "has_name"; + } + + @Override + public Object[] getTranslationParameters() { + return new Object[]{itemName}; + } + + @Override + public ItemAttributeType getType() { + return AllItemAttributeTypes.HAS_NAME.get(); + } + + @Override + public void save(CompoundTag nbt) { + nbt.putString("name", itemName); + } + + @Override + public void load(CompoundTag nbt) { + itemName = nbt.getString("name"); + } + + public static class Type implements ItemAttributeType { + @Override + public @NotNull ItemAttribute createAttribute() { + return new ItemNameAttribute("dummy"); + } + + @Override + public List getAllAttributes(ItemStack stack, Level level) { + List list = new ArrayList<>(); + + String name = extractCustomName(stack); + if (!name.isEmpty()) { + list.add(new ItemNameAttribute(name)); + } + + return list; + } + } +} diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/attribute/ShulkerFillLevelAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/ShulkerFillLevelAttribute.java similarity index 65% rename from src/main/java/com/simibubi/create/content/logistics/filter/attribute/ShulkerFillLevelAttribute.java rename to src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/ShulkerFillLevelAttribute.java index a128597c7b..9ba0ac01fb 100644 --- a/src/main/java/com/simibubi/create/content/logistics/filter/attribute/ShulkerFillLevelAttribute.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/ShulkerFillLevelAttribute.java @@ -1,44 +1,39 @@ -package com.simibubi.create.content.logistics.filter.attribute; +package com.simibubi.create.content.logistics.item.filter.attribute.attributes; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.function.Predicate; -import java.util.stream.Collectors; import javax.annotation.Nullable; -import com.simibubi.create.content.logistics.filter.ItemAttribute; +import org.jetbrains.annotations.NotNull; + +import com.simibubi.create.content.logistics.item.filter.attribute.AllItemAttributeTypes; +import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttribute; +import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttributeType; import com.simibubi.create.foundation.utility.CreateLang; import net.minecraft.core.NonNullList; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.ContainerHelper; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.ShulkerBoxBlock; public class ShulkerFillLevelAttribute implements ItemAttribute { - public static final ShulkerFillLevelAttribute EMPTY = new ShulkerFillLevelAttribute(null); - - private final ShulkerLevels levels; + private ShulkerLevels levels; public ShulkerFillLevelAttribute(ShulkerLevels levels) { this.levels = levels; } @Override - public boolean appliesTo(ItemStack stack) { + public boolean appliesTo(ItemStack stack, Level level) { return levels != null && levels.canApply(stack); } - @Override - public List listAttributesOf(ItemStack stack) { - return Arrays.stream(ShulkerLevels.values()) - .filter(shulkerLevels -> shulkerLevels.canApply(stack)) - .map(ShulkerFillLevelAttribute::new) - .collect(Collectors.toList()); - } - @Override public String getTranslationKey() { return "shulker_level"; @@ -53,14 +48,21 @@ public class ShulkerFillLevelAttribute implements ItemAttribute { } @Override - public void writeNBT(CompoundTag nbt) { + public ItemAttributeType getType() { + return AllItemAttributeTypes.SHULKER_FILL_LEVEL.get(); + } + + @Override + public void save(CompoundTag nbt) { if (levels != null) nbt.putString("id", levels.key); } @Override - public ItemAttribute readNBT(CompoundTag nbt) { - return nbt.contains("id") ? new ShulkerFillLevelAttribute(ShulkerLevels.fromKey(nbt.getString("id"))) : EMPTY; + public void load(CompoundTag nbt) { + if (nbt.contains("id")) { + levels = ShulkerLevels.fromKey(nbt.getString("id")); + } } enum ShulkerLevels { @@ -77,7 +79,7 @@ public class ShulkerFillLevelAttribute implements ItemAttribute { } @Nullable - public static ShulkerLevels fromKey(String key) { + public static ShulkerFillLevelAttribute.ShulkerLevels fromKey(String key) { return Arrays.stream(values()).filter(shulkerLevels -> shulkerLevels.key.equals(key)).findFirst().orElse(null); } @@ -106,4 +108,24 @@ public class ShulkerFillLevelAttribute implements ItemAttribute { return requiredSize.test(0); } } + + public static class Type implements ItemAttributeType { + @Override + public @NotNull ItemAttribute createAttribute() { + return new ShulkerFillLevelAttribute(null); + } + + @Override + public List getAllAttributes(ItemStack stack, Level level) { + List list = new ArrayList<>(); + + for (ShulkerLevels shulkerLevels : ShulkerLevels.values()) { + if (shulkerLevels.canApply(stack)) { + list.add(new ShulkerFillLevelAttribute(shulkerLevels)); + } + } + + return list; + } + } } diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/astralsorcery/AstralSorceryAmuletAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/astralsorcery/AstralSorceryAmuletAttribute.java new file mode 100644 index 0000000000..e35e788be4 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/astralsorcery/AstralSorceryAmuletAttribute.java @@ -0,0 +1,101 @@ +package com.simibubi.create.content.logistics.item.filter.attribute.attributes.astralsorcery; + +import java.util.ArrayList; +import java.util.List; + +import com.simibubi.create.content.logistics.item.filter.attribute.AllItemAttributeTypes; + +import net.createmod.catnip.utility.lang.Components; + +import org.jetbrains.annotations.NotNull; + +import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttribute; +import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttributeType; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.level.Level; +import net.minecraftforge.registries.ForgeRegistries; + +public class AstralSorceryAmuletAttribute implements ItemAttribute { + String enchName; + int enchType; + + public AstralSorceryAmuletAttribute(String enchName, int enchType) { + this.enchName = enchName; + this.enchType = enchType; + } + + private static ListTag extractTraitList(ItemStack stack) { + return stack.getTag() != null ? stack.getTag().getCompound("astralsorcery").getList("amuletEnchantments", 10) : new ListTag(); + } + + @Override + public boolean appliesTo(ItemStack itemStack, Level level) { + for (Tag trait : extractTraitList(itemStack)) { + if (((CompoundTag) trait).getString("ench").equals(this.enchName) + && ((CompoundTag) trait).getInt("type") == this.enchType) + return true; + } + return false; + } + + @Override + public String getTranslationKey() { + return "astralsorcery_amulet"; + } + + @Override + public Object[] getTranslationParameters() { + String something = ""; + + Enchantment enchant = ForgeRegistries.ENCHANTMENTS.getValue(ResourceLocation.tryParse(enchName)); + if (enchant != null) { + something = Components.translatable(enchant.getDescriptionId()).getString(); + } + + if (enchType == 1) something = "existing " + something; + + return new Object[]{something}; + } + + @Override + public ItemAttributeType getType() { + return AllItemAttributeTypes.ASTRAL_AMULET.get(); + } + + @Override + public void save(CompoundTag nbt) { + nbt.putString("enchName", enchName); + nbt.putInt("enchType", enchType); + } + + @Override + public void load(CompoundTag nbt) { + enchName = nbt.getString("enchName"); + enchType = nbt.getInt("enchType"); + } + + public static class Type implements ItemAttributeType { + @Override + public @NotNull ItemAttribute createAttribute() { + return new AstralSorceryAmuletAttribute("dummy", -1); + } + + @Override + public List getAllAttributes(ItemStack itemStack, Level level) { + ListTag traits = extractTraitList(itemStack); + List atts = new ArrayList<>(); + for (int i = 0; i < traits.size(); i++) { + atts.add(new AstralSorceryAmuletAttribute( + traits.getCompound(i).getString("ench"), + traits.getCompound(i).getInt("type"))); + } + return atts; + } + } +} diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/astralsorcery/AstralSorceryAttunementAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/astralsorcery/AstralSorceryAttunementAttribute.java new file mode 100644 index 0000000000..6dfb8d4d62 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/astralsorcery/AstralSorceryAttunementAttribute.java @@ -0,0 +1,96 @@ +package com.simibubi.create.content.logistics.item.filter.attribute.attributes.astralsorcery; + +import java.util.ArrayList; +import java.util.List; + +import net.createmod.catnip.utility.lang.Components; + +import org.jetbrains.annotations.NotNull; + +import com.simibubi.create.content.logistics.item.filter.attribute.AllItemAttributeTypes; +import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttribute; +import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttributeType; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraftforge.registries.ForgeRegistries; + +public class AstralSorceryAttunementAttribute implements ItemAttribute { + String constellationName; + + public AstralSorceryAttunementAttribute(String constellationName) { + this.constellationName = constellationName; + } + + private static CompoundTag extractAstralNBT(ItemStack stack) { + return stack.getTag() != null ? stack.getTag().getCompound("astralsorcery") : new CompoundTag(); + } + + @Override + public boolean appliesTo(ItemStack itemStack, Level level) { + CompoundTag nbt = extractAstralNBT(itemStack); + String constellation = nbt.contains("constellation") ? nbt.getString("constellation") : nbt.getString("constellationName"); + + // Special handling for shifting stars + ResourceLocation itemResource = ForgeRegistries.ITEMS.getKey(itemStack.getItem()); + if (itemResource != null && itemResource.toString().contains("shifting_star_")) { + constellation = itemResource.toString().replace("shifting_star_", ""); + } + + return constellation.equals(constellationName); + } + + @Override + public String getTranslationKey() { + return "astralsorcery_constellation"; + } + + @Override + public Object[] getTranslationParameters() { + ResourceLocation constResource = new ResourceLocation(constellationName); + String something = Components.translatable(String.format("%s.constellation.%s", constResource.getNamespace(), constResource.getPath())).getString(); + return new Object[]{something}; + } + + @Override + public ItemAttributeType getType() { + return AllItemAttributeTypes.ASTRAL_ATTUNMENT.get(); + } + + @Override + public void save(CompoundTag nbt) { + nbt.putString("constellation", constellationName); + } + + @Override + public void load(CompoundTag nbt) { + constellationName = nbt.getString("constellation"); + } + + public static class Type implements ItemAttributeType { + @Override + public @NotNull ItemAttribute createAttribute() { + return new AstralSorceryAttunementAttribute("dummy"); + } + + @Override + public List getAllAttributes(ItemStack itemStack, Level level) { + CompoundTag nbt = extractAstralNBT(itemStack); + String constellation = nbt.contains("constellation") ? nbt.getString("constellation") : nbt.getString("constellationName"); + + // Special handling for shifting stars + ResourceLocation itemResource = ForgeRegistries.ITEMS.getKey(itemStack.getItem()); + if (itemResource != null && itemResource.toString().contains("shifting_star_")) { + constellation = itemResource.toString().replace("shifting_star_", ""); + } + + List atts = new ArrayList<>(); + if (constellation.length() > 0) { + atts.add(new AstralSorceryAttunementAttribute(constellation)); + } + return atts; + } + } +} diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/astralsorcery/AstralSorceryCrystalAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/astralsorcery/AstralSorceryCrystalAttribute.java new file mode 100644 index 0000000000..a446d2d4eb --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/astralsorcery/AstralSorceryCrystalAttribute.java @@ -0,0 +1,84 @@ +package com.simibubi.create.content.logistics.item.filter.attribute.attributes.astralsorcery; + +import java.util.ArrayList; +import java.util.List; + +import net.createmod.catnip.utility.lang.Components; + +import org.jetbrains.annotations.NotNull; + +import com.simibubi.create.content.logistics.item.filter.attribute.AllItemAttributeTypes; +import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttribute; +import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttributeType; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; + +public class AstralSorceryCrystalAttribute implements ItemAttribute { + String traitName; + + public AstralSorceryCrystalAttribute(String traitName) { + this.traitName = traitName; + } + + private static ListTag extractTraitList(ItemStack stack) { + return stack.getTag() != null ? stack.getTag().getCompound("astralsorcery").getCompound("crystalProperties").getList("attributes", 10) : new ListTag(); + } + + @Override + public boolean appliesTo(ItemStack itemStack, Level level) { + for (Tag trait : extractTraitList(itemStack)) { + if (((CompoundTag) trait).getString("property").equals(this.traitName)) + return true; + } + return false; + } + + @Override + public String getTranslationKey() { + return "astralsorcery_crystal"; + } + + @Override + public Object[] getTranslationParameters() { + ResourceLocation traitResource = new ResourceLocation(traitName); + String something = Components.translatable(String.format("crystal.property.%s.%s.name", traitResource.getNamespace(), traitResource.getPath())).getString(); + return new Object[]{something}; + } + + @Override + public ItemAttributeType getType() { + return AllItemAttributeTypes.ASTRAL_CRYSTAL.get(); + } + + @Override + public void save(CompoundTag nbt) { + nbt.putString("property", traitName); + } + + @Override + public void load(CompoundTag nbt) { + traitName = nbt.getString("property"); + } + + public static class Type implements ItemAttributeType { + @Override + public @NotNull ItemAttribute createAttribute() { + return new AstralSorceryCrystalAttribute("dummy"); + } + + @Override + public List getAllAttributes(ItemStack itemStack, Level level) { + ListTag traits = extractTraitList(itemStack); + List atts = new ArrayList<>(); + for (int i = 0; i < traits.size(); i++) { + atts.add(new AstralSorceryCrystalAttribute(traits.getCompound(i).getString("property"))); + } + return atts; + } + } +} diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/astralsorcery/AstralSorceryPerkGemAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/astralsorcery/AstralSorceryPerkGemAttribute.java new file mode 100644 index 0000000000..e5dfafbb72 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/astralsorcery/AstralSorceryPerkGemAttribute.java @@ -0,0 +1,84 @@ +package com.simibubi.create.content.logistics.item.filter.attribute.attributes.astralsorcery; + +import java.util.ArrayList; +import java.util.List; + +import net.createmod.catnip.utility.lang.Components; + +import org.jetbrains.annotations.NotNull; + +import com.simibubi.create.content.logistics.item.filter.attribute.AllItemAttributeTypes; +import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttribute; +import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttributeType; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; + +public class AstralSorceryPerkGemAttribute implements ItemAttribute { + String traitName; + + public AstralSorceryPerkGemAttribute(String traitName) { + this.traitName = traitName; + } + + private static ListTag extractTraitList(ItemStack stack) { + return stack.getTag() != null ? stack.getTag().getCompound("astralsorcery").getList("attribute_modifiers", 10) : new ListTag(); + } + + @Override + public boolean appliesTo(ItemStack itemStack, Level level) { + for (Tag trait : extractTraitList(itemStack)) { + if (((CompoundTag) trait).getString("type").equals(this.traitName)) + return true; + } + return false; + } + + @Override + public String getTranslationKey() { + return "astralsorcery_perk_gem"; + } + + @Override + public Object[] getTranslationParameters() { + ResourceLocation traitResource = new ResourceLocation(traitName); + String something = Components.translatable(String.format("perk.attribute.%s.%s.name", traitResource.getNamespace(), traitResource.getPath())).getString(); + return new Object[]{something}; + } + + @Override + public ItemAttributeType getType() { + return AllItemAttributeTypes.ASTRAL_PERK_GEM.get(); + } + + @Override + public void save(CompoundTag nbt) { + nbt.putString("type", traitName); + } + + @Override + public void load(CompoundTag nbt) { + traitName = nbt.getString("type"); + } + + public static class Type implements ItemAttributeType { + @Override + public @NotNull ItemAttribute createAttribute() { + return new AstralSorceryPerkGemAttribute("dummy"); + } + + @Override + public List getAllAttributes(ItemStack itemStack, Level level) { + ListTag traits = extractTraitList(itemStack); + List atts = new ArrayList<>(); + for (int i = 0; i < traits.size(); i++) { + atts.add(new AstralSorceryPerkGemAttribute(traits.getCompound(i).getString("type"))); + } + return atts; + } + } +} diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/legacydeserializers/AllItemAttributeLegacyDeserializers.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/legacydeserializers/AllItemAttributeLegacyDeserializers.java new file mode 100644 index 0000000000..c0cebe5e34 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/legacydeserializers/AllItemAttributeLegacyDeserializers.java @@ -0,0 +1,68 @@ +package com.simibubi.create.content.logistics.item.filter.attribute.legacydeserializers; + +import java.util.function.Function; +import java.util.function.Supplier; + +import org.jetbrains.annotations.ApiStatus; + +import com.simibubi.create.content.logistics.item.filter.attribute.AllItemAttributeTypes; +import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttribute; +import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttributeType; +import com.simibubi.create.content.logistics.item.filter.attribute.attributes.InTagAttribute; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.ItemTags; + +@SuppressWarnings("deprecation") +public class AllItemAttributeLegacyDeserializers { + @ApiStatus.Internal + public static void register() { + addLegacyDeserializer(new StandardTraitsLegacyDeserializer()); + createLegacyDeserializer("in_tag", tag -> + new InTagAttribute(ItemTags.create(new ResourceLocation( + tag.getString("space"), + tag.getString("path") + ))) + ); + createLegacyDeserializer("in_item_group", AllItemAttributeTypes.IN_ITEM_GROUP); + createLegacyDeserializer("added_by", AllItemAttributeTypes.ADDED_BY); + createLegacyDeserializer("has_enchant", AllItemAttributeTypes.HAS_ENCHANT); + createLegacyDeserializer("shulker_fill_level", AllItemAttributeTypes.SHULKER_FILL_LEVEL); + createLegacyDeserializer("has_color", AllItemAttributeTypes.HAS_COLOR); + createLegacyDeserializer("has_fluid", AllItemAttributeTypes.HAS_FLUID); + createLegacyDeserializer("has_name", AllItemAttributeTypes.HAS_NAME); + createLegacyDeserializer("book_author", AllItemAttributeTypes.BOOK_AUTHOR); + createLegacyDeserializer("book_copy", AllItemAttributeTypes.BOOK_COPY); + createLegacyDeserializer("astralsorcery_amulet", AllItemAttributeTypes.ASTRAL_AMULET); + createLegacyDeserializer("astralsorcery_constellation", AllItemAttributeTypes.ASTRAL_ATTUNMENT); + createLegacyDeserializer("astralsorcery_crystal", AllItemAttributeTypes.ASTRAL_CRYSTAL); + createLegacyDeserializer("astralsorcery_perk_gem", AllItemAttributeTypes.ASTRAL_PERK_GEM); + } + + private static void createLegacyDeserializer(String nbtKey, Supplier type) { + createLegacyDeserializer(nbtKey, tag -> { + ItemAttribute attribute = type.get().createAttribute(); + attribute.load(tag); + return attribute; + }); + } + + private static void createLegacyDeserializer(String nbtKey, Function func) { + addLegacyDeserializer(new ItemAttribute.LegacyDeserializer() { + @Override + public String getNBTKey() { + return nbtKey; + } + + @Override + public ItemAttribute readNBT(CompoundTag nbt) { + return func.apply(nbt); + } + }); + } + + private static void addLegacyDeserializer(ItemAttribute.LegacyDeserializer legacyDeserializer) { + ItemAttribute.LegacyDeserializer.ALL.add(legacyDeserializer); + } +} diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/legacydeserializers/StandardTraitsLegacyDeserializer.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/legacydeserializers/StandardTraitsLegacyDeserializer.java new file mode 100644 index 0000000000..12146f0992 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/legacydeserializers/StandardTraitsLegacyDeserializer.java @@ -0,0 +1,51 @@ +package com.simibubi.create.content.logistics.item.filter.attribute.legacydeserializers; + +import java.util.Map; +import java.util.function.Supplier; + +import com.google.common.collect.ImmutableBiMap; +import com.simibubi.create.content.logistics.item.filter.attribute.AllItemAttributeTypes; +import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttribute; +import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttributeType; + +import net.minecraft.nbt.CompoundTag; + +@SuppressWarnings("deprecation") +public class StandardTraitsLegacyDeserializer implements ItemAttribute.LegacyDeserializer { + @Override + public String getNBTKey() { + return "standard_trait"; + } + + @Override + public ItemAttribute readNBT(CompoundTag nbt) { + ImmutableBiMap> map = ImmutableBiMap.>builder() + .put("PLACEABLE", AllItemAttributeTypes.PLACEABLE) + .put("CONSUMABLE", AllItemAttributeTypes.CONSUMABLE) + .put("FLUID_CONTAINER", AllItemAttributeTypes.FLUID_CONTAINER) + .put("ENCHANTED", AllItemAttributeTypes.ENCHANTED) + .put("MAX_ENCHANTED", AllItemAttributeTypes.MAX_ENCHANTED) + .put("RENAMED", AllItemAttributeTypes.RENAMED) + .put("DAMAGED", AllItemAttributeTypes.DAMAGED) + .put("BADLY_DAMAGED", AllItemAttributeTypes.BADLY_DAMAGED) + .put("NOT_STACKABLE", AllItemAttributeTypes.NOT_STACKABLE) + .put("EQUIPABLE", AllItemAttributeTypes.EQUIPABLE) + .put("FURNACE_FUEL", AllItemAttributeTypes.FURNACE_FUEL) + .put("WASHABLE", AllItemAttributeTypes.WASHABLE) + .put("HAUNTABLE", AllItemAttributeTypes.HAUNTABLE) + .put("CRUSHABLE", AllItemAttributeTypes.CRUSHABLE) + .put("SMELTABLE", AllItemAttributeTypes.SMELTABLE) + .put("SMOKABLE", AllItemAttributeTypes.SMOKABLE) + .put("BLASTABLE", AllItemAttributeTypes.BLASTABLE) + .put("COMPOSTABLE", AllItemAttributeTypes.COMPOSTABLE) + .build(); + + for (Map.Entry> entry : map.entrySet()) { + if (nbt.contains(entry.getKey())) { + return entry.getValue().get().createAttribute(); + } + } + + throw new IllegalArgumentException("Tried to read standard trait and migrate to a type that doesn't exist!"); + } +} diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/legacydeserializers/package-info.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/legacydeserializers/package-info.java new file mode 100644 index 0000000000..f95457f621 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/legacydeserializers/package-info.java @@ -0,0 +1,5 @@ +@Deprecated +@ApiStatus.Internal +package com.simibubi.create.content.logistics.item.filter.attribute.legacydeserializers; + +import org.jetbrains.annotations.ApiStatus; diff --git a/src/main/resources/data/create/structures/gametest/items/attribute_filters.nbt b/src/main/resources/data/create/structures/gametest/items/attribute_filters.nbt index 29027a87a84de7da2513769ed30d54ab240bb622..69ac60675f2a40f938c6ba1fd7316e60cc0b690c 100644 GIT binary patch literal 1896 zcmYj}c{~%0AIBY!BRib+kgJw{b3ZFbq@jbYg)v2QMY(c5j9fz=bChF_sh-Dv=9nYO zu~s>N|XC`*{0XFr68-|_nO{pbCCeZJrKM>9)W^>1TX{)4;qMA-( z$(1^r80BplE2U_%GAwW0VV?Rr3kE?b_}uLRXLw|k+S$3p&QJSb zTlc9ct81nWtvT(%Na}yvUeFY|x}W{$L_vWqWh%H8u+#f+e)D5t(2s>^_>Ubo=V$+` z>_hLzM|RNv8*vjmejWp=C<4-@%eRlZ32Pfc+0o!gDJRiS@4AO z9FjRf$hk&%^7g|$t{fuq#k$+K{^5FD(vGlrJ$WbIzYJAqq>zrOEUJ1_v)JD4bzzXr ze)+hpfM0s0SpEoYqMA$tU=CNhw?aHYPYF!WMd~G3@W_aybzpZ$GxLO{cny&vM@jxJoQ{oD<_DlvlSwI+calsn#Ji4A^Wekx30a zXNCt!V1+KjM;o%n7N~eQMNnBz+Vzv+1@AeQP@d|Za~HESw&$>IHhSNaPE}n=I!+M; z-eQf#Y~T3U#TlJ=AR_5zQCjwzbA!fKt2s*YqRv!ZrP}sFt^_cUdMZz9Y%t;yg@1^O z!daDfPi@tsL((nqic%>Epl|31b5XLu47F2c3P!j{CwPRC#oO!&pO}=ZKFx|<+cH4y*yPaU~q~k~Zy`CLjfemPU~nC71i)6h(fZ5Xm&kl|?;Vs_9?Su5ix)ZXH#cG_5Q-k0yAO z&&PPkj{fqycPQ1-qpIrXAy>t57po2N%?seXgClqF6zl5?S+jD10hG>cL9J};W6Q`n zBE!BU4~$0b_@7jX0H5G1l*D$Ni;*a3Sw`yrC0gM*WH$XGHvzK_gqYo_K636#ZuTW9 z|I>0I+3Z;k!}!m>&UdSu`Je19#vLA!@@rDUtS3dWrM{FlPKk8*a;%v&0%zni=<9nX z!2A|nQL4SQR~()(gnAgb(l7Dqj8i)O^jftdujQ|svb8hf5|m*x1!}~W&VnOy@ZMqa zCldy}e&#okr)I#`$+A+uzqCf08`|xHG*8D(pIdIQVBbwn(FaAf^*1F(A*G7W8fHDK zVi{mxf7iIZece$i;$bdj6(oFQal@0;H+Z{1K90y~yJN9fz>>&RheduF)>aEiQ3+7H zscKTyG(=Sa8~ba&VMVlFteCEcY)^QF|D1QCa8-S>Au5$Os;eW;DVy_ z$??rmOHZGD`@)?aaGp)0Z5iks+Bg}R%1ewdOK&hJn7gJAN;c@KX0&7VU1wDAqFwl_ z!!A(B^ze9^N*e>&n}i*3#g6XwPbto{7~X3ild9$?)|_KZJp)9?92?{w#bzFGz+V6+5fLGP9p_G`>p~wHr9TPCGpgND-j$nB}4R zW}nN+#^M9sO_?j%c@{^HHk=L8`00F(hTm7ch}bV6e~m;s6du}ZoEmY1J>=2ts{5$S z{c~F`Hy?Xq(5k6MzZY;hh}wu}#maWB8cBP~{{%0%63{=Q6?d*Wcw8ny`TCg391y_u zx=him`3jx}^x(`O#V&#=WW2u$o#k#v&pSI&QXaB?T-}bhL`41uel4e} literal 1901 zcmY+8dpr{g8^@*GBG#3d!m2giY@|b>jVMGH zS;r-WnY$uP*kNqQY?@2WI(a|6pZC1aKi}u`eV*s{d9;Y~Qva#%pD|&Pf1Uto+~~C& zTd%{2&g8DieOYzKn4CG4K>=7hf89tkxGHtHBZx$>uY2iy*1EF<5X%F?JX8|Kvza9V^DxPps|fE+BDVN)^Rs=W*e#+o)_cr zpc9=ZFU8?|K>zK2h)(yGZTE8&W3&Oila<}d-Nre`zXuxqUts&+GaggYex7WD;<@tk zhaV`a`rqPQ*;aS`A>;{3pU}d2t1_Y01p5l_vhCY;`1ZP6RZWxE%)VmFB6PoeficA!Oc(n8U_E)7JI5;<_0geYIUg_H5b&j$ zaO?2}3u(6tSf? zUYvvorb8Enx20sqBZl6x`yj`#)*k@3&CtQA2(+-*6rIc?{({U$nB=HI^Fd1TT(s$V zJUqsJD5$)PL3Rw;)HkMK9GZnu?x)Bq+}k$L!ZBbCHV z$wjr2leKn+ISuJaR%B4daH;3?gzZ|U-n7DNm7}!_P{sn|(aG@4MycCX?iFG0V-MYf zZaQ>kh=>NG4~;;C3LfH1mAn@Op;i1bCZ#f8GP)|Shl>|m4*{@zLz9n49 zULreYyGt%vL26m~d*rhlE|vsKcNLOreU=QUI|t#CM6EU2h`w8m?z!XX4F@54$~_-I zSE~J4Vk-++ex%B}&S8DM&|7o6o%c2;X_d)OmP?GWw zE!Ti#Knk_^sIIG=jL)us*)Wk2aRFu#MyI@Y>tTV_ftpH=mNd=HCbV6VL`61xPJK=rW924M zg4wRxUTFR}<)^Athf&xEFPV? zzbAHm`}N(=*3eU>{$t8E%^D;8%8^ zxn(Mc*%;L?R25wJ-Pd;>*vQS@$5ogP)f)M9XovQ53Y2T&*vboM)jSt`T9K_ehAOr#i%b-B5tX+O!yx) zdz$@83VN@N#WB@T(%vH~;RVSO5%$+ICypu9Uqyd*G5W@0Dmy#Umm|SvAD2`c@>!)AQc`~bYR0$z From 14463ea570f713814c8ca0591f69467d41be68ca Mon Sep 17 00:00:00 2001 From: Kryppers <65094918+Kryppers@users.noreply.github.com> Date: Tue, 31 Dec 2024 14:03:44 +0000 Subject: [PATCH 224/515] Copperpocalypse: A fistful of textures Swapped in copper tank textures minor adjustments to copper tank models small tweaks to oxidising tile, roof and shingle textures --- .../fluid_tank/block_bottom_window_ne.json | 4 ++-- .../fluid_tank/block_bottom_window_nw.json | 4 ++-- .../fluid_tank/block_bottom_window_se.json | 4 ++-- .../fluid_tank/block_bottom_window_sw.json | 4 ++-- .../models/block/fluid_tank/block_middle.json | 1 + .../fluid_tank/block_middle_window_ne.json | 4 ++-- .../fluid_tank/block_middle_window_nw.json | 4 ++-- .../fluid_tank/block_middle_window_se.json | 4 ++-- .../fluid_tank/block_middle_window_sw.json | 4 ++-- .../block/fluid_tank/block_single_window.json | 16 ++++++++-------- .../fluid_tank/block_single_window_ne.json | 4 ++-- .../fluid_tank/block_single_window_nw.json | 4 ++-- .../fluid_tank/block_single_window_se.json | 4 ++-- .../fluid_tank/block_single_window_sw.json | 4 ++-- .../block/fluid_tank/block_top_window_ne.json | 4 ++-- .../block/fluid_tank/block_top_window_nw.json | 4 ++-- .../block/fluid_tank/block_top_window_se.json | 4 ++-- .../block/fluid_tank/block_top_window_sw.json | 4 ++-- .../block/copper/exposed_copper_roof_top.png | Bin 1691 -> 419 bytes .../block/copper/exposed_copper_shingles.png | Bin 516 -> 492 bytes .../block/copper/exposed_copper_tiles.png | Bin 512 -> 577 bytes .../block/copper/oxidized_copper_roof_top.png | Bin 1708 -> 453 bytes .../block/copper/oxidized_copper_shingles.png | Bin 521 -> 533 bytes .../block/copper/oxidized_copper_tiles.png | Bin 557 -> 576 bytes .../copper/weathered_copper_roof_top.png | Bin 1806 -> 455 bytes .../copper/weathered_copper_shingles.png | Bin 551 -> 512 bytes .../block/copper/weathered_copper_tiles.png | Bin 589 -> 589 bytes .../textures/block/creative_fluid_tank.png | Bin 314 -> 1809 bytes .../block/creative_fluid_tank_connected.png | Bin 798 -> 9126 bytes .../block/creative_fluid_tank_window.png | Bin 179 -> 1349 bytes .../create/textures/block/fluid_tank.png | Bin 245 -> 1512 bytes .../textures/block/fluid_tank_connected.png | Bin 939 -> 7694 bytes .../textures/block/fluid_tank_inner.png | Bin 225 -> 1671 bytes .../block/fluid_tank_inner_connected.png | Bin 701 -> 4873 bytes .../create/textures/block/fluid_tank_top.png | Bin 226 -> 1862 bytes .../block/fluid_tank_top_connected.png | Bin 933 -> 8293 bytes .../textures/block/fluid_tank_window.png | Bin 254 -> 1173 bytes .../block/fluid_tank_window_single.png | Bin 128 -> 1083 bytes .../create/textures/block/redstone_bridge.png | Bin 1509 -> 1509 bytes .../block/redstone_bridge_powered.png | Bin 1514 -> 1514 bytes 40 files changed, 41 insertions(+), 40 deletions(-) diff --git a/src/main/resources/assets/create/models/block/fluid_tank/block_bottom_window_ne.json b/src/main/resources/assets/create/models/block/fluid_tank/block_bottom_window_ne.json index df535c9c11..2ae13a3b43 100644 --- a/src/main/resources/assets/create/models/block/fluid_tank/block_bottom_window_ne.json +++ b/src/main/resources/assets/create/models/block/fluid_tank/block_bottom_window_ne.json @@ -15,7 +15,7 @@ "to": [16, 16, 12], "faces": { "east": {"uv": [4, 0, 16, 12], "texture": "#1"}, - "south": {"uv": [4, 0, 5, 12], "texture": "#1"}, + "south": {"uv": [0, 0, 1, 12], "texture": "#1"}, "west": {"uv": [0, 0, 12, 12], "texture": "#1"} } }, @@ -44,7 +44,7 @@ "faces": { "north": {"uv": [0, 0, 12, 12], "texture": "#1"}, "south": {"uv": [4, 0, 16, 12], "texture": "#1"}, - "west": {"uv": [11, 0, 12, 12], "texture": "#1"} + "west": {"uv": [15, 0, 16, 12], "texture": "#1"} } }, { diff --git a/src/main/resources/assets/create/models/block/fluid_tank/block_bottom_window_nw.json b/src/main/resources/assets/create/models/block/fluid_tank/block_bottom_window_nw.json index eaac7ff0e8..0c8553a97d 100644 --- a/src/main/resources/assets/create/models/block/fluid_tank/block_bottom_window_nw.json +++ b/src/main/resources/assets/create/models/block/fluid_tank/block_bottom_window_nw.json @@ -15,7 +15,7 @@ "to": [12, 16, 1], "faces": { "north": {"uv": [4, 0, 16, 12], "texture": "#1"}, - "east": {"uv": [4, 0, 5, 12], "texture": "#1"}, + "east": {"uv": [15, 0, 16, 12], "texture": "#1"}, "south": {"uv": [0, 0, 12, 12], "texture": "#1"} } }, @@ -43,7 +43,7 @@ "to": [1, 16, 12], "faces": { "east": {"uv": [4, 0, 16, 12], "texture": "#1"}, - "south": {"uv": [11, 0, 12, 12], "texture": "#1"}, + "south": {"uv": [0, 0, 1, 12], "texture": "#1"}, "west": {"uv": [0, 0, 12, 12], "texture": "#1"} } }, diff --git a/src/main/resources/assets/create/models/block/fluid_tank/block_bottom_window_se.json b/src/main/resources/assets/create/models/block/fluid_tank/block_bottom_window_se.json index b3772ef7ae..92454a7098 100644 --- a/src/main/resources/assets/create/models/block/fluid_tank/block_bottom_window_se.json +++ b/src/main/resources/assets/create/models/block/fluid_tank/block_bottom_window_se.json @@ -16,7 +16,7 @@ "faces": { "north": {"uv": [0, 0, 12, 12], "texture": "#1"}, "south": {"uv": [4, 0, 16, 12], "texture": "#1"}, - "west": {"uv": [4, 0, 5, 12], "texture": "#1"} + "west": {"uv": [15, 0, 16, 12], "texture": "#1"} } }, { @@ -42,7 +42,7 @@ "from": [15, 4, 4], "to": [16, 16, 16], "faces": { - "north": {"uv": [11, 0, 12, 12], "texture": "#1"}, + "north": {"uv": [0, 0, 1, 12], "texture": "#1"}, "east": {"uv": [0, 0, 12, 12], "texture": "#1"}, "west": {"uv": [4, 0, 16, 12], "texture": "#1"} } diff --git a/src/main/resources/assets/create/models/block/fluid_tank/block_bottom_window_sw.json b/src/main/resources/assets/create/models/block/fluid_tank/block_bottom_window_sw.json index d91e8a1e48..457e49e36b 100644 --- a/src/main/resources/assets/create/models/block/fluid_tank/block_bottom_window_sw.json +++ b/src/main/resources/assets/create/models/block/fluid_tank/block_bottom_window_sw.json @@ -14,7 +14,7 @@ "from": [0, 4, 4], "to": [1, 16, 16], "faces": { - "north": {"uv": [4, 0, 5, 12], "texture": "#1"}, + "north": {"uv": [15, 0, 16, 12], "texture": "#1"}, "east": {"uv": [0, 0, 12, 12], "texture": "#1"}, "west": {"uv": [4, 0, 16, 12], "texture": "#1"} } @@ -43,7 +43,7 @@ "to": [12, 16, 16], "faces": { "north": {"uv": [4, 0, 16, 12], "texture": "#1"}, - "east": {"uv": [11, 0, 12, 12], "texture": "#1"}, + "east": {"uv": [0, 0, 1, 12], "texture": "#1"}, "south": {"uv": [0, 0, 12, 12], "texture": "#1"} } }, diff --git a/src/main/resources/assets/create/models/block/fluid_tank/block_middle.json b/src/main/resources/assets/create/models/block/fluid_tank/block_middle.json index 7815ab94bf..a0ada52223 100644 --- a/src/main/resources/assets/create/models/block/fluid_tank/block_middle.json +++ b/src/main/resources/assets/create/models/block/fluid_tank/block_middle.json @@ -51,6 +51,7 @@ { "name": "tank", "origin": [8, 8, -23], + "color": 0, "children": [0, 1, 2, 3] } ] diff --git a/src/main/resources/assets/create/models/block/fluid_tank/block_middle_window_ne.json b/src/main/resources/assets/create/models/block/fluid_tank/block_middle_window_ne.json index 3512676308..5a2ec0ced9 100644 --- a/src/main/resources/assets/create/models/block/fluid_tank/block_middle_window_ne.json +++ b/src/main/resources/assets/create/models/block/fluid_tank/block_middle_window_ne.json @@ -13,7 +13,7 @@ "to": [16, 16, 12], "faces": { "east": {"uv": [4, 0, 16, 16], "texture": "#1"}, - "south": {"uv": [4, 0, 5, 16], "texture": "#1"}, + "south": {"uv": [15, 0, 16, 16], "texture": "#1"}, "west": {"uv": [0, 0, 12, 16], "texture": "#1"} } }, @@ -42,7 +42,7 @@ "faces": { "north": {"uv": [0, 0, 12, 16], "texture": "#1"}, "south": {"uv": [4, 0, 16, 16], "texture": "#1"}, - "west": {"uv": [11, 0, 12, 16], "texture": "#1"} + "west": {"uv": [0, 0, 1, 16], "texture": "#1"} } } ], diff --git a/src/main/resources/assets/create/models/block/fluid_tank/block_middle_window_nw.json b/src/main/resources/assets/create/models/block/fluid_tank/block_middle_window_nw.json index 6ea7f319c5..22add317ce 100644 --- a/src/main/resources/assets/create/models/block/fluid_tank/block_middle_window_nw.json +++ b/src/main/resources/assets/create/models/block/fluid_tank/block_middle_window_nw.json @@ -13,7 +13,7 @@ "to": [12, 16, 1], "faces": { "north": {"uv": [4, 0, 16, 16], "texture": "#1"}, - "east": {"uv": [4, 0, 5, 16], "texture": "#1"}, + "east": {"uv": [15, 0, 16, 16], "texture": "#1"}, "south": {"uv": [0, 0, 12, 16], "texture": "#1"} } }, @@ -41,7 +41,7 @@ "to": [1, 16, 12], "faces": { "east": {"uv": [4, 0, 16, 16], "texture": "#1"}, - "south": {"uv": [11, 0, 12, 16], "texture": "#1"}, + "south": {"uv": [0, 0, 1, 16], "texture": "#1"}, "west": {"uv": [0, 0, 12, 16], "texture": "#1"} } } diff --git a/src/main/resources/assets/create/models/block/fluid_tank/block_middle_window_se.json b/src/main/resources/assets/create/models/block/fluid_tank/block_middle_window_se.json index 763b55f822..ed9e8123fe 100644 --- a/src/main/resources/assets/create/models/block/fluid_tank/block_middle_window_se.json +++ b/src/main/resources/assets/create/models/block/fluid_tank/block_middle_window_se.json @@ -14,7 +14,7 @@ "faces": { "north": {"uv": [0, 0, 12, 16], "texture": "#1"}, "south": {"uv": [4, 0, 16, 16], "texture": "#1"}, - "west": {"uv": [4, 0, 5, 16], "texture": "#1"} + "west": {"uv": [15, 0, 16, 16], "texture": "#1"} } }, { @@ -40,7 +40,7 @@ "from": [15, 0, 4], "to": [16, 16, 16], "faces": { - "north": {"uv": [11, 0, 12, 16], "texture": "#1"}, + "north": {"uv": [0, 0, 1, 16], "texture": "#1"}, "east": {"uv": [0, 0, 12, 16], "texture": "#1"}, "west": {"uv": [4, 0, 16, 16], "texture": "#1"} } diff --git a/src/main/resources/assets/create/models/block/fluid_tank/block_middle_window_sw.json b/src/main/resources/assets/create/models/block/fluid_tank/block_middle_window_sw.json index 6ab4f02c69..2cfec7902b 100644 --- a/src/main/resources/assets/create/models/block/fluid_tank/block_middle_window_sw.json +++ b/src/main/resources/assets/create/models/block/fluid_tank/block_middle_window_sw.json @@ -12,7 +12,7 @@ "from": [0, 0, 4], "to": [1, 16, 16], "faces": { - "north": {"uv": [4, 0, 5, 16], "texture": "#1"}, + "north": {"uv": [0, 0, 1, 16], "texture": "#1"}, "east": {"uv": [0, 0, 12, 16], "texture": "#1"}, "west": {"uv": [4, 0, 16, 16], "texture": "#1"} } @@ -41,7 +41,7 @@ "to": [12, 16, 16], "faces": { "north": {"uv": [4, 0, 16, 16], "texture": "#1"}, - "east": {"uv": [11, 0, 12, 16], "texture": "#1"}, + "east": {"uv": [15, 0, 16, 16], "texture": "#1"}, "south": {"uv": [0, 0, 12, 16], "texture": "#1"} } } diff --git a/src/main/resources/assets/create/models/block/fluid_tank/block_single_window.json b/src/main/resources/assets/create/models/block/fluid_tank/block_single_window.json index e310b9c5ea..5f79e711fa 100644 --- a/src/main/resources/assets/create/models/block/fluid_tank/block_single_window.json +++ b/src/main/resources/assets/create/models/block/fluid_tank/block_single_window.json @@ -30,7 +30,7 @@ "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -23]}, "faces": { "north": {"uv": [12, 4, 16, 12], "texture": "#1", "cullface": "north"}, - "east": {"uv": [8, 4, 9, 12], "texture": "#1", "cullface": "north"}, + "east": {"uv": [15, 4, 16, 12], "texture": "#1", "cullface": "north"}, "south": {"uv": [0, 4, 4, 12], "texture": "#1", "cullface": "north"} } }, @@ -40,7 +40,7 @@ "to": [16, 12, 4], "faces": { "east": {"uv": [12, 4, 16, 12], "texture": "#1", "cullface": "east"}, - "south": {"uv": [8, 4, 9, 12], "texture": "#1", "cullface": "east"}, + "south": {"uv": [15, 4, 16, 12], "texture": "#1", "cullface": "east"}, "west": {"uv": [0, 4, 4, 12], "texture": "#1", "cullface": "east"} } }, @@ -51,7 +51,7 @@ "faces": { "north": {"uv": [0, 4, 4, 12], "texture": "#1", "cullface": "south"}, "south": {"uv": [12, 4, 16, 12], "texture": "#1", "cullface": "south"}, - "west": {"uv": [8, 4, 9, 12], "texture": "#1", "cullface": "south"} + "west": {"uv": [15, 4, 16, 12], "texture": "#1", "cullface": "south"} } }, { @@ -59,7 +59,7 @@ "from": [0, 4, 12], "to": [1, 12, 16], "faces": { - "north": {"uv": [8, 4, 9, 12], "texture": "#1", "cullface": "west"}, + "north": {"uv": [15, 4, 16, 12], "texture": "#1", "cullface": "west"}, "east": {"uv": [0, 4, 4, 12], "texture": "#1", "cullface": "west"}, "west": {"uv": [12, 4, 16, 12], "texture": "#1", "cullface": "west"} } @@ -109,7 +109,7 @@ "faces": { "north": {"uv": [0, 4, 4, 12], "texture": "#1", "cullface": "north"}, "south": {"uv": [12, 4, 16, 12], "texture": "#1", "cullface": "north"}, - "west": {"uv": [7, 4, 8, 12], "texture": "#1", "cullface": "north"} + "west": {"uv": [0, 4, 1, 12], "texture": "#1", "cullface": "north"} } }, { @@ -117,7 +117,7 @@ "from": [15, 4, 12], "to": [16, 12, 16], "faces": { - "north": {"uv": [7, 4, 8, 12], "texture": "#1", "cullface": "east"}, + "north": {"uv": [0, 4, 1, 12], "texture": "#1", "cullface": "east"}, "east": {"uv": [0, 4, 4, 12], "texture": "#1", "cullface": "east"}, "west": {"uv": [12, 4, 16, 12], "texture": "#1", "cullface": "east"} } @@ -128,7 +128,7 @@ "to": [4, 12, 16], "faces": { "north": {"uv": [12, 4, 16, 12], "texture": "#1", "cullface": "south"}, - "east": {"uv": [7, 4, 8, 12], "texture": "#1", "cullface": "south"}, + "east": {"uv": [0, 4, 1, 12], "texture": "#1", "cullface": "south"}, "south": {"uv": [0, 4, 4, 12], "texture": "#1", "cullface": "south"} } }, @@ -138,7 +138,7 @@ "to": [1, 12, 4], "faces": { "east": {"uv": [12, 4, 16, 12], "texture": "#1", "cullface": "west"}, - "south": {"uv": [7, 4, 8, 12], "texture": "#1", "cullface": "west"}, + "south": {"uv": [0, 4, 1, 12], "texture": "#1", "cullface": "west"}, "west": {"uv": [0, 4, 4, 12], "texture": "#1", "cullface": "west"} } }, diff --git a/src/main/resources/assets/create/models/block/fluid_tank/block_single_window_ne.json b/src/main/resources/assets/create/models/block/fluid_tank/block_single_window_ne.json index 90c529e921..d76b0c1df7 100644 --- a/src/main/resources/assets/create/models/block/fluid_tank/block_single_window_ne.json +++ b/src/main/resources/assets/create/models/block/fluid_tank/block_single_window_ne.json @@ -16,7 +16,7 @@ "rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 8]}, "faces": { "east": {"uv": [4, 4, 16, 12], "texture": "#1"}, - "south": {"uv": [4, 4, 5, 12], "texture": "#1"}, + "south": {"uv": [15, 4, 16, 12], "texture": "#1"}, "west": {"uv": [0, 4, 12, 12], "texture": "#1"} } }, @@ -48,7 +48,7 @@ "faces": { "north": {"uv": [0, 4, 12, 12], "texture": "#1"}, "south": {"uv": [4, 4, 16, 12], "texture": "#1"}, - "west": {"uv": [11, 4, 12, 12], "texture": "#1"} + "west": {"uv": [0, 4, 1, 12], "texture": "#1"} } }, { diff --git a/src/main/resources/assets/create/models/block/fluid_tank/block_single_window_nw.json b/src/main/resources/assets/create/models/block/fluid_tank/block_single_window_nw.json index 2aaba7d6b1..171e73ee6c 100644 --- a/src/main/resources/assets/create/models/block/fluid_tank/block_single_window_nw.json +++ b/src/main/resources/assets/create/models/block/fluid_tank/block_single_window_nw.json @@ -16,7 +16,7 @@ "rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 8]}, "faces": { "north": {"uv": [4, 4, 16, 12], "texture": "#1"}, - "east": {"uv": [4, 4, 5, 12], "texture": "#1"}, + "east": {"uv": [0, 4, 1, 12], "texture": "#1"}, "south": {"uv": [0, 4, 12, 12], "texture": "#1"} } }, @@ -47,7 +47,7 @@ "rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 8]}, "faces": { "east": {"uv": [4, 4, 16, 12], "texture": "#1"}, - "south": {"uv": [11, 4, 12, 12], "texture": "#1"}, + "south": {"uv": [16, 4, 15, 12], "texture": "#1"}, "west": {"uv": [0, 4, 12, 12], "texture": "#1"} } }, diff --git a/src/main/resources/assets/create/models/block/fluid_tank/block_single_window_se.json b/src/main/resources/assets/create/models/block/fluid_tank/block_single_window_se.json index 0550d12483..38edb8bf9a 100644 --- a/src/main/resources/assets/create/models/block/fluid_tank/block_single_window_se.json +++ b/src/main/resources/assets/create/models/block/fluid_tank/block_single_window_se.json @@ -17,7 +17,7 @@ "faces": { "north": {"uv": [0, 4, 12, 12], "texture": "#1"}, "south": {"uv": [4, 4, 16, 12], "texture": "#1"}, - "west": {"uv": [4, 4, 5, 12], "texture": "#1"} + "west": {"uv": [0, 4, 1, 12], "texture": "#1"} } }, { @@ -46,7 +46,7 @@ "to": [16, 12, 16], "rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 8]}, "faces": { - "north": {"uv": [11, 4, 12, 12], "texture": "#1"}, + "north": {"uv": [15, 4, 16, 12], "texture": "#1"}, "east": {"uv": [0, 4, 12, 12], "texture": "#1"}, "west": {"uv": [4, 4, 16, 12], "texture": "#1"} } diff --git a/src/main/resources/assets/create/models/block/fluid_tank/block_single_window_sw.json b/src/main/resources/assets/create/models/block/fluid_tank/block_single_window_sw.json index ec99580808..2bcbfcb7ef 100644 --- a/src/main/resources/assets/create/models/block/fluid_tank/block_single_window_sw.json +++ b/src/main/resources/assets/create/models/block/fluid_tank/block_single_window_sw.json @@ -15,7 +15,7 @@ "to": [1, 12, 16], "rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 8]}, "faces": { - "north": {"uv": [4, 4, 5, 12], "texture": "#1"}, + "north": {"uv": [0, 4, 1, 12], "texture": "#1"}, "east": {"uv": [0, 4, 12, 12], "texture": "#1"}, "west": {"uv": [4, 4, 16, 12], "texture": "#1"} } @@ -47,7 +47,7 @@ "rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 8]}, "faces": { "north": {"uv": [4, 4, 16, 12], "texture": "#1"}, - "east": {"uv": [11, 4, 12, 12], "texture": "#1"}, + "east": {"uv": [15, 4, 16, 12], "texture": "#1"}, "south": {"uv": [0, 4, 12, 12], "texture": "#1"} } }, diff --git a/src/main/resources/assets/create/models/block/fluid_tank/block_top_window_ne.json b/src/main/resources/assets/create/models/block/fluid_tank/block_top_window_ne.json index 26791cb84c..8757b680a9 100644 --- a/src/main/resources/assets/create/models/block/fluid_tank/block_top_window_ne.json +++ b/src/main/resources/assets/create/models/block/fluid_tank/block_top_window_ne.json @@ -16,7 +16,7 @@ "rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 8]}, "faces": { "east": {"uv": [4, 4, 16, 16], "texture": "#1"}, - "south": {"uv": [4, 4, 5, 16], "texture": "#1"}, + "south": {"uv": [15, 4, 16, 16], "texture": "#1"}, "west": {"uv": [0, 4, 12, 16], "texture": "#1"} } }, @@ -48,7 +48,7 @@ "faces": { "north": {"uv": [0, 4, 12, 16], "texture": "#1"}, "south": {"uv": [4, 4, 16, 16], "texture": "#1"}, - "west": {"uv": [11, 4, 12, 16], "texture": "#1"} + "west": {"uv": [0, 4, 1, 16], "texture": "#1"} } }, { diff --git a/src/main/resources/assets/create/models/block/fluid_tank/block_top_window_nw.json b/src/main/resources/assets/create/models/block/fluid_tank/block_top_window_nw.json index c00c753bc1..432fbaa5a3 100644 --- a/src/main/resources/assets/create/models/block/fluid_tank/block_top_window_nw.json +++ b/src/main/resources/assets/create/models/block/fluid_tank/block_top_window_nw.json @@ -16,7 +16,7 @@ "rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 8]}, "faces": { "north": {"uv": [4, 4, 16, 16], "texture": "#1"}, - "east": {"uv": [4, 4, 5, 16], "texture": "#1"}, + "east": {"uv": [15, 4, 16, 16], "texture": "#1"}, "south": {"uv": [0, 4, 12, 16], "texture": "#1"} } }, @@ -47,7 +47,7 @@ "rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 8]}, "faces": { "east": {"uv": [4, 4, 16, 16], "texture": "#1"}, - "south": {"uv": [11, 4, 12, 16], "texture": "#1"}, + "south": {"uv": [0, 4, 1, 16], "texture": "#1"}, "west": {"uv": [0, 4, 12, 16], "texture": "#1"} } }, diff --git a/src/main/resources/assets/create/models/block/fluid_tank/block_top_window_se.json b/src/main/resources/assets/create/models/block/fluid_tank/block_top_window_se.json index 85616d16e7..4f7df24ae9 100644 --- a/src/main/resources/assets/create/models/block/fluid_tank/block_top_window_se.json +++ b/src/main/resources/assets/create/models/block/fluid_tank/block_top_window_se.json @@ -17,7 +17,7 @@ "faces": { "north": {"uv": [0, 4, 12, 16], "texture": "#1"}, "south": {"uv": [4, 4, 16, 16], "texture": "#1"}, - "west": {"uv": [4, 4, 5, 16], "texture": "#1"} + "west": {"uv": [15, 4, 16, 16], "texture": "#1"} } }, { @@ -46,7 +46,7 @@ "to": [16, 12, 16], "rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 8]}, "faces": { - "north": {"uv": [11, 4, 12, 16], "texture": "#1"}, + "north": {"uv": [0, 4, 1, 16], "texture": "#1"}, "east": {"uv": [0, 4, 12, 16], "texture": "#1"}, "west": {"uv": [4, 4, 16, 16], "texture": "#1"} } diff --git a/src/main/resources/assets/create/models/block/fluid_tank/block_top_window_sw.json b/src/main/resources/assets/create/models/block/fluid_tank/block_top_window_sw.json index ed8c3da617..e94add428e 100644 --- a/src/main/resources/assets/create/models/block/fluid_tank/block_top_window_sw.json +++ b/src/main/resources/assets/create/models/block/fluid_tank/block_top_window_sw.json @@ -15,7 +15,7 @@ "to": [1, 12, 16], "rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 8]}, "faces": { - "north": {"uv": [4, 4, 5, 16], "texture": "#1"}, + "north": {"uv": [15, 4, 16, 16], "texture": "#1"}, "east": {"uv": [0, 4, 12, 16], "texture": "#1"}, "west": {"uv": [4, 4, 16, 16], "texture": "#1"} } @@ -47,7 +47,7 @@ "rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 8]}, "faces": { "north": {"uv": [4, 4, 16, 16], "texture": "#1"}, - "east": {"uv": [11, 4, 12, 16], "texture": "#1"}, + "east": {"uv": [0, 4, 1, 16], "texture": "#1"}, "south": {"uv": [0, 4, 12, 16], "texture": "#1"} } }, diff --git a/src/main/resources/assets/create/textures/block/copper/exposed_copper_roof_top.png b/src/main/resources/assets/create/textures/block/copper/exposed_copper_roof_top.png index 8bf15bef6e88832e7c27c3f43b509b0fc0aad452..a8b27e7d0e255dcd67291ec64361a1f0d78e552d 100644 GIT binary patch delta 41 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 diff --git a/src/main/resources/assets/create/textures/block/copper/oxidized_copper_shingles.png b/src/main/resources/assets/create/textures/block/copper/oxidized_copper_shingles.png index ddf55efdab4f688a82bbcd78ff5d1eb4fb7dc13f..e3025fbe385cca374f6fda18e3dab0ba696612c4 100644 GIT binary patch delta 501 zcmVe6sj-QJ{^#@k!~=yZ1aeyEI#M}>IqI-QY1 z8Al|5ejq!Y0T8TZyXth-`o14XtpqXL2=@>y*o{YpY*$(dj)`YU@UGmj++W=KUXO~v zM3&a~63|Mt$bTZ+q}Hrah>PM(E1{K0t!d^pfYcgx0+RXtk3Xq3r&7k%eDU}G_j*waDTlmP5xileB@<@NWwL-oKr=~WGgejq7S zP%yE%olM1ZXD8Fhj*saQn@dUrEcSw6#e_tuF@Q^u2X1FXWXG-V!~fz@5g+7YhkL;p z0pOxIqZCx*rCKlv4)PuniQ|IWhnx|VZGEqm_%ATGUmqO+8p7af+}=A~&hE-t&=KWq r?{_n=uRfgvSfe<%=3(*l`sn@v=m^GM`@W6r00000NkvXXu0mjf*5vD| delta 489 zcmVNT|tjnAXIKtnr&SGx2-gy7+Zz*?+-iEpKm<(=z}l{2TyQ z{w1acJYM-1W!aIb+Hw~F$W*e+(XyjMBk}U~COtGQJCtfN6`5+7WB?HKWX;~x3rBE_ zX8@?%t{W*$DD}eVFESNMspK>vHlg270%@uV0RUrSm}DuNZlqE+{oa}|=!xLNB*TMj zPZMgwlubUJ34ckzIOibS!zSd@S;}S`clB%j^qN0CFP80lwXJ{DZ~qf#cQma&R@qOx zqbZ-x>Ng+Y^Y8T^g-wXUTXuz?7k>WxYAy~uY#bQy*s?1CFbXI3S$6Va6ZrUKz+*l> ziTAPW)LI8v06^b92~uO)65>-JQ>kvGzU6~OU-h6Ts$yP5svw9>5aC3YNR5re#F$bd zFaSLJGTOJ#=3f&uVGV0TWRxaE01)|8He!e%ae{#HHK+lP{r#Q4zw7_K=vY1$N9X%8 fTocx9S3VYBy2iBZq*I1g00000NkvXXu0mjfXv@_m diff --git a/src/main/resources/assets/create/textures/block/copper/oxidized_copper_tiles.png b/src/main/resources/assets/create/textures/block/copper/oxidized_copper_tiles.png index 1833444b095997a1ad8f105275d01c0a0b3b8f0e..1af57198402f5802a6c72f44898e73fe19245b6f 100644 GIT binary patch delta 545 zcmV++0^a?t1i%E4Dt~(b)d1F$v+A1w000SaNLh0L01FcU01FcV0GgZ_00007bV*G` z2j~nR4K)EKr}*>$00GTOL_t(2&ux-VYZE~j#-G0XXX11x>vo*FnI3i#gCz$+6vTs` z{04puzkpXiipPEd4^2*j^w660(!(N#R7hN?snCRlCEL}*3x7itVGpyvVP>A^d7qtE z@82Fgc?6)UTL4lJfcc~V@Lx_{-J4Geqm>loXjk`4uK3tCH@PAJCRgX9GozK!im6cR zMy4iLv(bss3czf1k_`F)cHVq=*T~eb%EgyU0QPCt$P@tIUDfT+;pevF=dWL|HouXn z6a--dy#f#>wtuNxzbeDTR&^@{c?bI*V6?hguBy8IOCS5mY|M{HL5{O#DTtizMy5io zlR^LV=s2^n(Q5Vm#&MIY>11xS@+gw`o;~hF-OcUqHi-PHyz}tz>&H)vi*IW1fHvzk zi1-WXx)_fAK<}|R)>a{vf&#qP=%0_yc+mg?WrK)+PmhiP?7w`@+~@2=;8yo;mOt1DgvGA~D`7v* zA#Jyf{TQvPx(yS%JqOn-;-37Yo98f}6x<*0e&l-PDRYbX+_<9DgtsoWmS`Z-)85_nX$U z*DoF(K3*)V)w%&71p%1P3IPA))Ybj7ZgP_=0$_4A9gd7v zMyu&?WO5}`?PR*aw|4IVXgxoAhqVp}l1z zT>;2!vRIPy9)yi_MJ882K7Pt<;=8=*!O7J7AwTcTCVx`Um*aOPSA5xfkb>9`fRJPK z4)&+R5&d-b>0KvNfzlynesc7d{Ww6N3^{Zg;ARFp_ZQ1*h17HQklBR!fBsK(akb%r z{Qud=%{;gh0}!hAJfK+Gy^P1)L~#?vi3yAG>DLeEb}#G1-8J1}Kg@pvG)CzJ&pmhi Q00000Ne4wvM6N<$g7jVUV*mgE diff --git a/src/main/resources/assets/create/textures/block/copper/weathered_copper_roof_top.png b/src/main/resources/assets/create/textures/block/copper/weathered_copper_roof_top.png index 78ff88f0443ec721efef5d1f5ea24a9912cb6205..956cf04508de42e0b435c8493dfdca463094c1fb 100644 GIT binary patch delta 402 zcmV;D0d4+{4#xwKBM<-vVoOIv0DAz{0M?VU>YI~)1t5PP4K)g}bs>BJ00C4Xq)XMUBX7W)Ft9Q4OgslKz*0pZ)v<&tD@Kn20M$ZHCw?qkWwr9y~nW z(dtnp_&CYE@7u)@-Zhx(Hk~ZuQ7?y}Stlmy=RkH2HbVP4Xoj0nFNY$Bwvstdoxjf6 zZVtq)GAwA;PE*!`D|s@9nb=?P+^m)_+-}LcuCp`IYF`6;&H}robawBbaB^>EX>4U6ba`-PAZ2)IW&i+q+O1Y?vg{}b z{qHJf2_mSt9OFmT>|mBZ$EfM_z3Kbje8fs?5d`GGu}%By&u;#}<7~1rR4G%ZcFu(gLKN3r#Oz#ge9DxgORlhGVlgZ%)LrDnm6aVA*O(!7S1fe; zO{cp;3dfb8>3;~u2s_SU_Ts;eM?<}rks`wBcdihZa{~q%S>*8xEdWA&*O5OHyvNrE zz`}??You9mz-*6c;_&pUEjB063`LJw=H^(J0i+1NJ%S+y0yYqP3S^^mkqCKI;FA%# zVXXlbg9IN!h+*_%jvOWW7-EbXQ_RXL>NRLo)uh=Zml(b3Q%EssN-1YJ&9I!YJ8OpE za0ef9_#+(g&?6nWpnQrHUqXpRODfq^SGh{{HPl$OrkWcylv0!CTWGOqOD%VlTIVj^ z_t0b4o_~72P&-jIZ8An%z*9zx$n3= zpjHRJm(hn7#5US+B-Jw7@95$Q_W`BmbgV#E_J0>MfmM(rq}SV$o#HgMgY#ULu*Jb4!y+!yyu@P5GH!0s?cns5vcgkJs94~4#+w;bf{d*KA5vR=?zqSM`)ohxG0zRVQp;U+HTv##T|V+PPthh z*v+G6^z>6w_e^PdYK`Urd}*jaHuJRAj(?WlC4W;0(|$X+G#3_{iFx^oxSnSW<_zKj zb5&*HD}+y>ezj`0S(>Tr-ZsCKjsjAkoAG;M*e(>Llv++h?g%XRM7|ll0JN;(N(Ll2UilUTcwuuFz3+JY6(w#j%(ff^6^05iNX}UF#xp$B(xzaac zNozkV>TCsclpEU_y#>k_q41CVe19kZO)~~O^VT+fol`oMRY4y}G_15W=TarJ2*c~P zfV-pI8ze0wZ8toqx`ik5|L6QX=s8_ypZPRMq+BcoYHrKF-Z|reqs7VM;B=x$iw&^5Sv)J_m zE&q!0UMy;UkCA^p8~is-=5Gj%{IXwQ(6|5q00v@9M??U!0Ac_~Ft00i00009a7bBm z000XU000XU0RWnu7ytkO2Y+-)O+^Rj3=$VKF95MR0RR92Pf0{UR4C7NkEIU@6cOcpcfGeF+w*Cu}N7xtZ0h#Fygi4vK&>&>G&J+NecTr;sA=9_a37}{W zuky51#*#`Q(?~iS_yG9!0GPM0S}L+=1Ap@L{J_ys1^7D4&ENZ#f8N8&pLT>L1j_x_ zgI!!y(_2@B03di{Ab6dQJ?!&tgLTmzG1pQJJnZwt`q_@I#~v2RiHAIW7y9T`-smq! z9-0Y@q^v)`d3XKv?2xXrxX%r{*e;TCoyDyOvPer6D0g;fJZ#`c(%~M{*2gy8EM5X| h&_Ji17D)$i{s6?u<*!l+iF5z}002ovPDHLkV1h7IXy^a{ diff --git a/src/main/resources/assets/create/textures/block/copper/weathered_copper_shingles.png b/src/main/resources/assets/create/textures/block/copper/weathered_copper_shingles.png index 3a81a8d1eacfd0f0b91f395ea18a8f828081e130..8a6baf6ba8bc453a9ab5e6d99a1f4860efc1cd22 100644 GIT binary patch delta 480 zcmV<60U!RS1b_sPDt~(b)d1F$v+A1w000SaNLh0L01FcU01FcV0GgZ_00007bV*G` z2j~nR4K)V1!);dp00E6jL_t(2&s9>0} zD}3rN`Qi`M2Mq}BEmR3egiw|yL?}Lt4si&V2{Y%;x#!Gib$@f^Y>n@De)7-bBLLO3 z0`Tzi3qX#oRD;x#vvp?@`R`1UW2<=Xd9m!y0FSC z?|&x%sANz1kU@@Zd{UI`9a`vQVRdNXY)u$M6czyL-9G^<~HNshG*Pk#}DqOgz;z;1Il1S_lfqyR8mmjFhW*B3)pL28@XTsky%n>&C1v43d* zj2$u+o_nrP+4oIzzjnyffgrVdjscYH`Ryw(aY3Co3;;2^xBrV}=kM*;(}Rh>|KOe} z$5x)NB9`nqTg%;DFyWrLXD!jtgw7--d!m~1*sj%FG!JGCM!~4qt(q-HLXPBp&OD+|DNfxL}AfC-hKkP Wx}KksQGKug0000ot% zM^mjLrsGrH(`xAU+20ijHe#~SC;$Ml-|Wx}BP!NE%Smc5qnvTL#x#U+SRQ-sVjQOD z_bsT%IM9G`SbxL`auF^N!Xq3-l;u`wIGDj~9Hxw;FPG&p{U0*Rh{`cN5}wc`KjkYNX6IFDTffdf zb`u!yJnsI|TxR95Y`=f$OW96EFcqpe9d0uK)qTM@o*G2C{tr9Xx%aP0Z|eX6002ov KPDHLkU;%>ezwIXg diff --git a/src/main/resources/assets/create/textures/block/copper/weathered_copper_tiles.png b/src/main/resources/assets/create/textures/block/copper/weathered_copper_tiles.png index 1316c668412065e721fd9ba91673caeedab1e71c..3574844ae011d8ccc3f05a90af90ec5c8c99a8c8 100644 GIT binary patch delta 558 zcmV+}0@3}=1kD7HDt~(b)d1F$v+A1w000SaNLh0L01FcU01FcV0GgZ_00007bV*G` z2j~nR4K)Z~dq7YC00G)bL_t(2&s~y1YTG~*hJQ~bCnM-oM2dwN71W_Lv>{lVLN?v> zEImMXJwjK#Lr>rXc#(B+F?Bc5Dzc#VB2+HIHfTInlrEkvn}2NodCYwO`=;~l>*q!C zwpeCO1;zoOso*Yh0Nr;VDF?tfe4)(k4Fh0qZ+xL>+84@Q?*W4C!bU3xJCPheER-{aWoa?zZb9Y$Mh3m$I$&Z*IZIwUnj(7 z(Qz+OZj=LVy??I(Ky%4BE~6FTc7-aCH5J$~UueRMY}5AX1xn0v?bx9SsZTFZ%ooa= zq@@?rQ&YF_CMj`ylT{=JGGYcP)0yTScIUzNC9wBEIV-(b%ztuUsMe14WAem<=F%5R%<|BL zjPa))XtSChJoJK{hpAia)>>aDOP{7pM*si-07*qoM6N<$g5c}|X#fBK delta 558 zcmV+}0@3}=1kD7HDu1#7VgN@luPb%{000SaNLh0L01FcU01FcV0GgZ_00007bV*G` z2j~nF3o#iV{AR2G00G)bL_t(2&t;N9i_<_H#b3sxyAyB>J24?lgc!s{m!-W3p8YK1 z+1q{uPksllUitxg=vfMdcxg_X25b+jSqbSvrqgWo@Gt3#mw$nI^JjSP{r=YHPakhb zuK-j{0l*h&)f8e?0vNo0S2e}H1pvn3i_|Qp41ifoY19`f0I@0~6KU5mi>WVC#*fpr zOc;P#CiP?t06;w%YuCx66LY4t>(rAmeN<1zwMB5#4frvu~IL3EC| zvv1njJior%zIbeR8&Wh^q}y)nH2~x2vl^~Myt}|=5P!a@8le40XSGbksw59&{eKRc zt6pb}A2>Yhn=0x#1mRJ)K775}w_qIhw`_@LYA6AmwrkB5ojnJt`^dq>CHV&M^9BIS znPNC{08pV|4;!pyLVFd22NdVUw&y_m#%O=?=!8P|dqsIjUwRegIdCw;5kasVSPpFW wzMakWbtleVKHUqkgRr}e=E`|;-_GWL0r|B30r}^SO#lD@07*qoM6N<$f}*kfZvX%Q diff --git a/src/main/resources/assets/create/textures/block/creative_fluid_tank.png b/src/main/resources/assets/create/textures/block/creative_fluid_tank.png index f0007ce86dae33b6f63ff550f57c1ba99af82506..116bf0c0c5415ba68bd2dc14fa3fe6c5b365884b 100644 GIT binary patch delta 1805 zcmV+o2lDv30+9}o8Gix*005AYXf^-<1qganSaechcOY8(}9CE+d?nuQ@0G_5FBJ?{$QT;QbjZ*u^~JP9usk{>Lr= zLjB~Cn*l!G*9XAj62-0&<_HI~E$fQn=;oG~3AA9N!>H?UX!`<$2)Z4NApru`lQ{BZ z19Kok93$|_u$;vx7eGMHaf6ktA|BvG9=dTR(A>+8mwy;31R$Jv34kU^23D$0z0sf% z9Li3dI_JC#F1qBh7q8xV?}Hz?n1cijF8B~a3@PL&QKO4Kh8Sat*(6SaTy@E(kYY+H zXDH3MIpcJW8G^z^iWXOV2_=?Pas_>=R#$xuHP%$KY22h~bIrHVVoNO_bbv~S9`5i* zIO36x+iI%#qH4Zi_Kw^?qedGw0A?m;icKeK5QlJHL8F|wff*2E zB_JLK0w6RG%xol89>|%2nN5tWa7c1;1Dr+!F(9Z1vFmhUcO&mE6^xmNwP#rSnErR0{<1OVlj(^0+Z*hmgJsLR+QV3N%9 zkX=`sV{Qa)^o?1UZds~homar4+^~cOIXEPKn}E>wc|v0>>#Vc2@jRUC5xH)!nmsQn zX@6fdD$ZE5KOIR|2)x*Awu@zZSZi%dyFJ2bD1?_E7n1&~&*uA}{N89TaI?k>g0`V@ zDepL?j3k*x%?i0JwPo*wx8~LDbI%XhB@7iKM&M?iP@pg)Mc34Ny-htigw|*`mQM~1 zv&`_|!TYpG0+-x6tKQ$j+wN=eJZUbqH-9jjNe_NKVcVQ4C_|g}lT+pu)m!VGr|!<9 z56Qb04OZhzppk8t`=!0`tH{0j44rw8oov32?3`&dy?ms`N1^$Wd9SOrUM&C4M)Pju zl?-pTz7h70)JWP-EPI0Z4(1hv2dE}5xX`T*6l>egGUnEKkjR}OQ^|eTBC26$xqoeO zp?23zODjx>j-t2CxgV`e_q?JL>^zZfAFYVLWT~=xXn#&b@ zdX`Cam?<-8>3nGkrrma@o!5YH>kP?f?`)oS~6 zT4<5X^RCD)rh4ogE0_jx$4c57J97D(s{GHR`AKztFUqp(Z&QO#brb%*guQj34XpB2 zt``R8OA;&=3B_Ms^C+8lF4aDNL?E~8qp9Ah`XfuYD%n z010qNS#tmY3ljhU3ljkVnw%H_000McNliru=nNhY1sApr$Xx&c0g6dPK~yNul~PS> z+dvc?+3S^M>%(qMO-h0jFn`#G911-pP-sIS^pqcxWBzImxwy0htVofOysKSFyH=co z+Qso9q{G6(>^$DQePi96-wr!oKwSWRuMfcKckvH}C;YTljs!x3LZ&)f@oRGE=OD|HP|; zX7oMmk)*kpmVT%ATZHDpm@$4DzWqJc5TcYS%hIx5F;!Jr00|MIu$~w7$Q$YUK3yeJ zNLANmbr-2+omdU?l&oSTF+%HdehuL7;_!~e%|1*`_)Hd@es?!^<{MJYNtDOTmcHhu vOmMNQGg78yQRO64EK{tYeuVfvmRLb~HIkh%l%Oe>oF|fWKYX1flba)vm?D#FI&+g8jFB3Mh9G{C7>8Xo zX^a(xixq@{9C(Wqf{77-hYx*JE?svCZbT?gbp&g60B>UeTYqB!T4DfNU;tY(8$3z? zK_wF}>G56f0001VNkls{(*tF^N|$*PnfaGd&Cxc4?E wId%dJr&B&ReIq`cBva;V#@BNnYti?mM+sjR(c<)Y`Tzg`07*qoM6N<$g8!;{NB{r; diff --git a/src/main/resources/assets/create/textures/block/creative_fluid_tank_connected.png b/src/main/resources/assets/create/textures/block/creative_fluid_tank_connected.png index 8b458c6b99eaf074fc573a282b553d8596704fe4..b2269d1852073cdfb4feb614b12b9995e412b5a8 100644 GIT binary patch literal 9126 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

-;mS6c?Va6UQ*q#VZ zfjb5GTkJQJ9#i(+1mNx;xs!S!PZ2PnMtAxKz(uv?!jYJKfQJ#0Vg_3#K|&myQH5B^ z2N3J31+jJ0BA;27Y)GCjw2zS931!hcyvXa(&#tQjJ%@!u@I>Lyb zE1h0#8op#gzC_h1xOTQCI7BNA==V8%{uFjS?7r`I4?+OMhO`8b7sv)} zue3K4Px|W0vmznY0=%Eg)c=g^ozRCAV(YAAI57c1x`OCw zp@{3=gYotVDBBZDLP+;hiqVwnwrWe$!QYLti(>ITzC$=Qy?CU}aD`?}Eewd!1>}Q> z{B3tGvMs7O;6k2TGn10Urn(210jY_wQG`OWSHKske2j}XW}S#MriPU? z7FtBiuH^9W?~c@jnEh+s3J=a;S5^w0k-k(wmjdw%c*Jy5UwAYRk=xd4Gp4v8xx;NH%yUMB~`1hYn<7J_M^p#T%VT0-AM97{SU zsQ{?s3pcQc05{w~y@Rwj^WMHOaOQr`5Rqu2odF#J?MOG(tZk0EK-1fIB9Ft5*BvYPJMDjY)os;ICKifeapW;9uB) zx}gK0s#0Bp-Xs?s_}_K?&IRUPXi;>8U|#sZ#ngbBHsc@Q2on$<`TByF)GJ_m!Ao#d zzeHm$)fKx1WZ|c%$z!oow2tpR;_2fJ=m0TCY|4>a*Tt+6f;>OQy3?*q87P`x?PeqK+sl49G#^;*Z_h8A~#uKIGHFyOj`z^}GWD2BT4U)k0+d(j@q+dB&v!^|RT!Z)pD>XcJjvV#KHazCwk%h0n zhvGO`K~++0h86OVB*@9H!3x{wQ;}jU&suy3zPuQzI;`|!y2&>hS(q!(8;lI^df4-U z`F*T8TM7~Gs^E}3;)lqE)dHbJmeVcoi0jnKeF&90$vaN!fy!NeaG#5W!;zQD@qBWd z9d9PAb{n>aRnM`|{AtZrpQrn{2zY3ZL%j@|(E}EG*tdE&<4^XTp;y{y)-Q%9hmD{;?I@F~ zW`_Xm$Teh~MEu_;k2py6l4Kr-0vLhPfE&Yx1aJw* zVDG8312kchu`FN$G{WW?l?(xto*h@L8(RYd$4mscn90)T5CV1N0eSZ8$YFTt*je%f zz9`Tl0Q)SCr|9`8cOy*(_(zP~YQAnYc$TRL%)$fY*}ki zT{alNzF=(ZM_3xSU_UdHEXf(Hg@Zq>Cy_?LP~iP6r0lM=N(QY0a)XO9C7yQ9P$`@2 zAT0=%pwA9jM$pMRJyk=FPeqEBu?`DiY84gtUBz}+aluYYiDbz<=zn6#%76BA1P{_( zlReS{Kq^pDt9xYWuM1GdcPaPLG3lOXjgcn;p9~4fbB}rFJ8BPldTDv1#2HR_j>tr| zcOyWJx%j;cVy?U~C4e#c<=)tScJDjsmo4|SOsiwF$Q_{T6-0MpSNIHM*E6XmOp{e8 za0&x#4O?PI&^Ua~-34>?DVnprc0ahUbZ4HyRX}oIngQxcF_M+DdQ&A#mx;*D%AtfDR1T*;)Z=34?=()gDxs7oi#eGO$Y?E7M2- zMjR%WO|KK&OL7Yv3}?_EEf4h-)`f7nNA#^kfN-t7Oxgg4dCY_;CTTdIwE#rB!XA@# zh%Q7!F_W|4V%gN`8tEgK5V3f64HC>o=z?uOsip`dB_SD+a=N`?O@>pPA-ld2pg{#u zr?ba~=ZvthvNt;53iKfCa9wn(exk=d5V0V;B3ap-FfWRqA8JyKaNLtr`D6i{p3MSp zL#fq8cRTOkxjYT1G8JTL9;ug|tV8CwqV&9N((8R=bTm)3TlHGJy{+B;*yOpo71i0UxGOtpUGBMZ)8F>b*1bb6;qLb;jW2esQr!S$im2>4$Q+du`|Zshd-=p`{k~6dM2c zh8T0UVXEgo%zL3e)P#F))!}%Ud0T$>`o2H&L&xhF>RDB9I0qmd?{W_J;KAWT1dOK*&CREF6OkIsW^(oXuq$7H0UoF+*pQn{M|| z*%`(T zb#k=mGi4;L=r{R`=?j#{Z%E_%LWNg4GTCMDfLulbIMKcn%o<{(Sahyq68%BQ)*#tP z*p?13Z~#cSEX#J}%zGv?-k5;2V8OG_rzuKfyZ_#fEfTt0rB-*T5dhR!zq*|R32++= zzQRBreU|_^7l%{d#Kyb}^ia{RXM1_w)Sr}YMgsEUDZ#m}w7*iXOZ+N&*K%FpI;OYh z%flkSYe9cqoVu*;b#af*`VS_0U6{HT-QOjr?nU=^$*FtMC89~U=nYYf&-xb+RQE2Z z!6jEXTfMJ?OlEiLd+S!8fFGal;j;_2!~3l3Q_gRB0@N;kjZ_yBg=W;X_1(dZSv4jA z-=C&&HtXzwoP&ka`lS#+CtD%LW@8>sDBw^c0X_zFslmpw6>TtLh|;&uhR>&37 z<8!t^YzRe`C!U1|86i48+xgr(PB1~x_3H7?Ub?ZA$Ie0nK?K<)|69-IWDWQ~*b`Eb zBv=-CDjj0EMe~%y{%dbaMW{6}JStD^Pvr~q4e zK*_v3D0R$?wRE1X^!@y~7>F#&0}5w*ynbnFClA~; ztacT@sl4Aj)x*bhU+&Yd16@974GWO0$XLs+Ci>g{P>2|%d-~~kii<$YwFHtLg+Ve? zq)op*WZ@8vQV{x77d1Rw3VJ#!Ojr{~$`=;$){m^&6N#Fg^ zcK>)LBGnrYR16HyjjEofy?^emSL_FL;G1&V0r#=13dV;ZB~N=sDCsI`)oC6d>^K0} znynkc1@Q^>09dscy`^el)iK55;D8|i9FI>LO4VAbdSkEZL0+)_+>K+my_z=2eA^F2 zjhsIfJ@>jB;*ZjUU zm01qP+NLUq6+f2FcUsQp!K-FJI9PWVR99BMU1ck^%9dwC4gxmo#-9qQpX;dVwUEl1 zv>sH|1|AU|pI54;i^_AhzuVqtHUw0kF0s*F$Y6slmnOFYUJu|j?Xo6h+3>?b0C3 zx71T)^|YG~Ofcna$HO+-6yK=phza4tUhBE+8r%MI{&lICBE%;WP!Z>KjGg#E&boET(&>L|+LQxV%lcK&U}JCng=bqH6aALqe|>Y={)!ao({V^(lbo5LJ>cHOg`o%rl9i(w@88W^uaenk)Ak6=x(1M% zJT$R1@BypwgvT^rI99&&)`7hh$95am1d#=}>0V(Xr^3}YC!YHgt4rIZ;eF3v%<*(4 zp`H&VJfe@BJJJG0;q#&JRT$TNvJs+MXCsGgfo3rYn~x@G7*%*I;dww)iFO!*p?LyK zp1<%wsI;UyvQp#k6G;0*L5XOU2IRvBLy)IOTjdZ!Q|%LrNC=+mwC|{(sk4f|pBxa-Em`SyY$x*ANq#GWAc49c zC9Zna{i0_ZcZ6O2 zUa9`BP_4eJqy1i}R=-!OzbjO$-z(MM6{^+mmFn*b)#~?3^>>A8^+6x{UVrZ6@2*gv zehb4zQTOUVWGx$cDe~j6>wsl{Y`Kt1-4EL`ff5@_*TH|E&q2pxYyW)4C(5vX0`Vg5 zD9JvHB0VO+D%h2G9Onr*U#Ca_Dz2>-qoZcN><(OnKs%jP5eJTA*>2|q_yK;(Q6Har zz(Nr&{tqqeSJ?PL`+)!e00v@9M??U70M!82le6lZ00009a7bBm000XU000XU0RWnu z7ytkO2XskIMF;2%9uEZ>QMKh-000I-NklnYR4}d))uG*GW^JqEw5fdRp4aV1{MD*nq7hdpPXYG5&%$ zNjq^KkU95U-*fIg=iKwVzSK{5eimpx!*Bq=@+<%(*#!JYJ-rVAx~2m_+w7{A1^@!h z0|0ih_v-0=d*7%CUu)L{l>q?N(&BQr(U~>M02zkUHJ#;I6eUEo-!tUipbG$s}u}muwV-horerVBgCQYXti{RBa zDncFbIT2$9`(`pWdkBXI6h%E+eF^|sCLQ>emf0cCVdPJmP@i~~N$0saf#!?n^TdN4 z-rUpsk|L{?CU+YEFe;BSuj;P>V1X^LJbV0L=;?i3)BndbR=pk|Kk0#KFcT z95=&o3v6M#B}$5n`sC)%Z;3l7gZjkrkN9S9R~1)HQo#RMasGIAWfgBb=cDs-+PwT93a-uj;S!++4>p93u%dF9^I{ z(msr!@I}Z=id=-eBhNZABPIZR&^5hncGbEjcN@UHGXO`y5iy&;GoYqPJthqRGBm;j zaZQtIHhz{#x6DqKNs}d7n_m_bp5)mHTu7k#g?wSVCF0**Rm36eiDYO%ghBl4+iiSK zvWd|c2){*O5VAZAts&>Z@}1KN;t6!Mlh01#6T~z2AohtW*H-lPQNDe)h+2_U8KWZ( z4cIeeduTi8RsFRi1z|u7H1CzT9F<6zWkE^*9es4fp#h|}@gj#npuGRGgfZABLR<`Z ze<);4MRNL#k8y!{@Hl(z#4F&~c4mCqe3*evCr!kMXB;aMxMU&aPmSI?7n;z3XtPix zxXddU{IXC~F_2^v_Ihgqs+7uz1i}XK%}NzfqAPi|R!U`8MZI?D@Ojhg4P-=T8jZG; zSesuC+@bwlMWFdx`Hy`@BtCp1cmS)>2zIoV({m=r1NK5Z5D!F7r;P^!PpQT=;KRTJ zKCy8Ic)%--hMaz{H0p^5>_O~`2V7gd@W5DUG$e2dzys0JSZUM?xVWa#fLbUjiUd7+ z0Rz8MBC2BUgwCk_08O;z^htar2&jc{XZ9)PT&vMD0W`SmX9;MI>0mf(?wI%tLHcna z3TAGhf1`@%I>)Fb7OY9B0UU(q3+1%LR zu3k^ATsAJexcY>9OWiwnqhb}GU->4f!ONv@k&~9_E7oG~PbJf2Hn^*w^6S?IOW$96 zk&_bl&fQo$Sp0;mmioD`DxV)H`ol~24-|c~a5pAdOR)Y13%pMLiM)Mk8t^fcc52tlq!ZD9vyX^7*a-r#cq3L}g51QT= z3OZUuc|0>aoBKj|R7f1dakNNEE635IL;e)*3yta%j~qZsiVOh7^ZAKWQ%~=+z)FhT zHoJkd5O)Cn(SwEz!+F6jS9!!uTjGvD^BL{kVtPfn>wTe0sjSvD*P|zgKGdVtrv<)f zhq?ATo`@ovsc8}bc**Y>GGWTy#&J#;(Z6xa?^s4TmG{yow%OcRVJ=l?7YnWIYdUj2Aw`5rh9wg(9u6gSJ$s8xjA8&@2fgE^t0B>LbTXK>U9RL6VLrFwIRCwC$muYj`AP|OGu?wse zxlNm@k41EaEL?!8gCSt3V{gG z#e~eQYn^Lbq+-HFV!9bqZcs7J#GxABgmK0o3-XmN9w23V;HD8ITm9 z>j6f`r%MS6z|n$s2Bd!1bzNovkrzN%0(c6EId!S);(xIVJu>MkPsB9<3t&hky8g(5 zy%>ZVAPArq#D2_zrvpH<06>N`r?H)~fXHM6iXawgq>2kR05y$ZTfhqdR2LKw76DBq zh=vQ61w{~V2f)&TIsj}7mR*3mWC4dP_?ioT--5pG0@nb%o&~toUNH2)&Vs22o>pHZ zTMrBiY=1of17PX_m_fAlzzYEC?}4ocTni#wdSL7YQxA;2a6k0m!FD}pHtT`07YseH zVqock9fSX&2P>LLQYJkp4q3a{DT1XC6Fr;{Sz410a~js~-1(!&7f&vqK70N`>X)z1 z$9^7>F>UqvL4Tg_u3o>nczgNo{fCcIfBJki_J8w;jA^US5Bl?bcm3t-x0~-je%}0& z`uCsfv7bleqpdza=+E=-5Cbi94F2`7UFbo-?W|n9iQ56E{|gIxAOk``qQQ#Mg#F{b zVpI;Iiv=Jg1#mC`$QTL$4i>NgRxKa_s0D={41kIY%>)=+IO)Mj4;1hhEM9!ro!3Kk Q01E&B07*qoM6N<$f_oZKuri~Bg-feN=a0^@$aAM{=vgO znbVLg<`_L5&6>GDFn@c-F=y}Rk`*61babsE_vVLFB8+Ex#(ylBWmjJN$pVr)gLuvK zOi$rKFV{Bw#v?m{7~@W#5d?q#*zGfCw}~^mwOWft#3vqyI*+nRSXdDl*~}tF!Y4pZ z+sGK^i*Jt9ci())Xq1Ub{3NALg(i({Zq(qS^5BG-xv^|Ilf;>ucp*_IDoT@+Wa(nU z(s+nK%a<>-?SGrM?HU<2?u3<003%pz!=1uU$5Ws=+X@lk^k=N#7xSWlRupCZ#VQa& z^UR~L1^66~4~PYbV$}+>;ef^09ij%h<(9aOXu-mOS$E^q4*-M+dj~i}0tS2}2^7gE z=0t=z8u%&joW&_uP(UGYhnK7(5#$)JyJCQ(U!Jk|a$b#gvkzoQjF51&fx z3y=$}ixns;SE*VrwKp(Bhq(y)<7 znMk!MQ-5ceai(cA&vLQ0vFhG%_MW-dtkJ<52y+`}ibW@DP^WZ4&}t`PaR$a%35=)3 z01}!PXWmGa7jtfLhVn*L1csMkk<)201_pHyhe;QAH|E~)=1}+F<&E!|bBns)V9qV- zo-p^GwVGKGXSDUz&)oc`M@#%*cBdd%dRP^C z3IP}UzKhw6%KHL;%Ud@1WL)oi0*9?9WIx90n?BZ1jF^|@7R z+s~!7%bl5JcYQdPow9dblJlO3swqtC_iuc35L zVt@H9ME8oFuOPZte9I9(4XYh>!i<7Q=va_6phMhdw+SeWy6IA&5vlH9BBMZP?muX5 zdfKIykL5(8*^GQuOWZU~iCQYp#MMZg3d#J-(Jx1QUL08|{Yoo_Hko-AAq+gX?MtEB>yY@XyO$#yZ-=OHn zW+G_7oQN_84JiSJ3$I@ON5&db0t_W~X#@=b00h1>)1c%DrT_o{07*qoM6N<$f`R0G ALI3~& delta 163 zcmX@gwV82(L_G^L0|Ud`yN`l^lwyESh%1oZS++IACTV5b>J=AmdYea7uiKvIR&(Li z%kG0`lUxehB>&_A6)~0s`2{mLJiCzw?`Jt8oGs8q?)wQSodwd2O O#^CAd=d#Wzp$P!*CO#wp diff --git a/src/main/resources/assets/create/textures/block/fluid_tank.png b/src/main/resources/assets/create/textures/block/fluid_tank.png index 64b046055753e60c0287eb679dfb637756f9bd3a..5aeaf9e300e0f2b45d78f917001a3ec90f126fca 100644 GIT binary patch delta 1506 zcmV<81s(eJ0q6^m7=H)?0001xk!Usm00d}yR9JLUVRs;Ka&Km7Y-J#Hd2nSQWq4_3 z004N}tyXQ8~^ncHA1;w%S9)IQt3%P_GRU%BOJC)z{NFzeVH+cba>!M6bndobVv zd*i?^ibQ6_F@c`~**kN;XN@OoAdGg-6iNqc5XX3!;NDKG za|Xsl8H~ry01{d{XD+d-bmpjY=CYtFOn}llIgLAGU{F^U+xX<}V(yJMLf!uH>|bZ-)pZ!hsM^+um{z7lz(4oYTWOGH8#Ol&nN(F1u zg>Fia@o8TnbI$U|cg3$u6Jtz6i!frQs*hGskFKGv#p!92qxT0-0EP2@9@mowbVh>@kZU){qc4GJ0|P zv{>tGUik{w3FIYg^pVdW(n(+B*|+JW8$PdYb>RC3F8WsfKjFHM7k$jLAL61P)PLn~ zanU=G57*gUPyH~{pY_)FmP%ng`=^!JRGYh!@>6G=8t8T-Cdi}a!n}VM&##wsxw7ZO zHQDR5w80uKy_t3ndi}Tt$$sqjh%Jd(*0Dp`(z#wbT00006VoOIv0DAz{0M?VU>YD%n010qN zS#tmY3ljhU3ljkVnw%H_000McNliru=nNhX5hyPQSONe50Rc%wK~yNurINu;!!Qs; z2jpa9m!t_o2$UN?!+-FJ{8ObARgLWs+go2aq?qCZ1o4im9qo*Eu3lfBTYp)UQUPeF z08mqhPbMA#SdIWr-f17ja5S^3dZ3iba%`wrmJ(@uH@;6Uh+0*BcXN3mqoKlbET!s! z9U%6j*^fpM;Wr#J0HKH;Znv#0?%Hi~Kk=9)IcTGO9F9gf<~c9`?GLRq07|J&-dTCJ z4nX?|U=Hk0L$Yh7lt*DdwRT2 z^EYF*{~OG_32=2iQiU84VwIBme*a07*qo IM6N<$f}KFhfdBvi delta 229 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 IM6N<$g0FqgGXMYp delta 928 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 M07*qoM6N<$f(oEJumAu6 delta 209 zcmV;?051QB4dDTh7=Hu<0002(-QrRJ001OVOjJex*_r>!h4i+0>7#AkgJ9TmTEt^g zuvAK(N=1x7K!Q6xcs4sK(f#BA004MNL_t(|0X5Dc5`ke5$Kl_9XA{A`Usn`W6u;BB zl;j#NpqL>_Mpe9P2FsLO$Mv`ZT6(@WMM_Q&E*+my^RVO*oUOP$Uc*ArQ~$;fp6W38O9Ygu00000 LNkvXXu0mjfPRw51 diff --git a/src/main/resources/assets/create/textures/block/fluid_tank_inner_connected.png b/src/main/resources/assets/create/textures/block/fluid_tank_inner_connected.png index 01e54ed3d1be76bab2631f034d9f3d00e2a38083..4ce563c5272dcddd0bddf33f937c7135f4f4f996 100644 GIT binary patch literal 4873 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 delta 689 zcmV;i0#5yjCcOoa7=Hu<00013M{Ml?001yhOjJbx0095lng7a#^tO5Fqiy4pX5E8e z*mGLWYgWW#Qo&(PuvAK(N=1x7K!Q6xcs4ue)a&m60004WQchC#Ji z5CUm;E`%1b-640md;2!o<&uv1lDjW|CU5^_gz1!dZqx@Pghi(F{Z$~HJmlh(Kcmn& zssdEvue~VP*^c#1G`k~i0kTbV(U%?tS$G3(*A5SL%%#s`-m@E>m_Pw`0U2ZJn8g8A z0(8q$TQnVJ_AG z7-}^NS_v9^P_dR^O?^mr2$$)Dr9$jM%2bfc^x-c5??V_Qf;aRbbePkJt68;!H1z@I z^&t`5oBB{onAZns=z}DJH1z>Xcc9ehj>qP+Y#?h*cGi_ zQhDSfWq(Z57J(ErI;FO_15=4lTkz X(&1~i^GDW=00000NkvXXu0mjf*fTpp diff --git a/src/main/resources/assets/create/textures/block/fluid_tank_top.png b/src/main/resources/assets/create/textures/block/fluid_tank_top.png index 72092a995806f79551254472329c0579e86195eb..5109db8840e6815f8c25fe895653fc7196418cfe 100644 GIT binary patch delta 1859 zcmV-J2fX;=0mcrH7=H)?0001xk!Usm00l#OR9JLUVRs;Ka&Km7Y-J#Hd2nSQWq4_3 z004N}tyfu&>^2Pi*C}!Yk<@w|Z3c3K96zPac6U2HgCsWkNzh0lSw$B8RQv1CL;Zn= zwR6f?A6#@!<1x`hPM8FJJ#CFq>!Z&Nezex;+(qi;4|_&FLcN{ewh*|aBCK(5O+zM)kGG^GA0gQ}e4zI`0 zV(!Nq@dllAQDk)0MQ6N)A~A_R$WWz32emO4Dsa(oV~>%!u#B}Jo+B60LSmE{F?6t( zC{=>66mB9|<$u!`8g}C_S17=6CG2FvWrP#sReSPZ-^YuNqjZP}(QmBa7jvh9I*QW& z#V!y+$Ic@=0N(HW17dNB!LAN-K!8c-c}2E#<(8;Hv|yvfXy##G*9CwGwk@0?0R!5R zSaPI2vnK+M0sJI*&Y}!wP(aplg_mqZ9LNdWZR3omv458>&t;Slh_K?sgPJG_Tp42x zYR#K~9721saKs~>tPNJx3um9qeP@jpYamPw&I~qf*0AjTzJj`( z*v=UkV?$uvcLtEq+&R;MjN#6l>YVAws0z#Q(sptxb;iJ;X~g!Rle>$#58f2&{@?P( zcji>5?*Cv;b?P3N`{eC`wc7Q)^g7fKwqAxERDUffzgiN9#JPBBS@&tc<~^orEEz-# zO{$oXg`%xRg;hNc2YvhN`xRfV%yt|C*Z_3g6sgbWRp6-lF*l(Fp?Lu+@ErPKA3ob{VHPmH!J9K6aGvg)lo?dYnDI zyjXhQ{KA^7c_}S!+7Q<-+`Of+;ymmdV%N_6v1uKv_r2HFcfY);YNiN#=<&t3ZhQKe z$S-(R?Kap5YUP;@NSe7vqg|Diec`eD)qhui zzqp$wk@yHqN1rLQvzRx#2_i5vl+lVNfu$OL&>Fj`3sWtXl}j_?vO=APi-l6Q29)NL z-XdUcB7iUdQ;g2*&{M`*q#Wa{1Yxs~&p`RT=*Flz!nY{yIyeJ~v9wD)+%YYO2#u2I zb%Ebr$?~qEAFqToJ4PrQdg~05!GFgE`^mDIn4%rgCJSE)yM9*gq1#=dZNQ&hc2O-n zVu~-GK02EH(hhemZfMmd^It3EK{#G@Lk;1GOUv$3`?G^-YB_U2;;Y3e-3*-?b8if1 zU;mJRsT%5CHh$=X!OQj(|9xrUbXDDOqvyu4IZx|*!4&hZN5i8*_(Qw8)qnn3YmXgp zR=fII?vKUrl80v+sw)pa^YNOoLf>b&?5EMZxoGEBGKz6Hmh*Br3LH zp|TXJ3sjmZY~rW8Cz|KVL{$OSQ#{X54t!`vd|>_!lzHeMzNDgF00006VoOIv0DAz{ z0M?VU>YD%n010qNS#tmY3x5*;01FcV0GgZ_00007bV*G`2j~nQ4iPK14hgsb00D$a zL_t(2&s|c@O2a@9{wxifEQBUfjItL~JOn8eaua**3-}s7h0o?$FCqm?T9A;oEZxM^ zq-!o7CT!F0Y1r9sXTG0{@0Vu)07|V~=9gLlaG8(JDYg31&0k%mYJcAcu-vSuAyJ$a zXQ!+VeX7FX_I>r`IaaFnWpw~hX-%zoBup1Tk8a;rU+Y}~U=j+K+vdwzeBbR>TK7yZ z5<>toFQ(Dh<#yl?o*o`$UI6eM>-us)&sso|ZS%UJdbwFmqwzEv8*X{sB-xhgmIG%j z$+n}LE6=g!seDUPLw}(A`Z$61Hgn>Uh)2Tw%^5of(2y?J+ywrhE5i}sa(fovlXj`v zr)uwV+jFdGG&W$)Sl<8)%SkB6=~6417o@@K{NsdlSCd61lk5`!X+XM7LO~MuOj?L; zUN`GqK?@iS!r*q1$rIxinOyIRyl#FE+T}JGM_T7~W1K#&FbfTFq1Ga=Xo3l5)l>tpk5x5=zU^p8qCo-C~1eB@h4r002ovPDHLkV1gy7ikbib delta 210 zcmV;@04@K<4&nij7=Hu<0002(-QrRJ0016POjJex*_r>!h4i+0>7#AqlV;t6VAyk7 z#A8yhR7##oMS%ODU;qFBe@R3^RCoae!9fawU=V=OZ^o&G5dOMt6G(fh3q&XIHXX0J zMH?;Jms3!O>%}$jYG=QCD=>7n>OBDc1NccW5R3kZI{*Lx M07*qoM6N<$g2JI(jQ{`u diff --git a/src/main/resources/assets/create/textures/block/fluid_tank_top_connected.png b/src/main/resources/assets/create/textures/block/fluid_tank_top_connected.png index c5ddd0860bfda8bd12fcb220df972442e70c9dec..93e9aaffa3ca0e717cdf577293daa5ca47789040 100644 GIT binary patch literal 8293 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 delta 923 zcmV;M17!T=K&1ze7=Hu<00013M{Ml?001yhOjJbx0095lng7a#^tO5Fqiy4qXXBG* z-iBe_gJ9TmTFz@$#A8yyVNS4AN}ftZj6gt3AIlN|0004WQchC3_q_0!E_WjZ(PrCF&1OVtCU6vHCH7s5woi05C6#6J& zd>oj7K%m{-jX;g_csF)gIyMuC2C`j1wbAjybg%@tBpOg15Md`>1_ReOr-=X@QylwriDov{T#tjdaX0J{Dc1`sfa z@fiDnC1+Mbf<>NWk=_UNk1jbZ%!JlRjpww#*oV_-zZYSq1kIAm500&b<0cu?A}A*)(foT)u1 z_W|7oT0;Pl6bFGQJt-`pfHco0o$DN(Yv&WINcsGLGbkhuL;L*$zD)xNJyh8TrL9Vh z{(lAP0FZ+KVJhz#K!~#Xpamt6!+(`-9Aeiuo!aiklI-t93gJp%@tvsmRs&={o5|m+ zfoda9MgBNk10+KDm+KO^$geI}C%8lifQxlk2pr$~1OTxnVVevg^)J>Xa1dAP5*q5I xJSHmvzv*n@W~>J4`mI27C2+LZkCo&80~A-AA=;I`c6tB+002ovPDHLkV1k~;u^<2d diff --git a/src/main/resources/assets/create/textures/block/fluid_tank_window.png b/src/main/resources/assets/create/textures/block/fluid_tank_window.png index 7b8574b13d04e956ba5dc077adf99d4ef661a1e3..083f35c976a35d52bed3e9286d52bbfe4cbcaadb 100644 GIT binary patch delta 1164 zcmV;71atfT0hI}m8Gi-<001BJ|6u?C1C@GISaechcOYxig^NB0P!4x#jJlY&mSkY+^efH`!Z%7SQeyGavZq`DA)h}HQYaV z*hh03lEoaO$D>&@7Yxi_p1$|l`!UCg5A8NOy~y4CaEu7;nSY(p3wqg%=X^4O!m8WkGU*S=B(Mdi*3J#%GQZ6=8`SMfrkPE?czC&|*p zgr#y9ft61#w13W<*Xb%5CT;{zCV&wl*5;1Er|l`w7P-9KiYOcjKZql@c7F%l8ax0xWN~voPJ@(YC z=UxU%ZGXtn5k?$o*vO-ts;#QJ8_gb-`&u>HRfAw|)lA`Zs0MRN2L#R6Ntl{JF;;@& zX)1t%=Bb%CQst?fo0|E|*cE}nGE8wAO~s&~cH%JT)b66(gKiG{{$1VpS~)kR`xDB! zDcuw09(8-7TAT0pI`^T+i*0VhnN%;>em!D-Hh+ZKC?qZP?Q3D_q`ZECP)~YyZ5Z2t zm!5Pi`zE zxqCwI5_7NC45S)1q+&xJSl?584fI2b?waFw5pSrrwtm50n|o&Lzi8)+ziuvz*@!P| zXn!nLwxu=DJA>axbSLD8i0+Z(dx-9fW&a4#eJ7FML3BTo<_kpkp4g9w?!)pq5#5L7 z^S2=X7Uch~AaSW#oeejbE@k^6>(Ki0fcz6R>AsOmzuT-nF3ft_kE4M9Wqxxe?g!4- z=Z$+;@_U-@cE*>7;#J&pg6{JQ+P6sB?|)Vm8ZU}#+J3i+Ix@c^_;`vZcZ(C!eq{qG z3qRrNUXmTSY-U_C{{wv?8b2Oa21@_{00v@9M??U70M!82le6lZ00009a7bBm000id z000id0mpBsWB>pF2XskIMF;2%9u7Ard}hYC0001iNklM1MG8Y21B1V(i(`mJaBFWMUxNXM^Fjl*d;bq4O@YYTEzeW diff --git a/src/main/resources/assets/create/textures/block/fluid_tank_window_single.png b/src/main/resources/assets/create/textures/block/fluid_tank_window_single.png index 9bf1949579d0b0cb88c1de507a6a1aecbcc1de0f..2fa94d0bbc00e867887daa436510b4e531ee4c3e 100644 GIT binary patch delta 1074 zcmV-21kL+^0lNs07=H)`0000V^Z#K000T~XR9JLUVRs;Ka&Km7Y-J#Hd2nSQWq4_3 z004N}?Uq||BPkF?|5?Q>fqX%-9EwLo@1U1ImnxMkTaw*Y&)>L+5|9O%mpniyjNiXz z_y-Sp(V&(+m6ReLEn2vu;qmPmm%79_S6lJY#YWdr6yAL}TYrS|$j+z*wH(H4JXwz9 zW}-s?5Qo0Q8tXZMLUhc#NOCgdkw7IiLVZ(-nu#K=A^ zp=7*Qrgc*y~0O5|syM)Xa@#x4C34+$0K#22oL( zoTW$?7na6D1bldQ{gyy-AY)|l6K0W{oCyG%k&5i}uxE(Gwqqn^!VFxW3XsGp=ocqNAQiRwBF(e=m z6Nyoxn3*#X^621Gp`0ZsZ$Ln1+@X?HBms`|ij6s$_J6T#e3)^B0Kz0m2AU!jtW-@? z(5#L*7svS!OE=j^%U>f-9=$+No`uc2@eoK-8StllZF%#pY_(zgG;P*W%gtM9HFWOMwOda;ckiXwK?7T9=&+GS z9zM#b6MtK6%G7By%{+aUS+CS~s^J~8dvc#sqYE_v3p+E#ppzQRIiD_QT_?7fffy@+ zcwPjsp?NWjPO7}fg~cou#;GudN?UL`En*<3gV-ir*}ajw;}&r4U**QP+#XQt>wa(R97bGh>lm)2M#1qL3Gvx6&3|Vl={AmTWf`QrcL3@^9c~TtXz(_& z&aFx-hhdt|GUEOXx9h_?Jp15L#>R)=O(*#^T9LFj2TL#4N#SmGvtxGkDQ{YR9BUqi zi}X?G@LcRuZ4WhtKk)KS<1=mHb1#3cE!-yTOE2T%MaA3nd^l-sv~MeVt}Hx4`HHe| zN`HG**-0XNisBo}!pEe&sw}*?k?(d`kl6dtBV2j-`*Czcw)oj$zpKOT;kWJZ(y9zs z+#{DuB;oM$7pn_5Li6PkX$jjzC+pGewmy9&D|}1;kE0()KaT!~j__}&gnt1a3!oM1 z<_w7d000JJOGiWidjQn{)|0d9n*aa+34d@%S#tmY3ljhU3ljkVnw%H_000McNliru z=nNhXHw~xV4`BcR0B%V{K~y-)W1Qe=`2Tms90qKFwIhY0VEcJS27I9V;MxD(2haXT z7hiGV=KmEJZvJN=1h8pFHiVFVCVY|_QUVMV89)qRlI7>2%m7?|B`N?J7#LVyR4Ya> sI4s=3aN*TU3=Ie3Js3v8C?Ey^05{_)%WOf+`2YX_07*qoM6N<$g3BcF=>Px# delta 111 zcmdnZ(ZD!CB7=pQfq~)e-A6${N+`f5#1%+ic=d9{g`3?6&sMM7zBJnFc72e0X&2Tq5uE@ delta 17 ZcmaFL{git`C>yuRq>1O#Hb!@`0sudV2JQd= diff --git a/src/main/resources/assets/create/textures/block/redstone_bridge_powered.png b/src/main/resources/assets/create/textures/block/redstone_bridge_powered.png index dab404f6a47a6362be8a92a6b729d31f736d0ef3..0ba53d85229b2d2d6ea09b74ac02de3bd6b66f15 100644 GIT binary patch delta 17 YcmaFG{fc`+D4P+RXDPGA#^`=l05|XjrvLx| delta 17 ZcmaFG{fc`+C>yu6{LDj>H%9lf0suZV2FU;b From bdb7354902cbd128c92da6c45daa508c53299d82 Mon Sep 17 00:00:00 2001 From: Kryppers <65094918+Kryppers@users.noreply.github.com> Date: Tue, 31 Dec 2024 17:13:43 +0000 Subject: [PATCH 225/515] inventory tweaks minor tweaks to trading widget and factory gauge --- .../create/textures/gui/factory_gauge.png | Bin 2576 -> 11494 bytes .../assets/create/textures/gui/widgets.png | Bin 12084 -> 21812 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/create/textures/gui/factory_gauge.png b/src/main/resources/assets/create/textures/gui/factory_gauge.png index 0ec2a53d934074b11d0e30cfcde69c825175098f..393d0928077724fa0e1286253836b1e2e672befd 100644 GIT binary patch literal 11494 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 a`ulI@I~rn@DG3?>OfnLR;x(U*gZ>Zl|2U!m literal 2576 zcmai0do)!07yq6!bC|(QqX!BZQ%QL=bjNrbc~_o+O%f1nT5c?CT=ySI8l%ucg&)yy%AK%l{6YJ@`(Ux6bU(e_Bg+gILQCUez$)!t|N=r-e6a}Bc zlW}0g`*3~nga5t&rL8s&_a=)x1H}MP@6HG`&v-S8lREKk0r9>&gz zIoHjP&N8%*GD-Ywk1q1^c zjzPFYrW3#NQMf*{Ms`D>A1~^E@gGS6zLl#Ah`1-yawQXzev3Nu7>M*+q&!@oSuh?K z{_5#tV~uOyPgyXTGrNcEYBoI5uI2(jGVpSB_LFQLJe9q>z?$aX6}^2cDem=vQS76l z=1F;PROzfN=Ts6gtL@oQ{|W`|ErZhOZn(%XXzD9lZ`ug%-AGsPRCO@KpF zraRazWMqTr$Lb5=J4q%9iFdNofgWW=kc0FIIq_+L1{B?z=|79-G&X*H&`>pTBBJCe zC+1-v>g(n-CaJ9Zg}~i=Ir;r?WTvC)I59JdQ0Z1gNKAFBOnKVV3N5TD#=Vaa7OQ$v zr5Ac<(#(e$^jz@Kc*SDXw%9dPCY&Id3H%^b+eSd0Y=9i>pC-UEeSV$zxVjcCdMDs_ zk6-_k&RH*AWglW&Er70Wgvi82gpbba90fZiQ=`n)F;P|6kRAw&v_7XN~qd4=siI(Xyh1N8#zo~S2zM*^O z4xiF7eQk+61tDrfVx2k6hUG3Gj@_Qb!awqHCJU*)eR_)~`ugGBlI#Ou;86A*U`jeg zyc)Q|6&yF@bXYmYSoESd({8JAaw;C;w>d(HxVc2N^e`bKNgbyS*VC}k=yrI4PcuY0 z{}xSa--(&L9ea+Y`t3xI{;vq%m#Y=0du*&0r+csGPXut!UU;yZ@c>HO((>%j+TjyV zKJ?*Pt>z86hA8sF{0;6#`tgM~e$1Y@`X>!zpA0+@Sw81HA}C3YHsOeyg}XopQehG` zr*k(+M`a(j$6?d0smmdq=Zz@Im*TN{~&aGKf{}Fx#l># zdoHzz9IKX|Q^$5AHqZn{AY@n7FE-3~fv{C4CFO89^}#KJ1{D|R;D@e>2Pv-~gp)fJ zY+@ADSwp?1JXA%w18Yh0QOX?`j(*G!ES_$+Av)N6wu6xBv<6e@(_?lL$|s^b)!JGq z{nBoqMksz3li%Gxnd;jJJ;Z11=jL!k@Tn^U;EfBMt3Ky}kFqYjn}=q4I#-Wr1j<_7 zi9@<@t(ZJEeNwtCSWJF*a*tg2+zjRmie zesZ$RgEM5vE4)x`%W74IuZw_?*gjuI4}FNn8!jseDIBrSUr!4{Z9gt?__TR1)9e}9 zp4e1ueC5gZz+V1J6;b&8QNjNAWK%^@e!RiU$|ZC=`yqvZMU#;1H+?cQ4MLN@~Vbhs(BMrpmB% zaN}GX8GYaX14%J1}}!RbVei$@7-Ri$Mq1Dxac&f|^u$9&FGz#{rh zHGyP1!sA9L2tEIY9`;C6ehPZm3udE{Wl4GggsF z?9=WuOLYC1Wp+7CE_ryCVEWZ8af=;0D@fE)Q0> z4K82EgmYi+sJ^w4ttI;P1nC$4n?nhiw-J3?`Fwb@-M06Si{v5oa4;7$IH(-)_|m5} zwC_Y0EZdspT2%<<$v=1bU{xt~#QxVilrd~#L`_CY7$RF-ei6ONEu`>`RI=lj4;=y^V(t&7nS@u z(qe;Zs-z|p3WnEaWL(!2L?VCv^;ZE&7N?OCM~H=%H`xA>k8UmtHCCD-S-K*!lv&`Z z3+4Ma3#JOxbi4^%$kt!~T(M@`jwNZYbNJ{%zVGgTs!4}kzgM$S x>DzZiLZ;Jq(%iGBHoY?c*Wp>y13Nk@Rd4qs-Q3pA_ni4{@N(n2US1_g{TrecAAbM< diff --git a/src/main/resources/assets/create/textures/gui/widgets.png b/src/main/resources/assets/create/textures/gui/widgets.png index 87127bd2ed29543002ad6f504e09b9a32f587944..1e1a64fd0b78872f9a566b1c512c8bf7bec56abc 100644 GIT binary patch literal 21812 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 ML}f&Zh4g&?AHscvH~;_u From dab4b54b44264e5fa5d26bc870c5e9df0100dd0c Mon Sep 17 00:00:00 2001 From: Kryppers <65094918+Kryppers@users.noreply.github.com> Date: Tue, 31 Dec 2024 17:44:41 +0000 Subject: [PATCH 226/515] missed one small update to portable fluid interface --- .../block/portable_fluid_interface.png | Bin 7624 -> 3998 bytes .../create/textures/gui/factory_gauge.png | Bin 11494 -> 11494 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/create/textures/block/portable_fluid_interface.png b/src/main/resources/assets/create/textures/block/portable_fluid_interface.png index 812c17896902b742445deb1fa0213140368c78b7..01ae345e759576faa131a4795ce29e8c716c4c32 100644 GIT binary patch delta 3973 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 literal 7624 zcmeHKc{J4h_a8#mB9Yw~OSUnKv5h5rwu$UTG%FKk#?080Y!%tFBwMzGsK{C*d)g>V zLM23mq%5I+Lp{&abAI1*e&;#o_x5p^^ziZ#3S%XK{4M7vnQ37`oj2eNp$3p2z$BU>Vn( zT%)F@YZ{N|yz?tAKDa~2e?OewJ?#)AFmEhxwK8|_T*ct{mQQ3(?Xb^K!(MGDtRCNXfv^jrZ zC7oQ+)HCAraw05)y(ecgV%w_uGi$tp>1C+)Ip-zyF0 zmZ~7n@k}HMn;GYwX3LrtJsHg#lPAUr>n})@>b#6ekR5!PVlCB?YI_9Kksi87t}C1R zRCZ`I7LwndVxdyp|GcbR;(46ffU9LijoOO$jnOrKtfAMK-y5UEYbCiMA8P6h*5aV= z%%l_Hvz{+dhsF~#3Ay;e;q((x&pDMU?|fD)udL;$nSZiJd*RNq%H4$()A{hPU2_nd z>b<8HfWBpf|_$B>() ztxAQo(fYJr^r+No*f@c@7Lm2#o~#4686jUsrRDqb-mSJd(zNLq?X?;CH2d+4 zYEgn(Tg`1Li3Ihf*H?V%hD}$r&kcllijzNPj%FWlsZ9x35IqvbZC)Hqm>&$CDaQf@ zE11d`?%j|(f!-Jmj;D>kdjCx3u180I&H3|TrPpBzwVkI<-Ws`(HFJz@aP#uMgIXG1 zkEyP7zYQ%%Z|%U*wqCK-bsKZif*0U?a>v-jXRe1UItW| zrtj&el95-F0Ds2fsT;6ZuJ*()Y4S$wv2;O*XZyg%d_l0V(XOn7n`Hrl*F3v!h%Zqu zonW!o(ED0t;-pQl^Y6;#8I7#L&R?-@sX5pcdlq3tNAt8Q)<`V!2sSomdWAWL=;5fero=`T&bp)yE#vpC zjEq$s^02*}aWRR=cCbgbG2Ui2VJ10)-}a@NyO8Fz@f33&?h?I5++rwp{;LY z$El)ie9^17?LHKLwM^179Th_hhGIxE;)NBHKB-&{%%@zzqPA7?Z)e@6oKc)3X^PeQ z8rnB+b>m?_{0+-iZ=6BfI%IeIK5$*FyD1rvy|(r+B1DGb_FDGn^ht-y0O~^=n-dLk zZ@kfX>;cs*-+-f^n<@?$A?eSd~w+M@|69}Of)M|$>h}ynbV7(TYH2p zDH9L%Uk+{LYHf7ml5=`u!?O%?4c^Q}ih22FX}Q~#aYqnhWAomGx{lm!e&a=HemXom z8TI0v!0JZX zhkNCdp7fmkGFZP6#{^QryC8sz*q;0}v_Oi`rL=7Mu>mgP9@f~P40#qqE}ujWC7JHy zsqvxM!&Ti#SxxCqkE~>`%2jSr{wae_BP*GkvRv%$i&A}VHL?PwyRB_oOuPI)cJ$Vo z@m;U0$atVIv^M=bp z*4z*)*L<}Ajr)A@mRW|Sq;;h!+RK>oKuP&g-KVE%b2@j8IJLoIL9-Y1g@$FcR9IrI ze%$+kcGR2r-X;8I(alZpi$V5UFMIifA|@sfGq5yauha4c6&*WnQ6%)W`@vTItbOGb zp7SaP2IeM`i`@94b5HtfUMW2-ROd8h-~262@{#&^k+mC}K&b=51%h0B zQ`eGr$u3`#JZzT7{ycI(zATd>h3Zsbn&iJ&JmXYRAZ9IwmcZrnNBfdjf)*?!W0*BF zT@^lah)LS>y+DIavSOkrPq0&(ewuixNwb*9P)BX^_fh_6Lz`?glW>J=)Q!bwYJ%3Z z)6bV%Q08@j`|nEc^+_dU&+C;ySeI5kp<%(Fd=rcE0%7U5^9|sTxZFHNs<;Zh8(Sa| z`qC+u^ogayw!iMGh`ohs7mhj#TLL>}*1oZ?XPfR(>kG3p0q(L5y2(*f*|f>0v1YvQ zWKwk2!gz*)c0ZO2m*&JOX~fNz)$DEW(A=n)V=Z7_>t!<101@q=N;(fL^oa7^HcV;? z@T)5eGEs|2O=CGD;_dDgjtMKX`cGsUyoq)y7LG-k3ty)AVx zYz2MC=BFm_5^i1W%9+~ za(!oldcsSK;j%S+_S^2)E+ed-AI{Tck7?Xm*zFUTZ*6qm)mU>MQq z(l7iCd_cz!H@-Sx+#lQA(r|aWP^Qk|M4_bq5hdnFyqgluhJF&69ZL^U1JFo_i&D58 zbH4hZRX|Fq<~0pnyHgH}%BLh3?Z7^XsprlGN6XxKfxi+#4~gvnig&$yZF)R9pFO?D z(wcrf`D{fddTCr)L#!wKhLPHp2^h4G^ zTPfkgX>FMSS(q<3T18B%-U?)&w=AKXDE4Xf`JK)l?hgR1x@o>}R(8IfC6X>WFRgqK z9n@fFB!}7m_&sZD{pyNrbhszz==e)im9kJ_%9yDFV2giYuY$Oqw%S#lxYRV2bK;F~F$h7=N%rj@|?eI&T67GFC8~?575YJNy<<^U11GoHZEQM$>ryr<# zE2tNo9c;x!a4&ROOGGChNJA^{UB4Nf1hif`IG8Fl2PwbQ5Mw_HpfzM=-VAzm$l%Tl znNva1HRv;QI;~$J1;<~xIWN+w_hRThoDMGTPS$E@eMm;BPD@WIIWj>>*_1!%aIDVQ1>NE z-!r)s_1Nefy%wN*u>O1Bv@(k=LX){-?+1)Ke*m+8fv1JHgg>(4L2drQ#PHCk-`h3U zKEU94u61m!$5t1Ozxm9t#2dQ7)nkzMMGxDhafhDi+d22ZJ)Rs65Q6f+53FV*T2Ho| zh%7pt8F@9&UOL!xaf_9vBZ4LOB7U$UjYKA3ddkI&al@a;7%QAnR!A(_M+J=|WAG}0 zJ`~2-0RZS63Z$U1UU)hXgZChkbU}-E?}LCuoG!>o4FyF}jPRaBvtTOTF8GK&HrNZR zg##VZ>4Kb5Hb5gX6%RzHAXK1W zlR%cJc4!QHHL4YC%sv7EGH7r66j8Iq80&8N` z@L)9r1`5+c!_f$w+HX+iBpMw}!s54~7~m>I297EWLm;SWz`zJCbp`|mt_8+uz@cC~ z0*cTesKenJnp(d>SW}6NsziJL9@RD!jsZo`!V$1&s5%%6)kHI(7$Kq6(TtFAYB($$ zjZuYb{fq{OMVgYSK4`{q5`EAfcnF2$vEyT#aHN5axh@E<0{u&3Xp{}K+t^w6jg=wm4{H5fGr_va;xQz;fs;H{(>}($ll93LB zTJ(0MG5~hujBJobR6LqarrMLq-nyXepn%(!e{Q1~4TVF~(Z*;xo&gGlBakpS5)QS8 zsUo2;Bn+wqg(9K9>639pLeT%Ez1==Qou7wpMx-(P2knS{_LLpo_vh;8(wn%`OhDjH zTOiTcpDEDL{&?I@oD8g=TUbvt$pg>0KYkVLA9CV4hu$TsKdZ$ zC{`UzfMPWXcn!Q36s`JqbQ+mJ4?t7#1|AF^8C)?6bcZXT{I8=@_`809Cw}`J7?gow zaPV)Gfgrz2s#e`Koz`CokK>?r(p#W3uC${1G{<0gdsc@_TRYx~mqFMfWV!++5O z1NvVl|A^mz>H3$hf5gB)QvSEP{-x_5G4PL+|E;e7H@Z0g8m90h#y_9{#;8>C&;!I6 zv)C|}hm8UH0Br#Drql2oL&8BZJ4OQlxcIjpCcu?!A%<`_-5h1Idxm>I4-@B@n?o!B zuiI#U9Pq|zKnQbw#TE9aTfpVJy`5E20(+O(zQ&@51dX7(WTy+~C!6j)kyArOM$m>oetevjNq+yt zYMp0{_*r*ktfrcH!K}BX@lT*5VMxGQ?%i|KnKgQmgaKZDpl=wORGK5gSg(gEAhdKVg2L93oQobGsd=*)s7LC z?{J=R$rnGyTUugoxr;dSNw6_>Ms({gni`U>vLp5oLLcs7VLE@ls!kFo#M91{vHtQK zNg>;CgkQY5hQ9lG;Oo)5Zq^_6v-JfVwv5Mm^Jy%$`cf4cGlkHk^_`LlT zzkZyPvcv5=fwz+*rt2#E57LCc@Q2Sw*Dukv(7Zeog~B>IVPXn7rspz`AH-bKao&)- zfAGZnLcqy=XLoU)cY$6Qyxp*0%u>Qu-f8M&Pl}jTAz%CXC*si8cn=`UGR+PeZ&kh* z`t*V3qUO{}lSM3FMuzNY9PQqS|Ly7n#*-zTw$7JHo3%M*+)#6l2Yr2fmmAOd(uzv< z@1N)NhP0Dty8P_y&Li<$uUqNTYA}}LUXH9L_DRoON^O>%?$n_}@?GE9?`L6dN>WtP z9v^M5*ExL%{`H*QG(m2+Hjk5|#^m_y!Vposd|gbbT=ZyHoYgZ^hhZr{S*Jz64U+u$ zvLSZ~N5Z5j#za0lN5rxtjx)Ed&6BU}Cm zzmCN+wJ18=x)Zph|Lq;bjap}K5PuE!F`AvulOUm9ScQBXYAI5=-nSqe$h}AYEOkit rsGpmPOo4!;9IJbnb23Q#!UB2A+KQx&*gVB(O@O({5#vh3lM(*|^n{!} diff --git a/src/main/resources/assets/create/textures/gui/factory_gauge.png b/src/main/resources/assets/create/textures/gui/factory_gauge.png index 393d0928077724fa0e1286253836b1e2e672befd..65e0ee1fa27ab43d1738711e3c12b9a344f773b8 100644 GIT binary patch delta 19 acmaDB`7Clno-CV)8T(Elp3Nn)Mf?Cxum-IF delta 19 acmaDB`7Clno-7-;qNl;k(9I>XMf?Cz><1VC From 20197737aba9307d5ec2b698f470d84b36a724d1 Mon Sep 17 00:00:00 2001 From: Kryppers <65094918+Kryppers@users.noreply.github.com> Date: Wed, 1 Jan 2025 23:48:43 +0000 Subject: [PATCH 227/515] table settings updated texture for andesite, brass, copper and white tablecloth --- .../textures/block/table_cloth/andesite.png | Bin 2917 -> 3590 bytes .../textures/block/table_cloth/brass.png | Bin 3301 -> 4207 bytes .../textures/block/table_cloth/copper.png | Bin 3325 -> 3813 bytes .../textures/block/table_cloth/white.png | Bin 768 -> 3004 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/create/textures/block/table_cloth/andesite.png b/src/main/resources/assets/create/textures/block/table_cloth/andesite.png index 7cfb2da4634fc35fe558221c90cb890901b155ee..ba63f6418b85c7901651fa4ed221776a57562cc3 100644 GIT binary patch delta 3563 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 delta 2885 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 IM6N<$f;fu^2LJ#7 delta 3245 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 bkQV#{GC?6PC~CFw4u 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 DzF~8F diff --git a/src/main/resources/assets/create/textures/block/table_cloth/white.png b/src/main/resources/assets/create/textures/block/table_cloth/white.png index 0caab0f064f2f4ba82e4eaa2f9b58a72a4a29a00..bcf52d25d5d7f931c9132df19070d986b405d9c2 100644 GIT binary patch delta 2999 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 From 79fd76155ba61a8fed1b2b4fc905a21747fc5e02 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Wed, 1 Jan 2025 22:00:46 -0500 Subject: [PATCH 228/515] Safety boots for SavedData - Create .dat_old files for SavedData - Try restoring from the .dat_old if loading from the normal file fails --- .../LogisticsNetworkSavedData.java | 10 ++++ .../content/trains/RailwaySavedData.java | 10 ++++ .../mixin/DimensionDataStorageMixin.java | 49 +++++++++++++++++++ .../foundation/utility/SavedDataUtil.java | 36 ++++++++++++++ src/main/resources/create.mixins.json | 1 + 5 files changed, 106 insertions(+) create mode 100644 src/main/java/com/simibubi/create/foundation/mixin/DimensionDataStorageMixin.java create mode 100644 src/main/java/com/simibubi/create/foundation/utility/SavedDataUtil.java diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsNetworkSavedData.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsNetworkSavedData.java index e411bf3b2d..7e2623a9c6 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsNetworkSavedData.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsNetworkSavedData.java @@ -1,17 +1,22 @@ package com.simibubi.create.content.logistics.packagerLink; +import java.io.File; import java.util.HashMap; import java.util.Map; import java.util.UUID; import com.simibubi.create.Create; +import com.simibubi.create.foundation.utility.SavedDataUtil; + import net.createmod.catnip.utility.NBTHelper; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; import net.minecraft.server.MinecraftServer; import net.minecraft.world.level.saveddata.SavedData; +import org.jetbrains.annotations.NotNull; + public class LogisticsNetworkSavedData extends SavedData { private Map logisticsNetworks = new HashMap<>(); @@ -34,6 +39,11 @@ public class LogisticsNetworkSavedData extends SavedData { return sd; } + @Override + public void save(@NotNull File file) { + SavedDataUtil.saveWithDatOld(this, file); + } + public Map getLogisticsNetworks() { return logisticsNetworks; } diff --git a/src/main/java/com/simibubi/create/content/trains/RailwaySavedData.java b/src/main/java/com/simibubi/create/content/trains/RailwaySavedData.java index b2b8a18d47..f9284a8d4b 100644 --- a/src/main/java/com/simibubi/create/content/trains/RailwaySavedData.java +++ b/src/main/java/com/simibubi/create/content/trains/RailwaySavedData.java @@ -1,5 +1,6 @@ package com.simibubi.create.content.trains; +import java.io.File; import java.util.HashMap; import java.util.Map; import java.util.UUID; @@ -12,12 +13,16 @@ import com.simibubi.create.content.trains.graph.TrackGraph; import com.simibubi.create.content.trains.signal.SignalBoundary; import com.simibubi.create.content.trains.signal.SignalEdgeGroup; +import com.simibubi.create.foundation.utility.SavedDataUtil; + import net.createmod.catnip.utility.NBTHelper; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; import net.minecraft.server.MinecraftServer; import net.minecraft.world.level.saveddata.SavedData; +import org.jetbrains.annotations.NotNull; + public class RailwaySavedData extends SavedData { private Map trackNetworks = new HashMap<>(); @@ -79,6 +84,11 @@ public class RailwaySavedData extends SavedData { return sd; } + @Override + public void save(@NotNull File file) { + SavedDataUtil.saveWithDatOld(this, file); + } + public Map getTrackNetworks() { return trackNetworks; } diff --git a/src/main/java/com/simibubi/create/foundation/mixin/DimensionDataStorageMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/DimensionDataStorageMixin.java new file mode 100644 index 0000000000..8d694f059f --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/mixin/DimensionDataStorageMixin.java @@ -0,0 +1,49 @@ +package com.simibubi.create.foundation.mixin; + +import com.llamalad7.mixinextras.injector.ModifyReturnValue; +import com.simibubi.create.Create; + +import net.minecraft.SharedConstants; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.level.saveddata.SavedData; +import net.minecraft.world.level.storage.DimensionDataStorage; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; + +import java.io.File; +import java.io.IOException; +import java.util.function.Function; + +@Mixin(DimensionDataStorage.class) +public abstract class DimensionDataStorageMixin { + @Shadow + @Final + private File dataFolder; + + @Shadow + public abstract CompoundTag readTagFromDisk(String pName, int pLevelVersion) throws IOException; + + @ModifyReturnValue(method = "readSavedData", at = @At(value = "TAIL")) + private T create$tryLoadingFromDatOldIfFailedToLoad(T original, Function loadFunction, String name) { + // Try loading old data if it's create's SavedData + if (original == null && name.startsWith("create_")) { + Create.LOGGER.info("Trying to restore {} from .dat_old", name); + try { + File oldFile = new File(dataFolder, name + ".dat_old"); + if (oldFile.exists()) { + CompoundTag compoundtag = readTagFromDisk(name, SharedConstants.getCurrentVersion().getDataVersion().getVersion()); + return loadFunction.apply(compoundtag.getCompound("data")); + } + } catch (Exception exception) { + Create.LOGGER.error("Error restoring from old saved data: {}", name, exception); + } + } else { + return original; + } + + return null; + } +} diff --git a/src/main/java/com/simibubi/create/foundation/utility/SavedDataUtil.java b/src/main/java/com/simibubi/create/foundation/utility/SavedDataUtil.java new file mode 100644 index 0000000000..ee00e33e74 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/SavedDataUtil.java @@ -0,0 +1,36 @@ +package com.simibubi.create.foundation.utility; + +import com.simibubi.create.Create; + +import net.minecraft.Util; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtIo; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.world.level.saveddata.SavedData; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Paths; + +public class SavedDataUtil { + public static void saveWithDatOld(T savedData, File file) { + if (savedData.isDirty()) { + CompoundTag compoundtag = new CompoundTag(); + compoundtag.put("data", savedData.save(new CompoundTag())); + NbtUtils.addCurrentDataVersion(compoundtag); + + String savedDataName = file.getName().split("\\.")[0]; + + try { + File temp = File.createTempFile(savedDataName, ".dat", file.getParentFile()); + NbtIo.writeCompressed(compoundtag, temp); + File oldFile = Paths.get(file.getParent(), savedDataName + ".dat_old").toFile(); + Util.safeReplaceFile(file, temp, oldFile); + } catch (IOException ioexception) { + Create.LOGGER.error("Could not save data {}", savedData, ioexception); + } + + savedData.setDirty(false); + } + } +} diff --git a/src/main/resources/create.mixins.json b/src/main/resources/create.mixins.json index 428ae98b5d..c8b9e4980d 100644 --- a/src/main/resources/create.mixins.json +++ b/src/main/resources/create.mixins.json @@ -11,6 +11,7 @@ "ClientboundMapItemDataPacketMixin", "ContraptionDriverInteractMixin", "CustomItemUseEffectsMixin", + "DimensionDataStorageMixin", "EntityMixin", "LavaSwimmingMixin", "MainMixin", From d8f6c396204de314a07fbae7f52278e454517d2e Mon Sep 17 00:00:00 2001 From: IThundxr Date: Thu, 2 Jan 2025 11:23:36 -0500 Subject: [PATCH 229/515] Heavy contraptions - Prevent contraptions from activating pressure plates and tripwires --- .../content/contraptions/AbstractContraptionEntity.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/com/simibubi/create/content/contraptions/AbstractContraptionEntity.java b/src/main/java/com/simibubi/create/content/contraptions/AbstractContraptionEntity.java index 29bb1d8258..6cbe09cf57 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/AbstractContraptionEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/AbstractContraptionEntity.java @@ -927,6 +927,12 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit // Contraptions no longer catch fire } + // Contraptions shouldn't activate pressure plates and tripwires + @Override + public boolean isIgnoringBlockTriggers() { + return true; + } + public boolean isReadyForRender() { return initialized; } From c4763fe60a3687e6311051ad29e7a0d7bfddb2fd Mon Sep 17 00:00:00 2001 From: Kryppers <65094918+Kryppers@users.noreply.github.com> Date: Thu, 2 Jan 2025 16:58:11 +0000 Subject: [PATCH 230/515] the price(tag) is right updated textures/models for price tag --- .../block/table_cloth/price_tag_side.json | 8 ++++---- .../models/block/table_cloth/price_tag_top.json | 8 ++++---- .../textures/block/table_cloth/price_tag.png | Bin 291 -> 474 bytes 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/resources/assets/create/models/block/table_cloth/price_tag_side.json b/src/main/resources/assets/create/models/block/table_cloth/price_tag_side.json index 92023a83f5..b1a7b5d4b6 100644 --- a/src/main/resources/assets/create/models/block/table_cloth/price_tag_side.json +++ b/src/main/resources/assets/create/models/block/table_cloth/price_tag_side.json @@ -7,12 +7,12 @@ }, "elements": [ { - "from": [1, -5.75, -1.25], + "from": [1, -6.75, -1.25], "to": [7, 1.25, 0.75], - "rotation": {"angle": 0, "axis": "y", "origin": [5, -0.75, -2.25]}, + "rotation": {"angle": 0, "axis": "y", "origin": [5, -1.75, -2.25]}, "faces": { - "north": {"uv": [0, 1, 6, 8], "texture": "#1"}, - "up": {"uv": [0, 0, 6, 2], "texture": "#1"} + "north": {"uv": [9, 2, 15, 10], "texture": "#1"}, + "up": {"uv": [9, 2, 15, 0], "texture": "#1"} } } ], diff --git a/src/main/resources/assets/create/models/block/table_cloth/price_tag_top.json b/src/main/resources/assets/create/models/block/table_cloth/price_tag_top.json index 4a1b50513d..991e48bb03 100644 --- a/src/main/resources/assets/create/models/block/table_cloth/price_tag_top.json +++ b/src/main/resources/assets/create/models/block/table_cloth/price_tag_top.json @@ -7,12 +7,12 @@ }, "elements": [ { - "from": [5, 0.25, -1.25], + "from": [5, -2.75, -1.25], "to": [11, 1.25, 4.75], - "rotation": {"angle": 0, "axis": "y", "origin": [5, 0.25, -1.25]}, + "rotation": {"angle": 0, "axis": "y", "origin": [5, -2.75, -1.25]}, "faces": { - "north": {"uv": [0, 1, 6, 2], "texture": "#1"}, - "up": {"uv": [0, 2, 6, 8], "texture": "#1"} + "north": {"uv": [0, 6, 6, 10], "texture": "#1"}, + "up": {"uv": [0, 6, 6, 0], "texture": "#1"} } } ], diff --git a/src/main/resources/assets/create/textures/block/table_cloth/price_tag.png b/src/main/resources/assets/create/textures/block/table_cloth/price_tag.png index 6300c1482cd8565b49bd189c24fa9ed5f58ef5fd..a1e55f381fae86e0d80016d956624772192cb394 100644 GIT binary patch delta 442 zcmV;r0Y(0!0@?$RDt}1;HUJgjoBWOd000SaNLh0L04^W^04^W_)f^rh00007bV*G` z2k8L<5F#k#*Gzi=00C!7L_t(I%k7XqOT$ncMNc%^govgnIMktoD1{0Ei-TDm+?|~Q z{RV>i0o1*_tK#G!I0%ABw??WI+eH*qTvC!qLSCd2hyKAxaesF3tndErJ6vh+U_Y6f zo&msbJIIPkM?~yy?@09cEhD#Ghn4ItIdey{D4^000SaNLh0L04^W^04^W_)f^rh00007bV*G` z2j~nJ5*r}12Q4H3006K_L_t(I%VSK=Nc+!#1i;;l{z_{=50jvf%**Xwq0L!%L zGZ<8rlu!h3-@C^^EMVd1<6{Vqj(`iid-IOr)zW1|8^8o(ta@C!g5m1r%S3DZ@#D?^ zA3xswhZ~@yr_FHX(p3gh0SnC8l9JL4l9JLyYyA4)Jj8&HpFT0{-nk1!^5dsZL>t7& zKqff5XT^V%KqMEikgM^<^%D#O>w@d2ZV#{v_FZ^J9TxxqXwy2+A*);M00000NkvXX Hu0mjfxdm~p From 6c112871d4d52449677f3f82bfabc4834e1b2a44 Mon Sep 17 00:00:00 2001 From: TropheusJ Date: Fri, 3 Jan 2025 05:31:36 -0500 Subject: [PATCH 231/515] most of the thing --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 752 +++++++++--------- .../fallback_mounted_storage_blacklist.json | 3 + .../tags/blocks/simple_mounted_storage.json | 24 + .../java/com/simibubi/create/AllBlocks.java | 5 +- .../create/AllMountedStorageTypes.java | 33 + .../java/com/simibubi/create/AllTags.java | 2 + src/main/java/com/simibubi/create/Create.java | 3 + .../storage/MountedStorageTypeRegistry.java | 26 + .../storage/item/MountedItemStorage.java | 119 +++ .../storage/item/MountedItemStorageType.java | 28 + .../item/MountedItemStorageWrapper.java | 17 + .../item/WrapperMountedItemStorage.java | 64 ++ .../item/chest/ChestMountedStorage.java | 54 ++ .../item/chest/ChestMountedStorageType.java | 17 + .../item/simple/SimpleMountedStorage.java | 73 ++ .../item/simple/SimpleMountedStorageType.java | 50 ++ .../content/contraptions/Contraption.java | 67 +- .../content/contraptions/MountedStorage.java | 220 ----- .../MountedStorageInteraction.java | 38 +- .../contraptions/MountedStorageManager.java | 381 +++++---- .../OrientedContraptionEntity.java | 10 +- .../PortableFluidInterfaceBlockEntity.java | 2 +- .../psi/PortableItemInterfaceBlockEntity.java | 2 +- .../roller/RollerMovementBehaviour.java | 4 +- .../bearing/BearingContraption.java | 4 +- .../behaviour/MovementBehaviour.java | 2 +- .../behaviour/MovementContext.java | 12 + .../dispenser/DispenserMovementBehaviour.java | 110 +-- .../dispenser/DropperMovementBehaviour.java | 164 ++-- .../MovedDefaultDispenseItemBehaviour.java | 22 +- .../storage/DispenserMountedStorage.java | 25 + .../storage/DispenserMountedStorageType.java | 17 + .../minecart/TrainCargoManager.java | 49 +- .../mounted/MountedContraption.java | 4 +- .../piston/PistonContraption.java | 4 +- .../equipment/toolbox/ToolboxInventory.java | 17 + .../toolbox/ToolboxMountedStorage.java | 55 ++ .../toolbox/ToolboxMountedStorageType.java | 22 + .../deployer/DeployerMovementBehaviour.java | 4 +- .../kinetics/saw/SawMovementBehaviour.java | 2 +- .../crate/CreativeCrateMountedStorage.java | 82 ++ .../CreativeCrateMountedStorageType.java | 28 + .../funnel/FunnelMovementBehaviour.java | 4 +- .../vault/ItemVaultMountedStorage.java | 49 ++ .../vault/ItemVaultMountedStorageType.java | 22 + .../content/trains/entity/Carriage.java | 2 +- .../trains/entity/CarriageContraption.java | 36 +- .../create/content/trains/entity/Train.java | 4 +- .../condition/ItemThresholdCondition.java | 2 +- .../content/trains/station/GlobalStation.java | 4 +- .../foundation/data/BuilderTransformers.java | 10 + .../create/foundation/item/ItemHelper.java | 17 +- .../create/foundation/item/ItemSlots.java | 113 +++ .../foundation/utility/CreateCodecs.java | 34 + .../storage/FallbackMountedStorageType.java | 34 + .../MountedStorageTypeRegistryImpl.java | 49 ++ .../data/CreateRegistrateTags.java | 10 + 57 files changed, 1897 insertions(+), 1110 deletions(-) create mode 100644 src/generated/resources/data/create/tags/blocks/fallback_mounted_storage_blacklist.json create mode 100644 src/generated/resources/data/create/tags/blocks/simple_mounted_storage.json create mode 100644 src/main/java/com/simibubi/create/AllMountedStorageTypes.java create mode 100644 src/main/java/com/simibubi/create/api/contraption/storage/MountedStorageTypeRegistry.java create mode 100644 src/main/java/com/simibubi/create/api/contraption/storage/item/MountedItemStorage.java create mode 100644 src/main/java/com/simibubi/create/api/contraption/storage/item/MountedItemStorageType.java create mode 100644 src/main/java/com/simibubi/create/api/contraption/storage/item/MountedItemStorageWrapper.java create mode 100644 src/main/java/com/simibubi/create/api/contraption/storage/item/WrapperMountedItemStorage.java create mode 100644 src/main/java/com/simibubi/create/api/contraption/storage/item/chest/ChestMountedStorage.java create mode 100644 src/main/java/com/simibubi/create/api/contraption/storage/item/chest/ChestMountedStorageType.java create mode 100644 src/main/java/com/simibubi/create/api/contraption/storage/item/simple/SimpleMountedStorage.java create mode 100644 src/main/java/com/simibubi/create/api/contraption/storage/item/simple/SimpleMountedStorageType.java delete mode 100644 src/main/java/com/simibubi/create/content/contraptions/MountedStorage.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/behaviour/dispenser/storage/DispenserMountedStorage.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/behaviour/dispenser/storage/DispenserMountedStorageType.java create mode 100644 src/main/java/com/simibubi/create/content/equipment/toolbox/ToolboxMountedStorage.java create mode 100644 src/main/java/com/simibubi/create/content/equipment/toolbox/ToolboxMountedStorageType.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/crate/CreativeCrateMountedStorage.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/crate/CreativeCrateMountedStorageType.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/vault/ItemVaultMountedStorage.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/vault/ItemVaultMountedStorageType.java create mode 100644 src/main/java/com/simibubi/create/foundation/item/ItemSlots.java create mode 100644 src/main/java/com/simibubi/create/foundation/utility/CreateCodecs.java create mode 100644 src/main/java/com/simibubi/create/impl/contraption/storage/FallbackMountedStorageType.java create mode 100644 src/main/java/com/simibubi/create/impl/contraption/storage/MountedStorageTypeRegistryImpl.java diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 85dd3fdf2b..416ce6d8be 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-12-28T14:25:56.9899499 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2025-01-03T04:59:28.154809229 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -83,13 +83,13 @@ b5170d754ce5f07ea2b4646eb07c099c50bae249 assets/create/blockstates/clipboard.jso f7254f20f91e2f1295e36d2e70390d43f3952d07 assets/create/blockstates/copper_door.json 736777de0eb038ff1ef9e8fe9d04c23d80239eda assets/create/blockstates/copper_ladder.json df3103dfc1c3ba7a9573229d009cb0de4925df16 assets/create/blockstates/copper_scaffolding.json -4d3d29e8a74bf103da39e76a1466b03eb5dcf916 assets/create/blockstates/copper_shingles.json 1ea8fdb990f8cda1762ab69ac38ea3161a835227 assets/create/blockstates/copper_shingle_slab.json 7c35bb802099d6bb5d92eafd8cbb7ea146979a2e assets/create/blockstates/copper_shingle_stairs.json +4d3d29e8a74bf103da39e76a1466b03eb5dcf916 assets/create/blockstates/copper_shingles.json 5c5ba06bf5b0a2c57d0aa42e85880f36d9694a78 assets/create/blockstates/copper_table_cloth.json -9a9f03140a57a7a8903d3e1b159bdc052566a6ec assets/create/blockstates/copper_tiles.json 7db7a0d81887091ca889f40bb8a508d3098c5164 assets/create/blockstates/copper_tile_slab.json c0b7eca017242913d156e4623147add0d03574f6 assets/create/blockstates/copper_tile_stairs.json +9a9f03140a57a7a8903d3e1b159bdc052566a6ec assets/create/blockstates/copper_tiles.json ef3ccb2d8b03f5a972b053a15bb037f8db6af17c assets/create/blockstates/copper_valve_handle.json 4758bed22fb6fe18213f463bc055775c1909e858 assets/create/blockstates/copycat_bars.json 4789c857508452aede1cb7389187b99ce2d7bf62 assets/create/blockstates/copycat_base.json @@ -106,114 +106,114 @@ c9a2c3a7971c46957d0f07c6d94d76f59da54a0b assets/create/blockstates/crushing_whee 4b0e51a1c10685f7d432467339afc9c2e24793b0 assets/create/blockstates/crushing_wheel_controller.json ba9c3ecfacbd398048440d247decffeaefc714b5 assets/create/blockstates/cuckoo_clock.json 1f6d84cba69062a1989d671c9c97317e2c2455b6 assets/create/blockstates/cut_andesite.json -cc62a6499ce8dcfc5e8695f0e8bb3c3d67f41efc assets/create/blockstates/cut_andesite_bricks.json 50d88f806122818af2ffecbd514d13ebbd21e4c9 assets/create/blockstates/cut_andesite_brick_slab.json 32d801225ea18209792921fa91618ed41794dbd0 assets/create/blockstates/cut_andesite_brick_stairs.json 3bf8204bf8c7c5b7b3c388fbc3478bb2d7c47129 assets/create/blockstates/cut_andesite_brick_wall.json +cc62a6499ce8dcfc5e8695f0e8bb3c3d67f41efc assets/create/blockstates/cut_andesite_bricks.json 34e89a828f14383c6115954a235b19851b74f277 assets/create/blockstates/cut_andesite_slab.json 49d58ae14544d89305ddc707cf7f6a81998200fa assets/create/blockstates/cut_andesite_stairs.json 1cc235cb6c388324793ac40f7bf89df8b048faac assets/create/blockstates/cut_andesite_wall.json 13ea54a4b9b89e576879a6e23a029c6341b7c098 assets/create/blockstates/cut_asurine.json -51c22c0547ab8ed2564890afb8733bbe356899f5 assets/create/blockstates/cut_asurine_bricks.json cf09de38f826fe000c5efe5afe56cf746125691d assets/create/blockstates/cut_asurine_brick_slab.json 1835482d5e9a59f2214336a63b12c7132ad815b4 assets/create/blockstates/cut_asurine_brick_stairs.json c48ab37bf7a2aba676af281d29cb6a2103c72fba assets/create/blockstates/cut_asurine_brick_wall.json +51c22c0547ab8ed2564890afb8733bbe356899f5 assets/create/blockstates/cut_asurine_bricks.json 1523a57124239a99da0b12a6b435c09d3d4276a5 assets/create/blockstates/cut_asurine_slab.json cc1acf5e118f1b1e78c5bb291176008960794d59 assets/create/blockstates/cut_asurine_stairs.json 139640bf41070e8eeb48647319eee54bb6804692 assets/create/blockstates/cut_asurine_wall.json 06b8c5cf98366608c480a37e6944d0d668bc8983 assets/create/blockstates/cut_calcite.json -979c70e35d806f1f63fe3381f27d881a17f9f6be assets/create/blockstates/cut_calcite_bricks.json a8f83cb8e1eae587f4e11e37c4cd3d0a1bbef377 assets/create/blockstates/cut_calcite_brick_slab.json 1eabb2e485aa323d317fa9648be02c12556593b7 assets/create/blockstates/cut_calcite_brick_stairs.json a0a33df71c5d26344a7bb0dd7a4622c30cc7825f assets/create/blockstates/cut_calcite_brick_wall.json +979c70e35d806f1f63fe3381f27d881a17f9f6be assets/create/blockstates/cut_calcite_bricks.json e3ddaae92b52cc3ea230088ff23260b5c5c93017 assets/create/blockstates/cut_calcite_slab.json 80c5249eaf9504c743c427fdd1a2c7bfa0f3d48f assets/create/blockstates/cut_calcite_stairs.json b4bbdb08d8114b6741546a0418cb54d645481c02 assets/create/blockstates/cut_calcite_wall.json 449f5180c72a028393afdac55a34e59862728224 assets/create/blockstates/cut_crimsite.json -25d731077a131d03347296c38c76b547194a6320 assets/create/blockstates/cut_crimsite_bricks.json d2c8a3580d3578c8afe44b94d4448be3680dbdeb assets/create/blockstates/cut_crimsite_brick_slab.json a3d9d2190a23b881dd3a7538ab248e0b0a3efa8e assets/create/blockstates/cut_crimsite_brick_stairs.json 3791c00ed477c0aaf7c5a20803a89dfc0e20f013 assets/create/blockstates/cut_crimsite_brick_wall.json +25d731077a131d03347296c38c76b547194a6320 assets/create/blockstates/cut_crimsite_bricks.json c9f19e7a976a7428b3dd58f45d734700ca1a18cd assets/create/blockstates/cut_crimsite_slab.json 1b8d4ac53dc5823083c2af605165a05b73c9ff79 assets/create/blockstates/cut_crimsite_stairs.json 484f9253ed92e963f398973a99fbeacb67ba1188 assets/create/blockstates/cut_crimsite_wall.json c4e95ceb7914da09ebe42d539bf5d976a3d70972 assets/create/blockstates/cut_deepslate.json -75d4ef863cd85d8f3df78226177966954e02ee2b assets/create/blockstates/cut_deepslate_bricks.json e1dc99a48b9066732fc5c62071c5ead16f34f438 assets/create/blockstates/cut_deepslate_brick_slab.json dbb2eddaf1d4ae3e687beb611552ea4283a1e7d8 assets/create/blockstates/cut_deepslate_brick_stairs.json 91c1f3da848503067c64b966ddda22ab91ff8fd5 assets/create/blockstates/cut_deepslate_brick_wall.json +75d4ef863cd85d8f3df78226177966954e02ee2b assets/create/blockstates/cut_deepslate_bricks.json 593198ffd37eae124a8366ae1d4a40b682788f92 assets/create/blockstates/cut_deepslate_slab.json f8cd1f9002ed8593ab71af9cfb7f962625994108 assets/create/blockstates/cut_deepslate_stairs.json c2d8060a0c830e5b8bbb084457083324b5b6f4c9 assets/create/blockstates/cut_deepslate_wall.json aaa6ac5f4fc399c4b03a7f8de856fa7aae97e049 assets/create/blockstates/cut_diorite.json -08b6289ca8b4193c87324ca23ca081e8773fb223 assets/create/blockstates/cut_diorite_bricks.json 423f809f06fa3fd96643f068ba0d3520269b3844 assets/create/blockstates/cut_diorite_brick_slab.json 9011fb92f57e7695c4484c923dd40ecd749ff307 assets/create/blockstates/cut_diorite_brick_stairs.json 41bad89777a33737bc0365ce2c7ffc20720f9620 assets/create/blockstates/cut_diorite_brick_wall.json +08b6289ca8b4193c87324ca23ca081e8773fb223 assets/create/blockstates/cut_diorite_bricks.json b03e7cf494c53c6f24ba93d0ef531e839026932b assets/create/blockstates/cut_diorite_slab.json 95c8094204979acfb0e59c2826003e0274a02fe5 assets/create/blockstates/cut_diorite_stairs.json e2f163d36dd5d03c0741dd2e87d8f77a0c86ae00 assets/create/blockstates/cut_diorite_wall.json f42ca2ce8e8f657c64376759413ec611f8045531 assets/create/blockstates/cut_dripstone.json -2d696162b2085c3d5723308a8d1ccafb29660f01 assets/create/blockstates/cut_dripstone_bricks.json 9310a800fb091014e7c0a220f5f2511c1de379ad assets/create/blockstates/cut_dripstone_brick_slab.json 3ff2f65dafcb4654b99e0d65b7e851760f9a4075 assets/create/blockstates/cut_dripstone_brick_stairs.json cafc956d8dc2053e5a0e8437c4ccde7fa24fc17e assets/create/blockstates/cut_dripstone_brick_wall.json +2d696162b2085c3d5723308a8d1ccafb29660f01 assets/create/blockstates/cut_dripstone_bricks.json 9cb32af3b952b841e9da94789da17cd274c3cfb9 assets/create/blockstates/cut_dripstone_slab.json da0300f54bdfcc705beb8d84f26406be660de5de assets/create/blockstates/cut_dripstone_stairs.json 83ff3eaeb481202c77e6dbdc442b4dd195ca568c assets/create/blockstates/cut_dripstone_wall.json bf501250fd2226838afe0baf68db08cd832e3c4f assets/create/blockstates/cut_granite.json -5c029d7ec837b3239d17ab91a70f025df1bfb124 assets/create/blockstates/cut_granite_bricks.json 773717bd5c140cf025f463c99c67efb9d27bd696 assets/create/blockstates/cut_granite_brick_slab.json 97d20b21e5b7f329c1b21b436fd0bdcaa8d173d0 assets/create/blockstates/cut_granite_brick_stairs.json 5e4175b6c89039ded48937ad1cd13d3bb2d2992a assets/create/blockstates/cut_granite_brick_wall.json +5c029d7ec837b3239d17ab91a70f025df1bfb124 assets/create/blockstates/cut_granite_bricks.json 42549436ce26ad7b44f2e1cba54357b3f25bcb18 assets/create/blockstates/cut_granite_slab.json e9d8fd028d8092e5fa0fd13cd638516f57a22d53 assets/create/blockstates/cut_granite_stairs.json 2daab523202dd2e31daeaf3b9a04cde2a7da4ca5 assets/create/blockstates/cut_granite_wall.json 0652c8b9c41acc1a8da901bd7b8b6018b3581d5b assets/create/blockstates/cut_limestone.json -508ee569f313b7e804f6268ca86f5a61851563ec assets/create/blockstates/cut_limestone_bricks.json 4efbeb34c96918e9b48dc484a82b1ef4811ed39d assets/create/blockstates/cut_limestone_brick_slab.json 11b99cf9b33d7f8de9d11cc1e405e2681682ba32 assets/create/blockstates/cut_limestone_brick_stairs.json b6c02a9e9e47a8e521a54ef9488259267068f032 assets/create/blockstates/cut_limestone_brick_wall.json +508ee569f313b7e804f6268ca86f5a61851563ec assets/create/blockstates/cut_limestone_bricks.json fb63a2581211fe62344985a06feec9dcec4b1888 assets/create/blockstates/cut_limestone_slab.json ffcca1e66718f3e78e544b5fa9954a852c095e91 assets/create/blockstates/cut_limestone_stairs.json a1a90f84b47f96b4384fc2d60bfc48ddbb5ed179 assets/create/blockstates/cut_limestone_wall.json 1b7a133518780d4f49474a70e7f6263d6e88ff51 assets/create/blockstates/cut_ochrum.json -6f37e5e2dca3b443951131cb82c15a981a4e2005 assets/create/blockstates/cut_ochrum_bricks.json f1e9d54a6f9f41b968f117a7be711011effa71a5 assets/create/blockstates/cut_ochrum_brick_slab.json 8d334e026e94b304a1ff1ee96097f434b50175f2 assets/create/blockstates/cut_ochrum_brick_stairs.json e92c026ee7ab2aa35003ad475bef3d6c0e29818c assets/create/blockstates/cut_ochrum_brick_wall.json +6f37e5e2dca3b443951131cb82c15a981a4e2005 assets/create/blockstates/cut_ochrum_bricks.json 5a61edb7d146e83d951795fae33dc306e71b2cb6 assets/create/blockstates/cut_ochrum_slab.json b31944bf6297685acd37631083dde0889c08ede7 assets/create/blockstates/cut_ochrum_stairs.json df33a8af1dc8cb08ddcfd22a50a305499479a4dd assets/create/blockstates/cut_ochrum_wall.json 1606d7481e56755f07e9331cf85a8d7cc9aace9a assets/create/blockstates/cut_scorchia.json -bc2a0e7f11400b8c2a03071be87dadb5edc097de assets/create/blockstates/cut_scorchia_bricks.json 43db25ebac2f5bcaa7ca9cfb6da8fcb20fad8269 assets/create/blockstates/cut_scorchia_brick_slab.json 7a80620590ba5e61967c5168f5c67ecabf09dc00 assets/create/blockstates/cut_scorchia_brick_stairs.json e4eb79360a41bb1a7ca835d61446ea5166e4cda8 assets/create/blockstates/cut_scorchia_brick_wall.json +bc2a0e7f11400b8c2a03071be87dadb5edc097de assets/create/blockstates/cut_scorchia_bricks.json c0d262f54e3b2fce8bc941a2a6df71db5f0229ea assets/create/blockstates/cut_scorchia_slab.json de2e918058e9dd7eafd085a8dec634f6a2832c21 assets/create/blockstates/cut_scorchia_stairs.json 5d2d06799b82449754f62b1d80b9ee9a24c65bad assets/create/blockstates/cut_scorchia_wall.json 76ea4f3438a3effedfc93d2bbabac0899610cd28 assets/create/blockstates/cut_scoria.json -6d9c79e1b71656a73bb69e2a9b100be59084dd2e assets/create/blockstates/cut_scoria_bricks.json 7c7dcd1fe82f3673910620c2eefebad5d0029cdf assets/create/blockstates/cut_scoria_brick_slab.json d535b387bf0a6f9e124eed8b76d899e13699bca9 assets/create/blockstates/cut_scoria_brick_stairs.json c426e1b5e4c77c25cd0d16d10fba0e0731673dd1 assets/create/blockstates/cut_scoria_brick_wall.json +6d9c79e1b71656a73bb69e2a9b100be59084dd2e assets/create/blockstates/cut_scoria_bricks.json fb692494c88358d4d8e687b216f729d6b6bd7174 assets/create/blockstates/cut_scoria_slab.json 950f43bae8f4e3220103ce0c62f444856129ca12 assets/create/blockstates/cut_scoria_stairs.json 01350030831c5b9edef0dc2c778b92f1ebc2b2fc assets/create/blockstates/cut_scoria_wall.json c0c1c4d44eba5babe9703eca31f0279ebd11ed8e assets/create/blockstates/cut_tuff.json -9bddef4a2b4a338c15f03e2397c4cd4c3ae9e5d9 assets/create/blockstates/cut_tuff_bricks.json 11306e83915e0106d48f890df3212c3a47443a08 assets/create/blockstates/cut_tuff_brick_slab.json e8951d94e0d3228700bcb56819928f1c179c3973 assets/create/blockstates/cut_tuff_brick_stairs.json 619340b7cf014cfb72a4b5440b90881535f16108 assets/create/blockstates/cut_tuff_brick_wall.json +9bddef4a2b4a338c15f03e2397c4cd4c3ae9e5d9 assets/create/blockstates/cut_tuff_bricks.json 3577e3f4933ea8cb7464c28e80867ce84917898d assets/create/blockstates/cut_tuff_slab.json 5673fdb02439d622c56dc0ff47a0dca98dc6d027 assets/create/blockstates/cut_tuff_stairs.json 12a46ee82536665400ec2f3befed3be58325d5c6 assets/create/blockstates/cut_tuff_wall.json beb9e47f8d811c2146f68daf992fb805342a65cb assets/create/blockstates/cut_veridium.json -04d07986eb86ffd66baaaf9b65e02d00022e98e2 assets/create/blockstates/cut_veridium_bricks.json 952543c03e730443d85059ec43642efb089485e7 assets/create/blockstates/cut_veridium_brick_slab.json 6a033e7b5a0b26cce5956c6c7c1eff558f866cb5 assets/create/blockstates/cut_veridium_brick_stairs.json 43689138c8018b3ee9f35a11870887e9df3c8fe5 assets/create/blockstates/cut_veridium_brick_wall.json +04d07986eb86ffd66baaaf9b65e02d00022e98e2 assets/create/blockstates/cut_veridium_bricks.json 212d8ee5dfa78802b9539640cf8b263fd5880b87 assets/create/blockstates/cut_veridium_slab.json c11f09df4a23e951bdf9a345515183f4fac7cde3 assets/create/blockstates/cut_veridium_stairs.json 3aa6f5e613ff73952e3de00408051f92316e7f81 assets/create/blockstates/cut_veridium_wall.json @@ -241,12 +241,12 @@ f7f5df9086c71688cbdb5d05c394dc5acb8fb338 assets/create/blockstates/elevator_cont d47bc65703e9582cc710e6408fb565e16d3514a6 assets/create/blockstates/encased_fan.json 651f9fdb11f56d887d131be8f936f508d0b2fc1d assets/create/blockstates/encased_fluid_pipe.json 489ad4daeaed702d231a3f175f7b66846f5789a6 assets/create/blockstates/experience_block.json -5f6c60a30889b043709066707e80a21081d98155 assets/create/blockstates/exposed_copper_shingles.json 74c8a72db3dd3fa919e29baaa8c5865f13490461 assets/create/blockstates/exposed_copper_shingle_slab.json 4e0b5a9be15f0c2861f5f6bd71bd9c2a4db2a21d assets/create/blockstates/exposed_copper_shingle_stairs.json -5299b4f7b9b3490872e8c26a6b212e14dd05fd9a assets/create/blockstates/exposed_copper_tiles.json +5f6c60a30889b043709066707e80a21081d98155 assets/create/blockstates/exposed_copper_shingles.json 6ee73ff3608d51fdad6e9810feee66ed1773b81c assets/create/blockstates/exposed_copper_tile_slab.json f93e4059876bfc6d70b9fa2bc24d8e3d6943d56f assets/create/blockstates/exposed_copper_tile_stairs.json +5299b4f7b9b3490872e8c26a6b212e14dd05fd9a assets/create/blockstates/exposed_copper_tiles.json 4b30365ed77db9c5754eeda5fee81d47b568b946 assets/create/blockstates/factory_gauge.json f1a03ede031d8c4e33a4d07c529e71936da9dc6d assets/create/blockstates/fake_track.json 21fa4a1bf4ee851e090a21c97c9a38d18cfddf0d assets/create/blockstates/fluid_pipe.json @@ -323,8 +323,6 @@ fa5fb2be73c7c54b70e927b66adf3f4d64c5cb6b assets/create/blockstates/light_gray_ni f1901887cd166296e465133c3b0d7ad0d664a614 assets/create/blockstates/light_gray_table_cloth.json 35b151db396069b146d223fbe46be5b0c3dda8a9 assets/create/blockstates/light_gray_toolbox.json 894827ffd176bc733abecf18d96888e9ed5a3eb4 assets/create/blockstates/light_gray_valve_handle.json -a6f319c803c03e34bbf841ea52d82f0f7ec7a413 assets/create/blockstates/limestone.json -7ff65e1c4c8e48a0b694cd17506a192e6a7e6e44 assets/create/blockstates/limestone_pillar.json 7f20b548dd535942b2d6f41c39de7ad4fafe637e assets/create/blockstates/lime_nixie_tube.json c6ac740bf37477ad170576983230b130ac01f355 assets/create/blockstates/lime_postbox.json ad1ec304729fd6d336c0d4d0c27c9345af636695 assets/create/blockstates/lime_sail.json @@ -332,6 +330,8 @@ b9934a558e1b495403dc2c71ffb43cce7d396013 assets/create/blockstates/lime_seat.jso 7c5dc2ffd0bd44ba8785b6a788030714a009bcbc assets/create/blockstates/lime_table_cloth.json 49a02f7fc16697ba1cf16cee7e45ab6bfd8b06ce assets/create/blockstates/lime_toolbox.json ba181485f219d3ae23509a7edf28e25d9edb10f4 assets/create/blockstates/lime_valve_handle.json +a6f319c803c03e34bbf841ea52d82f0f7ec7a413 assets/create/blockstates/limestone.json +7ff65e1c4c8e48a0b694cd17506a192e6a7e6e44 assets/create/blockstates/limestone_pillar.json 654e845cebed82b7afbcf81380921e0a475b01e9 assets/create/blockstates/linear_chassis.json e195e82e4d0c1fc20474535bc9068cbb77a5e175 assets/create/blockstates/lit_blaze_burner.json 296186b196af94e1ab3f7e8a3254f6d31ae47a5c assets/create/blockstates/magenta_nixie_tube.json @@ -377,14 +377,14 @@ aab812cecf7d10d4e7587f4dead8a98238a15f41 assets/create/blockstates/orange_seat.j 2af63a4768f84fc93c7e7d67fa9a64438433e59f assets/create/blockstates/orange_valve_handle.json 515ed7dae09b052f289419ba09998a23e0d7083d assets/create/blockstates/ornate_iron_window.json 8118444f37536b9104ef4818d374b0c8a7c987bf assets/create/blockstates/ornate_iron_window_pane.json -97cd78453af94f44cef1187988966626574b29d5 assets/create/blockstates/oxidized_copper_shingles.json 2ddc762b8d8558e69a2f81c028702f3a25b5e978 assets/create/blockstates/oxidized_copper_shingle_slab.json ac536ae742c12e97bfd0b2483c87ff29f3935eaf assets/create/blockstates/oxidized_copper_shingle_stairs.json -110a6c19bcc9f044e5e982ac6e4b295b03ec0145 assets/create/blockstates/oxidized_copper_tiles.json +97cd78453af94f44cef1187988966626574b29d5 assets/create/blockstates/oxidized_copper_shingles.json 3f3924f0f0e368edfa04f4fdd6d6c2319276ddfe assets/create/blockstates/oxidized_copper_tile_slab.json 5e634cfb9abb06d8b29f39d751fc56b28ea5a9cd assets/create/blockstates/oxidized_copper_tile_stairs.json -65f3fa5a068189c1c2971af1a1052f69c0e26005 assets/create/blockstates/packager.json +110a6c19bcc9f044e5e982ac6e4b295b03ec0145 assets/create/blockstates/oxidized_copper_tiles.json 887565a0f89f089d6be888c87394dde4878afda7 assets/create/blockstates/package_frogport.json +65f3fa5a068189c1c2971af1a1052f69c0e26005 assets/create/blockstates/packager.json 36742cc6ce052ead143366d31b11e828a525c1b8 assets/create/blockstates/peculiar_bell.json 53d102e706d53cb2c0dbc0bc11da828084a43519 assets/create/blockstates/pink_nixie_tube.json db7ef5acb1ce2d3b8f881f34b5d9f40633c3973d assets/create/blockstates/pink_postbox.json @@ -470,9 +470,6 @@ a4b6bd4e55cd292abf752efeda93cf8d23162657 assets/create/blockstates/purple_table_ 3aca01f2eddb22adb1b25735b98a990bfc7220d2 assets/create/blockstates/radial_chassis.json 72faac9777be540f95f8b662a833856e0e1b8f35 assets/create/blockstates/railway_casing.json 7ce346fa18702f6fe6e2a939efcfa26eda63fe38 assets/create/blockstates/raw_zinc_block.json -ec546afd3ec8036e4393b97d535f05a86f57dbc1 assets/create/blockstates/redstone_contact.json -ff205f032b36486753dddb1f2029ef8d53e9c86f assets/create/blockstates/redstone_link.json -e4c645b199a2d7e89c91065071a0a91df5ca8e3c assets/create/blockstates/redstone_requester.json e3fd62e466e3e6e7bd6fc8661f764ba972a466fc assets/create/blockstates/red_nixie_tube.json d14d6437a6727da13cea5f7eeb815720c80dde6f assets/create/blockstates/red_postbox.json 4c36b562da58ef2af57009da7cf2426059249228 assets/create/blockstates/red_sail.json @@ -480,6 +477,9 @@ d14d6437a6727da13cea5f7eeb815720c80dde6f assets/create/blockstates/red_postbox.j 90bf31515faa2e7e6d73414a6c5498911910710e assets/create/blockstates/red_table_cloth.json 380f46b7cb72b13c0f16fd4a4287a1a33adeff41 assets/create/blockstates/red_toolbox.json b689d87a27ed0cb2cab190a2ad2b599818bff56c assets/create/blockstates/red_valve_handle.json +ec546afd3ec8036e4393b97d535f05a86f57dbc1 assets/create/blockstates/redstone_contact.json +ff205f032b36486753dddb1f2029ef8d53e9c86f assets/create/blockstates/redstone_link.json +e4c645b199a2d7e89c91065071a0a91df5ca8e3c assets/create/blockstates/redstone_requester.json 87ab7ca62ecf24d60d7e5c61bd5af97714dad0ad assets/create/blockstates/refined_radiance_casing.json 64a5b256e5af2dc8cb7ed77f0feadcf5134f7335 assets/create/blockstates/repackager.json 3807bcc6ccc3dad0dbfcc8fcf260a361aa488659 assets/create/blockstates/rope.json @@ -489,8 +489,8 @@ dd63fd8443a2be507281548df838d878b0c3c8c8 assets/create/blockstates/rose_quartz_l dfe69ee57f832a2e4c576ee01bdde1617c81e46a assets/create/blockstates/rose_quartz_tiles.json b9cbbc7c4e1d9abd312263a9a270315bd5f0106b assets/create/blockstates/rotation_speed_controller.json 5a25ecb95b7978cc487491cb24478e4d6a73e977 assets/create/blockstates/sail_frame.json -bff758cc56bece375b40c32067b903b675065328 assets/create/blockstates/schematicannon.json 505510656c77d93ecd3691e7111615193275f29e assets/create/blockstates/schematic_table.json +bff758cc56bece375b40c32067b903b675065328 assets/create/blockstates/schematicannon.json 82c9ceb19cfc4e247fbb62a9605630ba08423efe assets/create/blockstates/scorchia.json 6fa99d5f1ff05153660f9917286d4b157eaa1b40 assets/create/blockstates/scorchia_pillar.json 8c34743564aa0473745ecec304a19e15e9e87cf2 assets/create/blockstates/scoria.json @@ -499,64 +499,64 @@ e5aff9dc8fa5e98b060232974194afb06d497d09 assets/create/blockstates/scoria_pillar 3343224d6da4e75f0bc7a7634ba010a4ba54ad70 assets/create/blockstates/sequenced_gearshift.json 4c261d54117ee295b307f6ea3e56a09437631f73 assets/create/blockstates/shadow_steel_casing.json 4c67d2a1a1faea5be2a81ebc0722c32d8e2e84d6 assets/create/blockstates/shaft.json -c606f103619088e8a5afe969ba54929af480a3d2 assets/create/blockstates/small_andesite_bricks.json c5469de5957d77fc11febaa658ee2bfb0d11b0bc assets/create/blockstates/small_andesite_brick_slab.json ed0bcfd07959aa208085910bd3780756979c985d assets/create/blockstates/small_andesite_brick_stairs.json 78e30e63adedf1ca95261eb4010a1db45aecfe9e assets/create/blockstates/small_andesite_brick_wall.json -b9fedc13dc8cb53a8bb16ce2257ea65f0ac94a6b assets/create/blockstates/small_asurine_bricks.json +c606f103619088e8a5afe969ba54929af480a3d2 assets/create/blockstates/small_andesite_bricks.json 653fa70f0aa7fc319d50f72692d507ff7c59c0f4 assets/create/blockstates/small_asurine_brick_slab.json e61a0b891729565434d6ab34aa3aeada7d189f9d assets/create/blockstates/small_asurine_brick_stairs.json 02556b916c198c683279eb4392ebaa31fb41e182 assets/create/blockstates/small_asurine_brick_wall.json +b9fedc13dc8cb53a8bb16ce2257ea65f0ac94a6b assets/create/blockstates/small_asurine_bricks.json e986248237013eea755bccd300f745e44d0a183f assets/create/blockstates/small_bogey.json -031d9492dbcc5de77431e8f54b9b04db412b5690 assets/create/blockstates/small_calcite_bricks.json 898bca10ff6e5402c4b8b84e1b9ba9036b32b8bc assets/create/blockstates/small_calcite_brick_slab.json ecc2276bdb2b24f54e31372bf207171a348e55d3 assets/create/blockstates/small_calcite_brick_stairs.json d9dd243b5b754a487755b53609d404ac1b3fde99 assets/create/blockstates/small_calcite_brick_wall.json -3d4e0b54ffda83f7f6e08b6a745db81049d95f3b assets/create/blockstates/small_crimsite_bricks.json +031d9492dbcc5de77431e8f54b9b04db412b5690 assets/create/blockstates/small_calcite_bricks.json 4094bf00cad8dea2dd234866b482c07175802c4c assets/create/blockstates/small_crimsite_brick_slab.json 7f73a2505e2a3a98a7749fa98f4623aa2d216edd assets/create/blockstates/small_crimsite_brick_stairs.json b477c7f1855c9eb2ef1bf672376e972678dc563f assets/create/blockstates/small_crimsite_brick_wall.json -17359d1b87399bb066cfc23002bcf0d8f71d8ccd assets/create/blockstates/small_deepslate_bricks.json +3d4e0b54ffda83f7f6e08b6a745db81049d95f3b assets/create/blockstates/small_crimsite_bricks.json c67f32adc49f0b24b34f098a390a398813365260 assets/create/blockstates/small_deepslate_brick_slab.json d05aed31d45ed12f8f117a9c64312b1abff8bd2f assets/create/blockstates/small_deepslate_brick_stairs.json 6952b02d8c5adf3d0d1a243221b637c50edaa287 assets/create/blockstates/small_deepslate_brick_wall.json -6c0ac59e09feb76afc078a88431442a2a6381c6c assets/create/blockstates/small_diorite_bricks.json +17359d1b87399bb066cfc23002bcf0d8f71d8ccd assets/create/blockstates/small_deepslate_bricks.json ee39994b434a17ec7497b271a6e0a006cf6311cb assets/create/blockstates/small_diorite_brick_slab.json eb335cf0a857299b9cd0c4f60e00bc8e4ca7efe8 assets/create/blockstates/small_diorite_brick_stairs.json b6f7c563c30483c749849899b96d4f0030b71df1 assets/create/blockstates/small_diorite_brick_wall.json -d51095bfb9d5758f8b3972a973fbe282569b0234 assets/create/blockstates/small_dripstone_bricks.json +6c0ac59e09feb76afc078a88431442a2a6381c6c assets/create/blockstates/small_diorite_bricks.json 3d8109d327099c65ca0fafcb5651051059cad1df assets/create/blockstates/small_dripstone_brick_slab.json 3931e24229db79115ffe2a9f3a069202b9b8dcab assets/create/blockstates/small_dripstone_brick_stairs.json 0d16cefcb8e619bc81ef65111d16d331db58d0aa assets/create/blockstates/small_dripstone_brick_wall.json -11dcaf8a6da96d178024b4c3ee76b9c373e5d082 assets/create/blockstates/small_granite_bricks.json +d51095bfb9d5758f8b3972a973fbe282569b0234 assets/create/blockstates/small_dripstone_bricks.json 096b064f28fbe381e1b637d4668550851cbbb2c2 assets/create/blockstates/small_granite_brick_slab.json e99cc3251937fbf9fc858623d5ea525ed5b79704 assets/create/blockstates/small_granite_brick_stairs.json 62f2b570ac6073c8a98369523095d2c18a353eed assets/create/blockstates/small_granite_brick_wall.json -346dbff9a84b988bd9c9af670b486b6af5e18179 assets/create/blockstates/small_limestone_bricks.json +11dcaf8a6da96d178024b4c3ee76b9c373e5d082 assets/create/blockstates/small_granite_bricks.json d640eed81abaa013ed1c53d68a552f639168ae8b assets/create/blockstates/small_limestone_brick_slab.json d470967200aa6ca618421cf375140b352c45cc90 assets/create/blockstates/small_limestone_brick_stairs.json 8d4a1eff66a3f45d595ff8371c0d1ebaa0ba1773 assets/create/blockstates/small_limestone_brick_wall.json -1464b01d4c8bd9ec56460c1250fd4bb07e936e22 assets/create/blockstates/small_ochrum_bricks.json +346dbff9a84b988bd9c9af670b486b6af5e18179 assets/create/blockstates/small_limestone_bricks.json ddee92141e00898e8d70145cf00c0d64f56b4f48 assets/create/blockstates/small_ochrum_brick_slab.json bad9a5820c64c125494c0eba4f6c7ebebe93341c assets/create/blockstates/small_ochrum_brick_stairs.json ed899a18522adc70ae46185c308904c8de5b5834 assets/create/blockstates/small_ochrum_brick_wall.json +1464b01d4c8bd9ec56460c1250fd4bb07e936e22 assets/create/blockstates/small_ochrum_bricks.json c520e9ba54ff6dfb96f7863bb093cdf15cc95ce4 assets/create/blockstates/small_rose_quartz_tiles.json -371ff795eb4e7cb1220d307abf8cb003f455cbec assets/create/blockstates/small_scorchia_bricks.json 384a1331b92b7beba988f729bb7cda42abec0172 assets/create/blockstates/small_scorchia_brick_slab.json 046a84030a23f5a40f4deac13f2e60ced436cadf assets/create/blockstates/small_scorchia_brick_stairs.json 58bc6e3bb10ed72b8cb5813a88cab300d1183b7d assets/create/blockstates/small_scorchia_brick_wall.json -0aa51dbfda8349b878e2f6c9bb3314fcfc1a9c39 assets/create/blockstates/small_scoria_bricks.json +371ff795eb4e7cb1220d307abf8cb003f455cbec assets/create/blockstates/small_scorchia_bricks.json 5b227400e588abae33c1682196f098adc8006d13 assets/create/blockstates/small_scoria_brick_slab.json 51420bb12b757d3888fd1ceb5c21d83b42bd2266 assets/create/blockstates/small_scoria_brick_stairs.json 36e9bd161fa4ffe18f07153b2945cfeae55e7c0b assets/create/blockstates/small_scoria_brick_wall.json -c1f9f986dd0bfdbdee210c6c7d71981b251c27db assets/create/blockstates/small_tuff_bricks.json +0aa51dbfda8349b878e2f6c9bb3314fcfc1a9c39 assets/create/blockstates/small_scoria_bricks.json 8d1af444031291fe58d850ae344aaf7e97b8bd87 assets/create/blockstates/small_tuff_brick_slab.json 26879e6cadf0035c3eed4b54b3a1fdc0c080a485 assets/create/blockstates/small_tuff_brick_stairs.json 5d58ca7b81ae537454c3cdbb5fc8aacca83cff3f assets/create/blockstates/small_tuff_brick_wall.json -ad79aa8ff306695f65386fdeb44c5285547934b6 assets/create/blockstates/small_veridium_bricks.json +c1f9f986dd0bfdbdee210c6c7d71981b251c27db assets/create/blockstates/small_tuff_bricks.json 6226471fdcadbbf0e02704bb0e7de607e99302a8 assets/create/blockstates/small_veridium_brick_slab.json b54200ebe65c4ad2e5661c81ba5bf939039277ca assets/create/blockstates/small_veridium_brick_stairs.json 0237d58443ca9dc2a9186c2387dd6633702a7598 assets/create/blockstates/small_veridium_brick_wall.json +ad79aa8ff306695f65386fdeb44c5285547934b6 assets/create/blockstates/small_veridium_bricks.json 4d987859e5f5a930c20e955919304088fb6fc6d1 assets/create/blockstates/smart_chute.json 57fc35b2e0ae9ab16c011abd95f507910c70a234 assets/create/blockstates/smart_fluid_pipe.json a70c025de5d85180f371ff05bbdc531d8bdfaab1 assets/create/blockstates/speedometer.json @@ -568,9 +568,9 @@ a60c9c8241e40c2e28f5760c0ca6e80cfe9d59f3 assets/create/blockstates/steam_whistle 636ec6c7e1ef3b737edc716200f138bc63681d78 assets/create/blockstates/steam_whistle_extension.json 8865500bcd2e4d467e74edb3509850fa92a5809f assets/create/blockstates/sticker.json bed0534e618105184bc877b104230403ca85bb58 assets/create/blockstates/sticky_mechanical_piston.json -c7c17ff17b98ce85d355f2f9b4509271bc283843 assets/create/blockstates/stockpile_switch.json 2d66ca4b6916eac170b3b8552705b699f569bae2 assets/create/blockstates/stock_link.json 9989bda294fbffc5f659d2e608e01dea424c7694 assets/create/blockstates/stock_ticker.json +c7c17ff17b98ce85d355f2f9b4509271bc283843 assets/create/blockstates/stockpile_switch.json a70c025de5d85180f371ff05bbdc531d8bdfaab1 assets/create/blockstates/stressometer.json 8086f80c532fad42b37fcdc590b890ed7e8c3fe9 assets/create/blockstates/tiled_glass.json 1143ab7223c655764a81ed72ac385ea179664072 assets/create/blockstates/tiled_glass_pane.json @@ -590,36 +590,36 @@ bfb2b7eabba2e7aef4d783328c8a5a1558e7e493 assets/create/blockstates/turntable.jso 116d0a8fb72bcc00bd511db7893ea3e96efda297 assets/create/blockstates/warped_window_pane.json fa3d300520e3bedb926696d9980cbeeb54cfdc68 assets/create/blockstates/water_wheel.json 3dff9e1ec59415779195d2abfa9f07bc17b428a1 assets/create/blockstates/water_wheel_structure.json -2ae175c489b86b78b4646306250ca2dba66b0a5e assets/create/blockstates/waxed_copper_shingles.json 85ed36dcb0a3542e0638601116360202a9670d53 assets/create/blockstates/waxed_copper_shingle_slab.json aaf49f1b6785e2195c5dc2e8792c99c960745f89 assets/create/blockstates/waxed_copper_shingle_stairs.json -835bfe0d2137ad60e5f8322fa4449d5c7a02187f assets/create/blockstates/waxed_copper_tiles.json +2ae175c489b86b78b4646306250ca2dba66b0a5e assets/create/blockstates/waxed_copper_shingles.json b52eda74c9000507a4f34e10fbd1a7846b66c16d assets/create/blockstates/waxed_copper_tile_slab.json 5428969f6f27213d0ec5140d911b3844b5332006 assets/create/blockstates/waxed_copper_tile_stairs.json -306b9cd1efe3abd1fcca11bc464560837fb8fdfa assets/create/blockstates/waxed_exposed_copper_shingles.json +835bfe0d2137ad60e5f8322fa4449d5c7a02187f assets/create/blockstates/waxed_copper_tiles.json bc8f3bb75bdb094c8372d61a68927270d3347437 assets/create/blockstates/waxed_exposed_copper_shingle_slab.json 32382e5f524b50393080fdbd2415a98ddb700c9c assets/create/blockstates/waxed_exposed_copper_shingle_stairs.json -ae92a9051f1603e7ad4f93cb668706ccffc7a85b assets/create/blockstates/waxed_exposed_copper_tiles.json +306b9cd1efe3abd1fcca11bc464560837fb8fdfa assets/create/blockstates/waxed_exposed_copper_shingles.json ca37c3e54d5c78a77fcb4a4aca004a34e271f246 assets/create/blockstates/waxed_exposed_copper_tile_slab.json a864f82ccd6b3e0fa181c800da886ebd3239fb82 assets/create/blockstates/waxed_exposed_copper_tile_stairs.json -729ca65a140b3d7571a2072f7406cc5f4a2e27c5 assets/create/blockstates/waxed_oxidized_copper_shingles.json +ae92a9051f1603e7ad4f93cb668706ccffc7a85b assets/create/blockstates/waxed_exposed_copper_tiles.json ef99e849f9dd6ad53ddf04625c81750f11eaae1c assets/create/blockstates/waxed_oxidized_copper_shingle_slab.json 9386068220f9bb5d2f6d3cc408dc4f78f26b4eeb assets/create/blockstates/waxed_oxidized_copper_shingle_stairs.json -17acf3486e92aabc3efbe99fa1e5d7d664e6ec97 assets/create/blockstates/waxed_oxidized_copper_tiles.json +729ca65a140b3d7571a2072f7406cc5f4a2e27c5 assets/create/blockstates/waxed_oxidized_copper_shingles.json fe79f7eab017d714c0331664a3a2b5579104194e assets/create/blockstates/waxed_oxidized_copper_tile_slab.json 10bbe77a0334b5578b1ec40b398a45cf7d2bb534 assets/create/blockstates/waxed_oxidized_copper_tile_stairs.json -079acbfd6a9375899687b581f95bbe74940afce2 assets/create/blockstates/waxed_weathered_copper_shingles.json +17acf3486e92aabc3efbe99fa1e5d7d664e6ec97 assets/create/blockstates/waxed_oxidized_copper_tiles.json 73572bbe16957e63853ee425d8f34d98e14e4a10 assets/create/blockstates/waxed_weathered_copper_shingle_slab.json ab05925d5bb70e53fec9c149982304f31acd2b1a assets/create/blockstates/waxed_weathered_copper_shingle_stairs.json -202b0f2e6fca9eab949f47eaa1f4ddee249a633a assets/create/blockstates/waxed_weathered_copper_tiles.json +079acbfd6a9375899687b581f95bbe74940afce2 assets/create/blockstates/waxed_weathered_copper_shingles.json fc1b53d3b2b1f0977069abec3c376f3f5c4cd7c8 assets/create/blockstates/waxed_weathered_copper_tile_slab.json 6cd93476a45c3b77f5eda66f68425bae486cfba8 assets/create/blockstates/waxed_weathered_copper_tile_stairs.json -c11562afd9a5f85945e521dcea5f911d1b6d13c6 assets/create/blockstates/weathered_copper_shingles.json +202b0f2e6fca9eab949f47eaa1f4ddee249a633a assets/create/blockstates/waxed_weathered_copper_tiles.json 5a5a1e95988edb7a2b6dc6c6ba5677c2d896a5ae assets/create/blockstates/weathered_copper_shingle_slab.json 07019fc8890cb5e966a42ca636a0ab9cf71cc881 assets/create/blockstates/weathered_copper_shingle_stairs.json -236e072d9056c0dbffdf5d7d973a85a56c2c8de1 assets/create/blockstates/weathered_copper_tiles.json +c11562afd9a5f85945e521dcea5f911d1b6d13c6 assets/create/blockstates/weathered_copper_shingles.json fee668eb9a45dca0d287fee5811219d69f9ec3e2 assets/create/blockstates/weathered_copper_tile_slab.json da110f382368257e15431c77164aef82e014e3f8 assets/create/blockstates/weathered_copper_tile_stairs.json +236e072d9056c0dbffdf5d7d973a85a56c2c8de1 assets/create/blockstates/weathered_copper_tiles.json 64fb3e569da401635b64e71e01ea0b3ff6360611 assets/create/blockstates/weathered_iron_block.json 6fd81f1eb48fbfc44df9db8eedc613690c9b8ef5 assets/create/blockstates/weathered_iron_window.json 1aed351050d73989c4553bf49ce03b3a8fdd210e assets/create/blockstates/weathered_iron_window_pane.json @@ -806,21 +806,21 @@ d063df8e9b974c11fc7810ce176b02d7d924e15b assets/create/models/block/copper_post. 2b5aed4a917694beb33d9b0ecbc800dcbc143ee9 assets/create/models/block/copper_post_ends.json bac7566a726b0fe6d537c744aec4afb383dc165c assets/create/models/block/copper_scaffolding.json dbee65c129740f3b99c07e754b3224d3f9f8c242 assets/create/models/block/copper_scaffolding_horizontal.json -32fdb85b5b62d5a0fb41732874c854788cdd2ba1 assets/create/models/block/copper_shingles.json fb7fb6deebd502946ab57f1b8a9f4a6b5dd48da3 assets/create/models/block/copper_shingle_slab.json 660f61112b8e46dec5050cb0ed4ee936965a7c58 assets/create/models/block/copper_shingle_slab_top.json 5d74be967bbe9feba4b630751f13af817a733d1d assets/create/models/block/copper_shingle_stairs.json 35cb89f29ce3f8d8af13602c08ecd7afbb7cf56a assets/create/models/block/copper_shingle_stairs_inner.json fcb9295f4f388e6d439ec9a3906ca326b6d69077 assets/create/models/block/copper_shingle_stairs_outer.json +32fdb85b5b62d5a0fb41732874c854788cdd2ba1 assets/create/models/block/copper_shingles.json cb218a725f82db34ffe58a5208266e1c768cfc05 assets/create/models/block/copper_side.json d9b4652ca8f1e65007f42d946ecfb38acc3f168f assets/create/models/block/copper_side_alt.json 03a6c5b8bc3041a2be001092f7abd014d6f852a2 assets/create/models/block/copper_table_cloth.json -32f06f39d0b34e4431795aa6e64f87e58dc1597b assets/create/models/block/copper_tiles.json 298c6100de02ed9f813397d8ba38c46f35035c69 assets/create/models/block/copper_tile_slab.json d4422c2d96fb329087d1be70d8b983a8cf6c7f01 assets/create/models/block/copper_tile_slab_top.json fca72048f916d3a3e567b385c948cc1b59711ef4 assets/create/models/block/copper_tile_stairs.json 997479b62ed3d81ab633279ecc2fabd9588a3bf3 assets/create/models/block/copper_tile_stairs_inner.json d5c5bbfb9aaa282e11ad6e6309b1880b172ee653 assets/create/models/block/copper_tile_stairs_outer.json +32f06f39d0b34e4431795aa6e64f87e58dc1597b assets/create/models/block/copper_tiles.json fa2fa91e674eb4de440617049dae34064fd6fa39 assets/create/models/block/copper_valve_handle.json 52ae02c17509e483e35a1b6055296c3a663f85d7 assets/create/models/block/crate/creative/bottom.json 689989ecbd4d59d5836deb8adf7af1d473a377c0 assets/create/models/block/crate/creative/left.json @@ -864,15 +864,15 @@ b3f403f77e3b1b44c56450e387136bca12a84a99 assets/create/models/block/crimson_wind 117d14a1f25cc8ac633bb4cc8a81830a1c016096 assets/create/models/block/crimson_window_pane_side.json ee13522aadfca40f856499d5c29bd86d8f4dda57 assets/create/models/block/crimson_window_pane_side_alt.json 40042ce15d51445ec71b73da34477fa735f3fdd4 assets/create/models/block/cut_andesite.json -5be7d431ac56e2ceb9e3d95589d687f757d5257c assets/create/models/block/cut_andesite_bricks.json -c78e2acf9b54d7370f12e34dcca5c71743f47d55 assets/create/models/block/cut_andesite_bricks_wall_post.json -88e3c8eadf97f772fbafe3b71c8dd27c91c0c0e3 assets/create/models/block/cut_andesite_bricks_wall_side.json -bc264e09c506418b01c6032dcab8ca28080cb70b assets/create/models/block/cut_andesite_bricks_wall_side_tall.json fcbe246aca067dcfeef7afb4e6068b8932da8792 assets/create/models/block/cut_andesite_brick_slab.json e384a98b54ed7317b6ad0e86cf87500491eea824 assets/create/models/block/cut_andesite_brick_slab_top.json 91699e60e29e7524271a2f87200951ee8bfeb8ef assets/create/models/block/cut_andesite_brick_stairs.json e314e0837aed319cdf34a1aaa60f0be6ca169636 assets/create/models/block/cut_andesite_brick_stairs_inner.json aba679c4c6a8d5afc2924d2c9c84af5a2208fde3 assets/create/models/block/cut_andesite_brick_stairs_outer.json +5be7d431ac56e2ceb9e3d95589d687f757d5257c assets/create/models/block/cut_andesite_bricks.json +c78e2acf9b54d7370f12e34dcca5c71743f47d55 assets/create/models/block/cut_andesite_bricks_wall_post.json +88e3c8eadf97f772fbafe3b71c8dd27c91c0c0e3 assets/create/models/block/cut_andesite_bricks_wall_side.json +bc264e09c506418b01c6032dcab8ca28080cb70b assets/create/models/block/cut_andesite_bricks_wall_side_tall.json 8c17ba39e50a440497af089f5fd85649f05bdf8c assets/create/models/block/cut_andesite_slab.json b95ab966cf8c177c799e228759d0cd28c1cfa71f assets/create/models/block/cut_andesite_slab_top.json 81a407a5ff4393b66f784ba4ceee971c3c62de7f assets/create/models/block/cut_andesite_stairs.json @@ -882,15 +882,15 @@ f06abcb3ce691fd30db81b40ea0430462fc972cf assets/create/models/block/cut_andesite 81cef9548137aaff5b6e77d417f387796f2608b2 assets/create/models/block/cut_andesite_wall_side.json dbb99ac37333ee12b7d3859207409aa2599f28eb assets/create/models/block/cut_andesite_wall_side_tall.json a48f77e90c1d02d5b4e6540db723f748118788e9 assets/create/models/block/cut_asurine.json -3b0b7bd63870ac19b9444ce9add9930ec9120821 assets/create/models/block/cut_asurine_bricks.json -89142424e1d702a0f2bc27829304520e48ee1eb3 assets/create/models/block/cut_asurine_bricks_wall_post.json -1f1fcf92e91b1f0d15ba389d6d25e1fba3ad8e5b assets/create/models/block/cut_asurine_bricks_wall_side.json -858d15aff53fe938304bafb52ef32e54e3d44a44 assets/create/models/block/cut_asurine_bricks_wall_side_tall.json 4107317f71d07fb1c113e056c832e963f57b41d7 assets/create/models/block/cut_asurine_brick_slab.json fba2e8dc513184eaa9c4449471b32f206dfe425a assets/create/models/block/cut_asurine_brick_slab_top.json 72bb7b2df330f8d5981f4c12b23429d8d874362d assets/create/models/block/cut_asurine_brick_stairs.json e753ba3830c51539565abbd9b49df9a34f97f2ff assets/create/models/block/cut_asurine_brick_stairs_inner.json ec9182d14517ffc71749e3e016e6546db79e6800 assets/create/models/block/cut_asurine_brick_stairs_outer.json +3b0b7bd63870ac19b9444ce9add9930ec9120821 assets/create/models/block/cut_asurine_bricks.json +89142424e1d702a0f2bc27829304520e48ee1eb3 assets/create/models/block/cut_asurine_bricks_wall_post.json +1f1fcf92e91b1f0d15ba389d6d25e1fba3ad8e5b assets/create/models/block/cut_asurine_bricks_wall_side.json +858d15aff53fe938304bafb52ef32e54e3d44a44 assets/create/models/block/cut_asurine_bricks_wall_side_tall.json b4512f7cef7cef0bc5f85cb955c2dec6de2cbb56 assets/create/models/block/cut_asurine_slab.json 7c1befdd97b1556e9658e968e705c9edbf1ed667 assets/create/models/block/cut_asurine_slab_top.json d04b8a8cf9a50aa7e0b068ceb9a5a2970abc81a7 assets/create/models/block/cut_asurine_stairs.json @@ -900,15 +900,15 @@ ac544a8f948119945aa21362ad26ed8b1c922b0d assets/create/models/block/cut_asurine_ a253210cba60f58e720598323bd0d9ed4c209b4d assets/create/models/block/cut_asurine_wall_side.json c0c2cc13288771699a80c5c80e8e35d352cea684 assets/create/models/block/cut_asurine_wall_side_tall.json a6b10dc7984d22cac7aa314d46ac0928a00e667b assets/create/models/block/cut_calcite.json -6230a499321b175fc441bb662e0655662b3597de assets/create/models/block/cut_calcite_bricks.json -be1462847e9001a062091162802fab2fe6737693 assets/create/models/block/cut_calcite_bricks_wall_post.json -6e6b34468a7a0786efe5f4ebd917a4640b4be6ae assets/create/models/block/cut_calcite_bricks_wall_side.json -8b10c0f4f17f3844cee6d514cc22ddc6cb056c8a assets/create/models/block/cut_calcite_bricks_wall_side_tall.json f046be4f44936946bd3cc2ad5549d112b2e60d97 assets/create/models/block/cut_calcite_brick_slab.json 64953ca8a302ecab9311c617f69e5dcf8c138718 assets/create/models/block/cut_calcite_brick_slab_top.json 19e1b342d05d3cd69c410952dc22507c3c988c15 assets/create/models/block/cut_calcite_brick_stairs.json 18317b0a8bab345abd779f5d43f9620b73df0e67 assets/create/models/block/cut_calcite_brick_stairs_inner.json 0631d4e1bdaf724752f2e55401eb7a54af705b56 assets/create/models/block/cut_calcite_brick_stairs_outer.json +6230a499321b175fc441bb662e0655662b3597de assets/create/models/block/cut_calcite_bricks.json +be1462847e9001a062091162802fab2fe6737693 assets/create/models/block/cut_calcite_bricks_wall_post.json +6e6b34468a7a0786efe5f4ebd917a4640b4be6ae assets/create/models/block/cut_calcite_bricks_wall_side.json +8b10c0f4f17f3844cee6d514cc22ddc6cb056c8a assets/create/models/block/cut_calcite_bricks_wall_side_tall.json 6b35e0f9e6a7e247bf38d8d6d911a2bcc53c2517 assets/create/models/block/cut_calcite_slab.json 0eec7692ee8e119c1258bdb7e852204771c2232d assets/create/models/block/cut_calcite_slab_top.json d07ebf8982e4947852da8b2b0052f6b6000d334f assets/create/models/block/cut_calcite_stairs.json @@ -918,15 +918,15 @@ e8b7b983168ad9f4f4fa1642ca20ff56621935db assets/create/models/block/cut_calcite_ 421e128177bb4dd51391e360f11ba83c5d891cd1 assets/create/models/block/cut_calcite_wall_side.json 5add4bde51bbdd7c229b05f4fabd8a769414fb79 assets/create/models/block/cut_calcite_wall_side_tall.json 2e93da554ea72b90a576bbc9230aea373d3aed0f assets/create/models/block/cut_crimsite.json -39d1a3cdd978c761bc0d67baaba82d11953fc2a0 assets/create/models/block/cut_crimsite_bricks.json -8614cb38c52447fea5245fcf295a951a977071c0 assets/create/models/block/cut_crimsite_bricks_wall_post.json -b0b16f4a2f6dd3f77ec4f65f05e9edb70a196316 assets/create/models/block/cut_crimsite_bricks_wall_side.json -ac41e5b092c6ed81d14004f9427b6151b88dc924 assets/create/models/block/cut_crimsite_bricks_wall_side_tall.json c2474a10109d0476a46d2a509fc1cd37cd52822d assets/create/models/block/cut_crimsite_brick_slab.json efeb149835a389409b7f94bc35765b0871ad7342 assets/create/models/block/cut_crimsite_brick_slab_top.json e5096a1bae43341bae5706f02cd6d564b5a82502 assets/create/models/block/cut_crimsite_brick_stairs.json af3c0018e5e12bbe0f118bc0174b6ca513ae58ae assets/create/models/block/cut_crimsite_brick_stairs_inner.json ed30baef426f2ccf158d87111c7b53f3600bc32a assets/create/models/block/cut_crimsite_brick_stairs_outer.json +39d1a3cdd978c761bc0d67baaba82d11953fc2a0 assets/create/models/block/cut_crimsite_bricks.json +8614cb38c52447fea5245fcf295a951a977071c0 assets/create/models/block/cut_crimsite_bricks_wall_post.json +b0b16f4a2f6dd3f77ec4f65f05e9edb70a196316 assets/create/models/block/cut_crimsite_bricks_wall_side.json +ac41e5b092c6ed81d14004f9427b6151b88dc924 assets/create/models/block/cut_crimsite_bricks_wall_side_tall.json a6cdd4b227210b7487b8431b8d76bbe490636b81 assets/create/models/block/cut_crimsite_slab.json 5c585dba4dbfa9ff0a22a84aa726260cffdeebeb assets/create/models/block/cut_crimsite_slab_top.json 91f60b4277ca48dabfb5d3eebb1ed64a2681a083 assets/create/models/block/cut_crimsite_stairs.json @@ -936,15 +936,15 @@ e6b39a0b1dbab462479fc60fab2efc6a9ceb6a55 assets/create/models/block/cut_crimsite 5b3783862e50fde6ffffc92068900afcc066002f assets/create/models/block/cut_crimsite_wall_side.json b59fbbfe9c6738b1f93f03d59a747f5610164c34 assets/create/models/block/cut_crimsite_wall_side_tall.json 144ec3864fb0a7981e74d357200a96033c75a2d6 assets/create/models/block/cut_deepslate.json -0d599ae1b4e9309f2a7b3362e86061e2150ba3ec assets/create/models/block/cut_deepslate_bricks.json -601894e096edbcd3d96ce0160f06e17a4efca819 assets/create/models/block/cut_deepslate_bricks_wall_post.json -42db46cb5c9c02d684c86f3a518feb3348d83fa0 assets/create/models/block/cut_deepslate_bricks_wall_side.json -c046436d59c350c6beb6b395675513c12184ffe2 assets/create/models/block/cut_deepslate_bricks_wall_side_tall.json af8c7c652e75bf904093bbafc1cf805f842a39c9 assets/create/models/block/cut_deepslate_brick_slab.json 2a01dd0244b07f28454c061a565d1028ca7e3066 assets/create/models/block/cut_deepslate_brick_slab_top.json 62d39eec3621204de82377e74936b9cd338e8004 assets/create/models/block/cut_deepslate_brick_stairs.json 5f90dfbb45b57bd894bf03fcc6c347cb525e3a73 assets/create/models/block/cut_deepslate_brick_stairs_inner.json 512d588c77bdf5a7232826e2f4ce4b3cb991d0ce assets/create/models/block/cut_deepslate_brick_stairs_outer.json +0d599ae1b4e9309f2a7b3362e86061e2150ba3ec assets/create/models/block/cut_deepslate_bricks.json +601894e096edbcd3d96ce0160f06e17a4efca819 assets/create/models/block/cut_deepslate_bricks_wall_post.json +42db46cb5c9c02d684c86f3a518feb3348d83fa0 assets/create/models/block/cut_deepslate_bricks_wall_side.json +c046436d59c350c6beb6b395675513c12184ffe2 assets/create/models/block/cut_deepslate_bricks_wall_side_tall.json c79ae6e97e94d36f2586865ea63f3fab43f8ccbc assets/create/models/block/cut_deepslate_slab.json 5978b93805ccf0bdd953938b34a8dd0ffdcf5565 assets/create/models/block/cut_deepslate_slab_top.json 06a508b2395c3f738d2c5651f366792ee9b9c5ec assets/create/models/block/cut_deepslate_stairs.json @@ -954,15 +954,15 @@ c2850e9f223c459ba53d575a1ef8231589c48c0b assets/create/models/block/cut_deepslat e901746d3e50fe7d9b79d268f4d02251d5cf95f4 assets/create/models/block/cut_deepslate_wall_side.json 1ef794aab31a10bf150a0015cd46e5b5f3c70042 assets/create/models/block/cut_deepslate_wall_side_tall.json 4abb502ea3f6764797641f55a2c48f4858be1ba6 assets/create/models/block/cut_diorite.json -e97babf115a4f81f8555994aba435cf76bebf7a3 assets/create/models/block/cut_diorite_bricks.json -4f7cf44e4d6431587266a4fac78c0812e99d780c assets/create/models/block/cut_diorite_bricks_wall_post.json -1f96f9e190d8e28496ce2db5712f33e449215985 assets/create/models/block/cut_diorite_bricks_wall_side.json -45246192d9cd39837b426e425fc5082422642b65 assets/create/models/block/cut_diorite_bricks_wall_side_tall.json ab61b1b94946f315006a29113f594c234d796bee assets/create/models/block/cut_diorite_brick_slab.json 73597772386c6bbd38907cbea8db816f174a9f8f assets/create/models/block/cut_diorite_brick_slab_top.json c9fbd953ef0789a0e9a915d5f283fd09a76784d6 assets/create/models/block/cut_diorite_brick_stairs.json 5d721f1b3f4376a91707b56950a1f9635adbe603 assets/create/models/block/cut_diorite_brick_stairs_inner.json 9a446bf02732e1873fa96d7745fced0fa04d48d6 assets/create/models/block/cut_diorite_brick_stairs_outer.json +e97babf115a4f81f8555994aba435cf76bebf7a3 assets/create/models/block/cut_diorite_bricks.json +4f7cf44e4d6431587266a4fac78c0812e99d780c assets/create/models/block/cut_diorite_bricks_wall_post.json +1f96f9e190d8e28496ce2db5712f33e449215985 assets/create/models/block/cut_diorite_bricks_wall_side.json +45246192d9cd39837b426e425fc5082422642b65 assets/create/models/block/cut_diorite_bricks_wall_side_tall.json 15195975e7e0ffb7010591b957a657f492e6d59d assets/create/models/block/cut_diorite_slab.json 01c320637843dc0d8b74b48b8d6946cd663d51f6 assets/create/models/block/cut_diorite_slab_top.json 7dcbfe4dc2ec62345da660ecc6ca44056fcd64e7 assets/create/models/block/cut_diorite_stairs.json @@ -972,15 +972,15 @@ c9fbd953ef0789a0e9a915d5f283fd09a76784d6 assets/create/models/block/cut_diorite_ 29075eaaba51ba158f030c2a9583ed5ba52379c8 assets/create/models/block/cut_diorite_wall_side.json 1fb50473359147c7147ea85bc1907e6015ce06bc assets/create/models/block/cut_diorite_wall_side_tall.json 59ee053a884bc9731b4d1b01ae22e0e2b5916cfb assets/create/models/block/cut_dripstone.json -6a4b26a117f58d0187b2cc0c5b117ef71d03d4e9 assets/create/models/block/cut_dripstone_bricks.json -0bb1fa8fb9698dae61096483a01b41bf829666b0 assets/create/models/block/cut_dripstone_bricks_wall_post.json -2019fdc38b401bac72e8344d118d85049ec3efb9 assets/create/models/block/cut_dripstone_bricks_wall_side.json -ebb790b2b6f47d40c92c9bba680e82cb8f054fa9 assets/create/models/block/cut_dripstone_bricks_wall_side_tall.json 84d714b29dcb7eb95a82de8d48491413e26d5fa8 assets/create/models/block/cut_dripstone_brick_slab.json 28b0b1a641d11f8ade57c444e4c1bfd9d617f66a assets/create/models/block/cut_dripstone_brick_slab_top.json 05900c156a6341c12b366790c7e8d15e59a873f0 assets/create/models/block/cut_dripstone_brick_stairs.json 35fb2c83dc89b96951c69253f7502f78c903a9b8 assets/create/models/block/cut_dripstone_brick_stairs_inner.json f69244c1706c95aaadd32d45a24c91ce0848509f assets/create/models/block/cut_dripstone_brick_stairs_outer.json +6a4b26a117f58d0187b2cc0c5b117ef71d03d4e9 assets/create/models/block/cut_dripstone_bricks.json +0bb1fa8fb9698dae61096483a01b41bf829666b0 assets/create/models/block/cut_dripstone_bricks_wall_post.json +2019fdc38b401bac72e8344d118d85049ec3efb9 assets/create/models/block/cut_dripstone_bricks_wall_side.json +ebb790b2b6f47d40c92c9bba680e82cb8f054fa9 assets/create/models/block/cut_dripstone_bricks_wall_side_tall.json 9e42cf588f57de5166f2a2ccdae656743c8b9481 assets/create/models/block/cut_dripstone_slab.json 0da2f782d8ad8fecd81b98c72db182b817bf19eb assets/create/models/block/cut_dripstone_slab_top.json b3c903a1edcd1786ea51a2ccdad5734a1d04ea98 assets/create/models/block/cut_dripstone_stairs.json @@ -990,15 +990,15 @@ b3c903a1edcd1786ea51a2ccdad5734a1d04ea98 assets/create/models/block/cut_dripston 7fab5102d7fa4cd824b9393425639d05727b2ad2 assets/create/models/block/cut_dripstone_wall_side.json c41514cda1c9f5d942d222cbc5f6e620e367afc6 assets/create/models/block/cut_dripstone_wall_side_tall.json dff602c8d2fcd1ceca79f90ae15dbdfbd6cb157d assets/create/models/block/cut_granite.json -31c5299a42f82992e50f711e1e33549c373bd034 assets/create/models/block/cut_granite_bricks.json -ef5a851e57cc4b9c0e625176b1256441e1c17c66 assets/create/models/block/cut_granite_bricks_wall_post.json -815e8dc551c3e813b0b2af29df23a28860de0b53 assets/create/models/block/cut_granite_bricks_wall_side.json -ba241f9c82e27dd98ba6f4e4180922388ab5d1a3 assets/create/models/block/cut_granite_bricks_wall_side_tall.json 9e00dc8fcee23548c0cebda6eadbcfc559e4c20b assets/create/models/block/cut_granite_brick_slab.json 5ad061096451f74e773c3030f96d59424aa93314 assets/create/models/block/cut_granite_brick_slab_top.json 94f8ce607aae5c04ccf9e56f177f9d69203ae879 assets/create/models/block/cut_granite_brick_stairs.json 11d511844fec3bfd05cac8b788332f2decd53021 assets/create/models/block/cut_granite_brick_stairs_inner.json 418eb6a2b52e748a26c2d1914c6c1de94106589f assets/create/models/block/cut_granite_brick_stairs_outer.json +31c5299a42f82992e50f711e1e33549c373bd034 assets/create/models/block/cut_granite_bricks.json +ef5a851e57cc4b9c0e625176b1256441e1c17c66 assets/create/models/block/cut_granite_bricks_wall_post.json +815e8dc551c3e813b0b2af29df23a28860de0b53 assets/create/models/block/cut_granite_bricks_wall_side.json +ba241f9c82e27dd98ba6f4e4180922388ab5d1a3 assets/create/models/block/cut_granite_bricks_wall_side_tall.json 81be5e86cbdaec4945d3ccaf6d376f69c49f40d6 assets/create/models/block/cut_granite_slab.json f72a14e7cf3dd7d93b4462a3bee49683353dfb57 assets/create/models/block/cut_granite_slab_top.json 33bf924f01aae3a7720475f4b32b3a637e69ee36 assets/create/models/block/cut_granite_stairs.json @@ -1008,15 +1008,15 @@ fb4969e562ad2039d3bad2dc57a6845d3243d453 assets/create/models/block/cut_granite_ 2972b40134bcb15950a0118306f0251ff5e377b7 assets/create/models/block/cut_granite_wall_side.json abbe71fd17dbb5f176553db2f6edf2f1f7d8974a assets/create/models/block/cut_granite_wall_side_tall.json 019d3c4ffb39e328b5458aee44fee90e0ecbd829 assets/create/models/block/cut_limestone.json -7eae0f9766506f713933bde9f301d2f7f2bbef13 assets/create/models/block/cut_limestone_bricks.json -817e8cf8956af36c70e4b4e30b5d141086d006dd assets/create/models/block/cut_limestone_bricks_wall_post.json -1291cacff1b0980e58b5702a84c9b87ac5ef835d assets/create/models/block/cut_limestone_bricks_wall_side.json -6c9bc8803fe17ac623bde56f85683dd2ff13c33e assets/create/models/block/cut_limestone_bricks_wall_side_tall.json c93f33ba39c62b10dfb94c6e1c339cd4fbebffae assets/create/models/block/cut_limestone_brick_slab.json b12a340897ba98ed732a91dbd4129db7a7188e68 assets/create/models/block/cut_limestone_brick_slab_top.json 3e90b32d95ad1cf7b8a16dae3c16724510d41490 assets/create/models/block/cut_limestone_brick_stairs.json b2e7311667d14b2aa8c00e207f69f76207226567 assets/create/models/block/cut_limestone_brick_stairs_inner.json aac619ec1fb8aa56f1752ad3f354f9cb128771f8 assets/create/models/block/cut_limestone_brick_stairs_outer.json +7eae0f9766506f713933bde9f301d2f7f2bbef13 assets/create/models/block/cut_limestone_bricks.json +817e8cf8956af36c70e4b4e30b5d141086d006dd assets/create/models/block/cut_limestone_bricks_wall_post.json +1291cacff1b0980e58b5702a84c9b87ac5ef835d assets/create/models/block/cut_limestone_bricks_wall_side.json +6c9bc8803fe17ac623bde56f85683dd2ff13c33e assets/create/models/block/cut_limestone_bricks_wall_side_tall.json adc21af1c07edaf0573cfd2c95ebe38e50f7282c assets/create/models/block/cut_limestone_slab.json 2d1ea8fc5c8ce5549c7f7888371b6612bf0f5301 assets/create/models/block/cut_limestone_slab_top.json c1416808a2178996be75e0a9c1cd45849fcd6646 assets/create/models/block/cut_limestone_stairs.json @@ -1026,15 +1026,15 @@ c1416808a2178996be75e0a9c1cd45849fcd6646 assets/create/models/block/cut_limeston 2b5e65e662069a5c59e702224778dd407f5d11dd assets/create/models/block/cut_limestone_wall_side.json 052f130fef646242acccbbed2b510add21e18921 assets/create/models/block/cut_limestone_wall_side_tall.json 66cb6054821d45a60ae4d4d1d904dbef0b9f7c0f assets/create/models/block/cut_ochrum.json -0a7e38e3ac32352c5b3ec56a8c26212dbbb637a3 assets/create/models/block/cut_ochrum_bricks.json -47d0c58dd190f1ea894a5ca40ea7efd54a845d3e assets/create/models/block/cut_ochrum_bricks_wall_post.json -b502b5b213996bce0a626d86414045c80921511e assets/create/models/block/cut_ochrum_bricks_wall_side.json -c3f27545b3b7654c3e7a2df6b482d1a9895ccae9 assets/create/models/block/cut_ochrum_bricks_wall_side_tall.json ce16ec490ae8a33671502804e0b45fc42b6f228f assets/create/models/block/cut_ochrum_brick_slab.json fcbee94fdbd96b0b3d4aa245c6c87443abd1de90 assets/create/models/block/cut_ochrum_brick_slab_top.json 827349ed3eb05f5fe700e8f5816bcd82d0347612 assets/create/models/block/cut_ochrum_brick_stairs.json aa81d4135400eb40f891f8c41fcf7fa516ef64f1 assets/create/models/block/cut_ochrum_brick_stairs_inner.json ecd7e1cb9cae717e35eeb58dbe482833e98f5ac0 assets/create/models/block/cut_ochrum_brick_stairs_outer.json +0a7e38e3ac32352c5b3ec56a8c26212dbbb637a3 assets/create/models/block/cut_ochrum_bricks.json +47d0c58dd190f1ea894a5ca40ea7efd54a845d3e assets/create/models/block/cut_ochrum_bricks_wall_post.json +b502b5b213996bce0a626d86414045c80921511e assets/create/models/block/cut_ochrum_bricks_wall_side.json +c3f27545b3b7654c3e7a2df6b482d1a9895ccae9 assets/create/models/block/cut_ochrum_bricks_wall_side_tall.json e23998f88eb77826f5e4d58f3f4bb41a2e09ea97 assets/create/models/block/cut_ochrum_slab.json cd14f1abe3d0c65fbdd052f4a8e0b8fc2a15ad0e assets/create/models/block/cut_ochrum_slab_top.json a751feb4b609df141f971e341b204e76379dcda7 assets/create/models/block/cut_ochrum_stairs.json @@ -1044,15 +1044,15 @@ bed6843e39e7e771f6de151dfab0586d3ebad58c assets/create/models/block/cut_ochrum_s df267fb690642cac139aaabefa9eab802f13ddc1 assets/create/models/block/cut_ochrum_wall_side.json ed363b80cc61cb4d0b6fad9da855a0543ecaccc9 assets/create/models/block/cut_ochrum_wall_side_tall.json a65a54a08d9cc3b45e2320482dc2d9e317dd4f3d assets/create/models/block/cut_scorchia.json -9c93a554ab680d7c98c648c16472b52cc2646c50 assets/create/models/block/cut_scorchia_bricks.json -615dc444bb677caa774a4e95686ac24ebe4ec6dc assets/create/models/block/cut_scorchia_bricks_wall_post.json -758a2ad6677f857fbe955c26853eadc7150c105a assets/create/models/block/cut_scorchia_bricks_wall_side.json -f918dfa0751589d18a3eb054c290f669b5c61308 assets/create/models/block/cut_scorchia_bricks_wall_side_tall.json a032cf0a77e4f416ed153b1ffa834c065a73b2ae assets/create/models/block/cut_scorchia_brick_slab.json 716fc6ef58c240b3e6b45acf08d6e1472fe38e7c assets/create/models/block/cut_scorchia_brick_slab_top.json b2870e5ba7c5d5053b3639bf0aa1771ee050810b assets/create/models/block/cut_scorchia_brick_stairs.json 3e8a815eabd1991039a8ad18cedc9c57f46cd097 assets/create/models/block/cut_scorchia_brick_stairs_inner.json 0a9dc3149e7219a70642c242cd86dce5ba5cf4cc assets/create/models/block/cut_scorchia_brick_stairs_outer.json +9c93a554ab680d7c98c648c16472b52cc2646c50 assets/create/models/block/cut_scorchia_bricks.json +615dc444bb677caa774a4e95686ac24ebe4ec6dc assets/create/models/block/cut_scorchia_bricks_wall_post.json +758a2ad6677f857fbe955c26853eadc7150c105a assets/create/models/block/cut_scorchia_bricks_wall_side.json +f918dfa0751589d18a3eb054c290f669b5c61308 assets/create/models/block/cut_scorchia_bricks_wall_side_tall.json a85c4d0467c6746a8ef9c6ac0167d3e16f307d4e assets/create/models/block/cut_scorchia_slab.json 23fd6c65ea83f7ca7ef67dd7faf902c4fa662d70 assets/create/models/block/cut_scorchia_slab_top.json e42329f6fa3aeb958d2349a5442856e9473dc6b5 assets/create/models/block/cut_scorchia_stairs.json @@ -1062,15 +1062,15 @@ b9a911675861fee414f82c745399a7707c258f77 assets/create/models/block/cut_scorchia e61af066960897d50dc7f7bc17f95baa962829bd assets/create/models/block/cut_scorchia_wall_side.json 846f84efddca7d51b58ebe5e3bbed78312fb052d assets/create/models/block/cut_scorchia_wall_side_tall.json ce9dcf5b7fe58a97fab832fb98b4f5b6d3778255 assets/create/models/block/cut_scoria.json -fa3ef2bb65299c985b70f6959421e243a9ebc6d8 assets/create/models/block/cut_scoria_bricks.json -24ea1a30f68a918e6737dc8d9babe4528af5716a assets/create/models/block/cut_scoria_bricks_wall_post.json -ba7ae110d51fe510566ab42f5ead299b4409f2b7 assets/create/models/block/cut_scoria_bricks_wall_side.json -f04d12bc4e0b939bb443abcc6eb808e66c352c66 assets/create/models/block/cut_scoria_bricks_wall_side_tall.json edf04cbfb19b6ce99c1b74a71d40cd40c8120551 assets/create/models/block/cut_scoria_brick_slab.json f05725fd6d2764b277f01985d0e2fcbd3bf4a41e assets/create/models/block/cut_scoria_brick_slab_top.json 4bccbaef9dd9a8322087d3feb973e14d740ff27a assets/create/models/block/cut_scoria_brick_stairs.json 13f3b55dfdd97e68a6d525166618477e5bcb336d assets/create/models/block/cut_scoria_brick_stairs_inner.json 465862fb20542cae723fd72818be73aec05dad60 assets/create/models/block/cut_scoria_brick_stairs_outer.json +fa3ef2bb65299c985b70f6959421e243a9ebc6d8 assets/create/models/block/cut_scoria_bricks.json +24ea1a30f68a918e6737dc8d9babe4528af5716a assets/create/models/block/cut_scoria_bricks_wall_post.json +ba7ae110d51fe510566ab42f5ead299b4409f2b7 assets/create/models/block/cut_scoria_bricks_wall_side.json +f04d12bc4e0b939bb443abcc6eb808e66c352c66 assets/create/models/block/cut_scoria_bricks_wall_side_tall.json aeef239ca6b0eee527f75091d11d4a947740416d assets/create/models/block/cut_scoria_slab.json 5dfda9fa8117d35ebc324a5c9cb026e206e3b936 assets/create/models/block/cut_scoria_slab_top.json dfe8dbdb6deca69d847ee46fedfefe2da98dc329 assets/create/models/block/cut_scoria_stairs.json @@ -1080,15 +1080,15 @@ e0b2a94ff4b3f1c1e4282c9c8eecf2583bd7c68e assets/create/models/block/cut_scoria_w cf18e3fde94e3ba611f430fe527a9042a57e6936 assets/create/models/block/cut_scoria_wall_side.json 92475d7758b2bf582c585c2aafa6510f330c6f45 assets/create/models/block/cut_scoria_wall_side_tall.json 9f6543d21d9c24a429aae00511e6dbf61caf8030 assets/create/models/block/cut_tuff.json -8b3d9fe37ab7fda79ea4d90f674c525350883ba0 assets/create/models/block/cut_tuff_bricks.json -6b80481e15ff3d6eb40a42128da883c2027e0074 assets/create/models/block/cut_tuff_bricks_wall_post.json -057a34015b49565cb9858a2eea995a446ac0cfd4 assets/create/models/block/cut_tuff_bricks_wall_side.json -9f20bd04ef163076db9a8bf83c20cc802b57ae60 assets/create/models/block/cut_tuff_bricks_wall_side_tall.json 8c16599fda76c38978a2faa14f842a68fbbe4b9c assets/create/models/block/cut_tuff_brick_slab.json 696036e5900bdbb366dd49f5df71a1e701fd8ee3 assets/create/models/block/cut_tuff_brick_slab_top.json 54d4603e36be86e88d9302d61eab81e76cac1bbc assets/create/models/block/cut_tuff_brick_stairs.json 0ebb41a1ce5bf4ca86cbaf95e83cd2edf8f309ea assets/create/models/block/cut_tuff_brick_stairs_inner.json 5d5ed291db4b4bca464717c7fcde682b33d71c3f assets/create/models/block/cut_tuff_brick_stairs_outer.json +8b3d9fe37ab7fda79ea4d90f674c525350883ba0 assets/create/models/block/cut_tuff_bricks.json +6b80481e15ff3d6eb40a42128da883c2027e0074 assets/create/models/block/cut_tuff_bricks_wall_post.json +057a34015b49565cb9858a2eea995a446ac0cfd4 assets/create/models/block/cut_tuff_bricks_wall_side.json +9f20bd04ef163076db9a8bf83c20cc802b57ae60 assets/create/models/block/cut_tuff_bricks_wall_side_tall.json f2a904b7943555e8ec9dcc07513ca1ad9af809c3 assets/create/models/block/cut_tuff_slab.json ea74bb8a69f6acbd520ac8922e147495e5f99f6f assets/create/models/block/cut_tuff_slab_top.json 0262700e59de947907a04fdea9974f9d7e5a22f2 assets/create/models/block/cut_tuff_stairs.json @@ -1098,15 +1098,15 @@ ea74bb8a69f6acbd520ac8922e147495e5f99f6f assets/create/models/block/cut_tuff_sla 8c6492dc9e09359e5bac67ae4d473cffc8f93dbb assets/create/models/block/cut_tuff_wall_side.json f5f24066b6281303f52e25745881d5bca8c49c54 assets/create/models/block/cut_tuff_wall_side_tall.json 167e9a084987bcf7f67f655d0de88ae8ca2fcebb assets/create/models/block/cut_veridium.json -f8ab87c34f211a63525f6d386397face67460f8c assets/create/models/block/cut_veridium_bricks.json -e4e717fa8412032e184aebd1186470f41a2089c0 assets/create/models/block/cut_veridium_bricks_wall_post.json -8c40ccb8f10ef8dcda1bef46ad3490f697d178d2 assets/create/models/block/cut_veridium_bricks_wall_side.json -2c4671c66d904e15883ec3a14681b97ac537135c assets/create/models/block/cut_veridium_bricks_wall_side_tall.json 07c330c501375d5c316677edee80fb040c0fc237 assets/create/models/block/cut_veridium_brick_slab.json 4c8c660afe72e8ce9eaef53a37fdc63eb0c69513 assets/create/models/block/cut_veridium_brick_slab_top.json f802e4ae758e2c37c3129594ce4f5d9ffcfe173d assets/create/models/block/cut_veridium_brick_stairs.json 0d60d5cd0269e05816d28fcbbd2c680fe60cd316 assets/create/models/block/cut_veridium_brick_stairs_inner.json 22656f90b55aeaeeffa448b5f061fb26b5de7b0f assets/create/models/block/cut_veridium_brick_stairs_outer.json +f8ab87c34f211a63525f6d386397face67460f8c assets/create/models/block/cut_veridium_bricks.json +e4e717fa8412032e184aebd1186470f41a2089c0 assets/create/models/block/cut_veridium_bricks_wall_post.json +8c40ccb8f10ef8dcda1bef46ad3490f697d178d2 assets/create/models/block/cut_veridium_bricks_wall_side.json +2c4671c66d904e15883ec3a14681b97ac537135c assets/create/models/block/cut_veridium_bricks_wall_side_tall.json d736230e9b49a9fd40bc8f31df4d5144cdb429c8 assets/create/models/block/cut_veridium_slab.json 750e536c7b71dfb3a005d9b7a128ac435461e57f assets/create/models/block/cut_veridium_slab_top.json 8b05c19560e97ce15a66202717e3d32f6ee153a9 assets/create/models/block/cut_veridium_stairs.json @@ -1136,22 +1136,25 @@ db89bc32d0e466bc5008aa7091c682ba3aeec611 assets/create/models/block/diorite_pill a21387ab955f2b91e402b2189145f5fd6623592d assets/create/models/block/diorite_pillar_horizontal.json 44af455badc2b35a763007bba3537bda7d0ac289 assets/create/models/block/dripstone_pillar.json 1e23e3758e3311d0063c83742abb750a05021075 assets/create/models/block/dripstone_pillar_horizontal.json -19a773f91c58c49301f35965bac02d0c05fb2764 assets/create/models/block/exposed_copper_shingles.json a3420b91fdebec40e508a5eebb145c0201bd80c8 assets/create/models/block/exposed_copper_shingle_slab.json 4178ea5e50ee17b3c15f4a59efd019c4a19bb892 assets/create/models/block/exposed_copper_shingle_slab_top.json dd2d747774abc86e428a883e299db66cded78e11 assets/create/models/block/exposed_copper_shingle_stairs.json b6845da62d96a33cee624bb70360e256b26eda83 assets/create/models/block/exposed_copper_shingle_stairs_inner.json 3d8b758e50e75c5adc26ab6f39f9d73f00866673 assets/create/models/block/exposed_copper_shingle_stairs_outer.json -9cb20c9d41629d8b9426cb65829365d10966338f assets/create/models/block/exposed_copper_tiles.json +19a773f91c58c49301f35965bac02d0c05fb2764 assets/create/models/block/exposed_copper_shingles.json cd21d9d2935b6d0103502e2731c11ea27ff64ecf assets/create/models/block/exposed_copper_tile_slab.json 0ec039ba59fb0028183433e52131ff355ace5bff assets/create/models/block/exposed_copper_tile_slab_top.json c51dbd34996ac4513234800e427ac308067d5e1d assets/create/models/block/exposed_copper_tile_stairs.json 68772d4352dc7ade995dfa57ba41a38ef819e855 assets/create/models/block/exposed_copper_tile_stairs_inner.json d932671822ba93b71a9c8b50e7207803a1c4dbab assets/create/models/block/exposed_copper_tile_stairs_outer.json +9cb20c9d41629d8b9426cb65829365d10966338f assets/create/models/block/exposed_copper_tiles.json 2d1ade82820569936fd3021a877283474ced09d0 assets/create/models/block/fake_track.json 9e41f0b90dd1e71766c9d07bdb75d1e553f3392f assets/create/models/block/fluid_pipe/d_x.json 13507730f6ca6462c4cfeddc46e5b21e93fb1287 assets/create/models/block/fluid_pipe/d_y.json 84c09934d3537343a1226389993dabfa850b745e assets/create/models/block/fluid_pipe/d_z.json +b8fd54e514bd50fb287c6b758647818c6b08ef75 assets/create/models/block/fluid_pipe/l_x.json +e985ff9dbe7324cf69ab38e6e9e85c9b554af56c assets/create/models/block/fluid_pipe/l_y.json +e24957d63bac1e754fcc1647a4a86337a67f6298 assets/create/models/block/fluid_pipe/l_z.json eacc5ee5f164ccc7c13cfbbd37a92b401222debe assets/create/models/block/fluid_pipe/ld_x.json 33fc0ecce85fae051c54d5a538793d7081238894 assets/create/models/block/fluid_pipe/ld_y.json 638f1a259cabed1f8d63c6fdaa6d4d4dff539e7d assets/create/models/block/fluid_pipe/ld_z.json @@ -1161,24 +1164,21 @@ c52521cd566294c797312104284ddd343fad9c2e assets/create/models/block/fluid_pipe/l 99637310d3ca1ccfbe62b03aa9b0d82a0cf6f724 assets/create/models/block/fluid_pipe/lu_x.json 986800d441e95553464d1869d39baf456f5d70dc assets/create/models/block/fluid_pipe/lu_y.json 11dcf7d2dcd0df9b043035cb072deee96ab9e6da assets/create/models/block/fluid_pipe/lu_z.json -b8fd54e514bd50fb287c6b758647818c6b08ef75 assets/create/models/block/fluid_pipe/l_x.json -e985ff9dbe7324cf69ab38e6e9e85c9b554af56c assets/create/models/block/fluid_pipe/l_y.json -e24957d63bac1e754fcc1647a4a86337a67f6298 assets/create/models/block/fluid_pipe/l_z.json +d44ff2aed71039a7d0ff913d0d9e8398e1318f39 assets/create/models/block/fluid_pipe/r_x.json +92d4044b51a90da0b2277b0613c7ca0bb80c66fe assets/create/models/block/fluid_pipe/r_y.json +fb9a23de00ef4edb4f7e24fb60de345cd12e513f assets/create/models/block/fluid_pipe/r_z.json bde9ec36b86113a6ca7a51a4f405994460a2eb56 assets/create/models/block/fluid_pipe/rd_x.json bd325f5b37ff08328ddddeeceac1a41be586d20a assets/create/models/block/fluid_pipe/rd_y.json 28f351fd215af3a991ccd9aa05c57b9cd9e6f58d assets/create/models/block/fluid_pipe/rd_z.json 1ff3ea321aeacca70709eb76370c11c7f13163b6 assets/create/models/block/fluid_pipe/ru_x.json 95bc5342fd3909981430c2e13ef98cdbd8f02709 assets/create/models/block/fluid_pipe/ru_y.json e1fc0d1297a83749ac55f51c9cf33ff2ecc9fdc2 assets/create/models/block/fluid_pipe/ru_z.json -d44ff2aed71039a7d0ff913d0d9e8398e1318f39 assets/create/models/block/fluid_pipe/r_x.json -92d4044b51a90da0b2277b0613c7ca0bb80c66fe assets/create/models/block/fluid_pipe/r_y.json -fb9a23de00ef4edb4f7e24fb60de345cd12e513f assets/create/models/block/fluid_pipe/r_z.json -65a41f4b680af197776e03cae6f1815b6d04def2 assets/create/models/block/fluid_pipe/ud_x.json -26398801d89889ffe17b6513b786d27707f6a480 assets/create/models/block/fluid_pipe/ud_y.json -07747cc2b936e1b326bae7ac32a8a5ba77fdffa9 assets/create/models/block/fluid_pipe/ud_z.json 4e3debb2ba60398a0730866f781e0455f4316610 assets/create/models/block/fluid_pipe/u_x.json 0f98b30ba09706b8a5ee09aeef912b39acea0216 assets/create/models/block/fluid_pipe/u_y.json 83bf9b1af633c319c051055170debff4cc3508c0 assets/create/models/block/fluid_pipe/u_z.json +65a41f4b680af197776e03cae6f1815b6d04def2 assets/create/models/block/fluid_pipe/ud_x.json +26398801d89889ffe17b6513b786d27707f6a480 assets/create/models/block/fluid_pipe/ud_y.json +07747cc2b936e1b326bae7ac32a8a5ba77fdffa9 assets/create/models/block/fluid_pipe/ud_z.json 5f70af15ec2569c68a17d31024c7a37cb5c68c7e assets/create/models/block/framed_glass.json f0100e1d44146b256998fbd2af05da80d147e8d9 assets/create/models/block/framed_glass_pane_noside.json 4a032c6ae3f459e3349c2a2218da186170c31e03 assets/create/models/block/framed_glass_pane_noside_alt.json @@ -1269,9 +1269,6 @@ d1813d0f548fcddb361df7cc3b5d97582842b10f assets/create/models/block/light_gray_s debf78f20659bc3c637299a40b649cbe4aa30ebf assets/create/models/block/light_gray_table_cloth.json 4ec5d701dd8b2d8c3dc44d05f527a3d737002cd4 assets/create/models/block/light_gray_toolbox.json adb8dbed70419e0310e7a20f3656bf325b348434 assets/create/models/block/light_gray_valve_handle.json -8f53caad3899a30be5087a0ba155080834418cc0 assets/create/models/block/limestone.json -2b80f9421c2fe902d55d9bd95183ad4bae46c315 assets/create/models/block/limestone_pillar.json -fb18280a2a708f60b00cc7c675804c219784871a assets/create/models/block/limestone_pillar_horizontal.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/lime_nixie_tube.json 952d292d4dc2158e6106c5079cfa1ddb81c7777e assets/create/models/block/lime_postbox_closed.json 4357f5d9102d54c7fbe5325512a2cd42d94d6d42 assets/create/models/block/lime_postbox_open.json @@ -1280,6 +1277,9 @@ fb18280a2a708f60b00cc7c675804c219784871a assets/create/models/block/limestone_pi e4142a22c20d6e5b9a8b9f96c13d4e5f96adc59d assets/create/models/block/lime_table_cloth.json b92822a01e4fbed2463b1bdf7dcc736023988e20 assets/create/models/block/lime_toolbox.json 802b47f34b1053b7af980b08b6511f468e7dd7c1 assets/create/models/block/lime_valve_handle.json +8f53caad3899a30be5087a0ba155080834418cc0 assets/create/models/block/limestone.json +2b80f9421c2fe902d55d9bd95183ad4bae46c315 assets/create/models/block/limestone_pillar.json +fb18280a2a708f60b00cc7c675804c219784871a assets/create/models/block/limestone_pillar_horizontal.json 84b9ac6eafdbd037f3ff558c250a8b8952415af1 assets/create/models/block/linear_chassis.json 29ee936c09c1222c6a144e5bb39577b5a9cd28bf assets/create/models/block/linear_chassis_bottom.json a1a3804ddcb1db0a7b5c0693555f8eb326950dd0 assets/create/models/block/linear_chassis_top.json @@ -1325,18 +1325,18 @@ f9010894858512398bddd5d31b922e12594d2e3c assets/create/models/block/ornate_iron_ 92637fbd6bf54891411b32a494064b9a48e59411 assets/create/models/block/ornate_iron_window_pane_post.json 8416d497e7fc8ca4f9f4c608ccc0651036850256 assets/create/models/block/ornate_iron_window_pane_side.json 1cdaa9d4bd23f7b1eb14672dc9322d9dad966502 assets/create/models/block/ornate_iron_window_pane_side_alt.json -561beafce41b9e9c0b07bc6b7176dd4f6918c116 assets/create/models/block/oxidized_copper_shingles.json 7e0bab8109e322c6db5fe1d5999c06536c21c6eb assets/create/models/block/oxidized_copper_shingle_slab.json 42df32c4e2d1ffb2ee62748becfd1717118b440c assets/create/models/block/oxidized_copper_shingle_slab_top.json b55a733e3e68cfbd08d45bb9ac56deef9f728b60 assets/create/models/block/oxidized_copper_shingle_stairs.json 7b8745213af5aa7938fc04a295be6a087c72daa8 assets/create/models/block/oxidized_copper_shingle_stairs_inner.json d89419d48d6ee2f6747e7c93de8699db22ea3f59 assets/create/models/block/oxidized_copper_shingle_stairs_outer.json -5cf92b628ff1f832966138a58ed87d747681274c assets/create/models/block/oxidized_copper_tiles.json +561beafce41b9e9c0b07bc6b7176dd4f6918c116 assets/create/models/block/oxidized_copper_shingles.json ad6134598869711a12e2f95c9b5f25a0f7b8dd93 assets/create/models/block/oxidized_copper_tile_slab.json c17bac0fd6a20540813c6a1c000a553b7c5ac849 assets/create/models/block/oxidized_copper_tile_slab_top.json d5b30340364f5536e46bc67e777ef4fa20a36e04 assets/create/models/block/oxidized_copper_tile_stairs.json b40b315c23cbd3eb4658518bfac836f6091321a5 assets/create/models/block/oxidized_copper_tile_stairs_inner.json f4eaadab29b4f2e915237340e2d6f4aad4ba21d6 assets/create/models/block/oxidized_copper_tile_stairs_outer.json +5cf92b628ff1f832966138a58ed87d747681274c assets/create/models/block/oxidized_copper_tiles.json f8b51eec36c2eddc08a1b60894d863bb58f55625 assets/create/models/block/peculiar_bell_ceiling.json f70f83cfec770879c478eea3760ea187700f2878 assets/create/models/block/peculiar_bell_double_wall.json b9c9d00b844ca2f217ae21cc502cd4d082fed2d5 assets/create/models/block/peculiar_bell_floor.json @@ -1543,133 +1543,133 @@ ff52eb59dadfe675e416440f3115856a501428a6 assets/create/models/block/scoria.json 4d7d36f974d25a310db2f75800e8c7e0377881c6 assets/create/models/block/secondary_linear_chassis_top.json 5ecb821ac06873015d2d7ebcfb7e1f5fe85cf504 assets/create/models/block/secondary_linear_chassis_top_bottom.json e697898a0ec4c308314a4e0b7235fa0a9229da45 assets/create/models/block/shadow_steel_casing.json -73edb947b52c73e85a83422853d0b8a0fb34e82b assets/create/models/block/small_andesite_bricks.json -3bb5c8413b9e81a1adc339f873f37eb656904e06 assets/create/models/block/small_andesite_bricks_wall_post.json -0e70d94fc6ffdc0fd4a50a5910bc1455b401982f assets/create/models/block/small_andesite_bricks_wall_side.json -597fec784e40c1ff3b622824c32773d6d271f3b7 assets/create/models/block/small_andesite_bricks_wall_side_tall.json 593b962350c8de53156901b308617c6a246afa09 assets/create/models/block/small_andesite_brick_slab.json c83de8118653ccdce92a1b7f3501bf7359e0b310 assets/create/models/block/small_andesite_brick_slab_top.json f019380bcc81d52681e2beaf63e2b11836c45922 assets/create/models/block/small_andesite_brick_stairs.json 4fa72fe0115ad9ec83837852a2b2e2d22dde19ca assets/create/models/block/small_andesite_brick_stairs_inner.json f80f485f62dce86e98815b343c89e96b10623e53 assets/create/models/block/small_andesite_brick_stairs_outer.json -4750724972cbac6d7dac31e0689681eab6c37093 assets/create/models/block/small_asurine_bricks.json -407c7bea509bb0e9bf9f04e947ace584103d012d assets/create/models/block/small_asurine_bricks_wall_post.json -60491dfb4f2a6b78effdf18612b9a1cd7d930d8a assets/create/models/block/small_asurine_bricks_wall_side.json -e5d3172c08b65696a6d72220495463636d8b352c assets/create/models/block/small_asurine_bricks_wall_side_tall.json +73edb947b52c73e85a83422853d0b8a0fb34e82b assets/create/models/block/small_andesite_bricks.json +3bb5c8413b9e81a1adc339f873f37eb656904e06 assets/create/models/block/small_andesite_bricks_wall_post.json +0e70d94fc6ffdc0fd4a50a5910bc1455b401982f assets/create/models/block/small_andesite_bricks_wall_side.json +597fec784e40c1ff3b622824c32773d6d271f3b7 assets/create/models/block/small_andesite_bricks_wall_side_tall.json cdd354726eda82d83dc89871fa587b8c07b02a16 assets/create/models/block/small_asurine_brick_slab.json 7bdb6ed1e74437d083bca7d89c0d1b7c81e80b53 assets/create/models/block/small_asurine_brick_slab_top.json 086b9d4284d343967a582fd0a7d194bafd980e13 assets/create/models/block/small_asurine_brick_stairs.json db69f1580ca405b9a99f0e4ea8d9b9950ed6444e assets/create/models/block/small_asurine_brick_stairs_inner.json dd572cbff713b0f4830aef0bf3ba4adb80ee9908 assets/create/models/block/small_asurine_brick_stairs_outer.json -c2c72734ac526c319cb01e982824680bfb5f1186 assets/create/models/block/small_calcite_bricks.json -f17f2ecd5e5a32f92ec0ad0ba9e861a80432c0f2 assets/create/models/block/small_calcite_bricks_wall_post.json -1ad7654125aff67267567c0007cc03b8a15131b0 assets/create/models/block/small_calcite_bricks_wall_side.json -10c339f64c0e78f4fbb7a95c10bf7f9f399c0c6b assets/create/models/block/small_calcite_bricks_wall_side_tall.json +4750724972cbac6d7dac31e0689681eab6c37093 assets/create/models/block/small_asurine_bricks.json +407c7bea509bb0e9bf9f04e947ace584103d012d assets/create/models/block/small_asurine_bricks_wall_post.json +60491dfb4f2a6b78effdf18612b9a1cd7d930d8a assets/create/models/block/small_asurine_bricks_wall_side.json +e5d3172c08b65696a6d72220495463636d8b352c assets/create/models/block/small_asurine_bricks_wall_side_tall.json d07c57748981a54ffcdadc30ec21f728a3557bea assets/create/models/block/small_calcite_brick_slab.json 9a5e6a93328ad35b256b2512c28e683a74e807a9 assets/create/models/block/small_calcite_brick_slab_top.json c3d39e013dd0142f044f8f0a90de849a0d961e84 assets/create/models/block/small_calcite_brick_stairs.json 4e47a4708dafc0ea476e2d5b6567acfdc2c5c148 assets/create/models/block/small_calcite_brick_stairs_inner.json 6a41c44680a958299a787d8c8c8778d52167cd65 assets/create/models/block/small_calcite_brick_stairs_outer.json -485f6c0e37b24124ff23efa3f0caa2cfe85663dd assets/create/models/block/small_crimsite_bricks.json -57b050751e68c9a881d9598cfe8dfb45f19df08c assets/create/models/block/small_crimsite_bricks_wall_post.json -cb01f90c7ac1f56a6f79e1fecb126c349b6d53b0 assets/create/models/block/small_crimsite_bricks_wall_side.json -80932617b1d4b718071c1f8558398ba881743892 assets/create/models/block/small_crimsite_bricks_wall_side_tall.json +c2c72734ac526c319cb01e982824680bfb5f1186 assets/create/models/block/small_calcite_bricks.json +f17f2ecd5e5a32f92ec0ad0ba9e861a80432c0f2 assets/create/models/block/small_calcite_bricks_wall_post.json +1ad7654125aff67267567c0007cc03b8a15131b0 assets/create/models/block/small_calcite_bricks_wall_side.json +10c339f64c0e78f4fbb7a95c10bf7f9f399c0c6b assets/create/models/block/small_calcite_bricks_wall_side_tall.json 827867ddd9b5f6e2daa916c968531c7183ce7fa2 assets/create/models/block/small_crimsite_brick_slab.json dd19ebdbd1a2de827d467b0abd2d1d3ee5822305 assets/create/models/block/small_crimsite_brick_slab_top.json 58048cb41b740b008a98420ea93b567f38e2910f assets/create/models/block/small_crimsite_brick_stairs.json a943586885ea7d48fc27595d9741f97d852446e7 assets/create/models/block/small_crimsite_brick_stairs_inner.json 8dc173b8a9912341ccb9cd8c9a0d2d893571eb85 assets/create/models/block/small_crimsite_brick_stairs_outer.json -cd855b25c38be2c36dcbf6ab0d963a2c76043171 assets/create/models/block/small_deepslate_bricks.json -88a6c43f64c6d53b34719f41707622635108342b assets/create/models/block/small_deepslate_bricks_wall_post.json -dea1773ca9baf9e1a6a7a4288d348127b858c42d assets/create/models/block/small_deepslate_bricks_wall_side.json -673ab543b38a597fd74285cd25b8004c9e2bd706 assets/create/models/block/small_deepslate_bricks_wall_side_tall.json +485f6c0e37b24124ff23efa3f0caa2cfe85663dd assets/create/models/block/small_crimsite_bricks.json +57b050751e68c9a881d9598cfe8dfb45f19df08c assets/create/models/block/small_crimsite_bricks_wall_post.json +cb01f90c7ac1f56a6f79e1fecb126c349b6d53b0 assets/create/models/block/small_crimsite_bricks_wall_side.json +80932617b1d4b718071c1f8558398ba881743892 assets/create/models/block/small_crimsite_bricks_wall_side_tall.json 67c78a3e9250351d0ea18538640b596f05e957a4 assets/create/models/block/small_deepslate_brick_slab.json bc1af783fbcbe73df05e12c93625035db8089d16 assets/create/models/block/small_deepslate_brick_slab_top.json 91e00675337592d17a04032808ca64c4a159c814 assets/create/models/block/small_deepslate_brick_stairs.json 39e78262242637628628a07dc47908fb1593d3f2 assets/create/models/block/small_deepslate_brick_stairs_inner.json d7a61bc4c84070e0fd53e0957a5282078daff7f1 assets/create/models/block/small_deepslate_brick_stairs_outer.json -73e801fb607d76b42e1862323e9d149910a68298 assets/create/models/block/small_diorite_bricks.json -2bdb593d3ae4d856e96cc877f4927da25841af54 assets/create/models/block/small_diorite_bricks_wall_post.json -dd064be7962a2418784a513725fc7b5835e4ab40 assets/create/models/block/small_diorite_bricks_wall_side.json -3753c64785d74f1997b9f8f856fa873302621f39 assets/create/models/block/small_diorite_bricks_wall_side_tall.json +cd855b25c38be2c36dcbf6ab0d963a2c76043171 assets/create/models/block/small_deepslate_bricks.json +88a6c43f64c6d53b34719f41707622635108342b assets/create/models/block/small_deepslate_bricks_wall_post.json +dea1773ca9baf9e1a6a7a4288d348127b858c42d assets/create/models/block/small_deepslate_bricks_wall_side.json +673ab543b38a597fd74285cd25b8004c9e2bd706 assets/create/models/block/small_deepslate_bricks_wall_side_tall.json 59fc1d9dac0b6867779346413953174fc6b55d3c assets/create/models/block/small_diorite_brick_slab.json cbd6fe711e1203aa746d86d12bb85016b7142749 assets/create/models/block/small_diorite_brick_slab_top.json a6c823fa96ba8a06d101ca96a6898fe8a1faf83e assets/create/models/block/small_diorite_brick_stairs.json 7f128501d989122df9d2ab002a497356831caa1c assets/create/models/block/small_diorite_brick_stairs_inner.json 26222975b0efb2acea6473d0bcc99453aa9ed561 assets/create/models/block/small_diorite_brick_stairs_outer.json -7f55f9c8cae6a79a9ab22a4b593a2c5829390573 assets/create/models/block/small_dripstone_bricks.json -fd0880b2e55435c8dc6945fa71c67ba34d7b1e69 assets/create/models/block/small_dripstone_bricks_wall_post.json -c00e9c0bfb108b70975514694f38d3c4cd63e819 assets/create/models/block/small_dripstone_bricks_wall_side.json -26382c01766e04cfe7ea585cabc1baa1c409e0a0 assets/create/models/block/small_dripstone_bricks_wall_side_tall.json +73e801fb607d76b42e1862323e9d149910a68298 assets/create/models/block/small_diorite_bricks.json +2bdb593d3ae4d856e96cc877f4927da25841af54 assets/create/models/block/small_diorite_bricks_wall_post.json +dd064be7962a2418784a513725fc7b5835e4ab40 assets/create/models/block/small_diorite_bricks_wall_side.json +3753c64785d74f1997b9f8f856fa873302621f39 assets/create/models/block/small_diorite_bricks_wall_side_tall.json 7b18bb56d4509f490a73b2812a8e40333f400369 assets/create/models/block/small_dripstone_brick_slab.json 39b7aa7d1494e5328e8774acb8adec8a346e972f assets/create/models/block/small_dripstone_brick_slab_top.json 3d265aed7a723713d525d0fabf3a70600d9d60e4 assets/create/models/block/small_dripstone_brick_stairs.json 2be41e9c1367af7f0eb99856e35900df96974bd4 assets/create/models/block/small_dripstone_brick_stairs_inner.json 4026a9327d47d55218b00b0b4b92464b6448ad91 assets/create/models/block/small_dripstone_brick_stairs_outer.json -ad4cf29e0e67d0d202d5836486531551909c71bf assets/create/models/block/small_granite_bricks.json -d20963cbb5d2321a069bf42d203855a5584f8607 assets/create/models/block/small_granite_bricks_wall_post.json -b860879b66d2d23349fa95ff644d9eba21eb29bd assets/create/models/block/small_granite_bricks_wall_side.json -11593a2a0e307b3e1d847c84d8c61bc78fef2967 assets/create/models/block/small_granite_bricks_wall_side_tall.json +7f55f9c8cae6a79a9ab22a4b593a2c5829390573 assets/create/models/block/small_dripstone_bricks.json +fd0880b2e55435c8dc6945fa71c67ba34d7b1e69 assets/create/models/block/small_dripstone_bricks_wall_post.json +c00e9c0bfb108b70975514694f38d3c4cd63e819 assets/create/models/block/small_dripstone_bricks_wall_side.json +26382c01766e04cfe7ea585cabc1baa1c409e0a0 assets/create/models/block/small_dripstone_bricks_wall_side_tall.json cb0a72cedb6b2b043eaf8c8869648802d74a2eeb assets/create/models/block/small_granite_brick_slab.json d635840492541787d55cc005c7e207532edcdef3 assets/create/models/block/small_granite_brick_slab_top.json ba9bfedf5854fccaba8a5e60c26efb6e34ede3cd assets/create/models/block/small_granite_brick_stairs.json 9bebe59176e74926e28a139dc557c25283285e89 assets/create/models/block/small_granite_brick_stairs_inner.json 15d71900e76c131285447628e63bf1479ce7025a assets/create/models/block/small_granite_brick_stairs_outer.json -6224f2763224d3e746dafdaaf14fae68e2469b93 assets/create/models/block/small_limestone_bricks.json -ca038e240e4157897a6273692db2c952ab5b17d7 assets/create/models/block/small_limestone_bricks_wall_post.json -7920f8cfda77b22d4d29638faa6ae07d89e51ab3 assets/create/models/block/small_limestone_bricks_wall_side.json -6e1fa27744f4592111945e5cafee6d7d67b5299b assets/create/models/block/small_limestone_bricks_wall_side_tall.json +ad4cf29e0e67d0d202d5836486531551909c71bf assets/create/models/block/small_granite_bricks.json +d20963cbb5d2321a069bf42d203855a5584f8607 assets/create/models/block/small_granite_bricks_wall_post.json +b860879b66d2d23349fa95ff644d9eba21eb29bd assets/create/models/block/small_granite_bricks_wall_side.json +11593a2a0e307b3e1d847c84d8c61bc78fef2967 assets/create/models/block/small_granite_bricks_wall_side_tall.json 0e0f551bac87421e6b693aa9ca98fd5da2ee168b assets/create/models/block/small_limestone_brick_slab.json 6669c1e87ed79097f96e7e46eecf3ab6e7c9778c assets/create/models/block/small_limestone_brick_slab_top.json 5aff0145d2fc89549ac541db325dda25b8941583 assets/create/models/block/small_limestone_brick_stairs.json 250aa2c237a9532b19621fa604027433183961c3 assets/create/models/block/small_limestone_brick_stairs_inner.json 92da57d330e9905d017705dd931af1d1d6c1a00d assets/create/models/block/small_limestone_brick_stairs_outer.json -242e4f39f6df26917f21899f0c7d0415a166d4b9 assets/create/models/block/small_ochrum_bricks.json -06cb9faca0062947c08b2a7309a958aac5ab24ac assets/create/models/block/small_ochrum_bricks_wall_post.json -8d9d53206e222839333026c779b66b9fd8cf2cf9 assets/create/models/block/small_ochrum_bricks_wall_side.json -f412fbaa509f7b2d47a27d4bcb13590bfcae74ca assets/create/models/block/small_ochrum_bricks_wall_side_tall.json +6224f2763224d3e746dafdaaf14fae68e2469b93 assets/create/models/block/small_limestone_bricks.json +ca038e240e4157897a6273692db2c952ab5b17d7 assets/create/models/block/small_limestone_bricks_wall_post.json +7920f8cfda77b22d4d29638faa6ae07d89e51ab3 assets/create/models/block/small_limestone_bricks_wall_side.json +6e1fa27744f4592111945e5cafee6d7d67b5299b assets/create/models/block/small_limestone_bricks_wall_side_tall.json 517e3605a9e86a07c673e18d94c2c37109a2aef5 assets/create/models/block/small_ochrum_brick_slab.json 855ad9f6fe03ceb2cc33d9df3536cb4394acfa9b assets/create/models/block/small_ochrum_brick_slab_top.json c5fc35d6b0fe96c11537bc10d34a63ef80f3270c assets/create/models/block/small_ochrum_brick_stairs.json 9a2631d9f6821d2c01bc8b2588a69702d3b083cc assets/create/models/block/small_ochrum_brick_stairs_inner.json 1f0ccdef29dae18535ea304e954e06c91bb0620b assets/create/models/block/small_ochrum_brick_stairs_outer.json +242e4f39f6df26917f21899f0c7d0415a166d4b9 assets/create/models/block/small_ochrum_bricks.json +06cb9faca0062947c08b2a7309a958aac5ab24ac assets/create/models/block/small_ochrum_bricks_wall_post.json +8d9d53206e222839333026c779b66b9fd8cf2cf9 assets/create/models/block/small_ochrum_bricks_wall_side.json +f412fbaa509f7b2d47a27d4bcb13590bfcae74ca assets/create/models/block/small_ochrum_bricks_wall_side_tall.json be96f070be1f838c6fb442c164b5f9b4e5cfcee5 assets/create/models/block/small_rose_quartz_tiles.json -41e56d8e334b81a0d5270bdbe87617981e1f98b4 assets/create/models/block/small_scorchia_bricks.json -56aa81e05019533ce0e0f1ee3ef7bf20fcc400b4 assets/create/models/block/small_scorchia_bricks_wall_post.json -1e1fa90c8b144813770c4d53a3b734ae450895d6 assets/create/models/block/small_scorchia_bricks_wall_side.json -6a46cf73c03a2abea25a81dbb28f4150b355900c assets/create/models/block/small_scorchia_bricks_wall_side_tall.json 6aa3825ace2e73bec454aaa8597e3a892ee29eb7 assets/create/models/block/small_scorchia_brick_slab.json f0378625001171c449a403e372e59623f0fc6569 assets/create/models/block/small_scorchia_brick_slab_top.json 49fa4a3940f84902319df257d39812eb71c8a9e2 assets/create/models/block/small_scorchia_brick_stairs.json 4dee6e6dbe6a98a8eaa04f6812f322343f62fca1 assets/create/models/block/small_scorchia_brick_stairs_inner.json 8a19e7e5c03c155c9ef9332486ae0b069dea0502 assets/create/models/block/small_scorchia_brick_stairs_outer.json -6b435123d852579ba8467c4915cd5d0adaadeca0 assets/create/models/block/small_scoria_bricks.json -86b243074845ca66916ce96ef3774862cf9a39d4 assets/create/models/block/small_scoria_bricks_wall_post.json -57ccb3efbdc4a69cad60c8b90321338ba2e68321 assets/create/models/block/small_scoria_bricks_wall_side.json -d4c5398e10b25d2dc3cb3754a449fc2b60e4074f assets/create/models/block/small_scoria_bricks_wall_side_tall.json +41e56d8e334b81a0d5270bdbe87617981e1f98b4 assets/create/models/block/small_scorchia_bricks.json +56aa81e05019533ce0e0f1ee3ef7bf20fcc400b4 assets/create/models/block/small_scorchia_bricks_wall_post.json +1e1fa90c8b144813770c4d53a3b734ae450895d6 assets/create/models/block/small_scorchia_bricks_wall_side.json +6a46cf73c03a2abea25a81dbb28f4150b355900c assets/create/models/block/small_scorchia_bricks_wall_side_tall.json 918351c1270c26932c0c4783543779a25ca7e986 assets/create/models/block/small_scoria_brick_slab.json 4138e756b4b36f227e178acbcc233edb082ae603 assets/create/models/block/small_scoria_brick_slab_top.json b8e70cd7d9acdcf91be9783cd91d70275a006ea2 assets/create/models/block/small_scoria_brick_stairs.json 625bfbd58440ea4e270d57cc748f2b5f6cece63b assets/create/models/block/small_scoria_brick_stairs_inner.json 602a46fb2736acb8c50b0d04222e6c33e52dee87 assets/create/models/block/small_scoria_brick_stairs_outer.json -a8e8c633dfb6d9f14425b1fd28e88ecf08a88cc6 assets/create/models/block/small_tuff_bricks.json -1c3a22bed504cd7a7e507e83ee21399f8a3fb299 assets/create/models/block/small_tuff_bricks_wall_post.json -1aeb8cac7d0178a18ac1cf98c9a45ca8e67514b0 assets/create/models/block/small_tuff_bricks_wall_side.json -4c6b5c7c60ec4cad314064b171413a3e866e5f99 assets/create/models/block/small_tuff_bricks_wall_side_tall.json +6b435123d852579ba8467c4915cd5d0adaadeca0 assets/create/models/block/small_scoria_bricks.json +86b243074845ca66916ce96ef3774862cf9a39d4 assets/create/models/block/small_scoria_bricks_wall_post.json +57ccb3efbdc4a69cad60c8b90321338ba2e68321 assets/create/models/block/small_scoria_bricks_wall_side.json +d4c5398e10b25d2dc3cb3754a449fc2b60e4074f assets/create/models/block/small_scoria_bricks_wall_side_tall.json 6b2c4d8c8609de0d3d6ce1e30b1dd26ba59cb86d assets/create/models/block/small_tuff_brick_slab.json 1ba07367fcba6a3914f1703115304a7c19979542 assets/create/models/block/small_tuff_brick_slab_top.json 1a5ab239d0f2f041ee04005ceb60111e6848f5de assets/create/models/block/small_tuff_brick_stairs.json be3ee2c36f85a534a71d42a7d63a7816945b3c30 assets/create/models/block/small_tuff_brick_stairs_inner.json aa84e448041d5f74c75565f5e409b1e9b7e5155d assets/create/models/block/small_tuff_brick_stairs_outer.json -e9c75f1b4b663dce09b0a2f8282e574839c19d06 assets/create/models/block/small_veridium_bricks.json -725f6d3dbcfb469cede6fb27a98c1f398f3f3c8c assets/create/models/block/small_veridium_bricks_wall_post.json -b33ee496d43e315a5bed5eaabfd553e361fec1a9 assets/create/models/block/small_veridium_bricks_wall_side.json -80e950f93def51d82a63848b1fb6ac11600ab1bf assets/create/models/block/small_veridium_bricks_wall_side_tall.json +a8e8c633dfb6d9f14425b1fd28e88ecf08a88cc6 assets/create/models/block/small_tuff_bricks.json +1c3a22bed504cd7a7e507e83ee21399f8a3fb299 assets/create/models/block/small_tuff_bricks_wall_post.json +1aeb8cac7d0178a18ac1cf98c9a45ca8e67514b0 assets/create/models/block/small_tuff_bricks_wall_side.json +4c6b5c7c60ec4cad314064b171413a3e866e5f99 assets/create/models/block/small_tuff_bricks_wall_side_tall.json 30b150fe3cf9bdb6ee32cd6b0f51179b44be57d3 assets/create/models/block/small_veridium_brick_slab.json 2158dd9e71f6f60e5132105c68a41ad6e3927438 assets/create/models/block/small_veridium_brick_slab_top.json bbbfc8e3696945ed1f6c3afe73ae0745ff8deda1 assets/create/models/block/small_veridium_brick_stairs.json fc3a996b0ca01c2c09ad84b881c46e92918d084f assets/create/models/block/small_veridium_brick_stairs_inner.json e27a77984e8e28e6032f26bb010efcadfaeb5407 assets/create/models/block/small_veridium_brick_stairs_outer.json +e9c75f1b4b663dce09b0a2f8282e574839c19d06 assets/create/models/block/small_veridium_bricks.json +725f6d3dbcfb469cede6fb27a98c1f398f3f3c8c assets/create/models/block/small_veridium_bricks_wall_post.json +b33ee496d43e315a5bed5eaabfd553e361fec1a9 assets/create/models/block/small_veridium_bricks_wall_side.json +80e950f93def51d82a63848b1fb6ac11600ab1bf assets/create/models/block/small_veridium_bricks_wall_side_tall.json d7c1c2679c8ba543ae7be3b9cf3f4eea3c1a2f68 assets/create/models/block/spruce_window.json f4a4fbb9eea6fb1d0633e349eae6acdaf329e8d5 assets/create/models/block/spruce_window_pane_noside.json 02a25202a42debcd2b4aaa4113e3de4f8f6ee47c assets/create/models/block/spruce_window_pane_noside_alt.json @@ -1736,66 +1736,66 @@ e84875a4eb11e2161a93ec7569aa2ac1c2f60cef assets/create/models/block/warped_windo 378c865ff8213ff56f1f7a4b2d9cf26c71f036e8 assets/create/models/block/warped_window_pane_post.json f320de08cb113a9ad17acd2ebb8dfc57759e4f7d assets/create/models/block/warped_window_pane_side.json 2fc182d9697b5cddd93b01d1236931af27eee8fe assets/create/models/block/warped_window_pane_side_alt.json -32fdb85b5b62d5a0fb41732874c854788cdd2ba1 assets/create/models/block/waxed_copper_shingles.json fb7fb6deebd502946ab57f1b8a9f4a6b5dd48da3 assets/create/models/block/waxed_copper_shingle_slab.json 660f61112b8e46dec5050cb0ed4ee936965a7c58 assets/create/models/block/waxed_copper_shingle_slab_top.json 5d74be967bbe9feba4b630751f13af817a733d1d assets/create/models/block/waxed_copper_shingle_stairs.json 35cb89f29ce3f8d8af13602c08ecd7afbb7cf56a assets/create/models/block/waxed_copper_shingle_stairs_inner.json fcb9295f4f388e6d439ec9a3906ca326b6d69077 assets/create/models/block/waxed_copper_shingle_stairs_outer.json -32f06f39d0b34e4431795aa6e64f87e58dc1597b assets/create/models/block/waxed_copper_tiles.json +32fdb85b5b62d5a0fb41732874c854788cdd2ba1 assets/create/models/block/waxed_copper_shingles.json 298c6100de02ed9f813397d8ba38c46f35035c69 assets/create/models/block/waxed_copper_tile_slab.json d4422c2d96fb329087d1be70d8b983a8cf6c7f01 assets/create/models/block/waxed_copper_tile_slab_top.json fca72048f916d3a3e567b385c948cc1b59711ef4 assets/create/models/block/waxed_copper_tile_stairs.json 997479b62ed3d81ab633279ecc2fabd9588a3bf3 assets/create/models/block/waxed_copper_tile_stairs_inner.json d5c5bbfb9aaa282e11ad6e6309b1880b172ee653 assets/create/models/block/waxed_copper_tile_stairs_outer.json -19a773f91c58c49301f35965bac02d0c05fb2764 assets/create/models/block/waxed_exposed_copper_shingles.json +32f06f39d0b34e4431795aa6e64f87e58dc1597b assets/create/models/block/waxed_copper_tiles.json a3420b91fdebec40e508a5eebb145c0201bd80c8 assets/create/models/block/waxed_exposed_copper_shingle_slab.json 4178ea5e50ee17b3c15f4a59efd019c4a19bb892 assets/create/models/block/waxed_exposed_copper_shingle_slab_top.json dd2d747774abc86e428a883e299db66cded78e11 assets/create/models/block/waxed_exposed_copper_shingle_stairs.json b6845da62d96a33cee624bb70360e256b26eda83 assets/create/models/block/waxed_exposed_copper_shingle_stairs_inner.json 3d8b758e50e75c5adc26ab6f39f9d73f00866673 assets/create/models/block/waxed_exposed_copper_shingle_stairs_outer.json -9cb20c9d41629d8b9426cb65829365d10966338f assets/create/models/block/waxed_exposed_copper_tiles.json +19a773f91c58c49301f35965bac02d0c05fb2764 assets/create/models/block/waxed_exposed_copper_shingles.json cd21d9d2935b6d0103502e2731c11ea27ff64ecf assets/create/models/block/waxed_exposed_copper_tile_slab.json 0ec039ba59fb0028183433e52131ff355ace5bff assets/create/models/block/waxed_exposed_copper_tile_slab_top.json c51dbd34996ac4513234800e427ac308067d5e1d assets/create/models/block/waxed_exposed_copper_tile_stairs.json 68772d4352dc7ade995dfa57ba41a38ef819e855 assets/create/models/block/waxed_exposed_copper_tile_stairs_inner.json d932671822ba93b71a9c8b50e7207803a1c4dbab assets/create/models/block/waxed_exposed_copper_tile_stairs_outer.json -561beafce41b9e9c0b07bc6b7176dd4f6918c116 assets/create/models/block/waxed_oxidized_copper_shingles.json +9cb20c9d41629d8b9426cb65829365d10966338f assets/create/models/block/waxed_exposed_copper_tiles.json 7e0bab8109e322c6db5fe1d5999c06536c21c6eb assets/create/models/block/waxed_oxidized_copper_shingle_slab.json 42df32c4e2d1ffb2ee62748becfd1717118b440c assets/create/models/block/waxed_oxidized_copper_shingle_slab_top.json b55a733e3e68cfbd08d45bb9ac56deef9f728b60 assets/create/models/block/waxed_oxidized_copper_shingle_stairs.json 7b8745213af5aa7938fc04a295be6a087c72daa8 assets/create/models/block/waxed_oxidized_copper_shingle_stairs_inner.json d89419d48d6ee2f6747e7c93de8699db22ea3f59 assets/create/models/block/waxed_oxidized_copper_shingle_stairs_outer.json -5cf92b628ff1f832966138a58ed87d747681274c assets/create/models/block/waxed_oxidized_copper_tiles.json +561beafce41b9e9c0b07bc6b7176dd4f6918c116 assets/create/models/block/waxed_oxidized_copper_shingles.json ad6134598869711a12e2f95c9b5f25a0f7b8dd93 assets/create/models/block/waxed_oxidized_copper_tile_slab.json c17bac0fd6a20540813c6a1c000a553b7c5ac849 assets/create/models/block/waxed_oxidized_copper_tile_slab_top.json d5b30340364f5536e46bc67e777ef4fa20a36e04 assets/create/models/block/waxed_oxidized_copper_tile_stairs.json b40b315c23cbd3eb4658518bfac836f6091321a5 assets/create/models/block/waxed_oxidized_copper_tile_stairs_inner.json f4eaadab29b4f2e915237340e2d6f4aad4ba21d6 assets/create/models/block/waxed_oxidized_copper_tile_stairs_outer.json -9c73020e80c31cd710c218f9699ba9a795758ad0 assets/create/models/block/waxed_weathered_copper_shingles.json +5cf92b628ff1f832966138a58ed87d747681274c assets/create/models/block/waxed_oxidized_copper_tiles.json 897cfc177b073ca1bcb635c74108567f8748b5c4 assets/create/models/block/waxed_weathered_copper_shingle_slab.json efa57ba131c27e0064c0d958e69b10530a26ac41 assets/create/models/block/waxed_weathered_copper_shingle_slab_top.json 4ef11a7e3de630ad46b9179e8a9a34d55202f6c5 assets/create/models/block/waxed_weathered_copper_shingle_stairs.json f32a18c76cfaca2153f6321880a8da1347be37ce assets/create/models/block/waxed_weathered_copper_shingle_stairs_inner.json 9637f78e51ca7ed812e4c64c52e08f6fa0adbfc3 assets/create/models/block/waxed_weathered_copper_shingle_stairs_outer.json -9782a25341dd2ffb146430edbe6916932250c326 assets/create/models/block/waxed_weathered_copper_tiles.json +9c73020e80c31cd710c218f9699ba9a795758ad0 assets/create/models/block/waxed_weathered_copper_shingles.json 0c9669588972d4c2152bd2b043b8386b76a6e1c4 assets/create/models/block/waxed_weathered_copper_tile_slab.json 2d01a583cc948e9e0cb814cad968ed16a07dd46c assets/create/models/block/waxed_weathered_copper_tile_slab_top.json e26dd64495ff8801593e9c22203cbf364075badd assets/create/models/block/waxed_weathered_copper_tile_stairs.json b658c1022587bd670b5acee267607719c1544332 assets/create/models/block/waxed_weathered_copper_tile_stairs_inner.json e7ae89577be9d26a071bf96cbd7ed80293902b63 assets/create/models/block/waxed_weathered_copper_tile_stairs_outer.json -9c73020e80c31cd710c218f9699ba9a795758ad0 assets/create/models/block/weathered_copper_shingles.json +9782a25341dd2ffb146430edbe6916932250c326 assets/create/models/block/waxed_weathered_copper_tiles.json 897cfc177b073ca1bcb635c74108567f8748b5c4 assets/create/models/block/weathered_copper_shingle_slab.json efa57ba131c27e0064c0d958e69b10530a26ac41 assets/create/models/block/weathered_copper_shingle_slab_top.json 4ef11a7e3de630ad46b9179e8a9a34d55202f6c5 assets/create/models/block/weathered_copper_shingle_stairs.json f32a18c76cfaca2153f6321880a8da1347be37ce assets/create/models/block/weathered_copper_shingle_stairs_inner.json 9637f78e51ca7ed812e4c64c52e08f6fa0adbfc3 assets/create/models/block/weathered_copper_shingle_stairs_outer.json -9782a25341dd2ffb146430edbe6916932250c326 assets/create/models/block/weathered_copper_tiles.json +9c73020e80c31cd710c218f9699ba9a795758ad0 assets/create/models/block/weathered_copper_shingles.json 0c9669588972d4c2152bd2b043b8386b76a6e1c4 assets/create/models/block/weathered_copper_tile_slab.json 2d01a583cc948e9e0cb814cad968ed16a07dd46c assets/create/models/block/weathered_copper_tile_slab_top.json e26dd64495ff8801593e9c22203cbf364075badd assets/create/models/block/weathered_copper_tile_stairs.json b658c1022587bd670b5acee267607719c1544332 assets/create/models/block/weathered_copper_tile_stairs_inner.json e7ae89577be9d26a071bf96cbd7ed80293902b63 assets/create/models/block/weathered_copper_tile_stairs_outer.json +9782a25341dd2ffb146430edbe6916932250c326 assets/create/models/block/weathered_copper_tiles.json 045b812ddb1ca8dd6cd9b49852ddbd37f86cd2a6 assets/create/models/block/weathered_iron_block.json a569ddd725898a86f8745e46723edeff7fe7f2e9 assets/create/models/block/weathered_iron_window_1.json 133928d853037efb81022b69377669f0b16239bc assets/create/models/block/weathered_iron_window_2.json @@ -1931,13 +1931,13 @@ de48f4b6fa26928ebc7d5d60e6a0767093430d65 assets/create/models/item/contraption_c ccdf08652511e5737a8489d86ea9422ade4f4ca5 assets/create/models/item/copper_nugget.json 86a770e9b2af1f19bf633f5cfeecd84848f73fbd assets/create/models/item/copper_scaffolding.json a4fd2f4f00e03b2ac5d863e93827d39a984cc2ff assets/create/models/item/copper_sheet.json -13b18ba2938e283d507fbca70518cf52198cdc71 assets/create/models/item/copper_shingles.json 79d9f8667965072f12e51e6601b5c36f8acc125f assets/create/models/item/copper_shingle_slab.json 9fe6f0bdea4595b403ed2d2cbc2023a9abeb79f0 assets/create/models/item/copper_shingle_stairs.json +13b18ba2938e283d507fbca70518cf52198cdc71 assets/create/models/item/copper_shingles.json 9a33eeb0f7c682ee2f8c0abbfa174f8828acc2b5 assets/create/models/item/copper_table_cloth.json -19642e4ea5deecaf57059827c4c13a19d2e73822 assets/create/models/item/copper_tiles.json a7147444fc28a4cce21b6cf38e9528537e27c352 assets/create/models/item/copper_tile_slab.json 7330324d6c64f0340d676ecef83a930515d9130e assets/create/models/item/copper_tile_stairs.json +19642e4ea5deecaf57059827c4c13a19d2e73822 assets/create/models/item/copper_tiles.json 08c35e85afe4eb2b106133c5d9c7d7c64ca9a915 assets/create/models/item/copper_valve_handle.json 5cec229a3117ea5987aa42288c070427ac48a5dc assets/create/models/item/copycat_panel.json 1b6707005830ca066a7e997c73391ca88c70bdb0 assets/create/models/item/copycat_step.json @@ -1967,114 +1967,114 @@ b6acd86be9e6cac8b9ed2bc6297d27941ca05f46 assets/create/models/item/crushed_raw_z b67e95801010eab58de02f2b0160bff3f008bd18 assets/create/models/item/crushing_wheel.json af189b0c04482064520d84546d81af8154824292 assets/create/models/item/cuckoo_clock.json 314fb287c7b16a6478fbefde0da80de8828b684e assets/create/models/item/cut_andesite.json -e2840073eac2e6419cd312b3d0177d4c64a5346c assets/create/models/item/cut_andesite_bricks.json 680fe77d50f7c3253ec4997f74761f962b784e15 assets/create/models/item/cut_andesite_brick_slab.json 3c1d56f9686bb2b97c168b0509ddfd06e80be9a0 assets/create/models/item/cut_andesite_brick_stairs.json 4222b965f8a18f78b92838e4642a28fa3e0ad648 assets/create/models/item/cut_andesite_brick_wall.json +e2840073eac2e6419cd312b3d0177d4c64a5346c assets/create/models/item/cut_andesite_bricks.json c100e02ef9b05f4f6df3ddbbfe91db1032d4854b assets/create/models/item/cut_andesite_slab.json f435a67b3d89d12b6e8cb5071a67e35f0918dc79 assets/create/models/item/cut_andesite_stairs.json df9084d532a085220280bc7bee579e1079fbf786 assets/create/models/item/cut_andesite_wall.json 025eedca45b222b91d93b9a3a89fac5ad328b152 assets/create/models/item/cut_asurine.json -1ceb483f428448f00a08541fbcf4f4787aef3f1e assets/create/models/item/cut_asurine_bricks.json 022c56e7aafa7ca4cdd1a88426eb43f9e02c3cc2 assets/create/models/item/cut_asurine_brick_slab.json 3131e09a221c2f0a17cfc7277603f2e3c8164bc7 assets/create/models/item/cut_asurine_brick_stairs.json dc1f5f03acc1165606c48df97953164f6bd7f092 assets/create/models/item/cut_asurine_brick_wall.json +1ceb483f428448f00a08541fbcf4f4787aef3f1e assets/create/models/item/cut_asurine_bricks.json e81d7df1f1b8281c38400713b09cbac59c4d53cc assets/create/models/item/cut_asurine_slab.json cf534603fe71423e0ab80d431ab12394d0a6bb21 assets/create/models/item/cut_asurine_stairs.json 7ca803f5a7798ea034db6385a5f36a48e235c247 assets/create/models/item/cut_asurine_wall.json 707fb799ca44280cad0b817f29a7c75dd0f0ce5e assets/create/models/item/cut_calcite.json -5678b9f76823efac2c6624acc7b2b911402112f4 assets/create/models/item/cut_calcite_bricks.json f794423b242228c43345dc1f40653133fb7f3db6 assets/create/models/item/cut_calcite_brick_slab.json 8e9b46e52758ec7f21c3b84c212e2f6565bf71d9 assets/create/models/item/cut_calcite_brick_stairs.json 1447d21b7fc331528bfd15e5b9d694eb1a31cfb3 assets/create/models/item/cut_calcite_brick_wall.json +5678b9f76823efac2c6624acc7b2b911402112f4 assets/create/models/item/cut_calcite_bricks.json c78c99c78a19097d890414b21270014b52bafd8d assets/create/models/item/cut_calcite_slab.json e6a9144a4bb9e5af3f57d0acdb26d66dc4547217 assets/create/models/item/cut_calcite_stairs.json daf2a2513f6636d140c23b90ba87aad35476c498 assets/create/models/item/cut_calcite_wall.json 29f2bc72aa50cdf34d1d5bfd01a4512d5974dc65 assets/create/models/item/cut_crimsite.json -20bc810ca5b2a35a423e57f287e2f42ad9940b89 assets/create/models/item/cut_crimsite_bricks.json 7c37d3de9674e70595498d1c46c5693d9f39a502 assets/create/models/item/cut_crimsite_brick_slab.json b974c0f2f0e5119d9bac6a36946d4dfdd65b4b5f assets/create/models/item/cut_crimsite_brick_stairs.json c1289ddff572149b2171859689228615802dc825 assets/create/models/item/cut_crimsite_brick_wall.json +20bc810ca5b2a35a423e57f287e2f42ad9940b89 assets/create/models/item/cut_crimsite_bricks.json 8855eb44a68277668c77858715652d6851fa507f assets/create/models/item/cut_crimsite_slab.json 57101d3c2d570bc2c389c1e05e1354d79de70a0a assets/create/models/item/cut_crimsite_stairs.json a10cd65d675a05b9dfbdac67a2d9ca3b4381396a assets/create/models/item/cut_crimsite_wall.json a4ad900cf65136835c259c1e349781538d537a9c assets/create/models/item/cut_deepslate.json -81b10b5d159db4000f4f6569b83fc7e8f702f015 assets/create/models/item/cut_deepslate_bricks.json a63bbe474ca7d8ceafb6bfcb21a88841980fe8e6 assets/create/models/item/cut_deepslate_brick_slab.json 7c1ad49844eafbd87f8c69a077a8c18ccdd4a919 assets/create/models/item/cut_deepslate_brick_stairs.json 6a4ee2e810731e0702c1493237343a567cc736d6 assets/create/models/item/cut_deepslate_brick_wall.json +81b10b5d159db4000f4f6569b83fc7e8f702f015 assets/create/models/item/cut_deepslate_bricks.json ff0d08d1b59de36b016f7952d2bd72d8e1eb1293 assets/create/models/item/cut_deepslate_slab.json 627c806a6eba8b730682821deb31627d75683e88 assets/create/models/item/cut_deepslate_stairs.json 9bdb85a688b09eb34eb8024a6808406118f78133 assets/create/models/item/cut_deepslate_wall.json c33c48d71d98f4b8a84c7f0a4ee88918fed3e798 assets/create/models/item/cut_diorite.json -e8a697df63b0b5fa74dbc70e76b55718a2cc388f assets/create/models/item/cut_diorite_bricks.json 63bc297b782c40c513873b7f8fd8284abce01753 assets/create/models/item/cut_diorite_brick_slab.json f604d088c8c7c6d847795459231d0df8c73d95fb assets/create/models/item/cut_diorite_brick_stairs.json b06be3da6017aa7fbc38b8aecda0d30dae313c13 assets/create/models/item/cut_diorite_brick_wall.json +e8a697df63b0b5fa74dbc70e76b55718a2cc388f assets/create/models/item/cut_diorite_bricks.json 4650f375365caeb237947f6e933d174ebbfbc1e2 assets/create/models/item/cut_diorite_slab.json 933d14f51272b39fc13e94d58f3100469d7cbe06 assets/create/models/item/cut_diorite_stairs.json 0cc44bb9ad0ed3ff11bc6113d0a9e31e99b169b8 assets/create/models/item/cut_diorite_wall.json e2123180fd5312d1e67b3a030fcbc4b6f11aa8bf assets/create/models/item/cut_dripstone.json -4b5d7bbee5741b112e2cb354c5fe49c088fc9b2f assets/create/models/item/cut_dripstone_bricks.json a815b2a927853d6d82d8b69f862be3091c5c8caa assets/create/models/item/cut_dripstone_brick_slab.json b8cb1b04eb869a06ded04c4c3acac6e5a315ee78 assets/create/models/item/cut_dripstone_brick_stairs.json 87fafd603eb4ba41981cd9c9371ac4618909f94d assets/create/models/item/cut_dripstone_brick_wall.json +4b5d7bbee5741b112e2cb354c5fe49c088fc9b2f assets/create/models/item/cut_dripstone_bricks.json 756c801f6bba006fbfd3486e95ba870909ab2902 assets/create/models/item/cut_dripstone_slab.json c59d314e1b5cce1c3745ce164c2a094e17f7a003 assets/create/models/item/cut_dripstone_stairs.json 125b24d28a9957740855467440ad8508d21c24d7 assets/create/models/item/cut_dripstone_wall.json 2fbce0b481f7cf2cf4f0fd03c86ef743b7c30879 assets/create/models/item/cut_granite.json -d8860602cc52fac5a09354c56e78fdfd7d9cb6a9 assets/create/models/item/cut_granite_bricks.json 3584117ed8a69c3842fde1d6accfaaa2c72e44f4 assets/create/models/item/cut_granite_brick_slab.json c68d1c09b9091bc501279115be16f83508b88fed assets/create/models/item/cut_granite_brick_stairs.json 5a37b24319a8708e444902eae3596b68daaffd15 assets/create/models/item/cut_granite_brick_wall.json +d8860602cc52fac5a09354c56e78fdfd7d9cb6a9 assets/create/models/item/cut_granite_bricks.json c2f6603e8cbfc0cdf5e5ef10c6a4baef9c917b6d assets/create/models/item/cut_granite_slab.json 66f8e6d556446441e157427437e9563075e2d6ce assets/create/models/item/cut_granite_stairs.json fe06c8aeab9e4c8a145375af46cbdaed701baad4 assets/create/models/item/cut_granite_wall.json b5c3df9c28a14683a363769cad5d154af56b8da4 assets/create/models/item/cut_limestone.json -7d026353711a464400e69c7e86c9b9c6aa70bf6d assets/create/models/item/cut_limestone_bricks.json 2822ebe1d4211f240e31866759e25add5f0fb56d assets/create/models/item/cut_limestone_brick_slab.json 694dfb73585167011d8123d64f5896697594f4ce assets/create/models/item/cut_limestone_brick_stairs.json db8851d6a1b7604ca1ba7615e1f162f6f5220801 assets/create/models/item/cut_limestone_brick_wall.json +7d026353711a464400e69c7e86c9b9c6aa70bf6d assets/create/models/item/cut_limestone_bricks.json 75584aa5e06168d8866b022fcd72377351b774d9 assets/create/models/item/cut_limestone_slab.json 1df9a186a146e597b48da4c4461f1a98ecf3646a assets/create/models/item/cut_limestone_stairs.json b70ac5462ef4d0363332656aa7cb82919f679893 assets/create/models/item/cut_limestone_wall.json 92bc693db4e0ba6164cd35d4f5fa0982f3b8f796 assets/create/models/item/cut_ochrum.json -3e8e00c602b1fbce888e6fe22d9525f1c025129d assets/create/models/item/cut_ochrum_bricks.json 1edc47c279fadde74322d3fa89ef776bdd6fb354 assets/create/models/item/cut_ochrum_brick_slab.json 4678e2a97c73139b458cea657a55f74659bc36d5 assets/create/models/item/cut_ochrum_brick_stairs.json 85044ec7033cd4c6aa913c4c4bb6c0e3a4386023 assets/create/models/item/cut_ochrum_brick_wall.json +3e8e00c602b1fbce888e6fe22d9525f1c025129d assets/create/models/item/cut_ochrum_bricks.json e0e494fb7fa1767241507347318560335339a2a8 assets/create/models/item/cut_ochrum_slab.json de7c5917bcb14f398d39e3932bfe5e1967ed7a24 assets/create/models/item/cut_ochrum_stairs.json 5a8f8c84e95ee0ab97106a801a456282f5ac207c assets/create/models/item/cut_ochrum_wall.json 1631a807135cf993d9a81068c65e78face2f24e0 assets/create/models/item/cut_scorchia.json -5ecb9692e478e29d64aeb5867e8677671560755d assets/create/models/item/cut_scorchia_bricks.json ac3a29573ce099ac57f59d0a2f1cdc0a453e0621 assets/create/models/item/cut_scorchia_brick_slab.json d3a8a8e0e85aaaadccb18cdce33da54ae0e8a8d7 assets/create/models/item/cut_scorchia_brick_stairs.json 83be13f6cbd9a58e10869e4152066cf3b265f347 assets/create/models/item/cut_scorchia_brick_wall.json +5ecb9692e478e29d64aeb5867e8677671560755d assets/create/models/item/cut_scorchia_bricks.json 0fee2e7f8e80bbd33e4d928c8374e6dae65f0b1f assets/create/models/item/cut_scorchia_slab.json 88a6b3709bab76390ace6f641eac18d43c9d099f assets/create/models/item/cut_scorchia_stairs.json d733d43252bf27b6fb1d7e016dc77556c3d1eb71 assets/create/models/item/cut_scorchia_wall.json ce75fb80c38c94bf6bf631eeb756909decaaaab0 assets/create/models/item/cut_scoria.json -81aa0bd4ec878754043a107466dcd87d49b3697c assets/create/models/item/cut_scoria_bricks.json d78a5126aefdd4cd182f9ec0ddda64df00d0f01c assets/create/models/item/cut_scoria_brick_slab.json 661d49b996f9c97a333e7e39dd13a0476db6b142 assets/create/models/item/cut_scoria_brick_stairs.json 3be69c075b479ac53c6201d7d7224d399f8009b6 assets/create/models/item/cut_scoria_brick_wall.json +81aa0bd4ec878754043a107466dcd87d49b3697c assets/create/models/item/cut_scoria_bricks.json 824bedfbeec53ec8f539fe73c0a3c3d927a21aa4 assets/create/models/item/cut_scoria_slab.json 15560f1251f18d53fe1b71adc6be5060c4d8fb94 assets/create/models/item/cut_scoria_stairs.json e35ebcc4f7f7b94623af85b181d916e48fbbb5ed assets/create/models/item/cut_scoria_wall.json 71284d3d6dba230dbecd01eb015e0e65877b820d assets/create/models/item/cut_tuff.json -4de100799e290db3fd46923781a83e6a12654266 assets/create/models/item/cut_tuff_bricks.json 4c7d5fadb0b0eaecf2055a0cd279f9ec130b93d0 assets/create/models/item/cut_tuff_brick_slab.json 6f32b83c9f82424c0e2a2e0a8813eb44c2ac4527 assets/create/models/item/cut_tuff_brick_stairs.json 9088296b7677bddf16d670858a619d846a134ef6 assets/create/models/item/cut_tuff_brick_wall.json +4de100799e290db3fd46923781a83e6a12654266 assets/create/models/item/cut_tuff_bricks.json e9134027cc917e2e878456edb49bcfee382e73b1 assets/create/models/item/cut_tuff_slab.json 8235a34249197c100645b55ded5ff619a055d8a6 assets/create/models/item/cut_tuff_stairs.json a1626993eafa8d85dc950e17cbf78378ed64c7d2 assets/create/models/item/cut_tuff_wall.json a343c74f1e55426330df18f522e6d2a81276c499 assets/create/models/item/cut_veridium.json -3c3fd197f8e299ff90850e24c6507ea12f373123 assets/create/models/item/cut_veridium_bricks.json c1c5561ce31e237b7ea8f1adfb6a79e661b7f940 assets/create/models/item/cut_veridium_brick_slab.json f633006045ccfcdf486d7a240217229d6eed717e assets/create/models/item/cut_veridium_brick_stairs.json 8182109a002317dd8d2767b3828f8c44166a053f assets/create/models/item/cut_veridium_brick_wall.json +3c3fd197f8e299ff90850e24c6507ea12f373123 assets/create/models/item/cut_veridium_bricks.json 410b949304faa5856028f7c42ab762b7498ffd95 assets/create/models/item/cut_veridium_slab.json 62697c0922b11537914d2f4f84faa0b909ee518d assets/create/models/item/cut_veridium_stairs.json 3921d61a26d48d999cbb2f6645611e53ea71978b assets/create/models/item/cut_veridium_wall.json @@ -2104,12 +2104,12 @@ badd4326fac0b0a1590a2e9bce7c2cdd4e4562f3 assets/create/models/item/empty_schemat 7ec3ed4aaab72d76f6414447bbb3ad7887adf61f assets/create/models/item/encased_fan.json 3e1fdcc80fd68199b1890bcc830f78c48e7c0e43 assets/create/models/item/experience_block.json 9775e83414c0febb5c5b832437b0580e91bcbff3 assets/create/models/item/experience_nugget.json -87add851ae3271d733c9e6888865c288b6716f3b assets/create/models/item/exposed_copper_shingles.json 721c8ac46bf23abec2bbf4cff6dbfdf96cc569a6 assets/create/models/item/exposed_copper_shingle_slab.json 6e1c7fcd8da84dc2d49adb9802ce4fb431eddae1 assets/create/models/item/exposed_copper_shingle_stairs.json -fa7ffb172a43774cc07a2bb201e7010a2549001d assets/create/models/item/exposed_copper_tiles.json +87add851ae3271d733c9e6888865c288b6716f3b assets/create/models/item/exposed_copper_shingles.json a443633d90ef9ac2a866b69b2ecdfad1841dc3e1 assets/create/models/item/exposed_copper_tile_slab.json 9bb425a14635fc8b36a9a95f3d0c54e0b129b7b4 assets/create/models/item/exposed_copper_tile_stairs.json +fa7ffb172a43774cc07a2bb201e7010a2549001d assets/create/models/item/exposed_copper_tiles.json 8b64a93d9b6e33e3caa66adb7a0cc8c5cd473023 assets/create/models/item/extendo_grip.json 9114fa2e92ea4b7bf949b2e5a26290b0bade1af3 assets/create/models/item/factory_gauge.json dad31483f65baaf187e6553e3cd301c5d69e9db4 assets/create/models/item/filter.json @@ -2139,11 +2139,11 @@ b8d6d2d163e2ab5f654bbc4eda9ad63f8064d27c assets/create/models/item/gray_seat.jso 334fd81d5e6574220ee5815f1452b4f4aa7ad223 assets/create/models/item/green_table_cloth.json 561e0579101bf602b252c0b9a5eec468c89d0e40 assets/create/models/item/green_toolbox.json 7d3ddad087b4d2c6a32f97092533cbfb5de0cb3b assets/create/models/item/green_valve_handle.json -9e352162c8135773a4eca41871beea8f3ca650ae assets/create/models/item/handheld_worldshaper.json dac0331061c464e6d3e2070b232781c632840191 assets/create/models/item/hand_crank.json +9e352162c8135773a4eca41871beea8f3ca650ae assets/create/models/item/handheld_worldshaper.json 7bb435c53cbf935d80a28746125aebbd6263e45c assets/create/models/item/haunted_bell.json -81d67fb0e59f25762a412990884813c72d399d55 assets/create/models/item/honeyed_apple.json 2e97629313eab1a4ac4b38785dbe7ed45346e625 assets/create/models/item/honey_bucket.json +81d67fb0e59f25762a412990884813c72d399d55 assets/create/models/item/honeyed_apple.json 70185e640169d6253f06fb98f31b240f4807a53e assets/create/models/item/horizontal_framed_glass.json e623c9541adc0fa877c5615e3211f47886383f2d assets/create/models/item/horizontal_framed_glass_pane.json 58b6f4ec2af3a69ae7145fb25d73451b6e8a2834 assets/create/models/item/hose_pulley.json @@ -2184,13 +2184,13 @@ b56a28924b0b1b2530ebac7834e011700b09b966 assets/create/models/item/light_gray_po cc8834024208662cb100f7cd38a04637da3b6852 assets/create/models/item/light_gray_table_cloth.json c8513eb1c89652783e26d7dcfcf64afa97619bc8 assets/create/models/item/light_gray_toolbox.json 3774d23e76b5712e7004e333e0a770f2230c2998 assets/create/models/item/light_gray_valve_handle.json -8f53caad3899a30be5087a0ba155080834418cc0 assets/create/models/item/limestone.json -fba1e7d1cad39c89976b427db62544d80f47ad5d assets/create/models/item/limestone_pillar.json 26b8e1daf9cc4b206fb5f62904c7f1701ba93e67 assets/create/models/item/lime_postbox.json 32cd55a1c97a31a13ad106a457ec9925aa91f6d3 assets/create/models/item/lime_seat.json a0843c3731fa3c4d23bc2b91fd68410fcf1df149 assets/create/models/item/lime_table_cloth.json 931d187c11cb95a0eeae8f256187ef551b42007e assets/create/models/item/lime_toolbox.json d0f4148bdb0a905e68f54b5dfd829fd47e528fea assets/create/models/item/lime_valve_handle.json +8f53caad3899a30be5087a0ba155080834418cc0 assets/create/models/item/limestone.json +fba1e7d1cad39c89976b427db62544d80f47ad5d assets/create/models/item/limestone_pillar.json 1d30f9b525e8e9736b34a92f848e235c71fd6bd8 assets/create/models/item/linear_chassis.json 8f622f5f79446f6060d9e8815205fce919c8c829 assets/create/models/item/linked_controller.json 538e28af9013a43c258a659cbe67671991f3eee7 assets/create/models/item/magenta_postbox.json @@ -2235,15 +2235,15 @@ af50363d603d61340b336569d58c1febde253665 assets/create/models/item/ochrum.json 7e767ca9e0ddb769b38fabd9289648ac63f5413d assets/create/models/item/orange_valve_handle.json 82152bca4310111d91584a2a78f05e158bb4bd90 assets/create/models/item/ornate_iron_window.json f9064c1f199bcd8db321078e2363ed91cb2acc09 assets/create/models/item/ornate_iron_window_pane.json -09b3cd8ff7b29a6dd59f739a95bb708646d23537 assets/create/models/item/oxidized_copper_shingles.json c9c7ccdb68de2e77cd9f7053fab19493dd30a985 assets/create/models/item/oxidized_copper_shingle_slab.json 89c5f7a0a28f238ebed2641e243a47e4be2ad5ab assets/create/models/item/oxidized_copper_shingle_stairs.json -1c3428e2aed32a013631db012642a34d4eaf0785 assets/create/models/item/oxidized_copper_tiles.json +09b3cd8ff7b29a6dd59f739a95bb708646d23537 assets/create/models/item/oxidized_copper_shingles.json f1af7c5f3840efc3ae07940ee6719eb3417a0e1a assets/create/models/item/oxidized_copper_tile_slab.json ef2fe68d407a03bf1ed8f2d2f3e7323777d061bb assets/create/models/item/oxidized_copper_tile_stairs.json -b21a1f3ee7de3e17f69d27fd13ae6b23b62aa22c assets/create/models/item/packager.json +1c3428e2aed32a013631db012642a34d4eaf0785 assets/create/models/item/oxidized_copper_tiles.json 5b974e55caffdbfc2156eb8b59dd99db12243bd3 assets/create/models/item/package_filter.json 7fd76e7d2e6c6d94352f1fa08d096b63616ad01e assets/create/models/item/package_frogport.json +b21a1f3ee7de3e17f69d27fd13ae6b23b62aa22c assets/create/models/item/packager.json 76aeceb41bb7df873dbafe1bd5e26deb24abf93f assets/create/models/item/peculiar_bell.json ab6c05a0468f3f4295a07adb362fa2d36cf6e3e8 assets/create/models/item/pink_postbox.json df13d4281dc45041ecd93504d45daef61d070581 assets/create/models/item/pink_seat.json @@ -2334,15 +2334,15 @@ f982794c2e01a70fcc2bb009bcb8cd06a2ea5510 assets/create/models/item/rare_jinx_pac 7830b48ef4292922f0ef13f9a7c2ee7d47366169 assets/create/models/item/rare_simi_package.json 5f8e5283fbebb452f1a1141b33ee73f08879c75d assets/create/models/item/raw_zinc.json 4631d67976cef148c346a7016baaa6703e4f243e assets/create/models/item/raw_zinc_block.json -9dc6c52e258b00cac6ed23147983045c43218b5d assets/create/models/item/redstone_contact.json -f8f733364bdd32b2ad597e81103bc02344ce63bd assets/create/models/item/redstone_link.json -ae0ba4827a81bd51c5c01178c2ccdae3a722628a assets/create/models/item/redstone_requester.json 4b73ee9cc2651a3d1a97476d100f9c4d7e2b2efe assets/create/models/item/red_postbox.json 8d00eb1a10055a802556eab10e13f522d12acd1c assets/create/models/item/red_sand_paper.json b64a054c92cbd2e055502d470f3921d1077e63a1 assets/create/models/item/red_seat.json 359d9bdb2496140e297a1e5a98c9563bc09d56b9 assets/create/models/item/red_table_cloth.json ac4695cc465d094b4adba1a4e9efec42c916f37d assets/create/models/item/red_toolbox.json 02473f42ef4b53dc809c7c58ae657c014bfaf652 assets/create/models/item/red_valve_handle.json +9dc6c52e258b00cac6ed23147983045c43218b5d assets/create/models/item/redstone_contact.json +f8f733364bdd32b2ad597e81103bc02344ce63bd assets/create/models/item/redstone_link.json +ae0ba4827a81bd51c5c01178c2ccdae3a722628a assets/create/models/item/redstone_requester.json 9926bbe6dad7c4c1a146492116d232e941c80d2b assets/create/models/item/refined_radiance.json bf827486dc7a1b3aeae577844d2dab2a97051db9 assets/create/models/item/refined_radiance_casing.json a982c29763d90556cca03074c168462a52cb9526 assets/create/models/item/repackager.json @@ -2356,9 +2356,9 @@ d45005a89e2c0d29944e0112be274365e0e318a5 assets/create/models/item/rose_quartz_t 670e978a34faf6a3acd7880b2f94c2574178d586 assets/create/models/item/sand_paper.json 6854451e331242ec50c186a545538024b07ec123 assets/create/models/item/schedule.json 0effa517c214ba07dba2f4ed12dfcf4785e42dd8 assets/create/models/item/schematic.json -8b7727844d8c12c3c22828c7f65fc7ac2d273e36 assets/create/models/item/schematicannon.json 2a52f084fa8187dd8da28fe820dde50c47a93b57 assets/create/models/item/schematic_and_quill.json 4c8b34627001e35ee15412a0cd037d0f24ba914e assets/create/models/item/schematic_table.json +8b7727844d8c12c3c22828c7f65fc7ac2d273e36 assets/create/models/item/schematicannon.json 2955563914c2f84ed06474c135062e91189ddf3a assets/create/models/item/scorchia.json 669041e5ad29d2166cc8895f85aa262040671d3e assets/create/models/item/scorchia_pillar.json ff52eb59dadfe675e416440f3115856a501428a6 assets/create/models/item/scoria.json @@ -2369,63 +2369,63 @@ abaa6da82babc26717ffff44fc41327bd015c9a6 assets/create/models/item/shadow_steel. ffaec38d11b91add4e150e33d0e0e49394f5beca assets/create/models/item/shadow_steel_casing.json b6fcd9722e5a09a9207964cba68752512e3b945a assets/create/models/item/shaft.json 617c6e2f759b2a95da7ee7192a2661afc6f6e8f8 assets/create/models/item/shopping_list.json -58ca190177e77db90c8195347c29d52c2cd0c556 assets/create/models/item/small_andesite_bricks.json fa92996fada8545fc340fb401bd0568f56809bf0 assets/create/models/item/small_andesite_brick_slab.json 08474bf814a55795c1f94203ceb8a969be2a2132 assets/create/models/item/small_andesite_brick_stairs.json 0e00bc6aa5be242217ed6fe8cbe1ccdf180742fb assets/create/models/item/small_andesite_brick_wall.json -543055fabb706a93037c6a9e47c334508e41b06c assets/create/models/item/small_asurine_bricks.json +58ca190177e77db90c8195347c29d52c2cd0c556 assets/create/models/item/small_andesite_bricks.json b160c3277f00f19687cffb87f9cb3aa32d3633aa assets/create/models/item/small_asurine_brick_slab.json 183fa4919f06e8c3c10f1efeceefd55389a96102 assets/create/models/item/small_asurine_brick_stairs.json d6a5ffdb493fb2c8176a7e6b42e05c2d393a2782 assets/create/models/item/small_asurine_brick_wall.json -26d9361e33e362a772220146724c0927453831e0 assets/create/models/item/small_calcite_bricks.json +543055fabb706a93037c6a9e47c334508e41b06c assets/create/models/item/small_asurine_bricks.json 8c1b5d5d40393636c9ff10afc09038c89bc1b383 assets/create/models/item/small_calcite_brick_slab.json 481ce90fb6abb05c904f01df3fe635f702bbfac0 assets/create/models/item/small_calcite_brick_stairs.json 02adb90bdf06a7c4c57d09dfd3c77cceef9b7fbe assets/create/models/item/small_calcite_brick_wall.json -d5a033d3dedb799c4752b7e68b6881529f38f8e5 assets/create/models/item/small_crimsite_bricks.json +26d9361e33e362a772220146724c0927453831e0 assets/create/models/item/small_calcite_bricks.json 8f382537c99eac3335f72db8dba33ab71f99a919 assets/create/models/item/small_crimsite_brick_slab.json b5d012cf0c5c94b73e6825b6884ab1d3eee7d64e assets/create/models/item/small_crimsite_brick_stairs.json 236457bb16bc7e949c16f3f091ee74dc3f3e6973 assets/create/models/item/small_crimsite_brick_wall.json -6ce2cb7882f41fcbcd641a442c98767bda61f65f assets/create/models/item/small_deepslate_bricks.json +d5a033d3dedb799c4752b7e68b6881529f38f8e5 assets/create/models/item/small_crimsite_bricks.json ce79900b7aa1eff0d42cabcd0a7f80ef20824551 assets/create/models/item/small_deepslate_brick_slab.json a260711af72c749a6b72f72515bbecb2e01e3ed8 assets/create/models/item/small_deepslate_brick_stairs.json 4e474891c6a269166c2eb413fae78699e5657af4 assets/create/models/item/small_deepslate_brick_wall.json -e412eaa393965ef5426c3d8d95d5c9d69e37e054 assets/create/models/item/small_diorite_bricks.json +6ce2cb7882f41fcbcd641a442c98767bda61f65f assets/create/models/item/small_deepslate_bricks.json 55b82c2f30d52acee5c3807ab2ffaed1d773cfa8 assets/create/models/item/small_diorite_brick_slab.json 49a17610b5b05595894ca2683056cecd724c1111 assets/create/models/item/small_diorite_brick_stairs.json dd3630a9c5500e6cf09e95d09e7a3cc99db11899 assets/create/models/item/small_diorite_brick_wall.json -c29d35da520d0fe828bb364db403b8cdf55f0a2e assets/create/models/item/small_dripstone_bricks.json +e412eaa393965ef5426c3d8d95d5c9d69e37e054 assets/create/models/item/small_diorite_bricks.json 21e281ec7a82d48018366a0737c6867f625b4663 assets/create/models/item/small_dripstone_brick_slab.json 6862e72eedf80536f40b6ac42ff78f13f62d012f assets/create/models/item/small_dripstone_brick_stairs.json ca8613bb64ceb562c36dd1d6a3b76b5f15f35be9 assets/create/models/item/small_dripstone_brick_wall.json -81eae95d20a9e99a070dfb8f6e6c22ef29f628d3 assets/create/models/item/small_granite_bricks.json +c29d35da520d0fe828bb364db403b8cdf55f0a2e assets/create/models/item/small_dripstone_bricks.json a19aa13eb3c04a9e0931e22e4170eec80950efab assets/create/models/item/small_granite_brick_slab.json 51bc02587cad5dfcfaf9d040848faa5277a25a5f assets/create/models/item/small_granite_brick_stairs.json 147a6f42be8312fbf050ad53c1625a1458f73cc3 assets/create/models/item/small_granite_brick_wall.json -bfa76583bca68134bbe2793c263cc0b71e1406af assets/create/models/item/small_limestone_bricks.json +81eae95d20a9e99a070dfb8f6e6c22ef29f628d3 assets/create/models/item/small_granite_bricks.json a9599981e872e683dacd01b2f0af511f416dd526 assets/create/models/item/small_limestone_brick_slab.json d8f8eadea13fc90a1c8ee5aca4be71fb22a79fd0 assets/create/models/item/small_limestone_brick_stairs.json 67626afe8b0fc9135456a24ea49c602b83d6970d assets/create/models/item/small_limestone_brick_wall.json -2d4b22d4028c55cbabc7eb405c2c6d485390afab assets/create/models/item/small_ochrum_bricks.json +bfa76583bca68134bbe2793c263cc0b71e1406af assets/create/models/item/small_limestone_bricks.json f7547aacb8bdaf61424cd56565e40d3cd40a1cfa assets/create/models/item/small_ochrum_brick_slab.json 8a320ff9e75e16a182cb7d07784a595fe7876e04 assets/create/models/item/small_ochrum_brick_stairs.json 0eedd4fe5b0a82de16fed148836087ff4ae64a74 assets/create/models/item/small_ochrum_brick_wall.json +2d4b22d4028c55cbabc7eb405c2c6d485390afab assets/create/models/item/small_ochrum_bricks.json 97b8e3eaddac0b93d4b6bc140f573969fcba5823 assets/create/models/item/small_rose_quartz_tiles.json -ac1bf1d2344517c18b945afa198d5d05e2866f6b assets/create/models/item/small_scorchia_bricks.json 63ef9901ba1014027e8c873d8374d86abb73158e assets/create/models/item/small_scorchia_brick_slab.json f52601fe54695c225a595a65e9130665582db856 assets/create/models/item/small_scorchia_brick_stairs.json b4e0db087dc88e0a3a4a82197a0ce347d3c7a7aa assets/create/models/item/small_scorchia_brick_wall.json -25b6bb40701e782ed64414ec8391b304ad5e6b12 assets/create/models/item/small_scoria_bricks.json +ac1bf1d2344517c18b945afa198d5d05e2866f6b assets/create/models/item/small_scorchia_bricks.json a4bdeb066dcc44f8be058e6d9dfc0a3fd34819bf assets/create/models/item/small_scoria_brick_slab.json 5ffb0e7de917013cd82cece2506d72fce2cd5fc6 assets/create/models/item/small_scoria_brick_stairs.json 67dcbc7d52fbbe88f89b36e04f970b27024741e4 assets/create/models/item/small_scoria_brick_wall.json -90943707d8b232d816392bec8ae05e06b6eedd72 assets/create/models/item/small_tuff_bricks.json +25b6bb40701e782ed64414ec8391b304ad5e6b12 assets/create/models/item/small_scoria_bricks.json 91a144100eea8b4e67a0a4f31b35a714693fa001 assets/create/models/item/small_tuff_brick_slab.json b3f89c9f8e46fbdfc58171073d6ad91c588e5853 assets/create/models/item/small_tuff_brick_stairs.json 52c1d4cfb5f1726c9ccbb00db60bdd6f760bf40f assets/create/models/item/small_tuff_brick_wall.json -6935d6d9dbdb99fe7258d9347419d65571711263 assets/create/models/item/small_veridium_bricks.json +90943707d8b232d816392bec8ae05e06b6eedd72 assets/create/models/item/small_tuff_bricks.json 0bb60fc6ab570db83214fd10c83d931f6677e361 assets/create/models/item/small_veridium_brick_slab.json 89918d98b6830477b21ab7fb9e30807d3ca1d379 assets/create/models/item/small_veridium_brick_stairs.json ab4e7695e99548f83a89f3d5ad7690a576bafcc0 assets/create/models/item/small_veridium_brick_wall.json +6935d6d9dbdb99fe7258d9347419d65571711263 assets/create/models/item/small_veridium_bricks.json 6cf508dbd3d015ea730366db92bb17844dc2ca06 assets/create/models/item/smart_chute.json 9201f00edcf2ffa33cb079c28b5c33e39872c824 assets/create/models/item/smart_fluid_pipe.json 67804bdd890f167010f6101a700e85a3245f4cc3 assets/create/models/item/speedometer.json @@ -2436,9 +2436,9 @@ b82ab0c69df330f6f938ed1beee7b4add67d2e50 assets/create/models/item/steam_engine. 24acc593a5e910b6301afcb3f23cba526d23a0ab assets/create/models/item/steam_whistle.json 54f200be903e056e5cf9e2186f0a0a51f8f0f84e assets/create/models/item/sticker.json 0f88de164439640cc175ceef2017f7416b5a7018 assets/create/models/item/sticky_mechanical_piston.json -4b640b66765b206f8c2884b7c1a1ef860b81d841 assets/create/models/item/stockpile_switch.json c04a4ef6debb04d305d74d9b034c1e95c6b9e956 assets/create/models/item/stock_link.json 67c98c6c7f2122850acfbee34688572934fdd226 assets/create/models/item/stock_ticker.json +4b640b66765b206f8c2884b7c1a1ef860b81d841 assets/create/models/item/stockpile_switch.json 6ee792277b9fd980c40e18e841afa63fc500ed0b assets/create/models/item/stressometer.json 8d4ce1ccf180016506292f63188c10d0dabe0ee3 assets/create/models/item/sturdy_sheet.json a10bb4d6d1a4483a806e3aaa086d48c0e20aaefe assets/create/models/item/super_glue.json @@ -2465,36 +2465,36 @@ b0f6d37aa695395e28a23d36775092f63ab3f5a5 assets/create/models/item/vertical_gear 9c5087114e35052c5e56bb752252de5d092408c5 assets/create/models/item/warped_window.json 83502f4b8d0134e793611b36a56cca59af097ed5 assets/create/models/item/warped_window_pane.json e5939b47bf7440dc101c667e68ef6bf750a3290f assets/create/models/item/water_wheel.json -be2f058a7ecb015599ee052ec27c4360d636999a assets/create/models/item/waxed_copper_shingles.json adc188e4e48bea80607c6e0c7076c9bdd7236cb0 assets/create/models/item/waxed_copper_shingle_slab.json 7e224aceaa94361256e95e4c44d8814aebaf297c assets/create/models/item/waxed_copper_shingle_stairs.json -eced19a2f721c54b968e5979cde2705f15faf3e1 assets/create/models/item/waxed_copper_tiles.json +be2f058a7ecb015599ee052ec27c4360d636999a assets/create/models/item/waxed_copper_shingles.json 68b3632c34adb9991aa993385f53624632c260f2 assets/create/models/item/waxed_copper_tile_slab.json a7fc0cc2d32dcd49c3274597ce7121f01fca03f8 assets/create/models/item/waxed_copper_tile_stairs.json -5336907eba067492f6d00b4b8514f9663830a1d5 assets/create/models/item/waxed_exposed_copper_shingles.json +eced19a2f721c54b968e5979cde2705f15faf3e1 assets/create/models/item/waxed_copper_tiles.json fd428034c46a240c4bb2a1aee625b8767f41c3ef assets/create/models/item/waxed_exposed_copper_shingle_slab.json 43d714187fe6c0cd1ed7abcddef1ebcd63979ff4 assets/create/models/item/waxed_exposed_copper_shingle_stairs.json -962b24b3611abefc21920d01452944710ab0da3f assets/create/models/item/waxed_exposed_copper_tiles.json +5336907eba067492f6d00b4b8514f9663830a1d5 assets/create/models/item/waxed_exposed_copper_shingles.json 25f5a10fe8e6acbdbf8457d56aeee065835a93ec assets/create/models/item/waxed_exposed_copper_tile_slab.json 22917505d328fb5b489b9f7f9068f1514b784abb assets/create/models/item/waxed_exposed_copper_tile_stairs.json -12c3dd893bddb66b9b387652c67c8f0e24b643ff assets/create/models/item/waxed_oxidized_copper_shingles.json +962b24b3611abefc21920d01452944710ab0da3f assets/create/models/item/waxed_exposed_copper_tiles.json 9b7c82376ea8c1c8ecbc7bbe15283f84b0d50d94 assets/create/models/item/waxed_oxidized_copper_shingle_slab.json fbb6043eb935aa0641a482ee7300c780be257440 assets/create/models/item/waxed_oxidized_copper_shingle_stairs.json -6b8f75d4818db903b22f4626d02671ab76a61023 assets/create/models/item/waxed_oxidized_copper_tiles.json +12c3dd893bddb66b9b387652c67c8f0e24b643ff assets/create/models/item/waxed_oxidized_copper_shingles.json 6e7bc8eb9a87d903dcc590e9918ce8d4411bf190 assets/create/models/item/waxed_oxidized_copper_tile_slab.json 10136759b31e4d957e8374948460d6c984711326 assets/create/models/item/waxed_oxidized_copper_tile_stairs.json -ce2dcfc01205da1dc70f34091a2c24f563e72466 assets/create/models/item/waxed_weathered_copper_shingles.json +6b8f75d4818db903b22f4626d02671ab76a61023 assets/create/models/item/waxed_oxidized_copper_tiles.json 2bf249c677d30a4febf950fa7c6caa87c348c54e assets/create/models/item/waxed_weathered_copper_shingle_slab.json 9fa84f2555d82b5a1550b748a332ceb443a04fae assets/create/models/item/waxed_weathered_copper_shingle_stairs.json -02d2ac048c9bea86d10673254dfc107f3c9c5bb5 assets/create/models/item/waxed_weathered_copper_tiles.json +ce2dcfc01205da1dc70f34091a2c24f563e72466 assets/create/models/item/waxed_weathered_copper_shingles.json ab40b1a5a03cd290d53ef2ea65f90dcfcd2673de assets/create/models/item/waxed_weathered_copper_tile_slab.json dadc7b65a4527e288c21a20df978796a8c444fd2 assets/create/models/item/waxed_weathered_copper_tile_stairs.json -86b8e71fa8b7aeb73eafda89d8d06d83da6a5d25 assets/create/models/item/weathered_copper_shingles.json +02d2ac048c9bea86d10673254dfc107f3c9c5bb5 assets/create/models/item/waxed_weathered_copper_tiles.json 94db30ad2381d2f2c37cdfd0d5ce5c45a2807640 assets/create/models/item/weathered_copper_shingle_slab.json 7262c01df4b5a8cd8c6a5545062f251d5ad9fd06 assets/create/models/item/weathered_copper_shingle_stairs.json -99f17b16b68201aefb78298b3e6c657e3c2235e0 assets/create/models/item/weathered_copper_tiles.json +86b8e71fa8b7aeb73eafda89d8d06d83da6a5d25 assets/create/models/item/weathered_copper_shingles.json 0b1b299d6dfab65b6060305a8b3e51f6e2df09f4 assets/create/models/item/weathered_copper_tile_slab.json 0c3989b44fde934ba8b88b071887e5ede522c417 assets/create/models/item/weathered_copper_tile_stairs.json +99f17b16b68201aefb78298b3e6c657e3c2235e0 assets/create/models/item/weathered_copper_tiles.json b5d591fbb40e062efe301b3b3b49580e5ad64566 assets/create/models/item/weathered_iron_block.json a569ddd725898a86f8745e46723edeff7fe7f2e9 assets/create/models/item/weathered_iron_window.json a262cbdf9aa0c240f623dcadd42864d280d36978 assets/create/models/item/weathered_iron_window_pane.json @@ -2533,42 +2533,42 @@ b25b8c230fde8d6d77e8d516bed52236652b5ca6 data/create/advancements/recipes/buildi 537fe5dffa659e5838379587fbd84f2f641551ea data/create/advancements/recipes/building_blocks/calcite_pillar_from_stone_types_calcite_stonecutting.json 2636ac059b6412a46402cccbe5abe4fb49143662 data/create/advancements/recipes/building_blocks/cherry_window.json 3e08f575543f1e0abea979dbaee643572734788b data/create/advancements/recipes/building_blocks/cherry_window_pane.json -09f332cd34e6a92af9e8e4e757418c7ba8b536da data/create/advancements/recipes/building_blocks/copper_shingles_from_ingots_copper_stonecutting.json 55214a0fd27318b17163cace66c7525785127ef8 data/create/advancements/recipes/building_blocks/copper_shingle_slab.json fb4210dbbfb74459e10da94a540f3bfdf91c4a8d data/create/advancements/recipes/building_blocks/copper_shingle_slab_from_copper_shingles_stonecutting.json 31b04ac1b117fb65f5129c5bbb48e42c1c4c1003 data/create/advancements/recipes/building_blocks/copper_shingle_stairs.json bef4a9a4c2e722d4f086d6b4c9d6fa1d0836ec10 data/create/advancements/recipes/building_blocks/copper_shingle_stairs_from_copper_shingles_stonecutting.json -f66a48f01afb4fa1babee4a8c28b032280c3ac9e data/create/advancements/recipes/building_blocks/copper_tiles_from_ingots_copper_stonecutting.json +09f332cd34e6a92af9e8e4e757418c7ba8b536da data/create/advancements/recipes/building_blocks/copper_shingles_from_ingots_copper_stonecutting.json ef79744ebf31453d1c81789afed7b717837b3515 data/create/advancements/recipes/building_blocks/copper_tile_slab.json 8e9997c43b1c06521fe8d38b04ccb3f04c93d537 data/create/advancements/recipes/building_blocks/copper_tile_slab_from_copper_tiles_stonecutting.json a2609aa8b5453f2294f38c81d26e0b8dad71087d data/create/advancements/recipes/building_blocks/copper_tile_stairs.json d47e46c66bf69e8310e6687716858842e8aed7b5 data/create/advancements/recipes/building_blocks/copper_tile_stairs_from_copper_tiles_stonecutting.json +f66a48f01afb4fa1babee4a8c28b032280c3ac9e data/create/advancements/recipes/building_blocks/copper_tiles_from_ingots_copper_stonecutting.json cc14d10c75ab0fdd7c54db1922e5e56667739fef data/create/advancements/recipes/building_blocks/copycat_panel_from_ingots_zinc_stonecutting.json 55d2812be912c857ff666d581174378857d3bce2 data/create/advancements/recipes/building_blocks/copycat_step_from_ingots_zinc_stonecutting.json -8615fc107b1f4df86711081a9dccac8631b02e6b data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_shingles_from_honeycomb.json 0e0eba8550768ef69087dff8112814f25233fab7 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_shingle_slab_from_honeycomb.json 2c960d55273df4c0c8c33b2c329175b35b18fc8c data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_shingle_stairs_from_honeycomb.json -fa8f3ed9a4c6f0c3cd4c21b0ae4dc8ca4dba8678 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_tiles_from_honeycomb.json +8615fc107b1f4df86711081a9dccac8631b02e6b data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_shingles_from_honeycomb.json d6f2aa7fd10c96f71c47bdabb3e53dc4c4e73706 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_tile_slab_from_honeycomb.json eca165eee20adba1557ccc74ef50ee90311b3019 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_tile_stairs_from_honeycomb.json -88a236933e8dfe0d809bda098d16782288c4800c data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_shingles_from_honeycomb.json +fa8f3ed9a4c6f0c3cd4c21b0ae4dc8ca4dba8678 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_tiles_from_honeycomb.json 301149dabc4dce290b4884f4ed3cb2132123adf0 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_shingle_slab_from_honeycomb.json f360dce7bece72672f2624710c88edbe3e3f8885 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_shingle_stairs_from_honeycomb.json -bc27959288766492746f41c4810350dcef1b320d data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_tiles_from_honeycomb.json +88a236933e8dfe0d809bda098d16782288c4800c data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_shingles_from_honeycomb.json 7ceb4b74ff84ed404518b6cb5e1432dac5903b5f data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_tile_slab_from_honeycomb.json ec1eec3bc25534484cb264134e62b578525422aa data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_tile_stairs_from_honeycomb.json -2e8f1da032110e8c5ec375ffd425e5eed7f58cae data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_shingles_from_honeycomb.json +bc27959288766492746f41c4810350dcef1b320d data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_tiles_from_honeycomb.json e34abb4d51c1d00419fc3d3799ca0d9fe7ea1027 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_shingle_slab_from_honeycomb.json 9471e190beb603f022fb234f2cf35b5b4b93f0c0 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_shingle_stairs_from_honeycomb.json -17fe14b753953a68887cd001fcaa264ef031463f data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_tiles_from_honeycomb.json +2e8f1da032110e8c5ec375ffd425e5eed7f58cae data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_shingles_from_honeycomb.json 2577754364f05264fac325f67597230d01fa0c1d data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_tile_slab_from_honeycomb.json 003e384d9594a4e6ef5678e74f04b56de047dbde data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_tile_stairs_from_honeycomb.json -5009a82a897a15407fec785005107b0d228fffe7 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_shingles_from_honeycomb.json +17fe14b753953a68887cd001fcaa264ef031463f data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_tiles_from_honeycomb.json 70ce32937dcf349dce77fef8022bc0c15863f6a6 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_shingle_slab_from_honeycomb.json 1fc498238dcc2705152573ba7f74bb50e7e66ca7 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_shingle_stairs_from_honeycomb.json -d12aa3dd5457327224fd007211878eec21043971 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_tiles_from_honeycomb.json +5009a82a897a15407fec785005107b0d228fffe7 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_shingles_from_honeycomb.json 6f461d7036de914c636b7916dc798775ccf25be1 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_tile_slab_from_honeycomb.json 3bc9efcddecd23fd06c6056a0ee7b937959cecc0 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_tile_stairs_from_honeycomb.json +d12aa3dd5457327224fd007211878eec21043971 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_tiles_from_honeycomb.json 3064c52dea808a00c211bfedb96106b563f480da data/create/advancements/recipes/building_blocks/crafting/kinetics/black_seat.json f07a0b21db200ab68a7df02db519869f68953286 data/create/advancements/recipes/building_blocks/crafting/kinetics/black_seat_from_other_seat.json 80ac4db5c53c7efc2666a7abb4e2e876c5f86588 data/create/advancements/recipes/building_blocks/crafting/kinetics/blue_seat.json @@ -2669,7 +2669,6 @@ f3188b24f8108be4219016689a4768f826b4fef3 data/create/advancements/recipes/buildi e88373b83226d860b0c2131213f5d3b09f31ab96 data/create/advancements/recipes/building_blocks/crimsite_pillar_from_stone_types_crimsite_stonecutting.json 09f7122cf360fd56bde2b1659bbed526f9a119c4 data/create/advancements/recipes/building_blocks/crimson_window.json b5234c6050bc0c6fe872a5ddc87d46ba39e07971 data/create/advancements/recipes/building_blocks/crimson_window_pane.json -b32f4345517c3c7299a06489325bd85f987145dc data/create/advancements/recipes/building_blocks/cut_andesite_bricks_from_stone_types_andesite_stonecutting.json 22fe2e61d7e9836d9f71c39bfbba50efc2fa184d data/create/advancements/recipes/building_blocks/cut_andesite_brick_slab.json 6d8d28364f1016dfd1d7cbe4a2637e2b6224e4d8 data/create/advancements/recipes/building_blocks/cut_andesite_brick_slab_from_stone_types_andesite_stonecutting.json 39e904f66d2194de5437b5da2f8db8b6f03d78f4 data/create/advancements/recipes/building_blocks/cut_andesite_brick_slab_recycling.json @@ -2677,6 +2676,7 @@ b32f4345517c3c7299a06489325bd85f987145dc data/create/advancements/recipes/buildi 480c696956b99c96cbaf46e7dad9711c40680ec8 data/create/advancements/recipes/building_blocks/cut_andesite_brick_stairs_from_stone_types_andesite_stonecutting.json 8d504cdb99f5dc59bef5ff35d0b443f2f4ba21d2 data/create/advancements/recipes/building_blocks/cut_andesite_brick_wall.json e1b8e5906d54368c98867b83143dc7acc7b0aa28 data/create/advancements/recipes/building_blocks/cut_andesite_brick_wall_from_stone_types_andesite_stonecutting.json +b32f4345517c3c7299a06489325bd85f987145dc data/create/advancements/recipes/building_blocks/cut_andesite_bricks_from_stone_types_andesite_stonecutting.json d5b44158f9a98d874d941fc4df99de7a2657af21 data/create/advancements/recipes/building_blocks/cut_andesite_from_stone_types_andesite_stonecutting.json c11998f554bbd42efdbdf58cf8efe5bcf69230de data/create/advancements/recipes/building_blocks/cut_andesite_slab.json 1f457c0e816e4dd70e1a960015d2004814d11926 data/create/advancements/recipes/building_blocks/cut_andesite_slab_from_stone_types_andesite_stonecutting.json @@ -2685,7 +2685,6 @@ a4d7adf49472a2069bad72defd39b111b83def3d data/create/advancements/recipes/buildi 6d38bb2b9812761c594ebdf717284ba8d32e88bc data/create/advancements/recipes/building_blocks/cut_andesite_stairs_from_stone_types_andesite_stonecutting.json 2f6b2296b11e0e743d68749e65af5ffa0f374998 data/create/advancements/recipes/building_blocks/cut_andesite_wall.json caf3b1c62d0f8df3ce126535f0566c899577bedb data/create/advancements/recipes/building_blocks/cut_andesite_wall_from_stone_types_andesite_stonecutting.json -54188623046e989d21e6e155933e4084fb2882c4 data/create/advancements/recipes/building_blocks/cut_asurine_bricks_from_stone_types_asurine_stonecutting.json 536a2bed2ed1e7e249886ef376c96a8d5a1facdc data/create/advancements/recipes/building_blocks/cut_asurine_brick_slab.json a4e833cadfbb82222a70d66524e804c83ea13f7b data/create/advancements/recipes/building_blocks/cut_asurine_brick_slab_from_stone_types_asurine_stonecutting.json 610163ac2f4b06121931a81ac4b3df39ece61998 data/create/advancements/recipes/building_blocks/cut_asurine_brick_slab_recycling.json @@ -2693,6 +2692,7 @@ a4e833cadfbb82222a70d66524e804c83ea13f7b data/create/advancements/recipes/buildi f92f31e80cc026160217afb6c757987f75ed0b33 data/create/advancements/recipes/building_blocks/cut_asurine_brick_stairs_from_stone_types_asurine_stonecutting.json fa6dc7eaa32652a00a7217ae25967de0791088b6 data/create/advancements/recipes/building_blocks/cut_asurine_brick_wall.json 33f361369bfd92f53b3e40c837b336edd04a26e9 data/create/advancements/recipes/building_blocks/cut_asurine_brick_wall_from_stone_types_asurine_stonecutting.json +54188623046e989d21e6e155933e4084fb2882c4 data/create/advancements/recipes/building_blocks/cut_asurine_bricks_from_stone_types_asurine_stonecutting.json a6b871faa10badaaaa1a0ebbba94c4f2f627c43f data/create/advancements/recipes/building_blocks/cut_asurine_from_stone_types_asurine_stonecutting.json 719e1d4fea3457f2990be6a5d6cd87915d546217 data/create/advancements/recipes/building_blocks/cut_asurine_slab.json 586918291dda711c79941cf484cb62dbb853a271 data/create/advancements/recipes/building_blocks/cut_asurine_slab_from_stone_types_asurine_stonecutting.json @@ -2701,7 +2701,6 @@ bd2a630d242ae9c89b071b0401285068071a346c data/create/advancements/recipes/buildi 03d7b1609d161043e28661d74f53b06d4408f561 data/create/advancements/recipes/building_blocks/cut_asurine_stairs_from_stone_types_asurine_stonecutting.json cba4a6feaf695e665204cac36f9109ba941b12a6 data/create/advancements/recipes/building_blocks/cut_asurine_wall.json 3327651dd3f2fd778abdcfe70d25137d916f3def data/create/advancements/recipes/building_blocks/cut_asurine_wall_from_stone_types_asurine_stonecutting.json -44873f9d05abde7d52a6eacdf3573d8b69c69452 data/create/advancements/recipes/building_blocks/cut_calcite_bricks_from_stone_types_calcite_stonecutting.json a070ffe63c182b33c4c6faedb391f51a209c0e27 data/create/advancements/recipes/building_blocks/cut_calcite_brick_slab.json 7ba1e7add81422599f798153e4fd069e9fbfdebf data/create/advancements/recipes/building_blocks/cut_calcite_brick_slab_from_stone_types_calcite_stonecutting.json f5e80ec393c306485d666d6f9f91c55d9f1ba592 data/create/advancements/recipes/building_blocks/cut_calcite_brick_slab_recycling.json @@ -2709,6 +2708,7 @@ f5e80ec393c306485d666d6f9f91c55d9f1ba592 data/create/advancements/recipes/buildi 627f85aa63133cf95dd828092e0232b9ec8acfd5 data/create/advancements/recipes/building_blocks/cut_calcite_brick_stairs_from_stone_types_calcite_stonecutting.json d8870e522a68274cc90eab07ea17b7b6cdc5a16c data/create/advancements/recipes/building_blocks/cut_calcite_brick_wall.json cdf5927f3c1b3ef8904f38f66317412799e189fb data/create/advancements/recipes/building_blocks/cut_calcite_brick_wall_from_stone_types_calcite_stonecutting.json +44873f9d05abde7d52a6eacdf3573d8b69c69452 data/create/advancements/recipes/building_blocks/cut_calcite_bricks_from_stone_types_calcite_stonecutting.json 9f8c31b0db2aab8f1c8f42bcef15a74bc36887d4 data/create/advancements/recipes/building_blocks/cut_calcite_from_stone_types_calcite_stonecutting.json 857666ad1c6a5cc886f6896a18f560098afaa67b data/create/advancements/recipes/building_blocks/cut_calcite_slab.json c55074cd091b0e078105abdc940c62afa8984265 data/create/advancements/recipes/building_blocks/cut_calcite_slab_from_stone_types_calcite_stonecutting.json @@ -2717,7 +2717,6 @@ c55074cd091b0e078105abdc940c62afa8984265 data/create/advancements/recipes/buildi ba3378e1d08de2af0b2a725727cf9f68bda60044 data/create/advancements/recipes/building_blocks/cut_calcite_stairs_from_stone_types_calcite_stonecutting.json db5f4e1eee91c2a65d36164c20aba0e9d3a502ae data/create/advancements/recipes/building_blocks/cut_calcite_wall.json 19de370083d2cf1234c9c4e6ff45d85ef34a1ac8 data/create/advancements/recipes/building_blocks/cut_calcite_wall_from_stone_types_calcite_stonecutting.json -b9a2edda241f6e0677a2003300f0be5d3ff8f4b0 data/create/advancements/recipes/building_blocks/cut_crimsite_bricks_from_stone_types_crimsite_stonecutting.json 9fda0e6edde197a9c28a854419a2a07e323b6b53 data/create/advancements/recipes/building_blocks/cut_crimsite_brick_slab.json 2da3f139759be7eea552885b2063a0e2dfc647b1 data/create/advancements/recipes/building_blocks/cut_crimsite_brick_slab_from_stone_types_crimsite_stonecutting.json 62d928c8ab2e09a3f87adacb5adb1a5ddc1d2a7b data/create/advancements/recipes/building_blocks/cut_crimsite_brick_slab_recycling.json @@ -2725,6 +2724,7 @@ b9a2edda241f6e0677a2003300f0be5d3ff8f4b0 data/create/advancements/recipes/buildi 89850244feb8a3293ba96702b7a56a4bea84e1f3 data/create/advancements/recipes/building_blocks/cut_crimsite_brick_stairs_from_stone_types_crimsite_stonecutting.json 267cab789c73d474299542fb0719967501fcf0c9 data/create/advancements/recipes/building_blocks/cut_crimsite_brick_wall.json 27007676b86eb8a3498982d8b5e68495b84d62d5 data/create/advancements/recipes/building_blocks/cut_crimsite_brick_wall_from_stone_types_crimsite_stonecutting.json +b9a2edda241f6e0677a2003300f0be5d3ff8f4b0 data/create/advancements/recipes/building_blocks/cut_crimsite_bricks_from_stone_types_crimsite_stonecutting.json a88d252d4e634ff194daa3ff98fd7e965e3ed09a data/create/advancements/recipes/building_blocks/cut_crimsite_from_stone_types_crimsite_stonecutting.json f703136e1783a42252bc1d89c31e5563cbdff583 data/create/advancements/recipes/building_blocks/cut_crimsite_slab.json 3330d332462da22de48d07b62277c1df8e646a3e data/create/advancements/recipes/building_blocks/cut_crimsite_slab_from_stone_types_crimsite_stonecutting.json @@ -2733,7 +2733,6 @@ c2707e5969f0c554537dda9d3e2a4c13e19863c3 data/create/advancements/recipes/buildi e9ba513178090b020525e72468a0450e225da779 data/create/advancements/recipes/building_blocks/cut_crimsite_stairs_from_stone_types_crimsite_stonecutting.json 7fb5ce65b7b5c2d76b4306d407aaa6eefe07b7e5 data/create/advancements/recipes/building_blocks/cut_crimsite_wall.json a83d5b669f92bd833af2768d2cf5d4797a86b63c data/create/advancements/recipes/building_blocks/cut_crimsite_wall_from_stone_types_crimsite_stonecutting.json -bc9eb21df37df4b69e5d202b3b770698a16f4413 data/create/advancements/recipes/building_blocks/cut_deepslate_bricks_from_stone_types_deepslate_stonecutting.json 2c380e8ddc83cef4213f136ff7a196d861728914 data/create/advancements/recipes/building_blocks/cut_deepslate_brick_slab.json 87b5dfc1e61fabe4e7661bea0d7a56cb75197a81 data/create/advancements/recipes/building_blocks/cut_deepslate_brick_slab_from_stone_types_deepslate_stonecutting.json 09cde6df1120cc5f5f129023885f323b4d1eeae9 data/create/advancements/recipes/building_blocks/cut_deepslate_brick_slab_recycling.json @@ -2741,6 +2740,7 @@ bc9eb21df37df4b69e5d202b3b770698a16f4413 data/create/advancements/recipes/buildi 28e15fe2c377540cb631f6648f49090f234e7704 data/create/advancements/recipes/building_blocks/cut_deepslate_brick_stairs_from_stone_types_deepslate_stonecutting.json d2b34f455ab0053f24a4f9dec7dcce45832ef25b data/create/advancements/recipes/building_blocks/cut_deepslate_brick_wall.json 7b174b65b813b4a9ca507e71fa142931e074f336 data/create/advancements/recipes/building_blocks/cut_deepslate_brick_wall_from_stone_types_deepslate_stonecutting.json +bc9eb21df37df4b69e5d202b3b770698a16f4413 data/create/advancements/recipes/building_blocks/cut_deepslate_bricks_from_stone_types_deepslate_stonecutting.json 83db3f5b46c996481b930974bddba75c82c115af data/create/advancements/recipes/building_blocks/cut_deepslate_from_stone_types_deepslate_stonecutting.json 8e8816aad8212c3557e77cc01df551fe1a0a306d data/create/advancements/recipes/building_blocks/cut_deepslate_slab.json 14ea447072200733dd9551a5ac6a9544593dd9f7 data/create/advancements/recipes/building_blocks/cut_deepslate_slab_from_stone_types_deepslate_stonecutting.json @@ -2749,7 +2749,6 @@ c7870abb459c8b174c380282ae211a87ab252521 data/create/advancements/recipes/buildi 4f157401a3019c96cc6ae5a0036f31351c651fbb data/create/advancements/recipes/building_blocks/cut_deepslate_stairs_from_stone_types_deepslate_stonecutting.json 9ae9635fa129aab54a7ec971b9cc61d300d3d53e data/create/advancements/recipes/building_blocks/cut_deepslate_wall.json 9b5df53000c79a7b20e3a1888e003b704809feda data/create/advancements/recipes/building_blocks/cut_deepslate_wall_from_stone_types_deepslate_stonecutting.json -fdef99789ca74623b00b05be2f975b63831645db data/create/advancements/recipes/building_blocks/cut_diorite_bricks_from_stone_types_diorite_stonecutting.json 30a00465dc9b19d8024146e2c2d6b9f41562da30 data/create/advancements/recipes/building_blocks/cut_diorite_brick_slab.json a55e7daf48a487d74b4a01e30b80968094154d2b data/create/advancements/recipes/building_blocks/cut_diorite_brick_slab_from_stone_types_diorite_stonecutting.json e445a3d8fd00f5e4f2ee56c797d8abf548598447 data/create/advancements/recipes/building_blocks/cut_diorite_brick_slab_recycling.json @@ -2757,6 +2756,7 @@ b421f24513612dd7a5d8977d7bff122fd5cf9522 data/create/advancements/recipes/buildi 3fe00adac35beeda79b7f9d930a1f13b033c0f12 data/create/advancements/recipes/building_blocks/cut_diorite_brick_stairs_from_stone_types_diorite_stonecutting.json 6d2235b8587863107a6d1a0818c81ee3dc217cdf data/create/advancements/recipes/building_blocks/cut_diorite_brick_wall.json 0ec4b69e98adf961f5d4d63700f11ad66a4116b5 data/create/advancements/recipes/building_blocks/cut_diorite_brick_wall_from_stone_types_diorite_stonecutting.json +fdef99789ca74623b00b05be2f975b63831645db data/create/advancements/recipes/building_blocks/cut_diorite_bricks_from_stone_types_diorite_stonecutting.json c9f52e0661fdc266f8429faf1570124fecfa2d6a data/create/advancements/recipes/building_blocks/cut_diorite_from_stone_types_diorite_stonecutting.json c7b73ddec6402e8b5ff5daedbbbc74f882338a8e data/create/advancements/recipes/building_blocks/cut_diorite_slab.json 46c841e5aae99106cbc28026dcfec946976127e5 data/create/advancements/recipes/building_blocks/cut_diorite_slab_from_stone_types_diorite_stonecutting.json @@ -2765,7 +2765,6 @@ ce67a5fae622955ad795e2b3d14c159a4c47b936 data/create/advancements/recipes/buildi 3b7ec28df80ea9cf87980b2c2184858ba6152a3f data/create/advancements/recipes/building_blocks/cut_diorite_stairs_from_stone_types_diorite_stonecutting.json c8fe9ab53eda2cdbff08678ebb577c169ea61a91 data/create/advancements/recipes/building_blocks/cut_diorite_wall.json 050f67b5a662bea3ef972521ef7f81c2ba99015c data/create/advancements/recipes/building_blocks/cut_diorite_wall_from_stone_types_diorite_stonecutting.json -b60683fdd629b201f40a6f9bb6594df7c5ac13f1 data/create/advancements/recipes/building_blocks/cut_dripstone_bricks_from_stone_types_dripstone_stonecutting.json 1e0d39ed56e2ab4eac084f26a1c6de905db29220 data/create/advancements/recipes/building_blocks/cut_dripstone_brick_slab.json 020cbc4c8063d186d3f5c9ece429e4cdff53cf63 data/create/advancements/recipes/building_blocks/cut_dripstone_brick_slab_from_stone_types_dripstone_stonecutting.json b44c9e7f9f62ffffb5566901e0a22010ba76641c data/create/advancements/recipes/building_blocks/cut_dripstone_brick_slab_recycling.json @@ -2773,6 +2772,7 @@ b44c9e7f9f62ffffb5566901e0a22010ba76641c data/create/advancements/recipes/buildi 466fbdf7de8dacd1032fb7af690862bb68707876 data/create/advancements/recipes/building_blocks/cut_dripstone_brick_stairs_from_stone_types_dripstone_stonecutting.json 253b54c191c933e88fa6a9b4e7c94340082c7d60 data/create/advancements/recipes/building_blocks/cut_dripstone_brick_wall.json e176568e3de8b8ca17a788f4cea89002b5ad2d1d data/create/advancements/recipes/building_blocks/cut_dripstone_brick_wall_from_stone_types_dripstone_stonecutting.json +b60683fdd629b201f40a6f9bb6594df7c5ac13f1 data/create/advancements/recipes/building_blocks/cut_dripstone_bricks_from_stone_types_dripstone_stonecutting.json ddc5a16cf0d2790d8133ab6801f4c55317d776e4 data/create/advancements/recipes/building_blocks/cut_dripstone_from_stone_types_dripstone_stonecutting.json 6e40c9af0747a8b3adb805ddd8fbb947aedb408c data/create/advancements/recipes/building_blocks/cut_dripstone_slab.json e7761f71f797d2e62dc0860cbd5153955b9be86c data/create/advancements/recipes/building_blocks/cut_dripstone_slab_from_stone_types_dripstone_stonecutting.json @@ -2781,7 +2781,6 @@ a199a9f78a44f4313a922b317893c68f743dc1a9 data/create/advancements/recipes/buildi b68a95a565ee9a3aec017431aa5b8cc6fffec3ef data/create/advancements/recipes/building_blocks/cut_dripstone_stairs_from_stone_types_dripstone_stonecutting.json a4287f34f95c008bdf7c0a886d05c3960665147b data/create/advancements/recipes/building_blocks/cut_dripstone_wall.json 76f5d4a6a9895064b15ae0c0f27a138bb3d57dbf data/create/advancements/recipes/building_blocks/cut_dripstone_wall_from_stone_types_dripstone_stonecutting.json -24cc01d592faf2bad57fc9b9a1de52c50d225446 data/create/advancements/recipes/building_blocks/cut_granite_bricks_from_stone_types_granite_stonecutting.json 83148f66dc7418740b6f9b6a660b0b9306d87f7c data/create/advancements/recipes/building_blocks/cut_granite_brick_slab.json d982802fc11848c87022f7bf05cecf090953002a data/create/advancements/recipes/building_blocks/cut_granite_brick_slab_from_stone_types_granite_stonecutting.json 6b8fa161725a4e2106226c3591a23def74398f48 data/create/advancements/recipes/building_blocks/cut_granite_brick_slab_recycling.json @@ -2789,6 +2788,7 @@ ce1c81b730b3acef9673f41769339f7d68385348 data/create/advancements/recipes/buildi e9732e3beaefbc6a457e0c4fd61f17f429f1cd8c data/create/advancements/recipes/building_blocks/cut_granite_brick_stairs_from_stone_types_granite_stonecutting.json 4f403aee2aae6aa0fc334b434cf5ade362153329 data/create/advancements/recipes/building_blocks/cut_granite_brick_wall.json 625c8849b5c07835b49dcb4322ec44586628a700 data/create/advancements/recipes/building_blocks/cut_granite_brick_wall_from_stone_types_granite_stonecutting.json +24cc01d592faf2bad57fc9b9a1de52c50d225446 data/create/advancements/recipes/building_blocks/cut_granite_bricks_from_stone_types_granite_stonecutting.json 07e6f3835c3683f007fd25140d671b668706484d data/create/advancements/recipes/building_blocks/cut_granite_from_stone_types_granite_stonecutting.json 2f33b7f82e977eb3fd0e0283313b1066eadadd18 data/create/advancements/recipes/building_blocks/cut_granite_slab.json a1b406ca98c2ba7d5225afea8463d586fc538428 data/create/advancements/recipes/building_blocks/cut_granite_slab_from_stone_types_granite_stonecutting.json @@ -2797,7 +2797,6 @@ af12a2d8f8bb2382f55135df8cfec00692a65fe3 data/create/advancements/recipes/buildi 284087e07acd28aa869d5433375e412f083108e9 data/create/advancements/recipes/building_blocks/cut_granite_stairs_from_stone_types_granite_stonecutting.json dbfb50c3d5048b1f5d8d74f39c389ecec81392d7 data/create/advancements/recipes/building_blocks/cut_granite_wall.json 6b287be7a900dbd715290b069a89ab226d6cec9c data/create/advancements/recipes/building_blocks/cut_granite_wall_from_stone_types_granite_stonecutting.json -4ef0a018dcf0b470061a4b1dbadc27684d8d467f data/create/advancements/recipes/building_blocks/cut_limestone_bricks_from_stone_types_limestone_stonecutting.json b0ade7dab7eb095f07882e4c19884162f18e704c data/create/advancements/recipes/building_blocks/cut_limestone_brick_slab.json 4fc2dc61d62a394cebc91e36745699eeaee650e7 data/create/advancements/recipes/building_blocks/cut_limestone_brick_slab_from_stone_types_limestone_stonecutting.json b8ec42f06ce9eb696643154d16150a223bd5ec65 data/create/advancements/recipes/building_blocks/cut_limestone_brick_slab_recycling.json @@ -2805,6 +2804,7 @@ d0b19c27309cd45d08a6a0cd779f1930bc2e7469 data/create/advancements/recipes/buildi 9f65617405592d587a940ff7513fcb34ca6ab423 data/create/advancements/recipes/building_blocks/cut_limestone_brick_stairs_from_stone_types_limestone_stonecutting.json 281e2ddcb58b603dea8f305ed6c8ddea98d0d030 data/create/advancements/recipes/building_blocks/cut_limestone_brick_wall.json 7b0ab5095a7d2b3e876a8c8b990161851c1c58c2 data/create/advancements/recipes/building_blocks/cut_limestone_brick_wall_from_stone_types_limestone_stonecutting.json +4ef0a018dcf0b470061a4b1dbadc27684d8d467f data/create/advancements/recipes/building_blocks/cut_limestone_bricks_from_stone_types_limestone_stonecutting.json f8663a45d71c52a3982c75bbfb61653c8d2fd668 data/create/advancements/recipes/building_blocks/cut_limestone_from_stone_types_limestone_stonecutting.json 9e22972cd4f2d673cfcf07a597f6a14402c91913 data/create/advancements/recipes/building_blocks/cut_limestone_slab.json 388a57bb88582eda9fef904a530f72b066d24e7d data/create/advancements/recipes/building_blocks/cut_limestone_slab_from_stone_types_limestone_stonecutting.json @@ -2813,7 +2813,6 @@ f8663a45d71c52a3982c75bbfb61653c8d2fd668 data/create/advancements/recipes/buildi b6dc46dca3fc039fd0fe53ab791731cb085c3b62 data/create/advancements/recipes/building_blocks/cut_limestone_stairs_from_stone_types_limestone_stonecutting.json a9382d5f876542bf4fa8aed605352daca4ad2f6f data/create/advancements/recipes/building_blocks/cut_limestone_wall.json 69d9116786c53cb3155bed4580d4b01bfe638243 data/create/advancements/recipes/building_blocks/cut_limestone_wall_from_stone_types_limestone_stonecutting.json -1f8ee1a91937295484d5c2fe0186a617589c1761 data/create/advancements/recipes/building_blocks/cut_ochrum_bricks_from_stone_types_ochrum_stonecutting.json a51d6ebed8e21e8808ccfbe9f9540291504da59a data/create/advancements/recipes/building_blocks/cut_ochrum_brick_slab.json eb08f00651259f83f6eced0f90dd8df0e9d0d508 data/create/advancements/recipes/building_blocks/cut_ochrum_brick_slab_from_stone_types_ochrum_stonecutting.json a189e0549723cefbd19a147274cd79909dca2b70 data/create/advancements/recipes/building_blocks/cut_ochrum_brick_slab_recycling.json @@ -2821,6 +2820,7 @@ a5dc9e74ad0d18d83bad3aab8c5e2768355a2370 data/create/advancements/recipes/buildi 27a5331727199b8b8f2dd6c581e25d17d12fc1ba data/create/advancements/recipes/building_blocks/cut_ochrum_brick_stairs_from_stone_types_ochrum_stonecutting.json 648e532441c664310047c5c9c78833d2eaea5920 data/create/advancements/recipes/building_blocks/cut_ochrum_brick_wall.json 053256b7b154ba5c10d2483d86658f132296e8f5 data/create/advancements/recipes/building_blocks/cut_ochrum_brick_wall_from_stone_types_ochrum_stonecutting.json +1f8ee1a91937295484d5c2fe0186a617589c1761 data/create/advancements/recipes/building_blocks/cut_ochrum_bricks_from_stone_types_ochrum_stonecutting.json 6abb6e36229685ca26ee31b5db3074a07453435e data/create/advancements/recipes/building_blocks/cut_ochrum_from_stone_types_ochrum_stonecutting.json 0c5e92fb20048fe5d9dcd42e10fd0f9b155c385a data/create/advancements/recipes/building_blocks/cut_ochrum_slab.json 941aba0ff7967d7ea56e1f811aa6bc34d4711796 data/create/advancements/recipes/building_blocks/cut_ochrum_slab_from_stone_types_ochrum_stonecutting.json @@ -2829,7 +2829,6 @@ fa14009e4de8cfdacdbb7679473ce359f2cb85be data/create/advancements/recipes/buildi d50accd7f37bfd9384790bdd727401757f6dc7e4 data/create/advancements/recipes/building_blocks/cut_ochrum_stairs_from_stone_types_ochrum_stonecutting.json ed0a72f6393c0d16240b89241f5bbac7dc003516 data/create/advancements/recipes/building_blocks/cut_ochrum_wall.json cda838f95015b0bf02fc5427e1a69ed6302b7e20 data/create/advancements/recipes/building_blocks/cut_ochrum_wall_from_stone_types_ochrum_stonecutting.json -a51cd5a82d9b30c8a68f7cdf8dd7a6b2f883c27c data/create/advancements/recipes/building_blocks/cut_scorchia_bricks_from_stone_types_scorchia_stonecutting.json ce33e5a98a83dae1f37ad4b3d4ea148de5bcacdf data/create/advancements/recipes/building_blocks/cut_scorchia_brick_slab.json 498825e9e5502a7ec8a1f23bfe998b960d7fc9eb data/create/advancements/recipes/building_blocks/cut_scorchia_brick_slab_from_stone_types_scorchia_stonecutting.json 8ffa08b1b4e4ab37dfbf09d2ec4a37f93c9503cb data/create/advancements/recipes/building_blocks/cut_scorchia_brick_slab_recycling.json @@ -2837,6 +2836,7 @@ ce33e5a98a83dae1f37ad4b3d4ea148de5bcacdf data/create/advancements/recipes/buildi 3c4b45560f446534821da63d4e713088928e5f4a data/create/advancements/recipes/building_blocks/cut_scorchia_brick_stairs_from_stone_types_scorchia_stonecutting.json 2aba76185175fff82898a7a905d3ec4ff448deaa data/create/advancements/recipes/building_blocks/cut_scorchia_brick_wall.json ca1f54af4425df994c6707f00e43b8db3ce66280 data/create/advancements/recipes/building_blocks/cut_scorchia_brick_wall_from_stone_types_scorchia_stonecutting.json +a51cd5a82d9b30c8a68f7cdf8dd7a6b2f883c27c data/create/advancements/recipes/building_blocks/cut_scorchia_bricks_from_stone_types_scorchia_stonecutting.json df847f312960866d3d53f48297ea3169c27314eb data/create/advancements/recipes/building_blocks/cut_scorchia_from_stone_types_scorchia_stonecutting.json 8095f7be8aac4f11d618549680d537bed8a921c5 data/create/advancements/recipes/building_blocks/cut_scorchia_slab.json a53831cf7f095fa4d0d92051bd0e21f912c2d9dd data/create/advancements/recipes/building_blocks/cut_scorchia_slab_from_stone_types_scorchia_stonecutting.json @@ -2845,7 +2845,6 @@ a53831cf7f095fa4d0d92051bd0e21f912c2d9dd data/create/advancements/recipes/buildi 30f1efaa46771dd22d7f3aa34f24c69bbdb59bd5 data/create/advancements/recipes/building_blocks/cut_scorchia_stairs_from_stone_types_scorchia_stonecutting.json e02d188d64b270682fa9d335a3423880d8358a0d data/create/advancements/recipes/building_blocks/cut_scorchia_wall.json 834c5a2a8d089822fa81a75b290818db276beab7 data/create/advancements/recipes/building_blocks/cut_scorchia_wall_from_stone_types_scorchia_stonecutting.json -2030ec21c96336bd4c4040857f40ec65d1a75075 data/create/advancements/recipes/building_blocks/cut_scoria_bricks_from_stone_types_scoria_stonecutting.json 705dfcd9f4b6b8a0c360436c097cb371c27cf60d data/create/advancements/recipes/building_blocks/cut_scoria_brick_slab.json 482cf1bbb65a4facc0ebf31ea91bab4d03580635 data/create/advancements/recipes/building_blocks/cut_scoria_brick_slab_from_stone_types_scoria_stonecutting.json 51d070acfc8ad4cd8ca4457ca346458c81eaade4 data/create/advancements/recipes/building_blocks/cut_scoria_brick_slab_recycling.json @@ -2853,6 +2852,7 @@ e02d188d64b270682fa9d335a3423880d8358a0d data/create/advancements/recipes/buildi 99ca117e6a4ad242d92566a2f398c28edb3b7061 data/create/advancements/recipes/building_blocks/cut_scoria_brick_stairs_from_stone_types_scoria_stonecutting.json 01e294976d8ce71b59fb14a47e2686bdce4fab21 data/create/advancements/recipes/building_blocks/cut_scoria_brick_wall.json 0c1d31d37a17d4bd752508022ddd9690bb92a521 data/create/advancements/recipes/building_blocks/cut_scoria_brick_wall_from_stone_types_scoria_stonecutting.json +2030ec21c96336bd4c4040857f40ec65d1a75075 data/create/advancements/recipes/building_blocks/cut_scoria_bricks_from_stone_types_scoria_stonecutting.json 41f420c88dbf61d3cb51966cca9b495d10c604d3 data/create/advancements/recipes/building_blocks/cut_scoria_from_stone_types_scoria_stonecutting.json 26c8447854e29243f0697236f59e258fa96ed369 data/create/advancements/recipes/building_blocks/cut_scoria_slab.json f3e2522664de4ff2ad92a89443e064ac857b7aef data/create/advancements/recipes/building_blocks/cut_scoria_slab_from_stone_types_scoria_stonecutting.json @@ -2861,7 +2861,6 @@ a0635452fd698415e8112e9e0f6d71571901ca34 data/create/advancements/recipes/buildi 1bb047298b71a57e8632607af7b17bab2690aecb data/create/advancements/recipes/building_blocks/cut_scoria_stairs_from_stone_types_scoria_stonecutting.json a33878fe778438a746a28c1fd03ca6d01092ebe4 data/create/advancements/recipes/building_blocks/cut_scoria_wall.json 74a637d0d0f360ad692661c0213c18a06a8ec500 data/create/advancements/recipes/building_blocks/cut_scoria_wall_from_stone_types_scoria_stonecutting.json -f0870d596d9ac9e5b5272fb4e3d2c90c29f3a63d data/create/advancements/recipes/building_blocks/cut_tuff_bricks_from_stone_types_tuff_stonecutting.json b75410afdb8775b2a834ded315913e0ae38e4df8 data/create/advancements/recipes/building_blocks/cut_tuff_brick_slab.json 34c2aead2f2355a8f0f9f9aa7dba58dd5187dbba data/create/advancements/recipes/building_blocks/cut_tuff_brick_slab_from_stone_types_tuff_stonecutting.json c071c43e93cc1735bebbbf320f1b8d2cba4be1e3 data/create/advancements/recipes/building_blocks/cut_tuff_brick_slab_recycling.json @@ -2869,6 +2868,7 @@ c89ec2300425688f9e72e45c64def0b09c0219b0 data/create/advancements/recipes/buildi c882f72f5a31bc92a8186834b105a2e07d864366 data/create/advancements/recipes/building_blocks/cut_tuff_brick_stairs_from_stone_types_tuff_stonecutting.json 70295775a6170a1332f5604aaf75a026630c9e93 data/create/advancements/recipes/building_blocks/cut_tuff_brick_wall.json 1b79d0e71dae77967c1554c203e68eeb51fe8054 data/create/advancements/recipes/building_blocks/cut_tuff_brick_wall_from_stone_types_tuff_stonecutting.json +f0870d596d9ac9e5b5272fb4e3d2c90c29f3a63d data/create/advancements/recipes/building_blocks/cut_tuff_bricks_from_stone_types_tuff_stonecutting.json 549d1f911c009a3cafff4edcb37116c92c2b8e21 data/create/advancements/recipes/building_blocks/cut_tuff_from_stone_types_tuff_stonecutting.json 5bc3e40a8e50a521ebd5fa58efa3ec21064163f7 data/create/advancements/recipes/building_blocks/cut_tuff_slab.json f1ab5be6cb7287517d87b173680ddf833a1dd534 data/create/advancements/recipes/building_blocks/cut_tuff_slab_from_stone_types_tuff_stonecutting.json @@ -2877,7 +2877,6 @@ b7d19085017530f0c2122511c35dbef6a50b337f data/create/advancements/recipes/buildi 3c9541b6e4eb8ff7f7b627a75e8c38ed9eeaf342 data/create/advancements/recipes/building_blocks/cut_tuff_stairs_from_stone_types_tuff_stonecutting.json 51ca798b8bd822ddbbfe8f07073eefb948b97b42 data/create/advancements/recipes/building_blocks/cut_tuff_wall.json 1aa1a0d00c19069f0c55e698b474115d7f437355 data/create/advancements/recipes/building_blocks/cut_tuff_wall_from_stone_types_tuff_stonecutting.json -6a80920618d8e9b7919c83c419e751971440d38a data/create/advancements/recipes/building_blocks/cut_veridium_bricks_from_stone_types_veridium_stonecutting.json e263f555c3a47c83187d29ae9b816edc0c1a763b data/create/advancements/recipes/building_blocks/cut_veridium_brick_slab.json f0e84bde804e52f504cd93bee5058a89f6939dc9 data/create/advancements/recipes/building_blocks/cut_veridium_brick_slab_from_stone_types_veridium_stonecutting.json 949fe819c76fd63edfd93bef5898119c8456fda3 data/create/advancements/recipes/building_blocks/cut_veridium_brick_slab_recycling.json @@ -2885,6 +2884,7 @@ fc87560dedbc951d10d9650a6f27192e7c3a1cc5 data/create/advancements/recipes/buildi 35b09d6300ff8e86f01bc0258fca5cfa80d55c61 data/create/advancements/recipes/building_blocks/cut_veridium_brick_stairs_from_stone_types_veridium_stonecutting.json 599d9ce510531c6006a4964bb4049a850a8457ee data/create/advancements/recipes/building_blocks/cut_veridium_brick_wall.json aaaad7a65a1c05071565ca91a181ff3c375e0141 data/create/advancements/recipes/building_blocks/cut_veridium_brick_wall_from_stone_types_veridium_stonecutting.json +6a80920618d8e9b7919c83c419e751971440d38a data/create/advancements/recipes/building_blocks/cut_veridium_bricks_from_stone_types_veridium_stonecutting.json c76ae7944646e8f13ea460ba6655b95b6c2798ea data/create/advancements/recipes/building_blocks/cut_veridium_from_stone_types_veridium_stonecutting.json 3bafa8873b62cb0333b44af77f2c6e824c5b3e95 data/create/advancements/recipes/building_blocks/cut_veridium_slab.json 143f64b0e5536693262f6a62c2a6fbf85bd4203e data/create/advancements/recipes/building_blocks/cut_veridium_slab_from_stone_types_veridium_stonecutting.json @@ -3070,7 +3070,6 @@ c4c087911453bd979e028d3b3558b273e3cb5926 data/create/advancements/recipes/buildi 780bb3d13fcd8abf6e166b04566b141e023ee11e data/create/advancements/recipes/building_blocks/scorchia_pillar_from_stone_types_scorchia_stonecutting.json 5c5c5080c1136c046caee2d14dd2c3c9f09abad3 data/create/advancements/recipes/building_blocks/scoria_from_stone_types_scoria_stonecutting.json 5a6b12869ffcbd1d9b4fbe1fee444fcde95d2953 data/create/advancements/recipes/building_blocks/scoria_pillar_from_stone_types_scoria_stonecutting.json -a51ca3151c517113338720edeac0e02a46ebb03a data/create/advancements/recipes/building_blocks/small_andesite_bricks_from_stone_types_andesite_stonecutting.json f72093994236a0580c6cafd08fb42f061733de01 data/create/advancements/recipes/building_blocks/small_andesite_brick_slab.json 05092201e6c514d3eae566fb1ce98ad415660112 data/create/advancements/recipes/building_blocks/small_andesite_brick_slab_from_stone_types_andesite_stonecutting.json 0e41d75b613a0ebd0c023669dcfd34f11b14fd0e data/create/advancements/recipes/building_blocks/small_andesite_brick_slab_recycling.json @@ -3078,7 +3077,7 @@ f72093994236a0580c6cafd08fb42f061733de01 data/create/advancements/recipes/buildi 8bbf898cbc47ac7a326c0d082a92a452b6915a7e data/create/advancements/recipes/building_blocks/small_andesite_brick_stairs_from_stone_types_andesite_stonecutting.json 9e0685dd668550c67812d1caccd8c8cae9f2041c data/create/advancements/recipes/building_blocks/small_andesite_brick_wall.json 7a1bfa848f950482f82d7fe7a9cf3cf916f91702 data/create/advancements/recipes/building_blocks/small_andesite_brick_wall_from_stone_types_andesite_stonecutting.json -0bfa788d0038077a88678ff16104a8b82038b3da data/create/advancements/recipes/building_blocks/small_asurine_bricks_from_stone_types_asurine_stonecutting.json +a51ca3151c517113338720edeac0e02a46ebb03a data/create/advancements/recipes/building_blocks/small_andesite_bricks_from_stone_types_andesite_stonecutting.json 3dccee988c08e1988886d9f09f2b5b42332ac083 data/create/advancements/recipes/building_blocks/small_asurine_brick_slab.json 438469fb06dff95a0ab9e0cb183795432d9b78dd data/create/advancements/recipes/building_blocks/small_asurine_brick_slab_from_stone_types_asurine_stonecutting.json 3eb65706d975e6f1e429f43d7384272a58872f10 data/create/advancements/recipes/building_blocks/small_asurine_brick_slab_recycling.json @@ -3086,7 +3085,7 @@ fb8cab1a3ecef97eaf7d744bb0d1d09d46859b60 data/create/advancements/recipes/buildi 525fff52f5dea3178356b7c5f7606d2a369b346e data/create/advancements/recipes/building_blocks/small_asurine_brick_stairs_from_stone_types_asurine_stonecutting.json 39df7ef2b88df45ba4a06bfa9cd7f863f813cb30 data/create/advancements/recipes/building_blocks/small_asurine_brick_wall.json 21aa9dc72b12eb0a33cdc9904ee595de802b55f4 data/create/advancements/recipes/building_blocks/small_asurine_brick_wall_from_stone_types_asurine_stonecutting.json -46666ef8d341971cdd989f14575973777a85cdc6 data/create/advancements/recipes/building_blocks/small_calcite_bricks_from_stone_types_calcite_stonecutting.json +0bfa788d0038077a88678ff16104a8b82038b3da data/create/advancements/recipes/building_blocks/small_asurine_bricks_from_stone_types_asurine_stonecutting.json d61fce64a295a2c3b9433bc27ac50f4f1f6a678d data/create/advancements/recipes/building_blocks/small_calcite_brick_slab.json 7f2e73d01b9bff473c4ecf76ab967b3aa934ff87 data/create/advancements/recipes/building_blocks/small_calcite_brick_slab_from_stone_types_calcite_stonecutting.json 1095487af055116acc2eba87d92dd0918385e9ac data/create/advancements/recipes/building_blocks/small_calcite_brick_slab_recycling.json @@ -3094,7 +3093,7 @@ d61fce64a295a2c3b9433bc27ac50f4f1f6a678d data/create/advancements/recipes/buildi e3bd0900dc92b26fe69c7f4e81db76678505222b data/create/advancements/recipes/building_blocks/small_calcite_brick_stairs_from_stone_types_calcite_stonecutting.json c88fb3af07c32aa127cbe0043075f50fed869839 data/create/advancements/recipes/building_blocks/small_calcite_brick_wall.json ea58b78e177134c73ed5bfb081761f90cc7caa3e data/create/advancements/recipes/building_blocks/small_calcite_brick_wall_from_stone_types_calcite_stonecutting.json -c48216f26cfe93ce99f7f2f0e9f68d1ee2a95e46 data/create/advancements/recipes/building_blocks/small_crimsite_bricks_from_stone_types_crimsite_stonecutting.json +46666ef8d341971cdd989f14575973777a85cdc6 data/create/advancements/recipes/building_blocks/small_calcite_bricks_from_stone_types_calcite_stonecutting.json ed4d6e7779749dd647f744f0486e78b93057aa33 data/create/advancements/recipes/building_blocks/small_crimsite_brick_slab.json 7f3ad6d79eb9d433d5a0e295eb2b099a5f815876 data/create/advancements/recipes/building_blocks/small_crimsite_brick_slab_from_stone_types_crimsite_stonecutting.json b980fcc4b29f9ff897dd867222fc4248d76e808a data/create/advancements/recipes/building_blocks/small_crimsite_brick_slab_recycling.json @@ -3102,7 +3101,7 @@ b980fcc4b29f9ff897dd867222fc4248d76e808a data/create/advancements/recipes/buildi c06600eda4e4bd7c46e4e315a0569fbdfa4bb087 data/create/advancements/recipes/building_blocks/small_crimsite_brick_stairs_from_stone_types_crimsite_stonecutting.json 4021a4a761b06def09f19d6a60bc0722e69ec08d data/create/advancements/recipes/building_blocks/small_crimsite_brick_wall.json 2d8eae517a914e93538307efe23d532582d487e2 data/create/advancements/recipes/building_blocks/small_crimsite_brick_wall_from_stone_types_crimsite_stonecutting.json -ed82f0fac452147faa997af1d45278f501ef165b data/create/advancements/recipes/building_blocks/small_deepslate_bricks_from_stone_types_deepslate_stonecutting.json +c48216f26cfe93ce99f7f2f0e9f68d1ee2a95e46 data/create/advancements/recipes/building_blocks/small_crimsite_bricks_from_stone_types_crimsite_stonecutting.json e4674821cc17adadecacc55d48c028847caf5fea data/create/advancements/recipes/building_blocks/small_deepslate_brick_slab.json 8c0c51d052b110fec3668618be2bdeaf8d0c7cc5 data/create/advancements/recipes/building_blocks/small_deepslate_brick_slab_from_stone_types_deepslate_stonecutting.json f8f7ace802b6c73fabfabbaae1c1383a3c0bcf6b data/create/advancements/recipes/building_blocks/small_deepslate_brick_slab_recycling.json @@ -3110,7 +3109,7 @@ e2e16c3c0e761ef44f9b21ae3bd95300a33459be data/create/advancements/recipes/buildi 37ef4192f1db7dd5c066a47480f86f60687c9894 data/create/advancements/recipes/building_blocks/small_deepslate_brick_stairs_from_stone_types_deepslate_stonecutting.json 6f4d365ce26fb4081a5af0f6e21631209b5b106d data/create/advancements/recipes/building_blocks/small_deepslate_brick_wall.json e0c7377c55dc94b8efd62cb6f57325c94206cbf4 data/create/advancements/recipes/building_blocks/small_deepslate_brick_wall_from_stone_types_deepslate_stonecutting.json -9bb23924495112ba177d12ba2a5adcb872a2b76f data/create/advancements/recipes/building_blocks/small_diorite_bricks_from_stone_types_diorite_stonecutting.json +ed82f0fac452147faa997af1d45278f501ef165b data/create/advancements/recipes/building_blocks/small_deepslate_bricks_from_stone_types_deepslate_stonecutting.json d4b96bcd8902e9bce19603abb99cb7edeb260189 data/create/advancements/recipes/building_blocks/small_diorite_brick_slab.json 2ed3800996491c9a1db23d9cbed04cc5ee963df6 data/create/advancements/recipes/building_blocks/small_diorite_brick_slab_from_stone_types_diorite_stonecutting.json 895d2158ba0783c5fd97b802ef5866d7532df6ba data/create/advancements/recipes/building_blocks/small_diorite_brick_slab_recycling.json @@ -3118,7 +3117,7 @@ d4b96bcd8902e9bce19603abb99cb7edeb260189 data/create/advancements/recipes/buildi 0f4b92965c05ddf71fa24b2b08a0cce358ac8dd1 data/create/advancements/recipes/building_blocks/small_diorite_brick_stairs_from_stone_types_diorite_stonecutting.json 633d921515fb4ad0e3177f3c8f151da80008053b data/create/advancements/recipes/building_blocks/small_diorite_brick_wall.json 3dea60492331bcd3253d90534559cc0bdb0822ae data/create/advancements/recipes/building_blocks/small_diorite_brick_wall_from_stone_types_diorite_stonecutting.json -632ced3760d55b56d1620e447b8b762e0e4a29f3 data/create/advancements/recipes/building_blocks/small_dripstone_bricks_from_stone_types_dripstone_stonecutting.json +9bb23924495112ba177d12ba2a5adcb872a2b76f data/create/advancements/recipes/building_blocks/small_diorite_bricks_from_stone_types_diorite_stonecutting.json 92bb21a400d9720a2f06882049d5b3863a93969d data/create/advancements/recipes/building_blocks/small_dripstone_brick_slab.json 02e2b98eeef9cdc20a8678beec4c7aa8a6cde948 data/create/advancements/recipes/building_blocks/small_dripstone_brick_slab_from_stone_types_dripstone_stonecutting.json 35830242bc48b1355830d6cb17dc4dc547d51bc0 data/create/advancements/recipes/building_blocks/small_dripstone_brick_slab_recycling.json @@ -3126,7 +3125,7 @@ d4b96bcd8902e9bce19603abb99cb7edeb260189 data/create/advancements/recipes/buildi 92523f3058a580743f95e9347fa97e0f5f6483f6 data/create/advancements/recipes/building_blocks/small_dripstone_brick_stairs_from_stone_types_dripstone_stonecutting.json 6e26ab4ad96225b7dd1a4aa06295b0d85e87400b data/create/advancements/recipes/building_blocks/small_dripstone_brick_wall.json e30a5f31d6478dfe7693077727b1abfc40b33f9b data/create/advancements/recipes/building_blocks/small_dripstone_brick_wall_from_stone_types_dripstone_stonecutting.json -1805b7f9db21b4530b173ab6945584e7d852b218 data/create/advancements/recipes/building_blocks/small_granite_bricks_from_stone_types_granite_stonecutting.json +632ced3760d55b56d1620e447b8b762e0e4a29f3 data/create/advancements/recipes/building_blocks/small_dripstone_bricks_from_stone_types_dripstone_stonecutting.json a2929bbd4c81b9601aeca74110936343102b7b5a data/create/advancements/recipes/building_blocks/small_granite_brick_slab.json 0fa83c337d5612e2b8368d5bff34117e0c1cf40a data/create/advancements/recipes/building_blocks/small_granite_brick_slab_from_stone_types_granite_stonecutting.json 0bc47cb22cc70a34879092a57c87551e6fa9f634 data/create/advancements/recipes/building_blocks/small_granite_brick_slab_recycling.json @@ -3134,7 +3133,7 @@ a2929bbd4c81b9601aeca74110936343102b7b5a data/create/advancements/recipes/buildi 44f3e71a4e8b78db74a21a42c3cebfbc15fe0180 data/create/advancements/recipes/building_blocks/small_granite_brick_stairs_from_stone_types_granite_stonecutting.json 3a6edafcb559e767caf421cf1bd6e064940f33e2 data/create/advancements/recipes/building_blocks/small_granite_brick_wall.json cac9914c729c0ecf5e9e1b4fe6498005e7c532f3 data/create/advancements/recipes/building_blocks/small_granite_brick_wall_from_stone_types_granite_stonecutting.json -1ca86b11356749caf7515fc61b8ac5de53d019f6 data/create/advancements/recipes/building_blocks/small_limestone_bricks_from_stone_types_limestone_stonecutting.json +1805b7f9db21b4530b173ab6945584e7d852b218 data/create/advancements/recipes/building_blocks/small_granite_bricks_from_stone_types_granite_stonecutting.json 4f3cc93f422ee9f05587b89d6729a6cc86f572c0 data/create/advancements/recipes/building_blocks/small_limestone_brick_slab.json 02d0c45cd014fd660a9d3eb1c1c6b40ba806b2fb data/create/advancements/recipes/building_blocks/small_limestone_brick_slab_from_stone_types_limestone_stonecutting.json 8fb46bce94f6cca943e4ae427c04d9617ada277d data/create/advancements/recipes/building_blocks/small_limestone_brick_slab_recycling.json @@ -3142,7 +3141,7 @@ cac9914c729c0ecf5e9e1b4fe6498005e7c532f3 data/create/advancements/recipes/buildi 00b61a4d23f8b16a7e4d9bf46fbe52c6b5dd561c data/create/advancements/recipes/building_blocks/small_limestone_brick_stairs_from_stone_types_limestone_stonecutting.json 7c6b80f174687efe10007c0235f2a68db7062b12 data/create/advancements/recipes/building_blocks/small_limestone_brick_wall.json 7f9ade635dcda8d5baae2bbdddc018bcc715f681 data/create/advancements/recipes/building_blocks/small_limestone_brick_wall_from_stone_types_limestone_stonecutting.json -bab018a0adcbc0582ba756158941a87923b20384 data/create/advancements/recipes/building_blocks/small_ochrum_bricks_from_stone_types_ochrum_stonecutting.json +1ca86b11356749caf7515fc61b8ac5de53d019f6 data/create/advancements/recipes/building_blocks/small_limestone_bricks_from_stone_types_limestone_stonecutting.json 9c98b7b56f92f6adc75473f5b0ae4dc69ac8aa9a data/create/advancements/recipes/building_blocks/small_ochrum_brick_slab.json 611fb57772f1446236256f1235751dec6f81cd0e data/create/advancements/recipes/building_blocks/small_ochrum_brick_slab_from_stone_types_ochrum_stonecutting.json 243821a2c3e465f5346ad58e0afda624c09ab946 data/create/advancements/recipes/building_blocks/small_ochrum_brick_slab_recycling.json @@ -3150,8 +3149,8 @@ b9a16792e6158a2923454c9a44d9c176c9607c24 data/create/advancements/recipes/buildi bb91a8ba1ef1c8cb725f18a4d577bb476b9ae68d data/create/advancements/recipes/building_blocks/small_ochrum_brick_stairs_from_stone_types_ochrum_stonecutting.json 5cf5574da0b29895960fa7f0fd63d3f81814f7b3 data/create/advancements/recipes/building_blocks/small_ochrum_brick_wall.json 1b5d14c921a85a3a5cdb9f845d4f0ddf98f87347 data/create/advancements/recipes/building_blocks/small_ochrum_brick_wall_from_stone_types_ochrum_stonecutting.json +bab018a0adcbc0582ba756158941a87923b20384 data/create/advancements/recipes/building_blocks/small_ochrum_bricks_from_stone_types_ochrum_stonecutting.json 8d6ccacf1af917094b1688ed70dc75bf54611e93 data/create/advancements/recipes/building_blocks/small_rose_quartz_tiles_from_polished_rose_quartz_stonecutting.json -7d679c66588f8a717619a7f89861d57ec04f04a1 data/create/advancements/recipes/building_blocks/small_scorchia_bricks_from_stone_types_scorchia_stonecutting.json 2003f1248faaeb4fe6761febda8e29d087f99dc7 data/create/advancements/recipes/building_blocks/small_scorchia_brick_slab.json ff5c50697aefe21c1570230a13255c912744b629 data/create/advancements/recipes/building_blocks/small_scorchia_brick_slab_from_stone_types_scorchia_stonecutting.json 8d1fd41b03940add231fa207d3ddaa1f78cf2b85 data/create/advancements/recipes/building_blocks/small_scorchia_brick_slab_recycling.json @@ -3159,7 +3158,7 @@ ff5c50697aefe21c1570230a13255c912744b629 data/create/advancements/recipes/buildi 8586f387cc9bb74250369373348005f6aa686af2 data/create/advancements/recipes/building_blocks/small_scorchia_brick_stairs_from_stone_types_scorchia_stonecutting.json 94552be031c17f5ef9d97cf5fe33beb15141291f data/create/advancements/recipes/building_blocks/small_scorchia_brick_wall.json 86e866f92095b03b5d77a91425e5e2ef307f4852 data/create/advancements/recipes/building_blocks/small_scorchia_brick_wall_from_stone_types_scorchia_stonecutting.json -e542cd94f84a90530332608b1040e2e6189a51fe data/create/advancements/recipes/building_blocks/small_scoria_bricks_from_stone_types_scoria_stonecutting.json +7d679c66588f8a717619a7f89861d57ec04f04a1 data/create/advancements/recipes/building_blocks/small_scorchia_bricks_from_stone_types_scorchia_stonecutting.json ad4c35afd6c3d55b356e38289c64e8cf6d194d10 data/create/advancements/recipes/building_blocks/small_scoria_brick_slab.json 2f1acca02bb5a40bf174ceeb5272ba1243b8635c data/create/advancements/recipes/building_blocks/small_scoria_brick_slab_from_stone_types_scoria_stonecutting.json dba264e073eab7b2fb1494cb117574b6a6b83919 data/create/advancements/recipes/building_blocks/small_scoria_brick_slab_recycling.json @@ -3167,7 +3166,7 @@ dba264e073eab7b2fb1494cb117574b6a6b83919 data/create/advancements/recipes/buildi 0e64e1dc80a0b84e05260191951ed930a8e578f6 data/create/advancements/recipes/building_blocks/small_scoria_brick_stairs_from_stone_types_scoria_stonecutting.json 95b866fac218affb9aac93272f5436e30dd4678c data/create/advancements/recipes/building_blocks/small_scoria_brick_wall.json 23493359766c969d2fa64575c5af047e6a924373 data/create/advancements/recipes/building_blocks/small_scoria_brick_wall_from_stone_types_scoria_stonecutting.json -b7fc4fbd0d6ce28946b5cbef40d86de3ca37f695 data/create/advancements/recipes/building_blocks/small_tuff_bricks_from_stone_types_tuff_stonecutting.json +e542cd94f84a90530332608b1040e2e6189a51fe data/create/advancements/recipes/building_blocks/small_scoria_bricks_from_stone_types_scoria_stonecutting.json 03acb1becaa3c7f6fc0ced99e6afcf4ac0ec4cb2 data/create/advancements/recipes/building_blocks/small_tuff_brick_slab.json 599693bc47bfd65cc9e3babc0a2f33c0d2bbfd31 data/create/advancements/recipes/building_blocks/small_tuff_brick_slab_from_stone_types_tuff_stonecutting.json aae2cb75ee4b9312e79dfea519c35f5e20ed4da6 data/create/advancements/recipes/building_blocks/small_tuff_brick_slab_recycling.json @@ -3175,7 +3174,7 @@ c72364e32b82f45f17491dd41967373c35d8dfb5 data/create/advancements/recipes/buildi 369763433d6af43d94392e870b3d861f739ba0f9 data/create/advancements/recipes/building_blocks/small_tuff_brick_stairs_from_stone_types_tuff_stonecutting.json 506bbae420bff66d492214c49dabf52e5cbcf6e4 data/create/advancements/recipes/building_blocks/small_tuff_brick_wall.json 6db7e4b981ec28c776988a531c03dbe28fb0a1c2 data/create/advancements/recipes/building_blocks/small_tuff_brick_wall_from_stone_types_tuff_stonecutting.json -9fd6e20a4555b591b17ef225316782de333780fa data/create/advancements/recipes/building_blocks/small_veridium_bricks_from_stone_types_veridium_stonecutting.json +b7fc4fbd0d6ce28946b5cbef40d86de3ca37f695 data/create/advancements/recipes/building_blocks/small_tuff_bricks_from_stone_types_tuff_stonecutting.json b61a773f683c415617a408fa0781e7e7d61cb1af data/create/advancements/recipes/building_blocks/small_veridium_brick_slab.json 526a5323263292bd091c03231a156e18460c34a1 data/create/advancements/recipes/building_blocks/small_veridium_brick_slab_from_stone_types_veridium_stonecutting.json ef040b7189b17cce9dd69c47af61c7abca6f43cd data/create/advancements/recipes/building_blocks/small_veridium_brick_slab_recycling.json @@ -3183,6 +3182,7 @@ ef040b7189b17cce9dd69c47af61c7abca6f43cd data/create/advancements/recipes/buildi 6a12b73815434a544881680cb071f273a75f62a5 data/create/advancements/recipes/building_blocks/small_veridium_brick_stairs_from_stone_types_veridium_stonecutting.json e6dfacd8f2f57d4df42927783750254f7163251a data/create/advancements/recipes/building_blocks/small_veridium_brick_wall.json ee4012cc014539be113ace8f80e51c85d2daead9 data/create/advancements/recipes/building_blocks/small_veridium_brick_wall_from_stone_types_veridium_stonecutting.json +9fd6e20a4555b591b17ef225316782de333780fa data/create/advancements/recipes/building_blocks/small_veridium_bricks_from_stone_types_veridium_stonecutting.json 03a87030672d40b0b2b6ad085103c9a5cef067ce data/create/advancements/recipes/building_blocks/spruce_window.json dfea65f25ebcbe0caf2694dec3d3ea616e2e9291 data/create/advancements/recipes/building_blocks/spruce_window_pane.json 763b3b49296a284f41cbccdc7f1ffb13c89d42db data/create/advancements/recipes/building_blocks/tiled_glass_from_glass_colorless_stonecutting.json @@ -3336,13 +3336,13 @@ fa0856e11351ad0882de2066569807e782071881 data/create/loot_tables/blocks/copper_b 0937b9f634b86dbe41e07eda52c69993fce60fb5 data/create/loot_tables/blocks/copper_door.json 8ed70d812f38adfa147db07a4f2bbe206a69ad20 data/create/loot_tables/blocks/copper_ladder.json ac621731ca23e6fbb1003be59edacdf837dbc37e data/create/loot_tables/blocks/copper_scaffolding.json -9be387731859ccc3aec7701c1804ddc3c5dde216 data/create/loot_tables/blocks/copper_shingles.json be31f0c68bfe80dff88959bd30ef9a9080dd3b3b data/create/loot_tables/blocks/copper_shingle_slab.json 83ae2652a2df217730d6fb34a65c3962e82a961d data/create/loot_tables/blocks/copper_shingle_stairs.json +9be387731859ccc3aec7701c1804ddc3c5dde216 data/create/loot_tables/blocks/copper_shingles.json f6a29868a011d9ad73bc29be94ec2a07a2626323 data/create/loot_tables/blocks/copper_table_cloth.json -9cb359c96543d7421250c4ef4e83a5e170974efb data/create/loot_tables/blocks/copper_tiles.json adbe83d6bf88dd7d2b0b8788bb619cedd37f59d9 data/create/loot_tables/blocks/copper_tile_slab.json 1e06f16b1fa8e78af5cbfc90ba8ff1136de83d2d data/create/loot_tables/blocks/copper_tile_stairs.json +9cb359c96543d7421250c4ef4e83a5e170974efb data/create/loot_tables/blocks/copper_tiles.json 4f75cad20e6b091d1f07cf3db98520d2dc3af5e7 data/create/loot_tables/blocks/copper_valve_handle.json 14a493a7bad6bd399b662da470b71810bd56e812 data/create/loot_tables/blocks/copycat_bars.json 3a2f3ab0834a0c5089ba0a11f5e9784ce59ef6d8 data/create/loot_tables/blocks/copycat_base.json @@ -3358,114 +3358,114 @@ d5d2f565bab2e2b81b0798fc7ce0e21acd362ce5 data/create/loot_tables/blocks/crimson_ b892718d33caf0c260b902c92f46f3bfd827af45 data/create/loot_tables/blocks/crushing_wheel.json ff7853a5d5c0f3bddbcfe07e47efd1ff04b14f0a data/create/loot_tables/blocks/cuckoo_clock.json 9083b026ee254645430434b67c2ba7a842f888bf data/create/loot_tables/blocks/cut_andesite.json -c1aa69f80ba11dd52fb3627fc32377599f5ff887 data/create/loot_tables/blocks/cut_andesite_bricks.json c74a4cac08ab1f66146466ff9fb40c8f210de63c data/create/loot_tables/blocks/cut_andesite_brick_slab.json df3f5dcbf676106800bc1113bb022658eb5e85d6 data/create/loot_tables/blocks/cut_andesite_brick_stairs.json 95c5a4a3327f522d986d7baaa747fce5ead8c032 data/create/loot_tables/blocks/cut_andesite_brick_wall.json +c1aa69f80ba11dd52fb3627fc32377599f5ff887 data/create/loot_tables/blocks/cut_andesite_bricks.json cb6cf8aefaac1e00596bd64a182a329dbba7e659 data/create/loot_tables/blocks/cut_andesite_slab.json 7106a637809dcbeb9d4a02a7ff9dc52f7fd9d7a2 data/create/loot_tables/blocks/cut_andesite_stairs.json e3cfa2ecb0b90ebe07cc98f8e47d22d2c0da67e5 data/create/loot_tables/blocks/cut_andesite_wall.json 75eacbc0656e7a83a20a054755ea7d7d78af983d data/create/loot_tables/blocks/cut_asurine.json -f780d37b956ed734cafcbe42b77f1a8ebfa33350 data/create/loot_tables/blocks/cut_asurine_bricks.json 43ad24bb9da878111f3606a17ef9b45bcc4964ae data/create/loot_tables/blocks/cut_asurine_brick_slab.json 8f4d0af32546b6cc77c68a08dc74494b8be1b7c3 data/create/loot_tables/blocks/cut_asurine_brick_stairs.json bb9ce58aa5b4e38c4d3b29aa8e0d905054023eae data/create/loot_tables/blocks/cut_asurine_brick_wall.json +f780d37b956ed734cafcbe42b77f1a8ebfa33350 data/create/loot_tables/blocks/cut_asurine_bricks.json 972ca04f91a1ce4d35995c14e1b17f773b15b61e data/create/loot_tables/blocks/cut_asurine_slab.json a55778dd8735286c3abc65046186b6b8dff0367e data/create/loot_tables/blocks/cut_asurine_stairs.json 70284c686f16d215ff1a8fb19bbe36fddbd31e18 data/create/loot_tables/blocks/cut_asurine_wall.json 0f450ecf60c5d201f332b2736c552d0b51b159b8 data/create/loot_tables/blocks/cut_calcite.json -aec526af372816f306826eefe4a6318db7964892 data/create/loot_tables/blocks/cut_calcite_bricks.json ec0d2854433ac4f58e53685c69dc19629fee16ca data/create/loot_tables/blocks/cut_calcite_brick_slab.json 584e39fa0b78ba8649f69b53f9f032dd1532d6ac data/create/loot_tables/blocks/cut_calcite_brick_stairs.json cc9cbdb7a50305e47181b2452bfce887f9879437 data/create/loot_tables/blocks/cut_calcite_brick_wall.json +aec526af372816f306826eefe4a6318db7964892 data/create/loot_tables/blocks/cut_calcite_bricks.json b4e5b6d5cb63b7b1a4fe639fd727a381bfd00588 data/create/loot_tables/blocks/cut_calcite_slab.json ca83b89401dba12341e6f26786103c10c90447ca data/create/loot_tables/blocks/cut_calcite_stairs.json 64df1c4a373c28bf9be3630935b01a43abd22e03 data/create/loot_tables/blocks/cut_calcite_wall.json 5df3a2229657d7b616790e922b1d1d558b4a5128 data/create/loot_tables/blocks/cut_crimsite.json -59cb609bc9671ac481832eeaf942533c6861fc0e data/create/loot_tables/blocks/cut_crimsite_bricks.json 6fee8d6425e1c832abed8fd9bccc8e6fae9441fc data/create/loot_tables/blocks/cut_crimsite_brick_slab.json 3123bc9e6123dfeda9bb3cece5c2220ac8485535 data/create/loot_tables/blocks/cut_crimsite_brick_stairs.json 56a8c7b1588f6fa9a1fb438e91b04673e02a0c86 data/create/loot_tables/blocks/cut_crimsite_brick_wall.json +59cb609bc9671ac481832eeaf942533c6861fc0e data/create/loot_tables/blocks/cut_crimsite_bricks.json 90ed82b09f2650ee913956d62803d15fc4c0bdbd data/create/loot_tables/blocks/cut_crimsite_slab.json 0e237e008523ed3e9934c598a708be533aaa0861 data/create/loot_tables/blocks/cut_crimsite_stairs.json 48e1edca75186f160a12fa26ac262c7f86d62c82 data/create/loot_tables/blocks/cut_crimsite_wall.json 7bfe4d183ed26de1d7b241c27880a70d28426502 data/create/loot_tables/blocks/cut_deepslate.json -6e375a42ddf38c99fee86531471573716e27fa44 data/create/loot_tables/blocks/cut_deepslate_bricks.json fa4b940ad8ee432ee0fabf496d2da3d5039c204a data/create/loot_tables/blocks/cut_deepslate_brick_slab.json 1063a94b3e90a52a7492d85b1c086514333f3421 data/create/loot_tables/blocks/cut_deepslate_brick_stairs.json 878d809a038c626e8054f9b71e27be08388d7615 data/create/loot_tables/blocks/cut_deepslate_brick_wall.json +6e375a42ddf38c99fee86531471573716e27fa44 data/create/loot_tables/blocks/cut_deepslate_bricks.json 7b5e46aaf34d71993f50b5b6fa1cd5d7ea64264c data/create/loot_tables/blocks/cut_deepslate_slab.json 7d45e8bb037a1e550132854200d57ce31e073993 data/create/loot_tables/blocks/cut_deepslate_stairs.json cd80fd4f573d59c22f0b9799f1ba7422215d4ff1 data/create/loot_tables/blocks/cut_deepslate_wall.json d79d52657307a30422d9ff2eb1caad78024c24f7 data/create/loot_tables/blocks/cut_diorite.json -9f627b6449ae27a1990b84a60349736129a11e39 data/create/loot_tables/blocks/cut_diorite_bricks.json 1809235166024fa74f65a96b622faa8eddf4ce14 data/create/loot_tables/blocks/cut_diorite_brick_slab.json a6bb9fb4eee3dab9a540b228801ce100c048c2a7 data/create/loot_tables/blocks/cut_diorite_brick_stairs.json 690a938a04543cb60f2952335be26b2df9c75715 data/create/loot_tables/blocks/cut_diorite_brick_wall.json +9f627b6449ae27a1990b84a60349736129a11e39 data/create/loot_tables/blocks/cut_diorite_bricks.json 208999222adb5b1cd4fa47b85000841dbae4ad21 data/create/loot_tables/blocks/cut_diorite_slab.json 12849a868e8dff48ebb688c84fc53d4cee2a4eaa data/create/loot_tables/blocks/cut_diorite_stairs.json 469fffcdd40aea22fedb81b7778cc3c61928f3fd data/create/loot_tables/blocks/cut_diorite_wall.json 302d0bb640f696109fe4edc0c1fa9db332231511 data/create/loot_tables/blocks/cut_dripstone.json -48707f37b94ff1a930ee45bb9e8b6b4b67226945 data/create/loot_tables/blocks/cut_dripstone_bricks.json eb31bc108180e2248d575d5d72325b5585254af0 data/create/loot_tables/blocks/cut_dripstone_brick_slab.json 9b624a456baf55960675d7857e159f69911a281a data/create/loot_tables/blocks/cut_dripstone_brick_stairs.json b4c754d4d5a6c28f537c2d73844e39059b2c1450 data/create/loot_tables/blocks/cut_dripstone_brick_wall.json +48707f37b94ff1a930ee45bb9e8b6b4b67226945 data/create/loot_tables/blocks/cut_dripstone_bricks.json eb9eca9a69f763cbe81dc79375ef76978594b51e data/create/loot_tables/blocks/cut_dripstone_slab.json 47fae3abc8bea3ee802d6759192e631f50329c5f data/create/loot_tables/blocks/cut_dripstone_stairs.json 70b71cc460cba2955694baf0550eadc2187e3a8a data/create/loot_tables/blocks/cut_dripstone_wall.json 26433a16a91414be15b20dc85b81b76d086be889 data/create/loot_tables/blocks/cut_granite.json -65c3936e78a90c53faa0b9f9b3034afc2728e7b9 data/create/loot_tables/blocks/cut_granite_bricks.json c6b8dfa87e9c33a0dd2b3398dcc524347e826d44 data/create/loot_tables/blocks/cut_granite_brick_slab.json 5e00417f06b4d357e7469f0efa6e319dfc587da3 data/create/loot_tables/blocks/cut_granite_brick_stairs.json 8d8779846af8121426f128cc7b5d501037bd1cd4 data/create/loot_tables/blocks/cut_granite_brick_wall.json +65c3936e78a90c53faa0b9f9b3034afc2728e7b9 data/create/loot_tables/blocks/cut_granite_bricks.json 6e7253b2801611b4698e786f495c2ade1088ee0b data/create/loot_tables/blocks/cut_granite_slab.json de8c10fb2c7409a3375f2db5cdce2027c3f419bd data/create/loot_tables/blocks/cut_granite_stairs.json cdf40bb46d9457a66129b300dc4d3f0160cc1de2 data/create/loot_tables/blocks/cut_granite_wall.json ac5f062c7fc270c63d67ccecf19499a9e91fa1c4 data/create/loot_tables/blocks/cut_limestone.json -b60fb652e1f83b1af12a15cb47450bd9a6087f6a data/create/loot_tables/blocks/cut_limestone_bricks.json 3b6d3a9b12cf1c2a20bf337cc0155bb66967f0ee data/create/loot_tables/blocks/cut_limestone_brick_slab.json 701249cc12b7aa6f5cc1691ac4dd17e665aa2180 data/create/loot_tables/blocks/cut_limestone_brick_stairs.json 3b8c5eef9b0e8c35e8573ce91f5fddbac7f76f24 data/create/loot_tables/blocks/cut_limestone_brick_wall.json +b60fb652e1f83b1af12a15cb47450bd9a6087f6a data/create/loot_tables/blocks/cut_limestone_bricks.json ba186786e8677f1c769e8f231fe872c48330e13a data/create/loot_tables/blocks/cut_limestone_slab.json d354966d57804afda39ff27336d8b0f38acf6ea3 data/create/loot_tables/blocks/cut_limestone_stairs.json 28b4eee2c6da259e50c58a51905fa2b79a9b89ef data/create/loot_tables/blocks/cut_limestone_wall.json b3d6d90dd0c3e9d4b47d1f87d5abc354dd8c1447 data/create/loot_tables/blocks/cut_ochrum.json -5856859aae0cc633cbd9d83ea7cf7910ce1a88de data/create/loot_tables/blocks/cut_ochrum_bricks.json 67cadc71d90fb2527b9b2b72a74463d71571e493 data/create/loot_tables/blocks/cut_ochrum_brick_slab.json 487b3e7dc1d9d07183b9b699e33f6371858435aa data/create/loot_tables/blocks/cut_ochrum_brick_stairs.json 289757860f07b63dcce531a74ce7e60b4669c51b data/create/loot_tables/blocks/cut_ochrum_brick_wall.json +5856859aae0cc633cbd9d83ea7cf7910ce1a88de data/create/loot_tables/blocks/cut_ochrum_bricks.json c9deec5e3c7343afa3d013704179e2147b2eb7ec data/create/loot_tables/blocks/cut_ochrum_slab.json e851d829db8ea4398bc1cbe6e743b4fba98d3413 data/create/loot_tables/blocks/cut_ochrum_stairs.json 5dce8524b70baeefaeba13422f5900b1a161a867 data/create/loot_tables/blocks/cut_ochrum_wall.json 293064edf2909db8c9edc26bedd1cc023c647664 data/create/loot_tables/blocks/cut_scorchia.json -767910313f0983ebfb49b80526747d762cbdf782 data/create/loot_tables/blocks/cut_scorchia_bricks.json 895c4b9cc71701a26ae0e765ee67f0c06cc70a9c data/create/loot_tables/blocks/cut_scorchia_brick_slab.json c53d72176cb5dd93977975dd84647391fa563e3a data/create/loot_tables/blocks/cut_scorchia_brick_stairs.json 460232ca38cba2f0adc5316d6db8db94db231953 data/create/loot_tables/blocks/cut_scorchia_brick_wall.json +767910313f0983ebfb49b80526747d762cbdf782 data/create/loot_tables/blocks/cut_scorchia_bricks.json c8201964d877a932fe9a9a2d0360004440f7c380 data/create/loot_tables/blocks/cut_scorchia_slab.json dfd09849dbf48a064269a5ea28d0422caa87e4d4 data/create/loot_tables/blocks/cut_scorchia_stairs.json bd5304e38bb92a445c159e9fe647b906e28b232e data/create/loot_tables/blocks/cut_scorchia_wall.json 6b87a22c39b545d5be92e476751b99ceb4bef740 data/create/loot_tables/blocks/cut_scoria.json -833252d2d63c7502f6f0d7981673a8081046c944 data/create/loot_tables/blocks/cut_scoria_bricks.json 659e86f89499539e435989c2eb29e88e9a0ff9f4 data/create/loot_tables/blocks/cut_scoria_brick_slab.json 8434d461090bc43328eec0b4249d27a9ba383707 data/create/loot_tables/blocks/cut_scoria_brick_stairs.json e3f853395b9b6fb7d5bb103c121a77e04526a9e8 data/create/loot_tables/blocks/cut_scoria_brick_wall.json +833252d2d63c7502f6f0d7981673a8081046c944 data/create/loot_tables/blocks/cut_scoria_bricks.json 8360d736887ae3dc22bcf522791ef981e380456c data/create/loot_tables/blocks/cut_scoria_slab.json c771f03308f45e1e87d92181f94cdfd4e61fa5d8 data/create/loot_tables/blocks/cut_scoria_stairs.json 6fecb7fa2774ea63ac0c66e9c3d0f41d6b8cdff7 data/create/loot_tables/blocks/cut_scoria_wall.json 396074ee7fd5a3ddbac9332c74b7bdc4164919e2 data/create/loot_tables/blocks/cut_tuff.json -81465ef7aa555d36adf249bbc9acfe80abbe308e data/create/loot_tables/blocks/cut_tuff_bricks.json 5148f230c773b83268d52650bdacc660025feb95 data/create/loot_tables/blocks/cut_tuff_brick_slab.json 19719a4a3f63d1ec46a9ca9736a825d2dcc880ff data/create/loot_tables/blocks/cut_tuff_brick_stairs.json e20991b67c07dca62c212b43da5b7e7e98146c0e data/create/loot_tables/blocks/cut_tuff_brick_wall.json +81465ef7aa555d36adf249bbc9acfe80abbe308e data/create/loot_tables/blocks/cut_tuff_bricks.json 6d16bd3860207ff6912afc2bf3f0454b572aabba data/create/loot_tables/blocks/cut_tuff_slab.json c14e52ac9901aa873c33d51988bd26465ce0e095 data/create/loot_tables/blocks/cut_tuff_stairs.json dd70800c79fa2ff56bd4ea032cf069bc27cc9076 data/create/loot_tables/blocks/cut_tuff_wall.json 1957b610d14460cc9ca797fe953bf9831509cdbf data/create/loot_tables/blocks/cut_veridium.json -673d1f0fefa7725ac5bfcabfcea577041adc4eeb data/create/loot_tables/blocks/cut_veridium_bricks.json c1515a908bde249c087be1e73aec37773bc3dc5c data/create/loot_tables/blocks/cut_veridium_brick_slab.json d9552e3e9f4de0e09df8ca9446066e94c6e2c681 data/create/loot_tables/blocks/cut_veridium_brick_stairs.json 584c4bd13d9870f9798155b47cc0d32e5751294d data/create/loot_tables/blocks/cut_veridium_brick_wall.json +673d1f0fefa7725ac5bfcabfcea577041adc4eeb data/create/loot_tables/blocks/cut_veridium_bricks.json 009186ed0efe29a229a28cfd913bc02ddad217d4 data/create/loot_tables/blocks/cut_veridium_slab.json 4845f7127921c7dd93a59118e63c37107d6c2061 data/create/loot_tables/blocks/cut_veridium_stairs.json b56caea031d637321eddfd5d122fc357d2c2e49c data/create/loot_tables/blocks/cut_veridium_wall.json @@ -3493,12 +3493,12 @@ dfe0af3ff61ed2b3082e49c745d8a3e0c5973f4b data/create/loot_tables/blocks/encased_ a2e9a8a10b7fc730c1d7c8db3b529e7a37b683f5 data/create/loot_tables/blocks/encased_fan.json 7ede9f64839f51e6a2eb05b08577d2873f281401 data/create/loot_tables/blocks/encased_fluid_pipe.json 4869211639326efaabd1aba1067bfbb3ab012884 data/create/loot_tables/blocks/experience_block.json -9fa4b0c8ee313b6c9a57d7d5b687cdd01c8259d3 data/create/loot_tables/blocks/exposed_copper_shingles.json 9dbd37ef5ff549f10475101205c1a9d4a44140bc data/create/loot_tables/blocks/exposed_copper_shingle_slab.json d2c9abd9260eb82ea1c2eeae5e2d6abd0b4d3ce8 data/create/loot_tables/blocks/exposed_copper_shingle_stairs.json -f0905ae4c9bdff8fe9e1ab4682a7b1efe2d27d9d data/create/loot_tables/blocks/exposed_copper_tiles.json +9fa4b0c8ee313b6c9a57d7d5b687cdd01c8259d3 data/create/loot_tables/blocks/exposed_copper_shingles.json 6841c02935838f00011d33fc392965326c4dbc5b data/create/loot_tables/blocks/exposed_copper_tile_slab.json 432a047156b93a09b7e027fc34f5680a8f68dc92 data/create/loot_tables/blocks/exposed_copper_tile_stairs.json +f0905ae4c9bdff8fe9e1ab4682a7b1efe2d27d9d data/create/loot_tables/blocks/exposed_copper_tiles.json 4dd285b35d9b94d48f7aa783e93bdd04d58c4a26 data/create/loot_tables/blocks/factory_gauge.json 3fae2a7a3f133a1d7c76ce91f6c48eab787d6ff6 data/create/loot_tables/blocks/fake_track.json 1d4734d6d9ba039c0dfa2271f08cdb55e35b721f data/create/loot_tables/blocks/fluid_pipe.json @@ -3574,8 +3574,6 @@ eb95d1e0abb93d5efecb0809e3901f37021c4dfc data/create/loot_tables/blocks/light_gr e61e9b3e116037c4ad44a7e222e5127e5767ddad data/create/loot_tables/blocks/light_gray_table_cloth.json e22dfadefcea50090efe87136a4b92e6ef20d379 data/create/loot_tables/blocks/light_gray_toolbox.json 3e586bc1281f15e25e75475dd726578ff032c6ae data/create/loot_tables/blocks/light_gray_valve_handle.json -c6bb0877c537dda15469934383dc45c608bfd1a4 data/create/loot_tables/blocks/limestone.json -49058a62e1abd34917f983b6bc13cc4353b613a2 data/create/loot_tables/blocks/limestone_pillar.json 582bb26f6df37d0c2dbe12983ad05fc74f5fb5c0 data/create/loot_tables/blocks/lime_nixie_tube.json ec9d973d218b26d51b82f265603feab31170c619 data/create/loot_tables/blocks/lime_postbox.json 623ac65211a9920325308b55285f78e3b7275751 data/create/loot_tables/blocks/lime_sail.json @@ -3583,6 +3581,8 @@ ec9d973d218b26d51b82f265603feab31170c619 data/create/loot_tables/blocks/lime_pos 10ecd65ecba6b66652dd04a385fc47a44c1f8110 data/create/loot_tables/blocks/lime_table_cloth.json 0f6a465501a445925e9aff7a4c84b3c8e2caa93e data/create/loot_tables/blocks/lime_toolbox.json 1a3ed7cd5660d7ea014956ea642e0b07d89bc297 data/create/loot_tables/blocks/lime_valve_handle.json +c6bb0877c537dda15469934383dc45c608bfd1a4 data/create/loot_tables/blocks/limestone.json +49058a62e1abd34917f983b6bc13cc4353b613a2 data/create/loot_tables/blocks/limestone_pillar.json baf70f9eb579f20b232a2af4e6b00a54f84844e6 data/create/loot_tables/blocks/linear_chassis.json e4c0f8ca822cf7555bd011825b430c3c735160d4 data/create/loot_tables/blocks/lit_blaze_burner.json 6bd8b044cc9c69a5268372e5436f556da2c1bf21 data/create/loot_tables/blocks/magenta_nixie_tube.json @@ -3628,14 +3628,14 @@ d6323d4b30faa87cd4b5b8b815cb16f78296f203 data/create/loot_tables/blocks/orange_s 30aef2df782b6b35cd16b4c205bb15de85bc0664 data/create/loot_tables/blocks/orange_valve_handle.json f4004c6d16754fc8867ed6618dace8e8f6dcc412 data/create/loot_tables/blocks/ornate_iron_window.json 6f14500e07c6d342804f9127e7b66047ffaeef1e data/create/loot_tables/blocks/ornate_iron_window_pane.json -3e54d3c4755a43d837a1d9b2005ea1dee4d02555 data/create/loot_tables/blocks/oxidized_copper_shingles.json 62c43a533e4ffeeec9f7657db5a796569087f806 data/create/loot_tables/blocks/oxidized_copper_shingle_slab.json f47a01824093455030fca66e7b8a39bcfc61d219 data/create/loot_tables/blocks/oxidized_copper_shingle_stairs.json -4d2a2863697664b3b71f02aa703c3504cd5cc826 data/create/loot_tables/blocks/oxidized_copper_tiles.json +3e54d3c4755a43d837a1d9b2005ea1dee4d02555 data/create/loot_tables/blocks/oxidized_copper_shingles.json 4d815b361af81bd0c0e14c853ca54ad3cde66a57 data/create/loot_tables/blocks/oxidized_copper_tile_slab.json d599ef03d1b69e4367ec0dea78f52c1964c99f9b data/create/loot_tables/blocks/oxidized_copper_tile_stairs.json -ab8cee7abd7dd92428bf7d8f0f5edd35082401a4 data/create/loot_tables/blocks/packager.json +4d2a2863697664b3b71f02aa703c3504cd5cc826 data/create/loot_tables/blocks/oxidized_copper_tiles.json 54aa9700df601640b705d912abe773d5b6ee2b1f data/create/loot_tables/blocks/package_frogport.json +ab8cee7abd7dd92428bf7d8f0f5edd35082401a4 data/create/loot_tables/blocks/packager.json 58bd9fe9d6706998bfbda3b077cfd0a740972091 data/create/loot_tables/blocks/peculiar_bell.json 4d7724df6fefee4512c4f7886d0e103d1dc39510 data/create/loot_tables/blocks/pink_nixie_tube.json df7b12349c64d035eb563535b03cb70d780c5a71 data/create/loot_tables/blocks/pink_postbox.json @@ -3721,9 +3721,6 @@ b4746e296f4bf63778e40a751b4c7fa8be45d21d data/create/loot_tables/blocks/purple_t 9e5e841d9f9a00d560ed17a7e197dc56bae334b7 data/create/loot_tables/blocks/radial_chassis.json 73a03fa31e299cec2c8a3dc0f31a8aa354b49bcd data/create/loot_tables/blocks/railway_casing.json f76e5a157d2aeab5708f464b1f3c8e47b3855f18 data/create/loot_tables/blocks/raw_zinc_block.json -bbc2d61eeea335f8f011d799ef6a5484ca027640 data/create/loot_tables/blocks/redstone_contact.json -4fa70deeac7e56121e42fb602dfa27ee1727f749 data/create/loot_tables/blocks/redstone_link.json -efc3a5595e4daf67fa43f84c9869dfc76fd6fca4 data/create/loot_tables/blocks/redstone_requester.json a50e1c28af16e9f1b4f48aa974461167139768a7 data/create/loot_tables/blocks/red_nixie_tube.json f36f1e69e4fb8723238f81aadbac892f54b5ac62 data/create/loot_tables/blocks/red_postbox.json 977d724cddf8eba053a3310ad0d30af15199bbed data/create/loot_tables/blocks/red_sail.json @@ -3731,6 +3728,9 @@ f36f1e69e4fb8723238f81aadbac892f54b5ac62 data/create/loot_tables/blocks/red_post 09796bc3be977e17927d0a9e32bff2982618e844 data/create/loot_tables/blocks/red_table_cloth.json 9713071cab536e8c1550a6309dc4563fecc2c4e0 data/create/loot_tables/blocks/red_toolbox.json 17d75711f4ef5d76aa931175364642732fb0c60d data/create/loot_tables/blocks/red_valve_handle.json +bbc2d61eeea335f8f011d799ef6a5484ca027640 data/create/loot_tables/blocks/redstone_contact.json +4fa70deeac7e56121e42fb602dfa27ee1727f749 data/create/loot_tables/blocks/redstone_link.json +efc3a5595e4daf67fa43f84c9869dfc76fd6fca4 data/create/loot_tables/blocks/redstone_requester.json 632067fe6309e31e78637eb0272209b630750242 data/create/loot_tables/blocks/refined_radiance_casing.json ee2c4d66d1264ec613e9e84fcac814d2f5806258 data/create/loot_tables/blocks/repackager.json 354a3b6c73379b7100b0dd12b3f3b008830c4d2d data/create/loot_tables/blocks/rope.json @@ -3740,8 +3740,8 @@ f74fdd78961619d712891c36e0a0778c25e145dc data/create/loot_tables/blocks/rope_pul a0575567d5679f2c54e5a25c6ec12338f8cdc939 data/create/loot_tables/blocks/rose_quartz_tiles.json de74765a3bbffafb87d632857dfcfa83f863f814 data/create/loot_tables/blocks/rotation_speed_controller.json 2af8df3e36ace336c43d68f4e53564640a89845f data/create/loot_tables/blocks/sail_frame.json -d499fd59d30da8b907b0f3a0f428700f066eddff data/create/loot_tables/blocks/schematicannon.json 5a54e930243919991d71a1c3296002ff86dd88e1 data/create/loot_tables/blocks/schematic_table.json +d499fd59d30da8b907b0f3a0f428700f066eddff data/create/loot_tables/blocks/schematicannon.json 1d9b0df1330f44681bbd56f8560a30ef9e2175ff data/create/loot_tables/blocks/scorchia.json e39f189bfaebd31aedceb11e25720f1e08eb238d data/create/loot_tables/blocks/scorchia_pillar.json 5e3a37dbb2fcc0d6be042bfd063fd8b1414d6169 data/create/loot_tables/blocks/scoria.json @@ -3750,64 +3750,64 @@ d39afcaedc84d582c0c1f21ec5945cd0a67d389d data/create/loot_tables/blocks/secondar e33a34b47e07cf3262c0dbdbc651b31b9492b18f data/create/loot_tables/blocks/sequenced_gearshift.json 7d61387106e5e7fcc4aa0b05b9560cd5f4ef7df8 data/create/loot_tables/blocks/shadow_steel_casing.json 7e67d04f861e0a680487e27f94022a7850652dfe data/create/loot_tables/blocks/shaft.json -e88ff4ab1341c2db8338de0708b0ca8f40f15a8b data/create/loot_tables/blocks/small_andesite_bricks.json 220febcbcc4a993d475b683ebef7468ebdb7bf26 data/create/loot_tables/blocks/small_andesite_brick_slab.json b4764c5bb538359bcc2a599ff3b7474ade2115ed data/create/loot_tables/blocks/small_andesite_brick_stairs.json a891496ffb91bef56c3b684cb55a57e27a72154a data/create/loot_tables/blocks/small_andesite_brick_wall.json -576d8f6beca755a4082f1c8941e2590c1d18107b data/create/loot_tables/blocks/small_asurine_bricks.json +e88ff4ab1341c2db8338de0708b0ca8f40f15a8b data/create/loot_tables/blocks/small_andesite_bricks.json 1a5d3543ebb7c0064ba8ff01160a22a0f5f29f36 data/create/loot_tables/blocks/small_asurine_brick_slab.json 64f4b44b786eda91d432f20c8b725b0415440b56 data/create/loot_tables/blocks/small_asurine_brick_stairs.json 60a1d505e955047cf933ae55efc2e7c10d0a5a79 data/create/loot_tables/blocks/small_asurine_brick_wall.json +576d8f6beca755a4082f1c8941e2590c1d18107b data/create/loot_tables/blocks/small_asurine_bricks.json 64bcfece2507b8510633ae20c00ab989232664ff data/create/loot_tables/blocks/small_bogey.json -c03bba06f66262c0ced5e85fa7dcbfbfc8c9db71 data/create/loot_tables/blocks/small_calcite_bricks.json b673542c79f4a82f2e80c0931354e994292811f6 data/create/loot_tables/blocks/small_calcite_brick_slab.json e10d286286bba8e172a56e0eeb9af18d06d1a76d data/create/loot_tables/blocks/small_calcite_brick_stairs.json d7214e942b203823fa2fece883e8406a7721369f data/create/loot_tables/blocks/small_calcite_brick_wall.json -f49d32973b0be51229f4e3fdc13958c9852c5c8a data/create/loot_tables/blocks/small_crimsite_bricks.json +c03bba06f66262c0ced5e85fa7dcbfbfc8c9db71 data/create/loot_tables/blocks/small_calcite_bricks.json ef8b0f604b627715542e8216ae5448e88995cc13 data/create/loot_tables/blocks/small_crimsite_brick_slab.json dbec9246ab957a3ed2dbd0707df12c1496258e05 data/create/loot_tables/blocks/small_crimsite_brick_stairs.json d4d5bd8b101655205c4f293f23e83f610e179e91 data/create/loot_tables/blocks/small_crimsite_brick_wall.json -8caba3e7001dd8df4d3e6365b97849570c74c840 data/create/loot_tables/blocks/small_deepslate_bricks.json +f49d32973b0be51229f4e3fdc13958c9852c5c8a data/create/loot_tables/blocks/small_crimsite_bricks.json 44567c10c28ddd221198824766d3fec289fb29d4 data/create/loot_tables/blocks/small_deepslate_brick_slab.json fc141f5cdb1001d344b5ef8fa3ad1fdfeb01d048 data/create/loot_tables/blocks/small_deepslate_brick_stairs.json 3cf68d27362e9bb5dc3255ccf810097fbee511ba data/create/loot_tables/blocks/small_deepslate_brick_wall.json -4f22a84f105c2fabfd08ff0782ec30bbdc59f940 data/create/loot_tables/blocks/small_diorite_bricks.json +8caba3e7001dd8df4d3e6365b97849570c74c840 data/create/loot_tables/blocks/small_deepslate_bricks.json f6565f4bd11b7e95008b0f8fc3f5f2c7af1b77f8 data/create/loot_tables/blocks/small_diorite_brick_slab.json e3cbe41b4b2c38d0d5e625e34b61fc79db16d3bd data/create/loot_tables/blocks/small_diorite_brick_stairs.json 787dfaa16dc30155c90cc360f6927fa067a30ed8 data/create/loot_tables/blocks/small_diorite_brick_wall.json -d9cc7f58c791e040df4abfce225524e01eb01d49 data/create/loot_tables/blocks/small_dripstone_bricks.json +4f22a84f105c2fabfd08ff0782ec30bbdc59f940 data/create/loot_tables/blocks/small_diorite_bricks.json f72338c9252528e41f60cb183cb4ee07cea47bf0 data/create/loot_tables/blocks/small_dripstone_brick_slab.json bedf0fba68e8a8ce4205a968429ebe9c3ddfb528 data/create/loot_tables/blocks/small_dripstone_brick_stairs.json c1168f58f342dfa332bfa7f53f5f03383c55ccf2 data/create/loot_tables/blocks/small_dripstone_brick_wall.json -8437e7e28e45c10562d182c4c07189bcc108cabb data/create/loot_tables/blocks/small_granite_bricks.json +d9cc7f58c791e040df4abfce225524e01eb01d49 data/create/loot_tables/blocks/small_dripstone_bricks.json 4d111f8580ac97cf1b49b667462f7141846f3d3a data/create/loot_tables/blocks/small_granite_brick_slab.json c16e015251126614960d3e6300cb04d3aeaf49b4 data/create/loot_tables/blocks/small_granite_brick_stairs.json e0ff780ddeb5d5c8d2b6cd7736ac05f4556de52c data/create/loot_tables/blocks/small_granite_brick_wall.json -c60def11fbac5010bf749960e084dd5cd0dc4b07 data/create/loot_tables/blocks/small_limestone_bricks.json +8437e7e28e45c10562d182c4c07189bcc108cabb data/create/loot_tables/blocks/small_granite_bricks.json 5222ac5255c9a9ada0ce1da0fd4f4acbeee8ddb7 data/create/loot_tables/blocks/small_limestone_brick_slab.json 97310b6b1cbea869ebaa52861542787c49cee017 data/create/loot_tables/blocks/small_limestone_brick_stairs.json 0855921034db43692baa9fd0bcb767154f96d591 data/create/loot_tables/blocks/small_limestone_brick_wall.json -eb6b2171a6c99a3a28089752f26ddc6ac1f941d1 data/create/loot_tables/blocks/small_ochrum_bricks.json +c60def11fbac5010bf749960e084dd5cd0dc4b07 data/create/loot_tables/blocks/small_limestone_bricks.json 8ced0c24db685dbf4382b7b71124005edde9e0b2 data/create/loot_tables/blocks/small_ochrum_brick_slab.json 090e7154fb2c3dfd20d37aa87f3df4572a27c615 data/create/loot_tables/blocks/small_ochrum_brick_stairs.json 60f2d9970ad8caf8ffe3aa8083dbba671b8d4b8b data/create/loot_tables/blocks/small_ochrum_brick_wall.json +eb6b2171a6c99a3a28089752f26ddc6ac1f941d1 data/create/loot_tables/blocks/small_ochrum_bricks.json a001d069c2b4d15c6dfd0312749765fc4e89571e data/create/loot_tables/blocks/small_rose_quartz_tiles.json -ce71e670948453691d4f09c8110b952afb41afa1 data/create/loot_tables/blocks/small_scorchia_bricks.json d521cf885c737da2e4717d43072840ffd3f4c5d9 data/create/loot_tables/blocks/small_scorchia_brick_slab.json de6b5d583e1adf4d49147e0719616dfd0165726d data/create/loot_tables/blocks/small_scorchia_brick_stairs.json 895603c6920338ffafd8d0d1310e47ac20bdbfda data/create/loot_tables/blocks/small_scorchia_brick_wall.json -8b7e61477c4fdc834d669bda9197b585d60f26a2 data/create/loot_tables/blocks/small_scoria_bricks.json +ce71e670948453691d4f09c8110b952afb41afa1 data/create/loot_tables/blocks/small_scorchia_bricks.json d1954c07a66f40123d8d78602795efad7c92070f data/create/loot_tables/blocks/small_scoria_brick_slab.json 291b5a560f09ed8f09ccc949a1a4da0006f139c7 data/create/loot_tables/blocks/small_scoria_brick_stairs.json ed572e947f78d637e6e1a4166c111121087c41c3 data/create/loot_tables/blocks/small_scoria_brick_wall.json -2c7097ee677f42452212b5dce8959065d2bb0e15 data/create/loot_tables/blocks/small_tuff_bricks.json +8b7e61477c4fdc834d669bda9197b585d60f26a2 data/create/loot_tables/blocks/small_scoria_bricks.json ad8a3571dc3ae0ee1ec7be7f35c9796e544f0682 data/create/loot_tables/blocks/small_tuff_brick_slab.json 17f4a98a81e5920b75c88133d15b63d431f3fb64 data/create/loot_tables/blocks/small_tuff_brick_stairs.json 7defad704f6278e329af634acfb9efd617b2003e data/create/loot_tables/blocks/small_tuff_brick_wall.json -e499c0a8a0f804003612f3a4c9286cb4b033fe4b data/create/loot_tables/blocks/small_veridium_bricks.json +2c7097ee677f42452212b5dce8959065d2bb0e15 data/create/loot_tables/blocks/small_tuff_bricks.json c7771827a715b9eaacd1a7b7e863e274b1dee11f data/create/loot_tables/blocks/small_veridium_brick_slab.json 818b65dd5d868527e7df7658a4f62a93f2795186 data/create/loot_tables/blocks/small_veridium_brick_stairs.json 7733e53a90f2ba9c17cdedaa8720e70df1a8d2de data/create/loot_tables/blocks/small_veridium_brick_wall.json +e499c0a8a0f804003612f3a4c9286cb4b033fe4b data/create/loot_tables/blocks/small_veridium_bricks.json a121d21b81e93c119b6ee32ca21d260d9c33cb2a data/create/loot_tables/blocks/smart_chute.json 4556eb2d607db3631d0a9524d22a50686ce4a5a8 data/create/loot_tables/blocks/smart_fluid_pipe.json 9601e8ba0eb098cc409557f17b01669d8b971461 data/create/loot_tables/blocks/speedometer.json @@ -3819,9 +3819,9 @@ bcd632c1180efbc990b077314cfce8514a25da7c data/create/loot_tables/blocks/spruce_w cae1bd9100b62841e260880faa80e2442f44a141 data/create/loot_tables/blocks/steam_whistle_extension.json 0bc3fdde351129e3a261a2420aff9d3f063c235e data/create/loot_tables/blocks/sticker.json 074f526902cb5fcff2129614428aba1ea05a6649 data/create/loot_tables/blocks/sticky_mechanical_piston.json -a7332324e63f7d28621ddfbd54eb3d091461d890 data/create/loot_tables/blocks/stockpile_switch.json af312881ec9bfb0902438f53c5cac020244bdba2 data/create/loot_tables/blocks/stock_link.json f4fa9bb255348dc79dcc0468b3beb9ad075eb036 data/create/loot_tables/blocks/stock_ticker.json +a7332324e63f7d28621ddfbd54eb3d091461d890 data/create/loot_tables/blocks/stockpile_switch.json b13496b1b4bc0be30605832e23894fb374dd796e data/create/loot_tables/blocks/stressometer.json 6a7df4d2730d57ae6e404b4bc8e01367e5ddbf07 data/create/loot_tables/blocks/tiled_glass.json 0ad584e41780dc0183af1fa1e49e126730dfdbab data/create/loot_tables/blocks/tiled_glass_pane.json @@ -3841,36 +3841,36 @@ cfc82d2aa8248caeaa17ff0a60db02607046550d data/create/loot_tables/blocks/warped_w 2eeddb89cfc597bc1ce0736b9f4a6f98e0dfa4d2 data/create/loot_tables/blocks/warped_window_pane.json ccab211722d7f06913a549851b0d6e8278edc845 data/create/loot_tables/blocks/water_wheel.json ea5dfcedc928e8dfa1c59cf3917d1577dff87494 data/create/loot_tables/blocks/water_wheel_structure.json -bbc6fc068adccea464909b87f1d1f426324d74cc data/create/loot_tables/blocks/waxed_copper_shingles.json cb31be1e75ca822454bd0a89954f74c4c8726b33 data/create/loot_tables/blocks/waxed_copper_shingle_slab.json c8e440e42141788d1988c57ab91cb1bfcd977407 data/create/loot_tables/blocks/waxed_copper_shingle_stairs.json -a3b8f12d983077477963fd3fc893c5acd36ad552 data/create/loot_tables/blocks/waxed_copper_tiles.json +bbc6fc068adccea464909b87f1d1f426324d74cc data/create/loot_tables/blocks/waxed_copper_shingles.json 807da1d66d6c7d07efc8973de43415fa4b5ddfdc data/create/loot_tables/blocks/waxed_copper_tile_slab.json 92759871a9c84815b98b6dcd22fcf0dd958bc8ab data/create/loot_tables/blocks/waxed_copper_tile_stairs.json -eb9781d081d52c34c041004c774b52169b4a9ca0 data/create/loot_tables/blocks/waxed_exposed_copper_shingles.json +a3b8f12d983077477963fd3fc893c5acd36ad552 data/create/loot_tables/blocks/waxed_copper_tiles.json be5aabc98f4d70028f2b49ae1eaf0bc68a693c53 data/create/loot_tables/blocks/waxed_exposed_copper_shingle_slab.json a99143d290addb98427be53d7fea1cbc702d630c data/create/loot_tables/blocks/waxed_exposed_copper_shingle_stairs.json -e79c0636852b37a463dc122d66cdec27d3aa10c4 data/create/loot_tables/blocks/waxed_exposed_copper_tiles.json +eb9781d081d52c34c041004c774b52169b4a9ca0 data/create/loot_tables/blocks/waxed_exposed_copper_shingles.json 234cbb59a0e00d82c5508c8e9a61e328c22c1c56 data/create/loot_tables/blocks/waxed_exposed_copper_tile_slab.json de628114eb25f393efc4c0934d79c5bdc4365f75 data/create/loot_tables/blocks/waxed_exposed_copper_tile_stairs.json -60fe0594baab9599956d990ba893f8915835db81 data/create/loot_tables/blocks/waxed_oxidized_copper_shingles.json +e79c0636852b37a463dc122d66cdec27d3aa10c4 data/create/loot_tables/blocks/waxed_exposed_copper_tiles.json c8935df7d4634dee2b01c8a0ac5de12397f4d9ed data/create/loot_tables/blocks/waxed_oxidized_copper_shingle_slab.json 2b9370b7fa362ea88f916dd53747da80e4ae3357 data/create/loot_tables/blocks/waxed_oxidized_copper_shingle_stairs.json -f0721c371b08214337f3f4fce3a3705840310bdb data/create/loot_tables/blocks/waxed_oxidized_copper_tiles.json +60fe0594baab9599956d990ba893f8915835db81 data/create/loot_tables/blocks/waxed_oxidized_copper_shingles.json de4d25cac546559173f740752625c82dfd6bae09 data/create/loot_tables/blocks/waxed_oxidized_copper_tile_slab.json 2ed72fc0ea28303f5c6d1039662f55c677cb7bcb data/create/loot_tables/blocks/waxed_oxidized_copper_tile_stairs.json -f309ffd94dfb3591efd2fab337a871a0ceff1084 data/create/loot_tables/blocks/waxed_weathered_copper_shingles.json +f0721c371b08214337f3f4fce3a3705840310bdb data/create/loot_tables/blocks/waxed_oxidized_copper_tiles.json 9a7b265a963e122d510de64012ed1d98ad9017f9 data/create/loot_tables/blocks/waxed_weathered_copper_shingle_slab.json 62f25a1bc013e9c3d487d9a53407e58d89907c5b data/create/loot_tables/blocks/waxed_weathered_copper_shingle_stairs.json -26e6a96f50e7f3384f896bf8a5c3d5ff2b422526 data/create/loot_tables/blocks/waxed_weathered_copper_tiles.json +f309ffd94dfb3591efd2fab337a871a0ceff1084 data/create/loot_tables/blocks/waxed_weathered_copper_shingles.json 3fa20e33ced4aee01775db57629b9580a6b8e200 data/create/loot_tables/blocks/waxed_weathered_copper_tile_slab.json 59b28bd57f461482a394dbce9ea10ee25fc7c294 data/create/loot_tables/blocks/waxed_weathered_copper_tile_stairs.json -3cd15ae684bc0e4e41f02b3ee79eafdbf052620c data/create/loot_tables/blocks/weathered_copper_shingles.json +26e6a96f50e7f3384f896bf8a5c3d5ff2b422526 data/create/loot_tables/blocks/waxed_weathered_copper_tiles.json 278a56aa433ba3647107b3bf0553da5a5f6d40dd data/create/loot_tables/blocks/weathered_copper_shingle_slab.json 198babfd55c3a30c6ac61e81d5e01b0cf8fca80a data/create/loot_tables/blocks/weathered_copper_shingle_stairs.json -771d98a6627d707228719e843bc80636b02dc985 data/create/loot_tables/blocks/weathered_copper_tiles.json +3cd15ae684bc0e4e41f02b3ee79eafdbf052620c data/create/loot_tables/blocks/weathered_copper_shingles.json d6862dc9f7d291df618fbce71eebf613711a5517 data/create/loot_tables/blocks/weathered_copper_tile_slab.json 57d5065d53016e4b1ef0fbad9b84605b1546bcc4 data/create/loot_tables/blocks/weathered_copper_tile_stairs.json +771d98a6627d707228719e843bc80636b02dc985 data/create/loot_tables/blocks/weathered_copper_tiles.json 013deea9b687ce96e5042de13ab0cba9dadce364 data/create/loot_tables/blocks/weathered_iron_block.json f0c51ad0a713aab00dff913361b8e5e8448b912a data/create/loot_tables/blocks/weathered_iron_window.json 1d3ea471ec3f2bbf10c7a11f040f8bbf0d1576a8 data/create/loot_tables/blocks/weathered_iron_window_pane.json @@ -3918,43 +3918,43 @@ da3692808565988e21ec5b1d5e976338ccc4a037 data/create/recipes/calcite_pillar_from 1157b2eab2ada187ea80feae298b77ed7ece4bfd data/create/recipes/copper_bars_from_ingots_copper_stonecutting.json b9d4f55128aa03ee6f6ab1831e709629a42c147e data/create/recipes/copper_ladder_from_ingots_copper_stonecutting.json 922c5ac48c8eb8b3a39f5626a381c2252fbac107 data/create/recipes/copper_scaffolding_from_ingots_copper_stonecutting.json -bab9fa969ba95850dc6e3bd0723387a61cbb05cd data/create/recipes/copper_shingles_from_ingots_copper_stonecutting.json bb083ae1d057dc0106946e4c68f9469b81724396 data/create/recipes/copper_shingle_slab.json 3689feaca2bd5355fa2d4226cd2cc519fa9b97c1 data/create/recipes/copper_shingle_slab_from_copper_shingles_stonecutting.json bd4cd7119f8371164b278afc679795a3c2a53406 data/create/recipes/copper_shingle_stairs.json 59f672e8e88d5f4655467e2696616b552debaf46 data/create/recipes/copper_shingle_stairs_from_copper_shingles_stonecutting.json +bab9fa969ba95850dc6e3bd0723387a61cbb05cd data/create/recipes/copper_shingles_from_ingots_copper_stonecutting.json 0225fc8d7b7a5027b8a61e6a043c3a8e505d876a data/create/recipes/copper_table_cloth_from_ingots_copper_stonecutting.json -d463aa891c7ae1b2eb1a758e4100c5a1c16cfffd data/create/recipes/copper_tiles_from_ingots_copper_stonecutting.json f64ba3f3c607b43ea77e5bccb7ec2048e5c6e424 data/create/recipes/copper_tile_slab.json 91b0390e0c772d43eb46b94a0113323f0f6a4387 data/create/recipes/copper_tile_slab_from_copper_tiles_stonecutting.json d31a41f6f7ef0bd20abab06cc31a9d2c56187117 data/create/recipes/copper_tile_stairs.json bf1b0a447169029161fb07feacd22d5aa806b2bf data/create/recipes/copper_tile_stairs_from_copper_tiles_stonecutting.json +d463aa891c7ae1b2eb1a758e4100c5a1c16cfffd data/create/recipes/copper_tiles_from_ingots_copper_stonecutting.json daa54c9ff3612521f06cc1979116beafcda852dd data/create/recipes/copycat_panel_from_ingots_zinc_stonecutting.json 745816d2c3fa29ede2510e39edc76f6fecee963f data/create/recipes/copycat_step_from_ingots_zinc_stonecutting.json -255c32272a704109fccdbb071d4dbf602cb8c1d8 data/create/recipes/crafting/copper/waxed_copper_shingles_from_honeycomb.json 57ae13042e0f96676fa322bf24db4976d75ca6bc data/create/recipes/crafting/copper/waxed_copper_shingle_slab_from_honeycomb.json 790565897535ea2e741d0a0ed7c0b561d594b69a data/create/recipes/crafting/copper/waxed_copper_shingle_stairs_from_honeycomb.json -0c6e14c5884257850c7360cba66bc8cca91c84e7 data/create/recipes/crafting/copper/waxed_copper_tiles_from_honeycomb.json +255c32272a704109fccdbb071d4dbf602cb8c1d8 data/create/recipes/crafting/copper/waxed_copper_shingles_from_honeycomb.json 4693ee65a4a5e1c93fc2acce7bfbc438e573ad9a data/create/recipes/crafting/copper/waxed_copper_tile_slab_from_honeycomb.json f8772b915663e3f70b3a2405a23c5ce87e8b8e49 data/create/recipes/crafting/copper/waxed_copper_tile_stairs_from_honeycomb.json -6d0dacc4db8966d38156fe17645732084379a887 data/create/recipes/crafting/copper/waxed_exposed_copper_shingles_from_honeycomb.json +0c6e14c5884257850c7360cba66bc8cca91c84e7 data/create/recipes/crafting/copper/waxed_copper_tiles_from_honeycomb.json 3bc0b81ea61229e24570e083caa4e5870d517e75 data/create/recipes/crafting/copper/waxed_exposed_copper_shingle_slab_from_honeycomb.json 191f34b27bc8966c2b6ba41403cc0933718748d3 data/create/recipes/crafting/copper/waxed_exposed_copper_shingle_stairs_from_honeycomb.json -cdd66bdfddbcdfacb27c030872d10b6e7f1356fd data/create/recipes/crafting/copper/waxed_exposed_copper_tiles_from_honeycomb.json +6d0dacc4db8966d38156fe17645732084379a887 data/create/recipes/crafting/copper/waxed_exposed_copper_shingles_from_honeycomb.json 2f6d2f8da4d4da2ed48e33d8f6e0b32d37a3ce6d data/create/recipes/crafting/copper/waxed_exposed_copper_tile_slab_from_honeycomb.json 4ed8482ed29fe7c3273db733fa141743c181d460 data/create/recipes/crafting/copper/waxed_exposed_copper_tile_stairs_from_honeycomb.json -0ca4e58d715d5ed4b051a94f2dff42d4d413ef07 data/create/recipes/crafting/copper/waxed_oxidized_copper_shingles_from_honeycomb.json +cdd66bdfddbcdfacb27c030872d10b6e7f1356fd data/create/recipes/crafting/copper/waxed_exposed_copper_tiles_from_honeycomb.json b421f16aea7c47fa8a62e69973f30e4e382f8a2c data/create/recipes/crafting/copper/waxed_oxidized_copper_shingle_slab_from_honeycomb.json 7ab7f673f57e219d3e486d0add1d7e2a8820cc6b data/create/recipes/crafting/copper/waxed_oxidized_copper_shingle_stairs_from_honeycomb.json -b7edffb9b1a936fd34fe23defefc8cb9ea4f6977 data/create/recipes/crafting/copper/waxed_oxidized_copper_tiles_from_honeycomb.json +0ca4e58d715d5ed4b051a94f2dff42d4d413ef07 data/create/recipes/crafting/copper/waxed_oxidized_copper_shingles_from_honeycomb.json 24582e83e8d36a6267df5c028addfb44c1a637e6 data/create/recipes/crafting/copper/waxed_oxidized_copper_tile_slab_from_honeycomb.json 9185ea241bcb5f2fe09d0d5c65832ef379e06c58 data/create/recipes/crafting/copper/waxed_oxidized_copper_tile_stairs_from_honeycomb.json -90bce9f262b87fb821210aceb88d09d815d15e5a data/create/recipes/crafting/copper/waxed_weathered_copper_shingles_from_honeycomb.json +b7edffb9b1a936fd34fe23defefc8cb9ea4f6977 data/create/recipes/crafting/copper/waxed_oxidized_copper_tiles_from_honeycomb.json a2cc99ad9b1234f5327971ee535af9bc25d0154c data/create/recipes/crafting/copper/waxed_weathered_copper_shingle_slab_from_honeycomb.json 0952753a079593d748b38ca84b666f2f886f5c1e data/create/recipes/crafting/copper/waxed_weathered_copper_shingle_stairs_from_honeycomb.json -724802d206db185ebf20bafbcfc35fe0f982f58a data/create/recipes/crafting/copper/waxed_weathered_copper_tiles_from_honeycomb.json +90bce9f262b87fb821210aceb88d09d815d15e5a data/create/recipes/crafting/copper/waxed_weathered_copper_shingles_from_honeycomb.json 98d0b72eb20e1d80cc590800ae2d642a47c3ae5f data/create/recipes/crafting/copper/waxed_weathered_copper_tile_slab_from_honeycomb.json 594b8fd5c30a84df97667b2c6dccc5dedd039d26 data/create/recipes/crafting/copper/waxed_weathered_copper_tile_stairs_from_honeycomb.json +724802d206db185ebf20bafbcfc35fe0f982f58a data/create/recipes/crafting/copper/waxed_weathered_copper_tiles_from_honeycomb.json 97c3e430ef2aecf61c457d0b8c4bbd23e1b01cc3 data/create/recipes/crafting/kinetics/black_seat.json 1129d02609125b48af2efa48f84dd3f90d51a341 data/create/recipes/crafting/kinetics/black_seat_from_other_seat.json 9e5a73e2343054d35e2fbfd20f0c49834d1a87a6 data/create/recipes/crafting/kinetics/black_valve_handle_from_other_valve_handle.json @@ -4090,7 +4090,6 @@ db333d47f9e1d6b02aa670ea0aa10dabbcb0e319 data/create/recipes/crafting/logistics/ c3f4fd2206f3885904913289761f2b8b758e4c95 data/create/recipes/crimsite_pillar_from_stone_types_crimsite_stonecutting.json e1815f97fbc2786d77f5378a2696e36050d8a1fd data/create/recipes/crimson_window.json 96009a12fe3f5ebf677ac069999e2ea2adbc9b7c data/create/recipes/crimson_window_pane.json -82cb9be82ce5109781169bdb47bbd49238b9824b data/create/recipes/cut_andesite_bricks_from_stone_types_andesite_stonecutting.json d6a41fc914a4a41478f115d9503658dba04a4d02 data/create/recipes/cut_andesite_brick_slab.json edf981198463ac58524606f86dc15d2265e8b993 data/create/recipes/cut_andesite_brick_slab_from_stone_types_andesite_stonecutting.json 72486864f3a0d31a92212552441eb659f2541b60 data/create/recipes/cut_andesite_brick_slab_recycling.json @@ -4098,6 +4097,7 @@ edf981198463ac58524606f86dc15d2265e8b993 data/create/recipes/cut_andesite_brick_ 22f463c679249738bf1a340a3b8ff14806303a70 data/create/recipes/cut_andesite_brick_stairs_from_stone_types_andesite_stonecutting.json 42b7105c1d776aed25c1c6bbd9254375079d7438 data/create/recipes/cut_andesite_brick_wall.json 7d25517650c9f66b65f0f8841cf9bcda7ea401ec data/create/recipes/cut_andesite_brick_wall_from_stone_types_andesite_stonecutting.json +82cb9be82ce5109781169bdb47bbd49238b9824b data/create/recipes/cut_andesite_bricks_from_stone_types_andesite_stonecutting.json c3ab483224c3adbd467a4ec0b26a1f6a53fe81c4 data/create/recipes/cut_andesite_from_stone_types_andesite_stonecutting.json 9f316131bb538da9f6b1bde9eaaa0a5bd5972a66 data/create/recipes/cut_andesite_slab.json 50dcff201da369bdc591fdc320aae3547f114284 data/create/recipes/cut_andesite_slab_from_stone_types_andesite_stonecutting.json @@ -4106,7 +4106,6 @@ c3ab483224c3adbd467a4ec0b26a1f6a53fe81c4 data/create/recipes/cut_andesite_from_s c284fc46aabae9c5ab79071eb63ec9b07a9d1002 data/create/recipes/cut_andesite_stairs_from_stone_types_andesite_stonecutting.json 3b6e66e92656ab5b0d1e15444db62ccb1cc01866 data/create/recipes/cut_andesite_wall.json 5df6e8d558f656533aff514aee8cdec7cf8d6fdf data/create/recipes/cut_andesite_wall_from_stone_types_andesite_stonecutting.json -e335b15907be053ab0f2649338b12a86371b78f7 data/create/recipes/cut_asurine_bricks_from_stone_types_asurine_stonecutting.json 41d085d3b8fce5b12d601d86fd0e88df9b482aec data/create/recipes/cut_asurine_brick_slab.json cf61e0806a3988a771675a261a540cbb62352d80 data/create/recipes/cut_asurine_brick_slab_from_stone_types_asurine_stonecutting.json 86606a0717bba33f457707d96461fec6a22d23de data/create/recipes/cut_asurine_brick_slab_recycling.json @@ -4114,6 +4113,7 @@ cf61e0806a3988a771675a261a540cbb62352d80 data/create/recipes/cut_asurine_brick_s 382a7faa460ac286631fe063280541f2f499d895 data/create/recipes/cut_asurine_brick_stairs_from_stone_types_asurine_stonecutting.json 09699c116bb201e742fef1fd3c987e9de4606e6a data/create/recipes/cut_asurine_brick_wall.json 8bb8a9f8e8dd0d6585311c326dcf3f40227149a9 data/create/recipes/cut_asurine_brick_wall_from_stone_types_asurine_stonecutting.json +e335b15907be053ab0f2649338b12a86371b78f7 data/create/recipes/cut_asurine_bricks_from_stone_types_asurine_stonecutting.json 0188d62fbeede94f8596dd5cc73d361a160e8c95 data/create/recipes/cut_asurine_from_stone_types_asurine_stonecutting.json 118e87a2a344238009b1bbbe70e6f314e27842d9 data/create/recipes/cut_asurine_slab.json 37c502094ee96da9e4983142dae5e023c6bcfe14 data/create/recipes/cut_asurine_slab_from_stone_types_asurine_stonecutting.json @@ -4122,7 +4122,6 @@ fe3dd5c7d5bdea71a75003cf3d50439d9d21458d data/create/recipes/cut_asurine_slab_re cade93c9328afcacf4507aa7699c4b09fb4592d4 data/create/recipes/cut_asurine_stairs_from_stone_types_asurine_stonecutting.json 80bec79b5daea4b2b72c0f5e9f189c1044583465 data/create/recipes/cut_asurine_wall.json 45a712e41a74982cfb94a39da199ec6c95eef798 data/create/recipes/cut_asurine_wall_from_stone_types_asurine_stonecutting.json -da11f21280ba1ed06ffe8afe77db3e9e1bbcb1a3 data/create/recipes/cut_calcite_bricks_from_stone_types_calcite_stonecutting.json 98e849c743ed1e4397bf6168215dfa7006a804c4 data/create/recipes/cut_calcite_brick_slab.json 1c21eb6c785729a8ea274513e1313aed952e105e data/create/recipes/cut_calcite_brick_slab_from_stone_types_calcite_stonecutting.json 2a3f078f7f40ba3bc5c17a037db1f8ee415e4e3f data/create/recipes/cut_calcite_brick_slab_recycling.json @@ -4130,6 +4129,7 @@ e4267c62bc6cfc8373df29ee2685f1e1b286b638 data/create/recipes/cut_calcite_brick_s 10fe509e01e3ed1b04bd2f384c0aa3db96b117f1 data/create/recipes/cut_calcite_brick_stairs_from_stone_types_calcite_stonecutting.json 9b55a6c9cf0ce697a242684953daf9aa94d024dc data/create/recipes/cut_calcite_brick_wall.json 1e67376e484923b84bd64b0b22b4e55b581ac419 data/create/recipes/cut_calcite_brick_wall_from_stone_types_calcite_stonecutting.json +da11f21280ba1ed06ffe8afe77db3e9e1bbcb1a3 data/create/recipes/cut_calcite_bricks_from_stone_types_calcite_stonecutting.json 98b014b64c97371f04aaacbdd23e13e274e36e3b data/create/recipes/cut_calcite_from_stone_types_calcite_stonecutting.json fcab91f11fe97a194b2c1b16115206166d3cd634 data/create/recipes/cut_calcite_slab.json 8426a494b776148056cb4525e62744d0be8b28cd data/create/recipes/cut_calcite_slab_from_stone_types_calcite_stonecutting.json @@ -4138,7 +4138,6 @@ fcab91f11fe97a194b2c1b16115206166d3cd634 data/create/recipes/cut_calcite_slab.js a7e7fb425d3c1f21f5ed53da79957363fed824df data/create/recipes/cut_calcite_stairs_from_stone_types_calcite_stonecutting.json 73eaf7bffa38bc874974871f3002cd3ee7f0c36e data/create/recipes/cut_calcite_wall.json 01b4c23362f15ee0e5c207c46383f96032c89d98 data/create/recipes/cut_calcite_wall_from_stone_types_calcite_stonecutting.json -07aff2bb6424de46463b2c965418ed52efd0a790 data/create/recipes/cut_crimsite_bricks_from_stone_types_crimsite_stonecutting.json 8ffb2c1c747f19ea37c0da3fe248b6c58981c9f6 data/create/recipes/cut_crimsite_brick_slab.json 86c3a5c64561052489b3ceb9e08be5a8729198a9 data/create/recipes/cut_crimsite_brick_slab_from_stone_types_crimsite_stonecutting.json e3215d4e651e70402b896ba50975cb2f23d16278 data/create/recipes/cut_crimsite_brick_slab_recycling.json @@ -4146,6 +4145,7 @@ e49f6e319fae9058cbece0e332a11e108234e608 data/create/recipes/cut_crimsite_brick_ c7186fb1a75f59aff929e843f50a162a090b7bb3 data/create/recipes/cut_crimsite_brick_stairs_from_stone_types_crimsite_stonecutting.json 272d8d01730a88eff4fc6923e93962650b992c46 data/create/recipes/cut_crimsite_brick_wall.json 13ac9464098e8c67e820dc898c025ab0382d852a data/create/recipes/cut_crimsite_brick_wall_from_stone_types_crimsite_stonecutting.json +07aff2bb6424de46463b2c965418ed52efd0a790 data/create/recipes/cut_crimsite_bricks_from_stone_types_crimsite_stonecutting.json 18ce9ff32eda2d869bd11f398a86e78b71f6d0fe data/create/recipes/cut_crimsite_from_stone_types_crimsite_stonecutting.json c39166aa6267ec5bc71893d5756955abfb644217 data/create/recipes/cut_crimsite_slab.json 6271d5bc0377814ba06061bfffcb812ca2ef8f03 data/create/recipes/cut_crimsite_slab_from_stone_types_crimsite_stonecutting.json @@ -4154,7 +4154,6 @@ acfe33dbb889c820c213bcbc8593766703bf3a25 data/create/recipes/cut_crimsite_slab_r 90b03cf1e72d3b803e33755832e0722ff264681b data/create/recipes/cut_crimsite_stairs_from_stone_types_crimsite_stonecutting.json 8dfe19522878af232deaa1fc13d83cf785684cba data/create/recipes/cut_crimsite_wall.json 18f9548175baab0173785d7ef308096067712dd2 data/create/recipes/cut_crimsite_wall_from_stone_types_crimsite_stonecutting.json -de1a11b7ed71f1f7aeea2791fe922feef689fd35 data/create/recipes/cut_deepslate_bricks_from_stone_types_deepslate_stonecutting.json 5e5c0e6b1b3e204de3c48fb6a4cd473a150979c2 data/create/recipes/cut_deepslate_brick_slab.json 2c0795b92759dab751f86f50aa80440df2245526 data/create/recipes/cut_deepslate_brick_slab_from_stone_types_deepslate_stonecutting.json dbcc41c48cf28b71dcd9f3b6ecae43c8de681532 data/create/recipes/cut_deepslate_brick_slab_recycling.json @@ -4162,6 +4161,7 @@ e21f8dc33e70ebd43ea79a4afaf3b4e8a449f4bd data/create/recipes/cut_deepslate_brick 7b3489e5b629a995691be117c5a378769c743449 data/create/recipes/cut_deepslate_brick_stairs_from_stone_types_deepslate_stonecutting.json 158bb41bffebb2543e4aa2d5f14cc8af1cdd8671 data/create/recipes/cut_deepslate_brick_wall.json 73a07a5fa665bb20d131f0a0e40806116316928a data/create/recipes/cut_deepslate_brick_wall_from_stone_types_deepslate_stonecutting.json +de1a11b7ed71f1f7aeea2791fe922feef689fd35 data/create/recipes/cut_deepslate_bricks_from_stone_types_deepslate_stonecutting.json 992fdc2eba2afe3ff8aad0ceee5424ecd3f3026d data/create/recipes/cut_deepslate_from_stone_types_deepslate_stonecutting.json 064e2f5edd9209af7742b0f0eb45204453bed46f data/create/recipes/cut_deepslate_slab.json f341d30b7fd427dea09a51d67e1e9532e5184be8 data/create/recipes/cut_deepslate_slab_from_stone_types_deepslate_stonecutting.json @@ -4170,7 +4170,6 @@ c08e12e44344efca550efa8ba14d0cb2f9f6c2c6 data/create/recipes/cut_deepslate_stair e6deec1352fb5c74c470dc488b71e5f8f55bdfbf data/create/recipes/cut_deepslate_stairs_from_stone_types_deepslate_stonecutting.json 2ad7fb3f3a143e58bea8eefe4cd9db3d1c37a3e6 data/create/recipes/cut_deepslate_wall.json e752527479f71f96bb34878008bf8cfb23fd3045 data/create/recipes/cut_deepslate_wall_from_stone_types_deepslate_stonecutting.json -2c23d13f48f3685bda6c564e080053fbfa71ab99 data/create/recipes/cut_diorite_bricks_from_stone_types_diorite_stonecutting.json 90b83c2a2026d70f49c91813305fdee721926db9 data/create/recipes/cut_diorite_brick_slab.json 9d51c690c77321437561a006dc2f9bba975875e6 data/create/recipes/cut_diorite_brick_slab_from_stone_types_diorite_stonecutting.json fa76e64ac9b569f5d5f2f1ecc54e51f9be15aacf data/create/recipes/cut_diorite_brick_slab_recycling.json @@ -4178,6 +4177,7 @@ aa6aea99e9ce2d5dc3d6555ab3d17928bca6195e data/create/recipes/cut_diorite_brick_s 9a26c4097519a9300e591b6578bbaf6c11f909e1 data/create/recipes/cut_diorite_brick_stairs_from_stone_types_diorite_stonecutting.json 78d37df17c7e2be73ce1d226ee552ff3f49b9e4f data/create/recipes/cut_diorite_brick_wall.json f668f2c78a779bc3d0546a82dea02b9f4688e05c data/create/recipes/cut_diorite_brick_wall_from_stone_types_diorite_stonecutting.json +2c23d13f48f3685bda6c564e080053fbfa71ab99 data/create/recipes/cut_diorite_bricks_from_stone_types_diorite_stonecutting.json 1918ecb2ab16ca7dbb30eee4852b67dd963d872e data/create/recipes/cut_diorite_from_stone_types_diorite_stonecutting.json 07fda5c89128648856f948a03ac56a2a2693cf1b data/create/recipes/cut_diorite_slab.json 28765ac7f8b62373b32f014d1dd7f4afb50e1906 data/create/recipes/cut_diorite_slab_from_stone_types_diorite_stonecutting.json @@ -4186,7 +4186,6 @@ dd5f3c59a5d292f7b5c046be35da7f67e8383aa1 data/create/recipes/cut_diorite_slab_re be2c6c01630b90895e7215edce3d02352793dbc4 data/create/recipes/cut_diorite_stairs_from_stone_types_diorite_stonecutting.json 8984b7b7dbc7e65ee04886516501a13278e889e9 data/create/recipes/cut_diorite_wall.json 8ff5d1ecff2202595f7cba5bd65c466c53ac2cc5 data/create/recipes/cut_diorite_wall_from_stone_types_diorite_stonecutting.json -10550b023989113c26d430136daf1dc49f10ce63 data/create/recipes/cut_dripstone_bricks_from_stone_types_dripstone_stonecutting.json 95717a80bb8ae296c2f77478a8f42b88cea88996 data/create/recipes/cut_dripstone_brick_slab.json f04bf1189b53e24974779d9e959e8973d9677162 data/create/recipes/cut_dripstone_brick_slab_from_stone_types_dripstone_stonecutting.json 332534fc2909ca83f5f7f4ab3adf92680bb17f79 data/create/recipes/cut_dripstone_brick_slab_recycling.json @@ -4194,6 +4193,7 @@ f04bf1189b53e24974779d9e959e8973d9677162 data/create/recipes/cut_dripstone_brick 17bf8160eaf16655d454ddfe22b82c9a86462146 data/create/recipes/cut_dripstone_brick_stairs_from_stone_types_dripstone_stonecutting.json 7d638d156326a2e542ed94837273d9cca5cf4fce data/create/recipes/cut_dripstone_brick_wall.json 154931db54115cf4a64147cdd6d1eb7efff48737 data/create/recipes/cut_dripstone_brick_wall_from_stone_types_dripstone_stonecutting.json +10550b023989113c26d430136daf1dc49f10ce63 data/create/recipes/cut_dripstone_bricks_from_stone_types_dripstone_stonecutting.json 7147f9199f174c9864109fe5723528921aaa0c46 data/create/recipes/cut_dripstone_from_stone_types_dripstone_stonecutting.json f2800b467eac75d0099f2f07e09b47115df4e09f data/create/recipes/cut_dripstone_slab.json a4f62a1a30592f82789988f93d8ae35d176eca59 data/create/recipes/cut_dripstone_slab_from_stone_types_dripstone_stonecutting.json @@ -4202,7 +4202,6 @@ a4f62a1a30592f82789988f93d8ae35d176eca59 data/create/recipes/cut_dripstone_slab_ f2df5efedb6fb25ecb877b888007990082d9aca4 data/create/recipes/cut_dripstone_stairs_from_stone_types_dripstone_stonecutting.json a177092d0270f9e07a4f9bef4d0c8fb2ed91d3bc data/create/recipes/cut_dripstone_wall.json a3731ef689d3ac790bc3e3fd507f1134c99a751a data/create/recipes/cut_dripstone_wall_from_stone_types_dripstone_stonecutting.json -9c4c64666b18d3adb11cd3d56667fabf6e88dfe2 data/create/recipes/cut_granite_bricks_from_stone_types_granite_stonecutting.json aa454bebffd7e77cfa5c1bd711bfbac27e3c5a14 data/create/recipes/cut_granite_brick_slab.json d073b9b0b8ca2fbdc5e1ed16f6f195a5f3af4588 data/create/recipes/cut_granite_brick_slab_from_stone_types_granite_stonecutting.json 1dfd539c17a3342a0cd194ce1465a808aacbeda3 data/create/recipes/cut_granite_brick_slab_recycling.json @@ -4210,6 +4209,7 @@ e069aa5c316feb2823ef98e8e6c89bb1bed23d2e data/create/recipes/cut_granite_brick_s f38fc7014aa83d4914d50d87ee3f8f762c078a78 data/create/recipes/cut_granite_brick_stairs_from_stone_types_granite_stonecutting.json 0fd9c3a778c7bdcd7aa06f892a9c260ad664d367 data/create/recipes/cut_granite_brick_wall.json b81db94b6228f512049324dd1436880f1e86e444 data/create/recipes/cut_granite_brick_wall_from_stone_types_granite_stonecutting.json +9c4c64666b18d3adb11cd3d56667fabf6e88dfe2 data/create/recipes/cut_granite_bricks_from_stone_types_granite_stonecutting.json 01970a95f17648a7ef1fb0337ee2e82eb2279e9e data/create/recipes/cut_granite_from_stone_types_granite_stonecutting.json 8fc1c51591e590c8718be0500a4dbcc2b47830ce data/create/recipes/cut_granite_slab.json d239323b7a3b65b2fd7005350a90d578671c2b81 data/create/recipes/cut_granite_slab_from_stone_types_granite_stonecutting.json @@ -4218,7 +4218,6 @@ d239323b7a3b65b2fd7005350a90d578671c2b81 data/create/recipes/cut_granite_slab_fr 3d85d483073d37fea7d9a95831b3b856c0725b98 data/create/recipes/cut_granite_stairs_from_stone_types_granite_stonecutting.json 3d4130fe5fe6e963fd5e10534e729e0448b9f05f data/create/recipes/cut_granite_wall.json d43a876bf89bf3536c80fd5e3ef0ee36c147cd06 data/create/recipes/cut_granite_wall_from_stone_types_granite_stonecutting.json -7cdd3cf302cfe4ef21c0a89dadef4f781e307bb0 data/create/recipes/cut_limestone_bricks_from_stone_types_limestone_stonecutting.json 0e3285206947bcfdf9606d3f8e61ea7d2899f7d2 data/create/recipes/cut_limestone_brick_slab.json c3d3ff37e29c435b2a13d30bd4ded0f6ca9fbfbc data/create/recipes/cut_limestone_brick_slab_from_stone_types_limestone_stonecutting.json 459babb2bd01e9e1ece4c8cd2865690997f01c66 data/create/recipes/cut_limestone_brick_slab_recycling.json @@ -4226,6 +4225,7 @@ d4f8dc640becf1c35416016500424ecd68d7ecee data/create/recipes/cut_limestone_brick 570983b2b27862dabe9f3d1bcd76d2909b8bdb3c data/create/recipes/cut_limestone_brick_stairs_from_stone_types_limestone_stonecutting.json aad4342a726fd65ca2b4c52a4e8857190e50b5be data/create/recipes/cut_limestone_brick_wall.json 5ac226aff9d854efc47ed71241e6c098b170b9b0 data/create/recipes/cut_limestone_brick_wall_from_stone_types_limestone_stonecutting.json +7cdd3cf302cfe4ef21c0a89dadef4f781e307bb0 data/create/recipes/cut_limestone_bricks_from_stone_types_limestone_stonecutting.json 329950373aaaf8e70c54cf5e2467c7a84f372078 data/create/recipes/cut_limestone_from_stone_types_limestone_stonecutting.json cbacfd31703ac908d28e42968bb571dccfa20612 data/create/recipes/cut_limestone_slab.json 628a0a64c2dcd63f17a3ec9ce55ac643b194eacc data/create/recipes/cut_limestone_slab_from_stone_types_limestone_stonecutting.json @@ -4234,7 +4234,6 @@ cbacfd31703ac908d28e42968bb571dccfa20612 data/create/recipes/cut_limestone_slab. ba301da212ee14ff42c38487d0906a2da203e3c3 data/create/recipes/cut_limestone_stairs_from_stone_types_limestone_stonecutting.json d2aac4ac16f9c842af1efd3896dd3250f6d8424e data/create/recipes/cut_limestone_wall.json b14e6972f8586e569a7ab4ecf6ed5d6db1a2bded data/create/recipes/cut_limestone_wall_from_stone_types_limestone_stonecutting.json -a1a2b95283d88e1d990e00da9a095fe928b2aa2f data/create/recipes/cut_ochrum_bricks_from_stone_types_ochrum_stonecutting.json d5a4fa7787d2e56e0b5c8d533567543b93cf694b data/create/recipes/cut_ochrum_brick_slab.json 58514a5f216706e9bb62b27ad03701fe02bac013 data/create/recipes/cut_ochrum_brick_slab_from_stone_types_ochrum_stonecutting.json 6cc3167ebf075d7b302a359d1afdddf5753d0e26 data/create/recipes/cut_ochrum_brick_slab_recycling.json @@ -4242,6 +4241,7 @@ d5a4fa7787d2e56e0b5c8d533567543b93cf694b data/create/recipes/cut_ochrum_brick_sl ec6339d6658b0d32e46c8a4a4e06d94a388a6332 data/create/recipes/cut_ochrum_brick_stairs_from_stone_types_ochrum_stonecutting.json c4139ae7a9742f7111d308fe66bf1d627533550b data/create/recipes/cut_ochrum_brick_wall.json 1b8a4c81680df542a5e6b9e665c96649cf3eb7fa data/create/recipes/cut_ochrum_brick_wall_from_stone_types_ochrum_stonecutting.json +a1a2b95283d88e1d990e00da9a095fe928b2aa2f data/create/recipes/cut_ochrum_bricks_from_stone_types_ochrum_stonecutting.json 2b967f3424196b5da9b396ea58fb969d406af789 data/create/recipes/cut_ochrum_from_stone_types_ochrum_stonecutting.json 5baa701f3cbe8d69e2e6a5554622dd78ef3ac451 data/create/recipes/cut_ochrum_slab.json 9a26cba276cf135a10c71d31f5b960b2ee6ac444 data/create/recipes/cut_ochrum_slab_from_stone_types_ochrum_stonecutting.json @@ -4250,7 +4250,6 @@ c4139ae7a9742f7111d308fe66bf1d627533550b data/create/recipes/cut_ochrum_brick_wa 75a232ccede0ffa7feb3e69da17c6a514a908907 data/create/recipes/cut_ochrum_stairs_from_stone_types_ochrum_stonecutting.json d9c05b7e4ce4ee86d0f6a9e1ee6c1b585ffee58b data/create/recipes/cut_ochrum_wall.json ee0dff8e1317aeffd061688879b97e81a00b7adb data/create/recipes/cut_ochrum_wall_from_stone_types_ochrum_stonecutting.json -087eefb8ffd61fd88f1db6ca25f9ac31e93f2fdf data/create/recipes/cut_scorchia_bricks_from_stone_types_scorchia_stonecutting.json 72ac9293e5791df07914e2d3ed00e5ff59d64b08 data/create/recipes/cut_scorchia_brick_slab.json 2f38c410d5eb93bdb8c8be0f68ac89726e3c765c data/create/recipes/cut_scorchia_brick_slab_from_stone_types_scorchia_stonecutting.json e296e6af6865bf6e4618dab8a96bb88f6999a9a5 data/create/recipes/cut_scorchia_brick_slab_recycling.json @@ -4258,6 +4257,7 @@ bd5984a6b96443319b7fad32db771d8ded0b0591 data/create/recipes/cut_scorchia_brick_ bd5c803c855222a29998dd784e6d12a18dd612d9 data/create/recipes/cut_scorchia_brick_stairs_from_stone_types_scorchia_stonecutting.json adfe0b08b5b72e579d47f36a4f835045e433e7f7 data/create/recipes/cut_scorchia_brick_wall.json 37fc5ae45d0260de9a5c45b0a1b208e4d146a562 data/create/recipes/cut_scorchia_brick_wall_from_stone_types_scorchia_stonecutting.json +087eefb8ffd61fd88f1db6ca25f9ac31e93f2fdf data/create/recipes/cut_scorchia_bricks_from_stone_types_scorchia_stonecutting.json f6dfd648418f24da093b80978c2f6e070f33ff6d data/create/recipes/cut_scorchia_from_stone_types_scorchia_stonecutting.json 7df99605c0c8761aeb9301d5391e1f16d41f89b3 data/create/recipes/cut_scorchia_slab.json fbd9a92d3c3d9e823cac51347320219f1734ec04 data/create/recipes/cut_scorchia_slab_from_stone_types_scorchia_stonecutting.json @@ -4266,7 +4266,6 @@ ad54182c3142ac9d9dd9bb4c5acc18f82e3fc5e5 data/create/recipes/cut_scorchia_stairs 1ddfefce136201ae78dbc53ba472080332fd6366 data/create/recipes/cut_scorchia_stairs_from_stone_types_scorchia_stonecutting.json 0a011b7cee33200fec5546168734c330952124da data/create/recipes/cut_scorchia_wall.json c594d886a303ad6e24d1283004442835ee861fbc data/create/recipes/cut_scorchia_wall_from_stone_types_scorchia_stonecutting.json -8650c0db70a3521b50404252106e0185b4f25a45 data/create/recipes/cut_scoria_bricks_from_stone_types_scoria_stonecutting.json 8baf09b5ff2004d71091b6f95307aa179a21f4df data/create/recipes/cut_scoria_brick_slab.json e7080ca9b6a507bec4a4a3dd52a28c1c33975628 data/create/recipes/cut_scoria_brick_slab_from_stone_types_scoria_stonecutting.json f5b56f6eb9c1ac0f8168b2b0f0b0ab00655ebfdb data/create/recipes/cut_scoria_brick_slab_recycling.json @@ -4274,6 +4273,7 @@ f5b56f6eb9c1ac0f8168b2b0f0b0ab00655ebfdb data/create/recipes/cut_scoria_brick_sl 3fd560355163f0afafefe886e75fd8b2c3cf2b6f data/create/recipes/cut_scoria_brick_stairs_from_stone_types_scoria_stonecutting.json ed803a4cdcf1dd01af03fff52e783f3539f78546 data/create/recipes/cut_scoria_brick_wall.json 553642a4e0dc5f934da8127a427ccdf53d3f51f9 data/create/recipes/cut_scoria_brick_wall_from_stone_types_scoria_stonecutting.json +8650c0db70a3521b50404252106e0185b4f25a45 data/create/recipes/cut_scoria_bricks_from_stone_types_scoria_stonecutting.json 5702063be3d38fa6b3ae5c998337676a0cf91149 data/create/recipes/cut_scoria_from_stone_types_scoria_stonecutting.json 295356022aee8a33272b430879615af638fc5a2c data/create/recipes/cut_scoria_slab.json 1656e822e823fcdf04120b55235aa477845a69a6 data/create/recipes/cut_scoria_slab_from_stone_types_scoria_stonecutting.json @@ -4282,7 +4282,6 @@ d0c88c037004911e377d88cf5a28ff85a413d07e data/create/recipes/cut_scoria_slab_rec 8748df6152c923930452397367562bb6007058cf data/create/recipes/cut_scoria_stairs_from_stone_types_scoria_stonecutting.json 7f9bd9de7bfba21eef449f8e11ffc8cf37de6b88 data/create/recipes/cut_scoria_wall.json 42235c6ded520ecda3321e8cd8910dcfa05cd61e data/create/recipes/cut_scoria_wall_from_stone_types_scoria_stonecutting.json -c02b4daf0050d705c145c0698aaa3094724ba2f1 data/create/recipes/cut_tuff_bricks_from_stone_types_tuff_stonecutting.json 214b6219b86d94ea5705e40f254a4d9a9ac894b7 data/create/recipes/cut_tuff_brick_slab.json 9e0182206fab754daa0596259be0b98a712ba859 data/create/recipes/cut_tuff_brick_slab_from_stone_types_tuff_stonecutting.json 86938ed4ef969e85163c25e2a60181433247b73b data/create/recipes/cut_tuff_brick_slab_recycling.json @@ -4290,6 +4289,7 @@ b4212528d6c8893c1d57c0a5ada60673105e399d data/create/recipes/cut_tuff_brick_stai 90f3241a3eb47d9b0902b639fadee76e41b92a72 data/create/recipes/cut_tuff_brick_stairs_from_stone_types_tuff_stonecutting.json b920d14ac41465f70b1fb8211c1c06d6c41ccadb data/create/recipes/cut_tuff_brick_wall.json aa41f89028dfa995dc11b881894e5a5993e4c4f9 data/create/recipes/cut_tuff_brick_wall_from_stone_types_tuff_stonecutting.json +c02b4daf0050d705c145c0698aaa3094724ba2f1 data/create/recipes/cut_tuff_bricks_from_stone_types_tuff_stonecutting.json 41dc800ae0a8918f4602d610ff0ba9714cdfe8dc data/create/recipes/cut_tuff_from_stone_types_tuff_stonecutting.json 573fff8b4fba92289dc6b113b58c8de25427f62d data/create/recipes/cut_tuff_slab.json 94667fb1e6203bd66bef10acfee7cd990009d26f data/create/recipes/cut_tuff_slab_from_stone_types_tuff_stonecutting.json @@ -4298,7 +4298,6 @@ aa41f89028dfa995dc11b881894e5a5993e4c4f9 data/create/recipes/cut_tuff_brick_wall 3b3ba319bd67a4e7f555cfcb54f9dc1fc22cf015 data/create/recipes/cut_tuff_stairs_from_stone_types_tuff_stonecutting.json 0c241d763e87b23b8799528e132e0d12b0e16141 data/create/recipes/cut_tuff_wall.json 5705b0312c5c70d48662c2ff375f0b2cfe3b4902 data/create/recipes/cut_tuff_wall_from_stone_types_tuff_stonecutting.json -8ab3c640b57421a8c0341ab4ec5bade31376d059 data/create/recipes/cut_veridium_bricks_from_stone_types_veridium_stonecutting.json 822f97726c72d31c4c614767c08140b3535e0640 data/create/recipes/cut_veridium_brick_slab.json 1705fd5fc9ecc9a650812c89f500b5ef9aec2626 data/create/recipes/cut_veridium_brick_slab_from_stone_types_veridium_stonecutting.json 238aeedf55624671809a37246581d28fe6b2c19e data/create/recipes/cut_veridium_brick_slab_recycling.json @@ -4306,6 +4305,7 @@ dfbef691643cead7111b3b1c51aabcda8419bc19 data/create/recipes/cut_veridium_brick_ db2ea87f3ec8924ba9e0b87cd6a6edeb93c0c2d8 data/create/recipes/cut_veridium_brick_stairs_from_stone_types_veridium_stonecutting.json 5e5c9fab7ba7143d206df7d8184742fb1a17c99c data/create/recipes/cut_veridium_brick_wall.json ed752a7f698e3ecbb5e4f848a78f8b3c7c6bf12e data/create/recipes/cut_veridium_brick_wall_from_stone_types_veridium_stonecutting.json +8ab3c640b57421a8c0341ab4ec5bade31376d059 data/create/recipes/cut_veridium_bricks_from_stone_types_veridium_stonecutting.json e0355543105e4ec9d672d2a050e70b5c198ea472 data/create/recipes/cut_veridium_from_stone_types_veridium_stonecutting.json fb3c671f64676538ea3aa96be483ac15b3cdeb3d data/create/recipes/cut_veridium_slab.json 7d7c80ac03ad8623f9a5d7f0ff0bb6f68985efa5 data/create/recipes/cut_veridium_slab_from_stone_types_veridium_stonecutting.json @@ -4491,7 +4491,6 @@ a157a43e7788d285b8d72eade5955369c9b9a1de data/create/recipes/rose_quartz_block_f 1268cc2bdd088d26b84fb4e481db27af61f94bd1 data/create/recipes/scorchia_pillar_from_stone_types_scorchia_stonecutting.json 2e8f4cdb3498547a5e6fe658bb33d4be5ce8f54b data/create/recipes/scoria_from_stone_types_scoria_stonecutting.json 770d3453c75f77b16db661f6e636892d3117690b data/create/recipes/scoria_pillar_from_stone_types_scoria_stonecutting.json -75dc56fcdcd6a10288f2d607bf6dcbbe10b35a64 data/create/recipes/small_andesite_bricks_from_stone_types_andesite_stonecutting.json 2e86fddc76285b4e380b845eb1150580b134d0ac data/create/recipes/small_andesite_brick_slab.json 311727e5c08ddbe0aa26275be74e9b83201ac8ab data/create/recipes/small_andesite_brick_slab_from_stone_types_andesite_stonecutting.json 2767e239c9d704b6bb5325b4f40e0aa0acdcdce1 data/create/recipes/small_andesite_brick_slab_recycling.json @@ -4499,7 +4498,7 @@ a157a43e7788d285b8d72eade5955369c9b9a1de data/create/recipes/rose_quartz_block_f 9e82896e00c1e14e514fac818e11e5b9ef5b10d7 data/create/recipes/small_andesite_brick_stairs_from_stone_types_andesite_stonecutting.json 5287d389b4954d954881d9f0293c52870bba88d0 data/create/recipes/small_andesite_brick_wall.json 1172ca76affd948c50b207124ee03c4f480f4ee8 data/create/recipes/small_andesite_brick_wall_from_stone_types_andesite_stonecutting.json -e3b69122b2cfe64b043384235eeb6d04f346e58b data/create/recipes/small_asurine_bricks_from_stone_types_asurine_stonecutting.json +75dc56fcdcd6a10288f2d607bf6dcbbe10b35a64 data/create/recipes/small_andesite_bricks_from_stone_types_andesite_stonecutting.json 9196a055491052afc14ed01667cccf2a0920e793 data/create/recipes/small_asurine_brick_slab.json f4cc3330837a647c098ccb24fbbbf583c3f960fc data/create/recipes/small_asurine_brick_slab_from_stone_types_asurine_stonecutting.json 063b2f0ad7e93698999922040132eb2b23661a38 data/create/recipes/small_asurine_brick_slab_recycling.json @@ -4507,7 +4506,7 @@ a85d2f957223f87ffa2c3f63cdf6f9f0f84bb921 data/create/recipes/small_asurine_brick c7cb218b0d8a1e358d593fc1fef82fc074289552 data/create/recipes/small_asurine_brick_stairs_from_stone_types_asurine_stonecutting.json 08d10ee57995e67ac1fb5feba04b03aee51dbe16 data/create/recipes/small_asurine_brick_wall.json 4c0aa6203295a36a6d7ffe9d7bf0973277162689 data/create/recipes/small_asurine_brick_wall_from_stone_types_asurine_stonecutting.json -07125218f9025833afa189fa0090f4d6b4660db0 data/create/recipes/small_calcite_bricks_from_stone_types_calcite_stonecutting.json +e3b69122b2cfe64b043384235eeb6d04f346e58b data/create/recipes/small_asurine_bricks_from_stone_types_asurine_stonecutting.json a72719de028ca9e07756dae6031af48525520fc2 data/create/recipes/small_calcite_brick_slab.json d8ebf6f1eb2e2372fb20def956398089adec5d13 data/create/recipes/small_calcite_brick_slab_from_stone_types_calcite_stonecutting.json ab4cfc2b34989d41a434781a3150ecd530c4f15b data/create/recipes/small_calcite_brick_slab_recycling.json @@ -4515,7 +4514,7 @@ c77a7700d978e23db14d947915591061dda8eab3 data/create/recipes/small_calcite_brick 4e066bfc60ea142d54ce939d025b6679ac9634ad data/create/recipes/small_calcite_brick_stairs_from_stone_types_calcite_stonecutting.json 64e53d8090fa26cc4cb62efea7c1615ff7f705c2 data/create/recipes/small_calcite_brick_wall.json 3ba736ae76249fa61692c13f7879af954f9bbd36 data/create/recipes/small_calcite_brick_wall_from_stone_types_calcite_stonecutting.json -a3309c81f84bf4fb78e9db2316fb758f9b2f8429 data/create/recipes/small_crimsite_bricks_from_stone_types_crimsite_stonecutting.json +07125218f9025833afa189fa0090f4d6b4660db0 data/create/recipes/small_calcite_bricks_from_stone_types_calcite_stonecutting.json 92cf7e99229c1e72405bb0875e6f939b3f5aea12 data/create/recipes/small_crimsite_brick_slab.json b993e081103c019b7b9b73b38ef8c408fb4500ac data/create/recipes/small_crimsite_brick_slab_from_stone_types_crimsite_stonecutting.json 7f6fa1fab65d910388f5f2ec4ee7d99cbda8df57 data/create/recipes/small_crimsite_brick_slab_recycling.json @@ -4523,7 +4522,7 @@ b993e081103c019b7b9b73b38ef8c408fb4500ac data/create/recipes/small_crimsite_bric 260da721849d1afd6f431d51538d1587ee3af8d5 data/create/recipes/small_crimsite_brick_stairs_from_stone_types_crimsite_stonecutting.json 093ac919f793111b442029198383a9de5b6df027 data/create/recipes/small_crimsite_brick_wall.json 8b8280a8282fa8718620ee3d69182e241a7852c0 data/create/recipes/small_crimsite_brick_wall_from_stone_types_crimsite_stonecutting.json -e7a3cb889ce6b530cd40f19e23bad943374e61b5 data/create/recipes/small_deepslate_bricks_from_stone_types_deepslate_stonecutting.json +a3309c81f84bf4fb78e9db2316fb758f9b2f8429 data/create/recipes/small_crimsite_bricks_from_stone_types_crimsite_stonecutting.json 022690548a46f5cc63adda3626824a81c6ebf490 data/create/recipes/small_deepslate_brick_slab.json 655be9ddf21dea2255fb2cb2628a5fee39eb10e2 data/create/recipes/small_deepslate_brick_slab_from_stone_types_deepslate_stonecutting.json d6d3db5604279cd402f64dbdeae7c3bee6d7ab78 data/create/recipes/small_deepslate_brick_slab_recycling.json @@ -4531,7 +4530,7 @@ d6d3db5604279cd402f64dbdeae7c3bee6d7ab78 data/create/recipes/small_deepslate_bri 0a458e8248fe395748bd6025d43c002db5a7d343 data/create/recipes/small_deepslate_brick_stairs_from_stone_types_deepslate_stonecutting.json 96e2c36ac2f2899c9681f12f43c8ae232ae09180 data/create/recipes/small_deepslate_brick_wall.json e5644f4227b9cc9b98158ce3ded98bff1ffb97f9 data/create/recipes/small_deepslate_brick_wall_from_stone_types_deepslate_stonecutting.json -38b80603a86df24f6be0df9fd5f7d9b7aa33d2f9 data/create/recipes/small_diorite_bricks_from_stone_types_diorite_stonecutting.json +e7a3cb889ce6b530cd40f19e23bad943374e61b5 data/create/recipes/small_deepslate_bricks_from_stone_types_deepslate_stonecutting.json 6c66b44941c8b97cfec5948b5d8b08355f8d8f67 data/create/recipes/small_diorite_brick_slab.json 801f6cc6e06db56344b37c9b76c69f921c6d9293 data/create/recipes/small_diorite_brick_slab_from_stone_types_diorite_stonecutting.json c1fe4bff306e2d2b5d5595e4b35dd85f7e6bf0ce data/create/recipes/small_diorite_brick_slab_recycling.json @@ -4539,7 +4538,7 @@ af6feedf00bdfa45c1b8f0dd46ddaa80da622fed data/create/recipes/small_diorite_brick 30a6f2bdfec2b3f578572c9f94112906411e7c54 data/create/recipes/small_diorite_brick_stairs_from_stone_types_diorite_stonecutting.json 8728b791808736de2ac31e8dc81aa43638ae0ac8 data/create/recipes/small_diorite_brick_wall.json 7a1fdcef7091d76230fbee410fa5241f584845c4 data/create/recipes/small_diorite_brick_wall_from_stone_types_diorite_stonecutting.json -8840d538648516dd02628fbe3ea4f032ceda78bb data/create/recipes/small_dripstone_bricks_from_stone_types_dripstone_stonecutting.json +38b80603a86df24f6be0df9fd5f7d9b7aa33d2f9 data/create/recipes/small_diorite_bricks_from_stone_types_diorite_stonecutting.json 39a545b60040bd2d922cd3bd5af5036b1b9b23ef data/create/recipes/small_dripstone_brick_slab.json c91e4dc211305456c38e5823def91811ad851202 data/create/recipes/small_dripstone_brick_slab_from_stone_types_dripstone_stonecutting.json 55bb37d07e841bb8eecf2013445c01c8e09ff824 data/create/recipes/small_dripstone_brick_slab_recycling.json @@ -4547,7 +4546,7 @@ c91e4dc211305456c38e5823def91811ad851202 data/create/recipes/small_dripstone_bri 1e23c8df90aef6cd3561369f72c6c3106da883f5 data/create/recipes/small_dripstone_brick_stairs_from_stone_types_dripstone_stonecutting.json fda46cc15c21e7843537df5b5331874fd7511e19 data/create/recipes/small_dripstone_brick_wall.json 336e47b35437ffea4bb86d34f94e6361b2bbcfb0 data/create/recipes/small_dripstone_brick_wall_from_stone_types_dripstone_stonecutting.json -42c74dec6c64d3675e15b2b73cb32fc9d24839e9 data/create/recipes/small_granite_bricks_from_stone_types_granite_stonecutting.json +8840d538648516dd02628fbe3ea4f032ceda78bb data/create/recipes/small_dripstone_bricks_from_stone_types_dripstone_stonecutting.json d1bb4e91d80ca8eb9c2f935cbb66ef08b9ca7059 data/create/recipes/small_granite_brick_slab.json ddb2f4652607b56332a927af939212a5789a34db data/create/recipes/small_granite_brick_slab_from_stone_types_granite_stonecutting.json f1388636bcf98d7d9103c23528053b28c6305b4e data/create/recipes/small_granite_brick_slab_recycling.json @@ -4555,7 +4554,7 @@ f1388636bcf98d7d9103c23528053b28c6305b4e data/create/recipes/small_granite_brick ba935a3d64eedbd9b7017d0abfab351f57589593 data/create/recipes/small_granite_brick_stairs_from_stone_types_granite_stonecutting.json dac22c54e8034587a3fcf3aa0ce19bb4b7607cd7 data/create/recipes/small_granite_brick_wall.json 7a8d9e2291675de9e72363d93410de9039216f32 data/create/recipes/small_granite_brick_wall_from_stone_types_granite_stonecutting.json -714f6a84a5b3d5d57c07364925555e6f545b0b3d data/create/recipes/small_limestone_bricks_from_stone_types_limestone_stonecutting.json +42c74dec6c64d3675e15b2b73cb32fc9d24839e9 data/create/recipes/small_granite_bricks_from_stone_types_granite_stonecutting.json b844632a588cb96397750f4387c7e6517f85092c data/create/recipes/small_limestone_brick_slab.json a1c0bc263cd4659a89213f4fcdd87eba7ae04427 data/create/recipes/small_limestone_brick_slab_from_stone_types_limestone_stonecutting.json ec9154a3791113f57dc1c16dfef4c837533b6fc6 data/create/recipes/small_limestone_brick_slab_recycling.json @@ -4563,7 +4562,7 @@ ec9154a3791113f57dc1c16dfef4c837533b6fc6 data/create/recipes/small_limestone_bri 6943fdc8162e4d53c459f425b2ff5b34e9caa477 data/create/recipes/small_limestone_brick_stairs_from_stone_types_limestone_stonecutting.json 27ff69345efea14b9688fe9b182809995ea8ad4a data/create/recipes/small_limestone_brick_wall.json 98a83f757f0ac9cc2a876ae407bb5765071e700d data/create/recipes/small_limestone_brick_wall_from_stone_types_limestone_stonecutting.json -22c69e391110280e13d50693b9c81355da57a315 data/create/recipes/small_ochrum_bricks_from_stone_types_ochrum_stonecutting.json +714f6a84a5b3d5d57c07364925555e6f545b0b3d data/create/recipes/small_limestone_bricks_from_stone_types_limestone_stonecutting.json abdd280694cb30ce0d2703aadeeb378af9a7f8b2 data/create/recipes/small_ochrum_brick_slab.json e37612fa2523fa3711242cac4ec5e596b3e55698 data/create/recipes/small_ochrum_brick_slab_from_stone_types_ochrum_stonecutting.json 8f3f47cb3e759104cf86a422339345f8795143d3 data/create/recipes/small_ochrum_brick_slab_recycling.json @@ -4571,8 +4570,8 @@ de8d7f8e57645c0b5a6e98eb0cc4e573c5cf96ac data/create/recipes/small_ochrum_brick_ 04ebbdd14f81f4b4dc7986cb5241caa9f48f4ff1 data/create/recipes/small_ochrum_brick_stairs_from_stone_types_ochrum_stonecutting.json 07876725f97ff611f8d1710462224f07cab3ebbd data/create/recipes/small_ochrum_brick_wall.json 2331801569ec95562afc802f7e2ff191d329a5c6 data/create/recipes/small_ochrum_brick_wall_from_stone_types_ochrum_stonecutting.json +22c69e391110280e13d50693b9c81355da57a315 data/create/recipes/small_ochrum_bricks_from_stone_types_ochrum_stonecutting.json 68a9f80b97d9322ed33067d7717180494b904bed data/create/recipes/small_rose_quartz_tiles_from_polished_rose_quartz_stonecutting.json -bf27af2e54ed1b09611d67ee7afa6c7f56d00d09 data/create/recipes/small_scorchia_bricks_from_stone_types_scorchia_stonecutting.json 133057778480e1d2e13fe7b2766ba0891feea3a5 data/create/recipes/small_scorchia_brick_slab.json dad342d215c98f3214752e0ebfaf3015943c5ac7 data/create/recipes/small_scorchia_brick_slab_from_stone_types_scorchia_stonecutting.json 0a57ad5fce22d69cdc1dd880403612ffb47af4ba data/create/recipes/small_scorchia_brick_slab_recycling.json @@ -4580,7 +4579,7 @@ dad342d215c98f3214752e0ebfaf3015943c5ac7 data/create/recipes/small_scorchia_bric 7f89c9c6dcea06a3022c72029a5e547aa1721773 data/create/recipes/small_scorchia_brick_stairs_from_stone_types_scorchia_stonecutting.json 43310b3fa43bd791ef0e2e30971a24e788c20139 data/create/recipes/small_scorchia_brick_wall.json de8edc4fa5eec031ad0a63c7f59141985ae9af9e data/create/recipes/small_scorchia_brick_wall_from_stone_types_scorchia_stonecutting.json -b1a67d052e26c2129c34ee0732cfe533beb3e571 data/create/recipes/small_scoria_bricks_from_stone_types_scoria_stonecutting.json +bf27af2e54ed1b09611d67ee7afa6c7f56d00d09 data/create/recipes/small_scorchia_bricks_from_stone_types_scorchia_stonecutting.json d8a41adcc6ae9b0eb71a83b2dd89ff92a10e0057 data/create/recipes/small_scoria_brick_slab.json 34f4dd094f2949e3fd21f95ac890ae803b81fbea data/create/recipes/small_scoria_brick_slab_from_stone_types_scoria_stonecutting.json f15ad1cb05f5b02b630b982d23bd951178a3650c data/create/recipes/small_scoria_brick_slab_recycling.json @@ -4588,7 +4587,7 @@ df5a1437fb112519d904cc9f1cd28d5d891fb04d data/create/recipes/small_scoria_brick_ d36428daf8bf4e560f649e5eb40a8cd7a27e7a0e data/create/recipes/small_scoria_brick_stairs_from_stone_types_scoria_stonecutting.json cad432398d8886d60b94e96b2c2096ae27fffb50 data/create/recipes/small_scoria_brick_wall.json 9cff8370aaa81ece466fe15642c00a9992bd416c data/create/recipes/small_scoria_brick_wall_from_stone_types_scoria_stonecutting.json -e51ced16059f7c37fe3652a1cf4d938f91e956fc data/create/recipes/small_tuff_bricks_from_stone_types_tuff_stonecutting.json +b1a67d052e26c2129c34ee0732cfe533beb3e571 data/create/recipes/small_scoria_bricks_from_stone_types_scoria_stonecutting.json dd83af4a10a9b0ba6a4efb272d8b6b1611524a39 data/create/recipes/small_tuff_brick_slab.json e3a12b87830e47387e9ac118bb3d12b73558d757 data/create/recipes/small_tuff_brick_slab_from_stone_types_tuff_stonecutting.json 85dff00dc49eaf65f1f149a7f21a9f307b1b9710 data/create/recipes/small_tuff_brick_slab_recycling.json @@ -4596,7 +4595,7 @@ e03a8270b01b9a5cad238db4ce2b8f66ea78e8bf data/create/recipes/small_tuff_brick_st cd50bb5842c90038f6ac74e45971ab2e914d1463 data/create/recipes/small_tuff_brick_stairs_from_stone_types_tuff_stonecutting.json e795fbe5062ec47cc660ee26c8398477509c5f18 data/create/recipes/small_tuff_brick_wall.json 34471a7ebb431b6d1e3be5fa480b800b96556fee data/create/recipes/small_tuff_brick_wall_from_stone_types_tuff_stonecutting.json -82f17edc61a319c74dbdfa730584305899bd7572 data/create/recipes/small_veridium_bricks_from_stone_types_veridium_stonecutting.json +e51ced16059f7c37fe3652a1cf4d938f91e956fc data/create/recipes/small_tuff_bricks_from_stone_types_tuff_stonecutting.json f9a2f4ca078364e05b3446fe890ea207e5a56e87 data/create/recipes/small_veridium_brick_slab.json 234c3baee4c9428caab3e344f396ec87064103e3 data/create/recipes/small_veridium_brick_slab_from_stone_types_veridium_stonecutting.json b0db8335e3c7fd88f074c3895bea952efc0e8df8 data/create/recipes/small_veridium_brick_slab_recycling.json @@ -4604,6 +4603,7 @@ a1e214c230574526ca0a2fec059b4157ddec557d data/create/recipes/small_veridium_bric f63031587a64ed88ddba1df07767dd8d8caa1d2e data/create/recipes/small_veridium_brick_stairs_from_stone_types_veridium_stonecutting.json 9b003fbf2bcd975501ba307ea68c6c4bab397683 data/create/recipes/small_veridium_brick_wall.json 1ba48c5cae05b6f4b1ad223ce80925f1eaaf5dfd data/create/recipes/small_veridium_brick_wall_from_stone_types_veridium_stonecutting.json +82f17edc61a319c74dbdfa730584305899bd7572 data/create/recipes/small_veridium_bricks_from_stone_types_veridium_stonecutting.json 47973044b19b35ce169e7d46abc9d11a2f67a487 data/create/recipes/spruce_window.json 810544f79bf4b002981e614eaa8e49b48a7b5397 data/create/recipes/spruce_window_pane.json e343a80c92dab60f99c9b441d00189aceee477a0 data/create/recipes/tiled_glass_from_glass_colorless_stonecutting.json @@ -4633,6 +4633,7 @@ f365be4eda73234b73aa49c97b065f1a8baafbf6 data/create/tags/blocks/brittle.json c7ec0dbc18e9c1b58e568ed925287b89df11a136 data/create/tags/blocks/copycat_allow.json 876eb9210f4a14898a2fe6d225699c66b5bdfeef data/create/tags/blocks/copycat_deny.json 7296238b4c6b81251870addce1de8ecda63381dc data/create/tags/blocks/corals.json +35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/create/tags/blocks/fallback_mounted_storage_blacklist.json f675c20350ed60da4878b5d6301f02c8c05624bd data/create/tags/blocks/fan_processing_catalysts/blasting.json 0592b99f657415f6546564ed8efa1fcbef07ba15 data/create/tags/blocks/fan_processing_catalysts/haunting.json 9386dd9a1d234813f9b8ae4ec88866d396aa1d37 data/create/tags/blocks/fan_processing_catalysts/smoking.json @@ -4647,6 +4648,7 @@ f400870b8dbcd14238be3ec99c419093073ba3a6 data/create/tags/blocks/postboxes.json 9bc8c13fd80bdbe7f767b91ee1a1042e9aff02b0 data/create/tags/blocks/roots.json 55dccb895bbdacfbd6ee9005486cd3fe9df01249 data/create/tags/blocks/safe_nbt.json 79418bd729cef417b322cef9b491e7ae83317d61 data/create/tags/blocks/seats.json +d6b27fadce1fb86be1be99ac12fbd9a734358fc0 data/create/tags/blocks/simple_mounted_storage.json 8a6ad3c63fb0c436ec8109f39358213930effd5a data/create/tags/blocks/table_cloths.json 5def5088f7fd31b80e6f28c1c4ea146aa9d7d15b data/create/tags/blocks/toolboxes.json 2589b135c0e96ad29076569e144528fe32ea5b39 data/create/tags/blocks/tracks.json diff --git a/src/generated/resources/data/create/tags/blocks/fallback_mounted_storage_blacklist.json b/src/generated/resources/data/create/tags/blocks/fallback_mounted_storage_blacklist.json new file mode 100644 index 0000000000..f72d209df7 --- /dev/null +++ b/src/generated/resources/data/create/tags/blocks/fallback_mounted_storage_blacklist.json @@ -0,0 +1,3 @@ +{ + "values": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/tags/blocks/simple_mounted_storage.json b/src/generated/resources/data/create/tags/blocks/simple_mounted_storage.json new file mode 100644 index 0000000000..6d8ef7bc46 --- /dev/null +++ b/src/generated/resources/data/create/tags/blocks/simple_mounted_storage.json @@ -0,0 +1,24 @@ +{ + "values": [ + "minecraft:chest", + "minecraft:trapped_chest", + "minecraft:barrel", + "minecraft:shulker_box", + "minecraft:white_shulker_box", + "minecraft:orange_shulker_box", + "minecraft:magenta_shulker_box", + "minecraft:light_blue_shulker_box", + "minecraft:yellow_shulker_box", + "minecraft:lime_shulker_box", + "minecraft:pink_shulker_box", + "minecraft:gray_shulker_box", + "minecraft:light_gray_shulker_box", + "minecraft:cyan_shulker_box", + "minecraft:purple_shulker_box", + "minecraft:blue_shulker_box", + "minecraft:brown_shulker_box", + "minecraft:green_shulker_box", + "minecraft:red_shulker_box", + "minecraft:black_shulker_box" + ] +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 5d8690d1ae..fa4f135730 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -6,6 +6,7 @@ import static com.simibubi.create.Create.REGISTRATE; import static com.simibubi.create.content.redstone.displayLink.AllDisplayBehaviours.assignDataBehaviour; import static com.simibubi.create.foundation.data.BlockStateGen.axisBlock; import static com.simibubi.create.foundation.data.BlockStateGen.simpleCubeAll; +import static com.simibubi.create.foundation.data.BuilderTransformers.mountedItemStorage; import static com.simibubi.create.foundation.data.CreateRegistrate.connectedTextures; import static com.simibubi.create.foundation.data.ModelGen.customItemModel; import static com.simibubi.create.foundation.data.TagGen.axeOnly; @@ -15,6 +16,7 @@ import static com.simibubi.create.foundation.data.TagGen.tagBlockAndItem; import com.simibubi.create.AllTags.AllBlockTags; import com.simibubi.create.AllTags.AllItemTags; +import com.simibubi.create.api.contraption.storage.MountedStorageTypeRegistry; import com.simibubi.create.content.contraptions.actors.contraptionControls.ContraptionControlsBlock; import com.simibubi.create.content.contraptions.actors.contraptionControls.ContraptionControlsMovement; import com.simibubi.create.content.contraptions.actors.contraptionControls.ContraptionControlsMovingInteraction; @@ -1813,6 +1815,7 @@ public class AllBlocks { REGISTRATE.block("creative_crate", CreativeCrateBlock::new) .transform(BuilderTransformers.crate("creative")) .properties(p -> p.mapColor(MapColor.COLOR_PURPLE)) + .transform(mountedItemStorage(AllMountedStorageTypes.CREATIVE_CRATE)) .register(); public static final BlockEntry ITEM_VAULT = REGISTRATE.block("item_vault", ItemVaultBlock::new) @@ -2540,7 +2543,7 @@ public class AllBlocks { .transform(BuilderTransformers.palettesIronBlock()) .lang("Block of Industrial Iron") .register(); - + public static final BlockEntry WEATHERED_IRON_BLOCK = REGISTRATE.block("weathered_iron_block", Block::new) .transform(BuilderTransformers.palettesIronBlock()) .lang("Block of Weathered Iron") diff --git a/src/main/java/com/simibubi/create/AllMountedStorageTypes.java b/src/main/java/com/simibubi/create/AllMountedStorageTypes.java new file mode 100644 index 0000000000..dbe0d365a7 --- /dev/null +++ b/src/main/java/com/simibubi/create/AllMountedStorageTypes.java @@ -0,0 +1,33 @@ +package com.simibubi.create; + +import com.simibubi.create.api.contraption.storage.MountedStorageTypeRegistry; +import com.simibubi.create.api.contraption.storage.item.MountedItemStorageType; +import com.simibubi.create.api.contraption.storage.item.chest.ChestMountedStorageType; +import com.simibubi.create.content.contraptions.behaviour.dispenser.storage.DispenserMountedStorageType; +import com.simibubi.create.content.equipment.toolbox.ToolboxMountedStorageType; +import com.simibubi.create.content.logistics.crate.CreativeCrateMountedStorageType; + +import com.simibubi.create.api.contraption.storage.item.simple.SimpleMountedStorageType; + +import com.simibubi.create.content.logistics.vault.ItemVaultMountedStorageType; +import com.simibubi.create.impl.contraption.storage.FallbackMountedStorageType; + +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.RegistryObject; + +public class AllMountedStorageTypes { + private static final DeferredRegister> REGISTER = DeferredRegister.create(MountedStorageTypeRegistry.ITEMS, Create.ID); + + public static final RegistryObject SIMPLE = REGISTER.register("simple", SimpleMountedStorageType::new); + public static final RegistryObject FALLBACK = REGISTER.register("fallback", FallbackMountedStorageType::new); + public static final RegistryObject CHEST = REGISTER.register("chest", ChestMountedStorageType::new); + public static final RegistryObject DISPENSER = REGISTER.register("dispenser", DispenserMountedStorageType::new); + public static final RegistryObject CREATIVE_CRATE = REGISTER.register("creative_crate", CreativeCrateMountedStorageType::new); + public static final RegistryObject VAULT = REGISTER.register("vault", ItemVaultMountedStorageType::new); + public static final RegistryObject TOOLBOX = REGISTER.register("toolbox", ToolboxMountedStorageType::new); + + public static void register(IEventBus modEventBus) { + REGISTER.register(modEventBus); + } +} diff --git a/src/main/java/com/simibubi/create/AllTags.java b/src/main/java/com/simibubi/create/AllTags.java index c99802271f..c17aeb4a91 100644 --- a/src/main/java/com/simibubi/create/AllTags.java +++ b/src/main/java/com/simibubi/create/AllTags.java @@ -104,6 +104,8 @@ public class AllTags { VALVE_HANDLES, WINDMILL_SAILS, WRENCH_PICKUP, + SIMPLE_MOUNTED_STORAGE, + FALLBACK_MOUNTED_STORAGE_BLACKLIST, ROOTS, CORALS, diff --git a/src/main/java/com/simibubi/create/Create.java b/src/main/java/com/simibubi/create/Create.java index 2324f7ebdc..8494186fc4 100644 --- a/src/main/java/com/simibubi/create/Create.java +++ b/src/main/java/com/simibubi/create/Create.java @@ -2,6 +2,8 @@ package com.simibubi.create; import java.util.Random; +import com.simibubi.create.impl.contraption.storage.MountedStorageTypeRegistryImpl; + import org.slf4j.Logger; import com.google.gson.Gson; @@ -127,6 +129,7 @@ public class Create { AllPackets.registerPackets(); AllFeatures.register(modEventBus); AllPlacementModifiers.register(modEventBus); + AllMountedStorageTypes.register(modEventBus); AllConfigs.register(modLoadingContext); diff --git a/src/main/java/com/simibubi/create/api/contraption/storage/MountedStorageTypeRegistry.java b/src/main/java/com/simibubi/create/api/contraption/storage/MountedStorageTypeRegistry.java new file mode 100644 index 0000000000..202b0029e4 --- /dev/null +++ b/src/main/java/com/simibubi/create/api/contraption/storage/MountedStorageTypeRegistry.java @@ -0,0 +1,26 @@ +package com.simibubi.create.api.contraption.storage; + +import com.simibubi.create.Create; +import com.simibubi.create.api.contraption.storage.item.MountedItemStorageType; +import com.simibubi.create.foundation.utility.AttachedRegistry; + +import com.simibubi.create.impl.contraption.storage.MountedStorageTypeRegistryImpl; + +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.IForgeRegistry; + +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.block.Block; + +public class MountedStorageTypeRegistry { + public static final ResourceKey>> ITEMS = ResourceKey.createRegistryKey( + Create.asResource("mounted_item_storage_type") + ); + + public static final AttachedRegistry> ITEMS_BY_BLOCK = new AttachedRegistry<>(ForgeRegistries.BLOCKS); + + public static IForgeRegistry> getItemsRegistry() { + return MountedStorageTypeRegistryImpl.getItemsRegistry(); + } +} diff --git a/src/main/java/com/simibubi/create/api/contraption/storage/item/MountedItemStorage.java b/src/main/java/com/simibubi/create/api/contraption/storage/item/MountedItemStorage.java new file mode 100644 index 0000000000..3bc31d0bf3 --- /dev/null +++ b/src/main/java/com/simibubi/create/api/contraption/storage/item/MountedItemStorage.java @@ -0,0 +1,119 @@ +package com.simibubi.create.api.contraption.storage.item; + +import java.util.Objects; +import java.util.function.Predicate; + +import com.mojang.serialization.Codec; + +import com.simibubi.create.content.contraptions.Contraption; + +import com.simibubi.create.content.contraptions.MountedStorageInteraction; + +import com.simibubi.create.foundation.utility.CreateLang; + +import net.minecraftforge.items.IItemHandlerModifiable; + +import org.jetbrains.annotations.Nullable; + +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.MenuProvider; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate.StructureBlockInfo; +import net.minecraft.world.phys.Vec3; + +public abstract class MountedItemStorage implements IItemHandlerModifiable { + public static final Codec CODEC = MountedItemStorageType.CODEC.dispatch( + storage -> storage.type, type -> type.codec + ); + + public final MountedItemStorageType type; + + protected MountedItemStorage(MountedItemStorageType type) { + this.type = Objects.requireNonNull(type); + } + + /** + * Un-mount this storage back into the world. The expected storage type of the target + * block has already been checked to make sure it matches this storage's type. + */ + public abstract void unmount(Level level, BlockState state, BlockPos pos, @Nullable BlockEntity be); + + /** + * @return true if train contraptions can search this storage for fuel. + * This is only called once on assembly. + */ + public boolean providesFuel() { + return true; + } + + /** + * Handle a player clicking on this mounted storage. This is always called on the server. + * The default implementation will try to open a generic GUI for standard inventories. + * For this to work, this storage must have 1-6 complete rows of 9 slots. + * @return true if the interaction was successful + */ + public boolean handleInteraction(Player player, Contraption contraption, StructureBlockInfo info) { + int slots = this.getSlots(); + if (slots == 0 || slots % 9 != 0) + return false; + + int rows = slots / 9; + if (rows > 6) + return false; + + BlockPos localPos = info.pos(); + Vec3 globalPos = contraption.entity.toGlobalVector(Vec3.atCenterOf(localPos), 0); + Predicate stillValid = p -> this.isMenuValid(p, contraption, globalPos); + Component menuName = this.getMenuName(info, contraption); + IItemHandlerModifiable handler = this.getHandlerForMenu(info, contraption); + + player.openMenu(MountedStorageInteraction.createMenuProvider(menuName, handler, rows, stillValid)); + this.playOpeningSound(player.level(), globalPos); + return true; + } + + /** + * Play the sound made by opening this storage's GUI. + * @see #handleInteraction(Player, Contraption, StructureBlockInfo) + */ + protected void playOpeningSound(Level level, Vec3 pos) { + level.playSound( + null, BlockPos.containing(pos), + SoundEvents.BARREL_OPEN, SoundSource.BLOCKS, + 0.75f, 1f + ); + } + + /** + * @return the title to be shown in the GUI when this storage is opened + * @see #handleInteraction(Player, Contraption, StructureBlockInfo) + */ + protected Component getMenuName(StructureBlockInfo info, Contraption contraption) { + MutableComponent blockName = info.state().getBlock().getName(); + return CreateLang.translateDirect("contraptions.moving_container", blockName); + } + + /** + * @param player the player who opened the menu + * @param pos the center of this storage in-world + * @return true if a GUI opened for this storage is still valid + */ + protected boolean isMenuValid(Player player, Contraption contraption, Vec3 pos) { + return contraption.entity.isAlive() && player.distanceToSqr(pos) < (8 * 8); + } + + /** + * Get the item handler that will be used by this storage's menu. This is useful for + * handling multi-blocks, such as double chests. + */ + protected IItemHandlerModifiable getHandlerForMenu(StructureBlockInfo info, Contraption contraption) { + return this; + } +} diff --git a/src/main/java/com/simibubi/create/api/contraption/storage/item/MountedItemStorageType.java b/src/main/java/com/simibubi/create/api/contraption/storage/item/MountedItemStorageType.java new file mode 100644 index 0000000000..e820923eda --- /dev/null +++ b/src/main/java/com/simibubi/create/api/contraption/storage/item/MountedItemStorageType.java @@ -0,0 +1,28 @@ +package com.simibubi.create.api.contraption.storage.item; + +import com.mojang.serialization.Codec; + +import com.simibubi.create.api.contraption.storage.MountedStorageTypeRegistry; + +import org.jetbrains.annotations.Nullable; + +import net.minecraft.core.BlockPos; +import net.minecraft.util.ExtraCodecs; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; + +public abstract class MountedItemStorageType { + public static final Codec> CODEC = ExtraCodecs.lazyInitializedCodec( + () -> MountedStorageTypeRegistry.getItemsRegistry().getCodec() + ); + + public final Codec codec; + + protected MountedItemStorageType(Codec codec) { + this.codec = codec; + } + + @Nullable + public abstract T mount(Level level, BlockState state, BlockPos pos, @Nullable BlockEntity be); +} diff --git a/src/main/java/com/simibubi/create/api/contraption/storage/item/MountedItemStorageWrapper.java b/src/main/java/com/simibubi/create/api/contraption/storage/item/MountedItemStorageWrapper.java new file mode 100644 index 0000000000..99c1b2c7fd --- /dev/null +++ b/src/main/java/com/simibubi/create/api/contraption/storage/item/MountedItemStorageWrapper.java @@ -0,0 +1,17 @@ +package com.simibubi.create.api.contraption.storage.item; + +import com.google.common.collect.ImmutableMap; + +import net.minecraftforge.items.IItemHandlerModifiable; +import net.minecraftforge.items.wrapper.CombinedInvWrapper; + +import net.minecraft.core.BlockPos; + +public class MountedItemStorageWrapper extends CombinedInvWrapper { + public final ImmutableMap storages; + + public MountedItemStorageWrapper(ImmutableMap storages) { + super(storages.values().toArray(IItemHandlerModifiable[]::new)); + this.storages = storages; + } +} diff --git a/src/main/java/com/simibubi/create/api/contraption/storage/item/WrapperMountedItemStorage.java b/src/main/java/com/simibubi/create/api/contraption/storage/item/WrapperMountedItemStorage.java new file mode 100644 index 0000000000..6046e20306 --- /dev/null +++ b/src/main/java/com/simibubi/create/api/contraption/storage/item/WrapperMountedItemStorage.java @@ -0,0 +1,64 @@ +package com.simibubi.create.api.contraption.storage.item; + +import net.minecraftforge.items.IItemHandlerModifiable; + +import net.minecraftforge.items.ItemStackHandler; + +import org.jetbrains.annotations.NotNull; + +import net.minecraft.world.item.ItemStack; + +public abstract class WrapperMountedItemStorage extends MountedItemStorage { + protected final T wrapped; + + protected WrapperMountedItemStorage(MountedItemStorageType type, T wrapped) { + super(type); + this.wrapped = wrapped; + } + + @Override + public void setStackInSlot(int slot, @NotNull ItemStack stack) { + this.wrapped.setStackInSlot(slot, stack); + } + + @Override + public int getSlots() { + return this.wrapped.getSlots(); + } + + @Override + @NotNull + public ItemStack getStackInSlot(int slot) { + return this.wrapped.getStackInSlot(slot); + } + + @Override + @NotNull + public ItemStack insertItem(int slot, @NotNull ItemStack stack, boolean simulate) { + return this.wrapped.insertItem(slot, stack, simulate); + } + + @Override + @NotNull + public ItemStack extractItem(int slot, int amount, boolean simulate) { + return this.wrapped.extractItem(slot, amount, simulate); + } + + @Override + public int getSlotLimit(int slot) { + return this.wrapped.getSlotLimit(slot); + } + + @Override + public boolean isItemValid(int slot, @NotNull ItemStack stack) { + return this.wrapped.isItemValid(slot, stack); + } + + public static ItemStackHandler copyToItemStackHandler(IItemHandlerModifiable handler) { + ItemStackHandler copy = new ItemStackHandler(handler.getSlots()); + for (int i = 0; i < handler.getSlots(); i++) { + copy.setStackInSlot(i, handler.getStackInSlot(i).copy()); + } + return copy; + } +} diff --git a/src/main/java/com/simibubi/create/api/contraption/storage/item/chest/ChestMountedStorage.java b/src/main/java/com/simibubi/create/api/contraption/storage/item/chest/ChestMountedStorage.java new file mode 100644 index 0000000000..1353c7edec --- /dev/null +++ b/src/main/java/com/simibubi/create/api/contraption/storage/item/chest/ChestMountedStorage.java @@ -0,0 +1,54 @@ +package com.simibubi.create.api.contraption.storage.item.chest; + +import com.mojang.serialization.Codec; +import com.simibubi.create.AllMountedStorageTypes; +import com.simibubi.create.api.contraption.storage.item.MountedItemStorage; +import com.simibubi.create.api.contraption.storage.item.simple.SimpleMountedStorage; +import com.simibubi.create.api.contraption.storage.item.simple.SimpleMountedStorageType; + +import com.simibubi.create.content.contraptions.Contraption; + +import net.minecraftforge.items.IItemHandlerModifiable; +import net.minecraftforge.items.wrapper.CombinedInvWrapper; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.block.ChestBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.ChestType; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate.StructureBlockInfo; + +/** + * Mounted storage that handles opening a combined GUI for double chests. + */ +public class ChestMountedStorage extends SimpleMountedStorage { + public static final Codec CODEC = SimpleMountedStorage.codec(ChestMountedStorage::new); + + protected ChestMountedStorage(SimpleMountedStorageType type, IItemHandlerModifiable handler) { + super(type, handler); + } + + public ChestMountedStorage(IItemHandlerModifiable handler) { + this(AllMountedStorageTypes.CHEST.get(), handler); + } + + @Override + protected IItemHandlerModifiable getHandlerForMenu(StructureBlockInfo info, Contraption contraption) { + BlockState state = info.state(); + ChestType type = state.getValue(ChestBlock.TYPE); + if (type == ChestType.SINGLE) + return this; + + Direction facing = state.getValue(ChestBlock.FACING); + Direction connectedDirection = type == ChestType.LEFT ? facing.getClockWise() : facing.getCounterClockWise(); + BlockPos localOtherHalf = info.pos().relative(connectedDirection); + MountedItemStorage otherHalf = contraption.getStorage().getMountedItems().storages.get(localOtherHalf); + if (otherHalf == null) + return this; + + if (type == ChestType.RIGHT) { + return new CombinedInvWrapper(this, otherHalf); + } else { + return new CombinedInvWrapper(otherHalf, this); + } + } +} diff --git a/src/main/java/com/simibubi/create/api/contraption/storage/item/chest/ChestMountedStorageType.java b/src/main/java/com/simibubi/create/api/contraption/storage/item/chest/ChestMountedStorageType.java new file mode 100644 index 0000000000..459016e26f --- /dev/null +++ b/src/main/java/com/simibubi/create/api/contraption/storage/item/chest/ChestMountedStorageType.java @@ -0,0 +1,17 @@ +package com.simibubi.create.api.contraption.storage.item.chest; + +import com.simibubi.create.api.contraption.storage.item.simple.SimpleMountedStorage; +import com.simibubi.create.api.contraption.storage.item.simple.SimpleMountedStorageType; + +import net.minecraftforge.items.IItemHandlerModifiable; + +public class ChestMountedStorageType extends SimpleMountedStorageType { + public ChestMountedStorageType() { + super(ChestMountedStorage.CODEC); + } + + @Override + protected SimpleMountedStorage createStorage(IItemHandlerModifiable handler) { + return new ChestMountedStorage(handler); + } +} diff --git a/src/main/java/com/simibubi/create/api/contraption/storage/item/simple/SimpleMountedStorage.java b/src/main/java/com/simibubi/create/api/contraption/storage/item/simple/SimpleMountedStorage.java new file mode 100644 index 0000000000..335ab94a95 --- /dev/null +++ b/src/main/java/com/simibubi/create/api/contraption/storage/item/simple/SimpleMountedStorage.java @@ -0,0 +1,73 @@ +package com.simibubi.create.api.contraption.storage.item.simple; + +import java.util.Optional; +import java.util.function.Function; + +import com.mojang.serialization.Codec; +import com.simibubi.create.AllMountedStorageTypes; + +import com.simibubi.create.AllTags; +import com.simibubi.create.api.contraption.storage.MountedStorageTypeRegistry; +import com.simibubi.create.api.contraption.storage.item.WrapperMountedItemStorage; + +import com.simibubi.create.foundation.utility.CreateCodecs; + +import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.IItemHandlerModifiable; +import net.minecraftforge.items.ItemStackHandler; + +import org.jetbrains.annotations.Nullable; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; + +/** + * Widely-applicable mounted storage implementation. + * Gets an item handler from the mounted block, copies it to an ItemStackHandler, + * and then copies the inventory back to the target when unmounting. + * All blocks for which this mounted storage is registered must provide an + * {@link IItemHandlerModifiable} to {@link ForgeCapabilities#ITEM_HANDLER}. + *
+ * To use this implementation, either register {@link AllMountedStorageTypes#SIMPLE} to your block + * manually, or add your block to the {@link AllTags.AllBlockTags#SIMPLE_MOUNTED_STORAGE} tag. + */ +public class SimpleMountedStorage extends WrapperMountedItemStorage { + public static final Codec CODEC = codec(SimpleMountedStorage::new); + + public SimpleMountedStorage(SimpleMountedStorageType type, IItemHandlerModifiable handler) { + super(type, copyToItemStackHandler(handler)); + } + + public SimpleMountedStorage(IItemHandlerModifiable handler) { + this(AllMountedStorageTypes.SIMPLE.get(), handler); + } + + @Override + public void unmount(Level level, BlockState state, BlockPos pos, @Nullable BlockEntity be) { + if (be == null) + return; + + be.getCapability(ForgeCapabilities.ITEM_HANDLER) + .resolve() + .filter(handler -> handler.getSlots() == this.getSlots()) + .flatMap(this::validate) + .ifPresent(handler -> { + for (int i = 0; i < handler.getSlots(); i++) { + handler.setStackInSlot(i, this.getStackInSlot(i)); + } + }); + } + + private Optional validate(IItemHandler handler) { + return ((SimpleMountedStorageType) this.type).validate(handler); + } + + public static Codec codec(Function factory) { + return CreateCodecs.ITEM_STACK_HANDLER.xmap( + factory, storage -> storage.wrapped + ); + } +} diff --git a/src/main/java/com/simibubi/create/api/contraption/storage/item/simple/SimpleMountedStorageType.java b/src/main/java/com/simibubi/create/api/contraption/storage/item/simple/SimpleMountedStorageType.java new file mode 100644 index 0000000000..1beec1b7d7 --- /dev/null +++ b/src/main/java/com/simibubi/create/api/contraption/storage/item/simple/SimpleMountedStorageType.java @@ -0,0 +1,50 @@ +package com.simibubi.create.api.contraption.storage.item.simple; + +import java.util.Optional; + +import com.mojang.serialization.Codec; +import com.simibubi.create.api.contraption.storage.item.MountedItemStorageType; + +import net.minecraftforge.common.capabilities.ForgeCapabilities; + +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.IItemHandlerModifiable; + +import org.jetbrains.annotations.Nullable; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; + +public class SimpleMountedStorageType extends MountedItemStorageType { + protected SimpleMountedStorageType(Codec codec) { + super(codec); + } + + public SimpleMountedStorageType() { + this(SimpleMountedStorage.CODEC); + } + + @Override + @Nullable + public SimpleMountedStorage mount(Level level, BlockState state, BlockPos pos, @Nullable BlockEntity be) { + return Optional.ofNullable(be) + .map(b -> b.getCapability(ForgeCapabilities.ITEM_HANDLER)) + .flatMap(LazyOptional::resolve) + .flatMap(this::validate) + .map(this::createStorage) + .orElse(null); + } + + public Optional validate(IItemHandler handler) { + return handler instanceof IItemHandlerModifiable modifiable + ? Optional.of(modifiable) + : Optional.empty(); + } + + protected SimpleMountedStorage createStorage(IItemHandlerModifiable handler) { + return new SimpleMountedStorage(this, handler); + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/Contraption.java b/src/main/java/com/simibubi/create/content/contraptions/Contraption.java index 693ccdd9e1..8c612fd86c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/Contraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/Contraption.java @@ -126,7 +126,6 @@ import net.minecraftforge.client.model.data.ModelData; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.items.IItemHandlerModifiable; -import net.minecraftforge.items.wrapper.CombinedInvWrapper; import net.minecraftforge.registries.GameData; public abstract class Contraption { @@ -266,7 +265,7 @@ public abstract class Contraption { stabilizedSubContraptions.put(movedContraption.getUUID(), new BlockFace(toLocalPos(pos), face)); } - storage.createHandlers(); + storage.initialize(); gatherBBsOffThread(); } @@ -340,7 +339,7 @@ public abstract class Contraption { && !BlockMovementChecks.isNotSupportive(world.getBlockState(attached), offset.getOpposite())) frontier.add(attached); } - + if (world.getBlockEntity(pos) instanceof ChainConveyorBlockEntity ccbe) ccbe.notifyConnectedToValidate(); @@ -426,7 +425,7 @@ public abstract class Contraption { frontier.add(offsetPos); } - addBlock(pos, capture(world, pos)); + addBlock(world, pos, capture(world, pos)); if (blocks.size() <= AllConfigs.server().kinetics.maxBlocksMoved.get()) return true; else @@ -565,7 +564,7 @@ public abstract class Contraption { frontier.add(ropePos); break; } - addBlock(ropePos, capture(world, ropePos)); + addBlock(world, ropePos, capture(world, ropePos)); } } @@ -637,24 +636,25 @@ public abstract class Contraption { return Pair.of(new StructureBlockInfo(pos, blockstate, compoundnbt), blockEntity); } - protected void addBlock(BlockPos pos, Pair pair) { + protected void addBlock(Level level, BlockPos pos, Pair pair) { StructureBlockInfo captured = pair.getKey(); BlockPos localPos = pos.subtract(anchor); - StructureBlockInfo structureBlockInfo = new StructureBlockInfo(localPos, captured.state(), captured.nbt()); + BlockState state = captured.state(); + StructureBlockInfo structureBlockInfo = new StructureBlockInfo(localPos, state, captured.nbt()); if (blocks.put(localPos, structureBlockInfo) != null) return; bounds = bounds.minmax(new AABB(localPos)); BlockEntity be = pair.getValue(); - storage.addBlock(localPos, be); + storage.addBlock(level, state, pos, localPos, be); captureMultiblock(localPos, structureBlockInfo, be); - if (AllMovementBehaviours.getBehaviour(captured.state()) != null) + if (AllMovementBehaviours.getBehaviour(state) != null) actors.add(MutablePair.of(structureBlockInfo, null)); - MovingInteractionBehaviour interactionBehaviour = AllInteractionBehaviours.getBehaviour(captured.state()); + MovingInteractionBehaviour interactionBehaviour = AllInteractionBehaviours.getBehaviour(state); if (interactionBehaviour != null) interactors.put(localPos, interactionBehaviour); @@ -734,6 +734,8 @@ public abstract class Contraption { }); }); + storage.read(nbt); + actors.clear(); nbt.getList("Actors", Tag.TAG_COMPOUND) .forEach(c -> { @@ -775,8 +777,6 @@ public abstract class Contraption { interactors.put(pos, behaviour); }); - storage.read(nbt, presentBlockEntities, spawnData); - if (nbt.contains("BoundsFront")) bounds = NBTHelper.readAABB(nbt.getList("BoundsFront", Tag.TAG_FLOAT)); @@ -973,8 +973,6 @@ public abstract class Contraption { } public void removeBlocksFromWorld(Level world, BlockPos offset) { - storage.removeStorageFromWorld(); - glueToRemove.forEach(glue -> { superglue.add(glue.getBoundingBox() .move(Vec3.atLowerCornerOf(offset.offset(anchor)) @@ -1156,9 +1154,10 @@ public abstract class Contraption { } blockEntity.load(tag); - storage.addStorageToWorld(block, blockEntity); } + storage.unmount(world, block, targetPos, blockEntity); + if (blockEntity != null) { transform.apply(blockEntity); } @@ -1179,8 +1178,6 @@ public abstract class Contraption { if (!world.isClientSide) world.addFreshEntity(new SuperGlueEntity(world, box)); } - - storage.clear(); } protected void translateMultiblockControllers(StructureTransform transform) { @@ -1448,16 +1445,8 @@ public abstract class Contraption { return maxDistSq; } - public IItemHandlerModifiable getSharedInventory() { - return storage.getItems(); - } - - public IItemHandlerModifiable getSharedFuelInventory() { - return storage.getFuelItems(); - } - - public IFluidHandler getSharedFluidTanks() { - return storage.getFluids(); + public MountedStorageManager getStorage() { + return this.storage; } public RenderedBlocks getRenderedBlocks() { @@ -1483,31 +1472,11 @@ public abstract class Contraption { } public void handleContraptionFluidPacket(BlockPos localPos, FluidStack containedFluid) { - storage.updateContainedFluid(localPos, containedFluid); - } - - public static class ContraptionInvWrapper extends CombinedInvWrapper { - protected final boolean isExternal; - - public ContraptionInvWrapper(boolean isExternal, IItemHandlerModifiable... itemHandler) { - super(itemHandler); - this.isExternal = isExternal; - } - - public ContraptionInvWrapper(IItemHandlerModifiable... itemHandler) { - this(false, itemHandler); - } - - public boolean isSlotExternal(int slot) { - if (isExternal) - return true; - IItemHandlerModifiable handler = getHandlerFromIndex(getIndexForSlot(slot)); - return handler instanceof ContraptionInvWrapper && ((ContraptionInvWrapper) handler).isSlotExternal(slot); - } +// storage.updateContainedFluid(localPos, containedFluid); } public void tickStorage(AbstractContraptionEntity entity) { - storage.entityTick(entity); +// storage.entityTick(entity); } public boolean containsBlockBreakers() { diff --git a/src/main/java/com/simibubi/create/content/contraptions/MountedStorage.java b/src/main/java/com/simibubi/create/content/contraptions/MountedStorage.java deleted file mode 100644 index 424e192c15..0000000000 --- a/src/main/java/com/simibubi/create/content/contraptions/MountedStorage.java +++ /dev/null @@ -1,220 +0,0 @@ -package com.simibubi.create.content.contraptions; - -import com.simibubi.create.AllBlockEntityTypes; -import com.simibubi.create.AllTags.AllBlockTags; -import com.simibubi.create.content.equipment.toolbox.ToolboxInventory; -import com.simibubi.create.content.kinetics.crafter.MechanicalCrafterBlockEntity; -import com.simibubi.create.content.logistics.crate.BottomlessItemHandler; -import com.simibubi.create.content.logistics.vault.ItemVaultBlockEntity; -import com.simibubi.create.content.processing.recipe.ProcessingInventory; -import net.createmod.catnip.utility.NBTHelper; -import net.minecraft.core.NonNullList; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.ContainerHelper; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.entity.BarrelBlockEntity; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.entity.ChestBlockEntity; -import net.minecraft.world.level.block.entity.ShulkerBoxBlockEntity; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.common.capabilities.ForgeCapabilities; -import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.items.IItemHandlerModifiable; -import net.minecraftforge.items.ItemStackHandler; -import net.minecraftforge.registries.ForgeRegistries; - -public class MountedStorage { - - private static final ItemStackHandler dummyHandler = new ItemStackHandler(); - - ItemStackHandler handler; - boolean noFuel; - boolean valid; - - private BlockEntity blockEntity; - - public static boolean canUseAsStorage(BlockEntity be) { - if (be == null) - return false; - if (be instanceof MechanicalCrafterBlockEntity) - return false; - if (AllBlockEntityTypes.CREATIVE_CRATE.is(be)) - return true; - if (be instanceof ShulkerBoxBlockEntity) - return true; - if (be instanceof ChestBlockEntity) - return true; - if (be instanceof BarrelBlockEntity) - return true; - if (be instanceof ItemVaultBlockEntity) - return true; - - try { - LazyOptional capability = be.getCapability(ForgeCapabilities.ITEM_HANDLER); - IItemHandler handler = capability.orElse(null); - if (handler instanceof ItemStackHandler) - return !(handler instanceof ProcessingInventory); - return canUseModdedInventory(be, handler); - - } catch (Exception e) { - return false; - } - } - - public static boolean canUseModdedInventory(BlockEntity be, IItemHandler handler) { - if (!(handler instanceof IItemHandlerModifiable validItemHandler)) - return false; - BlockState blockState = be.getBlockState(); - if (AllBlockTags.CONTRAPTION_INVENTORY_DENY.matches(blockState)) - return false; - - // There doesn't appear to be much of a standard for tagging chests/barrels - String blockId = ForgeRegistries.BLOCKS.getKey(blockState.getBlock()) - .getPath(); - if (blockId.contains("ender")) - return false; - return blockId.endsWith("_chest") || blockId.endsWith("_barrel"); - } - - public MountedStorage(BlockEntity be) { - this.blockEntity = be; - handler = dummyHandler; - noFuel = be instanceof ItemVaultBlockEntity; - } - - public void removeStorageFromWorld() { - valid = false; - if (blockEntity == null) - return; - - if (blockEntity instanceof ChestBlockEntity) { - CompoundTag tag = blockEntity.saveWithFullMetadata(); - if (tag.contains("LootTable", 8)) - return; - - handler = new ItemStackHandler(((ChestBlockEntity) blockEntity).getContainerSize()); - NonNullList items = NonNullList.withSize(handler.getSlots(), ItemStack.EMPTY); - ContainerHelper.loadAllItems(tag, items); - for (int i = 0; i < items.size(); i++) - handler.setStackInSlot(i, items.get(i)); - valid = true; - return; - } - - IItemHandler beHandler = blockEntity.getCapability(ForgeCapabilities.ITEM_HANDLER) - .orElse(dummyHandler); - if (beHandler == dummyHandler) - return; - - // multiblock vaults need to provide individual invs - if (blockEntity instanceof ItemVaultBlockEntity) { - handler = ((ItemVaultBlockEntity) blockEntity).getInventoryOfBlock(); - valid = true; - return; - } - - // be uses ItemStackHandler - if (beHandler instanceof ItemStackHandler) { - handler = (ItemStackHandler) beHandler; - valid = true; - return; - } - - // serialization not accessible -> fill into a serializable handler - if (beHandler instanceof IItemHandlerModifiable) { - IItemHandlerModifiable inv = (IItemHandlerModifiable) beHandler; - handler = new ItemStackHandler(beHandler.getSlots()); - for (int slot = 0; slot < handler.getSlots(); slot++) { - handler.setStackInSlot(slot, inv.getStackInSlot(slot)); - inv.setStackInSlot(slot, ItemStack.EMPTY); - } - valid = true; - return; - } - - } - - public void addStorageToWorld(BlockEntity be) { - // FIXME: More dynamic mounted storage in .4 - if (handler instanceof BottomlessItemHandler) - return; - - if (be instanceof ChestBlockEntity) { - CompoundTag tag = be.saveWithFullMetadata(); - tag.remove("Items"); - NonNullList items = NonNullList.withSize(handler.getSlots(), ItemStack.EMPTY); - for (int i = 0; i < items.size(); i++) - items.set(i, handler.getStackInSlot(i)); - ContainerHelper.saveAllItems(tag, items); - be.load(tag); - return; - } - - if (be instanceof ItemVaultBlockEntity) { - ((ItemVaultBlockEntity) be).applyInventoryToBlock(handler); - return; - } - - LazyOptional capability = be.getCapability(ForgeCapabilities.ITEM_HANDLER); - IItemHandler teHandler = capability.orElse(null); - if (!(teHandler instanceof IItemHandlerModifiable)) - return; - - IItemHandlerModifiable inv = (IItemHandlerModifiable) teHandler; - for (int slot = 0; slot < Math.min(inv.getSlots(), handler.getSlots()); slot++) - inv.setStackInSlot(slot, handler.getStackInSlot(slot)); - } - - public IItemHandlerModifiable getItemHandler() { - return handler; - } - - public CompoundTag serialize() { - if (!valid) - return null; - - CompoundTag tag = handler.serializeNBT(); - if (noFuel) - NBTHelper.putMarker(tag, "NoFuel"); - if (handler instanceof ToolboxInventory) - NBTHelper.putMarker(tag, "Toolbox"); - if (!(handler instanceof BottomlessItemHandler)) - return tag; - - NBTHelper.putMarker(tag, "Bottomless"); - tag.put("ProvidedStack", handler.getStackInSlot(0) - .serializeNBT()); - return tag; - } - - public static MountedStorage deserialize(CompoundTag nbt) { - MountedStorage storage = new MountedStorage(null); - storage.handler = new ItemStackHandler(); - if (nbt == null) - return storage; - if (nbt.contains("Toolbox")) - storage.handler = new ToolboxInventory(null); - - storage.valid = true; - storage.noFuel = nbt.contains("NoFuel"); - - if (nbt.contains("Bottomless")) { - ItemStack providedStack = ItemStack.of(nbt.getCompound("ProvidedStack")); - storage.handler = new BottomlessItemHandler(() -> providedStack); - return storage; - } - - storage.handler.deserializeNBT(nbt); - return storage; - } - - public boolean isValid() { - return valid; - } - - public boolean canUseForFuel() { - return !noFuel; - } - -} diff --git a/src/main/java/com/simibubi/create/content/contraptions/MountedStorageInteraction.java b/src/main/java/com/simibubi/create/content/contraptions/MountedStorageInteraction.java index db1c057984..c5568639db 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/MountedStorageInteraction.java +++ b/src/main/java/com/simibubi/create/content/contraptions/MountedStorageInteraction.java @@ -1,13 +1,12 @@ package com.simibubi.create.content.contraptions; import java.util.List; -import java.util.function.Supplier; +import java.util.function.Predicate; import com.google.common.collect.ImmutableList; import com.simibubi.create.foundation.utility.CreateLang; import net.minecraft.network.chat.Component; -import net.minecraft.util.Mth; import net.minecraft.world.MenuProvider; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; @@ -17,52 +16,53 @@ import net.minecraft.world.inventory.MenuType; import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.wrapper.RecipeWrapper; +import org.jetbrains.annotations.Nullable; + public class MountedStorageInteraction { + public static final List> GENERIC_MENUS = ImmutableList.of( + MenuType.GENERIC_9x1, MenuType.GENERIC_9x2, MenuType.GENERIC_9x3, + MenuType.GENERIC_9x4, MenuType.GENERIC_9x5, MenuType.GENERIC_9x6 + ); - public static final List> menus = ImmutableList.of(MenuType.GENERIC_9x1, MenuType.GENERIC_9x2, - MenuType.GENERIC_9x3, MenuType.GENERIC_9x4, MenuType.GENERIC_9x5, MenuType.GENERIC_9x6); + @Nullable + public static MenuProvider createMenuProvider(Component menuName, IItemHandlerModifiable handler, + int rows, Predicate stillValid) { + if (rows < 1 || rows > 6) + return null; - public static MenuProvider createMenuProvider(Component displayName, IItemHandlerModifiable handler, - int slotCount, Supplier stillValid) { - int rows = Mth.clamp(slotCount / 9, 1, 6); - MenuType menuType = menus.get(rows - 1); - Component menuName = CreateLang.translateDirect("contraptions.moving_container", displayName); + MenuType menuType = GENERIC_MENUS.get(rows - 1); return new MenuProvider() { - @Override - public AbstractContainerMenu createMenu(int pContainerId, Inventory pPlayerInventory, Player pPlayer) { - return new ChestMenu(menuType, pContainerId, pPlayerInventory, new StorageInteractionContainer(handler, stillValid), - rows); + public AbstractContainerMenu createMenu(int id, Inventory inventory, Player player) { + StorageInteractionContainer wrapper = new StorageInteractionContainer(handler, stillValid); + return new ChestMenu(menuType, id, inventory, wrapper, rows); } @Override public Component getDisplayName() { return menuName; } - }; } public static class StorageInteractionContainer extends RecipeWrapper { + private final Predicate stillValid; - private Supplier stillValid; - - public StorageInteractionContainer(IItemHandlerModifiable inv, Supplier stillValid) { + public StorageInteractionContainer(IItemHandlerModifiable inv, Predicate stillValid) { super(inv); this.stillValid = stillValid; } @Override public boolean stillValid(Player player) { - return stillValid.get(); + return stillValid.test(player); } @Override public int getMaxStackSize() { return 64; } - } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/MountedStorageManager.java b/src/main/java/com/simibubi/create/content/contraptions/MountedStorageManager.java index 2decc9c531..2f89661f13 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/MountedStorageManager.java +++ b/src/main/java/com/simibubi/create/content/contraptions/MountedStorageManager.java @@ -1,262 +1,235 @@ package com.simibubi.create.content.contraptions; import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; import java.util.List; -import java.util.Map; -import java.util.TreeMap; -import java.util.function.Supplier; -import java.util.stream.Collectors; +import java.util.Objects; + +import com.google.common.collect.ImmutableMap; +import com.mojang.datafixers.util.Pair; +import com.simibubi.create.AllMountedStorageTypes; +import com.simibubi.create.AllTags; +import com.simibubi.create.api.contraption.storage.MountedStorageTypeRegistry; +import com.simibubi.create.api.contraption.storage.item.MountedItemStorage; +import com.simibubi.create.api.contraption.storage.item.MountedItemStorageType; +import com.simibubi.create.api.contraption.storage.item.MountedItemStorageWrapper; -import com.simibubi.create.content.contraptions.Contraption.ContraptionInvWrapper; -import com.simibubi.create.content.fluids.tank.FluidTankBlockEntity; import com.simibubi.create.foundation.fluid.CombinedTankWrapper; import net.createmod.catnip.utility.NBTHelper; -import net.createmod.catnip.utility.lang.Components; import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.NbtOps; import net.minecraft.nbt.NbtUtils; import net.minecraft.nbt.Tag; -import net.minecraft.network.chat.Component; -import net.minecraft.sounds.SoundEvents; -import net.minecraft.sounds.SoundSource; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.ChestBlock; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.state.properties.ChestType; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate.StructureBlockInfo; -import net.minecraft.world.phys.Vec3; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.IFluidTank; +import net.minecraftforge.common.capabilities.ForgeCapabilities; import net.minecraftforge.fluids.capability.IFluidHandler; -import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction; -import net.minecraftforge.fluids.capability.templates.FluidTank; import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.wrapper.CombinedInvWrapper; +import org.jetbrains.annotations.Nullable; + public class MountedStorageManager { - protected ContraptionInvWrapper inventory; - protected ContraptionInvWrapper fuelInventory; - protected CombinedTankWrapper fluidInventory; - protected Map storage; - protected Map fluidStorage; + private ImmutableMap.Builder itemsBuilder; + + protected MountedItemStorageWrapper items; + @Nullable + protected MountedItemStorageWrapper fuelItems; + + private List externalHandlers; + protected CombinedInvWrapper allItems; public MountedStorageManager() { - storage = new TreeMap<>(); - fluidStorage = new TreeMap<>(); + this.reset(); } - public void entityTick(AbstractContraptionEntity entity) { - fluidStorage.forEach((pos, mfs) -> mfs.tick(entity, pos, entity.level().isClientSide)); - } - - public void createHandlers() { - Collection itemHandlers = storage.values(); - - inventory = wrapItems(itemHandlers.stream() - .map(MountedStorage::getItemHandler) - .toList(), false); - - fuelInventory = wrapItems(itemHandlers.stream() - .filter(MountedStorage::canUseForFuel) - .map(MountedStorage::getItemHandler) - .toList(), true); - - fluidInventory = wrapFluids(fluidStorage.values() - .stream() - .map(MountedFluidStorage::getFluidHandler) - .collect(Collectors.toList())); - } - - protected ContraptionInvWrapper wrapItems(Collection list, boolean fuel) { - return new ContraptionInvWrapper(Arrays.copyOf(list.toArray(), list.size(), IItemHandlerModifiable[].class)); - } - - protected CombinedTankWrapper wrapFluids(Collection list) { - return new CombinedTankWrapper(Arrays.copyOf(list.toArray(), list.size(), IFluidHandler[].class)); - } - - public void addBlock(BlockPos localPos, BlockEntity be) { - if (be != null && MountedStorage.canUseAsStorage(be)) - storage.put(localPos, new MountedStorage(be)); - if (be != null && MountedFluidStorage.canUseAsStorage(be)) - fluidStorage.put(localPos, new MountedFluidStorage(be)); - } - - public void read(CompoundTag nbt, Map presentBlockEntities, boolean clientPacket) { - storage.clear(); - NBTHelper.iterateCompoundList(nbt.getList("Storage", Tag.TAG_COMPOUND), c -> storage - .put(NbtUtils.readBlockPos(c.getCompound("Pos")), MountedStorage.deserialize(c.getCompound("Data")))); - - fluidStorage.clear(); - NBTHelper.iterateCompoundList(nbt.getList("FluidStorage", Tag.TAG_COMPOUND), c -> fluidStorage - .put(NbtUtils.readBlockPos(c.getCompound("Pos")), MountedFluidStorage.deserialize(c.getCompound("Data")))); - - if (clientPacket && presentBlockEntities != null) - bindTanks(presentBlockEntities); - - List handlers = new ArrayList<>(); - List fuelHandlers = new ArrayList<>(); - for (MountedStorage mountedStorage : storage.values()) { - IItemHandlerModifiable itemHandler = mountedStorage.getItemHandler(); - handlers.add(itemHandler); - if (mountedStorage.canUseForFuel()) - fuelHandlers.add(itemHandler); + public void initialize() { + if (this.isInitialized()) { + throw new IllegalStateException("Mounted storage has already been initialized"); } - inventory = wrapItems(handlers, false); - fuelInventory = wrapItems(fuelHandlers, true); - fluidInventory = wrapFluids(fluidStorage.values() - .stream() - .map(MountedFluidStorage::getFluidHandler) - .toList()); + this.items = new MountedItemStorageWrapper(this.itemsBuilder.build()); + this.allItems = this.items; + this.itemsBuilder = null; + + ImmutableMap.Builder fuel = ImmutableMap.builder(); + this.items.storages.forEach((pos, storage) -> { + if (storage.providesFuel()) { + fuel.put(pos, storage); + } + }); + ImmutableMap fuelMap = fuel.build(); + this.fuelItems = fuelMap.isEmpty() ? null : new MountedItemStorageWrapper(fuelMap); } - public void bindTanks(Map presentBlockEntities) { - fluidStorage.forEach((pos, mfs) -> { - BlockEntity blockEntity = presentBlockEntities.get(pos); - if (!(blockEntity instanceof FluidTankBlockEntity)) - return; - FluidTankBlockEntity tank = (FluidTankBlockEntity) blockEntity; - IFluidTank tankInventory = tank.getTankInventory(); - if (tankInventory instanceof FluidTank) - ((FluidTank) tankInventory).setFluid(mfs.tank.getFluid()); - tank.getFluidLevel() - .startWithValue(tank.getFillState()); - mfs.assignBlockEntity(tank); + private boolean isInitialized() { + return this.itemsBuilder == null; + } + + protected void reset() { + this.items = null; + this.fuelItems = null; + this.externalHandlers = new ArrayList<>(); + this.allItems = null; + this.itemsBuilder = ImmutableMap.builder(); + } + + public void addBlock(Level level, BlockState state, BlockPos globalPos, BlockPos localPos, @Nullable BlockEntity be) { + MountedItemStorageType type = getMountedStorageType(state); + if (type == null) + return; + + MountedItemStorage storage = type.mount(level, state, globalPos, be); + if (storage != null) { + this.itemsBuilder.put(localPos, storage); + } + } + + public void unmount(Level level, StructureBlockInfo info, BlockPos globalPos, @Nullable BlockEntity be) { + BlockPos localPos = info.pos(); + MountedItemStorage storage = this.items.storages.get(localPos); + if (storage != null) { + Block block = info.state().getBlock(); + MountedItemStorageType expectedType = MountedStorageTypeRegistry.ITEMS_BY_BLOCK.get(block); + if (typeMatches(expectedType, storage, info, be)) { + storage.unmount(level, info.state(), globalPos, be); + } + } + } + + public void read(CompoundTag nbt) { + this.reset(); + + NBTHelper.iterateCompoundList(nbt.getList("items", Tag.TAG_COMPOUND), tag -> { + BlockPos pos = NbtUtils.readBlockPos(tag.getCompound("pos")); + CompoundTag data = tag.getCompound("storage"); + MountedItemStorage.CODEC.decode(NbtOps.INSTANCE, data) + .result() + .map(Pair::getFirst) +// .or(() -> Optional.ofNullable(parseLegacy(data))) + .ifPresent(storage -> this.itemsBuilder.put(pos, storage)); }); + +// NBTHelper.iterateCompoundList(nbt.getList("FluidStorage", Tag.TAG_COMPOUND), c -> fluidStorage +// .put(NbtUtils.readBlockPos(c.getCompound("Pos")), MountedFluidStorage.deserialize(c.getCompound("Data")))); + + this.initialize(); } public void write(CompoundTag nbt, boolean clientPacket) { - ListTag storageNBT = new ListTag(); - if (!clientPacket) - for (BlockPos pos : storage.keySet()) { - CompoundTag c = new CompoundTag(); - MountedStorage mountedStorage = storage.get(pos); - if (!mountedStorage.isValid()) - continue; - c.put("Pos", NbtUtils.writeBlockPos(pos)); - c.put("Data", mountedStorage.serialize()); - storageNBT.add(c); - } + if (clientPacket) + return; - ListTag fluidStorageNBT = new ListTag(); - for (BlockPos pos : fluidStorage.keySet()) { - CompoundTag c = new CompoundTag(); - MountedFluidStorage mountedStorage = fluidStorage.get(pos); - if (!mountedStorage.isValid()) - continue; - c.put("Pos", NbtUtils.writeBlockPos(pos)); - c.put("Data", mountedStorage.serialize()); - fluidStorageNBT.add(c); - } + ListTag items = new ListTag(); + nbt.put("items", items); - nbt.put("Storage", storageNBT); - nbt.put("FluidStorage", fluidStorageNBT); - } - - public void removeStorageFromWorld() { - storage.values() - .forEach(MountedStorage::removeStorageFromWorld); - fluidStorage.values() - .forEach(MountedFluidStorage::removeStorageFromWorld); - } - - public void addStorageToWorld(StructureBlockInfo block, BlockEntity blockEntity) { - if (storage.containsKey(block.pos())) { - MountedStorage mountedStorage = storage.get(block.pos()); - if (mountedStorage.isValid()) - mountedStorage.addStorageToWorld(blockEntity); - } - - if (fluidStorage.containsKey(block.pos())) { - MountedFluidStorage mountedStorage = fluidStorage.get(block.pos()); - if (mountedStorage.isValid()) - mountedStorage.addStorageToWorld(blockEntity); - } - } - - public void clear() { - for (int i = 0; i < inventory.getSlots(); i++) - if (!inventory.isSlotExternal(i)) - inventory.setStackInSlot(i, ItemStack.EMPTY); - for (int i = 0; i < fluidInventory.getTanks(); i++) - fluidInventory.drain(fluidInventory.getFluidInTank(i), FluidAction.EXECUTE); - } - - public void updateContainedFluid(BlockPos localPos, FluidStack containedFluid) { - MountedFluidStorage mountedFluidStorage = fluidStorage.get(localPos); - if (mountedFluidStorage != null) - mountedFluidStorage.updateFluid(containedFluid); + this.items.storages.forEach( + (pos, storage) -> MountedItemStorage.CODEC.encodeStart(NbtOps.INSTANCE, storage) + .result().ifPresent(encoded -> { + CompoundTag tag = new CompoundTag(); + tag.put("pos", NbtUtils.writeBlockPos(pos)); + tag.put("storage", encoded); + items.add(tag); + }) + ); } public void attachExternal(IItemHandlerModifiable externalStorage) { - inventory = new ContraptionInvWrapper(externalStorage, inventory); - fuelInventory = new ContraptionInvWrapper(externalStorage, fuelInventory); + this.externalHandlers.add(externalStorage); + IItemHandlerModifiable[] all = new IItemHandlerModifiable[this.externalHandlers.size() + 1]; + all[0] = this.items; + for (int i = 0; i < this.externalHandlers.size(); i++) { + all[i + 1] = this.externalHandlers.get(i); + } + + this.allItems = new CombinedInvWrapper(all); } - public IItemHandlerModifiable getItems() { - return inventory; + /** + * @return the item handlers for all mounted storages + */ + public MountedItemStorageWrapper getMountedItems() { + return Objects.requireNonNull(this.items, "Cannot get items for uninitialized manager"); } - public IItemHandlerModifiable getFuelItems() { - return fuelInventory; + /** + * @return the item handlers for all mounted storages that may contain fuel, or null if none support it + */ + @Nullable + public MountedItemStorageWrapper getFuelItems() { + return Objects.requireNonNull(this.fuelItems, "Cannot get fuelItems for uninitialized manager"); + } + + /** + * @return the item handler representing all mounted storage and all external storage + */ + public CombinedInvWrapper getAllItems() { + return Objects.requireNonNull(this.allItems, "Cannot get allItems for uninitialized manager"); } public IFluidHandler getFluids() { - return fluidInventory; + return new CombinedTankWrapper(); } public boolean handlePlayerStorageInteraction(Contraption contraption, Player player, BlockPos localPos) { + StructureBlockInfo info = contraption.getBlocks().get(localPos); + if (info == null) + return false; + if (player.level().isClientSide()) { - BlockEntity localBE = contraption.presentBlockEntities.get(localPos); - return MountedStorage.canUseAsStorage(localBE); + return getMountedStorageType(info.state()) != null; } MountedStorageManager storageManager = contraption.getStorageForSpawnPacket(); - MountedStorage storage = storageManager.storage.get(localPos); - if (storage == null || storage.getItemHandler() == null) + MountedItemStorage storage = storageManager.items.storages.get(localPos); + if (storage != null) { + return storage.handleInteraction(player, contraption, info); + } else { return false; - IItemHandlerModifiable handler = storage.getItemHandler(); - - StructureBlockInfo info = contraption.getBlocks() - .get(localPos); - if (info != null && info.state().hasProperty(ChestBlock.TYPE)) { - ChestType chestType = info.state().getValue(ChestBlock.TYPE); - Direction facing = info.state().getOptionalValue(ChestBlock.FACING) - .orElse(Direction.SOUTH); - Direction connectedDirection = - chestType == ChestType.LEFT ? facing.getClockWise() : facing.getCounterClockWise(); - - if (chestType != ChestType.SINGLE) { - MountedStorage storage2 = storageManager.storage.get(localPos.relative(connectedDirection)); - if (storage2 != null && storage2.getItemHandler() != null) - handler = chestType == ChestType.RIGHT ? new CombinedInvWrapper(handler, storage2.getItemHandler()) - : new CombinedInvWrapper(storage2.getItemHandler(), handler); - } } - - int slotCount = handler.getSlots(); - if (slotCount == 0) - return false; - if (slotCount % 9 != 0) - return false; - - Supplier stillValid = () -> contraption.entity.isAlive() - && player.distanceToSqr(contraption.entity.toGlobalVector(Vec3.atCenterOf(localPos), 0)) < 64; - Component name = info != null ? info.state().getBlock() - .getName() : Components.literal("Container"); - player.openMenu(MountedStorageInteraction.createMenuProvider(name, handler, slotCount, stillValid)); - - Vec3 soundPos = contraption.entity.toGlobalVector(Vec3.atCenterOf(localPos), 0); - player.level().playSound(null, BlockPos.containing(soundPos), SoundEvents.BARREL_OPEN, SoundSource.BLOCKS, 0.75f, 1f); - return true; } + private static boolean typeMatches(MountedItemStorageType registered, MountedItemStorage storage, + StructureBlockInfo info, @Nullable BlockEntity be) { + MountedItemStorageType actual = storage.type; + if (registered == actual) + return true; + if (registered != null) + return false; + + BlockState state = info.state(); + if (actual == AllMountedStorageTypes.SIMPLE.get()) { + return AllTags.AllBlockTags.SIMPLE_MOUNTED_STORAGE.matches(state); + } else if (actual == AllMountedStorageTypes.FALLBACK.get() && be != null) { + return !AllTags.AllBlockTags.FALLBACK_MOUNTED_STORAGE_BLACKLIST.matches(state) + && be.getCapability(ForgeCapabilities.ITEM_HANDLER) + .resolve() + .flatMap(AllMountedStorageTypes.FALLBACK.get()::validate) + .isPresent(); + } else { + return false; + } + } + + @Nullable + private static MountedItemStorageType getMountedStorageType(BlockState state) { + MountedItemStorageType registered = MountedStorageTypeRegistry.ITEMS_BY_BLOCK.get(state.getBlock()); + if (registered != null) + return registered; + + if (AllTags.AllBlockTags.SIMPLE_MOUNTED_STORAGE.matches(state)) { + return AllMountedStorageTypes.SIMPLE.get(); + } else if (!AllTags.AllBlockTags.FALLBACK_MOUNTED_STORAGE_BLACKLIST.matches(state)) { + return AllMountedStorageTypes.FALLBACK.get(); + } else { + return null; + } + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/OrientedContraptionEntity.java b/src/main/java/com/simibubi/create/content/contraptions/OrientedContraptionEntity.java index cdd6c9be6c..c9af9c0767 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/OrientedContraptionEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/OrientedContraptionEntity.java @@ -9,6 +9,7 @@ import javax.annotation.Nullable; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllEntityTypes; +import com.simibubi.create.api.contraption.storage.item.MountedItemStorageWrapper; import com.simibubi.create.content.contraptions.bearing.StabilizedContraption; import com.simibubi.create.content.contraptions.minecart.MinecartSim2020; import com.simibubi.create.content.contraptions.minecart.capability.CapabilityMinecartController; @@ -434,9 +435,12 @@ public class OrientedContraptionEntity extends AbstractContraptionEntity { .normalize() .scale(1)); if (fuel < 5 && contraption != null) { - ItemStack coal = ItemHelper.extract(contraption.getSharedInventory(), FUEL_ITEMS, 1, false); - if (!coal.isEmpty()) - fuel += 3600; + MountedItemStorageWrapper fuelItems = contraption.getStorage().getFuelItems(); + if (fuelItems != null) { + ItemStack coal = ItemHelper.extract(fuelItems, FUEL_ITEMS, 1, false); + if (!coal.isEmpty()) + fuel += 3600; + } } if (fuel != fuelBefore || pushX != 0 || pushZ != 0) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/actors/psi/PortableFluidInterfaceBlockEntity.java b/src/main/java/com/simibubi/create/content/contraptions/actors/psi/PortableFluidInterfaceBlockEntity.java index 99b3106343..04feb48608 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/actors/psi/PortableFluidInterfaceBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/actors/psi/PortableFluidInterfaceBlockEntity.java @@ -24,7 +24,7 @@ public class PortableFluidInterfaceBlockEntity extends PortableStorageInterfaceB @Override public void startTransferringTo(Contraption contraption, float distance) { LazyOptional oldcap = capability; - capability = LazyOptional.of(() -> new InterfaceFluidHandler(contraption.getSharedFluidTanks())); + capability = LazyOptional.of(() -> new InterfaceFluidHandler(contraption.getStorage().getFluids())); oldcap.invalidate(); super.startTransferringTo(contraption, distance); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/actors/psi/PortableItemInterfaceBlockEntity.java b/src/main/java/com/simibubi/create/content/contraptions/actors/psi/PortableItemInterfaceBlockEntity.java index fd72d56279..df3e2439ce 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/actors/psi/PortableItemInterfaceBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/actors/psi/PortableItemInterfaceBlockEntity.java @@ -25,7 +25,7 @@ public class PortableItemInterfaceBlockEntity extends PortableStorageInterfaceBl @Override public void startTransferringTo(Contraption contraption, float distance) { LazyOptional oldCap = capability; - capability = LazyOptional.of(() -> new InterfaceItemHandler(contraption.getSharedInventory())); + capability = LazyOptional.of(() -> new InterfaceItemHandler(contraption.getStorage().getAllItems())); oldCap.invalidate(); super.startTransferringTo(contraption, distance); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/actors/roller/RollerMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/actors/roller/RollerMovementBehaviour.java index 5a68775a7c..f9f0fd5906 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/actors/roller/RollerMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/actors/roller/RollerMovementBehaviour.java @@ -196,7 +196,7 @@ public class RollerMovementBehaviour extends BlockBreakingMovementBehaviour { if (!getStateToPaveWith(context).isAir()) { FilterItemStack filter = context.getFilterFromBE(); if (!ItemHelper - .extract(context.contraption.getSharedInventory(), + .extract(context.contraption.getStorage().getAllItems(), stack -> filter.test(context.world, stack), 1, true) .isEmpty()) startingY = 0; @@ -475,7 +475,7 @@ public class RollerMovementBehaviour extends BlockBreakingMovementBehaviour { return PaveResult.FAIL; FilterItemStack filter = context.getFilterFromBE(); - ItemStack held = ItemHelper.extract(context.contraption.getSharedInventory(), + ItemStack held = ItemHelper.extract(context.contraption.getStorage().getAllItems(), stack -> filter.test(context.world, stack), 1, false); if (held.isEmpty()) return PaveResult.FAIL; diff --git a/src/main/java/com/simibubi/create/content/contraptions/bearing/BearingContraption.java b/src/main/java/com/simibubi/create/content/contraptions/bearing/BearingContraption.java index ce4f40be7b..665122f97b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/bearing/BearingContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/bearing/BearingContraption.java @@ -57,11 +57,11 @@ public class BearingContraption extends Contraption { } @Override - public void addBlock(BlockPos pos, Pair capture) { + public void addBlock(Level level, BlockPos pos, Pair capture) { BlockPos localPos = pos.subtract(anchor); if (!getBlocks().containsKey(localPos) && AllBlockTags.WINDMILL_SAILS.matches(getSailBlock(capture))) sailBlocks++; - super.addBlock(pos, capture); + super.addBlock(level, pos, capture); } private BlockState getSailBlock(Pair capture) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/behaviour/MovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/behaviour/MovementBehaviour.java index 02f502258f..f13673b304 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/behaviour/MovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/behaviour/MovementBehaviour.java @@ -53,7 +53,7 @@ public interface MovementBehaviour { default void dropItem(MovementContext context, ItemStack stack) { ItemStack remainder; if (AllConfigs.server().kinetics.moveItemsToStorage.get()) - remainder = ItemHandlerHelper.insertItem(context.contraption.getSharedInventory(), stack, false); + remainder = ItemHandlerHelper.insertItem(context.contraption.getStorage().getAllItems(), stack, false); else remainder = stack; if (remainder.isEmpty()) diff --git a/src/main/java/com/simibubi/create/content/contraptions/behaviour/MovementContext.java b/src/main/java/com/simibubi/create/content/contraptions/behaviour/MovementContext.java index e2d088a613..6077a3bb0e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/behaviour/MovementContext.java +++ b/src/main/java/com/simibubi/create/content/contraptions/behaviour/MovementContext.java @@ -1,11 +1,15 @@ package com.simibubi.create.content.contraptions.behaviour; +import java.util.function.Supplier; import java.util.function.UnaryOperator; +import com.google.common.base.Suppliers; +import com.simibubi.create.api.contraption.storage.item.MountedItemStorage; import com.simibubi.create.content.contraptions.Contraption; import com.simibubi.create.content.logistics.filter.FilterItemStack; import net.createmod.catnip.utility.VecHelper; + import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; @@ -35,6 +39,8 @@ public class MovementContext { private FilterItemStack filter; + private final Supplier storage; + public MovementContext(Level world, StructureBlockInfo info, Contraption contraption) { this.world = world; this.state = info.state(); @@ -51,6 +57,9 @@ public class MovementContext { data = new CompoundTag(); stall = false; filter = null; + this.storage = Suppliers.memoize( + () -> contraption.getStorage().getMountedItems().storages.get(this.localPos) + ); } public float getAnimationSpeed() { @@ -94,4 +103,7 @@ public class MovementContext { return filter = FilterItemStack.of(blockEntityData.getCompound("Filter")); } + public MountedItemStorage getStorage() { + return this.storage.get(); + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/behaviour/dispenser/DispenserMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/behaviour/dispenser/DispenserMovementBehaviour.java index 1018e98875..b82fd1057e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/behaviour/dispenser/DispenserMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/behaviour/dispenser/DispenserMovementBehaviour.java @@ -1,11 +1,18 @@ package com.simibubi.create.content.contraptions.behaviour.dispenser; import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; import com.simibubi.create.content.contraptions.behaviour.MovementContext; import com.simibubi.create.foundation.mixin.accessor.DispenserBlockAccessor; +import org.jetbrains.annotations.Nullable; + import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockSource; import net.minecraft.core.Direction; import net.minecraft.core.dispenser.AbstractProjectileDispenseBehavior; import net.minecraft.core.dispenser.DefaultDispenseItemBehavior; @@ -14,11 +21,13 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.DispenserBlock; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; public class DispenserMovementBehaviour extends DropperMovementBehaviour { - private static final HashMap MOVED_DISPENSE_ITEM_BEHAVIOURS = new HashMap<>(); - private static final HashMap MOVED_PROJECTILE_DISPENSE_BEHAVIOURS = new HashMap<>(); + private static final Map movedDispenseItemBehaviors = new HashMap<>(); + private static final Set blacklist = new HashSet<>(); + private static boolean spawnEggsRegistered = false; public static void gatherMovedDispenseItemBehaviours() { @@ -27,7 +36,7 @@ public class DispenserMovementBehaviour extends DropperMovementBehaviour { public static void registerMovedDispenseItemBehaviour(Item item, IMovedDispenseItemBehaviour movedDispenseItemBehaviour) { - MOVED_DISPENSE_ITEM_BEHAVIOURS.put(item, movedDispenseItemBehaviour); + movedDispenseItemBehaviors.put(item, movedDispenseItemBehaviour); } public static DispenseItemBehavior getDispenseMethod(ItemStack itemstack) { @@ -35,55 +44,64 @@ public class DispenserMovementBehaviour extends DropperMovementBehaviour { } @Override - protected void activate(MovementContext context, BlockPos pos) { + protected IMovedDispenseItemBehaviour getDispenseBehavior(MovementContext context, BlockPos pos, ItemStack stack) { if (!spawnEggsRegistered) { spawnEggsRegistered = true; IMovedDispenseItemBehaviour.initSpawnEggs(); } - DispenseItemLocation location = getDispenseLocation(context); - if (location.isEmpty()) { - context.world.levelEvent(1001, pos, 0); - } else { - ItemStack itemStack = getItemStackAt(location, context); - // Special dispense item behaviour for moving contraptions - if (MOVED_DISPENSE_ITEM_BEHAVIOURS.containsKey(itemStack.getItem())) { - setItemStackAt(location, MOVED_DISPENSE_ITEM_BEHAVIOURS.get(itemStack.getItem()).dispense(itemStack, context, pos), context); - return; - } - - ItemStack backup = itemStack.copy(); - // If none is there, try vanilla registry - try { - if (MOVED_PROJECTILE_DISPENSE_BEHAVIOURS.containsKey(itemStack.getItem())) { - setItemStackAt(location, MOVED_PROJECTILE_DISPENSE_BEHAVIOURS.get(itemStack.getItem()).dispense(itemStack, context, pos), context); - return; - } - - DispenseItemBehavior behavior = getDispenseMethod(itemStack); - if (behavior instanceof AbstractProjectileDispenseBehavior) { // Projectile behaviours can be converted most of the time - IMovedDispenseItemBehaviour movedBehaviour = MovedProjectileDispenserBehaviour.of((AbstractProjectileDispenseBehavior) behavior); - setItemStackAt(location, movedBehaviour.dispense(itemStack, context, pos), context); - MOVED_PROJECTILE_DISPENSE_BEHAVIOURS.put(itemStack.getItem(), movedBehaviour); // buffer conversion if successful - return; - } - - Vec3 facingVec = Vec3.atLowerCornerOf(context.state.getValue(DispenserBlock.FACING).getNormal()); - facingVec = context.rotation.apply(facingVec); - facingVec.normalize(); - Direction clostestFacing = Direction.getNearest(facingVec.x, facingVec.y, facingVec.z); - ContraptionBlockSource blockSource = new ContraptionBlockSource(context, pos, clostestFacing); - - if (behavior.getClass() != DefaultDispenseItemBehavior.class) { // There is a dispense item behaviour registered for the vanilla dispenser - setItemStackAt(location, behavior.dispense(blockSource, itemStack), context); - return; - } - } catch (NullPointerException ignored) { - itemStack = backup; // Something went wrong with the BE being null in ContraptionBlockSource, reset the stack - } - - setItemStackAt(location, DEFAULT_BEHAVIOUR.dispense(itemStack, context, pos), context); // the default: launch the item + Item item = stack.getItem(); + // return registered/cached behavior if present + if (movedDispenseItemBehaviors.containsKey(item)) { + return movedDispenseItemBehaviors.get(item); } + + // if there isn't one, try to create one from a vanilla behavior + if (blacklist.contains(item)) { + // unless it's been blacklisted, which means a behavior was created already and errored + return MovedDefaultDispenseItemBehaviour.INSTANCE; + } + + DispenseItemBehavior behavior = getDispenseMethod(stack); + // no behavior or default, use the moved default + if (behavior == null || behavior.getClass() == DefaultDispenseItemBehavior.class) + return MovedDefaultDispenseItemBehaviour.INSTANCE; + + // projectile-specific behaviors are pretty straightforward to convert + if (behavior instanceof AbstractProjectileDispenseBehavior projectile) { + IMovedDispenseItemBehaviour movedBehaviour = MovedProjectileDispenserBehaviour.of(projectile); + // cache it for later + registerMovedDispenseItemBehaviour(item, movedBehaviour); + return movedBehaviour; + } + + // other behaviors are more convoluted due to BlockSource providing a BlockEntity. + Vec3 normal = getRotatedFacingNormal(context); + Direction nearestFacing = Direction.getNearest(normal.x, normal.y, normal.z); + ContraptionBlockSource source = new ContraptionBlockSource(context, pos, nearestFacing); + IMovedDispenseItemBehaviour movedBehavior = new FallbackMovedDispenseBehavior(item, behavior, source); + registerMovedDispenseItemBehaviour(item, movedBehavior); + return movedBehavior; } + private static Vec3 getRotatedFacingNormal(MovementContext ctx) { + Direction facing = ctx.state.getValue(DispenserBlock.FACING); + Vec3 normal = Vec3.atLowerCornerOf(facing.getNormal()); + return ctx.rotation.apply(normal); + } + + private record FallbackMovedDispenseBehavior(Item item, DispenseItemBehavior wrapped, BlockSource source) implements IMovedDispenseItemBehaviour { + @Override + public ItemStack dispense(ItemStack stack, MovementContext context, BlockPos pos) { + ItemStack backup = stack.copy(); + try { + return this.wrapped.dispense(this.source, stack); + } catch (NullPointerException ignored) { + // error due to lack of a BlockEntity. Un-register self to avoid continuing to fail + movedDispenseItemBehaviors.remove(this.item); + blacklist.add(this.item); + return backup; + } + } + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/behaviour/dispenser/DropperMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/behaviour/dispenser/DropperMovementBehaviour.java index 65f73bbe26..e4ab4f1792 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/behaviour/dispenser/DropperMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/behaviour/dispenser/DropperMovementBehaviour.java @@ -1,132 +1,90 @@ package com.simibubi.create.content.contraptions.behaviour.dispenser; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; +import java.util.function.Predicate; +import com.simibubi.create.api.contraption.storage.item.MountedItemStorage; +import com.simibubi.create.content.contraptions.MountedStorageManager; import com.simibubi.create.content.contraptions.behaviour.MovementBehaviour; import com.simibubi.create.content.contraptions.behaviour.MovementContext; import com.simibubi.create.foundation.item.ItemHelper; +import it.unimi.dsi.fastutil.ints.IntArrayList; +import it.unimi.dsi.fastutil.ints.IntList; + +import net.minecraft.Util; import net.minecraft.core.BlockPos; -import net.minecraft.core.NonNullList; -import net.minecraft.world.ContainerHelper; +import net.minecraft.util.RandomSource; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; +import net.minecraft.world.level.block.LevelEvent; public class DropperMovementBehaviour implements MovementBehaviour { - protected static final MovedDefaultDispenseItemBehaviour DEFAULT_BEHAVIOUR = - new MovedDefaultDispenseItemBehaviour(); - private static final Random RNG = new Random(); - - protected void activate(MovementContext context, BlockPos pos) { - DispenseItemLocation location = getDispenseLocation(context); - if (location.isEmpty()) { - context.world.levelEvent(1001, pos, 0); - } else { - setItemStackAt(location, DEFAULT_BEHAVIOUR.dispense(getItemStackAt(location, context), context, pos), - context); - } - } - @Override public void visitNewPosition(MovementContext context, BlockPos pos) { - if (context.world.isClientSide) + if (context.world.isClientSide || context.getStorage() == null) return; - collectItems(context); - activate(context, pos); - } - private void collectItems(MovementContext context) { - getStacks(context).stream() - .filter(itemStack -> !itemStack.isEmpty() && itemStack.getItem() != Items.AIR - && itemStack.getMaxStackSize() > itemStack.getCount()) - .forEach(itemStack -> itemStack.grow(ItemHelper - .extract(context.contraption.getSharedInventory(), (otherItemStack) -> ItemStack.isSameItemSameTags(itemStack, otherItemStack), - ItemHelper.ExtractionCountMode.UPTO, itemStack.getMaxStackSize() - itemStack.getCount(), false) - .getCount())); - } - - private void updateTemporaryData(MovementContext context) { - if (!(context.temporaryData instanceof NonNullList) && context.world != null) { - NonNullList stacks = NonNullList.withSize(getInvSize(), ItemStack.EMPTY); - ContainerHelper.loadAllItems(context.blockEntityData, stacks); - context.temporaryData = stacks; - } - } - - @SuppressWarnings("unchecked") - private NonNullList getStacks(MovementContext context) { - updateTemporaryData(context); - return (NonNullList) context.temporaryData; - } - - private ArrayList getUseableLocations(MovementContext context) { - ArrayList useable = new ArrayList<>(); - for (int slot = 0; slot < getInvSize(); slot++) { - DispenseItemLocation location = new DispenseItemLocation(true, slot); - ItemStack testStack = getItemStackAt(location, context); - if (testStack == null || testStack.isEmpty()) - continue; - if (testStack.getMaxStackSize() == 1) { - location = new DispenseItemLocation(false, ItemHelper.findFirstMatchingSlotIndex( - context.contraption.getSharedInventory(), ItemHelper.sameItemPredicate(testStack))); - if (!getItemStackAt(location, context).isEmpty()) - useable.add(location); - } else if (testStack.getCount() >= 2) - useable.add(location); - } - return useable; - } - - @Override - public void writeExtraData(MovementContext context) { - NonNullList stacks = getStacks(context); - if (stacks == null) + int slot = getSlot(context.getStorage(), context.world.random); + if (slot == -1) { + // all slots empty + failDispense(context, pos); return; - ContainerHelper.saveAllItems(context.blockEntityData, stacks); - } + } - @Override - public void stopMoving(MovementContext context) { - MovementBehaviour.super.stopMoving(context); - writeExtraData(context); - } - - protected DispenseItemLocation getDispenseLocation(MovementContext context) { - int i = -1; - int j = 1; - List useableLocations = getUseableLocations(context); - for (int k = 0; k < useableLocations.size(); ++k) { - if (RNG.nextInt(j++) == 0) { - i = k; + // copy because dispense behaviors will modify it directly + ItemStack stack = context.getStorage().getStackInSlot(slot).copy(); + if (stack.getCount() == 1 && stack.getMaxStackSize() != 1) { + // last one, try to top it off + if (!tryTopOff(stack, context.getStorage(), context.contraption.getStorage())) { + // failed, abort dispense to preserve filters + failDispense(context, pos); + return; } } - if (i < 0) - return DispenseItemLocation.NONE; - else - return useableLocations.get(i); + + IMovedDispenseItemBehaviour behavior = getDispenseBehavior(context, pos, stack); + ItemStack remainder = behavior.dispense(stack, context, pos); + context.getStorage().setStackInSlot(slot, remainder); } - protected ItemStack getItemStackAt(DispenseItemLocation location, MovementContext context) { - if (location.isInternal()) { - return getStacks(context).get(location.getSlot()); - } else { - return context.contraption.getSharedInventory() - .getStackInSlot(location.getSlot()); + protected IMovedDispenseItemBehaviour getDispenseBehavior(MovementContext context, BlockPos pos, ItemStack stack) { + return MovedDefaultDispenseItemBehaviour.INSTANCE; + } + + private static boolean tryTopOff(ItemStack stack, MountedItemStorage storage, MountedStorageManager manager) { + Predicate test = otherStack -> ItemStack.isSameItemSameTags(stack, otherStack); + int originalSize = stack.getCount(); + + for (MountedItemStorage otherStorage : manager.getMountedItems().storages.values()) { + if (storage == otherStorage) + continue; + + int needed = stack.getMaxStackSize() - stack.getCount(); + ItemStack extracted = ItemHelper.extract(storage, test, ItemHelper.ExtractionCountMode.UPTO, needed, false); + stack.grow(extracted.getCount()); + if (stack.getCount() >= stack.getMaxStackSize()) + break; } + + return stack.getCount() != originalSize; } - protected void setItemStackAt(DispenseItemLocation location, ItemStack stack, MovementContext context) { - if (location.isInternal()) { - getStacks(context).set(location.getSlot(), stack); - } else { - context.contraption.getSharedInventory() - .setStackInSlot(location.getSlot(), stack); + private static int getSlot(MountedItemStorage storage, RandomSource random) { + IntList filledSlots = new IntArrayList(); + for (int i = 0; i < storage.getSlots(); i++) { + ItemStack stack = storage.getStackInSlot(i); + if (!stack.isEmpty()) { + filledSlots.add(i); + } } + + return switch (filledSlots.size()) { + case 0 -> -1; + case 1 -> filledSlots.getInt(0); + default -> Util.getRandom(filledSlots, random); + }; } - private static int getInvSize() { - return 9; + private static void failDispense(MovementContext ctx, BlockPos pos) { + ctx.world.levelEvent(LevelEvent.SOUND_DISPENSER_FAIL, pos, 0); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/behaviour/dispenser/MovedDefaultDispenseItemBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/behaviour/dispenser/MovedDefaultDispenseItemBehaviour.java index 1ad03f1bcf..4dc45a4bcc 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/behaviour/dispenser/MovedDefaultDispenseItemBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/behaviour/dispenser/MovedDefaultDispenseItemBehaviour.java @@ -13,9 +13,10 @@ import net.minecraft.world.level.block.DispenserBlock; import net.minecraft.world.level.block.entity.HopperBlockEntity; import net.minecraft.world.phys.Vec3; import net.minecraftforge.items.ItemHandlerHelper; +import net.minecraftforge.items.wrapper.CombinedInvWrapper; public class MovedDefaultDispenseItemBehaviour implements IMovedDispenseItemBehaviour { - private static final MovedDefaultDispenseItemBehaviour DEFAULT_INSTANCE = new MovedDefaultDispenseItemBehaviour(); + public static final MovedDefaultDispenseItemBehaviour INSTANCE = new MovedDefaultDispenseItemBehaviour(); public static void doDispense(Level p_82486_0_, ItemStack p_82486_1_, int p_82486_2_, Vec3 facing, BlockPos p_82486_4_, MovementContext context) { @@ -98,10 +99,21 @@ public class MovedDefaultDispenseItemBehaviour implements IMovedDispenseItemBeha protected ItemStack placeItemInInventory(ItemStack consumedFrom, ItemStack output, MovementContext context, BlockPos pos, Vec3 facing) { consumedFrom.shrink(1); - ItemStack remainder = - ItemHandlerHelper.insertItem(context.contraption.getSharedInventory(), output.copy(), false); - if (!remainder.isEmpty()) - DEFAULT_INSTANCE.dispenseStack(output, context, pos, facing); + + ItemStack toInsert = output.copy(); + // try inserting into own inventory first + ItemStack remainder = ItemHandlerHelper.insertItem(context.getStorage(), toInsert, false); + if (!remainder.isEmpty()) { + // next, try the whole contraption inventory + // note that this contains the dispenser inventory. That's fine. + CombinedInvWrapper contraption = context.contraption.getStorage().getAllItems(); + ItemStack newRemainder = ItemHandlerHelper.insertItem(contraption, remainder, false); + if (!newRemainder.isEmpty()) { + // if there's *still* something left, dispense into world + INSTANCE.dispenseStack(remainder, context, pos, facing); + } + } + return consumedFrom; } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/behaviour/dispenser/storage/DispenserMountedStorage.java b/src/main/java/com/simibubi/create/content/contraptions/behaviour/dispenser/storage/DispenserMountedStorage.java new file mode 100644 index 0000000000..8f3cd295f2 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/behaviour/dispenser/storage/DispenserMountedStorage.java @@ -0,0 +1,25 @@ +package com.simibubi.create.content.contraptions.behaviour.dispenser.storage; + +import com.mojang.serialization.Codec; +import com.simibubi.create.AllMountedStorageTypes; +import com.simibubi.create.api.contraption.storage.item.simple.SimpleMountedStorage; +import com.simibubi.create.api.contraption.storage.item.simple.SimpleMountedStorageType; + +import net.minecraftforge.items.IItemHandlerModifiable; + +public class DispenserMountedStorage extends SimpleMountedStorage { + public static final Codec CODEC = SimpleMountedStorage.codec(DispenserMountedStorage::new); + + protected DispenserMountedStorage(SimpleMountedStorageType type, IItemHandlerModifiable handler) { + super(type, handler); + } + + public DispenserMountedStorage(IItemHandlerModifiable handler) { + this(AllMountedStorageTypes.DISPENSER.get(), handler); + } + + @Override + public boolean providesFuel() { + return false; + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/behaviour/dispenser/storage/DispenserMountedStorageType.java b/src/main/java/com/simibubi/create/content/contraptions/behaviour/dispenser/storage/DispenserMountedStorageType.java new file mode 100644 index 0000000000..07f19a185d --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/behaviour/dispenser/storage/DispenserMountedStorageType.java @@ -0,0 +1,17 @@ +package com.simibubi.create.content.contraptions.behaviour.dispenser.storage; + +import com.simibubi.create.api.contraption.storage.item.simple.SimpleMountedStorage; +import com.simibubi.create.api.contraption.storage.item.simple.SimpleMountedStorageType; + +import net.minecraftforge.items.IItemHandlerModifiable; + +public class DispenserMountedStorageType extends SimpleMountedStorageType { + public DispenserMountedStorageType() { + super(DispenserMountedStorage.CODEC); + } + + @Override + protected SimpleMountedStorage createStorage(IItemHandlerModifiable handler) { + return new DispenserMountedStorage(handler); + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/minecart/TrainCargoManager.java b/src/main/java/com/simibubi/create/content/contraptions/minecart/TrainCargoManager.java index 6b045b69a4..99a461e29d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/minecart/TrainCargoManager.java +++ b/src/main/java/com/simibubi/create/content/contraptions/minecart/TrainCargoManager.java @@ -1,21 +1,15 @@ package com.simibubi.create.content.contraptions.minecart; -import java.util.Arrays; -import java.util.Collection; -import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; -import com.simibubi.create.content.contraptions.Contraption.ContraptionInvWrapper; +import com.simibubi.create.api.contraption.storage.item.MountedItemStorageWrapper; import com.simibubi.create.content.contraptions.MountedStorageManager; import com.simibubi.create.foundation.fluid.CombinedTankWrapper; -import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.IFluidHandler; -import net.minecraftforge.items.IItemHandlerModifiable; public class TrainCargoManager extends MountedStorageManager { @@ -28,20 +22,12 @@ public class TrainCargoManager extends MountedStorageManager { } @Override - public void createHandlers() { - super.createHandlers(); - } - - @Override - protected ContraptionInvWrapper wrapItems(Collection list, boolean fuel) { - if (fuel) - return super.wrapItems(list, fuel); - return new CargoInvWrapper(Arrays.copyOf(list.toArray(), list.size(), IItemHandlerModifiable[].class)); - } - - @Override - protected CombinedTankWrapper wrapFluids(Collection list) { - return new CargoTankWrapper(Arrays.copyOf(list.toArray(), list.size(), IFluidHandler[].class)); + public void initialize() { + super.initialize(); + this.items = new CargoInvWrapper(this.items); + if (this.fuelItems != null) { + this.fuelItems = new CargoInvWrapper(this.fuelItems); + } } @Override @@ -51,36 +37,35 @@ public class TrainCargoManager extends MountedStorageManager { } @Override - public void read(CompoundTag nbt, Map presentBlockEntities, boolean clientPacket) { - super.read(nbt, presentBlockEntities, clientPacket); + public void read(CompoundTag nbt) { + super.read(nbt); ticksSinceLastExchange = nbt.getInt("TicksSinceLastExchange"); } public void resetIdleCargoTracker() { ticksSinceLastExchange = 0; } - + public void tickIdleCargoTracker() { ticksSinceLastExchange++; } - + public int getTicksSinceLastExchange() { return ticksSinceLastExchange; } - + public int getVersion() { return version.get(); } - + void changeDetected() { version.incrementAndGet(); resetIdleCargoTracker(); } - class CargoInvWrapper extends ContraptionInvWrapper { - - public CargoInvWrapper(IItemHandlerModifiable... itemHandler) { - super(false, itemHandler); + class CargoInvWrapper extends MountedItemStorageWrapper { + public CargoInvWrapper(MountedItemStorageWrapper wrapped) { + super(wrapped.storages); } @Override @@ -137,7 +122,7 @@ public class TrainCargoManager extends MountedStorageManager { changeDetected(); return drained; } - + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/mounted/MountedContraption.java b/src/main/java/com/simibubi/create/content/contraptions/mounted/MountedContraption.java index 9c2da8de72..54c38891d3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/mounted/MountedContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/mounted/MountedContraption.java @@ -59,7 +59,7 @@ public class MountedContraption extends Contraption { return false; Axis axis = state.getValue(RAIL_SHAPE) == RailShape.EAST_WEST ? Axis.X : Axis.Z; - addBlock(pos, Pair.of(new StructureBlockInfo(pos, AllBlocks.MINECART_ANCHOR.getDefaultState() + addBlock(world, pos, Pair.of(new StructureBlockInfo(pos, AllBlocks.MINECART_ANCHOR.getDefaultState() .setValue(BlockStateProperties.HORIZONTAL_AXIS, axis), null), null)); if (blocks.size() == 1) @@ -153,7 +153,7 @@ public class MountedContraption extends Contraption { public void addExtraInventories(Entity cart) { if (cart instanceof Container container) - storage.attachExternal(new ContraptionInvWrapper(true, new InvWrapper(container))); + storage.attachExternal(new InvWrapper(container)); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/piston/PistonContraption.java b/src/main/java/com/simibubi/create/content/contraptions/piston/PistonContraption.java index 817c9cd936..5115a490ba 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/piston/PistonContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/piston/PistonContraption.java @@ -187,8 +187,8 @@ public class PistonContraption extends TranslatingContraption { } @Override - public void addBlock(BlockPos pos, Pair capture) { - super.addBlock(pos.relative(orientation, -initialExtensionProgress), capture); + public void addBlock(Level level, BlockPos pos, Pair capture) { + super.addBlock(level, pos.relative(orientation, -initialExtensionProgress), capture); } @Override diff --git a/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolboxInventory.java b/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolboxInventory.java index d391f50239..3240c1aaee 100644 --- a/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolboxInventory.java +++ b/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolboxInventory.java @@ -2,12 +2,18 @@ package com.simibubi.create.content.equipment.toolbox; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.function.Consumer; import javax.annotation.Nonnull; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import com.simibubi.create.AllItems; +import com.simibubi.create.foundation.item.ItemSlots; +import com.simibubi.create.foundation.utility.CreateCodecs; + import net.createmod.catnip.utility.NBTHelper; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; @@ -16,6 +22,10 @@ import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.ItemStackHandler; public class ToolboxInventory extends ItemStackHandler { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + ItemSlots.maxSizeCodec(8).fieldOf("items").forGetter(ItemSlots::fromHandler), + ItemStack.CODEC.listOf().fieldOf("filters").forGetter(toolbox -> toolbox.filters) + ).apply(instance, ToolboxInventory::deserialize)); public static final int STACKS_PER_COMPARTMENT = 4; List filters; @@ -212,4 +222,11 @@ public class ToolboxInventory extends ItemStackHandler { blockEntity.notifyUpdate(); } + private static ToolboxInventory deserialize(ItemSlots slots, List filters) { + ToolboxInventory inventory = new ToolboxInventory(null); + slots.forEach(inventory::setStackInSlot); + inventory.filters = filters; + return inventory; + } + } diff --git a/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolboxMountedStorage.java b/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolboxMountedStorage.java new file mode 100644 index 0000000000..402931cf82 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolboxMountedStorage.java @@ -0,0 +1,55 @@ +package com.simibubi.create.content.equipment.toolbox; + +import com.mojang.serialization.Codec; +import com.simibubi.create.AllMountedStorageTypes; +import com.simibubi.create.api.contraption.storage.item.MountedItemStorageType; +import com.simibubi.create.api.contraption.storage.item.WrapperMountedItemStorage; + +import com.simibubi.create.content.contraptions.Contraption; + +import com.simibubi.create.foundation.item.ItemHelper; + +import org.jetbrains.annotations.Nullable; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate.StructureBlockInfo; + +public class ToolboxMountedStorage extends WrapperMountedItemStorage { + public static final Codec CODEC = ToolboxInventory.CODEC.xmap( + ToolboxMountedStorage::new, storage -> storage.wrapped + ); + + protected ToolboxMountedStorage(MountedItemStorageType type, ToolboxInventory wrapped) { + super(type, wrapped); + } + + protected ToolboxMountedStorage(ToolboxInventory wrapped) { + this(AllMountedStorageTypes.TOOLBOX.get(), wrapped); + } + + @Override + public void unmount(Level level, BlockState state, BlockPos pos, @Nullable BlockEntity be) { + if (be instanceof ToolboxBlockEntity toolbox) { + ItemHelper.copyContents(this, toolbox.inventory); + } + } + + @Override + public boolean handleInteraction(Player player, Contraption contraption, StructureBlockInfo info) { + // The default impl will fail anyway, might as well cancel trying + return false; + } + + public static ToolboxMountedStorage fromToolbox(ToolboxBlockEntity toolbox) { + // the inventory will send updates to the block entity, make an isolated copy to avoid that + ToolboxInventory copy = new ToolboxInventory(null); + ItemHelper.copyContents(toolbox.inventory, copy); + copy.filters = toolbox.inventory.filters.stream().map(ItemStack::copy).toList(); + return new ToolboxMountedStorage(copy); + } +} diff --git a/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolboxMountedStorageType.java b/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolboxMountedStorageType.java new file mode 100644 index 0000000000..7ff776e95a --- /dev/null +++ b/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolboxMountedStorageType.java @@ -0,0 +1,22 @@ +package com.simibubi.create.content.equipment.toolbox; + +import com.simibubi.create.api.contraption.storage.item.MountedItemStorageType; + +import org.jetbrains.annotations.Nullable; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; + +public class ToolboxMountedStorageType extends MountedItemStorageType { + public ToolboxMountedStorageType() { + super(ToolboxMountedStorage.CODEC); + } + + @Override + @Nullable + public ToolboxMountedStorage mount(Level level, BlockState state, BlockPos pos, @Nullable BlockEntity be) { + return be instanceof ToolboxBlockEntity toolbox ? ToolboxMountedStorage.fromToolbox(toolbox) : null; + } +} diff --git a/src/main/java/com/simibubi/create/content/kinetics/deployer/DeployerMovementBehaviour.java b/src/main/java/com/simibubi/create/content/kinetics/deployer/DeployerMovementBehaviour.java index 7e4782a10b..d6f6c808a1 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/deployer/DeployerMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/kinetics/deployer/DeployerMovementBehaviour.java @@ -144,7 +144,7 @@ public class DeployerMovementBehaviour implements MovementBehaviour { ItemStack contextStack = requiredItems.isEmpty() ? ItemStack.EMPTY : requiredItems.get(0).stack; if (!context.contraption.hasUniversalCreativeCrate) { - IItemHandler itemHandler = context.contraption.getSharedInventory(); + IItemHandler itemHandler = context.contraption.getStorage().getAllItems(); for (ItemRequirement.StackRequirement required : requiredItems) { ItemStack stack = ItemHelper .extract(itemHandler, required::matches, ExtractionCountMode.EXACTLY, @@ -233,7 +233,7 @@ public class DeployerMovementBehaviour implements MovementBehaviour { FilterItemStack filter = context.getFilterFromBE(); if (AllItems.SCHEMATIC.isIn(filter.item())) return; - ItemStack held = ItemHelper.extract(context.contraption.getSharedInventory(), + ItemStack held = ItemHelper.extract(context.contraption.getStorage().getAllItems(), stack -> filter.test(context.world, stack), 1, false); player.setItemInHand(InteractionHand.MAIN_HAND, held); } diff --git a/src/main/java/com/simibubi/create/content/kinetics/saw/SawMovementBehaviour.java b/src/main/java/com/simibubi/create/content/kinetics/saw/SawMovementBehaviour.java index 0716f32f83..6a573aa4b0 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/saw/SawMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/kinetics/saw/SawMovementBehaviour.java @@ -82,7 +82,7 @@ public class SawMovementBehaviour extends BlockBreakingMovementBehaviour { } public void dropItemFromCutTree(MovementContext context, BlockPos pos, ItemStack stack) { - ItemStack remainder = ItemHandlerHelper.insertItem(context.contraption.getSharedInventory(), stack, false); + ItemStack remainder = ItemHandlerHelper.insertItem(context.contraption.getStorage().getAllItems(), stack, false); if (remainder.isEmpty()) return; diff --git a/src/main/java/com/simibubi/create/content/logistics/crate/CreativeCrateMountedStorage.java b/src/main/java/com/simibubi/create/content/logistics/crate/CreativeCrateMountedStorage.java new file mode 100644 index 0000000000..218f8b4f3b --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/crate/CreativeCrateMountedStorage.java @@ -0,0 +1,82 @@ +package com.simibubi.create.content.logistics.crate; + +import com.mojang.serialization.Codec; +import com.simibubi.create.AllMountedStorageTypes; +import com.simibubi.create.api.contraption.storage.item.MountedItemStorage; + +import com.simibubi.create.api.contraption.storage.item.MountedItemStorageType; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; + +public class CreativeCrateMountedStorage extends MountedItemStorage { + public static final Codec CODEC = ItemStack.CODEC.xmap( + CreativeCrateMountedStorage::new, storage -> storage.suppliedStack + ); + + private final ItemStack suppliedStack; + private final ItemStack cachedStackInSlot; + + protected CreativeCrateMountedStorage(MountedItemStorageType type, ItemStack suppliedStack) { + super(type); + this.suppliedStack = suppliedStack; + this.cachedStackInSlot = suppliedStack.copyWithCount(suppliedStack.getMaxStackSize()); + } + + public CreativeCrateMountedStorage(ItemStack suppliedStack) { + this(AllMountedStorageTypes.CREATIVE_CRATE.get(), suppliedStack); + } + + @Override + public void unmount(Level level, BlockState state, BlockPos pos, @Nullable BlockEntity be) { + // no need to do anything here, the supplied item can't change while mounted + } + + @Override + public int getSlots() { + return 2; // 0 holds the supplied stack endlessly, 1 is always empty to accept + } + + @Override + @NotNull + public ItemStack getStackInSlot(int slot) { + return slot == 0 ? this.cachedStackInSlot : ItemStack.EMPTY; + } + + @Override + public void setStackInSlot(int slot, @NotNull ItemStack stack) { + } + + @Override + @NotNull + public ItemStack insertItem(int slot, @NotNull ItemStack stack, boolean simulate) { + return ItemStack.EMPTY; // no remainder, accept any input + } + + @Override + @NotNull + public ItemStack extractItem(int slot, int amount, boolean simulate) { + if (slot == 0 && !this.suppliedStack.isEmpty()) { + int count = Math.min(amount, this.suppliedStack.getMaxStackSize()); + return this.suppliedStack.copyWithCount(count); + } + + return ItemStack.EMPTY; + } + + @Override + public int getSlotLimit(int slot) { + return 64; + } + + @Override + public boolean isItemValid(int slot, @NotNull ItemStack stack) { + return true; + } +} diff --git a/src/main/java/com/simibubi/create/content/logistics/crate/CreativeCrateMountedStorageType.java b/src/main/java/com/simibubi/create/content/logistics/crate/CreativeCrateMountedStorageType.java new file mode 100644 index 0000000000..86b261e1c9 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/crate/CreativeCrateMountedStorageType.java @@ -0,0 +1,28 @@ +package com.simibubi.create.content.logistics.crate; + +import com.simibubi.create.api.contraption.storage.item.MountedItemStorageType; + +import org.jetbrains.annotations.Nullable; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; + +public class CreativeCrateMountedStorageType extends MountedItemStorageType { + public CreativeCrateMountedStorageType() { + super(CreativeCrateMountedStorage.CODEC); + } + + @Override + @Nullable + public CreativeCrateMountedStorage mount(Level level, BlockState state, BlockPos pos, @Nullable BlockEntity be) { + if (be instanceof CreativeCrateBlockEntity crate) { + ItemStack supplied = crate.filtering.getFilter(); + return new CreativeCrateMountedStorage(supplied); + } + + return null; + } +} diff --git a/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelMovementBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelMovementBehaviour.java index 6f34f46b29..b5f96ac912 100644 --- a/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelMovementBehaviour.java @@ -76,7 +76,7 @@ public class FunnelMovementBehaviour implements MovementBehaviour { boolean upTo = context.blockEntityData.getBoolean("UpTo"); filterAmount = hasFilter ? filterAmount : 1; - ItemStack extract = ItemHelper.extract(context.contraption.getSharedInventory(), + ItemStack extract = ItemHelper.extract(context.contraption.getStorage().getAllItems(), s -> filter.test(world, s), upTo ? ItemHelper.ExtractionCountMode.UPTO : ItemHelper.ExtractionCountMode.EXACTLY, filterAmount, false); @@ -105,7 +105,7 @@ public class FunnelMovementBehaviour implements MovementBehaviour { if (!filter.test(context.world, toInsert)) continue; ItemStack remainder = - ItemHandlerHelper.insertItemStacked(context.contraption.getSharedInventory(), toInsert, false); + ItemHandlerHelper.insertItemStacked(context.contraption.getStorage().getAllItems(), toInsert, false); if (remainder.getCount() == toInsert.getCount()) continue; if (remainder.isEmpty()) { diff --git a/src/main/java/com/simibubi/create/content/logistics/vault/ItemVaultMountedStorage.java b/src/main/java/com/simibubi/create/content/logistics/vault/ItemVaultMountedStorage.java new file mode 100644 index 0000000000..871971a2bf --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/vault/ItemVaultMountedStorage.java @@ -0,0 +1,49 @@ +package com.simibubi.create.content.logistics.vault; + +import com.mojang.serialization.Codec; +import com.simibubi.create.AllMountedStorageTypes; + +import com.simibubi.create.api.contraption.storage.item.MountedItemStorageType; +import com.simibubi.create.api.contraption.storage.item.WrapperMountedItemStorage; + +import com.simibubi.create.foundation.utility.CreateCodecs; + +import net.minecraftforge.items.ItemStackHandler; + +import org.jetbrains.annotations.Nullable; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; + +public class ItemVaultMountedStorage extends WrapperMountedItemStorage { + public static final Codec CODEC = CreateCodecs.ITEM_STACK_HANDLER.xmap( + ItemVaultMountedStorage::new, storage -> storage.wrapped + ); + + protected ItemVaultMountedStorage(MountedItemStorageType type, ItemStackHandler handler) { + super(type, handler); + } + + protected ItemVaultMountedStorage(ItemStackHandler handler) { + this(AllMountedStorageTypes.VAULT.get(), handler); + } + + @Override + public void unmount(Level level, BlockState state, BlockPos pos, @Nullable BlockEntity be) { + if (be instanceof ItemVaultBlockEntity vault) { + vault.applyInventoryToBlock(this.wrapped); + } + } + + @Override + public boolean providesFuel() { + return false; + } + + public static ItemVaultMountedStorage fromVault(ItemVaultBlockEntity vault) { + // Vault inventories have a world-affecting onContentsChanged, copy to a safe one + return new ItemVaultMountedStorage(copyToItemStackHandler(vault.getInventoryOfBlock())); + } +} diff --git a/src/main/java/com/simibubi/create/content/logistics/vault/ItemVaultMountedStorageType.java b/src/main/java/com/simibubi/create/content/logistics/vault/ItemVaultMountedStorageType.java new file mode 100644 index 0000000000..51b065850e --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/vault/ItemVaultMountedStorageType.java @@ -0,0 +1,22 @@ +package com.simibubi.create.content.logistics.vault; + +import com.simibubi.create.api.contraption.storage.item.MountedItemStorageType; + +import org.jetbrains.annotations.Nullable; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; + +public class ItemVaultMountedStorageType extends MountedItemStorageType { + public ItemVaultMountedStorageType() { + super(ItemVaultMountedStorage.CODEC); + } + + @Override + @Nullable + public ItemVaultMountedStorage mount(Level level, BlockState state, BlockPos pos, @Nullable BlockEntity be) { + return be instanceof ItemVaultBlockEntity vault ? ItemVaultMountedStorage.fromVault(vault) : null; + } +} diff --git a/src/main/java/com/simibubi/create/content/trains/entity/Carriage.java b/src/main/java/com/simibubi/create/content/trains/entity/Carriage.java index 8777a50dad..f8d112b0dc 100644 --- a/src/main/java/com/simibubi/create/content/trains/entity/Carriage.java +++ b/src/main/java/com/simibubi/create/content/trains/entity/Carriage.java @@ -647,7 +647,7 @@ public class Carriage { public void read(CompoundTag tag) { cutoff = tag.getFloat("Cutoff"); discardTicks = tag.getInt("DiscardTicks"); - storage.read(tag, null, false); + storage.read(tag); if (tag.contains("Pivot")) pivot = TrackNodeLocation.read(tag.getCompound("Pivot"), null); if (positionAnchor != null) diff --git a/src/main/java/com/simibubi/create/content/trains/entity/CarriageContraption.java b/src/main/java/com/simibubi/create/content/trains/entity/CarriageContraption.java index 3123e1ae8f..cc68bcad7d 100644 --- a/src/main/java/com/simibubi/create/content/trains/entity/CarriageContraption.java +++ b/src/main/java/com/simibubi/create/content/trains/entity/CarriageContraption.java @@ -10,7 +10,6 @@ import java.util.Optional; import org.apache.commons.lang3.tuple.Pair; import com.simibubi.create.AllBlocks; -import com.simibubi.create.content.contraptions.AbstractContraptionEntity; import com.simibubi.create.content.contraptions.AssemblyException; import com.simibubi.create.content.contraptions.Contraption; import com.simibubi.create.content.contraptions.ContraptionType; @@ -39,11 +38,6 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate.StructureBlockInfo; import net.minecraft.world.phys.AABB; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.capability.IFluidHandler; -import net.minecraftforge.fluids.capability.templates.FluidTank; -import net.minecraftforge.items.IItemHandlerModifiable; -import net.minecraftforge.items.ItemStackHandler; public class CarriageContraption extends Contraption { @@ -67,8 +61,12 @@ public class CarriageContraption extends Contraption { public int portalCutoffMin; public int portalCutoffMax; - static final IItemHandlerModifiable fallbackItems = new ItemStackHandler(); - static final IFluidHandler fallbackFluids = new FluidTank(0); + static final MountedStorageManager fallbackStorage; + + static { + fallbackStorage = new MountedStorageManager(); + fallbackStorage.initialize(); + } public CarriageContraption() { conductorSeats = new HashMap<>(); @@ -321,25 +319,7 @@ public class CarriageContraption extends Contraption { } @Override - public IItemHandlerModifiable getSharedInventory() { - return storageProxy == null ? fallbackItems : storageProxy.getItems(); + public MountedStorageManager getStorage() { + return storageProxy == null ? fallbackStorage : storageProxy; } - - @Override - public IFluidHandler getSharedFluidTanks() { - return storageProxy == null ? fallbackFluids : storageProxy.getFluids(); - } - - public void handleContraptionFluidPacket(BlockPos localPos, FluidStack containedFluid) { - storage.updateContainedFluid(localPos, containedFluid); - } - - @Override - public void tickStorage(AbstractContraptionEntity entity) { - if (entity.level().isClientSide) - storage.entityTick(entity); - else if (storageProxy != null) - storageProxy.entityTick(entity); - } - } diff --git a/src/main/java/com/simibubi/create/content/trains/entity/Train.java b/src/main/java/com/simibubi/create/content/trains/entity/Train.java index 292e59e891..a44d10f445 100644 --- a/src/main/java/com/simibubi/create/content/trains/entity/Train.java +++ b/src/main/java/com/simibubi/create/content/trains/entity/Train.java @@ -218,7 +218,7 @@ public class Train { if (shouldActivate) break; - IItemHandlerModifiable inv = carriage.storage.getItems(); + IItemHandlerModifiable inv = carriage.storage.getAllItems(); if (inv != null) { for (int slot = 0; slot < inv.getSlots(); slot++) { if (shouldActivate) @@ -269,7 +269,7 @@ public class Train { updateConductors(); return; } - + GlobalStation currentStation = getCurrentStation(); if (currentStation != null) { ticksSinceLastMailTransfer++; diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/condition/ItemThresholdCondition.java b/src/main/java/com/simibubi/create/content/trains/schedule/condition/ItemThresholdCondition.java index 7705445213..ef9c0a0493 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/condition/ItemThresholdCondition.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/condition/ItemThresholdCondition.java @@ -45,7 +45,7 @@ public class ItemThresholdCondition extends CargoThresholdCondition { int foundItems = 0; for (Carriage carriage : train.carriages) { - IItemHandlerModifiable items = carriage.storage.getItems(); + IItemHandlerModifiable items = carriage.storage.getAllItems(); for (int i = 0; i < items.getSlots(); i++) { ItemStack stackInSlot = items.getStackInSlot(i); if (!stack.test(level, stackInSlot)) diff --git a/src/main/java/com/simibubi/create/content/trains/station/GlobalStation.java b/src/main/java/com/simibubi/create/content/trains/station/GlobalStation.java index e4ca488a85..a1415521c8 100644 --- a/src/main/java/com/simibubi/create/content/trains/station/GlobalStation.java +++ b/src/main/java/com/simibubi/create/content/trains/station/GlobalStation.java @@ -182,7 +182,7 @@ public class GlobalStation extends SingleBlockEntityEdgePoint { .getLevel(getBlockEntityDimension()); } - IItemHandlerModifiable carriageInventory = carriage.storage.getItems(); + IItemHandlerModifiable carriageInventory = carriage.storage.getAllItems(); if (carriageInventory == null) continue; @@ -215,7 +215,7 @@ public class GlobalStation extends SingleBlockEntityEdgePoint { carriageInventory.setStackInSlot(slot, ItemStack.EMPTY); if (box != null) box.spawnParticles(); - + break; } } diff --git a/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java b/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java index a9035726d1..cd9ff9d25a 100644 --- a/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java +++ b/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java @@ -20,6 +20,8 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.AllTags.AllBlockTags; import com.simibubi.create.AllTags.AllItemTags; import com.simibubi.create.Create; +import com.simibubi.create.api.contraption.storage.MountedStorageTypeRegistry; +import com.simibubi.create.api.contraption.storage.item.MountedItemStorageType; import com.simibubi.create.content.contraptions.behaviour.DoorMovingInteraction; import com.simibubi.create.content.contraptions.behaviour.TrapdoorMovingInteraction; import com.simibubi.create.content.contraptions.piston.MechanicalPistonGenerator; @@ -91,6 +93,7 @@ import net.minecraft.world.level.storage.loot.providers.number.ConstantValue; import net.minecraftforge.client.model.generators.ConfiguredModel; import net.minecraftforge.client.model.generators.ModelFile; import net.minecraftforge.common.Tags; +import net.minecraftforge.registries.RegistryObject; public class BuilderTransformers { @@ -550,4 +553,11 @@ public class BuilderTransformers { .simpleItem(); } + public static NonNullUnaryOperator> mountedItemStorage(RegistryObject> type) { + return builder -> builder.onRegisterAfter( + MountedStorageTypeRegistry.ITEMS, + block -> MountedStorageTypeRegistry.ITEMS_BY_BLOCK.register(block, type.get()) + ); + } + } diff --git a/src/main/java/com/simibubi/create/foundation/item/ItemHelper.java b/src/main/java/com/simibubi/create/foundation/item/ItemHelper.java index ffdd7895ca..113e4d82ec 100644 --- a/src/main/java/com/simibubi/create/foundation/item/ItemHelper.java +++ b/src/main/java/com/simibubi/create/foundation/item/ItemHelper.java @@ -7,6 +7,8 @@ import java.util.function.Predicate; import javax.annotation.Nullable; +import net.minecraftforge.items.IItemHandlerModifiable; + import org.apache.commons.lang3.mutable.MutableInt; import com.simibubi.create.content.logistics.box.PackageEntity; @@ -29,7 +31,7 @@ public class ItemHelper { public static boolean sameItem(ItemStack stack, ItemStack otherStack) { return !otherStack.isEmpty() && stack.is(otherStack.getItem()); } - + public static Predicate sameItemPredicate(ItemStack stack) { return s -> sameItem(stack, s); } @@ -287,7 +289,7 @@ public class ItemHelper { } return -1; } - + public static ItemStack fromItemEntity(Entity entityIn) { if (!entityIn.isAlive()) return ItemStack.EMPTY; @@ -308,5 +310,14 @@ public class ItemHelper { stack.setCount(max); return remainder; } - + + public static void copyContents(IItemHandler from, IItemHandlerModifiable to) { + if (from.getSlots() != to.getSlots()) { + throw new IllegalArgumentException("Slot count mismatch"); + } + + for (int i = 0; i < from.getSlots(); i++) { + to.setStackInSlot(i, from.getStackInSlot(i).copy()); + } + } } diff --git a/src/main/java/com/simibubi/create/foundation/item/ItemSlots.java b/src/main/java/com/simibubi/create/foundation/item/ItemSlots.java new file mode 100644 index 0000000000..7eddebab54 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/item/ItemSlots.java @@ -0,0 +1,113 @@ +package com.simibubi.create.foundation.item; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.IntFunction; + +import com.mojang.serialization.Codec; + +import com.mojang.serialization.DataResult; + +import com.mojang.serialization.codecs.RecordCodecBuilder; +import com.simibubi.create.foundation.utility.CreateCodecs; + +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.IItemHandlerModifiable; +import net.minecraft.util.ExtraCodecs; +import net.minecraft.world.item.ItemStack; + +public class ItemSlots { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + Codec.unboundedMap(CreateCodecs.boundedIntStr(0), ItemStack.CODEC).fieldOf("items").forGetter(ItemSlots::toBoxedMap), + ExtraCodecs.NON_NEGATIVE_INT.fieldOf("size").forGetter(ItemSlots::getSize) + ).apply(instance, ItemSlots::deserialize)); + + private final Int2ObjectMap map; + private int size; + + public ItemSlots() { + this.map = new Int2ObjectOpenHashMap<>(); + this.size = 0; + } + + public void set(int slot, ItemStack stack) { + if (slot < 0) { + throw new IllegalArgumentException("Slot must be positive"); + } else if (!stack.isEmpty()) { + this.map.put(slot, stack); + this.size = Math.max(this.size, slot + 1); + } + } + + public int getSize() { + return this.size; + } + + public void setSize(int size) { + if (size <= this.getHighestSlot()) { + throw new IllegalStateException("cannot set size to below the highest slot"); + } + this.size = size; + } + + public void forEach(SlotConsumer consumer) { + for (Int2ObjectMap.Entry entry : this.map.int2ObjectEntrySet()) { + consumer.accept(entry.getIntKey(), entry.getValue()); + } + } + + private int getHighestSlot() { + return this.map.keySet().intStream().max().orElse(-1); + } + + public T toHandler(IntFunction factory) { + T handler = factory.apply(this.size); + this.forEach(handler::setStackInSlot); + return handler; + } + + public static ItemSlots fromHandler(IItemHandler handler) { + ItemSlots slots = new ItemSlots(); + slots.setSize(handler.getSlots()); + for (int i = 0; i < handler.getSlots(); i++) { + ItemStack stack = handler.getStackInSlot(i); + if (!stack.isEmpty()) { + slots.set(i, stack.copy()); + } + } + return slots; + } + + public Map toBoxedMap() { + Map map = new HashMap<>(); + this.forEach(map::put); + return map; + } + + public static ItemSlots fromBoxedMap(Map map) { + ItemSlots slots = new ItemSlots(); + map.forEach(slots::set); + return slots; + } + + public static Codec maxSizeCodec(int maxSize) { + return ExtraCodecs.validate( + CODEC, + slots -> slots.size <= maxSize + ? DataResult.success(slots) + : DataResult.error(() -> "Slots above maximum of " + maxSize) + ); + } + + private static ItemSlots deserialize(Map map, int size) { + ItemSlots slots = fromBoxedMap(map); + slots.setSize(size); + return slots; + } + + public interface SlotConsumer { + void accept(int slot, ItemStack stack); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/utility/CreateCodecs.java b/src/main/java/com/simibubi/create/foundation/utility/CreateCodecs.java new file mode 100644 index 0000000000..b5e0df0e62 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/CreateCodecs.java @@ -0,0 +1,34 @@ +package com.simibubi.create.foundation.utility; + +import com.mojang.serialization.Codec; + +import com.mojang.serialization.DataResult; + +import com.simibubi.create.foundation.item.ItemSlots; + +import net.minecraftforge.items.ItemStackHandler; +import net.minecraft.util.ExtraCodecs; + +public class CreateCodecs { + public static final Codec INT_STR = Codec.STRING.comapFlatMap( + string -> { + try { + return DataResult.success(Integer.parseInt(string)); + } catch (NumberFormatException ignored) { + return DataResult.error(() -> "Not an integer: " + string); + } + }, + String::valueOf + ); + + public static final Codec ITEM_STACK_HANDLER = ItemSlots.CODEC.xmap( + slots -> slots.toHandler(ItemStackHandler::new), ItemSlots::fromHandler + ); + + public static Codec boundedIntStr(int min) { + return ExtraCodecs.validate( + INT_STR, + i -> i >= min ? DataResult.success(i) : DataResult.error(() -> "Value under minimum of " + min) + ); + } +} diff --git a/src/main/java/com/simibubi/create/impl/contraption/storage/FallbackMountedStorageType.java b/src/main/java/com/simibubi/create/impl/contraption/storage/FallbackMountedStorageType.java new file mode 100644 index 0000000000..f5fd8ded49 --- /dev/null +++ b/src/main/java/com/simibubi/create/impl/contraption/storage/FallbackMountedStorageType.java @@ -0,0 +1,34 @@ +package com.simibubi.create.impl.contraption.storage; + +import java.util.Optional; + +import com.mojang.serialization.Codec; +import com.simibubi.create.AllMountedStorageTypes; +import com.simibubi.create.api.contraption.storage.item.simple.SimpleMountedStorage; +import com.simibubi.create.api.contraption.storage.item.simple.SimpleMountedStorageType; + +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.IItemHandlerModifiable; +import net.minecraftforge.items.ItemStackHandler; + +/** + * A fallback mounted storage impl that will try to be used when no type is + * registered for a block. This requires that the mounted block provide an item handler + * whose class is exactly {@link ItemStackHandler}. + */ +public class FallbackMountedStorageType extends SimpleMountedStorageType { + public static final Codec CODEC = SimpleMountedStorage.codec( + handler -> new SimpleMountedStorage(AllMountedStorageTypes.FALLBACK.get(), handler) + ); + + public FallbackMountedStorageType() { + super(CODEC); + } + + @Override + public Optional validate(IItemHandler handler) { + return handler.getClass() == ItemStackHandler.class + ? Optional.of((ItemStackHandler) handler) + : Optional.empty(); + } +} diff --git a/src/main/java/com/simibubi/create/impl/contraption/storage/MountedStorageTypeRegistryImpl.java b/src/main/java/com/simibubi/create/impl/contraption/storage/MountedStorageTypeRegistryImpl.java new file mode 100644 index 0000000000..af0091fbc0 --- /dev/null +++ b/src/main/java/com/simibubi/create/impl/contraption/storage/MountedStorageTypeRegistryImpl.java @@ -0,0 +1,49 @@ +package com.simibubi.create.impl.contraption.storage; + +import java.util.Objects; + +import com.simibubi.create.AllMountedStorageTypes; +import com.simibubi.create.api.contraption.storage.MountedStorageTypeRegistry; +import com.simibubi.create.api.contraption.storage.item.MountedItemStorageType; + +import net.minecraftforge.eventbus.api.EventPriority; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.registries.IForgeRegistry; +import net.minecraftforge.registries.NewRegistryEvent; +import net.minecraftforge.registries.RegisterEvent; +import net.minecraftforge.registries.RegistryBuilder; +import net.minecraft.world.level.block.Blocks; + +@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) +public class MountedStorageTypeRegistryImpl { + private static IForgeRegistry> itemsRegistry; + + public static IForgeRegistry> getItemsRegistry() { + return Objects.requireNonNull(itemsRegistry, "Registry accessed too early"); + } + + @SubscribeEvent + public static void registerRegistries(NewRegistryEvent event) { + event.create( + new RegistryBuilder>() + .setName(MountedStorageTypeRegistry.ITEMS.location()), + registry -> itemsRegistry = registry + ); + } + + // low priority: want to run after the registration actually happens + @SubscribeEvent(priority = EventPriority.LOW) + public static void registerDefaults(RegisterEvent event) { + if (event.getRegistryKey() != MountedStorageTypeRegistry.ITEMS) + return; + + System.out.println("aaaaaaaaa"); + for (Object o : event.getForgeRegistry()) { + System.out.println(o); + } + + MountedStorageTypeRegistry.ITEMS_BY_BLOCK.register(Blocks.DISPENSER, AllMountedStorageTypes.DISPENSER.get()); + MountedStorageTypeRegistry.ITEMS_BY_BLOCK.register(Blocks.DROPPER, AllMountedStorageTypes.DISPENSER.get()); + } +} diff --git a/src/main/java/com/simibubi/create/infrastructure/data/CreateRegistrateTags.java b/src/main/java/com/simibubi/create/infrastructure/data/CreateRegistrateTags.java index 986309bb66..95caf20c4e 100644 --- a/src/main/java/com/simibubi/create/infrastructure/data/CreateRegistrateTags.java +++ b/src/main/java/com/simibubi/create/infrastructure/data/CreateRegistrateTags.java @@ -108,6 +108,16 @@ public class CreateRegistrateTags { .addTag(BlockTags.PRESSURE_PLATES) .addTag(BlockTags.RAILS); + // tags aren't used here because the implementations of modded entries are unknown + prov.tag(AllBlockTags.SIMPLE_MOUNTED_STORAGE.tag).add( + Blocks.CHEST, Blocks.TRAPPED_CHEST, Blocks.BARREL, + Blocks.SHULKER_BOX, + Blocks.WHITE_SHULKER_BOX, Blocks.ORANGE_SHULKER_BOX, Blocks.MAGENTA_SHULKER_BOX, Blocks.LIGHT_BLUE_SHULKER_BOX, + Blocks.YELLOW_SHULKER_BOX, Blocks.LIME_SHULKER_BOX, Blocks.PINK_SHULKER_BOX, Blocks.GRAY_SHULKER_BOX, + Blocks.LIGHT_GRAY_SHULKER_BOX, Blocks.CYAN_SHULKER_BOX, Blocks.PURPLE_SHULKER_BOX, Blocks.BLUE_SHULKER_BOX, + Blocks.BROWN_SHULKER_BOX, Blocks.GREEN_SHULKER_BOX, Blocks.RED_SHULKER_BOX, Blocks.BLACK_SHULKER_BOX + ); + prov.tag(AllBlockTags.ROOTS.tag) .add(Blocks.MANGROVE_ROOTS); From d669aa429db1e0ba70b7bc2bfeb861ec6ada3035 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 3 Jan 2025 17:55:39 +0100 Subject: [PATCH 232/515] Scrolling past - Adjusted redstone link recipe to andesite tier - Updated boiler gauge asset - Updated rope and hose pulley assets/rendering - Fixed manual table cloth placement being reversed - Fixed factory gauge screen button positions --- .../82992cbf8f2794d83ac94034835eac0acd7915b9 | 6 +- .../crafting/logistics/redstone_link.json | 2 +- .../crafting/logistics/redstone_link.json | 4 +- .../java/com/simibubi/create/AllBlocks.java | 3 + .../com/simibubi/create/AllPartialModels.java | 2 +- .../java/com/simibubi/create/AllShapes.java | 12 +- .../com/simibubi/create/AllSpriteShifts.java | 4 +- .../elevator/ElevatorPulleyRenderer.java | 10 +- .../pulley/AbstractPulleyRenderer.java | 22 +- .../pulley/AbstractPulleyVisual.java | 26 +- .../contraptions/pulley/HosePulleyVisual.java | 15 +- .../contraptions/pulley/PulleyBlock.java | 5 - .../contraptions/pulley/PulleyRenderer.java | 7 + .../contraptions/pulley/RopePulleyVisual.java | 15 +- .../hosePulley/HosePulleyBlockEntity.java | 2 +- .../fluids/hosePulley/HosePulleyRenderer.java | 7 + .../fluids/tank/FluidTankRenderer.java | 14 +- .../factoryBoard/FactoryPanelScreen.java | 4 +- .../attribute/AllItemAttributeTypes.java | 17 +- .../tableCloth/TableClothBlockEntity.java | 2 +- .../data/recipe/StandardRecipeGen.java | 6 +- .../block/chain_conveyor/conveyor_casing.obj | 244 ++++----- .../models/block/hose_pulley/block.json | 274 +++------- .../models/block/hose_pulley/hose_coil.json | 37 ++ .../create/models/block/hose_pulley/item.json | 407 ++++---------- .../block/hose_pulley/pulley_magnet.json | 110 ++-- .../create/models/block/hose_pulley/rope.json | 25 +- .../models/block/hose_pulley/rope_coil.json | 52 -- .../models/block/hose_pulley/rope_half.json | 25 +- .../block/hose_pulley/rope_half_magnet.json | 110 ++-- .../models/block/rope_pulley/block.json | 288 +++++----- .../create/models/block/rope_pulley/item.json | 501 +++++++----------- .../block/rope_pulley/pulley_magnet.json | 34 +- .../models/block/rope_pulley/rope_coil.json | 60 +-- .../block/rope_pulley/rope_half_magnet.json | 28 +- .../models/block/steam_engine/gauge.json | 41 +- .../models/block/steam_engine/gauge_dial.json | 18 +- .../create/textures/block/boiler_gauge.png | Bin 255 -> 1121 bytes .../assets/create/textures/block/hose.png | Bin 0 -> 563 bytes .../create/textures/block/hose_pulley.png | Bin 0 -> 1268 bytes .../textures/block/hose_pulley_coil.png | Bin 0 -> 413 bytes .../block/hose_pulley_coil_scroll.png | Bin 0 -> 483 bytes .../textures/block/hose_pulley_magnet.png | Bin 272 -> 0 bytes .../textures/block/hose_pulley_rope.png | Bin 121 -> 0 bytes .../create/textures/block/pulley_casing.png | Bin 246 -> 0 bytes .../create/textures/block/pulley_magnet.png | Bin 331 -> 563 bytes .../create/textures/block/pulley_top.png | Bin 277 -> 0 bytes .../create/textures/block/rope_pulley.png | Bin 0 -> 968 bytes .../textures/block/rope_pulley_coil.png | Bin 0 -> 433 bytes .../block/rope_pulley_coil_scroll.png | Bin 0 -> 435 bytes 50 files changed, 969 insertions(+), 1470 deletions(-) create mode 100644 src/main/resources/assets/create/models/block/hose_pulley/hose_coil.json delete mode 100644 src/main/resources/assets/create/models/block/hose_pulley/rope_coil.json create mode 100644 src/main/resources/assets/create/textures/block/hose.png create mode 100644 src/main/resources/assets/create/textures/block/hose_pulley.png create mode 100644 src/main/resources/assets/create/textures/block/hose_pulley_coil.png create mode 100644 src/main/resources/assets/create/textures/block/hose_pulley_coil_scroll.png delete mode 100644 src/main/resources/assets/create/textures/block/hose_pulley_magnet.png delete mode 100644 src/main/resources/assets/create/textures/block/hose_pulley_rope.png delete mode 100644 src/main/resources/assets/create/textures/block/pulley_casing.png delete mode 100644 src/main/resources/assets/create/textures/block/pulley_top.png create mode 100644 src/main/resources/assets/create/textures/block/rope_pulley.png create mode 100644 src/main/resources/assets/create/textures/block/rope_pulley_coil.png create mode 100644 src/main/resources/assets/create/textures/block/rope_pulley_coil_scroll.png diff --git a/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 b/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 index 56f573e7d0..53fd58adc9 100644 --- a/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 +++ b/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 @@ -1,4 +1,4 @@ -// 1.20.1 2024-12-27T18:05:56.832873 Create's Standard Recipes +// 1.20.1 2025-01-03T17:19:12.8387789 Create's Standard Recipes a8cc4af26f6c7c45a9eef12e92af1452fe042454 data/create/advancements/recipes/combat/crafting/appliances/netherite_backtank.json 2c2639c7b307ee7c7a4e97e5efebf496788998ad data/create/advancements/recipes/combat/crafting/appliances/netherite_backtank_from_netherite.json 81dcf0cb1aa99e39bc7d1a386e07cad4cee7d8b9 data/create/advancements/recipes/combat/crafting/appliances/netherite_diving_boots.json @@ -194,7 +194,7 @@ c443707391ce79dc1ec8cfacee74757b0c00bd3e data/create/advancements/recipes/misc/c 77c3df89a06fc10cd8bd1cc35f0353441860ec11 data/create/advancements/recipes/misc/crafting/logistics/pulse_repeater.json 95484003dc94bb919402f72115cdbae9a4eedfb9 data/create/advancements/recipes/misc/crafting/logistics/pulse_timer.json 96b4998626e624fb79c79fb754c28b21ddc27254 data/create/advancements/recipes/misc/crafting/logistics/redstone_contact.json -1b50ed47c37e48d1112c76059574eed71ecea4e5 data/create/advancements/recipes/misc/crafting/logistics/redstone_link.json +e210638d1b198f1ce1379c88fc2f15e0c974bd09 data/create/advancements/recipes/misc/crafting/logistics/redstone_link.json 8ed69a5a2fcbc6e1cb2de901017ebd3fc3fb3dc3 data/create/advancements/recipes/misc/crafting/logistics/redstone_requester.json cea78bc9b093a8a6a85ef1df53ddf11d9c37a114 data/create/advancements/recipes/misc/crafting/logistics/redstone_requester_clear.json 8ec1937280c6d6ba8b79de8652f3b1c588f4b4e2 data/create/advancements/recipes/misc/crafting/logistics/repackager_from_conversion.json @@ -472,7 +472,7 @@ aa8a704ad643ff5f06db34f4047f7f740a556236 data/create/recipes/crafting/logistics/ 8b0b342baa18cc47c7a60a3c9812fece28210cf6 data/create/recipes/crafting/logistics/pulse_repeater.json ade2e66f03bab8843e2dff82b0f04ca92fff956e data/create/recipes/crafting/logistics/pulse_timer.json c81f852f1d1514184ff235e790a6ca907f7b6ad4 data/create/recipes/crafting/logistics/redstone_contact.json -00877e6b56f28d8691080ef18b654f0a141835ce data/create/recipes/crafting/logistics/redstone_link.json +ae3ce2ea0f938b65c875b5c227adc0cb93b8adde data/create/recipes/crafting/logistics/redstone_link.json 06670fd44389b2b1755c80d02898a68c7c490620 data/create/recipes/crafting/logistics/redstone_requester.json 8446b3ca07575ea978ddde4121900207d54be8b3 data/create/recipes/crafting/logistics/redstone_requester_clear.json e156e092a9c719e91cd62e23f8ee2201dce4c2a8 data/create/recipes/crafting/logistics/repackager_from_conversion.json diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/redstone_link.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/redstone_link.json index 54b59c1b72..c58b11b6a0 100644 --- a/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/redstone_link.json +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/logistics/redstone_link.json @@ -6,7 +6,7 @@ "items": [ { "items": [ - "create:brass_casing" + "create:andesite_casing" ] } ] diff --git a/src/generated/resources/data/create/recipes/crafting/logistics/redstone_link.json b/src/generated/resources/data/create/recipes/crafting/logistics/redstone_link.json index 6ec28f426c..b952b1dcd3 100644 --- a/src/generated/resources/data/create/recipes/crafting/logistics/redstone_link.json +++ b/src/generated/resources/data/create/recipes/crafting/logistics/redstone_link.json @@ -3,10 +3,10 @@ "category": "misc", "key": { "C": { - "item": "minecraft:redstone_torch" + "item": "create:transmitter" }, "S": { - "item": "create:brass_casing" + "item": "create:andesite_casing" } }, "pattern": [ diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 5d8690d1ae..d4babea0ca 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -1018,6 +1018,7 @@ public class AllBlocks { public static final BlockEntry HOSE_PULLEY = REGISTRATE.block("hose_pulley", HosePulleyBlock::new) .initialProperties(SharedProperties::copperMetal) .properties(BlockBehaviour.Properties::noOcclusion) + .addLayer(() -> RenderType::cutoutMipped) .transform(pickaxeOnly()) .blockstate(BlockStateGen.horizontalBlockProvider(true)) .transform(BlockStressDefaults.setImpact(4.0)) @@ -1203,6 +1204,8 @@ public class AllBlocks { public static final BlockEntry ROPE_PULLEY = REGISTRATE.block("rope_pulley", PulleyBlock::new) .initialProperties(SharedProperties::stone) .properties(p -> p.mapColor(MapColor.PODZOL)) + .properties(p -> p.noOcclusion()) + .addLayer(() -> RenderType::cutoutMipped) .transform(axeOrPickaxe()) .tag(AllBlockTags.SAFE_NBT.tag) .blockstate(BlockStateGen.horizontalAxisBlockProvider(true)) diff --git a/src/main/java/com/simibubi/create/AllPartialModels.java b/src/main/java/com/simibubi/create/AllPartialModels.java index 69aee39aa2..553a6ec264 100644 --- a/src/main/java/com/simibubi/create/AllPartialModels.java +++ b/src/main/java/com/simibubi/create/AllPartialModels.java @@ -72,7 +72,7 @@ public class AllPartialModels { ROPE_COIL = block("rope_pulley/rope_coil"), ROPE_HALF = block("rope_pulley/rope_half"), ROPE_HALF_MAGNET = block("rope_pulley/rope_half_magnet"), - HOSE_COIL = block("hose_pulley/rope_coil"), HOSE = block("hose_pulley/rope"), + HOSE_COIL = block("hose_pulley/hose_coil"), HOSE = block("hose_pulley/rope"), HOSE_MAGNET = block("hose_pulley/pulley_magnet"), HOSE_HALF = block("hose_pulley/rope_half"), HOSE_HALF_MAGNET = block("hose_pulley/rope_half_magnet"), diff --git a/src/main/java/com/simibubi/create/AllShapes.java b/src/main/java/com/simibubi/create/AllShapes.java index 26cd6db24c..9f7ebdca61 100644 --- a/src/main/java/com/simibubi/create/AllShapes.java +++ b/src/main/java/com/simibubi/create/AllShapes.java @@ -39,10 +39,6 @@ public class AllShapes { FURNACE_ENGINE = shape(1, 1, 0, 15, 15, 16).add(0, 0, 9, 16, 16, 14) .forHorizontal(SOUTH), PORTABLE_STORAGE_INTERFACE = shape(0, 0, 0, 16, 14, 16).forDirectional(), - PULLEY = shape(0, 0, 0, 16, 16, 2).add(1, 1, 2, 15, 15, 14) - .add(2, 13, 2, 14, 16, 14) - .add(0, 0, 14, 16, 16, 16) - .forHorizontalAxis(), ELEVATOR_PULLEY = shape(0, 0, 0, 16, 16, 2).add(0, 0, 14, 16, 16, 16) .add(2, 0, 2, 14, 14, 14) .forHorizontal(EAST), @@ -130,14 +126,14 @@ public class AllShapes { STEP_BOTTOM = shape(0, 0, 8, 16, 8, 16).forHorizontal(SOUTH), STEP_TOP = shape(0, 8, 8, 16, 16, 16).forHorizontal(SOUTH), - CONTROLS = shape(0, 0, 6, 16, 16, 16).add(0, 0, 0, 16, 2, 16) + CONTROLS = shape(0, 0, 6, 16, 16, 16).add(0, 0, 4, 16, 2, 16) .forHorizontal(NORTH), CONTROLS_COLLISION = shape(0, 0, 6, 16, 16, 16).forHorizontal(NORTH), CONTRAPTION_CONTROLS = shape(0, 0, 6, 2, 16, 16).add(14, 0, 6, 16, 16, 16) .add(0, 0, 14, 16, 16, 16) - .add(0, 0, 7, 16, 12, 16) - .add(0, 0, 0, 16, 2, 16) + .add(0, 0, 6, 16, 12, 16) + .add(0, 0, 4, 16, 2, 16) .forHorizontal(NORTH), CONTRAPTION_CONTROLS_COLLISION = shape(0, 0, 6, 2, 16, 16).add(14, 0, 6, 16, 16, 16) .add(0, 0, 14, 16, 16, 16) @@ -278,7 +274,7 @@ public class AllShapes { BELT_COLLISION_MASK = cuboid(0, 0, 0, 16, 19, 16), SCHEMATICANNON_SHAPE = shape(1, 0, 1, 15, 8, 15).add(0.5, 8, 0.5, 15.5, 11, 15.5) .build(), - PULLEY_MAGNET = shape(3, 0, 3, 13, 3, 13).add(FOUR_VOXEL_POLE.get(UP)) + PULLEY_MAGNET = shape(3, -3, 3, 13, 2, 13).add(FOUR_VOXEL_POLE.get(UP)) .build(), SPOUT = shape(1, 2, 1, 15, 14, 15).add(2, 0, 2, 14, 16, 14) .build(), diff --git a/src/main/java/com/simibubi/create/AllSpriteShifts.java b/src/main/java/com/simibubi/create/AllSpriteShifts.java index 9434ad0a06..aee39f3afd 100644 --- a/src/main/java/com/simibubi/create/AllSpriteShifts.java +++ b/src/main/java/com/simibubi/create/AllSpriteShifts.java @@ -77,7 +77,9 @@ public class AllSpriteShifts { public static final SpriteShiftEntry ELEVATOR_BELT = get("block/elevator_pulley_belt", "block/elevator_pulley_belt_scroll"), - ELEVATOR_COIL = get("block/elevator_pulley_coil", "block/elevator_pulley_coil_scroll"); + ROPE_PULLEY_COIL = get("block/rope_pulley_coil", "block/rope_pulley_coil_scroll"), + ELEVATOR_COIL = get("block/elevator_pulley_coil", "block/elevator_pulley_coil_scroll"), + HOSE_PULLEY_COIL = get("block/hose_pulley_coil", "block/hose_pulley_coil_scroll"); public static final SpriteShiftEntry FACTORY_PANEL_CONNECTIONS = get("block/factory_panel_connections", "block/factory_panel_connections_animated"); diff --git a/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorPulleyRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorPulleyRenderer.java index c985a5efeb..302e17aeac 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorPulleyRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorPulleyRenderer.java @@ -57,18 +57,16 @@ public class ElevatorPulleyRenderer extends KineticBlockEntityRenderer exten float offset = getOffset(be, partialTicks); boolean running = isRunning(be); - Axis rotationAxis = ((IRotate) be.getBlockState() - .getBlock()).getRotationAxis(be.getBlockState()); VertexConsumer vb = buffer.getBuffer(RenderType.solid()); - kineticRotationTransform(getRotatedCoil(be), be, rotationAxis, AngleHelper.rad(offset * 180), light) + scrollCoil(getRotatedCoil(be), getCoilShift(), offset, 1) + .light(light) .renderInto(ms, vb); Level world = be.getLevel(); @@ -92,6 +90,8 @@ public abstract class AbstractPulleyRenderer exten protected abstract Axis getShaftAxis(T be); protected abstract PartialModel getCoil(); + + protected abstract SpriteShiftEntry getCoilShift(); protected abstract SuperByteBuffer renderRope(T be); @@ -112,6 +112,18 @@ public abstract class AbstractPulleyRenderer exten Direction.get(AxisDirection.POSITIVE, getShaftAxis(be))); } + public static SuperByteBuffer scrollCoil(SuperByteBuffer sbb, SpriteShiftEntry coilShift, float offset, float speedModifier) { + if (offset == 0) + return sbb; + float spriteSize = coilShift.getTarget() + .getV1() + - coilShift.getTarget() + .getV0(); + offset *= speedModifier / 2; + double coilScroll = -(offset + 3 / 16f) - Math.floor((offset + 3 / 16f) * -2) / 2; + return sbb.shiftUVScrolling(coilShift, (float) coilScroll * spriteSize); + } + @Override public int getViewDistance() { return 256; diff --git a/src/main/java/com/simibubi/create/content/contraptions/pulley/AbstractPulleyVisual.java b/src/main/java/com/simibubi/create/content/contraptions/pulley/AbstractPulleyVisual.java index 766273a74e..28855da304 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/pulley/AbstractPulleyVisual.java +++ b/src/main/java/com/simibubi/create/content/contraptions/pulley/AbstractPulleyVisual.java @@ -2,15 +2,19 @@ package com.simibubi.create.content.contraptions.pulley; import java.util.function.Consumer; +import org.joml.Quaternionf; +import org.joml.Quaternionfc; + import com.mojang.math.Axis; +import com.simibubi.create.AllSpriteShifts; import com.simibubi.create.content.kinetics.base.KineticBlockEntity; import com.simibubi.create.content.kinetics.base.ShaftVisual; +import com.simibubi.create.content.processing.burner.ScrollInstance; import dev.engine_room.flywheel.api.instance.Instance; import dev.engine_room.flywheel.api.instance.Instancer; import dev.engine_room.flywheel.api.visual.DynamicVisual; import dev.engine_room.flywheel.api.visualization.VisualizationContext; -import dev.engine_room.flywheel.lib.instance.OrientedInstance; import dev.engine_room.flywheel.lib.instance.TransformedInstance; import dev.engine_room.flywheel.lib.math.MoreMath; import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; @@ -19,6 +23,8 @@ import it.unimi.dsi.fastutil.bytes.ByteArrayList; import it.unimi.dsi.fastutil.bytes.ByteList; import it.unimi.dsi.fastutil.longs.LongOpenHashSet; import it.unimi.dsi.fastutil.longs.LongSet; +import net.createmod.catnip.render.SpriteShiftEntry; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.renderer.LightTexture; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -27,7 +33,7 @@ import net.minecraft.util.Mth; import net.minecraft.world.level.LightLayer; public abstract class AbstractPulleyVisual extends ShaftVisual implements SimpleDynamicVisual { - private final OrientedInstance coil; + private final ScrollInstance coil; private final TransformedInstance magnet; private final SmartRecycler rope; @@ -44,8 +50,14 @@ public abstract class AbstractPulleyVisual extends rotatingAbout = Direction.get(Direction.AxisDirection.POSITIVE, rotationAxis()); rotationAxis = Axis.of(rotatingAbout.step()); + float blockStateAngle = AngleHelper.horizontalAngle(rotatingAbout); + Quaternionfc rotation = new Quaternionf().rotationY(Mth.DEG_TO_RAD * blockStateAngle); + coil = getCoilModel().createInstance() - .position(getVisualPosition()); + .rotation(rotation) + .position(getVisualPosition()) + .setSpriteShift(getCoilAnimation()); + coil.setChanged(); magnet = magnetInstancer().createInstance(); @@ -69,13 +81,15 @@ public abstract class AbstractPulleyVisual extends protected abstract Instancer getHalfMagnetModel(); - protected abstract Instancer getCoilModel(); + protected abstract Instancer getCoilModel(); protected abstract Instancer getHalfRopeModel(); protected abstract float getOffset(float pt); protected abstract boolean isRunning(); + + protected abstract SpriteShiftEntry getCoilAnimation(); private Instancer magnetInstancer() { return offset > .25f ? getMagnetModel() : getHalfMagnetModel(); @@ -88,8 +102,8 @@ public abstract class AbstractPulleyVisual extends } private void animate() { - coil.rotation(rotationAxis.rotationDegrees(offset * 180)) - .setChanged(); + coil.offsetV = -offset; + coil.setChanged(); magnet.setVisible(isRunning() || offset == 0); diff --git a/src/main/java/com/simibubi/create/content/contraptions/pulley/HosePulleyVisual.java b/src/main/java/com/simibubi/create/content/contraptions/pulley/HosePulleyVisual.java index 417541ca99..b2447ab03c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/pulley/HosePulleyVisual.java +++ b/src/main/java/com/simibubi/create/content/contraptions/pulley/HosePulleyVisual.java @@ -1,14 +1,17 @@ package com.simibubi.create.content.contraptions.pulley; import com.simibubi.create.AllPartialModels; +import com.simibubi.create.AllSpriteShifts; import com.simibubi.create.content.fluids.hosePulley.HosePulleyBlockEntity; +import com.simibubi.create.content.processing.burner.ScrollInstance; +import com.simibubi.create.foundation.render.AllInstanceTypes; import dev.engine_room.flywheel.api.instance.Instancer; import dev.engine_room.flywheel.api.visualization.VisualizationContext; import dev.engine_room.flywheel.lib.instance.InstanceTypes; -import dev.engine_room.flywheel.lib.instance.OrientedInstance; import dev.engine_room.flywheel.lib.instance.TransformedInstance; import dev.engine_room.flywheel.lib.model.Models; +import net.createmod.catnip.render.SpriteShiftEntry; public class HosePulleyVisual extends AbstractPulleyVisual { public HosePulleyVisual(VisualizationContext dispatcher, HosePulleyBlockEntity blockEntity, float partialTick) { @@ -31,8 +34,8 @@ public class HosePulleyVisual extends AbstractPulleyVisual getCoilModel() { - return instancerProvider().instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.HOSE_COIL, rotatingAbout)); + protected Instancer getCoilModel() { + return instancerProvider().instancer(AllInstanceTypes.SCROLLING, Models.partial(AllPartialModels.HOSE_COIL)); } @Override @@ -49,4 +52,10 @@ public class HosePulleyVisual extends AbstractPulleyVisual getBlockEntityClass() { return PulleyBlockEntity.class; diff --git a/src/main/java/com/simibubi/create/content/contraptions/pulley/PulleyRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/pulley/PulleyRenderer.java index 6f225fcbad..4f7ca4b89a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/pulley/PulleyRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/pulley/PulleyRenderer.java @@ -2,10 +2,12 @@ package com.simibubi.create.content.contraptions.pulley; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllPartialModels; +import com.simibubi.create.AllSpriteShifts; import com.simibubi.create.content.contraptions.AbstractContraptionEntity; import dev.engine_room.flywheel.lib.model.baked.PartialModel; import net.createmod.catnip.render.CachedBuffers; +import net.createmod.catnip.render.SpriteShiftEntry; import net.createmod.catnip.render.SuperByteBuffer; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.minecraft.core.Direction.Axis; @@ -52,6 +54,11 @@ public class PulleyRenderer extends AbstractPulleyRenderer { return be.running || be.mirrorParent != null || be.isVirtual(); } + @Override + protected SpriteShiftEntry getCoilShift() { + return AllSpriteShifts.ROPE_PULLEY_COIL; + } + public static float getBlockEntityOffset(float partialTicks, PulleyBlockEntity blockEntity) { float offset = blockEntity.getInterpolatedOffset(partialTicks); diff --git a/src/main/java/com/simibubi/create/content/contraptions/pulley/RopePulleyVisual.java b/src/main/java/com/simibubi/create/content/contraptions/pulley/RopePulleyVisual.java index fca35feccd..f877d1c652 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/pulley/RopePulleyVisual.java +++ b/src/main/java/com/simibubi/create/content/contraptions/pulley/RopePulleyVisual.java @@ -3,13 +3,16 @@ package com.simibubi.create.content.contraptions.pulley; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllPartialModels; +import com.simibubi.create.AllSpriteShifts; +import com.simibubi.create.content.processing.burner.ScrollInstance; +import com.simibubi.create.foundation.render.AllInstanceTypes; import dev.engine_room.flywheel.api.instance.Instancer; import dev.engine_room.flywheel.api.visualization.VisualizationContext; import dev.engine_room.flywheel.lib.instance.InstanceTypes; -import dev.engine_room.flywheel.lib.instance.OrientedInstance; import dev.engine_room.flywheel.lib.instance.TransformedInstance; import dev.engine_room.flywheel.lib.model.Models; +import net.createmod.catnip.render.SpriteShiftEntry; import net.createmod.catnip.render.VirtualRenderHelper; public class RopePulleyVisual extends AbstractPulleyVisual { @@ -33,8 +36,8 @@ public class RopePulleyVisual extends AbstractPulleyVisual { } @Override - protected Instancer getCoilModel() { - return instancerProvider().instancer(InstanceTypes.ORIENTED, Models.partial(AllPartialModels.ROPE_COIL, rotatingAbout)); + protected Instancer getCoilModel() { + return instancerProvider().instancer(AllInstanceTypes.SCROLLING, Models.partial(AllPartialModels.ROPE_COIL)); } @Override @@ -51,4 +54,10 @@ public class RopePulleyVisual extends AbstractPulleyVisual { protected boolean isRunning() { return PulleyRenderer.isPulleyRunning(blockEntity); } + + @Override + protected SpriteShiftEntry getCoilAnimation() { + return AllSpriteShifts.ROPE_PULLEY_COIL; + } + } diff --git a/src/main/java/com/simibubi/create/content/fluids/hosePulley/HosePulleyBlockEntity.java b/src/main/java/com/simibubi/create/content/fluids/hosePulley/HosePulleyBlockEntity.java index 2870564909..a47ba5f907 100644 --- a/src/main/java/com/simibubi/create/content/fluids/hosePulley/HosePulleyBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/fluids/hosePulley/HosePulleyBlockEntity.java @@ -178,7 +178,7 @@ public class HosePulleyBlockEntity extends KineticBlockEntity { } public float getInterpolatedOffset(float pt) { - return offset.getValue(pt); + return Math.max(offset.getValue(pt), 3 / 16f); } @Override diff --git a/src/main/java/com/simibubi/create/content/fluids/hosePulley/HosePulleyRenderer.java b/src/main/java/com/simibubi/create/content/fluids/hosePulley/HosePulleyRenderer.java index a71f703528..e0fe91c6a5 100644 --- a/src/main/java/com/simibubi/create/content/fluids/hosePulley/HosePulleyRenderer.java +++ b/src/main/java/com/simibubi/create/content/fluids/hosePulley/HosePulleyRenderer.java @@ -1,10 +1,12 @@ package com.simibubi.create.content.fluids.hosePulley; import com.simibubi.create.AllPartialModels; +import com.simibubi.create.AllSpriteShifts; import com.simibubi.create.content.contraptions.pulley.AbstractPulleyRenderer; import dev.engine_room.flywheel.lib.model.baked.PartialModel; import net.createmod.catnip.render.CachedBuffers; +import net.createmod.catnip.render.SpriteShiftEntry; import net.createmod.catnip.render.SuperByteBuffer; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.minecraft.core.Direction.Axis; @@ -42,6 +44,11 @@ public class HosePulleyRenderer extends AbstractPulleyRenderer { FactoryPanelConnectionHandler.startConnection(behaviour); minecraft.setScreen(null); @@ -188,7 +188,7 @@ public class FactoryPanelScreen extends AbstractSimiScreen { activateCraftingButton = null; if (availableCraftingRecipe != null) { - activateCraftingButton = new IconButton(x + 31, y + 43, AllIcons.I_3x3); + activateCraftingButton = new IconButton(x + 31, y + 47, AllIcons.I_3x3); activateCraftingButton.withCallback(() -> { craftingActive = !craftingActive; init(); diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/AllItemAttributeTypes.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/AllItemAttributeTypes.java index af5f8e631d..106ce21d0a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/AllItemAttributeTypes.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/AllItemAttributeTypes.java @@ -4,14 +4,6 @@ import java.util.function.BiPredicate; import java.util.function.Predicate; import java.util.function.Supplier; -import com.simibubi.create.content.logistics.item.filter.attribute.attributes.astralsorcery.AstralSorceryAttunementAttribute; - -import com.simibubi.create.content.logistics.item.filter.attribute.attributes.astralsorcery.AstralSorceryCrystalAttribute; - -import com.simibubi.create.content.logistics.item.filter.attribute.attributes.astralsorcery.AstralSorceryPerkGemAttribute; - -import com.simibubi.create.content.logistics.item.filter.attribute.legacydeserializers.AllItemAttributeLegacyDeserializers; - import org.jetbrains.annotations.ApiStatus; import com.simibubi.create.AllRecipeTypes; @@ -29,12 +21,17 @@ import com.simibubi.create.content.logistics.item.filter.attribute.attributes.In import com.simibubi.create.content.logistics.item.filter.attribute.attributes.ItemNameAttribute; import com.simibubi.create.content.logistics.item.filter.attribute.attributes.ShulkerFillLevelAttribute; import com.simibubi.create.content.logistics.item.filter.attribute.attributes.astralsorcery.AstralSorceryAmuletAttribute; +import com.simibubi.create.content.logistics.item.filter.attribute.attributes.astralsorcery.AstralSorceryAttunementAttribute; +import com.simibubi.create.content.logistics.item.filter.attribute.attributes.astralsorcery.AstralSorceryCrystalAttribute; +import com.simibubi.create.content.logistics.item.filter.attribute.attributes.astralsorcery.AstralSorceryPerkGemAttribute; +import com.simibubi.create.content.logistics.item.filter.attribute.legacydeserializers.AllItemAttributeLegacyDeserializers; +import net.minecraft.world.Container; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.crafting.AbstractCookingRecipe; +import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.level.Level; @@ -90,7 +87,7 @@ public class AllItemAttributeTypes { ASTRAL_CRYSTAL = register("astral_crystal", new AstralSorceryCrystalAttribute.Type()), ASTRAL_PERK_GEM = register("astral_perk_gem", new AstralSorceryPerkGemAttribute.Type()); - private static boolean testRecipe(ItemStack s, Level w, RecipeType type) { + private static > boolean testRecipe(ItemStack s, Level w, RecipeType type) { RECIPE_WRAPPER.setItem(0, s.copy()); return w.getRecipeManager() .getRecipeFor(type, RECIPE_WRAPPER, w) diff --git a/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothBlockEntity.java index aae1faa736..b2622ec6b4 100644 --- a/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothBlockEntity.java @@ -125,7 +125,7 @@ public class TableClothBlockEntity extends SmartBlockEntity { return InteractionResult.SUCCESS; manuallyAddedItems.add(heldItem.copyWithCount(1)); - facing = player.getDirection(); + facing = player.getDirection().getOpposite(); heldItem.shrink(1); if (heldItem.isEmpty()) player.setItemInHand(InteractionHand.MAIN_HAND, ItemStack.EMPTY); diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java index 2d30fe8feb..3e4fe00a55 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java @@ -1044,9 +1044,9 @@ public class StandardRecipeGen extends CreateRecipeProvider { .pattern("SSS")), REDSTONE_LINK = create(AllBlocks.REDSTONE_LINK).returns(2) - .unlockedBy(I::brassCasing) - .viaShaped(b -> b.define('C', Blocks.REDSTONE_TORCH) - .define('S', I.brassCasing()) + .unlockedBy(I::andesiteCasing) + .viaShaped(b -> b.define('C', AllItems.TRANSMITTER) + .define('S', I.andesiteCasing()) .pattern("C") .pattern("S")), diff --git a/src/main/resources/assets/create/models/block/chain_conveyor/conveyor_casing.obj b/src/main/resources/assets/create/models/block/chain_conveyor/conveyor_casing.obj index f9034f7d16..7165385766 100644 --- a/src/main/resources/assets/create/models/block/chain_conveyor/conveyor_casing.obj +++ b/src/main/resources/assets/create/models/block/chain_conveyor/conveyor_casing.obj @@ -1,4 +1,4 @@ -# Blender 4.1.1 +# Blender 4.3.2 # www.blender.org mtllib conveyor_casing.mtl o Cube.002 @@ -6,10 +6,10 @@ v 0.965990 0.875000 -0.625000 v 0.965990 0.125000 -0.625000 v 0.034010 0.875000 -0.624999 v 0.034010 0.125000 -0.624999 -v 0.000000 0.875000 0.000000 -v 0.062500 0.875000 0.000000 -v 0.937500 0.875000 0.000000 -v 1.000000 0.875000 0.000000 +v 0.000000 0.875000 -0.000000 +v 0.062500 0.875000 -0.000000 +v 0.937500 0.875000 -0.000000 +v 1.000000 0.875000 -0.000000 v 0.062500 0.875000 -0.476712 v 0.062500 0.875000 -0.556218 v 0.937500 0.875000 -0.556218 @@ -63,10 +63,9 @@ v 0.125000 1.000000 0.125000 v 0.875000 1.000000 0.875000 v 0.875000 1.000000 0.125000 v 0.000000 1.000000 1.000000 -v 0.000000 1.000000 0.000000 -v 1.000000 1.000000 0.000000 +v 0.000000 1.000000 -0.000000 +v 1.000000 1.000000 -0.000000 v 1.000000 1.000000 1.000000 -v 0.500000 0.875000 0.500000 v 0.125000 0.937500 0.875000 v 0.125000 0.937500 0.125000 v 0.875000 0.937500 0.125000 @@ -75,16 +74,12 @@ v -0.246859 0.875000 -0.246859 v -0.246859 0.875000 1.246859 v 1.246859 0.875000 1.246859 v 1.246859 0.875000 -0.246859 -v -0.499999 0.125000 0.914213 -v 0.085787 0.125000 -0.499999 v 1.207106 0.125000 -0.207106 v -0.207106 0.125000 -0.207106 -v 1.499999 0.125000 0.085787 v 1.207107 0.125000 1.207107 v 0.914213 0.125000 1.499999 v -0.207107 0.125000 1.207106 v -0.500000 0.125000 0.085787 -v 0.914213 0.125000 -0.500000 v 1.500000 0.125000 0.914213 v 0.085787 0.125000 1.500000 v 0.500000 0.112500 0.500000 @@ -116,6 +111,11 @@ v 0.250000 0.062500 0.250000 v 0.250000 0.062500 0.750000 v 0.750000 0.062500 0.250000 v 0.750000 0.062500 0.750000 +v 0.500000 0.125000 0.500000 +v -0.499999 0.125000 0.914213 +v 0.085787 0.125000 -0.499999 +v 1.499999 0.125000 0.085787 +v 0.914213 0.125000 -0.500000 vn -0.7071 -0.0000 -0.7071 vn -0.0000 1.0000 -0.0000 vn -0.0000 -0.0000 -1.0000 @@ -142,25 +142,17 @@ vt 0.031250 0.925857 vt 0.468750 0.925857 vt 0.982995 0.750000 vt 0.982995 0.375000 -vt 0.750000 0.937500 vt 0.559359 0.937500 vt 0.727903 0.768956 vt 0.750000 0.791054 vt 0.531250 0.965609 -vt 0.750000 0.965610 vt 0.772097 0.768957 -vt 0.750000 0.791054 -vt 0.031250 0.925857 vt 0.031250 0.687500 vt 0.468750 0.687500 -vt 0.468750 0.925857 vt 0.968750 0.965609 vt 0.940641 0.937500 -vt 0.750000 0.937500 -vt 0.750000 0.965610 vt 0.559360 0.937500 vt 0.531250 0.965610 -vt 0.750000 0.965610 vt 0.000000 0.500000 vt 0.000000 0.000000 vt 0.062500 0.062500 @@ -189,10 +181,6 @@ vt 0.000689 0.562571 vt 0.031930 0.500088 vt 0.469307 0.500088 vt 0.500548 0.562571 -vt 0.437500 0.437500 -vt 0.062500 0.437500 -vt 0.062500 0.062500 -vt 0.437500 0.062500 vt 0.000689 0.500088 vt 0.500548 0.500336 vt 0.500548 0.500088 @@ -208,13 +196,10 @@ vt 0.017005 0.687500 vt 0.042893 0.625000 vt 0.250000 0.625000 vt 0.250000 0.687500 -vt 0.000000 0.593750 -vt 0.031250 0.593750 -vt 0.031250 0.625000 -vt 0.000000 0.625000 vt 0.482995 0.687500 -vt 0.042893 0.625000 vt 0.457107 0.625000 +vt 0.000000 0.593750 +vt 0.000000 0.625000 vt 0.500000 0.609375 vt 0.000000 0.609375 vt 0.937500 0.312500 @@ -228,128 +213,125 @@ vt 0.875000 0.375000 vt 0.562500 0.062500 vt 0.562500 0.312500 vt 0.500000 0.375000 -vt 0.500000 0.000000 vt 0.812500 0.062500 -vt 0.875000 0.000000 vt 0.812500 0.312500 -vt 0.875000 0.375000 -s 0 +s 1 usemtl casing f 14/1/1 13/2/1 3/3/1 4/4/1 f 10/5/2 11/6/2 1/7/2 3/8/2 -f 70/9/2 15/10/2 9/11/2 10/12/2 +f 69/9/2 15/10/2 9/11/2 10/12/2 f 10/5/2 9/13/2 12/14/2 11/6/2 f 3/15/3 1/3/3 2/4/3 4/16/3 f 2/16/4 1/15/4 28/2/4 29/1/4 -f 30/17/2 12/18/2 7/19/2 8/20/2 -f 11/21/2 12/18/2 30/17/2 73/22/2 -f 6/23/2 9/11/2 15/10/2 5/24/2 -f 9/25/2 6/26/2 7/27/2 12/28/2 +f 30/10/2 12/17/2 7/18/2 8/19/2 +f 11/20/2 12/17/2 30/10/2 72/9/2 +f 6/21/2 9/11/2 15/10/2 5/19/2 +f 9/13/2 6/22/2 7/23/2 12/14/2 f 29/1/4 28/2/4 18/3/4 19/4/4 f 24/5/2 25/6/2 16/7/2 18/8/2 -f 73/9/2 30/10/2 23/11/2 24/12/2 +f 72/9/2 30/10/2 23/11/2 24/12/2 f 24/5/2 23/13/2 26/14/2 25/6/2 f 18/15/5 16/3/5 17/4/5 19/16/5 f 17/16/6 16/15/6 43/2/6 27/1/6 -f 44/17/2 26/18/2 21/19/2 22/20/2 -f 25/29/2 26/30/2 44/31/2 72/32/2 -f 20/23/2 23/11/2 30/10/2 8/24/2 -f 23/25/2 20/26/2 21/27/2 26/28/2 +f 44/10/2 26/17/2 21/18/2 22/19/2 +f 25/24/2 26/25/2 44/10/2 71/9/2 +f 20/21/2 23/11/2 30/10/2 8/19/2 +f 23/13/2 20/22/2 21/23/2 26/14/2 f 27/1/6 43/2/6 33/3/6 34/4/6 f 39/5/2 40/6/2 31/7/2 33/8/2 -f 72/32/2 44/10/2 38/33/2 39/34/2 +f 71/9/2 44/10/2 38/26/2 39/27/2 f 39/5/2 38/13/2 41/14/2 40/6/2 f 33/15/7 31/3/7 32/4/7 34/16/7 f 32/16/8 31/15/8 55/2/8 42/1/8 -f 56/17/2 41/18/2 36/19/2 37/20/2 -f 40/21/2 41/18/2 56/17/2 71/35/2 -f 35/23/2 38/11/2 44/10/2 22/24/2 -f 38/25/2 35/26/2 36/27/2 41/28/2 +f 56/10/2 41/17/2 36/18/2 37/19/2 +f 40/20/2 41/17/2 56/10/2 70/9/2 +f 35/21/2 38/11/2 44/10/2 22/19/2 +f 38/13/2 35/22/2 36/23/2 41/14/2 f 42/1/8 55/2/8 47/3/8 48/4/8 f 52/5/2 53/6/2 45/7/2 47/8/2 -f 71/35/2 56/10/2 51/11/2 52/12/2 +f 70/9/2 56/10/2 51/11/2 52/12/2 f 52/5/2 51/13/2 54/14/2 53/6/2 f 47/15/9 45/3/9 46/4/9 48/16/9 f 46/16/1 45/15/1 13/2/1 14/1/1 -f 15/17/2 54/18/2 50/19/2 5/20/2 -f 53/21/2 54/18/2 15/17/2 70/9/2 -f 49/23/2 51/11/2 56/10/2 37/24/2 -f 51/25/2 49/26/2 50/27/2 54/28/2 -f 62/36/2 61/37/2 57/38/2 58/39/2 -f 64/40/2 63/41/2 60/42/2 59/43/2 -f 57/38/2 61/37/2 64/40/2 59/43/2 -f 57/44/3 59/45/3 69/46/3 66/47/3 -f 64/48/5 21/49/5 20/50/5 63/51/5 -f 62/52/9 50/53/9 49/54/9 61/55/9 -f 7/56/3 6/57/3 62/58/3 63/59/3 -f 63/41/2 62/36/2 58/39/2 60/42/2 -f 61/60/7 36/61/7 35/62/7 64/63/7 -f 68/64/2 67/65/2 66/66/2 69/67/2 -f 60/44/7 58/45/7 67/46/7 68/47/7 -f 59/44/9 60/45/9 68/46/9 69/47/9 -f 58/44/5 57/45/5 66/46/5 67/47/5 -f 37/68/7 36/61/7 61/60/7 -f 37/69/9 61/55/9 49/54/9 -f 22/70/7 64/63/7 35/62/7 -f 22/71/5 21/49/5 64/48/5 -f 8/72/5 63/51/5 20/50/5 -f 8/73/3 7/56/3 63/59/3 -f 5/74/3 62/58/3 6/57/3 -f 5/75/9 50/53/9 62/52/9 -f 45/76/2 53/21/2 70/9/2 13/77/2 -f 13/77/2 70/9/2 10/12/2 3/78/2 -f 55/77/2 71/35/2 52/12/2 47/78/2 -f 31/76/2 40/21/2 71/35/2 55/77/2 -f 43/77/2 72/32/2 39/34/2 33/76/2 -f 16/78/2 25/29/2 72/32/2 43/77/2 -f 28/77/2 73/9/2 24/12/2 18/78/2 -f 1/76/2 11/21/2 73/22/2 28/77/2 -f 4/79/10 75/80/10 77/81/10 14/82/10 -f 75/83/3 83/84/3 96/85/3 88/86/3 -f 19/87/10 17/79/10 84/88/10 78/89/10 -f 84/83/6 79/84/6 92/85/6 97/86/6 -f 19/79/10 78/80/10 76/81/10 29/82/10 -f 76/83/4 78/84/4 91/85/4 89/86/4 -f 34/87/10 32/79/10 85/88/10 80/89/10 -f 74/83/9 82/84/9 95/85/9 87/86/9 -f 34/79/10 80/80/10 79/81/10 27/82/10 -f 85/83/8 81/84/8 94/85/8 98/86/8 -f 48/87/10 46/79/10 82/88/10 74/89/10 -f 78/83/5 84/84/5 97/85/5 91/86/5 -f 48/79/10 74/80/10 81/81/10 42/82/10 -f 79/83/6 80/84/6 93/85/6 92/86/6 -f 82/83/1 77/84/1 90/85/1 95/86/1 -f 77/83/1 75/84/1 88/85/1 90/86/1 -f 82/89/10 46/87/10 14/82/10 77/81/10 -f 83/83/4 76/84/4 89/85/4 96/86/4 -f 85/89/10 32/87/10 42/82/10 81/81/10 -f 80/83/7 85/84/7 98/85/7 93/86/7 -f 84/89/10 17/87/10 27/82/10 79/81/10 -f 81/83/8 74/84/8 87/85/8 94/86/8 -f 83/89/10 2/87/10 29/82/10 76/81/10 -f 4/87/10 2/79/10 83/88/10 75/89/10 -f 88/83/10 96/86/10 86/90/10 -f 88/86/10 86/90/10 90/91/10 -f 91/83/10 97/86/10 86/90/10 -f 91/86/10 86/90/10 89/91/10 -f 93/83/10 98/86/10 86/90/10 -f 93/86/10 86/90/10 92/91/10 -f 87/83/10 95/86/10 86/90/10 -f 87/86/10 86/90/10 94/91/10 -f 86/90/10 95/83/10 90/91/10 -f 86/90/10 98/83/10 94/91/10 -f 86/90/10 97/83/10 92/91/10 -f 86/90/10 96/83/10 89/91/10 -f 101/92/3 99/93/3 112/94/3 114/95/3 -f 110/96/7 106/97/7 103/98/7 108/99/7 -f 109/96/5 105/97/5 106/98/5 110/99/5 -f 107/96/3 104/97/3 105/98/3 109/99/3 -f 108/96/9 103/97/9 104/98/9 107/99/9 -f 100/100/10 99/101/10 108/102/10 107/103/10 -f 102/104/10 100/100/10 107/103/10 109/105/10 -f 101/106/10 102/104/10 109/105/10 110/107/10 -f 99/101/10 101/106/10 110/107/10 108/102/10 -f 111/100/10 113/104/10 114/106/10 112/101/10 -f 100/92/7 102/93/7 113/94/7 111/95/7 -f 102/92/9 101/93/9 114/94/9 113/95/9 -f 99/92/5 100/93/5 111/94/5 112/95/5 +f 15/10/2 54/17/2 50/18/2 5/19/2 +f 53/20/2 54/17/2 15/10/2 69/9/2 +f 49/21/2 51/11/2 56/10/2 37/19/2 +f 51/13/2 49/22/2 50/23/2 54/14/2 +f 62/28/2 61/29/2 57/30/2 58/31/2 +f 64/32/2 63/33/2 60/34/2 59/35/2 +f 57/30/2 61/29/2 64/32/2 59/35/2 +f 57/36/3 59/37/3 68/38/3 65/39/3 +f 64/40/5 21/41/5 20/42/5 63/43/5 +f 62/44/9 50/45/9 49/46/9 61/47/9 +f 7/48/3 6/49/3 62/50/3 63/51/3 +f 63/33/2 62/28/2 58/31/2 60/34/2 +f 61/52/7 36/53/7 35/54/7 64/55/7 +f 67/34/2 66/31/2 65/30/2 68/35/2 +f 60/36/7 58/37/7 66/38/7 67/39/7 +f 59/36/9 60/37/9 67/38/9 68/39/9 +f 58/36/5 57/37/5 65/38/5 66/39/5 +f 37/56/7 36/53/7 61/52/7 +f 37/57/9 61/47/9 49/46/9 +f 22/58/7 64/55/7 35/54/7 +f 22/59/5 21/41/5 64/40/5 +f 8/60/5 63/43/5 20/42/5 +f 8/61/3 7/48/3 63/51/3 +f 5/62/3 62/50/3 6/49/3 +f 5/63/9 50/45/9 62/44/9 +f 45/64/2 53/20/2 69/9/2 13/65/2 +f 13/65/2 69/9/2 10/12/2 3/66/2 +f 55/65/2 70/9/2 52/12/2 47/66/2 +f 31/64/2 40/20/2 70/9/2 55/65/2 +f 43/65/2 71/9/2 39/27/2 33/64/2 +f 16/66/2 25/24/2 71/9/2 43/65/2 +f 28/65/2 72/9/2 24/12/2 18/66/2 +f 1/64/2 11/20/2 72/9/2 28/65/2 +f 4/67/10 112/68/10 74/69/10 14/70/10 +f 19/71/10 17/67/10 79/68/10 113/72/10 +f 19/67/10 113/68/10 73/69/10 29/70/10 +f 34/71/10 32/67/10 80/68/10 76/72/10 +f 34/67/10 76/68/10 75/69/10 27/70/10 +f 48/71/10 46/67/10 78/68/10 111/72/10 +f 48/67/10 111/68/10 77/69/10 42/70/10 +f 78/72/10 46/71/10 14/70/10 74/69/10 +f 80/72/10 32/71/10 42/70/10 77/69/10 +f 79/72/10 17/71/10 27/70/10 75/69/10 +f 114/72/10 2/71/10 29/70/10 73/69/10 +f 4/71/10 2/67/10 114/68/10 112/72/10 +f 83/73/10 91/74/10 81/75/10 +f 83/74/10 81/75/10 85/76/10 +f 86/73/10 92/74/10 81/75/10 +f 86/74/10 81/75/10 84/76/10 +f 88/73/10 93/74/10 81/75/10 +f 88/74/10 81/75/10 87/76/10 +f 82/73/10 90/74/10 81/75/10 +f 82/74/10 81/75/10 89/76/10 +f 81/75/10 90/73/10 85/76/10 +f 81/75/10 93/73/10 89/76/10 +f 81/75/10 92/73/10 87/76/10 +f 81/75/10 91/73/10 84/76/10 +f 96/77/3 94/78/3 107/79/3 109/80/3 +f 105/81/7 101/82/7 98/83/7 103/84/7 +f 104/81/5 100/82/5 101/83/5 105/84/5 +f 102/81/3 99/82/3 100/83/3 104/84/3 +f 103/81/9 98/82/9 99/83/9 102/84/9 +f 95/85/10 94/86/10 103/87/10 102/32/10 +f 97/88/10 95/85/10 102/32/10 104/81/10 +f 96/89/10 97/88/10 104/81/10 105/84/10 +f 94/86/10 96/89/10 105/84/10 103/87/10 +f 106/85/10 108/88/10 109/89/10 107/86/10 +f 95/77/7 97/78/7 108/79/7 106/80/7 +f 97/77/9 96/78/9 109/79/9 108/80/9 +f 94/77/5 95/78/5 106/79/5 107/80/5 +f 112/73/10 114/74/10 110/75/10 +f 112/74/10 110/75/10 74/76/10 +f 113/73/10 79/74/10 110/75/10 +f 113/74/10 110/75/10 73/76/10 +f 76/73/10 80/74/10 110/75/10 +f 76/74/10 110/75/10 75/76/10 +f 111/73/10 78/74/10 110/75/10 +f 111/74/10 110/75/10 77/76/10 +f 110/75/10 78/73/10 74/76/10 +f 110/75/10 80/73/10 77/76/10 +f 110/75/10 79/73/10 75/76/10 +f 110/75/10 114/73/10 73/76/10 diff --git a/src/main/resources/assets/create/models/block/hose_pulley/block.json b/src/main/resources/assets/create/models/block/hose_pulley/block.json index e7eaab188a..e95f346d52 100644 --- a/src/main/resources/assets/create/models/block/hose_pulley/block.json +++ b/src/main/resources/assets/create/models/block/hose_pulley/block.json @@ -1,250 +1,134 @@ { "credit": "Made with Blockbench", - "parent": "block/block", "textures": { - "3": "create:block/encased_pipe", - "4": "create:block/copper_gearbox", - "7": "create:block/copper_underside", - "8": "create:block/copper_plating", - "particle": "create:block/copper_plating" + "1": "create:block/hose_pulley", + "3": "create:block/pump", + "particle": "create:block/fluid_tank_inner" }, "elements": [ { - "name": "side", - "from": [14, 2, 2], - "to": [15, 14, 14], - "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, - "faces": { - "east": {"uv": [2, 2, 14, 14], "texture": "#4"}, - "west": {"uv": [2, 2, 14, 14], "texture": "#7"}, - "down": {"uv": [2, 11, 14, 12], "rotation": 90, "texture": "#4"} - } - }, - { - "name": "side", "from": [0, 0, 0], "to": [2, 16, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, "faces": { - "east": {"uv": [16, 0, 0, 16], "texture": "#7"}, - "west": {"uv": [16, 0, 0, 16], "texture": "#3"} + "north": {"uv": [7, 8, 8, 16], "texture": "#1"}, + "east": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "south": {"uv": [0, 8, 1, 16], "texture": "#1"}, + "west": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "up": {"uv": [15, 8, 16, 16], "texture": "#1"}, + "down": {"uv": [15, 8, 16, 16], "texture": "#1"} } }, { - "name": "side", "from": [-1, 3.05, 3.05], - "to": [1, 12.95, 12.95], - "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, + "to": [0, 12.95, 12.95], + "rotation": {"angle": 0, "axis": "y", "origin": [-1, 3, 3]}, "faces": { - "north": {"uv": [4, 3, 3, 13], "texture": "#3"}, - "south": {"uv": [13, 3, 12, 13], "texture": "#3"}, - "west": {"uv": [13, 3, 3, 13], "texture": "#3"}, - "up": {"uv": [3, 3, 13, 4], "rotation": 90, "texture": "#3"}, - "down": {"uv": [3, 12, 13, 13], "rotation": 90, "texture": "#3"} + "north": {"uv": [9.5, 1.5, 10, 6.5], "texture": "#1"}, + "south": {"uv": [14, 1.5, 14.5, 6.5], "texture": "#1"}, + "west": {"uv": [9.5, 1.5, 14.5, 6.5], "texture": "#1"}, + "up": {"uv": [9.5, 1.5, 14.5, 2], "rotation": 90, "texture": "#1"}, + "down": {"uv": [9.5, 6, 14.5, 6.5], "rotation": 90, "texture": "#1"} } }, { - "name": "side_frame", - "from": [13, 2, 0], - "to": [16, 14, 2], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]}, + "from": [14, 2, 2], + "to": [15, 14, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [14, 2, 2]}, "faces": { - "north": {"uv": [3, 2, 0, 14], "rotation": 180, "texture": "#3"}, - "east": {"uv": [16, 14, 14, 2], "rotation": 180, "texture": "#4"}, - "south": {"uv": [13, 2, 14, 14], "texture": "#4"}, - "west": {"uv": [1, 2, 3, 14], "rotation": 180, "texture": "#7"} + "east": {"uv": [1, 1, 7, 7], "texture": "#1"} } }, { - "name": "side_frame", - "from": [13, 2, 14], - "to": [16, 14, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]}, - "faces": { - "north": {"uv": [2, 2, 3, 14], "texture": "#4"}, - "east": {"uv": [2, 14, 0, 2], "rotation": 180, "texture": "#4"}, - "south": {"uv": [16, 2, 13, 14], "rotation": 180, "texture": "#3"}, - "west": {"uv": [16, 14, 14, 2], "rotation": 180, "texture": "#7"} - } - }, - { - "name": "side_frame", - "from": [13, 0, 0], - "to": [16, 2, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]}, - "faces": { - "north": {"uv": [0, 14, 3, 16], "texture": "#3"}, - "east": {"uv": [0, 14, 16, 16], "texture": "#4"}, - "south": {"uv": [13, 14, 16, 16], "texture": "#3"}, - "west": {"uv": [0, 14, 16, 16], "texture": "#7"}, - "up": {"uv": [0, 14, 16, 13], "rotation": 90, "texture": "#4"}, - "down": {"uv": [16, 16, 13, 0], "rotation": 180, "texture": "#3"} - } - }, - { - "name": "side_frame", - "from": [13, 14, 0], + "from": [14, 0, 14], "to": [16, 16, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 15, 8]}, + "rotation": {"angle": 0, "axis": "y", "origin": [14, 0, 14]}, "faces": { - "north": {"uv": [3, 2, 0, 0], "rotation": 180, "texture": "#3"}, - "east": {"uv": [16, 2, 0, 0], "rotation": 180, "texture": "#4"}, - "south": {"uv": [16, 2, 13, 0], "rotation": 180, "texture": "#3"}, - "west": {"uv": [4, 0, 11, 2], "texture": "#8"}, - "up": {"uv": [16, 16, 13, 0], "rotation": 180, "texture": "#8"}, - "down": {"uv": [0, 3, 16, 2], "rotation": 270, "texture": "#4"} + "north": {"uv": [0, 0, 1, 8], "texture": "#1"}, + "east": {"uv": [0, 0, 1, 8], "texture": "#1"}, + "south": {"uv": [7, 8, 8, 16], "texture": "#1"}, + "west": {"uv": [15, 0, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 8, 9, 9], "rotation": 180, "texture": "#1"}, + "down": {"uv": [8, 15, 9, 16], "rotation": 180, "texture": "#1"} } }, { - "name": "side_frame", - "from": [0, 0, 0], - "to": [3, 2, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]}, + "from": [14, 0, 0], + "to": [16, 16, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [14, 0, 0]}, "faces": { - "north": {"uv": [13, 14, 16, 16], "texture": "#3"}, - "east": {"uv": [0, 14, 16, 16], "texture": "#7"}, - "south": {"uv": [0, 14, 3, 16], "texture": "#3"}, - "up": {"uv": [0, 15, 16, 14], "rotation": 90, "texture": "#7"}, - "down": {"uv": [3, 16, 0, 0], "rotation": 180, "texture": "#3"} + "north": {"uv": [0, 8, 1, 16], "texture": "#1"}, + "east": {"uv": [7, 0, 8, 8], "texture": "#1"}, + "south": {"uv": [7, 0, 8, 8], "texture": "#1"}, + "west": {"uv": [8, 0, 9, 8], "texture": "#1"}, + "up": {"uv": [8, 15, 9, 16], "rotation": 180, "texture": "#1"}, + "down": {"uv": [8, 8, 9, 9], "rotation": 180, "texture": "#1"} } }, { - "name": "side_frame", - "from": [0, 2, 0], - "to": [3, 14, 2], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]}, + "from": [2, 14, 3], + "to": [14, 16, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [14, 14, 2]}, "faces": { - "north": {"uv": [16, 2, 13, 14], "rotation": 180, "texture": "#3"}, - "east": {"uv": [16, 14, 14, 2], "rotation": 180, "texture": "#7"}, - "south": {"uv": [13, 2, 15, 14], "texture": "#4"}, - "up": {"uv": [2, 14, 0, 16], "rotation": 270, "texture": "#8"}, - "down": {"uv": [2, 0, 0, 2], "rotation": 90, "texture": "#8"} + "north": {"uv": [1, 8, 7, 9], "texture": "#1"}, + "south": {"uv": [1, 8, 7, 9], "texture": "#1"}, + "up": {"uv": [9, 9.5, 15, 14.5], "texture": "#1"} } }, { - "name": "side_frame", - "from": [0, 14, 0], - "to": [3, 16, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 15, 8]}, + "from": [14, 14, 2], + "to": [16, 16, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [26, 14, 2]}, "faces": { - "north": {"uv": [16, 2, 13, 0], "rotation": 180, "texture": "#3"}, - "east": {"uv": [4, 0, 11, 2], "texture": "#8"}, - "south": {"uv": [3, 2, 0, 0], "rotation": 180, "texture": "#3"}, - "up": {"uv": [3, 16, 0, 0], "rotation": 180, "texture": "#8"}, - "down": {"uv": [0, 13, 16, 14], "rotation": 270, "texture": "#7"} + "east": {"uv": [1, 0, 7, 1], "texture": "#1"}, + "west": {"uv": [9, 0, 15, 1], "texture": "#1"}, + "up": {"uv": [8, 9, 9, 15], "rotation": 180, "texture": "#1"}, + "down": {"uv": [1, 1, 7, 1.5], "texture": "#1"} } }, { - "name": "side_frame", - "from": [0, 2, 14], - "to": [3, 14, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]}, + "from": [14, 0, 2], + "to": [16, 2, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [26, 0, 2]}, "faces": { - "north": {"uv": [16, 14, 14, 2], "rotation": 180, "texture": "#4"}, - "east": {"uv": [2, 14, 0, 2], "rotation": 180, "texture": "#7"}, - "south": {"uv": [3, 2, 0, 14], "rotation": 180, "texture": "#3"}, - "up": {"uv": [0, 14, 2, 16], "rotation": 270, "texture": "#8"}, - "down": {"uv": [0, 0, 2, 2], "rotation": 90, "texture": "#8"} + "east": {"uv": [1, 7, 7, 8], "texture": "#1"}, + "west": {"uv": [9, 7, 15, 8], "texture": "#1"}, + "up": {"uv": [1, 7.5, 7.5, 8], "texture": "#1"}, + "down": {"uv": [8, 9, 9, 15], "rotation": 180, "texture": "#1"} } }, { - "name": "front", - "from": [3, 0, 13], - "to": [13, 2, 15], - "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, + "from": [2, 0, 3], + "to": [14, 2, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [14, 0, 2]}, "faces": { - "north": {"uv": [3, 14, 13, 16], "texture": "#8"}, - "east": {"uv": [0, 0, 0, 0], "texture": "#8"}, - "south": {"uv": [3, 12, 13, 14], "texture": "#7"}, - "west": {"uv": [0, 0, 0, 0], "texture": "#8"}, - "up": {"uv": [3, 14, 13, 12], "texture": "#7"}, - "down": {"uv": [3, 1, 13, 3], "texture": "#3"} + "north": {"uv": [1, 8, 7, 9], "rotation": 180, "texture": "#1"}, + "east": {"uv": [0, 0, 10, 2], "texture": "#1"}, + "south": {"uv": [1, 8, 7, 9], "rotation": 180, "texture": "#1"}, + "west": {"uv": [0, 0, 10, 2], "texture": "#1"}, + "down": {"uv": [0, 0.5, 6, 5.5], "texture": "#3"} } }, { - "name": "front", - "from": [3, 0, 1], - "to": [13, 2, 3], - "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, + "from": [1, 2, 2], + "to": [3, 14, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [13, 12, 3, 14], "texture": "#7"}, - "east": {"uv": [0, 0, 0, 0], "texture": "#8"}, - "south": {"uv": [13, 14, 3, 16], "texture": "#8"}, - "west": {"uv": [0, 0, 0, 0], "texture": "#8"}, - "up": {"uv": [3, 12, 13, 14], "texture": "#7"}, - "down": {"uv": [3, 15, 13, 13], "rotation": 180, "texture": "#3"} + "north": {"uv": [6.5, 9, 7, 15], "texture": "#1"}, + "south": {"uv": [1, 9, 1.5, 15], "texture": "#1"}, + "up": {"uv": [1, 9, 1.5, 15], "rotation": 180, "texture": "#1"}, + "down": {"uv": [6.5, 9, 7, 15], "rotation": 180, "texture": "#1"} } }, { - "name": "top", - "from": [3, 14, 1], - "to": [13, 16, 15], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 8]}, + "from": [13, 2, 2], + "to": [15, 14, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [13, 0, 3, 2], "texture": "#3"}, - "south": {"uv": [13, 0, 3, 2], "texture": "#3"}, - "up": {"uv": [3, 1, 13, 15], "texture": "#8"}, - "down": {"uv": [3, 1, 13, 15], "texture": "#7"} + "north": {"uv": [1, 9, 1.5, 15], "texture": "#1"}, + "south": {"uv": [6.5, 9, 7, 15], "texture": "#1"}, + "up": {"uv": [6.5, 9, 7, 15], "rotation": 180, "texture": "#1"}, + "down": {"uv": [1, 9, 1.5, 15], "rotation": 180, "texture": "#1"} } } - ], - "display": { - "thirdperson_righthand": { - "rotation": [75, 45, 0], - "translation": [0, 2.5, 0], - "scale": [0.375, 0.375, 0.375] - }, - "thirdperson_lefthand": { - "rotation": [75, 45, 0], - "translation": [0, 2.5, 0], - "scale": [0.375, 0.375, 0.375] - }, - "firstperson_righthand": { - "rotation": [0, 45, 0], - "scale": [0.4, 0.4, 0.4] - }, - "firstperson_lefthand": { - "rotation": [0, 225, 0], - "scale": [0.4, 0.4, 0.4] - }, - "ground": { - "translation": [0, 3, 0], - "scale": [0.25, 0.25, 0.25] - }, - "gui": { - "rotation": [30, 225, 0], - "scale": [0.625, 0.625, 0.625] - }, - "fixed": { - "scale": [0.5, 0.5, 0.5] - } - }, - "groups": [ - 0, - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, - { - "name": "shaft", - "origin": [8, 8, 8], - "color": 0, - "children": [] - }, - { - "name": "rope_half_magnet", - "origin": [8, 8, 8], - "color": 0, - "children": [] - }, - 13 ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/hose_pulley/hose_coil.json b/src/main/resources/assets/create/models/block/hose_pulley/hose_coil.json new file mode 100644 index 0000000000..b6255b2fb7 --- /dev/null +++ b/src/main/resources/assets/create/models/block/hose_pulley/hose_coil.json @@ -0,0 +1,37 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "2": "create:block/hose_pulley_coil", + "particle": "create:block/fluid_tank_inner" + }, + "elements": [ + { + "from": [12, 2, 3], + "to": [14, 14, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "east": {"uv": [3, 14, 13, 2], "texture": "#2"}, + "up": {"uv": [3, 16, 13, 14], "rotation": 270, "texture": "#2"}, + "down": {"uv": [3, 2, 13, 0], "rotation": 90, "texture": "#2"} + } + }, + { + "from": [2, 2, 3], + "to": [4, 14, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "west": {"uv": [3, 2, 13, 14], "texture": "#2"}, + "up": {"uv": [3, 0, 13, 2], "rotation": 90, "texture": "#2"}, + "down": {"uv": [3, 14, 13, 16], "rotation": 270, "texture": "#2"} + } + } + ], + "groups": [ + { + "name": "hose coil", + "origin": [8, 8, 8], + "color": 0, + "children": [0, 1] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/hose_pulley/item.json b/src/main/resources/assets/create/models/block/hose_pulley/item.json index cddc499779..7f5ce23b30 100644 --- a/src/main/resources/assets/create/models/block/hose_pulley/item.json +++ b/src/main/resources/assets/create/models/block/hose_pulley/item.json @@ -2,366 +2,185 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "3": "create:block/encased_pipe", - "4": "create:block/copper_gearbox", - "5": "create:block/hose_pulley_rope", - "6": "create:block/hose_pulley_magnet", - "7": "create:block/copper_underside", - "8": "create:block/copper_plating", - "particle": "create:block/copper_plating" + "1": "create:block/hose_pulley", + "2": "create:block/hose_pulley_coil", + "3": "create:block/pump", + "4": "create:block/axis", + "5": "create:block/axis_top", + "particle": "create:block/fluid_tank_inner" }, "elements": [ { - "name": "side", - "from": [2, 2, 14], - "to": [14, 14, 15], - "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, - "faces": { - "north": {"uv": [2, 2, 14, 14], "texture": "#7"}, - "south": {"uv": [2, 2, 14, 14], "texture": "#4"}, - "down": {"uv": [2, 11, 14, 12], "texture": "#4"} - } - }, - { - "name": "side", "from": [0, 0, 0], - "to": [16, 16, 2], - "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, + "to": [2, 16, 16], "faces": { - "north": {"uv": [16, 0, 0, 16], "texture": "#3"}, - "south": {"uv": [16, 0, 0, 16], "texture": "#7"} + "north": {"uv": [7, 8, 8, 16], "texture": "#1"}, + "east": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "south": {"uv": [0, 8, 1, 16], "texture": "#1"}, + "west": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "up": {"uv": [15, 8, 16, 16], "texture": "#1"}, + "down": {"uv": [15, 8, 16, 16], "texture": "#1"} } }, { - "name": "side", - "from": [3.05, 3.05, -1], - "to": [12.95, 12.95, 1], - "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, + "from": [-1, 3, 3], + "to": [0, 13, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [-1, 3, 3]}, "faces": { - "north": {"uv": [13, 3, 3, 13], "texture": "#3"}, - "east": {"uv": [4, 3, 3, 13], "texture": "#3"}, - "west": {"uv": [13, 3, 12, 13], "texture": "#3"}, - "up": {"uv": [3, 3, 13, 4], "rotation": 180, "texture": "#3"}, - "down": {"uv": [3, 12, 13, 13], "texture": "#3"} + "north": {"uv": [9.5, 1.5, 10, 6.5], "texture": "#1"}, + "south": {"uv": [14, 1.5, 14.5, 6.5], "texture": "#1"}, + "west": {"uv": [9.5, 1.5, 14.5, 6.5], "texture": "#1"}, + "up": {"uv": [9.5, 1.5, 14.5, 2], "rotation": 90, "texture": "#1"}, + "down": {"uv": [9.5, 6, 14.5, 6.5], "rotation": 90, "texture": "#1"} } }, { - "name": "side_frame", - "from": [14, 2, 13], - "to": [16, 14, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]}, + "from": [14, 2, 2], + "to": [15, 14, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [14, 2, 2]}, "faces": { - "north": {"uv": [1, 2, 3, 14], "rotation": 180, "texture": "#7"}, - "east": {"uv": [3, 2, 0, 14], "rotation": 180, "texture": "#3"}, - "south": {"uv": [16, 14, 14, 2], "rotation": 180, "texture": "#4"}, - "west": {"uv": [13, 2, 14, 14], "texture": "#4"} + "east": {"uv": [1, 1, 7, 7], "texture": "#1"} } }, { - "name": "side_frame", - "from": [0, 2, 13], - "to": [2, 14, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]}, - "faces": { - "north": {"uv": [16, 14, 14, 2], "rotation": 180, "texture": "#7"}, - "east": {"uv": [2, 2, 3, 14], "texture": "#4"}, - "south": {"uv": [2, 14, 0, 2], "rotation": 180, "texture": "#4"}, - "west": {"uv": [16, 2, 13, 14], "rotation": 180, "texture": "#3"} - } - }, - { - "name": "side_frame", - "from": [0, 0, 13], - "to": [16, 2, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]}, - "faces": { - "north": {"uv": [0, 14, 16, 16], "texture": "#7"}, - "east": {"uv": [0, 14, 3, 16], "texture": "#3"}, - "south": {"uv": [0, 14, 16, 16], "texture": "#4"}, - "west": {"uv": [13, 14, 16, 16], "texture": "#3"}, - "up": {"uv": [0, 14, 16, 13], "rotation": 180, "texture": "#4"}, - "down": {"uv": [16, 16, 13, 0], "rotation": 90, "texture": "#3"} - } - }, - { - "name": "side_frame", - "from": [0, 14, 13], + "from": [14, 0, 14], "to": [16, 16, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 15, 8]}, + "rotation": {"angle": 0, "axis": "y", "origin": [14, 0, 14]}, "faces": { - "north": {"uv": [4, 0, 11, 2], "texture": "#8"}, - "east": {"uv": [3, 2, 0, 0], "rotation": 180, "texture": "#3"}, - "south": {"uv": [16, 2, 0, 0], "rotation": 180, "texture": "#4"}, - "west": {"uv": [16, 2, 13, 0], "rotation": 180, "texture": "#3"}, - "up": {"uv": [16, 16, 13, 0], "rotation": 270, "texture": "#8"}, - "down": {"uv": [0, 3, 16, 2], "rotation": 180, "texture": "#4"} + "north": {"uv": [0, 0, 1, 8], "texture": "#1"}, + "east": {"uv": [0, 0, 1, 8], "texture": "#1"}, + "south": {"uv": [7, 8, 8, 16], "texture": "#1"}, + "west": {"uv": [15, 0, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 8, 9, 9], "rotation": 180, "texture": "#1"}, + "down": {"uv": [8, 15, 9, 16], "rotation": 180, "texture": "#1"} } }, { - "name": "side_frame", - "from": [0, 0, 0], - "to": [16, 2, 3], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]}, + "from": [14, 0, 0], + "to": [16, 16, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [14, 0, 0]}, "faces": { - "east": {"uv": [13, 14, 16, 16], "texture": "#3"}, - "south": {"uv": [0, 14, 16, 16], "texture": "#7"}, - "west": {"uv": [0, 14, 3, 16], "texture": "#3"}, - "up": {"uv": [0, 15, 16, 14], "rotation": 180, "texture": "#7"}, - "down": {"uv": [3, 16, 0, 0], "rotation": 90, "texture": "#3"} + "north": {"uv": [0, 8, 1, 16], "texture": "#1"}, + "east": {"uv": [7, 0, 8, 8], "texture": "#1"}, + "south": {"uv": [7, 0, 8, 8], "texture": "#1"}, + "west": {"uv": [8, 0, 9, 8], "texture": "#1"}, + "up": {"uv": [8, 15, 9, 16], "rotation": 180, "texture": "#1"}, + "down": {"uv": [8, 8, 9, 9], "rotation": 180, "texture": "#1"} } }, { - "name": "side_frame", - "from": [14, 2, 0], - "to": [16, 14, 3], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]}, + "from": [2, 14, 3], + "to": [14, 16, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [14, 14, 2]}, "faces": { - "east": {"uv": [16, 2, 13, 14], "rotation": 180, "texture": "#3"}, - "south": {"uv": [16, 14, 14, 2], "rotation": 180, "texture": "#7"}, - "west": {"uv": [13, 2, 15, 14], "texture": "#4"}, - "up": {"uv": [2, 14, 0, 16], "texture": "#8"}, - "down": {"uv": [2, 0, 0, 2], "texture": "#8"} + "north": {"uv": [1, 8, 7, 9], "texture": "#1"}, + "south": {"uv": [1, 8, 7, 9], "texture": "#1"}, + "up": {"uv": [9, 9.5, 15, 14.5], "texture": "#1"} } }, { - "name": "side_frame", - "from": [0, 14, 0], - "to": [16, 16, 3], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 15, 8]}, + "from": [14, 14, 2], + "to": [16, 16, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [26, 14, 2]}, "faces": { - "east": {"uv": [16, 2, 13, 0], "rotation": 180, "texture": "#3"}, - "south": {"uv": [4, 0, 11, 2], "texture": "#8"}, - "west": {"uv": [3, 2, 0, 0], "rotation": 180, "texture": "#3"}, - "up": {"uv": [3, 16, 0, 0], "rotation": 270, "texture": "#8"}, - "down": {"uv": [0, 13, 16, 14], "rotation": 180, "texture": "#7"} + "east": {"uv": [1, 0, 7, 1], "texture": "#1"}, + "west": {"uv": [9, 0, 15, 1], "texture": "#1"}, + "up": {"uv": [8, 9, 9, 15], "rotation": 180, "texture": "#1"}, + "down": {"uv": [1, 1, 7, 1.5], "texture": "#1"} } }, { - "name": "side_frame", - "from": [0, 2, 0], - "to": [2, 14, 3], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]}, + "from": [14, 0, 2], + "to": [16, 2, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [26, 0, 2]}, "faces": { - "east": {"uv": [16, 14, 14, 2], "rotation": 180, "texture": "#4"}, - "south": {"uv": [2, 14, 0, 2], "rotation": 180, "texture": "#7"}, - "west": {"uv": [3, 2, 0, 14], "rotation": 180, "texture": "#3"}, - "up": {"uv": [0, 14, 2, 16], "texture": "#8"}, - "down": {"uv": [0, 0, 2, 2], "texture": "#8"} + "east": {"uv": [1, 7, 7, 8], "texture": "#1"}, + "west": {"uv": [9, 7, 15, 8], "texture": "#1"}, + "up": {"uv": [1, 7.5, 7.5, 8], "texture": "#1"}, + "down": {"uv": [8, 9, 9, 15], "rotation": 180, "texture": "#1"} } }, { - "name": "front", - "from": [1, 0, 3], - "to": [3, 2, 13], - "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, + "from": [2, 0, 3], + "to": [14, 2, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [14, 0, 2]}, "faces": { - "north": {"uv": [0, 0, 0, 0], "texture": "#8"}, - "east": {"uv": [3, 14, 13, 16], "texture": "#8"}, - "south": {"uv": [0, 0, 0, 0], "texture": "#8"}, - "west": {"uv": [3, 12, 13, 14], "texture": "#7"}, - "up": {"uv": [3, 14, 13, 12], "rotation": 90, "texture": "#7"}, - "down": {"uv": [3, 1, 13, 3], "rotation": 270, "texture": "#3"} + "north": {"uv": [1, 8, 7, 9], "rotation": 180, "texture": "#1"}, + "east": {"uv": [0, 0, 10, 2], "texture": "#1"}, + "south": {"uv": [1, 8, 7, 9], "rotation": 180, "texture": "#1"}, + "west": {"uv": [0, 0, 10, 2], "texture": "#1"}, + "down": {"uv": [0, 0.5, 6, 5.5], "texture": "#3"} } }, { - "name": "front", - "from": [13, 0, 3], - "to": [15, 2, 13], - "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, + "from": [2, 2, 2], + "to": [14, 14, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 2, 2]}, "faces": { - "north": {"uv": [0, 0, 0, 0], "texture": "#8"}, - "east": {"uv": [13, 12, 3, 14], "texture": "#7"}, - "south": {"uv": [0, 0, 0, 0], "texture": "#8"}, - "west": {"uv": [13, 14, 3, 16], "texture": "#8"}, - "up": {"uv": [3, 12, 13, 14], "rotation": 90, "texture": "#7"}, - "down": {"uv": [3, 15, 13, 13], "rotation": 90, "texture": "#3"} + "north": {"uv": [1, 9, 7, 15], "texture": "#1"}, + "south": {"uv": [1, 9, 7, 15], "texture": "#1"}, + "up": {"uv": [1, 9, 7, 15], "texture": "#1"}, + "down": {"uv": [1, 9, 7, 15], "texture": "#1"} } }, { - "name": "top", - "from": [1, 14, 3], - "to": [15, 16, 13], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 8]}, + "from": [3, 2, 2], + "to": [13, 14, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [3, 2, 2]}, "faces": { - "east": {"uv": [13, 0, 3, 2], "texture": "#3"}, - "west": {"uv": [13, 0, 3, 2], "texture": "#3"}, - "up": {"uv": [3, 1, 13, 15], "rotation": 90, "texture": "#8"}, - "down": {"uv": [3, 1, 13, 15], "rotation": 270, "texture": "#7"} + "north": {"uv": [3, 2, 13, 14], "texture": "#2"}, + "up": {"uv": [3, 0, 13, 2], "rotation": 180, "texture": "#2"}, + "down": {"uv": [3, 14, 13, 16], "rotation": 180, "texture": "#2"} } }, { - "name": "coil", - "from": [4, 4, 2], - "to": [12, 12, 14], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": -45, "axis": "z", "origin": [8, 8, 8]}, + "from": [3, 2, 12], + "to": [13, 14, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [3, 2, 12]}, "faces": { - "east": {"uv": [2, 1, 14, 9], "rotation": 180, "texture": "#5"}, - "west": {"uv": [2, 1, 14, 9], "texture": "#5"}, - "up": {"uv": [2, 1, 14, 9], "rotation": 90, "texture": "#5"}, - "down": {"uv": [2, 1, 14, 9], "rotation": 270, "texture": "#5"} + "south": {"uv": [3, 2, 13, 14], "texture": "#2"}, + "up": {"uv": [3, 0, 13, 2], "texture": "#2"}, + "down": {"uv": [3, 14, 13, 16], "texture": "#2"} } }, { - "name": "coil", - "from": [3.5, 3.5, 9], - "to": [12.5, 12.5, 13], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": -45, "axis": "z", "origin": [8, 8, 8]}, + "from": [8, 6, 6], + "to": [16, 10, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 6, 6]}, "faces": { - "north": {"uv": [0, 0, 1, 1], "texture": "#5"}, - "east": {"uv": [0, 3, 4, 12], "texture": "#5"}, - "south": {"uv": [0, 0, 1, 1], "texture": "#5"}, - "west": {"uv": [0, 3, 4, 12], "rotation": 180, "texture": "#5"}, - "up": {"uv": [0, 3, 4, 12], "rotation": 270, "texture": "#5"}, - "down": {"uv": [0, 3, 4, 12], "rotation": 90, "texture": "#5"} - } - }, - { - "name": "coil", - "from": [3.5, 3.5, 3], - "to": [12.5, 12.5, 7], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": -45, "axis": "z", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [0, 0, 1, 1], "texture": "#5"}, - "east": {"uv": [0, 3, 4, 12], "texture": "#5"}, - "south": {"uv": [0, 0, 1, 1], "texture": "#5"}, - "west": {"uv": [0, 3, 4, 12], "rotation": 180, "texture": "#5"}, - "up": {"uv": [0, 3, 4, 12], "rotation": 270, "texture": "#5"}, - "down": {"uv": [0, 3, 4, 12], "rotation": 90, "texture": "#5"} - } - }, - { - "name": "rope", - "from": [6, 1, 6], - "to": [10, 15, 10], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 13, 7.75]}, - "faces": { - "north": {"uv": [12, 2, 16, 16], "texture": "#6"}, - "east": {"uv": [12, 2, 16, 16], "texture": "#6"}, - "south": {"uv": [12, 2, 16, 16], "texture": "#6"}, - "west": {"uv": [12, 2, 16, 16], "texture": "#6"}, - "up": {"uv": [12, 0, 16, 4], "rotation": 180, "texture": "#6"} - } - }, - { - "name": "drain 1", - "from": [4.5, 0, 4.5], - "to": [11.5, 2, 11.5], - "rotation": {"angle": 0, "axis": "y", "origin": [10, 14, 6.75]}, - "faces": { - "north": {"uv": [0, 0, 7, 2], "texture": "#6"}, - "east": {"uv": [0, 0, 7, 2], "texture": "#6"}, - "south": {"uv": [0, 0, 7, 2], "texture": "#6"}, - "west": {"uv": [0, 0, 7, 2], "texture": "#6"}, - "down": {"uv": [0, 2, 7, 9], "rotation": 270, "texture": "#6"} - } - }, - { - "name": "drain 2", - "from": [4.5, 2, 4.5], - "to": [11.5, 3, 11.5], - "rotation": {"angle": 0, "axis": "y", "origin": [10, 16, 6.75]}, - "faces": { - "north": {"uv": [0, 1, 7, 2], "texture": "#6"}, - "east": {"uv": [0, 1, 7, 2], "texture": "#6"}, - "south": {"uv": [0, 1, 7, 2], "texture": "#6"}, - "west": {"uv": [0, 1, 7, 2], "texture": "#6"}, - "up": {"uv": [0, 2, 7, 9], "rotation": 180, "texture": "#6"}, - "down": {"uv": [0, 9, 7, 16], "rotation": 270, "texture": "#6"} - } - }, - { - "name": "drain 3", - "from": [5.5, 2, 5.5], - "to": [10.5, 5, 10.5], - "rotation": {"angle": 0, "axis": "y", "origin": [9, 16, 7.75]}, - "faces": { - "north": {"uv": [7, 2, 10, 7], "rotation": 270, "texture": "#6"}, - "east": {"uv": [7, 2, 10, 7], "rotation": 270, "texture": "#6"}, - "south": {"uv": [7, 2, 10, 7], "rotation": 270, "texture": "#6"}, - "west": {"uv": [7, 2, 10, 7], "rotation": 270, "texture": "#6"}, - "up": {"uv": [1, 3, 6, 8], "rotation": 180, "texture": "#6"} + "north": {"uv": [6, 0, 10, 8], "rotation": 270, "texture": "#4"}, + "east": {"uv": [6, 6, 10, 10], "texture": "#5"}, + "south": {"uv": [6, 0, 10, 8], "rotation": 90, "texture": "#4"}, + "west": {"uv": [0, 0, 4, 4], "texture": "#4"}, + "up": {"uv": [6, 0, 10, 8], "rotation": 90, "texture": "#4"}, + "down": {"uv": [6, 0, 10, 8], "rotation": 90, "texture": "#4"} } } ], "display": { - "thirdperson_righthand": { - "rotation": [75, 45, 0], - "translation": [0, 2.5, 0], - "scale": [0.375, 0.375, 0.375] - }, - "thirdperson_lefthand": { - "rotation": [75, 45, 0], - "translation": [0, 2.5, 0], - "scale": [0.375, 0.375, 0.375] - }, - "firstperson_righthand": { - "rotation": [0, 45, 0], - "scale": [0.4, 0.4, 0.4] - }, - "firstperson_lefthand": { - "rotation": [0, 225, 0], - "scale": [0.4, 0.4, 0.4] - }, - "ground": { - "translation": [0, 3, 0], - "scale": [0.25, 0.25, 0.25] - }, "gui": { - "rotation": [30, 225, 0], + "rotation": [30, 135, 0], "scale": [0.625, 0.625, 0.625] - }, - "fixed": { - "scale": [0.5, 0.5, 0.5] } }, "groups": [ - 0, - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, + { + "name": "casing", + "origin": [14, 0, 2], + "color": 0, + "children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] + }, + { + "name": "hose coil", + "origin": [8, 8, 8], + "color": 0, + "children": [10, 11] + }, { "name": "shaft", "origin": [8, 8, 8], "color": 0, - "children": [] - }, - { - "name": "rope_half_magnet", - "origin": [8, 8, 8], - "color": 0, - "children": [] - }, - 13, - { - "name": "rope_coil", - "origin": [8, 8, 8], - "color": 0, - "children": [14, 15, 16] - }, - { - "name": "pulley_magnet", - "origin": [8, 8, 8], - "color": 0, - "children": [ - { - "name": "rope_half_magnet", - "origin": [8, 8, 8], - "color": 0, - "children": [17, 18, 19, 20] - } - ] + "children": [12] } ] -} +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/hose_pulley/pulley_magnet.json b/src/main/resources/assets/create/models/block/hose_pulley/pulley_magnet.json index 57d0bfac85..026b6748e0 100644 --- a/src/main/resources/assets/create/models/block/hose_pulley/pulley_magnet.json +++ b/src/main/resources/assets/create/models/block/hose_pulley/pulley_magnet.json @@ -1,101 +1,55 @@ { "credit": "Made with Blockbench", - "parent": "block/block", "textures": { - "6": "create:block/hose_pulley_magnet", - "particle": "block/copper_block" + "0": "create:block/hose", + "particle": "create:block/fluid_tank_inner" }, "elements": [ { - "name": "rope", - "from": [6, 2, 6], - "to": [10, 16, 10], - "rotation": {"angle": 0, "axis": "y", "origin": [7.75, 13, 8]}, - "faces": { - "north": {"uv": [12, 2, 16, 16], "texture": "#6"}, - "east": {"uv": [12, 2, 16, 16], "texture": "#6"}, - "south": {"uv": [12, 2, 16, 16], "texture": "#6"}, - "west": {"uv": [12, 2, 16, 16], "texture": "#6"}, - "up": {"uv": [12, 0, 16, 4], "rotation": 90, "texture": "#6"} - } - }, - { - "name": "drain 1", "from": [4.5, 0, 4.5], - "to": [11.5, 2, 11.5], - "rotation": {"angle": 0, "axis": "y", "origin": [6.75, 14, 6]}, - "faces": { - "north": {"uv": [0, 0, 7, 2], "texture": "#6"}, - "east": {"uv": [0, 0, 7, 2], "texture": "#6"}, - "south": {"uv": [0, 0, 7, 2], "texture": "#6"}, - "west": {"uv": [0, 0, 7, 2], "texture": "#6"}, - "down": {"uv": [0, 2, 7, 9], "texture": "#6"} - } - }, - { - "name": "drain 2", - "from": [4.5, 2, 4.5], "to": [11.5, 3, 11.5], - "rotation": {"angle": 0, "axis": "y", "origin": [6.75, 16, 6]}, + "rotation": {"angle": 0, "axis": "y", "origin": [5, 0, 4]}, "faces": { - "north": {"uv": [0, 1, 7, 2], "texture": "#6"}, - "east": {"uv": [0, 1, 7, 2], "texture": "#6"}, - "south": {"uv": [0, 1, 7, 2], "texture": "#6"}, - "west": {"uv": [0, 1, 7, 2], "texture": "#6"}, - "up": {"uv": [0, 2, 7, 9], "rotation": 90, "texture": "#6"}, - "down": {"uv": [0, 9, 7, 16], "texture": "#6"} + "north": {"uv": [7, 9, 10, 16], "rotation": 90, "texture": "#0"}, + "east": {"uv": [7, 9, 10, 16], "rotation": 90, "texture": "#0"}, + "south": {"uv": [7, 9, 10, 16], "rotation": 90, "texture": "#0"}, + "west": {"uv": [7, 9, 10, 16], "rotation": 90, "texture": "#0"}, + "up": {"uv": [0, 9, 7, 16], "texture": "#0"}, + "down": {"uv": [0, 2, 7, 9], "texture": "#0"} } }, { - "name": "drain 3", - "from": [5.5, 2, 5.5], + "from": [5.5, 3, 5.5], "to": [10.5, 5, 10.5], - "rotation": {"angle": 0, "axis": "y", "origin": [7.75, 16, 7]}, + "rotation": {"angle": 0, "axis": "y", "origin": [6, 3, 5]}, "faces": { - "north": {"uv": [7, 2, 10, 7], "rotation": 270, "texture": "#6"}, - "east": {"uv": [7, 2, 10, 7], "rotation": 270, "texture": "#6"}, - "south": {"uv": [7, 2, 10, 7], "rotation": 270, "texture": "#6"}, - "west": {"uv": [7, 2, 10, 7], "rotation": 270, "texture": "#6"}, - "up": {"uv": [1, 3, 6, 8], "rotation": 90, "texture": "#6"} + "north": {"uv": [7, 2, 9, 7], "rotation": 90, "texture": "#0"}, + "east": {"uv": [7, 2, 9, 7], "rotation": 90, "texture": "#0"}, + "south": {"uv": [7, 2, 9, 7], "rotation": 90, "texture": "#0"}, + "west": {"uv": [7, 2, 9, 7], "rotation": 90, "texture": "#0"}, + "up": {"uv": [0, 9, 7, 16], "texture": "#0"}, + "down": {"uv": [0, 2, 7, 9], "texture": "#0"} + } + }, + { + "from": [5.95, 2, 5.95], + "to": [10.05, 16, 10.05], + "rotation": {"angle": 0, "axis": "y", "origin": [6, 2, 6]}, + "faces": { + "north": {"uv": [12, 2, 16, 16], "texture": "#0"}, + "east": {"uv": [12, 2, 16, 16], "texture": "#0"}, + "south": {"uv": [12, 2, 16, 16], "texture": "#0"}, + "west": {"uv": [12, 2, 16, 16], "texture": "#0"}, + "up": {"uv": [12, 1, 16, 5], "texture": "#0"} } } ], - "display": { - "thirdperson_righthand": { - "rotation": [75, 45, 0], - "translation": [0, 2.5, 0], - "scale": [0.375, 0.375, 0.375] - }, - "thirdperson_lefthand": { - "rotation": [75, 45, 0], - "translation": [0, 2.5, 0], - "scale": [0.375, 0.375, 0.375] - }, - "firstperson_righthand": { - "rotation": [0, 45, 0], - "scale": [0.4, 0.4, 0.4] - }, - "firstperson_lefthand": { - "rotation": [0, 225, 0], - "scale": [0.4, 0.4, 0.4] - }, - "ground": { - "translation": [0, 3, 0], - "scale": [0.25, 0.25, 0.25] - }, - "gui": { - "rotation": [30, 225, 0], - "scale": [0.625, 0.625, 0.625] - }, - "fixed": { - "scale": [0.5, 0.5, 0.5] - } - }, "groups": [ { - "name": "rope_half_magnet", + "name": "hose", "origin": [8, 8, 8], - "children": [0, 1, 2, 3] + "color": 0, + "children": [0, 1, 2] } ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/hose_pulley/rope.json b/src/main/resources/assets/create/models/block/hose_pulley/rope.json index 2995519fd0..ab6c0117a5 100644 --- a/src/main/resources/assets/create/models/block/hose_pulley/rope.json +++ b/src/main/resources/assets/create/models/block/hose_pulley/rope.json @@ -1,7 +1,24 @@ { - "parent": "create:block/rope_pulley/rope", + "credit": "Made with Blockbench", + "parent": "block/block", "textures": { - "5": "create:block/hose_pulley_rope", - "particle": "create:block/hose_pulley_rope" - } + "5": "create:block/hose", + "particle": "create:block/hose" + }, + "elements": [ + { + "name": "rope", + "from": [5.95, 0, 5.95], + "to": [10.05, 16, 10.05], + "rotation": {"angle": 0, "axis": "y", "origin": [7.75, 0, 8]}, + "faces": { + "north": {"uv": [12, 0, 16, 16], "texture": "#5"}, + "east": {"uv": [12, 0, 16, 16], "texture": "#5"}, + "south": {"uv": [12, 0, 16, 16], "texture": "#5"}, + "west": {"uv": [12, 0, 16, 16], "texture": "#5"}, + "up": {"uv": [12, 0, 16, 4], "rotation": 90, "texture": "#5"}, + "down": {"uv": [12, 0, 16, 4], "texture": "#5"} + } + } + ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/hose_pulley/rope_coil.json b/src/main/resources/assets/create/models/block/hose_pulley/rope_coil.json deleted file mode 100644 index c8c41e1263..0000000000 --- a/src/main/resources/assets/create/models/block/hose_pulley/rope_coil.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "credit": "Made with Blockbench", - "parent": "block/block", - "textures": { - "5": "create:block/hose_pulley_rope" - }, - "elements": [ - { - "name": "coil", - "from": [4, 4, 2], - "to": [12, 12, 14], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": -45, "axis": "z", "origin": [8, 8, -10]}, - "faces": { - "east": {"uv": [2, 1, 14, 9], "texture": "#5"}, - "west": {"uv": [2, 1, 14, 9], "rotation": 180, "texture": "#5"}, - "up": {"uv": [2, 1, 14, 9], "rotation": 270, "texture": "#5"}, - "down": {"uv": [2, 1, 14, 9], "rotation": 90, "texture": "#5"} - } - }, - { - "name": "coil", - "from": [3.5, 3.5, 3], - "to": [12.5, 12.5, 7], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": 45, "axis": "z", "origin": [8, 8, -10]}, - "faces": { - "north": {"uv": [0, 0, 1, 1], "texture": "#5"}, - "east": {"uv": [0, 3, 4, 12], "rotation": 180, "texture": "#5"}, - "south": {"uv": [0, 0, 1, 1], "texture": "#5"}, - "west": {"uv": [0, 3, 4, 12], "texture": "#5"}, - "up": {"uv": [0, 3, 4, 12], "rotation": 90, "texture": "#5"}, - "down": {"uv": [0, 3, 4, 12], "rotation": 270, "texture": "#5"} - } - }, - { - "name": "coil", - "from": [3.5, 3.5, 9], - "to": [12.5, 12.5, 13], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": 45, "axis": "z", "origin": [8, 8, -4]}, - "faces": { - "north": {"uv": [0, 0, 1, 1], "texture": "#5"}, - "east": {"uv": [0, 3, 4, 12], "rotation": 180, "texture": "#5"}, - "south": {"uv": [0, 0, 1, 1], "texture": "#5"}, - "west": {"uv": [0, 3, 4, 12], "texture": "#5"}, - "up": {"uv": [0, 3, 4, 12], "rotation": 90, "texture": "#5"}, - "down": {"uv": [0, 3, 4, 12], "rotation": 270, "texture": "#5"} - } - } - ] -} diff --git a/src/main/resources/assets/create/models/block/hose_pulley/rope_half.json b/src/main/resources/assets/create/models/block/hose_pulley/rope_half.json index facd4b8b81..572ac7741f 100644 --- a/src/main/resources/assets/create/models/block/hose_pulley/rope_half.json +++ b/src/main/resources/assets/create/models/block/hose_pulley/rope_half.json @@ -1,7 +1,24 @@ { - "parent": "create:block/rope_pulley/rope_half", + "credit": "Made with Blockbench", + "parent": "block/block", "textures": { - "5": "create:block/hose_pulley_rope", - "particle": "create:block/hose_pulley_rope" - } + "5": "create:block/hose", + "particle": "create:block/hose" + }, + "elements": [ + { + "name": "rope", + "from": [5.95, 0, 5.95], + "to": [10.05, 8, 10.05], + "rotation": {"angle": 0, "axis": "y", "origin": [7.75, 0, 8]}, + "faces": { + "north": {"uv": [12, 8, 16, 16], "texture": "#5"}, + "east": {"uv": [12, 8, 16, 16], "texture": "#5"}, + "south": {"uv": [12, 8, 16, 16], "texture": "#5"}, + "west": {"uv": [12, 8, 16, 16], "texture": "#5"}, + "up": {"uv": [12, 0, 16, 4], "rotation": 90, "texture": "#5"}, + "down": {"uv": [12, 0, 16, 4], "texture": "#5"} + } + } + ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/hose_pulley/rope_half_magnet.json b/src/main/resources/assets/create/models/block/hose_pulley/rope_half_magnet.json index e84c544026..bf45425b7a 100644 --- a/src/main/resources/assets/create/models/block/hose_pulley/rope_half_magnet.json +++ b/src/main/resources/assets/create/models/block/hose_pulley/rope_half_magnet.json @@ -1,101 +1,55 @@ { "credit": "Made with Blockbench", - "parent": "block/block", "textures": { - "6": "create:block/hose_pulley_magnet", - "particle": "block/copper_block" + "0": "create:block/hose", + "particle": "create:block/fluid_tank_inner" }, "elements": [ { - "name": "rope", - "from": [6, 2, 6], - "to": [10, 8, 10], - "rotation": {"angle": 0, "axis": "y", "origin": [7.75, 13, 8]}, - "faces": { - "north": {"uv": [12, 10, 16, 16], "texture": "#6"}, - "east": {"uv": [12, 10, 16, 16], "texture": "#6"}, - "south": {"uv": [12, 10, 16, 16], "texture": "#6"}, - "west": {"uv": [12, 10, 16, 16], "texture": "#6"}, - "up": {"uv": [12, 0, 16, 4], "rotation": 90, "texture": "#6"} - } - }, - { - "name": "drain 1", "from": [4.5, 0, 4.5], - "to": [11.5, 2, 11.5], - "rotation": {"angle": 0, "axis": "y", "origin": [6.75, 14, 6]}, - "faces": { - "north": {"uv": [0, 0, 7, 2], "texture": "#6"}, - "east": {"uv": [0, 0, 7, 2], "texture": "#6"}, - "south": {"uv": [0, 0, 7, 2], "texture": "#6"}, - "west": {"uv": [0, 0, 7, 2], "texture": "#6"}, - "down": {"uv": [0, 2, 7, 9], "texture": "#6"} - } - }, - { - "name": "drain 2", - "from": [4.5, 2, 4.5], "to": [11.5, 3, 11.5], - "rotation": {"angle": 0, "axis": "y", "origin": [6.75, 16, 6]}, + "rotation": {"angle": 0, "axis": "y", "origin": [5, 0, 4]}, "faces": { - "north": {"uv": [0, 1, 7, 2], "texture": "#6"}, - "east": {"uv": [0, 1, 7, 2], "texture": "#6"}, - "south": {"uv": [0, 1, 7, 2], "texture": "#6"}, - "west": {"uv": [0, 1, 7, 2], "texture": "#6"}, - "up": {"uv": [0, 2, 7, 9], "rotation": 90, "texture": "#6"}, - "down": {"uv": [0, 9, 7, 16], "texture": "#6"} + "north": {"uv": [7, 9, 10, 16], "rotation": 90, "texture": "#0"}, + "east": {"uv": [7, 9, 10, 16], "rotation": 90, "texture": "#0"}, + "south": {"uv": [7, 9, 10, 16], "rotation": 90, "texture": "#0"}, + "west": {"uv": [7, 9, 10, 16], "rotation": 90, "texture": "#0"}, + "up": {"uv": [0, 9, 7, 16], "texture": "#0"}, + "down": {"uv": [0, 2, 7, 9], "texture": "#0"} } }, { - "name": "drain 3", - "from": [5.5, 2, 5.5], + "from": [5.5, 3, 5.5], "to": [10.5, 5, 10.5], - "rotation": {"angle": 0, "axis": "y", "origin": [7.75, 16, 7]}, + "rotation": {"angle": 0, "axis": "y", "origin": [6, 3, 5]}, "faces": { - "north": {"uv": [7, 2, 10, 7], "rotation": 270, "texture": "#6"}, - "east": {"uv": [7, 2, 10, 7], "rotation": 270, "texture": "#6"}, - "south": {"uv": [7, 2, 10, 7], "rotation": 270, "texture": "#6"}, - "west": {"uv": [7, 2, 10, 7], "rotation": 270, "texture": "#6"}, - "up": {"uv": [1, 3, 6, 8], "rotation": 90, "texture": "#6"} + "north": {"uv": [7, 2, 9, 7], "rotation": 90, "texture": "#0"}, + "east": {"uv": [7, 2, 9, 7], "rotation": 90, "texture": "#0"}, + "south": {"uv": [7, 2, 9, 7], "rotation": 90, "texture": "#0"}, + "west": {"uv": [7, 2, 9, 7], "rotation": 90, "texture": "#0"}, + "up": {"uv": [0, 9, 7, 16], "texture": "#0"}, + "down": {"uv": [0, 2, 7, 9], "texture": "#0"} + } + }, + { + "from": [5.95, 2, 5.95], + "to": [10.05, 8, 10.05], + "rotation": {"angle": 0, "axis": "y", "origin": [6, 2, 6]}, + "faces": { + "north": {"uv": [12, 10, 16, 16], "texture": "#0"}, + "east": {"uv": [12, 10, 16, 16], "texture": "#0"}, + "south": {"uv": [12, 10, 16, 16], "texture": "#0"}, + "west": {"uv": [12, 10, 16, 16], "texture": "#0"}, + "up": {"uv": [12, 1, 16, 5], "texture": "#0"} } } ], - "display": { - "thirdperson_righthand": { - "rotation": [75, 45, 0], - "translation": [0, 2.5, 0], - "scale": [0.375, 0.375, 0.375] - }, - "thirdperson_lefthand": { - "rotation": [75, 45, 0], - "translation": [0, 2.5, 0], - "scale": [0.375, 0.375, 0.375] - }, - "firstperson_righthand": { - "rotation": [0, 45, 0], - "scale": [0.4, 0.4, 0.4] - }, - "firstperson_lefthand": { - "rotation": [0, 225, 0], - "scale": [0.4, 0.4, 0.4] - }, - "ground": { - "translation": [0, 3, 0], - "scale": [0.25, 0.25, 0.25] - }, - "gui": { - "rotation": [30, 225, 0], - "scale": [0.625, 0.625, 0.625] - }, - "fixed": { - "scale": [0.5, 0.5, 0.5] - } - }, "groups": [ { - "name": "rope_half_magnet", + "name": "hose", "origin": [8, 8, 8], - "children": [0, 1, 2, 3] + "color": 0, + "children": [0, 1, 2] } ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/rope_pulley/block.json b/src/main/resources/assets/create/models/block/rope_pulley/block.json index 7215d45774..abdcf92463 100644 --- a/src/main/resources/assets/create/models/block/rope_pulley/block.json +++ b/src/main/resources/assets/create/models/block/rope_pulley/block.json @@ -1,204 +1,162 @@ { "credit": "Made with Blockbench", - "parent": "block/block", "textures": { - "3": "create:block/gearbox_top", - "4": "create:block/gearbox", - "5": "create:block/andesite_casing", - "6": "create:block/pulley_top", - "particle": "create:block/pulley_rope" + "1": "create:block/rope_pulley", + "particle": "create:block/gearbox" }, "elements": [ { - "name": "side", "from": [2, 2, 14], "to": [14, 14, 15], - "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [2, 2, 14, 14], "texture": "#4"}, - "south": {"uv": [2, 2, 14, 14], "texture": "#4"} + "south": {"uv": [1, 1, 7, 7], "texture": "#1"} + } + }, + { + "from": [3, 0, 2], + "to": [13, 2, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [14, 0, 14]}, + "faces": { + "east": {"uv": [1, 8, 7, 9], "rotation": 180, "texture": "#1"}, + "west": {"uv": [1, 8, 7, 9], "rotation": 180, "texture": "#1"}, + "down": {"uv": [9, 1.5, 15, 6.5], "rotation": 270, "texture": "#1"} + } + }, + { + "from": [0, 0, 14], + "to": [2, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [15, 0, 16, 8], "texture": "#1"}, + "east": {"uv": [0, 0, 1, 8], "texture": "#1"}, + "south": {"uv": [0, 0, 1, 8], "texture": "#1"}, + "west": {"uv": [7, 8, 8, 16], "texture": "#1"}, + "up": {"uv": [8, 8, 9, 9], "rotation": 270, "texture": "#1"}, + "down": {"uv": [8, 15, 9, 16], "rotation": 90, "texture": "#1"} + } + }, + { + "from": [14, 0, 14], + "to": [16, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [8, 0, 9, 8], "texture": "#1"}, + "east": {"uv": [0, 8, 1, 16], "texture": "#1"}, + "south": {"uv": [7, 0, 8, 8], "texture": "#1"}, + "west": {"uv": [7, 0, 8, 8], "texture": "#1"}, + "up": {"uv": [8, 15, 9, 16], "rotation": 270, "texture": "#1"}, + "down": {"uv": [8, 8, 9, 9], "rotation": 90, "texture": "#1"} + } + }, + { + "from": [3, 14, 2], + "to": [13, 16, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "east": {"uv": [1, 8, 7, 9], "texture": "#1"}, + "west": {"uv": [1, 8, 7, 9], "texture": "#1"}, + "up": {"uv": [9, 9.5, 15, 14.5], "rotation": 90, "texture": "#1"} + } + }, + { + "from": [2, 14, 14], + "to": [14, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [9, 0, 15, 1], "texture": "#1"}, + "south": {"uv": [1, 0, 7, 1], "texture": "#1"}, + "up": {"uv": [8, 9, 9, 15], "rotation": 270, "texture": "#1"}, + "down": {"uv": [1, 1, 7, 1.5], "rotation": 270, "texture": "#1"} + } + }, + { + "from": [2, 0, 14], + "to": [14, 2, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [9, 7, 15, 8], "texture": "#1"}, + "south": {"uv": [1, 7, 7, 8], "texture": "#1"}, + "up": {"uv": [1, 7.5, 7.5, 8], "rotation": 90, "texture": "#1"}, + "down": {"uv": [8, 9, 9, 15], "rotation": 90, "texture": "#1"} + } + }, + { + "from": [14, 0, 0], + "to": [16, 16, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 0, 1, 8], "texture": "#1"}, + "east": {"uv": [7, 8, 8, 16], "texture": "#1"}, + "south": {"uv": [15, 0, 16, 8], "texture": "#1"}, + "west": {"uv": [0, 0, 1, 8], "texture": "#1"}, + "up": {"uv": [8, 8, 9, 9], "rotation": 90, "texture": "#1"}, + "down": {"uv": [8, 15, 9, 16], "rotation": 270, "texture": "#1"} } }, { - "name": "side", "from": [2, 2, 1], "to": [14, 14, 2], - "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [14, 2, 2, 14], "texture": "#4"}, - "south": {"uv": [14, 2, 2, 14], "texture": "#4"} + "north": {"uv": [1, 1, 7, 7], "texture": "#1"} } }, { - "name": "side_frame", - "from": [0, 2, 14], - "to": [2, 14, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]}, + "from": [2, 14, 0], + "to": [14, 16, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [14, 2, 16, 14], "texture": "#4"}, - "east": {"uv": [0, 2, 2, 14], "texture": "#4"}, - "south": {"uv": [0, 2, 2, 14], "texture": "#4"}, - "west": {"uv": [2, 2, 0, 14], "texture": "#4"}, - "up": {"uv": [0, 14, 2, 16], "texture": "#4"}, - "down": {"uv": [0, 0, 2, 2], "texture": "#4"} + "north": {"uv": [1, 0, 7, 1], "texture": "#1"}, + "south": {"uv": [9, 0, 15, 1], "texture": "#1"}, + "up": {"uv": [8, 9, 9, 15], "rotation": 90, "texture": "#1"}, + "down": {"uv": [1, 1, 7, 1.5], "rotation": 90, "texture": "#1"} } }, { - "name": "side_frame", - "from": [0, 2, 0], - "to": [2, 14, 2], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]}, - "faces": { - "north": {"uv": [2, 2, 0, 14], "texture": "#4"}, - "east": {"uv": [2, 2, 0, 14], "texture": "#4"}, - "south": {"uv": [16, 2, 14, 14], "texture": "#4"}, - "west": {"uv": [0, 2, 2, 14], "texture": "#4"}, - "up": {"uv": [0, 16, 2, 14], "texture": "#4"}, - "down": {"uv": [0, 2, 2, 0], "texture": "#4"} - } - }, - { - "name": "side_frame", - "from": [14, 2, 14], - "to": [16, 14, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]}, - "faces": { - "north": {"uv": [2, 2, 0, 14], "rotation": 180, "texture": "#4"}, - "east": {"uv": [2, 2, 0, 14], "rotation": 180, "texture": "#3"}, - "south": {"uv": [16, 2, 14, 14], "rotation": 180, "texture": "#4"}, - "west": {"uv": [2, 2, 0, 14], "texture": "#4"}, - "up": {"uv": [2, 14, 0, 16], "texture": "#4"}, - "down": {"uv": [2, 0, 0, 2], "texture": "#4"} - } - }, - { - "name": "side_frame", - "from": [14, 2, 0], - "to": [16, 14, 2], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]}, - "faces": { - "north": {"uv": [14, 2, 16, 14], "rotation": 180, "texture": "#4"}, - "east": {"uv": [0, 2, 2, 14], "rotation": 180, "texture": "#3"}, - "south": {"uv": [0, 2, 2, 14], "rotation": 180, "texture": "#4"}, - "west": {"uv": [0, 2, 2, 14], "texture": "#4"}, - "up": {"uv": [2, 16, 0, 14], "texture": "#4"}, - "down": {"uv": [2, 2, 0, 0], "texture": "#4"} - } - }, - { - "name": "side_frame", - "from": [0, 0, 14], - "to": [16, 2, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]}, - "faces": { - "north": {"uv": [0, 14, 16, 16], "texture": "#4"}, - "east": {"uv": [0, 14, 2, 16], "texture": "#4"}, - "south": {"uv": [0, 14, 16, 16], "texture": "#4"}, - "west": {"uv": [14, 14, 16, 16], "texture": "#4"}, - "up": {"uv": [0, 2, 16, 0], "texture": "#4"}, - "down": {"uv": [0, 14, 16, 16], "rotation": 180, "texture": "#3"} - } - }, - { - "name": "side_frame", - "from": [0, 14, 14], - "to": [16, 16, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 15, 8]}, - "faces": { - "north": {"uv": [0, 16, 16, 14], "texture": "#4"}, - "east": {"uv": [0, 0, 2, 2], "texture": "#4"}, - "south": {"uv": [0, 0, 16, 2], "texture": "#4"}, - "west": {"uv": [2, 0, 0, 2], "texture": "#4"}, - "up": {"uv": [0, 0, 16, 2], "rotation": 180, "texture": "#3"}, - "down": {"uv": [0, 0, 16, 2], "texture": "#4"} - } - }, - { - "name": "side_frame", "from": [0, 0, 0], - "to": [16, 2, 2], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]}, + "to": [2, 16, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [16, 14, 0, 16], "texture": "#4"}, - "east": {"uv": [2, 14, 0, 16], "texture": "#4"}, - "south": {"uv": [16, 14, 0, 16], "texture": "#4"}, - "west": {"uv": [16, 14, 14, 16], "texture": "#4"}, - "up": {"uv": [0, 0, 16, 2], "texture": "#4"}, - "down": {"uv": [0, 14, 16, 16], "texture": "#3"} + "north": {"uv": [7, 0, 8, 8], "texture": "#1"}, + "east": {"uv": [7, 0, 8, 8], "texture": "#1"}, + "south": {"uv": [8, 0, 9, 8], "texture": "#1"}, + "west": {"uv": [0, 8, 1, 16], "texture": "#1"}, + "up": {"uv": [8, 15, 9, 16], "rotation": 90, "texture": "#1"}, + "down": {"uv": [8, 8, 9, 9], "rotation": 270, "texture": "#1"} } }, { - "name": "side_frame", - "from": [0, 14, 0], - "to": [16, 16, 2], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 15, 8]}, + "from": [2, 0, 0], + "to": [14, 2, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [16, 0, 0, 2], "texture": "#4"}, - "east": {"uv": [2, 0, 0, 2], "texture": "#4"}, - "south": {"uv": [16, 16, 0, 14], "texture": "#4"}, - "west": {"uv": [0, 0, 2, 2], "texture": "#4"}, - "up": {"uv": [0, 2, 16, 0], "rotation": 180, "texture": "#3"}, - "down": {"uv": [0, 2, 16, 0], "texture": "#4"} + "north": {"uv": [1, 7, 7, 8], "texture": "#1"}, + "south": {"uv": [9, 7, 15, 8], "texture": "#1"}, + "up": {"uv": [1, 7.5, 7.5, 8], "rotation": 270, "texture": "#1"}, + "down": {"uv": [8, 9, 9, 15], "rotation": 270, "texture": "#1"} } }, { - "name": "front", - "from": [1, 1, 2], - "to": [3, 3, 14], - "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, + "from": [2, 2, 1], + "to": [14, 14, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "east": {"uv": [2, 0, 14, 2], "texture": "#3"}, - "west": {"uv": [2, 14, 14, 16], "texture": "#3"}, - "up": {"uv": [2, 0, 14, 2], "rotation": 90, "texture": "#3"}, - "down": {"uv": [2, 14, 14, 16], "rotation": 90, "texture": "#3"} + "east": {"uv": [6.5, 9, 7, 15], "texture": "#1"}, + "west": {"uv": [1, 9, 1.5, 15], "texture": "#1"}, + "up": {"uv": [6.5, 9, 7, 15], "rotation": 90, "texture": "#1"}, + "down": {"uv": [1, 9, 1.5, 15], "rotation": 270, "texture": "#1"} } }, { - "name": "front", - "from": [13, 1, 2], - "to": [15, 3, 14], - "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, + "from": [2, 2, 13], + "to": [14, 14, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "east": {"uv": [14, 14, 2, 16], "texture": "#3"}, - "west": {"uv": [14, 0, 2, 2], "texture": "#3"}, - "up": {"uv": [2, 2, 14, 0], "rotation": 90, "texture": "#3"}, - "down": {"uv": [2, 16, 14, 14], "rotation": 90, "texture": "#3"} - } - }, - { - "name": "front", - "from": [13, 13, 2], - "to": [15, 15, 14], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 8]}, - "faces": { - "east": {"uv": [14, 2, 2, 0], "texture": "#3"}, - "west": {"uv": [14, 2, 2, 0], "texture": "#3"}, - "up": {"uv": [14, 16, 2, 14], "rotation": 90, "texture": "#3"}, - "down": {"uv": [14, 2, 2, 0], "rotation": 90, "texture": "#3"} - } - }, - { - "name": "front", - "from": [1, 13, 2], - "to": [3, 15, 14], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 8]}, - "faces": { - "east": {"uv": [2, 2, 14, 0], "texture": "#3"}, - "west": {"uv": [2, 2, 14, 0], "texture": "#3"}, - "up": {"uv": [14, 14, 2, 16], "rotation": 90, "texture": "#3"}, - "down": {"uv": [14, 0, 2, 2], "rotation": 90, "texture": "#3"} - } - }, - { - "name": "top", - "from": [2, 14, 2], - "to": [14, 16, 14], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 8]}, - "faces": { - "east": {"uv": [2, 1, 14, 3], "rotation": 180, "texture": "#6"}, - "west": {"uv": [2, 13, 14, 15], "texture": "#6"}, - "up": {"uv": [2, 2, 14, 14], "rotation": 90, "texture": "#6"}, - "down": {"uv": [2, 2, 14, 14], "rotation": 90, "texture": "#5"} + "east": {"uv": [1, 9, 1.5, 15], "texture": "#1"}, + "west": {"uv": [6.5, 9, 7, 15], "texture": "#1"}, + "up": {"uv": [1, 9, 1.5, 15], "rotation": 90, "texture": "#1"}, + "down": {"uv": [6.5, 9, 7, 15], "rotation": 270, "texture": "#1"} } } ] diff --git a/src/main/resources/assets/create/models/block/rope_pulley/item.json b/src/main/resources/assets/create/models/block/rope_pulley/item.json index fab68e5d39..445318b40f 100644 --- a/src/main/resources/assets/create/models/block/rope_pulley/item.json +++ b/src/main/resources/assets/create/models/block/rope_pulley/item.json @@ -3,78 +3,192 @@ "parent": "block/block", "textures": { "0": "create:block/axis", - "1": "create:block/axis_top", - "3": "create:block/gearbox_top", - "4": "create:block/gearbox", - "5": "create:block/pulley_rope", + "1": "create:block/rope_pulley", + "2": "create:block/rope_pulley_coil", "6": "create:block/pulley_magnet", - "7": "create:block/andesite_casing", - "8": "create:block/pulley_top", - "particle": "create:block/pulley_top" + "1_1": "create:block/axis_top", + "3_1": "create:block/chute_large", + "particle": "create:block/pulley_magnet" }, "elements": [ { - "name": "coil", - "from": [4, 4, 2], - "to": [12, 12, 14], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": -45, "axis": "z", "origin": [8, 8, -10]}, + "from": [14, 2, 2], + "to": [15, 14, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [14, 2, 2]}, "faces": { - "east": {"uv": [0, 0, 12, 8], "texture": "#5"}, - "west": {"uv": [0, 0, 12, 8], "texture": "#5"}, - "up": {"uv": [0, 0, 12, 8], "rotation": 90, "texture": "#5"}, - "down": {"uv": [0, 0, 12, 8], "rotation": 90, "texture": "#5"} + "east": {"uv": [1, 1, 7, 7], "texture": "#1"} } }, { - "name": "coil", - "from": [3.5, 3.5, 9], - "to": [12.5, 12.5, 13], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": -45, "axis": "z", "origin": [8, 8, -10]}, + "from": [14, 0, 14], + "to": [16, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [14, 0, 14]}, "faces": { - "north": {"uv": [0, 0, 9, 9], "texture": "#5"}, - "east": {"uv": [0, 0, 4, 9], "texture": "#5"}, - "south": {"uv": [0, 0, 9, 9], "texture": "#5"}, - "west": {"uv": [0, 0, 4, 9], "rotation": 180, "texture": "#5"}, - "up": {"uv": [0, 0, 4, 9], "rotation": 90, "texture": "#5"}, - "down": {"uv": [0, 0, 4, 9], "rotation": 90, "texture": "#5"} + "north": {"uv": [0, 0, 1, 8], "texture": "#1"}, + "east": {"uv": [0, 0, 1, 8], "texture": "#1"}, + "south": {"uv": [7, 8, 8, 16], "texture": "#1"}, + "west": {"uv": [15, 0, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 8, 9, 9], "rotation": 180, "texture": "#1"}, + "down": {"uv": [8, 15, 9, 16], "rotation": 180, "texture": "#1"} } }, { - "name": "coil", - "from": [3.5, 3.5, 3], - "to": [12.5, 12.5, 7], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": 45, "axis": "z", "origin": [8, 8, -10]}, + "from": [14, 0, 0], + "to": [16, 16, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [14, 0, 0]}, "faces": { - "north": {"uv": [0, 0, 9, 9], "texture": "#5"}, - "east": {"uv": [0, 0, 4, 9], "texture": "#5"}, - "south": {"uv": [0, 0, 9, 9], "texture": "#5"}, - "west": {"uv": [0, 0, 4, 9], "rotation": 180, "texture": "#5"}, - "up": {"uv": [0, 0, 4, 9], "rotation": 90, "texture": "#5"}, - "down": {"uv": [0, 0, 4, 9], "rotation": 90, "texture": "#5"} + "north": {"uv": [0, 8, 1, 16], "texture": "#1"}, + "east": {"uv": [7, 0, 8, 8], "texture": "#1"}, + "south": {"uv": [7, 0, 8, 8], "texture": "#1"}, + "west": {"uv": [8, 0, 9, 8], "texture": "#1"}, + "up": {"uv": [8, 15, 9, 16], "rotation": 180, "texture": "#1"}, + "down": {"uv": [8, 8, 9, 9], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [2, 14, 3], + "to": [14, 16, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [14, 14, 2]}, + "faces": { + "north": {"uv": [1, 8, 7, 9], "texture": "#1"}, + "south": {"uv": [1, 8, 7, 9], "texture": "#1"}, + "up": {"uv": [9, 9.5, 15, 14.5], "texture": "#1"} + } + }, + { + "from": [14, 14, 2], + "to": [16, 16, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [26, 14, 2]}, + "faces": { + "east": {"uv": [1, 0, 7, 1], "texture": "#1"}, + "west": {"uv": [9, 0, 15, 1], "texture": "#1"}, + "up": {"uv": [8, 9, 9, 15], "rotation": 180, "texture": "#1"}, + "down": {"uv": [1, 1, 7, 1.5], "texture": "#1"} + } + }, + { + "from": [14, 0, 2], + "to": [16, 2, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [26, 0, 2]}, + "faces": { + "east": {"uv": [1, 7, 7, 8], "texture": "#1"}, + "west": {"uv": [9, 7, 15, 8], "texture": "#1"}, + "up": {"uv": [1, 7.5, 7.5, 8], "texture": "#1"}, + "down": {"uv": [8, 9, 9, 15], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [0, 0, 0], + "to": [2, 16, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 0, 2]}, + "faces": { + "north": {"uv": [7, 8, 8, 16], "texture": "#1"}, + "east": {"uv": [15, 0, 16, 8], "texture": "#1"}, + "south": {"uv": [0, 0, 1, 8], "texture": "#1"}, + "west": {"uv": [0, 0, 1, 8], "texture": "#1"}, + "up": {"uv": [8, 8, 9, 9], "texture": "#1"}, + "down": {"uv": [8, 15, 9, 16], "texture": "#1"} + } + }, + { + "from": [1, 2, 2], + "to": [2, 14, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 2, 14]}, + "faces": { + "west": {"uv": [1, 1, 7, 7], "texture": "#1"} + } + }, + { + "from": [0, 14, 2], + "to": [2, 16, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [-10, 14, 14]}, + "faces": { + "east": {"uv": [9, 0, 15, 1], "texture": "#1"}, + "west": {"uv": [1, 0, 7, 1], "texture": "#1"}, + "up": {"uv": [8, 9, 9, 15], "texture": "#1"}, + "down": {"uv": [1, 1, 7, 1.5], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [0, 0, 14], + "to": [2, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 0, 16]}, + "faces": { + "north": {"uv": [7, 0, 8, 8], "texture": "#1"}, + "east": {"uv": [8, 0, 9, 8], "texture": "#1"}, + "south": {"uv": [0, 8, 1, 16], "texture": "#1"}, + "west": {"uv": [7, 0, 8, 8], "texture": "#1"}, + "up": {"uv": [8, 15, 9, 16], "texture": "#1"}, + "down": {"uv": [8, 8, 9, 9], "texture": "#1"} + } + }, + { + "from": [0, 0, 2], + "to": [2, 2, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [-10, 0, 14]}, + "faces": { + "east": {"uv": [9, 7, 15, 8], "texture": "#1"}, + "west": {"uv": [1, 7, 7, 8], "texture": "#1"}, + "up": {"uv": [1, 7.5, 7.5, 8], "rotation": 180, "texture": "#1"}, + "down": {"uv": [8, 9, 9, 15], "texture": "#1"} + } + }, + { + "from": [2, 2, 2], + "to": [14, 14, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 2, 2]}, + "faces": { + "north": {"uv": [1, 9, 7, 15], "texture": "#1"}, + "south": {"uv": [1, 9, 7, 15], "texture": "#1"}, + "up": {"uv": [1, 9, 7, 15], "texture": "#1"}, + "down": {"uv": [1, 9, 7, 15], "texture": "#1"} } }, { "name": "Axis", - "from": [6, 6, 0], - "to": [10, 10, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [24, 1, -8]}, + "from": [0, 6, 6], + "to": [16, 10, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, "faces": { - "north": {"uv": [6, 6, 10, 10], "rotation": 180, "texture": "#1"}, - "east": {"uv": [6, 0, 10, 16], "rotation": 90, "texture": "#0"}, - "south": {"uv": [6, 6, 10, 10], "texture": "#1"}, - "west": {"uv": [6, 0, 10, 16], "rotation": 270, "texture": "#0"}, - "up": {"uv": [6, 0, 10, 16], "texture": "#0"}, - "down": {"uv": [6, 0, 10, 16], "rotation": 180, "texture": "#0"} + "north": {"uv": [6, 0, 10, 16], "rotation": 90, "texture": "#0"}, + "east": {"uv": [6, 6, 10, 10], "rotation": 270, "texture": "#1_1"}, + "south": {"uv": [6, 0, 10, 16], "rotation": 270, "texture": "#0"}, + "west": {"uv": [6, 6, 10, 10], "rotation": 270, "texture": "#1_1"}, + "up": {"uv": [6, 0, 10, 16], "rotation": 270, "texture": "#0"}, + "down": {"uv": [6, 0, 10, 16], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [3, 2, 2], + "to": [13, 14, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [3, 2, 2]}, + "faces": { + "north": {"uv": [3, 2, 13, 14], "texture": "#2"}, + "up": {"uv": [3, 0, 13, 2], "rotation": 180, "texture": "#2"} + } + }, + { + "from": [3, 2, 12], + "to": [13, 14, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [3, 2, 12]}, + "faces": { + "south": {"uv": [3, 2, 13, 14], "texture": "#2"}, + "up": {"uv": [3, 0, 13, 2], "texture": "#2"} + } + }, + { + "from": [3, 2, 2], + "to": [13, 4, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "down": {"uv": [3, 2, 13, 14], "texture": "#2"} } }, { "name": "rope", - "from": [6.1, 2, 6], - "to": [10.1, 8, 10], - "rotation": {"angle": 0, "axis": "y", "origin": [23.75, 0, -8]}, + "from": [5.95, 0, 5.95], + "to": [10.05, 6, 10.05], + "rotation": {"angle": 0, "axis": "y", "origin": [7.75, -2, 8]}, "faces": { "north": {"uv": [12, 8, 16, 14], "texture": "#6"}, "east": {"uv": [12, 8, 16, 14], "texture": "#6"}, @@ -85,9 +199,9 @@ }, { "name": "magnet", - "from": [3.1, 0, 3], - "to": [13.1, 3, 13], - "rotation": {"angle": 0, "axis": "y", "origin": [24, 23, -8]}, + "from": [3, -2, 3], + "to": [13, 1, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 21, 8]}, "faces": { "north": {"uv": [0, 10, 10, 13], "texture": "#6"}, "east": {"uv": [0, 10, 10, 13], "texture": "#6"}, @@ -99,272 +213,61 @@ }, { "name": "magnet", - "from": [5.1, 2, 5], - "to": [11.1, 4, 11], - "rotation": {"angle": 0, "axis": "y", "origin": [24, 23, -8]}, + "from": [4.95, 1, 4.95], + "to": [11.05, 3, 11.05], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 21, 8]}, "faces": { "north": {"uv": [0, 13, 6, 15], "texture": "#6"}, "east": {"uv": [0, 13, 6, 15], "texture": "#6"}, "south": {"uv": [0, 13, 6, 15], "texture": "#6"}, "west": {"uv": [0, 13, 6, 15], "texture": "#6"}, - "up": {"uv": [2, 2, 8, 8], "texture": "#6"}, - "down": {"uv": [2, 2, 8, 8], "texture": "#6"} - } - }, - { - "name": "side", - "from": [2, 2, 14], - "to": [14, 14, 15], - "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, - "faces": { - "north": {"uv": [2, 2, 14, 14], "texture": "#4"}, - "south": {"uv": [2, 2, 14, 14], "texture": "#4"} - } - }, - { - "name": "side", - "from": [2, 2, 1], - "to": [14, 14, 2], - "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, - "faces": { - "north": {"uv": [14, 2, 2, 14], "texture": "#4"}, - "south": {"uv": [14, 2, 2, 14], "texture": "#4"} - } - }, - { - "name": "side_frame", - "from": [0, 2, 14], - "to": [2, 14, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]}, - "faces": { - "north": {"uv": [14, 2, 16, 14], "texture": "#3"}, - "east": {"uv": [0, 2, 2, 14], "texture": "#3"}, - "south": {"uv": [0, 2, 2, 14], "texture": "#3"}, - "west": {"uv": [2, 2, 0, 14], "texture": "#3"}, - "up": {"uv": [0, 14, 2, 16], "texture": "#3"}, - "down": {"uv": [0, 0, 2, 2], "texture": "#3"} - } - }, - { - "name": "side_frame", - "from": [0, 2, 0], - "to": [2, 14, 2], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]}, - "faces": { - "north": {"uv": [2, 2, 0, 14], "texture": "#3"}, - "east": {"uv": [2, 2, 0, 14], "texture": "#3"}, - "south": {"uv": [16, 2, 14, 14], "texture": "#3"}, - "west": {"uv": [0, 2, 2, 14], "texture": "#3"}, - "up": {"uv": [0, 16, 2, 14], "texture": "#3"}, - "down": {"uv": [0, 2, 2, 0], "texture": "#3"} - } - }, - { - "name": "side_frame", - "from": [14, 2, 14], - "to": [16, 14, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]}, - "faces": { - "north": {"uv": [2, 2, 0, 14], "rotation": 180, "texture": "#3"}, - "east": {"uv": [2, 2, 0, 14], "rotation": 180, "texture": "#3"}, - "south": {"uv": [16, 2, 14, 14], "rotation": 180, "texture": "#3"}, - "west": {"uv": [2, 2, 0, 14], "texture": "#3"}, - "up": {"uv": [2, 14, 0, 16], "texture": "#3"}, - "down": {"uv": [2, 0, 0, 2], "texture": "#3"} - } - }, - { - "name": "side_frame", - "from": [14, 2, 0], - "to": [16, 14, 2], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]}, - "faces": { - "north": {"uv": [14, 2, 16, 14], "rotation": 180, "texture": "#3"}, - "east": {"uv": [0, 2, 2, 14], "rotation": 180, "texture": "#3"}, - "south": {"uv": [0, 2, 2, 14], "rotation": 180, "texture": "#3"}, - "west": {"uv": [0, 2, 2, 14], "texture": "#3"}, - "up": {"uv": [2, 16, 0, 14], "texture": "#3"}, - "down": {"uv": [2, 2, 0, 0], "texture": "#3"} - } - }, - { - "name": "side_frame", - "from": [0, 0, 14], - "to": [16, 2, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]}, - "faces": { - "north": {"uv": [0, 14, 16, 16], "texture": "#3"}, - "east": {"uv": [0, 14, 2, 16], "texture": "#3"}, - "south": {"uv": [0, 14, 16, 16], "texture": "#3"}, - "west": {"uv": [14, 14, 16, 16], "texture": "#3"}, - "up": {"uv": [0, 2, 16, 0], "texture": "#3"}, - "down": {"uv": [0, 14, 16, 16], "rotation": 180, "texture": "#3"} - } - }, - { - "name": "side_frame", - "from": [0, 14, 14], - "to": [16, 16, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 15, 8]}, - "faces": { - "north": {"uv": [0, 16, 16, 14], "texture": "#3"}, - "east": {"uv": [0, 0, 2, 2], "texture": "#3"}, - "south": {"uv": [0, 0, 16, 2], "texture": "#3"}, - "west": {"uv": [2, 0, 0, 2], "texture": "#3"}, - "up": {"uv": [0, 0, 16, 2], "rotation": 180, "texture": "#3"}, - "down": {"uv": [0, 0, 16, 2], "texture": "#3"} - } - }, - { - "name": "side_frame", - "from": [0, 0, 0], - "to": [16, 2, 2], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]}, - "faces": { - "north": {"uv": [16, 14, 0, 16], "texture": "#3"}, - "east": {"uv": [2, 14, 0, 16], "texture": "#3"}, - "south": {"uv": [16, 14, 0, 16], "texture": "#3"}, - "west": {"uv": [16, 14, 14, 16], "texture": "#3"}, - "up": {"uv": [0, 0, 16, 2], "texture": "#3"}, - "down": {"uv": [0, 14, 16, 16], "texture": "#3"} - } - }, - { - "name": "side_frame", - "from": [0, 14, 0], - "to": [16, 16, 2], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 15, 8]}, - "faces": { - "north": {"uv": [16, 0, 0, 2], "texture": "#3"}, - "east": {"uv": [2, 0, 0, 2], "texture": "#3"}, - "south": {"uv": [16, 16, 0, 14], "texture": "#3"}, - "west": {"uv": [0, 0, 2, 2], "texture": "#3"}, - "up": {"uv": [0, 2, 16, 0], "rotation": 180, "texture": "#3"}, - "down": {"uv": [0, 2, 16, 0], "texture": "#3"} - } - }, - { - "name": "front", - "from": [1, 1, 2], - "to": [3, 3, 14], - "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, - "faces": { - "east": {"uv": [2, 0, 14, 2], "texture": "#3"}, - "west": {"uv": [2, 14, 14, 16], "texture": "#3"}, - "up": {"uv": [2, 0, 14, 2], "rotation": 90, "texture": "#3"}, - "down": {"uv": [2, 14, 14, 16], "rotation": 90, "texture": "#3"} - } - }, - { - "name": "front", - "from": [13, 1, 2], - "to": [15, 3, 14], - "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, - "faces": { - "east": {"uv": [14, 14, 2, 16], "texture": "#3"}, - "west": {"uv": [14, 0, 2, 2], "texture": "#3"}, - "up": {"uv": [2, 2, 14, 0], "rotation": 90, "texture": "#3"}, - "down": {"uv": [2, 16, 14, 14], "rotation": 90, "texture": "#3"} - } - }, - { - "name": "front", - "from": [13, 13, 2], - "to": [15, 15, 14], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 8]}, - "faces": { - "east": {"uv": [14, 2, 2, 0], "texture": "#3"}, - "west": {"uv": [14, 2, 2, 0], "texture": "#3"}, - "up": {"uv": [14, 16, 2, 14], "rotation": 90, "texture": "#3"}, - "down": {"uv": [14, 2, 2, 0], "rotation": 90, "texture": "#3"} - } - }, - { - "name": "front", - "from": [1, 13, 2], - "to": [3, 15, 14], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 8]}, - "faces": { - "east": {"uv": [2, 2, 14, 0], "texture": "#3"}, - "west": {"uv": [2, 2, 14, 0], "texture": "#3"}, - "up": {"uv": [14, 14, 2, 16], "rotation": 90, "texture": "#3"}, - "down": {"uv": [14, 0, 2, 2], "rotation": 90, "texture": "#3"} - } - }, - { - "name": "top", - "from": [2, 14, 2], - "to": [14, 16, 14], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 8]}, - "faces": { - "east": {"uv": [2, 1, 14, 3], "rotation": 180, "texture": "#8"}, - "west": {"uv": [2, 13, 14, 15], "texture": "#8"}, - "up": {"uv": [2, 2, 14, 14], "rotation": 90, "texture": "#8"}, - "down": {"uv": [2, 2, 14, 14], "rotation": 90, "texture": "#7"} + "up": {"uv": [10.5, 11, 13.5, 14], "texture": "#3_1"} } } ], "display": { - "thirdperson_righthand": { - "rotation": [75, 45, 0], - "translation": [0, 2.5, 0], - "scale": [0.375, 0.375, 0.375] - }, - "thirdperson_lefthand": { - "rotation": [75, 45, 0], - "translation": [0, 2.5, 0], - "scale": [0.375, 0.375, 0.375] - }, - "firstperson_righthand": { - "rotation": [0, 45, 0], - "scale": [0.4, 0.4, 0.4] - }, - "firstperson_lefthand": { - "rotation": [0, 225, 0], - "scale": [0.4, 0.4, 0.4] - }, - "ground": { - "translation": [0, 3, 0], - "scale": [0.25, 0.25, 0.25] - }, "gui": { - "rotation": [30, 225, 0], + "rotation": [30, 135, 0], "scale": [0.625, 0.625, 0.625] - }, - "fixed": { - "scale": [0.5, 0.5, 0.5] } }, "groups": [ 0, 1, 2, - { - "name": "shaft", - "origin": [8, 8, 8], - "color": 0, - "children": [3] - }, - { - "name": "rope_half_magnet", - "origin": [8, 8, 8], - "color": 0, - "children": [4, 5, 6] - }, + 3, + 4, + 5, + 6, 7, 8, 9, 10, 11, - 12, - 13, - 14, - 15, - 16, - 17, - 18, - 19, - 20, - 21 + { + "name": "shaft", + "origin": [8, 8, 8], + "color": 0, + "children": [12] + }, + { + "name": "rope_coil", + "origin": [8, 8, 8], + "color": 0, + "children": [ + { + "name": "hose coil", + "origin": [8, 8, 8], + "color": 0, + "children": [13, 14, 15] + } + ] + }, + { + "name": "rope_half_magnet", + "origin": [8, 8, 8], + "color": 0, + "children": [16, 17, 18] + } ] -} +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/rope_pulley/pulley_magnet.json b/src/main/resources/assets/create/models/block/rope_pulley/pulley_magnet.json index e46edc899d..882f4b42d3 100644 --- a/src/main/resources/assets/create/models/block/rope_pulley/pulley_magnet.json +++ b/src/main/resources/assets/create/models/block/rope_pulley/pulley_magnet.json @@ -22,29 +22,27 @@ }, { "name": "magnet", - "from": [3, 0, 3], - "to": [13, 3, 13], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 23, 8]}, + "from": [4.95, 2, 4.95], + "to": [11.05, 4, 11.05], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 22, 8]}, "faces": { - "north": {"uv": [0, 10, 10, 13], "texture": "#6"}, - "east": {"uv": [0, 10, 10, 13], "texture": "#6"}, - "south": {"uv": [0, 10, 10, 13], "texture": "#6"}, - "west": {"uv": [0, 10, 10, 13], "texture": "#6"}, - "up": {"uv": [0, 0, 10, 10], "texture": "#6"}, - "down": {"uv": [0, 0, 10, 10], "texture": "#6"} + "north": {"uv": [10, 12, 16, 14], "texture": "#6"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#6"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#6"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#6"}, + "up": {"uv": [10.5, 11, 13.5, 14], "texture": "#1"} } }, { - "name": "magnet", - "from": [4.95, 3, 4.95], - "to": [11.05, 5, 11.05], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 23, 8]}, + "from": [3, -3, 3], + "to": [13, 2, 13], "faces": { - "north": {"uv": [0, 13, 6, 15], "texture": "#6"}, - "east": {"uv": [0, 13, 6, 15], "texture": "#6"}, - "south": {"uv": [0, 13, 6, 15], "texture": "#6"}, - "west": {"uv": [0, 13, 6, 15], "texture": "#6"}, - "up": {"uv": [10.5, 11, 13.5, 14], "texture": "#1"} + "north": {"uv": [0, 10, 10, 15], "texture": "#6"}, + "east": {"uv": [0, 10, 10, 15], "texture": "#6"}, + "south": {"uv": [0, 10, 10, 15], "texture": "#6"}, + "west": {"uv": [0, 10, 10, 15], "texture": "#6"}, + "up": {"uv": [0, 0, 10, 10], "texture": "#6"}, + "down": {"uv": [0, 0, 10, 10], "texture": "#6"} } } ] diff --git a/src/main/resources/assets/create/models/block/rope_pulley/rope_coil.json b/src/main/resources/assets/create/models/block/rope_pulley/rope_coil.json index 8649b41042..8be2c184f8 100644 --- a/src/main/resources/assets/create/models/block/rope_pulley/rope_coil.json +++ b/src/main/resources/assets/create/models/block/rope_pulley/rope_coil.json @@ -1,52 +1,36 @@ { "credit": "Made with Blockbench", - "parent": "block/block", "textures": { - "5": "create:block/pulley_rope" + "2": "create:block/rope_pulley_coil" }, "elements": [ { - "name": "coil", - "from": [4, 4, 2], - "to": [12, 12, 14], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": -45, "axis": "z", "origin": [8, 8, -10]}, + "from": [12, 2, 3], + "to": [14, 14, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "east": {"uv": [0, 0, 12, 8], "texture": "#5"}, - "west": {"uv": [0, 0, 12, 8], "texture": "#5"}, - "up": {"uv": [0, 0, 12, 8], "rotation": 90, "texture": "#5"}, - "down": {"uv": [0, 0, 12, 8], "rotation": 90, "texture": "#5"} + "east": {"uv": [3, 14, 13, 2], "texture": "#2"}, + "up": {"uv": [3, 16, 13, 14], "rotation": 270, "texture": "#2"}, + "down": {"uv": [3, 2, 13, 0], "rotation": 90, "texture": "#2"} } }, { - "name": "coil", - "from": [3.5, 3.5, 9], - "to": [12.5, 12.5, 13], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": -45, "axis": "z", "origin": [8, 8, -10]}, + "from": [2, 2, 3], + "to": [4, 14, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { - "north": {"uv": [0, 0, 9, 9], "texture": "#5"}, - "east": {"uv": [0, 0, 4, 9], "texture": "#5"}, - "south": {"uv": [0, 0, 9, 9], "texture": "#5"}, - "west": {"uv": [0, 0, 4, 9], "rotation": 180, "texture": "#5"}, - "up": {"uv": [0, 0, 4, 9], "rotation": 90, "texture": "#5"}, - "down": {"uv": [0, 0, 4, 9], "rotation": 90, "texture": "#5"} - } - }, - { - "name": "coil", - "from": [3.5, 3.5, 3], - "to": [12.5, 12.5, 7], - "forge_data": {"calculate_normals": true}, - "rotation": {"angle": -45, "axis": "z", "origin": [8, 8, -10]}, - "faces": { - "north": {"uv": [0, 0, 9, 9], "texture": "#5"}, - "east": {"uv": [0, 0, 4, 9], "texture": "#5"}, - "south": {"uv": [0, 0, 9, 9], "texture": "#5"}, - "west": {"uv": [0, 0, 4, 9], "rotation": 180, "texture": "#5"}, - "up": {"uv": [0, 0, 4, 9], "rotation": 90, "texture": "#5"}, - "down": {"uv": [0, 0, 4, 9], "rotation": 90, "texture": "#5"} + "west": {"uv": [3, 2, 13, 14], "texture": "#2"}, + "up": {"uv": [3, 0, 13, 2], "rotation": 90, "texture": "#2"}, + "down": {"uv": [3, 14, 13, 16], "rotation": 270, "texture": "#2"} } } + ], + "groups": [ + { + "name": "hose coil", + "origin": [8, 8, 8], + "color": 0, + "children": [0, 1] + } ] -} +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/rope_pulley/rope_half_magnet.json b/src/main/resources/assets/create/models/block/rope_pulley/rope_half_magnet.json index cc63489903..d1e2bfa6a8 100644 --- a/src/main/resources/assets/create/models/block/rope_pulley/rope_half_magnet.json +++ b/src/main/resources/assets/create/models/block/rope_pulley/rope_half_magnet.json @@ -21,29 +21,27 @@ } }, { - "name": "magnet", - "from": [3, 0, 3], - "to": [13, 3, 13], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 23, 8]}, + "from": [3.05, -2.95, 3.05], + "to": [12.95, 1.95, 12.95], "faces": { - "north": {"uv": [0, 10, 10, 13], "texture": "#6"}, - "east": {"uv": [0, 10, 10, 13], "texture": "#6"}, - "south": {"uv": [0, 10, 10, 13], "texture": "#6"}, - "west": {"uv": [0, 10, 10, 13], "texture": "#6"}, + "north": {"uv": [0, 10, 10, 15], "texture": "#6"}, + "east": {"uv": [0, 10, 10, 15], "texture": "#6"}, + "south": {"uv": [0, 10, 10, 15], "texture": "#6"}, + "west": {"uv": [0, 10, 10, 15], "texture": "#6"}, "up": {"uv": [0, 0, 10, 10], "texture": "#6"}, "down": {"uv": [0, 0, 10, 10], "texture": "#6"} } }, { "name": "magnet", - "from": [4.95, 3, 4.95], - "to": [11.05, 5, 11.05], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 23, 8]}, + "from": [4.95, 1.9, 4.95], + "to": [11.05, 4, 11.05], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 22, 8]}, "faces": { - "north": {"uv": [0, 13, 6, 15], "texture": "#6"}, - "east": {"uv": [0, 13, 6, 15], "texture": "#6"}, - "south": {"uv": [0, 13, 6, 15], "texture": "#6"}, - "west": {"uv": [0, 13, 6, 15], "texture": "#6"}, + "north": {"uv": [10, 12, 16, 14], "texture": "#6"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#6"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#6"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#6"}, "up": {"uv": [10.5, 11, 13.5, 14], "texture": "#1"} } } diff --git a/src/main/resources/assets/create/models/block/steam_engine/gauge.json b/src/main/resources/assets/create/models/block/steam_engine/gauge.json index dc0a3e8af4..70cecd5b85 100644 --- a/src/main/resources/assets/create/models/block/steam_engine/gauge.json +++ b/src/main/resources/assets/create/models/block/steam_engine/gauge.json @@ -1,36 +1,35 @@ { "credit": "Made with Blockbench", + "render_type": "cutout", "textures": { - "1": "create:block/boiler_gauge", - "2": "create:block/gauge", + "0": "create:block/boiler_gauge", "particle": "create:block/boiler_gauge" }, "elements": [ { - "name": "GaugeButton", - "from": [15.5, 5.2, 5.2], - "to": [16.5, 6.3, 6.3], - "rotation": {"angle": 0, "axis": "y", "origin": [10, 8, 8]}, + "name": "casing", + "from": [14.05, 1.05, 1.05], + "to": [16.95, 14.95, 14.95], + "rotation": {"angle": 0, "axis": "y", "origin": [22, 8, 8]}, "faces": { - "north": {"uv": [0, 9.5, 0.5, 10], "texture": "#2"}, - "east": {"uv": [0, 9.5, 0.5, 10], "texture": "#2"}, - "south": {"uv": [0, 9.5, 0.5, 10], "texture": "#2"}, - "west": {"uv": [0, 9.5, 0.5, 10], "texture": "#2"}, - "up": {"uv": [0, 9.5, 0.5, 10], "texture": "#2"}, - "down": {"uv": [0, 9.5, 0.5, 10], "texture": "#2"} + "north": {"uv": [10.5, 8.5, 12, 15.5], "texture": "#0"}, + "east": {"uv": [0.5, 0.5, 7.5, 7.5], "texture": "#0"}, + "south": {"uv": [12, 8.5, 10.5, 15.5], "texture": "#0"}, + "up": {"uv": [10, 8.5, 8.5, 15.5], "texture": "#0"}, + "down": {"uv": [12.5, 8.5, 14, 15.5], "rotation": 180, "texture": "#0"} } }, { - "name": "GuageMetalBack", - "from": [14, 3.05, 3.05], - "to": [15.95, 12.95, 12.95], - "rotation": {"angle": 0, "axis": "y", "origin": [9, 8, 8]}, + "name": "interior", + "from": [16.95, 1.05, 1.05], + "to": [16.05, 14.95, 14.95], + "rotation": {"angle": 0, "axis": "y", "origin": [22, 8, 8]}, "faces": { - "north": {"uv": [11, 0, 13, 10], "texture": "#1"}, - "east": {"uv": [0, 0, 10, 10], "texture": "#1"}, - "south": {"uv": [11, 0, 13, 10], "rotation": 180, "texture": "#1"}, - "up": {"uv": [11, 0, 13, 10], "rotation": 180, "texture": "#1"}, - "down": {"uv": [11, 0, 13, 10], "rotation": 180, "texture": "#1"} + "north": {"uv": [13.5, 8.5, 14, 15.5], "texture": "#0"}, + "east": {"uv": [0.5, 8.5, 7.5, 15.5], "texture": "#0"}, + "south": {"uv": [14, 8.5, 13.5, 15.5], "texture": "#0"}, + "up": {"uv": [14, 8.5, 13.5, 15.5], "texture": "#0"}, + "down": {"uv": [13.5, 8.5, 14, 15.5], "rotation": 180, "texture": "#0"} } } ] diff --git a/src/main/resources/assets/create/models/block/steam_engine/gauge_dial.json b/src/main/resources/assets/create/models/block/steam_engine/gauge_dial.json index fc4549235d..1c3de984bb 100644 --- a/src/main/resources/assets/create/models/block/steam_engine/gauge_dial.json +++ b/src/main/resources/assets/create/models/block/steam_engine/gauge_dial.json @@ -1,21 +1,17 @@ { "credit": "Made with Blockbench", "textures": { - "2": "create:block/boiler_gauge" + "0": "create:block/boiler_gauge", + "particle": "create:block/boiler_gauge" }, "elements": [ { - "name": "GaugeDial", - "from": [15.75, 5.25, 5.75], - "to": [16.45, 6.25, 10.75], - "rotation": {"angle": 0, "axis": "x", "origin": [16.1, 5.75, 8.25]}, + "name": "needle", + "from": [16.5, 4.5, 7.5], + "to": [16.5, 11.5, 8.5], + "rotation": {"angle": 0, "axis": "y", "origin": [22, 8, 8]}, "faces": { - "north": {"uv": [0, 11, 1, 12], "rotation": 180, "texture": "#2"}, - "east": {"uv": [0, 11, 5, 12], "rotation": 180, "texture": "#2"}, - "south": {"uv": [4, 11, 5, 12], "rotation": 180, "texture": "#2"}, - "west": {"uv": [5, 11, 0, 12], "rotation": 180, "texture": "#2"}, - "up": {"uv": [0, 11, 5, 12], "rotation": 90, "texture": "#2"}, - "down": {"uv": [0, 11, 5, 12], "rotation": 270, "texture": "#2"} + "east": {"uv": [15, 4, 15.5, 7.5], "texture": "#0"} } } ] diff --git a/src/main/resources/assets/create/textures/block/boiler_gauge.png b/src/main/resources/assets/create/textures/block/boiler_gauge.png index 746a9610cba495122a46220f5a52e1d876d480c2..931485261671167b75cc95eb3d626bd93ecc2b74 100644 GIT binary patch literal 1121 zcmV-n1fKheP)YD%n010qNS#tmY3ljhU3ljkVnw%H_000McNliru=nNhZ5*MWOsD=Ol02y>e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00YTML_t(o!|hj1ZyQwqhc8CN~C?APvr3fk%sVkz24i;RO+IOO6(BrvQ!9#6(T`Zr3ytt zNTmviO1pr@ivS4?jzVfXwa1<}{+JJsODi}wEMxNW0=G1ipm$Sgyz=}oCND2= z-@gAAO=WYeZr>{a01o&Q7iN9I*D?f8fANuPO_pMasujpmjMZU5VfE-!GE&(btGfs| z;A^&&8zT&I~2F1biVg*brpUWRXO55B$d19zU;)++mc*I_~MT;~tE2?LL% z(}xX=86yX$Ku$403bp+axIcTE($$NUu3n_~XHU~dP3qj}1Z4z>VRt<+eDXNB@v|H^ zewI6OIOORC{l<_Sf^_82KP%v6Ky_7XHHzFlKK+^&0MK*@_kQ1YtzB)DTTMs|8<`Bj zd~%((M(jH7elkq~psuL+^v7T5!z$3%6uflx<7Nh+5DoP=o`pti#H1h!MFS^qTyQzr zhR?>jW%aCGub^sLP>6=85J$n0SUvAS0VfW+L-_&?Zv zV0G!MhccS+$@e$_`0f0=bR(-^r>Nn~^*h|sOo9@_X7$|kDO%P|=$3^Kzgyuvr{H@! z0^8ihYe!=kjc^b{VVH*Q%B8Jeq5ZLlnqEhA;!W3aEQK^w!y>y65JPF1T08b3 zdL0od+;Jg+i%`Et)un)K?qc~trAvW)@&*I%RG>3D6-cWU>=d=$3T*vULjGQrk=UqE z*SmMX^XnxfucTZG_{FQQzksphBY645sJ9hIq%azF3T?Z2WcMD@7ENB{a+ic#%iLZ0t(` z-^0jJfDdpitD6?yUil0U02DSj7r37SolQ6-hoBL=KLy%Jq}Arp%$tKQa6bhcU)b5J zmw)&ZjuCkhD1I}KDX*R4k-ZE6bk8`O`LEBv^!~ioM`1`4&*s-LFM~Q z$#3#o&TQ4Ga_I1AIU+QLZF>0B}UoGe2+w(c_ju)3ychu78o4dNd^vaU(Vekw74 z!seT=x!$sM8Y(%}IAxw+5c6=q-EoQMh5_OX472RmmejJ;tOZ)d;OXk;vd$@?2>=V} BX6XO` diff --git a/src/main/resources/assets/create/textures/block/hose.png b/src/main/resources/assets/create/textures/block/hose.png new file mode 100644 index 0000000000000000000000000000000000000000..64d3fc3fedcbaeaa615298484251033029cca64f GIT binary patch literal 563 zcmV-30?hr1P)YD%n010qNS#tmY3ljhU3ljkVnw%H_000McNliru=nNha7&Bwq&guXF02y>e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00EmxL_t(I%axPOY7o(BloG{n~AWm|u_b;Cm zt(#i}wwMK#L1!tG%&>F2$(J9$c>eBV?V^Dc7L)k*C4$fueEr@B!1tVT(sq3l->!4R zIjcq>T@T-LxOb-o!0BkpU^GR}{bgH0u$T;Nfp!Ihxu2*pe{xlg;39E4nxb97Br|1k ztPDw-S0m6_N|NRzY0dyh)oh~9QXakiP+QBwBr`t*igvlnza9ik|r+wHQkPP*-eyy7oj?)7@ryO5|c{h=mN<1+T<^(%Jn-YTDA zEyG^4SQ*+4Nvuq@4i5HqSGO)p0q75PdH$CU{sJYm-W002ovPDHLkV1lnn B_Vxe( literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/hose_pulley.png b/src/main/resources/assets/create/textures/block/hose_pulley.png new file mode 100644 index 0000000000000000000000000000000000000000..c9fa237ad3a7fe03f53bd78e14ea96609eb4d0d5 GIT binary patch literal 1268 zcmVYD%n010qNS#tmY3ljhU3ljkVnw%H_000McNliru=nNhZF(jppzVQG602y>e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00dk~L_t(o!^Kz4ZyQAv|E<^F z*&S#7m1q;!Qkp1L6(OXGwvj+^ZYhTfi6ascIrATIqEau217{AoAh>bq1(h=uDj*OX zI24prL9HDt_+!VO-Px@%hxJUyADgb515b(+d*09QW8V9{H^vw5zCL!TjiOB;Wf%$o zK+z`ZfB9M0VLSu?==fnMru1~t&m=zYQX5yc8*oV#OmyLrD$WwA!$cRq9X$bnbK&zv zo4_SieDlKtEF;Y1Cy-Xx_TW&`xJS3KncM{tqiYLMu`*_ zf_)LA-RYy%>Cc_XYmoTaOfb<^c>P-Q`UkI8M!VC;XTFP8vkA+xP%4*U7zRw!#0Mn? zuU1wL=vV-#I0gLv*D<&d3j?5pV7IZRaKlg}SHMIU08k}@4F=nfPAAfhzs>P zOw)vEnz&G}9r+EP^<1zhp^dGN;Pw_Y3Lf0R4`tXIpaGdxX(p}| z$E{8uc}fVbY&YPGI1`h}`zw(GzUQHupv#KH;WvdXy=O&F#zM2Or*m zOKnt~LT1NjDLHZq&-Z~9*Ub#pbuEX&B~|===cDoLMx;};>=b=h@SQm60sydVE3*Sq zS7PO|kw|xrawYlnf_TCmr?^yKLlki2Tx!4cFmb7kDBvohS>n-+Kj{w8nruTAC&_~4 zP~;d7;gTvSrJ0RWnxtK3Ad7LvL%7sNqq>qlj9x}0?aC#iJz3Wl8Gmc{RW(bb&bjvi zeYpJk_)oMt{nW_ix$d;;0?v76<7v8Ht&ECOPz5KqWtsMhQ-F7AbDjwSAPS@GJf5Pf zSG#-#Nr&|7lJ#OaG$A5i#7noKFJidVhUHK&(Va3bpK)o%lR`}}Y9ClO13LS;qzZRE zd2U%woVuXOCt0K9O%stXVhk9|?7)CA_##;>qJV>uE?&9&)l$RgkB{FUs|-W|$MMl4 zaNmf6%VU{x8TB&aix|BiMxF~X)ti<>=iYWMnb0jL5cJhub0HSK e6SIhXWBvyfa*$k!0ZYyR00004%P)YD%n010qNS#tmY3ljhU3ljkVnw%H_000McNliru=nNhZF&+AdHu(Sm02y>e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{009L_L_t(I%e9lSOT$1Ehrd7) zPqa~&;+75_G8GlNxd@IO9SVU?F7ECw1^*AH4vrlv2!gm3RGhNj+C@#3o_B#dl!VLB zA+|m^xHr7teeZYgIaqPjisk^?WcZ#-P!pt6g*F)gwJm`V9uH41PF~~M0z1JbN*T1t z&?aLy*aj#>e)QtlQ4%=6xCCJQI_B|i#7Fv7BG~X{-&?%* z{FXTX@4?!C;k47Ceb5FVj^pYC`H0u|>VG4+9}bIcT&oAaE$INw9K|_D00000NkvXX Hu0mjfF)E~a literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/hose_pulley_coil_scroll.png b/src/main/resources/assets/create/textures/block/hose_pulley_coil_scroll.png new file mode 100644 index 0000000000000000000000000000000000000000..94eb2d4c98bf17698fde5a55fa1d38f6bb4835d1 GIT binary patch literal 483 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3-pI!a4o{DaPU;cPEB*=VV?2IV|apzK#qG z8~eHcB(eheiUB?$u10zqI+`jD)&`a)I*vAm0iHHXmo69KN&JI zfqfVSWM{UsfW@WWNg5=0Aec0M%D!olcoUK zAixAPmkF#g$kGDHg6c9fFaXJ}6H1$}u*_x-km={?;uxY4{Pe;`z6J*l<_nMJ>VEn! zud~Z^=Mf3_cD@7LDhpOM9BAt>T))WJ{m4DpJD2%1#Wio&v9xx&mkz|$td+A3Ak)WO;yR6*NGUCl^OLq}8P z54+MTFF&pz`OrmG1-gjJ5Zs9xsTJ$l~)_A_&6}LkSfmSnky85}Sb4q9e0N-w3_W%F@ diff --git a/src/main/resources/assets/create/textures/block/pulley_magnet.png b/src/main/resources/assets/create/textures/block/pulley_magnet.png index 98fee4b266d391c7e1f4bb130c5fe92aee4245d2..a694f8b362fb8ce1b64c5f40c730c5ab9788b42a 100644 GIT binary patch delta 404 zcmX@jw3%hX%KAeL419+eMK!z{7#J8NN?apKg7ec#$`gxH83GbB^GfvmTtgI0^$hil ze(z!422`^xHNrE^(^HFq1IS@zkYZ$IU<9(ffLI#J4g#_@7@5K1OhC3FBNKxFkd6Z4 z%yt&AcovWi1oaG`$`~15Ff+huG+P;fQWMx2Sb%B`jEoH!7eI^!S;@KpV$>8M8w8ku z1~Y+G23cAFSx{Yu1_mJ6KI?R&M642D#1C)z4*}Q$iB})Y)k5 delta 170 zcmV;b09F691j_=Dsei)&01m?e$8V@)0001hNklp#ViYkr)_Y6<8gyf?*3h9UW>x zfVTr0`*-YTQ;t8j$By%RDn29*ba(j!%_0I=^CfgL0;CcPAS1jkyuxo@*PM@&)V<67 Y20-Nq532OE4gdfE07*qoM6N<$g8RHhK>z>% diff --git a/src/main/resources/assets/create/textures/block/pulley_top.png b/src/main/resources/assets/create/textures/block/pulley_top.png deleted file mode 100644 index c3f679b67fcb0ee5c0232ce1faa4f6c663f41186..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 277 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!Wq?nJ>x#{*XDylAKW$=DdrLuS zK}V`(MovakqE$k2d{vZ5M07+!kX}G=V4}C4r;k^Zi;9D*bEuWPskPjut3J z&Wv31=+K9QJzYIw_xiXV>uuijmdKI;Vst00=T_qW}N^ diff --git a/src/main/resources/assets/create/textures/block/rope_pulley.png b/src/main/resources/assets/create/textures/block/rope_pulley.png new file mode 100644 index 0000000000000000000000000000000000000000..c8aea4bd4f1198ee8ea06d25cadc0b98f0dd2579 GIT binary patch literal 968 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCil;0(?ST1A+q+lH)USG8|l;o7!7uEt$Jw^XmR-6AMZU+>B)W%w$qMH3|ZC zQam&w?UeEZwL`7t3xf2F4Go)@h zfNHj-MtG)qdTKFn06DA-QjDw&j6jwb5KBYZpwQG{WCn{f0ojI(Obh}*Itqw0+gZTk zSwJ=jcuF!dyZ{C|j7GDR0Vp+roq+|Y(!j{rfN=rDRFI9V3m_&<0kT1W31}`8SY?o< z1&{^RWoTdklGVSI|4s7Ozmvdd-R|k)7-HdH8q`}g+knU9$fTY~pJa~(D!G@->TCat z-#OV~nsWE!QTeXE&yjY|SFKw0G2v?J_x!h=o*hT4g+8w1va9Hizc8JFF>98Dv};Zh z!^6jHUJsW2z4k8nR(bAs23FAq5tfkU8e7`$@E~WlJ#reI{KG&qIk1m+p=J`6)Bha?u)%0EZEm7N8 zaz0L9a9mH#|FszZuGSBp-Z_CBrl#V?Kd&t9J*hs2Nli75@8{3d7oQ(ay3!m|T=&l= zP4(>S?A!Cs$5!9muiLC;tTj2TssH``%h5gdLBD?fySifPy8Alwr$(vgZZ6Aven+2u z%F&(ozniLT`yPLFSzN&C_T4rWuSIp5H!*3HC%$L(dLZ5O%<)X>M~&}X-f|r?IZw}G zf6X+DUGSOgn=tFNiIaf5Y3yY#Ph{6tZqQp$$uaN5&r__b2>~aXOBqiyFOGIhJPT%t zY-n$0HLdi%VAJA1S!LmqgS#4@Hm<*3bitJW8tcEwAVb^FuJD$#d!w}RLH~M=9d5EZ glfw@^+m-#D{dm9K%e*^{)}ZM0boFyt=akR{0DLKBNS%G~10G|-oXmjD|sd{OS;?@3gK(Wg~nGHaSwIs+d_&*RZ{NBa~GKjOlBeIx* zfm;}a85w5HkpK!xl(KW=8{ocd84X9>YYJ_K+ zr>7PJ2gq0kDMnTXMj*=zh^3)ykjpg~nZe>rK(-+x6WAwFKz3$33s^i0$OZvVNk)bj zKo7!bG)ozPQWMx2Sb!=GjEoH!7eGt}*~q#8V$u{K8w8ku<}!g*23cAFSx{Yu1_mHm z{Y&}ZB!B%o31pghx;Tbt1mEpB$;)8Cb7;r6`8!pzroU+R=;QHV;@ZN(Yhv_7saC%A k;k@((R;zRCKOJ=|V(?XGDhyseHwR>vr>mdKI;Vst0O!kE^8f$< literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/rope_pulley_coil_scroll.png b/src/main/resources/assets/create/textures/block/rope_pulley_coil_scroll.png new file mode 100644 index 0000000000000000000000000000000000000000..4838ca5c4a0729f443bb2c9a317fd5975801ed51 GIT binary patch literal 435 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3-pI!a4o{DaPU;cPEB*=VV?2IV|apzK#qG z8~eHcB(ehe`~f~8uF>Yg(^K`*9L1~s<$z+BgEAX{6l+P4U+{k*VEDa_FBmAmS>O>_ z%)r1c48n{Iv*t(u1tm&cBT9nv(@M${i&7Z^5;OBk^!!{y6ioFD^^AV+VcrH*vn@5k zGtJXei-7}VEQ1syD+42tvp@3Xlx~Oh9v)z$$|*Er2YjE<*zY zkgWct{BM%K{+$Fe%{*NkLo|Zl_T1)WP~c&zd~3h?$_t@m{Ig_sHmNLd@V?-n?5uZb oxdzYo80M>yx&QtD9cz|8$z)i~^6<|c16`15p00i_>zopr03cpo82|tP literal 0 HcmV?d00001 From a313555899428371ec070afec5ffb1f0f678e035 Mon Sep 17 00:00:00 2001 From: TropheusJ Date: Fri, 3 Jan 2025 12:50:41 -0500 Subject: [PATCH 233/515] that's not right --- .../create/content/contraptions/MountedStorageManager.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/MountedStorageManager.java b/src/main/java/com/simibubi/create/content/contraptions/MountedStorageManager.java index 2f89661f13..cb89414026 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/MountedStorageManager.java +++ b/src/main/java/com/simibubi/create/content/contraptions/MountedStorageManager.java @@ -164,7 +164,8 @@ public class MountedStorageManager { */ @Nullable public MountedItemStorageWrapper getFuelItems() { - return Objects.requireNonNull(this.fuelItems, "Cannot get fuelItems for uninitialized manager"); + Objects.requireNonNull(this.items, "Cannot get fuelItems for uninitialized manager"); + return this.fuelItems; } /** From 0be7570717b61010f49ccdcbcebf4c4864bc8086 Mon Sep 17 00:00:00 2001 From: TropheusJ Date: Fri, 3 Jan 2025 13:03:02 -0500 Subject: [PATCH 234/515] fix missing type registrations --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 4 ++-- .../tags/blocks/simple_mounted_storage.json | 2 -- src/main/java/com/simibubi/create/AllBlocks.java | 2 ++ .../storage/MountedStorageTypeRegistryImpl.java | 15 +++++++++------ .../infrastructure/data/CreateRegistrateTags.java | 3 +-- 5 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 416ce6d8be..88140c718d 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2025-01-03T04:59:28.154809229 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2025-01-03T12:54:10.595947987 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -4648,7 +4648,7 @@ f400870b8dbcd14238be3ec99c419093073ba3a6 data/create/tags/blocks/postboxes.json 9bc8c13fd80bdbe7f767b91ee1a1042e9aff02b0 data/create/tags/blocks/roots.json 55dccb895bbdacfbd6ee9005486cd3fe9df01249 data/create/tags/blocks/safe_nbt.json 79418bd729cef417b322cef9b491e7ae83317d61 data/create/tags/blocks/seats.json -d6b27fadce1fb86be1be99ac12fbd9a734358fc0 data/create/tags/blocks/simple_mounted_storage.json +7d783d948cc49503fb645045fe9ef48906b74341 data/create/tags/blocks/simple_mounted_storage.json 8a6ad3c63fb0c436ec8109f39358213930effd5a data/create/tags/blocks/table_cloths.json 5def5088f7fd31b80e6f28c1c4ea146aa9d7d15b data/create/tags/blocks/toolboxes.json 2589b135c0e96ad29076569e144528fe32ea5b39 data/create/tags/blocks/tracks.json diff --git a/src/generated/resources/data/create/tags/blocks/simple_mounted_storage.json b/src/generated/resources/data/create/tags/blocks/simple_mounted_storage.json index 6d8ef7bc46..93f3ee349c 100644 --- a/src/generated/resources/data/create/tags/blocks/simple_mounted_storage.json +++ b/src/generated/resources/data/create/tags/blocks/simple_mounted_storage.json @@ -1,7 +1,5 @@ { "values": [ - "minecraft:chest", - "minecraft:trapped_chest", "minecraft:barrel", "minecraft:shulker_box", "minecraft:white_shulker_box", diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index fa4f135730..ca2ef9cb72 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -1830,6 +1830,7 @@ public class AllBlocks { .rotationY(s.getValue(ItemVaultBlock.HORIZONTAL_AXIS) == Axis.X ? 90 : 0) .build())) .onRegister(connectedTextures(ItemVaultCTBehaviour::new)) + .transform(mountedItemStorage(AllMountedStorageTypes.VAULT)) .item(ItemVaultItem::new) .build() .register(); @@ -2233,6 +2234,7 @@ public class AllBlocks { .texture("0", p.modLoc("block/toolbox/" + colourName))); }) .onRegisterAfter(Registries.ITEM, v -> ItemDescription.useKey(v, "block.create.toolbox")) + .transform(mountedItemStorage(AllMountedStorageTypes.TOOLBOX)) .tag(AllBlockTags.TOOLBOXES.tag) .item(UncontainableBlockItem::new) .model((c, p) -> p.withExistingParent(colourName + "_toolbox", p.modLoc("block/toolbox/item")) diff --git a/src/main/java/com/simibubi/create/impl/contraption/storage/MountedStorageTypeRegistryImpl.java b/src/main/java/com/simibubi/create/impl/contraption/storage/MountedStorageTypeRegistryImpl.java index af0091fbc0..a986e710ab 100644 --- a/src/main/java/com/simibubi/create/impl/contraption/storage/MountedStorageTypeRegistryImpl.java +++ b/src/main/java/com/simibubi/create/impl/contraption/storage/MountedStorageTypeRegistryImpl.java @@ -13,6 +13,8 @@ import net.minecraftforge.registries.IForgeRegistry; import net.minecraftforge.registries.NewRegistryEvent; import net.minecraftforge.registries.RegisterEvent; import net.minecraftforge.registries.RegistryBuilder; +import net.minecraftforge.registries.RegistryObject; +import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) @@ -38,12 +40,13 @@ public class MountedStorageTypeRegistryImpl { if (event.getRegistryKey() != MountedStorageTypeRegistry.ITEMS) return; - System.out.println("aaaaaaaaa"); - for (Object o : event.getForgeRegistry()) { - System.out.println(o); - } + register(Blocks.CHEST, AllMountedStorageTypes.CHEST); + register(Blocks.TRAPPED_CHEST, AllMountedStorageTypes.CHEST); + register(Blocks.DISPENSER, AllMountedStorageTypes.DISPENSER); + register(Blocks.DROPPER, AllMountedStorageTypes.DISPENSER); + } - MountedStorageTypeRegistry.ITEMS_BY_BLOCK.register(Blocks.DISPENSER, AllMountedStorageTypes.DISPENSER.get()); - MountedStorageTypeRegistry.ITEMS_BY_BLOCK.register(Blocks.DROPPER, AllMountedStorageTypes.DISPENSER.get()); + private static void register(Block block, RegistryObject> type) { + MountedStorageTypeRegistry.ITEMS_BY_BLOCK.register(block, type.get()); } } diff --git a/src/main/java/com/simibubi/create/infrastructure/data/CreateRegistrateTags.java b/src/main/java/com/simibubi/create/infrastructure/data/CreateRegistrateTags.java index 95caf20c4e..c10809e776 100644 --- a/src/main/java/com/simibubi/create/infrastructure/data/CreateRegistrateTags.java +++ b/src/main/java/com/simibubi/create/infrastructure/data/CreateRegistrateTags.java @@ -110,8 +110,7 @@ public class CreateRegistrateTags { // tags aren't used here because the implementations of modded entries are unknown prov.tag(AllBlockTags.SIMPLE_MOUNTED_STORAGE.tag).add( - Blocks.CHEST, Blocks.TRAPPED_CHEST, Blocks.BARREL, - Blocks.SHULKER_BOX, + Blocks.BARREL, Blocks.SHULKER_BOX, Blocks.WHITE_SHULKER_BOX, Blocks.ORANGE_SHULKER_BOX, Blocks.MAGENTA_SHULKER_BOX, Blocks.LIGHT_BLUE_SHULKER_BOX, Blocks.YELLOW_SHULKER_BOX, Blocks.LIME_SHULKER_BOX, Blocks.PINK_SHULKER_BOX, Blocks.GRAY_SHULKER_BOX, Blocks.LIGHT_GRAY_SHULKER_BOX, Blocks.CYAN_SHULKER_BOX, Blocks.PURPLE_SHULKER_BOX, Blocks.BLUE_SHULKER_BOX, From 8ece632adaf665da37786cb623d9530f82819da7 Mon Sep 17 00:00:00 2001 From: TropheusJ Date: Fri, 3 Jan 2025 19:15:42 -0500 Subject: [PATCH 235/515] remove obsolete contraption_inventory_deny --- .../resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c | 3 +-- .../data/create/tags/blocks/contraption_inventory_deny.json | 3 --- src/main/java/com/simibubi/create/AllTags.java | 1 - 3 files changed, 1 insertion(+), 6 deletions(-) delete mode 100644 src/generated/resources/data/create/tags/blocks/contraption_inventory_deny.json diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 88140c718d..5ad7394684 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2025-01-03T12:54:10.595947987 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2025-01-03T19:15:37.648009952 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -4629,7 +4629,6 @@ a57dfe9974b8b6d338b9ab4ae124297fda7780b9 data/create/recipes/weathered_iron_wind 11034a79e8f167249b78e6e3863e01991ac9d778 data/create/recipes/weathered_iron_window_pane.json f365be4eda73234b73aa49c97b065f1a8baafbf6 data/create/tags/blocks/brittle.json 8b6c0b444b15f7fb2d55b9cbcb68537c1269f877 data/create/tags/blocks/casing.json -35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/create/tags/blocks/contraption_inventory_deny.json c7ec0dbc18e9c1b58e568ed925287b89df11a136 data/create/tags/blocks/copycat_allow.json 876eb9210f4a14898a2fe6d225699c66b5bdfeef data/create/tags/blocks/copycat_deny.json 7296238b4c6b81251870addce1de8ecda63381dc data/create/tags/blocks/corals.json diff --git a/src/generated/resources/data/create/tags/blocks/contraption_inventory_deny.json b/src/generated/resources/data/create/tags/blocks/contraption_inventory_deny.json deleted file mode 100644 index f72d209df7..0000000000 --- a/src/generated/resources/data/create/tags/blocks/contraption_inventory_deny.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "values": [] -} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllTags.java b/src/main/java/com/simibubi/create/AllTags.java index c17aeb4a91..aab061a218 100644 --- a/src/main/java/com/simibubi/create/AllTags.java +++ b/src/main/java/com/simibubi/create/AllTags.java @@ -81,7 +81,6 @@ public class AllTags { BRITTLE, CASING, - CONTRAPTION_INVENTORY_DENY, COPYCAT_ALLOW, COPYCAT_DENY, FAN_PROCESSING_CATALYSTS_BLASTING(MOD, "fan_processing_catalysts/blasting"), From 3c79a2154c585665b8ca2c3bb08e720cf3f8eaa8 Mon Sep 17 00:00:00 2001 From: Kryppers <65094918+Kryppers@users.noreply.github.com> Date: Sat, 4 Jan 2025 14:21:05 +0000 Subject: [PATCH 236/515] getting there! further texture tweaks to tablecloths, redstone links and steam engine. --- .../assets/create/textures/block/engine.png | Bin 4024 -> 7144 bytes .../create/textures/block/redstone_bridge.png | Bin 1509 -> 7872 bytes .../block/redstone_bridge_powered.png | Bin 1514 -> 7987 bytes .../create/textures/block/rope_pulley.png | Bin 968 -> 1444 bytes .../textures/block/rope_pulley_coil.png | Bin 433 -> 252 bytes .../block/rope_pulley_coil_scroll.png | Bin 435 -> 262 bytes .../textures/block/table_cloth/black.png | Bin 882 -> 1081 bytes .../textures/block/table_cloth/blue.png | Bin 905 -> 887 bytes .../textures/block/table_cloth/brown.png | Bin 848 -> 856 bytes .../textures/block/table_cloth/cyan.png | Bin 873 -> 888 bytes .../textures/block/table_cloth/gray.png | Bin 875 -> 890 bytes .../textures/block/table_cloth/green.png | Bin 875 -> 895 bytes .../textures/block/table_cloth/light_blue.png | Bin 843 -> 865 bytes .../textures/block/table_cloth/light_gray.png | Bin 845 -> 887 bytes .../textures/block/table_cloth/lime.png | Bin 867 -> 880 bytes .../textures/block/table_cloth/magenta.png | Bin 842 -> 846 bytes .../textures/block/table_cloth/orange.png | Bin 841 -> 851 bytes .../textures/block/table_cloth/pink.png | Bin 828 -> 832 bytes .../textures/block/table_cloth/purple.png | Bin 874 -> 872 bytes .../create/textures/block/table_cloth/red.png | Bin 872 -> 881 bytes .../textures/block/table_cloth/white.png | Bin 3004 -> 856 bytes .../textures/block/table_cloth/yellow.png | Bin 823 -> 847 bytes .../textures/block/tunnel/andesite_tunnel.png | Bin 392 -> 476 bytes 23 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/create/textures/block/engine.png b/src/main/resources/assets/create/textures/block/engine.png index 699602cee2aac29a22bbf7c31c3f94f13c04f577..053af602d114cb4466031aa809289a414840330c 100644 GIT binary patch literal 7144 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 Y$2T9k8WKVUIsjy5Y-Lnpa5Ch70N>D~{Qv*} literal 4024 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 delta 43 xcmX?L`;>cvvH$~HlDE4H!+#K5uy^_7$$XM>TrYTJ1&o+2<-c#=Y$n;o3IJJU4^jXC diff --git a/src/main/resources/assets/create/textures/block/redstone_bridge_powered.png b/src/main/resources/assets/create/textures/block/redstone_bridge_powered.png index 0ba53d85229b2d2d6ea09b74ac02de3bd6b66f15..eb611e8ac50a640f95608133001676d876bf899c 100644 GIT binary patch literal 7987 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 delta 1472 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 literal 433 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G~10G|-oXmjD|sd{OS;?@3gK(Wg~nGHaSwIs+d_&*RZ{NBa~GKjOlBeIx* zfm;}a85w5HkpK!xl(KW=8{ocd84X9>YYJ_K+ zr>7PJ2gq0kDMnTXMj*=zh^3)ykjpg~nZe>rK(-+x6WAwFKz3$33s^i0$OZvVNk)bj zKo7!bG)ozPQWMx2Sb!=GjEoH!7eGt}*~q#8V$u{K8w8ku<}!g*23cAFSx{Yu1_mHm z{Y&}ZB!B%o31pghx;Tbt1mEpB$;)8Cb7;r6`8!pzroU+R=;QHV;@ZN(Yhv_7saC%A k;k@((R;zRCKOJ=|V(?XGDhyseHwR>vr>mdKI;Vst0O!kE^8f$< diff --git a/src/main/resources/assets/create/textures/block/rope_pulley_coil_scroll.png b/src/main/resources/assets/create/textures/block/rope_pulley_coil_scroll.png index 4838ca5c4a0729f443bb2c9a317fd5975801ed51..122d25b354c59c7ae6bdf0b896e71784699eadaf 100644 GIT binary patch delta 245 zcmdnY+{QFPvYw5BfkC?S#~C2SmgMd3!r;kZ#vuA|_MbkW2xoyuWHAE+w=f7ZGR&GI z0Tg5}@$_|Nf62(g!z~pd*nR^jG}+U|F~s9|a*6}f#b<~9@7x(75m)=;@PV_(4kRpA zKl|ayRra>)^Xm>B-2s$Ids}~!|cGa@@^bP0l+XkKbva+6 literal 435 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3-pI!a4o{DaPU;cPEB*=VV?2IV|apzK#qG z8~eHcB(ehe`~f~8uF>Yg(^K`*9L1~s<$z+BgEAX{6l+P4U+{k*VEDa_FBmAmS>O>_ z%)r1c48n{Iv*t(u1tm&cBT9nv(@M${i&7Z^5;OBk^!!{y6ioFD^^AV+VcrH*vn@5k zGtJXei-7}VEQ1syD+42tvp@3Xlx~Oh9v)z$$|*Er2YjE<*zY zkgWct{BM%K{+$Fe%{*NkLo|Zl_T1)WP~c&zd~3h?$_t@m{Ig_sHmNLd@V?-n?5uZb oxdzYo80M>yx&QtD9cz|8$z)i~^6<|c16`15p00i_>zopr03cpo82|tP diff --git a/src/main/resources/assets/create/textures/block/table_cloth/black.png b/src/main/resources/assets/create/textures/block/table_cloth/black.png index 9a4f742f9d3c7dc9f1a7ab4f3cfba7788a4d378d..5987e9f3d99e518ee9027eff89256926ff1c4099 100644 GIT binary patch delta 1061 zcmV+=1ls%Z2Du23BYyw}VoOIv07(Eg02Sez{Eh$s010qNS#tmY3ljhU3ljkVnw%H_ z000McNliru=>Y@|0V;>1i;w^S1I9^2K~z}7<(I*48$}exe_rfiVmn6E!g5IrNg-HK zlJW;2aRH&K;nMbikhtW~8;AoETzaUgo{+e}5g{&IxX@mx5Pw2K96%JIR;00zNfoP2 z9UG^(%GTa2>oUt>y~B>zX>c4)%w^`=_cSy6-nZX-n<&nfeNissDGSzrMR`4}h2sDk z%cVs+j)&N+#q7;mHNhCe66G=%Uw;*=n87Q}B9|6Pr!jC+TF9BaVSoRPWtf|1+>to) z;t5~QbE zkW35Q8*5l1h3n3uq(oI#$Buxdc6Sk$!gF0LkwSSr0F42Jlyn>qYhnU`Y+3~NJ{~Iq zI>&`PZvU`=19_B`00tJ8(*8_9P-+wH`VPv8>>VFs`DK=|Ea~|Y) z4KXoc;s_^HWo_gGzq#^-5AgEI(}{osUN6Q0(GR^PQmEZsgp@IR$MG~r#)^QoaGaz> z=TusXqy#sYK{1aN;lNOi)T$#LxLL288~}`*MspnFKtD2v$^kakaov*6X^aB{IUiRC z>Ww>b9e>ECh0bZ1!aQk8Q zaU$^P#~=BR<#PKv?$|b=U%1|}ZC1{{m58cbsDE(7FhG0fzIlP4u3ZNpH<|fYH@5G0 zwSTwaI7PoCLczUD&&R@`O{euD80TZ6e2^OAxnk&_&-ss!PEo0+Byk`W? zoqu_W*4=HkT7S^YW_7)Ha~VVXL!3-z2Sm4~^0`FY?4uB8dUIAd`?6sjd9Nn%d z;fdmG**|sS1*VQZ!PL=d0HUPav2DE$iC1sjq2Ac$(pTT>uDCFD%m--IH-_SH%ss#4 z1FZjYBN5aB;Pc8B+1g#a>ScH&iT7j)(SO$gOQdx78)C0CdtecA9A}^y&CMf=8IpDv zZ*Jb~iu?Zqvfl-3Jd-DBccEO?n$Vjr^|f|mDBiOzFH9Zt!^T2+J)_A8@m@19atdN3 zeDKV3JnX-~Qx?g{f54!9+z1f8?Lp_keMahv0bSSq$w_10>-pfUH#>y>;Qu!g2Oi0r fQQ!Ar`F`VXMhIGq1nbx400000NkvXXu0mjf^Edv6 delta 860 zcmV-i1Ec)82=WGyBYy)qNkl;Oy4`6%BfzFyp_eQevoGBy0Xx2Lm# z+m0)FE0B1x^a{(=0GOH0peMBk4z-itdGHWDsZq8)EK_4e~!gH7u2&;jh_WN}JXsr$e?|JZT2-Zb{-0r3_HyMO&Zi`es(eARPY zIiVT4{2iPRTX%JEST-b&p3GHmULR}9!;tv&_9FmEL&Go)HjCdd%(@6UwtC+McWj4> z0z{hv*0odKy0pM_38@oF@auhh+)~2lU&jEb>{7Kn3J(j8l z=RzGgdc>l;yLO-7zWV|{p#RL-ItNaj?2}wOq)WcBQIZ>JhjjnG4ZNuXr%&}sZO<*d zRCFLSpHs9yGoMp*Av2%*qmTU3fw{+7OhZ??;(zI>32eueU9h zwKvMfLEa2;s69aDUR8H>bg;fxJZ`1-1lx{_W!Bp@|N5v%jNKSzbe!>!~%jh8v*&pq`!Zly7$3Q z-c>XLSB3`UiB?utl?c39`+)7ZG6G?C(U9yn0{Fe%?-<c0000~kFd9(k*1+_SNr;C^Rk}N! z(VZUgd#QZiw^Cj8-mCYjbn&0|aJ6pXhcV68fS%vy+9d-(^MAF5O~(t^*knQ%53iIc z0I^!P_;ctocDe zJb6{YwYmV@x*uUXVuH()Tl{;khwVtuxK@Q*_aoeb8z^_*M>u8`FBo7uf}Sr=rZ}KI zGkaXdzUEqZ!GA#WA`okhbc|igV7Yb}+Z=l$$sN$$dVl3S}=EO~yEz1KKkOnF9}=GOBo1ZVqH){(n>IfUbCn7^{1(xF5z^|7mq# zG6%M)olDpLWF3HQ9vAgMHs*WvhOAz5t>PX?)`4bgFf!-ofa(QGZ?*;$y@;jDOY;Sn zCIQnSa&P9Drl9Geh=)Qsb`^`j3WjC?!VG4p}W}1K8c!RVP&IOyju_fBb!iqmCr6 zKgzkM=7vASKlre9;|c%^*JWRRdvhh1Pu;-jxpA%E_^*p&R`tDaK9kw5^yV{p8A&}DZS%P;Zrwo{`C07?at?v z2U%Wzl(|t~%#Jq9)zsmrOm;u9?F)sha8kDs4e}2LAL4UAj~w0&Lqt+ zJBy5Q?g84zeU9x}sRsN1>Q_C4Z zAzfqF4;7c0(YfwF37DIWD6{6W#&MeWxUPwbXrSkXBN}i-T>GMJ(BAIj2xG+FbbY0f zJTT9km`T)B)>xi%FqHyCH3_I3j-r^gdAAlETW?fV>N&eb4_t zjH&Oh{}}Z;T{TfGm(=ILJ*%M4(CX@xiJnB3cmv-RG5l;H1Zyrl6*9&mmgfY+B!$BSJ2CX)i9=E7%JLIAZU)ru*lGxpK^) zx-dsK7;^I10M`#$IrL`S`F3|M?UGCTXH~d-HeP7)unE9bviaBm>OVtm>tSNYn~fy@ z?rVp?)J3Fo9XA`pXY#QD96cDaa%ex@V93qp--!(Twi9ckx{$WNrR?>b8317E^J`I_ zF}=?7pa7_Q{p|%SF^-#0j}nu3AN>C?^&)lCarNsDa{WDj3YIxExMullY5)KL07*qo IM6N<$f=g7w2mk;8 diff --git a/src/main/resources/assets/create/textures/block/table_cloth/brown.png b/src/main/resources/assets/create/textures/block/table_cloth/brown.png index d77fdea536572586e09a642d290249e4c8b42152..8b9560481e4cecc9c2057b1f5f1074b38e2aad7a 100644 GIT binary patch delta 833 zcmV-H1HSyw2G|CWB!3@CL_t(og~gZMOB7KU#(%p_FuOC-(&86ke$WS^P>Es%ixddz zmAGJ6B6Z^*&~4Ox_uX_?-KJgn0fD7U7okF8OGzbqhJBrWE z+2_1x&Uw%KzUMh-BQGC6D5TPZ*rvhU)C6|kA~lc(ki2_nn19^X21}XQ68plhY=jU{ zQt3ge8?K=071*XhqN>K1*SFpRaM=MCUSz|pPc*l+QC!T}L)CPgJW*9s!fn%#{3M|K zn4d@0bO17Aqp0y%35Vj&-@kc<8jls7&~!3mqoEy$=5}^aHN7}#JcgaO03-)wWD?1w zbjCIf$-_YD9)B8kRWE2>J>5)POfUY9It9RpT5q8av*wCj%8#5YUCuKEM;bW zb1rf$!YsJ6CQhUV?7US{1HvIS9>cFjWF!up2?HfHkap!%E%LYB>-D%s{mBhHw5xab%*@-_BQXv z-vZEguNQ!c50kz;(1GfPMyc(~pEE8USe%}8Y5(H%q)QhTr;nceI8f%MCZy6iU%|F% z$XBp9|4W%!0K_X=aDcV%%dUyNJP1)ZxPT6{Ab*ielH1wi^qo6QSsgPY?iIm%l z$vV9JIEVuBUa!7f=W2ucy{$kw?}IbHjG||{I-rPZEf@crb1(h^nCvu+2pYE*00000 LNkvXXu0mjf+H9PV delta 825 zcmV-91IGN=2G9nOB!3r4L_t(oh2@vcOB7)o$3HG}m|@0UVR79{Y0%4|cTqYmK_I9^ zl!{#v13~E0p+6ynPI>532vJcN4|mmAHhVS$I_IZBK@8$bETQTtHZa&e`iEWw8BuBAxITCH{0DqD?}4FINxhfpPv{!Wl`d$TcAaqcUWn@a!NI9US zQz_q^iyVtE3+}9mvebZ`%k8TH;gG6n_|=GvMA4ZbP!etJuAGV-%RXnX2EeCAg6aU^ z%Bfcuyfxsp4+`b;)TC5AzZ&r7{8)5ADxM?9qR;(mnX|ope!#e0-%Qt!jUjP*MAU>grz}tC+qrw;MtulR@Ri`kDv7AGwZ)xwqEY*z~Yy$ z0P-4^t$*man#H)&&N&9~eP!9T@co|dym!pkf!mkkM5?O+*jQTyAXaK#o1%P-(r>9eLp|x*|u7$n46hctEfPacw5Q#?F-pBy#)k0DGMgE=kL7_A@ zw{q@U0^8iBv85H;GP!)C#ie{=UT`s=Xzzrlh3oiieSLAs5no=?f%Md*R5Wp75o*C_ z#>ZXVA-EGub8`psk`A0{XpkpbTlnOP!0*)+Y|E4p@S7J8lA}fdfM*YG<%4{^>--Hu zfHJ(-YfheUeM^mdzXIiWAN+r)I7;4}c=&uI(BJbvE}j-bN=GR=00000NkvXXu0mjf D20x-a diff --git a/src/main/resources/assets/create/textures/block/table_cloth/cyan.png b/src/main/resources/assets/create/textures/block/table_cloth/cyan.png index 52cd811515ac4e800069cbeabade4f1dbc998681..ef99172b76472e648e3bded0b3ce8a385bc63c93 100644 GIT binary patch delta 865 zcmV-n1D^cp2KWY$B!53iL_t(og~gXoOcOyA#(&!^JB?X^LItC#fC>lVA2^}Ln;tY# zZyxk+Jdl`pBWaLe;+ez*y{mzPH{-#hFH%|8t0xqDrbi>c^AXo>cmz>IQv<6f!Q1LeeWkr(0 z!ZJPT{xK*@H*#E|C|y=Q{?G&cz5B|Ic%%bcMK>@|taL*)z99iz+JyJJO~9U{6_^8X zaDQ8w9e=>Me*UO_QHVVOqm)~OZT>NU(pE|BP_0vsM>{b7YPQ_F*IWGc&))!?=-j(4 z{_*z~%VT2(z=6B>$^c*QWFvV!n8Tf^$bKJH`@?l%_WdHujaJ_V%;_bE_DZFz-hv_T zN_`8S8WH+d3>##Js&;h@Uw-=wpi6U@*Fyrl27lCEX*7pzkAqis)57~$$`bmz=AR!I z=ICG-7cv7BN<~HoB{^4e?Z|NorJ~-svMa9a*&%pXS?J24766@+Ft6*t;}u6&K(*tU z)wuw_|8`C{B0mRo3Z8u~0o9O)d0huC^|a|7&3*eEh`^g)-^sgDMYXlU151_%uu^lTpiJd4gk8Z4|f=WXT9<8Q(-6fgI#Y% riCz6VV4QsNXh%&%Vc~wbg?ML3;3FQRu}}(Q2h_Y}KOHKuxk;ZFURB!}h(r z-E0)yco4tK%lBsX?Yx=UnMrK_{h@MSSB8S?FgTTC$$?AVt$zTL5A7U3&HXuG{LyM-9cOB9?EIFP) za6o#d!|-^!VSkc$9m%60G0>Co#WA!SaPa!Afuhaoi@zfZL?_BVLk^_IO z4piqrb?sN{08G}m4g|mRU~dS@+YK|S1N?Pha7x59JO@NC5b}!tKaAMu(?@07T9zAz z*(84l_rvrK_a2l3$<5(g<+CTw)Z}4E%)XiiV7+NzHk*80_<-45iLF(%d=Ch26)nD6 zw%osb^?yovap99sH^@T`n4WqKKxt(KfMjDMrIi)A3M3mFeR}F1z+86Lckt;mr^>;- zPy;p|>t$=xIsjfQc`n|QZu0S63fC3>cKI6&-T z;oh6cU*7PS9=JZ0qh+nqRibfm2Tfaf)MO#_CrIa$%fjYqQMK7Q@hxNJl!SMl)u>Q8x10}iz{%Nva^zV~_H zl0WqT0K12W%2C$fIlqHAAp3gvhL~@ywI5ss>Ma_$+|W4lw;-HOlviZ5MXxANy`$=o(($m+ooc zre#as4ydo+yv5Kp0A`-#NG7xf4)v2ieDs)PLZf6l7`n#HlU!s6Vqc3z^i-0P>5xol z*kuPmazI9=w|~1^I#V(o$)iA>njG`x*w8hGhR$Ggreq|%Tu&wCdPCQkezzRSfmkrd zCDV~yM8?a#>)Qb}zpxaVbCF{aX2HER(Uuyp%T7ZL2#1mhjjzQbhORZ(w+lPcnJ7^2 z-O2cJDsn9DIqcN{G}cID9RPee_2xKO10phQt$}CxSASCR!fGIx^M9fPLh-yg7WZ6m z)3T-gpXoqY4Ft8{s{;UA?bLzbJrDMVpuI2M6Ycl}bYM1@mxiz!5WPUyz3W?ra-!FW zyh#+ON4gTOAn^kVsu}~JTKz?(=7!D-RBA4tzLn*J=WZz?%%Dq<4Z&50eC*Y8OobMId|^7E7VP#SU~V*BOw2nq|yT}fK}KGk#Yb4002ovPDHLkV1jCDvt|GQ delta 852 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 U3W@kQN&o-=07*qoM6N<$f>2SR4*&oF delta 820 zcmV-41Izs32FnJJB!3b~L_t(oh2@vOZ__{&$3Kpb#*W)m6w1JlAXP#P2w0&5NK6cw zD+VNxD)CQrLsa|^NJtC}h`9q(5ez9E0RgIt7$^kfmO|4eaoTgu;N0PJoFZ^KAim4x zd++&j_uljOo~_y1i>O+0X-Ua^eTSBWYUKcc=2H_ct3iiFe}A{fJ~Mg2A_qjZ;&Q@s zacn_Tt}*TuGx@3V2w>Xbd!GLWps*TraBM*kN<3kcUAhMMPr zn3`~n9DBm%^nd6GjxBT~lDs5@_E+{iD5P`Tl%eJ-GD)8F9|XjrznhtJmE$0(X zGte5S`P*9YvT7im^L^0)rFh94tM^>-mXzAQZ#vLh1Ao2RpVR?Z%e{d@I_G=c4Qczh zQ_Q^qLkH&TDyP{spzZ=?|KWSgYnz>A5UekKQaqhl{boed;y?$Gal`JHFNl zxpwBF1@PciEdscCZZebijlfB7NNfAcbyEjwzN!5+-_(VgpI-;We0`geXeYYj9i}Fr zC1tk@-la6r)?G2QsaBLd)C(>DC>RT;c|R0@u73>2VI6ZKR)Y=@%Wf>cvMa~&LrMR< z5Lb>4aenL|K`6O$RMM0olSdB6%GW))vMa9a)e6jX7dm^$ycg2E?*qXMKluM({Y~DIn7x$m^ZX~>TsDG>=;_q}0000IltgmO@%8Xf5JUI~0p_2|)uLa(}=yF%I!P?=F{8 zbCrIVP**=}VCWhE(=W5=hStELe)6Z!GU$eeX*n3W#`Mcj1#J*Wnz9_;bErZ}8ibU5RkJ6Gd?%F~6&$rpQ|0~eS`{2l% qQRGN>2h_eBV=Xlifq%`pAHM-7oh@>oH=DHp0000YzPZL2D{@QG3DczPIB^tp9A(0r$p}>J~B3{&k zi5Cx=7%{<^_-_~!{{#}F2aSmyyqI`UFNTxx0v=j~T~dq4k0?ZGx0IbdtcP}xyIt03+`~2>_?^pK|SEtet%g9T7js)<_FyketXhLgbqN_ zfn44sLr@QhyFl1w|9=*dmvgT?yHutLBbB7j{`nxki&GcqL301eL+{qLnWj7lnw4J$ z03=cdQXMI5tgR!}ks^oEZb|uq;HBLXDkYod@7%lVZLMu8zJ4AU!1Cfp0Kk5=3IJ$} z$FX0n(tjw>7LO}_@*DsZRxD-V8#B|Me=Z1-xwkL8WU|)H+dDr106po>-{R$R1yg4) zMF8N<>*pQ-oI8IxkT=ahI^9LuUMPN1bYRIWDB8bd78G4rG7E?9@Gxk(MGHEMDX-$m zi7XuM(kob;f72=g0K_ZWTv?@swzj@03;TI9M1O($1yn!ZhS83)T>*f)49Ds+%;>o$ z`-g=#GJG0?11I4)93z<_aL#dNXi!l;VHaH3$FswRc2=Dj!Ho7nA%Yn60r0O1NI=Eo3aoAlu;0E!Rx41bXqIcBocHTJJ}Gch7S zOQ#0d+tQ7pHRHH8ZDxBYKe+2SfX@!_fJ~JAiRVSGx>7y2a?+lgJLlmz*4?ZsNE$re-0^Hh|)QicHdI zSI#)Dt#}k@gMU3kz8o96#i89tF|=kC2`@KwQ_VMYi;v7iav&bevE$l`%gA`ScYY(F z&19!Tb1ri%!z{VCCK^%$qHNdHfON>zES8)chHll^^CG95i2^Ns_=+#5GRN|s!+H%s zZH+|M0l=42Z;pdCAS2Vz8hDkRQi>N=1Hqhciw;P|^MB@8-gC)?E0lfPbRet-g4*xZ z0idxu5WMHX-Vn66nGJ}5R|h8M$CM$g24pXgcJKVHA~xKABJv_ppk3@uRU~O`-AN*m z0H9PVQ79~jj!P5@%exWwXl*#Rh9un zd94MzqAJI0&o%G-sL=YlFLAu%EKYfqzV1snuFaXw3pnLfb#iH!T-wvA0q(E0<5PQ1 z12E2~P+r%8SJ^40X!67|w30tx7*mbN%e{E_j&2ExBS){4}O&cTX-M*_huCTue$?U ja^%RCnux@|<~)c$f0ikCL%yAG00000NkvXXu0mjfdcvtD delta 844 zcmV-S1GD__2IB^hB!4PNL_t(oh2@veOH@%5$3G75f$u#XsZk^Pp_MKSH~rj3AmJir zp#(0H1fl*1X%$ibKu`pNP>Vp^NQ;34G0{aytd9DNA=%o6a0O#aDMa2T+0qT5cz;h@FIlm{RC=<+KF~2# zMFeQc)-F!gHe+ZtIIc~?YzXD&kF^8%>;MA{MfrVVS+P<4vHT8(ZsFw#v!R3wS14Wy zXrI?-Fmwxm(Zvx=%_`wg-1(ciSD2cGw(0Jbwzbp0-|JjSb!6!tsk3T8+wtmz%n&{EPPIkphSXYwWnT;xaQ{?)9$( zw5jxDXw7AfWtt`T_C!T`K;-R`9*_Z<9QJzv zN_!--4gkKIdTSi)0hyVK_P}&{LMdKY4+Lv|Bsw4!&wpEEdCnylu2A+P(}A!a2x`Aq z2P%PBu;vHd4MBUtY=|6yPY1@9Qpyn41M)7AcCY_Gi>kL1slrZfTTRr&Yt`rAe3;+u z8=dMw^78dy;r`wJvOEmh!k2jftauIax;U#VY2tNp<&fLT`Mw}|ZYzhK+t-3ePahY4 ztgQKbgMU0Ufce=u0CpV*fNH~F*KyP+QEeDLKkppC_r(R@!hQYs3cXTXHy*mknS#{az`W+_6lxLT)TFFyU8IgpnP;8NoiwWDvFv%U%?6?Rtxz5;(OIfWhVEGTr?SN89cx|9`8g4M7HzPHl?Z>;$qP znNU8tN}k;81R{autw~@n<}U%f&+>b)y89hOK@xaA!j?pFu9826d&)O>6eisd9>Q(_ z(A;ce*}*BScYd&bfMo|vs4&>(W*e&60sl3x8WOc6$<0kR}sRY}wMx7j|Q`9MC({SZ5}Rqw_~$@@U<+}ponC1bF za$+PL=qYiE1HzV}(+=<(AqSHF?taH`B#TL>R*KbB*VvqM1{_G`NLCI2v6@C}oaBJc z%t$$)w%P=J#Y^KrvgQ|}16uK-HP+``<6eXV7p4PA4u7O+e^dux4|XzUAX)RXdPCBm ztK_q1AgTlHdaFO2&H>#Ew7*?%!Bn;Y#MJrYyPn`DO^Ss>Tu)Fe1WY<(u{i+OtJCL_MX~Yp zvH7rIJAW~!rv(J_GE-m%`HUS}9iHTl4PgshAMaQrduSP5YC&z`H$YoVosAO}6VToW9ZxZo$w~zPSaLm!-KCgNsue z`1LXDeCcPrnvRE=1@vV&Y&3E@#1P7GD8GJRj(@{)M(1ZWSz5fx_}ys&&!@EL6DXf6 z_pcFnzS+63C=W#d`&_qm$2vu?%#79MMz0$v~PvYX-#H>Iw_HOTnA!b8+6MUMz|K#Vo+|_3>E| zdoT_gPd>Gs=YDYM&B(gczXNh%cPZ1|`hRPlv_JhEHPblHsdWGV002ovPDHLkV1m>Q BnC$=n delta 819 zcmV-31I+x+2FeDIB!3Y}L_t(oh2@t&Y|}s##(#FMCI8*D5LhTMAx2FiC%#4uQ8Hoi6F~Ho3p_Kqp%80}SRaI2}R6r?IrB3Wb#mO-^cd;F(f;t@#-*Wlx zyKGY;ta%tYL6E1)=?>m>Jk5In;l8S2 z%7S{L5}mR}x>q^wz=538dp;W+hG6msD{;M@9_!UrLqJ zNXOGW2}EhU6o1m#$O-z64Pa!1jzo}~IidZPJqgUH#xkI>icF9P{d)mXop)n3R~q|a zZu4MH^dtwGuF;VLMo##~ti)UQb0BJOtkrdnB!RF-3n5LF#`-;{oddBslC%y0Ax(oC zM{__$rl&dJ%vF%BiWipyQO$Ry4ycM3)L6aeiZ=r}uzzcHAesYlwLe$~U^Vdt%&6wu z^@gZDRZb_qK&TE>X6)8>d=98ypzLk`e;CH&xfxlt+u58i7WC)new^RM(<6Eyx%cS4 zymo1#E02R%db0>Xu9&B275TFAnW9zH4)$g^%!=EaHjZ7@`?n@<%hi>yA>SyEy};tz z1pw-`8h-%kOon=`rdNe@CKK`t?g1>nTM8X~W#Y1o?#03Q{@}S3<$eIRKGXr|Kb-y} z?yYUH@9G%?;M?725@7%Jv$4Eu1p1C-WBYwv?T^+4=9AX}QJJ-|T9vLn1w+&E^b}kg z7kVlN7i+9#f9dLj>Wksd80Fnyg5QA5R-+L^K7R+l44YZ$5287t$F-n;Qi#HZBK;@! zB5NLn5fABj>^XG+S@ZOhE4$*#ZjAzy{z2K}snEeu-t_{`i;Avj>WQoK%OP&hzSoT? z$b)cSH@4+nFOWT%(NFYi;b$lUjZamYj;A9KXIBHsP9p%o#~V*&k~MnH-@pWPU+*6_ xLM&^y{phODi}~RHgRv9cf;e>NT%y0{zX2$ME?Kf{WVQeR002ovPDHLkV1gzmnHvBA diff --git a/src/main/resources/assets/create/textures/block/table_cloth/orange.png b/src/main/resources/assets/create/textures/block/table_cloth/orange.png index 9e297b1f74924344135d7d17382e2e438665b786..10305c8c7afd7d6c18cc2df193114b410a4c4c1b 100644 GIT binary patch delta 828 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 diff --git a/src/main/resources/assets/create/textures/block/table_cloth/red.png b/src/main/resources/assets/create/textures/block/table_cloth/red.png index 96330f9ac47ff832e649471241f40f8c7d3d057b..fc403df6dc0c7d9646fe2aac0b2fe8c56dfb8997 100644 GIT binary patch delta 858 zcmV-g1Eu`v2Jr@vB!4(bL_t(og~gZ6YZE~j#(#;sV7fbL{DOYaL!oGb%}GVUgH;d( zQ7T2elvcb*q2NDIyyzcby?7G}9t5$4>Om>^ai}LfDO9DGDmK-Y5<5v&+(6 zM6)SAm)U3D$?QAt`|dMu63>Rt)Ux9vRHbBbY6iDhCUMq=VqMulXR8~7$QwoZeR)qz*yA%tFU3LEY$#Bv}R&ao>?nybk8 zxqp2tU@T3~Mdn=PScO?}e@(Qc2Haw~t_GAtX2zoYX%$o0b#`aDpq+^WBX@N;kW-ao z{hhN}0}xRoadiL)0`OtpLnDL#q#$}W`W~+k80j2mOLji zHcqibDt}{>v9<@+0312kTcZgiu3bK?f7r3JEnr+(uMoER=K#K}m(>Z?K8<)JjEmXh zq`Er**m$=HKswvkn0Ie-=kp4;UOoa~EI$Ci?KjUOc|!-%**>4PKMm=?Y(V>AHlPbD z4`=_l`QN};oSGpkM4&6qPmEEOQg^}m38A}U0Dsj*D-Q7WSg1Ugbl~&Il zoaF+5C&L-blVM@&cFn&&b_DuH&$Dab1XZ~~-{^T(0THxKGC<=uL2P$ ze^Yo*RZ1O!D0}P(Tp8?VNbasZ5NnBMN3~g){|%CWzSno`?+uKN=EI{xGyTDTzl@Uq k_3eP6sJJ>-v9sr delta 849 zcmV-X1Frn>2IvNmB!4eSL_t(oh2@veYZE~f$3G3bVA!2)M1=l8K`0uL9;6ED#rgvk z`~l*%w1OZMD)kTONeZ4lDT2~MZ_-w(g0-mipm@-eKWa4y8k!Wnq?v>*Y#<)uOm{aM zi*7uK-^=7XZ-1Pr}XRF@!@!7BPj5pC>!o>v%;< z&6@!uKldC{*Z?eCo4`z2bsTCZe=~X=GiBk)5~i?OxHb{nfkZj`9YcuPrYQ@rPzKN( z(2=pWY}U?rvVWv`92ngrgMl2I!lt!n4~B4bB>dbELa#T44P$p=IgkkF*pnsARb>3! zzrGnTzD&(U=3M1ig;{ZbO*Ewjyh6FI29!f)%A%b8jw$RqyPL~vXX3!vIoub>smigw z=d9HLMAS%J9RLD3_2)QT11d62t%0vovs&?@Y9O5Rzki|wO7Z+TR`*=-ij>;^*K{DN z2Ey9!*8!lpIuO3+;kO}dPj@7ZMF1?v#%XoPWtVVT*F>ne61?w<7gvguizPjO z2NvHi0I=%10BlGmS#@1KDr`t51MB>A0G~6T0vn&dFi;K8MLKY4 zYl>uNTkTXIG5|RHcL#a8YmILdn!8KO-1xcC<&IiP#v1U34mjy9pSC{<>A*}t`(Y-a z3(NOr);-~RFf!xQq=g7{#oZ%=RHW2haQBGNU4Jov>Y^0~`1ay$VB;`vgaoJus1`D7 z%VykMt$4gb88c*@AErI0Qz0uxNBQrY&0Jp6`Ii>{C{Zqlf3zH?D2f8 bzvn*y(`Xj4$0<;Q00000NkvXXu0mjf2uYr* diff --git a/src/main/resources/assets/create/textures/block/table_cloth/white.png b/src/main/resources/assets/create/textures/block/table_cloth/white.png index bcf52d25d5d7f931c9132df19070d986b405d9c2..5d06633ce52ce4fa36dfb2daad10211e5d3718cb 100644 GIT binary patch delta 834 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 D>jaQL delta 801 zcmV++1K#}42Db)~BYy(^Nkl+EkOh>-4xm2G~}4 z2s3{StRhm>FmgTVyfgry*?o*>`F%{;sQ8p@grju*j;{-*#T2FmZET54pO)PiUTS#My^jeKdR^0 zDqxldz$&UpXn)))s`b8oERzFfQ_e*#%5e}GjmOrv1Gcv|m7en;$13b0kJm(7YCyP6 zH4r*vSPrtW zR*IKe1Bsj;hz^8`r{y@f=c*<|HL@R+4y4sUllI4Sz<);@bs%}qlW#+lJ=c@z$04Bu zVr4=ZQfnZ13qpH*{XYxi<;*L&?QW@wlGCX^C+E}FT^hWg8j`W6kL9iFBQ1Fv?D>y# z02G}PPM5>-;u20*q;T%0t9>El?xsuC-B$B=AKaJU7Qbq1lRVXdx!F$u?9}T3bma5w z)az;t(SMQ8YwO~301KbzwT*9%+>pt+G#FcR4<(0s0g$x?f3k4mk2pV9={$AY0B~pT zNC0QxUMg=H0i$qSX}g!u0fDal0$mrx_nAFUxEE}(`a<37co&SQMqO~MD+VCwqP_Lk zY9nv!gSK&!w}J_=2MB!mZBzgP8FnI33fr~V`hTpjt=`L+U1xlyJ8}gnYFLK{K~&Yr zLwm?WJ4dep&j7Hx&j(vhrt+2!i1lfuXyJ*&P={QsJdZt85syP`y!kC}>44dNPMyfx zp4B4Y)xUtKstBaogN9_k5ddK0-9?#YOz!hHFahF@b3_51pm#3bqR00000NkvXXu0mjf9Q=+` diff --git a/src/main/resources/assets/create/textures/block/tunnel/andesite_tunnel.png b/src/main/resources/assets/create/textures/block/tunnel/andesite_tunnel.png index 98df4e428c4aefee36df85c45ad59906c23c0afb..255ef40f1319943d90ffd37afb124ab2ee80d90f 100644 GIT binary patch delta 399 zcmV;A0dW3^1Kb0UBnUZBOjJbx0L76hHh);t z@7{a&N=rOB1!`T5P#J=Wn=f4wteZ$*9M;#GXRlS^AA#h*5J(FAxLwSz+u;_nzxUkx zn?woO&+Rx_lz-fy+@RIBW+w<7{_p^}hJ0oTY^s$YWiS(dA@^#ZuW&nW?4`nh1ZtI5YzHXM+5jjP|)J6$&H<(-{Y>b*oQld;w tTy2h*>YPK@C9DcLEQx&5!dTHhZB4+#o>;{5;s002ovPDHLkV1f^Bru_f_ delta 315 zcmV-B0mS~?1Be5VBn385OjJdYEH-}>>+!1q0004WQchCqa5Jb@*QDrC#q2d1LWM?Xa&eDK}X3vU{^Gk1IwYqux`p4ex)_N5R0zo{vc~Xxk z&CcsDPoShyRHSvYiv$QLgu2X_E|{Nm*_`G5)EJ+aK+iQ0(^`9Q{n!k?8!dltp1==3 z>+;eX^D*XljN#>VnJ?df?qwqq`V@MCD)?2`$7d+2J=D$jJr| zGlCEj2Er(Igwn+h5s*ITxDqQu?c)l)f&i(zCp`TADfi&T-T(K`_7i>yoZN%JzBvE@ N002ovPDHLkV1mLamxTZT From b3dde23fd782d651c0a57560e220d951a7eeb0ff Mon Sep 17 00:00:00 2001 From: IThundxr Date: Sat, 4 Jan 2025 11:22:33 -0500 Subject: [PATCH 237/515] Packed lists - Fix conditionContext in ScheduleRuntime not getting cleared before new entries are added --- .../simibubi/create/content/trains/schedule/ScheduleRuntime.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleRuntime.java b/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleRuntime.java index cf0d32fee3..b3e7c960fb 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleRuntime.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleRuntime.java @@ -68,6 +68,7 @@ public class ScheduleRuntime { return; state = State.POST_TRANSIT; conditionProgress.clear(); + conditionContext.clear(); displayLinkUpdateRequested = true; for (Carriage carriage : train.carriages) carriage.storage.resetIdleCargoTracker(); From 2a65490fb4bf7673842293423757cf6656877fe4 Mon Sep 17 00:00:00 2001 From: Kryppers <65094918+Kryppers@users.noreply.github.com> Date: Sat, 4 Jan 2025 18:32:03 +0000 Subject: [PATCH 238/515] tunnel vision fixed andesite tunnel mishap --- .../textures/block/tunnel/andesite_tunnel.png | Bin 476 -> 904 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/create/textures/block/tunnel/andesite_tunnel.png b/src/main/resources/assets/create/textures/block/tunnel/andesite_tunnel.png index 255ef40f1319943d90ffd37afb124ab2ee80d90f..3ea7b743d57bd8f4087f64163b8ab17fa4b750f4 100644 GIT binary patch delta 863 zcmV-l1EBoe1BeHZ85#xv0047(dh`GQ00v@9M??Tg05$*>;hX%9k$@q85*|6*d!EDq z00R|CL_t(o!|j#NYZE~f$G;6*-EFe7VO?#K5=szh5kx2!iYGw@5B>`Uk3IMo6?$ur zq6ZHOt<>tFU{j-!)>s4~m_!I6JGGrrku4mJlbd8e6|{bb*K-}miI+jy0L;lYd@O%P5CkwB3%2b@UW>vAKKHP{SH@AT z2G8@)D<*3IFl*-ph}^>6JBY$a7PG%sMwfHsuUrKHR4P?eDpkoB3fIu>c2TKRk!4Ks z8USRNiClgf3rmZC=y6}^VVY&osyCG$Zol4A6cGH2XU`{|EHC$i-~?}X-b_$+Xny7C zN?-6PDkrm;B6XT&WZ$U=;z5hKtZA56{d zEea!Wm&;_2`-=1Fp1T~(Vi1h*0Ogrspqp?~ny0*?0ChcocR8|?siBGtQ{edQEKz}^ zyfTL3G-;NB=X&R32q0~!#Wm}V#Fh#EUn3QTk(8O9Qpla;3*FGs<36G=0_6eV`1BM( z5DY3n@{~{Mh7Qm5l)lrKiLn%WVMfpOWD6*Nd2$ktlO3FbSYGfNm5#eywjk~ax))4b z_SN;Z{>JKm27(~K>iSw=6wO@@n&033AbBl5TJfL-4KpK^b^iJ+co?EpZ_3|V^`^}C zxUalRPC>kv+~vw%n6FuHBz^~k8ir$Gx|oA$nF=rR@uE{v7{Rnmd0Gk$`ydHMn2_?b zr4nr0kzNt}Y^j8sw{H#bnr`R=H=PK2oyMO@vy41C{V2TjK&$x+?>4vp-hg|6X_6c8 p&z|0pG)CpeF^+MJV;ui2egnAz5^vpOtPubJ002ovPDHLkV1nahn5F;# delta 455 zcmV;&0XY7M2iyaY8Gi!+002a!ipBr{069=hR7C&)#Q*>Rw86Njv#Xkn@C?A*4LV6uT|k6f#kmsNDBP8UCgiB;TE#L z_uTuNLlz-fy+@RIBW+w<7{_p^}hGq$Ds+AySL0Fk&5KP{A3&y|Q<>78{^B(D; zLOq{=8_EM2ZqY}H^q@fUb<xS#TZkE>(Jvl|f)J6$&H<(-{Y>b*o xQld;wTy2h*>YPK@C9DcLEQx&5!dTHhZB4+#o>;{5;s002ovPDHLkV1hIpyr%#F From 363bcd98076cf5a173aa3af804f1ba82eda6e192 Mon Sep 17 00:00:00 2001 From: TropheusJ Date: Sat, 4 Jan 2025 15:02:14 -0500 Subject: [PATCH 239/515] provider system, add chest storage tag, enable item storage sync --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 3 +- .../tags/blocks/chest_mounted_storage.json | 6 ++ .../java/com/simibubi/create/AllBlocks.java | 3 +- .../java/com/simibubi/create/AllTags.java | 1 + .../storage/MountedStorageTypeRegistry.java | 20 ++++- .../create/api/lookup/BlockLookup.java | 75 +++++++++++++++++++ .../contraptions/MountedStorageManager.java | 61 ++------------- .../foundation/data/BuilderTransformers.java | 8 -- .../MountedStorageTypeRegistryImpl.java | 17 ++++- .../data/CreateRegistrateTags.java | 3 + 10 files changed, 126 insertions(+), 71 deletions(-) create mode 100644 src/generated/resources/data/create/tags/blocks/chest_mounted_storage.json create mode 100644 src/main/java/com/simibubi/create/api/lookup/BlockLookup.java diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 5ad7394684..940796fc86 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2025-01-03T19:15:37.648009952 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2025-01-04T14:57:43.077036202 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -4629,6 +4629,7 @@ a57dfe9974b8b6d338b9ab4ae124297fda7780b9 data/create/recipes/weathered_iron_wind 11034a79e8f167249b78e6e3863e01991ac9d778 data/create/recipes/weathered_iron_window_pane.json f365be4eda73234b73aa49c97b065f1a8baafbf6 data/create/tags/blocks/brittle.json 8b6c0b444b15f7fb2d55b9cbcb68537c1269f877 data/create/tags/blocks/casing.json +c603fae95069714ac3d256dfa31f8d2639efafa7 data/create/tags/blocks/chest_mounted_storage.json c7ec0dbc18e9c1b58e568ed925287b89df11a136 data/create/tags/blocks/copycat_allow.json 876eb9210f4a14898a2fe6d225699c66b5bdfeef data/create/tags/blocks/copycat_deny.json 7296238b4c6b81251870addce1de8ecda63381dc data/create/tags/blocks/corals.json diff --git a/src/generated/resources/data/create/tags/blocks/chest_mounted_storage.json b/src/generated/resources/data/create/tags/blocks/chest_mounted_storage.json new file mode 100644 index 0000000000..86533f935b --- /dev/null +++ b/src/generated/resources/data/create/tags/blocks/chest_mounted_storage.json @@ -0,0 +1,6 @@ +{ + "values": [ + "minecraft:chest", + "minecraft:trapped_chest" + ] +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index ca2ef9cb72..ab4d7b31aa 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -3,10 +3,10 @@ package com.simibubi.create; import static com.simibubi.create.AllInteractionBehaviours.interactionBehaviour; import static com.simibubi.create.AllMovementBehaviours.movementBehaviour; import static com.simibubi.create.Create.REGISTRATE; +import static com.simibubi.create.api.contraption.storage.MountedStorageTypeRegistry.mountedItemStorage; import static com.simibubi.create.content.redstone.displayLink.AllDisplayBehaviours.assignDataBehaviour; import static com.simibubi.create.foundation.data.BlockStateGen.axisBlock; import static com.simibubi.create.foundation.data.BlockStateGen.simpleCubeAll; -import static com.simibubi.create.foundation.data.BuilderTransformers.mountedItemStorage; import static com.simibubi.create.foundation.data.CreateRegistrate.connectedTextures; import static com.simibubi.create.foundation.data.ModelGen.customItemModel; import static com.simibubi.create.foundation.data.TagGen.axeOnly; @@ -16,7 +16,6 @@ import static com.simibubi.create.foundation.data.TagGen.tagBlockAndItem; import com.simibubi.create.AllTags.AllBlockTags; import com.simibubi.create.AllTags.AllItemTags; -import com.simibubi.create.api.contraption.storage.MountedStorageTypeRegistry; import com.simibubi.create.content.contraptions.actors.contraptionControls.ContraptionControlsBlock; import com.simibubi.create.content.contraptions.actors.contraptionControls.ContraptionControlsMovement; import com.simibubi.create.content.contraptions.actors.contraptionControls.ContraptionControlsMovingInteraction; diff --git a/src/main/java/com/simibubi/create/AllTags.java b/src/main/java/com/simibubi/create/AllTags.java index aab061a218..3d9528a775 100644 --- a/src/main/java/com/simibubi/create/AllTags.java +++ b/src/main/java/com/simibubi/create/AllTags.java @@ -103,6 +103,7 @@ public class AllTags { VALVE_HANDLES, WINDMILL_SAILS, WRENCH_PICKUP, + CHEST_MOUNTED_STORAGE, SIMPLE_MOUNTED_STORAGE, FALLBACK_MOUNTED_STORAGE_BLACKLIST, ROOTS, diff --git a/src/main/java/com/simibubi/create/api/contraption/storage/MountedStorageTypeRegistry.java b/src/main/java/com/simibubi/create/api/contraption/storage/MountedStorageTypeRegistry.java index 202b0029e4..aa22dfcd96 100644 --- a/src/main/java/com/simibubi/create/api/contraption/storage/MountedStorageTypeRegistry.java +++ b/src/main/java/com/simibubi/create/api/contraption/storage/MountedStorageTypeRegistry.java @@ -2,12 +2,15 @@ package com.simibubi.create.api.contraption.storage; import com.simibubi.create.Create; import com.simibubi.create.api.contraption.storage.item.MountedItemStorageType; -import com.simibubi.create.foundation.utility.AttachedRegistry; +import com.simibubi.create.api.lookup.BlockLookup; import com.simibubi.create.impl.contraption.storage.MountedStorageTypeRegistryImpl; -import net.minecraftforge.registries.ForgeRegistries; +import com.tterrag.registrate.builders.BlockBuilder; +import com.tterrag.registrate.util.nullness.NonNullUnaryOperator; + import net.minecraftforge.registries.IForgeRegistry; +import net.minecraftforge.registries.RegistryObject; import net.minecraft.core.Registry; import net.minecraft.resources.ResourceKey; @@ -18,9 +21,20 @@ public class MountedStorageTypeRegistry { Create.asResource("mounted_item_storage_type") ); - public static final AttachedRegistry> ITEMS_BY_BLOCK = new AttachedRegistry<>(ForgeRegistries.BLOCKS); + public static final BlockLookup> ITEM_LOOKUP = new BlockLookup<>(MountedStorageTypeRegistryImpl::itemFallback); + /** + * @throws NullPointerException if called before registry registration + */ public static IForgeRegistry> getItemsRegistry() { return MountedStorageTypeRegistryImpl.getItemsRegistry(); } + + /** + * Utility for use with Registrate builders. Creates a builder transformer + * that will register the given MountedItemStorageType to a block when ready. + */ + public static NonNullUnaryOperator> mountedItemStorage(RegistryObject> type) { + return builder -> builder.onRegisterAfter(ITEMS, block -> ITEM_LOOKUP.register(block, type.get())); + } } diff --git a/src/main/java/com/simibubi/create/api/lookup/BlockLookup.java b/src/main/java/com/simibubi/create/api/lookup/BlockLookup.java new file mode 100644 index 0000000000..f90b428d00 --- /dev/null +++ b/src/main/java/com/simibubi/create/api/lookup/BlockLookup.java @@ -0,0 +1,75 @@ +package com.simibubi.create.api.lookup; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.jetbrains.annotations.Nullable; + +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; + +/** + * Lookup for objects provided by blocks. Values can either be registered directly + * or found lazily through providers. Providers are only queried once per block. + * If they return a value, that value is cached. If they don't, that block is recorded + * as not having a corresponding value. + *
+ * All providers are expected to be registered synchronously during game init. + * Adding new ones late is not supported. + */ +public class BlockLookup { + private final Map map; + private final Set blacklist; + private final List> providers; + + public BlockLookup(Provider defaultProvider) { + this.map = new HashMap<>(); + this.blacklist = new HashSet<>(); + this.providers = new ArrayList<>(); + this.registerProvider(defaultProvider); + } + + @Nullable + public T find(BlockState state) { + return this.find(state.getBlock()); + } + + @Nullable + public T find(Block block) { + if (this.blacklist.contains(block)) + return null; + + return this.map.computeIfAbsent(block, $ -> { + for (Provider provider : this.providers) { + T value = provider.get(block); + if (value != null) { + return value; + } + } + + this.blacklist.add(block); + return null; + }); + } + + public void register(Block block, T type) { + this.map.put(block, type); + } + + /** + * Register a new provider that will be queried. + * Providers are queried in reverse-registration order. + */ + public void registerProvider(Provider provider) { + this.providers.add(0, provider); + } + + public interface Provider { + @Nullable + T get(Block block); + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/MountedStorageManager.java b/src/main/java/com/simibubi/create/content/contraptions/MountedStorageManager.java index cb89414026..910036275e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/MountedStorageManager.java +++ b/src/main/java/com/simibubi/create/content/contraptions/MountedStorageManager.java @@ -6,8 +6,6 @@ import java.util.Objects; import com.google.common.collect.ImmutableMap; import com.mojang.datafixers.util.Pair; -import com.simibubi.create.AllMountedStorageTypes; -import com.simibubi.create.AllTags; import com.simibubi.create.api.contraption.storage.MountedStorageTypeRegistry; import com.simibubi.create.api.contraption.storage.item.MountedItemStorage; import com.simibubi.create.api.contraption.storage.item.MountedItemStorageType; @@ -24,11 +22,9 @@ import net.minecraft.nbt.NbtUtils; import net.minecraft.nbt.Tag; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate.StructureBlockInfo; -import net.minecraftforge.common.capabilities.ForgeCapabilities; import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.wrapper.CombinedInvWrapper; @@ -82,7 +78,7 @@ public class MountedStorageManager { } public void addBlock(Level level, BlockState state, BlockPos globalPos, BlockPos localPos, @Nullable BlockEntity be) { - MountedItemStorageType type = getMountedStorageType(state); + MountedItemStorageType type = MountedStorageTypeRegistry.ITEM_LOOKUP.find(state); if (type == null) return; @@ -96,10 +92,10 @@ public class MountedStorageManager { BlockPos localPos = info.pos(); MountedItemStorage storage = this.items.storages.get(localPos); if (storage != null) { - Block block = info.state().getBlock(); - MountedItemStorageType expectedType = MountedStorageTypeRegistry.ITEMS_BY_BLOCK.get(block); - if (typeMatches(expectedType, storage, info, be)) { - storage.unmount(level, info.state(), globalPos, be); + BlockState state = info.state(); + MountedItemStorageType expectedType = MountedStorageTypeRegistry.ITEM_LOOKUP.find(state); + if (storage.type == expectedType) { + storage.unmount(level, state, globalPos, be); } } } @@ -124,9 +120,6 @@ public class MountedStorageManager { } public void write(CompoundTag nbt, boolean clientPacket) { - if (clientPacket) - return; - ListTag items = new ListTag(); nbt.put("items", items); @@ -184,53 +177,13 @@ public class MountedStorageManager { if (info == null) return false; - if (player.level().isClientSide()) { - return getMountedStorageType(info.state()) != null; - } - MountedStorageManager storageManager = contraption.getStorageForSpawnPacket(); MountedItemStorage storage = storageManager.items.storages.get(localPos); + if (storage != null) { - return storage.handleInteraction(player, contraption, info); + return player.level().isClientSide || storage.handleInteraction(player, contraption, info); } else { return false; } } - - private static boolean typeMatches(MountedItemStorageType registered, MountedItemStorage storage, - StructureBlockInfo info, @Nullable BlockEntity be) { - MountedItemStorageType actual = storage.type; - if (registered == actual) - return true; - if (registered != null) - return false; - - BlockState state = info.state(); - if (actual == AllMountedStorageTypes.SIMPLE.get()) { - return AllTags.AllBlockTags.SIMPLE_MOUNTED_STORAGE.matches(state); - } else if (actual == AllMountedStorageTypes.FALLBACK.get() && be != null) { - return !AllTags.AllBlockTags.FALLBACK_MOUNTED_STORAGE_BLACKLIST.matches(state) - && be.getCapability(ForgeCapabilities.ITEM_HANDLER) - .resolve() - .flatMap(AllMountedStorageTypes.FALLBACK.get()::validate) - .isPresent(); - } else { - return false; - } - } - - @Nullable - private static MountedItemStorageType getMountedStorageType(BlockState state) { - MountedItemStorageType registered = MountedStorageTypeRegistry.ITEMS_BY_BLOCK.get(state.getBlock()); - if (registered != null) - return registered; - - if (AllTags.AllBlockTags.SIMPLE_MOUNTED_STORAGE.matches(state)) { - return AllMountedStorageTypes.SIMPLE.get(); - } else if (!AllTags.AllBlockTags.FALLBACK_MOUNTED_STORAGE_BLACKLIST.matches(state)) { - return AllMountedStorageTypes.FALLBACK.get(); - } else { - return null; - } - } } diff --git a/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java b/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java index cd9ff9d25a..6de7b7df61 100644 --- a/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java +++ b/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java @@ -552,12 +552,4 @@ public class BuilderTransformers { c::get, 2)) .simpleItem(); } - - public static NonNullUnaryOperator> mountedItemStorage(RegistryObject> type) { - return builder -> builder.onRegisterAfter( - MountedStorageTypeRegistry.ITEMS, - block -> MountedStorageTypeRegistry.ITEMS_BY_BLOCK.register(block, type.get()) - ); - } - } diff --git a/src/main/java/com/simibubi/create/impl/contraption/storage/MountedStorageTypeRegistryImpl.java b/src/main/java/com/simibubi/create/impl/contraption/storage/MountedStorageTypeRegistryImpl.java index a986e710ab..66030958e1 100644 --- a/src/main/java/com/simibubi/create/impl/contraption/storage/MountedStorageTypeRegistryImpl.java +++ b/src/main/java/com/simibubi/create/impl/contraption/storage/MountedStorageTypeRegistryImpl.java @@ -3,6 +3,7 @@ package com.simibubi.create.impl.contraption.storage; import java.util.Objects; import com.simibubi.create.AllMountedStorageTypes; +import com.simibubi.create.AllTags; import com.simibubi.create.api.contraption.storage.MountedStorageTypeRegistry; import com.simibubi.create.api.contraption.storage.item.MountedItemStorageType; @@ -40,13 +41,23 @@ public class MountedStorageTypeRegistryImpl { if (event.getRegistryKey() != MountedStorageTypeRegistry.ITEMS) return; - register(Blocks.CHEST, AllMountedStorageTypes.CHEST); - register(Blocks.TRAPPED_CHEST, AllMountedStorageTypes.CHEST); register(Blocks.DISPENSER, AllMountedStorageTypes.DISPENSER); register(Blocks.DROPPER, AllMountedStorageTypes.DISPENSER); } private static void register(Block block, RegistryObject> type) { - MountedStorageTypeRegistry.ITEMS_BY_BLOCK.register(block, type.get()); + MountedStorageTypeRegistry.ITEM_LOOKUP.register(block, type.get()); + } + + public static MountedItemStorageType itemFallback(Block block) { + if (AllTags.AllBlockTags.CHEST_MOUNTED_STORAGE.matches(block)) { + return AllMountedStorageTypes.CHEST.get(); + }if (AllTags.AllBlockTags.SIMPLE_MOUNTED_STORAGE.matches(block)) { + return AllMountedStorageTypes.SIMPLE.get(); + } else if (!AllTags.AllBlockTags.FALLBACK_MOUNTED_STORAGE_BLACKLIST.matches(block)) { + return AllMountedStorageTypes.FALLBACK.get(); + } else { + return null; + } } } diff --git a/src/main/java/com/simibubi/create/infrastructure/data/CreateRegistrateTags.java b/src/main/java/com/simibubi/create/infrastructure/data/CreateRegistrateTags.java index c10809e776..59e9a5da7d 100644 --- a/src/main/java/com/simibubi/create/infrastructure/data/CreateRegistrateTags.java +++ b/src/main/java/com/simibubi/create/infrastructure/data/CreateRegistrateTags.java @@ -109,6 +109,9 @@ public class CreateRegistrateTags { .addTag(BlockTags.RAILS); // tags aren't used here because the implementations of modded entries are unknown + prov.tag(AllBlockTags.CHEST_MOUNTED_STORAGE.tag).add( + Blocks.CHEST, Blocks.TRAPPED_CHEST + ); prov.tag(AllBlockTags.SIMPLE_MOUNTED_STORAGE.tag).add( Blocks.BARREL, Blocks.SHULKER_BOX, Blocks.WHITE_SHULKER_BOX, Blocks.ORANGE_SHULKER_BOX, Blocks.MAGENTA_SHULKER_BOX, Blocks.LIGHT_BLUE_SHULKER_BOX, From 57d01ce71e64660795f7f8b03f47b9ac2cf5f72c Mon Sep 17 00:00:00 2001 From: IThundxr Date: Sat, 4 Jan 2025 17:29:09 -0500 Subject: [PATCH 240/515] Immortal trains - Fix /c trains command running the wrong command to remove trains --- .../create/infrastructure/command/DumpRailwaysCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/simibubi/create/infrastructure/command/DumpRailwaysCommand.java b/src/main/java/com/simibubi/create/infrastructure/command/DumpRailwaysCommand.java index cb9d32d2a5..9be001c436 100644 --- a/src/main/java/com/simibubi/create/infrastructure/command/DumpRailwaysCommand.java +++ b/src/main/java/com/simibubi/create/infrastructure/command/DumpRailwaysCommand.java @@ -166,7 +166,7 @@ public class DumpRailwaysCommand { Components.literal("Remove").withStyle(style -> style.withColor(orange)) ).withStyle(style -> style .withColor(blue) - .withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/c train kill " + train.id.toString())) + .withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/c train remove " + train.id.toString())) .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Components.literal("Click to remove ").append(train.name))) ) ); From c3183661946fc4c50ff4fa9b83bc1ca98c5c9df6 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Sat, 4 Jan 2025 17:42:57 -0500 Subject: [PATCH 241/515] The deployers and the fishes - Fix deployers not placing fish from fish buckets - Fixes Creators-of-Create/Create#3705 --- .../create/content/kinetics/deployer/DeployerHandler.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/com/simibubi/create/content/kinetics/deployer/DeployerHandler.java b/src/main/java/com/simibubi/create/content/kinetics/deployer/DeployerHandler.java index 48f7b001f4..7561ce4899 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/deployer/DeployerHandler.java +++ b/src/main/java/com/simibubi/create/content/kinetics/deployer/DeployerHandler.java @@ -9,6 +9,8 @@ import java.util.stream.Collectors; import javax.annotation.Nullable; +import net.minecraft.world.item.MobBucketItem; + import org.apache.commons.lang3.tuple.Pair; import com.google.common.collect.Multimap; @@ -335,6 +337,10 @@ public class DeployerHandler { itemUseWorld = new ItemUseWorld(world, face, pos); InteractionResultHolder onItemRightClick = item.use(itemUseWorld, player, hand); + + if (onItemRightClick.getResult().consumesAction() && item instanceof MobBucketItem bucketItem) + bucketItem.checkExtraContent(player, world, stack, clickedPos); + ItemStack resultStack = onItemRightClick.getObject(); if (resultStack != stack || resultStack.getCount() != stack.getCount() || resultStack.getUseDuration() > 0 || resultStack.getDamageValue() != stack.getDamageValue()) { From a61e6dff2791780895dd947522cc122ee0c758c7 Mon Sep 17 00:00:00 2001 From: TropheusJ Date: Sat, 4 Jan 2025 17:46:34 -0500 Subject: [PATCH 242/515] improve chest connecting, some cleanup --- .../create/AllMountedStorageTypes.java | 2 +- .../storage/item/MountedItemStorage.java | 7 ++- .../storage/item/MountedItemStorageType.java | 4 +- .../item/WrapperMountedItemStorage.java | 5 +- .../item/chest/ChestMountedStorage.java | 53 ++++++++++++++++--- .../item/chest/ChestMountedStorageType.java | 14 +++-- .../item/simple/SimpleMountedStorage.java | 39 +++++++------- .../item/simple/SimpleMountedStorageType.java | 29 +++++----- .../storage/DispenserMountedStorage.java | 10 ++-- .../storage/DispenserMountedStorageType.java | 6 +-- .../toolbox/ToolboxMountedStorage.java | 2 +- .../crate/CreativeCrateMountedStorage.java | 2 +- .../vault/ItemVaultMountedStorage.java | 2 +- .../storage/FallbackMountedStorage.java | 33 ++++++++++++ .../storage/FallbackMountedStorageType.java | 28 +++------- 15 files changed, 151 insertions(+), 85 deletions(-) create mode 100644 src/main/java/com/simibubi/create/impl/contraption/storage/FallbackMountedStorage.java diff --git a/src/main/java/com/simibubi/create/AllMountedStorageTypes.java b/src/main/java/com/simibubi/create/AllMountedStorageTypes.java index dbe0d365a7..3530c25eda 100644 --- a/src/main/java/com/simibubi/create/AllMountedStorageTypes.java +++ b/src/main/java/com/simibubi/create/AllMountedStorageTypes.java @@ -19,7 +19,7 @@ import net.minecraftforge.registries.RegistryObject; public class AllMountedStorageTypes { private static final DeferredRegister> REGISTER = DeferredRegister.create(MountedStorageTypeRegistry.ITEMS, Create.ID); - public static final RegistryObject SIMPLE = REGISTER.register("simple", SimpleMountedStorageType::new); + public static final RegistryObject SIMPLE = REGISTER.register("simple", SimpleMountedStorageType.Impl::new); public static final RegistryObject FALLBACK = REGISTER.register("fallback", FallbackMountedStorageType::new); public static final RegistryObject CHEST = REGISTER.register("chest", ChestMountedStorageType::new); public static final RegistryObject DISPENSER = REGISTER.register("dispenser", DispenserMountedStorageType::new); diff --git a/src/main/java/com/simibubi/create/api/contraption/storage/item/MountedItemStorage.java b/src/main/java/com/simibubi/create/api/contraption/storage/item/MountedItemStorage.java index 3bc31d0bf3..15487bbf12 100644 --- a/src/main/java/com/simibubi/create/api/contraption/storage/item/MountedItemStorage.java +++ b/src/main/java/com/simibubi/create/api/contraption/storage/item/MountedItemStorage.java @@ -20,7 +20,6 @@ import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; -import net.minecraft.world.MenuProvider; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; @@ -35,7 +34,7 @@ public abstract class MountedItemStorage implements IItemHandlerModifiable { public final MountedItemStorageType type; - protected MountedItemStorage(MountedItemStorageType type) { + protected MountedItemStorage(MountedItemStorageType type) { this.type = Objects.requireNonNull(type); } @@ -60,7 +59,8 @@ public abstract class MountedItemStorage implements IItemHandlerModifiable { * @return true if the interaction was successful */ public boolean handleInteraction(Player player, Contraption contraption, StructureBlockInfo info) { - int slots = this.getSlots(); + IItemHandlerModifiable handler = this.getHandlerForMenu(info, contraption); + int slots = handler.getSlots(); if (slots == 0 || slots % 9 != 0) return false; @@ -72,7 +72,6 @@ public abstract class MountedItemStorage implements IItemHandlerModifiable { Vec3 globalPos = contraption.entity.toGlobalVector(Vec3.atCenterOf(localPos), 0); Predicate stillValid = p -> this.isMenuValid(p, contraption, globalPos); Component menuName = this.getMenuName(info, contraption); - IItemHandlerModifiable handler = this.getHandlerForMenu(info, contraption); player.openMenu(MountedStorageInteraction.createMenuProvider(menuName, handler, rows, stillValid)); this.playOpeningSound(player.level(), globalPos); diff --git a/src/main/java/com/simibubi/create/api/contraption/storage/item/MountedItemStorageType.java b/src/main/java/com/simibubi/create/api/contraption/storage/item/MountedItemStorageType.java index e820923eda..e3478bcf3b 100644 --- a/src/main/java/com/simibubi/create/api/contraption/storage/item/MountedItemStorageType.java +++ b/src/main/java/com/simibubi/create/api/contraption/storage/item/MountedItemStorageType.java @@ -17,9 +17,9 @@ public abstract class MountedItemStorageType { () -> MountedStorageTypeRegistry.getItemsRegistry().getCodec() ); - public final Codec codec; + public final Codec codec; - protected MountedItemStorageType(Codec codec) { + protected MountedItemStorageType(Codec codec) { this.codec = codec; } diff --git a/src/main/java/com/simibubi/create/api/contraption/storage/item/WrapperMountedItemStorage.java b/src/main/java/com/simibubi/create/api/contraption/storage/item/WrapperMountedItemStorage.java index 6046e20306..5cd421d704 100644 --- a/src/main/java/com/simibubi/create/api/contraption/storage/item/WrapperMountedItemStorage.java +++ b/src/main/java/com/simibubi/create/api/contraption/storage/item/WrapperMountedItemStorage.java @@ -1,5 +1,6 @@ package com.simibubi.create.api.contraption.storage.item; +import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.ItemStackHandler; @@ -11,7 +12,7 @@ import net.minecraft.world.item.ItemStack; public abstract class WrapperMountedItemStorage extends MountedItemStorage { protected final T wrapped; - protected WrapperMountedItemStorage(MountedItemStorageType type, T wrapped) { + protected WrapperMountedItemStorage(MountedItemStorageType type, T wrapped) { super(type); this.wrapped = wrapped; } @@ -54,7 +55,7 @@ public abstract class WrapperMountedItemStorage CODEC = SimpleMountedStorage.codec(ChestMountedStorage::new); + public static final Codec CODEC = SimpleMountedStorage.codec(ChestMountedStorage::new); - protected ChestMountedStorage(SimpleMountedStorageType type, IItemHandlerModifiable handler) { + protected ChestMountedStorage(MountedItemStorageType type, IItemHandler handler) { super(type, handler); } - public ChestMountedStorage(IItemHandlerModifiable handler) { + public ChestMountedStorage(IItemHandler handler) { this(AllMountedStorageTypes.CHEST.get(), handler); } + @Override + public void unmount(Level level, BlockState state, BlockPos pos, @Nullable BlockEntity be) { + // the capability will include both sides of chests, but mounted storage is 1:1 + if (be instanceof Container container && this.getSlots() == container.getContainerSize()) { + ItemHelper.copyContents(this, new InvWrapper(container)); + } + } + @Override protected IItemHandlerModifiable getHandlerForMenu(StructureBlockInfo info, Contraption contraption) { BlockState state = info.state(); @@ -39,9 +59,10 @@ public class ChestMountedStorage extends SimpleMountedStorage { return this; Direction facing = state.getValue(ChestBlock.FACING); - Direction connectedDirection = type == ChestType.LEFT ? facing.getClockWise() : facing.getCounterClockWise(); - BlockPos localOtherHalf = info.pos().relative(connectedDirection); - MountedItemStorage otherHalf = contraption.getStorage().getMountedItems().storages.get(localOtherHalf); + Direction connectedDirection = ChestBlock.getConnectedDirection(state); + BlockPos otherHalfPos = info.pos().relative(connectedDirection); + + MountedItemStorage otherHalf = this.getOtherHalf(contraption, otherHalfPos, state.getBlock(), facing, type); if (otherHalf == null) return this; @@ -51,4 +72,22 @@ public class ChestMountedStorage extends SimpleMountedStorage { return new CombinedInvWrapper(otherHalf, this); } } + + @Nullable + protected MountedItemStorage getOtherHalf(Contraption contraption, BlockPos localPos, Block block, + Direction thisFacing, ChestType thisType) { + StructureBlockInfo info = contraption.getBlocks().get(localPos); + if (info == null) + return null; + BlockState state = info.state(); + if (!state.is(block)) + return null; + + Direction facing = state.getValue(ChestBlock.FACING); + ChestType type = state.getValue(ChestBlock.TYPE); + + return facing == thisFacing && type == thisType.getOpposite() + ? contraption.getStorage().getMountedItems().storages.get(localPos) + : null; + } } diff --git a/src/main/java/com/simibubi/create/api/contraption/storage/item/chest/ChestMountedStorageType.java b/src/main/java/com/simibubi/create/api/contraption/storage/item/chest/ChestMountedStorageType.java index 459016e26f..e6a6054312 100644 --- a/src/main/java/com/simibubi/create/api/contraption/storage/item/chest/ChestMountedStorageType.java +++ b/src/main/java/com/simibubi/create/api/contraption/storage/item/chest/ChestMountedStorageType.java @@ -3,15 +3,23 @@ package com.simibubi.create.api.contraption.storage.item.chest; import com.simibubi.create.api.contraption.storage.item.simple.SimpleMountedStorage; import com.simibubi.create.api.contraption.storage.item.simple.SimpleMountedStorageType; -import net.minecraftforge.items.IItemHandlerModifiable; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.wrapper.InvWrapper; +import net.minecraft.world.Container; +import net.minecraft.world.level.block.entity.BlockEntity; -public class ChestMountedStorageType extends SimpleMountedStorageType { +public class ChestMountedStorageType extends SimpleMountedStorageType { public ChestMountedStorageType() { super(ChestMountedStorage.CODEC); } @Override - protected SimpleMountedStorage createStorage(IItemHandlerModifiable handler) { + protected IItemHandler getHandler(BlockEntity be) { + return be instanceof Container container ? new InvWrapper(container) : null; + } + + @Override + protected SimpleMountedStorage createStorage(IItemHandler handler) { return new ChestMountedStorage(handler); } } diff --git a/src/main/java/com/simibubi/create/api/contraption/storage/item/simple/SimpleMountedStorage.java b/src/main/java/com/simibubi/create/api/contraption/storage/item/simple/SimpleMountedStorage.java index 335ab94a95..fce14d1cdd 100644 --- a/src/main/java/com/simibubi/create/api/contraption/storage/item/simple/SimpleMountedStorage.java +++ b/src/main/java/com/simibubi/create/api/contraption/storage/item/simple/SimpleMountedStorage.java @@ -7,7 +7,7 @@ import com.mojang.serialization.Codec; import com.simibubi.create.AllMountedStorageTypes; import com.simibubi.create.AllTags; -import com.simibubi.create.api.contraption.storage.MountedStorageTypeRegistry; +import com.simibubi.create.api.contraption.storage.item.MountedItemStorageType; import com.simibubi.create.api.contraption.storage.item.WrapperMountedItemStorage; import com.simibubi.create.foundation.utility.CreateCodecs; @@ -33,15 +33,16 @@ import net.minecraft.world.level.block.state.BlockState; *
* To use this implementation, either register {@link AllMountedStorageTypes#SIMPLE} to your block * manually, or add your block to the {@link AllTags.AllBlockTags#SIMPLE_MOUNTED_STORAGE} tag. + * It is also possible to extend this class to create your own implementation. */ public class SimpleMountedStorage extends WrapperMountedItemStorage { public static final Codec CODEC = codec(SimpleMountedStorage::new); - public SimpleMountedStorage(SimpleMountedStorageType type, IItemHandlerModifiable handler) { + public SimpleMountedStorage(MountedItemStorageType type, IItemHandler handler) { super(type, copyToItemStackHandler(handler)); } - public SimpleMountedStorage(IItemHandlerModifiable handler) { + public SimpleMountedStorage(IItemHandler handler) { this(AllMountedStorageTypes.SIMPLE.get(), handler); } @@ -50,24 +51,26 @@ public class SimpleMountedStorage extends WrapperMountedItemStorage handler.getSlots() == this.getSlots()) - .flatMap(this::validate) - .ifPresent(handler -> { - for (int i = 0; i < handler.getSlots(); i++) { - handler.setStackInSlot(i, this.getStackInSlot(i)); - } - }); + be.getCapability(ForgeCapabilities.ITEM_HANDLER).resolve().flatMap(this::validate).ifPresent(handler -> { + for (int i = 0; i < handler.getSlots(); i++) { + handler.setStackInSlot(i, this.getStackInSlot(i)); + } + }); } - private Optional validate(IItemHandler handler) { - return ((SimpleMountedStorageType) this.type).validate(handler); + /** + * Make sure the targeted handler is valid for copying items back into. + * It is highly recommended to call super in overrides. + */ + protected Optional validate(IItemHandler handler) { + if (handler.getSlots() == this.getSlots() && handler instanceof IItemHandlerModifiable modifiable) { + return Optional.of(modifiable); + } else { + return Optional.empty(); + } } - public static Codec codec(Function factory) { - return CreateCodecs.ITEM_STACK_HANDLER.xmap( - factory, storage -> storage.wrapped - ); + public static Codec codec(Function factory) { + return CreateCodecs.ITEM_STACK_HANDLER.xmap(factory, storage -> storage.wrapped); } } diff --git a/src/main/java/com/simibubi/create/api/contraption/storage/item/simple/SimpleMountedStorageType.java b/src/main/java/com/simibubi/create/api/contraption/storage/item/simple/SimpleMountedStorageType.java index 1beec1b7d7..61748939cf 100644 --- a/src/main/java/com/simibubi/create/api/contraption/storage/item/simple/SimpleMountedStorageType.java +++ b/src/main/java/com/simibubi/create/api/contraption/storage/item/simple/SimpleMountedStorageType.java @@ -7,7 +7,6 @@ import com.simibubi.create.api.contraption.storage.item.MountedItemStorageType; import net.minecraftforge.common.capabilities.ForgeCapabilities; -import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandlerModifiable; @@ -18,33 +17,33 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; -public class SimpleMountedStorageType extends MountedItemStorageType { - protected SimpleMountedStorageType(Codec codec) { +public abstract class SimpleMountedStorageType extends MountedItemStorageType { + protected SimpleMountedStorageType(Codec codec) { super(codec); } - public SimpleMountedStorageType() { - this(SimpleMountedStorage.CODEC); - } - @Override @Nullable public SimpleMountedStorage mount(Level level, BlockState state, BlockPos pos, @Nullable BlockEntity be) { return Optional.ofNullable(be) - .map(b -> b.getCapability(ForgeCapabilities.ITEM_HANDLER)) - .flatMap(LazyOptional::resolve) - .flatMap(this::validate) + .map(this::getHandler) .map(this::createStorage) .orElse(null); } - public Optional validate(IItemHandler handler) { - return handler instanceof IItemHandlerModifiable modifiable - ? Optional.of(modifiable) - : Optional.empty(); + protected IItemHandler getHandler(BlockEntity be) { + IItemHandler handler = be.getCapability(ForgeCapabilities.ITEM_HANDLER).orElse(null); + // make sure the handler is modifiable so new contents can be moved over on disassembly + return handler instanceof IItemHandlerModifiable modifiable ? modifiable : null; } - protected SimpleMountedStorage createStorage(IItemHandlerModifiable handler) { + protected SimpleMountedStorage createStorage(IItemHandler handler) { return new SimpleMountedStorage(this, handler); } + + public static final class Impl extends SimpleMountedStorageType { + public Impl() { + super(SimpleMountedStorage.CODEC); + } + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/behaviour/dispenser/storage/DispenserMountedStorage.java b/src/main/java/com/simibubi/create/content/contraptions/behaviour/dispenser/storage/DispenserMountedStorage.java index 8f3cd295f2..f67829be1c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/behaviour/dispenser/storage/DispenserMountedStorage.java +++ b/src/main/java/com/simibubi/create/content/contraptions/behaviour/dispenser/storage/DispenserMountedStorage.java @@ -2,19 +2,19 @@ package com.simibubi.create.content.contraptions.behaviour.dispenser.storage; import com.mojang.serialization.Codec; import com.simibubi.create.AllMountedStorageTypes; +import com.simibubi.create.api.contraption.storage.item.MountedItemStorageType; import com.simibubi.create.api.contraption.storage.item.simple.SimpleMountedStorage; -import com.simibubi.create.api.contraption.storage.item.simple.SimpleMountedStorageType; -import net.minecraftforge.items.IItemHandlerModifiable; +import net.minecraftforge.items.IItemHandler; public class DispenserMountedStorage extends SimpleMountedStorage { - public static final Codec CODEC = SimpleMountedStorage.codec(DispenserMountedStorage::new); + public static final Codec CODEC = SimpleMountedStorage.codec(DispenserMountedStorage::new); - protected DispenserMountedStorage(SimpleMountedStorageType type, IItemHandlerModifiable handler) { + protected DispenserMountedStorage(MountedItemStorageType type, IItemHandler handler) { super(type, handler); } - public DispenserMountedStorage(IItemHandlerModifiable handler) { + public DispenserMountedStorage(IItemHandler handler) { this(AllMountedStorageTypes.DISPENSER.get(), handler); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/behaviour/dispenser/storage/DispenserMountedStorageType.java b/src/main/java/com/simibubi/create/content/contraptions/behaviour/dispenser/storage/DispenserMountedStorageType.java index 07f19a185d..a5ff233a7a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/behaviour/dispenser/storage/DispenserMountedStorageType.java +++ b/src/main/java/com/simibubi/create/content/contraptions/behaviour/dispenser/storage/DispenserMountedStorageType.java @@ -3,15 +3,15 @@ package com.simibubi.create.content.contraptions.behaviour.dispenser.storage; import com.simibubi.create.api.contraption.storage.item.simple.SimpleMountedStorage; import com.simibubi.create.api.contraption.storage.item.simple.SimpleMountedStorageType; -import net.minecraftforge.items.IItemHandlerModifiable; +import net.minecraftforge.items.IItemHandler; -public class DispenserMountedStorageType extends SimpleMountedStorageType { +public class DispenserMountedStorageType extends SimpleMountedStorageType { public DispenserMountedStorageType() { super(DispenserMountedStorage.CODEC); } @Override - protected SimpleMountedStorage createStorage(IItemHandlerModifiable handler) { + protected SimpleMountedStorage createStorage(IItemHandler handler) { return new DispenserMountedStorage(handler); } } diff --git a/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolboxMountedStorage.java b/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolboxMountedStorage.java index 402931cf82..3720158e19 100644 --- a/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolboxMountedStorage.java +++ b/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolboxMountedStorage.java @@ -24,7 +24,7 @@ public class ToolboxMountedStorage extends WrapperMountedItemStorage storage.wrapped ); - protected ToolboxMountedStorage(MountedItemStorageType type, ToolboxInventory wrapped) { + protected ToolboxMountedStorage(MountedItemStorageType type, ToolboxInventory wrapped) { super(type, wrapped); } diff --git a/src/main/java/com/simibubi/create/content/logistics/crate/CreativeCrateMountedStorage.java b/src/main/java/com/simibubi/create/content/logistics/crate/CreativeCrateMountedStorage.java index 218f8b4f3b..785928cb0c 100644 --- a/src/main/java/com/simibubi/create/content/logistics/crate/CreativeCrateMountedStorage.java +++ b/src/main/java/com/simibubi/create/content/logistics/crate/CreativeCrateMountedStorage.java @@ -23,7 +23,7 @@ public class CreativeCrateMountedStorage extends MountedItemStorage { private final ItemStack suppliedStack; private final ItemStack cachedStackInSlot; - protected CreativeCrateMountedStorage(MountedItemStorageType type, ItemStack suppliedStack) { + protected CreativeCrateMountedStorage(MountedItemStorageType type, ItemStack suppliedStack) { super(type); this.suppliedStack = suppliedStack; this.cachedStackInSlot = suppliedStack.copyWithCount(suppliedStack.getMaxStackSize()); diff --git a/src/main/java/com/simibubi/create/content/logistics/vault/ItemVaultMountedStorage.java b/src/main/java/com/simibubi/create/content/logistics/vault/ItemVaultMountedStorage.java index 871971a2bf..6864bce568 100644 --- a/src/main/java/com/simibubi/create/content/logistics/vault/ItemVaultMountedStorage.java +++ b/src/main/java/com/simibubi/create/content/logistics/vault/ItemVaultMountedStorage.java @@ -22,7 +22,7 @@ public class ItemVaultMountedStorage extends WrapperMountedItemStorage storage.wrapped ); - protected ItemVaultMountedStorage(MountedItemStorageType type, ItemStackHandler handler) { + protected ItemVaultMountedStorage(MountedItemStorageType type, ItemStackHandler handler) { super(type, handler); } diff --git a/src/main/java/com/simibubi/create/impl/contraption/storage/FallbackMountedStorage.java b/src/main/java/com/simibubi/create/impl/contraption/storage/FallbackMountedStorage.java new file mode 100644 index 0000000000..2201036c96 --- /dev/null +++ b/src/main/java/com/simibubi/create/impl/contraption/storage/FallbackMountedStorage.java @@ -0,0 +1,33 @@ +package com.simibubi.create.impl.contraption.storage; + +import java.util.Optional; + +import com.mojang.serialization.Codec; +import com.simibubi.create.AllMountedStorageTypes; +import com.simibubi.create.api.contraption.storage.item.simple.SimpleMountedStorage; + +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.IItemHandlerModifiable; +import net.minecraftforge.items.ItemStackHandler; + +/** + * A fallback mounted storage impl that will try to be used when no type is + * registered for a block. This requires that the mounted block provide an item handler + * whose class is exactly {@link ItemStackHandler}. + */ +public class FallbackMountedStorage extends SimpleMountedStorage { + public static final Codec CODEC = SimpleMountedStorage.codec(FallbackMountedStorage::new); + + public FallbackMountedStorage(IItemHandler handler) { + super(AllMountedStorageTypes.FALLBACK.get(), handler); + } + + @Override + protected Optional validate(IItemHandler handler) { + return super.validate(handler).filter(FallbackMountedStorage::isValid); + } + + public static boolean isValid(IItemHandler handler) { + return handler.getClass() == ItemStackHandler.class; + } +} diff --git a/src/main/java/com/simibubi/create/impl/contraption/storage/FallbackMountedStorageType.java b/src/main/java/com/simibubi/create/impl/contraption/storage/FallbackMountedStorageType.java index f5fd8ded49..b97d85e263 100644 --- a/src/main/java/com/simibubi/create/impl/contraption/storage/FallbackMountedStorageType.java +++ b/src/main/java/com/simibubi/create/impl/contraption/storage/FallbackMountedStorageType.java @@ -1,34 +1,18 @@ package com.simibubi.create.impl.contraption.storage; -import java.util.Optional; - -import com.mojang.serialization.Codec; -import com.simibubi.create.AllMountedStorageTypes; -import com.simibubi.create.api.contraption.storage.item.simple.SimpleMountedStorage; import com.simibubi.create.api.contraption.storage.item.simple.SimpleMountedStorageType; import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.items.IItemHandlerModifiable; -import net.minecraftforge.items.ItemStackHandler; - -/** - * A fallback mounted storage impl that will try to be used when no type is - * registered for a block. This requires that the mounted block provide an item handler - * whose class is exactly {@link ItemStackHandler}. - */ -public class FallbackMountedStorageType extends SimpleMountedStorageType { - public static final Codec CODEC = SimpleMountedStorage.codec( - handler -> new SimpleMountedStorage(AllMountedStorageTypes.FALLBACK.get(), handler) - ); +import net.minecraft.world.level.block.entity.BlockEntity; +public class FallbackMountedStorageType extends SimpleMountedStorageType { public FallbackMountedStorageType() { - super(CODEC); + super(FallbackMountedStorage.CODEC); } @Override - public Optional validate(IItemHandler handler) { - return handler.getClass() == ItemStackHandler.class - ? Optional.of((ItemStackHandler) handler) - : Optional.empty(); + protected IItemHandler getHandler(BlockEntity be) { + IItemHandler handler = super.getHandler(be); + return handler != null && FallbackMountedStorage.isValid(handler) ? handler : null; } } From abfb8ccc14920bd4a7d9ec58086ee881c581ee71 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Sat, 4 Jan 2025 18:39:38 -0500 Subject: [PATCH 243/515] For just $10,000 you too can get this state of the art editorconfig --- .editorconfig | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/.editorconfig b/.editorconfig index 53048c7d9a..e1009802dd 100644 --- a/.editorconfig +++ b/.editorconfig @@ -9,13 +9,21 @@ charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true +[*.yml] +indent_size = 2 + [*.json] -indent_style = space indent_size = 2 [*.java] indent_style = tab ij_continuation_indent_size = 4 -ij_java_class_count_to_use_import_on_demand = 99 -ij_java_names_count_to_use_import_on_demand = 99 -ij_java_imports_layout = $*,|,java.**,|,javax.**,|,org.**,|,com.**,|,* +ij_java_blank_lines_before_class_end = 0 +ij_java_blank_lines_after_anonymous_class_header = 0 +ij_java_blank_lines_after_class_header = 0 +ij_java_blank_lines_before_method_body = 0 +ij_java_else_on_new_line = false +ij_java_class_count_to_use_import_on_demand = 999 +ij_java_names_count_to_use_import_on_demand = 999 +ij_java_imports_layout = $*,|,io.fabricators_of_create.**,|,java.**,|,javax.**,|,org.**,|,com.**,|,*,|,net.minecraftforge.** +ij_java_insert_inner_class_imports = true \ No newline at end of file From ac7b6b180366654b58458f45e11c1c5a56939d91 Mon Sep 17 00:00:00 2001 From: TropheusJ Date: Sat, 4 Jan 2025 20:13:54 -0500 Subject: [PATCH 244/515] add internal storages --- .../storage/item/MountedItemStorage.java | 17 +++- .../contraptions/MountedStorageManager.java | 78 ++++++++++++++----- .../behaviour/MovementContext.java | 5 +- .../dispenser/DropperMovementBehaviour.java | 22 +++--- .../storage/DispenserMountedStorage.java | 4 +- 5 files changed, 90 insertions(+), 36 deletions(-) diff --git a/src/main/java/com/simibubi/create/api/contraption/storage/item/MountedItemStorage.java b/src/main/java/com/simibubi/create/api/contraption/storage/item/MountedItemStorage.java index 15487bbf12..8b3e8a205e 100644 --- a/src/main/java/com/simibubi/create/api/contraption/storage/item/MountedItemStorage.java +++ b/src/main/java/com/simibubi/create/api/contraption/storage/item/MountedItemStorage.java @@ -9,6 +9,9 @@ import com.simibubi.create.content.contraptions.Contraption; import com.simibubi.create.content.contraptions.MountedStorageInteraction; +import com.simibubi.create.content.contraptions.MountedStorageManager; +import com.simibubi.create.content.contraptions.behaviour.MovementBehaviour; +import com.simibubi.create.content.contraptions.behaviour.MovementContext; import com.simibubi.create.foundation.utility.CreateLang; import net.minecraftforge.items.IItemHandlerModifiable; @@ -45,9 +48,21 @@ public abstract class MountedItemStorage implements IItemHandlerModifiable { public abstract void unmount(Level level, BlockState state, BlockPos pos, @Nullable BlockEntity be); /** - * @return true if train contraptions can search this storage for fuel. + * Internal mounted storages are not exposed to the larger contraption inventory. + * They are only for internal use, such as access from a {@link MovementBehaviour}. + * Internal storages are still accessible through {@link MovementContext#getStorage()} + * as well as {@link MountedStorageManager#getAllItemStorages()}. + * A storage being internal implies that it does not provide fuel either. * This is only called once on assembly. */ + public boolean isInternal() { + return false; + } + + /** + * Contraptions may search storage for fuel, such as for powering furnace minecarts + * and trains. Return false if this storage should + */ public boolean providesFuel() { return true; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/MountedStorageManager.java b/src/main/java/com/simibubi/create/content/contraptions/MountedStorageManager.java index 910036275e..df2924b3ab 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/MountedStorageManager.java +++ b/src/main/java/com/simibubi/create/content/contraptions/MountedStorageManager.java @@ -2,7 +2,8 @@ package com.simibubi.create.content.contraptions; import java.util.ArrayList; import java.util.List; -import java.util.Objects; +import java.util.Map; +import java.util.function.Predicate; import com.google.common.collect.ImmutableMap; import com.mojang.datafixers.util.Pair; @@ -35,6 +36,8 @@ public class MountedStorageManager { private ImmutableMap.Builder itemsBuilder; + protected ImmutableMap allItemStorages; + protected MountedItemStorageWrapper items; @Nullable protected MountedItemStorageWrapper fuelItems; @@ -51,17 +54,18 @@ public class MountedStorageManager { throw new IllegalStateException("Mounted storage has already been initialized"); } - this.items = new MountedItemStorageWrapper(this.itemsBuilder.build()); + this.allItemStorages = this.itemsBuilder.build(); + + this.items = new MountedItemStorageWrapper(subMap( + this.allItemStorages, storage -> !storage.isInternal() + )); + this.allItems = this.items; this.itemsBuilder = null; - ImmutableMap.Builder fuel = ImmutableMap.builder(); - this.items.storages.forEach((pos, storage) -> { - if (storage.providesFuel()) { - fuel.put(pos, storage); - } - }); - ImmutableMap fuelMap = fuel.build(); + ImmutableMap fuelMap = subMap( + this.allItemStorages, storage -> !storage.isInternal() && storage.providesFuel() + ); this.fuelItems = fuelMap.isEmpty() ? null : new MountedItemStorageWrapper(fuelMap); } @@ -69,7 +73,14 @@ public class MountedStorageManager { return this.itemsBuilder == null; } + private void assertInitialized() { + if (!this.isInitialized()) { + throw new IllegalStateException("MountedStorageManager is uninitialized"); + } + } + protected void reset() { + this.allItemStorages = null; this.items = null; this.fuelItems = null; this.externalHandlers = new ArrayList<>(); @@ -90,7 +101,7 @@ public class MountedStorageManager { public void unmount(Level level, StructureBlockInfo info, BlockPos globalPos, @Nullable BlockEntity be) { BlockPos localPos = info.pos(); - MountedItemStorage storage = this.items.storages.get(localPos); + MountedItemStorage storage = this.getAllItemStorages().get(localPos); if (storage != null) { BlockState state = info.state(); MountedItemStorageType expectedType = MountedStorageTypeRegistry.ITEM_LOOKUP.find(state); @@ -123,7 +134,7 @@ public class MountedStorageManager { ListTag items = new ListTag(); nbt.put("items", items); - this.items.storages.forEach( + this.getAllItemStorages().forEach( (pos, storage) -> MountedItemStorage.CODEC.encodeStart(NbtOps.INSTANCE, storage) .result().ifPresent(encoded -> { CompoundTag tag = new CompoundTag(); @@ -146,26 +157,45 @@ public class MountedStorageManager { } /** - * @return the item handlers for all mounted storages + * Gets a map of all MountedItemStorages in the contraption, irrelevant of them + * being internal or providing fuel. The methods below are likely more useful. + * @see MountedItemStorage#isInternal() + * @see MountedItemStorage#providesFuel() */ - public MountedItemStorageWrapper getMountedItems() { - return Objects.requireNonNull(this.items, "Cannot get items for uninitialized manager"); + public ImmutableMap getAllItemStorages() { + this.assertInitialized(); + return this.allItemStorages; } /** - * @return the item handlers for all mounted storages that may contain fuel, or null if none support it + * Gets an item handler wrapping all non-internal mounted storages. This is not + * the whole contraption inventory as it does not include external storages. + * Most often, you want {@link #getAllItems()}, which does. + */ + public MountedItemStorageWrapper getMountedItems() { + this.assertInitialized(); + return this.items; + } + + /** + * Gets an item handler wrapping all non-internal mounted storages that provide fuel. + * May be null if none are present. */ @Nullable public MountedItemStorageWrapper getFuelItems() { - Objects.requireNonNull(this.items, "Cannot get fuelItems for uninitialized manager"); + this.assertInitialized(); return this.fuelItems; } /** - * @return the item handler representing all mounted storage and all external storage + * Gets an item handler wrapping all non-internal mounted storages and all external storages. + * Non-internal storages are mounted storages that are intended to be exposed to the entire + * contraption. External storages are non-mounted storages that are still part of a contraption's + * inventory, such as the inventories of chest minecarts. */ public CombinedInvWrapper getAllItems() { - return Objects.requireNonNull(this.allItems, "Cannot get allItems for uninitialized manager"); + this.assertInitialized(); + return this.allItems; } public IFluidHandler getFluids() { @@ -178,7 +208,7 @@ public class MountedStorageManager { return false; MountedStorageManager storageManager = contraption.getStorageForSpawnPacket(); - MountedItemStorage storage = storageManager.items.storages.get(localPos); + MountedItemStorage storage = storageManager.getAllItemStorages().get(localPos); if (storage != null) { return player.level().isClientSide || storage.handleInteraction(player, contraption, info); @@ -186,4 +216,14 @@ public class MountedStorageManager { return false; } } + + private static ImmutableMap subMap(Map map, Predicate predicate) { + ImmutableMap.Builder builder = ImmutableMap.builder(); + map.forEach((key, value) -> { + if (predicate.test(value)) { + builder.put(key, value); + } + }); + return builder.build(); + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/behaviour/MovementContext.java b/src/main/java/com/simibubi/create/content/contraptions/behaviour/MovementContext.java index 6077a3bb0e..eef699484b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/behaviour/MovementContext.java +++ b/src/main/java/com/simibubi/create/content/contraptions/behaviour/MovementContext.java @@ -10,6 +10,8 @@ import com.simibubi.create.content.logistics.filter.FilterItemStack; import net.createmod.catnip.utility.VecHelper; +import org.jetbrains.annotations.Nullable; + import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; @@ -58,7 +60,7 @@ public class MovementContext { stall = false; filter = null; this.storage = Suppliers.memoize( - () -> contraption.getStorage().getMountedItems().storages.get(this.localPos) + () -> contraption.getStorage().getAllItemStorages().get(this.localPos) ); } @@ -103,6 +105,7 @@ public class MovementContext { return filter = FilterItemStack.of(blockEntityData.getCompound("Filter")); } + @Nullable public MountedItemStorage getStorage() { return this.storage.get(); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/behaviour/dispenser/DropperMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/behaviour/dispenser/DropperMovementBehaviour.java index e4ab4f1792..777cd4d46f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/behaviour/dispenser/DropperMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/behaviour/dispenser/DropperMovementBehaviour.java @@ -3,13 +3,13 @@ package com.simibubi.create.content.contraptions.behaviour.dispenser; import java.util.function.Predicate; import com.simibubi.create.api.contraption.storage.item.MountedItemStorage; -import com.simibubi.create.content.contraptions.MountedStorageManager; import com.simibubi.create.content.contraptions.behaviour.MovementBehaviour; import com.simibubi.create.content.contraptions.behaviour.MovementContext; import com.simibubi.create.foundation.item.ItemHelper; import it.unimi.dsi.fastutil.ints.IntArrayList; import it.unimi.dsi.fastutil.ints.IntList; +import net.minecraftforge.items.IItemHandler; import net.minecraft.Util; import net.minecraft.core.BlockPos; @@ -34,7 +34,8 @@ public class DropperMovementBehaviour implements MovementBehaviour { ItemStack stack = context.getStorage().getStackInSlot(slot).copy(); if (stack.getCount() == 1 && stack.getMaxStackSize() != 1) { // last one, try to top it off - if (!tryTopOff(stack, context.getStorage(), context.contraption.getStorage())) { + IItemHandler contraptionInventory = context.contraption.getStorage().getAllItems(); + if (!tryTopOff(stack, contraptionInventory)) { // failed, abort dispense to preserve filters failDispense(context, pos); return; @@ -50,22 +51,17 @@ public class DropperMovementBehaviour implements MovementBehaviour { return MovedDefaultDispenseItemBehaviour.INSTANCE; } - private static boolean tryTopOff(ItemStack stack, MountedItemStorage storage, MountedStorageManager manager) { + private static boolean tryTopOff(ItemStack stack, IItemHandler from) { Predicate test = otherStack -> ItemStack.isSameItemSameTags(stack, otherStack); - int originalSize = stack.getCount(); + int needed = stack.getMaxStackSize() - stack.getCount(); - for (MountedItemStorage otherStorage : manager.getMountedItems().storages.values()) { - if (storage == otherStorage) - continue; - - int needed = stack.getMaxStackSize() - stack.getCount(); - ItemStack extracted = ItemHelper.extract(storage, test, ItemHelper.ExtractionCountMode.UPTO, needed, false); + ItemStack extracted = ItemHelper.extract(from, test, ItemHelper.ExtractionCountMode.UPTO, needed, false); + if (!extracted.isEmpty()) { stack.grow(extracted.getCount()); - if (stack.getCount() >= stack.getMaxStackSize()) - break; + return true; } - return stack.getCount() != originalSize; + return false; } private static int getSlot(MountedItemStorage storage, RandomSource random) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/behaviour/dispenser/storage/DispenserMountedStorage.java b/src/main/java/com/simibubi/create/content/contraptions/behaviour/dispenser/storage/DispenserMountedStorage.java index f67829be1c..e54d566f43 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/behaviour/dispenser/storage/DispenserMountedStorage.java +++ b/src/main/java/com/simibubi/create/content/contraptions/behaviour/dispenser/storage/DispenserMountedStorage.java @@ -19,7 +19,7 @@ public class DispenserMountedStorage extends SimpleMountedStorage { } @Override - public boolean providesFuel() { - return false; + public boolean isInternal() { + return true; } } From b53d15dc8cc4e90b53b21d066700606e7482d8f6 Mon Sep 17 00:00:00 2001 From: TropheusJ Date: Sat, 4 Jan 2025 21:02:29 -0500 Subject: [PATCH 245/515] fix dispenser behavior --- .../dispenser/DropperMovementBehaviour.java | 63 ++++++++++--------- 1 file changed, 33 insertions(+), 30 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/behaviour/dispenser/DropperMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/behaviour/dispenser/DropperMovementBehaviour.java index 777cd4d46f..8d9246c5b5 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/behaviour/dispenser/DropperMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/behaviour/dispenser/DropperMovementBehaviour.java @@ -11,6 +11,8 @@ import it.unimi.dsi.fastutil.ints.IntArrayList; import it.unimi.dsi.fastutil.ints.IntList; import net.minecraftforge.items.IItemHandler; +import org.jetbrains.annotations.Nullable; + import net.minecraft.Util; import net.minecraft.core.BlockPos; import net.minecraft.util.RandomSource; @@ -20,10 +22,14 @@ import net.minecraft.world.level.block.LevelEvent; public class DropperMovementBehaviour implements MovementBehaviour { @Override public void visitNewPosition(MovementContext context, BlockPos pos) { - if (context.world.isClientSide || context.getStorage() == null) + if (context.world.isClientSide) return; - int slot = getSlot(context.getStorage(), context.world.random); + MountedItemStorage storage = context.getStorage(); + if (storage == null) + return; + + int slot = getSlot(storage, context.world.random, context.contraption.getStorage().getAllItems()); if (slot == -1) { // all slots empty failDispense(context, pos); @@ -31,46 +37,34 @@ public class DropperMovementBehaviour implements MovementBehaviour { } // copy because dispense behaviors will modify it directly - ItemStack stack = context.getStorage().getStackInSlot(slot).copy(); - if (stack.getCount() == 1 && stack.getMaxStackSize() != 1) { - // last one, try to top it off - IItemHandler contraptionInventory = context.contraption.getStorage().getAllItems(); - if (!tryTopOff(stack, contraptionInventory)) { - // failed, abort dispense to preserve filters - failDispense(context, pos); - return; - } - } - + ItemStack stack = storage.getStackInSlot(slot).copy(); IMovedDispenseItemBehaviour behavior = getDispenseBehavior(context, pos, stack); ItemStack remainder = behavior.dispense(stack, context, pos); - context.getStorage().setStackInSlot(slot, remainder); + storage.setStackInSlot(slot, remainder); } protected IMovedDispenseItemBehaviour getDispenseBehavior(MovementContext context, BlockPos pos, ItemStack stack) { return MovedDefaultDispenseItemBehaviour.INSTANCE; } - private static boolean tryTopOff(ItemStack stack, IItemHandler from) { - Predicate test = otherStack -> ItemStack.isSameItemSameTags(stack, otherStack); - int needed = stack.getMaxStackSize() - stack.getCount(); - - ItemStack extracted = ItemHelper.extract(from, test, ItemHelper.ExtractionCountMode.UPTO, needed, false); - if (!extracted.isEmpty()) { - stack.grow(extracted.getCount()); - return true; - } - - return false; - } - - private static int getSlot(MountedItemStorage storage, RandomSource random) { + /** + * Finds a dispensable slot. Empty slots are skipped and nearly-empty slots are topped off. + */ + private static int getSlot(MountedItemStorage storage, RandomSource random, IItemHandler contraptionInventory) { IntList filledSlots = new IntArrayList(); for (int i = 0; i < storage.getSlots(); i++) { ItemStack stack = storage.getStackInSlot(i); - if (!stack.isEmpty()) { - filledSlots.add(i); + if (stack.isEmpty()) + continue; + + if (stack.getCount() == 1 && stack.getMaxStackSize() != 1) { + stack = tryTopOff(stack, contraptionInventory); + if (stack == null) { + continue; + } } + + filledSlots.add(i); } return switch (filledSlots.size()) { @@ -80,6 +74,15 @@ public class DropperMovementBehaviour implements MovementBehaviour { }; } + @Nullable + private static ItemStack tryTopOff(ItemStack stack, IItemHandler from) { + Predicate test = otherStack -> ItemStack.isSameItemSameTags(stack, otherStack); + int needed = stack.getMaxStackSize() - stack.getCount(); + + ItemStack extracted = ItemHelper.extract(from, test, ItemHelper.ExtractionCountMode.UPTO, needed, false); + return extracted.isEmpty() ? null : stack.copyWithCount(stack.getCount() + extracted.getCount()); + } + private static void failDispense(MovementContext ctx, BlockPos pos) { ctx.world.levelEvent(LevelEvent.SOUND_DISPENSER_FAIL, pos, 0); } From ec918cd80779e2700e701c0129b45dccc7256833 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Sat, 4 Jan 2025 21:59:33 -0500 Subject: [PATCH 246/515] Silky smooth configs - Finer tuning of import order for fabric --- .editorconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.editorconfig b/.editorconfig index e1009802dd..ddf52c2119 100644 --- a/.editorconfig +++ b/.editorconfig @@ -25,5 +25,5 @@ ij_java_blank_lines_before_method_body = 0 ij_java_else_on_new_line = false ij_java_class_count_to_use_import_on_demand = 999 ij_java_names_count_to_use_import_on_demand = 999 -ij_java_imports_layout = $*,|,io.fabricators_of_create.**,|,java.**,|,javax.**,|,org.**,|,com.**,|,*,|,net.minecraftforge.** +ij_java_imports_layout = $*,|,io.fabricators_of_create.**,net.fabricmc.**,|,java.**,|,javax.**,|,org.**,|,com.**,|,*,|,net.minecraftforge.** ij_java_insert_inner_class_imports = true \ No newline at end of file From 42fd2826d7c70b79ef714cfac56a2a927ec1595d Mon Sep 17 00:00:00 2001 From: IThundxr Date: Sat, 4 Jan 2025 22:28:02 -0500 Subject: [PATCH 247/515] Eager loggers - Fix trying to restore from .dat_old message being fired if the file isn't present entirely --- .../create/foundation/mixin/DimensionDataStorageMixin.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/simibubi/create/foundation/mixin/DimensionDataStorageMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/DimensionDataStorageMixin.java index 8d694f059f..a82ef7a03f 100644 --- a/src/main/java/com/simibubi/create/foundation/mixin/DimensionDataStorageMixin.java +++ b/src/main/java/com/simibubi/create/foundation/mixin/DimensionDataStorageMixin.java @@ -30,10 +30,11 @@ public abstract class DimensionDataStorageMixin { private T create$tryLoadingFromDatOldIfFailedToLoad(T original, Function loadFunction, String name) { // Try loading old data if it's create's SavedData if (original == null && name.startsWith("create_")) { - Create.LOGGER.info("Trying to restore {} from .dat_old", name); try { + File currentFile = new File(dataFolder, name + ".dat"); File oldFile = new File(dataFolder, name + ".dat_old"); - if (oldFile.exists()) { + if (currentFile.exists() && oldFile.exists()) { + Create.LOGGER.warn("Trying to restore {}.dat from {}.dat_old", name, name); CompoundTag compoundtag = readTagFromDisk(name, SharedConstants.getCurrentVersion().getDataVersion().getVersion()); return loadFunction.apply(compoundtag.getCompound("data")); } From 669435e8490e03424bdd1fa86f7732e97ddc1cb3 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Sat, 4 Jan 2025 22:30:51 -0500 Subject: [PATCH 248/515] Dimension't - Remove code trying to restore from .dat_old, not entirely worth it --- .../mixin/DimensionDataStorageMixin.java | 50 ------------------- src/main/resources/create.mixins.json | 1 - 2 files changed, 51 deletions(-) delete mode 100644 src/main/java/com/simibubi/create/foundation/mixin/DimensionDataStorageMixin.java diff --git a/src/main/java/com/simibubi/create/foundation/mixin/DimensionDataStorageMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/DimensionDataStorageMixin.java deleted file mode 100644 index a82ef7a03f..0000000000 --- a/src/main/java/com/simibubi/create/foundation/mixin/DimensionDataStorageMixin.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.simibubi.create.foundation.mixin; - -import com.llamalad7.mixinextras.injector.ModifyReturnValue; -import com.simibubi.create.Create; - -import net.minecraft.SharedConstants; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.level.saveddata.SavedData; -import net.minecraft.world.level.storage.DimensionDataStorage; - -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; - -import java.io.File; -import java.io.IOException; -import java.util.function.Function; - -@Mixin(DimensionDataStorage.class) -public abstract class DimensionDataStorageMixin { - @Shadow - @Final - private File dataFolder; - - @Shadow - public abstract CompoundTag readTagFromDisk(String pName, int pLevelVersion) throws IOException; - - @ModifyReturnValue(method = "readSavedData", at = @At(value = "TAIL")) - private T create$tryLoadingFromDatOldIfFailedToLoad(T original, Function loadFunction, String name) { - // Try loading old data if it's create's SavedData - if (original == null && name.startsWith("create_")) { - try { - File currentFile = new File(dataFolder, name + ".dat"); - File oldFile = new File(dataFolder, name + ".dat_old"); - if (currentFile.exists() && oldFile.exists()) { - Create.LOGGER.warn("Trying to restore {}.dat from {}.dat_old", name, name); - CompoundTag compoundtag = readTagFromDisk(name, SharedConstants.getCurrentVersion().getDataVersion().getVersion()); - return loadFunction.apply(compoundtag.getCompound("data")); - } - } catch (Exception exception) { - Create.LOGGER.error("Error restoring from old saved data: {}", name, exception); - } - } else { - return original; - } - - return null; - } -} diff --git a/src/main/resources/create.mixins.json b/src/main/resources/create.mixins.json index c8b9e4980d..428ae98b5d 100644 --- a/src/main/resources/create.mixins.json +++ b/src/main/resources/create.mixins.json @@ -11,7 +11,6 @@ "ClientboundMapItemDataPacketMixin", "ContraptionDriverInteractMixin", "CustomItemUseEffectsMixin", - "DimensionDataStorageMixin", "EntityMixin", "LavaSwimmingMixin", "MainMixin", From a636c155d817ccbac885cf9f84e13f7c69753042 Mon Sep 17 00:00:00 2001 From: TropheusJ Date: Sat, 4 Jan 2025 22:33:01 -0500 Subject: [PATCH 249/515] fix dispenser menu, better sounds --- .../storage/item/MountedItemStorage.java | 93 +++++++++++-------- .../item/chest/ChestMountedStorage.java | 23 +++++ .../item/menu/MountedStorageMenus.java | 52 +++++++++++ .../item/menu/StorageInteractionWrapper.java | 35 +++++++ .../MountedStorageInteraction.java | 68 -------------- .../storage/DispenserMountedStorage.java | 26 ++++++ 6 files changed, 192 insertions(+), 105 deletions(-) create mode 100644 src/main/java/com/simibubi/create/api/contraption/storage/item/menu/MountedStorageMenus.java create mode 100644 src/main/java/com/simibubi/create/api/contraption/storage/item/menu/StorageInteractionWrapper.java delete mode 100644 src/main/java/com/simibubi/create/content/contraptions/MountedStorageInteraction.java diff --git a/src/main/java/com/simibubi/create/api/contraption/storage/item/MountedItemStorage.java b/src/main/java/com/simibubi/create/api/contraption/storage/item/MountedItemStorage.java index 8b3e8a205e..ee66ecd7f4 100644 --- a/src/main/java/com/simibubi/create/api/contraption/storage/item/MountedItemStorage.java +++ b/src/main/java/com/simibubi/create/api/contraption/storage/item/MountedItemStorage.java @@ -1,14 +1,15 @@ package com.simibubi.create.api.contraption.storage.item; import java.util.Objects; +import java.util.OptionalInt; +import java.util.function.Consumer; import java.util.function.Predicate; import com.mojang.serialization.Codec; +import com.simibubi.create.api.contraption.storage.item.menu.MountedStorageMenus; import com.simibubi.create.content.contraptions.Contraption; -import com.simibubi.create.content.contraptions.MountedStorageInteraction; - import com.simibubi.create.content.contraptions.MountedStorageManager; import com.simibubi.create.content.contraptions.behaviour.MovementBehaviour; import com.simibubi.create.content.contraptions.behaviour.MovementContext; @@ -23,6 +24,7 @@ import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; +import net.minecraft.world.MenuProvider; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; @@ -74,44 +76,35 @@ public abstract class MountedItemStorage implements IItemHandlerModifiable { * @return true if the interaction was successful */ public boolean handleInteraction(Player player, Contraption contraption, StructureBlockInfo info) { - IItemHandlerModifiable handler = this.getHandlerForMenu(info, contraption); - int slots = handler.getSlots(); - if (slots == 0 || slots % 9 != 0) - return false; - - int rows = slots / 9; - if (rows > 6) - return false; - BlockPos localPos = info.pos(); - Vec3 globalPos = contraption.entity.toGlobalVector(Vec3.atCenterOf(localPos), 0); - Predicate stillValid = p -> this.isMenuValid(p, contraption, globalPos); + Vec3 localPosVec = Vec3.atCenterOf(localPos); + Predicate stillValid = p -> { + Vec3 currentPos = contraption.entity.toGlobalVector(localPosVec, 0); + return this.isMenuValid(p, contraption, currentPos); + }; Component menuName = this.getMenuName(info, contraption); + IItemHandlerModifiable handler = this.getHandlerForMenu(info, contraption); + Consumer onClose = p -> { + Vec3 newPos = contraption.entity.toGlobalVector(localPosVec, 0); + this.playClosingSound(p.level(), newPos); + }; - player.openMenu(MountedStorageInteraction.createMenuProvider(menuName, handler, rows, stillValid)); - this.playOpeningSound(player.level(), globalPos); - return true; + OptionalInt id = player.openMenu(this.createMenuProvider(menuName, handler, stillValid, onClose)); + if (id.isPresent()) { + Vec3 globalPos = contraption.entity.toGlobalVector(localPosVec, 0); + this.playOpeningSound(player.level(), globalPos); + return true; + } else { + return false; + } } /** - * Play the sound made by opening this storage's GUI. - * @see #handleInteraction(Player, Contraption, StructureBlockInfo) + * Get the item handler that will be used by this storage's menu. This is useful for + * handling multi-blocks, such as double chests. */ - protected void playOpeningSound(Level level, Vec3 pos) { - level.playSound( - null, BlockPos.containing(pos), - SoundEvents.BARREL_OPEN, SoundSource.BLOCKS, - 0.75f, 1f - ); - } - - /** - * @return the title to be shown in the GUI when this storage is opened - * @see #handleInteraction(Player, Contraption, StructureBlockInfo) - */ - protected Component getMenuName(StructureBlockInfo info, Contraption contraption) { - MutableComponent blockName = info.state().getBlock().getName(); - return CreateLang.translateDirect("contraptions.moving_container", blockName); + protected IItemHandlerModifiable getHandlerForMenu(StructureBlockInfo info, Contraption contraption) { + return this; } /** @@ -124,10 +117,36 @@ public abstract class MountedItemStorage implements IItemHandlerModifiable { } /** - * Get the item handler that will be used by this storage's menu. This is useful for - * handling multi-blocks, such as double chests. + * @return the title to be shown in the GUI when this storage is opened */ - protected IItemHandlerModifiable getHandlerForMenu(StructureBlockInfo info, Contraption contraption) { - return this; + protected Component getMenuName(StructureBlockInfo info, Contraption contraption) { + MutableComponent blockName = info.state().getBlock().getName(); + return CreateLang.translateDirect("contraptions.moving_container", blockName); + } + + /** + * @return a MenuProvider that provides the menu players will see when opening this storage + */ + @Nullable + protected MenuProvider createMenuProvider(Component name, IItemHandlerModifiable handler, + Predicate stillValid, Consumer onClose) { + return MountedStorageMenus.createGeneric(name, handler, stillValid, onClose); + } + + /** + * Play the sound made by opening this storage's GUI. + */ + protected void playOpeningSound(Level level, Vec3 pos) { + level.playSound( + null, BlockPos.containing(pos), + SoundEvents.BARREL_OPEN, SoundSource.BLOCKS, + 0.75f, 1f + ); + } + + /** + * Play the sound made by closing this storage's GUI. + */ + protected void playClosingSound(Level level, Vec3 pos) { } } diff --git a/src/main/java/com/simibubi/create/api/contraption/storage/item/chest/ChestMountedStorage.java b/src/main/java/com/simibubi/create/api/contraption/storage/item/chest/ChestMountedStorage.java index 929de5d5fa..dcf9838e32 100644 --- a/src/main/java/com/simibubi/create/api/contraption/storage/item/chest/ChestMountedStorage.java +++ b/src/main/java/com/simibubi/create/api/contraption/storage/item/chest/ChestMountedStorage.java @@ -10,6 +10,7 @@ import com.simibubi.create.content.contraptions.Contraption; import com.simibubi.create.foundation.item.ItemHelper; +import net.minecraftforge.fml.common.Mod; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.wrapper.CombinedInvWrapper; @@ -20,6 +21,8 @@ import org.jetbrains.annotations.Nullable; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; import net.minecraft.world.Container; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; @@ -28,10 +31,12 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.ChestType; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate.StructureBlockInfo; +import net.minecraft.world.phys.Vec3; /** * Mounted storage that handles opening a combined GUI for double chests. */ +@Mod.EventBusSubscriber public class ChestMountedStorage extends SimpleMountedStorage { public static final Codec CODEC = SimpleMountedStorage.codec(ChestMountedStorage::new); @@ -90,4 +95,22 @@ public class ChestMountedStorage extends SimpleMountedStorage { ? contraption.getStorage().getMountedItems().storages.get(localPos) : null; } + + @Override + protected void playOpeningSound(Level level, Vec3 pos) { + level.playSound( + null, BlockPos.containing(pos), + SoundEvents.CHEST_OPEN, SoundSource.BLOCKS, + 0.75f, 1f + ); + } + + @Override + protected void playClosingSound(Level level, Vec3 pos) { + level.playSound( + null, BlockPos.containing(pos), + SoundEvents.CHEST_CLOSE, SoundSource.BLOCKS, + 0.75f, 1f + ); + } } diff --git a/src/main/java/com/simibubi/create/api/contraption/storage/item/menu/MountedStorageMenus.java b/src/main/java/com/simibubi/create/api/contraption/storage/item/menu/MountedStorageMenus.java new file mode 100644 index 0000000000..a939c8eee7 --- /dev/null +++ b/src/main/java/com/simibubi/create/api/contraption/storage/item/menu/MountedStorageMenus.java @@ -0,0 +1,52 @@ +package com.simibubi.create.api.contraption.storage.item.menu; + +import java.util.List; +import java.util.function.Consumer; +import java.util.function.Predicate; + +import net.minecraft.network.chat.Component; +import net.minecraft.world.Container; +import net.minecraft.world.MenuProvider; +import net.minecraft.world.SimpleMenuProvider; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.ChestMenu; +import net.minecraft.world.inventory.DispenserMenu; +import net.minecraft.world.inventory.MenuConstructor; +import net.minecraft.world.inventory.MenuType; +import net.minecraftforge.items.IItemHandlerModifiable; + +import org.jetbrains.annotations.Nullable; + +/** + * Methods for creating generic menus usable by mounted storages. + */ +public class MountedStorageMenus { + public static final List> GENERIC_CHEST_MENUS = List.of( + MenuType.GENERIC_9x1, MenuType.GENERIC_9x2, MenuType.GENERIC_9x3, + MenuType.GENERIC_9x4, MenuType.GENERIC_9x5, MenuType.GENERIC_9x6 + ); + + @Nullable + public static MenuProvider createGeneric(Component menuName, IItemHandlerModifiable handler, + Predicate stillValid, Consumer onClose) { + int rows = handler.getSlots() / 9; + if (rows < 1 || rows > 6) + return null; + + MenuType type = GENERIC_CHEST_MENUS.get(rows - 1); + Container wrapper = new StorageInteractionWrapper(handler, stillValid, onClose); + MenuConstructor constructor = (id, inv, player) -> new ChestMenu(type, id, inv, wrapper, rows); + return new SimpleMenuProvider(constructor, menuName); + } + + @Nullable + public static MenuProvider createGeneric9x9(Component name, IItemHandlerModifiable handler, + Predicate stillValid, Consumer onClose) { + if (handler.getSlots() != 9) + return null; + + Container wrapper = new StorageInteractionWrapper(handler, stillValid, onClose); + MenuConstructor constructor = (id, inv, player) -> new DispenserMenu(id, inv, wrapper); + return new SimpleMenuProvider(constructor, name); + } +} diff --git a/src/main/java/com/simibubi/create/api/contraption/storage/item/menu/StorageInteractionWrapper.java b/src/main/java/com/simibubi/create/api/contraption/storage/item/menu/StorageInteractionWrapper.java new file mode 100644 index 0000000000..d509f81c3c --- /dev/null +++ b/src/main/java/com/simibubi/create/api/contraption/storage/item/menu/StorageInteractionWrapper.java @@ -0,0 +1,35 @@ +package com.simibubi.create.api.contraption.storage.item.menu; + +import java.util.function.Consumer; +import java.util.function.Predicate; + +import net.minecraftforge.items.IItemHandlerModifiable; +import net.minecraftforge.items.wrapper.RecipeWrapper; + +import net.minecraft.world.entity.player.Player; + +public class StorageInteractionWrapper extends RecipeWrapper { + private final Predicate stillValid; + private final Consumer onClose; + + public StorageInteractionWrapper(IItemHandlerModifiable inv, Predicate stillValid, Consumer onClose) { + super(inv); + this.stillValid = stillValid; + this.onClose = onClose; + } + + @Override + public boolean stillValid(Player player) { + return this.stillValid.test(player); + } + + @Override + public int getMaxStackSize() { + return 64; + } + + @Override + public void stopOpen(Player player) { + this.onClose.accept(player); + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/MountedStorageInteraction.java b/src/main/java/com/simibubi/create/content/contraptions/MountedStorageInteraction.java deleted file mode 100644 index c5568639db..0000000000 --- a/src/main/java/com/simibubi/create/content/contraptions/MountedStorageInteraction.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.simibubi.create.content.contraptions; - -import java.util.List; -import java.util.function.Predicate; - -import com.google.common.collect.ImmutableList; -import com.simibubi.create.foundation.utility.CreateLang; - -import net.minecraft.network.chat.Component; -import net.minecraft.world.MenuProvider; -import net.minecraft.world.entity.player.Inventory; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.inventory.AbstractContainerMenu; -import net.minecraft.world.inventory.ChestMenu; -import net.minecraft.world.inventory.MenuType; -import net.minecraftforge.items.IItemHandlerModifiable; -import net.minecraftforge.items.wrapper.RecipeWrapper; - -import org.jetbrains.annotations.Nullable; - -public class MountedStorageInteraction { - public static final List> GENERIC_MENUS = ImmutableList.of( - MenuType.GENERIC_9x1, MenuType.GENERIC_9x2, MenuType.GENERIC_9x3, - MenuType.GENERIC_9x4, MenuType.GENERIC_9x5, MenuType.GENERIC_9x6 - ); - - @Nullable - public static MenuProvider createMenuProvider(Component menuName, IItemHandlerModifiable handler, - int rows, Predicate stillValid) { - if (rows < 1 || rows > 6) - return null; - - MenuType menuType = GENERIC_MENUS.get(rows - 1); - - return new MenuProvider() { - @Override - public AbstractContainerMenu createMenu(int id, Inventory inventory, Player player) { - StorageInteractionContainer wrapper = new StorageInteractionContainer(handler, stillValid); - return new ChestMenu(menuType, id, inventory, wrapper, rows); - } - - @Override - public Component getDisplayName() { - return menuName; - } - }; - } - - public static class StorageInteractionContainer extends RecipeWrapper { - private final Predicate stillValid; - - public StorageInteractionContainer(IItemHandlerModifiable inv, Predicate stillValid) { - super(inv); - this.stillValid = stillValid; - } - - @Override - public boolean stillValid(Player player) { - return stillValid.test(player); - } - - @Override - public int getMaxStackSize() { - return 64; - } - } - -} diff --git a/src/main/java/com/simibubi/create/content/contraptions/behaviour/dispenser/storage/DispenserMountedStorage.java b/src/main/java/com/simibubi/create/content/contraptions/behaviour/dispenser/storage/DispenserMountedStorage.java index e54d566f43..e12bf6a491 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/behaviour/dispenser/storage/DispenserMountedStorage.java +++ b/src/main/java/com/simibubi/create/content/contraptions/behaviour/dispenser/storage/DispenserMountedStorage.java @@ -1,11 +1,25 @@ package com.simibubi.create.content.contraptions.behaviour.dispenser.storage; +import java.util.function.Consumer; +import java.util.function.Predicate; + import com.mojang.serialization.Codec; import com.simibubi.create.AllMountedStorageTypes; import com.simibubi.create.api.contraption.storage.item.MountedItemStorageType; import com.simibubi.create.api.contraption.storage.item.simple.SimpleMountedStorage; +import com.simibubi.create.api.contraption.storage.item.menu.MountedStorageMenus; + import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.IItemHandlerModifiable; + +import org.jetbrains.annotations.Nullable; + +import net.minecraft.network.chat.Component; +import net.minecraft.world.MenuProvider; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; public class DispenserMountedStorage extends SimpleMountedStorage { public static final Codec CODEC = SimpleMountedStorage.codec(DispenserMountedStorage::new); @@ -22,4 +36,16 @@ public class DispenserMountedStorage extends SimpleMountedStorage { public boolean isInternal() { return true; } + + @Override + @Nullable + protected MenuProvider createMenuProvider(Component name, IItemHandlerModifiable handler, + Predicate stillValid, Consumer onClose) { + return MountedStorageMenus.createGeneric9x9(name, handler, stillValid, onClose); + } + + @Override + protected void playOpeningSound(Level level, Vec3 pos) { + // dispensers are silent + } } From 3a9f7d591cce7e8227fbf363a52429a9d8a047f4 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Sat, 4 Jan 2025 22:52:29 -0500 Subject: [PATCH 250/515] =?UTF-8?q?Bugs=20in=20the=20filters=20?= =?UTF-8?q?=F0=9F=90=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fix crash when using enchant attribute - Fix gametest - Add nullcheck before inserting attributes --- .../logistics/filter/AttributeFilterMenu.java | 4 +++- .../attribute/AllItemAttributeTypes.java | 4 ++-- .../item/filter/attribute/ItemAttribute.java | 4 ++-- .../attributes/EnchantAttribute.java | 7 ++++--- .../AllItemAttributeLegacyDeserializers.java | 5 ++++- .../gametest/items/attribute_filters.nbt | Bin 1896 -> 1883 bytes 6 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/AttributeFilterMenu.java b/src/main/java/com/simibubi/create/content/logistics/filter/AttributeFilterMenu.java index f0ca76eebe..29ee29772c 100644 --- a/src/main/java/com/simibubi/create/content/logistics/filter/AttributeFilterMenu.java +++ b/src/main/java/com/simibubi/create/content/logistics/filter/AttributeFilterMenu.java @@ -137,7 +137,9 @@ public class AttributeFilterMenu extends AbstractFilterMenu { .getList("MatchedAttributes", Tag.TAG_COMPOUND); attributes.forEach(inbt -> { CompoundTag compound = (CompoundTag) inbt; - selectedAttributes.add(Pair.of(ItemAttribute.loadStatic(compound), compound.getBoolean("Inverted"))); + ItemAttribute attribute = ItemAttribute.loadStatic(compound); + if (attribute != null) + selectedAttributes.add(Pair.of(attribute, compound.getBoolean("Inverted"))); }); } diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/AllItemAttributeTypes.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/AllItemAttributeTypes.java index 106ce21d0a..aee66d170b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/AllItemAttributeTypes.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/AllItemAttributeTypes.java @@ -71,7 +71,7 @@ public class AllItemAttributeTypes { BLASTABLE = singleton("blastable", (s, w) -> testRecipe(s, w, RecipeType.BLASTING)), COMPOSTABLE = singleton("compostable", s -> ComposterBlock.COMPOSTABLES.containsKey(s.getItem())), - IN_TAG = register("in_tag", new InTagAttribute.Type()), + IN_TAG = register("in_tag", new InTagAttribute.Type()), IN_ITEM_GROUP = register("in_item_group", new InItemGroupAttribute.Type()), ADDED_BY = register("added_by", new AddedByAttribute.Type()), HAS_ENCHANT = register("has_enchant", new EnchantAttribute.Type()), @@ -82,7 +82,7 @@ public class AllItemAttributeTypes { BOOK_AUTHOR = register("book_author", new BookAuthorAttribute.Type()), BOOK_COPY = register("book_copy", new BookCopyAttribute.Type()), - ASTRAL_AMULET = register("astral_amulet", new AstralSorceryAmuletAttribute.Type()), + ASTRAL_AMULET = register("astral_amulet", new AstralSorceryAmuletAttribute.Type()), ASTRAL_ATTUNMENT = register("astral_attunment", new AstralSorceryAttunementAttribute.Type()), ASTRAL_CRYSTAL = register("astral_crystal", new AstralSorceryCrystalAttribute.Type()), ASTRAL_PERK_GEM = register("astral_perk_gem", new AstralSorceryPerkGemAttribute.Type()); diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/ItemAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/ItemAttribute.java index 0bf8a8dc25..ad5966b2c6 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/ItemAttribute.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/ItemAttribute.java @@ -39,9 +39,9 @@ public interface ItemAttribute { } ResourceLocation id = ResourceLocation.tryParse(nbt.getString("id")); - if (id == null) { + if (id == null) return null; - } + ItemAttributeType type = AllRegistries.ITEM_ATTRIBUTE_TYPES.get().getValue(id); if (type == null) { return null; diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/EnchantAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/EnchantAttribute.java index 9d1e840448..831f8ac068 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/EnchantAttribute.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/EnchantAttribute.java @@ -3,6 +3,7 @@ package com.simibubi.create.content.logistics.item.filter.attribute.attributes; import java.util.ArrayList; import java.util.List; +import net.createmod.catnip.utility.NBTHelper; import net.createmod.catnip.utility.lang.Components; import org.jetbrains.annotations.NotNull; @@ -57,13 +58,13 @@ public class EnchantAttribute implements ItemAttribute { ResourceLocation id = ForgeRegistries.ENCHANTMENTS.getKey(enchantment); if (id == null) return; - nbt.putString("id", id.toString()); + NBTHelper.writeResourceLocation(nbt, "enchantId", id); } @Override public void load(CompoundTag nbt) { - if (nbt.contains("id")) { - enchantment = ForgeRegistries.ENCHANTMENTS.getValue(ResourceLocation.tryParse(nbt.getString("id"))); + if (nbt.contains("enchantId")) { + enchantment = ForgeRegistries.ENCHANTMENTS.getValue(NBTHelper.readResourceLocation(nbt, "enchantId")); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/legacydeserializers/AllItemAttributeLegacyDeserializers.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/legacydeserializers/AllItemAttributeLegacyDeserializers.java index c0cebe5e34..84a11cf1f1 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/legacydeserializers/AllItemAttributeLegacyDeserializers.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/legacydeserializers/AllItemAttributeLegacyDeserializers.java @@ -8,8 +8,10 @@ import org.jetbrains.annotations.ApiStatus; import com.simibubi.create.content.logistics.item.filter.attribute.AllItemAttributeTypes; import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttribute; import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttributeType; +import com.simibubi.create.content.logistics.item.filter.attribute.attributes.EnchantAttribute; import com.simibubi.create.content.logistics.item.filter.attribute.attributes.InTagAttribute; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.ItemTags; @@ -27,7 +29,8 @@ public class AllItemAttributeLegacyDeserializers { ); createLegacyDeserializer("in_item_group", AllItemAttributeTypes.IN_ITEM_GROUP); createLegacyDeserializer("added_by", AllItemAttributeTypes.ADDED_BY); - createLegacyDeserializer("has_enchant", AllItemAttributeTypes.HAS_ENCHANT); + createLegacyDeserializer("has_enchant", tag -> + new EnchantAttribute(BuiltInRegistries.ENCHANTMENT.get(ResourceLocation.tryParse(tag.getString("id"))))); createLegacyDeserializer("shulker_fill_level", AllItemAttributeTypes.SHULKER_FILL_LEVEL); createLegacyDeserializer("has_color", AllItemAttributeTypes.HAS_COLOR); createLegacyDeserializer("has_fluid", AllItemAttributeTypes.HAS_FLUID); diff --git a/src/main/resources/data/create/structures/gametest/items/attribute_filters.nbt b/src/main/resources/data/create/structures/gametest/items/attribute_filters.nbt index 69ac60675f2a40f938c6ba1fd7316e60cc0b690c..8c2e7884ffe2ed5872e137e1296f960b4578016b 100644 GIT binary patch literal 1883 zcmY+8cQ_l08pcV?pwv}j9Z{pT#UZvDwGNe-tx>B=t=cH*)5rs_3Gh-rC!+~=F#{2q1TvYkyuF6z=;dvT}!rvalUHx3*xhP%6g^$P`n zG3hUDkcUhLk}9k8t6Ems#OjHplO+$4D!>ZXbmf#kSM@|4|9p5LyNbRu^>s$6`(&&_d9(#Cr2bF&&s94qeQ05f) zA2NkdW``Z)@9j()InKPljb`juJXFy{;@0Asu>KF|_#;sJM@F?9?|&=bn_X@{2A|;m zN4(zZ^Wj32GEJ8}4q&zTUDulkw$4gC9Vk9(k`aos`jnq3(Wf``hlct-l?aKK6ul?@ z#!S+%%G&4~Yu-~I?zV4?*_M8Vm_7ISDW_b83iiWib-Wovf*YE2dh(4b;KDTS-qHeG zeU|Hjh$mt?V^t{ip*0VL2@QFByn#29=K(y0rF`X5e~PiCo~wQ_v<5?-a8+AdeqJTI z@lAN#Nv+)o5Tk}g5PsC zoshnV$9^)OxO2JTy9P*TLuNLuZ?8mi@us5fGx=}@V!*z!u;bUBd*Fi0qUa@WxYj$1 zyV`zU8T^FK!M#9PjsBmx7wFMLlq+6|YfN%w{IT+i54faF^s-N1)C!$bX}iRE0H(3> zqQWdGMV4g9=QQBvkQC%iO4G^Qd1GGEre<@LtiM7}QaWYvlPIEf$W$|uE=kF!61PKr zRf9~GCFzRRBfBbgu-_we{_j^EGRBP5LsE)(ZFjUCh!`LUt$0$L=gVA=o<@`K<<0{H znX2D~s-CGUaR`cL@_TnHAUDkzzg~;?*jF z9*Y$21xkSy<9bVeTN;LNZ0Sw~N@`j5H!6kj#qchiljEK#IBfF>L+k@X|f^Yf^Lt^c01X zSih!M7K5KsCft!}j`c61*&94xo^AH09wxDQgCH_*gN1po5{{+#F55*|>pHxzRu#Fj zX_{^&%r&>|I57?59?y)K=FPR}AoG^<>J!Vjr_B>)0ezRoV_n3TmEB>nga(4@Hv0_? zt2j&vZJC#v__|jYTJYuJ8XvIoh%(%rDfr${% zg!Hr2Ns-86m5l;y8*YMv3!A`^=LK2u(7e<(prRO9uN^xcGu~^r#KftfHKH58xCo9P zr|H53g1nJ z0#^Z%F&uTrS-{RqbL)G6U;H*%c~uHxs$qlvm<}$gVvoLF;V9e2%TfxM{rcLCAPC~|_T zN-DVx-SD^<}yu96t z@Ei3wl^x@jnz$*yXplITuCEO9F#t|%Eb@vT>Zp1Vv89DCCes|Pd4LNBY;6AqdPSW7 literal 1896 zcmYj}c{~%0AIBY!BRib+kgJw{b3ZFbq@jbYg)v2QMY(c5j9fz=bChF_sh-Dv=9nYO zu~s>N|XC`*{0XFr68-|_nO{pbCCeZJrKM>9)W^>1TX{)4;qMA-( z$(1^r80BplE2U_%GAwW0VV?Rr3kE?b_}uLRXLw|k+S$3p&QJSb zTlc9ct81nWtvT(%Na}yvUeFY|x}W{$L_vWqWh%H8u+#f+e)D5t(2s>^_>Ubo=V$+` z>_hLzM|RNv8*vjmejWp=C<4-@%eRlZ32Pfc+0o!gDJRiS@4AO z9FjRf$hk&%^7g|$t{fuq#k$+K{^5FD(vGlrJ$WbIzYJAqq>zrOEUJ1_v)JD4bzzXr ze)+hpfM0s0SpEoYqMA$tU=CNhw?aHYPYF!WMd~G3@W_aybzpZ$GxLO{cny&vM@jxJoQ{oD<_DlvlSwI+calsn#Ji4A^Wekx30a zXNCt!V1+KjM;o%n7N~eQMNnBz+Vzv+1@AeQP@d|Za~HESw&$>IHhSNaPE}n=I!+M; z-eQf#Y~T3U#TlJ=AR_5zQCjwzbA!fKt2s*YqRv!ZrP}sFt^_cUdMZz9Y%t;yg@1^O z!daDfPi@tsL((nqic%>Epl|31b5XLu47F2c3P!j{CwPRC#oO!&pO}=ZKFx|<+cH4y*yPaU~q~k~Zy`CLjfemPU~nC71i)6h(fZ5Xm&kl|?;Vs_9?Su5ix)ZXH#cG_5Q-k0yAO z&&PPkj{fqycPQ1-qpIrXAy>t57po2N%?seXgClqF6zl5?S+jD10hG>cL9J};W6Q`n zBE!BU4~$0b_@7jX0H5G1l*D$Ni;*a3Sw`yrC0gM*WH$XGHvzK_gqYo_K636#ZuTW9 z|I>0I+3Z;k!}!m>&UdSu`Je19#vLA!@@rDUtS3dWrM{FlPKk8*a;%v&0%zni=<9nX z!2A|nQL4SQR~()(gnAgb(l7Dqj8i)O^jftdujQ|svb8hf5|m*x1!}~W&VnOy@ZMqa zCldy}e&#okr)I#`$+A+uzqCf08`|xHG*8D(pIdIQVBbwn(FaAf^*1F(A*G7W8fHDK zVi{mxf7iIZece$i;$bdj6(oFQal@0;H+Z{1K90y~yJN9fz>>&RheduF)>aEiQ3+7H zscKTyG(=Sa8~ba&VMVlFteCEcY)^QF|D1QCa8-S>Au5$Os;eW;DVy_ z$??rmOHZGD`@)?aaGp)0Z5iks+Bg}R%1ewdOK&hJn7gJAN;c@KX0&7VU1wDAqFwl_ z!!A(B^ze9^N*e>&n}i*3#g6XwPbto{7~X3ild9$?)|_KZJp)9?92?{w#bzFGz+V6+5fLGP9p_G`>p~wHr9TPCGpgND-j$nB}4R zW}nN+#^M9sO_?j%c@{^HHk=L8`00F(hTm7ch}bV6e~m;s6du}ZoEmY1J>=2ts{5$S z{c~F`Hy?Xq(5k6MzZY;hh}wu}#maWB8cBP~{{%0%63{=Q6?d*Wcw8ny`TCg391y_u zx=him`3jx}^x(`O#V&#=WW2u$o#k#v&pSI&QXaB?T-}bhL`41uel4e} From a647f11a6f7f66d334024d92e2cffc5be461f3d4 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Sun, 5 Jan 2025 12:43:13 +0100 Subject: [PATCH 251/515] What does the frog say - Sound additions and changes for frogports, stock tickers and table cloths - Fixed trade overlay sprite boundaries --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 6 +- .../c24b4d2b8d15abff51c78bd94f4403d9eae6c139 | 4 +- .../resources/assets/create/lang/en_ud.json | 12 ++- .../resources/assets/create/lang/en_us.json | 12 ++- .../resources/assets/create/sounds.json | 90 +++++++++++++++++ .../com/simibubi/create/AllSoundEvents.java | 48 ++++++++- .../pulley/AbstractPulleyVisual.java | 1 - .../blueprint/BlueprintOverlayRenderer.java | 2 +- .../packagePort/PackagePortBlockEntity.java | 16 ++- .../frogport/FrogportBlockEntity.java | 32 ++++-- .../packagePort/frogport/FrogportSounds.java | 46 +++++++++ .../logistics/packager/PackagerBlock.java | 3 + .../packagerLink/LogisticsManager.java | 3 + .../PackageOrderRequestPacket.java | 4 + .../stockTicker/StockKeeperRequestScreen.java | 5 +- .../stockTicker/StockTickerBlock.java | 2 + .../StockTickerInteractionHandler.java | 2 + .../logistics/tableCloth/TableClothBlock.java | 2 - .../tableCloth/TableClothBlockEntity.java | 94 +++++++++++------- .../create/foundation/gui/AllGuiTextures.java | 2 +- .../assets/create/lang/default/interface.json | 2 +- .../assets/create/sounds/confirm_2.ogg | Bin 0 -> 5143 bytes .../assets/create/sounds/frogport_catch_1.ogg | Bin 0 -> 8916 bytes .../assets/create/sounds/frogport_catch_2.ogg | Bin 0 -> 9049 bytes .../assets/create/sounds/frogport_catch_3.ogg | Bin 0 -> 9288 bytes .../assets/create/sounds/frogport_catch_4.ogg | Bin 0 -> 9435 bytes .../assets/create/sounds/frogport_close.ogg | Bin 0 -> 5885 bytes .../assets/create/sounds/frogport_open.ogg | Bin 0 -> 7222 bytes .../create/sounds/stock_ticker_request.ogg | Bin 0 -> 14701 bytes .../create/sounds/stock_ticker_trade.ogg | Bin 0 -> 16238 bytes 30 files changed, 324 insertions(+), 64 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportSounds.java create mode 100644 src/main/resources/assets/create/sounds/confirm_2.ogg create mode 100644 src/main/resources/assets/create/sounds/frogport_catch_1.ogg create mode 100644 src/main/resources/assets/create/sounds/frogport_catch_2.ogg create mode 100644 src/main/resources/assets/create/sounds/frogport_catch_3.ogg create mode 100644 src/main/resources/assets/create/sounds/frogport_catch_4.ogg create mode 100644 src/main/resources/assets/create/sounds/frogport_close.ogg create mode 100644 src/main/resources/assets/create/sounds/frogport_open.ogg create mode 100644 src/main/resources/assets/create/sounds/stock_ticker_request.ogg create mode 100644 src/main/resources/assets/create/sounds/stock_ticker_trade.ogg diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 85dd3fdf2b..d16d55bbd7 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-12-28T14:25:56.9899499 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2025-01-05T12:20:44.8131117 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -642,8 +642,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -6a5bfb3525f178e198ef8fd4c0cb1a941c021ff5 assets/create/lang/en_ud.json -d3402f8a5a75f8c1f7ea6d2dfa56218d5f55d112 assets/create/lang/en_us.json +908484cff8ec27c3b4cf39ac683b6b7a5528e470 assets/create/lang/en_ud.json +7401dfd627e4b0177b75aff4068be5d249e326f2 assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json diff --git a/src/generated/resources/.cache/c24b4d2b8d15abff51c78bd94f4403d9eae6c139 b/src/generated/resources/.cache/c24b4d2b8d15abff51c78bd94f4403d9eae6c139 index eae1118802..6ce167281b 100644 --- a/src/generated/resources/.cache/c24b4d2b8d15abff51c78bd94f4403d9eae6c139 +++ b/src/generated/resources/.cache/c24b4d2b8d15abff51c78bd94f4403d9eae6c139 @@ -1,2 +1,2 @@ -// 1.20.1 2024-10-29T20:48:43.0728938 Create's Custom Sounds -95f92936f1028973cacb7aade6eb6acf582aaa8f assets/create/sounds.json +// 1.20.1 2025-01-05T12:20:44.8111168 Create's Custom Sounds +b55aef763ad0b3df0d27e53c2a4c656c942cfa7a assets/create/sounds.json diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 640e0e3f1f..fad428307f 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -2699,7 +2699,7 @@ "create.station.train_not_aligned_1": "pǝubıןɐ sǝbɐıɹɹɐɔ ןןɐ ʇou", "create.stock_keeper.cash_register_full": "ɹǝʇsıbǝᴚ ɥsɐƆ uı ǝɔɐds ɥbnouǝ ʇoN :pǝןןǝɔuɐɔ ǝsɐɥɔɹnԀ", "create.stock_keeper.keeper_missing": "buıssıɯ ɹǝdǝǝʞ ʞɔoʇS", - "create.stock_keeper.limited_stock": "ǝןqɐןıɐʌɐ ʞɔoʇs pǝʇıɯıꞀ", + "create.stock_keeper.limited_stock": "pǝɥɔɐǝɹ ʇıɯıן ʞɔoʇS", "create.stock_keeper.locked": "pǝʞɔoן uǝǝq sɐɥ ssǝɔɔɐ ʇɔǝɹıp 'ʇsıן buıddoɥS ɐ buısn ʇɔɐɹǝʇuI", "create.stock_keeper.no_price_set": "ʇsɹıɟ ǝɔıɹd ɐ ʇǝs ʇsnɯ ɹǝuʍo doɥS", "create.stock_keeper.out_of_stock": "ʞɔoʇS ɟo ʇnO", @@ -2713,6 +2713,7 @@ "create.subtitle.cardboard_bonk": "ʞuoq ʇuɐuosǝᴚ", "create.subtitle.cogs": "ǝןqɯnɹ sןǝǝɥʍboƆ", "create.subtitle.confirm": "buıp ǝʌıʇɐɯɹıɟɟⱯ", + "create.subtitle.confirm_2": "buıp ǝʌıʇɐɯɹıɟɟⱯ", "create.subtitle.contraption_assemble": "sǝʌoɯ uoıʇdɐɹʇuoƆ", "create.subtitle.contraption_disassemble": "sdoʇs uoıʇdɐɹʇuoƆ", "create.subtitle.controller_click": "sʞɔıןɔ ɹǝןןoɹʇuoƆ", @@ -2727,6 +2728,13 @@ "create.subtitle.depot_plop": "spuɐן ɯǝʇI", "create.subtitle.depot_slide": "sǝpıןs ɯǝʇI", "create.subtitle.desk_bell": "sbuıp ןןǝq uoıʇdǝɔǝᴚ", + "create.subtitle.frogport_catch_1": "ǝbɐʞɔɐd sǝɥɔʇɐɔ ʇɹodboɹℲ", + "create.subtitle.frogport_catch_2": "ǝbɐʞɔɐd sǝɥɔʇɐɔ ʇɹodboɹℲ", + "create.subtitle.frogport_catch_3": "ǝbɐʞɔɐd sǝɥɔʇɐɔ ʇɹodboɹℲ", + "create.subtitle.frogport_catch_4": "ǝbɐʞɔɐd sǝɥɔʇɐɔ ʇɹodboɹℲ", + "create.subtitle.frogport_close": "sʇnɥs ʇɹodboɹℲ", + "create.subtitle.frogport_deposit": "ǝbɐʞɔɐd sǝɔɐןd ʇɹodboɹℲ", + "create.subtitle.frogport_open": "suǝdo ʇɹodboɹℲ", "create.subtitle.funnel_flap": "sdɐןɟ ןǝuunℲ", "create.subtitle.fwoomp": "dɯooʍɟ ʇuɐuosǝᴚ", "create.subtitle.haunted_bell_convert": "suǝʞɐʍɐ ןןǝᗺ pǝʇunɐH", @@ -2748,6 +2756,8 @@ "create.subtitle.slime_added": "sǝɥsınbs ǝɯıןS", "create.subtitle.spout": "sʇɹnds ʇnodS", "create.subtitle.steam": "sǝsıou ɯɐǝʇS", + "create.subtitle.stock_ticker_request": "sʇsǝnbǝɹ ɹǝʞɔıʇ ʞɔoʇS", + "create.subtitle.stock_ticker_trade": ",¡buıɥɔ-ɐʞ, sǝob ɹǝʞɔıʇ ʞɔoʇS", "create.subtitle.train": "ǝןqɯnɹ sןǝǝɥʍ ʎǝboᗺ", "create.subtitle.train3": "pǝןɟɟnɯ ǝןqɯnɹ sןǝǝɥʍ ʎǝboᗺ", "create.subtitle.whistle": "buıןʇsıɥM", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index a645aa8924..1c05daf002 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -2699,7 +2699,7 @@ "create.station.train_not_aligned_1": "not all carriages aligned", "create.stock_keeper.cash_register_full": "Purchase cancelled: Not enough space in Cash Register", "create.stock_keeper.keeper_missing": "Stock keeper missing", - "create.stock_keeper.limited_stock": "Limited stock available", + "create.stock_keeper.limited_stock": "Stock limit reached", "create.stock_keeper.locked": "Interact using a Shopping list, direct access has been locked", "create.stock_keeper.no_price_set": "Shop owner must set a price first", "create.stock_keeper.out_of_stock": "Out of Stock", @@ -2713,6 +2713,7 @@ "create.subtitle.cardboard_bonk": "Resonant bonk", "create.subtitle.cogs": "Cogwheels rumble", "create.subtitle.confirm": "Affirmative ding", + "create.subtitle.confirm_2": "Affirmative ding", "create.subtitle.contraption_assemble": "Contraption moves", "create.subtitle.contraption_disassemble": "Contraption stops", "create.subtitle.controller_click": "Controller clicks", @@ -2727,6 +2728,13 @@ "create.subtitle.depot_plop": "Item lands", "create.subtitle.depot_slide": "Item slides", "create.subtitle.desk_bell": "Reception bell dings", + "create.subtitle.frogport_catch_1": "Frogport catches package", + "create.subtitle.frogport_catch_2": "Frogport catches package", + "create.subtitle.frogport_catch_3": "Frogport catches package", + "create.subtitle.frogport_catch_4": "Frogport catches package", + "create.subtitle.frogport_close": "Frogport shuts", + "create.subtitle.frogport_deposit": "Frogport places package", + "create.subtitle.frogport_open": "Frogport opens", "create.subtitle.funnel_flap": "Funnel flaps", "create.subtitle.fwoomp": "Resonant fwoomp", "create.subtitle.haunted_bell_convert": "Haunted Bell awakens", @@ -2748,6 +2756,8 @@ "create.subtitle.slime_added": "Slime squishes", "create.subtitle.spout": "Spout spurts", "create.subtitle.steam": "Steam noises", + "create.subtitle.stock_ticker_request": "Stock ticker requests", + "create.subtitle.stock_ticker_trade": "Stock ticker goes 'ka-ching!'", "create.subtitle.train": "Bogey wheels rumble", "create.subtitle.train3": "Bogey wheels rumble muffled", "create.subtitle.whistle": "Whistling", diff --git a/src/generated/resources/assets/create/sounds.json b/src/generated/resources/assets/create/sounds.json index 2aa793f370..0da7bc9c54 100644 --- a/src/generated/resources/assets/create/sounds.json +++ b/src/generated/resources/assets/create/sounds.json @@ -59,6 +59,15 @@ ], "subtitle": "create.subtitle.confirm" }, + "confirm_2": { + "sounds": [ + { + "type": "file", + "name": "create:confirm_2" + } + ], + "subtitle": "create.subtitle.confirm_2" + }, "contraption_assemble": { "sounds": [ { @@ -226,6 +235,69 @@ ], "subtitle": "create.subtitle.desk_bell" }, + "frogport_catch_1": { + "sounds": [ + { + "type": "file", + "name": "create:frogport_catch_1" + } + ], + "subtitle": "create.subtitle.frogport_catch_1" + }, + "frogport_catch_2": { + "sounds": [ + { + "type": "file", + "name": "create:frogport_catch_2" + } + ], + "subtitle": "create.subtitle.frogport_catch_2" + }, + "frogport_catch_3": { + "sounds": [ + { + "type": "file", + "name": "create:frogport_catch_3" + } + ], + "subtitle": "create.subtitle.frogport_catch_3" + }, + "frogport_catch_4": { + "sounds": [ + { + "type": "file", + "name": "create:frogport_catch_4" + } + ], + "subtitle": "create.subtitle.frogport_catch_4" + }, + "frogport_close": { + "sounds": [ + { + "type": "file", + "name": "create:frogport_close" + } + ], + "subtitle": "create.subtitle.frogport_close" + }, + "frogport_deposit": { + "sounds": [ + { + "type": "event", + "name": "minecraft:entity.frog.tongue" + } + ], + "subtitle": "create.subtitle.frogport_deposit" + }, + "frogport_open": { + "sounds": [ + { + "type": "file", + "name": "create:frogport_open" + } + ], + "subtitle": "create.subtitle.frogport_open" + }, "funnel_flap": { "sounds": [ { @@ -488,6 +560,24 @@ ], "subtitle": "create.subtitle.steam" }, + "stock_ticker_request": { + "sounds": [ + { + "type": "file", + "name": "create:stock_ticker_request" + } + ], + "subtitle": "create.subtitle.stock_ticker_request" + }, + "stock_ticker_trade": { + "sounds": [ + { + "type": "file", + "name": "create:stock_ticker_trade" + } + ], + "subtitle": "create.subtitle.stock_ticker_trade" + }, "train": { "sounds": [ { diff --git a/src/main/java/com/simibubi/create/AllSoundEvents.java b/src/main/java/com/simibubi/create/AllSoundEvents.java index 4f38c5bb93..c6a9137eca 100644 --- a/src/main/java/com/simibubi/create/AllSoundEvents.java +++ b/src/main/java/com/simibubi/create/AllSoundEvents.java @@ -116,6 +116,10 @@ public class AllSoundEvents { .category(SoundSource.PLAYERS) .build(), + CONFIRM_2 = create("confirm_2").subtitle("Affirmative ding") + .category(SoundSource.PLAYERS) + .build(), + DENY = create("deny").subtitle("Declining boop") .playExisting(SoundEvents.NOTE_BLOCK_BASS, 1f, 0.5f) .category(SoundSource.PLAYERS) @@ -132,6 +136,35 @@ public class AllSoundEvents { CARDBOARD_SWORD = create("cardboard_bonk").subtitle("Resonant bonk") .category(SoundSource.PLAYERS) .build(), + + FROGPORT_OPEN = create("frogport_open").subtitle("Frogport opens") + .category(SoundSource.BLOCKS) + .build(), + + FROGPORT_CLOSE = create("frogport_close").subtitle("Frogport shuts") + .category(SoundSource.BLOCKS) + .build(), + + FROGPORT_CATCH_1 = create("frogport_catch_1").subtitle("Frogport catches package") + .category(SoundSource.BLOCKS) + .build(), + + FROGPORT_CATCH_2 = create("frogport_catch_2").subtitle("Frogport catches package") + .category(SoundSource.BLOCKS) + .build(), + + FROGPORT_CATCH_3 = create("frogport_catch_3").subtitle("Frogport catches package") + .category(SoundSource.BLOCKS) + .build(), + + FROGPORT_CATCH_4 = create("frogport_catch_4").subtitle("Frogport catches package") + .category(SoundSource.BLOCKS) + .build(), + + FROGPORT_DEPOSIT = create("frogport_deposit").subtitle("Frogport places package") + .playExisting(SoundEvents.FROG_TONGUE, 1f, 1f) + .category(SoundSource.BLOCKS) + .build(), POTATO_HIT = create("potato_hit").subtitle("Vegetable impacts") .playExisting(SoundEvents.ITEM_FRAME_BREAK, .75f, .75f) @@ -326,7 +359,15 @@ public class AllSoundEvents { HAUNTED_BELL_USE = create("haunted_bell_use").subtitle("Haunted Bell tolls") .category(SoundSource.BLOCKS) - .build(), + .build(), + + STOCK_TICKER_REQUEST = create("stock_ticker_request").subtitle("Stock ticker requests") + .category(SoundSource.BLOCKS) + .build(), + + STOCK_TICKER_TRADE = create("stock_ticker_trade").subtitle("Stock ticker goes 'ka-ching!'") + .category(SoundSource.BLOCKS) + .build(), CLIPBOARD_CHECKMARK = create("clipboard_check").noSubtitle() .category(SoundSource.BLOCKS) @@ -367,8 +408,9 @@ public class AllSoundEvents { } public static void playItemPickup(Player player) { - player.level().playSound(null, player.blockPosition(), SoundEvents.ITEM_PICKUP, SoundSource.PLAYERS, .2f, - 1f + Create.RANDOM.nextFloat()); + player.level() + .playSound(null, player.blockPosition(), SoundEvents.ITEM_PICKUP, SoundSource.PLAYERS, .2f, + 1f + player.level().random.nextFloat()); } // @SubscribeEvent diff --git a/src/main/java/com/simibubi/create/content/contraptions/pulley/AbstractPulleyVisual.java b/src/main/java/com/simibubi/create/content/contraptions/pulley/AbstractPulleyVisual.java index 28855da304..e5ea0c911e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/pulley/AbstractPulleyVisual.java +++ b/src/main/java/com/simibubi/create/content/contraptions/pulley/AbstractPulleyVisual.java @@ -6,7 +6,6 @@ import org.joml.Quaternionf; import org.joml.Quaternionfc; import com.mojang.math.Axis; -import com.simibubi.create.AllSpriteShifts; import com.simibubi.create.content.kinetics.base.KineticBlockEntity; import com.simibubi.create.content.kinetics.base.ShaftVisual; import com.simibubi.create.content.processing.burner.ScrollInstance; diff --git a/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintOverlayRenderer.java b/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintOverlayRenderer.java index e291a6aa96..4f2f60f470 100644 --- a/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintOverlayRenderer.java +++ b/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintOverlayRenderer.java @@ -349,7 +349,7 @@ public class BlueprintOverlayRenderer { TooltipRenderUtil.renderTooltipBackground(graphics, x - 2, y + 1, w + 4, 19, 0, 0x55_000000, 0x55_000000, 0, 0); - AllGuiTextures.TRADE_OVERLAY.render(graphics, width / 2 - 49, y - 19); + AllGuiTextures.TRADE_OVERLAY.render(graphics, width / 2 - 48, y - 19); if (shopContext.purchases() > 0) { graphics.renderItem(AllItems.SHOPPING_LIST.asStack(), width / 2 + 20, y - 20); graphics.drawString(mc.font, Components.literal("x" + shopContext.purchases()), width / 2 + 20 + 16, diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java index 696f79d7a7..0c33762fda 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java @@ -145,11 +145,17 @@ public abstract class PackagePortBlockEntity extends SmartBlockEntity implements return InteractionResult.PASS; if (player instanceof FakePlayer) return InteractionResult.PASS; - if (level.isClientSide) - return InteractionResult.SUCCESS; - + ItemStack mainHandItem = player.getMainHandItem(); - if (AllBlocks.CLIPBOARD.isIn(mainHandItem)) { + boolean clipboard = AllBlocks.CLIPBOARD.isIn(mainHandItem); + + if (level.isClientSide) { + if (!clipboard) + onOpenedManually(); + return InteractionResult.SUCCESS; + } + + if (clipboard) { addAddressToClipboard(player, mainHandItem); return InteractionResult.SUCCESS; } @@ -158,6 +164,8 @@ public abstract class PackagePortBlockEntity extends SmartBlockEntity implements return InteractionResult.SUCCESS; } + protected void onOpenedManually() {}; + private void addAddressToClipboard(Player player, ItemStack mainHandItem) { if (addressFilter == null || addressFilter.isBlank()) return; diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportBlockEntity.java index f378330bdf..1b78e71ef0 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportBlockEntity.java @@ -45,9 +45,11 @@ public class FrogportBlockEntity extends PackagePortBlockEntity implements IHave public float passiveYaw; private boolean failedLastExport; + private FrogportSounds sounds; public FrogportBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); + sounds = new FrogportSounds(); animationProgress = LerpedFloat.linear(); anticipationProgress = LerpedFloat.linear(); manualOpenAnimationProgress = LerpedFloat.linear() @@ -106,10 +108,14 @@ public class FrogportBlockEntity extends PackagePortBlockEntity implements IHave anticipationProgress.updateChaseTarget(0); manualOpenAnimationProgress.updateChaseTarget(openTracker.openCount > 0 ? 1 : 0); + boolean wasOpen = manualOpenAnimationProgress.getValue() > 0; anticipationProgress.tickChaser(); manualOpenAnimationProgress.tickChaser(); + if (level.isClientSide() && wasOpen && manualOpenAnimationProgress.getValue() == 0) + sounds.close(level, worldPosition); + if (!isAnimationInProgress()) return; @@ -135,6 +141,7 @@ public class FrogportBlockEntity extends PackagePortBlockEntity implements IHave anticipationProgress.startWithValue(0); animationProgress.startWithValue(0); if (level.isClientSide()) { +// sounds.close(level, worldPosition); animatedPackage = null; return; } @@ -161,13 +168,18 @@ public class FrogportBlockEntity extends PackagePortBlockEntity implements IHave animatedPackage = box; currentlyDepositing = deposit; - if (level != null && level.isClientSide() && !currentlyDepositing) { - Vec3 vec = target.getExactTargetLocation(this, level, worldPosition); - if (vec != null) { - for (int i = 0; i < 5; i++) { - level.addParticle(new BlockParticleOption(ParticleTypes.BLOCK, AllBlocks.ROPE.getDefaultState()), - vec.x, vec.y - level.random.nextFloat() * 0.25, vec.z, 0, 0, 0); - } + if (level != null && level.isClientSide()) { + if (currentlyDepositing) { + sounds.depositPackage(level, worldPosition); + + } else { + sounds.catchPackage(level, worldPosition); + Vec3 vec = target.getExactTargetLocation(this, level, worldPosition); + if (vec != null) + for (int i = 0; i < 5; i++) + level.addParticle( + new BlockParticleOption(ParticleTypes.BLOCK, AllBlocks.ROPE.getDefaultState()), vec.x, + vec.y - level.random.nextFloat() * 0.25, vec.z, 0, 0, 0); } } @@ -298,4 +310,10 @@ public class FrogportBlockEntity extends PackagePortBlockEntity implements IHave return true; } + @Override + protected void onOpenedManually() { + if (level.isClientSide()) + sounds.open(level, worldPosition); + } + } diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportSounds.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportSounds.java new file mode 100644 index 0000000000..2909918166 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportSounds.java @@ -0,0 +1,46 @@ +package com.simibubi.create.content.logistics.packagePort.frogport; + +import java.util.List; + +import com.simibubi.create.AllSoundEvents; +import com.simibubi.create.AllSoundEvents.SoundEntry; + +import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; + +public class FrogportSounds { + + private static final List CATCH_SOUNDS = List.of(AllSoundEvents.FROGPORT_CATCH_1, + AllSoundEvents.FROGPORT_CATCH_2, AllSoundEvents.FROGPORT_CATCH_3, AllSoundEvents.FROGPORT_CATCH_4); + + public void open(Level level, BlockPos pos) { + AllSoundEvents.FROGPORT_OPEN.playAt(level, Vec3.atCenterOf(pos), 1, 1, false); + } + + public void close(Level level, BlockPos pos) { + if (!isPlayerNear(pos)) + return; + AllSoundEvents.FROGPORT_CLOSE.playAt(level, Vec3.atCenterOf(pos), 0.5f, 1.25f + level.random.nextFloat() * 0.25f, + true); + } + + public void catchPackage(Level level, BlockPos pos) { + if (!isPlayerNear(pos)) + return; + CATCH_SOUNDS.get(level.random.nextInt(CATCH_SOUNDS.size())) + .playAt(level, Vec3.atCenterOf(pos), 1, 1, false); + } + + public void depositPackage(Level level, BlockPos pos) { + if (!isPlayerNear(pos)) + return; + AllSoundEvents.FROGPORT_DEPOSIT.playAt(level, Vec3.atCenterOf(pos), 1, 1, false); + } + + private boolean isPlayerNear(BlockPos pos) { + return pos.closerThan(Minecraft.getInstance().player.blockPosition(), 20); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java index 31d2b31a16..a01c4492ca 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java @@ -3,6 +3,7 @@ package com.simibubi.create.content.logistics.packager; import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; +import com.simibubi.create.AllSoundEvents; import com.simibubi.create.content.equipment.wrench.IWrenchable; import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.foundation.block.IBE; @@ -97,6 +98,7 @@ public class PackagerBlock extends WrenchableDirectionalBlock implements IBE requests = findPackagersForRequest(freqId, order, null, ignoredHandler, address); diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrderRequestPacket.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrderRequestPacket.java index f73e21217a..70fe0a3aa0 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrderRequestPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrderRequestPacket.java @@ -1,5 +1,6 @@ package com.simibubi.create.content.logistics.stockTicker; +import com.simibubi.create.AllSoundEvents; import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedBehaviour.RequestType; import com.simibubi.create.content.logistics.redstoneRequester.RedstoneRequesterBlock; import com.simibubi.create.foundation.networking.BlockEntityConfigurationPacket; @@ -44,6 +45,9 @@ public class PackageOrderRequestPacket extends BlockEntityConfigurationPacket dcbe.use(player, ray)); } diff --git a/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothBlockEntity.java index b2622ec6b4..8aca06925c 100644 --- a/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothBlockEntity.java @@ -21,6 +21,7 @@ import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour import com.simibubi.create.foundation.blockEntity.behaviour.filtering.FilteringBehaviour; import com.simibubi.create.foundation.utility.CreateLang; +import net.createmod.catnip.utility.IntAttached; import net.createmod.catnip.utility.NBTHelper; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; @@ -103,6 +104,8 @@ public class TableClothBlockEntity extends SmartBlockEntity { public InteractionResult use(Player player, BlockHitResult ray) { if (isShop()) return useShop(player); + if (level.isClientSide()) + return InteractionResult.SUCCESS; ItemStack heldItem = player.getItemInHand(InteractionHand.MAIN_HAND); @@ -110,7 +113,8 @@ public class TableClothBlockEntity extends SmartBlockEntity { if (manuallyAddedItems.isEmpty()) return InteractionResult.SUCCESS; player.setItemInHand(InteractionHand.MAIN_HAND, manuallyAddedItems.remove(manuallyAddedItems.size() - 1)); - + level.playSound(null, worldPosition, SoundEvents.ITEM_FRAME_REMOVE_ITEM, SoundSource.BLOCKS, 0.5f, 1f); + if (manuallyAddedItems.isEmpty()) { level.setBlock(worldPosition, getBlockState().setValue(TableClothBlock.HAS_BE, false), 3); AllPackets.getChannel() @@ -124,8 +128,10 @@ public class TableClothBlockEntity extends SmartBlockEntity { if (manuallyAddedItems.size() >= 4) return InteractionResult.SUCCESS; + level.playSound(null, worldPosition, SoundEvents.ITEM_FRAME_ADD_ITEM, SoundSource.BLOCKS, 0.5f, 1f); manuallyAddedItems.add(heldItem.copyWithCount(1)); - facing = player.getDirection().getOpposite(); + facing = player.getDirection() + .getOpposite(); heldItem.shrink(1); if (heldItem.isEmpty()) player.setItemInHand(InteractionHand.MAIN_HAND, ItemStack.EMPTY); @@ -140,12 +146,10 @@ public class TableClothBlockEntity extends SmartBlockEntity { } public InteractionResult useShop(Player player) { - if (level.isClientSide()) - return InteractionResult.SUCCESS; - ItemStack itemInHand = player.getItemInHand(InteractionHand.MAIN_HAND); ItemStack prevListItem = ItemStack.EMPTY; boolean addOntoList = false; + boolean clientSide = level.isClientSide(); // Remove other lists from inventory for (int i = 0; i < 9; i++) { @@ -155,8 +159,9 @@ public class TableClothBlockEntity extends SmartBlockEntity { continue; prevListItem = item; addOntoList = true; - player.getInventory() - .setItem(i, ItemStack.EMPTY); + if (!clientSide) + player.getInventory() + .setItem(i, ItemStack.EMPTY); } // add onto existing list if in hand @@ -166,16 +171,20 @@ public class TableClothBlockEntity extends SmartBlockEntity { } if (!itemInHand.isEmpty() && !addOntoList) { - CreateLang.translate("stock_keeper.shopping_list_empty_hand") - .sendStatus(player); - AllSoundEvents.DENY.playOnServer(level, worldPosition); + if (clientSide) { + CreateLang.translate("stock_keeper.shopping_list_empty_hand") + .sendStatus(player); + AllSoundEvents.DENY.playAt(level, worldPosition, 1, 1, false); + } return InteractionResult.SUCCESS; } if (getPaymentItem().isEmpty()) { - CreateLang.translate("stock_keeper.no_price_set") - .sendStatus(player); - AllSoundEvents.DENY.playOnServer(level, worldPosition); + if (clientSide) { + CreateLang.translate("stock_keeper.no_price_set") + .sendStatus(player); + AllSoundEvents.DENY.playAt(level, worldPosition, 1, 1, false); + } return InteractionResult.SUCCESS; } @@ -187,26 +196,30 @@ public class TableClothBlockEntity extends SmartBlockEntity { int stockLevel = getStockLevelForTrade(ShoppingListItem.getList(prevListItem)); if (tickerID == null) { - CreateLang.translate("stock_keeper.keeper_missing") - .style(ChatFormatting.RED) - .sendStatus(player); - AllSoundEvents.DENY.playOnServer(level, worldPosition); + if (clientSide) { + CreateLang.translate("stock_keeper.keeper_missing") + .style(ChatFormatting.RED) + .sendStatus(player); + AllSoundEvents.DENY.playAt(level, worldPosition, 1, 1, false); + } return InteractionResult.SUCCESS; } if (stockLevel == 0) { - CreateLang.translate("stock_keeper.out_of_stock") - .style(ChatFormatting.RED) - .sendStatus(player); - AllSoundEvents.DENY.playOnServer(level, worldPosition); - - if (!prevListItem.isEmpty()) { - if (player.getItemInHand(InteractionHand.MAIN_HAND) - .isEmpty()) - player.setItemInHand(InteractionHand.MAIN_HAND, prevListItem); - else - player.getInventory() - .placeItemBackInInventory(prevListItem); + if (clientSide) { + CreateLang.translate("stock_keeper.out_of_stock") + .style(ChatFormatting.RED) + .sendStatus(player); + AllSoundEvents.DENY.playAt(level, worldPosition, 1, 1, false); + } else { + if (!prevListItem.isEmpty()) { + if (player.getItemInHand(InteractionHand.MAIN_HAND) + .isEmpty()) + player.setItemInHand(InteractionHand.MAIN_HAND, prevListItem); + else + player.getInventory() + .placeItemBackInInventory(prevListItem); + } } return InteractionResult.SUCCESS; @@ -222,13 +235,22 @@ public class TableClothBlockEntity extends SmartBlockEntity { addOntoList = false; } - if (list.getPurchases(worldPosition) == stockLevel) { - CreateLang.translate("stock_keeper.limited_stock") - .style(ChatFormatting.RED) - .sendStatus(player); - AllSoundEvents.DENY.playOnServer(level, worldPosition); + if (list.getPurchases(worldPosition) >= stockLevel) { + for (IntAttached entry : list.purchases()) + if (worldPosition.equals(entry.getValue())) + entry.setFirst(Math.min(stockLevel, entry.getFirst())); + + if (clientSide) + CreateLang.translate("stock_keeper.limited_stock") + .style(ChatFormatting.RED) + .sendStatus(player); } else { + if (clientSide) { + AllSoundEvents.CONFIRM_2.playAt(level, worldPosition, 0.5f, 1, false); + return InteractionResult.SUCCESS; + } + list.addPurchases(worldPosition, 1); if (!addOntoList) CreateLang.translate("stock_keeper.use_list_to_add_purchases") @@ -236,9 +258,11 @@ public class TableClothBlockEntity extends SmartBlockEntity { .sendStatus(player); if (!addOntoList) level.playSound(null, worldPosition, SoundEvents.BOOK_PAGE_TURN, SoundSource.BLOCKS, 1, 1.5f); - AllSoundEvents.CONFIRM.playOnServer(level, worldPosition); } + if (clientSide) + return InteractionResult.SUCCESS; + ItemStack newListItem = ShoppingListItem.saveList(AllItems.SHOPPING_LIST.asStack(), list, requestData.encodedTargetAdress); diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java index 519b0ae96a..e07cd129e5 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java @@ -238,7 +238,7 @@ public enum AllGuiTextures implements ScreenElement, TextureSheetSegment { TRAIN_PROMPT_R("widgets", 11, 209, 3, 16), TRAIN_PROMPT("widgets", 0, 230, 256, 16), - TRADE_OVERLAY("widgets", 136, 97, 98, 48), + TRADE_OVERLAY("widgets", 128, 98, 96, 46), // PlacementIndicator PLACEMENT_INDICATOR_SHEET("placement_indicator", 0, 0, 16, 256), diff --git a/src/main/resources/assets/create/lang/default/interface.json b/src/main/resources/assets/create/lang/default/interface.json index 6354afbc0a..f0e58b4f47 100644 --- a/src/main/resources/assets/create/lang/default/interface.json +++ b/src/main/resources/assets/create/lang/default/interface.json @@ -347,7 +347,7 @@ "create.stock_keeper.no_price_set": "Shop owner must set a price first", "create.stock_keeper.keeper_missing": "Stock keeper missing", "create.stock_keeper.out_of_stock": "Out of Stock", - "create.stock_keeper.limited_stock": "Limited stock available", + "create.stock_keeper.limited_stock": "Stock limit reached", "create.stock_keeper.use_list_to_add_purchases": "Use this list to add more to your purchase", "create.stock_keeper.locked": "Interact using a Shopping list, direct access has been locked", "create.stock_keeper.stock_level_too_low": "Purchase cancelled: Stock levels lower than expected", diff --git a/src/main/resources/assets/create/sounds/confirm_2.ogg b/src/main/resources/assets/create/sounds/confirm_2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..d94df4235d1462ceda9867b3c02ba60320f58934 GIT binary patch literal 5143 zcmai23s{rK(%t|9LBt3FgT|hqP)GzzxYf|3#h^k05eWnZq-Y=_cL}$80iy&8h!I0T zZdxu0m`G3%Q1Dk!OhiD$D8WlDC<-dASglIyg|lB`TmSz5)AK!>efHbgo!OarXTI6^ zMMVVw9q{p4W}+QbI0kJ)eTGU)~gok|k&(hNuT+$$z(o|0m49>umq;i=5Af{Jg4%If%m5_{XDi@VQKHu^uO}Gf z`;Su47hioIkx-0oiw9fs>v08!qQ@fTy>THJ=72TIS6co{TPCsmS@&IL`@?(eA=s|#Iq3T;k zVyK1)`&?pODHpQRszm@is3!0_grzlM`Tp^{aA|hvnT+5w*`c?x!`@_X!R35x(-|Xgkfu?cfC5!ZC?#XWn#Buh9#Cp@`8f?b zAQCYN0WDli6xPz}w#GC@SF~+A-WK22Y~R;xtXTq`t%sZjR7IE9{hziqxPY%Z=kVo4}d=PVA?CVE?&tlmy`bun^(%}D
kzxvMo!wHDn z0q`K>6-oFj&>BpK8(h~7$t#AF8N<*Nh(-SS*{i_|RK)7Y){+>Wp>yFDjahh*Ew0+o z(^xABF37EZNGKmHe|eQ+QvRq)imkYDAuq7Pwq06Uq48kcfaMtUC9$_mQB^iro;*M^ zE|+LWJ4`DK!MZV2GZLb;ojiE^6_KsSUAcPRoJ$+2Wt6!goX5* z%7F`%`*26zor>6YbQm1{7Fqf1DjJ#lJA6E#-?rSsDUa+UWC--xSgSg#qR&zeniN%$ zdx+xC4hYuLrCIBlmbQ|VeHzUP0Pryy6#vm_psYo)SeQ@hwL8`C)Mt-$4c!ColP9|| zp2lQ|VtZGJ;sdSYN0S>V-m#Kab;weQh)E|(v=IfJN{B36rEjSTlAKa*FR>m*#ix#Y zZhdXuqU)cuYro+AO>JPi?&J{Qyn+?T+K?6>d^q*)>FlsusUyP~Bf|&6=jZ$#Sbs(i zfI-98#H5H_K)zg=wT_C`I{1&sNy1(}guimg+Nar?p|ZdF!o}~U%XPCg{w|CF^RVmY zsW&V*0d8S8Tsb#boS`(%?KV#6>5SmEj{&0%n~~wvPa+2ik;N3jn72^xugIyg6FgWh zSV9w82Ma&nQ4*C`E-gFyL|S9?x5(L+UtgMEpPN6CE3nHeiOwsRwb#V;Hcoc@*Y;=R zcyX;^gORg_YyC;&bdm9%Fq)d}885XuuDA{jnzCm8rw#z1tI*g-lSllS4ns`WA*KT> zaK%4I45SXZFmAX&!xjTz3BVHQWIiUJTS!eiPAObv zyW)(H(rx^5lxb(a+BfTf&6fhgoQrjvXpfc~!nCIc`~l#Rd&rk?+yUB^s?`Hz^bt`H z#a2?Jq7fZRaLz=VI@5@;%32leidcm6$v+}CjmVS3O~3&DW>*gunxj0h0I-djM#O9p zbAUKr$m}IQ!ZYcV`pSR-is2%DFIoRc7KSLn2MiD|~S#{R3HjW~`w=)?Et*tIdXC#$fy!$TC~Q zGH2Z=VX#``ueoq;2eR&2u!h<=cP%nEl%$S0GlJo(8d6h-OESXM@nNMOSuwC0R&K1} zHdp@?mOqOV9LNez;{?B9ZBS?UKxzQvwmFN{#=89~o>h`@KZO;xfphx}E7&44bU6F| z>x}z2g!AxFDx_{vbGDpL9kGipkB+H1CM&m-$)vKjcv+)7wC1s_M%LRLC2MTxZ9Z|l zF>Vr48;{AF?PW6ixg}I$DejcJ3103JCgd_;_rrjBREM`51@x^ZumKp7f{=n?J|&0)$@*5w>*xx+ zXgxi~N_3N?Bm@d*J(WeK^le0uifK?SSx=9x7O9!BO?5ZfKNG|j^k@f>DkMg#yctq3 zF9PE}R!f(X~hcvLEatje;4bh^A)$n38yLRe)9=rm%RknRgl zMW;7qGehFY>PlvuD?AlsC8WnWC__ShTT?M1vo)uZw+6+=$dypIjRfaIZ)&xOO(2gi zphwFQ;ZlV~r~nENh;^+~#~_5z_!a8%WV&2^lX(CVBI3^tmG7GRLvwbFgHp|wBf?2d z#X=~2{7y&#MWkXwRzhY0+z}erURM$W3FXZFt>br+<6K|g3~4}Q_`okj^1=33K``s^ zbb$vC&8b3C2okoda+w3PXbiWXLPAsfDYjCsFO^7S^{+CtX&s;ti3&Bv&_-h6Lvm0A z#S)273kO(tXu?*Xk*7cz%?U<>)i8>c1eka9EhV_DL7W&HfmtlULBB|_5zw}{WD_dM zGGbtr9g)ADP9kPw=rkJ%tbC2|u%3$>6m7)A18MWfW@EN7IfsxE=tP>w_odrP_d<)x zQy~;2ivExodCM&iLwUB^$;SplVXOR7X$UNBe}V`4Ns~uxK%oKfz|}&zlqd|lpYj;* z0y86?Z$eU5W|>e8&EYZNx2m54I}8;PV7*tJ1v`mIg%FtZCj>Z0l%ya85z`0&(so!8 zo%D}P-gl@9=1d*11Id|mib1t#Em27j37JqFR7uJ;hPG1#Ap}v#PXq{!IM*}`gq1SH zlP*_mjBT`%sM!s!!w|%+Xd(tU(HV`F5B7_f&Xi*5gESbq9*+@!|)NwO}?f`ik*htjO z7%0WvP||V}5p`>oH&LPv+3x^Djt*bh1+F@v_H%cYW99tb;xWmny?-4yiX?O6pK$?ygsV&wG}M3sTyk|7Xv2rMHPY;tJQRf zDg+}|eCP)49KZ0-IgI;+7FrNc6WVp6^;8YC46ETBaS;TWon~YMM`&#UrvW416qa%# z$XPolGKDfU<(-I$AQGAeA!wkg8KJEZb7>Y^Y4;+vAcUwcl7*K%wyy169OrWXqVD=_ zJ#@e`1|aEH%p_6WLr_%mOMLi+Tnu~JJZ3({tBK=nslW}1$P#P-Gxl*MyTIS?NCchS z-5?60+a21c;x@FV^~1X%!4NoNtep3Hps=_eD2T5|1XU-y2FaWB^d6cz85tX0<|nJ7 zbpeLoV|*xgqp_)(Y;O(Q9cY zL2dV#uJ!6jzWCBZJsS-f=?o3ER~0?YSaWmMD}u!n@*p>7M9j=t>V2axoL$O-lZzW# z1pV_)#JPPKDIWBCeU)@!QQP-lr}S(L@BivI>%>!sUCsCWkmz@#j712K?|e3ED1WW} zHz$JI-_IluKQ5Yic}aEA*1llcc|4|d*yI%}{n2QHaQU)t0dvK$h`7cl2>YUska?#_% z6HmK4QTL`t&Q4eVHrGMX+5G#i!)G^!QS0;x*6wj;9^UU6FbQAEdUSdNsU&zq&mZJ~OpvCe)$rw-5KZ zPkuhJXJ+dA#}6KaLtm>iJ0{p__?;$=BY`N`RA$U zz2HQpDYAa$-pp5MoeV3t{GlAvOUpM5qJHG`XP|#s`eEd9=kB*Dl?yV>+yS7@h5s^O z*k7YO7HkC(TThudkxtSMNL!M+d#;T7becXWdfB*3xC?%!?jl?l&+eMpG`2?a!p_U`_Zckj~)v~@>O zkvr=3fFYae{oWT8`8$G~yMlSgqih$xl~E2pq#z=?>{*ezLg4bF0DJ{U~n~m?|@w4MlA1YJ@#cb=F|V^XJCCi7iRH3}Vmy`+3NzOhjnkL zD@7&9W7mzv{61&XU=%5+F3|13P6xrso0v_C!r0vl@H{m5z)6{^&z!4Yw`clXyyKh% z9;wrm;pEIa(Ux2D?AxmG(Cco-U-?j_ll8}F#Us)W?_1*+KkHN1rF%{bb$0LfGH|h8n2fv^{d!BXg_vx@+r>W!@-d7Kv zZVsd`i*q=?GJGfPi}Rd!XBra)`=S@v*4Sb!F}6_38U|s^*om>P$(llwEwY3rF{rT&4aSxwq?CQh zZcvJ{v`FeBZBqYd_(`QG?4_1&8>DhIxm3heROgydli{OA!W!b`Ssx zjvy`Iz4-BLECBETfV(t;`-YDhf=nopi^(UL(p$YMY59b-ULns6WZ%CkxVo1B05Ab~ zIkv2_HM4+GZC@eTtT2+c{~4`HIO{c=C2h7R+ebV@Dw-++Lq-uYP%cMi0JMvqsYEgi zO|NjN5-CDpbyX~EK%%lJj9vaNDS=&e0G?=}`mX%O8J%}`%d&Ld%QcM~a40oRqAZXz zcAmAJEUvNPquOtZ{;t^e^ninVF<=q);xT~I*{32Z^20z@`)a`fJg6pMk^?hqfDJc@ zJ)MxY`b*Jbe*cM}n1)oS)`zY_(sL0uu|f zH*)Sx0e#9u-wie#esi0f$nwy&_jy#o);Sgt$|jW3e&I;*PRWwoCQrm zx5)qeT-n15sE9#8hxz&3S5!)tT3>R%@u6@@GAQFl#M?2 z-|*1`{pK+z)K{DUkIQ1g!6YgqZXAlZ&V7S~96*#G%FH^Aq9j_Qg=NVR345Bu0U(KI z55@ng_Mp6v;_}>U@MpTCt=~YelsLpzQH;*AF5=61028iO!=C#}5wc4hE9|kQW4z)M|0rXh#ccRwz%rq#WUHo& z#bE8Df*o%~K5tESor_$Yja!_}JbN(Zzk&7d$N|8hN!p7^0xkpDUzB*pfNkHw|B9UR zu>Kse!5nGxMrq4Q#ixI%TWzUN@EhBxTiOb^P6$L!33}UVx=v|$Phq`hqP*u@yq#O) z99#YlnEkL>oQ?cPhu*GXGj->a{niS#oK4{%ORjw$h-X+V%GTwfsABOv0qW0!EH;nDjp)rwb`&2u4$* zqUF}Uj=B?|K_iS0{?h>f(3Q<;zITq;pp|CO8Z&4mEJpW#ju?GF#$FJfJY7>dxXM9%?3$Eqe!-5!hp6c`NpIfLMcy34Ixv(=eb-| zHfc6kP7pG`R$R{KnMMT{0j%I3N6C1$07MT4060!GJ0h8Y9!0EWqlb{IVrZ0hWs&Wu zHdH)m2+2~M$b%q@*^VOm#gaz!SBnzI_2mEn-UR{w4CK_ki~$~5U@263?1s8IOvaqw zcnsz}%WpY*Q~jyBh7ATg%#WSHV4n+GVq0V^`7JHKV6gngSOM%*o+Y+9cud`U9)o=$ zh@ENiel8eqpBK5PX6XoaX&^OnHZSfhE!Z{xZ&sGDJyx37*%l3(2&@g(+Yy6xjPiE; zhP9`~nS)eY%XtATwgo%C9gNM3dli9owfCO?hIJH-cb-jt^)>F55S{bvOe9G4pm}?= zMlQc z%}$l#dduCacIr@LePM0&ddnt9x8izxXjN@(b>jy*wVk@&cYeKHCAI=FTv7eLozmVO zvfh4vq$OCatm^$k`Qaz^Lyep3?aED&5;oY#7X;U3dr*(yv(dMmza=*YAAdyM83Gwh ze%Bs5C)NfoyB8t~j`eLRobu4hBKs1-omNo`tE$%GL zmgPK~Sz7hJU4Hl>CIft4==|cStP>GpnAm!)~Emp!nAxJ9Ft`> zP;`S2<%b|lqFGDG)~LV|0u3G5P%(|$fR_uR{FMlkP63p@X{QWcPaf4bdjpANYM>CtHdmn8KNZ@WdZIAg=$DfI|U(W zMd%<6a91F!TvU)!pOdpib0m)w$KI}}&31tS)ILzS3|Yt=)zB;$7=m0ALHSeZ!YRFi z&RL*v+dz#9S^%Bk9IQ(thNGyoX>=w?@C@#pAzs@2m*%(tr9K*tN*6BQa5EPazV^&1 zLz^&(16k#wGr$$jL2VUz0U&{hPH$d&79OPWb=s+hF2fvrLxf*%+qMHw9XunThiCI9 z(T@;%*y^XEN6q|s!bY^^*$hUsWhr461_%UpL?0^CJgSXA^wPAUGGsw>d8J;vKm-ER zLJ7<}_QICMGOZWF&gIAk7=cmT2M5m`7Gbhb;OGGs8pWfueUxu9`^gBZA>{d2^f6UT{6fk$9e<$04VP_mROphc;X zAQZ^GBTfO-ra3(*HJPSrE(1crhuV|x1ZJ=wzzu!aJ4a-IY*s)|s0@^=?aPB3(S9qY z4xWr+N!;>%MTy)7Pyuio;Ja!>8?1N?KmwTWl_Y`{nJ`Hwpi%GO;244&K_?K<>;NDi z3T8z0HeTTgIVAARWB_95XC_LUwS;gQ(FZ5wqCs(>N|Z28(009cbOOQY0~~}#kVX^_ z2&+CPLlm{wA+T10OvBY^%z_|pULyvgKtkZtHUL;)W(DdQMU6FOh1lfPz4nyA!$C7< zAX8wtYsfc6hEPOrKA7WF2+>my@Fh#nKQcf9*zE%e+Hb_@RZ)1>e-e}bwAlVXN>IQ& zi`Nc(TlWcxLie-s(|mhf&!E4P^!)wqKXUf}Wbgk|%Q=t=Lhhdxp!bNK75Kv{YG&U|mCVJiZ;Eq|ulTr|G%acI&lo+D41I(>FzsX-?@%V924sE-phO1r1K=ox{~2%O}xbd!~raYgaUZe`tvC_%kMpzSlaWo1ek0a>{*+B zF+hX9AkonxVT1xvMaPIl66l8gv83#OkMZcd*@qSgs5krb2-XIB(1MnLV+e5&WO92g z8L-8+pTO;bF^LaM{V@U`C}S_ZBcSPs1WiLH>_K&}#U?>F*WP4_{k8O55QHcr z{S=mZD_u4u8KnN|38S^&01Ci!0>JsXfOQ0I0Nz`alxLol9maz@%8S0HZPMUvD%>kH zLqL*Yw&=jOMYs$bt71iqiocT-*m(@tm2NP3atORlAs7 z7b4+Fa3+b=UI;83pU59_;Wd}l{l{!N#$@jO3oryY1OT~Qa7js`b{6;b1KB(|yt#Zg z_z56<0bmJ&KLFsRnNw3!eX`2Bml>svypqa$R+wb=$n**d-M^|Z?X~wW$a*^aWcme} zE=Dd`K|)6kp^8M(FTGO;guJY*f|?rGlb1)RYO2V~$*HIf^vfZ^v5Ee%F;!&+<)bRf zs>d`Hk($%JHQNNpX`$q|qtBT#R<@tNi}8ehK3`3}_vmo!0_NvVU34e(kJ^L+(6j3> zJ7^RY@clW95Ss?S(Bz3TKiw9uE4x{}{q$tAKJCw=ZyC?VzNtYLl+4O{rCaPbdjS7~DSGNweHs(?yZ;6bx9WB{VvHSjw%2VYm zyUdDhf{c_tlbMa8^lJ~X5%NE`X#DN<;&)t^2Sz-@7KC+EBc52FSrIgvnuDMc1K7Wh z6hzpR-0}Us46PK~8VYU8yM34t5J;#EoX++KdSrBs8c#37lZ?)E9H@U~&Hu?C*Qpto zpGGP@_wjsvJb%YsqRy)Ze_UflK;wl;DDXwNlTdsB9xiWM5yLtlhXF#A=jRu#ngyM| z4IHZQFKHN8S7<+%9!%PJZzTRyR2TxlBsrMTnVFo@xHI2mnX(^uuP>_U6c z-;%A+v5pqo^zF~dkZ@b{TGC-?v>(xGykGxE*EvvONhM=A`jKIUhft-*oHndbUnfh( z-jND%SB<-@thgq!>N0ql>Ua0gjX$(|ccNE5>4&KIt?<<#|MPbID z*jD-V*KnqC3}(Ju=lI(PVU4GbTZm;#94l~kF@%1*adc61DJ1Yh^INq&j1%aflpOy0m-wPlJN@~ zRLw6`M>Y}XxepIJ5Wuu}w2;QIZ>p2ZPyZl5MJaq6M^l$KDmD5B*qag{|PzP z4Q@GTr9Y#J5C+nUv0r`dT!2ILIoVvCN!59saW;(%?cvhpOk_-eDwtM;vxagWVQiVv zV5>LRY(La&;HR1I(EW9d)8M^j6BkFhbd_Y}Y5il(j6!15X6`SHo-zlk=Cq17b6L7X zw^e@_J{>mkOwx#DL7-D!j;SI!Ayhc4tXRhU3-G z4MDMrZv*im1q^_NAhYLHc+W{b_Scj*WI? z03fZp>xZ{F$=A9hF{R1T#gsT$^k)Od=@#$%1!GKpvwcnLOc2+u*NzzgJ7S(_k|h1y z-E5^Pd`MX6YS}&4RX9$c>KqX*Xo1jmt=-LhdS~qNae(tsoe25m$~$WnuV)3MD>>O; zW*zKw+GHa{FH*#%!PjL?e2?$TN+htNU#G!rvAoHct7f^pnFC*b!sM!WcYAu!BAj=v z&Zj5w<>M&*4)qrt6>+q4$Hi3q0GL7gc;l5Lzs@3YW-nJNKes|KHH@!oW@~TMIP@#C z112v$@7$^BAkH3`Rh!g_lp4lueZR!|MSPg&EAQ<;f{)w}+_2)yeynG`f(|ZpI{%kM)KCwY7P$Qfe^zMCkk@8?>`Iay+jfhs;=?_jFrI2Do4l9pK zc!Z!<(h_TYgknxndm{g&RU(-Fx^t3QOKtUQDfZl@Sq9*z=7Jo*#`RNHa))W37=ij% zc(cr#15U>|0DcoE&KBXmrboBtU;k1oIOCjrrfKWt=D}YtzyBe5o>^$P*rM6Y5!}`| z)$Nj$BaK6O#~qt7Fc)(?)`-W?IHaUMch@C!a5X+O)OR^2(Q&j3C#Thtf2+oq{Yqw}AQ0@hiNveE znjOH4T+YNNCG}U;>dQMXg%rG}$;W(9dDfvzV5Mn_RW->T7DzpK|2qVDi~qom@%Jue zzb`KfYh zvxT?pvvw2T;loZ$(yd~LHO_p_?41dl+woX+mC~h5K@as@ipItj6h0}dvq~N}i~q|n z5jH)Z8m}hLfWRxt1J&C7ebsJxb8d<41 z_Hnq*z^fv@4fv(2d(!P1<^w6m_9Vpm=wH!=joUC6D&|g&;`nYqJG`UKmD=a@MlG}FLsaYj{D?Jf{DBm_C#x*xlIL)&c$!bYE}ZS8<4?aWmysB=T;Ublx>8J&nQD0x zHLCDw{hwjq0~XJ@@(8fN+EE1FYW_nrzrKHSjYh){*DSY~!kLe*yZN7bvs?~OM+sM) zlUdo(FqGWM^4sD`xW78}8nVnJVD01D@Z+^Db!L&jBj!X(BxEhpA(+UG8yR<D-K3ywt_MSZ(ySw_K zAaSbIt>f!<9p(DFxQeyziXXIGm6w7=Z9Y$PzU6%rlRqr@E>=ic`cmDe3p9}>j)jJP zPEwPuOWWB)khX{VIT=Y7A-CU5%_eG0j5$Vfx=*7IDN@W|ZVTm2uFi&cg>5_XEAq~p zvMd}t7IQy*>4!E}K^p)*Id8fgtl~VkAatD~`LMM#DW*NGfXCuK=INFQ8vy;>e}jmS zrU7n(oT7Mwz@dxEic?>~`!4H|n;MG!Mg~xW)Dg+YD!>xZ!rHOXD%;1H<}rRUH0j36 z7Vev_6eV)Bm27Ya8%LyMKaR;%rMckkb-#h6!&E5?m~V@>)29YixN{w2MT$|(=NGnZ z0AqmQdFcr_Z|u?TqrY9xRGC)ttB1^{Bp9^N$|tQGmXs2d`Bp8Aq+M`dS1FQTs~yVZ z7!!ebZ^o`!051eAjFn7i6y?cvog9zGJt*D1GtCA#-}=tr9JPn1CbJ=(U0Ddx3t7qwH@X*-D?_ftI!-WKOe#UePw%W;6=aDT7%4| z>h+gmcGh>>s^5Kx(YavvV>;N-K7(aN-zr+xo}0O+ub}wtxoV#;hUp(WH0E!&SRG;E z^={#Bxx8hwa zLGy0>g9GUhR6#+$CLXw&)eLl={NBo@bu=HP42ut_T-j8Lir?YkO}c!hcE;M$9|&Tr zBUz{(`7MxKGAI0s3trA5%Lsn8wjYHqZFVlojyl zgs0>+cVa|y%FT}rlX#$fBTCNw3e#=-)f}MIwCy*L5%2a^xIR+H0yFyPF4u(R7KEf0 z*%?z6nfTjq;PxO7fO%Id;?L^Auj_s08w3d}FXE_QW1t~1?+R|bv_Aw$yPa&D*9v;E z!KeATJHQr}9yD8$%jLYY5MIsHg9?5?{c&4 z4!m>1<7KZ<4211pFsQM~{l03HHALr{w{urgkyGE|*Kmg9UbN2x1O4?dmxJ$vYATmX zqsN|5hydnCZJ57SIk$~c#Ow~9eca{f+*^CqSSVd!+A4#pBwaf4sZNLUMP`m(PV03)l_P%j*wDccfrD#~j9tIO zP_f>8_}O0$c91E#?yF2RjTQT!Z5BxfkKQ#~-2I3g7N7iR!*N7tnUfUzf>+WN@|ZKW zQ|0+pXOl;o9~M_!H7k~n?$(Eh+C3i*dwk2^&$1^+@WV|$@O#Kbv6YVIUY{ZcM9X&KW6Xbm>4UnU>*G4zPyJ>WZ!uKek%mrK3#U-5_$dy(6oW+D7qZv zEC4u!823IqF#R(A&u0fluz5AXgM%G`P*hS^RU7Hxvw(208Ot9f8Jq)jG)RK=A-GIS zU9^$^Q_3H5F>jbs>a9$x$k{~(J`5zip^cR>^p_|;r>Lmw)F4i&#TWWo>+|I0g0Nuy z3)S&Aha%9jJb>3bR8g{;r)@U_Q1l%l#)je33Q*oIr7AA_{+JmAe!lN7p0@VLuS+_E z=f-?~&=YHFcrP=VyAh&=79g>cegmWST>UW}$>OI4)@t!zz2Mqo2E{5L`?-UD@JL-x z6Yi6NS*2WPW{b!KxGuaZU~%LcoCsx#Y-rhHEXWR(VJ^%t=GX7;4CXpjYQTiqMQ!Wx zNbm-Gc8J5vteF>90>ZqWHm563gzG9btp(nfe*TN#c2?sUOW0i=dn>uC@``Us+&OoUAJ#kn^z+w*tFdz9KLfLUt~~r}BkHDE63a7T_7T6uf++2O~dYMrXA z8Eb5=jncwyUz*iTnS8LdA@U-;HZR z;^vN7c9L$szSHBut`VZ3&UvC^Q>+`7xG*;E6v$=0TB*UVyuk-BY~*@80#5pTkmcyM z&F+`-&TD_^VBPs;!X54D`JMhVOr}jrh-SgC@@V~}RxZkMx{K+F+ z;EAqgE$_#JGpnL8-u@fbkniGzCC??xA+jtW#WK&t@}lmO*u?_j%09D0$QV8Byr2YUfXk$>1c*Z5-nXKKXdX wgJkPr!t%Ri91L5-A@!>1WI|LCM(2<1DC0}-Uz>_&QQ&Wcdh~xl!8fq{AGIG{0RR91 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/sounds/frogport_catch_2.ogg b/src/main/resources/assets/create/sounds/frogport_catch_2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..2f674e5050497a39dd764a04f42d264801ba2a7e GIT binary patch literal 9049 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 Clw#BX literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/sounds/frogport_catch_3.ogg b/src/main/resources/assets/create/sounds/frogport_catch_3.ogg new file mode 100644 index 0000000000000000000000000000000000000000..be2c118849b722f569ef50c183a09ea97c8d8998 GIT binary patch literal 9288 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 Ee@=#R3jhEB literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/sounds/frogport_close.ogg b/src/main/resources/assets/create/sounds/frogport_close.ogg new file mode 100644 index 0000000000000000000000000000000000000000..7fdfebbd5b5b828b0f755d56124fecea0e9d448a GIT binary patch literal 5885 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/sounds/frogport_open.ogg b/src/main/resources/assets/create/sounds/frogport_open.ogg new file mode 100644 index 0000000000000000000000000000000000000000..ac2e1c771e5a1fcd298867ebf96e24d7837871eb GIT binary patch literal 7222 zcmai32|UzY_y3KZBrzCLjUq}N^Ssah{r^Aj`}*VQ&V(^BsZ*4{C9=C)+Twn%m zglq}vO~6ACKLnkVMDZm%8=%Of9GRFx3X$QC z&zm!F?Z#X{NXPqRV_Zx$3Xz=AW^XXujo%MAcosY=aP#a&NpWo_utUHu+NUHU;5bG{ zjFh;E0NpKdpEilYOdlTEqU;+yN^Qt6Bc=EG$tIfbi}K<%Kgc}l)!iols2^*D9

O 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 Z2;tAAr6(0WDcVt>hida0hdfoc{|}Y%jHv(s literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/sounds/stock_ticker_request.ogg b/src/main/resources/assets/create/sounds/stock_ticker_request.ogg new file mode 100644 index 0000000000000000000000000000000000000000..f31447645ced70c0dfa74a7d0ea8f998cf9cb38b GIT binary patch literal 14701 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/sounds/stock_ticker_trade.ogg b/src/main/resources/assets/create/sounds/stock_ticker_trade.ogg new file mode 100644 index 0000000000000000000000000000000000000000..cc73b4ffed451eedb1eca64e0b3fe871a571de64 GIT binary patch literal 16238 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 Q#r+A3ksP?t`|tMu0DwC+fB*mh literal 0 HcmV?d00001 From c0e76c28c60cc6b9c15a9030d752f798d7dcccaf Mon Sep 17 00:00:00 2001 From: IThundxr Date: Sun, 5 Jan 2025 10:39:11 -0500 Subject: [PATCH 252/515] chore(editorconfig): remove fabric specific entries from editorconfig --- .editorconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.editorconfig b/.editorconfig index ddf52c2119..a18e8d5829 100644 --- a/.editorconfig +++ b/.editorconfig @@ -25,5 +25,5 @@ ij_java_blank_lines_before_method_body = 0 ij_java_else_on_new_line = false ij_java_class_count_to_use_import_on_demand = 999 ij_java_names_count_to_use_import_on_demand = 999 -ij_java_imports_layout = $*,|,io.fabricators_of_create.**,net.fabricmc.**,|,java.**,|,javax.**,|,org.**,|,com.**,|,*,|,net.minecraftforge.** +ij_java_imports_layout = $*,|,java.**,|,javax.**,|,org.**,|,com.**,|,*,|,net.minecraftforge.** ij_java_insert_inner_class_imports = true \ No newline at end of file From f405d2bba12a5ae29678847fb0873495d9a729ca Mon Sep 17 00:00:00 2001 From: IThundxr Date: Sun, 5 Jan 2025 11:07:48 -0500 Subject: [PATCH 253/515] Invisifluids - Fix gasses not being visible in basins, item drains etc - Fixes Creators-of-Create/Create#7236 --- gradle.properties | 2 +- .../compat/jei/category/animations/AnimatedItemDrain.java | 2 +- .../create/compat/jei/category/animations/AnimatedSpout.java | 4 ++-- .../create/content/fluids/drain/ItemDrainRenderer.java | 4 ++-- .../simibubi/create/content/fluids/spout/SpoutRenderer.java | 4 ++-- .../create/content/fluids/tank/FluidTankRenderer.java | 2 +- .../create/content/processing/basin/BasinRenderer.java | 2 +- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/gradle.properties b/gradle.properties index 0544449d67..5e26345ffe 100644 --- a/gradle.properties +++ b/gradle.properties @@ -28,7 +28,7 @@ jei_minecraft_version = 1.20.1 jei_version = 15.10.0.39 curios_minecraft_version = 1.20.1 curios_version = 5.3.1 -catnip_version = 0.8.38 +catnip_version = 0.8.41 ponder_version = 0.8.12 mixin_extras_version = 0.4.1 diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedItemDrain.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedItemDrain.java index 1b3293bda0..7d6397dd22 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedItemDrain.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedItemDrain.java @@ -40,7 +40,7 @@ public class AnimatedItemDrain extends AnimatedKinetics { matrixStack.scale(scale, scale, scale); float from = 2/16f; float to = 1f - from; - FluidRenderer.renderFluidBox(fluid.getFluid(), fluid.getAmount(), from, from, from, to, 3/4f, to, buffer, matrixStack, LightTexture.FULL_BRIGHT, false); + FluidRenderer.renderFluidBox(fluid.getFluid(), fluid.getAmount(), from, from, from, to, 3/4f, to, buffer, matrixStack, LightTexture.FULL_BRIGHT, false, true); buffer.endBatch(); matrixStack.popPose(); diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSpout.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSpout.java index 4a0f8d371b..d1e7e9833c 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSpout.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSpout.java @@ -75,7 +75,7 @@ public class AnimatedSpout extends AnimatedKinetics { float from = 3f / 16f; float to = 17f / 16f; FluidStack fluidStack = fluids.get(0); - FluidRenderer.renderFluidBox(fluidStack.getFluid(), fluidStack.getAmount(), from, from, from, to, to, to, buffer, matrixStack, LightTexture.FULL_BRIGHT, false); + FluidRenderer.renderFluidBox(fluidStack.getFluid(), fluidStack.getAmount(), from, from, from, to, to, to, buffer, matrixStack, LightTexture.FULL_BRIGHT, false, true); matrixStack.popPose(); float width = 1 / 128f * squeeze; @@ -85,7 +85,7 @@ public class AnimatedSpout extends AnimatedKinetics { matrixStack.translate(-0.5f, 0, -0.5f); from = -width / 2 + 0.5f; to = width / 2 + 0.5f; - FluidRenderer.renderFluidBox(fluidStack.getFluid(), fluidStack.getAmount(), from, 0, from, to, 2, to, buffer, matrixStack, LightTexture.FULL_BRIGHT, false); + FluidRenderer.renderFluidBox(fluidStack.getFluid(), fluidStack.getAmount(), from, 0, from, to, 2, to, buffer, matrixStack, LightTexture.FULL_BRIGHT, false, true); buffer.endBatch(); Lighting.setupFor3DItems(); diff --git a/src/main/java/com/simibubi/create/content/fluids/drain/ItemDrainRenderer.java b/src/main/java/com/simibubi/create/content/fluids/drain/ItemDrainRenderer.java index 501e18c77c..0a19b95d70 100644 --- a/src/main/java/com/simibubi/create/content/fluids/drain/ItemDrainRenderer.java +++ b/src/main/java/com/simibubi/create/content/fluids/drain/ItemDrainRenderer.java @@ -150,7 +150,7 @@ public class ItemDrainRenderer extends SmartBlockEntityRenderer { FluidRenderer.renderFluidBox(fluidStack.getFluid(), fluidStack.getAmount(), min, min - yOffset, min, max, min, max, - buffer, ms, light, false); + buffer, ms, light, false, true); ms.popPose(); } @@ -69,7 +69,7 @@ public class SpoutRenderer extends SafeBlockEntityRenderer { radius = (float) (Math.pow(((2 * processingProgress) - 1), 2) - 1); AABB bb = new AABB(0.5, .5, 0.5, 0.5, -1.2, 0.5).inflate(radius / 32f); FluidRenderer.renderFluidBox(fluidStack.getFluid(), fluidStack.getAmount(), (float) bb.minX, (float) bb.minY, (float) bb.minZ, - (float) bb.maxX, (float) bb.maxY, (float) bb.maxZ, buffer, ms, light, true); + (float) bb.maxX, (float) bb.maxY, (float) bb.maxZ, buffer, ms, light, true, true); } float squeeze = radius; diff --git a/src/main/java/com/simibubi/create/content/fluids/tank/FluidTankRenderer.java b/src/main/java/com/simibubi/create/content/fluids/tank/FluidTankRenderer.java index 27c1701a69..002e99dbb9 100644 --- a/src/main/java/com/simibubi/create/content/fluids/tank/FluidTankRenderer.java +++ b/src/main/java/com/simibubi/create/content/fluids/tank/FluidTankRenderer.java @@ -74,7 +74,7 @@ public class FluidTankRenderer extends SafeBlockEntityRenderer { float partial = Mth.clamp(units / totalUnits, 0, 1); xMax += partial * 12 / 16f; FluidRenderer.renderFluidBox(renderedFluid.getFluid(), renderedFluid.getAmount(), xMin, yMin, zMin, xMax, yMax, zMax, buffer, ms, light, - false); + false, false); xMin = xMax; } From 72d3fa6991a711e4e734223bf697ce139796437f Mon Sep 17 00:00:00 2001 From: IThundxr Date: Thu, 21 Nov 2024 11:23:38 -0500 Subject: [PATCH 254/515] Arm interaction point and fan processing type registries - Refactor registration for arm interaction points and fan processing types, they use proper registries now --- .../com/simibubi/create/AllRegistries.java | 18 ++- src/main/java/com/simibubi/create/Create.java | 7 +- .../content/kinetics/fan/AirCurrent.java | 10 +- .../content/kinetics/fan/AirFlowParticle.java | 4 +- .../fan/processing/AllFanProcessingTypes.java | 44 ++++--- .../fan/processing/FanProcessing.java | 8 +- .../fan/processing/FanProcessingType.java | 10 +- .../processing/FanProcessingTypeRegistry.java | 68 ++-------- .../AllArmInteractionPointTypes.java | 118 +++++------------- .../mechanicalArm/ArmInteractionPoint.java | 9 +- .../ArmInteractionPointType.java | 55 ++++---- .../attribute/AllItemAttributeTypes.java | 4 +- 12 files changed, 140 insertions(+), 215 deletions(-) diff --git a/src/main/java/com/simibubi/create/AllRegistries.java b/src/main/java/com/simibubi/create/AllRegistries.java index 27bb929c47..4b7d62b443 100644 --- a/src/main/java/com/simibubi/create/AllRegistries.java +++ b/src/main/java/com/simibubi/create/AllRegistries.java @@ -1,5 +1,7 @@ package com.simibubi.create; +import com.simibubi.create.content.kinetics.fan.processing.FanProcessingType; +import com.simibubi.create.content.kinetics.mechanicalArm.ArmInteractionPointType; import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttributeType; import net.minecraft.core.Registry; @@ -14,9 +16,13 @@ import java.util.function.Supplier; @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) public class AllRegistries { + public static Supplier> ARM_INTERACTION_POINT_TYPES; + public static Supplier> FAN_PROCESSING_TYPES; public static Supplier> ITEM_ATTRIBUTE_TYPES; public static final class Keys { + public static final ResourceKey> ARM_INTERACTION_POINT_TYPES = key("arm_interaction_point_types"); + public static final ResourceKey> FAN_PROCESSING_TYPES = key("fan_processing_types"); public static final ResourceKey> ITEM_ATTRIBUTE_TYPES = key("item_attribute_types"); private static ResourceKey> key(String name) { @@ -26,8 +32,16 @@ public class AllRegistries { @SubscribeEvent public static void registerRegistries(NewRegistryEvent event) { - ITEM_ATTRIBUTE_TYPES = event.create(new RegistryBuilder() - .setName(Keys.ITEM_ATTRIBUTE_TYPES.location()) + ARM_INTERACTION_POINT_TYPES = event.create(new RegistryBuilder() + .setName(Keys.ARM_INTERACTION_POINT_TYPES.location()) .disableSaving()); + + FAN_PROCESSING_TYPES = event.create(new RegistryBuilder() + .setName(Keys.FAN_PROCESSING_TYPES.location()) + .disableSaving()); + + ITEM_ATTRIBUTE_TYPES = event.create(new RegistryBuilder() + .setName(Keys.ITEM_ATTRIBUTE_TYPES.location()) + .disableSaving()); } } diff --git a/src/main/java/com/simibubi/create/Create.java b/src/main/java/com/simibubi/create/Create.java index 8749046103..129709054d 100644 --- a/src/main/java/com/simibubi/create/Create.java +++ b/src/main/java/com/simibubi/create/Create.java @@ -2,8 +2,6 @@ package com.simibubi.create; import java.util.Random; -import com.simibubi.create.content.logistics.item.filter.attribute.AllItemAttributeTypes; - import org.slf4j.Logger; import com.google.gson.Gson; @@ -20,6 +18,7 @@ import com.simibubi.create.content.fluids.tank.BoilerHeaters; import com.simibubi.create.content.kinetics.TorquePropagator; import com.simibubi.create.content.kinetics.fan.processing.AllFanProcessingTypes; import com.simibubi.create.content.kinetics.mechanicalArm.AllArmInteractionPointTypes; +import com.simibubi.create.content.logistics.item.filter.attribute.AllItemAttributeTypes; import com.simibubi.create.content.logistics.packagerLink.GlobalLogisticsManager; import com.simibubi.create.content.redstone.displayLink.AllDisplayBehaviours; import com.simibubi.create.content.redstone.link.RedstoneLinkNetworkHandler; @@ -133,6 +132,8 @@ public class Create { AllConfigs.register(modLoadingContext); AllItemAttributeTypes.register(modEventBus); + AllArmInteractionPointTypes.register(modEventBus); + AllFanProcessingTypes.register(modEventBus); BlockSpoutingBehaviour.registerDefaults(); // FIXME: some of these registrations are not thread-safe @@ -141,8 +142,6 @@ public class Create { AllPortalTracks.registerDefaults(); AllDisplayBehaviours.registerDefaults(); ContraptionMovementSetting.registerDefaults(); - AllArmInteractionPointTypes.register(); - AllFanProcessingTypes.register(); BogeySizes.init(); AllBogeyStyles.init(); // ---- diff --git a/src/main/java/com/simibubi/create/content/kinetics/fan/AirCurrent.java b/src/main/java/com/simibubi/create/content/kinetics/fan/AirCurrent.java index c9d3750475..63748e7fa7 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/fan/AirCurrent.java +++ b/src/main/java/com/simibubi/create/content/kinetics/fan/AirCurrent.java @@ -107,7 +107,7 @@ public class AirCurrent { FanProcessingType processingType = getTypeAt((float) entityDistance); - if (processingType == AllFanProcessingTypes.NONE) + if (processingType == AllFanProcessingTypes.NONE.get()) continue; if (entity instanceof ItemEntity itemEntity) { @@ -176,7 +176,7 @@ public class AirCurrent { // Determine segments with transported fluids/gases segments.clear(); AirCurrentSegment currentSegment = null; - FanProcessingType type = AllFanProcessingTypes.NONE; + FanProcessingType type = AllFanProcessingTypes.NONE.get(); int limit = getLimit(); int searchStart = pushing ? 1 : limit; @@ -187,7 +187,7 @@ public class AirCurrent { for (int i = searchStart; i * searchStep <= searchEnd * searchStep; i += searchStep) { BlockPos currentPos = start.relative(direction, i); FanProcessingType newType = FanProcessingType.getAt(world, currentPos); - if (newType != AllFanProcessingTypes.NONE) { + if (newType != AllFanProcessingTypes.NONE.get()) { type = newType; } if (currentSegment == null) { @@ -320,7 +320,7 @@ public class AirCurrent { BlockEntityBehaviour.get(world, pos, TransportedItemStackHandlerBehaviour.TYPE); if (behaviour != null) { FanProcessingType type = FanProcessingType.getAt(world, pos); - if (type == AllFanProcessingTypes.NONE) + if (type == AllFanProcessingTypes.NONE.get()) type = segmentType; affectedItemHandlers.add(Pair.of(behaviour, type)); } @@ -353,7 +353,7 @@ public class AirCurrent { } } } - return AllFanProcessingTypes.NONE; + return AllFanProcessingTypes.NONE.get(); } private static class AirCurrentSegment { diff --git a/src/main/java/com/simibubi/create/content/kinetics/fan/AirFlowParticle.java b/src/main/java/com/simibubi/create/content/kinetics/fan/AirFlowParticle.java index b84938551c..3c2d7cbb60 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/fan/AirFlowParticle.java +++ b/src/main/java/com/simibubi/create/content/kinetics/fan/AirFlowParticle.java @@ -78,7 +78,7 @@ public class AirFlowParticle extends SimpleAnimatedParticle { motion = motion.scale(airCurrent.maxDistance - (distance - 1f)).scale(.5f); FanProcessingType type = getType(distance); - if (type == AllFanProcessingTypes.NONE) { + if (type == AllFanProcessingTypes.NONE.get()) { setColor(0xEEEEEE); setAlpha(.25f); selectSprite((int) Mth.clamp((distance / airCurrent.maxDistance) * 8 + random.nextInt(4), @@ -102,7 +102,7 @@ public class AirFlowParticle extends SimpleAnimatedParticle { private FanProcessingType getType(double distance) { if (source.getAirCurrent() == null) - return AllFanProcessingTypes.NONE; + return AllFanProcessingTypes.NONE.get(); return source.getAirCurrent().getTypeAt((float) distance); } diff --git a/src/main/java/com/simibubi/create/content/kinetics/fan/processing/AllFanProcessingTypes.java b/src/main/java/com/simibubi/create/content/kinetics/fan/processing/AllFanProcessingTypes.java index 69ae8161c0..014e6f2e35 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/fan/processing/AllFanProcessingTypes.java +++ b/src/main/java/com/simibubi/create/content/kinetics/fan/processing/AllFanProcessingTypes.java @@ -4,6 +4,16 @@ import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.function.Function; +import java.util.function.Supplier; + +import com.simibubi.create.AllRegistries; +import com.simibubi.create.content.kinetics.mechanicalArm.ArmInteractionPointType; + +import net.minecraft.resources.ResourceLocation; + +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.registries.DeferredRegister; import org.jetbrains.annotations.Nullable; import org.joml.Vector3f; @@ -56,16 +66,18 @@ import net.minecraftforge.items.ItemStackHandler; import net.minecraftforge.items.wrapper.RecipeWrapper; public class AllFanProcessingTypes { - public static final NoneType NONE = register("none", new NoneType()); - public static final BlastingType BLASTING = register("blasting", new BlastingType()); - public static final HauntingType HAUNTING = register("haunting", new HauntingType()); - public static final SmokingType SMOKING = register("smoking", new SmokingType()); - public static final SplashingType SPLASHING = register("splashing", new SplashingType()); + private static final DeferredRegister REGISTER = DeferredRegister.create(AllRegistries.Keys.FAN_PROCESSING_TYPES, Create.ID); - private static final Map LEGACY_NAME_MAP; + public static final Supplier NONE = register("none", new NoneType()); + public static final Supplier BLASTING = register("blasting", new BlastingType()); + public static final Supplier HAUNTING = register("haunting", new HauntingType()); + public static final Supplier SMOKING = register("smoking", new SmokingType()); + public static final Supplier SPLASHING = register("splashing", new SplashingType()); + + private static final Map> LEGACY_NAME_MAP; static { - Object2ReferenceOpenHashMap map = new Object2ReferenceOpenHashMap<>(); + Object2ReferenceOpenHashMap> map = new Object2ReferenceOpenHashMap<>(); map.put("NONE", NONE); map.put("BLASTING", BLASTING); map.put("HAUNTING", HAUNTING); @@ -75,17 +87,17 @@ public class AllFanProcessingTypes { LEGACY_NAME_MAP = map; } - private static T register(String id, T type) { - FanProcessingTypeRegistry.register(Create.asResource(id), type); - return type; + private static Supplier register(String name, T type) { + return REGISTER.register(name, () -> type); + } + + public static void register(IEventBus eventBus) { + REGISTER.register(eventBus); } @Nullable public static FanProcessingType ofLegacyName(String name) { - return LEGACY_NAME_MAP.get(name); - } - - public static void register() { + return LEGACY_NAME_MAP.get(name).get(); } public static FanProcessingType parseLegacy(String str) { @@ -189,7 +201,7 @@ public class AllFanProcessingTypes { Optional smeltingRecipe = level.getRecipeManager() .getRecipeFor(RecipeType.SMELTING, RECIPE_WRAPPER, level) .filter(AllRecipeTypes.CAN_BE_AUTOMATED); - + if (!smeltingRecipe.isPresent()) { RECIPE_WRAPPER.setItem(0, stack); smeltingRecipe = level.getRecipeManager() @@ -394,7 +406,7 @@ public class AllFanProcessingTypes { Optional recipe = level.getRecipeManager() .getRecipeFor(RecipeType.SMOKING, RECIPE_WRAPPER, level) .filter(AllRecipeTypes.CAN_BE_AUTOMATED); - + return recipe.isPresent(); } diff --git a/src/main/java/com/simibubi/create/content/kinetics/fan/processing/FanProcessing.java b/src/main/java/com/simibubi/create/content/kinetics/fan/processing/FanProcessing.java index 853ae9f64d..3933e004d0 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/fan/processing/FanProcessing.java +++ b/src/main/java/com/simibubi/create/content/kinetics/fan/processing/FanProcessing.java @@ -3,11 +3,13 @@ package com.simibubi.create.content.kinetics.fan.processing; import java.util.ArrayList; import java.util.List; +import com.simibubi.create.AllRegistries; import com.simibubi.create.content.kinetics.belt.behaviour.TransportedItemStackHandlerBehaviour.TransportedResult; import com.simibubi.create.content.kinetics.belt.transport.TransportedItemStack; import com.simibubi.create.infrastructure.config.AllConfigs; import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; @@ -93,7 +95,11 @@ public class FanProcessing { CompoundTag processing = createData.getCompound("Processing"); if (!processing.contains("Type") || AllFanProcessingTypes.parseLegacy(processing.getString("Type")) != type) { - processing.putString("Type", FanProcessingTypeRegistry.getIdOrThrow(type).toString()); + ResourceLocation key = AllRegistries.FAN_PROCESSING_TYPES.get().getKey(type); + if (key == null) + throw new IllegalArgumentException("Could not get id for FanProcessingType " + type + "!"); + + processing.putString("Type", key.toString()); int timeModifierForStackSize = ((entity.getItem() .getCount() - 1) / 16) + 1; int processingTime = diff --git a/src/main/java/com/simibubi/create/content/kinetics/fan/processing/FanProcessingType.java b/src/main/java/com/simibubi/create/content/kinetics/fan/processing/FanProcessingType.java index e0a47d4c56..5885435dc0 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/fan/processing/FanProcessingType.java +++ b/src/main/java/com/simibubi/create/content/kinetics/fan/processing/FanProcessingType.java @@ -2,6 +2,8 @@ package com.simibubi.create.content.kinetics.fan.processing; import java.util.List; +import com.simibubi.create.AllRegistries; + import org.jetbrains.annotations.Nullable; import net.minecraft.core.BlockPos; @@ -32,11 +34,11 @@ public interface FanProcessingType { static FanProcessingType parse(String str) { ResourceLocation id = ResourceLocation.tryParse(str); if (id == null) { - return AllFanProcessingTypes.NONE; + return AllFanProcessingTypes.NONE.get(); } - FanProcessingType type = FanProcessingTypeRegistry.getType(id); + FanProcessingType type = AllRegistries.FAN_PROCESSING_TYPES.get().getValue(id); if (type == null) { - return AllFanProcessingTypes.NONE; + return AllFanProcessingTypes.NONE.get(); } return type; } @@ -47,7 +49,7 @@ public interface FanProcessingType { return type; } } - return AllFanProcessingTypes.NONE; + return AllFanProcessingTypes.NONE.get(); } interface AirFlowParticleAccess { diff --git a/src/main/java/com/simibubi/create/content/kinetics/fan/processing/FanProcessingTypeRegistry.java b/src/main/java/com/simibubi/create/content/kinetics/fan/processing/FanProcessingTypeRegistry.java index 0e177a012a..284fb08ed5 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/fan/processing/FanProcessingTypeRegistry.java +++ b/src/main/java/com/simibubi/create/content/kinetics/fan/processing/FanProcessingTypeRegistry.java @@ -2,67 +2,25 @@ package com.simibubi.create.content.kinetics.fan.processing; import java.util.Collections; import java.util.List; -import java.util.Map; -import org.jetbrains.annotations.Nullable; +import com.simibubi.create.AllRegistries; -import it.unimi.dsi.fastutil.objects.Object2ReferenceOpenHashMap; -import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap; import it.unimi.dsi.fastutil.objects.ReferenceArrayList; -import net.minecraft.resources.ResourceLocation; public class FanProcessingTypeRegistry { - private static final Map TYPES = new Object2ReferenceOpenHashMap<>(); - private static final Map IDS = new Reference2ObjectOpenHashMap<>(); - private static final List SORTED_TYPES = new ReferenceArrayList<>(); - private static final List SORTED_TYPES_VIEW = Collections.unmodifiableList(SORTED_TYPES); - - public static void register(ResourceLocation id, FanProcessingType type) { - if (TYPES.put(id, type) != null) { - throw new IllegalArgumentException("Tried to override FanProcessingType registration for id '" + id + "'. This is not supported!"); - } - ResourceLocation prevId = IDS.put(type, id); - if (prevId != null) { - throw new IllegalArgumentException("Tried to register same FanProcessingType instance for multiple ids '" + prevId + "' and '" + id + "'. This is not supported!"); - } - insertSortedType(type, id); - } - - private static void insertSortedType(FanProcessingType type, ResourceLocation id) { - int index = Collections.binarySearch(SORTED_TYPES, type, (type1, type2) -> type2.getPriority() - type1.getPriority()); - if (index >= 0) { - throw new IllegalStateException(); - } - SORTED_TYPES.add(-index - 1, type); - } - - @Nullable - public static FanProcessingType getType(ResourceLocation id) { - return TYPES.get(id); - } - - public static FanProcessingType getTypeOrThrow(ResourceLocation id) { - FanProcessingType type = getType(id); - if (type == null) { - throw new IllegalArgumentException("Could not get FanProcessingType for id '" + id + "'!"); - } - return type; - } - - @Nullable - public static ResourceLocation getId(FanProcessingType type) { - return IDS.get(type); - } - - public static ResourceLocation getIdOrThrow(FanProcessingType type) { - ResourceLocation id = getId(type); - if (id == null) { - throw new IllegalArgumentException("Could not get id for FanProcessingType " + type + "!"); - } - return id; - } + private static List sortedTypes = null; + private static List sortedTypesView = null; public static List getSortedTypesView() { - return SORTED_TYPES_VIEW; + if (sortedTypes == null) { + sortedTypes = new ReferenceArrayList<>(); + + sortedTypes.addAll(AllRegistries.FAN_PROCESSING_TYPES.get().getValues()); + sortedTypes.sort((t1, t2) -> t2.getPriority() - t1.getPriority()); + + sortedTypesView = Collections.unmodifiableList(sortedTypes); + } + + return sortedTypesView; } } diff --git a/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/AllArmInteractionPointTypes.java b/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/AllArmInteractionPointTypes.java index 88af365e56..b258d7d062 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/AllArmInteractionPointTypes.java +++ b/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/AllArmInteractionPointTypes.java @@ -1,10 +1,15 @@ package com.simibubi.create.content.kinetics.mechanicalArm; import java.util.Optional; -import java.util.function.Function; +import java.util.function.Supplier; import javax.annotation.Nullable; +import com.simibubi.create.AllRegistries; + +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.registries.DeferredRegister; + import org.apache.commons.lang3.mutable.MutableBoolean; import com.simibubi.create.AllBlocks; @@ -63,40 +68,37 @@ import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.wrapper.SidedInvWrapper; public class AllArmInteractionPointTypes { + private static final DeferredRegister REGISTER = DeferredRegister.create(AllRegistries.Keys.ARM_INTERACTION_POINT_TYPES, Create.ID); - public static final BasinType BASIN = register("basin", BasinType::new); - public static final BeltType BELT = register("belt", BeltType::new); - public static final BlazeBurnerType BLAZE_BURNER = register("blaze_burner", BlazeBurnerType::new); - public static final ChuteType CHUTE = register("chute", ChuteType::new); - public static final CrafterType CRAFTER = register("crafter", CrafterType::new); - public static final CrushingWheelsType CRUSHING_WHEELS = register("crushing_wheels", CrushingWheelsType::new); - public static final DeployerType DEPLOYER = register("deployer", DeployerType::new); - public static final DepotType DEPOT = register("depot", DepotType::new); - public static final FunnelType FUNNEL = register("funnel", FunnelType::new); - public static final MillstoneType MILLSTONE = register("millstone", MillstoneType::new); - public static final PackagerType PACKAGER = register("packager", PackagerType::new); - public static final SawType SAW = register("saw", SawType::new); + public static final Supplier BASIN = register("basin", new BasinType()); + public static final Supplier BELT = register("belt", new BeltType()); + public static final Supplier BLAZE_BURNER = register("blaze_burner", new BlazeBurnerType()); + public static final Supplier CHUTE = register("chute", new ChuteType()); + public static final Supplier CRAFTER = register("crafter", new CrafterType()); + public static final Supplier CRUSHING_WHEELS = register("crushing_wheels", new CrushingWheelsType()); + public static final Supplier DEPLOYER = register("deployer", new DeployerType()); + public static final Supplier DEPOT = register("depot", new DepotType()); + public static final Supplier FUNNEL = register("funnel", new FunnelType()); + public static final Supplier MILLSTONE = register("millstone", new MillstoneType()); + public static final Supplier PACKAGER = register("packager", new PackagerType()); + public static final Supplier SAW = register("saw", new SawType()); - public static final CampfireType CAMPFIRE = register("campfire", CampfireType::new); - public static final ComposterType COMPOSTER = register("composter", ComposterType::new); - public static final JukeboxType JUKEBOX = register("jukebox", JukeboxType::new); - public static final RespawnAnchorType RESPAWN_ANCHOR = register("respawn_anchor", RespawnAnchorType::new); + public static final Supplier CAMPFIRE = register("campfire", new CampfireType()); + public static final Supplier COMPOSTER = register("composter", new ComposterType()); + public static final Supplier JUKEBOX = register("jukebox", new JukeboxType()); + public static final Supplier RESPAWN_ANCHOR = register("respawn_anchor", new RespawnAnchorType()); - private static T register(String id, Function factory) { - T type = factory.apply(Create.asResource(id)); - ArmInteractionPointType.register(type); - return type; + private static Supplier register(String name, T type) { + return REGISTER.register(name, () -> type); } - public static void register() {} + public static void register(IEventBus eventBus) { + REGISTER.register(eventBus); + } // public static class BasinType extends ArmInteractionPointType { - public BasinType(ResourceLocation id) { - super(id); - } - @Override public boolean canCreatePoint(Level level, BlockPos pos, BlockState state) { return BasinBlock.isBasin(level, pos); @@ -109,10 +111,6 @@ public class AllArmInteractionPointTypes { } public static class BeltType extends ArmInteractionPointType { - public BeltType(ResourceLocation id) { - super(id); - } - @Override public boolean canCreatePoint(Level level, BlockPos pos, BlockState state) { return AllBlocks.BELT.has(state) && !(level.getBlockState(pos.above()) @@ -126,10 +124,6 @@ public class AllArmInteractionPointTypes { } public static class BlazeBurnerType extends ArmInteractionPointType { - public BlazeBurnerType(ResourceLocation id) { - super(id); - } - @Override public boolean canCreatePoint(Level level, BlockPos pos, BlockState state) { return AllBlocks.BLAZE_BURNER.has(state); @@ -142,10 +136,6 @@ public class AllArmInteractionPointTypes { } public static class ChuteType extends ArmInteractionPointType { - public ChuteType(ResourceLocation id) { - super(id); - } - @Override public boolean canCreatePoint(Level level, BlockPos pos, BlockState state) { return AbstractChuteBlock.isChute(state); @@ -158,10 +148,6 @@ public class AllArmInteractionPointTypes { } public static class CrafterType extends ArmInteractionPointType { - public CrafterType(ResourceLocation id) { - super(id); - } - @Override public boolean canCreatePoint(Level level, BlockPos pos, BlockState state) { return AllBlocks.MECHANICAL_CRAFTER.has(state); @@ -174,10 +160,6 @@ public class AllArmInteractionPointTypes { } public static class CrushingWheelsType extends ArmInteractionPointType { - public CrushingWheelsType(ResourceLocation id) { - super(id); - } - @Override public boolean canCreatePoint(Level level, BlockPos pos, BlockState state) { return AllBlocks.CRUSHING_WHEEL_CONTROLLER.has(state); @@ -190,10 +172,6 @@ public class AllArmInteractionPointTypes { } public static class DeployerType extends ArmInteractionPointType { - public DeployerType(ResourceLocation id) { - super(id); - } - @Override public boolean canCreatePoint(Level level, BlockPos pos, BlockState state) { return AllBlocks.DEPLOYER.has(state); @@ -206,10 +184,6 @@ public class AllArmInteractionPointTypes { } public static class DepotType extends ArmInteractionPointType { - public DepotType(ResourceLocation id) { - super(id); - } - @Override public boolean canCreatePoint(Level level, BlockPos pos, BlockState state) { return AllBlocks.DEPOT.has(state) || AllBlocks.WEIGHTED_EJECTOR.has(state) @@ -223,10 +197,6 @@ public class AllArmInteractionPointTypes { } public static class FunnelType extends ArmInteractionPointType { - public FunnelType(ResourceLocation id) { - super(id); - } - @Override public boolean canCreatePoint(Level level, BlockPos pos, BlockState state) { return state.getBlock() instanceof AbstractFunnelBlock @@ -242,10 +212,6 @@ public class AllArmInteractionPointTypes { } public static class MillstoneType extends ArmInteractionPointType { - public MillstoneType(ResourceLocation id) { - super(id); - } - @Override public boolean canCreatePoint(Level level, BlockPos pos, BlockState state) { return AllBlocks.MILLSTONE.has(state); @@ -256,17 +222,13 @@ public class AllArmInteractionPointTypes { return new ArmInteractionPoint(this, level, pos, state); } } - + public static class PackagerType extends ArmInteractionPointType { - public PackagerType(ResourceLocation id) { - super(id); - } - @Override public boolean canCreatePoint(Level level, BlockPos pos, BlockState state) { return AllBlocks.PACKAGER.has(state) || AllBlocks.REPACKAGER.has(state); } - + @Override public ArmInteractionPoint createPoint(Level level, BlockPos pos, BlockState state) { return new ArmInteractionPoint(this, level, pos, state); @@ -274,10 +236,6 @@ public class AllArmInteractionPointTypes { } public static class SawType extends ArmInteractionPointType { - public SawType(ResourceLocation id) { - super(id); - } - @Override public boolean canCreatePoint(Level level, BlockPos pos, BlockState state) { return AllBlocks.MECHANICAL_SAW.has(state) && state.getValue(SawBlock.FACING) == Direction.UP @@ -291,10 +249,6 @@ public class AllArmInteractionPointTypes { } public static class CampfireType extends ArmInteractionPointType { - public CampfireType(ResourceLocation id) { - super(id); - } - @Override public boolean canCreatePoint(Level level, BlockPos pos, BlockState state) { return state.getBlock() instanceof CampfireBlock; @@ -307,10 +261,6 @@ public class AllArmInteractionPointTypes { } public static class ComposterType extends ArmInteractionPointType { - public ComposterType(ResourceLocation id) { - super(id); - } - @Override public boolean canCreatePoint(Level level, BlockPos pos, BlockState state) { return state.is(Blocks.COMPOSTER); @@ -323,10 +273,6 @@ public class AllArmInteractionPointTypes { } public static class JukeboxType extends ArmInteractionPointType { - public JukeboxType(ResourceLocation id) { - super(id); - } - @Override public boolean canCreatePoint(Level level, BlockPos pos, BlockState state) { return state.is(Blocks.JUKEBOX); @@ -339,10 +285,6 @@ public class AllArmInteractionPointTypes { } public static class RespawnAnchorType extends ArmInteractionPointType { - public RespawnAnchorType(ResourceLocation id) { - super(id); - } - @Override public boolean canCreatePoint(Level level, BlockPos pos, BlockState state) { return state.is(Blocks.RESPAWN_ANCHOR); diff --git a/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmInteractionPoint.java b/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmInteractionPoint.java index 83e682d6ea..cba2fedd4e 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmInteractionPoint.java +++ b/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmInteractionPoint.java @@ -2,6 +2,7 @@ package com.simibubi.create.content.kinetics.mechanicalArm; import javax.annotation.Nullable; +import com.simibubi.create.AllRegistries; import com.simibubi.create.content.contraptions.StructureTransform; import net.createmod.catnip.utility.NBTHelper; @@ -135,8 +136,12 @@ public class ArmInteractionPoint { } public final CompoundTag serialize(BlockPos anchor) { + ResourceLocation key = AllRegistries.ARM_INTERACTION_POINT_TYPES.get().getKey(type); + if (key == null) + throw new IllegalArgumentException("Could not get id for ArmInteractionPointType " + type + "!"); + CompoundTag nbt = new CompoundTag(); - nbt.putString("Type", type.getId().toString()); + nbt.putString("Type", key.toString()); nbt.put("Pos", NbtUtils.writeBlockPos(pos.subtract(anchor))); serialize(nbt, anchor); return nbt; @@ -147,7 +152,7 @@ public class ArmInteractionPoint { ResourceLocation id = ResourceLocation.tryParse(nbt.getString("Type")); if (id == null) return null; - ArmInteractionPointType type = ArmInteractionPointType.get(id); + ArmInteractionPointType type = AllRegistries.ARM_INTERACTION_POINT_TYPES.get().getValue(id); if (type == null) return null; BlockPos pos = NbtUtils.readBlockPos(nbt.getCompound("Pos")).offset(anchor); diff --git a/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmInteractionPointType.java b/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmInteractionPointType.java index 6e345f4c4c..858eb62c56 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmInteractionPointType.java +++ b/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmInteractionPointType.java @@ -1,59 +1,47 @@ package com.simibubi.create.content.kinetics.mechanicalArm; -import java.util.ArrayList; -import java.util.HashMap; +import java.util.Collections; import java.util.List; -import java.util.Map; import java.util.function.Consumer; import javax.annotation.Nullable; +import com.simibubi.create.AllRegistries; + +import it.unimi.dsi.fastutil.objects.ReferenceArrayList; import net.minecraft.core.BlockPos; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; public abstract class ArmInteractionPointType { - - private static final Map TYPES = new HashMap<>(); - private static final List SORTED_TYPES = new ArrayList<>(); - - protected final ResourceLocation id; - - public ArmInteractionPointType(ResourceLocation id) { - this.id = id; - } - - public static void register(ArmInteractionPointType type) { - ResourceLocation id = type.getId(); - if (TYPES.containsKey(id)) - throw new IllegalArgumentException("Tried to override ArmInteractionPointType registration for id '" + id + "'. This is not supported!"); - TYPES.put(id, type); - SORTED_TYPES.add(type); - SORTED_TYPES.sort((t1, t2) -> t2.getPriority() - t1.getPriority()); - } - - @Nullable - public static ArmInteractionPointType get(ResourceLocation id) { - return TYPES.get(id); - } + private static List sortedTypes = null; + private static List sortedTypesView = null; public static void forEach(Consumer action) { - SORTED_TYPES.forEach(action); + getSorted().forEach(action); + } + + public static List getSorted() { + if (sortedTypes == null) { + sortedTypes = new ReferenceArrayList<>(); + + sortedTypes.addAll(AllRegistries.ARM_INTERACTION_POINT_TYPES.get().getValues()); + sortedTypes.sort((t1, t2) -> t2.getPriority() - t1.getPriority()); + + sortedTypesView = Collections.unmodifiableList(sortedTypes); + } + + return sortedTypesView; } @Nullable public static ArmInteractionPointType getPrimaryType(Level level, BlockPos pos, BlockState state) { - for (ArmInteractionPointType type : SORTED_TYPES) + for (ArmInteractionPointType type : getSorted()) if (type.canCreatePoint(level, pos, state)) return type; return null; } - public final ResourceLocation getId() { - return id; - } - public abstract boolean canCreatePoint(Level level, BlockPos pos, BlockState state); @Nullable @@ -62,5 +50,4 @@ public abstract class ArmInteractionPointType { public int getPriority() { return 0; } - } diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/AllItemAttributeTypes.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/AllItemAttributeTypes.java index aee66d170b..02234d30a9 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/AllItemAttributeTypes.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/AllItemAttributeTypes.java @@ -62,8 +62,8 @@ public class AllItemAttributeTypes { EQUIPABLE = singleton("equipable", s -> LivingEntity.getEquipmentSlotForItem(s) .getType() != EquipmentSlot.Type.HAND), FURNACE_FUEL = singleton("furnace_fuel", AbstractFurnaceBlockEntity::isFuel), - WASHABLE = singleton("washable", AllFanProcessingTypes.SPLASHING::canProcess), - HAUNTABLE = singleton("hauntable", AllFanProcessingTypes.HAUNTING::canProcess), + WASHABLE = singleton("washable", AllFanProcessingTypes.SPLASHING.get()::canProcess), + HAUNTABLE = singleton("hauntable", AllFanProcessingTypes.HAUNTING.get()::canProcess), CRUSHABLE = singleton("crushable", (s, w) -> testRecipe(s, w, AllRecipeTypes.CRUSHING.getType()) || testRecipe(s, w, AllRecipeTypes.MILLING.getType())), SMELTABLE = singleton("smeltable", (s, w) -> testRecipe(s, w, RecipeType.SMELTING)), From 0f3bc10dbde10cc0b0a987fd25b8ddee5dab8de7 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Sun, 5 Jan 2025 13:24:12 -0500 Subject: [PATCH 255/515] chore: remove unused config options --- .../com/simibubi/create/infrastructure/config/CClient.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/java/com/simibubi/create/infrastructure/config/CClient.java b/src/main/java/com/simibubi/create/infrastructure/config/CClient.java index 63b35c8b53..88f804868a 100644 --- a/src/main/java/com/simibubi/create/infrastructure/config/CClient.java +++ b/src/main/java/com/simibubi/create/infrastructure/config/CClient.java @@ -21,8 +21,6 @@ public class CClient extends ConfigBase { public final ConfigFloat filterItemRenderDistance = f(10f, 1, "filterItemRenderDistance", Comments.filterItemRenderDistance); public final ConfigBool rainbowDebug = b(false, "enableRainbowDebug", Comments.rainbowDebug); - public final ConfigInt maxContraptionLightVolume = i(16384, 0, Integer.MAX_VALUE, "maximumContraptionLightVolume", - Comments.maxContraptionLightVolume); // no group public final ConfigInt mainMenuConfigButtonRow = i(2, 0, 4, "mainMenuConfigButtonRow", Comments.mainMenuConfigButtonRow); @@ -74,7 +72,6 @@ public class CClient extends ConfigBase { public final ConfigBool showTrackGraphOnF3 = b(false, "showTrackGraphOnF3", Comments.showTrackGraphOnF3); public final ConfigBool showExtendedTrackGraphOnF3 = b(false, "showExtendedTrackGraphOnF3", Comments.showExtendedTrackGraphOnF3); public final ConfigBool showTrainMapOverlay = b(true, "showTrainMapOverlay", Comments.showTrainMapOverlay); - public final ConfigBool trainMapOverlay = b(true, "showTrainMapOverlay", Comments.showTrainMapOverlay); public final ConfigEnum trainMapColorTheme = e(TrainMapTheme.RED, "trainMapColorTheme", Comments.trainMapColorTheme); @@ -86,7 +83,7 @@ public class CClient extends ConfigBase { public enum PlacementIndicatorSetting { TEXTURE, TRIANGLE, NONE } - + public enum TrainMapTheme { RED, GREY, WHITE } @@ -102,7 +99,6 @@ public class CClient extends ConfigBase { "Maximum Distance to the player at which items in Blocks' filter slots will be displayed" }; static String rainbowDebug = "Show kinetic debug information on blocks while the F3-Menu is open."; - static String maxContraptionLightVolume = "The maximum amount of blocks for which to try and calculate dynamic contraption lighting. Decrease if large contraption cause too much lag"; static String[] mainMenuConfigButtonRow = new String[]{ "Choose the menu row that the Create config button appears on in the main menu", "Set to 0 to disable the button altogether" From 61369923e168ef0e6127cd6cea832e21ccd452f9 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Sun, 5 Jan 2025 19:24:24 +0100 Subject: [PATCH 256/515] Shingle all the ways - Copper roof blocks now have custom CT behaviour on the top faces. Assets pending --- .../java/com/simibubi/create/AllBlocks.java | 7 +- .../com/simibubi/create/AllSpriteShifts.java | 12 +- .../decoration/RoofBlockCTBehaviour.java | 142 ++++++++++++++++++ .../foundation/block/CopperBlockSet.java | 16 +- .../block/connected/AllCTTypes.java | 65 ++++++++ .../copper/copper_shingles_top_connected.png | Bin 0 -> 1807 bytes .../copper/copper_tiles_top_connected.png | Bin 0 -> 1866 bytes .../exposed_copper_shingles_top_connected.png | Bin 0 -> 1949 bytes .../exposed_copper_tiles_top_connected.png | Bin 0 -> 1942 bytes ...oxidized_copper_shingles_top_connected.png | Bin 0 -> 1961 bytes .../oxidized_copper_tiles_top_connected.png | Bin 0 -> 1943 bytes ...eathered_copper_shingles_top_connected.png | Bin 0 -> 1966 bytes .../weathered_copper_tiles_top_connected.png | Bin 0 -> 1948 bytes 13 files changed, 235 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/decoration/RoofBlockCTBehaviour.java create mode 100644 src/main/resources/assets/create/textures/block/copper/copper_shingles_top_connected.png create mode 100644 src/main/resources/assets/create/textures/block/copper/copper_tiles_top_connected.png create mode 100644 src/main/resources/assets/create/textures/block/copper/exposed_copper_shingles_top_connected.png create mode 100644 src/main/resources/assets/create/textures/block/copper/exposed_copper_tiles_top_connected.png create mode 100644 src/main/resources/assets/create/textures/block/copper/oxidized_copper_shingles_top_connected.png create mode 100644 src/main/resources/assets/create/textures/block/copper/oxidized_copper_tiles_top_connected.png create mode 100644 src/main/resources/assets/create/textures/block/copper/weathered_copper_shingles_top_connected.png create mode 100644 src/main/resources/assets/create/textures/block/copper/weathered_copper_tiles_top_connected.png diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index d4babea0ca..2e41a65b1c 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -58,6 +58,7 @@ import com.simibubi.create.content.decoration.CardboardBlock; import com.simibubi.create.content.decoration.CardboardBlockItem; import com.simibubi.create.content.decoration.MetalLadderBlock; import com.simibubi.create.content.decoration.MetalScaffoldingBlock; +import com.simibubi.create.content.decoration.RoofBlockCTBehaviour; import com.simibubi.create.content.decoration.TrainTrapdoorBlock; import com.simibubi.create.content.decoration.TrapdoorCTBehaviour; import com.simibubi.create.content.decoration.bracket.BracketBlock; @@ -2661,13 +2662,15 @@ public class AllBlocks { "copper_roof_top", CopperBlockSet.DEFAULT_VARIANTS, (c, p) -> { p.stonecutting(DataIngredient.tag(AllTags.forgeItemTag("ingots/copper")), RecipeCategory.BUILDING_BLOCKS, c::get, 2); - }); + }, (ws, block) -> connectedTextures(() -> new RoofBlockCTBehaviour(AllSpriteShifts.COPPER_SHINGLES.get(ws))) + .accept(block)); public static final CopperBlockSet COPPER_TILES = new CopperBlockSet(REGISTRATE, "copper_tiles", "copper_roof_top", CopperBlockSet.DEFAULT_VARIANTS, (c, p) -> { p.stonecutting(DataIngredient.tag(AllTags.forgeItemTag("ingots/copper")), RecipeCategory.BUILDING_BLOCKS, c::get, 2); - }); + }, (ws, block) -> connectedTextures(() -> new RoofBlockCTBehaviour(AllSpriteShifts.COPPER_TILES.get(ws))) + .accept(block)); // Load this class diff --git a/src/main/java/com/simibubi/create/AllSpriteShifts.java b/src/main/java/com/simibubi/create/AllSpriteShifts.java index aee39f3afd..30cfc96662 100644 --- a/src/main/java/com/simibubi/create/AllSpriteShifts.java +++ b/src/main/java/com/simibubi/create/AllSpriteShifts.java @@ -13,12 +13,16 @@ import com.simibubi.create.foundation.block.connected.CTType; import net.createmod.catnip.render.SpriteShiftEntry; import net.createmod.catnip.render.SpriteShifter; import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.utility.lang.Lang; import net.minecraft.world.item.DyeColor; +import net.minecraft.world.level.block.WeatheringCopper.WeatherState; import net.minecraft.world.level.block.state.properties.WoodType; public class AllSpriteShifts { private static final Map WOODEN_WINDOWS = new IdentityHashMap<>(); + public static final Map COPPER_SHINGLES = new EnumMap<>(WeatherState.class); + public static final Map COPPER_TILES = new EnumMap<>(WeatherState.class); public static final Map DYED_BELTS = new EnumMap<>(DyeColor.class), DYED_OFFSET_BELTS = new EnumMap<>(DyeColor.class), DYED_DIAGONAL_BELTS = new EnumMap<>(DyeColor.class); @@ -107,6 +111,12 @@ public class AllSpriteShifts { DYED_OFFSET_BELTS.put(color, get("block/belt_offset", "block/belt/" + id + "_scroll")); DYED_DIAGONAL_BELTS.put(color, get("block/belt_diagonal", "block/belt/" + id + "_diagonal_scroll")); } + + for (WeatherState state : WeatherState.values()) { + String pref = "copper/" + (state == WeatherState.UNAFFECTED ? "" : Lang.asId(state.name()) + "_"); + COPPER_SHINGLES.put(state, getCT(AllCTTypes.ROOF, pref + "copper_roof_top", pref + "copper_shingles_top")); + COPPER_TILES.put(state, getCT(AllCTTypes.ROOF, pref + "copper_roof_top", pref + "copper_tiles_top")); + } } private static Couple vault(String name) { @@ -150,5 +160,5 @@ public class AllSpriteShifts { public static CTSpriteShiftEntry getWoodenWindow(WoodType woodType) { return WOODEN_WINDOWS.get(woodType); } - + } diff --git a/src/main/java/com/simibubi/create/content/decoration/RoofBlockCTBehaviour.java b/src/main/java/com/simibubi/create/content/decoration/RoofBlockCTBehaviour.java new file mode 100644 index 0000000000..95bd8c1083 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/decoration/RoofBlockCTBehaviour.java @@ -0,0 +1,142 @@ +package com.simibubi.create.content.decoration; + +import org.jetbrains.annotations.Nullable; + +import com.simibubi.create.foundation.block.connected.AllCTTypes; +import com.simibubi.create.foundation.block.connected.CTSpriteShiftEntry; +import com.simibubi.create.foundation.block.connected.CTType; +import com.simibubi.create.foundation.block.connected.ConnectedTextureBehaviour; + +import net.createmod.catnip.utility.Iterate; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Direction.Axis; +import net.minecraft.util.Mth; +import net.minecraft.world.level.BlockAndTintGetter; +import net.minecraft.world.level.block.SlabBlock; +import net.minecraft.world.level.block.StairBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.Half; +import net.minecraft.world.level.block.state.properties.SlabType; +import net.minecraft.world.level.block.state.properties.StairsShape; + +public class RoofBlockCTBehaviour extends ConnectedTextureBehaviour.Base { + + private CTSpriteShiftEntry shift; + + public RoofBlockCTBehaviour(CTSpriteShiftEntry shift) { + this.shift = shift; + } + + @Override + public @Nullable CTSpriteShiftEntry getShift(BlockState state, Direction direction, + @Nullable TextureAtlasSprite sprite) { + if (direction == Direction.UP) + return shift; + return null; + } + + @Override + public boolean buildContextForOccludedDirections() { + return true; + } + + @Override + public CTContext buildContext(BlockAndTintGetter reader, BlockPos pos, BlockState state, Direction face, + ContextRequirement requirement) { + + if (isUprightStair(state)) + return getStairMapping(state); + + return super.buildContext(reader, pos, state, face, requirement); + } + + @Override + public boolean connectsTo(BlockState state, BlockState other, BlockAndTintGetter reader, BlockPos pos, + BlockPos otherPos, Direction face, Direction primaryOffset, Direction secondaryOffset) { + + if (connects(reader, pos, state, other) + || connectsHigh(reader, pos, state, other, reader.getBlockState(otherPos.above()))) + return true; + if (primaryOffset != null && secondaryOffset != null) + return false; + + for (boolean p : Iterate.trueAndFalse) { + Direction offset = p ? primaryOffset : secondaryOffset; + if (offset == null) + continue; + if (offset.getAxis() + .isVertical()) + continue; + + if (connectsHigh(reader, pos, state, reader.getBlockState(pos.relative(offset.getClockWise())), + reader.getBlockState(pos.relative(offset.getClockWise()) + .above())) + || connectsHigh(reader, pos, state, reader.getBlockState(pos.relative(offset.getCounterClockWise())), + reader.getBlockState(pos.relative(offset.getCounterClockWise()) + .above()))) + return true; + } + + return false; + } + + public boolean isUprightStair(BlockState state) { + return state.hasProperty(StairBlock.SHAPE) && state.getOptionalValue(StairBlock.HALF) + .orElse(Half.TOP) == Half.BOTTOM; + } + + public CTContext getStairMapping(BlockState state) { + CTContext context = new CTContext(); + StairsShape shape = state.getValue(StairBlock.SHAPE); + Direction facing = state.getValue(StairBlock.FACING); + + if (shape == StairsShape.OUTER_LEFT) + facing = facing.getCounterClockWise(); + if (shape == StairsShape.INNER_LEFT) + facing = facing.getCounterClockWise(); + + int type = shape == StairsShape.STRAIGHT ? 0 + : (shape == StairsShape.INNER_LEFT || shape == StairsShape.INNER_RIGHT) ? 1 : 2; + int rot = facing.get2DDataValue(); + context.up = type >= 2; + context.right = type % 2 == 1; + context.left = rot >= 2; + context.down = rot % 2 == 1; + return context; + } + + protected boolean connects(BlockAndTintGetter reader, BlockPos pos, BlockState state, BlockState other) { + double top = state.getCollisionShape(reader, pos) + .max(Axis.Y); + double topOther = other.getCollisionShape(reader, pos) + .max(Axis.Y); + return Mth.equal(top, topOther); + } + + protected boolean connectsHigh(BlockAndTintGetter reader, BlockPos pos, BlockState state, BlockState other, + BlockState aboveOther) { + if (state.getBlock() instanceof SlabBlock && other.getBlock() instanceof SlabBlock) + if (state.getValue(SlabBlock.TYPE) == SlabType.BOTTOM && other.getValue(SlabBlock.TYPE) != SlabType.BOTTOM) + return true; + + if (state.getBlock() instanceof SlabBlock && state.getValue(SlabBlock.TYPE) == SlabType.BOTTOM) { + double top = state.getCollisionShape(reader, pos) + .max(Axis.Y); + double topOther = other.getCollisionShape(reader, pos) + .max(Axis.Y); + return !Mth.equal(top, topOther) && topOther > top; + } + + double topAboveOther = aboveOther.getCollisionShape(reader, pos) + .max(Axis.Y); + return topAboveOther > 0; + } + + @Override + public @Nullable CTType getDataType(BlockAndTintGetter world, BlockPos pos, BlockState state, Direction direction) { + return isUprightStair(state) ? AllCTTypes.ROOF_STAIR : AllCTTypes.ROOF; + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/block/CopperBlockSet.java b/src/main/java/com/simibubi/create/foundation/block/CopperBlockSet.java index 0d00252d2a..d533197c43 100644 --- a/src/main/java/com/simibubi/create/foundation/block/CopperBlockSet.java +++ b/src/main/java/com/simibubi/create/foundation/block/CopperBlockSet.java @@ -63,26 +63,33 @@ public class CopperBlockSet { protected final Map, BlockEntry[]> entries = new HashMap<>(); protected final NonNullBiConsumer, RegistrateRecipeProvider> mainBlockRecipe; protected final String endTextureName; + protected final NonNullBiConsumer onRegister; public CopperBlockSet(AbstractRegistrate registrate, String name, String endTextureName, Variant[] variants) { - this(registrate, name, endTextureName, variants, NonNullBiConsumer.noop(), "copper/"); + this(registrate, name, endTextureName, variants, NonNullBiConsumer.noop(), "copper/", NonNullBiConsumer.noop()); } public CopperBlockSet(AbstractRegistrate registrate, String name, String endTextureName, Variant[] variants, String generalDirectory) { - this(registrate, name, endTextureName, variants, NonNullBiConsumer.noop(), generalDirectory); + this(registrate, name, endTextureName, variants, NonNullBiConsumer.noop(), generalDirectory, NonNullBiConsumer.noop()); } public CopperBlockSet(AbstractRegistrate registrate, String name, String endTextureName, Variant[] variants, NonNullBiConsumer, RegistrateRecipeProvider> mainBlockRecipe) { - this(registrate, name, endTextureName, variants, mainBlockRecipe, "copper/"); + this(registrate, name, endTextureName, variants, mainBlockRecipe, "copper/", NonNullBiConsumer.noop()); + } + + public CopperBlockSet(AbstractRegistrate registrate, String name, String endTextureName, Variant[] variants, NonNullBiConsumer, RegistrateRecipeProvider> mainBlockRecipe, NonNullBiConsumer onRegister) { + this(registrate, name, endTextureName, variants, mainBlockRecipe, "copper/", onRegister); } public CopperBlockSet(AbstractRegistrate registrate, String name, String endTextureName, Variant[] variants, - NonNullBiConsumer, RegistrateRecipeProvider> mainBlockRecipe, String generalDirectory) { + NonNullBiConsumer, RegistrateRecipeProvider> mainBlockRecipe, String generalDirectory, NonNullBiConsumer onRegister) { this.name = name; this.generalDirectory = generalDirectory; this.endTextureName = endTextureName; this.variants = variants; this.mainBlockRecipe = mainBlockRecipe; + this.onRegister = onRegister; + for (boolean waxed : Iterate.falseAndTrue) { for (Variant variant : this.variants) { BlockEntry[] entries = @@ -128,6 +135,7 @@ public class CopperBlockSet { .blockstate((ctx, prov) -> variant.generateBlockState(ctx, prov, this, state, waxed)) .recipe((c, p) -> variant.generateRecipes(entries.get(BlockVariant.INSTANCE)[state.ordinal()], c, p)) .transform(TagGen.pickaxeOnly()) + .onRegister(block -> onRegister.accept(state, block)) .tag(BlockTags.NEEDS_STONE_TOOL) .simpleItem(); diff --git a/src/main/java/com/simibubi/create/foundation/block/connected/AllCTTypes.java b/src/main/java/com/simibubi/create/foundation/block/connected/AllCTTypes.java index bfd8eb96b7..5bf1fd00ec 100644 --- a/src/main/java/com/simibubi/create/foundation/block/connected/AllCTTypes.java +++ b/src/main/java/com/simibubi/create/foundation/block/connected/AllCTTypes.java @@ -89,6 +89,71 @@ public enum AllCTTypes implements CTType { return tileX + 8 * tileY; } }, + ROOF(4, ContextRequirement.builder().all().build()) { + @Override + public int getTextureIndex(CTContext context) { + boolean upDrops = context.down && !context.up && (context.left || context.right); + boolean downDrops = !context.down && context.up && (context.left || context.right); + boolean leftDrops = !context.left && context.right && (context.up || context.down); + boolean rightDrops = context.left && !context.right && (context.up || context.down); + + if (upDrops) { + if (leftDrops) + return context.bottomRight ? 0 : 5; + if (rightDrops) + return context.bottomLeft ? 2 : 5; + return 1; + } + + if (downDrops) { + if (leftDrops) + return context.topRight ? 8 : 5; + if (rightDrops) + return context.topLeft ? 10 : 5; + return 9; + } + + if (leftDrops) + return 4; + if (rightDrops) + return 6; + + if (!context.up || !context.down || !context.left || !context.right) + return 5; + + if (context.bottomLeft && context.topRight) { + if (context.topLeft && !context.bottomRight) + return 12; + if (context.bottomRight && !context.topLeft) + return 15; + if (!context.bottomRight && !context.topLeft) + return 7; + } + + if (context.bottomRight && context.topLeft) { + if (context.topRight && !context.bottomLeft) + return 13; + if (context.bottomLeft && !context.topRight) + return 14; + if (!context.bottomLeft && !context.topRight) + return 11; + } + + return 5; + } + }, + ROOF_STAIR(4, ContextRequirement.builder() + .axisAligned() + .build()) { + private static final int[][] MAPPING = { { 1, 6, 9, 4 }, { 14, 12, 13, 15 }, { 2, 10, 8, 0 }, { 5, 5, 5, 5 } }; + + @Override + public int getTextureIndex(CTContext context) { + int type = (context.up ? 2 : 0) + (context.right ? 1 : 0); + int rot = (context.left ? 2 : 0) + (context.down ? 1 : 0); + return MAPPING[type][rot]; + } + }, CROSS(4, ContextRequirement.builder().axisAligned().build()) { @Override public int getTextureIndex(CTContext context) { diff --git a/src/main/resources/assets/create/textures/block/copper/copper_shingles_top_connected.png b/src/main/resources/assets/create/textures/block/copper/copper_shingles_top_connected.png new file mode 100644 index 0000000000000000000000000000000000000000..6bbdef082bb29f38fab326fb58f737c074a2ed3a GIT binary patch literal 1807 zcmZ8hdpy)x8$WZ=%(~6wR-`d)+l4HHh;o?`J7%&>)6ER89SK>tM7o$^Tym>*d8r{3 z8_DiQDO7_*m`2N66d_`UVb^t(aT#WR+I`{t^ILy=6ck*+rRq; z&H7!mrzk$S>LfYhm7ONSJ@*d7ra>faVhz8foI@d=zhKVrF8#QirI4YHIvEDE<_R z5kNzU63~Mw0T`sH5VriI*Kf2NhWO&cA#DbO11!W$2!YASFaD2^UJn+8_5T0z{~ZdT zH_1c+Bve5#w;;fZ{+_ztp;Ywuq#Q`E2OOFM|58b}v4+$?U1kKr`tHQr1#4kn@Fl44 z62*yh)Pv07_5WOAr0S$S7qzBH=wxcYn0_Cfl-x?BCwft%8P}^rJcneKqVa&0ueFdKJhs;dcGifq)a38ywmC)V$edn*}w^&V% zu?)AI=oa3Wt;h{|t58k=@6&Fk6^0K1cKhh~l1k&CvR6yY5A_CQhyC+BuZ57A=FoJ% zq1te}&&w?{S@M=pp^?|0)sU+WJWNr^qkXl%tHS35@5dbbO#x@u59gme-tpNYVKwU^ z1wUP*a1|vjaU!l${n?^l?!+J}#b-^;LY{%W9W$JJz95J!S6AR(Q7h}$* zmX_Vse0W_k*JfH3y1*pGX6~u*Ee;UeZCNI5dJL{TD=%*jVoRo5xp<4DRHtAn@N zZb~gSB%7fdhqGvL8UV*(_I8XPujrP*b`j|oj7BtI5T;q%xe|>;P+d0vpMbBsFx=rZ zKCoRtR{Tp$>`DE(>&Zktx+K6R+<^_?>R0)}+Q+8CfW|5V&2PYcP3VjId~cD+Pusy5 z?^+vEF8A>?dN3dxK~0SY-}h%)`p#QN<3`MJ7tRIsej`A&Y=V~zq`ySTb>JX1^@I+7 z+as(87t^$(+I1O65Cw!}B&uv9m;mvz71i zLG4b}wVc~GPUN3+nY`%wUC%pt?j5(+IT4DTS6C~X3ulwx^&W_#B3rVrt{&V#D&aXO zHx^82HTUTH3QzUJ*?kOhLjy(*V8ag;4oi66ckk)jgC}Aui&Uhj=cAu-rL~Gel)5(?H)%U^KmN34z^1ix8V0v};t3e8Y0Zs5tNQtDfmUG1W^)@XSwYeB$%@pP151I||dsFUGVI#-XijlZV;t6M~x xaeQS2c2H)w{dHxG41P>+BK*uPdTO0XyP{G;_1K$m`M~;*OmTK|s&Hh*{{^<*7Y_gc literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/copper/copper_tiles_top_connected.png b/src/main/resources/assets/create/textures/block/copper/copper_tiles_top_connected.png new file mode 100644 index 0000000000000000000000000000000000000000..8b6f443b00bee08fcab76ac44e511171c80534df GIT binary patch literal 1866 zcmZ8hc{tnY7XA{9h$U+4Ah*G-N~_hNRcjN)jfAncwpJUiwNwe}ir7Nw)ULR;qL-n= z*rK8KZEj2#lxUgSTA|fytqmIF{&eQvKkj*+^S$qR&-}-gVNF^iyK$2u> z?f@a-AQ3{)S<(`}3;~SlK)e9zhR{n;A?$1VgDC)w8REMX5vW$Rvv#uJ_;3pC^k354 z=Mw^(Jc-n2f+{z{VA!Qhl6K#9YsgiV^vDqc@h}G)N5TIBkZob>kSuo7(v=E;RNq0u zSfqCeOFI=N5u$cx?A z1>nt;qCHpfZuj7XKy2=96zjSp_4Uh$SqkLT~{EiY!q1zOntI@B5rx)wq=cVP`JaOcKZ=N0ygjGz7-~xoz`R59n+uGrddP+@YvUD#VN7kPGtwemmm8HWq50mccCBP$0m%4C94{^} zEqkue_%*+h!7(a!X-g07Z0gzQQXU;)A4&K)E)plsrFWEsECv|{D*?ZDJ+o5w{q-D% znH2oyHrXv+26TOGZYX*2%jJi|LN;*~K233lKtyjVBMo#NmVtBb=Omw(ErO@rd8ie5YfH3;|#=u{H=A8qSScSg2`eZ~Z>k7RlrtC@xN#SdA zx0veLcA{iU$+AH^o95Ji;4w340}kMZF!ykaVS61DA)0Ex0@3Mz7L zh?66z(bLWOqB^?#_(Ql$pxJhGxGU{Mik4^;&M%9s#)~43gJMKgAvEmaMV+aSdbHd+PoD5U)O_ zNB5{(N@}qN2@Oa-9!B2O?P(N3HKxPs%vcL%BJ`(cllz}V=P-t&g~{qnYdVhsjGI8| z9zjq|n(}S;$uNGX?Ar4;drvx)!W12KU!}PTrG}$#3qOaZJ@Wa*xk`;Ow4%n@3m&F@3a-KxNqn@ zHyTH;(WFwQY83n)olamAS)=&of6p{Js$uV!_#O333jJ68$37-1!7^BYjhj->cH)>+ z)myVF7Yv3B*TeCvaCkzCq8fX|dNp=XOv(FXMcS^vAOt^>?C?NdGp)d?i^}>Sx2Uh_ zwW2(Re+yTtlg@a%8(vnNHl(_qVzwB0@l=uLRk5CGhgCmyrF0{oQ)U4w?{+XrF0OOu zr&~S~fpQZK6&-{)?EN>KK&byhKRN|Hy*W}Gv z)#J6Zva*ziIku~myMxc1WMN}oci~#X Fe*mNkFV6q~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/copper/exposed_copper_shingles_top_connected.png b/src/main/resources/assets/create/textures/block/copper/exposed_copper_shingles_top_connected.png new file mode 100644 index 0000000000000000000000000000000000000000..fcb82769287e04e0d5965b03e9005196aaf66337 GIT binary patch literal 1949 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/copper/oxidized_copper_shingles_top_connected.png b/src/main/resources/assets/create/textures/block/copper/oxidized_copper_shingles_top_connected.png new file mode 100644 index 0000000000000000000000000000000000000000..1e1a56af94beb6705125c09cc14a7cd878d40ab8 GIT binary patch literal 1961 zcmZWqdpOi-8-C|t2cyP>4cSI0^9>1`Vw=o3#h5YWlyk@$j6xZe9LJ#~G31oCS*Iq4 z{d|%z7SR@KbG)pim21`^hlz0*O&W*qr``SM`=0B1-ur$|_jA4PKkuzGblY9>>hb`9 zT@*WOCkV+qE{lN92aW6x5WpgxY%M`epT-;%AcHI%EC6_%h2HR&fnu{WG#8uS8NU~u zF?}85HJNmw?!0Ye&-Nov@~^D39E#ENP?|YAl$M)vg5m01a?LEv<8(F0qb?`x<&V%b z-dc)*K#AobOxP>0C?7{u%$-}g7)xiKDw_>zZ1+z18- ziV%829&!`;CC`NTj;&mQfm!Hb{=xrQ3ZN1P1&~muq4Bqdu;RZ|cQ(ot|D}`*@g0Lh zy6`WZPG+VM`+LgB&~T@kd7{H@Xm1N0niEs3EnM7f;|gvUl@SzERF*9@%FIODwNf_| zzq-38dty6oES8EU3>5;3c*Op)uAC7uNo=?w837ev!^eW0z;g6=?$UGqe zyte8fn7t2iLb8MF8;ycL!#P0{u9h#mOGMb7J0A~a;zPE+>6BY`GNsbeKc!U4Zz9hP zlyKvU+JH`9e{@Cwpx%GpXpBZRcW)ySi83H7%If$f`!iK}5lcwKM1}M8XH|~w)TdCi z>l0YJ_h6!#GS%9Hz5(~!TZ|*Pd)(Y_&B&)Vw18S&M{n1ftOEgvQ~FIk^LviHr2ng! z=IK5-m{Jt+#1WDaxM^L`Ue^i2Cy#dqzkBRs-Y$3aD_#0@<6!#N4f6#LQwKtW&xd$f zuBE~ISM~1_NGqnMnY)3D=HeQwbAG729zt6scT z2!CO}K`chvO|X;|;bfnIc};Eb;I@)NuIF?|zjgV(#Ie9ASn!Ie!NnKks!1CMq0T}o z`PvPYwRadYnazBqd@e5*);=z}Wk?;dkCqnPac(z?Ac#0e{*yT9LA(qq~2~xSA0`GCX`aq9$t*HU2e@ zQ=Vw-w>^s6SdbpVjF?x%Yrb9iKDWn_w8RT{RZX2#=~%5K3QkLi`M=mP!P_jRJ=0R0 z41%m;^-2n)^!Gky9n}44R~)EiT3v|c^IEAl3Ap1_SWBi*OC?R`y7$a`w~UWgwLXt# zaYW8p9z{{rb(Df_VG=lUdn@}gCB5@*UJE$lcclUL&9u9ZA_z${bR_mvGWBHB0@`9) zJDi_jryhOhp0cCsl&mJd_Sv}+;h0KQ8zzafxP=96RMQHboOvPj!yeG=*O}JS& zJSps37rmr(SminE@@Waic%YqXO{h6)n$KR2NTJmGMf=Z9{AI2qBSHt)R zvev`6Kgn>P;WpkBEo$fwvKA#( r8rNSdDH{(Ym){807|SQ{y8J&OipxD&eB%teoxgx$L$|K6^h^3LZZ%gG literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/copper/oxidized_copper_tiles_top_connected.png b/src/main/resources/assets/create/textures/block/copper/oxidized_copper_tiles_top_connected.png new file mode 100644 index 0000000000000000000000000000000000000000..d3c5e938e6ec387574be32d3c529279665d23b4a GIT binary patch literal 1943 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/copper/weathered_copper_tiles_top_connected.png b/src/main/resources/assets/create/textures/block/copper/weathered_copper_tiles_top_connected.png new file mode 100644 index 0000000000000000000000000000000000000000..e974b5a6ebb79d17d9c2034dcad1b7c98c46514d GIT binary patch literal 1948 zcmZWpX;{+P9zK8yE&*m5*SbPk6HSu?W~GLLgqf+RpADc$?;%1EzvX80{|>> z-pOD=Oj`sB0j+1RrAUxdL;j6r`Y?N^FFj5F1x^)d^^H5H!C{fT1DuExZs*NZmxG^+1>+(otzH`L)HF? z%(W01aaqjWn*TGvPkxDl!n)Br_rwB#zP$*TF>zNa-3eyHKNbQ2K;vc zdq+Y?l79|%3AsV;BApK5O;YmBT>K=O{;t`+V>*D)w5jVf#r)%PQ>6^}tQ_XMy{m8P92nnzzWS9<$w;dGO`9&Db1B z{pvwlE4FnzNxa!U>R&51v6#+H^Z`>4CycurSX zv)xYBmINbK`cL7+fW0N-P>2bdTddIs@p`~)Dl_VJNsZTwu1+I^>^deinc&{@aoD7R zjY#dNg~bxt+5E~swM7;*s@Ekx+AjP44>ONH!9`W{!@uvvZ@;T^niE~|cx~j#vn*Og z+ojq%-OaB;&Bx|&qu#3{&6R7yh{vVf;Ulen_99&?opsDlFTx%5eZNWu=3RbWWF8Epyg@38Kq{r;2Lyes26tjCYNJoUT$H@!Oy>TUN8wJ`_w zp-zNxJY{O2wQQ&Fx!H#Q#DQsb73wnA?}Ugr$UgrLS)}j3G~@YLoNF|?v3^<-pSM7W z{~CEIfwQ)IoX@6mLaYiVdIPl`)P%VVP#NVigPhla19^_CNvhu;jDWP1(Uev3%Cw#@ zDFl6-IVg(jAGQrKDK9%i_ct>>rgGSmpg?qB-9UeVI$}?Bu@t@02v*}x&^ve{Ie7{R zTLaGisI-I={CY<)*h0;3xggc6EbP4t>qzdJCpaUK=TOs*9L@l}oH_^Vv-ZsCiMG3! zqdOWf_msIIvsw*|n#6Ye3aOg5@%-SBJd6r7hbet;KhG-z?W@K4l&?~ZL4P<*s6b38 zXiGc9#-G=_-+&HO^JvSfX8hCU{LjCvY?(^h$Lo`vB3>W?g0arOiUYBE<*ln56d#a+=LM?cTdxZ60z57Pa+scGzFXAN5V5Rpn_U z@zF(?Un!Nz9%@?K*gaxJUCOANtbsH+L9xb%&rtg9^2bO;rm6BeUJ(zgCWxM4WhWP& z9zqr%`-;mb*!Mj44#zy?>$?m+%zFG*7Z?$Po)4$4?0e9Hd!H2`U_PQAB{aJh6G#pG zdx+PH*uA_n$a>pt(yfjD2cJ=oav5S4x8ghZS0y78SyQ($lbr|sQQza^CF<=1JrVco zvm0t}mfZ0g(8rCX(H|=uumdAhxF}8+d4|C{E46yWhF^^-U5!^D{AjfPgP8{$Jqkyu z`&TTv%vy4-VKyV`6fpfQf7l9 zx{u?QcFrUYC+r8W|VAA=Zn6)P$2RqQQPZv+kFZPo2BNp4D!Qu=m%X3 zRkOA5ewn6qK=Q<5^+~sCm1@{GJ@88*x$+$=lNdF6`x?bb} literal 0 HcmV?d00001 From 8064cee337c475cc2028f84f61493cd218205529 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Sun, 5 Jan 2025 13:37:39 -0500 Subject: [PATCH 257/515] Arts and crafts - Implement trims support for cardboard armor --- .../create/models/item/cardboard_boots.json | 64 +++++++++++++++++- .../item/cardboard_boots_amethyst_trim.json | 7 ++ .../item/cardboard_boots_copper_trim.json | 7 ++ .../item/cardboard_boots_diamond_trim.json | 7 ++ .../item/cardboard_boots_emerald_trim.json | 7 ++ .../item/cardboard_boots_gold_trim.json | 7 ++ .../item/cardboard_boots_iron_trim.json | 7 ++ .../item/cardboard_boots_lapis_trim.json | 7 ++ .../item/cardboard_boots_netherite_trim.json | 7 ++ .../item/cardboard_boots_quartz_trim.json | 7 ++ .../item/cardboard_boots_redstone_trim.json | 7 ++ .../models/item/cardboard_chestplate.json | 64 +++++++++++++++++- .../cardboard_chestplate_amethyst_trim.json | 7 ++ .../cardboard_chestplate_copper_trim.json | 7 ++ .../cardboard_chestplate_diamond_trim.json | 7 ++ .../cardboard_chestplate_emerald_trim.json | 7 ++ .../item/cardboard_chestplate_gold_trim.json | 7 ++ .../item/cardboard_chestplate_iron_trim.json | 7 ++ .../item/cardboard_chestplate_lapis_trim.json | 7 ++ .../cardboard_chestplate_netherite_trim.json | 7 ++ .../cardboard_chestplate_quartz_trim.json | 7 ++ .../cardboard_chestplate_redstone_trim.json | 7 ++ .../create/models/item/cardboard_helmet.json | 64 +++++++++++++++++- .../item/cardboard_helmet_amethyst_trim.json | 7 ++ .../item/cardboard_helmet_copper_trim.json | 7 ++ .../item/cardboard_helmet_diamond_trim.json | 7 ++ .../item/cardboard_helmet_emerald_trim.json | 7 ++ .../item/cardboard_helmet_gold_trim.json | 7 ++ .../item/cardboard_helmet_iron_trim.json | 7 ++ .../item/cardboard_helmet_lapis_trim.json | 7 ++ .../item/cardboard_helmet_netherite_trim.json | 7 ++ .../item/cardboard_helmet_quartz_trim.json | 7 ++ .../item/cardboard_helmet_redstone_trim.json | 7 ++ .../models/item/cardboard_leggings.json | 64 +++++++++++++++++- .../cardboard_leggings_amethyst_trim.json | 7 ++ .../item/cardboard_leggings_copper_trim.json | 7 ++ .../item/cardboard_leggings_diamond_trim.json | 7 ++ .../item/cardboard_leggings_emerald_trim.json | 7 ++ .../item/cardboard_leggings_gold_trim.json | 7 ++ .../item/cardboard_leggings_iron_trim.json | 7 ++ .../item/cardboard_leggings_lapis_trim.json | 7 ++ .../cardboard_leggings_netherite_trim.json | 7 ++ .../item/cardboard_leggings_quartz_trim.json | 7 ++ .../cardboard_leggings_redstone_trim.json | 7 ++ .../minecraft/tags/items/trimmable_armor.json | 8 +++ .../java/com/simibubi/create/AllItems.java | 15 ++-- .../armor/TrimmableArmorModelGenerator.java | 41 +++++++++++ .../foundation/mixin/ArmorTrimMixin.java | 23 +++++++ .../accessor/ItemModelGeneratorsAccessor.java | 16 +++++ .../mixin/accessor/ModelBuilderAccessor.java | 14 ++++ .../resources/META-INF/accesstransformer.cfg | 2 + .../textures/trims/items/card_boots_trim.png | Bin 0 -> 168 bytes .../trims/items/card_chestplate_trim.png | Bin 0 -> 193 bytes .../textures/trims/items/card_helmet_trim.png | Bin 0 -> 174 bytes .../trims/items/card_leggings_trim.png | Bin 0 -> 160 bytes .../trims/models/armor/card_coast.png | Bin 0 -> 207 bytes .../models/armor/card_coast_leggings.png | Bin 0 -> 177 bytes .../textures/trims/models/armor/card_dune.png | Bin 0 -> 331 bytes .../trims/models/armor/card_dune_leggings.png | Bin 0 -> 186 bytes .../textures/trims/models/armor/card_eye.png | Bin 0 -> 206 bytes .../trims/models/armor/card_eye_leggings.png | Bin 0 -> 178 bytes .../textures/trims/models/armor/card_host.png | Bin 0 -> 203 bytes .../trims/models/armor/card_host_leggings.png | Bin 0 -> 185 bytes .../trims/models/armor/card_raiser.png | Bin 0 -> 221 bytes .../models/armor/card_raiser_leggings.png | Bin 0 -> 195 bytes .../textures/trims/models/armor/card_rib.png | Bin 0 -> 239 bytes .../trims/models/armor/card_rib_leggings.png | Bin 0 -> 152 bytes .../trims/models/armor/card_sentry.png | Bin 0 -> 261 bytes .../models/armor/card_sentry_leggings.png | Bin 0 -> 171 bytes .../trims/models/armor/card_shaper.png | Bin 0 -> 175 bytes .../models/armor/card_shaper_leggings.png | Bin 0 -> 184 bytes .../trims/models/armor/card_silence.png | Bin 0 -> 612 bytes .../models/armor/card_silence_leggings.png | Bin 0 -> 360 bytes .../trims/models/armor/card_snout.png | Bin 0 -> 270 bytes .../models/armor/card_snout_leggings.png | Bin 0 -> 167 bytes .../trims/models/armor/card_spire.png | Bin 0 -> 268 bytes .../models/armor/card_spire_leggings.png | Bin 0 -> 163 bytes .../textures/trims/models/armor/card_tide.png | Bin 0 -> 267 bytes .../trims/models/armor/card_tide_leggings.png | Bin 0 -> 185 bytes .../textures/trims/models/armor/card_vex.png | Bin 0 -> 273 bytes .../trims/models/armor/card_vex_leggings.png | Bin 0 -> 144 bytes .../textures/trims/models/armor/card_ward.png | Bin 0 -> 227 bytes .../trims/models/armor/card_ward_leggings.png | Bin 0 -> 182 bytes .../trims/models/armor/card_wayfinder.png | Bin 0 -> 220 bytes .../models/armor/card_wayfinder_leggings.png | Bin 0 -> 217 bytes .../textures/trims/models/armor/card_wild.png | Bin 0 -> 276 bytes .../trims/models/armor/card_wild_leggings.png | Bin 0 -> 189 bytes .../assets/minecraft/atlases/armor_trims.json | 58 ++++++++++++++++ .../assets/minecraft/atlases/blocks.json | 50 ++++++++++---- src/main/resources/create.mixins.json | 3 + 90 files changed, 745 insertions(+), 21 deletions(-) create mode 100644 src/generated/resources/assets/create/models/item/cardboard_boots_amethyst_trim.json create mode 100644 src/generated/resources/assets/create/models/item/cardboard_boots_copper_trim.json create mode 100644 src/generated/resources/assets/create/models/item/cardboard_boots_diamond_trim.json create mode 100644 src/generated/resources/assets/create/models/item/cardboard_boots_emerald_trim.json create mode 100644 src/generated/resources/assets/create/models/item/cardboard_boots_gold_trim.json create mode 100644 src/generated/resources/assets/create/models/item/cardboard_boots_iron_trim.json create mode 100644 src/generated/resources/assets/create/models/item/cardboard_boots_lapis_trim.json create mode 100644 src/generated/resources/assets/create/models/item/cardboard_boots_netherite_trim.json create mode 100644 src/generated/resources/assets/create/models/item/cardboard_boots_quartz_trim.json create mode 100644 src/generated/resources/assets/create/models/item/cardboard_boots_redstone_trim.json create mode 100644 src/generated/resources/assets/create/models/item/cardboard_chestplate_amethyst_trim.json create mode 100644 src/generated/resources/assets/create/models/item/cardboard_chestplate_copper_trim.json create mode 100644 src/generated/resources/assets/create/models/item/cardboard_chestplate_diamond_trim.json create mode 100644 src/generated/resources/assets/create/models/item/cardboard_chestplate_emerald_trim.json create mode 100644 src/generated/resources/assets/create/models/item/cardboard_chestplate_gold_trim.json create mode 100644 src/generated/resources/assets/create/models/item/cardboard_chestplate_iron_trim.json create mode 100644 src/generated/resources/assets/create/models/item/cardboard_chestplate_lapis_trim.json create mode 100644 src/generated/resources/assets/create/models/item/cardboard_chestplate_netherite_trim.json create mode 100644 src/generated/resources/assets/create/models/item/cardboard_chestplate_quartz_trim.json create mode 100644 src/generated/resources/assets/create/models/item/cardboard_chestplate_redstone_trim.json create mode 100644 src/generated/resources/assets/create/models/item/cardboard_helmet_amethyst_trim.json create mode 100644 src/generated/resources/assets/create/models/item/cardboard_helmet_copper_trim.json create mode 100644 src/generated/resources/assets/create/models/item/cardboard_helmet_diamond_trim.json create mode 100644 src/generated/resources/assets/create/models/item/cardboard_helmet_emerald_trim.json create mode 100644 src/generated/resources/assets/create/models/item/cardboard_helmet_gold_trim.json create mode 100644 src/generated/resources/assets/create/models/item/cardboard_helmet_iron_trim.json create mode 100644 src/generated/resources/assets/create/models/item/cardboard_helmet_lapis_trim.json create mode 100644 src/generated/resources/assets/create/models/item/cardboard_helmet_netherite_trim.json create mode 100644 src/generated/resources/assets/create/models/item/cardboard_helmet_quartz_trim.json create mode 100644 src/generated/resources/assets/create/models/item/cardboard_helmet_redstone_trim.json create mode 100644 src/generated/resources/assets/create/models/item/cardboard_leggings_amethyst_trim.json create mode 100644 src/generated/resources/assets/create/models/item/cardboard_leggings_copper_trim.json create mode 100644 src/generated/resources/assets/create/models/item/cardboard_leggings_diamond_trim.json create mode 100644 src/generated/resources/assets/create/models/item/cardboard_leggings_emerald_trim.json create mode 100644 src/generated/resources/assets/create/models/item/cardboard_leggings_gold_trim.json create mode 100644 src/generated/resources/assets/create/models/item/cardboard_leggings_iron_trim.json create mode 100644 src/generated/resources/assets/create/models/item/cardboard_leggings_lapis_trim.json create mode 100644 src/generated/resources/assets/create/models/item/cardboard_leggings_netherite_trim.json create mode 100644 src/generated/resources/assets/create/models/item/cardboard_leggings_quartz_trim.json create mode 100644 src/generated/resources/assets/create/models/item/cardboard_leggings_redstone_trim.json create mode 100644 src/generated/resources/data/minecraft/tags/items/trimmable_armor.json create mode 100644 src/main/java/com/simibubi/create/content/equipment/armor/TrimmableArmorModelGenerator.java create mode 100644 src/main/java/com/simibubi/create/foundation/mixin/ArmorTrimMixin.java create mode 100644 src/main/java/com/simibubi/create/foundation/mixin/accessor/ItemModelGeneratorsAccessor.java create mode 100644 src/main/java/com/simibubi/create/foundation/mixin/accessor/ModelBuilderAccessor.java create mode 100644 src/main/resources/assets/create/textures/trims/items/card_boots_trim.png create mode 100644 src/main/resources/assets/create/textures/trims/items/card_chestplate_trim.png create mode 100644 src/main/resources/assets/create/textures/trims/items/card_helmet_trim.png create mode 100644 src/main/resources/assets/create/textures/trims/items/card_leggings_trim.png create mode 100644 src/main/resources/assets/create/textures/trims/models/armor/card_coast.png create mode 100644 src/main/resources/assets/create/textures/trims/models/armor/card_coast_leggings.png create mode 100644 src/main/resources/assets/create/textures/trims/models/armor/card_dune.png create mode 100644 src/main/resources/assets/create/textures/trims/models/armor/card_dune_leggings.png create mode 100644 src/main/resources/assets/create/textures/trims/models/armor/card_eye.png create mode 100644 src/main/resources/assets/create/textures/trims/models/armor/card_eye_leggings.png create mode 100644 src/main/resources/assets/create/textures/trims/models/armor/card_host.png create mode 100644 src/main/resources/assets/create/textures/trims/models/armor/card_host_leggings.png create mode 100644 src/main/resources/assets/create/textures/trims/models/armor/card_raiser.png create mode 100644 src/main/resources/assets/create/textures/trims/models/armor/card_raiser_leggings.png create mode 100644 src/main/resources/assets/create/textures/trims/models/armor/card_rib.png create mode 100644 src/main/resources/assets/create/textures/trims/models/armor/card_rib_leggings.png create mode 100644 src/main/resources/assets/create/textures/trims/models/armor/card_sentry.png create mode 100644 src/main/resources/assets/create/textures/trims/models/armor/card_sentry_leggings.png create mode 100644 src/main/resources/assets/create/textures/trims/models/armor/card_shaper.png create mode 100644 src/main/resources/assets/create/textures/trims/models/armor/card_shaper_leggings.png create mode 100644 src/main/resources/assets/create/textures/trims/models/armor/card_silence.png create mode 100644 src/main/resources/assets/create/textures/trims/models/armor/card_silence_leggings.png create mode 100644 src/main/resources/assets/create/textures/trims/models/armor/card_snout.png create mode 100644 src/main/resources/assets/create/textures/trims/models/armor/card_snout_leggings.png create mode 100644 src/main/resources/assets/create/textures/trims/models/armor/card_spire.png create mode 100644 src/main/resources/assets/create/textures/trims/models/armor/card_spire_leggings.png create mode 100644 src/main/resources/assets/create/textures/trims/models/armor/card_tide.png create mode 100644 src/main/resources/assets/create/textures/trims/models/armor/card_tide_leggings.png create mode 100644 src/main/resources/assets/create/textures/trims/models/armor/card_vex.png create mode 100644 src/main/resources/assets/create/textures/trims/models/armor/card_vex_leggings.png create mode 100644 src/main/resources/assets/create/textures/trims/models/armor/card_ward.png create mode 100644 src/main/resources/assets/create/textures/trims/models/armor/card_ward_leggings.png create mode 100644 src/main/resources/assets/create/textures/trims/models/armor/card_wayfinder.png create mode 100644 src/main/resources/assets/create/textures/trims/models/armor/card_wayfinder_leggings.png create mode 100644 src/main/resources/assets/create/textures/trims/models/armor/card_wild.png create mode 100644 src/main/resources/assets/create/textures/trims/models/armor/card_wild_leggings.png create mode 100644 src/main/resources/assets/minecraft/atlases/armor_trims.json diff --git a/src/generated/resources/assets/create/models/item/cardboard_boots.json b/src/generated/resources/assets/create/models/item/cardboard_boots.json index d7bd75e088..296b1b8b31 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_boots.json +++ b/src/generated/resources/assets/create/models/item/cardboard_boots.json @@ -1,6 +1,68 @@ { "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "create:item/cardboard_boots_quartz_trim", + "predicate": { + "minecraft:trim_type": 0.1 + } + }, + { + "model": "create:item/cardboard_boots_iron_trim", + "predicate": { + "minecraft:trim_type": 0.2 + } + }, + { + "model": "create:item/cardboard_boots_netherite_trim", + "predicate": { + "minecraft:trim_type": 0.3 + } + }, + { + "model": "create:item/cardboard_boots_redstone_trim", + "predicate": { + "minecraft:trim_type": 0.4 + } + }, + { + "model": "create:item/cardboard_boots_copper_trim", + "predicate": { + "minecraft:trim_type": 0.5 + } + }, + { + "model": "create:item/cardboard_boots_gold_trim", + "predicate": { + "minecraft:trim_type": 0.6 + } + }, + { + "model": "create:item/cardboard_boots_emerald_trim", + "predicate": { + "minecraft:trim_type": 0.7 + } + }, + { + "model": "create:item/cardboard_boots_diamond_trim", + "predicate": { + "minecraft:trim_type": 0.8 + } + }, + { + "model": "create:item/cardboard_boots_lapis_trim", + "predicate": { + "minecraft:trim_type": 0.9 + } + }, + { + "model": "create:item/cardboard_boots_amethyst_trim", + "predicate": { + "minecraft:trim_type": 1.0 + } + } + ], "textures": { "layer0": "create:item/cardboard_boots" } -} \ No newline at end of file +} diff --git a/src/generated/resources/assets/create/models/item/cardboard_boots_amethyst_trim.json b/src/generated/resources/assets/create/models/item/cardboard_boots_amethyst_trim.json new file mode 100644 index 0000000000..6095cb93a4 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard_boots_amethyst_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/cardboard_boots", + "layer1": "create:trims/items/card_boots_trim_amethyst" + } +} diff --git a/src/generated/resources/assets/create/models/item/cardboard_boots_copper_trim.json b/src/generated/resources/assets/create/models/item/cardboard_boots_copper_trim.json new file mode 100644 index 0000000000..bf535eb1ad --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard_boots_copper_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/cardboard_boots", + "layer1": "create:trims/items/card_boots_trim_copper" + } +} diff --git a/src/generated/resources/assets/create/models/item/cardboard_boots_diamond_trim.json b/src/generated/resources/assets/create/models/item/cardboard_boots_diamond_trim.json new file mode 100644 index 0000000000..9a7d053e7a --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard_boots_diamond_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/cardboard_boots", + "layer1": "create:trims/items/card_boots_trim_diamond" + } +} diff --git a/src/generated/resources/assets/create/models/item/cardboard_boots_emerald_trim.json b/src/generated/resources/assets/create/models/item/cardboard_boots_emerald_trim.json new file mode 100644 index 0000000000..e372dbcf6a --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard_boots_emerald_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/cardboard_boots", + "layer1": "create:trims/items/card_boots_trim_emerald" + } +} diff --git a/src/generated/resources/assets/create/models/item/cardboard_boots_gold_trim.json b/src/generated/resources/assets/create/models/item/cardboard_boots_gold_trim.json new file mode 100644 index 0000000000..392d3afe03 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard_boots_gold_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/cardboard_boots", + "layer1": "create:trims/items/card_boots_trim_gold" + } +} diff --git a/src/generated/resources/assets/create/models/item/cardboard_boots_iron_trim.json b/src/generated/resources/assets/create/models/item/cardboard_boots_iron_trim.json new file mode 100644 index 0000000000..2ef7a34436 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard_boots_iron_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/cardboard_boots", + "layer1": "create:trims/items/card_boots_trim_iron" + } +} diff --git a/src/generated/resources/assets/create/models/item/cardboard_boots_lapis_trim.json b/src/generated/resources/assets/create/models/item/cardboard_boots_lapis_trim.json new file mode 100644 index 0000000000..238bd3fe6d --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard_boots_lapis_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/cardboard_boots", + "layer1": "create:trims/items/card_boots_trim_lapis" + } +} diff --git a/src/generated/resources/assets/create/models/item/cardboard_boots_netherite_trim.json b/src/generated/resources/assets/create/models/item/cardboard_boots_netherite_trim.json new file mode 100644 index 0000000000..176e50ae64 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard_boots_netherite_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/cardboard_boots", + "layer1": "create:trims/items/card_boots_trim_netherite" + } +} diff --git a/src/generated/resources/assets/create/models/item/cardboard_boots_quartz_trim.json b/src/generated/resources/assets/create/models/item/cardboard_boots_quartz_trim.json new file mode 100644 index 0000000000..4416117015 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard_boots_quartz_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/cardboard_boots", + "layer1": "create:trims/items/card_boots_trim_quartz" + } +} diff --git a/src/generated/resources/assets/create/models/item/cardboard_boots_redstone_trim.json b/src/generated/resources/assets/create/models/item/cardboard_boots_redstone_trim.json new file mode 100644 index 0000000000..9c502ccbf9 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard_boots_redstone_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/cardboard_boots", + "layer1": "create:trims/items/card_boots_trim_redstone" + } +} diff --git a/src/generated/resources/assets/create/models/item/cardboard_chestplate.json b/src/generated/resources/assets/create/models/item/cardboard_chestplate.json index 910c1f284c..468854c641 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_chestplate.json +++ b/src/generated/resources/assets/create/models/item/cardboard_chestplate.json @@ -1,6 +1,68 @@ { "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "create:item/cardboard_chestplate_quartz_trim", + "predicate": { + "minecraft:trim_type": 0.1 + } + }, + { + "model": "create:item/cardboard_chestplate_iron_trim", + "predicate": { + "minecraft:trim_type": 0.2 + } + }, + { + "model": "create:item/cardboard_chestplate_netherite_trim", + "predicate": { + "minecraft:trim_type": 0.3 + } + }, + { + "model": "create:item/cardboard_chestplate_redstone_trim", + "predicate": { + "minecraft:trim_type": 0.4 + } + }, + { + "model": "create:item/cardboard_chestplate_copper_trim", + "predicate": { + "minecraft:trim_type": 0.5 + } + }, + { + "model": "create:item/cardboard_chestplate_gold_trim", + "predicate": { + "minecraft:trim_type": 0.6 + } + }, + { + "model": "create:item/cardboard_chestplate_emerald_trim", + "predicate": { + "minecraft:trim_type": 0.7 + } + }, + { + "model": "create:item/cardboard_chestplate_diamond_trim", + "predicate": { + "minecraft:trim_type": 0.8 + } + }, + { + "model": "create:item/cardboard_chestplate_lapis_trim", + "predicate": { + "minecraft:trim_type": 0.9 + } + }, + { + "model": "create:item/cardboard_chestplate_amethyst_trim", + "predicate": { + "minecraft:trim_type": 1.0 + } + } + ], "textures": { "layer0": "create:item/cardboard_chestplate" } -} \ No newline at end of file +} diff --git a/src/generated/resources/assets/create/models/item/cardboard_chestplate_amethyst_trim.json b/src/generated/resources/assets/create/models/item/cardboard_chestplate_amethyst_trim.json new file mode 100644 index 0000000000..96d37ad444 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard_chestplate_amethyst_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/cardboard_chestplate", + "layer1": "create:trims/items/card_chestplate_trim_amethyst" + } +} diff --git a/src/generated/resources/assets/create/models/item/cardboard_chestplate_copper_trim.json b/src/generated/resources/assets/create/models/item/cardboard_chestplate_copper_trim.json new file mode 100644 index 0000000000..520828619d --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard_chestplate_copper_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/cardboard_chestplate", + "layer1": "create:trims/items/card_chestplate_trim_copper" + } +} diff --git a/src/generated/resources/assets/create/models/item/cardboard_chestplate_diamond_trim.json b/src/generated/resources/assets/create/models/item/cardboard_chestplate_diamond_trim.json new file mode 100644 index 0000000000..ddbe3c6cff --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard_chestplate_diamond_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/cardboard_chestplate", + "layer1": "create:trims/items/card_chestplate_trim_diamond" + } +} diff --git a/src/generated/resources/assets/create/models/item/cardboard_chestplate_emerald_trim.json b/src/generated/resources/assets/create/models/item/cardboard_chestplate_emerald_trim.json new file mode 100644 index 0000000000..f29b0932dc --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard_chestplate_emerald_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/cardboard_chestplate", + "layer1": "create:trims/items/card_chestplate_trim_emerald" + } +} diff --git a/src/generated/resources/assets/create/models/item/cardboard_chestplate_gold_trim.json b/src/generated/resources/assets/create/models/item/cardboard_chestplate_gold_trim.json new file mode 100644 index 0000000000..e435ec1242 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard_chestplate_gold_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/cardboard_chestplate", + "layer1": "create:trims/items/card_chestplate_trim_gold" + } +} diff --git a/src/generated/resources/assets/create/models/item/cardboard_chestplate_iron_trim.json b/src/generated/resources/assets/create/models/item/cardboard_chestplate_iron_trim.json new file mode 100644 index 0000000000..c7689020a0 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard_chestplate_iron_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/cardboard_chestplate", + "layer1": "create:trims/items/card_chestplate_trim_iron" + } +} diff --git a/src/generated/resources/assets/create/models/item/cardboard_chestplate_lapis_trim.json b/src/generated/resources/assets/create/models/item/cardboard_chestplate_lapis_trim.json new file mode 100644 index 0000000000..87af7953ac --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard_chestplate_lapis_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/cardboard_chestplate", + "layer1": "create:trims/items/card_chestplate_trim_lapis" + } +} diff --git a/src/generated/resources/assets/create/models/item/cardboard_chestplate_netherite_trim.json b/src/generated/resources/assets/create/models/item/cardboard_chestplate_netherite_trim.json new file mode 100644 index 0000000000..62b498f67b --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard_chestplate_netherite_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/cardboard_chestplate", + "layer1": "create:trims/items/card_chestplate_trim_netherite" + } +} diff --git a/src/generated/resources/assets/create/models/item/cardboard_chestplate_quartz_trim.json b/src/generated/resources/assets/create/models/item/cardboard_chestplate_quartz_trim.json new file mode 100644 index 0000000000..ed5250f1da --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard_chestplate_quartz_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/cardboard_chestplate", + "layer1": "create:trims/items/card_chestplate_trim_quartz" + } +} diff --git a/src/generated/resources/assets/create/models/item/cardboard_chestplate_redstone_trim.json b/src/generated/resources/assets/create/models/item/cardboard_chestplate_redstone_trim.json new file mode 100644 index 0000000000..29c960fe99 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard_chestplate_redstone_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/cardboard_chestplate", + "layer1": "create:trims/items/card_chestplate_trim_redstone" + } +} diff --git a/src/generated/resources/assets/create/models/item/cardboard_helmet.json b/src/generated/resources/assets/create/models/item/cardboard_helmet.json index 434b84e5ea..40fc879984 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_helmet.json +++ b/src/generated/resources/assets/create/models/item/cardboard_helmet.json @@ -1,6 +1,68 @@ { "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "create:item/cardboard_helmet_quartz_trim", + "predicate": { + "minecraft:trim_type": 0.1 + } + }, + { + "model": "create:item/cardboard_helmet_iron_trim", + "predicate": { + "minecraft:trim_type": 0.2 + } + }, + { + "model": "create:item/cardboard_helmet_netherite_trim", + "predicate": { + "minecraft:trim_type": 0.3 + } + }, + { + "model": "create:item/cardboard_helmet_redstone_trim", + "predicate": { + "minecraft:trim_type": 0.4 + } + }, + { + "model": "create:item/cardboard_helmet_copper_trim", + "predicate": { + "minecraft:trim_type": 0.5 + } + }, + { + "model": "create:item/cardboard_helmet_gold_trim", + "predicate": { + "minecraft:trim_type": 0.6 + } + }, + { + "model": "create:item/cardboard_helmet_emerald_trim", + "predicate": { + "minecraft:trim_type": 0.7 + } + }, + { + "model": "create:item/cardboard_helmet_diamond_trim", + "predicate": { + "minecraft:trim_type": 0.8 + } + }, + { + "model": "create:item/cardboard_helmet_lapis_trim", + "predicate": { + "minecraft:trim_type": 0.9 + } + }, + { + "model": "create:item/cardboard_helmet_amethyst_trim", + "predicate": { + "minecraft:trim_type": 1.0 + } + } + ], "textures": { "layer0": "create:item/cardboard_helmet" } -} \ No newline at end of file +} diff --git a/src/generated/resources/assets/create/models/item/cardboard_helmet_amethyst_trim.json b/src/generated/resources/assets/create/models/item/cardboard_helmet_amethyst_trim.json new file mode 100644 index 0000000000..d3159ce3d9 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard_helmet_amethyst_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/cardboard_helmet", + "layer1": "create:trims/items/card_helmet_trim_amethyst" + } +} diff --git a/src/generated/resources/assets/create/models/item/cardboard_helmet_copper_trim.json b/src/generated/resources/assets/create/models/item/cardboard_helmet_copper_trim.json new file mode 100644 index 0000000000..a6c00a6e2a --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard_helmet_copper_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/cardboard_helmet", + "layer1": "create:trims/items/card_helmet_trim_copper" + } +} diff --git a/src/generated/resources/assets/create/models/item/cardboard_helmet_diamond_trim.json b/src/generated/resources/assets/create/models/item/cardboard_helmet_diamond_trim.json new file mode 100644 index 0000000000..06d1e09f6f --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard_helmet_diamond_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/cardboard_helmet", + "layer1": "create:trims/items/card_helmet_trim_diamond" + } +} diff --git a/src/generated/resources/assets/create/models/item/cardboard_helmet_emerald_trim.json b/src/generated/resources/assets/create/models/item/cardboard_helmet_emerald_trim.json new file mode 100644 index 0000000000..67a280d34c --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard_helmet_emerald_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/cardboard_helmet", + "layer1": "create:trims/items/card_helmet_trim_emerald" + } +} diff --git a/src/generated/resources/assets/create/models/item/cardboard_helmet_gold_trim.json b/src/generated/resources/assets/create/models/item/cardboard_helmet_gold_trim.json new file mode 100644 index 0000000000..b0245d1cb7 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard_helmet_gold_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/cardboard_helmet", + "layer1": "create:trims/items/card_helmet_trim_gold" + } +} diff --git a/src/generated/resources/assets/create/models/item/cardboard_helmet_iron_trim.json b/src/generated/resources/assets/create/models/item/cardboard_helmet_iron_trim.json new file mode 100644 index 0000000000..7871e0b367 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard_helmet_iron_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/cardboard_helmet", + "layer1": "create:trims/items/card_helmet_trim_iron" + } +} diff --git a/src/generated/resources/assets/create/models/item/cardboard_helmet_lapis_trim.json b/src/generated/resources/assets/create/models/item/cardboard_helmet_lapis_trim.json new file mode 100644 index 0000000000..0c83e5f246 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard_helmet_lapis_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/cardboard_helmet", + "layer1": "create:trims/items/card_helmet_trim_lapis" + } +} diff --git a/src/generated/resources/assets/create/models/item/cardboard_helmet_netherite_trim.json b/src/generated/resources/assets/create/models/item/cardboard_helmet_netherite_trim.json new file mode 100644 index 0000000000..49cb173237 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard_helmet_netherite_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/cardboard_helmet", + "layer1": "create:trims/items/card_helmet_trim_netherite" + } +} diff --git a/src/generated/resources/assets/create/models/item/cardboard_helmet_quartz_trim.json b/src/generated/resources/assets/create/models/item/cardboard_helmet_quartz_trim.json new file mode 100644 index 0000000000..6bc7f901e2 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard_helmet_quartz_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/cardboard_helmet", + "layer1": "create:trims/items/card_helmet_trim_quartz" + } +} diff --git a/src/generated/resources/assets/create/models/item/cardboard_helmet_redstone_trim.json b/src/generated/resources/assets/create/models/item/cardboard_helmet_redstone_trim.json new file mode 100644 index 0000000000..75324161f2 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard_helmet_redstone_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/cardboard_helmet", + "layer1": "create:trims/items/card_helmet_trim_redstone" + } +} diff --git a/src/generated/resources/assets/create/models/item/cardboard_leggings.json b/src/generated/resources/assets/create/models/item/cardboard_leggings.json index ac0b435a81..c88b0a98e4 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_leggings.json +++ b/src/generated/resources/assets/create/models/item/cardboard_leggings.json @@ -1,6 +1,68 @@ { "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "create:item/cardboard_leggings_quartz_trim", + "predicate": { + "minecraft:trim_type": 0.1 + } + }, + { + "model": "create:item/cardboard_leggings_iron_trim", + "predicate": { + "minecraft:trim_type": 0.2 + } + }, + { + "model": "create:item/cardboard_leggings_netherite_trim", + "predicate": { + "minecraft:trim_type": 0.3 + } + }, + { + "model": "create:item/cardboard_leggings_redstone_trim", + "predicate": { + "minecraft:trim_type": 0.4 + } + }, + { + "model": "create:item/cardboard_leggings_copper_trim", + "predicate": { + "minecraft:trim_type": 0.5 + } + }, + { + "model": "create:item/cardboard_leggings_gold_trim", + "predicate": { + "minecraft:trim_type": 0.6 + } + }, + { + "model": "create:item/cardboard_leggings_emerald_trim", + "predicate": { + "minecraft:trim_type": 0.7 + } + }, + { + "model": "create:item/cardboard_leggings_diamond_trim", + "predicate": { + "minecraft:trim_type": 0.8 + } + }, + { + "model": "create:item/cardboard_leggings_lapis_trim", + "predicate": { + "minecraft:trim_type": 0.9 + } + }, + { + "model": "create:item/cardboard_leggings_amethyst_trim", + "predicate": { + "minecraft:trim_type": 1.0 + } + } + ], "textures": { "layer0": "create:item/cardboard_leggings" } -} \ No newline at end of file +} diff --git a/src/generated/resources/assets/create/models/item/cardboard_leggings_amethyst_trim.json b/src/generated/resources/assets/create/models/item/cardboard_leggings_amethyst_trim.json new file mode 100644 index 0000000000..3ce0ded782 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard_leggings_amethyst_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/cardboard_leggings", + "layer1": "create:trims/items/card_leggings_trim_amethyst" + } +} diff --git a/src/generated/resources/assets/create/models/item/cardboard_leggings_copper_trim.json b/src/generated/resources/assets/create/models/item/cardboard_leggings_copper_trim.json new file mode 100644 index 0000000000..d85e43b9d0 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard_leggings_copper_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/cardboard_leggings", + "layer1": "create:trims/items/card_leggings_trim_copper" + } +} diff --git a/src/generated/resources/assets/create/models/item/cardboard_leggings_diamond_trim.json b/src/generated/resources/assets/create/models/item/cardboard_leggings_diamond_trim.json new file mode 100644 index 0000000000..625e4a76a7 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard_leggings_diamond_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/cardboard_leggings", + "layer1": "create:trims/items/card_leggings_trim_diamond" + } +} diff --git a/src/generated/resources/assets/create/models/item/cardboard_leggings_emerald_trim.json b/src/generated/resources/assets/create/models/item/cardboard_leggings_emerald_trim.json new file mode 100644 index 0000000000..4b1b47f267 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard_leggings_emerald_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/cardboard_leggings", + "layer1": "create:trims/items/card_leggings_trim_emerald" + } +} diff --git a/src/generated/resources/assets/create/models/item/cardboard_leggings_gold_trim.json b/src/generated/resources/assets/create/models/item/cardboard_leggings_gold_trim.json new file mode 100644 index 0000000000..fdeb76e815 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard_leggings_gold_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/cardboard_leggings", + "layer1": "create:trims/items/card_leggings_trim_gold" + } +} diff --git a/src/generated/resources/assets/create/models/item/cardboard_leggings_iron_trim.json b/src/generated/resources/assets/create/models/item/cardboard_leggings_iron_trim.json new file mode 100644 index 0000000000..f30aaa7717 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard_leggings_iron_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/cardboard_leggings", + "layer1": "create:trims/items/card_leggings_trim_iron" + } +} diff --git a/src/generated/resources/assets/create/models/item/cardboard_leggings_lapis_trim.json b/src/generated/resources/assets/create/models/item/cardboard_leggings_lapis_trim.json new file mode 100644 index 0000000000..5c95d2c2a1 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard_leggings_lapis_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/cardboard_leggings", + "layer1": "create:trims/items/card_leggings_trim_lapis" + } +} diff --git a/src/generated/resources/assets/create/models/item/cardboard_leggings_netherite_trim.json b/src/generated/resources/assets/create/models/item/cardboard_leggings_netherite_trim.json new file mode 100644 index 0000000000..49fa37f52b --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard_leggings_netherite_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/cardboard_leggings", + "layer1": "create:trims/items/card_leggings_trim_netherite" + } +} diff --git a/src/generated/resources/assets/create/models/item/cardboard_leggings_quartz_trim.json b/src/generated/resources/assets/create/models/item/cardboard_leggings_quartz_trim.json new file mode 100644 index 0000000000..5892bec5c5 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard_leggings_quartz_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/cardboard_leggings", + "layer1": "create:trims/items/card_leggings_trim_quartz" + } +} diff --git a/src/generated/resources/assets/create/models/item/cardboard_leggings_redstone_trim.json b/src/generated/resources/assets/create/models/item/cardboard_leggings_redstone_trim.json new file mode 100644 index 0000000000..828a419503 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/cardboard_leggings_redstone_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/cardboard_leggings", + "layer1": "create:trims/items/card_leggings_trim_redstone" + } +} diff --git a/src/generated/resources/data/minecraft/tags/items/trimmable_armor.json b/src/generated/resources/data/minecraft/tags/items/trimmable_armor.json new file mode 100644 index 0000000000..5da3556b0e --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/items/trimmable_armor.json @@ -0,0 +1,8 @@ +{ + "values": [ + "create:cardboard_helmet", + "create:cardboard_chestplate", + "create:cardboard_leggings", + "create:cardboard_boots" + ] +} diff --git a/src/main/java/com/simibubi/create/AllItems.java b/src/main/java/com/simibubi/create/AllItems.java index 2b4795bf55..79cb68596e 100644 --- a/src/main/java/com/simibubi/create/AllItems.java +++ b/src/main/java/com/simibubi/create/AllItems.java @@ -29,6 +29,7 @@ import com.simibubi.create.content.equipment.armor.CardboardArmorItem; import com.simibubi.create.content.equipment.armor.CardboardHelmetItem; import com.simibubi.create.content.equipment.armor.DivingBootsItem; import com.simibubi.create.content.equipment.armor.DivingHelmetItem; +import com.simibubi.create.content.equipment.armor.TrimmableArmorModelGenerator; import com.simibubi.create.content.equipment.blueprint.BlueprintItem; import com.simibubi.create.content.equipment.extendoGrip.ExtendoGripItem; import com.simibubi.create.content.equipment.goggles.GogglesItem; @@ -322,25 +323,29 @@ public class AllItems { public static final ItemEntry CARDBOARD_HELMET = REGISTRATE.item("cardboard_helmet", p -> new CardboardHelmetItem(ArmorItem.Type.HELMET, p)) - .tag(forgeItemTag("armors/helmet")) + .tag(forgeItemTag("armors/helmet"), ItemTags.TRIMMABLE_ARMOR) .onRegisterAfter(Registries.ITEM, v -> ItemDescription.useKey(v, "item.create.cardboard_armor")) + .model(TrimmableArmorModelGenerator::generate) .register(), CARDBOARD_CHESTPLATE = REGISTRATE.item("cardboard_chestplate", p -> new CardboardArmorItem(ArmorItem.Type.CHESTPLATE, p)) - .tag(forgeItemTag("armors/chestplate")) + .tag(forgeItemTag("armors/chestplate"), ItemTags.TRIMMABLE_ARMOR) .onRegisterAfter(Registries.ITEM, v -> ItemDescription.useKey(v, "item.create.cardboard_armor")) + .model(TrimmableArmorModelGenerator::generate) .register(), CARDBOARD_LEGGINGS = REGISTRATE.item("cardboard_leggings", p -> new CardboardArmorItem(ArmorItem.Type.LEGGINGS, p)) - .tag(forgeItemTag("armors/leggings")) + .tag(forgeItemTag("armors/leggings"), ItemTags.TRIMMABLE_ARMOR) .onRegisterAfter(Registries.ITEM, v -> ItemDescription.useKey(v, "item.create.cardboard_armor")) + .model(TrimmableArmorModelGenerator::generate) .register(), CARDBOARD_BOOTS = REGISTRATE.item("cardboard_boots", p -> new CardboardArmorItem(ArmorItem.Type.BOOTS, p)) - .tag(forgeItemTag("armors/boots")) + .tag(forgeItemTag("armors/boots"), ItemTags.TRIMMABLE_ARMOR) .onRegisterAfter(Registries.ITEM, v -> ItemDescription.useKey(v, "item.create.cardboard_armor")) + .model(TrimmableArmorModelGenerator::generate) .register(); public static final ItemEntry SAND_PAPER = REGISTRATE.item("sand_paper", SandPaperItem::new) @@ -422,7 +427,7 @@ public class AllItems { packageItem.register(); } } - + public static final ItemEntry FILTER = REGISTRATE.item("filter", FilterItem::regular) .lang("List Filter") .register(), diff --git a/src/main/java/com/simibubi/create/content/equipment/armor/TrimmableArmorModelGenerator.java b/src/main/java/com/simibubi/create/content/equipment/armor/TrimmableArmorModelGenerator.java new file mode 100644 index 0000000000..9f01f16b33 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/equipment/armor/TrimmableArmorModelGenerator.java @@ -0,0 +1,41 @@ +package com.simibubi.create.content.equipment.armor; + +import com.simibubi.create.Create; +import com.simibubi.create.foundation.mixin.accessor.ItemModelGeneratorsAccessor; +import com.simibubi.create.foundation.mixin.accessor.ModelBuilderAccessor; +import com.tterrag.registrate.providers.DataGenContext; +import com.tterrag.registrate.providers.RegistrateItemModelProvider; + +import net.minecraft.data.models.ItemModelGenerators; +import net.minecraft.data.models.model.ModelLocationUtils; +import net.minecraft.data.models.model.TextureMapping; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.Item; +import net.minecraftforge.client.model.generators.ItemModelBuilder; + +public class TrimmableArmorModelGenerator { + public static void generate(DataGenContext c, RegistrateItemModelProvider p) { + T item = c.get(); + ItemModelBuilder builder = p.generated(c); + for (ItemModelGenerators.TrimModelData data : ItemModelGeneratorsAccessor.create$getGENERATED_TRIM_MODELS()) { + ResourceLocation modelLoc = ModelLocationUtils.getModelLocation(item); + ResourceLocation textureLoc = TextureMapping.getItemTexture(item); + String trimId = data.name(item.getMaterial()); + ResourceLocation trimModelLoc = modelLoc.withSuffix("_" + trimId + "_trim"); + ResourceLocation trimLoc = + new ResourceLocation("trims/items/" + item.getType().getName() + "_trim_" + trimId); + String parent = "item/generated"; + if (item.getMaterial() == AllArmorMaterials.CARDBOARD) { + trimLoc = Create.asResource("trims/items/card_" + item.getType().getName() + "_trim_" + trimId); + } + ItemModelBuilder itemModel = p.withExistingParent(trimModelLoc.getPath(), parent) + .texture("layer0", textureLoc); + ((ModelBuilderAccessor) itemModel).create$getTextures().put("layer1", trimLoc.toString()); + builder.override() + .predicate(ItemModelGenerators.TRIM_TYPE_PREDICATE_ID, data.itemModelIndex()) + .model(itemModel) + .end(); + } + } +} diff --git a/src/main/java/com/simibubi/create/foundation/mixin/ArmorTrimMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/ArmorTrimMixin.java new file mode 100644 index 0000000000..b040215546 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/mixin/ArmorTrimMixin.java @@ -0,0 +1,23 @@ +package com.simibubi.create.foundation.mixin; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import com.llamalad7.mixinextras.sugar.Local; +import com.simibubi.create.Create; +import com.simibubi.create.content.equipment.armor.AllArmorMaterials; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ArmorMaterial; +import net.minecraft.world.item.armortrim.ArmorTrim; + +@Mixin(ArmorTrim.class) +public class ArmorTrimMixin { + @ModifyExpressionValue(method = {"lambda$new$2", "lambda$new$4"}, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/armortrim/TrimPattern;assetId()Lnet/minecraft/resources/ResourceLocation;")) + private ResourceLocation create$swapTexturesForCardboardTrims(ResourceLocation original, @Local(argsOnly = true) ArmorMaterial armorMaterial) { + if (armorMaterial == AllArmorMaterials.CARDBOARD) + return Create.asResource("card_" + original.getPath()); + return original; + } +} diff --git a/src/main/java/com/simibubi/create/foundation/mixin/accessor/ItemModelGeneratorsAccessor.java b/src/main/java/com/simibubi/create/foundation/mixin/accessor/ItemModelGeneratorsAccessor.java new file mode 100644 index 0000000000..df4f4e7124 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/mixin/accessor/ItemModelGeneratorsAccessor.java @@ -0,0 +1,16 @@ +package com.simibubi.create.foundation.mixin.accessor; + +import net.minecraft.data.models.ItemModelGenerators; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.List; + +@Mixin(ItemModelGenerators.class) +public interface ItemModelGeneratorsAccessor { + @Accessor("GENERATED_TRIM_MODELS") + static List create$getGENERATED_TRIM_MODELS() { + throw new AssertionError(); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/mixin/accessor/ModelBuilderAccessor.java b/src/main/java/com/simibubi/create/foundation/mixin/accessor/ModelBuilderAccessor.java new file mode 100644 index 0000000000..86356ac459 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/mixin/accessor/ModelBuilderAccessor.java @@ -0,0 +1,14 @@ +package com.simibubi.create.foundation.mixin.accessor; + +import net.minecraftforge.client.model.generators.ModelBuilder; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.Map; + +@Mixin(ModelBuilder.class) +public interface ModelBuilderAccessor { + @Accessor(value = "textures", remap = false) + Map create$getTextures(); +} diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index dd45123ce9..56dcc8a224 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -35,3 +35,5 @@ public net.minecraft.client.gui.components.CommandSuggestions f_93866_ # suggest public net.minecraft.client.gui.components.CommandSuggestions$SuggestionsList (Lnet/minecraft/client/gui/components/CommandSuggestions;IIILjava/util/List;Z)V # public-f net.minecraft.data.recipes.RecipeProvider m_6055_()Ljava/lang/String; # getName + +public net.minecraft.data.models.ItemModelGenerators$TrimModelData diff --git a/src/main/resources/assets/create/textures/trims/items/card_boots_trim.png b/src/main/resources/assets/create/textures/trims/items/card_boots_trim.png new file mode 100644 index 0000000000000000000000000000000000000000..de10177ad626ae70f633958b478aad6c28bfe7a1 GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPRkC+g*(WV2M5kMhRPZ!4!i_^&o60D08DjJ#D`ToRj zNH|y@bk*>n1ize(!YQRWuS7&d{%LDy{82yD^FP4GgMs1jVKM9TH8VZ|4Pfwe^>bP0 Hl+XkKUKKCR literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/trims/items/card_chestplate_trim.png b/src/main/resources/assets/create/textures/trims/items/card_chestplate_trim.png new file mode 100644 index 0000000000000000000000000000000000000000..daa386da4a74cb0804f7066c83d62026dab9209f GIT binary patch literal 193 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPRkC+gTVx|2*N1%|Or;B5V#p$~fH}W1Z5MU})ODu6q z7LHlk`T3H2k#KO3f<=R|tC8&bDN9Oh7E_onoD2zlFF8Nr&zE}7jeFm0nQP9r hn5(*Nf=qkSY@1>=tGAsiw*pOO@O1TaS?83{1ONj1JNp0t literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/trims/items/card_helmet_trim.png b/src/main/resources/assets/create/textures/trims/items/card_helmet_trim.png new file mode 100644 index 0000000000000000000000000000000000000000..f4ab7d18c436e3ef3cb46593e41464365fb76c78 GIT binary patch literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPRkC+gT*{?U%Z9pMwPZ!4!i_>o}7z#2Na5x7Rd|Ikt z8Z@Cv*sA#YJK2ilNt$V|jUBvSh3l_uy!bnJ#!TLxHLG-#YVzaE*{7}JuhZ1Jc^7C5 NgQu&X%Q~loCICCMG|&J5 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/trims/items/card_leggings_trim.png b/src/main/resources/assets/create/textures/trims/items/card_leggings_trim.png new file mode 100644 index 0000000000000000000000000000000000000000..64b32a66651400be5e221983767cedcb77892edd GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPRkC+gz{6g1DtARqgo-U3d7N?UFBv=si{E6R? yaIik+Q-GyNrJ7D#f<}wvngt6Cq)s&pF))Z-5%_(2rdBRcBZH@_pUXO@geCyY11n7c literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/trims/models/armor/card_coast.png b/src/main/resources/assets/create/textures/trims/models/armor/card_coast.png new file mode 100644 index 0000000000000000000000000000000000000000..3aed54bc4a9d6b933666dcd5384d3150ea54f61c GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQqw$L978f1-(Ek>dDuXp<)Pt{ z3A(OJSBOkq7PL(GX_BP(4*`yYMnCsoRw`?iTRst}apMYeD?edt1Fq!*7z@BGgE=b6Mw< G&;$V3Emnj8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/trims/models/armor/card_coast_leggings.png b/src/main/resources/assets/create/textures/trims/models/armor/card_coast_leggings.png new file mode 100644 index 0000000000000000000000000000000000000000..ccbf41e547212157a915efc1943a70a49c1315cd GIT binary patch literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQWc&qjv*P1Z?7KYJZvD~a?xeh_0LLI@#*5b~v@cRMhH zyH{1+p8<%fimJZs|Hlgept`%5*`2SYl&Y$dbAB3wyH^pB5D|cgh~%8pM+wl*G=P1k z9|c)T*#m38Ywg{=0(dCk+XaZABjDcAqeNgcV}^i)5JCtcRe?(awT04jibWrg;$ zV$i6+0{}x2n({Sm*Z(e40sL`(B*0PoGg-0%f~}RkYeh%6`yu-?_+2q*EdS`nX65+ZU$*vBEr6)gD$`lQz<#U3+D+iHoO;N^3HSyCybnpx_TPR=<+CLX=N d%27hra05Dw*Maq;6R7|I002ovPDHLkV1mW7lqdiI literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/trims/models/armor/card_dune_leggings.png b/src/main/resources/assets/create/textures/trims/models/armor/card_dune_leggings.png new file mode 100644 index 0000000000000000000000000000000000000000..8982688b492202d6e8e894121b4f8aaf6445b813 GIT binary patch literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQjMN2jv*P1Z?B%^Y%t(ydwAa0 z$jkj@hOFx16yd!RfeYhYK0dG2Yu$E1Wr_>1>;;@Yjf+zk1p zk;%p1eT8+G+HC5K6ADqwPit0jJyH?UQo8X{tgH3k16CE~*XR70RC7w{Oy|>ko8BGI g>3g{R-<rPkKl58y*p+V^v7Z6zX_&97sjRfU*k#EQn{GysK;|9W z>i6gWY}xTU?#JU<8$@+7=QpfY^Eg#_cjEGyH(%f8UdN@qbk4C|)ph@Vhh@iRt@U=9 zu|#J1i}hQsUCOCtdt8?nW`3K?JoZa?x;! zz|>7kb2Rl_m#&!dGNpKu;)59tCr|#5En``1>%|1r0Rj&Ux1EXErs^qJxF@;iZC2s^ z@1laUisQa9*aU~J-TcQlZQbTS`RjMfhg{vHdt2UpOY!-;lS@i=U;ce|n^E!Kq8`RO ZpV;cBm?aciRm=mK=jrO_vd$@?2>_LhMw$Qs literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/trims/models/armor/card_host.png b/src/main/resources/assets/create/textures/trims/models/armor/card_host.png new file mode 100644 index 0000000000000000000000000000000000000000..e4a51418e1295ce8ea552e652b946da588a99236 GIT binary patch literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQjxu_^D zt6lr`iq7v-fWsR)1w^kgs5h+3wmBVsRg66$68(tDnm{r-UW| DW>8bl literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/trims/models/armor/card_host_leggings.png b/src/main/resources/assets/create/textures/trims/models/armor/card_host_leggings.png new file mode 100644 index 0000000000000000000000000000000000000000..dae7322d324b3609b704cabd7ccc88f240fa1057 GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQVpIijv*P1Z?7KYJZ!+zn#gL^ z;r1~@>TT~L-z$^5yo)(n8fO2w?`n49*fmEZW}pTTcwlJec~!dn{SH}6ot4KV+Ka-! z&a%I7^u(FI`A6c)-y|^}u;0C=*?U#ql$n{U{kkvrcXb&3p2zj>-{(Znt>&T6{@Nt| g+Sd`WsbKp@wuN(yp09evzyUJX)78&qol`;+0J*zMKmY&$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/trims/models/armor/card_raiser.png b/src/main/resources/assets/create/textures/trims/models/armor/card_raiser.png new file mode 100644 index 0000000000000000000000000000000000000000..03960da326d452fcd89d5226f5a6c66738807379 GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQcFBt978f1-`+ULdsu;oHDGh6 zd!k7Hqd;_xj+1b2*=Nl&4dgRfUjo<6eyi7JuyO#Dh_3P35meV^x z;F{s>)A@V%_dj7YVUSnfJ#+Epd)wBDm25MJu47FX=XFo6|IJ;~eR0)~Z7(e2@|G2{ TI9@XWxtGDy)z4*}Q$iB}ky2g3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/trims/models/armor/card_raiser_leggings.png b/src/main/resources/assets/create/textures/trims/models/armor/card_raiser_leggings.png new file mode 100644 index 0000000000000000000000000000000000000000..a4379767c2a20b02e383a0638c18cc86f8e53149 GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQeB=djv*P1Z?Bx@bXF8_dwAbZ zC)I1?6wOqxnL*2hHyh13&C4>W_eqUH*ZQXuf$G8FhxFOI%T>PK`+o78x1eG5d!x(b7xx+JkU*4{SG<;?ECXXgCoc~BA0p40PD=;Bth&0(Rh*R0L(3JT3!dwqAdk8)Dj q)H{FAoOrkJkIJm-iu8# zn=bc6k^Vy(az|%h@YW6FdbzOoR@eW&&gPCEohi&NE-qVEKfWz(u$hfPu(5-Ip@YMP zrE>2ztGnr%OTU(Gejc7ZBl7gGwSQfh;^xM=9Jnk0ZPlvWQ0sNcX_vpB`637g7xV7r zwVz$H)0)8{l+kAUhUC{)*LMHjayRs9ss4IWwBy_*8_i*@H>00000 LNkvXXu0mjf_F8Ol literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/trims/models/armor/card_sentry_leggings.png b/src/main/resources/assets/create/textures/trims/models/armor/card_sentry_leggings.png new file mode 100644 index 0000000000000000000000000000000000000000..8de088331ad265dc7a0aeb15d7a3e16e6cb19e7c GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQbnFFjv*P1Z!a9=WH#h+x%l2M zq|2*NGrG$=Q1jIh%UlJ4Z`(K(|IclikRUNZ#d8t}z0B_^j>vx7p>d%0(G zq!o-U-`k6R<6FGS%)y1>!rk*iyMCv}hq|yFFXU-hy{PV1RCc{}vx?{UYKHCC)E>3C S9RCBfox#)9&t;ucLK6VKU_Y7w literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/trims/models/armor/card_shaper.png b/src/main/resources/assets/create/textures/trims/models/armor/card_shaper.png new file mode 100644 index 0000000000000000000000000000000000000000..889a5a8c5056644e06394a8e14b064528e7a86e9 GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQe~bljv*P1Z!c`*Wj5q-4!ox( z<-0gTr2m+2$y8qR=`s@zx&F&mIiRQE1yo%B%1Sn2`b=5DE)LJA;&+0Do|E2g+k5X> zUi3E8V->a6KQgV#lKrf^>zsskyZ#dVGeq)`bhq3Xuh8mOKTc*n!9@FqV-TF=bS%z8r e8^I>A_oa-V8I4$7Rhs-jrh2;ixvXt-ik%_-%sOU~(2a)DB@86;MdmMxI*mE=!DM3D5z z%u)Ncz_jA7Qr()by0UBVyDYboUVv zQ$b8+nX+!V$2zw^3%j+;tg03(9=))rZ+DoJN5r%q=J5=KRMeR`DtU!N0p=*~XXv0000oNG*tBVa zjOFYM0)jInl{ST#&Xhc}=U>{Z^ADAk7#RNEJe~S)&H7XC&#aZ!+?=+pYVWVk7b{MR zpZh8##$Zs))UZ4M_Rd>X4Zi|k-YS1~g+*}c&sXQyz5lB;>ARWB5wRs54XgARR#Y!* zihTNQZ)`#Jh3uZy5e$=N%7^WmY2VuMX`TJmnUQ7AN}t|Vh%UJlpZh2CN+2VHpl9ga zSMTP%+jlk8H2e6K-Ld&;nQ7L4w{HHQ^tFyj@a?6Hsr}k-;+fOje#b>5M=Ol^>bP0l+XkKQy8OK literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/trims/models/armor/card_snout.png b/src/main/resources/assets/create/textures/trims/models/armor/card_snout.png new file mode 100644 index 0000000000000000000000000000000000000000..87ef3bbe96430833313c1129d257f6c22c496de5 GIT binary patch literal 270 zcmV+p0rCEcP)L4D4Q8EgncodIvo6wKODoRk*5|Xy+y)Pt`BM=nH79k=cBBIYSvjU(1 zD7_i+yqUe6ap_%bGynqN^qlMN6$b$z?k=j@o#F1o4w8t7h=_=&OO&_n{#JQPC!6*L z-0S+3(q_}{Ue@(~eQ4{9 zob#a@4~HybW+lF=$fHZsx+Py}Z*T6GG+Sc-)K;3@y~Ji!Ra)avU+EaPesI6!1}ImO UqgYDZCjbBd07*qoM6N<$f_2e&&j0`b literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/trims/models/armor/card_snout_leggings.png b/src/main/resources/assets/create/textures/trims/models/armor/card_snout_leggings.png new file mode 100644 index 0000000000000000000000000000000000000000..9cc839576689a86c85170743b51289ea05d06a6f GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQhA;(jv*P1Z?7KYZBXE8efUU4 z_G|B@i#J&OrJCLJO;>*Wucy*7vhZSSjP=v1NFs|RIL~6p0D-xU0Rs6;LASUO+~kB-o~D5-@8jvbj=(di&Y NJYD@<);T3K0RSqLKAZpm literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/trims/models/armor/card_spire.png b/src/main/resources/assets/create/textures/trims/models/armor/card_spire.png new file mode 100644 index 0000000000000000000000000000000000000000..af0a879ed45d5e4f36b95cb6ca78a4f4a309a5ec GIT binary patch literal 268 zcmV+n0rUQeP)(+P927P2=+j3kb;@Vt{ieIOFjK{68&5fQnm>FNz+ zW<`XVnYsJaW8)ZiH+NsnBWWa8v3Z`SrLWA)0IcTr^?N_b>kH70nlf)cl@$bh=DbWBM4MT(ayyt06N`IS3@!uid(4^O8Te;;-JU_BS^6EY~=x zq@+FBL4D)qh=J3@;6B@ZADvzOlqT8@jIbNAozsD7NrExTI-sz5jTsAcmtps z8xbM^B2tZw2oZp%5CP;2a1p_`98dA5^ys9cIy9@d-17H^tbHORXF*o_v*V&L$lY{ f*tesyD2$R(I!Z>#Ch>)GdT8|U!X5sGS?xd<8$8qT&X094!DJ5!KDP;{F00000M&j=APFrPWn{&_FGF&rm zx}>SW%+qolt+dtMHvxYu%}tpAGb0gMpZXHu%j=KK>(i=1RSgj#GpohS(3NKjGmHBw zZbYf&Ff$KdvZntJ5RvRIx};A4GiP_vC3ONuU;ev(;Um_oxdK{y_gU<|0`okddjGxw XIl*#`WM=ea00000NkvXXu0mjfW72Uq literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/trims/models/armor/card_vex_leggings.png b/src/main/resources/assets/create/textures/trims/models/armor/card_vex_leggings.png new file mode 100644 index 0000000000000000000000000000000000000000..ce3279fa0c5ea0c7284af3a4c9d20e7769838564 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQsJI1jv*P1Z?7EWJz&7$9JqRN zMTlFnh?%F^g5_*0f4)C;bQ1$7P#qX}1ck2ch`4OI?@P(yRaPR&e$frNH|<1H-J%`R n{?&2E`9FBYJK^0A<^xB~YC1$XS@`rNK>9pg{an^LB{Ts5)% zYrv@~k1oZWn&PDX#AQma!^A~vZe%=<{UISxu$j@=*m!gIt+4op6y}B?F1OtG`}-Id zTxb6Q`r}!xZRh22WQ%mvv4FO#n}DVDtb0 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/trims/models/armor/card_ward_leggings.png b/src/main/resources/assets/create/textures/trims/models/armor/card_ward_leggings.png new file mode 100644 index 0000000000000000000000000000000000000000..4b90ff25028a51458cb22e6c80071c571896266a GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQnj8gjv*P1Z?7HXWKk4wxj4(m zO2pZ43*XTIE#c=zdvzY=POyDbFTOGGLr|*_P(2vbKc1v=`|`FN?@3Bd=l^WJ6_ysa zze1%UIWE1b$8fc_SLum$-eu2MCGYz#xUeH2yZ0XBxyrfg&&=6f`E=)+pYdz|PuO+8 c+Wr=!`HLnq7R#>I3m{WHUHx3vIVCg!0GA&|?f?J) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/trims/models/armor/card_wayfinder.png b/src/main/resources/assets/create/textures/trims/models/armor/card_wayfinder.png new file mode 100644 index 0000000000000000000000000000000000000000..a7234ebfdce3ef9146063adbe4dba439518be366 GIT binary patch literal 220 zcmV<203-j2P)r)C>lkZsGqWMf}+T$h|}_3f$Rh!e=-vh5fPE=0H}zl%&dqg z&fUGt%y`CmM7-_+*vA;q+gTe~DWM4f*~nPj literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/trims/models/armor/card_wild.png b/src/main/resources/assets/create/textures/trims/models/armor/card_wild.png new file mode 100644 index 0000000000000000000000000000000000000000..b505f66c881ab251d3e681cd7f83cf454e9e7d73 GIT binary patch literal 276 zcmV+v0qg#WP)fC8Ky0Z{mIwM}Vl>s^Zad&reW5c^D;%0}v4r5fNQdIeGw7 zA`-P$)LH?cm%}g=0C4vh>k9ywS&a3_(%sQodwX7o2S8P4llWxtYeXc2)a&wDM9SDl z@AL2g?4`9983=dp!5|_cBBC>J_sH}9UQTly948OpadyvyXKS}_8^~nlSq7KZGPnGG zZNg?2dz{%fYuwCc$;UDvmtba*f1ZBHtKC>tBiH_~D|tII-NdFF)N<3xYo~m#s@GfF a|Ktw7QhXxIT*OWQ00005N zxNB*|tffAhmruU&Zb>;CEf#y?f1^f4Vt|bhP(2vDfAmgLaOdtm*{ Date: Sun, 5 Jan 2025 13:52:33 -0500 Subject: [PATCH 258/515] Mistaken order --- src/main/java/com/simibubi/create/Create.java | 2 +- .../filter/attribute/AllItemAttributeTypes.java | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/simibubi/create/Create.java b/src/main/java/com/simibubi/create/Create.java index 129709054d..c99ffe4234 100644 --- a/src/main/java/com/simibubi/create/Create.java +++ b/src/main/java/com/simibubi/create/Create.java @@ -131,9 +131,9 @@ public class Create { AllConfigs.register(modLoadingContext); - AllItemAttributeTypes.register(modEventBus); AllArmInteractionPointTypes.register(modEventBus); AllFanProcessingTypes.register(modEventBus); + AllItemAttributeTypes.register(modEventBus); BlockSpoutingBehaviour.registerDefaults(); // FIXME: some of these registrations are not thread-safe diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/AllItemAttributeTypes.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/AllItemAttributeTypes.java index 02234d30a9..aa7fd89aca 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/AllItemAttributeTypes.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/AllItemAttributeTypes.java @@ -4,6 +4,9 @@ import java.util.function.BiPredicate; import java.util.function.Predicate; import java.util.function.Supplier; +import com.simibubi.create.content.kinetics.fan.processing.AllFanProcessingTypes.HauntingType; +import com.simibubi.create.content.kinetics.fan.processing.AllFanProcessingTypes.SplashingType; + import org.jetbrains.annotations.ApiStatus; import com.simibubi.create.AllRecipeTypes; @@ -62,8 +65,14 @@ public class AllItemAttributeTypes { EQUIPABLE = singleton("equipable", s -> LivingEntity.getEquipmentSlotForItem(s) .getType() != EquipmentSlot.Type.HAND), FURNACE_FUEL = singleton("furnace_fuel", AbstractFurnaceBlockEntity::isFuel), - WASHABLE = singleton("washable", AllFanProcessingTypes.SPLASHING.get()::canProcess), - HAUNTABLE = singleton("hauntable", AllFanProcessingTypes.HAUNTING.get()::canProcess), + WASHABLE = singleton("washable", (s, l) -> { + SplashingType type = AllFanProcessingTypes.SPLASHING.get(); + return type != null && type.canProcess(s, l); + }), + HAUNTABLE = singleton("hauntable", (s, l) -> { + HauntingType type = AllFanProcessingTypes.HAUNTING.get(); + return type != null && type.canProcess(s, l); + }), CRUSHABLE = singleton("crushable", (s, w) -> testRecipe(s, w, AllRecipeTypes.CRUSHING.getType()) || testRecipe(s, w, AllRecipeTypes.MILLING.getType())), SMELTABLE = singleton("smeltable", (s, w) -> testRecipe(s, w, RecipeType.SMELTING)), From e86fd31a7b69e6143a4b44be454a4339ff496993 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Sun, 5 Jan 2025 22:32:16 +0100 Subject: [PATCH 259/515] Out of sight, out of mind - Stock keeper screen now temporarily fakes item counts after requests until stock info catches up - Boiler gauge now disappears client-side when blocks are clipping into it --- .../content/fluids/tank/BoilerData.java | 19 +++++++++++ .../fluids/tank/FluidTankBlockEntity.java | 7 ++++ .../fluids/tank/FluidTankRenderer.java | 7 ++-- .../logistics/packager/InventorySummary.java | 17 ++++++++++ .../stockTicker/StockKeeperRequestScreen.java | 33 +++++++++++++++++-- 5 files changed, 79 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/fluids/tank/BoilerData.java b/src/main/java/com/simibubi/create/content/fluids/tank/BoilerData.java index 43c380b5ea..14c65ca779 100644 --- a/src/main/java/com/simibubi/create/content/fluids/tank/BoilerData.java +++ b/src/main/java/com/simibubi/create/content/fluids/tank/BoilerData.java @@ -36,6 +36,7 @@ import net.minecraft.sounds.SoundSource; import net.minecraft.util.Mth; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.IFluidHandler; @@ -66,6 +67,7 @@ public class BoilerData { private int maxHeatForWater = 0; private int minValue = 0; private int maxValue = 0; + public boolean[] occludedDirections = { true, true, true, true }; public LerpedFloat gauge = LerpedFloat.linear(); @@ -124,6 +126,23 @@ public class BoilerData { controller.notifyUpdate(); } + public void updateOcclusion(FluidTankBlockEntity controller) { + if (!controller.getLevel().isClientSide) + return; + if (attachedEngines + attachedWhistles == 0) + return; + for (Direction d : Iterate.horizontalDirections) { + AABB aabb = + new AABB(controller.getBlockPos()).move(controller.width / 2f - .5f, 0, controller.width / 2f - .5f) + .deflate(5f / 8); + aabb = aabb.move(d.getStepX() * (controller.width / 2f + 1 / 4f), 0, + d.getStepZ() * (controller.width / 2f + 1 / 4f)); + aabb = aabb.inflate(Math.abs(d.getStepZ()) / 2f, 0.25f, Math.abs(d.getStepX()) / 2f); + occludedDirections[d.get2DDataValue()] = !controller.getLevel() + .noCollision(aabb); + } + } + public void queueSoundOnSide(BlockPos pos, Direction side) { SoundPool pool = pools.get(side); if (pool == null) { diff --git a/src/main/java/com/simibubi/create/content/fluids/tank/FluidTankBlockEntity.java b/src/main/java/com/simibubi/create/content/fluids/tank/FluidTankBlockEntity.java index b0de7c934b..d922cb1df0 100644 --- a/src/main/java/com/simibubi/create/content/fluids/tank/FluidTankBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/fluids/tank/FluidTankBlockEntity.java @@ -118,6 +118,13 @@ public class FluidTankBlockEntity extends SmartBlockEntity implements IHaveGoggl if (isController()) boiler.tick(this); } + + @Override + public void lazyTick() { + super.lazyTick(); + if (isController()) + boiler.updateOcclusion(this); + } @Override public BlockPos getLastKnownPos() { diff --git a/src/main/java/com/simibubi/create/content/fluids/tank/FluidTankRenderer.java b/src/main/java/com/simibubi/create/content/fluids/tank/FluidTankRenderer.java index 002e99dbb9..74c693385b 100644 --- a/src/main/java/com/simibubi/create/content/fluids/tank/FluidTankRenderer.java +++ b/src/main/java/com/simibubi/create/content/fluids/tank/FluidTankRenderer.java @@ -91,15 +91,18 @@ public class FluidTankRenderer extends SafeBlockEntityRenderer stacks = items.get(stack.getItem()); + if (stacks == null) + return false; + for (Iterator iterator = stacks.iterator(); iterator.hasNext();) { + BigItemStack existing = iterator.next(); + ItemStack existingStack = existing.stack; + if (!ItemHandlerHelper.canItemStacksStack(existingStack, stack)) + continue; + totalCount -= existing.count; + iterator.remove(); + return true; + } + return false; + } + public int getCountOf(ItemStack stack) { List list = items.get(stack.getItem()); if (list == null) diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperRequestScreen.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperRequestScreen.java index a1b097e1d2..0edb1c8967 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperRequestScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperRequestScreen.java @@ -138,6 +138,7 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen extraAreas = Collections.emptyList(); private Set hiddenCategories; + private InventorySummary forcedEntries; public StockKeeperRequestScreen(StockKeeperRequestMenu container, Inventory inv, Component title) { super(container, inv, title); @@ -161,6 +162,8 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen(blockEntity.hiddenCategoriesByPlayer.getOrDefault(menu.player.getUUID(), List.of())); + + forcedEntries = new InventorySummary(); itemToProgram = menu.player.getMainHandItem(); encodeRequester = @@ -387,6 +390,16 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen list : displayedItems) allEmpty &= list.isEmpty(); @@ -777,8 +790,14 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen Date: Mon, 6 Jan 2025 11:18:08 +0100 Subject: [PATCH 260/515] The pain chain - Fixed chain conveyor chains getting culled while in view - Chain conveyor riding now updates the player visual instantly after dismount - Fixed chain conveyor riding animation stopping when too far from the controlling block - Added sounds for stock keeper and ticker ui --- .../content/fluids/tank/BoilerData.java | 10 +++---- .../ChainConveyorBlockEntity.java | 5 +++- .../ChainConveyorConnectionPacket.java | 4 +++ .../chainConveyor/ChainConveyorRenderer.java | 2 +- .../ChainConveyorRidingHandler.java | 28 +++++++++++++------ .../ServerChainConveyorHandler.java | 5 ++++ .../ServerboundChainConveyorRidingPacket.java | 25 ++++++++++++++--- .../StockKeeperCategoryScreen.java | 11 ++++++-- .../stockTicker/StockKeeperRequestScreen.java | 28 +++++++++++++++++-- .../gui/menu/AbstractSimiContainerScreen.java | 9 ++++++ 10 files changed, 104 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/fluids/tank/BoilerData.java b/src/main/java/com/simibubi/create/content/fluids/tank/BoilerData.java index 14c65ca779..eaacdc44f8 100644 --- a/src/main/java/com/simibubi/create/content/fluids/tank/BoilerData.java +++ b/src/main/java/com/simibubi/create/content/fluids/tank/BoilerData.java @@ -10,7 +10,6 @@ import org.jetbrains.annotations.NotNull; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllSoundEvents; -import com.simibubi.create.Create; import com.simibubi.create.content.decoration.steamWhistle.WhistleBlock; import com.simibubi.create.content.decoration.steamWhistle.WhistleBlockEntity; import com.simibubi.create.content.kinetics.BlockStressValues; @@ -88,12 +87,13 @@ public class BoilerData { public void tick(FluidTankBlockEntity controller) { if (!isActive()) return; - if (controller.getLevel().isClientSide) { - pools.values().forEach(p -> p.play(controller.getLevel())); + Level level = controller.getLevel(); + if (level.isClientSide) { + pools.values().forEach(p -> p.play(level)); gauge.tickChaser(); float current = gauge.getValue(1); - if (current > 1 && Create.RANDOM.nextFloat() < 1 / 2f) - gauge.setValueNoUpdate(current + Math.min(-(current - 1) * Create.RANDOM.nextFloat(), 0)); + if (current > 1 && level.random.nextFloat() < 1 / 2f) + gauge.setValueNoUpdate(current + Math.min(-(current - 1) * level.random.nextFloat(), 0)); return; } if (needsHeatLevelUpdate && updateTemperature(controller)) diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java index c8220c415e..f265edf1a8 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java @@ -23,7 +23,6 @@ import com.simibubi.create.content.logistics.box.PackageEntity; import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.content.logistics.packagePort.frogport.FrogportBlockEntity; import com.simibubi.create.content.schematics.requirement.ItemRequirement; -import com.simibubi.create.content.schematics.requirement.ItemRequirement.ItemUseType; import com.simibubi.create.foundation.utility.ServerSpeedProvider; import com.simibubi.create.infrastructure.config.AllConfigs; @@ -692,6 +691,7 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity implements ITra if (clientPacket && compound.contains("DestroyEffect") && level != null) spawnDestroyParticles(NbtUtils.readBlockPos(compound.getCompound("DestroyEffect"))); + int sizeBefore = connections.size(); connections.clear(); NBTHelper.iterateCompoundList(compound.getList("Connections", Tag.TAG_COMPOUND), c -> connections.add(NbtUtils.readBlockPos(c))); @@ -704,6 +704,9 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity implements ITra connectionStats = null; updateBoxWorldPositions(); updateChainShapes(); + + if (connections.size() != sizeBefore && level.isClientSide) + invalidateRenderBoundingBox(); } public float wrapAngle(float angle) { diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorConnectionPacket.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorConnectionPacket.java index ee9910e796..764a14a3a8 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorConnectionPacket.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorConnectionPacket.java @@ -6,6 +6,8 @@ import com.simibubi.create.infrastructure.config.AllConfigs; import net.minecraft.core.BlockPos; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; @@ -72,6 +74,8 @@ public class ChainConveyorConnectionPacket extends BlockEntityConfigurationPacke } } be.chainDestroyed(targetPos.subtract(be.getBlockPos()), false, true); + be.getLevel() + .playSound(null, player.blockPosition(), SoundEvents.CHAIN_BREAK, SoundSource.BLOCKS); } if (connect) { diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRenderer.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRenderer.java index 71024d1232..e87224acf7 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRenderer.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRenderer.java @@ -253,7 +253,7 @@ public class ChainConveyorRenderer extends KineticBlockEntityRenderer 3) { - ridingChainConveyor = null; - ridingConnection = null; + if (catchingUp == 0 && (diff.length() > 3 || diff.y < -1)) { + stopRiding(); return; } @@ -96,7 +97,18 @@ public class ChainConveyorRidingHandler { .add(diff.scale(0.25))); if (AnimationTickHolder.getTicks() % 10 == 0) AllPackets.getChannel() - .sendToServer(new ServerboundChainConveyorRidingPacket(ridingChainConveyor)); + .sendToServer(new ServerboundChainConveyorRidingPacket(ridingChainConveyor, false)); + } + + private static void stopRiding() { + if (ridingChainConveyor != null) + AllPackets.getChannel() + .sendToServer(new ServerboundChainConveyorRidingPacket(ridingChainConveyor, true)); + ridingChainConveyor = null; + ridingConnection = null; + Minecraft.getInstance() + .getSoundManager() + .play(SimpleSoundInstance.forUI(SoundEvents.CHAIN_HIT, 0.75f, 0.35f)); } private static void updateTargetPosition(Minecraft mc, ChainConveyorBlockEntity clbe) { diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ServerChainConveyorHandler.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ServerChainConveyorHandler.java index d0a1bef4b3..6e62826c21 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ServerChainConveyorHandler.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ServerChainConveyorHandler.java @@ -25,6 +25,11 @@ public class ServerChainConveyorHandler { if (hangingPlayers.size() != count) sync(); } + + public static void handleStopRidingPacket(Player player) { + if (hangingPlayers.removeInt(player.getUUID()) != 0) + sync(); + } public static void tick() { ticks++; diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ServerboundChainConveyorRidingPacket.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ServerboundChainConveyorRidingPacket.java index 97fbd1f153..23defe3d7b 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ServerboundChainConveyorRidingPacket.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ServerboundChainConveyorRidingPacket.java @@ -1,6 +1,7 @@ package com.simibubi.create.content.kinetics.chainConveyor; import com.simibubi.create.foundation.networking.BlockEntityConfigurationPacket; +import com.simibubi.create.infrastructure.config.AllConfigs; import net.minecraft.core.BlockPos; import net.minecraft.network.FriendlyByteBuf; @@ -8,8 +9,11 @@ import net.minecraft.server.level.ServerPlayer; public class ServerboundChainConveyorRidingPacket extends BlockEntityConfigurationPacket { - public ServerboundChainConveyorRidingPacket(BlockPos pos) { + private boolean stop; + + public ServerboundChainConveyorRidingPacket(BlockPos pos, boolean stop) { super(pos); + this.stop = stop; } public ServerboundChainConveyorRidingPacket(FriendlyByteBuf buffer) { @@ -17,11 +21,20 @@ public class ServerboundChainConveyorRidingPacket extends BlockEntityConfigurati } @Override - protected void writeSettings(FriendlyByteBuf buffer) {} + protected void writeSettings(FriendlyByteBuf buffer) { + buffer.writeBoolean(stop); + } @Override - protected void readSettings(FriendlyByteBuf buffer) {} + protected void readSettings(FriendlyByteBuf buffer) { + stop = buffer.readBoolean(); + } + @Override + protected int maxRange() { + return AllConfigs.server().kinetics.maxChainConveyorLength.get() * 2; + } + @Override protected void applySettings(ChainConveyorBlockEntity be) {} @@ -30,7 +43,11 @@ public class ServerboundChainConveyorRidingPacket extends BlockEntityConfigurati sender.fallDistance = 0; sender.connection.aboveGroundTickCount = 0; sender.connection.aboveGroundVehicleTickCount = 0; - ServerChainConveyorHandler.handleTTLPacket(sender); + + if (stop) + ServerChainConveyorHandler.handleStopRidingPacket(sender); + else + ServerChainConveyorHandler.handleTTLPacket(sender); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryScreen.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryScreen.java index 3950a9e9e0..a06347ec2b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryScreen.java @@ -35,6 +35,7 @@ import net.minecraft.client.gui.components.EditBox; import net.minecraft.client.gui.components.Renderable; import net.minecraft.client.renderer.Rect2i; import net.minecraft.network.chat.Component; +import net.minecraft.sounds.SoundEvents; import net.minecraft.util.FormattedCharSequence; import net.minecraft.util.Mth; import net.minecraft.world.entity.player.Inventory; @@ -118,6 +119,8 @@ public class StockKeeperCategoryScreen extends AbstractSimiContainerScreen 0 && x <= 16 && y > 0 && y <= 16) { renderActionTooltip(graphics, ImmutableList.of(CreateLang.translate("gui.stock_ticker.new_category") .component()), mx, my); - if (click == 0) + if (click == 0) { + playUiSound(SoundEvents.UI_BUTTON_CLICK.get(), 1f, 1f); startEditing(-1); + } } return false; @@ -355,8 +360,10 @@ public class StockKeeperCategoryScreen extends AbstractSimiContainerScreen= cols || rmb) return true; itemsToOrder.add(existingOrder = new BigItemStack(itemStack.copyWithCount(1), 0)); + playUiSound(SoundEvents.WOOL_STEP, 0.5f, 1.2f); + playUiSound(SoundEvents.BAMBOO_WOOD_STEP, 0.5f, 0.8f); } int current = existingOrder.count; if (rmb || orderClicked) { existingOrder.count = current - transfer; - if (existingOrder.count <= 0) + if (existingOrder.count <= 0) { itemsToOrder.remove(existingOrder); + playUiSound(SoundEvents.WOOL_STEP, 0.5f, 1.8f); + playUiSound(SoundEvents.BAMBOO_WOOD_STEP, 0.5f, 1.8f); + } return true; } @@ -1145,19 +1159,29 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen= cols || remove) return true; itemsToOrder.add(existingOrder = new BigItemStack(entry.stack.copyWithCount(1), 0)); + playUiSound(SoundEvents.WOOL_STEP, 0.5f, 1.2f); + playUiSound(SoundEvents.BAMBOO_WOOD_STEP, 0.5f, 0.8f); } int current = existingOrder.count; if (remove) { existingOrder.count = current - transfer; - if (existingOrder.count <= 0) + if (existingOrder.count <= 0) { itemsToOrder.remove(existingOrder); + playUiSound(SoundEvents.WOOL_STEP, 0.5f, 1.8f); + playUiSound(SoundEvents.BAMBOO_WOOD_STEP, 0.5f, 1.8f); + } else if (existingOrder.count != current) + playUiSound(AllSoundEvents.SCROLL_VALUE.getMainEvent(), 0.25f, 1.2f); return true; } existingOrder.count = current + Math.min(transfer, blockEntity.getLastClientsideStockSnapshotAsSummary() .getCountOf(entry.stack) - current); + + if (existingOrder.count != current && current != 0) + playUiSound(AllSoundEvents.SCROLL_VALUE.getMainEvent(), 0.25f, 1.2f); + return true; } diff --git a/src/main/java/com/simibubi/create/foundation/gui/menu/AbstractSimiContainerScreen.java b/src/main/java/com/simibubi/create/foundation/gui/menu/AbstractSimiContainerScreen.java index 5a7eae9bf6..c35c6f1fd5 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/menu/AbstractSimiContainerScreen.java +++ b/src/main/java/com/simibubi/create/foundation/gui/menu/AbstractSimiContainerScreen.java @@ -11,6 +11,7 @@ import com.simibubi.create.foundation.gui.AllGuiTextures; import net.createmod.catnip.gui.TickableGuiEventListener; import net.createmod.catnip.gui.widget.AbstractSimiWidget; +import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.components.EditBox; @@ -20,7 +21,9 @@ import net.minecraft.client.gui.narration.NarratableEntry; import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; import net.minecraft.client.gui.screens.inventory.ContainerScreen; import net.minecraft.client.renderer.Rect2i; +import net.minecraft.client.resources.sounds.SimpleSoundInstance; import net.minecraft.network.chat.Component; +import net.minecraft.sounds.SoundEvent; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraftforge.api.distmarker.Dist; @@ -182,4 +185,10 @@ public abstract class AbstractSimiContainerScreen Date: Mon, 6 Jan 2025 18:05:19 +0100 Subject: [PATCH 261/515] Pack man - Fixed conveyors erroring on load - Packagers inserting into inventories now wait a couple of frames before animating - Packagers activated by signals shorter than 2 seconds will always emit exactly one package - Added missing shaft detail to the backtank armor - Different sound type for cardboard and packages - Stock links are now wrenchable again --- src/main/java/com/simibubi/create/AllBlocks.java | 2 ++ .../content/equipment/armor/BacktankArmorLayer.java | 6 ++++++ .../chainConveyor/ChainConveyorBlockEntity.java | 2 +- .../create/content/logistics/box/PackageEntity.java | 6 +++--- .../create/content/logistics/box/PackageItem.java | 2 +- .../logistics/packager/PackagerBlockEntity.java | 13 +++++++++++-- .../logistics/packager/PackagerRenderer.java | 3 ++- .../logistics/packagerLink/PackagerLinkBlock.java | 3 ++- 8 files changed, 28 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 2e41a65b1c..a528a6c3c2 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -2569,6 +2569,7 @@ public class AllBlocks { REGISTRATE.block("cardboard_block", CardboardBlock::new) .initialProperties(() -> Blocks.MUSHROOM_STEM) .properties(p -> p.mapColor(MapColor.COLOR_BROWN) + .sound(SoundType.CHISELED_BOOKSHELF) .ignitedByLava()) .transform(axeOnly()) .blockstate(BlockStateGen.horizontalAxisBlockProvider(false)) @@ -2585,6 +2586,7 @@ public class AllBlocks { REGISTRATE.block("bound_cardboard_block", CardboardBlock::new) .initialProperties(() -> Blocks.MUSHROOM_STEM) .properties(p -> p.mapColor(MapColor.COLOR_BROWN) + .sound(SoundType.CHISELED_BOOKSHELF) .ignitedByLava()) .transform(axeOnly()) .blockstate(BlockStateGen.horizontalAxisBlockProvider(false)) diff --git a/src/main/java/com/simibubi/create/content/equipment/armor/BacktankArmorLayer.java b/src/main/java/com/simibubi/create/content/equipment/armor/BacktankArmorLayer.java index 96665c56cf..8ef93ce505 100644 --- a/src/main/java/com/simibubi/create/content/equipment/armor/BacktankArmorLayer.java +++ b/src/main/java/com/simibubi/create/content/equipment/armor/BacktankArmorLayer.java @@ -48,6 +48,7 @@ public class BacktankArmorLayer .setValue(BacktankBlock.HORIZONTAL_FACING, Direction.SOUTH); SuperByteBuffer backtank = CachedBuffers.block(renderedState); SuperByteBuffer cogs = CachedBuffers.partial(BacktankRenderer.getCogsModel(renderedState), renderedState); + SuperByteBuffer nob = CachedBuffers.partial(BacktankRenderer.getShaftModel(renderedState), renderedState); ms.pushPose(); @@ -59,6 +60,11 @@ public class BacktankArmorLayer .light(light) .renderInto(ms, vc); + nob.disableDiffuse() + .translate(0, -3f / 16, 0) + .light(light) + .renderInto(ms, vc); + cogs.center() .rotateYDegrees(180) .uncenter() diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java index f265edf1a8..6aedd39d2e 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java @@ -705,7 +705,7 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity implements ITra updateBoxWorldPositions(); updateChainShapes(); - if (connections.size() != sizeBefore && level.isClientSide) + if (connections.size() != sizeBefore && level != null && level.isClientSide) invalidateRenderBoundingBox(); } diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java index 3eea0fc1ce..70fbfe8851 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java @@ -439,7 +439,7 @@ public class PackageEntity extends LivingEntity implements IEntityAdditionalSpaw } protected SoundEvent getFallSound(int heightIn) { - return SoundEvents.WOOL_HIT; + return SoundEvents.CHISELED_BOOKSHELF_FALL; } @Override @@ -449,12 +449,12 @@ public class PackageEntity extends LivingEntity implements IEntityAdditionalSpaw @Override public Fallsounds getFallSounds() { - return new LivingEntity.Fallsounds(SoundEvents.WOOL_FALL, SoundEvents.WOOL_FALL); + return new LivingEntity.Fallsounds(SoundEvents.CHISELED_BOOKSHELF_FALL, SoundEvents.CHISELED_BOOKSHELF_FALL); } @Nullable protected SoundEvent getHurtSound(DamageSource damageSourceIn) { - return SoundEvents.ARMOR_STAND_HIT; + return SoundEvents.CHISELED_BOOKSHELF_BREAK; } @Nullable diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java index 64e7e1fa25..a80d24043d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java @@ -285,7 +285,7 @@ public class PackageItem extends Item { } Vec3 position = playerIn.position(); - worldIn.playSound((Player) null, position.x, position.y, position.z, SoundEvents.ARMOR_STAND_BREAK, + worldIn.playSound((Player) null, position.x, position.y, position.z, SoundEvents.CHISELED_BOOKSHELF_BREAK, SoundSource.PLAYERS, 0.5F, 1.0F); if (worldIn.isClientSide()) { diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java index 71d54caf59..64977e50ed 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java @@ -57,6 +57,7 @@ import net.minecraftforge.items.ItemStackHandler; public class PackagerBlockEntity extends SmartBlockEntity { public boolean redstonePowered; + public int buttonCooldown; public String signBasedAddress; public InvManipulationBehaviour targetInventory; @@ -89,6 +90,7 @@ public class PackagerBlockEntity extends SmartBlockEntity { animationInward = true; queuedExitingPackages = new LinkedList<>(); signBasedAddress = ""; + buttonCooldown = 0; } @Override @@ -112,6 +114,9 @@ public class PackagerBlockEntity extends SmartBlockEntity { public void tick() { super.tick(); + if (buttonCooldown > 0) + buttonCooldown--; + if (animationTicks == 0) { previouslyUnwrapped = ItemStack.EMPTY; @@ -281,6 +286,9 @@ public class PackagerBlockEntity extends SmartBlockEntity { updateSignAddress(); attemptToSend(null); + + // dont send multiple packages when a button signal length is received + buttonCooldown = 40; } public boolean unwrapBox(ItemStack box, boolean simulate) { @@ -388,7 +396,7 @@ public class PackagerBlockEntity extends SmartBlockEntity { } public void attemptToSend(List queuedRequests) { - if (queuedRequests == null && (!heldBox.isEmpty() || animationTicks != 0)) + if (queuedRequests == null && (!heldBox.isEmpty() || animationTicks != 0 || buttonCooldown > 0)) return; IItemHandler targetInv = targetInventory.getInventory(); @@ -606,7 +614,8 @@ public class PackagerBlockEntity extends SmartBlockEntity { } public float getTrayOffset(float partialTicks) { - float progress = Mth.clamp(Math.max(0, animationTicks - 5 - partialTicks) / (CYCLE * .75f) * 2 - 1, -1, 1); + float tickCycle = animationInward ? animationTicks - partialTicks : animationTicks - 5 - partialTicks; + float progress = Mth.clamp(tickCycle / (CYCLE - 5) * 2 - 1, -1, 1); progress = 1 - progress * progress; return progress * progress; } diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerRenderer.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerRenderer.java index af93d76a80..4c14844816 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerRenderer.java @@ -33,7 +33,8 @@ public class PackagerRenderer extends SmartBlockEntityRenderer 5 && be.animationTicks < PackagerBlockEntity.CYCLE - 5; + boolean hatchOpen = be.animationTicks > (be.animationInward ? 1 : 5) + && be.animationTicks < PackagerBlockEntity.CYCLE - (be.animationInward ? 5 : 1); BlockState blockState = be.getBlockState(); Direction facing = blockState.getValue(PackagerBlock.FACING) .getOpposite(); diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlock.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlock.java index a844752ec5..13355e4814 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlock.java @@ -2,6 +2,7 @@ package com.simibubi.create.content.logistics.packagerLink; import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllShapes; +import com.simibubi.create.content.equipment.wrench.IWrenchable; import com.simibubi.create.foundation.block.IBE; import com.simibubi.create.foundation.block.ProperWaterloggedBlock; @@ -30,7 +31,7 @@ import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; public class PackagerLinkBlock extends FaceAttachedHorizontalDirectionalBlock - implements IBE, ProperWaterloggedBlock { + implements IBE, ProperWaterloggedBlock, IWrenchable { public static final BooleanProperty POWERED = BlockStateProperties.POWERED; From 1556db1347a7768534068e82415bc8d2a914932c Mon Sep 17 00:00:00 2001 From: IThundxr Date: Mon, 6 Jan 2025 16:27:20 -0500 Subject: [PATCH 262/515] Attending event, but not staying for the party --- .../AllArmInteractionPointTypes.java | 35 ++++++++++--------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/AllArmInteractionPointTypes.java b/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/AllArmInteractionPointTypes.java index b258d7d062..b2af3cfcd1 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/AllArmInteractionPointTypes.java +++ b/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/AllArmInteractionPointTypes.java @@ -42,7 +42,6 @@ import net.createmod.catnip.utility.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Vec3i; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.Containers; import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.WorldlyContainer; @@ -70,23 +69,25 @@ import net.minecraftforge.items.wrapper.SidedInvWrapper; public class AllArmInteractionPointTypes { private static final DeferredRegister REGISTER = DeferredRegister.create(AllRegistries.Keys.ARM_INTERACTION_POINT_TYPES, Create.ID); - public static final Supplier BASIN = register("basin", new BasinType()); - public static final Supplier BELT = register("belt", new BeltType()); - public static final Supplier BLAZE_BURNER = register("blaze_burner", new BlazeBurnerType()); - public static final Supplier CHUTE = register("chute", new ChuteType()); - public static final Supplier CRAFTER = register("crafter", new CrafterType()); - public static final Supplier CRUSHING_WHEELS = register("crushing_wheels", new CrushingWheelsType()); - public static final Supplier DEPLOYER = register("deployer", new DeployerType()); - public static final Supplier DEPOT = register("depot", new DepotType()); - public static final Supplier FUNNEL = register("funnel", new FunnelType()); - public static final Supplier MILLSTONE = register("millstone", new MillstoneType()); - public static final Supplier PACKAGER = register("packager", new PackagerType()); - public static final Supplier SAW = register("saw", new SawType()); + static { + register("basin", new BasinType()); + register("belt", new BeltType()); + register("blaze_burner", new BlazeBurnerType()); + register("chute", new ChuteType()); + register("crafter", new CrafterType()); + register("crushing_wheels", new CrushingWheelsType()); + register("deployer", new DeployerType()); + register("depot", new DepotType()); + register("funnel", new FunnelType()); + register("millstone", new MillstoneType()); + register("packager", new PackagerType()); + register("saw", new SawType()); - public static final Supplier CAMPFIRE = register("campfire", new CampfireType()); - public static final Supplier COMPOSTER = register("composter", new ComposterType()); - public static final Supplier JUKEBOX = register("jukebox", new JukeboxType()); - public static final Supplier RESPAWN_ANCHOR = register("respawn_anchor", new RespawnAnchorType()); + register("campfire", new CampfireType()); + register("composter", new ComposterType()); + register("jukebox", new JukeboxType()); + register("respawn_anchor", new RespawnAnchorType()); + } private static Supplier register(String name, T type) { return REGISTER.register(name, () -> type); From 81c2975401f11c24ab296fdefd8990eb1ded9caa Mon Sep 17 00:00:00 2001 From: IThundxr Date: Mon, 6 Jan 2025 16:45:31 -0500 Subject: [PATCH 263/515] Returning your calls - Remove unused return type in AllArmInteractionPointTypes#register --- .../kinetics/mechanicalArm/AllArmInteractionPointTypes.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/AllArmInteractionPointTypes.java b/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/AllArmInteractionPointTypes.java index b2af3cfcd1..b99e8b2702 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/AllArmInteractionPointTypes.java +++ b/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/AllArmInteractionPointTypes.java @@ -89,8 +89,8 @@ public class AllArmInteractionPointTypes { register("respawn_anchor", new RespawnAnchorType()); } - private static Supplier register(String name, T type) { - return REGISTER.register(name, () -> type); + private static void register(String name, T type) { + REGISTER.register(name, () -> type); } public static void register(IEventBus eventBus) { From c4b38ba32f4edad12a1c1db609b3e8aaa391360d Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Mon, 6 Jan 2025 22:57:29 +0100 Subject: [PATCH 264/515] Needs more sunscreen - Fixed uv issues on the fluid tank - Tweaked frogport sounds --- gradle.properties | 2 +- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 51 ++++++++++++++++-- .../c24b4d2b8d15abff51c78bd94f4403d9eae6c139 | 4 +- .../create/models/item/cardboard_boots.json | 2 +- .../item/cardboard_boots_amethyst_trim.json | 2 +- .../item/cardboard_boots_copper_trim.json | 2 +- .../item/cardboard_boots_diamond_trim.json | 2 +- .../item/cardboard_boots_emerald_trim.json | 2 +- .../item/cardboard_boots_gold_trim.json | 2 +- .../item/cardboard_boots_iron_trim.json | 2 +- .../item/cardboard_boots_lapis_trim.json | 2 +- .../item/cardboard_boots_netherite_trim.json | 2 +- .../item/cardboard_boots_quartz_trim.json | 2 +- .../item/cardboard_boots_redstone_trim.json | 2 +- .../models/item/cardboard_chestplate.json | 2 +- .../cardboard_chestplate_amethyst_trim.json | 2 +- .../cardboard_chestplate_copper_trim.json | 2 +- .../cardboard_chestplate_diamond_trim.json | 2 +- .../cardboard_chestplate_emerald_trim.json | 2 +- .../item/cardboard_chestplate_gold_trim.json | 2 +- .../item/cardboard_chestplate_iron_trim.json | 2 +- .../item/cardboard_chestplate_lapis_trim.json | 2 +- .../cardboard_chestplate_netherite_trim.json | 2 +- .../cardboard_chestplate_quartz_trim.json | 2 +- .../cardboard_chestplate_redstone_trim.json | 2 +- .../create/models/item/cardboard_helmet.json | 2 +- .../item/cardboard_helmet_amethyst_trim.json | 2 +- .../item/cardboard_helmet_copper_trim.json | 2 +- .../item/cardboard_helmet_diamond_trim.json | 2 +- .../item/cardboard_helmet_emerald_trim.json | 2 +- .../item/cardboard_helmet_gold_trim.json | 2 +- .../item/cardboard_helmet_iron_trim.json | 2 +- .../item/cardboard_helmet_lapis_trim.json | 2 +- .../item/cardboard_helmet_netherite_trim.json | 2 +- .../item/cardboard_helmet_quartz_trim.json | 2 +- .../item/cardboard_helmet_redstone_trim.json | 2 +- .../models/item/cardboard_leggings.json | 2 +- .../cardboard_leggings_amethyst_trim.json | 2 +- .../item/cardboard_leggings_copper_trim.json | 2 +- .../item/cardboard_leggings_diamond_trim.json | 2 +- .../item/cardboard_leggings_emerald_trim.json | 2 +- .../item/cardboard_leggings_gold_trim.json | 2 +- .../item/cardboard_leggings_iron_trim.json | 2 +- .../item/cardboard_leggings_lapis_trim.json | 2 +- .../cardboard_leggings_netherite_trim.json | 2 +- .../item/cardboard_leggings_quartz_trim.json | 2 +- .../cardboard_leggings_redstone_trim.json | 2 +- .../resources/assets/create/sounds.json | 4 +- .../minecraft/tags/items/trimmable_armor.json | 2 +- .../com/simibubi/create/AllSoundEvents.java | 1 + .../frogport/FrogportBlockEntity.java | 15 ++++-- .../packagePort/frogport/FrogportSounds.java | 4 +- .../fluid_tank/block_bottom_window_ne.json | 4 +- .../fluid_tank/block_middle_window_sw.json | 4 +- .../fluid_tank/block_single_window_nw.json | 4 +- .../fluid_tank/block_single_window_se.json | 4 +- .../fluid_tank/block_single_window_sw.json | 4 +- .../assets/create/sounds/frogport_open.ogg | Bin 7222 -> 0 bytes 58 files changed, 121 insertions(+), 70 deletions(-) delete mode 100644 src/main/resources/assets/create/sounds/frogport_open.ogg diff --git a/gradle.properties b/gradle.properties index 5e26345ffe..b3acdf5e19 100644 --- a/gradle.properties +++ b/gradle.properties @@ -29,7 +29,7 @@ jei_version = 15.10.0.39 curios_minecraft_version = 1.20.1 curios_version = 5.3.1 catnip_version = 0.8.41 -ponder_version = 0.8.12 +ponder_version = 0.8.14 mixin_extras_version = 0.4.1 cc_tweaked_enable = true diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index d16d55bbd7..7d6fdeaaa4 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2025-01-05T12:20:44.8131117 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2025-01-06T22:46:25.6513213 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -1891,10 +1891,50 @@ a126a50454ea449e66c6f6e36eb96bff96652c92 assets/create/models/item/brown_table_c f5ff4e2ed2ea2e43b6d02f6a95ba02b2e4b611dc assets/create/models/item/calcite_pillar.json cc2692f7964f4266ecf00fcab176b1ef0b78673f assets/create/models/item/cardboard.json 607272f2b906fdffd46677d47a4e6ecb94184eff assets/create/models/item/cardboard_block.json -39eadb54cec52d9e2a087fc71ef83341688f2781 assets/create/models/item/cardboard_boots.json -d6a3f139fca5ac6aff94d11d75fe239283bb4a09 assets/create/models/item/cardboard_chestplate.json -82236ea8e939c46f0d2c9142336190eca2a0425e assets/create/models/item/cardboard_helmet.json -416a4d33a2b3b1921285f96436853dd7690447ac assets/create/models/item/cardboard_leggings.json +70ab4eb53188efef1a157823ce90e5fd09e35d3c assets/create/models/item/cardboard_boots.json +5c67ce75ffe3f5c9a32877ffdb4005b2a44d6483 assets/create/models/item/cardboard_boots_amethyst_trim.json +2027e70e42e1c931537e591c51b1f2d1aed6833c assets/create/models/item/cardboard_boots_copper_trim.json +881e17e4d8b2be53403833ee262a7a17040695bd assets/create/models/item/cardboard_boots_diamond_trim.json +ae9617e768f8a711d932a5137bd7946c7bb1fbe3 assets/create/models/item/cardboard_boots_emerald_trim.json +62dbafe3a1493be7d46270168e57ff1f866bc669 assets/create/models/item/cardboard_boots_gold_trim.json +dcdc125780505d55bf76302fe982b23083c08845 assets/create/models/item/cardboard_boots_iron_trim.json +86a5435fcf899530bd1caa3fdf83e1dee337f22d assets/create/models/item/cardboard_boots_lapis_trim.json +527602bacf19e6ddb40023e1ad9fd532d96699ed assets/create/models/item/cardboard_boots_netherite_trim.json +bf4ec4f542e5d96ca9b6b90e298526acaa8cb8b9 assets/create/models/item/cardboard_boots_quartz_trim.json +d0a89aae893a45b14173f2f104dc0bb72d14516e assets/create/models/item/cardboard_boots_redstone_trim.json +169470769f90bb6fa0e503c78d8dde4bf63c0e7f assets/create/models/item/cardboard_chestplate.json +37ba0d5584aabd317e984d46e2e56622c10c74d0 assets/create/models/item/cardboard_chestplate_amethyst_trim.json +e50df07949d1a0a7e54e5b1635827adf8c250583 assets/create/models/item/cardboard_chestplate_copper_trim.json +1b82a900bb783a55a32d308fbec4c103981ca0ea assets/create/models/item/cardboard_chestplate_diamond_trim.json +90f5afe6a3e8292a37814ae6b8d1ca78bf1279b7 assets/create/models/item/cardboard_chestplate_emerald_trim.json +84ac8525c149e6f630fa02ca53d1e0a0b5f55b3e assets/create/models/item/cardboard_chestplate_gold_trim.json +6327a6514a3c19e9faf31c5388103e1e8cc7d01c assets/create/models/item/cardboard_chestplate_iron_trim.json +0df84176624b1cb081f8bff881156fbe530fda43 assets/create/models/item/cardboard_chestplate_lapis_trim.json +f27591c2befb21f6aa944bd2f54e7c4f58833917 assets/create/models/item/cardboard_chestplate_netherite_trim.json +3ace2f1c1a773d5d9d2b4f3d6c93f742d9bd971d assets/create/models/item/cardboard_chestplate_quartz_trim.json +9e74713fbdc8d90697f264562316f991de51d49e assets/create/models/item/cardboard_chestplate_redstone_trim.json +0b46dc6ac222fcf998100f1656047058fb8ef1ee assets/create/models/item/cardboard_helmet.json +61fad07fcc7da51ed9806938c7c1d930481015d2 assets/create/models/item/cardboard_helmet_amethyst_trim.json +c185e1b969ffb78df3d956a5907486a5abe81d55 assets/create/models/item/cardboard_helmet_copper_trim.json +b5ecea23091e2fa7d0b004a73a210ec4cf970035 assets/create/models/item/cardboard_helmet_diamond_trim.json +1b908f938a492f1faddf7f47e44f99dd0e0cc700 assets/create/models/item/cardboard_helmet_emerald_trim.json +f7096241733b0623eade076fcc536c0a3dd9f252 assets/create/models/item/cardboard_helmet_gold_trim.json +079c0ea69a5c8a7d1bb2e1bdd23ccc9c92e036d5 assets/create/models/item/cardboard_helmet_iron_trim.json +4db478f4669c26edef502b87be277be314933cab assets/create/models/item/cardboard_helmet_lapis_trim.json +ab46809613299865e33dcca39df597a239174df8 assets/create/models/item/cardboard_helmet_netherite_trim.json +03d4eb863c7b4cfc60a81b270a569440f0c62c85 assets/create/models/item/cardboard_helmet_quartz_trim.json +2703a1c5c65fe5c74c03bfe8ab6acfc4e5849cf9 assets/create/models/item/cardboard_helmet_redstone_trim.json +9987b29466b2a83ef25c66f51086b26ccd2c5a5b assets/create/models/item/cardboard_leggings.json +6a98f395678073c3ec0c09556b38cc9ac9e63492 assets/create/models/item/cardboard_leggings_amethyst_trim.json +5e932da44be1022af8c97061caca61a97c99b6d6 assets/create/models/item/cardboard_leggings_copper_trim.json +e010c6af3e4c3c5cba26491c84c2c73c3c9386c7 assets/create/models/item/cardboard_leggings_diamond_trim.json +6f7a3ed21abf915f5803922db3a15fb6210162c6 assets/create/models/item/cardboard_leggings_emerald_trim.json +8176633be5a2ea548fa39df1d875a29851a7b091 assets/create/models/item/cardboard_leggings_gold_trim.json +56254db2e5432386b4de1ab00603f72255a8aa61 assets/create/models/item/cardboard_leggings_iron_trim.json +ca37276063d58483994ab51e3f72ef20521902c2 assets/create/models/item/cardboard_leggings_lapis_trim.json +55dfc8af30c392b0a70390d90c4239aba011d0ac assets/create/models/item/cardboard_leggings_netherite_trim.json +3f7d0d84790570dd92bb83071d6ecfddadce047d assets/create/models/item/cardboard_leggings_quartz_trim.json +47963712e6a470c5d14d7ea1bc8fff2a0553267b assets/create/models/item/cardboard_leggings_redstone_trim.json 123f7b8f5129e07beead05846744ff06161ec7a1 assets/create/models/item/cardboard_package_10x12.json 4f22bc19ebf19be0efc32b5d2fe449349e6f5b2f assets/create/models/item/cardboard_package_10x8.json 599d305569d025d8771993d0b56a377f910e2a95 assets/create/models/item/cardboard_package_12x10.json @@ -4788,5 +4828,6 @@ dafa3bdb72fef5e6c0201c05846db3f2b214e587 data/minecraft/tags/blocks/stairs.json 1ac7c46815461cbec0d4d97f25c085fdc8375dab data/minecraft/tags/items/slabs.json dafa3bdb72fef5e6c0201c05846db3f2b214e587 data/minecraft/tags/items/stairs.json 11427a72e181857e22ec37a22462bc652e127cc5 data/minecraft/tags/items/trapdoors.json +15d3621abbef2048a7c258d410e40d9d87e55dd7 data/minecraft/tags/items/trimmable_armor.json 2bcba05954ff7bc4cf9cc520478083da9973ec76 data/minecraft/tags/items/walls.json 71aef080a900d9e86818cf579438c3d826d6567e data/quark/tags/blocks/non_double_door.json diff --git a/src/generated/resources/.cache/c24b4d2b8d15abff51c78bd94f4403d9eae6c139 b/src/generated/resources/.cache/c24b4d2b8d15abff51c78bd94f4403d9eae6c139 index 6ce167281b..809e95f7e8 100644 --- a/src/generated/resources/.cache/c24b4d2b8d15abff51c78bd94f4403d9eae6c139 +++ b/src/generated/resources/.cache/c24b4d2b8d15abff51c78bd94f4403d9eae6c139 @@ -1,2 +1,2 @@ -// 1.20.1 2025-01-05T12:20:44.8111168 Create's Custom Sounds -b55aef763ad0b3df0d27e53c2a4c656c942cfa7a assets/create/sounds.json +// 1.20.1 2025-01-06T22:46:25.6503343 Create's Custom Sounds +1305ab16efe6b554f5c852de0d52adaf419c4f76 assets/create/sounds.json diff --git a/src/generated/resources/assets/create/models/item/cardboard_boots.json b/src/generated/resources/assets/create/models/item/cardboard_boots.json index 296b1b8b31..c78fc3d330 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_boots.json +++ b/src/generated/resources/assets/create/models/item/cardboard_boots.json @@ -65,4 +65,4 @@ "textures": { "layer0": "create:item/cardboard_boots" } -} +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_boots_amethyst_trim.json b/src/generated/resources/assets/create/models/item/cardboard_boots_amethyst_trim.json index 6095cb93a4..b590a2b7a4 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_boots_amethyst_trim.json +++ b/src/generated/resources/assets/create/models/item/cardboard_boots_amethyst_trim.json @@ -4,4 +4,4 @@ "layer0": "create:item/cardboard_boots", "layer1": "create:trims/items/card_boots_trim_amethyst" } -} +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_boots_copper_trim.json b/src/generated/resources/assets/create/models/item/cardboard_boots_copper_trim.json index bf535eb1ad..bfb821ba91 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_boots_copper_trim.json +++ b/src/generated/resources/assets/create/models/item/cardboard_boots_copper_trim.json @@ -4,4 +4,4 @@ "layer0": "create:item/cardboard_boots", "layer1": "create:trims/items/card_boots_trim_copper" } -} +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_boots_diamond_trim.json b/src/generated/resources/assets/create/models/item/cardboard_boots_diamond_trim.json index 9a7d053e7a..fc4e82cdc5 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_boots_diamond_trim.json +++ b/src/generated/resources/assets/create/models/item/cardboard_boots_diamond_trim.json @@ -4,4 +4,4 @@ "layer0": "create:item/cardboard_boots", "layer1": "create:trims/items/card_boots_trim_diamond" } -} +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_boots_emerald_trim.json b/src/generated/resources/assets/create/models/item/cardboard_boots_emerald_trim.json index e372dbcf6a..ba0cd0bb21 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_boots_emerald_trim.json +++ b/src/generated/resources/assets/create/models/item/cardboard_boots_emerald_trim.json @@ -4,4 +4,4 @@ "layer0": "create:item/cardboard_boots", "layer1": "create:trims/items/card_boots_trim_emerald" } -} +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_boots_gold_trim.json b/src/generated/resources/assets/create/models/item/cardboard_boots_gold_trim.json index 392d3afe03..e21893bc33 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_boots_gold_trim.json +++ b/src/generated/resources/assets/create/models/item/cardboard_boots_gold_trim.json @@ -4,4 +4,4 @@ "layer0": "create:item/cardboard_boots", "layer1": "create:trims/items/card_boots_trim_gold" } -} +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_boots_iron_trim.json b/src/generated/resources/assets/create/models/item/cardboard_boots_iron_trim.json index 2ef7a34436..8505baf4f4 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_boots_iron_trim.json +++ b/src/generated/resources/assets/create/models/item/cardboard_boots_iron_trim.json @@ -4,4 +4,4 @@ "layer0": "create:item/cardboard_boots", "layer1": "create:trims/items/card_boots_trim_iron" } -} +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_boots_lapis_trim.json b/src/generated/resources/assets/create/models/item/cardboard_boots_lapis_trim.json index 238bd3fe6d..3ad30ed6b5 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_boots_lapis_trim.json +++ b/src/generated/resources/assets/create/models/item/cardboard_boots_lapis_trim.json @@ -4,4 +4,4 @@ "layer0": "create:item/cardboard_boots", "layer1": "create:trims/items/card_boots_trim_lapis" } -} +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_boots_netherite_trim.json b/src/generated/resources/assets/create/models/item/cardboard_boots_netherite_trim.json index 176e50ae64..78b12a9b3e 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_boots_netherite_trim.json +++ b/src/generated/resources/assets/create/models/item/cardboard_boots_netherite_trim.json @@ -4,4 +4,4 @@ "layer0": "create:item/cardboard_boots", "layer1": "create:trims/items/card_boots_trim_netherite" } -} +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_boots_quartz_trim.json b/src/generated/resources/assets/create/models/item/cardboard_boots_quartz_trim.json index 4416117015..6635e107bc 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_boots_quartz_trim.json +++ b/src/generated/resources/assets/create/models/item/cardboard_boots_quartz_trim.json @@ -4,4 +4,4 @@ "layer0": "create:item/cardboard_boots", "layer1": "create:trims/items/card_boots_trim_quartz" } -} +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_boots_redstone_trim.json b/src/generated/resources/assets/create/models/item/cardboard_boots_redstone_trim.json index 9c502ccbf9..e3d8c5647a 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_boots_redstone_trim.json +++ b/src/generated/resources/assets/create/models/item/cardboard_boots_redstone_trim.json @@ -4,4 +4,4 @@ "layer0": "create:item/cardboard_boots", "layer1": "create:trims/items/card_boots_trim_redstone" } -} +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_chestplate.json b/src/generated/resources/assets/create/models/item/cardboard_chestplate.json index 468854c641..28b4eb2b42 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_chestplate.json +++ b/src/generated/resources/assets/create/models/item/cardboard_chestplate.json @@ -65,4 +65,4 @@ "textures": { "layer0": "create:item/cardboard_chestplate" } -} +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_chestplate_amethyst_trim.json b/src/generated/resources/assets/create/models/item/cardboard_chestplate_amethyst_trim.json index 96d37ad444..d1d97f5d0c 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_chestplate_amethyst_trim.json +++ b/src/generated/resources/assets/create/models/item/cardboard_chestplate_amethyst_trim.json @@ -4,4 +4,4 @@ "layer0": "create:item/cardboard_chestplate", "layer1": "create:trims/items/card_chestplate_trim_amethyst" } -} +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_chestplate_copper_trim.json b/src/generated/resources/assets/create/models/item/cardboard_chestplate_copper_trim.json index 520828619d..7e188fb1be 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_chestplate_copper_trim.json +++ b/src/generated/resources/assets/create/models/item/cardboard_chestplate_copper_trim.json @@ -4,4 +4,4 @@ "layer0": "create:item/cardboard_chestplate", "layer1": "create:trims/items/card_chestplate_trim_copper" } -} +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_chestplate_diamond_trim.json b/src/generated/resources/assets/create/models/item/cardboard_chestplate_diamond_trim.json index ddbe3c6cff..05dd595373 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_chestplate_diamond_trim.json +++ b/src/generated/resources/assets/create/models/item/cardboard_chestplate_diamond_trim.json @@ -4,4 +4,4 @@ "layer0": "create:item/cardboard_chestplate", "layer1": "create:trims/items/card_chestplate_trim_diamond" } -} +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_chestplate_emerald_trim.json b/src/generated/resources/assets/create/models/item/cardboard_chestplate_emerald_trim.json index f29b0932dc..e9ec729e1f 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_chestplate_emerald_trim.json +++ b/src/generated/resources/assets/create/models/item/cardboard_chestplate_emerald_trim.json @@ -4,4 +4,4 @@ "layer0": "create:item/cardboard_chestplate", "layer1": "create:trims/items/card_chestplate_trim_emerald" } -} +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_chestplate_gold_trim.json b/src/generated/resources/assets/create/models/item/cardboard_chestplate_gold_trim.json index e435ec1242..9cb2d00739 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_chestplate_gold_trim.json +++ b/src/generated/resources/assets/create/models/item/cardboard_chestplate_gold_trim.json @@ -4,4 +4,4 @@ "layer0": "create:item/cardboard_chestplate", "layer1": "create:trims/items/card_chestplate_trim_gold" } -} +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_chestplate_iron_trim.json b/src/generated/resources/assets/create/models/item/cardboard_chestplate_iron_trim.json index c7689020a0..2e758a347e 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_chestplate_iron_trim.json +++ b/src/generated/resources/assets/create/models/item/cardboard_chestplate_iron_trim.json @@ -4,4 +4,4 @@ "layer0": "create:item/cardboard_chestplate", "layer1": "create:trims/items/card_chestplate_trim_iron" } -} +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_chestplate_lapis_trim.json b/src/generated/resources/assets/create/models/item/cardboard_chestplate_lapis_trim.json index 87af7953ac..a37a71bcbf 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_chestplate_lapis_trim.json +++ b/src/generated/resources/assets/create/models/item/cardboard_chestplate_lapis_trim.json @@ -4,4 +4,4 @@ "layer0": "create:item/cardboard_chestplate", "layer1": "create:trims/items/card_chestplate_trim_lapis" } -} +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_chestplate_netherite_trim.json b/src/generated/resources/assets/create/models/item/cardboard_chestplate_netherite_trim.json index 62b498f67b..e3d749d65a 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_chestplate_netherite_trim.json +++ b/src/generated/resources/assets/create/models/item/cardboard_chestplate_netherite_trim.json @@ -4,4 +4,4 @@ "layer0": "create:item/cardboard_chestplate", "layer1": "create:trims/items/card_chestplate_trim_netherite" } -} +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_chestplate_quartz_trim.json b/src/generated/resources/assets/create/models/item/cardboard_chestplate_quartz_trim.json index ed5250f1da..abee637046 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_chestplate_quartz_trim.json +++ b/src/generated/resources/assets/create/models/item/cardboard_chestplate_quartz_trim.json @@ -4,4 +4,4 @@ "layer0": "create:item/cardboard_chestplate", "layer1": "create:trims/items/card_chestplate_trim_quartz" } -} +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_chestplate_redstone_trim.json b/src/generated/resources/assets/create/models/item/cardboard_chestplate_redstone_trim.json index 29c960fe99..a163ed20d8 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_chestplate_redstone_trim.json +++ b/src/generated/resources/assets/create/models/item/cardboard_chestplate_redstone_trim.json @@ -4,4 +4,4 @@ "layer0": "create:item/cardboard_chestplate", "layer1": "create:trims/items/card_chestplate_trim_redstone" } -} +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_helmet.json b/src/generated/resources/assets/create/models/item/cardboard_helmet.json index 40fc879984..4746d0b9fa 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_helmet.json +++ b/src/generated/resources/assets/create/models/item/cardboard_helmet.json @@ -65,4 +65,4 @@ "textures": { "layer0": "create:item/cardboard_helmet" } -} +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_helmet_amethyst_trim.json b/src/generated/resources/assets/create/models/item/cardboard_helmet_amethyst_trim.json index d3159ce3d9..d9cb46f71c 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_helmet_amethyst_trim.json +++ b/src/generated/resources/assets/create/models/item/cardboard_helmet_amethyst_trim.json @@ -4,4 +4,4 @@ "layer0": "create:item/cardboard_helmet", "layer1": "create:trims/items/card_helmet_trim_amethyst" } -} +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_helmet_copper_trim.json b/src/generated/resources/assets/create/models/item/cardboard_helmet_copper_trim.json index a6c00a6e2a..abdd6b152f 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_helmet_copper_trim.json +++ b/src/generated/resources/assets/create/models/item/cardboard_helmet_copper_trim.json @@ -4,4 +4,4 @@ "layer0": "create:item/cardboard_helmet", "layer1": "create:trims/items/card_helmet_trim_copper" } -} +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_helmet_diamond_trim.json b/src/generated/resources/assets/create/models/item/cardboard_helmet_diamond_trim.json index 06d1e09f6f..6e97348860 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_helmet_diamond_trim.json +++ b/src/generated/resources/assets/create/models/item/cardboard_helmet_diamond_trim.json @@ -4,4 +4,4 @@ "layer0": "create:item/cardboard_helmet", "layer1": "create:trims/items/card_helmet_trim_diamond" } -} +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_helmet_emerald_trim.json b/src/generated/resources/assets/create/models/item/cardboard_helmet_emerald_trim.json index 67a280d34c..98f1995b39 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_helmet_emerald_trim.json +++ b/src/generated/resources/assets/create/models/item/cardboard_helmet_emerald_trim.json @@ -4,4 +4,4 @@ "layer0": "create:item/cardboard_helmet", "layer1": "create:trims/items/card_helmet_trim_emerald" } -} +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_helmet_gold_trim.json b/src/generated/resources/assets/create/models/item/cardboard_helmet_gold_trim.json index b0245d1cb7..8ee0eca400 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_helmet_gold_trim.json +++ b/src/generated/resources/assets/create/models/item/cardboard_helmet_gold_trim.json @@ -4,4 +4,4 @@ "layer0": "create:item/cardboard_helmet", "layer1": "create:trims/items/card_helmet_trim_gold" } -} +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_helmet_iron_trim.json b/src/generated/resources/assets/create/models/item/cardboard_helmet_iron_trim.json index 7871e0b367..730ddda90b 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_helmet_iron_trim.json +++ b/src/generated/resources/assets/create/models/item/cardboard_helmet_iron_trim.json @@ -4,4 +4,4 @@ "layer0": "create:item/cardboard_helmet", "layer1": "create:trims/items/card_helmet_trim_iron" } -} +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_helmet_lapis_trim.json b/src/generated/resources/assets/create/models/item/cardboard_helmet_lapis_trim.json index 0c83e5f246..0699f700b4 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_helmet_lapis_trim.json +++ b/src/generated/resources/assets/create/models/item/cardboard_helmet_lapis_trim.json @@ -4,4 +4,4 @@ "layer0": "create:item/cardboard_helmet", "layer1": "create:trims/items/card_helmet_trim_lapis" } -} +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_helmet_netherite_trim.json b/src/generated/resources/assets/create/models/item/cardboard_helmet_netherite_trim.json index 49cb173237..b05b40a619 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_helmet_netherite_trim.json +++ b/src/generated/resources/assets/create/models/item/cardboard_helmet_netherite_trim.json @@ -4,4 +4,4 @@ "layer0": "create:item/cardboard_helmet", "layer1": "create:trims/items/card_helmet_trim_netherite" } -} +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_helmet_quartz_trim.json b/src/generated/resources/assets/create/models/item/cardboard_helmet_quartz_trim.json index 6bc7f901e2..e1ded50c27 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_helmet_quartz_trim.json +++ b/src/generated/resources/assets/create/models/item/cardboard_helmet_quartz_trim.json @@ -4,4 +4,4 @@ "layer0": "create:item/cardboard_helmet", "layer1": "create:trims/items/card_helmet_trim_quartz" } -} +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_helmet_redstone_trim.json b/src/generated/resources/assets/create/models/item/cardboard_helmet_redstone_trim.json index 75324161f2..ecbb8aa49e 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_helmet_redstone_trim.json +++ b/src/generated/resources/assets/create/models/item/cardboard_helmet_redstone_trim.json @@ -4,4 +4,4 @@ "layer0": "create:item/cardboard_helmet", "layer1": "create:trims/items/card_helmet_trim_redstone" } -} +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_leggings.json b/src/generated/resources/assets/create/models/item/cardboard_leggings.json index c88b0a98e4..014b01ea75 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_leggings.json +++ b/src/generated/resources/assets/create/models/item/cardboard_leggings.json @@ -65,4 +65,4 @@ "textures": { "layer0": "create:item/cardboard_leggings" } -} +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_leggings_amethyst_trim.json b/src/generated/resources/assets/create/models/item/cardboard_leggings_amethyst_trim.json index 3ce0ded782..c5652cbcc2 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_leggings_amethyst_trim.json +++ b/src/generated/resources/assets/create/models/item/cardboard_leggings_amethyst_trim.json @@ -4,4 +4,4 @@ "layer0": "create:item/cardboard_leggings", "layer1": "create:trims/items/card_leggings_trim_amethyst" } -} +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_leggings_copper_trim.json b/src/generated/resources/assets/create/models/item/cardboard_leggings_copper_trim.json index d85e43b9d0..95771e62dc 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_leggings_copper_trim.json +++ b/src/generated/resources/assets/create/models/item/cardboard_leggings_copper_trim.json @@ -4,4 +4,4 @@ "layer0": "create:item/cardboard_leggings", "layer1": "create:trims/items/card_leggings_trim_copper" } -} +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_leggings_diamond_trim.json b/src/generated/resources/assets/create/models/item/cardboard_leggings_diamond_trim.json index 625e4a76a7..706e7a6693 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_leggings_diamond_trim.json +++ b/src/generated/resources/assets/create/models/item/cardboard_leggings_diamond_trim.json @@ -4,4 +4,4 @@ "layer0": "create:item/cardboard_leggings", "layer1": "create:trims/items/card_leggings_trim_diamond" } -} +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_leggings_emerald_trim.json b/src/generated/resources/assets/create/models/item/cardboard_leggings_emerald_trim.json index 4b1b47f267..97f74ca197 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_leggings_emerald_trim.json +++ b/src/generated/resources/assets/create/models/item/cardboard_leggings_emerald_trim.json @@ -4,4 +4,4 @@ "layer0": "create:item/cardboard_leggings", "layer1": "create:trims/items/card_leggings_trim_emerald" } -} +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_leggings_gold_trim.json b/src/generated/resources/assets/create/models/item/cardboard_leggings_gold_trim.json index fdeb76e815..5d2291c6b9 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_leggings_gold_trim.json +++ b/src/generated/resources/assets/create/models/item/cardboard_leggings_gold_trim.json @@ -4,4 +4,4 @@ "layer0": "create:item/cardboard_leggings", "layer1": "create:trims/items/card_leggings_trim_gold" } -} +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_leggings_iron_trim.json b/src/generated/resources/assets/create/models/item/cardboard_leggings_iron_trim.json index f30aaa7717..f0c2be4338 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_leggings_iron_trim.json +++ b/src/generated/resources/assets/create/models/item/cardboard_leggings_iron_trim.json @@ -4,4 +4,4 @@ "layer0": "create:item/cardboard_leggings", "layer1": "create:trims/items/card_leggings_trim_iron" } -} +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_leggings_lapis_trim.json b/src/generated/resources/assets/create/models/item/cardboard_leggings_lapis_trim.json index 5c95d2c2a1..2466245a51 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_leggings_lapis_trim.json +++ b/src/generated/resources/assets/create/models/item/cardboard_leggings_lapis_trim.json @@ -4,4 +4,4 @@ "layer0": "create:item/cardboard_leggings", "layer1": "create:trims/items/card_leggings_trim_lapis" } -} +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_leggings_netherite_trim.json b/src/generated/resources/assets/create/models/item/cardboard_leggings_netherite_trim.json index 49fa37f52b..70b05181c7 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_leggings_netherite_trim.json +++ b/src/generated/resources/assets/create/models/item/cardboard_leggings_netherite_trim.json @@ -4,4 +4,4 @@ "layer0": "create:item/cardboard_leggings", "layer1": "create:trims/items/card_leggings_trim_netherite" } -} +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_leggings_quartz_trim.json b/src/generated/resources/assets/create/models/item/cardboard_leggings_quartz_trim.json index 5892bec5c5..fe41a39804 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_leggings_quartz_trim.json +++ b/src/generated/resources/assets/create/models/item/cardboard_leggings_quartz_trim.json @@ -4,4 +4,4 @@ "layer0": "create:item/cardboard_leggings", "layer1": "create:trims/items/card_leggings_trim_quartz" } -} +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cardboard_leggings_redstone_trim.json b/src/generated/resources/assets/create/models/item/cardboard_leggings_redstone_trim.json index 828a419503..1cdd7647e1 100644 --- a/src/generated/resources/assets/create/models/item/cardboard_leggings_redstone_trim.json +++ b/src/generated/resources/assets/create/models/item/cardboard_leggings_redstone_trim.json @@ -4,4 +4,4 @@ "layer0": "create:item/cardboard_leggings", "layer1": "create:trims/items/card_leggings_trim_redstone" } -} +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/sounds.json b/src/generated/resources/assets/create/sounds.json index 0da7bc9c54..82ab6f95eb 100644 --- a/src/generated/resources/assets/create/sounds.json +++ b/src/generated/resources/assets/create/sounds.json @@ -292,8 +292,8 @@ "frogport_open": { "sounds": [ { - "type": "file", - "name": "create:frogport_open" + "type": "event", + "name": "minecraft:entity.warden.tendril_clicks" } ], "subtitle": "create.subtitle.frogport_open" diff --git a/src/generated/resources/data/minecraft/tags/items/trimmable_armor.json b/src/generated/resources/data/minecraft/tags/items/trimmable_armor.json index 5da3556b0e..6f07e7efcb 100644 --- a/src/generated/resources/data/minecraft/tags/items/trimmable_armor.json +++ b/src/generated/resources/data/minecraft/tags/items/trimmable_armor.json @@ -5,4 +5,4 @@ "create:cardboard_leggings", "create:cardboard_boots" ] -} +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllSoundEvents.java b/src/main/java/com/simibubi/create/AllSoundEvents.java index c6a9137eca..0fed06da67 100644 --- a/src/main/java/com/simibubi/create/AllSoundEvents.java +++ b/src/main/java/com/simibubi/create/AllSoundEvents.java @@ -138,6 +138,7 @@ public class AllSoundEvents { .build(), FROGPORT_OPEN = create("frogport_open").subtitle("Frogport opens") + .playExisting(SoundEvents.WARDEN_TENDRIL_CLICKS, 1f, 2f) .category(SoundSource.BLOCKS) .build(), diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportBlockEntity.java index 1b78e71ef0..9cb1f12b25 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportBlockEntity.java @@ -21,6 +21,8 @@ import net.minecraft.core.particles.BlockParticleOption; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; import net.minecraft.util.Mth; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntity; @@ -121,21 +123,26 @@ public class FrogportBlockEntity extends PackagePortBlockEntity implements IHave animationProgress.tickChaser(); + float value = animationProgress.getValue(); if (currentlyDepositing) { if (!level.isClientSide()) { - if (animationProgress.getValue() > 0.5 && animatedPackage != null) { + if (value > 0.5 && animatedPackage != null) { if (target == null || !target.depositImmediately() && !target.export(level, worldPosition, animatedPackage, false)) drop(animatedPackage); animatedPackage = null; } } else { - if (animationProgress.getValue() > 0.7) + if (value > 0.7 && animatedPackage != null) animatedPackage = null; + if (animationProgress.getValue(0) < 0.2 && value > 0.2) { + Vec3 v = target.getExactTargetLocation(this, level, worldPosition); + level.playLocalSound(v.x, v.y, v.z, SoundEvents.CHAIN_STEP, SoundSource.BLOCKS, 0.25f, 1.2f, false); + } } } - if (animationProgress.getValue() < 1) + if (value < 1) return; anticipationProgress.startWithValue(0); @@ -169,6 +176,8 @@ public class FrogportBlockEntity extends PackagePortBlockEntity implements IHave currentlyDepositing = deposit; if (level != null && level.isClientSide()) { + sounds.open(level, worldPosition); + if (currentlyDepositing) { sounds.depositPackage(level, worldPosition); diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportSounds.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportSounds.java index 2909918166..36e87ee5c5 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportSounds.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportSounds.java @@ -16,13 +16,13 @@ public class FrogportSounds { AllSoundEvents.FROGPORT_CATCH_2, AllSoundEvents.FROGPORT_CATCH_3, AllSoundEvents.FROGPORT_CATCH_4); public void open(Level level, BlockPos pos) { - AllSoundEvents.FROGPORT_OPEN.playAt(level, Vec3.atCenterOf(pos), 1, 1, false); + AllSoundEvents.FROGPORT_OPEN.playAt(level, Vec3.atCenterOf(pos), 0.125f, 1, false); } public void close(Level level, BlockPos pos) { if (!isPlayerNear(pos)) return; - AllSoundEvents.FROGPORT_CLOSE.playAt(level, Vec3.atCenterOf(pos), 0.5f, 1.25f + level.random.nextFloat() * 0.25f, + AllSoundEvents.FROGPORT_CLOSE.playAt(level, Vec3.atCenterOf(pos), 1.0f, 1.25f + level.random.nextFloat() * 0.25f, true); } diff --git a/src/main/resources/assets/create/models/block/fluid_tank/block_bottom_window_ne.json b/src/main/resources/assets/create/models/block/fluid_tank/block_bottom_window_ne.json index 2ae13a3b43..dda98fb94f 100644 --- a/src/main/resources/assets/create/models/block/fluid_tank/block_bottom_window_ne.json +++ b/src/main/resources/assets/create/models/block/fluid_tank/block_bottom_window_ne.json @@ -15,7 +15,7 @@ "to": [16, 16, 12], "faces": { "east": {"uv": [4, 0, 16, 12], "texture": "#1"}, - "south": {"uv": [0, 0, 1, 12], "texture": "#1"}, + "south": {"uv": [15, 0, 16, 12], "texture": "#1"}, "west": {"uv": [0, 0, 12, 12], "texture": "#1"} } }, @@ -44,7 +44,7 @@ "faces": { "north": {"uv": [0, 0, 12, 12], "texture": "#1"}, "south": {"uv": [4, 0, 16, 12], "texture": "#1"}, - "west": {"uv": [15, 0, 16, 12], "texture": "#1"} + "west": {"uv": [0, 0, 1, 12], "texture": "#1"} } }, { diff --git a/src/main/resources/assets/create/models/block/fluid_tank/block_middle_window_sw.json b/src/main/resources/assets/create/models/block/fluid_tank/block_middle_window_sw.json index 2cfec7902b..ce852a4399 100644 --- a/src/main/resources/assets/create/models/block/fluid_tank/block_middle_window_sw.json +++ b/src/main/resources/assets/create/models/block/fluid_tank/block_middle_window_sw.json @@ -12,7 +12,7 @@ "from": [0, 0, 4], "to": [1, 16, 16], "faces": { - "north": {"uv": [0, 0, 1, 16], "texture": "#1"}, + "north": {"uv": [15, 0, 16, 16], "texture": "#1"}, "east": {"uv": [0, 0, 12, 16], "texture": "#1"}, "west": {"uv": [4, 0, 16, 16], "texture": "#1"} } @@ -41,7 +41,7 @@ "to": [12, 16, 16], "faces": { "north": {"uv": [4, 0, 16, 16], "texture": "#1"}, - "east": {"uv": [15, 0, 16, 16], "texture": "#1"}, + "east": {"uv": [0, 0, 1, 16], "texture": "#1"}, "south": {"uv": [0, 0, 12, 16], "texture": "#1"} } } diff --git a/src/main/resources/assets/create/models/block/fluid_tank/block_single_window_nw.json b/src/main/resources/assets/create/models/block/fluid_tank/block_single_window_nw.json index 171e73ee6c..26e01b2a59 100644 --- a/src/main/resources/assets/create/models/block/fluid_tank/block_single_window_nw.json +++ b/src/main/resources/assets/create/models/block/fluid_tank/block_single_window_nw.json @@ -16,7 +16,7 @@ "rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 8]}, "faces": { "north": {"uv": [4, 4, 16, 12], "texture": "#1"}, - "east": {"uv": [0, 4, 1, 12], "texture": "#1"}, + "east": {"uv": [15, 4, 16, 12], "texture": "#1"}, "south": {"uv": [0, 4, 12, 12], "texture": "#1"} } }, @@ -47,7 +47,7 @@ "rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 8]}, "faces": { "east": {"uv": [4, 4, 16, 12], "texture": "#1"}, - "south": {"uv": [16, 4, 15, 12], "texture": "#1"}, + "south": {"uv": [1, 4, 0, 12], "texture": "#1"}, "west": {"uv": [0, 4, 12, 12], "texture": "#1"} } }, diff --git a/src/main/resources/assets/create/models/block/fluid_tank/block_single_window_se.json b/src/main/resources/assets/create/models/block/fluid_tank/block_single_window_se.json index 38edb8bf9a..e9f2e088f0 100644 --- a/src/main/resources/assets/create/models/block/fluid_tank/block_single_window_se.json +++ b/src/main/resources/assets/create/models/block/fluid_tank/block_single_window_se.json @@ -17,7 +17,7 @@ "faces": { "north": {"uv": [0, 4, 12, 12], "texture": "#1"}, "south": {"uv": [4, 4, 16, 12], "texture": "#1"}, - "west": {"uv": [0, 4, 1, 12], "texture": "#1"} + "west": {"uv": [15, 4, 16, 12], "texture": "#1"} } }, { @@ -46,7 +46,7 @@ "to": [16, 12, 16], "rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 8]}, "faces": { - "north": {"uv": [15, 4, 16, 12], "texture": "#1"}, + "north": {"uv": [0, 4, 1, 12], "texture": "#1"}, "east": {"uv": [0, 4, 12, 12], "texture": "#1"}, "west": {"uv": [4, 4, 16, 12], "texture": "#1"} } diff --git a/src/main/resources/assets/create/models/block/fluid_tank/block_single_window_sw.json b/src/main/resources/assets/create/models/block/fluid_tank/block_single_window_sw.json index 2bcbfcb7ef..07ec44f9d9 100644 --- a/src/main/resources/assets/create/models/block/fluid_tank/block_single_window_sw.json +++ b/src/main/resources/assets/create/models/block/fluid_tank/block_single_window_sw.json @@ -15,7 +15,7 @@ "to": [1, 12, 16], "rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 8]}, "faces": { - "north": {"uv": [0, 4, 1, 12], "texture": "#1"}, + "north": {"uv": [15, 4, 16, 12], "texture": "#1"}, "east": {"uv": [0, 4, 12, 12], "texture": "#1"}, "west": {"uv": [4, 4, 16, 12], "texture": "#1"} } @@ -47,7 +47,7 @@ "rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 8]}, "faces": { "north": {"uv": [4, 4, 16, 12], "texture": "#1"}, - "east": {"uv": [15, 4, 16, 12], "texture": "#1"}, + "east": {"uv": [0, 4, 1, 12], "texture": "#1"}, "south": {"uv": [0, 4, 12, 12], "texture": "#1"} } }, diff --git a/src/main/resources/assets/create/sounds/frogport_open.ogg b/src/main/resources/assets/create/sounds/frogport_open.ogg deleted file mode 100644 index ac2e1c771e5a1fcd298867ebf96e24d7837871eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7222 zcmai32|UzY_y3KZBrzCLjUq}N^Ssah{r^Aj`}*VQ&V(^BsZ*4{C9=C)+Twn%m zglq}vO~6ACKLnkVMDZm%8=%Of9GRFx3X$QC z&zm!F?Z#X{NXPqRV_Zx$3Xz=AW^XXujo%MAcosY=aP#a&NpWo_utUHu+NUHU;5bG{ zjFh;E0NpKdpEilYOdlTEqU;+yN^Qt6Bc=EG$tIfbi}K<%Kgc}l)!iols2^*D9

O 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 Z2;tAAr6(0WDcVt>hida0hdfoc{|}Y%jHv(s From f3926657af615d7493e17d0974486117174a9b27 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Mon, 6 Jan 2025 17:59:41 -0500 Subject: [PATCH 265/515] Oh, hello! I recognize you now! --- .../compat/jei/category/animations/AnimatedItemDrain.java | 2 +- .../create/compat/jei/category/animations/AnimatedSpout.java | 4 ++-- .../simibubi/create/content/fluids/spout/SpoutRenderer.java | 4 ++-- .../create/content/fluids/tank/FluidTankRenderer.java | 2 +- .../create/content/processing/basin/BasinRenderer.java | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedItemDrain.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedItemDrain.java index 7d6397dd22..7c9d97818b 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedItemDrain.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedItemDrain.java @@ -40,7 +40,7 @@ public class AnimatedItemDrain extends AnimatedKinetics { matrixStack.scale(scale, scale, scale); float from = 2/16f; float to = 1f - from; - FluidRenderer.renderFluidBox(fluid.getFluid(), fluid.getAmount(), from, from, from, to, 3/4f, to, buffer, matrixStack, LightTexture.FULL_BRIGHT, false, true); + FluidRenderer.renderFluidBox(fluid.getFluid(), fluid.getAmount(), from, from, from, to, 3/4f, to, buffer, matrixStack, LightTexture.FULL_BRIGHT, false, true, fluid.getTag()); buffer.endBatch(); matrixStack.popPose(); diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSpout.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSpout.java index d1e7e9833c..31301e369a 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSpout.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSpout.java @@ -75,7 +75,7 @@ public class AnimatedSpout extends AnimatedKinetics { float from = 3f / 16f; float to = 17f / 16f; FluidStack fluidStack = fluids.get(0); - FluidRenderer.renderFluidBox(fluidStack.getFluid(), fluidStack.getAmount(), from, from, from, to, to, to, buffer, matrixStack, LightTexture.FULL_BRIGHT, false, true); + FluidRenderer.renderFluidBox(fluidStack.getFluid(), fluidStack.getAmount(), from, from, from, to, to, to, buffer, matrixStack, LightTexture.FULL_BRIGHT, false, true, fluidStack.getTag()); matrixStack.popPose(); float width = 1 / 128f * squeeze; @@ -85,7 +85,7 @@ public class AnimatedSpout extends AnimatedKinetics { matrixStack.translate(-0.5f, 0, -0.5f); from = -width / 2 + 0.5f; to = width / 2 + 0.5f; - FluidRenderer.renderFluidBox(fluidStack.getFluid(), fluidStack.getAmount(), from, 0, from, to, 2, to, buffer, matrixStack, LightTexture.FULL_BRIGHT, false, true); + FluidRenderer.renderFluidBox(fluidStack.getFluid(), fluidStack.getAmount(), from, 0, from, to, 2, to, buffer, matrixStack, LightTexture.FULL_BRIGHT, false, true, fluidStack.getTag()); buffer.endBatch(); Lighting.setupFor3DItems(); diff --git a/src/main/java/com/simibubi/create/content/fluids/spout/SpoutRenderer.java b/src/main/java/com/simibubi/create/content/fluids/spout/SpoutRenderer.java index 97921575d4..2cd4f5f1c8 100644 --- a/src/main/java/com/simibubi/create/content/fluids/spout/SpoutRenderer.java +++ b/src/main/java/com/simibubi/create/content/fluids/spout/SpoutRenderer.java @@ -54,7 +54,7 @@ public class SpoutRenderer extends SafeBlockEntityRenderer { FluidRenderer.renderFluidBox(fluidStack.getFluid(), fluidStack.getAmount(), min, min - yOffset, min, max, min, max, - buffer, ms, light, false, true); + buffer, ms, light, false, true, fluidStack.getTag()); ms.popPose(); } @@ -69,7 +69,7 @@ public class SpoutRenderer extends SafeBlockEntityRenderer { radius = (float) (Math.pow(((2 * processingProgress) - 1), 2) - 1); AABB bb = new AABB(0.5, .5, 0.5, 0.5, -1.2, 0.5).inflate(radius / 32f); FluidRenderer.renderFluidBox(fluidStack.getFluid(), fluidStack.getAmount(), (float) bb.minX, (float) bb.minY, (float) bb.minZ, - (float) bb.maxX, (float) bb.maxY, (float) bb.maxZ, buffer, ms, light, true, true); + (float) bb.maxX, (float) bb.maxY, (float) bb.maxZ, buffer, ms, light, true, true, fluidStack.getTag()); } float squeeze = radius; diff --git a/src/main/java/com/simibubi/create/content/fluids/tank/FluidTankRenderer.java b/src/main/java/com/simibubi/create/content/fluids/tank/FluidTankRenderer.java index 74c693385b..bcaaa97689 100644 --- a/src/main/java/com/simibubi/create/content/fluids/tank/FluidTankRenderer.java +++ b/src/main/java/com/simibubi/create/content/fluids/tank/FluidTankRenderer.java @@ -74,7 +74,7 @@ public class FluidTankRenderer extends SafeBlockEntityRenderer { float partial = Mth.clamp(units / totalUnits, 0, 1); xMax += partial * 12 / 16f; FluidRenderer.renderFluidBox(renderedFluid.getFluid(), renderedFluid.getAmount(), xMin, yMin, zMin, xMax, yMax, zMax, buffer, ms, light, - false, false); + false, false, renderedFluid.getTag()); xMin = xMax; } From d05d10e1e096795fd583895bcaabf8c3d5dc855c Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Tue, 7 Jan 2025 12:31:57 +0100 Subject: [PATCH 266/515] Clicks and Dings - Added sounds for packagers, stock links, requesters and factory gauges - Added tooltip for factory gauge screen explaining how to add ingredients --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 6 +-- .../c24b4d2b8d15abff51c78bd94f4403d9eae6c139 | 4 +- .../resources/assets/create/lang/en_ud.json | 7 ++- .../resources/assets/create/lang/en_us.json | 7 ++- .../resources/assets/create/sounds.json | 20 +++++++- .../java/com/simibubi/create/AllPackets.java | 4 ++ .../com/simibubi/create/AllSoundEvents.java | 13 +++++- .../content/logistics/box/PackageEntity.java | 2 +- .../content/logistics/box/PackageItem.java | 4 +- .../factoryBoard/FactoryPanelBehaviour.java | 9 ++++ .../FactoryPanelConnectionHandler.java | 16 ++++++- .../factoryBoard/FactoryPanelScreen.java | 32 ++++++++++++- .../packager/PackagerBlockEntity.java | 11 +++++ .../packagerLink/PackagerLinkBlockEntity.java | 25 ++++++---- .../PackagerLinkEffectPacket.java | 39 ++++++++++++++++ .../RedstoneRequesterBlockEntity.java | 43 ++++++++++++++---- .../RedstoneRequesterEffectPacket.java | 43 ++++++++++++++++++ .../assets/create/lang/default/interface.json | 5 +- .../assets/create/sounds/stock_link.ogg | Bin 0 -> 7213 bytes 19 files changed, 254 insertions(+), 36 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkEffectPacket.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterEffectPacket.java create mode 100644 src/main/resources/assets/create/sounds/stock_link.ogg diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 7d6fdeaaa4..2fc7eb0609 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2025-01-06T22:46:25.6513213 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2025-01-07T12:22:29.7526816 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -642,8 +642,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -908484cff8ec27c3b4cf39ac683b6b7a5528e470 assets/create/lang/en_ud.json -7401dfd627e4b0177b75aff4068be5d249e326f2 assets/create/lang/en_us.json +f33342a6f59c0aadf05c761a24bd33bc927996ad assets/create/lang/en_ud.json +eef9a5ef2d3cb60dee7277624e8ad5bd54521cf6 assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json diff --git a/src/generated/resources/.cache/c24b4d2b8d15abff51c78bd94f4403d9eae6c139 b/src/generated/resources/.cache/c24b4d2b8d15abff51c78bd94f4403d9eae6c139 index 809e95f7e8..835758bfdb 100644 --- a/src/generated/resources/.cache/c24b4d2b8d15abff51c78bd94f4403d9eae6c139 +++ b/src/generated/resources/.cache/c24b4d2b8d15abff51c78bd94f4403d9eae6c139 @@ -1,2 +1,2 @@ -// 1.20.1 2025-01-06T22:46:25.6503343 Create's Custom Sounds -1305ab16efe6b554f5c852de0d52adaf419c4f76 assets/create/sounds.json +// 1.20.1 2025-01-07T12:22:29.7516833 Create's Custom Sounds +56957fbbc59f80d23bf39df63f1925112fbfef7d assets/create/sounds.json diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index fad428307f..c7341cb13c 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -1226,7 +1226,7 @@ "create.gui.factory_panel.reset": "sbuıʇʇǝs ןןɐ ʇǝsǝᴚ", "create.gui.factory_panel.restocker_address": "˙˙˙oʇ sɯǝʇı puǝS", "create.gui.factory_panel.restocker_address_given": "oʇ buıpuǝS", - "create.gui.factory_panel.restocker_address_tip": "ןןıʍ ʇɐɥʇ ssǝɹppɐ uɐ ɹǝʇuƎ", + "create.gui.factory_panel.restocker_address_tip": "ןןıʍ ʇɐɥʇ ssǝɹppɐ ǝɥʇ ɹǝʇuƎ", "create.gui.factory_panel.restocker_address_tip_1": "˙ǝɹǝɥ ǝʌıɹɹɐ oʇ sǝbɐʞɔɐd ǝsnɐɔ", "create.gui.factory_panel.restocker_promises_tip": "ǝsıɯoɹd ɐ 'ʇuǝs ǝɹɐ sɯǝʇı uǝɥM", "create.gui.factory_panel.restocker_promises_tip_1": "˙ǝʌıɹɹɐ ʎǝɥʇ ןıʇun pןǝɥ sı", @@ -1238,6 +1238,9 @@ "create.gui.factory_panel.sending_item_tip_1": "ʇunoɯɐ ʇǝbɹɐʇ ǝɥʇ ʍoןǝq sı", "create.gui.factory_panel.title_as_recipe": "sbuıʇʇǝS ǝdıɔǝᴚ", "create.gui.factory_panel.title_as_restocker": "sbuıʇʇǝS ɹǝʞɔoʇsǝᴚ", + "create.gui.factory_panel.unconfigured_input": "sʇuǝıpǝɹbuı ǝdıɔǝᴚ", + "create.gui.factory_panel.unconfigured_input_tip": "ʎq pǝppɐ ǝq uɐɔ sʇuǝıpǝɹbuI", + "create.gui.factory_panel.unconfigured_input_tip_1": "sǝbnɐb ʎɹoʇɔɐɟ ɹǝɥʇo buıʇɔǝuuoɔ", "create.gui.filter.allow_list": "ʇsıꞀ-ʍoןןⱯ", "create.gui.filter.allow_list.description": "˙buıɥʇʎɹǝʌǝ sʇɔǝظǝɹ ʇsıꞀ-ʍoןןⱯ ʎʇdɯǝ uⱯ ˙ǝʌoqɐ ǝɥʇ ɟo ʎuɐ ɥɔʇɐɯ ʎǝɥʇ ɟı ssɐd sɯǝʇI", "create.gui.filter.deny_list": "ʇsıꞀ-ʎuǝᗡ", @@ -2744,6 +2747,7 @@ "create.subtitle.mechanical_press_activation_belt": "sʞuoq ssǝɹԀ ןɐɔıuɐɥɔǝW", "create.subtitle.mixing": "sǝsıou buıxıW", "create.subtitle.package_pop": "sʞɐǝɹq ǝbɐʞɔɐԀ", + "create.subtitle.packager": "sǝbɐʞɔɐd ɹǝbɐʞɔɐԀ", "create.subtitle.peculiar_bell_use": "sןןoʇ ןןǝᗺ ɹɐıןnɔǝԀ", "create.subtitle.potato_hit": "sʇɔɐdɯı ǝןqɐʇǝbǝΛ", "create.subtitle.sanding_long": "sǝsıou buıpuɐS", @@ -2756,6 +2760,7 @@ "create.subtitle.slime_added": "sǝɥsınbs ǝɯıןS", "create.subtitle.spout": "sʇɹnds ʇnodS", "create.subtitle.steam": "sǝsıou ɯɐǝʇS", + "create.subtitle.stock_link": "sʇɔɐǝɹ ʞuıן ʞɔoʇS", "create.subtitle.stock_ticker_request": "sʇsǝnbǝɹ ɹǝʞɔıʇ ʞɔoʇS", "create.subtitle.stock_ticker_trade": ",¡buıɥɔ-ɐʞ, sǝob ɹǝʞɔıʇ ʞɔoʇS", "create.subtitle.train": "ǝןqɯnɹ sןǝǝɥʍ ʎǝboᗺ", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 1c05daf002..0b1c72200c 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1226,7 +1226,7 @@ "create.gui.factory_panel.reset": "Reset all settings", "create.gui.factory_panel.restocker_address": "Send items to...", "create.gui.factory_panel.restocker_address_given": "Sending to", - "create.gui.factory_panel.restocker_address_tip": "Enter an address that will", + "create.gui.factory_panel.restocker_address_tip": "Enter the address that will", "create.gui.factory_panel.restocker_address_tip_1": "cause packages to arrive here.", "create.gui.factory_panel.restocker_promises_tip": "When items are sent, a promise", "create.gui.factory_panel.restocker_promises_tip_1": "is held until they arrive.", @@ -1238,6 +1238,9 @@ "create.gui.factory_panel.sending_item_tip_1": "is below the target amount", "create.gui.factory_panel.title_as_recipe": "Recipe Settings", "create.gui.factory_panel.title_as_restocker": "Restocker Settings", + "create.gui.factory_panel.unconfigured_input": "Recipe ingredients", + "create.gui.factory_panel.unconfigured_input_tip": "Ingredients can be added by", + "create.gui.factory_panel.unconfigured_input_tip_1": "connecting other factory gauges", "create.gui.filter.allow_list": "Allow-List", "create.gui.filter.allow_list.description": "Items pass if they match any of the above. An empty Allow-List rejects everything.", "create.gui.filter.deny_list": "Deny-List", @@ -2744,6 +2747,7 @@ "create.subtitle.mechanical_press_activation_belt": "Mechanical Press bonks", "create.subtitle.mixing": "Mixing noises", "create.subtitle.package_pop": "Package breaks", + "create.subtitle.packager": "Packager packages", "create.subtitle.peculiar_bell_use": "Peculiar Bell tolls", "create.subtitle.potato_hit": "Vegetable impacts", "create.subtitle.sanding_long": "Sanding noises", @@ -2756,6 +2760,7 @@ "create.subtitle.slime_added": "Slime squishes", "create.subtitle.spout": "Spout spurts", "create.subtitle.steam": "Steam noises", + "create.subtitle.stock_link": "Stock link reacts", "create.subtitle.stock_ticker_request": "Stock ticker requests", "create.subtitle.stock_ticker_trade": "Stock ticker goes 'ka-ching!'", "create.subtitle.train": "Bogey wheels rumble", diff --git a/src/generated/resources/assets/create/sounds.json b/src/generated/resources/assets/create/sounds.json index 82ab6f95eb..7d73bd5699 100644 --- a/src/generated/resources/assets/create/sounds.json +++ b/src/generated/resources/assets/create/sounds.json @@ -414,7 +414,7 @@ "sounds": [ { "type": "event", - "name": "minecraft:entity.armor_stand.break" + "name": "minecraft:block.chiseled_bookshelf.break" } ], "subtitle": "create.subtitle.package_pop" @@ -427,6 +427,15 @@ } ] }, + "packager": { + "sounds": [ + { + "type": "event", + "name": "minecraft:entity.shulker.open" + } + ], + "subtitle": "create.subtitle.packager" + }, "peculiar_bell_use": { "sounds": [ { @@ -560,6 +569,15 @@ ], "subtitle": "create.subtitle.steam" }, + "stock_link": { + "sounds": [ + { + "type": "file", + "name": "create:stock_link" + } + ], + "subtitle": "create.subtitle.stock_link" + }, "stock_ticker_request": { "sounds": [ { diff --git a/src/main/java/com/simibubi/create/AllPackets.java b/src/main/java/com/simibubi/create/AllPackets.java index 04b14b45b4..bf7ea041b5 100644 --- a/src/main/java/com/simibubi/create/AllPackets.java +++ b/src/main/java/com/simibubi/create/AllPackets.java @@ -68,7 +68,9 @@ import com.simibubi.create.content.logistics.filter.FilterScreenPacket; import com.simibubi.create.content.logistics.funnel.FunnelFlapPacket; import com.simibubi.create.content.logistics.packagePort.PackagePortConfigurationPacket; import com.simibubi.create.content.logistics.packagePort.PackagePortPlacementPacket; +import com.simibubi.create.content.logistics.packagerLink.PackagerLinkEffectPacket; import com.simibubi.create.content.logistics.redstoneRequester.RedstoneRequesterConfigurationPacket; +import com.simibubi.create.content.logistics.redstoneRequester.RedstoneRequesterEffectPacket; import com.simibubi.create.content.logistics.stockTicker.LogisticalStockRequestPacket; import com.simibubi.create.content.logistics.stockTicker.LogisticalStockResponsePacket; import com.simibubi.create.content.logistics.stockTicker.PackageOrderRequestPacket; @@ -251,6 +253,8 @@ public enum AllPackets { PACKAGE_DESTROYED(PackageDestroyPacket.class, PackageDestroyPacket::new, PLAY_TO_CLIENT), LOGISTICS_STOCK_RESPONSE(LogisticalStockResponsePacket.class, LogisticalStockResponsePacket::new, PLAY_TO_CLIENT), FACTORY_PANEL_EFFECT(FactoryPanelEffectPacket.class, FactoryPanelEffectPacket::new, PLAY_TO_CLIENT), + PACKAGER_LINK_EFFECT(PackagerLinkEffectPacket.class, PackagerLinkEffectPacket::new, PLAY_TO_CLIENT), + REDSTONE_REQUESTER_EFFECT(RedstoneRequesterEffectPacket.class, RedstoneRequesterEffectPacket::new, PLAY_TO_CLIENT), KNOCKBACK(KnockbackPacket.class, KnockbackPacket::new, PLAY_TO_CLIENT), TRAIN_MAP_SYNC(TrainMapSyncPacket.class, TrainMapSyncPacket::new, PLAY_TO_CLIENT), CLIENTBOUND_CHAIN_CONVEYOR(ClientboundChainConveyorRidingPacket.class, ClientboundChainConveyorRidingPacket::new, PLAY_TO_CLIENT); diff --git a/src/main/java/com/simibubi/create/AllSoundEvents.java b/src/main/java/com/simibubi/create/AllSoundEvents.java index 0fed06da67..f1d9efba19 100644 --- a/src/main/java/com/simibubi/create/AllSoundEvents.java +++ b/src/main/java/com/simibubi/create/AllSoundEvents.java @@ -63,6 +63,11 @@ public class AllSoundEvents { .playExisting(SoundEvents.WOOL_BREAK, .0425f, .75f) .category(SoundSource.BLOCKS) .build(), + + PACKAGER = create("packager").subtitle("Packager packages") + .playExisting(SoundEvents.SHULKER_OPEN, 0.125f, 0.75f) + .category(SoundSource.BLOCKS) + .build(), SLIME_ADDED = create("slime_added").subtitle("Slime squishes") .playExisting(SoundEvents.SLIME_BLOCK_PLACE) @@ -161,6 +166,10 @@ public class AllSoundEvents { FROGPORT_CATCH_4 = create("frogport_catch_4").subtitle("Frogport catches package") .category(SoundSource.BLOCKS) .build(), + + STOCK_LINK = create("stock_link").subtitle("Stock link reacts") + .category(SoundSource.BLOCKS) + .build(), FROGPORT_DEPOSIT = create("frogport_deposit").subtitle("Frogport places package") .playExisting(SoundEvents.FROG_TONGUE, 1f, 1f) @@ -196,8 +205,8 @@ public class AllSoundEvents { .build(), PACKAGE_POP = create("package_pop").subtitle("Package breaks") - .playExisting(SoundEvents.ARMOR_STAND_BREAK, .25f, .75f) - .playExisting(SoundEvents.WOOL_BREAK, .5f, 1.15f) + .playExisting(SoundEvents.CHISELED_BOOKSHELF_BREAK, .75f, 1f) + .playExisting(SoundEvents.WOOL_BREAK, .25f, 1.15f) .category(SoundSource.BLOCKS) .build(), diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java index 70fbfe8851..9c40a71e43 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java @@ -454,7 +454,7 @@ public class PackageEntity extends LivingEntity implements IEntityAdditionalSpaw @Nullable protected SoundEvent getHurtSound(DamageSource damageSourceIn) { - return SoundEvents.CHISELED_BOOKSHELF_BREAK; + return null; } @Nullable diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java index a80d24043d..409649a7dc 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java @@ -5,6 +5,7 @@ import java.util.List; import javax.annotation.Nullable; import com.simibubi.create.AllEntityTypes; +import com.simibubi.create.AllSoundEvents; import com.simibubi.create.Create; import com.simibubi.create.content.logistics.box.PackageStyles.PackageStyle; import com.simibubi.create.content.logistics.stockTicker.PackageOrder; @@ -285,8 +286,7 @@ public class PackageItem extends Item { } Vec3 position = playerIn.position(); - worldIn.playSound((Player) null, position.x, position.y, position.z, SoundEvents.CHISELED_BOOKSHELF_BREAK, - SoundSource.PLAYERS, 0.5F, 1.0F); + AllSoundEvents.PACKAGE_POP.playOnServer(worldIn, playerIn.blockPosition()); if (worldIn.isClientSide()) { for (int i = 0; i < 10; i++) { diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java index ef085eeac4..aca86bee8c 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java @@ -19,6 +19,7 @@ import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllPackets; +import com.simibubi.create.AllSoundEvents; import com.simibubi.create.AllTags.AllItemTags; import com.simibubi.create.Create; import com.simibubi.create.content.logistics.BigItemStack; @@ -93,6 +94,7 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { private boolean promisePrimedForMarkDirty; private boolean active; + private boolean queueDing; private int lastReportedUnloadedLinks; private int lastReportedLevelInStorage; private int lastReportedPromises; @@ -246,6 +248,11 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { && lastReportedUnloadedLinks == unloadedLinkCount && satisfied == shouldSatisfy && promisedSatisfied == shouldPromiseSatisfy && waitingForNetwork == shouldWait) return; + + if (!satisfied && shouldSatisfy) { + AllSoundEvents.CONFIRM.playOnServer(getWorld(), getPos(), 0.075f, 1f); + AllSoundEvents.CONFIRM_2.playOnServer(getWorld(), getPos(), 0.125f, 0.575f); + } boolean notifyOutputs = satisfied != shouldSatisfy; lastReportedLevelInStorage = inStorage; @@ -659,6 +666,8 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { return; } + boolean previouslySatisfied = satisfied; + active = true; filter = FilterItemStack.of(panelTag.getCompound("Filter")); count = panelTag.getInt("FilterAmount"); diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionHandler.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionHandler.java index 59abe207f0..7d78012693 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionHandler.java @@ -3,6 +3,7 @@ package com.simibubi.create.content.logistics.factoryBoard; import javax.annotation.Nullable; import com.simibubi.create.AllPackets; +import com.simibubi.create.AllSoundEvents; import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBlock.PanelSlot; import com.simibubi.create.foundation.block.WrenchableDirectionalBlock; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; @@ -16,6 +17,8 @@ import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.LevelAccessor; @@ -51,6 +54,7 @@ public class FactoryPanelConnectionHandler { .component(), true); connectingFrom = null; connectingFromBox = null; + AllSoundEvents.DENY.playAt(player.level(), player.blockPosition(), 1, 1, false); return true; } @@ -69,6 +73,10 @@ public class FactoryPanelConnectionHandler { connectingFrom = null; connectingFromBox = null; + player.level() + .playLocalSound(player.blockPosition(), SoundEvents.AMETHYST_BLOCK_PLACE, SoundSource.BLOCKS, 0.5f, 0.5f, + false); + return true; } @@ -80,7 +88,7 @@ public class FactoryPanelConnectionHandler { return "factory_panel.already_connected"; if (from.targetedBy.size() >= 9) return "factory_panel.cannot_add_more_inputs"; - + BlockState state1 = to.blockEntity.getBlockState(); BlockState state2 = from.blockEntity.getBlockState(); BlockPos diff = to.getPos() @@ -115,7 +123,7 @@ public class FactoryPanelConnectionHandler { private static String checkForIssues(FactoryPanelBehaviour from, FactoryPanelSupportBehaviour to) { if (from == null) return "factory_panel.connection_aborted"; - + BlockState state1 = from.blockEntity.getBlockState(); BlockState state2 = to.blockEntity.getBlockState(); BlockPos diff = to.getPos() @@ -180,6 +188,7 @@ public class FactoryPanelConnectionHandler { .component(), true); connectingFrom = null; connectingFromBox = null; + AllSoundEvents.DENY.playAt(mc.level, mc.player.blockPosition(), 1, 1, false); return true; } @@ -209,6 +218,9 @@ public class FactoryPanelConnectionHandler { connectingFrom = null; connectingFromBox = null; + mc.player.level() + .playLocalSound(mc.player.blockPosition(), SoundEvents.AMETHYST_BLOCK_PLACE, SoundSource.BLOCKS, + 0.5f, 0.5f, false); return true; } diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java index 4099197700..501bd8f713 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java @@ -35,9 +35,11 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.EditBox; import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.resources.sounds.SimpleSoundInstance; import net.minecraft.core.NonNullList; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; +import net.minecraft.sounds.SoundEvents; import net.minecraft.util.Mth; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; @@ -237,9 +239,26 @@ public class FactoryPanelScreen extends AbstractSimiScreen { if (craftingActive) { for (BigItemStack itemStack : craftingIngredients) renderInputItem(graphics, slot++, itemStack, mouseX, mouseY); - } else + } else { for (BigItemStack itemStack : inputConfig) renderInputItem(graphics, slot++, itemStack, mouseX, mouseY); + if (inputConfig.isEmpty()) { + int inputX = guiLeft + (restocker ? 88 : 68 + (slot % 3 * 20)); + int inputY = guiTop + (restocker ? 12 : 28) + (slot / 3 * 20); + if (!restocker && mouseY > inputY && mouseY < inputY + 60 && mouseX > inputX && mouseX < inputX + 60) + graphics.renderComponentTooltip(font, + List.of(CreateLang.translate("gui.factory_panel.unconfigured_input") + .color(ScrollInput.HEADER_RGB) + .component(), + CreateLang.translate("gui.factory_panel.unconfigured_input_tip") + .style(ChatFormatting.GRAY) + .component(), + CreateLang.translate("gui.factory_panel.unconfigured_input_tip_1") + .style(ChatFormatting.GRAY) + .component()), + mouseX, mouseY); + } + } if (restocker) renderInputItem(graphics, slot, new BigItemStack(behaviour.getFilter(), 1), mouseX, mouseY); @@ -404,7 +423,7 @@ public class FactoryPanelScreen extends AbstractSimiScreen { mouseX, mouseY); return; } - + if (itemStack.stack.isEmpty()) { graphics.renderComponentTooltip(font, List.of(CreateLang.translate("gui.factory_panel.empty_panel") .color(ScrollInput.HEADER_RGB) @@ -517,6 +536,7 @@ public class FactoryPanelScreen extends AbstractSimiScreen { int inputY = y + 28 + (i / 3 * 20); if (mouseX >= inputX && mouseX < inputX + 16 && mouseY >= inputY && mouseY < inputY + 16) { sendIt(connections.get(i).from, false); + playButtonSound(); return true; } } @@ -526,6 +546,7 @@ public class FactoryPanelScreen extends AbstractSimiScreen { int itemY = y + windowHeight - 24; if (mouseX >= itemX && mouseX < itemX + 16 && mouseY >= itemY && mouseY < itemY + 16) { sendIt(null, true); + playButtonSound(); return true; } @@ -535,12 +556,19 @@ public class FactoryPanelScreen extends AbstractSimiScreen { if (mouseX >= itemX && mouseX < itemX + 16 && mouseY >= itemY && mouseY < itemY + 16) { sendRedstoneReset = true; sendIt(null, false); + playButtonSound(); return true; } return super.mouseClicked(mouseX, mouseY, pButton); } + public void playButtonSound() { + Minecraft.getInstance() + .getSoundManager() + .play(SimpleSoundInstance.forUI(SoundEvents.UI_BUTTON_CLICK.get(), 1.0f, 0.25f)); + } + @Override public boolean mouseScrolled(double mouseX, double mouseY, double pDelta) { int x = guiLeft; diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java index 64977e50ed..4c83d950e3 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java @@ -9,6 +9,7 @@ import java.util.UUID; import org.jetbrains.annotations.NotNull; import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllSoundEvents; import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.actors.psi.PortableStorageInterfaceBlockEntity; import com.simibubi.create.content.kinetics.crafter.MechanicalCrafterBlockEntity; @@ -39,6 +40,8 @@ import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; import net.minecraft.util.Mth; import net.minecraft.world.Containers; import net.minecraft.world.item.ItemStack; @@ -130,6 +133,14 @@ public class PackagerBlockEntity extends SmartBlockEntity { return; } + if (level.isClientSide) { + if (animationTicks == CYCLE - (animationInward ? 5 : 1)) + AllSoundEvents.PACKAGER.playAt(level, worldPosition, 1, 1, true); + if (animationTicks == (animationInward ? 1 : 5)) + level.playLocalSound(worldPosition, SoundEvents.IRON_TRAPDOOR_CLOSE, SoundSource.BLOCKS, 0.075f, 0.75f, + true); + } + animationTicks--; if (animationTicks == 0 && !level.isClientSide()) { diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java index 20b8db6ef2..85f4dedeaa 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java @@ -7,23 +7,28 @@ import javax.annotation.Nullable; import org.apache.commons.lang3.mutable.MutableBoolean; +import com.simibubi.create.AllPackets; +import com.simibubi.create.AllSoundEvents; import com.simibubi.create.content.logistics.packager.InventorySummary; import com.simibubi.create.content.logistics.packager.PackagerBlockEntity; import com.simibubi.create.content.logistics.packager.PackagingRequest; import com.simibubi.create.content.logistics.packager.repackager.RepackagerBlockEntity; import com.simibubi.create.content.logistics.stockTicker.PackageOrder; -import com.simibubi.create.content.redstone.displayLink.LinkWithBulbBlockEntity; +import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import net.createmod.catnip.utility.Pair; import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.VibrationParticleOption; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.gameevent.BlockPositionSource; +import net.minecraft.world.phys.Vec3; import net.minecraftforge.items.IItemHandler; -public class PackagerLinkBlockEntity extends LinkWithBulbBlockEntity { +public class PackagerLinkBlockEntity extends SmartBlockEntity { public LogisticallyLinkedBehaviour behaviour; public UUID placedBy; @@ -40,12 +45,16 @@ public class PackagerLinkBlockEntity extends LinkWithBulbBlockEntity { return InventorySummary.EMPTY; if (packager.isTargetingSameInventory(ignoredHandler)) return InventorySummary.EMPTY; - - sendPulseNextSync(); - sendData(); return packager.getAvailableItems(); } + public void playEffect() { + AllSoundEvents.STOCK_LINK.playAt(level, worldPosition, 1.0f, 1.0f, false); + Vec3 vec3 = Vec3.atCenterOf(worldPosition); + level.addParticle(new VibrationParticleOption(new BlockPositionSource(worldPosition.above(3)), 6), vec3.x, + vec3.y, vec3.z, 1, 1, 1); + } + public Pair processRequest(ItemStack stack, int amount, String address, int linkIndex, MutableBoolean finalLink, int orderId, @Nullable PackageOrder orderContext, @Nullable IItemHandler ignoredHandler) { @@ -59,11 +68,9 @@ public class PackagerLinkBlockEntity extends LinkWithBulbBlockEntity { int availableCount = summary.getCountOf(stack); if (availableCount == 0) return null; - - sendPulseNextSync(); - sendData(); - int toWithdraw = Math.min(amount, availableCount); + if (toWithdraw != 0) + AllPackets.sendToNear(level, worldPosition, 32, new PackagerLinkEffectPacket(worldPosition)); return Pair.of(packager, PackagingRequest.create(stack, toWithdraw, address, linkIndex, finalLink, 0, orderId, orderContext)); } diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkEffectPacket.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkEffectPacket.java new file mode 100644 index 0000000000..d47525db94 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkEffectPacket.java @@ -0,0 +1,39 @@ +package com.simibubi.create.content.logistics.packagerLink; + +import com.simibubi.create.foundation.networking.SimplePacketBase; + +import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.network.NetworkEvent.Context; + +public class PackagerLinkEffectPacket extends SimplePacketBase { + + private BlockPos pos; + + public PackagerLinkEffectPacket(BlockPos pos) { + this.pos = pos; + } + + public PackagerLinkEffectPacket(FriendlyByteBuf buffer) { + pos = buffer.readBlockPos(); + } + + @Override + public void write(FriendlyByteBuf buffer) { + buffer.writeBlockPos(pos); + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean handle(Context context) { + context.enqueueWork(() -> { + if (Minecraft.getInstance().level.getBlockEntity(pos) instanceof PackagerLinkBlockEntity plbe) + plbe.playEffect(); + }); + return true; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlockEntity.java index 41af45295a..6645397012 100644 --- a/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlockEntity.java @@ -1,5 +1,7 @@ package com.simibubi.create.content.logistics.redstoneRequester; +import com.simibubi.create.AllPackets; +import com.simibubi.create.AllSoundEvents; import com.simibubi.create.content.logistics.BigItemStack; import com.simibubi.create.content.logistics.packager.InventorySummary; import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedBehaviour.RequestType; @@ -8,6 +10,7 @@ import com.simibubi.create.content.logistics.stockTicker.StockCheckingBlockEntit import net.createmod.catnip.utility.lang.Components; import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.ParticleTypes; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; @@ -18,6 +21,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; import net.minecraftforge.common.util.FakePlayer; import net.minecraftforge.network.NetworkHooks; @@ -53,18 +57,27 @@ public class RedstoneRequesterBlockEntity extends StockCheckingBlockEntity imple if (encodedRequest.isEmpty()) return; - if (!allowPartialRequests) { - InventorySummary summaryOfOrder = new InventorySummary(); - encodedRequest.stacks() - .forEach(summaryOfOrder::add); + boolean anySucceeded = false; - InventorySummary summary = getAccurateSummary(); - for (BigItemStack entry : summaryOfOrder.getStacks()) - if (summary.getCountOf(entry.stack) < entry.count) - return; + InventorySummary summaryOfOrder = new InventorySummary(); + encodedRequest.stacks() + .forEach(summaryOfOrder::add); + + InventorySummary summary = getAccurateSummary(); + for (BigItemStack entry : summaryOfOrder.getStacks()) { + if (summary.getCountOf(entry.stack) >= entry.count) { + anySucceeded = true; + continue; + } + if (!allowPartialRequests) { + AllPackets.sendToNear(level, worldPosition, 32, + new RedstoneRequesterEffectPacket(worldPosition, false)); + return; + } } broadcastPackageRequest(RequestType.REDSTONE, encodedRequest, null, encodedTargetAdress); + AllPackets.sendToNear(level, worldPosition, 32, new RedstoneRequesterEffectPacket(worldPosition, anySucceeded)); lastRequestSucceeded = true; } @@ -85,7 +98,7 @@ public class RedstoneRequesterBlockEntity extends StockCheckingBlockEntity imple tag.putString("EncodedAddress", encodedTargetAdress); tag.put("EncodedRequest", encodedRequest.write()); } - + @Override protected void write(CompoundTag tag, boolean clientPacket) { super.write(tag, clientPacket); @@ -120,4 +133,16 @@ public class RedstoneRequesterBlockEntity extends StockCheckingBlockEntity imple return RedstoneRequesterMenu.create(pContainerId, pPlayerInventory, this); } + public void playEffect(boolean success) { + AllSoundEvents.STOCK_LINK.playAt(level, worldPosition, 1.0f, 1.0f, false); + Vec3 vec3 = Vec3.atCenterOf(worldPosition); + if (success) { + AllSoundEvents.CONFIRM.playAt(level, worldPosition, 0.5f, 1.5f, false); + level.addParticle(ParticleTypes.NOTE, vec3.x, vec3.y + 1, vec3.z, 0, 0, 0); + } else { + AllSoundEvents.DENY.playAt(level, worldPosition, 0.5f, 1, false); + level.addParticle(ParticleTypes.ENCHANTED_HIT, vec3.x, vec3.y + 1, vec3.z, 0, 0, 0); + } + } + } diff --git a/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterEffectPacket.java b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterEffectPacket.java new file mode 100644 index 0000000000..3e47d5005c --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterEffectPacket.java @@ -0,0 +1,43 @@ +package com.simibubi.create.content.logistics.redstoneRequester; + +import com.simibubi.create.foundation.networking.SimplePacketBase; + +import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.network.NetworkEvent.Context; + +public class RedstoneRequesterEffectPacket extends SimplePacketBase { + + private BlockPos pos; + private boolean success; + + public RedstoneRequesterEffectPacket(BlockPos pos, boolean success) { + this.pos = pos; + this.success = success; + } + + public RedstoneRequesterEffectPacket(FriendlyByteBuf buffer) { + pos = buffer.readBlockPos(); + success = buffer.readBoolean(); + } + + @Override + public void write(FriendlyByteBuf buffer) { + buffer.writeBlockPos(pos); + buffer.writeBoolean(success); + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean handle(Context context) { + context.enqueueWork(() -> { + if (Minecraft.getInstance().level.getBlockEntity(pos) instanceof RedstoneRequesterBlockEntity plbe) + plbe.playEffect(success); + }); + return true; + } + +} diff --git a/src/main/resources/assets/create/lang/default/interface.json b/src/main/resources/assets/create/lang/default/interface.json index f0e58b4f47..2ec46b6a36 100644 --- a/src/main/resources/assets/create/lang/default/interface.json +++ b/src/main/resources/assets/create/lang/default/interface.json @@ -1070,12 +1070,15 @@ "create.gui.factory_panel.recipe_address_tip_1": "this recipe is crafted.", "create.gui.factory_panel.restocker_address": "Send items to...", "create.gui.factory_panel.restocker_address_given": "Sending to", - "create.gui.factory_panel.restocker_address_tip": "Enter an address that will", + "create.gui.factory_panel.restocker_address_tip": "Enter the address that will", "create.gui.factory_panel.restocker_address_tip_1": "cause packages to arrive here.", "create.gui.factory_panel.activate_crafting": "Use Mechanical Crafting", "create.gui.factory_panel.crafting_input": "Packaged Ingredients", "create.gui.factory_panel.crafting_input_tip": "Unpackage into connected", "create.gui.factory_panel.crafting_input_tip_1": "mechanical crafters (3x3)", + "create.gui.factory_panel.unconfigured_input": "Recipe ingredients", + "create.gui.factory_panel.unconfigured_input_tip": "Ingredients can be added by", + "create.gui.factory_panel.unconfigured_input_tip_1": "connecting other factory gauges", "create.gui.factory_panel.inactive": " Inactive ", "create.gui.factory_panel.address_missing": "Inactive: missing a target address", "create.gui.factory_panel.no_target_amount_set": "Inactive: no target amount set", diff --git a/src/main/resources/assets/create/sounds/stock_link.ogg b/src/main/resources/assets/create/sounds/stock_link.ogg new file mode 100644 index 0000000000000000000000000000000000000000..a7b203ccde934a91e8c7910684c0c242c50f3fef GIT binary patch literal 7213 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 UUI~JZ9*9w4c2j!vfrAD5e~_!F Date: Tue, 7 Jan 2025 16:40:10 +0100 Subject: [PATCH 267/515] Comedy Gold - New advancement chain for high logistics - Fixed top-face filter slot on table cloths - Fixed players hiding as packages suffocating in a wall --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 6 +- .../455c485c9c8ef171bbc1ce4d435b3110ba1557ba | 17 +++- .../resources/assets/create/lang/en_ud.json | 34 +++++-- .../resources/assets/create/lang/en_us.json | 34 +++++-- .../data/create/advancements/cardboard.json | 39 ++++++++ .../create/advancements/cardboard_armor.json | 32 ++++++ .../advancements/cardboard_armor_trim.json | 32 ++++++ .../create/advancements/copper_casing.json | 2 +- .../create/advancements/display_link.json | 2 +- .../create/advancements/factory_gauge.json | 31 ++++++ .../data/create/advancements/frogport.json | 31 ++++++ .../advancements/package_chute_throw.json | 31 ++++++ .../data/create/advancements/packager.json | 31 ++++++ .../create/advancements/stock_ticker.json | 31 ++++++ .../create/advancements/table_cloth_shop.json | 31 ++++++ .../create/advancements/train_casing_00.json | 2 +- .../armor/CardboardArmorHandler.java | 17 +++- .../content/kinetics/belt/BeltBlock.java | 8 +- .../belt/transport/BeltMovementHandler.java | 5 +- .../content/logistics/box/PackageEntity.java | 10 +- .../content/logistics/box/PackageItem.java | 9 +- .../logistics/chute/AbstractChuteBlock.java | 10 +- .../factoryBoard/FactoryPanelBehaviour.java | 6 +- .../factoryBoard/FactoryPanelBlock.java | 2 + .../factoryBoard/FactoryPanelBlockEntity.java | 6 ++ .../packagePort/frogport/FrogportBlock.java | 2 + .../frogport/FrogportBlockEntity.java | 14 +++ .../logistics/packager/PackagerBlock.java | 8 ++ .../packager/PackagerBlockEntity.java | 8 +- .../PackageOrderRequestPacket.java | 11 ++- .../logistics/tableCloth/TableClothBlock.java | 2 + .../tableCloth/TableClothFilterSlot.java | 6 +- .../advancement/AllAdvancements.java | 97 ++++++++++++++++--- 33 files changed, 541 insertions(+), 66 deletions(-) create mode 100644 src/generated/resources/data/create/advancements/cardboard.json create mode 100644 src/generated/resources/data/create/advancements/cardboard_armor.json create mode 100644 src/generated/resources/data/create/advancements/cardboard_armor_trim.json create mode 100644 src/generated/resources/data/create/advancements/factory_gauge.json create mode 100644 src/generated/resources/data/create/advancements/frogport.json create mode 100644 src/generated/resources/data/create/advancements/package_chute_throw.json create mode 100644 src/generated/resources/data/create/advancements/packager.json create mode 100644 src/generated/resources/data/create/advancements/stock_ticker.json create mode 100644 src/generated/resources/data/create/advancements/table_cloth_shop.json diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 2fc7eb0609..7827fc4fb9 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2025-01-07T12:22:29.7526816 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2025-01-07T16:30:09.3458051 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -642,8 +642,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -f33342a6f59c0aadf05c761a24bd33bc927996ad assets/create/lang/en_ud.json -eef9a5ef2d3cb60dee7277624e8ad5bd54521cf6 assets/create/lang/en_us.json +ae4560acf1dc152676a319589184d6722d2893e4 assets/create/lang/en_ud.json +b90c20d923ba094594f5062802eeb822f34691ef assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json diff --git a/src/generated/resources/.cache/455c485c9c8ef171bbc1ce4d435b3110ba1557ba b/src/generated/resources/.cache/455c485c9c8ef171bbc1ce4d435b3110ba1557ba index 7bcbca3468..6bf75957b5 100644 --- a/src/generated/resources/.cache/455c485c9c8ef171bbc1ce4d435b3110ba1557ba +++ b/src/generated/resources/.cache/455c485c9c8ef171bbc1ce4d435b3110ba1557ba @@ -1,4 +1,4 @@ -// 1.20.1 2024-10-18T15:46:50.483838 Create's Advancements +// 1.20.1 2025-01-07T16:08:48.0358648 Create's Advancements 2661a689fdcf729494f46e3c719f71c62e31582e data/create/advancements/andesite_alloy.json fa16c4afe0496edc3f157858a6e0ff177a1622ff data/create/advancements/andesite_casing.json 5a694002d0a663bc869b09d15924a10c43dc522f data/create/advancements/anvil_plough.json @@ -10,6 +10,9 @@ b960076e653a3682aa4ebb82bdca957d455c7604 data/create/advancements/backtank.json ca6d0355dbd9a7de587c4ebf2aed82e920e007c1 data/create/advancements/brass.json 78224097bda936d1ba9bf682a9177ad252139a51 data/create/advancements/brass_casing.json 113f1a063d78207e600e536200004756b42e0cd7 data/create/advancements/burner.json +680a97ebbb3579e0cbe52bf3b98bfd94a1d988aa data/create/advancements/cardboard.json +b7da43c88bd8a2e065c1a0656a9831908879c988 data/create/advancements/cardboard_armor.json +ded6f5eac4eab92834e4775285ffbbc2196db081 data/create/advancements/cardboard_armor_trim.json 7c0aed400d4933d5ca13db42517efa2959a1bed0 data/create/advancements/cart_pickup.json 2970c69c310e8e3dbe295621d04a8f42bb7fd1f0 data/create/advancements/chained_drain.json 5334499c577b7531a5de2ff46f371939554f1eb8 data/create/advancements/chocolate_bucket.json @@ -19,7 +22,7 @@ e99071520e9b27b66085367683bc7b972a349c2f data/create/advancements/chute.json 041ddb4720296fc4446d5d694afe3ec1c21c881b data/create/advancements/conductor.json 848f64e1f30c1ec0eac57b6760e282cf030a25fc data/create/advancements/contraption_actors.json 5074053518627b4229bd1f79b20c67e3056f7983 data/create/advancements/copper.json -90763d18fa6cf42cb409b75bc2a3be53d76aab1d data/create/advancements/copper_casing.json +83b2703c3b79187161b44697930bb1c46a920f0b data/create/advancements/copper_casing.json f2e04dd82a25cc080a4901e03e0f1fafeb6ea191 data/create/advancements/crafter_lazy_000.json 4f88d0bf42d208bc5037509c197725bc4e4e68e4 data/create/advancements/cross_streams.json 44ed195706af6ee0cc3b98b9ea4f7d8326899391 data/create/advancements/crusher_maxed_0000.json @@ -27,7 +30,7 @@ f2e04dd82a25cc080a4901e03e0f1fafeb6ea191 data/create/advancements/crafter_lazy_0 01c6fa0494e5915b99a0b0aebd941ebbb177cd3a data/create/advancements/cuckoo_clock.json ac78707d112458c7f771260cf65f0e9bc928d1b6 data/create/advancements/deployer.json 48c3af4499797cfb695a235e4527c52c608d40ad data/create/advancements/display_board_0.json -24be041d833017d7e7e02a5a92fd04060ea62594 data/create/advancements/display_link.json +ef4055989f4ffc7432ed9531ec4639c69fd48ba6 data/create/advancements/display_link.json cc2c729cf82a0c80b4966ac6382984da08429b9d data/create/advancements/diving_suit.json e1af547fd148cf9e60c1725ab03545fe3010eac7 data/create/advancements/diving_suit_lava.json 4d91e6a7bbf08191d8d1e11943650dfc1dc170e6 data/create/advancements/drain.json @@ -35,9 +38,11 @@ dee06f0f78a97a6358b67459d05fb479e5318fe9 data/create/advancements/ejector_maxed. 3300ee54dc1e9d04fd13a11c971e046d9db24e10 data/create/advancements/encased_fan.json fb61193b9d02d1fd595ac99721812a59dc7c7c29 data/create/advancements/extendo_grip.json 845a6c63b26a238c5ff82f37ca25ef5a8f7c11fc data/create/advancements/extendo_grip_dual.json +7ea086b6667879458bbc3cfd5b7bef59cd22f5b3 data/create/advancements/factory_gauge.json 46950345e76ef2d98bf3ea737530976781901a0f data/create/advancements/fan_processing.json 8f0f884dbc6eb94e03ffae374105c7100a073d85 data/create/advancements/fist_bump.json 5e39ecb68037ade25897dff1dc419065752d2c43 data/create/advancements/foods.json +9b029a15bd4c6bfa71da0a256df5a12532d4645a data/create/advancements/frogport.json 7c72b9440b3f0525658b5c12d46a56d48521ca93 data/create/advancements/funnel.json 1dcfded7b20756ad6dfd4a6c4d0106c343e9e17e data/create/advancements/glass_pipe.json 94a4e1ac38935288cc84f4b374cf1553ed39b2b0 data/create/advancements/hand_crank_000.json @@ -56,6 +61,8 @@ d89152d4f3c992b892e8ec4bef03605ef20c1520 data/create/advancements/mechanical_cra 5b50f84f2b697d630294e2b8db8b60dba84a1011 data/create/advancements/mechanical_pump_0.json 8adbdf6e0b0df40fed5ecfc5a5b13ca6a075be83 data/create/advancements/millstone.json 82a61db27464e2ede2b2079276cf69bb465a5085 data/create/advancements/musical_arm.json +87f554c3621a11dd5f49553202e76d6a8df30623 data/create/advancements/packager.json +a59b972ef1ebb7bee001282a2d71553363a3ee92 data/create/advancements/package_chute_throw.json a7119c747a2c16d93b9df669f80ccb3863a331ce data/create/advancements/pipe_organ.json 8118ffd53c264f535517936a0fc720a7850e8907 data/create/advancements/portable_storage_interface.json 826768f46254a9fc0ea048e600511cab4a0a781f data/create/advancements/potato_cannon.json @@ -73,15 +80,17 @@ a1e44c8ff2b7ed96d4b76e6122fd41fa528826b1 data/create/advancements/speed_controll 28c7898ee0dad051744b95c0154744caf025e849 data/create/advancements/steam_engine.json b3c18b1d41126d135318769f83ccc6fe51da2c54 data/create/advancements/steam_engine_maxed.json 742b75d31271e5f58ba2572606a10a43db8acea1 data/create/advancements/steam_whistle.json +e6317ea94e3f891f6767fb054fc6955e8c948a96 data/create/advancements/stock_ticker.json 90954d173a67584221ee02114971d515247607ae data/create/advancements/stressometer.json b77e7b17c397cc88ca2f75f68c52d60488ece97a data/create/advancements/stressometer_maxed.json cc75b35e53137d229896c334f09ebc5930f56307 data/create/advancements/sturdy_sheet.json 4794a7d7ea140333809bb78b77a30997bbb606bd data/create/advancements/super_glue.json +3b3b1778c82b14f029a803d45bd0f3985004999b data/create/advancements/table_cloth_shop.json cbc796a4bd3dd9bb3e66ab437b27fcf5a1fdc050 data/create/advancements/track_0.json 916a9a75900fa36aa3c5422d4e35eeeb57d20f61 data/create/advancements/track_crafting_factory.json 4938c2be415c15a70a41570bbb49f772eaed5af0 data/create/advancements/track_signal.json 797f76512083d562549a20e9abc679846cce885f data/create/advancements/train.json -227f401a440746c02ce0713c44b4cc623307e014 data/create/advancements/train_casing_00.json +62d418a19498cb9f788d64c967ee1c15c886c60e data/create/advancements/train_casing_00.json f1645a6cfdfcade5366d9f3be501e596b1600330 data/create/advancements/train_crash.json 484986302e8c1708064b5dbb5ce35e443f6151d7 data/create/advancements/train_crash_backwards.json 22c39846ee59d7c71468fe795fa354cb0a4aafd9 data/create/advancements/train_portal.json diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index c7341cb13c..4ee525c724 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -21,6 +21,12 @@ "advancement.create.brass_casing.desc": "sǝuıɥɔɐɯ pǝʇɐɔıʇsıɥdos ǝɹoɯ ɹoɟ buısɐɔ ɐ buıʇɐǝɹɔ 'pooʍ pǝddıɹʇs oʇ sʇobuI ssɐɹᗺ ʎןddⱯ", "advancement.create.burner": "ǝɔɐןdǝɹıℲ ʇuǝıʇuǝS", "advancement.create.burner.desc": "ɹǝuɹnᗺ ǝzɐןᗺ ɐ uıɐʇqO", + "advancement.create.cardboard": "ןǝɔɹɐԀ puɐ ʇɹɐԀ", + "advancement.create.cardboard.desc": "pɹɐoqpɹɐƆ ʇsɹıɟ ɹnoʎ uıɐʇqo ɹo ǝɔnpoɹԀ", + "advancement.create.cardboard_armor": "ɥʇןɐǝʇS ןןnℲ", + "advancement.create.cardboard_armor.desc": "ɹoɯɹⱯ pɹɐoqpɹɐƆ ןןnɟ uı punoɹɐ ʞɐǝuS", + "advancement.create.cardboard_armor_trim": "sʇɟɐɹƆ puɐ sʇɹⱯ", + "advancement.create.cardboard_armor_trim.desc": ")ʇuǝɯǝɔuɐʌpⱯ uǝppıH(ㄥ§\nsɯıɹʇ ɹoɯɹɐ ɥʇıʍ ʇuǝɯdınbǝ pɹɐoqpɹɐɔ ɹnoʎ ǝʇɐɹoɔǝᗡ", "advancement.create.cart_pickup": "sɯɹⱯ buoɹʇS", "advancement.create.cart_pickup.desc": "sʞɔoןq pǝɥɔɐʇʇɐ 00ᄅ ʇsɐǝן ʇɐ ɥʇıʍ uoıʇdɐɹʇuoƆ ʇɹɐɔǝuıW ɐ dn ʞɔıԀ", "advancement.create.chained_drain": "ןןoᴚ ɐ uO", @@ -29,7 +35,7 @@ "advancement.create.chocolate_bucket.desc": "ǝʇɐןoɔoɥɔ uǝʇןoɯ ɟo ʇǝʞɔnq ɐ uıɐʇqO", "advancement.create.chute": "sɔıʇsıboꞀ ןɐɔıʇɹǝΛ", "advancement.create.chute.desc": "ǝʇnɥƆ ʎq sɯǝʇı ǝɯos ʇɹodsuɐɹ⟘", - "advancement.create.clockwork_bearing": "ʞɔoןƆ,O uoıʇdɐɹʇuoƆ", + "advancement.create.clockwork_bearing": "ʞɔoןƆ,o uoıʇdɐɹʇuoƆ", "advancement.create.clockwork_bearing.desc": "buıɹɐǝᗺ ʞɹoʍʞɔoןƆ ɐ uo pǝʇunoɯ ǝɹnʇɔnɹʇs ɐ ǝןqɯǝssⱯ", "advancement.create.compacting": "uoıʇɐɔıɟıʇɔɐdɯoƆ", "advancement.create.compacting.desc": "ǝɹoɯ ɯoɹɟ sɯǝʇı ɹǝʍǝɟ ǝʇɐǝɹɔ oʇ uısɐᗺ ɐ puɐ ssǝɹԀ ןɐɔıuɐɥɔǝW ɐ ǝs∩", @@ -47,9 +53,9 @@ "advancement.create.cross_streams.desc": ")ʇuǝɯǝɔuɐʌpⱯ uǝppıH(ㄥ§\nʞɹoʍʇǝu ǝdıd ɹnoʎ uı ʇǝǝɯ spınןɟ oʍʇ ɥɔʇɐM", "advancement.create.crusher_maxed_0000": "ʇI buıɥsnɹƆ", "advancement.create.crusher_maxed_0000.desc": "pǝǝds ɯnɯıxɐɯ ʇɐ sןǝǝɥM buıɥsnɹƆ ɟo ɹıɐd ɐ ǝʇɐɹǝdO", - "advancement.create.crushing_wheel": "sʇuɐı⅁ ɟo ɹıɐԀ Ɐ", + "advancement.create.crushing_wheel": "uoıʇɔnɹʇsǝᗡ ɟo sןǝǝɥM", "advancement.create.crushing_wheel.desc": "sןǝǝɥM buıɥsnɹƆ ɟo ʇǝs ɐ ɹǝʍod puɐ ǝɔɐןԀ", - "advancement.create.cuckoo_clock": "¿ǝɯı⟘ ʇI sI", + "advancement.create.cuckoo_clock": "¿ǝɯı⟘ ʇı sI", "advancement.create.cuckoo_clock.desc": "ǝɯıʇpǝq ǝɔunouuɐ ʞɔoןƆ ooʞɔnƆ ɹnoʎ ssǝuʇıM", "advancement.create.deployer": "ǝɔuǝbıןןǝʇuI ןɐıɔıɟıʇɹⱯ", "advancement.create.deployer.desc": "ɟןǝsɹnoʎ ɟo uoıʇɔǝןɟǝɹ ʇɔǝɟɹǝd ǝɥʇ 'ɹǝʎoןdǝᗡ ɐ ɹǝʍod puɐ ǝɔɐןԀ", @@ -71,12 +77,16 @@ "advancement.create.extendo_grip.desc": "dıɹ⅁ opuǝʇxƎ uɐ ɟo pןoɥ ʇǝ⅁", "advancement.create.extendo_grip_dual": "ʇuǝʇxƎ ןןnℲ o⟘", "advancement.create.extendo_grip_dual.desc": ")ʇuǝɯǝɔuɐʌpⱯ uǝppıH(ㄥ§\nɥɔɐǝɹ uɐɯnɥɹǝdns ɹoɟ sdıɹ⅁ opuǝʇxƎ pןǝıʍ-ןɐnᗡ", + "advancement.create.factory_gauge": "sɔıʇsıboꞀ ɥbıH", + "advancement.create.factory_gauge.desc": "sǝbnɐ⅁ ʎɹoʇɔɐℲ buısn ʇsǝnbǝɹ ǝbɐʞɔɐd ɔıʇɐɯoʇnɐ uɐ ɹǝbbıɹ⟘", "advancement.create.fan_processing": "ǝןɔıʇɹɐԀ ʎq buıssǝɔoɹԀ", "advancement.create.fan_processing.desc": "sןɐıɹǝʇɐɯ ssǝɔoɹd oʇ uɐℲ pǝsɐɔuƎ uɐ ǝs∩", "advancement.create.fist_bump": "¡oɹᗺ 'ʇI punoԀ", "advancement.create.fist_bump.desc": ")ʇuǝɯǝɔuɐʌpⱯ uǝppıH(ㄥ§\ndɯnq-ʇsıɟ sɹǝʎoןdǝᗡ oʍʇ ǝʞɐW", "advancement.create.foods": "ʇǝıᗡ pǝɔuɐןɐᗺ", "advancement.create.foods.desc": "ʇnodS ǝɯɐs ǝɥʇ ɯoɹɟ ןןɐ ןןoᴚ ʇǝǝʍS ɐ puɐ 'ǝןddⱯ pǝʎǝuoH ɐ 'sǝıɹɹǝᗺ pǝzɐן⅁ ǝʇɐןoɔoɥƆ ǝʇɐǝɹƆ", + "advancement.create.frogport": "sɹǝddoɥ ʎɹbunH", + "advancement.create.frogport.desc": "ʇɹodboɹℲ ɐ buısn ɹoʎǝʌuoƆ uıɐɥƆ ɹnoʎ ɯoɹɟ sǝbɐʞɔɐd ɥɔʇɐƆ", "advancement.create.funnel": "ɔıʇǝɥʇsǝⱯ ʇɹodɹıⱯ", "advancement.create.funnel.desc": "ןǝuunℲ ɐ buısn ɹǝuıɐʇuoɔ ɐ oʇuı sɯǝʇı ʇɹǝsuı ɹo ʇɔɐɹʇxƎ", "advancement.create.glass_pipe": "ʎɹǝʌoɔsıᗡ ʍoןℲ", @@ -113,9 +123,13 @@ "advancement.create.millstone.desc": "sןɐıɹǝʇɐɯ ǝsıɹǝʌןnd oʇ ǝuoʇsןןıW ɐ ǝs∩", "advancement.create.musical_arm": "oɔıuɐɥɔǝW ſᗡ", "advancement.create.musical_arm.desc": ")ʇuǝɯǝɔuɐʌpⱯ uǝppıH(ㄥ§\nxoqǝʞnſ ɹnoʎ ǝʇɐɹǝdo ɯɹⱯ ןɐɔıuɐɥɔǝW ɐ ɥɔʇɐM", + "advancement.create.package_chute_throw": "ʇǝu ʇnq buıɥʇoN", + "advancement.create.package_chute_throw.desc": ")ʇuǝɯǝɔuɐʌpⱯ uǝppıH(ㄥ§\nǝʇnɥɔ ɯǝʇı uɐ uı ʍoɹɥʇ ǝbɐʞɔɐd pɹɐoqpɹɐɔ ɹnoʎ puɐꞀ", + "advancement.create.packager": "uoıʇɔnpoɹԀ ʇsoԀ", + "advancement.create.packager.desc": "ɹǝbɐʞɔɐԀ ǝɥʇ buısn ʎɹoʇuǝʌuı uɐ ɯoɹɟ sɯǝʇı ǝbɐʞɔɐԀ", "advancement.create.pipe_organ": "uɐbɹO ǝdıԀ ǝɥ⟘", "advancement.create.pipe_organ.desc": ")ʇuǝɯǝɔuɐʌpⱯ uǝppıH(ㄥ§\nʞuɐ⟘ pınןℲ ǝןbuıs ɐ oʇ sǝןʇsıɥM ɯɐǝʇS pǝɥɔʇıd ʎןǝnbıun ᄅƖ ɥɔɐʇʇⱯ", - "advancement.create.portable_storage_interface": "ǝbuɐɥɔxƎ ʎᗺ-ǝʌıɹᗡ", + "advancement.create.portable_storage_interface": "ǝbuɐɥɔxƎ ʎq-ǝʌıɹᗡ", "advancement.create.portable_storage_interface.desc": "uoıʇdɐɹʇuoƆ ɐ oʇuı sɯǝʇı ʇɹǝsuı ɹo ǝʞɐʇ oʇ ǝɔɐɟɹǝʇuI ǝbɐɹoʇS ǝןqɐʇɹoԀ ɐ ǝs∩", "advancement.create.potato_cannon": "¡dɯooʍℲ", "advancement.create.potato_cannon.desc": "uouuɐƆ oʇɐʇoԀ ɹnoʎ ɥʇıʍ ʎɯǝuǝ uɐ ʇɐǝɟǝᗡ", @@ -129,7 +143,7 @@ "advancement.create.red_signal.desc": ")ʇuǝɯǝɔuɐʌpⱯ uǝppıH(ㄥ§\nןɐubıS uıɐɹ⟘ pǝɹ ɐ unᴚ", "advancement.create.root": "ǝʇɐǝɹƆ oʇ ǝɯoɔןǝM", "advancement.create.root.desc": "suoıʇdɐɹʇuoƆ ǝᗺ ǝɹǝH", - "advancement.create.rose_quartz": "spuoɯɐıᗡ ʞuıԀ", + "advancement.create.rose_quartz": "pǝbɹɐɥɔɹǝdnS", "advancement.create.rose_quartz.desc": "zʇɹɐnὉ ǝsoᴚ ǝɯos ɥsıןoԀ", "advancement.create.saw_processing": "pǝɹɐǝℲ ʇsoW s,doɥsʞɹoM", "advancement.create.saw_processing.desc": "sןɐıɹǝʇɐɯ ssǝɔoɹd oʇ ʍɐS ןɐɔıuɐɥɔǝW ʇɥbıɹdn uɐ ǝs∩", @@ -147,6 +161,8 @@ "advancement.create.steam_engine_maxed.desc": "ɹǝʍod ɟo ןǝʌǝן ɯnɯıxɐɯ ǝɥʇ ʇɐ ɹǝןıoq ɐ unᴚ", "advancement.create.steam_whistle": "ןǝbuⱯ uɐ ɟo ǝɔıoΛ", "advancement.create.steam_whistle.desc": "ǝןʇsıɥM ɯɐǝʇS ɐ ǝʇɐʌıʇɔⱯ", + "advancement.create.stock_ticker": "¡d∩ ɹǝpɹO", + "advancement.create.stock_ticker.desc": "sʇsǝnbǝɹ ʇsɹıɟ ɹnoʎ ǝʞɐɯ puɐ ɹǝʞɔıʇ ʞɔoʇs ɹnoʎ ʇɐ qoɯ ɐ ʎoןdɯƎ", "advancement.create.stressometer": "spɹǝN ɹoɟ ssǝɹʇS", "advancement.create.stressometer.desc": "ɹǝʇǝɯossǝɹʇS ɐ puɐ sǝןbbo⅁ s,ɹǝǝuıbuƎ ɟo dןǝɥ ǝɥʇ ɥʇıʍ ʇnopɐǝɹ ʇɔɐxǝ uɐ ʇǝ⅁", "advancement.create.stressometer_maxed": "pǝssǝɹʇS ʎןʇɔǝɟɹǝԀ", @@ -155,6 +171,8 @@ "advancement.create.sturdy_sheet.desc": "uɐıpısqO pǝɹǝpʍoԀ buıuıɟǝɹ ʎq ʇǝǝɥS ʎpɹnʇS ɐ ǝןqɯǝssⱯ", "advancement.create.super_glue": "ʇɔǝuuoƆ ɟo ɐǝɹⱯ", "advancement.create.super_glue.desc": "dnoɹb ɐ oʇuı sʞɔoןq ǝɯos ǝnן⅁ ɹǝdnS", + "advancement.create.table_cloth_shop": "ssǝuısnq ɹoɟ uǝdO", + "advancement.create.table_cloth_shop.desc": "ɥʇoןƆ ǝןqɐ⟘ ɐ buısn ǝןɐs ɹoɟ dn sɯǝʇı ʇnԀ", "advancement.create.track_0": "ǝbnɐ⅁ ʍǝN Ɐ", "advancement.create.track_0.desc": "sʞɔɐɹ⟘ uıɐɹ⟘ ǝɯos uıɐʇqO", "advancement.create.track_crafting_factory": "ʎɹoʇɔɐℲ ʞɔɐɹ⟘", @@ -163,7 +181,7 @@ "advancement.create.track_signal.desc": "ןɐubıS uıɐɹ⟘ ɐ ǝɔɐןԀ", "advancement.create.train": "¡pɹɐoqⱯ ןןⱯ", "advancement.create.train.desc": "uıɐɹ⟘ ʇsɹıɟ ɹnoʎ ǝןqɯǝssⱯ", - "advancement.create.train_casing_00": "ǝbⱯ ןɐɔıʇsıboꞀ ǝɥ⟘", + "advancement.create.train_casing_00": "ǝbⱯ ǝʌıʇoɯoɔoꞀ ǝɥ⟘", "advancement.create.train_casing_00.desc": "sʇuǝuodɯoɔ ʎɐʍןıɐɹ ɹoɟ buısɐɔ ɐ ǝʇɐǝɹɔ oʇ sʇǝǝɥS ʎpɹnʇS ǝs∩", "advancement.create.train_crash": "ǝɔıʌɹǝS ǝןqıɹɹǝ⟘", "advancement.create.train_crash.desc": ")ʇuǝɯǝɔuɐʌpⱯ uǝppıH(ㄥ§\nɹǝbuǝssɐd ɐ sɐ ɥsɐɹɔ uıɐɹ⟘ ɐ ssǝuʇıM", @@ -179,9 +197,9 @@ "advancement.create.water_supply.desc": "ɹǝʇɐʍ ʇɔǝןןoɔ oʇ dɯnԀ ןɐɔıuɐɥɔǝW ɹo ǝdıԀ pınןℲ ɐ ɟo puǝ buıןןnd ǝɥʇ ǝs∩", "advancement.create.water_wheel": "sɔıןnɐɹpʎH pǝssǝuɹɐH", "advancement.create.water_wheel.desc": "ǝnbɹoʇ ǝʇɐɹǝuǝb oʇ ʇı ǝsn puɐ ןǝǝɥM ɹǝʇɐM ɐ ǝɔɐןԀ", - "advancement.create.windmill": "ǝzǝǝɹᗺ pןıW Ɐ", + "advancement.create.windmill": "ǝzǝǝɹᗺ pןıɯ Ɐ", "advancement.create.windmill.desc": "ǝnbɹoʇ ǝʇɐɹǝuǝb oʇ ʇı ǝsn puɐ ןןıɯpuıʍ ɐ ǝןqɯǝssⱯ", - "advancement.create.windmill_maxed": "ǝzǝǝɹᗺ buoɹʇS Ɐ", + "advancement.create.windmill_maxed": "ǝzǝǝɹᗺ buoɹʇs Ɐ", "advancement.create.windmill_maxed.desc": "ɥʇbuǝɹʇs ɯnɯıxɐɯ ɟo ןןıɯpuıʍ ɐ ǝןqɯǝssⱯ", "advancement.create.wrench_goggles": "ʇnO pǝʇʇıʞ", "advancement.create.wrench_goggles.desc": "ɥɔuǝɹM ɐ puɐ sǝןbbo⅁ s,ɹǝǝuıbuƎ dınbƎ", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 0b1c72200c..fcef389fc8 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -21,6 +21,12 @@ "advancement.create.brass_casing.desc": "Apply Brass Ingots to stripped wood, creating a casing for more sophisticated machines", "advancement.create.burner": "Sentient Fireplace", "advancement.create.burner.desc": "Obtain a Blaze Burner", + "advancement.create.cardboard": "Part and Parcel", + "advancement.create.cardboard.desc": "Produce or obtain your first Cardboard", + "advancement.create.cardboard_armor": "Full Stealth", + "advancement.create.cardboard_armor.desc": "Sneak around in full Cardboard Armor", + "advancement.create.cardboard_armor_trim": "Arts and Crafts", + "advancement.create.cardboard_armor_trim.desc": "Decorate your cardboard equipment with armor trims\n§7(Hidden Advancement)", "advancement.create.cart_pickup": "Strong Arms", "advancement.create.cart_pickup.desc": "Pick up a Minecart Contraption with at least 200 attached blocks", "advancement.create.chained_drain": "On a Roll", @@ -29,7 +35,7 @@ "advancement.create.chocolate_bucket.desc": "Obtain a bucket of molten chocolate", "advancement.create.chute": "Vertical Logistics", "advancement.create.chute.desc": "Transport some items by Chute", - "advancement.create.clockwork_bearing": "Contraption O'Clock", + "advancement.create.clockwork_bearing": "Contraption o'Clock", "advancement.create.clockwork_bearing.desc": "Assemble a structure mounted on a Clockwork Bearing", "advancement.create.compacting": "Compactification", "advancement.create.compacting.desc": "Use a Mechanical Press and a Basin to create fewer items from more", @@ -47,9 +53,9 @@ "advancement.create.cross_streams.desc": "Watch two fluids meet in your pipe network\n§7(Hidden Advancement)", "advancement.create.crusher_maxed_0000": "Crushing It", "advancement.create.crusher_maxed_0000.desc": "Operate a pair of Crushing Wheels at maximum speed", - "advancement.create.crushing_wheel": "A Pair of Giants", + "advancement.create.crushing_wheel": "Wheels of Destruction", "advancement.create.crushing_wheel.desc": "Place and power a set of Crushing Wheels", - "advancement.create.cuckoo_clock": "Is It Time?", + "advancement.create.cuckoo_clock": "Is it Time?", "advancement.create.cuckoo_clock.desc": "Witness your Cuckoo Clock announce bedtime", "advancement.create.deployer": "Artificial Intelligence", "advancement.create.deployer.desc": "Place and power a Deployer, the perfect reflection of yourself", @@ -71,12 +77,16 @@ "advancement.create.extendo_grip.desc": "Get hold of an Extendo Grip", "advancement.create.extendo_grip_dual": "To Full Extent", "advancement.create.extendo_grip_dual.desc": "Dual-wield Extendo Grips for superhuman reach\n§7(Hidden Advancement)", + "advancement.create.factory_gauge": "High Logistics", + "advancement.create.factory_gauge.desc": "Trigger an automatic package request using Factory Gauges", "advancement.create.fan_processing": "Processing by Particle", "advancement.create.fan_processing.desc": "Use an Encased Fan to process materials", "advancement.create.fist_bump": "Pound It, Bro!", "advancement.create.fist_bump.desc": "Make two Deployers fist-bump\n§7(Hidden Advancement)", "advancement.create.foods": "Balanced Diet", "advancement.create.foods.desc": "Create Chocolate Glazed Berries, a Honeyed Apple, and a Sweet Roll all from the same Spout", + "advancement.create.frogport": "Hungry hoppers", + "advancement.create.frogport.desc": "Catch packages from your Chain Conveyor using a Frogport", "advancement.create.funnel": "Airport Aesthetic", "advancement.create.funnel.desc": "Extract or insert items into a container using a Funnel", "advancement.create.glass_pipe": "Flow Discovery", @@ -113,9 +123,13 @@ "advancement.create.millstone.desc": "Use a Millstone to pulverise materials", "advancement.create.musical_arm": "DJ Mechanico", "advancement.create.musical_arm.desc": "Watch a Mechanical Arm operate your Jukebox\n§7(Hidden Advancement)", + "advancement.create.package_chute_throw": "Nothing but net", + "advancement.create.package_chute_throw.desc": "Land your cardboard package throw in an item chute\n§7(Hidden Advancement)", + "advancement.create.packager": "Post Production", + "advancement.create.packager.desc": "Package items from an inventory using the Packager", "advancement.create.pipe_organ": "The Pipe Organ", "advancement.create.pipe_organ.desc": "Attach 12 uniquely pitched Steam Whistles to a single Fluid Tank\n§7(Hidden Advancement)", - "advancement.create.portable_storage_interface": "Drive-By Exchange", + "advancement.create.portable_storage_interface": "Drive-by Exchange", "advancement.create.portable_storage_interface.desc": "Use a Portable Storage Interface to take or insert items into a Contraption", "advancement.create.potato_cannon": "Fwoomp!", "advancement.create.potato_cannon.desc": "Defeat an enemy with your Potato Cannon", @@ -129,7 +143,7 @@ "advancement.create.red_signal.desc": "Run a red Train Signal\n§7(Hidden Advancement)", "advancement.create.root": "Welcome to Create", "advancement.create.root.desc": "Here Be Contraptions", - "advancement.create.rose_quartz": "Pink Diamonds", + "advancement.create.rose_quartz": "Supercharged", "advancement.create.rose_quartz.desc": "Polish some Rose Quartz", "advancement.create.saw_processing": "Workshop's Most Feared", "advancement.create.saw_processing.desc": "Use an upright Mechanical Saw to process materials", @@ -147,6 +161,8 @@ "advancement.create.steam_engine_maxed.desc": "Run a boiler at the maximum level of power", "advancement.create.steam_whistle": "Voice of an Angel", "advancement.create.steam_whistle.desc": "Activate a Steam Whistle", + "advancement.create.stock_ticker": "Order Up!", + "advancement.create.stock_ticker.desc": "Employ a mob at your stock ticker and make your first requests", "advancement.create.stressometer": "Stress for Nerds", "advancement.create.stressometer.desc": "Get an exact readout with the help of Engineer's Goggles and a Stressometer", "advancement.create.stressometer_maxed": "Perfectly Stressed", @@ -155,6 +171,8 @@ "advancement.create.sturdy_sheet.desc": "Assemble a Sturdy Sheet by refining Powdered Obsidian", "advancement.create.super_glue": "Area of Connect", "advancement.create.super_glue.desc": "Super Glue some blocks into a group", + "advancement.create.table_cloth_shop": "Open for business", + "advancement.create.table_cloth_shop.desc": "Put items up for sale using a Table Cloth", "advancement.create.track_0": "A New Gauge", "advancement.create.track_0.desc": "Obtain some Train Tracks", "advancement.create.track_crafting_factory": "Track Factory", @@ -163,7 +181,7 @@ "advancement.create.track_signal.desc": "Place a Train Signal", "advancement.create.train": "All Aboard!", "advancement.create.train.desc": "Assemble your first Train", - "advancement.create.train_casing_00": "The Logistical Age", + "advancement.create.train_casing_00": "The Locomotive Age", "advancement.create.train_casing_00.desc": "Use Sturdy Sheets to create a casing for railway components", "advancement.create.train_crash": "Terrible Service", "advancement.create.train_crash.desc": "Witness a Train crash as a passenger\n§7(Hidden Advancement)", @@ -179,9 +197,9 @@ "advancement.create.water_supply.desc": "Use the pulling end of a Fluid Pipe or Mechanical Pump to collect water", "advancement.create.water_wheel": "Harnessed Hydraulics", "advancement.create.water_wheel.desc": "Place a Water Wheel and use it to generate torque", - "advancement.create.windmill": "A Mild Breeze", + "advancement.create.windmill": "A mild Breeze", "advancement.create.windmill.desc": "Assemble a windmill and use it to generate torque", - "advancement.create.windmill_maxed": "A Strong Breeze", + "advancement.create.windmill_maxed": "A strong Breeze", "advancement.create.windmill_maxed.desc": "Assemble a windmill of maximum strength", "advancement.create.wrench_goggles": "Kitted Out", "advancement.create.wrench_goggles.desc": "Equip Engineer's Goggles and a Wrench", diff --git a/src/generated/resources/data/create/advancements/cardboard.json b/src/generated/resources/data/create/advancements/cardboard.json new file mode 100644 index 0000000000..8f253fd4b8 --- /dev/null +++ b/src/generated/resources/data/create/advancements/cardboard.json @@ -0,0 +1,39 @@ +{ + "parent": "create:mechanical_mixer", + "criteria": { + "0": { + "conditions": { + "items": [ + { + "items": [ + "create:cardboard" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "announce_to_chat": false, + "description": { + "color": "#DBA213", + "translate": "advancement.create.cardboard.desc" + }, + "frame": "task", + "hidden": false, + "icon": { + "item": "create:cardboard" + }, + "show_toast": true, + "title": { + "translate": "advancement.create.cardboard" + } + }, + "requirements": [ + [ + "0" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/cardboard_armor.json b/src/generated/resources/data/create/advancements/cardboard_armor.json new file mode 100644 index 0000000000..178b6e3546 --- /dev/null +++ b/src/generated/resources/data/create/advancements/cardboard_armor.json @@ -0,0 +1,32 @@ +{ + "parent": "create:factory_gauge", + "criteria": { + "0": { + "conditions": {}, + "trigger": "create:cardboard_armor_builtin" + } + }, + "display": { + "announce_to_chat": false, + "description": { + "color": "#DBA213", + "translate": "advancement.create.cardboard_armor.desc" + }, + "frame": "task", + "hidden": false, + "icon": { + "item": "create:cardboard_chestplate", + "nbt": "{Damage:0}" + }, + "show_toast": true, + "title": { + "translate": "advancement.create.cardboard_armor" + } + }, + "requirements": [ + [ + "0" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/cardboard_armor_trim.json b/src/generated/resources/data/create/advancements/cardboard_armor_trim.json new file mode 100644 index 0000000000..1874168cfd --- /dev/null +++ b/src/generated/resources/data/create/advancements/cardboard_armor_trim.json @@ -0,0 +1,32 @@ +{ + "parent": "create:cardboard_armor", + "criteria": { + "0": { + "conditions": {}, + "trigger": "create:cardboard_armor_trim_builtin" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "color": "#DBA213", + "translate": "advancement.create.cardboard_armor_trim.desc" + }, + "frame": "goal", + "hidden": true, + "icon": { + "item": "create:cardboard_chestplate", + "nbt": "{Damage:0,Trim:{material:\"minecraft:diamond\",pattern:\"minecraft:sentry\"}}" + }, + "show_toast": true, + "title": { + "translate": "advancement.create.cardboard_armor_trim" + } + }, + "requirements": [ + [ + "0" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/copper_casing.json b/src/generated/resources/data/create/advancements/copper_casing.json index 4a0e4b18a2..2e71bc2764 100644 --- a/src/generated/resources/data/create/advancements/copper_casing.json +++ b/src/generated/resources/data/create/advancements/copper_casing.json @@ -7,7 +7,7 @@ } }, "display": { - "announce_to_chat": true, + "announce_to_chat": false, "description": { "color": "#DBA213", "translate": "advancement.create.copper_casing.desc" diff --git a/src/generated/resources/data/create/advancements/display_link.json b/src/generated/resources/data/create/advancements/display_link.json index 6f774c3543..07fb9bedbd 100644 --- a/src/generated/resources/data/create/advancements/display_link.json +++ b/src/generated/resources/data/create/advancements/display_link.json @@ -7,7 +7,7 @@ } }, "display": { - "announce_to_chat": true, + "announce_to_chat": false, "description": { "color": "#DBA213", "translate": "advancement.create.display_link.desc" diff --git a/src/generated/resources/data/create/advancements/factory_gauge.json b/src/generated/resources/data/create/advancements/factory_gauge.json new file mode 100644 index 0000000000..319c1e81c3 --- /dev/null +++ b/src/generated/resources/data/create/advancements/factory_gauge.json @@ -0,0 +1,31 @@ +{ + "parent": "create:table_cloth_shop", + "criteria": { + "0": { + "conditions": {}, + "trigger": "create:factory_gauge_builtin" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "color": "#DBA213", + "translate": "advancement.create.factory_gauge.desc" + }, + "frame": "task", + "hidden": false, + "icon": { + "item": "create:factory_gauge" + }, + "show_toast": true, + "title": { + "translate": "advancement.create.factory_gauge" + } + }, + "requirements": [ + [ + "0" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/frogport.json b/src/generated/resources/data/create/advancements/frogport.json new file mode 100644 index 0000000000..ad6321a327 --- /dev/null +++ b/src/generated/resources/data/create/advancements/frogport.json @@ -0,0 +1,31 @@ +{ + "parent": "create:stock_ticker", + "criteria": { + "0": { + "conditions": {}, + "trigger": "create:frogport_builtin" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "color": "#DBA213", + "translate": "advancement.create.frogport.desc" + }, + "frame": "task", + "hidden": false, + "icon": { + "item": "create:package_frogport" + }, + "show_toast": true, + "title": { + "translate": "advancement.create.frogport" + } + }, + "requirements": [ + [ + "0" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/package_chute_throw.json b/src/generated/resources/data/create/advancements/package_chute_throw.json new file mode 100644 index 0000000000..9f31bdff19 --- /dev/null +++ b/src/generated/resources/data/create/advancements/package_chute_throw.json @@ -0,0 +1,31 @@ +{ + "parent": "create:cardboard_armor", + "criteria": { + "0": { + "conditions": {}, + "trigger": "create:package_chute_throw_builtin" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "color": "#DBA213", + "translate": "advancement.create.package_chute_throw.desc" + }, + "frame": "goal", + "hidden": true, + "icon": { + "item": "create:cardboard_package_12x12" + }, + "show_toast": true, + "title": { + "translate": "advancement.create.package_chute_throw" + } + }, + "requirements": [ + [ + "0" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/packager.json b/src/generated/resources/data/create/advancements/packager.json new file mode 100644 index 0000000000..579a6700ba --- /dev/null +++ b/src/generated/resources/data/create/advancements/packager.json @@ -0,0 +1,31 @@ +{ + "parent": "create:cardboard", + "criteria": { + "0": { + "conditions": {}, + "trigger": "create:packager_builtin" + } + }, + "display": { + "announce_to_chat": false, + "description": { + "color": "#DBA213", + "translate": "advancement.create.packager.desc" + }, + "frame": "task", + "hidden": false, + "icon": { + "item": "create:packager" + }, + "show_toast": true, + "title": { + "translate": "advancement.create.packager" + } + }, + "requirements": [ + [ + "0" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/stock_ticker.json b/src/generated/resources/data/create/advancements/stock_ticker.json new file mode 100644 index 0000000000..b90b292de1 --- /dev/null +++ b/src/generated/resources/data/create/advancements/stock_ticker.json @@ -0,0 +1,31 @@ +{ + "parent": "create:packager", + "criteria": { + "0": { + "conditions": {}, + "trigger": "create:stock_ticker_builtin" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "color": "#DBA213", + "translate": "advancement.create.stock_ticker.desc" + }, + "frame": "task", + "hidden": false, + "icon": { + "item": "create:stock_ticker" + }, + "show_toast": true, + "title": { + "translate": "advancement.create.stock_ticker" + } + }, + "requirements": [ + [ + "0" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/table_cloth_shop.json b/src/generated/resources/data/create/advancements/table_cloth_shop.json new file mode 100644 index 0000000000..ab6aa8fd1b --- /dev/null +++ b/src/generated/resources/data/create/advancements/table_cloth_shop.json @@ -0,0 +1,31 @@ +{ + "parent": "create:frogport", + "criteria": { + "0": { + "conditions": {}, + "trigger": "create:table_cloth_shop_builtin" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "color": "#DBA213", + "translate": "advancement.create.table_cloth_shop.desc" + }, + "frame": "task", + "hidden": false, + "icon": { + "item": "create:red_table_cloth" + }, + "show_toast": true, + "title": { + "translate": "advancement.create.table_cloth_shop" + } + }, + "requirements": [ + [ + "0" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/train_casing_00.json b/src/generated/resources/data/create/advancements/train_casing_00.json index f7ede4fb0a..7c9fffe4c7 100644 --- a/src/generated/resources/data/create/advancements/train_casing_00.json +++ b/src/generated/resources/data/create/advancements/train_casing_00.json @@ -7,7 +7,7 @@ } }, "display": { - "announce_to_chat": true, + "announce_to_chat": false, "description": { "color": "#DBA213", "translate": "advancement.create.train_casing_00.desc" diff --git a/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorHandler.java b/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorHandler.java index 233afc3e34..c9f0803b70 100644 --- a/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorHandler.java +++ b/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorHandler.java @@ -3,6 +3,7 @@ package com.simibubi.create.content.equipment.armor; import java.util.UUID; import com.simibubi.create.AllItems; +import com.simibubi.create.foundation.advancement.AllAdvancements; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.Entity; @@ -25,10 +26,18 @@ public class CardboardArmorHandler { @SubscribeEvent public static void playerHitboxChangesWhenHidingAsBox(EntityEvent.Size event) { - if (event.getEntity().isAddedToWorld() && testForStealth(event.getEntity())) { - event.setNewSize(EntityDimensions.fixed(0.8F, 0.8F)); - event.setNewEyeHeight(0.6F); - } + Entity entity = event.getEntity(); + if (!entity.isAddedToWorld()) + return; + if (!testForStealth(entity)) + return; + + event.setNewSize(EntityDimensions.fixed(0.6F, 0.8F)); + event.setNewEyeHeight(0.6F); + + if (!entity.level() + .isClientSide() && entity instanceof Player p) + AllAdvancements.CARDBOARD_ARMOR.awardTo(p); } @SubscribeEvent diff --git a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltBlock.java b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltBlock.java index c3e99aedc9..4145b42eba 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltBlock.java @@ -12,8 +12,8 @@ import org.apache.commons.lang3.mutable.MutableBoolean; import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; -import com.simibubi.create.Create; import com.simibubi.create.api.contraption.transformable.ITransformableBlock; +import com.simibubi.create.api.schematic.requirement.ISpecialBlockItemRequirement; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.equipment.armor.DivingBootsItem; import com.simibubi.create.content.fluids.transfer.GenericItemEmptying; @@ -28,7 +28,6 @@ import com.simibubi.create.content.logistics.box.PackageEntity; import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.content.logistics.funnel.FunnelBlock; import com.simibubi.create.content.logistics.tunnel.BeltTunnelBlock; -import com.simibubi.create.api.schematic.requirement.ISpecialBlockItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement.ItemUseType; import com.simibubi.create.foundation.block.IBE; @@ -50,6 +49,7 @@ import net.minecraft.sounds.SoundSource; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; @@ -192,7 +192,7 @@ public class BeltBlock extends HorizontalKineticBlock return; if (entityIn instanceof Player) { Player player = (Player) entityIn; - if (player.isShiftKeyDown()) + if (player.isShiftKeyDown() && !AllItems.CARDBOARD_BOOTS.isIn(player.getItemBySlot(EquipmentSlot.FEET))) return; if (player.getAbilities().flying) return; @@ -309,7 +309,7 @@ public class BeltBlock extends HorizontalKineticBlock }); if (success.isTrue()) world.playSound(null, pos, SoundEvents.ITEM_PICKUP, SoundSource.PLAYERS, .2f, - 1f + Create.RANDOM.nextFloat()); + 1f + world.random.nextFloat()); } if (isShaft) { diff --git a/src/main/java/com/simibubi/create/content/kinetics/belt/transport/BeltMovementHandler.java b/src/main/java/com/simibubi/create/content/kinetics/belt/transport/BeltMovementHandler.java index e25e1be2d1..9bf2937a3b 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/belt/transport/BeltMovementHandler.java +++ b/src/main/java/com/simibubi/create/content/kinetics/belt/transport/BeltMovementHandler.java @@ -7,6 +7,7 @@ import static net.minecraft.world.entity.MoverType.SELF; import java.util.List; import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllItems; import com.simibubi.create.content.kinetics.belt.BeltBlock; import com.simibubi.create.content.kinetics.belt.BeltBlockEntity; import com.simibubi.create.content.kinetics.belt.BeltPart; @@ -19,6 +20,7 @@ import net.minecraft.core.Vec3i; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.effect.MobEffects; import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.decoration.HangingEntity; import net.minecraft.world.entity.player.Player; @@ -60,7 +62,8 @@ public class BeltMovementHandler { public static boolean canBeTransported(Entity entity) { if (!entity.isAlive()) return false; - if (entity instanceof Player && ((Player) entity).isShiftKeyDown()) + if (entity instanceof Player p && p.isShiftKeyDown() + && !AllItems.CARDBOARD_BOOTS.isIn(p.getItemBySlot(EquipmentSlot.FEET))) return false; return true; } diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java index 9c40a71e43..ffa2718e33 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java @@ -1,5 +1,6 @@ package com.simibubi.create.content.logistics.box; +import java.lang.ref.WeakReference; import java.util.Collections; import java.util.List; @@ -65,6 +66,8 @@ public class PackageEntity extends LivingEntity implements IEntityAdditionalSpaw public int insertionDelay; public Vec3 clientPosition, vec2 = Vec3.ZERO, vec3 = Vec3.ZERO; + + public WeakReference tossedBy = new WeakReference<>(null); @SuppressWarnings("unchecked") public PackageEntity(EntityType entityTypeIn, Level worldIn) { @@ -264,7 +267,12 @@ public class PackageEntity extends LivingEntity implements IEntityAdditionalSpaw @Override public void push(Entity entityIn) { - if (entityIn instanceof PackageEntity) { + boolean isOtherPackage = entityIn instanceof PackageEntity; + + if (!isOtherPackage && tossedBy.get() != null) + tossedBy = new WeakReference(null); // no nudging + + if (isOtherPackage) { if (entityIn.getBoundingBox().minY < this.getBoundingBox().maxY) super.push(entityIn); } else if (entityIn.getBoundingBox().minY <= this.getBoundingBox().minY) { diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java index 409649a7dc..1bdf5909e6 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java @@ -1,5 +1,6 @@ package com.simibubi.create.content.logistics.box; +import java.lang.ref.WeakReference; import java.util.List; import javax.annotation.Nullable; @@ -349,9 +350,8 @@ public class PackageItem extends Item { @Override public void releaseUsing(ItemStack stack, Level world, LivingEntity entity, int ticks) { - if (!(entity instanceof Player)) + if (!(entity instanceof Player player)) return; - Player playerentity = (Player) entity; int i = this.getUseDuration(stack) - ticks; if (i < 0) return; @@ -362,14 +362,14 @@ public class PackageItem extends Item { if (world.isClientSide) return; - world.playSound(null, playerentity.getX(), playerentity.getY(), playerentity.getZ(), SoundEvents.SNOWBALL_THROW, + world.playSound(null, player.getX(), player.getY(), player.getZ(), SoundEvents.SNOWBALL_THROW, SoundSource.NEUTRAL, 0.5F, 0.5F); ItemStack copy = stack.copy(); stack.shrink(1); if (stack.isEmpty()) - playerentity.getInventory() + player.getInventory() .removeItem(stack); Vec3 vec = new Vec3(entity.getX(), entity.getY() + entity.getBoundingBox() @@ -381,6 +381,7 @@ public class PackageItem extends Item { PackageEntity packageEntity = new PackageEntity(world, vec.x, vec.y, vec.z); packageEntity.setBox(copy); packageEntity.setDeltaMovement(motion); + packageEntity.tossedBy = new WeakReference(player); world.addFreshEntity(packageEntity); } diff --git a/src/main/java/com/simibubi/create/content/logistics/chute/AbstractChuteBlock.java b/src/main/java/com/simibubi/create/content/logistics/chute/AbstractChuteBlock.java index 9ddaad16de..ceb600eb22 100644 --- a/src/main/java/com/simibubi/create/content/logistics/chute/AbstractChuteBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/chute/AbstractChuteBlock.java @@ -8,6 +8,7 @@ import com.simibubi.create.content.equipment.wrench.IWrenchable; import com.simibubi.create.content.kinetics.belt.behaviour.DirectBeltInputBehaviour; import com.simibubi.create.content.logistics.box.PackageEntity; import com.simibubi.create.foundation.advancement.AdvancementBehaviour; +import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.block.IBE; import com.simibubi.create.foundation.block.render.ReducedDestroyEffects; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; @@ -106,9 +107,14 @@ public abstract class AbstractChuteBlock extends Block implements IWrenchable, I if (!PackageEntity.centerPackage(entityIn, Vec3.atBottomCenterOf(pos.above()))) return; ItemStack remainder = input.handleInsertion(stack, Direction.UP, false); - if (remainder.isEmpty()) + if (remainder.isEmpty()) { entityIn.discard(); - else if (remainder.getCount() < stack.getCount() && entityIn instanceof ItemEntity) + if (entityIn instanceof PackageEntity box) { + Player player = box.tossedBy.get(); + if (player != null) + AllAdvancements.PACKAGE_CHUTE_THROW.awardTo(player); + } + } else if (remainder.getCount() < stack.getCount() && entityIn instanceof ItemEntity) ((ItemEntity) entityIn).setItem(remainder); } diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java index aca86bee8c..2b89052015 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java @@ -35,6 +35,7 @@ import com.simibubi.create.content.logistics.packagerLink.RequestPromise; import com.simibubi.create.content.logistics.packagerLink.RequestPromiseQueue; import com.simibubi.create.content.logistics.stockTicker.PackageOrder; import com.simibubi.create.content.schematics.requirement.ItemRequirement; +import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.blockEntity.behaviour.BehaviourType; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import com.simibubi.create.foundation.blockEntity.behaviour.ValueSettingsBoard; @@ -94,7 +95,6 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { private boolean promisePrimedForMarkDirty; private boolean active; - private boolean queueDing; private int lastReportedUnloadedLinks; private int lastReportedLevelInStorage; private int lastReportedPromises; @@ -349,6 +349,8 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { RequestPromiseQueue promises = Create.LOGISTICS.getQueuedPromises(network); if (promises != null) promises.add(new RequestPromise(new BigItemStack(getFilter(), recipeOutput))); + + panelBE.advancements.awardPlayer(AllAdvancements.FACTORY_GAUGE); } private void tryRestock() { @@ -665,8 +667,6 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { active = false; return; } - - boolean previouslySatisfied = satisfied; active = true; filter = FilterItemStack.of(panelTag.getCompound("Filter")); diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java index 979947e51a..7881c174a4 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java @@ -10,6 +10,7 @@ import com.simibubi.create.api.schematic.requirement.ISpecialBlockItemRequiremen import com.simibubi.create.content.equipment.wrench.IWrenchable; import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedBlockItem; import com.simibubi.create.content.schematics.requirement.ItemRequirement; +import com.simibubi.create.foundation.advancement.AdvancementBehaviour; import com.simibubi.create.foundation.block.IBE; import com.simibubi.create.foundation.block.ProperWaterloggedBlock; import com.simibubi.create.foundation.utility.CreateLang; @@ -179,6 +180,7 @@ public class FactoryPanelBlock extends FaceAttachedHorizontalDirectionalBlock super.setPlacedBy(pLevel, pPos, pState, pPlacer, pStack); if (pPlacer == null) return; + AdvancementBehaviour.setPlacedBy(pLevel, pPos, pPlacer); double range = pPlacer.getAttribute(ForgeMod.BLOCK_REACH.get()) .getValue() + 1; HitResult hitResult = pPlacer.pick(range, 1, false); diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java index 22f0acd988..dd6db20ea7 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java @@ -10,6 +10,8 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBlock.PanelSlot; import com.simibubi.create.content.logistics.packager.PackagerBlockEntity; import com.simibubi.create.content.logistics.packager.repackager.RepackagerBlockEntity; +import com.simibubi.create.foundation.advancement.AdvancementBehaviour; +import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; @@ -37,6 +39,8 @@ public class FactoryPanelBlockEntity extends SmartBlockEntity { public boolean restocker; private VoxelShape lastShape; + + public AdvancementBehaviour advancements; public FactoryPanelBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); @@ -52,6 +56,8 @@ public class FactoryPanelBlockEntity extends SmartBlockEntity { panels.put(slot, e); behaviours.add(e); } + + behaviours.add(advancements = new AdvancementBehaviour(this, AllAdvancements.FACTORY_GAUGE)); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportBlock.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportBlock.java index 499e899aad..05153ee830 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportBlock.java @@ -6,6 +6,7 @@ import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllItems; import com.simibubi.create.AllShapes; import com.simibubi.create.content.equipment.wrench.IWrenchable; +import com.simibubi.create.foundation.advancement.AdvancementBehaviour; import com.simibubi.create.foundation.block.IBE; import net.createmod.catnip.utility.VecHelper; @@ -49,6 +50,7 @@ public class FrogportBlock extends Block implements IBE, IW super.setPlacedBy(pLevel, pPos, pState, pPlacer, pStack); if (pPlacer == null) return; + AdvancementBehaviour.setPlacedBy(pLevel, pPos, pPlacer); withBlockEntityDo(pLevel, pPos, be -> { Vec3 diff = VecHelper.getCenterOf(pPos) .subtract(pPlacer.position()); diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportBlockEntity.java index 9cb1f12b25..a152fbf860 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportBlockEntity.java @@ -8,6 +8,9 @@ import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.content.logistics.box.PackageStyles; import com.simibubi.create.content.logistics.packagePort.PackagePortBlockEntity; import com.simibubi.create.content.logistics.packager.PackagerItemHandler; +import com.simibubi.create.foundation.advancement.AdvancementBehaviour; +import com.simibubi.create.foundation.advancement.AllAdvancements; +import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import com.simibubi.create.foundation.item.ItemHelper; import com.simibubi.create.foundation.item.TooltipHelper; @@ -48,6 +51,8 @@ public class FrogportBlockEntity extends PackagePortBlockEntity implements IHave private boolean failedLastExport; private FrogportSounds sounds; + + private AdvancementBehaviour advancements; public FrogportBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); @@ -59,6 +64,12 @@ public class FrogportBlockEntity extends PackagePortBlockEntity implements IHave .chase(0, 0.35, Chaser.LINEAR); } + @Override + public void addBehaviours(List behaviours) { + behaviours.add(advancements = new AdvancementBehaviour(this, AllAdvancements.FROGPORT)); + super.addBehaviours(behaviours); + } + public boolean isAnimationInProgress() { return animationProgress.getChaseTarget() == 1; } @@ -174,6 +185,9 @@ public class FrogportBlockEntity extends PackagePortBlockEntity implements IHave animationProgress.chase(1, 0.1, Chaser.LINEAR); animatedPackage = box; currentlyDepositing = deposit; + + if (level != null && !deposit && !level.isClientSide()) + advancements.awardPlayer(AllAdvancements.FROGPORT); if (level != null && level.isClientSide()) { sounds.open(level, worldPosition); diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java index a01c4492ca..8d4a1377d1 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java @@ -6,6 +6,7 @@ import com.simibubi.create.AllItems; import com.simibubi.create.AllSoundEvents; import com.simibubi.create.content.equipment.wrench.IWrenchable; import com.simibubi.create.content.logistics.box.PackageItem; +import com.simibubi.create.foundation.advancement.AdvancementBehaviour; import com.simibubi.create.foundation.block.IBE; import com.simibubi.create.foundation.block.WrenchableDirectionalBlock; @@ -13,6 +14,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.BlockPlaceContext; @@ -46,6 +48,12 @@ public class PackagerBlock extends WrenchableDirectionalBlock implements IBE itemCap = ForgeCapabilities.ITEM_HANDLER; diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java index 4c83d950e3..b8bb2b27a3 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java @@ -26,6 +26,8 @@ import com.simibubi.create.content.logistics.packagerLink.PackagerLinkBlockEntit import com.simibubi.create.content.logistics.packagerLink.RequestPromiseQueue; import com.simibubi.create.content.logistics.stockTicker.PackageOrder; import com.simibubi.create.content.processing.basin.BasinBlockEntity; +import com.simibubi.create.foundation.advancement.AdvancementBehaviour; +import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import com.simibubi.create.foundation.blockEntity.behaviour.inventory.CapManipulationBehaviourBase.InterfaceProvider; @@ -78,6 +80,8 @@ public class PackagerBlockEntity extends SmartBlockEntity { private InventorySummary availableItems; private VersionedInventoryTrackerBehaviour invVersionTracker; + + private AdvancementBehaviour advancements; // @@ -101,6 +105,7 @@ public class PackagerBlockEntity extends SmartBlockEntity { behaviours.add(targetInventory = new InvManipulationBehaviour(this, InterfaceProvider.oppositeOfBlockFacing()) .withFilter(this::supportsBlockEntity)); behaviours.add(invVersionTracker = new VersionedInventoryTrackerBehaviour(this)); + behaviours.add(advancements = new AdvancementBehaviour(this, AllAdvancements.PACKAGER)); } private boolean supportsBlockEntity(BlockEntity target) { @@ -535,7 +540,8 @@ public class PackagerBlockEntity extends SmartBlockEntity { heldBox = createdBox; animationInward = false; animationTicks = CYCLE; - + + advancements.awardPlayer(AllAdvancements.PACKAGER); triggerStockCheck(); notifyUpdate(); } diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrderRequestPacket.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrderRequestPacket.java index 70fe0a3aa0..ce3caa5132 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrderRequestPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrderRequestPacket.java @@ -3,6 +3,7 @@ package com.simibubi.create.content.logistics.stockTicker; import com.simibubi.create.AllSoundEvents; import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedBehaviour.RequestType; import com.simibubi.create.content.logistics.redstoneRequester.RedstoneRequesterBlock; +import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.networking.BlockEntityConfigurationPacket; import net.minecraft.core.BlockPos; @@ -45,14 +46,18 @@ public class PackageOrderRequestPacket extends BlockEntityConfigurationPacket b.icon(AllBlocks.SAIL_FRAME) - .title("A Mild Breeze") + .title("A mild Breeze") .description("Assemble a windmill and use it to generate torque") .after(WATER_WHEEL)), @@ -147,7 +150,7 @@ public class AllAdvancements implements DataProvider { .after(SUPER_GLUE)), PSI = create("portable_storage_interface", b -> b.icon(AllBlocks.PORTABLE_STORAGE_INTERFACE) - .title("Drive-By Exchange") + .title("Drive-by Exchange") .description("Use a Portable Storage Interface to take or insert items into a Contraption") .after(CONTRAPTION_ACTORS)), @@ -164,7 +167,7 @@ public class AllAdvancements implements DataProvider { .after(WRENCH_GOGGLES)), CUCKOO_CLOCK = create("cuckoo_clock", b -> b.icon(AllBlocks.CUCKOO_CLOCK) - .title("Is It Time?") + .title("Is it Time?") .description("Witness your Cuckoo Clock announce bedtime") .after(STRESSOMETER) .special(NOISY)), @@ -172,7 +175,7 @@ public class AllAdvancements implements DataProvider { // Andesite - Expert Branch WINDMILL_MAXED = create("windmill_maxed", b -> b.icon(AllBlocks.SAIL) - .title("A Strong Breeze") + .title("A strong Breeze") .description("Assemble a windmill of maximum strength") .after(ANDESITE) .special(EXPERT)), @@ -227,6 +230,64 @@ public class AllAdvancements implements DataProvider { .after(MIXER) .special(SECRET)), + // Logistics + + CARDBOARD = create("cardboard", b -> b.icon(AllItems.CARDBOARD) + .title("Part and Parcel") + .description("Produce or obtain your first Cardboard") + .whenIconCollected() + .after(MIXER)), + + PACKAGER = create("packager", b -> b.icon(AllBlocks.PACKAGER) + .title("Post Production") + .description("Package items from an inventory using the Packager") + .after(CARDBOARD)), + + STOCK_TICKER = create("stock_ticker", b -> b.icon(AllBlocks.STOCK_TICKER) + .title("Order Up!") + .description("Employ a mob at your stock ticker and make your first requests") + .special(NOISY) + .after(PACKAGER)), + + FROGPORT = create("frogport", b -> b.icon(AllBlocks.PACKAGE_FROGPORT) + .title("Hungry hoppers") + .description("Catch packages from your Chain Conveyor using a Frogport") + .special(NOISY) + .after(STOCK_TICKER)), + + TABLE_CLOTH_SHOP = create("table_cloth_shop", b -> b.icon(AllBlocks.TABLE_CLOTHS.get(DyeColor.RED)) + .title("Open for business") + .description("Put items up for sale using a Table Cloth") + .special(NOISY) + .after(FROGPORT)), + + FACTORY_GAUGE = create("factory_gauge", b -> b.icon(AllBlocks.FACTORY_GAUGE) + .title("High Logistics") + .description("Trigger an automatic package request using Factory Gauges") + .special(NOISY) + .after(TABLE_CLOTH_SHOP)), + + CARDBOARD_ARMOR = create("cardboard_armor", b -> b.icon(AllItems.CARDBOARD_CHESTPLATE) + .title("Full Stealth") + .description("Sneak around in full Cardboard Armor") + .after(FACTORY_GAUGE)), + + // Logistics - Secret + + PACKAGE_CHUTE_THROW = create("package_chute_throw", b -> b.icon(PackageStyles.getDefaultBox()) + .title("Nothing but net") + .description("Land your cardboard package throw in an item chute") + .after(CARDBOARD_ARMOR) + .special(SECRET)), + + // TODO: award using AllAdvancements.CARDBOARD_ARMOR_TRIM.awardTo() on server + CARDBOARD_ARMOR_TRIM = create("cardboard_armor_trim", + b -> b.icon(createArmorTrimmedCardboardChestplate()) + .title("Arts and Crafts") + .description("Decorate your cardboard equipment with armor trims") + .after(CARDBOARD_ARMOR) + .special(SECRET)), + // Copper - Central Branch COPPER = create("copper", b -> b.icon(Items.COPPER_INGOT) @@ -239,8 +300,7 @@ public class AllAdvancements implements DataProvider { COPPER_CASING = create("copper_casing", b -> b.icon(AllBlocks.COPPER_CASING) .title("The Copper Age") .description("Apply Copper Ingots to stripped wood, creating a waterproof casing for your machines") - .after(COPPER) - .special(NOISY)), + .after(COPPER)), SPOUT = create("spout", b -> b.icon(AllBlocks.SPOUT) .title("Sploosh") @@ -367,7 +427,7 @@ public class AllAdvancements implements DataProvider { .special(NOISY)), ROSE_QUARTZ = create("rose_quartz", b -> b.icon(AllItems.POLISHED_ROSE_QUARTZ) - .title("Pink Diamonds") + .title("Supercharged") .description("Polish some Rose Quartz") .whenIconCollected() .after(BRASS_CASING)), @@ -401,7 +461,7 @@ public class AllAdvancements implements DataProvider { .after(MECHANICAL_ARM)), CRUSHING_WHEEL = create("crushing_wheel", b -> b.icon(AllBlocks.CRUSHING_WHEEL) - .title("A Pair of Giants") + .title("Wheels of Destruction") .description("Place and power a set of Crushing Wheels") .after(CRAFTER) .special(NOISY)), @@ -415,7 +475,7 @@ public class AllAdvancements implements DataProvider { .special(NOISY)), CLOCKWORK_BEARING = create("clockwork_bearing", b -> b.icon(AllBlocks.CLOCKWORK_BEARING) - .title("Contraption O'Clock") + .title("Contraption o'Clock") .description("Assemble a structure mounted on a Clockwork Bearing") .after(HAUNTED_BELL) .special(NOISY)), @@ -423,8 +483,7 @@ public class AllAdvancements implements DataProvider { DISPLAY_LINK = create("display_link", b -> b.icon(AllBlocks.DISPLAY_LINK) .title("Big Data") .description("Use a Display Link to visualise information") - .after(CLOCKWORK_BEARING) - .special(NOISY)), + .after(CLOCKWORK_BEARING)), POTATO_CANNON = create("potato_cannon", b -> b.icon(AllItems.POTATO_CANNON) .title("Fwoomp!") @@ -508,10 +567,9 @@ public class AllAdvancements implements DataProvider { .after(CRUSHING_WHEEL)), TRAIN_CASING = create("train_casing_00", b -> b.icon(AllBlocks.RAILWAY_CASING) - .title("The Logistical Age") + .title("The Locomotive Age") .description("Use Sturdy Sheets to create a casing for railway components") - .after(STURDY_SHEET) - .special(NOISY)), + .after(STURDY_SHEET)), TRAIN = create("train", b -> b.icon(AllBlocks.TRACK_STATION) .title("All Aboard!") @@ -603,6 +661,17 @@ public class AllAdvancements implements DataProvider { // END = null; + private static ItemStack createArmorTrimmedCardboardChestplate() { + ItemStack asStack = AllItems.CARDBOARD_CHESTPLATE.asStack(); + CompoundTag tag = new CompoundTag(); + CompoundTag trimTag = new CompoundTag(); + trimTag.putString("material", "minecraft:diamond"); + trimTag.putString("pattern", "minecraft:sentry"); + tag.put("Trim", trimTag); + asStack.setTag(tag); + return asStack; + } + private static CreateAdvancement create(String id, UnaryOperator b) { return new CreateAdvancement(id, b); } From 4de15f5b67449e53920a7e939e95d15c911c2f1f Mon Sep 17 00:00:00 2001 From: Kryppers <65094918+Kryppers@users.noreply.github.com> Date: Tue, 7 Jan 2025 16:46:05 +0000 Subject: [PATCH 268/515] Copperpocalypse: The final Showdown. Final textures on to-do list. First pass on copper roof block-tops. fixes to stock link, steam engine and display link. --- .../copper/copper_shingles_top_connected.png | Bin 1807 -> 3935 bytes .../copper/copper_tiles_top_connected.png | Bin 1866 -> 4169 bytes .../exposed_copper_shingles_top_connected.png | Bin 1949 -> 4150 bytes .../exposed_copper_tiles_top_connected.png | Bin 1942 -> 4211 bytes ...oxidized_copper_shingles_top_connected.png | Bin 1961 -> 3913 bytes .../oxidized_copper_tiles_top_connected.png | Bin 1943 -> 4197 bytes ...eathered_copper_shingles_top_connected.png | Bin 1966 -> 4214 bytes .../weathered_copper_tiles_top_connected.png | Bin 1948 -> 4616 bytes .../create/textures/block/copper_gearbox.png | Bin 296 -> 0 bytes .../create/textures/block/copper_plating.png | Bin 246 -> 0 bytes .../create/textures/block/display_link.png | Bin 812 -> 1583 bytes .../assets/create/textures/block/engine.png | Bin 7144 -> 876 bytes .../create/textures/block/stock_link.png | Bin 1110 -> 1156 bytes .../create/textures/entity/display_cloth.png | Bin 168 -> 0 bytes .../create/textures/item/display_cloth.png | Bin 233 -> 0 bytes 15 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/main/resources/assets/create/textures/block/copper_gearbox.png delete mode 100644 src/main/resources/assets/create/textures/block/copper_plating.png delete mode 100644 src/main/resources/assets/create/textures/entity/display_cloth.png delete mode 100644 src/main/resources/assets/create/textures/item/display_cloth.png diff --git a/src/main/resources/assets/create/textures/block/copper/copper_shingles_top_connected.png b/src/main/resources/assets/create/textures/block/copper/copper_shingles_top_connected.png index 6bbdef082bb29f38fab326fb58f737c074a2ed3a..db22d5104d2265d7d779ff05d3e33ec792387bc6 100644 GIT binary patch literal 3935 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 q)6ER89SK>tM7o$^Tym>*d8r{3 z8_DiQDO7_*m`2N66d_`UVb^t(aT#WR+I`{t^ILy=6ck*+rRq; z&H7!mrzk$S>LfYhm7ONSJ@*d7ra>faVhz8foI@d=zhKVrF8#QirI4YHIvEDE<_R z5kNzU63~Mw0T`sH5VriI*Kf2NhWO&cA#DbO11!W$2!YASFaD2^UJn+8_5T0z{~ZdT zH_1c+Bve5#w;;fZ{+_ztp;Ywuq#Q`E2OOFM|58b}v4+$?U1kKr`tHQr1#4kn@Fl44 z62*yh)Pv07_5WOAr0S$S7qzBH=wxcYn0_Cfl-x?BCwft%8P}^rJcneKqVa&0ueFdKJhs;dcGifq)a38ywmC)V$edn*}w^&V% zu?)AI=oa3Wt;h{|t58k=@6&Fk6^0K1cKhh~l1k&CvR6yY5A_CQhyC+BuZ57A=FoJ% zq1te}&&w?{S@M=pp^?|0)sU+WJWNr^qkXl%tHS35@5dbbO#x@u59gme-tpNYVKwU^ z1wUP*a1|vjaU!l${n?^l?!+J}#b-^;LY{%W9W$JJz95J!S6AR(Q7h}$* zmX_Vse0W_k*JfH3y1*pGX6~u*Ee;UeZCNI5dJL{TD=%*jVoRo5xp<4DRHtAn@N zZb~gSB%7fdhqGvL8UV*(_I8XPujrP*b`j|oj7BtI5T;q%xe|>;P+d0vpMbBsFx=rZ zKCoRtR{Tp$>`DE(>&Zktx+K6R+<^_?>R0)}+Q+8CfW|5V&2PYcP3VjId~cD+Pusy5 z?^+vEF8A>?dN3dxK~0SY-}h%)`p#QN<3`MJ7tRIsej`A&Y=V~zq`ySTb>JX1^@I+7 z+as(87t^$(+I1O65Cw!}B&uv9m;mvz71i zLG4b}wVc~GPUN3+nY`%wUC%pt?j5(+IT4DTS6C~X3ulwx^&W_#B3rVrt{&V#D&aXO zHx^82HTUTH3QzUJ*?kOhLjy(*V8ag;4oi66ckk)jgC}Aui&Uhj=cAu-rL~Gel)5(?H)%U^KmN34z^1ix8V0v};t3e8Y0Zs5tNQtDfmUG1W^)@XSwYeB$%@pP151I||dsFUGVI#-XijlZV;t6M~x xaeQS2c2H)w{dHxG41P>+BK*uPdTO0XyP{G;_1K$m`M~;*OmTK|s&Hh*{{^<*7Y_gc diff --git a/src/main/resources/assets/create/textures/block/copper/copper_tiles_top_connected.png b/src/main/resources/assets/create/textures/block/copper/copper_tiles_top_connected.png index 8b6f443b00bee08fcab76ac44e511171c80534df..bdeb1a64513ff19386cfa17b782e0fe4fccba376 100644 GIT binary patch literal 4169 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 literal 1866 zcmZ8hc{tnY7XA{9h$U+4Ah*G-N~_hNRcjN)jfAncwpJUiwNwe}ir7Nw)ULR;qL-n= z*rK8KZEj2#lxUgSTA|fytqmIF{&eQvKkj*+^S$qR&-}-gVNF^iyK$2u> z?f@a-AQ3{)S<(`}3;~SlK)e9zhR{n;A?$1VgDC)w8REMX5vW$Rvv#uJ_;3pC^k354 z=Mw^(Jc-n2f+{z{VA!Qhl6K#9YsgiV^vDqc@h}G)N5TIBkZob>kSuo7(v=E;RNq0u zSfqCeOFI=N5u$cx?A z1>nt;qCHpfZuj7XKy2=96zjSp_4Uh$SqkLT~{EiY!q1zOntI@B5rx)wq=cVP`JaOcKZ=N0ygjGz7-~xoz`R59n+uGrddP+@YvUD#VN7kPGtwemmm8HWq50mccCBP$0m%4C94{^} zEqkue_%*+h!7(a!X-g07Z0gzQQXU;)A4&K)E)plsrFWEsECv|{D*?ZDJ+o5w{q-D% znH2oyHrXv+26TOGZYX*2%jJi|LN;*~K233lKtyjVBMo#NmVtBb=Omw(ErO@rd8ie5YfH3;|#=u{H=A8qSScSg2`eZ~Z>k7RlrtC@xN#SdA zx0veLcA{iU$+AH^o95Ji;4w340}kMZF!ykaVS61DA)0Ex0@3Mz7L zh?66z(bLWOqB^?#_(Ql$pxJhGxGU{Mik4^;&M%9s#)~43gJMKgAvEmaMV+aSdbHd+PoD5U)O_ zNB5{(N@}qN2@Oa-9!B2O?P(N3HKxPs%vcL%BJ`(cllz}V=P-t&g~{qnYdVhsjGI8| z9zjq|n(}S;$uNGX?Ar4;drvx)!W12KU!}PTrG}$#3qOaZJ@Wa*xk`;Ow4%n@3m&F@3a-KxNqn@ zHyTH;(WFwQY83n)olamAS)=&of6p{Js$uV!_#O333jJ68$37-1!7^BYjhj->cH)>+ z)myVF7Yv3B*TeCvaCkzCq8fX|dNp=XOv(FXMcS^vAOt^>?C?NdGp)d?i^}>Sx2Uh_ zwW2(Re+yTtlg@a%8(vnNHl(_qVzwB0@l=uLRk5CGhgCmyrF0{oQ)U4w?{+XrF0OOu zr&~S~fpQZK6&-{)?EN>KK&byhKRN|Hy*W}Gv z)#J6Zva*ziIku~myMxc1WMN}oci~#X Fe*mNkFV6q~ diff --git a/src/main/resources/assets/create/textures/block/copper/exposed_copper_shingles_top_connected.png b/src/main/resources/assets/create/textures/block/copper/exposed_copper_shingles_top_connected.png index fcb82769287e04e0d5965b03e9005196aaf66337..a41ffc20f326b81c2dc8b4c371de1fcb7bc7f9e3 100644 GIT binary patch delta 4144 zcmV-05YO+O54IqX85#xv0063Kaozv`00v@9M??TO053T*7I zEXwC{>bh)b%%r3iw5jWVd(XM&$9KMSukzd9{5k-8(nb<{rA-`O)?p8Q0KmWmjdav9nZu((wn*8Fq84=%j3aI93J#aDHrK-X}r7 zoFCh02LU>sjosWT-ZYK?06R-%vA~mF3x}6=w7s7AyzCpu*?r{fKI)nqzSsJIw%2>I z@j`enT;o#+9e#LiL~?}8>^he|lW8QNYCbjNBrD}x=Sh(pwov->!I0tF<}MiQoOA+IQ*@BkbugSzHoue6B+=Pa@? z*_8QHyYP0cZ37y45n_0g_eB- zW#7O_>jU;mo2cD-;%~G-QdZ9Hqa6fj2LUWq6M>7~r(OSl+VL07jxc-2%7`FIaq7T1 z!(M6gX=1=`ZWRa48P*Fggf9Yssap{x(Bkc(KOvAk^u^-kog@LjW_+CRv?db%@Us3i zE^yLoVXw4_H;p4<33biI+mEMc2LVo6AF!KSomeC-oIeA1gn>IkqtgWdR6n_5+(X9G zhR6Z0!4aMpO>8U0yPS?L*0Y5$l?5)K0rkMewo;6L)8StA5Z6Z0m{c6&ldT(lG0}e#@*a1E}9*@3!0If&YxlH206Pg6i7LpE1JgJLq8Jj z<$y=RlVWK6Q#=XE)%4}B0S$wE<6D2l{RMvJf2DJ z!x4|RfV$?21yxe|M3Cayp)?MR++z45Wzf?Of{69RVFJg>U}vd}lDUYEXA85ZfJwoQ zQt5iO@N^b1&7Uk)gQaRn8%bEICSn3djPh=Oa-rHmFae5ar{&$05#E7whUZ07{H>DG zp%xafvsA`I zn@~szBKK2ViTLRfL~$gZUJJw44GvKkv7?gGVfqH3-wA1{8uE%F+^*~!sB13Hk8QmF z-G2zJ&YT~U^PluuPzk_LipuL*ybGGh*?rV*Jq+AY1PkQsz6f#{2g{Szhr1#waFO%+ z;bOhJ%s>&ouDQ5qc0_zh8%dGkoUw3!Wa1<|SxlZ>2{xc*1eY++{3_4SC%u*^Rcj1o z(Lk;QZqAOC!M0KqdEC@3n0}~X@@vzF06!-Xfy6PX?;NL*28mTA~ipcE&RPoN)H7GP%;-I>65a>Nv{=wyEIOJ#tZYz zpP2AVwh;2c!^=AIdRF)#WdoiC94mw8MH4x@FO*5pn4`mX5JXTNpVP52f{UnYF4nV! zNGg=AfP8$O`Gp0jg#|b<)I}zMy5dcJZH;J_6mCr6F# zAb?s}m;-5`XirX=ahj){Dfi1u#4iZ<8?#KDKb*w}%rn0l#|QAq8lA3xsPbk#9AR<5MD;y? zulmVF`gXFCqj3&GKbJR!))mJGJa&F{79T)Z+)}j(K97nedY1|(XCqp%l@SJ~Ve1Cy z0d3~n^pgXjINpzh+E$99VB>tiJo78R{mrifYER2qfcSvdl`XWro-ikFA?w*fgu3EY z9{rRb`E!e50Pd%M`?cy!tE1N0JoA4QA8_G#*eh*fo#BIn=Gg>BZ=f4~W@6?U0ZLIk z=f7zjVb`}F%m?I4S?uYXQ9d9y<^xJo_<-Ca_yFqFao&DgDdJGQ5jj_+M}oBD&n#6# z{@LCC8=bC*HQP!t(kG-HwR+nB3m=e>`GCXAI)<$q;oow9qmmXq(d``r6$&_{B-%Z> z%9N|YZKW7FpFr-%+i9_U!1%j}xu)P(_KiqMTxKAP7ghWzR7ljdV`b3jba8lD zpXmO|X{YQP5rOF){uvK`bYg@e_g-mp!hdN~X7K@B9?l0)eB;?7(ioY>2k>@P**EZN zc}?szog(3XyD3L;xkn)H9#QUjMG+=#>K5Jw&9FT;rC;$>d_W??2aE{`nlP?iMS1n@ z$5ZU)RwKfjx+UCWTPa3*2ZYDTMe=$Urf%VR(Zt)2r;)BSJ>(9Q3c1C|geNa>*0Tj+ zNxYjxu0(4{8_7Eb@a~P=pQjzIYcAFcFYxx`X$WC|^{fz>lbPJF9V-(lM(81yX<002<_{onpM;6O({kVNfq`trBqj%?hKH4bj* zJ7v21q}M{D)15m0b!AIf9n}Q9L(IqUBYkmI=`=oo6jc4>h6>>4@c7Q3AKQ^)P(@Nsntv68;lX9w`TqG=2!|Te{ zM6~AtkIY^cl!6jPRBETuKO!;jps;O!V9jKc)H`}?)yrzwE~<8E$MSkwd`z#hs591(6SMe$x@;EpB`Ue4~L z>>Crs2;a$R{WgvV zw7w}VKE?R`T2)vAAx0TWPvZmlPtFIBqC{U{Wy6XH|7v;dF1_g4NY}M)xp%|`7ln~M)n ze*a(p8p!oHmB^eOmKRB-Y8*yybh@#B<0;khegi-7#G9jeJ&XNXHNpqbF5gFz$nU(a zY)$QLsIm1p&K_LP)8g*q18l>O0r%Y(kncP2(wLXda*9rW%&Ny_ zA|kGyzmE?fxH^qbAf#9_7qRusz}B-6fxcQ^6K=%E(`hpK$Q?hu#;ZsQ!kpHRoD#dQ z9_L5Y;_CTXd_e8idk~*6?RW_xbMEhedik{?hC}h&f2XvwVt2G2gn?v%qQ?e z*SyZBp!ksc0t0t+@3CI8n87P^HVL8l$6*t+q zdfZaAne{vuK8{b|XMcH`6pa`u;Kh~0az5whnP!#qq&TkdEajGPw}JE!0z*xc>lS9WF`Si)zD9kFzN?L8%ZQH2_!R#$O3-& z;R>I>_%Qv^gz)yzhyUdkma2i~rw#bgX~3~E_`B>fK7a9{-1-qhWYiBZ>W4y%`T_c> z@RG()^em2jTdZIGCXJncr7}*nYXpvqmqrQieH(frCFW25)9zn?pH~zN3JWMICWdAL zf3h#|(kMZ>^|7#G;Je!lzDesiO0}_-T*41G4)jC{dLo7H^#GgMMYO-%MiyW84ZQf) z6pR0(eS%6#ho&gd6a`8m1^>$}^h64IMZx)S^1eU=U6}qTVtv1VTCHG7%OZHL;+NLX z@t4+5(7EoRdp*G4Sbs6G{!{H50C1zLxJvc$55^kae{R51wNL?Dm7jfodELk7wvV&V zSNPoaG3p0s2CmTLMQ()eZZo(_^@S#neH$yuG%m0ExJnJNn_G7+B;{SD`Y0-e?ZeA| z5du+0xW4rfAceEfSNK*P;YL?6Y~5fbnZ|qH#_sc%@a(qO#Bb6%I$kJOGoW*VGy3y9 zy2jPxv-kuu+gaxe?z=BgN$E518_c?|V5!=@_Z`%S^yi5+f^Fk42oa;YVTn^)j+H^< z*v291k%;?$(DMcI1t|habSA)&ZmY;ejVc}0lS^g3{>Vizg2M9U#<>1Gzb~*N)#Fr< zaN+rVgOa(3*Oe`igDDU5QdPb$5O)c4+I@rj?kmXa=l2~%U*IAA`B}9)e}{7IL(Uh( uwa0nAPHW>Ow%jhGd8Tm*G(N5z|3BB&XJhs_q<8=e0000_G$po#pKbix9ygC{|{m>7BwHd>8w^s_v?!Rp99s$6C{yo5C)NB|~@NlFhHPR_GATr7?+#itrf-XgB*;_hePHE|C z=?S_KkD;2!{#0TBk*E$tAV&xsfe8T^q--F_|E2eCs|G`SkHaCY3xfkmh&><#r6Rw_ zgCV_VYgb`l7J8Kb^WT;ND3vD+kWi(L-oJEUm48m%+bC4|=cGbN?-?AL3;$k8IgN$X zUtPL7I(yk1qi1d$xo&%?Z;@zW>P)qYE7>nQr6z6>k|p=`%5T@lH(lTbq`K4+IZ5ke zeIz=?kHjgQp+|bIv363?Dc5&60Qi*$1)R@%?i0w{MGo;g?u1CqoXl=0EE?A4Ho7#m zn+7N7G}RU&t7Fc`4+W51nhfrAH{aAmMrbYEjvRD={L_85zaBbwrwHC>a5SUI1pF#J zarTY>Yr6Yd!Cdcbo$K?@1Y?ujY?DK0Nt;)hay(pnmdwW6nE)xljPXl- zMy=hX=Ug)46K@wzsDLwGb^dek4K|ty3ma*GHV+;O-+GjMcO3XO1rii9RI4<8 z*a6LALnxWXMst)Bj-%@74L;n!(xA&8JBK)<(eY+pO8F{V0>vAi3I!1oN zP3cGFO_d93iFj_{rxq`K-+t+RKiE&V4`;|ep1<9YJan(&T(GAZKMg)bFD4c#(iIdu zg@L-{MyF8-{}RR94`ALFG;E2tavbnf9s;4kEudgTK}e5!%P#}+Em9_kLO?9bft!JP zQIDhNk(F^_%mj)NeT8#yZXYJf-3zdcb8O{x^X8)+KN%8Zk4aYeS;mbaB*~Rry<|64 zAJDuJtMummm4k3iJI{(Lw6)eXqI7tPcIkw|X#PX(nbY%$JeSsI^L|B#GhefC%|8cX zI7I`Z%z4uhF&Oq!u{Y{>6cQ{Rx~T!W$mxAZejnd#Z4Hq>$0x`RodGJ#l@I85-F>|S zq^{7Nx0Zzc=ep2?$$@YNYte_pycKEGMnWPhd(%91+#LIQ0l z@YaeWYH@Vin7zRmp; zO1^WxtIBjF@k7e`Hl|mRjgSO_YO&GGoc^rWVaM9)I*fyHBJ}c5;pImrY(7n}YIuzp zeHtF>F+J$7DMrA{EGf5R?jKix^$hw4yq$>g_25m=6unU08hA`Dry&wuBLxJ~v|^s}qsw4C$??H7TXfq0 zNVe5VuNcw8`Tgcaxh1tg3nmF_;ni>5vPR9Dadq{I;@1DnlyeO1+KL!USlj#u8wqF(X7^P!YxQ%qLm`izPa@} z$<^et)>zj~wHH;vY-OLGlCRR=u$gDPjXLA0LfDguI3>YYLZCKpgYVs*F}G78nW_8C zGt>L3_}0s;xsMN`INJltReiDW3Rdml+|x1oOp*Lr>GIcq(|gFWxVCSCpNil8$A1a9$0Gv3;+oC|)npwnswXHb z4xSc@Fr7ADR8LSu|07M$Lu&AGPYXo=z)rb@A{6!x0IYo){r9YYQ(W6O*vhS-N!FKN2zJbwm(Q*u2 z+c&tjZ%~nJv>d}{vIky$Z2O1y=Xd_N`HGqSfmcUL5TMEWbQU14MDe0}0!`N0$K+iF zc~`-4^A%f!a@WCDZUs*ZMV|?po(I+F;PsI))K2e92?9!g=k~QuSWPcOH9E|6HCgv9!k%@C1Fs(H(_6U}R3zKy(=}L7oc=*V^dv1T!~_*Tw<0`k!-xEp1|}x95-M2FyX+f5BW5ibVagp+^e&4 zHjJK&g^Y%Oie#hLykce?)<3xOJm9q)0~S>|KCQp+i)2DXYsgxkFMdI7}$%g?RKY3l0m?ac{=al;|fTbr;oKvt{I|KkMWHj6b zj66>;oi?7#=VA0*_R@0K!ISwsOs9?gvkJCyD=tW&%`GO(Rp9}A4+4&?Ku(;kZB2VR}^sYo_flWEji??QRPB!IW6 zE}?XP-Vcw3m^_uq13-j!n9LXeOsCB(VW(X3Edl{!%jqu^zX*IBryV4-Cy*qcuShmj zql4}2`kjEckkOEmlRo$AHLs>Zh9b0*M$g4|b{&gr{Z-Gq3MfSK(SZj>9`s&RPnb^! zsjA9xf5HU90m2s^@OZOd$Y|IQGT14Xu(+mwV^dv%(Q}a!gz2~decX0-odI5PPQjja z3Qg9*^MoKU($lE77Q->A2IJRpqw^AFGP_&A?;73TA_*c1Y%VFAK#fBB`yCocTX z7(JJvGl3+TJ$-be-omE3#9V=%4I#t&1l#kjf|Q)ZZtalmFg^S@JoxduP5pPurRk)9 z!~A3E35Wx;9k>@?Qa8+LXyRA(`iE&B{b?S9LG9r?1hZx z144#R&8twefBE%S9*-=}VE?RwC-Zs00V=wU zl+i)C>#zwD>9O<#DxMA183-HP`v~EGE0WFJgTmjQb&7?I=G)!MY3V(38Vypwey%kt7+*87AdO9e)!6}3Xa=N7S3q!4Iwkc;kUEv zcztB}T!VJLou=nay)@BfiNS5B-@35a@Rqw zonYoggI6RQ)g+K>-~O%;lTkun4}b$aEfjrh4*@^vp6Y%BQ{>8NP1aJ-pj@Mwdy< zpnN_U=lKw+8Xe~IVeR)F-^T-v+fA6B$9MoerSm?OB~0KkBPeXp%L#m_&FHz%MTxzK z7LR)Q+N4{z435e+#tR~Ye&M#y%)=o)KP!G7z_+xnh5e(u1)R|Id zJ|`fvqrs_PN)VWqpc);P_VT;T`!vOGUhE(qkP?KEdcenyAF2mXoaYA!w)2y>^aQGd zD8;)8uOIM?Y(vPf-vxd8MfGGT?X5_CoEoJE+-LledH}5`9cKl9frbx(jd}}TIvJ=& zhtW*>KpI$+bv8J!7lxfnlKJuz8m9-`XZ*2x0L4$feJi&T$^&?YMen4L#2;cDH(#N2 ze#^)C%&s`6usEL*1UC6e^ni~Y|4u!C{E4`KMY6HDru%q+E=o+;q``@M6F5;AH9e0J zpturc+@JSp;sJzz33u^;`;0%a9>BW=A1OA~B_C-b(~2um_TS(W{5x@b+Ev~v?$QG& zoBY`EC)NY@tW&@m2qJ?7#PaIctDpL;0|4@B-!=Ad%65zgP1Zh0gM)%d11)UJ>l5h# zDLKi0%k%(spa*0}=mF}j9w7YZZ~oci&*F#l0PfHtcs{>>A!M+BR$=(S3lY1uL+GN! zWN=ypKIJXMWUQu_+2RDx{R%NTR1Y9bD9$NZO)vZO06sY)#&<70AUJu`^L#r-A(DWR zOtTP^8GbBeH0+d1*bp+TodghGLJQU>l)KKKT@Q%<(_j7gndy0uBQYGg23oZ?i}Q3= z_q0&N8>yOcL4E%g)4d2!pxQO-8(<1nZw196; z-r#?)P3WQoNf0nI_=XzZ!7)sfyAB>F9^hg3mgqcx9wa}dhaG%!4feZ2Ovc$|r*8ql zwAXanzRB|^He0zBMm=|HhwSe}E%~rxdY%uJ<4TkvKZVfU+98WJlo4vOjsvgmJByr1 z4_MWp8XX+Bn~XIM=>eYSbEi-}AgnlnKA3cSVr=Bo$&81m1OYFqCwMZS_qFq3j}okL z$8dBiO$V|BUenYAqCYCEJlo2x;4o(5?5#Znct1<#P{TW@Mh6)|!yit{457*A^U@3~ zJ%RU54=w;n5b#J!_}W9!)^i>u?{@T#^?HfW1KY4aS`ibO-bY2vCvTaCf^>o7rBHa2*?N; z9(EJ(EE|_y7nYuYaq$-J`))rM2m&5YPWV$=I`!o%OZgI4YA?7fM*nye!}pqzZl%A$k}U%TnF zQPFP;AcF1m-VLf5NCTE$XQs%1Pd@J|NTrh~otN0TfG$cf6nAJ5coCI0Z*i^fE@j0T z5_D9f15>-@2*S&+zw$=qrQ)FB|PRYYv`TRINU=lsyuKIxBWWw$X@b?|~lAOEh8-$l%f8|ks*-NeUj(upb zG?ia*Dr~;Xr^8a}*GC4j+AL$3yj6wO2Q=y}c1S~EjI4tnk9PUMtNSd0*BkkYRI-N1 zr1|)$e14Q3FsYspJj~=zbf^Gp)O`V-H-we-Qt{@v`iAJ=|Lyv-NoZ%?vr&l25F#HB@558aV3k$y9yq56L@3Qu(|LV{$$l4M`HME{Zo7* z-uP&FkafDh3VbWy^QYvB8LO%!4>X51UhxHow9*7gD34?kRB`4bH- z$H0%1IsDN$#zID8mf{X9C3(}upR5|Qgob*9Z%*Dod=ST_YvD5`i|>pEKE3MWzA(^0 zBZRhLWwE33aiiyd4*B4R>Ips#lDjQNwZmce1t_$J-8V2j4+|NMooI#Kci`nT8ejPD zfBTKc>+a+3>yVTb#uLH-FD#{|h(hR2Jb=O>4|rteGn+J)sbjeU?I#r%*S_+6e7=%NtjF%$M~BIYclL?OCU{OfYyp z{~`JKU3voTURZs>xcdU+n&a*pjJvN;h{;Tj8+G3y`m4YDhiClx{AWrQFI@wR(Kup{ zW^sAl!MC-42IC2If-|$I;H}v=yO~ABcVZOGC;0k;c`1oMoRnD{mf~@oNSF9oGKaVC zT?pMiz!I+jfEo9ORjYlWKf?2B6-%B7)AOLYH@K2Td~@=KweKHQpr-nfMUTdP(LsC= z$CLRyPNYj@g;_-II-d`_NEOV-$La|a)E5L99-rPwPIBMiuKNl+CIs(02><%)UwD(8 z&yUK-!yelCN$Ly2j>qY5liW85YaexAVb3}py6^CR&g#_EKhhtG00000NkvXXu0mjf D{4y-9 literal 1942 zcmZ8hX;{+v7XAa0U>4*umStMg!#LrXS}J-q&;gaMTQ0dED!F0Ot&~zs!5wYf$`sqk zC9k&O zh%O)!wiN*b-+RyF=Rtr(xY$|)f>#G-KtmzK%E1Z%o@MRaqQODi#M$1B^fvhIZD-v3 ztCaBsM#Wj%h;DhQH$lWalT9{k3$y2hd%Vg>tWSu{PY=C$g;o}MmKEp*mhQ=}MuDKh zba8Z*|5JdEEiEcw6nW9kD*^y^w{9z>_IlVKpmQ&i!2j`bN@5SPhs{6XZz_CX2+)87nh-bu0of@~_y5hex7CHfzWSjcH-ta|G>G1y zhH@3Y`pNMj zb!zFQoe%GycH5c69$t%$>)m(DZ`xqD!-A$>P{2+K(y_1kPcm;yJRvBARj8lb_ub28 z*iw!@soxLyR45F(yL$e1UXVBDlQy#p_4)0Dptt9<@9TalEh1`_GNq*_BBx;o z@PwD(P;vidF9Le$w}F=h%NlW^7~iW8aTtk*LTSz`Os1H-@!B9Wb@5*zU4bub?Tsbh zMv-{Y%QH(mg~E-#xBZ53yY76T-0FxwIVpz{_|Ujc{U1%u)ZMC^4p_9s;bu?Ng)v2{ z;akTrh$?Ov><<9lXQ36Uf!;K({)%6LI|w_Ma`{-_C& zR7yFGmjMcD^qTZZ_sK}$qYS$z_%fB~uRLy&@eXwp>!*@Db7R!-kQsyA!TanZvtnH} z@$~Ri4~Xz8wIBwac*Bek>xfa0{1DkpihwQT90Jhy=@r1G!ZaaNrX#av$q0c0b^$#7 zATX&axvWX~CW)6D-#oNmzTT=QlfbB{7ywtr(fVd+V(>#Z5tvp@wN|A0wQO2JkYgLa zpe%t|qnJ&|;Z1FG1W;Db&p1XNsJT@8gYIPwOqO&}9V^PcO{l ziK*JlbYGPLfsk9HRr1sUI_)}hb11z15^ij@dHiMnxQ%|LW{M>7%?)aJlM`N46GPDC zY=s=OxNB-Tv{@h{n6Cuh{3J$I+@h%4?CFsHC<{B;IQ7iO#s&6%jVl>(N5g>R5!I!mqX$N;tY1jR6?a zlWSe(LgrjNw|~%?D%DAq%xJ^28;A*~4tteq-=^P*3o&~v%96%wpwW#z&QB4VNOneM zufd&jwLg3*M~29Sb&VtKL~P!<A)GZuBa|ksC*2M%L1!T4t%RqsA`dWBi9I c^^5f!h>n^U?&14`JGVc7GRcuBu=Y>*AJ;%@VgLXD diff --git a/src/main/resources/assets/create/textures/block/copper/oxidized_copper_shingles_top_connected.png b/src/main/resources/assets/create/textures/block/copper/oxidized_copper_shingles_top_connected.png index 1e1a56af94beb6705125c09cc14a7cd878d40ab8..723eef13a644f212f1408aad85865126fef5c130 100644 GIT binary patch literal 3913 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 diff --git a/src/main/resources/assets/create/textures/block/copper/oxidized_copper_tiles_top_connected.png b/src/main/resources/assets/create/textures/block/copper/oxidized_copper_tiles_top_connected.png index d3c5e938e6ec387574be32d3c529279665d23b4a..5577810f3d1eb16789ae469a16d1bb5ecc5d4647 100644 GIT binary patch literal 4197 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 M07*qoM6N<$f+0T~FaQ7m literal 1966 zcmZWqc{tQ-8-8boW>DFhM80NHvLtJ#CRxTZ##qKS)=u_)97{x$!Pv7e$DS>ht&TmB zZ77FS2vG>f(vS>Awmy76o%8+keb040?|nbd{Vdn}{`1Bfl8MJSg*X8K$4J_m#t`BU z9fg3-2T#MkKmhYKCaQy~e&Ho3U~^H^R|B9niR<5X>`;8oP>(_waURJr#Ess)F-P~P zvnTq#J}9%o_xhP7ljORndI{0q9+|(Ad>s7}%-wy6j)eiv6#+p{v!U*dW|zkh@cS8) zO%DFgKwa=83X(azwJm)CINo{au%;C13Y0wMN3ifS@pASHu)F014DH-J{iMkR3icOi zIcfPHt%ydbrqRiQfuKA!oMe_L;TR-&|LV>O5&2_dgPQe6Y`APPw~S09 zUa}#)rD}OtcHZZUa;Z|;K~W2<;NU30XAz?W1BtUTm%oL;UF!;lhiV`3~9V7rKawXW=K$y#Me|3 zwj$f#Yus=y)jqm0%HD zAdn77d5Lg!P|jubFGse*U>|yz@gGXtfjmo`*Z|9$pi(JOmrE}B^Btq4z~oJJtkTE$ zT^15sh_7`*RqN2$8B<=dvN~fVRQzSBz!(~~c}>))SD)6+#;nolYZvZW+)%fui9q4RK;}*Xjp+_4j@z)Lgx1zS~67N1-op;gIX5MBpMGMKDeK1 zpbUmYmG=Pe4rUw$v~LHFwx4%mYTGBY1Kj-ot0PS_h%v(mXM`sFxH%6HNS)P*h_RL>Io(Sjq4ni8l~9^-L6`GwmSEz z)`sabP0^P6omMy$CB574%Cm=UENb`qGjS$TbgTBGqHWuvczlzvfcoA0&mV4tCz}WJ zE7AivnN!m}e`$2R;=MEMPV}T&f^QYBnUf_aupGyoI&;;e6{ttH5W^zZnL(?x8KwWdtD$i4wO0SjX9Wl1G|t2X>Fc(M^l*KhRpSgGsCZ_8R#u$UGlN^&q~J>`_6=v~ z-xUc5Gm#DQ`gBHlA6YZ`JQkg&`$NC7e)e|#uIt6UaC2gV0V&h%+ll@y7Rs|gSE3*hapZjQSHh z&oGN{INei$a*=+YtwVjnHS2fxrZ?YZ_}vc}&BCkB#ppOm1L>WhAc@Ms1u3DxmBoEK z^vvMV%@_|GWN}+^!CadMdU!?U>`4du)#_&-zRq5E)?@m&=6Yhz@UpY`*V3g3WM9olone8ZTl$c|Cx$=D+7c56UeW}MfC;#K(Yt?IdRT}DKNLb~90M0Z_HuV%t0 z?sp+A81XI3FDj=dxvko+TSO(TD$j9RH(T;pFtd`A9FF*xsi$0}*D*GFwh)Q#sGB7m zO*ttkPo~ZlYszhk9e?+HKYy(RKG=Vd<>o{c;O(v)Sl=^j7gKsu{3{PLM3y$va*r~k zN#Au)n&!7cfymf0XA#o{H)8X9nUKs?Wd8V2rp2YD$H%|~y1V#~<>1acxJNWq9GdeI v8y`thiK+a2Dk&%vmLgQ;<4vv1VzsbrDkH6iugFh-Jp2$y1hQt8x-I=b<}q4p diff --git a/src/main/resources/assets/create/textures/block/copper/weathered_copper_tiles_top_connected.png b/src/main/resources/assets/create/textures/block/copper/weathered_copper_tiles_top_connected.png index e974b5a6ebb79d17d9c2034dcad1b7c98c46514d..4b2d91c7fe0dfa1cc7e08f97c98bf5f3fdfad99a 100644 GIT binary patch literal 4616 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 literal 1948 zcmZWpX;{+P9zK8yE&*m5*SbPk6HSu?W~GLLgqf+RpADc$?;%1EzvX80{|>> z-pOD=Oj`sB0j+1RrAUxdL;j6r`Y?N^FFj5F1x^)d^^H5H!C{fT1DuExZs*NZmxG^+1>+(otzH`L)HF? z%(W01aaqjWn*TGvPkxDl!n)Br_rwB#zP$*TF>zNa-3eyHKNbQ2K;vc zdq+Y?l79|%3AsV;BApK5O;YmBT>K=O{;t`+V>*D)w5jVf#r)%PQ>6^}tQ_XMy{m8P92nnzzWS9<$w;dGO`9&Db1B z{pvwlE4FnzNxa!U>R&51v6#+H^Z`>4CycurSX zv)xYBmINbK`cL7+fW0N-P>2bdTddIs@p`~)Dl_VJNsZTwu1+I^>^deinc&{@aoD7R zjY#dNg~bxt+5E~swM7;*s@Ekx+AjP44>ONH!9`W{!@uvvZ@;T^niE~|cx~j#vn*Og z+ojq%-OaB;&Bx|&qu#3{&6R7yh{vVf;Ulen_99&?opsDlFTx%5eZNWu=3RbWWF8Epyg@38Kq{r;2Lyes26tjCYNJoUT$H@!Oy>TUN8wJ`_w zp-zNxJY{O2wQQ&Fx!H#Q#DQsb73wnA?}Ugr$UgrLS)}j3G~@YLoNF|?v3^<-pSM7W z{~CEIfwQ)IoX@6mLaYiVdIPl`)P%VVP#NVigPhla19^_CNvhu;jDWP1(Uev3%Cw#@ zDFl6-IVg(jAGQrKDK9%i_ct>>rgGSmpg?qB-9UeVI$}?Bu@t@02v*}x&^ve{Ie7{R zTLaGisI-I={CY<)*h0;3xggc6EbP4t>qzdJCpaUK=TOs*9L@l}oH_^Vv-ZsCiMG3! zqdOWf_msIIvsw*|n#6Ye3aOg5@%-SBJd6r7hbet;KhG-z?W@K4l&?~ZL4P<*s6b38 zXiGc9#-G=_-+&HO^JvSfX8hCU{LjCvY?(^h$Lo`vB3>W?g0arOiUYBE<*ln56d#a+=LM?cTdxZ60z57Pa+scGzFXAN5V5Rpn_U z@zF(?Un!Nz9%@?K*gaxJUCOANtbsH+L9xb%&rtg9^2bO;rm6BeUJ(zgCWxM4WhWP& z9zqr%`-;mb*!Mj44#zy?>$?m+%zFG*7Z?$Po)4$4?0e9Hd!H2`U_PQAB{aJh6G#pG zdx+PH*uA_n$a>pt(yfjD2cJ=oav5S4x8ghZS0y78SyQ($lbr|sQQza^CF<=1JrVco zvm0t}mfZ0g(8rCX(H|=uumdAhxF}8+d4|C{E46yWhF^^-U5!^D{AjfPgP8{$Jqkyu z`&TTv%vy4-VKyV`6fpfQf7l9 zx{u?QcFrUYC+r8W|VAA=Zn6)P$2RqQQPZv+kFZPo2BNp4D!Qu=m%X3 zRkOA5ewn6qK=Q<5^+~sCm1@{GJ@88*x$+$=lNdF6`x?bb} diff --git a/src/main/resources/assets/create/textures/block/copper_gearbox.png b/src/main/resources/assets/create/textures/block/copper_gearbox.png deleted file mode 100644 index c43c716a2217fe605d78a04df4e9965bf2548c0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 296 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}NPtg>>;F@&FBj)N>`S@Z7=NQU z>S$`vk>sEaAzt&mTzecGLPA0U0|NsB0{r~^e0+Q=%&fh1o%*~Ar4W%R{nVCW6JFK2|4oLNTx;TbZFtQ$G%sOnq!*F2o;$7T}|Nnn_Y{Aki zo=fgNy|;+*;=7yay{lXMcEoNBveoG|*qg$W&w8x-e%iOKJ%85umtVDV%i4FYr+T}* z^Ci)K$1CoWo08ijCP*=OIF>JX9uy=|%lY>ftLF*}ySumLosZ@2d%e9!>ddU0%WH4m rm~n3EqnXDYBum@&v|BP1&-{PS)Jtadbi<24r!jcC`njxgN@xNA@91=c diff --git a/src/main/resources/assets/create/textures/block/copper_plating.png b/src/main/resources/assets/create/textures/block/copper_plating.png deleted file mode 100644 index a5503480857054b3a27ac6f97083aa7f3fd725f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHF3h)VW{eP6lu{e|Vay!o*-xp5=Yq23nfuBTsM0e0=G{CoO6DHeP9`)2E$Fvl@Cne7Y3y zR%(Gr0K<_R8#pxt@_0pVvWRGG|CV@T6Q@SND&`cKIH@SPRA!S8OD0Y-JaHhm`W(Z- tmojZ{Bi}t$eRn!b;@uq9&O4Ue47N^A0iWKc<^r9>;OXk;vd$@?2>^l-V~+p; diff --git a/src/main/resources/assets/create/textures/block/display_link.png b/src/main/resources/assets/create/textures/block/display_link.png index cd366dea33dbd63f526296cccbeddc0cab87c94b..2f55176701ce815da259336309585b64d77f621f 100644 GIT binary patch delta 1577 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 FV1jWegxdfB literal 7144 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 Y$2T9k8WKVUIsjy5Y-Lnpa5Ch70N>D~{Qv*} diff --git a/src/main/resources/assets/create/textures/block/stock_link.png b/src/main/resources/assets/create/textures/block/stock_link.png index 62be510a1178e56f8bb770a5a48d47e27cab589c..01d6cdd17681c81182a3d27fb5dac1ac236e07d1 100644 GIT binary patch delta 1093 zcmV-L1iJgy2!sicDlsU1(cn7{`AnYfjFVq)nTpGd(S=mJOjB*j=ay z-jsNu^lBI4mB?U&U2Woqh%&}dL@Kyl^+FKlK=DEmEIK5V*}1OOunMM7?LvpiyR#)G zP4iJsPPWF2^qiiPk20;GNdGs_pZC1adH?76c%LKj4fkgUVngc zF^|_D0I+zum}gzr(K8xvoqdJKi$|pnfRiVW)#AV0#pCP2-PwgpQCQb?T#5o<@pWCN zT3Dr0%5ms$9}^QFOLid-b)DB=eV*Ca95*sLW%8E)iI)#E8=GS~mUoEn08qmrmX>u~ zvWGp=J;t6JWk7#b9UEt3bIdQ?p(qFN_MFRf0W1vbn6q7vl-WBBMak@pW&Xdtdsig?s&ntIYxiRFyNQ zkMqIBj{wN#vIKjA7C&?PcvEedUGV0)5Apefk92scnB~0-uWfdL9Y5Zh=hFCj04o9j zm&VWY#n*q6Ed>B5iWj%P`;i1FRo&SI_QIH+j*-r-FculLB9Iiqs*R_PjI@36kSdW7 zwJi@HQYGTKhAyzDz|3`H4VcB)DgtIjw`)yjorN4eO(|&1dn?}9dO}N~>t(LZBzag_ z+fu-_nF_jIZtj9gDMwNW>#Miol~T?TiNDhYKgEBpH%CBdDMEb#LVbZPd1C}jTzp}q zcI0uDMezqusC!%56JO0rO;@oQLZM|iwYOS#xL>8Wvf+5^drob7;Y3E$x2}62OzsK2z)N^s!PXQC+PdyJd{3f$Ww6 zEN)Z{++7~by+6-v7SuZz-lz#JLo_;vEXx>%fh=$MZ*apfh(w-74Tr4GX}Sjt!*JNf zHFv|Dw+}L*Wsqf=PJg{n6~zl+@j`K>X_S9U00#~X*ZPOTtQ1OgclyZRE4GY4;4#0o zCza4xT3V2{n*tYr&+D@m(#dSw&Gu(@pKS~HH?bpNN5GB%7eJ}JIVO7t+W*U1(cn7{`Cf+LNP6nzmUw<7r{FYz*3g-Gz#m zC0;1K+J$%}GT2~On>Z0s#u$o71-GkS2*MnA=MXGoNGP*&U8-RfOrfrZiOIX8iTP+g zx|5S_@uJP?`N~$Uph*8W&!6`^&-?!Ke7tWw`~!$zzSMeu>N9`jNEELu;}7;yua@x# zdjSkyua!_AA8Dn2yn`>$PbhSk$=C!#iefn=kz8PL=@zT2 zkI|?V89VqS)6<`N%s%%ujW=Fv@ejWdI&%8pmEaNFuqwT(WH0*9)LTBbLKw z;=CH@w3h^1)n3vYj#qigDj`gg!{t` zDGK5KFoj~l;LEABaj>~WLd|losj*9zjUH%QGxy3eyJUZvdrb|YW&!9j3m8%qPMti; zN9R5PpinFj?hhOM)XAfc-T-*_^oO3m+PK%gz2X!A@ZHTt&QF~IFfssee(DTgd^O`L zAb$B$>+RDY69|U4ba<^=;DfWTZ%%=^E^~89a>Wvpu?Zss86k|`c;?W!>!z~or#slU zB>{3%vo?RBxdiQ6+k2qhjBXidV?=p$CG0+4yMw*%ZrqM`M|T=cYokXjF^&?nfAzz- zee{HyMbqkBozHN;vGz~_SLYjOTHQGXjaqTb8EDjsmQwtkDfm8l&6xqAW;rl6@?9B&Bmlxhs`+3RXuuj2L{y>eS)c+XyfkINnH%54pEj6H**l3V8;tQ}o|j_Y*)M&0Ykh&%G zrjCEqEddx@Z|Zc1e6)RknBQ!u_s+i65^A1!d;v+4&~+V2+KAuax~>z8J&O{J7?b08 z3v^w#So>Nxz77}6AVSR}NfJH5^+uItKY+n2)so{W_W(<1xY1QyE$7~0Vw?L94;|gwDJO5wdPj><^>qd5# QaR2}S07*qoM6N<$f(20fdH?_b diff --git a/src/main/resources/assets/create/textures/entity/display_cloth.png b/src/main/resources/assets/create/textures/entity/display_cloth.png deleted file mode 100644 index 9ec8453802571427621129098f20ef9e9761e4a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFM1 zMG8<*-qXb~MB;L?1B0VRN%~w=KSYn+RgVnes&n{v80#wT2>FVdQ I&MBb@0Esy@X8-^I diff --git a/src/main/resources/assets/create/textures/item/display_cloth.png b/src/main/resources/assets/create/textures/item/display_cloth.png deleted file mode 100644 index 167f9e8af5ff7f9f79325dfc771fda4a28449c61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 233 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}f0G|+7W19%S_}bIA|JJYk^#A{VH5pEz%p?2VAAl5lNswPKP!I?hq`aBk zfI^%F9+AZi419+{nDKc2iWH!rm#2$kh(>Vh`9>}VMGoc*nP>n1f3oLGm(@cyy^1LU zZ@gF=5{~sVT)mdWl+t{~{NKafi_5Rhs8Q0^Z|L(^Z8)}ub4h*T)Wb8m&#--xX1@4q Sme(wxsSKX3elF{r5}E*kol!0T From 406ed01864c2d837f0ed5b33e14a98b5a4180c74 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Tue, 7 Jan 2025 16:57:08 -0500 Subject: [PATCH 269/515] Gaslight by the loader - Fix ArmorTrimMixin, lambda names are different in prod for some reason, and are too brittle to even try relying on --- .../foundation/mixin/ArmorTrimMixin.java | 50 +++++++++++++++---- 1 file changed, 40 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/simibubi/create/foundation/mixin/ArmorTrimMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/ArmorTrimMixin.java index b040215546..d0770fa543 100644 --- a/src/main/java/com/simibubi/create/foundation/mixin/ArmorTrimMixin.java +++ b/src/main/java/com/simibubi/create/foundation/mixin/ArmorTrimMixin.java @@ -1,23 +1,53 @@ package com.simibubi.create.foundation.mixin; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; +import java.util.function.BiFunction; -import com.llamalad7.mixinextras.injector.ModifyExpressionValue; -import com.llamalad7.mixinextras.sugar.Local; import com.simibubi.create.Create; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + import com.simibubi.create.content.equipment.armor.AllArmorMaterials; +import net.minecraft.Util; +import net.minecraft.core.Holder; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ArmorMaterial; import net.minecraft.world.item.armortrim.ArmorTrim; +import net.minecraft.world.item.armortrim.TrimPattern; @Mixin(ArmorTrim.class) -public class ArmorTrimMixin { - @ModifyExpressionValue(method = {"lambda$new$2", "lambda$new$4"}, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/armortrim/TrimPattern;assetId()Lnet/minecraft/resources/ResourceLocation;")) - private ResourceLocation create$swapTexturesForCardboardTrims(ResourceLocation original, @Local(argsOnly = true) ArmorMaterial armorMaterial) { - if (armorMaterial == AllArmorMaterials.CARDBOARD) - return Create.asResource("card_" + original.getPath()); - return original; +public abstract class ArmorTrimMixin { + @Shadow + @Final + private Holder pattern; + + @Shadow + protected abstract String getColorPaletteSuffix(ArmorMaterial pArmorMaterial); + + @Unique + private final BiFunction create$textureCardboard = Util.memoize((inner, material) -> { + String assetPath = pattern.value().assetId().getPath(); + String colorSuffix = getColorPaletteSuffix(material); + return Create.asResource("trims/models/armor/" + assetPath + (inner ? "_leggings_" : "_") + colorSuffix); + }); + + @Inject(method = "innerTexture", at = @At("HEAD"), cancellable = true) + private void create$swapTexturesForCardboardTrimsInner(ArmorMaterial pArmorMaterial, CallbackInfoReturnable cir) { + if (pArmorMaterial == AllArmorMaterials.CARDBOARD) { + cir.setReturnValue(create$textureCardboard.apply(true, pArmorMaterial)); + } + } + + @Inject(method = "outerTexture", at = @At("HEAD"), cancellable = true) + private void create$swapTexturesForCardboardTrimsOuter(ArmorMaterial pArmorMaterial, CallbackInfoReturnable cir) { + if (pArmorMaterial == AllArmorMaterials.CARDBOARD) { + cir.setReturnValue(create$textureCardboard.apply(true, pArmorMaterial)); + } } } From 1506570f34f6ff0f3950c9b512ee84b2ba4c8b72 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Tue, 7 Jan 2025 17:21:55 -0500 Subject: [PATCH 270/515] Pondering some catnip - Update catnip - Update ponder --- gradle.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index b3acdf5e19..2e64389349 100644 --- a/gradle.properties +++ b/gradle.properties @@ -28,8 +28,8 @@ jei_minecraft_version = 1.20.1 jei_version = 15.10.0.39 curios_minecraft_version = 1.20.1 curios_version = 5.3.1 -catnip_version = 0.8.41 -ponder_version = 0.8.14 +catnip_version = 0.8.42 +ponder_version = 0.8.15 mixin_extras_version = 0.4.1 cc_tweaked_enable = true From 2e7486070e4868a7e8adfb294cb3c0cea18566a6 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Tue, 7 Jan 2025 17:24:34 -0500 Subject: [PATCH 271/515] Flywheel += 2 - Update flywheel --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 2e64389349..90f3b5e55e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -23,7 +23,7 @@ use_parchment = true # dependency versions registrate_version = MC1.20-1.3.3 flywheel_minecraft_version = 1.20.1 -flywheel_version = 1.0.0-beta-175 +flywheel_version = 1.0.0-beta-177 jei_minecraft_version = 1.20.1 jei_version = 15.10.0.39 curios_minecraft_version = 1.20.1 From 4bd47bea41c0df9a400a00703ba068b4673ebaea Mon Sep 17 00:00:00 2001 From: IThundxr Date: Tue, 7 Jan 2025 19:30:37 -0500 Subject: [PATCH 272/515] 404 - Cannot be found - Fix trim texture location --- .../com/simibubi/create/foundation/mixin/ArmorTrimMixin.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/simibubi/create/foundation/mixin/ArmorTrimMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/ArmorTrimMixin.java index d0770fa543..975e19728a 100644 --- a/src/main/java/com/simibubi/create/foundation/mixin/ArmorTrimMixin.java +++ b/src/main/java/com/simibubi/create/foundation/mixin/ArmorTrimMixin.java @@ -34,7 +34,7 @@ public abstract class ArmorTrimMixin { private final BiFunction create$textureCardboard = Util.memoize((inner, material) -> { String assetPath = pattern.value().assetId().getPath(); String colorSuffix = getColorPaletteSuffix(material); - return Create.asResource("trims/models/armor/" + assetPath + (inner ? "_leggings_" : "_") + colorSuffix); + return Create.asResource("trims/models/armor/card_" + assetPath + (inner ? "_leggings_" : "_") + colorSuffix); }); @Inject(method = "innerTexture", at = @At("HEAD"), cancellable = true) @@ -47,7 +47,7 @@ public abstract class ArmorTrimMixin { @Inject(method = "outerTexture", at = @At("HEAD"), cancellable = true) private void create$swapTexturesForCardboardTrimsOuter(ArmorMaterial pArmorMaterial, CallbackInfoReturnable cir) { if (pArmorMaterial == AllArmorMaterials.CARDBOARD) { - cir.setReturnValue(create$textureCardboard.apply(true, pArmorMaterial)); + cir.setReturnValue(create$textureCardboard.apply(false, pArmorMaterial)); } } } From 24bd97cf2cdb5118f26339fb65a9234ff874a85c Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Wed, 8 Jan 2025 10:01:20 +0100 Subject: [PATCH 273/515] Breakfast debug - Fixed tracks creating signal block intersections despite being in different dimensions - Steam engine placement assist now shows a normal shaft - Fixed Frogport sounds creating individual subtitle entries - Frogports and Postboxes now highlight their target position when hovered with a wrench --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 6 +-- .../c24b4d2b8d15abff51c78bd94f4403d9eae6c139 | 4 +- .../resources/assets/create/lang/en_ud.json | 5 +-- .../resources/assets/create/lang/en_us.json | 5 +-- .../resources/assets/create/sounds.json | 31 ++++--------- .../com/simibubi/create/AllSoundEvents.java | 17 ++----- .../kinetics/simpleRelays/ShaftBlock.java | 3 +- .../steamEngine/SteamEngineBlock.java | 4 +- .../packagePort/PackagePortTarget.java | 2 +- .../PackagePortTargetSelectionHandler.java | 42 +++++++++++++++--- .../packagePort/frogport/FrogportSounds.java | 9 +--- .../content/trains/graph/TrackGraph.java | 4 ++ ...rogport_catch_4.ogg => frogport_catch.ogg} | Bin 13 files changed, 65 insertions(+), 67 deletions(-) rename src/main/resources/assets/create/sounds/{frogport_catch_4.ogg => frogport_catch.ogg} (100%) diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 7827fc4fb9..1817b6197c 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2025-01-07T16:30:09.3458051 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2025-01-08T09:46:32.7401287 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -642,8 +642,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -ae4560acf1dc152676a319589184d6722d2893e4 assets/create/lang/en_ud.json -b90c20d923ba094594f5062802eeb822f34691ef assets/create/lang/en_us.json +739f9cbd71716d56d1561002e8668261cddf5b0c assets/create/lang/en_ud.json +20c3b2a59090bf209090579c2f37db818a06a26b assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json diff --git a/src/generated/resources/.cache/c24b4d2b8d15abff51c78bd94f4403d9eae6c139 b/src/generated/resources/.cache/c24b4d2b8d15abff51c78bd94f4403d9eae6c139 index 835758bfdb..5daadc0436 100644 --- a/src/generated/resources/.cache/c24b4d2b8d15abff51c78bd94f4403d9eae6c139 +++ b/src/generated/resources/.cache/c24b4d2b8d15abff51c78bd94f4403d9eae6c139 @@ -1,2 +1,2 @@ -// 1.20.1 2025-01-07T12:22:29.7516833 Create's Custom Sounds -56957fbbc59f80d23bf39df63f1925112fbfef7d assets/create/sounds.json +// 1.20.1 2025-01-08T09:46:32.7381345 Create's Custom Sounds +0bca17432111ff732e5188cd3098201330e386bc assets/create/sounds.json diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 4ee525c724..1c783c293c 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -2749,10 +2749,7 @@ "create.subtitle.depot_plop": "spuɐן ɯǝʇI", "create.subtitle.depot_slide": "sǝpıןs ɯǝʇI", "create.subtitle.desk_bell": "sbuıp ןןǝq uoıʇdǝɔǝᴚ", - "create.subtitle.frogport_catch_1": "ǝbɐʞɔɐd sǝɥɔʇɐɔ ʇɹodboɹℲ", - "create.subtitle.frogport_catch_2": "ǝbɐʞɔɐd sǝɥɔʇɐɔ ʇɹodboɹℲ", - "create.subtitle.frogport_catch_3": "ǝbɐʞɔɐd sǝɥɔʇɐɔ ʇɹodboɹℲ", - "create.subtitle.frogport_catch_4": "ǝbɐʞɔɐd sǝɥɔʇɐɔ ʇɹodboɹℲ", + "create.subtitle.frogport_catch": "ǝbɐʞɔɐd sǝɥɔʇɐɔ ʇɹodboɹℲ", "create.subtitle.frogport_close": "sʇnɥs ʇɹodboɹℲ", "create.subtitle.frogport_deposit": "ǝbɐʞɔɐd sǝɔɐןd ʇɹodboɹℲ", "create.subtitle.frogport_open": "suǝdo ʇɹodboɹℲ", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index fcef389fc8..3f854462f5 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -2749,10 +2749,7 @@ "create.subtitle.depot_plop": "Item lands", "create.subtitle.depot_slide": "Item slides", "create.subtitle.desk_bell": "Reception bell dings", - "create.subtitle.frogport_catch_1": "Frogport catches package", - "create.subtitle.frogport_catch_2": "Frogport catches package", - "create.subtitle.frogport_catch_3": "Frogport catches package", - "create.subtitle.frogport_catch_4": "Frogport catches package", + "create.subtitle.frogport_catch": "Frogport catches package", "create.subtitle.frogport_close": "Frogport shuts", "create.subtitle.frogport_deposit": "Frogport places package", "create.subtitle.frogport_open": "Frogport opens", diff --git a/src/generated/resources/assets/create/sounds.json b/src/generated/resources/assets/create/sounds.json index 7d73bd5699..e658638449 100644 --- a/src/generated/resources/assets/create/sounds.json +++ b/src/generated/resources/assets/create/sounds.json @@ -235,41 +235,26 @@ ], "subtitle": "create.subtitle.desk_bell" }, - "frogport_catch_1": { + "frogport_catch": { "sounds": [ + { + "type": "file", + "name": "create:frogport_catch" + }, { "type": "file", "name": "create:frogport_catch_1" - } - ], - "subtitle": "create.subtitle.frogport_catch_1" - }, - "frogport_catch_2": { - "sounds": [ + }, { "type": "file", "name": "create:frogport_catch_2" - } - ], - "subtitle": "create.subtitle.frogport_catch_2" - }, - "frogport_catch_3": { - "sounds": [ + }, { "type": "file", "name": "create:frogport_catch_3" } ], - "subtitle": "create.subtitle.frogport_catch_3" - }, - "frogport_catch_4": { - "sounds": [ - { - "type": "file", - "name": "create:frogport_catch_4" - } - ], - "subtitle": "create.subtitle.frogport_catch_4" + "subtitle": "create.subtitle.frogport_catch" }, "frogport_close": { "sounds": [ diff --git a/src/main/java/com/simibubi/create/AllSoundEvents.java b/src/main/java/com/simibubi/create/AllSoundEvents.java index f1d9efba19..eb4a0eb964 100644 --- a/src/main/java/com/simibubi/create/AllSoundEvents.java +++ b/src/main/java/com/simibubi/create/AllSoundEvents.java @@ -151,19 +151,10 @@ public class AllSoundEvents { .category(SoundSource.BLOCKS) .build(), - FROGPORT_CATCH_1 = create("frogport_catch_1").subtitle("Frogport catches package") - .category(SoundSource.BLOCKS) - .build(), - - FROGPORT_CATCH_2 = create("frogport_catch_2").subtitle("Frogport catches package") - .category(SoundSource.BLOCKS) - .build(), - - FROGPORT_CATCH_3 = create("frogport_catch_3").subtitle("Frogport catches package") - .category(SoundSource.BLOCKS) - .build(), - - FROGPORT_CATCH_4 = create("frogport_catch_4").subtitle("Frogport catches package") + FROGPORT_CATCH = create("frogport_catch").subtitle("Frogport catches package") + .addVariant("frogport_catch_1") + .addVariant("frogport_catch_2") + .addVariant("frogport_catch_3") .category(SoundSource.BLOCKS) .build(), diff --git a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/ShaftBlock.java b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/ShaftBlock.java index 67d695e241..e234990f89 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/ShaftBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/ShaftBlock.java @@ -128,7 +128,8 @@ public class ShaftBlock extends AbstractSimpleShaftBlock implements EncasableBlo PlacementOffset offset = super.getOffset(player, world, state, pos, ray); if (offset.isSuccessful()) offset.withTransform(offset.getTransform() - .andThen(s -> ShaftBlock.pickCorrectShaftType(s, world, offset.getBlockPos()))); + .andThen(s -> world.isClientSide() ? s + : ShaftBlock.pickCorrectShaftType(s, world, offset.getBlockPos()))); return offset; } diff --git a/src/main/java/com/simibubi/create/content/kinetics/steamEngine/SteamEngineBlock.java b/src/main/java/com/simibubi/create/content/kinetics/steamEngine/SteamEngineBlock.java index b6cee4f848..8735c74fe8 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/steamEngine/SteamEngineBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/steamEngine/SteamEngineBlock.java @@ -201,7 +201,9 @@ public class SteamEngineBlock extends FaceAttachedHorizontalDirectionalBlock Axis axis = shaft.getValue(ShaftBlock.AXIS); return PlacementOffset.success(shaftPos, - s -> BlockHelper.copyProperties(s, AllBlocks.POWERED_SHAFT.getDefaultState()) + s -> BlockHelper + .copyProperties(s, + (world.isClientSide ? AllBlocks.SHAFT : AllBlocks.POWERED_SHAFT).getDefaultState()) .setValue(PoweredShaftBlock.AXIS, axis)); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTarget.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTarget.java index 86e6203983..a537294ece 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTarget.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTarget.java @@ -223,7 +223,7 @@ public abstract class PackagePortTarget { @Override public Vec3 getExactTargetLocation(PackagePortBlockEntity ppbe, LevelAccessor level, BlockPos portPos) { - return Vec3.atCenterOf(portPos); + return Vec3.atCenterOf(portPos.offset(relativePos)); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTargetSelectionHandler.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTargetSelectionHandler.java index 08012c1a7f..3ef705e192 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTargetSelectionHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTargetSelectionHandler.java @@ -73,19 +73,42 @@ public class PackagePortTargetSelectionHandler { public static void tick() { Minecraft mc = Minecraft.getInstance(); LocalPlayer player = mc.player; - if (activePackageTarget == null) - return; boolean isPostbox = AllItemTags.POSTBOXES.matches(player.getMainHandItem()); - if (!AllBlocks.PACKAGE_FROGPORT.isIn(player.getMainHandItem()) && !isPostbox) - return; + boolean isWrench = AllItemTags.WRENCH.matches(player.getMainHandItem()); + + if (!isWrench) { + if (activePackageTarget == null) + return; + if (!AllBlocks.PACKAGE_FROGPORT.isIn(player.getMainHandItem()) && !isPostbox) + return; + } HitResult objectMouseOver = mc.hitResult; - if (!(objectMouseOver instanceof BlockHitResult)) + if (!(objectMouseOver instanceof BlockHitResult blockRayTraceResult)) return; + if (isWrench) { + if (blockRayTraceResult.getType() == Type.MISS) + return; + BlockPos pos = blockRayTraceResult.getBlockPos(); + if (!(mc.level.getBlockEntity(pos) instanceof PackagePortBlockEntity ppbe)) + return; + if (ppbe.target == null) + return; + Vec3 source = Vec3.atBottomCenterOf(pos); + Vec3 target = ppbe.target.getExactTargetLocation(ppbe, mc.level, pos); + if (target == Vec3.ZERO) + return; + Color color = new Color(0x9ede73); + animateConnection(mc, source, target, color); + CatnipClient.OUTLINER.chaseAABB("ChainPointSelected", new AABB(target, target)) + .colored(color) + .lineWidth(1 / 5f) + .disableLineNormals(); + return; + } + Vec3 target = exactPositionOfTarget; - - BlockHitResult blockRayTraceResult = (BlockHitResult) objectMouseOver; if (blockRayTraceResult.getType() == Type.MISS) { CatnipClient.OUTLINER.chaseAABB("ChainPointSelected", new AABB(target, target)) .colored(0x9ede73) @@ -123,6 +146,11 @@ public class PackagePortTargetSelectionHandler { .lineWidth(1 / 16f) .disableLineNormals(); + animateConnection(mc, source, target, color); + + } + + public static void animateConnection(Minecraft mc, Vec3 source, Vec3 target, Color color) { DustParticleOptions data = new DustParticleOptions(color.asVectorF(), 1); ClientLevel world = mc.level; double totalFlyingTicks = 10; diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportSounds.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportSounds.java index 36e87ee5c5..f7518a69eb 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportSounds.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportSounds.java @@ -1,9 +1,6 @@ package com.simibubi.create.content.logistics.packagePort.frogport; -import java.util.List; - import com.simibubi.create.AllSoundEvents; -import com.simibubi.create.AllSoundEvents.SoundEntry; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; @@ -12,9 +9,6 @@ import net.minecraft.world.phys.Vec3; public class FrogportSounds { - private static final List CATCH_SOUNDS = List.of(AllSoundEvents.FROGPORT_CATCH_1, - AllSoundEvents.FROGPORT_CATCH_2, AllSoundEvents.FROGPORT_CATCH_3, AllSoundEvents.FROGPORT_CATCH_4); - public void open(Level level, BlockPos pos) { AllSoundEvents.FROGPORT_OPEN.playAt(level, Vec3.atCenterOf(pos), 0.125f, 1, false); } @@ -29,8 +23,7 @@ public class FrogportSounds { public void catchPackage(Level level, BlockPos pos) { if (!isPlayerNear(pos)) return; - CATCH_SOUNDS.get(level.random.nextInt(CATCH_SOUNDS.size())) - .playAt(level, Vec3.atCenterOf(pos), 1, 1, false); + AllSoundEvents.FROGPORT_CATCH.playAt(level, Vec3.atCenterOf(pos), 1, 1, false); } public void depositPackage(Level level, BlockPos pos) { diff --git a/src/main/java/com/simibubi/create/content/trains/graph/TrackGraph.java b/src/main/java/com/simibubi/create/content/trains/graph/TrackGraph.java index 0645d6ed1b..5b076be123 100644 --- a/src/main/java/com/simibubi/create/content/trains/graph/TrackGraph.java +++ b/src/main/java/com/simibubi/create/content/trains/graph/TrackGraph.java @@ -415,6 +415,10 @@ public class TrackGraph { if (edge == otherEdge) continue; + if (otherEdge.isInterDimensional() || edge.isInterDimensional()) + continue; + if (node1.location.dimension != otherNode1.location.dimension) + continue; if (!bezier && !otherEdge.isTurn()) continue; if (otherEdge.isTurn() && otherEdge.turn.isPrimary()) diff --git a/src/main/resources/assets/create/sounds/frogport_catch_4.ogg b/src/main/resources/assets/create/sounds/frogport_catch.ogg similarity index 100% rename from src/main/resources/assets/create/sounds/frogport_catch_4.ogg rename to src/main/resources/assets/create/sounds/frogport_catch.ogg From 8c7f7a5a23981610ab8c576c98fceac47df313c7 Mon Sep 17 00:00:00 2001 From: Kryppers <65094918+Kryppers@users.noreply.github.com> Date: Wed, 8 Jan 2025 20:09:12 +0000 Subject: [PATCH 274/515] rare pull updated sheet textures and further additions to the rare package pool. --- .../create/textures/item/brass_sheet.png | Bin 180 -> 337 bytes .../create/textures/item/copper_sheet.png | Bin 448 -> 406 bytes .../create/textures/item/golden_sheet.png | Bin 183 -> 360 bytes .../create/textures/item/iron_sheet.png | Bin 172 -> 315 bytes .../create/textures/item/lapis_sheet.png | Bin 184 -> 416 bytes .../textures/item/package/rare_darcy.png | Bin 0 -> 1100 bytes .../textures/item/package/rare_kryppers.png | Bin 1101 -> 6990 bytes .../textures/item/package/rare_starlotte.png | Bin 0 -> 1029 bytes .../create/textures/item/package/rare_up.png | Bin 0 -> 981 bytes .../textures/item/package/rare_vector.png | Bin 0 -> 1167 bytes .../create/textures/item/sturdy_sheet.png | Bin 190 -> 424 bytes .../item/unprocessed_obsidian_sheet.png | Bin 204 -> 493 bytes 12 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/main/resources/assets/create/textures/item/package/rare_darcy.png create mode 100644 src/main/resources/assets/create/textures/item/package/rare_starlotte.png create mode 100644 src/main/resources/assets/create/textures/item/package/rare_up.png create mode 100644 src/main/resources/assets/create/textures/item/package/rare_vector.png diff --git a/src/main/resources/assets/create/textures/item/brass_sheet.png b/src/main/resources/assets/create/textures/item/brass_sheet.png index 65aa6c5697557daddaba1f3b464f981ab225ed0a..17416e41e6ffce2e53145e376645b6a94b5e7a8b 100644 GIT binary patch delta 322 zcmdnOc#&y>L_G%^0|SHn=l_X7iY>|8-G#v%1dDHXeg=wg7I;J!Gca%qgD@k*tT_@u zLG}_)Usv{*j2t`+(rqReZGl4fJY5_^EKVmUNc>AkoAUPm%)o8`3r}u-aQVc60|zFA zEIA9L4itPp+x|axx1RB$)yXPL1SLblWmD@N%v%KKyNOlGvH?MxJ^%U#CM|-?EOYC` znGY}DEFrZ)a?-3l?TH7ETKDh(fe(l{zTPf<$EHR7jg99eT!lA*bnp1_W~Uwx=P#}Q z57~5fRJ3p0{@%vX`Jc_6LmRTsI=5BUhHqp~YT9?||05-5wz(ZjJIW`R+EspOwSM^H z>T@0g?~TWpHYwKY=^t4sm~L{2hx2R5(bW?bJT8R)bP0l+XkK2?c?) delta 164 zcmcb}w1shkL_G^L0|Ud`yN`l^lw5#Mh%1o(|L^PnpU3~dp7Q%l#^r^fTPr+gM%k9R z=_cr_h#a%o4OGEc666=m;PC858j$1S>EaktaVuFtY>Ie;=C>koeuM2tjvQIacp}`$ ztc;Dbkc}zw*fL=WiDg`x(krJjOU~)@dO6kDan>1C|4jDt|WsHvl(t+lli4000SaNLh0L01FcU01FcV0GgZ_00007bV*G` z2k8L_3;+#s;ACt700AROL_t(I%f*wwO2beThrdX>RdC571d>1kl~k9MK0%?-RRp&> zIOYY4@8ICtArDY+u|r1(HF0{O=U1sTV9>4$fNraSA4UYrHQsEo6C&*r_s%Z?h^H?Ag^+{1xZ7$V zPHX^V#R9<8Rg7Adv*RNiTN8T$o0yN?(hzAoyCEMEEZ1~Tjf}XcoQwlgR{gBa z#1A8eevCI;q;8tZX5f9S=qVOPlEDunOkHI@c99hecXYq=5;GIW*2L}g6;F>38CRo8 zP`-_ht%-i8nbvC5sto;j??bBO7m|ab-)TYu`BgZ!Cf;r?M85AoI>1Hc22Dt|x#I{+}RSJ~?T000SaNLh0L01FcU01FcV0GgZ_00007bV*G` z2j~nG0T3FRDxaDF00B)&L_t(I%e|8^Yr;SnhM$PpvUV(3ApuJj3PJ}5>Ch=s=np7# zaP8_(=+L!m2Eo6eP;n544AL%EAz;7?89GGjkb;30(xrD*bAOgXq2G47d!O%p@4LVs zOWU>KoF6B0v5KkpJmuN!E}>mAna<__SS1q&5*0+-7GK#H0EEE=fXsLZSqST6CLAh-v6dXY&*!Bf6W0F6}P5O$ihbE1v_9 zkn8e6qI4i2VSg}5IRWs)h|X}Fj!>!AFb!RHS$EHM&(lOUE1#2bUO#?* z${Uwh?|E9w{f78qL=f%nuAD-n?`b#p55NAIvZ{|?9T^k;qdoy90h%9PIKWH*0000< KMNUMnLSTY=G_X|8-G#v%1dDHXeg=wg7I;J!Gca%qgD@k*tT_@u zLG}_)Usv{*j2t`+67seU?LeWgo-U3d7N?UFBv@SNMy!N>ZwmZ3Z++6)evRQqQ(cl@z!ysaP5Jb^c{ z>7?Pt^n@G74&*d;Ej&=YNd9n1{JQ@I%=7mBIr$-LvcxjQdjEtS9i3MvH#XjEdU)@x ze22rCJAZm7Ha0%27igAfo^fBht=>L;!Hp9~UU8=X-#7E$_skamO3%Ljf4X$g9$Mr=KtXFOlX~#UFmT o_Obl843~1wGyOMAc=Z?mdKI;Vst0D0VF!$qHfxCJryJaR^+!c=6SvI}A^>X7AXs zBZ5KF^O)YbV_LjCGKq(d9rMZ*mXL@No;u}HTGJO6h27JcGbe1D=^!P~z_3n^?~Swg RL200w44$rjF6*2UngHi3Lizvz diff --git a/src/main/resources/assets/create/textures/item/iron_sheet.png b/src/main/resources/assets/create/textures/item/iron_sheet.png index a9518fc5ec653bb613324ac32538a6a0eb9ad817..2afaa988f0ef6987ade4bc99f299c7f882e1cc5c 100644 GIT binary patch delta 300 zcmZ3(xSMH$L_G%^0|SHn=l_X7iY>|8-G#v%1dDHXeg=wg7I;J!Gca%qgD@k*tT_@u zLG}_)Usv{*j2t`+viad996+HHo-U3d7N_4%+Q{2%AmAD=(*Hm2cp zq;we0ICZzgY-p4`STxI_faAil6QS|n{w}YtPd~grFPyh>-f!3Kxw~JBhpVmq`t4M` z(~*gqo|6^_FuLeGTb5~XY);?i#&r{{9b}GAE#_M)^4Vs-)07~K=K@Y4hYf6+WJ_Y* zr={*z2^3)rnD(^F%=dD2OSsJXt#OLpqOOfogtB!V7Bs8oDISw}wd>wd`QwFGYwzDL wJHNw$L3Pbm56%6v^z4IXE&F%oOY~Qkg|e~XYdtkufWBhzboFyt=akR{0NrSG!vFvP delta 156 zcmdnZw1#nlL_G^L0|Ud`yN`l^lth3}h%1o(|NsAu8#h+0SW#3|6c-m45fNc(YPz>d z!44?LSQ6wH%;50sMjDXg8Wrj4x6cUjJ0K;>up*kPRp^KH4xn)ip00i_>zopr E0Q`|LcmMzZ diff --git a/src/main/resources/assets/create/textures/item/lapis_sheet.png b/src/main/resources/assets/create/textures/item/lapis_sheet.png index c6e8ff24fda3086fbbcbd53c5f14e5e8ea0bf08f..388cb3c0a3a4df04036102f6fafd8f0d2e16d97c 100644 GIT binary patch delta 402 zcmV;D0d4-c0iXkr7=H)`0000V^Z#K0000JJOGiWiHvl&PH*?#G^8f$<32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rk0SF8L6c&rjtN;K3ElET{R5;7+lQB!fa1h0RscDd4 zp@{eo6bGTiI7mUspwYqaP!RkEQUpIi(Ym;bbaxO3$>boo>wi*_;-E-LQ?W|}qLnrd zZ6GeDQj6^_-gF%Ay?b}Z!GB1j0O{53Fv^{)qXE1;inO+90U$Ji4dG7_={J&Pq;Q%6 z0A9lbz%o)CoSyYL83WMGYec`V-YNhnY9eYn wc*aO%7-{Gkqj7?d7K)nS>Hbps8Q2+n{ delta 168 zcmZ3$yn}IqL_G^L0|Ud`yN`l^lw5#Mh%1mjdGh3(X@@J?_9y18aF6RV@oiMG$yGBA zQP6gm=707TsDiO1$S;_|;n|HeAjiYg#WAGfR$nH*eUJ_!jKp&~xIvrjT8PBHeLZz;THFSEx(R))w=ycu7+ SvhM&5W$<+Mb6Mw<&;$V7I5~j; diff --git a/src/main/resources/assets/create/textures/item/package/rare_darcy.png b/src/main/resources/assets/create/textures/item/package/rare_darcy.png new file mode 100644 index 0000000000000000000000000000000000000000..30ee855168afe04150ac6828cc84fa61bc9f408e GIT binary patch literal 1100 zcmV-S1he~zP)J+cFONl9rA+U9@4*=lR>#>)NY#-)E zq9`(Kn?lnx*fxdd7;Mk2d(2*`R1tJElk~9Bw~Jg`l4C*1W^(`lr&dQ#Pfu)L5XIIt z(7UaKqsJy85Zjp5Oq`1uzCLI@6xsW4ys#r6t?0vCZ=tw~t5 zdJK9|5Lz?gACDiSyC>i1#A%W5^X4SgYm0O(~k5KTdbSEa>A=dh%CSkgQ^ z`u;Str}04i<>BYHL?B6)v^o}7JnTqmFWaV26q&J{km~}V0RSXXKtA6cV$4(r?yP+b zQZHfaNY!04ji6*B^wgeWq3T4*0p+I@pKhy`Q7p>=4Is zS|U&!$g=|8(ARMC@_dNx8my={&*x%nm?RE;1#O0d)|%(>nJ~z9rmnYS!^GB;WwsW(Ro%wy>}(s@fu!htWKu`6jecfB2=JnBYTAki?%#eGo)HZT$Hxz(^1vH+ z0RYTQ&EdTdc7|R){>l58nVM@0rHyn!CK~Pi+Yhnt$Q~B?z3F)@8&+EmIF!Pn6t3$s z9bEoC*MZ~X2e52dn3U>CKB1>)oo-oc&%^aP+(}6WTaD`9lZ(5AqMj+Z>uK S97ZYt0000`^q!J&bL}EY>V3*|!v>M@osZWy@BC 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 TZ1@(~@em^eQ~iA1W1;^8x~Fn( delta 1056 zcmV+*1mFA4Hq8i-BM<-vVoOIv0P+B`0GWiox!jXG7ao7;3mFj%3O$B(9smFX+DSw~ zR9M5+mrrOMWf;bP*_oZ$?e1*0v&|wTMdGEgMQ@6Pf+r8Pq9?tGmm=yxd$AHkuq~nz z&>l1gQSep-EuK_7=)p@7B!?;~6|I3Jt*|kh{rBzs+i5*)zDZ{Go84^8|x;=ae3hB^Ar0~fG!W}^*Xj~RkWBP9rf0MNZVMhccHix4rO48`6RfW_S^V@ewXF^Ss{D^Df5cjlY+>P^ zBiz_nXL{x^q1VCPzM*Vkgn)d=yUmAqXLFXNb0>eOR*F@ zIUL8OR;%GSE}_>UXBq$my)eo*8cp^V8gW24J}W^?BvF#{pQszRp^y zpI>ja5ssea@Odc%vbv!kT?{#TxZL-~{v-bOM{Z?%^m^*rOBoY#VG=!8bm_L4;UKpZl z8itYOVA;kh<^h}h-2Ld9MlTF$HJc+_kR+kxK(Yl92^T*2dVr<9*3AJjCRscxG_!vg zyDt@iYNg0)7cTMf+fVSq8<#M$8h#L_uBta=KA($RPBV+R-ZlVPU87u{j5(}QT> zhK-g(;edhY`l)L&KL7G7W~${qnePBtR-m#`Yp9*@!mCeV7$!@vKQk0ol@ZNU%MpR^ zY93fTeGh3!f*hAy=7M4{4;Mjv|RjA^v&zA4%Q!O*f-R{H*|IxQ$+Dv#SPWZo! azX9u!Q=$0ZSOWk6002ovPDBK*LSTYm1qrVJ diff --git a/src/main/resources/assets/create/textures/item/package/rare_starlotte.png b/src/main/resources/assets/create/textures/item/package/rare_starlotte.png new file mode 100644 index 0000000000000000000000000000000000000000..34835b93ba5d880e157b2ea683bb0e51769223a4 GIT binary patch literal 1029 zcmV+g1p51lP)Z50I00=7{)+$r02y>e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00V7FL_t(o!_}A1ZroH9#(x=m z#&$bZCl-W6$&hqWrIfN_MbuPc-vt{a6qQAnyZ~E-cmy7S1*nw}NGy>mHR~)W5KuvC z=p+bDi04l-V_)01VKKSR*yC$wnjpm4*mHdCbIy0Z^W8h}AKQ$&`SIZ=$BtvC9zJf~ z0pL#Samw%e0dKwk>C8nWV5%F>^Kf04APBH+o1OYHf$t-P;1}aH77m_bSr$SF27|$c zAyAosWM)*@vnz{Zr>)B64NlK)vC-kT&~m|z{R=o2Bu*UOG&@iD{VoR zgo*>%7EFxcI7{RHpA-Hpi_6Tg>Z$h%5g515-e~jr>)AGzWocPFF0YPbCn{%Hbpp`= zplTX48dp<_S(-o|GI=CY_TcO9Sek2$dAcpq>y*&4?eZ+ERRSFcJa43ZgTa6(l0=c0T$R5Jfr?@9 zLdppQvX$p5VfIX@Gk2_lTm-7s+{%^ZBB0KMLWtz-r@QKqP#nmsULi9z38$G3EeBNf zC)c1z2XukTbl}`mpbIpOE}VM`@{l-7<#`-9>m*#55bd_R87VGat4%-!RF&%vlUe)h z%dMCCt5zvfx9t91b|yU6Uf_9?$~TP?{x9tx#Q(cp#%r=r00000NkvXXu0mjf2yxm> literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/item/package/rare_up.png b/src/main/resources/assets/create/textures/item/package/rare_up.png new file mode 100644 index 0000000000000000000000000000000000000000..032272266be2c64c7e2e1a269ed33bc9b6af08ed GIT binary patch literal 981 zcmV;`11kK9P)Px&bxA})R9J=GS6gcnK@|R)-R$gYQ`2ax=>^G)NEc6G6&-w#I z#9!dMZxvds7leWZFDNXV3ZO z%sFQ!z&}O{8@!#l^-EFYSRYZUozA&~+WMEZfpB3=l$GvQnw+ zhi?Et!mDU$X)H`kCil%r7(}n)aPLXzdKG5zt4n{dBL`WQU~Yco8rtg?`XaFX^#i6R z@A*EOn!JZ{{&S#FMUg?Nj(k23N_A-3j!QcAPNF^n0I>RL1D0v}bO3yMFC>Wo0IF5P zB^d0erIFd=>=8bDGj0SVY`1;ieq*84tm&>7!yesrN z_D0Z-z)p#B4e~-BG#3EqF26**#28#!RaH@|S*X=i0I=)5QmMG~VPGqE<^mzjD0p+i zCXhScjksl$p?csu=FscdGEInr;G6I3gskJ0NCne@ciYv)7(4HG}pl3Y6+l6xq(BFi9Ob#IFqwg35^D!Q)x0NJ`_@d@md zC|2Js*{e8nz6(W71&~2eQ}Jc>ePdoxL$)`^HBRIheI%KL9+U&8`ugl~QB$#5XzbNy zK|?m%h(&Rv9Q)uRaj$O;MI?n^fTUMK84n0CnK{_;9uGEs*hwZf|IqFQT) zSxPpxqFS>cB?So50VK@kfyV8Gi*qX&8a)d_2<}h6#8E}Ee+PBK&4LC(44>XGykiQ( zXhzW2h^8Md*yHCn#y$ZOE44xQ@Q zEmv&meAxTYR?IFE>`-E-*M&>{Se#qI_}Boq3hqq3+0$RO$UC9){2sYH7&><^h`bZ> z?uh>tegoBh!YwrRlkETi01jnXNoGw=04e|g00;m8000000Mb*F00000NkvXXu0mjf Dce=l* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/item/package/rare_vector.png b/src/main/resources/assets/create/textures/item/package/rare_vector.png new file mode 100644 index 0000000000000000000000000000000000000000..8425617ae64719066f1f5713428199c77cca1010 GIT binary patch literal 1167 zcmV;A1aSL_P);k!Yz1XwL${1FgyNqe;-9f0rP>CqL_{YPoY3OH31gJ8;BWq5#~^L8v`uz*xx2X^ z()W6~yq88d5q#h!m-l_%d!Og~eBbAJ4*p{q5D)j4KKUz|OaO3tVG<*gWhwtHH`b4` zxH9Db2QW>G6PG?6co7Du;-OZnkxr+vEDIx(rMg++^unaCm>*liG%ak~rrB)1Fa%;< zkPHkkpDS`@>JdgJ3&54BM_e4d_pgLNjav91b)Q16jBVTKx{htP=M`1HB^W}0mtHx> z!}UKI9(fhdZeTrr=&uDs*oDCCooh^&&fvN3-|{4xOkkQ8l}ZKEwD9Z(2|W&g<9hyl zy}m`z&@OkXn-%E+7jB*dpfvqsq!BZ#m#J=6Ffv*4V{2R;ZQ|LD4xKQ9G1-em?86&^ z^I^HPe7?i@*<)>@+O0N{@wna}2X0=t)!t~!jdC1E`l6uc1>+Vl3V zU~9)DorayAZ4Mkb*s(!X6y|e902+<9ZdiUU+{QF5c6PRbgI()UB6+a5 zGQ@IbobNyU4b!qC5t4@B?UN^QJr7k;h{rV!r_#HJXZd{cOH@U{^*pw>kaFP0`cal2 zjCb4yK|;ZS$Pfgf`l^0{#nMoRXYYUauAi3A4*ViTpkS1_IB^eM*MZmCegfdGM0dSXk2XM2Rg6rQZyIm%sH6Ql(;=eMp`f+592#Rg(K^s%#IpeA4_0EKz>rybvFxKY6BIhwO zZSnDGZL!Y1#k)002ovPDHLkV1gPe9^e1~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/item/sturdy_sheet.png b/src/main/resources/assets/create/textures/item/sturdy_sheet.png index ab18e7ea5b3927eca2018398ce0b6bf53c635715..bdb6d917a11206d4cb230c951caa08d6c83fa036 100644 GIT binary patch delta 410 zcmV;L0cHNa0jL9z7=H)`0000V^Z#K0000JJOGiWiHvl&PH*?#G^8f$<32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rk0SF8L5oX~yBLDyaHAzH4R5;7sk}*reKp2LfSUXvX z4i2Rxp;8b8M}vVBN++R<;Na$u5F7=iW1+uAkb;AogWxI_i+@6Bf^9*NUK&BH?KveR zlIY~(2RGc^_dMLackutKSgOcksUoxX7k>f)HaE5a@O>fQCNIkOJ|zpZ%xYp?h%w#X z9mD4*CG`YxP}j-;xSj*R&FwV@`-fqxj7xGMe0+3*oJn-8jBXeRAyCy-gg-_r8C+gn zP_OMG=X2gaK7UVx$?F-wLTKuA&av$puIJEdH_;6PAUcg@R&hNCRb9c**2(1yG7|W{ zNJuQRN~_(B?x}0#XvF&yAucVi$(?N*fJS2vx8F~M=z0zhy>2w`J>D~$21+8)G)Wo= zFq;NS>NCbA!_goU%=`y&$#68t1b?kuz97S-|FpgUJ`)IuNL|UJR{#J207*qoM6N<$ Eg2_y$OaK4? delta 174 zcmZ3%ypM5$L_G^L0|Ud`yN`l^lw5#Mh%1op>s?ro*Ax_(=V)u~%Jd3e@#dMPEU8#i`YUh=t|*0gnd<4*-egI-RC Y$GiDUbIO<10*z+yboFyt=akR{0Ly+mwg3PC diff --git a/src/main/resources/assets/create/textures/item/unprocessed_obsidian_sheet.png b/src/main/resources/assets/create/textures/item/unprocessed_obsidian_sheet.png index ca0a1667d2880293cbab2aac86d690fa08e473de..5ac778b3349d1a95ceca9e09a86674ae8637951a 100644 GIT binary patch delta 479 zcmV<50U-X&0qp~j7=H)`0000V^Z#K0000JJOGiWiHvl&PH*?#G^8f$<32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rk0SF8L51j4=KmY&%dPzhbz#ibWQ$ z_ej6XWaS}tV}CE7L@k7==UK0hI9xa!9334HkI$1nmsy_eV?|Q{rG=-INxZ;uIe^Q3 zFB-L~)YAkj6$=3CaFdnoQ6w#d$doYkJR(y9AYtbm+#e3g<|FvP)bpg2Nd`mHFbu|7 zfi3RvYksbGuITs+N^if=$NYHb)-Z}i2hk`MNZ2`|Cs+>vG-_3;Z4R>X5PZ#|InbpC zF92zu+!A)ofzsPACdQ{)Pg?NV>_02q++I3v?i!@#A!YNiqwv>qxjn+=_J}`Uv=8vL VoR1nE=`sKS002ovPDHLkV1ft{!|?zB delta 188 zcmaFMe1>s?L_G^L0|Ud`yN`l^lvaRGh%1nOaw+C Date: Thu, 9 Jan 2025 05:04:53 -0500 Subject: [PATCH 275/515] some cleanup - split BlockLookup to api/impl - reset BlockLookup on tag update - register types with registrate --- .../create/AllMountedStorageTypes.java | 44 +++++--- .../storage/MountedStorageTypeRegistry.java | 10 +- .../MountedItemStorageTypeBuilder.java | 36 ++++++ .../create/api/lookup/BlockLookup.java | 71 +++++------- .../foundation/data/CreateRegistrate.java | 8 ++ .../MountedStorageTypeRegistryImpl.java | 34 ++---- .../create/impl/lookup/BlockLookupImpl.java | 103 ++++++++++++++++++ 7 files changed, 220 insertions(+), 86 deletions(-) create mode 100644 src/main/java/com/simibubi/create/api/contraption/storage/item/registrate/MountedItemStorageTypeBuilder.java create mode 100644 src/main/java/com/simibubi/create/impl/lookup/BlockLookupImpl.java diff --git a/src/main/java/com/simibubi/create/AllMountedStorageTypes.java b/src/main/java/com/simibubi/create/AllMountedStorageTypes.java index 3530c25eda..b7c2873df7 100644 --- a/src/main/java/com/simibubi/create/AllMountedStorageTypes.java +++ b/src/main/java/com/simibubi/create/AllMountedStorageTypes.java @@ -1,6 +1,9 @@ package com.simibubi.create; -import com.simibubi.create.api.contraption.storage.MountedStorageTypeRegistry; +import static com.simibubi.create.Create.REGISTRATE; + +import java.util.function.Supplier; + import com.simibubi.create.api.contraption.storage.item.MountedItemStorageType; import com.simibubi.create.api.contraption.storage.item.chest.ChestMountedStorageType; import com.simibubi.create.content.contraptions.behaviour.dispenser.storage.DispenserMountedStorageType; @@ -12,22 +15,35 @@ import com.simibubi.create.api.contraption.storage.item.simple.SimpleMountedStor import com.simibubi.create.content.logistics.vault.ItemVaultMountedStorageType; import com.simibubi.create.impl.contraption.storage.FallbackMountedStorageType; -import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.RegistryObject; +import com.tterrag.registrate.util.entry.RegistryEntry; + +import net.minecraft.world.level.block.Blocks; public class AllMountedStorageTypes { - private static final DeferredRegister> REGISTER = DeferredRegister.create(MountedStorageTypeRegistry.ITEMS, Create.ID); + // fallback is special, provider is registered on lookup creation so it's always last + public static final RegistryEntry FALLBACK = simple("fallback", FallbackMountedStorageType::new); - public static final RegistryObject SIMPLE = REGISTER.register("simple", SimpleMountedStorageType.Impl::new); - public static final RegistryObject FALLBACK = REGISTER.register("fallback", FallbackMountedStorageType::new); - public static final RegistryObject CHEST = REGISTER.register("chest", ChestMountedStorageType::new); - public static final RegistryObject DISPENSER = REGISTER.register("dispenser", DispenserMountedStorageType::new); - public static final RegistryObject CREATIVE_CRATE = REGISTER.register("creative_crate", CreativeCrateMountedStorageType::new); - public static final RegistryObject VAULT = REGISTER.register("vault", ItemVaultMountedStorageType::new); - public static final RegistryObject TOOLBOX = REGISTER.register("toolbox", ToolboxMountedStorageType::new); + // registrations for these are handled by the blocks, not the types + public static final RegistryEntry CREATIVE_CRATE = simple("creative_crate", CreativeCrateMountedStorageType::new); + public static final RegistryEntry VAULT = simple("vault", ItemVaultMountedStorageType::new); + public static final RegistryEntry TOOLBOX = simple("toolbox", ToolboxMountedStorageType::new); - public static void register(IEventBus modEventBus) { - REGISTER.register(modEventBus); + // these are for external blocks, register associations here + public static final RegistryEntry SIMPLE = REGISTRATE.mountedItemStorage("simple", SimpleMountedStorageType.Impl::new) + .registerTo(AllTags.AllBlockTags.SIMPLE_MOUNTED_STORAGE.tag) + .register(); + public static final RegistryEntry CHEST = REGISTRATE.mountedItemStorage("chest", ChestMountedStorageType::new) + .registerTo(AllTags.AllBlockTags.CHEST_MOUNTED_STORAGE.tag) + .register(); + public static final RegistryEntry DISPENSER = REGISTRATE.mountedItemStorage("dispenser", DispenserMountedStorageType::new) + .registerTo(Blocks.DISPENSER) + .registerTo(Blocks.DROPPER) + .register(); + + private static > RegistryEntry simple(String name, Supplier supplier) { + return REGISTRATE.mountedItemStorage(name, supplier).register(); + } + + public static void register() { } } diff --git a/src/main/java/com/simibubi/create/api/contraption/storage/MountedStorageTypeRegistry.java b/src/main/java/com/simibubi/create/api/contraption/storage/MountedStorageTypeRegistry.java index aa22dfcd96..5d4ef86dea 100644 --- a/src/main/java/com/simibubi/create/api/contraption/storage/MountedStorageTypeRegistry.java +++ b/src/main/java/com/simibubi/create/api/contraption/storage/MountedStorageTypeRegistry.java @@ -7,10 +7,10 @@ import com.simibubi.create.api.lookup.BlockLookup; import com.simibubi.create.impl.contraption.storage.MountedStorageTypeRegistryImpl; import com.tterrag.registrate.builders.BlockBuilder; +import com.tterrag.registrate.util.entry.RegistryEntry; import com.tterrag.registrate.util.nullness.NonNullUnaryOperator; import net.minecraftforge.registries.IForgeRegistry; -import net.minecraftforge.registries.RegistryObject; import net.minecraft.core.Registry; import net.minecraft.resources.ResourceKey; @@ -21,7 +21,11 @@ public class MountedStorageTypeRegistry { Create.asResource("mounted_item_storage_type") ); - public static final BlockLookup> ITEM_LOOKUP = new BlockLookup<>(MountedStorageTypeRegistryImpl::itemFallback); + /** + * Lookup used for finding the item storage type associated with a block. + * @see BlockLookup + */ + public static final BlockLookup> ITEM_LOOKUP = MountedStorageTypeRegistryImpl.ITEM_LOOKUP; /** * @throws NullPointerException if called before registry registration @@ -34,7 +38,7 @@ public class MountedStorageTypeRegistry { * Utility for use with Registrate builders. Creates a builder transformer * that will register the given MountedItemStorageType to a block when ready. */ - public static NonNullUnaryOperator> mountedItemStorage(RegistryObject> type) { + public static NonNullUnaryOperator> mountedItemStorage(RegistryEntry> type) { return builder -> builder.onRegisterAfter(ITEMS, block -> ITEM_LOOKUP.register(block, type.get())); } } diff --git a/src/main/java/com/simibubi/create/api/contraption/storage/item/registrate/MountedItemStorageTypeBuilder.java b/src/main/java/com/simibubi/create/api/contraption/storage/item/registrate/MountedItemStorageTypeBuilder.java new file mode 100644 index 0000000000..0739a772c0 --- /dev/null +++ b/src/main/java/com/simibubi/create/api/contraption/storage/item/registrate/MountedItemStorageTypeBuilder.java @@ -0,0 +1,36 @@ +package com.simibubi.create.api.contraption.storage.item.registrate; + +import com.simibubi.create.api.contraption.storage.MountedStorageTypeRegistry; +import com.simibubi.create.api.contraption.storage.item.MountedItemStorageType; +import com.tterrag.registrate.AbstractRegistrate; +import com.tterrag.registrate.builders.AbstractBuilder; +import com.tterrag.registrate.builders.BuilderCallback; +import com.tterrag.registrate.util.nullness.NonnullType; + +import net.minecraft.tags.TagKey; +import net.minecraft.world.level.block.Block; + +public class MountedItemStorageTypeBuilder, P> extends AbstractBuilder, T, P, MountedItemStorageTypeBuilder> { + private final T type; + + public MountedItemStorageTypeBuilder(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, T type) { + super(owner, parent, name, callback, MountedStorageTypeRegistry.ITEMS); + this.type = type; + } + + public MountedItemStorageTypeBuilder registerTo(Block block) { + MountedStorageTypeRegistry.ITEM_LOOKUP.register(block, this.type); + return this; + } + + public MountedItemStorageTypeBuilder registerTo(TagKey tag) { + MountedStorageTypeRegistry.ITEM_LOOKUP.registerTag(tag, this.type); + return this; + } + + @Override + @NonnullType + protected T createEntry() { + return this.type; + } +} diff --git a/src/main/java/com/simibubi/create/api/lookup/BlockLookup.java b/src/main/java/com/simibubi/create/api/lookup/BlockLookup.java index f90b428d00..e82c0dcd36 100644 --- a/src/main/java/com/simibubi/create/api/lookup/BlockLookup.java +++ b/src/main/java/com/simibubi/create/api/lookup/BlockLookup.java @@ -1,14 +1,11 @@ package com.simibubi.create.api.lookup; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; +import com.simibubi.create.impl.lookup.BlockLookupImpl; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; +import net.minecraft.tags.TagKey; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; @@ -21,54 +18,44 @@ import net.minecraft.world.level.block.state.BlockState; * All providers are expected to be registered synchronously during game init. * Adding new ones late is not supported. */ -public class BlockLookup { - private final Map map; - private final Set blacklist; - private final List> providers; - - public BlockLookup(Provider defaultProvider) { - this.map = new HashMap<>(); - this.blacklist = new HashSet<>(); - this.providers = new ArrayList<>(); - this.registerProvider(defaultProvider); - } - +@ApiStatus.NonExtendable +public interface BlockLookup { @Nullable - public T find(BlockState state) { - return this.find(state.getBlock()); - } + T find(Block block); + /** + * Shortcut to avoid calling getBlock() on a BlockState. + */ @Nullable - public T find(Block block) { - if (this.blacklist.contains(block)) - return null; + T find(BlockState state); - return this.map.computeIfAbsent(block, $ -> { - for (Provider provider : this.providers) { - T value = provider.get(block); - if (value != null) { - return value; - } - } + /** + * Register a value to one block. + */ + void register(Block block, T value); - this.blacklist.add(block); - return null; - }); - } - - public void register(Block block, T type) { - this.map.put(block, type); - } + /** + * Register a value to all entries of a tag. + */ + void registerTag(TagKey tag, T value); /** * Register a new provider that will be queried. * Providers are queried in reverse-registration order. */ - public void registerProvider(Provider provider) { - this.providers.add(0, provider); + void registerProvider(Provider provider); + + static BlockLookup create() { + return new BlockLookupImpl<>(); } - public interface Provider { + static BlockLookup create(Provider initialProvider) { + BlockLookup lookup = new BlockLookupImpl<>(); + lookup.registerProvider(initialProvider); + return lookup; + } + + interface Provider { @Nullable T get(Block block); } diff --git a/src/main/java/com/simibubi/create/foundation/data/CreateRegistrate.java b/src/main/java/com/simibubi/create/foundation/data/CreateRegistrate.java index bc0228f4d4..3f7dc3aa66 100644 --- a/src/main/java/com/simibubi/create/foundation/data/CreateRegistrate.java +++ b/src/main/java/com/simibubi/create/foundation/data/CreateRegistrate.java @@ -10,6 +10,10 @@ import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Supplier; +import com.simibubi.create.api.contraption.storage.item.MountedItemStorageType; + +import com.simibubi.create.api.contraption.storage.item.registrate.MountedItemStorageTypeBuilder; + import org.jetbrains.annotations.Nullable; import com.simibubi.create.CreateClient; @@ -140,6 +144,10 @@ public class CreateRegistrate extends AbstractRegistrate { }); } + public > MountedItemStorageTypeBuilder mountedItemStorage(String name, Supplier supplier) { + return this.entry(name, callback -> new MountedItemStorageTypeBuilder<>(this, this, name, callback, supplier.get())); + } + /* Palettes */ public BlockBuilder paletteStoneBlock(String name, diff --git a/src/main/java/com/simibubi/create/impl/contraption/storage/MountedStorageTypeRegistryImpl.java b/src/main/java/com/simibubi/create/impl/contraption/storage/MountedStorageTypeRegistryImpl.java index 66030958e1..9a692f40cb 100644 --- a/src/main/java/com/simibubi/create/impl/contraption/storage/MountedStorageTypeRegistryImpl.java +++ b/src/main/java/com/simibubi/create/impl/contraption/storage/MountedStorageTypeRegistryImpl.java @@ -7,19 +7,19 @@ import com.simibubi.create.AllTags; import com.simibubi.create.api.contraption.storage.MountedStorageTypeRegistry; import com.simibubi.create.api.contraption.storage.item.MountedItemStorageType; -import net.minecraftforge.eventbus.api.EventPriority; +import com.simibubi.create.api.lookup.BlockLookup; + import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.registries.IForgeRegistry; import net.minecraftforge.registries.NewRegistryEvent; -import net.minecraftforge.registries.RegisterEvent; import net.minecraftforge.registries.RegistryBuilder; -import net.minecraftforge.registries.RegistryObject; import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) public class MountedStorageTypeRegistryImpl { + public static final BlockLookup> ITEM_LOOKUP = BlockLookup.create(MountedStorageTypeRegistryImpl::itemFallback); + private static IForgeRegistry> itemsRegistry; public static IForgeRegistry> getItemsRegistry() { @@ -35,29 +35,9 @@ public class MountedStorageTypeRegistryImpl { ); } - // low priority: want to run after the registration actually happens - @SubscribeEvent(priority = EventPriority.LOW) - public static void registerDefaults(RegisterEvent event) { - if (event.getRegistryKey() != MountedStorageTypeRegistry.ITEMS) - return; - - register(Blocks.DISPENSER, AllMountedStorageTypes.DISPENSER); - register(Blocks.DROPPER, AllMountedStorageTypes.DISPENSER); - } - - private static void register(Block block, RegistryObject> type) { - MountedStorageTypeRegistry.ITEM_LOOKUP.register(block, type.get()); - } - public static MountedItemStorageType itemFallback(Block block) { - if (AllTags.AllBlockTags.CHEST_MOUNTED_STORAGE.matches(block)) { - return AllMountedStorageTypes.CHEST.get(); - }if (AllTags.AllBlockTags.SIMPLE_MOUNTED_STORAGE.matches(block)) { - return AllMountedStorageTypes.SIMPLE.get(); - } else if (!AllTags.AllBlockTags.FALLBACK_MOUNTED_STORAGE_BLACKLIST.matches(block)) { - return AllMountedStorageTypes.FALLBACK.get(); - } else { - return null; - } + return AllTags.AllBlockTags.FALLBACK_MOUNTED_STORAGE_BLACKLIST.matches(block) + ? null + : AllMountedStorageTypes.FALLBACK.get(); } } diff --git a/src/main/java/com/simibubi/create/impl/lookup/BlockLookupImpl.java b/src/main/java/com/simibubi/create/impl/lookup/BlockLookupImpl.java new file mode 100644 index 0000000000..a5406d9a9a --- /dev/null +++ b/src/main/java/com/simibubi/create/impl/lookup/BlockLookupImpl.java @@ -0,0 +1,103 @@ +package com.simibubi.create.impl.lookup; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.IdentityHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import com.simibubi.create.api.lookup.BlockLookup; + +import net.minecraftforge.event.TagsUpdatedEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; + +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.Nullable; + +import net.minecraft.tags.TagKey; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; + +@ApiStatus.Internal +@Mod.EventBusSubscriber +public class BlockLookupImpl implements BlockLookup { + private static final List> allLookups = new ArrayList<>(); + + private final Map map; + private final Map providedValues; + private final Set providedNull; + private final List> providers; + + public BlockLookupImpl() { + this.map = new IdentityHashMap<>(); + this.providedValues = new IdentityHashMap<>(); + this.providedNull = new HashSet<>(); + this.providers = new ArrayList<>(); + allLookups.add(this); + } + + @Nullable + @Override + public T find(BlockState state) { + return this.find(state.getBlock()); + } + + @Nullable + @Override + public T find(Block block) { + T registered = this.map.get(block); + if (registered != null) + return registered; + + if (this.providedNull.contains(block)) + return null; + + return this.providedValues.computeIfAbsent(block, $ -> { + for (Provider provider : this.providers) { + T value = provider.get(block); + if (value != null) { + return value; + } + } + + this.providedNull.add(block); + return null; + }); + } + + @Override + public void register(Block block, T value) { + this.map.put(block, value); + } + + @Override + public void registerTag(TagKey tag, T value) { + this.registerProvider(new TagProvider<>(tag, value)); + } + + @Override + public void registerProvider(Provider provider) { + this.providers.add(0, provider); + } + + @SubscribeEvent + public static void onTagsReloaded(TagsUpdatedEvent event) { + if (event.getUpdateCause() == TagsUpdatedEvent.UpdateCause.SERVER_DATA_LOAD) { + for (BlockLookupImpl lookup : allLookups) { + lookup.providedValues.clear(); + lookup.providedNull.clear(); + } + } + } + + private record TagProvider(TagKey tag, T value) implements Provider { + @Override + @Nullable + @SuppressWarnings("deprecation") + public T get(Block block) { + return block.builtInRegistryHolder().is(this.tag) ? this.value : null; + } + } +} From b451ccd9d9c14fc2b4d7a59fefa2d46d73a99ae7 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Thu, 9 Jan 2025 21:41:15 +0100 Subject: [PATCH 276/515] We like to ponder - Ponder scenes for: Pulse Timer, Chain Conveyor, Frogport --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 6 +- .../resources/assets/create/lang/en_ud.json | 10 +- .../resources/assets/create/lang/en_us.json | 10 +- .../ChainConveyorBlockEntity.java | 13 +- .../chainConveyor/ChainConveyorRenderer.java | 18 +- .../frogport/FrogportBlockEntity.java | 2 +- .../renderer/SmartBlockEntityRenderer.java | 2 + .../ponder/AllCreatePonderScenes.java | 9 + .../ponder/AllCreatePonderTags.java | 114 +-- .../ponder/scenes/FrogAndConveyorScenes.java | 935 ++++++++++++++++++ .../ponder/scenes/RedstoneScenes2.java | 351 +++++-- .../assets/create/ponder/chain_conveyor.nbt | Bin 0 -> 956 bytes .../assets/create/ponder/package_frogport.nbt | Bin 0 -> 2320 bytes .../assets/create/ponder/pulse_timer.nbt | Bin 0 -> 507 bytes 14 files changed, 1305 insertions(+), 165 deletions(-) create mode 100644 src/main/java/com/simibubi/create/infrastructure/ponder/scenes/FrogAndConveyorScenes.java create mode 100644 src/main/resources/assets/create/ponder/chain_conveyor.nbt create mode 100644 src/main/resources/assets/create/ponder/package_frogport.nbt create mode 100644 src/main/resources/assets/create/ponder/pulse_timer.nbt diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 1817b6197c..a464cf4561 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2025-01-08T09:46:32.7401287 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2025-01-08T12:42:08.2186069 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -642,8 +642,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -739f9cbd71716d56d1561002e8668261cddf5b0c assets/create/lang/en_ud.json -20c3b2a59090bf209090579c2f37db818a06a26b assets/create/lang/en_us.json +c1d7b1f496afa2f971078caf90f20255292d760b assets/create/lang/en_ud.json +ce3c58e8401db1c42f3e1187bec1343fbf15009e assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 1c783c293c..403ebcb5bc 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -2167,6 +2167,12 @@ "create.ponder.pulse_repeater.text_1": "ʎɐןǝp ɐ ɹǝʇɟɐ ǝsןnd ʇɹoɥs ɐ ʇıɯǝ sɹǝʇɐǝdǝᴚ ǝsןnԀ", "create.ponder.pulse_repeater.text_2": "pǝɹnbıɟuoɔ ǝq uɐɔ ǝɯıʇ ǝbɹɐɥɔ ǝɥʇ 'ןǝuɐd ǝnןɐʌ ǝɥʇ buıs∩", "create.ponder.pulse_repeater.text_3": "ɹnoɥ uɐ oʇ dn ǝbuɐɹ uɐɔ sʎɐןǝp pǝɹnbıɟuoƆ", + "create.ponder.pulse_timer.header": "ɹǝɯı⟘ ǝsןnԀ ǝɥʇ ɟo ʇndʇno ǝuoʇspǝᴚ", + "create.ponder.pulse_timer.text_1": "sǝsןnd ʇɹoɥs ʇıɯǝ ʎןpǝʇɐǝdǝɹ sɹǝɯı⟘ ǝsןnԀ", + "create.ponder.pulse_timer.text_2": "pǝɹnbıɟuoɔ ǝq uɐɔ ןɐʌɹǝʇuı ǝɯıʇ ǝɥʇ 'ןǝuɐd ǝnןɐʌ ǝɥʇ buıs∩", + "create.ponder.pulse_timer.text_3": "ɯǝɥʇ ʇǝsǝɹ puɐ ǝsnɐd ןןıʍ ǝpıs ʇnduı ǝɥʇ buıɹǝʍoԀ", + "create.ponder.pulse_timer.text_4": "ʇndʇno ǝɥʇ ʇɹǝʌuı oʇ ǝsɐq ʇınɔɹıɔ ǝɥʇ ʞɔıןɔ-ʇɥbıᴚ", + "create.ponder.pulse_timer.text_5": "ןɐubıs ǝuoʇspǝɹ ɐ ʇnoɥʇıʍ ʎןuo ǝʇɐʌıʇɔɐ ʇɐɥʇ sɯsıuɐɥɔǝɯ ɹǝbbıɹʇ sdןǝɥ sıɥ⟘", "create.ponder.radial_chassis.header": "sıssɐɥƆ ןɐıpɐᴚ buısn sʞɔoןq buıɥɔɐʇʇⱯ", "create.ponder.radial_chassis.text_1": "ʍoɹ ɐ uı sʞɔoןq sıssɐɥƆ ןɐɔıʇuǝpı oʇ ʇɔǝuuoɔ sıssɐɥƆ ןɐıpɐᴚ", "create.ponder.radial_chassis.text_2": "ʇı ɥʇıʍ pǝbbɐɹp ǝɹɐ sɹǝɥʇo ǝɥʇ 'uoıʇdɐɹʇuoƆ ɐ ʎq pǝʌoɯ sı ǝuo uǝɥM", @@ -2322,6 +2328,8 @@ "create.ponder.tag.display_targets.description": "ʞuıꞀ ʎɐןdsıᗡ ɐ ɯoɹɟ pǝʌıǝɔǝɹ ɐʇɐp ǝɥʇ ʎɐןdsıp puɐ ssǝɔoɹd uɐɔ ɥɔıɥʍ sʞɔoןᗺ ɹo sʇuǝuodɯoƆ", "create.ponder.tag.fluids": "sɹoʇɐןndıuɐW pınןℲ", "create.ponder.tag.fluids.description": "spınןℲ ɟo ǝsn buıʞɐɯ puɐ buıʎɐןǝɹ dןǝɥ ɥɔıɥʍ sʇuǝuodɯoƆ", + "create.ponder.tag.high_logistics": "sɔıʇsıboꞀ ɥbıH", + "create.ponder.tag.high_logistics.description": "ʎɹoʇɔɐɟ ɹnoʎ punoɹɐ sʇsǝnbǝɹ pǝʇɐɯoʇnɐ puɐ ǝbɐɹoʇs ɯǝʇı pǝʇnqıɹʇsıp buıbɐuɐɯ dןǝɥ ɥɔıɥʍ sʇuǝuodɯoƆ", "create.ponder.tag.kinetic_appliances": "sǝɔuɐıןddⱯ ɔıʇǝuıʞ", "create.ponder.tag.kinetic_appliances.description": "ǝɔɹoℲ ןɐuoıʇɐʇoᴚ ɟo ǝsn ǝʞɐɯ ɥɔıɥʍ sʇuǝuodɯoƆ", "create.ponder.tag.kinetic_relays": "sʞɔoןᗺ ɔıʇǝuıʞ", @@ -2332,8 +2340,6 @@ "create.ponder.tag.logistics.description": "punoɹɐ sɯǝʇı buıʌoɯ dןǝɥ ɥɔıɥʍ sʇuǝuodɯoƆ", "create.ponder.tag.movement_anchor": "sɹoɥɔuⱯ ʇuǝɯǝʌoW", "create.ponder.tag.movement_anchor.description": "sʎɐʍ ɟo ʎʇǝıɹɐʌ ɐ uı ǝɹnʇɔnɹʇs pǝɥɔɐʇʇɐ uɐ buıʇɐɯıuɐ 'suoıʇdɐɹʇuoɔ buıʌoɯ ɟo uoıʇɐǝɹɔ ǝɥʇ ʍoןןɐ ɥɔıɥʍ sʇuǝuodɯoƆ", - "create.ponder.tag.recently_updated": "sǝbuɐɥƆ ʇuǝɔǝᴚ", - "create.ponder.tag.recently_updated.description": "ǝʇɐǝɹƆ ɟo suoısɹǝʌ ʇsǝʇɐן ǝɥʇ uı ʎןʇuɐɔıɟıubıs pǝbuɐɥɔ ɹo pǝppɐ uǝǝq ǝʌɐɥ ʇɐɥʇ sʇuǝuodɯoƆ", "create.ponder.tag.redstone": "sʇuǝuodɯoƆ ɔıboꞀ", "create.ponder.tag.redstone.description": "buıɹǝǝuıbuǝ ǝuoʇspǝɹ ɥʇıʍ dןǝɥ ɥɔıɥʍ sʇuǝuodɯoƆ", "create.ponder.tag.threshold_switch_targets": "sǝɥɔʇıʍS pןoɥsǝɹɥ⟘ ɹoɟ sʇǝbɹɐ⟘", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 3f854462f5..af4a9663c2 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -2167,6 +2167,12 @@ "create.ponder.pulse_repeater.text_1": "Pulse Repeaters emit a short pulse after a delay", "create.ponder.pulse_repeater.text_2": "Using the value panel, the charge time can be configured", "create.ponder.pulse_repeater.text_3": "Configured delays can range up to an hour", + "create.ponder.pulse_timer.header": "Redstone output of the Pulse Timer", + "create.ponder.pulse_timer.text_1": "Pulse Timers repeatedly emit short pulses", + "create.ponder.pulse_timer.text_2": "Using the value panel, the time interval can be configured", + "create.ponder.pulse_timer.text_3": "Powering the input side will pause and reset them", + "create.ponder.pulse_timer.text_4": "Right-click the circuit base to invert the output", + "create.ponder.pulse_timer.text_5": "This helps trigger mechanisms that activate only without a redstone signal", "create.ponder.radial_chassis.header": "Attaching blocks using Radial Chassis", "create.ponder.radial_chassis.text_1": "Radial Chassis connect to identical Chassis blocks in a row", "create.ponder.radial_chassis.text_2": "When one is moved by a Contraption, the others are dragged with it", @@ -2322,6 +2328,8 @@ "create.ponder.tag.display_targets.description": "Components or Blocks which can process and display the data received from a Display Link", "create.ponder.tag.fluids": "Fluid Manipulators", "create.ponder.tag.fluids.description": "Components which help relaying and making use of Fluids", + "create.ponder.tag.high_logistics": "High Logistics", + "create.ponder.tag.high_logistics.description": "Components which help managing distributed item storage and automated requests around your factory", "create.ponder.tag.kinetic_appliances": "Kinetic Appliances", "create.ponder.tag.kinetic_appliances.description": "Components which make use of Rotational Force", "create.ponder.tag.kinetic_relays": "Kinetic Blocks", @@ -2332,8 +2340,6 @@ "create.ponder.tag.logistics.description": "Components which help moving items around", "create.ponder.tag.movement_anchor": "Movement Anchors", "create.ponder.tag.movement_anchor.description": "Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways", - "create.ponder.tag.recently_updated": "Recent Changes", - "create.ponder.tag.recently_updated.description": "Components that have been added or changed significantly in the latest versions of Create", "create.ponder.tag.redstone": "Logic Components", "create.ponder.tag.redstone.description": "Components which help with redstone engineering", "create.ponder.tag.threshold_switch_targets": "Targets for Threshold Switches", diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java index 6aedd39d2e..6d01c3059c 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java @@ -26,7 +26,7 @@ import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.foundation.utility.ServerSpeedProvider; import com.simibubi.create.infrastructure.config.AllConfigs; -import dev.engine_room.flywheel.api.backend.BackendManager; +import dev.engine_room.flywheel.api.visualization.VisualizationManager; import net.createmod.catnip.utility.Iterate; import net.createmod.catnip.utility.NBTHelper; import net.createmod.catnip.utility.VecHelper; @@ -146,9 +146,8 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity implements ITra if (level.isClientSide()) { // We can use TickableVisuals if flywheel is enabled - if (!BackendManager.isBackendOn()) { + if (!VisualizationManager.supportsVisualization(level)) tickBoxVisuals(); - } } if (!level.isClientSide()) { @@ -207,7 +206,7 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity implements ITra anticipatePosition += serverSpeed * distancePerTick * 4; anticipatePosition = Math.min(stats.chainLength, anticipatePosition); - if (level.isClientSide()) + if (level.isClientSide() && !isVirtual()) continue; for (Entry portEntry : travelPorts.entrySet()) { @@ -376,6 +375,8 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity implements ITra return false; travellingPackages.computeIfAbsent(connection, $ -> new ArrayList<>()) .add(box); + if (level.isClientSide) + return true; notifyUpdate(); return true; } @@ -450,7 +451,7 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity implements ITra ChainConveyorPackagePhysicsData physicsData = box.physicsData(level); physicsData.setBE(this); - if (!physicsData.shouldTick()) + if (!physicsData.shouldTick() && !isVirtual()) return; physicsData.prevTargetPos = physicsData.targetPos; @@ -652,7 +653,7 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity implements ITra boolean connectedViaAxes, boolean connectedViaCogs) { if (connections.contains(target.getBlockPos() .subtract(worldPosition))) { - if (!(target instanceof ChainConveyorBlockEntity clbe)) + if (!(target instanceof ChainConveyorBlockEntity)) return 0; return 1; } diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRenderer.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRenderer.java index e87224acf7..eee6d6f037 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRenderer.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRenderer.java @@ -15,7 +15,7 @@ import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorPackage.C import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.foundation.render.RenderTypes; -import dev.engine_room.flywheel.api.backend.BackendManager; +import dev.engine_room.flywheel.api.visualization.VisualizationManager; import dev.engine_room.flywheel.lib.transform.TransformStack; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; @@ -55,13 +55,14 @@ public class ChainConveyorRenderer extends KineticBlockEntityRenderer> entry : be.travellingPackages.entrySet()) + for (ChainConveyorPackage box : entry.getValue()) renderBox(be, ms, buffer, overlay, pos, box, partialTicks); - for (Entry> entry : be.travellingPackages.entrySet()) - for (ChainConveyorPackage box : entry.getValue()) - renderBox(be, ms, buffer, overlay, pos, box, partialTicks); - } } private void renderBox(ChainConveyorBlockEntity be, PoseStack ms, MultiBufferSource buffer, int overlay, @@ -151,10 +152,9 @@ public class ChainConveyorRenderer extends KineticBlockEntityRenderer 0.5 && animatedPackage != null) { if (target == null || !target.depositImmediately() && !target.export(level, worldPosition, animatedPackage, false)) diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/renderer/SmartBlockEntityRenderer.java b/src/main/java/com/simibubi/create/foundation/blockEntity/renderer/SmartBlockEntityRenderer.java index e7c3903207..80a4f5ecc8 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/renderer/SmartBlockEntityRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/renderer/SmartBlockEntityRenderer.java @@ -32,6 +32,8 @@ public class SmartBlockEntityRenderer extends SafeBl protected void renderNameplateOnHover(T blockEntity, Component tag, float yOffset, PoseStack ms, MultiBufferSource buffer, int light) { Minecraft mc = Minecraft.getInstance(); + if (blockEntity.isVirtual()) + return; if (mc.player.distanceToSqr(Vec3.atCenterOf(blockEntity.getBlockPos())) > 4096.0f) return; HitResult hitResult = mc.hitResult; diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderScenes.java index c2d3e655a6..4e82b92d44 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderScenes.java @@ -19,6 +19,7 @@ import com.simibubi.create.infrastructure.ponder.scenes.DisplayScenes; import com.simibubi.create.infrastructure.ponder.scenes.EjectorScenes; import com.simibubi.create.infrastructure.ponder.scenes.ElevatorScenes; import com.simibubi.create.infrastructure.ponder.scenes.FanScenes; +import com.simibubi.create.infrastructure.ponder.scenes.FrogAndConveyorScenes; import com.simibubi.create.infrastructure.ponder.scenes.FunnelScenes; import com.simibubi.create.infrastructure.ponder.scenes.GantryScenes; import com.simibubi.create.infrastructure.ponder.scenes.ItemVaultScenes; @@ -339,12 +340,20 @@ public class AllCreatePonderScenes { .addStoryBoard("redstone_link", RedstoneScenes::redstoneLink); HELPER.forComponents(AllBlocks.ROSE_QUARTZ_LAMP) .addStoryBoard("rose_quartz_lamp", RedstoneScenes2::roseQuartzLamp); + HELPER.forComponents(AllBlocks.PULSE_TIMER) + .addStoryBoard("pulse_timer", RedstoneScenes2::pulseTimer); HELPER.forComponents(AllBlocks.SMART_OBSERVER) .addStoryBoard("smart_observer", DetectorScenes::smartObserver); HELPER.forComponents(AllBlocks.THRESHOLD_SWITCH) .addStoryBoard("threshold_switch", DetectorScenes::thresholdSwitch); + // Hilo + HELPER.forComponents(AllBlocks.CHAIN_CONVEYOR) + .addStoryBoard("chain_conveyor", FrogAndConveyorScenes::conveyor); + HELPER.forComponents(AllBlocks.PACKAGE_FROGPORT) + .addStoryBoard("package_frogport", FrogAndConveyorScenes::frogPort); + // Trains HELPER.forComponents(TrackMaterial.allBlocks() .stream() diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderTags.java b/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderTags.java index 1d3ea02916..1c21c061a2 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderTags.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderTags.java @@ -25,6 +25,7 @@ public class AllCreatePonderTags { KINETIC_APPLIANCES = loc("kinetic_appliances"), FLUIDS = loc("fluids"), LOGISTICS = loc("logistics"), + HIGH_LOGISTICS = loc("high_logistics"), REDSTONE = loc("redstone"), DECORATION = loc("decoration"), CREATIVE = loc("creative"), @@ -34,73 +35,11 @@ public class AllCreatePonderTags { SAILS = loc("windmill_sails"), ARM_TARGETS = loc("arm_targets"), TRAIN_RELATED = loc("train_related"), - RECENTLY_UPDATED = loc("recently_updated"), +// RECENTLY_UPDATED = loc("recently_updated"), DISPLAY_SOURCES = loc("display_sources"), DISPLAY_TARGETS = loc("display_targets"), THRESHOLD_SWITCH_TARGETS = loc("threshold_switch_targets"); - /*public static final PonderTag - - KINETIC_RELAYS = create("kinetic_relays").item(AllBlocks.COGWHEEL.get()) - .defaultLang("Kinetic Blocks", "Components which help relaying Rotational Force elsewhere"), - - KINETIC_SOURCES = create("kinetic_sources").item(AllBlocks.WATER_WHEEL.get()) - .defaultLang("Kinetic Sources", "Components which generate Rotational Force"), - - KINETIC_APPLIANCES = create("kinetic_appliances").item(AllBlocks.MECHANICAL_PRESS.get()) - .defaultLang("Kinetic Appliances", "Components which make use of Rotational Force"), - - FLUIDS = create("fluids").item(AllBlocks.FLUID_PIPE.get()) - .defaultLang("Fluid Manipulators", "Components which help relaying and making use of Fluids"), - - LOGISTICS = create("logistics").item(Blocks.CHEST) - .defaultLang("Item Transportation", "Components which help moving items around"), - - REDSTONE = create("redstone").item(Items.REDSTONE) - .defaultLang("Logic Components", "Components which help with redstone engineering"), - - DECORATION = create("decoration").item(Items.ROSE_BUSH) - .defaultLang("Aesthetics", "Components used mostly for decorative purposes"), - - CREATIVE = create("creative").item(AllBlocks.CREATIVE_CRATE.get()) - .defaultLang("Creative Mode", "Components not usually available for Survival Mode"), - - MOVEMENT_ANCHOR = create("movement_anchor").item(AllBlocks.MECHANICAL_PISTON.get()) - .defaultLang("Movement Anchors", - "Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways"), - - CONTRAPTION_ACTOR = create("contraption_actor").item(AllBlocks.MECHANICAL_HARVESTER.get()) - .defaultLang("Contraption Actors", - "Components which expose special behaviour when attached to a moving contraption"), - - CONTRAPTION_ASSEMBLY = create("contraption_assembly").item(AllItems.SUPER_GLUE.get()) - .defaultLang("Block Attachment Utility", - "Tools and Components used to assemble structures moved as an animated Contraption"), - - SAILS = create("windmill_sails").item(AllBlocks.WINDMILL_BEARING.get(), true, true) - .defaultLang("Sails for Windmill Bearings", - "Blocks that count towards the strength of a Windmill Contraption when assembled. Each of these have equal efficiency in doing so."), - - ARM_TARGETS = create("arm_targets").item(AllBlocks.MECHANICAL_ARM.get(), true, true) - .defaultLang("Targets for Mechanical Arms", - "Components which can be selected as inputs or outputs to the Mechanical Arm"), - - TRAIN_RELATED = create("train_related").item(AllBlocks.TRACK.get()) - .defaultLang("Railway Equipment", - "Components used in the construction or management of Train Contraptions"), - - RECENTLY_UPDATED = create("recently_updated").item(AllBlocks.CLIPBOARD.get()) - .defaultLang("Recent Changes", - "Components that have been added or changed significantly in the latest versions of Create"), - - DISPLAY_SOURCES = create("display_sources").item(AllBlocks.DISPLAY_LINK.get(), true, true) - .defaultLang("Sources for Display Links", - "Components or Blocks which offer some data that can be read with a Display Link"), - - DISPLAY_TARGETS = create("display_targets").item(AllBlocks.DISPLAY_LINK.get(), true, true) - .defaultLang("Targets for Display Links", - "Components or Blocks which can process and display the data received from a Display Link");*/ - private static ResourceLocation loc(String id) { return Create.asResource(id); } @@ -146,6 +85,13 @@ public class AllCreatePonderTags { .title("Item Transportation") .description("Components which help moving items around") .register(); + + helper.registerTag(HIGH_LOGISTICS) + .addToIndex() + .item(AllBlocks.STOCK_TICKER.get()) + .title("High Logistics") + .description("Components which help managing distributed item storage and automated requests around your factory") + .register(); helper.registerTag(REDSTONE) .addToIndex() @@ -208,12 +154,12 @@ public class AllCreatePonderTags { .description("Components used in the construction or management of Train Contraptions") .register(); - helper.registerTag(RECENTLY_UPDATED) - .addToIndex() - .item(AllBlocks.CLIPBOARD.get()) - .title("Recent Changes") - .description("Components that have been added or changed significantly in the latest versions of Create") - .register(); +// helper.registerTag(RECENTLY_UPDATED) +// .addToIndex() +// .item(AllBlocks.CLIPBOARD.get()) +// .title("Recent Changes") +// .description("Components that have been added or changed significantly in the latest versions of Create") +// .register(); helper.registerTag(DISPLAY_SOURCES) .item(AllBlocks.DISPLAY_LINK.get()) @@ -233,19 +179,7 @@ public class AllCreatePonderTags { .description("Threshold Switches can read from these blocks, as well as most item and fluid containers.") .register(); - HELPER.addToTag(RECENTLY_UPDATED) - .add(AllBlocks.WATER_WHEEL) - .add(AllBlocks.LARGE_WATER_WHEEL) - .add(AllBlocks.COPPER_VALVE_HANDLE) - .add(AllBlocks.ELEVATOR_PULLEY) - .add(AllBlocks.CONTRAPTION_CONTROLS) - .add(AllBlocks.MECHANICAL_ROLLER) - .add(AllBlocks.MECHANICAL_PUMP) - .add(AllBlocks.SMART_OBSERVER) - .add(AllBlocks.THRESHOLD_SWITCH) - .add(AllItems.NETHERITE_BACKTANK) - .add(AllBlocks.COPYCAT_PANEL) - .add(AllBlocks.COPYCAT_STEP); +// HELPER.addToTag(RECENTLY_UPDATED); HELPER.addToTag(KINETIC_RELAYS) .add(AllBlocks.SHAFT) @@ -253,10 +187,12 @@ public class AllCreatePonderTags { .add(AllBlocks.LARGE_COGWHEEL) .add(AllItems.BELT_CONNECTOR) .add(AllBlocks.GEARBOX) + .add(AllItems.VERTICAL_GEARBOX) .add(AllBlocks.CLUTCH) .add(AllBlocks.GEARSHIFT) .add(AllBlocks.ENCASED_CHAIN_DRIVE) .add(AllBlocks.ADJUSTABLE_CHAIN_GEARSHIFT) + .add(AllBlocks.CHAIN_CONVEYOR) .add(AllBlocks.SEQUENCED_GEARSHIFT) .add(AllBlocks.ROTATION_SPEED_CONTROLLER); @@ -391,6 +327,7 @@ public class AllCreatePonderTags { .add(AllBlocks.REDSTONE_LINK) .add(AllBlocks.PULSE_EXTENDER) .add(AllBlocks.PULSE_REPEATER) + .add(AllBlocks.PULSE_TIMER) .add(AllBlocks.POWERED_LATCH) .add(AllBlocks.POWERED_TOGGLE_LATCH) .add(AllBlocks.ROSE_QUARTZ_LAMP); @@ -417,6 +354,18 @@ public class AllCreatePonderTags { .add(Blocks.SLIME_BLOCK) .add(Blocks.HONEY_BLOCK); + HELPER.addToTag(HIGH_LOGISTICS) + .add(AllBlocks.PACKAGER) + .add(AllBlocks.PACKAGE_FROGPORT) + .add(AllBlocks.PACKAGE_POSTBOXES.get(DyeColor.WHITE)) + .add(AllBlocks.STOCK_LINK) + .add(AllBlocks.STOCK_TICKER) + .add(AllBlocks.REDSTONE_REQUESTER) + .add(AllBlocks.TABLE_CLOTHS.get(DyeColor.WHITE)) + .add(AllBlocks.FACTORY_GAUGE) + .add(AllBlocks.REPACKAGER) + .add(AllItems.PACKAGE_FILTER); + HELPER.addToTag(CONTRAPTION_ACTOR) .add(AllBlocks.MECHANICAL_HARVESTER) .add(AllBlocks.MECHANICAL_PLOUGH) @@ -452,6 +401,7 @@ public class AllCreatePonderTags { .add(AllBlocks.STRESSOMETER) .add(AllBlocks.SPEEDOMETER) .add(AllBlocks.FLUID_TANK) + .add(AllBlocks.FACTORY_GAUGE) .add(AllItems.BELT_CONNECTOR); itemHelper.addToTag(DISPLAY_SOURCES) diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/FrogAndConveyorScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/FrogAndConveyorScenes.java new file mode 100644 index 0000000000..53cd2921a3 --- /dev/null +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/FrogAndConveyorScenes.java @@ -0,0 +1,935 @@ +package com.simibubi.create.infrastructure.ponder.scenes; + +import java.util.Iterator; +import java.util.function.Supplier; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; +import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllItems; +import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorBlockEntity; +import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorPackage; +import com.simibubi.create.content.logistics.box.PackageItem; +import com.simibubi.create.content.logistics.box.PackageStyles; +import com.simibubi.create.content.logistics.packagePort.frogport.FrogportBlockEntity; +import com.simibubi.create.content.logistics.packager.PackagerBlockEntity; +import com.simibubi.create.foundation.ponder.CreateSceneBuilder; + +import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.ponder.api.PonderPalette; +import net.createmod.ponder.api.element.ElementLink; +import net.createmod.ponder.api.element.ParrotElement; +import net.createmod.ponder.api.element.ParrotPose; +import net.createmod.ponder.api.element.WorldSectionElement; +import net.createmod.ponder.api.level.PonderLevel; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; +import net.createmod.ponder.api.scene.Selection; +import net.createmod.ponder.foundation.element.ElementLinkImpl; +import net.createmod.ponder.foundation.element.ParrotElementImpl; +import net.createmod.ponder.foundation.instruction.CreateParrotInstruction; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.EntityRenderDispatcher; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; + +public class FrogAndConveyorScenes { + + public static void conveyor(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); + scene.title("chain_conveyor", "Relaying rotational force using Chain Conveyors"); + scene.configureBasePlate(0, 0, 9); + scene.scaleSceneView(.75f); + scene.setSceneOffsetY(-1); + scene.world() + .showSection(util.select() + .layer(0), Direction.UP); + + Selection pole = util.select() + .fromTo(1, 1, 6, 1, 3, 6); + Selection cogs = util.select() + .position(8, 1, 2); + Selection cogs2 = util.select() + .fromTo(7, 1, 1, 7, 3, 1); + + BlockPos conv1 = util.grid() + .at(7, 4, 1); + BlockPos conv2 = util.grid() + .at(1, 4, 7); + BlockPos conv3 = util.grid() + .at(1, 2, 4); + BlockPos conv4 = util.grid() + .at(7, 4, 7); + + connection(builder, conv1, conv2, false); + connection(builder, conv1, conv3, false); + connection(builder, conv1, conv4, false); + + Selection pole3 = util.select() + .position(1, 1, 4); + Selection pole4 = util.select() + .fromTo(7, 1, 7, 7, 3, 7); + Selection cogsBelow = util.select() + .fromTo(1, 2, 7, 1, 3, 7); + Selection cogsAbove = util.select() + .position(1, 5, 7); + + Selection conv1S = util.select() + .position(conv1); + Selection conv2S = util.select() + .position(conv2); + Selection conv3S = util.select() + .position(conv3); + Selection conv4S = util.select() + .position(conv4); + + scene.world() + .setKineticSpeed(conv2S, 0); + + scene.idle(5); + scene.world() + .showSection(cogs, Direction.EAST); + scene.idle(5); + scene.world() + .showSection(cogs2, Direction.DOWN); + scene.idle(5); + scene.world() + .showSection(conv1S, Direction.DOWN); + ElementLink poleE = scene.world() + .showIndependentSection(pole, Direction.DOWN); + scene.world() + .moveSection(poleE, util.vector() + .of(0, 0, 1), 0); + scene.idle(5); + scene.world() + .showSection(conv2S, Direction.DOWN); + scene.idle(20); + + ItemStack chainItem = new ItemStack(Items.CHAIN); + scene.overlay() + .showControls(util.vector() + .topOf(conv1), Pointing.DOWN, 117) + .rightClick() + .withItem(chainItem); + + Vec3 c1 = util.vector() + .centerOf(conv1); + AABB bb1 = new AABB(c1, c1); + scene.overlay() + .chaseBoundingBoxOutline(PonderPalette.GREEN, conv1, bb1, 10); + scene.idle(1); + scene.overlay() + .chaseBoundingBoxOutline(PonderPalette.GREEN, conv1, bb1.inflate(1, 0.5, 1), 117); + scene.idle(16); + + scene.overlay() + .showControls(util.vector() + .topOf(conv2), Pointing.DOWN, 100) + .rightClick() + .withItem(chainItem); + + Vec3 c2 = util.vector() + .centerOf(conv2); + AABB bb2 = new AABB(c2, c2); + scene.overlay() + .chaseBoundingBoxOutline(PonderPalette.GREEN, conv2, bb2, 10); + scene.idle(1); + scene.overlay() + .chaseBoundingBoxOutline(PonderPalette.GREEN, conv2, bb2.inflate(1, 0.5, 1), 100); + scene.idle(10); + + connection(builder, conv1, conv2, true); + scene.world() + .setKineticSpeed(conv2S, -32); + + scene.overlay() + .showText(80) + .text("Right-click two conveyors with chains to connect them") + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector() + .topOf(conv1.offset(-1, 0, -1))); + scene.idle(90); + + scene.world() + .showSection(pole3, Direction.DOWN); + scene.idle(3); + scene.world() + .showSection(pole4, Direction.DOWN); + scene.idle(6); + scene.world() + .showSection(conv3S, Direction.DOWN); + scene.idle(3); + scene.world() + .showSection(conv4S, Direction.DOWN); + scene.idle(12); + connection(builder, conv1, conv3, true); + scene.idle(3); + connection(builder, conv1, conv4, true); + scene.idle(20); + + scene.overlay() + .showText(60) + .text("These relay rotational power to each other very flexibly..") + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector() + .topOf(conv3.offset(-1, 0, -1))); + scene.idle(50); + + scene.world() + .hideIndependentSection(poleE, Direction.SOUTH); + scene.idle(20); + scene.world() + .showSection(cogsAbove, Direction.DOWN); + scene.idle(3); + scene.world() + .showSection(cogsBelow, Direction.UP); + scene.idle(12); + + scene.effects() + .rotationDirectionIndicator(conv2.above()); + scene.idle(3); + scene.effects() + .rotationDirectionIndicator(conv2.below(2)); + scene.idle(10); + + scene.overlay() + .showText(60) + .text("..and connect to shafts above or below them") + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector() + .centerOf(util.grid() + .at(1, 2, 7))); + scene.idle(60); + scene.world() + .hideSection(cogsBelow, Direction.SOUTH); + scene.idle(15); + ElementLink poleE2 = scene.world() + .showIndependentSection(pole, Direction.EAST); + scene.world() + .moveSection(poleE2, util.vector() + .of(0, 0, 1), 0); + scene.idle(10); + + scene.overlay() + .showText(80) + .text("Right-click holding a wrench to start travelling on the chain") + .attachKeyFrame() + .independent(30); + + scene.idle(40); + ElementLink parrot = new ElementLinkImpl<>(ParrotElement.class); + Vec3 parrotStart = util.vector() + .centerOf(conv2) + .add(0, -1.45, 1); + ChainConveyorParrotElement element = + new ChainConveyorParrotElement(parrotStart, ParrotPose.FacePointOfInterestPose::new); + scene.addInstruction(new CreateParrotInstruction(0, Direction.DOWN, element)); + scene.addInstruction(s -> s.linkElement(element, parrot)); + scene.special() + .movePointOfInterest(util.grid() + .at(0, 3, 2)); + + scene.idle(20); + scene.special() + .moveParrot(parrot, util.vector() + .of(-1, 0, -1), 14); + scene.idle(14); + scene.special() + .movePointOfInterest(util.grid() + .at(7, 3, 0)); + scene.special() + .moveParrot(parrot, util.vector() + .of(5.75, 0, -5.75), 90); + scene.idle(65); + + scene.overlay() + .showText(60) + .text("At a junction, face towards a chain to follow it") + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector() + .topOf(conv1)); + + scene.idle(25); + scene.special() + .movePointOfInterest(util.grid() + .at(9, 3, 1)); + scene.special() + .moveParrot(parrot, util.vector() + .of(1, 0, -1), 14); + scene.idle(14); + scene.special() + .movePointOfInterest(util.grid() + .at(9, 3, 3)); + scene.special() + .moveParrot(parrot, util.vector() + .of(0.5, 0, 0), 6); + scene.idle(6); + scene.special() + .movePointOfInterest(util.grid() + .at(8, 3, 10)); + scene.special() + .moveParrot(parrot, util.vector() + .of(0.5, 0, 0.5), 14); + scene.idle(14); + scene.special() + .moveParrot(parrot, util.vector() + .of(0, 0, 7), 78); + scene.idle(78); + scene.special() + .hideElement(parrot, Direction.SOUTH); + } + + private static void connection(SceneBuilder builder, BlockPos p1, BlockPos p2, boolean connect) { + builder.world() + .modifyBlockEntity(p1, ChainConveyorBlockEntity.class, be -> { + if (connect) + be.connections.add(p2.subtract(p1)); + else + be.connections.remove(p2.subtract(p1)); + }); + builder.world() + .modifyBlockEntity(p2, ChainConveyorBlockEntity.class, be -> { + if (connect) + be.connections.add(p1.subtract(p2)); + else + be.connections.remove(p1.subtract(p2)); + }); + } + + public static class ChainConveyorParrotElement extends ParrotElementImpl { + + private ItemEntity wrench; + + public ChainConveyorParrotElement(Vec3 location, Supplier pose) { + super(location, pose); + } + + @Override + protected void renderLast(PonderLevel world, MultiBufferSource buffer, GuiGraphics graphics, float fade, + float pt) { + PoseStack poseStack = graphics.pose(); + EntityRenderDispatcher entityrenderermanager = Minecraft.getInstance() + .getEntityRenderDispatcher(); + + if (entity == null) { + entity = pose.create(world); + entity.setYRot(entity.yRotO = 180); + } + + if (wrench == null) { + wrench = new ItemEntity(world, 0, 0, 0, AllItems.WRENCH.asStack()); + wrench.setYRot(wrench.yRotO = 180); + } + + double lx = Mth.lerp(pt, entity.xo, entity.getX()); + double ly = Mth.lerp(pt, entity.yo, entity.getY()); + double lz = Mth.lerp(pt, entity.zo, entity.getZ()); + float angle = AngleHelper.angleLerp(pt, entity.yRotO, entity.getYRot()); + + poseStack.pushPose(); + poseStack.translate(location.x, location.y, location.z); + poseStack.translate(lx, ly, lz); + poseStack.mulPose(Axis.YP.rotationDegrees(angle)); + + poseStack.translate(0, 1.5f, 0); + poseStack.mulPose(Axis.ZP.rotationDegrees(Mth.sin((world.scene.getCurrentTime() + pt) * 0.2f) * 10)); + poseStack.translate(0, -1.5f, 0); + + poseStack.pushPose(); + poseStack.mulPose(Axis.YP.rotationDegrees(90)); + poseStack.mulPose(Axis.XP.rotationDegrees(90)); + poseStack.mulPose(Axis.ZP.rotationDegrees(90)); + poseStack.scale(1.5f, 1.5f, 1.5f); + poseStack.translate(-0.1, 0.2, -0.6); + BakedModel bakedmodel = Minecraft.getInstance() + .getItemRenderer() + .getModel(wrench.getItem(), world, (LivingEntity) null, 0); + Minecraft.getInstance() + .getItemRenderer() + .render(wrench.getItem(), ItemDisplayContext.GROUND, false, poseStack, buffer, + lightCoordsFromFade(fade), OverlayTexture.NO_OVERLAY, bakedmodel); + poseStack.popPose(); + + entity.flapSpeed = 2; + entityrenderermanager.render(entity, 0, 0, 0, 0, pt, poseStack, buffer, lightCoordsFromFade(fade)); + poseStack.popPose(); + } + + } + + public static void frogPort(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); + scene.title("package_frogport", "Transporting packages with Frogports"); + scene.configureBasePlate(0, 0, 9); + scene.scaleSceneView(.75f); + scene.setSceneOffsetY(-1); + + BlockPos conv1 = util.grid() + .at(1, 4, 7); + BlockPos conv2 = util.grid() + .at(7, 4, 7); + BlockPos conv3 = util.grid() + .at(7, 4, 1); + Selection conv1S = util.select() + .position(conv1); + Selection conv2S = util.select() + .position(conv2); + Selection conv3S = util.select() + .position(conv3); + Selection largeCog = util.select() + .position(2, 1, 8); + Selection shaftPole = util.select() + .fromTo(1, 1, 7, 1, 3, 7); + Selection pole2 = util.select() + .fromTo(7, 1, 7, 7, 3, 7); + Selection pole3 = util.select() + .fromTo(7, 1, 1, 7, 3, 1); + Selection largeCog2 = util.select() + .position(9, 0, 1); + Selection fromBelt = util.select() + .fromTo(9, 1, 0, 6, 1, 0) + .add(util.select() + .fromTo(5, 1, 0, 5, 1, 1)); + BlockPos fromFunnel = util.grid() + .at(5, 2, 1); + Selection logistics = util.select() + .fromTo(2, 1, 2, 1, 1, 2); + Selection toBelt = util.select() + .fromTo(1, 1, 9, 0, 1, 9) + .add(util.select() + .fromTo(0, 1, 8, 0, 1, 6)) + .add(util.select() + .fromTo(1, 1, 5, 0, 1, 5)); + BlockPos toFunnel = util.grid() + .at(1, 2, 5); + + BlockPos fromFrog = util.grid() + .at(5, 2, 2); + BlockPos toFrog = util.grid() + .at(2, 2, 5); + Selection fromFrogS = util.select() + .position(fromFrog); + Selection toFrogS = util.select() + .position(toFrog); + + Selection casing = util.select() + .position(5, 1, 4); + Selection fromBarrel = util.select() + .position(5, 1, 3); + Selection toBarrel = util.select() + .position(3, 1, 5); + Selection fromPackager = util.select() + .fromTo(7, 1, 2, 5, 1, 2); + Selection sign = util.select() + .position(4, 1, 2); + BlockPos lever = util.grid() + .at(6, 1, 1); + Selection toPackager = util.select() + .fromTo(2, 1, 4, 0, 1, 4); + + scene.world() + .showSection(util.select() + .layer(0) + .substract(largeCog2), Direction.UP); + scene.idle(10); + scene.world() + .showSection(largeCog, Direction.SOUTH); + scene.idle(2); + scene.world() + .showSection(shaftPole, Direction.DOWN); + scene.idle(2); + scene.world() + .showSection(pole2, Direction.DOWN); + scene.idle(2); + scene.world() + .showSection(pole3, Direction.DOWN); + scene.idle(5); + scene.world() + .showSection(conv1S, Direction.DOWN); + scene.world() + .showSection(conv2S, Direction.DOWN); + scene.world() + .showSection(conv3S, Direction.DOWN); + scene.idle(25); + + Vec3 fromTarget = util.vector() + .of(6.78, 4.37, 3.5); + + ItemStack frogItem = AllBlocks.PACKAGE_FROGPORT.asStack(); + scene.overlay() + .showControls(fromTarget, Pointing.UP, 50) + .rightClick() + .withItem(frogItem); + scene.idle(5); + + AABB bb1 = new AABB(fromTarget, fromTarget); + scene.overlay() + .chaseBoundingBoxOutline(PonderPalette.WHITE, conv1, bb1, 10); + scene.idle(1); + scene.overlay() + .chaseBoundingBoxOutline(PonderPalette.WHITE, conv1, bb1.inflate(0.025, 0.025, 0.025), 50); + scene.idle(26); + + scene.overlay() + .showText(80) + .text("Right-click a Chain Conveyor and place the Frogport nearby") + .attachKeyFrame() + .placeNearTarget() + .pointAt(fromTarget); + + scene.idle(40); + + ElementLink fromFrogE = scene.world() + .showIndependentSection(fromFrogS, Direction.DOWN); + scene.world() + .moveSection(fromFrogE, util.vector() + .of(0, -1, 0), 0); + + scene.idle(15); + scene.overlay() + .chaseBoundingBoxOutline(PonderPalette.GREEN, conv1, bb1.inflate(0.025, 0.025, 0.025), 50); + + AABB bb2 = new AABB(fromFrog.below()).contract(0, 0.75, 0); + + scene.overlay() + .chaseBoundingBoxOutline(PonderPalette.GREEN, conv2, bb2, 50); + scene.idle(10); + scene.overlay() + .showLine(PonderPalette.GREEN, util.vector() + .topOf(fromFrog.below()), fromTarget, 40); + scene.idle(45); + + scene.overlay() + .showControls(util.vector() + .topOf(fromFrog.below()), Pointing.DOWN, 40) + .rightClick(); + scene.idle(7); + scene.overlay() + .showOutlineWithText(util.select() + .position(fromFrog.below()), 70) + .attachKeyFrame() + .colored(PonderPalette.BLUE) + .text("They can be given a name in their inventory UI") + .pointAt(util.vector() + .topOf(fromFrog.below())) + .placeNearTarget(); + scene.idle(80); + + scene.world() + .moveSection(fromFrogE, util.vector() + .of(0, 1, 0), 10); + scene.idle(10); + ElementLink casingE = scene.world() + .showIndependentSection(casing, Direction.NORTH); + scene.world() + .moveSection(casingE, util.vector() + .of(0, 0, -2), 0); + scene.idle(5); + scene.world() + .showSection(largeCog2, Direction.UP); + scene.world() + .showSection(fromBelt, Direction.SOUTH); + scene.idle(5); + scene.world() + .showSection(util.select() + .position(fromFunnel), Direction.DOWN); + scene.idle(10); + + ItemStack box = PackageStyles.getDefaultBox() + .copy(); + PackageItem.addAddress(box, "Peter"); + + scene.world() + .createItemOnBelt(util.grid() + .at(5, 1, 0), Direction.NORTH, box); + scene.idle(5); + + scene.world() + .multiplyKineticSpeed(util.select() + .fromTo(9, 0, 1, 5, 1, 0), 1 / 32f); + scene.idle(5); + + scene.overlay() + .showText(75) + .colored(PonderPalette.BLUE) + .text("Albert") + .pointAt(util.vector() + .topOf(fromFrog)) + .placeNearTarget(); + scene.idle(5); + scene.overlay() + .showText(70) + .colored(PonderPalette.OUTPUT) + .text("Peter") + .pointAt(util.vector() + .centerOf(util.grid() + .at(5, 2, 0))) + .placeNearTarget(); + scene.idle(30); + + scene.overlay() + .showText(80) + .attachKeyFrame() + .text("If a package is addressed to a different name..") + .pointAt(util.vector() + .topOf(5, 0, 3)) + .placeNearTarget(); + + scene.idle(60); + + scene.world() + .multiplyKineticSpeed(util.select() + .fromTo(9, 0, 1, 5, 1, 0), 32f); + scene.idle(13); + scene.world() + .removeItemsFromBelt(util.grid() + .at(5, 1, 1)); + scene.world() + .flapFunnel(fromFunnel, false); + scene.idle(15); + scene.world() + .modifyBlockEntity(fromFrog, FrogportBlockEntity.class, be -> be.startAnimation(box, true)); + scene.idle(15); + + scene.overlay() + .showText(60) + .text("..the Frogport will place the package on the conveyor") + .pointAt(fromTarget.add(0, 0, 1.5)) + .placeNearTarget(); + scene.idle(95); + + scene.overlay() + .showText(60) + .attachKeyFrame() + .colored(PonderPalette.RED) + .text("Packages spin in place if they have no valid destination") + .pointAt(util.vector() + .of(6.5, 4.25, 7.5)) + .placeNearTarget(); + scene.idle(60); + + scene.world() + .showSection(util.select() + .position(toFrog.below()), Direction.SOUTH); + scene.idle(5); + scene.world() + .showSection(toFrogS, Direction.DOWN); + scene.idle(15); + + Vec3 toTarget = util.vector() + .of(3.5, 4.37, 6.78); + AABB bb3 = new AABB(toTarget, toTarget); + AABB bb4 = new AABB(toFrog).contract(0, 0.75, 0); + + scene.overlay() + .chaseBoundingBoxOutline(PonderPalette.GREEN, conv3, bb3.inflate(0.025, 0.025, 0.025), 80); + scene.overlay() + .chaseBoundingBoxOutline(PonderPalette.GREEN, lever, bb4, 80); + scene.overlay() + .showLine(PonderPalette.GREEN, util.vector() + .topOf(toFrog), toTarget, 80); + + scene.idle(10); + + scene.overlay() + .showText(70) + .text("More Frogports can be added anywhere on the chain network") + .attachKeyFrame() + .placeNearTarget() + .pointAt(toTarget); + + scene.idle(75); + + scene.overlay() + .showText(70) + .colored(PonderPalette.BLUE) + .text("Peter") + .pointAt(util.vector() + .topOf(toFrog)) + .placeNearTarget(); + scene.idle(30); + + scene.world() + .modifyBlockEntity(conv2, ChainConveyorBlockEntity.class, be -> boxTransfer(conv1, conv2, be)); + + scene.idle(50); + scene.overlay() + .showText(70) + .attachKeyFrame() + .text("Packages find their path to a matching frog on the chain network") + .pointAt(util.vector() + .topOf(toFrog)) + .placeNearTarget(); + scene.idle(40); + + scene.world() + .showSection(toBelt, Direction.SOUTH); + scene.idle(10); + scene.world() + .showSection(util.select() + .position(toFunnel), Direction.DOWN); + scene.idle(15); + + scene.world() + .createItemOnBelt(util.grid() + .at(1, 1, 5), Direction.EAST, box); + scene.idle(20); + scene.world() + .hideSection(util.select() + .fromTo(0, 1, 6, 0, 1, 9) + .add(util.select() + .position(1, 1, 9)), + Direction.SOUTH); + scene.world() + .setKineticSpeed(util.select() + .fromTo(1, 1, 5, 0, 1, 5), 0); + + scene.overlay() + .showText(50) + .colored(PonderPalette.BLUE) + .text("Peter") + .pointAt(util.vector() + .topOf(toFrog)) + .placeNearTarget(); + scene.idle(5); + scene.overlay() + .showText(55) + .colored(PonderPalette.OUTPUT) + .text("Peter") + .pointAt(util.vector() + .centerOf(util.grid() + .at(0, 2, 5))) + .placeNearTarget(); + + scene.idle(60); + + scene.world() + .hideSection(util.select() + .fromTo(1, 2, 5, 0, 1, 5), Direction.WEST); + scene.world() + .hideSection(util.select() + .fromTo(5, 2, 1, 5, 1, 0) + .add(util.select() + .fromTo(6, 1, 0, 9, 1, 0)), + Direction.NORTH); + scene.world() + .hideSection(util.select() + .position(9, 0, 1), Direction.DOWN); + + scene.idle(15); + + scene.world() + .hideIndependentSection(casingE, Direction.WEST); + scene.world() + .hideSection(util.select() + .position(2, 1, 5), Direction.WEST); + scene.idle(15); + ElementLink fromBarrelE = scene.world() + .showIndependentSection(fromBarrel, Direction.WEST); + scene.world() + .moveSection(fromBarrelE, util.vector() + .of(0, 0, -1), 0); + ElementLink toBarrelE = scene.world() + .showIndependentSection(toBarrel, Direction.WEST); + scene.world() + .moveSection(toBarrelE, util.vector() + .of(-1, 0, 0), 0); + scene.idle(20); + + scene.overlay() + .showOutlineWithText(util.select() + .position(fromFrog.below()) + .add(fromFrogS), 70) + .attachKeyFrame() + .colored(PonderPalette.BLUE) + .text("Frogports can directly interface with inventories below them") + .pointAt(util.vector() + .topOf(fromFrog.below())) + .placeNearTarget(); + + scene.idle(70); + + scene.world() + .hideIndependentSection(fromBarrelE, Direction.WEST); + scene.world() + .hideIndependentSection(toBarrelE, Direction.EAST); + scene.idle(15); + + scene.world() + .showIndependentSection(fromPackager, Direction.WEST); + ElementLink toPackagerE = scene.world() + .showIndependentSection(toPackager, Direction.WEST); + scene.world() + .moveSection(toPackagerE, util.vector() + .of(0, 0, 1), 0); + ElementLink leverE = scene.world() + .showIndependentSection(util.select() + .position(lever), Direction.DOWN); + scene.world() + .moveSection(leverE, util.vector() + .of(-1, 0, 0), 0); + scene.idle(15); + + scene.overlay() + .showText(90) + .attachKeyFrame() + .text("This works with packagers, items can be packed and shipped directly") + .pointAt(util.vector() + .blockSurface(fromFrog.below(), Direction.WEST)) + .placeNearTarget(); + scene.idle(100); + + scene.world() + .showSection(sign, Direction.EAST); + scene.idle(10); + + scene.overlay() + .showText(80) + .colored(PonderPalette.BLUE) + .text("Albert") + .pointAt(util.vector() + .topOf(fromFrog)) + .placeNearTarget(); + scene.overlay() + .showText(80) + .colored(PonderPalette.BLUE) + .text("Peter") + .pointAt(util.vector() + .topOf(toFrog)) + .placeNearTarget(); + scene.idle(20); + + scene.overlay() + .showOutlineWithText(util.select() + .position(fromFrog.below()) + .add(util.select() + .position(fromFrog.below() + .west())), + 70) + .colored(PonderPalette.OUTPUT) + .text("Addresses packages to 'Peter'") + .pointAt(util.vector() + .blockSurface(fromFrog.below() + .west(), Direction.NORTH)) + .placeNearTarget(); + scene.idle(80); + + scene.overlay() + .showControls(util.vector() + .blockSurface(util.grid() + .at(6, 1, 2), Direction.UP) + .add(0.5, 0, 0), Pointing.DOWN, 40) + .withItem(new ItemStack(Items.DIAMOND)); + scene.idle(25); + + scene.addKeyframe(); + + scene.effects() + .indicateRedstone(util.grid() + .at(5, 1, 1)); + scene.world() + .toggleRedstonePower(util.select() + .fromTo(5, 1, 2, 6, 1, 1)); + scene.idle(5); + + scene.world() + .modifyBlockEntity(util.grid() + .at(5, 1, 2), PackagerBlockEntity.class, be -> { + be.animationTicks = PackagerBlockEntity.CYCLE; + be.animationInward = false; + be.heldBox = box; + }); + + scene.idle(30); + + scene.world() + .modifyBlockEntity(util.grid() + .at(5, 1, 2), PackagerBlockEntity.class, be -> { + be.heldBox = ItemStack.EMPTY; + }); + scene.world() + .modifyBlockEntity(fromFrog, FrogportBlockEntity.class, be -> be.startAnimation(box, true)); + + scene.idle(40); + + scene.world() + .modifyBlockEntity(conv2, ChainConveyorBlockEntity.class, be -> boxTransfer(conv1, conv2, be)); + scene.idle(50); + + scene.world() + .modifyBlockEntity(util.grid() + .at(2, 1, 4), PackagerBlockEntity.class, be -> { + be.animationTicks = PackagerBlockEntity.CYCLE; + be.animationInward = true; + be.previouslyUnwrapped = box; + }); + + scene.idle(20); + scene.overlay() + .showControls(util.vector() + .blockSurface(util.grid() + .at(0, 1, 5), Direction.UP) + .add(0.5, 0, 0), Pointing.DOWN, 40) + .withItem(new ItemStack(Items.DIAMOND)); + scene.idle(60); + + scene.overlay() + .showControls(util.vector() + .centerOf(util.grid() + .at(2, 2, 5)), + Pointing.RIGHT, 40) + .rightClick() + .withItem(AllBlocks.CLIPBOARD.asStack()); + scene.idle(10); + + scene.overlay() + .showText(90) + .attachKeyFrame() + .text("Right-click Frogports with a clipboard to collect their address") + .pointAt(util.vector() + .blockSurface(toFrog, Direction.WEST)) + .placeNearTarget(); + scene.idle(70); + + scene.world() + .showSection(logistics, Direction.DOWN); + scene.idle(30); + + scene.overlay() + .showText(120) + .text("Clipboards with collected names can help auto-complete address inputs in other UIs") + .pointAt(util.vector() + .topOf(util.grid() + .at(2, 1, 2))) + .placeNearTarget(); + scene.idle(70); + } + + public static void boxTransfer(BlockPos to, BlockPos from, ChainConveyorBlockEntity be) { + for (Iterator iterator = be.getLoopingPackages() + .iterator(); iterator.hasNext();) { + ChainConveyorPackage chainConveyorPackage = iterator.next(); + chainConveyorPackage.chainPosition = 0; + be.addTravellingPackage(chainConveyorPackage, to.subtract(from)); + iterator.remove(); + } + } + +} diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/RedstoneScenes2.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/RedstoneScenes2.java index e500120a8c..1fd3bd01b3 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/RedstoneScenes2.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/RedstoneScenes2.java @@ -2,8 +2,11 @@ package com.simibubi.create.infrastructure.ponder.scenes; import com.simibubi.create.AllItems; import com.simibubi.create.content.redstone.RoseQuartzLampBlock; +import com.simibubi.create.content.redstone.diodes.BrassDiodeBlock; +import com.simibubi.create.content.redstone.diodes.PulseTimerBlockEntity; import com.simibubi.create.content.redstone.nixieTube.NixieTubeBlockEntity; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; +import com.simibubi.create.foundation.ponder.CreateSceneBuilder.WorldInstructions; import net.createmod.catnip.utility.Pointing; import net.createmod.ponder.api.element.ElementLink; @@ -11,8 +14,10 @@ import net.createmod.ponder.api.element.WorldSectionElement; import net.createmod.ponder.api.scene.SceneBuilder; import net.createmod.ponder.api.scene.SceneBuildingUtil; import net.createmod.ponder.api.scene.Selection; +import net.createmod.ponder.api.scene.SelectionUtil; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.world.phys.Vec3; public class RedstoneScenes2 { @@ -21,120 +26,184 @@ public class RedstoneScenes2 { scene.title("rose_quartz_lamp", "Rose Quartz Lamps"); scene.configureBasePlate(0, 0, 7); - BlockPos centerLamp = util.grid().at(3, 1, 3); - Selection input = util.select().fromTo(3, 1, 1, 3, 1, 2); - Selection button = util.select().position(3, 1, 1); - Selection wire = util.select().position(3, 1, 2); - Selection output = util.select().fromTo(5, 1, 2, 5, 1, 1); - Selection comparator = util.select().fromTo(1, 1, 3, 0, 1, 3); + BlockPos centerLamp = util.grid() + .at(3, 1, 3); + Selection input = util.select() + .fromTo(3, 1, 1, 3, 1, 2); + Selection button = util.select() + .position(3, 1, 1); + Selection wire = util.select() + .position(3, 1, 2); + Selection output = util.select() + .fromTo(5, 1, 2, 5, 1, 1); + Selection comparator = util.select() + .fromTo(1, 1, 3, 0, 1, 3); scene.showBasePlate(); scene.idle(15); - ElementLink rowElement = - scene.world().showIndependentSection(util.select().position(centerLamp), Direction.DOWN); + ElementLink rowElement = scene.world() + .showIndependentSection(util.select() + .position(centerLamp), Direction.DOWN); scene.idle(5); - scene.world().showSection(input, Direction.SOUTH); + scene.world() + .showSection(input, Direction.SOUTH); scene.idle(15); - scene.world().toggleRedstonePower(input); - scene.effects().indicateRedstone(util.grid().at(3, 1, 1)); - scene.world().cycleBlockProperty(centerLamp, RoseQuartzLampBlock.POWERING); + scene.world() + .toggleRedstonePower(input); + scene.effects() + .indicateRedstone(util.grid() + .at(3, 1, 1)); + scene.world() + .cycleBlockProperty(centerLamp, RoseQuartzLampBlock.POWERING); scene.idle(15); - scene.overlay().showText(70) - .pointAt(util.vector().blockSurface(centerLamp, Direction.WEST)) + scene.overlay() + .showText(70) + .pointAt(util.vector() + .blockSurface(centerLamp, Direction.WEST)) .placeNearTarget() .attachKeyFrame() .text("Rose Quartz Lamps activate on a Redstone signal"); scene.idle(5); - scene.world().toggleRedstonePower(button); + scene.world() + .toggleRedstonePower(button); scene.idle(55); - scene.world().hideSection(input, Direction.EAST); + scene.world() + .hideSection(input, Direction.EAST); scene.idle(10); - ElementLink outputElement = scene.world().showIndependentSection(output, Direction.EAST); - scene.world().moveSection(outputElement, util.vector().of(-2, 0, 0), 0); + ElementLink outputElement = scene.world() + .showIndependentSection(output, Direction.EAST); + scene.world() + .moveSection(outputElement, util.vector() + .of(-2, 0, 0), 0); scene.idle(10); - scene.world().toggleRedstonePower(wire); - scene.world().toggleRedstonePower(output); + scene.world() + .toggleRedstonePower(wire); + scene.world() + .toggleRedstonePower(output); scene.idle(5); - scene.overlay().showText(70) - .pointAt(util.vector().blockSurface(centerLamp, Direction.WEST)) + scene.overlay() + .showText(70) + .pointAt(util.vector() + .blockSurface(centerLamp, Direction.WEST)) .placeNearTarget() .text("They will continue to emit redstone power afterwards"); scene.idle(60); - scene.world().hideIndependentSection(outputElement, Direction.NORTH); - scene.world().showSectionAndMerge(util.select().position(centerLamp.west()), Direction.EAST, rowElement); + scene.world() + .hideIndependentSection(outputElement, Direction.NORTH); + scene.world() + .showSectionAndMerge(util.select() + .position(centerLamp.west()), Direction.EAST, rowElement); scene.idle(3); - scene.world().showSectionAndMerge(util.select().position(centerLamp.east()), Direction.WEST, rowElement); + scene.world() + .showSectionAndMerge(util.select() + .position(centerLamp.east()), Direction.WEST, rowElement); scene.idle(25); - scene.overlay().showText(50) - .pointAt(util.vector().blockSurface(util.grid().at(2, 1, 3), Direction.WEST)) + scene.overlay() + .showText(50) + .pointAt(util.vector() + .blockSurface(util.grid() + .at(2, 1, 3), Direction.WEST)) .placeNearTarget() .attachKeyFrame() .text("When multiple lamps are arranged in a group..."); scene.idle(40); - ElementLink inputElement = scene.world().showIndependentSection(input, Direction.SOUTH); - scene.world().moveSection(inputElement, util.vector().of(1, 0, 0), 0); + ElementLink inputElement = scene.world() + .showIndependentSection(input, Direction.SOUTH); + scene.world() + .moveSection(inputElement, util.vector() + .of(1, 0, 0), 0); scene.idle(15); - scene.world().toggleRedstonePower(input); - scene.effects().indicateRedstone(util.grid().at(4, 1, 1)); - scene.world().cycleBlockProperty(centerLamp, RoseQuartzLampBlock.POWERING); - scene.world().cycleBlockProperty(centerLamp.east(), RoseQuartzLampBlock.POWERING); + scene.world() + .toggleRedstonePower(input); + scene.effects() + .indicateRedstone(util.grid() + .at(4, 1, 1)); + scene.world() + .cycleBlockProperty(centerLamp, RoseQuartzLampBlock.POWERING); + scene.world() + .cycleBlockProperty(centerLamp.east(), RoseQuartzLampBlock.POWERING); scene.idle(15); - scene.overlay().showText(80) - .pointAt(util.vector().blockSurface(util.grid().at(4, 1, 3), Direction.UP)) + scene.overlay() + .showText(80) + .pointAt(util.vector() + .blockSurface(util.grid() + .at(4, 1, 3), Direction.UP)) .placeNearTarget() .text("...activating a Lamp will focus the signal to it, deactivating all others"); scene.idle(5); - scene.world().toggleRedstonePower(button); + scene.world() + .toggleRedstonePower(button); scene.idle(60); - scene.world().hideIndependentSection(inputElement, Direction.NORTH); - scene.world().moveSection(rowElement, util.vector().of(1, 0, 0), 10); - scene.idle(15); - scene.world().showSectionAndMerge(comparator, Direction.EAST, rowElement); - scene.idle(15); - scene.world().toggleRedstonePower(comparator); scene.world() - .modifyBlockEntityNBT(comparator, NixieTubeBlockEntity.class, nbt -> nbt.putInt("RedstoneStrength", 13)); + .hideIndependentSection(inputElement, Direction.NORTH); + scene.world() + .moveSection(rowElement, util.vector() + .of(1, 0, 0), 10); + scene.idle(15); + scene.world() + .showSectionAndMerge(comparator, Direction.EAST, rowElement); + scene.idle(15); + scene.world() + .toggleRedstonePower(comparator); + scene.world() + .modifyBlockEntityNBT(comparator, NixieTubeBlockEntity.class, nbt -> nbt.putInt("RedstoneStrength", 13)); scene.idle(25); - scene.overlay().showText(80) - .pointAt(util.vector().blockSurface(util.grid().at(1, 1, 3), Direction.WEST)) + scene.overlay() + .showText(80) + .pointAt(util.vector() + .blockSurface(util.grid() + .at(1, 1, 3), Direction.WEST)) .placeNearTarget() .attachKeyFrame() .text("Comparators output based on the distance to a powered lamp"); scene.idle(90); - scene.overlay().showControls(util.vector().topOf(centerLamp.east(2)), Pointing.DOWN, 20).rightClick() - .withItem(AllItems.WRENCH.asStack()); - scene.idle(6); - scene.world().cycleBlockProperty(centerLamp.east(), RoseQuartzLampBlock.POWERING); - scene.world().toggleRedstonePower(comparator); - scene.world() - .modifyBlockEntityNBT(comparator, NixieTubeBlockEntity.class, nbt -> nbt.putInt("RedstoneStrength", 0)); - scene.idle(20); - - scene.overlay().showControls(util.vector().topOf(centerLamp), Pointing.DOWN, 20).rightClick() + scene.overlay() + .showControls(util.vector() + .topOf(centerLamp.east(2)), Pointing.DOWN, 20) + .rightClick() .withItem(AllItems.WRENCH.asStack()); scene.idle(6); - scene.world().cycleBlockProperty(centerLamp.west(), RoseQuartzLampBlock.POWERING); - scene.world().toggleRedstonePower(comparator); scene.world() - .modifyBlockEntityNBT(comparator, NixieTubeBlockEntity.class, nbt -> nbt.putInt("RedstoneStrength", 15)); + .cycleBlockProperty(centerLamp.east(), RoseQuartzLampBlock.POWERING); + scene.world() + .toggleRedstonePower(comparator); + scene.world() + .modifyBlockEntityNBT(comparator, NixieTubeBlockEntity.class, nbt -> nbt.putInt("RedstoneStrength", 0)); scene.idle(20); - scene.overlay().showText(80) - .pointAt(util.vector().blockSurface(util.grid().at(3, 1, 3), Direction.UP)) + scene.overlay() + .showControls(util.vector() + .topOf(centerLamp), Pointing.DOWN, 20) + .rightClick() + .withItem(AllItems.WRENCH.asStack()); + scene.idle(6); + scene.world() + .cycleBlockProperty(centerLamp.west(), RoseQuartzLampBlock.POWERING); + scene.world() + .toggleRedstonePower(comparator); + scene.world() + .modifyBlockEntityNBT(comparator, NixieTubeBlockEntity.class, nbt -> nbt.putInt("RedstoneStrength", 15)); + scene.idle(20); + + scene.overlay() + .showText(80) + .pointAt(util.vector() + .blockSurface(util.grid() + .at(3, 1, 3), Direction.UP)) .placeNearTarget() .attachKeyFrame() .text("The Lamps can also be toggled manually using a Wrench"); @@ -142,4 +211,166 @@ public class RedstoneScenes2 { } + public static void pulseTimer(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); + scene.title("pulse_timer", "Redstone output of the Pulse Timer"); + scene.configureBasePlate(0, 0, 5); + WorldInstructions world = scene.world(); + SelectionUtil select = util.select(); + world.showSection(select.layer(0), Direction.UP); + + BlockPos circuitPos = util.grid() + .at(2, 1, 2); + BlockPos leverPos = util.grid() + .at(4, 1, 2); + Vec3 circuitTop = util.vector() + .blockSurface(circuitPos, Direction.DOWN) + .add(0, 3 / 16f, 0); + + world.modifyBlockEntityNBT(select.position(circuitPos), PulseTimerBlockEntity.class, + nbt -> nbt.putInt("ScrollValue", 30)); + world.showSection(select.fromTo(1, 1, 2, 0, 1, 2), Direction.UP); + scene.idle(10); + world.showSection(select.position(circuitPos), Direction.DOWN); + scene.idle(8); + + for (int i = 0; i < 1; i++) { + scene.idle(12); + world.cycleBlockProperty(circuitPos, BrassDiodeBlock.POWERING); + world.toggleRedstonePower(select.fromTo(1, 1, 2, 0, 1, 2)); + scene.idle(2); + world.cycleBlockProperty(circuitPos, BrassDiodeBlock.POWERING); + world.toggleRedstonePower(select.position(1, 1, 2)); + scene.idle(1); + world.toggleRedstonePower(select.position(0, 1, 2)); + scene.idle(15); + } + + scene.overlay() + .showText(60) + .text("Pulse Timers repeatedly emit short pulses") + .attachKeyFrame() + .placeNearTarget() + .pointAt(circuitTop); + scene.idle(13); + + for (int i = 0; i < 3; i++) { + world.cycleBlockProperty(circuitPos, BrassDiodeBlock.POWERING); + world.toggleRedstonePower(select.fromTo(1, 1, 2, 0, 1, 2)); + scene.idle(2); + world.cycleBlockProperty(circuitPos, BrassDiodeBlock.POWERING); + world.toggleRedstonePower(select.position(1, 1, 2)); + scene.idle(1); + world.toggleRedstonePower(select.position(0, 1, 2)); + scene.idle(27); + } + + scene.overlay() + .showRepeaterScrollInput(circuitPos, 60); + scene.overlay() + .showControls(circuitTop, Pointing.DOWN, 60) + .rightClick(); + scene.idle(10); + scene.overlay() + .showText(60) + .text("Using the value panel, the time interval can be configured") + .attachKeyFrame() + .placeNearTarget() + .pointAt(circuitTop); + + world.modifyBlockEntityNBT(select.position(circuitPos), PulseTimerBlockEntity.class, + nbt -> nbt.putInt("ScrollValue", 100)); + scene.idle(70); + + world.showSection(select.fromTo(3, 1, 2, 4, 1, 2), Direction.WEST); + + scene.idle(20); + world.cycleBlockProperty(circuitPos, BrassDiodeBlock.POWERING); + world.toggleRedstonePower(select.fromTo(1, 1, 2, 0, 1, 2)); + scene.idle(2); + world.cycleBlockProperty(circuitPos, BrassDiodeBlock.POWERING); + world.toggleRedstonePower(select.position(1, 1, 2)); + scene.idle(1); + world.toggleRedstonePower(select.position(0, 1, 2)); + scene.idle(10); + + scene.effects() + .indicateRedstone(leverPos); + scene.world() + .toggleRedstonePower(util.select() + .fromTo(4, 1, 2, 2, 1, 2)); + scene.idle(30); + + scene.overlay() + .showText(60) + .text("Powering the input side will pause and reset them") + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector() + .topOf(4, 0, 2)); + scene.idle(70); + + world.hideSection(select.fromTo(3, 1, 2, 4, 1, 2), Direction.EAST); + scene.idle(5); + world.cycleBlockProperty(circuitPos, BrassDiodeBlock.POWERED); + world.hideSection(select.position(0, 1, 2), Direction.WEST); + scene.idle(10); + + scene.overlay() + .showControls(circuitTop.add(-.375, 0, .375), Pointing.DOWN, 60) + .rightClick(); + scene.idle(10); + world.cycleBlockProperty(circuitPos, BrassDiodeBlock.INVERTED); + world.toggleRedstonePower(select.position(1, 1, 2)); + scene.overlay() + .showText(60) + .text("Right-click the circuit base to invert the output") + .attachKeyFrame() + .placeNearTarget() + .pointAt(circuitTop.add(-.375, 0, .375)); + + scene.idle(70); + ElementLink link = world.showIndependentSection(select.position(0, 1, 4), Direction.EAST); + world.moveSection(link, util.vector() + .of(0, 0, -2), 0); + scene.idle(10); + + world.cycleBlockProperty(circuitPos, BrassDiodeBlock.POWERING); + world.toggleRedstonePower(select.fromTo(1, 1, 2, 0, 1, 2)); + scene.idle(3); + world.cycleBlockProperty(circuitPos, BrassDiodeBlock.POWERING); + world.toggleRedstonePower(select.position(1, 1, 2)); + scene.idle(1); + world.toggleRedstonePower(select.position(0, 1, 2)); + scene.idle(10); + + scene.overlay() + .showText(80) + .text("This helps trigger mechanisms that activate only without a redstone signal") + .placeNearTarget() + .pointAt(util.vector() + .centerOf(0, 1, 2)); + + scene.idle(86); + world.cycleBlockProperty(circuitPos, BrassDiodeBlock.POWERING); + world.toggleRedstonePower(select.fromTo(1, 1, 2, 0, 1, 2)); + scene.idle(3); + world.cycleBlockProperty(circuitPos, BrassDiodeBlock.POWERING); + world.toggleRedstonePower(select.position(1, 1, 2)); + scene.idle(1); + world.toggleRedstonePower(select.position(0, 1, 2)); + scene.idle(10); + + scene.markAsFinished(); + + scene.idle(86); + world.cycleBlockProperty(circuitPos, BrassDiodeBlock.POWERING); + world.toggleRedstonePower(select.fromTo(1, 1, 2, 0, 1, 2)); + scene.idle(3); + world.cycleBlockProperty(circuitPos, BrassDiodeBlock.POWERING); + world.toggleRedstonePower(select.position(1, 1, 2)); + scene.idle(1); + world.toggleRedstonePower(select.position(0, 1, 2)); + } + } diff --git a/src/main/resources/assets/create/ponder/chain_conveyor.nbt b/src/main/resources/assets/create/ponder/chain_conveyor.nbt new file mode 100644 index 0000000000000000000000000000000000000000..75c7bec3f5c32f854231220ca683a478aaf0dd17 GIT binary patch literal 956 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 literal 0 HcmV?d00001 From 3950679be81b8e9fb8c5d95eef607ed75404c174 Mon Sep 17 00:00:00 2001 From: Kryppers <65094918+Kryppers@users.noreply.github.com> Date: Fri, 10 Jan 2025 01:05:32 +0000 Subject: [PATCH 277/515] fix basin canal --- .../create/textures/block/basin_canal.png | Bin 295 -> 471 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/create/textures/block/basin_canal.png b/src/main/resources/assets/create/textures/block/basin_canal.png index 28f6a888942fe1c1b46cbc3618e005a050e01f6c..bd749690e51a338495b0969a50a905766bc37649 100644 GIT binary patch delta 431 zcmV;g0Z{&@0@nkO7#j!%0000V^Z#K0000JJOGiWiHvl&PH*?#G^O1KRf9U}V0R%AY zHMXGu00Cr4L_t(I%cYaSPTN2fMNceeCU4XxP81M{_yeS_TB(2GE&a@_$Y;O~!4@SI zm6A!QW^7|H3+fS0OpwZ5&YQXKzI)$vex09JN5dfid6u#D9)P|Gy4M5X&w7oumW%nk z1MuVf&kDeKN8A@7&oX|me^wNEP7P}Tzp{t^BX2b-N2xxTPMO}L=o?GjY`#19;9J&)3kq-%WNBA!V8~eAl7JsBbX^jzK zkbG$;05}phRfGiPVts`^-`$onM>8`-8e;-JOUol28W{h*L zu@7;P=NO}2qbkb~S64-J<2Xcld38;eZ5j=Fy#bNZnj}fy^&m+Sl-7HX0kUjE#3vCO z5l$x)`Xbb8UF11R>+q=#5-b+?!Nj-AQu|@o4~Ge+(_>C26YiGFy_Gd%3CeD62dyT) Z0L-?k&PDHLkV1h8&yI24K delta 280 zcmcc4yqsx*L_G^L0|Ud`yN`l^ltF+`h^u}<9*|jDSeTcYnVy&!84=;{@9*j1;o{?FoDXAbRCQL70(Y)*K0-AbW|YuPgft?s^#kBaS73Q@wy<1)eUBAsp9}3xdiFgFGM1Ihr6d zZCciy16yYuoZ8r^xTK-jv{`z>#7hh*EsT;Yc?~8q%{am0r*ib1!&|l3-C@Qq=jK=z zXB|5e$&>j~HZ?Q-{k=pEMx&Vb_x5%tSj=i^oz);A`}V1*Y=YqR3j)Fmk{GhK8wobt Tbd{gTe~DWM4f8(vy& From f9c774e338624817f94bf892757206ed26f7688f Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 10 Jan 2025 10:13:44 +0100 Subject: [PATCH 278/515] Conveyor improv - Fixed ponder scenes with conveyors having inconsistent outcomes based on server tps --- .../kinetics/chainConveyor/ChainConveyorBlockEntity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java index 6d01c3059c..2fe5a08376 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java @@ -135,7 +135,7 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity implements ITra removeInvalidConnections(); } - float serverSpeed = level.isClientSide() ? ServerSpeedProvider.get() : 1f; + float serverSpeed = level.isClientSide() && !isVirtual() ? ServerSpeedProvider.get() : 1f; float speed = getSpeed() / 360f; float radius = 1.5f; float distancePerTick = Math.abs(speed); From 94d17bc34f41e3f94da51edfc09f55a53ad78fcb Mon Sep 17 00:00:00 2001 From: IThundxr Date: Fri, 10 Jan 2025 21:35:47 -0500 Subject: [PATCH 279/515] Ant Schematics - Fix schematic gametest --- .../content/schematics/SchematicInstances.java | 2 +- .../create/content/schematics/SchematicItem.java | 16 +++++++++------- .../content/schematics/SchematicPrinter.java | 2 +- .../schematics/ServerSchematicLoader.java | 4 ++-- .../schematics/client/SchematicHandler.java | 2 +- .../infrastructure/gametest/tests/TestMisc.java | 2 +- 6 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/schematics/SchematicInstances.java b/src/main/java/com/simibubi/create/content/schematics/SchematicInstances.java index 2806aa76fc..3f7f49a42e 100644 --- a/src/main/java/com/simibubi/create/content/schematics/SchematicInstances.java +++ b/src/main/java/com/simibubi/create/content/schematics/SchematicInstances.java @@ -51,7 +51,7 @@ public class SchematicInstances { return null; StructureTemplate activeTemplate = - SchematicItem.loadSchematic(wrapped.holderLookup(Registries.BLOCK), schematic); + SchematicItem.loadSchematic(wrapped, schematic); if (activeTemplate.getSize() .equals(Vec3i.ZERO)) diff --git a/src/main/java/com/simibubi/create/content/schematics/SchematicItem.java b/src/main/java/com/simibubi/create/content/schematics/SchematicItem.java index 1da29ad96e..b497b4d3d3 100644 --- a/src/main/java/com/simibubi/create/content/schematics/SchematicItem.java +++ b/src/main/java/com/simibubi/create/content/schematics/SchematicItem.java @@ -14,6 +14,8 @@ import javax.annotation.Nonnull; import net.createmod.catnip.platform.CatnipServices; +import net.minecraft.core.registries.Registries; + import org.slf4j.Logger; import com.mojang.logging.LogUtils; @@ -58,7 +60,7 @@ public class SchematicItem extends Item { super(properties); } - public static ItemStack create(HolderGetter lookup, String schematic, String owner) { + public static ItemStack create(Level level, String schematic, String owner) { ItemStack blueprint = AllItems.SCHEMATIC.asStack(); CompoundTag tag = new CompoundTag(); @@ -70,7 +72,7 @@ public class SchematicItem extends Item { tag.putString("Mirror", Mirror.NONE.name()); blueprint.setTag(tag); - writeSize(lookup, blueprint); + writeSize(level, blueprint); return blueprint; } @@ -88,9 +90,9 @@ public class SchematicItem extends Item { super.appendHoverText(stack, worldIn, tooltip, flagIn); } - public static void writeSize(HolderGetter lookup, ItemStack blueprint) { + public static void writeSize(Level level, ItemStack blueprint) { CompoundTag tag = blueprint.getTag(); - StructureTemplate t = loadSchematic(lookup, blueprint); + StructureTemplate t = loadSchematic(level, blueprint); tag.put("Bounds", NBTHelper.writeVec3i(t.getSize())); blueprint.setTag(tag); SchematicInstances.clearHash(blueprint); @@ -110,7 +112,7 @@ public class SchematicItem extends Item { return settings; } - public static StructureTemplate loadSchematic(HolderGetter lookup, ItemStack blueprint) { + public static StructureTemplate loadSchematic(Level level, ItemStack blueprint) { StructureTemplate t = new StructureTemplate(); String owner = blueprint.getTag() .getString("Owner"); @@ -123,7 +125,7 @@ public class SchematicItem extends Item { Path dir; Path file; - if (CatnipServices.PLATFORM.getEnv().isServer()) { + if (!level.isClientSide()) { dir = Paths.get("schematics", "uploaded").toAbsolutePath(); file = Paths.get(owner, schematic); } else { @@ -138,7 +140,7 @@ public class SchematicItem extends Item { try (DataInputStream stream = new DataInputStream(new BufferedInputStream( new GZIPInputStream(Files.newInputStream(path, StandardOpenOption.READ))))) { CompoundTag nbt = NbtIo.read(stream, new NbtAccounter(0x20000000L)); - t.load(lookup, nbt); + t.load(level.holderLookup(Registries.BLOCK), nbt); } catch (IOException e) { LOGGER.warn("Failed to read schematic", e); } diff --git a/src/main/java/com/simibubi/create/content/schematics/SchematicPrinter.java b/src/main/java/com/simibubi/create/content/schematics/SchematicPrinter.java index 67b03d7709..6785baddfc 100644 --- a/src/main/java/com/simibubi/create/content/schematics/SchematicPrinter.java +++ b/src/main/java/com/simibubi/create/content/schematics/SchematicPrinter.java @@ -93,7 +93,7 @@ public class SchematicPrinter { return; StructureTemplate activeTemplate = - SchematicItem.loadSchematic(originalWorld.holderLookup(Registries.BLOCK), blueprint); + SchematicItem.loadSchematic(originalWorld, blueprint); StructurePlaceSettings settings = SchematicItem.getSettings(blueprint, processNBT); schematicAnchor = NbtUtils.readBlockPos(blueprint.getTag() diff --git a/src/main/java/com/simibubi/create/content/schematics/ServerSchematicLoader.java b/src/main/java/com/simibubi/create/content/schematics/ServerSchematicLoader.java index c41dbe76c3..bd3449f27b 100644 --- a/src/main/java/com/simibubi/create/content/schematics/ServerSchematicLoader.java +++ b/src/main/java/com/simibubi/create/content/schematics/ServerSchematicLoader.java @@ -270,7 +270,7 @@ public class ServerSchematicLoader { if (table == null) return; table.finishUpload(); - table.inventory.setStackInSlot(1, SchematicItem.create(world.holderLookup(Registries.BLOCK), schematic, player.getGameProfile() + table.inventory.setStackInSlot(1, SchematicItem.create(world, schematic, player.getGameProfile() .getName())); } catch (IOException e) { @@ -319,7 +319,7 @@ public class ServerSchematicLoader { ); if (result != null) player.setItemInHand(InteractionHand.MAIN_HAND, - SchematicItem.create(world.holderLookup(Registries.BLOCK), schematic, playerName)); + SchematicItem.create(world, schematic, playerName)); else CreateLang.translate("schematicAndQuill.instant_failed") .style(ChatFormatting.RED) diff --git a/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java b/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java index 699d6f532c..2ba6dd68ef 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java @@ -153,7 +153,7 @@ public class SchematicHandler implements IGuiOverlay { private void setupRenderer() { Level clientWorld = Minecraft.getInstance().level; StructureTemplate schematic = - SchematicItem.loadSchematic(clientWorld.holderLookup(Registries.BLOCK), activeSchematicItem); + SchematicItem.loadSchematic(clientWorld, activeSchematicItem); Vec3i size = schematic.getSize(); if (size.equals(Vec3i.ZERO)) return; diff --git a/src/main/java/com/simibubi/create/infrastructure/gametest/tests/TestMisc.java b/src/main/java/com/simibubi/create/infrastructure/gametest/tests/TestMisc.java index 4a090ae176..2d2487f0c5 100644 --- a/src/main/java/com/simibubi/create/infrastructure/gametest/tests/TestMisc.java +++ b/src/main/java/com/simibubi/create/infrastructure/gametest/tests/TestMisc.java @@ -40,7 +40,7 @@ public class TestMisc { level, whiteEndBottom, redEndTop ); ItemStack schematic = - SchematicItem.create(level.holderLookup(Registries.BLOCK), "schematicannon_gametest.nbt", "Deployer"); + SchematicItem.create(level, "schematicannon_gametest.nbt", "Deployer"); // deploy to pos BlockPos anchor = helper.absolutePos(new BlockPos(1, 2, 1)); schematic.getOrCreateTag().putBoolean("Deployed", true); From dfb0ff65c3c0488b49ac2d2539e5cf652484fa0a Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Sat, 11 Jan 2025 13:21:58 +0100 Subject: [PATCH 280/515] Package deal - Ponder scenes for the packager --- .../content/logistics/box/PackageEntity.java | 8 + .../content/logistics/box/PackageItem.java | 2 +- .../ponder/AllCreatePonderScenes.java | 12 +- .../FrogAndConveyorScenes.java | 55 +- .../scenes/highLogistics/PackagerScenes.java | 569 ++++++++++++++++++ .../scenes/highLogistics/PonderHilo.java | 54 ++ .../{ => high_logistics}/chain_conveyor.nbt | Bin .../{ => high_logistics}/package_frogport.nbt | Bin .../create/ponder/high_logistics/packager.nbt | Bin 0 -> 1236 bytes .../high_logistics/packager_address.nbt | Bin 0 -> 2415 bytes .../assets/minecraft/atlases/blocks.json | 4 - 11 files changed, 662 insertions(+), 42 deletions(-) rename src/main/java/com/simibubi/create/infrastructure/ponder/scenes/{ => highLogistics}/FrogAndConveyorScenes.java (97%) create mode 100644 src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/PackagerScenes.java create mode 100644 src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/PonderHilo.java rename src/main/resources/assets/create/ponder/{ => high_logistics}/chain_conveyor.nbt (100%) rename src/main/resources/assets/create/ponder/{ => high_logistics}/package_frogport.nbt (100%) create mode 100644 src/main/resources/assets/create/ponder/high_logistics/packager.nbt create mode 100644 src/main/resources/assets/create/ponder/high_logistics/packager_address.nbt diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java index ffa2718e33..5aa7c56d11 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java @@ -13,6 +13,7 @@ import com.simibubi.create.content.logistics.chute.ChuteBlock; import net.createmod.catnip.utility.VecHelper; import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.ponder.api.level.PonderLevel; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; @@ -169,6 +170,13 @@ public class PackageEntity extends LivingEntity implements IEntityAdditionalSpaw verifyInitialEntity(); originalEntity = null; } + + if (level() instanceof PonderLevel) { + setDeltaMovement(getDeltaMovement().add(0, -0.06, 0)); + if (position().y < 0.125) + discard(); + } + insertionDelay = Math.min(insertionDelay + 1, 30); super.tick(); diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java index 1bdf5909e6..3e5fe59a07 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java @@ -201,7 +201,7 @@ public class PackageItem extends Item { if (compoundnbt.contains("Address", Tag.TAG_STRING) && !compoundnbt.getString("Address") .isBlank()) - pTooltipComponents.add(Components.literal("-> " + compoundnbt.getString("Address")) + pTooltipComponents.add(Components.literal("\u2192 " + compoundnbt.getString("Address")) .withStyle(ChatFormatting.GOLD)); /* diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderScenes.java index 4e82b92d44..1d56d16323 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderScenes.java @@ -19,7 +19,6 @@ import com.simibubi.create.infrastructure.ponder.scenes.DisplayScenes; import com.simibubi.create.infrastructure.ponder.scenes.EjectorScenes; import com.simibubi.create.infrastructure.ponder.scenes.ElevatorScenes; import com.simibubi.create.infrastructure.ponder.scenes.FanScenes; -import com.simibubi.create.infrastructure.ponder.scenes.FrogAndConveyorScenes; import com.simibubi.create.infrastructure.ponder.scenes.FunnelScenes; import com.simibubi.create.infrastructure.ponder.scenes.GantryScenes; import com.simibubi.create.infrastructure.ponder.scenes.ItemVaultScenes; @@ -42,6 +41,8 @@ import com.simibubi.create.infrastructure.ponder.scenes.fluid.HosePulleyScenes; import com.simibubi.create.infrastructure.ponder.scenes.fluid.PipeScenes; import com.simibubi.create.infrastructure.ponder.scenes.fluid.PumpScenes; import com.simibubi.create.infrastructure.ponder.scenes.fluid.SpoutScenes; +import com.simibubi.create.infrastructure.ponder.scenes.highLogistics.FrogAndConveyorScenes; +import com.simibubi.create.infrastructure.ponder.scenes.highLogistics.PackagerScenes; import com.simibubi.create.infrastructure.ponder.scenes.trains.TrackObserverScenes; import com.simibubi.create.infrastructure.ponder.scenes.trains.TrackScenes; import com.simibubi.create.infrastructure.ponder.scenes.trains.TrainScenes; @@ -350,10 +351,13 @@ public class AllCreatePonderScenes { // Hilo HELPER.forComponents(AllBlocks.CHAIN_CONVEYOR) - .addStoryBoard("chain_conveyor", FrogAndConveyorScenes::conveyor); + .addStoryBoard("high_logistics/chain_conveyor", FrogAndConveyorScenes::conveyor); HELPER.forComponents(AllBlocks.PACKAGE_FROGPORT) - .addStoryBoard("package_frogport", FrogAndConveyorScenes::frogPort); - + .addStoryBoard("high_logistics/package_frogport", FrogAndConveyorScenes::frogPort); + HELPER.forComponents(AllBlocks.PACKAGER) + .addStoryBoard("high_logistics/packager", PackagerScenes::packager) + .addStoryBoard("high_logistics/packager_address", PackagerScenes::packagerAddress); + // Trains HELPER.forComponents(TrackMaterial.allBlocks() .stream() diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/FrogAndConveyorScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/FrogAndConveyorScenes.java similarity index 97% rename from src/main/java/com/simibubi/create/infrastructure/ponder/scenes/FrogAndConveyorScenes.java rename to src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/FrogAndConveyorScenes.java index 53cd2921a3..7c83de7bd4 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/FrogAndConveyorScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/FrogAndConveyorScenes.java @@ -1,4 +1,4 @@ -package com.simibubi.create.infrastructure.ponder.scenes; +package com.simibubi.create.infrastructure.ponder.scenes.highLogistics; import java.util.Iterator; import java.util.function.Supplier; @@ -564,10 +564,19 @@ public class FrogAndConveyorScenes { scene.world() .multiplyKineticSpeed(util.select() .fromTo(9, 0, 1, 5, 1, 0), 1 / 32f); - scene.idle(5); scene.overlay() - .showText(75) + .showText(60) + .attachKeyFrame() + .text("If a package is addressed to a different name..") + .pointAt(util.vector() + .topOf(5, 0, 3)) + .placeNearTarget(); + + scene.idle(70); + + scene.overlay() + .showText(40) .colored(PonderPalette.BLUE) .text("Albert") .pointAt(util.vector() @@ -575,24 +584,15 @@ public class FrogAndConveyorScenes { .placeNearTarget(); scene.idle(5); scene.overlay() - .showText(70) + .showText(40) .colored(PonderPalette.OUTPUT) - .text("Peter") + .text("\u2192 Peter") .pointAt(util.vector() .centerOf(util.grid() .at(5, 2, 0))) .placeNearTarget(); - scene.idle(30); - scene.overlay() - .showText(80) - .attachKeyFrame() - .text("If a package is addressed to a different name..") - .pointAt(util.vector() - .topOf(5, 0, 3)) - .placeNearTarget(); - - scene.idle(60); + scene.idle(50); scene.world() .multiplyKineticSpeed(util.select() @@ -712,7 +712,7 @@ public class FrogAndConveyorScenes { scene.overlay() .showText(55) .colored(PonderPalette.OUTPUT) - .text("Peter") + .text("\u2192 Peter") .pointAt(util.vector() .centerOf(util.grid() .at(0, 2, 5))) @@ -775,7 +775,7 @@ public class FrogAndConveyorScenes { scene.world() .showIndependentSection(fromPackager, Direction.WEST); ElementLink toPackagerE = scene.world() - .showIndependentSection(toPackager, Direction.WEST); + .showIndependentSection(toPackager, Direction.EAST); scene.world() .moveSection(toPackagerE, util.vector() .of(0, 0, 1), 0); @@ -849,14 +849,8 @@ public class FrogAndConveyorScenes { .fromTo(5, 1, 2, 6, 1, 1)); scene.idle(5); - scene.world() - .modifyBlockEntity(util.grid() - .at(5, 1, 2), PackagerBlockEntity.class, be -> { - be.animationTicks = PackagerBlockEntity.CYCLE; - be.animationInward = false; - be.heldBox = box; - }); - + PonderHilo.packagerCreate(scene, util.grid() + .at(5, 1, 2), box); scene.idle(30); scene.world() @@ -873,15 +867,10 @@ public class FrogAndConveyorScenes { .modifyBlockEntity(conv2, ChainConveyorBlockEntity.class, be -> boxTransfer(conv1, conv2, be)); scene.idle(50); - scene.world() - .modifyBlockEntity(util.grid() - .at(2, 1, 4), PackagerBlockEntity.class, be -> { - be.animationTicks = PackagerBlockEntity.CYCLE; - be.animationInward = true; - be.previouslyUnwrapped = box; - }); - + PonderHilo.packagerUnpack(scene, util.grid() + .at(2, 1, 4), box); scene.idle(20); + scene.overlay() .showControls(util.vector() .blockSurface(util.grid() diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/PackagerScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/PackagerScenes.java new file mode 100644 index 0000000000..e713358119 --- /dev/null +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/PackagerScenes.java @@ -0,0 +1,569 @@ +package com.simibubi.create.infrastructure.ponder.scenes.highLogistics; + +import java.util.List; + +import com.simibubi.create.AllItems; +import com.simibubi.create.content.logistics.box.PackageItem; +import com.simibubi.create.content.logistics.box.PackageStyles; +import com.simibubi.create.foundation.ponder.CreateSceneBuilder; + +import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.PonderPalette; +import net.createmod.ponder.api.element.ElementLink; +import net.createmod.ponder.api.element.WorldSectionElement; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; +import net.createmod.ponder.api.scene.Selection; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; + +public class PackagerScenes { + + public static void packager(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); + scene.title("packager", "Creating and unwrapping packages"); + scene.configureBasePlate(0, 0, 7); + scene.showBasePlate(); + + Selection chest1 = util.select() + .fromTo(5, 2, 3, 5, 2, 4); + BlockPos funnel1 = util.grid() + .at(4, 2, 2); + BlockPos funnel2 = util.grid() + .at(1, 2, 2); + Selection funnel1S = util.select() + .position(funnel1); + Selection funnel2S = util.select() + .position(funnel2); + BlockPos packager1 = util.grid() + .at(5, 2, 2); + BlockPos packager2 = util.grid() + .at(1, 2, 3); + Selection packager1S = util.select() + .position(packager1); + Selection packager2S = util.select() + .position(packager2); + Selection largeCog = util.select() + .position(7, 0, 3); + Selection cogNBelt = util.select() + .fromTo(6, 1, 2, 0, 1, 2) + .add(util.select() + .position(6, 1, 3)); + BlockPos lever = util.grid() + .at(5, 3, 2); + Selection scaff1 = util.select() + .fromTo(5, 1, 3, 5, 1, 4); + Selection scaff2 = util.select() + .fromTo(1, 1, 3, 1, 1, 4); + scene.idle(5); + + ElementLink chestL = scene.world() + .showIndependentSection(chest1, Direction.DOWN); + scene.world() + .moveSection(chestL, util.vector() + .of(-2, -1, 0), 0); + scene.idle(10); + ElementLink packagerL = scene.world() + .showIndependentSection(packager1S, Direction.SOUTH); + scene.world() + .moveSection(packagerL, util.vector() + .of(-2, -1, 0), 0); + scene.idle(20); + + ItemStack dirt = new ItemStack(Items.DIRT); + scene.overlay() + .showControls(util.vector() + .of(2.5, 3, 2.5), Pointing.DOWN, 40) + .withItem(dirt); + scene.idle(20); + + scene.overlay() + .showText(80) + .text("Place packagers next to the inventory they should target") + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector() + .of(2, 2.5, 2.5)); + scene.idle(60); + + ElementLink leverL = scene.world() + .showIndependentSection(util.select() + .position(lever), Direction.DOWN); + scene.world() + .moveSection(leverL, util.vector() + .of(-2, -1, 0), 0); + scene.idle(30); + + scene.world() + .toggleRedstonePower(util.select() + .fromTo(lever, packager1)); + scene.effects() + .indicateRedstone(lever.west(2) + .below()); + + scene.idle(10); + ItemStack box = PackageStyles.getDefaultBox() + .copy(); + PackageItem.addAddress(box, "Warehouse"); + PonderHilo.packagerCreate(scene, packager1, box); + scene.idle(30); + + scene.overlay() + .showText(80) + .text("Given redstone power, it will pack items from the inventory into a package") + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector() + .blockSurface(util.grid() + .at(3, 1, 2), Direction.UP)); + scene.idle(30); + + scene.idle(80); + + scene.world() + .moveSection(leverL, util.vector() + .of(2, 1, 0), 10); + scene.world() + .moveSection(packagerL, util.vector() + .of(2, 1, 0), 10); + scene.world() + .moveSection(chestL, util.vector() + .of(2, 1, 0), 10); + scene.world() + .showSection(scaff1, Direction.UP); + scene.idle(10); + scene.world() + .showSection(largeCog, Direction.UP); + scene.world() + .showSection(cogNBelt, Direction.SOUTH); + scene.idle(10); + scene.world() + .showSection(funnel1S, Direction.DOWN); + scene.idle(15); + scene.world() + .createItemOnBelt(util.grid() + .at(4, 1, 2), Direction.EAST, box); + PonderHilo.packagerClear(scene, packager1); + scene.idle(20); + scene.world() + .toggleRedstonePower(util.select() + .fromTo(5, 2, 2, 5, 3, 2)); + scene.idle(10); + + scene.world() + .multiplyKineticSpeed(util.select() + .everywhere(), 1 / 16f); + + scene.overlay() + .showText(70) + .text("These can be picked up and transported like any other item") + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector() + .blockSurface(util.grid() + .at(3, 2, 2), Direction.EAST)); + + scene.idle(80); + scene.world() + .multiplyKineticSpeed(util.select() + .everywhere(), 16f); + scene.idle(10); + + scene.world() + .showSection(scaff2, Direction.DOWN); + scene.idle(5); + scene.world() + .showSection(packager2S, Direction.DOWN); + scene.world() + .showSection(util.select() + .position(1, 2, 4), Direction.DOWN); + scene.idle(10); + scene.world() + .showSection(funnel2S, Direction.SOUTH); + scene.rotateCameraY(-15); + scene.idle(40); + + scene.world() + .removeItemsFromBelt(util.grid() + .at(1, 1, 2)); + scene.world() + .flapFunnel(util.grid() + .at(1, 2, 2), false); + PonderHilo.packagerUnpack(scene, packager2, box); + + scene.idle(20); + scene.overlay() + .showControls(util.vector() + .topOf(util.grid() + .at(1, 2, 4)), + Pointing.DOWN, 40) + .withItem(dirt); + scene.idle(20); + + scene.overlay() + .showText(90) + .text("Packages inserted will be destroyed, unpacking the contents into the inventory") + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector() + .blockSurface(util.grid() + .at(1, 2, 3), Direction.WEST)); + scene.idle(100); + + scene.world() + .toggleRedstonePower(util.select() + .fromTo(5, 2, 2, 5, 3, 2)); + scene.effects() + .indicateRedstone(util.grid() + .at(5, 3, 2)); + PonderHilo.packagerCreate(scene, packager1, box); + scene.idle(25); + + scene.world() + .createItemOnBelt(util.grid() + .at(4, 1, 2), Direction.EAST, box); + PonderHilo.packagerClear(scene, packager1); + scene.idle(30); + + scene.overlay() + .showText(60) + .text("Full") + .colored(PonderPalette.RED) + .placeNearTarget() + .pointAt(util.vector() + .topOf(util.grid() + .at(1, 2, 4))); + scene.idle(80); + + scene.overlay() + .showOutlineWithText(util.select() + .fromTo(1, 2, 3, 1, 2, 4), 90) + .text("Packagers will not accept packages they cannot fully unpack") + .colored(PonderPalette.RED) + .placeNearTarget() + .attachKeyFrame() + .pointAt(util.vector() + .blockSurface(util.grid() + .at(1, 2, 3), Direction.WEST)); + scene.idle(40); + + PonderHilo.packageHopsOffBelt(scene, util.grid() + .at(0, 1, 2), Direction.WEST); + scene.idle(40); + + } + + public static void packagerAddress(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); + scene.title("packager_address", "Routing packages with an address"); + scene.configureBasePlate(0, 0, 9); + scene.scaleSceneView(.875f); + scene.showBasePlate(); + + Selection frogport = util.select() + .position(7, 1, 1); + Selection postbox = util.select() + .fromTo(6, 1, 2, 6, 2, 2); + Selection northBelt = util.select() + .fromTo(3, 1, 3, 4, 1, 0); + Selection initialKinetics = util.select() + .fromTo(3, 1, 5, 3, 1, 9); + Selection largeCog = util.select() + .position(2, 0, 9); + Selection saw = util.select() + .fromTo(2, 1, 5, 0, 1, 4); + Selection eastBelt = util.select() + .fromTo(3, 1, 4, 8, 1, 4); + Selection tunnelS = util.select() + .position(4, 2, 4); + Selection chest = util.select() + .fromTo(7, 2, 8, 7, 2, 7); + Selection scaffold = util.select() + .fromTo(7, 1, 8, 7, 1, 7); + BlockPos packager = util.grid() + .at(7, 2, 6); + Selection packagerAndLever = util.select() + .fromTo(7, 2, 6, 7, 3, 6); + Selection packagerBelt = util.select() + .fromTo(7, 1, 6, 4, 1, 6); + BlockPos funnel = util.grid() + .at(6, 2, 6); + Selection signS = util.select() + .position(7, 2, 5); + + scene.idle(10); + ElementLink chestL = scene.world() + .showIndependentSection(chest, Direction.DOWN); + scene.world() + .moveSection(chestL, util.vector() + .of(-2, -1, -2), 0); + scene.idle(5); + scene.world() + .showSectionAndMerge(packagerAndLever, Direction.SOUTH, chestL); + scene.idle(20); + + scene.world() + .showSectionAndMerge(signS, Direction.SOUTH, chestL); + scene.idle(15); + + scene.overlay() + .showText(40) + .text("Warehouse") + .colored(PonderPalette.OUTPUT) + .placeNearTarget() + .pointAt(util.vector() + .blockSurface(util.grid() + .at(5, 1, 4), Direction.NORTH) + .add(-0.5, 0, 0)); + scene.idle(50); + + scene.overlay() + .showText(60) + .text("When a sign is placed on a packager..") + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector() + .blockSurface(util.grid() + .at(5, 1, 4), Direction.NORTH) + .add(-0.5, 0, 0)); + scene.idle(50); + + scene.world() + .toggleRedstonePower(packagerAndLever); + scene.effects() + .indicateRedstone(util.grid() + .at(5, 1, 4)); + ItemStack box = PackageStyles.getDefaultBox() + .copy(); + PonderHilo.packagerCreate(scene, packager, box); + + scene.idle(20); + scene.world() + .moveSection(chestL, util.vector() + .of(0, 1, 0), 10); + scene.idle(10); + scene.world() + .showSectionAndMerge(scaffold, Direction.NORTH, chestL); + scene.world() + .showSection(largeCog, Direction.UP); + scene.world() + .showSection(initialKinetics, Direction.NORTH); + scene.world() + .showSectionAndMerge(packagerBelt, Direction.SOUTH, chestL); + scene.idle(5); + scene.world() + .showSectionAndMerge(util.select() + .position(funnel), Direction.DOWN, chestL); + scene.idle(15); + + PonderHilo.packagerClear(scene, packager); + scene.world() + .createItemOnBelt(util.grid() + .at(6, 1, 6), Direction.EAST, box); + scene.idle(20); + + scene.world() + .multiplyKineticSpeed(util.select() + .everywhere(), 1 / 32f); + scene.overlay() + .showText(40) + .text("\u2192 Warehouse") + .colored(PonderPalette.OUTPUT) + .placeNearTarget() + .pointAt(util.vector() + .blockSurface(util.grid() + .at(3, 2, 4), Direction.NORTH)); + scene.idle(50); + + scene.overlay() + .showText(100) + .text("Created packages will carry the written line of text as their address") + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector() + .blockSurface(util.grid() + .at(3, 2, 4), Direction.NORTH) + .add(-0.5, 0, 0)); + scene.idle(120); + + scene.world() + .hideIndependentSection(chestL, Direction.NORTH); + scene.idle(15); + scene.world() + .removeItemsFromBelt(util.grid() + .at(5, 1, 6)); + scene.world() + .removeItemsFromBelt(util.grid() + .at(4, 1, 6)); + scene.idle(15); + + scene.world() + .showSection(eastBelt, Direction.WEST); + scene.idle(5); + scene.world() + .showSection(tunnelS, Direction.DOWN); + scene.idle(5); + scene.world() + .showSection(saw, Direction.EAST); + scene.idle(5); + scene.world() + .showSection(northBelt, Direction.SOUTH); + scene.rotateCameraY(-15); + scene.idle(15); + + scene.overlay() + .showControls(util.vector() + .of(4, 2.825, 4.5), Pointing.DOWN, 60) + .withItem(AllItems.PACKAGE_FILTER.asStack()); + scene.idle(10); + scene.overlay() + .showFilterSlotInput(util.vector() + .of(4.1, 2.825, 4.5), 50); + scene.idle(30); + + scene.overlay() + .showText(70) + .text("Package filters route packages based on their address") + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector() + .of(4, 2.825, 4.5)); + scene.idle(70); + + ItemStack warehouseBox = PackageStyles.getDefaultBox() + .copy(); + ItemStack factoryBox = PackageItem.containing(List.of(new ItemStack(Items.IRON_INGOT))); + PackageItem.addAddress(warehouseBox, "Warehouse"); + PackageItem.addAddress(factoryBox, "Factory"); + + scene.world() + .createItemOnBelt(util.grid() + .at(6, 1, 4), Direction.EAST, warehouseBox); + scene.idle(10); + + scene.overlay() + .showText(50) + .text("\u2192 Warehouse") + .colored(PonderPalette.OUTPUT) + .placeNearTarget() + .pointAt(util.vector() + .blockSurface(util.grid() + .at(7, 2, 4), Direction.WEST)); + scene.overlay() + .showText(50) + .colored(PonderPalette.BLUE) + .text("Factory") + .placeNearTarget() + .pointAt(util.vector() + .of(4, 2.825, 4.5)); + scene.idle(60); + + scene.world() + .multiplyKineticSpeed(util.select() + .everywhere(), 32f); + + scene.idle(60); + + scene.world() + .createItemOnBelt(util.grid() + .at(6, 1, 4), Direction.EAST, factoryBox); + scene.world() + .multiplyKineticSpeed(util.select() + .everywhere(), 1 / 32f); + scene.idle(10); + + scene.overlay() + .showText(50) + .text("\u2192 Factory") + .colored(PonderPalette.OUTPUT) + .placeNearTarget() + .pointAt(util.vector() + .blockSurface(util.grid() + .at(7, 2, 4), Direction.WEST)); + scene.overlay() + .showText(50) + .colored(PonderPalette.BLUE) + .text("Factory") + .placeNearTarget() + .pointAt(util.vector() + .of(4, 2.825, 4.5)); + scene.idle(60); + + scene.world() + .multiplyKineticSpeed(util.select() + .everywhere(), 32f); + + scene.idle(40); + PonderHilo.packageHopsOffBelt(scene, util.grid() + .at(4, 1, 0), Direction.NORTH); + scene.idle(40); + scene.world() + .multiplyKineticSpeed(util.select() + .everywhere(), 1 / 32f); + scene.overlay() + .showText(100) + .text("For compactness, mechanical saws can unwrap packages straight onto a belt") + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector() + .topOf(util.grid() + .at(2, 1, 4))); + scene.idle(110); + + scene.world() + .multiplyKineticSpeed(util.select() + .everywhere(), 32f); + + scene.idle(20); + scene.world() + .hideSection(eastBelt, Direction.EAST); + scene.idle(5); + scene.world() + .hideSection(tunnelS, Direction.UP); + scene.idle(5); + scene.world() + .hideSection(saw, Direction.WEST); + scene.idle(5); + scene.world() + .hideSection(initialKinetics, Direction.UP); + scene.world() + .hideSection(largeCog, Direction.DOWN); + scene.world() + .hideSection(northBelt, Direction.NORTH); + scene.rotateCameraY(15); + scene.idle(15); + + ElementLink extrasL = scene.world() + .showIndependentSection(postbox, Direction.DOWN); + scene.world() + .moveSection(extrasL, util.vector() + .of(-3, 0, 2), 0); + scene.idle(5); + scene.world() + .showSectionAndMerge(frogport, Direction.DOWN, extrasL); + scene.idle(20); + + scene.overlay() + .showText(100) + .text("Aside from those filters, Frogports and Postboxes have package routing capabilities") + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector() + .blockSurface(util.grid() + .at(3, 2, 4), Direction.NORTH)); + scene.idle(110); + + scene.overlay() + .showText(80) + .text("Inspect them to find out more about their behaviour") + .placeNearTarget() + .pointAt(util.vector() + .blockSurface(util.grid() + .at(3, 2, 4), Direction.NORTH)); + scene.idle(90); + + } + +} diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/PonderHilo.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/PonderHilo.java new file mode 100644 index 0000000000..2b19469aee --- /dev/null +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/PonderHilo.java @@ -0,0 +1,54 @@ +package com.simibubi.create.infrastructure.ponder.scenes.highLogistics; + +import com.simibubi.create.content.logistics.box.PackageEntity; +import com.simibubi.create.content.logistics.box.PackageStyles; +import com.simibubi.create.content.logistics.packager.PackagerBlockEntity; +import com.simibubi.create.foundation.ponder.CreateSceneBuilder; + +import net.createmod.ponder.api.element.ElementLink; +import net.createmod.ponder.api.element.EntityElement; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.phys.Vec3; + +public class PonderHilo { + + public static void packagerCreate(CreateSceneBuilder scene, BlockPos pos, ItemStack box) { + scene.world() + .modifyBlockEntity(pos, PackagerBlockEntity.class, be -> { + be.animationTicks = PackagerBlockEntity.CYCLE; + be.animationInward = false; + be.heldBox = box; + }); + } + + public static void packagerUnpack(CreateSceneBuilder scene, BlockPos pos, ItemStack box) { + scene.world() + .modifyBlockEntity(pos, PackagerBlockEntity.class, be -> { + be.animationTicks = PackagerBlockEntity.CYCLE; + be.animationInward = true; + be.previouslyUnwrapped = box; + }); + } + + public static void packagerClear(CreateSceneBuilder scene, BlockPos pos) { + scene.world() + .modifyBlockEntity(pos, PackagerBlockEntity.class, be -> be.heldBox = ItemStack.EMPTY); + } + + public static ElementLink packageHopsOffBelt(CreateSceneBuilder scene, BlockPos beltPos, + Direction side) { + scene.world() + .removeItemsFromBelt(beltPos); + return scene.world() + .createEntity(l -> { + PackageEntity packageEntity = new PackageEntity(l, beltPos.getX() + 0.5 + side.getStepX() * 0.25, + beltPos.getY() + 0.875, beltPos.getZ() + 0.5 + side.getStepZ() * 0.25); + packageEntity.setDeltaMovement(new Vec3(side.getStepX(), 0.5f, side.getStepZ()).scale(0.25f)); + packageEntity.box = PackageStyles.getDefaultBox(); + return packageEntity; + }); + } + +} diff --git a/src/main/resources/assets/create/ponder/chain_conveyor.nbt b/src/main/resources/assets/create/ponder/high_logistics/chain_conveyor.nbt similarity index 100% rename from src/main/resources/assets/create/ponder/chain_conveyor.nbt rename to src/main/resources/assets/create/ponder/high_logistics/chain_conveyor.nbt diff --git a/src/main/resources/assets/create/ponder/package_frogport.nbt b/src/main/resources/assets/create/ponder/high_logistics/package_frogport.nbt similarity index 100% rename from src/main/resources/assets/create/ponder/package_frogport.nbt rename to src/main/resources/assets/create/ponder/high_logistics/package_frogport.nbt diff --git a/src/main/resources/assets/create/ponder/high_logistics/packager.nbt b/src/main/resources/assets/create/ponder/high_logistics/packager.nbt new file mode 100644 index 0000000000000000000000000000000000000000..3319f35325186891376bcdbb412083a68d7ee915 GIT binary patch literal 1236 zcmb2|=3oGW|92x!=RGzPSvqgpTbs0tOsuWY)I7tG`Jv`#XEv%TSeDa;|AJ+Al9+>v6gEaOd}V&Ud|cJA2G-(c0hCAP}@i zxTgI_-d0bhnCDjPu3h1?kEHu75x#n`dwZ_XnHHn&Y3mzYyn=bJcB%DjZ~JJLP{Tg& zK%;uegHD->B<}v}0o8MlC)lvd-EUMcc)%%Jp~OD##-YdNSK^)|A}m zdTY%e-WeB~fNoTBpSNIHqJx#ngLEsUiywIue)HPDo^XxvMeBsg9V)d}i!;~h->=m; z@X(O&Uz3)~KZV2fb*ld!9`87EJgQ0Sc%9Q98|C@Sg$#~pPxVjd@l&^CpSxVvrE90p z#}5zwMofG1x1_fAui*cGJ=gVLOKp>~;mx-EZYQ$!Jx@q{fi7#ZLSgP7xgQ?=+h%I!-#`J1N0?Qp|nlNe^bKWbX8Ql#Lt{^&-JXwfSI;-m zi#mC!gsIBG{^L9C?%XNsPCCuYS-yq+kIeq%+?6-os(6D#d#Bu0UijhmZ%dg|Jlu-q zE5BdbwDJ+#*GX(&=Y3rBF#P5JeJ|G}7RA|TZ&^Ku`O_nppml8uznwPt=u`;GC+|5s zlPywhll9RHE0;L`?RvH%;fi?iI___Cg|5w>CO;v66>I3T!=zW(^C&{A!o5#!H48 zdmD5AM(p`4zriGDL&^95S(#S?-W=97&3P@I^8O--ls8-}nYzGK#6EVP$A;2NniKTH zV!8|0Jv0%O2|et}_VFgy!W|KF?)~`}X|u*X=*)!^G9p!*4p>a;yvXr8&18v>qthgv z<3DUzAJz8i{`SexU3T@Z>fh;8-9_4)w1fgQW%&xN4ic*U2E}#O{q+;gNuT11f1S!n`Lu$bI-wG_OcbcmAa_1*Huq?{e4e% zUYE$)w5NWx(q-?tTB|(eUU}=N>-8jG_|h=#?Hj|WtsBcdXFaM|=~_P_;+?Cjk$kW8 o?7nK>-Xn_53tP<R literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/ponder/high_logistics/packager_address.nbt b/src/main/resources/assets/create/ponder/high_logistics/packager_address.nbt new file mode 100644 index 0000000000000000000000000000000000000000..9079e0e4ba7ea985465a408b40bf39b8e76da052 GIT binary patch literal 2415 zcmZ9Gc{~#g7{`l589B<8+gwFdzFH>qm-pF93S8kySU?dI&FECu&Je!sB)Gj=)j$ne-Kzg!tb8<2x7@nK7Q-NM6iWhm6C!g>Rw>&`rboL@B64)@Cq{d zfb_9vQ>h)yg!S?9otV$piMr0Krf9_^!G&Pw*_tWv@x$8PqkWP*)gPaN3er=@d5Vk$ zHT84GP*F(aTIeQ6;OCau_V)hi?aK0o<#+mdJcETjH9@lGyhK$n18K$=kazuHkbFY< zp_G`r4`bXuf``P!eRF_KDLPH3=P4&XUGBZq_3u?FTBwhcT#VWPx2yp@M)IOos*x5` zoAHe7!nqq1g#LU5m91$p#4G6Tg^c^$gMz)Ih%lrfwj*HC3IO9!?SUm-DB5w@);1*Fn%?k zoK~*S=$nS8toAzQ=Y@tgN80x^BSQ^#>XSk^UxH6SIa&Fj_(H~;m&Lgwv|+xF+b-5K z(PAa;LGMTI5_Qzqw>%W%B+J6ttD8&iYm>E19~I<49Tpv4zlsF*Pl#TfknabDW5@88 zSVvc^7OVk(0m~bX)d{q~Zs-F0Vc?BwoK$$J>cd;$aiKNrUgg~r$eM^y3+-2+TDw07 zM!T;WM?SXfq-8ubcJWZzo^WMg#;Ftf8~6^}G+GNe`wYY`kYelg5Jz{m$LdP?_6(GD z+tynf(b9omvAiuuToimW0(ycF-@dO-jE0^nw(`$+IyQoD28oe2@DFA4%4C(~pcXu{ zk-~%sff5vf)^^9oLEJn2lrFKYU8w|KLvWfNgD}CCtP)g?mA%Ktx~BEMQ-(`41Gz*# zb12cV1NfCMYrwGgL}UDxK%vd)okg7zd7sHo3ET4Dz`0jGHsAJNkGkG-&621Vc}Kt; zRZBAr^HJJ~IH2?b7~0);T%qPKpZJr%nY3fmmLqL zP+*!n&Yh6YA`bJ8)^PzwA#>J4BG;3MHe$u=%LrBeUa&P%6*> z5evo%7V0uaZP1)`ujTYpA3JZ8CddZX>WC2`bE1dskjt=JN0F+Bx&6( zWHL{pOu|C(V%iIT$!rK`?fy`qM%{bmAF@Z54w|Qbm!YsguBSaSjThVVst8X<(J;X)rIP3aj6T#y+_R;ga_)&XGE=5e9^ z`bhC|`&9rXZdK4P?Yv3xO;ABx3ge6VTl#2Q8)F$&TGJr9rt*^u3k#3cO#$8BFIxmF z)j8WN3vHcBxc=Q1&|!bS2v&PkeT@~wVNfG!ZyOXP${5eZeI~t`dw>nmC&fH&cncPsD2u2o5V(Qom^5K{p;RtjqaP|~HL5IBqKsHJkt9Z1f0bXSQH| zRCV-a22ROrh;?olQXaO_2^S}s8d7Y~bEK}75WV}5mXon|;0ZYZsd=+llI@{pP@5(@ z);pR;HbuxFx{N80_&aNOK=Cn$U8MQ$`tJrUdc>Ux zjD-3ZNsrtUqtrM!?uiWr{?}a5BCsR+a8cP_Wt+-MseglOjg9t2~ebgPOI6}>z7?(s#We_N6EEN*)uFK*~Di<2|N%U1;JDW&6=>F!RR zy|&eUZs$I0^FqpK%+||7=MSL)z0F~jX>n&}?Aq3vK7ma>gXRg~TVCd!Qn!a{nr1L_ zZcg==O_-#(A zo{GdaPrUuRDjQbHgR>u28j~dlu>MbaRz!DVndOfO64ze3QU4)pRnQZvzR){U*Py;n z(of=?t=CPEIaK>kX0(+yvNLox7v-4D7LU7CuO07_ta==a~wBv!S~f z0e)>+?MC>Pqf*}Bk9yK~wt+O%b#gDxsBp%sf~gECUpAzNtw#oO$Ra59>gC&d@04#M v$Qjq5xyoigC^AQ@4Qa4-{tsK;t}MKnM8~cBHC2qd9d2C@XfzjS&z}DPCOEZG literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/atlases/blocks.json b/src/main/resources/assets/minecraft/atlases/blocks.json index 5a63bd52fb..c6c0cec114 100644 --- a/src/main/resources/assets/minecraft/atlases/blocks.json +++ b/src/main/resources/assets/minecraft/atlases/blocks.json @@ -24,10 +24,6 @@ "type": "single", "resource": "create:entity/blueprint_small" }, - { - "type": "single", - "resource": "create:entity/display_cloth" - }, { "type": "single", "resource": "create:entity/coupling" From 0e69f537f276d01c3bd295728a6d9b371957690d Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Sat, 11 Jan 2025 18:14:30 +0100 Subject: [PATCH 281/515] Special Delivery - Added train schedule instructions for delivering or retrieving packages - Moved schedule instruction logic into their respective subclasses - Fixed schedule screen no longer showing tooltips in the entry editor --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 6 +- .../resources/assets/create/lang/en_ud.json | 58 ++++++ .../resources/assets/create/lang/en_us.json | 58 ++++++ .../content/trains/entity/TrainStatus.java | 7 + .../content/trains/schedule/Schedule.java | 4 + .../trains/schedule/ScheduleRuntime.java | 88 +++------ .../trains/schedule/ScheduleScreen.java | 12 +- .../ChangeThrottleInstruction.java | 14 ++ .../destination/ChangeTitleInstruction.java | 14 ++ .../DeliverPackagesInstruction.java | 126 +++++++++++++ .../destination/DestinationInstruction.java | 45 +++++ .../destination/FetchPackagesInstruction.java | 170 ++++++++++++++++++ .../destination/ScheduleInstruction.java | 7 + .../assets/create/lang/default/interface.json | 14 ++ 14 files changed, 555 insertions(+), 68 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/trains/schedule/destination/DeliverPackagesInstruction.java create mode 100644 src/main/java/com/simibubi/create/content/trains/schedule/destination/FetchPackagesInstruction.java diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index a464cf4561..1b87b3e135 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2025-01-08T12:42:08.2186069 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2025-01-11T18:12:51.5905299 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -642,8 +642,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -c1d7b1f496afa2f971078caf90f20255292d760b assets/create/lang/en_ud.json -ce3c58e8401db1c42f3e1187bec1343fbf15009e assets/create/lang/en_us.json +913f3794fb772a0736ae66dff722b3c468bcde79 assets/create/lang/en_ud.json +1f6031cb19932ad54d645fbca1f2773385dd47ed assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 403ebcb5bc..5f8a0dc827 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -1692,6 +1692,12 @@ "create.ponder.cart_assembler_rails.text_2": "pǝɹǝʍoԀ s,ʇı ןıʇun ǝɔɐןd uı pןǝɥ ǝq ןןıʍ sʇɹɐɔ ǝɥʇ 'ןıɐᴚ ɹǝןןoɹʇuoƆ ɹo pǝɹǝʍoԀ uo uǝɥM", "create.ponder.cart_assembler_rails.text_3": "ɹoɥɔuɐ ǝɥʇ sɐ pǝsn ǝq uɐɔ sʇɹɐɔǝuıW ɟo sǝdʎʇ ɹǝɥʇO", "create.ponder.cart_assembler_rails.text_4": "sǝıɹoʇuǝʌuı pǝɥɔɐʇʇɐ ʎuɐ ɯoɹɟ ןǝnɟ buıןןnd 'pǝɹǝʍod sǝʌןǝsɯǝɥʇ dǝǝʞ ןןıʍ sʇɹɐƆ ǝɔɐuɹnℲ", + "create.ponder.chain_conveyor.header": "sɹoʎǝʌuoƆ uıɐɥƆ buısn ǝɔɹoɟ ןɐuoıʇɐʇoɹ buıʎɐןǝᴚ", + "create.ponder.chain_conveyor.text_1": "ɯǝɥʇ ʇɔǝuuoɔ oʇ suıɐɥɔ ɥʇıʍ sɹoʎǝʌuoɔ oʍʇ ʞɔıןɔ-ʇɥbıᴚ", + "create.ponder.chain_conveyor.text_2": "˙˙ʎןqıxǝןɟ ʎɹǝʌ ɹǝɥʇo ɥɔɐǝ oʇ ɹǝʍod ןɐuoıʇɐʇoɹ ʎɐןǝɹ ǝsǝɥ⟘", + "create.ponder.chain_conveyor.text_3": "ɯǝɥʇ ʍoןǝq ɹo ǝʌoqɐ sʇɟɐɥs oʇ ʇɔǝuuoɔ puɐ˙˙", + "create.ponder.chain_conveyor.text_4": "uıɐɥɔ ǝɥʇ uo buıןןǝʌɐɹʇ ʇɹɐʇs oʇ ɥɔuǝɹʍ ɐ buıpןoɥ ʞɔıןɔ-ʇɥbıᴚ", + "create.ponder.chain_conveyor.text_5": "ʇı ʍoןןoɟ oʇ uıɐɥɔ ɐ spɹɐʍoʇ ǝɔɐɟ 'uoıʇɔunظ ɐ ʇⱯ", "create.ponder.chain_drive.header": "sǝʌıɹᗡ uıɐɥƆ ɥʇıʍ ǝɔɹoɟ ןɐuoıʇɐʇoɹ buıʎɐןǝᴚ", "create.ponder.chain_drive.text_1": "ʍoɹ ɐ uı ɹǝɥʇo ɥɔɐǝ oʇ uoıʇɐʇoɹ ʎɐןǝɹ sǝʌıɹᗡ uıɐɥƆ", "create.ponder.chain_drive.text_2": "uoıʇɔǝɹıp ǝɯɐs ǝɥʇ uı ǝʇɐʇoɹ ןןıʍ sıɥʇ ǝʞıן pǝʇɔǝuuoɔ sʇɟɐɥs ןןⱯ", @@ -2124,6 +2130,46 @@ "create.ponder.nixie_tube.text_1": "ɥʇbuǝɹʇs ןɐubıs ǝɥʇ ʎɐןdsıp ןןıʍ sǝqn⟘ ǝıxıN 'ǝuoʇspǝᴚ ʎq pǝɹǝʍod uǝɥM", "create.ponder.nixie_tube.text_2": "pǝʎɐןdsıp ǝq uɐɔ ʇxǝʇ ɯoʇsnɔ 'spɹɐoqdıןƆ uǝʇʇıɹʍ buıs∩", "create.ponder.nixie_tube.text_3": "ɹnoןoɔ ʎɐןdsıp ɹıǝɥʇ ǝbuɐɥɔ oʇ ǝʎᗡ ɥʇıʍ ʞɔıןƆ-ʇɥbıᴚ", + "create.ponder.package_frogport.header": "sʇɹodboɹℲ ɥʇıʍ sǝbɐʞɔɐd buıʇɹodsuɐɹ⟘", + "create.ponder.package_frogport.text_1": "ʎqɹɐǝu ʇɹodboɹℲ ǝɥʇ ǝɔɐןd puɐ ɹoʎǝʌuoƆ uıɐɥƆ ɐ ʞɔıןɔ-ʇɥbıᴚ", + "create.ponder.package_frogport.text_10": "ʞɹoʍʇǝu uıɐɥɔ ǝɥʇ uo boɹɟ buıɥɔʇɐɯ ɐ oʇ ɥʇɐd ɹıǝɥʇ puıɟ sǝbɐʞɔɐԀ", + "create.ponder.package_frogport.text_11": "ɹǝʇǝԀ", + "create.ponder.package_frogport.text_12": "ɹǝʇǝԀ →", + "create.ponder.package_frogport.text_13": "ɯǝɥʇ ʍoןǝq sǝıɹoʇuǝʌuı ɥʇıʍ ǝɔɐɟɹǝʇuı ʎןʇɔǝɹıp uɐɔ sʇɹodboɹℲ", + "create.ponder.package_frogport.text_14": "ʎןʇɔǝɹıp pǝddıɥs puɐ pǝʞɔɐd ǝq uɐɔ sɯǝʇı 'sɹǝbɐʞɔɐd ɥʇıʍ sʞɹoʍ sıɥ⟘", + "create.ponder.package_frogport.text_15": "ʇɹǝqןⱯ", + "create.ponder.package_frogport.text_16": "ɹǝʇǝԀ", + "create.ponder.package_frogport.text_17": ",ɹǝʇǝԀ, oʇ sǝbɐʞɔɐd sǝssǝɹppⱯ", + "create.ponder.package_frogport.text_18": "ssǝɹppɐ ɹıǝɥʇ ʇɔǝןןoɔ oʇ pɹɐoqdıןɔ ɐ ɥʇıʍ sʇɹodboɹℲ ʞɔıןɔ-ʇɥbıᴚ", + "create.ponder.package_frogport.text_19": "sI∩ ɹǝɥʇo uı sʇnduı ssǝɹppɐ ǝʇǝןdɯoɔ-oʇnɐ dןǝɥ uɐɔ sǝɯɐu pǝʇɔǝןןoɔ ɥʇıʍ spɹɐoqdıןƆ", + "create.ponder.package_frogport.text_2": "I∩ ʎɹoʇuǝʌuı ɹıǝɥʇ uı ǝɯɐu ɐ uǝʌıb ǝq uɐɔ ʎǝɥ⟘", + "create.ponder.package_frogport.text_3": "˙˙ǝɯɐu ʇuǝɹǝɟɟıp ɐ oʇ pǝssǝɹppɐ sı ǝbɐʞɔɐd ɐ ɟI", + "create.ponder.package_frogport.text_4": "ʇɹǝqןⱯ", + "create.ponder.package_frogport.text_5": "ɹǝʇǝԀ →", + "create.ponder.package_frogport.text_6": "ɹoʎǝʌuoɔ ǝɥʇ uo ǝbɐʞɔɐd ǝɥʇ ǝɔɐןd ןןıʍ ʇɹodboɹℲ ǝɥʇ˙˙", + "create.ponder.package_frogport.text_7": "uoıʇɐuıʇsǝp pıןɐʌ ou ǝʌɐɥ ʎǝɥʇ ɟı ǝɔɐןd uı uıds sǝbɐʞɔɐԀ", + "create.ponder.package_frogport.text_8": "ʞɹoʍʇǝu uıɐɥɔ ǝɥʇ uo ǝɹǝɥʍʎuɐ pǝppɐ ǝq uɐɔ sʇɹodboɹℲ ǝɹoW", + "create.ponder.package_frogport.text_9": "ɹǝʇǝԀ", + "create.ponder.packager.header": "sǝbɐʞɔɐd buıddɐɹʍun puɐ buıʇɐǝɹƆ", + "create.ponder.packager.text_1": "ʇǝbɹɐʇ pןnoɥs ʎǝɥʇ ʎɹoʇuǝʌuı ǝɥʇ oʇ ʇxǝu sɹǝbɐʞɔɐd ǝɔɐןԀ", + "create.ponder.packager.text_2": "ǝbɐʞɔɐd ɐ oʇuı ʎɹoʇuǝʌuı ǝɥʇ ɯoɹɟ sɯǝʇı ʞɔɐd ןןıʍ ʇı 'ɹǝʍod ǝuoʇspǝɹ uǝʌı⅁", + "create.ponder.packager.text_3": "ɯǝʇı ɹǝɥʇo ʎuɐ ǝʞıן pǝʇɹodsuɐɹʇ puɐ dn pǝʞɔıd ǝq uɐɔ ǝsǝɥ⟘", + "create.ponder.packager.text_4": "ʎɹoʇuǝʌuı ǝɥʇ oʇuı sʇuǝʇuoɔ ǝɥʇ buıʞɔɐdun 'pǝʎoɹʇsǝp ǝq ןןıʍ pǝʇɹǝsuı sǝbɐʞɔɐԀ", + "create.ponder.packager.text_5": "ןןnℲ", + "create.ponder.packager.text_6": "ʞɔɐdun ʎןןnɟ ʇouuɐɔ ʎǝɥʇ sǝbɐʞɔɐd ʇdǝɔɔɐ ʇou ןןıʍ sɹǝbɐʞɔɐԀ", + "create.ponder.packager_address.header": "ssǝɹppɐ uɐ ɥʇıʍ sǝbɐʞɔɐd buıʇnoᴚ", + "create.ponder.packager_address.text_1": "ǝsnoɥǝɹɐM", + "create.ponder.packager_address.text_10": "ʇןǝq ɐ oʇuo ʇɥbıɐɹʇs sǝbɐʞɔɐd dɐɹʍun uɐɔ sʍɐs ןɐɔıuɐɥɔǝɯ 'ssǝuʇɔɐdɯoɔ ɹoℲ", + "create.ponder.packager_address.text_11": "sǝıʇıןıqɐdɐɔ buıʇnoɹ ǝbɐʞɔɐd ǝʌɐɥ sǝxoqʇsoԀ puɐ sʇɹodboɹℲ 'sɹǝʇןıɟ ǝsoɥʇ ɯoɹɟ ǝpısⱯ", + "create.ponder.packager_address.text_12": "ɹnoıʌɐɥǝq ɹıǝɥʇ ʇnoqɐ ǝɹoɯ ʇno puıɟ oʇ ɯǝɥʇ ʇɔǝdsuI", + "create.ponder.packager_address.text_2": "˙˙ɹǝbɐʞɔɐd ɐ uo pǝɔɐןd sı ubıs ɐ uǝɥM", + "create.ponder.packager_address.text_3": "ǝsnoɥǝɹɐM →", + "create.ponder.packager_address.text_4": "ssǝɹppɐ ɹıǝɥʇ sɐ ʇxǝʇ ɟo ǝuıן uǝʇʇıɹʍ ǝɥʇ ʎɹɹɐɔ ןןıʍ sǝbɐʞɔɐd pǝʇɐǝɹƆ", + "create.ponder.packager_address.text_5": "ssǝɹppɐ ɹıǝɥʇ uo pǝsɐq sǝbɐʞɔɐd ǝʇnoɹ sɹǝʇןıɟ ǝbɐʞɔɐԀ", + "create.ponder.packager_address.text_6": "ǝsnoɥǝɹɐM →", + "create.ponder.packager_address.text_7": "ʎɹoʇɔɐℲ", + "create.ponder.packager_address.text_8": "ʎɹoʇɔɐℲ →", + "create.ponder.packager_address.text_9": "ʎɹoʇɔɐℲ", "create.ponder.piston_pole.header": "sǝןoԀ uoısuǝʇxƎ uoʇsıԀ", "create.ponder.piston_pole.text_1": "ǝʌoɯ ʇouuɐɔ uoʇsıԀ ןɐɔıuɐɥɔǝW ɐ 'sǝןoԀ pǝɥɔɐʇʇɐ ʇnoɥʇıM", "create.ponder.piston_pole.text_2": "ǝbuɐᴚ uoısuǝʇxƎ ǝɥʇ sǝuıɯɹǝʇǝp ʞɔɐq sʇı ʇɐ pǝppɐ ǝןod ɟo ɥʇbuǝꞀ ǝɥ⟘", @@ -2596,6 +2642,10 @@ "create.schedule.condition.unloaded.status": "pɐoןun ʞunɥɔ ɹoɟ buıʇıɐM", "create.schedule.condition_type": ":ɹǝʇɟɐ/ɟı ǝnuıʇuoƆ", "create.schedule.continued": "pǝɯnsǝɹ ǝןnpǝɥɔS", + "create.schedule.instruction.address_filter_edit_box": "ssǝɹppⱯ sıɥʇ ɥʇıʍ sǝbɐʞɔɐԀ ǝʌǝıɹʇǝᴚ", + "create.schedule.instruction.address_filter_edit_box_1": "pɹɐɔpןıʍ ʇxǝʇ ɐ sɐ * ǝs∩", + "create.schedule.instruction.address_filter_edit_box_2": "ʇı ʇɔǝןןoɔ oʇ ǝɹǝɥʍʎuɐ ǝʇɐbıʌɐu ʎɐɯ uıɐɹ⟘", + "create.schedule.instruction.address_filter_edit_box_3": "uɹnʇǝɹ ʇı ǝʞɐɯ oʇ uoıʇɔnɹʇsuı ɹǝɥʇouɐ ppⱯ", "create.schedule.instruction.destination": "uoıʇɐʇS oʇ ןǝʌɐɹ⟘", "create.schedule.instruction.destination.summary": ":doʇS ʇxǝN", "create.schedule.instruction.editor": "ɹoʇıpƎ uoıʇɔnɹʇsuI", @@ -2606,6 +2656,14 @@ "create.schedule.instruction.name_edit_box": "ǝןʇı⟘ ǝןnpǝɥɔS", "create.schedule.instruction.name_edit_box_1": "sʎɐןdsıp uo uʍoɥs ʇxǝʇ sʇɔǝɟɟⱯ", "create.schedule.instruction.name_edit_box_2": "ǝɯɐu s,uoıʇɐuıʇsǝp ʇxǝu oʇ sʇןnɐɟǝᗡ", + "create.schedule.instruction.package_delivery": "ǝbɐʞɔɐԀ ɹǝʌıןǝᗡ", + "create.schedule.instruction.package_delivery.summary": "obɹɐɔ uı ǝbɐʞɔɐd ʇsɹıɟ ɹǝʌıןǝᗡ", + "create.schedule.instruction.package_delivery.summary_1": "ɥʇıʍ uoıʇɐʇs ǝɥʇ oʇ sǝʌıɹᗡ", + "create.schedule.instruction.package_delivery.summary_2": "xoqʇsod ʇɔǝɹɹoɔ ǝɥʇ", + "create.schedule.instruction.package_retrieval": "ǝbɐʞɔɐԀ ǝʌǝıɹʇǝᴚ", + "create.schedule.instruction.package_retrieval.summary": ":oʇ pǝssǝɹppɐ ǝbɐʞɔɐd ɐ ɥɔʇǝℲ", + "create.schedule.instruction.package_retrieval.summary_1": "ɥʇıʍ xoqʇsod ɐ oʇ sǝʌıɹᗡ", + "create.schedule.instruction.package_retrieval.summary_2": "ǝbɐʞɔɐd pǝɹǝʌıןǝpun uɐ", "create.schedule.instruction.rename": "ǝןʇı⟘ ǝןnpǝɥɔS ǝʇɐpd∩", "create.schedule.instruction.rename.summary": ":ǝןʇı⟘ ʍǝN", "create.schedule.instruction.throttle": "pǝǝdS xɐW ʇıɯıꞀ", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index af4a9663c2..852ed87650 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1692,6 +1692,12 @@ "create.ponder.cart_assembler_rails.text_2": "When on Powered or Controller Rail, the carts will be held in place until it's Powered", "create.ponder.cart_assembler_rails.text_3": "Other types of Minecarts can be used as the anchor", "create.ponder.cart_assembler_rails.text_4": "Furnace Carts will keep themselves powered, pulling fuel from any attached inventories", + "create.ponder.chain_conveyor.header": "Relaying rotational force using Chain Conveyors", + "create.ponder.chain_conveyor.text_1": "Right-click two conveyors with chains to connect them", + "create.ponder.chain_conveyor.text_2": "These relay rotational power to each other very flexibly..", + "create.ponder.chain_conveyor.text_3": "..and connect to shafts above or below them", + "create.ponder.chain_conveyor.text_4": "Right-click holding a wrench to start travelling on the chain", + "create.ponder.chain_conveyor.text_5": "At a junction, face towards a chain to follow it", "create.ponder.chain_drive.header": "Relaying rotational force with Chain Drives", "create.ponder.chain_drive.text_1": "Chain Drives relay rotation to each other in a row", "create.ponder.chain_drive.text_2": "All shafts connected like this will rotate in the same direction", @@ -2124,6 +2130,46 @@ "create.ponder.nixie_tube.text_1": "When powered by Redstone, Nixie Tubes will display the signal strength", "create.ponder.nixie_tube.text_2": "Using written Clipboards, custom text can be displayed", "create.ponder.nixie_tube.text_3": "Right-Click with Dye to change their display colour", + "create.ponder.package_frogport.header": "Transporting packages with Frogports", + "create.ponder.package_frogport.text_1": "Right-click a Chain Conveyor and place the Frogport nearby", + "create.ponder.package_frogport.text_10": "Packages find their path to a matching frog on the chain network", + "create.ponder.package_frogport.text_11": "Peter", + "create.ponder.package_frogport.text_12": "→ Peter", + "create.ponder.package_frogport.text_13": "Frogports can directly interface with inventories below them", + "create.ponder.package_frogport.text_14": "This works with packagers, items can be packed and shipped directly", + "create.ponder.package_frogport.text_15": "Albert", + "create.ponder.package_frogport.text_16": "Peter", + "create.ponder.package_frogport.text_17": "Addresses packages to 'Peter'", + "create.ponder.package_frogport.text_18": "Right-click Frogports with a clipboard to collect their address", + "create.ponder.package_frogport.text_19": "Clipboards with collected names can help auto-complete address inputs in other UIs", + "create.ponder.package_frogport.text_2": "They can be given a name in their inventory UI", + "create.ponder.package_frogport.text_3": "If a package is addressed to a different name..", + "create.ponder.package_frogport.text_4": "Albert", + "create.ponder.package_frogport.text_5": "→ Peter", + "create.ponder.package_frogport.text_6": "..the Frogport will place the package on the conveyor", + "create.ponder.package_frogport.text_7": "Packages spin in place if they have no valid destination", + "create.ponder.package_frogport.text_8": "More Frogports can be added anywhere on the chain network", + "create.ponder.package_frogport.text_9": "Peter", + "create.ponder.packager.header": "Creating and unwrapping packages", + "create.ponder.packager.text_1": "Place packagers next to the inventory they should target", + "create.ponder.packager.text_2": "Given redstone power, it will pack items from the inventory into a package", + "create.ponder.packager.text_3": "These can be picked up and transported like any other item", + "create.ponder.packager.text_4": "Packages inserted will be destroyed, unpacking the contents into the inventory", + "create.ponder.packager.text_5": "Full", + "create.ponder.packager.text_6": "Packagers will not accept packages they cannot fully unpack", + "create.ponder.packager_address.header": "Routing packages with an address", + "create.ponder.packager_address.text_1": "Warehouse", + "create.ponder.packager_address.text_10": "For compactness, mechanical saws can unwrap packages straight onto a belt", + "create.ponder.packager_address.text_11": "Aside from those filters, Frogports and Postboxes have package routing capabilities", + "create.ponder.packager_address.text_12": "Inspect them to find out more about their behaviour", + "create.ponder.packager_address.text_2": "When a sign is placed on a packager..", + "create.ponder.packager_address.text_3": "→ Warehouse", + "create.ponder.packager_address.text_4": "Created packages will carry the written line of text as their address", + "create.ponder.packager_address.text_5": "Package filters route packages based on their address", + "create.ponder.packager_address.text_6": "→ Warehouse", + "create.ponder.packager_address.text_7": "Factory", + "create.ponder.packager_address.text_8": "→ Factory", + "create.ponder.packager_address.text_9": "Factory", "create.ponder.piston_pole.header": "Piston Extension Poles", "create.ponder.piston_pole.text_1": "Without attached Poles, a Mechanical Piston cannot move", "create.ponder.piston_pole.text_2": "The Length of pole added at its back determines the Extension Range", @@ -2596,6 +2642,10 @@ "create.schedule.condition.unloaded.status": "Waiting for chunk unload", "create.schedule.condition_type": "Continue if/after:", "create.schedule.continued": "Schedule resumed", + "create.schedule.instruction.address_filter_edit_box": "Retrieve Packages with this Address", + "create.schedule.instruction.address_filter_edit_box_1": "Use * as a text wildcard", + "create.schedule.instruction.address_filter_edit_box_2": "Train may navigate anywhere to collect it", + "create.schedule.instruction.address_filter_edit_box_3": "Add another instruction to make it return", "create.schedule.instruction.destination": "Travel to Station", "create.schedule.instruction.destination.summary": "Next Stop:", "create.schedule.instruction.editor": "Instruction Editor", @@ -2606,6 +2656,14 @@ "create.schedule.instruction.name_edit_box": "Schedule Title", "create.schedule.instruction.name_edit_box_1": "Affects text shown on displays", "create.schedule.instruction.name_edit_box_2": "Defaults to next destination's name", + "create.schedule.instruction.package_delivery": "Deliver Package", + "create.schedule.instruction.package_delivery.summary": "Deliver first package in cargo", + "create.schedule.instruction.package_delivery.summary_1": "Drives to the station with", + "create.schedule.instruction.package_delivery.summary_2": "the correct postbox", + "create.schedule.instruction.package_retrieval": "Retrieve Package", + "create.schedule.instruction.package_retrieval.summary": "Fetch a package addressed to:", + "create.schedule.instruction.package_retrieval.summary_1": "Drives to a postbox with", + "create.schedule.instruction.package_retrieval.summary_2": "an undelivered package", "create.schedule.instruction.rename": "Update Schedule Title", "create.schedule.instruction.rename.summary": "New Title:", "create.schedule.instruction.throttle": "Limit Max Speed", diff --git a/src/main/java/com/simibubi/create/content/trains/entity/TrainStatus.java b/src/main/java/com/simibubi/create/content/trains/entity/TrainStatus.java index 812334e51d..ee8f7c120b 100644 --- a/src/main/java/com/simibubi/create/content/trains/entity/TrainStatus.java +++ b/src/main/java/com/simibubi/create/content/trains/entity/TrainStatus.java @@ -44,6 +44,13 @@ public class TrainStatus { displayInformation("no_match", false, filter); navigation = true; } + + public void failedPackageNoTarget(String address) { + if (navigation) + return; + displayInformation("no_package_target", false, address); + navigation = true; + } public void successfulNavigation() { if (!navigation) diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/Schedule.java b/src/main/java/com/simibubi/create/content/trains/schedule/Schedule.java index 324a1d72ed..b50407d4e6 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/Schedule.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/Schedule.java @@ -17,7 +17,9 @@ import com.simibubi.create.content.trains.schedule.condition.StationUnloadedCond import com.simibubi.create.content.trains.schedule.condition.TimeOfDayCondition; import com.simibubi.create.content.trains.schedule.destination.ChangeThrottleInstruction; import com.simibubi.create.content.trains.schedule.destination.ChangeTitleInstruction; +import com.simibubi.create.content.trains.schedule.destination.DeliverPackagesInstruction; import com.simibubi.create.content.trains.schedule.destination.DestinationInstruction; +import com.simibubi.create.content.trains.schedule.destination.FetchPackagesInstruction; import com.simibubi.create.content.trains.schedule.destination.ScheduleInstruction; import net.createmod.catnip.utility.NBTHelper; @@ -38,6 +40,8 @@ public class Schedule { static { registerInstruction("destination", DestinationInstruction::new); + registerInstruction("package_delivery", DeliverPackagesInstruction::new); + registerInstruction("package_retrieval", FetchPackagesInstruction::new); registerInstruction("rename", ChangeTitleInstruction::new); registerInstruction("throttle", ChangeThrottleInstruction::new); registerCondition("delay", ScheduledDelay::new); diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleRuntime.java b/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleRuntime.java index b3e7c960fb..e0595c913a 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleRuntime.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleRuntime.java @@ -4,17 +4,14 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Objects; -import java.util.regex.PatternSyntaxException; import com.simibubi.create.AllItems; import com.simibubi.create.content.trains.display.GlobalTrainDisplayData.TrainDeparturePrediction; import com.simibubi.create.content.trains.entity.Carriage; import com.simibubi.create.content.trains.entity.Train; import com.simibubi.create.content.trains.graph.DiscoveredPath; -import com.simibubi.create.content.trains.graph.EdgePointType; import com.simibubi.create.content.trains.schedule.condition.ScheduleWaitCondition; import com.simibubi.create.content.trains.schedule.condition.ScheduledDelay; -import com.simibubi.create.content.trains.schedule.destination.ChangeThrottleInstruction; import com.simibubi.create.content.trains.schedule.destination.ChangeTitleInstruction; import com.simibubi.create.content.trains.schedule.destination.DestinationInstruction; import com.simibubi.create.content.trains.schedule.destination.ScheduleInstruction; @@ -38,30 +35,35 @@ public class ScheduleRuntime { PRE_TRANSIT, IN_TRANSIT, POST_TRANSIT } - Train train; - Schedule schedule; + public Train train; + public Schedule schedule; public boolean isAutoSchedule; public boolean paused; public boolean completed; public int currentEntry; public State state; + + public List conditionProgress; + public List conditionContext; + public String currentTitle; - static final int INTERVAL = 40; - int cooldown; - List conditionProgress; - List conditionContext; - String currentTitle; - - int ticksInTransit; - List predictionTicks; + public int ticksInTransit; + public List predictionTicks; public boolean displayLinkUpdateRequested; + + private static final int INTERVAL = 40; + private int cooldown; public ScheduleRuntime(Train train) { this.train = train; reset(); } + + public void startCooldown() { + cooldown = INTERVAL; + } public void destinationReached() { if (state != State.IN_TRANSIT) @@ -142,7 +144,15 @@ public class ScheduleRuntime { } public void tickConditions(Level level) { - List> conditions = schedule.entries.get(currentEntry).conditions; + ScheduleEntry entry = schedule.entries.get(currentEntry); + List> conditions = entry.conditions; + + if (!entry.instruction.supportsConditions()) { + state = State.PRE_TRANSIT; + currentEntry++; + return; + } + for (int i = 0; i < conditions.size(); i++) { List list = conditions.get(i); int progress = conditionProgress.get(i); @@ -173,55 +183,7 @@ public class ScheduleRuntime { public DiscoveredPath startCurrentInstruction() { ScheduleEntry entry = schedule.entries.get(currentEntry); ScheduleInstruction instruction = entry.instruction; - - if (instruction instanceof DestinationInstruction destination) { - String regex = destination.getFilterForRegex(); - boolean anyMatch = false; - ArrayList validStations = new ArrayList<>(); - - if (!train.hasForwardConductor() && !train.hasBackwardConductor()) { - train.status.missingConductor(); - cooldown = INTERVAL; - return null; - } - - try { - for (GlobalStation globalStation : train.graph.getPoints(EdgePointType.STATION)) { - if (!globalStation.name.matches(regex)) - continue; - anyMatch = true; - validStations.add(globalStation); - } - } catch (PatternSyntaxException ignored) {} - - DiscoveredPath best = train.navigation.findPathTo(validStations, Double.MAX_VALUE); - if (best == null) { - if (anyMatch) - train.status.failedNavigation(); - else - train.status.failedNavigationNoTarget(destination.getFilter()); - cooldown = INTERVAL; - return null; - } - - return best; - } - - if (instruction instanceof ChangeTitleInstruction title) { - currentTitle = title.getScheduleTitle(); - state = State.PRE_TRANSIT; - currentEntry++; - return null; - } - - if (instruction instanceof ChangeThrottleInstruction throttle) { - train.throttle = throttle.getThrottle(); - state = State.PRE_TRANSIT; - currentEntry++; - return null; - } - - return null; + return instruction.start(this); } public void setSchedule(Schedule schedule, boolean auto) { diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleScreen.java b/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleScreen.java index 253de2337f..ee453212e1 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleScreen.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleScreen.java @@ -57,6 +57,7 @@ import net.minecraft.network.chat.Component; import net.minecraft.util.FormattedCharSequence; import net.minecraft.util.Mth; import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.phys.Vec3; @@ -991,8 +992,15 @@ public class ScheduleScreen extends AbstractSimiContainerScreen im for (int i = 0; i < Math.max(1, rendered.slotsTargeted()); i++) { List secondLineTooltip = rendered.getSecondLineTooltip(i); - if (secondLineTooltip == null || (hoveredSlot != menu.getSlot(36 + i) || !hoveredSlot.getItem() - .isEmpty())) + if (secondLineTooltip == null) + continue; + Slot slot = menu.getSlot(36 + i); + if (slot == null || !slot.getItem() + .isEmpty()) + continue; + if (mouseX < leftPos + slot.x || mouseX > leftPos + slot.x + 18) + continue; + if (mouseY < topPos + slot.y || mouseY > topPos + slot.y + 18) continue; renderActionTooltip(graphics, secondLineTooltip, mouseX, mouseY); } diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/destination/ChangeThrottleInstruction.java b/src/main/java/com/simibubi/create/content/trains/schedule/destination/ChangeThrottleInstruction.java index bafa5b3d1e..9459fa79bc 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/destination/ChangeThrottleInstruction.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/destination/ChangeThrottleInstruction.java @@ -2,9 +2,14 @@ package com.simibubi.create.content.trains.schedule.destination; import java.util.List; +import javax.annotation.Nullable; + import com.google.common.collect.ImmutableList; import com.simibubi.create.AllBlocks; import com.simibubi.create.Create; +import com.simibubi.create.content.trains.graph.DiscoveredPath; +import com.simibubi.create.content.trains.schedule.ScheduleRuntime; +import com.simibubi.create.content.trains.schedule.ScheduleRuntime.State; import com.simibubi.create.foundation.gui.ModularGuiLineBuilder; import com.simibubi.create.foundation.utility.CreateLang; @@ -83,4 +88,13 @@ public class ChangeThrottleInstruction extends ScheduleInstruction { .withStyle(ChatFormatting.GRAY)); } + @Override + @Nullable + public DiscoveredPath start(ScheduleRuntime runtime) { + runtime.train.throttle = getThrottle(); + runtime.state = State.PRE_TRANSIT; + runtime.currentEntry++; + return null; + } + } diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/destination/ChangeTitleInstruction.java b/src/main/java/com/simibubi/create/content/trains/schedule/destination/ChangeTitleInstruction.java index f0e726cc49..efbce32038 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/destination/ChangeTitleInstruction.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/destination/ChangeTitleInstruction.java @@ -2,8 +2,13 @@ package com.simibubi.create.content.trains.schedule.destination; import java.util.List; +import javax.annotation.Nullable; + import com.google.common.collect.ImmutableList; import com.simibubi.create.Create; +import com.simibubi.create.content.trains.graph.DiscoveredPath; +import com.simibubi.create.content.trains.schedule.ScheduleRuntime; +import com.simibubi.create.content.trains.schedule.ScheduleRuntime.State; import com.simibubi.create.foundation.utility.CreateLang; import net.createmod.catnip.utility.Pair; @@ -53,4 +58,13 @@ public class ChangeTitleInstruction extends TextScheduleInstruction { .withStyle(ChatFormatting.DARK_GRAY)); } + @Override + @Nullable + public DiscoveredPath start(ScheduleRuntime runtime) { + runtime.currentTitle = getScheduleTitle(); + runtime.state = State.PRE_TRANSIT; + runtime.currentEntry++; + return null; + } + } diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/destination/DeliverPackagesInstruction.java b/src/main/java/com/simibubi/create/content/trains/schedule/destination/DeliverPackagesInstruction.java new file mode 100644 index 0000000000..c48f87c1f0 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/trains/schedule/destination/DeliverPackagesInstruction.java @@ -0,0 +1,126 @@ +package com.simibubi.create.content.trains.schedule.destination; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map.Entry; + +import javax.annotation.Nullable; + +import com.google.common.collect.ImmutableList; +import com.simibubi.create.AllBlocks; +import com.simibubi.create.Create; +import com.simibubi.create.content.logistics.box.PackageItem; +import com.simibubi.create.content.trains.entity.Carriage; +import com.simibubi.create.content.trains.entity.Train; +import com.simibubi.create.content.trains.graph.DiscoveredPath; +import com.simibubi.create.content.trains.graph.EdgePointType; +import com.simibubi.create.content.trains.schedule.ScheduleRuntime; +import com.simibubi.create.content.trains.schedule.ScheduleRuntime.State; +import com.simibubi.create.content.trains.station.GlobalStation; +import com.simibubi.create.content.trains.station.GlobalStation.GlobalPackagePort; +import com.simibubi.create.foundation.utility.CreateLang; + +import net.createmod.catnip.utility.Pair; +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.items.IItemHandlerModifiable; + +public class DeliverPackagesInstruction extends ScheduleInstruction { + + @Override + public Pair getSummary() { + return Pair.of(getSecondLineIcon(), CreateLang.translateDirect("schedule.instruction.package_delivery")); + } + + @Override + public ItemStack getSecondLineIcon() { + return AllBlocks.PACKAGE_POSTBOXES.get(DyeColor.WHITE) + .asStack(); + } + + @Override + public List getTitleAs(String type) { + return ImmutableList.of(CreateLang.translate("schedule.instruction.package_delivery.summary") + .style(ChatFormatting.GOLD) + .component(), + CreateLang.translateDirect("schedule.instruction.package_delivery.summary_1") + .withStyle(ChatFormatting.GRAY), + CreateLang.translateDirect("schedule.instruction.package_delivery.summary_2") + .withStyle(ChatFormatting.GRAY)); + } + + @Override + public ResourceLocation getId() { + return Create.asResource("package_delivery"); + } + + @Override + public boolean supportsConditions() { + return true; + } + + @Override + @Nullable + public DiscoveredPath start(ScheduleRuntime runtime) { + boolean anyMatch = false; + String firstPackage = null; + ArrayList validStations = new ArrayList<>(); + Train train = runtime.train; + + if (!train.hasForwardConductor() && !train.hasBackwardConductor()) { + train.status.missingConductor(); + runtime.startCooldown(); + return null; + } + + for (Carriage carriage : train.carriages) { + IItemHandlerModifiable carriageInventory = carriage.storage.getItems(); + if (carriageInventory == null) + continue; + + // Export to station + for (int slot = 0; slot < carriageInventory.getSlots(); slot++) { + ItemStack stack = carriageInventory.getStackInSlot(slot); + if (!PackageItem.isPackage(stack)) + continue; + if (firstPackage == null) + firstPackage = PackageItem.getAddress(stack); + for (GlobalStation globalStation : train.graph.getPoints(EdgePointType.STATION)) { + for (Entry port : globalStation.connectedPorts.entrySet()) { + if (!PackageItem.matchAddress(stack, port.getValue().address)) + continue; + anyMatch = true; + validStations.add(globalStation); + break; + } + } + } + } + + if (validStations.isEmpty()) { + if (firstPackage != null) { + train.status.failedPackageNoTarget(firstPackage); + runtime.startCooldown(); + } else { + runtime.state = State.PRE_TRANSIT; + runtime.currentEntry++; + } + return null; + } + + DiscoveredPath best = train.navigation.findPathTo(validStations, Double.MAX_VALUE); + if (best == null) { + if (anyMatch) + train.status.failedNavigation(); + runtime.startCooldown(); + return null; + } + + return best; + } + +} diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/destination/DestinationInstruction.java b/src/main/java/com/simibubi/create/content/trains/schedule/destination/DestinationInstruction.java index b68c3d1587..10130ca88a 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/destination/DestinationInstruction.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/destination/DestinationInstruction.java @@ -1,12 +1,21 @@ package com.simibubi.create.content.trains.schedule.destination; +import java.util.ArrayList; import java.util.List; +import java.util.regex.PatternSyntaxException; + +import javax.annotation.Nullable; import org.apache.commons.lang3.StringUtils; import com.google.common.collect.ImmutableList; import com.simibubi.create.AllBlocks; import com.simibubi.create.Create; +import com.simibubi.create.content.trains.entity.Train; +import com.simibubi.create.content.trains.graph.DiscoveredPath; +import com.simibubi.create.content.trains.graph.EdgePointType; +import com.simibubi.create.content.trains.schedule.ScheduleRuntime; +import com.simibubi.create.content.trains.station.GlobalStation; import com.simibubi.create.foundation.utility.CreateLang; import net.createmod.catnip.utility.Pair; @@ -69,4 +78,40 @@ public class DestinationInstruction extends TextScheduleInstruction { box.setFilter(s -> StringUtils.countMatches(s, '*') <= 3); } + @Override + @Nullable + public DiscoveredPath start(ScheduleRuntime runtime) { + String regex = getFilterForRegex(); + boolean anyMatch = false; + ArrayList validStations = new ArrayList<>(); + Train train = runtime.train; + + if (!train.hasForwardConductor() && !train.hasBackwardConductor()) { + train.status.missingConductor(); + runtime.startCooldown(); + return null; + } + + try { + for (GlobalStation globalStation : train.graph.getPoints(EdgePointType.STATION)) { + if (!globalStation.name.matches(regex)) + continue; + anyMatch = true; + validStations.add(globalStation); + } + } catch (PatternSyntaxException ignored) {} + + DiscoveredPath best = train.navigation.findPathTo(validStations, Double.MAX_VALUE); + if (best == null) { + if (anyMatch) + train.status.failedNavigation(); + else + train.status.failedNavigationNoTarget(getFilter()); + runtime.startCooldown(); + return null; + } + + return best; + } + } diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/destination/FetchPackagesInstruction.java b/src/main/java/com/simibubi/create/content/trains/schedule/destination/FetchPackagesInstruction.java new file mode 100644 index 0000000000..b214c58e3e --- /dev/null +++ b/src/main/java/com/simibubi/create/content/trains/schedule/destination/FetchPackagesInstruction.java @@ -0,0 +1,170 @@ +package com.simibubi.create.content.trains.schedule.destination; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map.Entry; +import java.util.regex.PatternSyntaxException; + +import org.apache.commons.lang3.StringUtils; + +import com.google.common.collect.ImmutableList; +import com.simibubi.create.Create; +import com.simibubi.create.content.logistics.box.PackageItem; +import com.simibubi.create.content.logistics.box.PackageStyles; +import com.simibubi.create.content.logistics.packagePort.postbox.PostboxBlockEntity; +import com.simibubi.create.content.trains.entity.Carriage; +import com.simibubi.create.content.trains.entity.CarriageContraptionEntity; +import com.simibubi.create.content.trains.entity.Train; +import com.simibubi.create.content.trains.graph.DiscoveredPath; +import com.simibubi.create.content.trains.graph.EdgePointType; +import com.simibubi.create.content.trains.schedule.ScheduleRuntime; +import com.simibubi.create.content.trains.schedule.ScheduleRuntime.State; +import com.simibubi.create.content.trains.station.GlobalStation; +import com.simibubi.create.content.trains.station.GlobalStation.GlobalPackagePort; +import com.simibubi.create.foundation.utility.CreateLang; + +import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.utility.lang.Components; +import net.minecraft.ChatFormatting; +import net.minecraft.client.gui.components.EditBox; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.items.IItemHandlerModifiable; + +public class FetchPackagesInstruction extends TextScheduleInstruction { + + @Override + public Pair getSummary() { + return Pair.of(getSecondLineIcon(), CreateLang.translateDirect("schedule.instruction.package_retrieval")); + } + + @Override + public List getTitleAs(String type) { + return ImmutableList.of(CreateLang.translate("schedule.instruction.package_retrieval.summary") + .style(ChatFormatting.GOLD) + .component(), CreateLang.translateDirect("generic.in_quotes", Components.literal(getLabelText())), + CreateLang.translateDirect("schedule.instruction.package_retrieval.summary_1") + .withStyle(ChatFormatting.GRAY), + CreateLang.translateDirect("schedule.instruction.package_retrieval.summary_2") + .withStyle(ChatFormatting.GRAY)); + } + + @Override + public ItemStack getSecondLineIcon() { + return PackageStyles.getDefaultBox(); + } + + public String getFilter() { + return getLabelText(); + } + + public String getFilterForRegex() { + String filter = getFilter(); + if (filter.isBlank()) + return filter; + return "\\Q" + filter.replace("*", "\\E.*\\Q") + "\\E"; + } + + @Override + public List getSecondLineTooltip(int slot) { + return ImmutableList.of(CreateLang.translateDirect("schedule.instruction.address_filter_edit_box"), + CreateLang.translateDirect("schedule.instruction.address_filter_edit_box_1") + .withStyle(ChatFormatting.GRAY), + CreateLang.translateDirect("schedule.instruction.address_filter_edit_box_2") + .withStyle(ChatFormatting.DARK_GRAY), + CreateLang.translateDirect("schedule.instruction.address_filter_edit_box_3") + .withStyle(ChatFormatting.DARK_GRAY)); + } + + @Override + @OnlyIn(Dist.CLIENT) + protected void modifyEditBox(EditBox box) { + box.setFilter(s -> StringUtils.countMatches(s, '*') <= 3); + } + + @Override + public ResourceLocation getId() { + return Create.asResource("package_retrieval"); + } + + @Override + public boolean supportsConditions() { + return false; + } + + @Override + public DiscoveredPath start(ScheduleRuntime runtime) { + String regex = getFilterForRegex(); + boolean anyMatch = false; + ArrayList validStations = new ArrayList<>(); + Train train = runtime.train; + + if (!train.hasForwardConductor() && !train.hasBackwardConductor()) { + train.status.missingConductor(); + runtime.startCooldown(); + return null; + } + + Level level = null; + for (Carriage carriage : train.carriages) { + if (level == null) { + CarriageContraptionEntity entity = carriage.anyAvailableEntity(); + if (entity != null && entity.level() instanceof ServerLevel sl) + level = sl; + } + } + + for (GlobalStation globalStation : train.graph.getPoints(EdgePointType.STATION)) { + for (Entry entry : globalStation.connectedPorts.entrySet()) { + GlobalPackagePort port = entry.getValue(); + BlockPos pos = entry.getKey(); + + IItemHandlerModifiable postboxInventory = port.offlineBuffer; + if (level != null && level.isLoaded(pos) + && level.getBlockEntity(pos) instanceof PostboxBlockEntity ppbe) { + postboxInventory = ppbe.inventory; + } + + for (int slot = 0; slot < postboxInventory.getSlots(); slot++) { + ItemStack stack = postboxInventory.getStackInSlot(slot); + if (!PackageItem.isPackage(stack)) + continue; + if (PackageItem.matchAddress(stack, port.address)) + continue; + try { + if (!PackageItem.getAddress(stack) + .matches(regex)) + continue; + anyMatch = true; + validStations.add(globalStation); + } catch (PatternSyntaxException ignored) { + } + } + } + } + + if (validStations.isEmpty()) { + runtime.startCooldown(); + runtime.state = State.PRE_TRANSIT; + runtime.currentEntry++; + return null; + } + + DiscoveredPath best = train.navigation.findPathTo(validStations, Double.MAX_VALUE); + if (best == null) { + if (anyMatch) + train.status.failedNavigation(); + runtime.startCooldown(); + return null; + } + + return best; + } + +} diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/destination/ScheduleInstruction.java b/src/main/java/com/simibubi/create/content/trains/schedule/destination/ScheduleInstruction.java index fdd98715e2..533d1a67e5 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/destination/ScheduleInstruction.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/destination/ScheduleInstruction.java @@ -2,9 +2,13 @@ package com.simibubi.create.content.trains.schedule.destination; import java.util.function.Supplier; +import javax.annotation.Nullable; + import com.simibubi.create.Create; +import com.simibubi.create.content.trains.graph.DiscoveredPath; import com.simibubi.create.content.trains.schedule.Schedule; import com.simibubi.create.content.trains.schedule.ScheduleDataEntry; +import com.simibubi.create.content.trains.schedule.ScheduleRuntime; import net.createmod.catnip.utility.Pair; import net.minecraft.nbt.CompoundTag; @@ -13,6 +17,9 @@ import net.minecraft.resources.ResourceLocation; public abstract class ScheduleInstruction extends ScheduleDataEntry { public abstract boolean supportsConditions(); + + @Nullable + public abstract DiscoveredPath start(ScheduleRuntime runtime); public final CompoundTag write() { CompoundTag tag = new CompoundTag(); diff --git a/src/main/resources/assets/create/lang/default/interface.json b/src/main/resources/assets/create/lang/default/interface.json index 2ec46b6a36..f40f23f9f4 100644 --- a/src/main/resources/assets/create/lang/default/interface.json +++ b/src/main/resources/assets/create/lang/default/interface.json @@ -790,6 +790,20 @@ "create.schedule.instruction.throttle.summary": "Change Max Speed to %1$s", "create.schedule.instruction.throttle_edit_box": "Throttle", "create.schedule.instruction.throttle_edit_box_1": "Affects the top speed of the Train", + + "create.schedule.instruction.package_delivery": "Deliver Package", + "create.schedule.instruction.package_delivery.summary": "Deliver first package in cargo", + "create.schedule.instruction.package_delivery.summary_1": "Drives to the station with", + "create.schedule.instruction.package_delivery.summary_2": "the correct postbox", + + "create.schedule.instruction.package_retrieval": "Retrieve Package", + "create.schedule.instruction.package_retrieval.summary": "Fetch a package addressed to:", + "create.schedule.instruction.package_retrieval.summary_1": "Drives to a postbox with", + "create.schedule.instruction.package_retrieval.summary_2": "an undelivered package", + "create.schedule.instruction.address_filter_edit_box": "Retrieve Packages with this Address", + "create.schedule.instruction.address_filter_edit_box_1": "Use * as a text wildcard", + "create.schedule.instruction.address_filter_edit_box_2": "Train may navigate anywhere to collect it", + "create.schedule.instruction.address_filter_edit_box_3": "Add another instruction to make it return", "create.schedule.condition_type": "Continue if/after:", "create.schedule.condition.editor": "Condition Editor", From db352dfa09048de836e3797266766fa7ce077a93 Mon Sep 17 00:00:00 2001 From: Kryppers <65094918+Kryppers@users.noreply.github.com> Date: Sat, 11 Jan 2025 22:08:36 +0000 Subject: [PATCH 282/515] rare package updates added rare_evan. Updated textures for rare_up and rare_darcy --- .../textures/item/package/rare_darcy.png | Bin 1100 -> 1119 bytes .../textures/item/package/rare_evan.png | Bin 0 -> 987 bytes .../create/textures/item/package/rare_up.png | Bin 981 -> 952 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/main/resources/assets/create/textures/item/package/rare_evan.png diff --git a/src/main/resources/assets/create/textures/item/package/rare_darcy.png b/src/main/resources/assets/create/textures/item/package/rare_darcy.png index 30ee855168afe04150ac6828cc84fa61bc9f408e..e579dec23f783e7716d3d7aadc56245b5f2aac8e 100644 GIT binary patch delta 1033 zcmV+k1or#P2;T^hBo78+OGiWiHvl&PH*?#G^N}GS2n!G&HIOkUmXS#)f5%BgK~z}7 z-B(X&6KNFxH8YdU*p5xoKeRTYT`Or*gHV=*iVL!bJt%k(6ch!)dJs`$>BW=iMbIMb z#e?i&1^42D2dRSKA+VsHv^7+1EsDk3GA{j+&LlIFWZFF>^O^Y{+oG@!hHt+2&CK`S z@4fe%_W|Eon#`N*-8R^EB9Vw? zEEEbGhCs*xNmJD^mgBxj2w1z~)8fClbMFBzogX z%sUW5aAtoJ8ku(up#y;}UF`q>qf&8f(z~t4(-T49p{g1rNrI|se=u}~u9YhW)#q|~ z)EgRd`&j=E2~VAyVf7LYM*skNse)K6=2&M~);|Z@wkC1(#E9dCqbEkt(z*SsV{95> z8s?b;qqm-*Srk!_#{mFEMZu<)7SGX3>>k?1jvz&#s3<7NGMYsZMMXhJcen58$q~iE zR~bgNS5NO3#^;o#`BZw^GlEP%3Oy;RcO4d~t0 zgRzlzy3o`A6CO?y5JGSuEu!%GJza~(4CBv)Z(hAZYb;u=OGCe=vu0p({We@Gg2CLjM3* zhC#(Ju$<2amZ2$x5CCm72kapTd1Yzh#Rbeu2IeILFMdBu^+7z~+}!$IUj*D_UaDYj z(ZE1Jd8w)fLEtINF_9Jk5&(c>8APM47RC%T;L*wvC@=rS+@gWhu~VK&WXj!p<4ANy z>okuc0uTW_f4KY1^6W<`=WT!)t1Vsa`1H$3q-qtS>$)!jiOwiZ;5GdXM{hl`uw9iE z<=Xro2OGMHu6=;h_KxapkhE4300000NkvXXu0mjf Dtp@AU delta 1042 zcmV+t1nv9Z2+RnOBqa%ONLh0L04^f{04^f|c%?sf00007bV*G`2k8L_6bCE)nT4K_ zTPT0VNklEEpd| z6p_62skASJDuurIAbqHyFBXJIEJ_4}fgrv}TPh6|3&F%NmfT(E@6OIn(udu-&fncx zV`!lVE@$T4`8nr1=X`Sp_>ZN-KltsZFV}w+MQ-aR+ol-%=&O#+a6t4AR##V1C=@^` zg)GZVJC1`~E*H|KX>J+cFONl9rA+U9@4*=lR>#>)NY#-)Eq9`(Kn?lnx*fxKK z=NN3yt$WN~sZ_}-Z+on(ynX#OZ>jIzw03=aBKHnW;%v1;NtbGjQ*B`OC;-UQM z32qVja{b0MiUaw8=4IsS|U&!$g=|8 z(ARMC@_dNx8my={&*x%nm?RE;1#O0d)|%(>nJ~z9rmnYS!^GB;WwsW(Ro%wy>}(@O#lD@ diff --git a/src/main/resources/assets/create/textures/item/package/rare_evan.png b/src/main/resources/assets/create/textures/item/package/rare_evan.png new file mode 100644 index 0000000000000000000000000000000000000000..59aecc320cf9b5fb8ab2324e97c279e63dc36b0e GIT binary patch literal 987 zcmV<110?*3P)ZE6D>zlEsN4Vm187M^ zK~z}7)t66e+(sD2f7YL!U2NAIK}@I}ichu!z4lP@0Rlam-g@h)6hrBuNe?BI9s+^% zV)_9Jg@gq6)ZR)0A=jJ&rnCXm)(&MCYqgt|HM1+NdsvSwX-8T+b}4-?TFt!DJny6D zeP$N^T}_MXe?PP=j$^qWZZ!+sToh2jIN*HcuYhqrLic;(_++Q=UAy z$L!@5BY?8b(Lgk?N)5!lR~)p*sxL;^-X#`-e!pKSs$zwr<}i$t^uEYo%0TyZ1i)aR zatZo@?6}S~MRXXR3Yd`r-}e~~6NW>7T=j9kg<+T*uL@1Is5wMZp$0LQb>dmY0-bCJ zD0MQqwDw-wM!`Xwu)Ukkd7f7aU@$l~u0cG(q+{FFPWbE24hxr><37H;!ayAo9JJ{K zK7YRaeN2BRVC~wqsZ3}F$`~?!g7>dqCr%O^+oo1?xzzNSpKAafjkR?g+a^vDdfl#Z zpZMf6dtw1CLal+~Cz$YotV-kFtBLV4A6T?!*xnjVicieto~vXa8=d{%5JK?x?hZnT zQWfji*tBvEXNx(c>Hy$6HqGV&0F6eSD3a3wn3yq%NXNq;e`0yDnHl*7faiwXy;e{T zU|OYRvAoz!1^mXlVO3k5CX_s()+%9Zlq6;V-PaMGcS3d5!eve<>ho^0LEZF}}I~{EhyqS<~FDxPMPO6P{}?Fr5j{;)MUp_y-9A(HhYTwC4Z-002ov JPDHLkV1lec&!_+Z literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/item/package/rare_up.png b/src/main/resources/assets/create/textures/item/package/rare_up.png index 032272266be2c64c7e2e1a269ed33bc9b6af08ed..18c20406b95ddb97d7f445f04564f40cc323a073 100644 GIT binary patch delta 930 zcmV;T16};p2e=22B!32COGiWiHvl&PH*?#G^8f$<32;bRa{vGf6951U69E94oEQKA z00(qQO+^Rk0SgcxIPQR3D*ylkMM*?KR9M5^S4(RXQ560 znP( zP1jLya>6PgHPnx=W5i3c?=v%@GqIuTph&X05}JxvEdE3+7PoAxO6W&Ar=Rfam0y5% z6Pt0JEg;$r*lIy0nVs<{FV=hYDvZ3cEMxH~$Vv?yqQWNd8zXZ)dh!$leO#zmn_01W z0p0y0sDI?waU?Z{Vo8FMTMI;HppV1BZmwnIsGyTl@ubTigoGm3p(T8Ztr~`R0lP&B z=?|~0Q;bh0Q4j?HJPM+K@9B@V_X;8sgDKD8G!sHcA`!@b92gxNv-Sm1Kqgn~RVF7Q zk*J}ONF+U_c=X~`=teaZ>RMM9p-4H)(TZK z5RH%^qX$6frRGYwxUhujnJK(~n?`mkhj>pM7cPzaDq$ukf~FNWFBIoqf}%+NBuuZY zp^&eSNp>rT>6s}kE-VGZ+RH(!)^*K1aU&WgB7B_oFThOr^4Xgjv~;-3>B{TpU>dJl z0e@2<2MH0^%h^t=DO%`4_B;guaQf^BXqtxpXI?K~I}ZSuymF>#Y*Pmal0?-oTqrm- zz*h-Zmp>!Fy;HyOcCnZ^H`-KQ_eF|TRl&)LVXQ6#`RyIBU983ap!Hz>U0Z+EY)Z)U z^#{WzjsgINjva34PPnJv0_UADd9(+WiW}m(BmP(GHvp%dzwq$B3IG5A07*qoM6N<$ Ef>MZ{W&i*H delta 959 zcmV;w13>(^2h|6VB!2;OQb$4nuFf3k000AZNklIN!rcU zB%R%4H~J7}vzOV6wIKMxawcbI&-v!eIcFxoKSm21yq&rAOMg-1SRYZUozA&~+WMEZfpB3=l$GvQnw+hi?Et!mDU$X)H`kCil%r7(}n)aPLXzdKG5z zt4n{dBL`WQU~Yco8rtg?`XaFX^#i6R@A*EOn!JZ{{&S#FMUg?Nj(k23N_A-3j!QcA zPNF^n0I>RL1Amrj`g8z%dM_l200630!zCF6(H(Rjf$u-I0*$Y&e+zXUhnN?>95|9m z;pUBNFpLIs#`yZx38YeOD3{Bjj=U@MI`&4;j=)Zdat-oA9yAvK=q|rRy~G$?T2)n1 zt68YkQ~)0|)h=Smo@9TuD zQEHf z&Z96%9XZ6W4Gx0Jh~dHGS@d+KW7*osYtaPSyH8+uYaPdOeJGVFjKW%IWO_Q&IMg1G zfD=9f&VQAPZCyTnSR@R+8QMeu*}7%%3G9?8R^Khzt2lGM3q?%@kU>#X@n!XWV_s21 zwl~K$PUIMUB$tC+s|!cF5-b@;YHMQHLP4!m93~T5E<`N`E%CqFS>cB?So50VK@kfyV8Gi*qX& z8a)d_2<}h6#8E}Ee+PBK&4LC(44>XGykiQ(XhzW2h^8Md*yHCcAuufqBbNtZ7=|sQ!1_Q!5Ky-) zUlhDO0C5f@c6z;3rDx&{oVY66{c7r`Lr`{aBn^ z!T8t!w+ik|z1h=Wwa7c6^ZXvUJQzB6FF1(26Y}ne{}p}%)qcV)H1?D20000EWmrjO hO-%qQ00008000000002eQ Date: Sat, 11 Jan 2025 22:10:20 +0000 Subject: [PATCH 283/515] sent the wrong one! fixed rare_evan version --- .../create/textures/item/package/rare_evan.png | Bin 987 -> 1003 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/create/textures/item/package/rare_evan.png b/src/main/resources/assets/create/textures/item/package/rare_evan.png index 59aecc320cf9b5fb8ab2324e97c279e63dc36b0e..dad9b0bc6a2d5ee6e6cc35c368d150124852d669 100644 GIT binary patch delta 932 zcmV;V16%yt2kQrrRevl7+lnKw000AcNkl`-f z*-q)ThmuoIfznG&|AtbEY006q5HO{OLLj}E{s)DG1pCz9N&+F*oI*^~1PrMi$}ZMw z*SnTRt6BB1kt}IPT01s`zKd2fPnz$2`rbFQ@RnmL{_*7AMt`)mIi#r~uKzHtP5$NQ zKJ(@jYwHFde(~efc>u8DACBYjqCX3O=lS@)Ppwu%N{J8xDJ5OspbI#Td;Sc3zWhNH zcteOHOkr?iyc*-LHRu0;^KVBt9FuV8YF> zKV@#V&i0p2Gk^0>?rlW%dM&x1zO>B#-ajlXUPj3tetSQe^E^NKghu)$OYbiL@aWoo zR2XI!cy#SP0GAgpX)D><9P-=EBbv=7p68=vkD90gFbGvL?z$b)K#ly1d|$$V7}DrpL=7rdm`jJYOP%5W_g`*nELjx&x#3!TOn&fEn$CQeehP6H?HgmW{Zy{4P9;_}==0P%ux zFO>fU;Y0pf@N0000!}n&>7hvvC6pclf%Ibf0SbkL1ozb5N&+F*oC2n_0n^qFWfyC; zo0T=QE3JE2k1T0NT03?reJ@(gywW`Hqvw5Q7XIUy(LY{1x_^DNy)~kh9P#;=v&Q6a z?}RMcGi+>Hy!+wTGZz8C(La3O=Vdq#Kom)&l+^2Wlu`&GP)gC07CpfCg9~H8$==+& zT}_MXe?PP=j$^ zqWZZ!+sToh2jIN*HcuYhqrLic;(_++Q=UAy$L!@5BY%Lh&e1?Luu2WYy;mHx$Eq(z z*xn@;f_}eWDXLHAQq7o(h&^}fmzv`~zP!Rf9TFV0=>$H1zWjYmep{GJb;h zuU{ul5**v6R&%-3^q8M(03MCCbsXC!P7-?Eu5q9E0WCtUf#N5a@PVvK1Vlsuu< zDq(AsBxV5J*Abp~LUq-`WlkvS_30>G7g?qO-}fh+&*Y3%3|O|!C`l$5C{}KC!mNs` z!hg$DU}V5`jg_ZczKH?f_whV0cLprGmNB6o^0LEZF}}I~{EhyqS<~FD qxPMPO6P{}?Fr5j{;)MUp_y-9A(HhYTv<>F~0000 Date: Fri, 6 Dec 2024 15:05:08 -0800 Subject: [PATCH 284/515] Cheap perf - Replace SmartBlockEntity#behaviours with a Reference2ObjectArrayMap for faster iteration and because BehaviorTypes are unique by reference - SmartBlockEntityTicker#tick improvements - Client: 9% of all -> 7% of all - Server: 12% of all -> 10% of all --- .../create/foundation/blockEntity/SmartBlockEntity.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/SmartBlockEntity.java b/src/main/java/com/simibubi/create/foundation/blockEntity/SmartBlockEntity.java index c41ee270cd..ff896640c4 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/SmartBlockEntity.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/SmartBlockEntity.java @@ -2,7 +2,6 @@ package com.simibubi.create.foundation.blockEntity; import java.util.ArrayList; import java.util.Collection; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.function.Consumer; @@ -17,6 +16,7 @@ import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour import com.simibubi.create.foundation.utility.IInteractionChecker; import com.simibubi.create.api.schematic.nbt.IPartialSafeNBT; +import it.unimi.dsi.fastutil.objects.Reference2ObjectArrayMap; import net.createmod.ponder.api.VirtualBlockEntity; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; @@ -31,7 +31,7 @@ import net.minecraftforge.common.capabilities.ForgeCapabilities; public abstract class SmartBlockEntity extends CachedRenderBBBlockEntity implements IPartialSafeNBT, IInteractionChecker, ISpecialBlockEntityItemRequirement, VirtualBlockEntity { - private final Map, BlockEntityBehaviour> behaviours = new HashMap<>(); + private final Map, BlockEntityBehaviour> behaviours = new Reference2ObjectArrayMap<>(); private boolean initialized = false; private boolean firstNbtRead = true; protected int lazyTickRate; From 1fbfeb6f006f1c6ea3b596cd4ff68b668b8bc64d Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Sat, 11 Jan 2025 20:33:53 -0800 Subject: [PATCH 285/515] Lily pad manners - Fix the package/rigging initially appearing inside the frog's mouth when it's retrieving a package - Lazily update the body/head/tongue so we don't have to upload it every frame when not animating --- .../packagePort/frogport/FrogportVisual.java | 76 ++++++++++++------- 1 file changed, 50 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportVisual.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportVisual.java index 776ea2d2ea..b2a4126b96 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportVisual.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportVisual.java @@ -3,6 +3,7 @@ package com.simibubi.create.content.logistics.packagePort.frogport; import java.util.function.Consumer; import org.jetbrains.annotations.Nullable; +import org.joml.Matrix4f; import com.simibubi.create.AllPartialModels; @@ -17,6 +18,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.phys.Vec3; + import net.minecraftforge.registries.ForgeRegistries; public class FrogportVisual extends AbstractBlockEntityVisual implements SimpleDynamicVisual { @@ -26,6 +28,12 @@ public class FrogportVisual extends AbstractBlockEntityVisual 0 ? (float) Math.max(0, 1 - Math.pow((anticipation * 1.25) * 2 - 1, 4)) : 0; + rig.handle() + .setVisible(false); + box.handle() + .setVisible(false); } headPitch *= headPitchModifier; headPitch = Math.max(headPitch, blockEntity.manualOpenAnimationProgress.getValue(partialTicks) * 60); tongueLength = Math.max(tongueLength, blockEntity.manualOpenAnimationProgress.getValue(partialTicks) * 0.25f); - - body.setIdentityTransform() - .translate(getVisualPosition()) - .center() - .rotateYDegrees(yaw) - .uncenter() - .setChanged(); - head.setIdentityTransform() - .translate(getVisualPosition()) - .center() - .rotateYDegrees(yaw) - .uncenter() - .translate(8 / 16f, 10 / 16f, 11 / 16f) - .rotateXDegrees(headPitch) - .translateBack(8 / 16f, 10 / 16f, 11 / 16f) - .setChanged(); + if (yaw != lastYaw) { + body.setIdentityTransform() + .translate(getVisualPosition()) + .center() + .rotateYDegrees(yaw) + .uncenter() + .setChanged(); - tongue.setIdentityTransform() - .translate(getVisualPosition()) - .center() - .rotateYDegrees(yaw) - .uncenter() - .translate(8 / 16f, 10 / 16f, 11 / 16f) - .rotateXDegrees(tonguePitch) - .scale(1f, 1f, tongueLength / (7 / 16f)) - .translateBack(8 / 16f, 10 / 16f, 11 / 16f) - .setChanged(); + // Save the base pose to avoid recalculating it twice every frame + basePose.set(body.pose) + .translate(8 / 16f, 10 / 16f, 11 / 16f); + + // I'm not entirely sure that yaw ever changes + lastYaw = yaw; + + // Force the head and tongue to update + lastTonguePitch = Float.NaN; + lastHeadPitch = Float.NaN; + } + + if (headPitch != lastHeadPitch) { + head.setTransform(basePose) + .rotateXDegrees(headPitch) + .translateBack(8 / 16f, 10 / 16f, 11 / 16f) + .setChanged(); + + lastHeadPitch = headPitch; + } + + if (tonguePitch != lastTonguePitch || tongueLength != lastTongueLength) { + tongue.setTransform(basePose) + .rotateXDegrees(tonguePitch) + .scale(1f, 1f, tongueLength / (7 / 16f)) + .translateBack(8 / 16f, 10 / 16f, 11 / 16f) + .setChanged(); + + lastTonguePitch = tonguePitch; + lastTongueLength = tongueLength; + } } private void renderPackage(Vec3 diff, float scale, float itemDistance) { From b2891263d65ea2cd2a39dd504563a361fd5cb25f Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Sat, 11 Jan 2025 23:04:01 -0800 Subject: [PATCH 286/515] Accretion - Combine rotating/actor instance types - Preference towards actor, but the arbitrary pivot was never used - Inline KineticInstance - Remove magic 3/10 constant in rotating shader, instead use renderSeconds and multiply by 6 ahead of time - Now the rotational speed is in degrees per second --- .../base/KineticBlockEntityVisual.java | 10 +-- .../kinetics/base/KineticInstance.java | 69 ------------------ .../kinetics/base/RotatingInstance.java | 73 ++++++++++++++++++- .../content/kinetics/belt/BeltVisual.java | 3 +- .../kinetics/drill/DrillActorVisual.java | 23 +++--- .../kinetics/gearbox/GearboxVisual.java | 2 +- .../content/kinetics/mixer/MixerVisual.java | 2 +- .../foundation/render/AllInstanceTypes.java | 50 +++---------- .../create/flywheel/instance/actor.vert | 13 ---- .../create/flywheel/instance/cull/actor.glsl | 8 -- .../flywheel/instance/cull/rotating.glsl | 2 +- .../create/flywheel/instance/rotating.vert | 20 ++--- 12 files changed, 109 insertions(+), 166 deletions(-) delete mode 100644 src/main/java/com/simibubi/create/content/kinetics/base/KineticInstance.java delete mode 100644 src/main/resources/assets/create/flywheel/instance/actor.vert delete mode 100644 src/main/resources/assets/create/flywheel/instance/cull/actor.glsl diff --git a/src/main/java/com/simibubi/create/content/kinetics/base/KineticBlockEntityVisual.java b/src/main/java/com/simibubi/create/content/kinetics/base/KineticBlockEntityVisual.java index bbd66e8faf..528aee931b 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/base/KineticBlockEntityVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/base/KineticBlockEntityVisual.java @@ -6,9 +6,9 @@ import com.simibubi.create.content.kinetics.simpleRelays.ShaftBlock; import dev.engine_room.flywheel.api.visualization.VisualizationContext; import dev.engine_room.flywheel.lib.visual.AbstractBlockEntityVisual; -import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; +import net.minecraft.core.Vec3i; import net.minecraft.world.level.block.state.BlockState; public abstract class KineticBlockEntityVisual extends AbstractBlockEntityVisual { @@ -32,7 +32,7 @@ public abstract class KineticBlockEntityVisual ext protected final void updateRotation(RotatingInstance instance, Direction.Axis axis, float speed) { instance.setRotationAxis(axis) .setRotationOffset(getRotationOffset(axis)) - .setRotationalSpeed(speed) + .setRotationalSpeed(speed * RotatingInstance.SPEED_MULTIPLIER) .setColor(blockEntity) .setChanged(); } @@ -51,7 +51,7 @@ public abstract class KineticBlockEntityVisual ext protected final RotatingInstance setup(RotatingInstance key, Direction.Axis axis, float speed) { key.setRotationAxis(axis) - .setRotationalSpeed(speed) + .setRotationalSpeed(speed * RotatingInstance.SPEED_MULTIPLIER) .setRotationOffset(getRotationOffset(axis)) .setColor(blockEntity) .setPosition(getVisualPosition()) @@ -76,7 +76,7 @@ public abstract class KineticBlockEntityVisual ext return shaft(rotationAxis()); } - public static float rotationOffset(BlockState state, Axis axis, BlockPos pos) { + public static float rotationOffset(BlockState state, Axis axis, Vec3i pos) { if (shouldOffset(axis, pos)) { return 22.5f; } else { @@ -84,7 +84,7 @@ public abstract class KineticBlockEntityVisual ext } } - public static boolean shouldOffset(Axis axis, BlockPos pos) { + public static boolean shouldOffset(Axis axis, Vec3i pos) { // Sum the components of the other 2 axes. int x = (axis == Axis.X) ? 0 : pos.getX(); int y = (axis == Axis.Y) ? 0 : pos.getY(); diff --git a/src/main/java/com/simibubi/create/content/kinetics/base/KineticInstance.java b/src/main/java/com/simibubi/create/content/kinetics/base/KineticInstance.java deleted file mode 100644 index 15f8f45ddf..0000000000 --- a/src/main/java/com/simibubi/create/content/kinetics/base/KineticInstance.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.simibubi.create.content.kinetics.base; - -import org.joml.Vector3f; - -import dev.engine_room.flywheel.api.instance.InstanceHandle; -import dev.engine_room.flywheel.api.instance.InstanceType; -import dev.engine_room.flywheel.lib.instance.ColoredLitInstance; -import net.createmod.catnip.utility.theme.Color; -import net.minecraft.core.BlockPos; - -public class KineticInstance extends ColoredLitInstance { - public float x; - public float y; - public float z; - public float rotationalSpeed; - public float rotationOffset; - - protected KineticInstance(InstanceType type, InstanceHandle handle) { - super(type, handle); - } - - public KineticInstance setPosition(BlockPos pos) { - return setPosition(pos.getX(), pos.getY(), pos.getZ()); - } - - public KineticInstance setPosition(Vector3f pos) { - return setPosition(pos.x(), pos.y(), pos.z()); - } - - public KineticInstance setPosition(float x, float y, float z) { - this.x = x; - this.y = y; - this.z = z; - return this; - } - - public KineticInstance nudge(float x, float y, float z) { - this.x += x; - this.y += y; - this.z += z; - return this; - } - - public KineticInstance setColor(KineticBlockEntity blockEntity) { - colorRgb(colorFromBE(blockEntity)); - return this; - } - - public KineticInstance setColor(Color c) { - color(c.getRed(), c.getGreen(), c.getBlue()); - return this; - } - - public KineticInstance setRotationalSpeed(float rotationalSpeed) { - this.rotationalSpeed = rotationalSpeed; - return this; - } - - public KineticInstance setRotationOffset(float rotationOffset) { - this.rotationOffset = rotationOffset; - return this; - } - - public static int colorFromBE(KineticBlockEntity be) { - if (be.hasNetwork()) - return Color.generateFromLong(be.network).getRGB(); - return 0xFFFFFF; - } -} diff --git a/src/main/java/com/simibubi/create/content/kinetics/base/RotatingInstance.java b/src/main/java/com/simibubi/create/content/kinetics/base/RotatingInstance.java index 56d998c008..9569aac356 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/base/RotatingInstance.java +++ b/src/main/java/com/simibubi/create/content/kinetics/base/RotatingInstance.java @@ -1,20 +1,48 @@ package com.simibubi.create.content.kinetics.base; +import org.joml.Quaternionf; import org.joml.Vector3f; import dev.engine_room.flywheel.api.instance.InstanceHandle; import dev.engine_room.flywheel.api.instance.InstanceType; +import dev.engine_room.flywheel.lib.instance.ColoredLitInstance; +import net.createmod.catnip.utility.theme.Color; import net.minecraft.core.Direction; +import net.minecraft.core.Vec3i; + +public class RotatingInstance extends ColoredLitInstance { + public static final float SPEED_MULTIPLIER = 6; -public class RotatingInstance extends KineticInstance { public byte rotationAxisX; public byte rotationAxisY; public byte rotationAxisZ; + public float x; + public float y; + public float z; + /** + * Speed in degrees per second + */ + public float rotationalSpeed; + /** + * Offset in degrees + */ + public float rotationOffset; - public RotatingInstance(InstanceType type, InstanceHandle handle) { + /** + * Base rotation of the instance, applied before kinetic rotation + */ + public final Quaternionf rotation = new Quaternionf(); + + public RotatingInstance(InstanceType type, InstanceHandle handle) { super(type, handle); } + public static int colorFromBE(KineticBlockEntity be) { + if (be.hasNetwork()) + return Color.generateFromLong(be.network).getRGB(); + return 0xFFFFFF; + } + public RotatingInstance setRotationAxis(Direction.Axis axis) { Direction orientation = Direction.get(Direction.AxisDirection.POSITIVE, axis); return setRotationAxis(orientation.step()); @@ -31,4 +59,45 @@ public class RotatingInstance extends KineticInstance { return this; } + public RotatingInstance setPosition(Vec3i pos) { + return setPosition(pos.getX(), pos.getY(), pos.getZ()); + } + + public RotatingInstance setPosition(Vector3f pos) { + return setPosition(pos.x(), pos.y(), pos.z()); + } + + public RotatingInstance setPosition(float x, float y, float z) { + this.x = x; + this.y = y; + this.z = z; + return this; + } + + public RotatingInstance nudge(float x, float y, float z) { + this.x += x; + this.y += y; + this.z += z; + return this; + } + + public RotatingInstance setColor(KineticBlockEntity blockEntity) { + colorRgb(colorFromBE(blockEntity)); + return this; + } + + public RotatingInstance setColor(Color c) { + color(c.getRed(), c.getGreen(), c.getBlue()); + return this; + } + + public RotatingInstance setRotationalSpeed(float rotationalSpeed) { + this.rotationalSpeed = rotationalSpeed; + return this; + } + + public RotatingInstance setRotationOffset(float rotationOffset) { + this.rotationOffset = rotationOffset; + return this; + } } diff --git a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltVisual.java b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltVisual.java index 3546a7cf6b..75f8035df8 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltVisual.java @@ -7,7 +7,6 @@ import org.joml.Quaternionf; import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.kinetics.base.KineticBlockEntityVisual; -import com.simibubi.create.content.kinetics.base.KineticInstance; import com.simibubi.create.content.kinetics.base.RotatingInstance; import com.simibubi.create.content.processing.burner.ScrollInstance; import com.simibubi.create.foundation.render.AllInstanceTypes; @@ -158,7 +157,7 @@ public class BeltVisual extends KineticBlockEntityVisual { .rotation(q) .speed(0, speed * MAGIC_SCROLL_MULTIPLIER) .offset(0, bottom ? SCROLL_OFFSET_BOTTOM : SCROLL_OFFSET_OTHERWISE) - .colorRgb(KineticInstance.colorFromBE(blockEntity)) + .colorRgb(RotatingInstance.colorFromBE(blockEntity)) .setChanged(); return key; diff --git a/src/main/java/com/simibubi/create/content/kinetics/drill/DrillActorVisual.java b/src/main/java/com/simibubi/create/content/kinetics/drill/DrillActorVisual.java index c7ac70aacf..ae2acca9d3 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/drill/DrillActorVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/drill/DrillActorVisual.java @@ -1,11 +1,9 @@ package com.simibubi.create.content.kinetics.drill; -import org.joml.Quaternionf; - import com.simibubi.create.AllPartialModels; -import com.simibubi.create.content.contraptions.actors.ActorInstance; import com.simibubi.create.content.contraptions.behaviour.MovementContext; import com.simibubi.create.content.contraptions.render.ActorVisual; +import com.simibubi.create.content.kinetics.base.RotatingInstance; import com.simibubi.create.foundation.render.AllInstanceTypes; import com.simibubi.create.foundation.virtualWorld.VirtualRenderWorld; @@ -19,7 +17,7 @@ import net.minecraft.world.level.block.state.BlockState; public class DrillActorVisual extends ActorVisual { - ActorInstance drillHead; + RotatingInstance drillHead; private final Direction facing; public DrillActorVisual(VisualizationContext visualizationContext, VirtualRenderWorld contraption, MovementContext context) { @@ -38,21 +36,22 @@ public class DrillActorVisual extends ActorVisual { else eulerY = facing.toYRot() + ((axis == Direction.Axis.X) ? 180 : 0); - drillHead = instancerProvider.instancer(AllInstanceTypes.ACTOR, Models.partial(AllPartialModels.DRILL_HEAD)) + drillHead = instancerProvider.instancer(AllInstanceTypes.ROTATING, Models.partial(AllPartialModels.DRILL_HEAD)) .createInstance(); + drillHead.rotation.rotationXYZ(eulerX * Mth.DEG_TO_RAD, eulerY * Mth.DEG_TO_RAD, 0); + drillHead.setPosition(context.localPos) - .setBlockLight(localBlockLight()) - .setRotationOffset(0) - .setRotationAxis(0, 0, 1) - .setLocalRotation(new Quaternionf().rotationXYZ(eulerX * Mth.DEG_TO_RAD, eulerY * Mth.DEG_TO_RAD, 0)) - .setSpeed(getSpeed(facing)) - .setChanged(); + .setRotationOffset(0) + .setRotationAxis(0, 0, 1) + .setRotationalSpeed(getSpeed(facing)) + .light(localBlockLight(), 0) + .setChanged(); } @Override public void beginFrame() { - drillHead.setSpeed(getSpeed(facing)) + drillHead.setRotationalSpeed(getSpeed(facing)) .setChanged(); } diff --git a/src/main/java/com/simibubi/create/content/kinetics/gearbox/GearboxVisual.java b/src/main/java/com/simibubi/create/content/kinetics/gearbox/GearboxVisual.java index b9ee456478..3d173b56e6 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/gearbox/GearboxVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/gearbox/GearboxVisual.java @@ -45,7 +45,7 @@ public class GearboxVisual extends KineticBlockEntityVisual .createInstance(); key.setRotationAxis(axis) - .setRotationalSpeed(getSpeed(direction)) + .setRotationalSpeed(getSpeed(direction) * RotatingInstance.SPEED_MULTIPLIER) .setRotationOffset(getRotationOffset(axis)).setColor(blockEntity) .setPosition(getVisualPosition()) .light(blockLight, skyLight) diff --git a/src/main/java/com/simibubi/create/content/kinetics/mixer/MixerVisual.java b/src/main/java/com/simibubi/create/content/kinetics/mixer/MixerVisual.java index f229d9d870..1157b7d889 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/mixer/MixerVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/mixer/MixerVisual.java @@ -60,7 +60,7 @@ public class MixerVisual extends EncasedCogVisual implements SimpleDynamicVisual mixerHead.setPosition(getVisualPosition()) .nudge(0, -renderedHeadOffset, 0) - .setRotationalSpeed(speed * 2) + .setRotationalSpeed(speed * 2 * RotatingInstance.SPEED_MULTIPLIER) .setChanged(); } diff --git a/src/main/java/com/simibubi/create/foundation/render/AllInstanceTypes.java b/src/main/java/com/simibubi/create/foundation/render/AllInstanceTypes.java index 36b83b0fdf..007e14ff68 100644 --- a/src/main/java/com/simibubi/create/foundation/render/AllInstanceTypes.java +++ b/src/main/java/com/simibubi/create/foundation/render/AllInstanceTypes.java @@ -4,7 +4,6 @@ import static com.simibubi.create.Create.asResource; import org.lwjgl.system.MemoryUtil; -import com.simibubi.create.content.contraptions.actors.ActorInstance; import com.simibubi.create.content.kinetics.base.RotatingInstance; import com.simibubi.create.content.processing.burner.ScrollInstance; @@ -14,6 +13,7 @@ import dev.engine_room.flywheel.api.layout.IntegerRepr; import dev.engine_room.flywheel.api.layout.LayoutBuilder; import dev.engine_room.flywheel.lib.instance.SimpleInstanceType; import dev.engine_room.flywheel.lib.util.ExtraMemoryOps; + import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -26,6 +26,7 @@ public class AllInstanceTypes { .vector("color", FloatRepr.NORMALIZED_UNSIGNED_BYTE, 4) .vector("light", IntegerRepr.SHORT, 2) .vector("overlay", IntegerRepr.SHORT, 2) + .vector("rotation", FloatRepr.FLOAT, 4) .vector("pos", FloatRepr.FLOAT, 3) .scalar("speed", FloatRepr.FLOAT) .scalar("offset", FloatRepr.FLOAT) @@ -38,14 +39,15 @@ public class AllInstanceTypes { MemoryUtil.memPutByte(ptr + 3, instance.alpha); ExtraMemoryOps.put2x16(ptr + 4, instance.light); ExtraMemoryOps.put2x16(ptr + 8, instance.overlay); - MemoryUtil.memPutFloat(ptr + 12, instance.x); - MemoryUtil.memPutFloat(ptr + 16, instance.y); - MemoryUtil.memPutFloat(ptr + 20, instance.z); - MemoryUtil.memPutFloat(ptr + 24, instance.rotationalSpeed); - MemoryUtil.memPutFloat(ptr + 28, instance.rotationOffset); - MemoryUtil.memPutByte(ptr + 32, instance.rotationAxisX); - MemoryUtil.memPutByte(ptr + 33, instance.rotationAxisY); - MemoryUtil.memPutByte(ptr + 34, instance.rotationAxisZ); + ExtraMemoryOps.putQuaternionf(ptr + 12, instance.rotation); + MemoryUtil.memPutFloat(ptr + 28, instance.x); + MemoryUtil.memPutFloat(ptr + 32, instance.y); + MemoryUtil.memPutFloat(ptr + 36, instance.z); + MemoryUtil.memPutFloat(ptr + 40, instance.rotationalSpeed); + MemoryUtil.memPutFloat(ptr + 44, instance.rotationOffset); + MemoryUtil.memPutByte(ptr + 48, instance.rotationAxisX); + MemoryUtil.memPutByte(ptr + 49, instance.rotationAxisY); + MemoryUtil.memPutByte(ptr + 50, instance.rotationAxisZ); }) .build(); @@ -85,36 +87,6 @@ public class AllInstanceTypes { }) .build(); - public static final InstanceType ACTOR = SimpleInstanceType.builder(ActorInstance::new) - .cullShader(asResource("instance/cull/actor.glsl")) - .vertexShader(asResource("instance/actor.vert")) - .layout(LayoutBuilder.create() - .vector("pos", FloatRepr.FLOAT, 3) - .vector("light", IntegerRepr.SHORT, 2) - .scalar("offset", FloatRepr.FLOAT) - .vector("axis", FloatRepr.NORMALIZED_BYTE, 3) - .vector("rotation", FloatRepr.FLOAT, 4) - .vector("rotationCenter", FloatRepr.NORMALIZED_BYTE, 3) - .scalar("speed", FloatRepr.FLOAT) - .build()) - .writer((ptr, instance) -> { - MemoryUtil.memPutFloat(ptr, instance.x); - MemoryUtil.memPutFloat(ptr + 4, instance.y); - MemoryUtil.memPutFloat(ptr + 8, instance.z); - MemoryUtil.memPutShort(ptr + 12, instance.blockLight); - MemoryUtil.memPutShort(ptr + 14, instance.skyLight); - MemoryUtil.memPutFloat(ptr + 16, instance.rotationOffset); - MemoryUtil.memPutByte(ptr + 20, instance.rotationAxisX); - MemoryUtil.memPutByte(ptr + 21, instance.rotationAxisY); - MemoryUtil.memPutByte(ptr + 22, instance.rotationAxisZ); - ExtraMemoryOps.putQuaternionf(ptr + 24, instance.rotation); - MemoryUtil.memPutByte(ptr + 40, instance.rotationCenterX); - MemoryUtil.memPutByte(ptr + 41, instance.rotationCenterY); - MemoryUtil.memPutByte(ptr + 42, instance.rotationCenterZ); - MemoryUtil.memPutFloat(ptr + 44, instance.speed); - }) - .build(); - public static void init() { // noop } diff --git a/src/main/resources/assets/create/flywheel/instance/actor.vert b/src/main/resources/assets/create/flywheel/instance/actor.vert deleted file mode 100644 index 7c06bd569f..0000000000 --- a/src/main/resources/assets/create/flywheel/instance/actor.vert +++ /dev/null @@ -1,13 +0,0 @@ -#include "flywheel:util/matrix.glsl" -#include "flywheel:util/quaternion.glsl" - -void flw_instanceVertex(in FlwInstance instance) { - float degrees = instance.offset + flw_renderSeconds * instance.speed; - - vec4 kineticRot = quaternionDegrees(instance.axis, degrees); - vec3 rotated = rotateByQuaternion(flw_vertexPos.xyz - instance.rotationCenter, kineticRot) + instance.rotationCenter; - - flw_vertexPos.xyz = rotateByQuaternion(rotated - .5, instance.rotation) + instance.pos + .5; - flw_vertexNormal = rotateByQuaternion(rotateByQuaternion(flw_vertexNormal, kineticRot), instance.rotation); - flw_vertexLight = max(vec2(instance.light) / 256., flw_vertexLight); -} diff --git a/src/main/resources/assets/create/flywheel/instance/cull/actor.glsl b/src/main/resources/assets/create/flywheel/instance/cull/actor.glsl deleted file mode 100644 index 6a0b1d8579..0000000000 --- a/src/main/resources/assets/create/flywheel/instance/cull/actor.glsl +++ /dev/null @@ -1,8 +0,0 @@ -void flw_transformBoundingSphere(in FlwInstance instance, inout vec3 center, inout float radius) { - // The instance will spin about the rotation center, so we need to expand the radius to account for that - float extraForKinetic = length(center - instance.rotationCenter); - float extraForModel = length(center - 0.5); - - radius += extraForKinetic + extraForModel; - center += instance.pos; -} diff --git a/src/main/resources/assets/create/flywheel/instance/cull/rotating.glsl b/src/main/resources/assets/create/flywheel/instance/cull/rotating.glsl index da6118e155..67f3c35fce 100644 --- a/src/main/resources/assets/create/flywheel/instance/cull/rotating.glsl +++ b/src/main/resources/assets/create/flywheel/instance/cull/rotating.glsl @@ -1,5 +1,5 @@ void flw_transformBoundingSphere(in FlwInstance instance, inout vec3 center, inout float radius) { - // The instance will spin about (0.5, 0.5, 0.5), so we need to expand the radius to account for that + // The instance will spin about the rotation center, so we need to expand the radius to account for that radius += length(center - 0.5); center += instance.pos; } diff --git a/src/main/resources/assets/create/flywheel/instance/rotating.vert b/src/main/resources/assets/create/flywheel/instance/rotating.vert index 066ccd071a..747c51cb91 100644 --- a/src/main/resources/assets/create/flywheel/instance/rotating.vert +++ b/src/main/resources/assets/create/flywheel/instance/rotating.vert @@ -1,21 +1,15 @@ -#include "flywheel:util/matrix.glsl" - -const float uTime = 0.; - -mat3 kineticRotation(float offset, float speed, vec3 axis) { - float degrees = offset + flw_renderTicks * speed * 3./10.; - return rotationDegrees(axis, degrees); -} +#include "flywheel:util/quaternion.glsl" void flw_instanceVertex(in FlwInstance instance) { - mat3 spin = kineticRotation(instance.offset, instance.speed, instance.axis); + float degrees = instance.offset + flw_renderSeconds * instance.speed; - vec3 worldPos = spin * (flw_vertexPos.xyz - .5); - flw_vertexPos.xyz = worldPos.xyz + instance.pos + .5; + vec4 kineticRot = quaternionDegrees(instance.axis, degrees); + vec3 rotated = rotateByQuaternion(flw_vertexPos.xyz - .5, instance.rotation); - flw_vertexNormal = spin * flw_vertexNormal; - flw_vertexOverlay = instance.overlay; + flw_vertexPos.xyz = rotateByQuaternion(rotated, kineticRot) + instance.pos + .5; + flw_vertexNormal = rotateByQuaternion(rotateByQuaternion(flw_vertexNormal, instance.rotation), kineticRot); flw_vertexLight = max(vec2(instance.light) / 256., flw_vertexLight); + flw_vertexOverlay = instance.overlay; #if defined(DEBUG_RAINBOW) flw_vertexColor = instance.color; From 316e3728945ed98d8a0abd3354a99510c40c94f7 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Sun, 12 Jan 2025 14:50:39 +0100 Subject: [PATCH 287/515] Your storage is showing - Depots are now viable as Mounted Storage and dynamically display their contents --- .../java/com/simibubi/create/AllBlocks.java | 2 + .../java/com/simibubi/create/AllPackets.java | 2 + .../content/contraptions/Contraption.java | 8 ++ .../content/contraptions/MountedStorage.java | 78 ++++++++++++++++++- .../contraptions/MountedStorageManager.java | 62 ++++++++++----- .../sync/ContraptionItemPacket.java | 60 ++++++++++++++ .../logistics/depot/DepotBlockEntity.java | 9 +++ .../MountedDepotInteractionBehaviour.java | 51 ++++++++++++ .../trains/entity/CarriageContraption.java | 5 ++ .../content/trains/station/GlobalStation.java | 62 +++++++-------- 10 files changed, 289 insertions(+), 50 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/contraptions/sync/ContraptionItemPacket.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/depot/MountedDepotInteractionBehaviour.java diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index a528a6c3c2..2fcb8f773c 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -169,6 +169,7 @@ import com.simibubi.create.content.logistics.crate.CreativeCrateBlock; import com.simibubi.create.content.logistics.depot.DepotBlock; import com.simibubi.create.content.logistics.depot.EjectorBlock; import com.simibubi.create.content.logistics.depot.EjectorItem; +import com.simibubi.create.content.logistics.depot.MountedDepotInteractionBehaviour; import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBlock; import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBlockItem; import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelModel; @@ -793,6 +794,7 @@ public class AllBlocks { .transform(axeOrPickaxe()) .blockstate((c, p) -> p.simpleBlock(c.getEntry(), AssetLookup.partialBaseModel(c, p))) .onRegister(assignDataBehaviour(new ItemNameDisplaySource(), "combine_item_names")) + .onRegister(interactionBehaviour(new MountedDepotInteractionBehaviour())) .item() .transform(customItemModel("_", "block")) .register(); diff --git a/src/main/java/com/simibubi/create/AllPackets.java b/src/main/java/com/simibubi/create/AllPackets.java index bf7ea041b5..bc2ae469f4 100644 --- a/src/main/java/com/simibubi/create/AllPackets.java +++ b/src/main/java/com/simibubi/create/AllPackets.java @@ -32,6 +32,7 @@ import com.simibubi.create.content.contraptions.minecart.capability.MinecartCont import com.simibubi.create.content.contraptions.sync.ClientMotionPacket; import com.simibubi.create.content.contraptions.sync.ContraptionFluidPacket; import com.simibubi.create.content.contraptions.sync.ContraptionInteractionPacket; +import com.simibubi.create.content.contraptions.sync.ContraptionItemPacket; import com.simibubi.create.content.contraptions.sync.ContraptionSeatMappingPacket; import com.simibubi.create.content.contraptions.sync.LimbSwingUpdatePacket; import com.simibubi.create.content.contraptions.wrench.RadialWrenchMenuSubmitPacket; @@ -218,6 +219,7 @@ public enum AllPackets { MINECART_CONTROLLER(MinecartControllerUpdatePacket.class, MinecartControllerUpdatePacket::new, PLAY_TO_CLIENT), FLUID_SPLASH(FluidSplashPacket.class, FluidSplashPacket::new, PLAY_TO_CLIENT), CONTRAPTION_FLUID(ContraptionFluidPacket.class, ContraptionFluidPacket::new, PLAY_TO_CLIENT), + CONTRAPTION_ITEM(ContraptionItemPacket.class, ContraptionItemPacket::new, PLAY_TO_CLIENT), GANTRY_UPDATE(GantryContraptionUpdatePacket.class, GantryContraptionUpdatePacket::new, PLAY_TO_CLIENT), BLOCK_HIGHLIGHT(HighlightPacket.class, HighlightPacket::new, PLAY_TO_CLIENT), TUNNEL_FLAP(TunnelFlapPacket.class, TunnelFlapPacket::new, PLAY_TO_CLIENT), diff --git a/src/main/java/com/simibubi/create/content/contraptions/Contraption.java b/src/main/java/com/simibubi/create/content/contraptions/Contraption.java index 693ccdd9e1..a769bd1693 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/Contraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/Contraption.java @@ -1459,6 +1459,10 @@ public abstract class Contraption { public IFluidHandler getSharedFluidTanks() { return storage.getFluids(); } + + public MountedStorageManager getStorageManager() { + return storage; + } public RenderedBlocks getRenderedBlocks() { return new RenderedBlocks(pos -> { @@ -1485,6 +1489,10 @@ public abstract class Contraption { public void handleContraptionFluidPacket(BlockPos localPos, FluidStack containedFluid) { storage.updateContainedFluid(localPos, containedFluid); } + + public void handleContraptionItemPacket(BlockPos localPos, List containedItems) { + storage.updateContainedItem(localPos, containedItems); + } public static class ContraptionInvWrapper extends CombinedInvWrapper { protected final boolean isExternal; diff --git a/src/main/java/com/simibubi/create/content/contraptions/MountedStorage.java b/src/main/java/com/simibubi/create/content/contraptions/MountedStorage.java index 424e192c15..b6a1db3c39 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/MountedStorage.java +++ b/src/main/java/com/simibubi/create/content/contraptions/MountedStorage.java @@ -1,16 +1,26 @@ package com.simibubi.create.content.contraptions; +import java.util.List; + import com.simibubi.create.AllBlockEntityTypes; +import com.simibubi.create.AllPackets; import com.simibubi.create.AllTags.AllBlockTags; +import com.simibubi.create.content.contraptions.sync.ContraptionItemPacket; import com.simibubi.create.content.equipment.toolbox.ToolboxInventory; +import com.simibubi.create.content.kinetics.belt.transport.TransportedItemStack; import com.simibubi.create.content.kinetics.crafter.MechanicalCrafterBlockEntity; import com.simibubi.create.content.logistics.crate.BottomlessItemHandler; +import com.simibubi.create.content.logistics.depot.DepotBehaviour; +import com.simibubi.create.content.logistics.depot.DepotBlockEntity; import com.simibubi.create.content.logistics.vault.ItemVaultBlockEntity; import com.simibubi.create.content.processing.recipe.ProcessingInventory; + import net.createmod.catnip.utility.NBTHelper; +import net.minecraft.core.BlockPos; import net.minecraft.core.NonNullList; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.ContainerHelper; +import net.minecraft.world.entity.Entity; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BarrelBlockEntity; import net.minecraft.world.level.block.entity.BlockEntity; @@ -22,6 +32,7 @@ import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.ItemStackHandler; +import net.minecraftforge.network.PacketDistributor; import net.minecraftforge.registries.ForgeRegistries; public class MountedStorage { @@ -31,8 +42,11 @@ public class MountedStorage { ItemStackHandler handler; boolean noFuel; boolean valid; + + private int packetCooldown = 0; + private boolean sendPacket = false; - private BlockEntity blockEntity; + BlockEntity blockEntity; public static boolean canUseAsStorage(BlockEntity be) { if (be == null) @@ -49,6 +63,8 @@ public class MountedStorage { return true; if (be instanceof ItemVaultBlockEntity) return true; + if (be instanceof DepotBlockEntity) + return true; try { LazyOptional capability = be.getCapability(ForgeCapabilities.ITEM_HANDLER); @@ -85,9 +101,17 @@ public class MountedStorage { public void removeStorageFromWorld() { valid = false; + sendPacket = false; if (blockEntity == null) return; + if (blockEntity instanceof DepotBlockEntity depot) { + handler = new SyncedMountedItemStackHandler(1); + handler.setStackInSlot(0, depot.getHeldItem()); + valid = true; + return; + } + if (blockEntity instanceof ChestBlockEntity) { CompoundTag tag = blockEntity.saveWithFullMetadata(); if (tag.contains("LootTable", 8)) @@ -140,6 +164,13 @@ public class MountedStorage { if (handler instanceof BottomlessItemHandler) return; + if (be instanceof DepotBlockEntity depot) { + if (handler.getSlots() > 0) + depot.getBehaviour(DepotBehaviour.TYPE) + .setCenteredHeldItem(new TransportedItemStack(handler.getStackInSlot(0))); + return; + } + if (be instanceof ChestBlockEntity) { CompoundTag tag = be.saveWithFullMetadata(); tag.remove("Items"); @@ -166,6 +197,29 @@ public class MountedStorage { inv.setStackInSlot(slot, handler.getStackInSlot(slot)); } + public void tick(Entity entity, BlockPos pos, boolean isRemote) { + if (isRemote) + return; + if (packetCooldown > 0) { + packetCooldown--; + return; + } + if (sendPacket) { + sendPacket = false; + AllPackets.getChannel() + .send(PacketDistributor.TRACKING_ENTITY.with(() -> entity), + new ContraptionItemPacket(entity.getId(), pos, handler)); + packetCooldown = 8; + } + } + + public void updateItems(List containedItems) { + for (int i = 0; i < Math.min(containedItems.size(), handler.getSlots()); i++) + handler.setStackInSlot(i, containedItems.get(i)); + if (blockEntity instanceof DepotBlockEntity depot) + depot.setHeldItem(handler.getStackInSlot(0)); + } + public IItemHandlerModifiable getItemHandler() { return handler; } @@ -179,6 +233,9 @@ public class MountedStorage { NBTHelper.putMarker(tag, "NoFuel"); if (handler instanceof ToolboxInventory) NBTHelper.putMarker(tag, "Toolbox"); + if (needsSync()) + NBTHelper.putMarker(tag, "Synced"); + if (!(handler instanceof BottomlessItemHandler)) return tag; @@ -195,6 +252,8 @@ public class MountedStorage { return storage; if (nbt.contains("Toolbox")) storage.handler = new ToolboxInventory(null); + if (nbt.contains("Synced")) + storage.handler = storage.new SyncedMountedItemStackHandler(1); storage.valid = true; storage.noFuel = nbt.contains("NoFuel"); @@ -216,5 +275,22 @@ public class MountedStorage { public boolean canUseForFuel() { return !noFuel; } + + public boolean needsSync() { + return handler instanceof SyncedMountedItemStackHandler; + } + + public class SyncedMountedItemStackHandler extends ItemStackHandler { + + public SyncedMountedItemStackHandler(int i) { + super(i); + } + + @Override + protected void onContentsChanged(int slot) { + sendPacket = true; + } + + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/MountedStorageManager.java b/src/main/java/com/simibubi/create/content/contraptions/MountedStorageManager.java index 2decc9c531..71809cc994 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/MountedStorageManager.java +++ b/src/main/java/com/simibubi/create/content/contraptions/MountedStorageManager.java @@ -5,12 +5,14 @@ import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.TreeMap; import java.util.function.Supplier; import java.util.stream.Collectors; import com.simibubi.create.content.contraptions.Contraption.ContraptionInvWrapper; import com.simibubi.create.content.fluids.tank.FluidTankBlockEntity; +import com.simibubi.create.content.logistics.depot.DepotBlockEntity; import com.simibubi.create.foundation.fluid.CombinedTankWrapper; import net.createmod.catnip.utility.NBTHelper; @@ -53,7 +55,9 @@ public class MountedStorageManager { } public void entityTick(AbstractContraptionEntity entity) { - fluidStorage.forEach((pos, mfs) -> mfs.tick(entity, pos, entity.level().isClientSide)); + boolean isClientSide = entity.level().isClientSide; + storage.forEach((pos, mfs) -> mfs.tick(entity, pos, isClientSide)); + fluidStorage.forEach((pos, mfs) -> mfs.tick(entity, pos, isClientSide)); } public void createHandlers() { @@ -99,7 +103,7 @@ public class MountedStorageManager { .put(NbtUtils.readBlockPos(c.getCompound("Pos")), MountedFluidStorage.deserialize(c.getCompound("Data")))); if (clientPacket && presentBlockEntities != null) - bindTanks(presentBlockEntities); + bindTanksAndDepots(presentBlockEntities); List handlers = new ArrayList<>(); List fuelHandlers = new ArrayList<>(); @@ -118,33 +122,41 @@ public class MountedStorageManager { .toList()); } - public void bindTanks(Map presentBlockEntities) { - fluidStorage.forEach((pos, mfs) -> { - BlockEntity blockEntity = presentBlockEntities.get(pos); - if (!(blockEntity instanceof FluidTankBlockEntity)) + public void bindTanksAndDepots(Map presentBlockEntities) { + for (Entry entry : storage.entrySet()) { + BlockEntity blockEntity = presentBlockEntities.get(entry.getKey()); + if (!(blockEntity instanceof DepotBlockEntity depot)) + return; + depot.setHeldItem(entry.getValue().handler.getStackInSlot(0)); + entry.getValue().blockEntity = depot; + } + for (Entry entry : fluidStorage.entrySet()) { + BlockEntity blockEntity = presentBlockEntities.get(entry.getKey()); + if (!(blockEntity instanceof FluidTankBlockEntity tank)) return; - FluidTankBlockEntity tank = (FluidTankBlockEntity) blockEntity; IFluidTank tankInventory = tank.getTankInventory(); + MountedFluidStorage mfs = entry.getValue(); if (tankInventory instanceof FluidTank) ((FluidTank) tankInventory).setFluid(mfs.tank.getFluid()); tank.getFluidLevel() .startWithValue(tank.getFillState()); mfs.assignBlockEntity(tank); - }); + } } public void write(CompoundTag nbt, boolean clientPacket) { ListTag storageNBT = new ListTag(); - if (!clientPacket) - for (BlockPos pos : storage.keySet()) { - CompoundTag c = new CompoundTag(); - MountedStorage mountedStorage = storage.get(pos); - if (!mountedStorage.isValid()) - continue; - c.put("Pos", NbtUtils.writeBlockPos(pos)); - c.put("Data", mountedStorage.serialize()); - storageNBT.add(c); - } + for (BlockPos pos : storage.keySet()) { + CompoundTag c = new CompoundTag(); + MountedStorage mountedStorage = storage.get(pos); + if (!mountedStorage.isValid()) + continue; + if (clientPacket && !mountedStorage.needsSync()) + continue; + c.put("Pos", NbtUtils.writeBlockPos(pos)); + c.put("Data", mountedStorage.serialize()); + storageNBT.add(c); + } ListTag fluidStorageNBT = new ListTag(); for (BlockPos pos : fluidStorage.keySet()) { @@ -196,6 +208,12 @@ public class MountedStorageManager { mountedFluidStorage.updateFluid(containedFluid); } + public void updateContainedItem(BlockPos localPos, List containedItems) { + MountedStorage mountedStorage = storage.get(localPos); + if (mountedStorage != null) + mountedStorage.updateItems(containedItems); + } + public void attachExternal(IItemHandlerModifiable externalStorage) { inventory = new ContraptionInvWrapper(externalStorage, inventory); fuelInventory = new ContraptionInvWrapper(externalStorage, fuelInventory); @@ -212,6 +230,14 @@ public class MountedStorageManager { public IFluidHandler getFluids() { return fluidInventory; } + + public Map getMountedItemStorage() { + return storage; + } + + public Map getMountedFluidStorage() { + return fluidStorage; + } public boolean handlePlayerStorageInteraction(Contraption contraption, Player player, BlockPos localPos) { if (player.level().isClientSide()) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/sync/ContraptionItemPacket.java b/src/main/java/com/simibubi/create/content/contraptions/sync/ContraptionItemPacket.java new file mode 100644 index 0000000000..6f18fc1e58 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/sync/ContraptionItemPacket.java @@ -0,0 +1,60 @@ +package com.simibubi.create.content.contraptions.sync; + +import java.util.ArrayList; +import java.util.List; + +import com.simibubi.create.content.contraptions.AbstractContraptionEntity; +import com.simibubi.create.foundation.networking.SimplePacketBase; + +import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.items.ItemStackHandler; +import net.minecraftforge.network.NetworkEvent.Context; + +public class ContraptionItemPacket extends SimplePacketBase { + + private int entityId; + private BlockPos localPos; + private List containedItems; + + public ContraptionItemPacket(int entityId, BlockPos localPos, ItemStackHandler handler) { + this.entityId = entityId; + this.localPos = localPos; + this.containedItems = new ArrayList<>(handler.getSlots()); + for (int i = 0; i < handler.getSlots(); i++) + containedItems.add(handler.getStackInSlot(i)); + } + + public ContraptionItemPacket(FriendlyByteBuf buffer) { + entityId = buffer.readInt(); + localPos = buffer.readBlockPos(); + int count = buffer.readVarInt(); + containedItems = new ArrayList<>(); + for (int i = 0; i < count; i++) + containedItems.add(buffer.readItem()); + } + + @Override + public void write(FriendlyByteBuf buffer) { + buffer.writeInt(entityId); + buffer.writeBlockPos(localPos); + buffer.writeVarInt(containedItems.size()); + for (ItemStack stack : containedItems) + buffer.writeItem(stack); + } + + @Override + public boolean handle(Context context) { + context.enqueueWork(() -> { + Entity entityByID = Minecraft.getInstance().level.getEntity(entityId); + if (!(entityByID instanceof AbstractContraptionEntity)) + return; + AbstractContraptionEntity contraptionEntity = (AbstractContraptionEntity) entityByID; + contraptionEntity.getContraption().handleContraptionItemPacket(localPos, containedItems); + }); + return true; + } +} diff --git a/src/main/java/com/simibubi/create/content/logistics/depot/DepotBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/depot/DepotBlockEntity.java index c054f9204a..fa715ccb1e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/depot/DepotBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/depot/DepotBlockEntity.java @@ -2,6 +2,7 @@ package com.simibubi.create.content.logistics.depot; import java.util.List; +import com.simibubi.create.content.kinetics.belt.transport.TransportedItemStack; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; @@ -38,4 +39,12 @@ public class DepotBlockEntity extends SmartBlockEntity { public ItemStack getHeldItem() { return depotBehaviour.getHeldItemStack(); } + + public void setHeldItem(ItemStack item) { + TransportedItemStack newStack = new TransportedItemStack(item); + if (depotBehaviour.heldItem != null) + newStack.angle = depotBehaviour.heldItem.angle; + depotBehaviour.setHeldItem(newStack); + } + } diff --git a/src/main/java/com/simibubi/create/content/logistics/depot/MountedDepotInteractionBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/depot/MountedDepotInteractionBehaviour.java new file mode 100644 index 0000000000..e4ebc9ad01 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/depot/MountedDepotInteractionBehaviour.java @@ -0,0 +1,51 @@ +package com.simibubi.create.content.logistics.depot; + +import com.simibubi.create.AllSoundEvents; +import com.simibubi.create.content.contraptions.AbstractContraptionEntity; +import com.simibubi.create.content.contraptions.MountedStorage; +import com.simibubi.create.content.contraptions.MountedStorageManager; +import com.simibubi.create.content.contraptions.behaviour.MovingInteractionBehaviour; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.items.IItemHandlerModifiable; + +public class MountedDepotInteractionBehaviour extends MovingInteractionBehaviour { + + @Override + public boolean handlePlayerInteraction(Player player, InteractionHand activeHand, BlockPos localPos, + AbstractContraptionEntity contraptionEntity) { + ItemStack itemInHand = player.getItemInHand(activeHand); + if (activeHand == InteractionHand.OFF_HAND) + return false; + if (player.level().isClientSide) + return true; + + MountedStorageManager storageManager = contraptionEntity.getContraption() + .getStorageManager(); + if (storageManager == null) + return false; + + MountedStorage mountedStorage = storageManager.getMountedItemStorage() + .get(localPos); + if (mountedStorage == null) + return false; + + IItemHandlerModifiable itemHandler = mountedStorage.getItemHandler(); + ItemStack itemOnDepot = itemHandler.getStackInSlot(0); + + if (itemOnDepot.isEmpty() && itemInHand.isEmpty()) + return true; + + itemHandler.setStackInSlot(0, itemInHand.copy()); + player.setItemInHand(activeHand, itemOnDepot.copy()); + AllSoundEvents.DEPOT_PLOP.playOnServer(player.level(), + BlockPos.containing(contraptionEntity.toGlobalVector(Vec3.atCenterOf(localPos), 0))); + + return true; + } + +} diff --git a/src/main/java/com/simibubi/create/content/trains/entity/CarriageContraption.java b/src/main/java/com/simibubi/create/content/trains/entity/CarriageContraption.java index 3123e1ae8f..f44f40b93d 100644 --- a/src/main/java/com/simibubi/create/content/trains/entity/CarriageContraption.java +++ b/src/main/java/com/simibubi/create/content/trains/entity/CarriageContraption.java @@ -333,6 +333,11 @@ public class CarriageContraption extends Contraption { public void handleContraptionFluidPacket(BlockPos localPos, FluidStack containedFluid) { storage.updateContainedFluid(localPos, containedFluid); } + + @Override + public MountedStorageManager getStorageManager() { + return storageProxy; + } @Override public void tickStorage(AbstractContraptionEntity entity) { diff --git a/src/main/java/com/simibubi/create/content/trains/station/GlobalStation.java b/src/main/java/com/simibubi/create/content/trains/station/GlobalStation.java index e4ca488a85..6e711304fd 100644 --- a/src/main/java/com/simibubi/create/content/trains/station/GlobalStation.java +++ b/src/main/java/com/simibubi/create/content/trains/station/GlobalStation.java @@ -186,6 +186,37 @@ public class GlobalStation extends SingleBlockEntityEdgePoint { if (carriageInventory == null) continue; + // Import from station + for (Entry entry : connectedPorts.entrySet()) { + GlobalPackagePort port = entry.getValue(); + BlockPos pos = entry.getKey(); + PostboxBlockEntity box = null; + + IItemHandlerModifiable postboxInventory = port.offlineBuffer; + if (level != null && level.isLoaded(pos) + && level.getBlockEntity(pos) instanceof PostboxBlockEntity ppbe) { + postboxInventory = ppbe.inventory; + box = ppbe; + } + + for (int slot = 0; slot < postboxInventory.getSlots(); slot++) { + ItemStack stack = postboxInventory.getStackInSlot(slot); + if (!PackageItem.isPackage(stack)) + continue; + if (PackageItem.matchAddress(stack, port.address)) + continue; + + ItemStack result = ItemHandlerHelper.insertItemStacked(carriageInventory, stack, false); + if (!result.isEmpty()) + continue; + + postboxInventory.setStackInSlot(slot, ItemStack.EMPTY); + Create.RAILWAYS.markTracksDirty(); + if (box != null) + box.spawnParticles(); + } + } + // Export to station for (int slot = 0; slot < carriageInventory.getSlots(); slot++) { ItemStack stack = carriageInventory.getStackInSlot(slot); @@ -220,37 +251,6 @@ public class GlobalStation extends SingleBlockEntityEdgePoint { } } - // Import from station - for (Entry entry : connectedPorts.entrySet()) { - GlobalPackagePort port = entry.getValue(); - BlockPos pos = entry.getKey(); - PostboxBlockEntity box = null; - - IItemHandlerModifiable postboxInventory = port.offlineBuffer; - if (level != null && level.isLoaded(pos) - && level.getBlockEntity(pos) instanceof PostboxBlockEntity ppbe) { - postboxInventory = ppbe.inventory; - box = ppbe; - } - - for (int slot = 0; slot < postboxInventory.getSlots(); slot++) { - ItemStack stack = postboxInventory.getStackInSlot(slot); - if (!PackageItem.isPackage(stack)) - continue; - if (PackageItem.matchAddress(stack, port.address)) - continue; - - ItemStack result = ItemHandlerHelper.insertItemStacked(carriageInventory, stack, false); - if (!result.isEmpty()) - continue; - - postboxInventory.setStackInSlot(slot, ItemStack.EMPTY); - Create.RAILWAYS.markTracksDirty(); - if (box != null) - box.spawnParticles(); - } - } - } } From 7e0d504897e04e39125f4168d820fd436088502f Mon Sep 17 00:00:00 2001 From: IThundxr Date: Sun, 12 Jan 2025 12:18:09 -0500 Subject: [PATCH 288/515] A forgotten language - Fix lang keys for keybinds --- gradle.properties | 2 +- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 754 +++++++++--------- .../resources/assets/create/lang/en_ud.json | 4 +- .../resources/assets/create/lang/en_us.json | 4 +- .../java/com/simibubi/create/AllKeys.java | 35 +- .../infrastructure/data/CreateDatagen.java | 2 + .../assets/create/lang/default/interface.json | 32 +- 7 files changed, 422 insertions(+), 411 deletions(-) diff --git a/gradle.properties b/gradle.properties index 90f3b5e55e..06c7b19a44 100644 --- a/gradle.properties +++ b/gradle.properties @@ -29,7 +29,7 @@ jei_version = 15.10.0.39 curios_minecraft_version = 1.20.1 curios_version = 5.3.1 catnip_version = 0.8.42 -ponder_version = 0.8.15 +ponder_version = 0.8.16 mixin_extras_version = 0.4.1 cc_tweaked_enable = true diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 1b87b3e135..481f003d76 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2025-01-11T18:12:51.5905299 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2025-01-12T12:15:29.065153499 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -83,13 +83,13 @@ b5170d754ce5f07ea2b4646eb07c099c50bae249 assets/create/blockstates/clipboard.jso f7254f20f91e2f1295e36d2e70390d43f3952d07 assets/create/blockstates/copper_door.json 736777de0eb038ff1ef9e8fe9d04c23d80239eda assets/create/blockstates/copper_ladder.json df3103dfc1c3ba7a9573229d009cb0de4925df16 assets/create/blockstates/copper_scaffolding.json -4d3d29e8a74bf103da39e76a1466b03eb5dcf916 assets/create/blockstates/copper_shingles.json 1ea8fdb990f8cda1762ab69ac38ea3161a835227 assets/create/blockstates/copper_shingle_slab.json 7c35bb802099d6bb5d92eafd8cbb7ea146979a2e assets/create/blockstates/copper_shingle_stairs.json +4d3d29e8a74bf103da39e76a1466b03eb5dcf916 assets/create/blockstates/copper_shingles.json 5c5ba06bf5b0a2c57d0aa42e85880f36d9694a78 assets/create/blockstates/copper_table_cloth.json -9a9f03140a57a7a8903d3e1b159bdc052566a6ec assets/create/blockstates/copper_tiles.json 7db7a0d81887091ca889f40bb8a508d3098c5164 assets/create/blockstates/copper_tile_slab.json c0b7eca017242913d156e4623147add0d03574f6 assets/create/blockstates/copper_tile_stairs.json +9a9f03140a57a7a8903d3e1b159bdc052566a6ec assets/create/blockstates/copper_tiles.json ef3ccb2d8b03f5a972b053a15bb037f8db6af17c assets/create/blockstates/copper_valve_handle.json 4758bed22fb6fe18213f463bc055775c1909e858 assets/create/blockstates/copycat_bars.json 4789c857508452aede1cb7389187b99ce2d7bf62 assets/create/blockstates/copycat_base.json @@ -106,114 +106,114 @@ c9a2c3a7971c46957d0f07c6d94d76f59da54a0b assets/create/blockstates/crushing_whee 4b0e51a1c10685f7d432467339afc9c2e24793b0 assets/create/blockstates/crushing_wheel_controller.json ba9c3ecfacbd398048440d247decffeaefc714b5 assets/create/blockstates/cuckoo_clock.json 1f6d84cba69062a1989d671c9c97317e2c2455b6 assets/create/blockstates/cut_andesite.json -cc62a6499ce8dcfc5e8695f0e8bb3c3d67f41efc assets/create/blockstates/cut_andesite_bricks.json 50d88f806122818af2ffecbd514d13ebbd21e4c9 assets/create/blockstates/cut_andesite_brick_slab.json 32d801225ea18209792921fa91618ed41794dbd0 assets/create/blockstates/cut_andesite_brick_stairs.json 3bf8204bf8c7c5b7b3c388fbc3478bb2d7c47129 assets/create/blockstates/cut_andesite_brick_wall.json +cc62a6499ce8dcfc5e8695f0e8bb3c3d67f41efc assets/create/blockstates/cut_andesite_bricks.json 34e89a828f14383c6115954a235b19851b74f277 assets/create/blockstates/cut_andesite_slab.json 49d58ae14544d89305ddc707cf7f6a81998200fa assets/create/blockstates/cut_andesite_stairs.json 1cc235cb6c388324793ac40f7bf89df8b048faac assets/create/blockstates/cut_andesite_wall.json 13ea54a4b9b89e576879a6e23a029c6341b7c098 assets/create/blockstates/cut_asurine.json -51c22c0547ab8ed2564890afb8733bbe356899f5 assets/create/blockstates/cut_asurine_bricks.json cf09de38f826fe000c5efe5afe56cf746125691d assets/create/blockstates/cut_asurine_brick_slab.json 1835482d5e9a59f2214336a63b12c7132ad815b4 assets/create/blockstates/cut_asurine_brick_stairs.json c48ab37bf7a2aba676af281d29cb6a2103c72fba assets/create/blockstates/cut_asurine_brick_wall.json +51c22c0547ab8ed2564890afb8733bbe356899f5 assets/create/blockstates/cut_asurine_bricks.json 1523a57124239a99da0b12a6b435c09d3d4276a5 assets/create/blockstates/cut_asurine_slab.json cc1acf5e118f1b1e78c5bb291176008960794d59 assets/create/blockstates/cut_asurine_stairs.json 139640bf41070e8eeb48647319eee54bb6804692 assets/create/blockstates/cut_asurine_wall.json 06b8c5cf98366608c480a37e6944d0d668bc8983 assets/create/blockstates/cut_calcite.json -979c70e35d806f1f63fe3381f27d881a17f9f6be assets/create/blockstates/cut_calcite_bricks.json a8f83cb8e1eae587f4e11e37c4cd3d0a1bbef377 assets/create/blockstates/cut_calcite_brick_slab.json 1eabb2e485aa323d317fa9648be02c12556593b7 assets/create/blockstates/cut_calcite_brick_stairs.json a0a33df71c5d26344a7bb0dd7a4622c30cc7825f assets/create/blockstates/cut_calcite_brick_wall.json +979c70e35d806f1f63fe3381f27d881a17f9f6be assets/create/blockstates/cut_calcite_bricks.json e3ddaae92b52cc3ea230088ff23260b5c5c93017 assets/create/blockstates/cut_calcite_slab.json 80c5249eaf9504c743c427fdd1a2c7bfa0f3d48f assets/create/blockstates/cut_calcite_stairs.json b4bbdb08d8114b6741546a0418cb54d645481c02 assets/create/blockstates/cut_calcite_wall.json 449f5180c72a028393afdac55a34e59862728224 assets/create/blockstates/cut_crimsite.json -25d731077a131d03347296c38c76b547194a6320 assets/create/blockstates/cut_crimsite_bricks.json d2c8a3580d3578c8afe44b94d4448be3680dbdeb assets/create/blockstates/cut_crimsite_brick_slab.json a3d9d2190a23b881dd3a7538ab248e0b0a3efa8e assets/create/blockstates/cut_crimsite_brick_stairs.json 3791c00ed477c0aaf7c5a20803a89dfc0e20f013 assets/create/blockstates/cut_crimsite_brick_wall.json +25d731077a131d03347296c38c76b547194a6320 assets/create/blockstates/cut_crimsite_bricks.json c9f19e7a976a7428b3dd58f45d734700ca1a18cd assets/create/blockstates/cut_crimsite_slab.json 1b8d4ac53dc5823083c2af605165a05b73c9ff79 assets/create/blockstates/cut_crimsite_stairs.json 484f9253ed92e963f398973a99fbeacb67ba1188 assets/create/blockstates/cut_crimsite_wall.json c4e95ceb7914da09ebe42d539bf5d976a3d70972 assets/create/blockstates/cut_deepslate.json -75d4ef863cd85d8f3df78226177966954e02ee2b assets/create/blockstates/cut_deepslate_bricks.json e1dc99a48b9066732fc5c62071c5ead16f34f438 assets/create/blockstates/cut_deepslate_brick_slab.json dbb2eddaf1d4ae3e687beb611552ea4283a1e7d8 assets/create/blockstates/cut_deepslate_brick_stairs.json 91c1f3da848503067c64b966ddda22ab91ff8fd5 assets/create/blockstates/cut_deepslate_brick_wall.json +75d4ef863cd85d8f3df78226177966954e02ee2b assets/create/blockstates/cut_deepslate_bricks.json 593198ffd37eae124a8366ae1d4a40b682788f92 assets/create/blockstates/cut_deepslate_slab.json f8cd1f9002ed8593ab71af9cfb7f962625994108 assets/create/blockstates/cut_deepslate_stairs.json c2d8060a0c830e5b8bbb084457083324b5b6f4c9 assets/create/blockstates/cut_deepslate_wall.json aaa6ac5f4fc399c4b03a7f8de856fa7aae97e049 assets/create/blockstates/cut_diorite.json -08b6289ca8b4193c87324ca23ca081e8773fb223 assets/create/blockstates/cut_diorite_bricks.json 423f809f06fa3fd96643f068ba0d3520269b3844 assets/create/blockstates/cut_diorite_brick_slab.json 9011fb92f57e7695c4484c923dd40ecd749ff307 assets/create/blockstates/cut_diorite_brick_stairs.json 41bad89777a33737bc0365ce2c7ffc20720f9620 assets/create/blockstates/cut_diorite_brick_wall.json +08b6289ca8b4193c87324ca23ca081e8773fb223 assets/create/blockstates/cut_diorite_bricks.json b03e7cf494c53c6f24ba93d0ef531e839026932b assets/create/blockstates/cut_diorite_slab.json 95c8094204979acfb0e59c2826003e0274a02fe5 assets/create/blockstates/cut_diorite_stairs.json e2f163d36dd5d03c0741dd2e87d8f77a0c86ae00 assets/create/blockstates/cut_diorite_wall.json f42ca2ce8e8f657c64376759413ec611f8045531 assets/create/blockstates/cut_dripstone.json -2d696162b2085c3d5723308a8d1ccafb29660f01 assets/create/blockstates/cut_dripstone_bricks.json 9310a800fb091014e7c0a220f5f2511c1de379ad assets/create/blockstates/cut_dripstone_brick_slab.json 3ff2f65dafcb4654b99e0d65b7e851760f9a4075 assets/create/blockstates/cut_dripstone_brick_stairs.json cafc956d8dc2053e5a0e8437c4ccde7fa24fc17e assets/create/blockstates/cut_dripstone_brick_wall.json +2d696162b2085c3d5723308a8d1ccafb29660f01 assets/create/blockstates/cut_dripstone_bricks.json 9cb32af3b952b841e9da94789da17cd274c3cfb9 assets/create/blockstates/cut_dripstone_slab.json da0300f54bdfcc705beb8d84f26406be660de5de assets/create/blockstates/cut_dripstone_stairs.json 83ff3eaeb481202c77e6dbdc442b4dd195ca568c assets/create/blockstates/cut_dripstone_wall.json bf501250fd2226838afe0baf68db08cd832e3c4f assets/create/blockstates/cut_granite.json -5c029d7ec837b3239d17ab91a70f025df1bfb124 assets/create/blockstates/cut_granite_bricks.json 773717bd5c140cf025f463c99c67efb9d27bd696 assets/create/blockstates/cut_granite_brick_slab.json 97d20b21e5b7f329c1b21b436fd0bdcaa8d173d0 assets/create/blockstates/cut_granite_brick_stairs.json 5e4175b6c89039ded48937ad1cd13d3bb2d2992a assets/create/blockstates/cut_granite_brick_wall.json +5c029d7ec837b3239d17ab91a70f025df1bfb124 assets/create/blockstates/cut_granite_bricks.json 42549436ce26ad7b44f2e1cba54357b3f25bcb18 assets/create/blockstates/cut_granite_slab.json e9d8fd028d8092e5fa0fd13cd638516f57a22d53 assets/create/blockstates/cut_granite_stairs.json 2daab523202dd2e31daeaf3b9a04cde2a7da4ca5 assets/create/blockstates/cut_granite_wall.json 0652c8b9c41acc1a8da901bd7b8b6018b3581d5b assets/create/blockstates/cut_limestone.json -508ee569f313b7e804f6268ca86f5a61851563ec assets/create/blockstates/cut_limestone_bricks.json 4efbeb34c96918e9b48dc484a82b1ef4811ed39d assets/create/blockstates/cut_limestone_brick_slab.json 11b99cf9b33d7f8de9d11cc1e405e2681682ba32 assets/create/blockstates/cut_limestone_brick_stairs.json b6c02a9e9e47a8e521a54ef9488259267068f032 assets/create/blockstates/cut_limestone_brick_wall.json +508ee569f313b7e804f6268ca86f5a61851563ec assets/create/blockstates/cut_limestone_bricks.json fb63a2581211fe62344985a06feec9dcec4b1888 assets/create/blockstates/cut_limestone_slab.json ffcca1e66718f3e78e544b5fa9954a852c095e91 assets/create/blockstates/cut_limestone_stairs.json a1a90f84b47f96b4384fc2d60bfc48ddbb5ed179 assets/create/blockstates/cut_limestone_wall.json 1b7a133518780d4f49474a70e7f6263d6e88ff51 assets/create/blockstates/cut_ochrum.json -6f37e5e2dca3b443951131cb82c15a981a4e2005 assets/create/blockstates/cut_ochrum_bricks.json f1e9d54a6f9f41b968f117a7be711011effa71a5 assets/create/blockstates/cut_ochrum_brick_slab.json 8d334e026e94b304a1ff1ee96097f434b50175f2 assets/create/blockstates/cut_ochrum_brick_stairs.json e92c026ee7ab2aa35003ad475bef3d6c0e29818c assets/create/blockstates/cut_ochrum_brick_wall.json +6f37e5e2dca3b443951131cb82c15a981a4e2005 assets/create/blockstates/cut_ochrum_bricks.json 5a61edb7d146e83d951795fae33dc306e71b2cb6 assets/create/blockstates/cut_ochrum_slab.json b31944bf6297685acd37631083dde0889c08ede7 assets/create/blockstates/cut_ochrum_stairs.json df33a8af1dc8cb08ddcfd22a50a305499479a4dd assets/create/blockstates/cut_ochrum_wall.json 1606d7481e56755f07e9331cf85a8d7cc9aace9a assets/create/blockstates/cut_scorchia.json -bc2a0e7f11400b8c2a03071be87dadb5edc097de assets/create/blockstates/cut_scorchia_bricks.json 43db25ebac2f5bcaa7ca9cfb6da8fcb20fad8269 assets/create/blockstates/cut_scorchia_brick_slab.json 7a80620590ba5e61967c5168f5c67ecabf09dc00 assets/create/blockstates/cut_scorchia_brick_stairs.json e4eb79360a41bb1a7ca835d61446ea5166e4cda8 assets/create/blockstates/cut_scorchia_brick_wall.json +bc2a0e7f11400b8c2a03071be87dadb5edc097de assets/create/blockstates/cut_scorchia_bricks.json c0d262f54e3b2fce8bc941a2a6df71db5f0229ea assets/create/blockstates/cut_scorchia_slab.json de2e918058e9dd7eafd085a8dec634f6a2832c21 assets/create/blockstates/cut_scorchia_stairs.json 5d2d06799b82449754f62b1d80b9ee9a24c65bad assets/create/blockstates/cut_scorchia_wall.json 76ea4f3438a3effedfc93d2bbabac0899610cd28 assets/create/blockstates/cut_scoria.json -6d9c79e1b71656a73bb69e2a9b100be59084dd2e assets/create/blockstates/cut_scoria_bricks.json 7c7dcd1fe82f3673910620c2eefebad5d0029cdf assets/create/blockstates/cut_scoria_brick_slab.json d535b387bf0a6f9e124eed8b76d899e13699bca9 assets/create/blockstates/cut_scoria_brick_stairs.json c426e1b5e4c77c25cd0d16d10fba0e0731673dd1 assets/create/blockstates/cut_scoria_brick_wall.json +6d9c79e1b71656a73bb69e2a9b100be59084dd2e assets/create/blockstates/cut_scoria_bricks.json fb692494c88358d4d8e687b216f729d6b6bd7174 assets/create/blockstates/cut_scoria_slab.json 950f43bae8f4e3220103ce0c62f444856129ca12 assets/create/blockstates/cut_scoria_stairs.json 01350030831c5b9edef0dc2c778b92f1ebc2b2fc assets/create/blockstates/cut_scoria_wall.json c0c1c4d44eba5babe9703eca31f0279ebd11ed8e assets/create/blockstates/cut_tuff.json -9bddef4a2b4a338c15f03e2397c4cd4c3ae9e5d9 assets/create/blockstates/cut_tuff_bricks.json 11306e83915e0106d48f890df3212c3a47443a08 assets/create/blockstates/cut_tuff_brick_slab.json e8951d94e0d3228700bcb56819928f1c179c3973 assets/create/blockstates/cut_tuff_brick_stairs.json 619340b7cf014cfb72a4b5440b90881535f16108 assets/create/blockstates/cut_tuff_brick_wall.json +9bddef4a2b4a338c15f03e2397c4cd4c3ae9e5d9 assets/create/blockstates/cut_tuff_bricks.json 3577e3f4933ea8cb7464c28e80867ce84917898d assets/create/blockstates/cut_tuff_slab.json 5673fdb02439d622c56dc0ff47a0dca98dc6d027 assets/create/blockstates/cut_tuff_stairs.json 12a46ee82536665400ec2f3befed3be58325d5c6 assets/create/blockstates/cut_tuff_wall.json beb9e47f8d811c2146f68daf992fb805342a65cb assets/create/blockstates/cut_veridium.json -04d07986eb86ffd66baaaf9b65e02d00022e98e2 assets/create/blockstates/cut_veridium_bricks.json 952543c03e730443d85059ec43642efb089485e7 assets/create/blockstates/cut_veridium_brick_slab.json 6a033e7b5a0b26cce5956c6c7c1eff558f866cb5 assets/create/blockstates/cut_veridium_brick_stairs.json 43689138c8018b3ee9f35a11870887e9df3c8fe5 assets/create/blockstates/cut_veridium_brick_wall.json +04d07986eb86ffd66baaaf9b65e02d00022e98e2 assets/create/blockstates/cut_veridium_bricks.json 212d8ee5dfa78802b9539640cf8b263fd5880b87 assets/create/blockstates/cut_veridium_slab.json c11f09df4a23e951bdf9a345515183f4fac7cde3 assets/create/blockstates/cut_veridium_stairs.json 3aa6f5e613ff73952e3de00408051f92316e7f81 assets/create/blockstates/cut_veridium_wall.json @@ -241,12 +241,12 @@ f7f5df9086c71688cbdb5d05c394dc5acb8fb338 assets/create/blockstates/elevator_cont d47bc65703e9582cc710e6408fb565e16d3514a6 assets/create/blockstates/encased_fan.json 651f9fdb11f56d887d131be8f936f508d0b2fc1d assets/create/blockstates/encased_fluid_pipe.json 489ad4daeaed702d231a3f175f7b66846f5789a6 assets/create/blockstates/experience_block.json -5f6c60a30889b043709066707e80a21081d98155 assets/create/blockstates/exposed_copper_shingles.json 74c8a72db3dd3fa919e29baaa8c5865f13490461 assets/create/blockstates/exposed_copper_shingle_slab.json 4e0b5a9be15f0c2861f5f6bd71bd9c2a4db2a21d assets/create/blockstates/exposed_copper_shingle_stairs.json -5299b4f7b9b3490872e8c26a6b212e14dd05fd9a assets/create/blockstates/exposed_copper_tiles.json +5f6c60a30889b043709066707e80a21081d98155 assets/create/blockstates/exposed_copper_shingles.json 6ee73ff3608d51fdad6e9810feee66ed1773b81c assets/create/blockstates/exposed_copper_tile_slab.json f93e4059876bfc6d70b9fa2bc24d8e3d6943d56f assets/create/blockstates/exposed_copper_tile_stairs.json +5299b4f7b9b3490872e8c26a6b212e14dd05fd9a assets/create/blockstates/exposed_copper_tiles.json 4b30365ed77db9c5754eeda5fee81d47b568b946 assets/create/blockstates/factory_gauge.json f1a03ede031d8c4e33a4d07c529e71936da9dc6d assets/create/blockstates/fake_track.json 21fa4a1bf4ee851e090a21c97c9a38d18cfddf0d assets/create/blockstates/fluid_pipe.json @@ -323,8 +323,6 @@ fa5fb2be73c7c54b70e927b66adf3f4d64c5cb6b assets/create/blockstates/light_gray_ni f1901887cd166296e465133c3b0d7ad0d664a614 assets/create/blockstates/light_gray_table_cloth.json 35b151db396069b146d223fbe46be5b0c3dda8a9 assets/create/blockstates/light_gray_toolbox.json 894827ffd176bc733abecf18d96888e9ed5a3eb4 assets/create/blockstates/light_gray_valve_handle.json -a6f319c803c03e34bbf841ea52d82f0f7ec7a413 assets/create/blockstates/limestone.json -7ff65e1c4c8e48a0b694cd17506a192e6a7e6e44 assets/create/blockstates/limestone_pillar.json 7f20b548dd535942b2d6f41c39de7ad4fafe637e assets/create/blockstates/lime_nixie_tube.json c6ac740bf37477ad170576983230b130ac01f355 assets/create/blockstates/lime_postbox.json ad1ec304729fd6d336c0d4d0c27c9345af636695 assets/create/blockstates/lime_sail.json @@ -332,6 +330,8 @@ b9934a558e1b495403dc2c71ffb43cce7d396013 assets/create/blockstates/lime_seat.jso 7c5dc2ffd0bd44ba8785b6a788030714a009bcbc assets/create/blockstates/lime_table_cloth.json 49a02f7fc16697ba1cf16cee7e45ab6bfd8b06ce assets/create/blockstates/lime_toolbox.json ba181485f219d3ae23509a7edf28e25d9edb10f4 assets/create/blockstates/lime_valve_handle.json +a6f319c803c03e34bbf841ea52d82f0f7ec7a413 assets/create/blockstates/limestone.json +7ff65e1c4c8e48a0b694cd17506a192e6a7e6e44 assets/create/blockstates/limestone_pillar.json 654e845cebed82b7afbcf81380921e0a475b01e9 assets/create/blockstates/linear_chassis.json e195e82e4d0c1fc20474535bc9068cbb77a5e175 assets/create/blockstates/lit_blaze_burner.json 296186b196af94e1ab3f7e8a3254f6d31ae47a5c assets/create/blockstates/magenta_nixie_tube.json @@ -377,14 +377,14 @@ aab812cecf7d10d4e7587f4dead8a98238a15f41 assets/create/blockstates/orange_seat.j 2af63a4768f84fc93c7e7d67fa9a64438433e59f assets/create/blockstates/orange_valve_handle.json 515ed7dae09b052f289419ba09998a23e0d7083d assets/create/blockstates/ornate_iron_window.json 8118444f37536b9104ef4818d374b0c8a7c987bf assets/create/blockstates/ornate_iron_window_pane.json -97cd78453af94f44cef1187988966626574b29d5 assets/create/blockstates/oxidized_copper_shingles.json 2ddc762b8d8558e69a2f81c028702f3a25b5e978 assets/create/blockstates/oxidized_copper_shingle_slab.json ac536ae742c12e97bfd0b2483c87ff29f3935eaf assets/create/blockstates/oxidized_copper_shingle_stairs.json -110a6c19bcc9f044e5e982ac6e4b295b03ec0145 assets/create/blockstates/oxidized_copper_tiles.json +97cd78453af94f44cef1187988966626574b29d5 assets/create/blockstates/oxidized_copper_shingles.json 3f3924f0f0e368edfa04f4fdd6d6c2319276ddfe assets/create/blockstates/oxidized_copper_tile_slab.json 5e634cfb9abb06d8b29f39d751fc56b28ea5a9cd assets/create/blockstates/oxidized_copper_tile_stairs.json -65f3fa5a068189c1c2971af1a1052f69c0e26005 assets/create/blockstates/packager.json +110a6c19bcc9f044e5e982ac6e4b295b03ec0145 assets/create/blockstates/oxidized_copper_tiles.json 887565a0f89f089d6be888c87394dde4878afda7 assets/create/blockstates/package_frogport.json +65f3fa5a068189c1c2971af1a1052f69c0e26005 assets/create/blockstates/packager.json 36742cc6ce052ead143366d31b11e828a525c1b8 assets/create/blockstates/peculiar_bell.json 53d102e706d53cb2c0dbc0bc11da828084a43519 assets/create/blockstates/pink_nixie_tube.json db7ef5acb1ce2d3b8f881f34b5d9f40633c3973d assets/create/blockstates/pink_postbox.json @@ -470,9 +470,6 @@ a4b6bd4e55cd292abf752efeda93cf8d23162657 assets/create/blockstates/purple_table_ 3aca01f2eddb22adb1b25735b98a990bfc7220d2 assets/create/blockstates/radial_chassis.json 72faac9777be540f95f8b662a833856e0e1b8f35 assets/create/blockstates/railway_casing.json 7ce346fa18702f6fe6e2a939efcfa26eda63fe38 assets/create/blockstates/raw_zinc_block.json -ec546afd3ec8036e4393b97d535f05a86f57dbc1 assets/create/blockstates/redstone_contact.json -ff205f032b36486753dddb1f2029ef8d53e9c86f assets/create/blockstates/redstone_link.json -e4c645b199a2d7e89c91065071a0a91df5ca8e3c assets/create/blockstates/redstone_requester.json e3fd62e466e3e6e7bd6fc8661f764ba972a466fc assets/create/blockstates/red_nixie_tube.json d14d6437a6727da13cea5f7eeb815720c80dde6f assets/create/blockstates/red_postbox.json 4c36b562da58ef2af57009da7cf2426059249228 assets/create/blockstates/red_sail.json @@ -480,6 +477,9 @@ d14d6437a6727da13cea5f7eeb815720c80dde6f assets/create/blockstates/red_postbox.j 90bf31515faa2e7e6d73414a6c5498911910710e assets/create/blockstates/red_table_cloth.json 380f46b7cb72b13c0f16fd4a4287a1a33adeff41 assets/create/blockstates/red_toolbox.json b689d87a27ed0cb2cab190a2ad2b599818bff56c assets/create/blockstates/red_valve_handle.json +ec546afd3ec8036e4393b97d535f05a86f57dbc1 assets/create/blockstates/redstone_contact.json +ff205f032b36486753dddb1f2029ef8d53e9c86f assets/create/blockstates/redstone_link.json +e4c645b199a2d7e89c91065071a0a91df5ca8e3c assets/create/blockstates/redstone_requester.json 87ab7ca62ecf24d60d7e5c61bd5af97714dad0ad assets/create/blockstates/refined_radiance_casing.json 64a5b256e5af2dc8cb7ed77f0feadcf5134f7335 assets/create/blockstates/repackager.json 3807bcc6ccc3dad0dbfcc8fcf260a361aa488659 assets/create/blockstates/rope.json @@ -489,8 +489,8 @@ dd63fd8443a2be507281548df838d878b0c3c8c8 assets/create/blockstates/rose_quartz_l dfe69ee57f832a2e4c576ee01bdde1617c81e46a assets/create/blockstates/rose_quartz_tiles.json b9cbbc7c4e1d9abd312263a9a270315bd5f0106b assets/create/blockstates/rotation_speed_controller.json 5a25ecb95b7978cc487491cb24478e4d6a73e977 assets/create/blockstates/sail_frame.json -bff758cc56bece375b40c32067b903b675065328 assets/create/blockstates/schematicannon.json 505510656c77d93ecd3691e7111615193275f29e assets/create/blockstates/schematic_table.json +bff758cc56bece375b40c32067b903b675065328 assets/create/blockstates/schematicannon.json 82c9ceb19cfc4e247fbb62a9605630ba08423efe assets/create/blockstates/scorchia.json 6fa99d5f1ff05153660f9917286d4b157eaa1b40 assets/create/blockstates/scorchia_pillar.json 8c34743564aa0473745ecec304a19e15e9e87cf2 assets/create/blockstates/scoria.json @@ -499,64 +499,64 @@ e5aff9dc8fa5e98b060232974194afb06d497d09 assets/create/blockstates/scoria_pillar 3343224d6da4e75f0bc7a7634ba010a4ba54ad70 assets/create/blockstates/sequenced_gearshift.json 4c261d54117ee295b307f6ea3e56a09437631f73 assets/create/blockstates/shadow_steel_casing.json 4c67d2a1a1faea5be2a81ebc0722c32d8e2e84d6 assets/create/blockstates/shaft.json -c606f103619088e8a5afe969ba54929af480a3d2 assets/create/blockstates/small_andesite_bricks.json c5469de5957d77fc11febaa658ee2bfb0d11b0bc assets/create/blockstates/small_andesite_brick_slab.json ed0bcfd07959aa208085910bd3780756979c985d assets/create/blockstates/small_andesite_brick_stairs.json 78e30e63adedf1ca95261eb4010a1db45aecfe9e assets/create/blockstates/small_andesite_brick_wall.json -b9fedc13dc8cb53a8bb16ce2257ea65f0ac94a6b assets/create/blockstates/small_asurine_bricks.json +c606f103619088e8a5afe969ba54929af480a3d2 assets/create/blockstates/small_andesite_bricks.json 653fa70f0aa7fc319d50f72692d507ff7c59c0f4 assets/create/blockstates/small_asurine_brick_slab.json e61a0b891729565434d6ab34aa3aeada7d189f9d assets/create/blockstates/small_asurine_brick_stairs.json 02556b916c198c683279eb4392ebaa31fb41e182 assets/create/blockstates/small_asurine_brick_wall.json +b9fedc13dc8cb53a8bb16ce2257ea65f0ac94a6b assets/create/blockstates/small_asurine_bricks.json e986248237013eea755bccd300f745e44d0a183f assets/create/blockstates/small_bogey.json -031d9492dbcc5de77431e8f54b9b04db412b5690 assets/create/blockstates/small_calcite_bricks.json 898bca10ff6e5402c4b8b84e1b9ba9036b32b8bc assets/create/blockstates/small_calcite_brick_slab.json ecc2276bdb2b24f54e31372bf207171a348e55d3 assets/create/blockstates/small_calcite_brick_stairs.json d9dd243b5b754a487755b53609d404ac1b3fde99 assets/create/blockstates/small_calcite_brick_wall.json -3d4e0b54ffda83f7f6e08b6a745db81049d95f3b assets/create/blockstates/small_crimsite_bricks.json +031d9492dbcc5de77431e8f54b9b04db412b5690 assets/create/blockstates/small_calcite_bricks.json 4094bf00cad8dea2dd234866b482c07175802c4c assets/create/blockstates/small_crimsite_brick_slab.json 7f73a2505e2a3a98a7749fa98f4623aa2d216edd assets/create/blockstates/small_crimsite_brick_stairs.json b477c7f1855c9eb2ef1bf672376e972678dc563f assets/create/blockstates/small_crimsite_brick_wall.json -17359d1b87399bb066cfc23002bcf0d8f71d8ccd assets/create/blockstates/small_deepslate_bricks.json +3d4e0b54ffda83f7f6e08b6a745db81049d95f3b assets/create/blockstates/small_crimsite_bricks.json c67f32adc49f0b24b34f098a390a398813365260 assets/create/blockstates/small_deepslate_brick_slab.json d05aed31d45ed12f8f117a9c64312b1abff8bd2f assets/create/blockstates/small_deepslate_brick_stairs.json 6952b02d8c5adf3d0d1a243221b637c50edaa287 assets/create/blockstates/small_deepslate_brick_wall.json -6c0ac59e09feb76afc078a88431442a2a6381c6c assets/create/blockstates/small_diorite_bricks.json +17359d1b87399bb066cfc23002bcf0d8f71d8ccd assets/create/blockstates/small_deepslate_bricks.json ee39994b434a17ec7497b271a6e0a006cf6311cb assets/create/blockstates/small_diorite_brick_slab.json eb335cf0a857299b9cd0c4f60e00bc8e4ca7efe8 assets/create/blockstates/small_diorite_brick_stairs.json b6f7c563c30483c749849899b96d4f0030b71df1 assets/create/blockstates/small_diorite_brick_wall.json -d51095bfb9d5758f8b3972a973fbe282569b0234 assets/create/blockstates/small_dripstone_bricks.json +6c0ac59e09feb76afc078a88431442a2a6381c6c assets/create/blockstates/small_diorite_bricks.json 3d8109d327099c65ca0fafcb5651051059cad1df assets/create/blockstates/small_dripstone_brick_slab.json 3931e24229db79115ffe2a9f3a069202b9b8dcab assets/create/blockstates/small_dripstone_brick_stairs.json 0d16cefcb8e619bc81ef65111d16d331db58d0aa assets/create/blockstates/small_dripstone_brick_wall.json -11dcaf8a6da96d178024b4c3ee76b9c373e5d082 assets/create/blockstates/small_granite_bricks.json +d51095bfb9d5758f8b3972a973fbe282569b0234 assets/create/blockstates/small_dripstone_bricks.json 096b064f28fbe381e1b637d4668550851cbbb2c2 assets/create/blockstates/small_granite_brick_slab.json e99cc3251937fbf9fc858623d5ea525ed5b79704 assets/create/blockstates/small_granite_brick_stairs.json 62f2b570ac6073c8a98369523095d2c18a353eed assets/create/blockstates/small_granite_brick_wall.json -346dbff9a84b988bd9c9af670b486b6af5e18179 assets/create/blockstates/small_limestone_bricks.json +11dcaf8a6da96d178024b4c3ee76b9c373e5d082 assets/create/blockstates/small_granite_bricks.json d640eed81abaa013ed1c53d68a552f639168ae8b assets/create/blockstates/small_limestone_brick_slab.json d470967200aa6ca618421cf375140b352c45cc90 assets/create/blockstates/small_limestone_brick_stairs.json 8d4a1eff66a3f45d595ff8371c0d1ebaa0ba1773 assets/create/blockstates/small_limestone_brick_wall.json -1464b01d4c8bd9ec56460c1250fd4bb07e936e22 assets/create/blockstates/small_ochrum_bricks.json +346dbff9a84b988bd9c9af670b486b6af5e18179 assets/create/blockstates/small_limestone_bricks.json ddee92141e00898e8d70145cf00c0d64f56b4f48 assets/create/blockstates/small_ochrum_brick_slab.json bad9a5820c64c125494c0eba4f6c7ebebe93341c assets/create/blockstates/small_ochrum_brick_stairs.json ed899a18522adc70ae46185c308904c8de5b5834 assets/create/blockstates/small_ochrum_brick_wall.json +1464b01d4c8bd9ec56460c1250fd4bb07e936e22 assets/create/blockstates/small_ochrum_bricks.json c520e9ba54ff6dfb96f7863bb093cdf15cc95ce4 assets/create/blockstates/small_rose_quartz_tiles.json -371ff795eb4e7cb1220d307abf8cb003f455cbec assets/create/blockstates/small_scorchia_bricks.json 384a1331b92b7beba988f729bb7cda42abec0172 assets/create/blockstates/small_scorchia_brick_slab.json 046a84030a23f5a40f4deac13f2e60ced436cadf assets/create/blockstates/small_scorchia_brick_stairs.json 58bc6e3bb10ed72b8cb5813a88cab300d1183b7d assets/create/blockstates/small_scorchia_brick_wall.json -0aa51dbfda8349b878e2f6c9bb3314fcfc1a9c39 assets/create/blockstates/small_scoria_bricks.json +371ff795eb4e7cb1220d307abf8cb003f455cbec assets/create/blockstates/small_scorchia_bricks.json 5b227400e588abae33c1682196f098adc8006d13 assets/create/blockstates/small_scoria_brick_slab.json 51420bb12b757d3888fd1ceb5c21d83b42bd2266 assets/create/blockstates/small_scoria_brick_stairs.json 36e9bd161fa4ffe18f07153b2945cfeae55e7c0b assets/create/blockstates/small_scoria_brick_wall.json -c1f9f986dd0bfdbdee210c6c7d71981b251c27db assets/create/blockstates/small_tuff_bricks.json +0aa51dbfda8349b878e2f6c9bb3314fcfc1a9c39 assets/create/blockstates/small_scoria_bricks.json 8d1af444031291fe58d850ae344aaf7e97b8bd87 assets/create/blockstates/small_tuff_brick_slab.json 26879e6cadf0035c3eed4b54b3a1fdc0c080a485 assets/create/blockstates/small_tuff_brick_stairs.json 5d58ca7b81ae537454c3cdbb5fc8aacca83cff3f assets/create/blockstates/small_tuff_brick_wall.json -ad79aa8ff306695f65386fdeb44c5285547934b6 assets/create/blockstates/small_veridium_bricks.json +c1f9f986dd0bfdbdee210c6c7d71981b251c27db assets/create/blockstates/small_tuff_bricks.json 6226471fdcadbbf0e02704bb0e7de607e99302a8 assets/create/blockstates/small_veridium_brick_slab.json b54200ebe65c4ad2e5661c81ba5bf939039277ca assets/create/blockstates/small_veridium_brick_stairs.json 0237d58443ca9dc2a9186c2387dd6633702a7598 assets/create/blockstates/small_veridium_brick_wall.json +ad79aa8ff306695f65386fdeb44c5285547934b6 assets/create/blockstates/small_veridium_bricks.json 4d987859e5f5a930c20e955919304088fb6fc6d1 assets/create/blockstates/smart_chute.json 57fc35b2e0ae9ab16c011abd95f507910c70a234 assets/create/blockstates/smart_fluid_pipe.json a70c025de5d85180f371ff05bbdc531d8bdfaab1 assets/create/blockstates/speedometer.json @@ -568,9 +568,9 @@ a60c9c8241e40c2e28f5760c0ca6e80cfe9d59f3 assets/create/blockstates/steam_whistle 636ec6c7e1ef3b737edc716200f138bc63681d78 assets/create/blockstates/steam_whistle_extension.json 8865500bcd2e4d467e74edb3509850fa92a5809f assets/create/blockstates/sticker.json bed0534e618105184bc877b104230403ca85bb58 assets/create/blockstates/sticky_mechanical_piston.json -c7c17ff17b98ce85d355f2f9b4509271bc283843 assets/create/blockstates/stockpile_switch.json 2d66ca4b6916eac170b3b8552705b699f569bae2 assets/create/blockstates/stock_link.json 9989bda294fbffc5f659d2e608e01dea424c7694 assets/create/blockstates/stock_ticker.json +c7c17ff17b98ce85d355f2f9b4509271bc283843 assets/create/blockstates/stockpile_switch.json a70c025de5d85180f371ff05bbdc531d8bdfaab1 assets/create/blockstates/stressometer.json 8086f80c532fad42b37fcdc590b890ed7e8c3fe9 assets/create/blockstates/tiled_glass.json 1143ab7223c655764a81ed72ac385ea179664072 assets/create/blockstates/tiled_glass_pane.json @@ -590,36 +590,36 @@ bfb2b7eabba2e7aef4d783328c8a5a1558e7e493 assets/create/blockstates/turntable.jso 116d0a8fb72bcc00bd511db7893ea3e96efda297 assets/create/blockstates/warped_window_pane.json fa3d300520e3bedb926696d9980cbeeb54cfdc68 assets/create/blockstates/water_wheel.json 3dff9e1ec59415779195d2abfa9f07bc17b428a1 assets/create/blockstates/water_wheel_structure.json -2ae175c489b86b78b4646306250ca2dba66b0a5e assets/create/blockstates/waxed_copper_shingles.json 85ed36dcb0a3542e0638601116360202a9670d53 assets/create/blockstates/waxed_copper_shingle_slab.json aaf49f1b6785e2195c5dc2e8792c99c960745f89 assets/create/blockstates/waxed_copper_shingle_stairs.json -835bfe0d2137ad60e5f8322fa4449d5c7a02187f assets/create/blockstates/waxed_copper_tiles.json +2ae175c489b86b78b4646306250ca2dba66b0a5e assets/create/blockstates/waxed_copper_shingles.json b52eda74c9000507a4f34e10fbd1a7846b66c16d assets/create/blockstates/waxed_copper_tile_slab.json 5428969f6f27213d0ec5140d911b3844b5332006 assets/create/blockstates/waxed_copper_tile_stairs.json -306b9cd1efe3abd1fcca11bc464560837fb8fdfa assets/create/blockstates/waxed_exposed_copper_shingles.json +835bfe0d2137ad60e5f8322fa4449d5c7a02187f assets/create/blockstates/waxed_copper_tiles.json bc8f3bb75bdb094c8372d61a68927270d3347437 assets/create/blockstates/waxed_exposed_copper_shingle_slab.json 32382e5f524b50393080fdbd2415a98ddb700c9c assets/create/blockstates/waxed_exposed_copper_shingle_stairs.json -ae92a9051f1603e7ad4f93cb668706ccffc7a85b assets/create/blockstates/waxed_exposed_copper_tiles.json +306b9cd1efe3abd1fcca11bc464560837fb8fdfa assets/create/blockstates/waxed_exposed_copper_shingles.json ca37c3e54d5c78a77fcb4a4aca004a34e271f246 assets/create/blockstates/waxed_exposed_copper_tile_slab.json a864f82ccd6b3e0fa181c800da886ebd3239fb82 assets/create/blockstates/waxed_exposed_copper_tile_stairs.json -729ca65a140b3d7571a2072f7406cc5f4a2e27c5 assets/create/blockstates/waxed_oxidized_copper_shingles.json +ae92a9051f1603e7ad4f93cb668706ccffc7a85b assets/create/blockstates/waxed_exposed_copper_tiles.json ef99e849f9dd6ad53ddf04625c81750f11eaae1c assets/create/blockstates/waxed_oxidized_copper_shingle_slab.json 9386068220f9bb5d2f6d3cc408dc4f78f26b4eeb assets/create/blockstates/waxed_oxidized_copper_shingle_stairs.json -17acf3486e92aabc3efbe99fa1e5d7d664e6ec97 assets/create/blockstates/waxed_oxidized_copper_tiles.json +729ca65a140b3d7571a2072f7406cc5f4a2e27c5 assets/create/blockstates/waxed_oxidized_copper_shingles.json fe79f7eab017d714c0331664a3a2b5579104194e assets/create/blockstates/waxed_oxidized_copper_tile_slab.json 10bbe77a0334b5578b1ec40b398a45cf7d2bb534 assets/create/blockstates/waxed_oxidized_copper_tile_stairs.json -079acbfd6a9375899687b581f95bbe74940afce2 assets/create/blockstates/waxed_weathered_copper_shingles.json +17acf3486e92aabc3efbe99fa1e5d7d664e6ec97 assets/create/blockstates/waxed_oxidized_copper_tiles.json 73572bbe16957e63853ee425d8f34d98e14e4a10 assets/create/blockstates/waxed_weathered_copper_shingle_slab.json ab05925d5bb70e53fec9c149982304f31acd2b1a assets/create/blockstates/waxed_weathered_copper_shingle_stairs.json -202b0f2e6fca9eab949f47eaa1f4ddee249a633a assets/create/blockstates/waxed_weathered_copper_tiles.json +079acbfd6a9375899687b581f95bbe74940afce2 assets/create/blockstates/waxed_weathered_copper_shingles.json fc1b53d3b2b1f0977069abec3c376f3f5c4cd7c8 assets/create/blockstates/waxed_weathered_copper_tile_slab.json 6cd93476a45c3b77f5eda66f68425bae486cfba8 assets/create/blockstates/waxed_weathered_copper_tile_stairs.json -c11562afd9a5f85945e521dcea5f911d1b6d13c6 assets/create/blockstates/weathered_copper_shingles.json +202b0f2e6fca9eab949f47eaa1f4ddee249a633a assets/create/blockstates/waxed_weathered_copper_tiles.json 5a5a1e95988edb7a2b6dc6c6ba5677c2d896a5ae assets/create/blockstates/weathered_copper_shingle_slab.json 07019fc8890cb5e966a42ca636a0ab9cf71cc881 assets/create/blockstates/weathered_copper_shingle_stairs.json -236e072d9056c0dbffdf5d7d973a85a56c2c8de1 assets/create/blockstates/weathered_copper_tiles.json +c11562afd9a5f85945e521dcea5f911d1b6d13c6 assets/create/blockstates/weathered_copper_shingles.json fee668eb9a45dca0d287fee5811219d69f9ec3e2 assets/create/blockstates/weathered_copper_tile_slab.json da110f382368257e15431c77164aef82e014e3f8 assets/create/blockstates/weathered_copper_tile_stairs.json +236e072d9056c0dbffdf5d7d973a85a56c2c8de1 assets/create/blockstates/weathered_copper_tiles.json 64fb3e569da401635b64e71e01ea0b3ff6360611 assets/create/blockstates/weathered_iron_block.json 6fd81f1eb48fbfc44df9db8eedc613690c9b8ef5 assets/create/blockstates/weathered_iron_window.json 1aed351050d73989c4553bf49ce03b3a8fdd210e assets/create/blockstates/weathered_iron_window_pane.json @@ -642,8 +642,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -913f3794fb772a0736ae66dff722b3c468bcde79 assets/create/lang/en_ud.json -1f6031cb19932ad54d645fbca1f2773385dd47ed assets/create/lang/en_us.json +865a57ba9454a0a17d823e7bb1ab40ff5094e59a assets/create/lang/en_ud.json +a31ba9b41ace1eb3404ce09817c32561607b7e85 assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -806,21 +806,21 @@ d063df8e9b974c11fc7810ce176b02d7d924e15b assets/create/models/block/copper_post. 2b5aed4a917694beb33d9b0ecbc800dcbc143ee9 assets/create/models/block/copper_post_ends.json bac7566a726b0fe6d537c744aec4afb383dc165c assets/create/models/block/copper_scaffolding.json dbee65c129740f3b99c07e754b3224d3f9f8c242 assets/create/models/block/copper_scaffolding_horizontal.json -32fdb85b5b62d5a0fb41732874c854788cdd2ba1 assets/create/models/block/copper_shingles.json fb7fb6deebd502946ab57f1b8a9f4a6b5dd48da3 assets/create/models/block/copper_shingle_slab.json 660f61112b8e46dec5050cb0ed4ee936965a7c58 assets/create/models/block/copper_shingle_slab_top.json 5d74be967bbe9feba4b630751f13af817a733d1d assets/create/models/block/copper_shingle_stairs.json 35cb89f29ce3f8d8af13602c08ecd7afbb7cf56a assets/create/models/block/copper_shingle_stairs_inner.json fcb9295f4f388e6d439ec9a3906ca326b6d69077 assets/create/models/block/copper_shingle_stairs_outer.json +32fdb85b5b62d5a0fb41732874c854788cdd2ba1 assets/create/models/block/copper_shingles.json cb218a725f82db34ffe58a5208266e1c768cfc05 assets/create/models/block/copper_side.json d9b4652ca8f1e65007f42d946ecfb38acc3f168f assets/create/models/block/copper_side_alt.json 03a6c5b8bc3041a2be001092f7abd014d6f852a2 assets/create/models/block/copper_table_cloth.json -32f06f39d0b34e4431795aa6e64f87e58dc1597b assets/create/models/block/copper_tiles.json 298c6100de02ed9f813397d8ba38c46f35035c69 assets/create/models/block/copper_tile_slab.json d4422c2d96fb329087d1be70d8b983a8cf6c7f01 assets/create/models/block/copper_tile_slab_top.json fca72048f916d3a3e567b385c948cc1b59711ef4 assets/create/models/block/copper_tile_stairs.json 997479b62ed3d81ab633279ecc2fabd9588a3bf3 assets/create/models/block/copper_tile_stairs_inner.json d5c5bbfb9aaa282e11ad6e6309b1880b172ee653 assets/create/models/block/copper_tile_stairs_outer.json +32f06f39d0b34e4431795aa6e64f87e58dc1597b assets/create/models/block/copper_tiles.json fa2fa91e674eb4de440617049dae34064fd6fa39 assets/create/models/block/copper_valve_handle.json 52ae02c17509e483e35a1b6055296c3a663f85d7 assets/create/models/block/crate/creative/bottom.json 689989ecbd4d59d5836deb8adf7af1d473a377c0 assets/create/models/block/crate/creative/left.json @@ -864,15 +864,15 @@ b3f403f77e3b1b44c56450e387136bca12a84a99 assets/create/models/block/crimson_wind 117d14a1f25cc8ac633bb4cc8a81830a1c016096 assets/create/models/block/crimson_window_pane_side.json ee13522aadfca40f856499d5c29bd86d8f4dda57 assets/create/models/block/crimson_window_pane_side_alt.json 40042ce15d51445ec71b73da34477fa735f3fdd4 assets/create/models/block/cut_andesite.json -5be7d431ac56e2ceb9e3d95589d687f757d5257c assets/create/models/block/cut_andesite_bricks.json -c78e2acf9b54d7370f12e34dcca5c71743f47d55 assets/create/models/block/cut_andesite_bricks_wall_post.json -88e3c8eadf97f772fbafe3b71c8dd27c91c0c0e3 assets/create/models/block/cut_andesite_bricks_wall_side.json -bc264e09c506418b01c6032dcab8ca28080cb70b assets/create/models/block/cut_andesite_bricks_wall_side_tall.json fcbe246aca067dcfeef7afb4e6068b8932da8792 assets/create/models/block/cut_andesite_brick_slab.json e384a98b54ed7317b6ad0e86cf87500491eea824 assets/create/models/block/cut_andesite_brick_slab_top.json 91699e60e29e7524271a2f87200951ee8bfeb8ef assets/create/models/block/cut_andesite_brick_stairs.json e314e0837aed319cdf34a1aaa60f0be6ca169636 assets/create/models/block/cut_andesite_brick_stairs_inner.json aba679c4c6a8d5afc2924d2c9c84af5a2208fde3 assets/create/models/block/cut_andesite_brick_stairs_outer.json +5be7d431ac56e2ceb9e3d95589d687f757d5257c assets/create/models/block/cut_andesite_bricks.json +c78e2acf9b54d7370f12e34dcca5c71743f47d55 assets/create/models/block/cut_andesite_bricks_wall_post.json +88e3c8eadf97f772fbafe3b71c8dd27c91c0c0e3 assets/create/models/block/cut_andesite_bricks_wall_side.json +bc264e09c506418b01c6032dcab8ca28080cb70b assets/create/models/block/cut_andesite_bricks_wall_side_tall.json 8c17ba39e50a440497af089f5fd85649f05bdf8c assets/create/models/block/cut_andesite_slab.json b95ab966cf8c177c799e228759d0cd28c1cfa71f assets/create/models/block/cut_andesite_slab_top.json 81a407a5ff4393b66f784ba4ceee971c3c62de7f assets/create/models/block/cut_andesite_stairs.json @@ -882,15 +882,15 @@ f06abcb3ce691fd30db81b40ea0430462fc972cf assets/create/models/block/cut_andesite 81cef9548137aaff5b6e77d417f387796f2608b2 assets/create/models/block/cut_andesite_wall_side.json dbb99ac37333ee12b7d3859207409aa2599f28eb assets/create/models/block/cut_andesite_wall_side_tall.json a48f77e90c1d02d5b4e6540db723f748118788e9 assets/create/models/block/cut_asurine.json -3b0b7bd63870ac19b9444ce9add9930ec9120821 assets/create/models/block/cut_asurine_bricks.json -89142424e1d702a0f2bc27829304520e48ee1eb3 assets/create/models/block/cut_asurine_bricks_wall_post.json -1f1fcf92e91b1f0d15ba389d6d25e1fba3ad8e5b assets/create/models/block/cut_asurine_bricks_wall_side.json -858d15aff53fe938304bafb52ef32e54e3d44a44 assets/create/models/block/cut_asurine_bricks_wall_side_tall.json 4107317f71d07fb1c113e056c832e963f57b41d7 assets/create/models/block/cut_asurine_brick_slab.json fba2e8dc513184eaa9c4449471b32f206dfe425a assets/create/models/block/cut_asurine_brick_slab_top.json 72bb7b2df330f8d5981f4c12b23429d8d874362d assets/create/models/block/cut_asurine_brick_stairs.json e753ba3830c51539565abbd9b49df9a34f97f2ff assets/create/models/block/cut_asurine_brick_stairs_inner.json ec9182d14517ffc71749e3e016e6546db79e6800 assets/create/models/block/cut_asurine_brick_stairs_outer.json +3b0b7bd63870ac19b9444ce9add9930ec9120821 assets/create/models/block/cut_asurine_bricks.json +89142424e1d702a0f2bc27829304520e48ee1eb3 assets/create/models/block/cut_asurine_bricks_wall_post.json +1f1fcf92e91b1f0d15ba389d6d25e1fba3ad8e5b assets/create/models/block/cut_asurine_bricks_wall_side.json +858d15aff53fe938304bafb52ef32e54e3d44a44 assets/create/models/block/cut_asurine_bricks_wall_side_tall.json b4512f7cef7cef0bc5f85cb955c2dec6de2cbb56 assets/create/models/block/cut_asurine_slab.json 7c1befdd97b1556e9658e968e705c9edbf1ed667 assets/create/models/block/cut_asurine_slab_top.json d04b8a8cf9a50aa7e0b068ceb9a5a2970abc81a7 assets/create/models/block/cut_asurine_stairs.json @@ -900,15 +900,15 @@ ac544a8f948119945aa21362ad26ed8b1c922b0d assets/create/models/block/cut_asurine_ a253210cba60f58e720598323bd0d9ed4c209b4d assets/create/models/block/cut_asurine_wall_side.json c0c2cc13288771699a80c5c80e8e35d352cea684 assets/create/models/block/cut_asurine_wall_side_tall.json a6b10dc7984d22cac7aa314d46ac0928a00e667b assets/create/models/block/cut_calcite.json -6230a499321b175fc441bb662e0655662b3597de assets/create/models/block/cut_calcite_bricks.json -be1462847e9001a062091162802fab2fe6737693 assets/create/models/block/cut_calcite_bricks_wall_post.json -6e6b34468a7a0786efe5f4ebd917a4640b4be6ae assets/create/models/block/cut_calcite_bricks_wall_side.json -8b10c0f4f17f3844cee6d514cc22ddc6cb056c8a assets/create/models/block/cut_calcite_bricks_wall_side_tall.json f046be4f44936946bd3cc2ad5549d112b2e60d97 assets/create/models/block/cut_calcite_brick_slab.json 64953ca8a302ecab9311c617f69e5dcf8c138718 assets/create/models/block/cut_calcite_brick_slab_top.json 19e1b342d05d3cd69c410952dc22507c3c988c15 assets/create/models/block/cut_calcite_brick_stairs.json 18317b0a8bab345abd779f5d43f9620b73df0e67 assets/create/models/block/cut_calcite_brick_stairs_inner.json 0631d4e1bdaf724752f2e55401eb7a54af705b56 assets/create/models/block/cut_calcite_brick_stairs_outer.json +6230a499321b175fc441bb662e0655662b3597de assets/create/models/block/cut_calcite_bricks.json +be1462847e9001a062091162802fab2fe6737693 assets/create/models/block/cut_calcite_bricks_wall_post.json +6e6b34468a7a0786efe5f4ebd917a4640b4be6ae assets/create/models/block/cut_calcite_bricks_wall_side.json +8b10c0f4f17f3844cee6d514cc22ddc6cb056c8a assets/create/models/block/cut_calcite_bricks_wall_side_tall.json 6b35e0f9e6a7e247bf38d8d6d911a2bcc53c2517 assets/create/models/block/cut_calcite_slab.json 0eec7692ee8e119c1258bdb7e852204771c2232d assets/create/models/block/cut_calcite_slab_top.json d07ebf8982e4947852da8b2b0052f6b6000d334f assets/create/models/block/cut_calcite_stairs.json @@ -918,15 +918,15 @@ e8b7b983168ad9f4f4fa1642ca20ff56621935db assets/create/models/block/cut_calcite_ 421e128177bb4dd51391e360f11ba83c5d891cd1 assets/create/models/block/cut_calcite_wall_side.json 5add4bde51bbdd7c229b05f4fabd8a769414fb79 assets/create/models/block/cut_calcite_wall_side_tall.json 2e93da554ea72b90a576bbc9230aea373d3aed0f assets/create/models/block/cut_crimsite.json -39d1a3cdd978c761bc0d67baaba82d11953fc2a0 assets/create/models/block/cut_crimsite_bricks.json -8614cb38c52447fea5245fcf295a951a977071c0 assets/create/models/block/cut_crimsite_bricks_wall_post.json -b0b16f4a2f6dd3f77ec4f65f05e9edb70a196316 assets/create/models/block/cut_crimsite_bricks_wall_side.json -ac41e5b092c6ed81d14004f9427b6151b88dc924 assets/create/models/block/cut_crimsite_bricks_wall_side_tall.json c2474a10109d0476a46d2a509fc1cd37cd52822d assets/create/models/block/cut_crimsite_brick_slab.json efeb149835a389409b7f94bc35765b0871ad7342 assets/create/models/block/cut_crimsite_brick_slab_top.json e5096a1bae43341bae5706f02cd6d564b5a82502 assets/create/models/block/cut_crimsite_brick_stairs.json af3c0018e5e12bbe0f118bc0174b6ca513ae58ae assets/create/models/block/cut_crimsite_brick_stairs_inner.json ed30baef426f2ccf158d87111c7b53f3600bc32a assets/create/models/block/cut_crimsite_brick_stairs_outer.json +39d1a3cdd978c761bc0d67baaba82d11953fc2a0 assets/create/models/block/cut_crimsite_bricks.json +8614cb38c52447fea5245fcf295a951a977071c0 assets/create/models/block/cut_crimsite_bricks_wall_post.json +b0b16f4a2f6dd3f77ec4f65f05e9edb70a196316 assets/create/models/block/cut_crimsite_bricks_wall_side.json +ac41e5b092c6ed81d14004f9427b6151b88dc924 assets/create/models/block/cut_crimsite_bricks_wall_side_tall.json a6cdd4b227210b7487b8431b8d76bbe490636b81 assets/create/models/block/cut_crimsite_slab.json 5c585dba4dbfa9ff0a22a84aa726260cffdeebeb assets/create/models/block/cut_crimsite_slab_top.json 91f60b4277ca48dabfb5d3eebb1ed64a2681a083 assets/create/models/block/cut_crimsite_stairs.json @@ -936,15 +936,15 @@ e6b39a0b1dbab462479fc60fab2efc6a9ceb6a55 assets/create/models/block/cut_crimsite 5b3783862e50fde6ffffc92068900afcc066002f assets/create/models/block/cut_crimsite_wall_side.json b59fbbfe9c6738b1f93f03d59a747f5610164c34 assets/create/models/block/cut_crimsite_wall_side_tall.json 144ec3864fb0a7981e74d357200a96033c75a2d6 assets/create/models/block/cut_deepslate.json -0d599ae1b4e9309f2a7b3362e86061e2150ba3ec assets/create/models/block/cut_deepslate_bricks.json -601894e096edbcd3d96ce0160f06e17a4efca819 assets/create/models/block/cut_deepslate_bricks_wall_post.json -42db46cb5c9c02d684c86f3a518feb3348d83fa0 assets/create/models/block/cut_deepslate_bricks_wall_side.json -c046436d59c350c6beb6b395675513c12184ffe2 assets/create/models/block/cut_deepslate_bricks_wall_side_tall.json af8c7c652e75bf904093bbafc1cf805f842a39c9 assets/create/models/block/cut_deepslate_brick_slab.json 2a01dd0244b07f28454c061a565d1028ca7e3066 assets/create/models/block/cut_deepslate_brick_slab_top.json 62d39eec3621204de82377e74936b9cd338e8004 assets/create/models/block/cut_deepslate_brick_stairs.json 5f90dfbb45b57bd894bf03fcc6c347cb525e3a73 assets/create/models/block/cut_deepslate_brick_stairs_inner.json 512d588c77bdf5a7232826e2f4ce4b3cb991d0ce assets/create/models/block/cut_deepslate_brick_stairs_outer.json +0d599ae1b4e9309f2a7b3362e86061e2150ba3ec assets/create/models/block/cut_deepslate_bricks.json +601894e096edbcd3d96ce0160f06e17a4efca819 assets/create/models/block/cut_deepslate_bricks_wall_post.json +42db46cb5c9c02d684c86f3a518feb3348d83fa0 assets/create/models/block/cut_deepslate_bricks_wall_side.json +c046436d59c350c6beb6b395675513c12184ffe2 assets/create/models/block/cut_deepslate_bricks_wall_side_tall.json c79ae6e97e94d36f2586865ea63f3fab43f8ccbc assets/create/models/block/cut_deepslate_slab.json 5978b93805ccf0bdd953938b34a8dd0ffdcf5565 assets/create/models/block/cut_deepslate_slab_top.json 06a508b2395c3f738d2c5651f366792ee9b9c5ec assets/create/models/block/cut_deepslate_stairs.json @@ -954,15 +954,15 @@ c2850e9f223c459ba53d575a1ef8231589c48c0b assets/create/models/block/cut_deepslat e901746d3e50fe7d9b79d268f4d02251d5cf95f4 assets/create/models/block/cut_deepslate_wall_side.json 1ef794aab31a10bf150a0015cd46e5b5f3c70042 assets/create/models/block/cut_deepslate_wall_side_tall.json 4abb502ea3f6764797641f55a2c48f4858be1ba6 assets/create/models/block/cut_diorite.json -e97babf115a4f81f8555994aba435cf76bebf7a3 assets/create/models/block/cut_diorite_bricks.json -4f7cf44e4d6431587266a4fac78c0812e99d780c assets/create/models/block/cut_diorite_bricks_wall_post.json -1f96f9e190d8e28496ce2db5712f33e449215985 assets/create/models/block/cut_diorite_bricks_wall_side.json -45246192d9cd39837b426e425fc5082422642b65 assets/create/models/block/cut_diorite_bricks_wall_side_tall.json ab61b1b94946f315006a29113f594c234d796bee assets/create/models/block/cut_diorite_brick_slab.json 73597772386c6bbd38907cbea8db816f174a9f8f assets/create/models/block/cut_diorite_brick_slab_top.json c9fbd953ef0789a0e9a915d5f283fd09a76784d6 assets/create/models/block/cut_diorite_brick_stairs.json 5d721f1b3f4376a91707b56950a1f9635adbe603 assets/create/models/block/cut_diorite_brick_stairs_inner.json 9a446bf02732e1873fa96d7745fced0fa04d48d6 assets/create/models/block/cut_diorite_brick_stairs_outer.json +e97babf115a4f81f8555994aba435cf76bebf7a3 assets/create/models/block/cut_diorite_bricks.json +4f7cf44e4d6431587266a4fac78c0812e99d780c assets/create/models/block/cut_diorite_bricks_wall_post.json +1f96f9e190d8e28496ce2db5712f33e449215985 assets/create/models/block/cut_diorite_bricks_wall_side.json +45246192d9cd39837b426e425fc5082422642b65 assets/create/models/block/cut_diorite_bricks_wall_side_tall.json 15195975e7e0ffb7010591b957a657f492e6d59d assets/create/models/block/cut_diorite_slab.json 01c320637843dc0d8b74b48b8d6946cd663d51f6 assets/create/models/block/cut_diorite_slab_top.json 7dcbfe4dc2ec62345da660ecc6ca44056fcd64e7 assets/create/models/block/cut_diorite_stairs.json @@ -972,15 +972,15 @@ c9fbd953ef0789a0e9a915d5f283fd09a76784d6 assets/create/models/block/cut_diorite_ 29075eaaba51ba158f030c2a9583ed5ba52379c8 assets/create/models/block/cut_diorite_wall_side.json 1fb50473359147c7147ea85bc1907e6015ce06bc assets/create/models/block/cut_diorite_wall_side_tall.json 59ee053a884bc9731b4d1b01ae22e0e2b5916cfb assets/create/models/block/cut_dripstone.json -6a4b26a117f58d0187b2cc0c5b117ef71d03d4e9 assets/create/models/block/cut_dripstone_bricks.json -0bb1fa8fb9698dae61096483a01b41bf829666b0 assets/create/models/block/cut_dripstone_bricks_wall_post.json -2019fdc38b401bac72e8344d118d85049ec3efb9 assets/create/models/block/cut_dripstone_bricks_wall_side.json -ebb790b2b6f47d40c92c9bba680e82cb8f054fa9 assets/create/models/block/cut_dripstone_bricks_wall_side_tall.json 84d714b29dcb7eb95a82de8d48491413e26d5fa8 assets/create/models/block/cut_dripstone_brick_slab.json 28b0b1a641d11f8ade57c444e4c1bfd9d617f66a assets/create/models/block/cut_dripstone_brick_slab_top.json 05900c156a6341c12b366790c7e8d15e59a873f0 assets/create/models/block/cut_dripstone_brick_stairs.json 35fb2c83dc89b96951c69253f7502f78c903a9b8 assets/create/models/block/cut_dripstone_brick_stairs_inner.json f69244c1706c95aaadd32d45a24c91ce0848509f assets/create/models/block/cut_dripstone_brick_stairs_outer.json +6a4b26a117f58d0187b2cc0c5b117ef71d03d4e9 assets/create/models/block/cut_dripstone_bricks.json +0bb1fa8fb9698dae61096483a01b41bf829666b0 assets/create/models/block/cut_dripstone_bricks_wall_post.json +2019fdc38b401bac72e8344d118d85049ec3efb9 assets/create/models/block/cut_dripstone_bricks_wall_side.json +ebb790b2b6f47d40c92c9bba680e82cb8f054fa9 assets/create/models/block/cut_dripstone_bricks_wall_side_tall.json 9e42cf588f57de5166f2a2ccdae656743c8b9481 assets/create/models/block/cut_dripstone_slab.json 0da2f782d8ad8fecd81b98c72db182b817bf19eb assets/create/models/block/cut_dripstone_slab_top.json b3c903a1edcd1786ea51a2ccdad5734a1d04ea98 assets/create/models/block/cut_dripstone_stairs.json @@ -990,15 +990,15 @@ b3c903a1edcd1786ea51a2ccdad5734a1d04ea98 assets/create/models/block/cut_dripston 7fab5102d7fa4cd824b9393425639d05727b2ad2 assets/create/models/block/cut_dripstone_wall_side.json c41514cda1c9f5d942d222cbc5f6e620e367afc6 assets/create/models/block/cut_dripstone_wall_side_tall.json dff602c8d2fcd1ceca79f90ae15dbdfbd6cb157d assets/create/models/block/cut_granite.json -31c5299a42f82992e50f711e1e33549c373bd034 assets/create/models/block/cut_granite_bricks.json -ef5a851e57cc4b9c0e625176b1256441e1c17c66 assets/create/models/block/cut_granite_bricks_wall_post.json -815e8dc551c3e813b0b2af29df23a28860de0b53 assets/create/models/block/cut_granite_bricks_wall_side.json -ba241f9c82e27dd98ba6f4e4180922388ab5d1a3 assets/create/models/block/cut_granite_bricks_wall_side_tall.json 9e00dc8fcee23548c0cebda6eadbcfc559e4c20b assets/create/models/block/cut_granite_brick_slab.json 5ad061096451f74e773c3030f96d59424aa93314 assets/create/models/block/cut_granite_brick_slab_top.json 94f8ce607aae5c04ccf9e56f177f9d69203ae879 assets/create/models/block/cut_granite_brick_stairs.json 11d511844fec3bfd05cac8b788332f2decd53021 assets/create/models/block/cut_granite_brick_stairs_inner.json 418eb6a2b52e748a26c2d1914c6c1de94106589f assets/create/models/block/cut_granite_brick_stairs_outer.json +31c5299a42f82992e50f711e1e33549c373bd034 assets/create/models/block/cut_granite_bricks.json +ef5a851e57cc4b9c0e625176b1256441e1c17c66 assets/create/models/block/cut_granite_bricks_wall_post.json +815e8dc551c3e813b0b2af29df23a28860de0b53 assets/create/models/block/cut_granite_bricks_wall_side.json +ba241f9c82e27dd98ba6f4e4180922388ab5d1a3 assets/create/models/block/cut_granite_bricks_wall_side_tall.json 81be5e86cbdaec4945d3ccaf6d376f69c49f40d6 assets/create/models/block/cut_granite_slab.json f72a14e7cf3dd7d93b4462a3bee49683353dfb57 assets/create/models/block/cut_granite_slab_top.json 33bf924f01aae3a7720475f4b32b3a637e69ee36 assets/create/models/block/cut_granite_stairs.json @@ -1008,15 +1008,15 @@ fb4969e562ad2039d3bad2dc57a6845d3243d453 assets/create/models/block/cut_granite_ 2972b40134bcb15950a0118306f0251ff5e377b7 assets/create/models/block/cut_granite_wall_side.json abbe71fd17dbb5f176553db2f6edf2f1f7d8974a assets/create/models/block/cut_granite_wall_side_tall.json 019d3c4ffb39e328b5458aee44fee90e0ecbd829 assets/create/models/block/cut_limestone.json -7eae0f9766506f713933bde9f301d2f7f2bbef13 assets/create/models/block/cut_limestone_bricks.json -817e8cf8956af36c70e4b4e30b5d141086d006dd assets/create/models/block/cut_limestone_bricks_wall_post.json -1291cacff1b0980e58b5702a84c9b87ac5ef835d assets/create/models/block/cut_limestone_bricks_wall_side.json -6c9bc8803fe17ac623bde56f85683dd2ff13c33e assets/create/models/block/cut_limestone_bricks_wall_side_tall.json c93f33ba39c62b10dfb94c6e1c339cd4fbebffae assets/create/models/block/cut_limestone_brick_slab.json b12a340897ba98ed732a91dbd4129db7a7188e68 assets/create/models/block/cut_limestone_brick_slab_top.json 3e90b32d95ad1cf7b8a16dae3c16724510d41490 assets/create/models/block/cut_limestone_brick_stairs.json b2e7311667d14b2aa8c00e207f69f76207226567 assets/create/models/block/cut_limestone_brick_stairs_inner.json aac619ec1fb8aa56f1752ad3f354f9cb128771f8 assets/create/models/block/cut_limestone_brick_stairs_outer.json +7eae0f9766506f713933bde9f301d2f7f2bbef13 assets/create/models/block/cut_limestone_bricks.json +817e8cf8956af36c70e4b4e30b5d141086d006dd assets/create/models/block/cut_limestone_bricks_wall_post.json +1291cacff1b0980e58b5702a84c9b87ac5ef835d assets/create/models/block/cut_limestone_bricks_wall_side.json +6c9bc8803fe17ac623bde56f85683dd2ff13c33e assets/create/models/block/cut_limestone_bricks_wall_side_tall.json adc21af1c07edaf0573cfd2c95ebe38e50f7282c assets/create/models/block/cut_limestone_slab.json 2d1ea8fc5c8ce5549c7f7888371b6612bf0f5301 assets/create/models/block/cut_limestone_slab_top.json c1416808a2178996be75e0a9c1cd45849fcd6646 assets/create/models/block/cut_limestone_stairs.json @@ -1026,15 +1026,15 @@ c1416808a2178996be75e0a9c1cd45849fcd6646 assets/create/models/block/cut_limeston 2b5e65e662069a5c59e702224778dd407f5d11dd assets/create/models/block/cut_limestone_wall_side.json 052f130fef646242acccbbed2b510add21e18921 assets/create/models/block/cut_limestone_wall_side_tall.json 66cb6054821d45a60ae4d4d1d904dbef0b9f7c0f assets/create/models/block/cut_ochrum.json -0a7e38e3ac32352c5b3ec56a8c26212dbbb637a3 assets/create/models/block/cut_ochrum_bricks.json -47d0c58dd190f1ea894a5ca40ea7efd54a845d3e assets/create/models/block/cut_ochrum_bricks_wall_post.json -b502b5b213996bce0a626d86414045c80921511e assets/create/models/block/cut_ochrum_bricks_wall_side.json -c3f27545b3b7654c3e7a2df6b482d1a9895ccae9 assets/create/models/block/cut_ochrum_bricks_wall_side_tall.json ce16ec490ae8a33671502804e0b45fc42b6f228f assets/create/models/block/cut_ochrum_brick_slab.json fcbee94fdbd96b0b3d4aa245c6c87443abd1de90 assets/create/models/block/cut_ochrum_brick_slab_top.json 827349ed3eb05f5fe700e8f5816bcd82d0347612 assets/create/models/block/cut_ochrum_brick_stairs.json aa81d4135400eb40f891f8c41fcf7fa516ef64f1 assets/create/models/block/cut_ochrum_brick_stairs_inner.json ecd7e1cb9cae717e35eeb58dbe482833e98f5ac0 assets/create/models/block/cut_ochrum_brick_stairs_outer.json +0a7e38e3ac32352c5b3ec56a8c26212dbbb637a3 assets/create/models/block/cut_ochrum_bricks.json +47d0c58dd190f1ea894a5ca40ea7efd54a845d3e assets/create/models/block/cut_ochrum_bricks_wall_post.json +b502b5b213996bce0a626d86414045c80921511e assets/create/models/block/cut_ochrum_bricks_wall_side.json +c3f27545b3b7654c3e7a2df6b482d1a9895ccae9 assets/create/models/block/cut_ochrum_bricks_wall_side_tall.json e23998f88eb77826f5e4d58f3f4bb41a2e09ea97 assets/create/models/block/cut_ochrum_slab.json cd14f1abe3d0c65fbdd052f4a8e0b8fc2a15ad0e assets/create/models/block/cut_ochrum_slab_top.json a751feb4b609df141f971e341b204e76379dcda7 assets/create/models/block/cut_ochrum_stairs.json @@ -1044,15 +1044,15 @@ bed6843e39e7e771f6de151dfab0586d3ebad58c assets/create/models/block/cut_ochrum_s df267fb690642cac139aaabefa9eab802f13ddc1 assets/create/models/block/cut_ochrum_wall_side.json ed363b80cc61cb4d0b6fad9da855a0543ecaccc9 assets/create/models/block/cut_ochrum_wall_side_tall.json a65a54a08d9cc3b45e2320482dc2d9e317dd4f3d assets/create/models/block/cut_scorchia.json -9c93a554ab680d7c98c648c16472b52cc2646c50 assets/create/models/block/cut_scorchia_bricks.json -615dc444bb677caa774a4e95686ac24ebe4ec6dc assets/create/models/block/cut_scorchia_bricks_wall_post.json -758a2ad6677f857fbe955c26853eadc7150c105a assets/create/models/block/cut_scorchia_bricks_wall_side.json -f918dfa0751589d18a3eb054c290f669b5c61308 assets/create/models/block/cut_scorchia_bricks_wall_side_tall.json a032cf0a77e4f416ed153b1ffa834c065a73b2ae assets/create/models/block/cut_scorchia_brick_slab.json 716fc6ef58c240b3e6b45acf08d6e1472fe38e7c assets/create/models/block/cut_scorchia_brick_slab_top.json b2870e5ba7c5d5053b3639bf0aa1771ee050810b assets/create/models/block/cut_scorchia_brick_stairs.json 3e8a815eabd1991039a8ad18cedc9c57f46cd097 assets/create/models/block/cut_scorchia_brick_stairs_inner.json 0a9dc3149e7219a70642c242cd86dce5ba5cf4cc assets/create/models/block/cut_scorchia_brick_stairs_outer.json +9c93a554ab680d7c98c648c16472b52cc2646c50 assets/create/models/block/cut_scorchia_bricks.json +615dc444bb677caa774a4e95686ac24ebe4ec6dc assets/create/models/block/cut_scorchia_bricks_wall_post.json +758a2ad6677f857fbe955c26853eadc7150c105a assets/create/models/block/cut_scorchia_bricks_wall_side.json +f918dfa0751589d18a3eb054c290f669b5c61308 assets/create/models/block/cut_scorchia_bricks_wall_side_tall.json a85c4d0467c6746a8ef9c6ac0167d3e16f307d4e assets/create/models/block/cut_scorchia_slab.json 23fd6c65ea83f7ca7ef67dd7faf902c4fa662d70 assets/create/models/block/cut_scorchia_slab_top.json e42329f6fa3aeb958d2349a5442856e9473dc6b5 assets/create/models/block/cut_scorchia_stairs.json @@ -1062,15 +1062,15 @@ b9a911675861fee414f82c745399a7707c258f77 assets/create/models/block/cut_scorchia e61af066960897d50dc7f7bc17f95baa962829bd assets/create/models/block/cut_scorchia_wall_side.json 846f84efddca7d51b58ebe5e3bbed78312fb052d assets/create/models/block/cut_scorchia_wall_side_tall.json ce9dcf5b7fe58a97fab832fb98b4f5b6d3778255 assets/create/models/block/cut_scoria.json -fa3ef2bb65299c985b70f6959421e243a9ebc6d8 assets/create/models/block/cut_scoria_bricks.json -24ea1a30f68a918e6737dc8d9babe4528af5716a assets/create/models/block/cut_scoria_bricks_wall_post.json -ba7ae110d51fe510566ab42f5ead299b4409f2b7 assets/create/models/block/cut_scoria_bricks_wall_side.json -f04d12bc4e0b939bb443abcc6eb808e66c352c66 assets/create/models/block/cut_scoria_bricks_wall_side_tall.json edf04cbfb19b6ce99c1b74a71d40cd40c8120551 assets/create/models/block/cut_scoria_brick_slab.json f05725fd6d2764b277f01985d0e2fcbd3bf4a41e assets/create/models/block/cut_scoria_brick_slab_top.json 4bccbaef9dd9a8322087d3feb973e14d740ff27a assets/create/models/block/cut_scoria_brick_stairs.json 13f3b55dfdd97e68a6d525166618477e5bcb336d assets/create/models/block/cut_scoria_brick_stairs_inner.json 465862fb20542cae723fd72818be73aec05dad60 assets/create/models/block/cut_scoria_brick_stairs_outer.json +fa3ef2bb65299c985b70f6959421e243a9ebc6d8 assets/create/models/block/cut_scoria_bricks.json +24ea1a30f68a918e6737dc8d9babe4528af5716a assets/create/models/block/cut_scoria_bricks_wall_post.json +ba7ae110d51fe510566ab42f5ead299b4409f2b7 assets/create/models/block/cut_scoria_bricks_wall_side.json +f04d12bc4e0b939bb443abcc6eb808e66c352c66 assets/create/models/block/cut_scoria_bricks_wall_side_tall.json aeef239ca6b0eee527f75091d11d4a947740416d assets/create/models/block/cut_scoria_slab.json 5dfda9fa8117d35ebc324a5c9cb026e206e3b936 assets/create/models/block/cut_scoria_slab_top.json dfe8dbdb6deca69d847ee46fedfefe2da98dc329 assets/create/models/block/cut_scoria_stairs.json @@ -1080,15 +1080,15 @@ e0b2a94ff4b3f1c1e4282c9c8eecf2583bd7c68e assets/create/models/block/cut_scoria_w cf18e3fde94e3ba611f430fe527a9042a57e6936 assets/create/models/block/cut_scoria_wall_side.json 92475d7758b2bf582c585c2aafa6510f330c6f45 assets/create/models/block/cut_scoria_wall_side_tall.json 9f6543d21d9c24a429aae00511e6dbf61caf8030 assets/create/models/block/cut_tuff.json -8b3d9fe37ab7fda79ea4d90f674c525350883ba0 assets/create/models/block/cut_tuff_bricks.json -6b80481e15ff3d6eb40a42128da883c2027e0074 assets/create/models/block/cut_tuff_bricks_wall_post.json -057a34015b49565cb9858a2eea995a446ac0cfd4 assets/create/models/block/cut_tuff_bricks_wall_side.json -9f20bd04ef163076db9a8bf83c20cc802b57ae60 assets/create/models/block/cut_tuff_bricks_wall_side_tall.json 8c16599fda76c38978a2faa14f842a68fbbe4b9c assets/create/models/block/cut_tuff_brick_slab.json 696036e5900bdbb366dd49f5df71a1e701fd8ee3 assets/create/models/block/cut_tuff_brick_slab_top.json 54d4603e36be86e88d9302d61eab81e76cac1bbc assets/create/models/block/cut_tuff_brick_stairs.json 0ebb41a1ce5bf4ca86cbaf95e83cd2edf8f309ea assets/create/models/block/cut_tuff_brick_stairs_inner.json 5d5ed291db4b4bca464717c7fcde682b33d71c3f assets/create/models/block/cut_tuff_brick_stairs_outer.json +8b3d9fe37ab7fda79ea4d90f674c525350883ba0 assets/create/models/block/cut_tuff_bricks.json +6b80481e15ff3d6eb40a42128da883c2027e0074 assets/create/models/block/cut_tuff_bricks_wall_post.json +057a34015b49565cb9858a2eea995a446ac0cfd4 assets/create/models/block/cut_tuff_bricks_wall_side.json +9f20bd04ef163076db9a8bf83c20cc802b57ae60 assets/create/models/block/cut_tuff_bricks_wall_side_tall.json f2a904b7943555e8ec9dcc07513ca1ad9af809c3 assets/create/models/block/cut_tuff_slab.json ea74bb8a69f6acbd520ac8922e147495e5f99f6f assets/create/models/block/cut_tuff_slab_top.json 0262700e59de947907a04fdea9974f9d7e5a22f2 assets/create/models/block/cut_tuff_stairs.json @@ -1098,15 +1098,15 @@ ea74bb8a69f6acbd520ac8922e147495e5f99f6f assets/create/models/block/cut_tuff_sla 8c6492dc9e09359e5bac67ae4d473cffc8f93dbb assets/create/models/block/cut_tuff_wall_side.json f5f24066b6281303f52e25745881d5bca8c49c54 assets/create/models/block/cut_tuff_wall_side_tall.json 167e9a084987bcf7f67f655d0de88ae8ca2fcebb assets/create/models/block/cut_veridium.json -f8ab87c34f211a63525f6d386397face67460f8c assets/create/models/block/cut_veridium_bricks.json -e4e717fa8412032e184aebd1186470f41a2089c0 assets/create/models/block/cut_veridium_bricks_wall_post.json -8c40ccb8f10ef8dcda1bef46ad3490f697d178d2 assets/create/models/block/cut_veridium_bricks_wall_side.json -2c4671c66d904e15883ec3a14681b97ac537135c assets/create/models/block/cut_veridium_bricks_wall_side_tall.json 07c330c501375d5c316677edee80fb040c0fc237 assets/create/models/block/cut_veridium_brick_slab.json 4c8c660afe72e8ce9eaef53a37fdc63eb0c69513 assets/create/models/block/cut_veridium_brick_slab_top.json f802e4ae758e2c37c3129594ce4f5d9ffcfe173d assets/create/models/block/cut_veridium_brick_stairs.json 0d60d5cd0269e05816d28fcbbd2c680fe60cd316 assets/create/models/block/cut_veridium_brick_stairs_inner.json 22656f90b55aeaeeffa448b5f061fb26b5de7b0f assets/create/models/block/cut_veridium_brick_stairs_outer.json +f8ab87c34f211a63525f6d386397face67460f8c assets/create/models/block/cut_veridium_bricks.json +e4e717fa8412032e184aebd1186470f41a2089c0 assets/create/models/block/cut_veridium_bricks_wall_post.json +8c40ccb8f10ef8dcda1bef46ad3490f697d178d2 assets/create/models/block/cut_veridium_bricks_wall_side.json +2c4671c66d904e15883ec3a14681b97ac537135c assets/create/models/block/cut_veridium_bricks_wall_side_tall.json d736230e9b49a9fd40bc8f31df4d5144cdb429c8 assets/create/models/block/cut_veridium_slab.json 750e536c7b71dfb3a005d9b7a128ac435461e57f assets/create/models/block/cut_veridium_slab_top.json 8b05c19560e97ce15a66202717e3d32f6ee153a9 assets/create/models/block/cut_veridium_stairs.json @@ -1136,22 +1136,25 @@ db89bc32d0e466bc5008aa7091c682ba3aeec611 assets/create/models/block/diorite_pill a21387ab955f2b91e402b2189145f5fd6623592d assets/create/models/block/diorite_pillar_horizontal.json 44af455badc2b35a763007bba3537bda7d0ac289 assets/create/models/block/dripstone_pillar.json 1e23e3758e3311d0063c83742abb750a05021075 assets/create/models/block/dripstone_pillar_horizontal.json -19a773f91c58c49301f35965bac02d0c05fb2764 assets/create/models/block/exposed_copper_shingles.json a3420b91fdebec40e508a5eebb145c0201bd80c8 assets/create/models/block/exposed_copper_shingle_slab.json 4178ea5e50ee17b3c15f4a59efd019c4a19bb892 assets/create/models/block/exposed_copper_shingle_slab_top.json dd2d747774abc86e428a883e299db66cded78e11 assets/create/models/block/exposed_copper_shingle_stairs.json b6845da62d96a33cee624bb70360e256b26eda83 assets/create/models/block/exposed_copper_shingle_stairs_inner.json 3d8b758e50e75c5adc26ab6f39f9d73f00866673 assets/create/models/block/exposed_copper_shingle_stairs_outer.json -9cb20c9d41629d8b9426cb65829365d10966338f assets/create/models/block/exposed_copper_tiles.json +19a773f91c58c49301f35965bac02d0c05fb2764 assets/create/models/block/exposed_copper_shingles.json cd21d9d2935b6d0103502e2731c11ea27ff64ecf assets/create/models/block/exposed_copper_tile_slab.json 0ec039ba59fb0028183433e52131ff355ace5bff assets/create/models/block/exposed_copper_tile_slab_top.json c51dbd34996ac4513234800e427ac308067d5e1d assets/create/models/block/exposed_copper_tile_stairs.json 68772d4352dc7ade995dfa57ba41a38ef819e855 assets/create/models/block/exposed_copper_tile_stairs_inner.json d932671822ba93b71a9c8b50e7207803a1c4dbab assets/create/models/block/exposed_copper_tile_stairs_outer.json +9cb20c9d41629d8b9426cb65829365d10966338f assets/create/models/block/exposed_copper_tiles.json 2d1ade82820569936fd3021a877283474ced09d0 assets/create/models/block/fake_track.json 9e41f0b90dd1e71766c9d07bdb75d1e553f3392f assets/create/models/block/fluid_pipe/d_x.json 13507730f6ca6462c4cfeddc46e5b21e93fb1287 assets/create/models/block/fluid_pipe/d_y.json 84c09934d3537343a1226389993dabfa850b745e assets/create/models/block/fluid_pipe/d_z.json +b8fd54e514bd50fb287c6b758647818c6b08ef75 assets/create/models/block/fluid_pipe/l_x.json +e985ff9dbe7324cf69ab38e6e9e85c9b554af56c assets/create/models/block/fluid_pipe/l_y.json +e24957d63bac1e754fcc1647a4a86337a67f6298 assets/create/models/block/fluid_pipe/l_z.json eacc5ee5f164ccc7c13cfbbd37a92b401222debe assets/create/models/block/fluid_pipe/ld_x.json 33fc0ecce85fae051c54d5a538793d7081238894 assets/create/models/block/fluid_pipe/ld_y.json 638f1a259cabed1f8d63c6fdaa6d4d4dff539e7d assets/create/models/block/fluid_pipe/ld_z.json @@ -1161,24 +1164,21 @@ c52521cd566294c797312104284ddd343fad9c2e assets/create/models/block/fluid_pipe/l 99637310d3ca1ccfbe62b03aa9b0d82a0cf6f724 assets/create/models/block/fluid_pipe/lu_x.json 986800d441e95553464d1869d39baf456f5d70dc assets/create/models/block/fluid_pipe/lu_y.json 11dcf7d2dcd0df9b043035cb072deee96ab9e6da assets/create/models/block/fluid_pipe/lu_z.json -b8fd54e514bd50fb287c6b758647818c6b08ef75 assets/create/models/block/fluid_pipe/l_x.json -e985ff9dbe7324cf69ab38e6e9e85c9b554af56c assets/create/models/block/fluid_pipe/l_y.json -e24957d63bac1e754fcc1647a4a86337a67f6298 assets/create/models/block/fluid_pipe/l_z.json +d44ff2aed71039a7d0ff913d0d9e8398e1318f39 assets/create/models/block/fluid_pipe/r_x.json +92d4044b51a90da0b2277b0613c7ca0bb80c66fe assets/create/models/block/fluid_pipe/r_y.json +fb9a23de00ef4edb4f7e24fb60de345cd12e513f assets/create/models/block/fluid_pipe/r_z.json bde9ec36b86113a6ca7a51a4f405994460a2eb56 assets/create/models/block/fluid_pipe/rd_x.json bd325f5b37ff08328ddddeeceac1a41be586d20a assets/create/models/block/fluid_pipe/rd_y.json 28f351fd215af3a991ccd9aa05c57b9cd9e6f58d assets/create/models/block/fluid_pipe/rd_z.json 1ff3ea321aeacca70709eb76370c11c7f13163b6 assets/create/models/block/fluid_pipe/ru_x.json 95bc5342fd3909981430c2e13ef98cdbd8f02709 assets/create/models/block/fluid_pipe/ru_y.json e1fc0d1297a83749ac55f51c9cf33ff2ecc9fdc2 assets/create/models/block/fluid_pipe/ru_z.json -d44ff2aed71039a7d0ff913d0d9e8398e1318f39 assets/create/models/block/fluid_pipe/r_x.json -92d4044b51a90da0b2277b0613c7ca0bb80c66fe assets/create/models/block/fluid_pipe/r_y.json -fb9a23de00ef4edb4f7e24fb60de345cd12e513f assets/create/models/block/fluid_pipe/r_z.json -65a41f4b680af197776e03cae6f1815b6d04def2 assets/create/models/block/fluid_pipe/ud_x.json -26398801d89889ffe17b6513b786d27707f6a480 assets/create/models/block/fluid_pipe/ud_y.json -07747cc2b936e1b326bae7ac32a8a5ba77fdffa9 assets/create/models/block/fluid_pipe/ud_z.json 4e3debb2ba60398a0730866f781e0455f4316610 assets/create/models/block/fluid_pipe/u_x.json 0f98b30ba09706b8a5ee09aeef912b39acea0216 assets/create/models/block/fluid_pipe/u_y.json 83bf9b1af633c319c051055170debff4cc3508c0 assets/create/models/block/fluid_pipe/u_z.json +65a41f4b680af197776e03cae6f1815b6d04def2 assets/create/models/block/fluid_pipe/ud_x.json +26398801d89889ffe17b6513b786d27707f6a480 assets/create/models/block/fluid_pipe/ud_y.json +07747cc2b936e1b326bae7ac32a8a5ba77fdffa9 assets/create/models/block/fluid_pipe/ud_z.json 5f70af15ec2569c68a17d31024c7a37cb5c68c7e assets/create/models/block/framed_glass.json f0100e1d44146b256998fbd2af05da80d147e8d9 assets/create/models/block/framed_glass_pane_noside.json 4a032c6ae3f459e3349c2a2218da186170c31e03 assets/create/models/block/framed_glass_pane_noside_alt.json @@ -1269,9 +1269,6 @@ d1813d0f548fcddb361df7cc3b5d97582842b10f assets/create/models/block/light_gray_s debf78f20659bc3c637299a40b649cbe4aa30ebf assets/create/models/block/light_gray_table_cloth.json 4ec5d701dd8b2d8c3dc44d05f527a3d737002cd4 assets/create/models/block/light_gray_toolbox.json adb8dbed70419e0310e7a20f3656bf325b348434 assets/create/models/block/light_gray_valve_handle.json -8f53caad3899a30be5087a0ba155080834418cc0 assets/create/models/block/limestone.json -2b80f9421c2fe902d55d9bd95183ad4bae46c315 assets/create/models/block/limestone_pillar.json -fb18280a2a708f60b00cc7c675804c219784871a assets/create/models/block/limestone_pillar_horizontal.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/lime_nixie_tube.json 952d292d4dc2158e6106c5079cfa1ddb81c7777e assets/create/models/block/lime_postbox_closed.json 4357f5d9102d54c7fbe5325512a2cd42d94d6d42 assets/create/models/block/lime_postbox_open.json @@ -1280,6 +1277,9 @@ fb18280a2a708f60b00cc7c675804c219784871a assets/create/models/block/limestone_pi e4142a22c20d6e5b9a8b9f96c13d4e5f96adc59d assets/create/models/block/lime_table_cloth.json b92822a01e4fbed2463b1bdf7dcc736023988e20 assets/create/models/block/lime_toolbox.json 802b47f34b1053b7af980b08b6511f468e7dd7c1 assets/create/models/block/lime_valve_handle.json +8f53caad3899a30be5087a0ba155080834418cc0 assets/create/models/block/limestone.json +2b80f9421c2fe902d55d9bd95183ad4bae46c315 assets/create/models/block/limestone_pillar.json +fb18280a2a708f60b00cc7c675804c219784871a assets/create/models/block/limestone_pillar_horizontal.json 84b9ac6eafdbd037f3ff558c250a8b8952415af1 assets/create/models/block/linear_chassis.json 29ee936c09c1222c6a144e5bb39577b5a9cd28bf assets/create/models/block/linear_chassis_bottom.json a1a3804ddcb1db0a7b5c0693555f8eb326950dd0 assets/create/models/block/linear_chassis_top.json @@ -1325,18 +1325,18 @@ f9010894858512398bddd5d31b922e12594d2e3c assets/create/models/block/ornate_iron_ 92637fbd6bf54891411b32a494064b9a48e59411 assets/create/models/block/ornate_iron_window_pane_post.json 8416d497e7fc8ca4f9f4c608ccc0651036850256 assets/create/models/block/ornate_iron_window_pane_side.json 1cdaa9d4bd23f7b1eb14672dc9322d9dad966502 assets/create/models/block/ornate_iron_window_pane_side_alt.json -561beafce41b9e9c0b07bc6b7176dd4f6918c116 assets/create/models/block/oxidized_copper_shingles.json 7e0bab8109e322c6db5fe1d5999c06536c21c6eb assets/create/models/block/oxidized_copper_shingle_slab.json 42df32c4e2d1ffb2ee62748becfd1717118b440c assets/create/models/block/oxidized_copper_shingle_slab_top.json b55a733e3e68cfbd08d45bb9ac56deef9f728b60 assets/create/models/block/oxidized_copper_shingle_stairs.json 7b8745213af5aa7938fc04a295be6a087c72daa8 assets/create/models/block/oxidized_copper_shingle_stairs_inner.json d89419d48d6ee2f6747e7c93de8699db22ea3f59 assets/create/models/block/oxidized_copper_shingle_stairs_outer.json -5cf92b628ff1f832966138a58ed87d747681274c assets/create/models/block/oxidized_copper_tiles.json +561beafce41b9e9c0b07bc6b7176dd4f6918c116 assets/create/models/block/oxidized_copper_shingles.json ad6134598869711a12e2f95c9b5f25a0f7b8dd93 assets/create/models/block/oxidized_copper_tile_slab.json c17bac0fd6a20540813c6a1c000a553b7c5ac849 assets/create/models/block/oxidized_copper_tile_slab_top.json d5b30340364f5536e46bc67e777ef4fa20a36e04 assets/create/models/block/oxidized_copper_tile_stairs.json b40b315c23cbd3eb4658518bfac836f6091321a5 assets/create/models/block/oxidized_copper_tile_stairs_inner.json f4eaadab29b4f2e915237340e2d6f4aad4ba21d6 assets/create/models/block/oxidized_copper_tile_stairs_outer.json +5cf92b628ff1f832966138a58ed87d747681274c assets/create/models/block/oxidized_copper_tiles.json f8b51eec36c2eddc08a1b60894d863bb58f55625 assets/create/models/block/peculiar_bell_ceiling.json f70f83cfec770879c478eea3760ea187700f2878 assets/create/models/block/peculiar_bell_double_wall.json b9c9d00b844ca2f217ae21cc502cd4d082fed2d5 assets/create/models/block/peculiar_bell_floor.json @@ -1543,133 +1543,133 @@ ff52eb59dadfe675e416440f3115856a501428a6 assets/create/models/block/scoria.json 4d7d36f974d25a310db2f75800e8c7e0377881c6 assets/create/models/block/secondary_linear_chassis_top.json 5ecb821ac06873015d2d7ebcfb7e1f5fe85cf504 assets/create/models/block/secondary_linear_chassis_top_bottom.json e697898a0ec4c308314a4e0b7235fa0a9229da45 assets/create/models/block/shadow_steel_casing.json -73edb947b52c73e85a83422853d0b8a0fb34e82b assets/create/models/block/small_andesite_bricks.json -3bb5c8413b9e81a1adc339f873f37eb656904e06 assets/create/models/block/small_andesite_bricks_wall_post.json -0e70d94fc6ffdc0fd4a50a5910bc1455b401982f assets/create/models/block/small_andesite_bricks_wall_side.json -597fec784e40c1ff3b622824c32773d6d271f3b7 assets/create/models/block/small_andesite_bricks_wall_side_tall.json 593b962350c8de53156901b308617c6a246afa09 assets/create/models/block/small_andesite_brick_slab.json c83de8118653ccdce92a1b7f3501bf7359e0b310 assets/create/models/block/small_andesite_brick_slab_top.json f019380bcc81d52681e2beaf63e2b11836c45922 assets/create/models/block/small_andesite_brick_stairs.json 4fa72fe0115ad9ec83837852a2b2e2d22dde19ca assets/create/models/block/small_andesite_brick_stairs_inner.json f80f485f62dce86e98815b343c89e96b10623e53 assets/create/models/block/small_andesite_brick_stairs_outer.json -4750724972cbac6d7dac31e0689681eab6c37093 assets/create/models/block/small_asurine_bricks.json -407c7bea509bb0e9bf9f04e947ace584103d012d assets/create/models/block/small_asurine_bricks_wall_post.json -60491dfb4f2a6b78effdf18612b9a1cd7d930d8a assets/create/models/block/small_asurine_bricks_wall_side.json -e5d3172c08b65696a6d72220495463636d8b352c assets/create/models/block/small_asurine_bricks_wall_side_tall.json +73edb947b52c73e85a83422853d0b8a0fb34e82b assets/create/models/block/small_andesite_bricks.json +3bb5c8413b9e81a1adc339f873f37eb656904e06 assets/create/models/block/small_andesite_bricks_wall_post.json +0e70d94fc6ffdc0fd4a50a5910bc1455b401982f assets/create/models/block/small_andesite_bricks_wall_side.json +597fec784e40c1ff3b622824c32773d6d271f3b7 assets/create/models/block/small_andesite_bricks_wall_side_tall.json cdd354726eda82d83dc89871fa587b8c07b02a16 assets/create/models/block/small_asurine_brick_slab.json 7bdb6ed1e74437d083bca7d89c0d1b7c81e80b53 assets/create/models/block/small_asurine_brick_slab_top.json 086b9d4284d343967a582fd0a7d194bafd980e13 assets/create/models/block/small_asurine_brick_stairs.json db69f1580ca405b9a99f0e4ea8d9b9950ed6444e assets/create/models/block/small_asurine_brick_stairs_inner.json dd572cbff713b0f4830aef0bf3ba4adb80ee9908 assets/create/models/block/small_asurine_brick_stairs_outer.json -c2c72734ac526c319cb01e982824680bfb5f1186 assets/create/models/block/small_calcite_bricks.json -f17f2ecd5e5a32f92ec0ad0ba9e861a80432c0f2 assets/create/models/block/small_calcite_bricks_wall_post.json -1ad7654125aff67267567c0007cc03b8a15131b0 assets/create/models/block/small_calcite_bricks_wall_side.json -10c339f64c0e78f4fbb7a95c10bf7f9f399c0c6b assets/create/models/block/small_calcite_bricks_wall_side_tall.json +4750724972cbac6d7dac31e0689681eab6c37093 assets/create/models/block/small_asurine_bricks.json +407c7bea509bb0e9bf9f04e947ace584103d012d assets/create/models/block/small_asurine_bricks_wall_post.json +60491dfb4f2a6b78effdf18612b9a1cd7d930d8a assets/create/models/block/small_asurine_bricks_wall_side.json +e5d3172c08b65696a6d72220495463636d8b352c assets/create/models/block/small_asurine_bricks_wall_side_tall.json d07c57748981a54ffcdadc30ec21f728a3557bea assets/create/models/block/small_calcite_brick_slab.json 9a5e6a93328ad35b256b2512c28e683a74e807a9 assets/create/models/block/small_calcite_brick_slab_top.json c3d39e013dd0142f044f8f0a90de849a0d961e84 assets/create/models/block/small_calcite_brick_stairs.json 4e47a4708dafc0ea476e2d5b6567acfdc2c5c148 assets/create/models/block/small_calcite_brick_stairs_inner.json 6a41c44680a958299a787d8c8c8778d52167cd65 assets/create/models/block/small_calcite_brick_stairs_outer.json -485f6c0e37b24124ff23efa3f0caa2cfe85663dd assets/create/models/block/small_crimsite_bricks.json -57b050751e68c9a881d9598cfe8dfb45f19df08c assets/create/models/block/small_crimsite_bricks_wall_post.json -cb01f90c7ac1f56a6f79e1fecb126c349b6d53b0 assets/create/models/block/small_crimsite_bricks_wall_side.json -80932617b1d4b718071c1f8558398ba881743892 assets/create/models/block/small_crimsite_bricks_wall_side_tall.json +c2c72734ac526c319cb01e982824680bfb5f1186 assets/create/models/block/small_calcite_bricks.json +f17f2ecd5e5a32f92ec0ad0ba9e861a80432c0f2 assets/create/models/block/small_calcite_bricks_wall_post.json +1ad7654125aff67267567c0007cc03b8a15131b0 assets/create/models/block/small_calcite_bricks_wall_side.json +10c339f64c0e78f4fbb7a95c10bf7f9f399c0c6b assets/create/models/block/small_calcite_bricks_wall_side_tall.json 827867ddd9b5f6e2daa916c968531c7183ce7fa2 assets/create/models/block/small_crimsite_brick_slab.json dd19ebdbd1a2de827d467b0abd2d1d3ee5822305 assets/create/models/block/small_crimsite_brick_slab_top.json 58048cb41b740b008a98420ea93b567f38e2910f assets/create/models/block/small_crimsite_brick_stairs.json a943586885ea7d48fc27595d9741f97d852446e7 assets/create/models/block/small_crimsite_brick_stairs_inner.json 8dc173b8a9912341ccb9cd8c9a0d2d893571eb85 assets/create/models/block/small_crimsite_brick_stairs_outer.json -cd855b25c38be2c36dcbf6ab0d963a2c76043171 assets/create/models/block/small_deepslate_bricks.json -88a6c43f64c6d53b34719f41707622635108342b assets/create/models/block/small_deepslate_bricks_wall_post.json -dea1773ca9baf9e1a6a7a4288d348127b858c42d assets/create/models/block/small_deepslate_bricks_wall_side.json -673ab543b38a597fd74285cd25b8004c9e2bd706 assets/create/models/block/small_deepslate_bricks_wall_side_tall.json +485f6c0e37b24124ff23efa3f0caa2cfe85663dd assets/create/models/block/small_crimsite_bricks.json +57b050751e68c9a881d9598cfe8dfb45f19df08c assets/create/models/block/small_crimsite_bricks_wall_post.json +cb01f90c7ac1f56a6f79e1fecb126c349b6d53b0 assets/create/models/block/small_crimsite_bricks_wall_side.json +80932617b1d4b718071c1f8558398ba881743892 assets/create/models/block/small_crimsite_bricks_wall_side_tall.json 67c78a3e9250351d0ea18538640b596f05e957a4 assets/create/models/block/small_deepslate_brick_slab.json bc1af783fbcbe73df05e12c93625035db8089d16 assets/create/models/block/small_deepslate_brick_slab_top.json 91e00675337592d17a04032808ca64c4a159c814 assets/create/models/block/small_deepslate_brick_stairs.json 39e78262242637628628a07dc47908fb1593d3f2 assets/create/models/block/small_deepslate_brick_stairs_inner.json d7a61bc4c84070e0fd53e0957a5282078daff7f1 assets/create/models/block/small_deepslate_brick_stairs_outer.json -73e801fb607d76b42e1862323e9d149910a68298 assets/create/models/block/small_diorite_bricks.json -2bdb593d3ae4d856e96cc877f4927da25841af54 assets/create/models/block/small_diorite_bricks_wall_post.json -dd064be7962a2418784a513725fc7b5835e4ab40 assets/create/models/block/small_diorite_bricks_wall_side.json -3753c64785d74f1997b9f8f856fa873302621f39 assets/create/models/block/small_diorite_bricks_wall_side_tall.json +cd855b25c38be2c36dcbf6ab0d963a2c76043171 assets/create/models/block/small_deepslate_bricks.json +88a6c43f64c6d53b34719f41707622635108342b assets/create/models/block/small_deepslate_bricks_wall_post.json +dea1773ca9baf9e1a6a7a4288d348127b858c42d assets/create/models/block/small_deepslate_bricks_wall_side.json +673ab543b38a597fd74285cd25b8004c9e2bd706 assets/create/models/block/small_deepslate_bricks_wall_side_tall.json 59fc1d9dac0b6867779346413953174fc6b55d3c assets/create/models/block/small_diorite_brick_slab.json cbd6fe711e1203aa746d86d12bb85016b7142749 assets/create/models/block/small_diorite_brick_slab_top.json a6c823fa96ba8a06d101ca96a6898fe8a1faf83e assets/create/models/block/small_diorite_brick_stairs.json 7f128501d989122df9d2ab002a497356831caa1c assets/create/models/block/small_diorite_brick_stairs_inner.json 26222975b0efb2acea6473d0bcc99453aa9ed561 assets/create/models/block/small_diorite_brick_stairs_outer.json -7f55f9c8cae6a79a9ab22a4b593a2c5829390573 assets/create/models/block/small_dripstone_bricks.json -fd0880b2e55435c8dc6945fa71c67ba34d7b1e69 assets/create/models/block/small_dripstone_bricks_wall_post.json -c00e9c0bfb108b70975514694f38d3c4cd63e819 assets/create/models/block/small_dripstone_bricks_wall_side.json -26382c01766e04cfe7ea585cabc1baa1c409e0a0 assets/create/models/block/small_dripstone_bricks_wall_side_tall.json +73e801fb607d76b42e1862323e9d149910a68298 assets/create/models/block/small_diorite_bricks.json +2bdb593d3ae4d856e96cc877f4927da25841af54 assets/create/models/block/small_diorite_bricks_wall_post.json +dd064be7962a2418784a513725fc7b5835e4ab40 assets/create/models/block/small_diorite_bricks_wall_side.json +3753c64785d74f1997b9f8f856fa873302621f39 assets/create/models/block/small_diorite_bricks_wall_side_tall.json 7b18bb56d4509f490a73b2812a8e40333f400369 assets/create/models/block/small_dripstone_brick_slab.json 39b7aa7d1494e5328e8774acb8adec8a346e972f assets/create/models/block/small_dripstone_brick_slab_top.json 3d265aed7a723713d525d0fabf3a70600d9d60e4 assets/create/models/block/small_dripstone_brick_stairs.json 2be41e9c1367af7f0eb99856e35900df96974bd4 assets/create/models/block/small_dripstone_brick_stairs_inner.json 4026a9327d47d55218b00b0b4b92464b6448ad91 assets/create/models/block/small_dripstone_brick_stairs_outer.json -ad4cf29e0e67d0d202d5836486531551909c71bf assets/create/models/block/small_granite_bricks.json -d20963cbb5d2321a069bf42d203855a5584f8607 assets/create/models/block/small_granite_bricks_wall_post.json -b860879b66d2d23349fa95ff644d9eba21eb29bd assets/create/models/block/small_granite_bricks_wall_side.json -11593a2a0e307b3e1d847c84d8c61bc78fef2967 assets/create/models/block/small_granite_bricks_wall_side_tall.json +7f55f9c8cae6a79a9ab22a4b593a2c5829390573 assets/create/models/block/small_dripstone_bricks.json +fd0880b2e55435c8dc6945fa71c67ba34d7b1e69 assets/create/models/block/small_dripstone_bricks_wall_post.json +c00e9c0bfb108b70975514694f38d3c4cd63e819 assets/create/models/block/small_dripstone_bricks_wall_side.json +26382c01766e04cfe7ea585cabc1baa1c409e0a0 assets/create/models/block/small_dripstone_bricks_wall_side_tall.json cb0a72cedb6b2b043eaf8c8869648802d74a2eeb assets/create/models/block/small_granite_brick_slab.json d635840492541787d55cc005c7e207532edcdef3 assets/create/models/block/small_granite_brick_slab_top.json ba9bfedf5854fccaba8a5e60c26efb6e34ede3cd assets/create/models/block/small_granite_brick_stairs.json 9bebe59176e74926e28a139dc557c25283285e89 assets/create/models/block/small_granite_brick_stairs_inner.json 15d71900e76c131285447628e63bf1479ce7025a assets/create/models/block/small_granite_brick_stairs_outer.json -6224f2763224d3e746dafdaaf14fae68e2469b93 assets/create/models/block/small_limestone_bricks.json -ca038e240e4157897a6273692db2c952ab5b17d7 assets/create/models/block/small_limestone_bricks_wall_post.json -7920f8cfda77b22d4d29638faa6ae07d89e51ab3 assets/create/models/block/small_limestone_bricks_wall_side.json -6e1fa27744f4592111945e5cafee6d7d67b5299b assets/create/models/block/small_limestone_bricks_wall_side_tall.json +ad4cf29e0e67d0d202d5836486531551909c71bf assets/create/models/block/small_granite_bricks.json +d20963cbb5d2321a069bf42d203855a5584f8607 assets/create/models/block/small_granite_bricks_wall_post.json +b860879b66d2d23349fa95ff644d9eba21eb29bd assets/create/models/block/small_granite_bricks_wall_side.json +11593a2a0e307b3e1d847c84d8c61bc78fef2967 assets/create/models/block/small_granite_bricks_wall_side_tall.json 0e0f551bac87421e6b693aa9ca98fd5da2ee168b assets/create/models/block/small_limestone_brick_slab.json 6669c1e87ed79097f96e7e46eecf3ab6e7c9778c assets/create/models/block/small_limestone_brick_slab_top.json 5aff0145d2fc89549ac541db325dda25b8941583 assets/create/models/block/small_limestone_brick_stairs.json 250aa2c237a9532b19621fa604027433183961c3 assets/create/models/block/small_limestone_brick_stairs_inner.json 92da57d330e9905d017705dd931af1d1d6c1a00d assets/create/models/block/small_limestone_brick_stairs_outer.json -242e4f39f6df26917f21899f0c7d0415a166d4b9 assets/create/models/block/small_ochrum_bricks.json -06cb9faca0062947c08b2a7309a958aac5ab24ac assets/create/models/block/small_ochrum_bricks_wall_post.json -8d9d53206e222839333026c779b66b9fd8cf2cf9 assets/create/models/block/small_ochrum_bricks_wall_side.json -f412fbaa509f7b2d47a27d4bcb13590bfcae74ca assets/create/models/block/small_ochrum_bricks_wall_side_tall.json +6224f2763224d3e746dafdaaf14fae68e2469b93 assets/create/models/block/small_limestone_bricks.json +ca038e240e4157897a6273692db2c952ab5b17d7 assets/create/models/block/small_limestone_bricks_wall_post.json +7920f8cfda77b22d4d29638faa6ae07d89e51ab3 assets/create/models/block/small_limestone_bricks_wall_side.json +6e1fa27744f4592111945e5cafee6d7d67b5299b assets/create/models/block/small_limestone_bricks_wall_side_tall.json 517e3605a9e86a07c673e18d94c2c37109a2aef5 assets/create/models/block/small_ochrum_brick_slab.json 855ad9f6fe03ceb2cc33d9df3536cb4394acfa9b assets/create/models/block/small_ochrum_brick_slab_top.json c5fc35d6b0fe96c11537bc10d34a63ef80f3270c assets/create/models/block/small_ochrum_brick_stairs.json 9a2631d9f6821d2c01bc8b2588a69702d3b083cc assets/create/models/block/small_ochrum_brick_stairs_inner.json 1f0ccdef29dae18535ea304e954e06c91bb0620b assets/create/models/block/small_ochrum_brick_stairs_outer.json +242e4f39f6df26917f21899f0c7d0415a166d4b9 assets/create/models/block/small_ochrum_bricks.json +06cb9faca0062947c08b2a7309a958aac5ab24ac assets/create/models/block/small_ochrum_bricks_wall_post.json +8d9d53206e222839333026c779b66b9fd8cf2cf9 assets/create/models/block/small_ochrum_bricks_wall_side.json +f412fbaa509f7b2d47a27d4bcb13590bfcae74ca assets/create/models/block/small_ochrum_bricks_wall_side_tall.json be96f070be1f838c6fb442c164b5f9b4e5cfcee5 assets/create/models/block/small_rose_quartz_tiles.json -41e56d8e334b81a0d5270bdbe87617981e1f98b4 assets/create/models/block/small_scorchia_bricks.json -56aa81e05019533ce0e0f1ee3ef7bf20fcc400b4 assets/create/models/block/small_scorchia_bricks_wall_post.json -1e1fa90c8b144813770c4d53a3b734ae450895d6 assets/create/models/block/small_scorchia_bricks_wall_side.json -6a46cf73c03a2abea25a81dbb28f4150b355900c assets/create/models/block/small_scorchia_bricks_wall_side_tall.json 6aa3825ace2e73bec454aaa8597e3a892ee29eb7 assets/create/models/block/small_scorchia_brick_slab.json f0378625001171c449a403e372e59623f0fc6569 assets/create/models/block/small_scorchia_brick_slab_top.json 49fa4a3940f84902319df257d39812eb71c8a9e2 assets/create/models/block/small_scorchia_brick_stairs.json 4dee6e6dbe6a98a8eaa04f6812f322343f62fca1 assets/create/models/block/small_scorchia_brick_stairs_inner.json 8a19e7e5c03c155c9ef9332486ae0b069dea0502 assets/create/models/block/small_scorchia_brick_stairs_outer.json -6b435123d852579ba8467c4915cd5d0adaadeca0 assets/create/models/block/small_scoria_bricks.json -86b243074845ca66916ce96ef3774862cf9a39d4 assets/create/models/block/small_scoria_bricks_wall_post.json -57ccb3efbdc4a69cad60c8b90321338ba2e68321 assets/create/models/block/small_scoria_bricks_wall_side.json -d4c5398e10b25d2dc3cb3754a449fc2b60e4074f assets/create/models/block/small_scoria_bricks_wall_side_tall.json +41e56d8e334b81a0d5270bdbe87617981e1f98b4 assets/create/models/block/small_scorchia_bricks.json +56aa81e05019533ce0e0f1ee3ef7bf20fcc400b4 assets/create/models/block/small_scorchia_bricks_wall_post.json +1e1fa90c8b144813770c4d53a3b734ae450895d6 assets/create/models/block/small_scorchia_bricks_wall_side.json +6a46cf73c03a2abea25a81dbb28f4150b355900c assets/create/models/block/small_scorchia_bricks_wall_side_tall.json 918351c1270c26932c0c4783543779a25ca7e986 assets/create/models/block/small_scoria_brick_slab.json 4138e756b4b36f227e178acbcc233edb082ae603 assets/create/models/block/small_scoria_brick_slab_top.json b8e70cd7d9acdcf91be9783cd91d70275a006ea2 assets/create/models/block/small_scoria_brick_stairs.json 625bfbd58440ea4e270d57cc748f2b5f6cece63b assets/create/models/block/small_scoria_brick_stairs_inner.json 602a46fb2736acb8c50b0d04222e6c33e52dee87 assets/create/models/block/small_scoria_brick_stairs_outer.json -a8e8c633dfb6d9f14425b1fd28e88ecf08a88cc6 assets/create/models/block/small_tuff_bricks.json -1c3a22bed504cd7a7e507e83ee21399f8a3fb299 assets/create/models/block/small_tuff_bricks_wall_post.json -1aeb8cac7d0178a18ac1cf98c9a45ca8e67514b0 assets/create/models/block/small_tuff_bricks_wall_side.json -4c6b5c7c60ec4cad314064b171413a3e866e5f99 assets/create/models/block/small_tuff_bricks_wall_side_tall.json +6b435123d852579ba8467c4915cd5d0adaadeca0 assets/create/models/block/small_scoria_bricks.json +86b243074845ca66916ce96ef3774862cf9a39d4 assets/create/models/block/small_scoria_bricks_wall_post.json +57ccb3efbdc4a69cad60c8b90321338ba2e68321 assets/create/models/block/small_scoria_bricks_wall_side.json +d4c5398e10b25d2dc3cb3754a449fc2b60e4074f assets/create/models/block/small_scoria_bricks_wall_side_tall.json 6b2c4d8c8609de0d3d6ce1e30b1dd26ba59cb86d assets/create/models/block/small_tuff_brick_slab.json 1ba07367fcba6a3914f1703115304a7c19979542 assets/create/models/block/small_tuff_brick_slab_top.json 1a5ab239d0f2f041ee04005ceb60111e6848f5de assets/create/models/block/small_tuff_brick_stairs.json be3ee2c36f85a534a71d42a7d63a7816945b3c30 assets/create/models/block/small_tuff_brick_stairs_inner.json aa84e448041d5f74c75565f5e409b1e9b7e5155d assets/create/models/block/small_tuff_brick_stairs_outer.json -e9c75f1b4b663dce09b0a2f8282e574839c19d06 assets/create/models/block/small_veridium_bricks.json -725f6d3dbcfb469cede6fb27a98c1f398f3f3c8c assets/create/models/block/small_veridium_bricks_wall_post.json -b33ee496d43e315a5bed5eaabfd553e361fec1a9 assets/create/models/block/small_veridium_bricks_wall_side.json -80e950f93def51d82a63848b1fb6ac11600ab1bf assets/create/models/block/small_veridium_bricks_wall_side_tall.json +a8e8c633dfb6d9f14425b1fd28e88ecf08a88cc6 assets/create/models/block/small_tuff_bricks.json +1c3a22bed504cd7a7e507e83ee21399f8a3fb299 assets/create/models/block/small_tuff_bricks_wall_post.json +1aeb8cac7d0178a18ac1cf98c9a45ca8e67514b0 assets/create/models/block/small_tuff_bricks_wall_side.json +4c6b5c7c60ec4cad314064b171413a3e866e5f99 assets/create/models/block/small_tuff_bricks_wall_side_tall.json 30b150fe3cf9bdb6ee32cd6b0f51179b44be57d3 assets/create/models/block/small_veridium_brick_slab.json 2158dd9e71f6f60e5132105c68a41ad6e3927438 assets/create/models/block/small_veridium_brick_slab_top.json bbbfc8e3696945ed1f6c3afe73ae0745ff8deda1 assets/create/models/block/small_veridium_brick_stairs.json fc3a996b0ca01c2c09ad84b881c46e92918d084f assets/create/models/block/small_veridium_brick_stairs_inner.json e27a77984e8e28e6032f26bb010efcadfaeb5407 assets/create/models/block/small_veridium_brick_stairs_outer.json +e9c75f1b4b663dce09b0a2f8282e574839c19d06 assets/create/models/block/small_veridium_bricks.json +725f6d3dbcfb469cede6fb27a98c1f398f3f3c8c assets/create/models/block/small_veridium_bricks_wall_post.json +b33ee496d43e315a5bed5eaabfd553e361fec1a9 assets/create/models/block/small_veridium_bricks_wall_side.json +80e950f93def51d82a63848b1fb6ac11600ab1bf assets/create/models/block/small_veridium_bricks_wall_side_tall.json d7c1c2679c8ba543ae7be3b9cf3f4eea3c1a2f68 assets/create/models/block/spruce_window.json f4a4fbb9eea6fb1d0633e349eae6acdaf329e8d5 assets/create/models/block/spruce_window_pane_noside.json 02a25202a42debcd2b4aaa4113e3de4f8f6ee47c assets/create/models/block/spruce_window_pane_noside_alt.json @@ -1736,66 +1736,66 @@ e84875a4eb11e2161a93ec7569aa2ac1c2f60cef assets/create/models/block/warped_windo 378c865ff8213ff56f1f7a4b2d9cf26c71f036e8 assets/create/models/block/warped_window_pane_post.json f320de08cb113a9ad17acd2ebb8dfc57759e4f7d assets/create/models/block/warped_window_pane_side.json 2fc182d9697b5cddd93b01d1236931af27eee8fe assets/create/models/block/warped_window_pane_side_alt.json -32fdb85b5b62d5a0fb41732874c854788cdd2ba1 assets/create/models/block/waxed_copper_shingles.json fb7fb6deebd502946ab57f1b8a9f4a6b5dd48da3 assets/create/models/block/waxed_copper_shingle_slab.json 660f61112b8e46dec5050cb0ed4ee936965a7c58 assets/create/models/block/waxed_copper_shingle_slab_top.json 5d74be967bbe9feba4b630751f13af817a733d1d assets/create/models/block/waxed_copper_shingle_stairs.json 35cb89f29ce3f8d8af13602c08ecd7afbb7cf56a assets/create/models/block/waxed_copper_shingle_stairs_inner.json fcb9295f4f388e6d439ec9a3906ca326b6d69077 assets/create/models/block/waxed_copper_shingle_stairs_outer.json -32f06f39d0b34e4431795aa6e64f87e58dc1597b assets/create/models/block/waxed_copper_tiles.json +32fdb85b5b62d5a0fb41732874c854788cdd2ba1 assets/create/models/block/waxed_copper_shingles.json 298c6100de02ed9f813397d8ba38c46f35035c69 assets/create/models/block/waxed_copper_tile_slab.json d4422c2d96fb329087d1be70d8b983a8cf6c7f01 assets/create/models/block/waxed_copper_tile_slab_top.json fca72048f916d3a3e567b385c948cc1b59711ef4 assets/create/models/block/waxed_copper_tile_stairs.json 997479b62ed3d81ab633279ecc2fabd9588a3bf3 assets/create/models/block/waxed_copper_tile_stairs_inner.json d5c5bbfb9aaa282e11ad6e6309b1880b172ee653 assets/create/models/block/waxed_copper_tile_stairs_outer.json -19a773f91c58c49301f35965bac02d0c05fb2764 assets/create/models/block/waxed_exposed_copper_shingles.json +32f06f39d0b34e4431795aa6e64f87e58dc1597b assets/create/models/block/waxed_copper_tiles.json a3420b91fdebec40e508a5eebb145c0201bd80c8 assets/create/models/block/waxed_exposed_copper_shingle_slab.json 4178ea5e50ee17b3c15f4a59efd019c4a19bb892 assets/create/models/block/waxed_exposed_copper_shingle_slab_top.json dd2d747774abc86e428a883e299db66cded78e11 assets/create/models/block/waxed_exposed_copper_shingle_stairs.json b6845da62d96a33cee624bb70360e256b26eda83 assets/create/models/block/waxed_exposed_copper_shingle_stairs_inner.json 3d8b758e50e75c5adc26ab6f39f9d73f00866673 assets/create/models/block/waxed_exposed_copper_shingle_stairs_outer.json -9cb20c9d41629d8b9426cb65829365d10966338f assets/create/models/block/waxed_exposed_copper_tiles.json +19a773f91c58c49301f35965bac02d0c05fb2764 assets/create/models/block/waxed_exposed_copper_shingles.json cd21d9d2935b6d0103502e2731c11ea27ff64ecf assets/create/models/block/waxed_exposed_copper_tile_slab.json 0ec039ba59fb0028183433e52131ff355ace5bff assets/create/models/block/waxed_exposed_copper_tile_slab_top.json c51dbd34996ac4513234800e427ac308067d5e1d assets/create/models/block/waxed_exposed_copper_tile_stairs.json 68772d4352dc7ade995dfa57ba41a38ef819e855 assets/create/models/block/waxed_exposed_copper_tile_stairs_inner.json d932671822ba93b71a9c8b50e7207803a1c4dbab assets/create/models/block/waxed_exposed_copper_tile_stairs_outer.json -561beafce41b9e9c0b07bc6b7176dd4f6918c116 assets/create/models/block/waxed_oxidized_copper_shingles.json +9cb20c9d41629d8b9426cb65829365d10966338f assets/create/models/block/waxed_exposed_copper_tiles.json 7e0bab8109e322c6db5fe1d5999c06536c21c6eb assets/create/models/block/waxed_oxidized_copper_shingle_slab.json 42df32c4e2d1ffb2ee62748becfd1717118b440c assets/create/models/block/waxed_oxidized_copper_shingle_slab_top.json b55a733e3e68cfbd08d45bb9ac56deef9f728b60 assets/create/models/block/waxed_oxidized_copper_shingle_stairs.json 7b8745213af5aa7938fc04a295be6a087c72daa8 assets/create/models/block/waxed_oxidized_copper_shingle_stairs_inner.json d89419d48d6ee2f6747e7c93de8699db22ea3f59 assets/create/models/block/waxed_oxidized_copper_shingle_stairs_outer.json -5cf92b628ff1f832966138a58ed87d747681274c assets/create/models/block/waxed_oxidized_copper_tiles.json +561beafce41b9e9c0b07bc6b7176dd4f6918c116 assets/create/models/block/waxed_oxidized_copper_shingles.json ad6134598869711a12e2f95c9b5f25a0f7b8dd93 assets/create/models/block/waxed_oxidized_copper_tile_slab.json c17bac0fd6a20540813c6a1c000a553b7c5ac849 assets/create/models/block/waxed_oxidized_copper_tile_slab_top.json d5b30340364f5536e46bc67e777ef4fa20a36e04 assets/create/models/block/waxed_oxidized_copper_tile_stairs.json b40b315c23cbd3eb4658518bfac836f6091321a5 assets/create/models/block/waxed_oxidized_copper_tile_stairs_inner.json f4eaadab29b4f2e915237340e2d6f4aad4ba21d6 assets/create/models/block/waxed_oxidized_copper_tile_stairs_outer.json -9c73020e80c31cd710c218f9699ba9a795758ad0 assets/create/models/block/waxed_weathered_copper_shingles.json +5cf92b628ff1f832966138a58ed87d747681274c assets/create/models/block/waxed_oxidized_copper_tiles.json 897cfc177b073ca1bcb635c74108567f8748b5c4 assets/create/models/block/waxed_weathered_copper_shingle_slab.json efa57ba131c27e0064c0d958e69b10530a26ac41 assets/create/models/block/waxed_weathered_copper_shingle_slab_top.json 4ef11a7e3de630ad46b9179e8a9a34d55202f6c5 assets/create/models/block/waxed_weathered_copper_shingle_stairs.json f32a18c76cfaca2153f6321880a8da1347be37ce assets/create/models/block/waxed_weathered_copper_shingle_stairs_inner.json 9637f78e51ca7ed812e4c64c52e08f6fa0adbfc3 assets/create/models/block/waxed_weathered_copper_shingle_stairs_outer.json -9782a25341dd2ffb146430edbe6916932250c326 assets/create/models/block/waxed_weathered_copper_tiles.json +9c73020e80c31cd710c218f9699ba9a795758ad0 assets/create/models/block/waxed_weathered_copper_shingles.json 0c9669588972d4c2152bd2b043b8386b76a6e1c4 assets/create/models/block/waxed_weathered_copper_tile_slab.json 2d01a583cc948e9e0cb814cad968ed16a07dd46c assets/create/models/block/waxed_weathered_copper_tile_slab_top.json e26dd64495ff8801593e9c22203cbf364075badd assets/create/models/block/waxed_weathered_copper_tile_stairs.json b658c1022587bd670b5acee267607719c1544332 assets/create/models/block/waxed_weathered_copper_tile_stairs_inner.json e7ae89577be9d26a071bf96cbd7ed80293902b63 assets/create/models/block/waxed_weathered_copper_tile_stairs_outer.json -9c73020e80c31cd710c218f9699ba9a795758ad0 assets/create/models/block/weathered_copper_shingles.json +9782a25341dd2ffb146430edbe6916932250c326 assets/create/models/block/waxed_weathered_copper_tiles.json 897cfc177b073ca1bcb635c74108567f8748b5c4 assets/create/models/block/weathered_copper_shingle_slab.json efa57ba131c27e0064c0d958e69b10530a26ac41 assets/create/models/block/weathered_copper_shingle_slab_top.json 4ef11a7e3de630ad46b9179e8a9a34d55202f6c5 assets/create/models/block/weathered_copper_shingle_stairs.json f32a18c76cfaca2153f6321880a8da1347be37ce assets/create/models/block/weathered_copper_shingle_stairs_inner.json 9637f78e51ca7ed812e4c64c52e08f6fa0adbfc3 assets/create/models/block/weathered_copper_shingle_stairs_outer.json -9782a25341dd2ffb146430edbe6916932250c326 assets/create/models/block/weathered_copper_tiles.json +9c73020e80c31cd710c218f9699ba9a795758ad0 assets/create/models/block/weathered_copper_shingles.json 0c9669588972d4c2152bd2b043b8386b76a6e1c4 assets/create/models/block/weathered_copper_tile_slab.json 2d01a583cc948e9e0cb814cad968ed16a07dd46c assets/create/models/block/weathered_copper_tile_slab_top.json e26dd64495ff8801593e9c22203cbf364075badd assets/create/models/block/weathered_copper_tile_stairs.json b658c1022587bd670b5acee267607719c1544332 assets/create/models/block/weathered_copper_tile_stairs_inner.json e7ae89577be9d26a071bf96cbd7ed80293902b63 assets/create/models/block/weathered_copper_tile_stairs_outer.json +9782a25341dd2ffb146430edbe6916932250c326 assets/create/models/block/weathered_copper_tiles.json 045b812ddb1ca8dd6cd9b49852ddbd37f86cd2a6 assets/create/models/block/weathered_iron_block.json a569ddd725898a86f8745e46723edeff7fe7f2e9 assets/create/models/block/weathered_iron_window_1.json 133928d853037efb81022b69377669f0b16239bc assets/create/models/block/weathered_iron_window_2.json @@ -1971,13 +1971,13 @@ de48f4b6fa26928ebc7d5d60e6a0767093430d65 assets/create/models/item/contraption_c ccdf08652511e5737a8489d86ea9422ade4f4ca5 assets/create/models/item/copper_nugget.json 86a770e9b2af1f19bf633f5cfeecd84848f73fbd assets/create/models/item/copper_scaffolding.json a4fd2f4f00e03b2ac5d863e93827d39a984cc2ff assets/create/models/item/copper_sheet.json -13b18ba2938e283d507fbca70518cf52198cdc71 assets/create/models/item/copper_shingles.json 79d9f8667965072f12e51e6601b5c36f8acc125f assets/create/models/item/copper_shingle_slab.json 9fe6f0bdea4595b403ed2d2cbc2023a9abeb79f0 assets/create/models/item/copper_shingle_stairs.json +13b18ba2938e283d507fbca70518cf52198cdc71 assets/create/models/item/copper_shingles.json 9a33eeb0f7c682ee2f8c0abbfa174f8828acc2b5 assets/create/models/item/copper_table_cloth.json -19642e4ea5deecaf57059827c4c13a19d2e73822 assets/create/models/item/copper_tiles.json a7147444fc28a4cce21b6cf38e9528537e27c352 assets/create/models/item/copper_tile_slab.json 7330324d6c64f0340d676ecef83a930515d9130e assets/create/models/item/copper_tile_stairs.json +19642e4ea5deecaf57059827c4c13a19d2e73822 assets/create/models/item/copper_tiles.json 08c35e85afe4eb2b106133c5d9c7d7c64ca9a915 assets/create/models/item/copper_valve_handle.json 5cec229a3117ea5987aa42288c070427ac48a5dc assets/create/models/item/copycat_panel.json 1b6707005830ca066a7e997c73391ca88c70bdb0 assets/create/models/item/copycat_step.json @@ -2007,114 +2007,114 @@ b6acd86be9e6cac8b9ed2bc6297d27941ca05f46 assets/create/models/item/crushed_raw_z b67e95801010eab58de02f2b0160bff3f008bd18 assets/create/models/item/crushing_wheel.json af189b0c04482064520d84546d81af8154824292 assets/create/models/item/cuckoo_clock.json 314fb287c7b16a6478fbefde0da80de8828b684e assets/create/models/item/cut_andesite.json -e2840073eac2e6419cd312b3d0177d4c64a5346c assets/create/models/item/cut_andesite_bricks.json 680fe77d50f7c3253ec4997f74761f962b784e15 assets/create/models/item/cut_andesite_brick_slab.json 3c1d56f9686bb2b97c168b0509ddfd06e80be9a0 assets/create/models/item/cut_andesite_brick_stairs.json 4222b965f8a18f78b92838e4642a28fa3e0ad648 assets/create/models/item/cut_andesite_brick_wall.json +e2840073eac2e6419cd312b3d0177d4c64a5346c assets/create/models/item/cut_andesite_bricks.json c100e02ef9b05f4f6df3ddbbfe91db1032d4854b assets/create/models/item/cut_andesite_slab.json f435a67b3d89d12b6e8cb5071a67e35f0918dc79 assets/create/models/item/cut_andesite_stairs.json df9084d532a085220280bc7bee579e1079fbf786 assets/create/models/item/cut_andesite_wall.json 025eedca45b222b91d93b9a3a89fac5ad328b152 assets/create/models/item/cut_asurine.json -1ceb483f428448f00a08541fbcf4f4787aef3f1e assets/create/models/item/cut_asurine_bricks.json 022c56e7aafa7ca4cdd1a88426eb43f9e02c3cc2 assets/create/models/item/cut_asurine_brick_slab.json 3131e09a221c2f0a17cfc7277603f2e3c8164bc7 assets/create/models/item/cut_asurine_brick_stairs.json dc1f5f03acc1165606c48df97953164f6bd7f092 assets/create/models/item/cut_asurine_brick_wall.json +1ceb483f428448f00a08541fbcf4f4787aef3f1e assets/create/models/item/cut_asurine_bricks.json e81d7df1f1b8281c38400713b09cbac59c4d53cc assets/create/models/item/cut_asurine_slab.json cf534603fe71423e0ab80d431ab12394d0a6bb21 assets/create/models/item/cut_asurine_stairs.json 7ca803f5a7798ea034db6385a5f36a48e235c247 assets/create/models/item/cut_asurine_wall.json 707fb799ca44280cad0b817f29a7c75dd0f0ce5e assets/create/models/item/cut_calcite.json -5678b9f76823efac2c6624acc7b2b911402112f4 assets/create/models/item/cut_calcite_bricks.json f794423b242228c43345dc1f40653133fb7f3db6 assets/create/models/item/cut_calcite_brick_slab.json 8e9b46e52758ec7f21c3b84c212e2f6565bf71d9 assets/create/models/item/cut_calcite_brick_stairs.json 1447d21b7fc331528bfd15e5b9d694eb1a31cfb3 assets/create/models/item/cut_calcite_brick_wall.json +5678b9f76823efac2c6624acc7b2b911402112f4 assets/create/models/item/cut_calcite_bricks.json c78c99c78a19097d890414b21270014b52bafd8d assets/create/models/item/cut_calcite_slab.json e6a9144a4bb9e5af3f57d0acdb26d66dc4547217 assets/create/models/item/cut_calcite_stairs.json daf2a2513f6636d140c23b90ba87aad35476c498 assets/create/models/item/cut_calcite_wall.json 29f2bc72aa50cdf34d1d5bfd01a4512d5974dc65 assets/create/models/item/cut_crimsite.json -20bc810ca5b2a35a423e57f287e2f42ad9940b89 assets/create/models/item/cut_crimsite_bricks.json 7c37d3de9674e70595498d1c46c5693d9f39a502 assets/create/models/item/cut_crimsite_brick_slab.json b974c0f2f0e5119d9bac6a36946d4dfdd65b4b5f assets/create/models/item/cut_crimsite_brick_stairs.json c1289ddff572149b2171859689228615802dc825 assets/create/models/item/cut_crimsite_brick_wall.json +20bc810ca5b2a35a423e57f287e2f42ad9940b89 assets/create/models/item/cut_crimsite_bricks.json 8855eb44a68277668c77858715652d6851fa507f assets/create/models/item/cut_crimsite_slab.json 57101d3c2d570bc2c389c1e05e1354d79de70a0a assets/create/models/item/cut_crimsite_stairs.json a10cd65d675a05b9dfbdac67a2d9ca3b4381396a assets/create/models/item/cut_crimsite_wall.json a4ad900cf65136835c259c1e349781538d537a9c assets/create/models/item/cut_deepslate.json -81b10b5d159db4000f4f6569b83fc7e8f702f015 assets/create/models/item/cut_deepslate_bricks.json a63bbe474ca7d8ceafb6bfcb21a88841980fe8e6 assets/create/models/item/cut_deepslate_brick_slab.json 7c1ad49844eafbd87f8c69a077a8c18ccdd4a919 assets/create/models/item/cut_deepslate_brick_stairs.json 6a4ee2e810731e0702c1493237343a567cc736d6 assets/create/models/item/cut_deepslate_brick_wall.json +81b10b5d159db4000f4f6569b83fc7e8f702f015 assets/create/models/item/cut_deepslate_bricks.json ff0d08d1b59de36b016f7952d2bd72d8e1eb1293 assets/create/models/item/cut_deepslate_slab.json 627c806a6eba8b730682821deb31627d75683e88 assets/create/models/item/cut_deepslate_stairs.json 9bdb85a688b09eb34eb8024a6808406118f78133 assets/create/models/item/cut_deepslate_wall.json c33c48d71d98f4b8a84c7f0a4ee88918fed3e798 assets/create/models/item/cut_diorite.json -e8a697df63b0b5fa74dbc70e76b55718a2cc388f assets/create/models/item/cut_diorite_bricks.json 63bc297b782c40c513873b7f8fd8284abce01753 assets/create/models/item/cut_diorite_brick_slab.json f604d088c8c7c6d847795459231d0df8c73d95fb assets/create/models/item/cut_diorite_brick_stairs.json b06be3da6017aa7fbc38b8aecda0d30dae313c13 assets/create/models/item/cut_diorite_brick_wall.json +e8a697df63b0b5fa74dbc70e76b55718a2cc388f assets/create/models/item/cut_diorite_bricks.json 4650f375365caeb237947f6e933d174ebbfbc1e2 assets/create/models/item/cut_diorite_slab.json 933d14f51272b39fc13e94d58f3100469d7cbe06 assets/create/models/item/cut_diorite_stairs.json 0cc44bb9ad0ed3ff11bc6113d0a9e31e99b169b8 assets/create/models/item/cut_diorite_wall.json e2123180fd5312d1e67b3a030fcbc4b6f11aa8bf assets/create/models/item/cut_dripstone.json -4b5d7bbee5741b112e2cb354c5fe49c088fc9b2f assets/create/models/item/cut_dripstone_bricks.json a815b2a927853d6d82d8b69f862be3091c5c8caa assets/create/models/item/cut_dripstone_brick_slab.json b8cb1b04eb869a06ded04c4c3acac6e5a315ee78 assets/create/models/item/cut_dripstone_brick_stairs.json 87fafd603eb4ba41981cd9c9371ac4618909f94d assets/create/models/item/cut_dripstone_brick_wall.json +4b5d7bbee5741b112e2cb354c5fe49c088fc9b2f assets/create/models/item/cut_dripstone_bricks.json 756c801f6bba006fbfd3486e95ba870909ab2902 assets/create/models/item/cut_dripstone_slab.json c59d314e1b5cce1c3745ce164c2a094e17f7a003 assets/create/models/item/cut_dripstone_stairs.json 125b24d28a9957740855467440ad8508d21c24d7 assets/create/models/item/cut_dripstone_wall.json 2fbce0b481f7cf2cf4f0fd03c86ef743b7c30879 assets/create/models/item/cut_granite.json -d8860602cc52fac5a09354c56e78fdfd7d9cb6a9 assets/create/models/item/cut_granite_bricks.json 3584117ed8a69c3842fde1d6accfaaa2c72e44f4 assets/create/models/item/cut_granite_brick_slab.json c68d1c09b9091bc501279115be16f83508b88fed assets/create/models/item/cut_granite_brick_stairs.json 5a37b24319a8708e444902eae3596b68daaffd15 assets/create/models/item/cut_granite_brick_wall.json +d8860602cc52fac5a09354c56e78fdfd7d9cb6a9 assets/create/models/item/cut_granite_bricks.json c2f6603e8cbfc0cdf5e5ef10c6a4baef9c917b6d assets/create/models/item/cut_granite_slab.json 66f8e6d556446441e157427437e9563075e2d6ce assets/create/models/item/cut_granite_stairs.json fe06c8aeab9e4c8a145375af46cbdaed701baad4 assets/create/models/item/cut_granite_wall.json b5c3df9c28a14683a363769cad5d154af56b8da4 assets/create/models/item/cut_limestone.json -7d026353711a464400e69c7e86c9b9c6aa70bf6d assets/create/models/item/cut_limestone_bricks.json 2822ebe1d4211f240e31866759e25add5f0fb56d assets/create/models/item/cut_limestone_brick_slab.json 694dfb73585167011d8123d64f5896697594f4ce assets/create/models/item/cut_limestone_brick_stairs.json db8851d6a1b7604ca1ba7615e1f162f6f5220801 assets/create/models/item/cut_limestone_brick_wall.json +7d026353711a464400e69c7e86c9b9c6aa70bf6d assets/create/models/item/cut_limestone_bricks.json 75584aa5e06168d8866b022fcd72377351b774d9 assets/create/models/item/cut_limestone_slab.json 1df9a186a146e597b48da4c4461f1a98ecf3646a assets/create/models/item/cut_limestone_stairs.json b70ac5462ef4d0363332656aa7cb82919f679893 assets/create/models/item/cut_limestone_wall.json 92bc693db4e0ba6164cd35d4f5fa0982f3b8f796 assets/create/models/item/cut_ochrum.json -3e8e00c602b1fbce888e6fe22d9525f1c025129d assets/create/models/item/cut_ochrum_bricks.json 1edc47c279fadde74322d3fa89ef776bdd6fb354 assets/create/models/item/cut_ochrum_brick_slab.json 4678e2a97c73139b458cea657a55f74659bc36d5 assets/create/models/item/cut_ochrum_brick_stairs.json 85044ec7033cd4c6aa913c4c4bb6c0e3a4386023 assets/create/models/item/cut_ochrum_brick_wall.json +3e8e00c602b1fbce888e6fe22d9525f1c025129d assets/create/models/item/cut_ochrum_bricks.json e0e494fb7fa1767241507347318560335339a2a8 assets/create/models/item/cut_ochrum_slab.json de7c5917bcb14f398d39e3932bfe5e1967ed7a24 assets/create/models/item/cut_ochrum_stairs.json 5a8f8c84e95ee0ab97106a801a456282f5ac207c assets/create/models/item/cut_ochrum_wall.json 1631a807135cf993d9a81068c65e78face2f24e0 assets/create/models/item/cut_scorchia.json -5ecb9692e478e29d64aeb5867e8677671560755d assets/create/models/item/cut_scorchia_bricks.json ac3a29573ce099ac57f59d0a2f1cdc0a453e0621 assets/create/models/item/cut_scorchia_brick_slab.json d3a8a8e0e85aaaadccb18cdce33da54ae0e8a8d7 assets/create/models/item/cut_scorchia_brick_stairs.json 83be13f6cbd9a58e10869e4152066cf3b265f347 assets/create/models/item/cut_scorchia_brick_wall.json +5ecb9692e478e29d64aeb5867e8677671560755d assets/create/models/item/cut_scorchia_bricks.json 0fee2e7f8e80bbd33e4d928c8374e6dae65f0b1f assets/create/models/item/cut_scorchia_slab.json 88a6b3709bab76390ace6f641eac18d43c9d099f assets/create/models/item/cut_scorchia_stairs.json d733d43252bf27b6fb1d7e016dc77556c3d1eb71 assets/create/models/item/cut_scorchia_wall.json ce75fb80c38c94bf6bf631eeb756909decaaaab0 assets/create/models/item/cut_scoria.json -81aa0bd4ec878754043a107466dcd87d49b3697c assets/create/models/item/cut_scoria_bricks.json d78a5126aefdd4cd182f9ec0ddda64df00d0f01c assets/create/models/item/cut_scoria_brick_slab.json 661d49b996f9c97a333e7e39dd13a0476db6b142 assets/create/models/item/cut_scoria_brick_stairs.json 3be69c075b479ac53c6201d7d7224d399f8009b6 assets/create/models/item/cut_scoria_brick_wall.json +81aa0bd4ec878754043a107466dcd87d49b3697c assets/create/models/item/cut_scoria_bricks.json 824bedfbeec53ec8f539fe73c0a3c3d927a21aa4 assets/create/models/item/cut_scoria_slab.json 15560f1251f18d53fe1b71adc6be5060c4d8fb94 assets/create/models/item/cut_scoria_stairs.json e35ebcc4f7f7b94623af85b181d916e48fbbb5ed assets/create/models/item/cut_scoria_wall.json 71284d3d6dba230dbecd01eb015e0e65877b820d assets/create/models/item/cut_tuff.json -4de100799e290db3fd46923781a83e6a12654266 assets/create/models/item/cut_tuff_bricks.json 4c7d5fadb0b0eaecf2055a0cd279f9ec130b93d0 assets/create/models/item/cut_tuff_brick_slab.json 6f32b83c9f82424c0e2a2e0a8813eb44c2ac4527 assets/create/models/item/cut_tuff_brick_stairs.json 9088296b7677bddf16d670858a619d846a134ef6 assets/create/models/item/cut_tuff_brick_wall.json +4de100799e290db3fd46923781a83e6a12654266 assets/create/models/item/cut_tuff_bricks.json e9134027cc917e2e878456edb49bcfee382e73b1 assets/create/models/item/cut_tuff_slab.json 8235a34249197c100645b55ded5ff619a055d8a6 assets/create/models/item/cut_tuff_stairs.json a1626993eafa8d85dc950e17cbf78378ed64c7d2 assets/create/models/item/cut_tuff_wall.json a343c74f1e55426330df18f522e6d2a81276c499 assets/create/models/item/cut_veridium.json -3c3fd197f8e299ff90850e24c6507ea12f373123 assets/create/models/item/cut_veridium_bricks.json c1c5561ce31e237b7ea8f1adfb6a79e661b7f940 assets/create/models/item/cut_veridium_brick_slab.json f633006045ccfcdf486d7a240217229d6eed717e assets/create/models/item/cut_veridium_brick_stairs.json 8182109a002317dd8d2767b3828f8c44166a053f assets/create/models/item/cut_veridium_brick_wall.json +3c3fd197f8e299ff90850e24c6507ea12f373123 assets/create/models/item/cut_veridium_bricks.json 410b949304faa5856028f7c42ab762b7498ffd95 assets/create/models/item/cut_veridium_slab.json 62697c0922b11537914d2f4f84faa0b909ee518d assets/create/models/item/cut_veridium_stairs.json 3921d61a26d48d999cbb2f6645611e53ea71978b assets/create/models/item/cut_veridium_wall.json @@ -2144,12 +2144,12 @@ badd4326fac0b0a1590a2e9bce7c2cdd4e4562f3 assets/create/models/item/empty_schemat 7ec3ed4aaab72d76f6414447bbb3ad7887adf61f assets/create/models/item/encased_fan.json 3e1fdcc80fd68199b1890bcc830f78c48e7c0e43 assets/create/models/item/experience_block.json 9775e83414c0febb5c5b832437b0580e91bcbff3 assets/create/models/item/experience_nugget.json -87add851ae3271d733c9e6888865c288b6716f3b assets/create/models/item/exposed_copper_shingles.json 721c8ac46bf23abec2bbf4cff6dbfdf96cc569a6 assets/create/models/item/exposed_copper_shingle_slab.json 6e1c7fcd8da84dc2d49adb9802ce4fb431eddae1 assets/create/models/item/exposed_copper_shingle_stairs.json -fa7ffb172a43774cc07a2bb201e7010a2549001d assets/create/models/item/exposed_copper_tiles.json +87add851ae3271d733c9e6888865c288b6716f3b assets/create/models/item/exposed_copper_shingles.json a443633d90ef9ac2a866b69b2ecdfad1841dc3e1 assets/create/models/item/exposed_copper_tile_slab.json 9bb425a14635fc8b36a9a95f3d0c54e0b129b7b4 assets/create/models/item/exposed_copper_tile_stairs.json +fa7ffb172a43774cc07a2bb201e7010a2549001d assets/create/models/item/exposed_copper_tiles.json 8b64a93d9b6e33e3caa66adb7a0cc8c5cd473023 assets/create/models/item/extendo_grip.json 9114fa2e92ea4b7bf949b2e5a26290b0bade1af3 assets/create/models/item/factory_gauge.json dad31483f65baaf187e6553e3cd301c5d69e9db4 assets/create/models/item/filter.json @@ -2179,11 +2179,11 @@ b8d6d2d163e2ab5f654bbc4eda9ad63f8064d27c assets/create/models/item/gray_seat.jso 334fd81d5e6574220ee5815f1452b4f4aa7ad223 assets/create/models/item/green_table_cloth.json 561e0579101bf602b252c0b9a5eec468c89d0e40 assets/create/models/item/green_toolbox.json 7d3ddad087b4d2c6a32f97092533cbfb5de0cb3b assets/create/models/item/green_valve_handle.json -9e352162c8135773a4eca41871beea8f3ca650ae assets/create/models/item/handheld_worldshaper.json dac0331061c464e6d3e2070b232781c632840191 assets/create/models/item/hand_crank.json +9e352162c8135773a4eca41871beea8f3ca650ae assets/create/models/item/handheld_worldshaper.json 7bb435c53cbf935d80a28746125aebbd6263e45c assets/create/models/item/haunted_bell.json -81d67fb0e59f25762a412990884813c72d399d55 assets/create/models/item/honeyed_apple.json 2e97629313eab1a4ac4b38785dbe7ed45346e625 assets/create/models/item/honey_bucket.json +81d67fb0e59f25762a412990884813c72d399d55 assets/create/models/item/honeyed_apple.json 70185e640169d6253f06fb98f31b240f4807a53e assets/create/models/item/horizontal_framed_glass.json e623c9541adc0fa877c5615e3211f47886383f2d assets/create/models/item/horizontal_framed_glass_pane.json 58b6f4ec2af3a69ae7145fb25d73451b6e8a2834 assets/create/models/item/hose_pulley.json @@ -2224,13 +2224,13 @@ b56a28924b0b1b2530ebac7834e011700b09b966 assets/create/models/item/light_gray_po cc8834024208662cb100f7cd38a04637da3b6852 assets/create/models/item/light_gray_table_cloth.json c8513eb1c89652783e26d7dcfcf64afa97619bc8 assets/create/models/item/light_gray_toolbox.json 3774d23e76b5712e7004e333e0a770f2230c2998 assets/create/models/item/light_gray_valve_handle.json -8f53caad3899a30be5087a0ba155080834418cc0 assets/create/models/item/limestone.json -fba1e7d1cad39c89976b427db62544d80f47ad5d assets/create/models/item/limestone_pillar.json 26b8e1daf9cc4b206fb5f62904c7f1701ba93e67 assets/create/models/item/lime_postbox.json 32cd55a1c97a31a13ad106a457ec9925aa91f6d3 assets/create/models/item/lime_seat.json a0843c3731fa3c4d23bc2b91fd68410fcf1df149 assets/create/models/item/lime_table_cloth.json 931d187c11cb95a0eeae8f256187ef551b42007e assets/create/models/item/lime_toolbox.json d0f4148bdb0a905e68f54b5dfd829fd47e528fea assets/create/models/item/lime_valve_handle.json +8f53caad3899a30be5087a0ba155080834418cc0 assets/create/models/item/limestone.json +fba1e7d1cad39c89976b427db62544d80f47ad5d assets/create/models/item/limestone_pillar.json 1d30f9b525e8e9736b34a92f848e235c71fd6bd8 assets/create/models/item/linear_chassis.json 8f622f5f79446f6060d9e8815205fce919c8c829 assets/create/models/item/linked_controller.json 538e28af9013a43c258a659cbe67671991f3eee7 assets/create/models/item/magenta_postbox.json @@ -2275,15 +2275,15 @@ af50363d603d61340b336569d58c1febde253665 assets/create/models/item/ochrum.json 7e767ca9e0ddb769b38fabd9289648ac63f5413d assets/create/models/item/orange_valve_handle.json 82152bca4310111d91584a2a78f05e158bb4bd90 assets/create/models/item/ornate_iron_window.json f9064c1f199bcd8db321078e2363ed91cb2acc09 assets/create/models/item/ornate_iron_window_pane.json -09b3cd8ff7b29a6dd59f739a95bb708646d23537 assets/create/models/item/oxidized_copper_shingles.json c9c7ccdb68de2e77cd9f7053fab19493dd30a985 assets/create/models/item/oxidized_copper_shingle_slab.json 89c5f7a0a28f238ebed2641e243a47e4be2ad5ab assets/create/models/item/oxidized_copper_shingle_stairs.json -1c3428e2aed32a013631db012642a34d4eaf0785 assets/create/models/item/oxidized_copper_tiles.json +09b3cd8ff7b29a6dd59f739a95bb708646d23537 assets/create/models/item/oxidized_copper_shingles.json f1af7c5f3840efc3ae07940ee6719eb3417a0e1a assets/create/models/item/oxidized_copper_tile_slab.json ef2fe68d407a03bf1ed8f2d2f3e7323777d061bb assets/create/models/item/oxidized_copper_tile_stairs.json -b21a1f3ee7de3e17f69d27fd13ae6b23b62aa22c assets/create/models/item/packager.json +1c3428e2aed32a013631db012642a34d4eaf0785 assets/create/models/item/oxidized_copper_tiles.json 5b974e55caffdbfc2156eb8b59dd99db12243bd3 assets/create/models/item/package_filter.json 7fd76e7d2e6c6d94352f1fa08d096b63616ad01e assets/create/models/item/package_frogport.json +b21a1f3ee7de3e17f69d27fd13ae6b23b62aa22c assets/create/models/item/packager.json 76aeceb41bb7df873dbafe1bd5e26deb24abf93f assets/create/models/item/peculiar_bell.json ab6c05a0468f3f4295a07adb362fa2d36cf6e3e8 assets/create/models/item/pink_postbox.json df13d4281dc45041ecd93504d45daef61d070581 assets/create/models/item/pink_seat.json @@ -2374,15 +2374,15 @@ f982794c2e01a70fcc2bb009bcb8cd06a2ea5510 assets/create/models/item/rare_jinx_pac 7830b48ef4292922f0ef13f9a7c2ee7d47366169 assets/create/models/item/rare_simi_package.json 5f8e5283fbebb452f1a1141b33ee73f08879c75d assets/create/models/item/raw_zinc.json 4631d67976cef148c346a7016baaa6703e4f243e assets/create/models/item/raw_zinc_block.json -9dc6c52e258b00cac6ed23147983045c43218b5d assets/create/models/item/redstone_contact.json -f8f733364bdd32b2ad597e81103bc02344ce63bd assets/create/models/item/redstone_link.json -ae0ba4827a81bd51c5c01178c2ccdae3a722628a assets/create/models/item/redstone_requester.json 4b73ee9cc2651a3d1a97476d100f9c4d7e2b2efe assets/create/models/item/red_postbox.json 8d00eb1a10055a802556eab10e13f522d12acd1c assets/create/models/item/red_sand_paper.json b64a054c92cbd2e055502d470f3921d1077e63a1 assets/create/models/item/red_seat.json 359d9bdb2496140e297a1e5a98c9563bc09d56b9 assets/create/models/item/red_table_cloth.json ac4695cc465d094b4adba1a4e9efec42c916f37d assets/create/models/item/red_toolbox.json 02473f42ef4b53dc809c7c58ae657c014bfaf652 assets/create/models/item/red_valve_handle.json +9dc6c52e258b00cac6ed23147983045c43218b5d assets/create/models/item/redstone_contact.json +f8f733364bdd32b2ad597e81103bc02344ce63bd assets/create/models/item/redstone_link.json +ae0ba4827a81bd51c5c01178c2ccdae3a722628a assets/create/models/item/redstone_requester.json 9926bbe6dad7c4c1a146492116d232e941c80d2b assets/create/models/item/refined_radiance.json bf827486dc7a1b3aeae577844d2dab2a97051db9 assets/create/models/item/refined_radiance_casing.json a982c29763d90556cca03074c168462a52cb9526 assets/create/models/item/repackager.json @@ -2396,9 +2396,9 @@ d45005a89e2c0d29944e0112be274365e0e318a5 assets/create/models/item/rose_quartz_t 670e978a34faf6a3acd7880b2f94c2574178d586 assets/create/models/item/sand_paper.json 6854451e331242ec50c186a545538024b07ec123 assets/create/models/item/schedule.json 0effa517c214ba07dba2f4ed12dfcf4785e42dd8 assets/create/models/item/schematic.json -8b7727844d8c12c3c22828c7f65fc7ac2d273e36 assets/create/models/item/schematicannon.json 2a52f084fa8187dd8da28fe820dde50c47a93b57 assets/create/models/item/schematic_and_quill.json 4c8b34627001e35ee15412a0cd037d0f24ba914e assets/create/models/item/schematic_table.json +8b7727844d8c12c3c22828c7f65fc7ac2d273e36 assets/create/models/item/schematicannon.json 2955563914c2f84ed06474c135062e91189ddf3a assets/create/models/item/scorchia.json 669041e5ad29d2166cc8895f85aa262040671d3e assets/create/models/item/scorchia_pillar.json ff52eb59dadfe675e416440f3115856a501428a6 assets/create/models/item/scoria.json @@ -2409,63 +2409,63 @@ abaa6da82babc26717ffff44fc41327bd015c9a6 assets/create/models/item/shadow_steel. ffaec38d11b91add4e150e33d0e0e49394f5beca assets/create/models/item/shadow_steel_casing.json b6fcd9722e5a09a9207964cba68752512e3b945a assets/create/models/item/shaft.json 617c6e2f759b2a95da7ee7192a2661afc6f6e8f8 assets/create/models/item/shopping_list.json -58ca190177e77db90c8195347c29d52c2cd0c556 assets/create/models/item/small_andesite_bricks.json fa92996fada8545fc340fb401bd0568f56809bf0 assets/create/models/item/small_andesite_brick_slab.json 08474bf814a55795c1f94203ceb8a969be2a2132 assets/create/models/item/small_andesite_brick_stairs.json 0e00bc6aa5be242217ed6fe8cbe1ccdf180742fb assets/create/models/item/small_andesite_brick_wall.json -543055fabb706a93037c6a9e47c334508e41b06c assets/create/models/item/small_asurine_bricks.json +58ca190177e77db90c8195347c29d52c2cd0c556 assets/create/models/item/small_andesite_bricks.json b160c3277f00f19687cffb87f9cb3aa32d3633aa assets/create/models/item/small_asurine_brick_slab.json 183fa4919f06e8c3c10f1efeceefd55389a96102 assets/create/models/item/small_asurine_brick_stairs.json d6a5ffdb493fb2c8176a7e6b42e05c2d393a2782 assets/create/models/item/small_asurine_brick_wall.json -26d9361e33e362a772220146724c0927453831e0 assets/create/models/item/small_calcite_bricks.json +543055fabb706a93037c6a9e47c334508e41b06c assets/create/models/item/small_asurine_bricks.json 8c1b5d5d40393636c9ff10afc09038c89bc1b383 assets/create/models/item/small_calcite_brick_slab.json 481ce90fb6abb05c904f01df3fe635f702bbfac0 assets/create/models/item/small_calcite_brick_stairs.json 02adb90bdf06a7c4c57d09dfd3c77cceef9b7fbe assets/create/models/item/small_calcite_brick_wall.json -d5a033d3dedb799c4752b7e68b6881529f38f8e5 assets/create/models/item/small_crimsite_bricks.json +26d9361e33e362a772220146724c0927453831e0 assets/create/models/item/small_calcite_bricks.json 8f382537c99eac3335f72db8dba33ab71f99a919 assets/create/models/item/small_crimsite_brick_slab.json b5d012cf0c5c94b73e6825b6884ab1d3eee7d64e assets/create/models/item/small_crimsite_brick_stairs.json 236457bb16bc7e949c16f3f091ee74dc3f3e6973 assets/create/models/item/small_crimsite_brick_wall.json -6ce2cb7882f41fcbcd641a442c98767bda61f65f assets/create/models/item/small_deepslate_bricks.json +d5a033d3dedb799c4752b7e68b6881529f38f8e5 assets/create/models/item/small_crimsite_bricks.json ce79900b7aa1eff0d42cabcd0a7f80ef20824551 assets/create/models/item/small_deepslate_brick_slab.json a260711af72c749a6b72f72515bbecb2e01e3ed8 assets/create/models/item/small_deepslate_brick_stairs.json 4e474891c6a269166c2eb413fae78699e5657af4 assets/create/models/item/small_deepslate_brick_wall.json -e412eaa393965ef5426c3d8d95d5c9d69e37e054 assets/create/models/item/small_diorite_bricks.json +6ce2cb7882f41fcbcd641a442c98767bda61f65f assets/create/models/item/small_deepslate_bricks.json 55b82c2f30d52acee5c3807ab2ffaed1d773cfa8 assets/create/models/item/small_diorite_brick_slab.json 49a17610b5b05595894ca2683056cecd724c1111 assets/create/models/item/small_diorite_brick_stairs.json dd3630a9c5500e6cf09e95d09e7a3cc99db11899 assets/create/models/item/small_diorite_brick_wall.json -c29d35da520d0fe828bb364db403b8cdf55f0a2e assets/create/models/item/small_dripstone_bricks.json +e412eaa393965ef5426c3d8d95d5c9d69e37e054 assets/create/models/item/small_diorite_bricks.json 21e281ec7a82d48018366a0737c6867f625b4663 assets/create/models/item/small_dripstone_brick_slab.json 6862e72eedf80536f40b6ac42ff78f13f62d012f assets/create/models/item/small_dripstone_brick_stairs.json ca8613bb64ceb562c36dd1d6a3b76b5f15f35be9 assets/create/models/item/small_dripstone_brick_wall.json -81eae95d20a9e99a070dfb8f6e6c22ef29f628d3 assets/create/models/item/small_granite_bricks.json +c29d35da520d0fe828bb364db403b8cdf55f0a2e assets/create/models/item/small_dripstone_bricks.json a19aa13eb3c04a9e0931e22e4170eec80950efab assets/create/models/item/small_granite_brick_slab.json 51bc02587cad5dfcfaf9d040848faa5277a25a5f assets/create/models/item/small_granite_brick_stairs.json 147a6f42be8312fbf050ad53c1625a1458f73cc3 assets/create/models/item/small_granite_brick_wall.json -bfa76583bca68134bbe2793c263cc0b71e1406af assets/create/models/item/small_limestone_bricks.json +81eae95d20a9e99a070dfb8f6e6c22ef29f628d3 assets/create/models/item/small_granite_bricks.json a9599981e872e683dacd01b2f0af511f416dd526 assets/create/models/item/small_limestone_brick_slab.json d8f8eadea13fc90a1c8ee5aca4be71fb22a79fd0 assets/create/models/item/small_limestone_brick_stairs.json 67626afe8b0fc9135456a24ea49c602b83d6970d assets/create/models/item/small_limestone_brick_wall.json -2d4b22d4028c55cbabc7eb405c2c6d485390afab assets/create/models/item/small_ochrum_bricks.json +bfa76583bca68134bbe2793c263cc0b71e1406af assets/create/models/item/small_limestone_bricks.json f7547aacb8bdaf61424cd56565e40d3cd40a1cfa assets/create/models/item/small_ochrum_brick_slab.json 8a320ff9e75e16a182cb7d07784a595fe7876e04 assets/create/models/item/small_ochrum_brick_stairs.json 0eedd4fe5b0a82de16fed148836087ff4ae64a74 assets/create/models/item/small_ochrum_brick_wall.json +2d4b22d4028c55cbabc7eb405c2c6d485390afab assets/create/models/item/small_ochrum_bricks.json 97b8e3eaddac0b93d4b6bc140f573969fcba5823 assets/create/models/item/small_rose_quartz_tiles.json -ac1bf1d2344517c18b945afa198d5d05e2866f6b assets/create/models/item/small_scorchia_bricks.json 63ef9901ba1014027e8c873d8374d86abb73158e assets/create/models/item/small_scorchia_brick_slab.json f52601fe54695c225a595a65e9130665582db856 assets/create/models/item/small_scorchia_brick_stairs.json b4e0db087dc88e0a3a4a82197a0ce347d3c7a7aa assets/create/models/item/small_scorchia_brick_wall.json -25b6bb40701e782ed64414ec8391b304ad5e6b12 assets/create/models/item/small_scoria_bricks.json +ac1bf1d2344517c18b945afa198d5d05e2866f6b assets/create/models/item/small_scorchia_bricks.json a4bdeb066dcc44f8be058e6d9dfc0a3fd34819bf assets/create/models/item/small_scoria_brick_slab.json 5ffb0e7de917013cd82cece2506d72fce2cd5fc6 assets/create/models/item/small_scoria_brick_stairs.json 67dcbc7d52fbbe88f89b36e04f970b27024741e4 assets/create/models/item/small_scoria_brick_wall.json -90943707d8b232d816392bec8ae05e06b6eedd72 assets/create/models/item/small_tuff_bricks.json +25b6bb40701e782ed64414ec8391b304ad5e6b12 assets/create/models/item/small_scoria_bricks.json 91a144100eea8b4e67a0a4f31b35a714693fa001 assets/create/models/item/small_tuff_brick_slab.json b3f89c9f8e46fbdfc58171073d6ad91c588e5853 assets/create/models/item/small_tuff_brick_stairs.json 52c1d4cfb5f1726c9ccbb00db60bdd6f760bf40f assets/create/models/item/small_tuff_brick_wall.json -6935d6d9dbdb99fe7258d9347419d65571711263 assets/create/models/item/small_veridium_bricks.json +90943707d8b232d816392bec8ae05e06b6eedd72 assets/create/models/item/small_tuff_bricks.json 0bb60fc6ab570db83214fd10c83d931f6677e361 assets/create/models/item/small_veridium_brick_slab.json 89918d98b6830477b21ab7fb9e30807d3ca1d379 assets/create/models/item/small_veridium_brick_stairs.json ab4e7695e99548f83a89f3d5ad7690a576bafcc0 assets/create/models/item/small_veridium_brick_wall.json +6935d6d9dbdb99fe7258d9347419d65571711263 assets/create/models/item/small_veridium_bricks.json 6cf508dbd3d015ea730366db92bb17844dc2ca06 assets/create/models/item/smart_chute.json 9201f00edcf2ffa33cb079c28b5c33e39872c824 assets/create/models/item/smart_fluid_pipe.json 67804bdd890f167010f6101a700e85a3245f4cc3 assets/create/models/item/speedometer.json @@ -2476,9 +2476,9 @@ b82ab0c69df330f6f938ed1beee7b4add67d2e50 assets/create/models/item/steam_engine. 24acc593a5e910b6301afcb3f23cba526d23a0ab assets/create/models/item/steam_whistle.json 54f200be903e056e5cf9e2186f0a0a51f8f0f84e assets/create/models/item/sticker.json 0f88de164439640cc175ceef2017f7416b5a7018 assets/create/models/item/sticky_mechanical_piston.json -4b640b66765b206f8c2884b7c1a1ef860b81d841 assets/create/models/item/stockpile_switch.json c04a4ef6debb04d305d74d9b034c1e95c6b9e956 assets/create/models/item/stock_link.json 67c98c6c7f2122850acfbee34688572934fdd226 assets/create/models/item/stock_ticker.json +4b640b66765b206f8c2884b7c1a1ef860b81d841 assets/create/models/item/stockpile_switch.json 6ee792277b9fd980c40e18e841afa63fc500ed0b assets/create/models/item/stressometer.json 8d4ce1ccf180016506292f63188c10d0dabe0ee3 assets/create/models/item/sturdy_sheet.json a10bb4d6d1a4483a806e3aaa086d48c0e20aaefe assets/create/models/item/super_glue.json @@ -2505,36 +2505,36 @@ b0f6d37aa695395e28a23d36775092f63ab3f5a5 assets/create/models/item/vertical_gear 9c5087114e35052c5e56bb752252de5d092408c5 assets/create/models/item/warped_window.json 83502f4b8d0134e793611b36a56cca59af097ed5 assets/create/models/item/warped_window_pane.json e5939b47bf7440dc101c667e68ef6bf750a3290f assets/create/models/item/water_wheel.json -be2f058a7ecb015599ee052ec27c4360d636999a assets/create/models/item/waxed_copper_shingles.json adc188e4e48bea80607c6e0c7076c9bdd7236cb0 assets/create/models/item/waxed_copper_shingle_slab.json 7e224aceaa94361256e95e4c44d8814aebaf297c assets/create/models/item/waxed_copper_shingle_stairs.json -eced19a2f721c54b968e5979cde2705f15faf3e1 assets/create/models/item/waxed_copper_tiles.json +be2f058a7ecb015599ee052ec27c4360d636999a assets/create/models/item/waxed_copper_shingles.json 68b3632c34adb9991aa993385f53624632c260f2 assets/create/models/item/waxed_copper_tile_slab.json a7fc0cc2d32dcd49c3274597ce7121f01fca03f8 assets/create/models/item/waxed_copper_tile_stairs.json -5336907eba067492f6d00b4b8514f9663830a1d5 assets/create/models/item/waxed_exposed_copper_shingles.json +eced19a2f721c54b968e5979cde2705f15faf3e1 assets/create/models/item/waxed_copper_tiles.json fd428034c46a240c4bb2a1aee625b8767f41c3ef assets/create/models/item/waxed_exposed_copper_shingle_slab.json 43d714187fe6c0cd1ed7abcddef1ebcd63979ff4 assets/create/models/item/waxed_exposed_copper_shingle_stairs.json -962b24b3611abefc21920d01452944710ab0da3f assets/create/models/item/waxed_exposed_copper_tiles.json +5336907eba067492f6d00b4b8514f9663830a1d5 assets/create/models/item/waxed_exposed_copper_shingles.json 25f5a10fe8e6acbdbf8457d56aeee065835a93ec assets/create/models/item/waxed_exposed_copper_tile_slab.json 22917505d328fb5b489b9f7f9068f1514b784abb assets/create/models/item/waxed_exposed_copper_tile_stairs.json -12c3dd893bddb66b9b387652c67c8f0e24b643ff assets/create/models/item/waxed_oxidized_copper_shingles.json +962b24b3611abefc21920d01452944710ab0da3f assets/create/models/item/waxed_exposed_copper_tiles.json 9b7c82376ea8c1c8ecbc7bbe15283f84b0d50d94 assets/create/models/item/waxed_oxidized_copper_shingle_slab.json fbb6043eb935aa0641a482ee7300c780be257440 assets/create/models/item/waxed_oxidized_copper_shingle_stairs.json -6b8f75d4818db903b22f4626d02671ab76a61023 assets/create/models/item/waxed_oxidized_copper_tiles.json +12c3dd893bddb66b9b387652c67c8f0e24b643ff assets/create/models/item/waxed_oxidized_copper_shingles.json 6e7bc8eb9a87d903dcc590e9918ce8d4411bf190 assets/create/models/item/waxed_oxidized_copper_tile_slab.json 10136759b31e4d957e8374948460d6c984711326 assets/create/models/item/waxed_oxidized_copper_tile_stairs.json -ce2dcfc01205da1dc70f34091a2c24f563e72466 assets/create/models/item/waxed_weathered_copper_shingles.json +6b8f75d4818db903b22f4626d02671ab76a61023 assets/create/models/item/waxed_oxidized_copper_tiles.json 2bf249c677d30a4febf950fa7c6caa87c348c54e assets/create/models/item/waxed_weathered_copper_shingle_slab.json 9fa84f2555d82b5a1550b748a332ceb443a04fae assets/create/models/item/waxed_weathered_copper_shingle_stairs.json -02d2ac048c9bea86d10673254dfc107f3c9c5bb5 assets/create/models/item/waxed_weathered_copper_tiles.json +ce2dcfc01205da1dc70f34091a2c24f563e72466 assets/create/models/item/waxed_weathered_copper_shingles.json ab40b1a5a03cd290d53ef2ea65f90dcfcd2673de assets/create/models/item/waxed_weathered_copper_tile_slab.json dadc7b65a4527e288c21a20df978796a8c444fd2 assets/create/models/item/waxed_weathered_copper_tile_stairs.json -86b8e71fa8b7aeb73eafda89d8d06d83da6a5d25 assets/create/models/item/weathered_copper_shingles.json +02d2ac048c9bea86d10673254dfc107f3c9c5bb5 assets/create/models/item/waxed_weathered_copper_tiles.json 94db30ad2381d2f2c37cdfd0d5ce5c45a2807640 assets/create/models/item/weathered_copper_shingle_slab.json 7262c01df4b5a8cd8c6a5545062f251d5ad9fd06 assets/create/models/item/weathered_copper_shingle_stairs.json -99f17b16b68201aefb78298b3e6c657e3c2235e0 assets/create/models/item/weathered_copper_tiles.json +86b8e71fa8b7aeb73eafda89d8d06d83da6a5d25 assets/create/models/item/weathered_copper_shingles.json 0b1b299d6dfab65b6060305a8b3e51f6e2df09f4 assets/create/models/item/weathered_copper_tile_slab.json 0c3989b44fde934ba8b88b071887e5ede522c417 assets/create/models/item/weathered_copper_tile_stairs.json +99f17b16b68201aefb78298b3e6c657e3c2235e0 assets/create/models/item/weathered_copper_tiles.json b5d591fbb40e062efe301b3b3b49580e5ad64566 assets/create/models/item/weathered_iron_block.json a569ddd725898a86f8745e46723edeff7fe7f2e9 assets/create/models/item/weathered_iron_window.json a262cbdf9aa0c240f623dcadd42864d280d36978 assets/create/models/item/weathered_iron_window_pane.json @@ -2573,42 +2573,42 @@ b25b8c230fde8d6d77e8d516bed52236652b5ca6 data/create/advancements/recipes/buildi 537fe5dffa659e5838379587fbd84f2f641551ea data/create/advancements/recipes/building_blocks/calcite_pillar_from_stone_types_calcite_stonecutting.json 2636ac059b6412a46402cccbe5abe4fb49143662 data/create/advancements/recipes/building_blocks/cherry_window.json 3e08f575543f1e0abea979dbaee643572734788b data/create/advancements/recipes/building_blocks/cherry_window_pane.json -09f332cd34e6a92af9e8e4e757418c7ba8b536da data/create/advancements/recipes/building_blocks/copper_shingles_from_ingots_copper_stonecutting.json 55214a0fd27318b17163cace66c7525785127ef8 data/create/advancements/recipes/building_blocks/copper_shingle_slab.json fb4210dbbfb74459e10da94a540f3bfdf91c4a8d data/create/advancements/recipes/building_blocks/copper_shingle_slab_from_copper_shingles_stonecutting.json 31b04ac1b117fb65f5129c5bbb48e42c1c4c1003 data/create/advancements/recipes/building_blocks/copper_shingle_stairs.json bef4a9a4c2e722d4f086d6b4c9d6fa1d0836ec10 data/create/advancements/recipes/building_blocks/copper_shingle_stairs_from_copper_shingles_stonecutting.json -f66a48f01afb4fa1babee4a8c28b032280c3ac9e data/create/advancements/recipes/building_blocks/copper_tiles_from_ingots_copper_stonecutting.json +09f332cd34e6a92af9e8e4e757418c7ba8b536da data/create/advancements/recipes/building_blocks/copper_shingles_from_ingots_copper_stonecutting.json ef79744ebf31453d1c81789afed7b717837b3515 data/create/advancements/recipes/building_blocks/copper_tile_slab.json 8e9997c43b1c06521fe8d38b04ccb3f04c93d537 data/create/advancements/recipes/building_blocks/copper_tile_slab_from_copper_tiles_stonecutting.json a2609aa8b5453f2294f38c81d26e0b8dad71087d data/create/advancements/recipes/building_blocks/copper_tile_stairs.json d47e46c66bf69e8310e6687716858842e8aed7b5 data/create/advancements/recipes/building_blocks/copper_tile_stairs_from_copper_tiles_stonecutting.json +f66a48f01afb4fa1babee4a8c28b032280c3ac9e data/create/advancements/recipes/building_blocks/copper_tiles_from_ingots_copper_stonecutting.json cc14d10c75ab0fdd7c54db1922e5e56667739fef data/create/advancements/recipes/building_blocks/copycat_panel_from_ingots_zinc_stonecutting.json 55d2812be912c857ff666d581174378857d3bce2 data/create/advancements/recipes/building_blocks/copycat_step_from_ingots_zinc_stonecutting.json -8615fc107b1f4df86711081a9dccac8631b02e6b data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_shingles_from_honeycomb.json 0e0eba8550768ef69087dff8112814f25233fab7 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_shingle_slab_from_honeycomb.json 2c960d55273df4c0c8c33b2c329175b35b18fc8c data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_shingle_stairs_from_honeycomb.json -fa8f3ed9a4c6f0c3cd4c21b0ae4dc8ca4dba8678 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_tiles_from_honeycomb.json +8615fc107b1f4df86711081a9dccac8631b02e6b data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_shingles_from_honeycomb.json d6f2aa7fd10c96f71c47bdabb3e53dc4c4e73706 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_tile_slab_from_honeycomb.json eca165eee20adba1557ccc74ef50ee90311b3019 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_tile_stairs_from_honeycomb.json -88a236933e8dfe0d809bda098d16782288c4800c data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_shingles_from_honeycomb.json +fa8f3ed9a4c6f0c3cd4c21b0ae4dc8ca4dba8678 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_tiles_from_honeycomb.json 301149dabc4dce290b4884f4ed3cb2132123adf0 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_shingle_slab_from_honeycomb.json f360dce7bece72672f2624710c88edbe3e3f8885 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_shingle_stairs_from_honeycomb.json -bc27959288766492746f41c4810350dcef1b320d data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_tiles_from_honeycomb.json +88a236933e8dfe0d809bda098d16782288c4800c data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_shingles_from_honeycomb.json 7ceb4b74ff84ed404518b6cb5e1432dac5903b5f data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_tile_slab_from_honeycomb.json ec1eec3bc25534484cb264134e62b578525422aa data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_tile_stairs_from_honeycomb.json -2e8f1da032110e8c5ec375ffd425e5eed7f58cae data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_shingles_from_honeycomb.json +bc27959288766492746f41c4810350dcef1b320d data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_tiles_from_honeycomb.json e34abb4d51c1d00419fc3d3799ca0d9fe7ea1027 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_shingle_slab_from_honeycomb.json 9471e190beb603f022fb234f2cf35b5b4b93f0c0 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_shingle_stairs_from_honeycomb.json -17fe14b753953a68887cd001fcaa264ef031463f data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_tiles_from_honeycomb.json +2e8f1da032110e8c5ec375ffd425e5eed7f58cae data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_shingles_from_honeycomb.json 2577754364f05264fac325f67597230d01fa0c1d data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_tile_slab_from_honeycomb.json 003e384d9594a4e6ef5678e74f04b56de047dbde data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_tile_stairs_from_honeycomb.json -5009a82a897a15407fec785005107b0d228fffe7 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_shingles_from_honeycomb.json +17fe14b753953a68887cd001fcaa264ef031463f data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_tiles_from_honeycomb.json 70ce32937dcf349dce77fef8022bc0c15863f6a6 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_shingle_slab_from_honeycomb.json 1fc498238dcc2705152573ba7f74bb50e7e66ca7 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_shingle_stairs_from_honeycomb.json -d12aa3dd5457327224fd007211878eec21043971 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_tiles_from_honeycomb.json +5009a82a897a15407fec785005107b0d228fffe7 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_shingles_from_honeycomb.json 6f461d7036de914c636b7916dc798775ccf25be1 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_tile_slab_from_honeycomb.json 3bc9efcddecd23fd06c6056a0ee7b937959cecc0 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_tile_stairs_from_honeycomb.json +d12aa3dd5457327224fd007211878eec21043971 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_tiles_from_honeycomb.json 3064c52dea808a00c211bfedb96106b563f480da data/create/advancements/recipes/building_blocks/crafting/kinetics/black_seat.json f07a0b21db200ab68a7df02db519869f68953286 data/create/advancements/recipes/building_blocks/crafting/kinetics/black_seat_from_other_seat.json 80ac4db5c53c7efc2666a7abb4e2e876c5f86588 data/create/advancements/recipes/building_blocks/crafting/kinetics/blue_seat.json @@ -2709,7 +2709,6 @@ f3188b24f8108be4219016689a4768f826b4fef3 data/create/advancements/recipes/buildi e88373b83226d860b0c2131213f5d3b09f31ab96 data/create/advancements/recipes/building_blocks/crimsite_pillar_from_stone_types_crimsite_stonecutting.json 09f7122cf360fd56bde2b1659bbed526f9a119c4 data/create/advancements/recipes/building_blocks/crimson_window.json b5234c6050bc0c6fe872a5ddc87d46ba39e07971 data/create/advancements/recipes/building_blocks/crimson_window_pane.json -b32f4345517c3c7299a06489325bd85f987145dc data/create/advancements/recipes/building_blocks/cut_andesite_bricks_from_stone_types_andesite_stonecutting.json 22fe2e61d7e9836d9f71c39bfbba50efc2fa184d data/create/advancements/recipes/building_blocks/cut_andesite_brick_slab.json 6d8d28364f1016dfd1d7cbe4a2637e2b6224e4d8 data/create/advancements/recipes/building_blocks/cut_andesite_brick_slab_from_stone_types_andesite_stonecutting.json 39e904f66d2194de5437b5da2f8db8b6f03d78f4 data/create/advancements/recipes/building_blocks/cut_andesite_brick_slab_recycling.json @@ -2717,6 +2716,7 @@ b32f4345517c3c7299a06489325bd85f987145dc data/create/advancements/recipes/buildi 480c696956b99c96cbaf46e7dad9711c40680ec8 data/create/advancements/recipes/building_blocks/cut_andesite_brick_stairs_from_stone_types_andesite_stonecutting.json 8d504cdb99f5dc59bef5ff35d0b443f2f4ba21d2 data/create/advancements/recipes/building_blocks/cut_andesite_brick_wall.json e1b8e5906d54368c98867b83143dc7acc7b0aa28 data/create/advancements/recipes/building_blocks/cut_andesite_brick_wall_from_stone_types_andesite_stonecutting.json +b32f4345517c3c7299a06489325bd85f987145dc data/create/advancements/recipes/building_blocks/cut_andesite_bricks_from_stone_types_andesite_stonecutting.json d5b44158f9a98d874d941fc4df99de7a2657af21 data/create/advancements/recipes/building_blocks/cut_andesite_from_stone_types_andesite_stonecutting.json c11998f554bbd42efdbdf58cf8efe5bcf69230de data/create/advancements/recipes/building_blocks/cut_andesite_slab.json 1f457c0e816e4dd70e1a960015d2004814d11926 data/create/advancements/recipes/building_blocks/cut_andesite_slab_from_stone_types_andesite_stonecutting.json @@ -2725,7 +2725,6 @@ a4d7adf49472a2069bad72defd39b111b83def3d data/create/advancements/recipes/buildi 6d38bb2b9812761c594ebdf717284ba8d32e88bc data/create/advancements/recipes/building_blocks/cut_andesite_stairs_from_stone_types_andesite_stonecutting.json 2f6b2296b11e0e743d68749e65af5ffa0f374998 data/create/advancements/recipes/building_blocks/cut_andesite_wall.json caf3b1c62d0f8df3ce126535f0566c899577bedb data/create/advancements/recipes/building_blocks/cut_andesite_wall_from_stone_types_andesite_stonecutting.json -54188623046e989d21e6e155933e4084fb2882c4 data/create/advancements/recipes/building_blocks/cut_asurine_bricks_from_stone_types_asurine_stonecutting.json 536a2bed2ed1e7e249886ef376c96a8d5a1facdc data/create/advancements/recipes/building_blocks/cut_asurine_brick_slab.json a4e833cadfbb82222a70d66524e804c83ea13f7b data/create/advancements/recipes/building_blocks/cut_asurine_brick_slab_from_stone_types_asurine_stonecutting.json 610163ac2f4b06121931a81ac4b3df39ece61998 data/create/advancements/recipes/building_blocks/cut_asurine_brick_slab_recycling.json @@ -2733,6 +2732,7 @@ a4e833cadfbb82222a70d66524e804c83ea13f7b data/create/advancements/recipes/buildi f92f31e80cc026160217afb6c757987f75ed0b33 data/create/advancements/recipes/building_blocks/cut_asurine_brick_stairs_from_stone_types_asurine_stonecutting.json fa6dc7eaa32652a00a7217ae25967de0791088b6 data/create/advancements/recipes/building_blocks/cut_asurine_brick_wall.json 33f361369bfd92f53b3e40c837b336edd04a26e9 data/create/advancements/recipes/building_blocks/cut_asurine_brick_wall_from_stone_types_asurine_stonecutting.json +54188623046e989d21e6e155933e4084fb2882c4 data/create/advancements/recipes/building_blocks/cut_asurine_bricks_from_stone_types_asurine_stonecutting.json a6b871faa10badaaaa1a0ebbba94c4f2f627c43f data/create/advancements/recipes/building_blocks/cut_asurine_from_stone_types_asurine_stonecutting.json 719e1d4fea3457f2990be6a5d6cd87915d546217 data/create/advancements/recipes/building_blocks/cut_asurine_slab.json 586918291dda711c79941cf484cb62dbb853a271 data/create/advancements/recipes/building_blocks/cut_asurine_slab_from_stone_types_asurine_stonecutting.json @@ -2741,7 +2741,6 @@ bd2a630d242ae9c89b071b0401285068071a346c data/create/advancements/recipes/buildi 03d7b1609d161043e28661d74f53b06d4408f561 data/create/advancements/recipes/building_blocks/cut_asurine_stairs_from_stone_types_asurine_stonecutting.json cba4a6feaf695e665204cac36f9109ba941b12a6 data/create/advancements/recipes/building_blocks/cut_asurine_wall.json 3327651dd3f2fd778abdcfe70d25137d916f3def data/create/advancements/recipes/building_blocks/cut_asurine_wall_from_stone_types_asurine_stonecutting.json -44873f9d05abde7d52a6eacdf3573d8b69c69452 data/create/advancements/recipes/building_blocks/cut_calcite_bricks_from_stone_types_calcite_stonecutting.json a070ffe63c182b33c4c6faedb391f51a209c0e27 data/create/advancements/recipes/building_blocks/cut_calcite_brick_slab.json 7ba1e7add81422599f798153e4fd069e9fbfdebf data/create/advancements/recipes/building_blocks/cut_calcite_brick_slab_from_stone_types_calcite_stonecutting.json f5e80ec393c306485d666d6f9f91c55d9f1ba592 data/create/advancements/recipes/building_blocks/cut_calcite_brick_slab_recycling.json @@ -2749,6 +2748,7 @@ f5e80ec393c306485d666d6f9f91c55d9f1ba592 data/create/advancements/recipes/buildi 627f85aa63133cf95dd828092e0232b9ec8acfd5 data/create/advancements/recipes/building_blocks/cut_calcite_brick_stairs_from_stone_types_calcite_stonecutting.json d8870e522a68274cc90eab07ea17b7b6cdc5a16c data/create/advancements/recipes/building_blocks/cut_calcite_brick_wall.json cdf5927f3c1b3ef8904f38f66317412799e189fb data/create/advancements/recipes/building_blocks/cut_calcite_brick_wall_from_stone_types_calcite_stonecutting.json +44873f9d05abde7d52a6eacdf3573d8b69c69452 data/create/advancements/recipes/building_blocks/cut_calcite_bricks_from_stone_types_calcite_stonecutting.json 9f8c31b0db2aab8f1c8f42bcef15a74bc36887d4 data/create/advancements/recipes/building_blocks/cut_calcite_from_stone_types_calcite_stonecutting.json 857666ad1c6a5cc886f6896a18f560098afaa67b data/create/advancements/recipes/building_blocks/cut_calcite_slab.json c55074cd091b0e078105abdc940c62afa8984265 data/create/advancements/recipes/building_blocks/cut_calcite_slab_from_stone_types_calcite_stonecutting.json @@ -2757,7 +2757,6 @@ c55074cd091b0e078105abdc940c62afa8984265 data/create/advancements/recipes/buildi ba3378e1d08de2af0b2a725727cf9f68bda60044 data/create/advancements/recipes/building_blocks/cut_calcite_stairs_from_stone_types_calcite_stonecutting.json db5f4e1eee91c2a65d36164c20aba0e9d3a502ae data/create/advancements/recipes/building_blocks/cut_calcite_wall.json 19de370083d2cf1234c9c4e6ff45d85ef34a1ac8 data/create/advancements/recipes/building_blocks/cut_calcite_wall_from_stone_types_calcite_stonecutting.json -b9a2edda241f6e0677a2003300f0be5d3ff8f4b0 data/create/advancements/recipes/building_blocks/cut_crimsite_bricks_from_stone_types_crimsite_stonecutting.json 9fda0e6edde197a9c28a854419a2a07e323b6b53 data/create/advancements/recipes/building_blocks/cut_crimsite_brick_slab.json 2da3f139759be7eea552885b2063a0e2dfc647b1 data/create/advancements/recipes/building_blocks/cut_crimsite_brick_slab_from_stone_types_crimsite_stonecutting.json 62d928c8ab2e09a3f87adacb5adb1a5ddc1d2a7b data/create/advancements/recipes/building_blocks/cut_crimsite_brick_slab_recycling.json @@ -2765,6 +2764,7 @@ b9a2edda241f6e0677a2003300f0be5d3ff8f4b0 data/create/advancements/recipes/buildi 89850244feb8a3293ba96702b7a56a4bea84e1f3 data/create/advancements/recipes/building_blocks/cut_crimsite_brick_stairs_from_stone_types_crimsite_stonecutting.json 267cab789c73d474299542fb0719967501fcf0c9 data/create/advancements/recipes/building_blocks/cut_crimsite_brick_wall.json 27007676b86eb8a3498982d8b5e68495b84d62d5 data/create/advancements/recipes/building_blocks/cut_crimsite_brick_wall_from_stone_types_crimsite_stonecutting.json +b9a2edda241f6e0677a2003300f0be5d3ff8f4b0 data/create/advancements/recipes/building_blocks/cut_crimsite_bricks_from_stone_types_crimsite_stonecutting.json a88d252d4e634ff194daa3ff98fd7e965e3ed09a data/create/advancements/recipes/building_blocks/cut_crimsite_from_stone_types_crimsite_stonecutting.json f703136e1783a42252bc1d89c31e5563cbdff583 data/create/advancements/recipes/building_blocks/cut_crimsite_slab.json 3330d332462da22de48d07b62277c1df8e646a3e data/create/advancements/recipes/building_blocks/cut_crimsite_slab_from_stone_types_crimsite_stonecutting.json @@ -2773,7 +2773,6 @@ c2707e5969f0c554537dda9d3e2a4c13e19863c3 data/create/advancements/recipes/buildi e9ba513178090b020525e72468a0450e225da779 data/create/advancements/recipes/building_blocks/cut_crimsite_stairs_from_stone_types_crimsite_stonecutting.json 7fb5ce65b7b5c2d76b4306d407aaa6eefe07b7e5 data/create/advancements/recipes/building_blocks/cut_crimsite_wall.json a83d5b669f92bd833af2768d2cf5d4797a86b63c data/create/advancements/recipes/building_blocks/cut_crimsite_wall_from_stone_types_crimsite_stonecutting.json -bc9eb21df37df4b69e5d202b3b770698a16f4413 data/create/advancements/recipes/building_blocks/cut_deepslate_bricks_from_stone_types_deepslate_stonecutting.json 2c380e8ddc83cef4213f136ff7a196d861728914 data/create/advancements/recipes/building_blocks/cut_deepslate_brick_slab.json 87b5dfc1e61fabe4e7661bea0d7a56cb75197a81 data/create/advancements/recipes/building_blocks/cut_deepslate_brick_slab_from_stone_types_deepslate_stonecutting.json 09cde6df1120cc5f5f129023885f323b4d1eeae9 data/create/advancements/recipes/building_blocks/cut_deepslate_brick_slab_recycling.json @@ -2781,6 +2780,7 @@ bc9eb21df37df4b69e5d202b3b770698a16f4413 data/create/advancements/recipes/buildi 28e15fe2c377540cb631f6648f49090f234e7704 data/create/advancements/recipes/building_blocks/cut_deepslate_brick_stairs_from_stone_types_deepslate_stonecutting.json d2b34f455ab0053f24a4f9dec7dcce45832ef25b data/create/advancements/recipes/building_blocks/cut_deepslate_brick_wall.json 7b174b65b813b4a9ca507e71fa142931e074f336 data/create/advancements/recipes/building_blocks/cut_deepslate_brick_wall_from_stone_types_deepslate_stonecutting.json +bc9eb21df37df4b69e5d202b3b770698a16f4413 data/create/advancements/recipes/building_blocks/cut_deepslate_bricks_from_stone_types_deepslate_stonecutting.json 83db3f5b46c996481b930974bddba75c82c115af data/create/advancements/recipes/building_blocks/cut_deepslate_from_stone_types_deepslate_stonecutting.json 8e8816aad8212c3557e77cc01df551fe1a0a306d data/create/advancements/recipes/building_blocks/cut_deepslate_slab.json 14ea447072200733dd9551a5ac6a9544593dd9f7 data/create/advancements/recipes/building_blocks/cut_deepslate_slab_from_stone_types_deepslate_stonecutting.json @@ -2789,7 +2789,6 @@ c7870abb459c8b174c380282ae211a87ab252521 data/create/advancements/recipes/buildi 4f157401a3019c96cc6ae5a0036f31351c651fbb data/create/advancements/recipes/building_blocks/cut_deepslate_stairs_from_stone_types_deepslate_stonecutting.json 9ae9635fa129aab54a7ec971b9cc61d300d3d53e data/create/advancements/recipes/building_blocks/cut_deepslate_wall.json 9b5df53000c79a7b20e3a1888e003b704809feda data/create/advancements/recipes/building_blocks/cut_deepslate_wall_from_stone_types_deepslate_stonecutting.json -fdef99789ca74623b00b05be2f975b63831645db data/create/advancements/recipes/building_blocks/cut_diorite_bricks_from_stone_types_diorite_stonecutting.json 30a00465dc9b19d8024146e2c2d6b9f41562da30 data/create/advancements/recipes/building_blocks/cut_diorite_brick_slab.json a55e7daf48a487d74b4a01e30b80968094154d2b data/create/advancements/recipes/building_blocks/cut_diorite_brick_slab_from_stone_types_diorite_stonecutting.json e445a3d8fd00f5e4f2ee56c797d8abf548598447 data/create/advancements/recipes/building_blocks/cut_diorite_brick_slab_recycling.json @@ -2797,6 +2796,7 @@ b421f24513612dd7a5d8977d7bff122fd5cf9522 data/create/advancements/recipes/buildi 3fe00adac35beeda79b7f9d930a1f13b033c0f12 data/create/advancements/recipes/building_blocks/cut_diorite_brick_stairs_from_stone_types_diorite_stonecutting.json 6d2235b8587863107a6d1a0818c81ee3dc217cdf data/create/advancements/recipes/building_blocks/cut_diorite_brick_wall.json 0ec4b69e98adf961f5d4d63700f11ad66a4116b5 data/create/advancements/recipes/building_blocks/cut_diorite_brick_wall_from_stone_types_diorite_stonecutting.json +fdef99789ca74623b00b05be2f975b63831645db data/create/advancements/recipes/building_blocks/cut_diorite_bricks_from_stone_types_diorite_stonecutting.json c9f52e0661fdc266f8429faf1570124fecfa2d6a data/create/advancements/recipes/building_blocks/cut_diorite_from_stone_types_diorite_stonecutting.json c7b73ddec6402e8b5ff5daedbbbc74f882338a8e data/create/advancements/recipes/building_blocks/cut_diorite_slab.json 46c841e5aae99106cbc28026dcfec946976127e5 data/create/advancements/recipes/building_blocks/cut_diorite_slab_from_stone_types_diorite_stonecutting.json @@ -2805,7 +2805,6 @@ ce67a5fae622955ad795e2b3d14c159a4c47b936 data/create/advancements/recipes/buildi 3b7ec28df80ea9cf87980b2c2184858ba6152a3f data/create/advancements/recipes/building_blocks/cut_diorite_stairs_from_stone_types_diorite_stonecutting.json c8fe9ab53eda2cdbff08678ebb577c169ea61a91 data/create/advancements/recipes/building_blocks/cut_diorite_wall.json 050f67b5a662bea3ef972521ef7f81c2ba99015c data/create/advancements/recipes/building_blocks/cut_diorite_wall_from_stone_types_diorite_stonecutting.json -b60683fdd629b201f40a6f9bb6594df7c5ac13f1 data/create/advancements/recipes/building_blocks/cut_dripstone_bricks_from_stone_types_dripstone_stonecutting.json 1e0d39ed56e2ab4eac084f26a1c6de905db29220 data/create/advancements/recipes/building_blocks/cut_dripstone_brick_slab.json 020cbc4c8063d186d3f5c9ece429e4cdff53cf63 data/create/advancements/recipes/building_blocks/cut_dripstone_brick_slab_from_stone_types_dripstone_stonecutting.json b44c9e7f9f62ffffb5566901e0a22010ba76641c data/create/advancements/recipes/building_blocks/cut_dripstone_brick_slab_recycling.json @@ -2813,6 +2812,7 @@ b44c9e7f9f62ffffb5566901e0a22010ba76641c data/create/advancements/recipes/buildi 466fbdf7de8dacd1032fb7af690862bb68707876 data/create/advancements/recipes/building_blocks/cut_dripstone_brick_stairs_from_stone_types_dripstone_stonecutting.json 253b54c191c933e88fa6a9b4e7c94340082c7d60 data/create/advancements/recipes/building_blocks/cut_dripstone_brick_wall.json e176568e3de8b8ca17a788f4cea89002b5ad2d1d data/create/advancements/recipes/building_blocks/cut_dripstone_brick_wall_from_stone_types_dripstone_stonecutting.json +b60683fdd629b201f40a6f9bb6594df7c5ac13f1 data/create/advancements/recipes/building_blocks/cut_dripstone_bricks_from_stone_types_dripstone_stonecutting.json ddc5a16cf0d2790d8133ab6801f4c55317d776e4 data/create/advancements/recipes/building_blocks/cut_dripstone_from_stone_types_dripstone_stonecutting.json 6e40c9af0747a8b3adb805ddd8fbb947aedb408c data/create/advancements/recipes/building_blocks/cut_dripstone_slab.json e7761f71f797d2e62dc0860cbd5153955b9be86c data/create/advancements/recipes/building_blocks/cut_dripstone_slab_from_stone_types_dripstone_stonecutting.json @@ -2821,7 +2821,6 @@ a199a9f78a44f4313a922b317893c68f743dc1a9 data/create/advancements/recipes/buildi b68a95a565ee9a3aec017431aa5b8cc6fffec3ef data/create/advancements/recipes/building_blocks/cut_dripstone_stairs_from_stone_types_dripstone_stonecutting.json a4287f34f95c008bdf7c0a886d05c3960665147b data/create/advancements/recipes/building_blocks/cut_dripstone_wall.json 76f5d4a6a9895064b15ae0c0f27a138bb3d57dbf data/create/advancements/recipes/building_blocks/cut_dripstone_wall_from_stone_types_dripstone_stonecutting.json -24cc01d592faf2bad57fc9b9a1de52c50d225446 data/create/advancements/recipes/building_blocks/cut_granite_bricks_from_stone_types_granite_stonecutting.json 83148f66dc7418740b6f9b6a660b0b9306d87f7c data/create/advancements/recipes/building_blocks/cut_granite_brick_slab.json d982802fc11848c87022f7bf05cecf090953002a data/create/advancements/recipes/building_blocks/cut_granite_brick_slab_from_stone_types_granite_stonecutting.json 6b8fa161725a4e2106226c3591a23def74398f48 data/create/advancements/recipes/building_blocks/cut_granite_brick_slab_recycling.json @@ -2829,6 +2828,7 @@ ce1c81b730b3acef9673f41769339f7d68385348 data/create/advancements/recipes/buildi e9732e3beaefbc6a457e0c4fd61f17f429f1cd8c data/create/advancements/recipes/building_blocks/cut_granite_brick_stairs_from_stone_types_granite_stonecutting.json 4f403aee2aae6aa0fc334b434cf5ade362153329 data/create/advancements/recipes/building_blocks/cut_granite_brick_wall.json 625c8849b5c07835b49dcb4322ec44586628a700 data/create/advancements/recipes/building_blocks/cut_granite_brick_wall_from_stone_types_granite_stonecutting.json +24cc01d592faf2bad57fc9b9a1de52c50d225446 data/create/advancements/recipes/building_blocks/cut_granite_bricks_from_stone_types_granite_stonecutting.json 07e6f3835c3683f007fd25140d671b668706484d data/create/advancements/recipes/building_blocks/cut_granite_from_stone_types_granite_stonecutting.json 2f33b7f82e977eb3fd0e0283313b1066eadadd18 data/create/advancements/recipes/building_blocks/cut_granite_slab.json a1b406ca98c2ba7d5225afea8463d586fc538428 data/create/advancements/recipes/building_blocks/cut_granite_slab_from_stone_types_granite_stonecutting.json @@ -2837,7 +2837,6 @@ af12a2d8f8bb2382f55135df8cfec00692a65fe3 data/create/advancements/recipes/buildi 284087e07acd28aa869d5433375e412f083108e9 data/create/advancements/recipes/building_blocks/cut_granite_stairs_from_stone_types_granite_stonecutting.json dbfb50c3d5048b1f5d8d74f39c389ecec81392d7 data/create/advancements/recipes/building_blocks/cut_granite_wall.json 6b287be7a900dbd715290b069a89ab226d6cec9c data/create/advancements/recipes/building_blocks/cut_granite_wall_from_stone_types_granite_stonecutting.json -4ef0a018dcf0b470061a4b1dbadc27684d8d467f data/create/advancements/recipes/building_blocks/cut_limestone_bricks_from_stone_types_limestone_stonecutting.json b0ade7dab7eb095f07882e4c19884162f18e704c data/create/advancements/recipes/building_blocks/cut_limestone_brick_slab.json 4fc2dc61d62a394cebc91e36745699eeaee650e7 data/create/advancements/recipes/building_blocks/cut_limestone_brick_slab_from_stone_types_limestone_stonecutting.json b8ec42f06ce9eb696643154d16150a223bd5ec65 data/create/advancements/recipes/building_blocks/cut_limestone_brick_slab_recycling.json @@ -2845,6 +2844,7 @@ d0b19c27309cd45d08a6a0cd779f1930bc2e7469 data/create/advancements/recipes/buildi 9f65617405592d587a940ff7513fcb34ca6ab423 data/create/advancements/recipes/building_blocks/cut_limestone_brick_stairs_from_stone_types_limestone_stonecutting.json 281e2ddcb58b603dea8f305ed6c8ddea98d0d030 data/create/advancements/recipes/building_blocks/cut_limestone_brick_wall.json 7b0ab5095a7d2b3e876a8c8b990161851c1c58c2 data/create/advancements/recipes/building_blocks/cut_limestone_brick_wall_from_stone_types_limestone_stonecutting.json +4ef0a018dcf0b470061a4b1dbadc27684d8d467f data/create/advancements/recipes/building_blocks/cut_limestone_bricks_from_stone_types_limestone_stonecutting.json f8663a45d71c52a3982c75bbfb61653c8d2fd668 data/create/advancements/recipes/building_blocks/cut_limestone_from_stone_types_limestone_stonecutting.json 9e22972cd4f2d673cfcf07a597f6a14402c91913 data/create/advancements/recipes/building_blocks/cut_limestone_slab.json 388a57bb88582eda9fef904a530f72b066d24e7d data/create/advancements/recipes/building_blocks/cut_limestone_slab_from_stone_types_limestone_stonecutting.json @@ -2853,7 +2853,6 @@ f8663a45d71c52a3982c75bbfb61653c8d2fd668 data/create/advancements/recipes/buildi b6dc46dca3fc039fd0fe53ab791731cb085c3b62 data/create/advancements/recipes/building_blocks/cut_limestone_stairs_from_stone_types_limestone_stonecutting.json a9382d5f876542bf4fa8aed605352daca4ad2f6f data/create/advancements/recipes/building_blocks/cut_limestone_wall.json 69d9116786c53cb3155bed4580d4b01bfe638243 data/create/advancements/recipes/building_blocks/cut_limestone_wall_from_stone_types_limestone_stonecutting.json -1f8ee1a91937295484d5c2fe0186a617589c1761 data/create/advancements/recipes/building_blocks/cut_ochrum_bricks_from_stone_types_ochrum_stonecutting.json a51d6ebed8e21e8808ccfbe9f9540291504da59a data/create/advancements/recipes/building_blocks/cut_ochrum_brick_slab.json eb08f00651259f83f6eced0f90dd8df0e9d0d508 data/create/advancements/recipes/building_blocks/cut_ochrum_brick_slab_from_stone_types_ochrum_stonecutting.json a189e0549723cefbd19a147274cd79909dca2b70 data/create/advancements/recipes/building_blocks/cut_ochrum_brick_slab_recycling.json @@ -2861,6 +2860,7 @@ a5dc9e74ad0d18d83bad3aab8c5e2768355a2370 data/create/advancements/recipes/buildi 27a5331727199b8b8f2dd6c581e25d17d12fc1ba data/create/advancements/recipes/building_blocks/cut_ochrum_brick_stairs_from_stone_types_ochrum_stonecutting.json 648e532441c664310047c5c9c78833d2eaea5920 data/create/advancements/recipes/building_blocks/cut_ochrum_brick_wall.json 053256b7b154ba5c10d2483d86658f132296e8f5 data/create/advancements/recipes/building_blocks/cut_ochrum_brick_wall_from_stone_types_ochrum_stonecutting.json +1f8ee1a91937295484d5c2fe0186a617589c1761 data/create/advancements/recipes/building_blocks/cut_ochrum_bricks_from_stone_types_ochrum_stonecutting.json 6abb6e36229685ca26ee31b5db3074a07453435e data/create/advancements/recipes/building_blocks/cut_ochrum_from_stone_types_ochrum_stonecutting.json 0c5e92fb20048fe5d9dcd42e10fd0f9b155c385a data/create/advancements/recipes/building_blocks/cut_ochrum_slab.json 941aba0ff7967d7ea56e1f811aa6bc34d4711796 data/create/advancements/recipes/building_blocks/cut_ochrum_slab_from_stone_types_ochrum_stonecutting.json @@ -2869,7 +2869,6 @@ fa14009e4de8cfdacdbb7679473ce359f2cb85be data/create/advancements/recipes/buildi d50accd7f37bfd9384790bdd727401757f6dc7e4 data/create/advancements/recipes/building_blocks/cut_ochrum_stairs_from_stone_types_ochrum_stonecutting.json ed0a72f6393c0d16240b89241f5bbac7dc003516 data/create/advancements/recipes/building_blocks/cut_ochrum_wall.json cda838f95015b0bf02fc5427e1a69ed6302b7e20 data/create/advancements/recipes/building_blocks/cut_ochrum_wall_from_stone_types_ochrum_stonecutting.json -a51cd5a82d9b30c8a68f7cdf8dd7a6b2f883c27c data/create/advancements/recipes/building_blocks/cut_scorchia_bricks_from_stone_types_scorchia_stonecutting.json ce33e5a98a83dae1f37ad4b3d4ea148de5bcacdf data/create/advancements/recipes/building_blocks/cut_scorchia_brick_slab.json 498825e9e5502a7ec8a1f23bfe998b960d7fc9eb data/create/advancements/recipes/building_blocks/cut_scorchia_brick_slab_from_stone_types_scorchia_stonecutting.json 8ffa08b1b4e4ab37dfbf09d2ec4a37f93c9503cb data/create/advancements/recipes/building_blocks/cut_scorchia_brick_slab_recycling.json @@ -2877,6 +2876,7 @@ ce33e5a98a83dae1f37ad4b3d4ea148de5bcacdf data/create/advancements/recipes/buildi 3c4b45560f446534821da63d4e713088928e5f4a data/create/advancements/recipes/building_blocks/cut_scorchia_brick_stairs_from_stone_types_scorchia_stonecutting.json 2aba76185175fff82898a7a905d3ec4ff448deaa data/create/advancements/recipes/building_blocks/cut_scorchia_brick_wall.json ca1f54af4425df994c6707f00e43b8db3ce66280 data/create/advancements/recipes/building_blocks/cut_scorchia_brick_wall_from_stone_types_scorchia_stonecutting.json +a51cd5a82d9b30c8a68f7cdf8dd7a6b2f883c27c data/create/advancements/recipes/building_blocks/cut_scorchia_bricks_from_stone_types_scorchia_stonecutting.json df847f312960866d3d53f48297ea3169c27314eb data/create/advancements/recipes/building_blocks/cut_scorchia_from_stone_types_scorchia_stonecutting.json 8095f7be8aac4f11d618549680d537bed8a921c5 data/create/advancements/recipes/building_blocks/cut_scorchia_slab.json a53831cf7f095fa4d0d92051bd0e21f912c2d9dd data/create/advancements/recipes/building_blocks/cut_scorchia_slab_from_stone_types_scorchia_stonecutting.json @@ -2885,7 +2885,6 @@ a53831cf7f095fa4d0d92051bd0e21f912c2d9dd data/create/advancements/recipes/buildi 30f1efaa46771dd22d7f3aa34f24c69bbdb59bd5 data/create/advancements/recipes/building_blocks/cut_scorchia_stairs_from_stone_types_scorchia_stonecutting.json e02d188d64b270682fa9d335a3423880d8358a0d data/create/advancements/recipes/building_blocks/cut_scorchia_wall.json 834c5a2a8d089822fa81a75b290818db276beab7 data/create/advancements/recipes/building_blocks/cut_scorchia_wall_from_stone_types_scorchia_stonecutting.json -2030ec21c96336bd4c4040857f40ec65d1a75075 data/create/advancements/recipes/building_blocks/cut_scoria_bricks_from_stone_types_scoria_stonecutting.json 705dfcd9f4b6b8a0c360436c097cb371c27cf60d data/create/advancements/recipes/building_blocks/cut_scoria_brick_slab.json 482cf1bbb65a4facc0ebf31ea91bab4d03580635 data/create/advancements/recipes/building_blocks/cut_scoria_brick_slab_from_stone_types_scoria_stonecutting.json 51d070acfc8ad4cd8ca4457ca346458c81eaade4 data/create/advancements/recipes/building_blocks/cut_scoria_brick_slab_recycling.json @@ -2893,6 +2892,7 @@ e02d188d64b270682fa9d335a3423880d8358a0d data/create/advancements/recipes/buildi 99ca117e6a4ad242d92566a2f398c28edb3b7061 data/create/advancements/recipes/building_blocks/cut_scoria_brick_stairs_from_stone_types_scoria_stonecutting.json 01e294976d8ce71b59fb14a47e2686bdce4fab21 data/create/advancements/recipes/building_blocks/cut_scoria_brick_wall.json 0c1d31d37a17d4bd752508022ddd9690bb92a521 data/create/advancements/recipes/building_blocks/cut_scoria_brick_wall_from_stone_types_scoria_stonecutting.json +2030ec21c96336bd4c4040857f40ec65d1a75075 data/create/advancements/recipes/building_blocks/cut_scoria_bricks_from_stone_types_scoria_stonecutting.json 41f420c88dbf61d3cb51966cca9b495d10c604d3 data/create/advancements/recipes/building_blocks/cut_scoria_from_stone_types_scoria_stonecutting.json 26c8447854e29243f0697236f59e258fa96ed369 data/create/advancements/recipes/building_blocks/cut_scoria_slab.json f3e2522664de4ff2ad92a89443e064ac857b7aef data/create/advancements/recipes/building_blocks/cut_scoria_slab_from_stone_types_scoria_stonecutting.json @@ -2901,7 +2901,6 @@ a0635452fd698415e8112e9e0f6d71571901ca34 data/create/advancements/recipes/buildi 1bb047298b71a57e8632607af7b17bab2690aecb data/create/advancements/recipes/building_blocks/cut_scoria_stairs_from_stone_types_scoria_stonecutting.json a33878fe778438a746a28c1fd03ca6d01092ebe4 data/create/advancements/recipes/building_blocks/cut_scoria_wall.json 74a637d0d0f360ad692661c0213c18a06a8ec500 data/create/advancements/recipes/building_blocks/cut_scoria_wall_from_stone_types_scoria_stonecutting.json -f0870d596d9ac9e5b5272fb4e3d2c90c29f3a63d data/create/advancements/recipes/building_blocks/cut_tuff_bricks_from_stone_types_tuff_stonecutting.json b75410afdb8775b2a834ded315913e0ae38e4df8 data/create/advancements/recipes/building_blocks/cut_tuff_brick_slab.json 34c2aead2f2355a8f0f9f9aa7dba58dd5187dbba data/create/advancements/recipes/building_blocks/cut_tuff_brick_slab_from_stone_types_tuff_stonecutting.json c071c43e93cc1735bebbbf320f1b8d2cba4be1e3 data/create/advancements/recipes/building_blocks/cut_tuff_brick_slab_recycling.json @@ -2909,6 +2908,7 @@ c89ec2300425688f9e72e45c64def0b09c0219b0 data/create/advancements/recipes/buildi c882f72f5a31bc92a8186834b105a2e07d864366 data/create/advancements/recipes/building_blocks/cut_tuff_brick_stairs_from_stone_types_tuff_stonecutting.json 70295775a6170a1332f5604aaf75a026630c9e93 data/create/advancements/recipes/building_blocks/cut_tuff_brick_wall.json 1b79d0e71dae77967c1554c203e68eeb51fe8054 data/create/advancements/recipes/building_blocks/cut_tuff_brick_wall_from_stone_types_tuff_stonecutting.json +f0870d596d9ac9e5b5272fb4e3d2c90c29f3a63d data/create/advancements/recipes/building_blocks/cut_tuff_bricks_from_stone_types_tuff_stonecutting.json 549d1f911c009a3cafff4edcb37116c92c2b8e21 data/create/advancements/recipes/building_blocks/cut_tuff_from_stone_types_tuff_stonecutting.json 5bc3e40a8e50a521ebd5fa58efa3ec21064163f7 data/create/advancements/recipes/building_blocks/cut_tuff_slab.json f1ab5be6cb7287517d87b173680ddf833a1dd534 data/create/advancements/recipes/building_blocks/cut_tuff_slab_from_stone_types_tuff_stonecutting.json @@ -2917,7 +2917,6 @@ b7d19085017530f0c2122511c35dbef6a50b337f data/create/advancements/recipes/buildi 3c9541b6e4eb8ff7f7b627a75e8c38ed9eeaf342 data/create/advancements/recipes/building_blocks/cut_tuff_stairs_from_stone_types_tuff_stonecutting.json 51ca798b8bd822ddbbfe8f07073eefb948b97b42 data/create/advancements/recipes/building_blocks/cut_tuff_wall.json 1aa1a0d00c19069f0c55e698b474115d7f437355 data/create/advancements/recipes/building_blocks/cut_tuff_wall_from_stone_types_tuff_stonecutting.json -6a80920618d8e9b7919c83c419e751971440d38a data/create/advancements/recipes/building_blocks/cut_veridium_bricks_from_stone_types_veridium_stonecutting.json e263f555c3a47c83187d29ae9b816edc0c1a763b data/create/advancements/recipes/building_blocks/cut_veridium_brick_slab.json f0e84bde804e52f504cd93bee5058a89f6939dc9 data/create/advancements/recipes/building_blocks/cut_veridium_brick_slab_from_stone_types_veridium_stonecutting.json 949fe819c76fd63edfd93bef5898119c8456fda3 data/create/advancements/recipes/building_blocks/cut_veridium_brick_slab_recycling.json @@ -2925,6 +2924,7 @@ fc87560dedbc951d10d9650a6f27192e7c3a1cc5 data/create/advancements/recipes/buildi 35b09d6300ff8e86f01bc0258fca5cfa80d55c61 data/create/advancements/recipes/building_blocks/cut_veridium_brick_stairs_from_stone_types_veridium_stonecutting.json 599d9ce510531c6006a4964bb4049a850a8457ee data/create/advancements/recipes/building_blocks/cut_veridium_brick_wall.json aaaad7a65a1c05071565ca91a181ff3c375e0141 data/create/advancements/recipes/building_blocks/cut_veridium_brick_wall_from_stone_types_veridium_stonecutting.json +6a80920618d8e9b7919c83c419e751971440d38a data/create/advancements/recipes/building_blocks/cut_veridium_bricks_from_stone_types_veridium_stonecutting.json c76ae7944646e8f13ea460ba6655b95b6c2798ea data/create/advancements/recipes/building_blocks/cut_veridium_from_stone_types_veridium_stonecutting.json 3bafa8873b62cb0333b44af77f2c6e824c5b3e95 data/create/advancements/recipes/building_blocks/cut_veridium_slab.json 143f64b0e5536693262f6a62c2a6fbf85bd4203e data/create/advancements/recipes/building_blocks/cut_veridium_slab_from_stone_types_veridium_stonecutting.json @@ -3110,7 +3110,6 @@ c4c087911453bd979e028d3b3558b273e3cb5926 data/create/advancements/recipes/buildi 780bb3d13fcd8abf6e166b04566b141e023ee11e data/create/advancements/recipes/building_blocks/scorchia_pillar_from_stone_types_scorchia_stonecutting.json 5c5c5080c1136c046caee2d14dd2c3c9f09abad3 data/create/advancements/recipes/building_blocks/scoria_from_stone_types_scoria_stonecutting.json 5a6b12869ffcbd1d9b4fbe1fee444fcde95d2953 data/create/advancements/recipes/building_blocks/scoria_pillar_from_stone_types_scoria_stonecutting.json -a51ca3151c517113338720edeac0e02a46ebb03a data/create/advancements/recipes/building_blocks/small_andesite_bricks_from_stone_types_andesite_stonecutting.json f72093994236a0580c6cafd08fb42f061733de01 data/create/advancements/recipes/building_blocks/small_andesite_brick_slab.json 05092201e6c514d3eae566fb1ce98ad415660112 data/create/advancements/recipes/building_blocks/small_andesite_brick_slab_from_stone_types_andesite_stonecutting.json 0e41d75b613a0ebd0c023669dcfd34f11b14fd0e data/create/advancements/recipes/building_blocks/small_andesite_brick_slab_recycling.json @@ -3118,7 +3117,7 @@ f72093994236a0580c6cafd08fb42f061733de01 data/create/advancements/recipes/buildi 8bbf898cbc47ac7a326c0d082a92a452b6915a7e data/create/advancements/recipes/building_blocks/small_andesite_brick_stairs_from_stone_types_andesite_stonecutting.json 9e0685dd668550c67812d1caccd8c8cae9f2041c data/create/advancements/recipes/building_blocks/small_andesite_brick_wall.json 7a1bfa848f950482f82d7fe7a9cf3cf916f91702 data/create/advancements/recipes/building_blocks/small_andesite_brick_wall_from_stone_types_andesite_stonecutting.json -0bfa788d0038077a88678ff16104a8b82038b3da data/create/advancements/recipes/building_blocks/small_asurine_bricks_from_stone_types_asurine_stonecutting.json +a51ca3151c517113338720edeac0e02a46ebb03a data/create/advancements/recipes/building_blocks/small_andesite_bricks_from_stone_types_andesite_stonecutting.json 3dccee988c08e1988886d9f09f2b5b42332ac083 data/create/advancements/recipes/building_blocks/small_asurine_brick_slab.json 438469fb06dff95a0ab9e0cb183795432d9b78dd data/create/advancements/recipes/building_blocks/small_asurine_brick_slab_from_stone_types_asurine_stonecutting.json 3eb65706d975e6f1e429f43d7384272a58872f10 data/create/advancements/recipes/building_blocks/small_asurine_brick_slab_recycling.json @@ -3126,7 +3125,7 @@ fb8cab1a3ecef97eaf7d744bb0d1d09d46859b60 data/create/advancements/recipes/buildi 525fff52f5dea3178356b7c5f7606d2a369b346e data/create/advancements/recipes/building_blocks/small_asurine_brick_stairs_from_stone_types_asurine_stonecutting.json 39df7ef2b88df45ba4a06bfa9cd7f863f813cb30 data/create/advancements/recipes/building_blocks/small_asurine_brick_wall.json 21aa9dc72b12eb0a33cdc9904ee595de802b55f4 data/create/advancements/recipes/building_blocks/small_asurine_brick_wall_from_stone_types_asurine_stonecutting.json -46666ef8d341971cdd989f14575973777a85cdc6 data/create/advancements/recipes/building_blocks/small_calcite_bricks_from_stone_types_calcite_stonecutting.json +0bfa788d0038077a88678ff16104a8b82038b3da data/create/advancements/recipes/building_blocks/small_asurine_bricks_from_stone_types_asurine_stonecutting.json d61fce64a295a2c3b9433bc27ac50f4f1f6a678d data/create/advancements/recipes/building_blocks/small_calcite_brick_slab.json 7f2e73d01b9bff473c4ecf76ab967b3aa934ff87 data/create/advancements/recipes/building_blocks/small_calcite_brick_slab_from_stone_types_calcite_stonecutting.json 1095487af055116acc2eba87d92dd0918385e9ac data/create/advancements/recipes/building_blocks/small_calcite_brick_slab_recycling.json @@ -3134,7 +3133,7 @@ d61fce64a295a2c3b9433bc27ac50f4f1f6a678d data/create/advancements/recipes/buildi e3bd0900dc92b26fe69c7f4e81db76678505222b data/create/advancements/recipes/building_blocks/small_calcite_brick_stairs_from_stone_types_calcite_stonecutting.json c88fb3af07c32aa127cbe0043075f50fed869839 data/create/advancements/recipes/building_blocks/small_calcite_brick_wall.json ea58b78e177134c73ed5bfb081761f90cc7caa3e data/create/advancements/recipes/building_blocks/small_calcite_brick_wall_from_stone_types_calcite_stonecutting.json -c48216f26cfe93ce99f7f2f0e9f68d1ee2a95e46 data/create/advancements/recipes/building_blocks/small_crimsite_bricks_from_stone_types_crimsite_stonecutting.json +46666ef8d341971cdd989f14575973777a85cdc6 data/create/advancements/recipes/building_blocks/small_calcite_bricks_from_stone_types_calcite_stonecutting.json ed4d6e7779749dd647f744f0486e78b93057aa33 data/create/advancements/recipes/building_blocks/small_crimsite_brick_slab.json 7f3ad6d79eb9d433d5a0e295eb2b099a5f815876 data/create/advancements/recipes/building_blocks/small_crimsite_brick_slab_from_stone_types_crimsite_stonecutting.json b980fcc4b29f9ff897dd867222fc4248d76e808a data/create/advancements/recipes/building_blocks/small_crimsite_brick_slab_recycling.json @@ -3142,7 +3141,7 @@ b980fcc4b29f9ff897dd867222fc4248d76e808a data/create/advancements/recipes/buildi c06600eda4e4bd7c46e4e315a0569fbdfa4bb087 data/create/advancements/recipes/building_blocks/small_crimsite_brick_stairs_from_stone_types_crimsite_stonecutting.json 4021a4a761b06def09f19d6a60bc0722e69ec08d data/create/advancements/recipes/building_blocks/small_crimsite_brick_wall.json 2d8eae517a914e93538307efe23d532582d487e2 data/create/advancements/recipes/building_blocks/small_crimsite_brick_wall_from_stone_types_crimsite_stonecutting.json -ed82f0fac452147faa997af1d45278f501ef165b data/create/advancements/recipes/building_blocks/small_deepslate_bricks_from_stone_types_deepslate_stonecutting.json +c48216f26cfe93ce99f7f2f0e9f68d1ee2a95e46 data/create/advancements/recipes/building_blocks/small_crimsite_bricks_from_stone_types_crimsite_stonecutting.json e4674821cc17adadecacc55d48c028847caf5fea data/create/advancements/recipes/building_blocks/small_deepslate_brick_slab.json 8c0c51d052b110fec3668618be2bdeaf8d0c7cc5 data/create/advancements/recipes/building_blocks/small_deepslate_brick_slab_from_stone_types_deepslate_stonecutting.json f8f7ace802b6c73fabfabbaae1c1383a3c0bcf6b data/create/advancements/recipes/building_blocks/small_deepslate_brick_slab_recycling.json @@ -3150,7 +3149,7 @@ e2e16c3c0e761ef44f9b21ae3bd95300a33459be data/create/advancements/recipes/buildi 37ef4192f1db7dd5c066a47480f86f60687c9894 data/create/advancements/recipes/building_blocks/small_deepslate_brick_stairs_from_stone_types_deepslate_stonecutting.json 6f4d365ce26fb4081a5af0f6e21631209b5b106d data/create/advancements/recipes/building_blocks/small_deepslate_brick_wall.json e0c7377c55dc94b8efd62cb6f57325c94206cbf4 data/create/advancements/recipes/building_blocks/small_deepslate_brick_wall_from_stone_types_deepslate_stonecutting.json -9bb23924495112ba177d12ba2a5adcb872a2b76f data/create/advancements/recipes/building_blocks/small_diorite_bricks_from_stone_types_diorite_stonecutting.json +ed82f0fac452147faa997af1d45278f501ef165b data/create/advancements/recipes/building_blocks/small_deepslate_bricks_from_stone_types_deepslate_stonecutting.json d4b96bcd8902e9bce19603abb99cb7edeb260189 data/create/advancements/recipes/building_blocks/small_diorite_brick_slab.json 2ed3800996491c9a1db23d9cbed04cc5ee963df6 data/create/advancements/recipes/building_blocks/small_diorite_brick_slab_from_stone_types_diorite_stonecutting.json 895d2158ba0783c5fd97b802ef5866d7532df6ba data/create/advancements/recipes/building_blocks/small_diorite_brick_slab_recycling.json @@ -3158,7 +3157,7 @@ d4b96bcd8902e9bce19603abb99cb7edeb260189 data/create/advancements/recipes/buildi 0f4b92965c05ddf71fa24b2b08a0cce358ac8dd1 data/create/advancements/recipes/building_blocks/small_diorite_brick_stairs_from_stone_types_diorite_stonecutting.json 633d921515fb4ad0e3177f3c8f151da80008053b data/create/advancements/recipes/building_blocks/small_diorite_brick_wall.json 3dea60492331bcd3253d90534559cc0bdb0822ae data/create/advancements/recipes/building_blocks/small_diorite_brick_wall_from_stone_types_diorite_stonecutting.json -632ced3760d55b56d1620e447b8b762e0e4a29f3 data/create/advancements/recipes/building_blocks/small_dripstone_bricks_from_stone_types_dripstone_stonecutting.json +9bb23924495112ba177d12ba2a5adcb872a2b76f data/create/advancements/recipes/building_blocks/small_diorite_bricks_from_stone_types_diorite_stonecutting.json 92bb21a400d9720a2f06882049d5b3863a93969d data/create/advancements/recipes/building_blocks/small_dripstone_brick_slab.json 02e2b98eeef9cdc20a8678beec4c7aa8a6cde948 data/create/advancements/recipes/building_blocks/small_dripstone_brick_slab_from_stone_types_dripstone_stonecutting.json 35830242bc48b1355830d6cb17dc4dc547d51bc0 data/create/advancements/recipes/building_blocks/small_dripstone_brick_slab_recycling.json @@ -3166,7 +3165,7 @@ d4b96bcd8902e9bce19603abb99cb7edeb260189 data/create/advancements/recipes/buildi 92523f3058a580743f95e9347fa97e0f5f6483f6 data/create/advancements/recipes/building_blocks/small_dripstone_brick_stairs_from_stone_types_dripstone_stonecutting.json 6e26ab4ad96225b7dd1a4aa06295b0d85e87400b data/create/advancements/recipes/building_blocks/small_dripstone_brick_wall.json e30a5f31d6478dfe7693077727b1abfc40b33f9b data/create/advancements/recipes/building_blocks/small_dripstone_brick_wall_from_stone_types_dripstone_stonecutting.json -1805b7f9db21b4530b173ab6945584e7d852b218 data/create/advancements/recipes/building_blocks/small_granite_bricks_from_stone_types_granite_stonecutting.json +632ced3760d55b56d1620e447b8b762e0e4a29f3 data/create/advancements/recipes/building_blocks/small_dripstone_bricks_from_stone_types_dripstone_stonecutting.json a2929bbd4c81b9601aeca74110936343102b7b5a data/create/advancements/recipes/building_blocks/small_granite_brick_slab.json 0fa83c337d5612e2b8368d5bff34117e0c1cf40a data/create/advancements/recipes/building_blocks/small_granite_brick_slab_from_stone_types_granite_stonecutting.json 0bc47cb22cc70a34879092a57c87551e6fa9f634 data/create/advancements/recipes/building_blocks/small_granite_brick_slab_recycling.json @@ -3174,7 +3173,7 @@ a2929bbd4c81b9601aeca74110936343102b7b5a data/create/advancements/recipes/buildi 44f3e71a4e8b78db74a21a42c3cebfbc15fe0180 data/create/advancements/recipes/building_blocks/small_granite_brick_stairs_from_stone_types_granite_stonecutting.json 3a6edafcb559e767caf421cf1bd6e064940f33e2 data/create/advancements/recipes/building_blocks/small_granite_brick_wall.json cac9914c729c0ecf5e9e1b4fe6498005e7c532f3 data/create/advancements/recipes/building_blocks/small_granite_brick_wall_from_stone_types_granite_stonecutting.json -1ca86b11356749caf7515fc61b8ac5de53d019f6 data/create/advancements/recipes/building_blocks/small_limestone_bricks_from_stone_types_limestone_stonecutting.json +1805b7f9db21b4530b173ab6945584e7d852b218 data/create/advancements/recipes/building_blocks/small_granite_bricks_from_stone_types_granite_stonecutting.json 4f3cc93f422ee9f05587b89d6729a6cc86f572c0 data/create/advancements/recipes/building_blocks/small_limestone_brick_slab.json 02d0c45cd014fd660a9d3eb1c1c6b40ba806b2fb data/create/advancements/recipes/building_blocks/small_limestone_brick_slab_from_stone_types_limestone_stonecutting.json 8fb46bce94f6cca943e4ae427c04d9617ada277d data/create/advancements/recipes/building_blocks/small_limestone_brick_slab_recycling.json @@ -3182,7 +3181,7 @@ cac9914c729c0ecf5e9e1b4fe6498005e7c532f3 data/create/advancements/recipes/buildi 00b61a4d23f8b16a7e4d9bf46fbe52c6b5dd561c data/create/advancements/recipes/building_blocks/small_limestone_brick_stairs_from_stone_types_limestone_stonecutting.json 7c6b80f174687efe10007c0235f2a68db7062b12 data/create/advancements/recipes/building_blocks/small_limestone_brick_wall.json 7f9ade635dcda8d5baae2bbdddc018bcc715f681 data/create/advancements/recipes/building_blocks/small_limestone_brick_wall_from_stone_types_limestone_stonecutting.json -bab018a0adcbc0582ba756158941a87923b20384 data/create/advancements/recipes/building_blocks/small_ochrum_bricks_from_stone_types_ochrum_stonecutting.json +1ca86b11356749caf7515fc61b8ac5de53d019f6 data/create/advancements/recipes/building_blocks/small_limestone_bricks_from_stone_types_limestone_stonecutting.json 9c98b7b56f92f6adc75473f5b0ae4dc69ac8aa9a data/create/advancements/recipes/building_blocks/small_ochrum_brick_slab.json 611fb57772f1446236256f1235751dec6f81cd0e data/create/advancements/recipes/building_blocks/small_ochrum_brick_slab_from_stone_types_ochrum_stonecutting.json 243821a2c3e465f5346ad58e0afda624c09ab946 data/create/advancements/recipes/building_blocks/small_ochrum_brick_slab_recycling.json @@ -3190,8 +3189,8 @@ b9a16792e6158a2923454c9a44d9c176c9607c24 data/create/advancements/recipes/buildi bb91a8ba1ef1c8cb725f18a4d577bb476b9ae68d data/create/advancements/recipes/building_blocks/small_ochrum_brick_stairs_from_stone_types_ochrum_stonecutting.json 5cf5574da0b29895960fa7f0fd63d3f81814f7b3 data/create/advancements/recipes/building_blocks/small_ochrum_brick_wall.json 1b5d14c921a85a3a5cdb9f845d4f0ddf98f87347 data/create/advancements/recipes/building_blocks/small_ochrum_brick_wall_from_stone_types_ochrum_stonecutting.json +bab018a0adcbc0582ba756158941a87923b20384 data/create/advancements/recipes/building_blocks/small_ochrum_bricks_from_stone_types_ochrum_stonecutting.json 8d6ccacf1af917094b1688ed70dc75bf54611e93 data/create/advancements/recipes/building_blocks/small_rose_quartz_tiles_from_polished_rose_quartz_stonecutting.json -7d679c66588f8a717619a7f89861d57ec04f04a1 data/create/advancements/recipes/building_blocks/small_scorchia_bricks_from_stone_types_scorchia_stonecutting.json 2003f1248faaeb4fe6761febda8e29d087f99dc7 data/create/advancements/recipes/building_blocks/small_scorchia_brick_slab.json ff5c50697aefe21c1570230a13255c912744b629 data/create/advancements/recipes/building_blocks/small_scorchia_brick_slab_from_stone_types_scorchia_stonecutting.json 8d1fd41b03940add231fa207d3ddaa1f78cf2b85 data/create/advancements/recipes/building_blocks/small_scorchia_brick_slab_recycling.json @@ -3199,7 +3198,7 @@ ff5c50697aefe21c1570230a13255c912744b629 data/create/advancements/recipes/buildi 8586f387cc9bb74250369373348005f6aa686af2 data/create/advancements/recipes/building_blocks/small_scorchia_brick_stairs_from_stone_types_scorchia_stonecutting.json 94552be031c17f5ef9d97cf5fe33beb15141291f data/create/advancements/recipes/building_blocks/small_scorchia_brick_wall.json 86e866f92095b03b5d77a91425e5e2ef307f4852 data/create/advancements/recipes/building_blocks/small_scorchia_brick_wall_from_stone_types_scorchia_stonecutting.json -e542cd94f84a90530332608b1040e2e6189a51fe data/create/advancements/recipes/building_blocks/small_scoria_bricks_from_stone_types_scoria_stonecutting.json +7d679c66588f8a717619a7f89861d57ec04f04a1 data/create/advancements/recipes/building_blocks/small_scorchia_bricks_from_stone_types_scorchia_stonecutting.json ad4c35afd6c3d55b356e38289c64e8cf6d194d10 data/create/advancements/recipes/building_blocks/small_scoria_brick_slab.json 2f1acca02bb5a40bf174ceeb5272ba1243b8635c data/create/advancements/recipes/building_blocks/small_scoria_brick_slab_from_stone_types_scoria_stonecutting.json dba264e073eab7b2fb1494cb117574b6a6b83919 data/create/advancements/recipes/building_blocks/small_scoria_brick_slab_recycling.json @@ -3207,7 +3206,7 @@ dba264e073eab7b2fb1494cb117574b6a6b83919 data/create/advancements/recipes/buildi 0e64e1dc80a0b84e05260191951ed930a8e578f6 data/create/advancements/recipes/building_blocks/small_scoria_brick_stairs_from_stone_types_scoria_stonecutting.json 95b866fac218affb9aac93272f5436e30dd4678c data/create/advancements/recipes/building_blocks/small_scoria_brick_wall.json 23493359766c969d2fa64575c5af047e6a924373 data/create/advancements/recipes/building_blocks/small_scoria_brick_wall_from_stone_types_scoria_stonecutting.json -b7fc4fbd0d6ce28946b5cbef40d86de3ca37f695 data/create/advancements/recipes/building_blocks/small_tuff_bricks_from_stone_types_tuff_stonecutting.json +e542cd94f84a90530332608b1040e2e6189a51fe data/create/advancements/recipes/building_blocks/small_scoria_bricks_from_stone_types_scoria_stonecutting.json 03acb1becaa3c7f6fc0ced99e6afcf4ac0ec4cb2 data/create/advancements/recipes/building_blocks/small_tuff_brick_slab.json 599693bc47bfd65cc9e3babc0a2f33c0d2bbfd31 data/create/advancements/recipes/building_blocks/small_tuff_brick_slab_from_stone_types_tuff_stonecutting.json aae2cb75ee4b9312e79dfea519c35f5e20ed4da6 data/create/advancements/recipes/building_blocks/small_tuff_brick_slab_recycling.json @@ -3215,7 +3214,7 @@ c72364e32b82f45f17491dd41967373c35d8dfb5 data/create/advancements/recipes/buildi 369763433d6af43d94392e870b3d861f739ba0f9 data/create/advancements/recipes/building_blocks/small_tuff_brick_stairs_from_stone_types_tuff_stonecutting.json 506bbae420bff66d492214c49dabf52e5cbcf6e4 data/create/advancements/recipes/building_blocks/small_tuff_brick_wall.json 6db7e4b981ec28c776988a531c03dbe28fb0a1c2 data/create/advancements/recipes/building_blocks/small_tuff_brick_wall_from_stone_types_tuff_stonecutting.json -9fd6e20a4555b591b17ef225316782de333780fa data/create/advancements/recipes/building_blocks/small_veridium_bricks_from_stone_types_veridium_stonecutting.json +b7fc4fbd0d6ce28946b5cbef40d86de3ca37f695 data/create/advancements/recipes/building_blocks/small_tuff_bricks_from_stone_types_tuff_stonecutting.json b61a773f683c415617a408fa0781e7e7d61cb1af data/create/advancements/recipes/building_blocks/small_veridium_brick_slab.json 526a5323263292bd091c03231a156e18460c34a1 data/create/advancements/recipes/building_blocks/small_veridium_brick_slab_from_stone_types_veridium_stonecutting.json ef040b7189b17cce9dd69c47af61c7abca6f43cd data/create/advancements/recipes/building_blocks/small_veridium_brick_slab_recycling.json @@ -3223,6 +3222,7 @@ ef040b7189b17cce9dd69c47af61c7abca6f43cd data/create/advancements/recipes/buildi 6a12b73815434a544881680cb071f273a75f62a5 data/create/advancements/recipes/building_blocks/small_veridium_brick_stairs_from_stone_types_veridium_stonecutting.json e6dfacd8f2f57d4df42927783750254f7163251a data/create/advancements/recipes/building_blocks/small_veridium_brick_wall.json ee4012cc014539be113ace8f80e51c85d2daead9 data/create/advancements/recipes/building_blocks/small_veridium_brick_wall_from_stone_types_veridium_stonecutting.json +9fd6e20a4555b591b17ef225316782de333780fa data/create/advancements/recipes/building_blocks/small_veridium_bricks_from_stone_types_veridium_stonecutting.json 03a87030672d40b0b2b6ad085103c9a5cef067ce data/create/advancements/recipes/building_blocks/spruce_window.json dfea65f25ebcbe0caf2694dec3d3ea616e2e9291 data/create/advancements/recipes/building_blocks/spruce_window_pane.json 763b3b49296a284f41cbccdc7f1ffb13c89d42db data/create/advancements/recipes/building_blocks/tiled_glass_from_glass_colorless_stonecutting.json @@ -3376,13 +3376,13 @@ fa0856e11351ad0882de2066569807e782071881 data/create/loot_tables/blocks/copper_b 0937b9f634b86dbe41e07eda52c69993fce60fb5 data/create/loot_tables/blocks/copper_door.json 8ed70d812f38adfa147db07a4f2bbe206a69ad20 data/create/loot_tables/blocks/copper_ladder.json ac621731ca23e6fbb1003be59edacdf837dbc37e data/create/loot_tables/blocks/copper_scaffolding.json -9be387731859ccc3aec7701c1804ddc3c5dde216 data/create/loot_tables/blocks/copper_shingles.json be31f0c68bfe80dff88959bd30ef9a9080dd3b3b data/create/loot_tables/blocks/copper_shingle_slab.json 83ae2652a2df217730d6fb34a65c3962e82a961d data/create/loot_tables/blocks/copper_shingle_stairs.json +9be387731859ccc3aec7701c1804ddc3c5dde216 data/create/loot_tables/blocks/copper_shingles.json f6a29868a011d9ad73bc29be94ec2a07a2626323 data/create/loot_tables/blocks/copper_table_cloth.json -9cb359c96543d7421250c4ef4e83a5e170974efb data/create/loot_tables/blocks/copper_tiles.json adbe83d6bf88dd7d2b0b8788bb619cedd37f59d9 data/create/loot_tables/blocks/copper_tile_slab.json 1e06f16b1fa8e78af5cbfc90ba8ff1136de83d2d data/create/loot_tables/blocks/copper_tile_stairs.json +9cb359c96543d7421250c4ef4e83a5e170974efb data/create/loot_tables/blocks/copper_tiles.json 4f75cad20e6b091d1f07cf3db98520d2dc3af5e7 data/create/loot_tables/blocks/copper_valve_handle.json 14a493a7bad6bd399b662da470b71810bd56e812 data/create/loot_tables/blocks/copycat_bars.json 3a2f3ab0834a0c5089ba0a11f5e9784ce59ef6d8 data/create/loot_tables/blocks/copycat_base.json @@ -3398,114 +3398,114 @@ d5d2f565bab2e2b81b0798fc7ce0e21acd362ce5 data/create/loot_tables/blocks/crimson_ b892718d33caf0c260b902c92f46f3bfd827af45 data/create/loot_tables/blocks/crushing_wheel.json ff7853a5d5c0f3bddbcfe07e47efd1ff04b14f0a data/create/loot_tables/blocks/cuckoo_clock.json 9083b026ee254645430434b67c2ba7a842f888bf data/create/loot_tables/blocks/cut_andesite.json -c1aa69f80ba11dd52fb3627fc32377599f5ff887 data/create/loot_tables/blocks/cut_andesite_bricks.json c74a4cac08ab1f66146466ff9fb40c8f210de63c data/create/loot_tables/blocks/cut_andesite_brick_slab.json df3f5dcbf676106800bc1113bb022658eb5e85d6 data/create/loot_tables/blocks/cut_andesite_brick_stairs.json 95c5a4a3327f522d986d7baaa747fce5ead8c032 data/create/loot_tables/blocks/cut_andesite_brick_wall.json +c1aa69f80ba11dd52fb3627fc32377599f5ff887 data/create/loot_tables/blocks/cut_andesite_bricks.json cb6cf8aefaac1e00596bd64a182a329dbba7e659 data/create/loot_tables/blocks/cut_andesite_slab.json 7106a637809dcbeb9d4a02a7ff9dc52f7fd9d7a2 data/create/loot_tables/blocks/cut_andesite_stairs.json e3cfa2ecb0b90ebe07cc98f8e47d22d2c0da67e5 data/create/loot_tables/blocks/cut_andesite_wall.json 75eacbc0656e7a83a20a054755ea7d7d78af983d data/create/loot_tables/blocks/cut_asurine.json -f780d37b956ed734cafcbe42b77f1a8ebfa33350 data/create/loot_tables/blocks/cut_asurine_bricks.json 43ad24bb9da878111f3606a17ef9b45bcc4964ae data/create/loot_tables/blocks/cut_asurine_brick_slab.json 8f4d0af32546b6cc77c68a08dc74494b8be1b7c3 data/create/loot_tables/blocks/cut_asurine_brick_stairs.json bb9ce58aa5b4e38c4d3b29aa8e0d905054023eae data/create/loot_tables/blocks/cut_asurine_brick_wall.json +f780d37b956ed734cafcbe42b77f1a8ebfa33350 data/create/loot_tables/blocks/cut_asurine_bricks.json 972ca04f91a1ce4d35995c14e1b17f773b15b61e data/create/loot_tables/blocks/cut_asurine_slab.json a55778dd8735286c3abc65046186b6b8dff0367e data/create/loot_tables/blocks/cut_asurine_stairs.json 70284c686f16d215ff1a8fb19bbe36fddbd31e18 data/create/loot_tables/blocks/cut_asurine_wall.json 0f450ecf60c5d201f332b2736c552d0b51b159b8 data/create/loot_tables/blocks/cut_calcite.json -aec526af372816f306826eefe4a6318db7964892 data/create/loot_tables/blocks/cut_calcite_bricks.json ec0d2854433ac4f58e53685c69dc19629fee16ca data/create/loot_tables/blocks/cut_calcite_brick_slab.json 584e39fa0b78ba8649f69b53f9f032dd1532d6ac data/create/loot_tables/blocks/cut_calcite_brick_stairs.json cc9cbdb7a50305e47181b2452bfce887f9879437 data/create/loot_tables/blocks/cut_calcite_brick_wall.json +aec526af372816f306826eefe4a6318db7964892 data/create/loot_tables/blocks/cut_calcite_bricks.json b4e5b6d5cb63b7b1a4fe639fd727a381bfd00588 data/create/loot_tables/blocks/cut_calcite_slab.json ca83b89401dba12341e6f26786103c10c90447ca data/create/loot_tables/blocks/cut_calcite_stairs.json 64df1c4a373c28bf9be3630935b01a43abd22e03 data/create/loot_tables/blocks/cut_calcite_wall.json 5df3a2229657d7b616790e922b1d1d558b4a5128 data/create/loot_tables/blocks/cut_crimsite.json -59cb609bc9671ac481832eeaf942533c6861fc0e data/create/loot_tables/blocks/cut_crimsite_bricks.json 6fee8d6425e1c832abed8fd9bccc8e6fae9441fc data/create/loot_tables/blocks/cut_crimsite_brick_slab.json 3123bc9e6123dfeda9bb3cece5c2220ac8485535 data/create/loot_tables/blocks/cut_crimsite_brick_stairs.json 56a8c7b1588f6fa9a1fb438e91b04673e02a0c86 data/create/loot_tables/blocks/cut_crimsite_brick_wall.json +59cb609bc9671ac481832eeaf942533c6861fc0e data/create/loot_tables/blocks/cut_crimsite_bricks.json 90ed82b09f2650ee913956d62803d15fc4c0bdbd data/create/loot_tables/blocks/cut_crimsite_slab.json 0e237e008523ed3e9934c598a708be533aaa0861 data/create/loot_tables/blocks/cut_crimsite_stairs.json 48e1edca75186f160a12fa26ac262c7f86d62c82 data/create/loot_tables/blocks/cut_crimsite_wall.json 7bfe4d183ed26de1d7b241c27880a70d28426502 data/create/loot_tables/blocks/cut_deepslate.json -6e375a42ddf38c99fee86531471573716e27fa44 data/create/loot_tables/blocks/cut_deepslate_bricks.json fa4b940ad8ee432ee0fabf496d2da3d5039c204a data/create/loot_tables/blocks/cut_deepslate_brick_slab.json 1063a94b3e90a52a7492d85b1c086514333f3421 data/create/loot_tables/blocks/cut_deepslate_brick_stairs.json 878d809a038c626e8054f9b71e27be08388d7615 data/create/loot_tables/blocks/cut_deepslate_brick_wall.json +6e375a42ddf38c99fee86531471573716e27fa44 data/create/loot_tables/blocks/cut_deepslate_bricks.json 7b5e46aaf34d71993f50b5b6fa1cd5d7ea64264c data/create/loot_tables/blocks/cut_deepslate_slab.json 7d45e8bb037a1e550132854200d57ce31e073993 data/create/loot_tables/blocks/cut_deepslate_stairs.json cd80fd4f573d59c22f0b9799f1ba7422215d4ff1 data/create/loot_tables/blocks/cut_deepslate_wall.json d79d52657307a30422d9ff2eb1caad78024c24f7 data/create/loot_tables/blocks/cut_diorite.json -9f627b6449ae27a1990b84a60349736129a11e39 data/create/loot_tables/blocks/cut_diorite_bricks.json 1809235166024fa74f65a96b622faa8eddf4ce14 data/create/loot_tables/blocks/cut_diorite_brick_slab.json a6bb9fb4eee3dab9a540b228801ce100c048c2a7 data/create/loot_tables/blocks/cut_diorite_brick_stairs.json 690a938a04543cb60f2952335be26b2df9c75715 data/create/loot_tables/blocks/cut_diorite_brick_wall.json +9f627b6449ae27a1990b84a60349736129a11e39 data/create/loot_tables/blocks/cut_diorite_bricks.json 208999222adb5b1cd4fa47b85000841dbae4ad21 data/create/loot_tables/blocks/cut_diorite_slab.json 12849a868e8dff48ebb688c84fc53d4cee2a4eaa data/create/loot_tables/blocks/cut_diorite_stairs.json 469fffcdd40aea22fedb81b7778cc3c61928f3fd data/create/loot_tables/blocks/cut_diorite_wall.json 302d0bb640f696109fe4edc0c1fa9db332231511 data/create/loot_tables/blocks/cut_dripstone.json -48707f37b94ff1a930ee45bb9e8b6b4b67226945 data/create/loot_tables/blocks/cut_dripstone_bricks.json eb31bc108180e2248d575d5d72325b5585254af0 data/create/loot_tables/blocks/cut_dripstone_brick_slab.json 9b624a456baf55960675d7857e159f69911a281a data/create/loot_tables/blocks/cut_dripstone_brick_stairs.json b4c754d4d5a6c28f537c2d73844e39059b2c1450 data/create/loot_tables/blocks/cut_dripstone_brick_wall.json +48707f37b94ff1a930ee45bb9e8b6b4b67226945 data/create/loot_tables/blocks/cut_dripstone_bricks.json eb9eca9a69f763cbe81dc79375ef76978594b51e data/create/loot_tables/blocks/cut_dripstone_slab.json 47fae3abc8bea3ee802d6759192e631f50329c5f data/create/loot_tables/blocks/cut_dripstone_stairs.json 70b71cc460cba2955694baf0550eadc2187e3a8a data/create/loot_tables/blocks/cut_dripstone_wall.json 26433a16a91414be15b20dc85b81b76d086be889 data/create/loot_tables/blocks/cut_granite.json -65c3936e78a90c53faa0b9f9b3034afc2728e7b9 data/create/loot_tables/blocks/cut_granite_bricks.json c6b8dfa87e9c33a0dd2b3398dcc524347e826d44 data/create/loot_tables/blocks/cut_granite_brick_slab.json 5e00417f06b4d357e7469f0efa6e319dfc587da3 data/create/loot_tables/blocks/cut_granite_brick_stairs.json 8d8779846af8121426f128cc7b5d501037bd1cd4 data/create/loot_tables/blocks/cut_granite_brick_wall.json +65c3936e78a90c53faa0b9f9b3034afc2728e7b9 data/create/loot_tables/blocks/cut_granite_bricks.json 6e7253b2801611b4698e786f495c2ade1088ee0b data/create/loot_tables/blocks/cut_granite_slab.json de8c10fb2c7409a3375f2db5cdce2027c3f419bd data/create/loot_tables/blocks/cut_granite_stairs.json cdf40bb46d9457a66129b300dc4d3f0160cc1de2 data/create/loot_tables/blocks/cut_granite_wall.json ac5f062c7fc270c63d67ccecf19499a9e91fa1c4 data/create/loot_tables/blocks/cut_limestone.json -b60fb652e1f83b1af12a15cb47450bd9a6087f6a data/create/loot_tables/blocks/cut_limestone_bricks.json 3b6d3a9b12cf1c2a20bf337cc0155bb66967f0ee data/create/loot_tables/blocks/cut_limestone_brick_slab.json 701249cc12b7aa6f5cc1691ac4dd17e665aa2180 data/create/loot_tables/blocks/cut_limestone_brick_stairs.json 3b8c5eef9b0e8c35e8573ce91f5fddbac7f76f24 data/create/loot_tables/blocks/cut_limestone_brick_wall.json +b60fb652e1f83b1af12a15cb47450bd9a6087f6a data/create/loot_tables/blocks/cut_limestone_bricks.json ba186786e8677f1c769e8f231fe872c48330e13a data/create/loot_tables/blocks/cut_limestone_slab.json d354966d57804afda39ff27336d8b0f38acf6ea3 data/create/loot_tables/blocks/cut_limestone_stairs.json 28b4eee2c6da259e50c58a51905fa2b79a9b89ef data/create/loot_tables/blocks/cut_limestone_wall.json b3d6d90dd0c3e9d4b47d1f87d5abc354dd8c1447 data/create/loot_tables/blocks/cut_ochrum.json -5856859aae0cc633cbd9d83ea7cf7910ce1a88de data/create/loot_tables/blocks/cut_ochrum_bricks.json 67cadc71d90fb2527b9b2b72a74463d71571e493 data/create/loot_tables/blocks/cut_ochrum_brick_slab.json 487b3e7dc1d9d07183b9b699e33f6371858435aa data/create/loot_tables/blocks/cut_ochrum_brick_stairs.json 289757860f07b63dcce531a74ce7e60b4669c51b data/create/loot_tables/blocks/cut_ochrum_brick_wall.json +5856859aae0cc633cbd9d83ea7cf7910ce1a88de data/create/loot_tables/blocks/cut_ochrum_bricks.json c9deec5e3c7343afa3d013704179e2147b2eb7ec data/create/loot_tables/blocks/cut_ochrum_slab.json e851d829db8ea4398bc1cbe6e743b4fba98d3413 data/create/loot_tables/blocks/cut_ochrum_stairs.json 5dce8524b70baeefaeba13422f5900b1a161a867 data/create/loot_tables/blocks/cut_ochrum_wall.json 293064edf2909db8c9edc26bedd1cc023c647664 data/create/loot_tables/blocks/cut_scorchia.json -767910313f0983ebfb49b80526747d762cbdf782 data/create/loot_tables/blocks/cut_scorchia_bricks.json 895c4b9cc71701a26ae0e765ee67f0c06cc70a9c data/create/loot_tables/blocks/cut_scorchia_brick_slab.json c53d72176cb5dd93977975dd84647391fa563e3a data/create/loot_tables/blocks/cut_scorchia_brick_stairs.json 460232ca38cba2f0adc5316d6db8db94db231953 data/create/loot_tables/blocks/cut_scorchia_brick_wall.json +767910313f0983ebfb49b80526747d762cbdf782 data/create/loot_tables/blocks/cut_scorchia_bricks.json c8201964d877a932fe9a9a2d0360004440f7c380 data/create/loot_tables/blocks/cut_scorchia_slab.json dfd09849dbf48a064269a5ea28d0422caa87e4d4 data/create/loot_tables/blocks/cut_scorchia_stairs.json bd5304e38bb92a445c159e9fe647b906e28b232e data/create/loot_tables/blocks/cut_scorchia_wall.json 6b87a22c39b545d5be92e476751b99ceb4bef740 data/create/loot_tables/blocks/cut_scoria.json -833252d2d63c7502f6f0d7981673a8081046c944 data/create/loot_tables/blocks/cut_scoria_bricks.json 659e86f89499539e435989c2eb29e88e9a0ff9f4 data/create/loot_tables/blocks/cut_scoria_brick_slab.json 8434d461090bc43328eec0b4249d27a9ba383707 data/create/loot_tables/blocks/cut_scoria_brick_stairs.json e3f853395b9b6fb7d5bb103c121a77e04526a9e8 data/create/loot_tables/blocks/cut_scoria_brick_wall.json +833252d2d63c7502f6f0d7981673a8081046c944 data/create/loot_tables/blocks/cut_scoria_bricks.json 8360d736887ae3dc22bcf522791ef981e380456c data/create/loot_tables/blocks/cut_scoria_slab.json c771f03308f45e1e87d92181f94cdfd4e61fa5d8 data/create/loot_tables/blocks/cut_scoria_stairs.json 6fecb7fa2774ea63ac0c66e9c3d0f41d6b8cdff7 data/create/loot_tables/blocks/cut_scoria_wall.json 396074ee7fd5a3ddbac9332c74b7bdc4164919e2 data/create/loot_tables/blocks/cut_tuff.json -81465ef7aa555d36adf249bbc9acfe80abbe308e data/create/loot_tables/blocks/cut_tuff_bricks.json 5148f230c773b83268d52650bdacc660025feb95 data/create/loot_tables/blocks/cut_tuff_brick_slab.json 19719a4a3f63d1ec46a9ca9736a825d2dcc880ff data/create/loot_tables/blocks/cut_tuff_brick_stairs.json e20991b67c07dca62c212b43da5b7e7e98146c0e data/create/loot_tables/blocks/cut_tuff_brick_wall.json +81465ef7aa555d36adf249bbc9acfe80abbe308e data/create/loot_tables/blocks/cut_tuff_bricks.json 6d16bd3860207ff6912afc2bf3f0454b572aabba data/create/loot_tables/blocks/cut_tuff_slab.json c14e52ac9901aa873c33d51988bd26465ce0e095 data/create/loot_tables/blocks/cut_tuff_stairs.json dd70800c79fa2ff56bd4ea032cf069bc27cc9076 data/create/loot_tables/blocks/cut_tuff_wall.json 1957b610d14460cc9ca797fe953bf9831509cdbf data/create/loot_tables/blocks/cut_veridium.json -673d1f0fefa7725ac5bfcabfcea577041adc4eeb data/create/loot_tables/blocks/cut_veridium_bricks.json c1515a908bde249c087be1e73aec37773bc3dc5c data/create/loot_tables/blocks/cut_veridium_brick_slab.json d9552e3e9f4de0e09df8ca9446066e94c6e2c681 data/create/loot_tables/blocks/cut_veridium_brick_stairs.json 584c4bd13d9870f9798155b47cc0d32e5751294d data/create/loot_tables/blocks/cut_veridium_brick_wall.json +673d1f0fefa7725ac5bfcabfcea577041adc4eeb data/create/loot_tables/blocks/cut_veridium_bricks.json 009186ed0efe29a229a28cfd913bc02ddad217d4 data/create/loot_tables/blocks/cut_veridium_slab.json 4845f7127921c7dd93a59118e63c37107d6c2061 data/create/loot_tables/blocks/cut_veridium_stairs.json b56caea031d637321eddfd5d122fc357d2c2e49c data/create/loot_tables/blocks/cut_veridium_wall.json @@ -3533,12 +3533,12 @@ dfe0af3ff61ed2b3082e49c745d8a3e0c5973f4b data/create/loot_tables/blocks/encased_ a2e9a8a10b7fc730c1d7c8db3b529e7a37b683f5 data/create/loot_tables/blocks/encased_fan.json 7ede9f64839f51e6a2eb05b08577d2873f281401 data/create/loot_tables/blocks/encased_fluid_pipe.json 4869211639326efaabd1aba1067bfbb3ab012884 data/create/loot_tables/blocks/experience_block.json -9fa4b0c8ee313b6c9a57d7d5b687cdd01c8259d3 data/create/loot_tables/blocks/exposed_copper_shingles.json 9dbd37ef5ff549f10475101205c1a9d4a44140bc data/create/loot_tables/blocks/exposed_copper_shingle_slab.json d2c9abd9260eb82ea1c2eeae5e2d6abd0b4d3ce8 data/create/loot_tables/blocks/exposed_copper_shingle_stairs.json -f0905ae4c9bdff8fe9e1ab4682a7b1efe2d27d9d data/create/loot_tables/blocks/exposed_copper_tiles.json +9fa4b0c8ee313b6c9a57d7d5b687cdd01c8259d3 data/create/loot_tables/blocks/exposed_copper_shingles.json 6841c02935838f00011d33fc392965326c4dbc5b data/create/loot_tables/blocks/exposed_copper_tile_slab.json 432a047156b93a09b7e027fc34f5680a8f68dc92 data/create/loot_tables/blocks/exposed_copper_tile_stairs.json +f0905ae4c9bdff8fe9e1ab4682a7b1efe2d27d9d data/create/loot_tables/blocks/exposed_copper_tiles.json 4dd285b35d9b94d48f7aa783e93bdd04d58c4a26 data/create/loot_tables/blocks/factory_gauge.json 3fae2a7a3f133a1d7c76ce91f6c48eab787d6ff6 data/create/loot_tables/blocks/fake_track.json 1d4734d6d9ba039c0dfa2271f08cdb55e35b721f data/create/loot_tables/blocks/fluid_pipe.json @@ -3614,8 +3614,6 @@ eb95d1e0abb93d5efecb0809e3901f37021c4dfc data/create/loot_tables/blocks/light_gr e61e9b3e116037c4ad44a7e222e5127e5767ddad data/create/loot_tables/blocks/light_gray_table_cloth.json e22dfadefcea50090efe87136a4b92e6ef20d379 data/create/loot_tables/blocks/light_gray_toolbox.json 3e586bc1281f15e25e75475dd726578ff032c6ae data/create/loot_tables/blocks/light_gray_valve_handle.json -c6bb0877c537dda15469934383dc45c608bfd1a4 data/create/loot_tables/blocks/limestone.json -49058a62e1abd34917f983b6bc13cc4353b613a2 data/create/loot_tables/blocks/limestone_pillar.json 582bb26f6df37d0c2dbe12983ad05fc74f5fb5c0 data/create/loot_tables/blocks/lime_nixie_tube.json ec9d973d218b26d51b82f265603feab31170c619 data/create/loot_tables/blocks/lime_postbox.json 623ac65211a9920325308b55285f78e3b7275751 data/create/loot_tables/blocks/lime_sail.json @@ -3623,6 +3621,8 @@ ec9d973d218b26d51b82f265603feab31170c619 data/create/loot_tables/blocks/lime_pos 10ecd65ecba6b66652dd04a385fc47a44c1f8110 data/create/loot_tables/blocks/lime_table_cloth.json 0f6a465501a445925e9aff7a4c84b3c8e2caa93e data/create/loot_tables/blocks/lime_toolbox.json 1a3ed7cd5660d7ea014956ea642e0b07d89bc297 data/create/loot_tables/blocks/lime_valve_handle.json +c6bb0877c537dda15469934383dc45c608bfd1a4 data/create/loot_tables/blocks/limestone.json +49058a62e1abd34917f983b6bc13cc4353b613a2 data/create/loot_tables/blocks/limestone_pillar.json baf70f9eb579f20b232a2af4e6b00a54f84844e6 data/create/loot_tables/blocks/linear_chassis.json e4c0f8ca822cf7555bd011825b430c3c735160d4 data/create/loot_tables/blocks/lit_blaze_burner.json 6bd8b044cc9c69a5268372e5436f556da2c1bf21 data/create/loot_tables/blocks/magenta_nixie_tube.json @@ -3668,14 +3668,14 @@ d6323d4b30faa87cd4b5b8b815cb16f78296f203 data/create/loot_tables/blocks/orange_s 30aef2df782b6b35cd16b4c205bb15de85bc0664 data/create/loot_tables/blocks/orange_valve_handle.json f4004c6d16754fc8867ed6618dace8e8f6dcc412 data/create/loot_tables/blocks/ornate_iron_window.json 6f14500e07c6d342804f9127e7b66047ffaeef1e data/create/loot_tables/blocks/ornate_iron_window_pane.json -3e54d3c4755a43d837a1d9b2005ea1dee4d02555 data/create/loot_tables/blocks/oxidized_copper_shingles.json 62c43a533e4ffeeec9f7657db5a796569087f806 data/create/loot_tables/blocks/oxidized_copper_shingle_slab.json f47a01824093455030fca66e7b8a39bcfc61d219 data/create/loot_tables/blocks/oxidized_copper_shingle_stairs.json -4d2a2863697664b3b71f02aa703c3504cd5cc826 data/create/loot_tables/blocks/oxidized_copper_tiles.json +3e54d3c4755a43d837a1d9b2005ea1dee4d02555 data/create/loot_tables/blocks/oxidized_copper_shingles.json 4d815b361af81bd0c0e14c853ca54ad3cde66a57 data/create/loot_tables/blocks/oxidized_copper_tile_slab.json d599ef03d1b69e4367ec0dea78f52c1964c99f9b data/create/loot_tables/blocks/oxidized_copper_tile_stairs.json -ab8cee7abd7dd92428bf7d8f0f5edd35082401a4 data/create/loot_tables/blocks/packager.json +4d2a2863697664b3b71f02aa703c3504cd5cc826 data/create/loot_tables/blocks/oxidized_copper_tiles.json 54aa9700df601640b705d912abe773d5b6ee2b1f data/create/loot_tables/blocks/package_frogport.json +ab8cee7abd7dd92428bf7d8f0f5edd35082401a4 data/create/loot_tables/blocks/packager.json 58bd9fe9d6706998bfbda3b077cfd0a740972091 data/create/loot_tables/blocks/peculiar_bell.json 4d7724df6fefee4512c4f7886d0e103d1dc39510 data/create/loot_tables/blocks/pink_nixie_tube.json df7b12349c64d035eb563535b03cb70d780c5a71 data/create/loot_tables/blocks/pink_postbox.json @@ -3761,9 +3761,6 @@ b4746e296f4bf63778e40a751b4c7fa8be45d21d data/create/loot_tables/blocks/purple_t 9e5e841d9f9a00d560ed17a7e197dc56bae334b7 data/create/loot_tables/blocks/radial_chassis.json 73a03fa31e299cec2c8a3dc0f31a8aa354b49bcd data/create/loot_tables/blocks/railway_casing.json f76e5a157d2aeab5708f464b1f3c8e47b3855f18 data/create/loot_tables/blocks/raw_zinc_block.json -bbc2d61eeea335f8f011d799ef6a5484ca027640 data/create/loot_tables/blocks/redstone_contact.json -4fa70deeac7e56121e42fb602dfa27ee1727f749 data/create/loot_tables/blocks/redstone_link.json -efc3a5595e4daf67fa43f84c9869dfc76fd6fca4 data/create/loot_tables/blocks/redstone_requester.json a50e1c28af16e9f1b4f48aa974461167139768a7 data/create/loot_tables/blocks/red_nixie_tube.json f36f1e69e4fb8723238f81aadbac892f54b5ac62 data/create/loot_tables/blocks/red_postbox.json 977d724cddf8eba053a3310ad0d30af15199bbed data/create/loot_tables/blocks/red_sail.json @@ -3771,6 +3768,9 @@ f36f1e69e4fb8723238f81aadbac892f54b5ac62 data/create/loot_tables/blocks/red_post 09796bc3be977e17927d0a9e32bff2982618e844 data/create/loot_tables/blocks/red_table_cloth.json 9713071cab536e8c1550a6309dc4563fecc2c4e0 data/create/loot_tables/blocks/red_toolbox.json 17d75711f4ef5d76aa931175364642732fb0c60d data/create/loot_tables/blocks/red_valve_handle.json +bbc2d61eeea335f8f011d799ef6a5484ca027640 data/create/loot_tables/blocks/redstone_contact.json +4fa70deeac7e56121e42fb602dfa27ee1727f749 data/create/loot_tables/blocks/redstone_link.json +efc3a5595e4daf67fa43f84c9869dfc76fd6fca4 data/create/loot_tables/blocks/redstone_requester.json 632067fe6309e31e78637eb0272209b630750242 data/create/loot_tables/blocks/refined_radiance_casing.json ee2c4d66d1264ec613e9e84fcac814d2f5806258 data/create/loot_tables/blocks/repackager.json 354a3b6c73379b7100b0dd12b3f3b008830c4d2d data/create/loot_tables/blocks/rope.json @@ -3780,8 +3780,8 @@ f74fdd78961619d712891c36e0a0778c25e145dc data/create/loot_tables/blocks/rope_pul a0575567d5679f2c54e5a25c6ec12338f8cdc939 data/create/loot_tables/blocks/rose_quartz_tiles.json de74765a3bbffafb87d632857dfcfa83f863f814 data/create/loot_tables/blocks/rotation_speed_controller.json 2af8df3e36ace336c43d68f4e53564640a89845f data/create/loot_tables/blocks/sail_frame.json -d499fd59d30da8b907b0f3a0f428700f066eddff data/create/loot_tables/blocks/schematicannon.json 5a54e930243919991d71a1c3296002ff86dd88e1 data/create/loot_tables/blocks/schematic_table.json +d499fd59d30da8b907b0f3a0f428700f066eddff data/create/loot_tables/blocks/schematicannon.json 1d9b0df1330f44681bbd56f8560a30ef9e2175ff data/create/loot_tables/blocks/scorchia.json e39f189bfaebd31aedceb11e25720f1e08eb238d data/create/loot_tables/blocks/scorchia_pillar.json 5e3a37dbb2fcc0d6be042bfd063fd8b1414d6169 data/create/loot_tables/blocks/scoria.json @@ -3790,64 +3790,64 @@ d39afcaedc84d582c0c1f21ec5945cd0a67d389d data/create/loot_tables/blocks/secondar e33a34b47e07cf3262c0dbdbc651b31b9492b18f data/create/loot_tables/blocks/sequenced_gearshift.json 7d61387106e5e7fcc4aa0b05b9560cd5f4ef7df8 data/create/loot_tables/blocks/shadow_steel_casing.json 7e67d04f861e0a680487e27f94022a7850652dfe data/create/loot_tables/blocks/shaft.json -e88ff4ab1341c2db8338de0708b0ca8f40f15a8b data/create/loot_tables/blocks/small_andesite_bricks.json 220febcbcc4a993d475b683ebef7468ebdb7bf26 data/create/loot_tables/blocks/small_andesite_brick_slab.json b4764c5bb538359bcc2a599ff3b7474ade2115ed data/create/loot_tables/blocks/small_andesite_brick_stairs.json a891496ffb91bef56c3b684cb55a57e27a72154a data/create/loot_tables/blocks/small_andesite_brick_wall.json -576d8f6beca755a4082f1c8941e2590c1d18107b data/create/loot_tables/blocks/small_asurine_bricks.json +e88ff4ab1341c2db8338de0708b0ca8f40f15a8b data/create/loot_tables/blocks/small_andesite_bricks.json 1a5d3543ebb7c0064ba8ff01160a22a0f5f29f36 data/create/loot_tables/blocks/small_asurine_brick_slab.json 64f4b44b786eda91d432f20c8b725b0415440b56 data/create/loot_tables/blocks/small_asurine_brick_stairs.json 60a1d505e955047cf933ae55efc2e7c10d0a5a79 data/create/loot_tables/blocks/small_asurine_brick_wall.json +576d8f6beca755a4082f1c8941e2590c1d18107b data/create/loot_tables/blocks/small_asurine_bricks.json 64bcfece2507b8510633ae20c00ab989232664ff data/create/loot_tables/blocks/small_bogey.json -c03bba06f66262c0ced5e85fa7dcbfbfc8c9db71 data/create/loot_tables/blocks/small_calcite_bricks.json b673542c79f4a82f2e80c0931354e994292811f6 data/create/loot_tables/blocks/small_calcite_brick_slab.json e10d286286bba8e172a56e0eeb9af18d06d1a76d data/create/loot_tables/blocks/small_calcite_brick_stairs.json d7214e942b203823fa2fece883e8406a7721369f data/create/loot_tables/blocks/small_calcite_brick_wall.json -f49d32973b0be51229f4e3fdc13958c9852c5c8a data/create/loot_tables/blocks/small_crimsite_bricks.json +c03bba06f66262c0ced5e85fa7dcbfbfc8c9db71 data/create/loot_tables/blocks/small_calcite_bricks.json ef8b0f604b627715542e8216ae5448e88995cc13 data/create/loot_tables/blocks/small_crimsite_brick_slab.json dbec9246ab957a3ed2dbd0707df12c1496258e05 data/create/loot_tables/blocks/small_crimsite_brick_stairs.json d4d5bd8b101655205c4f293f23e83f610e179e91 data/create/loot_tables/blocks/small_crimsite_brick_wall.json -8caba3e7001dd8df4d3e6365b97849570c74c840 data/create/loot_tables/blocks/small_deepslate_bricks.json +f49d32973b0be51229f4e3fdc13958c9852c5c8a data/create/loot_tables/blocks/small_crimsite_bricks.json 44567c10c28ddd221198824766d3fec289fb29d4 data/create/loot_tables/blocks/small_deepslate_brick_slab.json fc141f5cdb1001d344b5ef8fa3ad1fdfeb01d048 data/create/loot_tables/blocks/small_deepslate_brick_stairs.json 3cf68d27362e9bb5dc3255ccf810097fbee511ba data/create/loot_tables/blocks/small_deepslate_brick_wall.json -4f22a84f105c2fabfd08ff0782ec30bbdc59f940 data/create/loot_tables/blocks/small_diorite_bricks.json +8caba3e7001dd8df4d3e6365b97849570c74c840 data/create/loot_tables/blocks/small_deepslate_bricks.json f6565f4bd11b7e95008b0f8fc3f5f2c7af1b77f8 data/create/loot_tables/blocks/small_diorite_brick_slab.json e3cbe41b4b2c38d0d5e625e34b61fc79db16d3bd data/create/loot_tables/blocks/small_diorite_brick_stairs.json 787dfaa16dc30155c90cc360f6927fa067a30ed8 data/create/loot_tables/blocks/small_diorite_brick_wall.json -d9cc7f58c791e040df4abfce225524e01eb01d49 data/create/loot_tables/blocks/small_dripstone_bricks.json +4f22a84f105c2fabfd08ff0782ec30bbdc59f940 data/create/loot_tables/blocks/small_diorite_bricks.json f72338c9252528e41f60cb183cb4ee07cea47bf0 data/create/loot_tables/blocks/small_dripstone_brick_slab.json bedf0fba68e8a8ce4205a968429ebe9c3ddfb528 data/create/loot_tables/blocks/small_dripstone_brick_stairs.json c1168f58f342dfa332bfa7f53f5f03383c55ccf2 data/create/loot_tables/blocks/small_dripstone_brick_wall.json -8437e7e28e45c10562d182c4c07189bcc108cabb data/create/loot_tables/blocks/small_granite_bricks.json +d9cc7f58c791e040df4abfce225524e01eb01d49 data/create/loot_tables/blocks/small_dripstone_bricks.json 4d111f8580ac97cf1b49b667462f7141846f3d3a data/create/loot_tables/blocks/small_granite_brick_slab.json c16e015251126614960d3e6300cb04d3aeaf49b4 data/create/loot_tables/blocks/small_granite_brick_stairs.json e0ff780ddeb5d5c8d2b6cd7736ac05f4556de52c data/create/loot_tables/blocks/small_granite_brick_wall.json -c60def11fbac5010bf749960e084dd5cd0dc4b07 data/create/loot_tables/blocks/small_limestone_bricks.json +8437e7e28e45c10562d182c4c07189bcc108cabb data/create/loot_tables/blocks/small_granite_bricks.json 5222ac5255c9a9ada0ce1da0fd4f4acbeee8ddb7 data/create/loot_tables/blocks/small_limestone_brick_slab.json 97310b6b1cbea869ebaa52861542787c49cee017 data/create/loot_tables/blocks/small_limestone_brick_stairs.json 0855921034db43692baa9fd0bcb767154f96d591 data/create/loot_tables/blocks/small_limestone_brick_wall.json -eb6b2171a6c99a3a28089752f26ddc6ac1f941d1 data/create/loot_tables/blocks/small_ochrum_bricks.json +c60def11fbac5010bf749960e084dd5cd0dc4b07 data/create/loot_tables/blocks/small_limestone_bricks.json 8ced0c24db685dbf4382b7b71124005edde9e0b2 data/create/loot_tables/blocks/small_ochrum_brick_slab.json 090e7154fb2c3dfd20d37aa87f3df4572a27c615 data/create/loot_tables/blocks/small_ochrum_brick_stairs.json 60f2d9970ad8caf8ffe3aa8083dbba671b8d4b8b data/create/loot_tables/blocks/small_ochrum_brick_wall.json +eb6b2171a6c99a3a28089752f26ddc6ac1f941d1 data/create/loot_tables/blocks/small_ochrum_bricks.json a001d069c2b4d15c6dfd0312749765fc4e89571e data/create/loot_tables/blocks/small_rose_quartz_tiles.json -ce71e670948453691d4f09c8110b952afb41afa1 data/create/loot_tables/blocks/small_scorchia_bricks.json d521cf885c737da2e4717d43072840ffd3f4c5d9 data/create/loot_tables/blocks/small_scorchia_brick_slab.json de6b5d583e1adf4d49147e0719616dfd0165726d data/create/loot_tables/blocks/small_scorchia_brick_stairs.json 895603c6920338ffafd8d0d1310e47ac20bdbfda data/create/loot_tables/blocks/small_scorchia_brick_wall.json -8b7e61477c4fdc834d669bda9197b585d60f26a2 data/create/loot_tables/blocks/small_scoria_bricks.json +ce71e670948453691d4f09c8110b952afb41afa1 data/create/loot_tables/blocks/small_scorchia_bricks.json d1954c07a66f40123d8d78602795efad7c92070f data/create/loot_tables/blocks/small_scoria_brick_slab.json 291b5a560f09ed8f09ccc949a1a4da0006f139c7 data/create/loot_tables/blocks/small_scoria_brick_stairs.json ed572e947f78d637e6e1a4166c111121087c41c3 data/create/loot_tables/blocks/small_scoria_brick_wall.json -2c7097ee677f42452212b5dce8959065d2bb0e15 data/create/loot_tables/blocks/small_tuff_bricks.json +8b7e61477c4fdc834d669bda9197b585d60f26a2 data/create/loot_tables/blocks/small_scoria_bricks.json ad8a3571dc3ae0ee1ec7be7f35c9796e544f0682 data/create/loot_tables/blocks/small_tuff_brick_slab.json 17f4a98a81e5920b75c88133d15b63d431f3fb64 data/create/loot_tables/blocks/small_tuff_brick_stairs.json 7defad704f6278e329af634acfb9efd617b2003e data/create/loot_tables/blocks/small_tuff_brick_wall.json -e499c0a8a0f804003612f3a4c9286cb4b033fe4b data/create/loot_tables/blocks/small_veridium_bricks.json +2c7097ee677f42452212b5dce8959065d2bb0e15 data/create/loot_tables/blocks/small_tuff_bricks.json c7771827a715b9eaacd1a7b7e863e274b1dee11f data/create/loot_tables/blocks/small_veridium_brick_slab.json 818b65dd5d868527e7df7658a4f62a93f2795186 data/create/loot_tables/blocks/small_veridium_brick_stairs.json 7733e53a90f2ba9c17cdedaa8720e70df1a8d2de data/create/loot_tables/blocks/small_veridium_brick_wall.json +e499c0a8a0f804003612f3a4c9286cb4b033fe4b data/create/loot_tables/blocks/small_veridium_bricks.json a121d21b81e93c119b6ee32ca21d260d9c33cb2a data/create/loot_tables/blocks/smart_chute.json 4556eb2d607db3631d0a9524d22a50686ce4a5a8 data/create/loot_tables/blocks/smart_fluid_pipe.json 9601e8ba0eb098cc409557f17b01669d8b971461 data/create/loot_tables/blocks/speedometer.json @@ -3859,9 +3859,9 @@ bcd632c1180efbc990b077314cfce8514a25da7c data/create/loot_tables/blocks/spruce_w cae1bd9100b62841e260880faa80e2442f44a141 data/create/loot_tables/blocks/steam_whistle_extension.json 0bc3fdde351129e3a261a2420aff9d3f063c235e data/create/loot_tables/blocks/sticker.json 074f526902cb5fcff2129614428aba1ea05a6649 data/create/loot_tables/blocks/sticky_mechanical_piston.json -a7332324e63f7d28621ddfbd54eb3d091461d890 data/create/loot_tables/blocks/stockpile_switch.json af312881ec9bfb0902438f53c5cac020244bdba2 data/create/loot_tables/blocks/stock_link.json f4fa9bb255348dc79dcc0468b3beb9ad075eb036 data/create/loot_tables/blocks/stock_ticker.json +a7332324e63f7d28621ddfbd54eb3d091461d890 data/create/loot_tables/blocks/stockpile_switch.json b13496b1b4bc0be30605832e23894fb374dd796e data/create/loot_tables/blocks/stressometer.json 6a7df4d2730d57ae6e404b4bc8e01367e5ddbf07 data/create/loot_tables/blocks/tiled_glass.json 0ad584e41780dc0183af1fa1e49e126730dfdbab data/create/loot_tables/blocks/tiled_glass_pane.json @@ -3881,36 +3881,36 @@ cfc82d2aa8248caeaa17ff0a60db02607046550d data/create/loot_tables/blocks/warped_w 2eeddb89cfc597bc1ce0736b9f4a6f98e0dfa4d2 data/create/loot_tables/blocks/warped_window_pane.json ccab211722d7f06913a549851b0d6e8278edc845 data/create/loot_tables/blocks/water_wheel.json ea5dfcedc928e8dfa1c59cf3917d1577dff87494 data/create/loot_tables/blocks/water_wheel_structure.json -bbc6fc068adccea464909b87f1d1f426324d74cc data/create/loot_tables/blocks/waxed_copper_shingles.json cb31be1e75ca822454bd0a89954f74c4c8726b33 data/create/loot_tables/blocks/waxed_copper_shingle_slab.json c8e440e42141788d1988c57ab91cb1bfcd977407 data/create/loot_tables/blocks/waxed_copper_shingle_stairs.json -a3b8f12d983077477963fd3fc893c5acd36ad552 data/create/loot_tables/blocks/waxed_copper_tiles.json +bbc6fc068adccea464909b87f1d1f426324d74cc data/create/loot_tables/blocks/waxed_copper_shingles.json 807da1d66d6c7d07efc8973de43415fa4b5ddfdc data/create/loot_tables/blocks/waxed_copper_tile_slab.json 92759871a9c84815b98b6dcd22fcf0dd958bc8ab data/create/loot_tables/blocks/waxed_copper_tile_stairs.json -eb9781d081d52c34c041004c774b52169b4a9ca0 data/create/loot_tables/blocks/waxed_exposed_copper_shingles.json +a3b8f12d983077477963fd3fc893c5acd36ad552 data/create/loot_tables/blocks/waxed_copper_tiles.json be5aabc98f4d70028f2b49ae1eaf0bc68a693c53 data/create/loot_tables/blocks/waxed_exposed_copper_shingle_slab.json a99143d290addb98427be53d7fea1cbc702d630c data/create/loot_tables/blocks/waxed_exposed_copper_shingle_stairs.json -e79c0636852b37a463dc122d66cdec27d3aa10c4 data/create/loot_tables/blocks/waxed_exposed_copper_tiles.json +eb9781d081d52c34c041004c774b52169b4a9ca0 data/create/loot_tables/blocks/waxed_exposed_copper_shingles.json 234cbb59a0e00d82c5508c8e9a61e328c22c1c56 data/create/loot_tables/blocks/waxed_exposed_copper_tile_slab.json de628114eb25f393efc4c0934d79c5bdc4365f75 data/create/loot_tables/blocks/waxed_exposed_copper_tile_stairs.json -60fe0594baab9599956d990ba893f8915835db81 data/create/loot_tables/blocks/waxed_oxidized_copper_shingles.json +e79c0636852b37a463dc122d66cdec27d3aa10c4 data/create/loot_tables/blocks/waxed_exposed_copper_tiles.json c8935df7d4634dee2b01c8a0ac5de12397f4d9ed data/create/loot_tables/blocks/waxed_oxidized_copper_shingle_slab.json 2b9370b7fa362ea88f916dd53747da80e4ae3357 data/create/loot_tables/blocks/waxed_oxidized_copper_shingle_stairs.json -f0721c371b08214337f3f4fce3a3705840310bdb data/create/loot_tables/blocks/waxed_oxidized_copper_tiles.json +60fe0594baab9599956d990ba893f8915835db81 data/create/loot_tables/blocks/waxed_oxidized_copper_shingles.json de4d25cac546559173f740752625c82dfd6bae09 data/create/loot_tables/blocks/waxed_oxidized_copper_tile_slab.json 2ed72fc0ea28303f5c6d1039662f55c677cb7bcb data/create/loot_tables/blocks/waxed_oxidized_copper_tile_stairs.json -f309ffd94dfb3591efd2fab337a871a0ceff1084 data/create/loot_tables/blocks/waxed_weathered_copper_shingles.json +f0721c371b08214337f3f4fce3a3705840310bdb data/create/loot_tables/blocks/waxed_oxidized_copper_tiles.json 9a7b265a963e122d510de64012ed1d98ad9017f9 data/create/loot_tables/blocks/waxed_weathered_copper_shingle_slab.json 62f25a1bc013e9c3d487d9a53407e58d89907c5b data/create/loot_tables/blocks/waxed_weathered_copper_shingle_stairs.json -26e6a96f50e7f3384f896bf8a5c3d5ff2b422526 data/create/loot_tables/blocks/waxed_weathered_copper_tiles.json +f309ffd94dfb3591efd2fab337a871a0ceff1084 data/create/loot_tables/blocks/waxed_weathered_copper_shingles.json 3fa20e33ced4aee01775db57629b9580a6b8e200 data/create/loot_tables/blocks/waxed_weathered_copper_tile_slab.json 59b28bd57f461482a394dbce9ea10ee25fc7c294 data/create/loot_tables/blocks/waxed_weathered_copper_tile_stairs.json -3cd15ae684bc0e4e41f02b3ee79eafdbf052620c data/create/loot_tables/blocks/weathered_copper_shingles.json +26e6a96f50e7f3384f896bf8a5c3d5ff2b422526 data/create/loot_tables/blocks/waxed_weathered_copper_tiles.json 278a56aa433ba3647107b3bf0553da5a5f6d40dd data/create/loot_tables/blocks/weathered_copper_shingle_slab.json 198babfd55c3a30c6ac61e81d5e01b0cf8fca80a data/create/loot_tables/blocks/weathered_copper_shingle_stairs.json -771d98a6627d707228719e843bc80636b02dc985 data/create/loot_tables/blocks/weathered_copper_tiles.json +3cd15ae684bc0e4e41f02b3ee79eafdbf052620c data/create/loot_tables/blocks/weathered_copper_shingles.json d6862dc9f7d291df618fbce71eebf613711a5517 data/create/loot_tables/blocks/weathered_copper_tile_slab.json 57d5065d53016e4b1ef0fbad9b84605b1546bcc4 data/create/loot_tables/blocks/weathered_copper_tile_stairs.json +771d98a6627d707228719e843bc80636b02dc985 data/create/loot_tables/blocks/weathered_copper_tiles.json 013deea9b687ce96e5042de13ab0cba9dadce364 data/create/loot_tables/blocks/weathered_iron_block.json f0c51ad0a713aab00dff913361b8e5e8448b912a data/create/loot_tables/blocks/weathered_iron_window.json 1d3ea471ec3f2bbf10c7a11f040f8bbf0d1576a8 data/create/loot_tables/blocks/weathered_iron_window_pane.json @@ -3958,43 +3958,43 @@ da3692808565988e21ec5b1d5e976338ccc4a037 data/create/recipes/calcite_pillar_from 1157b2eab2ada187ea80feae298b77ed7ece4bfd data/create/recipes/copper_bars_from_ingots_copper_stonecutting.json b9d4f55128aa03ee6f6ab1831e709629a42c147e data/create/recipes/copper_ladder_from_ingots_copper_stonecutting.json 922c5ac48c8eb8b3a39f5626a381c2252fbac107 data/create/recipes/copper_scaffolding_from_ingots_copper_stonecutting.json -bab9fa969ba95850dc6e3bd0723387a61cbb05cd data/create/recipes/copper_shingles_from_ingots_copper_stonecutting.json bb083ae1d057dc0106946e4c68f9469b81724396 data/create/recipes/copper_shingle_slab.json 3689feaca2bd5355fa2d4226cd2cc519fa9b97c1 data/create/recipes/copper_shingle_slab_from_copper_shingles_stonecutting.json bd4cd7119f8371164b278afc679795a3c2a53406 data/create/recipes/copper_shingle_stairs.json 59f672e8e88d5f4655467e2696616b552debaf46 data/create/recipes/copper_shingle_stairs_from_copper_shingles_stonecutting.json +bab9fa969ba95850dc6e3bd0723387a61cbb05cd data/create/recipes/copper_shingles_from_ingots_copper_stonecutting.json 0225fc8d7b7a5027b8a61e6a043c3a8e505d876a data/create/recipes/copper_table_cloth_from_ingots_copper_stonecutting.json -d463aa891c7ae1b2eb1a758e4100c5a1c16cfffd data/create/recipes/copper_tiles_from_ingots_copper_stonecutting.json f64ba3f3c607b43ea77e5bccb7ec2048e5c6e424 data/create/recipes/copper_tile_slab.json 91b0390e0c772d43eb46b94a0113323f0f6a4387 data/create/recipes/copper_tile_slab_from_copper_tiles_stonecutting.json d31a41f6f7ef0bd20abab06cc31a9d2c56187117 data/create/recipes/copper_tile_stairs.json bf1b0a447169029161fb07feacd22d5aa806b2bf data/create/recipes/copper_tile_stairs_from_copper_tiles_stonecutting.json +d463aa891c7ae1b2eb1a758e4100c5a1c16cfffd data/create/recipes/copper_tiles_from_ingots_copper_stonecutting.json daa54c9ff3612521f06cc1979116beafcda852dd data/create/recipes/copycat_panel_from_ingots_zinc_stonecutting.json 745816d2c3fa29ede2510e39edc76f6fecee963f data/create/recipes/copycat_step_from_ingots_zinc_stonecutting.json -255c32272a704109fccdbb071d4dbf602cb8c1d8 data/create/recipes/crafting/copper/waxed_copper_shingles_from_honeycomb.json 57ae13042e0f96676fa322bf24db4976d75ca6bc data/create/recipes/crafting/copper/waxed_copper_shingle_slab_from_honeycomb.json 790565897535ea2e741d0a0ed7c0b561d594b69a data/create/recipes/crafting/copper/waxed_copper_shingle_stairs_from_honeycomb.json -0c6e14c5884257850c7360cba66bc8cca91c84e7 data/create/recipes/crafting/copper/waxed_copper_tiles_from_honeycomb.json +255c32272a704109fccdbb071d4dbf602cb8c1d8 data/create/recipes/crafting/copper/waxed_copper_shingles_from_honeycomb.json 4693ee65a4a5e1c93fc2acce7bfbc438e573ad9a data/create/recipes/crafting/copper/waxed_copper_tile_slab_from_honeycomb.json f8772b915663e3f70b3a2405a23c5ce87e8b8e49 data/create/recipes/crafting/copper/waxed_copper_tile_stairs_from_honeycomb.json -6d0dacc4db8966d38156fe17645732084379a887 data/create/recipes/crafting/copper/waxed_exposed_copper_shingles_from_honeycomb.json +0c6e14c5884257850c7360cba66bc8cca91c84e7 data/create/recipes/crafting/copper/waxed_copper_tiles_from_honeycomb.json 3bc0b81ea61229e24570e083caa4e5870d517e75 data/create/recipes/crafting/copper/waxed_exposed_copper_shingle_slab_from_honeycomb.json 191f34b27bc8966c2b6ba41403cc0933718748d3 data/create/recipes/crafting/copper/waxed_exposed_copper_shingle_stairs_from_honeycomb.json -cdd66bdfddbcdfacb27c030872d10b6e7f1356fd data/create/recipes/crafting/copper/waxed_exposed_copper_tiles_from_honeycomb.json +6d0dacc4db8966d38156fe17645732084379a887 data/create/recipes/crafting/copper/waxed_exposed_copper_shingles_from_honeycomb.json 2f6d2f8da4d4da2ed48e33d8f6e0b32d37a3ce6d data/create/recipes/crafting/copper/waxed_exposed_copper_tile_slab_from_honeycomb.json 4ed8482ed29fe7c3273db733fa141743c181d460 data/create/recipes/crafting/copper/waxed_exposed_copper_tile_stairs_from_honeycomb.json -0ca4e58d715d5ed4b051a94f2dff42d4d413ef07 data/create/recipes/crafting/copper/waxed_oxidized_copper_shingles_from_honeycomb.json +cdd66bdfddbcdfacb27c030872d10b6e7f1356fd data/create/recipes/crafting/copper/waxed_exposed_copper_tiles_from_honeycomb.json b421f16aea7c47fa8a62e69973f30e4e382f8a2c data/create/recipes/crafting/copper/waxed_oxidized_copper_shingle_slab_from_honeycomb.json 7ab7f673f57e219d3e486d0add1d7e2a8820cc6b data/create/recipes/crafting/copper/waxed_oxidized_copper_shingle_stairs_from_honeycomb.json -b7edffb9b1a936fd34fe23defefc8cb9ea4f6977 data/create/recipes/crafting/copper/waxed_oxidized_copper_tiles_from_honeycomb.json +0ca4e58d715d5ed4b051a94f2dff42d4d413ef07 data/create/recipes/crafting/copper/waxed_oxidized_copper_shingles_from_honeycomb.json 24582e83e8d36a6267df5c028addfb44c1a637e6 data/create/recipes/crafting/copper/waxed_oxidized_copper_tile_slab_from_honeycomb.json 9185ea241bcb5f2fe09d0d5c65832ef379e06c58 data/create/recipes/crafting/copper/waxed_oxidized_copper_tile_stairs_from_honeycomb.json -90bce9f262b87fb821210aceb88d09d815d15e5a data/create/recipes/crafting/copper/waxed_weathered_copper_shingles_from_honeycomb.json +b7edffb9b1a936fd34fe23defefc8cb9ea4f6977 data/create/recipes/crafting/copper/waxed_oxidized_copper_tiles_from_honeycomb.json a2cc99ad9b1234f5327971ee535af9bc25d0154c data/create/recipes/crafting/copper/waxed_weathered_copper_shingle_slab_from_honeycomb.json 0952753a079593d748b38ca84b666f2f886f5c1e data/create/recipes/crafting/copper/waxed_weathered_copper_shingle_stairs_from_honeycomb.json -724802d206db185ebf20bafbcfc35fe0f982f58a data/create/recipes/crafting/copper/waxed_weathered_copper_tiles_from_honeycomb.json +90bce9f262b87fb821210aceb88d09d815d15e5a data/create/recipes/crafting/copper/waxed_weathered_copper_shingles_from_honeycomb.json 98d0b72eb20e1d80cc590800ae2d642a47c3ae5f data/create/recipes/crafting/copper/waxed_weathered_copper_tile_slab_from_honeycomb.json 594b8fd5c30a84df97667b2c6dccc5dedd039d26 data/create/recipes/crafting/copper/waxed_weathered_copper_tile_stairs_from_honeycomb.json +724802d206db185ebf20bafbcfc35fe0f982f58a data/create/recipes/crafting/copper/waxed_weathered_copper_tiles_from_honeycomb.json 97c3e430ef2aecf61c457d0b8c4bbd23e1b01cc3 data/create/recipes/crafting/kinetics/black_seat.json 1129d02609125b48af2efa48f84dd3f90d51a341 data/create/recipes/crafting/kinetics/black_seat_from_other_seat.json 9e5a73e2343054d35e2fbfd20f0c49834d1a87a6 data/create/recipes/crafting/kinetics/black_valve_handle_from_other_valve_handle.json @@ -4130,7 +4130,6 @@ db333d47f9e1d6b02aa670ea0aa10dabbcb0e319 data/create/recipes/crafting/logistics/ c3f4fd2206f3885904913289761f2b8b758e4c95 data/create/recipes/crimsite_pillar_from_stone_types_crimsite_stonecutting.json e1815f97fbc2786d77f5378a2696e36050d8a1fd data/create/recipes/crimson_window.json 96009a12fe3f5ebf677ac069999e2ea2adbc9b7c data/create/recipes/crimson_window_pane.json -82cb9be82ce5109781169bdb47bbd49238b9824b data/create/recipes/cut_andesite_bricks_from_stone_types_andesite_stonecutting.json d6a41fc914a4a41478f115d9503658dba04a4d02 data/create/recipes/cut_andesite_brick_slab.json edf981198463ac58524606f86dc15d2265e8b993 data/create/recipes/cut_andesite_brick_slab_from_stone_types_andesite_stonecutting.json 72486864f3a0d31a92212552441eb659f2541b60 data/create/recipes/cut_andesite_brick_slab_recycling.json @@ -4138,6 +4137,7 @@ edf981198463ac58524606f86dc15d2265e8b993 data/create/recipes/cut_andesite_brick_ 22f463c679249738bf1a340a3b8ff14806303a70 data/create/recipes/cut_andesite_brick_stairs_from_stone_types_andesite_stonecutting.json 42b7105c1d776aed25c1c6bbd9254375079d7438 data/create/recipes/cut_andesite_brick_wall.json 7d25517650c9f66b65f0f8841cf9bcda7ea401ec data/create/recipes/cut_andesite_brick_wall_from_stone_types_andesite_stonecutting.json +82cb9be82ce5109781169bdb47bbd49238b9824b data/create/recipes/cut_andesite_bricks_from_stone_types_andesite_stonecutting.json c3ab483224c3adbd467a4ec0b26a1f6a53fe81c4 data/create/recipes/cut_andesite_from_stone_types_andesite_stonecutting.json 9f316131bb538da9f6b1bde9eaaa0a5bd5972a66 data/create/recipes/cut_andesite_slab.json 50dcff201da369bdc591fdc320aae3547f114284 data/create/recipes/cut_andesite_slab_from_stone_types_andesite_stonecutting.json @@ -4146,7 +4146,6 @@ c3ab483224c3adbd467a4ec0b26a1f6a53fe81c4 data/create/recipes/cut_andesite_from_s c284fc46aabae9c5ab79071eb63ec9b07a9d1002 data/create/recipes/cut_andesite_stairs_from_stone_types_andesite_stonecutting.json 3b6e66e92656ab5b0d1e15444db62ccb1cc01866 data/create/recipes/cut_andesite_wall.json 5df6e8d558f656533aff514aee8cdec7cf8d6fdf data/create/recipes/cut_andesite_wall_from_stone_types_andesite_stonecutting.json -e335b15907be053ab0f2649338b12a86371b78f7 data/create/recipes/cut_asurine_bricks_from_stone_types_asurine_stonecutting.json 41d085d3b8fce5b12d601d86fd0e88df9b482aec data/create/recipes/cut_asurine_brick_slab.json cf61e0806a3988a771675a261a540cbb62352d80 data/create/recipes/cut_asurine_brick_slab_from_stone_types_asurine_stonecutting.json 86606a0717bba33f457707d96461fec6a22d23de data/create/recipes/cut_asurine_brick_slab_recycling.json @@ -4154,6 +4153,7 @@ cf61e0806a3988a771675a261a540cbb62352d80 data/create/recipes/cut_asurine_brick_s 382a7faa460ac286631fe063280541f2f499d895 data/create/recipes/cut_asurine_brick_stairs_from_stone_types_asurine_stonecutting.json 09699c116bb201e742fef1fd3c987e9de4606e6a data/create/recipes/cut_asurine_brick_wall.json 8bb8a9f8e8dd0d6585311c326dcf3f40227149a9 data/create/recipes/cut_asurine_brick_wall_from_stone_types_asurine_stonecutting.json +e335b15907be053ab0f2649338b12a86371b78f7 data/create/recipes/cut_asurine_bricks_from_stone_types_asurine_stonecutting.json 0188d62fbeede94f8596dd5cc73d361a160e8c95 data/create/recipes/cut_asurine_from_stone_types_asurine_stonecutting.json 118e87a2a344238009b1bbbe70e6f314e27842d9 data/create/recipes/cut_asurine_slab.json 37c502094ee96da9e4983142dae5e023c6bcfe14 data/create/recipes/cut_asurine_slab_from_stone_types_asurine_stonecutting.json @@ -4162,7 +4162,6 @@ fe3dd5c7d5bdea71a75003cf3d50439d9d21458d data/create/recipes/cut_asurine_slab_re cade93c9328afcacf4507aa7699c4b09fb4592d4 data/create/recipes/cut_asurine_stairs_from_stone_types_asurine_stonecutting.json 80bec79b5daea4b2b72c0f5e9f189c1044583465 data/create/recipes/cut_asurine_wall.json 45a712e41a74982cfb94a39da199ec6c95eef798 data/create/recipes/cut_asurine_wall_from_stone_types_asurine_stonecutting.json -da11f21280ba1ed06ffe8afe77db3e9e1bbcb1a3 data/create/recipes/cut_calcite_bricks_from_stone_types_calcite_stonecutting.json 98e849c743ed1e4397bf6168215dfa7006a804c4 data/create/recipes/cut_calcite_brick_slab.json 1c21eb6c785729a8ea274513e1313aed952e105e data/create/recipes/cut_calcite_brick_slab_from_stone_types_calcite_stonecutting.json 2a3f078f7f40ba3bc5c17a037db1f8ee415e4e3f data/create/recipes/cut_calcite_brick_slab_recycling.json @@ -4170,6 +4169,7 @@ e4267c62bc6cfc8373df29ee2685f1e1b286b638 data/create/recipes/cut_calcite_brick_s 10fe509e01e3ed1b04bd2f384c0aa3db96b117f1 data/create/recipes/cut_calcite_brick_stairs_from_stone_types_calcite_stonecutting.json 9b55a6c9cf0ce697a242684953daf9aa94d024dc data/create/recipes/cut_calcite_brick_wall.json 1e67376e484923b84bd64b0b22b4e55b581ac419 data/create/recipes/cut_calcite_brick_wall_from_stone_types_calcite_stonecutting.json +da11f21280ba1ed06ffe8afe77db3e9e1bbcb1a3 data/create/recipes/cut_calcite_bricks_from_stone_types_calcite_stonecutting.json 98b014b64c97371f04aaacbdd23e13e274e36e3b data/create/recipes/cut_calcite_from_stone_types_calcite_stonecutting.json fcab91f11fe97a194b2c1b16115206166d3cd634 data/create/recipes/cut_calcite_slab.json 8426a494b776148056cb4525e62744d0be8b28cd data/create/recipes/cut_calcite_slab_from_stone_types_calcite_stonecutting.json @@ -4178,7 +4178,6 @@ fcab91f11fe97a194b2c1b16115206166d3cd634 data/create/recipes/cut_calcite_slab.js a7e7fb425d3c1f21f5ed53da79957363fed824df data/create/recipes/cut_calcite_stairs_from_stone_types_calcite_stonecutting.json 73eaf7bffa38bc874974871f3002cd3ee7f0c36e data/create/recipes/cut_calcite_wall.json 01b4c23362f15ee0e5c207c46383f96032c89d98 data/create/recipes/cut_calcite_wall_from_stone_types_calcite_stonecutting.json -07aff2bb6424de46463b2c965418ed52efd0a790 data/create/recipes/cut_crimsite_bricks_from_stone_types_crimsite_stonecutting.json 8ffb2c1c747f19ea37c0da3fe248b6c58981c9f6 data/create/recipes/cut_crimsite_brick_slab.json 86c3a5c64561052489b3ceb9e08be5a8729198a9 data/create/recipes/cut_crimsite_brick_slab_from_stone_types_crimsite_stonecutting.json e3215d4e651e70402b896ba50975cb2f23d16278 data/create/recipes/cut_crimsite_brick_slab_recycling.json @@ -4186,6 +4185,7 @@ e49f6e319fae9058cbece0e332a11e108234e608 data/create/recipes/cut_crimsite_brick_ c7186fb1a75f59aff929e843f50a162a090b7bb3 data/create/recipes/cut_crimsite_brick_stairs_from_stone_types_crimsite_stonecutting.json 272d8d01730a88eff4fc6923e93962650b992c46 data/create/recipes/cut_crimsite_brick_wall.json 13ac9464098e8c67e820dc898c025ab0382d852a data/create/recipes/cut_crimsite_brick_wall_from_stone_types_crimsite_stonecutting.json +07aff2bb6424de46463b2c965418ed52efd0a790 data/create/recipes/cut_crimsite_bricks_from_stone_types_crimsite_stonecutting.json 18ce9ff32eda2d869bd11f398a86e78b71f6d0fe data/create/recipes/cut_crimsite_from_stone_types_crimsite_stonecutting.json c39166aa6267ec5bc71893d5756955abfb644217 data/create/recipes/cut_crimsite_slab.json 6271d5bc0377814ba06061bfffcb812ca2ef8f03 data/create/recipes/cut_crimsite_slab_from_stone_types_crimsite_stonecutting.json @@ -4194,7 +4194,6 @@ acfe33dbb889c820c213bcbc8593766703bf3a25 data/create/recipes/cut_crimsite_slab_r 90b03cf1e72d3b803e33755832e0722ff264681b data/create/recipes/cut_crimsite_stairs_from_stone_types_crimsite_stonecutting.json 8dfe19522878af232deaa1fc13d83cf785684cba data/create/recipes/cut_crimsite_wall.json 18f9548175baab0173785d7ef308096067712dd2 data/create/recipes/cut_crimsite_wall_from_stone_types_crimsite_stonecutting.json -de1a11b7ed71f1f7aeea2791fe922feef689fd35 data/create/recipes/cut_deepslate_bricks_from_stone_types_deepslate_stonecutting.json 5e5c0e6b1b3e204de3c48fb6a4cd473a150979c2 data/create/recipes/cut_deepslate_brick_slab.json 2c0795b92759dab751f86f50aa80440df2245526 data/create/recipes/cut_deepslate_brick_slab_from_stone_types_deepslate_stonecutting.json dbcc41c48cf28b71dcd9f3b6ecae43c8de681532 data/create/recipes/cut_deepslate_brick_slab_recycling.json @@ -4202,6 +4201,7 @@ e21f8dc33e70ebd43ea79a4afaf3b4e8a449f4bd data/create/recipes/cut_deepslate_brick 7b3489e5b629a995691be117c5a378769c743449 data/create/recipes/cut_deepslate_brick_stairs_from_stone_types_deepslate_stonecutting.json 158bb41bffebb2543e4aa2d5f14cc8af1cdd8671 data/create/recipes/cut_deepslate_brick_wall.json 73a07a5fa665bb20d131f0a0e40806116316928a data/create/recipes/cut_deepslate_brick_wall_from_stone_types_deepslate_stonecutting.json +de1a11b7ed71f1f7aeea2791fe922feef689fd35 data/create/recipes/cut_deepslate_bricks_from_stone_types_deepslate_stonecutting.json 992fdc2eba2afe3ff8aad0ceee5424ecd3f3026d data/create/recipes/cut_deepslate_from_stone_types_deepslate_stonecutting.json 064e2f5edd9209af7742b0f0eb45204453bed46f data/create/recipes/cut_deepslate_slab.json f341d30b7fd427dea09a51d67e1e9532e5184be8 data/create/recipes/cut_deepslate_slab_from_stone_types_deepslate_stonecutting.json @@ -4210,7 +4210,6 @@ c08e12e44344efca550efa8ba14d0cb2f9f6c2c6 data/create/recipes/cut_deepslate_stair e6deec1352fb5c74c470dc488b71e5f8f55bdfbf data/create/recipes/cut_deepslate_stairs_from_stone_types_deepslate_stonecutting.json 2ad7fb3f3a143e58bea8eefe4cd9db3d1c37a3e6 data/create/recipes/cut_deepslate_wall.json e752527479f71f96bb34878008bf8cfb23fd3045 data/create/recipes/cut_deepslate_wall_from_stone_types_deepslate_stonecutting.json -2c23d13f48f3685bda6c564e080053fbfa71ab99 data/create/recipes/cut_diorite_bricks_from_stone_types_diorite_stonecutting.json 90b83c2a2026d70f49c91813305fdee721926db9 data/create/recipes/cut_diorite_brick_slab.json 9d51c690c77321437561a006dc2f9bba975875e6 data/create/recipes/cut_diorite_brick_slab_from_stone_types_diorite_stonecutting.json fa76e64ac9b569f5d5f2f1ecc54e51f9be15aacf data/create/recipes/cut_diorite_brick_slab_recycling.json @@ -4218,6 +4217,7 @@ aa6aea99e9ce2d5dc3d6555ab3d17928bca6195e data/create/recipes/cut_diorite_brick_s 9a26c4097519a9300e591b6578bbaf6c11f909e1 data/create/recipes/cut_diorite_brick_stairs_from_stone_types_diorite_stonecutting.json 78d37df17c7e2be73ce1d226ee552ff3f49b9e4f data/create/recipes/cut_diorite_brick_wall.json f668f2c78a779bc3d0546a82dea02b9f4688e05c data/create/recipes/cut_diorite_brick_wall_from_stone_types_diorite_stonecutting.json +2c23d13f48f3685bda6c564e080053fbfa71ab99 data/create/recipes/cut_diorite_bricks_from_stone_types_diorite_stonecutting.json 1918ecb2ab16ca7dbb30eee4852b67dd963d872e data/create/recipes/cut_diorite_from_stone_types_diorite_stonecutting.json 07fda5c89128648856f948a03ac56a2a2693cf1b data/create/recipes/cut_diorite_slab.json 28765ac7f8b62373b32f014d1dd7f4afb50e1906 data/create/recipes/cut_diorite_slab_from_stone_types_diorite_stonecutting.json @@ -4226,7 +4226,6 @@ dd5f3c59a5d292f7b5c046be35da7f67e8383aa1 data/create/recipes/cut_diorite_slab_re be2c6c01630b90895e7215edce3d02352793dbc4 data/create/recipes/cut_diorite_stairs_from_stone_types_diorite_stonecutting.json 8984b7b7dbc7e65ee04886516501a13278e889e9 data/create/recipes/cut_diorite_wall.json 8ff5d1ecff2202595f7cba5bd65c466c53ac2cc5 data/create/recipes/cut_diorite_wall_from_stone_types_diorite_stonecutting.json -10550b023989113c26d430136daf1dc49f10ce63 data/create/recipes/cut_dripstone_bricks_from_stone_types_dripstone_stonecutting.json 95717a80bb8ae296c2f77478a8f42b88cea88996 data/create/recipes/cut_dripstone_brick_slab.json f04bf1189b53e24974779d9e959e8973d9677162 data/create/recipes/cut_dripstone_brick_slab_from_stone_types_dripstone_stonecutting.json 332534fc2909ca83f5f7f4ab3adf92680bb17f79 data/create/recipes/cut_dripstone_brick_slab_recycling.json @@ -4234,6 +4233,7 @@ f04bf1189b53e24974779d9e959e8973d9677162 data/create/recipes/cut_dripstone_brick 17bf8160eaf16655d454ddfe22b82c9a86462146 data/create/recipes/cut_dripstone_brick_stairs_from_stone_types_dripstone_stonecutting.json 7d638d156326a2e542ed94837273d9cca5cf4fce data/create/recipes/cut_dripstone_brick_wall.json 154931db54115cf4a64147cdd6d1eb7efff48737 data/create/recipes/cut_dripstone_brick_wall_from_stone_types_dripstone_stonecutting.json +10550b023989113c26d430136daf1dc49f10ce63 data/create/recipes/cut_dripstone_bricks_from_stone_types_dripstone_stonecutting.json 7147f9199f174c9864109fe5723528921aaa0c46 data/create/recipes/cut_dripstone_from_stone_types_dripstone_stonecutting.json f2800b467eac75d0099f2f07e09b47115df4e09f data/create/recipes/cut_dripstone_slab.json a4f62a1a30592f82789988f93d8ae35d176eca59 data/create/recipes/cut_dripstone_slab_from_stone_types_dripstone_stonecutting.json @@ -4242,7 +4242,6 @@ a4f62a1a30592f82789988f93d8ae35d176eca59 data/create/recipes/cut_dripstone_slab_ f2df5efedb6fb25ecb877b888007990082d9aca4 data/create/recipes/cut_dripstone_stairs_from_stone_types_dripstone_stonecutting.json a177092d0270f9e07a4f9bef4d0c8fb2ed91d3bc data/create/recipes/cut_dripstone_wall.json a3731ef689d3ac790bc3e3fd507f1134c99a751a data/create/recipes/cut_dripstone_wall_from_stone_types_dripstone_stonecutting.json -9c4c64666b18d3adb11cd3d56667fabf6e88dfe2 data/create/recipes/cut_granite_bricks_from_stone_types_granite_stonecutting.json aa454bebffd7e77cfa5c1bd711bfbac27e3c5a14 data/create/recipes/cut_granite_brick_slab.json d073b9b0b8ca2fbdc5e1ed16f6f195a5f3af4588 data/create/recipes/cut_granite_brick_slab_from_stone_types_granite_stonecutting.json 1dfd539c17a3342a0cd194ce1465a808aacbeda3 data/create/recipes/cut_granite_brick_slab_recycling.json @@ -4250,6 +4249,7 @@ e069aa5c316feb2823ef98e8e6c89bb1bed23d2e data/create/recipes/cut_granite_brick_s f38fc7014aa83d4914d50d87ee3f8f762c078a78 data/create/recipes/cut_granite_brick_stairs_from_stone_types_granite_stonecutting.json 0fd9c3a778c7bdcd7aa06f892a9c260ad664d367 data/create/recipes/cut_granite_brick_wall.json b81db94b6228f512049324dd1436880f1e86e444 data/create/recipes/cut_granite_brick_wall_from_stone_types_granite_stonecutting.json +9c4c64666b18d3adb11cd3d56667fabf6e88dfe2 data/create/recipes/cut_granite_bricks_from_stone_types_granite_stonecutting.json 01970a95f17648a7ef1fb0337ee2e82eb2279e9e data/create/recipes/cut_granite_from_stone_types_granite_stonecutting.json 8fc1c51591e590c8718be0500a4dbcc2b47830ce data/create/recipes/cut_granite_slab.json d239323b7a3b65b2fd7005350a90d578671c2b81 data/create/recipes/cut_granite_slab_from_stone_types_granite_stonecutting.json @@ -4258,7 +4258,6 @@ d239323b7a3b65b2fd7005350a90d578671c2b81 data/create/recipes/cut_granite_slab_fr 3d85d483073d37fea7d9a95831b3b856c0725b98 data/create/recipes/cut_granite_stairs_from_stone_types_granite_stonecutting.json 3d4130fe5fe6e963fd5e10534e729e0448b9f05f data/create/recipes/cut_granite_wall.json d43a876bf89bf3536c80fd5e3ef0ee36c147cd06 data/create/recipes/cut_granite_wall_from_stone_types_granite_stonecutting.json -7cdd3cf302cfe4ef21c0a89dadef4f781e307bb0 data/create/recipes/cut_limestone_bricks_from_stone_types_limestone_stonecutting.json 0e3285206947bcfdf9606d3f8e61ea7d2899f7d2 data/create/recipes/cut_limestone_brick_slab.json c3d3ff37e29c435b2a13d30bd4ded0f6ca9fbfbc data/create/recipes/cut_limestone_brick_slab_from_stone_types_limestone_stonecutting.json 459babb2bd01e9e1ece4c8cd2865690997f01c66 data/create/recipes/cut_limestone_brick_slab_recycling.json @@ -4266,6 +4265,7 @@ d4f8dc640becf1c35416016500424ecd68d7ecee data/create/recipes/cut_limestone_brick 570983b2b27862dabe9f3d1bcd76d2909b8bdb3c data/create/recipes/cut_limestone_brick_stairs_from_stone_types_limestone_stonecutting.json aad4342a726fd65ca2b4c52a4e8857190e50b5be data/create/recipes/cut_limestone_brick_wall.json 5ac226aff9d854efc47ed71241e6c098b170b9b0 data/create/recipes/cut_limestone_brick_wall_from_stone_types_limestone_stonecutting.json +7cdd3cf302cfe4ef21c0a89dadef4f781e307bb0 data/create/recipes/cut_limestone_bricks_from_stone_types_limestone_stonecutting.json 329950373aaaf8e70c54cf5e2467c7a84f372078 data/create/recipes/cut_limestone_from_stone_types_limestone_stonecutting.json cbacfd31703ac908d28e42968bb571dccfa20612 data/create/recipes/cut_limestone_slab.json 628a0a64c2dcd63f17a3ec9ce55ac643b194eacc data/create/recipes/cut_limestone_slab_from_stone_types_limestone_stonecutting.json @@ -4274,7 +4274,6 @@ cbacfd31703ac908d28e42968bb571dccfa20612 data/create/recipes/cut_limestone_slab. ba301da212ee14ff42c38487d0906a2da203e3c3 data/create/recipes/cut_limestone_stairs_from_stone_types_limestone_stonecutting.json d2aac4ac16f9c842af1efd3896dd3250f6d8424e data/create/recipes/cut_limestone_wall.json b14e6972f8586e569a7ab4ecf6ed5d6db1a2bded data/create/recipes/cut_limestone_wall_from_stone_types_limestone_stonecutting.json -a1a2b95283d88e1d990e00da9a095fe928b2aa2f data/create/recipes/cut_ochrum_bricks_from_stone_types_ochrum_stonecutting.json d5a4fa7787d2e56e0b5c8d533567543b93cf694b data/create/recipes/cut_ochrum_brick_slab.json 58514a5f216706e9bb62b27ad03701fe02bac013 data/create/recipes/cut_ochrum_brick_slab_from_stone_types_ochrum_stonecutting.json 6cc3167ebf075d7b302a359d1afdddf5753d0e26 data/create/recipes/cut_ochrum_brick_slab_recycling.json @@ -4282,6 +4281,7 @@ d5a4fa7787d2e56e0b5c8d533567543b93cf694b data/create/recipes/cut_ochrum_brick_sl ec6339d6658b0d32e46c8a4a4e06d94a388a6332 data/create/recipes/cut_ochrum_brick_stairs_from_stone_types_ochrum_stonecutting.json c4139ae7a9742f7111d308fe66bf1d627533550b data/create/recipes/cut_ochrum_brick_wall.json 1b8a4c81680df542a5e6b9e665c96649cf3eb7fa data/create/recipes/cut_ochrum_brick_wall_from_stone_types_ochrum_stonecutting.json +a1a2b95283d88e1d990e00da9a095fe928b2aa2f data/create/recipes/cut_ochrum_bricks_from_stone_types_ochrum_stonecutting.json 2b967f3424196b5da9b396ea58fb969d406af789 data/create/recipes/cut_ochrum_from_stone_types_ochrum_stonecutting.json 5baa701f3cbe8d69e2e6a5554622dd78ef3ac451 data/create/recipes/cut_ochrum_slab.json 9a26cba276cf135a10c71d31f5b960b2ee6ac444 data/create/recipes/cut_ochrum_slab_from_stone_types_ochrum_stonecutting.json @@ -4290,7 +4290,6 @@ c4139ae7a9742f7111d308fe66bf1d627533550b data/create/recipes/cut_ochrum_brick_wa 75a232ccede0ffa7feb3e69da17c6a514a908907 data/create/recipes/cut_ochrum_stairs_from_stone_types_ochrum_stonecutting.json d9c05b7e4ce4ee86d0f6a9e1ee6c1b585ffee58b data/create/recipes/cut_ochrum_wall.json ee0dff8e1317aeffd061688879b97e81a00b7adb data/create/recipes/cut_ochrum_wall_from_stone_types_ochrum_stonecutting.json -087eefb8ffd61fd88f1db6ca25f9ac31e93f2fdf data/create/recipes/cut_scorchia_bricks_from_stone_types_scorchia_stonecutting.json 72ac9293e5791df07914e2d3ed00e5ff59d64b08 data/create/recipes/cut_scorchia_brick_slab.json 2f38c410d5eb93bdb8c8be0f68ac89726e3c765c data/create/recipes/cut_scorchia_brick_slab_from_stone_types_scorchia_stonecutting.json e296e6af6865bf6e4618dab8a96bb88f6999a9a5 data/create/recipes/cut_scorchia_brick_slab_recycling.json @@ -4298,6 +4297,7 @@ bd5984a6b96443319b7fad32db771d8ded0b0591 data/create/recipes/cut_scorchia_brick_ bd5c803c855222a29998dd784e6d12a18dd612d9 data/create/recipes/cut_scorchia_brick_stairs_from_stone_types_scorchia_stonecutting.json adfe0b08b5b72e579d47f36a4f835045e433e7f7 data/create/recipes/cut_scorchia_brick_wall.json 37fc5ae45d0260de9a5c45b0a1b208e4d146a562 data/create/recipes/cut_scorchia_brick_wall_from_stone_types_scorchia_stonecutting.json +087eefb8ffd61fd88f1db6ca25f9ac31e93f2fdf data/create/recipes/cut_scorchia_bricks_from_stone_types_scorchia_stonecutting.json f6dfd648418f24da093b80978c2f6e070f33ff6d data/create/recipes/cut_scorchia_from_stone_types_scorchia_stonecutting.json 7df99605c0c8761aeb9301d5391e1f16d41f89b3 data/create/recipes/cut_scorchia_slab.json fbd9a92d3c3d9e823cac51347320219f1734ec04 data/create/recipes/cut_scorchia_slab_from_stone_types_scorchia_stonecutting.json @@ -4306,7 +4306,6 @@ ad54182c3142ac9d9dd9bb4c5acc18f82e3fc5e5 data/create/recipes/cut_scorchia_stairs 1ddfefce136201ae78dbc53ba472080332fd6366 data/create/recipes/cut_scorchia_stairs_from_stone_types_scorchia_stonecutting.json 0a011b7cee33200fec5546168734c330952124da data/create/recipes/cut_scorchia_wall.json c594d886a303ad6e24d1283004442835ee861fbc data/create/recipes/cut_scorchia_wall_from_stone_types_scorchia_stonecutting.json -8650c0db70a3521b50404252106e0185b4f25a45 data/create/recipes/cut_scoria_bricks_from_stone_types_scoria_stonecutting.json 8baf09b5ff2004d71091b6f95307aa179a21f4df data/create/recipes/cut_scoria_brick_slab.json e7080ca9b6a507bec4a4a3dd52a28c1c33975628 data/create/recipes/cut_scoria_brick_slab_from_stone_types_scoria_stonecutting.json f5b56f6eb9c1ac0f8168b2b0f0b0ab00655ebfdb data/create/recipes/cut_scoria_brick_slab_recycling.json @@ -4314,6 +4313,7 @@ f5b56f6eb9c1ac0f8168b2b0f0b0ab00655ebfdb data/create/recipes/cut_scoria_brick_sl 3fd560355163f0afafefe886e75fd8b2c3cf2b6f data/create/recipes/cut_scoria_brick_stairs_from_stone_types_scoria_stonecutting.json ed803a4cdcf1dd01af03fff52e783f3539f78546 data/create/recipes/cut_scoria_brick_wall.json 553642a4e0dc5f934da8127a427ccdf53d3f51f9 data/create/recipes/cut_scoria_brick_wall_from_stone_types_scoria_stonecutting.json +8650c0db70a3521b50404252106e0185b4f25a45 data/create/recipes/cut_scoria_bricks_from_stone_types_scoria_stonecutting.json 5702063be3d38fa6b3ae5c998337676a0cf91149 data/create/recipes/cut_scoria_from_stone_types_scoria_stonecutting.json 295356022aee8a33272b430879615af638fc5a2c data/create/recipes/cut_scoria_slab.json 1656e822e823fcdf04120b55235aa477845a69a6 data/create/recipes/cut_scoria_slab_from_stone_types_scoria_stonecutting.json @@ -4322,7 +4322,6 @@ d0c88c037004911e377d88cf5a28ff85a413d07e data/create/recipes/cut_scoria_slab_rec 8748df6152c923930452397367562bb6007058cf data/create/recipes/cut_scoria_stairs_from_stone_types_scoria_stonecutting.json 7f9bd9de7bfba21eef449f8e11ffc8cf37de6b88 data/create/recipes/cut_scoria_wall.json 42235c6ded520ecda3321e8cd8910dcfa05cd61e data/create/recipes/cut_scoria_wall_from_stone_types_scoria_stonecutting.json -c02b4daf0050d705c145c0698aaa3094724ba2f1 data/create/recipes/cut_tuff_bricks_from_stone_types_tuff_stonecutting.json 214b6219b86d94ea5705e40f254a4d9a9ac894b7 data/create/recipes/cut_tuff_brick_slab.json 9e0182206fab754daa0596259be0b98a712ba859 data/create/recipes/cut_tuff_brick_slab_from_stone_types_tuff_stonecutting.json 86938ed4ef969e85163c25e2a60181433247b73b data/create/recipes/cut_tuff_brick_slab_recycling.json @@ -4330,6 +4329,7 @@ b4212528d6c8893c1d57c0a5ada60673105e399d data/create/recipes/cut_tuff_brick_stai 90f3241a3eb47d9b0902b639fadee76e41b92a72 data/create/recipes/cut_tuff_brick_stairs_from_stone_types_tuff_stonecutting.json b920d14ac41465f70b1fb8211c1c06d6c41ccadb data/create/recipes/cut_tuff_brick_wall.json aa41f89028dfa995dc11b881894e5a5993e4c4f9 data/create/recipes/cut_tuff_brick_wall_from_stone_types_tuff_stonecutting.json +c02b4daf0050d705c145c0698aaa3094724ba2f1 data/create/recipes/cut_tuff_bricks_from_stone_types_tuff_stonecutting.json 41dc800ae0a8918f4602d610ff0ba9714cdfe8dc data/create/recipes/cut_tuff_from_stone_types_tuff_stonecutting.json 573fff8b4fba92289dc6b113b58c8de25427f62d data/create/recipes/cut_tuff_slab.json 94667fb1e6203bd66bef10acfee7cd990009d26f data/create/recipes/cut_tuff_slab_from_stone_types_tuff_stonecutting.json @@ -4338,7 +4338,6 @@ aa41f89028dfa995dc11b881894e5a5993e4c4f9 data/create/recipes/cut_tuff_brick_wall 3b3ba319bd67a4e7f555cfcb54f9dc1fc22cf015 data/create/recipes/cut_tuff_stairs_from_stone_types_tuff_stonecutting.json 0c241d763e87b23b8799528e132e0d12b0e16141 data/create/recipes/cut_tuff_wall.json 5705b0312c5c70d48662c2ff375f0b2cfe3b4902 data/create/recipes/cut_tuff_wall_from_stone_types_tuff_stonecutting.json -8ab3c640b57421a8c0341ab4ec5bade31376d059 data/create/recipes/cut_veridium_bricks_from_stone_types_veridium_stonecutting.json 822f97726c72d31c4c614767c08140b3535e0640 data/create/recipes/cut_veridium_brick_slab.json 1705fd5fc9ecc9a650812c89f500b5ef9aec2626 data/create/recipes/cut_veridium_brick_slab_from_stone_types_veridium_stonecutting.json 238aeedf55624671809a37246581d28fe6b2c19e data/create/recipes/cut_veridium_brick_slab_recycling.json @@ -4346,6 +4345,7 @@ dfbef691643cead7111b3b1c51aabcda8419bc19 data/create/recipes/cut_veridium_brick_ db2ea87f3ec8924ba9e0b87cd6a6edeb93c0c2d8 data/create/recipes/cut_veridium_brick_stairs_from_stone_types_veridium_stonecutting.json 5e5c9fab7ba7143d206df7d8184742fb1a17c99c data/create/recipes/cut_veridium_brick_wall.json ed752a7f698e3ecbb5e4f848a78f8b3c7c6bf12e data/create/recipes/cut_veridium_brick_wall_from_stone_types_veridium_stonecutting.json +8ab3c640b57421a8c0341ab4ec5bade31376d059 data/create/recipes/cut_veridium_bricks_from_stone_types_veridium_stonecutting.json e0355543105e4ec9d672d2a050e70b5c198ea472 data/create/recipes/cut_veridium_from_stone_types_veridium_stonecutting.json fb3c671f64676538ea3aa96be483ac15b3cdeb3d data/create/recipes/cut_veridium_slab.json 7d7c80ac03ad8623f9a5d7f0ff0bb6f68985efa5 data/create/recipes/cut_veridium_slab_from_stone_types_veridium_stonecutting.json @@ -4531,7 +4531,6 @@ a157a43e7788d285b8d72eade5955369c9b9a1de data/create/recipes/rose_quartz_block_f 1268cc2bdd088d26b84fb4e481db27af61f94bd1 data/create/recipes/scorchia_pillar_from_stone_types_scorchia_stonecutting.json 2e8f4cdb3498547a5e6fe658bb33d4be5ce8f54b data/create/recipes/scoria_from_stone_types_scoria_stonecutting.json 770d3453c75f77b16db661f6e636892d3117690b data/create/recipes/scoria_pillar_from_stone_types_scoria_stonecutting.json -75dc56fcdcd6a10288f2d607bf6dcbbe10b35a64 data/create/recipes/small_andesite_bricks_from_stone_types_andesite_stonecutting.json 2e86fddc76285b4e380b845eb1150580b134d0ac data/create/recipes/small_andesite_brick_slab.json 311727e5c08ddbe0aa26275be74e9b83201ac8ab data/create/recipes/small_andesite_brick_slab_from_stone_types_andesite_stonecutting.json 2767e239c9d704b6bb5325b4f40e0aa0acdcdce1 data/create/recipes/small_andesite_brick_slab_recycling.json @@ -4539,7 +4538,7 @@ a157a43e7788d285b8d72eade5955369c9b9a1de data/create/recipes/rose_quartz_block_f 9e82896e00c1e14e514fac818e11e5b9ef5b10d7 data/create/recipes/small_andesite_brick_stairs_from_stone_types_andesite_stonecutting.json 5287d389b4954d954881d9f0293c52870bba88d0 data/create/recipes/small_andesite_brick_wall.json 1172ca76affd948c50b207124ee03c4f480f4ee8 data/create/recipes/small_andesite_brick_wall_from_stone_types_andesite_stonecutting.json -e3b69122b2cfe64b043384235eeb6d04f346e58b data/create/recipes/small_asurine_bricks_from_stone_types_asurine_stonecutting.json +75dc56fcdcd6a10288f2d607bf6dcbbe10b35a64 data/create/recipes/small_andesite_bricks_from_stone_types_andesite_stonecutting.json 9196a055491052afc14ed01667cccf2a0920e793 data/create/recipes/small_asurine_brick_slab.json f4cc3330837a647c098ccb24fbbbf583c3f960fc data/create/recipes/small_asurine_brick_slab_from_stone_types_asurine_stonecutting.json 063b2f0ad7e93698999922040132eb2b23661a38 data/create/recipes/small_asurine_brick_slab_recycling.json @@ -4547,7 +4546,7 @@ a85d2f957223f87ffa2c3f63cdf6f9f0f84bb921 data/create/recipes/small_asurine_brick c7cb218b0d8a1e358d593fc1fef82fc074289552 data/create/recipes/small_asurine_brick_stairs_from_stone_types_asurine_stonecutting.json 08d10ee57995e67ac1fb5feba04b03aee51dbe16 data/create/recipes/small_asurine_brick_wall.json 4c0aa6203295a36a6d7ffe9d7bf0973277162689 data/create/recipes/small_asurine_brick_wall_from_stone_types_asurine_stonecutting.json -07125218f9025833afa189fa0090f4d6b4660db0 data/create/recipes/small_calcite_bricks_from_stone_types_calcite_stonecutting.json +e3b69122b2cfe64b043384235eeb6d04f346e58b data/create/recipes/small_asurine_bricks_from_stone_types_asurine_stonecutting.json a72719de028ca9e07756dae6031af48525520fc2 data/create/recipes/small_calcite_brick_slab.json d8ebf6f1eb2e2372fb20def956398089adec5d13 data/create/recipes/small_calcite_brick_slab_from_stone_types_calcite_stonecutting.json ab4cfc2b34989d41a434781a3150ecd530c4f15b data/create/recipes/small_calcite_brick_slab_recycling.json @@ -4555,7 +4554,7 @@ c77a7700d978e23db14d947915591061dda8eab3 data/create/recipes/small_calcite_brick 4e066bfc60ea142d54ce939d025b6679ac9634ad data/create/recipes/small_calcite_brick_stairs_from_stone_types_calcite_stonecutting.json 64e53d8090fa26cc4cb62efea7c1615ff7f705c2 data/create/recipes/small_calcite_brick_wall.json 3ba736ae76249fa61692c13f7879af954f9bbd36 data/create/recipes/small_calcite_brick_wall_from_stone_types_calcite_stonecutting.json -a3309c81f84bf4fb78e9db2316fb758f9b2f8429 data/create/recipes/small_crimsite_bricks_from_stone_types_crimsite_stonecutting.json +07125218f9025833afa189fa0090f4d6b4660db0 data/create/recipes/small_calcite_bricks_from_stone_types_calcite_stonecutting.json 92cf7e99229c1e72405bb0875e6f939b3f5aea12 data/create/recipes/small_crimsite_brick_slab.json b993e081103c019b7b9b73b38ef8c408fb4500ac data/create/recipes/small_crimsite_brick_slab_from_stone_types_crimsite_stonecutting.json 7f6fa1fab65d910388f5f2ec4ee7d99cbda8df57 data/create/recipes/small_crimsite_brick_slab_recycling.json @@ -4563,7 +4562,7 @@ b993e081103c019b7b9b73b38ef8c408fb4500ac data/create/recipes/small_crimsite_bric 260da721849d1afd6f431d51538d1587ee3af8d5 data/create/recipes/small_crimsite_brick_stairs_from_stone_types_crimsite_stonecutting.json 093ac919f793111b442029198383a9de5b6df027 data/create/recipes/small_crimsite_brick_wall.json 8b8280a8282fa8718620ee3d69182e241a7852c0 data/create/recipes/small_crimsite_brick_wall_from_stone_types_crimsite_stonecutting.json -e7a3cb889ce6b530cd40f19e23bad943374e61b5 data/create/recipes/small_deepslate_bricks_from_stone_types_deepslate_stonecutting.json +a3309c81f84bf4fb78e9db2316fb758f9b2f8429 data/create/recipes/small_crimsite_bricks_from_stone_types_crimsite_stonecutting.json 022690548a46f5cc63adda3626824a81c6ebf490 data/create/recipes/small_deepslate_brick_slab.json 655be9ddf21dea2255fb2cb2628a5fee39eb10e2 data/create/recipes/small_deepslate_brick_slab_from_stone_types_deepslate_stonecutting.json d6d3db5604279cd402f64dbdeae7c3bee6d7ab78 data/create/recipes/small_deepslate_brick_slab_recycling.json @@ -4571,7 +4570,7 @@ d6d3db5604279cd402f64dbdeae7c3bee6d7ab78 data/create/recipes/small_deepslate_bri 0a458e8248fe395748bd6025d43c002db5a7d343 data/create/recipes/small_deepslate_brick_stairs_from_stone_types_deepslate_stonecutting.json 96e2c36ac2f2899c9681f12f43c8ae232ae09180 data/create/recipes/small_deepslate_brick_wall.json e5644f4227b9cc9b98158ce3ded98bff1ffb97f9 data/create/recipes/small_deepslate_brick_wall_from_stone_types_deepslate_stonecutting.json -38b80603a86df24f6be0df9fd5f7d9b7aa33d2f9 data/create/recipes/small_diorite_bricks_from_stone_types_diorite_stonecutting.json +e7a3cb889ce6b530cd40f19e23bad943374e61b5 data/create/recipes/small_deepslate_bricks_from_stone_types_deepslate_stonecutting.json 6c66b44941c8b97cfec5948b5d8b08355f8d8f67 data/create/recipes/small_diorite_brick_slab.json 801f6cc6e06db56344b37c9b76c69f921c6d9293 data/create/recipes/small_diorite_brick_slab_from_stone_types_diorite_stonecutting.json c1fe4bff306e2d2b5d5595e4b35dd85f7e6bf0ce data/create/recipes/small_diorite_brick_slab_recycling.json @@ -4579,7 +4578,7 @@ af6feedf00bdfa45c1b8f0dd46ddaa80da622fed data/create/recipes/small_diorite_brick 30a6f2bdfec2b3f578572c9f94112906411e7c54 data/create/recipes/small_diorite_brick_stairs_from_stone_types_diorite_stonecutting.json 8728b791808736de2ac31e8dc81aa43638ae0ac8 data/create/recipes/small_diorite_brick_wall.json 7a1fdcef7091d76230fbee410fa5241f584845c4 data/create/recipes/small_diorite_brick_wall_from_stone_types_diorite_stonecutting.json -8840d538648516dd02628fbe3ea4f032ceda78bb data/create/recipes/small_dripstone_bricks_from_stone_types_dripstone_stonecutting.json +38b80603a86df24f6be0df9fd5f7d9b7aa33d2f9 data/create/recipes/small_diorite_bricks_from_stone_types_diorite_stonecutting.json 39a545b60040bd2d922cd3bd5af5036b1b9b23ef data/create/recipes/small_dripstone_brick_slab.json c91e4dc211305456c38e5823def91811ad851202 data/create/recipes/small_dripstone_brick_slab_from_stone_types_dripstone_stonecutting.json 55bb37d07e841bb8eecf2013445c01c8e09ff824 data/create/recipes/small_dripstone_brick_slab_recycling.json @@ -4587,7 +4586,7 @@ c91e4dc211305456c38e5823def91811ad851202 data/create/recipes/small_dripstone_bri 1e23c8df90aef6cd3561369f72c6c3106da883f5 data/create/recipes/small_dripstone_brick_stairs_from_stone_types_dripstone_stonecutting.json fda46cc15c21e7843537df5b5331874fd7511e19 data/create/recipes/small_dripstone_brick_wall.json 336e47b35437ffea4bb86d34f94e6361b2bbcfb0 data/create/recipes/small_dripstone_brick_wall_from_stone_types_dripstone_stonecutting.json -42c74dec6c64d3675e15b2b73cb32fc9d24839e9 data/create/recipes/small_granite_bricks_from_stone_types_granite_stonecutting.json +8840d538648516dd02628fbe3ea4f032ceda78bb data/create/recipes/small_dripstone_bricks_from_stone_types_dripstone_stonecutting.json d1bb4e91d80ca8eb9c2f935cbb66ef08b9ca7059 data/create/recipes/small_granite_brick_slab.json ddb2f4652607b56332a927af939212a5789a34db data/create/recipes/small_granite_brick_slab_from_stone_types_granite_stonecutting.json f1388636bcf98d7d9103c23528053b28c6305b4e data/create/recipes/small_granite_brick_slab_recycling.json @@ -4595,7 +4594,7 @@ f1388636bcf98d7d9103c23528053b28c6305b4e data/create/recipes/small_granite_brick ba935a3d64eedbd9b7017d0abfab351f57589593 data/create/recipes/small_granite_brick_stairs_from_stone_types_granite_stonecutting.json dac22c54e8034587a3fcf3aa0ce19bb4b7607cd7 data/create/recipes/small_granite_brick_wall.json 7a8d9e2291675de9e72363d93410de9039216f32 data/create/recipes/small_granite_brick_wall_from_stone_types_granite_stonecutting.json -714f6a84a5b3d5d57c07364925555e6f545b0b3d data/create/recipes/small_limestone_bricks_from_stone_types_limestone_stonecutting.json +42c74dec6c64d3675e15b2b73cb32fc9d24839e9 data/create/recipes/small_granite_bricks_from_stone_types_granite_stonecutting.json b844632a588cb96397750f4387c7e6517f85092c data/create/recipes/small_limestone_brick_slab.json a1c0bc263cd4659a89213f4fcdd87eba7ae04427 data/create/recipes/small_limestone_brick_slab_from_stone_types_limestone_stonecutting.json ec9154a3791113f57dc1c16dfef4c837533b6fc6 data/create/recipes/small_limestone_brick_slab_recycling.json @@ -4603,7 +4602,7 @@ ec9154a3791113f57dc1c16dfef4c837533b6fc6 data/create/recipes/small_limestone_bri 6943fdc8162e4d53c459f425b2ff5b34e9caa477 data/create/recipes/small_limestone_brick_stairs_from_stone_types_limestone_stonecutting.json 27ff69345efea14b9688fe9b182809995ea8ad4a data/create/recipes/small_limestone_brick_wall.json 98a83f757f0ac9cc2a876ae407bb5765071e700d data/create/recipes/small_limestone_brick_wall_from_stone_types_limestone_stonecutting.json -22c69e391110280e13d50693b9c81355da57a315 data/create/recipes/small_ochrum_bricks_from_stone_types_ochrum_stonecutting.json +714f6a84a5b3d5d57c07364925555e6f545b0b3d data/create/recipes/small_limestone_bricks_from_stone_types_limestone_stonecutting.json abdd280694cb30ce0d2703aadeeb378af9a7f8b2 data/create/recipes/small_ochrum_brick_slab.json e37612fa2523fa3711242cac4ec5e596b3e55698 data/create/recipes/small_ochrum_brick_slab_from_stone_types_ochrum_stonecutting.json 8f3f47cb3e759104cf86a422339345f8795143d3 data/create/recipes/small_ochrum_brick_slab_recycling.json @@ -4611,8 +4610,8 @@ de8d7f8e57645c0b5a6e98eb0cc4e573c5cf96ac data/create/recipes/small_ochrum_brick_ 04ebbdd14f81f4b4dc7986cb5241caa9f48f4ff1 data/create/recipes/small_ochrum_brick_stairs_from_stone_types_ochrum_stonecutting.json 07876725f97ff611f8d1710462224f07cab3ebbd data/create/recipes/small_ochrum_brick_wall.json 2331801569ec95562afc802f7e2ff191d329a5c6 data/create/recipes/small_ochrum_brick_wall_from_stone_types_ochrum_stonecutting.json +22c69e391110280e13d50693b9c81355da57a315 data/create/recipes/small_ochrum_bricks_from_stone_types_ochrum_stonecutting.json 68a9f80b97d9322ed33067d7717180494b904bed data/create/recipes/small_rose_quartz_tiles_from_polished_rose_quartz_stonecutting.json -bf27af2e54ed1b09611d67ee7afa6c7f56d00d09 data/create/recipes/small_scorchia_bricks_from_stone_types_scorchia_stonecutting.json 133057778480e1d2e13fe7b2766ba0891feea3a5 data/create/recipes/small_scorchia_brick_slab.json dad342d215c98f3214752e0ebfaf3015943c5ac7 data/create/recipes/small_scorchia_brick_slab_from_stone_types_scorchia_stonecutting.json 0a57ad5fce22d69cdc1dd880403612ffb47af4ba data/create/recipes/small_scorchia_brick_slab_recycling.json @@ -4620,7 +4619,7 @@ dad342d215c98f3214752e0ebfaf3015943c5ac7 data/create/recipes/small_scorchia_bric 7f89c9c6dcea06a3022c72029a5e547aa1721773 data/create/recipes/small_scorchia_brick_stairs_from_stone_types_scorchia_stonecutting.json 43310b3fa43bd791ef0e2e30971a24e788c20139 data/create/recipes/small_scorchia_brick_wall.json de8edc4fa5eec031ad0a63c7f59141985ae9af9e data/create/recipes/small_scorchia_brick_wall_from_stone_types_scorchia_stonecutting.json -b1a67d052e26c2129c34ee0732cfe533beb3e571 data/create/recipes/small_scoria_bricks_from_stone_types_scoria_stonecutting.json +bf27af2e54ed1b09611d67ee7afa6c7f56d00d09 data/create/recipes/small_scorchia_bricks_from_stone_types_scorchia_stonecutting.json d8a41adcc6ae9b0eb71a83b2dd89ff92a10e0057 data/create/recipes/small_scoria_brick_slab.json 34f4dd094f2949e3fd21f95ac890ae803b81fbea data/create/recipes/small_scoria_brick_slab_from_stone_types_scoria_stonecutting.json f15ad1cb05f5b02b630b982d23bd951178a3650c data/create/recipes/small_scoria_brick_slab_recycling.json @@ -4628,7 +4627,7 @@ df5a1437fb112519d904cc9f1cd28d5d891fb04d data/create/recipes/small_scoria_brick_ d36428daf8bf4e560f649e5eb40a8cd7a27e7a0e data/create/recipes/small_scoria_brick_stairs_from_stone_types_scoria_stonecutting.json cad432398d8886d60b94e96b2c2096ae27fffb50 data/create/recipes/small_scoria_brick_wall.json 9cff8370aaa81ece466fe15642c00a9992bd416c data/create/recipes/small_scoria_brick_wall_from_stone_types_scoria_stonecutting.json -e51ced16059f7c37fe3652a1cf4d938f91e956fc data/create/recipes/small_tuff_bricks_from_stone_types_tuff_stonecutting.json +b1a67d052e26c2129c34ee0732cfe533beb3e571 data/create/recipes/small_scoria_bricks_from_stone_types_scoria_stonecutting.json dd83af4a10a9b0ba6a4efb272d8b6b1611524a39 data/create/recipes/small_tuff_brick_slab.json e3a12b87830e47387e9ac118bb3d12b73558d757 data/create/recipes/small_tuff_brick_slab_from_stone_types_tuff_stonecutting.json 85dff00dc49eaf65f1f149a7f21a9f307b1b9710 data/create/recipes/small_tuff_brick_slab_recycling.json @@ -4636,7 +4635,7 @@ e03a8270b01b9a5cad238db4ce2b8f66ea78e8bf data/create/recipes/small_tuff_brick_st cd50bb5842c90038f6ac74e45971ab2e914d1463 data/create/recipes/small_tuff_brick_stairs_from_stone_types_tuff_stonecutting.json e795fbe5062ec47cc660ee26c8398477509c5f18 data/create/recipes/small_tuff_brick_wall.json 34471a7ebb431b6d1e3be5fa480b800b96556fee data/create/recipes/small_tuff_brick_wall_from_stone_types_tuff_stonecutting.json -82f17edc61a319c74dbdfa730584305899bd7572 data/create/recipes/small_veridium_bricks_from_stone_types_veridium_stonecutting.json +e51ced16059f7c37fe3652a1cf4d938f91e956fc data/create/recipes/small_tuff_bricks_from_stone_types_tuff_stonecutting.json f9a2f4ca078364e05b3446fe890ea207e5a56e87 data/create/recipes/small_veridium_brick_slab.json 234c3baee4c9428caab3e344f396ec87064103e3 data/create/recipes/small_veridium_brick_slab_from_stone_types_veridium_stonecutting.json b0db8335e3c7fd88f074c3895bea952efc0e8df8 data/create/recipes/small_veridium_brick_slab_recycling.json @@ -4644,6 +4643,7 @@ a1e214c230574526ca0a2fec059b4157ddec557d data/create/recipes/small_veridium_bric f63031587a64ed88ddba1df07767dd8d8caa1d2e data/create/recipes/small_veridium_brick_stairs_from_stone_types_veridium_stonecutting.json 9b003fbf2bcd975501ba307ea68c6c4bab397683 data/create/recipes/small_veridium_brick_wall.json 1ba48c5cae05b6f4b1ad223ce80925f1eaaf5dfd data/create/recipes/small_veridium_brick_wall_from_stone_types_veridium_stonecutting.json +82f17edc61a319c74dbdfa730584305899bd7572 data/create/recipes/small_veridium_bricks_from_stone_types_veridium_stonecutting.json 47973044b19b35ce169e7d46abc9d11a2f67a487 data/create/recipes/spruce_window.json 810544f79bf4b002981e614eaa8e49b48a7b5397 data/create/recipes/spruce_window_pane.json e343a80c92dab60f99c9b441d00189aceee477a0 data/create/recipes/tiled_glass_from_glass_colorless_stonecutting.json diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 5f8a0dc827..f2105984d2 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -1522,9 +1522,7 @@ "create.item_attributes.washable.inverted": "pǝɥsɐM ǝq ʇouuɐɔ", "create.item_hatch.deposit_inventory": "pǝʇısodǝp sɯǝʇı ʎɹoʇuǝʌuI", "create.item_hatch.deposit_item": "pǝʇısodǝp ɯǝʇı pןǝH", - "create.keyinfo.ponder": "ɹǝpuoԀ", - "create.keyinfo.scrolldown": ")pןɹoʍuı( uʍoᗡ ןǝǝɥʍǝsnoW ǝʇɐןnɯıS", - "create.keyinfo.scrollup": ")pןɹoʍuı( d∩ ןǝǝɥʍǝsnoW ǝʇɐןnɯıS", + "create.keyinfo.rotate_menu": "nuǝW uoıʇɐʇoᴚ ʞɔoןᗺ uǝdO", "create.keyinfo.toolbelt": "sǝxoqןoo⟘ ʎqɹɐǝN ssǝɔɔⱯ", "create.keyinfo.toolmenu": "ʎɐןɹǝʌO ɔıʇɐɯǝɥɔS snɔoℲ", "create.kinetics.creative_motor.rotation_speed": "WԀᴚ uı pǝǝdS pǝʇɐɹǝuǝ⅁", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 852ed87650..6fbc360708 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1522,9 +1522,7 @@ "create.item_attributes.washable.inverted": "cannot be Washed", "create.item_hatch.deposit_inventory": "Inventory items deposited", "create.item_hatch.deposit_item": "Held item deposited", - "create.keyinfo.ponder": "Ponder", - "create.keyinfo.scrolldown": "Simulate Mousewheel Down (inworld)", - "create.keyinfo.scrollup": "Simulate Mousewheel Up (inworld)", + "create.keyinfo.rotate_menu": "Open Block Rotation Menu", "create.keyinfo.toolbelt": "Access Nearby Toolboxes", "create.keyinfo.toolmenu": "Focus Schematic Overlay", "create.kinetics.creative_motor.rotation_speed": "Generated Speed in RPM", diff --git a/src/main/java/com/simibubi/create/AllKeys.java b/src/main/java/com/simibubi/create/AllKeys.java index 0b1f1338be..a3a39a6319 100644 --- a/src/main/java/com/simibubi/create/AllKeys.java +++ b/src/main/java/com/simibubi/create/AllKeys.java @@ -1,5 +1,10 @@ package com.simibubi.create; +import com.simibubi.create.AllSoundEvents.SoundEntry; +import com.tterrag.registrate.providers.ProviderType; + +import net.minecraftforge.data.loading.DatagenModLoader; + import org.lwjgl.glfw.GLFW; import com.mojang.blaze3d.platform.InputConstants; @@ -12,25 +17,39 @@ import net.minecraftforge.client.event.RegisterKeyMappingsEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; +import java.util.function.BiConsumer; + @EventBusSubscriber(value = Dist.CLIENT, bus = EventBusSubscriber.Bus.MOD) public enum AllKeys { - TOOL_MENU("toolmenu", GLFW.GLFW_KEY_LEFT_ALT), - ACTIVATE_TOOL("", GLFW.GLFW_KEY_LEFT_CONTROL), - TOOLBELT("toolbelt", GLFW.GLFW_KEY_LEFT_ALT), - ROTATE_MENU("rotate_menu", GLFW.GLFW_KEY_UNKNOWN), + TOOL_MENU("toolmenu", GLFW.GLFW_KEY_LEFT_ALT, "Focus Schematic Overlay"), + ACTIVATE_TOOL(GLFW.GLFW_KEY_LEFT_CONTROL), + TOOLBELT("toolbelt", GLFW.GLFW_KEY_LEFT_ALT, "Access Nearby Toolboxes"), + ROTATE_MENU("rotate_menu", GLFW.GLFW_KEY_UNKNOWN, "Open Block Rotation Menu"), ; private KeyMapping keybind; - private String description; - private int key; - private boolean modifiable; + private final String description; + private final String translation; + private final int key; + private final boolean modifiable; - private AllKeys(String description, int defaultKey) { + AllKeys(int defaultKey) { + this("", defaultKey, ""); + } + + AllKeys(String description, int defaultKey, String translation) { this.description = Create.ID + ".keyinfo." + description; this.key = defaultKey; this.modifiable = !description.isEmpty(); + this.translation = translation; + } + + public static void provideLang(BiConsumer consumer) { + for (AllKeys key : values()) + if (key.modifiable) + consumer.accept(key.description, key.translation); } @SubscribeEvent diff --git a/src/main/java/com/simibubi/create/infrastructure/data/CreateDatagen.java b/src/main/java/com/simibubi/create/infrastructure/data/CreateDatagen.java index e4aaffed9c..81a8030eb7 100644 --- a/src/main/java/com/simibubi/create/infrastructure/data/CreateDatagen.java +++ b/src/main/java/com/simibubi/create/infrastructure/data/CreateDatagen.java @@ -6,6 +6,7 @@ import java.util.function.BiConsumer; import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import com.simibubi.create.AllKeys; import com.simibubi.create.AllSoundEvents; import com.simibubi.create.Create; import com.simibubi.create.foundation.advancement.AllAdvancements; @@ -63,6 +64,7 @@ public class CreateDatagen { provideDefaultLang("tooltips", langConsumer); AllAdvancements.provideLang(langConsumer); AllSoundEvents.provideLang(langConsumer); + AllKeys.provideLang(langConsumer); providePonderLang(langConsumer); }); } diff --git a/src/main/resources/assets/create/lang/default/interface.json b/src/main/resources/assets/create/lang/default/interface.json index f40f23f9f4..f60b897e06 100644 --- a/src/main/resources/assets/create/lang/default/interface.json +++ b/src/main/resources/assets/create/lang/default/interface.json @@ -114,12 +114,6 @@ "create.action.saveToFile": "Save", "create.action.discard": "Discard", - "create.keyinfo.toolmenu": "Focus Schematic Overlay", - "create.keyinfo.toolbelt": "Access Nearby Toolboxes", - "create.keyinfo.scrollup": "Simulate Mousewheel Up (inworld)", - "create.keyinfo.scrolldown": "Simulate Mousewheel Down (inworld)", - "create.keyinfo.ponder": "Ponder", - "create.gui.scrollInput.defaultTitle": "Choose an Option:", "create.gui.scrollInput.scrollToModify": "Scroll to Modify", "create.gui.scrollInput.scrollToAdjustAmount": "Scroll to Adjust Amount", @@ -342,7 +336,7 @@ "create.gui.stock_keeper.not_in_stock": "Required items are not in Stock", "create.gui.stock_keeper.schematic_list.no_results": "No items from your checklist are in stock", "create.gui.stock_keeper.schematic_list.requesting": "Click 'Send' to request all available items from your checklist", - + "create.stock_keeper.shopping_list_empty_hand": "Empty hand required to start a shopping list", "create.stock_keeper.no_price_set": "Shop owner must set a price first", "create.stock_keeper.keeper_missing": "Stock keeper missing", @@ -353,10 +347,10 @@ "create.stock_keeper.stock_level_too_low": "Purchase cancelled: Stock levels lower than expected", "create.stock_keeper.cash_register_full": "Purchase cancelled: Not enough space in Cash Register", "create.stock_keeper.too_broke": "You cannot afford this purchase", - + "create.stock_ticker.contains_payments": "Contains payments:", "create.stock_ticker.click_to_retrieve": "Click to retrieve", - + "create.gui.stock_ticker.category_editor": "Category Editor", "create.gui.stock_ticker.shift_moves_top": "Shift moves to top", "create.gui.stock_ticker.shift_moves_bottom": "Shift moves to bottom", @@ -367,7 +361,7 @@ "create.gui.stock_ticker.category_name": "Category Name", "create.gui.stock_ticker.delete_category": "Delete Category", "create.gui.stock_ticker.empty_category_name_placeholder": "(Empty)", - + "create.table_cloth.price_per_order": "Price per Order", "create.table_cloth.amount": "Amount", "create.table_cloth.shop_configured": "Item shop configured", @@ -375,7 +369,7 @@ "create.table_cloth.hand_to_shop_keeper": "Hand this to a shop keeper", "create.table_cloth.sneak_click_discard": "Sneak-Click to discard", "create.table_cloth.shopping_list_discarded": "Shopping list discarded", - + "create.gui.address_box.clipboard_tip": "Keeping Track", "create.gui.address_box.clipboard_tip_1": "Entries starting with '#' on", "create.gui.address_box.clipboard_tip_2": "held or nearby clipboards will", @@ -790,12 +784,12 @@ "create.schedule.instruction.throttle.summary": "Change Max Speed to %1$s", "create.schedule.instruction.throttle_edit_box": "Throttle", "create.schedule.instruction.throttle_edit_box_1": "Affects the top speed of the Train", - + "create.schedule.instruction.package_delivery": "Deliver Package", "create.schedule.instruction.package_delivery.summary": "Deliver first package in cargo", "create.schedule.instruction.package_delivery.summary_1": "Drives to the station with", "create.schedule.instruction.package_delivery.summary_2": "the correct postbox", - + "create.schedule.instruction.package_retrieval": "Retrieve Package", "create.schedule.instruction.package_retrieval.summary": "Fetch a package addressed to:", "create.schedule.instruction.package_retrieval.summary_1": "Drives to a postbox with", @@ -1047,14 +1041,14 @@ "create.display_link.information_type": "Type of Information", "create.display_link.display_on": "Write data to:", "create.display_link.display_on_multiline": "Start writing at:", - + "create.logistically_linked.tuned": "Tuned to this link", "create.logistically_linked.new_network_started": "New link network started", "create.logistically_linked.connected": "Connected to existing network successfully", "create.logistically_linked.tooltip": "Frequency configured", "create.logistically_linked.tooltip_clear": "Place in crafting grid to reset", "create.logistically_linked.protected": "Logistics Network is Protected", - + "create.gui.factory_panel.title_as_recipe": "Recipe Settings", "create.gui.factory_panel.title_as_restocker": "Restocker Settings", "create.gui.factory_panel.connect_input": "Add new connection", @@ -1097,18 +1091,18 @@ "create.gui.factory_panel.address_missing": "Inactive: missing a target address", "create.gui.factory_panel.no_target_amount_set": "Inactive: no target amount set", "create.gui.factory_panel.has_link_connections": "Gauge has connected links", - + "create.gui.redstone_requester.allow_partial": "Allow partial orders", "create.gui.redstone_requester.dont_allow_partial": "Must send all items", "create.gui.redstone_requester.requester_address": "Send order to...", "create.gui.redstone_requester.requester_address_given": "Sending order to", "create.gui.redstone_requester.requester_address_tip": "Enter the address this", "create.gui.redstone_requester.requester_address_tip_1": "order should be send to.", - + "create.gui.factory_panel.expected_output_tip": "The amount of output returning", "create.gui.factory_panel.expected_output_tip_1": "after each successful request", "create.gui.factory_panel.expected_output_tip_2": "Scroll to change", - + "create.factory_panel.click_to_configure": "Click to configure", "create.factory_panel.hold_to_set_amount": "Click and hold for target amount", "create.factory_panel.target_amount": "Target Amount in Storage", @@ -1129,7 +1123,7 @@ "create.factory_panel.connection_aborted": "Input connection aborted", "create.factory_panel.cannot_add_more_inputs": "Cannot add more inputs to this gauge", "create.factory_panel.already_connected": "Gauges are already connected", - + "create.display_source.label": "Attached Label", "create.display_source.combine_item_names": "Combine Item Names", "create.display_source.count_items": "Amount of matching Items", From a592e22df360a2b128f98b9b55cdfd192812d2e6 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Sun, 12 Jan 2025 12:51:37 -0500 Subject: [PATCH 289/515] Conflicting thoughts - Fix certain attributes overriding the type id --- .../item/filter/attribute/ItemAttribute.java | 2 +- .../attribute/attributes/AddedByAttribute.java | 4 ++-- .../attribute/attributes/ColorAttribute.java | 6 +++--- .../attributes/FluidContentsAttribute.java | 6 +++--- .../attributes/ShulkerFillLevelAttribute.java | 8 ++++---- .../AllItemAttributeLegacyDeserializers.java | 18 ++++++++++++++---- 6 files changed, 27 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/ItemAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/ItemAttribute.java index ad5966b2c6..039f9384d1 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/ItemAttribute.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/ItemAttribute.java @@ -25,7 +25,7 @@ public interface ItemAttribute { if (id == null) throw new IllegalArgumentException("Cannot get " + attribute.getType() + "as it does not exist in AllRegistries.ITEM_ATTRIBUTE_TYPES"); - nbt.putString("id", id.toString()); + nbt.putString("attributeId", id.toString()); attribute.save(nbt); return nbt; } diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/AddedByAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/AddedByAttribute.java index 53a32a1e95..13afe30149 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/AddedByAttribute.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/AddedByAttribute.java @@ -48,12 +48,12 @@ public class AddedByAttribute implements ItemAttribute { @Override public void save(CompoundTag nbt) { - nbt.putString("id", modId); + nbt.putString("modId", modId); } @Override public void load(CompoundTag nbt) { - modId = nbt.getString("id"); + modId = nbt.getString("modId"); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/ColorAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/ColorAttribute.java index 95c543b073..44ae12164b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/ColorAttribute.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/ColorAttribute.java @@ -85,13 +85,13 @@ public class ColorAttribute implements ItemAttribute { @Override public void save(CompoundTag nbt) { - nbt.putInt("id", color.getId()); + nbt.putInt("color", color.getId()); } @Override public void load(CompoundTag nbt) { - if (nbt.contains("id")) { - color = DyeColor.byId(nbt.getInt("id")); + if (nbt.contains("color")) { + color = DyeColor.byId(nbt.getInt("color")); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/FluidContentsAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/FluidContentsAttribute.java index 5c79cd08ec..50ba59a484 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/FluidContentsAttribute.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/FluidContentsAttribute.java @@ -72,13 +72,13 @@ public class FluidContentsAttribute implements ItemAttribute { ResourceLocation id = ForgeRegistries.FLUIDS.getKey(fluid); if (id == null) return; - nbt.putString("id", id.toString()); + nbt.putString("fluidId", id.toString()); } @Override public void load(CompoundTag nbt) { - if (nbt.contains("id")) { - fluid = ForgeRegistries.FLUIDS.getValue(ResourceLocation.tryParse(nbt.getString("id"))); + if (nbt.contains("fluidId")) { + fluid = ForgeRegistries.FLUIDS.getValue(ResourceLocation.tryParse(nbt.getString("fluidId"))); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/ShulkerFillLevelAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/ShulkerFillLevelAttribute.java index 9ba0ac01fb..b581562b9d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/ShulkerFillLevelAttribute.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/ShulkerFillLevelAttribute.java @@ -55,17 +55,17 @@ public class ShulkerFillLevelAttribute implements ItemAttribute { @Override public void save(CompoundTag nbt) { if (levels != null) - nbt.putString("id", levels.key); + nbt.putString("level", levels.key); } @Override public void load(CompoundTag nbt) { - if (nbt.contains("id")) { - levels = ShulkerLevels.fromKey(nbt.getString("id")); + if (nbt.contains("level")) { + levels = ShulkerLevels.fromKey(nbt.getString("level")); } } - enum ShulkerLevels { + public enum ShulkerLevels { EMPTY("empty", amount -> amount == 0), PARTIAL("partial", amount -> amount > 0 && amount < Integer.MAX_VALUE), FULL("full", amount -> amount == Integer.MAX_VALUE); diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/legacydeserializers/AllItemAttributeLegacyDeserializers.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/legacydeserializers/AllItemAttributeLegacyDeserializers.java index 84a11cf1f1..36758feb2d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/legacydeserializers/AllItemAttributeLegacyDeserializers.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/legacydeserializers/AllItemAttributeLegacyDeserializers.java @@ -8,13 +8,19 @@ import org.jetbrains.annotations.ApiStatus; import com.simibubi.create.content.logistics.item.filter.attribute.AllItemAttributeTypes; import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttribute; import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttributeType; +import com.simibubi.create.content.logistics.item.filter.attribute.attributes.AddedByAttribute; +import com.simibubi.create.content.logistics.item.filter.attribute.attributes.ColorAttribute; import com.simibubi.create.content.logistics.item.filter.attribute.attributes.EnchantAttribute; +import com.simibubi.create.content.logistics.item.filter.attribute.attributes.FluidContentsAttribute; import com.simibubi.create.content.logistics.item.filter.attribute.attributes.InTagAttribute; +import com.simibubi.create.content.logistics.item.filter.attribute.attributes.ShulkerFillLevelAttribute; +import com.simibubi.create.content.logistics.item.filter.attribute.attributes.ShulkerFillLevelAttribute.ShulkerLevels; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.ItemTags; +import net.minecraft.world.item.DyeColor; @SuppressWarnings("deprecation") public class AllItemAttributeLegacyDeserializers { @@ -28,12 +34,16 @@ public class AllItemAttributeLegacyDeserializers { ))) ); createLegacyDeserializer("in_item_group", AllItemAttributeTypes.IN_ITEM_GROUP); - createLegacyDeserializer("added_by", AllItemAttributeTypes.ADDED_BY); + createLegacyDeserializer("added_by", tag -> + new AddedByAttribute(tag.getString("id"))); createLegacyDeserializer("has_enchant", tag -> new EnchantAttribute(BuiltInRegistries.ENCHANTMENT.get(ResourceLocation.tryParse(tag.getString("id"))))); - createLegacyDeserializer("shulker_fill_level", AllItemAttributeTypes.SHULKER_FILL_LEVEL); - createLegacyDeserializer("has_color", AllItemAttributeTypes.HAS_COLOR); - createLegacyDeserializer("has_fluid", AllItemAttributeTypes.HAS_FLUID); + createLegacyDeserializer("shulker_fill_level", tag -> + new ShulkerFillLevelAttribute(ShulkerLevels.fromKey(tag.getString("id")))); + createLegacyDeserializer("has_color", tag -> + new ColorAttribute(DyeColor.byId(tag.getInt("id")))); + createLegacyDeserializer("has_fluid", tag -> + new FluidContentsAttribute(BuiltInRegistries.FLUID.get(ResourceLocation.tryParse(tag.getString("id"))))); createLegacyDeserializer("has_name", AllItemAttributeTypes.HAS_NAME); createLegacyDeserializer("book_author", AllItemAttributeTypes.BOOK_AUTHOR); createLegacyDeserializer("book_copy", AllItemAttributeTypes.BOOK_COPY); From d567f76e5e2402df81c93a750bf5939ed776eaab Mon Sep 17 00:00:00 2001 From: IThundxr Date: Sun, 12 Jan 2025 12:58:36 -0500 Subject: [PATCH 290/515] Early morning mistakes --- .../content/logistics/item/filter/attribute/ItemAttribute.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/ItemAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/ItemAttribute.java index 039f9384d1..a51ca3cd12 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/ItemAttribute.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/ItemAttribute.java @@ -38,7 +38,7 @@ public interface ItemAttribute { } } - ResourceLocation id = ResourceLocation.tryParse(nbt.getString("id")); + ResourceLocation id = ResourceLocation.tryParse(nbt.getString("attributeId")); if (id == null) return null; From 66b21643f4cb19edb828eccc0a3aed02f213a083 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Sun, 12 Jan 2025 20:45:27 +0100 Subject: [PATCH 291/515] You've got ponder - Ponder scene for Postboxes --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 754 +++++++++--------- .../resources/assets/create/lang/en_ud.json | 19 +- .../resources/assets/create/lang/en_us.json | 19 +- .../postbox/PostboxBlockEntity.java | 5 +- .../foundation/ponder/CreatePonderPlugin.java | 5 + .../ponder/AllCreatePonderScenes.java | 4 + .../highLogistics/FrogAndConveyorScenes.java | 6 +- .../scenes/highLogistics/PostboxScenes.java | 477 +++++++++++ .../ponder/high_logistics/package_postbox.nbt | Bin 0 -> 1996 bytes 9 files changed, 901 insertions(+), 388 deletions(-) create mode 100644 src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/PostboxScenes.java create mode 100644 src/main/resources/assets/create/ponder/high_logistics/package_postbox.nbt diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 481f003d76..bd04d6148b 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2025-01-12T12:15:29.065153499 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2025-01-12T20:44:34.2740637 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -83,13 +83,13 @@ b5170d754ce5f07ea2b4646eb07c099c50bae249 assets/create/blockstates/clipboard.jso f7254f20f91e2f1295e36d2e70390d43f3952d07 assets/create/blockstates/copper_door.json 736777de0eb038ff1ef9e8fe9d04c23d80239eda assets/create/blockstates/copper_ladder.json df3103dfc1c3ba7a9573229d009cb0de4925df16 assets/create/blockstates/copper_scaffolding.json +4d3d29e8a74bf103da39e76a1466b03eb5dcf916 assets/create/blockstates/copper_shingles.json 1ea8fdb990f8cda1762ab69ac38ea3161a835227 assets/create/blockstates/copper_shingle_slab.json 7c35bb802099d6bb5d92eafd8cbb7ea146979a2e assets/create/blockstates/copper_shingle_stairs.json -4d3d29e8a74bf103da39e76a1466b03eb5dcf916 assets/create/blockstates/copper_shingles.json 5c5ba06bf5b0a2c57d0aa42e85880f36d9694a78 assets/create/blockstates/copper_table_cloth.json +9a9f03140a57a7a8903d3e1b159bdc052566a6ec assets/create/blockstates/copper_tiles.json 7db7a0d81887091ca889f40bb8a508d3098c5164 assets/create/blockstates/copper_tile_slab.json c0b7eca017242913d156e4623147add0d03574f6 assets/create/blockstates/copper_tile_stairs.json -9a9f03140a57a7a8903d3e1b159bdc052566a6ec assets/create/blockstates/copper_tiles.json ef3ccb2d8b03f5a972b053a15bb037f8db6af17c assets/create/blockstates/copper_valve_handle.json 4758bed22fb6fe18213f463bc055775c1909e858 assets/create/blockstates/copycat_bars.json 4789c857508452aede1cb7389187b99ce2d7bf62 assets/create/blockstates/copycat_base.json @@ -106,114 +106,114 @@ c9a2c3a7971c46957d0f07c6d94d76f59da54a0b assets/create/blockstates/crushing_whee 4b0e51a1c10685f7d432467339afc9c2e24793b0 assets/create/blockstates/crushing_wheel_controller.json ba9c3ecfacbd398048440d247decffeaefc714b5 assets/create/blockstates/cuckoo_clock.json 1f6d84cba69062a1989d671c9c97317e2c2455b6 assets/create/blockstates/cut_andesite.json +cc62a6499ce8dcfc5e8695f0e8bb3c3d67f41efc assets/create/blockstates/cut_andesite_bricks.json 50d88f806122818af2ffecbd514d13ebbd21e4c9 assets/create/blockstates/cut_andesite_brick_slab.json 32d801225ea18209792921fa91618ed41794dbd0 assets/create/blockstates/cut_andesite_brick_stairs.json 3bf8204bf8c7c5b7b3c388fbc3478bb2d7c47129 assets/create/blockstates/cut_andesite_brick_wall.json -cc62a6499ce8dcfc5e8695f0e8bb3c3d67f41efc assets/create/blockstates/cut_andesite_bricks.json 34e89a828f14383c6115954a235b19851b74f277 assets/create/blockstates/cut_andesite_slab.json 49d58ae14544d89305ddc707cf7f6a81998200fa assets/create/blockstates/cut_andesite_stairs.json 1cc235cb6c388324793ac40f7bf89df8b048faac assets/create/blockstates/cut_andesite_wall.json 13ea54a4b9b89e576879a6e23a029c6341b7c098 assets/create/blockstates/cut_asurine.json +51c22c0547ab8ed2564890afb8733bbe356899f5 assets/create/blockstates/cut_asurine_bricks.json cf09de38f826fe000c5efe5afe56cf746125691d assets/create/blockstates/cut_asurine_brick_slab.json 1835482d5e9a59f2214336a63b12c7132ad815b4 assets/create/blockstates/cut_asurine_brick_stairs.json c48ab37bf7a2aba676af281d29cb6a2103c72fba assets/create/blockstates/cut_asurine_brick_wall.json -51c22c0547ab8ed2564890afb8733bbe356899f5 assets/create/blockstates/cut_asurine_bricks.json 1523a57124239a99da0b12a6b435c09d3d4276a5 assets/create/blockstates/cut_asurine_slab.json cc1acf5e118f1b1e78c5bb291176008960794d59 assets/create/blockstates/cut_asurine_stairs.json 139640bf41070e8eeb48647319eee54bb6804692 assets/create/blockstates/cut_asurine_wall.json 06b8c5cf98366608c480a37e6944d0d668bc8983 assets/create/blockstates/cut_calcite.json +979c70e35d806f1f63fe3381f27d881a17f9f6be assets/create/blockstates/cut_calcite_bricks.json a8f83cb8e1eae587f4e11e37c4cd3d0a1bbef377 assets/create/blockstates/cut_calcite_brick_slab.json 1eabb2e485aa323d317fa9648be02c12556593b7 assets/create/blockstates/cut_calcite_brick_stairs.json a0a33df71c5d26344a7bb0dd7a4622c30cc7825f assets/create/blockstates/cut_calcite_brick_wall.json -979c70e35d806f1f63fe3381f27d881a17f9f6be assets/create/blockstates/cut_calcite_bricks.json e3ddaae92b52cc3ea230088ff23260b5c5c93017 assets/create/blockstates/cut_calcite_slab.json 80c5249eaf9504c743c427fdd1a2c7bfa0f3d48f assets/create/blockstates/cut_calcite_stairs.json b4bbdb08d8114b6741546a0418cb54d645481c02 assets/create/blockstates/cut_calcite_wall.json 449f5180c72a028393afdac55a34e59862728224 assets/create/blockstates/cut_crimsite.json +25d731077a131d03347296c38c76b547194a6320 assets/create/blockstates/cut_crimsite_bricks.json d2c8a3580d3578c8afe44b94d4448be3680dbdeb assets/create/blockstates/cut_crimsite_brick_slab.json a3d9d2190a23b881dd3a7538ab248e0b0a3efa8e assets/create/blockstates/cut_crimsite_brick_stairs.json 3791c00ed477c0aaf7c5a20803a89dfc0e20f013 assets/create/blockstates/cut_crimsite_brick_wall.json -25d731077a131d03347296c38c76b547194a6320 assets/create/blockstates/cut_crimsite_bricks.json c9f19e7a976a7428b3dd58f45d734700ca1a18cd assets/create/blockstates/cut_crimsite_slab.json 1b8d4ac53dc5823083c2af605165a05b73c9ff79 assets/create/blockstates/cut_crimsite_stairs.json 484f9253ed92e963f398973a99fbeacb67ba1188 assets/create/blockstates/cut_crimsite_wall.json c4e95ceb7914da09ebe42d539bf5d976a3d70972 assets/create/blockstates/cut_deepslate.json +75d4ef863cd85d8f3df78226177966954e02ee2b assets/create/blockstates/cut_deepslate_bricks.json e1dc99a48b9066732fc5c62071c5ead16f34f438 assets/create/blockstates/cut_deepslate_brick_slab.json dbb2eddaf1d4ae3e687beb611552ea4283a1e7d8 assets/create/blockstates/cut_deepslate_brick_stairs.json 91c1f3da848503067c64b966ddda22ab91ff8fd5 assets/create/blockstates/cut_deepslate_brick_wall.json -75d4ef863cd85d8f3df78226177966954e02ee2b assets/create/blockstates/cut_deepslate_bricks.json 593198ffd37eae124a8366ae1d4a40b682788f92 assets/create/blockstates/cut_deepslate_slab.json f8cd1f9002ed8593ab71af9cfb7f962625994108 assets/create/blockstates/cut_deepslate_stairs.json c2d8060a0c830e5b8bbb084457083324b5b6f4c9 assets/create/blockstates/cut_deepslate_wall.json aaa6ac5f4fc399c4b03a7f8de856fa7aae97e049 assets/create/blockstates/cut_diorite.json +08b6289ca8b4193c87324ca23ca081e8773fb223 assets/create/blockstates/cut_diorite_bricks.json 423f809f06fa3fd96643f068ba0d3520269b3844 assets/create/blockstates/cut_diorite_brick_slab.json 9011fb92f57e7695c4484c923dd40ecd749ff307 assets/create/blockstates/cut_diorite_brick_stairs.json 41bad89777a33737bc0365ce2c7ffc20720f9620 assets/create/blockstates/cut_diorite_brick_wall.json -08b6289ca8b4193c87324ca23ca081e8773fb223 assets/create/blockstates/cut_diorite_bricks.json b03e7cf494c53c6f24ba93d0ef531e839026932b assets/create/blockstates/cut_diorite_slab.json 95c8094204979acfb0e59c2826003e0274a02fe5 assets/create/blockstates/cut_diorite_stairs.json e2f163d36dd5d03c0741dd2e87d8f77a0c86ae00 assets/create/blockstates/cut_diorite_wall.json f42ca2ce8e8f657c64376759413ec611f8045531 assets/create/blockstates/cut_dripstone.json +2d696162b2085c3d5723308a8d1ccafb29660f01 assets/create/blockstates/cut_dripstone_bricks.json 9310a800fb091014e7c0a220f5f2511c1de379ad assets/create/blockstates/cut_dripstone_brick_slab.json 3ff2f65dafcb4654b99e0d65b7e851760f9a4075 assets/create/blockstates/cut_dripstone_brick_stairs.json cafc956d8dc2053e5a0e8437c4ccde7fa24fc17e assets/create/blockstates/cut_dripstone_brick_wall.json -2d696162b2085c3d5723308a8d1ccafb29660f01 assets/create/blockstates/cut_dripstone_bricks.json 9cb32af3b952b841e9da94789da17cd274c3cfb9 assets/create/blockstates/cut_dripstone_slab.json da0300f54bdfcc705beb8d84f26406be660de5de assets/create/blockstates/cut_dripstone_stairs.json 83ff3eaeb481202c77e6dbdc442b4dd195ca568c assets/create/blockstates/cut_dripstone_wall.json bf501250fd2226838afe0baf68db08cd832e3c4f assets/create/blockstates/cut_granite.json +5c029d7ec837b3239d17ab91a70f025df1bfb124 assets/create/blockstates/cut_granite_bricks.json 773717bd5c140cf025f463c99c67efb9d27bd696 assets/create/blockstates/cut_granite_brick_slab.json 97d20b21e5b7f329c1b21b436fd0bdcaa8d173d0 assets/create/blockstates/cut_granite_brick_stairs.json 5e4175b6c89039ded48937ad1cd13d3bb2d2992a assets/create/blockstates/cut_granite_brick_wall.json -5c029d7ec837b3239d17ab91a70f025df1bfb124 assets/create/blockstates/cut_granite_bricks.json 42549436ce26ad7b44f2e1cba54357b3f25bcb18 assets/create/blockstates/cut_granite_slab.json e9d8fd028d8092e5fa0fd13cd638516f57a22d53 assets/create/blockstates/cut_granite_stairs.json 2daab523202dd2e31daeaf3b9a04cde2a7da4ca5 assets/create/blockstates/cut_granite_wall.json 0652c8b9c41acc1a8da901bd7b8b6018b3581d5b assets/create/blockstates/cut_limestone.json +508ee569f313b7e804f6268ca86f5a61851563ec assets/create/blockstates/cut_limestone_bricks.json 4efbeb34c96918e9b48dc484a82b1ef4811ed39d assets/create/blockstates/cut_limestone_brick_slab.json 11b99cf9b33d7f8de9d11cc1e405e2681682ba32 assets/create/blockstates/cut_limestone_brick_stairs.json b6c02a9e9e47a8e521a54ef9488259267068f032 assets/create/blockstates/cut_limestone_brick_wall.json -508ee569f313b7e804f6268ca86f5a61851563ec assets/create/blockstates/cut_limestone_bricks.json fb63a2581211fe62344985a06feec9dcec4b1888 assets/create/blockstates/cut_limestone_slab.json ffcca1e66718f3e78e544b5fa9954a852c095e91 assets/create/blockstates/cut_limestone_stairs.json a1a90f84b47f96b4384fc2d60bfc48ddbb5ed179 assets/create/blockstates/cut_limestone_wall.json 1b7a133518780d4f49474a70e7f6263d6e88ff51 assets/create/blockstates/cut_ochrum.json +6f37e5e2dca3b443951131cb82c15a981a4e2005 assets/create/blockstates/cut_ochrum_bricks.json f1e9d54a6f9f41b968f117a7be711011effa71a5 assets/create/blockstates/cut_ochrum_brick_slab.json 8d334e026e94b304a1ff1ee96097f434b50175f2 assets/create/blockstates/cut_ochrum_brick_stairs.json e92c026ee7ab2aa35003ad475bef3d6c0e29818c assets/create/blockstates/cut_ochrum_brick_wall.json -6f37e5e2dca3b443951131cb82c15a981a4e2005 assets/create/blockstates/cut_ochrum_bricks.json 5a61edb7d146e83d951795fae33dc306e71b2cb6 assets/create/blockstates/cut_ochrum_slab.json b31944bf6297685acd37631083dde0889c08ede7 assets/create/blockstates/cut_ochrum_stairs.json df33a8af1dc8cb08ddcfd22a50a305499479a4dd assets/create/blockstates/cut_ochrum_wall.json 1606d7481e56755f07e9331cf85a8d7cc9aace9a assets/create/blockstates/cut_scorchia.json +bc2a0e7f11400b8c2a03071be87dadb5edc097de assets/create/blockstates/cut_scorchia_bricks.json 43db25ebac2f5bcaa7ca9cfb6da8fcb20fad8269 assets/create/blockstates/cut_scorchia_brick_slab.json 7a80620590ba5e61967c5168f5c67ecabf09dc00 assets/create/blockstates/cut_scorchia_brick_stairs.json e4eb79360a41bb1a7ca835d61446ea5166e4cda8 assets/create/blockstates/cut_scorchia_brick_wall.json -bc2a0e7f11400b8c2a03071be87dadb5edc097de assets/create/blockstates/cut_scorchia_bricks.json c0d262f54e3b2fce8bc941a2a6df71db5f0229ea assets/create/blockstates/cut_scorchia_slab.json de2e918058e9dd7eafd085a8dec634f6a2832c21 assets/create/blockstates/cut_scorchia_stairs.json 5d2d06799b82449754f62b1d80b9ee9a24c65bad assets/create/blockstates/cut_scorchia_wall.json 76ea4f3438a3effedfc93d2bbabac0899610cd28 assets/create/blockstates/cut_scoria.json +6d9c79e1b71656a73bb69e2a9b100be59084dd2e assets/create/blockstates/cut_scoria_bricks.json 7c7dcd1fe82f3673910620c2eefebad5d0029cdf assets/create/blockstates/cut_scoria_brick_slab.json d535b387bf0a6f9e124eed8b76d899e13699bca9 assets/create/blockstates/cut_scoria_brick_stairs.json c426e1b5e4c77c25cd0d16d10fba0e0731673dd1 assets/create/blockstates/cut_scoria_brick_wall.json -6d9c79e1b71656a73bb69e2a9b100be59084dd2e assets/create/blockstates/cut_scoria_bricks.json fb692494c88358d4d8e687b216f729d6b6bd7174 assets/create/blockstates/cut_scoria_slab.json 950f43bae8f4e3220103ce0c62f444856129ca12 assets/create/blockstates/cut_scoria_stairs.json 01350030831c5b9edef0dc2c778b92f1ebc2b2fc assets/create/blockstates/cut_scoria_wall.json c0c1c4d44eba5babe9703eca31f0279ebd11ed8e assets/create/blockstates/cut_tuff.json +9bddef4a2b4a338c15f03e2397c4cd4c3ae9e5d9 assets/create/blockstates/cut_tuff_bricks.json 11306e83915e0106d48f890df3212c3a47443a08 assets/create/blockstates/cut_tuff_brick_slab.json e8951d94e0d3228700bcb56819928f1c179c3973 assets/create/blockstates/cut_tuff_brick_stairs.json 619340b7cf014cfb72a4b5440b90881535f16108 assets/create/blockstates/cut_tuff_brick_wall.json -9bddef4a2b4a338c15f03e2397c4cd4c3ae9e5d9 assets/create/blockstates/cut_tuff_bricks.json 3577e3f4933ea8cb7464c28e80867ce84917898d assets/create/blockstates/cut_tuff_slab.json 5673fdb02439d622c56dc0ff47a0dca98dc6d027 assets/create/blockstates/cut_tuff_stairs.json 12a46ee82536665400ec2f3befed3be58325d5c6 assets/create/blockstates/cut_tuff_wall.json beb9e47f8d811c2146f68daf992fb805342a65cb assets/create/blockstates/cut_veridium.json +04d07986eb86ffd66baaaf9b65e02d00022e98e2 assets/create/blockstates/cut_veridium_bricks.json 952543c03e730443d85059ec43642efb089485e7 assets/create/blockstates/cut_veridium_brick_slab.json 6a033e7b5a0b26cce5956c6c7c1eff558f866cb5 assets/create/blockstates/cut_veridium_brick_stairs.json 43689138c8018b3ee9f35a11870887e9df3c8fe5 assets/create/blockstates/cut_veridium_brick_wall.json -04d07986eb86ffd66baaaf9b65e02d00022e98e2 assets/create/blockstates/cut_veridium_bricks.json 212d8ee5dfa78802b9539640cf8b263fd5880b87 assets/create/blockstates/cut_veridium_slab.json c11f09df4a23e951bdf9a345515183f4fac7cde3 assets/create/blockstates/cut_veridium_stairs.json 3aa6f5e613ff73952e3de00408051f92316e7f81 assets/create/blockstates/cut_veridium_wall.json @@ -241,12 +241,12 @@ f7f5df9086c71688cbdb5d05c394dc5acb8fb338 assets/create/blockstates/elevator_cont d47bc65703e9582cc710e6408fb565e16d3514a6 assets/create/blockstates/encased_fan.json 651f9fdb11f56d887d131be8f936f508d0b2fc1d assets/create/blockstates/encased_fluid_pipe.json 489ad4daeaed702d231a3f175f7b66846f5789a6 assets/create/blockstates/experience_block.json +5f6c60a30889b043709066707e80a21081d98155 assets/create/blockstates/exposed_copper_shingles.json 74c8a72db3dd3fa919e29baaa8c5865f13490461 assets/create/blockstates/exposed_copper_shingle_slab.json 4e0b5a9be15f0c2861f5f6bd71bd9c2a4db2a21d assets/create/blockstates/exposed_copper_shingle_stairs.json -5f6c60a30889b043709066707e80a21081d98155 assets/create/blockstates/exposed_copper_shingles.json +5299b4f7b9b3490872e8c26a6b212e14dd05fd9a assets/create/blockstates/exposed_copper_tiles.json 6ee73ff3608d51fdad6e9810feee66ed1773b81c assets/create/blockstates/exposed_copper_tile_slab.json f93e4059876bfc6d70b9fa2bc24d8e3d6943d56f assets/create/blockstates/exposed_copper_tile_stairs.json -5299b4f7b9b3490872e8c26a6b212e14dd05fd9a assets/create/blockstates/exposed_copper_tiles.json 4b30365ed77db9c5754eeda5fee81d47b568b946 assets/create/blockstates/factory_gauge.json f1a03ede031d8c4e33a4d07c529e71936da9dc6d assets/create/blockstates/fake_track.json 21fa4a1bf4ee851e090a21c97c9a38d18cfddf0d assets/create/blockstates/fluid_pipe.json @@ -323,6 +323,8 @@ fa5fb2be73c7c54b70e927b66adf3f4d64c5cb6b assets/create/blockstates/light_gray_ni f1901887cd166296e465133c3b0d7ad0d664a614 assets/create/blockstates/light_gray_table_cloth.json 35b151db396069b146d223fbe46be5b0c3dda8a9 assets/create/blockstates/light_gray_toolbox.json 894827ffd176bc733abecf18d96888e9ed5a3eb4 assets/create/blockstates/light_gray_valve_handle.json +a6f319c803c03e34bbf841ea52d82f0f7ec7a413 assets/create/blockstates/limestone.json +7ff65e1c4c8e48a0b694cd17506a192e6a7e6e44 assets/create/blockstates/limestone_pillar.json 7f20b548dd535942b2d6f41c39de7ad4fafe637e assets/create/blockstates/lime_nixie_tube.json c6ac740bf37477ad170576983230b130ac01f355 assets/create/blockstates/lime_postbox.json ad1ec304729fd6d336c0d4d0c27c9345af636695 assets/create/blockstates/lime_sail.json @@ -330,8 +332,6 @@ b9934a558e1b495403dc2c71ffb43cce7d396013 assets/create/blockstates/lime_seat.jso 7c5dc2ffd0bd44ba8785b6a788030714a009bcbc assets/create/blockstates/lime_table_cloth.json 49a02f7fc16697ba1cf16cee7e45ab6bfd8b06ce assets/create/blockstates/lime_toolbox.json ba181485f219d3ae23509a7edf28e25d9edb10f4 assets/create/blockstates/lime_valve_handle.json -a6f319c803c03e34bbf841ea52d82f0f7ec7a413 assets/create/blockstates/limestone.json -7ff65e1c4c8e48a0b694cd17506a192e6a7e6e44 assets/create/blockstates/limestone_pillar.json 654e845cebed82b7afbcf81380921e0a475b01e9 assets/create/blockstates/linear_chassis.json e195e82e4d0c1fc20474535bc9068cbb77a5e175 assets/create/blockstates/lit_blaze_burner.json 296186b196af94e1ab3f7e8a3254f6d31ae47a5c assets/create/blockstates/magenta_nixie_tube.json @@ -377,14 +377,14 @@ aab812cecf7d10d4e7587f4dead8a98238a15f41 assets/create/blockstates/orange_seat.j 2af63a4768f84fc93c7e7d67fa9a64438433e59f assets/create/blockstates/orange_valve_handle.json 515ed7dae09b052f289419ba09998a23e0d7083d assets/create/blockstates/ornate_iron_window.json 8118444f37536b9104ef4818d374b0c8a7c987bf assets/create/blockstates/ornate_iron_window_pane.json +97cd78453af94f44cef1187988966626574b29d5 assets/create/blockstates/oxidized_copper_shingles.json 2ddc762b8d8558e69a2f81c028702f3a25b5e978 assets/create/blockstates/oxidized_copper_shingle_slab.json ac536ae742c12e97bfd0b2483c87ff29f3935eaf assets/create/blockstates/oxidized_copper_shingle_stairs.json -97cd78453af94f44cef1187988966626574b29d5 assets/create/blockstates/oxidized_copper_shingles.json +110a6c19bcc9f044e5e982ac6e4b295b03ec0145 assets/create/blockstates/oxidized_copper_tiles.json 3f3924f0f0e368edfa04f4fdd6d6c2319276ddfe assets/create/blockstates/oxidized_copper_tile_slab.json 5e634cfb9abb06d8b29f39d751fc56b28ea5a9cd assets/create/blockstates/oxidized_copper_tile_stairs.json -110a6c19bcc9f044e5e982ac6e4b295b03ec0145 assets/create/blockstates/oxidized_copper_tiles.json -887565a0f89f089d6be888c87394dde4878afda7 assets/create/blockstates/package_frogport.json 65f3fa5a068189c1c2971af1a1052f69c0e26005 assets/create/blockstates/packager.json +887565a0f89f089d6be888c87394dde4878afda7 assets/create/blockstates/package_frogport.json 36742cc6ce052ead143366d31b11e828a525c1b8 assets/create/blockstates/peculiar_bell.json 53d102e706d53cb2c0dbc0bc11da828084a43519 assets/create/blockstates/pink_nixie_tube.json db7ef5acb1ce2d3b8f881f34b5d9f40633c3973d assets/create/blockstates/pink_postbox.json @@ -470,6 +470,9 @@ a4b6bd4e55cd292abf752efeda93cf8d23162657 assets/create/blockstates/purple_table_ 3aca01f2eddb22adb1b25735b98a990bfc7220d2 assets/create/blockstates/radial_chassis.json 72faac9777be540f95f8b662a833856e0e1b8f35 assets/create/blockstates/railway_casing.json 7ce346fa18702f6fe6e2a939efcfa26eda63fe38 assets/create/blockstates/raw_zinc_block.json +ec546afd3ec8036e4393b97d535f05a86f57dbc1 assets/create/blockstates/redstone_contact.json +ff205f032b36486753dddb1f2029ef8d53e9c86f assets/create/blockstates/redstone_link.json +e4c645b199a2d7e89c91065071a0a91df5ca8e3c assets/create/blockstates/redstone_requester.json e3fd62e466e3e6e7bd6fc8661f764ba972a466fc assets/create/blockstates/red_nixie_tube.json d14d6437a6727da13cea5f7eeb815720c80dde6f assets/create/blockstates/red_postbox.json 4c36b562da58ef2af57009da7cf2426059249228 assets/create/blockstates/red_sail.json @@ -477,9 +480,6 @@ d14d6437a6727da13cea5f7eeb815720c80dde6f assets/create/blockstates/red_postbox.j 90bf31515faa2e7e6d73414a6c5498911910710e assets/create/blockstates/red_table_cloth.json 380f46b7cb72b13c0f16fd4a4287a1a33adeff41 assets/create/blockstates/red_toolbox.json b689d87a27ed0cb2cab190a2ad2b599818bff56c assets/create/blockstates/red_valve_handle.json -ec546afd3ec8036e4393b97d535f05a86f57dbc1 assets/create/blockstates/redstone_contact.json -ff205f032b36486753dddb1f2029ef8d53e9c86f assets/create/blockstates/redstone_link.json -e4c645b199a2d7e89c91065071a0a91df5ca8e3c assets/create/blockstates/redstone_requester.json 87ab7ca62ecf24d60d7e5c61bd5af97714dad0ad assets/create/blockstates/refined_radiance_casing.json 64a5b256e5af2dc8cb7ed77f0feadcf5134f7335 assets/create/blockstates/repackager.json 3807bcc6ccc3dad0dbfcc8fcf260a361aa488659 assets/create/blockstates/rope.json @@ -489,8 +489,8 @@ dd63fd8443a2be507281548df838d878b0c3c8c8 assets/create/blockstates/rose_quartz_l dfe69ee57f832a2e4c576ee01bdde1617c81e46a assets/create/blockstates/rose_quartz_tiles.json b9cbbc7c4e1d9abd312263a9a270315bd5f0106b assets/create/blockstates/rotation_speed_controller.json 5a25ecb95b7978cc487491cb24478e4d6a73e977 assets/create/blockstates/sail_frame.json -505510656c77d93ecd3691e7111615193275f29e assets/create/blockstates/schematic_table.json bff758cc56bece375b40c32067b903b675065328 assets/create/blockstates/schematicannon.json +505510656c77d93ecd3691e7111615193275f29e assets/create/blockstates/schematic_table.json 82c9ceb19cfc4e247fbb62a9605630ba08423efe assets/create/blockstates/scorchia.json 6fa99d5f1ff05153660f9917286d4b157eaa1b40 assets/create/blockstates/scorchia_pillar.json 8c34743564aa0473745ecec304a19e15e9e87cf2 assets/create/blockstates/scoria.json @@ -499,64 +499,64 @@ e5aff9dc8fa5e98b060232974194afb06d497d09 assets/create/blockstates/scoria_pillar 3343224d6da4e75f0bc7a7634ba010a4ba54ad70 assets/create/blockstates/sequenced_gearshift.json 4c261d54117ee295b307f6ea3e56a09437631f73 assets/create/blockstates/shadow_steel_casing.json 4c67d2a1a1faea5be2a81ebc0722c32d8e2e84d6 assets/create/blockstates/shaft.json +c606f103619088e8a5afe969ba54929af480a3d2 assets/create/blockstates/small_andesite_bricks.json c5469de5957d77fc11febaa658ee2bfb0d11b0bc assets/create/blockstates/small_andesite_brick_slab.json ed0bcfd07959aa208085910bd3780756979c985d assets/create/blockstates/small_andesite_brick_stairs.json 78e30e63adedf1ca95261eb4010a1db45aecfe9e assets/create/blockstates/small_andesite_brick_wall.json -c606f103619088e8a5afe969ba54929af480a3d2 assets/create/blockstates/small_andesite_bricks.json +b9fedc13dc8cb53a8bb16ce2257ea65f0ac94a6b assets/create/blockstates/small_asurine_bricks.json 653fa70f0aa7fc319d50f72692d507ff7c59c0f4 assets/create/blockstates/small_asurine_brick_slab.json e61a0b891729565434d6ab34aa3aeada7d189f9d assets/create/blockstates/small_asurine_brick_stairs.json 02556b916c198c683279eb4392ebaa31fb41e182 assets/create/blockstates/small_asurine_brick_wall.json -b9fedc13dc8cb53a8bb16ce2257ea65f0ac94a6b assets/create/blockstates/small_asurine_bricks.json e986248237013eea755bccd300f745e44d0a183f assets/create/blockstates/small_bogey.json +031d9492dbcc5de77431e8f54b9b04db412b5690 assets/create/blockstates/small_calcite_bricks.json 898bca10ff6e5402c4b8b84e1b9ba9036b32b8bc assets/create/blockstates/small_calcite_brick_slab.json ecc2276bdb2b24f54e31372bf207171a348e55d3 assets/create/blockstates/small_calcite_brick_stairs.json d9dd243b5b754a487755b53609d404ac1b3fde99 assets/create/blockstates/small_calcite_brick_wall.json -031d9492dbcc5de77431e8f54b9b04db412b5690 assets/create/blockstates/small_calcite_bricks.json +3d4e0b54ffda83f7f6e08b6a745db81049d95f3b assets/create/blockstates/small_crimsite_bricks.json 4094bf00cad8dea2dd234866b482c07175802c4c assets/create/blockstates/small_crimsite_brick_slab.json 7f73a2505e2a3a98a7749fa98f4623aa2d216edd assets/create/blockstates/small_crimsite_brick_stairs.json b477c7f1855c9eb2ef1bf672376e972678dc563f assets/create/blockstates/small_crimsite_brick_wall.json -3d4e0b54ffda83f7f6e08b6a745db81049d95f3b assets/create/blockstates/small_crimsite_bricks.json +17359d1b87399bb066cfc23002bcf0d8f71d8ccd assets/create/blockstates/small_deepslate_bricks.json c67f32adc49f0b24b34f098a390a398813365260 assets/create/blockstates/small_deepslate_brick_slab.json d05aed31d45ed12f8f117a9c64312b1abff8bd2f assets/create/blockstates/small_deepslate_brick_stairs.json 6952b02d8c5adf3d0d1a243221b637c50edaa287 assets/create/blockstates/small_deepslate_brick_wall.json -17359d1b87399bb066cfc23002bcf0d8f71d8ccd assets/create/blockstates/small_deepslate_bricks.json +6c0ac59e09feb76afc078a88431442a2a6381c6c assets/create/blockstates/small_diorite_bricks.json ee39994b434a17ec7497b271a6e0a006cf6311cb assets/create/blockstates/small_diorite_brick_slab.json eb335cf0a857299b9cd0c4f60e00bc8e4ca7efe8 assets/create/blockstates/small_diorite_brick_stairs.json b6f7c563c30483c749849899b96d4f0030b71df1 assets/create/blockstates/small_diorite_brick_wall.json -6c0ac59e09feb76afc078a88431442a2a6381c6c assets/create/blockstates/small_diorite_bricks.json +d51095bfb9d5758f8b3972a973fbe282569b0234 assets/create/blockstates/small_dripstone_bricks.json 3d8109d327099c65ca0fafcb5651051059cad1df assets/create/blockstates/small_dripstone_brick_slab.json 3931e24229db79115ffe2a9f3a069202b9b8dcab assets/create/blockstates/small_dripstone_brick_stairs.json 0d16cefcb8e619bc81ef65111d16d331db58d0aa assets/create/blockstates/small_dripstone_brick_wall.json -d51095bfb9d5758f8b3972a973fbe282569b0234 assets/create/blockstates/small_dripstone_bricks.json +11dcaf8a6da96d178024b4c3ee76b9c373e5d082 assets/create/blockstates/small_granite_bricks.json 096b064f28fbe381e1b637d4668550851cbbb2c2 assets/create/blockstates/small_granite_brick_slab.json e99cc3251937fbf9fc858623d5ea525ed5b79704 assets/create/blockstates/small_granite_brick_stairs.json 62f2b570ac6073c8a98369523095d2c18a353eed assets/create/blockstates/small_granite_brick_wall.json -11dcaf8a6da96d178024b4c3ee76b9c373e5d082 assets/create/blockstates/small_granite_bricks.json +346dbff9a84b988bd9c9af670b486b6af5e18179 assets/create/blockstates/small_limestone_bricks.json d640eed81abaa013ed1c53d68a552f639168ae8b assets/create/blockstates/small_limestone_brick_slab.json d470967200aa6ca618421cf375140b352c45cc90 assets/create/blockstates/small_limestone_brick_stairs.json 8d4a1eff66a3f45d595ff8371c0d1ebaa0ba1773 assets/create/blockstates/small_limestone_brick_wall.json -346dbff9a84b988bd9c9af670b486b6af5e18179 assets/create/blockstates/small_limestone_bricks.json +1464b01d4c8bd9ec56460c1250fd4bb07e936e22 assets/create/blockstates/small_ochrum_bricks.json ddee92141e00898e8d70145cf00c0d64f56b4f48 assets/create/blockstates/small_ochrum_brick_slab.json bad9a5820c64c125494c0eba4f6c7ebebe93341c assets/create/blockstates/small_ochrum_brick_stairs.json ed899a18522adc70ae46185c308904c8de5b5834 assets/create/blockstates/small_ochrum_brick_wall.json -1464b01d4c8bd9ec56460c1250fd4bb07e936e22 assets/create/blockstates/small_ochrum_bricks.json c520e9ba54ff6dfb96f7863bb093cdf15cc95ce4 assets/create/blockstates/small_rose_quartz_tiles.json +371ff795eb4e7cb1220d307abf8cb003f455cbec assets/create/blockstates/small_scorchia_bricks.json 384a1331b92b7beba988f729bb7cda42abec0172 assets/create/blockstates/small_scorchia_brick_slab.json 046a84030a23f5a40f4deac13f2e60ced436cadf assets/create/blockstates/small_scorchia_brick_stairs.json 58bc6e3bb10ed72b8cb5813a88cab300d1183b7d assets/create/blockstates/small_scorchia_brick_wall.json -371ff795eb4e7cb1220d307abf8cb003f455cbec assets/create/blockstates/small_scorchia_bricks.json +0aa51dbfda8349b878e2f6c9bb3314fcfc1a9c39 assets/create/blockstates/small_scoria_bricks.json 5b227400e588abae33c1682196f098adc8006d13 assets/create/blockstates/small_scoria_brick_slab.json 51420bb12b757d3888fd1ceb5c21d83b42bd2266 assets/create/blockstates/small_scoria_brick_stairs.json 36e9bd161fa4ffe18f07153b2945cfeae55e7c0b assets/create/blockstates/small_scoria_brick_wall.json -0aa51dbfda8349b878e2f6c9bb3314fcfc1a9c39 assets/create/blockstates/small_scoria_bricks.json +c1f9f986dd0bfdbdee210c6c7d71981b251c27db assets/create/blockstates/small_tuff_bricks.json 8d1af444031291fe58d850ae344aaf7e97b8bd87 assets/create/blockstates/small_tuff_brick_slab.json 26879e6cadf0035c3eed4b54b3a1fdc0c080a485 assets/create/blockstates/small_tuff_brick_stairs.json 5d58ca7b81ae537454c3cdbb5fc8aacca83cff3f assets/create/blockstates/small_tuff_brick_wall.json -c1f9f986dd0bfdbdee210c6c7d71981b251c27db assets/create/blockstates/small_tuff_bricks.json +ad79aa8ff306695f65386fdeb44c5285547934b6 assets/create/blockstates/small_veridium_bricks.json 6226471fdcadbbf0e02704bb0e7de607e99302a8 assets/create/blockstates/small_veridium_brick_slab.json b54200ebe65c4ad2e5661c81ba5bf939039277ca assets/create/blockstates/small_veridium_brick_stairs.json 0237d58443ca9dc2a9186c2387dd6633702a7598 assets/create/blockstates/small_veridium_brick_wall.json -ad79aa8ff306695f65386fdeb44c5285547934b6 assets/create/blockstates/small_veridium_bricks.json 4d987859e5f5a930c20e955919304088fb6fc6d1 assets/create/blockstates/smart_chute.json 57fc35b2e0ae9ab16c011abd95f507910c70a234 assets/create/blockstates/smart_fluid_pipe.json a70c025de5d85180f371ff05bbdc531d8bdfaab1 assets/create/blockstates/speedometer.json @@ -568,9 +568,9 @@ a60c9c8241e40c2e28f5760c0ca6e80cfe9d59f3 assets/create/blockstates/steam_whistle 636ec6c7e1ef3b737edc716200f138bc63681d78 assets/create/blockstates/steam_whistle_extension.json 8865500bcd2e4d467e74edb3509850fa92a5809f assets/create/blockstates/sticker.json bed0534e618105184bc877b104230403ca85bb58 assets/create/blockstates/sticky_mechanical_piston.json +c7c17ff17b98ce85d355f2f9b4509271bc283843 assets/create/blockstates/stockpile_switch.json 2d66ca4b6916eac170b3b8552705b699f569bae2 assets/create/blockstates/stock_link.json 9989bda294fbffc5f659d2e608e01dea424c7694 assets/create/blockstates/stock_ticker.json -c7c17ff17b98ce85d355f2f9b4509271bc283843 assets/create/blockstates/stockpile_switch.json a70c025de5d85180f371ff05bbdc531d8bdfaab1 assets/create/blockstates/stressometer.json 8086f80c532fad42b37fcdc590b890ed7e8c3fe9 assets/create/blockstates/tiled_glass.json 1143ab7223c655764a81ed72ac385ea179664072 assets/create/blockstates/tiled_glass_pane.json @@ -590,36 +590,36 @@ bfb2b7eabba2e7aef4d783328c8a5a1558e7e493 assets/create/blockstates/turntable.jso 116d0a8fb72bcc00bd511db7893ea3e96efda297 assets/create/blockstates/warped_window_pane.json fa3d300520e3bedb926696d9980cbeeb54cfdc68 assets/create/blockstates/water_wheel.json 3dff9e1ec59415779195d2abfa9f07bc17b428a1 assets/create/blockstates/water_wheel_structure.json +2ae175c489b86b78b4646306250ca2dba66b0a5e assets/create/blockstates/waxed_copper_shingles.json 85ed36dcb0a3542e0638601116360202a9670d53 assets/create/blockstates/waxed_copper_shingle_slab.json aaf49f1b6785e2195c5dc2e8792c99c960745f89 assets/create/blockstates/waxed_copper_shingle_stairs.json -2ae175c489b86b78b4646306250ca2dba66b0a5e assets/create/blockstates/waxed_copper_shingles.json +835bfe0d2137ad60e5f8322fa4449d5c7a02187f assets/create/blockstates/waxed_copper_tiles.json b52eda74c9000507a4f34e10fbd1a7846b66c16d assets/create/blockstates/waxed_copper_tile_slab.json 5428969f6f27213d0ec5140d911b3844b5332006 assets/create/blockstates/waxed_copper_tile_stairs.json -835bfe0d2137ad60e5f8322fa4449d5c7a02187f assets/create/blockstates/waxed_copper_tiles.json +306b9cd1efe3abd1fcca11bc464560837fb8fdfa assets/create/blockstates/waxed_exposed_copper_shingles.json bc8f3bb75bdb094c8372d61a68927270d3347437 assets/create/blockstates/waxed_exposed_copper_shingle_slab.json 32382e5f524b50393080fdbd2415a98ddb700c9c assets/create/blockstates/waxed_exposed_copper_shingle_stairs.json -306b9cd1efe3abd1fcca11bc464560837fb8fdfa assets/create/blockstates/waxed_exposed_copper_shingles.json +ae92a9051f1603e7ad4f93cb668706ccffc7a85b assets/create/blockstates/waxed_exposed_copper_tiles.json ca37c3e54d5c78a77fcb4a4aca004a34e271f246 assets/create/blockstates/waxed_exposed_copper_tile_slab.json a864f82ccd6b3e0fa181c800da886ebd3239fb82 assets/create/blockstates/waxed_exposed_copper_tile_stairs.json -ae92a9051f1603e7ad4f93cb668706ccffc7a85b assets/create/blockstates/waxed_exposed_copper_tiles.json +729ca65a140b3d7571a2072f7406cc5f4a2e27c5 assets/create/blockstates/waxed_oxidized_copper_shingles.json ef99e849f9dd6ad53ddf04625c81750f11eaae1c assets/create/blockstates/waxed_oxidized_copper_shingle_slab.json 9386068220f9bb5d2f6d3cc408dc4f78f26b4eeb assets/create/blockstates/waxed_oxidized_copper_shingle_stairs.json -729ca65a140b3d7571a2072f7406cc5f4a2e27c5 assets/create/blockstates/waxed_oxidized_copper_shingles.json +17acf3486e92aabc3efbe99fa1e5d7d664e6ec97 assets/create/blockstates/waxed_oxidized_copper_tiles.json fe79f7eab017d714c0331664a3a2b5579104194e assets/create/blockstates/waxed_oxidized_copper_tile_slab.json 10bbe77a0334b5578b1ec40b398a45cf7d2bb534 assets/create/blockstates/waxed_oxidized_copper_tile_stairs.json -17acf3486e92aabc3efbe99fa1e5d7d664e6ec97 assets/create/blockstates/waxed_oxidized_copper_tiles.json +079acbfd6a9375899687b581f95bbe74940afce2 assets/create/blockstates/waxed_weathered_copper_shingles.json 73572bbe16957e63853ee425d8f34d98e14e4a10 assets/create/blockstates/waxed_weathered_copper_shingle_slab.json ab05925d5bb70e53fec9c149982304f31acd2b1a assets/create/blockstates/waxed_weathered_copper_shingle_stairs.json -079acbfd6a9375899687b581f95bbe74940afce2 assets/create/blockstates/waxed_weathered_copper_shingles.json +202b0f2e6fca9eab949f47eaa1f4ddee249a633a assets/create/blockstates/waxed_weathered_copper_tiles.json fc1b53d3b2b1f0977069abec3c376f3f5c4cd7c8 assets/create/blockstates/waxed_weathered_copper_tile_slab.json 6cd93476a45c3b77f5eda66f68425bae486cfba8 assets/create/blockstates/waxed_weathered_copper_tile_stairs.json -202b0f2e6fca9eab949f47eaa1f4ddee249a633a assets/create/blockstates/waxed_weathered_copper_tiles.json +c11562afd9a5f85945e521dcea5f911d1b6d13c6 assets/create/blockstates/weathered_copper_shingles.json 5a5a1e95988edb7a2b6dc6c6ba5677c2d896a5ae assets/create/blockstates/weathered_copper_shingle_slab.json 07019fc8890cb5e966a42ca636a0ab9cf71cc881 assets/create/blockstates/weathered_copper_shingle_stairs.json -c11562afd9a5f85945e521dcea5f911d1b6d13c6 assets/create/blockstates/weathered_copper_shingles.json +236e072d9056c0dbffdf5d7d973a85a56c2c8de1 assets/create/blockstates/weathered_copper_tiles.json fee668eb9a45dca0d287fee5811219d69f9ec3e2 assets/create/blockstates/weathered_copper_tile_slab.json da110f382368257e15431c77164aef82e014e3f8 assets/create/blockstates/weathered_copper_tile_stairs.json -236e072d9056c0dbffdf5d7d973a85a56c2c8de1 assets/create/blockstates/weathered_copper_tiles.json 64fb3e569da401635b64e71e01ea0b3ff6360611 assets/create/blockstates/weathered_iron_block.json 6fd81f1eb48fbfc44df9db8eedc613690c9b8ef5 assets/create/blockstates/weathered_iron_window.json 1aed351050d73989c4553bf49ce03b3a8fdd210e assets/create/blockstates/weathered_iron_window_pane.json @@ -642,8 +642,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -865a57ba9454a0a17d823e7bb1ab40ff5094e59a assets/create/lang/en_ud.json -a31ba9b41ace1eb3404ce09817c32561607b7e85 assets/create/lang/en_us.json +489862e6fd08eb168d1a45620dfadfc71ccb2d2c assets/create/lang/en_ud.json +15c0c9ffe04f1c3428bc0e2172bc1ae89a21cffa assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -806,21 +806,21 @@ d063df8e9b974c11fc7810ce176b02d7d924e15b assets/create/models/block/copper_post. 2b5aed4a917694beb33d9b0ecbc800dcbc143ee9 assets/create/models/block/copper_post_ends.json bac7566a726b0fe6d537c744aec4afb383dc165c assets/create/models/block/copper_scaffolding.json dbee65c129740f3b99c07e754b3224d3f9f8c242 assets/create/models/block/copper_scaffolding_horizontal.json +32fdb85b5b62d5a0fb41732874c854788cdd2ba1 assets/create/models/block/copper_shingles.json fb7fb6deebd502946ab57f1b8a9f4a6b5dd48da3 assets/create/models/block/copper_shingle_slab.json 660f61112b8e46dec5050cb0ed4ee936965a7c58 assets/create/models/block/copper_shingle_slab_top.json 5d74be967bbe9feba4b630751f13af817a733d1d assets/create/models/block/copper_shingle_stairs.json 35cb89f29ce3f8d8af13602c08ecd7afbb7cf56a assets/create/models/block/copper_shingle_stairs_inner.json fcb9295f4f388e6d439ec9a3906ca326b6d69077 assets/create/models/block/copper_shingle_stairs_outer.json -32fdb85b5b62d5a0fb41732874c854788cdd2ba1 assets/create/models/block/copper_shingles.json cb218a725f82db34ffe58a5208266e1c768cfc05 assets/create/models/block/copper_side.json d9b4652ca8f1e65007f42d946ecfb38acc3f168f assets/create/models/block/copper_side_alt.json 03a6c5b8bc3041a2be001092f7abd014d6f852a2 assets/create/models/block/copper_table_cloth.json +32f06f39d0b34e4431795aa6e64f87e58dc1597b assets/create/models/block/copper_tiles.json 298c6100de02ed9f813397d8ba38c46f35035c69 assets/create/models/block/copper_tile_slab.json d4422c2d96fb329087d1be70d8b983a8cf6c7f01 assets/create/models/block/copper_tile_slab_top.json fca72048f916d3a3e567b385c948cc1b59711ef4 assets/create/models/block/copper_tile_stairs.json 997479b62ed3d81ab633279ecc2fabd9588a3bf3 assets/create/models/block/copper_tile_stairs_inner.json d5c5bbfb9aaa282e11ad6e6309b1880b172ee653 assets/create/models/block/copper_tile_stairs_outer.json -32f06f39d0b34e4431795aa6e64f87e58dc1597b assets/create/models/block/copper_tiles.json fa2fa91e674eb4de440617049dae34064fd6fa39 assets/create/models/block/copper_valve_handle.json 52ae02c17509e483e35a1b6055296c3a663f85d7 assets/create/models/block/crate/creative/bottom.json 689989ecbd4d59d5836deb8adf7af1d473a377c0 assets/create/models/block/crate/creative/left.json @@ -864,15 +864,15 @@ b3f403f77e3b1b44c56450e387136bca12a84a99 assets/create/models/block/crimson_wind 117d14a1f25cc8ac633bb4cc8a81830a1c016096 assets/create/models/block/crimson_window_pane_side.json ee13522aadfca40f856499d5c29bd86d8f4dda57 assets/create/models/block/crimson_window_pane_side_alt.json 40042ce15d51445ec71b73da34477fa735f3fdd4 assets/create/models/block/cut_andesite.json +5be7d431ac56e2ceb9e3d95589d687f757d5257c assets/create/models/block/cut_andesite_bricks.json +c78e2acf9b54d7370f12e34dcca5c71743f47d55 assets/create/models/block/cut_andesite_bricks_wall_post.json +88e3c8eadf97f772fbafe3b71c8dd27c91c0c0e3 assets/create/models/block/cut_andesite_bricks_wall_side.json +bc264e09c506418b01c6032dcab8ca28080cb70b assets/create/models/block/cut_andesite_bricks_wall_side_tall.json fcbe246aca067dcfeef7afb4e6068b8932da8792 assets/create/models/block/cut_andesite_brick_slab.json e384a98b54ed7317b6ad0e86cf87500491eea824 assets/create/models/block/cut_andesite_brick_slab_top.json 91699e60e29e7524271a2f87200951ee8bfeb8ef assets/create/models/block/cut_andesite_brick_stairs.json e314e0837aed319cdf34a1aaa60f0be6ca169636 assets/create/models/block/cut_andesite_brick_stairs_inner.json aba679c4c6a8d5afc2924d2c9c84af5a2208fde3 assets/create/models/block/cut_andesite_brick_stairs_outer.json -5be7d431ac56e2ceb9e3d95589d687f757d5257c assets/create/models/block/cut_andesite_bricks.json -c78e2acf9b54d7370f12e34dcca5c71743f47d55 assets/create/models/block/cut_andesite_bricks_wall_post.json -88e3c8eadf97f772fbafe3b71c8dd27c91c0c0e3 assets/create/models/block/cut_andesite_bricks_wall_side.json -bc264e09c506418b01c6032dcab8ca28080cb70b assets/create/models/block/cut_andesite_bricks_wall_side_tall.json 8c17ba39e50a440497af089f5fd85649f05bdf8c assets/create/models/block/cut_andesite_slab.json b95ab966cf8c177c799e228759d0cd28c1cfa71f assets/create/models/block/cut_andesite_slab_top.json 81a407a5ff4393b66f784ba4ceee971c3c62de7f assets/create/models/block/cut_andesite_stairs.json @@ -882,15 +882,15 @@ f06abcb3ce691fd30db81b40ea0430462fc972cf assets/create/models/block/cut_andesite 81cef9548137aaff5b6e77d417f387796f2608b2 assets/create/models/block/cut_andesite_wall_side.json dbb99ac37333ee12b7d3859207409aa2599f28eb assets/create/models/block/cut_andesite_wall_side_tall.json a48f77e90c1d02d5b4e6540db723f748118788e9 assets/create/models/block/cut_asurine.json +3b0b7bd63870ac19b9444ce9add9930ec9120821 assets/create/models/block/cut_asurine_bricks.json +89142424e1d702a0f2bc27829304520e48ee1eb3 assets/create/models/block/cut_asurine_bricks_wall_post.json +1f1fcf92e91b1f0d15ba389d6d25e1fba3ad8e5b assets/create/models/block/cut_asurine_bricks_wall_side.json +858d15aff53fe938304bafb52ef32e54e3d44a44 assets/create/models/block/cut_asurine_bricks_wall_side_tall.json 4107317f71d07fb1c113e056c832e963f57b41d7 assets/create/models/block/cut_asurine_brick_slab.json fba2e8dc513184eaa9c4449471b32f206dfe425a assets/create/models/block/cut_asurine_brick_slab_top.json 72bb7b2df330f8d5981f4c12b23429d8d874362d assets/create/models/block/cut_asurine_brick_stairs.json e753ba3830c51539565abbd9b49df9a34f97f2ff assets/create/models/block/cut_asurine_brick_stairs_inner.json ec9182d14517ffc71749e3e016e6546db79e6800 assets/create/models/block/cut_asurine_brick_stairs_outer.json -3b0b7bd63870ac19b9444ce9add9930ec9120821 assets/create/models/block/cut_asurine_bricks.json -89142424e1d702a0f2bc27829304520e48ee1eb3 assets/create/models/block/cut_asurine_bricks_wall_post.json -1f1fcf92e91b1f0d15ba389d6d25e1fba3ad8e5b assets/create/models/block/cut_asurine_bricks_wall_side.json -858d15aff53fe938304bafb52ef32e54e3d44a44 assets/create/models/block/cut_asurine_bricks_wall_side_tall.json b4512f7cef7cef0bc5f85cb955c2dec6de2cbb56 assets/create/models/block/cut_asurine_slab.json 7c1befdd97b1556e9658e968e705c9edbf1ed667 assets/create/models/block/cut_asurine_slab_top.json d04b8a8cf9a50aa7e0b068ceb9a5a2970abc81a7 assets/create/models/block/cut_asurine_stairs.json @@ -900,15 +900,15 @@ ac544a8f948119945aa21362ad26ed8b1c922b0d assets/create/models/block/cut_asurine_ a253210cba60f58e720598323bd0d9ed4c209b4d assets/create/models/block/cut_asurine_wall_side.json c0c2cc13288771699a80c5c80e8e35d352cea684 assets/create/models/block/cut_asurine_wall_side_tall.json a6b10dc7984d22cac7aa314d46ac0928a00e667b assets/create/models/block/cut_calcite.json +6230a499321b175fc441bb662e0655662b3597de assets/create/models/block/cut_calcite_bricks.json +be1462847e9001a062091162802fab2fe6737693 assets/create/models/block/cut_calcite_bricks_wall_post.json +6e6b34468a7a0786efe5f4ebd917a4640b4be6ae assets/create/models/block/cut_calcite_bricks_wall_side.json +8b10c0f4f17f3844cee6d514cc22ddc6cb056c8a assets/create/models/block/cut_calcite_bricks_wall_side_tall.json f046be4f44936946bd3cc2ad5549d112b2e60d97 assets/create/models/block/cut_calcite_brick_slab.json 64953ca8a302ecab9311c617f69e5dcf8c138718 assets/create/models/block/cut_calcite_brick_slab_top.json 19e1b342d05d3cd69c410952dc22507c3c988c15 assets/create/models/block/cut_calcite_brick_stairs.json 18317b0a8bab345abd779f5d43f9620b73df0e67 assets/create/models/block/cut_calcite_brick_stairs_inner.json 0631d4e1bdaf724752f2e55401eb7a54af705b56 assets/create/models/block/cut_calcite_brick_stairs_outer.json -6230a499321b175fc441bb662e0655662b3597de assets/create/models/block/cut_calcite_bricks.json -be1462847e9001a062091162802fab2fe6737693 assets/create/models/block/cut_calcite_bricks_wall_post.json -6e6b34468a7a0786efe5f4ebd917a4640b4be6ae assets/create/models/block/cut_calcite_bricks_wall_side.json -8b10c0f4f17f3844cee6d514cc22ddc6cb056c8a assets/create/models/block/cut_calcite_bricks_wall_side_tall.json 6b35e0f9e6a7e247bf38d8d6d911a2bcc53c2517 assets/create/models/block/cut_calcite_slab.json 0eec7692ee8e119c1258bdb7e852204771c2232d assets/create/models/block/cut_calcite_slab_top.json d07ebf8982e4947852da8b2b0052f6b6000d334f assets/create/models/block/cut_calcite_stairs.json @@ -918,15 +918,15 @@ e8b7b983168ad9f4f4fa1642ca20ff56621935db assets/create/models/block/cut_calcite_ 421e128177bb4dd51391e360f11ba83c5d891cd1 assets/create/models/block/cut_calcite_wall_side.json 5add4bde51bbdd7c229b05f4fabd8a769414fb79 assets/create/models/block/cut_calcite_wall_side_tall.json 2e93da554ea72b90a576bbc9230aea373d3aed0f assets/create/models/block/cut_crimsite.json +39d1a3cdd978c761bc0d67baaba82d11953fc2a0 assets/create/models/block/cut_crimsite_bricks.json +8614cb38c52447fea5245fcf295a951a977071c0 assets/create/models/block/cut_crimsite_bricks_wall_post.json +b0b16f4a2f6dd3f77ec4f65f05e9edb70a196316 assets/create/models/block/cut_crimsite_bricks_wall_side.json +ac41e5b092c6ed81d14004f9427b6151b88dc924 assets/create/models/block/cut_crimsite_bricks_wall_side_tall.json c2474a10109d0476a46d2a509fc1cd37cd52822d assets/create/models/block/cut_crimsite_brick_slab.json efeb149835a389409b7f94bc35765b0871ad7342 assets/create/models/block/cut_crimsite_brick_slab_top.json e5096a1bae43341bae5706f02cd6d564b5a82502 assets/create/models/block/cut_crimsite_brick_stairs.json af3c0018e5e12bbe0f118bc0174b6ca513ae58ae assets/create/models/block/cut_crimsite_brick_stairs_inner.json ed30baef426f2ccf158d87111c7b53f3600bc32a assets/create/models/block/cut_crimsite_brick_stairs_outer.json -39d1a3cdd978c761bc0d67baaba82d11953fc2a0 assets/create/models/block/cut_crimsite_bricks.json -8614cb38c52447fea5245fcf295a951a977071c0 assets/create/models/block/cut_crimsite_bricks_wall_post.json -b0b16f4a2f6dd3f77ec4f65f05e9edb70a196316 assets/create/models/block/cut_crimsite_bricks_wall_side.json -ac41e5b092c6ed81d14004f9427b6151b88dc924 assets/create/models/block/cut_crimsite_bricks_wall_side_tall.json a6cdd4b227210b7487b8431b8d76bbe490636b81 assets/create/models/block/cut_crimsite_slab.json 5c585dba4dbfa9ff0a22a84aa726260cffdeebeb assets/create/models/block/cut_crimsite_slab_top.json 91f60b4277ca48dabfb5d3eebb1ed64a2681a083 assets/create/models/block/cut_crimsite_stairs.json @@ -936,15 +936,15 @@ e6b39a0b1dbab462479fc60fab2efc6a9ceb6a55 assets/create/models/block/cut_crimsite 5b3783862e50fde6ffffc92068900afcc066002f assets/create/models/block/cut_crimsite_wall_side.json b59fbbfe9c6738b1f93f03d59a747f5610164c34 assets/create/models/block/cut_crimsite_wall_side_tall.json 144ec3864fb0a7981e74d357200a96033c75a2d6 assets/create/models/block/cut_deepslate.json +0d599ae1b4e9309f2a7b3362e86061e2150ba3ec assets/create/models/block/cut_deepslate_bricks.json +601894e096edbcd3d96ce0160f06e17a4efca819 assets/create/models/block/cut_deepslate_bricks_wall_post.json +42db46cb5c9c02d684c86f3a518feb3348d83fa0 assets/create/models/block/cut_deepslate_bricks_wall_side.json +c046436d59c350c6beb6b395675513c12184ffe2 assets/create/models/block/cut_deepslate_bricks_wall_side_tall.json af8c7c652e75bf904093bbafc1cf805f842a39c9 assets/create/models/block/cut_deepslate_brick_slab.json 2a01dd0244b07f28454c061a565d1028ca7e3066 assets/create/models/block/cut_deepslate_brick_slab_top.json 62d39eec3621204de82377e74936b9cd338e8004 assets/create/models/block/cut_deepslate_brick_stairs.json 5f90dfbb45b57bd894bf03fcc6c347cb525e3a73 assets/create/models/block/cut_deepslate_brick_stairs_inner.json 512d588c77bdf5a7232826e2f4ce4b3cb991d0ce assets/create/models/block/cut_deepslate_brick_stairs_outer.json -0d599ae1b4e9309f2a7b3362e86061e2150ba3ec assets/create/models/block/cut_deepslate_bricks.json -601894e096edbcd3d96ce0160f06e17a4efca819 assets/create/models/block/cut_deepslate_bricks_wall_post.json -42db46cb5c9c02d684c86f3a518feb3348d83fa0 assets/create/models/block/cut_deepslate_bricks_wall_side.json -c046436d59c350c6beb6b395675513c12184ffe2 assets/create/models/block/cut_deepslate_bricks_wall_side_tall.json c79ae6e97e94d36f2586865ea63f3fab43f8ccbc assets/create/models/block/cut_deepslate_slab.json 5978b93805ccf0bdd953938b34a8dd0ffdcf5565 assets/create/models/block/cut_deepslate_slab_top.json 06a508b2395c3f738d2c5651f366792ee9b9c5ec assets/create/models/block/cut_deepslate_stairs.json @@ -954,15 +954,15 @@ c2850e9f223c459ba53d575a1ef8231589c48c0b assets/create/models/block/cut_deepslat e901746d3e50fe7d9b79d268f4d02251d5cf95f4 assets/create/models/block/cut_deepslate_wall_side.json 1ef794aab31a10bf150a0015cd46e5b5f3c70042 assets/create/models/block/cut_deepslate_wall_side_tall.json 4abb502ea3f6764797641f55a2c48f4858be1ba6 assets/create/models/block/cut_diorite.json +e97babf115a4f81f8555994aba435cf76bebf7a3 assets/create/models/block/cut_diorite_bricks.json +4f7cf44e4d6431587266a4fac78c0812e99d780c assets/create/models/block/cut_diorite_bricks_wall_post.json +1f96f9e190d8e28496ce2db5712f33e449215985 assets/create/models/block/cut_diorite_bricks_wall_side.json +45246192d9cd39837b426e425fc5082422642b65 assets/create/models/block/cut_diorite_bricks_wall_side_tall.json ab61b1b94946f315006a29113f594c234d796bee assets/create/models/block/cut_diorite_brick_slab.json 73597772386c6bbd38907cbea8db816f174a9f8f assets/create/models/block/cut_diorite_brick_slab_top.json c9fbd953ef0789a0e9a915d5f283fd09a76784d6 assets/create/models/block/cut_diorite_brick_stairs.json 5d721f1b3f4376a91707b56950a1f9635adbe603 assets/create/models/block/cut_diorite_brick_stairs_inner.json 9a446bf02732e1873fa96d7745fced0fa04d48d6 assets/create/models/block/cut_diorite_brick_stairs_outer.json -e97babf115a4f81f8555994aba435cf76bebf7a3 assets/create/models/block/cut_diorite_bricks.json -4f7cf44e4d6431587266a4fac78c0812e99d780c assets/create/models/block/cut_diorite_bricks_wall_post.json -1f96f9e190d8e28496ce2db5712f33e449215985 assets/create/models/block/cut_diorite_bricks_wall_side.json -45246192d9cd39837b426e425fc5082422642b65 assets/create/models/block/cut_diorite_bricks_wall_side_tall.json 15195975e7e0ffb7010591b957a657f492e6d59d assets/create/models/block/cut_diorite_slab.json 01c320637843dc0d8b74b48b8d6946cd663d51f6 assets/create/models/block/cut_diorite_slab_top.json 7dcbfe4dc2ec62345da660ecc6ca44056fcd64e7 assets/create/models/block/cut_diorite_stairs.json @@ -972,15 +972,15 @@ e97babf115a4f81f8555994aba435cf76bebf7a3 assets/create/models/block/cut_diorite_ 29075eaaba51ba158f030c2a9583ed5ba52379c8 assets/create/models/block/cut_diorite_wall_side.json 1fb50473359147c7147ea85bc1907e6015ce06bc assets/create/models/block/cut_diorite_wall_side_tall.json 59ee053a884bc9731b4d1b01ae22e0e2b5916cfb assets/create/models/block/cut_dripstone.json +6a4b26a117f58d0187b2cc0c5b117ef71d03d4e9 assets/create/models/block/cut_dripstone_bricks.json +0bb1fa8fb9698dae61096483a01b41bf829666b0 assets/create/models/block/cut_dripstone_bricks_wall_post.json +2019fdc38b401bac72e8344d118d85049ec3efb9 assets/create/models/block/cut_dripstone_bricks_wall_side.json +ebb790b2b6f47d40c92c9bba680e82cb8f054fa9 assets/create/models/block/cut_dripstone_bricks_wall_side_tall.json 84d714b29dcb7eb95a82de8d48491413e26d5fa8 assets/create/models/block/cut_dripstone_brick_slab.json 28b0b1a641d11f8ade57c444e4c1bfd9d617f66a assets/create/models/block/cut_dripstone_brick_slab_top.json 05900c156a6341c12b366790c7e8d15e59a873f0 assets/create/models/block/cut_dripstone_brick_stairs.json 35fb2c83dc89b96951c69253f7502f78c903a9b8 assets/create/models/block/cut_dripstone_brick_stairs_inner.json f69244c1706c95aaadd32d45a24c91ce0848509f assets/create/models/block/cut_dripstone_brick_stairs_outer.json -6a4b26a117f58d0187b2cc0c5b117ef71d03d4e9 assets/create/models/block/cut_dripstone_bricks.json -0bb1fa8fb9698dae61096483a01b41bf829666b0 assets/create/models/block/cut_dripstone_bricks_wall_post.json -2019fdc38b401bac72e8344d118d85049ec3efb9 assets/create/models/block/cut_dripstone_bricks_wall_side.json -ebb790b2b6f47d40c92c9bba680e82cb8f054fa9 assets/create/models/block/cut_dripstone_bricks_wall_side_tall.json 9e42cf588f57de5166f2a2ccdae656743c8b9481 assets/create/models/block/cut_dripstone_slab.json 0da2f782d8ad8fecd81b98c72db182b817bf19eb assets/create/models/block/cut_dripstone_slab_top.json b3c903a1edcd1786ea51a2ccdad5734a1d04ea98 assets/create/models/block/cut_dripstone_stairs.json @@ -990,15 +990,15 @@ b3c903a1edcd1786ea51a2ccdad5734a1d04ea98 assets/create/models/block/cut_dripston 7fab5102d7fa4cd824b9393425639d05727b2ad2 assets/create/models/block/cut_dripstone_wall_side.json c41514cda1c9f5d942d222cbc5f6e620e367afc6 assets/create/models/block/cut_dripstone_wall_side_tall.json dff602c8d2fcd1ceca79f90ae15dbdfbd6cb157d assets/create/models/block/cut_granite.json +31c5299a42f82992e50f711e1e33549c373bd034 assets/create/models/block/cut_granite_bricks.json +ef5a851e57cc4b9c0e625176b1256441e1c17c66 assets/create/models/block/cut_granite_bricks_wall_post.json +815e8dc551c3e813b0b2af29df23a28860de0b53 assets/create/models/block/cut_granite_bricks_wall_side.json +ba241f9c82e27dd98ba6f4e4180922388ab5d1a3 assets/create/models/block/cut_granite_bricks_wall_side_tall.json 9e00dc8fcee23548c0cebda6eadbcfc559e4c20b assets/create/models/block/cut_granite_brick_slab.json 5ad061096451f74e773c3030f96d59424aa93314 assets/create/models/block/cut_granite_brick_slab_top.json 94f8ce607aae5c04ccf9e56f177f9d69203ae879 assets/create/models/block/cut_granite_brick_stairs.json 11d511844fec3bfd05cac8b788332f2decd53021 assets/create/models/block/cut_granite_brick_stairs_inner.json 418eb6a2b52e748a26c2d1914c6c1de94106589f assets/create/models/block/cut_granite_brick_stairs_outer.json -31c5299a42f82992e50f711e1e33549c373bd034 assets/create/models/block/cut_granite_bricks.json -ef5a851e57cc4b9c0e625176b1256441e1c17c66 assets/create/models/block/cut_granite_bricks_wall_post.json -815e8dc551c3e813b0b2af29df23a28860de0b53 assets/create/models/block/cut_granite_bricks_wall_side.json -ba241f9c82e27dd98ba6f4e4180922388ab5d1a3 assets/create/models/block/cut_granite_bricks_wall_side_tall.json 81be5e86cbdaec4945d3ccaf6d376f69c49f40d6 assets/create/models/block/cut_granite_slab.json f72a14e7cf3dd7d93b4462a3bee49683353dfb57 assets/create/models/block/cut_granite_slab_top.json 33bf924f01aae3a7720475f4b32b3a637e69ee36 assets/create/models/block/cut_granite_stairs.json @@ -1008,15 +1008,15 @@ fb4969e562ad2039d3bad2dc57a6845d3243d453 assets/create/models/block/cut_granite_ 2972b40134bcb15950a0118306f0251ff5e377b7 assets/create/models/block/cut_granite_wall_side.json abbe71fd17dbb5f176553db2f6edf2f1f7d8974a assets/create/models/block/cut_granite_wall_side_tall.json 019d3c4ffb39e328b5458aee44fee90e0ecbd829 assets/create/models/block/cut_limestone.json +7eae0f9766506f713933bde9f301d2f7f2bbef13 assets/create/models/block/cut_limestone_bricks.json +817e8cf8956af36c70e4b4e30b5d141086d006dd assets/create/models/block/cut_limestone_bricks_wall_post.json +1291cacff1b0980e58b5702a84c9b87ac5ef835d assets/create/models/block/cut_limestone_bricks_wall_side.json +6c9bc8803fe17ac623bde56f85683dd2ff13c33e assets/create/models/block/cut_limestone_bricks_wall_side_tall.json c93f33ba39c62b10dfb94c6e1c339cd4fbebffae assets/create/models/block/cut_limestone_brick_slab.json b12a340897ba98ed732a91dbd4129db7a7188e68 assets/create/models/block/cut_limestone_brick_slab_top.json 3e90b32d95ad1cf7b8a16dae3c16724510d41490 assets/create/models/block/cut_limestone_brick_stairs.json b2e7311667d14b2aa8c00e207f69f76207226567 assets/create/models/block/cut_limestone_brick_stairs_inner.json aac619ec1fb8aa56f1752ad3f354f9cb128771f8 assets/create/models/block/cut_limestone_brick_stairs_outer.json -7eae0f9766506f713933bde9f301d2f7f2bbef13 assets/create/models/block/cut_limestone_bricks.json -817e8cf8956af36c70e4b4e30b5d141086d006dd assets/create/models/block/cut_limestone_bricks_wall_post.json -1291cacff1b0980e58b5702a84c9b87ac5ef835d assets/create/models/block/cut_limestone_bricks_wall_side.json -6c9bc8803fe17ac623bde56f85683dd2ff13c33e assets/create/models/block/cut_limestone_bricks_wall_side_tall.json adc21af1c07edaf0573cfd2c95ebe38e50f7282c assets/create/models/block/cut_limestone_slab.json 2d1ea8fc5c8ce5549c7f7888371b6612bf0f5301 assets/create/models/block/cut_limestone_slab_top.json c1416808a2178996be75e0a9c1cd45849fcd6646 assets/create/models/block/cut_limestone_stairs.json @@ -1026,15 +1026,15 @@ c1416808a2178996be75e0a9c1cd45849fcd6646 assets/create/models/block/cut_limeston 2b5e65e662069a5c59e702224778dd407f5d11dd assets/create/models/block/cut_limestone_wall_side.json 052f130fef646242acccbbed2b510add21e18921 assets/create/models/block/cut_limestone_wall_side_tall.json 66cb6054821d45a60ae4d4d1d904dbef0b9f7c0f assets/create/models/block/cut_ochrum.json +0a7e38e3ac32352c5b3ec56a8c26212dbbb637a3 assets/create/models/block/cut_ochrum_bricks.json +47d0c58dd190f1ea894a5ca40ea7efd54a845d3e assets/create/models/block/cut_ochrum_bricks_wall_post.json +b502b5b213996bce0a626d86414045c80921511e assets/create/models/block/cut_ochrum_bricks_wall_side.json +c3f27545b3b7654c3e7a2df6b482d1a9895ccae9 assets/create/models/block/cut_ochrum_bricks_wall_side_tall.json ce16ec490ae8a33671502804e0b45fc42b6f228f assets/create/models/block/cut_ochrum_brick_slab.json fcbee94fdbd96b0b3d4aa245c6c87443abd1de90 assets/create/models/block/cut_ochrum_brick_slab_top.json 827349ed3eb05f5fe700e8f5816bcd82d0347612 assets/create/models/block/cut_ochrum_brick_stairs.json aa81d4135400eb40f891f8c41fcf7fa516ef64f1 assets/create/models/block/cut_ochrum_brick_stairs_inner.json ecd7e1cb9cae717e35eeb58dbe482833e98f5ac0 assets/create/models/block/cut_ochrum_brick_stairs_outer.json -0a7e38e3ac32352c5b3ec56a8c26212dbbb637a3 assets/create/models/block/cut_ochrum_bricks.json -47d0c58dd190f1ea894a5ca40ea7efd54a845d3e assets/create/models/block/cut_ochrum_bricks_wall_post.json -b502b5b213996bce0a626d86414045c80921511e assets/create/models/block/cut_ochrum_bricks_wall_side.json -c3f27545b3b7654c3e7a2df6b482d1a9895ccae9 assets/create/models/block/cut_ochrum_bricks_wall_side_tall.json e23998f88eb77826f5e4d58f3f4bb41a2e09ea97 assets/create/models/block/cut_ochrum_slab.json cd14f1abe3d0c65fbdd052f4a8e0b8fc2a15ad0e assets/create/models/block/cut_ochrum_slab_top.json a751feb4b609df141f971e341b204e76379dcda7 assets/create/models/block/cut_ochrum_stairs.json @@ -1044,15 +1044,15 @@ bed6843e39e7e771f6de151dfab0586d3ebad58c assets/create/models/block/cut_ochrum_s df267fb690642cac139aaabefa9eab802f13ddc1 assets/create/models/block/cut_ochrum_wall_side.json ed363b80cc61cb4d0b6fad9da855a0543ecaccc9 assets/create/models/block/cut_ochrum_wall_side_tall.json a65a54a08d9cc3b45e2320482dc2d9e317dd4f3d assets/create/models/block/cut_scorchia.json +9c93a554ab680d7c98c648c16472b52cc2646c50 assets/create/models/block/cut_scorchia_bricks.json +615dc444bb677caa774a4e95686ac24ebe4ec6dc assets/create/models/block/cut_scorchia_bricks_wall_post.json +758a2ad6677f857fbe955c26853eadc7150c105a assets/create/models/block/cut_scorchia_bricks_wall_side.json +f918dfa0751589d18a3eb054c290f669b5c61308 assets/create/models/block/cut_scorchia_bricks_wall_side_tall.json a032cf0a77e4f416ed153b1ffa834c065a73b2ae assets/create/models/block/cut_scorchia_brick_slab.json 716fc6ef58c240b3e6b45acf08d6e1472fe38e7c assets/create/models/block/cut_scorchia_brick_slab_top.json b2870e5ba7c5d5053b3639bf0aa1771ee050810b assets/create/models/block/cut_scorchia_brick_stairs.json 3e8a815eabd1991039a8ad18cedc9c57f46cd097 assets/create/models/block/cut_scorchia_brick_stairs_inner.json 0a9dc3149e7219a70642c242cd86dce5ba5cf4cc assets/create/models/block/cut_scorchia_brick_stairs_outer.json -9c93a554ab680d7c98c648c16472b52cc2646c50 assets/create/models/block/cut_scorchia_bricks.json -615dc444bb677caa774a4e95686ac24ebe4ec6dc assets/create/models/block/cut_scorchia_bricks_wall_post.json -758a2ad6677f857fbe955c26853eadc7150c105a assets/create/models/block/cut_scorchia_bricks_wall_side.json -f918dfa0751589d18a3eb054c290f669b5c61308 assets/create/models/block/cut_scorchia_bricks_wall_side_tall.json a85c4d0467c6746a8ef9c6ac0167d3e16f307d4e assets/create/models/block/cut_scorchia_slab.json 23fd6c65ea83f7ca7ef67dd7faf902c4fa662d70 assets/create/models/block/cut_scorchia_slab_top.json e42329f6fa3aeb958d2349a5442856e9473dc6b5 assets/create/models/block/cut_scorchia_stairs.json @@ -1062,15 +1062,15 @@ b9a911675861fee414f82c745399a7707c258f77 assets/create/models/block/cut_scorchia e61af066960897d50dc7f7bc17f95baa962829bd assets/create/models/block/cut_scorchia_wall_side.json 846f84efddca7d51b58ebe5e3bbed78312fb052d assets/create/models/block/cut_scorchia_wall_side_tall.json ce9dcf5b7fe58a97fab832fb98b4f5b6d3778255 assets/create/models/block/cut_scoria.json +fa3ef2bb65299c985b70f6959421e243a9ebc6d8 assets/create/models/block/cut_scoria_bricks.json +24ea1a30f68a918e6737dc8d9babe4528af5716a assets/create/models/block/cut_scoria_bricks_wall_post.json +ba7ae110d51fe510566ab42f5ead299b4409f2b7 assets/create/models/block/cut_scoria_bricks_wall_side.json +f04d12bc4e0b939bb443abcc6eb808e66c352c66 assets/create/models/block/cut_scoria_bricks_wall_side_tall.json edf04cbfb19b6ce99c1b74a71d40cd40c8120551 assets/create/models/block/cut_scoria_brick_slab.json f05725fd6d2764b277f01985d0e2fcbd3bf4a41e assets/create/models/block/cut_scoria_brick_slab_top.json 4bccbaef9dd9a8322087d3feb973e14d740ff27a assets/create/models/block/cut_scoria_brick_stairs.json 13f3b55dfdd97e68a6d525166618477e5bcb336d assets/create/models/block/cut_scoria_brick_stairs_inner.json 465862fb20542cae723fd72818be73aec05dad60 assets/create/models/block/cut_scoria_brick_stairs_outer.json -fa3ef2bb65299c985b70f6959421e243a9ebc6d8 assets/create/models/block/cut_scoria_bricks.json -24ea1a30f68a918e6737dc8d9babe4528af5716a assets/create/models/block/cut_scoria_bricks_wall_post.json -ba7ae110d51fe510566ab42f5ead299b4409f2b7 assets/create/models/block/cut_scoria_bricks_wall_side.json -f04d12bc4e0b939bb443abcc6eb808e66c352c66 assets/create/models/block/cut_scoria_bricks_wall_side_tall.json aeef239ca6b0eee527f75091d11d4a947740416d assets/create/models/block/cut_scoria_slab.json 5dfda9fa8117d35ebc324a5c9cb026e206e3b936 assets/create/models/block/cut_scoria_slab_top.json dfe8dbdb6deca69d847ee46fedfefe2da98dc329 assets/create/models/block/cut_scoria_stairs.json @@ -1080,15 +1080,15 @@ e0b2a94ff4b3f1c1e4282c9c8eecf2583bd7c68e assets/create/models/block/cut_scoria_w cf18e3fde94e3ba611f430fe527a9042a57e6936 assets/create/models/block/cut_scoria_wall_side.json 92475d7758b2bf582c585c2aafa6510f330c6f45 assets/create/models/block/cut_scoria_wall_side_tall.json 9f6543d21d9c24a429aae00511e6dbf61caf8030 assets/create/models/block/cut_tuff.json +8b3d9fe37ab7fda79ea4d90f674c525350883ba0 assets/create/models/block/cut_tuff_bricks.json +6b80481e15ff3d6eb40a42128da883c2027e0074 assets/create/models/block/cut_tuff_bricks_wall_post.json +057a34015b49565cb9858a2eea995a446ac0cfd4 assets/create/models/block/cut_tuff_bricks_wall_side.json +9f20bd04ef163076db9a8bf83c20cc802b57ae60 assets/create/models/block/cut_tuff_bricks_wall_side_tall.json 8c16599fda76c38978a2faa14f842a68fbbe4b9c assets/create/models/block/cut_tuff_brick_slab.json 696036e5900bdbb366dd49f5df71a1e701fd8ee3 assets/create/models/block/cut_tuff_brick_slab_top.json 54d4603e36be86e88d9302d61eab81e76cac1bbc assets/create/models/block/cut_tuff_brick_stairs.json 0ebb41a1ce5bf4ca86cbaf95e83cd2edf8f309ea assets/create/models/block/cut_tuff_brick_stairs_inner.json 5d5ed291db4b4bca464717c7fcde682b33d71c3f assets/create/models/block/cut_tuff_brick_stairs_outer.json -8b3d9fe37ab7fda79ea4d90f674c525350883ba0 assets/create/models/block/cut_tuff_bricks.json -6b80481e15ff3d6eb40a42128da883c2027e0074 assets/create/models/block/cut_tuff_bricks_wall_post.json -057a34015b49565cb9858a2eea995a446ac0cfd4 assets/create/models/block/cut_tuff_bricks_wall_side.json -9f20bd04ef163076db9a8bf83c20cc802b57ae60 assets/create/models/block/cut_tuff_bricks_wall_side_tall.json f2a904b7943555e8ec9dcc07513ca1ad9af809c3 assets/create/models/block/cut_tuff_slab.json ea74bb8a69f6acbd520ac8922e147495e5f99f6f assets/create/models/block/cut_tuff_slab_top.json 0262700e59de947907a04fdea9974f9d7e5a22f2 assets/create/models/block/cut_tuff_stairs.json @@ -1098,15 +1098,15 @@ ea74bb8a69f6acbd520ac8922e147495e5f99f6f assets/create/models/block/cut_tuff_sla 8c6492dc9e09359e5bac67ae4d473cffc8f93dbb assets/create/models/block/cut_tuff_wall_side.json f5f24066b6281303f52e25745881d5bca8c49c54 assets/create/models/block/cut_tuff_wall_side_tall.json 167e9a084987bcf7f67f655d0de88ae8ca2fcebb assets/create/models/block/cut_veridium.json +f8ab87c34f211a63525f6d386397face67460f8c assets/create/models/block/cut_veridium_bricks.json +e4e717fa8412032e184aebd1186470f41a2089c0 assets/create/models/block/cut_veridium_bricks_wall_post.json +8c40ccb8f10ef8dcda1bef46ad3490f697d178d2 assets/create/models/block/cut_veridium_bricks_wall_side.json +2c4671c66d904e15883ec3a14681b97ac537135c assets/create/models/block/cut_veridium_bricks_wall_side_tall.json 07c330c501375d5c316677edee80fb040c0fc237 assets/create/models/block/cut_veridium_brick_slab.json 4c8c660afe72e8ce9eaef53a37fdc63eb0c69513 assets/create/models/block/cut_veridium_brick_slab_top.json f802e4ae758e2c37c3129594ce4f5d9ffcfe173d assets/create/models/block/cut_veridium_brick_stairs.json 0d60d5cd0269e05816d28fcbbd2c680fe60cd316 assets/create/models/block/cut_veridium_brick_stairs_inner.json 22656f90b55aeaeeffa448b5f061fb26b5de7b0f assets/create/models/block/cut_veridium_brick_stairs_outer.json -f8ab87c34f211a63525f6d386397face67460f8c assets/create/models/block/cut_veridium_bricks.json -e4e717fa8412032e184aebd1186470f41a2089c0 assets/create/models/block/cut_veridium_bricks_wall_post.json -8c40ccb8f10ef8dcda1bef46ad3490f697d178d2 assets/create/models/block/cut_veridium_bricks_wall_side.json -2c4671c66d904e15883ec3a14681b97ac537135c assets/create/models/block/cut_veridium_bricks_wall_side_tall.json d736230e9b49a9fd40bc8f31df4d5144cdb429c8 assets/create/models/block/cut_veridium_slab.json 750e536c7b71dfb3a005d9b7a128ac435461e57f assets/create/models/block/cut_veridium_slab_top.json 8b05c19560e97ce15a66202717e3d32f6ee153a9 assets/create/models/block/cut_veridium_stairs.json @@ -1136,25 +1136,22 @@ db89bc32d0e466bc5008aa7091c682ba3aeec611 assets/create/models/block/diorite_pill a21387ab955f2b91e402b2189145f5fd6623592d assets/create/models/block/diorite_pillar_horizontal.json 44af455badc2b35a763007bba3537bda7d0ac289 assets/create/models/block/dripstone_pillar.json 1e23e3758e3311d0063c83742abb750a05021075 assets/create/models/block/dripstone_pillar_horizontal.json +19a773f91c58c49301f35965bac02d0c05fb2764 assets/create/models/block/exposed_copper_shingles.json a3420b91fdebec40e508a5eebb145c0201bd80c8 assets/create/models/block/exposed_copper_shingle_slab.json 4178ea5e50ee17b3c15f4a59efd019c4a19bb892 assets/create/models/block/exposed_copper_shingle_slab_top.json dd2d747774abc86e428a883e299db66cded78e11 assets/create/models/block/exposed_copper_shingle_stairs.json b6845da62d96a33cee624bb70360e256b26eda83 assets/create/models/block/exposed_copper_shingle_stairs_inner.json 3d8b758e50e75c5adc26ab6f39f9d73f00866673 assets/create/models/block/exposed_copper_shingle_stairs_outer.json -19a773f91c58c49301f35965bac02d0c05fb2764 assets/create/models/block/exposed_copper_shingles.json +9cb20c9d41629d8b9426cb65829365d10966338f assets/create/models/block/exposed_copper_tiles.json cd21d9d2935b6d0103502e2731c11ea27ff64ecf assets/create/models/block/exposed_copper_tile_slab.json 0ec039ba59fb0028183433e52131ff355ace5bff assets/create/models/block/exposed_copper_tile_slab_top.json c51dbd34996ac4513234800e427ac308067d5e1d assets/create/models/block/exposed_copper_tile_stairs.json 68772d4352dc7ade995dfa57ba41a38ef819e855 assets/create/models/block/exposed_copper_tile_stairs_inner.json d932671822ba93b71a9c8b50e7207803a1c4dbab assets/create/models/block/exposed_copper_tile_stairs_outer.json -9cb20c9d41629d8b9426cb65829365d10966338f assets/create/models/block/exposed_copper_tiles.json 2d1ade82820569936fd3021a877283474ced09d0 assets/create/models/block/fake_track.json 9e41f0b90dd1e71766c9d07bdb75d1e553f3392f assets/create/models/block/fluid_pipe/d_x.json 13507730f6ca6462c4cfeddc46e5b21e93fb1287 assets/create/models/block/fluid_pipe/d_y.json 84c09934d3537343a1226389993dabfa850b745e assets/create/models/block/fluid_pipe/d_z.json -b8fd54e514bd50fb287c6b758647818c6b08ef75 assets/create/models/block/fluid_pipe/l_x.json -e985ff9dbe7324cf69ab38e6e9e85c9b554af56c assets/create/models/block/fluid_pipe/l_y.json -e24957d63bac1e754fcc1647a4a86337a67f6298 assets/create/models/block/fluid_pipe/l_z.json eacc5ee5f164ccc7c13cfbbd37a92b401222debe assets/create/models/block/fluid_pipe/ld_x.json 33fc0ecce85fae051c54d5a538793d7081238894 assets/create/models/block/fluid_pipe/ld_y.json 638f1a259cabed1f8d63c6fdaa6d4d4dff539e7d assets/create/models/block/fluid_pipe/ld_z.json @@ -1164,21 +1161,24 @@ c52521cd566294c797312104284ddd343fad9c2e assets/create/models/block/fluid_pipe/l 99637310d3ca1ccfbe62b03aa9b0d82a0cf6f724 assets/create/models/block/fluid_pipe/lu_x.json 986800d441e95553464d1869d39baf456f5d70dc assets/create/models/block/fluid_pipe/lu_y.json 11dcf7d2dcd0df9b043035cb072deee96ab9e6da assets/create/models/block/fluid_pipe/lu_z.json -d44ff2aed71039a7d0ff913d0d9e8398e1318f39 assets/create/models/block/fluid_pipe/r_x.json -92d4044b51a90da0b2277b0613c7ca0bb80c66fe assets/create/models/block/fluid_pipe/r_y.json -fb9a23de00ef4edb4f7e24fb60de345cd12e513f assets/create/models/block/fluid_pipe/r_z.json +b8fd54e514bd50fb287c6b758647818c6b08ef75 assets/create/models/block/fluid_pipe/l_x.json +e985ff9dbe7324cf69ab38e6e9e85c9b554af56c assets/create/models/block/fluid_pipe/l_y.json +e24957d63bac1e754fcc1647a4a86337a67f6298 assets/create/models/block/fluid_pipe/l_z.json bde9ec36b86113a6ca7a51a4f405994460a2eb56 assets/create/models/block/fluid_pipe/rd_x.json bd325f5b37ff08328ddddeeceac1a41be586d20a assets/create/models/block/fluid_pipe/rd_y.json 28f351fd215af3a991ccd9aa05c57b9cd9e6f58d assets/create/models/block/fluid_pipe/rd_z.json 1ff3ea321aeacca70709eb76370c11c7f13163b6 assets/create/models/block/fluid_pipe/ru_x.json 95bc5342fd3909981430c2e13ef98cdbd8f02709 assets/create/models/block/fluid_pipe/ru_y.json e1fc0d1297a83749ac55f51c9cf33ff2ecc9fdc2 assets/create/models/block/fluid_pipe/ru_z.json -4e3debb2ba60398a0730866f781e0455f4316610 assets/create/models/block/fluid_pipe/u_x.json -0f98b30ba09706b8a5ee09aeef912b39acea0216 assets/create/models/block/fluid_pipe/u_y.json -83bf9b1af633c319c051055170debff4cc3508c0 assets/create/models/block/fluid_pipe/u_z.json +d44ff2aed71039a7d0ff913d0d9e8398e1318f39 assets/create/models/block/fluid_pipe/r_x.json +92d4044b51a90da0b2277b0613c7ca0bb80c66fe assets/create/models/block/fluid_pipe/r_y.json +fb9a23de00ef4edb4f7e24fb60de345cd12e513f assets/create/models/block/fluid_pipe/r_z.json 65a41f4b680af197776e03cae6f1815b6d04def2 assets/create/models/block/fluid_pipe/ud_x.json 26398801d89889ffe17b6513b786d27707f6a480 assets/create/models/block/fluid_pipe/ud_y.json 07747cc2b936e1b326bae7ac32a8a5ba77fdffa9 assets/create/models/block/fluid_pipe/ud_z.json +4e3debb2ba60398a0730866f781e0455f4316610 assets/create/models/block/fluid_pipe/u_x.json +0f98b30ba09706b8a5ee09aeef912b39acea0216 assets/create/models/block/fluid_pipe/u_y.json +83bf9b1af633c319c051055170debff4cc3508c0 assets/create/models/block/fluid_pipe/u_z.json 5f70af15ec2569c68a17d31024c7a37cb5c68c7e assets/create/models/block/framed_glass.json f0100e1d44146b256998fbd2af05da80d147e8d9 assets/create/models/block/framed_glass_pane_noside.json 4a032c6ae3f459e3349c2a2218da186170c31e03 assets/create/models/block/framed_glass_pane_noside_alt.json @@ -1269,6 +1269,9 @@ d1813d0f548fcddb361df7cc3b5d97582842b10f assets/create/models/block/light_gray_s debf78f20659bc3c637299a40b649cbe4aa30ebf assets/create/models/block/light_gray_table_cloth.json 4ec5d701dd8b2d8c3dc44d05f527a3d737002cd4 assets/create/models/block/light_gray_toolbox.json adb8dbed70419e0310e7a20f3656bf325b348434 assets/create/models/block/light_gray_valve_handle.json +8f53caad3899a30be5087a0ba155080834418cc0 assets/create/models/block/limestone.json +2b80f9421c2fe902d55d9bd95183ad4bae46c315 assets/create/models/block/limestone_pillar.json +fb18280a2a708f60b00cc7c675804c219784871a assets/create/models/block/limestone_pillar_horizontal.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/lime_nixie_tube.json 952d292d4dc2158e6106c5079cfa1ddb81c7777e assets/create/models/block/lime_postbox_closed.json 4357f5d9102d54c7fbe5325512a2cd42d94d6d42 assets/create/models/block/lime_postbox_open.json @@ -1277,9 +1280,6 @@ adb8dbed70419e0310e7a20f3656bf325b348434 assets/create/models/block/light_gray_v e4142a22c20d6e5b9a8b9f96c13d4e5f96adc59d assets/create/models/block/lime_table_cloth.json b92822a01e4fbed2463b1bdf7dcc736023988e20 assets/create/models/block/lime_toolbox.json 802b47f34b1053b7af980b08b6511f468e7dd7c1 assets/create/models/block/lime_valve_handle.json -8f53caad3899a30be5087a0ba155080834418cc0 assets/create/models/block/limestone.json -2b80f9421c2fe902d55d9bd95183ad4bae46c315 assets/create/models/block/limestone_pillar.json -fb18280a2a708f60b00cc7c675804c219784871a assets/create/models/block/limestone_pillar_horizontal.json 84b9ac6eafdbd037f3ff558c250a8b8952415af1 assets/create/models/block/linear_chassis.json 29ee936c09c1222c6a144e5bb39577b5a9cd28bf assets/create/models/block/linear_chassis_bottom.json a1a3804ddcb1db0a7b5c0693555f8eb326950dd0 assets/create/models/block/linear_chassis_top.json @@ -1325,18 +1325,18 @@ f9010894858512398bddd5d31b922e12594d2e3c assets/create/models/block/ornate_iron_ 92637fbd6bf54891411b32a494064b9a48e59411 assets/create/models/block/ornate_iron_window_pane_post.json 8416d497e7fc8ca4f9f4c608ccc0651036850256 assets/create/models/block/ornate_iron_window_pane_side.json 1cdaa9d4bd23f7b1eb14672dc9322d9dad966502 assets/create/models/block/ornate_iron_window_pane_side_alt.json +561beafce41b9e9c0b07bc6b7176dd4f6918c116 assets/create/models/block/oxidized_copper_shingles.json 7e0bab8109e322c6db5fe1d5999c06536c21c6eb assets/create/models/block/oxidized_copper_shingle_slab.json 42df32c4e2d1ffb2ee62748becfd1717118b440c assets/create/models/block/oxidized_copper_shingle_slab_top.json b55a733e3e68cfbd08d45bb9ac56deef9f728b60 assets/create/models/block/oxidized_copper_shingle_stairs.json 7b8745213af5aa7938fc04a295be6a087c72daa8 assets/create/models/block/oxidized_copper_shingle_stairs_inner.json d89419d48d6ee2f6747e7c93de8699db22ea3f59 assets/create/models/block/oxidized_copper_shingle_stairs_outer.json -561beafce41b9e9c0b07bc6b7176dd4f6918c116 assets/create/models/block/oxidized_copper_shingles.json +5cf92b628ff1f832966138a58ed87d747681274c assets/create/models/block/oxidized_copper_tiles.json ad6134598869711a12e2f95c9b5f25a0f7b8dd93 assets/create/models/block/oxidized_copper_tile_slab.json c17bac0fd6a20540813c6a1c000a553b7c5ac849 assets/create/models/block/oxidized_copper_tile_slab_top.json d5b30340364f5536e46bc67e777ef4fa20a36e04 assets/create/models/block/oxidized_copper_tile_stairs.json b40b315c23cbd3eb4658518bfac836f6091321a5 assets/create/models/block/oxidized_copper_tile_stairs_inner.json f4eaadab29b4f2e915237340e2d6f4aad4ba21d6 assets/create/models/block/oxidized_copper_tile_stairs_outer.json -5cf92b628ff1f832966138a58ed87d747681274c assets/create/models/block/oxidized_copper_tiles.json f8b51eec36c2eddc08a1b60894d863bb58f55625 assets/create/models/block/peculiar_bell_ceiling.json f70f83cfec770879c478eea3760ea187700f2878 assets/create/models/block/peculiar_bell_double_wall.json b9c9d00b844ca2f217ae21cc502cd4d082fed2d5 assets/create/models/block/peculiar_bell_floor.json @@ -1543,133 +1543,133 @@ ff52eb59dadfe675e416440f3115856a501428a6 assets/create/models/block/scoria.json 4d7d36f974d25a310db2f75800e8c7e0377881c6 assets/create/models/block/secondary_linear_chassis_top.json 5ecb821ac06873015d2d7ebcfb7e1f5fe85cf504 assets/create/models/block/secondary_linear_chassis_top_bottom.json e697898a0ec4c308314a4e0b7235fa0a9229da45 assets/create/models/block/shadow_steel_casing.json +73edb947b52c73e85a83422853d0b8a0fb34e82b assets/create/models/block/small_andesite_bricks.json +3bb5c8413b9e81a1adc339f873f37eb656904e06 assets/create/models/block/small_andesite_bricks_wall_post.json +0e70d94fc6ffdc0fd4a50a5910bc1455b401982f assets/create/models/block/small_andesite_bricks_wall_side.json +597fec784e40c1ff3b622824c32773d6d271f3b7 assets/create/models/block/small_andesite_bricks_wall_side_tall.json 593b962350c8de53156901b308617c6a246afa09 assets/create/models/block/small_andesite_brick_slab.json c83de8118653ccdce92a1b7f3501bf7359e0b310 assets/create/models/block/small_andesite_brick_slab_top.json f019380bcc81d52681e2beaf63e2b11836c45922 assets/create/models/block/small_andesite_brick_stairs.json 4fa72fe0115ad9ec83837852a2b2e2d22dde19ca assets/create/models/block/small_andesite_brick_stairs_inner.json f80f485f62dce86e98815b343c89e96b10623e53 assets/create/models/block/small_andesite_brick_stairs_outer.json -73edb947b52c73e85a83422853d0b8a0fb34e82b assets/create/models/block/small_andesite_bricks.json -3bb5c8413b9e81a1adc339f873f37eb656904e06 assets/create/models/block/small_andesite_bricks_wall_post.json -0e70d94fc6ffdc0fd4a50a5910bc1455b401982f assets/create/models/block/small_andesite_bricks_wall_side.json -597fec784e40c1ff3b622824c32773d6d271f3b7 assets/create/models/block/small_andesite_bricks_wall_side_tall.json +4750724972cbac6d7dac31e0689681eab6c37093 assets/create/models/block/small_asurine_bricks.json +407c7bea509bb0e9bf9f04e947ace584103d012d assets/create/models/block/small_asurine_bricks_wall_post.json +60491dfb4f2a6b78effdf18612b9a1cd7d930d8a assets/create/models/block/small_asurine_bricks_wall_side.json +e5d3172c08b65696a6d72220495463636d8b352c assets/create/models/block/small_asurine_bricks_wall_side_tall.json cdd354726eda82d83dc89871fa587b8c07b02a16 assets/create/models/block/small_asurine_brick_slab.json 7bdb6ed1e74437d083bca7d89c0d1b7c81e80b53 assets/create/models/block/small_asurine_brick_slab_top.json 086b9d4284d343967a582fd0a7d194bafd980e13 assets/create/models/block/small_asurine_brick_stairs.json db69f1580ca405b9a99f0e4ea8d9b9950ed6444e assets/create/models/block/small_asurine_brick_stairs_inner.json dd572cbff713b0f4830aef0bf3ba4adb80ee9908 assets/create/models/block/small_asurine_brick_stairs_outer.json -4750724972cbac6d7dac31e0689681eab6c37093 assets/create/models/block/small_asurine_bricks.json -407c7bea509bb0e9bf9f04e947ace584103d012d assets/create/models/block/small_asurine_bricks_wall_post.json -60491dfb4f2a6b78effdf18612b9a1cd7d930d8a assets/create/models/block/small_asurine_bricks_wall_side.json -e5d3172c08b65696a6d72220495463636d8b352c assets/create/models/block/small_asurine_bricks_wall_side_tall.json +c2c72734ac526c319cb01e982824680bfb5f1186 assets/create/models/block/small_calcite_bricks.json +f17f2ecd5e5a32f92ec0ad0ba9e861a80432c0f2 assets/create/models/block/small_calcite_bricks_wall_post.json +1ad7654125aff67267567c0007cc03b8a15131b0 assets/create/models/block/small_calcite_bricks_wall_side.json +10c339f64c0e78f4fbb7a95c10bf7f9f399c0c6b assets/create/models/block/small_calcite_bricks_wall_side_tall.json d07c57748981a54ffcdadc30ec21f728a3557bea assets/create/models/block/small_calcite_brick_slab.json 9a5e6a93328ad35b256b2512c28e683a74e807a9 assets/create/models/block/small_calcite_brick_slab_top.json c3d39e013dd0142f044f8f0a90de849a0d961e84 assets/create/models/block/small_calcite_brick_stairs.json 4e47a4708dafc0ea476e2d5b6567acfdc2c5c148 assets/create/models/block/small_calcite_brick_stairs_inner.json 6a41c44680a958299a787d8c8c8778d52167cd65 assets/create/models/block/small_calcite_brick_stairs_outer.json -c2c72734ac526c319cb01e982824680bfb5f1186 assets/create/models/block/small_calcite_bricks.json -f17f2ecd5e5a32f92ec0ad0ba9e861a80432c0f2 assets/create/models/block/small_calcite_bricks_wall_post.json -1ad7654125aff67267567c0007cc03b8a15131b0 assets/create/models/block/small_calcite_bricks_wall_side.json -10c339f64c0e78f4fbb7a95c10bf7f9f399c0c6b assets/create/models/block/small_calcite_bricks_wall_side_tall.json +485f6c0e37b24124ff23efa3f0caa2cfe85663dd assets/create/models/block/small_crimsite_bricks.json +57b050751e68c9a881d9598cfe8dfb45f19df08c assets/create/models/block/small_crimsite_bricks_wall_post.json +cb01f90c7ac1f56a6f79e1fecb126c349b6d53b0 assets/create/models/block/small_crimsite_bricks_wall_side.json +80932617b1d4b718071c1f8558398ba881743892 assets/create/models/block/small_crimsite_bricks_wall_side_tall.json 827867ddd9b5f6e2daa916c968531c7183ce7fa2 assets/create/models/block/small_crimsite_brick_slab.json dd19ebdbd1a2de827d467b0abd2d1d3ee5822305 assets/create/models/block/small_crimsite_brick_slab_top.json 58048cb41b740b008a98420ea93b567f38e2910f assets/create/models/block/small_crimsite_brick_stairs.json a943586885ea7d48fc27595d9741f97d852446e7 assets/create/models/block/small_crimsite_brick_stairs_inner.json 8dc173b8a9912341ccb9cd8c9a0d2d893571eb85 assets/create/models/block/small_crimsite_brick_stairs_outer.json -485f6c0e37b24124ff23efa3f0caa2cfe85663dd assets/create/models/block/small_crimsite_bricks.json -57b050751e68c9a881d9598cfe8dfb45f19df08c assets/create/models/block/small_crimsite_bricks_wall_post.json -cb01f90c7ac1f56a6f79e1fecb126c349b6d53b0 assets/create/models/block/small_crimsite_bricks_wall_side.json -80932617b1d4b718071c1f8558398ba881743892 assets/create/models/block/small_crimsite_bricks_wall_side_tall.json +cd855b25c38be2c36dcbf6ab0d963a2c76043171 assets/create/models/block/small_deepslate_bricks.json +88a6c43f64c6d53b34719f41707622635108342b assets/create/models/block/small_deepslate_bricks_wall_post.json +dea1773ca9baf9e1a6a7a4288d348127b858c42d assets/create/models/block/small_deepslate_bricks_wall_side.json +673ab543b38a597fd74285cd25b8004c9e2bd706 assets/create/models/block/small_deepslate_bricks_wall_side_tall.json 67c78a3e9250351d0ea18538640b596f05e957a4 assets/create/models/block/small_deepslate_brick_slab.json bc1af783fbcbe73df05e12c93625035db8089d16 assets/create/models/block/small_deepslate_brick_slab_top.json 91e00675337592d17a04032808ca64c4a159c814 assets/create/models/block/small_deepslate_brick_stairs.json 39e78262242637628628a07dc47908fb1593d3f2 assets/create/models/block/small_deepslate_brick_stairs_inner.json d7a61bc4c84070e0fd53e0957a5282078daff7f1 assets/create/models/block/small_deepslate_brick_stairs_outer.json -cd855b25c38be2c36dcbf6ab0d963a2c76043171 assets/create/models/block/small_deepslate_bricks.json -88a6c43f64c6d53b34719f41707622635108342b assets/create/models/block/small_deepslate_bricks_wall_post.json -dea1773ca9baf9e1a6a7a4288d348127b858c42d assets/create/models/block/small_deepslate_bricks_wall_side.json -673ab543b38a597fd74285cd25b8004c9e2bd706 assets/create/models/block/small_deepslate_bricks_wall_side_tall.json +73e801fb607d76b42e1862323e9d149910a68298 assets/create/models/block/small_diorite_bricks.json +2bdb593d3ae4d856e96cc877f4927da25841af54 assets/create/models/block/small_diorite_bricks_wall_post.json +dd064be7962a2418784a513725fc7b5835e4ab40 assets/create/models/block/small_diorite_bricks_wall_side.json +3753c64785d74f1997b9f8f856fa873302621f39 assets/create/models/block/small_diorite_bricks_wall_side_tall.json 59fc1d9dac0b6867779346413953174fc6b55d3c assets/create/models/block/small_diorite_brick_slab.json cbd6fe711e1203aa746d86d12bb85016b7142749 assets/create/models/block/small_diorite_brick_slab_top.json a6c823fa96ba8a06d101ca96a6898fe8a1faf83e assets/create/models/block/small_diorite_brick_stairs.json 7f128501d989122df9d2ab002a497356831caa1c assets/create/models/block/small_diorite_brick_stairs_inner.json 26222975b0efb2acea6473d0bcc99453aa9ed561 assets/create/models/block/small_diorite_brick_stairs_outer.json -73e801fb607d76b42e1862323e9d149910a68298 assets/create/models/block/small_diorite_bricks.json -2bdb593d3ae4d856e96cc877f4927da25841af54 assets/create/models/block/small_diorite_bricks_wall_post.json -dd064be7962a2418784a513725fc7b5835e4ab40 assets/create/models/block/small_diorite_bricks_wall_side.json -3753c64785d74f1997b9f8f856fa873302621f39 assets/create/models/block/small_diorite_bricks_wall_side_tall.json +7f55f9c8cae6a79a9ab22a4b593a2c5829390573 assets/create/models/block/small_dripstone_bricks.json +fd0880b2e55435c8dc6945fa71c67ba34d7b1e69 assets/create/models/block/small_dripstone_bricks_wall_post.json +c00e9c0bfb108b70975514694f38d3c4cd63e819 assets/create/models/block/small_dripstone_bricks_wall_side.json +26382c01766e04cfe7ea585cabc1baa1c409e0a0 assets/create/models/block/small_dripstone_bricks_wall_side_tall.json 7b18bb56d4509f490a73b2812a8e40333f400369 assets/create/models/block/small_dripstone_brick_slab.json 39b7aa7d1494e5328e8774acb8adec8a346e972f assets/create/models/block/small_dripstone_brick_slab_top.json 3d265aed7a723713d525d0fabf3a70600d9d60e4 assets/create/models/block/small_dripstone_brick_stairs.json 2be41e9c1367af7f0eb99856e35900df96974bd4 assets/create/models/block/small_dripstone_brick_stairs_inner.json 4026a9327d47d55218b00b0b4b92464b6448ad91 assets/create/models/block/small_dripstone_brick_stairs_outer.json -7f55f9c8cae6a79a9ab22a4b593a2c5829390573 assets/create/models/block/small_dripstone_bricks.json -fd0880b2e55435c8dc6945fa71c67ba34d7b1e69 assets/create/models/block/small_dripstone_bricks_wall_post.json -c00e9c0bfb108b70975514694f38d3c4cd63e819 assets/create/models/block/small_dripstone_bricks_wall_side.json -26382c01766e04cfe7ea585cabc1baa1c409e0a0 assets/create/models/block/small_dripstone_bricks_wall_side_tall.json +ad4cf29e0e67d0d202d5836486531551909c71bf assets/create/models/block/small_granite_bricks.json +d20963cbb5d2321a069bf42d203855a5584f8607 assets/create/models/block/small_granite_bricks_wall_post.json +b860879b66d2d23349fa95ff644d9eba21eb29bd assets/create/models/block/small_granite_bricks_wall_side.json +11593a2a0e307b3e1d847c84d8c61bc78fef2967 assets/create/models/block/small_granite_bricks_wall_side_tall.json cb0a72cedb6b2b043eaf8c8869648802d74a2eeb assets/create/models/block/small_granite_brick_slab.json d635840492541787d55cc005c7e207532edcdef3 assets/create/models/block/small_granite_brick_slab_top.json ba9bfedf5854fccaba8a5e60c26efb6e34ede3cd assets/create/models/block/small_granite_brick_stairs.json 9bebe59176e74926e28a139dc557c25283285e89 assets/create/models/block/small_granite_brick_stairs_inner.json 15d71900e76c131285447628e63bf1479ce7025a assets/create/models/block/small_granite_brick_stairs_outer.json -ad4cf29e0e67d0d202d5836486531551909c71bf assets/create/models/block/small_granite_bricks.json -d20963cbb5d2321a069bf42d203855a5584f8607 assets/create/models/block/small_granite_bricks_wall_post.json -b860879b66d2d23349fa95ff644d9eba21eb29bd assets/create/models/block/small_granite_bricks_wall_side.json -11593a2a0e307b3e1d847c84d8c61bc78fef2967 assets/create/models/block/small_granite_bricks_wall_side_tall.json +6224f2763224d3e746dafdaaf14fae68e2469b93 assets/create/models/block/small_limestone_bricks.json +ca038e240e4157897a6273692db2c952ab5b17d7 assets/create/models/block/small_limestone_bricks_wall_post.json +7920f8cfda77b22d4d29638faa6ae07d89e51ab3 assets/create/models/block/small_limestone_bricks_wall_side.json +6e1fa27744f4592111945e5cafee6d7d67b5299b assets/create/models/block/small_limestone_bricks_wall_side_tall.json 0e0f551bac87421e6b693aa9ca98fd5da2ee168b assets/create/models/block/small_limestone_brick_slab.json 6669c1e87ed79097f96e7e46eecf3ab6e7c9778c assets/create/models/block/small_limestone_brick_slab_top.json 5aff0145d2fc89549ac541db325dda25b8941583 assets/create/models/block/small_limestone_brick_stairs.json 250aa2c237a9532b19621fa604027433183961c3 assets/create/models/block/small_limestone_brick_stairs_inner.json 92da57d330e9905d017705dd931af1d1d6c1a00d assets/create/models/block/small_limestone_brick_stairs_outer.json -6224f2763224d3e746dafdaaf14fae68e2469b93 assets/create/models/block/small_limestone_bricks.json -ca038e240e4157897a6273692db2c952ab5b17d7 assets/create/models/block/small_limestone_bricks_wall_post.json -7920f8cfda77b22d4d29638faa6ae07d89e51ab3 assets/create/models/block/small_limestone_bricks_wall_side.json -6e1fa27744f4592111945e5cafee6d7d67b5299b assets/create/models/block/small_limestone_bricks_wall_side_tall.json +242e4f39f6df26917f21899f0c7d0415a166d4b9 assets/create/models/block/small_ochrum_bricks.json +06cb9faca0062947c08b2a7309a958aac5ab24ac assets/create/models/block/small_ochrum_bricks_wall_post.json +8d9d53206e222839333026c779b66b9fd8cf2cf9 assets/create/models/block/small_ochrum_bricks_wall_side.json +f412fbaa509f7b2d47a27d4bcb13590bfcae74ca assets/create/models/block/small_ochrum_bricks_wall_side_tall.json 517e3605a9e86a07c673e18d94c2c37109a2aef5 assets/create/models/block/small_ochrum_brick_slab.json 855ad9f6fe03ceb2cc33d9df3536cb4394acfa9b assets/create/models/block/small_ochrum_brick_slab_top.json c5fc35d6b0fe96c11537bc10d34a63ef80f3270c assets/create/models/block/small_ochrum_brick_stairs.json 9a2631d9f6821d2c01bc8b2588a69702d3b083cc assets/create/models/block/small_ochrum_brick_stairs_inner.json 1f0ccdef29dae18535ea304e954e06c91bb0620b assets/create/models/block/small_ochrum_brick_stairs_outer.json -242e4f39f6df26917f21899f0c7d0415a166d4b9 assets/create/models/block/small_ochrum_bricks.json -06cb9faca0062947c08b2a7309a958aac5ab24ac assets/create/models/block/small_ochrum_bricks_wall_post.json -8d9d53206e222839333026c779b66b9fd8cf2cf9 assets/create/models/block/small_ochrum_bricks_wall_side.json -f412fbaa509f7b2d47a27d4bcb13590bfcae74ca assets/create/models/block/small_ochrum_bricks_wall_side_tall.json be96f070be1f838c6fb442c164b5f9b4e5cfcee5 assets/create/models/block/small_rose_quartz_tiles.json +41e56d8e334b81a0d5270bdbe87617981e1f98b4 assets/create/models/block/small_scorchia_bricks.json +56aa81e05019533ce0e0f1ee3ef7bf20fcc400b4 assets/create/models/block/small_scorchia_bricks_wall_post.json +1e1fa90c8b144813770c4d53a3b734ae450895d6 assets/create/models/block/small_scorchia_bricks_wall_side.json +6a46cf73c03a2abea25a81dbb28f4150b355900c assets/create/models/block/small_scorchia_bricks_wall_side_tall.json 6aa3825ace2e73bec454aaa8597e3a892ee29eb7 assets/create/models/block/small_scorchia_brick_slab.json f0378625001171c449a403e372e59623f0fc6569 assets/create/models/block/small_scorchia_brick_slab_top.json 49fa4a3940f84902319df257d39812eb71c8a9e2 assets/create/models/block/small_scorchia_brick_stairs.json 4dee6e6dbe6a98a8eaa04f6812f322343f62fca1 assets/create/models/block/small_scorchia_brick_stairs_inner.json 8a19e7e5c03c155c9ef9332486ae0b069dea0502 assets/create/models/block/small_scorchia_brick_stairs_outer.json -41e56d8e334b81a0d5270bdbe87617981e1f98b4 assets/create/models/block/small_scorchia_bricks.json -56aa81e05019533ce0e0f1ee3ef7bf20fcc400b4 assets/create/models/block/small_scorchia_bricks_wall_post.json -1e1fa90c8b144813770c4d53a3b734ae450895d6 assets/create/models/block/small_scorchia_bricks_wall_side.json -6a46cf73c03a2abea25a81dbb28f4150b355900c assets/create/models/block/small_scorchia_bricks_wall_side_tall.json +6b435123d852579ba8467c4915cd5d0adaadeca0 assets/create/models/block/small_scoria_bricks.json +86b243074845ca66916ce96ef3774862cf9a39d4 assets/create/models/block/small_scoria_bricks_wall_post.json +57ccb3efbdc4a69cad60c8b90321338ba2e68321 assets/create/models/block/small_scoria_bricks_wall_side.json +d4c5398e10b25d2dc3cb3754a449fc2b60e4074f assets/create/models/block/small_scoria_bricks_wall_side_tall.json 918351c1270c26932c0c4783543779a25ca7e986 assets/create/models/block/small_scoria_brick_slab.json 4138e756b4b36f227e178acbcc233edb082ae603 assets/create/models/block/small_scoria_brick_slab_top.json b8e70cd7d9acdcf91be9783cd91d70275a006ea2 assets/create/models/block/small_scoria_brick_stairs.json 625bfbd58440ea4e270d57cc748f2b5f6cece63b assets/create/models/block/small_scoria_brick_stairs_inner.json 602a46fb2736acb8c50b0d04222e6c33e52dee87 assets/create/models/block/small_scoria_brick_stairs_outer.json -6b435123d852579ba8467c4915cd5d0adaadeca0 assets/create/models/block/small_scoria_bricks.json -86b243074845ca66916ce96ef3774862cf9a39d4 assets/create/models/block/small_scoria_bricks_wall_post.json -57ccb3efbdc4a69cad60c8b90321338ba2e68321 assets/create/models/block/small_scoria_bricks_wall_side.json -d4c5398e10b25d2dc3cb3754a449fc2b60e4074f assets/create/models/block/small_scoria_bricks_wall_side_tall.json +a8e8c633dfb6d9f14425b1fd28e88ecf08a88cc6 assets/create/models/block/small_tuff_bricks.json +1c3a22bed504cd7a7e507e83ee21399f8a3fb299 assets/create/models/block/small_tuff_bricks_wall_post.json +1aeb8cac7d0178a18ac1cf98c9a45ca8e67514b0 assets/create/models/block/small_tuff_bricks_wall_side.json +4c6b5c7c60ec4cad314064b171413a3e866e5f99 assets/create/models/block/small_tuff_bricks_wall_side_tall.json 6b2c4d8c8609de0d3d6ce1e30b1dd26ba59cb86d assets/create/models/block/small_tuff_brick_slab.json 1ba07367fcba6a3914f1703115304a7c19979542 assets/create/models/block/small_tuff_brick_slab_top.json 1a5ab239d0f2f041ee04005ceb60111e6848f5de assets/create/models/block/small_tuff_brick_stairs.json be3ee2c36f85a534a71d42a7d63a7816945b3c30 assets/create/models/block/small_tuff_brick_stairs_inner.json aa84e448041d5f74c75565f5e409b1e9b7e5155d assets/create/models/block/small_tuff_brick_stairs_outer.json -a8e8c633dfb6d9f14425b1fd28e88ecf08a88cc6 assets/create/models/block/small_tuff_bricks.json -1c3a22bed504cd7a7e507e83ee21399f8a3fb299 assets/create/models/block/small_tuff_bricks_wall_post.json -1aeb8cac7d0178a18ac1cf98c9a45ca8e67514b0 assets/create/models/block/small_tuff_bricks_wall_side.json -4c6b5c7c60ec4cad314064b171413a3e866e5f99 assets/create/models/block/small_tuff_bricks_wall_side_tall.json +e9c75f1b4b663dce09b0a2f8282e574839c19d06 assets/create/models/block/small_veridium_bricks.json +725f6d3dbcfb469cede6fb27a98c1f398f3f3c8c assets/create/models/block/small_veridium_bricks_wall_post.json +b33ee496d43e315a5bed5eaabfd553e361fec1a9 assets/create/models/block/small_veridium_bricks_wall_side.json +80e950f93def51d82a63848b1fb6ac11600ab1bf assets/create/models/block/small_veridium_bricks_wall_side_tall.json 30b150fe3cf9bdb6ee32cd6b0f51179b44be57d3 assets/create/models/block/small_veridium_brick_slab.json 2158dd9e71f6f60e5132105c68a41ad6e3927438 assets/create/models/block/small_veridium_brick_slab_top.json bbbfc8e3696945ed1f6c3afe73ae0745ff8deda1 assets/create/models/block/small_veridium_brick_stairs.json fc3a996b0ca01c2c09ad84b881c46e92918d084f assets/create/models/block/small_veridium_brick_stairs_inner.json e27a77984e8e28e6032f26bb010efcadfaeb5407 assets/create/models/block/small_veridium_brick_stairs_outer.json -e9c75f1b4b663dce09b0a2f8282e574839c19d06 assets/create/models/block/small_veridium_bricks.json -725f6d3dbcfb469cede6fb27a98c1f398f3f3c8c assets/create/models/block/small_veridium_bricks_wall_post.json -b33ee496d43e315a5bed5eaabfd553e361fec1a9 assets/create/models/block/small_veridium_bricks_wall_side.json -80e950f93def51d82a63848b1fb6ac11600ab1bf assets/create/models/block/small_veridium_bricks_wall_side_tall.json d7c1c2679c8ba543ae7be3b9cf3f4eea3c1a2f68 assets/create/models/block/spruce_window.json f4a4fbb9eea6fb1d0633e349eae6acdaf329e8d5 assets/create/models/block/spruce_window_pane_noside.json 02a25202a42debcd2b4aaa4113e3de4f8f6ee47c assets/create/models/block/spruce_window_pane_noside_alt.json @@ -1736,66 +1736,66 @@ e84875a4eb11e2161a93ec7569aa2ac1c2f60cef assets/create/models/block/warped_windo 378c865ff8213ff56f1f7a4b2d9cf26c71f036e8 assets/create/models/block/warped_window_pane_post.json f320de08cb113a9ad17acd2ebb8dfc57759e4f7d assets/create/models/block/warped_window_pane_side.json 2fc182d9697b5cddd93b01d1236931af27eee8fe assets/create/models/block/warped_window_pane_side_alt.json +32fdb85b5b62d5a0fb41732874c854788cdd2ba1 assets/create/models/block/waxed_copper_shingles.json fb7fb6deebd502946ab57f1b8a9f4a6b5dd48da3 assets/create/models/block/waxed_copper_shingle_slab.json 660f61112b8e46dec5050cb0ed4ee936965a7c58 assets/create/models/block/waxed_copper_shingle_slab_top.json 5d74be967bbe9feba4b630751f13af817a733d1d assets/create/models/block/waxed_copper_shingle_stairs.json 35cb89f29ce3f8d8af13602c08ecd7afbb7cf56a assets/create/models/block/waxed_copper_shingle_stairs_inner.json fcb9295f4f388e6d439ec9a3906ca326b6d69077 assets/create/models/block/waxed_copper_shingle_stairs_outer.json -32fdb85b5b62d5a0fb41732874c854788cdd2ba1 assets/create/models/block/waxed_copper_shingles.json +32f06f39d0b34e4431795aa6e64f87e58dc1597b assets/create/models/block/waxed_copper_tiles.json 298c6100de02ed9f813397d8ba38c46f35035c69 assets/create/models/block/waxed_copper_tile_slab.json d4422c2d96fb329087d1be70d8b983a8cf6c7f01 assets/create/models/block/waxed_copper_tile_slab_top.json fca72048f916d3a3e567b385c948cc1b59711ef4 assets/create/models/block/waxed_copper_tile_stairs.json 997479b62ed3d81ab633279ecc2fabd9588a3bf3 assets/create/models/block/waxed_copper_tile_stairs_inner.json d5c5bbfb9aaa282e11ad6e6309b1880b172ee653 assets/create/models/block/waxed_copper_tile_stairs_outer.json -32f06f39d0b34e4431795aa6e64f87e58dc1597b assets/create/models/block/waxed_copper_tiles.json +19a773f91c58c49301f35965bac02d0c05fb2764 assets/create/models/block/waxed_exposed_copper_shingles.json a3420b91fdebec40e508a5eebb145c0201bd80c8 assets/create/models/block/waxed_exposed_copper_shingle_slab.json 4178ea5e50ee17b3c15f4a59efd019c4a19bb892 assets/create/models/block/waxed_exposed_copper_shingle_slab_top.json dd2d747774abc86e428a883e299db66cded78e11 assets/create/models/block/waxed_exposed_copper_shingle_stairs.json b6845da62d96a33cee624bb70360e256b26eda83 assets/create/models/block/waxed_exposed_copper_shingle_stairs_inner.json 3d8b758e50e75c5adc26ab6f39f9d73f00866673 assets/create/models/block/waxed_exposed_copper_shingle_stairs_outer.json -19a773f91c58c49301f35965bac02d0c05fb2764 assets/create/models/block/waxed_exposed_copper_shingles.json +9cb20c9d41629d8b9426cb65829365d10966338f assets/create/models/block/waxed_exposed_copper_tiles.json cd21d9d2935b6d0103502e2731c11ea27ff64ecf assets/create/models/block/waxed_exposed_copper_tile_slab.json 0ec039ba59fb0028183433e52131ff355ace5bff assets/create/models/block/waxed_exposed_copper_tile_slab_top.json c51dbd34996ac4513234800e427ac308067d5e1d assets/create/models/block/waxed_exposed_copper_tile_stairs.json 68772d4352dc7ade995dfa57ba41a38ef819e855 assets/create/models/block/waxed_exposed_copper_tile_stairs_inner.json d932671822ba93b71a9c8b50e7207803a1c4dbab assets/create/models/block/waxed_exposed_copper_tile_stairs_outer.json -9cb20c9d41629d8b9426cb65829365d10966338f assets/create/models/block/waxed_exposed_copper_tiles.json +561beafce41b9e9c0b07bc6b7176dd4f6918c116 assets/create/models/block/waxed_oxidized_copper_shingles.json 7e0bab8109e322c6db5fe1d5999c06536c21c6eb assets/create/models/block/waxed_oxidized_copper_shingle_slab.json 42df32c4e2d1ffb2ee62748becfd1717118b440c assets/create/models/block/waxed_oxidized_copper_shingle_slab_top.json b55a733e3e68cfbd08d45bb9ac56deef9f728b60 assets/create/models/block/waxed_oxidized_copper_shingle_stairs.json 7b8745213af5aa7938fc04a295be6a087c72daa8 assets/create/models/block/waxed_oxidized_copper_shingle_stairs_inner.json d89419d48d6ee2f6747e7c93de8699db22ea3f59 assets/create/models/block/waxed_oxidized_copper_shingle_stairs_outer.json -561beafce41b9e9c0b07bc6b7176dd4f6918c116 assets/create/models/block/waxed_oxidized_copper_shingles.json +5cf92b628ff1f832966138a58ed87d747681274c assets/create/models/block/waxed_oxidized_copper_tiles.json ad6134598869711a12e2f95c9b5f25a0f7b8dd93 assets/create/models/block/waxed_oxidized_copper_tile_slab.json c17bac0fd6a20540813c6a1c000a553b7c5ac849 assets/create/models/block/waxed_oxidized_copper_tile_slab_top.json d5b30340364f5536e46bc67e777ef4fa20a36e04 assets/create/models/block/waxed_oxidized_copper_tile_stairs.json b40b315c23cbd3eb4658518bfac836f6091321a5 assets/create/models/block/waxed_oxidized_copper_tile_stairs_inner.json f4eaadab29b4f2e915237340e2d6f4aad4ba21d6 assets/create/models/block/waxed_oxidized_copper_tile_stairs_outer.json -5cf92b628ff1f832966138a58ed87d747681274c assets/create/models/block/waxed_oxidized_copper_tiles.json +9c73020e80c31cd710c218f9699ba9a795758ad0 assets/create/models/block/waxed_weathered_copper_shingles.json 897cfc177b073ca1bcb635c74108567f8748b5c4 assets/create/models/block/waxed_weathered_copper_shingle_slab.json efa57ba131c27e0064c0d958e69b10530a26ac41 assets/create/models/block/waxed_weathered_copper_shingle_slab_top.json 4ef11a7e3de630ad46b9179e8a9a34d55202f6c5 assets/create/models/block/waxed_weathered_copper_shingle_stairs.json f32a18c76cfaca2153f6321880a8da1347be37ce assets/create/models/block/waxed_weathered_copper_shingle_stairs_inner.json 9637f78e51ca7ed812e4c64c52e08f6fa0adbfc3 assets/create/models/block/waxed_weathered_copper_shingle_stairs_outer.json -9c73020e80c31cd710c218f9699ba9a795758ad0 assets/create/models/block/waxed_weathered_copper_shingles.json +9782a25341dd2ffb146430edbe6916932250c326 assets/create/models/block/waxed_weathered_copper_tiles.json 0c9669588972d4c2152bd2b043b8386b76a6e1c4 assets/create/models/block/waxed_weathered_copper_tile_slab.json 2d01a583cc948e9e0cb814cad968ed16a07dd46c assets/create/models/block/waxed_weathered_copper_tile_slab_top.json e26dd64495ff8801593e9c22203cbf364075badd assets/create/models/block/waxed_weathered_copper_tile_stairs.json b658c1022587bd670b5acee267607719c1544332 assets/create/models/block/waxed_weathered_copper_tile_stairs_inner.json e7ae89577be9d26a071bf96cbd7ed80293902b63 assets/create/models/block/waxed_weathered_copper_tile_stairs_outer.json -9782a25341dd2ffb146430edbe6916932250c326 assets/create/models/block/waxed_weathered_copper_tiles.json +9c73020e80c31cd710c218f9699ba9a795758ad0 assets/create/models/block/weathered_copper_shingles.json 897cfc177b073ca1bcb635c74108567f8748b5c4 assets/create/models/block/weathered_copper_shingle_slab.json efa57ba131c27e0064c0d958e69b10530a26ac41 assets/create/models/block/weathered_copper_shingle_slab_top.json 4ef11a7e3de630ad46b9179e8a9a34d55202f6c5 assets/create/models/block/weathered_copper_shingle_stairs.json f32a18c76cfaca2153f6321880a8da1347be37ce assets/create/models/block/weathered_copper_shingle_stairs_inner.json 9637f78e51ca7ed812e4c64c52e08f6fa0adbfc3 assets/create/models/block/weathered_copper_shingle_stairs_outer.json -9c73020e80c31cd710c218f9699ba9a795758ad0 assets/create/models/block/weathered_copper_shingles.json +9782a25341dd2ffb146430edbe6916932250c326 assets/create/models/block/weathered_copper_tiles.json 0c9669588972d4c2152bd2b043b8386b76a6e1c4 assets/create/models/block/weathered_copper_tile_slab.json 2d01a583cc948e9e0cb814cad968ed16a07dd46c assets/create/models/block/weathered_copper_tile_slab_top.json e26dd64495ff8801593e9c22203cbf364075badd assets/create/models/block/weathered_copper_tile_stairs.json b658c1022587bd670b5acee267607719c1544332 assets/create/models/block/weathered_copper_tile_stairs_inner.json e7ae89577be9d26a071bf96cbd7ed80293902b63 assets/create/models/block/weathered_copper_tile_stairs_outer.json -9782a25341dd2ffb146430edbe6916932250c326 assets/create/models/block/weathered_copper_tiles.json 045b812ddb1ca8dd6cd9b49852ddbd37f86cd2a6 assets/create/models/block/weathered_iron_block.json a569ddd725898a86f8745e46723edeff7fe7f2e9 assets/create/models/block/weathered_iron_window_1.json 133928d853037efb81022b69377669f0b16239bc assets/create/models/block/weathered_iron_window_2.json @@ -1971,13 +1971,13 @@ de48f4b6fa26928ebc7d5d60e6a0767093430d65 assets/create/models/item/contraption_c ccdf08652511e5737a8489d86ea9422ade4f4ca5 assets/create/models/item/copper_nugget.json 86a770e9b2af1f19bf633f5cfeecd84848f73fbd assets/create/models/item/copper_scaffolding.json a4fd2f4f00e03b2ac5d863e93827d39a984cc2ff assets/create/models/item/copper_sheet.json +13b18ba2938e283d507fbca70518cf52198cdc71 assets/create/models/item/copper_shingles.json 79d9f8667965072f12e51e6601b5c36f8acc125f assets/create/models/item/copper_shingle_slab.json 9fe6f0bdea4595b403ed2d2cbc2023a9abeb79f0 assets/create/models/item/copper_shingle_stairs.json -13b18ba2938e283d507fbca70518cf52198cdc71 assets/create/models/item/copper_shingles.json 9a33eeb0f7c682ee2f8c0abbfa174f8828acc2b5 assets/create/models/item/copper_table_cloth.json +19642e4ea5deecaf57059827c4c13a19d2e73822 assets/create/models/item/copper_tiles.json a7147444fc28a4cce21b6cf38e9528537e27c352 assets/create/models/item/copper_tile_slab.json 7330324d6c64f0340d676ecef83a930515d9130e assets/create/models/item/copper_tile_stairs.json -19642e4ea5deecaf57059827c4c13a19d2e73822 assets/create/models/item/copper_tiles.json 08c35e85afe4eb2b106133c5d9c7d7c64ca9a915 assets/create/models/item/copper_valve_handle.json 5cec229a3117ea5987aa42288c070427ac48a5dc assets/create/models/item/copycat_panel.json 1b6707005830ca066a7e997c73391ca88c70bdb0 assets/create/models/item/copycat_step.json @@ -2007,114 +2007,114 @@ b6acd86be9e6cac8b9ed2bc6297d27941ca05f46 assets/create/models/item/crushed_raw_z b67e95801010eab58de02f2b0160bff3f008bd18 assets/create/models/item/crushing_wheel.json af189b0c04482064520d84546d81af8154824292 assets/create/models/item/cuckoo_clock.json 314fb287c7b16a6478fbefde0da80de8828b684e assets/create/models/item/cut_andesite.json +e2840073eac2e6419cd312b3d0177d4c64a5346c assets/create/models/item/cut_andesite_bricks.json 680fe77d50f7c3253ec4997f74761f962b784e15 assets/create/models/item/cut_andesite_brick_slab.json 3c1d56f9686bb2b97c168b0509ddfd06e80be9a0 assets/create/models/item/cut_andesite_brick_stairs.json 4222b965f8a18f78b92838e4642a28fa3e0ad648 assets/create/models/item/cut_andesite_brick_wall.json -e2840073eac2e6419cd312b3d0177d4c64a5346c assets/create/models/item/cut_andesite_bricks.json c100e02ef9b05f4f6df3ddbbfe91db1032d4854b assets/create/models/item/cut_andesite_slab.json f435a67b3d89d12b6e8cb5071a67e35f0918dc79 assets/create/models/item/cut_andesite_stairs.json df9084d532a085220280bc7bee579e1079fbf786 assets/create/models/item/cut_andesite_wall.json 025eedca45b222b91d93b9a3a89fac5ad328b152 assets/create/models/item/cut_asurine.json +1ceb483f428448f00a08541fbcf4f4787aef3f1e assets/create/models/item/cut_asurine_bricks.json 022c56e7aafa7ca4cdd1a88426eb43f9e02c3cc2 assets/create/models/item/cut_asurine_brick_slab.json 3131e09a221c2f0a17cfc7277603f2e3c8164bc7 assets/create/models/item/cut_asurine_brick_stairs.json dc1f5f03acc1165606c48df97953164f6bd7f092 assets/create/models/item/cut_asurine_brick_wall.json -1ceb483f428448f00a08541fbcf4f4787aef3f1e assets/create/models/item/cut_asurine_bricks.json e81d7df1f1b8281c38400713b09cbac59c4d53cc assets/create/models/item/cut_asurine_slab.json cf534603fe71423e0ab80d431ab12394d0a6bb21 assets/create/models/item/cut_asurine_stairs.json 7ca803f5a7798ea034db6385a5f36a48e235c247 assets/create/models/item/cut_asurine_wall.json 707fb799ca44280cad0b817f29a7c75dd0f0ce5e assets/create/models/item/cut_calcite.json +5678b9f76823efac2c6624acc7b2b911402112f4 assets/create/models/item/cut_calcite_bricks.json f794423b242228c43345dc1f40653133fb7f3db6 assets/create/models/item/cut_calcite_brick_slab.json 8e9b46e52758ec7f21c3b84c212e2f6565bf71d9 assets/create/models/item/cut_calcite_brick_stairs.json 1447d21b7fc331528bfd15e5b9d694eb1a31cfb3 assets/create/models/item/cut_calcite_brick_wall.json -5678b9f76823efac2c6624acc7b2b911402112f4 assets/create/models/item/cut_calcite_bricks.json c78c99c78a19097d890414b21270014b52bafd8d assets/create/models/item/cut_calcite_slab.json e6a9144a4bb9e5af3f57d0acdb26d66dc4547217 assets/create/models/item/cut_calcite_stairs.json daf2a2513f6636d140c23b90ba87aad35476c498 assets/create/models/item/cut_calcite_wall.json 29f2bc72aa50cdf34d1d5bfd01a4512d5974dc65 assets/create/models/item/cut_crimsite.json +20bc810ca5b2a35a423e57f287e2f42ad9940b89 assets/create/models/item/cut_crimsite_bricks.json 7c37d3de9674e70595498d1c46c5693d9f39a502 assets/create/models/item/cut_crimsite_brick_slab.json b974c0f2f0e5119d9bac6a36946d4dfdd65b4b5f assets/create/models/item/cut_crimsite_brick_stairs.json c1289ddff572149b2171859689228615802dc825 assets/create/models/item/cut_crimsite_brick_wall.json -20bc810ca5b2a35a423e57f287e2f42ad9940b89 assets/create/models/item/cut_crimsite_bricks.json 8855eb44a68277668c77858715652d6851fa507f assets/create/models/item/cut_crimsite_slab.json 57101d3c2d570bc2c389c1e05e1354d79de70a0a assets/create/models/item/cut_crimsite_stairs.json a10cd65d675a05b9dfbdac67a2d9ca3b4381396a assets/create/models/item/cut_crimsite_wall.json a4ad900cf65136835c259c1e349781538d537a9c assets/create/models/item/cut_deepslate.json +81b10b5d159db4000f4f6569b83fc7e8f702f015 assets/create/models/item/cut_deepslate_bricks.json a63bbe474ca7d8ceafb6bfcb21a88841980fe8e6 assets/create/models/item/cut_deepslate_brick_slab.json 7c1ad49844eafbd87f8c69a077a8c18ccdd4a919 assets/create/models/item/cut_deepslate_brick_stairs.json 6a4ee2e810731e0702c1493237343a567cc736d6 assets/create/models/item/cut_deepslate_brick_wall.json -81b10b5d159db4000f4f6569b83fc7e8f702f015 assets/create/models/item/cut_deepslate_bricks.json ff0d08d1b59de36b016f7952d2bd72d8e1eb1293 assets/create/models/item/cut_deepslate_slab.json 627c806a6eba8b730682821deb31627d75683e88 assets/create/models/item/cut_deepslate_stairs.json 9bdb85a688b09eb34eb8024a6808406118f78133 assets/create/models/item/cut_deepslate_wall.json c33c48d71d98f4b8a84c7f0a4ee88918fed3e798 assets/create/models/item/cut_diorite.json +e8a697df63b0b5fa74dbc70e76b55718a2cc388f assets/create/models/item/cut_diorite_bricks.json 63bc297b782c40c513873b7f8fd8284abce01753 assets/create/models/item/cut_diorite_brick_slab.json f604d088c8c7c6d847795459231d0df8c73d95fb assets/create/models/item/cut_diorite_brick_stairs.json b06be3da6017aa7fbc38b8aecda0d30dae313c13 assets/create/models/item/cut_diorite_brick_wall.json -e8a697df63b0b5fa74dbc70e76b55718a2cc388f assets/create/models/item/cut_diorite_bricks.json 4650f375365caeb237947f6e933d174ebbfbc1e2 assets/create/models/item/cut_diorite_slab.json 933d14f51272b39fc13e94d58f3100469d7cbe06 assets/create/models/item/cut_diorite_stairs.json 0cc44bb9ad0ed3ff11bc6113d0a9e31e99b169b8 assets/create/models/item/cut_diorite_wall.json e2123180fd5312d1e67b3a030fcbc4b6f11aa8bf assets/create/models/item/cut_dripstone.json +4b5d7bbee5741b112e2cb354c5fe49c088fc9b2f assets/create/models/item/cut_dripstone_bricks.json a815b2a927853d6d82d8b69f862be3091c5c8caa assets/create/models/item/cut_dripstone_brick_slab.json b8cb1b04eb869a06ded04c4c3acac6e5a315ee78 assets/create/models/item/cut_dripstone_brick_stairs.json 87fafd603eb4ba41981cd9c9371ac4618909f94d assets/create/models/item/cut_dripstone_brick_wall.json -4b5d7bbee5741b112e2cb354c5fe49c088fc9b2f assets/create/models/item/cut_dripstone_bricks.json 756c801f6bba006fbfd3486e95ba870909ab2902 assets/create/models/item/cut_dripstone_slab.json c59d314e1b5cce1c3745ce164c2a094e17f7a003 assets/create/models/item/cut_dripstone_stairs.json 125b24d28a9957740855467440ad8508d21c24d7 assets/create/models/item/cut_dripstone_wall.json 2fbce0b481f7cf2cf4f0fd03c86ef743b7c30879 assets/create/models/item/cut_granite.json +d8860602cc52fac5a09354c56e78fdfd7d9cb6a9 assets/create/models/item/cut_granite_bricks.json 3584117ed8a69c3842fde1d6accfaaa2c72e44f4 assets/create/models/item/cut_granite_brick_slab.json c68d1c09b9091bc501279115be16f83508b88fed assets/create/models/item/cut_granite_brick_stairs.json 5a37b24319a8708e444902eae3596b68daaffd15 assets/create/models/item/cut_granite_brick_wall.json -d8860602cc52fac5a09354c56e78fdfd7d9cb6a9 assets/create/models/item/cut_granite_bricks.json c2f6603e8cbfc0cdf5e5ef10c6a4baef9c917b6d assets/create/models/item/cut_granite_slab.json 66f8e6d556446441e157427437e9563075e2d6ce assets/create/models/item/cut_granite_stairs.json fe06c8aeab9e4c8a145375af46cbdaed701baad4 assets/create/models/item/cut_granite_wall.json b5c3df9c28a14683a363769cad5d154af56b8da4 assets/create/models/item/cut_limestone.json +7d026353711a464400e69c7e86c9b9c6aa70bf6d assets/create/models/item/cut_limestone_bricks.json 2822ebe1d4211f240e31866759e25add5f0fb56d assets/create/models/item/cut_limestone_brick_slab.json 694dfb73585167011d8123d64f5896697594f4ce assets/create/models/item/cut_limestone_brick_stairs.json db8851d6a1b7604ca1ba7615e1f162f6f5220801 assets/create/models/item/cut_limestone_brick_wall.json -7d026353711a464400e69c7e86c9b9c6aa70bf6d assets/create/models/item/cut_limestone_bricks.json 75584aa5e06168d8866b022fcd72377351b774d9 assets/create/models/item/cut_limestone_slab.json 1df9a186a146e597b48da4c4461f1a98ecf3646a assets/create/models/item/cut_limestone_stairs.json b70ac5462ef4d0363332656aa7cb82919f679893 assets/create/models/item/cut_limestone_wall.json 92bc693db4e0ba6164cd35d4f5fa0982f3b8f796 assets/create/models/item/cut_ochrum.json +3e8e00c602b1fbce888e6fe22d9525f1c025129d assets/create/models/item/cut_ochrum_bricks.json 1edc47c279fadde74322d3fa89ef776bdd6fb354 assets/create/models/item/cut_ochrum_brick_slab.json 4678e2a97c73139b458cea657a55f74659bc36d5 assets/create/models/item/cut_ochrum_brick_stairs.json 85044ec7033cd4c6aa913c4c4bb6c0e3a4386023 assets/create/models/item/cut_ochrum_brick_wall.json -3e8e00c602b1fbce888e6fe22d9525f1c025129d assets/create/models/item/cut_ochrum_bricks.json e0e494fb7fa1767241507347318560335339a2a8 assets/create/models/item/cut_ochrum_slab.json de7c5917bcb14f398d39e3932bfe5e1967ed7a24 assets/create/models/item/cut_ochrum_stairs.json 5a8f8c84e95ee0ab97106a801a456282f5ac207c assets/create/models/item/cut_ochrum_wall.json 1631a807135cf993d9a81068c65e78face2f24e0 assets/create/models/item/cut_scorchia.json +5ecb9692e478e29d64aeb5867e8677671560755d assets/create/models/item/cut_scorchia_bricks.json ac3a29573ce099ac57f59d0a2f1cdc0a453e0621 assets/create/models/item/cut_scorchia_brick_slab.json d3a8a8e0e85aaaadccb18cdce33da54ae0e8a8d7 assets/create/models/item/cut_scorchia_brick_stairs.json 83be13f6cbd9a58e10869e4152066cf3b265f347 assets/create/models/item/cut_scorchia_brick_wall.json -5ecb9692e478e29d64aeb5867e8677671560755d assets/create/models/item/cut_scorchia_bricks.json 0fee2e7f8e80bbd33e4d928c8374e6dae65f0b1f assets/create/models/item/cut_scorchia_slab.json 88a6b3709bab76390ace6f641eac18d43c9d099f assets/create/models/item/cut_scorchia_stairs.json d733d43252bf27b6fb1d7e016dc77556c3d1eb71 assets/create/models/item/cut_scorchia_wall.json ce75fb80c38c94bf6bf631eeb756909decaaaab0 assets/create/models/item/cut_scoria.json +81aa0bd4ec878754043a107466dcd87d49b3697c assets/create/models/item/cut_scoria_bricks.json d78a5126aefdd4cd182f9ec0ddda64df00d0f01c assets/create/models/item/cut_scoria_brick_slab.json 661d49b996f9c97a333e7e39dd13a0476db6b142 assets/create/models/item/cut_scoria_brick_stairs.json 3be69c075b479ac53c6201d7d7224d399f8009b6 assets/create/models/item/cut_scoria_brick_wall.json -81aa0bd4ec878754043a107466dcd87d49b3697c assets/create/models/item/cut_scoria_bricks.json 824bedfbeec53ec8f539fe73c0a3c3d927a21aa4 assets/create/models/item/cut_scoria_slab.json 15560f1251f18d53fe1b71adc6be5060c4d8fb94 assets/create/models/item/cut_scoria_stairs.json e35ebcc4f7f7b94623af85b181d916e48fbbb5ed assets/create/models/item/cut_scoria_wall.json 71284d3d6dba230dbecd01eb015e0e65877b820d assets/create/models/item/cut_tuff.json +4de100799e290db3fd46923781a83e6a12654266 assets/create/models/item/cut_tuff_bricks.json 4c7d5fadb0b0eaecf2055a0cd279f9ec130b93d0 assets/create/models/item/cut_tuff_brick_slab.json 6f32b83c9f82424c0e2a2e0a8813eb44c2ac4527 assets/create/models/item/cut_tuff_brick_stairs.json 9088296b7677bddf16d670858a619d846a134ef6 assets/create/models/item/cut_tuff_brick_wall.json -4de100799e290db3fd46923781a83e6a12654266 assets/create/models/item/cut_tuff_bricks.json e9134027cc917e2e878456edb49bcfee382e73b1 assets/create/models/item/cut_tuff_slab.json 8235a34249197c100645b55ded5ff619a055d8a6 assets/create/models/item/cut_tuff_stairs.json a1626993eafa8d85dc950e17cbf78378ed64c7d2 assets/create/models/item/cut_tuff_wall.json a343c74f1e55426330df18f522e6d2a81276c499 assets/create/models/item/cut_veridium.json +3c3fd197f8e299ff90850e24c6507ea12f373123 assets/create/models/item/cut_veridium_bricks.json c1c5561ce31e237b7ea8f1adfb6a79e661b7f940 assets/create/models/item/cut_veridium_brick_slab.json f633006045ccfcdf486d7a240217229d6eed717e assets/create/models/item/cut_veridium_brick_stairs.json 8182109a002317dd8d2767b3828f8c44166a053f assets/create/models/item/cut_veridium_brick_wall.json -3c3fd197f8e299ff90850e24c6507ea12f373123 assets/create/models/item/cut_veridium_bricks.json 410b949304faa5856028f7c42ab762b7498ffd95 assets/create/models/item/cut_veridium_slab.json 62697c0922b11537914d2f4f84faa0b909ee518d assets/create/models/item/cut_veridium_stairs.json 3921d61a26d48d999cbb2f6645611e53ea71978b assets/create/models/item/cut_veridium_wall.json @@ -2144,12 +2144,12 @@ badd4326fac0b0a1590a2e9bce7c2cdd4e4562f3 assets/create/models/item/empty_schemat 7ec3ed4aaab72d76f6414447bbb3ad7887adf61f assets/create/models/item/encased_fan.json 3e1fdcc80fd68199b1890bcc830f78c48e7c0e43 assets/create/models/item/experience_block.json 9775e83414c0febb5c5b832437b0580e91bcbff3 assets/create/models/item/experience_nugget.json +87add851ae3271d733c9e6888865c288b6716f3b assets/create/models/item/exposed_copper_shingles.json 721c8ac46bf23abec2bbf4cff6dbfdf96cc569a6 assets/create/models/item/exposed_copper_shingle_slab.json 6e1c7fcd8da84dc2d49adb9802ce4fb431eddae1 assets/create/models/item/exposed_copper_shingle_stairs.json -87add851ae3271d733c9e6888865c288b6716f3b assets/create/models/item/exposed_copper_shingles.json +fa7ffb172a43774cc07a2bb201e7010a2549001d assets/create/models/item/exposed_copper_tiles.json a443633d90ef9ac2a866b69b2ecdfad1841dc3e1 assets/create/models/item/exposed_copper_tile_slab.json 9bb425a14635fc8b36a9a95f3d0c54e0b129b7b4 assets/create/models/item/exposed_copper_tile_stairs.json -fa7ffb172a43774cc07a2bb201e7010a2549001d assets/create/models/item/exposed_copper_tiles.json 8b64a93d9b6e33e3caa66adb7a0cc8c5cd473023 assets/create/models/item/extendo_grip.json 9114fa2e92ea4b7bf949b2e5a26290b0bade1af3 assets/create/models/item/factory_gauge.json dad31483f65baaf187e6553e3cd301c5d69e9db4 assets/create/models/item/filter.json @@ -2179,11 +2179,11 @@ b8d6d2d163e2ab5f654bbc4eda9ad63f8064d27c assets/create/models/item/gray_seat.jso 334fd81d5e6574220ee5815f1452b4f4aa7ad223 assets/create/models/item/green_table_cloth.json 561e0579101bf602b252c0b9a5eec468c89d0e40 assets/create/models/item/green_toolbox.json 7d3ddad087b4d2c6a32f97092533cbfb5de0cb3b assets/create/models/item/green_valve_handle.json -dac0331061c464e6d3e2070b232781c632840191 assets/create/models/item/hand_crank.json 9e352162c8135773a4eca41871beea8f3ca650ae assets/create/models/item/handheld_worldshaper.json +dac0331061c464e6d3e2070b232781c632840191 assets/create/models/item/hand_crank.json 7bb435c53cbf935d80a28746125aebbd6263e45c assets/create/models/item/haunted_bell.json -2e97629313eab1a4ac4b38785dbe7ed45346e625 assets/create/models/item/honey_bucket.json 81d67fb0e59f25762a412990884813c72d399d55 assets/create/models/item/honeyed_apple.json +2e97629313eab1a4ac4b38785dbe7ed45346e625 assets/create/models/item/honey_bucket.json 70185e640169d6253f06fb98f31b240f4807a53e assets/create/models/item/horizontal_framed_glass.json e623c9541adc0fa877c5615e3211f47886383f2d assets/create/models/item/horizontal_framed_glass_pane.json 58b6f4ec2af3a69ae7145fb25d73451b6e8a2834 assets/create/models/item/hose_pulley.json @@ -2224,13 +2224,13 @@ b56a28924b0b1b2530ebac7834e011700b09b966 assets/create/models/item/light_gray_po cc8834024208662cb100f7cd38a04637da3b6852 assets/create/models/item/light_gray_table_cloth.json c8513eb1c89652783e26d7dcfcf64afa97619bc8 assets/create/models/item/light_gray_toolbox.json 3774d23e76b5712e7004e333e0a770f2230c2998 assets/create/models/item/light_gray_valve_handle.json +8f53caad3899a30be5087a0ba155080834418cc0 assets/create/models/item/limestone.json +fba1e7d1cad39c89976b427db62544d80f47ad5d assets/create/models/item/limestone_pillar.json 26b8e1daf9cc4b206fb5f62904c7f1701ba93e67 assets/create/models/item/lime_postbox.json 32cd55a1c97a31a13ad106a457ec9925aa91f6d3 assets/create/models/item/lime_seat.json a0843c3731fa3c4d23bc2b91fd68410fcf1df149 assets/create/models/item/lime_table_cloth.json 931d187c11cb95a0eeae8f256187ef551b42007e assets/create/models/item/lime_toolbox.json d0f4148bdb0a905e68f54b5dfd829fd47e528fea assets/create/models/item/lime_valve_handle.json -8f53caad3899a30be5087a0ba155080834418cc0 assets/create/models/item/limestone.json -fba1e7d1cad39c89976b427db62544d80f47ad5d assets/create/models/item/limestone_pillar.json 1d30f9b525e8e9736b34a92f848e235c71fd6bd8 assets/create/models/item/linear_chassis.json 8f622f5f79446f6060d9e8815205fce919c8c829 assets/create/models/item/linked_controller.json 538e28af9013a43c258a659cbe67671991f3eee7 assets/create/models/item/magenta_postbox.json @@ -2275,15 +2275,15 @@ af50363d603d61340b336569d58c1febde253665 assets/create/models/item/ochrum.json 7e767ca9e0ddb769b38fabd9289648ac63f5413d assets/create/models/item/orange_valve_handle.json 82152bca4310111d91584a2a78f05e158bb4bd90 assets/create/models/item/ornate_iron_window.json f9064c1f199bcd8db321078e2363ed91cb2acc09 assets/create/models/item/ornate_iron_window_pane.json +09b3cd8ff7b29a6dd59f739a95bb708646d23537 assets/create/models/item/oxidized_copper_shingles.json c9c7ccdb68de2e77cd9f7053fab19493dd30a985 assets/create/models/item/oxidized_copper_shingle_slab.json 89c5f7a0a28f238ebed2641e243a47e4be2ad5ab assets/create/models/item/oxidized_copper_shingle_stairs.json -09b3cd8ff7b29a6dd59f739a95bb708646d23537 assets/create/models/item/oxidized_copper_shingles.json +1c3428e2aed32a013631db012642a34d4eaf0785 assets/create/models/item/oxidized_copper_tiles.json f1af7c5f3840efc3ae07940ee6719eb3417a0e1a assets/create/models/item/oxidized_copper_tile_slab.json ef2fe68d407a03bf1ed8f2d2f3e7323777d061bb assets/create/models/item/oxidized_copper_tile_stairs.json -1c3428e2aed32a013631db012642a34d4eaf0785 assets/create/models/item/oxidized_copper_tiles.json +b21a1f3ee7de3e17f69d27fd13ae6b23b62aa22c assets/create/models/item/packager.json 5b974e55caffdbfc2156eb8b59dd99db12243bd3 assets/create/models/item/package_filter.json 7fd76e7d2e6c6d94352f1fa08d096b63616ad01e assets/create/models/item/package_frogport.json -b21a1f3ee7de3e17f69d27fd13ae6b23b62aa22c assets/create/models/item/packager.json 76aeceb41bb7df873dbafe1bd5e26deb24abf93f assets/create/models/item/peculiar_bell.json ab6c05a0468f3f4295a07adb362fa2d36cf6e3e8 assets/create/models/item/pink_postbox.json df13d4281dc45041ecd93504d45daef61d070581 assets/create/models/item/pink_seat.json @@ -2374,15 +2374,15 @@ f982794c2e01a70fcc2bb009bcb8cd06a2ea5510 assets/create/models/item/rare_jinx_pac 7830b48ef4292922f0ef13f9a7c2ee7d47366169 assets/create/models/item/rare_simi_package.json 5f8e5283fbebb452f1a1141b33ee73f08879c75d assets/create/models/item/raw_zinc.json 4631d67976cef148c346a7016baaa6703e4f243e assets/create/models/item/raw_zinc_block.json +9dc6c52e258b00cac6ed23147983045c43218b5d assets/create/models/item/redstone_contact.json +f8f733364bdd32b2ad597e81103bc02344ce63bd assets/create/models/item/redstone_link.json +ae0ba4827a81bd51c5c01178c2ccdae3a722628a assets/create/models/item/redstone_requester.json 4b73ee9cc2651a3d1a97476d100f9c4d7e2b2efe assets/create/models/item/red_postbox.json 8d00eb1a10055a802556eab10e13f522d12acd1c assets/create/models/item/red_sand_paper.json b64a054c92cbd2e055502d470f3921d1077e63a1 assets/create/models/item/red_seat.json 359d9bdb2496140e297a1e5a98c9563bc09d56b9 assets/create/models/item/red_table_cloth.json ac4695cc465d094b4adba1a4e9efec42c916f37d assets/create/models/item/red_toolbox.json 02473f42ef4b53dc809c7c58ae657c014bfaf652 assets/create/models/item/red_valve_handle.json -9dc6c52e258b00cac6ed23147983045c43218b5d assets/create/models/item/redstone_contact.json -f8f733364bdd32b2ad597e81103bc02344ce63bd assets/create/models/item/redstone_link.json -ae0ba4827a81bd51c5c01178c2ccdae3a722628a assets/create/models/item/redstone_requester.json 9926bbe6dad7c4c1a146492116d232e941c80d2b assets/create/models/item/refined_radiance.json bf827486dc7a1b3aeae577844d2dab2a97051db9 assets/create/models/item/refined_radiance_casing.json a982c29763d90556cca03074c168462a52cb9526 assets/create/models/item/repackager.json @@ -2396,9 +2396,9 @@ d45005a89e2c0d29944e0112be274365e0e318a5 assets/create/models/item/rose_quartz_t 670e978a34faf6a3acd7880b2f94c2574178d586 assets/create/models/item/sand_paper.json 6854451e331242ec50c186a545538024b07ec123 assets/create/models/item/schedule.json 0effa517c214ba07dba2f4ed12dfcf4785e42dd8 assets/create/models/item/schematic.json +8b7727844d8c12c3c22828c7f65fc7ac2d273e36 assets/create/models/item/schematicannon.json 2a52f084fa8187dd8da28fe820dde50c47a93b57 assets/create/models/item/schematic_and_quill.json 4c8b34627001e35ee15412a0cd037d0f24ba914e assets/create/models/item/schematic_table.json -8b7727844d8c12c3c22828c7f65fc7ac2d273e36 assets/create/models/item/schematicannon.json 2955563914c2f84ed06474c135062e91189ddf3a assets/create/models/item/scorchia.json 669041e5ad29d2166cc8895f85aa262040671d3e assets/create/models/item/scorchia_pillar.json ff52eb59dadfe675e416440f3115856a501428a6 assets/create/models/item/scoria.json @@ -2409,63 +2409,63 @@ abaa6da82babc26717ffff44fc41327bd015c9a6 assets/create/models/item/shadow_steel. ffaec38d11b91add4e150e33d0e0e49394f5beca assets/create/models/item/shadow_steel_casing.json b6fcd9722e5a09a9207964cba68752512e3b945a assets/create/models/item/shaft.json 617c6e2f759b2a95da7ee7192a2661afc6f6e8f8 assets/create/models/item/shopping_list.json +58ca190177e77db90c8195347c29d52c2cd0c556 assets/create/models/item/small_andesite_bricks.json fa92996fada8545fc340fb401bd0568f56809bf0 assets/create/models/item/small_andesite_brick_slab.json 08474bf814a55795c1f94203ceb8a969be2a2132 assets/create/models/item/small_andesite_brick_stairs.json 0e00bc6aa5be242217ed6fe8cbe1ccdf180742fb assets/create/models/item/small_andesite_brick_wall.json -58ca190177e77db90c8195347c29d52c2cd0c556 assets/create/models/item/small_andesite_bricks.json +543055fabb706a93037c6a9e47c334508e41b06c assets/create/models/item/small_asurine_bricks.json b160c3277f00f19687cffb87f9cb3aa32d3633aa assets/create/models/item/small_asurine_brick_slab.json 183fa4919f06e8c3c10f1efeceefd55389a96102 assets/create/models/item/small_asurine_brick_stairs.json d6a5ffdb493fb2c8176a7e6b42e05c2d393a2782 assets/create/models/item/small_asurine_brick_wall.json -543055fabb706a93037c6a9e47c334508e41b06c assets/create/models/item/small_asurine_bricks.json +26d9361e33e362a772220146724c0927453831e0 assets/create/models/item/small_calcite_bricks.json 8c1b5d5d40393636c9ff10afc09038c89bc1b383 assets/create/models/item/small_calcite_brick_slab.json 481ce90fb6abb05c904f01df3fe635f702bbfac0 assets/create/models/item/small_calcite_brick_stairs.json 02adb90bdf06a7c4c57d09dfd3c77cceef9b7fbe assets/create/models/item/small_calcite_brick_wall.json -26d9361e33e362a772220146724c0927453831e0 assets/create/models/item/small_calcite_bricks.json +d5a033d3dedb799c4752b7e68b6881529f38f8e5 assets/create/models/item/small_crimsite_bricks.json 8f382537c99eac3335f72db8dba33ab71f99a919 assets/create/models/item/small_crimsite_brick_slab.json b5d012cf0c5c94b73e6825b6884ab1d3eee7d64e assets/create/models/item/small_crimsite_brick_stairs.json 236457bb16bc7e949c16f3f091ee74dc3f3e6973 assets/create/models/item/small_crimsite_brick_wall.json -d5a033d3dedb799c4752b7e68b6881529f38f8e5 assets/create/models/item/small_crimsite_bricks.json +6ce2cb7882f41fcbcd641a442c98767bda61f65f assets/create/models/item/small_deepslate_bricks.json ce79900b7aa1eff0d42cabcd0a7f80ef20824551 assets/create/models/item/small_deepslate_brick_slab.json a260711af72c749a6b72f72515bbecb2e01e3ed8 assets/create/models/item/small_deepslate_brick_stairs.json 4e474891c6a269166c2eb413fae78699e5657af4 assets/create/models/item/small_deepslate_brick_wall.json -6ce2cb7882f41fcbcd641a442c98767bda61f65f assets/create/models/item/small_deepslate_bricks.json +e412eaa393965ef5426c3d8d95d5c9d69e37e054 assets/create/models/item/small_diorite_bricks.json 55b82c2f30d52acee5c3807ab2ffaed1d773cfa8 assets/create/models/item/small_diorite_brick_slab.json 49a17610b5b05595894ca2683056cecd724c1111 assets/create/models/item/small_diorite_brick_stairs.json dd3630a9c5500e6cf09e95d09e7a3cc99db11899 assets/create/models/item/small_diorite_brick_wall.json -e412eaa393965ef5426c3d8d95d5c9d69e37e054 assets/create/models/item/small_diorite_bricks.json +c29d35da520d0fe828bb364db403b8cdf55f0a2e assets/create/models/item/small_dripstone_bricks.json 21e281ec7a82d48018366a0737c6867f625b4663 assets/create/models/item/small_dripstone_brick_slab.json 6862e72eedf80536f40b6ac42ff78f13f62d012f assets/create/models/item/small_dripstone_brick_stairs.json ca8613bb64ceb562c36dd1d6a3b76b5f15f35be9 assets/create/models/item/small_dripstone_brick_wall.json -c29d35da520d0fe828bb364db403b8cdf55f0a2e assets/create/models/item/small_dripstone_bricks.json +81eae95d20a9e99a070dfb8f6e6c22ef29f628d3 assets/create/models/item/small_granite_bricks.json a19aa13eb3c04a9e0931e22e4170eec80950efab assets/create/models/item/small_granite_brick_slab.json 51bc02587cad5dfcfaf9d040848faa5277a25a5f assets/create/models/item/small_granite_brick_stairs.json 147a6f42be8312fbf050ad53c1625a1458f73cc3 assets/create/models/item/small_granite_brick_wall.json -81eae95d20a9e99a070dfb8f6e6c22ef29f628d3 assets/create/models/item/small_granite_bricks.json +bfa76583bca68134bbe2793c263cc0b71e1406af assets/create/models/item/small_limestone_bricks.json a9599981e872e683dacd01b2f0af511f416dd526 assets/create/models/item/small_limestone_brick_slab.json d8f8eadea13fc90a1c8ee5aca4be71fb22a79fd0 assets/create/models/item/small_limestone_brick_stairs.json 67626afe8b0fc9135456a24ea49c602b83d6970d assets/create/models/item/small_limestone_brick_wall.json -bfa76583bca68134bbe2793c263cc0b71e1406af assets/create/models/item/small_limestone_bricks.json +2d4b22d4028c55cbabc7eb405c2c6d485390afab assets/create/models/item/small_ochrum_bricks.json f7547aacb8bdaf61424cd56565e40d3cd40a1cfa assets/create/models/item/small_ochrum_brick_slab.json 8a320ff9e75e16a182cb7d07784a595fe7876e04 assets/create/models/item/small_ochrum_brick_stairs.json 0eedd4fe5b0a82de16fed148836087ff4ae64a74 assets/create/models/item/small_ochrum_brick_wall.json -2d4b22d4028c55cbabc7eb405c2c6d485390afab assets/create/models/item/small_ochrum_bricks.json 97b8e3eaddac0b93d4b6bc140f573969fcba5823 assets/create/models/item/small_rose_quartz_tiles.json +ac1bf1d2344517c18b945afa198d5d05e2866f6b assets/create/models/item/small_scorchia_bricks.json 63ef9901ba1014027e8c873d8374d86abb73158e assets/create/models/item/small_scorchia_brick_slab.json f52601fe54695c225a595a65e9130665582db856 assets/create/models/item/small_scorchia_brick_stairs.json b4e0db087dc88e0a3a4a82197a0ce347d3c7a7aa assets/create/models/item/small_scorchia_brick_wall.json -ac1bf1d2344517c18b945afa198d5d05e2866f6b assets/create/models/item/small_scorchia_bricks.json +25b6bb40701e782ed64414ec8391b304ad5e6b12 assets/create/models/item/small_scoria_bricks.json a4bdeb066dcc44f8be058e6d9dfc0a3fd34819bf assets/create/models/item/small_scoria_brick_slab.json 5ffb0e7de917013cd82cece2506d72fce2cd5fc6 assets/create/models/item/small_scoria_brick_stairs.json 67dcbc7d52fbbe88f89b36e04f970b27024741e4 assets/create/models/item/small_scoria_brick_wall.json -25b6bb40701e782ed64414ec8391b304ad5e6b12 assets/create/models/item/small_scoria_bricks.json +90943707d8b232d816392bec8ae05e06b6eedd72 assets/create/models/item/small_tuff_bricks.json 91a144100eea8b4e67a0a4f31b35a714693fa001 assets/create/models/item/small_tuff_brick_slab.json b3f89c9f8e46fbdfc58171073d6ad91c588e5853 assets/create/models/item/small_tuff_brick_stairs.json 52c1d4cfb5f1726c9ccbb00db60bdd6f760bf40f assets/create/models/item/small_tuff_brick_wall.json -90943707d8b232d816392bec8ae05e06b6eedd72 assets/create/models/item/small_tuff_bricks.json +6935d6d9dbdb99fe7258d9347419d65571711263 assets/create/models/item/small_veridium_bricks.json 0bb60fc6ab570db83214fd10c83d931f6677e361 assets/create/models/item/small_veridium_brick_slab.json 89918d98b6830477b21ab7fb9e30807d3ca1d379 assets/create/models/item/small_veridium_brick_stairs.json ab4e7695e99548f83a89f3d5ad7690a576bafcc0 assets/create/models/item/small_veridium_brick_wall.json -6935d6d9dbdb99fe7258d9347419d65571711263 assets/create/models/item/small_veridium_bricks.json 6cf508dbd3d015ea730366db92bb17844dc2ca06 assets/create/models/item/smart_chute.json 9201f00edcf2ffa33cb079c28b5c33e39872c824 assets/create/models/item/smart_fluid_pipe.json 67804bdd890f167010f6101a700e85a3245f4cc3 assets/create/models/item/speedometer.json @@ -2476,9 +2476,9 @@ b82ab0c69df330f6f938ed1beee7b4add67d2e50 assets/create/models/item/steam_engine. 24acc593a5e910b6301afcb3f23cba526d23a0ab assets/create/models/item/steam_whistle.json 54f200be903e056e5cf9e2186f0a0a51f8f0f84e assets/create/models/item/sticker.json 0f88de164439640cc175ceef2017f7416b5a7018 assets/create/models/item/sticky_mechanical_piston.json +4b640b66765b206f8c2884b7c1a1ef860b81d841 assets/create/models/item/stockpile_switch.json c04a4ef6debb04d305d74d9b034c1e95c6b9e956 assets/create/models/item/stock_link.json 67c98c6c7f2122850acfbee34688572934fdd226 assets/create/models/item/stock_ticker.json -4b640b66765b206f8c2884b7c1a1ef860b81d841 assets/create/models/item/stockpile_switch.json 6ee792277b9fd980c40e18e841afa63fc500ed0b assets/create/models/item/stressometer.json 8d4ce1ccf180016506292f63188c10d0dabe0ee3 assets/create/models/item/sturdy_sheet.json a10bb4d6d1a4483a806e3aaa086d48c0e20aaefe assets/create/models/item/super_glue.json @@ -2505,36 +2505,36 @@ b0f6d37aa695395e28a23d36775092f63ab3f5a5 assets/create/models/item/vertical_gear 9c5087114e35052c5e56bb752252de5d092408c5 assets/create/models/item/warped_window.json 83502f4b8d0134e793611b36a56cca59af097ed5 assets/create/models/item/warped_window_pane.json e5939b47bf7440dc101c667e68ef6bf750a3290f assets/create/models/item/water_wheel.json +be2f058a7ecb015599ee052ec27c4360d636999a assets/create/models/item/waxed_copper_shingles.json adc188e4e48bea80607c6e0c7076c9bdd7236cb0 assets/create/models/item/waxed_copper_shingle_slab.json 7e224aceaa94361256e95e4c44d8814aebaf297c assets/create/models/item/waxed_copper_shingle_stairs.json -be2f058a7ecb015599ee052ec27c4360d636999a assets/create/models/item/waxed_copper_shingles.json +eced19a2f721c54b968e5979cde2705f15faf3e1 assets/create/models/item/waxed_copper_tiles.json 68b3632c34adb9991aa993385f53624632c260f2 assets/create/models/item/waxed_copper_tile_slab.json a7fc0cc2d32dcd49c3274597ce7121f01fca03f8 assets/create/models/item/waxed_copper_tile_stairs.json -eced19a2f721c54b968e5979cde2705f15faf3e1 assets/create/models/item/waxed_copper_tiles.json +5336907eba067492f6d00b4b8514f9663830a1d5 assets/create/models/item/waxed_exposed_copper_shingles.json fd428034c46a240c4bb2a1aee625b8767f41c3ef assets/create/models/item/waxed_exposed_copper_shingle_slab.json 43d714187fe6c0cd1ed7abcddef1ebcd63979ff4 assets/create/models/item/waxed_exposed_copper_shingle_stairs.json -5336907eba067492f6d00b4b8514f9663830a1d5 assets/create/models/item/waxed_exposed_copper_shingles.json +962b24b3611abefc21920d01452944710ab0da3f assets/create/models/item/waxed_exposed_copper_tiles.json 25f5a10fe8e6acbdbf8457d56aeee065835a93ec assets/create/models/item/waxed_exposed_copper_tile_slab.json 22917505d328fb5b489b9f7f9068f1514b784abb assets/create/models/item/waxed_exposed_copper_tile_stairs.json -962b24b3611abefc21920d01452944710ab0da3f assets/create/models/item/waxed_exposed_copper_tiles.json +12c3dd893bddb66b9b387652c67c8f0e24b643ff assets/create/models/item/waxed_oxidized_copper_shingles.json 9b7c82376ea8c1c8ecbc7bbe15283f84b0d50d94 assets/create/models/item/waxed_oxidized_copper_shingle_slab.json fbb6043eb935aa0641a482ee7300c780be257440 assets/create/models/item/waxed_oxidized_copper_shingle_stairs.json -12c3dd893bddb66b9b387652c67c8f0e24b643ff assets/create/models/item/waxed_oxidized_copper_shingles.json +6b8f75d4818db903b22f4626d02671ab76a61023 assets/create/models/item/waxed_oxidized_copper_tiles.json 6e7bc8eb9a87d903dcc590e9918ce8d4411bf190 assets/create/models/item/waxed_oxidized_copper_tile_slab.json 10136759b31e4d957e8374948460d6c984711326 assets/create/models/item/waxed_oxidized_copper_tile_stairs.json -6b8f75d4818db903b22f4626d02671ab76a61023 assets/create/models/item/waxed_oxidized_copper_tiles.json +ce2dcfc01205da1dc70f34091a2c24f563e72466 assets/create/models/item/waxed_weathered_copper_shingles.json 2bf249c677d30a4febf950fa7c6caa87c348c54e assets/create/models/item/waxed_weathered_copper_shingle_slab.json 9fa84f2555d82b5a1550b748a332ceb443a04fae assets/create/models/item/waxed_weathered_copper_shingle_stairs.json -ce2dcfc01205da1dc70f34091a2c24f563e72466 assets/create/models/item/waxed_weathered_copper_shingles.json +02d2ac048c9bea86d10673254dfc107f3c9c5bb5 assets/create/models/item/waxed_weathered_copper_tiles.json ab40b1a5a03cd290d53ef2ea65f90dcfcd2673de assets/create/models/item/waxed_weathered_copper_tile_slab.json dadc7b65a4527e288c21a20df978796a8c444fd2 assets/create/models/item/waxed_weathered_copper_tile_stairs.json -02d2ac048c9bea86d10673254dfc107f3c9c5bb5 assets/create/models/item/waxed_weathered_copper_tiles.json +86b8e71fa8b7aeb73eafda89d8d06d83da6a5d25 assets/create/models/item/weathered_copper_shingles.json 94db30ad2381d2f2c37cdfd0d5ce5c45a2807640 assets/create/models/item/weathered_copper_shingle_slab.json 7262c01df4b5a8cd8c6a5545062f251d5ad9fd06 assets/create/models/item/weathered_copper_shingle_stairs.json -86b8e71fa8b7aeb73eafda89d8d06d83da6a5d25 assets/create/models/item/weathered_copper_shingles.json +99f17b16b68201aefb78298b3e6c657e3c2235e0 assets/create/models/item/weathered_copper_tiles.json 0b1b299d6dfab65b6060305a8b3e51f6e2df09f4 assets/create/models/item/weathered_copper_tile_slab.json 0c3989b44fde934ba8b88b071887e5ede522c417 assets/create/models/item/weathered_copper_tile_stairs.json -99f17b16b68201aefb78298b3e6c657e3c2235e0 assets/create/models/item/weathered_copper_tiles.json b5d591fbb40e062efe301b3b3b49580e5ad64566 assets/create/models/item/weathered_iron_block.json a569ddd725898a86f8745e46723edeff7fe7f2e9 assets/create/models/item/weathered_iron_window.json a262cbdf9aa0c240f623dcadd42864d280d36978 assets/create/models/item/weathered_iron_window_pane.json @@ -2573,42 +2573,42 @@ b25b8c230fde8d6d77e8d516bed52236652b5ca6 data/create/advancements/recipes/buildi 537fe5dffa659e5838379587fbd84f2f641551ea data/create/advancements/recipes/building_blocks/calcite_pillar_from_stone_types_calcite_stonecutting.json 2636ac059b6412a46402cccbe5abe4fb49143662 data/create/advancements/recipes/building_blocks/cherry_window.json 3e08f575543f1e0abea979dbaee643572734788b data/create/advancements/recipes/building_blocks/cherry_window_pane.json +09f332cd34e6a92af9e8e4e757418c7ba8b536da data/create/advancements/recipes/building_blocks/copper_shingles_from_ingots_copper_stonecutting.json 55214a0fd27318b17163cace66c7525785127ef8 data/create/advancements/recipes/building_blocks/copper_shingle_slab.json fb4210dbbfb74459e10da94a540f3bfdf91c4a8d data/create/advancements/recipes/building_blocks/copper_shingle_slab_from_copper_shingles_stonecutting.json 31b04ac1b117fb65f5129c5bbb48e42c1c4c1003 data/create/advancements/recipes/building_blocks/copper_shingle_stairs.json bef4a9a4c2e722d4f086d6b4c9d6fa1d0836ec10 data/create/advancements/recipes/building_blocks/copper_shingle_stairs_from_copper_shingles_stonecutting.json -09f332cd34e6a92af9e8e4e757418c7ba8b536da data/create/advancements/recipes/building_blocks/copper_shingles_from_ingots_copper_stonecutting.json +f66a48f01afb4fa1babee4a8c28b032280c3ac9e data/create/advancements/recipes/building_blocks/copper_tiles_from_ingots_copper_stonecutting.json ef79744ebf31453d1c81789afed7b717837b3515 data/create/advancements/recipes/building_blocks/copper_tile_slab.json 8e9997c43b1c06521fe8d38b04ccb3f04c93d537 data/create/advancements/recipes/building_blocks/copper_tile_slab_from_copper_tiles_stonecutting.json a2609aa8b5453f2294f38c81d26e0b8dad71087d data/create/advancements/recipes/building_blocks/copper_tile_stairs.json d47e46c66bf69e8310e6687716858842e8aed7b5 data/create/advancements/recipes/building_blocks/copper_tile_stairs_from_copper_tiles_stonecutting.json -f66a48f01afb4fa1babee4a8c28b032280c3ac9e data/create/advancements/recipes/building_blocks/copper_tiles_from_ingots_copper_stonecutting.json cc14d10c75ab0fdd7c54db1922e5e56667739fef data/create/advancements/recipes/building_blocks/copycat_panel_from_ingots_zinc_stonecutting.json 55d2812be912c857ff666d581174378857d3bce2 data/create/advancements/recipes/building_blocks/copycat_step_from_ingots_zinc_stonecutting.json +8615fc107b1f4df86711081a9dccac8631b02e6b data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_shingles_from_honeycomb.json 0e0eba8550768ef69087dff8112814f25233fab7 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_shingle_slab_from_honeycomb.json 2c960d55273df4c0c8c33b2c329175b35b18fc8c data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_shingle_stairs_from_honeycomb.json -8615fc107b1f4df86711081a9dccac8631b02e6b data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_shingles_from_honeycomb.json +fa8f3ed9a4c6f0c3cd4c21b0ae4dc8ca4dba8678 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_tiles_from_honeycomb.json d6f2aa7fd10c96f71c47bdabb3e53dc4c4e73706 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_tile_slab_from_honeycomb.json eca165eee20adba1557ccc74ef50ee90311b3019 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_tile_stairs_from_honeycomb.json -fa8f3ed9a4c6f0c3cd4c21b0ae4dc8ca4dba8678 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_tiles_from_honeycomb.json +88a236933e8dfe0d809bda098d16782288c4800c data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_shingles_from_honeycomb.json 301149dabc4dce290b4884f4ed3cb2132123adf0 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_shingle_slab_from_honeycomb.json f360dce7bece72672f2624710c88edbe3e3f8885 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_shingle_stairs_from_honeycomb.json -88a236933e8dfe0d809bda098d16782288c4800c data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_shingles_from_honeycomb.json +bc27959288766492746f41c4810350dcef1b320d data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_tiles_from_honeycomb.json 7ceb4b74ff84ed404518b6cb5e1432dac5903b5f data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_tile_slab_from_honeycomb.json ec1eec3bc25534484cb264134e62b578525422aa data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_tile_stairs_from_honeycomb.json -bc27959288766492746f41c4810350dcef1b320d data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_tiles_from_honeycomb.json +2e8f1da032110e8c5ec375ffd425e5eed7f58cae data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_shingles_from_honeycomb.json e34abb4d51c1d00419fc3d3799ca0d9fe7ea1027 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_shingle_slab_from_honeycomb.json 9471e190beb603f022fb234f2cf35b5b4b93f0c0 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_shingle_stairs_from_honeycomb.json -2e8f1da032110e8c5ec375ffd425e5eed7f58cae data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_shingles_from_honeycomb.json +17fe14b753953a68887cd001fcaa264ef031463f data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_tiles_from_honeycomb.json 2577754364f05264fac325f67597230d01fa0c1d data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_tile_slab_from_honeycomb.json 003e384d9594a4e6ef5678e74f04b56de047dbde data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_tile_stairs_from_honeycomb.json -17fe14b753953a68887cd001fcaa264ef031463f data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_tiles_from_honeycomb.json +5009a82a897a15407fec785005107b0d228fffe7 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_shingles_from_honeycomb.json 70ce32937dcf349dce77fef8022bc0c15863f6a6 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_shingle_slab_from_honeycomb.json 1fc498238dcc2705152573ba7f74bb50e7e66ca7 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_shingle_stairs_from_honeycomb.json -5009a82a897a15407fec785005107b0d228fffe7 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_shingles_from_honeycomb.json +d12aa3dd5457327224fd007211878eec21043971 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_tiles_from_honeycomb.json 6f461d7036de914c636b7916dc798775ccf25be1 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_tile_slab_from_honeycomb.json 3bc9efcddecd23fd06c6056a0ee7b937959cecc0 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_tile_stairs_from_honeycomb.json -d12aa3dd5457327224fd007211878eec21043971 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_tiles_from_honeycomb.json 3064c52dea808a00c211bfedb96106b563f480da data/create/advancements/recipes/building_blocks/crafting/kinetics/black_seat.json f07a0b21db200ab68a7df02db519869f68953286 data/create/advancements/recipes/building_blocks/crafting/kinetics/black_seat_from_other_seat.json 80ac4db5c53c7efc2666a7abb4e2e876c5f86588 data/create/advancements/recipes/building_blocks/crafting/kinetics/blue_seat.json @@ -2709,6 +2709,7 @@ f3188b24f8108be4219016689a4768f826b4fef3 data/create/advancements/recipes/buildi e88373b83226d860b0c2131213f5d3b09f31ab96 data/create/advancements/recipes/building_blocks/crimsite_pillar_from_stone_types_crimsite_stonecutting.json 09f7122cf360fd56bde2b1659bbed526f9a119c4 data/create/advancements/recipes/building_blocks/crimson_window.json b5234c6050bc0c6fe872a5ddc87d46ba39e07971 data/create/advancements/recipes/building_blocks/crimson_window_pane.json +b32f4345517c3c7299a06489325bd85f987145dc data/create/advancements/recipes/building_blocks/cut_andesite_bricks_from_stone_types_andesite_stonecutting.json 22fe2e61d7e9836d9f71c39bfbba50efc2fa184d data/create/advancements/recipes/building_blocks/cut_andesite_brick_slab.json 6d8d28364f1016dfd1d7cbe4a2637e2b6224e4d8 data/create/advancements/recipes/building_blocks/cut_andesite_brick_slab_from_stone_types_andesite_stonecutting.json 39e904f66d2194de5437b5da2f8db8b6f03d78f4 data/create/advancements/recipes/building_blocks/cut_andesite_brick_slab_recycling.json @@ -2716,7 +2717,6 @@ b5234c6050bc0c6fe872a5ddc87d46ba39e07971 data/create/advancements/recipes/buildi 480c696956b99c96cbaf46e7dad9711c40680ec8 data/create/advancements/recipes/building_blocks/cut_andesite_brick_stairs_from_stone_types_andesite_stonecutting.json 8d504cdb99f5dc59bef5ff35d0b443f2f4ba21d2 data/create/advancements/recipes/building_blocks/cut_andesite_brick_wall.json e1b8e5906d54368c98867b83143dc7acc7b0aa28 data/create/advancements/recipes/building_blocks/cut_andesite_brick_wall_from_stone_types_andesite_stonecutting.json -b32f4345517c3c7299a06489325bd85f987145dc data/create/advancements/recipes/building_blocks/cut_andesite_bricks_from_stone_types_andesite_stonecutting.json d5b44158f9a98d874d941fc4df99de7a2657af21 data/create/advancements/recipes/building_blocks/cut_andesite_from_stone_types_andesite_stonecutting.json c11998f554bbd42efdbdf58cf8efe5bcf69230de data/create/advancements/recipes/building_blocks/cut_andesite_slab.json 1f457c0e816e4dd70e1a960015d2004814d11926 data/create/advancements/recipes/building_blocks/cut_andesite_slab_from_stone_types_andesite_stonecutting.json @@ -2725,6 +2725,7 @@ a4d7adf49472a2069bad72defd39b111b83def3d data/create/advancements/recipes/buildi 6d38bb2b9812761c594ebdf717284ba8d32e88bc data/create/advancements/recipes/building_blocks/cut_andesite_stairs_from_stone_types_andesite_stonecutting.json 2f6b2296b11e0e743d68749e65af5ffa0f374998 data/create/advancements/recipes/building_blocks/cut_andesite_wall.json caf3b1c62d0f8df3ce126535f0566c899577bedb data/create/advancements/recipes/building_blocks/cut_andesite_wall_from_stone_types_andesite_stonecutting.json +54188623046e989d21e6e155933e4084fb2882c4 data/create/advancements/recipes/building_blocks/cut_asurine_bricks_from_stone_types_asurine_stonecutting.json 536a2bed2ed1e7e249886ef376c96a8d5a1facdc data/create/advancements/recipes/building_blocks/cut_asurine_brick_slab.json a4e833cadfbb82222a70d66524e804c83ea13f7b data/create/advancements/recipes/building_blocks/cut_asurine_brick_slab_from_stone_types_asurine_stonecutting.json 610163ac2f4b06121931a81ac4b3df39ece61998 data/create/advancements/recipes/building_blocks/cut_asurine_brick_slab_recycling.json @@ -2732,7 +2733,6 @@ a4e833cadfbb82222a70d66524e804c83ea13f7b data/create/advancements/recipes/buildi f92f31e80cc026160217afb6c757987f75ed0b33 data/create/advancements/recipes/building_blocks/cut_asurine_brick_stairs_from_stone_types_asurine_stonecutting.json fa6dc7eaa32652a00a7217ae25967de0791088b6 data/create/advancements/recipes/building_blocks/cut_asurine_brick_wall.json 33f361369bfd92f53b3e40c837b336edd04a26e9 data/create/advancements/recipes/building_blocks/cut_asurine_brick_wall_from_stone_types_asurine_stonecutting.json -54188623046e989d21e6e155933e4084fb2882c4 data/create/advancements/recipes/building_blocks/cut_asurine_bricks_from_stone_types_asurine_stonecutting.json a6b871faa10badaaaa1a0ebbba94c4f2f627c43f data/create/advancements/recipes/building_blocks/cut_asurine_from_stone_types_asurine_stonecutting.json 719e1d4fea3457f2990be6a5d6cd87915d546217 data/create/advancements/recipes/building_blocks/cut_asurine_slab.json 586918291dda711c79941cf484cb62dbb853a271 data/create/advancements/recipes/building_blocks/cut_asurine_slab_from_stone_types_asurine_stonecutting.json @@ -2741,6 +2741,7 @@ bd2a630d242ae9c89b071b0401285068071a346c data/create/advancements/recipes/buildi 03d7b1609d161043e28661d74f53b06d4408f561 data/create/advancements/recipes/building_blocks/cut_asurine_stairs_from_stone_types_asurine_stonecutting.json cba4a6feaf695e665204cac36f9109ba941b12a6 data/create/advancements/recipes/building_blocks/cut_asurine_wall.json 3327651dd3f2fd778abdcfe70d25137d916f3def data/create/advancements/recipes/building_blocks/cut_asurine_wall_from_stone_types_asurine_stonecutting.json +44873f9d05abde7d52a6eacdf3573d8b69c69452 data/create/advancements/recipes/building_blocks/cut_calcite_bricks_from_stone_types_calcite_stonecutting.json a070ffe63c182b33c4c6faedb391f51a209c0e27 data/create/advancements/recipes/building_blocks/cut_calcite_brick_slab.json 7ba1e7add81422599f798153e4fd069e9fbfdebf data/create/advancements/recipes/building_blocks/cut_calcite_brick_slab_from_stone_types_calcite_stonecutting.json f5e80ec393c306485d666d6f9f91c55d9f1ba592 data/create/advancements/recipes/building_blocks/cut_calcite_brick_slab_recycling.json @@ -2748,7 +2749,6 @@ f5e80ec393c306485d666d6f9f91c55d9f1ba592 data/create/advancements/recipes/buildi 627f85aa63133cf95dd828092e0232b9ec8acfd5 data/create/advancements/recipes/building_blocks/cut_calcite_brick_stairs_from_stone_types_calcite_stonecutting.json d8870e522a68274cc90eab07ea17b7b6cdc5a16c data/create/advancements/recipes/building_blocks/cut_calcite_brick_wall.json cdf5927f3c1b3ef8904f38f66317412799e189fb data/create/advancements/recipes/building_blocks/cut_calcite_brick_wall_from_stone_types_calcite_stonecutting.json -44873f9d05abde7d52a6eacdf3573d8b69c69452 data/create/advancements/recipes/building_blocks/cut_calcite_bricks_from_stone_types_calcite_stonecutting.json 9f8c31b0db2aab8f1c8f42bcef15a74bc36887d4 data/create/advancements/recipes/building_blocks/cut_calcite_from_stone_types_calcite_stonecutting.json 857666ad1c6a5cc886f6896a18f560098afaa67b data/create/advancements/recipes/building_blocks/cut_calcite_slab.json c55074cd091b0e078105abdc940c62afa8984265 data/create/advancements/recipes/building_blocks/cut_calcite_slab_from_stone_types_calcite_stonecutting.json @@ -2757,6 +2757,7 @@ c55074cd091b0e078105abdc940c62afa8984265 data/create/advancements/recipes/buildi ba3378e1d08de2af0b2a725727cf9f68bda60044 data/create/advancements/recipes/building_blocks/cut_calcite_stairs_from_stone_types_calcite_stonecutting.json db5f4e1eee91c2a65d36164c20aba0e9d3a502ae data/create/advancements/recipes/building_blocks/cut_calcite_wall.json 19de370083d2cf1234c9c4e6ff45d85ef34a1ac8 data/create/advancements/recipes/building_blocks/cut_calcite_wall_from_stone_types_calcite_stonecutting.json +b9a2edda241f6e0677a2003300f0be5d3ff8f4b0 data/create/advancements/recipes/building_blocks/cut_crimsite_bricks_from_stone_types_crimsite_stonecutting.json 9fda0e6edde197a9c28a854419a2a07e323b6b53 data/create/advancements/recipes/building_blocks/cut_crimsite_brick_slab.json 2da3f139759be7eea552885b2063a0e2dfc647b1 data/create/advancements/recipes/building_blocks/cut_crimsite_brick_slab_from_stone_types_crimsite_stonecutting.json 62d928c8ab2e09a3f87adacb5adb1a5ddc1d2a7b data/create/advancements/recipes/building_blocks/cut_crimsite_brick_slab_recycling.json @@ -2764,7 +2765,6 @@ db5f4e1eee91c2a65d36164c20aba0e9d3a502ae data/create/advancements/recipes/buildi 89850244feb8a3293ba96702b7a56a4bea84e1f3 data/create/advancements/recipes/building_blocks/cut_crimsite_brick_stairs_from_stone_types_crimsite_stonecutting.json 267cab789c73d474299542fb0719967501fcf0c9 data/create/advancements/recipes/building_blocks/cut_crimsite_brick_wall.json 27007676b86eb8a3498982d8b5e68495b84d62d5 data/create/advancements/recipes/building_blocks/cut_crimsite_brick_wall_from_stone_types_crimsite_stonecutting.json -b9a2edda241f6e0677a2003300f0be5d3ff8f4b0 data/create/advancements/recipes/building_blocks/cut_crimsite_bricks_from_stone_types_crimsite_stonecutting.json a88d252d4e634ff194daa3ff98fd7e965e3ed09a data/create/advancements/recipes/building_blocks/cut_crimsite_from_stone_types_crimsite_stonecutting.json f703136e1783a42252bc1d89c31e5563cbdff583 data/create/advancements/recipes/building_blocks/cut_crimsite_slab.json 3330d332462da22de48d07b62277c1df8e646a3e data/create/advancements/recipes/building_blocks/cut_crimsite_slab_from_stone_types_crimsite_stonecutting.json @@ -2773,6 +2773,7 @@ c2707e5969f0c554537dda9d3e2a4c13e19863c3 data/create/advancements/recipes/buildi e9ba513178090b020525e72468a0450e225da779 data/create/advancements/recipes/building_blocks/cut_crimsite_stairs_from_stone_types_crimsite_stonecutting.json 7fb5ce65b7b5c2d76b4306d407aaa6eefe07b7e5 data/create/advancements/recipes/building_blocks/cut_crimsite_wall.json a83d5b669f92bd833af2768d2cf5d4797a86b63c data/create/advancements/recipes/building_blocks/cut_crimsite_wall_from_stone_types_crimsite_stonecutting.json +bc9eb21df37df4b69e5d202b3b770698a16f4413 data/create/advancements/recipes/building_blocks/cut_deepslate_bricks_from_stone_types_deepslate_stonecutting.json 2c380e8ddc83cef4213f136ff7a196d861728914 data/create/advancements/recipes/building_blocks/cut_deepslate_brick_slab.json 87b5dfc1e61fabe4e7661bea0d7a56cb75197a81 data/create/advancements/recipes/building_blocks/cut_deepslate_brick_slab_from_stone_types_deepslate_stonecutting.json 09cde6df1120cc5f5f129023885f323b4d1eeae9 data/create/advancements/recipes/building_blocks/cut_deepslate_brick_slab_recycling.json @@ -2780,7 +2781,6 @@ a83d5b669f92bd833af2768d2cf5d4797a86b63c data/create/advancements/recipes/buildi 28e15fe2c377540cb631f6648f49090f234e7704 data/create/advancements/recipes/building_blocks/cut_deepslate_brick_stairs_from_stone_types_deepslate_stonecutting.json d2b34f455ab0053f24a4f9dec7dcce45832ef25b data/create/advancements/recipes/building_blocks/cut_deepslate_brick_wall.json 7b174b65b813b4a9ca507e71fa142931e074f336 data/create/advancements/recipes/building_blocks/cut_deepslate_brick_wall_from_stone_types_deepslate_stonecutting.json -bc9eb21df37df4b69e5d202b3b770698a16f4413 data/create/advancements/recipes/building_blocks/cut_deepslate_bricks_from_stone_types_deepslate_stonecutting.json 83db3f5b46c996481b930974bddba75c82c115af data/create/advancements/recipes/building_blocks/cut_deepslate_from_stone_types_deepslate_stonecutting.json 8e8816aad8212c3557e77cc01df551fe1a0a306d data/create/advancements/recipes/building_blocks/cut_deepslate_slab.json 14ea447072200733dd9551a5ac6a9544593dd9f7 data/create/advancements/recipes/building_blocks/cut_deepslate_slab_from_stone_types_deepslate_stonecutting.json @@ -2789,6 +2789,7 @@ c7870abb459c8b174c380282ae211a87ab252521 data/create/advancements/recipes/buildi 4f157401a3019c96cc6ae5a0036f31351c651fbb data/create/advancements/recipes/building_blocks/cut_deepslate_stairs_from_stone_types_deepslate_stonecutting.json 9ae9635fa129aab54a7ec971b9cc61d300d3d53e data/create/advancements/recipes/building_blocks/cut_deepslate_wall.json 9b5df53000c79a7b20e3a1888e003b704809feda data/create/advancements/recipes/building_blocks/cut_deepslate_wall_from_stone_types_deepslate_stonecutting.json +fdef99789ca74623b00b05be2f975b63831645db data/create/advancements/recipes/building_blocks/cut_diorite_bricks_from_stone_types_diorite_stonecutting.json 30a00465dc9b19d8024146e2c2d6b9f41562da30 data/create/advancements/recipes/building_blocks/cut_diorite_brick_slab.json a55e7daf48a487d74b4a01e30b80968094154d2b data/create/advancements/recipes/building_blocks/cut_diorite_brick_slab_from_stone_types_diorite_stonecutting.json e445a3d8fd00f5e4f2ee56c797d8abf548598447 data/create/advancements/recipes/building_blocks/cut_diorite_brick_slab_recycling.json @@ -2796,7 +2797,6 @@ b421f24513612dd7a5d8977d7bff122fd5cf9522 data/create/advancements/recipes/buildi 3fe00adac35beeda79b7f9d930a1f13b033c0f12 data/create/advancements/recipes/building_blocks/cut_diorite_brick_stairs_from_stone_types_diorite_stonecutting.json 6d2235b8587863107a6d1a0818c81ee3dc217cdf data/create/advancements/recipes/building_blocks/cut_diorite_brick_wall.json 0ec4b69e98adf961f5d4d63700f11ad66a4116b5 data/create/advancements/recipes/building_blocks/cut_diorite_brick_wall_from_stone_types_diorite_stonecutting.json -fdef99789ca74623b00b05be2f975b63831645db data/create/advancements/recipes/building_blocks/cut_diorite_bricks_from_stone_types_diorite_stonecutting.json c9f52e0661fdc266f8429faf1570124fecfa2d6a data/create/advancements/recipes/building_blocks/cut_diorite_from_stone_types_diorite_stonecutting.json c7b73ddec6402e8b5ff5daedbbbc74f882338a8e data/create/advancements/recipes/building_blocks/cut_diorite_slab.json 46c841e5aae99106cbc28026dcfec946976127e5 data/create/advancements/recipes/building_blocks/cut_diorite_slab_from_stone_types_diorite_stonecutting.json @@ -2805,6 +2805,7 @@ ce67a5fae622955ad795e2b3d14c159a4c47b936 data/create/advancements/recipes/buildi 3b7ec28df80ea9cf87980b2c2184858ba6152a3f data/create/advancements/recipes/building_blocks/cut_diorite_stairs_from_stone_types_diorite_stonecutting.json c8fe9ab53eda2cdbff08678ebb577c169ea61a91 data/create/advancements/recipes/building_blocks/cut_diorite_wall.json 050f67b5a662bea3ef972521ef7f81c2ba99015c data/create/advancements/recipes/building_blocks/cut_diorite_wall_from_stone_types_diorite_stonecutting.json +b60683fdd629b201f40a6f9bb6594df7c5ac13f1 data/create/advancements/recipes/building_blocks/cut_dripstone_bricks_from_stone_types_dripstone_stonecutting.json 1e0d39ed56e2ab4eac084f26a1c6de905db29220 data/create/advancements/recipes/building_blocks/cut_dripstone_brick_slab.json 020cbc4c8063d186d3f5c9ece429e4cdff53cf63 data/create/advancements/recipes/building_blocks/cut_dripstone_brick_slab_from_stone_types_dripstone_stonecutting.json b44c9e7f9f62ffffb5566901e0a22010ba76641c data/create/advancements/recipes/building_blocks/cut_dripstone_brick_slab_recycling.json @@ -2812,7 +2813,6 @@ b44c9e7f9f62ffffb5566901e0a22010ba76641c data/create/advancements/recipes/buildi 466fbdf7de8dacd1032fb7af690862bb68707876 data/create/advancements/recipes/building_blocks/cut_dripstone_brick_stairs_from_stone_types_dripstone_stonecutting.json 253b54c191c933e88fa6a9b4e7c94340082c7d60 data/create/advancements/recipes/building_blocks/cut_dripstone_brick_wall.json e176568e3de8b8ca17a788f4cea89002b5ad2d1d data/create/advancements/recipes/building_blocks/cut_dripstone_brick_wall_from_stone_types_dripstone_stonecutting.json -b60683fdd629b201f40a6f9bb6594df7c5ac13f1 data/create/advancements/recipes/building_blocks/cut_dripstone_bricks_from_stone_types_dripstone_stonecutting.json ddc5a16cf0d2790d8133ab6801f4c55317d776e4 data/create/advancements/recipes/building_blocks/cut_dripstone_from_stone_types_dripstone_stonecutting.json 6e40c9af0747a8b3adb805ddd8fbb947aedb408c data/create/advancements/recipes/building_blocks/cut_dripstone_slab.json e7761f71f797d2e62dc0860cbd5153955b9be86c data/create/advancements/recipes/building_blocks/cut_dripstone_slab_from_stone_types_dripstone_stonecutting.json @@ -2821,6 +2821,7 @@ a199a9f78a44f4313a922b317893c68f743dc1a9 data/create/advancements/recipes/buildi b68a95a565ee9a3aec017431aa5b8cc6fffec3ef data/create/advancements/recipes/building_blocks/cut_dripstone_stairs_from_stone_types_dripstone_stonecutting.json a4287f34f95c008bdf7c0a886d05c3960665147b data/create/advancements/recipes/building_blocks/cut_dripstone_wall.json 76f5d4a6a9895064b15ae0c0f27a138bb3d57dbf data/create/advancements/recipes/building_blocks/cut_dripstone_wall_from_stone_types_dripstone_stonecutting.json +24cc01d592faf2bad57fc9b9a1de52c50d225446 data/create/advancements/recipes/building_blocks/cut_granite_bricks_from_stone_types_granite_stonecutting.json 83148f66dc7418740b6f9b6a660b0b9306d87f7c data/create/advancements/recipes/building_blocks/cut_granite_brick_slab.json d982802fc11848c87022f7bf05cecf090953002a data/create/advancements/recipes/building_blocks/cut_granite_brick_slab_from_stone_types_granite_stonecutting.json 6b8fa161725a4e2106226c3591a23def74398f48 data/create/advancements/recipes/building_blocks/cut_granite_brick_slab_recycling.json @@ -2828,7 +2829,6 @@ ce1c81b730b3acef9673f41769339f7d68385348 data/create/advancements/recipes/buildi e9732e3beaefbc6a457e0c4fd61f17f429f1cd8c data/create/advancements/recipes/building_blocks/cut_granite_brick_stairs_from_stone_types_granite_stonecutting.json 4f403aee2aae6aa0fc334b434cf5ade362153329 data/create/advancements/recipes/building_blocks/cut_granite_brick_wall.json 625c8849b5c07835b49dcb4322ec44586628a700 data/create/advancements/recipes/building_blocks/cut_granite_brick_wall_from_stone_types_granite_stonecutting.json -24cc01d592faf2bad57fc9b9a1de52c50d225446 data/create/advancements/recipes/building_blocks/cut_granite_bricks_from_stone_types_granite_stonecutting.json 07e6f3835c3683f007fd25140d671b668706484d data/create/advancements/recipes/building_blocks/cut_granite_from_stone_types_granite_stonecutting.json 2f33b7f82e977eb3fd0e0283313b1066eadadd18 data/create/advancements/recipes/building_blocks/cut_granite_slab.json a1b406ca98c2ba7d5225afea8463d586fc538428 data/create/advancements/recipes/building_blocks/cut_granite_slab_from_stone_types_granite_stonecutting.json @@ -2837,6 +2837,7 @@ af12a2d8f8bb2382f55135df8cfec00692a65fe3 data/create/advancements/recipes/buildi 284087e07acd28aa869d5433375e412f083108e9 data/create/advancements/recipes/building_blocks/cut_granite_stairs_from_stone_types_granite_stonecutting.json dbfb50c3d5048b1f5d8d74f39c389ecec81392d7 data/create/advancements/recipes/building_blocks/cut_granite_wall.json 6b287be7a900dbd715290b069a89ab226d6cec9c data/create/advancements/recipes/building_blocks/cut_granite_wall_from_stone_types_granite_stonecutting.json +4ef0a018dcf0b470061a4b1dbadc27684d8d467f data/create/advancements/recipes/building_blocks/cut_limestone_bricks_from_stone_types_limestone_stonecutting.json b0ade7dab7eb095f07882e4c19884162f18e704c data/create/advancements/recipes/building_blocks/cut_limestone_brick_slab.json 4fc2dc61d62a394cebc91e36745699eeaee650e7 data/create/advancements/recipes/building_blocks/cut_limestone_brick_slab_from_stone_types_limestone_stonecutting.json b8ec42f06ce9eb696643154d16150a223bd5ec65 data/create/advancements/recipes/building_blocks/cut_limestone_brick_slab_recycling.json @@ -2844,7 +2845,6 @@ d0b19c27309cd45d08a6a0cd779f1930bc2e7469 data/create/advancements/recipes/buildi 9f65617405592d587a940ff7513fcb34ca6ab423 data/create/advancements/recipes/building_blocks/cut_limestone_brick_stairs_from_stone_types_limestone_stonecutting.json 281e2ddcb58b603dea8f305ed6c8ddea98d0d030 data/create/advancements/recipes/building_blocks/cut_limestone_brick_wall.json 7b0ab5095a7d2b3e876a8c8b990161851c1c58c2 data/create/advancements/recipes/building_blocks/cut_limestone_brick_wall_from_stone_types_limestone_stonecutting.json -4ef0a018dcf0b470061a4b1dbadc27684d8d467f data/create/advancements/recipes/building_blocks/cut_limestone_bricks_from_stone_types_limestone_stonecutting.json f8663a45d71c52a3982c75bbfb61653c8d2fd668 data/create/advancements/recipes/building_blocks/cut_limestone_from_stone_types_limestone_stonecutting.json 9e22972cd4f2d673cfcf07a597f6a14402c91913 data/create/advancements/recipes/building_blocks/cut_limestone_slab.json 388a57bb88582eda9fef904a530f72b066d24e7d data/create/advancements/recipes/building_blocks/cut_limestone_slab_from_stone_types_limestone_stonecutting.json @@ -2853,6 +2853,7 @@ f8663a45d71c52a3982c75bbfb61653c8d2fd668 data/create/advancements/recipes/buildi b6dc46dca3fc039fd0fe53ab791731cb085c3b62 data/create/advancements/recipes/building_blocks/cut_limestone_stairs_from_stone_types_limestone_stonecutting.json a9382d5f876542bf4fa8aed605352daca4ad2f6f data/create/advancements/recipes/building_blocks/cut_limestone_wall.json 69d9116786c53cb3155bed4580d4b01bfe638243 data/create/advancements/recipes/building_blocks/cut_limestone_wall_from_stone_types_limestone_stonecutting.json +1f8ee1a91937295484d5c2fe0186a617589c1761 data/create/advancements/recipes/building_blocks/cut_ochrum_bricks_from_stone_types_ochrum_stonecutting.json a51d6ebed8e21e8808ccfbe9f9540291504da59a data/create/advancements/recipes/building_blocks/cut_ochrum_brick_slab.json eb08f00651259f83f6eced0f90dd8df0e9d0d508 data/create/advancements/recipes/building_blocks/cut_ochrum_brick_slab_from_stone_types_ochrum_stonecutting.json a189e0549723cefbd19a147274cd79909dca2b70 data/create/advancements/recipes/building_blocks/cut_ochrum_brick_slab_recycling.json @@ -2860,7 +2861,6 @@ a5dc9e74ad0d18d83bad3aab8c5e2768355a2370 data/create/advancements/recipes/buildi 27a5331727199b8b8f2dd6c581e25d17d12fc1ba data/create/advancements/recipes/building_blocks/cut_ochrum_brick_stairs_from_stone_types_ochrum_stonecutting.json 648e532441c664310047c5c9c78833d2eaea5920 data/create/advancements/recipes/building_blocks/cut_ochrum_brick_wall.json 053256b7b154ba5c10d2483d86658f132296e8f5 data/create/advancements/recipes/building_blocks/cut_ochrum_brick_wall_from_stone_types_ochrum_stonecutting.json -1f8ee1a91937295484d5c2fe0186a617589c1761 data/create/advancements/recipes/building_blocks/cut_ochrum_bricks_from_stone_types_ochrum_stonecutting.json 6abb6e36229685ca26ee31b5db3074a07453435e data/create/advancements/recipes/building_blocks/cut_ochrum_from_stone_types_ochrum_stonecutting.json 0c5e92fb20048fe5d9dcd42e10fd0f9b155c385a data/create/advancements/recipes/building_blocks/cut_ochrum_slab.json 941aba0ff7967d7ea56e1f811aa6bc34d4711796 data/create/advancements/recipes/building_blocks/cut_ochrum_slab_from_stone_types_ochrum_stonecutting.json @@ -2869,6 +2869,7 @@ fa14009e4de8cfdacdbb7679473ce359f2cb85be data/create/advancements/recipes/buildi d50accd7f37bfd9384790bdd727401757f6dc7e4 data/create/advancements/recipes/building_blocks/cut_ochrum_stairs_from_stone_types_ochrum_stonecutting.json ed0a72f6393c0d16240b89241f5bbac7dc003516 data/create/advancements/recipes/building_blocks/cut_ochrum_wall.json cda838f95015b0bf02fc5427e1a69ed6302b7e20 data/create/advancements/recipes/building_blocks/cut_ochrum_wall_from_stone_types_ochrum_stonecutting.json +a51cd5a82d9b30c8a68f7cdf8dd7a6b2f883c27c data/create/advancements/recipes/building_blocks/cut_scorchia_bricks_from_stone_types_scorchia_stonecutting.json ce33e5a98a83dae1f37ad4b3d4ea148de5bcacdf data/create/advancements/recipes/building_blocks/cut_scorchia_brick_slab.json 498825e9e5502a7ec8a1f23bfe998b960d7fc9eb data/create/advancements/recipes/building_blocks/cut_scorchia_brick_slab_from_stone_types_scorchia_stonecutting.json 8ffa08b1b4e4ab37dfbf09d2ec4a37f93c9503cb data/create/advancements/recipes/building_blocks/cut_scorchia_brick_slab_recycling.json @@ -2876,7 +2877,6 @@ ce33e5a98a83dae1f37ad4b3d4ea148de5bcacdf data/create/advancements/recipes/buildi 3c4b45560f446534821da63d4e713088928e5f4a data/create/advancements/recipes/building_blocks/cut_scorchia_brick_stairs_from_stone_types_scorchia_stonecutting.json 2aba76185175fff82898a7a905d3ec4ff448deaa data/create/advancements/recipes/building_blocks/cut_scorchia_brick_wall.json ca1f54af4425df994c6707f00e43b8db3ce66280 data/create/advancements/recipes/building_blocks/cut_scorchia_brick_wall_from_stone_types_scorchia_stonecutting.json -a51cd5a82d9b30c8a68f7cdf8dd7a6b2f883c27c data/create/advancements/recipes/building_blocks/cut_scorchia_bricks_from_stone_types_scorchia_stonecutting.json df847f312960866d3d53f48297ea3169c27314eb data/create/advancements/recipes/building_blocks/cut_scorchia_from_stone_types_scorchia_stonecutting.json 8095f7be8aac4f11d618549680d537bed8a921c5 data/create/advancements/recipes/building_blocks/cut_scorchia_slab.json a53831cf7f095fa4d0d92051bd0e21f912c2d9dd data/create/advancements/recipes/building_blocks/cut_scorchia_slab_from_stone_types_scorchia_stonecutting.json @@ -2885,6 +2885,7 @@ a53831cf7f095fa4d0d92051bd0e21f912c2d9dd data/create/advancements/recipes/buildi 30f1efaa46771dd22d7f3aa34f24c69bbdb59bd5 data/create/advancements/recipes/building_blocks/cut_scorchia_stairs_from_stone_types_scorchia_stonecutting.json e02d188d64b270682fa9d335a3423880d8358a0d data/create/advancements/recipes/building_blocks/cut_scorchia_wall.json 834c5a2a8d089822fa81a75b290818db276beab7 data/create/advancements/recipes/building_blocks/cut_scorchia_wall_from_stone_types_scorchia_stonecutting.json +2030ec21c96336bd4c4040857f40ec65d1a75075 data/create/advancements/recipes/building_blocks/cut_scoria_bricks_from_stone_types_scoria_stonecutting.json 705dfcd9f4b6b8a0c360436c097cb371c27cf60d data/create/advancements/recipes/building_blocks/cut_scoria_brick_slab.json 482cf1bbb65a4facc0ebf31ea91bab4d03580635 data/create/advancements/recipes/building_blocks/cut_scoria_brick_slab_from_stone_types_scoria_stonecutting.json 51d070acfc8ad4cd8ca4457ca346458c81eaade4 data/create/advancements/recipes/building_blocks/cut_scoria_brick_slab_recycling.json @@ -2892,7 +2893,6 @@ e02d188d64b270682fa9d335a3423880d8358a0d data/create/advancements/recipes/buildi 99ca117e6a4ad242d92566a2f398c28edb3b7061 data/create/advancements/recipes/building_blocks/cut_scoria_brick_stairs_from_stone_types_scoria_stonecutting.json 01e294976d8ce71b59fb14a47e2686bdce4fab21 data/create/advancements/recipes/building_blocks/cut_scoria_brick_wall.json 0c1d31d37a17d4bd752508022ddd9690bb92a521 data/create/advancements/recipes/building_blocks/cut_scoria_brick_wall_from_stone_types_scoria_stonecutting.json -2030ec21c96336bd4c4040857f40ec65d1a75075 data/create/advancements/recipes/building_blocks/cut_scoria_bricks_from_stone_types_scoria_stonecutting.json 41f420c88dbf61d3cb51966cca9b495d10c604d3 data/create/advancements/recipes/building_blocks/cut_scoria_from_stone_types_scoria_stonecutting.json 26c8447854e29243f0697236f59e258fa96ed369 data/create/advancements/recipes/building_blocks/cut_scoria_slab.json f3e2522664de4ff2ad92a89443e064ac857b7aef data/create/advancements/recipes/building_blocks/cut_scoria_slab_from_stone_types_scoria_stonecutting.json @@ -2901,6 +2901,7 @@ a0635452fd698415e8112e9e0f6d71571901ca34 data/create/advancements/recipes/buildi 1bb047298b71a57e8632607af7b17bab2690aecb data/create/advancements/recipes/building_blocks/cut_scoria_stairs_from_stone_types_scoria_stonecutting.json a33878fe778438a746a28c1fd03ca6d01092ebe4 data/create/advancements/recipes/building_blocks/cut_scoria_wall.json 74a637d0d0f360ad692661c0213c18a06a8ec500 data/create/advancements/recipes/building_blocks/cut_scoria_wall_from_stone_types_scoria_stonecutting.json +f0870d596d9ac9e5b5272fb4e3d2c90c29f3a63d data/create/advancements/recipes/building_blocks/cut_tuff_bricks_from_stone_types_tuff_stonecutting.json b75410afdb8775b2a834ded315913e0ae38e4df8 data/create/advancements/recipes/building_blocks/cut_tuff_brick_slab.json 34c2aead2f2355a8f0f9f9aa7dba58dd5187dbba data/create/advancements/recipes/building_blocks/cut_tuff_brick_slab_from_stone_types_tuff_stonecutting.json c071c43e93cc1735bebbbf320f1b8d2cba4be1e3 data/create/advancements/recipes/building_blocks/cut_tuff_brick_slab_recycling.json @@ -2908,7 +2909,6 @@ c89ec2300425688f9e72e45c64def0b09c0219b0 data/create/advancements/recipes/buildi c882f72f5a31bc92a8186834b105a2e07d864366 data/create/advancements/recipes/building_blocks/cut_tuff_brick_stairs_from_stone_types_tuff_stonecutting.json 70295775a6170a1332f5604aaf75a026630c9e93 data/create/advancements/recipes/building_blocks/cut_tuff_brick_wall.json 1b79d0e71dae77967c1554c203e68eeb51fe8054 data/create/advancements/recipes/building_blocks/cut_tuff_brick_wall_from_stone_types_tuff_stonecutting.json -f0870d596d9ac9e5b5272fb4e3d2c90c29f3a63d data/create/advancements/recipes/building_blocks/cut_tuff_bricks_from_stone_types_tuff_stonecutting.json 549d1f911c009a3cafff4edcb37116c92c2b8e21 data/create/advancements/recipes/building_blocks/cut_tuff_from_stone_types_tuff_stonecutting.json 5bc3e40a8e50a521ebd5fa58efa3ec21064163f7 data/create/advancements/recipes/building_blocks/cut_tuff_slab.json f1ab5be6cb7287517d87b173680ddf833a1dd534 data/create/advancements/recipes/building_blocks/cut_tuff_slab_from_stone_types_tuff_stonecutting.json @@ -2917,6 +2917,7 @@ b7d19085017530f0c2122511c35dbef6a50b337f data/create/advancements/recipes/buildi 3c9541b6e4eb8ff7f7b627a75e8c38ed9eeaf342 data/create/advancements/recipes/building_blocks/cut_tuff_stairs_from_stone_types_tuff_stonecutting.json 51ca798b8bd822ddbbfe8f07073eefb948b97b42 data/create/advancements/recipes/building_blocks/cut_tuff_wall.json 1aa1a0d00c19069f0c55e698b474115d7f437355 data/create/advancements/recipes/building_blocks/cut_tuff_wall_from_stone_types_tuff_stonecutting.json +6a80920618d8e9b7919c83c419e751971440d38a data/create/advancements/recipes/building_blocks/cut_veridium_bricks_from_stone_types_veridium_stonecutting.json e263f555c3a47c83187d29ae9b816edc0c1a763b data/create/advancements/recipes/building_blocks/cut_veridium_brick_slab.json f0e84bde804e52f504cd93bee5058a89f6939dc9 data/create/advancements/recipes/building_blocks/cut_veridium_brick_slab_from_stone_types_veridium_stonecutting.json 949fe819c76fd63edfd93bef5898119c8456fda3 data/create/advancements/recipes/building_blocks/cut_veridium_brick_slab_recycling.json @@ -2924,7 +2925,6 @@ fc87560dedbc951d10d9650a6f27192e7c3a1cc5 data/create/advancements/recipes/buildi 35b09d6300ff8e86f01bc0258fca5cfa80d55c61 data/create/advancements/recipes/building_blocks/cut_veridium_brick_stairs_from_stone_types_veridium_stonecutting.json 599d9ce510531c6006a4964bb4049a850a8457ee data/create/advancements/recipes/building_blocks/cut_veridium_brick_wall.json aaaad7a65a1c05071565ca91a181ff3c375e0141 data/create/advancements/recipes/building_blocks/cut_veridium_brick_wall_from_stone_types_veridium_stonecutting.json -6a80920618d8e9b7919c83c419e751971440d38a data/create/advancements/recipes/building_blocks/cut_veridium_bricks_from_stone_types_veridium_stonecutting.json c76ae7944646e8f13ea460ba6655b95b6c2798ea data/create/advancements/recipes/building_blocks/cut_veridium_from_stone_types_veridium_stonecutting.json 3bafa8873b62cb0333b44af77f2c6e824c5b3e95 data/create/advancements/recipes/building_blocks/cut_veridium_slab.json 143f64b0e5536693262f6a62c2a6fbf85bd4203e data/create/advancements/recipes/building_blocks/cut_veridium_slab_from_stone_types_veridium_stonecutting.json @@ -3110,6 +3110,7 @@ c4c087911453bd979e028d3b3558b273e3cb5926 data/create/advancements/recipes/buildi 780bb3d13fcd8abf6e166b04566b141e023ee11e data/create/advancements/recipes/building_blocks/scorchia_pillar_from_stone_types_scorchia_stonecutting.json 5c5c5080c1136c046caee2d14dd2c3c9f09abad3 data/create/advancements/recipes/building_blocks/scoria_from_stone_types_scoria_stonecutting.json 5a6b12869ffcbd1d9b4fbe1fee444fcde95d2953 data/create/advancements/recipes/building_blocks/scoria_pillar_from_stone_types_scoria_stonecutting.json +a51ca3151c517113338720edeac0e02a46ebb03a data/create/advancements/recipes/building_blocks/small_andesite_bricks_from_stone_types_andesite_stonecutting.json f72093994236a0580c6cafd08fb42f061733de01 data/create/advancements/recipes/building_blocks/small_andesite_brick_slab.json 05092201e6c514d3eae566fb1ce98ad415660112 data/create/advancements/recipes/building_blocks/small_andesite_brick_slab_from_stone_types_andesite_stonecutting.json 0e41d75b613a0ebd0c023669dcfd34f11b14fd0e data/create/advancements/recipes/building_blocks/small_andesite_brick_slab_recycling.json @@ -3117,7 +3118,7 @@ f72093994236a0580c6cafd08fb42f061733de01 data/create/advancements/recipes/buildi 8bbf898cbc47ac7a326c0d082a92a452b6915a7e data/create/advancements/recipes/building_blocks/small_andesite_brick_stairs_from_stone_types_andesite_stonecutting.json 9e0685dd668550c67812d1caccd8c8cae9f2041c data/create/advancements/recipes/building_blocks/small_andesite_brick_wall.json 7a1bfa848f950482f82d7fe7a9cf3cf916f91702 data/create/advancements/recipes/building_blocks/small_andesite_brick_wall_from_stone_types_andesite_stonecutting.json -a51ca3151c517113338720edeac0e02a46ebb03a data/create/advancements/recipes/building_blocks/small_andesite_bricks_from_stone_types_andesite_stonecutting.json +0bfa788d0038077a88678ff16104a8b82038b3da data/create/advancements/recipes/building_blocks/small_asurine_bricks_from_stone_types_asurine_stonecutting.json 3dccee988c08e1988886d9f09f2b5b42332ac083 data/create/advancements/recipes/building_blocks/small_asurine_brick_slab.json 438469fb06dff95a0ab9e0cb183795432d9b78dd data/create/advancements/recipes/building_blocks/small_asurine_brick_slab_from_stone_types_asurine_stonecutting.json 3eb65706d975e6f1e429f43d7384272a58872f10 data/create/advancements/recipes/building_blocks/small_asurine_brick_slab_recycling.json @@ -3125,7 +3126,7 @@ fb8cab1a3ecef97eaf7d744bb0d1d09d46859b60 data/create/advancements/recipes/buildi 525fff52f5dea3178356b7c5f7606d2a369b346e data/create/advancements/recipes/building_blocks/small_asurine_brick_stairs_from_stone_types_asurine_stonecutting.json 39df7ef2b88df45ba4a06bfa9cd7f863f813cb30 data/create/advancements/recipes/building_blocks/small_asurine_brick_wall.json 21aa9dc72b12eb0a33cdc9904ee595de802b55f4 data/create/advancements/recipes/building_blocks/small_asurine_brick_wall_from_stone_types_asurine_stonecutting.json -0bfa788d0038077a88678ff16104a8b82038b3da data/create/advancements/recipes/building_blocks/small_asurine_bricks_from_stone_types_asurine_stonecutting.json +46666ef8d341971cdd989f14575973777a85cdc6 data/create/advancements/recipes/building_blocks/small_calcite_bricks_from_stone_types_calcite_stonecutting.json d61fce64a295a2c3b9433bc27ac50f4f1f6a678d data/create/advancements/recipes/building_blocks/small_calcite_brick_slab.json 7f2e73d01b9bff473c4ecf76ab967b3aa934ff87 data/create/advancements/recipes/building_blocks/small_calcite_brick_slab_from_stone_types_calcite_stonecutting.json 1095487af055116acc2eba87d92dd0918385e9ac data/create/advancements/recipes/building_blocks/small_calcite_brick_slab_recycling.json @@ -3133,7 +3134,7 @@ d61fce64a295a2c3b9433bc27ac50f4f1f6a678d data/create/advancements/recipes/buildi e3bd0900dc92b26fe69c7f4e81db76678505222b data/create/advancements/recipes/building_blocks/small_calcite_brick_stairs_from_stone_types_calcite_stonecutting.json c88fb3af07c32aa127cbe0043075f50fed869839 data/create/advancements/recipes/building_blocks/small_calcite_brick_wall.json ea58b78e177134c73ed5bfb081761f90cc7caa3e data/create/advancements/recipes/building_blocks/small_calcite_brick_wall_from_stone_types_calcite_stonecutting.json -46666ef8d341971cdd989f14575973777a85cdc6 data/create/advancements/recipes/building_blocks/small_calcite_bricks_from_stone_types_calcite_stonecutting.json +c48216f26cfe93ce99f7f2f0e9f68d1ee2a95e46 data/create/advancements/recipes/building_blocks/small_crimsite_bricks_from_stone_types_crimsite_stonecutting.json ed4d6e7779749dd647f744f0486e78b93057aa33 data/create/advancements/recipes/building_blocks/small_crimsite_brick_slab.json 7f3ad6d79eb9d433d5a0e295eb2b099a5f815876 data/create/advancements/recipes/building_blocks/small_crimsite_brick_slab_from_stone_types_crimsite_stonecutting.json b980fcc4b29f9ff897dd867222fc4248d76e808a data/create/advancements/recipes/building_blocks/small_crimsite_brick_slab_recycling.json @@ -3141,7 +3142,7 @@ b980fcc4b29f9ff897dd867222fc4248d76e808a data/create/advancements/recipes/buildi c06600eda4e4bd7c46e4e315a0569fbdfa4bb087 data/create/advancements/recipes/building_blocks/small_crimsite_brick_stairs_from_stone_types_crimsite_stonecutting.json 4021a4a761b06def09f19d6a60bc0722e69ec08d data/create/advancements/recipes/building_blocks/small_crimsite_brick_wall.json 2d8eae517a914e93538307efe23d532582d487e2 data/create/advancements/recipes/building_blocks/small_crimsite_brick_wall_from_stone_types_crimsite_stonecutting.json -c48216f26cfe93ce99f7f2f0e9f68d1ee2a95e46 data/create/advancements/recipes/building_blocks/small_crimsite_bricks_from_stone_types_crimsite_stonecutting.json +ed82f0fac452147faa997af1d45278f501ef165b data/create/advancements/recipes/building_blocks/small_deepslate_bricks_from_stone_types_deepslate_stonecutting.json e4674821cc17adadecacc55d48c028847caf5fea data/create/advancements/recipes/building_blocks/small_deepslate_brick_slab.json 8c0c51d052b110fec3668618be2bdeaf8d0c7cc5 data/create/advancements/recipes/building_blocks/small_deepslate_brick_slab_from_stone_types_deepslate_stonecutting.json f8f7ace802b6c73fabfabbaae1c1383a3c0bcf6b data/create/advancements/recipes/building_blocks/small_deepslate_brick_slab_recycling.json @@ -3149,7 +3150,7 @@ e2e16c3c0e761ef44f9b21ae3bd95300a33459be data/create/advancements/recipes/buildi 37ef4192f1db7dd5c066a47480f86f60687c9894 data/create/advancements/recipes/building_blocks/small_deepslate_brick_stairs_from_stone_types_deepslate_stonecutting.json 6f4d365ce26fb4081a5af0f6e21631209b5b106d data/create/advancements/recipes/building_blocks/small_deepslate_brick_wall.json e0c7377c55dc94b8efd62cb6f57325c94206cbf4 data/create/advancements/recipes/building_blocks/small_deepslate_brick_wall_from_stone_types_deepslate_stonecutting.json -ed82f0fac452147faa997af1d45278f501ef165b data/create/advancements/recipes/building_blocks/small_deepslate_bricks_from_stone_types_deepslate_stonecutting.json +9bb23924495112ba177d12ba2a5adcb872a2b76f data/create/advancements/recipes/building_blocks/small_diorite_bricks_from_stone_types_diorite_stonecutting.json d4b96bcd8902e9bce19603abb99cb7edeb260189 data/create/advancements/recipes/building_blocks/small_diorite_brick_slab.json 2ed3800996491c9a1db23d9cbed04cc5ee963df6 data/create/advancements/recipes/building_blocks/small_diorite_brick_slab_from_stone_types_diorite_stonecutting.json 895d2158ba0783c5fd97b802ef5866d7532df6ba data/create/advancements/recipes/building_blocks/small_diorite_brick_slab_recycling.json @@ -3157,7 +3158,7 @@ d4b96bcd8902e9bce19603abb99cb7edeb260189 data/create/advancements/recipes/buildi 0f4b92965c05ddf71fa24b2b08a0cce358ac8dd1 data/create/advancements/recipes/building_blocks/small_diorite_brick_stairs_from_stone_types_diorite_stonecutting.json 633d921515fb4ad0e3177f3c8f151da80008053b data/create/advancements/recipes/building_blocks/small_diorite_brick_wall.json 3dea60492331bcd3253d90534559cc0bdb0822ae data/create/advancements/recipes/building_blocks/small_diorite_brick_wall_from_stone_types_diorite_stonecutting.json -9bb23924495112ba177d12ba2a5adcb872a2b76f data/create/advancements/recipes/building_blocks/small_diorite_bricks_from_stone_types_diorite_stonecutting.json +632ced3760d55b56d1620e447b8b762e0e4a29f3 data/create/advancements/recipes/building_blocks/small_dripstone_bricks_from_stone_types_dripstone_stonecutting.json 92bb21a400d9720a2f06882049d5b3863a93969d data/create/advancements/recipes/building_blocks/small_dripstone_brick_slab.json 02e2b98eeef9cdc20a8678beec4c7aa8a6cde948 data/create/advancements/recipes/building_blocks/small_dripstone_brick_slab_from_stone_types_dripstone_stonecutting.json 35830242bc48b1355830d6cb17dc4dc547d51bc0 data/create/advancements/recipes/building_blocks/small_dripstone_brick_slab_recycling.json @@ -3165,7 +3166,7 @@ d4b96bcd8902e9bce19603abb99cb7edeb260189 data/create/advancements/recipes/buildi 92523f3058a580743f95e9347fa97e0f5f6483f6 data/create/advancements/recipes/building_blocks/small_dripstone_brick_stairs_from_stone_types_dripstone_stonecutting.json 6e26ab4ad96225b7dd1a4aa06295b0d85e87400b data/create/advancements/recipes/building_blocks/small_dripstone_brick_wall.json e30a5f31d6478dfe7693077727b1abfc40b33f9b data/create/advancements/recipes/building_blocks/small_dripstone_brick_wall_from_stone_types_dripstone_stonecutting.json -632ced3760d55b56d1620e447b8b762e0e4a29f3 data/create/advancements/recipes/building_blocks/small_dripstone_bricks_from_stone_types_dripstone_stonecutting.json +1805b7f9db21b4530b173ab6945584e7d852b218 data/create/advancements/recipes/building_blocks/small_granite_bricks_from_stone_types_granite_stonecutting.json a2929bbd4c81b9601aeca74110936343102b7b5a data/create/advancements/recipes/building_blocks/small_granite_brick_slab.json 0fa83c337d5612e2b8368d5bff34117e0c1cf40a data/create/advancements/recipes/building_blocks/small_granite_brick_slab_from_stone_types_granite_stonecutting.json 0bc47cb22cc70a34879092a57c87551e6fa9f634 data/create/advancements/recipes/building_blocks/small_granite_brick_slab_recycling.json @@ -3173,7 +3174,7 @@ a2929bbd4c81b9601aeca74110936343102b7b5a data/create/advancements/recipes/buildi 44f3e71a4e8b78db74a21a42c3cebfbc15fe0180 data/create/advancements/recipes/building_blocks/small_granite_brick_stairs_from_stone_types_granite_stonecutting.json 3a6edafcb559e767caf421cf1bd6e064940f33e2 data/create/advancements/recipes/building_blocks/small_granite_brick_wall.json cac9914c729c0ecf5e9e1b4fe6498005e7c532f3 data/create/advancements/recipes/building_blocks/small_granite_brick_wall_from_stone_types_granite_stonecutting.json -1805b7f9db21b4530b173ab6945584e7d852b218 data/create/advancements/recipes/building_blocks/small_granite_bricks_from_stone_types_granite_stonecutting.json +1ca86b11356749caf7515fc61b8ac5de53d019f6 data/create/advancements/recipes/building_blocks/small_limestone_bricks_from_stone_types_limestone_stonecutting.json 4f3cc93f422ee9f05587b89d6729a6cc86f572c0 data/create/advancements/recipes/building_blocks/small_limestone_brick_slab.json 02d0c45cd014fd660a9d3eb1c1c6b40ba806b2fb data/create/advancements/recipes/building_blocks/small_limestone_brick_slab_from_stone_types_limestone_stonecutting.json 8fb46bce94f6cca943e4ae427c04d9617ada277d data/create/advancements/recipes/building_blocks/small_limestone_brick_slab_recycling.json @@ -3181,7 +3182,7 @@ cac9914c729c0ecf5e9e1b4fe6498005e7c532f3 data/create/advancements/recipes/buildi 00b61a4d23f8b16a7e4d9bf46fbe52c6b5dd561c data/create/advancements/recipes/building_blocks/small_limestone_brick_stairs_from_stone_types_limestone_stonecutting.json 7c6b80f174687efe10007c0235f2a68db7062b12 data/create/advancements/recipes/building_blocks/small_limestone_brick_wall.json 7f9ade635dcda8d5baae2bbdddc018bcc715f681 data/create/advancements/recipes/building_blocks/small_limestone_brick_wall_from_stone_types_limestone_stonecutting.json -1ca86b11356749caf7515fc61b8ac5de53d019f6 data/create/advancements/recipes/building_blocks/small_limestone_bricks_from_stone_types_limestone_stonecutting.json +bab018a0adcbc0582ba756158941a87923b20384 data/create/advancements/recipes/building_blocks/small_ochrum_bricks_from_stone_types_ochrum_stonecutting.json 9c98b7b56f92f6adc75473f5b0ae4dc69ac8aa9a data/create/advancements/recipes/building_blocks/small_ochrum_brick_slab.json 611fb57772f1446236256f1235751dec6f81cd0e data/create/advancements/recipes/building_blocks/small_ochrum_brick_slab_from_stone_types_ochrum_stonecutting.json 243821a2c3e465f5346ad58e0afda624c09ab946 data/create/advancements/recipes/building_blocks/small_ochrum_brick_slab_recycling.json @@ -3189,8 +3190,8 @@ b9a16792e6158a2923454c9a44d9c176c9607c24 data/create/advancements/recipes/buildi bb91a8ba1ef1c8cb725f18a4d577bb476b9ae68d data/create/advancements/recipes/building_blocks/small_ochrum_brick_stairs_from_stone_types_ochrum_stonecutting.json 5cf5574da0b29895960fa7f0fd63d3f81814f7b3 data/create/advancements/recipes/building_blocks/small_ochrum_brick_wall.json 1b5d14c921a85a3a5cdb9f845d4f0ddf98f87347 data/create/advancements/recipes/building_blocks/small_ochrum_brick_wall_from_stone_types_ochrum_stonecutting.json -bab018a0adcbc0582ba756158941a87923b20384 data/create/advancements/recipes/building_blocks/small_ochrum_bricks_from_stone_types_ochrum_stonecutting.json 8d6ccacf1af917094b1688ed70dc75bf54611e93 data/create/advancements/recipes/building_blocks/small_rose_quartz_tiles_from_polished_rose_quartz_stonecutting.json +7d679c66588f8a717619a7f89861d57ec04f04a1 data/create/advancements/recipes/building_blocks/small_scorchia_bricks_from_stone_types_scorchia_stonecutting.json 2003f1248faaeb4fe6761febda8e29d087f99dc7 data/create/advancements/recipes/building_blocks/small_scorchia_brick_slab.json ff5c50697aefe21c1570230a13255c912744b629 data/create/advancements/recipes/building_blocks/small_scorchia_brick_slab_from_stone_types_scorchia_stonecutting.json 8d1fd41b03940add231fa207d3ddaa1f78cf2b85 data/create/advancements/recipes/building_blocks/small_scorchia_brick_slab_recycling.json @@ -3198,7 +3199,7 @@ ff5c50697aefe21c1570230a13255c912744b629 data/create/advancements/recipes/buildi 8586f387cc9bb74250369373348005f6aa686af2 data/create/advancements/recipes/building_blocks/small_scorchia_brick_stairs_from_stone_types_scorchia_stonecutting.json 94552be031c17f5ef9d97cf5fe33beb15141291f data/create/advancements/recipes/building_blocks/small_scorchia_brick_wall.json 86e866f92095b03b5d77a91425e5e2ef307f4852 data/create/advancements/recipes/building_blocks/small_scorchia_brick_wall_from_stone_types_scorchia_stonecutting.json -7d679c66588f8a717619a7f89861d57ec04f04a1 data/create/advancements/recipes/building_blocks/small_scorchia_bricks_from_stone_types_scorchia_stonecutting.json +e542cd94f84a90530332608b1040e2e6189a51fe data/create/advancements/recipes/building_blocks/small_scoria_bricks_from_stone_types_scoria_stonecutting.json ad4c35afd6c3d55b356e38289c64e8cf6d194d10 data/create/advancements/recipes/building_blocks/small_scoria_brick_slab.json 2f1acca02bb5a40bf174ceeb5272ba1243b8635c data/create/advancements/recipes/building_blocks/small_scoria_brick_slab_from_stone_types_scoria_stonecutting.json dba264e073eab7b2fb1494cb117574b6a6b83919 data/create/advancements/recipes/building_blocks/small_scoria_brick_slab_recycling.json @@ -3206,7 +3207,7 @@ dba264e073eab7b2fb1494cb117574b6a6b83919 data/create/advancements/recipes/buildi 0e64e1dc80a0b84e05260191951ed930a8e578f6 data/create/advancements/recipes/building_blocks/small_scoria_brick_stairs_from_stone_types_scoria_stonecutting.json 95b866fac218affb9aac93272f5436e30dd4678c data/create/advancements/recipes/building_blocks/small_scoria_brick_wall.json 23493359766c969d2fa64575c5af047e6a924373 data/create/advancements/recipes/building_blocks/small_scoria_brick_wall_from_stone_types_scoria_stonecutting.json -e542cd94f84a90530332608b1040e2e6189a51fe data/create/advancements/recipes/building_blocks/small_scoria_bricks_from_stone_types_scoria_stonecutting.json +b7fc4fbd0d6ce28946b5cbef40d86de3ca37f695 data/create/advancements/recipes/building_blocks/small_tuff_bricks_from_stone_types_tuff_stonecutting.json 03acb1becaa3c7f6fc0ced99e6afcf4ac0ec4cb2 data/create/advancements/recipes/building_blocks/small_tuff_brick_slab.json 599693bc47bfd65cc9e3babc0a2f33c0d2bbfd31 data/create/advancements/recipes/building_blocks/small_tuff_brick_slab_from_stone_types_tuff_stonecutting.json aae2cb75ee4b9312e79dfea519c35f5e20ed4da6 data/create/advancements/recipes/building_blocks/small_tuff_brick_slab_recycling.json @@ -3214,7 +3215,7 @@ c72364e32b82f45f17491dd41967373c35d8dfb5 data/create/advancements/recipes/buildi 369763433d6af43d94392e870b3d861f739ba0f9 data/create/advancements/recipes/building_blocks/small_tuff_brick_stairs_from_stone_types_tuff_stonecutting.json 506bbae420bff66d492214c49dabf52e5cbcf6e4 data/create/advancements/recipes/building_blocks/small_tuff_brick_wall.json 6db7e4b981ec28c776988a531c03dbe28fb0a1c2 data/create/advancements/recipes/building_blocks/small_tuff_brick_wall_from_stone_types_tuff_stonecutting.json -b7fc4fbd0d6ce28946b5cbef40d86de3ca37f695 data/create/advancements/recipes/building_blocks/small_tuff_bricks_from_stone_types_tuff_stonecutting.json +9fd6e20a4555b591b17ef225316782de333780fa data/create/advancements/recipes/building_blocks/small_veridium_bricks_from_stone_types_veridium_stonecutting.json b61a773f683c415617a408fa0781e7e7d61cb1af data/create/advancements/recipes/building_blocks/small_veridium_brick_slab.json 526a5323263292bd091c03231a156e18460c34a1 data/create/advancements/recipes/building_blocks/small_veridium_brick_slab_from_stone_types_veridium_stonecutting.json ef040b7189b17cce9dd69c47af61c7abca6f43cd data/create/advancements/recipes/building_blocks/small_veridium_brick_slab_recycling.json @@ -3222,7 +3223,6 @@ ef040b7189b17cce9dd69c47af61c7abca6f43cd data/create/advancements/recipes/buildi 6a12b73815434a544881680cb071f273a75f62a5 data/create/advancements/recipes/building_blocks/small_veridium_brick_stairs_from_stone_types_veridium_stonecutting.json e6dfacd8f2f57d4df42927783750254f7163251a data/create/advancements/recipes/building_blocks/small_veridium_brick_wall.json ee4012cc014539be113ace8f80e51c85d2daead9 data/create/advancements/recipes/building_blocks/small_veridium_brick_wall_from_stone_types_veridium_stonecutting.json -9fd6e20a4555b591b17ef225316782de333780fa data/create/advancements/recipes/building_blocks/small_veridium_bricks_from_stone_types_veridium_stonecutting.json 03a87030672d40b0b2b6ad085103c9a5cef067ce data/create/advancements/recipes/building_blocks/spruce_window.json dfea65f25ebcbe0caf2694dec3d3ea616e2e9291 data/create/advancements/recipes/building_blocks/spruce_window_pane.json 763b3b49296a284f41cbccdc7f1ffb13c89d42db data/create/advancements/recipes/building_blocks/tiled_glass_from_glass_colorless_stonecutting.json @@ -3376,13 +3376,13 @@ fa0856e11351ad0882de2066569807e782071881 data/create/loot_tables/blocks/copper_b 0937b9f634b86dbe41e07eda52c69993fce60fb5 data/create/loot_tables/blocks/copper_door.json 8ed70d812f38adfa147db07a4f2bbe206a69ad20 data/create/loot_tables/blocks/copper_ladder.json ac621731ca23e6fbb1003be59edacdf837dbc37e data/create/loot_tables/blocks/copper_scaffolding.json +9be387731859ccc3aec7701c1804ddc3c5dde216 data/create/loot_tables/blocks/copper_shingles.json be31f0c68bfe80dff88959bd30ef9a9080dd3b3b data/create/loot_tables/blocks/copper_shingle_slab.json 83ae2652a2df217730d6fb34a65c3962e82a961d data/create/loot_tables/blocks/copper_shingle_stairs.json -9be387731859ccc3aec7701c1804ddc3c5dde216 data/create/loot_tables/blocks/copper_shingles.json f6a29868a011d9ad73bc29be94ec2a07a2626323 data/create/loot_tables/blocks/copper_table_cloth.json +9cb359c96543d7421250c4ef4e83a5e170974efb data/create/loot_tables/blocks/copper_tiles.json adbe83d6bf88dd7d2b0b8788bb619cedd37f59d9 data/create/loot_tables/blocks/copper_tile_slab.json 1e06f16b1fa8e78af5cbfc90ba8ff1136de83d2d data/create/loot_tables/blocks/copper_tile_stairs.json -9cb359c96543d7421250c4ef4e83a5e170974efb data/create/loot_tables/blocks/copper_tiles.json 4f75cad20e6b091d1f07cf3db98520d2dc3af5e7 data/create/loot_tables/blocks/copper_valve_handle.json 14a493a7bad6bd399b662da470b71810bd56e812 data/create/loot_tables/blocks/copycat_bars.json 3a2f3ab0834a0c5089ba0a11f5e9784ce59ef6d8 data/create/loot_tables/blocks/copycat_base.json @@ -3398,114 +3398,114 @@ d5d2f565bab2e2b81b0798fc7ce0e21acd362ce5 data/create/loot_tables/blocks/crimson_ b892718d33caf0c260b902c92f46f3bfd827af45 data/create/loot_tables/blocks/crushing_wheel.json ff7853a5d5c0f3bddbcfe07e47efd1ff04b14f0a data/create/loot_tables/blocks/cuckoo_clock.json 9083b026ee254645430434b67c2ba7a842f888bf data/create/loot_tables/blocks/cut_andesite.json +c1aa69f80ba11dd52fb3627fc32377599f5ff887 data/create/loot_tables/blocks/cut_andesite_bricks.json c74a4cac08ab1f66146466ff9fb40c8f210de63c data/create/loot_tables/blocks/cut_andesite_brick_slab.json df3f5dcbf676106800bc1113bb022658eb5e85d6 data/create/loot_tables/blocks/cut_andesite_brick_stairs.json 95c5a4a3327f522d986d7baaa747fce5ead8c032 data/create/loot_tables/blocks/cut_andesite_brick_wall.json -c1aa69f80ba11dd52fb3627fc32377599f5ff887 data/create/loot_tables/blocks/cut_andesite_bricks.json cb6cf8aefaac1e00596bd64a182a329dbba7e659 data/create/loot_tables/blocks/cut_andesite_slab.json 7106a637809dcbeb9d4a02a7ff9dc52f7fd9d7a2 data/create/loot_tables/blocks/cut_andesite_stairs.json e3cfa2ecb0b90ebe07cc98f8e47d22d2c0da67e5 data/create/loot_tables/blocks/cut_andesite_wall.json 75eacbc0656e7a83a20a054755ea7d7d78af983d data/create/loot_tables/blocks/cut_asurine.json +f780d37b956ed734cafcbe42b77f1a8ebfa33350 data/create/loot_tables/blocks/cut_asurine_bricks.json 43ad24bb9da878111f3606a17ef9b45bcc4964ae data/create/loot_tables/blocks/cut_asurine_brick_slab.json 8f4d0af32546b6cc77c68a08dc74494b8be1b7c3 data/create/loot_tables/blocks/cut_asurine_brick_stairs.json bb9ce58aa5b4e38c4d3b29aa8e0d905054023eae data/create/loot_tables/blocks/cut_asurine_brick_wall.json -f780d37b956ed734cafcbe42b77f1a8ebfa33350 data/create/loot_tables/blocks/cut_asurine_bricks.json 972ca04f91a1ce4d35995c14e1b17f773b15b61e data/create/loot_tables/blocks/cut_asurine_slab.json a55778dd8735286c3abc65046186b6b8dff0367e data/create/loot_tables/blocks/cut_asurine_stairs.json 70284c686f16d215ff1a8fb19bbe36fddbd31e18 data/create/loot_tables/blocks/cut_asurine_wall.json 0f450ecf60c5d201f332b2736c552d0b51b159b8 data/create/loot_tables/blocks/cut_calcite.json +aec526af372816f306826eefe4a6318db7964892 data/create/loot_tables/blocks/cut_calcite_bricks.json ec0d2854433ac4f58e53685c69dc19629fee16ca data/create/loot_tables/blocks/cut_calcite_brick_slab.json 584e39fa0b78ba8649f69b53f9f032dd1532d6ac data/create/loot_tables/blocks/cut_calcite_brick_stairs.json cc9cbdb7a50305e47181b2452bfce887f9879437 data/create/loot_tables/blocks/cut_calcite_brick_wall.json -aec526af372816f306826eefe4a6318db7964892 data/create/loot_tables/blocks/cut_calcite_bricks.json b4e5b6d5cb63b7b1a4fe639fd727a381bfd00588 data/create/loot_tables/blocks/cut_calcite_slab.json ca83b89401dba12341e6f26786103c10c90447ca data/create/loot_tables/blocks/cut_calcite_stairs.json 64df1c4a373c28bf9be3630935b01a43abd22e03 data/create/loot_tables/blocks/cut_calcite_wall.json 5df3a2229657d7b616790e922b1d1d558b4a5128 data/create/loot_tables/blocks/cut_crimsite.json +59cb609bc9671ac481832eeaf942533c6861fc0e data/create/loot_tables/blocks/cut_crimsite_bricks.json 6fee8d6425e1c832abed8fd9bccc8e6fae9441fc data/create/loot_tables/blocks/cut_crimsite_brick_slab.json 3123bc9e6123dfeda9bb3cece5c2220ac8485535 data/create/loot_tables/blocks/cut_crimsite_brick_stairs.json 56a8c7b1588f6fa9a1fb438e91b04673e02a0c86 data/create/loot_tables/blocks/cut_crimsite_brick_wall.json -59cb609bc9671ac481832eeaf942533c6861fc0e data/create/loot_tables/blocks/cut_crimsite_bricks.json 90ed82b09f2650ee913956d62803d15fc4c0bdbd data/create/loot_tables/blocks/cut_crimsite_slab.json 0e237e008523ed3e9934c598a708be533aaa0861 data/create/loot_tables/blocks/cut_crimsite_stairs.json 48e1edca75186f160a12fa26ac262c7f86d62c82 data/create/loot_tables/blocks/cut_crimsite_wall.json 7bfe4d183ed26de1d7b241c27880a70d28426502 data/create/loot_tables/blocks/cut_deepslate.json +6e375a42ddf38c99fee86531471573716e27fa44 data/create/loot_tables/blocks/cut_deepslate_bricks.json fa4b940ad8ee432ee0fabf496d2da3d5039c204a data/create/loot_tables/blocks/cut_deepslate_brick_slab.json 1063a94b3e90a52a7492d85b1c086514333f3421 data/create/loot_tables/blocks/cut_deepslate_brick_stairs.json 878d809a038c626e8054f9b71e27be08388d7615 data/create/loot_tables/blocks/cut_deepslate_brick_wall.json -6e375a42ddf38c99fee86531471573716e27fa44 data/create/loot_tables/blocks/cut_deepslate_bricks.json 7b5e46aaf34d71993f50b5b6fa1cd5d7ea64264c data/create/loot_tables/blocks/cut_deepslate_slab.json 7d45e8bb037a1e550132854200d57ce31e073993 data/create/loot_tables/blocks/cut_deepslate_stairs.json cd80fd4f573d59c22f0b9799f1ba7422215d4ff1 data/create/loot_tables/blocks/cut_deepslate_wall.json d79d52657307a30422d9ff2eb1caad78024c24f7 data/create/loot_tables/blocks/cut_diorite.json +9f627b6449ae27a1990b84a60349736129a11e39 data/create/loot_tables/blocks/cut_diorite_bricks.json 1809235166024fa74f65a96b622faa8eddf4ce14 data/create/loot_tables/blocks/cut_diorite_brick_slab.json a6bb9fb4eee3dab9a540b228801ce100c048c2a7 data/create/loot_tables/blocks/cut_diorite_brick_stairs.json 690a938a04543cb60f2952335be26b2df9c75715 data/create/loot_tables/blocks/cut_diorite_brick_wall.json -9f627b6449ae27a1990b84a60349736129a11e39 data/create/loot_tables/blocks/cut_diorite_bricks.json 208999222adb5b1cd4fa47b85000841dbae4ad21 data/create/loot_tables/blocks/cut_diorite_slab.json 12849a868e8dff48ebb688c84fc53d4cee2a4eaa data/create/loot_tables/blocks/cut_diorite_stairs.json 469fffcdd40aea22fedb81b7778cc3c61928f3fd data/create/loot_tables/blocks/cut_diorite_wall.json 302d0bb640f696109fe4edc0c1fa9db332231511 data/create/loot_tables/blocks/cut_dripstone.json +48707f37b94ff1a930ee45bb9e8b6b4b67226945 data/create/loot_tables/blocks/cut_dripstone_bricks.json eb31bc108180e2248d575d5d72325b5585254af0 data/create/loot_tables/blocks/cut_dripstone_brick_slab.json 9b624a456baf55960675d7857e159f69911a281a data/create/loot_tables/blocks/cut_dripstone_brick_stairs.json b4c754d4d5a6c28f537c2d73844e39059b2c1450 data/create/loot_tables/blocks/cut_dripstone_brick_wall.json -48707f37b94ff1a930ee45bb9e8b6b4b67226945 data/create/loot_tables/blocks/cut_dripstone_bricks.json eb9eca9a69f763cbe81dc79375ef76978594b51e data/create/loot_tables/blocks/cut_dripstone_slab.json 47fae3abc8bea3ee802d6759192e631f50329c5f data/create/loot_tables/blocks/cut_dripstone_stairs.json 70b71cc460cba2955694baf0550eadc2187e3a8a data/create/loot_tables/blocks/cut_dripstone_wall.json 26433a16a91414be15b20dc85b81b76d086be889 data/create/loot_tables/blocks/cut_granite.json +65c3936e78a90c53faa0b9f9b3034afc2728e7b9 data/create/loot_tables/blocks/cut_granite_bricks.json c6b8dfa87e9c33a0dd2b3398dcc524347e826d44 data/create/loot_tables/blocks/cut_granite_brick_slab.json 5e00417f06b4d357e7469f0efa6e319dfc587da3 data/create/loot_tables/blocks/cut_granite_brick_stairs.json 8d8779846af8121426f128cc7b5d501037bd1cd4 data/create/loot_tables/blocks/cut_granite_brick_wall.json -65c3936e78a90c53faa0b9f9b3034afc2728e7b9 data/create/loot_tables/blocks/cut_granite_bricks.json 6e7253b2801611b4698e786f495c2ade1088ee0b data/create/loot_tables/blocks/cut_granite_slab.json de8c10fb2c7409a3375f2db5cdce2027c3f419bd data/create/loot_tables/blocks/cut_granite_stairs.json cdf40bb46d9457a66129b300dc4d3f0160cc1de2 data/create/loot_tables/blocks/cut_granite_wall.json ac5f062c7fc270c63d67ccecf19499a9e91fa1c4 data/create/loot_tables/blocks/cut_limestone.json +b60fb652e1f83b1af12a15cb47450bd9a6087f6a data/create/loot_tables/blocks/cut_limestone_bricks.json 3b6d3a9b12cf1c2a20bf337cc0155bb66967f0ee data/create/loot_tables/blocks/cut_limestone_brick_slab.json 701249cc12b7aa6f5cc1691ac4dd17e665aa2180 data/create/loot_tables/blocks/cut_limestone_brick_stairs.json 3b8c5eef9b0e8c35e8573ce91f5fddbac7f76f24 data/create/loot_tables/blocks/cut_limestone_brick_wall.json -b60fb652e1f83b1af12a15cb47450bd9a6087f6a data/create/loot_tables/blocks/cut_limestone_bricks.json ba186786e8677f1c769e8f231fe872c48330e13a data/create/loot_tables/blocks/cut_limestone_slab.json d354966d57804afda39ff27336d8b0f38acf6ea3 data/create/loot_tables/blocks/cut_limestone_stairs.json 28b4eee2c6da259e50c58a51905fa2b79a9b89ef data/create/loot_tables/blocks/cut_limestone_wall.json b3d6d90dd0c3e9d4b47d1f87d5abc354dd8c1447 data/create/loot_tables/blocks/cut_ochrum.json +5856859aae0cc633cbd9d83ea7cf7910ce1a88de data/create/loot_tables/blocks/cut_ochrum_bricks.json 67cadc71d90fb2527b9b2b72a74463d71571e493 data/create/loot_tables/blocks/cut_ochrum_brick_slab.json 487b3e7dc1d9d07183b9b699e33f6371858435aa data/create/loot_tables/blocks/cut_ochrum_brick_stairs.json 289757860f07b63dcce531a74ce7e60b4669c51b data/create/loot_tables/blocks/cut_ochrum_brick_wall.json -5856859aae0cc633cbd9d83ea7cf7910ce1a88de data/create/loot_tables/blocks/cut_ochrum_bricks.json c9deec5e3c7343afa3d013704179e2147b2eb7ec data/create/loot_tables/blocks/cut_ochrum_slab.json e851d829db8ea4398bc1cbe6e743b4fba98d3413 data/create/loot_tables/blocks/cut_ochrum_stairs.json 5dce8524b70baeefaeba13422f5900b1a161a867 data/create/loot_tables/blocks/cut_ochrum_wall.json 293064edf2909db8c9edc26bedd1cc023c647664 data/create/loot_tables/blocks/cut_scorchia.json +767910313f0983ebfb49b80526747d762cbdf782 data/create/loot_tables/blocks/cut_scorchia_bricks.json 895c4b9cc71701a26ae0e765ee67f0c06cc70a9c data/create/loot_tables/blocks/cut_scorchia_brick_slab.json c53d72176cb5dd93977975dd84647391fa563e3a data/create/loot_tables/blocks/cut_scorchia_brick_stairs.json 460232ca38cba2f0adc5316d6db8db94db231953 data/create/loot_tables/blocks/cut_scorchia_brick_wall.json -767910313f0983ebfb49b80526747d762cbdf782 data/create/loot_tables/blocks/cut_scorchia_bricks.json c8201964d877a932fe9a9a2d0360004440f7c380 data/create/loot_tables/blocks/cut_scorchia_slab.json dfd09849dbf48a064269a5ea28d0422caa87e4d4 data/create/loot_tables/blocks/cut_scorchia_stairs.json bd5304e38bb92a445c159e9fe647b906e28b232e data/create/loot_tables/blocks/cut_scorchia_wall.json 6b87a22c39b545d5be92e476751b99ceb4bef740 data/create/loot_tables/blocks/cut_scoria.json +833252d2d63c7502f6f0d7981673a8081046c944 data/create/loot_tables/blocks/cut_scoria_bricks.json 659e86f89499539e435989c2eb29e88e9a0ff9f4 data/create/loot_tables/blocks/cut_scoria_brick_slab.json 8434d461090bc43328eec0b4249d27a9ba383707 data/create/loot_tables/blocks/cut_scoria_brick_stairs.json e3f853395b9b6fb7d5bb103c121a77e04526a9e8 data/create/loot_tables/blocks/cut_scoria_brick_wall.json -833252d2d63c7502f6f0d7981673a8081046c944 data/create/loot_tables/blocks/cut_scoria_bricks.json 8360d736887ae3dc22bcf522791ef981e380456c data/create/loot_tables/blocks/cut_scoria_slab.json c771f03308f45e1e87d92181f94cdfd4e61fa5d8 data/create/loot_tables/blocks/cut_scoria_stairs.json 6fecb7fa2774ea63ac0c66e9c3d0f41d6b8cdff7 data/create/loot_tables/blocks/cut_scoria_wall.json 396074ee7fd5a3ddbac9332c74b7bdc4164919e2 data/create/loot_tables/blocks/cut_tuff.json +81465ef7aa555d36adf249bbc9acfe80abbe308e data/create/loot_tables/blocks/cut_tuff_bricks.json 5148f230c773b83268d52650bdacc660025feb95 data/create/loot_tables/blocks/cut_tuff_brick_slab.json 19719a4a3f63d1ec46a9ca9736a825d2dcc880ff data/create/loot_tables/blocks/cut_tuff_brick_stairs.json e20991b67c07dca62c212b43da5b7e7e98146c0e data/create/loot_tables/blocks/cut_tuff_brick_wall.json -81465ef7aa555d36adf249bbc9acfe80abbe308e data/create/loot_tables/blocks/cut_tuff_bricks.json 6d16bd3860207ff6912afc2bf3f0454b572aabba data/create/loot_tables/blocks/cut_tuff_slab.json c14e52ac9901aa873c33d51988bd26465ce0e095 data/create/loot_tables/blocks/cut_tuff_stairs.json dd70800c79fa2ff56bd4ea032cf069bc27cc9076 data/create/loot_tables/blocks/cut_tuff_wall.json 1957b610d14460cc9ca797fe953bf9831509cdbf data/create/loot_tables/blocks/cut_veridium.json +673d1f0fefa7725ac5bfcabfcea577041adc4eeb data/create/loot_tables/blocks/cut_veridium_bricks.json c1515a908bde249c087be1e73aec37773bc3dc5c data/create/loot_tables/blocks/cut_veridium_brick_slab.json d9552e3e9f4de0e09df8ca9446066e94c6e2c681 data/create/loot_tables/blocks/cut_veridium_brick_stairs.json 584c4bd13d9870f9798155b47cc0d32e5751294d data/create/loot_tables/blocks/cut_veridium_brick_wall.json -673d1f0fefa7725ac5bfcabfcea577041adc4eeb data/create/loot_tables/blocks/cut_veridium_bricks.json 009186ed0efe29a229a28cfd913bc02ddad217d4 data/create/loot_tables/blocks/cut_veridium_slab.json 4845f7127921c7dd93a59118e63c37107d6c2061 data/create/loot_tables/blocks/cut_veridium_stairs.json b56caea031d637321eddfd5d122fc357d2c2e49c data/create/loot_tables/blocks/cut_veridium_wall.json @@ -3533,12 +3533,12 @@ dfe0af3ff61ed2b3082e49c745d8a3e0c5973f4b data/create/loot_tables/blocks/encased_ a2e9a8a10b7fc730c1d7c8db3b529e7a37b683f5 data/create/loot_tables/blocks/encased_fan.json 7ede9f64839f51e6a2eb05b08577d2873f281401 data/create/loot_tables/blocks/encased_fluid_pipe.json 4869211639326efaabd1aba1067bfbb3ab012884 data/create/loot_tables/blocks/experience_block.json +9fa4b0c8ee313b6c9a57d7d5b687cdd01c8259d3 data/create/loot_tables/blocks/exposed_copper_shingles.json 9dbd37ef5ff549f10475101205c1a9d4a44140bc data/create/loot_tables/blocks/exposed_copper_shingle_slab.json d2c9abd9260eb82ea1c2eeae5e2d6abd0b4d3ce8 data/create/loot_tables/blocks/exposed_copper_shingle_stairs.json -9fa4b0c8ee313b6c9a57d7d5b687cdd01c8259d3 data/create/loot_tables/blocks/exposed_copper_shingles.json +f0905ae4c9bdff8fe9e1ab4682a7b1efe2d27d9d data/create/loot_tables/blocks/exposed_copper_tiles.json 6841c02935838f00011d33fc392965326c4dbc5b data/create/loot_tables/blocks/exposed_copper_tile_slab.json 432a047156b93a09b7e027fc34f5680a8f68dc92 data/create/loot_tables/blocks/exposed_copper_tile_stairs.json -f0905ae4c9bdff8fe9e1ab4682a7b1efe2d27d9d data/create/loot_tables/blocks/exposed_copper_tiles.json 4dd285b35d9b94d48f7aa783e93bdd04d58c4a26 data/create/loot_tables/blocks/factory_gauge.json 3fae2a7a3f133a1d7c76ce91f6c48eab787d6ff6 data/create/loot_tables/blocks/fake_track.json 1d4734d6d9ba039c0dfa2271f08cdb55e35b721f data/create/loot_tables/blocks/fluid_pipe.json @@ -3614,6 +3614,8 @@ eb95d1e0abb93d5efecb0809e3901f37021c4dfc data/create/loot_tables/blocks/light_gr e61e9b3e116037c4ad44a7e222e5127e5767ddad data/create/loot_tables/blocks/light_gray_table_cloth.json e22dfadefcea50090efe87136a4b92e6ef20d379 data/create/loot_tables/blocks/light_gray_toolbox.json 3e586bc1281f15e25e75475dd726578ff032c6ae data/create/loot_tables/blocks/light_gray_valve_handle.json +c6bb0877c537dda15469934383dc45c608bfd1a4 data/create/loot_tables/blocks/limestone.json +49058a62e1abd34917f983b6bc13cc4353b613a2 data/create/loot_tables/blocks/limestone_pillar.json 582bb26f6df37d0c2dbe12983ad05fc74f5fb5c0 data/create/loot_tables/blocks/lime_nixie_tube.json ec9d973d218b26d51b82f265603feab31170c619 data/create/loot_tables/blocks/lime_postbox.json 623ac65211a9920325308b55285f78e3b7275751 data/create/loot_tables/blocks/lime_sail.json @@ -3621,8 +3623,6 @@ ec9d973d218b26d51b82f265603feab31170c619 data/create/loot_tables/blocks/lime_pos 10ecd65ecba6b66652dd04a385fc47a44c1f8110 data/create/loot_tables/blocks/lime_table_cloth.json 0f6a465501a445925e9aff7a4c84b3c8e2caa93e data/create/loot_tables/blocks/lime_toolbox.json 1a3ed7cd5660d7ea014956ea642e0b07d89bc297 data/create/loot_tables/blocks/lime_valve_handle.json -c6bb0877c537dda15469934383dc45c608bfd1a4 data/create/loot_tables/blocks/limestone.json -49058a62e1abd34917f983b6bc13cc4353b613a2 data/create/loot_tables/blocks/limestone_pillar.json baf70f9eb579f20b232a2af4e6b00a54f84844e6 data/create/loot_tables/blocks/linear_chassis.json e4c0f8ca822cf7555bd011825b430c3c735160d4 data/create/loot_tables/blocks/lit_blaze_burner.json 6bd8b044cc9c69a5268372e5436f556da2c1bf21 data/create/loot_tables/blocks/magenta_nixie_tube.json @@ -3668,14 +3668,14 @@ d6323d4b30faa87cd4b5b8b815cb16f78296f203 data/create/loot_tables/blocks/orange_s 30aef2df782b6b35cd16b4c205bb15de85bc0664 data/create/loot_tables/blocks/orange_valve_handle.json f4004c6d16754fc8867ed6618dace8e8f6dcc412 data/create/loot_tables/blocks/ornate_iron_window.json 6f14500e07c6d342804f9127e7b66047ffaeef1e data/create/loot_tables/blocks/ornate_iron_window_pane.json +3e54d3c4755a43d837a1d9b2005ea1dee4d02555 data/create/loot_tables/blocks/oxidized_copper_shingles.json 62c43a533e4ffeeec9f7657db5a796569087f806 data/create/loot_tables/blocks/oxidized_copper_shingle_slab.json f47a01824093455030fca66e7b8a39bcfc61d219 data/create/loot_tables/blocks/oxidized_copper_shingle_stairs.json -3e54d3c4755a43d837a1d9b2005ea1dee4d02555 data/create/loot_tables/blocks/oxidized_copper_shingles.json +4d2a2863697664b3b71f02aa703c3504cd5cc826 data/create/loot_tables/blocks/oxidized_copper_tiles.json 4d815b361af81bd0c0e14c853ca54ad3cde66a57 data/create/loot_tables/blocks/oxidized_copper_tile_slab.json d599ef03d1b69e4367ec0dea78f52c1964c99f9b data/create/loot_tables/blocks/oxidized_copper_tile_stairs.json -4d2a2863697664b3b71f02aa703c3504cd5cc826 data/create/loot_tables/blocks/oxidized_copper_tiles.json -54aa9700df601640b705d912abe773d5b6ee2b1f data/create/loot_tables/blocks/package_frogport.json ab8cee7abd7dd92428bf7d8f0f5edd35082401a4 data/create/loot_tables/blocks/packager.json +54aa9700df601640b705d912abe773d5b6ee2b1f data/create/loot_tables/blocks/package_frogport.json 58bd9fe9d6706998bfbda3b077cfd0a740972091 data/create/loot_tables/blocks/peculiar_bell.json 4d7724df6fefee4512c4f7886d0e103d1dc39510 data/create/loot_tables/blocks/pink_nixie_tube.json df7b12349c64d035eb563535b03cb70d780c5a71 data/create/loot_tables/blocks/pink_postbox.json @@ -3761,6 +3761,9 @@ b4746e296f4bf63778e40a751b4c7fa8be45d21d data/create/loot_tables/blocks/purple_t 9e5e841d9f9a00d560ed17a7e197dc56bae334b7 data/create/loot_tables/blocks/radial_chassis.json 73a03fa31e299cec2c8a3dc0f31a8aa354b49bcd data/create/loot_tables/blocks/railway_casing.json f76e5a157d2aeab5708f464b1f3c8e47b3855f18 data/create/loot_tables/blocks/raw_zinc_block.json +bbc2d61eeea335f8f011d799ef6a5484ca027640 data/create/loot_tables/blocks/redstone_contact.json +4fa70deeac7e56121e42fb602dfa27ee1727f749 data/create/loot_tables/blocks/redstone_link.json +efc3a5595e4daf67fa43f84c9869dfc76fd6fca4 data/create/loot_tables/blocks/redstone_requester.json a50e1c28af16e9f1b4f48aa974461167139768a7 data/create/loot_tables/blocks/red_nixie_tube.json f36f1e69e4fb8723238f81aadbac892f54b5ac62 data/create/loot_tables/blocks/red_postbox.json 977d724cddf8eba053a3310ad0d30af15199bbed data/create/loot_tables/blocks/red_sail.json @@ -3768,9 +3771,6 @@ f36f1e69e4fb8723238f81aadbac892f54b5ac62 data/create/loot_tables/blocks/red_post 09796bc3be977e17927d0a9e32bff2982618e844 data/create/loot_tables/blocks/red_table_cloth.json 9713071cab536e8c1550a6309dc4563fecc2c4e0 data/create/loot_tables/blocks/red_toolbox.json 17d75711f4ef5d76aa931175364642732fb0c60d data/create/loot_tables/blocks/red_valve_handle.json -bbc2d61eeea335f8f011d799ef6a5484ca027640 data/create/loot_tables/blocks/redstone_contact.json -4fa70deeac7e56121e42fb602dfa27ee1727f749 data/create/loot_tables/blocks/redstone_link.json -efc3a5595e4daf67fa43f84c9869dfc76fd6fca4 data/create/loot_tables/blocks/redstone_requester.json 632067fe6309e31e78637eb0272209b630750242 data/create/loot_tables/blocks/refined_radiance_casing.json ee2c4d66d1264ec613e9e84fcac814d2f5806258 data/create/loot_tables/blocks/repackager.json 354a3b6c73379b7100b0dd12b3f3b008830c4d2d data/create/loot_tables/blocks/rope.json @@ -3780,8 +3780,8 @@ f74fdd78961619d712891c36e0a0778c25e145dc data/create/loot_tables/blocks/rope_pul a0575567d5679f2c54e5a25c6ec12338f8cdc939 data/create/loot_tables/blocks/rose_quartz_tiles.json de74765a3bbffafb87d632857dfcfa83f863f814 data/create/loot_tables/blocks/rotation_speed_controller.json 2af8df3e36ace336c43d68f4e53564640a89845f data/create/loot_tables/blocks/sail_frame.json -5a54e930243919991d71a1c3296002ff86dd88e1 data/create/loot_tables/blocks/schematic_table.json d499fd59d30da8b907b0f3a0f428700f066eddff data/create/loot_tables/blocks/schematicannon.json +5a54e930243919991d71a1c3296002ff86dd88e1 data/create/loot_tables/blocks/schematic_table.json 1d9b0df1330f44681bbd56f8560a30ef9e2175ff data/create/loot_tables/blocks/scorchia.json e39f189bfaebd31aedceb11e25720f1e08eb238d data/create/loot_tables/blocks/scorchia_pillar.json 5e3a37dbb2fcc0d6be042bfd063fd8b1414d6169 data/create/loot_tables/blocks/scoria.json @@ -3790,64 +3790,64 @@ d39afcaedc84d582c0c1f21ec5945cd0a67d389d data/create/loot_tables/blocks/secondar e33a34b47e07cf3262c0dbdbc651b31b9492b18f data/create/loot_tables/blocks/sequenced_gearshift.json 7d61387106e5e7fcc4aa0b05b9560cd5f4ef7df8 data/create/loot_tables/blocks/shadow_steel_casing.json 7e67d04f861e0a680487e27f94022a7850652dfe data/create/loot_tables/blocks/shaft.json +e88ff4ab1341c2db8338de0708b0ca8f40f15a8b data/create/loot_tables/blocks/small_andesite_bricks.json 220febcbcc4a993d475b683ebef7468ebdb7bf26 data/create/loot_tables/blocks/small_andesite_brick_slab.json b4764c5bb538359bcc2a599ff3b7474ade2115ed data/create/loot_tables/blocks/small_andesite_brick_stairs.json a891496ffb91bef56c3b684cb55a57e27a72154a data/create/loot_tables/blocks/small_andesite_brick_wall.json -e88ff4ab1341c2db8338de0708b0ca8f40f15a8b data/create/loot_tables/blocks/small_andesite_bricks.json +576d8f6beca755a4082f1c8941e2590c1d18107b data/create/loot_tables/blocks/small_asurine_bricks.json 1a5d3543ebb7c0064ba8ff01160a22a0f5f29f36 data/create/loot_tables/blocks/small_asurine_brick_slab.json 64f4b44b786eda91d432f20c8b725b0415440b56 data/create/loot_tables/blocks/small_asurine_brick_stairs.json 60a1d505e955047cf933ae55efc2e7c10d0a5a79 data/create/loot_tables/blocks/small_asurine_brick_wall.json -576d8f6beca755a4082f1c8941e2590c1d18107b data/create/loot_tables/blocks/small_asurine_bricks.json 64bcfece2507b8510633ae20c00ab989232664ff data/create/loot_tables/blocks/small_bogey.json +c03bba06f66262c0ced5e85fa7dcbfbfc8c9db71 data/create/loot_tables/blocks/small_calcite_bricks.json b673542c79f4a82f2e80c0931354e994292811f6 data/create/loot_tables/blocks/small_calcite_brick_slab.json e10d286286bba8e172a56e0eeb9af18d06d1a76d data/create/loot_tables/blocks/small_calcite_brick_stairs.json d7214e942b203823fa2fece883e8406a7721369f data/create/loot_tables/blocks/small_calcite_brick_wall.json -c03bba06f66262c0ced5e85fa7dcbfbfc8c9db71 data/create/loot_tables/blocks/small_calcite_bricks.json +f49d32973b0be51229f4e3fdc13958c9852c5c8a data/create/loot_tables/blocks/small_crimsite_bricks.json ef8b0f604b627715542e8216ae5448e88995cc13 data/create/loot_tables/blocks/small_crimsite_brick_slab.json dbec9246ab957a3ed2dbd0707df12c1496258e05 data/create/loot_tables/blocks/small_crimsite_brick_stairs.json d4d5bd8b101655205c4f293f23e83f610e179e91 data/create/loot_tables/blocks/small_crimsite_brick_wall.json -f49d32973b0be51229f4e3fdc13958c9852c5c8a data/create/loot_tables/blocks/small_crimsite_bricks.json +8caba3e7001dd8df4d3e6365b97849570c74c840 data/create/loot_tables/blocks/small_deepslate_bricks.json 44567c10c28ddd221198824766d3fec289fb29d4 data/create/loot_tables/blocks/small_deepslate_brick_slab.json fc141f5cdb1001d344b5ef8fa3ad1fdfeb01d048 data/create/loot_tables/blocks/small_deepslate_brick_stairs.json 3cf68d27362e9bb5dc3255ccf810097fbee511ba data/create/loot_tables/blocks/small_deepslate_brick_wall.json -8caba3e7001dd8df4d3e6365b97849570c74c840 data/create/loot_tables/blocks/small_deepslate_bricks.json +4f22a84f105c2fabfd08ff0782ec30bbdc59f940 data/create/loot_tables/blocks/small_diorite_bricks.json f6565f4bd11b7e95008b0f8fc3f5f2c7af1b77f8 data/create/loot_tables/blocks/small_diorite_brick_slab.json e3cbe41b4b2c38d0d5e625e34b61fc79db16d3bd data/create/loot_tables/blocks/small_diorite_brick_stairs.json 787dfaa16dc30155c90cc360f6927fa067a30ed8 data/create/loot_tables/blocks/small_diorite_brick_wall.json -4f22a84f105c2fabfd08ff0782ec30bbdc59f940 data/create/loot_tables/blocks/small_diorite_bricks.json +d9cc7f58c791e040df4abfce225524e01eb01d49 data/create/loot_tables/blocks/small_dripstone_bricks.json f72338c9252528e41f60cb183cb4ee07cea47bf0 data/create/loot_tables/blocks/small_dripstone_brick_slab.json bedf0fba68e8a8ce4205a968429ebe9c3ddfb528 data/create/loot_tables/blocks/small_dripstone_brick_stairs.json c1168f58f342dfa332bfa7f53f5f03383c55ccf2 data/create/loot_tables/blocks/small_dripstone_brick_wall.json -d9cc7f58c791e040df4abfce225524e01eb01d49 data/create/loot_tables/blocks/small_dripstone_bricks.json +8437e7e28e45c10562d182c4c07189bcc108cabb data/create/loot_tables/blocks/small_granite_bricks.json 4d111f8580ac97cf1b49b667462f7141846f3d3a data/create/loot_tables/blocks/small_granite_brick_slab.json c16e015251126614960d3e6300cb04d3aeaf49b4 data/create/loot_tables/blocks/small_granite_brick_stairs.json e0ff780ddeb5d5c8d2b6cd7736ac05f4556de52c data/create/loot_tables/blocks/small_granite_brick_wall.json -8437e7e28e45c10562d182c4c07189bcc108cabb data/create/loot_tables/blocks/small_granite_bricks.json +c60def11fbac5010bf749960e084dd5cd0dc4b07 data/create/loot_tables/blocks/small_limestone_bricks.json 5222ac5255c9a9ada0ce1da0fd4f4acbeee8ddb7 data/create/loot_tables/blocks/small_limestone_brick_slab.json 97310b6b1cbea869ebaa52861542787c49cee017 data/create/loot_tables/blocks/small_limestone_brick_stairs.json 0855921034db43692baa9fd0bcb767154f96d591 data/create/loot_tables/blocks/small_limestone_brick_wall.json -c60def11fbac5010bf749960e084dd5cd0dc4b07 data/create/loot_tables/blocks/small_limestone_bricks.json +eb6b2171a6c99a3a28089752f26ddc6ac1f941d1 data/create/loot_tables/blocks/small_ochrum_bricks.json 8ced0c24db685dbf4382b7b71124005edde9e0b2 data/create/loot_tables/blocks/small_ochrum_brick_slab.json 090e7154fb2c3dfd20d37aa87f3df4572a27c615 data/create/loot_tables/blocks/small_ochrum_brick_stairs.json 60f2d9970ad8caf8ffe3aa8083dbba671b8d4b8b data/create/loot_tables/blocks/small_ochrum_brick_wall.json -eb6b2171a6c99a3a28089752f26ddc6ac1f941d1 data/create/loot_tables/blocks/small_ochrum_bricks.json a001d069c2b4d15c6dfd0312749765fc4e89571e data/create/loot_tables/blocks/small_rose_quartz_tiles.json +ce71e670948453691d4f09c8110b952afb41afa1 data/create/loot_tables/blocks/small_scorchia_bricks.json d521cf885c737da2e4717d43072840ffd3f4c5d9 data/create/loot_tables/blocks/small_scorchia_brick_slab.json de6b5d583e1adf4d49147e0719616dfd0165726d data/create/loot_tables/blocks/small_scorchia_brick_stairs.json 895603c6920338ffafd8d0d1310e47ac20bdbfda data/create/loot_tables/blocks/small_scorchia_brick_wall.json -ce71e670948453691d4f09c8110b952afb41afa1 data/create/loot_tables/blocks/small_scorchia_bricks.json +8b7e61477c4fdc834d669bda9197b585d60f26a2 data/create/loot_tables/blocks/small_scoria_bricks.json d1954c07a66f40123d8d78602795efad7c92070f data/create/loot_tables/blocks/small_scoria_brick_slab.json 291b5a560f09ed8f09ccc949a1a4da0006f139c7 data/create/loot_tables/blocks/small_scoria_brick_stairs.json ed572e947f78d637e6e1a4166c111121087c41c3 data/create/loot_tables/blocks/small_scoria_brick_wall.json -8b7e61477c4fdc834d669bda9197b585d60f26a2 data/create/loot_tables/blocks/small_scoria_bricks.json +2c7097ee677f42452212b5dce8959065d2bb0e15 data/create/loot_tables/blocks/small_tuff_bricks.json ad8a3571dc3ae0ee1ec7be7f35c9796e544f0682 data/create/loot_tables/blocks/small_tuff_brick_slab.json 17f4a98a81e5920b75c88133d15b63d431f3fb64 data/create/loot_tables/blocks/small_tuff_brick_stairs.json 7defad704f6278e329af634acfb9efd617b2003e data/create/loot_tables/blocks/small_tuff_brick_wall.json -2c7097ee677f42452212b5dce8959065d2bb0e15 data/create/loot_tables/blocks/small_tuff_bricks.json +e499c0a8a0f804003612f3a4c9286cb4b033fe4b data/create/loot_tables/blocks/small_veridium_bricks.json c7771827a715b9eaacd1a7b7e863e274b1dee11f data/create/loot_tables/blocks/small_veridium_brick_slab.json 818b65dd5d868527e7df7658a4f62a93f2795186 data/create/loot_tables/blocks/small_veridium_brick_stairs.json 7733e53a90f2ba9c17cdedaa8720e70df1a8d2de data/create/loot_tables/blocks/small_veridium_brick_wall.json -e499c0a8a0f804003612f3a4c9286cb4b033fe4b data/create/loot_tables/blocks/small_veridium_bricks.json a121d21b81e93c119b6ee32ca21d260d9c33cb2a data/create/loot_tables/blocks/smart_chute.json 4556eb2d607db3631d0a9524d22a50686ce4a5a8 data/create/loot_tables/blocks/smart_fluid_pipe.json 9601e8ba0eb098cc409557f17b01669d8b971461 data/create/loot_tables/blocks/speedometer.json @@ -3859,9 +3859,9 @@ bcd632c1180efbc990b077314cfce8514a25da7c data/create/loot_tables/blocks/spruce_w cae1bd9100b62841e260880faa80e2442f44a141 data/create/loot_tables/blocks/steam_whistle_extension.json 0bc3fdde351129e3a261a2420aff9d3f063c235e data/create/loot_tables/blocks/sticker.json 074f526902cb5fcff2129614428aba1ea05a6649 data/create/loot_tables/blocks/sticky_mechanical_piston.json +a7332324e63f7d28621ddfbd54eb3d091461d890 data/create/loot_tables/blocks/stockpile_switch.json af312881ec9bfb0902438f53c5cac020244bdba2 data/create/loot_tables/blocks/stock_link.json f4fa9bb255348dc79dcc0468b3beb9ad075eb036 data/create/loot_tables/blocks/stock_ticker.json -a7332324e63f7d28621ddfbd54eb3d091461d890 data/create/loot_tables/blocks/stockpile_switch.json b13496b1b4bc0be30605832e23894fb374dd796e data/create/loot_tables/blocks/stressometer.json 6a7df4d2730d57ae6e404b4bc8e01367e5ddbf07 data/create/loot_tables/blocks/tiled_glass.json 0ad584e41780dc0183af1fa1e49e126730dfdbab data/create/loot_tables/blocks/tiled_glass_pane.json @@ -3881,36 +3881,36 @@ cfc82d2aa8248caeaa17ff0a60db02607046550d data/create/loot_tables/blocks/warped_w 2eeddb89cfc597bc1ce0736b9f4a6f98e0dfa4d2 data/create/loot_tables/blocks/warped_window_pane.json ccab211722d7f06913a549851b0d6e8278edc845 data/create/loot_tables/blocks/water_wheel.json ea5dfcedc928e8dfa1c59cf3917d1577dff87494 data/create/loot_tables/blocks/water_wheel_structure.json +bbc6fc068adccea464909b87f1d1f426324d74cc data/create/loot_tables/blocks/waxed_copper_shingles.json cb31be1e75ca822454bd0a89954f74c4c8726b33 data/create/loot_tables/blocks/waxed_copper_shingle_slab.json c8e440e42141788d1988c57ab91cb1bfcd977407 data/create/loot_tables/blocks/waxed_copper_shingle_stairs.json -bbc6fc068adccea464909b87f1d1f426324d74cc data/create/loot_tables/blocks/waxed_copper_shingles.json +a3b8f12d983077477963fd3fc893c5acd36ad552 data/create/loot_tables/blocks/waxed_copper_tiles.json 807da1d66d6c7d07efc8973de43415fa4b5ddfdc data/create/loot_tables/blocks/waxed_copper_tile_slab.json 92759871a9c84815b98b6dcd22fcf0dd958bc8ab data/create/loot_tables/blocks/waxed_copper_tile_stairs.json -a3b8f12d983077477963fd3fc893c5acd36ad552 data/create/loot_tables/blocks/waxed_copper_tiles.json +eb9781d081d52c34c041004c774b52169b4a9ca0 data/create/loot_tables/blocks/waxed_exposed_copper_shingles.json be5aabc98f4d70028f2b49ae1eaf0bc68a693c53 data/create/loot_tables/blocks/waxed_exposed_copper_shingle_slab.json a99143d290addb98427be53d7fea1cbc702d630c data/create/loot_tables/blocks/waxed_exposed_copper_shingle_stairs.json -eb9781d081d52c34c041004c774b52169b4a9ca0 data/create/loot_tables/blocks/waxed_exposed_copper_shingles.json +e79c0636852b37a463dc122d66cdec27d3aa10c4 data/create/loot_tables/blocks/waxed_exposed_copper_tiles.json 234cbb59a0e00d82c5508c8e9a61e328c22c1c56 data/create/loot_tables/blocks/waxed_exposed_copper_tile_slab.json de628114eb25f393efc4c0934d79c5bdc4365f75 data/create/loot_tables/blocks/waxed_exposed_copper_tile_stairs.json -e79c0636852b37a463dc122d66cdec27d3aa10c4 data/create/loot_tables/blocks/waxed_exposed_copper_tiles.json +60fe0594baab9599956d990ba893f8915835db81 data/create/loot_tables/blocks/waxed_oxidized_copper_shingles.json c8935df7d4634dee2b01c8a0ac5de12397f4d9ed data/create/loot_tables/blocks/waxed_oxidized_copper_shingle_slab.json 2b9370b7fa362ea88f916dd53747da80e4ae3357 data/create/loot_tables/blocks/waxed_oxidized_copper_shingle_stairs.json -60fe0594baab9599956d990ba893f8915835db81 data/create/loot_tables/blocks/waxed_oxidized_copper_shingles.json +f0721c371b08214337f3f4fce3a3705840310bdb data/create/loot_tables/blocks/waxed_oxidized_copper_tiles.json de4d25cac546559173f740752625c82dfd6bae09 data/create/loot_tables/blocks/waxed_oxidized_copper_tile_slab.json 2ed72fc0ea28303f5c6d1039662f55c677cb7bcb data/create/loot_tables/blocks/waxed_oxidized_copper_tile_stairs.json -f0721c371b08214337f3f4fce3a3705840310bdb data/create/loot_tables/blocks/waxed_oxidized_copper_tiles.json +f309ffd94dfb3591efd2fab337a871a0ceff1084 data/create/loot_tables/blocks/waxed_weathered_copper_shingles.json 9a7b265a963e122d510de64012ed1d98ad9017f9 data/create/loot_tables/blocks/waxed_weathered_copper_shingle_slab.json 62f25a1bc013e9c3d487d9a53407e58d89907c5b data/create/loot_tables/blocks/waxed_weathered_copper_shingle_stairs.json -f309ffd94dfb3591efd2fab337a871a0ceff1084 data/create/loot_tables/blocks/waxed_weathered_copper_shingles.json +26e6a96f50e7f3384f896bf8a5c3d5ff2b422526 data/create/loot_tables/blocks/waxed_weathered_copper_tiles.json 3fa20e33ced4aee01775db57629b9580a6b8e200 data/create/loot_tables/blocks/waxed_weathered_copper_tile_slab.json 59b28bd57f461482a394dbce9ea10ee25fc7c294 data/create/loot_tables/blocks/waxed_weathered_copper_tile_stairs.json -26e6a96f50e7f3384f896bf8a5c3d5ff2b422526 data/create/loot_tables/blocks/waxed_weathered_copper_tiles.json +3cd15ae684bc0e4e41f02b3ee79eafdbf052620c data/create/loot_tables/blocks/weathered_copper_shingles.json 278a56aa433ba3647107b3bf0553da5a5f6d40dd data/create/loot_tables/blocks/weathered_copper_shingle_slab.json 198babfd55c3a30c6ac61e81d5e01b0cf8fca80a data/create/loot_tables/blocks/weathered_copper_shingle_stairs.json -3cd15ae684bc0e4e41f02b3ee79eafdbf052620c data/create/loot_tables/blocks/weathered_copper_shingles.json +771d98a6627d707228719e843bc80636b02dc985 data/create/loot_tables/blocks/weathered_copper_tiles.json d6862dc9f7d291df618fbce71eebf613711a5517 data/create/loot_tables/blocks/weathered_copper_tile_slab.json 57d5065d53016e4b1ef0fbad9b84605b1546bcc4 data/create/loot_tables/blocks/weathered_copper_tile_stairs.json -771d98a6627d707228719e843bc80636b02dc985 data/create/loot_tables/blocks/weathered_copper_tiles.json 013deea9b687ce96e5042de13ab0cba9dadce364 data/create/loot_tables/blocks/weathered_iron_block.json f0c51ad0a713aab00dff913361b8e5e8448b912a data/create/loot_tables/blocks/weathered_iron_window.json 1d3ea471ec3f2bbf10c7a11f040f8bbf0d1576a8 data/create/loot_tables/blocks/weathered_iron_window_pane.json @@ -3958,43 +3958,43 @@ da3692808565988e21ec5b1d5e976338ccc4a037 data/create/recipes/calcite_pillar_from 1157b2eab2ada187ea80feae298b77ed7ece4bfd data/create/recipes/copper_bars_from_ingots_copper_stonecutting.json b9d4f55128aa03ee6f6ab1831e709629a42c147e data/create/recipes/copper_ladder_from_ingots_copper_stonecutting.json 922c5ac48c8eb8b3a39f5626a381c2252fbac107 data/create/recipes/copper_scaffolding_from_ingots_copper_stonecutting.json +bab9fa969ba95850dc6e3bd0723387a61cbb05cd data/create/recipes/copper_shingles_from_ingots_copper_stonecutting.json bb083ae1d057dc0106946e4c68f9469b81724396 data/create/recipes/copper_shingle_slab.json 3689feaca2bd5355fa2d4226cd2cc519fa9b97c1 data/create/recipes/copper_shingle_slab_from_copper_shingles_stonecutting.json bd4cd7119f8371164b278afc679795a3c2a53406 data/create/recipes/copper_shingle_stairs.json 59f672e8e88d5f4655467e2696616b552debaf46 data/create/recipes/copper_shingle_stairs_from_copper_shingles_stonecutting.json -bab9fa969ba95850dc6e3bd0723387a61cbb05cd data/create/recipes/copper_shingles_from_ingots_copper_stonecutting.json 0225fc8d7b7a5027b8a61e6a043c3a8e505d876a data/create/recipes/copper_table_cloth_from_ingots_copper_stonecutting.json +d463aa891c7ae1b2eb1a758e4100c5a1c16cfffd data/create/recipes/copper_tiles_from_ingots_copper_stonecutting.json f64ba3f3c607b43ea77e5bccb7ec2048e5c6e424 data/create/recipes/copper_tile_slab.json 91b0390e0c772d43eb46b94a0113323f0f6a4387 data/create/recipes/copper_tile_slab_from_copper_tiles_stonecutting.json d31a41f6f7ef0bd20abab06cc31a9d2c56187117 data/create/recipes/copper_tile_stairs.json bf1b0a447169029161fb07feacd22d5aa806b2bf data/create/recipes/copper_tile_stairs_from_copper_tiles_stonecutting.json -d463aa891c7ae1b2eb1a758e4100c5a1c16cfffd data/create/recipes/copper_tiles_from_ingots_copper_stonecutting.json daa54c9ff3612521f06cc1979116beafcda852dd data/create/recipes/copycat_panel_from_ingots_zinc_stonecutting.json 745816d2c3fa29ede2510e39edc76f6fecee963f data/create/recipes/copycat_step_from_ingots_zinc_stonecutting.json +255c32272a704109fccdbb071d4dbf602cb8c1d8 data/create/recipes/crafting/copper/waxed_copper_shingles_from_honeycomb.json 57ae13042e0f96676fa322bf24db4976d75ca6bc data/create/recipes/crafting/copper/waxed_copper_shingle_slab_from_honeycomb.json 790565897535ea2e741d0a0ed7c0b561d594b69a data/create/recipes/crafting/copper/waxed_copper_shingle_stairs_from_honeycomb.json -255c32272a704109fccdbb071d4dbf602cb8c1d8 data/create/recipes/crafting/copper/waxed_copper_shingles_from_honeycomb.json +0c6e14c5884257850c7360cba66bc8cca91c84e7 data/create/recipes/crafting/copper/waxed_copper_tiles_from_honeycomb.json 4693ee65a4a5e1c93fc2acce7bfbc438e573ad9a data/create/recipes/crafting/copper/waxed_copper_tile_slab_from_honeycomb.json f8772b915663e3f70b3a2405a23c5ce87e8b8e49 data/create/recipes/crafting/copper/waxed_copper_tile_stairs_from_honeycomb.json -0c6e14c5884257850c7360cba66bc8cca91c84e7 data/create/recipes/crafting/copper/waxed_copper_tiles_from_honeycomb.json +6d0dacc4db8966d38156fe17645732084379a887 data/create/recipes/crafting/copper/waxed_exposed_copper_shingles_from_honeycomb.json 3bc0b81ea61229e24570e083caa4e5870d517e75 data/create/recipes/crafting/copper/waxed_exposed_copper_shingle_slab_from_honeycomb.json 191f34b27bc8966c2b6ba41403cc0933718748d3 data/create/recipes/crafting/copper/waxed_exposed_copper_shingle_stairs_from_honeycomb.json -6d0dacc4db8966d38156fe17645732084379a887 data/create/recipes/crafting/copper/waxed_exposed_copper_shingles_from_honeycomb.json +cdd66bdfddbcdfacb27c030872d10b6e7f1356fd data/create/recipes/crafting/copper/waxed_exposed_copper_tiles_from_honeycomb.json 2f6d2f8da4d4da2ed48e33d8f6e0b32d37a3ce6d data/create/recipes/crafting/copper/waxed_exposed_copper_tile_slab_from_honeycomb.json 4ed8482ed29fe7c3273db733fa141743c181d460 data/create/recipes/crafting/copper/waxed_exposed_copper_tile_stairs_from_honeycomb.json -cdd66bdfddbcdfacb27c030872d10b6e7f1356fd data/create/recipes/crafting/copper/waxed_exposed_copper_tiles_from_honeycomb.json +0ca4e58d715d5ed4b051a94f2dff42d4d413ef07 data/create/recipes/crafting/copper/waxed_oxidized_copper_shingles_from_honeycomb.json b421f16aea7c47fa8a62e69973f30e4e382f8a2c data/create/recipes/crafting/copper/waxed_oxidized_copper_shingle_slab_from_honeycomb.json 7ab7f673f57e219d3e486d0add1d7e2a8820cc6b data/create/recipes/crafting/copper/waxed_oxidized_copper_shingle_stairs_from_honeycomb.json -0ca4e58d715d5ed4b051a94f2dff42d4d413ef07 data/create/recipes/crafting/copper/waxed_oxidized_copper_shingles_from_honeycomb.json +b7edffb9b1a936fd34fe23defefc8cb9ea4f6977 data/create/recipes/crafting/copper/waxed_oxidized_copper_tiles_from_honeycomb.json 24582e83e8d36a6267df5c028addfb44c1a637e6 data/create/recipes/crafting/copper/waxed_oxidized_copper_tile_slab_from_honeycomb.json 9185ea241bcb5f2fe09d0d5c65832ef379e06c58 data/create/recipes/crafting/copper/waxed_oxidized_copper_tile_stairs_from_honeycomb.json -b7edffb9b1a936fd34fe23defefc8cb9ea4f6977 data/create/recipes/crafting/copper/waxed_oxidized_copper_tiles_from_honeycomb.json +90bce9f262b87fb821210aceb88d09d815d15e5a data/create/recipes/crafting/copper/waxed_weathered_copper_shingles_from_honeycomb.json a2cc99ad9b1234f5327971ee535af9bc25d0154c data/create/recipes/crafting/copper/waxed_weathered_copper_shingle_slab_from_honeycomb.json 0952753a079593d748b38ca84b666f2f886f5c1e data/create/recipes/crafting/copper/waxed_weathered_copper_shingle_stairs_from_honeycomb.json -90bce9f262b87fb821210aceb88d09d815d15e5a data/create/recipes/crafting/copper/waxed_weathered_copper_shingles_from_honeycomb.json +724802d206db185ebf20bafbcfc35fe0f982f58a data/create/recipes/crafting/copper/waxed_weathered_copper_tiles_from_honeycomb.json 98d0b72eb20e1d80cc590800ae2d642a47c3ae5f data/create/recipes/crafting/copper/waxed_weathered_copper_tile_slab_from_honeycomb.json 594b8fd5c30a84df97667b2c6dccc5dedd039d26 data/create/recipes/crafting/copper/waxed_weathered_copper_tile_stairs_from_honeycomb.json -724802d206db185ebf20bafbcfc35fe0f982f58a data/create/recipes/crafting/copper/waxed_weathered_copper_tiles_from_honeycomb.json 97c3e430ef2aecf61c457d0b8c4bbd23e1b01cc3 data/create/recipes/crafting/kinetics/black_seat.json 1129d02609125b48af2efa48f84dd3f90d51a341 data/create/recipes/crafting/kinetics/black_seat_from_other_seat.json 9e5a73e2343054d35e2fbfd20f0c49834d1a87a6 data/create/recipes/crafting/kinetics/black_valve_handle_from_other_valve_handle.json @@ -4130,6 +4130,7 @@ db333d47f9e1d6b02aa670ea0aa10dabbcb0e319 data/create/recipes/crafting/logistics/ c3f4fd2206f3885904913289761f2b8b758e4c95 data/create/recipes/crimsite_pillar_from_stone_types_crimsite_stonecutting.json e1815f97fbc2786d77f5378a2696e36050d8a1fd data/create/recipes/crimson_window.json 96009a12fe3f5ebf677ac069999e2ea2adbc9b7c data/create/recipes/crimson_window_pane.json +82cb9be82ce5109781169bdb47bbd49238b9824b data/create/recipes/cut_andesite_bricks_from_stone_types_andesite_stonecutting.json d6a41fc914a4a41478f115d9503658dba04a4d02 data/create/recipes/cut_andesite_brick_slab.json edf981198463ac58524606f86dc15d2265e8b993 data/create/recipes/cut_andesite_brick_slab_from_stone_types_andesite_stonecutting.json 72486864f3a0d31a92212552441eb659f2541b60 data/create/recipes/cut_andesite_brick_slab_recycling.json @@ -4137,7 +4138,6 @@ edf981198463ac58524606f86dc15d2265e8b993 data/create/recipes/cut_andesite_brick_ 22f463c679249738bf1a340a3b8ff14806303a70 data/create/recipes/cut_andesite_brick_stairs_from_stone_types_andesite_stonecutting.json 42b7105c1d776aed25c1c6bbd9254375079d7438 data/create/recipes/cut_andesite_brick_wall.json 7d25517650c9f66b65f0f8841cf9bcda7ea401ec data/create/recipes/cut_andesite_brick_wall_from_stone_types_andesite_stonecutting.json -82cb9be82ce5109781169bdb47bbd49238b9824b data/create/recipes/cut_andesite_bricks_from_stone_types_andesite_stonecutting.json c3ab483224c3adbd467a4ec0b26a1f6a53fe81c4 data/create/recipes/cut_andesite_from_stone_types_andesite_stonecutting.json 9f316131bb538da9f6b1bde9eaaa0a5bd5972a66 data/create/recipes/cut_andesite_slab.json 50dcff201da369bdc591fdc320aae3547f114284 data/create/recipes/cut_andesite_slab_from_stone_types_andesite_stonecutting.json @@ -4146,6 +4146,7 @@ c3ab483224c3adbd467a4ec0b26a1f6a53fe81c4 data/create/recipes/cut_andesite_from_s c284fc46aabae9c5ab79071eb63ec9b07a9d1002 data/create/recipes/cut_andesite_stairs_from_stone_types_andesite_stonecutting.json 3b6e66e92656ab5b0d1e15444db62ccb1cc01866 data/create/recipes/cut_andesite_wall.json 5df6e8d558f656533aff514aee8cdec7cf8d6fdf data/create/recipes/cut_andesite_wall_from_stone_types_andesite_stonecutting.json +e335b15907be053ab0f2649338b12a86371b78f7 data/create/recipes/cut_asurine_bricks_from_stone_types_asurine_stonecutting.json 41d085d3b8fce5b12d601d86fd0e88df9b482aec data/create/recipes/cut_asurine_brick_slab.json cf61e0806a3988a771675a261a540cbb62352d80 data/create/recipes/cut_asurine_brick_slab_from_stone_types_asurine_stonecutting.json 86606a0717bba33f457707d96461fec6a22d23de data/create/recipes/cut_asurine_brick_slab_recycling.json @@ -4153,7 +4154,6 @@ cf61e0806a3988a771675a261a540cbb62352d80 data/create/recipes/cut_asurine_brick_s 382a7faa460ac286631fe063280541f2f499d895 data/create/recipes/cut_asurine_brick_stairs_from_stone_types_asurine_stonecutting.json 09699c116bb201e742fef1fd3c987e9de4606e6a data/create/recipes/cut_asurine_brick_wall.json 8bb8a9f8e8dd0d6585311c326dcf3f40227149a9 data/create/recipes/cut_asurine_brick_wall_from_stone_types_asurine_stonecutting.json -e335b15907be053ab0f2649338b12a86371b78f7 data/create/recipes/cut_asurine_bricks_from_stone_types_asurine_stonecutting.json 0188d62fbeede94f8596dd5cc73d361a160e8c95 data/create/recipes/cut_asurine_from_stone_types_asurine_stonecutting.json 118e87a2a344238009b1bbbe70e6f314e27842d9 data/create/recipes/cut_asurine_slab.json 37c502094ee96da9e4983142dae5e023c6bcfe14 data/create/recipes/cut_asurine_slab_from_stone_types_asurine_stonecutting.json @@ -4162,6 +4162,7 @@ fe3dd5c7d5bdea71a75003cf3d50439d9d21458d data/create/recipes/cut_asurine_slab_re cade93c9328afcacf4507aa7699c4b09fb4592d4 data/create/recipes/cut_asurine_stairs_from_stone_types_asurine_stonecutting.json 80bec79b5daea4b2b72c0f5e9f189c1044583465 data/create/recipes/cut_asurine_wall.json 45a712e41a74982cfb94a39da199ec6c95eef798 data/create/recipes/cut_asurine_wall_from_stone_types_asurine_stonecutting.json +da11f21280ba1ed06ffe8afe77db3e9e1bbcb1a3 data/create/recipes/cut_calcite_bricks_from_stone_types_calcite_stonecutting.json 98e849c743ed1e4397bf6168215dfa7006a804c4 data/create/recipes/cut_calcite_brick_slab.json 1c21eb6c785729a8ea274513e1313aed952e105e data/create/recipes/cut_calcite_brick_slab_from_stone_types_calcite_stonecutting.json 2a3f078f7f40ba3bc5c17a037db1f8ee415e4e3f data/create/recipes/cut_calcite_brick_slab_recycling.json @@ -4169,7 +4170,6 @@ e4267c62bc6cfc8373df29ee2685f1e1b286b638 data/create/recipes/cut_calcite_brick_s 10fe509e01e3ed1b04bd2f384c0aa3db96b117f1 data/create/recipes/cut_calcite_brick_stairs_from_stone_types_calcite_stonecutting.json 9b55a6c9cf0ce697a242684953daf9aa94d024dc data/create/recipes/cut_calcite_brick_wall.json 1e67376e484923b84bd64b0b22b4e55b581ac419 data/create/recipes/cut_calcite_brick_wall_from_stone_types_calcite_stonecutting.json -da11f21280ba1ed06ffe8afe77db3e9e1bbcb1a3 data/create/recipes/cut_calcite_bricks_from_stone_types_calcite_stonecutting.json 98b014b64c97371f04aaacbdd23e13e274e36e3b data/create/recipes/cut_calcite_from_stone_types_calcite_stonecutting.json fcab91f11fe97a194b2c1b16115206166d3cd634 data/create/recipes/cut_calcite_slab.json 8426a494b776148056cb4525e62744d0be8b28cd data/create/recipes/cut_calcite_slab_from_stone_types_calcite_stonecutting.json @@ -4178,6 +4178,7 @@ fcab91f11fe97a194b2c1b16115206166d3cd634 data/create/recipes/cut_calcite_slab.js a7e7fb425d3c1f21f5ed53da79957363fed824df data/create/recipes/cut_calcite_stairs_from_stone_types_calcite_stonecutting.json 73eaf7bffa38bc874974871f3002cd3ee7f0c36e data/create/recipes/cut_calcite_wall.json 01b4c23362f15ee0e5c207c46383f96032c89d98 data/create/recipes/cut_calcite_wall_from_stone_types_calcite_stonecutting.json +07aff2bb6424de46463b2c965418ed52efd0a790 data/create/recipes/cut_crimsite_bricks_from_stone_types_crimsite_stonecutting.json 8ffb2c1c747f19ea37c0da3fe248b6c58981c9f6 data/create/recipes/cut_crimsite_brick_slab.json 86c3a5c64561052489b3ceb9e08be5a8729198a9 data/create/recipes/cut_crimsite_brick_slab_from_stone_types_crimsite_stonecutting.json e3215d4e651e70402b896ba50975cb2f23d16278 data/create/recipes/cut_crimsite_brick_slab_recycling.json @@ -4185,7 +4186,6 @@ e49f6e319fae9058cbece0e332a11e108234e608 data/create/recipes/cut_crimsite_brick_ c7186fb1a75f59aff929e843f50a162a090b7bb3 data/create/recipes/cut_crimsite_brick_stairs_from_stone_types_crimsite_stonecutting.json 272d8d01730a88eff4fc6923e93962650b992c46 data/create/recipes/cut_crimsite_brick_wall.json 13ac9464098e8c67e820dc898c025ab0382d852a data/create/recipes/cut_crimsite_brick_wall_from_stone_types_crimsite_stonecutting.json -07aff2bb6424de46463b2c965418ed52efd0a790 data/create/recipes/cut_crimsite_bricks_from_stone_types_crimsite_stonecutting.json 18ce9ff32eda2d869bd11f398a86e78b71f6d0fe data/create/recipes/cut_crimsite_from_stone_types_crimsite_stonecutting.json c39166aa6267ec5bc71893d5756955abfb644217 data/create/recipes/cut_crimsite_slab.json 6271d5bc0377814ba06061bfffcb812ca2ef8f03 data/create/recipes/cut_crimsite_slab_from_stone_types_crimsite_stonecutting.json @@ -4194,6 +4194,7 @@ acfe33dbb889c820c213bcbc8593766703bf3a25 data/create/recipes/cut_crimsite_slab_r 90b03cf1e72d3b803e33755832e0722ff264681b data/create/recipes/cut_crimsite_stairs_from_stone_types_crimsite_stonecutting.json 8dfe19522878af232deaa1fc13d83cf785684cba data/create/recipes/cut_crimsite_wall.json 18f9548175baab0173785d7ef308096067712dd2 data/create/recipes/cut_crimsite_wall_from_stone_types_crimsite_stonecutting.json +de1a11b7ed71f1f7aeea2791fe922feef689fd35 data/create/recipes/cut_deepslate_bricks_from_stone_types_deepslate_stonecutting.json 5e5c0e6b1b3e204de3c48fb6a4cd473a150979c2 data/create/recipes/cut_deepslate_brick_slab.json 2c0795b92759dab751f86f50aa80440df2245526 data/create/recipes/cut_deepslate_brick_slab_from_stone_types_deepslate_stonecutting.json dbcc41c48cf28b71dcd9f3b6ecae43c8de681532 data/create/recipes/cut_deepslate_brick_slab_recycling.json @@ -4201,7 +4202,6 @@ e21f8dc33e70ebd43ea79a4afaf3b4e8a449f4bd data/create/recipes/cut_deepslate_brick 7b3489e5b629a995691be117c5a378769c743449 data/create/recipes/cut_deepslate_brick_stairs_from_stone_types_deepslate_stonecutting.json 158bb41bffebb2543e4aa2d5f14cc8af1cdd8671 data/create/recipes/cut_deepslate_brick_wall.json 73a07a5fa665bb20d131f0a0e40806116316928a data/create/recipes/cut_deepslate_brick_wall_from_stone_types_deepslate_stonecutting.json -de1a11b7ed71f1f7aeea2791fe922feef689fd35 data/create/recipes/cut_deepslate_bricks_from_stone_types_deepslate_stonecutting.json 992fdc2eba2afe3ff8aad0ceee5424ecd3f3026d data/create/recipes/cut_deepslate_from_stone_types_deepslate_stonecutting.json 064e2f5edd9209af7742b0f0eb45204453bed46f data/create/recipes/cut_deepslate_slab.json f341d30b7fd427dea09a51d67e1e9532e5184be8 data/create/recipes/cut_deepslate_slab_from_stone_types_deepslate_stonecutting.json @@ -4210,6 +4210,7 @@ c08e12e44344efca550efa8ba14d0cb2f9f6c2c6 data/create/recipes/cut_deepslate_stair e6deec1352fb5c74c470dc488b71e5f8f55bdfbf data/create/recipes/cut_deepslate_stairs_from_stone_types_deepslate_stonecutting.json 2ad7fb3f3a143e58bea8eefe4cd9db3d1c37a3e6 data/create/recipes/cut_deepslate_wall.json e752527479f71f96bb34878008bf8cfb23fd3045 data/create/recipes/cut_deepslate_wall_from_stone_types_deepslate_stonecutting.json +2c23d13f48f3685bda6c564e080053fbfa71ab99 data/create/recipes/cut_diorite_bricks_from_stone_types_diorite_stonecutting.json 90b83c2a2026d70f49c91813305fdee721926db9 data/create/recipes/cut_diorite_brick_slab.json 9d51c690c77321437561a006dc2f9bba975875e6 data/create/recipes/cut_diorite_brick_slab_from_stone_types_diorite_stonecutting.json fa76e64ac9b569f5d5f2f1ecc54e51f9be15aacf data/create/recipes/cut_diorite_brick_slab_recycling.json @@ -4217,7 +4218,6 @@ aa6aea99e9ce2d5dc3d6555ab3d17928bca6195e data/create/recipes/cut_diorite_brick_s 9a26c4097519a9300e591b6578bbaf6c11f909e1 data/create/recipes/cut_diorite_brick_stairs_from_stone_types_diorite_stonecutting.json 78d37df17c7e2be73ce1d226ee552ff3f49b9e4f data/create/recipes/cut_diorite_brick_wall.json f668f2c78a779bc3d0546a82dea02b9f4688e05c data/create/recipes/cut_diorite_brick_wall_from_stone_types_diorite_stonecutting.json -2c23d13f48f3685bda6c564e080053fbfa71ab99 data/create/recipes/cut_diorite_bricks_from_stone_types_diorite_stonecutting.json 1918ecb2ab16ca7dbb30eee4852b67dd963d872e data/create/recipes/cut_diorite_from_stone_types_diorite_stonecutting.json 07fda5c89128648856f948a03ac56a2a2693cf1b data/create/recipes/cut_diorite_slab.json 28765ac7f8b62373b32f014d1dd7f4afb50e1906 data/create/recipes/cut_diorite_slab_from_stone_types_diorite_stonecutting.json @@ -4226,6 +4226,7 @@ dd5f3c59a5d292f7b5c046be35da7f67e8383aa1 data/create/recipes/cut_diorite_slab_re be2c6c01630b90895e7215edce3d02352793dbc4 data/create/recipes/cut_diorite_stairs_from_stone_types_diorite_stonecutting.json 8984b7b7dbc7e65ee04886516501a13278e889e9 data/create/recipes/cut_diorite_wall.json 8ff5d1ecff2202595f7cba5bd65c466c53ac2cc5 data/create/recipes/cut_diorite_wall_from_stone_types_diorite_stonecutting.json +10550b023989113c26d430136daf1dc49f10ce63 data/create/recipes/cut_dripstone_bricks_from_stone_types_dripstone_stonecutting.json 95717a80bb8ae296c2f77478a8f42b88cea88996 data/create/recipes/cut_dripstone_brick_slab.json f04bf1189b53e24974779d9e959e8973d9677162 data/create/recipes/cut_dripstone_brick_slab_from_stone_types_dripstone_stonecutting.json 332534fc2909ca83f5f7f4ab3adf92680bb17f79 data/create/recipes/cut_dripstone_brick_slab_recycling.json @@ -4233,7 +4234,6 @@ f04bf1189b53e24974779d9e959e8973d9677162 data/create/recipes/cut_dripstone_brick 17bf8160eaf16655d454ddfe22b82c9a86462146 data/create/recipes/cut_dripstone_brick_stairs_from_stone_types_dripstone_stonecutting.json 7d638d156326a2e542ed94837273d9cca5cf4fce data/create/recipes/cut_dripstone_brick_wall.json 154931db54115cf4a64147cdd6d1eb7efff48737 data/create/recipes/cut_dripstone_brick_wall_from_stone_types_dripstone_stonecutting.json -10550b023989113c26d430136daf1dc49f10ce63 data/create/recipes/cut_dripstone_bricks_from_stone_types_dripstone_stonecutting.json 7147f9199f174c9864109fe5723528921aaa0c46 data/create/recipes/cut_dripstone_from_stone_types_dripstone_stonecutting.json f2800b467eac75d0099f2f07e09b47115df4e09f data/create/recipes/cut_dripstone_slab.json a4f62a1a30592f82789988f93d8ae35d176eca59 data/create/recipes/cut_dripstone_slab_from_stone_types_dripstone_stonecutting.json @@ -4242,6 +4242,7 @@ a4f62a1a30592f82789988f93d8ae35d176eca59 data/create/recipes/cut_dripstone_slab_ f2df5efedb6fb25ecb877b888007990082d9aca4 data/create/recipes/cut_dripstone_stairs_from_stone_types_dripstone_stonecutting.json a177092d0270f9e07a4f9bef4d0c8fb2ed91d3bc data/create/recipes/cut_dripstone_wall.json a3731ef689d3ac790bc3e3fd507f1134c99a751a data/create/recipes/cut_dripstone_wall_from_stone_types_dripstone_stonecutting.json +9c4c64666b18d3adb11cd3d56667fabf6e88dfe2 data/create/recipes/cut_granite_bricks_from_stone_types_granite_stonecutting.json aa454bebffd7e77cfa5c1bd711bfbac27e3c5a14 data/create/recipes/cut_granite_brick_slab.json d073b9b0b8ca2fbdc5e1ed16f6f195a5f3af4588 data/create/recipes/cut_granite_brick_slab_from_stone_types_granite_stonecutting.json 1dfd539c17a3342a0cd194ce1465a808aacbeda3 data/create/recipes/cut_granite_brick_slab_recycling.json @@ -4249,7 +4250,6 @@ e069aa5c316feb2823ef98e8e6c89bb1bed23d2e data/create/recipes/cut_granite_brick_s f38fc7014aa83d4914d50d87ee3f8f762c078a78 data/create/recipes/cut_granite_brick_stairs_from_stone_types_granite_stonecutting.json 0fd9c3a778c7bdcd7aa06f892a9c260ad664d367 data/create/recipes/cut_granite_brick_wall.json b81db94b6228f512049324dd1436880f1e86e444 data/create/recipes/cut_granite_brick_wall_from_stone_types_granite_stonecutting.json -9c4c64666b18d3adb11cd3d56667fabf6e88dfe2 data/create/recipes/cut_granite_bricks_from_stone_types_granite_stonecutting.json 01970a95f17648a7ef1fb0337ee2e82eb2279e9e data/create/recipes/cut_granite_from_stone_types_granite_stonecutting.json 8fc1c51591e590c8718be0500a4dbcc2b47830ce data/create/recipes/cut_granite_slab.json d239323b7a3b65b2fd7005350a90d578671c2b81 data/create/recipes/cut_granite_slab_from_stone_types_granite_stonecutting.json @@ -4258,6 +4258,7 @@ d239323b7a3b65b2fd7005350a90d578671c2b81 data/create/recipes/cut_granite_slab_fr 3d85d483073d37fea7d9a95831b3b856c0725b98 data/create/recipes/cut_granite_stairs_from_stone_types_granite_stonecutting.json 3d4130fe5fe6e963fd5e10534e729e0448b9f05f data/create/recipes/cut_granite_wall.json d43a876bf89bf3536c80fd5e3ef0ee36c147cd06 data/create/recipes/cut_granite_wall_from_stone_types_granite_stonecutting.json +7cdd3cf302cfe4ef21c0a89dadef4f781e307bb0 data/create/recipes/cut_limestone_bricks_from_stone_types_limestone_stonecutting.json 0e3285206947bcfdf9606d3f8e61ea7d2899f7d2 data/create/recipes/cut_limestone_brick_slab.json c3d3ff37e29c435b2a13d30bd4ded0f6ca9fbfbc data/create/recipes/cut_limestone_brick_slab_from_stone_types_limestone_stonecutting.json 459babb2bd01e9e1ece4c8cd2865690997f01c66 data/create/recipes/cut_limestone_brick_slab_recycling.json @@ -4265,7 +4266,6 @@ d4f8dc640becf1c35416016500424ecd68d7ecee data/create/recipes/cut_limestone_brick 570983b2b27862dabe9f3d1bcd76d2909b8bdb3c data/create/recipes/cut_limestone_brick_stairs_from_stone_types_limestone_stonecutting.json aad4342a726fd65ca2b4c52a4e8857190e50b5be data/create/recipes/cut_limestone_brick_wall.json 5ac226aff9d854efc47ed71241e6c098b170b9b0 data/create/recipes/cut_limestone_brick_wall_from_stone_types_limestone_stonecutting.json -7cdd3cf302cfe4ef21c0a89dadef4f781e307bb0 data/create/recipes/cut_limestone_bricks_from_stone_types_limestone_stonecutting.json 329950373aaaf8e70c54cf5e2467c7a84f372078 data/create/recipes/cut_limestone_from_stone_types_limestone_stonecutting.json cbacfd31703ac908d28e42968bb571dccfa20612 data/create/recipes/cut_limestone_slab.json 628a0a64c2dcd63f17a3ec9ce55ac643b194eacc data/create/recipes/cut_limestone_slab_from_stone_types_limestone_stonecutting.json @@ -4274,6 +4274,7 @@ cbacfd31703ac908d28e42968bb571dccfa20612 data/create/recipes/cut_limestone_slab. ba301da212ee14ff42c38487d0906a2da203e3c3 data/create/recipes/cut_limestone_stairs_from_stone_types_limestone_stonecutting.json d2aac4ac16f9c842af1efd3896dd3250f6d8424e data/create/recipes/cut_limestone_wall.json b14e6972f8586e569a7ab4ecf6ed5d6db1a2bded data/create/recipes/cut_limestone_wall_from_stone_types_limestone_stonecutting.json +a1a2b95283d88e1d990e00da9a095fe928b2aa2f data/create/recipes/cut_ochrum_bricks_from_stone_types_ochrum_stonecutting.json d5a4fa7787d2e56e0b5c8d533567543b93cf694b data/create/recipes/cut_ochrum_brick_slab.json 58514a5f216706e9bb62b27ad03701fe02bac013 data/create/recipes/cut_ochrum_brick_slab_from_stone_types_ochrum_stonecutting.json 6cc3167ebf075d7b302a359d1afdddf5753d0e26 data/create/recipes/cut_ochrum_brick_slab_recycling.json @@ -4281,7 +4282,6 @@ d5a4fa7787d2e56e0b5c8d533567543b93cf694b data/create/recipes/cut_ochrum_brick_sl ec6339d6658b0d32e46c8a4a4e06d94a388a6332 data/create/recipes/cut_ochrum_brick_stairs_from_stone_types_ochrum_stonecutting.json c4139ae7a9742f7111d308fe66bf1d627533550b data/create/recipes/cut_ochrum_brick_wall.json 1b8a4c81680df542a5e6b9e665c96649cf3eb7fa data/create/recipes/cut_ochrum_brick_wall_from_stone_types_ochrum_stonecutting.json -a1a2b95283d88e1d990e00da9a095fe928b2aa2f data/create/recipes/cut_ochrum_bricks_from_stone_types_ochrum_stonecutting.json 2b967f3424196b5da9b396ea58fb969d406af789 data/create/recipes/cut_ochrum_from_stone_types_ochrum_stonecutting.json 5baa701f3cbe8d69e2e6a5554622dd78ef3ac451 data/create/recipes/cut_ochrum_slab.json 9a26cba276cf135a10c71d31f5b960b2ee6ac444 data/create/recipes/cut_ochrum_slab_from_stone_types_ochrum_stonecutting.json @@ -4290,6 +4290,7 @@ a1a2b95283d88e1d990e00da9a095fe928b2aa2f data/create/recipes/cut_ochrum_bricks_f 75a232ccede0ffa7feb3e69da17c6a514a908907 data/create/recipes/cut_ochrum_stairs_from_stone_types_ochrum_stonecutting.json d9c05b7e4ce4ee86d0f6a9e1ee6c1b585ffee58b data/create/recipes/cut_ochrum_wall.json ee0dff8e1317aeffd061688879b97e81a00b7adb data/create/recipes/cut_ochrum_wall_from_stone_types_ochrum_stonecutting.json +087eefb8ffd61fd88f1db6ca25f9ac31e93f2fdf data/create/recipes/cut_scorchia_bricks_from_stone_types_scorchia_stonecutting.json 72ac9293e5791df07914e2d3ed00e5ff59d64b08 data/create/recipes/cut_scorchia_brick_slab.json 2f38c410d5eb93bdb8c8be0f68ac89726e3c765c data/create/recipes/cut_scorchia_brick_slab_from_stone_types_scorchia_stonecutting.json e296e6af6865bf6e4618dab8a96bb88f6999a9a5 data/create/recipes/cut_scorchia_brick_slab_recycling.json @@ -4297,7 +4298,6 @@ bd5984a6b96443319b7fad32db771d8ded0b0591 data/create/recipes/cut_scorchia_brick_ bd5c803c855222a29998dd784e6d12a18dd612d9 data/create/recipes/cut_scorchia_brick_stairs_from_stone_types_scorchia_stonecutting.json adfe0b08b5b72e579d47f36a4f835045e433e7f7 data/create/recipes/cut_scorchia_brick_wall.json 37fc5ae45d0260de9a5c45b0a1b208e4d146a562 data/create/recipes/cut_scorchia_brick_wall_from_stone_types_scorchia_stonecutting.json -087eefb8ffd61fd88f1db6ca25f9ac31e93f2fdf data/create/recipes/cut_scorchia_bricks_from_stone_types_scorchia_stonecutting.json f6dfd648418f24da093b80978c2f6e070f33ff6d data/create/recipes/cut_scorchia_from_stone_types_scorchia_stonecutting.json 7df99605c0c8761aeb9301d5391e1f16d41f89b3 data/create/recipes/cut_scorchia_slab.json fbd9a92d3c3d9e823cac51347320219f1734ec04 data/create/recipes/cut_scorchia_slab_from_stone_types_scorchia_stonecutting.json @@ -4306,6 +4306,7 @@ ad54182c3142ac9d9dd9bb4c5acc18f82e3fc5e5 data/create/recipes/cut_scorchia_stairs 1ddfefce136201ae78dbc53ba472080332fd6366 data/create/recipes/cut_scorchia_stairs_from_stone_types_scorchia_stonecutting.json 0a011b7cee33200fec5546168734c330952124da data/create/recipes/cut_scorchia_wall.json c594d886a303ad6e24d1283004442835ee861fbc data/create/recipes/cut_scorchia_wall_from_stone_types_scorchia_stonecutting.json +8650c0db70a3521b50404252106e0185b4f25a45 data/create/recipes/cut_scoria_bricks_from_stone_types_scoria_stonecutting.json 8baf09b5ff2004d71091b6f95307aa179a21f4df data/create/recipes/cut_scoria_brick_slab.json e7080ca9b6a507bec4a4a3dd52a28c1c33975628 data/create/recipes/cut_scoria_brick_slab_from_stone_types_scoria_stonecutting.json f5b56f6eb9c1ac0f8168b2b0f0b0ab00655ebfdb data/create/recipes/cut_scoria_brick_slab_recycling.json @@ -4313,7 +4314,6 @@ f5b56f6eb9c1ac0f8168b2b0f0b0ab00655ebfdb data/create/recipes/cut_scoria_brick_sl 3fd560355163f0afafefe886e75fd8b2c3cf2b6f data/create/recipes/cut_scoria_brick_stairs_from_stone_types_scoria_stonecutting.json ed803a4cdcf1dd01af03fff52e783f3539f78546 data/create/recipes/cut_scoria_brick_wall.json 553642a4e0dc5f934da8127a427ccdf53d3f51f9 data/create/recipes/cut_scoria_brick_wall_from_stone_types_scoria_stonecutting.json -8650c0db70a3521b50404252106e0185b4f25a45 data/create/recipes/cut_scoria_bricks_from_stone_types_scoria_stonecutting.json 5702063be3d38fa6b3ae5c998337676a0cf91149 data/create/recipes/cut_scoria_from_stone_types_scoria_stonecutting.json 295356022aee8a33272b430879615af638fc5a2c data/create/recipes/cut_scoria_slab.json 1656e822e823fcdf04120b55235aa477845a69a6 data/create/recipes/cut_scoria_slab_from_stone_types_scoria_stonecutting.json @@ -4322,6 +4322,7 @@ d0c88c037004911e377d88cf5a28ff85a413d07e data/create/recipes/cut_scoria_slab_rec 8748df6152c923930452397367562bb6007058cf data/create/recipes/cut_scoria_stairs_from_stone_types_scoria_stonecutting.json 7f9bd9de7bfba21eef449f8e11ffc8cf37de6b88 data/create/recipes/cut_scoria_wall.json 42235c6ded520ecda3321e8cd8910dcfa05cd61e data/create/recipes/cut_scoria_wall_from_stone_types_scoria_stonecutting.json +c02b4daf0050d705c145c0698aaa3094724ba2f1 data/create/recipes/cut_tuff_bricks_from_stone_types_tuff_stonecutting.json 214b6219b86d94ea5705e40f254a4d9a9ac894b7 data/create/recipes/cut_tuff_brick_slab.json 9e0182206fab754daa0596259be0b98a712ba859 data/create/recipes/cut_tuff_brick_slab_from_stone_types_tuff_stonecutting.json 86938ed4ef969e85163c25e2a60181433247b73b data/create/recipes/cut_tuff_brick_slab_recycling.json @@ -4329,7 +4330,6 @@ b4212528d6c8893c1d57c0a5ada60673105e399d data/create/recipes/cut_tuff_brick_stai 90f3241a3eb47d9b0902b639fadee76e41b92a72 data/create/recipes/cut_tuff_brick_stairs_from_stone_types_tuff_stonecutting.json b920d14ac41465f70b1fb8211c1c06d6c41ccadb data/create/recipes/cut_tuff_brick_wall.json aa41f89028dfa995dc11b881894e5a5993e4c4f9 data/create/recipes/cut_tuff_brick_wall_from_stone_types_tuff_stonecutting.json -c02b4daf0050d705c145c0698aaa3094724ba2f1 data/create/recipes/cut_tuff_bricks_from_stone_types_tuff_stonecutting.json 41dc800ae0a8918f4602d610ff0ba9714cdfe8dc data/create/recipes/cut_tuff_from_stone_types_tuff_stonecutting.json 573fff8b4fba92289dc6b113b58c8de25427f62d data/create/recipes/cut_tuff_slab.json 94667fb1e6203bd66bef10acfee7cd990009d26f data/create/recipes/cut_tuff_slab_from_stone_types_tuff_stonecutting.json @@ -4338,6 +4338,7 @@ c02b4daf0050d705c145c0698aaa3094724ba2f1 data/create/recipes/cut_tuff_bricks_fro 3b3ba319bd67a4e7f555cfcb54f9dc1fc22cf015 data/create/recipes/cut_tuff_stairs_from_stone_types_tuff_stonecutting.json 0c241d763e87b23b8799528e132e0d12b0e16141 data/create/recipes/cut_tuff_wall.json 5705b0312c5c70d48662c2ff375f0b2cfe3b4902 data/create/recipes/cut_tuff_wall_from_stone_types_tuff_stonecutting.json +8ab3c640b57421a8c0341ab4ec5bade31376d059 data/create/recipes/cut_veridium_bricks_from_stone_types_veridium_stonecutting.json 822f97726c72d31c4c614767c08140b3535e0640 data/create/recipes/cut_veridium_brick_slab.json 1705fd5fc9ecc9a650812c89f500b5ef9aec2626 data/create/recipes/cut_veridium_brick_slab_from_stone_types_veridium_stonecutting.json 238aeedf55624671809a37246581d28fe6b2c19e data/create/recipes/cut_veridium_brick_slab_recycling.json @@ -4345,7 +4346,6 @@ dfbef691643cead7111b3b1c51aabcda8419bc19 data/create/recipes/cut_veridium_brick_ db2ea87f3ec8924ba9e0b87cd6a6edeb93c0c2d8 data/create/recipes/cut_veridium_brick_stairs_from_stone_types_veridium_stonecutting.json 5e5c9fab7ba7143d206df7d8184742fb1a17c99c data/create/recipes/cut_veridium_brick_wall.json ed752a7f698e3ecbb5e4f848a78f8b3c7c6bf12e data/create/recipes/cut_veridium_brick_wall_from_stone_types_veridium_stonecutting.json -8ab3c640b57421a8c0341ab4ec5bade31376d059 data/create/recipes/cut_veridium_bricks_from_stone_types_veridium_stonecutting.json e0355543105e4ec9d672d2a050e70b5c198ea472 data/create/recipes/cut_veridium_from_stone_types_veridium_stonecutting.json fb3c671f64676538ea3aa96be483ac15b3cdeb3d data/create/recipes/cut_veridium_slab.json 7d7c80ac03ad8623f9a5d7f0ff0bb6f68985efa5 data/create/recipes/cut_veridium_slab_from_stone_types_veridium_stonecutting.json @@ -4531,6 +4531,7 @@ a157a43e7788d285b8d72eade5955369c9b9a1de data/create/recipes/rose_quartz_block_f 1268cc2bdd088d26b84fb4e481db27af61f94bd1 data/create/recipes/scorchia_pillar_from_stone_types_scorchia_stonecutting.json 2e8f4cdb3498547a5e6fe658bb33d4be5ce8f54b data/create/recipes/scoria_from_stone_types_scoria_stonecutting.json 770d3453c75f77b16db661f6e636892d3117690b data/create/recipes/scoria_pillar_from_stone_types_scoria_stonecutting.json +75dc56fcdcd6a10288f2d607bf6dcbbe10b35a64 data/create/recipes/small_andesite_bricks_from_stone_types_andesite_stonecutting.json 2e86fddc76285b4e380b845eb1150580b134d0ac data/create/recipes/small_andesite_brick_slab.json 311727e5c08ddbe0aa26275be74e9b83201ac8ab data/create/recipes/small_andesite_brick_slab_from_stone_types_andesite_stonecutting.json 2767e239c9d704b6bb5325b4f40e0aa0acdcdce1 data/create/recipes/small_andesite_brick_slab_recycling.json @@ -4538,7 +4539,7 @@ a157a43e7788d285b8d72eade5955369c9b9a1de data/create/recipes/rose_quartz_block_f 9e82896e00c1e14e514fac818e11e5b9ef5b10d7 data/create/recipes/small_andesite_brick_stairs_from_stone_types_andesite_stonecutting.json 5287d389b4954d954881d9f0293c52870bba88d0 data/create/recipes/small_andesite_brick_wall.json 1172ca76affd948c50b207124ee03c4f480f4ee8 data/create/recipes/small_andesite_brick_wall_from_stone_types_andesite_stonecutting.json -75dc56fcdcd6a10288f2d607bf6dcbbe10b35a64 data/create/recipes/small_andesite_bricks_from_stone_types_andesite_stonecutting.json +e3b69122b2cfe64b043384235eeb6d04f346e58b data/create/recipes/small_asurine_bricks_from_stone_types_asurine_stonecutting.json 9196a055491052afc14ed01667cccf2a0920e793 data/create/recipes/small_asurine_brick_slab.json f4cc3330837a647c098ccb24fbbbf583c3f960fc data/create/recipes/small_asurine_brick_slab_from_stone_types_asurine_stonecutting.json 063b2f0ad7e93698999922040132eb2b23661a38 data/create/recipes/small_asurine_brick_slab_recycling.json @@ -4546,7 +4547,7 @@ a85d2f957223f87ffa2c3f63cdf6f9f0f84bb921 data/create/recipes/small_asurine_brick c7cb218b0d8a1e358d593fc1fef82fc074289552 data/create/recipes/small_asurine_brick_stairs_from_stone_types_asurine_stonecutting.json 08d10ee57995e67ac1fb5feba04b03aee51dbe16 data/create/recipes/small_asurine_brick_wall.json 4c0aa6203295a36a6d7ffe9d7bf0973277162689 data/create/recipes/small_asurine_brick_wall_from_stone_types_asurine_stonecutting.json -e3b69122b2cfe64b043384235eeb6d04f346e58b data/create/recipes/small_asurine_bricks_from_stone_types_asurine_stonecutting.json +07125218f9025833afa189fa0090f4d6b4660db0 data/create/recipes/small_calcite_bricks_from_stone_types_calcite_stonecutting.json a72719de028ca9e07756dae6031af48525520fc2 data/create/recipes/small_calcite_brick_slab.json d8ebf6f1eb2e2372fb20def956398089adec5d13 data/create/recipes/small_calcite_brick_slab_from_stone_types_calcite_stonecutting.json ab4cfc2b34989d41a434781a3150ecd530c4f15b data/create/recipes/small_calcite_brick_slab_recycling.json @@ -4554,7 +4555,7 @@ c77a7700d978e23db14d947915591061dda8eab3 data/create/recipes/small_calcite_brick 4e066bfc60ea142d54ce939d025b6679ac9634ad data/create/recipes/small_calcite_brick_stairs_from_stone_types_calcite_stonecutting.json 64e53d8090fa26cc4cb62efea7c1615ff7f705c2 data/create/recipes/small_calcite_brick_wall.json 3ba736ae76249fa61692c13f7879af954f9bbd36 data/create/recipes/small_calcite_brick_wall_from_stone_types_calcite_stonecutting.json -07125218f9025833afa189fa0090f4d6b4660db0 data/create/recipes/small_calcite_bricks_from_stone_types_calcite_stonecutting.json +a3309c81f84bf4fb78e9db2316fb758f9b2f8429 data/create/recipes/small_crimsite_bricks_from_stone_types_crimsite_stonecutting.json 92cf7e99229c1e72405bb0875e6f939b3f5aea12 data/create/recipes/small_crimsite_brick_slab.json b993e081103c019b7b9b73b38ef8c408fb4500ac data/create/recipes/small_crimsite_brick_slab_from_stone_types_crimsite_stonecutting.json 7f6fa1fab65d910388f5f2ec4ee7d99cbda8df57 data/create/recipes/small_crimsite_brick_slab_recycling.json @@ -4562,7 +4563,7 @@ b993e081103c019b7b9b73b38ef8c408fb4500ac data/create/recipes/small_crimsite_bric 260da721849d1afd6f431d51538d1587ee3af8d5 data/create/recipes/small_crimsite_brick_stairs_from_stone_types_crimsite_stonecutting.json 093ac919f793111b442029198383a9de5b6df027 data/create/recipes/small_crimsite_brick_wall.json 8b8280a8282fa8718620ee3d69182e241a7852c0 data/create/recipes/small_crimsite_brick_wall_from_stone_types_crimsite_stonecutting.json -a3309c81f84bf4fb78e9db2316fb758f9b2f8429 data/create/recipes/small_crimsite_bricks_from_stone_types_crimsite_stonecutting.json +e7a3cb889ce6b530cd40f19e23bad943374e61b5 data/create/recipes/small_deepslate_bricks_from_stone_types_deepslate_stonecutting.json 022690548a46f5cc63adda3626824a81c6ebf490 data/create/recipes/small_deepslate_brick_slab.json 655be9ddf21dea2255fb2cb2628a5fee39eb10e2 data/create/recipes/small_deepslate_brick_slab_from_stone_types_deepslate_stonecutting.json d6d3db5604279cd402f64dbdeae7c3bee6d7ab78 data/create/recipes/small_deepslate_brick_slab_recycling.json @@ -4570,7 +4571,7 @@ d6d3db5604279cd402f64dbdeae7c3bee6d7ab78 data/create/recipes/small_deepslate_bri 0a458e8248fe395748bd6025d43c002db5a7d343 data/create/recipes/small_deepslate_brick_stairs_from_stone_types_deepslate_stonecutting.json 96e2c36ac2f2899c9681f12f43c8ae232ae09180 data/create/recipes/small_deepslate_brick_wall.json e5644f4227b9cc9b98158ce3ded98bff1ffb97f9 data/create/recipes/small_deepslate_brick_wall_from_stone_types_deepslate_stonecutting.json -e7a3cb889ce6b530cd40f19e23bad943374e61b5 data/create/recipes/small_deepslate_bricks_from_stone_types_deepslate_stonecutting.json +38b80603a86df24f6be0df9fd5f7d9b7aa33d2f9 data/create/recipes/small_diorite_bricks_from_stone_types_diorite_stonecutting.json 6c66b44941c8b97cfec5948b5d8b08355f8d8f67 data/create/recipes/small_diorite_brick_slab.json 801f6cc6e06db56344b37c9b76c69f921c6d9293 data/create/recipes/small_diorite_brick_slab_from_stone_types_diorite_stonecutting.json c1fe4bff306e2d2b5d5595e4b35dd85f7e6bf0ce data/create/recipes/small_diorite_brick_slab_recycling.json @@ -4578,7 +4579,7 @@ af6feedf00bdfa45c1b8f0dd46ddaa80da622fed data/create/recipes/small_diorite_brick 30a6f2bdfec2b3f578572c9f94112906411e7c54 data/create/recipes/small_diorite_brick_stairs_from_stone_types_diorite_stonecutting.json 8728b791808736de2ac31e8dc81aa43638ae0ac8 data/create/recipes/small_diorite_brick_wall.json 7a1fdcef7091d76230fbee410fa5241f584845c4 data/create/recipes/small_diorite_brick_wall_from_stone_types_diorite_stonecutting.json -38b80603a86df24f6be0df9fd5f7d9b7aa33d2f9 data/create/recipes/small_diorite_bricks_from_stone_types_diorite_stonecutting.json +8840d538648516dd02628fbe3ea4f032ceda78bb data/create/recipes/small_dripstone_bricks_from_stone_types_dripstone_stonecutting.json 39a545b60040bd2d922cd3bd5af5036b1b9b23ef data/create/recipes/small_dripstone_brick_slab.json c91e4dc211305456c38e5823def91811ad851202 data/create/recipes/small_dripstone_brick_slab_from_stone_types_dripstone_stonecutting.json 55bb37d07e841bb8eecf2013445c01c8e09ff824 data/create/recipes/small_dripstone_brick_slab_recycling.json @@ -4586,7 +4587,7 @@ c91e4dc211305456c38e5823def91811ad851202 data/create/recipes/small_dripstone_bri 1e23c8df90aef6cd3561369f72c6c3106da883f5 data/create/recipes/small_dripstone_brick_stairs_from_stone_types_dripstone_stonecutting.json fda46cc15c21e7843537df5b5331874fd7511e19 data/create/recipes/small_dripstone_brick_wall.json 336e47b35437ffea4bb86d34f94e6361b2bbcfb0 data/create/recipes/small_dripstone_brick_wall_from_stone_types_dripstone_stonecutting.json -8840d538648516dd02628fbe3ea4f032ceda78bb data/create/recipes/small_dripstone_bricks_from_stone_types_dripstone_stonecutting.json +42c74dec6c64d3675e15b2b73cb32fc9d24839e9 data/create/recipes/small_granite_bricks_from_stone_types_granite_stonecutting.json d1bb4e91d80ca8eb9c2f935cbb66ef08b9ca7059 data/create/recipes/small_granite_brick_slab.json ddb2f4652607b56332a927af939212a5789a34db data/create/recipes/small_granite_brick_slab_from_stone_types_granite_stonecutting.json f1388636bcf98d7d9103c23528053b28c6305b4e data/create/recipes/small_granite_brick_slab_recycling.json @@ -4594,7 +4595,7 @@ f1388636bcf98d7d9103c23528053b28c6305b4e data/create/recipes/small_granite_brick ba935a3d64eedbd9b7017d0abfab351f57589593 data/create/recipes/small_granite_brick_stairs_from_stone_types_granite_stonecutting.json dac22c54e8034587a3fcf3aa0ce19bb4b7607cd7 data/create/recipes/small_granite_brick_wall.json 7a8d9e2291675de9e72363d93410de9039216f32 data/create/recipes/small_granite_brick_wall_from_stone_types_granite_stonecutting.json -42c74dec6c64d3675e15b2b73cb32fc9d24839e9 data/create/recipes/small_granite_bricks_from_stone_types_granite_stonecutting.json +714f6a84a5b3d5d57c07364925555e6f545b0b3d data/create/recipes/small_limestone_bricks_from_stone_types_limestone_stonecutting.json b844632a588cb96397750f4387c7e6517f85092c data/create/recipes/small_limestone_brick_slab.json a1c0bc263cd4659a89213f4fcdd87eba7ae04427 data/create/recipes/small_limestone_brick_slab_from_stone_types_limestone_stonecutting.json ec9154a3791113f57dc1c16dfef4c837533b6fc6 data/create/recipes/small_limestone_brick_slab_recycling.json @@ -4602,7 +4603,7 @@ ec9154a3791113f57dc1c16dfef4c837533b6fc6 data/create/recipes/small_limestone_bri 6943fdc8162e4d53c459f425b2ff5b34e9caa477 data/create/recipes/small_limestone_brick_stairs_from_stone_types_limestone_stonecutting.json 27ff69345efea14b9688fe9b182809995ea8ad4a data/create/recipes/small_limestone_brick_wall.json 98a83f757f0ac9cc2a876ae407bb5765071e700d data/create/recipes/small_limestone_brick_wall_from_stone_types_limestone_stonecutting.json -714f6a84a5b3d5d57c07364925555e6f545b0b3d data/create/recipes/small_limestone_bricks_from_stone_types_limestone_stonecutting.json +22c69e391110280e13d50693b9c81355da57a315 data/create/recipes/small_ochrum_bricks_from_stone_types_ochrum_stonecutting.json abdd280694cb30ce0d2703aadeeb378af9a7f8b2 data/create/recipes/small_ochrum_brick_slab.json e37612fa2523fa3711242cac4ec5e596b3e55698 data/create/recipes/small_ochrum_brick_slab_from_stone_types_ochrum_stonecutting.json 8f3f47cb3e759104cf86a422339345f8795143d3 data/create/recipes/small_ochrum_brick_slab_recycling.json @@ -4610,8 +4611,8 @@ de8d7f8e57645c0b5a6e98eb0cc4e573c5cf96ac data/create/recipes/small_ochrum_brick_ 04ebbdd14f81f4b4dc7986cb5241caa9f48f4ff1 data/create/recipes/small_ochrum_brick_stairs_from_stone_types_ochrum_stonecutting.json 07876725f97ff611f8d1710462224f07cab3ebbd data/create/recipes/small_ochrum_brick_wall.json 2331801569ec95562afc802f7e2ff191d329a5c6 data/create/recipes/small_ochrum_brick_wall_from_stone_types_ochrum_stonecutting.json -22c69e391110280e13d50693b9c81355da57a315 data/create/recipes/small_ochrum_bricks_from_stone_types_ochrum_stonecutting.json 68a9f80b97d9322ed33067d7717180494b904bed data/create/recipes/small_rose_quartz_tiles_from_polished_rose_quartz_stonecutting.json +bf27af2e54ed1b09611d67ee7afa6c7f56d00d09 data/create/recipes/small_scorchia_bricks_from_stone_types_scorchia_stonecutting.json 133057778480e1d2e13fe7b2766ba0891feea3a5 data/create/recipes/small_scorchia_brick_slab.json dad342d215c98f3214752e0ebfaf3015943c5ac7 data/create/recipes/small_scorchia_brick_slab_from_stone_types_scorchia_stonecutting.json 0a57ad5fce22d69cdc1dd880403612ffb47af4ba data/create/recipes/small_scorchia_brick_slab_recycling.json @@ -4619,7 +4620,7 @@ dad342d215c98f3214752e0ebfaf3015943c5ac7 data/create/recipes/small_scorchia_bric 7f89c9c6dcea06a3022c72029a5e547aa1721773 data/create/recipes/small_scorchia_brick_stairs_from_stone_types_scorchia_stonecutting.json 43310b3fa43bd791ef0e2e30971a24e788c20139 data/create/recipes/small_scorchia_brick_wall.json de8edc4fa5eec031ad0a63c7f59141985ae9af9e data/create/recipes/small_scorchia_brick_wall_from_stone_types_scorchia_stonecutting.json -bf27af2e54ed1b09611d67ee7afa6c7f56d00d09 data/create/recipes/small_scorchia_bricks_from_stone_types_scorchia_stonecutting.json +b1a67d052e26c2129c34ee0732cfe533beb3e571 data/create/recipes/small_scoria_bricks_from_stone_types_scoria_stonecutting.json d8a41adcc6ae9b0eb71a83b2dd89ff92a10e0057 data/create/recipes/small_scoria_brick_slab.json 34f4dd094f2949e3fd21f95ac890ae803b81fbea data/create/recipes/small_scoria_brick_slab_from_stone_types_scoria_stonecutting.json f15ad1cb05f5b02b630b982d23bd951178a3650c data/create/recipes/small_scoria_brick_slab_recycling.json @@ -4627,7 +4628,7 @@ df5a1437fb112519d904cc9f1cd28d5d891fb04d data/create/recipes/small_scoria_brick_ d36428daf8bf4e560f649e5eb40a8cd7a27e7a0e data/create/recipes/small_scoria_brick_stairs_from_stone_types_scoria_stonecutting.json cad432398d8886d60b94e96b2c2096ae27fffb50 data/create/recipes/small_scoria_brick_wall.json 9cff8370aaa81ece466fe15642c00a9992bd416c data/create/recipes/small_scoria_brick_wall_from_stone_types_scoria_stonecutting.json -b1a67d052e26c2129c34ee0732cfe533beb3e571 data/create/recipes/small_scoria_bricks_from_stone_types_scoria_stonecutting.json +e51ced16059f7c37fe3652a1cf4d938f91e956fc data/create/recipes/small_tuff_bricks_from_stone_types_tuff_stonecutting.json dd83af4a10a9b0ba6a4efb272d8b6b1611524a39 data/create/recipes/small_tuff_brick_slab.json e3a12b87830e47387e9ac118bb3d12b73558d757 data/create/recipes/small_tuff_brick_slab_from_stone_types_tuff_stonecutting.json 85dff00dc49eaf65f1f149a7f21a9f307b1b9710 data/create/recipes/small_tuff_brick_slab_recycling.json @@ -4635,7 +4636,7 @@ e03a8270b01b9a5cad238db4ce2b8f66ea78e8bf data/create/recipes/small_tuff_brick_st cd50bb5842c90038f6ac74e45971ab2e914d1463 data/create/recipes/small_tuff_brick_stairs_from_stone_types_tuff_stonecutting.json e795fbe5062ec47cc660ee26c8398477509c5f18 data/create/recipes/small_tuff_brick_wall.json 34471a7ebb431b6d1e3be5fa480b800b96556fee data/create/recipes/small_tuff_brick_wall_from_stone_types_tuff_stonecutting.json -e51ced16059f7c37fe3652a1cf4d938f91e956fc data/create/recipes/small_tuff_bricks_from_stone_types_tuff_stonecutting.json +82f17edc61a319c74dbdfa730584305899bd7572 data/create/recipes/small_veridium_bricks_from_stone_types_veridium_stonecutting.json f9a2f4ca078364e05b3446fe890ea207e5a56e87 data/create/recipes/small_veridium_brick_slab.json 234c3baee4c9428caab3e344f396ec87064103e3 data/create/recipes/small_veridium_brick_slab_from_stone_types_veridium_stonecutting.json b0db8335e3c7fd88f074c3895bea952efc0e8df8 data/create/recipes/small_veridium_brick_slab_recycling.json @@ -4643,7 +4644,6 @@ a1e214c230574526ca0a2fec059b4157ddec557d data/create/recipes/small_veridium_bric f63031587a64ed88ddba1df07767dd8d8caa1d2e data/create/recipes/small_veridium_brick_stairs_from_stone_types_veridium_stonecutting.json 9b003fbf2bcd975501ba307ea68c6c4bab397683 data/create/recipes/small_veridium_brick_wall.json 1ba48c5cae05b6f4b1ad223ce80925f1eaaf5dfd data/create/recipes/small_veridium_brick_wall_from_stone_types_veridium_stonecutting.json -82f17edc61a319c74dbdfa730584305899bd7572 data/create/recipes/small_veridium_bricks_from_stone_types_veridium_stonecutting.json 47973044b19b35ce169e7d46abc9d11a2f67a487 data/create/recipes/spruce_window.json 810544f79bf4b002981e614eaa8e49b48a7b5397 data/create/recipes/spruce_window_pane.json e343a80c92dab60f99c9b441d00189aceee477a0 data/create/recipes/tiled_glass_from_glass_colorless_stonecutting.json diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index f2105984d2..a6dcc92cbb 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -2128,7 +2128,7 @@ "create.ponder.nixie_tube.text_1": "ɥʇbuǝɹʇs ןɐubıs ǝɥʇ ʎɐןdsıp ןןıʍ sǝqn⟘ ǝıxıN 'ǝuoʇspǝᴚ ʎq pǝɹǝʍod uǝɥM", "create.ponder.nixie_tube.text_2": "pǝʎɐןdsıp ǝq uɐɔ ʇxǝʇ ɯoʇsnɔ 'spɹɐoqdıןƆ uǝʇʇıɹʍ buıs∩", "create.ponder.nixie_tube.text_3": "ɹnoןoɔ ʎɐןdsıp ɹıǝɥʇ ǝbuɐɥɔ oʇ ǝʎᗡ ɥʇıʍ ʞɔıןƆ-ʇɥbıᴚ", - "create.ponder.package_frogport.header": "sʇɹodboɹℲ ɥʇıʍ sǝbɐʞɔɐd buıʇɹodsuɐɹ⟘", + "create.ponder.package_frogport.header": "sʇɹodboɹℲ uǝǝʍʇǝq sǝbɐʞɔɐd buıʇɹodsuɐɹ⟘", "create.ponder.package_frogport.text_1": "ʎqɹɐǝu ʇɹodboɹℲ ǝɥʇ ǝɔɐןd puɐ ɹoʎǝʌuoƆ uıɐɥƆ ɐ ʞɔıןɔ-ʇɥbıᴚ", "create.ponder.package_frogport.text_10": "ʞɹoʍʇǝu uıɐɥɔ ǝɥʇ uo boɹɟ buıɥɔʇɐɯ ɐ oʇ ɥʇɐd ɹıǝɥʇ puıɟ sǝbɐʞɔɐԀ", "create.ponder.package_frogport.text_11": "ɹǝʇǝԀ", @@ -2140,8 +2140,8 @@ "create.ponder.package_frogport.text_17": ",ɹǝʇǝԀ, oʇ sǝbɐʞɔɐd sǝssǝɹppⱯ", "create.ponder.package_frogport.text_18": "ssǝɹppɐ ɹıǝɥʇ ʇɔǝןןoɔ oʇ pɹɐoqdıןɔ ɐ ɥʇıʍ sʇɹodboɹℲ ʞɔıןɔ-ʇɥbıᴚ", "create.ponder.package_frogport.text_19": "sI∩ ɹǝɥʇo uı sʇnduı ssǝɹppɐ ǝʇǝןdɯoɔ-oʇnɐ dןǝɥ uɐɔ sǝɯɐu pǝʇɔǝןןoɔ ɥʇıʍ spɹɐoqdıןƆ", - "create.ponder.package_frogport.text_2": "I∩ ʎɹoʇuǝʌuı ɹıǝɥʇ uı ǝɯɐu ɐ uǝʌıb ǝq uɐɔ ʎǝɥ⟘", - "create.ponder.package_frogport.text_3": "˙˙ǝɯɐu ʇuǝɹǝɟɟıp ɐ oʇ pǝssǝɹppɐ sı ǝbɐʞɔɐd ɐ ɟI", + "create.ponder.package_frogport.text_2": "I∩ ʎɹoʇuǝʌuı ǝɥʇ uı ssǝɹppɐ uɐ ʇı ubıssⱯ", + "create.ponder.package_frogport.text_3": "˙˙ʇı ɥɔʇɐɯ ʇou sǝop ǝbɐʞɔɐd pǝʇɹǝsuı uɐ ɟo ssǝɹppɐ ǝɥʇ ɟI", "create.ponder.package_frogport.text_4": "ʇɹǝqןⱯ", "create.ponder.package_frogport.text_5": "ɹǝʇǝԀ →", "create.ponder.package_frogport.text_6": "ɹoʎǝʌuoɔ ǝɥʇ uo ǝbɐʞɔɐd ǝɥʇ ǝɔɐןd ןןıʍ ʇɹodboɹℲ ǝɥʇ˙˙", @@ -2191,6 +2191,19 @@ "create.ponder.portable_storage_interface.text_8": "ʎɐʍ sʇı uo ǝnuıʇuoɔ ןןıʍ uoıʇdɐɹʇuoɔ ǝɥʇ 'ǝןıɥʍ ɐ ɹoɟ pǝbuɐɥɔxǝ uǝǝq ǝʌɐɥ sɯǝʇı ou ɹǝʇɟⱯ", "create.ponder.portable_storage_interface_redstone.header": "ןoɹʇuoƆ ǝuoʇspǝᴚ", "create.ponder.portable_storage_interface_redstone.text_1": "buıbɐbuǝ ɯoɹɟ ǝɔɐɟɹǝʇuı ʎɹɐuoıʇɐʇs ǝɥʇ ʇuǝʌǝɹd ןןıʍ ɹǝʍod ǝuoʇspǝᴚ", + "create.ponder.postbox.header": "sǝxoqʇsoԀ uǝǝʍʇǝq sǝbɐʞɔɐd buıʇɹodsuɐɹ⟘", + "create.ponder.postbox.text_1": "ʎqɹɐǝu xoqʇsoԀ ǝɥʇ ǝɔɐןd puɐ uoıʇɐʇS uıɐɹ⟘ ɐ ʞɔıןɔ-ʇɥbıᴚ", + "create.ponder.postbox.text_10": "ǝsnoɥǝɹɐM →", + "create.ponder.postbox.text_11": "sʞunɥɔ pǝpɐoןun uı ɹnoıʌɐɥǝq ɹıǝɥʇ uıɐʇuıɐɯ sǝxoqʇsoԀ 'suıɐɹʇ ǝʞıן ʇsnſ", + "create.ponder.postbox.text_12": "ʎɹoʇuǝʌuı ɹıǝɥʇ oʇ ɹo ɯoɹɟ pǝɹǝʌıןǝp ǝq ןןıʇs uɐɔ sǝbɐʞɔɐԀ", + "create.ponder.postbox.text_2": "I∩ ʎɹoʇuǝʌuı ǝɥʇ uı ssǝɹppɐ uɐ ʇı ubıssⱯ", + "create.ponder.postbox.text_3": "˙˙ʇı ɥɔʇɐɯ ʇou sǝop ǝbɐʞɔɐd pǝʇɹǝsuı uɐ ɟo ssǝɹppɐ ǝɥʇ ɟI", + "create.ponder.postbox.text_4": "ǝsnoɥǝɹɐM", + "create.ponder.postbox.text_5": "ʇsodʇnO →", + "create.ponder.postbox.text_6": "obɹɐɔ sɐ ʇı ʇɔǝןןoɔ ןןıʍ uoıʇɐʇs ǝɥʇ ʇɐ buıddoʇs suıɐɹʇ˙˙", + "create.ponder.postbox.text_7": "ɟɟo pǝddoɹp ǝq ןןıʍ ssǝɹppɐ ǝɥʇ buıɥɔʇɐɯ sǝbɐʞɔɐd 'ʎןǝsɹǝʌuoƆ", + "create.ponder.postbox.text_8": "xoqʇsoԀ ǝɥʇ ɯoɹɟ pǝʇɔɐɹʇxǝ ǝq uɐɔ uıɐɹʇ ʎq pǝʌıɹɹɐ ʇɐɥʇ sǝbɐʞɔɐԀ", + "create.ponder.postbox.text_9": "ǝsnoɥǝɹɐM", "create.ponder.powered_latch.header": "ɥɔʇɐꞀ pǝɹǝʍoԀ ǝɥʇ buısn sןɐubıs buıןןoɹʇuoƆ", "create.ponder.powered_latch.text_1": "sɹǝʌǝꞀ ǝןqɐןןoɹʇuoɔ ǝuoʇspǝɹ ǝɹɐ sǝɥɔʇɐꞀ pǝɹǝʍoԀ", "create.ponder.powered_latch.text_2": "uo ʇı ɥɔʇıʍs ʞɔɐq ǝɥʇ ʇɐ sןɐubıS", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 6fbc360708..b44a768e30 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -2128,7 +2128,7 @@ "create.ponder.nixie_tube.text_1": "When powered by Redstone, Nixie Tubes will display the signal strength", "create.ponder.nixie_tube.text_2": "Using written Clipboards, custom text can be displayed", "create.ponder.nixie_tube.text_3": "Right-Click with Dye to change their display colour", - "create.ponder.package_frogport.header": "Transporting packages with Frogports", + "create.ponder.package_frogport.header": "Transporting packages between Frogports", "create.ponder.package_frogport.text_1": "Right-click a Chain Conveyor and place the Frogport nearby", "create.ponder.package_frogport.text_10": "Packages find their path to a matching frog on the chain network", "create.ponder.package_frogport.text_11": "Peter", @@ -2140,8 +2140,8 @@ "create.ponder.package_frogport.text_17": "Addresses packages to 'Peter'", "create.ponder.package_frogport.text_18": "Right-click Frogports with a clipboard to collect their address", "create.ponder.package_frogport.text_19": "Clipboards with collected names can help auto-complete address inputs in other UIs", - "create.ponder.package_frogport.text_2": "They can be given a name in their inventory UI", - "create.ponder.package_frogport.text_3": "If a package is addressed to a different name..", + "create.ponder.package_frogport.text_2": "Assign it an address in the inventory UI", + "create.ponder.package_frogport.text_3": "If the address of an inserted package does not match it..", "create.ponder.package_frogport.text_4": "Albert", "create.ponder.package_frogport.text_5": "→ Peter", "create.ponder.package_frogport.text_6": "..the Frogport will place the package on the conveyor", @@ -2191,6 +2191,19 @@ "create.ponder.portable_storage_interface.text_8": "After no items have been exchanged for a while, the contraption will continue on its way", "create.ponder.portable_storage_interface_redstone.header": "Redstone Control", "create.ponder.portable_storage_interface_redstone.text_1": "Redstone power will prevent the stationary interface from engaging", + "create.ponder.postbox.header": "Transporting packages between Postboxes", + "create.ponder.postbox.text_1": "Right-click a Train Station and place the Postbox nearby", + "create.ponder.postbox.text_10": "→ Warehouse", + "create.ponder.postbox.text_11": "Just like trains, Postboxes maintain their behaviour in unloaded chunks", + "create.ponder.postbox.text_12": "Packages can still be delivered from or to their inventory", + "create.ponder.postbox.text_2": "Assign it an address in the inventory UI", + "create.ponder.postbox.text_3": "If the address of an inserted package does not match it..", + "create.ponder.postbox.text_4": "Warehouse", + "create.ponder.postbox.text_5": "→ Outpost", + "create.ponder.postbox.text_6": "..trains stopping at the station will collect it as cargo", + "create.ponder.postbox.text_7": "Conversely, packages matching the address will be dropped off", + "create.ponder.postbox.text_8": "Packages that arrived by train can be extracted from the Postbox", + "create.ponder.postbox.text_9": "Warehouse", "create.ponder.powered_latch.header": "Controlling signals using the Powered Latch", "create.ponder.powered_latch.text_1": "Powered Latches are redstone controllable Levers", "create.ponder.powered_latch.text_2": "Signals at the back switch it on", diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/postbox/PostboxBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/postbox/PostboxBlockEntity.java index 271b8042f8..961570bc03 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/postbox/PostboxBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/postbox/PostboxBlockEntity.java @@ -25,6 +25,7 @@ public class PostboxBlockEntity extends PackagePortBlockEntity { public WeakReference trackedGlobalStation; public LerpedFloat flag; + public boolean forceFlag; private boolean sendParticles; @@ -38,7 +39,7 @@ public class PostboxBlockEntity extends PackagePortBlockEntity { @Override public void tick() { super.tick(); - if (!level.isClientSide) { + if (!level.isClientSide && !isVirtual()) { if (sendParticles) sendData(); return; @@ -46,7 +47,7 @@ public class PostboxBlockEntity extends PackagePortBlockEntity { float currentTarget = flag.getChaseTarget(); if (currentTarget == 0 || flag.settled()) { - int target = inventory.isEmpty() ? 0 : 1; + int target = (inventory.isEmpty() && !forceFlag) ? 0 : 1; if (target != currentTarget) { flag.chase(target, 0.1f, Chaser.LINEAR); if (target == 1) diff --git a/src/main/java/com/simibubi/create/foundation/ponder/CreatePonderPlugin.java b/src/main/java/com/simibubi/create/foundation/ponder/CreatePonderPlugin.java index 6b7632bd3f..684c8b4b72 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/CreatePonderPlugin.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/CreatePonderPlugin.java @@ -3,6 +3,8 @@ package com.simibubi.create.foundation.ponder; import com.simibubi.create.AllBlocks; import com.simibubi.create.Create; import com.simibubi.create.content.kinetics.crank.ValveHandleBlock; +import com.simibubi.create.content.logistics.packagePort.postbox.PostboxBlock; +import com.simibubi.create.content.logistics.tableCloth.TableClothBlock; import com.simibubi.create.infrastructure.ponder.AllCreatePonderScenes; import com.simibubi.create.infrastructure.ponder.AllCreatePonderTags; @@ -13,6 +15,7 @@ import net.createmod.ponder.api.registration.PonderSceneRegistrationHelper; import net.createmod.ponder.api.registration.PonderTagRegistrationHelper; import net.createmod.ponder.api.registration.SharedTextRegistrationHelper; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.DyeColor; public class CreatePonderPlugin implements PonderPlugin { @@ -51,5 +54,7 @@ public class CreatePonderPlugin implements PonderPlugin { @Override public void indexExclusions(IndexExclusionHelper helper) { helper.excludeBlockVariants(ValveHandleBlock.class, AllBlocks.COPPER_VALVE_HANDLE.get()); + helper.excludeBlockVariants(PostboxBlock.class, AllBlocks.PACKAGE_POSTBOXES.get(DyeColor.WHITE).get()); + helper.excludeBlockVariants(TableClothBlock.class, AllBlocks.TABLE_CLOTHS.get(DyeColor.WHITE).get()); } } diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderScenes.java index 1d56d16323..f648ae5bbb 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderScenes.java @@ -43,6 +43,7 @@ import com.simibubi.create.infrastructure.ponder.scenes.fluid.PumpScenes; import com.simibubi.create.infrastructure.ponder.scenes.fluid.SpoutScenes; import com.simibubi.create.infrastructure.ponder.scenes.highLogistics.FrogAndConveyorScenes; import com.simibubi.create.infrastructure.ponder.scenes.highLogistics.PackagerScenes; +import com.simibubi.create.infrastructure.ponder.scenes.highLogistics.PostboxScenes; import com.simibubi.create.infrastructure.ponder.scenes.trains.TrackObserverScenes; import com.simibubi.create.infrastructure.ponder.scenes.trains.TrackScenes; import com.simibubi.create.infrastructure.ponder.scenes.trains.TrainScenes; @@ -54,6 +55,7 @@ import com.tterrag.registrate.util.entry.RegistryEntry; import net.createmod.ponder.api.registration.PonderSceneRegistrationHelper; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.DyeColor; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.RegistryObject; @@ -354,6 +356,8 @@ public class AllCreatePonderScenes { .addStoryBoard("high_logistics/chain_conveyor", FrogAndConveyorScenes::conveyor); HELPER.forComponents(AllBlocks.PACKAGE_FROGPORT) .addStoryBoard("high_logistics/package_frogport", FrogAndConveyorScenes::frogPort); + HELPER.forComponents(AllBlocks.PACKAGE_POSTBOXES.toArray()) + .addStoryBoard("high_logistics/package_postbox", PostboxScenes::postbox); HELPER.forComponents(AllBlocks.PACKAGER) .addStoryBoard("high_logistics/packager", PackagerScenes::packager) .addStoryBoard("high_logistics/packager_address", PackagerScenes::packagerAddress); diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/FrogAndConveyorScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/FrogAndConveyorScenes.java index 7c83de7bd4..30f25bd262 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/FrogAndConveyorScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/FrogAndConveyorScenes.java @@ -376,7 +376,7 @@ public class FrogAndConveyorScenes { public static void frogPort(SceneBuilder builder, SceneBuildingUtil util) { CreateSceneBuilder scene = new CreateSceneBuilder(builder); - scene.title("package_frogport", "Transporting packages with Frogports"); + scene.title("package_frogport", "Transporting packages between Frogports"); scene.configureBasePlate(0, 0, 9); scene.scaleSceneView(.75f); scene.setSceneOffsetY(-1); @@ -526,7 +526,7 @@ public class FrogAndConveyorScenes { .position(fromFrog.below()), 70) .attachKeyFrame() .colored(PonderPalette.BLUE) - .text("They can be given a name in their inventory UI") + .text("Assign it an address in the inventory UI") .pointAt(util.vector() .topOf(fromFrog.below())) .placeNearTarget(); @@ -568,7 +568,7 @@ public class FrogAndConveyorScenes { scene.overlay() .showText(60) .attachKeyFrame() - .text("If a package is addressed to a different name..") + .text("If the address of an inserted package does not match it..") .pointAt(util.vector() .topOf(5, 0, 3)) .placeNearTarget(); diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/PostboxScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/PostboxScenes.java new file mode 100644 index 0000000000..ae1f07507a --- /dev/null +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/PostboxScenes.java @@ -0,0 +1,477 @@ +package com.simibubi.create.infrastructure.ponder.scenes.highLogistics; + +import java.util.List; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.content.logistics.box.PackageItem; +import com.simibubi.create.content.logistics.box.PackageStyles; +import com.simibubi.create.content.logistics.packagePort.postbox.PostboxBlockEntity; +import com.simibubi.create.foundation.ponder.CreateSceneBuilder; + +import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.PonderPalette; +import net.createmod.ponder.api.element.ElementLink; +import net.createmod.ponder.api.element.ParrotElement; +import net.createmod.ponder.api.element.ParrotPose.FacePointOfInterestPose; +import net.createmod.ponder.api.element.WorldSectionElement; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; +import net.createmod.ponder.api.scene.Selection; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; + +public class PostboxScenes { + + public static void postbox(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); + scene.title("postbox", "Transporting packages between Postboxes"); + scene.configureBasePlate(0, 1, 9); + scene.scaleSceneView(.875f); + scene.setSceneOffsetY(-0.5f); + + BlockPos station = util.grid() + .at(1, 1, 8); + Selection stationS = util.select() + .position(1, 1, 8); + BlockPos box2 = util.grid() + .at(3, 1, 8); + Selection box2S = util.select() + .position(3, 1, 8); + Selection glass = util.select() + .fromTo(3, 1, 9, 1, 1, 9); + BlockPos box = util.grid() + .at(1, 2, 2); + Selection boxS = util.select() + .position(1, 2, 2); + Selection girder = util.select() + .position(1, 1, 2); + Selection belt = util.select() + .fromTo(4, 1, 2, 2, 1, 2); + Selection cog = util.select() + .fromTo(4, 1, 1, 4, 1, 0); + Selection largeCog = util.select() + .position(5, 0, 0); + Selection train1 = util.select() + .fromTo(0, 2, 4, 3, 3, 6); + Selection train2 = util.select() + .fromTo(4, 2, 4, 8, 3, 6); + BlockPos controls = util.grid() + .at(2, 3, 5); + Selection tracks = util.select() + .fromTo(9, 1, 5, 30, 1, 5); + BlockPos funnel = util.grid() + .at(2, 2, 2); + + ItemStack boxItem2 = PackageItem.containing(List.of()); + PackageItem.addAddress(boxItem2, "Peter"); + scene.world() + .createItemOnBeltLike(util.grid() + .at(6, 2, 4), Direction.DOWN, boxItem2); + + scene.world() + .toggleControls(controls); + ElementLink base = scene.world() + .showIndependentSection(util.select() + .fromTo(0, 0, 1, 8, 0, 9), Direction.UP); + scene.idle(10); + + ElementLink tracksL = scene.world() + .showIndependentSection(util.select() + .position(8, 1, 5), Direction.DOWN); + scene.idle(1); + for (int i = 7; i >= 0; i--) { + scene.world() + .showSectionAndMerge(util.select() + .position(i, 1, 5), Direction.DOWN, tracksL); + scene.idle(1); + } + scene.idle(5); + + scene.world() + .showSectionAndMerge(stationS, Direction.DOWN, base); + scene.idle(15); + + Vec3 fromTarget = util.vector() + .topOf(station); + + ItemStack postboxItem = AllBlocks.PACKAGE_POSTBOXES.get(DyeColor.WHITE) + .asStack(); + scene.overlay() + .showControls(fromTarget, Pointing.DOWN, 50) + .rightClick() + .withItem(postboxItem); + scene.idle(5); + + AABB bb1 = new AABB(fromTarget, fromTarget); + scene.overlay() + .chaseBoundingBoxOutline(PonderPalette.WHITE, box, bb1, 10); + scene.idle(1); + scene.overlay() + .chaseBoundingBoxOutline(PonderPalette.WHITE, box, bb1.inflate(0.025, 0.025, 0.025), 50); + scene.idle(26); + + scene.overlay() + .showText(80) + .text("Right-click a Train Station and place the Postbox nearby") + .attachKeyFrame() + .placeNearTarget() + .pointAt(fromTarget); + + scene.idle(40); + + ElementLink postboxE = scene.world() + .showIndependentSection(boxS, Direction.DOWN); + scene.world() + .moveSection(postboxE, util.vector() + .of(0, -1, 0), 0); + + scene.idle(15); + scene.overlay() + .chaseBoundingBoxOutline(PonderPalette.GREEN, box, bb1.inflate(0.025, 0.025, 0.025), 50); + + AABB bb2 = new AABB(box.below()).deflate(0.125, 0, 0) + .contract(0, 0.125, 0); + + scene.overlay() + .chaseBoundingBoxOutline(PonderPalette.GREEN, box2, bb2, 50); + scene.idle(10); + scene.overlay() + .showLine(PonderPalette.GREEN, util.vector() + .topOf(box.below()), fromTarget, 40); + scene.idle(45); + + scene.overlay() + .showControls(util.vector() + .topOf(box.below()), Pointing.DOWN, 40) + .rightClick(); + scene.idle(7); + scene.overlay() + .chaseBoundingBoxOutline(PonderPalette.BLUE, funnel, bb2, 70); + scene.overlay() + .showText(70) + .attachKeyFrame() + .colored(PonderPalette.BLUE) + .text("Assign it an address in the inventory UI") + .pointAt(util.vector() + .topOf(box.below())) + .placeNearTarget(); + scene.idle(80); + + scene.world() + .moveSection(postboxE, util.vector() + .of(0, 1, 0), 10); + scene.idle(10); + scene.world() + .showSectionAndMerge(girder, Direction.NORTH, base); + scene.idle(5); + scene.world() + .showSectionAndMerge(largeCog, Direction.UP, base); + scene.world() + .showSectionAndMerge(cog, Direction.DOWN, base); + scene.world() + .showSectionAndMerge(belt, Direction.WEST, base); + scene.idle(5); + + scene.world() + .showSectionAndMerge(util.select() + .position(funnel), Direction.DOWN, base); + scene.idle(10); + + ItemStack boxItem = PackageStyles.getDefaultBox() + .copy(); + PackageItem.addAddress(boxItem, "Peter"); + + scene.world() + .createItemOnBelt(util.grid() + .at(3, 1, 2), Direction.EAST, boxItem); + scene.idle(5); + + scene.world() + .multiplyKineticSpeed(util.select() + .everywhere(), 1 / 32f); + + scene.overlay() + .showText(60) + .attachKeyFrame() + .text("If the address of an inserted package does not match it..") + .pointAt(util.vector() + .centerOf(3, 2, 2)) + .placeNearTarget(); + + scene.idle(70); + + scene.overlay() + .showText(40) + .colored(PonderPalette.BLUE) + .text("Warehouse") + .pointAt(util.vector() + .blockSurface(box, Direction.NORTH) + .add(-.5, 0, 0)) + .placeNearTarget(); + scene.idle(5); + scene.overlay() + .showText(40) + .colored(PonderPalette.OUTPUT) + .text("\u2192 Outpost") + .pointAt(util.vector() + .centerOf(3, 2, 2)) + .placeNearTarget(); + + scene.idle(50); + + scene.world() + .multiplyKineticSpeed(util.select() + .everywhere(), 32f); + scene.idle(17); + scene.world() + .removeItemsFromBelt(util.grid() + .at(2, 1, 2)); + animatePostbox(scene, box, true); + scene.world() + .flapFunnel(funnel, false); + scene.idle(15); + + ElementLink train1L = scene.world() + .showIndependentSection(train1, null); + ElementLink birbL = scene.special() + .createBirb(util.vector() + .of(9.5, 3.5, 5.5), FacePointOfInterestPose::new); + scene.special() + .movePointOfInterest(util.grid() + .at(-5, 4, 5)); + scene.world() + .moveSection(train1L, util.vector() + .of(6, 0, 0), 0); + scene.idle(1); + scene.special() + .moveParrot(birbL, util.vector() + .of(-5, 0, 0), 25); + scene.world() + .moveSection(train1L, util.vector() + .of(-5, 0, 0), 25); + scene.world() + .animateBogey(util.grid() + .at(2, 2, 5), 6, 25); + scene.idle(14); + ElementLink train2L = scene.world() + .showIndependentSection(train2, null); + scene.world() + .moveSection(train2L, util.vector() + .of(3, 0, 0), 0); + scene.idle(1); + scene.world() + .moveSection(train2L, util.vector() + .of(-2, 0, 0), 10); + scene.world() + .animateBogey(util.grid() + .at(6, 2, 5), 2, 10); + + scene.idle(10); + scene.special() + .moveParrot(birbL, util.vector() + .of(-1, 0, 0), 10); + scene.world() + .moveSection(train1L, util.vector() + .of(-1, 0, 0), 10); + scene.world() + .animateBogey(util.grid() + .at(2, 2, 5), 1, 10); + scene.world() + .moveSection(train2L, util.vector() + .of(-1, 0, 0), 10); + scene.world() + .animateBogey(util.grid() + .at(6, 2, 5), 1, 10); + scene.idle(10); + scene.world() + .animateTrainStation(station, true); + scene.idle(10); + scene.effects() + .indicateSuccess(box); + scene.effects() + .indicateSuccess(util.grid() + .at(5, 3, 4)); + scene.world() + .createItemOnBeltLike(util.grid() + .at(5, 2, 4), Direction.DOWN, boxItem); + + scene.idle(15); + animatePostbox(scene, box, false); + scene.overlay() + .showText(80) + .text("..trains stopping at the station will collect it as cargo") + .attachKeyFrame() + .pointAt(util.vector() + .topOf(5, 2, 4)) + .placeNearTarget(); + scene.idle(95); + + scene.overlay() + .showText(80) + .text("Conversely, packages matching the address will be dropped off") + .attachKeyFrame() + .pointAt(util.vector() + .topOf(6, 2, 4)) + .placeNearTarget(); + scene.idle(50); + + scene.world() + .removeItemsFromBelt(util.grid() + .at(6, 2, 4)); + scene.effects() + .indicateSuccess(box); + scene.effects() + .indicateSuccess(util.grid() + .at(6, 2, 4)); + animatePostbox(scene, box, true); + scene.idle(60); + + scene.overlay() + .showText(100) + .text("Packages that arrived by train can be extracted from the Postbox") + .attachKeyFrame() + .pointAt(util.vector() + .blockSurface(box, Direction.NORTH)) + .placeNearTarget(); + scene.idle(60); + + scene.world() + .multiplyKineticSpeed(util.select() + .everywhere(), -1); + scene.world() + .createItemOnBelt(util.grid() + .at(2, 1, 2), Direction.WEST, boxItem2); + animatePostbox(scene, box, false); + scene.idle(25); + scene.world() + .multiplyKineticSpeed(util.select() + .everywhere(), 0); + + scene.idle(25); + scene.overlay() + .showText(40) + .colored(PonderPalette.BLUE) + .text("Warehouse") + .pointAt(util.vector() + .blockSurface(box, Direction.NORTH) + .add(-.5, 0, 0)) + .placeNearTarget(); + scene.idle(5); + scene.overlay() + .showText(40) + .colored(PonderPalette.OUTPUT) + .text("\u2192 Warehouse") + .pointAt(util.vector() + .centerOf(3, 2, 2) + .add(0, -.25, 0)) + .placeNearTarget(); + + scene.idle(50); + + ElementLink tracksL2 = scene.world() + .showIndependentSection(tracks, Direction.EAST); + scene.world() + .moveSection(tracksL2, util.vector() + .of(-31, 0, 0), 0); + + scene.idle(15); + scene.world() + .animateTrainStation(station, false); + scene.world() + .moveSection(tracksL, util.vector() + .of(12, 0, 0), 120); + scene.world() + .moveSection(tracksL2, util.vector() + .of(12, 0, 0), 120); + scene.world() + .moveSection(postboxE, util.vector() + .of(12, 0, 0), 120); + scene.world() + .moveSection(base, util.vector() + .of(12, 0, 0), 120); + scene.world() + .animateBogey(util.grid() + .at(2, 2, 5), 12f, 120); + scene.world() + .animateBogey(util.grid() + .at(6, 2, 5), 12f, 120); + scene.idle(15); + scene.world() + .hideIndependentSection(base, null); + scene.world() + .hideIndependentSection(postboxE, null); + scene.idle(40); + scene.special() + .hideElement(birbL, null); + scene.world() + .hideIndependentSection(train1L, null); + scene.world() + .hideIndependentSection(train2L, null); + scene.idle(5); + scene.overlay() + .chaseBoundingBoxOutline(PonderPalette.BLUE, train1L, new AABB(util.grid() + .at(1, 3, 4)).inflate(1, .75f, .5f), 280); + scene.overlay() + .chaseBoundingBoxOutline(PonderPalette.BLUE, train2L, new AABB(util.grid() + .at(5, 3, 4)).inflate(1, .75f, .5f), 280); + scene.idle(19); + + ElementLink outpostL = scene.world() + .showIndependentSection(glass, Direction.UP); + scene.world() + .moveSection(outpostL, util.vector() + .of(-4, -1, -1), 0); + scene.idle(1); + scene.world() + .moveSection(outpostL, util.vector() + .of(4, 0, 0), 40); + scene.idle(9); + ElementLink stationL = scene.world() + .showIndependentSection(stationS.add(box2S), Direction.DOWN); + scene.world() + .moveSection(stationL, util.vector() + .of(-3, 0, 0), 0); + scene.idle(1); + scene.world() + .moveSection(stationL, util.vector() + .of(3, 0, 0), 30); + scene.idle(30); + scene.world() + .animateTrainStation(util.grid() + .at(1, 1, 8), true); + scene.idle(10); + + scene.overlay() + .showText(90) + .text("Just like trains, Postboxes maintain their behaviour in unloaded chunks") + .colored(PonderPalette.BLUE) + .attachKeyFrame() + .independent(30); + scene.idle(100); + scene.effects() + .indicateSuccess(util.grid() + .at(3, 1, 8)); + animatePostbox(scene, util.grid() + .at(3, 1, 8), true); + + scene.overlay() + .showText(90) + .text("Packages can still be delivered from or to their inventory") + .colored(PonderPalette.BLUE) + .placeNearTarget() + .pointAt(util.vector() + .blockSurface(util.grid() + .at(3, 1, 8), Direction.NORTH)); + scene.idle(80); + } + + public static void animatePostbox(CreateSceneBuilder scene, BlockPos box, boolean raise) { + scene.world() + .modifyBlockEntity(box, PostboxBlockEntity.class, be -> be.forceFlag = raise); + } + +} diff --git a/src/main/resources/assets/create/ponder/high_logistics/package_postbox.nbt b/src/main/resources/assets/create/ponder/high_logistics/package_postbox.nbt new file mode 100644 index 0000000000000000000000000000000000000000..746cbe6f7e318a7d9ca5eb90d8ca2241374e3ce2 GIT binary patch literal 1996 zcmZ{edpy(oAIEd5B{r)`A*LL%$ep=gIxdGOa~&f_<~r(}ozE74n9rGA+q ztHj7Yi}a{xHi+6h5zjbsNyaVo5Ukw)+2Z5$i8mi9d9kgSH@fiG&F`~ddS-Ka7?s5!P@5aBGSQLJC_#C|0)>GK`ar?e0F+$Wt znWDHX&t|5B@E|GbKHz{tE(AY*@w0C7&*l~#oMCmO)7#Vs#sV&h^rx) z&x-y5G2qHUtRXmn%%W=-KtPw%Sa_|1*Wej3QVSc~BsqX2we(^awF@3f4(tZ;Ggxhd zSh!|EFL*{4#Fqf^T|swGClSu^Lmp8dErp0Al^3 zk@uiC7F`f9=#9c*8qQ4gB}67|Dd%bd0NF#2s$K!FUU(`|ciwE3WJ8Nv>CuVwwhH8i zjUOaG`U(J3U)fV}??t}ka{RrGF`=o}hi=B6K5@J|+gQ4Su>iM99d#TQa)R75pXk_} z1^|Heb@OCfoX}m`>DO|qOrI1=;cMJr-Zz65>VM+~X~@lb4VBVA(2Cot}k zzp|PL!&KGB%t%kVGfXx>wc;FknU`*?*Ro>*p{$D6_ z1i1xa@sl@h>P2=8N6d60ko@u@-a6Z~V()koc+ibwFF+#sANsK8Bej~_`i{9Fr7H8Ne2OA+ z%@xj@b$>kY+iXg+O(X39A2dcS)_Z8TYS^I}oF*0q#uBa%n2kCB!db1%kb)p_f1(fB ze)gr~r5p!|<|OBnYrD-vLl^VLEqNg9lqrbUvL?v%<0 z=wsRwhkV(8d1~Zso2vyo9aKi~g5S+6;s#B1UbPws9?~l{c4K##K2E^^zsx+-T`H~U z*A^7r{mwDDF}+j-ABfVo2k3az;Rt%yH=gHY=Z(^GNWbD(iUpAMn>$#DH+|l0d4dPu9kgH zVy72%;SIvsHVXI@-e}mUSZhO-X*}vSO?G=;?YLY=#Z;i3rvXb*T+NDvx^_7E5VT%3 zEvnALxJ>j5)at6P6=$PDxXHle z#$F-?UEcD|Q2g`fkI%v#%4NTKoZuG5xI)&23j*ePokD}RIZKic#!EnKaoxfo6k!v) z$-5&L{0idoONY6Q!rN+C#=$u8$XEvL({&|-$+v6Tx%~q``*}M$dEi=i%}WwHCw8{C z1%Dd78K-Q;wLEQaGLW^LZ7WjL!`Sv-GtZ0+qBNP8S|~Z z#YiO%d@BF4^`q>jsQ#vpsLn0+%9_0kw22YpEmAp0-h>ebQpbcm`&g&(tsd3&Yneg1 zchK-MTiN2#q5BOu7$?Xu%i3A**71Vb71zVX35gmC1@UVMUHLZikTQ+*k2PA^)_;iS z^0r}B#$Ap#uM#27SM*x|pRmy?4znv--I5g}HqUyWpZSVTrg-P}i&M^q>YW zfdl_&EbPiw7z;F1IXd{cr6rbpF literal 0 HcmV?d00001 From a962ade027c1a31b3564b0b5662d4ee6aaa6385f Mon Sep 17 00:00:00 2001 From: IThundxr Date: Fri, 10 Jan 2025 10:39:48 -0500 Subject: [PATCH 292/515] A new era - Switch to MDG instead of using FG - Implement CI-based mod publishing - Embed commit hash into the built jar - Log commit hash --- .github/ISSUE_TEMPLATE/bug.yml | 65 ++- .github/ISSUE_TEMPLATE/config.yml | 18 +- .github/ISSUE_TEMPLATE/crash.yml | 41 +- .github/config/label-actions.yml | 68 +-- .github/workflows/gametest.yml | 23 - .github/workflows/label-actions.yml | 32 +- .github/workflows/localization.yml | 66 +-- .github/workflows/release.yml | 27 + build.gradle | 468 ++++++++---------- changelog.md | 34 ++ gradle.properties | 7 +- gradle/java.gradle | 5 +- gradle/wrapper/gradle-wrapper.jar | Bin 62076 -> 43583 bytes gradle/wrapper/gradle-wrapper.properties | 3 +- gradlew | 27 +- gradlew.bat | 22 +- settings.gradle | 3 +- .../simibubi/create/CreateBuildInfo.java.peb | 6 + src/main/java/com/simibubi/create/Create.java | 5 +- .../debugInfo/DebugInformation.java | 3 +- .../gui/CreateMainMenuScreen.java | 3 +- 21 files changed, 445 insertions(+), 481 deletions(-) delete mode 100644 .github/workflows/gametest.yml create mode 100644 .github/workflows/release.yml create mode 100644 changelog.md create mode 100644 src/main/java-templates/com/simibubi/create/CreateBuildInfo.java.peb diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml index 2bca6f5e29..9ba28460a0 100644 --- a/.github/ISSUE_TEMPLATE/bug.yml +++ b/.github/ISSUE_TEMPLATE/bug.yml @@ -2,40 +2,37 @@ name: I found a bug! description: "Report some other kind of issue. You should ask in the Discord first to make sure it's actually a bug with Create." labels: [ "type: bug" ] body: - - type: textarea - attributes: - label: Description - description: " - Please describe the issue with as much detail as possible. - Explain what happened, and what should have happened instead. - Add images, screenshots, or videos if they could be useful." - validations: - required: true + - type: textarea + attributes: + label: Description + description: > + Please describe the issue with as much detail as possible. + Explain what happened, and what should have happened instead. + Add images, screenshots, or videos if they could be useful. + validations: + required: true - - type: input - attributes: - label: Game Log - description: " - We need the game log for additional information about the bug. - This file can be found in the \"logs\" folder of your Minecraft folder as \"latest.log\". - Please upload the file to https://mclo.gs/ and put the link here. - Do **not** paste the *contents* of the file here, because that will make this issue very hard to read. - " - validations: - required: true + - type: input + attributes: + label: Game Log + description: > + We need the game log for additional information about the bug. + This file can be found in the \"logs\" folder of your Minecraft folder as \"latest.log\". + Please upload the file to https://mclo.gs/ and put the link here. + Do **not** paste the *contents* of the file here, because that will make this issue very hard to read. + validations: + required: true - - type: textarea - attributes: - label: Debug Information - description: " - Please run the \"/create debuginfo\" command in-game. - This will copy useful information to your clipboard that will greatly help with debugging. - Please paste this information here. - If this command does not exist, you can skip this part. - " - validations: - required: false + - type: textarea + attributes: + label: Debug Information + description: > + Please run the \"/create debuginfo\" command in-game. + This will copy useful information to your clipboard that will greatly help with debugging. + Please paste this information here. + validations: + required: true - - type: markdown - attributes: - value: "Thank you for taking the time to make a report and help improve Create!" + - type: markdown + attributes: + value: "Thank you for taking the time to make a report and help improve Create!" diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index c9c7595f4f..92a8228405 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,11 +1,11 @@ blank_issues_enabled: true contact_links: - - name: I have a question! - url: https://discord.gg/hmaD7Se - about: Join us on Discord and ask the community. - - name: I have a suggestion or idea! - url: https://discord.gg/hmaD7Se - about: These are best discussed with the community and submitted on Discord. - - name: Talk to us on Discord. - url: https://discord.gg/hmaD7Se - about: Ask questions and get help from the community. + - name: I have a question! + url: https://discord.gg/hmaD7Se + about: Join us on Discord and ask the community. + - name: I have a suggestion or idea! + url: https://discord.gg/hmaD7Se + about: These are best discussed with the community and submitted on Discord. + - name: Talk to us on Discord. + url: https://discord.gg/hmaD7Se + about: Ask questions and get help from the community. diff --git a/.github/ISSUE_TEMPLATE/crash.yml b/.github/ISSUE_TEMPLATE/crash.yml index a5d70e2c5b..5529a532b8 100644 --- a/.github/ISSUE_TEMPLATE/crash.yml +++ b/.github/ISSUE_TEMPLATE/crash.yml @@ -2,26 +2,25 @@ name: My game crashed! description: Report an issue that crashes the game. labels: [ "type: crash" ] body: - - type: textarea - attributes: - label: Context - description: What were you doing when the game crashed? Add images, screenshots, or videos if they could be useful. - validations: - required: true + - type: textarea + attributes: + label: Context + description: What were you doing when the game crashed? Add images, screenshots, or videos if they could be useful. + validations: + required: true - - type: input - attributes: - label: Crash Report - description: " - We need the crash report to figure out why the crash happened. - This file can be found in the \"crash-reports\" folder of your Minecraft folder. - It will be the newest file there. - Please upload the file to https://mclo.gs/ and put the link here. - Do **not** paste the *contents* of the file here, because that will make this issue very hard to read. - " - validations: - required: true + - type: input + attributes: + label: Crash Report + description: > + We need the crash report to figure out why the crash happened. + This file can be found in the \"crash-reports\" folder of your Minecraft folder. + It will be the newest file there. + Please upload the file to https://mclo.gs/ and put the link here. + Do **not** paste the *contents* of the file here, because that will make this issue very hard to read. + validations: + required: true - - type: markdown - attributes: - value: "Thank you for taking the time to make a report and help improve Create!" + - type: markdown + attributes: + value: "Thank you for taking the time to make a report and help improve Create!" diff --git a/.github/config/label-actions.yml b/.github/config/label-actions.yml index f257d855d2..76d60dbc05 100644 --- a/.github/config/label-actions.yml +++ b/.github/config/label-actions.yml @@ -3,53 +3,53 @@ # ----------------------------------- ISSUES ----------------------------------- # 'env: fabric': - issues: - close: true - close-reason: 'not planned' - comment: > - **Fabric Loader**: This issue tracker is only for the Forge/NeoForge versions of Create. Since you mentioned using Fabric Loader, please reopen this issue on the [Create Fabric issue tracker](https://github.com/Fabricators-of-Create/Create/issues). Thanks! + issues: + close: true + close-reason: 'not planned' + comment: > + **Fabric Loader**: This issue tracker is only for the Forge/NeoForge versions of Create. Since you mentioned using Fabric Loader, please reopen this issue on the [Create Fabric issue tracker](https://github.com/Fabricators-of-Create/Create/issues). Thanks! 'env: hybrid server': - issues: - close: true - close-reason: 'not planned' - comment: > - **Hybrid Server Software**: Create cannot reasonably support hybrid server software, such as [MohistMC](https://mohistmc.com/), as their changes under the hood make it difficult for larger mods to function properly. If you encounter this issue on official Forge/NeoForge server software, feel free to open a new issue. Otherwise, consider reporting this issue to the hybrid server software you are using. Thanks! + issues: + close: true + close-reason: 'not planned' + comment: > + **Hybrid Server Software**: Create cannot reasonably support hybrid server software, such as [MohistMC](https://mohistmc.com/), as their changes under the hood make it difficult for larger mods to function properly. If you encounter this issue on official Forge/NeoForge server software, feel free to open a new issue. Otherwise, consider reporting this issue to the hybrid server software you are using. Thanks! 'env: outdated create version': - issues: - close: true - close-reason: 'not planned' - comment: > - **Outdated Create Version**: Since you are using an outdated Create version, please update to the latest version as it may resolve your issue. If this issue persists after updating Create, feel free to open a new issue. Thanks! + issues: + close: true + close-reason: 'not planned' + comment: > + **Outdated Create Version**: Since you are using an outdated Create version, please update to the latest version as it may resolve your issue. If this issue persists after updating Create, feel free to open a new issue. Thanks! 'env: pojav': - issues: - close: true - close-reason: 'not planned' - comment: > - **Pojav**: Create does not support Pojav or other mobile launchers due to rendering limitations. If you encounter this issue on a PC, feel free to open a new issue. Thanks! + issues: + close: true + close-reason: 'not planned' + comment: > + **Pojav**: Create does not support Pojav or other mobile launchers due to rendering limitations. If you encounter this issue on a PC, feel free to open a new issue. Thanks! 'env: unsupported minecraft version': - issues: - close: true - close-reason: 'not planned' - comment: > - **Unsupported Minecraft Version**: Unsupported Minecraft versions no longer receive Create updates. Please check the [supported Minecraft versions](https://github.com/Creators-of-Create/Create/wiki/dev.status). If you encounter this issue on a supported Minecraft version, feel free to open a new issue. Thanks! + issues: + close: true + close-reason: 'not planned' + comment: > + **Unsupported Minecraft Version**: Unsupported Minecraft versions no longer receive Create updates. Please check the [supported Minecraft versions](https://github.com/Creators-of-Create/Create/wiki/dev.status). If you encounter this issue on a supported Minecraft version, feel free to open a new issue. Thanks! # ----------------------------------- PULL REQUESTS ----------------------------------- # 'pr status: conflicts': - prs: - comment: > - @{issue-author}, this pull request has merge conflicts with the target branch. Please merge the latest changes and leave a message here so we can continue with the process of reviewing and merging this pull request. Thanks! + prs: + comment: > + @{issue-author}, this pull request has merge conflicts with the target branch. Please merge the latest changes and leave a message here so we can continue with the process of reviewing and merging this pull request. Thanks! 'pr status: waiting for author': - prs: - comment: > - @{issue-author}, a developer has left a review and requested changes. Please make the requested changes or further discuss them with the developer so this pull request can be merged. Thanks! + prs: + comment: > + @{issue-author}, a developer has left a review and requested changes. Please make the requested changes or further discuss them with the developer so this pull request can be merged. Thanks! 'pr status: wrong target': - prs: - comment: > - @{issue-author}, this pull request is targeting the wrong branch. Pull requests should target the branch corresponding to the earliest supported Minecraft version unless the changes are specific to code that only exists for a newer Minecraft version. Please change the target branch, resolve any merge conflicts, and leave a message here so we can continue with the process of reviewing and merging this pull request. Thanks! + prs: + comment: > + @{issue-author}, this pull request is targeting the wrong branch. Pull requests should target the branch corresponding to the earliest supported Minecraft version unless the changes are specific to code that only exists for a newer Minecraft version. Please change the target branch, resolve any merge conflicts, and leave a message here so we can continue with the process of reviewing and merging this pull request. Thanks! diff --git a/.github/workflows/gametest.yml b/.github/workflows/gametest.yml deleted file mode 100644 index 23bb055a98..0000000000 --- a/.github/workflows/gametest.yml +++ /dev/null @@ -1,23 +0,0 @@ -name: gametest -on: [ workflow_dispatch ] - -jobs: - build: - runs-on: ubuntu-latest - steps: - - - name: checkout repository - uses: actions/checkout@v3 - - - name: setup Java - uses: actions/setup-java@v3 - with: - distribution: temurin - java-version: 17 - cache: gradle - - - name: make gradle wrapper executable - run: chmod +x ./gradlew - - - name: run gametests - run: ./gradlew prepareRunGameTestServer runGameTestServer --no-daemon diff --git a/.github/workflows/label-actions.yml b/.github/workflows/label-actions.yml index 1b59fae39c..a9fdcba0bf 100644 --- a/.github/workflows/label-actions.yml +++ b/.github/workflows/label-actions.yml @@ -1,21 +1,21 @@ -name: "Label Actions" +name: Label Actions on: - issues: - types: [labeled, unlabeled] - pull_request_target: - types: [labeled, unlabeled] + issues: + types: [ labeled, unlabeled ] + pull_request_target: + types: [ labeled, unlabeled ] permissions: - contents: read - issues: write - pull-requests: write - discussions: write + contents: read + issues: write + pull-requests: write + discussions: write jobs: - action: - runs-on: ubuntu-latest - steps: - - uses: dessant/label-actions@102faf474a544be75fbaf4df54e73d3c515a0e65 # Depend on an exact commit - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - config-path: '.github/config/label-actions.yml' + action: + runs-on: ubuntu-latest + steps: + - uses: dessant/label-actions@102faf474a544be75fbaf4df54e73d3c515a0e65 # Depend on an exact commit + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + config-path: '.github/config/label-actions.yml' diff --git a/.github/workflows/localization.yml b/.github/workflows/localization.yml index 01bed80205..6eab04cab5 100644 --- a/.github/workflows/localization.yml +++ b/.github/workflows/localization.yml @@ -1,48 +1,32 @@ # This workflow will run Crowdin Action that will upload new texts to Crowdin, download the newest translations and create a PR # For more information see: https://github.com/crowdin/github-action - name: Crowdin Action - -# Controls when the action will run. on: workflow_dispatch - # Only run when started manually - - #: - # inputs: - # uploadTranslations: - # description: "Set to true to upload (changed) translations to Crowdin" - # type: boolean - # required: true - # default: false - - #schedule: - #- cron: '0 */6 * * *' # Every 6 hours - https://crontab.guru/#0_*/6_*_*_* jobs: - synchronize-with-crowdin: - runs-on: ubuntu-latest + synchronize-with-crowdin: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 - steps: - - name: Checkout - uses: actions/checkout@v2 - - - name: crowdin action - uses: crowdin/github-action@1.4.9 - with: - # Upload sources to Crowdin - upload_sources: true - # Upload translations to Crowdin, only use true at initial run - upload_translations: false - # Make pull request of Crowdin translations - download_translations: true - # To download translations to the specified version branch - localization_branch_name: l10n_crowdin_translations - # Create pull request after pushing to branch - create_pull_request: true - pull_request_title: 'New Crowdin translations' - pull_request_body: 'New Crowdin pull request with translations' - pull_request_base_branch_name: 'mc1.20.1/dev' - env: - GITHUB_TOKEN: ${{ secrets.GH_TOKEN }} - CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }} - CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }} + - name: crowdin action + uses: crowdin/github-action@1.4.9 + with: + # Upload sources to Crowdin + upload_sources: true + # Upload translations to Crowdin, only use true at initial run + upload_translations: false + # Make pull request of Crowdin translations + download_translations: true + # To download translations to the specified version branch + localization_branch_name: l10n_crowdin_translations + # Create pull request after pushing to branch + create_pull_request: true + pull_request_title: 'New Crowdin translations' + pull_request_body: 'New Crowdin pull request with translations' + pull_request_base_branch_name: 'mc1.20.1/dev' + env: + GITHUB_TOKEN: ${{ secrets.GH_TOKEN }} + CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }} + CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000000..11a47e57bc --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,27 @@ +name: Publish Release + +on: workflow_dispatch + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + + - name: Setup Java + run: echo "JAVA_HOME=$JAVA_HOME_17_X64" >> "$GITHUB_ENV" + + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v4 + with: + cache-disabled: true + + - name: Validate Gradle Wrapper Integrity + uses: gradle/wrapper-validation-action@v2 + + - name: Build & Publish + env: + MODRINTH_TOKEN: ${{ secrets.MODRINTH_TOKEN }} + CURSEFORGE_TOKEN: ${{ secrets.CURSEFORGE_TOKEN }} + run: ./gradlew build publish publishMods diff --git a/build.gradle b/build.gradle index 89d9b78bb1..872edd8a3b 100644 --- a/build.gradle +++ b/build.gradle @@ -1,21 +1,21 @@ +import dev.ithundxr.silk.ChangelogText + plugins { - id 'idea' - id 'eclipse' - id 'maven-publish' - - id 'net.minecraftforge.gradle' version "${forgegradle_version}" - id 'org.spongepowered.mixin' version "${mixingradle_version}" - id 'org.parchmentmc.librarian.forgegradle' version "${librarian_version}" - - id 'com.matthewprenger.cursegradle' version "${cursegradle_version}" + id "idea" + id "eclipse" + id "maven-publish" + id "net.neoforged.moddev.legacyforge" version "2.0.74" + id "me.modmuss50.mod-publish-plugin" version "0.8.3" + id "dev.ithundxr.silk" version "0.11.15" + id "net.kyori.blossom" version "2.1.0" // https://github.com/KyoriPowered/blossom + id "org.jetbrains.gradle.plugin.idea-ext" version "1.1.8" // https://github.com/JetBrains/gradle-idea-ext-plugin } apply from: './gradle/java.gradle' -jarJar.enable() - boolean dev = System.getenv('RELEASE') == null || System.getenv('RELEASE').equals('false') ext.buildNumber = System.getenv('BUILD_NUMBER') +String gitHash = "\"${calculateGitHash() + (hasUnstaged() ? "-modified" : "")}\"" base { archivesName = "create-${artifact_minecraft_version}" @@ -46,13 +46,6 @@ mixin { println "Java: ${System.getProperty 'java.version'}, JVM: ${System.getProperty 'java.vm.version'} (${System.getProperty 'java.vendor'}), Arch: ${System.getProperty 'os.arch'}" -mixin { - add sourceSets.main, 'create.refmap.json' - - debug.verbose = true - debug.export = true -} - idea { module { downloadJavadoc = true @@ -60,152 +53,103 @@ idea { } } -minecraft { +legacyForge { + version = "$minecraft_version-$forge_version" - if (Boolean.parseBoolean(use_parchment)) { - mappings channel: 'parchment', version: "${parchment_version}-${minecraft_version}" - } else { - mappings channel: 'official', version: "${minecraft_version}" - } - - // This property allows configuring Gradle's ProcessResources task(s) to run on IDE output locations before launching the game. - copyIdeResources = true + // TODO - Try turning this on later + validateAccessTransformers = false if (file('src/main/resources/META-INF/accesstransformer.cfg').exists()) { - accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') + accessTransformers.from "src/main/resources/META-INF/accesstransformer.cfg" + } + + parchment { + minecraftVersion = minecraft_version + mappingsVersion = parchment_version } runs { // applies to all the run configs below configureEach { - if (inMultiModWorkspace) - ideaModule "createmod.Create.main" - else - ideaModule "Create.main" - - property 'forge.logging.markers', '' - property 'forge.logging.console.level', 'info' - jvmArgs '-XX:+IgnoreUnrecognizedVMOptions', '-XX:+AllowEnhancedClassRedefinition' + systemProperty 'forge.logging.markers', '' + systemProperty 'forge.logging.console.level', 'info' + jvmArguments = ["-XX:+IgnoreUnrecognizedVMOptions", "-XX:+AllowEnhancedClassRedefinition"] //jvmArgs("-XX:-OmitStackTraceInFastThrow") // uncomment when you get exceptions with null messages etc //jvmArgs '-XX:+UnlockCommercialFeatures' // uncomment for profiling - property 'mixin.debug.export', 'true' - property 'mixin.env.remapRefMap', 'true' - property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" + systemProperty 'mixin.debug.export', 'true' + systemProperty 'mixin.debug.verbose', 'true' + systemProperty 'mixin.env.remapRefMap', 'true' + systemProperty 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" - arg '-mixin.config=create.mixins.json' - arg '-mixin.config=catnip.mixins.json' + programArgument '-mixin.config=create.mixins.json' + programArgument '-mixin.config=catnip.mixins.json' mods { - create { - source sourceSets.main - } - if (catnipInWorkspace) { catnip { - source project(":catnip:Common").sourceSets.main - source project(":catnip:Forge").sourceSets.main + sourceSet project(":catnip:Common").sourceSets.main + sourceSet project(":catnip:Forge").sourceSets.main } } if (ponderInWorkspace) { ponder { - source project(":ponder:Common").sourceSets.main - source project(":ponder:Forge").sourceSets.main + sourceSet project(":ponder:Common").sourceSets.main + sourceSet project(":ponder:Forge").sourceSets.main } } } } client { - workingDirectory project.file('run') + client() + + gameDirectory = project.file('run') } server { - workingDirectory project.file('run/server') + server() + + gameDirectory = project.file('run/server') } data { - workingDirectory project.file('run') - property 'forge.logging.markers', 'REGISTRIES,REGISTRYDUMP' - property 'forge.logging.console.level', 'debug' - args '--mod', 'create', '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources') + data() + + gameDirectory = project.file('run') + systemProperty 'forge.logging.markers', 'REGISTRIES,REGISTRYDUMP' + systemProperty 'forge.logging.console.level', 'debug' + programArguments = ["--mod", mod_id, "--all", "--output", file("src/generated/resources/").getAbsolutePath(), "--existing", file("src/main/resources").getAbsolutePath()] } gameTestServer { - workingDirectory project.file('run/gametest') + type = "gameTestServer" + + gameDirectory = project.file('run/gametest') // setForceExit false <- FIXME 1.20 } } } repositories { - maven { - // location of the maven for Registrate and Flywheel - name = 'tterrag maven' - url = 'https://maven.tterrag.com' - } - maven { - // location of the maven that hosts JEI files since January 2023 - // location of the maven for Vazkii's mods - name = "Jared's maven" - url = "https://maven.blamejared.com/" - } - /*maven { - // location of a maven mirror for JEI files, as a fallback - name = "ModMaven" - url = "https://modmaven.dev" - }*/ - maven { - // location of the maven for Dynamic Trees - url = 'https://harleyoconnor.com/maven' - } - maven { - // location of the maven for Curios API - url = "https://maven.theillusivec4.top/" - } - maven { - // location of maven for CC: Tweaked - name = "squiddev" - url = "https://squiddev.cc/maven/" - } - maven { - name = "ftb" - url = "https://maven.saps.dev/releases" - } - maven { - name = "architectury" - url = "https://maven.architectury.dev/" - } - maven { - url = "https://jm.gserv.me/repository/maven-public/" + maven { url = "https://maven.createmod.net" } // Ponder, Catnip + maven { url = "https://maven.tterrag.com" } // Registrate, Flywheel + maven { url = "https://maven.blamejared.com" } // JEI, Vazkii's Mods + maven { url = "https://harleyoconnor.com/maven" } // Dynamic Trees + maven { url = "https://maven.theillusivec4.top/" } // Curios API + maven { url = "https://maven.squiddev.cc" } // CC: Tweaked + maven { url = "https://www.cursemaven.com" } + maven { url = "https://api.modrinth.com/maven" } + maven { url = "https://maven.saps.dev/releases" } // FTB Mods + maven { url = "https://maven.architectury.dev" } // Arch API + maven { url = "https://jm.gserv.me/repository/maven-public" // JourneyMap content { includeGroup "info.journeymap" includeGroup "mysticdrew" } } - - maven { - url = 'https://www.cursemaven.com' - content { - includeGroup "curse.maven" - } - } - maven { - // Location of the maven for Ponder, Catnip - name = 'createmod maven' - url 'https://maven.createmod.net' - } - maven { - name = "Modrinth" - url = "https://api.modrinth.com/maven" - content { - includeGroup "maven.modrinth" - } - } - maven { url = "https://raw.githubusercontent.com/Fuzss/modresources/main/maven/" } - // Mirror of maven.createmod.net if (System.getProperty("os.name").contains("Mac") && System.getenv("USER") == "ithundxr") { maven { url = "https://maven.ithundxr.dev/mirror" } @@ -214,136 +158,143 @@ repositories { mavenCentral() mavenLocal() flatDir { - dirs 'libs' + dirs "libs" } } -sourceSets.main.resources { - srcDir 'src/generated/resources' - exclude '.cache/' -} - dependencies { - minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}" - jarJar("com.tterrag.registrate:Registrate:${registrate_version}") { - jarJar.ranged(it, '[MC1.19.3-1.1.10,)') + version { + strictly "[MC1.20-1.3.3,)" + } } jarJar("dev.engine_room.flywheel:flywheel-forge-${flywheel_minecraft_version}:${flywheel_version}") { - jarJar.ranged(it, '[1.0,2.0)') + version { + strictly "[1.0,2.0)" + } } jarJar("net.createmod.catnip:Catnip-Forge-${minecraft_version}:${catnip_version}") { - jarJar.ranged(it, '[0.7.5,)') + version { + strictly "[0.7.5,)" + } } jarJar("net.createmod.ponder:Ponder-Forge-${minecraft_version}:${ponder_version}") { - jarJar.ranged(it, '[0.7.5,)') + version { + strictly "[0.7.5,)" + } } implementation(jarJar("io.github.llamalad7:mixinextras-forge:${mixin_extras_version}")) { - jarJar.ranged(it, "[${mixin_extras_version},)") + version { + strictly "[${mixin_extras_version},)" + } } - implementation fg.deobf("com.tterrag.registrate:Registrate:${registrate_version}") + modImplementation("com.tterrag.registrate:Registrate:${registrate_version}") - compileOnly fg.deobf("dev.engine_room.flywheel:flywheel-forge-api-${flywheel_minecraft_version}:${flywheel_version}") - runtimeOnly fg.deobf("dev.engine_room.flywheel:flywheel-forge-${flywheel_minecraft_version}:${flywheel_version}") + modCompileOnly("dev.engine_room.flywheel:flywheel-forge-api-${flywheel_minecraft_version}:${flywheel_version}") + modRuntimeOnly("dev.engine_room.flywheel:flywheel-forge-${flywheel_minecraft_version}:${flywheel_version}") if (catnipInWorkspace) { implementation project(":catnip:Common") implementation project(":catnip:Forge") } else { - implementation fg.deobf("net.createmod.catnip:Catnip-Forge-${minecraft_version}:${catnip_version}") + modImplementation("net.createmod.catnip:Catnip-Forge-${minecraft_version}:${catnip_version}") } if (ponderInWorkspace) { implementation project(":ponder:Common") implementation project(":ponder:Forge") } else { - implementation fg.deobf("net.createmod.ponder:Ponder-Forge-${minecraft_version}:${ponder_version}") + modImplementation("net.createmod.ponder:Ponder-Forge-${minecraft_version}:${ponder_version}") } compileOnly(annotationProcessor("io.github.llamalad7:mixinextras-common:${mixin_extras_version}")) - // compileOnly fg.deobf("mezz.jei:jei-${jei_minecraft_version}-common-api:${jei_version}") - // compileOnly fg.deobf("mezz.jei:jei-${jei_minecraft_version}-forge-api:${jei_version}") - implementation fg.deobf("mezz.jei:jei-${jei_minecraft_version}-forge:${jei_version}") + // modCompileOnly("mezz.jei:jei-${jei_minecraft_version}-common-api:${jei_version}") + // modCompileOnly("mezz.jei:jei-${jei_minecraft_version}-forge-api:${jei_version}") + modImplementation("mezz.jei:jei-${jei_minecraft_version}-forge:${jei_version}") - compileOnly fg.deobf("top.theillusivec4.curios:curios-forge:${curios_version}+${curios_minecraft_version}:api") - runtimeOnly fg.deobf("top.theillusivec4.curios:curios-forge:${curios_version}+${curios_minecraft_version}") + modCompileOnly("top.theillusivec4.curios:curios-forge:${curios_version}+${curios_minecraft_version}:api") + modRuntimeOnly("top.theillusivec4.curios:curios-forge:${curios_version}+${curios_minecraft_version}") if (cc_tweaked_enable.toBoolean()) { compileOnly("cc.tweaked:cc-tweaked-${cc_tweaked_minecraft_version}-core-api:${cc_tweaked_version}") - compileOnly fg.deobf("cc.tweaked:cc-tweaked-${cc_tweaked_minecraft_version}-forge-api:${cc_tweaked_version}") - runtimeOnly fg.deobf("cc.tweaked:cc-tweaked-${cc_tweaked_minecraft_version}-forge:${cc_tweaked_version}") + modCompileOnly("cc.tweaked:cc-tweaked-${cc_tweaked_minecraft_version}-forge-api:${cc_tweaked_version}") + modRuntimeOnly("cc.tweaked:cc-tweaked-${cc_tweaked_minecraft_version}-forge:${cc_tweaked_version}") } if (dynamic_trees_enable.toBoolean()) { - compileOnly fg.deobf("com.ferreusveritas.dynamictrees:DynamicTrees-${dynamic_trees_minecraft_version}:${dynamic_trees_version}") + modCompileOnly("com.ferreusveritas.dynamictrees:DynamicTrees-${dynamic_trees_minecraft_version}:${dynamic_trees_version}") } - // implementation fg.deobf("curse.maven:ic2-classic-242942:5555152") - // implementation fg.deobf("curse.maven:druidcraft-340991:3101903") - // implementation fg.deobf("com.railwayteam.railways:railways-1.19.2-1.6.4:all") { transitive = false } + // modImplementation("curse.maven:ic2-classic-242942:5555152") + // modImplementation("curse.maven:druidcraft-340991:3101903") + // modImplementation("com.railwayteam.railways:railways-1.19.2-1.6.4:all") { transitive = false } - implementation fg.deobf("dev.architectury:architectury-forge:9.1.12") - implementation fg.deobf("dev.ftb.mods:ftb-chunks-forge:2001.3.1") - implementation fg.deobf("dev.ftb.mods:ftb-teams-forge:2001.3.0") - implementation fg.deobf("dev.ftb.mods:ftb-library-forge:2001.2.4") + modRuntimeOnly("dev.architectury:architectury-forge:9.1.12") + modImplementation("dev.ftb.mods:ftb-chunks-forge:2001.3.1") + modImplementation("dev.ftb.mods:ftb-teams-forge:2001.3.0") + modImplementation("dev.ftb.mods:ftb-library-forge:2001.2.4") - implementation fg.deobf("curse.maven:journeymap-32274:5457831") - // implementation fg.deobf("ignored:journeymap-1.20.1-5.10.1-forge") + modImplementation("curse.maven:journeymap-32274:5457831") + // modImplementation("ignored:journeymap-1.20.1-5.10.1-forge") - // runtimeOnly fg.deobf("curse.maven:framedblocks-441647:5399211") - // runtimeOnly fg.deobf("curse.maven:galosphere-631098:4574834") - // runtimeOnly fg.deobf("curse.maven:elementary-ores-332609:4514276") 1.19.4 only - // runtimeOnly fg.deobf("curse.maven:flib-661261:4479544") - // runtimeOnly fg.deobf("curse.maven:infernal-expansion-395078:4002091") - // runtimeOnly fg.deobf("vazkii.autoreglib:AutoRegLib:1.8.2-58.126") - // runtimeOnly fg.deobf("curse.maven:quark-243121:4812006") - // runtimeOnly fg.deobf("curse.maven:mantle-74924:5339977") - // runtimeOnly fg.deobf("curse.maven:tinkers-construct-74072:5358052") - // runtimeOnly fg.deobf("maven.modrinth:rubidium:0.6.2c") - // runtimeOnly fg.deobf("maven.modrinth:aether:1.19.2-1.4.2-forge") - // runtimeOnly fg.deobf("maven.modrinth:spark:1.10.38-forge") - // runtimeOnly fg.deobf("curse.maven:forbidden-arcanus-309858:4852521") - // runtimeOnly fg.deobf("curse.maven:valhelsia-core-416935:4181245") - // runtimeOnly fg.deobf("curse.maven:modern-ui-352491:5229370") - // runtimeOnly fg.deobf("curse.maven:sophisticated-storage-619320:5194750") - // runtimeOnly fg.deobf("curse.maven:sophisticated-core-618298:5296313") - // runtimeOnly fg.deobf("curse.maven:functional-storage-556861:5499169") - // runtimeOnly fg.deobf("curse.maven:titanium-287342:5356458") - // runtimeOnly fg.deobf("curse.maven:storage-drawers-223852:3884263") - // runtimeOnly fg.deobf("curse.maven:ftb-chunks-forge-314906:5417874") - // runtimeOnly fg.deobf("curse.maven:architectury-api-419699:5137942") - // runtimeOnly fg.deobf("curse.maven:ftb-library-forge-404465:4661834") - // runtimeOnly fg.deobf("curse.maven:ftb-teams-forge-404468:4611938") - // runtimeOnly fg.deobf("curse.maven:citadel-331936:4556677") - // runtimeOnly fg.deobf("curse.maven:ice-and-fire-dragons-264231:5037952") - // runtimeOnly fg.deobf("curse.maven:exnihilosequentia-400012:4993344") - // runtimeOnly fg.deobf("curse.maven:upgrade-aquatic-326895:4777515") - // runtimeOnly fg.deobf("curse.maven:blueprint-382216:4749000") - // runtimeOnly fg.deobf("curse.maven:windsweptmod-636321:4817132") - // runtimeOnly fg.deobf("curse.maven:good-ending-690161:4363719") + // modRuntimeOnly("curse.maven:framedblocks-441647:5399211") + // modRuntimeOnly("curse.maven:galosphere-631098:4574834") + // modRuntimeOnly("curse.maven:elementary-ores-332609:4514276") 1.19.4 only + // modRuntimeOnly("curse.maven:flib-661261:4479544") + // modRuntimeOnly("curse.maven:infernal-expansion-395078:4002091") + // modRuntimeOnly("vazkii.autoreglib:AutoRegLib:1.8.2-58.126") + // modRuntimeOnly("curse.maven:quark-243121:4812006") + // modRuntimeOnly("curse.maven:mantle-74924:5339977") + // modRuntimeOnly("curse.maven:tinkers-construct-74072:5358052") + // modRuntimeOnly("maven.modrinth:rubidium:0.6.2c") + // modRuntimeOnly("maven.modrinth:aether:1.19.2-1.4.2-forge") + // modRuntimeOnly("maven.modrinth:spark:1.10.38-forge") + // modRuntimeOnly("curse.maven:forbidden-arcanus-309858:4852521") + // modRuntimeOnly("curse.maven:valhelsia-core-416935:4181245") + // modRuntimeOnly("curse.maven:modern-ui-352491:5229370") + // modRuntimeOnly("curse.maven:sophisticated-storage-619320:5194750") + // modRuntimeOnly("curse.maven:sophisticated-core-618298:5296313") + // modRuntimeOnly("curse.maven:functional-storage-556861:5499169") + // modRuntimeOnly("curse.maven:titanium-287342:5356458") + // modRuntimeOnly("curse.maven:storage-drawers-223852:3884263") + // modRuntimeOnly("curse.maven:ftb-chunks-forge-314906:5417874") + // modRuntimeOnly("curse.maven:architectury-api-419699:5137942") + // modRuntimeOnly("curse.maven:ftb-library-forge-404465:4661834") + // modRuntimeOnly("curse.maven:ftb-teams-forge-404468:4611938") + // modRuntimeOnly("curse.maven:citadel-331936:4556677") + // modRuntimeOnly("curse.maven:ice-and-fire-dragons-264231:5037952") + // modRuntimeOnly("curse.maven:exnihilosequentia-400012:4993344") + // modRuntimeOnly("curse.maven:upgrade-aquatic-326895:4777515") + // modRuntimeOnly("curse.maven:blueprint-382216:4749000") + // modRuntimeOnly("curse.maven:windsweptmod-636321:4817132") + // modRuntimeOnly("curse.maven:good-ending-690161:4363719") // https://discord.com/channels/313125603924639766/725850371834118214/910619168821354497 // Prevent Mixin annotation processor from getting into IntelliJ's annotation processor settings // This allows 'Settings > Build, Execution, and Deployment > Build Tools > Gradle > Build and run using' set to IntelliJ to work correctly if (!Boolean.getBoolean('idea.sync.active')) { - annotationProcessor "org.spongepowered:mixin:${mixin_version}:processor" + annotationProcessor "org.spongepowered:mixin:0.8.5:processor" } } -sourceSets.main.java { - if (!cc_tweaked_enable.toBoolean()) { - exclude 'com/simibubi/create/compat/computercraft/implementation/**' - } -} - -// Workaround for SpongePowered/MixinGradle#38 -afterEvaluate { - tasks.configureReobfTaskForReobfJar.mustRunAfter(tasks.compileJava) - tasks.configureReobfTaskForReobfJarJar.mustRunAfter(tasks.compileJava) +sourceSets.main { + java { + if (!cc_tweaked_enable.toBoolean()) { + exclude 'com/simibubi/create/compat/computercraft/implementation/**' + } + } + resources { + srcDir 'src/generated/resources' + exclude '.cache/' + } + blossom.javaSources { + property("version", build_info_mod_version) + property("gitCommit", gitHash.toString()) + } } processResources { @@ -361,31 +312,21 @@ compileJava { options.compilerArgs = ['-Xdiags:verbose'] } -void addLicense(jarTask) { - jarTask.from('LICENSE') { - rename { "${it}_${project.archivesBaseName}" } +jar { + from('LICENSE') { + rename { "${it}_${archivesBaseName}" } } + + manifest.attributes([ + "MixinConfigs": "create.mixins.json", + "Git-Hash": gitHash + ]) } -tasks.jar { - archiveClassifier = 'slim' - finalizedBy('reobfJar') - addLicense it -} - -tasks.jarJar { - finalizedBy('reobfJarJar') - addLicense it -} - -task jarJarRelease { - group = 'jarjar' - doLast { - tasks.jarJar { - archiveClassifier = '' - } - } - finalizedBy tasks.jarJar +tasks.named("sourcesJar") { + manifest.attributes([ + "Git-Hash": gitHash + ]) } project.publishing { @@ -393,8 +334,6 @@ project.publishing { mavenJava(MavenPublication) { artifactId base.archivesName.get() from components.java - fg.component(it) - jarJar.component(it) } } @@ -405,55 +344,52 @@ project.publishing { } } -String getChangelogText() { - def changelogFile = file('changelog.txt') - String str = '' - int lineCount = 0 - boolean done = false - changelogFile.eachLine { - if (done || it == null) { - return - } - if (it.size() > 1) { - def temp = it - if (lineCount == 0) { - temp = "Create ${version}" - temp = "Create v${mod_version}  for Minecraft ${minecraft_version}
" - } else if (it.startsWith('-')) { - temp = "   $temp
" - temp = temp.replaceAll("(\\S+\\/\\S+)#([0-9]+)\\b", "
\$0"); - temp = temp.replaceAll("#([0-9]+)\\b(?!<\\/a>)", "\$0"); - } else { - temp = "

$temp

" - } - str += temp - lineCount++ - } else { - str += "

Please submit any Issues you come across on the Issue Tracker.

" - done = true - } +publishMods { + file = jar.archiveFile + changelog = ChangelogText.getChangelogText(project).toString() + type = STABLE + displayName = "$mod_name $minecraft_version $mod_version" + modLoaders.add("forge") + modLoaders.add("neoforge") + + curseforge { + accessToken = providers.environmentVariable("CURSEFORGE_TOKEN") + projectId = "328085" + minecraftVersions.add(minecraft_version) + } + + modrinth { + accessToken = providers.environmentVariable("MODRINTH_TOKEN") + projectId = "LNytGWDc" + minecraftVersions.add(minecraft_version) } - return str } -// changelog debugging -// new File("changelog.html").write getChangelogText() -// tasks.curseforge.enabled = !dev && project.hasProperty('simi_curseforge_key') -// curseforge { -// if (project.hasProperty('simi_curseforge_key')) { -// apiKey = project.simi_curseforge_key -// } -// -// project { -// id = project.projectId -// changelog = System.getenv('CHANGELOG') == null || System.getenv('CHANGELOG').equals('none') ? getChangelogText() : System.getenv('CHANGELOG') -// changelogType = 'html' -// releaseType = project.curse_type -// mainArtifact(shadowJar) { -// displayName = "Create - ${version}" -// } -// relations { -// optionalDependency 'jei' -// } -// } -// } +String calculateGitHash() { + try { + ByteArrayOutputStream stdout = new ByteArrayOutputStream() + exec { + commandLine("git", "rev-parse", "HEAD") + standardOutput = stdout + } + return stdout.toString().trim() + } catch(Throwable ignored) { + return "unknown" + } +} + +boolean hasUnstaged() { + try { + ByteArrayOutputStream stdout = new ByteArrayOutputStream() + exec { + commandLine("git", "status", "--porcelain") + standardOutput = stdout + } + String result = stdout.toString().replace("/M gradlew(\\.bat)?/", "").trim() + if (!result.isEmpty()) + println("Found stageable results:\n${result}\n") + return !result.isEmpty() + } catch(Throwable ignored) { + return false + } +} diff --git a/changelog.md b/changelog.md new file mode 100644 index 0000000000..b0ff6ea59a --- /dev/null +++ b/changelog.md @@ -0,0 +1,34 @@ +------------------------------------------------------ +Create 0.5.2 +------------------------------------------------------ +Additions +- Example + +Changes +- Bumped the defalt max rope length to 384 +- Set vault capacity limit to 2048 slots to prevent people from OOM-ing themselves if they set the capacity too high + +Bug Fixes +- Fix certain blocks messing up the order scheduled ticks (#7141) +- Fix unbreakable superglue not being usable (#6253) +- Fix update suppression (#7176) +- Fix comparator output of depots ignoring the items max stack size (#7179) +- Fix deployers retaining the damage attribute of their last held weapon (#4870) +- Fix an exploit allowing people to create clipboards that execute commands (#7218) +- Fix redstone links not updating their redstone output when they've been taken out of receiver mode (#7226) +- Fix rare crash related to sliding doors (#6184) +- Verify that schematics are gzip-encoded before trying to read from them (#6087) +- Added workaround for create_tracks.dat getting corrupted during crashes, the mod will try to restore the old track data stored in the create_tracks.dat_old file if the current one is corrupted +- Fix contraptions triggering pressure plates and tripwires (#7255) +- Fix ConditionContext nbt in trains containing a large number of empty tags +- Fix deployers not placing fish from fish buckets (#3705) +- Fix gasses not being visible in basins and item drains (#7236) + +Art Changes +- Example + +API Changes +- Removed LangMerger and related classes +- Implemented an api to allow mods to register schematic requirements, partial safe nbt and contraption transforms without implementing interfaces (#4702) +- Add a method that developers can override to change the icon in goggle tooltips +- Refactored Item Attributes types, Fan processing types and Arm interaction points, all 3 now use proper registries diff --git a/gradle.properties b/gradle.properties index 06c7b19a44..9640991d93 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,18 +4,15 @@ org.gradle.jvmargs = -Xmx3G org.gradle.daemon = false # mod version info +# build_info_mod_version is the version that gets filled into CreateBuildInfo.java mod_version = 0.5.2 +build_info_mod_version = 0.5.2-experimental artifact_minecraft_version = 1.20.1 minecraft_version = 1.20.1 forge_version = 47.2.6 # build dependency versions -forgegradle_version = [6.0.16,6.2) -mixingradle_version = 0.7.+ -mixin_version = 0.8.5 -librarian_version = 1.+ -cursegradle_version = 1.4.0 parchment_version = 2023.09.03 use_parchment = true diff --git a/gradle/java.gradle b/gradle/java.gradle index 3d87b8b34f..86c9d96509 100644 --- a/gradle/java.gradle +++ b/gradle/java.gradle @@ -16,13 +16,12 @@ jar { 'Implementation-Timestamp': new Date().format("yyyy-MM-dd'T'HH:mm:ssZ"), 'Timestampe' : System.currentTimeMillis(), 'Built-On-Java' : "${System.getProperty('java.vm.version')} (${System.getProperty('java.vm.vendor')})", - 'Build-On-Minecraft' : minecraft_version + 'Built-On-Minecraft' : minecraft_version ]) } } tasks.withType(JavaCompile).configureEach { - it.options.encoding = 'UTF-8' it.options.release = 17 } @@ -31,12 +30,10 @@ tasks.withType(JavaCompile).configureEach { // metadata includes mapped dependencies which are not reasonably consumable by // other mod developers. tasks.withType(GenerateModuleMetadata) { - enabled = false } javadoc { - // Suppress annoying warnings when generating JavaDoc files. options.addStringOption('Xdoclint:none', '-quiet') } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index c1962a79e29d3e0ab67b14947c167a862655af9b..a4b76b9530d66f5e68d973ea569d8e19de379189 100644 GIT binary patch literal 43583 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 yu?e%!_ptzGB|8GrCfu%p?(_ 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 GZ~q4|mN%#X literal 62076 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 309b4e18db..e2847c8200 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index aeb74cbb43..f5feea6d6b 100755 --- a/gradlew +++ b/gradlew @@ -15,6 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # @@ -55,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -83,7 +85,9 @@ done # This is normally unused # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s +' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -130,10 +134,13 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. @@ -141,7 +148,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac @@ -149,7 +156,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then '' | soft) :;; #( *) # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -198,11 +205,11 @@ fi # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ diff --git a/gradlew.bat b/gradlew.bat index 93e3f59f13..9d21a21834 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -13,6 +13,8 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem @if "%DEBUG%"=="" @echo off @rem ########################################################################## @@ -43,11 +45,11 @@ set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if %ERRORLEVEL% equ 0 goto execute -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -57,11 +59,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail diff --git a/settings.gradle b/settings.gradle index 1a196a6fe8..fbb0422deb 100644 --- a/settings.gradle +++ b/settings.gradle @@ -2,7 +2,6 @@ pluginManagement { repositories { gradlePluginPortal() mavenCentral() - jcenter() maven { url = 'https://maven.minecraftforge.net/' } maven { url = 'https://repo.spongepowered.org/repository/maven-public' } maven { url = 'https://maven.parchmentmc.org' } @@ -10,7 +9,7 @@ pluginManagement { } plugins { - id 'org.gradle.toolchains.foojay-resolver-convention' version '0.7.0' + id 'org.gradle.toolchains.foojay-resolver-convention' version '0.8.0' } rootProject.name = 'Create' diff --git a/src/main/java-templates/com/simibubi/create/CreateBuildInfo.java.peb b/src/main/java-templates/com/simibubi/create/CreateBuildInfo.java.peb new file mode 100644 index 0000000000..bb1dfd9ebc --- /dev/null +++ b/src/main/java-templates/com/simibubi/create/CreateBuildInfo.java.peb @@ -0,0 +1,6 @@ +package com.simibubi.create; + +public class CreateBuildInfo { + public static String VERSION = "{{ version }}"; + public static String GIT_COMMIT = {{ gitCommit }}; +} diff --git a/src/main/java/com/simibubi/create/Create.java b/src/main/java/com/simibubi/create/Create.java index c99ffe4234..04dfce57fe 100644 --- a/src/main/java/com/simibubi/create/Create.java +++ b/src/main/java/com/simibubi/create/Create.java @@ -61,10 +61,8 @@ import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; @Mod(Create.ID) public class Create { - public static final String ID = "create"; public static final String NAME = "Create"; - public static final String VERSION = "0.5.2-experimental"; public static final Logger LOGGER = LogUtils.getLogger(); @@ -102,6 +100,8 @@ public class Create { } public static void onCtor() { + LOGGER.info("{} {} initializing! Commit hash: {}", NAME, CreateBuildInfo.VERSION, CreateBuildInfo.GIT_COMMIT); + ModLoadingContext modLoadingContext = ModLoadingContext.get(); IEventBus modEventBus = FMLJavaModLoadingContext.get() @@ -187,5 +187,4 @@ public class Create { public static ResourceLocation asResource(String path) { return new ResourceLocation(ID, path); } - } diff --git a/src/main/java/com/simibubi/create/infrastructure/debugInfo/DebugInformation.java b/src/main/java/com/simibubi/create/infrastructure/debugInfo/DebugInformation.java index 72117d3a22..dd32d9beed 100644 --- a/src/main/java/com/simibubi/create/infrastructure/debugInfo/DebugInformation.java +++ b/src/main/java/com/simibubi/create/infrastructure/debugInfo/DebugInformation.java @@ -11,6 +11,7 @@ import javax.annotation.Nullable; import com.google.common.collect.ImmutableMap; import com.mojang.blaze3d.platform.GlUtil; import com.simibubi.create.Create; +import com.simibubi.create.CreateBuildInfo; import com.simibubi.create.foundation.mixin.accessor.SystemReportAccessor; import com.simibubi.create.infrastructure.debugInfo.element.DebugInfoSection; import com.simibubi.create.infrastructure.debugInfo.element.InfoElement; @@ -68,7 +69,7 @@ public class DebugInformation { static { DebugInfoSection.builder(Create.NAME) - .put("Mod Version", Create.VERSION) + .put("Mod Version", CreateBuildInfo.VERSION) .put("Forge Version", getVersionOfMod("forge")) .put("Minecraft Version", SharedConstants.getCurrentVersion().getName()) .buildTo(DebugInformation::registerBothInfo); diff --git a/src/main/java/com/simibubi/create/infrastructure/gui/CreateMainMenuScreen.java b/src/main/java/com/simibubi/create/infrastructure/gui/CreateMainMenuScreen.java index 9b9ce5b545..4fdddac100 100644 --- a/src/main/java/com/simibubi/create/infrastructure/gui/CreateMainMenuScreen.java +++ b/src/main/java/com/simibubi/create/infrastructure/gui/CreateMainMenuScreen.java @@ -5,6 +5,7 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllBlocks; import com.simibubi.create.Create; +import com.simibubi.create.CreateBuildInfo; import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.utility.CreateLang; @@ -130,7 +131,7 @@ public class CreateMainMenuScreen extends AbstractSimiScreen { ms.translate(0, 0, 200); graphics.drawCenteredString(font, Components.literal(Create.NAME).withStyle(ChatFormatting.BOLD) .append( - Components.literal(" v" + Create.VERSION).withStyle(ChatFormatting.BOLD, ChatFormatting.WHITE)), + Components.literal(" v" + CreateBuildInfo.VERSION).withStyle(ChatFormatting.BOLD, ChatFormatting.WHITE)), width / 2, 89, 0xFF_E4BB67); ms.popPose(); From 88907795fe8d5cb10c8e8754d06709be39edbfe0 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Sun, 12 Jan 2025 16:23:40 -0500 Subject: [PATCH 293/515] Elephant taming - Enable parallel and caching args - Modify tasks to support configuration cache --- build.gradle | 14 +++++--------- gradle.properties | 3 +++ 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/build.gradle b/build.gradle index 872edd8a3b..b827122db5 100644 --- a/build.gradle +++ b/build.gradle @@ -367,12 +367,10 @@ publishMods { String calculateGitHash() { try { - ByteArrayOutputStream stdout = new ByteArrayOutputStream() - exec { + def output = providers.exec { commandLine("git", "rev-parse", "HEAD") - standardOutput = stdout } - return stdout.toString().trim() + return output.standardOutput.asText.get().trim() } catch(Throwable ignored) { return "unknown" } @@ -380,14 +378,12 @@ String calculateGitHash() { boolean hasUnstaged() { try { - ByteArrayOutputStream stdout = new ByteArrayOutputStream() - exec { + def output = providers.exec { commandLine("git", "status", "--porcelain") - standardOutput = stdout } - String result = stdout.toString().replace("/M gradlew(\\.bat)?/", "").trim() + String result = output.standardOutput.asText.get().replace("/M gradlew(\\.bat)?/", "").trim() if (!result.isEmpty()) - println("Found stageable results:\n${result}\n") + println("Found stageable results:\n ${result}\n") return !result.isEmpty() } catch(Throwable ignored) { return false diff --git a/gradle.properties b/gradle.properties index 9640991d93..7366000751 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,6 +2,9 @@ # This is required to provide enough memory for the Minecraft decompilation process. org.gradle.jvmargs = -Xmx3G org.gradle.daemon = false +org.gradle.parallel = true +org.gradle.caching = true +org.gradle.configuration-cache = true # mod version info # build_info_mod_version is the version that gets filled into CreateBuildInfo.java From 3f3f5a3c241afed1c597db9eefcd9c089ee21c51 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Sun, 12 Jan 2025 16:44:32 -0500 Subject: [PATCH 294/515] Eclipsed moon again - Disable config cache, doesn't support eclipse yet --- gradle.properties | 1 - 1 file changed, 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 7366000751..16c33ca7cb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,6 @@ org.gradle.jvmargs = -Xmx3G org.gradle.daemon = false org.gradle.parallel = true org.gradle.caching = true -org.gradle.configuration-cache = true # mod version info # build_info_mod_version is the version that gets filled into CreateBuildInfo.java From fdc069910c91d0eb2de03773f941e006b392fd1a Mon Sep 17 00:00:00 2001 From: IThundxr Date: Sun, 12 Jan 2025 17:25:44 -0500 Subject: [PATCH 295/515] Mixed up errors - Fix --- build.gradle | 39 ++++++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/build.gradle b/build.gradle index b827122db5..a75ff69d62 100644 --- a/build.gradle +++ b/build.gradle @@ -40,7 +40,6 @@ project.logger.lifecycle("Dependencies included in Workspace: [Catnip: ${catnipI mixin { add sourceSets.main, 'create.refmap.json' - config 'create.mixins.json' } @@ -68,6 +67,26 @@ legacyForge { mappingsVersion = parchment_version } + mods { + create { + sourceSet sourceSets.main + } + + if (catnipInWorkspace) { + catnip { + sourceSet project(":catnip:Common").sourceSets.main + sourceSet project(":catnip:Forge").sourceSets.main + } + } + + if (ponderInWorkspace) { + ponder { + sourceSet project(":ponder:Common").sourceSets.main + sourceSet project(":ponder:Forge").sourceSets.main + } + } + } + runs { // applies to all the run configs below configureEach { @@ -84,22 +103,6 @@ legacyForge { programArgument '-mixin.config=create.mixins.json' programArgument '-mixin.config=catnip.mixins.json' - - mods { - if (catnipInWorkspace) { - catnip { - sourceSet project(":catnip:Common").sourceSets.main - sourceSet project(":catnip:Forge").sourceSets.main - } - } - - if (ponderInWorkspace) { - ponder { - sourceSet project(":ponder:Common").sourceSets.main - sourceSet project(":ponder:Forge").sourceSets.main - } - } - } } client { @@ -287,10 +290,12 @@ sourceSets.main { exclude 'com/simibubi/create/compat/computercraft/implementation/**' } } + resources { srcDir 'src/generated/resources' exclude '.cache/' } + blossom.javaSources { property("version", build_info_mod_version) property("gitCommit", gitHash.toString()) From a70ab4ef63ae0c76cc89d471e5c304b89e21236e Mon Sep 17 00:00:00 2001 From: IThundxr Date: Sun, 12 Jan 2025 18:05:58 -0500 Subject: [PATCH 296/515] Refmap Referee - Fix refmap not being remapped --- build.gradle | 2 -- 1 file changed, 2 deletions(-) diff --git a/build.gradle b/build.gradle index a75ff69d62..23b98f6aea 100644 --- a/build.gradle +++ b/build.gradle @@ -98,8 +98,6 @@ legacyForge { systemProperty 'mixin.debug.export', 'true' systemProperty 'mixin.debug.verbose', 'true' - systemProperty 'mixin.env.remapRefMap', 'true' - systemProperty 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" programArgument '-mixin.config=create.mixins.json' programArgument '-mixin.config=catnip.mixins.json' From 56faba5fea481698e2cd13a3e811eba282f29204 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Sat, 28 Dec 2024 18:44:28 -0500 Subject: [PATCH 297/515] Magic recipes - Implement a system for generating recipes at runtime to improve mod compat --- .../b256105d8411632b0d585496ea8944a751a08034 | 516 +----------------- .../create/recipes/cutting/acacia_log.json | 14 - .../create/recipes/cutting/acacia_wood.json | 14 - .../create/recipes/cutting/birch_log.json | 14 - .../create/recipes/cutting/birch_wood.json | 14 - .../create/recipes/cutting/cherry_log.json | 14 - .../create/recipes/cutting/cherry_wood.json | 14 - .../stripped_twisted_log.json | 21 - .../stripped_twisted_wood.json | 21 - .../architects_palette/twisted_log.json | 20 - .../architects_palette/twisted_wood.json | 20 - .../cutting/compat/atmospheric/aspen_log.json | 20 - .../compat/atmospheric/aspen_wood.json | 20 - .../cutting/compat/atmospheric/grimwood.json | 20 - .../compat/atmospheric/grimwood_log.json | 20 - .../cutting/compat/atmospheric/kousa_log.json | 20 - .../compat/atmospheric/kousa_wood.json | 20 - .../compat/atmospheric/morado_log.json | 20 - .../compat/atmospheric/morado_wood.json | 20 - .../cutting/compat/atmospheric/rosewood.json | 20 - .../compat/atmospheric/rosewood_log.json | 20 - .../atmospheric/stripped_aspen_log.json | 21 - .../atmospheric/stripped_aspen_wood.json | 21 - .../compat/atmospheric/stripped_grimwood.json | 21 - .../atmospheric/stripped_grimwood_log.json | 21 - .../atmospheric/stripped_kousa_log.json | 21 - .../atmospheric/stripped_kousa_wood.json | 21 - .../atmospheric/stripped_morado_log.json | 21 - .../atmospheric/stripped_morado_wood.json | 21 - .../compat/atmospheric/stripped_rosewood.json | 21 - .../atmospheric/stripped_rosewood_log.json | 21 - .../atmospheric/stripped_yucca_log.json | 21 - .../atmospheric/stripped_yucca_wood.json | 21 - .../cutting/compat/atmospheric/yucca_log.json | 20 - .../compat/atmospheric/yucca_wood.json | 20 - .../cutting/compat/autumnity/maple_log.json | 20 - .../cutting/compat/autumnity/maple_wood.json | 20 - .../compat/autumnity/sappy_maple_log.json | 21 - .../compat/autumnity/sappy_maple_wood.json | 20 - .../compat/autumnity/stripped_maple_log.json | 21 - .../compat/autumnity/stripped_maple_wood.json | 21 - .../compat/biomesoplenty/dead_log.json | 20 - .../compat/biomesoplenty/dead_wood.json | 20 - .../cutting/compat/biomesoplenty/fir_log.json | 20 - .../compat/biomesoplenty/fir_wood.json | 20 - .../compat/biomesoplenty/hellbark_log.json | 20 - .../compat/biomesoplenty/hellbark_wood.json | 20 - .../compat/biomesoplenty/jacaranda_log.json | 20 - .../compat/biomesoplenty/jacaranda_wood.json | 20 - .../compat/biomesoplenty/magic_log.json | 20 - .../compat/biomesoplenty/magic_wood.json | 20 - .../compat/biomesoplenty/mahogany_log.json | 20 - .../compat/biomesoplenty/mahogany_wood.json | 20 - .../compat/biomesoplenty/palm_log.json | 20 - .../compat/biomesoplenty/palm_wood.json | 20 - .../compat/biomesoplenty/redwood_log.json | 20 - .../compat/biomesoplenty/redwood_wood.json | 20 - .../biomesoplenty/stripped_dead_log.json | 21 - .../biomesoplenty/stripped_dead_wood.json | 21 - .../biomesoplenty/stripped_fir_log.json | 21 - .../biomesoplenty/stripped_fir_wood.json | 21 - .../biomesoplenty/stripped_hellbark_log.json | 21 - .../biomesoplenty/stripped_hellbark_wood.json | 21 - .../biomesoplenty/stripped_jacaranda_log.json | 21 - .../stripped_jacaranda_wood.json | 21 - .../biomesoplenty/stripped_magic_log.json | 21 - .../biomesoplenty/stripped_magic_wood.json | 21 - .../biomesoplenty/stripped_mahogany_log.json | 21 - .../biomesoplenty/stripped_mahogany_wood.json | 21 - .../biomesoplenty/stripped_palm_log.json | 21 - .../biomesoplenty/stripped_palm_wood.json | 21 - .../biomesoplenty/stripped_redwood_log.json | 21 - .../biomesoplenty/stripped_redwood_wood.json | 21 - .../biomesoplenty/stripped_umbran_log.json | 21 - .../biomesoplenty/stripped_umbran_wood.json | 21 - .../biomesoplenty/stripped_willow_log.json | 21 - .../biomesoplenty/stripped_willow_wood.json | 21 - .../compat/biomesoplenty/umbran_log.json | 20 - .../compat/biomesoplenty/umbran_wood.json | 20 - .../compat/biomesoplenty/willow_log.json | 20 - .../compat/biomesoplenty/willow_wood.json | 20 - .../compat/blue_skies/bluebright_log.json | 20 - .../compat/blue_skies/bluebright_wood.json | 20 - .../compat/blue_skies/crystallized_log.json | 21 - .../compat/blue_skies/crystallized_wood.json | 21 - .../cutting/compat/blue_skies/dusk_log.json | 20 - .../cutting/compat/blue_skies/dusk_wood.json | 20 - .../compat/blue_skies/frostbright_log.json | 20 - .../compat/blue_skies/frostbright_wood.json | 20 - .../cutting/compat/blue_skies/lunar_log.json | 20 - .../cutting/compat/blue_skies/lunar_wood.json | 20 - .../cutting/compat/blue_skies/maple_log.json | 20 - .../cutting/compat/blue_skies/maple_wood.json | 20 - .../compat/blue_skies/starlit_log.json | 20 - .../compat/blue_skies/starlit_wood.json | 20 - .../blue_skies/stripped_bluebright_log.json | 21 - .../blue_skies/stripped_bluebright_wood.json | 21 - .../compat/blue_skies/stripped_dusk_log.json | 21 - .../compat/blue_skies/stripped_dusk_wood.json | 21 - .../blue_skies/stripped_frostbright_log.json | 21 - .../blue_skies/stripped_frostbright_wood.json | 21 - .../compat/blue_skies/stripped_lunar_log.json | 21 - .../blue_skies/stripped_lunar_wood.json | 21 - .../compat/blue_skies/stripped_maple_log.json | 21 - .../blue_skies/stripped_maple_wood.json | 21 - .../blue_skies/stripped_starlit_log.json | 21 - .../blue_skies/stripped_starlit_wood.json | 21 - .../cutting/compat/botania/dreamwood.json | 20 - .../cutting/compat/botania/dreamwood_log.json | 20 - .../compat/botania/glimmering_dreamwood.json | 20 - .../botania/glimmering_dreamwood_log.json | 20 - .../compat/botania/glimmering_livingwood.json | 20 - .../botania/glimmering_livingwood_log.json | 20 - .../glimmering_stripped_dreamwood.json | 21 - .../glimmering_stripped_dreamwood_log.json | 21 - .../glimmering_stripped_livingwood.json | 21 - .../glimmering_stripped_livingwood_log.json | 21 - .../cutting/compat/botania/livingwood.json | 20 - .../compat/botania/livingwood_log.json | 20 - .../compat/botania/stripped_dreamwood.json | 21 - .../botania/stripped_dreamwood_log.json | 21 - .../compat/botania/stripped_livingwood.json | 21 - .../botania/stripped_livingwood_log.json | 21 - .../recipes/cutting/compat/byg/aspen_log.json | 20 - .../cutting/compat/byg/aspen_wood.json | 20 - .../cutting/compat/byg/baobab_log.json | 20 - .../cutting/compat/byg/baobab_wood.json | 20 - .../compat/byg/blue_enchanted_log.json | 20 - .../compat/byg/blue_enchanted_wood.json | 20 - .../cutting/compat/byg/bulbis_stem.json | 20 - .../cutting/compat/byg/bulbis_wood.json | 20 - .../recipes/cutting/compat/byg/cika_log.json | 20 - .../recipes/cutting/compat/byg/cika_wood.json | 20 - .../cutting/compat/byg/cypress_log.json | 20 - .../cutting/compat/byg/cypress_wood.json | 20 - .../recipes/cutting/compat/byg/ebony_log.json | 20 - .../cutting/compat/byg/ebony_wood.json | 20 - .../recipes/cutting/compat/byg/ether_log.json | 20 - .../cutting/compat/byg/ether_wood.json | 20 - .../recipes/cutting/compat/byg/fir_log.json | 20 - .../recipes/cutting/compat/byg/fir_wood.json | 20 - .../compat/byg/fungal_imparius_hyphae.json | 21 - .../compat/byg/fungal_imparius_stem.json | 21 - .../compat/byg/green_enchanted_log.json | 20 - .../compat/byg/green_enchanted_wood.json | 20 - .../recipes/cutting/compat/byg/holly_log.json | 20 - .../cutting/compat/byg/holly_wood.json | 20 - .../cutting/compat/byg/imparius_hyphae.json | 21 - .../cutting/compat/byg/imparius_stem.json | 21 - .../cutting/compat/byg/jacaranda_log.json | 20 - .../cutting/compat/byg/jacaranda_wood.json | 20 - .../cutting/compat/byg/lament_log.json | 20 - .../cutting/compat/byg/lament_wood.json | 20 - .../cutting/compat/byg/mahogany_log.json | 20 - .../cutting/compat/byg/mahogany_wood.json | 20 - .../recipes/cutting/compat/byg/maple_log.json | 20 - .../cutting/compat/byg/maple_wood.json | 20 - .../cutting/compat/byg/nightshade_log.json | 20 - .../cutting/compat/byg/nightshade_wood.json | 20 - .../recipes/cutting/compat/byg/palm_log.json | 20 - .../recipes/cutting/compat/byg/palm_wood.json | 20 - .../cutting/compat/byg/palo_verde_log.json | 20 - .../cutting/compat/byg/palo_verde_wood.json | 20 - .../recipes/cutting/compat/byg/pine_log.json | 20 - .../recipes/cutting/compat/byg/pine_wood.json | 20 - .../compat/byg/rainbow_eucalyptus_log.json | 20 - .../compat/byg/rainbow_eucalyptus_wood.json | 20 - .../cutting/compat/byg/redwood_log.json | 20 - .../cutting/compat/byg/redwood_wood.json | 20 - .../cutting/compat/byg/skyris_log.json | 20 - .../cutting/compat/byg/skyris_wood.json | 20 - .../compat/byg/stripped_aspen_log.json | 21 - .../compat/byg/stripped_aspen_wood.json | 21 - .../compat/byg/stripped_baobab_log.json | 21 - .../compat/byg/stripped_baobab_wood.json | 21 - .../byg/stripped_blue_enchanted_log.json | 21 - .../byg/stripped_blue_enchanted_wood.json | 21 - .../compat/byg/stripped_bulbis_stem.json | 21 - .../compat/byg/stripped_bulbis_wood.json | 21 - .../cutting/compat/byg/stripped_cika_log.json | 21 - .../compat/byg/stripped_cika_wood.json | 21 - .../compat/byg/stripped_cypress_log.json | 21 - .../compat/byg/stripped_cypress_wood.json | 21 - .../compat/byg/stripped_ebony_log.json | 21 - .../compat/byg/stripped_ebony_wood.json | 21 - .../compat/byg/stripped_ether_log.json | 21 - .../compat/byg/stripped_ether_wood.json | 21 - .../cutting/compat/byg/stripped_fir_log.json | 21 - .../cutting/compat/byg/stripped_fir_wood.json | 21 - .../byg/stripped_green_enchanted_log.json | 21 - .../byg/stripped_green_enchanted_wood.json | 21 - .../compat/byg/stripped_holly_log.json | 21 - .../compat/byg/stripped_holly_wood.json | 21 - .../compat/byg/stripped_jacaranda_log.json | 21 - .../compat/byg/stripped_jacaranda_wood.json | 21 - .../compat/byg/stripped_lament_log.json | 21 - .../compat/byg/stripped_lament_wood.json | 21 - .../compat/byg/stripped_mahogany_log.json | 21 - .../compat/byg/stripped_mahogany_wood.json | 21 - .../compat/byg/stripped_maple_log.json | 21 - .../compat/byg/stripped_maple_wood.json | 21 - .../compat/byg/stripped_nightshade_log.json | 21 - .../compat/byg/stripped_nightshade_wood.json | 21 - .../cutting/compat/byg/stripped_palm_log.json | 21 - .../compat/byg/stripped_palm_wood.json | 21 - .../cutting/compat/byg/stripped_pine_log.json | 21 - .../compat/byg/stripped_pine_wood.json | 21 - .../byg/stripped_rainbow_eucalyptus_log.json | 21 - .../byg/stripped_rainbow_eucalyptus_wood.json | 21 - .../compat/byg/stripped_redwood_log.json | 21 - .../compat/byg/stripped_redwood_wood.json | 21 - .../compat/byg/stripped_skyris_log.json | 21 - .../compat/byg/stripped_skyris_wood.json | 21 - .../compat/byg/stripped_willow_log.json | 21 - .../compat/byg/stripped_willow_wood.json | 21 - .../compat/byg/stripped_witch_hazel_log.json | 21 - .../compat/byg/stripped_witch_hazel_wood.json | 21 - .../compat/byg/stripped_zelkova_log.json | 21 - .../compat/byg/stripped_zelkova_wood.json | 21 - .../cutting/compat/byg/willow_log.json | 20 - .../cutting/compat/byg/willow_wood.json | 20 - .../cutting/compat/byg/witch_hazel_log.json | 20 - .../cutting/compat/byg/witch_hazel_wood.json | 20 - .../cutting/compat/byg/zelkova_log.json | 20 - .../cutting/compat/byg/zelkova_wood.json | 20 - .../cutting/compat/ecologics/azalea_log.json | 20 - .../cutting/compat/ecologics/azalea_wood.json | 20 - .../cutting/compat/ecologics/coconut_log.json | 20 - .../compat/ecologics/coconut_wood.json | 20 - .../ecologics/flowering_azalea_log.json | 20 - .../ecologics/flowering_azalea_wood.json | 20 - .../compat/ecologics/stripped_azalea_log.json | 21 - .../ecologics/stripped_azalea_wood.json | 21 - .../ecologics/stripped_coconut_log.json | 21 - .../ecologics/stripped_coconut_wood.json | 21 - .../compat/ecologics/stripped_walnut_log.json | 21 - .../ecologics/stripped_walnut_wood.json | 21 - .../cutting/compat/ecologics/walnut_log.json | 20 - .../cutting/compat/ecologics/walnut_wood.json | 20 - .../cutting/compat/endergetic/poise_stem.json | 20 - .../endergetic/stripped_poise_stem.json | 21 - .../compat/environmental/cherry_log.json | 20 - .../compat/environmental/cherry_wood.json | 20 - .../environmental/stripped_cherry_log.json | 21 - .../environmental/stripped_cherry_wood.json | 21 - .../environmental/stripped_willow_log.json | 21 - .../environmental/stripped_willow_wood.json | 21 - .../environmental/stripped_wisteria_log.json | 21 - .../environmental/stripped_wisteria_wood.json | 21 - .../compat/environmental/willow_log.json | 20 - .../compat/environmental/willow_wood.json | 20 - .../compat/environmental/wisteria_log.json | 20 - .../compat/environmental/wisteria_wood.json | 20 - .../compat/forbidden_arcanus/aurum_log.json | 20 - .../compat/forbidden_arcanus/aurum_wood.json | 20 - .../forbidden_arcanus/stripped_aurum_log.json | 21 - .../stripped_aurum_wood.json | 21 - .../compat/goodending/cypress_log.json | 20 - .../compat/goodending/cypress_wood.json | 20 - .../compat/goodending/muddy_oak_log.json | 20 - .../compat/goodending/muddy_oak_wood.json | 20 - .../goodending/stripped_cypress_log.json | 21 - .../goodending/stripped_cypress_wood.json | 21 - .../goodending/stripped_muddy_oak_log.json | 21 - .../goodending/stripped_muddy_oak_wood.json | 21 - .../compat/hexcasting/edified_log.json | 20 - .../compat/hexcasting/edified_wood.json | 20 - .../hexcasting/stripped_edified_log.json | 21 - .../hexcasting/stripped_edified_wood.json | 21 - .../compat/integrateddynamics/menril_log.json | 20 - .../menril_log_stripped.json | 21 - .../integrateddynamics/menril_wood.json | 20 - .../menril_wood_stripped.json | 21 - .../nethers_exoticism/jabuticaba_log.json | 20 - .../nethers_exoticism/ramboutan_log.json | 20 - .../nethers_exoticism/ramboutan_wood.json | 20 - .../stripped_jabuticaba_log.json | 21 - .../stripped_ramboutan_log.json | 21 - .../stripped_ramboutan_wood.json | 21 - .../cutting/compat/quark/ancient_log.json | 20 - .../cutting/compat/quark/ancient_wood.json | 20 - .../cutting/compat/quark/azalea_log.json | 20 - .../cutting/compat/quark/azalea_wood.json | 20 - .../cutting/compat/quark/blossom_log.json | 20 - .../cutting/compat/quark/blossom_wood.json | 20 - .../compat/quark/stripped_ancient_log.json | 21 - .../compat/quark/stripped_ancient_wood.json | 21 - .../compat/quark/stripped_azalea_log.json | 21 - .../compat/quark/stripped_azalea_wood.json | 21 - .../compat/quark/stripped_blossom_log.json | 21 - .../compat/quark/stripped_blossom_wood.json | 21 - .../compat/regions_unexplored/alpha_log.json | 21 - .../compat/regions_unexplored/ashen_log.json | 20 - .../compat/regions_unexplored/ashen_wood.json | 20 - .../compat/regions_unexplored/baobab_log.json | 20 - .../regions_unexplored/baobab_wood.json | 20 - .../regions_unexplored/blackwood_log.json | 20 - .../regions_unexplored/blackwood_wood.json | 20 - .../blue_bioshroom_hyphae.json | 20 - .../blue_bioshroom_stem.json | 20 - .../regions_unexplored/brimwood_log.json | 20 - .../brimwood_log_magma.json | 20 - .../regions_unexplored/brimwood_wood.json | 20 - .../compat/regions_unexplored/cobalt_log.json | 20 - .../regions_unexplored/cobalt_wood.json | 20 - .../regions_unexplored/cypress_log.json | 20 - .../regions_unexplored/cypress_wood.json | 20 - .../compat/regions_unexplored/dead_log.json | 20 - .../compat/regions_unexplored/dead_wood.json | 20 - .../regions_unexplored/eucalyptus_log.json | 20 - .../regions_unexplored/eucalyptus_wood.json | 20 - .../green_bioshroom_hyphae.json | 20 - .../green_bioshroom_stem.json | 20 - .../compat/regions_unexplored/joshua_log.json | 20 - .../regions_unexplored/joshua_wood.json | 20 - .../compat/regions_unexplored/kapok_log.json | 20 - .../compat/regions_unexplored/kapok_wood.json | 20 - .../compat/regions_unexplored/larch_log.json | 20 - .../compat/regions_unexplored/larch_wood.json | 20 - .../regions_unexplored/magnolia_log.json | 20 - .../regions_unexplored/magnolia_wood.json | 20 - .../compat/regions_unexplored/maple_log.json | 20 - .../compat/regions_unexplored/maple_wood.json | 20 - .../compat/regions_unexplored/mauve_log.json | 20 - .../compat/regions_unexplored/mauve_wood.json | 20 - .../compat/regions_unexplored/palm_log.json | 20 - .../compat/regions_unexplored/palm_wood.json | 20 - .../compat/regions_unexplored/pine_log.json | 20 - .../compat/regions_unexplored/pine_wood.json | 20 - .../pink_bioshroom_hyphae.json | 20 - .../pink_bioshroom_stem.json | 20 - .../regions_unexplored/redwood_log.json | 20 - .../regions_unexplored/redwood_wood.json | 20 - .../regions_unexplored/socotra_log.json | 20 - .../regions_unexplored/socotra_wood.json | 20 - .../stripped_baobab_log.json | 21 - .../stripped_baobab_wood.json | 21 - .../stripped_blackwood_log.json | 21 - .../stripped_blackwood_wood.json | 21 - .../stripped_blue_bioshroom_hyphae.json | 21 - .../stripped_blue_bioshroom_stem.json | 21 - .../stripped_brimwood_log.json | 21 - .../stripped_brimwood_wood.json | 21 - .../stripped_cobalt_log.json | 21 - .../stripped_cobalt_wood.json | 21 - .../stripped_cypress_log.json | 21 - .../stripped_cypress_wood.json | 21 - .../regions_unexplored/stripped_dead_log.json | 21 - .../stripped_dead_wood.json | 21 - .../stripped_eucalyptus_log.json | 21 - .../stripped_eucalyptus_wood.json | 21 - .../stripped_green_bioshroom_hyphae.json | 21 - .../stripped_green_bioshroom_stem.json | 21 - .../stripped_joshua_log.json | 21 - .../stripped_joshua_wood.json | 21 - .../stripped_kapok_log.json | 21 - .../stripped_kapok_wood.json | 21 - .../stripped_larch_log.json | 21 - .../stripped_larch_wood.json | 21 - .../stripped_magnolia_log.json | 21 - .../stripped_magnolia_wood.json | 21 - .../stripped_maple_log.json | 21 - .../stripped_maple_wood.json | 21 - .../stripped_mauve_log.json | 21 - .../stripped_mauve_wood.json | 21 - .../regions_unexplored/stripped_palm_log.json | 21 - .../stripped_palm_wood.json | 21 - .../regions_unexplored/stripped_pine_log.json | 21 - .../stripped_pine_wood.json | 21 - .../stripped_pink_bioshroom_hyphae.json | 21 - .../stripped_pink_bioshroom_stem.json | 21 - .../stripped_redwood_log.json | 21 - .../stripped_redwood_wood.json | 21 - .../stripped_socotra_log.json | 21 - .../stripped_socotra_wood.json | 21 - .../stripped_willow_log.json | 21 - .../stripped_willow_wood.json | 21 - .../stripped_yellow_bioshroom_hyphae.json | 21 - .../stripped_yellow_bioshroom_stem.json | 21 - .../compat/regions_unexplored/willow_log.json | 20 - .../regions_unexplored/willow_wood.json | 20 - .../yellow_bioshroom_hyphae.json | 20 - .../yellow_bioshroom_stem.json | 20 - .../compat/silentgear/netherwood_log.json | 20 - .../compat/silentgear/netherwood_wood.json | 20 - .../silentgear/stripped_netherwood_log.json | 21 - .../silentgear/stripped_netherwood_wood.json | 21 - .../compat/tconstruct/bloodshroom_log.json | 20 - .../compat/tconstruct/bloodshroom_wood.json | 20 - .../compat/tconstruct/greenheart_log.json | 20 - .../compat/tconstruct/greenheart_wood.json | 20 - .../compat/tconstruct/skyroot_log.json | 20 - .../compat/tconstruct/skyroot_wood.json | 20 - .../tconstruct/stripped_bloodshroom_log.json | 21 - .../tconstruct/stripped_bloodshroom_wood.json | 21 - .../tconstruct/stripped_greenheart_log.json | 21 - .../tconstruct/stripped_greenheart_wood.json | 21 - .../tconstruct/stripped_skyroot_log.json | 21 - .../tconstruct/stripped_skyroot_wood.json | 21 - .../compat/the_vault/chromatic_log.json | 20 - .../compat/the_vault/driftwood_log.json | 20 - .../the_vault/overgrown_wooden_log.json | 20 - .../the_vault/stripped_chromatic_log.json | 21 - .../the_vault/stripped_driftwood_log.json | 21 - .../stripped_overgrown_wooden_log.json | 21 - .../compat/the_vault/stripped_wooden_log.json | 21 - .../cutting/compat/the_vault/wooden_log.json | 20 - .../compat/twilightforest/canopy_log.json | 20 - .../compat/twilightforest/canopy_wood.json | 20 - .../compat/twilightforest/dark_log.json | 20 - .../compat/twilightforest/dark_wood.json | 20 - .../compat/twilightforest/mangrove_log.json | 20 - .../compat/twilightforest/mangrove_wood.json | 20 - .../compat/twilightforest/mining_log.json | 20 - .../compat/twilightforest/mining_wood.json | 20 - .../compat/twilightforest/sorting_log.json | 20 - .../compat/twilightforest/sorting_wood.json | 20 - .../twilightforest/stripped_canopy_log.json | 21 - .../twilightforest/stripped_canopy_wood.json | 21 - .../twilightforest/stripped_dark_log.json | 21 - .../twilightforest/stripped_dark_wood.json | 21 - .../twilightforest/stripped_mangrove_log.json | 21 - .../stripped_mangrove_wood.json | 21 - .../twilightforest/stripped_mining_log.json | 21 - .../twilightforest/stripped_mining_wood.json | 21 - .../twilightforest/stripped_sorting_log.json | 21 - .../twilightforest/stripped_sorting_wood.json | 21 - .../twilightforest/stripped_time_log.json | 21 - .../twilightforest/stripped_time_wood.json | 21 - .../stripped_transformation_log.json | 21 - .../stripped_transformation_wood.json | 21 - .../stripped_twilight_oak_log.json | 21 - .../stripped_twilight_oak_wood.json | 21 - .../compat/twilightforest/time_log.json | 20 - .../compat/twilightforest/time_wood.json | 20 - .../twilightforest/transformation_log.json | 20 - .../twilightforest/transformation_wood.json | 20 - .../twilightforest/twilight_oak_log.json | 20 - .../twilightforest/twilight_oak_wood.json | 20 - .../compat/upgrade_aquatic/driftwood.json | 20 - .../compat/upgrade_aquatic/driftwood_log.json | 20 - .../compat/upgrade_aquatic/river_log.json | 20 - .../compat/upgrade_aquatic/river_wood.json | 20 - .../upgrade_aquatic/stripped_driftwood.json | 21 - .../stripped_driftwood_log.json | 21 - .../upgrade_aquatic/stripped_river_log.json | 21 - .../upgrade_aquatic/stripped_river_wood.json | 21 - .../compat/windswept/chestnut_log.json | 20 - .../compat/windswept/chestnut_wood.json | 20 - .../cutting/compat/windswept/holly_log.json | 20 - .../cutting/compat/windswept/holly_wood.json | 20 - .../windswept/stripped_chestnut_log.json | 21 - .../windswept/stripped_chestnut_wood.json | 21 - .../compat/windswept/stripped_holly_log.json | 21 - .../compat/windswept/stripped_holly_wood.json | 21 - .../recipes/cutting/crimson_hyphae.json | 14 - .../create/recipes/cutting/crimson_stem.json | 14 - .../create/recipes/cutting/dark_oak_log.json | 14 - .../create/recipes/cutting/dark_oak_wood.json | 14 - .../create/recipes/cutting/jungle_log.json | 14 - .../create/recipes/cutting/jungle_wood.json | 14 - .../create/recipes/cutting/mangrove_log.json | 14 - .../create/recipes/cutting/mangrove_wood.json | 14 - .../data/create/recipes/cutting/oak_log.json | 14 - .../data/create/recipes/cutting/oak_wood.json | 14 - .../create/recipes/cutting/spruce_log.json | 14 - .../create/recipes/cutting/spruce_wood.json | 14 - .../recipes/cutting/stripped_acacia_log.json | 15 - .../recipes/cutting/stripped_acacia_wood.json | 15 - .../recipes/cutting/stripped_birch_log.json | 15 - .../recipes/cutting/stripped_birch_wood.json | 15 - .../recipes/cutting/stripped_cherry_log.json | 15 - .../recipes/cutting/stripped_cherry_wood.json | 15 - .../cutting/stripped_crimson_hyphae.json | 15 - .../cutting/stripped_crimson_stem.json | 15 - .../cutting/stripped_dark_oak_log.json | 15 - .../cutting/stripped_dark_oak_wood.json | 15 - .../recipes/cutting/stripped_jungle_log.json | 15 - .../recipes/cutting/stripped_jungle_wood.json | 15 - .../cutting/stripped_mangrove_log.json | 15 - .../cutting/stripped_mangrove_wood.json | 15 - .../recipes/cutting/stripped_oak_log.json | 15 - .../recipes/cutting/stripped_oak_wood.json | 15 - .../recipes/cutting/stripped_spruce_log.json | 15 - .../recipes/cutting/stripped_spruce_wood.json | 15 - .../cutting/stripped_warped_hyphae.json | 15 - .../recipes/cutting/stripped_warped_stem.json | 15 - .../create/recipes/cutting/warped_hyphae.json | 14 - .../create/recipes/cutting/warped_stem.json | 14 - .../simibubi/create/compat/jei/CreateJEI.java | 9 - .../content/kinetics/saw/SawBlockEntity.java | 7 +- .../recipe/ProcessingRecipeBuilder.java | 7 +- .../data/recipe/CuttingRecipeGen.java | 142 +---- .../foundation/events/CommonEvents.java | 11 +- .../create/foundation/pack/DynamicPack.java | 116 ++++ .../foundation/pack/DynamicPackSource.java | 21 + .../{ => pack}/ModFilePackResources.java | 3 +- .../foundation/recipe/RecipeFinder.java | 51 +- .../recipe/RuntimeDataGenerator.java | 130 +++++ .../infrastructure/config/CRecipes.java | 3 +- 500 files changed, 329 insertions(+), 10451 deletions(-) delete mode 100644 src/generated/resources/data/create/recipes/cutting/acacia_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/acacia_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/birch_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/birch_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/cherry_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/cherry_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/architects_palette/stripped_twisted_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/architects_palette/stripped_twisted_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/architects_palette/twisted_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/architects_palette/twisted_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/atmospheric/aspen_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/atmospheric/aspen_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/atmospheric/grimwood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/atmospheric/grimwood_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/atmospheric/kousa_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/atmospheric/kousa_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/atmospheric/morado_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/atmospheric/morado_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/atmospheric/rosewood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/atmospheric/rosewood_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/atmospheric/stripped_aspen_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/atmospheric/stripped_aspen_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/atmospheric/stripped_grimwood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/atmospheric/stripped_grimwood_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/atmospheric/stripped_kousa_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/atmospheric/stripped_kousa_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/atmospheric/stripped_morado_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/atmospheric/stripped_morado_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/atmospheric/stripped_rosewood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/atmospheric/stripped_rosewood_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/atmospheric/stripped_yucca_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/atmospheric/stripped_yucca_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/atmospheric/yucca_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/atmospheric/yucca_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/autumnity/maple_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/autumnity/maple_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/autumnity/sappy_maple_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/autumnity/sappy_maple_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/autumnity/stripped_maple_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/autumnity/stripped_maple_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/dead_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/dead_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/fir_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/fir_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/hellbark_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/hellbark_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/jacaranda_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/jacaranda_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/magic_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/magic_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/mahogany_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/mahogany_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/palm_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/palm_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/redwood_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/redwood_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_dead_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_dead_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_fir_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_fir_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_hellbark_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_hellbark_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_jacaranda_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_jacaranda_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_magic_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_magic_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_mahogany_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_mahogany_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_palm_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_palm_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_redwood_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_redwood_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_umbran_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_umbran_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_willow_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_willow_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/umbran_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/umbran_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/willow_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/willow_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/blue_skies/bluebright_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/blue_skies/bluebright_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/blue_skies/crystallized_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/blue_skies/crystallized_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/blue_skies/dusk_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/blue_skies/dusk_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/blue_skies/frostbright_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/blue_skies/frostbright_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/blue_skies/lunar_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/blue_skies/lunar_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/blue_skies/maple_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/blue_skies/maple_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/blue_skies/starlit_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/blue_skies/starlit_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/blue_skies/stripped_bluebright_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/blue_skies/stripped_bluebright_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/blue_skies/stripped_dusk_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/blue_skies/stripped_dusk_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/blue_skies/stripped_frostbright_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/blue_skies/stripped_frostbright_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/blue_skies/stripped_lunar_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/blue_skies/stripped_lunar_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/blue_skies/stripped_maple_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/blue_skies/stripped_maple_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/blue_skies/stripped_starlit_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/blue_skies/stripped_starlit_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/botania/dreamwood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/botania/dreamwood_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/botania/glimmering_dreamwood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/botania/glimmering_dreamwood_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/botania/glimmering_livingwood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/botania/glimmering_livingwood_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/botania/glimmering_stripped_dreamwood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/botania/glimmering_stripped_dreamwood_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/botania/glimmering_stripped_livingwood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/botania/glimmering_stripped_livingwood_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/botania/livingwood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/botania/livingwood_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/botania/stripped_dreamwood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/botania/stripped_dreamwood_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/botania/stripped_livingwood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/botania/stripped_livingwood_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/aspen_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/aspen_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/baobab_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/baobab_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/blue_enchanted_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/blue_enchanted_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/bulbis_stem.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/bulbis_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/cika_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/cika_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/cypress_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/cypress_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/ebony_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/ebony_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/ether_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/ether_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/fir_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/fir_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/fungal_imparius_hyphae.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/fungal_imparius_stem.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/green_enchanted_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/green_enchanted_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/holly_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/holly_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/imparius_hyphae.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/imparius_stem.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/jacaranda_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/jacaranda_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/lament_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/lament_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/mahogany_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/mahogany_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/maple_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/maple_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/nightshade_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/nightshade_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/palm_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/palm_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/palo_verde_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/palo_verde_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/pine_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/pine_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/rainbow_eucalyptus_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/rainbow_eucalyptus_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/redwood_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/redwood_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/skyris_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/skyris_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_aspen_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_aspen_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_baobab_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_baobab_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_blue_enchanted_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_blue_enchanted_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_bulbis_stem.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_bulbis_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_cika_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_cika_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_cypress_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_cypress_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_ebony_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_ebony_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_ether_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_ether_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_fir_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_fir_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_green_enchanted_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_green_enchanted_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_holly_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_holly_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_jacaranda_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_jacaranda_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_lament_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_lament_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_mahogany_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_mahogany_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_maple_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_maple_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_nightshade_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_nightshade_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_palm_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_palm_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_pine_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_pine_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_rainbow_eucalyptus_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_rainbow_eucalyptus_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_redwood_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_redwood_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_skyris_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_skyris_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_willow_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_willow_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_witch_hazel_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_witch_hazel_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_zelkova_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_zelkova_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/willow_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/willow_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/witch_hazel_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/witch_hazel_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/zelkova_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/byg/zelkova_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/ecologics/azalea_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/ecologics/azalea_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/ecologics/coconut_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/ecologics/coconut_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/ecologics/flowering_azalea_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/ecologics/flowering_azalea_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/ecologics/stripped_azalea_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/ecologics/stripped_azalea_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/ecologics/stripped_coconut_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/ecologics/stripped_coconut_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/ecologics/stripped_walnut_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/ecologics/stripped_walnut_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/ecologics/walnut_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/ecologics/walnut_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/endergetic/poise_stem.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/endergetic/stripped_poise_stem.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/environmental/cherry_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/environmental/cherry_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/environmental/stripped_cherry_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/environmental/stripped_cherry_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/environmental/stripped_willow_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/environmental/stripped_willow_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/environmental/stripped_wisteria_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/environmental/stripped_wisteria_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/environmental/willow_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/environmental/willow_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/environmental/wisteria_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/environmental/wisteria_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/forbidden_arcanus/aurum_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/forbidden_arcanus/aurum_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/forbidden_arcanus/stripped_aurum_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/forbidden_arcanus/stripped_aurum_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/goodending/cypress_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/goodending/cypress_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/goodending/muddy_oak_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/goodending/muddy_oak_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/goodending/stripped_cypress_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/goodending/stripped_cypress_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/goodending/stripped_muddy_oak_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/goodending/stripped_muddy_oak_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/hexcasting/edified_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/hexcasting/edified_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/hexcasting/stripped_edified_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/hexcasting/stripped_edified_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/integrateddynamics/menril_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/integrateddynamics/menril_log_stripped.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/integrateddynamics/menril_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/integrateddynamics/menril_wood_stripped.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/nethers_exoticism/jabuticaba_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/nethers_exoticism/ramboutan_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/nethers_exoticism/ramboutan_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/nethers_exoticism/stripped_jabuticaba_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/nethers_exoticism/stripped_ramboutan_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/nethers_exoticism/stripped_ramboutan_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/quark/ancient_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/quark/ancient_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/quark/azalea_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/quark/azalea_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/quark/blossom_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/quark/blossom_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/quark/stripped_ancient_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/quark/stripped_ancient_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/quark/stripped_azalea_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/quark/stripped_azalea_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/quark/stripped_blossom_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/quark/stripped_blossom_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/alpha_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/ashen_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/ashen_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/baobab_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/baobab_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/blackwood_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/blackwood_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/blue_bioshroom_hyphae.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/blue_bioshroom_stem.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/brimwood_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/brimwood_log_magma.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/brimwood_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/cobalt_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/cobalt_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/cypress_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/cypress_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/dead_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/dead_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/eucalyptus_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/eucalyptus_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/green_bioshroom_hyphae.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/green_bioshroom_stem.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/joshua_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/joshua_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/kapok_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/kapok_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/larch_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/larch_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/magnolia_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/magnolia_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/maple_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/maple_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/mauve_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/mauve_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/palm_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/palm_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/pine_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/pine_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/pink_bioshroom_hyphae.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/pink_bioshroom_stem.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/redwood_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/redwood_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/socotra_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/socotra_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_baobab_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_baobab_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_blackwood_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_blackwood_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_blue_bioshroom_hyphae.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_blue_bioshroom_stem.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_brimwood_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_brimwood_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_cobalt_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_cobalt_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_cypress_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_cypress_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_dead_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_dead_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_eucalyptus_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_eucalyptus_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_green_bioshroom_hyphae.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_green_bioshroom_stem.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_joshua_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_joshua_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_kapok_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_kapok_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_larch_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_larch_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_magnolia_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_magnolia_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_maple_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_maple_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_mauve_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_mauve_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_palm_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_palm_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_pine_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_pine_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_pink_bioshroom_hyphae.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_pink_bioshroom_stem.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_redwood_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_redwood_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_socotra_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_socotra_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_willow_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_willow_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_yellow_bioshroom_hyphae.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_yellow_bioshroom_stem.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/willow_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/willow_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/yellow_bioshroom_hyphae.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/yellow_bioshroom_stem.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/silentgear/netherwood_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/silentgear/netherwood_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/silentgear/stripped_netherwood_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/silentgear/stripped_netherwood_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/tconstruct/bloodshroom_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/tconstruct/bloodshroom_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/tconstruct/greenheart_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/tconstruct/greenheart_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/tconstruct/skyroot_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/tconstruct/skyroot_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/tconstruct/stripped_bloodshroom_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/tconstruct/stripped_bloodshroom_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/tconstruct/stripped_greenheart_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/tconstruct/stripped_greenheart_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/tconstruct/stripped_skyroot_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/tconstruct/stripped_skyroot_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/the_vault/chromatic_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/the_vault/driftwood_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/the_vault/overgrown_wooden_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/the_vault/stripped_chromatic_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/the_vault/stripped_driftwood_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/the_vault/stripped_overgrown_wooden_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/the_vault/stripped_wooden_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/the_vault/wooden_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/twilightforest/canopy_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/twilightforest/canopy_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/twilightforest/dark_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/twilightforest/dark_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/twilightforest/mangrove_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/twilightforest/mangrove_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/twilightforest/mining_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/twilightforest/mining_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/twilightforest/sorting_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/twilightforest/sorting_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_canopy_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_canopy_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_dark_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_dark_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_mangrove_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_mangrove_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_mining_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_mining_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_sorting_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_sorting_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_time_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_time_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_transformation_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_transformation_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_twilight_oak_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_twilight_oak_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/twilightforest/time_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/twilightforest/time_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/twilightforest/transformation_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/twilightforest/transformation_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/twilightforest/twilight_oak_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/twilightforest/twilight_oak_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/upgrade_aquatic/driftwood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/upgrade_aquatic/driftwood_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/upgrade_aquatic/river_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/upgrade_aquatic/river_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/upgrade_aquatic/stripped_driftwood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/upgrade_aquatic/stripped_driftwood_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/upgrade_aquatic/stripped_river_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/upgrade_aquatic/stripped_river_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/windswept/chestnut_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/windswept/chestnut_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/windswept/holly_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/windswept/holly_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/windswept/stripped_chestnut_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/windswept/stripped_chestnut_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/windswept/stripped_holly_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/compat/windswept/stripped_holly_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/crimson_hyphae.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/crimson_stem.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/dark_oak_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/dark_oak_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/jungle_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/jungle_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/mangrove_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/mangrove_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/oak_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/oak_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/spruce_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/spruce_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/stripped_acacia_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/stripped_acacia_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/stripped_birch_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/stripped_birch_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/stripped_cherry_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/stripped_cherry_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/stripped_crimson_hyphae.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/stripped_crimson_stem.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/stripped_dark_oak_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/stripped_dark_oak_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/stripped_jungle_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/stripped_jungle_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/stripped_mangrove_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/stripped_mangrove_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/stripped_oak_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/stripped_oak_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/stripped_spruce_log.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/stripped_spruce_wood.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/stripped_warped_hyphae.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/stripped_warped_stem.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/warped_hyphae.json delete mode 100644 src/generated/resources/data/create/recipes/cutting/warped_stem.json create mode 100644 src/main/java/com/simibubi/create/foundation/pack/DynamicPack.java create mode 100644 src/main/java/com/simibubi/create/foundation/pack/DynamicPackSource.java rename src/main/java/com/simibubi/create/foundation/{ => pack}/ModFilePackResources.java (90%) create mode 100644 src/main/java/com/simibubi/create/foundation/recipe/RuntimeDataGenerator.java diff --git a/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 b/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 index be9555e776..e92c8b95a1 100644 --- a/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 +++ b/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 @@ -1,4 +1,4 @@ -// 1.20.1 2024-12-12T16:30:46.5531873 Create's Processing Recipes +// 1.20.1 2025-01-04T11:02:37.49645821 Create's Processing Recipes 3c94326fb730f68c1e44fe1e2ef09c9db6ffd92b data/create/recipes/compacting/andesite_from_flint.json 8d3d5b31f3601b9f681ff710e0545a483a1494c6 data/create/recipes/compacting/blaze_cake.json 8bd7f4e3a686ab520b2d55594d2018d0e9a50c91 data/create/recipes/compacting/chocolate.json @@ -97,18 +97,18 @@ df364151c75a7d84446b2c6213e339115bc9d298 data/create/recipes/crushing/diorite_re 9e89294e53a94a05af47948c21ad192ef18f7710 data/create/recipes/crushing/emerald_ore.json 9c3989fd9e72e21353803f475a08b8f199717c1f data/create/recipes/crushing/gilded_blackstone.json 3c4c78e3a7137022f8f6e90324af6c8f97050e80 data/create/recipes/crushing/glowstone.json -95b76da439260151355fff74b3b7398ce13d6968 data/create/recipes/crushing/golden_horse_armor.json b036b1654d2deec20aca95ff43b60c7d0b28b2fc data/create/recipes/crushing/gold_ore.json +95b76da439260151355fff74b3b7398ce13d6968 data/create/recipes/crushing/golden_horse_armor.json cc939ba59b95db1c7a034df6f9e656772074a5fd data/create/recipes/crushing/gravel.json 17ab2d789c9c2df122b6a96ab06bbe2c02592a93 data/create/recipes/crushing/iron_horse_armor.json c9a47b29ba75ba29c8cb630fe32c4bf2f1f1d1ae data/create/recipes/crushing/iron_ore.json 855b6655dea911724ee68d07b993f17440ac422e data/create/recipes/crushing/lapis_ore.json 492827ab3d55ca3edfef5eb006b1f77d62e1b446 data/create/recipes/crushing/lead_ore.json e170bc17a796c73a05d2d77a85c086cfaac55c31 data/create/recipes/crushing/leather_horse_armor.json -606ccdf3119a62ab461028192d191ffb10332e21 data/create/recipes/crushing/netherrack.json 07e8991a2161aab4dd73bb74900fd0c70aad2847 data/create/recipes/crushing/nether_gold_ore.json c7c0d94707c2858a87d01cff6b284d7fb85acdbe data/create/recipes/crushing/nether_quartz_ore.json 0380b9416b263de2ee6a6cd1f4064df2e243c047 data/create/recipes/crushing/nether_wart_block.json +606ccdf3119a62ab461028192d191ffb10332e21 data/create/recipes/crushing/netherrack.json d3534d606382ec7c1d34275c5f069543d0955906 data/create/recipes/crushing/nickel_ore.json 66f75530e30d8572bdbf4696a32edc5a7850ac00 data/create/recipes/crushing/obsidian.json 17cacb19493b9bbe7236b19a2a50a817c449a915 data/create/recipes/crushing/ochrum.json @@ -153,19 +153,9 @@ e4cdcc67baffa90e27a73a2ba59ec92b323e1d4f data/create/recipes/crushing/veridium.j bfd5baa72a48ef29c3141b57a88f5ead0f723614 data/create/recipes/crushing/veridium_recycling.json b135e3faf6afef4b6a5f00197997b47ff8e90568 data/create/recipes/crushing/wool.json 931a66992ccb5accdb435dca6fe6532e86250c0d data/create/recipes/crushing/zinc_ore.json -b5c33d039e3c9771b3ffc322aadae7e75a823635 data/create/recipes/cutting/acacia_log.json -b45b88bf2ac614b2518437656746f8e8a465d693 data/create/recipes/cutting/acacia_wood.json cdb26cd91feeda5901f31f57c16517dda5287810 data/create/recipes/cutting/andesite_alloy.json 5afeada82e71eb5012e35725821792f64d92a6b3 data/create/recipes/cutting/bamboo_block.json 4ac4bb94de7b25a3eec85e8290ab5f2f6b2b4167 data/create/recipes/cutting/bamboo_planks.json -1a3dd0e51603a3e47da4465da210004c78028faf data/create/recipes/cutting/birch_log.json -71c3a093c849a99fbaef8772114ac9305627f2c1 data/create/recipes/cutting/birch_wood.json -31a1713f8bc5577b3fcf2fcfd2d42dac145f9560 data/create/recipes/cutting/cherry_log.json -0f54293540ad75e6395452253f4ab5c8e5166e93 data/create/recipes/cutting/cherry_wood.json -4f756e256a7814e2b9a6632d38633bb78c5046cd data/create/recipes/cutting/compat/architects_palette/stripped_twisted_log.json -310dfb6c7e7649c0ede306fda71459e7f2bc8c7e data/create/recipes/cutting/compat/architects_palette/stripped_twisted_wood.json -8645e8ee47b0a6a432f85b7f2e07957e21adeb70 data/create/recipes/cutting/compat/architects_palette/twisted_log.json -085c2e98ccd55576f4948bccfda443ff3d95824b data/create/recipes/cutting/compat/architects_palette/twisted_wood.json 60a64dc871d6b23274e01edfa9cdd331aa4365c9 data/create/recipes/cutting/compat/ars_nouveau/blue_archwood_log.json e4c23f6502bae92d3baa1845da87073e1719938e data/create/recipes/cutting/compat/ars_nouveau/blue_archwood_wood.json 1ff887f11099b4536bf6fad3e407a37e83d3bfca data/create/recipes/cutting/compat/ars_nouveau/green_archwood_log.json @@ -182,526 +172,48 @@ af1ca00e05d554bba1d85c766e52560d5ea8fe4d data/create/recipes/cutting/compat/ars_ 1a66e7e6dfba9531bbb5a1d0bf014e16d6cbb6be data/create/recipes/cutting/compat/ars_nouveau/stripped_purple_archwood_wood.json 5c1c8275b2e30fdf387dcf358fd41e995e817c86 data/create/recipes/cutting/compat/ars_nouveau/stripped_red_archwood_log.json 9dc5bd8a1002b9d299d60a405720950eb0b4e9ab data/create/recipes/cutting/compat/ars_nouveau/stripped_red_archwood_wood.json -08337ca1d46e04197fa31ccc21c3fcbbc0efde5a data/create/recipes/cutting/compat/atmospheric/aspen_log.json -1077e644ee8e83e39dbd695e5ed7b12591aedcfa data/create/recipes/cutting/compat/atmospheric/aspen_wood.json -339cc9026c5d89c8b78283baf5f21cb8b4471bad data/create/recipes/cutting/compat/atmospheric/grimwood.json -a8c2ff06f663881b1edbf7eab5e91083e59cf568 data/create/recipes/cutting/compat/atmospheric/grimwood_log.json -16640492eab4c22bf18e06fdf7a0469e1326f10b data/create/recipes/cutting/compat/atmospheric/kousa_log.json -0f2b8fa779cd3bc6e2ac04aa16596e08bda29578 data/create/recipes/cutting/compat/atmospheric/kousa_wood.json -0689201dddce046ef830ae791dc614ebcd6bb26d data/create/recipes/cutting/compat/atmospheric/morado_log.json -f3968dddde6ace179c0b6463aba17e212a93629a data/create/recipes/cutting/compat/atmospheric/morado_wood.json -41bb788e28c66d8a7415ec3731ca09f440864a9a data/create/recipes/cutting/compat/atmospheric/rosewood.json -4c49e3ac52fd466929a63e5009dce631040ba6ba data/create/recipes/cutting/compat/atmospheric/rosewood_log.json -a90a322d3acc2115e9a52c0e288215991c5ed143 data/create/recipes/cutting/compat/atmospheric/stripped_aspen_log.json -482e9a0464c877c21cf37925e20b6aeff633676c data/create/recipes/cutting/compat/atmospheric/stripped_aspen_wood.json -2d05a0460606960c7e73d2a67012b7dc55c00356 data/create/recipes/cutting/compat/atmospheric/stripped_grimwood.json -c2bfa5fa40905cb3bd2511d94907252e86afe7b8 data/create/recipes/cutting/compat/atmospheric/stripped_grimwood_log.json -092cae4bd9d8dd5626fd4b5c072520977dfa8a4e data/create/recipes/cutting/compat/atmospheric/stripped_kousa_log.json -cc69f0162e8fdd56e2e6a8d3423acd09a977f56d data/create/recipes/cutting/compat/atmospheric/stripped_kousa_wood.json -e9d88cf3cd60e6d43af7d1d16a174f88fcf1233d data/create/recipes/cutting/compat/atmospheric/stripped_morado_log.json -5f55e43d57c00b48c010609da73e7aa009f6c49a data/create/recipes/cutting/compat/atmospheric/stripped_morado_wood.json -ecfda5a9474fda3772c4cdfbe213c1350ed9ee38 data/create/recipes/cutting/compat/atmospheric/stripped_rosewood.json -c4e9a1327e2926f0517feaaf39c9629da8629312 data/create/recipes/cutting/compat/atmospheric/stripped_rosewood_log.json -924b4b9d24d2544aa04e7a713e6ce4674450b616 data/create/recipes/cutting/compat/atmospheric/stripped_yucca_log.json -ec6c644a9381526ea5c507a1968627fc880041ac data/create/recipes/cutting/compat/atmospheric/stripped_yucca_wood.json -c528538d50280aa575d642076b4d82e905cd5742 data/create/recipes/cutting/compat/atmospheric/yucca_log.json -fa41576ce1f7524bcd5c9d0bd755872c61594906 data/create/recipes/cutting/compat/atmospheric/yucca_wood.json -bca0cb14b60f7982d3e25f1fa082fc6c1d297cac data/create/recipes/cutting/compat/autumnity/maple_log.json -d95f86b26b21356ce3a9305d31143984489bd044 data/create/recipes/cutting/compat/autumnity/maple_wood.json -b66953dee0ea9804e22aa6f296c49e81f34d2d18 data/create/recipes/cutting/compat/autumnity/sappy_maple_log.json -bf5a4170f365901a3d850387ff6338e576f8e8eb data/create/recipes/cutting/compat/autumnity/sappy_maple_wood.json -598201da89849526cc316b63b297814bc52d75d1 data/create/recipes/cutting/compat/autumnity/stripped_maple_log.json -b93e929d2078211fd70d6df8d4eb065e6d4cc112 data/create/recipes/cutting/compat/autumnity/stripped_maple_wood.json -76872508fd1b302d4e94a2017ea72f7d38de6273 data/create/recipes/cutting/compat/biomesoplenty/dead_log.json -6bee03a37457acfc937c36ffb2d58ca97218c002 data/create/recipes/cutting/compat/biomesoplenty/dead_wood.json -c62f06b79bdac37704f0fa31459f98aeb2d4f7ae data/create/recipes/cutting/compat/biomesoplenty/fir_log.json -530425aed6c6acd1463f17e88aba7794118758a1 data/create/recipes/cutting/compat/biomesoplenty/fir_wood.json -e88e60e59fe0eb3118b00b02af9e529c866785d3 data/create/recipes/cutting/compat/biomesoplenty/hellbark_log.json -6997475ab7fb0c489188749447a0212d5facc1ca data/create/recipes/cutting/compat/biomesoplenty/hellbark_wood.json -4838e37981d65e3a732e320fd75f8e4762271ef9 data/create/recipes/cutting/compat/biomesoplenty/jacaranda_log.json -96bac76034038740a7c9e84c48ba90442a669774 data/create/recipes/cutting/compat/biomesoplenty/jacaranda_wood.json -4c5c28264e05e294de2b316fdd0dd2de8b8a1ed2 data/create/recipes/cutting/compat/biomesoplenty/magic_log.json -3634bb459019791c1010b7b93886e9d70fb00aa4 data/create/recipes/cutting/compat/biomesoplenty/magic_wood.json -697be2e1eccbf5ec96d5f00ab7ec03918a32f5c3 data/create/recipes/cutting/compat/biomesoplenty/mahogany_log.json -fa8a8440905213675dd769ae29509a1cbcabb1c1 data/create/recipes/cutting/compat/biomesoplenty/mahogany_wood.json -1130274e3e8abc3d3c7fe646898db7c68a59fed0 data/create/recipes/cutting/compat/biomesoplenty/palm_log.json -184b9042633580815a6d1e2e1f1d3c543f26a3e4 data/create/recipes/cutting/compat/biomesoplenty/palm_wood.json -919a8fbf9f8e7f398a28a8af71ca4ad48ed8d6db data/create/recipes/cutting/compat/biomesoplenty/redwood_log.json -165e2642f98885734b3f815579ff589b8f0b870e data/create/recipes/cutting/compat/biomesoplenty/redwood_wood.json -1a3f84111c5027304bfe8d037fa853125b2183c2 data/create/recipes/cutting/compat/biomesoplenty/stripped_dead_log.json -8f2c2015927767d627be865dc603530dd05328ee data/create/recipes/cutting/compat/biomesoplenty/stripped_dead_wood.json -822d84a550496c7f2c3ee127314a50512dfe5c8c data/create/recipes/cutting/compat/biomesoplenty/stripped_fir_log.json -737f59278b7b08c743b1ba5dc336c906b7fdd0e5 data/create/recipes/cutting/compat/biomesoplenty/stripped_fir_wood.json -03196fc1d845abe7f16ebbf25c64c86ad9c42efe data/create/recipes/cutting/compat/biomesoplenty/stripped_hellbark_log.json -b067086760701e8c11ced7b871b97e0ef7b1b2f0 data/create/recipes/cutting/compat/biomesoplenty/stripped_hellbark_wood.json -06dc710f86bfebb1a6927f3dff8d64e48009acf2 data/create/recipes/cutting/compat/biomesoplenty/stripped_jacaranda_log.json -a300edf8cae5ad7b3e2c129b44d1ea956e517c41 data/create/recipes/cutting/compat/biomesoplenty/stripped_jacaranda_wood.json -285b0ec232953870c714ce0b05b129e3e5833ee1 data/create/recipes/cutting/compat/biomesoplenty/stripped_magic_log.json -91647155034c4ffa87005d38416704dbb3c7b569 data/create/recipes/cutting/compat/biomesoplenty/stripped_magic_wood.json -3df1098856ffc9ae705f3ed577be378801e1fff9 data/create/recipes/cutting/compat/biomesoplenty/stripped_mahogany_log.json -be8856c7ddcac88a2d51980d963964c98b623dd8 data/create/recipes/cutting/compat/biomesoplenty/stripped_mahogany_wood.json -a77cbccc69c38b78bf15ee90fa377c11a8539cef data/create/recipes/cutting/compat/biomesoplenty/stripped_palm_log.json -e5df4bc6f127838474fadcb14e7bfaee739dddad data/create/recipes/cutting/compat/biomesoplenty/stripped_palm_wood.json -dfe420fd232ddf6ef27dd97baebef38b1087a55b data/create/recipes/cutting/compat/biomesoplenty/stripped_redwood_log.json -5bb6720ae1472207587a935d3fca5f065e0efa1a data/create/recipes/cutting/compat/biomesoplenty/stripped_redwood_wood.json -079b43a27f33868a776e27f22432d81051067ea1 data/create/recipes/cutting/compat/biomesoplenty/stripped_umbran_log.json -35c64750475e72b01333694c1d588213838528cd data/create/recipes/cutting/compat/biomesoplenty/stripped_umbran_wood.json -cf2036fe04660304257d7e5822eeff6656685417 data/create/recipes/cutting/compat/biomesoplenty/stripped_willow_log.json -f69bfa1c375c67d63d7b35475dedbe76644c10a5 data/create/recipes/cutting/compat/biomesoplenty/stripped_willow_wood.json -71a5963ad5dd9de348451ae4bfbad46cc06b8d8f data/create/recipes/cutting/compat/biomesoplenty/umbran_log.json -4cc971f56409befacd039a09ed5b561702681172 data/create/recipes/cutting/compat/biomesoplenty/umbran_wood.json -f3c630ba88419ea2fdf55b03eac22aac88acd56c data/create/recipes/cutting/compat/biomesoplenty/willow_log.json -f661dc5faff7e08489ef6ac4996864b79e53804a data/create/recipes/cutting/compat/biomesoplenty/willow_wood.json -c3c4999b33f2f29f31f1ac2cd0256694e530b6ab data/create/recipes/cutting/compat/blue_skies/bluebright_log.json -686bb3eab9fd2fc0439ffe7c31c08dee37eb17c3 data/create/recipes/cutting/compat/blue_skies/bluebright_wood.json -dfcee56f35b64e0b6d9a86a113f56de78f0ce6b3 data/create/recipes/cutting/compat/blue_skies/crystallized_log.json -0f6fa127bf9fd14a799985437eb1554a527f71c8 data/create/recipes/cutting/compat/blue_skies/crystallized_wood.json -a0ca7db3a2a631be843c697347ad70501b4e700c data/create/recipes/cutting/compat/blue_skies/dusk_log.json -ccfa435f7714312b8f307503203cb53d1643282a data/create/recipes/cutting/compat/blue_skies/dusk_wood.json -d7d5a3b1dfc58f0779819ce96fb382a5b023fba5 data/create/recipes/cutting/compat/blue_skies/frostbright_log.json -eee254d6e658b9584223d3fdb52d02e6257cbf02 data/create/recipes/cutting/compat/blue_skies/frostbright_wood.json -80499299707fbaad688fada38255b0dd076371f0 data/create/recipes/cutting/compat/blue_skies/lunar_log.json -177c8fd94e40a9ed839f43fbf6ee6afa53da7d93 data/create/recipes/cutting/compat/blue_skies/lunar_wood.json -a8cbd0e4f80fa6cf5b295c488a5795af9d20c923 data/create/recipes/cutting/compat/blue_skies/maple_log.json -a5ceee5b1c402dfcb06851a696c4ba4e3c15d790 data/create/recipes/cutting/compat/blue_skies/maple_wood.json -137ccda54b20e644f2aedafd924a976ffd88d452 data/create/recipes/cutting/compat/blue_skies/starlit_log.json -1960934756be7cb82421e9428622eb853c96c451 data/create/recipes/cutting/compat/blue_skies/starlit_wood.json -c96c5ecb3913b7611cea45dd45be447313a53278 data/create/recipes/cutting/compat/blue_skies/stripped_bluebright_log.json -26af6c6fc9e093d466b8a920de16e95aca9e0fe6 data/create/recipes/cutting/compat/blue_skies/stripped_bluebright_wood.json -2ef370bdc202010ef3f3d28a3df050b785178966 data/create/recipes/cutting/compat/blue_skies/stripped_dusk_log.json -e64dc0f1b77303152596c2c092783d06cfaed371 data/create/recipes/cutting/compat/blue_skies/stripped_dusk_wood.json -523239c7e97a4d0ea9a602324926ff8c7de21122 data/create/recipes/cutting/compat/blue_skies/stripped_frostbright_log.json -a29748d29a707f36cc660b833fc1d1caab2c7c2a data/create/recipes/cutting/compat/blue_skies/stripped_frostbright_wood.json -5eec34196ea44c10cd72a75a843b22fa5a4ab419 data/create/recipes/cutting/compat/blue_skies/stripped_lunar_log.json -c3be04b553399fe0a7e0ec551086abc7c3eedf36 data/create/recipes/cutting/compat/blue_skies/stripped_lunar_wood.json -43af28179df2cdd235293c8be0ec9fdd30393b6d data/create/recipes/cutting/compat/blue_skies/stripped_maple_log.json -6972e2bde54d352e14431fd334a06bfb1c83ecb6 data/create/recipes/cutting/compat/blue_skies/stripped_maple_wood.json -d4c2e45ea9525bb4d8df7e8ffaa4fba18c40d30f data/create/recipes/cutting/compat/blue_skies/stripped_starlit_log.json -964a494326ee801e693c9f4d870a8420a532e8cb data/create/recipes/cutting/compat/blue_skies/stripped_starlit_wood.json -158cde5b02ffefebe1d2a393f443c918fce9987e data/create/recipes/cutting/compat/botania/dreamwood.json -159b2c750e34c4782146554c6dc4b10a67e68c98 data/create/recipes/cutting/compat/botania/dreamwood_log.json -5d137232772d1f78be59fb8f382cee312b6df601 data/create/recipes/cutting/compat/botania/glimmering_dreamwood.json -eb5e05b5cab9fa314277121a0cbf94bdafa2e14b data/create/recipes/cutting/compat/botania/glimmering_dreamwood_log.json -f335b36e818ad653a245f54c9c77a7d9c041c561 data/create/recipes/cutting/compat/botania/glimmering_livingwood.json -49b875f3a21b5a85c33ac5de992d071aa0c8f4fd data/create/recipes/cutting/compat/botania/glimmering_livingwood_log.json -eb48e281f17bc125511870ff02a58cab915e435d data/create/recipes/cutting/compat/botania/glimmering_stripped_dreamwood.json -217ea2bc83a98334f0f155a64a1ea1e19a661e56 data/create/recipes/cutting/compat/botania/glimmering_stripped_dreamwood_log.json -8e39b16d4d1db2643cc5ec79773b1ae2b5bed1ab data/create/recipes/cutting/compat/botania/glimmering_stripped_livingwood.json -407698357fb1ff81ef4e35b32f3f1692cbb317c9 data/create/recipes/cutting/compat/botania/glimmering_stripped_livingwood_log.json -0c43382655638d8bca0c84fadb6d609ecc16ecd2 data/create/recipes/cutting/compat/botania/livingwood.json -da68af0ba1b040e8049a224e8ea8ada7fcc1f45a data/create/recipes/cutting/compat/botania/livingwood_log.json -eed98e7a9d5c4cd1bf39e4268bac6f1dc348d512 data/create/recipes/cutting/compat/botania/stripped_dreamwood.json -7fadb54f614bfe0af2c2c22f46c6923a14fefa8c data/create/recipes/cutting/compat/botania/stripped_dreamwood_log.json -2786670eacfe51a1f4adc4b83e825f93c328a1ea data/create/recipes/cutting/compat/botania/stripped_livingwood.json -9f471696da339cadeb3d805c3ea61310b1d81ff4 data/create/recipes/cutting/compat/botania/stripped_livingwood_log.json -4e775fd59f7c5b4ca0861cd9a077d3e0e464b4a4 data/create/recipes/cutting/compat/byg/aspen_log.json -bd21d721698b1d46f2a0483e2ea926558ba8f0ea data/create/recipes/cutting/compat/byg/aspen_wood.json -cef520dc7a7c4ec257f2b4ab2b1b134ef29874f0 data/create/recipes/cutting/compat/byg/baobab_log.json -56002a9c9d210fdce2d21c4abb17851b5bc770f9 data/create/recipes/cutting/compat/byg/baobab_wood.json -5492c3b2db0fefb3f1498bbb440d5c92bad7e072 data/create/recipes/cutting/compat/byg/blue_enchanted_log.json -6b32af35555c83fee27c43858ebe03711c825d36 data/create/recipes/cutting/compat/byg/blue_enchanted_wood.json -2325864b4f7a80d466f5eef373f65cccb0557d55 data/create/recipes/cutting/compat/byg/bulbis_stem.json -52320312ae0aa6d957f841b430355d96afdbfe0b data/create/recipes/cutting/compat/byg/bulbis_wood.json -588ea2463640155d79724a694b5152574ea3f2a7 data/create/recipes/cutting/compat/byg/cika_log.json -880d0190030e3a70fd2a21ab4fc11604fbaac447 data/create/recipes/cutting/compat/byg/cika_wood.json -1fc63cafc946178443d1e362b9730455f2192b25 data/create/recipes/cutting/compat/byg/cypress_log.json -c27c16aec08599e76020ac4b40dc5085b2a85d3a data/create/recipes/cutting/compat/byg/cypress_wood.json -5daca7d84f07e72a961fce6e405cd13428411bd3 data/create/recipes/cutting/compat/byg/ebony_log.json -5e7650fdc0541e996db733880ddd7746f6998660 data/create/recipes/cutting/compat/byg/ebony_wood.json -0357f1d46f7b79de4b20af24eff754c5d280ed3f data/create/recipes/cutting/compat/byg/ether_log.json -464978c5018fb884aecad8455caefa3396b88bea data/create/recipes/cutting/compat/byg/ether_wood.json -3053408dcc0deedd992e4ca8c9181fff1a952ad8 data/create/recipes/cutting/compat/byg/fir_log.json -dfd2ce56f18327ac7feea783d5c7439dd2516884 data/create/recipes/cutting/compat/byg/fir_wood.json -40af5f403a0681833109b26b6da8762d99df484a data/create/recipes/cutting/compat/byg/fungal_imparius_hyphae.json -3d7de0bab24b7ea34c34a25383c4937cc9f585d8 data/create/recipes/cutting/compat/byg/fungal_imparius_stem.json -121375152c841b695bbd23fa4a4ad408243464fe data/create/recipes/cutting/compat/byg/green_enchanted_log.json -16b991e08d10fe32b93d987113c12dc9568517c3 data/create/recipes/cutting/compat/byg/green_enchanted_wood.json -65d3c6f12bd86be2060487adce703896c596207d data/create/recipes/cutting/compat/byg/holly_log.json -6ccd44a9607d8ac1b34896f6b0f427865a18a447 data/create/recipes/cutting/compat/byg/holly_wood.json -47dd1a429986a790a418c97f56884fa19dcbc74e data/create/recipes/cutting/compat/byg/imparius_hyphae.json -a24ac854f3b3ebf57bea9ebd58fd9655fed8e922 data/create/recipes/cutting/compat/byg/imparius_stem.json -6152e117579369ae3388f6f458331a6747a83272 data/create/recipes/cutting/compat/byg/jacaranda_log.json -3e58caf860dfa0432bad58aae44d5713264010da data/create/recipes/cutting/compat/byg/jacaranda_wood.json -58c4d750ed6a08f30908c7508106a224c2047de8 data/create/recipes/cutting/compat/byg/lament_log.json -d93f6deefd5bcf4d91242534d9b588fa2ab1a7de data/create/recipes/cutting/compat/byg/lament_wood.json -6f3a120fae7fdcc98a416185107381a6caf739b0 data/create/recipes/cutting/compat/byg/mahogany_log.json -19cf897802135c3ebdf68f6e2bc41f3cf8d0ddb0 data/create/recipes/cutting/compat/byg/mahogany_wood.json -d13e02245ca4acd0c4c4d38359eddf3b22fcff7f data/create/recipes/cutting/compat/byg/maple_log.json -9c947dd9fb94709b481daa3ec5156b227b061cdd data/create/recipes/cutting/compat/byg/maple_wood.json -f25cdfa7c0ff0d9c0bfb8fd4c678d1ad61d6f755 data/create/recipes/cutting/compat/byg/nightshade_log.json -7b58e103b01afc4b730b5b3f71cb9fd893427916 data/create/recipes/cutting/compat/byg/nightshade_wood.json -ab8cd4e768bb4b6945498249f9d5302909de199e data/create/recipes/cutting/compat/byg/palm_log.json -c446697efd034229fb5334af83f75b6418806074 data/create/recipes/cutting/compat/byg/palm_wood.json -476fceb3e5b0284125de9c53227e318e1025ca63 data/create/recipes/cutting/compat/byg/palo_verde_log.json -bb3f841b52b75cd14aa5ea82f1459f2a7b234c36 data/create/recipes/cutting/compat/byg/palo_verde_wood.json -eeb2e2db22875cfe74b30f834637dd74006bde5d data/create/recipes/cutting/compat/byg/pine_log.json -911a25900b077a512dc59331055b06481944f207 data/create/recipes/cutting/compat/byg/pine_wood.json -4ca5a84e9f098c9a935b1321fca795f6fcccd0f9 data/create/recipes/cutting/compat/byg/rainbow_eucalyptus_log.json -5735995aa9f0717817b819268e3885ac6f7ed1e0 data/create/recipes/cutting/compat/byg/rainbow_eucalyptus_wood.json -28823f07067a1df8f152d6c1ddeeae8e61bf47eb data/create/recipes/cutting/compat/byg/redwood_log.json -dbd5003c9b08a7794b0aeac2eb1e0996f00de73f data/create/recipes/cutting/compat/byg/redwood_wood.json -0a25e874ba7b36357a6d4172eb74af363db339cb data/create/recipes/cutting/compat/byg/skyris_log.json -0ff912a98f11fdeee6f5ad34f36c591ce944b1cf data/create/recipes/cutting/compat/byg/skyris_wood.json -201ef4c331f3083cf2272ce1bf3aacbd76d91c54 data/create/recipes/cutting/compat/byg/stripped_aspen_log.json -cc9d820a5d2a987494884a682d9648dfcbfb1055 data/create/recipes/cutting/compat/byg/stripped_aspen_wood.json -a844fac33edd99c0f166f17cd493c4c01ffe1d35 data/create/recipes/cutting/compat/byg/stripped_baobab_log.json -bb1d318dbfb3deada9db8c5c679977684468b60f data/create/recipes/cutting/compat/byg/stripped_baobab_wood.json -fec45c1d4084c9de211876a3fd313313c18920b2 data/create/recipes/cutting/compat/byg/stripped_blue_enchanted_log.json -608a3d0bb5ca12e95141016099085821e47f4e98 data/create/recipes/cutting/compat/byg/stripped_blue_enchanted_wood.json -087dd3a1c516f9db9729974781bc68e13ff4b3de data/create/recipes/cutting/compat/byg/stripped_bulbis_stem.json -f45c17bea93fc15f10b0c135ebf334a41a2e68d2 data/create/recipes/cutting/compat/byg/stripped_bulbis_wood.json -4187543812af8be22977b2b503ffb16ff82e38e6 data/create/recipes/cutting/compat/byg/stripped_cika_log.json -72c90971b638693cf7425ff59530672f37433b52 data/create/recipes/cutting/compat/byg/stripped_cika_wood.json -c66c179d9989be618909104ba8e0f399ca34a630 data/create/recipes/cutting/compat/byg/stripped_cypress_log.json -0dbf97db4afd35580faadb6d5964ef9098438ac4 data/create/recipes/cutting/compat/byg/stripped_cypress_wood.json -944b0993af3591956df6c2c5cd7fd08643c2dccb data/create/recipes/cutting/compat/byg/stripped_ebony_log.json -ee3de122e8ff85f1eda9a1834e3c19eef1250685 data/create/recipes/cutting/compat/byg/stripped_ebony_wood.json -e64357b673fe4f983e9547305f8f95272e8b8b77 data/create/recipes/cutting/compat/byg/stripped_ether_log.json -c2ecdaadf564d496ab679b38356ce9614237668b data/create/recipes/cutting/compat/byg/stripped_ether_wood.json -a267fc6425816b6bc01396221470e0814e6bd942 data/create/recipes/cutting/compat/byg/stripped_fir_log.json -b7647e89ee29a4e116c49c1ae419d3d053608017 data/create/recipes/cutting/compat/byg/stripped_fir_wood.json -3b0e0a3a91e8f19b2f48f53044a2e3d5479578a3 data/create/recipes/cutting/compat/byg/stripped_green_enchanted_log.json -1406357c702c4d82f372e4f1a837591586faff97 data/create/recipes/cutting/compat/byg/stripped_green_enchanted_wood.json -2772e21459b48648f3c54b82243994f38a691c84 data/create/recipes/cutting/compat/byg/stripped_holly_log.json -46b523df1967aca55cc9f9763016bcd6133a3cb8 data/create/recipes/cutting/compat/byg/stripped_holly_wood.json -0b4b05df393e5e0bda59877b9f9048b7c510043d data/create/recipes/cutting/compat/byg/stripped_jacaranda_log.json -503bc3dcefeee34b91527eeb61a6ebd50d678fbd data/create/recipes/cutting/compat/byg/stripped_jacaranda_wood.json -4fbaedf8e7a601f592c6c671de6435b52c44b6d4 data/create/recipes/cutting/compat/byg/stripped_lament_log.json -0b4478eba4e2d9bd835d9ad91dcf2eccfc538f12 data/create/recipes/cutting/compat/byg/stripped_lament_wood.json -3550d5eb7f8eab95f4dd840d72cc14dea7acdb67 data/create/recipes/cutting/compat/byg/stripped_mahogany_log.json -d66b3e69b6bcf38a9d01fc9290b81778b46459f0 data/create/recipes/cutting/compat/byg/stripped_mahogany_wood.json -4778e5d9e1b5a5d254483dedf9cf22cbda73ca2d data/create/recipes/cutting/compat/byg/stripped_maple_log.json -18b5f67be3d28bc6c8764d2ad576f16745d95109 data/create/recipes/cutting/compat/byg/stripped_maple_wood.json -1446329655130e0cf0f0da7c1c17f517bbfb9d79 data/create/recipes/cutting/compat/byg/stripped_nightshade_log.json -c1ddc415556ebf6c6b518d3dc1c54f389ecc6ca9 data/create/recipes/cutting/compat/byg/stripped_nightshade_wood.json -cc7a000cf42f792912531e83f00cc694bf47d0ee data/create/recipes/cutting/compat/byg/stripped_palm_log.json -6ad7a35bfef1334a0566496f9a4658c4213db72e data/create/recipes/cutting/compat/byg/stripped_palm_wood.json -1ac1701b9779eb875b371a3e8742b1de203a0339 data/create/recipes/cutting/compat/byg/stripped_pine_log.json -9be87d49f1f20967d115c842d551cbcfe813fe50 data/create/recipes/cutting/compat/byg/stripped_pine_wood.json -39bda1670d29736ae18a72115b5525e2b54b26c2 data/create/recipes/cutting/compat/byg/stripped_rainbow_eucalyptus_log.json -da8e26696706d6a0c5af520bcde6246f463a6e7d data/create/recipes/cutting/compat/byg/stripped_rainbow_eucalyptus_wood.json -b2720a4858848f941e264a8f78653477d7283403 data/create/recipes/cutting/compat/byg/stripped_redwood_log.json -ff3707171e4422b08b6eb9b9bf6a1a4bdffdbe16 data/create/recipes/cutting/compat/byg/stripped_redwood_wood.json -a72ab3e1f450e11903d403ede28ac1395c360d2e data/create/recipes/cutting/compat/byg/stripped_skyris_log.json -096b56116fe9c02005e68c84c15d7ba4c590572a data/create/recipes/cutting/compat/byg/stripped_skyris_wood.json -b6f1b9584cb32d329023815be6b3df8e17dbcf0b data/create/recipes/cutting/compat/byg/stripped_willow_log.json -8925bfb2575712dd3abc306b64bafd93d168dd3b data/create/recipes/cutting/compat/byg/stripped_willow_wood.json -03bda6ad269d122e39adb211b1f3a8ed1ba11eb9 data/create/recipes/cutting/compat/byg/stripped_witch_hazel_log.json -03865937f2c740871024d8bd51ef5e07567f1c3d data/create/recipes/cutting/compat/byg/stripped_witch_hazel_wood.json -611bed180fa9ec6fa5e7cc3e8958836c2fb24489 data/create/recipes/cutting/compat/byg/stripped_zelkova_log.json -f4283de13917784d85c0ba84f68424ec8b69545f data/create/recipes/cutting/compat/byg/stripped_zelkova_wood.json -667d33f61cb4c5f5d204169c9e3adf11154bdfc2 data/create/recipes/cutting/compat/byg/willow_log.json -53f2571f67a1991676981a239875814d99f62e6c data/create/recipes/cutting/compat/byg/willow_wood.json -73e9929c94048d2fa4646dc92eaf02cc0f2b71da data/create/recipes/cutting/compat/byg/witch_hazel_log.json -88b328cf0c0a02f296056abb423e4f3745e5ab4d data/create/recipes/cutting/compat/byg/witch_hazel_wood.json -31a331b2294c726f0e6b4573b1db14c2423116b2 data/create/recipes/cutting/compat/byg/zelkova_log.json -f249713773128375a0869a8df3205b384e2b54f4 data/create/recipes/cutting/compat/byg/zelkova_wood.json -363da3d703f57ccac27632b573734a940799374b data/create/recipes/cutting/compat/ecologics/azalea_log.json -052c45bc088143aae8508af521a8f91a2c263459 data/create/recipes/cutting/compat/ecologics/azalea_wood.json -10b5a67570271c02e12d3d46e48c2ed8fe2fd2fb data/create/recipes/cutting/compat/ecologics/coconut_log.json -8d34f87daf269250af59bae242322bc869017d84 data/create/recipes/cutting/compat/ecologics/coconut_wood.json -bec2975b6e10bb12261feb952e8e7cd6e0019619 data/create/recipes/cutting/compat/ecologics/flowering_azalea_log.json -701a522dbdfab4a7772b0f8dd5d9759ce24052e3 data/create/recipes/cutting/compat/ecologics/flowering_azalea_wood.json -b12bab3ed019328ce83f64b828b366b72503e823 data/create/recipes/cutting/compat/ecologics/stripped_azalea_log.json -2a5d12c6b39847533e6940931ad201e6924aae38 data/create/recipes/cutting/compat/ecologics/stripped_azalea_wood.json -37a3e9f0220b51d51250fe6febb7348858f0e8b5 data/create/recipes/cutting/compat/ecologics/stripped_coconut_log.json -e2308624a37abc099e2349456afa1c4064b02fdb data/create/recipes/cutting/compat/ecologics/stripped_coconut_wood.json -c6b1455c29d3bd0ff387edad10328ba4dd8b7f44 data/create/recipes/cutting/compat/ecologics/stripped_walnut_log.json -0026f35ef1445df9c3bb83bdfe25898cceffd5e4 data/create/recipes/cutting/compat/ecologics/stripped_walnut_wood.json -e4c5b799335a71a4259de6519ff9fe86fc014c85 data/create/recipes/cutting/compat/ecologics/walnut_log.json -45734ddd48ac17b25b88cf1f5b0d227431946cf7 data/create/recipes/cutting/compat/ecologics/walnut_wood.json -b0be23a2a268557b1ab26518a9d6ff1e492068fa data/create/recipes/cutting/compat/endergetic/poise_stem.json -1581ae3f152ba5784d6b737ed37e0fe8e6317a76 data/create/recipes/cutting/compat/endergetic/stripped_poise_stem.json -513c32af17004085c152de0c50ecdc0821ad5736 data/create/recipes/cutting/compat/environmental/cherry_log.json -dd7f392a18fa58dbcd02e1700a89d847ef912f6a data/create/recipes/cutting/compat/environmental/cherry_wood.json -bb5be6efdf3a134baed80179e9f65a5e9402e001 data/create/recipes/cutting/compat/environmental/stripped_cherry_log.json -8938bac54128e55540b9061333cebadb615c5531 data/create/recipes/cutting/compat/environmental/stripped_cherry_wood.json -962dd25663096fe3883f0aa5a89cea00c312625a data/create/recipes/cutting/compat/environmental/stripped_willow_log.json -ee28f2a0519c41df80647ec643d20b3ce05d5ca7 data/create/recipes/cutting/compat/environmental/stripped_willow_wood.json -bfa59f4024105be24f441ec9e1fe2394bb4c32ed data/create/recipes/cutting/compat/environmental/stripped_wisteria_log.json -15cb849317c8038750000708c93cce535d7662e5 data/create/recipes/cutting/compat/environmental/stripped_wisteria_wood.json -9c9b4b63d736e9bef583e3e3085df9547bee1ad3 data/create/recipes/cutting/compat/environmental/willow_log.json -6a6b47c7c058fe67ea0f0f479145e0e921fcd571 data/create/recipes/cutting/compat/environmental/willow_wood.json -590fa0d5dbc357c4d22f7e79f94365c50ca1c812 data/create/recipes/cutting/compat/environmental/wisteria_log.json -62b927056738fbbbb1ceb7b2b3f23e45c94cdd1b data/create/recipes/cutting/compat/environmental/wisteria_wood.json -97d07cbd21b147d93cbfea6534258f0b5faabbbb data/create/recipes/cutting/compat/forbidden_arcanus/aurum_log.json -b08980c7deb9a4de4983fdae188f0c5ac627c1e5 data/create/recipes/cutting/compat/forbidden_arcanus/aurum_wood.json -47902025354c45f34fa62402fc5f32db6648a7c3 data/create/recipes/cutting/compat/forbidden_arcanus/stripped_aurum_log.json -f8f97315cfcd7e76229b9856ca6b2942bd7754f5 data/create/recipes/cutting/compat/forbidden_arcanus/stripped_aurum_wood.json -c6e138b6adf0311deebeff7cacdcdb57337f41da data/create/recipes/cutting/compat/goodending/cypress_log.json -cac6d3d763a3909d9a1f3eebe83190013e323e8a data/create/recipes/cutting/compat/goodending/cypress_wood.json -a3664dc30807cbc7903f79944bfb9b7d08a91671 data/create/recipes/cutting/compat/goodending/muddy_oak_log.json -c0bde27c6ff867dbfe7bea538bce82ddd12d4fea data/create/recipes/cutting/compat/goodending/muddy_oak_wood.json -eb749011e1c688f2005a63eb9953d29c6287eae4 data/create/recipes/cutting/compat/goodending/stripped_cypress_log.json -228632291f42fb47b73a6e3058a27475d97c20f1 data/create/recipes/cutting/compat/goodending/stripped_cypress_wood.json -c9e3c6e1b591822283f4436c70a52ce27034e8cf data/create/recipes/cutting/compat/goodending/stripped_muddy_oak_log.json -f6cabdcbdb8aeffb03228bf65183bbec5aaba182 data/create/recipes/cutting/compat/goodending/stripped_muddy_oak_wood.json -3a9be23a966c2737c5059474c17a86566bc5505f data/create/recipes/cutting/compat/hexcasting/edified_log.json -3f3879c426acb1753f2985ed19f0a905bdbd3797 data/create/recipes/cutting/compat/hexcasting/edified_wood.json -68d80d00d15d6ad14100025eecbd76c1fa8e3a52 data/create/recipes/cutting/compat/hexcasting/stripped_edified_log.json -9e665be213a1eca08df0dcf38766d2ce3a76de8a data/create/recipes/cutting/compat/hexcasting/stripped_edified_wood.json -f87872a26b790bd29abfc036486474c5db8ee518 data/create/recipes/cutting/compat/integrateddynamics/menril_log.json -cd568df5168a0cfccbdaaf767ec63d71871ba3ba data/create/recipes/cutting/compat/integrateddynamics/menril_log_stripped.json -b5573785c73cbf3b2c2bd096bb0a12b054819b74 data/create/recipes/cutting/compat/integrateddynamics/menril_wood.json -ebca8e98bca0a5c8926c4aa5b197d5d436e2e00b data/create/recipes/cutting/compat/integrateddynamics/menril_wood_stripped.json -1b91f83f2c6e4c6087abc7a136478027b2c7092d data/create/recipes/cutting/compat/nethers_exoticism/jabuticaba_log.json -5f074e7d51d851e95469a234666485ae1f913731 data/create/recipes/cutting/compat/nethers_exoticism/ramboutan_log.json -d8ea31f8eac026d99a26ab200eeca6faee064d9c data/create/recipes/cutting/compat/nethers_exoticism/ramboutan_wood.json -536ed770010fcf8ba56f6333d58fa09b974b95c4 data/create/recipes/cutting/compat/nethers_exoticism/stripped_jabuticaba_log.json -8c84afc4870ff5c8d936dd1363e18531f27c6233 data/create/recipes/cutting/compat/nethers_exoticism/stripped_ramboutan_log.json -4119174e4e7126b66d05e78e7415558a31ba6540 data/create/recipes/cutting/compat/nethers_exoticism/stripped_ramboutan_wood.json -5a8b70f884741f155924174f8f8911574a782928 data/create/recipes/cutting/compat/quark/ancient_log.json -0b6953e5fd8f5d248f5327a8775e4e30a355ca49 data/create/recipes/cutting/compat/quark/ancient_wood.json -a0194f77f72349786f6b87e641c9628f7fe46fdf data/create/recipes/cutting/compat/quark/azalea_log.json -17daa6e2505ae75e51def1f1523f9d6f120de696 data/create/recipes/cutting/compat/quark/azalea_wood.json -118122fbd3154c0090768d9103e802d2e68b3f06 data/create/recipes/cutting/compat/quark/blossom_log.json -57b23b572f4d75bb39f7f84277f0a0a4e6be992b data/create/recipes/cutting/compat/quark/blossom_wood.json -d36666b83bf934aabd20aac182c4863de693903e data/create/recipes/cutting/compat/quark/stripped_ancient_log.json -a666d4c2d54acfa924eeef535415b993d40ca015 data/create/recipes/cutting/compat/quark/stripped_ancient_wood.json -e05b81a5609420153b3ecace758a153bd88a4bef data/create/recipes/cutting/compat/quark/stripped_azalea_log.json -f820204e8d99f21203b001da23e8b44cf61e33e2 data/create/recipes/cutting/compat/quark/stripped_azalea_wood.json -af71513af8de414036ff73fee0eaca4b823de99c data/create/recipes/cutting/compat/quark/stripped_blossom_log.json -071c8a562233a342875c9cdd392bbebfe719e321 data/create/recipes/cutting/compat/quark/stripped_blossom_wood.json -9fe1249c4b24d82699829f1e8f3dc19de791dbd1 data/create/recipes/cutting/compat/regions_unexplored/alpha_log.json -27585fe96d7e211e4469c437c82c89c1268cf0bf data/create/recipes/cutting/compat/regions_unexplored/ashen_log.json -bf04910ca9246aec3146eff28bc7d5d778c5d6d4 data/create/recipes/cutting/compat/regions_unexplored/ashen_wood.json -371e7f6a13a45006c21837847999e6e1b69e6320 data/create/recipes/cutting/compat/regions_unexplored/baobab_log.json -2cadb9f9d714f8668291122519a73458d6e6afdb data/create/recipes/cutting/compat/regions_unexplored/baobab_wood.json -f124b677daea80e9efdcb58451442403f79ecc59 data/create/recipes/cutting/compat/regions_unexplored/blackwood_log.json -809aba67a96fcf9766c4278697ddfbd89ff63db1 data/create/recipes/cutting/compat/regions_unexplored/blackwood_wood.json -d6263c38f2a54be9310530cfd5f23aaddda0dbca data/create/recipes/cutting/compat/regions_unexplored/blue_bioshroom_hyphae.json -3904212da6e2eb60c453520a44eb22d33fc1c128 data/create/recipes/cutting/compat/regions_unexplored/blue_bioshroom_stem.json -780ddd7800cc138177752ee965ccd7cad8e53c6e data/create/recipes/cutting/compat/regions_unexplored/brimwood_log.json -15ca75b81a207a347e06c730da7afa106714b9ed data/create/recipes/cutting/compat/regions_unexplored/brimwood_log_magma.json -44d643b1724377c9019436f6927b0e1c2de63a42 data/create/recipes/cutting/compat/regions_unexplored/brimwood_wood.json -d449dc8b30400627cb509b0bcdc6b63bbb595172 data/create/recipes/cutting/compat/regions_unexplored/cobalt_log.json -7ff17654f134c7c13f6008619b76b4e19751728c data/create/recipes/cutting/compat/regions_unexplored/cobalt_wood.json -8446d9a9b3ff0140c64d549e33f9f5718fdcceb6 data/create/recipes/cutting/compat/regions_unexplored/cypress_log.json -620d71dee83ac1aa16d30c1b4833e15f00a04208 data/create/recipes/cutting/compat/regions_unexplored/cypress_wood.json -0fa6e6ac5c19c8660111c07b13f0d82cf339910b data/create/recipes/cutting/compat/regions_unexplored/dead_log.json -30a08ae6222bebf4c6fbfc5801ccc30b5d01e417 data/create/recipes/cutting/compat/regions_unexplored/dead_wood.json -696b5f3eb788a5ab8dc35f91ffbc575d987af4b1 data/create/recipes/cutting/compat/regions_unexplored/eucalyptus_log.json -641e17384aa1ed504157ee8b4c3bf839f864199c data/create/recipes/cutting/compat/regions_unexplored/eucalyptus_wood.json -e8b754d24ae46631a97ffa6b15f4676768c4e219 data/create/recipes/cutting/compat/regions_unexplored/green_bioshroom_hyphae.json -3401ba3b7c8fa6023566e99532f035e4d78463ea data/create/recipes/cutting/compat/regions_unexplored/green_bioshroom_stem.json -0e2885c8819270dd0ea9b423eb17aabce17f50b6 data/create/recipes/cutting/compat/regions_unexplored/joshua_log.json -fd296307a65df37d2c952b3de9e79234b36c8bf8 data/create/recipes/cutting/compat/regions_unexplored/joshua_wood.json -b063c34700782af4ba8e5b353faa93a6af63e133 data/create/recipes/cutting/compat/regions_unexplored/kapok_log.json -44375fea18ff6312a05eb4948cf23916cad31bb7 data/create/recipes/cutting/compat/regions_unexplored/kapok_wood.json -74e328e600a2ce311638acf6b0cda2dca7e689bd data/create/recipes/cutting/compat/regions_unexplored/larch_log.json -519d0a467bafd51425e588c1452b326485ac504a data/create/recipes/cutting/compat/regions_unexplored/larch_wood.json -9d8f4845c835ba07d4f1f0f07b8d9ed39fb3514a data/create/recipes/cutting/compat/regions_unexplored/magnolia_log.json -4b367599792101bd5403aba96e973748fc91e8cf data/create/recipes/cutting/compat/regions_unexplored/magnolia_wood.json -caaefb19635f7fbec31d87d7ef40172c25e48b72 data/create/recipes/cutting/compat/regions_unexplored/maple_log.json -b8731d1b36bac59a519a496ce5253595be58ca57 data/create/recipes/cutting/compat/regions_unexplored/maple_wood.json -3cb94f34a0318442ea3a9225366587bf1aa0a01a data/create/recipes/cutting/compat/regions_unexplored/mauve_log.json -587727f7998dd25ee3441aa6f0ed1736262b8a55 data/create/recipes/cutting/compat/regions_unexplored/mauve_wood.json -aecbe7b08f8374331f976434daff89c4e4922efd data/create/recipes/cutting/compat/regions_unexplored/palm_log.json -3a83e8d7cac67638b76a8b30d469faaae71e9d6a data/create/recipes/cutting/compat/regions_unexplored/palm_wood.json -40b46cba392e02498406b90536b8da540df0eb76 data/create/recipes/cutting/compat/regions_unexplored/pine_log.json -9fe88b00cb4c42ed5677f46bccdf2c05fd085c5f data/create/recipes/cutting/compat/regions_unexplored/pine_wood.json -7a11eb2ede6e9d5f1284e6223c52465493901f79 data/create/recipes/cutting/compat/regions_unexplored/pink_bioshroom_hyphae.json -78fb2663e91d8f6494ff1348f2d83633e50713ee data/create/recipes/cutting/compat/regions_unexplored/pink_bioshroom_stem.json -eb7b75678cf8ae102eee91456bd8d4387acfb146 data/create/recipes/cutting/compat/regions_unexplored/redwood_log.json -d1da4369daa6c4fd16dfeff7551c218949e122d5 data/create/recipes/cutting/compat/regions_unexplored/redwood_wood.json aa75d5f92d23fb24aece736145ac8372f6cff3f3 data/create/recipes/cutting/compat/regions_unexplored/silver_birch_log.json 3218231281a0afda1cef330a022e450efac18927 data/create/recipes/cutting/compat/regions_unexplored/silver_birch_wood.json -2002a66ac280b0a41679cb84422a591760fd88bc data/create/recipes/cutting/compat/regions_unexplored/socotra_log.json -de2954580e05806befc31b2d445577d3fae6ba47 data/create/recipes/cutting/compat/regions_unexplored/socotra_wood.json -7a3bf3bbdb5ff29682d60ac068ffa9f4bb423b34 data/create/recipes/cutting/compat/regions_unexplored/stripped_baobab_log.json -2c961586f828dca3a4107dc181e7e99ef7fecf7d data/create/recipes/cutting/compat/regions_unexplored/stripped_baobab_wood.json -497877a6e23c6f337f46e784e64f725e7507d98a data/create/recipes/cutting/compat/regions_unexplored/stripped_blackwood_log.json -092003ce37ad550040026e2913e9670f5c25169e data/create/recipes/cutting/compat/regions_unexplored/stripped_blackwood_wood.json -fa85fe2cf25bdfffb5bfcb0d7d2fc2733c8e2961 data/create/recipes/cutting/compat/regions_unexplored/stripped_blue_bioshroom_hyphae.json -68b7452484be51a5ca9e1f5daa5ef960e84c4a24 data/create/recipes/cutting/compat/regions_unexplored/stripped_blue_bioshroom_stem.json -25793b4b9d6bd7222da6e49c59a134f36c708d2b data/create/recipes/cutting/compat/regions_unexplored/stripped_brimwood_log.json -cec8ba2be437e8e50f18277dd7464cb5a51783c6 data/create/recipes/cutting/compat/regions_unexplored/stripped_brimwood_wood.json -d131167166b5eaabc2b116920693399624cc969c data/create/recipes/cutting/compat/regions_unexplored/stripped_cobalt_log.json -eb2300ca83bcffaf96fb192cd8f5f6be6ce4d1a5 data/create/recipes/cutting/compat/regions_unexplored/stripped_cobalt_wood.json -2bde40143b3b9e400f3e921dd74100f6e4c2febf data/create/recipes/cutting/compat/regions_unexplored/stripped_cypress_log.json -7dd7b4e0478e42f4141a384f5f5db3d24c6256ba data/create/recipes/cutting/compat/regions_unexplored/stripped_cypress_wood.json -55992382313212af1448785769cb98272736f913 data/create/recipes/cutting/compat/regions_unexplored/stripped_dead_log.json -b1808c9c2afea6f77cbc008d89a0d98c0baacb5b data/create/recipes/cutting/compat/regions_unexplored/stripped_dead_wood.json -4af8a646e1cda8e7cfb54d848af04bcd071cb742 data/create/recipes/cutting/compat/regions_unexplored/stripped_eucalyptus_log.json -892f2b15212cdd1ab5aa94bdced37c8ecd502fad data/create/recipes/cutting/compat/regions_unexplored/stripped_eucalyptus_wood.json -a0b555a70b9c45671175ea9d67c7f9bb6291ce39 data/create/recipes/cutting/compat/regions_unexplored/stripped_green_bioshroom_hyphae.json -0b361b9f1b0fffb0934f347e93e01f7f99c8c598 data/create/recipes/cutting/compat/regions_unexplored/stripped_green_bioshroom_stem.json -7887134005361356b59e3e8f79f747461aa90967 data/create/recipes/cutting/compat/regions_unexplored/stripped_joshua_log.json -12bcc42d67c110b7b57a2c15bfd184a7c8d5ced3 data/create/recipes/cutting/compat/regions_unexplored/stripped_joshua_wood.json -9c192bac86ada1020093ec7a38bae39f890f6867 data/create/recipes/cutting/compat/regions_unexplored/stripped_kapok_log.json -5cf8658dec167a5eae2555e231d86c6dee1e9f86 data/create/recipes/cutting/compat/regions_unexplored/stripped_kapok_wood.json -9b9d6b4ff28a9ee9d38e8ff7e2f66c5d741792d1 data/create/recipes/cutting/compat/regions_unexplored/stripped_larch_log.json -477187045049395be4b50747e70b8682bf627745 data/create/recipes/cutting/compat/regions_unexplored/stripped_larch_wood.json -9444611d488463cf40113a522c0125bcc901f59d data/create/recipes/cutting/compat/regions_unexplored/stripped_magnolia_log.json -c7093db236a350421fb1963233472c8d7b09407b data/create/recipes/cutting/compat/regions_unexplored/stripped_magnolia_wood.json -6ba2945063856e34dfde713c8b6caf9bcd0b59ad data/create/recipes/cutting/compat/regions_unexplored/stripped_maple_log.json -cb536b2a2638a6e378423c2ea2a3c8785f6fc7c7 data/create/recipes/cutting/compat/regions_unexplored/stripped_maple_wood.json -3ff0ebc63da709a8f4958b7439cf9a88c4f9a349 data/create/recipes/cutting/compat/regions_unexplored/stripped_mauve_log.json -a274dadaba1e1f489e7b531ac4eb02e808fc4f01 data/create/recipes/cutting/compat/regions_unexplored/stripped_mauve_wood.json -626e2bb1d62ab57bcadf3732491a6a1efd249035 data/create/recipes/cutting/compat/regions_unexplored/stripped_palm_log.json -50dee41bd5c412aa444a2fcc5c3d7638ab01133d data/create/recipes/cutting/compat/regions_unexplored/stripped_palm_wood.json -9270af6499ef6e5c0e097bee06637a518d3a83d7 data/create/recipes/cutting/compat/regions_unexplored/stripped_pine_log.json -58c10356ba51c77959e8f66f83e178d20cec097b data/create/recipes/cutting/compat/regions_unexplored/stripped_pine_wood.json -01b11c8a041883e21d5374b8afdef2fa47a55aee data/create/recipes/cutting/compat/regions_unexplored/stripped_pink_bioshroom_hyphae.json -0c4826e7e49e2cc704627235c2f1c8fab604019f data/create/recipes/cutting/compat/regions_unexplored/stripped_pink_bioshroom_stem.json -1177ce8821f01c08ab918ea24ea33b61cbd733cf data/create/recipes/cutting/compat/regions_unexplored/stripped_redwood_log.json -af8789a2a697cd2118d6809100a0c04d4c74794e data/create/recipes/cutting/compat/regions_unexplored/stripped_redwood_wood.json -4e441e9502ba4be4fc1c0da98bb53af30f366d1f data/create/recipes/cutting/compat/regions_unexplored/stripped_socotra_log.json -3f93dd9538e68c9b1482c41d531c359e6b144914 data/create/recipes/cutting/compat/regions_unexplored/stripped_socotra_wood.json -bcba754ec947af79701a5ffb0e64ff7a7ff92a09 data/create/recipes/cutting/compat/regions_unexplored/stripped_willow_log.json -f104dc175e416d675e358e6601442c09c356858e data/create/recipes/cutting/compat/regions_unexplored/stripped_willow_wood.json -6c4a98aa0396f330924d5be6a1fb7c1123c5d236 data/create/recipes/cutting/compat/regions_unexplored/stripped_yellow_bioshroom_hyphae.json -b1440d5254bf8dc5b619a7d871f2c51511498184 data/create/recipes/cutting/compat/regions_unexplored/stripped_yellow_bioshroom_stem.json -54ed3844da6abdf55939f1d3ed42394c55ce57c5 data/create/recipes/cutting/compat/regions_unexplored/willow_log.json -d0419337ab011df3685a6fea849c17904a03f2d7 data/create/recipes/cutting/compat/regions_unexplored/willow_wood.json -365f090b94466b7695e7beb7d0fc7b7e084e636c data/create/recipes/cutting/compat/regions_unexplored/yellow_bioshroom_hyphae.json -22d48a8e9cf5a566bbc566a92e6bf9762a33586a data/create/recipes/cutting/compat/regions_unexplored/yellow_bioshroom_stem.json -8a9e25c2c196ab94c9e7b5fcb2cf27bc161a8d1c data/create/recipes/cutting/compat/silentgear/netherwood_log.json -9e869a4b7bbb08fefa140292f0cb0806a795fc59 data/create/recipes/cutting/compat/silentgear/netherwood_wood.json -d9cdc0eb674cdf08963ac8f97ee6a7ea2f99e779 data/create/recipes/cutting/compat/silentgear/stripped_netherwood_log.json -071ed83f5ce7f15688e95a1bf33142061ec4aa22 data/create/recipes/cutting/compat/silentgear/stripped_netherwood_wood.json -b2ced0a8d2f9e610ccca5c849bf460492d5fa568 data/create/recipes/cutting/compat/tconstruct/bloodshroom_log.json -9a3551fe7a74cbf4107fa4b26eb2b92a4f19dc44 data/create/recipes/cutting/compat/tconstruct/bloodshroom_wood.json -2a8f39581c635bb98ab437fb48796505df99cfec data/create/recipes/cutting/compat/tconstruct/greenheart_log.json -c68a24ed72589e9427f60fbf8c33cbf8403297fa data/create/recipes/cutting/compat/tconstruct/greenheart_wood.json -4a548deea4a151fc1d58c81ab26bd30a61900864 data/create/recipes/cutting/compat/tconstruct/skyroot_log.json -763616da266a28b8c4b1a88df0ce87c6ce37367c data/create/recipes/cutting/compat/tconstruct/skyroot_wood.json -ad4a650ace874dab7f039e53afa0164de2601a05 data/create/recipes/cutting/compat/tconstruct/stripped_bloodshroom_log.json -fcda399dee09fd7b7f8486fe5000522a4211c6d2 data/create/recipes/cutting/compat/tconstruct/stripped_bloodshroom_wood.json -e7f542ab1523379f218d47c7365f1d3be41036b4 data/create/recipes/cutting/compat/tconstruct/stripped_greenheart_log.json -aaa2b8cde03e0141fc4ccd3702fcb0d13966b391 data/create/recipes/cutting/compat/tconstruct/stripped_greenheart_wood.json -dec7bfbdc2c974655110651365f701121370394a data/create/recipes/cutting/compat/tconstruct/stripped_skyroot_log.json -0486cee0f932eee89bb26c2fe5b0ed076d05d1be data/create/recipes/cutting/compat/tconstruct/stripped_skyroot_wood.json -0dcbd6c92adce8bc1fe8a1a6f4c21ad436d4852f data/create/recipes/cutting/compat/the_vault/chromatic_log.json -bb89e77d7cdb54b37434f65c1652112b14fcfcc7 data/create/recipes/cutting/compat/the_vault/driftwood_log.json -e7f497ec5ea4860147d5941df4b594526361886d data/create/recipes/cutting/compat/the_vault/overgrown_wooden_log.json -e04c07431e80d779b2bfdb1227d2b43896ead7f5 data/create/recipes/cutting/compat/the_vault/stripped_chromatic_log.json -e91c945669e5b838e28b73079be0218b7dbb438c data/create/recipes/cutting/compat/the_vault/stripped_driftwood_log.json -dcb888781e53a4bd13a39dc8dcf52d68c70daa11 data/create/recipes/cutting/compat/the_vault/stripped_overgrown_wooden_log.json -95824dae54de5c99be7f108882bb0add80d9f4f4 data/create/recipes/cutting/compat/the_vault/stripped_wooden_log.json -f43130d8c47dbfd21c89d519539e2d8b5437c108 data/create/recipes/cutting/compat/the_vault/wooden_log.json -9a2d7361718e64bf25c3660123ab9f506fad7dba data/create/recipes/cutting/compat/twilightforest/canopy_log.json -35f470c4fb8c1e651bcf8f161ebcaa0f9f888be2 data/create/recipes/cutting/compat/twilightforest/canopy_wood.json -02ef237d075e3033676e0229946c9c2bc9ae27e0 data/create/recipes/cutting/compat/twilightforest/dark_log.json -a032ee8a436f2f7efc993a6d791217d4096c55a9 data/create/recipes/cutting/compat/twilightforest/dark_wood.json -541b21973ffebe85f9e6c31879a46e60d29ec3ba data/create/recipes/cutting/compat/twilightforest/mangrove_log.json -7a8f8746a1d3851ed064138600439749fb619225 data/create/recipes/cutting/compat/twilightforest/mangrove_wood.json -f0018c0a0276f09c26a4ffa8dbff756e70e84af9 data/create/recipes/cutting/compat/twilightforest/mining_log.json -d6e04a2c5139229993067515749038519e664407 data/create/recipes/cutting/compat/twilightforest/mining_wood.json -d03b8d192ba433bd1660fee4cbac81b52b37b332 data/create/recipes/cutting/compat/twilightforest/sorting_log.json -acade83e3e155d869bb66a4c514eff14eaf43130 data/create/recipes/cutting/compat/twilightforest/sorting_wood.json -a819a899a63885169df3c5ff9a21981821154222 data/create/recipes/cutting/compat/twilightforest/stripped_canopy_log.json -cfa1a8b90368d788c29ef3ff57dafad780c29ca4 data/create/recipes/cutting/compat/twilightforest/stripped_canopy_wood.json -bbd6724c3e7b294620d148a283724847428e41ec data/create/recipes/cutting/compat/twilightforest/stripped_dark_log.json -31a5f34120e0fabe91e532e0e86d77a71c66139c data/create/recipes/cutting/compat/twilightforest/stripped_dark_wood.json -ef5428c754626c390bdc3bd5f0c4ceaae069259c data/create/recipes/cutting/compat/twilightforest/stripped_mangrove_log.json -4db7b6856995a1fcb3d4f019816607bf242c043a data/create/recipes/cutting/compat/twilightforest/stripped_mangrove_wood.json -49fd097bf3182fcdd2cf180dc333f7fe853b586c data/create/recipes/cutting/compat/twilightforest/stripped_mining_log.json -4f231e9c88cc7441a097effd59caca0ff8c7b291 data/create/recipes/cutting/compat/twilightforest/stripped_mining_wood.json -939d8b45db3554e7d9a6157ab13889606f5926ec data/create/recipes/cutting/compat/twilightforest/stripped_sorting_log.json -a4beff8b63bfcaef2e14fc74eaf991a2f0e09b09 data/create/recipes/cutting/compat/twilightforest/stripped_sorting_wood.json -1388f289e43aa0b7a4642af5fff252602dd274c4 data/create/recipes/cutting/compat/twilightforest/stripped_time_log.json -6f21b5b4c2d4aee61ac2d990fee1651def801a67 data/create/recipes/cutting/compat/twilightforest/stripped_time_wood.json -c7c462798f3935b300e0fbc1a616736276e13292 data/create/recipes/cutting/compat/twilightforest/stripped_transformation_log.json -4770650398d3787991fa0dde2274611e241ab330 data/create/recipes/cutting/compat/twilightforest/stripped_transformation_wood.json -d87200bda38ba06d6eaf732e05ba74110cb888e5 data/create/recipes/cutting/compat/twilightforest/stripped_twilight_oak_log.json -d1a18db626fb8c1ed4684e99154a73f1ba94c341 data/create/recipes/cutting/compat/twilightforest/stripped_twilight_oak_wood.json -bc6a18b90847c9e27a28c19a391fd343237f1788 data/create/recipes/cutting/compat/twilightforest/time_log.json -d9ea151935b7257f9a799be5959d736a20eabf44 data/create/recipes/cutting/compat/twilightforest/time_wood.json -917862f3314fd636f65ef8ca1826182cce386ee2 data/create/recipes/cutting/compat/twilightforest/transformation_log.json -29649f4c23ddc00eebe7352dcca0d4c695807c62 data/create/recipes/cutting/compat/twilightforest/transformation_wood.json -10227f5cf8a9995f7e59c509ad20a33f907a1203 data/create/recipes/cutting/compat/twilightforest/twilight_oak_log.json -60c949a998c4ffe6f838faf729ef9a7a247a59df data/create/recipes/cutting/compat/twilightforest/twilight_oak_wood.json -b6c3111236dea7685ed893a2ddab6bacbb606170 data/create/recipes/cutting/compat/upgrade_aquatic/driftwood.json -b86b4710a31b8ab98d3f61972fd0e3a80d1cb788 data/create/recipes/cutting/compat/upgrade_aquatic/driftwood_log.json -1a155ced39a05ccbaa1fcd57052c8acced381860 data/create/recipes/cutting/compat/upgrade_aquatic/river_log.json -9b29505252b5c529d86e24c9c53d1190e73537d7 data/create/recipes/cutting/compat/upgrade_aquatic/river_wood.json -1104de0e8917d4fa8e51b036b573ef54bfbc7980 data/create/recipes/cutting/compat/upgrade_aquatic/stripped_driftwood.json -3fd253db6046bd5276cac5aea203f5293a49f843 data/create/recipes/cutting/compat/upgrade_aquatic/stripped_driftwood_log.json -ab08c98c58c2beab4805d0576cac3874c4774553 data/create/recipes/cutting/compat/upgrade_aquatic/stripped_river_log.json -b368756fa5ec34fa279f53fb99aea8f47757828a data/create/recipes/cutting/compat/upgrade_aquatic/stripped_river_wood.json -2619c5f3916147bf13a21f986f1889a67f885d1b data/create/recipes/cutting/compat/windswept/chestnut_log.json -40068203261db20d74bd84fa8c9e9a6fa9fc4ef5 data/create/recipes/cutting/compat/windswept/chestnut_wood.json -70a5cf4ac9996f9f424c064fc39fab8901f5c71c data/create/recipes/cutting/compat/windswept/holly_log.json -28833896273e3da215da3dee4da13e43ac56aecf data/create/recipes/cutting/compat/windswept/holly_wood.json -0e20d4166a792d5beba3e3ca17beb61253ceb162 data/create/recipes/cutting/compat/windswept/stripped_chestnut_log.json -33de028562009de6bdccd54f5b3835b7bbfe06a7 data/create/recipes/cutting/compat/windswept/stripped_chestnut_wood.json -68ddfcd839417094d75e889ed42ea244d07e2c0f data/create/recipes/cutting/compat/windswept/stripped_holly_log.json -a22e7839d935d0aca9de371ba50d956e0cbfa137 data/create/recipes/cutting/compat/windswept/stripped_holly_wood.json -0a3c2e35782d54a28c3c60eae10bdd6247d5977f data/create/recipes/cutting/crimson_hyphae.json -cc4d09728d2407c0c972e696037d1b45db9a8bc2 data/create/recipes/cutting/crimson_stem.json -ebdf404a6de7880a42527c35727fa4214eb8cff3 data/create/recipes/cutting/dark_oak_log.json -5b3eab6a44b9c76e6317254214991128450c0cd7 data/create/recipes/cutting/dark_oak_wood.json -8dc8b46f4e75470466806da9d851db52a8166baf data/create/recipes/cutting/jungle_log.json -e34df7cc80df6139a0f77cd5f7b8b17b0abbffa9 data/create/recipes/cutting/jungle_wood.json -7f2d46fb9d896915469177e1647615de926cac08 data/create/recipes/cutting/mangrove_log.json -9f6520bfecff967456ca5c529810e1245e51bebd data/create/recipes/cutting/mangrove_wood.json -3617011bd39d6cdc5b9b326272d19df0b3510590 data/create/recipes/cutting/oak_log.json -554409e54c85164ae8e832208623f3400fd80750 data/create/recipes/cutting/oak_wood.json -0e67c6e6685d4b752b129456c607039a203d341a data/create/recipes/cutting/spruce_log.json -85cf63074b922696ea691cfbc2cf7c348d4e0977 data/create/recipes/cutting/spruce_wood.json -1e83972fa75e6cef279da72312ae0577e6b074a3 data/create/recipes/cutting/stripped_acacia_log.json -070aa9790369a368666c03bf1cea9643ed0e5bc7 data/create/recipes/cutting/stripped_acacia_wood.json 558e81291da72b7f042b3b3270744b2c05ddc6fa data/create/recipes/cutting/stripped_bamboo_block.json -944dc5880749a146067716dd34b7edef77b925f5 data/create/recipes/cutting/stripped_birch_log.json -0ce39eb489b8d876954cbfcf715e94af79a57119 data/create/recipes/cutting/stripped_birch_wood.json -67c248e1be1e67054d4a65b94396d874156d5f29 data/create/recipes/cutting/stripped_cherry_log.json -1e34d2b0a2ae375ee312ca49aaaad8ff9e35b465 data/create/recipes/cutting/stripped_cherry_wood.json -b90e5b0a18d6d2e7eae62d0caf41fb3dd597c1e9 data/create/recipes/cutting/stripped_crimson_hyphae.json -7244f0450df30a3b08139a1a43c82d3dfcc9f9a7 data/create/recipes/cutting/stripped_crimson_stem.json -fc37b271373157c95e306bb33b6585dae45d3edb data/create/recipes/cutting/stripped_dark_oak_log.json -a6ea6cec83389e333fb5f4a422043a1bd9f70f32 data/create/recipes/cutting/stripped_dark_oak_wood.json -7ec8691fc9236ded232cbac0454fb0f8ea57949b data/create/recipes/cutting/stripped_jungle_log.json -a8970a4ea88a0c3c75df9ab5e7a70e6ed385f5ce data/create/recipes/cutting/stripped_jungle_wood.json -6e96401efad8c35011369717614cd0f81f45c71b data/create/recipes/cutting/stripped_mangrove_log.json -a31d2317362342119530798385f12e76402fc0e8 data/create/recipes/cutting/stripped_mangrove_wood.json -4ff147a23e6314ab02b904b9026970f9a2498c99 data/create/recipes/cutting/stripped_oak_log.json -ba1eb67a609cecffd2ec06cb21a17191960bbc67 data/create/recipes/cutting/stripped_oak_wood.json -4c212147311aec6714936a630b95c5102d50acf9 data/create/recipes/cutting/stripped_spruce_log.json -d9f2558fd566bc362c8330b26d201b2774a530ea data/create/recipes/cutting/stripped_spruce_wood.json -58b61b31381bd7d663a6575b074dfb4bec8a50d3 data/create/recipes/cutting/stripped_warped_hyphae.json -39060c0293e8681bbce3444f702c1ec5cae967fb data/create/recipes/cutting/stripped_warped_stem.json -ddb27a32c1b01812db7cc317c962e35d794dae88 data/create/recipes/cutting/warped_hyphae.json -688e5c5719ce1c6a331cd9ac05ba21fdb2da96a9 data/create/recipes/cutting/warped_stem.json 7a01147d3c7d8fb9acb870b33e5a792328f88c3c data/create/recipes/deploying/cogwheel.json 1230f449873262e79585752d3430e5f7f383bcb2 data/create/recipes/deploying/large_cogwheel.json dc35369da8514a5650704fd39e84861cce084b5d data/create/recipes/deploying/waxed_copper_block_from_adding_wax.json -7b7d596cdaa4000222177b405c04c6e8906561b4 data/create/recipes/deploying/waxed_copper_shingles_from_adding_wax.json afbe0c612651ee90651ee7b39683c8baac2a115e data/create/recipes/deploying/waxed_copper_shingle_slab_from_adding_wax.json 66cd83c15d46692f27deaac280ef782bb2bd7909 data/create/recipes/deploying/waxed_copper_shingle_stairs_from_adding_wax.json -bcb9750b7c3504996d6177d5980128af018942a8 data/create/recipes/deploying/waxed_copper_tiles_from_adding_wax.json +7b7d596cdaa4000222177b405c04c6e8906561b4 data/create/recipes/deploying/waxed_copper_shingles_from_adding_wax.json eecd6194b0efc2bee321ba7fac7348cd3f5911ab data/create/recipes/deploying/waxed_copper_tile_slab_from_adding_wax.json dfc1f8f6b0d1b6d23c9125c97eba31dadc370904 data/create/recipes/deploying/waxed_copper_tile_stairs_from_adding_wax.json +bcb9750b7c3504996d6177d5980128af018942a8 data/create/recipes/deploying/waxed_copper_tiles_from_adding_wax.json e260cded2b746bd79afaaa1e086cf2f0faffde76 data/create/recipes/deploying/waxed_cut_copper_from_adding_wax.json 33e338242aff64f9d52169392d2eb8e617b8da5c data/create/recipes/deploying/waxed_cut_copper_slab_from_adding_wax.json 5f4671548b18634ae440d7c64c4c97e5e533601b data/create/recipes/deploying/waxed_cut_copper_stairs_from_adding_wax.json ff182d5c0c4b832ff566691d9b680c9039c55c16 data/create/recipes/deploying/waxed_exposed_copper_from_adding_wax.json -eff2e77f004873e695e419afc71a7011328d3de8 data/create/recipes/deploying/waxed_exposed_copper_shingles_from_adding_wax.json 5a7a622d5b340f83ba2d32fe53620744c5193a32 data/create/recipes/deploying/waxed_exposed_copper_shingle_slab_from_adding_wax.json b895ef423e64936b5d94ee54a6527316ed48d9d6 data/create/recipes/deploying/waxed_exposed_copper_shingle_stairs_from_adding_wax.json -9d566e599cc05aefde637faab1957813a5b6f3f7 data/create/recipes/deploying/waxed_exposed_copper_tiles_from_adding_wax.json +eff2e77f004873e695e419afc71a7011328d3de8 data/create/recipes/deploying/waxed_exposed_copper_shingles_from_adding_wax.json 582083e0fed8760cde2c53aa2b02237eb59a3df0 data/create/recipes/deploying/waxed_exposed_copper_tile_slab_from_adding_wax.json fec9d744770bfc517a72a2be45701aab6f3040b2 data/create/recipes/deploying/waxed_exposed_copper_tile_stairs_from_adding_wax.json +9d566e599cc05aefde637faab1957813a5b6f3f7 data/create/recipes/deploying/waxed_exposed_copper_tiles_from_adding_wax.json 0f18c91f36e3abae99a7dca72f3d80e59f03cf7d data/create/recipes/deploying/waxed_exposed_cut_copper_from_adding_wax.json 7ed36f4f3abfd37aec13a273b87d97c8ccc36cb4 data/create/recipes/deploying/waxed_exposed_cut_copper_slab_from_adding_wax.json 9cd5a6c71b5102ef2660e8a5c650cbd2c2327580 data/create/recipes/deploying/waxed_exposed_cut_copper_stairs_from_adding_wax.json 97b7b3f65807328d0a036cb66ee53d898504da77 data/create/recipes/deploying/waxed_oxidized_copper_from_adding_wax.json -bd37d658666b2912c07b6daa6adaff99a479223a data/create/recipes/deploying/waxed_oxidized_copper_shingles_from_adding_wax.json 07c82e555617f9d9166f2d2c9068ac421eb0b37a data/create/recipes/deploying/waxed_oxidized_copper_shingle_slab_from_adding_wax.json d0c7805681e3ed6a6bc5775d42c702af924e8785 data/create/recipes/deploying/waxed_oxidized_copper_shingle_stairs_from_adding_wax.json -41c879946a24ff330466476bdee9148859398842 data/create/recipes/deploying/waxed_oxidized_copper_tiles_from_adding_wax.json +bd37d658666b2912c07b6daa6adaff99a479223a data/create/recipes/deploying/waxed_oxidized_copper_shingles_from_adding_wax.json af72234311a9abf5c57c767c05274c466dceac53 data/create/recipes/deploying/waxed_oxidized_copper_tile_slab_from_adding_wax.json b35d22f891d1c9cab4340399e3426c96132b3fc7 data/create/recipes/deploying/waxed_oxidized_copper_tile_stairs_from_adding_wax.json +41c879946a24ff330466476bdee9148859398842 data/create/recipes/deploying/waxed_oxidized_copper_tiles_from_adding_wax.json 9d78f4d16273015d181be586f91e77f3b82ee18f data/create/recipes/deploying/waxed_oxidized_cut_copper_from_adding_wax.json 2a9c57a8ca9b013b7bc11d2588d4ba00b402f97f data/create/recipes/deploying/waxed_oxidized_cut_copper_slab_from_adding_wax.json 5670c074c0f1961a5e499953a49c7e3f1f617ebf data/create/recipes/deploying/waxed_oxidized_cut_copper_stairs_from_adding_wax.json 58679c5c37eaa5a52ef9e0f4f7cc695c58ddee96 data/create/recipes/deploying/waxed_weathered_copper_from_adding_wax.json -5817055c1cf3ae572ffbe2765f3e519fda4c3342 data/create/recipes/deploying/waxed_weathered_copper_shingles_from_adding_wax.json e962429c48ed12bb2d7b299719513c23a2088879 data/create/recipes/deploying/waxed_weathered_copper_shingle_slab_from_adding_wax.json 2321ea4ed39d09b12a80be8df2c7c1dc4c6d2c18 data/create/recipes/deploying/waxed_weathered_copper_shingle_stairs_from_adding_wax.json -b635490492a22f88e24003bffb09c4d5e3fa2d61 data/create/recipes/deploying/waxed_weathered_copper_tiles_from_adding_wax.json +5817055c1cf3ae572ffbe2765f3e519fda4c3342 data/create/recipes/deploying/waxed_weathered_copper_shingles_from_adding_wax.json d0fc937a3e7ae42fb1891b7b87adb2b57292e01d data/create/recipes/deploying/waxed_weathered_copper_tile_slab_from_adding_wax.json 6852ea4c7f27520fb3388ec641be4cb94d907199 data/create/recipes/deploying/waxed_weathered_copper_tile_stairs_from_adding_wax.json +b635490492a22f88e24003bffb09c4d5e3fa2d61 data/create/recipes/deploying/waxed_weathered_copper_tiles_from_adding_wax.json 9ab3ba5847c3abbc17c476436978141f2c039ce9 data/create/recipes/deploying/waxed_weathered_cut_copper_from_adding_wax.json 733dd94b46186c19fdecced5d8231e46ea612cf2 data/create/recipes/deploying/waxed_weathered_cut_copper_slab_from_adding_wax.json cd4c050e6ad9227bf293768f2d8b965c0ecafeab data/create/recipes/deploying/waxed_weathered_cut_copper_stairs_from_adding_wax.json @@ -724,8 +236,8 @@ ff16c74f09edbc67ed969f64270ca376bb8ea955 data/create/recipes/filling/compat/regi 12c19b46eec5bd371300dfcff5d2a9dd7169bb1b data/create/recipes/filling/glowstone.json afeb566e5f989c58d239a2f66084ce3d813d111a data/create/recipes/filling/grass_block.json 36d0f06ea9fa065ed85fc596e08725a2e6c8d4af data/create/recipes/filling/gunpowder.json -c07c662c2ba8d7e5c72437096acfd7fdb99704f3 data/create/recipes/filling/honeyed_apple.json c4e0373516bc98def80d0a13803cf980e3f905e0 data/create/recipes/filling/honey_bottle.json +c07c662c2ba8d7e5c72437096acfd7fdb99704f3 data/create/recipes/filling/honeyed_apple.json 3acf4a649751c23c8e39d649131939659c105a53 data/create/recipes/filling/redstone.json deab6ea169b756376d89ea2200e0387a865ed2fc data/create/recipes/filling/sweet_roll.json 788cce637f455ea33408e5be5b75ce0e4cc57c95 data/create/recipes/haunting/blackstone.json @@ -871,8 +383,8 @@ eb9606bbb2e4c6fb82b6607c8d5c23834d9e44a8 data/create/recipes/milling/compat/byg/ fda00f49b9a5758ee7d24f2aeab81a3cc690544a data/create/recipes/milling/compat/byg/yellow_tulip.json 2e6a7a1b0e8ab1d6e514a30a21d47b404cfdcd45 data/create/recipes/milling/compat/druidcraft/lavender.json 5be32cdd48cf7d9e3f8273fc3479d559070b9872 data/create/recipes/milling/compat/environmental/bird_of_paradise.json -102130e75ea8f2b8c99ad9641d293a4e588912cf data/create/recipes/milling/compat/environmental/bluebell.json 50df88584dd6086c0dbb23fb16b7f36fee381534 data/create/recipes/milling/compat/environmental/blue_delphinium.json +102130e75ea8f2b8c99ad9641d293a4e588912cf data/create/recipes/milling/compat/environmental/bluebell.json a4beb691042be811eee8a130ff023065620b20b9 data/create/recipes/milling/compat/environmental/cartwheel.json d1d388667f9c8a5666cc2a1ef2eb77716a0b18ed data/create/recipes/milling/compat/environmental/dianthus.json ee3d1989d4a1069909aaeb99374602d0e92d6dfc data/create/recipes/milling/compat/environmental/magenta_hibiscus.json @@ -1072,11 +584,11 @@ cccf4ef0891992687dcb7ce5c644499d93210b8a data/create/recipes/splashing/sand.json 0ee6d52e8966b6189f2841bcdf41417df1ab072c data/create/recipes/splashing/stained_glass.json f241ec6a8ad063b28281c18e1fbb03c482d7af8b data/create/recipes/splashing/stained_glass_pane.json 712b367223067cc468346d2fa485779f1501d5ec data/create/recipes/splashing/supplementaries/blackboard.json +a8fd822419fbb47b37412742fe13a785ae147d21 data/create/recipes/splashing/the_vault/ornate_chain_rusty.json 43bcc2f22cca830f11a48f4b48f699001f4ffbb5 data/create/recipes/splashing/thermal/crushed_raw_lead.json 4bc875e07f963f417e0a427ca7a6f9f9a40213ac data/create/recipes/splashing/thermal/crushed_raw_nickel.json 0ceeb253b478dde532e4de01d1ff60ed09819388 data/create/recipes/splashing/thermal/crushed_raw_silver.json 5fa818c04cb65048be0246ade3946cc1e01a0772 data/create/recipes/splashing/thermal/crushed_raw_tin.json -a8fd822419fbb47b37412742fe13a785ae147d21 data/create/recipes/splashing/the_vault/ornate_chain_rusty.json 23d70b869e50a1e11df264f3640becac4ec9100d data/create/recipes/splashing/wheat_flour.json a883796342143a5f2b5bc68d230b725964abdb8f data/create/recipes/splashing/white_concrete_powder.json d09bcaa2334e05e6cce37b7342c7de84ce954bb9 data/create/recipes/splashing/wool.json diff --git a/src/generated/resources/data/create/recipes/cutting/acacia_log.json b/src/generated/resources/data/create/recipes/cutting/acacia_log.json deleted file mode 100644 index 180bfe30a4..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/acacia_log.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:acacia_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "minecraft:stripped_acacia_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/acacia_wood.json b/src/generated/resources/data/create/recipes/cutting/acacia_wood.json deleted file mode 100644 index 1832e3b5f6..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/acacia_wood.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:acacia_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "minecraft:stripped_acacia_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/birch_log.json b/src/generated/resources/data/create/recipes/cutting/birch_log.json deleted file mode 100644 index 9aae8a8c29..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/birch_log.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:birch_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "minecraft:stripped_birch_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/birch_wood.json b/src/generated/resources/data/create/recipes/cutting/birch_wood.json deleted file mode 100644 index 727e50fefb..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/birch_wood.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:birch_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "minecraft:stripped_birch_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/cherry_log.json b/src/generated/resources/data/create/recipes/cutting/cherry_log.json deleted file mode 100644 index d413e30679..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/cherry_log.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:cherry_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "minecraft:stripped_cherry_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/cherry_wood.json b/src/generated/resources/data/create/recipes/cutting/cherry_wood.json deleted file mode 100644 index 373d7d143a..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/cherry_wood.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:cherry_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "minecraft:stripped_cherry_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/architects_palette/stripped_twisted_log.json b/src/generated/resources/data/create/recipes/cutting/compat/architects_palette/stripped_twisted_log.json deleted file mode 100644 index b956d8920e..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/architects_palette/stripped_twisted_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "architects_palette" - } - ], - "ingredients": [ - { - "item": "architects_palette:stripped_twisted_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "architects_palette:twisted_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/architects_palette/stripped_twisted_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/architects_palette/stripped_twisted_wood.json deleted file mode 100644 index a4e1df53f8..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/architects_palette/stripped_twisted_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "architects_palette" - } - ], - "ingredients": [ - { - "item": "architects_palette:stripped_twisted_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "architects_palette:twisted_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/architects_palette/twisted_log.json b/src/generated/resources/data/create/recipes/cutting/compat/architects_palette/twisted_log.json deleted file mode 100644 index 154c98ca9c..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/architects_palette/twisted_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "architects_palette" - } - ], - "ingredients": [ - { - "item": "architects_palette:twisted_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "architects_palette:stripped_twisted_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/architects_palette/twisted_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/architects_palette/twisted_wood.json deleted file mode 100644 index 039d74fdf7..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/architects_palette/twisted_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "architects_palette" - } - ], - "ingredients": [ - { - "item": "architects_palette:twisted_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "architects_palette:stripped_twisted_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/aspen_log.json b/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/aspen_log.json deleted file mode 100644 index 7373ae8e45..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/aspen_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "atmospheric" - } - ], - "ingredients": [ - { - "item": "atmospheric:aspen_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "atmospheric:stripped_aspen_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/aspen_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/aspen_wood.json deleted file mode 100644 index 1d978775a1..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/aspen_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "atmospheric" - } - ], - "ingredients": [ - { - "item": "atmospheric:aspen_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "atmospheric:stripped_aspen_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/grimwood.json b/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/grimwood.json deleted file mode 100644 index 648d0a5535..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/grimwood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "atmospheric" - } - ], - "ingredients": [ - { - "item": "atmospheric:grimwood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "atmospheric:stripped_grimwood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/grimwood_log.json b/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/grimwood_log.json deleted file mode 100644 index e47ba69889..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/grimwood_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "atmospheric" - } - ], - "ingredients": [ - { - "item": "atmospheric:grimwood_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "atmospheric:stripped_grimwood_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/kousa_log.json b/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/kousa_log.json deleted file mode 100644 index aa56e9cb01..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/kousa_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "atmospheric" - } - ], - "ingredients": [ - { - "item": "atmospheric:kousa_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "atmospheric:stripped_kousa_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/kousa_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/kousa_wood.json deleted file mode 100644 index 4958a4087d..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/kousa_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "atmospheric" - } - ], - "ingredients": [ - { - "item": "atmospheric:kousa_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "atmospheric:stripped_kousa_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/morado_log.json b/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/morado_log.json deleted file mode 100644 index d10d4088bd..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/morado_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "atmospheric" - } - ], - "ingredients": [ - { - "item": "atmospheric:morado_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "atmospheric:stripped_morado_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/morado_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/morado_wood.json deleted file mode 100644 index 6747e0e199..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/morado_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "atmospheric" - } - ], - "ingredients": [ - { - "item": "atmospheric:morado_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "atmospheric:stripped_morado_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/rosewood.json b/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/rosewood.json deleted file mode 100644 index 41ddadb916..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/rosewood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "atmospheric" - } - ], - "ingredients": [ - { - "item": "atmospheric:rosewood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "atmospheric:stripped_rosewood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/rosewood_log.json b/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/rosewood_log.json deleted file mode 100644 index f68192b89f..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/rosewood_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "atmospheric" - } - ], - "ingredients": [ - { - "item": "atmospheric:rosewood_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "atmospheric:stripped_rosewood_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/stripped_aspen_log.json b/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/stripped_aspen_log.json deleted file mode 100644 index b43591e2ac..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/stripped_aspen_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "atmospheric" - } - ], - "ingredients": [ - { - "item": "atmospheric:stripped_aspen_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "atmospheric:aspen_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/stripped_aspen_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/stripped_aspen_wood.json deleted file mode 100644 index 9c8566ead7..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/stripped_aspen_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "atmospheric" - } - ], - "ingredients": [ - { - "item": "atmospheric:stripped_aspen_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "atmospheric:aspen_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/stripped_grimwood.json b/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/stripped_grimwood.json deleted file mode 100644 index b9fbdc7e10..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/stripped_grimwood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "atmospheric" - } - ], - "ingredients": [ - { - "item": "atmospheric:stripped_grimwood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "atmospheric:grimwood_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/stripped_grimwood_log.json b/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/stripped_grimwood_log.json deleted file mode 100644 index 4724283d87..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/stripped_grimwood_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "atmospheric" - } - ], - "ingredients": [ - { - "item": "atmospheric:stripped_grimwood_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "atmospheric:grimwood_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/stripped_kousa_log.json b/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/stripped_kousa_log.json deleted file mode 100644 index 9c56af6677..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/stripped_kousa_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "atmospheric" - } - ], - "ingredients": [ - { - "item": "atmospheric:stripped_kousa_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "atmospheric:kousa_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/stripped_kousa_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/stripped_kousa_wood.json deleted file mode 100644 index f6ea5c27bd..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/stripped_kousa_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "atmospheric" - } - ], - "ingredients": [ - { - "item": "atmospheric:stripped_kousa_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "atmospheric:kousa_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/stripped_morado_log.json b/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/stripped_morado_log.json deleted file mode 100644 index 0dfb1cd985..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/stripped_morado_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "atmospheric" - } - ], - "ingredients": [ - { - "item": "atmospheric:stripped_morado_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "atmospheric:morado_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/stripped_morado_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/stripped_morado_wood.json deleted file mode 100644 index 143a190419..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/stripped_morado_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "atmospheric" - } - ], - "ingredients": [ - { - "item": "atmospheric:stripped_morado_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "atmospheric:morado_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/stripped_rosewood.json b/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/stripped_rosewood.json deleted file mode 100644 index 23de676707..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/stripped_rosewood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "atmospheric" - } - ], - "ingredients": [ - { - "item": "atmospheric:stripped_rosewood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "atmospheric:rosewood_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/stripped_rosewood_log.json b/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/stripped_rosewood_log.json deleted file mode 100644 index 10a905f8fa..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/stripped_rosewood_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "atmospheric" - } - ], - "ingredients": [ - { - "item": "atmospheric:stripped_rosewood_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "atmospheric:rosewood_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/stripped_yucca_log.json b/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/stripped_yucca_log.json deleted file mode 100644 index 89f13128b2..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/stripped_yucca_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "atmospheric" - } - ], - "ingredients": [ - { - "item": "atmospheric:stripped_yucca_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "atmospheric:yucca_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/stripped_yucca_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/stripped_yucca_wood.json deleted file mode 100644 index 065d11f408..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/stripped_yucca_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "atmospheric" - } - ], - "ingredients": [ - { - "item": "atmospheric:stripped_yucca_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "atmospheric:yucca_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/yucca_log.json b/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/yucca_log.json deleted file mode 100644 index 4b247132bf..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/yucca_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "atmospheric" - } - ], - "ingredients": [ - { - "item": "atmospheric:yucca_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "atmospheric:stripped_yucca_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/yucca_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/yucca_wood.json deleted file mode 100644 index 456bd0973d..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/atmospheric/yucca_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "atmospheric" - } - ], - "ingredients": [ - { - "item": "atmospheric:yucca_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "atmospheric:stripped_yucca_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/autumnity/maple_log.json b/src/generated/resources/data/create/recipes/cutting/compat/autumnity/maple_log.json deleted file mode 100644 index 04a37d560d..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/autumnity/maple_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "autumnity" - } - ], - "ingredients": [ - { - "item": "autumnity:maple_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "autumnity:stripped_maple_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/autumnity/maple_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/autumnity/maple_wood.json deleted file mode 100644 index c62d6a50ae..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/autumnity/maple_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "autumnity" - } - ], - "ingredients": [ - { - "item": "autumnity:maple_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "autumnity:stripped_maple_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/autumnity/sappy_maple_log.json b/src/generated/resources/data/create/recipes/cutting/compat/autumnity/sappy_maple_log.json deleted file mode 100644 index c6e57a9317..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/autumnity/sappy_maple_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "autumnity" - } - ], - "ingredients": [ - { - "item": "autumnity:sappy_maple_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "autumnity:maple_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/autumnity/sappy_maple_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/autumnity/sappy_maple_wood.json deleted file mode 100644 index 6986e9d7d9..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/autumnity/sappy_maple_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "autumnity" - } - ], - "ingredients": [ - { - "item": "autumnity:sappy_maple_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "autumnity:sappy_maple_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/autumnity/stripped_maple_log.json b/src/generated/resources/data/create/recipes/cutting/compat/autumnity/stripped_maple_log.json deleted file mode 100644 index 1257ace064..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/autumnity/stripped_maple_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "autumnity" - } - ], - "ingredients": [ - { - "item": "autumnity:stripped_maple_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "autumnity:maple_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/autumnity/stripped_maple_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/autumnity/stripped_maple_wood.json deleted file mode 100644 index d0b66d0db1..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/autumnity/stripped_maple_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "autumnity" - } - ], - "ingredients": [ - { - "item": "autumnity:stripped_maple_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "autumnity:maple_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/dead_log.json b/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/dead_log.json deleted file mode 100644 index b3615b45f8..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/dead_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "biomesoplenty" - } - ], - "ingredients": [ - { - "item": "biomesoplenty:dead_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "biomesoplenty:stripped_dead_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/dead_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/dead_wood.json deleted file mode 100644 index 5022a39a5b..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/dead_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "biomesoplenty" - } - ], - "ingredients": [ - { - "item": "biomesoplenty:dead_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "biomesoplenty:stripped_dead_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/fir_log.json b/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/fir_log.json deleted file mode 100644 index d7ee6f9959..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/fir_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "biomesoplenty" - } - ], - "ingredients": [ - { - "item": "biomesoplenty:fir_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "biomesoplenty:stripped_fir_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/fir_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/fir_wood.json deleted file mode 100644 index 1848e65b5f..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/fir_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "biomesoplenty" - } - ], - "ingredients": [ - { - "item": "biomesoplenty:fir_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "biomesoplenty:stripped_fir_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/hellbark_log.json b/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/hellbark_log.json deleted file mode 100644 index d5cbcd748f..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/hellbark_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "biomesoplenty" - } - ], - "ingredients": [ - { - "item": "biomesoplenty:hellbark_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "biomesoplenty:stripped_hellbark_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/hellbark_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/hellbark_wood.json deleted file mode 100644 index 4f38f736d2..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/hellbark_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "biomesoplenty" - } - ], - "ingredients": [ - { - "item": "biomesoplenty:hellbark_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "biomesoplenty:stripped_hellbark_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/jacaranda_log.json b/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/jacaranda_log.json deleted file mode 100644 index 681a55c1e8..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/jacaranda_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "biomesoplenty" - } - ], - "ingredients": [ - { - "item": "biomesoplenty:jacaranda_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "biomesoplenty:stripped_jacaranda_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/jacaranda_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/jacaranda_wood.json deleted file mode 100644 index 23a4f5d343..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/jacaranda_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "biomesoplenty" - } - ], - "ingredients": [ - { - "item": "biomesoplenty:jacaranda_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "biomesoplenty:stripped_jacaranda_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/magic_log.json b/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/magic_log.json deleted file mode 100644 index 237abded87..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/magic_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "biomesoplenty" - } - ], - "ingredients": [ - { - "item": "biomesoplenty:magic_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "biomesoplenty:stripped_magic_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/magic_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/magic_wood.json deleted file mode 100644 index 2528982b36..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/magic_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "biomesoplenty" - } - ], - "ingredients": [ - { - "item": "biomesoplenty:magic_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "biomesoplenty:stripped_magic_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/mahogany_log.json b/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/mahogany_log.json deleted file mode 100644 index 4a1e5deda5..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/mahogany_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "biomesoplenty" - } - ], - "ingredients": [ - { - "item": "biomesoplenty:mahogany_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "biomesoplenty:stripped_mahogany_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/mahogany_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/mahogany_wood.json deleted file mode 100644 index 332666981b..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/mahogany_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "biomesoplenty" - } - ], - "ingredients": [ - { - "item": "biomesoplenty:mahogany_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "biomesoplenty:stripped_mahogany_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/palm_log.json b/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/palm_log.json deleted file mode 100644 index 86fa921923..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/palm_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "biomesoplenty" - } - ], - "ingredients": [ - { - "item": "biomesoplenty:palm_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "biomesoplenty:stripped_palm_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/palm_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/palm_wood.json deleted file mode 100644 index 39ffc171e9..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/palm_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "biomesoplenty" - } - ], - "ingredients": [ - { - "item": "biomesoplenty:palm_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "biomesoplenty:stripped_palm_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/redwood_log.json b/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/redwood_log.json deleted file mode 100644 index 2c754fc51c..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/redwood_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "biomesoplenty" - } - ], - "ingredients": [ - { - "item": "biomesoplenty:redwood_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "biomesoplenty:stripped_redwood_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/redwood_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/redwood_wood.json deleted file mode 100644 index eaa8ac592c..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/redwood_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "biomesoplenty" - } - ], - "ingredients": [ - { - "item": "biomesoplenty:redwood_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "biomesoplenty:stripped_redwood_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_dead_log.json b/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_dead_log.json deleted file mode 100644 index 90ebc73a61..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_dead_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "biomesoplenty" - } - ], - "ingredients": [ - { - "item": "biomesoplenty:stripped_dead_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "biomesoplenty:dead_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_dead_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_dead_wood.json deleted file mode 100644 index 1493e8265e..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_dead_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "biomesoplenty" - } - ], - "ingredients": [ - { - "item": "biomesoplenty:stripped_dead_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "biomesoplenty:dead_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_fir_log.json b/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_fir_log.json deleted file mode 100644 index 10c5538977..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_fir_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "biomesoplenty" - } - ], - "ingredients": [ - { - "item": "biomesoplenty:stripped_fir_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "biomesoplenty:fir_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_fir_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_fir_wood.json deleted file mode 100644 index 8c6b76bdea..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_fir_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "biomesoplenty" - } - ], - "ingredients": [ - { - "item": "biomesoplenty:stripped_fir_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "biomesoplenty:fir_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_hellbark_log.json b/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_hellbark_log.json deleted file mode 100644 index 1c44191003..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_hellbark_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "biomesoplenty" - } - ], - "ingredients": [ - { - "item": "biomesoplenty:stripped_hellbark_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "biomesoplenty:hellbark_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_hellbark_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_hellbark_wood.json deleted file mode 100644 index 75a5356c84..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_hellbark_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "biomesoplenty" - } - ], - "ingredients": [ - { - "item": "biomesoplenty:stripped_hellbark_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "biomesoplenty:hellbark_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_jacaranda_log.json b/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_jacaranda_log.json deleted file mode 100644 index 32c8fc6868..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_jacaranda_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "biomesoplenty" - } - ], - "ingredients": [ - { - "item": "biomesoplenty:stripped_jacaranda_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "biomesoplenty:jacaranda_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_jacaranda_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_jacaranda_wood.json deleted file mode 100644 index 279204ec72..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_jacaranda_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "biomesoplenty" - } - ], - "ingredients": [ - { - "item": "biomesoplenty:stripped_jacaranda_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "biomesoplenty:jacaranda_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_magic_log.json b/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_magic_log.json deleted file mode 100644 index 26618e2932..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_magic_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "biomesoplenty" - } - ], - "ingredients": [ - { - "item": "biomesoplenty:stripped_magic_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "biomesoplenty:magic_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_magic_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_magic_wood.json deleted file mode 100644 index 10f02907cf..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_magic_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "biomesoplenty" - } - ], - "ingredients": [ - { - "item": "biomesoplenty:stripped_magic_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "biomesoplenty:magic_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_mahogany_log.json b/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_mahogany_log.json deleted file mode 100644 index 39bcfc2e7e..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_mahogany_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "biomesoplenty" - } - ], - "ingredients": [ - { - "item": "biomesoplenty:stripped_mahogany_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "biomesoplenty:mahogany_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_mahogany_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_mahogany_wood.json deleted file mode 100644 index 5a9a5c86fb..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_mahogany_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "biomesoplenty" - } - ], - "ingredients": [ - { - "item": "biomesoplenty:stripped_mahogany_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "biomesoplenty:mahogany_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_palm_log.json b/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_palm_log.json deleted file mode 100644 index cde979e13d..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_palm_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "biomesoplenty" - } - ], - "ingredients": [ - { - "item": "biomesoplenty:stripped_palm_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "biomesoplenty:palm_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_palm_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_palm_wood.json deleted file mode 100644 index 8b13809543..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_palm_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "biomesoplenty" - } - ], - "ingredients": [ - { - "item": "biomesoplenty:stripped_palm_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "biomesoplenty:palm_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_redwood_log.json b/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_redwood_log.json deleted file mode 100644 index 8536b80e8a..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_redwood_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "biomesoplenty" - } - ], - "ingredients": [ - { - "item": "biomesoplenty:stripped_redwood_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "biomesoplenty:redwood_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_redwood_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_redwood_wood.json deleted file mode 100644 index dd6241be57..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_redwood_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "biomesoplenty" - } - ], - "ingredients": [ - { - "item": "biomesoplenty:stripped_redwood_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "biomesoplenty:redwood_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_umbran_log.json b/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_umbran_log.json deleted file mode 100644 index c5f63f05bb..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_umbran_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "biomesoplenty" - } - ], - "ingredients": [ - { - "item": "biomesoplenty:stripped_umbran_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "biomesoplenty:umbran_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_umbran_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_umbran_wood.json deleted file mode 100644 index 9aca280726..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_umbran_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "biomesoplenty" - } - ], - "ingredients": [ - { - "item": "biomesoplenty:stripped_umbran_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "biomesoplenty:umbran_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_willow_log.json b/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_willow_log.json deleted file mode 100644 index b192aebc2f..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_willow_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "biomesoplenty" - } - ], - "ingredients": [ - { - "item": "biomesoplenty:stripped_willow_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "biomesoplenty:willow_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_willow_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_willow_wood.json deleted file mode 100644 index eef0c2313a..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/stripped_willow_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "biomesoplenty" - } - ], - "ingredients": [ - { - "item": "biomesoplenty:stripped_willow_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "biomesoplenty:willow_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/umbran_log.json b/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/umbran_log.json deleted file mode 100644 index a02692be37..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/umbran_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "biomesoplenty" - } - ], - "ingredients": [ - { - "item": "biomesoplenty:umbran_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "biomesoplenty:stripped_umbran_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/umbran_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/umbran_wood.json deleted file mode 100644 index 629bce7c5d..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/umbran_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "biomesoplenty" - } - ], - "ingredients": [ - { - "item": "biomesoplenty:umbran_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "biomesoplenty:stripped_umbran_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/willow_log.json b/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/willow_log.json deleted file mode 100644 index 38ee3bc682..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/willow_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "biomesoplenty" - } - ], - "ingredients": [ - { - "item": "biomesoplenty:willow_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "biomesoplenty:stripped_willow_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/willow_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/willow_wood.json deleted file mode 100644 index 2bcf4650cb..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/biomesoplenty/willow_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "biomesoplenty" - } - ], - "ingredients": [ - { - "item": "biomesoplenty:willow_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "biomesoplenty:stripped_willow_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/bluebright_log.json b/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/bluebright_log.json deleted file mode 100644 index 5b531994e4..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/bluebright_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "blue_skies" - } - ], - "ingredients": [ - { - "item": "blue_skies:bluebright_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "blue_skies:stripped_bluebright_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/bluebright_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/bluebright_wood.json deleted file mode 100644 index e8bc9e7954..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/bluebright_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "blue_skies" - } - ], - "ingredients": [ - { - "item": "blue_skies:bluebright_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "blue_skies:stripped_bluebright_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/crystallized_log.json b/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/crystallized_log.json deleted file mode 100644 index 64e4db8f5f..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/crystallized_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "blue_skies" - } - ], - "ingredients": [ - { - "item": "blue_skies:crystallized_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "blue_skies:crystallized_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/crystallized_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/crystallized_wood.json deleted file mode 100644 index 96d0e1b032..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/crystallized_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "blue_skies" - } - ], - "ingredients": [ - { - "item": "blue_skies:crystallized_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "blue_skies:crystallized_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/dusk_log.json b/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/dusk_log.json deleted file mode 100644 index 5cac874ea5..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/dusk_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "blue_skies" - } - ], - "ingredients": [ - { - "item": "blue_skies:dusk_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "blue_skies:stripped_dusk_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/dusk_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/dusk_wood.json deleted file mode 100644 index 480fa95760..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/dusk_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "blue_skies" - } - ], - "ingredients": [ - { - "item": "blue_skies:dusk_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "blue_skies:stripped_dusk_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/frostbright_log.json b/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/frostbright_log.json deleted file mode 100644 index 949c81e6d8..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/frostbright_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "blue_skies" - } - ], - "ingredients": [ - { - "item": "blue_skies:frostbright_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "blue_skies:stripped_frostbright_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/frostbright_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/frostbright_wood.json deleted file mode 100644 index 644b93ef58..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/frostbright_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "blue_skies" - } - ], - "ingredients": [ - { - "item": "blue_skies:frostbright_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "blue_skies:stripped_frostbright_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/lunar_log.json b/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/lunar_log.json deleted file mode 100644 index d592df227e..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/lunar_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "blue_skies" - } - ], - "ingredients": [ - { - "item": "blue_skies:lunar_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "blue_skies:stripped_lunar_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/lunar_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/lunar_wood.json deleted file mode 100644 index 2f0771e71a..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/lunar_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "blue_skies" - } - ], - "ingredients": [ - { - "item": "blue_skies:lunar_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "blue_skies:stripped_lunar_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/maple_log.json b/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/maple_log.json deleted file mode 100644 index 2e81668852..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/maple_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "blue_skies" - } - ], - "ingredients": [ - { - "item": "blue_skies:maple_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "blue_skies:stripped_maple_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/maple_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/maple_wood.json deleted file mode 100644 index b1121cd1f8..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/maple_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "blue_skies" - } - ], - "ingredients": [ - { - "item": "blue_skies:maple_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "blue_skies:stripped_maple_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/starlit_log.json b/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/starlit_log.json deleted file mode 100644 index 886c89a38c..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/starlit_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "blue_skies" - } - ], - "ingredients": [ - { - "item": "blue_skies:starlit_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "blue_skies:stripped_starlit_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/starlit_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/starlit_wood.json deleted file mode 100644 index 1e46281116..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/starlit_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "blue_skies" - } - ], - "ingredients": [ - { - "item": "blue_skies:starlit_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "blue_skies:stripped_starlit_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/stripped_bluebright_log.json b/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/stripped_bluebright_log.json deleted file mode 100644 index 4af14fe8dd..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/stripped_bluebright_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "blue_skies" - } - ], - "ingredients": [ - { - "item": "blue_skies:stripped_bluebright_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "blue_skies:bluebright_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/stripped_bluebright_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/stripped_bluebright_wood.json deleted file mode 100644 index 55e85cbbc6..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/stripped_bluebright_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "blue_skies" - } - ], - "ingredients": [ - { - "item": "blue_skies:stripped_bluebright_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "blue_skies:bluebright_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/stripped_dusk_log.json b/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/stripped_dusk_log.json deleted file mode 100644 index dce73b8958..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/stripped_dusk_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "blue_skies" - } - ], - "ingredients": [ - { - "item": "blue_skies:stripped_dusk_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "blue_skies:dusk_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/stripped_dusk_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/stripped_dusk_wood.json deleted file mode 100644 index 39f1907122..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/stripped_dusk_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "blue_skies" - } - ], - "ingredients": [ - { - "item": "blue_skies:stripped_dusk_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "blue_skies:dusk_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/stripped_frostbright_log.json b/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/stripped_frostbright_log.json deleted file mode 100644 index 94bedaf647..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/stripped_frostbright_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "blue_skies" - } - ], - "ingredients": [ - { - "item": "blue_skies:stripped_frostbright_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "blue_skies:frostbright_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/stripped_frostbright_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/stripped_frostbright_wood.json deleted file mode 100644 index 0b04be828a..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/stripped_frostbright_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "blue_skies" - } - ], - "ingredients": [ - { - "item": "blue_skies:stripped_frostbright_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "blue_skies:frostbright_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/stripped_lunar_log.json b/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/stripped_lunar_log.json deleted file mode 100644 index 84520fdc31..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/stripped_lunar_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "blue_skies" - } - ], - "ingredients": [ - { - "item": "blue_skies:stripped_lunar_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "blue_skies:lunar_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/stripped_lunar_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/stripped_lunar_wood.json deleted file mode 100644 index 06dd123880..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/stripped_lunar_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "blue_skies" - } - ], - "ingredients": [ - { - "item": "blue_skies:stripped_lunar_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "blue_skies:lunar_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/stripped_maple_log.json b/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/stripped_maple_log.json deleted file mode 100644 index 6f9b9b8165..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/stripped_maple_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "blue_skies" - } - ], - "ingredients": [ - { - "item": "blue_skies:stripped_maple_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "blue_skies:maple_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/stripped_maple_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/stripped_maple_wood.json deleted file mode 100644 index fecc4dd4f6..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/stripped_maple_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "blue_skies" - } - ], - "ingredients": [ - { - "item": "blue_skies:stripped_maple_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "blue_skies:maple_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/stripped_starlit_log.json b/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/stripped_starlit_log.json deleted file mode 100644 index e56362453d..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/stripped_starlit_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "blue_skies" - } - ], - "ingredients": [ - { - "item": "blue_skies:stripped_starlit_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "blue_skies:starlit_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/stripped_starlit_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/stripped_starlit_wood.json deleted file mode 100644 index 36fad622f9..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/blue_skies/stripped_starlit_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "blue_skies" - } - ], - "ingredients": [ - { - "item": "blue_skies:stripped_starlit_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "blue_skies:starlit_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/botania/dreamwood.json b/src/generated/resources/data/create/recipes/cutting/compat/botania/dreamwood.json deleted file mode 100644 index 5615d862ff..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/botania/dreamwood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "botania" - } - ], - "ingredients": [ - { - "item": "botania:dreamwood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "botania:stripped_dreamwood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/botania/dreamwood_log.json b/src/generated/resources/data/create/recipes/cutting/compat/botania/dreamwood_log.json deleted file mode 100644 index d58105eaf1..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/botania/dreamwood_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "botania" - } - ], - "ingredients": [ - { - "item": "botania:dreamwood_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "botania:stripped_dreamwood_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/botania/glimmering_dreamwood.json b/src/generated/resources/data/create/recipes/cutting/compat/botania/glimmering_dreamwood.json deleted file mode 100644 index 7a56cc7992..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/botania/glimmering_dreamwood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "botania" - } - ], - "ingredients": [ - { - "item": "botania:glimmering_dreamwood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "botania:glimmering_stripped_dreamwood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/botania/glimmering_dreamwood_log.json b/src/generated/resources/data/create/recipes/cutting/compat/botania/glimmering_dreamwood_log.json deleted file mode 100644 index 62b83d4bb2..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/botania/glimmering_dreamwood_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "botania" - } - ], - "ingredients": [ - { - "item": "botania:glimmering_dreamwood_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "botania:glimmering_stripped_dreamwood_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/botania/glimmering_livingwood.json b/src/generated/resources/data/create/recipes/cutting/compat/botania/glimmering_livingwood.json deleted file mode 100644 index 175d5c86f0..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/botania/glimmering_livingwood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "botania" - } - ], - "ingredients": [ - { - "item": "botania:glimmering_livingwood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "botania:glimmering_stripped_livingwood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/botania/glimmering_livingwood_log.json b/src/generated/resources/data/create/recipes/cutting/compat/botania/glimmering_livingwood_log.json deleted file mode 100644 index 406e393eae..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/botania/glimmering_livingwood_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "botania" - } - ], - "ingredients": [ - { - "item": "botania:glimmering_livingwood_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "botania:glimmering_stripped_livingwood_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/botania/glimmering_stripped_dreamwood.json b/src/generated/resources/data/create/recipes/cutting/compat/botania/glimmering_stripped_dreamwood.json deleted file mode 100644 index d3820d7ac1..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/botania/glimmering_stripped_dreamwood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "botania" - } - ], - "ingredients": [ - { - "item": "botania:glimmering_stripped_dreamwood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "botania:dreamwood_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/botania/glimmering_stripped_dreamwood_log.json b/src/generated/resources/data/create/recipes/cutting/compat/botania/glimmering_stripped_dreamwood_log.json deleted file mode 100644 index 3dc8ea13c5..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/botania/glimmering_stripped_dreamwood_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "botania" - } - ], - "ingredients": [ - { - "item": "botania:glimmering_stripped_dreamwood_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "botania:dreamwood_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/botania/glimmering_stripped_livingwood.json b/src/generated/resources/data/create/recipes/cutting/compat/botania/glimmering_stripped_livingwood.json deleted file mode 100644 index 8b89443935..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/botania/glimmering_stripped_livingwood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "botania" - } - ], - "ingredients": [ - { - "item": "botania:glimmering_stripped_livingwood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "botania:livingwood_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/botania/glimmering_stripped_livingwood_log.json b/src/generated/resources/data/create/recipes/cutting/compat/botania/glimmering_stripped_livingwood_log.json deleted file mode 100644 index de57b7c843..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/botania/glimmering_stripped_livingwood_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "botania" - } - ], - "ingredients": [ - { - "item": "botania:glimmering_stripped_livingwood_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "botania:livingwood_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/botania/livingwood.json b/src/generated/resources/data/create/recipes/cutting/compat/botania/livingwood.json deleted file mode 100644 index 9b82792484..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/botania/livingwood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "botania" - } - ], - "ingredients": [ - { - "item": "botania:livingwood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "botania:stripped_livingwood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/botania/livingwood_log.json b/src/generated/resources/data/create/recipes/cutting/compat/botania/livingwood_log.json deleted file mode 100644 index 485759f46c..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/botania/livingwood_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "botania" - } - ], - "ingredients": [ - { - "item": "botania:livingwood_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "botania:stripped_livingwood_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/botania/stripped_dreamwood.json b/src/generated/resources/data/create/recipes/cutting/compat/botania/stripped_dreamwood.json deleted file mode 100644 index 954b1f5c7f..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/botania/stripped_dreamwood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "botania" - } - ], - "ingredients": [ - { - "item": "botania:stripped_dreamwood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "botania:dreamwood_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/botania/stripped_dreamwood_log.json b/src/generated/resources/data/create/recipes/cutting/compat/botania/stripped_dreamwood_log.json deleted file mode 100644 index de771deef9..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/botania/stripped_dreamwood_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "botania" - } - ], - "ingredients": [ - { - "item": "botania:stripped_dreamwood_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "botania:dreamwood_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/botania/stripped_livingwood.json b/src/generated/resources/data/create/recipes/cutting/compat/botania/stripped_livingwood.json deleted file mode 100644 index 78bf75fe6b..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/botania/stripped_livingwood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "botania" - } - ], - "ingredients": [ - { - "item": "botania:stripped_livingwood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "botania:livingwood_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/botania/stripped_livingwood_log.json b/src/generated/resources/data/create/recipes/cutting/compat/botania/stripped_livingwood_log.json deleted file mode 100644 index 91539af7b8..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/botania/stripped_livingwood_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "botania" - } - ], - "ingredients": [ - { - "item": "botania:stripped_livingwood_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "botania:livingwood_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/aspen_log.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/aspen_log.json deleted file mode 100644 index 38ac271757..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/aspen_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:aspen_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "byg:stripped_aspen_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/aspen_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/aspen_wood.json deleted file mode 100644 index bb8419cec5..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/aspen_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:aspen_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "byg:stripped_aspen_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/baobab_log.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/baobab_log.json deleted file mode 100644 index e4a71eebaf..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/baobab_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:baobab_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "byg:stripped_baobab_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/baobab_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/baobab_wood.json deleted file mode 100644 index bcac7e7d99..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/baobab_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:baobab_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "byg:stripped_baobab_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/blue_enchanted_log.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/blue_enchanted_log.json deleted file mode 100644 index d5b4776223..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/blue_enchanted_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:blue_enchanted_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "byg:stripped_blue_enchanted_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/blue_enchanted_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/blue_enchanted_wood.json deleted file mode 100644 index d6b369036c..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/blue_enchanted_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:blue_enchanted_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "byg:stripped_blue_enchanted_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/bulbis_stem.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/bulbis_stem.json deleted file mode 100644 index 9d95a5c010..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/bulbis_stem.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:bulbis_stem" - } - ], - "processingTime": 50, - "results": [ - { - "item": "byg:stripped_bulbis_stem" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/bulbis_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/bulbis_wood.json deleted file mode 100644 index 349a4f7fb6..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/bulbis_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:bulbis_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "byg:stripped_bulbis_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/cika_log.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/cika_log.json deleted file mode 100644 index f6f2a625f1..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/cika_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:cika_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "byg:stripped_cika_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/cika_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/cika_wood.json deleted file mode 100644 index d41bf162b8..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/cika_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:cika_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "byg:stripped_cika_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/cypress_log.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/cypress_log.json deleted file mode 100644 index 726a5aabf3..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/cypress_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:cypress_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "byg:stripped_cypress_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/cypress_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/cypress_wood.json deleted file mode 100644 index e9a187c885..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/cypress_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:cypress_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "byg:stripped_cypress_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/ebony_log.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/ebony_log.json deleted file mode 100644 index c06c7f964e..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/ebony_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:ebony_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "byg:stripped_ebony_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/ebony_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/ebony_wood.json deleted file mode 100644 index 8e7e009132..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/ebony_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:ebony_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "byg:stripped_ebony_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/ether_log.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/ether_log.json deleted file mode 100644 index 3bc2e1565d..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/ether_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:ether_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "byg:stripped_ether_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/ether_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/ether_wood.json deleted file mode 100644 index 7dfcdc18d0..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/ether_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:ether_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "byg:stripped_ether_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/fir_log.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/fir_log.json deleted file mode 100644 index 212d415c72..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/fir_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:fir_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "byg:stripped_fir_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/fir_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/fir_wood.json deleted file mode 100644 index d93e8c277e..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/fir_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:fir_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "byg:stripped_fir_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/fungal_imparius_hyphae.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/fungal_imparius_hyphae.json deleted file mode 100644 index 38220ef5b6..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/fungal_imparius_hyphae.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:fungal_imparius_hyphae" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:imparius_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/fungal_imparius_stem.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/fungal_imparius_stem.json deleted file mode 100644 index 20e12e1c39..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/fungal_imparius_stem.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:fungal_imparius_stem" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:imparius_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/green_enchanted_log.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/green_enchanted_log.json deleted file mode 100644 index 2d6e1749e0..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/green_enchanted_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:green_enchanted_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "byg:stripped_green_enchanted_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/green_enchanted_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/green_enchanted_wood.json deleted file mode 100644 index 855cc1bb52..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/green_enchanted_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:green_enchanted_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "byg:stripped_green_enchanted_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/holly_log.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/holly_log.json deleted file mode 100644 index d0ecaf51d0..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/holly_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:holly_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "byg:stripped_holly_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/holly_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/holly_wood.json deleted file mode 100644 index 1192769b2d..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/holly_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:holly_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "byg:stripped_holly_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/imparius_hyphae.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/imparius_hyphae.json deleted file mode 100644 index 07d330aad6..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/imparius_hyphae.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:imparius_hyphae" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:imparius_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/imparius_stem.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/imparius_stem.json deleted file mode 100644 index 702991b5ef..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/imparius_stem.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:imparius_stem" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:imparius_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/jacaranda_log.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/jacaranda_log.json deleted file mode 100644 index 4a4277f7be..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/jacaranda_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:jacaranda_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "byg:stripped_jacaranda_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/jacaranda_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/jacaranda_wood.json deleted file mode 100644 index c59c82607d..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/jacaranda_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:jacaranda_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "byg:stripped_jacaranda_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/lament_log.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/lament_log.json deleted file mode 100644 index d1e9771136..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/lament_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:lament_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "byg:stripped_lament_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/lament_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/lament_wood.json deleted file mode 100644 index 42e55d2b90..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/lament_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:lament_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "byg:stripped_lament_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/mahogany_log.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/mahogany_log.json deleted file mode 100644 index cc6480a7d2..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/mahogany_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:mahogany_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "byg:stripped_mahogany_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/mahogany_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/mahogany_wood.json deleted file mode 100644 index 1b0a2777fe..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/mahogany_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:mahogany_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "byg:stripped_mahogany_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/maple_log.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/maple_log.json deleted file mode 100644 index cd46fac058..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/maple_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:maple_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "byg:stripped_maple_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/maple_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/maple_wood.json deleted file mode 100644 index 19a873bd25..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/maple_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:maple_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "byg:stripped_maple_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/nightshade_log.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/nightshade_log.json deleted file mode 100644 index 6678c7b053..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/nightshade_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:nightshade_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "byg:stripped_nightshade_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/nightshade_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/nightshade_wood.json deleted file mode 100644 index 1e1525a9d4..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/nightshade_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:nightshade_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "byg:stripped_nightshade_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/palm_log.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/palm_log.json deleted file mode 100644 index 6f7181eb3a..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/palm_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:palm_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "byg:stripped_palm_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/palm_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/palm_wood.json deleted file mode 100644 index f4b764e06c..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/palm_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:palm_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "byg:stripped_palm_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/palo_verde_log.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/palo_verde_log.json deleted file mode 100644 index 6e1efc0fe3..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/palo_verde_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:palo_verde_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "byg:stripped_palo_verde_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/palo_verde_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/palo_verde_wood.json deleted file mode 100644 index fba40199c8..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/palo_verde_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:palo_verde_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "byg:stripped_palo_verde_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/pine_log.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/pine_log.json deleted file mode 100644 index e61d51c101..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/pine_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:pine_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "byg:stripped_pine_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/pine_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/pine_wood.json deleted file mode 100644 index ba190ecff0..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/pine_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:pine_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "byg:stripped_pine_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/rainbow_eucalyptus_log.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/rainbow_eucalyptus_log.json deleted file mode 100644 index 0af3ef3709..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/rainbow_eucalyptus_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:rainbow_eucalyptus_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "byg:stripped_rainbow_eucalyptus_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/rainbow_eucalyptus_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/rainbow_eucalyptus_wood.json deleted file mode 100644 index 60c72f3302..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/rainbow_eucalyptus_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:rainbow_eucalyptus_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "byg:stripped_rainbow_eucalyptus_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/redwood_log.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/redwood_log.json deleted file mode 100644 index 8bdf07ae92..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/redwood_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:redwood_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "byg:stripped_redwood_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/redwood_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/redwood_wood.json deleted file mode 100644 index c7235f1262..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/redwood_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:redwood_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "byg:stripped_redwood_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/skyris_log.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/skyris_log.json deleted file mode 100644 index d1f37be95e..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/skyris_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:skyris_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "byg:stripped_skyris_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/skyris_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/skyris_wood.json deleted file mode 100644 index 473946580b..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/skyris_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:skyris_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "byg:stripped_skyris_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_aspen_log.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_aspen_log.json deleted file mode 100644 index cca3ab802c..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_aspen_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:stripped_aspen_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:aspen_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_aspen_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_aspen_wood.json deleted file mode 100644 index b2f679fac0..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_aspen_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:stripped_aspen_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:aspen_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_baobab_log.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_baobab_log.json deleted file mode 100644 index ffc8c1dcbb..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_baobab_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:stripped_baobab_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:baobab_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_baobab_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_baobab_wood.json deleted file mode 100644 index 3eb03b0d6f..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_baobab_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:stripped_baobab_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:baobab_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_blue_enchanted_log.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_blue_enchanted_log.json deleted file mode 100644 index f91b3c6df7..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_blue_enchanted_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:stripped_blue_enchanted_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:blue_enchanted_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_blue_enchanted_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_blue_enchanted_wood.json deleted file mode 100644 index 2c1450fa94..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_blue_enchanted_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:stripped_blue_enchanted_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:blue_enchanted_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_bulbis_stem.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_bulbis_stem.json deleted file mode 100644 index 4336a89882..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_bulbis_stem.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:stripped_bulbis_stem" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:bulbis_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_bulbis_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_bulbis_wood.json deleted file mode 100644 index 8a9856965b..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_bulbis_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:stripped_bulbis_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:bulbis_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_cika_log.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_cika_log.json deleted file mode 100644 index 56d5314433..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_cika_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:stripped_cika_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:cika_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_cika_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_cika_wood.json deleted file mode 100644 index b17ca3f5c0..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_cika_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:stripped_cika_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:cika_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_cypress_log.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_cypress_log.json deleted file mode 100644 index b9c88f7000..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_cypress_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:stripped_cypress_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:cypress_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_cypress_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_cypress_wood.json deleted file mode 100644 index 9682334294..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_cypress_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:stripped_cypress_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:cypress_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_ebony_log.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_ebony_log.json deleted file mode 100644 index 0b858bc86d..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_ebony_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:stripped_ebony_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:ebony_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_ebony_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_ebony_wood.json deleted file mode 100644 index 89c855237f..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_ebony_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:stripped_ebony_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:ebony_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_ether_log.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_ether_log.json deleted file mode 100644 index d934c094ad..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_ether_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:stripped_ether_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:ether_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_ether_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_ether_wood.json deleted file mode 100644 index c1a7142073..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_ether_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:stripped_ether_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:ether_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_fir_log.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_fir_log.json deleted file mode 100644 index fef32165d5..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_fir_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:stripped_fir_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:fir_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_fir_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_fir_wood.json deleted file mode 100644 index d16eede3b9..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_fir_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:stripped_fir_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:fir_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_green_enchanted_log.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_green_enchanted_log.json deleted file mode 100644 index f6dfcd2bb4..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_green_enchanted_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:stripped_green_enchanted_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:green_enchanted_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_green_enchanted_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_green_enchanted_wood.json deleted file mode 100644 index c9d6a595f6..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_green_enchanted_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:stripped_green_enchanted_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:green_enchanted_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_holly_log.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_holly_log.json deleted file mode 100644 index fcd99fa620..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_holly_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:stripped_holly_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:holly_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_holly_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_holly_wood.json deleted file mode 100644 index 5ee1551cd7..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_holly_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:stripped_holly_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:holly_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_jacaranda_log.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_jacaranda_log.json deleted file mode 100644 index 902745e370..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_jacaranda_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:stripped_jacaranda_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:jacaranda_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_jacaranda_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_jacaranda_wood.json deleted file mode 100644 index 4b8ba0caeb..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_jacaranda_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:stripped_jacaranda_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:jacaranda_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_lament_log.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_lament_log.json deleted file mode 100644 index 6ef18abe89..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_lament_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:stripped_lament_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:lament_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_lament_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_lament_wood.json deleted file mode 100644 index 4dee034e15..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_lament_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:stripped_lament_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:lament_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_mahogany_log.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_mahogany_log.json deleted file mode 100644 index 2c9b10a420..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_mahogany_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:stripped_mahogany_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:mahogany_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_mahogany_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_mahogany_wood.json deleted file mode 100644 index c07aa2a49b..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_mahogany_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:stripped_mahogany_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:mahogany_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_maple_log.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_maple_log.json deleted file mode 100644 index e6110edcf7..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_maple_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:stripped_maple_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:maple_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_maple_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_maple_wood.json deleted file mode 100644 index c5ba863802..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_maple_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:stripped_maple_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:maple_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_nightshade_log.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_nightshade_log.json deleted file mode 100644 index d059a6709b..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_nightshade_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:stripped_nightshade_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:nightshade_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_nightshade_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_nightshade_wood.json deleted file mode 100644 index 2f6e73d19b..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_nightshade_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:stripped_nightshade_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:nightshade_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_palm_log.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_palm_log.json deleted file mode 100644 index 2127276be4..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_palm_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:stripped_palm_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:palm_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_palm_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_palm_wood.json deleted file mode 100644 index c290027927..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_palm_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:stripped_palm_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:palm_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_pine_log.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_pine_log.json deleted file mode 100644 index e513a123de..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_pine_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:stripped_pine_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:pine_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_pine_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_pine_wood.json deleted file mode 100644 index fb67fe0cd7..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_pine_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:stripped_pine_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:pine_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_rainbow_eucalyptus_log.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_rainbow_eucalyptus_log.json deleted file mode 100644 index dd69ef7b0c..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_rainbow_eucalyptus_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:stripped_rainbow_eucalyptus_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:rainbow_eucalyptus_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_rainbow_eucalyptus_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_rainbow_eucalyptus_wood.json deleted file mode 100644 index 222e1e3bc8..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_rainbow_eucalyptus_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:stripped_rainbow_eucalyptus_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:rainbow_eucalyptus_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_redwood_log.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_redwood_log.json deleted file mode 100644 index c274d9971b..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_redwood_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:stripped_redwood_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:redwood_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_redwood_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_redwood_wood.json deleted file mode 100644 index f4f1e121ef..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_redwood_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:stripped_redwood_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:redwood_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_skyris_log.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_skyris_log.json deleted file mode 100644 index 4034a1c7b6..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_skyris_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:stripped_skyris_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:skyris_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_skyris_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_skyris_wood.json deleted file mode 100644 index 6b90fabf0e..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_skyris_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:stripped_skyris_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:skyris_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_willow_log.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_willow_log.json deleted file mode 100644 index 793ba2cc4c..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_willow_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:stripped_willow_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:willow_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_willow_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_willow_wood.json deleted file mode 100644 index 271fae9b28..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_willow_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:stripped_willow_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:willow_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_witch_hazel_log.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_witch_hazel_log.json deleted file mode 100644 index 8e0ef4f46a..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_witch_hazel_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:stripped_witch_hazel_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:witch_hazel_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_witch_hazel_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_witch_hazel_wood.json deleted file mode 100644 index 5f55d0b129..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_witch_hazel_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:stripped_witch_hazel_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:witch_hazel_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_zelkova_log.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_zelkova_log.json deleted file mode 100644 index 5d9890c3ea..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_zelkova_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:stripped_zelkova_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:zelkova_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_zelkova_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_zelkova_wood.json deleted file mode 100644 index cdb6c3031d..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/stripped_zelkova_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:stripped_zelkova_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "byg:zelkova_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/willow_log.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/willow_log.json deleted file mode 100644 index ae0353481a..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/willow_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:willow_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "byg:stripped_willow_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/willow_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/willow_wood.json deleted file mode 100644 index e5b0799584..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/willow_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:willow_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "byg:stripped_willow_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/witch_hazel_log.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/witch_hazel_log.json deleted file mode 100644 index 9170e87c7a..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/witch_hazel_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:witch_hazel_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "byg:stripped_witch_hazel_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/witch_hazel_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/witch_hazel_wood.json deleted file mode 100644 index 0c745044b4..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/witch_hazel_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:witch_hazel_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "byg:stripped_witch_hazel_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/zelkova_log.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/zelkova_log.json deleted file mode 100644 index 39f2bc7ed2..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/zelkova_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:zelkova_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "byg:stripped_zelkova_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/byg/zelkova_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/byg/zelkova_wood.json deleted file mode 100644 index 2b7f8fc9e6..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/byg/zelkova_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "byg" - } - ], - "ingredients": [ - { - "item": "byg:zelkova_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "byg:stripped_zelkova_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/ecologics/azalea_log.json b/src/generated/resources/data/create/recipes/cutting/compat/ecologics/azalea_log.json deleted file mode 100644 index 33dd82f5d6..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/ecologics/azalea_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "ecologics" - } - ], - "ingredients": [ - { - "item": "ecologics:azalea_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "ecologics:stripped_azalea_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/ecologics/azalea_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/ecologics/azalea_wood.json deleted file mode 100644 index 11d149a17d..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/ecologics/azalea_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "ecologics" - } - ], - "ingredients": [ - { - "item": "ecologics:azalea_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "ecologics:stripped_azalea_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/ecologics/coconut_log.json b/src/generated/resources/data/create/recipes/cutting/compat/ecologics/coconut_log.json deleted file mode 100644 index 01cb069601..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/ecologics/coconut_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "ecologics" - } - ], - "ingredients": [ - { - "item": "ecologics:coconut_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "ecologics:stripped_coconut_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/ecologics/coconut_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/ecologics/coconut_wood.json deleted file mode 100644 index a2d89906e0..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/ecologics/coconut_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "ecologics" - } - ], - "ingredients": [ - { - "item": "ecologics:coconut_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "ecologics:stripped_coconut_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/ecologics/flowering_azalea_log.json b/src/generated/resources/data/create/recipes/cutting/compat/ecologics/flowering_azalea_log.json deleted file mode 100644 index 92dd72d170..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/ecologics/flowering_azalea_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "ecologics" - } - ], - "ingredients": [ - { - "item": "ecologics:flowering_azalea_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "ecologics:stripped_azalea_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/ecologics/flowering_azalea_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/ecologics/flowering_azalea_wood.json deleted file mode 100644 index 083c7efb33..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/ecologics/flowering_azalea_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "ecologics" - } - ], - "ingredients": [ - { - "item": "ecologics:flowering_azalea_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "ecologics:stripped_azalea_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/ecologics/stripped_azalea_log.json b/src/generated/resources/data/create/recipes/cutting/compat/ecologics/stripped_azalea_log.json deleted file mode 100644 index b3f912a44f..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/ecologics/stripped_azalea_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "ecologics" - } - ], - "ingredients": [ - { - "item": "ecologics:stripped_azalea_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "ecologics:azalea_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/ecologics/stripped_azalea_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/ecologics/stripped_azalea_wood.json deleted file mode 100644 index 2b21a5ad0e..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/ecologics/stripped_azalea_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "ecologics" - } - ], - "ingredients": [ - { - "item": "ecologics:stripped_azalea_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "ecologics:azalea_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/ecologics/stripped_coconut_log.json b/src/generated/resources/data/create/recipes/cutting/compat/ecologics/stripped_coconut_log.json deleted file mode 100644 index e1f9ee5341..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/ecologics/stripped_coconut_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "ecologics" - } - ], - "ingredients": [ - { - "item": "ecologics:stripped_coconut_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "ecologics:coconut_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/ecologics/stripped_coconut_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/ecologics/stripped_coconut_wood.json deleted file mode 100644 index 5cd8b05da1..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/ecologics/stripped_coconut_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "ecologics" - } - ], - "ingredients": [ - { - "item": "ecologics:stripped_coconut_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "ecologics:coconut_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/ecologics/stripped_walnut_log.json b/src/generated/resources/data/create/recipes/cutting/compat/ecologics/stripped_walnut_log.json deleted file mode 100644 index f32e747d37..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/ecologics/stripped_walnut_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "ecologics" - } - ], - "ingredients": [ - { - "item": "ecologics:stripped_walnut_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "ecologics:walnut_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/ecologics/stripped_walnut_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/ecologics/stripped_walnut_wood.json deleted file mode 100644 index 15e0c23e75..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/ecologics/stripped_walnut_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "ecologics" - } - ], - "ingredients": [ - { - "item": "ecologics:stripped_walnut_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "ecologics:walnut_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/ecologics/walnut_log.json b/src/generated/resources/data/create/recipes/cutting/compat/ecologics/walnut_log.json deleted file mode 100644 index 77a1366aa3..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/ecologics/walnut_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "ecologics" - } - ], - "ingredients": [ - { - "item": "ecologics:walnut_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "ecologics:stripped_walnut_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/ecologics/walnut_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/ecologics/walnut_wood.json deleted file mode 100644 index b385aa9365..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/ecologics/walnut_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "ecologics" - } - ], - "ingredients": [ - { - "item": "ecologics:walnut_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "ecologics:stripped_walnut_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/endergetic/poise_stem.json b/src/generated/resources/data/create/recipes/cutting/compat/endergetic/poise_stem.json deleted file mode 100644 index 512a1a3b1f..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/endergetic/poise_stem.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "endergetic" - } - ], - "ingredients": [ - { - "item": "endergetic:poise_stem" - } - ], - "processingTime": 50, - "results": [ - { - "item": "endergetic:stripped_poise_stem" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/endergetic/stripped_poise_stem.json b/src/generated/resources/data/create/recipes/cutting/compat/endergetic/stripped_poise_stem.json deleted file mode 100644 index 2e7133393e..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/endergetic/stripped_poise_stem.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "endergetic" - } - ], - "ingredients": [ - { - "item": "endergetic:stripped_poise_stem" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "endergetic:poise_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/environmental/cherry_log.json b/src/generated/resources/data/create/recipes/cutting/compat/environmental/cherry_log.json deleted file mode 100644 index bda9bed091..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/environmental/cherry_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "environmental" - } - ], - "ingredients": [ - { - "item": "environmental:cherry_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "environmental:stripped_cherry_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/environmental/cherry_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/environmental/cherry_wood.json deleted file mode 100644 index 51f682484e..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/environmental/cherry_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "environmental" - } - ], - "ingredients": [ - { - "item": "environmental:cherry_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "environmental:stripped_cherry_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/environmental/stripped_cherry_log.json b/src/generated/resources/data/create/recipes/cutting/compat/environmental/stripped_cherry_log.json deleted file mode 100644 index 43d753bcfe..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/environmental/stripped_cherry_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "environmental" - } - ], - "ingredients": [ - { - "item": "environmental:stripped_cherry_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "environmental:cherry_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/environmental/stripped_cherry_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/environmental/stripped_cherry_wood.json deleted file mode 100644 index 887f1ef540..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/environmental/stripped_cherry_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "environmental" - } - ], - "ingredients": [ - { - "item": "environmental:stripped_cherry_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "environmental:cherry_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/environmental/stripped_willow_log.json b/src/generated/resources/data/create/recipes/cutting/compat/environmental/stripped_willow_log.json deleted file mode 100644 index e38effb695..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/environmental/stripped_willow_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "environmental" - } - ], - "ingredients": [ - { - "item": "environmental:stripped_willow_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "environmental:willow_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/environmental/stripped_willow_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/environmental/stripped_willow_wood.json deleted file mode 100644 index f326983c34..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/environmental/stripped_willow_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "environmental" - } - ], - "ingredients": [ - { - "item": "environmental:stripped_willow_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "environmental:willow_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/environmental/stripped_wisteria_log.json b/src/generated/resources/data/create/recipes/cutting/compat/environmental/stripped_wisteria_log.json deleted file mode 100644 index 27d94422b9..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/environmental/stripped_wisteria_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "environmental" - } - ], - "ingredients": [ - { - "item": "environmental:stripped_wisteria_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "environmental:wisteria_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/environmental/stripped_wisteria_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/environmental/stripped_wisteria_wood.json deleted file mode 100644 index 2a6b8a2338..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/environmental/stripped_wisteria_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "environmental" - } - ], - "ingredients": [ - { - "item": "environmental:stripped_wisteria_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "environmental:wisteria_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/environmental/willow_log.json b/src/generated/resources/data/create/recipes/cutting/compat/environmental/willow_log.json deleted file mode 100644 index 94404afcd0..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/environmental/willow_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "environmental" - } - ], - "ingredients": [ - { - "item": "environmental:willow_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "environmental:stripped_willow_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/environmental/willow_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/environmental/willow_wood.json deleted file mode 100644 index fde447308e..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/environmental/willow_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "environmental" - } - ], - "ingredients": [ - { - "item": "environmental:willow_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "environmental:stripped_willow_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/environmental/wisteria_log.json b/src/generated/resources/data/create/recipes/cutting/compat/environmental/wisteria_log.json deleted file mode 100644 index b5d06e6ffe..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/environmental/wisteria_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "environmental" - } - ], - "ingredients": [ - { - "item": "environmental:wisteria_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "environmental:stripped_wisteria_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/environmental/wisteria_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/environmental/wisteria_wood.json deleted file mode 100644 index 0ac29cdef9..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/environmental/wisteria_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "environmental" - } - ], - "ingredients": [ - { - "item": "environmental:wisteria_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "environmental:stripped_wisteria_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/forbidden_arcanus/aurum_log.json b/src/generated/resources/data/create/recipes/cutting/compat/forbidden_arcanus/aurum_log.json deleted file mode 100644 index c64a7f6231..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/forbidden_arcanus/aurum_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "forbidden_arcanus" - } - ], - "ingredients": [ - { - "item": "forbidden_arcanus:aurum_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "forbidden_arcanus:stripped_aurum_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/forbidden_arcanus/aurum_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/forbidden_arcanus/aurum_wood.json deleted file mode 100644 index d0bd2d0595..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/forbidden_arcanus/aurum_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "forbidden_arcanus" - } - ], - "ingredients": [ - { - "item": "forbidden_arcanus:aurum_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "forbidden_arcanus:stripped_aurum_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/forbidden_arcanus/stripped_aurum_log.json b/src/generated/resources/data/create/recipes/cutting/compat/forbidden_arcanus/stripped_aurum_log.json deleted file mode 100644 index 1d33c25579..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/forbidden_arcanus/stripped_aurum_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "forbidden_arcanus" - } - ], - "ingredients": [ - { - "item": "forbidden_arcanus:stripped_aurum_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "forbidden_arcanus:aurum_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/forbidden_arcanus/stripped_aurum_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/forbidden_arcanus/stripped_aurum_wood.json deleted file mode 100644 index ba72b3de8e..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/forbidden_arcanus/stripped_aurum_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "forbidden_arcanus" - } - ], - "ingredients": [ - { - "item": "forbidden_arcanus:stripped_aurum_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "forbidden_arcanus:aurum_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/goodending/cypress_log.json b/src/generated/resources/data/create/recipes/cutting/compat/goodending/cypress_log.json deleted file mode 100644 index 9bf7bae194..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/goodending/cypress_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "goodending" - } - ], - "ingredients": [ - { - "item": "goodending:cypress_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "goodending:stripped_cypress_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/goodending/cypress_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/goodending/cypress_wood.json deleted file mode 100644 index a79fd9ee4e..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/goodending/cypress_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "goodending" - } - ], - "ingredients": [ - { - "item": "goodending:cypress_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "goodending:stripped_cypress_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/goodending/muddy_oak_log.json b/src/generated/resources/data/create/recipes/cutting/compat/goodending/muddy_oak_log.json deleted file mode 100644 index f51850831e..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/goodending/muddy_oak_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "goodending" - } - ], - "ingredients": [ - { - "item": "goodending:muddy_oak_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "goodending:stripped_muddy_oak_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/goodending/muddy_oak_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/goodending/muddy_oak_wood.json deleted file mode 100644 index d4b59beafe..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/goodending/muddy_oak_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "goodending" - } - ], - "ingredients": [ - { - "item": "goodending:muddy_oak_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "goodending:stripped_muddy_oak_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/goodending/stripped_cypress_log.json b/src/generated/resources/data/create/recipes/cutting/compat/goodending/stripped_cypress_log.json deleted file mode 100644 index 9cf45d2bd6..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/goodending/stripped_cypress_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "goodending" - } - ], - "ingredients": [ - { - "item": "goodending:stripped_cypress_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "goodending:cypress_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/goodending/stripped_cypress_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/goodending/stripped_cypress_wood.json deleted file mode 100644 index 627e3bbbac..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/goodending/stripped_cypress_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "goodending" - } - ], - "ingredients": [ - { - "item": "goodending:stripped_cypress_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "goodending:cypress_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/goodending/stripped_muddy_oak_log.json b/src/generated/resources/data/create/recipes/cutting/compat/goodending/stripped_muddy_oak_log.json deleted file mode 100644 index b87c794689..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/goodending/stripped_muddy_oak_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "goodending" - } - ], - "ingredients": [ - { - "item": "goodending:stripped_muddy_oak_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "goodending:muddy_oak_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/goodending/stripped_muddy_oak_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/goodending/stripped_muddy_oak_wood.json deleted file mode 100644 index fa4e87410f..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/goodending/stripped_muddy_oak_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "goodending" - } - ], - "ingredients": [ - { - "item": "goodending:stripped_muddy_oak_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "goodending:muddy_oak_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/hexcasting/edified_log.json b/src/generated/resources/data/create/recipes/cutting/compat/hexcasting/edified_log.json deleted file mode 100644 index 2caaf5516d..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/hexcasting/edified_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "hexcasting" - } - ], - "ingredients": [ - { - "item": "hexcasting:edified_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "hexcasting:stripped_edified_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/hexcasting/edified_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/hexcasting/edified_wood.json deleted file mode 100644 index ccb3794265..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/hexcasting/edified_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "hexcasting" - } - ], - "ingredients": [ - { - "item": "hexcasting:edified_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "hexcasting:stripped_edified_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/hexcasting/stripped_edified_log.json b/src/generated/resources/data/create/recipes/cutting/compat/hexcasting/stripped_edified_log.json deleted file mode 100644 index 6dc80b52df..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/hexcasting/stripped_edified_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "hexcasting" - } - ], - "ingredients": [ - { - "item": "hexcasting:stripped_edified_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "hexcasting:edified_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/hexcasting/stripped_edified_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/hexcasting/stripped_edified_wood.json deleted file mode 100644 index 2757bd0c49..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/hexcasting/stripped_edified_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "hexcasting" - } - ], - "ingredients": [ - { - "item": "hexcasting:stripped_edified_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "hexcasting:edified_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/integrateddynamics/menril_log.json b/src/generated/resources/data/create/recipes/cutting/compat/integrateddynamics/menril_log.json deleted file mode 100644 index 58d743125c..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/integrateddynamics/menril_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "integrateddynamics" - } - ], - "ingredients": [ - { - "item": "integrateddynamics:menril_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "integrateddynamics:menril_log_stripped" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/integrateddynamics/menril_log_stripped.json b/src/generated/resources/data/create/recipes/cutting/compat/integrateddynamics/menril_log_stripped.json deleted file mode 100644 index b3ae38d0f5..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/integrateddynamics/menril_log_stripped.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "integrateddynamics" - } - ], - "ingredients": [ - { - "item": "integrateddynamics:menril_log_stripped" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "integrateddynamics:menril_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/integrateddynamics/menril_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/integrateddynamics/menril_wood.json deleted file mode 100644 index 09ede5a795..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/integrateddynamics/menril_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "integrateddynamics" - } - ], - "ingredients": [ - { - "item": "integrateddynamics:menril_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "integrateddynamics:menril_wood_stripped" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/integrateddynamics/menril_wood_stripped.json b/src/generated/resources/data/create/recipes/cutting/compat/integrateddynamics/menril_wood_stripped.json deleted file mode 100644 index 2fc49fd838..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/integrateddynamics/menril_wood_stripped.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "integrateddynamics" - } - ], - "ingredients": [ - { - "item": "integrateddynamics:menril_wood_stripped" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "integrateddynamics:menril_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/nethers_exoticism/jabuticaba_log.json b/src/generated/resources/data/create/recipes/cutting/compat/nethers_exoticism/jabuticaba_log.json deleted file mode 100644 index 67048eb060..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/nethers_exoticism/jabuticaba_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "nethers_exoticism" - } - ], - "ingredients": [ - { - "item": "nethers_exoticism:jabuticaba_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "nethers_exoticism:stripped_jabuticaba_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/nethers_exoticism/ramboutan_log.json b/src/generated/resources/data/create/recipes/cutting/compat/nethers_exoticism/ramboutan_log.json deleted file mode 100644 index ea9a148efc..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/nethers_exoticism/ramboutan_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "nethers_exoticism" - } - ], - "ingredients": [ - { - "item": "nethers_exoticism:ramboutan_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "nethers_exoticism:stripped_ramboutan_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/nethers_exoticism/ramboutan_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/nethers_exoticism/ramboutan_wood.json deleted file mode 100644 index 1f2c939275..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/nethers_exoticism/ramboutan_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "nethers_exoticism" - } - ], - "ingredients": [ - { - "item": "nethers_exoticism:ramboutan_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "nethers_exoticism:stripped_ramboutan_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/nethers_exoticism/stripped_jabuticaba_log.json b/src/generated/resources/data/create/recipes/cutting/compat/nethers_exoticism/stripped_jabuticaba_log.json deleted file mode 100644 index 39f83ac1f2..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/nethers_exoticism/stripped_jabuticaba_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "nethers_exoticism" - } - ], - "ingredients": [ - { - "item": "nethers_exoticism:stripped_jabuticaba_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "nethers_exoticism:jabuticaba_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/nethers_exoticism/stripped_ramboutan_log.json b/src/generated/resources/data/create/recipes/cutting/compat/nethers_exoticism/stripped_ramboutan_log.json deleted file mode 100644 index 5d070556c7..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/nethers_exoticism/stripped_ramboutan_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "nethers_exoticism" - } - ], - "ingredients": [ - { - "item": "nethers_exoticism:stripped_ramboutan_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "nethers_exoticism:ramboutan_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/nethers_exoticism/stripped_ramboutan_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/nethers_exoticism/stripped_ramboutan_wood.json deleted file mode 100644 index 4e27eacc95..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/nethers_exoticism/stripped_ramboutan_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "nethers_exoticism" - } - ], - "ingredients": [ - { - "item": "nethers_exoticism:stripped_ramboutan_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "nethers_exoticism:ramboutan_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/quark/ancient_log.json b/src/generated/resources/data/create/recipes/cutting/compat/quark/ancient_log.json deleted file mode 100644 index f8c7732a1c..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/quark/ancient_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "quark" - } - ], - "ingredients": [ - { - "item": "quark:ancient_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "quark:stripped_ancient_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/quark/ancient_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/quark/ancient_wood.json deleted file mode 100644 index 79654adb92..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/quark/ancient_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "quark" - } - ], - "ingredients": [ - { - "item": "quark:ancient_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "quark:stripped_ancient_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/quark/azalea_log.json b/src/generated/resources/data/create/recipes/cutting/compat/quark/azalea_log.json deleted file mode 100644 index 016d074acf..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/quark/azalea_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "quark" - } - ], - "ingredients": [ - { - "item": "quark:azalea_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "quark:stripped_azalea_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/quark/azalea_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/quark/azalea_wood.json deleted file mode 100644 index bba137f8dc..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/quark/azalea_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "quark" - } - ], - "ingredients": [ - { - "item": "quark:azalea_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "quark:stripped_azalea_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/quark/blossom_log.json b/src/generated/resources/data/create/recipes/cutting/compat/quark/blossom_log.json deleted file mode 100644 index 8a7bc6e8e6..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/quark/blossom_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "quark" - } - ], - "ingredients": [ - { - "item": "quark:blossom_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "quark:stripped_blossom_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/quark/blossom_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/quark/blossom_wood.json deleted file mode 100644 index ebd796db37..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/quark/blossom_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "quark" - } - ], - "ingredients": [ - { - "item": "quark:blossom_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "quark:stripped_blossom_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/quark/stripped_ancient_log.json b/src/generated/resources/data/create/recipes/cutting/compat/quark/stripped_ancient_log.json deleted file mode 100644 index 75de73d79e..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/quark/stripped_ancient_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "quark" - } - ], - "ingredients": [ - { - "item": "quark:stripped_ancient_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "quark:ancient_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/quark/stripped_ancient_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/quark/stripped_ancient_wood.json deleted file mode 100644 index 7cdcf9a09b..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/quark/stripped_ancient_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "quark" - } - ], - "ingredients": [ - { - "item": "quark:stripped_ancient_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "quark:ancient_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/quark/stripped_azalea_log.json b/src/generated/resources/data/create/recipes/cutting/compat/quark/stripped_azalea_log.json deleted file mode 100644 index f7276bef07..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/quark/stripped_azalea_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "quark" - } - ], - "ingredients": [ - { - "item": "quark:stripped_azalea_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "quark:azalea_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/quark/stripped_azalea_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/quark/stripped_azalea_wood.json deleted file mode 100644 index fc5ee7e387..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/quark/stripped_azalea_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "quark" - } - ], - "ingredients": [ - { - "item": "quark:stripped_azalea_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "quark:azalea_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/quark/stripped_blossom_log.json b/src/generated/resources/data/create/recipes/cutting/compat/quark/stripped_blossom_log.json deleted file mode 100644 index 5ae6d6b1fd..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/quark/stripped_blossom_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "quark" - } - ], - "ingredients": [ - { - "item": "quark:stripped_blossom_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "quark:blossom_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/quark/stripped_blossom_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/quark/stripped_blossom_wood.json deleted file mode 100644 index ec05738d80..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/quark/stripped_blossom_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "quark" - } - ], - "ingredients": [ - { - "item": "quark:stripped_blossom_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "quark:blossom_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/alpha_log.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/alpha_log.json deleted file mode 100644 index 3d04818d91..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/alpha_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:alpha_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "regions_unexplored:alpha_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/ashen_log.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/ashen_log.json deleted file mode 100644 index 9b9ccde889..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/ashen_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:ashen_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "regions_unexplored:stripped_dead_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/ashen_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/ashen_wood.json deleted file mode 100644 index 64268cea6e..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/ashen_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:ashen_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "regions_unexplored:stripped_dead_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/baobab_log.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/baobab_log.json deleted file mode 100644 index 9e5f04c458..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/baobab_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:baobab_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "regions_unexplored:stripped_baobab_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/baobab_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/baobab_wood.json deleted file mode 100644 index 034f89d1d0..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/baobab_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:baobab_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "regions_unexplored:stripped_baobab_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/blackwood_log.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/blackwood_log.json deleted file mode 100644 index 6c1b242780..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/blackwood_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:blackwood_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "regions_unexplored:stripped_blackwood_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/blackwood_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/blackwood_wood.json deleted file mode 100644 index d91cfe4e3a..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/blackwood_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:blackwood_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "regions_unexplored:stripped_blackwood_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/blue_bioshroom_hyphae.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/blue_bioshroom_hyphae.json deleted file mode 100644 index 0b3d52d45d..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/blue_bioshroom_hyphae.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:blue_bioshroom_hyphae" - } - ], - "processingTime": 50, - "results": [ - { - "item": "regions_unexplored:stripped_blue_bioshroom_hyphae" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/blue_bioshroom_stem.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/blue_bioshroom_stem.json deleted file mode 100644 index 7df03fde09..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/blue_bioshroom_stem.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:blue_bioshroom_stem" - } - ], - "processingTime": 50, - "results": [ - { - "item": "regions_unexplored:stripped_blue_bioshroom_stem" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/brimwood_log.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/brimwood_log.json deleted file mode 100644 index aa4e9ee8af..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/brimwood_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:brimwood_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "regions_unexplored:stripped_brimwood_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/brimwood_log_magma.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/brimwood_log_magma.json deleted file mode 100644 index 73bd278db8..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/brimwood_log_magma.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:brimwood_log_magma" - } - ], - "processingTime": 50, - "results": [ - { - "item": "regions_unexplored:stripped_brimwood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/brimwood_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/brimwood_wood.json deleted file mode 100644 index b36f4e44fc..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/brimwood_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:brimwood_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "regions_unexplored:stripped_brimwood_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/cobalt_log.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/cobalt_log.json deleted file mode 100644 index f5641872af..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/cobalt_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:cobalt_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "regions_unexplored:stripped_cobalt_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/cobalt_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/cobalt_wood.json deleted file mode 100644 index 5f96985fdf..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/cobalt_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:cobalt_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "regions_unexplored:stripped_cobalt_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/cypress_log.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/cypress_log.json deleted file mode 100644 index e50d931841..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/cypress_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:cypress_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "regions_unexplored:stripped_cypress_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/cypress_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/cypress_wood.json deleted file mode 100644 index a174c2e272..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/cypress_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:cypress_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "regions_unexplored:stripped_cypress_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/dead_log.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/dead_log.json deleted file mode 100644 index 4e4aba0c6a..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/dead_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:dead_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "regions_unexplored:stripped_dead_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/dead_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/dead_wood.json deleted file mode 100644 index f4332d2f5b..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/dead_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:dead_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "regions_unexplored:stripped_dead_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/eucalyptus_log.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/eucalyptus_log.json deleted file mode 100644 index 2dff2a3c45..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/eucalyptus_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:eucalyptus_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "regions_unexplored:stripped_eucalyptus_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/eucalyptus_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/eucalyptus_wood.json deleted file mode 100644 index ebdd4b7285..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/eucalyptus_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:eucalyptus_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "regions_unexplored:stripped_eucalyptus_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/green_bioshroom_hyphae.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/green_bioshroom_hyphae.json deleted file mode 100644 index 5641504577..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/green_bioshroom_hyphae.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:green_bioshroom_hyphae" - } - ], - "processingTime": 50, - "results": [ - { - "item": "regions_unexplored:stripped_green_bioshroom_hyphae" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/green_bioshroom_stem.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/green_bioshroom_stem.json deleted file mode 100644 index 234350483b..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/green_bioshroom_stem.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:green_bioshroom_stem" - } - ], - "processingTime": 50, - "results": [ - { - "item": "regions_unexplored:stripped_green_bioshroom_stem" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/joshua_log.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/joshua_log.json deleted file mode 100644 index 943136f337..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/joshua_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:joshua_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "regions_unexplored:stripped_joshua_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/joshua_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/joshua_wood.json deleted file mode 100644 index c574d98ae4..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/joshua_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:joshua_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "regions_unexplored:stripped_joshua_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/kapok_log.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/kapok_log.json deleted file mode 100644 index 348e470855..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/kapok_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:kapok_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "regions_unexplored:stripped_kapok_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/kapok_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/kapok_wood.json deleted file mode 100644 index 18e2c1e26d..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/kapok_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:kapok_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "regions_unexplored:stripped_kapok_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/larch_log.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/larch_log.json deleted file mode 100644 index 58907cf1a9..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/larch_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:larch_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "regions_unexplored:stripped_larch_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/larch_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/larch_wood.json deleted file mode 100644 index 33b9b29422..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/larch_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:larch_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "regions_unexplored:stripped_larch_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/magnolia_log.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/magnolia_log.json deleted file mode 100644 index 3cb32bcdd4..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/magnolia_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:magnolia_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "regions_unexplored:stripped_magnolia_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/magnolia_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/magnolia_wood.json deleted file mode 100644 index b5e032f811..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/magnolia_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:magnolia_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "regions_unexplored:stripped_magnolia_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/maple_log.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/maple_log.json deleted file mode 100644 index cdef2d2678..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/maple_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:maple_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "regions_unexplored:stripped_maple_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/maple_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/maple_wood.json deleted file mode 100644 index 05e1fd89be..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/maple_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:maple_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "regions_unexplored:stripped_maple_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/mauve_log.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/mauve_log.json deleted file mode 100644 index 1d0ac841d0..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/mauve_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:mauve_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "regions_unexplored:stripped_mauve_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/mauve_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/mauve_wood.json deleted file mode 100644 index 14b4dbd837..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/mauve_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:mauve_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "regions_unexplored:stripped_mauve_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/palm_log.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/palm_log.json deleted file mode 100644 index 922d92e8ed..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/palm_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:palm_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "regions_unexplored:stripped_palm_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/palm_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/palm_wood.json deleted file mode 100644 index 023a3ff258..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/palm_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:palm_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "regions_unexplored:stripped_palm_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/pine_log.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/pine_log.json deleted file mode 100644 index afcb9dc625..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/pine_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:pine_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "regions_unexplored:stripped_pine_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/pine_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/pine_wood.json deleted file mode 100644 index 6e288f7c23..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/pine_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:pine_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "regions_unexplored:stripped_pine_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/pink_bioshroom_hyphae.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/pink_bioshroom_hyphae.json deleted file mode 100644 index a5a5291adb..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/pink_bioshroom_hyphae.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:pink_bioshroom_hyphae" - } - ], - "processingTime": 50, - "results": [ - { - "item": "regions_unexplored:stripped_pink_bioshroom_hyphae" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/pink_bioshroom_stem.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/pink_bioshroom_stem.json deleted file mode 100644 index 19a098d281..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/pink_bioshroom_stem.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:pink_bioshroom_stem" - } - ], - "processingTime": 50, - "results": [ - { - "item": "regions_unexplored:stripped_pink_bioshroom_stem" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/redwood_log.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/redwood_log.json deleted file mode 100644 index 31008d1ed7..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/redwood_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:redwood_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "regions_unexplored:stripped_redwood_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/redwood_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/redwood_wood.json deleted file mode 100644 index c9c7162ddd..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/redwood_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:redwood_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "regions_unexplored:stripped_redwood_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/socotra_log.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/socotra_log.json deleted file mode 100644 index d22f1fd6b3..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/socotra_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:socotra_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "regions_unexplored:stripped_socotra_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/socotra_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/socotra_wood.json deleted file mode 100644 index 5327031226..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/socotra_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:socotra_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "regions_unexplored:stripped_socotra_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_baobab_log.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_baobab_log.json deleted file mode 100644 index 01b71b9e06..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_baobab_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:stripped_baobab_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "regions_unexplored:baobab_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_baobab_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_baobab_wood.json deleted file mode 100644 index 01bda3ec0b..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_baobab_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:stripped_baobab_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "regions_unexplored:baobab_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_blackwood_log.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_blackwood_log.json deleted file mode 100644 index 9a2d679f1e..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_blackwood_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:stripped_blackwood_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "regions_unexplored:blackwood_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_blackwood_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_blackwood_wood.json deleted file mode 100644 index 917489959b..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_blackwood_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:stripped_blackwood_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "regions_unexplored:blackwood_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_blue_bioshroom_hyphae.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_blue_bioshroom_hyphae.json deleted file mode 100644 index 844eaa8c20..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_blue_bioshroom_hyphae.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:stripped_blue_bioshroom_hyphae" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "regions_unexplored:blue_bioshroom_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_blue_bioshroom_stem.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_blue_bioshroom_stem.json deleted file mode 100644 index 855ce4cd59..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_blue_bioshroom_stem.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:stripped_blue_bioshroom_stem" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "regions_unexplored:blue_bioshroom_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_brimwood_log.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_brimwood_log.json deleted file mode 100644 index 314a6de49b..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_brimwood_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:stripped_brimwood_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "regions_unexplored:brimwood_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_brimwood_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_brimwood_wood.json deleted file mode 100644 index e98b1096fd..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_brimwood_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:stripped_brimwood_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "regions_unexplored:brimwood_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_cobalt_log.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_cobalt_log.json deleted file mode 100644 index 2d90168d8f..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_cobalt_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:stripped_cobalt_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "regions_unexplored:cobalt_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_cobalt_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_cobalt_wood.json deleted file mode 100644 index a77efb06ba..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_cobalt_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:stripped_cobalt_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "regions_unexplored:cobalt_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_cypress_log.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_cypress_log.json deleted file mode 100644 index 1e77886df1..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_cypress_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:stripped_cypress_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "regions_unexplored:cypress_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_cypress_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_cypress_wood.json deleted file mode 100644 index caf0f65cd3..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_cypress_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:stripped_cypress_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "regions_unexplored:cypress_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_dead_log.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_dead_log.json deleted file mode 100644 index c7361c156c..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_dead_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:stripped_dead_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "regions_unexplored:dead_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_dead_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_dead_wood.json deleted file mode 100644 index c36ee981ad..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_dead_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:stripped_dead_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "regions_unexplored:dead_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_eucalyptus_log.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_eucalyptus_log.json deleted file mode 100644 index e74e93eb2b..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_eucalyptus_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:stripped_eucalyptus_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "regions_unexplored:eucalyptus_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_eucalyptus_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_eucalyptus_wood.json deleted file mode 100644 index 118682cd15..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_eucalyptus_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:stripped_eucalyptus_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "regions_unexplored:eucalyptus_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_green_bioshroom_hyphae.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_green_bioshroom_hyphae.json deleted file mode 100644 index 636f61ba23..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_green_bioshroom_hyphae.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:stripped_green_bioshroom_hyphae" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "regions_unexplored:green_bioshroom_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_green_bioshroom_stem.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_green_bioshroom_stem.json deleted file mode 100644 index d39b9c4c90..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_green_bioshroom_stem.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:stripped_green_bioshroom_stem" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "regions_unexplored:green_bioshroom_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_joshua_log.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_joshua_log.json deleted file mode 100644 index 96f010d62d..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_joshua_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:stripped_joshua_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "regions_unexplored:joshua_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_joshua_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_joshua_wood.json deleted file mode 100644 index 117837e722..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_joshua_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:stripped_joshua_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "regions_unexplored:joshua_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_kapok_log.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_kapok_log.json deleted file mode 100644 index b315cd0df9..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_kapok_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:stripped_kapok_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "regions_unexplored:kapok_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_kapok_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_kapok_wood.json deleted file mode 100644 index 32714d2e26..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_kapok_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:stripped_kapok_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "regions_unexplored:kapok_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_larch_log.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_larch_log.json deleted file mode 100644 index f877366642..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_larch_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:stripped_larch_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "regions_unexplored:larch_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_larch_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_larch_wood.json deleted file mode 100644 index ec88a46692..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_larch_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:stripped_larch_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "regions_unexplored:larch_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_magnolia_log.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_magnolia_log.json deleted file mode 100644 index 66d70dbba9..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_magnolia_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:stripped_magnolia_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "regions_unexplored:magnolia_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_magnolia_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_magnolia_wood.json deleted file mode 100644 index c7e3952d38..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_magnolia_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:stripped_magnolia_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "regions_unexplored:magnolia_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_maple_log.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_maple_log.json deleted file mode 100644 index de7f7a4cc4..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_maple_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:stripped_maple_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "regions_unexplored:maple_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_maple_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_maple_wood.json deleted file mode 100644 index e619940c25..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_maple_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:stripped_maple_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "regions_unexplored:maple_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_mauve_log.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_mauve_log.json deleted file mode 100644 index 9eea85ca82..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_mauve_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:stripped_mauve_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "regions_unexplored:mauve_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_mauve_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_mauve_wood.json deleted file mode 100644 index fb1ac0903b..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_mauve_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:stripped_mauve_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "regions_unexplored:mauve_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_palm_log.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_palm_log.json deleted file mode 100644 index 94f43d9a98..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_palm_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:stripped_palm_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "regions_unexplored:palm_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_palm_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_palm_wood.json deleted file mode 100644 index 67c9c53097..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_palm_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:stripped_palm_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "regions_unexplored:palm_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_pine_log.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_pine_log.json deleted file mode 100644 index 8fdf7ffba4..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_pine_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:stripped_pine_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "regions_unexplored:pine_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_pine_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_pine_wood.json deleted file mode 100644 index 046785afb0..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_pine_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:stripped_pine_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "regions_unexplored:pine_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_pink_bioshroom_hyphae.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_pink_bioshroom_hyphae.json deleted file mode 100644 index f40e22a958..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_pink_bioshroom_hyphae.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:stripped_pink_bioshroom_hyphae" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "regions_unexplored:pink_bioshroom_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_pink_bioshroom_stem.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_pink_bioshroom_stem.json deleted file mode 100644 index d04fec2404..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_pink_bioshroom_stem.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:stripped_pink_bioshroom_stem" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "regions_unexplored:pink_bioshroom_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_redwood_log.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_redwood_log.json deleted file mode 100644 index 04125ad336..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_redwood_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:stripped_redwood_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "regions_unexplored:redwood_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_redwood_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_redwood_wood.json deleted file mode 100644 index 326f0a86fd..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_redwood_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:stripped_redwood_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "regions_unexplored:redwood_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_socotra_log.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_socotra_log.json deleted file mode 100644 index eed513e95a..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_socotra_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:stripped_socotra_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "regions_unexplored:socotra_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_socotra_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_socotra_wood.json deleted file mode 100644 index 7d82d94839..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_socotra_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:stripped_socotra_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "regions_unexplored:socotra_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_willow_log.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_willow_log.json deleted file mode 100644 index c86252926b..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_willow_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:stripped_willow_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "regions_unexplored:willow_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_willow_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_willow_wood.json deleted file mode 100644 index 09554a5075..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_willow_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:stripped_willow_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "regions_unexplored:willow_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_yellow_bioshroom_hyphae.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_yellow_bioshroom_hyphae.json deleted file mode 100644 index b9d2efd2ef..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_yellow_bioshroom_hyphae.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:stripped_yellow_bioshroom_hyphae" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "regions_unexplored:yellow_bioshroom_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_yellow_bioshroom_stem.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_yellow_bioshroom_stem.json deleted file mode 100644 index ef5af31c2b..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/stripped_yellow_bioshroom_stem.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:stripped_yellow_bioshroom_stem" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "regions_unexplored:yellow_bioshroom_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/willow_log.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/willow_log.json deleted file mode 100644 index 2b368bc077..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/willow_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:willow_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "regions_unexplored:stripped_willow_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/willow_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/willow_wood.json deleted file mode 100644 index 1ccced84f4..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/willow_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:willow_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "regions_unexplored:stripped_willow_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/yellow_bioshroom_hyphae.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/yellow_bioshroom_hyphae.json deleted file mode 100644 index 17320770fe..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/yellow_bioshroom_hyphae.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:yellow_bioshroom_hyphae" - } - ], - "processingTime": 50, - "results": [ - { - "item": "regions_unexplored:stripped_yellow_bioshroom_hyphae" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/yellow_bioshroom_stem.json b/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/yellow_bioshroom_stem.json deleted file mode 100644 index 75ff49841f..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/regions_unexplored/yellow_bioshroom_stem.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "regions_unexplored" - } - ], - "ingredients": [ - { - "item": "regions_unexplored:yellow_bioshroom_stem" - } - ], - "processingTime": 50, - "results": [ - { - "item": "regions_unexplored:stripped_yellow_bioshroom_stem" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/silentgear/netherwood_log.json b/src/generated/resources/data/create/recipes/cutting/compat/silentgear/netherwood_log.json deleted file mode 100644 index 3186af2426..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/silentgear/netherwood_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "silentgear" - } - ], - "ingredients": [ - { - "item": "silentgear:netherwood_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "silentgear:stripped_netherwood_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/silentgear/netherwood_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/silentgear/netherwood_wood.json deleted file mode 100644 index 375090f72d..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/silentgear/netherwood_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "silentgear" - } - ], - "ingredients": [ - { - "item": "silentgear:netherwood_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "silentgear:stripped_netherwood_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/silentgear/stripped_netherwood_log.json b/src/generated/resources/data/create/recipes/cutting/compat/silentgear/stripped_netherwood_log.json deleted file mode 100644 index 17aa616812..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/silentgear/stripped_netherwood_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "silentgear" - } - ], - "ingredients": [ - { - "item": "silentgear:stripped_netherwood_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "silentgear:netherwood_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/silentgear/stripped_netherwood_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/silentgear/stripped_netherwood_wood.json deleted file mode 100644 index c52fc33de5..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/silentgear/stripped_netherwood_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "silentgear" - } - ], - "ingredients": [ - { - "item": "silentgear:stripped_netherwood_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "silentgear:netherwood_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/tconstruct/bloodshroom_log.json b/src/generated/resources/data/create/recipes/cutting/compat/tconstruct/bloodshroom_log.json deleted file mode 100644 index e6464015c8..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/tconstruct/bloodshroom_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "tconstruct" - } - ], - "ingredients": [ - { - "item": "tconstruct:bloodshroom_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "tconstruct:stripped_bloodshroom_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/tconstruct/bloodshroom_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/tconstruct/bloodshroom_wood.json deleted file mode 100644 index e4cbfd9178..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/tconstruct/bloodshroom_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "tconstruct" - } - ], - "ingredients": [ - { - "item": "tconstruct:bloodshroom_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "tconstruct:stripped_bloodshroom_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/tconstruct/greenheart_log.json b/src/generated/resources/data/create/recipes/cutting/compat/tconstruct/greenheart_log.json deleted file mode 100644 index 7bfb20b446..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/tconstruct/greenheart_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "tconstruct" - } - ], - "ingredients": [ - { - "item": "tconstruct:greenheart_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "tconstruct:stripped_greenheart_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/tconstruct/greenheart_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/tconstruct/greenheart_wood.json deleted file mode 100644 index a85deb49f4..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/tconstruct/greenheart_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "tconstruct" - } - ], - "ingredients": [ - { - "item": "tconstruct:greenheart_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "tconstruct:stripped_greenheart_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/tconstruct/skyroot_log.json b/src/generated/resources/data/create/recipes/cutting/compat/tconstruct/skyroot_log.json deleted file mode 100644 index 8e5f3943aa..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/tconstruct/skyroot_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "tconstruct" - } - ], - "ingredients": [ - { - "item": "tconstruct:skyroot_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "tconstruct:stripped_skyroot_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/tconstruct/skyroot_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/tconstruct/skyroot_wood.json deleted file mode 100644 index ee4a40d2ba..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/tconstruct/skyroot_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "tconstruct" - } - ], - "ingredients": [ - { - "item": "tconstruct:skyroot_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "tconstruct:stripped_skyroot_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/tconstruct/stripped_bloodshroom_log.json b/src/generated/resources/data/create/recipes/cutting/compat/tconstruct/stripped_bloodshroom_log.json deleted file mode 100644 index 533a17f146..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/tconstruct/stripped_bloodshroom_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "tconstruct" - } - ], - "ingredients": [ - { - "item": "tconstruct:stripped_bloodshroom_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "tconstruct:bloodshroom_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/tconstruct/stripped_bloodshroom_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/tconstruct/stripped_bloodshroom_wood.json deleted file mode 100644 index a617bc9078..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/tconstruct/stripped_bloodshroom_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "tconstruct" - } - ], - "ingredients": [ - { - "item": "tconstruct:stripped_bloodshroom_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "tconstruct:bloodshroom_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/tconstruct/stripped_greenheart_log.json b/src/generated/resources/data/create/recipes/cutting/compat/tconstruct/stripped_greenheart_log.json deleted file mode 100644 index a0aecfa9df..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/tconstruct/stripped_greenheart_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "tconstruct" - } - ], - "ingredients": [ - { - "item": "tconstruct:stripped_greenheart_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "tconstruct:greenheart_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/tconstruct/stripped_greenheart_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/tconstruct/stripped_greenheart_wood.json deleted file mode 100644 index 50ecd35181..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/tconstruct/stripped_greenheart_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "tconstruct" - } - ], - "ingredients": [ - { - "item": "tconstruct:stripped_greenheart_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "tconstruct:greenheart_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/tconstruct/stripped_skyroot_log.json b/src/generated/resources/data/create/recipes/cutting/compat/tconstruct/stripped_skyroot_log.json deleted file mode 100644 index 4a77a6619f..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/tconstruct/stripped_skyroot_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "tconstruct" - } - ], - "ingredients": [ - { - "item": "tconstruct:stripped_skyroot_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "tconstruct:skyroot_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/tconstruct/stripped_skyroot_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/tconstruct/stripped_skyroot_wood.json deleted file mode 100644 index b19bb73aa2..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/tconstruct/stripped_skyroot_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "tconstruct" - } - ], - "ingredients": [ - { - "item": "tconstruct:stripped_skyroot_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "tconstruct:skyroot_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/the_vault/chromatic_log.json b/src/generated/resources/data/create/recipes/cutting/compat/the_vault/chromatic_log.json deleted file mode 100644 index a78141a809..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/the_vault/chromatic_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "the_vault" - } - ], - "ingredients": [ - { - "item": "the_vault:chromatic_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "the_vault:stripped_chromatic_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/the_vault/driftwood_log.json b/src/generated/resources/data/create/recipes/cutting/compat/the_vault/driftwood_log.json deleted file mode 100644 index 32604c3dcf..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/the_vault/driftwood_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "the_vault" - } - ], - "ingredients": [ - { - "item": "the_vault:driftwood_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "the_vault:stripped_driftwood_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/the_vault/overgrown_wooden_log.json b/src/generated/resources/data/create/recipes/cutting/compat/the_vault/overgrown_wooden_log.json deleted file mode 100644 index 2f920cc0f8..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/the_vault/overgrown_wooden_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "the_vault" - } - ], - "ingredients": [ - { - "item": "the_vault:overgrown_wooden_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "the_vault:stripped_overgrown_wooden_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/the_vault/stripped_chromatic_log.json b/src/generated/resources/data/create/recipes/cutting/compat/the_vault/stripped_chromatic_log.json deleted file mode 100644 index 6f2a23b239..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/the_vault/stripped_chromatic_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "the_vault" - } - ], - "ingredients": [ - { - "item": "the_vault:stripped_chromatic_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 4, - "item": "the_vault:chromatic_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/the_vault/stripped_driftwood_log.json b/src/generated/resources/data/create/recipes/cutting/compat/the_vault/stripped_driftwood_log.json deleted file mode 100644 index 801f599b0d..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/the_vault/stripped_driftwood_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "the_vault" - } - ], - "ingredients": [ - { - "item": "the_vault:stripped_driftwood_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 4, - "item": "the_vault:driftwood_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/the_vault/stripped_overgrown_wooden_log.json b/src/generated/resources/data/create/recipes/cutting/compat/the_vault/stripped_overgrown_wooden_log.json deleted file mode 100644 index 22849dec92..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/the_vault/stripped_overgrown_wooden_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "the_vault" - } - ], - "ingredients": [ - { - "item": "the_vault:stripped_overgrown_wooden_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 4, - "item": "the_vault:overgrown_wooden_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/the_vault/stripped_wooden_log.json b/src/generated/resources/data/create/recipes/cutting/compat/the_vault/stripped_wooden_log.json deleted file mode 100644 index 16e1b02316..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/the_vault/stripped_wooden_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "the_vault" - } - ], - "ingredients": [ - { - "item": "the_vault:stripped_wooden_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 4, - "item": "the_vault:wooden_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/the_vault/wooden_log.json b/src/generated/resources/data/create/recipes/cutting/compat/the_vault/wooden_log.json deleted file mode 100644 index afc355e096..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/the_vault/wooden_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "the_vault" - } - ], - "ingredients": [ - { - "item": "the_vault:wooden_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "the_vault:stripped_wooden_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/canopy_log.json b/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/canopy_log.json deleted file mode 100644 index 4579174595..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/canopy_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "twilightforest" - } - ], - "ingredients": [ - { - "item": "twilightforest:canopy_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "twilightforest:stripped_canopy_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/canopy_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/canopy_wood.json deleted file mode 100644 index 72091dde87..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/canopy_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "twilightforest" - } - ], - "ingredients": [ - { - "item": "twilightforest:canopy_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "twilightforest:stripped_canopy_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/dark_log.json b/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/dark_log.json deleted file mode 100644 index ee9a643903..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/dark_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "twilightforest" - } - ], - "ingredients": [ - { - "item": "twilightforest:dark_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "twilightforest:stripped_dark_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/dark_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/dark_wood.json deleted file mode 100644 index 97f5cd0790..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/dark_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "twilightforest" - } - ], - "ingredients": [ - { - "item": "twilightforest:dark_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "twilightforest:stripped_dark_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/mangrove_log.json b/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/mangrove_log.json deleted file mode 100644 index 4f111257f1..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/mangrove_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "twilightforest" - } - ], - "ingredients": [ - { - "item": "twilightforest:mangrove_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "twilightforest:stripped_mangrove_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/mangrove_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/mangrove_wood.json deleted file mode 100644 index 3f08971bef..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/mangrove_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "twilightforest" - } - ], - "ingredients": [ - { - "item": "twilightforest:mangrove_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "twilightforest:stripped_mangrove_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/mining_log.json b/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/mining_log.json deleted file mode 100644 index d4765bc65c..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/mining_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "twilightforest" - } - ], - "ingredients": [ - { - "item": "twilightforest:mining_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "twilightforest:stripped_mining_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/mining_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/mining_wood.json deleted file mode 100644 index 17c5ba4a8e..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/mining_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "twilightforest" - } - ], - "ingredients": [ - { - "item": "twilightforest:mining_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "twilightforest:stripped_mining_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/sorting_log.json b/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/sorting_log.json deleted file mode 100644 index bb622c9edc..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/sorting_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "twilightforest" - } - ], - "ingredients": [ - { - "item": "twilightforest:sorting_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "twilightforest:stripped_sorting_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/sorting_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/sorting_wood.json deleted file mode 100644 index 1510ed2e84..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/sorting_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "twilightforest" - } - ], - "ingredients": [ - { - "item": "twilightforest:sorting_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "twilightforest:stripped_sorting_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_canopy_log.json b/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_canopy_log.json deleted file mode 100644 index 7aa4f32fd3..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_canopy_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "twilightforest" - } - ], - "ingredients": [ - { - "item": "twilightforest:stripped_canopy_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "twilightforest:canopy_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_canopy_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_canopy_wood.json deleted file mode 100644 index 8869d89135..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_canopy_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "twilightforest" - } - ], - "ingredients": [ - { - "item": "twilightforest:stripped_canopy_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "twilightforest:canopy_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_dark_log.json b/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_dark_log.json deleted file mode 100644 index 1fd4679e48..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_dark_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "twilightforest" - } - ], - "ingredients": [ - { - "item": "twilightforest:stripped_dark_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "twilightforest:dark_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_dark_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_dark_wood.json deleted file mode 100644 index c177affed6..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_dark_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "twilightforest" - } - ], - "ingredients": [ - { - "item": "twilightforest:stripped_dark_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "twilightforest:dark_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_mangrove_log.json b/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_mangrove_log.json deleted file mode 100644 index 9643574c29..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_mangrove_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "twilightforest" - } - ], - "ingredients": [ - { - "item": "twilightforest:stripped_mangrove_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "twilightforest:mangrove_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_mangrove_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_mangrove_wood.json deleted file mode 100644 index 108a00a422..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_mangrove_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "twilightforest" - } - ], - "ingredients": [ - { - "item": "twilightforest:stripped_mangrove_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "twilightforest:mangrove_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_mining_log.json b/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_mining_log.json deleted file mode 100644 index 42c8cd84b1..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_mining_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "twilightforest" - } - ], - "ingredients": [ - { - "item": "twilightforest:stripped_mining_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "twilightforest:mining_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_mining_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_mining_wood.json deleted file mode 100644 index 91ee2ff568..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_mining_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "twilightforest" - } - ], - "ingredients": [ - { - "item": "twilightforest:stripped_mining_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "twilightforest:mining_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_sorting_log.json b/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_sorting_log.json deleted file mode 100644 index 1ad0b02926..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_sorting_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "twilightforest" - } - ], - "ingredients": [ - { - "item": "twilightforest:stripped_sorting_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "twilightforest:sorting_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_sorting_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_sorting_wood.json deleted file mode 100644 index 08898a47bb..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_sorting_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "twilightforest" - } - ], - "ingredients": [ - { - "item": "twilightforest:stripped_sorting_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "twilightforest:sorting_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_time_log.json b/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_time_log.json deleted file mode 100644 index 084bf94eb0..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_time_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "twilightforest" - } - ], - "ingredients": [ - { - "item": "twilightforest:stripped_time_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "twilightforest:time_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_time_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_time_wood.json deleted file mode 100644 index 4e10fe9a98..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_time_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "twilightforest" - } - ], - "ingredients": [ - { - "item": "twilightforest:stripped_time_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "twilightforest:time_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_transformation_log.json b/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_transformation_log.json deleted file mode 100644 index 9cb7472504..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_transformation_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "twilightforest" - } - ], - "ingredients": [ - { - "item": "twilightforest:stripped_transformation_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "twilightforest:transformation_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_transformation_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_transformation_wood.json deleted file mode 100644 index 2a205236f6..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_transformation_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "twilightforest" - } - ], - "ingredients": [ - { - "item": "twilightforest:stripped_transformation_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "twilightforest:transformation_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_twilight_oak_log.json b/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_twilight_oak_log.json deleted file mode 100644 index 793d8b76ea..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_twilight_oak_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "twilightforest" - } - ], - "ingredients": [ - { - "item": "twilightforest:stripped_twilight_oak_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "twilightforest:twilight_oak_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_twilight_oak_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_twilight_oak_wood.json deleted file mode 100644 index a3ddb2fa30..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/stripped_twilight_oak_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "twilightforest" - } - ], - "ingredients": [ - { - "item": "twilightforest:stripped_twilight_oak_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "twilightforest:twilight_oak_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/time_log.json b/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/time_log.json deleted file mode 100644 index 05fef47890..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/time_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "twilightforest" - } - ], - "ingredients": [ - { - "item": "twilightforest:time_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "twilightforest:stripped_time_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/time_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/time_wood.json deleted file mode 100644 index c9f3d20e6c..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/time_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "twilightforest" - } - ], - "ingredients": [ - { - "item": "twilightforest:time_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "twilightforest:stripped_time_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/transformation_log.json b/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/transformation_log.json deleted file mode 100644 index 11c7ae694e..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/transformation_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "twilightforest" - } - ], - "ingredients": [ - { - "item": "twilightforest:transformation_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "twilightforest:stripped_transformation_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/transformation_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/transformation_wood.json deleted file mode 100644 index e17c52aae4..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/transformation_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "twilightforest" - } - ], - "ingredients": [ - { - "item": "twilightforest:transformation_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "twilightforest:stripped_transformation_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/twilight_oak_log.json b/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/twilight_oak_log.json deleted file mode 100644 index 40ec9a7775..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/twilight_oak_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "twilightforest" - } - ], - "ingredients": [ - { - "item": "twilightforest:twilight_oak_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "twilightforest:stripped_twilight_oak_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/twilight_oak_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/twilight_oak_wood.json deleted file mode 100644 index 07d815e465..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/twilightforest/twilight_oak_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "twilightforest" - } - ], - "ingredients": [ - { - "item": "twilightforest:twilight_oak_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "twilightforest:stripped_twilight_oak_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/upgrade_aquatic/driftwood.json b/src/generated/resources/data/create/recipes/cutting/compat/upgrade_aquatic/driftwood.json deleted file mode 100644 index 8c3cd6348b..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/upgrade_aquatic/driftwood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "upgrade_aquatic" - } - ], - "ingredients": [ - { - "item": "upgrade_aquatic:driftwood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "upgrade_aquatic:stripped_driftwood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/upgrade_aquatic/driftwood_log.json b/src/generated/resources/data/create/recipes/cutting/compat/upgrade_aquatic/driftwood_log.json deleted file mode 100644 index d8860f677f..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/upgrade_aquatic/driftwood_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "upgrade_aquatic" - } - ], - "ingredients": [ - { - "item": "upgrade_aquatic:driftwood_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "upgrade_aquatic:stripped_driftwood_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/upgrade_aquatic/river_log.json b/src/generated/resources/data/create/recipes/cutting/compat/upgrade_aquatic/river_log.json deleted file mode 100644 index 08073a48fe..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/upgrade_aquatic/river_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "upgrade_aquatic" - } - ], - "ingredients": [ - { - "item": "upgrade_aquatic:river_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "upgrade_aquatic:stripped_river_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/upgrade_aquatic/river_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/upgrade_aquatic/river_wood.json deleted file mode 100644 index 2b5f0b892f..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/upgrade_aquatic/river_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "upgrade_aquatic" - } - ], - "ingredients": [ - { - "item": "upgrade_aquatic:river_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "upgrade_aquatic:stripped_river_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/upgrade_aquatic/stripped_driftwood.json b/src/generated/resources/data/create/recipes/cutting/compat/upgrade_aquatic/stripped_driftwood.json deleted file mode 100644 index 85a92d2b39..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/upgrade_aquatic/stripped_driftwood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "upgrade_aquatic" - } - ], - "ingredients": [ - { - "item": "upgrade_aquatic:stripped_driftwood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "upgrade_aquatic:driftwood_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/upgrade_aquatic/stripped_driftwood_log.json b/src/generated/resources/data/create/recipes/cutting/compat/upgrade_aquatic/stripped_driftwood_log.json deleted file mode 100644 index 61e26e351d..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/upgrade_aquatic/stripped_driftwood_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "upgrade_aquatic" - } - ], - "ingredients": [ - { - "item": "upgrade_aquatic:stripped_driftwood_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "upgrade_aquatic:driftwood_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/upgrade_aquatic/stripped_river_log.json b/src/generated/resources/data/create/recipes/cutting/compat/upgrade_aquatic/stripped_river_log.json deleted file mode 100644 index 6f79119606..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/upgrade_aquatic/stripped_river_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "upgrade_aquatic" - } - ], - "ingredients": [ - { - "item": "upgrade_aquatic:stripped_river_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "upgrade_aquatic:river_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/upgrade_aquatic/stripped_river_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/upgrade_aquatic/stripped_river_wood.json deleted file mode 100644 index 7ae737510d..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/upgrade_aquatic/stripped_river_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "upgrade_aquatic" - } - ], - "ingredients": [ - { - "item": "upgrade_aquatic:stripped_river_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "upgrade_aquatic:river_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/windswept/chestnut_log.json b/src/generated/resources/data/create/recipes/cutting/compat/windswept/chestnut_log.json deleted file mode 100644 index ec333925e7..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/windswept/chestnut_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "windswept" - } - ], - "ingredients": [ - { - "item": "windswept:chestnut_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "windswept:stripped_chestnut_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/windswept/chestnut_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/windswept/chestnut_wood.json deleted file mode 100644 index 965afa048f..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/windswept/chestnut_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "windswept" - } - ], - "ingredients": [ - { - "item": "windswept:chestnut_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "windswept:stripped_chestnut_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/windswept/holly_log.json b/src/generated/resources/data/create/recipes/cutting/compat/windswept/holly_log.json deleted file mode 100644 index 65e94f9382..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/windswept/holly_log.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "windswept" - } - ], - "ingredients": [ - { - "item": "windswept:holly_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "windswept:stripped_holly_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/windswept/holly_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/windswept/holly_wood.json deleted file mode 100644 index a82a608d40..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/windswept/holly_wood.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "windswept" - } - ], - "ingredients": [ - { - "item": "windswept:holly_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "windswept:stripped_holly_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/windswept/stripped_chestnut_log.json b/src/generated/resources/data/create/recipes/cutting/compat/windswept/stripped_chestnut_log.json deleted file mode 100644 index 01780d0c08..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/windswept/stripped_chestnut_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "windswept" - } - ], - "ingredients": [ - { - "item": "windswept:stripped_chestnut_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "windswept:chestnut_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/windswept/stripped_chestnut_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/windswept/stripped_chestnut_wood.json deleted file mode 100644 index d37badef6f..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/windswept/stripped_chestnut_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "windswept" - } - ], - "ingredients": [ - { - "item": "windswept:stripped_chestnut_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "windswept:chestnut_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/windswept/stripped_holly_log.json b/src/generated/resources/data/create/recipes/cutting/compat/windswept/stripped_holly_log.json deleted file mode 100644 index 167c4f8507..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/windswept/stripped_holly_log.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "windswept" - } - ], - "ingredients": [ - { - "item": "windswept:stripped_holly_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "windswept:holly_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/compat/windswept/stripped_holly_wood.json b/src/generated/resources/data/create/recipes/cutting/compat/windswept/stripped_holly_wood.json deleted file mode 100644 index 316c524efd..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/compat/windswept/stripped_holly_wood.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:cutting", - "conditions": [ - { - "type": "forge:mod_loaded", - "modid": "windswept" - } - ], - "ingredients": [ - { - "item": "windswept:stripped_holly_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "windswept:holly_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/crimson_hyphae.json b/src/generated/resources/data/create/recipes/cutting/crimson_hyphae.json deleted file mode 100644 index b21c061783..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/crimson_hyphae.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:crimson_hyphae" - } - ], - "processingTime": 50, - "results": [ - { - "item": "minecraft:stripped_crimson_hyphae" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/crimson_stem.json b/src/generated/resources/data/create/recipes/cutting/crimson_stem.json deleted file mode 100644 index 1b01540571..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/crimson_stem.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:crimson_stem" - } - ], - "processingTime": 50, - "results": [ - { - "item": "minecraft:stripped_crimson_stem" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/dark_oak_log.json b/src/generated/resources/data/create/recipes/cutting/dark_oak_log.json deleted file mode 100644 index f487973f98..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/dark_oak_log.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:dark_oak_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "minecraft:stripped_dark_oak_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/dark_oak_wood.json b/src/generated/resources/data/create/recipes/cutting/dark_oak_wood.json deleted file mode 100644 index d427cd9762..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/dark_oak_wood.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:dark_oak_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "minecraft:stripped_dark_oak_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/jungle_log.json b/src/generated/resources/data/create/recipes/cutting/jungle_log.json deleted file mode 100644 index 4b50fd5396..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/jungle_log.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:jungle_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "minecraft:stripped_jungle_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/jungle_wood.json b/src/generated/resources/data/create/recipes/cutting/jungle_wood.json deleted file mode 100644 index 3192c1488e..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/jungle_wood.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:jungle_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "minecraft:stripped_jungle_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/mangrove_log.json b/src/generated/resources/data/create/recipes/cutting/mangrove_log.json deleted file mode 100644 index a21afe6e5a..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/mangrove_log.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:mangrove_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "minecraft:stripped_mangrove_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/mangrove_wood.json b/src/generated/resources/data/create/recipes/cutting/mangrove_wood.json deleted file mode 100644 index 63f7a1e9c2..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/mangrove_wood.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:mangrove_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "minecraft:stripped_mangrove_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/oak_log.json b/src/generated/resources/data/create/recipes/cutting/oak_log.json deleted file mode 100644 index 7b144262c4..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/oak_log.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:oak_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "minecraft:stripped_oak_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/oak_wood.json b/src/generated/resources/data/create/recipes/cutting/oak_wood.json deleted file mode 100644 index 67e805f35e..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/oak_wood.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:oak_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "minecraft:stripped_oak_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/spruce_log.json b/src/generated/resources/data/create/recipes/cutting/spruce_log.json deleted file mode 100644 index c3d2404e81..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/spruce_log.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:spruce_log" - } - ], - "processingTime": 50, - "results": [ - { - "item": "minecraft:stripped_spruce_log" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/spruce_wood.json b/src/generated/resources/data/create/recipes/cutting/spruce_wood.json deleted file mode 100644 index dc51b9db76..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/spruce_wood.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:spruce_wood" - } - ], - "processingTime": 50, - "results": [ - { - "item": "minecraft:stripped_spruce_wood" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/stripped_acacia_log.json b/src/generated/resources/data/create/recipes/cutting/stripped_acacia_log.json deleted file mode 100644 index ec91b0d934..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/stripped_acacia_log.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:stripped_acacia_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "minecraft:acacia_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/stripped_acacia_wood.json b/src/generated/resources/data/create/recipes/cutting/stripped_acacia_wood.json deleted file mode 100644 index a70d781848..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/stripped_acacia_wood.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:stripped_acacia_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "minecraft:acacia_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/stripped_birch_log.json b/src/generated/resources/data/create/recipes/cutting/stripped_birch_log.json deleted file mode 100644 index 600ac2e8e9..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/stripped_birch_log.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:stripped_birch_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "minecraft:birch_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/stripped_birch_wood.json b/src/generated/resources/data/create/recipes/cutting/stripped_birch_wood.json deleted file mode 100644 index 573f915ab2..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/stripped_birch_wood.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:stripped_birch_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "minecraft:birch_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/stripped_cherry_log.json b/src/generated/resources/data/create/recipes/cutting/stripped_cherry_log.json deleted file mode 100644 index a18f6116ba..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/stripped_cherry_log.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:stripped_cherry_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "minecraft:cherry_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/stripped_cherry_wood.json b/src/generated/resources/data/create/recipes/cutting/stripped_cherry_wood.json deleted file mode 100644 index 03ed47cfdc..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/stripped_cherry_wood.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:stripped_cherry_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "minecraft:cherry_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/stripped_crimson_hyphae.json b/src/generated/resources/data/create/recipes/cutting/stripped_crimson_hyphae.json deleted file mode 100644 index 4de07e2ab8..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/stripped_crimson_hyphae.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:stripped_crimson_hyphae" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "minecraft:crimson_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/stripped_crimson_stem.json b/src/generated/resources/data/create/recipes/cutting/stripped_crimson_stem.json deleted file mode 100644 index 8398ebb1a0..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/stripped_crimson_stem.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:stripped_crimson_stem" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "minecraft:crimson_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/stripped_dark_oak_log.json b/src/generated/resources/data/create/recipes/cutting/stripped_dark_oak_log.json deleted file mode 100644 index 6776a3694f..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/stripped_dark_oak_log.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:stripped_dark_oak_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "minecraft:dark_oak_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/stripped_dark_oak_wood.json b/src/generated/resources/data/create/recipes/cutting/stripped_dark_oak_wood.json deleted file mode 100644 index a2c28047df..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/stripped_dark_oak_wood.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:stripped_dark_oak_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "minecraft:dark_oak_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/stripped_jungle_log.json b/src/generated/resources/data/create/recipes/cutting/stripped_jungle_log.json deleted file mode 100644 index b6ba3bbf8a..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/stripped_jungle_log.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:stripped_jungle_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "minecraft:jungle_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/stripped_jungle_wood.json b/src/generated/resources/data/create/recipes/cutting/stripped_jungle_wood.json deleted file mode 100644 index 49c81da966..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/stripped_jungle_wood.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:stripped_jungle_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "minecraft:jungle_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/stripped_mangrove_log.json b/src/generated/resources/data/create/recipes/cutting/stripped_mangrove_log.json deleted file mode 100644 index 753258cb3b..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/stripped_mangrove_log.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:stripped_mangrove_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "minecraft:mangrove_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/stripped_mangrove_wood.json b/src/generated/resources/data/create/recipes/cutting/stripped_mangrove_wood.json deleted file mode 100644 index 99c6cc88c1..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/stripped_mangrove_wood.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:stripped_mangrove_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "minecraft:mangrove_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/stripped_oak_log.json b/src/generated/resources/data/create/recipes/cutting/stripped_oak_log.json deleted file mode 100644 index a76c5db55b..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/stripped_oak_log.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:stripped_oak_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "minecraft:oak_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/stripped_oak_wood.json b/src/generated/resources/data/create/recipes/cutting/stripped_oak_wood.json deleted file mode 100644 index 9e9f35a301..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/stripped_oak_wood.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:stripped_oak_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "minecraft:oak_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/stripped_spruce_log.json b/src/generated/resources/data/create/recipes/cutting/stripped_spruce_log.json deleted file mode 100644 index 8e986bdb9c..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/stripped_spruce_log.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:stripped_spruce_log" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "minecraft:spruce_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/stripped_spruce_wood.json b/src/generated/resources/data/create/recipes/cutting/stripped_spruce_wood.json deleted file mode 100644 index 34e0ba2354..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/stripped_spruce_wood.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:stripped_spruce_wood" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "minecraft:spruce_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/stripped_warped_hyphae.json b/src/generated/resources/data/create/recipes/cutting/stripped_warped_hyphae.json deleted file mode 100644 index 6e01df1272..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/stripped_warped_hyphae.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:stripped_warped_hyphae" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "minecraft:warped_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/stripped_warped_stem.json b/src/generated/resources/data/create/recipes/cutting/stripped_warped_stem.json deleted file mode 100644 index cbdc4026bb..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/stripped_warped_stem.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:stripped_warped_stem" - } - ], - "processingTime": 50, - "results": [ - { - "count": 6, - "item": "minecraft:warped_planks" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/warped_hyphae.json b/src/generated/resources/data/create/recipes/cutting/warped_hyphae.json deleted file mode 100644 index 0f8519d621..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/warped_hyphae.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:warped_hyphae" - } - ], - "processingTime": 50, - "results": [ - { - "item": "minecraft:stripped_warped_hyphae" - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/cutting/warped_stem.json b/src/generated/resources/data/create/recipes/cutting/warped_stem.json deleted file mode 100644 index da21a0e47e..0000000000 --- a/src/generated/resources/data/create/recipes/cutting/warped_stem.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "create:cutting", - "ingredients": [ - { - "item": "minecraft:warped_stem" - } - ], - "processingTime": 50, - "results": [ - { - "item": "minecraft:stripped_warped_stem" - } - ] -} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java b/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java index 39d36d8672..ed2b71594a 100644 --- a/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java +++ b/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java @@ -235,15 +235,6 @@ public class CreateJEI implements IModPlugin { .emptyBackground(177, 70) .build("block_cutting", BlockCuttingCategory::new), - woodCutting = builder(CondensedBlockCuttingRecipe.class) - .enableIf(c -> c.allowWoodcuttingOnSaw.get() && ModList.get() - .isLoaded("druidcraft")) - .addRecipes(() -> BlockCuttingCategory.condenseRecipes(getTypedRecipesExcluding(SawBlockEntity.woodcuttingRecipeType.get(), AllRecipeTypes::shouldIgnoreInAutomation))) - .catalyst(AllBlocks.MECHANICAL_SAW::get) - .doubleItemIcon(AllBlocks.MECHANICAL_SAW.get(), Items.OAK_STAIRS) - .emptyBackground(177, 70) - .build("wood_cutting", BlockCuttingCategory::new), - polishing = builder(SandPaperPolishingRecipe.class) .addTypedRecipes(AllRecipeTypes.SANDPAPER_POLISHING) .catalyst(AllItems.SAND_PAPER::get) diff --git a/src/main/java/com/simibubi/create/content/kinetics/saw/SawBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/saw/SawBlockEntity.java index d7ea5f3d6e..07ee8bc5b2 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/saw/SawBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/saw/SawBlockEntity.java @@ -329,7 +329,7 @@ public class SawBlockEntity extends BlockBreakingKineticBlockEntity { private void applyRecipe() { ItemStack input = inventory.getStackInSlot(0); List list = new ArrayList<>(); - + if (PackageItem.isPackage(input)) { inventory.clear(); ItemStackHandler results = PackageItem.getContents(input); @@ -342,7 +342,7 @@ public class SawBlockEntity extends BlockBreakingKineticBlockEntity { inventory.setStackInSlot(slot + 1, list.get(slot)); return; } - + List> recipes = getRecipes(); if (recipes.isEmpty()) return; @@ -382,8 +382,7 @@ public class SawBlockEntity extends BlockBreakingKineticBlockEntity { return ImmutableList.of(assemblyRecipe.get()); Predicate> types = RecipeConditions.isOfType(AllRecipeTypes.CUTTING.getType(), - AllConfigs.server().recipes.allowStonecuttingOnSaw.get() ? RecipeType.STONECUTTING : null, - AllConfigs.server().recipes.allowWoodcuttingOnSaw.get() ? woodcuttingRecipeType.get() : null); + AllConfigs.server().recipes.allowStonecuttingOnSaw.get() ? RecipeType.STONECUTTING : null); List> startedSearch = RecipeFinder.get(cuttingRecipesKey, level, types); return startedSearch.stream() diff --git a/src/main/java/com/simibubi/create/content/processing/recipe/ProcessingRecipeBuilder.java b/src/main/java/com/simibubi/create/content/processing/recipe/ProcessingRecipeBuilder.java index c22170339d..669edf031f 100644 --- a/src/main/java/com/simibubi/create/content/processing/recipe/ProcessingRecipeBuilder.java +++ b/src/main/java/com/simibubi/create/content/processing/recipe/ProcessingRecipeBuilder.java @@ -31,12 +31,13 @@ import net.minecraftforge.common.crafting.conditions.NotCondition; import net.minecraftforge.fluids.FluidStack; public class ProcessingRecipeBuilder> { - + protected ResourceLocation recipeId; protected ProcessingRecipeFactory factory; protected ProcessingRecipeParams params; protected List recipeConditions; public ProcessingRecipeBuilder(ProcessingRecipeFactory factory, ResourceLocation recipeId) { + this.recipeId = recipeId; params = new ProcessingRecipeParams(recipeId); recipeConditions = new ArrayList<>(); this.factory = factory; @@ -170,6 +171,10 @@ public class ProcessingRecipeBuilder> { return output(new ProcessingOutput(Pair.of(mod.asResource(id), amount), chance)); } + public ProcessingRecipeBuilder output(ResourceLocation id) { + return output(1, id, 1); + } + public ProcessingRecipeBuilder output(Mods mod, String id) { return output(1, mod.asResource(id), 1); } diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/CuttingRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/CuttingRecipeGen.java index 21c3551425..7323fc08ed 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/CuttingRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/CuttingRecipeGen.java @@ -13,35 +13,12 @@ import net.minecraft.world.level.block.Blocks; public class CuttingRecipeGen extends ProcessingRecipeGen { GeneratedRecipe - - ANDESITE_ALLOY = create(I::andesiteAlloy, b -> b.duration(200) - .output(AllBlocks.SHAFT.get(), 6)), + ANDESITE_ALLOY = create(I::andesiteAlloy, b -> b.duration(200) + .output(AllBlocks.SHAFT.get(), 6)), BAMBOO_PLANKS = create(() -> Blocks.BAMBOO_PLANKS, b -> b.duration(20) .output(Blocks.BAMBOO_MOSAIC, 1)), - - OAK_WOOD = stripAndMakePlanks(Blocks.OAK_WOOD, Blocks.STRIPPED_OAK_WOOD, Blocks.OAK_PLANKS), - SPRUCE_WOOD = stripAndMakePlanks(Blocks.SPRUCE_WOOD, Blocks.STRIPPED_SPRUCE_WOOD, Blocks.SPRUCE_PLANKS), - BIRCH_WOOD = stripAndMakePlanks(Blocks.BIRCH_WOOD, Blocks.STRIPPED_BIRCH_WOOD, Blocks.BIRCH_PLANKS), - JUNGLE_WOOD = stripAndMakePlanks(Blocks.JUNGLE_WOOD, Blocks.STRIPPED_JUNGLE_WOOD, Blocks.JUNGLE_PLANKS), - ACACIA_WOOD = stripAndMakePlanks(Blocks.ACACIA_WOOD, Blocks.STRIPPED_ACACIA_WOOD, Blocks.ACACIA_PLANKS), - CHERRY_WOOD = stripAndMakePlanks(Blocks.CHERRY_WOOD, Blocks.STRIPPED_CHERRY_WOOD, Blocks.CHERRY_PLANKS), - DARK_OAK_WOOD = stripAndMakePlanks(Blocks.DARK_OAK_WOOD, Blocks.STRIPPED_DARK_OAK_WOOD, Blocks.DARK_OAK_PLANKS), - MANGROVE_WOOD = stripAndMakePlanks(Blocks.MANGROVE_WOOD, Blocks.STRIPPED_MANGROVE_WOOD, Blocks.MANGROVE_PLANKS), - CRIMSON_WOOD = stripAndMakePlanks(Blocks.CRIMSON_HYPHAE, Blocks.STRIPPED_CRIMSON_HYPHAE, Blocks.CRIMSON_PLANKS), - WARPED_WOOD = stripAndMakePlanks(Blocks.WARPED_HYPHAE, Blocks.STRIPPED_WARPED_HYPHAE, Blocks.WARPED_PLANKS), - - OAK_LOG = stripAndMakePlanks(Blocks.OAK_LOG, Blocks.STRIPPED_OAK_LOG, Blocks.OAK_PLANKS), - SPRUCE_LOG = stripAndMakePlanks(Blocks.SPRUCE_LOG, Blocks.STRIPPED_SPRUCE_LOG, Blocks.SPRUCE_PLANKS), - BIRCH_LOG = stripAndMakePlanks(Blocks.BIRCH_LOG, Blocks.STRIPPED_BIRCH_LOG, Blocks.BIRCH_PLANKS), - JUNGLE_LOG = stripAndMakePlanks(Blocks.JUNGLE_LOG, Blocks.STRIPPED_JUNGLE_LOG, Blocks.JUNGLE_PLANKS), - ACACIA_LOG = stripAndMakePlanks(Blocks.ACACIA_LOG, Blocks.STRIPPED_ACACIA_LOG, Blocks.ACACIA_PLANKS), - CHERRY_LOG = stripAndMakePlanks(Blocks.CHERRY_LOG, Blocks.STRIPPED_CHERRY_LOG, Blocks.CHERRY_PLANKS), - DARK_OAK_LOG = stripAndMakePlanks(Blocks.DARK_OAK_LOG, Blocks.STRIPPED_DARK_OAK_LOG, Blocks.DARK_OAK_PLANKS), - MANGROVE_LOG = stripAndMakePlanks(Blocks.MANGROVE_LOG, Blocks.STRIPPED_MANGROVE_LOG, Blocks.MANGROVE_PLANKS), BAMBOO_BLOCK = stripAndMakePlanks(Blocks.BAMBOO_BLOCK, Blocks.STRIPPED_BAMBOO_BLOCK, Blocks.BAMBOO_PLANKS, 3), - CRIMSON_LOG = stripAndMakePlanks(Blocks.CRIMSON_STEM, Blocks.STRIPPED_CRIMSON_STEM, Blocks.CRIMSON_PLANKS), - WARPED_LOG = stripAndMakePlanks(Blocks.WARPED_STEM, Blocks.STRIPPED_WARPED_STEM, Blocks.WARPED_PLANKS), /* * Mod compat @@ -50,122 +27,9 @@ public class CuttingRecipeGen extends ProcessingRecipeGen { // Ars Nouveau (all logs yield the same plank) ARS_N = cuttingCompat(Mods.ARS_N, "blue_archwood", "purple_archwood", "green_archwood", "red_archwood"), - // Botania (stripped prefix is offset) - BTN = cuttingCompat(Mods.BTN, "livingwood", "dreamwood"), - BTN_2 = stripAndMakePlanks(Mods.BTN, "glimmering_livingwood_log", "glimmering_stripped_livingwood_log", - "livingwood_planks"), - BTN_3 = stripAndMakePlanks(Mods.BTN, "glimmering_livingwood", "glimmering_stripped_livingwood", - "livingwood_planks"), - BTN_4 = stripAndMakePlanks(Mods.BTN, "glimmering_dreamwood_log", "glimmering_stripped_dreamwood_log", - "dreamwood_planks"), - BTN_5 = - stripAndMakePlanks(Mods.BTN, "glimmering_dreamwood", "glimmering_stripped_dreamwood", "dreamwood_planks"), - - // Forbidden Arcanus - FA = cuttingCompat(Mods.FA, "aurum"), - - // Hexcasting (stripped is a suffix here) - HEX = cuttingCompat(Mods.HEX, "edified"), - - // Integrated Dynamics (stripped is a suffix here also) - ID = cuttingCompat(Mods.ID, "menril"), - - // Oh The Biomes You'll Go - BYG = - cuttingCompat(Mods.BYG, "aspen", "baobab", "blue_enchanted", "cika", "cypress", "ebony", "ether", - "fir", "green_enchanted", "holly", "jacaranda", "lament", "mahogany", "maple", "nightshade", - "palm", "pine", "rainbow_eucalyptus", "redwood", "skyris", "willow", "witch_hazel", "zelkova"), - BYG_2 = stripAndMakePlanks(Mods.BYG, "bulbis_stem", "stripped_bulbis_stem", "bulbis_planks"), - BYG_3 = stripAndMakePlanks(Mods.BYG, "bulbis_wood", "stripped_bulbis_wood", "bulbis_planks"), - BYG_4 = stripAndMakePlanks(Mods.BYG, null, "imparius_stem", "imparius_planks"), - BYG_5 = stripAndMakePlanks(Mods.BYG, null, "imparius_hyphae", "imparius_planks"), - BYG_6 = stripAndMakePlanks(Mods.BYG, null, "fungal_imparius_stem", "imparius_planks"), - BYG_7 = stripAndMakePlanks(Mods.BYG, null, "fungal_imparius_hyphae", "imparius_planks"), - BYG_8 = stripAndMakePlanks(Mods.BYG, "palo_verde_log", "stripped_palo_verde_log", null), - BYG_9 = stripAndMakePlanks(Mods.BYG, "palo_verde_wood", "stripped_palo_verde_wood", null), - - // Silent Gear - SG = cuttingCompat(Mods.SG, "netherwood"), - - // Twilight Forest - TF = cuttingCompat(Mods.TF, "twilight_oak", "canopy", "mangrove", "dark", "time", "transformation", "mining", - "sorting"), - - // Tinkers Construct - TIC = cuttingCompat(Mods.TIC, "greenheart", "skyroot", "bloodshroom"), - - // Architects palette - AP = cuttingCompat(Mods.AP, "twisted"), - - // Quark - Q = cuttingCompat(Mods.Q, "azalea", "blossom", "ancient"), - - // Ecologics - ECO = cuttingCompat(Mods.ECO, "coconut", "walnut", "azalea"), - ECO_2 = stripAndMakePlanks(Mods.ECO, "flowering_azalea_log", "stripped_azalea_log", null), - ECO_3 = stripAndMakePlanks(Mods.ECO, "flowering_azalea_wood", "stripped_azalea_wood", null), - - // Biomes O' Plenty - BOP = cuttingCompat(Mods.BOP, "fir", "redwood", "mahogany", "jacaranda", "palm", "willow", "dead", - "magic", "umbran", "hellbark"), - - // Blue Skies (crystallized does not have stripped variants) - BSK = cuttingCompat(Mods.BSK, "bluebright", "starlit", "frostbright", "lunar", "dusk", "maple"), - BSK_2 = stripAndMakePlanks(Mods.BSK, null, "crystallized_log", "crystallized_planks"), - BSK_3 = stripAndMakePlanks(Mods.BSK, null, "crystallized_wood", "crystallized_planks"), - - // Atmospheric - ATM = cuttingCompat(Mods.ATM, "aspen", "kousa", "yucca", "morado"), - ATM_2 = stripAndMakePlanks(Mods.ATM, "grimwood", "stripped_grimwood", "grimwood_planks"), - ATM_3 = stripAndMakePlanks(Mods.ATM, "rosewood", "stripped_rosewood", "rosewood_planks"), - ATM_4 = cuttingCompatLogOnly(Mods.ATM, "grimwood", "rosewood"), - - // Autumnity - AUTUM = cuttingCompat(Mods.AUTUM, "maple"), - AUTUM_2 = stripAndMakePlanks(Mods.AUTUM, "sappy_maple_wood", "sappy_maple_log", "maple_planks"), - - // Endergetic - ENDERGETIC = stripAndMakePlanks(Mods.ENDER, "poise_stem", "stripped_poise_stem", "poise_planks"), - - // Upgrade Aquatic - UA = cuttingCompat(Mods.UA, "river"), - UA_2 = stripAndMakePlanks(Mods.UA, "driftwood", "stripped_driftwood", "driftwood_planks"), - UA_3 = cuttingCompatLogOnly(Mods.UA, "driftwood"), - - //Vault Hunters - VH = cuttingCompatLogOnly(Mods.VH, "wooden", "overgrown_wooden", "driftwood", "chromatic"), - - // Nether's Exoticism - NE = cuttingCompat(Mods.NE, "ramboutan"), // This actually errors until they fix their id typo - NE_2 = cuttingCompatLogOnly(Mods.NE, "jabuticaba"), - // Regions Unexplored - RU = cuttingCompat(Mods.RU, "baobab", "blackwood", "brimwood", "cobalt", "cypress", "dead", "eucalyptus", "joshua", - "kapok", "larch", "magnolia", "maple","mauve", "palm", "pine", "redwood", "socotra", "willow"), - RU_2 = stripAndMakePlanks(Mods.RU, "blue_bioshroom_stem", "stripped_blue_bioshroom_stem", "blue_bioshroom_planks"), - RU_3 = stripAndMakePlanks(Mods.RU, "blue_bioshroom_hyphae", "stripped_blue_bioshroom_hyphae", "blue_bioshroom_planks"), - RU_4 = stripAndMakePlanks(Mods.RU, "green_bioshroom_stem", "stripped_green_bioshroom_stem", "green_bioshroom_planks"), - RU_5 = stripAndMakePlanks(Mods.RU, "green_bioshroom_hyphae", "stripped_green_bioshroom_hyphae", "green_bioshroom_planks"), - RU_6 = stripAndMakePlanks(Mods.RU, "pink_bioshroom_stem", "stripped_pink_bioshroom_stem", "pink_bioshroom_planks"), - RU_7 = stripAndMakePlanks(Mods.RU, "pink_bioshroom_hyphae", "stripped_pink_bioshroom_hyphae", "pink_bioshroom_planks"), - RU_8 = stripAndMakePlanks(Mods.RU, "yellow_bioshroom_stem", "stripped_yellow_bioshroom_stem", "yellow_bioshroom_planks"), - RU_9 = stripAndMakePlanks(Mods.RU, "yellow_bioshroom_hyphae", "stripped_yellow_bioshroom_hyphae", "yellow_bioshroom_planks"), - RU_10 = stripAndMakePlanks(Mods.RU, null, "alpha_log", "alpha_planks"), - RU_11 = stripAndMakePlanks(Mods.RU, "brimwood_log_magma", "stripped_brimwood", null), - RU_12 = stripAndMakePlanks(Mods.RU, "ashen_log", "stripped_dead_log", null), - RU_13 = stripAndMakePlanks(Mods.RU, "ashen_wood", "stripped_dead_wood", null), RU_14 = stripOnlyDiffModId(Mods.RU, "silver_birch_log", Mods.MC, "stripped_birch_log"), - RU_15 = stripOnlyDiffModId(Mods.RU, "silver_birch_wood", Mods.MC, "stripped_birch_wood"), - - // Environmental - ENV = cuttingCompat(Mods.ENV, "willow", "cherry", "wisteria"), - - // Windswept - WSP = cuttingCompat(Mods.WSP, "holly", "chestnut"), - - // Good Ending - GOOD = cuttingCompat(Mods.GOOD, "muddy_oak", "cypress") - + RU_15 = stripOnlyDiffModId(Mods.RU, "silver_birch_wood", Mods.MC, "stripped_birch_wood") ; GeneratedRecipe stripAndMakePlanks(Block wood, Block stripped, Block planks) { diff --git a/src/main/java/com/simibubi/create/foundation/events/CommonEvents.java b/src/main/java/com/simibubi/create/foundation/events/CommonEvents.java index 5999f879cd..33b778150f 100644 --- a/src/main/java/com/simibubi/create/foundation/events/CommonEvents.java +++ b/src/main/java/com/simibubi/create/foundation/events/CommonEvents.java @@ -16,8 +16,11 @@ import com.simibubi.create.content.kinetics.chainConveyor.ServerChainConveyorHan import com.simibubi.create.content.kinetics.drill.CobbleGenOptimisation; import com.simibubi.create.content.redstone.link.controller.LinkedControllerServerHandler; import com.simibubi.create.content.trains.entity.CarriageEntityHandler; -import com.simibubi.create.foundation.ModFilePackResources; +import com.simibubi.create.foundation.pack.DynamicPack; +import com.simibubi.create.foundation.pack.DynamicPackSource; +import com.simibubi.create.foundation.pack.ModFilePackResources; import com.simibubi.create.foundation.recipe.RecipeFinder; +import com.simibubi.create.foundation.recipe.RuntimeDataGenerator; import com.simibubi.create.foundation.utility.ServerSpeedProvider; import com.simibubi.create.foundation.utility.TickBasedCache; import com.simibubi.create.infrastructure.command.AllCommands; @@ -223,6 +226,12 @@ public class CommonEvents { } }); } + + if (event.getPackType() == PackType.SERVER_DATA) { + DynamicPack dynamicPack = new DynamicPack("create:dynamic_data", PackType.SERVER_DATA); + RuntimeDataGenerator.insertIntoPack(dynamicPack); + event.addRepositorySource(new DynamicPackSource("create:dynamic_data", PackType.SERVER_DATA, Pack.Position.BOTTOM, dynamicPack)); + } } } } diff --git a/src/main/java/com/simibubi/create/foundation/pack/DynamicPack.java b/src/main/java/com/simibubi/create/foundation/pack/DynamicPack.java new file mode 100644 index 0000000000..9863dd85e9 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/pack/DynamicPack.java @@ -0,0 +1,116 @@ +package com.simibubi.create.foundation.pack; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import com.google.gson.JsonElement; +import com.simibubi.create.Create; + +import net.minecraft.SharedConstants; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.PackResources; +import net.minecraft.server.packs.PackType; +import net.minecraft.server.packs.metadata.MetadataSectionSerializer; +import net.minecraft.server.packs.metadata.pack.PackMetadataSection; +import net.minecraft.server.packs.resources.IoSupplier; + +// TODO - Move into catnip +public class DynamicPack implements PackResources { + private final Map> files = new HashMap<>(); + + private final String packId; + private final PackType packType; + private final PackMetadataSection metadata; + + public DynamicPack(String packId, PackType packType) { + this.packId = packId; + this.packType = packType; + + metadata = new PackMetadataSection(Component.empty(), SharedConstants.getCurrentVersion().getPackVersion(packType)); + } + + private static String getPath(PackType packType, ResourceLocation resourceLocation) { + return packType.getDirectory() + "/" + resourceLocation.getNamespace() + "/" + resourceLocation.getPath(); + } + + public DynamicPack put(ResourceLocation location, IoSupplier stream) { + files.put(getPath(packType, location), stream); + return this; + } + + public DynamicPack put(ResourceLocation location, byte[] bytes) { + return put(location, () -> new ByteArrayInputStream(bytes)); + } + + public DynamicPack put(ResourceLocation location, String string) { + return put(location, string.getBytes(StandardCharsets.UTF_8)); + } + + // Automatically suffixes the ResourceLocation with .json + public DynamicPack put(ResourceLocation location, JsonElement json) { + return put(location.withSuffix(".json"), Create.GSON.toJson(json)); + } + + @Override + public @Nullable IoSupplier getRootResource(String @NotNull ... elements) { + return files.getOrDefault(String.join("/", elements), null); + } + + @Override + public @Nullable IoSupplier getResource(@NotNull PackType packType, @NotNull ResourceLocation resourceLocation) { + return files.getOrDefault(getPath(packType, resourceLocation), null); + } + + @Override + public void listResources(@NotNull PackType packType, @NotNull String namespace, @NotNull String path, @NotNull ResourceOutput resourceOutput) { + ResourceLocation resourceLocation = new ResourceLocation(namespace, path); + String directoryAndNamespace = packType.getDirectory() + "/" + namespace + "/"; + String prefix = directoryAndNamespace + path + "/"; + files.forEach((filePath, streamSupplier) -> { + if (filePath.startsWith(prefix)) + resourceOutput.accept(resourceLocation.withPath(filePath.substring(directoryAndNamespace.length())), streamSupplier); + }); + } + + @Override + public @NotNull Set getNamespaces(PackType packType) { + Set namespaces = new HashSet<>(); + String dir = packType.getDirectory() + "/"; + + for (String path : files.keySet()) { + if (path.startsWith(dir)) { + String relative = path.substring(dir.length()); + if (relative.contains("/")) { + namespaces.add(relative.substring(0, relative.indexOf("/"))); + } + } + } + + return namespaces; + } + + @SuppressWarnings("unchecked") + @Override + public @Nullable T getMetadataSection(@NotNull MetadataSectionSerializer deserializer) throws IOException { + return deserializer == PackMetadataSection.TYPE ? (T) metadata : null; + } + + @Override + public @NotNull String packId() { + return packId; + } + + @Override + public void close() { + } // NO-OP +} diff --git a/src/main/java/com/simibubi/create/foundation/pack/DynamicPackSource.java b/src/main/java/com/simibubi/create/foundation/pack/DynamicPackSource.java new file mode 100644 index 0000000000..43f737b3cf --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/pack/DynamicPackSource.java @@ -0,0 +1,21 @@ +package com.simibubi.create.foundation.pack; + +import java.util.function.Consumer; + +import org.jetbrains.annotations.NotNull; + +import net.minecraft.network.chat.Component; +import net.minecraft.server.packs.PackResources; +import net.minecraft.server.packs.PackType; +import net.minecraft.server.packs.repository.Pack; +import net.minecraft.server.packs.repository.PackSource; +import net.minecraft.server.packs.repository.RepositorySource; + +// TODO - Move into catnip +public record DynamicPackSource(String packId, PackType packType, Pack.Position packPosition, + PackResources packResources) implements RepositorySource { + @Override + public void loadPacks(@NotNull Consumer onLoad) { + onLoad.accept(Pack.readMetaAndCreate(packId, Component.literal(packId), true, id -> packResources, packType, packPosition, PackSource.BUILT_IN)); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/ModFilePackResources.java b/src/main/java/com/simibubi/create/foundation/pack/ModFilePackResources.java similarity index 90% rename from src/main/java/com/simibubi/create/foundation/ModFilePackResources.java rename to src/main/java/com/simibubi/create/foundation/pack/ModFilePackResources.java index 94603298ba..8e399d7660 100644 --- a/src/main/java/com/simibubi/create/foundation/ModFilePackResources.java +++ b/src/main/java/com/simibubi/create/foundation/pack/ModFilePackResources.java @@ -1,10 +1,11 @@ -package com.simibubi.create.foundation; +package com.simibubi.create.foundation.pack; import java.nio.file.Path; import net.minecraftforge.forgespi.locating.IModFile; import net.minecraftforge.resource.PathPackResources; +// TODO - Move into catnip public class ModFilePackResources extends PathPackResources { protected final IModFile modFile; protected final String sourcePath; diff --git a/src/main/java/com/simibubi/create/foundation/recipe/RecipeFinder.java b/src/main/java/com/simibubi/create/foundation/recipe/RecipeFinder.java index 1d4950c59b..9aa3766ff0 100644 --- a/src/main/java/com/simibubi/create/foundation/recipe/RecipeFinder.java +++ b/src/main/java/com/simibubi/create/foundation/recipe/RecipeFinder.java @@ -4,60 +4,55 @@ import java.util.Collections; import java.util.List; import java.util.concurrent.ExecutionException; import java.util.function.Predicate; -import java.util.stream.Collectors; import javax.annotation.Nullable; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; +import com.simibubi.create.Create; + import net.minecraft.server.packs.resources.ResourceManagerReloadListener; import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.level.Level; /** - * Utility for searching through a world's recipe collection. Non-dynamic - * conditions can be split off into an initial search for caching intermediate - * results. - * - * @author simibubi + * Utility for searching through a level's recipe collection. + * Non-dynamic conditions can be split off into an initial search for caching intermediate results. * + * @author simibubi */ public class RecipeFinder { - - private static Cache>> cachedSearches = CacheBuilder.newBuilder().build(); + private static final Cache>> CACHED_SEARCHES = CacheBuilder.newBuilder().build(); + + public static final ResourceManagerReloadListener LISTENER = resourceManager -> CACHED_SEARCHES.invalidateAll(); /** - * Find all IRecipes matching the condition predicate. If this search is made - * more than once, using the same object instance as the cacheKey will retrieve - * the cached result from the first time. - * - * @param cacheKey (can be null to prevent the caching) - * @param world - * @param conditions + * Find all recipes matching the condition predicate. + * If this search is made more than once, + * using the same object instance as the cacheKey will retrieve the cached result from the first search. + * + * @param cacheKey (can be null to prevent the caching) * @return A started search to continue with more specific conditions. */ - public static List> get(@Nullable Object cacheKey, Level world, Predicate> conditions) { + public static List> get(@Nullable Object cacheKey, Level level, Predicate> conditions) { if (cacheKey == null) - return startSearch(world, conditions); + return startSearch(level, conditions); try { - return cachedSearches.get(cacheKey, () -> startSearch(world, conditions)); + return CACHED_SEARCHES.get(cacheKey, () -> startSearch(level, conditions)); } catch (ExecutionException e) { - e.printStackTrace(); + Create.LOGGER.error("Encountered a exception while searching for recipes", e); } return Collections.emptyList(); } - private static List> startSearch(Level world, Predicate> conditions) { - List> list = world.getRecipeManager().getRecipes().stream().filter(conditions) - .collect(Collectors.toList()); - return list; + private static List> startSearch(Level level, Predicate> conditions) { + return level.getRecipeManager() + .getRecipes() + .stream() + .filter(conditions) + .toList(); } - - public static final ResourceManagerReloadListener LISTENER = resourceManager -> { - cachedSearches.invalidateAll(); - }; - } diff --git a/src/main/java/com/simibubi/create/foundation/recipe/RuntimeDataGenerator.java b/src/main/java/com/simibubi/create/foundation/recipe/RuntimeDataGenerator.java new file mode 100644 index 0000000000..06e79882a8 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/recipe/RuntimeDataGenerator.java @@ -0,0 +1,130 @@ +package com.simibubi.create.foundation.recipe; + +import java.util.Collections; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.jetbrains.annotations.ApiStatus; + +import com.google.gson.JsonObject; +import com.simibubi.create.Create; +import com.simibubi.create.content.kinetics.saw.CuttingRecipe; +import com.simibubi.create.content.processing.recipe.ProcessingRecipe; +import com.simibubi.create.content.processing.recipe.ProcessingRecipeBuilder; +import com.simibubi.create.content.processing.recipe.ProcessingRecipeBuilder.DataGenResult; +import com.simibubi.create.foundation.pack.DynamicPack; + +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.Item; + +@ApiStatus.Internal +public class RuntimeDataGenerator { + private static final Pattern STRIPPED_WOODS_REGEX = Pattern.compile("stripped_(\\w*)_(log|wood|stem|hyphae)"); + private static final Pattern NON_STRIPPED_WOODS_REGEX = Pattern.compile("(?!stripped_)([a-z]+)_(log|wood|stem|hyphae)"); + private static final Object2ObjectOpenHashMap JSON_FILES = new Object2ObjectOpenHashMap<>(); + + public static void insertIntoPack(DynamicPack dynamicPack) { + for (ResourceLocation itemId : BuiltInRegistries.ITEM.keySet()) + cuttingRecipes(itemId); + + Create.LOGGER.info("Created {} recipes which will be injected into the game", JSON_FILES.size()); + + JSON_FILES.forEach(dynamicPack::put); + + JSON_FILES.clear(); + JSON_FILES.trim(); + } + + // logs/woods -> stripped variants + // logs/woods both stripped and non stripped -> planks + // planks -> stairs, slabs, fences, fence gates, doors, trapdoors, pressure plates, buttons and signs + // also adds stripped logs and woods into the create tag for those + private static void cuttingRecipes(ResourceLocation itemId) { + String path = itemId.getPath(); + + Matcher match = STRIPPED_WOODS_REGEX.matcher(path); + boolean hasFoundMatch = match.find(); + + // Last ditch attempt. Try to find logs without stripped variants + boolean noStrippedVariant = false; + if (!hasFoundMatch && !BuiltInRegistries.ITEM.containsKey(itemId.withPrefix("stripped_"))) { + match = NON_STRIPPED_WOODS_REGEX.matcher(path); + hasFoundMatch = match.find(); + noStrippedVariant = true; + } + + if (hasFoundMatch) { + String type = match.group(2); + ResourceLocation base = itemId.withPath(match.group(1) + "_"); + ResourceLocation nonStrippedId = base.withSuffix(type); + ResourceLocation planksId = base.withSuffix("planks"); + ResourceLocation stairsId = base.withSuffix("stairs"); + ResourceLocation slabId = base.withSuffix("slab"); + ResourceLocation fenceId = base.withSuffix("fence"); + ResourceLocation fenceGateId = base.withSuffix("fence_gate"); + ResourceLocation doorId = base.withSuffix("door"); + ResourceLocation trapdoorId = base.withSuffix("trapdoor"); + ResourceLocation pressurePlateId = base.withSuffix("pressure_plate"); + ResourceLocation buttonId = base.withSuffix("button"); + ResourceLocation signId = base.withSuffix("sign"); + + if (!noStrippedVariant) + simpleWoodRecipe(nonStrippedId, itemId); + simpleWoodRecipe(TagKey.create(Registries.ITEM, nonStrippedId.withSuffix("s")), planksId, 6); + + if (!path.contains("_wood") && !path.contains("_hyphae") && BuiltInRegistries.ITEM.containsKey(planksId)) { + simpleWoodRecipe(planksId, stairsId); + simpleWoodRecipe(planksId, slabId, 2); + simpleWoodRecipe(planksId, fenceId); + simpleWoodRecipe(planksId, fenceGateId); + simpleWoodRecipe(planksId, doorId); + simpleWoodRecipe(planksId, trapdoorId); + simpleWoodRecipe(planksId, pressurePlateId); + simpleWoodRecipe(planksId, buttonId); + simpleWoodRecipe(planksId, signId); + } + } + } + + private static void simpleWoodRecipe(ResourceLocation inputId, ResourceLocation outputId) { + simpleWoodRecipe(inputId, outputId, 1); + } + + private static void simpleWoodRecipe(ResourceLocation inputId, ResourceLocation outputId, int amount) { + if (BuiltInRegistries.ITEM.containsKey(outputId)) { + new Builder<>(inputId.getNamespace(), CuttingRecipe::new, inputId.getPath(), outputId.getPath()) + .require(BuiltInRegistries.ITEM.get(inputId)) + .output(BuiltInRegistries.ITEM.get(outputId), amount) + .duration(50) + .build(); + } + } + + private static void simpleWoodRecipe(TagKey inputTag, ResourceLocation outputId, int amount) { + if (BuiltInRegistries.ITEM.containsKey(outputId)) { + new Builder<>(inputTag.location().getNamespace(), CuttingRecipe::new, "tag_" + inputTag.location().getPath(), outputId.getPath()) + .require(inputTag) + .output(BuiltInRegistries.ITEM.get(outputId), amount) + .duration(50) + .build(); + } + } + + private static class Builder> extends ProcessingRecipeBuilder { + public Builder(String modid, ProcessingRecipeBuilder.ProcessingRecipeFactory factory, String from, String to) { + super(factory, Create.asResource("runtime_generated/compat/" + modid + "/" + from + "_to_" + to)); + } + + @Override + public T build() { + T t = super.build(); + DataGenResult result = new DataGenResult<>(t, Collections.emptyList()); + JSON_FILES.put(result.getId().withPrefix("recipes/"), result.serializeRecipe()); + return t; + } + } +} diff --git a/src/main/java/com/simibubi/create/infrastructure/config/CRecipes.java b/src/main/java/com/simibubi/create/infrastructure/config/CRecipes.java index 45e00cfdab..e5106901fe 100644 --- a/src/main/java/com/simibubi/create/infrastructure/config/CRecipes.java +++ b/src/main/java/com/simibubi/create/infrastructure/config/CRecipes.java @@ -14,7 +14,6 @@ public class CRecipes extends ConfigBase { public final ConfigInt maxFireworkIngredientsInCrafter = i(9, 1, "maxFireworkIngredientsInCrafter", Comments.maxFireworkIngredientsInCrafter); public final ConfigBool allowStonecuttingOnSaw = b(true, "allowStonecuttingOnSaw", Comments.allowStonecuttingOnSaw); - public final ConfigBool allowWoodcuttingOnSaw = b(true, "allowWoodcuttingOnSaw", Comments.allowWoodcuttingOnSaw); public final ConfigBool allowCastingBySpout = b(true, "allowCastingBySpout", Comments.allowCastingBySpout); public final ConfigBool displayLogStrippingRecipes = b(true, "displayLogStrippingRecipes", Comments.displayLogStrippingRecipes); public final ConfigInt lightSourceCountForRefinedRadiance = @@ -43,7 +42,7 @@ public class CRecipes extends ConfigBase { static String allowStonecuttingOnSaw = "Allow any stonecutting recipes to be processed by a Mechanical Saw."; static String allowWoodcuttingOnSaw = - "Allow any Druidcraft woodcutter recipes to be processed by a Mechanical Saw."; + "Allow any wood related recipes to be processed by a Mechanical Saw."; static String allowCastingBySpout = "Allow Spouts to interact with Casting Tables and Basins from Tinkers' Construct."; static String refinedRadiance = From 52e9668540cf48f07fe7ff73a67ad2c39e4aecad Mon Sep 17 00:00:00 2001 From: Kryppers <65094918+Kryppers@users.noreply.github.com> Date: Mon, 13 Jan 2025 14:45:43 +0000 Subject: [PATCH 298/515] further asset additions added rare_thunder asset --- .../textures/item/package/rare_thunder.png | Bin 0 -> 3270 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/main/resources/assets/create/textures/item/package/rare_thunder.png diff --git a/src/main/resources/assets/create/textures/item/package/rare_thunder.png b/src/main/resources/assets/create/textures/item/package/rare_thunder.png new file mode 100644 index 0000000000000000000000000000000000000000..ebeb266ba64e9c76a9832171eaacfd5a9018b459 GIT binary patch literal 3270 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 Eg8n^5ZU6uP literal 0 HcmV?d00001 From 4b69bfc0dc1a74b128c500dfbd89928a7b0d66cf Mon Sep 17 00:00:00 2001 From: IThundxr Date: Mon, 13 Jan 2025 09:49:41 -0500 Subject: [PATCH 299/515] Consistent Consistency - Make bar and window models consistent with vanilla's models --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 1347 +++++------------ .../models/item/acacia_window_pane.json | 5 +- .../create/models/item/andesite_bars.json | 5 +- .../create/models/item/birch_window_pane.json | 5 +- .../assets/create/models/item/brass_bars.json | 5 +- .../create/models/item/copper_bars.json | 5 +- .../models/item/crimson_window_pane.json | 5 +- .../models/item/dark_oak_window_pane.json | 5 +- .../create/models/item/framed_glass_pane.json | 5 +- .../item/horizontal_framed_glass_pane.json | 5 +- .../models/item/jungle_window_pane.json | 5 +- .../models/item/mangrove_window_pane.json | 5 +- .../create/models/item/oak_window_pane.json | 5 +- .../models/item/ornate_iron_window_pane.json | 5 +- .../models/item/spruce_window_pane.json | 5 +- .../create/models/item/tiled_glass_pane.json | 5 +- .../item/vertical_framed_glass_pane.json | 5 +- .../models/item/warped_window_pane.json | 5 +- .../create/foundation/data/MetalBarsGen.java | 4 +- .../create/foundation/data/WindowGen.java | 9 +- .../assets/create/models/item/bars.json | 77 - .../assets/create/models/item/pane.json | 49 - 22 files changed, 455 insertions(+), 1116 deletions(-) delete mode 100644 src/main/resources/assets/create/models/item/bars.json delete mode 100644 src/main/resources/assets/create/models/item/pane.json diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index bd04d6148b..b80b758dd8 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2025-01-12T20:44:34.2740637 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2024-10-30T20:54:22.388304073 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -15,32 +15,24 @@ c9aa3f6acdcadfcd6f0c48457ddafcdd9ff37104 assets/create/blockstates/andesite_enca 1299bde31535b381cc2d9b40f58097702bd12b92 assets/create/blockstates/andesite_ladder.json afff577673aec43b9a596c4663024cb35127e0c3 assets/create/blockstates/andesite_pillar.json 0d47d0816051dd63837c689de8b838dc1639d2fd assets/create/blockstates/andesite_scaffolding.json -beb5fd89e2c6701bca3c7c579b1b1f965a7ff71a assets/create/blockstates/andesite_table_cloth.json 67c4f7802f0854d24bb29019682b1d0a2f335a15 assets/create/blockstates/andesite_tunnel.json 542af96eb0c1e34df81f15fae7dbbaf4f81287f3 assets/create/blockstates/asurine.json 7f07775d89e3bea45d7161d289daf15470e7f544 assets/create/blockstates/asurine_pillar.json -a850a113b4cfd8f1c827905b79b8629c40de12b0 assets/create/blockstates/bamboo_window.json -dfaec148d3bb21efb2ef7106a2d04454c4134303 assets/create/blockstates/bamboo_window_pane.json 9c62e0ce5d85ac4081bc04c85db7676b996b0f12 assets/create/blockstates/basin.json a97910c7516e7cedec9e34eca51f1183f1e3e681 assets/create/blockstates/belt.json 0ea03133af234921a3313f52521d8cfd02bf5d81 assets/create/blockstates/birch_window.json 2003c43151b731bf19cae58290c63bcb3785848a assets/create/blockstates/birch_window_pane.json c8b65faf51122eb411f5895e718869da9b260c2e assets/create/blockstates/black_nixie_tube.json -fdc7dad3daa231e3d1906a1f0a84f254a31cf2c7 assets/create/blockstates/black_postbox.json 980ae9ba3f6d4e0faea8f3878985f9a9dadc0796 assets/create/blockstates/black_sail.json da3ad0225984a0dcbfb4ed800e307e45aff5aaa1 assets/create/blockstates/black_seat.json -1ea958c40f0cbf63c31d9b5422b6b86f9268e393 assets/create/blockstates/black_table_cloth.json 0083f6aa3fda2c7ebb2e5f2a032e740cf3ae3846 assets/create/blockstates/black_toolbox.json 28f2fb355e80171403e540afd2aed44e9c19659a assets/create/blockstates/black_valve_handle.json 06ecd28cd97f4e8200dc396858695cad57b871c8 assets/create/blockstates/blaze_burner.json 37caf031254b5171a1fbfe9906f4bc65e8dbc909 assets/create/blockstates/blue_nixie_tube.json -80cd0b998a2e21d6ca77419139c24a7ad97c2538 assets/create/blockstates/blue_postbox.json d540f0f23e0d7c03f8e147cf3eebbaf7caec9f93 assets/create/blockstates/blue_sail.json d2fdb432bb037de781260c789e905b223fab408c assets/create/blockstates/blue_seat.json -27241e0fd5a034c461f6920f94b852c6e825ce56 assets/create/blockstates/blue_table_cloth.json f91092da79b69fece9583ccc15350612f439ee1b assets/create/blockstates/blue_toolbox.json e330efa253172b315f73401ed8f2c39270ba90d3 assets/create/blockstates/blue_valve_handle.json -a02d3059619edf0bd19dbf397cb35f0f8b8fb20e assets/create/blockstates/bound_cardboard_block.json 5c7065e56a831e0957b6531d50f720e9efb64309 assets/create/blockstates/brass_bars.json d49d09f1026f816bb05a5dc13c806b860f2eb07a assets/create/blockstates/brass_belt_funnel.json 5a2551315557447abc579cf9225e3a12d9a46641 assets/create/blockstates/brass_block.json @@ -52,21 +44,14 @@ bac88b313b63acfc77c25b1463276a714f22f336 assets/create/blockstates/brass_encased a408005aae4c1caa7aaae5a0ddf9d1ad73cd0254 assets/create/blockstates/brass_funnel.json 1e8eba1ac6a0beb744f8b5feb96bbe5f3a75f214 assets/create/blockstates/brass_ladder.json 6d210298b9d80ae69aa03b09aa73b92e14b9ab1b assets/create/blockstates/brass_scaffolding.json -61f5242e85c36ecf0f7963954236c60596ec9cbe assets/create/blockstates/brass_table_cloth.json 8ee948f9e87b82bb27aaecc522127fa1297b3d9d assets/create/blockstates/brass_tunnel.json debf33346bf410216f21082e1e8d07aa6250b84c assets/create/blockstates/brown_nixie_tube.json -bc6719074acbec67e345005aeee352fd7bc54c09 assets/create/blockstates/brown_postbox.json 1334fc9e71d9f2a6117f448817263467a9c695de assets/create/blockstates/brown_sail.json 19524b2c0672632e63372f405a87dbea35f1d160 assets/create/blockstates/brown_seat.json -41a93cdd7ef066a844b750b657dce766df29d301 assets/create/blockstates/brown_table_cloth.json 1ffc38bf682e84aad4cb300c573375eb0cdcc434 assets/create/blockstates/brown_toolbox.json 440b29e1dffa4374ddc1aed444bff18a485bc1cb assets/create/blockstates/brown_valve_handle.json 2064534de4791b339fdcd4ef3a8129a2e233ec50 assets/create/blockstates/calcite_pillar.json -6a3e661d54423af7a8d642b813deb8f5331013c5 assets/create/blockstates/cardboard_block.json 060c957b28afed9f4e0954cbef7e80cbf4b99f58 assets/create/blockstates/cart_assembler.json -fab98b93ad9b78312742daca83c2575db40fce98 assets/create/blockstates/chain_conveyor.json -178c651f169ffc32556738bb5c19b4a746cfa085 assets/create/blockstates/cherry_window.json -b1796f89bd7785d00dc8618ca90d760da4f258bb assets/create/blockstates/cherry_window_pane.json c7eca70054241944171b1d4ffcba0376b071ec62 assets/create/blockstates/chocolate.json 9eb989b0a0545af9efd052d1f127b2ec28a972d1 assets/create/blockstates/chute.json b5170d754ce5f07ea2b4646eb07c099c50bae249 assets/create/blockstates/clipboard.json @@ -83,13 +68,12 @@ b5170d754ce5f07ea2b4646eb07c099c50bae249 assets/create/blockstates/clipboard.jso f7254f20f91e2f1295e36d2e70390d43f3952d07 assets/create/blockstates/copper_door.json 736777de0eb038ff1ef9e8fe9d04c23d80239eda assets/create/blockstates/copper_ladder.json df3103dfc1c3ba7a9573229d009cb0de4925df16 assets/create/blockstates/copper_scaffolding.json -4d3d29e8a74bf103da39e76a1466b03eb5dcf916 assets/create/blockstates/copper_shingles.json 1ea8fdb990f8cda1762ab69ac38ea3161a835227 assets/create/blockstates/copper_shingle_slab.json 7c35bb802099d6bb5d92eafd8cbb7ea146979a2e assets/create/blockstates/copper_shingle_stairs.json -5c5ba06bf5b0a2c57d0aa42e85880f36d9694a78 assets/create/blockstates/copper_table_cloth.json -9a9f03140a57a7a8903d3e1b159bdc052566a6ec assets/create/blockstates/copper_tiles.json +4d3d29e8a74bf103da39e76a1466b03eb5dcf916 assets/create/blockstates/copper_shingles.json 7db7a0d81887091ca889f40bb8a508d3098c5164 assets/create/blockstates/copper_tile_slab.json c0b7eca017242913d156e4623147add0d03574f6 assets/create/blockstates/copper_tile_stairs.json +9a9f03140a57a7a8903d3e1b159bdc052566a6ec assets/create/blockstates/copper_tiles.json ef3ccb2d8b03f5a972b053a15bb037f8db6af17c assets/create/blockstates/copper_valve_handle.json 4758bed22fb6fe18213f463bc055775c1909e858 assets/create/blockstates/copycat_bars.json 4789c857508452aede1cb7389187b99ce2d7bf62 assets/create/blockstates/copycat_base.json @@ -106,122 +90,120 @@ c9a2c3a7971c46957d0f07c6d94d76f59da54a0b assets/create/blockstates/crushing_whee 4b0e51a1c10685f7d432467339afc9c2e24793b0 assets/create/blockstates/crushing_wheel_controller.json ba9c3ecfacbd398048440d247decffeaefc714b5 assets/create/blockstates/cuckoo_clock.json 1f6d84cba69062a1989d671c9c97317e2c2455b6 assets/create/blockstates/cut_andesite.json -cc62a6499ce8dcfc5e8695f0e8bb3c3d67f41efc assets/create/blockstates/cut_andesite_bricks.json 50d88f806122818af2ffecbd514d13ebbd21e4c9 assets/create/blockstates/cut_andesite_brick_slab.json 32d801225ea18209792921fa91618ed41794dbd0 assets/create/blockstates/cut_andesite_brick_stairs.json 3bf8204bf8c7c5b7b3c388fbc3478bb2d7c47129 assets/create/blockstates/cut_andesite_brick_wall.json +cc62a6499ce8dcfc5e8695f0e8bb3c3d67f41efc assets/create/blockstates/cut_andesite_bricks.json 34e89a828f14383c6115954a235b19851b74f277 assets/create/blockstates/cut_andesite_slab.json 49d58ae14544d89305ddc707cf7f6a81998200fa assets/create/blockstates/cut_andesite_stairs.json 1cc235cb6c388324793ac40f7bf89df8b048faac assets/create/blockstates/cut_andesite_wall.json 13ea54a4b9b89e576879a6e23a029c6341b7c098 assets/create/blockstates/cut_asurine.json -51c22c0547ab8ed2564890afb8733bbe356899f5 assets/create/blockstates/cut_asurine_bricks.json cf09de38f826fe000c5efe5afe56cf746125691d assets/create/blockstates/cut_asurine_brick_slab.json 1835482d5e9a59f2214336a63b12c7132ad815b4 assets/create/blockstates/cut_asurine_brick_stairs.json c48ab37bf7a2aba676af281d29cb6a2103c72fba assets/create/blockstates/cut_asurine_brick_wall.json +51c22c0547ab8ed2564890afb8733bbe356899f5 assets/create/blockstates/cut_asurine_bricks.json 1523a57124239a99da0b12a6b435c09d3d4276a5 assets/create/blockstates/cut_asurine_slab.json cc1acf5e118f1b1e78c5bb291176008960794d59 assets/create/blockstates/cut_asurine_stairs.json 139640bf41070e8eeb48647319eee54bb6804692 assets/create/blockstates/cut_asurine_wall.json 06b8c5cf98366608c480a37e6944d0d668bc8983 assets/create/blockstates/cut_calcite.json -979c70e35d806f1f63fe3381f27d881a17f9f6be assets/create/blockstates/cut_calcite_bricks.json a8f83cb8e1eae587f4e11e37c4cd3d0a1bbef377 assets/create/blockstates/cut_calcite_brick_slab.json 1eabb2e485aa323d317fa9648be02c12556593b7 assets/create/blockstates/cut_calcite_brick_stairs.json a0a33df71c5d26344a7bb0dd7a4622c30cc7825f assets/create/blockstates/cut_calcite_brick_wall.json +979c70e35d806f1f63fe3381f27d881a17f9f6be assets/create/blockstates/cut_calcite_bricks.json e3ddaae92b52cc3ea230088ff23260b5c5c93017 assets/create/blockstates/cut_calcite_slab.json 80c5249eaf9504c743c427fdd1a2c7bfa0f3d48f assets/create/blockstates/cut_calcite_stairs.json b4bbdb08d8114b6741546a0418cb54d645481c02 assets/create/blockstates/cut_calcite_wall.json 449f5180c72a028393afdac55a34e59862728224 assets/create/blockstates/cut_crimsite.json -25d731077a131d03347296c38c76b547194a6320 assets/create/blockstates/cut_crimsite_bricks.json d2c8a3580d3578c8afe44b94d4448be3680dbdeb assets/create/blockstates/cut_crimsite_brick_slab.json a3d9d2190a23b881dd3a7538ab248e0b0a3efa8e assets/create/blockstates/cut_crimsite_brick_stairs.json 3791c00ed477c0aaf7c5a20803a89dfc0e20f013 assets/create/blockstates/cut_crimsite_brick_wall.json +25d731077a131d03347296c38c76b547194a6320 assets/create/blockstates/cut_crimsite_bricks.json c9f19e7a976a7428b3dd58f45d734700ca1a18cd assets/create/blockstates/cut_crimsite_slab.json 1b8d4ac53dc5823083c2af605165a05b73c9ff79 assets/create/blockstates/cut_crimsite_stairs.json 484f9253ed92e963f398973a99fbeacb67ba1188 assets/create/blockstates/cut_crimsite_wall.json c4e95ceb7914da09ebe42d539bf5d976a3d70972 assets/create/blockstates/cut_deepslate.json -75d4ef863cd85d8f3df78226177966954e02ee2b assets/create/blockstates/cut_deepslate_bricks.json e1dc99a48b9066732fc5c62071c5ead16f34f438 assets/create/blockstates/cut_deepslate_brick_slab.json dbb2eddaf1d4ae3e687beb611552ea4283a1e7d8 assets/create/blockstates/cut_deepslate_brick_stairs.json 91c1f3da848503067c64b966ddda22ab91ff8fd5 assets/create/blockstates/cut_deepslate_brick_wall.json +75d4ef863cd85d8f3df78226177966954e02ee2b assets/create/blockstates/cut_deepslate_bricks.json 593198ffd37eae124a8366ae1d4a40b682788f92 assets/create/blockstates/cut_deepslate_slab.json f8cd1f9002ed8593ab71af9cfb7f962625994108 assets/create/blockstates/cut_deepslate_stairs.json c2d8060a0c830e5b8bbb084457083324b5b6f4c9 assets/create/blockstates/cut_deepslate_wall.json aaa6ac5f4fc399c4b03a7f8de856fa7aae97e049 assets/create/blockstates/cut_diorite.json -08b6289ca8b4193c87324ca23ca081e8773fb223 assets/create/blockstates/cut_diorite_bricks.json 423f809f06fa3fd96643f068ba0d3520269b3844 assets/create/blockstates/cut_diorite_brick_slab.json 9011fb92f57e7695c4484c923dd40ecd749ff307 assets/create/blockstates/cut_diorite_brick_stairs.json 41bad89777a33737bc0365ce2c7ffc20720f9620 assets/create/blockstates/cut_diorite_brick_wall.json +08b6289ca8b4193c87324ca23ca081e8773fb223 assets/create/blockstates/cut_diorite_bricks.json b03e7cf494c53c6f24ba93d0ef531e839026932b assets/create/blockstates/cut_diorite_slab.json 95c8094204979acfb0e59c2826003e0274a02fe5 assets/create/blockstates/cut_diorite_stairs.json e2f163d36dd5d03c0741dd2e87d8f77a0c86ae00 assets/create/blockstates/cut_diorite_wall.json f42ca2ce8e8f657c64376759413ec611f8045531 assets/create/blockstates/cut_dripstone.json -2d696162b2085c3d5723308a8d1ccafb29660f01 assets/create/blockstates/cut_dripstone_bricks.json 9310a800fb091014e7c0a220f5f2511c1de379ad assets/create/blockstates/cut_dripstone_brick_slab.json 3ff2f65dafcb4654b99e0d65b7e851760f9a4075 assets/create/blockstates/cut_dripstone_brick_stairs.json cafc956d8dc2053e5a0e8437c4ccde7fa24fc17e assets/create/blockstates/cut_dripstone_brick_wall.json +2d696162b2085c3d5723308a8d1ccafb29660f01 assets/create/blockstates/cut_dripstone_bricks.json 9cb32af3b952b841e9da94789da17cd274c3cfb9 assets/create/blockstates/cut_dripstone_slab.json da0300f54bdfcc705beb8d84f26406be660de5de assets/create/blockstates/cut_dripstone_stairs.json 83ff3eaeb481202c77e6dbdc442b4dd195ca568c assets/create/blockstates/cut_dripstone_wall.json bf501250fd2226838afe0baf68db08cd832e3c4f assets/create/blockstates/cut_granite.json -5c029d7ec837b3239d17ab91a70f025df1bfb124 assets/create/blockstates/cut_granite_bricks.json 773717bd5c140cf025f463c99c67efb9d27bd696 assets/create/blockstates/cut_granite_brick_slab.json 97d20b21e5b7f329c1b21b436fd0bdcaa8d173d0 assets/create/blockstates/cut_granite_brick_stairs.json 5e4175b6c89039ded48937ad1cd13d3bb2d2992a assets/create/blockstates/cut_granite_brick_wall.json +5c029d7ec837b3239d17ab91a70f025df1bfb124 assets/create/blockstates/cut_granite_bricks.json 42549436ce26ad7b44f2e1cba54357b3f25bcb18 assets/create/blockstates/cut_granite_slab.json e9d8fd028d8092e5fa0fd13cd638516f57a22d53 assets/create/blockstates/cut_granite_stairs.json 2daab523202dd2e31daeaf3b9a04cde2a7da4ca5 assets/create/blockstates/cut_granite_wall.json 0652c8b9c41acc1a8da901bd7b8b6018b3581d5b assets/create/blockstates/cut_limestone.json -508ee569f313b7e804f6268ca86f5a61851563ec assets/create/blockstates/cut_limestone_bricks.json 4efbeb34c96918e9b48dc484a82b1ef4811ed39d assets/create/blockstates/cut_limestone_brick_slab.json 11b99cf9b33d7f8de9d11cc1e405e2681682ba32 assets/create/blockstates/cut_limestone_brick_stairs.json b6c02a9e9e47a8e521a54ef9488259267068f032 assets/create/blockstates/cut_limestone_brick_wall.json +508ee569f313b7e804f6268ca86f5a61851563ec assets/create/blockstates/cut_limestone_bricks.json fb63a2581211fe62344985a06feec9dcec4b1888 assets/create/blockstates/cut_limestone_slab.json ffcca1e66718f3e78e544b5fa9954a852c095e91 assets/create/blockstates/cut_limestone_stairs.json a1a90f84b47f96b4384fc2d60bfc48ddbb5ed179 assets/create/blockstates/cut_limestone_wall.json 1b7a133518780d4f49474a70e7f6263d6e88ff51 assets/create/blockstates/cut_ochrum.json -6f37e5e2dca3b443951131cb82c15a981a4e2005 assets/create/blockstates/cut_ochrum_bricks.json f1e9d54a6f9f41b968f117a7be711011effa71a5 assets/create/blockstates/cut_ochrum_brick_slab.json 8d334e026e94b304a1ff1ee96097f434b50175f2 assets/create/blockstates/cut_ochrum_brick_stairs.json e92c026ee7ab2aa35003ad475bef3d6c0e29818c assets/create/blockstates/cut_ochrum_brick_wall.json +6f37e5e2dca3b443951131cb82c15a981a4e2005 assets/create/blockstates/cut_ochrum_bricks.json 5a61edb7d146e83d951795fae33dc306e71b2cb6 assets/create/blockstates/cut_ochrum_slab.json b31944bf6297685acd37631083dde0889c08ede7 assets/create/blockstates/cut_ochrum_stairs.json df33a8af1dc8cb08ddcfd22a50a305499479a4dd assets/create/blockstates/cut_ochrum_wall.json 1606d7481e56755f07e9331cf85a8d7cc9aace9a assets/create/blockstates/cut_scorchia.json -bc2a0e7f11400b8c2a03071be87dadb5edc097de assets/create/blockstates/cut_scorchia_bricks.json 43db25ebac2f5bcaa7ca9cfb6da8fcb20fad8269 assets/create/blockstates/cut_scorchia_brick_slab.json 7a80620590ba5e61967c5168f5c67ecabf09dc00 assets/create/blockstates/cut_scorchia_brick_stairs.json e4eb79360a41bb1a7ca835d61446ea5166e4cda8 assets/create/blockstates/cut_scorchia_brick_wall.json +bc2a0e7f11400b8c2a03071be87dadb5edc097de assets/create/blockstates/cut_scorchia_bricks.json c0d262f54e3b2fce8bc941a2a6df71db5f0229ea assets/create/blockstates/cut_scorchia_slab.json de2e918058e9dd7eafd085a8dec634f6a2832c21 assets/create/blockstates/cut_scorchia_stairs.json 5d2d06799b82449754f62b1d80b9ee9a24c65bad assets/create/blockstates/cut_scorchia_wall.json 76ea4f3438a3effedfc93d2bbabac0899610cd28 assets/create/blockstates/cut_scoria.json -6d9c79e1b71656a73bb69e2a9b100be59084dd2e assets/create/blockstates/cut_scoria_bricks.json 7c7dcd1fe82f3673910620c2eefebad5d0029cdf assets/create/blockstates/cut_scoria_brick_slab.json d535b387bf0a6f9e124eed8b76d899e13699bca9 assets/create/blockstates/cut_scoria_brick_stairs.json c426e1b5e4c77c25cd0d16d10fba0e0731673dd1 assets/create/blockstates/cut_scoria_brick_wall.json +6d9c79e1b71656a73bb69e2a9b100be59084dd2e assets/create/blockstates/cut_scoria_bricks.json fb692494c88358d4d8e687b216f729d6b6bd7174 assets/create/blockstates/cut_scoria_slab.json 950f43bae8f4e3220103ce0c62f444856129ca12 assets/create/blockstates/cut_scoria_stairs.json 01350030831c5b9edef0dc2c778b92f1ebc2b2fc assets/create/blockstates/cut_scoria_wall.json c0c1c4d44eba5babe9703eca31f0279ebd11ed8e assets/create/blockstates/cut_tuff.json -9bddef4a2b4a338c15f03e2397c4cd4c3ae9e5d9 assets/create/blockstates/cut_tuff_bricks.json 11306e83915e0106d48f890df3212c3a47443a08 assets/create/blockstates/cut_tuff_brick_slab.json e8951d94e0d3228700bcb56819928f1c179c3973 assets/create/blockstates/cut_tuff_brick_stairs.json 619340b7cf014cfb72a4b5440b90881535f16108 assets/create/blockstates/cut_tuff_brick_wall.json +9bddef4a2b4a338c15f03e2397c4cd4c3ae9e5d9 assets/create/blockstates/cut_tuff_bricks.json 3577e3f4933ea8cb7464c28e80867ce84917898d assets/create/blockstates/cut_tuff_slab.json 5673fdb02439d622c56dc0ff47a0dca98dc6d027 assets/create/blockstates/cut_tuff_stairs.json 12a46ee82536665400ec2f3befed3be58325d5c6 assets/create/blockstates/cut_tuff_wall.json beb9e47f8d811c2146f68daf992fb805342a65cb assets/create/blockstates/cut_veridium.json -04d07986eb86ffd66baaaf9b65e02d00022e98e2 assets/create/blockstates/cut_veridium_bricks.json 952543c03e730443d85059ec43642efb089485e7 assets/create/blockstates/cut_veridium_brick_slab.json 6a033e7b5a0b26cce5956c6c7c1eff558f866cb5 assets/create/blockstates/cut_veridium_brick_stairs.json 43689138c8018b3ee9f35a11870887e9df3c8fe5 assets/create/blockstates/cut_veridium_brick_wall.json +04d07986eb86ffd66baaaf9b65e02d00022e98e2 assets/create/blockstates/cut_veridium_bricks.json 212d8ee5dfa78802b9539640cf8b263fd5880b87 assets/create/blockstates/cut_veridium_slab.json c11f09df4a23e951bdf9a345515183f4fac7cde3 assets/create/blockstates/cut_veridium_stairs.json 3aa6f5e613ff73952e3de00408051f92316e7f81 assets/create/blockstates/cut_veridium_wall.json bb627b2e78dba6833cf2d357033f253fc89aa1b8 assets/create/blockstates/cyan_nixie_tube.json -21b830af3dc477c527885d6590e0a8419ffb4fa2 assets/create/blockstates/cyan_postbox.json f1061b8f9757374d6608fda07e301a2623e79f72 assets/create/blockstates/cyan_sail.json 538c6d95da5cc460e99c91647dac61726a91479f assets/create/blockstates/cyan_seat.json -c2fc64da0466fe9daa63c18c35221736c1e091df assets/create/blockstates/cyan_table_cloth.json c4d84b719762aca46cdb8decddfeb97dcc50676c assets/create/blockstates/cyan_toolbox.json 477d32008d5aa6ed5a6825a70b9bb7d976e7d0fc assets/create/blockstates/cyan_valve_handle.json f4d7f5a38db9b92399a81f49ff1787d025c6f41f assets/create/blockstates/dark_oak_window.json @@ -230,7 +212,6 @@ c705f9cd47042867c87fab3a898a57152dec6dd5 assets/create/blockstates/deepslate_pil 1073fe9e96ea170c81b613835064034f967945b5 assets/create/blockstates/deepslate_zinc_ore.json d0ec99fdd534e1f3a84cc51fa914d3b74fb2c96a assets/create/blockstates/deployer.json 4f18fd003ca756417fd036bd8b66f323e0ca4852 assets/create/blockstates/depot.json -5b933ed479ec646f8cc2cd3739405c34737d517c assets/create/blockstates/desk_bell.json 26a5a4c176e75b1f48f3eb653a45c23e606f07b4 assets/create/blockstates/diorite_pillar.json d45d92164f81fd42cc1f8c6ba4ac25df0fca79b1 assets/create/blockstates/display_board.json a65771f280051a884725073d14a831539bc0d658 assets/create/blockstates/display_link.json @@ -241,13 +222,12 @@ f7f5df9086c71688cbdb5d05c394dc5acb8fb338 assets/create/blockstates/elevator_cont d47bc65703e9582cc710e6408fb565e16d3514a6 assets/create/blockstates/encased_fan.json 651f9fdb11f56d887d131be8f936f508d0b2fc1d assets/create/blockstates/encased_fluid_pipe.json 489ad4daeaed702d231a3f175f7b66846f5789a6 assets/create/blockstates/experience_block.json -5f6c60a30889b043709066707e80a21081d98155 assets/create/blockstates/exposed_copper_shingles.json 74c8a72db3dd3fa919e29baaa8c5865f13490461 assets/create/blockstates/exposed_copper_shingle_slab.json 4e0b5a9be15f0c2861f5f6bd71bd9c2a4db2a21d assets/create/blockstates/exposed_copper_shingle_stairs.json -5299b4f7b9b3490872e8c26a6b212e14dd05fd9a assets/create/blockstates/exposed_copper_tiles.json +5f6c60a30889b043709066707e80a21081d98155 assets/create/blockstates/exposed_copper_shingles.json 6ee73ff3608d51fdad6e9810feee66ed1773b81c assets/create/blockstates/exposed_copper_tile_slab.json f93e4059876bfc6d70b9fa2bc24d8e3d6943d56f assets/create/blockstates/exposed_copper_tile_stairs.json -4b30365ed77db9c5754eeda5fee81d47b568b946 assets/create/blockstates/factory_gauge.json +5299b4f7b9b3490872e8c26a6b212e14dd05fd9a assets/create/blockstates/exposed_copper_tiles.json f1a03ede031d8c4e33a4d07c529e71936da9dc6d assets/create/blockstates/fake_track.json 21fa4a1bf4ee851e090a21c97c9a38d18cfddf0d assets/create/blockstates/fluid_pipe.json 185e6367c5c5b3632e54148c74987057cbfccaca assets/create/blockstates/fluid_tank.json @@ -264,17 +244,13 @@ ff9f56912d8ac4069df90505232820f9c45f5e06 assets/create/blockstates/gantry_carria 5a193991f33a1af8659192f3693e4d8d3ed0082b assets/create/blockstates/glass_fluid_pipe.json e3f2a093c436cb65c5a7ac049a14cc4dadb22526 assets/create/blockstates/granite_pillar.json 921cf220c44a67195c90a30c4c296e65311738da assets/create/blockstates/gray_nixie_tube.json -024b9e82cc5802e8a9ff22880f8098d07fd192e7 assets/create/blockstates/gray_postbox.json 30ba031a6b5a327d2a4caa12169676da573c2133 assets/create/blockstates/gray_sail.json f35a502c4a5e2703e7c6811b3d2ba16a9c47d4c8 assets/create/blockstates/gray_seat.json -612058f415131fb127280c24d5d089793c103a7a assets/create/blockstates/gray_table_cloth.json 87457e0eddae80225dbb3145f2d120296ea1bfcd assets/create/blockstates/gray_toolbox.json f18b87db39836eef20154b239d488eebb64b3455 assets/create/blockstates/gray_valve_handle.json 0f0fe2bf83f763e04cd2d7a979beb547feac3191 assets/create/blockstates/green_nixie_tube.json -587c4f761858d888097c83f132c0a2d66ded3c56 assets/create/blockstates/green_postbox.json 0a2a5fbf2cf084e1be0426a224c291dc22a826fd assets/create/blockstates/green_sail.json b4aede1847d204ecdb7847559066d9d2ffb66903 assets/create/blockstates/green_seat.json -98587a931a565d4196f71ac4928846a7d55b3645 assets/create/blockstates/green_table_cloth.json 6f080890b3b30c46ba9ceb382c1171940bf4966f assets/create/blockstates/green_toolbox.json a343aefdb4207d1bffa6f4b40e20283a6d42c2f9 assets/create/blockstates/green_valve_handle.json 23430b770b5257af36844dfe9b976e343a6d1180 assets/create/blockstates/hand_crank.json @@ -284,10 +260,7 @@ d0b26c085df3ee5189082bc18945e5f74ee529fa assets/create/blockstates/haunted_bell. bffc2169f5fc3a8e22f8952a90767e0bb8d726b5 assets/create/blockstates/horizontal_framed_glass_pane.json 8ae52808eba950c36b75d62113e9cea9441a1a54 assets/create/blockstates/hose_pulley.json 87fa830c5d3541d096fab32d430c54516c197583 assets/create/blockstates/industrial_iron_block.json -3727801604445df291112fd9b99f99bbdcfa0f6d assets/create/blockstates/industrial_iron_window.json -877418ed76fdc589788db119663ca3e52e26a2aa assets/create/blockstates/industrial_iron_window_pane.json 2788ad2d29996076f7f18ab8d47e40c1ad10b348 assets/create/blockstates/item_drain.json -3151ed4019d851ab2a7b07f1327bc4bfb6ed7227 assets/create/blockstates/item_hatch.json 3e99569e978c0fe17ec18b97881434a9da1a8421 assets/create/blockstates/item_vault.json 8680e9d2a94231f4bbad87b26ab2efdb714903d3 assets/create/blockstates/jungle_window.json ddcf1010e43c5d4a8c93aad37cc97a94343fd9f5 assets/create/blockstates/jungle_window_pane.json @@ -310,35 +283,27 @@ ca124508c59130d21f23d7b1ef354d78bdd24dd4 assets/create/blockstates/layered_tuff. 2ff5466f9ea3b1292c24a8ddb31666d74635c592 assets/create/blockstates/layered_veridium.json fcf02725651ab5973fab1cfc09fdd68cb4b93579 assets/create/blockstates/lectern_controller.json 5d7e1b08b1ec7c7c11b70db11df09311fcd7cf45 assets/create/blockstates/light_blue_nixie_tube.json -3a7ceaefb2f7a24eac6bb3676a8fee01290a535f assets/create/blockstates/light_blue_postbox.json f2354e8cb6086473ac97a5228b99706858dcad8a assets/create/blockstates/light_blue_sail.json 6b7045eaf9efe3a90f2d9a6785be6a5fd534b8e7 assets/create/blockstates/light_blue_seat.json -ba0ae5046b643f82338e98ae56a48c01cf2d5972 assets/create/blockstates/light_blue_table_cloth.json b7065e7871c3c7f1a0656c2f92f82544e606f2fb assets/create/blockstates/light_blue_toolbox.json 549882a0f4de60906ca870a6197330f81d4e1afe assets/create/blockstates/light_blue_valve_handle.json fa5fb2be73c7c54b70e927b66adf3f4d64c5cb6b assets/create/blockstates/light_gray_nixie_tube.json -9af388892d4ae6c4a91dc6021e4f15a504b82695 assets/create/blockstates/light_gray_postbox.json 3d95c9c4442d1bdd660bae382c72c68134db86dd assets/create/blockstates/light_gray_sail.json 8ec5144da4a49dd5b497af07b0d4b88c9c0b6cc0 assets/create/blockstates/light_gray_seat.json -f1901887cd166296e465133c3b0d7ad0d664a614 assets/create/blockstates/light_gray_table_cloth.json 35b151db396069b146d223fbe46be5b0c3dda8a9 assets/create/blockstates/light_gray_toolbox.json 894827ffd176bc733abecf18d96888e9ed5a3eb4 assets/create/blockstates/light_gray_valve_handle.json -a6f319c803c03e34bbf841ea52d82f0f7ec7a413 assets/create/blockstates/limestone.json -7ff65e1c4c8e48a0b694cd17506a192e6a7e6e44 assets/create/blockstates/limestone_pillar.json 7f20b548dd535942b2d6f41c39de7ad4fafe637e assets/create/blockstates/lime_nixie_tube.json -c6ac740bf37477ad170576983230b130ac01f355 assets/create/blockstates/lime_postbox.json ad1ec304729fd6d336c0d4d0c27c9345af636695 assets/create/blockstates/lime_sail.json b9934a558e1b495403dc2c71ffb43cce7d396013 assets/create/blockstates/lime_seat.json -7c5dc2ffd0bd44ba8785b6a788030714a009bcbc assets/create/blockstates/lime_table_cloth.json 49a02f7fc16697ba1cf16cee7e45ab6bfd8b06ce assets/create/blockstates/lime_toolbox.json ba181485f219d3ae23509a7edf28e25d9edb10f4 assets/create/blockstates/lime_valve_handle.json +a6f319c803c03e34bbf841ea52d82f0f7ec7a413 assets/create/blockstates/limestone.json +7ff65e1c4c8e48a0b694cd17506a192e6a7e6e44 assets/create/blockstates/limestone_pillar.json 654e845cebed82b7afbcf81380921e0a475b01e9 assets/create/blockstates/linear_chassis.json e195e82e4d0c1fc20474535bc9068cbb77a5e175 assets/create/blockstates/lit_blaze_burner.json 296186b196af94e1ab3f7e8a3254f6d31ae47a5c assets/create/blockstates/magenta_nixie_tube.json -725e695b70bc6aac379fae422c86bed92612e504 assets/create/blockstates/magenta_postbox.json f150922cbed1c05fb3892d4ac91eb471234252e2 assets/create/blockstates/magenta_sail.json bb1ab5c70647933400b3a99ef9d166ba5e3d4709 assets/create/blockstates/magenta_seat.json -a09b8c51cfbb1c9c8a4f670a83cd81c376fe4ba3 assets/create/blockstates/magenta_table_cloth.json fcd226c7863262d98765c701538bf9e44d2b177e assets/create/blockstates/magenta_toolbox.json ecf670d95969a33a738f59e08393299891f78847 assets/create/blockstates/magenta_valve_handle.json 8a30c1ed277ec60963abbcb24cce6efd162d02d3 assets/create/blockstates/mangrove_window.json @@ -369,28 +334,22 @@ ba9c3ecfacbd398048440d247decffeaefc714b5 assets/create/blockstates/mysterious_cu 7f2c5728e24d60ed2f7a095e3a954d7ca4e410e9 assets/create/blockstates/oak_window_pane.json df91d0ca68934c1afd9858a8d1591dd4cb88df65 assets/create/blockstates/ochrum.json 09c9bee3d26edc4b87cb7a5042f125c439ee5956 assets/create/blockstates/ochrum_pillar.json -42f108813ed68f4492d0a168d52f31bbe2e5635b assets/create/blockstates/orange_postbox.json af4c2c4861d1410e1b7371a5bf3fe09ed3ab0077 assets/create/blockstates/orange_sail.json aab812cecf7d10d4e7587f4dead8a98238a15f41 assets/create/blockstates/orange_seat.json -27d90736a8d64fe7f742a6e5874b8d5843f5dd2d assets/create/blockstates/orange_table_cloth.json 2bc30ed9907230271b4e2d0786f106f3e1e25029 assets/create/blockstates/orange_toolbox.json 2af63a4768f84fc93c7e7d67fa9a64438433e59f assets/create/blockstates/orange_valve_handle.json 515ed7dae09b052f289419ba09998a23e0d7083d assets/create/blockstates/ornate_iron_window.json 8118444f37536b9104ef4818d374b0c8a7c987bf assets/create/blockstates/ornate_iron_window_pane.json -97cd78453af94f44cef1187988966626574b29d5 assets/create/blockstates/oxidized_copper_shingles.json 2ddc762b8d8558e69a2f81c028702f3a25b5e978 assets/create/blockstates/oxidized_copper_shingle_slab.json ac536ae742c12e97bfd0b2483c87ff29f3935eaf assets/create/blockstates/oxidized_copper_shingle_stairs.json -110a6c19bcc9f044e5e982ac6e4b295b03ec0145 assets/create/blockstates/oxidized_copper_tiles.json +97cd78453af94f44cef1187988966626574b29d5 assets/create/blockstates/oxidized_copper_shingles.json 3f3924f0f0e368edfa04f4fdd6d6c2319276ddfe assets/create/blockstates/oxidized_copper_tile_slab.json 5e634cfb9abb06d8b29f39d751fc56b28ea5a9cd assets/create/blockstates/oxidized_copper_tile_stairs.json -65f3fa5a068189c1c2971af1a1052f69c0e26005 assets/create/blockstates/packager.json -887565a0f89f089d6be888c87394dde4878afda7 assets/create/blockstates/package_frogport.json +110a6c19bcc9f044e5e982ac6e4b295b03ec0145 assets/create/blockstates/oxidized_copper_tiles.json 36742cc6ce052ead143366d31b11e828a525c1b8 assets/create/blockstates/peculiar_bell.json 53d102e706d53cb2c0dbc0bc11da828084a43519 assets/create/blockstates/pink_nixie_tube.json -db7ef5acb1ce2d3b8f881f34b5d9f40633c3973d assets/create/blockstates/pink_postbox.json 213da5c04a33ae8ae7c0a4dec9844bbb6d670e33 assets/create/blockstates/pink_sail.json 8d5c80d5dc561240dfe8d7f212ffc33ac4e0fcd8 assets/create/blockstates/pink_seat.json -2698986d23ccd7b828af6150d04f0139255a5bf1 assets/create/blockstates/pink_table_cloth.json 90bd26c7c6933f5ebbe17b0fe58f840e2924a0f5 assets/create/blockstates/pink_toolbox.json 9f698d0fe8cfd3c9b727ec00623e6d473d516d4a assets/create/blockstates/pink_valve_handle.json 73c2a6e6e2e0dad1bdcf2d8b089b28dd4c72c825 assets/create/blockstates/piston_extension_pole.json @@ -459,29 +418,22 @@ b1f5ad596067cb4c84eb53b2c7b359be76f1cfbe assets/create/blockstates/powered_shaft df7af1e49c53ae99ac3f0b2fca5d948b8ea91938 assets/create/blockstates/pulley_magnet.json 89d763258c53aa12a1e0c0e586ab701f3de5a1b5 assets/create/blockstates/pulse_extender.json 81281435b8d1eeb4f1e318c6d14d49fa1fd86820 assets/create/blockstates/pulse_repeater.json -65bfd8283749117663f7199204691758fd286e38 assets/create/blockstates/pulse_timer.json b658654aa97e8dd2c897f432a601835a3f8aca10 assets/create/blockstates/purple_nixie_tube.json -6fa2954396474f97dab79955e4bd75346b04acc5 assets/create/blockstates/purple_postbox.json f8f9802df9c0b4e39edeefc3b1abb38255d79801 assets/create/blockstates/purple_sail.json 91b5ab66d7ec5235d278ee2bed6ddd88f39ce81d assets/create/blockstates/purple_seat.json -a4b6bd4e55cd292abf752efeda93cf8d23162657 assets/create/blockstates/purple_table_cloth.json 6aa467b3588359fdf5d7201f844193d5b70f20f7 assets/create/blockstates/purple_toolbox.json 6d02761efbb93349654514f67f5c0b7331e2823a assets/create/blockstates/purple_valve_handle.json 3aca01f2eddb22adb1b25735b98a990bfc7220d2 assets/create/blockstates/radial_chassis.json 72faac9777be540f95f8b662a833856e0e1b8f35 assets/create/blockstates/railway_casing.json 7ce346fa18702f6fe6e2a939efcfa26eda63fe38 assets/create/blockstates/raw_zinc_block.json -ec546afd3ec8036e4393b97d535f05a86f57dbc1 assets/create/blockstates/redstone_contact.json -ff205f032b36486753dddb1f2029ef8d53e9c86f assets/create/blockstates/redstone_link.json -e4c645b199a2d7e89c91065071a0a91df5ca8e3c assets/create/blockstates/redstone_requester.json e3fd62e466e3e6e7bd6fc8661f764ba972a466fc assets/create/blockstates/red_nixie_tube.json -d14d6437a6727da13cea5f7eeb815720c80dde6f assets/create/blockstates/red_postbox.json 4c36b562da58ef2af57009da7cf2426059249228 assets/create/blockstates/red_sail.json 145f4e9ffaeff9be180e6c4e4989f2cf44cf0686 assets/create/blockstates/red_seat.json -90bf31515faa2e7e6d73414a6c5498911910710e assets/create/blockstates/red_table_cloth.json 380f46b7cb72b13c0f16fd4a4287a1a33adeff41 assets/create/blockstates/red_toolbox.json b689d87a27ed0cb2cab190a2ad2b599818bff56c assets/create/blockstates/red_valve_handle.json +ec546afd3ec8036e4393b97d535f05a86f57dbc1 assets/create/blockstates/redstone_contact.json +ff205f032b36486753dddb1f2029ef8d53e9c86f assets/create/blockstates/redstone_link.json 87ab7ca62ecf24d60d7e5c61bd5af97714dad0ad assets/create/blockstates/refined_radiance_casing.json -64a5b256e5af2dc8cb7ed77f0feadcf5134f7335 assets/create/blockstates/repackager.json 3807bcc6ccc3dad0dbfcc8fcf260a361aa488659 assets/create/blockstates/rope.json baa7da231c6c45d5eabaf04985d46e206a3346f8 assets/create/blockstates/rope_pulley.json a8b42f047fe9099f81334e2e1082067de67549db assets/create/blockstates/rose_quartz_block.json @@ -489,8 +441,8 @@ dd63fd8443a2be507281548df838d878b0c3c8c8 assets/create/blockstates/rose_quartz_l dfe69ee57f832a2e4c576ee01bdde1617c81e46a assets/create/blockstates/rose_quartz_tiles.json b9cbbc7c4e1d9abd312263a9a270315bd5f0106b assets/create/blockstates/rotation_speed_controller.json 5a25ecb95b7978cc487491cb24478e4d6a73e977 assets/create/blockstates/sail_frame.json -bff758cc56bece375b40c32067b903b675065328 assets/create/blockstates/schematicannon.json 505510656c77d93ecd3691e7111615193275f29e assets/create/blockstates/schematic_table.json +bff758cc56bece375b40c32067b903b675065328 assets/create/blockstates/schematicannon.json 82c9ceb19cfc4e247fbb62a9605630ba08423efe assets/create/blockstates/scorchia.json 6fa99d5f1ff05153660f9917286d4b157eaa1b40 assets/create/blockstates/scorchia_pillar.json 8c34743564aa0473745ecec304a19e15e9e87cf2 assets/create/blockstates/scoria.json @@ -499,64 +451,64 @@ e5aff9dc8fa5e98b060232974194afb06d497d09 assets/create/blockstates/scoria_pillar 3343224d6da4e75f0bc7a7634ba010a4ba54ad70 assets/create/blockstates/sequenced_gearshift.json 4c261d54117ee295b307f6ea3e56a09437631f73 assets/create/blockstates/shadow_steel_casing.json 4c67d2a1a1faea5be2a81ebc0722c32d8e2e84d6 assets/create/blockstates/shaft.json -c606f103619088e8a5afe969ba54929af480a3d2 assets/create/blockstates/small_andesite_bricks.json c5469de5957d77fc11febaa658ee2bfb0d11b0bc assets/create/blockstates/small_andesite_brick_slab.json ed0bcfd07959aa208085910bd3780756979c985d assets/create/blockstates/small_andesite_brick_stairs.json 78e30e63adedf1ca95261eb4010a1db45aecfe9e assets/create/blockstates/small_andesite_brick_wall.json -b9fedc13dc8cb53a8bb16ce2257ea65f0ac94a6b assets/create/blockstates/small_asurine_bricks.json +c606f103619088e8a5afe969ba54929af480a3d2 assets/create/blockstates/small_andesite_bricks.json 653fa70f0aa7fc319d50f72692d507ff7c59c0f4 assets/create/blockstates/small_asurine_brick_slab.json e61a0b891729565434d6ab34aa3aeada7d189f9d assets/create/blockstates/small_asurine_brick_stairs.json 02556b916c198c683279eb4392ebaa31fb41e182 assets/create/blockstates/small_asurine_brick_wall.json +b9fedc13dc8cb53a8bb16ce2257ea65f0ac94a6b assets/create/blockstates/small_asurine_bricks.json e986248237013eea755bccd300f745e44d0a183f assets/create/blockstates/small_bogey.json -031d9492dbcc5de77431e8f54b9b04db412b5690 assets/create/blockstates/small_calcite_bricks.json 898bca10ff6e5402c4b8b84e1b9ba9036b32b8bc assets/create/blockstates/small_calcite_brick_slab.json ecc2276bdb2b24f54e31372bf207171a348e55d3 assets/create/blockstates/small_calcite_brick_stairs.json d9dd243b5b754a487755b53609d404ac1b3fde99 assets/create/blockstates/small_calcite_brick_wall.json -3d4e0b54ffda83f7f6e08b6a745db81049d95f3b assets/create/blockstates/small_crimsite_bricks.json +031d9492dbcc5de77431e8f54b9b04db412b5690 assets/create/blockstates/small_calcite_bricks.json 4094bf00cad8dea2dd234866b482c07175802c4c assets/create/blockstates/small_crimsite_brick_slab.json 7f73a2505e2a3a98a7749fa98f4623aa2d216edd assets/create/blockstates/small_crimsite_brick_stairs.json b477c7f1855c9eb2ef1bf672376e972678dc563f assets/create/blockstates/small_crimsite_brick_wall.json -17359d1b87399bb066cfc23002bcf0d8f71d8ccd assets/create/blockstates/small_deepslate_bricks.json +3d4e0b54ffda83f7f6e08b6a745db81049d95f3b assets/create/blockstates/small_crimsite_bricks.json c67f32adc49f0b24b34f098a390a398813365260 assets/create/blockstates/small_deepslate_brick_slab.json d05aed31d45ed12f8f117a9c64312b1abff8bd2f assets/create/blockstates/small_deepslate_brick_stairs.json 6952b02d8c5adf3d0d1a243221b637c50edaa287 assets/create/blockstates/small_deepslate_brick_wall.json -6c0ac59e09feb76afc078a88431442a2a6381c6c assets/create/blockstates/small_diorite_bricks.json +17359d1b87399bb066cfc23002bcf0d8f71d8ccd assets/create/blockstates/small_deepslate_bricks.json ee39994b434a17ec7497b271a6e0a006cf6311cb assets/create/blockstates/small_diorite_brick_slab.json eb335cf0a857299b9cd0c4f60e00bc8e4ca7efe8 assets/create/blockstates/small_diorite_brick_stairs.json b6f7c563c30483c749849899b96d4f0030b71df1 assets/create/blockstates/small_diorite_brick_wall.json -d51095bfb9d5758f8b3972a973fbe282569b0234 assets/create/blockstates/small_dripstone_bricks.json +6c0ac59e09feb76afc078a88431442a2a6381c6c assets/create/blockstates/small_diorite_bricks.json 3d8109d327099c65ca0fafcb5651051059cad1df assets/create/blockstates/small_dripstone_brick_slab.json 3931e24229db79115ffe2a9f3a069202b9b8dcab assets/create/blockstates/small_dripstone_brick_stairs.json 0d16cefcb8e619bc81ef65111d16d331db58d0aa assets/create/blockstates/small_dripstone_brick_wall.json -11dcaf8a6da96d178024b4c3ee76b9c373e5d082 assets/create/blockstates/small_granite_bricks.json +d51095bfb9d5758f8b3972a973fbe282569b0234 assets/create/blockstates/small_dripstone_bricks.json 096b064f28fbe381e1b637d4668550851cbbb2c2 assets/create/blockstates/small_granite_brick_slab.json e99cc3251937fbf9fc858623d5ea525ed5b79704 assets/create/blockstates/small_granite_brick_stairs.json 62f2b570ac6073c8a98369523095d2c18a353eed assets/create/blockstates/small_granite_brick_wall.json -346dbff9a84b988bd9c9af670b486b6af5e18179 assets/create/blockstates/small_limestone_bricks.json +11dcaf8a6da96d178024b4c3ee76b9c373e5d082 assets/create/blockstates/small_granite_bricks.json d640eed81abaa013ed1c53d68a552f639168ae8b assets/create/blockstates/small_limestone_brick_slab.json d470967200aa6ca618421cf375140b352c45cc90 assets/create/blockstates/small_limestone_brick_stairs.json 8d4a1eff66a3f45d595ff8371c0d1ebaa0ba1773 assets/create/blockstates/small_limestone_brick_wall.json -1464b01d4c8bd9ec56460c1250fd4bb07e936e22 assets/create/blockstates/small_ochrum_bricks.json +346dbff9a84b988bd9c9af670b486b6af5e18179 assets/create/blockstates/small_limestone_bricks.json ddee92141e00898e8d70145cf00c0d64f56b4f48 assets/create/blockstates/small_ochrum_brick_slab.json bad9a5820c64c125494c0eba4f6c7ebebe93341c assets/create/blockstates/small_ochrum_brick_stairs.json ed899a18522adc70ae46185c308904c8de5b5834 assets/create/blockstates/small_ochrum_brick_wall.json +1464b01d4c8bd9ec56460c1250fd4bb07e936e22 assets/create/blockstates/small_ochrum_bricks.json c520e9ba54ff6dfb96f7863bb093cdf15cc95ce4 assets/create/blockstates/small_rose_quartz_tiles.json -371ff795eb4e7cb1220d307abf8cb003f455cbec assets/create/blockstates/small_scorchia_bricks.json 384a1331b92b7beba988f729bb7cda42abec0172 assets/create/blockstates/small_scorchia_brick_slab.json 046a84030a23f5a40f4deac13f2e60ced436cadf assets/create/blockstates/small_scorchia_brick_stairs.json 58bc6e3bb10ed72b8cb5813a88cab300d1183b7d assets/create/blockstates/small_scorchia_brick_wall.json -0aa51dbfda8349b878e2f6c9bb3314fcfc1a9c39 assets/create/blockstates/small_scoria_bricks.json +371ff795eb4e7cb1220d307abf8cb003f455cbec assets/create/blockstates/small_scorchia_bricks.json 5b227400e588abae33c1682196f098adc8006d13 assets/create/blockstates/small_scoria_brick_slab.json 51420bb12b757d3888fd1ceb5c21d83b42bd2266 assets/create/blockstates/small_scoria_brick_stairs.json 36e9bd161fa4ffe18f07153b2945cfeae55e7c0b assets/create/blockstates/small_scoria_brick_wall.json -c1f9f986dd0bfdbdee210c6c7d71981b251c27db assets/create/blockstates/small_tuff_bricks.json +0aa51dbfda8349b878e2f6c9bb3314fcfc1a9c39 assets/create/blockstates/small_scoria_bricks.json 8d1af444031291fe58d850ae344aaf7e97b8bd87 assets/create/blockstates/small_tuff_brick_slab.json 26879e6cadf0035c3eed4b54b3a1fdc0c080a485 assets/create/blockstates/small_tuff_brick_stairs.json 5d58ca7b81ae537454c3cdbb5fc8aacca83cff3f assets/create/blockstates/small_tuff_brick_wall.json -ad79aa8ff306695f65386fdeb44c5285547934b6 assets/create/blockstates/small_veridium_bricks.json +c1f9f986dd0bfdbdee210c6c7d71981b251c27db assets/create/blockstates/small_tuff_bricks.json 6226471fdcadbbf0e02704bb0e7de607e99302a8 assets/create/blockstates/small_veridium_brick_slab.json b54200ebe65c4ad2e5661c81ba5bf939039277ca assets/create/blockstates/small_veridium_brick_stairs.json 0237d58443ca9dc2a9186c2387dd6633702a7598 assets/create/blockstates/small_veridium_brick_wall.json +ad79aa8ff306695f65386fdeb44c5285547934b6 assets/create/blockstates/small_veridium_bricks.json 4d987859e5f5a930c20e955919304088fb6fc6d1 assets/create/blockstates/smart_chute.json 57fc35b2e0ae9ab16c011abd95f507910c70a234 assets/create/blockstates/smart_fluid_pipe.json a70c025de5d85180f371ff05bbdc531d8bdfaab1 assets/create/blockstates/speedometer.json @@ -568,9 +520,7 @@ a60c9c8241e40c2e28f5760c0ca6e80cfe9d59f3 assets/create/blockstates/steam_whistle 636ec6c7e1ef3b737edc716200f138bc63681d78 assets/create/blockstates/steam_whistle_extension.json 8865500bcd2e4d467e74edb3509850fa92a5809f assets/create/blockstates/sticker.json bed0534e618105184bc877b104230403ca85bb58 assets/create/blockstates/sticky_mechanical_piston.json -c7c17ff17b98ce85d355f2f9b4509271bc283843 assets/create/blockstates/stockpile_switch.json -2d66ca4b6916eac170b3b8552705b699f569bae2 assets/create/blockstates/stock_link.json -9989bda294fbffc5f659d2e608e01dea424c7694 assets/create/blockstates/stock_ticker.json +bab242ab794e6d439645c2d5a0242ae7c81942ff assets/create/blockstates/stockpile_switch.json a70c025de5d85180f371ff05bbdc531d8bdfaab1 assets/create/blockstates/stressometer.json 8086f80c532fad42b37fcdc590b890ed7e8c3fe9 assets/create/blockstates/tiled_glass.json 1143ab7223c655764a81ed72ac385ea179664072 assets/create/blockstates/tiled_glass_pane.json @@ -590,60 +540,53 @@ bfb2b7eabba2e7aef4d783328c8a5a1558e7e493 assets/create/blockstates/turntable.jso 116d0a8fb72bcc00bd511db7893ea3e96efda297 assets/create/blockstates/warped_window_pane.json fa3d300520e3bedb926696d9980cbeeb54cfdc68 assets/create/blockstates/water_wheel.json 3dff9e1ec59415779195d2abfa9f07bc17b428a1 assets/create/blockstates/water_wheel_structure.json -2ae175c489b86b78b4646306250ca2dba66b0a5e assets/create/blockstates/waxed_copper_shingles.json 85ed36dcb0a3542e0638601116360202a9670d53 assets/create/blockstates/waxed_copper_shingle_slab.json aaf49f1b6785e2195c5dc2e8792c99c960745f89 assets/create/blockstates/waxed_copper_shingle_stairs.json -835bfe0d2137ad60e5f8322fa4449d5c7a02187f assets/create/blockstates/waxed_copper_tiles.json +2ae175c489b86b78b4646306250ca2dba66b0a5e assets/create/blockstates/waxed_copper_shingles.json b52eda74c9000507a4f34e10fbd1a7846b66c16d assets/create/blockstates/waxed_copper_tile_slab.json 5428969f6f27213d0ec5140d911b3844b5332006 assets/create/blockstates/waxed_copper_tile_stairs.json -306b9cd1efe3abd1fcca11bc464560837fb8fdfa assets/create/blockstates/waxed_exposed_copper_shingles.json +835bfe0d2137ad60e5f8322fa4449d5c7a02187f assets/create/blockstates/waxed_copper_tiles.json bc8f3bb75bdb094c8372d61a68927270d3347437 assets/create/blockstates/waxed_exposed_copper_shingle_slab.json 32382e5f524b50393080fdbd2415a98ddb700c9c assets/create/blockstates/waxed_exposed_copper_shingle_stairs.json -ae92a9051f1603e7ad4f93cb668706ccffc7a85b assets/create/blockstates/waxed_exposed_copper_tiles.json +306b9cd1efe3abd1fcca11bc464560837fb8fdfa assets/create/blockstates/waxed_exposed_copper_shingles.json ca37c3e54d5c78a77fcb4a4aca004a34e271f246 assets/create/blockstates/waxed_exposed_copper_tile_slab.json a864f82ccd6b3e0fa181c800da886ebd3239fb82 assets/create/blockstates/waxed_exposed_copper_tile_stairs.json -729ca65a140b3d7571a2072f7406cc5f4a2e27c5 assets/create/blockstates/waxed_oxidized_copper_shingles.json +ae92a9051f1603e7ad4f93cb668706ccffc7a85b assets/create/blockstates/waxed_exposed_copper_tiles.json ef99e849f9dd6ad53ddf04625c81750f11eaae1c assets/create/blockstates/waxed_oxidized_copper_shingle_slab.json 9386068220f9bb5d2f6d3cc408dc4f78f26b4eeb assets/create/blockstates/waxed_oxidized_copper_shingle_stairs.json -17acf3486e92aabc3efbe99fa1e5d7d664e6ec97 assets/create/blockstates/waxed_oxidized_copper_tiles.json +729ca65a140b3d7571a2072f7406cc5f4a2e27c5 assets/create/blockstates/waxed_oxidized_copper_shingles.json fe79f7eab017d714c0331664a3a2b5579104194e assets/create/blockstates/waxed_oxidized_copper_tile_slab.json 10bbe77a0334b5578b1ec40b398a45cf7d2bb534 assets/create/blockstates/waxed_oxidized_copper_tile_stairs.json -079acbfd6a9375899687b581f95bbe74940afce2 assets/create/blockstates/waxed_weathered_copper_shingles.json +17acf3486e92aabc3efbe99fa1e5d7d664e6ec97 assets/create/blockstates/waxed_oxidized_copper_tiles.json 73572bbe16957e63853ee425d8f34d98e14e4a10 assets/create/blockstates/waxed_weathered_copper_shingle_slab.json ab05925d5bb70e53fec9c149982304f31acd2b1a assets/create/blockstates/waxed_weathered_copper_shingle_stairs.json -202b0f2e6fca9eab949f47eaa1f4ddee249a633a assets/create/blockstates/waxed_weathered_copper_tiles.json +079acbfd6a9375899687b581f95bbe74940afce2 assets/create/blockstates/waxed_weathered_copper_shingles.json fc1b53d3b2b1f0977069abec3c376f3f5c4cd7c8 assets/create/blockstates/waxed_weathered_copper_tile_slab.json 6cd93476a45c3b77f5eda66f68425bae486cfba8 assets/create/blockstates/waxed_weathered_copper_tile_stairs.json -c11562afd9a5f85945e521dcea5f911d1b6d13c6 assets/create/blockstates/weathered_copper_shingles.json +202b0f2e6fca9eab949f47eaa1f4ddee249a633a assets/create/blockstates/waxed_weathered_copper_tiles.json 5a5a1e95988edb7a2b6dc6c6ba5677c2d896a5ae assets/create/blockstates/weathered_copper_shingle_slab.json 07019fc8890cb5e966a42ca636a0ab9cf71cc881 assets/create/blockstates/weathered_copper_shingle_stairs.json -236e072d9056c0dbffdf5d7d973a85a56c2c8de1 assets/create/blockstates/weathered_copper_tiles.json +c11562afd9a5f85945e521dcea5f911d1b6d13c6 assets/create/blockstates/weathered_copper_shingles.json fee668eb9a45dca0d287fee5811219d69f9ec3e2 assets/create/blockstates/weathered_copper_tile_slab.json da110f382368257e15431c77164aef82e014e3f8 assets/create/blockstates/weathered_copper_tile_stairs.json -64fb3e569da401635b64e71e01ea0b3ff6360611 assets/create/blockstates/weathered_iron_block.json -6fd81f1eb48fbfc44df9db8eedc613690c9b8ef5 assets/create/blockstates/weathered_iron_window.json -1aed351050d73989c4553bf49ce03b3a8fdd210e assets/create/blockstates/weathered_iron_window_pane.json +236e072d9056c0dbffdf5d7d973a85a56c2c8de1 assets/create/blockstates/weathered_copper_tiles.json 25ce64b7af5d244f194da91ccf964a9bf5762327 assets/create/blockstates/weighted_ejector.json 2974b34a8cfb0d4e8e010f8bd085584ea631d541 assets/create/blockstates/white_nixie_tube.json -3de81b9e34425a9d3a25c657dabd24d74bf01456 assets/create/blockstates/white_postbox.json f079469d186087d23f0d91b384040f777b0088b1 assets/create/blockstates/white_sail.json 317a6463db64b66d215d25b65ab52fe7f26ba9f8 assets/create/blockstates/white_seat.json -9013272715c2ed3104457a50a6f0795a7c33fc43 assets/create/blockstates/white_table_cloth.json 6cb8c82a429b54d6a87d02eec5cfd1fcd5365f1e assets/create/blockstates/white_toolbox.json c0bfe8416173868f9916c4a54dd9f983887c5bac assets/create/blockstates/white_valve_handle.json ec2720e3f1bc84304d0c81cd23ff1e155b0c2f2c assets/create/blockstates/windmill_bearing.json d688e80dfbd5b17970814887c3698fc721981caa assets/create/blockstates/wooden_bracket.json 157942a838aa02909fb2238ad9ce77edc82f6142 assets/create/blockstates/yellow_nixie_tube.json -f3d0a1335e0d9cd592e177d51a36206749346676 assets/create/blockstates/yellow_postbox.json 68b6e267e93b96dbc0596ea4a1cd26636aa0e04a assets/create/blockstates/yellow_sail.json 4face2dd50a30bda0b21742319e701e666d51f8c assets/create/blockstates/yellow_seat.json -38135a1fda544b7b9624ebfa08d46351bd31ec89 assets/create/blockstates/yellow_table_cloth.json b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbox.json fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -489862e6fd08eb168d1a45620dfadfc71ccb2d2c assets/create/lang/en_ud.json -15c0c9ffe04f1c3428bc0e2172bc1ae89a21cffa assets/create/lang/en_us.json +d3d30a92e4f63e8acb6aa3e3358b6e8340aa8cc1 assets/create/lang/en_ud.json +a50be2f8a02b0fdd2b5a8aae9cf8df1490015707 assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -697,19 +640,12 @@ b39661fd20e4b3f5ab2b20cbd51af4ca98e2410e assets/create/models/block/andesite_lad 32551174974fde322de14af09afb160673c4ed23 assets/create/models/block/andesite_scaffolding_horizontal.json e20105b4d1762fbfe67377e08cdb8c7ff9a62128 assets/create/models/block/andesite_side.json b58e7204eef795080abf9fffa41ba11ec2e12426 assets/create/models/block/andesite_side_alt.json -f9bc3af98dedae53161917c78a76353d1a270e7b assets/create/models/block/andesite_table_cloth.json 378df94de8cbce28cd3c2dc30fd3a30dfc451cdd assets/create/models/block/asurine_natural_0.json d6eb7105dd9b42adde48bd70e3f2fba70751c1db assets/create/models/block/asurine_natural_1.json 6d77d2591579619aa1ebb7b2f0e2c939e1648e4a assets/create/models/block/asurine_natural_2.json e80a3d387e8c40bf886735d46a119f9a93c6f5a8 assets/create/models/block/asurine_natural_3.json 1c3ddf07bdd9fc5fcf7c1f35c7a06846cc1add54 assets/create/models/block/asurine_pillar.json 403efa3dcd07e94c351594cc6c5b5becc15e6690 assets/create/models/block/asurine_pillar_horizontal.json -daac4c886b0485449eff2f87d82754d387baba93 assets/create/models/block/bamboo_window.json -75f28c83adcd81ddd7f073596b04ddc5809b421e assets/create/models/block/bamboo_window_pane_noside.json -e70e053d438ec435395c416c6fa7a06aa0527762 assets/create/models/block/bamboo_window_pane_noside_alt.json -568c8603c7606bf77958d0855a7471e6a935bb54 assets/create/models/block/bamboo_window_pane_post.json -d9c964d9e0d77249f1e5caac8fc419ae533ee828 assets/create/models/block/bamboo_window_pane_side.json -c60adf74c20091675c4c9293e69fcc8ded8fef93 assets/create/models/block/bamboo_window_pane_side_alt.json 930e154155eaba67acb96109472b6d8c502907dc assets/create/models/block/birch_window.json 3ba397e70b642bdfa458dd3046b094ccf73b42e5 assets/create/models/block/birch_window_pane_noside.json 3ff792e09a83b47640083f4da20701e47e6a46bb assets/create/models/block/birch_window_pane_noside_alt.json @@ -717,19 +653,13 @@ ee71b0992edc2496025c22806e8de3a3243882aa assets/create/models/block/birch_window 3088aa5e46cf9caa912c80a4e7791904e64e9def assets/create/models/block/birch_window_pane_side.json cb9d3a0dbac6a884d5ce0dc82085322f8c666707 assets/create/models/block/birch_window_pane_side_alt.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/black_nixie_tube.json -1fe4a9cbcae773f32c07f7cef42f52588ec1c1aa assets/create/models/block/black_postbox_closed.json -3caec00f8aa36393cac8049815b3e8bad12d8dae assets/create/models/block/black_postbox_open.json 62c92a681b5a86a5415cc7a70263ffdc794cdd59 assets/create/models/block/black_sail.json 443ed49b053fdd7356cd56f0495e18f2570d57d9 assets/create/models/block/black_seat.json -6f85d70c8fb017e80290a5832cdaf07ad3306b50 assets/create/models/block/black_table_cloth.json f48989d377de8e5067e807adf7e38da781e37ed9 assets/create/models/block/black_toolbox.json 8715787d72c3ef47c5651abcd819539bad6a96f7 assets/create/models/block/black_valve_handle.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/blue_nixie_tube.json -e9e9487a3440b3a6c1ac515f63385ee59e8fb773 assets/create/models/block/blue_postbox_closed.json -7e2df652bfc7fdc27da6a52b52fe732fa175c996 assets/create/models/block/blue_postbox_open.json ddc740084aa5f387bee062bd4141ad8fadb56355 assets/create/models/block/blue_sail.json 96431b1f3a531ce89f876c9286b81838aec9b6d3 assets/create/models/block/blue_seat.json -97aef30303b851c28d4911bf2c6ad8033df628df assets/create/models/block/blue_table_cloth.json 89932aab163b14a21fffd4fab4b8b88a94163089 assets/create/models/block/blue_toolbox.json 3e052466f0b8db75779945c0f1231af9611b723e assets/create/models/block/blue_valve_handle.json 159e2b37a0866c9dbcdd6554be8a207883098168 assets/create/models/block/bracket/cog/ground_metal.json @@ -779,23 +709,13 @@ b2a95218042586aae38dff9278f3ee3f159bc73e assets/create/models/block/brass_post_e 62d99236e09b11af9a24d3c667fb1167cf8db0b0 assets/create/models/block/brass_scaffolding_horizontal.json ec81e9c237ec98b30a3de22e12cb9720922478eb assets/create/models/block/brass_side.json c697cace1f4097468ff34254c4ff6450d9d52f91 assets/create/models/block/brass_side_alt.json -f0552bba877b84ae81051019961cf87d13f976f4 assets/create/models/block/brass_table_cloth.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/brown_nixie_tube.json -b04c80852527a07e01c27686be678cbaf568e821 assets/create/models/block/brown_postbox_closed.json -19a2045ecedd3ef12cda7d69a0d7bc6a4133b7f1 assets/create/models/block/brown_postbox_open.json 50a054d1e0660d16e86cf7a520b9bf36e38401b6 assets/create/models/block/brown_sail.json 0616de192825246e6036d1f69911170438a83b81 assets/create/models/block/brown_seat.json -eb829b796cea3387cb25ace858c795e2497b3703 assets/create/models/block/brown_table_cloth.json 4226a7c5f1bfb0a75457fb4dfd22448503110e5c assets/create/models/block/brown_toolbox.json 0e1fece0854ccea20df2f0abc865e4f44af54d1a assets/create/models/block/brown_valve_handle.json 40a224ce4ea989599f7bd66bd2437ac2b98247d8 assets/create/models/block/calcite_pillar.json 141fc72bb7296c6b5a13499622c0c7384179a7fa assets/create/models/block/calcite_pillar_horizontal.json -09cdcbe8056a81a0a825df47f5cb0e352f98907e assets/create/models/block/cherry_window.json -5275e27c80bdd43b40fa31418dfad175fc809480 assets/create/models/block/cherry_window_pane_noside.json -ae87368850bc6ef1a2e2f633b8ef6ed33ab5b2e0 assets/create/models/block/cherry_window_pane_noside_alt.json -0e5c58632e134aeae3e85e70d7c0ea1ed6e05055 assets/create/models/block/cherry_window_pane_post.json -b13184df1e1c20a7b94fa887ab64845e3b7d0fca assets/create/models/block/cherry_window_pane_side.json -d8e2f395915af41686924cb4654d43097260720c assets/create/models/block/cherry_window_pane_side_alt.json e9d61ba17fa2619af01ef604c3f65cbe9272f010 assets/create/models/block/chocolate.json d8339ab47ffa828985c7da27c37794a95aba8b42 assets/create/models/block/clockwork_bearing.json 8afe6afaff33b94c1fcee68fdaf842d525eec212 assets/create/models/block/copper_cap.json @@ -806,21 +726,20 @@ d063df8e9b974c11fc7810ce176b02d7d924e15b assets/create/models/block/copper_post. 2b5aed4a917694beb33d9b0ecbc800dcbc143ee9 assets/create/models/block/copper_post_ends.json bac7566a726b0fe6d537c744aec4afb383dc165c assets/create/models/block/copper_scaffolding.json dbee65c129740f3b99c07e754b3224d3f9f8c242 assets/create/models/block/copper_scaffolding_horizontal.json -32fdb85b5b62d5a0fb41732874c854788cdd2ba1 assets/create/models/block/copper_shingles.json fb7fb6deebd502946ab57f1b8a9f4a6b5dd48da3 assets/create/models/block/copper_shingle_slab.json 660f61112b8e46dec5050cb0ed4ee936965a7c58 assets/create/models/block/copper_shingle_slab_top.json 5d74be967bbe9feba4b630751f13af817a733d1d assets/create/models/block/copper_shingle_stairs.json 35cb89f29ce3f8d8af13602c08ecd7afbb7cf56a assets/create/models/block/copper_shingle_stairs_inner.json fcb9295f4f388e6d439ec9a3906ca326b6d69077 assets/create/models/block/copper_shingle_stairs_outer.json +32fdb85b5b62d5a0fb41732874c854788cdd2ba1 assets/create/models/block/copper_shingles.json cb218a725f82db34ffe58a5208266e1c768cfc05 assets/create/models/block/copper_side.json d9b4652ca8f1e65007f42d946ecfb38acc3f168f assets/create/models/block/copper_side_alt.json -03a6c5b8bc3041a2be001092f7abd014d6f852a2 assets/create/models/block/copper_table_cloth.json -32f06f39d0b34e4431795aa6e64f87e58dc1597b assets/create/models/block/copper_tiles.json 298c6100de02ed9f813397d8ba38c46f35035c69 assets/create/models/block/copper_tile_slab.json d4422c2d96fb329087d1be70d8b983a8cf6c7f01 assets/create/models/block/copper_tile_slab_top.json fca72048f916d3a3e567b385c948cc1b59711ef4 assets/create/models/block/copper_tile_stairs.json 997479b62ed3d81ab633279ecc2fabd9588a3bf3 assets/create/models/block/copper_tile_stairs_inner.json d5c5bbfb9aaa282e11ad6e6309b1880b172ee653 assets/create/models/block/copper_tile_stairs_outer.json +32f06f39d0b34e4431795aa6e64f87e58dc1597b assets/create/models/block/copper_tiles.json fa2fa91e674eb4de440617049dae34064fd6fa39 assets/create/models/block/copper_valve_handle.json 52ae02c17509e483e35a1b6055296c3a663f85d7 assets/create/models/block/crate/creative/bottom.json 689989ecbd4d59d5836deb8adf7af1d473a377c0 assets/create/models/block/crate/creative/left.json @@ -864,15 +783,15 @@ b3f403f77e3b1b44c56450e387136bca12a84a99 assets/create/models/block/crimson_wind 117d14a1f25cc8ac633bb4cc8a81830a1c016096 assets/create/models/block/crimson_window_pane_side.json ee13522aadfca40f856499d5c29bd86d8f4dda57 assets/create/models/block/crimson_window_pane_side_alt.json 40042ce15d51445ec71b73da34477fa735f3fdd4 assets/create/models/block/cut_andesite.json -5be7d431ac56e2ceb9e3d95589d687f757d5257c assets/create/models/block/cut_andesite_bricks.json -c78e2acf9b54d7370f12e34dcca5c71743f47d55 assets/create/models/block/cut_andesite_bricks_wall_post.json -88e3c8eadf97f772fbafe3b71c8dd27c91c0c0e3 assets/create/models/block/cut_andesite_bricks_wall_side.json -bc264e09c506418b01c6032dcab8ca28080cb70b assets/create/models/block/cut_andesite_bricks_wall_side_tall.json fcbe246aca067dcfeef7afb4e6068b8932da8792 assets/create/models/block/cut_andesite_brick_slab.json e384a98b54ed7317b6ad0e86cf87500491eea824 assets/create/models/block/cut_andesite_brick_slab_top.json 91699e60e29e7524271a2f87200951ee8bfeb8ef assets/create/models/block/cut_andesite_brick_stairs.json e314e0837aed319cdf34a1aaa60f0be6ca169636 assets/create/models/block/cut_andesite_brick_stairs_inner.json aba679c4c6a8d5afc2924d2c9c84af5a2208fde3 assets/create/models/block/cut_andesite_brick_stairs_outer.json +5be7d431ac56e2ceb9e3d95589d687f757d5257c assets/create/models/block/cut_andesite_bricks.json +c78e2acf9b54d7370f12e34dcca5c71743f47d55 assets/create/models/block/cut_andesite_bricks_wall_post.json +88e3c8eadf97f772fbafe3b71c8dd27c91c0c0e3 assets/create/models/block/cut_andesite_bricks_wall_side.json +bc264e09c506418b01c6032dcab8ca28080cb70b assets/create/models/block/cut_andesite_bricks_wall_side_tall.json 8c17ba39e50a440497af089f5fd85649f05bdf8c assets/create/models/block/cut_andesite_slab.json b95ab966cf8c177c799e228759d0cd28c1cfa71f assets/create/models/block/cut_andesite_slab_top.json 81a407a5ff4393b66f784ba4ceee971c3c62de7f assets/create/models/block/cut_andesite_stairs.json @@ -882,15 +801,15 @@ f06abcb3ce691fd30db81b40ea0430462fc972cf assets/create/models/block/cut_andesite 81cef9548137aaff5b6e77d417f387796f2608b2 assets/create/models/block/cut_andesite_wall_side.json dbb99ac37333ee12b7d3859207409aa2599f28eb assets/create/models/block/cut_andesite_wall_side_tall.json a48f77e90c1d02d5b4e6540db723f748118788e9 assets/create/models/block/cut_asurine.json -3b0b7bd63870ac19b9444ce9add9930ec9120821 assets/create/models/block/cut_asurine_bricks.json -89142424e1d702a0f2bc27829304520e48ee1eb3 assets/create/models/block/cut_asurine_bricks_wall_post.json -1f1fcf92e91b1f0d15ba389d6d25e1fba3ad8e5b assets/create/models/block/cut_asurine_bricks_wall_side.json -858d15aff53fe938304bafb52ef32e54e3d44a44 assets/create/models/block/cut_asurine_bricks_wall_side_tall.json 4107317f71d07fb1c113e056c832e963f57b41d7 assets/create/models/block/cut_asurine_brick_slab.json fba2e8dc513184eaa9c4449471b32f206dfe425a assets/create/models/block/cut_asurine_brick_slab_top.json 72bb7b2df330f8d5981f4c12b23429d8d874362d assets/create/models/block/cut_asurine_brick_stairs.json e753ba3830c51539565abbd9b49df9a34f97f2ff assets/create/models/block/cut_asurine_brick_stairs_inner.json ec9182d14517ffc71749e3e016e6546db79e6800 assets/create/models/block/cut_asurine_brick_stairs_outer.json +3b0b7bd63870ac19b9444ce9add9930ec9120821 assets/create/models/block/cut_asurine_bricks.json +89142424e1d702a0f2bc27829304520e48ee1eb3 assets/create/models/block/cut_asurine_bricks_wall_post.json +1f1fcf92e91b1f0d15ba389d6d25e1fba3ad8e5b assets/create/models/block/cut_asurine_bricks_wall_side.json +858d15aff53fe938304bafb52ef32e54e3d44a44 assets/create/models/block/cut_asurine_bricks_wall_side_tall.json b4512f7cef7cef0bc5f85cb955c2dec6de2cbb56 assets/create/models/block/cut_asurine_slab.json 7c1befdd97b1556e9658e968e705c9edbf1ed667 assets/create/models/block/cut_asurine_slab_top.json d04b8a8cf9a50aa7e0b068ceb9a5a2970abc81a7 assets/create/models/block/cut_asurine_stairs.json @@ -900,15 +819,15 @@ ac544a8f948119945aa21362ad26ed8b1c922b0d assets/create/models/block/cut_asurine_ a253210cba60f58e720598323bd0d9ed4c209b4d assets/create/models/block/cut_asurine_wall_side.json c0c2cc13288771699a80c5c80e8e35d352cea684 assets/create/models/block/cut_asurine_wall_side_tall.json a6b10dc7984d22cac7aa314d46ac0928a00e667b assets/create/models/block/cut_calcite.json -6230a499321b175fc441bb662e0655662b3597de assets/create/models/block/cut_calcite_bricks.json -be1462847e9001a062091162802fab2fe6737693 assets/create/models/block/cut_calcite_bricks_wall_post.json -6e6b34468a7a0786efe5f4ebd917a4640b4be6ae assets/create/models/block/cut_calcite_bricks_wall_side.json -8b10c0f4f17f3844cee6d514cc22ddc6cb056c8a assets/create/models/block/cut_calcite_bricks_wall_side_tall.json f046be4f44936946bd3cc2ad5549d112b2e60d97 assets/create/models/block/cut_calcite_brick_slab.json 64953ca8a302ecab9311c617f69e5dcf8c138718 assets/create/models/block/cut_calcite_brick_slab_top.json 19e1b342d05d3cd69c410952dc22507c3c988c15 assets/create/models/block/cut_calcite_brick_stairs.json 18317b0a8bab345abd779f5d43f9620b73df0e67 assets/create/models/block/cut_calcite_brick_stairs_inner.json 0631d4e1bdaf724752f2e55401eb7a54af705b56 assets/create/models/block/cut_calcite_brick_stairs_outer.json +6230a499321b175fc441bb662e0655662b3597de assets/create/models/block/cut_calcite_bricks.json +be1462847e9001a062091162802fab2fe6737693 assets/create/models/block/cut_calcite_bricks_wall_post.json +6e6b34468a7a0786efe5f4ebd917a4640b4be6ae assets/create/models/block/cut_calcite_bricks_wall_side.json +8b10c0f4f17f3844cee6d514cc22ddc6cb056c8a assets/create/models/block/cut_calcite_bricks_wall_side_tall.json 6b35e0f9e6a7e247bf38d8d6d911a2bcc53c2517 assets/create/models/block/cut_calcite_slab.json 0eec7692ee8e119c1258bdb7e852204771c2232d assets/create/models/block/cut_calcite_slab_top.json d07ebf8982e4947852da8b2b0052f6b6000d334f assets/create/models/block/cut_calcite_stairs.json @@ -918,15 +837,15 @@ e8b7b983168ad9f4f4fa1642ca20ff56621935db assets/create/models/block/cut_calcite_ 421e128177bb4dd51391e360f11ba83c5d891cd1 assets/create/models/block/cut_calcite_wall_side.json 5add4bde51bbdd7c229b05f4fabd8a769414fb79 assets/create/models/block/cut_calcite_wall_side_tall.json 2e93da554ea72b90a576bbc9230aea373d3aed0f assets/create/models/block/cut_crimsite.json -39d1a3cdd978c761bc0d67baaba82d11953fc2a0 assets/create/models/block/cut_crimsite_bricks.json -8614cb38c52447fea5245fcf295a951a977071c0 assets/create/models/block/cut_crimsite_bricks_wall_post.json -b0b16f4a2f6dd3f77ec4f65f05e9edb70a196316 assets/create/models/block/cut_crimsite_bricks_wall_side.json -ac41e5b092c6ed81d14004f9427b6151b88dc924 assets/create/models/block/cut_crimsite_bricks_wall_side_tall.json c2474a10109d0476a46d2a509fc1cd37cd52822d assets/create/models/block/cut_crimsite_brick_slab.json efeb149835a389409b7f94bc35765b0871ad7342 assets/create/models/block/cut_crimsite_brick_slab_top.json e5096a1bae43341bae5706f02cd6d564b5a82502 assets/create/models/block/cut_crimsite_brick_stairs.json af3c0018e5e12bbe0f118bc0174b6ca513ae58ae assets/create/models/block/cut_crimsite_brick_stairs_inner.json ed30baef426f2ccf158d87111c7b53f3600bc32a assets/create/models/block/cut_crimsite_brick_stairs_outer.json +39d1a3cdd978c761bc0d67baaba82d11953fc2a0 assets/create/models/block/cut_crimsite_bricks.json +8614cb38c52447fea5245fcf295a951a977071c0 assets/create/models/block/cut_crimsite_bricks_wall_post.json +b0b16f4a2f6dd3f77ec4f65f05e9edb70a196316 assets/create/models/block/cut_crimsite_bricks_wall_side.json +ac41e5b092c6ed81d14004f9427b6151b88dc924 assets/create/models/block/cut_crimsite_bricks_wall_side_tall.json a6cdd4b227210b7487b8431b8d76bbe490636b81 assets/create/models/block/cut_crimsite_slab.json 5c585dba4dbfa9ff0a22a84aa726260cffdeebeb assets/create/models/block/cut_crimsite_slab_top.json 91f60b4277ca48dabfb5d3eebb1ed64a2681a083 assets/create/models/block/cut_crimsite_stairs.json @@ -936,15 +855,15 @@ e6b39a0b1dbab462479fc60fab2efc6a9ceb6a55 assets/create/models/block/cut_crimsite 5b3783862e50fde6ffffc92068900afcc066002f assets/create/models/block/cut_crimsite_wall_side.json b59fbbfe9c6738b1f93f03d59a747f5610164c34 assets/create/models/block/cut_crimsite_wall_side_tall.json 144ec3864fb0a7981e74d357200a96033c75a2d6 assets/create/models/block/cut_deepslate.json -0d599ae1b4e9309f2a7b3362e86061e2150ba3ec assets/create/models/block/cut_deepslate_bricks.json -601894e096edbcd3d96ce0160f06e17a4efca819 assets/create/models/block/cut_deepslate_bricks_wall_post.json -42db46cb5c9c02d684c86f3a518feb3348d83fa0 assets/create/models/block/cut_deepslate_bricks_wall_side.json -c046436d59c350c6beb6b395675513c12184ffe2 assets/create/models/block/cut_deepslate_bricks_wall_side_tall.json af8c7c652e75bf904093bbafc1cf805f842a39c9 assets/create/models/block/cut_deepslate_brick_slab.json 2a01dd0244b07f28454c061a565d1028ca7e3066 assets/create/models/block/cut_deepslate_brick_slab_top.json 62d39eec3621204de82377e74936b9cd338e8004 assets/create/models/block/cut_deepslate_brick_stairs.json 5f90dfbb45b57bd894bf03fcc6c347cb525e3a73 assets/create/models/block/cut_deepslate_brick_stairs_inner.json 512d588c77bdf5a7232826e2f4ce4b3cb991d0ce assets/create/models/block/cut_deepslate_brick_stairs_outer.json +0d599ae1b4e9309f2a7b3362e86061e2150ba3ec assets/create/models/block/cut_deepslate_bricks.json +601894e096edbcd3d96ce0160f06e17a4efca819 assets/create/models/block/cut_deepslate_bricks_wall_post.json +42db46cb5c9c02d684c86f3a518feb3348d83fa0 assets/create/models/block/cut_deepslate_bricks_wall_side.json +c046436d59c350c6beb6b395675513c12184ffe2 assets/create/models/block/cut_deepslate_bricks_wall_side_tall.json c79ae6e97e94d36f2586865ea63f3fab43f8ccbc assets/create/models/block/cut_deepslate_slab.json 5978b93805ccf0bdd953938b34a8dd0ffdcf5565 assets/create/models/block/cut_deepslate_slab_top.json 06a508b2395c3f738d2c5651f366792ee9b9c5ec assets/create/models/block/cut_deepslate_stairs.json @@ -954,15 +873,15 @@ c2850e9f223c459ba53d575a1ef8231589c48c0b assets/create/models/block/cut_deepslat e901746d3e50fe7d9b79d268f4d02251d5cf95f4 assets/create/models/block/cut_deepslate_wall_side.json 1ef794aab31a10bf150a0015cd46e5b5f3c70042 assets/create/models/block/cut_deepslate_wall_side_tall.json 4abb502ea3f6764797641f55a2c48f4858be1ba6 assets/create/models/block/cut_diorite.json -e97babf115a4f81f8555994aba435cf76bebf7a3 assets/create/models/block/cut_diorite_bricks.json -4f7cf44e4d6431587266a4fac78c0812e99d780c assets/create/models/block/cut_diorite_bricks_wall_post.json -1f96f9e190d8e28496ce2db5712f33e449215985 assets/create/models/block/cut_diorite_bricks_wall_side.json -45246192d9cd39837b426e425fc5082422642b65 assets/create/models/block/cut_diorite_bricks_wall_side_tall.json ab61b1b94946f315006a29113f594c234d796bee assets/create/models/block/cut_diorite_brick_slab.json 73597772386c6bbd38907cbea8db816f174a9f8f assets/create/models/block/cut_diorite_brick_slab_top.json c9fbd953ef0789a0e9a915d5f283fd09a76784d6 assets/create/models/block/cut_diorite_brick_stairs.json 5d721f1b3f4376a91707b56950a1f9635adbe603 assets/create/models/block/cut_diorite_brick_stairs_inner.json 9a446bf02732e1873fa96d7745fced0fa04d48d6 assets/create/models/block/cut_diorite_brick_stairs_outer.json +e97babf115a4f81f8555994aba435cf76bebf7a3 assets/create/models/block/cut_diorite_bricks.json +4f7cf44e4d6431587266a4fac78c0812e99d780c assets/create/models/block/cut_diorite_bricks_wall_post.json +1f96f9e190d8e28496ce2db5712f33e449215985 assets/create/models/block/cut_diorite_bricks_wall_side.json +45246192d9cd39837b426e425fc5082422642b65 assets/create/models/block/cut_diorite_bricks_wall_side_tall.json 15195975e7e0ffb7010591b957a657f492e6d59d assets/create/models/block/cut_diorite_slab.json 01c320637843dc0d8b74b48b8d6946cd663d51f6 assets/create/models/block/cut_diorite_slab_top.json 7dcbfe4dc2ec62345da660ecc6ca44056fcd64e7 assets/create/models/block/cut_diorite_stairs.json @@ -972,15 +891,15 @@ c9fbd953ef0789a0e9a915d5f283fd09a76784d6 assets/create/models/block/cut_diorite_ 29075eaaba51ba158f030c2a9583ed5ba52379c8 assets/create/models/block/cut_diorite_wall_side.json 1fb50473359147c7147ea85bc1907e6015ce06bc assets/create/models/block/cut_diorite_wall_side_tall.json 59ee053a884bc9731b4d1b01ae22e0e2b5916cfb assets/create/models/block/cut_dripstone.json -6a4b26a117f58d0187b2cc0c5b117ef71d03d4e9 assets/create/models/block/cut_dripstone_bricks.json -0bb1fa8fb9698dae61096483a01b41bf829666b0 assets/create/models/block/cut_dripstone_bricks_wall_post.json -2019fdc38b401bac72e8344d118d85049ec3efb9 assets/create/models/block/cut_dripstone_bricks_wall_side.json -ebb790b2b6f47d40c92c9bba680e82cb8f054fa9 assets/create/models/block/cut_dripstone_bricks_wall_side_tall.json 84d714b29dcb7eb95a82de8d48491413e26d5fa8 assets/create/models/block/cut_dripstone_brick_slab.json 28b0b1a641d11f8ade57c444e4c1bfd9d617f66a assets/create/models/block/cut_dripstone_brick_slab_top.json 05900c156a6341c12b366790c7e8d15e59a873f0 assets/create/models/block/cut_dripstone_brick_stairs.json 35fb2c83dc89b96951c69253f7502f78c903a9b8 assets/create/models/block/cut_dripstone_brick_stairs_inner.json f69244c1706c95aaadd32d45a24c91ce0848509f assets/create/models/block/cut_dripstone_brick_stairs_outer.json +6a4b26a117f58d0187b2cc0c5b117ef71d03d4e9 assets/create/models/block/cut_dripstone_bricks.json +0bb1fa8fb9698dae61096483a01b41bf829666b0 assets/create/models/block/cut_dripstone_bricks_wall_post.json +2019fdc38b401bac72e8344d118d85049ec3efb9 assets/create/models/block/cut_dripstone_bricks_wall_side.json +ebb790b2b6f47d40c92c9bba680e82cb8f054fa9 assets/create/models/block/cut_dripstone_bricks_wall_side_tall.json 9e42cf588f57de5166f2a2ccdae656743c8b9481 assets/create/models/block/cut_dripstone_slab.json 0da2f782d8ad8fecd81b98c72db182b817bf19eb assets/create/models/block/cut_dripstone_slab_top.json b3c903a1edcd1786ea51a2ccdad5734a1d04ea98 assets/create/models/block/cut_dripstone_stairs.json @@ -990,15 +909,15 @@ b3c903a1edcd1786ea51a2ccdad5734a1d04ea98 assets/create/models/block/cut_dripston 7fab5102d7fa4cd824b9393425639d05727b2ad2 assets/create/models/block/cut_dripstone_wall_side.json c41514cda1c9f5d942d222cbc5f6e620e367afc6 assets/create/models/block/cut_dripstone_wall_side_tall.json dff602c8d2fcd1ceca79f90ae15dbdfbd6cb157d assets/create/models/block/cut_granite.json -31c5299a42f82992e50f711e1e33549c373bd034 assets/create/models/block/cut_granite_bricks.json -ef5a851e57cc4b9c0e625176b1256441e1c17c66 assets/create/models/block/cut_granite_bricks_wall_post.json -815e8dc551c3e813b0b2af29df23a28860de0b53 assets/create/models/block/cut_granite_bricks_wall_side.json -ba241f9c82e27dd98ba6f4e4180922388ab5d1a3 assets/create/models/block/cut_granite_bricks_wall_side_tall.json 9e00dc8fcee23548c0cebda6eadbcfc559e4c20b assets/create/models/block/cut_granite_brick_slab.json 5ad061096451f74e773c3030f96d59424aa93314 assets/create/models/block/cut_granite_brick_slab_top.json 94f8ce607aae5c04ccf9e56f177f9d69203ae879 assets/create/models/block/cut_granite_brick_stairs.json 11d511844fec3bfd05cac8b788332f2decd53021 assets/create/models/block/cut_granite_brick_stairs_inner.json 418eb6a2b52e748a26c2d1914c6c1de94106589f assets/create/models/block/cut_granite_brick_stairs_outer.json +31c5299a42f82992e50f711e1e33549c373bd034 assets/create/models/block/cut_granite_bricks.json +ef5a851e57cc4b9c0e625176b1256441e1c17c66 assets/create/models/block/cut_granite_bricks_wall_post.json +815e8dc551c3e813b0b2af29df23a28860de0b53 assets/create/models/block/cut_granite_bricks_wall_side.json +ba241f9c82e27dd98ba6f4e4180922388ab5d1a3 assets/create/models/block/cut_granite_bricks_wall_side_tall.json 81be5e86cbdaec4945d3ccaf6d376f69c49f40d6 assets/create/models/block/cut_granite_slab.json f72a14e7cf3dd7d93b4462a3bee49683353dfb57 assets/create/models/block/cut_granite_slab_top.json 33bf924f01aae3a7720475f4b32b3a637e69ee36 assets/create/models/block/cut_granite_stairs.json @@ -1008,15 +927,15 @@ fb4969e562ad2039d3bad2dc57a6845d3243d453 assets/create/models/block/cut_granite_ 2972b40134bcb15950a0118306f0251ff5e377b7 assets/create/models/block/cut_granite_wall_side.json abbe71fd17dbb5f176553db2f6edf2f1f7d8974a assets/create/models/block/cut_granite_wall_side_tall.json 019d3c4ffb39e328b5458aee44fee90e0ecbd829 assets/create/models/block/cut_limestone.json -7eae0f9766506f713933bde9f301d2f7f2bbef13 assets/create/models/block/cut_limestone_bricks.json -817e8cf8956af36c70e4b4e30b5d141086d006dd assets/create/models/block/cut_limestone_bricks_wall_post.json -1291cacff1b0980e58b5702a84c9b87ac5ef835d assets/create/models/block/cut_limestone_bricks_wall_side.json -6c9bc8803fe17ac623bde56f85683dd2ff13c33e assets/create/models/block/cut_limestone_bricks_wall_side_tall.json c93f33ba39c62b10dfb94c6e1c339cd4fbebffae assets/create/models/block/cut_limestone_brick_slab.json b12a340897ba98ed732a91dbd4129db7a7188e68 assets/create/models/block/cut_limestone_brick_slab_top.json 3e90b32d95ad1cf7b8a16dae3c16724510d41490 assets/create/models/block/cut_limestone_brick_stairs.json b2e7311667d14b2aa8c00e207f69f76207226567 assets/create/models/block/cut_limestone_brick_stairs_inner.json aac619ec1fb8aa56f1752ad3f354f9cb128771f8 assets/create/models/block/cut_limestone_brick_stairs_outer.json +7eae0f9766506f713933bde9f301d2f7f2bbef13 assets/create/models/block/cut_limestone_bricks.json +817e8cf8956af36c70e4b4e30b5d141086d006dd assets/create/models/block/cut_limestone_bricks_wall_post.json +1291cacff1b0980e58b5702a84c9b87ac5ef835d assets/create/models/block/cut_limestone_bricks_wall_side.json +6c9bc8803fe17ac623bde56f85683dd2ff13c33e assets/create/models/block/cut_limestone_bricks_wall_side_tall.json adc21af1c07edaf0573cfd2c95ebe38e50f7282c assets/create/models/block/cut_limestone_slab.json 2d1ea8fc5c8ce5549c7f7888371b6612bf0f5301 assets/create/models/block/cut_limestone_slab_top.json c1416808a2178996be75e0a9c1cd45849fcd6646 assets/create/models/block/cut_limestone_stairs.json @@ -1026,15 +945,15 @@ c1416808a2178996be75e0a9c1cd45849fcd6646 assets/create/models/block/cut_limeston 2b5e65e662069a5c59e702224778dd407f5d11dd assets/create/models/block/cut_limestone_wall_side.json 052f130fef646242acccbbed2b510add21e18921 assets/create/models/block/cut_limestone_wall_side_tall.json 66cb6054821d45a60ae4d4d1d904dbef0b9f7c0f assets/create/models/block/cut_ochrum.json -0a7e38e3ac32352c5b3ec56a8c26212dbbb637a3 assets/create/models/block/cut_ochrum_bricks.json -47d0c58dd190f1ea894a5ca40ea7efd54a845d3e assets/create/models/block/cut_ochrum_bricks_wall_post.json -b502b5b213996bce0a626d86414045c80921511e assets/create/models/block/cut_ochrum_bricks_wall_side.json -c3f27545b3b7654c3e7a2df6b482d1a9895ccae9 assets/create/models/block/cut_ochrum_bricks_wall_side_tall.json ce16ec490ae8a33671502804e0b45fc42b6f228f assets/create/models/block/cut_ochrum_brick_slab.json fcbee94fdbd96b0b3d4aa245c6c87443abd1de90 assets/create/models/block/cut_ochrum_brick_slab_top.json 827349ed3eb05f5fe700e8f5816bcd82d0347612 assets/create/models/block/cut_ochrum_brick_stairs.json aa81d4135400eb40f891f8c41fcf7fa516ef64f1 assets/create/models/block/cut_ochrum_brick_stairs_inner.json ecd7e1cb9cae717e35eeb58dbe482833e98f5ac0 assets/create/models/block/cut_ochrum_brick_stairs_outer.json +0a7e38e3ac32352c5b3ec56a8c26212dbbb637a3 assets/create/models/block/cut_ochrum_bricks.json +47d0c58dd190f1ea894a5ca40ea7efd54a845d3e assets/create/models/block/cut_ochrum_bricks_wall_post.json +b502b5b213996bce0a626d86414045c80921511e assets/create/models/block/cut_ochrum_bricks_wall_side.json +c3f27545b3b7654c3e7a2df6b482d1a9895ccae9 assets/create/models/block/cut_ochrum_bricks_wall_side_tall.json e23998f88eb77826f5e4d58f3f4bb41a2e09ea97 assets/create/models/block/cut_ochrum_slab.json cd14f1abe3d0c65fbdd052f4a8e0b8fc2a15ad0e assets/create/models/block/cut_ochrum_slab_top.json a751feb4b609df141f971e341b204e76379dcda7 assets/create/models/block/cut_ochrum_stairs.json @@ -1044,15 +963,15 @@ bed6843e39e7e771f6de151dfab0586d3ebad58c assets/create/models/block/cut_ochrum_s df267fb690642cac139aaabefa9eab802f13ddc1 assets/create/models/block/cut_ochrum_wall_side.json ed363b80cc61cb4d0b6fad9da855a0543ecaccc9 assets/create/models/block/cut_ochrum_wall_side_tall.json a65a54a08d9cc3b45e2320482dc2d9e317dd4f3d assets/create/models/block/cut_scorchia.json -9c93a554ab680d7c98c648c16472b52cc2646c50 assets/create/models/block/cut_scorchia_bricks.json -615dc444bb677caa774a4e95686ac24ebe4ec6dc assets/create/models/block/cut_scorchia_bricks_wall_post.json -758a2ad6677f857fbe955c26853eadc7150c105a assets/create/models/block/cut_scorchia_bricks_wall_side.json -f918dfa0751589d18a3eb054c290f669b5c61308 assets/create/models/block/cut_scorchia_bricks_wall_side_tall.json a032cf0a77e4f416ed153b1ffa834c065a73b2ae assets/create/models/block/cut_scorchia_brick_slab.json 716fc6ef58c240b3e6b45acf08d6e1472fe38e7c assets/create/models/block/cut_scorchia_brick_slab_top.json b2870e5ba7c5d5053b3639bf0aa1771ee050810b assets/create/models/block/cut_scorchia_brick_stairs.json 3e8a815eabd1991039a8ad18cedc9c57f46cd097 assets/create/models/block/cut_scorchia_brick_stairs_inner.json 0a9dc3149e7219a70642c242cd86dce5ba5cf4cc assets/create/models/block/cut_scorchia_brick_stairs_outer.json +9c93a554ab680d7c98c648c16472b52cc2646c50 assets/create/models/block/cut_scorchia_bricks.json +615dc444bb677caa774a4e95686ac24ebe4ec6dc assets/create/models/block/cut_scorchia_bricks_wall_post.json +758a2ad6677f857fbe955c26853eadc7150c105a assets/create/models/block/cut_scorchia_bricks_wall_side.json +f918dfa0751589d18a3eb054c290f669b5c61308 assets/create/models/block/cut_scorchia_bricks_wall_side_tall.json a85c4d0467c6746a8ef9c6ac0167d3e16f307d4e assets/create/models/block/cut_scorchia_slab.json 23fd6c65ea83f7ca7ef67dd7faf902c4fa662d70 assets/create/models/block/cut_scorchia_slab_top.json e42329f6fa3aeb958d2349a5442856e9473dc6b5 assets/create/models/block/cut_scorchia_stairs.json @@ -1062,15 +981,15 @@ b9a911675861fee414f82c745399a7707c258f77 assets/create/models/block/cut_scorchia e61af066960897d50dc7f7bc17f95baa962829bd assets/create/models/block/cut_scorchia_wall_side.json 846f84efddca7d51b58ebe5e3bbed78312fb052d assets/create/models/block/cut_scorchia_wall_side_tall.json ce9dcf5b7fe58a97fab832fb98b4f5b6d3778255 assets/create/models/block/cut_scoria.json -fa3ef2bb65299c985b70f6959421e243a9ebc6d8 assets/create/models/block/cut_scoria_bricks.json -24ea1a30f68a918e6737dc8d9babe4528af5716a assets/create/models/block/cut_scoria_bricks_wall_post.json -ba7ae110d51fe510566ab42f5ead299b4409f2b7 assets/create/models/block/cut_scoria_bricks_wall_side.json -f04d12bc4e0b939bb443abcc6eb808e66c352c66 assets/create/models/block/cut_scoria_bricks_wall_side_tall.json edf04cbfb19b6ce99c1b74a71d40cd40c8120551 assets/create/models/block/cut_scoria_brick_slab.json f05725fd6d2764b277f01985d0e2fcbd3bf4a41e assets/create/models/block/cut_scoria_brick_slab_top.json 4bccbaef9dd9a8322087d3feb973e14d740ff27a assets/create/models/block/cut_scoria_brick_stairs.json 13f3b55dfdd97e68a6d525166618477e5bcb336d assets/create/models/block/cut_scoria_brick_stairs_inner.json 465862fb20542cae723fd72818be73aec05dad60 assets/create/models/block/cut_scoria_brick_stairs_outer.json +fa3ef2bb65299c985b70f6959421e243a9ebc6d8 assets/create/models/block/cut_scoria_bricks.json +24ea1a30f68a918e6737dc8d9babe4528af5716a assets/create/models/block/cut_scoria_bricks_wall_post.json +ba7ae110d51fe510566ab42f5ead299b4409f2b7 assets/create/models/block/cut_scoria_bricks_wall_side.json +f04d12bc4e0b939bb443abcc6eb808e66c352c66 assets/create/models/block/cut_scoria_bricks_wall_side_tall.json aeef239ca6b0eee527f75091d11d4a947740416d assets/create/models/block/cut_scoria_slab.json 5dfda9fa8117d35ebc324a5c9cb026e206e3b936 assets/create/models/block/cut_scoria_slab_top.json dfe8dbdb6deca69d847ee46fedfefe2da98dc329 assets/create/models/block/cut_scoria_stairs.json @@ -1080,15 +999,15 @@ e0b2a94ff4b3f1c1e4282c9c8eecf2583bd7c68e assets/create/models/block/cut_scoria_w cf18e3fde94e3ba611f430fe527a9042a57e6936 assets/create/models/block/cut_scoria_wall_side.json 92475d7758b2bf582c585c2aafa6510f330c6f45 assets/create/models/block/cut_scoria_wall_side_tall.json 9f6543d21d9c24a429aae00511e6dbf61caf8030 assets/create/models/block/cut_tuff.json -8b3d9fe37ab7fda79ea4d90f674c525350883ba0 assets/create/models/block/cut_tuff_bricks.json -6b80481e15ff3d6eb40a42128da883c2027e0074 assets/create/models/block/cut_tuff_bricks_wall_post.json -057a34015b49565cb9858a2eea995a446ac0cfd4 assets/create/models/block/cut_tuff_bricks_wall_side.json -9f20bd04ef163076db9a8bf83c20cc802b57ae60 assets/create/models/block/cut_tuff_bricks_wall_side_tall.json 8c16599fda76c38978a2faa14f842a68fbbe4b9c assets/create/models/block/cut_tuff_brick_slab.json 696036e5900bdbb366dd49f5df71a1e701fd8ee3 assets/create/models/block/cut_tuff_brick_slab_top.json 54d4603e36be86e88d9302d61eab81e76cac1bbc assets/create/models/block/cut_tuff_brick_stairs.json 0ebb41a1ce5bf4ca86cbaf95e83cd2edf8f309ea assets/create/models/block/cut_tuff_brick_stairs_inner.json 5d5ed291db4b4bca464717c7fcde682b33d71c3f assets/create/models/block/cut_tuff_brick_stairs_outer.json +8b3d9fe37ab7fda79ea4d90f674c525350883ba0 assets/create/models/block/cut_tuff_bricks.json +6b80481e15ff3d6eb40a42128da883c2027e0074 assets/create/models/block/cut_tuff_bricks_wall_post.json +057a34015b49565cb9858a2eea995a446ac0cfd4 assets/create/models/block/cut_tuff_bricks_wall_side.json +9f20bd04ef163076db9a8bf83c20cc802b57ae60 assets/create/models/block/cut_tuff_bricks_wall_side_tall.json f2a904b7943555e8ec9dcc07513ca1ad9af809c3 assets/create/models/block/cut_tuff_slab.json ea74bb8a69f6acbd520ac8922e147495e5f99f6f assets/create/models/block/cut_tuff_slab_top.json 0262700e59de947907a04fdea9974f9d7e5a22f2 assets/create/models/block/cut_tuff_stairs.json @@ -1098,15 +1017,15 @@ ea74bb8a69f6acbd520ac8922e147495e5f99f6f assets/create/models/block/cut_tuff_sla 8c6492dc9e09359e5bac67ae4d473cffc8f93dbb assets/create/models/block/cut_tuff_wall_side.json f5f24066b6281303f52e25745881d5bca8c49c54 assets/create/models/block/cut_tuff_wall_side_tall.json 167e9a084987bcf7f67f655d0de88ae8ca2fcebb assets/create/models/block/cut_veridium.json -f8ab87c34f211a63525f6d386397face67460f8c assets/create/models/block/cut_veridium_bricks.json -e4e717fa8412032e184aebd1186470f41a2089c0 assets/create/models/block/cut_veridium_bricks_wall_post.json -8c40ccb8f10ef8dcda1bef46ad3490f697d178d2 assets/create/models/block/cut_veridium_bricks_wall_side.json -2c4671c66d904e15883ec3a14681b97ac537135c assets/create/models/block/cut_veridium_bricks_wall_side_tall.json 07c330c501375d5c316677edee80fb040c0fc237 assets/create/models/block/cut_veridium_brick_slab.json 4c8c660afe72e8ce9eaef53a37fdc63eb0c69513 assets/create/models/block/cut_veridium_brick_slab_top.json f802e4ae758e2c37c3129594ce4f5d9ffcfe173d assets/create/models/block/cut_veridium_brick_stairs.json 0d60d5cd0269e05816d28fcbbd2c680fe60cd316 assets/create/models/block/cut_veridium_brick_stairs_inner.json 22656f90b55aeaeeffa448b5f061fb26b5de7b0f assets/create/models/block/cut_veridium_brick_stairs_outer.json +f8ab87c34f211a63525f6d386397face67460f8c assets/create/models/block/cut_veridium_bricks.json +e4e717fa8412032e184aebd1186470f41a2089c0 assets/create/models/block/cut_veridium_bricks_wall_post.json +8c40ccb8f10ef8dcda1bef46ad3490f697d178d2 assets/create/models/block/cut_veridium_bricks_wall_side.json +2c4671c66d904e15883ec3a14681b97ac537135c assets/create/models/block/cut_veridium_bricks_wall_side_tall.json d736230e9b49a9fd40bc8f31df4d5144cdb429c8 assets/create/models/block/cut_veridium_slab.json 750e536c7b71dfb3a005d9b7a128ac435461e57f assets/create/models/block/cut_veridium_slab_top.json 8b05c19560e97ce15a66202717e3d32f6ee153a9 assets/create/models/block/cut_veridium_stairs.json @@ -1116,11 +1035,8 @@ d6423c0fd0af4fbd929d26d6097a1722567acc9d assets/create/models/block/cut_veridium b2e847cee8c01791c15fcdd35787af33ebe46f0a assets/create/models/block/cut_veridium_wall_side.json 5ab4db4245b852edf985fe72595f678eb7372801 assets/create/models/block/cut_veridium_wall_side_tall.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/cyan_nixie_tube.json -0cbd0c6c909effa2f71e198655d51f2e483454aa assets/create/models/block/cyan_postbox_closed.json -ccea6f3023879d84de4590a584f666598f58d6bc assets/create/models/block/cyan_postbox_open.json 27c9aff76b32e4de18d581e133fc23a8239ca412 assets/create/models/block/cyan_sail.json 01a324a92552076589e2aaaeca9d4da2d1e3b39d assets/create/models/block/cyan_seat.json -c7a147b092909c57ae197007818810fa75b9cb68 assets/create/models/block/cyan_table_cloth.json 663f431fe8a02e057980cf9bcfc566eb5adc876f assets/create/models/block/cyan_toolbox.json febd2b2f94194441fb73020b667d0398853add4a assets/create/models/block/cyan_valve_handle.json 339993f53eacf042d8caab6101eb5d4088b35746 assets/create/models/block/dark_oak_window.json @@ -1136,22 +1052,25 @@ db89bc32d0e466bc5008aa7091c682ba3aeec611 assets/create/models/block/diorite_pill a21387ab955f2b91e402b2189145f5fd6623592d assets/create/models/block/diorite_pillar_horizontal.json 44af455badc2b35a763007bba3537bda7d0ac289 assets/create/models/block/dripstone_pillar.json 1e23e3758e3311d0063c83742abb750a05021075 assets/create/models/block/dripstone_pillar_horizontal.json -19a773f91c58c49301f35965bac02d0c05fb2764 assets/create/models/block/exposed_copper_shingles.json a3420b91fdebec40e508a5eebb145c0201bd80c8 assets/create/models/block/exposed_copper_shingle_slab.json 4178ea5e50ee17b3c15f4a59efd019c4a19bb892 assets/create/models/block/exposed_copper_shingle_slab_top.json dd2d747774abc86e428a883e299db66cded78e11 assets/create/models/block/exposed_copper_shingle_stairs.json b6845da62d96a33cee624bb70360e256b26eda83 assets/create/models/block/exposed_copper_shingle_stairs_inner.json 3d8b758e50e75c5adc26ab6f39f9d73f00866673 assets/create/models/block/exposed_copper_shingle_stairs_outer.json -9cb20c9d41629d8b9426cb65829365d10966338f assets/create/models/block/exposed_copper_tiles.json +19a773f91c58c49301f35965bac02d0c05fb2764 assets/create/models/block/exposed_copper_shingles.json cd21d9d2935b6d0103502e2731c11ea27ff64ecf assets/create/models/block/exposed_copper_tile_slab.json 0ec039ba59fb0028183433e52131ff355ace5bff assets/create/models/block/exposed_copper_tile_slab_top.json c51dbd34996ac4513234800e427ac308067d5e1d assets/create/models/block/exposed_copper_tile_stairs.json 68772d4352dc7ade995dfa57ba41a38ef819e855 assets/create/models/block/exposed_copper_tile_stairs_inner.json d932671822ba93b71a9c8b50e7207803a1c4dbab assets/create/models/block/exposed_copper_tile_stairs_outer.json +9cb20c9d41629d8b9426cb65829365d10966338f assets/create/models/block/exposed_copper_tiles.json 2d1ade82820569936fd3021a877283474ced09d0 assets/create/models/block/fake_track.json 9e41f0b90dd1e71766c9d07bdb75d1e553f3392f assets/create/models/block/fluid_pipe/d_x.json 13507730f6ca6462c4cfeddc46e5b21e93fb1287 assets/create/models/block/fluid_pipe/d_y.json 84c09934d3537343a1226389993dabfa850b745e assets/create/models/block/fluid_pipe/d_z.json +b8fd54e514bd50fb287c6b758647818c6b08ef75 assets/create/models/block/fluid_pipe/l_x.json +e985ff9dbe7324cf69ab38e6e9e85c9b554af56c assets/create/models/block/fluid_pipe/l_y.json +e24957d63bac1e754fcc1647a4a86337a67f6298 assets/create/models/block/fluid_pipe/l_z.json eacc5ee5f164ccc7c13cfbbd37a92b401222debe assets/create/models/block/fluid_pipe/ld_x.json 33fc0ecce85fae051c54d5a538793d7081238894 assets/create/models/block/fluid_pipe/ld_y.json 638f1a259cabed1f8d63c6fdaa6d4d4dff539e7d assets/create/models/block/fluid_pipe/ld_z.json @@ -1161,24 +1080,21 @@ c52521cd566294c797312104284ddd343fad9c2e assets/create/models/block/fluid_pipe/l 99637310d3ca1ccfbe62b03aa9b0d82a0cf6f724 assets/create/models/block/fluid_pipe/lu_x.json 986800d441e95553464d1869d39baf456f5d70dc assets/create/models/block/fluid_pipe/lu_y.json 11dcf7d2dcd0df9b043035cb072deee96ab9e6da assets/create/models/block/fluid_pipe/lu_z.json -b8fd54e514bd50fb287c6b758647818c6b08ef75 assets/create/models/block/fluid_pipe/l_x.json -e985ff9dbe7324cf69ab38e6e9e85c9b554af56c assets/create/models/block/fluid_pipe/l_y.json -e24957d63bac1e754fcc1647a4a86337a67f6298 assets/create/models/block/fluid_pipe/l_z.json +d44ff2aed71039a7d0ff913d0d9e8398e1318f39 assets/create/models/block/fluid_pipe/r_x.json +92d4044b51a90da0b2277b0613c7ca0bb80c66fe assets/create/models/block/fluid_pipe/r_y.json +fb9a23de00ef4edb4f7e24fb60de345cd12e513f assets/create/models/block/fluid_pipe/r_z.json bde9ec36b86113a6ca7a51a4f405994460a2eb56 assets/create/models/block/fluid_pipe/rd_x.json bd325f5b37ff08328ddddeeceac1a41be586d20a assets/create/models/block/fluid_pipe/rd_y.json 28f351fd215af3a991ccd9aa05c57b9cd9e6f58d assets/create/models/block/fluid_pipe/rd_z.json 1ff3ea321aeacca70709eb76370c11c7f13163b6 assets/create/models/block/fluid_pipe/ru_x.json 95bc5342fd3909981430c2e13ef98cdbd8f02709 assets/create/models/block/fluid_pipe/ru_y.json e1fc0d1297a83749ac55f51c9cf33ff2ecc9fdc2 assets/create/models/block/fluid_pipe/ru_z.json -d44ff2aed71039a7d0ff913d0d9e8398e1318f39 assets/create/models/block/fluid_pipe/r_x.json -92d4044b51a90da0b2277b0613c7ca0bb80c66fe assets/create/models/block/fluid_pipe/r_y.json -fb9a23de00ef4edb4f7e24fb60de345cd12e513f assets/create/models/block/fluid_pipe/r_z.json -65a41f4b680af197776e03cae6f1815b6d04def2 assets/create/models/block/fluid_pipe/ud_x.json -26398801d89889ffe17b6513b786d27707f6a480 assets/create/models/block/fluid_pipe/ud_y.json -07747cc2b936e1b326bae7ac32a8a5ba77fdffa9 assets/create/models/block/fluid_pipe/ud_z.json 4e3debb2ba60398a0730866f781e0455f4316610 assets/create/models/block/fluid_pipe/u_x.json 0f98b30ba09706b8a5ee09aeef912b39acea0216 assets/create/models/block/fluid_pipe/u_y.json 83bf9b1af633c319c051055170debff4cc3508c0 assets/create/models/block/fluid_pipe/u_z.json +65a41f4b680af197776e03cae6f1815b6d04def2 assets/create/models/block/fluid_pipe/ud_x.json +26398801d89889ffe17b6513b786d27707f6a480 assets/create/models/block/fluid_pipe/ud_y.json +07747cc2b936e1b326bae7ac32a8a5ba77fdffa9 assets/create/models/block/fluid_pipe/ud_z.json 5f70af15ec2569c68a17d31024c7a37cb5c68c7e assets/create/models/block/framed_glass.json f0100e1d44146b256998fbd2af05da80d147e8d9 assets/create/models/block/framed_glass_pane_noside.json 4a032c6ae3f459e3349c2a2218da186170c31e03 assets/create/models/block/framed_glass_pane_noside_alt.json @@ -1200,19 +1116,13 @@ d0fa41de17f65693188f1868ace5fc2ac518739b assets/create/models/block/gantry_shaft 3356069e112cde817da0c99ceb40cd8f207de822 assets/create/models/block/granite_pillar.json ee860a8bd95fda14a859d6632652ee2a95f06c19 assets/create/models/block/granite_pillar_horizontal.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/gray_nixie_tube.json -f2bbb067bc4e91a71303cc92939c4f4707cdc1ab assets/create/models/block/gray_postbox_closed.json -905fb4b54a39ca9bc1d6f48977bb3b158b17c2a1 assets/create/models/block/gray_postbox_open.json 97f382e9b435c81d1d8e0ed487a7fc16e6945958 assets/create/models/block/gray_sail.json 58b51da5c80e4f43582452d97453c93145a516ad assets/create/models/block/gray_seat.json -2efdba46e7e7acbbcbd36468e5d46c22989b8516 assets/create/models/block/gray_table_cloth.json cd3cff8e38d559dcb78df014556a78d5a538af43 assets/create/models/block/gray_toolbox.json 3ee19f46bdeb0ac7489dcd4d51f90ab01ad863c9 assets/create/models/block/gray_valve_handle.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/green_nixie_tube.json -21fbacdc856fb1003f58bf2842fe418124f6b01d assets/create/models/block/green_postbox_closed.json -703df2f5307d39f0f4e5b9a1f99b8c14fd819dd0 assets/create/models/block/green_postbox_open.json 26577589688ec1f39cae9f42704cb36cbc1c48ae assets/create/models/block/green_sail.json ae51eaa500dd036fa27474a7392f381afb677dfd assets/create/models/block/green_seat.json -4fbf52032b062afd32921ee925d8c13160fe2029 assets/create/models/block/green_table_cloth.json 801d277b241332d5f4b49bdb00b911dcd01a7db2 assets/create/models/block/green_toolbox.json f7762c9388198b51686541edbef9a1546041f6e4 assets/create/models/block/green_valve_handle.json f8b51eec36c2eddc08a1b60894d863bb58f55625 assets/create/models/block/haunted_bell_ceiling.json @@ -1227,12 +1137,6 @@ a1a239714f5feb45a692f5c2873c37d6614e1b8b assets/create/models/block/horizontal_f 0f7e518ef02428c55e1683bc9de0d20e2c1e6883 assets/create/models/block/horizontal_framed_glass_pane_side.json db3f9472815fb6acc1ee1d9941b8cc19518ebcbf assets/create/models/block/horizontal_framed_glass_pane_side_alt.json 6868ed1959875efec96a15ca6f32b8c7efefb2d9 assets/create/models/block/industrial_iron_block.json -02806f9c95ba6b74b61e1c92927492b3668ffdc9 assets/create/models/block/industrial_iron_window.json -a0152d54688e8c4bb0c96e0476cca7e5f92dabd7 assets/create/models/block/industrial_iron_window_pane_noside.json -bbc922f5ddce4acfe89911d149204d4663515fc2 assets/create/models/block/industrial_iron_window_pane_noside_alt.json -13c0714510f379830f42488c4f0457c4f4d6be16 assets/create/models/block/industrial_iron_window_pane_post.json -b5bbcb04dd68249b4d9c2bae2fa2c15e9bcd9870 assets/create/models/block/industrial_iron_window_pane_side.json -7763d9f974f859963a48060858b80a6b46f842c9 assets/create/models/block/industrial_iron_window_pane_side_alt.json cdc4f1c608f74824fd270521a846823ca4b6ef16 assets/create/models/block/jungle_window.json 8c5ee8e36756fcff3095c564567a35be1db23cee assets/create/models/block/jungle_window_pane_noside.json 2bb34fe17c7cfafc8658cd0b44ab636191f81348 assets/create/models/block/jungle_window_pane_noside_alt.json @@ -1254,42 +1158,30 @@ b843a6e27c4f90e31108f9f3c1573e70fb3d0927 assets/create/models/block/layered_scor 5fb53db0c6623dc16e486ac0bd094b5a90e2e080 assets/create/models/block/layered_tuff.json 336d1646294e018ea3de60b30a621a10ca7aa6d7 assets/create/models/block/layered_veridium.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/light_blue_nixie_tube.json -cf487c0be9444b7ac124d2ae33e6c545803e14b6 assets/create/models/block/light_blue_postbox_closed.json -7497701edea1599fc51e3eaa0367007ca00bbe69 assets/create/models/block/light_blue_postbox_open.json 2e83d3aaa92640d6b3da2a2644f6a160f97b08e4 assets/create/models/block/light_blue_sail.json ba917560f40a4e46ef190649f18adad9962c5c02 assets/create/models/block/light_blue_seat.json -af065b4c74b0d177075221a996d9ac78b871e8f0 assets/create/models/block/light_blue_table_cloth.json c20616aa90feab3003cecb4a5be5466c0fc83072 assets/create/models/block/light_blue_toolbox.json bcd3d28b8a062649301648ea5e2d0463f93d008d assets/create/models/block/light_blue_valve_handle.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/light_gray_nixie_tube.json -1efabd28f0dc3db1c0e6bea2be62cac883fefd66 assets/create/models/block/light_gray_postbox_closed.json -a42521eac2924269cb1f0e865bafe7dcd147d1cc assets/create/models/block/light_gray_postbox_open.json 09f284574b38ab57579e939bbb088b8d36e0b8f5 assets/create/models/block/light_gray_sail.json d1813d0f548fcddb361df7cc3b5d97582842b10f assets/create/models/block/light_gray_seat.json -debf78f20659bc3c637299a40b649cbe4aa30ebf assets/create/models/block/light_gray_table_cloth.json 4ec5d701dd8b2d8c3dc44d05f527a3d737002cd4 assets/create/models/block/light_gray_toolbox.json adb8dbed70419e0310e7a20f3656bf325b348434 assets/create/models/block/light_gray_valve_handle.json +2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/lime_nixie_tube.json +5a95a72444f523cfba6e8c5adf8eacbb37e2d21e assets/create/models/block/lime_sail.json +09e7bf50cf88c449dbd9e77829cdb5afffb7d88d assets/create/models/block/lime_seat.json +b92822a01e4fbed2463b1bdf7dcc736023988e20 assets/create/models/block/lime_toolbox.json +802b47f34b1053b7af980b08b6511f468e7dd7c1 assets/create/models/block/lime_valve_handle.json 8f53caad3899a30be5087a0ba155080834418cc0 assets/create/models/block/limestone.json 2b80f9421c2fe902d55d9bd95183ad4bae46c315 assets/create/models/block/limestone_pillar.json fb18280a2a708f60b00cc7c675804c219784871a assets/create/models/block/limestone_pillar_horizontal.json -2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/lime_nixie_tube.json -952d292d4dc2158e6106c5079cfa1ddb81c7777e assets/create/models/block/lime_postbox_closed.json -4357f5d9102d54c7fbe5325512a2cd42d94d6d42 assets/create/models/block/lime_postbox_open.json -5a95a72444f523cfba6e8c5adf8eacbb37e2d21e assets/create/models/block/lime_sail.json -09e7bf50cf88c449dbd9e77829cdb5afffb7d88d assets/create/models/block/lime_seat.json -e4142a22c20d6e5b9a8b9f96c13d4e5f96adc59d assets/create/models/block/lime_table_cloth.json -b92822a01e4fbed2463b1bdf7dcc736023988e20 assets/create/models/block/lime_toolbox.json -802b47f34b1053b7af980b08b6511f468e7dd7c1 assets/create/models/block/lime_valve_handle.json 84b9ac6eafdbd037f3ff558c250a8b8952415af1 assets/create/models/block/linear_chassis.json 29ee936c09c1222c6a144e5bb39577b5a9cd28bf assets/create/models/block/linear_chassis_bottom.json a1a3804ddcb1db0a7b5c0693555f8eb326950dd0 assets/create/models/block/linear_chassis_top.json f885acc0ba705cfa9c65b62626ab4007f3b6e329 assets/create/models/block/linear_chassis_top_bottom.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/magenta_nixie_tube.json -bfea3fd456f92391afc9f948ade90b16275e63de assets/create/models/block/magenta_postbox_closed.json -fe224c9e396eb51a6cc0b38175b621a56500fda7 assets/create/models/block/magenta_postbox_open.json 81122f26a12b7ab40fed6d31c97376f4dfffa111 assets/create/models/block/magenta_sail.json b5cd13b021400b3c37499ec4ef22e560c721ac54 assets/create/models/block/magenta_seat.json -8b37821a3c6825488479d4f605bbd84734457c68 assets/create/models/block/magenta_table_cloth.json d7b2b16ba2d6a0b2441aeaf7faa76f61fbdc35e7 assets/create/models/block/magenta_toolbox.json c0d29851d48cebd376b3b6e8f0454e0369d0e265 assets/create/models/block/magenta_valve_handle.json 026384a699d592160624bb7a1606e31fb77751be assets/create/models/block/mangrove_window.json @@ -1312,11 +1204,8 @@ af50363d603d61340b336569d58c1febde253665 assets/create/models/block/ochrum_natur d69effa0a811cb93fead8257bcaad4bbf0094002 assets/create/models/block/ochrum_natural_3.json 24669a4e93925940477fcfc0aca10ab9d87368e0 assets/create/models/block/ochrum_pillar.json c8dd33a0b71dce37712788a61729de89574b117f assets/create/models/block/ochrum_pillar_horizontal.json -dbd0cbfa1c6cfaddd7ac954379b4b1f3056730f2 assets/create/models/block/orange_postbox_closed.json -88cda1f606e502cf0df9430b75a70fd3161fd6ba assets/create/models/block/orange_postbox_open.json cb4cd4e4bfb0d105a09c56454abf4795b155d12b assets/create/models/block/orange_sail.json 6c4addc75fb03911fca3083f891b22f55209b8db assets/create/models/block/orange_seat.json -f004bacf25a9675a87905ddbfa2e140a3891f4b0 assets/create/models/block/orange_table_cloth.json f68eeb8cd828a0659fe8665373daf093ea65f0fc assets/create/models/block/orange_toolbox.json 992367362e20777dd2e1245c6b26b6ffab86b21c assets/create/models/block/orange_valve_handle.json f9010894858512398bddd5d31b922e12594d2e3c assets/create/models/block/ornate_iron_window.json @@ -1325,28 +1214,25 @@ f9010894858512398bddd5d31b922e12594d2e3c assets/create/models/block/ornate_iron_ 92637fbd6bf54891411b32a494064b9a48e59411 assets/create/models/block/ornate_iron_window_pane_post.json 8416d497e7fc8ca4f9f4c608ccc0651036850256 assets/create/models/block/ornate_iron_window_pane_side.json 1cdaa9d4bd23f7b1eb14672dc9322d9dad966502 assets/create/models/block/ornate_iron_window_pane_side_alt.json -561beafce41b9e9c0b07bc6b7176dd4f6918c116 assets/create/models/block/oxidized_copper_shingles.json 7e0bab8109e322c6db5fe1d5999c06536c21c6eb assets/create/models/block/oxidized_copper_shingle_slab.json 42df32c4e2d1ffb2ee62748becfd1717118b440c assets/create/models/block/oxidized_copper_shingle_slab_top.json b55a733e3e68cfbd08d45bb9ac56deef9f728b60 assets/create/models/block/oxidized_copper_shingle_stairs.json 7b8745213af5aa7938fc04a295be6a087c72daa8 assets/create/models/block/oxidized_copper_shingle_stairs_inner.json d89419d48d6ee2f6747e7c93de8699db22ea3f59 assets/create/models/block/oxidized_copper_shingle_stairs_outer.json -5cf92b628ff1f832966138a58ed87d747681274c assets/create/models/block/oxidized_copper_tiles.json +561beafce41b9e9c0b07bc6b7176dd4f6918c116 assets/create/models/block/oxidized_copper_shingles.json ad6134598869711a12e2f95c9b5f25a0f7b8dd93 assets/create/models/block/oxidized_copper_tile_slab.json c17bac0fd6a20540813c6a1c000a553b7c5ac849 assets/create/models/block/oxidized_copper_tile_slab_top.json d5b30340364f5536e46bc67e777ef4fa20a36e04 assets/create/models/block/oxidized_copper_tile_stairs.json b40b315c23cbd3eb4658518bfac836f6091321a5 assets/create/models/block/oxidized_copper_tile_stairs_inner.json f4eaadab29b4f2e915237340e2d6f4aad4ba21d6 assets/create/models/block/oxidized_copper_tile_stairs_outer.json +5cf92b628ff1f832966138a58ed87d747681274c assets/create/models/block/oxidized_copper_tiles.json f8b51eec36c2eddc08a1b60894d863bb58f55625 assets/create/models/block/peculiar_bell_ceiling.json f70f83cfec770879c478eea3760ea187700f2878 assets/create/models/block/peculiar_bell_double_wall.json b9c9d00b844ca2f217ae21cc502cd4d082fed2d5 assets/create/models/block/peculiar_bell_floor.json f7b09c243cfeda8bb38a29a917b9fbdafe47eece assets/create/models/block/peculiar_bell_single_wall.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/pink_nixie_tube.json -084266ced8975953fa158fd9e7261d8f10b94db7 assets/create/models/block/pink_postbox_closed.json -e99518b61a3c7a89570a8aa8c4cb45badfa8547a assets/create/models/block/pink_postbox_open.json 90113a1f53f0f8d9ce11ff14128eb860063f5ddc assets/create/models/block/pink_sail.json 888dba067e751a55205dbd919db8e92ef2be604d assets/create/models/block/pink_seat.json -9a7e7af8cc625a0812304c9bd3b00d13f085f040 assets/create/models/block/pink_table_cloth.json 3cb69299c7787f88fb41c6397362aa7b607c0960 assets/create/models/block/pink_toolbox.json cf2fda0a37a0e5771cf882793ca21f277219796f assets/create/models/block/pink_valve_handle.json 44b05f0e3847c526514f7a7e167d275415408b39 assets/create/models/block/polished_cut_andesite.json @@ -1499,15 +1385,9 @@ b21ec7cde56398b65f44922ddb026d9adb7b6072 assets/create/models/block/polished_cut 66374fdc4d3d55f99b03e406f3b594f8b1bab94d assets/create/models/block/pulse_repeater_powered.json 6bd0d85ca18b468bee279e7bc398bc8395e33a8b assets/create/models/block/pulse_repeater_powered_powering.json de0cc956e7ff1510d0947ca8fd2b6e642944f0ee assets/create/models/block/pulse_repeater_powering.json -addbe93af945ff7ca2680a27225db804d3ac9b46 assets/create/models/block/pulse_timer_powered.json -ab3d7e10abcb53b835d6f5c406b7a777a942d6f7 assets/create/models/block/pulse_timer_powered_powering.json -7b425d9db8d914b52b7faad2f792c020b678f84d assets/create/models/block/pulse_timer_powering.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/purple_nixie_tube.json -afdd265ee175c47ea6e4e44fb08d212e4cef5ee5 assets/create/models/block/purple_postbox_closed.json -fbd874fd63b3d6f50592703dce6bf196f2d63732 assets/create/models/block/purple_postbox_open.json 356378a5839b0b400aa5e0a67740634113c09a38 assets/create/models/block/purple_sail.json bc8e473a5662b6180b00b85e5006241a283c9baa assets/create/models/block/purple_seat.json -d040daf29c44f31c4cd8522998b66f7021b3c746 assets/create/models/block/purple_table_cloth.json 5e85ec98c165a0b5bfe25d391e96df9164372a3a assets/create/models/block/purple_toolbox.json b7e5f69044c7a1d0a31fd2f6efe81a5be060bf19 assets/create/models/block/purple_valve_handle.json e1fdd5fb88d9f5af7d0e90e65cf5ecea0667e1c7 assets/create/models/block/radial_chassis_side_x.json @@ -1519,11 +1399,8 @@ ff65b89683fbb9326f625b9a68f954def5ed000d assets/create/models/block/radial_chass 9d234d1294f927d1e70a5c9b1e6de73ef65e7014 assets/create/models/block/railway_casing.json be8042806b08990786ced1cf140c4942d7a6788b assets/create/models/block/raw_zinc_block.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/red_nixie_tube.json -844614001c30ef34d3136a350c12018c5e9ab341 assets/create/models/block/red_postbox_closed.json -d06791faedd062464a13972a3b64de86053aeac7 assets/create/models/block/red_postbox_open.json b692deeb65f338212fb1073b725a122b7b1359d5 assets/create/models/block/red_sail.json bf3f4ba33e1a61254073ecee3e753958f8debb35 assets/create/models/block/red_seat.json -687a21d7d3e00820430dc47575449dcdbdc5b59c assets/create/models/block/red_table_cloth.json 2a13766aebac1a392ae7bf934bd81d9210c87a24 assets/create/models/block/red_toolbox.json 36f525b420b040b9f78032abe84cd125766cf320 assets/create/models/block/red_valve_handle.json 2aa9e5c535979c912593f30b654ae96334f72a80 assets/create/models/block/refined_radiance_casing.json @@ -1543,133 +1420,133 @@ ff52eb59dadfe675e416440f3115856a501428a6 assets/create/models/block/scoria.json 4d7d36f974d25a310db2f75800e8c7e0377881c6 assets/create/models/block/secondary_linear_chassis_top.json 5ecb821ac06873015d2d7ebcfb7e1f5fe85cf504 assets/create/models/block/secondary_linear_chassis_top_bottom.json e697898a0ec4c308314a4e0b7235fa0a9229da45 assets/create/models/block/shadow_steel_casing.json -73edb947b52c73e85a83422853d0b8a0fb34e82b assets/create/models/block/small_andesite_bricks.json -3bb5c8413b9e81a1adc339f873f37eb656904e06 assets/create/models/block/small_andesite_bricks_wall_post.json -0e70d94fc6ffdc0fd4a50a5910bc1455b401982f assets/create/models/block/small_andesite_bricks_wall_side.json -597fec784e40c1ff3b622824c32773d6d271f3b7 assets/create/models/block/small_andesite_bricks_wall_side_tall.json 593b962350c8de53156901b308617c6a246afa09 assets/create/models/block/small_andesite_brick_slab.json c83de8118653ccdce92a1b7f3501bf7359e0b310 assets/create/models/block/small_andesite_brick_slab_top.json f019380bcc81d52681e2beaf63e2b11836c45922 assets/create/models/block/small_andesite_brick_stairs.json 4fa72fe0115ad9ec83837852a2b2e2d22dde19ca assets/create/models/block/small_andesite_brick_stairs_inner.json f80f485f62dce86e98815b343c89e96b10623e53 assets/create/models/block/small_andesite_brick_stairs_outer.json -4750724972cbac6d7dac31e0689681eab6c37093 assets/create/models/block/small_asurine_bricks.json -407c7bea509bb0e9bf9f04e947ace584103d012d assets/create/models/block/small_asurine_bricks_wall_post.json -60491dfb4f2a6b78effdf18612b9a1cd7d930d8a assets/create/models/block/small_asurine_bricks_wall_side.json -e5d3172c08b65696a6d72220495463636d8b352c assets/create/models/block/small_asurine_bricks_wall_side_tall.json +73edb947b52c73e85a83422853d0b8a0fb34e82b assets/create/models/block/small_andesite_bricks.json +3bb5c8413b9e81a1adc339f873f37eb656904e06 assets/create/models/block/small_andesite_bricks_wall_post.json +0e70d94fc6ffdc0fd4a50a5910bc1455b401982f assets/create/models/block/small_andesite_bricks_wall_side.json +597fec784e40c1ff3b622824c32773d6d271f3b7 assets/create/models/block/small_andesite_bricks_wall_side_tall.json cdd354726eda82d83dc89871fa587b8c07b02a16 assets/create/models/block/small_asurine_brick_slab.json 7bdb6ed1e74437d083bca7d89c0d1b7c81e80b53 assets/create/models/block/small_asurine_brick_slab_top.json 086b9d4284d343967a582fd0a7d194bafd980e13 assets/create/models/block/small_asurine_brick_stairs.json db69f1580ca405b9a99f0e4ea8d9b9950ed6444e assets/create/models/block/small_asurine_brick_stairs_inner.json dd572cbff713b0f4830aef0bf3ba4adb80ee9908 assets/create/models/block/small_asurine_brick_stairs_outer.json -c2c72734ac526c319cb01e982824680bfb5f1186 assets/create/models/block/small_calcite_bricks.json -f17f2ecd5e5a32f92ec0ad0ba9e861a80432c0f2 assets/create/models/block/small_calcite_bricks_wall_post.json -1ad7654125aff67267567c0007cc03b8a15131b0 assets/create/models/block/small_calcite_bricks_wall_side.json -10c339f64c0e78f4fbb7a95c10bf7f9f399c0c6b assets/create/models/block/small_calcite_bricks_wall_side_tall.json +4750724972cbac6d7dac31e0689681eab6c37093 assets/create/models/block/small_asurine_bricks.json +407c7bea509bb0e9bf9f04e947ace584103d012d assets/create/models/block/small_asurine_bricks_wall_post.json +60491dfb4f2a6b78effdf18612b9a1cd7d930d8a assets/create/models/block/small_asurine_bricks_wall_side.json +e5d3172c08b65696a6d72220495463636d8b352c assets/create/models/block/small_asurine_bricks_wall_side_tall.json d07c57748981a54ffcdadc30ec21f728a3557bea assets/create/models/block/small_calcite_brick_slab.json 9a5e6a93328ad35b256b2512c28e683a74e807a9 assets/create/models/block/small_calcite_brick_slab_top.json c3d39e013dd0142f044f8f0a90de849a0d961e84 assets/create/models/block/small_calcite_brick_stairs.json 4e47a4708dafc0ea476e2d5b6567acfdc2c5c148 assets/create/models/block/small_calcite_brick_stairs_inner.json 6a41c44680a958299a787d8c8c8778d52167cd65 assets/create/models/block/small_calcite_brick_stairs_outer.json -485f6c0e37b24124ff23efa3f0caa2cfe85663dd assets/create/models/block/small_crimsite_bricks.json -57b050751e68c9a881d9598cfe8dfb45f19df08c assets/create/models/block/small_crimsite_bricks_wall_post.json -cb01f90c7ac1f56a6f79e1fecb126c349b6d53b0 assets/create/models/block/small_crimsite_bricks_wall_side.json -80932617b1d4b718071c1f8558398ba881743892 assets/create/models/block/small_crimsite_bricks_wall_side_tall.json +c2c72734ac526c319cb01e982824680bfb5f1186 assets/create/models/block/small_calcite_bricks.json +f17f2ecd5e5a32f92ec0ad0ba9e861a80432c0f2 assets/create/models/block/small_calcite_bricks_wall_post.json +1ad7654125aff67267567c0007cc03b8a15131b0 assets/create/models/block/small_calcite_bricks_wall_side.json +10c339f64c0e78f4fbb7a95c10bf7f9f399c0c6b assets/create/models/block/small_calcite_bricks_wall_side_tall.json 827867ddd9b5f6e2daa916c968531c7183ce7fa2 assets/create/models/block/small_crimsite_brick_slab.json dd19ebdbd1a2de827d467b0abd2d1d3ee5822305 assets/create/models/block/small_crimsite_brick_slab_top.json 58048cb41b740b008a98420ea93b567f38e2910f assets/create/models/block/small_crimsite_brick_stairs.json a943586885ea7d48fc27595d9741f97d852446e7 assets/create/models/block/small_crimsite_brick_stairs_inner.json 8dc173b8a9912341ccb9cd8c9a0d2d893571eb85 assets/create/models/block/small_crimsite_brick_stairs_outer.json -cd855b25c38be2c36dcbf6ab0d963a2c76043171 assets/create/models/block/small_deepslate_bricks.json -88a6c43f64c6d53b34719f41707622635108342b assets/create/models/block/small_deepslate_bricks_wall_post.json -dea1773ca9baf9e1a6a7a4288d348127b858c42d assets/create/models/block/small_deepslate_bricks_wall_side.json -673ab543b38a597fd74285cd25b8004c9e2bd706 assets/create/models/block/small_deepslate_bricks_wall_side_tall.json +485f6c0e37b24124ff23efa3f0caa2cfe85663dd assets/create/models/block/small_crimsite_bricks.json +57b050751e68c9a881d9598cfe8dfb45f19df08c assets/create/models/block/small_crimsite_bricks_wall_post.json +cb01f90c7ac1f56a6f79e1fecb126c349b6d53b0 assets/create/models/block/small_crimsite_bricks_wall_side.json +80932617b1d4b718071c1f8558398ba881743892 assets/create/models/block/small_crimsite_bricks_wall_side_tall.json 67c78a3e9250351d0ea18538640b596f05e957a4 assets/create/models/block/small_deepslate_brick_slab.json bc1af783fbcbe73df05e12c93625035db8089d16 assets/create/models/block/small_deepslate_brick_slab_top.json 91e00675337592d17a04032808ca64c4a159c814 assets/create/models/block/small_deepslate_brick_stairs.json 39e78262242637628628a07dc47908fb1593d3f2 assets/create/models/block/small_deepslate_brick_stairs_inner.json d7a61bc4c84070e0fd53e0957a5282078daff7f1 assets/create/models/block/small_deepslate_brick_stairs_outer.json -73e801fb607d76b42e1862323e9d149910a68298 assets/create/models/block/small_diorite_bricks.json -2bdb593d3ae4d856e96cc877f4927da25841af54 assets/create/models/block/small_diorite_bricks_wall_post.json -dd064be7962a2418784a513725fc7b5835e4ab40 assets/create/models/block/small_diorite_bricks_wall_side.json -3753c64785d74f1997b9f8f856fa873302621f39 assets/create/models/block/small_diorite_bricks_wall_side_tall.json +cd855b25c38be2c36dcbf6ab0d963a2c76043171 assets/create/models/block/small_deepslate_bricks.json +88a6c43f64c6d53b34719f41707622635108342b assets/create/models/block/small_deepslate_bricks_wall_post.json +dea1773ca9baf9e1a6a7a4288d348127b858c42d assets/create/models/block/small_deepslate_bricks_wall_side.json +673ab543b38a597fd74285cd25b8004c9e2bd706 assets/create/models/block/small_deepslate_bricks_wall_side_tall.json 59fc1d9dac0b6867779346413953174fc6b55d3c assets/create/models/block/small_diorite_brick_slab.json cbd6fe711e1203aa746d86d12bb85016b7142749 assets/create/models/block/small_diorite_brick_slab_top.json a6c823fa96ba8a06d101ca96a6898fe8a1faf83e assets/create/models/block/small_diorite_brick_stairs.json 7f128501d989122df9d2ab002a497356831caa1c assets/create/models/block/small_diorite_brick_stairs_inner.json 26222975b0efb2acea6473d0bcc99453aa9ed561 assets/create/models/block/small_diorite_brick_stairs_outer.json -7f55f9c8cae6a79a9ab22a4b593a2c5829390573 assets/create/models/block/small_dripstone_bricks.json -fd0880b2e55435c8dc6945fa71c67ba34d7b1e69 assets/create/models/block/small_dripstone_bricks_wall_post.json -c00e9c0bfb108b70975514694f38d3c4cd63e819 assets/create/models/block/small_dripstone_bricks_wall_side.json -26382c01766e04cfe7ea585cabc1baa1c409e0a0 assets/create/models/block/small_dripstone_bricks_wall_side_tall.json +73e801fb607d76b42e1862323e9d149910a68298 assets/create/models/block/small_diorite_bricks.json +2bdb593d3ae4d856e96cc877f4927da25841af54 assets/create/models/block/small_diorite_bricks_wall_post.json +dd064be7962a2418784a513725fc7b5835e4ab40 assets/create/models/block/small_diorite_bricks_wall_side.json +3753c64785d74f1997b9f8f856fa873302621f39 assets/create/models/block/small_diorite_bricks_wall_side_tall.json 7b18bb56d4509f490a73b2812a8e40333f400369 assets/create/models/block/small_dripstone_brick_slab.json 39b7aa7d1494e5328e8774acb8adec8a346e972f assets/create/models/block/small_dripstone_brick_slab_top.json 3d265aed7a723713d525d0fabf3a70600d9d60e4 assets/create/models/block/small_dripstone_brick_stairs.json 2be41e9c1367af7f0eb99856e35900df96974bd4 assets/create/models/block/small_dripstone_brick_stairs_inner.json 4026a9327d47d55218b00b0b4b92464b6448ad91 assets/create/models/block/small_dripstone_brick_stairs_outer.json -ad4cf29e0e67d0d202d5836486531551909c71bf assets/create/models/block/small_granite_bricks.json -d20963cbb5d2321a069bf42d203855a5584f8607 assets/create/models/block/small_granite_bricks_wall_post.json -b860879b66d2d23349fa95ff644d9eba21eb29bd assets/create/models/block/small_granite_bricks_wall_side.json -11593a2a0e307b3e1d847c84d8c61bc78fef2967 assets/create/models/block/small_granite_bricks_wall_side_tall.json +7f55f9c8cae6a79a9ab22a4b593a2c5829390573 assets/create/models/block/small_dripstone_bricks.json +fd0880b2e55435c8dc6945fa71c67ba34d7b1e69 assets/create/models/block/small_dripstone_bricks_wall_post.json +c00e9c0bfb108b70975514694f38d3c4cd63e819 assets/create/models/block/small_dripstone_bricks_wall_side.json +26382c01766e04cfe7ea585cabc1baa1c409e0a0 assets/create/models/block/small_dripstone_bricks_wall_side_tall.json cb0a72cedb6b2b043eaf8c8869648802d74a2eeb assets/create/models/block/small_granite_brick_slab.json d635840492541787d55cc005c7e207532edcdef3 assets/create/models/block/small_granite_brick_slab_top.json ba9bfedf5854fccaba8a5e60c26efb6e34ede3cd assets/create/models/block/small_granite_brick_stairs.json 9bebe59176e74926e28a139dc557c25283285e89 assets/create/models/block/small_granite_brick_stairs_inner.json 15d71900e76c131285447628e63bf1479ce7025a assets/create/models/block/small_granite_brick_stairs_outer.json -6224f2763224d3e746dafdaaf14fae68e2469b93 assets/create/models/block/small_limestone_bricks.json -ca038e240e4157897a6273692db2c952ab5b17d7 assets/create/models/block/small_limestone_bricks_wall_post.json -7920f8cfda77b22d4d29638faa6ae07d89e51ab3 assets/create/models/block/small_limestone_bricks_wall_side.json -6e1fa27744f4592111945e5cafee6d7d67b5299b assets/create/models/block/small_limestone_bricks_wall_side_tall.json +ad4cf29e0e67d0d202d5836486531551909c71bf assets/create/models/block/small_granite_bricks.json +d20963cbb5d2321a069bf42d203855a5584f8607 assets/create/models/block/small_granite_bricks_wall_post.json +b860879b66d2d23349fa95ff644d9eba21eb29bd assets/create/models/block/small_granite_bricks_wall_side.json +11593a2a0e307b3e1d847c84d8c61bc78fef2967 assets/create/models/block/small_granite_bricks_wall_side_tall.json 0e0f551bac87421e6b693aa9ca98fd5da2ee168b assets/create/models/block/small_limestone_brick_slab.json 6669c1e87ed79097f96e7e46eecf3ab6e7c9778c assets/create/models/block/small_limestone_brick_slab_top.json 5aff0145d2fc89549ac541db325dda25b8941583 assets/create/models/block/small_limestone_brick_stairs.json 250aa2c237a9532b19621fa604027433183961c3 assets/create/models/block/small_limestone_brick_stairs_inner.json 92da57d330e9905d017705dd931af1d1d6c1a00d assets/create/models/block/small_limestone_brick_stairs_outer.json -242e4f39f6df26917f21899f0c7d0415a166d4b9 assets/create/models/block/small_ochrum_bricks.json -06cb9faca0062947c08b2a7309a958aac5ab24ac assets/create/models/block/small_ochrum_bricks_wall_post.json -8d9d53206e222839333026c779b66b9fd8cf2cf9 assets/create/models/block/small_ochrum_bricks_wall_side.json -f412fbaa509f7b2d47a27d4bcb13590bfcae74ca assets/create/models/block/small_ochrum_bricks_wall_side_tall.json +6224f2763224d3e746dafdaaf14fae68e2469b93 assets/create/models/block/small_limestone_bricks.json +ca038e240e4157897a6273692db2c952ab5b17d7 assets/create/models/block/small_limestone_bricks_wall_post.json +7920f8cfda77b22d4d29638faa6ae07d89e51ab3 assets/create/models/block/small_limestone_bricks_wall_side.json +6e1fa27744f4592111945e5cafee6d7d67b5299b assets/create/models/block/small_limestone_bricks_wall_side_tall.json 517e3605a9e86a07c673e18d94c2c37109a2aef5 assets/create/models/block/small_ochrum_brick_slab.json 855ad9f6fe03ceb2cc33d9df3536cb4394acfa9b assets/create/models/block/small_ochrum_brick_slab_top.json c5fc35d6b0fe96c11537bc10d34a63ef80f3270c assets/create/models/block/small_ochrum_brick_stairs.json 9a2631d9f6821d2c01bc8b2588a69702d3b083cc assets/create/models/block/small_ochrum_brick_stairs_inner.json 1f0ccdef29dae18535ea304e954e06c91bb0620b assets/create/models/block/small_ochrum_brick_stairs_outer.json +242e4f39f6df26917f21899f0c7d0415a166d4b9 assets/create/models/block/small_ochrum_bricks.json +06cb9faca0062947c08b2a7309a958aac5ab24ac assets/create/models/block/small_ochrum_bricks_wall_post.json +8d9d53206e222839333026c779b66b9fd8cf2cf9 assets/create/models/block/small_ochrum_bricks_wall_side.json +f412fbaa509f7b2d47a27d4bcb13590bfcae74ca assets/create/models/block/small_ochrum_bricks_wall_side_tall.json be96f070be1f838c6fb442c164b5f9b4e5cfcee5 assets/create/models/block/small_rose_quartz_tiles.json -41e56d8e334b81a0d5270bdbe87617981e1f98b4 assets/create/models/block/small_scorchia_bricks.json -56aa81e05019533ce0e0f1ee3ef7bf20fcc400b4 assets/create/models/block/small_scorchia_bricks_wall_post.json -1e1fa90c8b144813770c4d53a3b734ae450895d6 assets/create/models/block/small_scorchia_bricks_wall_side.json -6a46cf73c03a2abea25a81dbb28f4150b355900c assets/create/models/block/small_scorchia_bricks_wall_side_tall.json 6aa3825ace2e73bec454aaa8597e3a892ee29eb7 assets/create/models/block/small_scorchia_brick_slab.json f0378625001171c449a403e372e59623f0fc6569 assets/create/models/block/small_scorchia_brick_slab_top.json 49fa4a3940f84902319df257d39812eb71c8a9e2 assets/create/models/block/small_scorchia_brick_stairs.json 4dee6e6dbe6a98a8eaa04f6812f322343f62fca1 assets/create/models/block/small_scorchia_brick_stairs_inner.json 8a19e7e5c03c155c9ef9332486ae0b069dea0502 assets/create/models/block/small_scorchia_brick_stairs_outer.json -6b435123d852579ba8467c4915cd5d0adaadeca0 assets/create/models/block/small_scoria_bricks.json -86b243074845ca66916ce96ef3774862cf9a39d4 assets/create/models/block/small_scoria_bricks_wall_post.json -57ccb3efbdc4a69cad60c8b90321338ba2e68321 assets/create/models/block/small_scoria_bricks_wall_side.json -d4c5398e10b25d2dc3cb3754a449fc2b60e4074f assets/create/models/block/small_scoria_bricks_wall_side_tall.json +41e56d8e334b81a0d5270bdbe87617981e1f98b4 assets/create/models/block/small_scorchia_bricks.json +56aa81e05019533ce0e0f1ee3ef7bf20fcc400b4 assets/create/models/block/small_scorchia_bricks_wall_post.json +1e1fa90c8b144813770c4d53a3b734ae450895d6 assets/create/models/block/small_scorchia_bricks_wall_side.json +6a46cf73c03a2abea25a81dbb28f4150b355900c assets/create/models/block/small_scorchia_bricks_wall_side_tall.json 918351c1270c26932c0c4783543779a25ca7e986 assets/create/models/block/small_scoria_brick_slab.json 4138e756b4b36f227e178acbcc233edb082ae603 assets/create/models/block/small_scoria_brick_slab_top.json b8e70cd7d9acdcf91be9783cd91d70275a006ea2 assets/create/models/block/small_scoria_brick_stairs.json 625bfbd58440ea4e270d57cc748f2b5f6cece63b assets/create/models/block/small_scoria_brick_stairs_inner.json 602a46fb2736acb8c50b0d04222e6c33e52dee87 assets/create/models/block/small_scoria_brick_stairs_outer.json -a8e8c633dfb6d9f14425b1fd28e88ecf08a88cc6 assets/create/models/block/small_tuff_bricks.json -1c3a22bed504cd7a7e507e83ee21399f8a3fb299 assets/create/models/block/small_tuff_bricks_wall_post.json -1aeb8cac7d0178a18ac1cf98c9a45ca8e67514b0 assets/create/models/block/small_tuff_bricks_wall_side.json -4c6b5c7c60ec4cad314064b171413a3e866e5f99 assets/create/models/block/small_tuff_bricks_wall_side_tall.json +6b435123d852579ba8467c4915cd5d0adaadeca0 assets/create/models/block/small_scoria_bricks.json +86b243074845ca66916ce96ef3774862cf9a39d4 assets/create/models/block/small_scoria_bricks_wall_post.json +57ccb3efbdc4a69cad60c8b90321338ba2e68321 assets/create/models/block/small_scoria_bricks_wall_side.json +d4c5398e10b25d2dc3cb3754a449fc2b60e4074f assets/create/models/block/small_scoria_bricks_wall_side_tall.json 6b2c4d8c8609de0d3d6ce1e30b1dd26ba59cb86d assets/create/models/block/small_tuff_brick_slab.json 1ba07367fcba6a3914f1703115304a7c19979542 assets/create/models/block/small_tuff_brick_slab_top.json 1a5ab239d0f2f041ee04005ceb60111e6848f5de assets/create/models/block/small_tuff_brick_stairs.json be3ee2c36f85a534a71d42a7d63a7816945b3c30 assets/create/models/block/small_tuff_brick_stairs_inner.json aa84e448041d5f74c75565f5e409b1e9b7e5155d assets/create/models/block/small_tuff_brick_stairs_outer.json -e9c75f1b4b663dce09b0a2f8282e574839c19d06 assets/create/models/block/small_veridium_bricks.json -725f6d3dbcfb469cede6fb27a98c1f398f3f3c8c assets/create/models/block/small_veridium_bricks_wall_post.json -b33ee496d43e315a5bed5eaabfd553e361fec1a9 assets/create/models/block/small_veridium_bricks_wall_side.json -80e950f93def51d82a63848b1fb6ac11600ab1bf assets/create/models/block/small_veridium_bricks_wall_side_tall.json +a8e8c633dfb6d9f14425b1fd28e88ecf08a88cc6 assets/create/models/block/small_tuff_bricks.json +1c3a22bed504cd7a7e507e83ee21399f8a3fb299 assets/create/models/block/small_tuff_bricks_wall_post.json +1aeb8cac7d0178a18ac1cf98c9a45ca8e67514b0 assets/create/models/block/small_tuff_bricks_wall_side.json +4c6b5c7c60ec4cad314064b171413a3e866e5f99 assets/create/models/block/small_tuff_bricks_wall_side_tall.json 30b150fe3cf9bdb6ee32cd6b0f51179b44be57d3 assets/create/models/block/small_veridium_brick_slab.json 2158dd9e71f6f60e5132105c68a41ad6e3927438 assets/create/models/block/small_veridium_brick_slab_top.json bbbfc8e3696945ed1f6c3afe73ae0745ff8deda1 assets/create/models/block/small_veridium_brick_stairs.json fc3a996b0ca01c2c09ad84b881c46e92918d084f assets/create/models/block/small_veridium_brick_stairs_inner.json e27a77984e8e28e6032f26bb010efcadfaeb5407 assets/create/models/block/small_veridium_brick_stairs_outer.json +e9c75f1b4b663dce09b0a2f8282e574839c19d06 assets/create/models/block/small_veridium_bricks.json +725f6d3dbcfb469cede6fb27a98c1f398f3f3c8c assets/create/models/block/small_veridium_bricks_wall_post.json +b33ee496d43e315a5bed5eaabfd553e361fec1a9 assets/create/models/block/small_veridium_bricks_wall_side.json +80e950f93def51d82a63848b1fb6ac11600ab1bf assets/create/models/block/small_veridium_bricks_wall_side_tall.json d7c1c2679c8ba543ae7be3b9cf3f4eea3c1a2f68 assets/create/models/block/spruce_window.json f4a4fbb9eea6fb1d0633e349eae6acdaf329e8d5 assets/create/models/block/spruce_window_pane_noside.json 02a25202a42debcd2b4aaa4113e3de4f8f6ee47c assets/create/models/block/spruce_window_pane_noside_alt.json @@ -1682,24 +1559,6 @@ e13aabf77b949a4eaf33c772e8b7112b1a7f1e72 assets/create/models/block/spruce_windo 9bf5008df74b7caea128580021605a6abcae6841 assets/create/models/block/steam_whistle/block_medium_wall_powered.json 92eba6564e2c65e08bc628107fbf89a5ff7ab53e assets/create/models/block/steam_whistle/block_small_floor_powered.json d768a02c31606cc46a4bbd619906e313099cce2d assets/create/models/block/steam_whistle/block_small_wall_powered.json -63d74987f8461b4e94c00030d380d4891707d2ae assets/create/models/block/threshold_switch/block_ceiling_0.json -12496e505374e7fff2d1f800218848635d86ec71 assets/create/models/block/threshold_switch/block_ceiling_1.json -523bc69211b6e90cc381356f103b01b8d7e15771 assets/create/models/block/threshold_switch/block_ceiling_2.json -c62cbd9fe144326c46702ba4e512c832484ea4e8 assets/create/models/block/threshold_switch/block_ceiling_3.json -fe1017b4338d3027771d5eb8b4e2444ddb842b36 assets/create/models/block/threshold_switch/block_ceiling_4.json -d090a659a8df0b86d9892214ac5b06641aaabc9a assets/create/models/block/threshold_switch/block_ceiling_5.json -dffc869ccce392b1908c833631e3df374c6a3012 assets/create/models/block/threshold_switch/block_floor_0.json -ab3d51ab5dd8ef6c1cad5d65406180915340dd7e assets/create/models/block/threshold_switch/block_floor_1.json -7a69fb5a6e77b457c381495c951aa0ba9c7df7f0 assets/create/models/block/threshold_switch/block_floor_2.json -3a6bbc80eea8d824a981e257f8025997946b3260 assets/create/models/block/threshold_switch/block_floor_3.json -a76fae0415604615be0e822394e0879ca81bf166 assets/create/models/block/threshold_switch/block_floor_4.json -28ddae97613f1a06885f06faa20b1b2a5bcaa7db assets/create/models/block/threshold_switch/block_floor_5.json -ab50d142c25c95b0865dd41176cc07a0c76109ac assets/create/models/block/threshold_switch/block_wall_0.json -be730f505bf937db4b3658b2bd3763b514d295c2 assets/create/models/block/threshold_switch/block_wall_1.json -f7f6d92ab5dea5a85ec3d570cdd169329dd4225f assets/create/models/block/threshold_switch/block_wall_2.json -41009d15d22c946a2ed4c6ba98447c3c7cc26315 assets/create/models/block/threshold_switch/block_wall_3.json -ad3204842128db2c7bebdbf3c40fccc45c82de44 assets/create/models/block/threshold_switch/block_wall_4.json -197a6ed7fd9514de13daf58605c24a7156c00bd1 assets/create/models/block/threshold_switch/block_wall_5.json 9e74256a37ee71de978395fb911e6e6db9fcc41e assets/create/models/block/tiled_glass.json 49c76af85635454ba3b6278f7317bb1729c4c58a assets/create/models/block/tiled_glass_pane_noside.json 4319255a3fcb0b9b60cba96273c513329a480a6b assets/create/models/block/tiled_glass_pane_noside_alt.json @@ -1736,101 +1595,85 @@ e84875a4eb11e2161a93ec7569aa2ac1c2f60cef assets/create/models/block/warped_windo 378c865ff8213ff56f1f7a4b2d9cf26c71f036e8 assets/create/models/block/warped_window_pane_post.json f320de08cb113a9ad17acd2ebb8dfc57759e4f7d assets/create/models/block/warped_window_pane_side.json 2fc182d9697b5cddd93b01d1236931af27eee8fe assets/create/models/block/warped_window_pane_side_alt.json -32fdb85b5b62d5a0fb41732874c854788cdd2ba1 assets/create/models/block/waxed_copper_shingles.json fb7fb6deebd502946ab57f1b8a9f4a6b5dd48da3 assets/create/models/block/waxed_copper_shingle_slab.json 660f61112b8e46dec5050cb0ed4ee936965a7c58 assets/create/models/block/waxed_copper_shingle_slab_top.json 5d74be967bbe9feba4b630751f13af817a733d1d assets/create/models/block/waxed_copper_shingle_stairs.json 35cb89f29ce3f8d8af13602c08ecd7afbb7cf56a assets/create/models/block/waxed_copper_shingle_stairs_inner.json fcb9295f4f388e6d439ec9a3906ca326b6d69077 assets/create/models/block/waxed_copper_shingle_stairs_outer.json -32f06f39d0b34e4431795aa6e64f87e58dc1597b assets/create/models/block/waxed_copper_tiles.json +32fdb85b5b62d5a0fb41732874c854788cdd2ba1 assets/create/models/block/waxed_copper_shingles.json 298c6100de02ed9f813397d8ba38c46f35035c69 assets/create/models/block/waxed_copper_tile_slab.json d4422c2d96fb329087d1be70d8b983a8cf6c7f01 assets/create/models/block/waxed_copper_tile_slab_top.json fca72048f916d3a3e567b385c948cc1b59711ef4 assets/create/models/block/waxed_copper_tile_stairs.json 997479b62ed3d81ab633279ecc2fabd9588a3bf3 assets/create/models/block/waxed_copper_tile_stairs_inner.json d5c5bbfb9aaa282e11ad6e6309b1880b172ee653 assets/create/models/block/waxed_copper_tile_stairs_outer.json -19a773f91c58c49301f35965bac02d0c05fb2764 assets/create/models/block/waxed_exposed_copper_shingles.json +32f06f39d0b34e4431795aa6e64f87e58dc1597b assets/create/models/block/waxed_copper_tiles.json a3420b91fdebec40e508a5eebb145c0201bd80c8 assets/create/models/block/waxed_exposed_copper_shingle_slab.json 4178ea5e50ee17b3c15f4a59efd019c4a19bb892 assets/create/models/block/waxed_exposed_copper_shingle_slab_top.json dd2d747774abc86e428a883e299db66cded78e11 assets/create/models/block/waxed_exposed_copper_shingle_stairs.json b6845da62d96a33cee624bb70360e256b26eda83 assets/create/models/block/waxed_exposed_copper_shingle_stairs_inner.json 3d8b758e50e75c5adc26ab6f39f9d73f00866673 assets/create/models/block/waxed_exposed_copper_shingle_stairs_outer.json -9cb20c9d41629d8b9426cb65829365d10966338f assets/create/models/block/waxed_exposed_copper_tiles.json +19a773f91c58c49301f35965bac02d0c05fb2764 assets/create/models/block/waxed_exposed_copper_shingles.json cd21d9d2935b6d0103502e2731c11ea27ff64ecf assets/create/models/block/waxed_exposed_copper_tile_slab.json 0ec039ba59fb0028183433e52131ff355ace5bff assets/create/models/block/waxed_exposed_copper_tile_slab_top.json c51dbd34996ac4513234800e427ac308067d5e1d assets/create/models/block/waxed_exposed_copper_tile_stairs.json 68772d4352dc7ade995dfa57ba41a38ef819e855 assets/create/models/block/waxed_exposed_copper_tile_stairs_inner.json d932671822ba93b71a9c8b50e7207803a1c4dbab assets/create/models/block/waxed_exposed_copper_tile_stairs_outer.json -561beafce41b9e9c0b07bc6b7176dd4f6918c116 assets/create/models/block/waxed_oxidized_copper_shingles.json +9cb20c9d41629d8b9426cb65829365d10966338f assets/create/models/block/waxed_exposed_copper_tiles.json 7e0bab8109e322c6db5fe1d5999c06536c21c6eb assets/create/models/block/waxed_oxidized_copper_shingle_slab.json 42df32c4e2d1ffb2ee62748becfd1717118b440c assets/create/models/block/waxed_oxidized_copper_shingle_slab_top.json b55a733e3e68cfbd08d45bb9ac56deef9f728b60 assets/create/models/block/waxed_oxidized_copper_shingle_stairs.json 7b8745213af5aa7938fc04a295be6a087c72daa8 assets/create/models/block/waxed_oxidized_copper_shingle_stairs_inner.json d89419d48d6ee2f6747e7c93de8699db22ea3f59 assets/create/models/block/waxed_oxidized_copper_shingle_stairs_outer.json -5cf92b628ff1f832966138a58ed87d747681274c assets/create/models/block/waxed_oxidized_copper_tiles.json +561beafce41b9e9c0b07bc6b7176dd4f6918c116 assets/create/models/block/waxed_oxidized_copper_shingles.json ad6134598869711a12e2f95c9b5f25a0f7b8dd93 assets/create/models/block/waxed_oxidized_copper_tile_slab.json c17bac0fd6a20540813c6a1c000a553b7c5ac849 assets/create/models/block/waxed_oxidized_copper_tile_slab_top.json d5b30340364f5536e46bc67e777ef4fa20a36e04 assets/create/models/block/waxed_oxidized_copper_tile_stairs.json b40b315c23cbd3eb4658518bfac836f6091321a5 assets/create/models/block/waxed_oxidized_copper_tile_stairs_inner.json f4eaadab29b4f2e915237340e2d6f4aad4ba21d6 assets/create/models/block/waxed_oxidized_copper_tile_stairs_outer.json -9c73020e80c31cd710c218f9699ba9a795758ad0 assets/create/models/block/waxed_weathered_copper_shingles.json +5cf92b628ff1f832966138a58ed87d747681274c assets/create/models/block/waxed_oxidized_copper_tiles.json 897cfc177b073ca1bcb635c74108567f8748b5c4 assets/create/models/block/waxed_weathered_copper_shingle_slab.json efa57ba131c27e0064c0d958e69b10530a26ac41 assets/create/models/block/waxed_weathered_copper_shingle_slab_top.json 4ef11a7e3de630ad46b9179e8a9a34d55202f6c5 assets/create/models/block/waxed_weathered_copper_shingle_stairs.json f32a18c76cfaca2153f6321880a8da1347be37ce assets/create/models/block/waxed_weathered_copper_shingle_stairs_inner.json 9637f78e51ca7ed812e4c64c52e08f6fa0adbfc3 assets/create/models/block/waxed_weathered_copper_shingle_stairs_outer.json -9782a25341dd2ffb146430edbe6916932250c326 assets/create/models/block/waxed_weathered_copper_tiles.json +9c73020e80c31cd710c218f9699ba9a795758ad0 assets/create/models/block/waxed_weathered_copper_shingles.json 0c9669588972d4c2152bd2b043b8386b76a6e1c4 assets/create/models/block/waxed_weathered_copper_tile_slab.json 2d01a583cc948e9e0cb814cad968ed16a07dd46c assets/create/models/block/waxed_weathered_copper_tile_slab_top.json e26dd64495ff8801593e9c22203cbf364075badd assets/create/models/block/waxed_weathered_copper_tile_stairs.json b658c1022587bd670b5acee267607719c1544332 assets/create/models/block/waxed_weathered_copper_tile_stairs_inner.json e7ae89577be9d26a071bf96cbd7ed80293902b63 assets/create/models/block/waxed_weathered_copper_tile_stairs_outer.json -9c73020e80c31cd710c218f9699ba9a795758ad0 assets/create/models/block/weathered_copper_shingles.json +9782a25341dd2ffb146430edbe6916932250c326 assets/create/models/block/waxed_weathered_copper_tiles.json 897cfc177b073ca1bcb635c74108567f8748b5c4 assets/create/models/block/weathered_copper_shingle_slab.json efa57ba131c27e0064c0d958e69b10530a26ac41 assets/create/models/block/weathered_copper_shingle_slab_top.json 4ef11a7e3de630ad46b9179e8a9a34d55202f6c5 assets/create/models/block/weathered_copper_shingle_stairs.json f32a18c76cfaca2153f6321880a8da1347be37ce assets/create/models/block/weathered_copper_shingle_stairs_inner.json 9637f78e51ca7ed812e4c64c52e08f6fa0adbfc3 assets/create/models/block/weathered_copper_shingle_stairs_outer.json -9782a25341dd2ffb146430edbe6916932250c326 assets/create/models/block/weathered_copper_tiles.json +9c73020e80c31cd710c218f9699ba9a795758ad0 assets/create/models/block/weathered_copper_shingles.json 0c9669588972d4c2152bd2b043b8386b76a6e1c4 assets/create/models/block/weathered_copper_tile_slab.json 2d01a583cc948e9e0cb814cad968ed16a07dd46c assets/create/models/block/weathered_copper_tile_slab_top.json e26dd64495ff8801593e9c22203cbf364075badd assets/create/models/block/weathered_copper_tile_stairs.json b658c1022587bd670b5acee267607719c1544332 assets/create/models/block/weathered_copper_tile_stairs_inner.json e7ae89577be9d26a071bf96cbd7ed80293902b63 assets/create/models/block/weathered_copper_tile_stairs_outer.json -045b812ddb1ca8dd6cd9b49852ddbd37f86cd2a6 assets/create/models/block/weathered_iron_block.json -a569ddd725898a86f8745e46723edeff7fe7f2e9 assets/create/models/block/weathered_iron_window_1.json -133928d853037efb81022b69377669f0b16239bc assets/create/models/block/weathered_iron_window_2.json -06b0109b8dd43f433de00ff271042b416be7d86c assets/create/models/block/weathered_iron_window_3.json -f7199168a6ac364a03c52dd186bf8a3ec79954e4 assets/create/models/block/weathered_iron_window_4.json -847adaa7197d84669d4c69146595980f179f44e7 assets/create/models/block/weathered_iron_window_pane_noside.json -c0f40f2f698ebc2f2a3affd8aa7520735debb577 assets/create/models/block/weathered_iron_window_pane_noside_alt.json -48a7646b44a34d9721311bbf489214a02ca5cf83 assets/create/models/block/weathered_iron_window_pane_post.json -f6d98f8518f48feb8faf5691ce1de02e9430eefa assets/create/models/block/weathered_iron_window_pane_side.json -94a6c852930e980640a5733536bac21b1c327d18 assets/create/models/block/weathered_iron_window_pane_side_alt.json +9782a25341dd2ffb146430edbe6916932250c326 assets/create/models/block/weathered_copper_tiles.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/white_nixie_tube.json -998d838964c6c5bc2a1903b5098491abf5d819bc assets/create/models/block/white_postbox_closed.json -e89fe63260b94fc70e360eceb3d04b74242c248f assets/create/models/block/white_postbox_open.json 99f0628623a36ac1700a5876cec010ee6353162f assets/create/models/block/white_seat.json -29d6f3efddd06f6c9fd876aefb3f95043fc928e6 assets/create/models/block/white_table_cloth.json f252f8c68702a0c050797a2dc2a51c586408722d assets/create/models/block/white_toolbox.json c9e344a06ee8bca1bfddd70481198135cabafbce assets/create/models/block/white_valve_handle.json 68d8eddfb724c73938862fb1a213a99c95814fdb assets/create/models/block/windmill_bearing.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/yellow_nixie_tube.json -9abbd0af47396b1cb18362b423f497ddb40eede4 assets/create/models/block/yellow_postbox_closed.json -098b675ef5071a32bce387445da09067917852c7 assets/create/models/block/yellow_postbox_open.json cf8477d6c7558ceba38416fae755567086a856a6 assets/create/models/block/yellow_sail.json 07b68f0e4c617dfe3e935a1b9e8e020ab3131c0b assets/create/models/block/yellow_seat.json -199a767acb9a27b5fead0870c00068f3f5602bc4 assets/create/models/block/yellow_table_cloth.json 21bb6e0b43984214c496e531e16dd60aeb619a42 assets/create/models/block/yellow_toolbox.json 467109ede866fb030d2cdc46c832643630d982b5 assets/create/models/block/yellow_valve_handle.json 23d6852eca1bf1480dc74ed51d15c098e26a520f assets/create/models/block/zinc_block.json 617330267f01a08062b05b8516082d7ebdab3d0b assets/create/models/block/zinc_ore.json 86b835fa8d2264feb2159262b069c6c2cf68e818 assets/create/models/item/acacia_window.json -697eda24a3a1c79401d7d073a503804cb589e2f5 assets/create/models/item/acacia_window_pane.json +ab7e40e22fedad4ae69281eb6137e699110327a2 assets/create/models/item/acacia_window_pane.json feb7bd45dc6ec0542c7af648b371e54168641d1e assets/create/models/item/adjustable_chain_gearshift.json be9e4a7937dcb87bce696e6ad234c9eff8cd299e assets/create/models/item/analog_lever.json 626cc26c8a7a2742b991b432c5104981183f1eb6 assets/create/models/item/andesite_alloy.json 158270c9fa3022d1afb56002d0ea1db3366467aa assets/create/models/item/andesite_alloy_block.json -d497fcfe54f9caddf1925cc303f9f9a62015e0ae assets/create/models/item/andesite_bars.json +0a79ae7caa46f64085e0bd7d94018a46f53920b3 assets/create/models/item/andesite_bars.json 11c747281cbe2d96324db27fec020100b50977d0 assets/create/models/item/andesite_casing.json ab09b7886916048add1fa0ea9e87c4644a781031 assets/create/models/item/andesite_door.json 944cbae9f7c4bf7d1734d25645cfa6b0d0f2c33d assets/create/models/item/andesite_encased_cogwheel.json @@ -1840,33 +1683,25 @@ af792bb7d70029e66cc8aa21ed61322f899fb134 assets/create/models/item/andesite_enca 113fb6cb131bc3cdf63f558be71b8d77f9ae64c9 assets/create/models/item/andesite_ladder.json f187d676688c728804ab3758eb4b78a431c7ec21 assets/create/models/item/andesite_pillar.json d0dd86f6c7418c27c0f930cfd20e0867936eca3d assets/create/models/item/andesite_scaffolding.json -2ef7426efa3c2609e67d2eef73f6f84a1b13d46c assets/create/models/item/andesite_table_cloth.json d5375c3de6272a00f3e3787fee6b8255f828d686 assets/create/models/item/andesite_tunnel.json d6eb7105dd9b42adde48bd70e3f2fba70751c1db assets/create/models/item/asurine.json 8b61987c61ae461e4bea0fccf5b1bb3399ac9226 assets/create/models/item/asurine_pillar.json a8e9fab6ce8dc5da29b451c827663fb553669a23 assets/create/models/item/attribute_filter.json -2a57b4e07c5a853d4875fae7916cdb71f3b3f378 assets/create/models/item/bamboo_window.json -69f07020d66498909df3bd37fa6e1a09cb06788e assets/create/models/item/bamboo_window_pane.json 6913f9acbb272de28387918ce92984fa767b4389 assets/create/models/item/bar_of_chocolate.json def88cd2c79a1f0ed40bbf5a0332187dd1d6006e assets/create/models/item/basin.json 35a1e2cb2645a8386dfee2697b47547b3f9a1dd2 assets/create/models/item/belt_connector.json f5dcb9096a52d5d2eab1e4204fbd1222e0d5094d assets/create/models/item/birch_window.json -eccafeec52e4195fbe211c602b4fc71a260d8a64 assets/create/models/item/birch_window_pane.json -641b85751f91c0b4931307548c12034fc56286bc assets/create/models/item/black_postbox.json +9589b0f3d31028c1499a49298600eede6d84f7bb assets/create/models/item/birch_window_pane.json 7ca635d45fef81e6681a492be6c7bb71fd0f4574 assets/create/models/item/black_seat.json -67256e7c62c3ed2cee1dc88c2437083966165f92 assets/create/models/item/black_table_cloth.json e2dc1a8db84d84d592bfd91a26464343b8706bc0 assets/create/models/item/black_toolbox.json 20fbeb136e85d146c0e041f7f1570b1d1fd34585 assets/create/models/item/black_valve_handle.json c31038397821b6abe296d2799aa81edf3c12d095 assets/create/models/item/blaze_burner.json 9d28754112688323a6b55ecb6742e918eabfd6a3 assets/create/models/item/blaze_cake.json 01637416bb932d861e9c9b10b256b2fdf4c96d44 assets/create/models/item/blaze_cake_base.json -ef453775edb9342dc68e0e4ed7aa2e845b819fa6 assets/create/models/item/blue_postbox.json de8beb7ef521822eb9b2826806baf1fa3344a45d assets/create/models/item/blue_seat.json -b1059dd00b8b4102e345a3d4f3e903a92c372ea1 assets/create/models/item/blue_table_cloth.json a82bc56a503cd15d2354c86a49fc6d1d4ed22767 assets/create/models/item/blue_toolbox.json 2f90f781cd9b5d144a6cfd4748ae3a87c9f12ba8 assets/create/models/item/blue_valve_handle.json -d16ce54ed4e2546f168d3bcf7d748ff749565316 assets/create/models/item/bound_cardboard_block.json -4e711f64e0ab7d16c550cc4aa8b876d604dfb2af assets/create/models/item/brass_bars.json +8facd82128e77ed41de3bb92d7714e56fc58ada6 assets/create/models/item/brass_bars.json 136f97f26217c51c932d79bf715b2a1a92e6595e assets/create/models/item/brass_block.json c876713c3b8ed6511679d1e3186e6d6031190dd5 assets/create/models/item/brass_casing.json 378a2f1820c9abdc1080c940e5a01e30c25ea5cb assets/create/models/item/brass_door.json @@ -1880,70 +1715,13 @@ a51a28424e75dbd11c845f455c778d4c578b9da4 assets/create/models/item/brass_ladder. 55208677f9135c3ca897c2432caa332bb1b858f2 assets/create/models/item/brass_nugget.json af97ba84be90381e2cc9434e31e2199c2e7e3aa6 assets/create/models/item/brass_scaffolding.json b78e9274156f5027a9a3b6fb7725c57a7aecc8bb assets/create/models/item/brass_sheet.json -7085ab446db5fa59aafe9bbba41c0e0f43bf749a assets/create/models/item/brass_table_cloth.json 28e104d5041c1f4676704c0f6b4e2e80aac43106 assets/create/models/item/brass_tunnel.json -35c8539a0b2f927e65a43c3a2c3cb82db429c2eb assets/create/models/item/brown_postbox.json fce64539b36fc8a5ffa39d7a3f73765818437cbf assets/create/models/item/brown_seat.json -a126a50454ea449e66c6f6e36eb96bff96652c92 assets/create/models/item/brown_table_cloth.json 90c1ec317beed0b5735c8731e3115a695b7060f7 assets/create/models/item/brown_toolbox.json 9477ab491586f1314bebf4d58387425ae56d0bad assets/create/models/item/brown_valve_handle.json 1db479848369140bb913ba09f3f1d994e4ac864c assets/create/models/item/builders_tea.json f5ff4e2ed2ea2e43b6d02f6a95ba02b2e4b611dc assets/create/models/item/calcite_pillar.json -cc2692f7964f4266ecf00fcab176b1ef0b78673f assets/create/models/item/cardboard.json -607272f2b906fdffd46677d47a4e6ecb94184eff assets/create/models/item/cardboard_block.json -70ab4eb53188efef1a157823ce90e5fd09e35d3c assets/create/models/item/cardboard_boots.json -5c67ce75ffe3f5c9a32877ffdb4005b2a44d6483 assets/create/models/item/cardboard_boots_amethyst_trim.json -2027e70e42e1c931537e591c51b1f2d1aed6833c assets/create/models/item/cardboard_boots_copper_trim.json -881e17e4d8b2be53403833ee262a7a17040695bd assets/create/models/item/cardboard_boots_diamond_trim.json -ae9617e768f8a711d932a5137bd7946c7bb1fbe3 assets/create/models/item/cardboard_boots_emerald_trim.json -62dbafe3a1493be7d46270168e57ff1f866bc669 assets/create/models/item/cardboard_boots_gold_trim.json -dcdc125780505d55bf76302fe982b23083c08845 assets/create/models/item/cardboard_boots_iron_trim.json -86a5435fcf899530bd1caa3fdf83e1dee337f22d assets/create/models/item/cardboard_boots_lapis_trim.json -527602bacf19e6ddb40023e1ad9fd532d96699ed assets/create/models/item/cardboard_boots_netherite_trim.json -bf4ec4f542e5d96ca9b6b90e298526acaa8cb8b9 assets/create/models/item/cardboard_boots_quartz_trim.json -d0a89aae893a45b14173f2f104dc0bb72d14516e assets/create/models/item/cardboard_boots_redstone_trim.json -169470769f90bb6fa0e503c78d8dde4bf63c0e7f assets/create/models/item/cardboard_chestplate.json -37ba0d5584aabd317e984d46e2e56622c10c74d0 assets/create/models/item/cardboard_chestplate_amethyst_trim.json -e50df07949d1a0a7e54e5b1635827adf8c250583 assets/create/models/item/cardboard_chestplate_copper_trim.json -1b82a900bb783a55a32d308fbec4c103981ca0ea assets/create/models/item/cardboard_chestplate_diamond_trim.json -90f5afe6a3e8292a37814ae6b8d1ca78bf1279b7 assets/create/models/item/cardboard_chestplate_emerald_trim.json -84ac8525c149e6f630fa02ca53d1e0a0b5f55b3e assets/create/models/item/cardboard_chestplate_gold_trim.json -6327a6514a3c19e9faf31c5388103e1e8cc7d01c assets/create/models/item/cardboard_chestplate_iron_trim.json -0df84176624b1cb081f8bff881156fbe530fda43 assets/create/models/item/cardboard_chestplate_lapis_trim.json -f27591c2befb21f6aa944bd2f54e7c4f58833917 assets/create/models/item/cardboard_chestplate_netherite_trim.json -3ace2f1c1a773d5d9d2b4f3d6c93f742d9bd971d assets/create/models/item/cardboard_chestplate_quartz_trim.json -9e74713fbdc8d90697f264562316f991de51d49e assets/create/models/item/cardboard_chestplate_redstone_trim.json -0b46dc6ac222fcf998100f1656047058fb8ef1ee assets/create/models/item/cardboard_helmet.json -61fad07fcc7da51ed9806938c7c1d930481015d2 assets/create/models/item/cardboard_helmet_amethyst_trim.json -c185e1b969ffb78df3d956a5907486a5abe81d55 assets/create/models/item/cardboard_helmet_copper_trim.json -b5ecea23091e2fa7d0b004a73a210ec4cf970035 assets/create/models/item/cardboard_helmet_diamond_trim.json -1b908f938a492f1faddf7f47e44f99dd0e0cc700 assets/create/models/item/cardboard_helmet_emerald_trim.json -f7096241733b0623eade076fcc536c0a3dd9f252 assets/create/models/item/cardboard_helmet_gold_trim.json -079c0ea69a5c8a7d1bb2e1bdd23ccc9c92e036d5 assets/create/models/item/cardboard_helmet_iron_trim.json -4db478f4669c26edef502b87be277be314933cab assets/create/models/item/cardboard_helmet_lapis_trim.json -ab46809613299865e33dcca39df597a239174df8 assets/create/models/item/cardboard_helmet_netherite_trim.json -03d4eb863c7b4cfc60a81b270a569440f0c62c85 assets/create/models/item/cardboard_helmet_quartz_trim.json -2703a1c5c65fe5c74c03bfe8ab6acfc4e5849cf9 assets/create/models/item/cardboard_helmet_redstone_trim.json -9987b29466b2a83ef25c66f51086b26ccd2c5a5b assets/create/models/item/cardboard_leggings.json -6a98f395678073c3ec0c09556b38cc9ac9e63492 assets/create/models/item/cardboard_leggings_amethyst_trim.json -5e932da44be1022af8c97061caca61a97c99b6d6 assets/create/models/item/cardboard_leggings_copper_trim.json -e010c6af3e4c3c5cba26491c84c2c73c3c9386c7 assets/create/models/item/cardboard_leggings_diamond_trim.json -6f7a3ed21abf915f5803922db3a15fb6210162c6 assets/create/models/item/cardboard_leggings_emerald_trim.json -8176633be5a2ea548fa39df1d875a29851a7b091 assets/create/models/item/cardboard_leggings_gold_trim.json -56254db2e5432386b4de1ab00603f72255a8aa61 assets/create/models/item/cardboard_leggings_iron_trim.json -ca37276063d58483994ab51e3f72ef20521902c2 assets/create/models/item/cardboard_leggings_lapis_trim.json -55dfc8af30c392b0a70390d90c4239aba011d0ac assets/create/models/item/cardboard_leggings_netherite_trim.json -3f7d0d84790570dd92bb83071d6ecfddadce047d assets/create/models/item/cardboard_leggings_quartz_trim.json -47963712e6a470c5d14d7ea1bc8fff2a0553267b assets/create/models/item/cardboard_leggings_redstone_trim.json -123f7b8f5129e07beead05846744ff06161ec7a1 assets/create/models/item/cardboard_package_10x12.json -4f22bc19ebf19be0efc32b5d2fe449349e6f5b2f assets/create/models/item/cardboard_package_10x8.json -599d305569d025d8771993d0b56a377f910e2a95 assets/create/models/item/cardboard_package_12x10.json -563720f20bee58dfc5b2c628cd037f7b6daf6a34 assets/create/models/item/cardboard_package_12x12.json -9dccb21720687bbd516c8598c5449028077f8467 assets/create/models/item/cardboard_sword.json 1cdb2b8801551c1540bb9b2a9cc3d725a2b433e7 assets/create/models/item/cart_assembler.json -390a06d81c8c2a0ff83196bd0154dd292206e3b6 assets/create/models/item/chain_conveyor.json -74c265b6ea2df76ae1b2e8e920eaa91749f74c1a assets/create/models/item/cherry_window.json -30395c9018e273105b20cc35737f501696529acf assets/create/models/item/cherry_window_pane.json a197d08618f4035182c91a6b16031eb681ab8a7c assets/create/models/item/chest_minecart_contraption.json 293cfa8b1073f8641a2c623b73a90907576c36ed assets/create/models/item/chocolate_bucket.json 77654cbd16cdfa95181ea3f85fcfa3cd352b69fd assets/create/models/item/chocolate_glazed_berries.json @@ -1962,7 +1740,7 @@ de48f4b6fa26928ebc7d5d60e6a0767093430d65 assets/create/models/item/contraption_c 6a4e8aa37120fa8238be72fb2c732f9ab5670d53 assets/create/models/item/controls.json 68d0bd260e5062448ca9008f7cf44e963d941653 assets/create/models/item/copper_backtank.json 6c53b1a6ed28929b7a0a090edf6101e610f842fc assets/create/models/item/copper_backtank_placeable.json -2a0b31d76ab8a74c458475640d17de15ad314fcd assets/create/models/item/copper_bars.json +aaac7663d062731433c920d94a24b9b3a521dd8c assets/create/models/item/copper_bars.json 688e4dee99126b7507761de618d6788c18f17153 assets/create/models/item/copper_casing.json 68890c027cd6a094b484a237d3ff5daeb09622af assets/create/models/item/copper_diving_boots.json 23499699c6ea6a30673835056f5d0039519413fa assets/create/models/item/copper_diving_helmet.json @@ -1971,13 +1749,12 @@ de48f4b6fa26928ebc7d5d60e6a0767093430d65 assets/create/models/item/contraption_c ccdf08652511e5737a8489d86ea9422ade4f4ca5 assets/create/models/item/copper_nugget.json 86a770e9b2af1f19bf633f5cfeecd84848f73fbd assets/create/models/item/copper_scaffolding.json a4fd2f4f00e03b2ac5d863e93827d39a984cc2ff assets/create/models/item/copper_sheet.json -13b18ba2938e283d507fbca70518cf52198cdc71 assets/create/models/item/copper_shingles.json 79d9f8667965072f12e51e6601b5c36f8acc125f assets/create/models/item/copper_shingle_slab.json 9fe6f0bdea4595b403ed2d2cbc2023a9abeb79f0 assets/create/models/item/copper_shingle_stairs.json -9a33eeb0f7c682ee2f8c0abbfa174f8828acc2b5 assets/create/models/item/copper_table_cloth.json -19642e4ea5deecaf57059827c4c13a19d2e73822 assets/create/models/item/copper_tiles.json +13b18ba2938e283d507fbca70518cf52198cdc71 assets/create/models/item/copper_shingles.json a7147444fc28a4cce21b6cf38e9528537e27c352 assets/create/models/item/copper_tile_slab.json 7330324d6c64f0340d676ecef83a930515d9130e assets/create/models/item/copper_tile_stairs.json +19642e4ea5deecaf57059827c4c13a19d2e73822 assets/create/models/item/copper_tiles.json 08c35e85afe4eb2b106133c5d9c7d7c64ca9a915 assets/create/models/item/copper_valve_handle.json 5cec229a3117ea5987aa42288c070427ac48a5dc assets/create/models/item/copycat_panel.json 1b6707005830ca066a7e997c73391ca88c70bdb0 assets/create/models/item/copycat_step.json @@ -1990,7 +1767,7 @@ ad620bd5eb32a41b0a8a130f49ab3dbb398907e5 assets/create/models/item/creative_moto 612778c4a390c3fc9de7ef40713375dc7be85270 assets/create/models/item/crimsite.json e432e359b77e7129e18c1d4daf68d11c4a661110 assets/create/models/item/crimsite_pillar.json 9c77e6d7d56310b34468a6d52080e477e893494d assets/create/models/item/crimson_window.json -43625514f941a61cfbae339419d0de4b22db9662 assets/create/models/item/crimson_window_pane.json +cfad32c8024f9f1479aed6916735a4d75b16dc4e assets/create/models/item/crimson_window_pane.json 189ddf2f3c83608ddfe9e8d2fe88d8b4610ade13 assets/create/models/item/crushed_raw_aluminum.json 4e74e066349d0311064e21fd72aa40e249e2e830 assets/create/models/item/crushed_raw_copper.json 513ccb83879e523f8df66a4ad8aee0ecab1ba003 assets/create/models/item/crushed_raw_gold.json @@ -2007,129 +1784,126 @@ b6acd86be9e6cac8b9ed2bc6297d27941ca05f46 assets/create/models/item/crushed_raw_z b67e95801010eab58de02f2b0160bff3f008bd18 assets/create/models/item/crushing_wheel.json af189b0c04482064520d84546d81af8154824292 assets/create/models/item/cuckoo_clock.json 314fb287c7b16a6478fbefde0da80de8828b684e assets/create/models/item/cut_andesite.json -e2840073eac2e6419cd312b3d0177d4c64a5346c assets/create/models/item/cut_andesite_bricks.json 680fe77d50f7c3253ec4997f74761f962b784e15 assets/create/models/item/cut_andesite_brick_slab.json 3c1d56f9686bb2b97c168b0509ddfd06e80be9a0 assets/create/models/item/cut_andesite_brick_stairs.json 4222b965f8a18f78b92838e4642a28fa3e0ad648 assets/create/models/item/cut_andesite_brick_wall.json +e2840073eac2e6419cd312b3d0177d4c64a5346c assets/create/models/item/cut_andesite_bricks.json c100e02ef9b05f4f6df3ddbbfe91db1032d4854b assets/create/models/item/cut_andesite_slab.json f435a67b3d89d12b6e8cb5071a67e35f0918dc79 assets/create/models/item/cut_andesite_stairs.json df9084d532a085220280bc7bee579e1079fbf786 assets/create/models/item/cut_andesite_wall.json 025eedca45b222b91d93b9a3a89fac5ad328b152 assets/create/models/item/cut_asurine.json -1ceb483f428448f00a08541fbcf4f4787aef3f1e assets/create/models/item/cut_asurine_bricks.json 022c56e7aafa7ca4cdd1a88426eb43f9e02c3cc2 assets/create/models/item/cut_asurine_brick_slab.json 3131e09a221c2f0a17cfc7277603f2e3c8164bc7 assets/create/models/item/cut_asurine_brick_stairs.json dc1f5f03acc1165606c48df97953164f6bd7f092 assets/create/models/item/cut_asurine_brick_wall.json +1ceb483f428448f00a08541fbcf4f4787aef3f1e assets/create/models/item/cut_asurine_bricks.json e81d7df1f1b8281c38400713b09cbac59c4d53cc assets/create/models/item/cut_asurine_slab.json cf534603fe71423e0ab80d431ab12394d0a6bb21 assets/create/models/item/cut_asurine_stairs.json 7ca803f5a7798ea034db6385a5f36a48e235c247 assets/create/models/item/cut_asurine_wall.json 707fb799ca44280cad0b817f29a7c75dd0f0ce5e assets/create/models/item/cut_calcite.json -5678b9f76823efac2c6624acc7b2b911402112f4 assets/create/models/item/cut_calcite_bricks.json f794423b242228c43345dc1f40653133fb7f3db6 assets/create/models/item/cut_calcite_brick_slab.json 8e9b46e52758ec7f21c3b84c212e2f6565bf71d9 assets/create/models/item/cut_calcite_brick_stairs.json 1447d21b7fc331528bfd15e5b9d694eb1a31cfb3 assets/create/models/item/cut_calcite_brick_wall.json +5678b9f76823efac2c6624acc7b2b911402112f4 assets/create/models/item/cut_calcite_bricks.json c78c99c78a19097d890414b21270014b52bafd8d assets/create/models/item/cut_calcite_slab.json e6a9144a4bb9e5af3f57d0acdb26d66dc4547217 assets/create/models/item/cut_calcite_stairs.json daf2a2513f6636d140c23b90ba87aad35476c498 assets/create/models/item/cut_calcite_wall.json 29f2bc72aa50cdf34d1d5bfd01a4512d5974dc65 assets/create/models/item/cut_crimsite.json -20bc810ca5b2a35a423e57f287e2f42ad9940b89 assets/create/models/item/cut_crimsite_bricks.json 7c37d3de9674e70595498d1c46c5693d9f39a502 assets/create/models/item/cut_crimsite_brick_slab.json b974c0f2f0e5119d9bac6a36946d4dfdd65b4b5f assets/create/models/item/cut_crimsite_brick_stairs.json c1289ddff572149b2171859689228615802dc825 assets/create/models/item/cut_crimsite_brick_wall.json +20bc810ca5b2a35a423e57f287e2f42ad9940b89 assets/create/models/item/cut_crimsite_bricks.json 8855eb44a68277668c77858715652d6851fa507f assets/create/models/item/cut_crimsite_slab.json 57101d3c2d570bc2c389c1e05e1354d79de70a0a assets/create/models/item/cut_crimsite_stairs.json a10cd65d675a05b9dfbdac67a2d9ca3b4381396a assets/create/models/item/cut_crimsite_wall.json a4ad900cf65136835c259c1e349781538d537a9c assets/create/models/item/cut_deepslate.json -81b10b5d159db4000f4f6569b83fc7e8f702f015 assets/create/models/item/cut_deepslate_bricks.json a63bbe474ca7d8ceafb6bfcb21a88841980fe8e6 assets/create/models/item/cut_deepslate_brick_slab.json 7c1ad49844eafbd87f8c69a077a8c18ccdd4a919 assets/create/models/item/cut_deepslate_brick_stairs.json 6a4ee2e810731e0702c1493237343a567cc736d6 assets/create/models/item/cut_deepslate_brick_wall.json +81b10b5d159db4000f4f6569b83fc7e8f702f015 assets/create/models/item/cut_deepslate_bricks.json ff0d08d1b59de36b016f7952d2bd72d8e1eb1293 assets/create/models/item/cut_deepslate_slab.json 627c806a6eba8b730682821deb31627d75683e88 assets/create/models/item/cut_deepslate_stairs.json 9bdb85a688b09eb34eb8024a6808406118f78133 assets/create/models/item/cut_deepslate_wall.json c33c48d71d98f4b8a84c7f0a4ee88918fed3e798 assets/create/models/item/cut_diorite.json -e8a697df63b0b5fa74dbc70e76b55718a2cc388f assets/create/models/item/cut_diorite_bricks.json 63bc297b782c40c513873b7f8fd8284abce01753 assets/create/models/item/cut_diorite_brick_slab.json f604d088c8c7c6d847795459231d0df8c73d95fb assets/create/models/item/cut_diorite_brick_stairs.json b06be3da6017aa7fbc38b8aecda0d30dae313c13 assets/create/models/item/cut_diorite_brick_wall.json +e8a697df63b0b5fa74dbc70e76b55718a2cc388f assets/create/models/item/cut_diorite_bricks.json 4650f375365caeb237947f6e933d174ebbfbc1e2 assets/create/models/item/cut_diorite_slab.json 933d14f51272b39fc13e94d58f3100469d7cbe06 assets/create/models/item/cut_diorite_stairs.json 0cc44bb9ad0ed3ff11bc6113d0a9e31e99b169b8 assets/create/models/item/cut_diorite_wall.json e2123180fd5312d1e67b3a030fcbc4b6f11aa8bf assets/create/models/item/cut_dripstone.json -4b5d7bbee5741b112e2cb354c5fe49c088fc9b2f assets/create/models/item/cut_dripstone_bricks.json a815b2a927853d6d82d8b69f862be3091c5c8caa assets/create/models/item/cut_dripstone_brick_slab.json b8cb1b04eb869a06ded04c4c3acac6e5a315ee78 assets/create/models/item/cut_dripstone_brick_stairs.json 87fafd603eb4ba41981cd9c9371ac4618909f94d assets/create/models/item/cut_dripstone_brick_wall.json +4b5d7bbee5741b112e2cb354c5fe49c088fc9b2f assets/create/models/item/cut_dripstone_bricks.json 756c801f6bba006fbfd3486e95ba870909ab2902 assets/create/models/item/cut_dripstone_slab.json c59d314e1b5cce1c3745ce164c2a094e17f7a003 assets/create/models/item/cut_dripstone_stairs.json 125b24d28a9957740855467440ad8508d21c24d7 assets/create/models/item/cut_dripstone_wall.json 2fbce0b481f7cf2cf4f0fd03c86ef743b7c30879 assets/create/models/item/cut_granite.json -d8860602cc52fac5a09354c56e78fdfd7d9cb6a9 assets/create/models/item/cut_granite_bricks.json 3584117ed8a69c3842fde1d6accfaaa2c72e44f4 assets/create/models/item/cut_granite_brick_slab.json c68d1c09b9091bc501279115be16f83508b88fed assets/create/models/item/cut_granite_brick_stairs.json 5a37b24319a8708e444902eae3596b68daaffd15 assets/create/models/item/cut_granite_brick_wall.json +d8860602cc52fac5a09354c56e78fdfd7d9cb6a9 assets/create/models/item/cut_granite_bricks.json c2f6603e8cbfc0cdf5e5ef10c6a4baef9c917b6d assets/create/models/item/cut_granite_slab.json 66f8e6d556446441e157427437e9563075e2d6ce assets/create/models/item/cut_granite_stairs.json fe06c8aeab9e4c8a145375af46cbdaed701baad4 assets/create/models/item/cut_granite_wall.json b5c3df9c28a14683a363769cad5d154af56b8da4 assets/create/models/item/cut_limestone.json -7d026353711a464400e69c7e86c9b9c6aa70bf6d assets/create/models/item/cut_limestone_bricks.json 2822ebe1d4211f240e31866759e25add5f0fb56d assets/create/models/item/cut_limestone_brick_slab.json 694dfb73585167011d8123d64f5896697594f4ce assets/create/models/item/cut_limestone_brick_stairs.json db8851d6a1b7604ca1ba7615e1f162f6f5220801 assets/create/models/item/cut_limestone_brick_wall.json +7d026353711a464400e69c7e86c9b9c6aa70bf6d assets/create/models/item/cut_limestone_bricks.json 75584aa5e06168d8866b022fcd72377351b774d9 assets/create/models/item/cut_limestone_slab.json 1df9a186a146e597b48da4c4461f1a98ecf3646a assets/create/models/item/cut_limestone_stairs.json b70ac5462ef4d0363332656aa7cb82919f679893 assets/create/models/item/cut_limestone_wall.json 92bc693db4e0ba6164cd35d4f5fa0982f3b8f796 assets/create/models/item/cut_ochrum.json -3e8e00c602b1fbce888e6fe22d9525f1c025129d assets/create/models/item/cut_ochrum_bricks.json 1edc47c279fadde74322d3fa89ef776bdd6fb354 assets/create/models/item/cut_ochrum_brick_slab.json 4678e2a97c73139b458cea657a55f74659bc36d5 assets/create/models/item/cut_ochrum_brick_stairs.json 85044ec7033cd4c6aa913c4c4bb6c0e3a4386023 assets/create/models/item/cut_ochrum_brick_wall.json +3e8e00c602b1fbce888e6fe22d9525f1c025129d assets/create/models/item/cut_ochrum_bricks.json e0e494fb7fa1767241507347318560335339a2a8 assets/create/models/item/cut_ochrum_slab.json de7c5917bcb14f398d39e3932bfe5e1967ed7a24 assets/create/models/item/cut_ochrum_stairs.json 5a8f8c84e95ee0ab97106a801a456282f5ac207c assets/create/models/item/cut_ochrum_wall.json 1631a807135cf993d9a81068c65e78face2f24e0 assets/create/models/item/cut_scorchia.json -5ecb9692e478e29d64aeb5867e8677671560755d assets/create/models/item/cut_scorchia_bricks.json ac3a29573ce099ac57f59d0a2f1cdc0a453e0621 assets/create/models/item/cut_scorchia_brick_slab.json d3a8a8e0e85aaaadccb18cdce33da54ae0e8a8d7 assets/create/models/item/cut_scorchia_brick_stairs.json 83be13f6cbd9a58e10869e4152066cf3b265f347 assets/create/models/item/cut_scorchia_brick_wall.json +5ecb9692e478e29d64aeb5867e8677671560755d assets/create/models/item/cut_scorchia_bricks.json 0fee2e7f8e80bbd33e4d928c8374e6dae65f0b1f assets/create/models/item/cut_scorchia_slab.json 88a6b3709bab76390ace6f641eac18d43c9d099f assets/create/models/item/cut_scorchia_stairs.json d733d43252bf27b6fb1d7e016dc77556c3d1eb71 assets/create/models/item/cut_scorchia_wall.json ce75fb80c38c94bf6bf631eeb756909decaaaab0 assets/create/models/item/cut_scoria.json -81aa0bd4ec878754043a107466dcd87d49b3697c assets/create/models/item/cut_scoria_bricks.json d78a5126aefdd4cd182f9ec0ddda64df00d0f01c assets/create/models/item/cut_scoria_brick_slab.json 661d49b996f9c97a333e7e39dd13a0476db6b142 assets/create/models/item/cut_scoria_brick_stairs.json 3be69c075b479ac53c6201d7d7224d399f8009b6 assets/create/models/item/cut_scoria_brick_wall.json +81aa0bd4ec878754043a107466dcd87d49b3697c assets/create/models/item/cut_scoria_bricks.json 824bedfbeec53ec8f539fe73c0a3c3d927a21aa4 assets/create/models/item/cut_scoria_slab.json 15560f1251f18d53fe1b71adc6be5060c4d8fb94 assets/create/models/item/cut_scoria_stairs.json e35ebcc4f7f7b94623af85b181d916e48fbbb5ed assets/create/models/item/cut_scoria_wall.json 71284d3d6dba230dbecd01eb015e0e65877b820d assets/create/models/item/cut_tuff.json -4de100799e290db3fd46923781a83e6a12654266 assets/create/models/item/cut_tuff_bricks.json 4c7d5fadb0b0eaecf2055a0cd279f9ec130b93d0 assets/create/models/item/cut_tuff_brick_slab.json 6f32b83c9f82424c0e2a2e0a8813eb44c2ac4527 assets/create/models/item/cut_tuff_brick_stairs.json 9088296b7677bddf16d670858a619d846a134ef6 assets/create/models/item/cut_tuff_brick_wall.json +4de100799e290db3fd46923781a83e6a12654266 assets/create/models/item/cut_tuff_bricks.json e9134027cc917e2e878456edb49bcfee382e73b1 assets/create/models/item/cut_tuff_slab.json 8235a34249197c100645b55ded5ff619a055d8a6 assets/create/models/item/cut_tuff_stairs.json a1626993eafa8d85dc950e17cbf78378ed64c7d2 assets/create/models/item/cut_tuff_wall.json a343c74f1e55426330df18f522e6d2a81276c499 assets/create/models/item/cut_veridium.json -3c3fd197f8e299ff90850e24c6507ea12f373123 assets/create/models/item/cut_veridium_bricks.json c1c5561ce31e237b7ea8f1adfb6a79e661b7f940 assets/create/models/item/cut_veridium_brick_slab.json f633006045ccfcdf486d7a240217229d6eed717e assets/create/models/item/cut_veridium_brick_stairs.json 8182109a002317dd8d2767b3828f8c44166a053f assets/create/models/item/cut_veridium_brick_wall.json +3c3fd197f8e299ff90850e24c6507ea12f373123 assets/create/models/item/cut_veridium_bricks.json 410b949304faa5856028f7c42ab762b7498ffd95 assets/create/models/item/cut_veridium_slab.json 62697c0922b11537914d2f4f84faa0b909ee518d assets/create/models/item/cut_veridium_stairs.json 3921d61a26d48d999cbb2f6645611e53ea71978b assets/create/models/item/cut_veridium_wall.json -73c2eed9b6a906a519e27361211ae05bc6ed2d87 assets/create/models/item/cyan_postbox.json eef3be2fa3b6424436a553e3c1bfee3979015962 assets/create/models/item/cyan_seat.json -fb3660aa1b33ef63361d91598c2b46dd5b1c30d7 assets/create/models/item/cyan_table_cloth.json 265d5d6de4238442bb9b161dba0a2fc2f063df0b assets/create/models/item/cyan_toolbox.json 8beb6459822efe59d0f60749143d73c5390e39f2 assets/create/models/item/cyan_valve_handle.json 2e0a1bb3f3498454eb23dab5d4eb6fad98fe586c assets/create/models/item/dark_oak_window.json -34088ac6ee20cd56c309ad687e2b721fc6070b0b assets/create/models/item/dark_oak_window_pane.json +e30c50f79332cb2cd2815554af84747c58545a39 assets/create/models/item/dark_oak_window_pane.json 5b90f8778ae1c2dbd99da89407f12bfb4775b123 assets/create/models/item/deepslate_pillar.json 9b5b804fe75a3e748a0d9a6761ab46178e5f3850 assets/create/models/item/deepslate_zinc_ore.json 7ff5075e907b57d6b0f6fd0a31d0e46464afe634 assets/create/models/item/deployer.json aa44d681c3ccffe08aedbda093062b1a5ab3302e assets/create/models/item/depot.json -63e24083922af9d5300aea771bb63bb9962ba3e6 assets/create/models/item/desk_bell.json 85a5830ca034be9a0ed534186210aa975278b20b assets/create/models/item/diorite_pillar.json 2a992f0961b8bab5628e075da413c91e903e424c assets/create/models/item/display_board.json 0dd4d33644c9ec7dbf920d7fd7b713e4b413b330 assets/create/models/item/display_link.json @@ -2144,14 +1918,13 @@ badd4326fac0b0a1590a2e9bce7c2cdd4e4562f3 assets/create/models/item/empty_schemat 7ec3ed4aaab72d76f6414447bbb3ad7887adf61f assets/create/models/item/encased_fan.json 3e1fdcc80fd68199b1890bcc830f78c48e7c0e43 assets/create/models/item/experience_block.json 9775e83414c0febb5c5b832437b0580e91bcbff3 assets/create/models/item/experience_nugget.json -87add851ae3271d733c9e6888865c288b6716f3b assets/create/models/item/exposed_copper_shingles.json 721c8ac46bf23abec2bbf4cff6dbfdf96cc569a6 assets/create/models/item/exposed_copper_shingle_slab.json 6e1c7fcd8da84dc2d49adb9802ce4fb431eddae1 assets/create/models/item/exposed_copper_shingle_stairs.json -fa7ffb172a43774cc07a2bb201e7010a2549001d assets/create/models/item/exposed_copper_tiles.json +87add851ae3271d733c9e6888865c288b6716f3b assets/create/models/item/exposed_copper_shingles.json a443633d90ef9ac2a866b69b2ecdfad1841dc3e1 assets/create/models/item/exposed_copper_tile_slab.json 9bb425a14635fc8b36a9a95f3d0c54e0b129b7b4 assets/create/models/item/exposed_copper_tile_stairs.json +fa7ffb172a43774cc07a2bb201e7010a2549001d assets/create/models/item/exposed_copper_tiles.json 8b64a93d9b6e33e3caa66adb7a0cc8c5cd473023 assets/create/models/item/extendo_grip.json -9114fa2e92ea4b7bf949b2e5a26290b0bade1af3 assets/create/models/item/factory_gauge.json dad31483f65baaf187e6553e3cd301c5d69e9db4 assets/create/models/item/filter.json 575047531b8e324df9e58abba79cfe9ee3db8b16 assets/create/models/item/fluid_pipe.json 51d34caaa63685e901b8bfe6ced13ff2e8914ce7 assets/create/models/item/fluid_tank.json @@ -2159,7 +1932,7 @@ dad31483f65baaf187e6553e3cd301c5d69e9db4 assets/create/models/item/filter.json 37dcb8911cd29d883849b655e3e388dbba5df6c0 assets/create/models/item/flywheel.json ddeba2ef1d185629be5c88aeb2105fe0aaae3951 assets/create/models/item/framed_glass.json 02a88f5c9aab6fc2f6cbbdaa871fd67476c9a9c2 assets/create/models/item/framed_glass_door.json -c27e10488bd56237af75b1fd8742a5e633d7ec4a assets/create/models/item/framed_glass_pane.json +3ed4300d2fb60b4e2761fd7a2d1f116fecea150a assets/create/models/item/framed_glass_pane.json 127386f4dee6c305023e45ad6b2f04fd6d4e5009 assets/create/models/item/framed_glass_trapdoor.json b17d9fd1a92db0965f2e5da6215956b0451af29e assets/create/models/item/furnace_minecart_contraption.json 7b3a197eed9dec75f95aaed8e438d49d46948f1d assets/create/models/item/gantry_carriage.json @@ -2169,35 +1942,28 @@ b17d9fd1a92db0965f2e5da6215956b0451af29e assets/create/models/item/furnace_minec 7c850a41a754e46bb9c9f257ed621e37a1b9506a assets/create/models/item/goggles.json b1ae37998326c8ca054e57b0cbff0b51cad98625 assets/create/models/item/golden_sheet.json 85c301898775d5720d4d11c1c555b331a5c2e93b assets/create/models/item/granite_pillar.json -44173ca711aa497d08ca3b8a9613290378072870 assets/create/models/item/gray_postbox.json b8d6d2d163e2ab5f654bbc4eda9ad63f8064d27c assets/create/models/item/gray_seat.json -4a9aa604745afcb19c3495a879013e263415f214 assets/create/models/item/gray_table_cloth.json 6492f86b693f924d0222d0ca1d16fbe33d797b1a assets/create/models/item/gray_toolbox.json 2a9500f9630b1da44615c7c9ca145b56324c46bb assets/create/models/item/gray_valve_handle.json -1a97f63df2977ac2f2e3363c61a7e36bf60d3ce3 assets/create/models/item/green_postbox.json 2843370b0e693e1ba1777c26416914edbd87c4f9 assets/create/models/item/green_seat.json -334fd81d5e6574220ee5815f1452b4f4aa7ad223 assets/create/models/item/green_table_cloth.json 561e0579101bf602b252c0b9a5eec468c89d0e40 assets/create/models/item/green_toolbox.json 7d3ddad087b4d2c6a32f97092533cbfb5de0cb3b assets/create/models/item/green_valve_handle.json -9e352162c8135773a4eca41871beea8f3ca650ae assets/create/models/item/handheld_worldshaper.json dac0331061c464e6d3e2070b232781c632840191 assets/create/models/item/hand_crank.json +9e352162c8135773a4eca41871beea8f3ca650ae assets/create/models/item/handheld_worldshaper.json 7bb435c53cbf935d80a28746125aebbd6263e45c assets/create/models/item/haunted_bell.json -81d67fb0e59f25762a412990884813c72d399d55 assets/create/models/item/honeyed_apple.json 2e97629313eab1a4ac4b38785dbe7ed45346e625 assets/create/models/item/honey_bucket.json +81d67fb0e59f25762a412990884813c72d399d55 assets/create/models/item/honeyed_apple.json 70185e640169d6253f06fb98f31b240f4807a53e assets/create/models/item/horizontal_framed_glass.json -e623c9541adc0fa877c5615e3211f47886383f2d assets/create/models/item/horizontal_framed_glass_pane.json +d47884b13fadf545bd585cd9ae347368924b04b0 assets/create/models/item/horizontal_framed_glass_pane.json 58b6f4ec2af3a69ae7145fb25d73451b6e8a2834 assets/create/models/item/hose_pulley.json 14ae1ba5e842715fc4526b19e20c74d10102eb4a assets/create/models/item/incomplete_precision_mechanism.json ae5c5925ecf775a4f5c3dc3c79d9766d7dd34ab6 assets/create/models/item/incomplete_track.json 43173d18384817288a9ba687da77a4fab31b1957 assets/create/models/item/industrial_iron_block.json -4596b83d7da43a670f2274c8389cca9897ae379d assets/create/models/item/industrial_iron_window.json -b023f505f851799e7212531402e788e927cf6033 assets/create/models/item/industrial_iron_window_pane.json c6e3e4ca8b3dfdaaa943faa3dc89c0b2e6f2b5c4 assets/create/models/item/iron_sheet.json d1fbf1be53208c3ab5384dfd6be4d980c858941c assets/create/models/item/item_drain.json -5adda29ca25d00eb41884d0b7ad4a471e250ae10 assets/create/models/item/item_hatch.json 908dd0a4eafd868d280e25cfb7721f20b649560f assets/create/models/item/item_vault.json 5fba1fa33e360c2744ec74d7ccb63f9baa295546 assets/create/models/item/jungle_window.json -b3a0c9664465f49a2f53e4ded6c29710a357e6ca assets/create/models/item/jungle_window_pane.json +1a76bf2c7cf1036c458651536a7be8511a39d551 assets/create/models/item/jungle_window_pane.json 26c3f75074779ec0286e19219bd277147bfb9e96 assets/create/models/item/large_cogwheel.json 23f9028ae83a1723071c67cb6a1742731969e21e assets/create/models/item/large_water_wheel.json 33978f928e1f548a2b53081d6a7517e41d875ec3 assets/create/models/item/layered_andesite.json @@ -2214,32 +1980,24 @@ a22638fd361a8185175e107a8ee092a9ac030b7b assets/create/models/item/layered_grani 14494272713544a1595d654fd397a986b2da0951 assets/create/models/item/layered_scoria.json b1174d783c62dda84aafd4259c622197f4664421 assets/create/models/item/layered_tuff.json 952b07dbf9ecc1883deabaa1344667f13936f7f2 assets/create/models/item/layered_veridium.json -623c937db944651cf1075b3875afe002db527ed6 assets/create/models/item/light_blue_postbox.json b44a9f1bd9079f3533d7f708d76eb19a864e5ebb assets/create/models/item/light_blue_seat.json -df2a3c76b7dbe1f5f6556436e7db3b72288b2232 assets/create/models/item/light_blue_table_cloth.json dae914625ff1bc3ebe1463485cad4526a7d7e9f5 assets/create/models/item/light_blue_toolbox.json 1d94314f185151eb9dcabcef950abf6f86c3c836 assets/create/models/item/light_blue_valve_handle.json -b56a28924b0b1b2530ebac7834e011700b09b966 assets/create/models/item/light_gray_postbox.json 1747bcdea3b1d3f5dfb786102069e07198d36dfe assets/create/models/item/light_gray_seat.json -cc8834024208662cb100f7cd38a04637da3b6852 assets/create/models/item/light_gray_table_cloth.json c8513eb1c89652783e26d7dcfcf64afa97619bc8 assets/create/models/item/light_gray_toolbox.json 3774d23e76b5712e7004e333e0a770f2230c2998 assets/create/models/item/light_gray_valve_handle.json -8f53caad3899a30be5087a0ba155080834418cc0 assets/create/models/item/limestone.json -fba1e7d1cad39c89976b427db62544d80f47ad5d assets/create/models/item/limestone_pillar.json -26b8e1daf9cc4b206fb5f62904c7f1701ba93e67 assets/create/models/item/lime_postbox.json 32cd55a1c97a31a13ad106a457ec9925aa91f6d3 assets/create/models/item/lime_seat.json -a0843c3731fa3c4d23bc2b91fd68410fcf1df149 assets/create/models/item/lime_table_cloth.json 931d187c11cb95a0eeae8f256187ef551b42007e assets/create/models/item/lime_toolbox.json d0f4148bdb0a905e68f54b5dfd829fd47e528fea assets/create/models/item/lime_valve_handle.json +8f53caad3899a30be5087a0ba155080834418cc0 assets/create/models/item/limestone.json +fba1e7d1cad39c89976b427db62544d80f47ad5d assets/create/models/item/limestone_pillar.json 1d30f9b525e8e9736b34a92f848e235c71fd6bd8 assets/create/models/item/linear_chassis.json 8f622f5f79446f6060d9e8815205fce919c8c829 assets/create/models/item/linked_controller.json -538e28af9013a43c258a659cbe67671991f3eee7 assets/create/models/item/magenta_postbox.json ad6fd371ee989c9c3c21e762273e8a4e903f0af8 assets/create/models/item/magenta_seat.json -c50cb6b0285ee3a2b7d7f592ee48672d66e02af3 assets/create/models/item/magenta_table_cloth.json 7c0e3f91e5ab029473736deffb2b2aab9d4763c7 assets/create/models/item/magenta_toolbox.json 6d82582e5afea919927606b20a74cbda5223956f assets/create/models/item/magenta_valve_handle.json a4ecba2ee36699401de661b89065bf0738487a87 assets/create/models/item/mangrove_window.json -474c896c4ca4e6547fac225cc204bbc0b287c5ea assets/create/models/item/mangrove_window_pane.json +a8d3d6f1329c75d4d5a1db3e7fad40eaeca53716 assets/create/models/item/mangrove_window_pane.json d5b1665cdcf03baef41a8d3fbbdcc747cd6867f8 assets/create/models/item/mechanical_arm.json 95d437fffd455e5a22d288bb7683fbdce211fa8a assets/create/models/item/mechanical_bearing.json 08dcab9d0cdb7fb6426b8dee508eecc3f5d71fb1 assets/create/models/item/mechanical_crafter.json @@ -2265,29 +2023,22 @@ c11656a940ef54a023634376c742b3fb17201f92 assets/create/models/item/netherite_bac f80358eba19bc8d1741e4e25753866799631a118 assets/create/models/item/nixie_tube.json 33c5dfa7ef718fb29cf59bb0c04ebd88cf20eb1c assets/create/models/item/nozzle.json 39626402ba637abced828902d9d657ab09edcadb assets/create/models/item/oak_window.json -061587faf0e53e4fac0c8f2f3bd6b22020b2a3ee assets/create/models/item/oak_window_pane.json +7d9eef77eb18dd5c768e48b5871ca2dcdd1a136c assets/create/models/item/oak_window_pane.json af50363d603d61340b336569d58c1febde253665 assets/create/models/item/ochrum.json 62ec1afee14f9de3f5b02ee930d002a240a3c337 assets/create/models/item/ochrum_pillar.json -226f99c241b1d8b03d8fc57db32c1bee0721b64f assets/create/models/item/orange_postbox.json 56e7d28824d3fc566b5f551babbe423a550ef08c assets/create/models/item/orange_seat.json -9f122183a1b04ac6346631db4f505e53ed333acf assets/create/models/item/orange_table_cloth.json 96cc543d5afed90a022ece7b8671cd47a9b6fb68 assets/create/models/item/orange_toolbox.json 7e767ca9e0ddb769b38fabd9289648ac63f5413d assets/create/models/item/orange_valve_handle.json 82152bca4310111d91584a2a78f05e158bb4bd90 assets/create/models/item/ornate_iron_window.json -f9064c1f199bcd8db321078e2363ed91cb2acc09 assets/create/models/item/ornate_iron_window_pane.json -09b3cd8ff7b29a6dd59f739a95bb708646d23537 assets/create/models/item/oxidized_copper_shingles.json +ca749a88faeef441c55c0527d81257187938b6b0 assets/create/models/item/ornate_iron_window_pane.json c9c7ccdb68de2e77cd9f7053fab19493dd30a985 assets/create/models/item/oxidized_copper_shingle_slab.json 89c5f7a0a28f238ebed2641e243a47e4be2ad5ab assets/create/models/item/oxidized_copper_shingle_stairs.json -1c3428e2aed32a013631db012642a34d4eaf0785 assets/create/models/item/oxidized_copper_tiles.json +09b3cd8ff7b29a6dd59f739a95bb708646d23537 assets/create/models/item/oxidized_copper_shingles.json f1af7c5f3840efc3ae07940ee6719eb3417a0e1a assets/create/models/item/oxidized_copper_tile_slab.json ef2fe68d407a03bf1ed8f2d2f3e7323777d061bb assets/create/models/item/oxidized_copper_tile_stairs.json -b21a1f3ee7de3e17f69d27fd13ae6b23b62aa22c assets/create/models/item/packager.json -5b974e55caffdbfc2156eb8b59dd99db12243bd3 assets/create/models/item/package_filter.json -7fd76e7d2e6c6d94352f1fa08d096b63616ad01e assets/create/models/item/package_frogport.json +1c3428e2aed32a013631db012642a34d4eaf0785 assets/create/models/item/oxidized_copper_tiles.json 76aeceb41bb7df873dbafe1bd5e26deb24abf93f assets/create/models/item/peculiar_bell.json -ab6c05a0468f3f4295a07adb362fa2d36cf6e3e8 assets/create/models/item/pink_postbox.json df13d4281dc45041ecd93504d45daef61d070581 assets/create/models/item/pink_seat.json -d142627de73dc821281d64ab54fe9956936253b4 assets/create/models/item/pink_table_cloth.json 842afb2a345dbaba857e90f7dffa724841ef7b2d assets/create/models/item/pink_toolbox.json 6b85a0da81b2d18fb54eb05e187a2ce8cd7b09eb assets/create/models/item/pink_valve_handle.json 9e8b4c1a0bbcb0ea9b15aec174d8f98b572133d1 assets/create/models/item/piston_extension_pole.json @@ -2357,35 +2108,23 @@ a06275da5e5cec7c17edaae8b5a693a3eeff2fe2 assets/create/models/item/powered_latch a1c6fd9b035eed7de732f4080cedaa118a2bc559 assets/create/models/item/powered_toggle_latch.json bd70b798ca9f73f4e5aabc30e286487f5363122e assets/create/models/item/precision_mechanism.json d9a736e7a6fc70e0848de3e318c739d58b1e563f assets/create/models/item/propeller.json -34c09fb1eb46ed362aa384958c2ad2cc96688abb assets/create/models/item/pulp.json 9b41eec5759887be9bae3d27654bf478a7eff676 assets/create/models/item/pulse_extender.json ea76bd3bd9e5bea4d64d91347d473b538e926b02 assets/create/models/item/pulse_repeater.json -6ff9ce0cc633ea39b779b2e873a1d0fd7cfe7119 assets/create/models/item/pulse_timer.json -8496f6c5449a70eef12e9c68ba46eee2f365fb77 assets/create/models/item/purple_postbox.json 7e165f83266edf34bb03fa3e8d2a83d44829c10a assets/create/models/item/purple_seat.json -0d688a25e03c9f0e7059998a44a5be31e570a04d assets/create/models/item/purple_table_cloth.json d75c4969334f2ee1ae4a3d8ac28b001735c76b97 assets/create/models/item/purple_toolbox.json ebffb05119f499fcec051a4337aadc47654baed2 assets/create/models/item/purple_valve_handle.json f91405b9aec1e0142c1b90582e03a1973251da05 assets/create/models/item/radial_chassis.json 1c984ea9dbaec02e88dba1b81906c9acca7ed672 assets/create/models/item/railway_casing.json -87c4c0e13441cf0238103ca065c0c16f80f60f26 assets/create/models/item/rare_creeper_package.json -f982794c2e01a70fcc2bb009bcb8cd06a2ea5510 assets/create/models/item/rare_jinx_package.json -9f4de06da4d9c2b54b758b2b01e0595811338b94 assets/create/models/item/rare_kryppers_package.json -7830b48ef4292922f0ef13f9a7c2ee7d47366169 assets/create/models/item/rare_simi_package.json 5f8e5283fbebb452f1a1141b33ee73f08879c75d assets/create/models/item/raw_zinc.json 4631d67976cef148c346a7016baaa6703e4f243e assets/create/models/item/raw_zinc_block.json -9dc6c52e258b00cac6ed23147983045c43218b5d assets/create/models/item/redstone_contact.json -f8f733364bdd32b2ad597e81103bc02344ce63bd assets/create/models/item/redstone_link.json -ae0ba4827a81bd51c5c01178c2ccdae3a722628a assets/create/models/item/redstone_requester.json -4b73ee9cc2651a3d1a97476d100f9c4d7e2b2efe assets/create/models/item/red_postbox.json 8d00eb1a10055a802556eab10e13f522d12acd1c assets/create/models/item/red_sand_paper.json b64a054c92cbd2e055502d470f3921d1077e63a1 assets/create/models/item/red_seat.json -359d9bdb2496140e297a1e5a98c9563bc09d56b9 assets/create/models/item/red_table_cloth.json ac4695cc465d094b4adba1a4e9efec42c916f37d assets/create/models/item/red_toolbox.json 02473f42ef4b53dc809c7c58ae657c014bfaf652 assets/create/models/item/red_valve_handle.json +9dc6c52e258b00cac6ed23147983045c43218b5d assets/create/models/item/redstone_contact.json +f8f733364bdd32b2ad597e81103bc02344ce63bd assets/create/models/item/redstone_link.json 9926bbe6dad7c4c1a146492116d232e941c80d2b assets/create/models/item/refined_radiance.json bf827486dc7a1b3aeae577844d2dab2a97051db9 assets/create/models/item/refined_radiance_casing.json -a982c29763d90556cca03074c168462a52cb9526 assets/create/models/item/repackager.json 69dc8139280bce3a7e08532afbbc5c41e7942be1 assets/create/models/item/rope_pulley.json 7a93e1b9557422f6b5dfc17e44524805ec4575c6 assets/create/models/item/rose_quartz.json bfbe599cada68962c66cbc6a3e88019fbd9cffd5 assets/create/models/item/rose_quartz_block.json @@ -2396,9 +2135,9 @@ d45005a89e2c0d29944e0112be274365e0e318a5 assets/create/models/item/rose_quartz_t 670e978a34faf6a3acd7880b2f94c2574178d586 assets/create/models/item/sand_paper.json 6854451e331242ec50c186a545538024b07ec123 assets/create/models/item/schedule.json 0effa517c214ba07dba2f4ed12dfcf4785e42dd8 assets/create/models/item/schematic.json -8b7727844d8c12c3c22828c7f65fc7ac2d273e36 assets/create/models/item/schematicannon.json 2a52f084fa8187dd8da28fe820dde50c47a93b57 assets/create/models/item/schematic_and_quill.json 4c8b34627001e35ee15412a0cd037d0f24ba914e assets/create/models/item/schematic_table.json +8b7727844d8c12c3c22828c7f65fc7ac2d273e36 assets/create/models/item/schematicannon.json 2955563914c2f84ed06474c135062e91189ddf3a assets/create/models/item/scorchia.json 669041e5ad29d2166cc8895f85aa262040671d3e assets/create/models/item/scorchia_pillar.json ff52eb59dadfe675e416440f3115856a501428a6 assets/create/models/item/scoria.json @@ -2408,90 +2147,86 @@ ff36a19e124caf2ee8a03767e39601df6866075b assets/create/models/item/secondary_lin abaa6da82babc26717ffff44fc41327bd015c9a6 assets/create/models/item/shadow_steel.json ffaec38d11b91add4e150e33d0e0e49394f5beca assets/create/models/item/shadow_steel_casing.json b6fcd9722e5a09a9207964cba68752512e3b945a assets/create/models/item/shaft.json -617c6e2f759b2a95da7ee7192a2661afc6f6e8f8 assets/create/models/item/shopping_list.json -58ca190177e77db90c8195347c29d52c2cd0c556 assets/create/models/item/small_andesite_bricks.json fa92996fada8545fc340fb401bd0568f56809bf0 assets/create/models/item/small_andesite_brick_slab.json 08474bf814a55795c1f94203ceb8a969be2a2132 assets/create/models/item/small_andesite_brick_stairs.json 0e00bc6aa5be242217ed6fe8cbe1ccdf180742fb assets/create/models/item/small_andesite_brick_wall.json -543055fabb706a93037c6a9e47c334508e41b06c assets/create/models/item/small_asurine_bricks.json +58ca190177e77db90c8195347c29d52c2cd0c556 assets/create/models/item/small_andesite_bricks.json b160c3277f00f19687cffb87f9cb3aa32d3633aa assets/create/models/item/small_asurine_brick_slab.json 183fa4919f06e8c3c10f1efeceefd55389a96102 assets/create/models/item/small_asurine_brick_stairs.json d6a5ffdb493fb2c8176a7e6b42e05c2d393a2782 assets/create/models/item/small_asurine_brick_wall.json -26d9361e33e362a772220146724c0927453831e0 assets/create/models/item/small_calcite_bricks.json +543055fabb706a93037c6a9e47c334508e41b06c assets/create/models/item/small_asurine_bricks.json 8c1b5d5d40393636c9ff10afc09038c89bc1b383 assets/create/models/item/small_calcite_brick_slab.json 481ce90fb6abb05c904f01df3fe635f702bbfac0 assets/create/models/item/small_calcite_brick_stairs.json 02adb90bdf06a7c4c57d09dfd3c77cceef9b7fbe assets/create/models/item/small_calcite_brick_wall.json -d5a033d3dedb799c4752b7e68b6881529f38f8e5 assets/create/models/item/small_crimsite_bricks.json +26d9361e33e362a772220146724c0927453831e0 assets/create/models/item/small_calcite_bricks.json 8f382537c99eac3335f72db8dba33ab71f99a919 assets/create/models/item/small_crimsite_brick_slab.json b5d012cf0c5c94b73e6825b6884ab1d3eee7d64e assets/create/models/item/small_crimsite_brick_stairs.json 236457bb16bc7e949c16f3f091ee74dc3f3e6973 assets/create/models/item/small_crimsite_brick_wall.json -6ce2cb7882f41fcbcd641a442c98767bda61f65f assets/create/models/item/small_deepslate_bricks.json +d5a033d3dedb799c4752b7e68b6881529f38f8e5 assets/create/models/item/small_crimsite_bricks.json ce79900b7aa1eff0d42cabcd0a7f80ef20824551 assets/create/models/item/small_deepslate_brick_slab.json a260711af72c749a6b72f72515bbecb2e01e3ed8 assets/create/models/item/small_deepslate_brick_stairs.json 4e474891c6a269166c2eb413fae78699e5657af4 assets/create/models/item/small_deepslate_brick_wall.json -e412eaa393965ef5426c3d8d95d5c9d69e37e054 assets/create/models/item/small_diorite_bricks.json +6ce2cb7882f41fcbcd641a442c98767bda61f65f assets/create/models/item/small_deepslate_bricks.json 55b82c2f30d52acee5c3807ab2ffaed1d773cfa8 assets/create/models/item/small_diorite_brick_slab.json 49a17610b5b05595894ca2683056cecd724c1111 assets/create/models/item/small_diorite_brick_stairs.json dd3630a9c5500e6cf09e95d09e7a3cc99db11899 assets/create/models/item/small_diorite_brick_wall.json -c29d35da520d0fe828bb364db403b8cdf55f0a2e assets/create/models/item/small_dripstone_bricks.json +e412eaa393965ef5426c3d8d95d5c9d69e37e054 assets/create/models/item/small_diorite_bricks.json 21e281ec7a82d48018366a0737c6867f625b4663 assets/create/models/item/small_dripstone_brick_slab.json 6862e72eedf80536f40b6ac42ff78f13f62d012f assets/create/models/item/small_dripstone_brick_stairs.json ca8613bb64ceb562c36dd1d6a3b76b5f15f35be9 assets/create/models/item/small_dripstone_brick_wall.json -81eae95d20a9e99a070dfb8f6e6c22ef29f628d3 assets/create/models/item/small_granite_bricks.json +c29d35da520d0fe828bb364db403b8cdf55f0a2e assets/create/models/item/small_dripstone_bricks.json a19aa13eb3c04a9e0931e22e4170eec80950efab assets/create/models/item/small_granite_brick_slab.json 51bc02587cad5dfcfaf9d040848faa5277a25a5f assets/create/models/item/small_granite_brick_stairs.json 147a6f42be8312fbf050ad53c1625a1458f73cc3 assets/create/models/item/small_granite_brick_wall.json -bfa76583bca68134bbe2793c263cc0b71e1406af assets/create/models/item/small_limestone_bricks.json +81eae95d20a9e99a070dfb8f6e6c22ef29f628d3 assets/create/models/item/small_granite_bricks.json a9599981e872e683dacd01b2f0af511f416dd526 assets/create/models/item/small_limestone_brick_slab.json d8f8eadea13fc90a1c8ee5aca4be71fb22a79fd0 assets/create/models/item/small_limestone_brick_stairs.json 67626afe8b0fc9135456a24ea49c602b83d6970d assets/create/models/item/small_limestone_brick_wall.json -2d4b22d4028c55cbabc7eb405c2c6d485390afab assets/create/models/item/small_ochrum_bricks.json +bfa76583bca68134bbe2793c263cc0b71e1406af assets/create/models/item/small_limestone_bricks.json f7547aacb8bdaf61424cd56565e40d3cd40a1cfa assets/create/models/item/small_ochrum_brick_slab.json 8a320ff9e75e16a182cb7d07784a595fe7876e04 assets/create/models/item/small_ochrum_brick_stairs.json 0eedd4fe5b0a82de16fed148836087ff4ae64a74 assets/create/models/item/small_ochrum_brick_wall.json +2d4b22d4028c55cbabc7eb405c2c6d485390afab assets/create/models/item/small_ochrum_bricks.json 97b8e3eaddac0b93d4b6bc140f573969fcba5823 assets/create/models/item/small_rose_quartz_tiles.json -ac1bf1d2344517c18b945afa198d5d05e2866f6b assets/create/models/item/small_scorchia_bricks.json 63ef9901ba1014027e8c873d8374d86abb73158e assets/create/models/item/small_scorchia_brick_slab.json f52601fe54695c225a595a65e9130665582db856 assets/create/models/item/small_scorchia_brick_stairs.json b4e0db087dc88e0a3a4a82197a0ce347d3c7a7aa assets/create/models/item/small_scorchia_brick_wall.json -25b6bb40701e782ed64414ec8391b304ad5e6b12 assets/create/models/item/small_scoria_bricks.json +ac1bf1d2344517c18b945afa198d5d05e2866f6b assets/create/models/item/small_scorchia_bricks.json a4bdeb066dcc44f8be058e6d9dfc0a3fd34819bf assets/create/models/item/small_scoria_brick_slab.json 5ffb0e7de917013cd82cece2506d72fce2cd5fc6 assets/create/models/item/small_scoria_brick_stairs.json 67dcbc7d52fbbe88f89b36e04f970b27024741e4 assets/create/models/item/small_scoria_brick_wall.json -90943707d8b232d816392bec8ae05e06b6eedd72 assets/create/models/item/small_tuff_bricks.json +25b6bb40701e782ed64414ec8391b304ad5e6b12 assets/create/models/item/small_scoria_bricks.json 91a144100eea8b4e67a0a4f31b35a714693fa001 assets/create/models/item/small_tuff_brick_slab.json b3f89c9f8e46fbdfc58171073d6ad91c588e5853 assets/create/models/item/small_tuff_brick_stairs.json 52c1d4cfb5f1726c9ccbb00db60bdd6f760bf40f assets/create/models/item/small_tuff_brick_wall.json -6935d6d9dbdb99fe7258d9347419d65571711263 assets/create/models/item/small_veridium_bricks.json +90943707d8b232d816392bec8ae05e06b6eedd72 assets/create/models/item/small_tuff_bricks.json 0bb60fc6ab570db83214fd10c83d931f6677e361 assets/create/models/item/small_veridium_brick_slab.json 89918d98b6830477b21ab7fb9e30807d3ca1d379 assets/create/models/item/small_veridium_brick_stairs.json ab4e7695e99548f83a89f3d5ad7690a576bafcc0 assets/create/models/item/small_veridium_brick_wall.json +6935d6d9dbdb99fe7258d9347419d65571711263 assets/create/models/item/small_veridium_bricks.json 6cf508dbd3d015ea730366db92bb17844dc2ca06 assets/create/models/item/smart_chute.json 9201f00edcf2ffa33cb079c28b5c33e39872c824 assets/create/models/item/smart_fluid_pipe.json 67804bdd890f167010f6101a700e85a3245f4cc3 assets/create/models/item/speedometer.json 4bc463849e2309aa7bb996c403bfb565e950aa49 assets/create/models/item/spout.json 09784bf20529fdc5bb76892c10cea14187748a82 assets/create/models/item/spruce_window.json -368bc939a79864c4bce0fa05d91760bd75c9e5cd assets/create/models/item/spruce_window_pane.json +693cdacb67b28b5d69c8541fd1e0c246b26260ae assets/create/models/item/spruce_window_pane.json b82ab0c69df330f6f938ed1beee7b4add67d2e50 assets/create/models/item/steam_engine.json 24acc593a5e910b6301afcb3f23cba526d23a0ab assets/create/models/item/steam_whistle.json 54f200be903e056e5cf9e2186f0a0a51f8f0f84e assets/create/models/item/sticker.json 0f88de164439640cc175ceef2017f7416b5a7018 assets/create/models/item/sticky_mechanical_piston.json 4b640b66765b206f8c2884b7c1a1ef860b81d841 assets/create/models/item/stockpile_switch.json -c04a4ef6debb04d305d74d9b034c1e95c6b9e956 assets/create/models/item/stock_link.json -67c98c6c7f2122850acfbee34688572934fdd226 assets/create/models/item/stock_ticker.json 6ee792277b9fd980c40e18e841afa63fc500ed0b assets/create/models/item/stressometer.json 8d4ce1ccf180016506292f63188c10d0dabe0ee3 assets/create/models/item/sturdy_sheet.json a10bb4d6d1a4483a806e3aaa086d48c0e20aaefe assets/create/models/item/super_glue.json dddac09bb9dd962d99502ab10929ae6886fbd831 assets/create/models/item/sweet_roll.json 6264be89eb998566b171beb073594393041780ca assets/create/models/item/tiled_glass.json -0ef4d2df2a4096b87b86506efc5c9404944fe982 assets/create/models/item/tiled_glass_pane.json +20fde7ab92e521fe861374148b240378990e9e12 assets/create/models/item/tiled_glass_pane.json 4683ab824d93cd96a82143eb9c62c9777f278f18 assets/create/models/item/track.json c4bd1224b988ca10708fe9538a0baa8b88272eb5 assets/create/models/item/track_observer.json 236d89ebd8ae45344b374264d39947d82a2d1914 assets/create/models/item/track_signal.json c08a82b94666ca81a6d9134c740cc9c28ddae892 assets/create/models/item/track_station.json be3b40aee1c62680ddcf9129fd9f926bab790590 assets/create/models/item/train_door.json 1d45bba128629e6c962a9260d49f2df83958ed16 assets/create/models/item/train_trapdoor.json -b3a5de0cddc4d9d2d1858535220cb527735e86bc assets/create/models/item/transmitter.json ba7a9f542e9f65bdce3d3330a95f1166a0be0673 assets/create/models/item/tree_fertilizer.json 55aafc103c38057faa3295ccc76da99f4a91de52 assets/create/models/item/tuff_pillar.json 0e199ab3e450156aae2d54c227383af9bb3f7082 assets/create/models/item/turntable.json @@ -2499,116 +2234,123 @@ ba7a9f542e9f65bdce3d3330a95f1166a0be0673 assets/create/models/item/tree_fertiliz 63a159b54de6a31ee265750e4af4b1990820eda6 assets/create/models/item/veridium.json 38970acde350735e00b53e6836ccee428c630fcc assets/create/models/item/veridium_pillar.json 9b2e4da1ab7e20cd744adb469dd3690e33cc905f assets/create/models/item/vertical_framed_glass.json -63d94954704691fccde1b13b320ec62a4e12a13a assets/create/models/item/vertical_framed_glass_pane.json +1eda3a4bc309eb9f125c583c1d398a1cb9e3a4e7 assets/create/models/item/vertical_framed_glass_pane.json b0f6d37aa695395e28a23d36775092f63ab3f5a5 assets/create/models/item/vertical_gearbox.json 011ef16e912638b4095d34c8c711ebd67cb85fba assets/create/models/item/wand_of_symmetry.json 9c5087114e35052c5e56bb752252de5d092408c5 assets/create/models/item/warped_window.json -83502f4b8d0134e793611b36a56cca59af097ed5 assets/create/models/item/warped_window_pane.json +cdc1226f8a098adbc420fe50c98466507c3a3157 assets/create/models/item/warped_window_pane.json e5939b47bf7440dc101c667e68ef6bf750a3290f assets/create/models/item/water_wheel.json -be2f058a7ecb015599ee052ec27c4360d636999a assets/create/models/item/waxed_copper_shingles.json adc188e4e48bea80607c6e0c7076c9bdd7236cb0 assets/create/models/item/waxed_copper_shingle_slab.json 7e224aceaa94361256e95e4c44d8814aebaf297c assets/create/models/item/waxed_copper_shingle_stairs.json -eced19a2f721c54b968e5979cde2705f15faf3e1 assets/create/models/item/waxed_copper_tiles.json +be2f058a7ecb015599ee052ec27c4360d636999a assets/create/models/item/waxed_copper_shingles.json 68b3632c34adb9991aa993385f53624632c260f2 assets/create/models/item/waxed_copper_tile_slab.json a7fc0cc2d32dcd49c3274597ce7121f01fca03f8 assets/create/models/item/waxed_copper_tile_stairs.json -5336907eba067492f6d00b4b8514f9663830a1d5 assets/create/models/item/waxed_exposed_copper_shingles.json +eced19a2f721c54b968e5979cde2705f15faf3e1 assets/create/models/item/waxed_copper_tiles.json fd428034c46a240c4bb2a1aee625b8767f41c3ef assets/create/models/item/waxed_exposed_copper_shingle_slab.json 43d714187fe6c0cd1ed7abcddef1ebcd63979ff4 assets/create/models/item/waxed_exposed_copper_shingle_stairs.json -962b24b3611abefc21920d01452944710ab0da3f assets/create/models/item/waxed_exposed_copper_tiles.json +5336907eba067492f6d00b4b8514f9663830a1d5 assets/create/models/item/waxed_exposed_copper_shingles.json 25f5a10fe8e6acbdbf8457d56aeee065835a93ec assets/create/models/item/waxed_exposed_copper_tile_slab.json 22917505d328fb5b489b9f7f9068f1514b784abb assets/create/models/item/waxed_exposed_copper_tile_stairs.json -12c3dd893bddb66b9b387652c67c8f0e24b643ff assets/create/models/item/waxed_oxidized_copper_shingles.json +962b24b3611abefc21920d01452944710ab0da3f assets/create/models/item/waxed_exposed_copper_tiles.json 9b7c82376ea8c1c8ecbc7bbe15283f84b0d50d94 assets/create/models/item/waxed_oxidized_copper_shingle_slab.json fbb6043eb935aa0641a482ee7300c780be257440 assets/create/models/item/waxed_oxidized_copper_shingle_stairs.json -6b8f75d4818db903b22f4626d02671ab76a61023 assets/create/models/item/waxed_oxidized_copper_tiles.json +12c3dd893bddb66b9b387652c67c8f0e24b643ff assets/create/models/item/waxed_oxidized_copper_shingles.json 6e7bc8eb9a87d903dcc590e9918ce8d4411bf190 assets/create/models/item/waxed_oxidized_copper_tile_slab.json 10136759b31e4d957e8374948460d6c984711326 assets/create/models/item/waxed_oxidized_copper_tile_stairs.json -ce2dcfc01205da1dc70f34091a2c24f563e72466 assets/create/models/item/waxed_weathered_copper_shingles.json +6b8f75d4818db903b22f4626d02671ab76a61023 assets/create/models/item/waxed_oxidized_copper_tiles.json 2bf249c677d30a4febf950fa7c6caa87c348c54e assets/create/models/item/waxed_weathered_copper_shingle_slab.json 9fa84f2555d82b5a1550b748a332ceb443a04fae assets/create/models/item/waxed_weathered_copper_shingle_stairs.json -02d2ac048c9bea86d10673254dfc107f3c9c5bb5 assets/create/models/item/waxed_weathered_copper_tiles.json +ce2dcfc01205da1dc70f34091a2c24f563e72466 assets/create/models/item/waxed_weathered_copper_shingles.json ab40b1a5a03cd290d53ef2ea65f90dcfcd2673de assets/create/models/item/waxed_weathered_copper_tile_slab.json dadc7b65a4527e288c21a20df978796a8c444fd2 assets/create/models/item/waxed_weathered_copper_tile_stairs.json -86b8e71fa8b7aeb73eafda89d8d06d83da6a5d25 assets/create/models/item/weathered_copper_shingles.json +02d2ac048c9bea86d10673254dfc107f3c9c5bb5 assets/create/models/item/waxed_weathered_copper_tiles.json 94db30ad2381d2f2c37cdfd0d5ce5c45a2807640 assets/create/models/item/weathered_copper_shingle_slab.json 7262c01df4b5a8cd8c6a5545062f251d5ad9fd06 assets/create/models/item/weathered_copper_shingle_stairs.json -99f17b16b68201aefb78298b3e6c657e3c2235e0 assets/create/models/item/weathered_copper_tiles.json +86b8e71fa8b7aeb73eafda89d8d06d83da6a5d25 assets/create/models/item/weathered_copper_shingles.json 0b1b299d6dfab65b6060305a8b3e51f6e2df09f4 assets/create/models/item/weathered_copper_tile_slab.json 0c3989b44fde934ba8b88b071887e5ede522c417 assets/create/models/item/weathered_copper_tile_stairs.json -b5d591fbb40e062efe301b3b3b49580e5ad64566 assets/create/models/item/weathered_iron_block.json -a569ddd725898a86f8745e46723edeff7fe7f2e9 assets/create/models/item/weathered_iron_window.json -a262cbdf9aa0c240f623dcadd42864d280d36978 assets/create/models/item/weathered_iron_window_pane.json +99f17b16b68201aefb78298b3e6c657e3c2235e0 assets/create/models/item/weathered_copper_tiles.json 79431edb868e6560f4f6d5b3441c0176c7699f5e assets/create/models/item/weighted_ejector.json 0fd2214cdff8a92e05d9d5ee888329b3235143c0 assets/create/models/item/wheat_flour.json aacced59d21212090d508a9684bb46c9472a8a2f assets/create/models/item/whisk.json -bcf3104e463ec212dc239281033e4e80d78e1d74 assets/create/models/item/white_postbox.json 4e112e82185e2c1a5c57f5a94fa11c59c92cef0d assets/create/models/item/white_sail.json 17ed8ac7d745117f622190a46c5e1b42892afc29 assets/create/models/item/white_seat.json -0fa9208df662c018499902e3aeddf1bbec16c3db assets/create/models/item/white_table_cloth.json 432040f39177ab3df6003df24e818c73e28cf754 assets/create/models/item/white_toolbox.json 8ba8a6d4baf98f0f037f83b4b704f75a8d46a26e assets/create/models/item/white_valve_handle.json bccccbdfa5d376936e123defa44f2907dc317617 assets/create/models/item/windmill_bearing.json 47c6ad1c146366156a0ec4bc1cbf74282784698f assets/create/models/item/wooden_bracket.json 6c08d2fa59e56e4848063ab6f3e45894b89f1744 assets/create/models/item/wrench.json -3a899db3044ee39ac5d6385c16630733e00f77ca assets/create/models/item/yellow_postbox.json ac59f141cd3c3f7e57a794e542d6e22bf8ebb8f9 assets/create/models/item/yellow_seat.json -1f9f7c6102a0c5e1a6e50a6ac67858009a13153f assets/create/models/item/yellow_table_cloth.json 532a429d58a177f61b4d67180db7676fa7536052 assets/create/models/item/yellow_toolbox.json 2c87ef8a26a01a17b2f3799d62cb27cf1107d061 assets/create/models/item/yellow_valve_handle.json bcf63b7198d31d3a94b2566171b7e3e84464601c assets/create/models/item/zinc_block.json d4a3290393c1c659f3d4dd4e267a87d287bd49a6 assets/create/models/item/zinc_ingot.json 1e9656f81ec01a89796b175cf029d1de45b758fe assets/create/models/item/zinc_nugget.json f3719d4d3a8d1e0d9f36db5d1317894ecacf3bf3 assets/create/models/item/zinc_ore.json +63d74987f8461b4e94c00030d380d4891707d2ae assets/create/models/threshold_switch/block_ceiling_0.json +12496e505374e7fff2d1f800218848635d86ec71 assets/create/models/threshold_switch/block_ceiling_1.json +523bc69211b6e90cc381356f103b01b8d7e15771 assets/create/models/threshold_switch/block_ceiling_2.json +c62cbd9fe144326c46702ba4e512c832484ea4e8 assets/create/models/threshold_switch/block_ceiling_3.json +fe1017b4338d3027771d5eb8b4e2444ddb842b36 assets/create/models/threshold_switch/block_ceiling_4.json +d090a659a8df0b86d9892214ac5b06641aaabc9a assets/create/models/threshold_switch/block_ceiling_5.json +dffc869ccce392b1908c833631e3df374c6a3012 assets/create/models/threshold_switch/block_floor_0.json +ab3d51ab5dd8ef6c1cad5d65406180915340dd7e assets/create/models/threshold_switch/block_floor_1.json +7a69fb5a6e77b457c381495c951aa0ba9c7df7f0 assets/create/models/threshold_switch/block_floor_2.json +3a6bbc80eea8d824a981e257f8025997946b3260 assets/create/models/threshold_switch/block_floor_3.json +a76fae0415604615be0e822394e0879ca81bf166 assets/create/models/threshold_switch/block_floor_4.json +28ddae97613f1a06885f06faa20b1b2a5bcaa7db assets/create/models/threshold_switch/block_floor_5.json +ab50d142c25c95b0865dd41176cc07a0c76109ac assets/create/models/threshold_switch/block_wall_0.json +be730f505bf937db4b3658b2bd3763b514d295c2 assets/create/models/threshold_switch/block_wall_1.json +f7f6d92ab5dea5a85ec3d570cdd169329dd4225f assets/create/models/threshold_switch/block_wall_2.json +41009d15d22c946a2ed4c6ba98447c3c7cc26315 assets/create/models/threshold_switch/block_wall_3.json +ad3204842128db2c7bebdbf3c40fccc45c82de44 assets/create/models/threshold_switch/block_wall_4.json +197a6ed7fd9514de13daf58605c24a7156c00bd1 assets/create/models/threshold_switch/block_wall_5.json 7dbef6df108c395c2481c8183517c9ea568a7d88 data/create/advancements/recipes/building_blocks/acacia_window.json 8005cd18b80bcee4f5a2111ee78f87d117d6fcdf data/create/advancements/recipes/building_blocks/acacia_window_pane.json a2b7fe4d1b1c8d173da0e6dfcf41379648a92a80 data/create/advancements/recipes/building_blocks/andesite_from_stone_types_andesite_stonecutting.json ab03b83587129f06998ec86e9c417e622baff713 data/create/advancements/recipes/building_blocks/andesite_pillar_from_stone_types_andesite_stonecutting.json 676eca0ab460b460ae76c66926ac91da4612a201 data/create/advancements/recipes/building_blocks/asurine_from_stone_types_asurine_stonecutting.json fb36a2f400347c3291978a49e59374f3ac459f14 data/create/advancements/recipes/building_blocks/asurine_pillar_from_stone_types_asurine_stonecutting.json -a41990f2ea73c54ce3af41a3a61c4fdd4134d3b9 data/create/advancements/recipes/building_blocks/bamboo_window.json -b25b8c230fde8d6d77e8d516bed52236652b5ca6 data/create/advancements/recipes/building_blocks/bamboo_window_pane.json 7a7eb78c70e1591d339115b367cd3114fb7c1799 data/create/advancements/recipes/building_blocks/birch_window.json 6df6a6885c3ebf92f98f105be16d8e0c80da19f0 data/create/advancements/recipes/building_blocks/birch_window_pane.json 0d724aefa51b969dbadb59b1193172a44ecf5644 data/create/advancements/recipes/building_blocks/calcite_from_stone_types_calcite_stonecutting.json 537fe5dffa659e5838379587fbd84f2f641551ea data/create/advancements/recipes/building_blocks/calcite_pillar_from_stone_types_calcite_stonecutting.json -2636ac059b6412a46402cccbe5abe4fb49143662 data/create/advancements/recipes/building_blocks/cherry_window.json -3e08f575543f1e0abea979dbaee643572734788b data/create/advancements/recipes/building_blocks/cherry_window_pane.json -09f332cd34e6a92af9e8e4e757418c7ba8b536da data/create/advancements/recipes/building_blocks/copper_shingles_from_ingots_copper_stonecutting.json 55214a0fd27318b17163cace66c7525785127ef8 data/create/advancements/recipes/building_blocks/copper_shingle_slab.json fb4210dbbfb74459e10da94a540f3bfdf91c4a8d data/create/advancements/recipes/building_blocks/copper_shingle_slab_from_copper_shingles_stonecutting.json 31b04ac1b117fb65f5129c5bbb48e42c1c4c1003 data/create/advancements/recipes/building_blocks/copper_shingle_stairs.json bef4a9a4c2e722d4f086d6b4c9d6fa1d0836ec10 data/create/advancements/recipes/building_blocks/copper_shingle_stairs_from_copper_shingles_stonecutting.json -f66a48f01afb4fa1babee4a8c28b032280c3ac9e data/create/advancements/recipes/building_blocks/copper_tiles_from_ingots_copper_stonecutting.json +09f332cd34e6a92af9e8e4e757418c7ba8b536da data/create/advancements/recipes/building_blocks/copper_shingles_from_ingots_copper_stonecutting.json ef79744ebf31453d1c81789afed7b717837b3515 data/create/advancements/recipes/building_blocks/copper_tile_slab.json 8e9997c43b1c06521fe8d38b04ccb3f04c93d537 data/create/advancements/recipes/building_blocks/copper_tile_slab_from_copper_tiles_stonecutting.json a2609aa8b5453f2294f38c81d26e0b8dad71087d data/create/advancements/recipes/building_blocks/copper_tile_stairs.json d47e46c66bf69e8310e6687716858842e8aed7b5 data/create/advancements/recipes/building_blocks/copper_tile_stairs_from_copper_tiles_stonecutting.json +f66a48f01afb4fa1babee4a8c28b032280c3ac9e data/create/advancements/recipes/building_blocks/copper_tiles_from_ingots_copper_stonecutting.json cc14d10c75ab0fdd7c54db1922e5e56667739fef data/create/advancements/recipes/building_blocks/copycat_panel_from_ingots_zinc_stonecutting.json 55d2812be912c857ff666d581174378857d3bce2 data/create/advancements/recipes/building_blocks/copycat_step_from_ingots_zinc_stonecutting.json -8615fc107b1f4df86711081a9dccac8631b02e6b data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_shingles_from_honeycomb.json 0e0eba8550768ef69087dff8112814f25233fab7 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_shingle_slab_from_honeycomb.json 2c960d55273df4c0c8c33b2c329175b35b18fc8c data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_shingle_stairs_from_honeycomb.json -fa8f3ed9a4c6f0c3cd4c21b0ae4dc8ca4dba8678 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_tiles_from_honeycomb.json +8615fc107b1f4df86711081a9dccac8631b02e6b data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_shingles_from_honeycomb.json d6f2aa7fd10c96f71c47bdabb3e53dc4c4e73706 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_tile_slab_from_honeycomb.json eca165eee20adba1557ccc74ef50ee90311b3019 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_tile_stairs_from_honeycomb.json -88a236933e8dfe0d809bda098d16782288c4800c data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_shingles_from_honeycomb.json +fa8f3ed9a4c6f0c3cd4c21b0ae4dc8ca4dba8678 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_tiles_from_honeycomb.json 301149dabc4dce290b4884f4ed3cb2132123adf0 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_shingle_slab_from_honeycomb.json f360dce7bece72672f2624710c88edbe3e3f8885 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_shingle_stairs_from_honeycomb.json -bc27959288766492746f41c4810350dcef1b320d data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_tiles_from_honeycomb.json +88a236933e8dfe0d809bda098d16782288c4800c data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_shingles_from_honeycomb.json 7ceb4b74ff84ed404518b6cb5e1432dac5903b5f data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_tile_slab_from_honeycomb.json ec1eec3bc25534484cb264134e62b578525422aa data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_tile_stairs_from_honeycomb.json -2e8f1da032110e8c5ec375ffd425e5eed7f58cae data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_shingles_from_honeycomb.json +bc27959288766492746f41c4810350dcef1b320d data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_tiles_from_honeycomb.json e34abb4d51c1d00419fc3d3799ca0d9fe7ea1027 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_shingle_slab_from_honeycomb.json 9471e190beb603f022fb234f2cf35b5b4b93f0c0 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_shingle_stairs_from_honeycomb.json -17fe14b753953a68887cd001fcaa264ef031463f data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_tiles_from_honeycomb.json +2e8f1da032110e8c5ec375ffd425e5eed7f58cae data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_shingles_from_honeycomb.json 2577754364f05264fac325f67597230d01fa0c1d data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_tile_slab_from_honeycomb.json 003e384d9594a4e6ef5678e74f04b56de047dbde data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_tile_stairs_from_honeycomb.json -5009a82a897a15407fec785005107b0d228fffe7 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_shingles_from_honeycomb.json +17fe14b753953a68887cd001fcaa264ef031463f data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_tiles_from_honeycomb.json 70ce32937dcf349dce77fef8022bc0c15863f6a6 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_shingle_slab_from_honeycomb.json 1fc498238dcc2705152573ba7f74bb50e7e66ca7 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_shingle_stairs_from_honeycomb.json -d12aa3dd5457327224fd007211878eec21043971 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_tiles_from_honeycomb.json +5009a82a897a15407fec785005107b0d228fffe7 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_shingles_from_honeycomb.json 6f461d7036de914c636b7916dc798775ccf25be1 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_tile_slab_from_honeycomb.json 3bc9efcddecd23fd06c6056a0ee7b937959cecc0 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_tile_stairs_from_honeycomb.json +d12aa3dd5457327224fd007211878eec21043971 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_tiles_from_honeycomb.json 3064c52dea808a00c211bfedb96106b563f480da data/create/advancements/recipes/building_blocks/crafting/kinetics/black_seat.json f07a0b21db200ab68a7df02db519869f68953286 data/create/advancements/recipes/building_blocks/crafting/kinetics/black_seat_from_other_seat.json 80ac4db5c53c7efc2666a7abb4e2e876c5f86588 data/create/advancements/recipes/building_blocks/crafting/kinetics/blue_seat.json @@ -2641,75 +2383,10 @@ fc6babcc211f6ed7f231ed8da12f42f0ab858f4f data/create/advancements/recipes/buildi 8ef5d43ae4344f548efb55793ecc889cc011c0a1 data/create/advancements/recipes/building_blocks/crafting/kinetics/white_seat_from_other_seat.json 415435d450d42d97335416c6faa12538dc8e0fb6 data/create/advancements/recipes/building_blocks/crafting/kinetics/yellow_seat.json e71219bcfe8c712fc7e7368c2933533b3c5ef121 data/create/advancements/recipes/building_blocks/crafting/kinetics/yellow_seat_from_other_seat.json -2171371d683e03c5d6b5b7e89be6c674804adab7 data/create/advancements/recipes/building_blocks/crafting/logistics/black_postbox.json -f62a87aaa90fd82730c7bc0b2f6fcecfbdaa8042 data/create/advancements/recipes/building_blocks/crafting/logistics/black_postbox_from_other_postbox.json -f598f4689e6e02c7e4325085ee3bb9f43a96377e data/create/advancements/recipes/building_blocks/crafting/logistics/black_table_cloth.json -123399acf7acf989d92735600d74c14ef5849ffc data/create/advancements/recipes/building_blocks/crafting/logistics/black_table_cloth_from_other_table_cloth.json -f2dda3b77262a1d14ab3bc39fbe0bc10a519b947 data/create/advancements/recipes/building_blocks/crafting/logistics/blue_postbox.json -8997db26c93945f3ef6deb87b51c12e2f28789b9 data/create/advancements/recipes/building_blocks/crafting/logistics/blue_postbox_from_other_postbox.json -06207bb81c2ee103d79dc8b8f9d38119b6b6bf55 data/create/advancements/recipes/building_blocks/crafting/logistics/blue_table_cloth.json -5383fc14b57fb591ebfee9962a774c354f5e99f4 data/create/advancements/recipes/building_blocks/crafting/logistics/blue_table_cloth_from_other_table_cloth.json -29f34e0859d0ff8476dcd23d3076d0ed27656a06 data/create/advancements/recipes/building_blocks/crafting/logistics/brown_postbox.json -6fafc9beff44de0c4f0636dd2f24580b5a357621 data/create/advancements/recipes/building_blocks/crafting/logistics/brown_postbox_from_other_postbox.json -5237f007a87e119f9083234f825ac757b9fd7883 data/create/advancements/recipes/building_blocks/crafting/logistics/brown_table_cloth.json -366e5c9fdcd9cf9d1189eed5074b3e7cb1759970 data/create/advancements/recipes/building_blocks/crafting/logistics/brown_table_cloth_from_other_table_cloth.json -35afab0036df98cc60d4e728492694a416c75309 data/create/advancements/recipes/building_blocks/crafting/logistics/cyan_postbox.json -661c1356fe0c8a13c11c6026cc2526e10dcd039f data/create/advancements/recipes/building_blocks/crafting/logistics/cyan_postbox_from_other_postbox.json -607e923aeb6ce8b346f4da35ed67a17c69df570f data/create/advancements/recipes/building_blocks/crafting/logistics/cyan_table_cloth.json -ec07ec408fb4beb8189f827d8c5b53007944c693 data/create/advancements/recipes/building_blocks/crafting/logistics/cyan_table_cloth_from_other_table_cloth.json -958fab294f6a55a9ae18b21196600d7764de095a data/create/advancements/recipes/building_blocks/crafting/logistics/gray_postbox.json -93d63182b51e66a76dbea7f2f27ac0ada953cfa8 data/create/advancements/recipes/building_blocks/crafting/logistics/gray_postbox_from_other_postbox.json -da207311c49105b9bb3cb7cf53ebdb8d0121f1a1 data/create/advancements/recipes/building_blocks/crafting/logistics/gray_table_cloth.json -6102c4f5d72c16b2b2e6aedd53c91c9a00585620 data/create/advancements/recipes/building_blocks/crafting/logistics/gray_table_cloth_from_other_table_cloth.json -e23b3d1e71a5b81093f6e71ad3ae1fa60923ad86 data/create/advancements/recipes/building_blocks/crafting/logistics/green_postbox.json -0be2943dfe2c6a98092dd44cbe2437b9c142f81a data/create/advancements/recipes/building_blocks/crafting/logistics/green_postbox_from_other_postbox.json -7c091e9a30e29cdb934c0bdb9c04b57f0a9a369a data/create/advancements/recipes/building_blocks/crafting/logistics/green_table_cloth.json -7c5cbfaccf7d14241c97c04fe5baf7f6031cc620 data/create/advancements/recipes/building_blocks/crafting/logistics/green_table_cloth_from_other_table_cloth.json -8f4bc79097e67045ec7b7394d47f845809f9851f data/create/advancements/recipes/building_blocks/crafting/logistics/light_blue_postbox.json -1a4b12a60b3b971fd7222a90425908b33fa7985d data/create/advancements/recipes/building_blocks/crafting/logistics/light_blue_postbox_from_other_postbox.json -166ee7c019768be4b9494608d13a7265e1e97a80 data/create/advancements/recipes/building_blocks/crafting/logistics/light_blue_table_cloth.json -64189712c7c89ddb53860e4ecbbb1cfe84173e90 data/create/advancements/recipes/building_blocks/crafting/logistics/light_blue_table_cloth_from_other_table_cloth.json -12b80ed2b31d3b65a831463538fc8d7788d9a77a data/create/advancements/recipes/building_blocks/crafting/logistics/light_gray_postbox.json -bd0ebfb2379f37aeb3c03d39a6d8aa005ef3d4cf data/create/advancements/recipes/building_blocks/crafting/logistics/light_gray_postbox_from_other_postbox.json -e1ce7076edd98e38e8d749c046ed6d289dae204e data/create/advancements/recipes/building_blocks/crafting/logistics/light_gray_table_cloth.json -70e7e4df0f8b00490ac85cc7c38e501baf799d88 data/create/advancements/recipes/building_blocks/crafting/logistics/light_gray_table_cloth_from_other_table_cloth.json -39182b8805ecd20842cd9d94825f5504d0bd8a0a data/create/advancements/recipes/building_blocks/crafting/logistics/lime_postbox.json -d7ddb4841e306859b471be6c32f91d4bd471eae6 data/create/advancements/recipes/building_blocks/crafting/logistics/lime_postbox_from_other_postbox.json -96f70bf632c5ec0dcead6ea9b03967a92321c767 data/create/advancements/recipes/building_blocks/crafting/logistics/lime_table_cloth.json -e0192fb9ef0422d25deaa1801228357f135097cc data/create/advancements/recipes/building_blocks/crafting/logistics/lime_table_cloth_from_other_table_cloth.json -e6b6ba626266d2ea84cce1a389df27cd44eeb15b data/create/advancements/recipes/building_blocks/crafting/logistics/magenta_postbox.json -7da22d10a137d0e1a953c2cb6b0c15f64cf4f453 data/create/advancements/recipes/building_blocks/crafting/logistics/magenta_postbox_from_other_postbox.json -416ef49b1c7cd1738c7329901dacad1688febae6 data/create/advancements/recipes/building_blocks/crafting/logistics/magenta_table_cloth.json -fc94c20112d6a0a8c85dd63dc6b036d7a8d6c9d4 data/create/advancements/recipes/building_blocks/crafting/logistics/magenta_table_cloth_from_other_table_cloth.json -13b2e283564460e095069fb9723a6d4cdcee6931 data/create/advancements/recipes/building_blocks/crafting/logistics/orange_postbox.json -1f38371e0896d74abeb6616dde615345d57e3f1d data/create/advancements/recipes/building_blocks/crafting/logistics/orange_postbox_from_other_postbox.json -1c49627c32669b053945c1dc6b99868e03224a05 data/create/advancements/recipes/building_blocks/crafting/logistics/orange_table_cloth.json -0b302e3ab914de973e1a836b7babb0bfb89b8e79 data/create/advancements/recipes/building_blocks/crafting/logistics/orange_table_cloth_from_other_table_cloth.json -f7ec699ff45bba54777c0b824a30b5e9a72e093a data/create/advancements/recipes/building_blocks/crafting/logistics/pink_postbox.json -8e1188506d566763fddf96d5452aae6c409504e9 data/create/advancements/recipes/building_blocks/crafting/logistics/pink_postbox_from_other_postbox.json -fa809c6e9eb3f7ff752976516ad57fa06cc2df6f data/create/advancements/recipes/building_blocks/crafting/logistics/pink_table_cloth.json -dde27c90e1a922b75ac35939d44ce4a3c2557371 data/create/advancements/recipes/building_blocks/crafting/logistics/pink_table_cloth_from_other_table_cloth.json -b99839abaeec938e903068ade927913e752df6ae data/create/advancements/recipes/building_blocks/crafting/logistics/purple_postbox.json -5ff2cf3a429f02f067ee0cfe5317937e69b816fd data/create/advancements/recipes/building_blocks/crafting/logistics/purple_postbox_from_other_postbox.json -9ba73de4e8069ecaf76b87b1746751264e8924b4 data/create/advancements/recipes/building_blocks/crafting/logistics/purple_table_cloth.json -8d27b828d4a39ccae7fb77ffd5774458850cb7ef data/create/advancements/recipes/building_blocks/crafting/logistics/purple_table_cloth_from_other_table_cloth.json -a9f13b04c89f2511b4ad83a14d6a1c64c16da745 data/create/advancements/recipes/building_blocks/crafting/logistics/red_postbox.json -6cb3089269221dc534c514bbcc1377a5199a273f data/create/advancements/recipes/building_blocks/crafting/logistics/red_postbox_from_other_postbox.json -675b04c5050796702e0fa970bc5f4a4153d12be2 data/create/advancements/recipes/building_blocks/crafting/logistics/red_table_cloth.json -489e033281e72dd1dee6a16bdee524f58a7b6679 data/create/advancements/recipes/building_blocks/crafting/logistics/red_table_cloth_from_other_table_cloth.json -ab72539b2ebe8cc2874a62dc32463421c9c685d1 data/create/advancements/recipes/building_blocks/crafting/logistics/white_postbox.json -b4bd005477650d6f6b5bbc244e5b25f8ad9f5f14 data/create/advancements/recipes/building_blocks/crafting/logistics/white_postbox_from_other_postbox.json -84040091909e565b1390576e3ed58cdc9735f24e data/create/advancements/recipes/building_blocks/crafting/logistics/white_table_cloth.json -113d0c96d61d27e419ef414550667379e37c5bf6 data/create/advancements/recipes/building_blocks/crafting/logistics/white_table_cloth_from_other_table_cloth.json -7d2c65210628be4a3d0c09dbf1e6fbbe868a9e56 data/create/advancements/recipes/building_blocks/crafting/logistics/yellow_postbox.json -9c2e00b2ac4f81f0cac0d9be6b06a0d077a23310 data/create/advancements/recipes/building_blocks/crafting/logistics/yellow_postbox_from_other_postbox.json -f116a1d549313a99135282a2a13262aada1a1dee data/create/advancements/recipes/building_blocks/crafting/logistics/yellow_table_cloth.json -2d0f3dc8fb9620ef3085ebbb932c7f0705ed893d data/create/advancements/recipes/building_blocks/crafting/logistics/yellow_table_cloth_from_other_table_cloth.json f3188b24f8108be4219016689a4768f826b4fef3 data/create/advancements/recipes/building_blocks/crimsite_from_stone_types_crimsite_stonecutting.json e88373b83226d860b0c2131213f5d3b09f31ab96 data/create/advancements/recipes/building_blocks/crimsite_pillar_from_stone_types_crimsite_stonecutting.json 09f7122cf360fd56bde2b1659bbed526f9a119c4 data/create/advancements/recipes/building_blocks/crimson_window.json b5234c6050bc0c6fe872a5ddc87d46ba39e07971 data/create/advancements/recipes/building_blocks/crimson_window_pane.json -b32f4345517c3c7299a06489325bd85f987145dc data/create/advancements/recipes/building_blocks/cut_andesite_bricks_from_stone_types_andesite_stonecutting.json 22fe2e61d7e9836d9f71c39bfbba50efc2fa184d data/create/advancements/recipes/building_blocks/cut_andesite_brick_slab.json 6d8d28364f1016dfd1d7cbe4a2637e2b6224e4d8 data/create/advancements/recipes/building_blocks/cut_andesite_brick_slab_from_stone_types_andesite_stonecutting.json 39e904f66d2194de5437b5da2f8db8b6f03d78f4 data/create/advancements/recipes/building_blocks/cut_andesite_brick_slab_recycling.json @@ -2717,6 +2394,7 @@ b32f4345517c3c7299a06489325bd85f987145dc data/create/advancements/recipes/buildi 480c696956b99c96cbaf46e7dad9711c40680ec8 data/create/advancements/recipes/building_blocks/cut_andesite_brick_stairs_from_stone_types_andesite_stonecutting.json 8d504cdb99f5dc59bef5ff35d0b443f2f4ba21d2 data/create/advancements/recipes/building_blocks/cut_andesite_brick_wall.json e1b8e5906d54368c98867b83143dc7acc7b0aa28 data/create/advancements/recipes/building_blocks/cut_andesite_brick_wall_from_stone_types_andesite_stonecutting.json +b32f4345517c3c7299a06489325bd85f987145dc data/create/advancements/recipes/building_blocks/cut_andesite_bricks_from_stone_types_andesite_stonecutting.json d5b44158f9a98d874d941fc4df99de7a2657af21 data/create/advancements/recipes/building_blocks/cut_andesite_from_stone_types_andesite_stonecutting.json c11998f554bbd42efdbdf58cf8efe5bcf69230de data/create/advancements/recipes/building_blocks/cut_andesite_slab.json 1f457c0e816e4dd70e1a960015d2004814d11926 data/create/advancements/recipes/building_blocks/cut_andesite_slab_from_stone_types_andesite_stonecutting.json @@ -2725,7 +2403,6 @@ a4d7adf49472a2069bad72defd39b111b83def3d data/create/advancements/recipes/buildi 6d38bb2b9812761c594ebdf717284ba8d32e88bc data/create/advancements/recipes/building_blocks/cut_andesite_stairs_from_stone_types_andesite_stonecutting.json 2f6b2296b11e0e743d68749e65af5ffa0f374998 data/create/advancements/recipes/building_blocks/cut_andesite_wall.json caf3b1c62d0f8df3ce126535f0566c899577bedb data/create/advancements/recipes/building_blocks/cut_andesite_wall_from_stone_types_andesite_stonecutting.json -54188623046e989d21e6e155933e4084fb2882c4 data/create/advancements/recipes/building_blocks/cut_asurine_bricks_from_stone_types_asurine_stonecutting.json 536a2bed2ed1e7e249886ef376c96a8d5a1facdc data/create/advancements/recipes/building_blocks/cut_asurine_brick_slab.json a4e833cadfbb82222a70d66524e804c83ea13f7b data/create/advancements/recipes/building_blocks/cut_asurine_brick_slab_from_stone_types_asurine_stonecutting.json 610163ac2f4b06121931a81ac4b3df39ece61998 data/create/advancements/recipes/building_blocks/cut_asurine_brick_slab_recycling.json @@ -2733,6 +2410,7 @@ a4e833cadfbb82222a70d66524e804c83ea13f7b data/create/advancements/recipes/buildi f92f31e80cc026160217afb6c757987f75ed0b33 data/create/advancements/recipes/building_blocks/cut_asurine_brick_stairs_from_stone_types_asurine_stonecutting.json fa6dc7eaa32652a00a7217ae25967de0791088b6 data/create/advancements/recipes/building_blocks/cut_asurine_brick_wall.json 33f361369bfd92f53b3e40c837b336edd04a26e9 data/create/advancements/recipes/building_blocks/cut_asurine_brick_wall_from_stone_types_asurine_stonecutting.json +54188623046e989d21e6e155933e4084fb2882c4 data/create/advancements/recipes/building_blocks/cut_asurine_bricks_from_stone_types_asurine_stonecutting.json a6b871faa10badaaaa1a0ebbba94c4f2f627c43f data/create/advancements/recipes/building_blocks/cut_asurine_from_stone_types_asurine_stonecutting.json 719e1d4fea3457f2990be6a5d6cd87915d546217 data/create/advancements/recipes/building_blocks/cut_asurine_slab.json 586918291dda711c79941cf484cb62dbb853a271 data/create/advancements/recipes/building_blocks/cut_asurine_slab_from_stone_types_asurine_stonecutting.json @@ -2741,7 +2419,6 @@ bd2a630d242ae9c89b071b0401285068071a346c data/create/advancements/recipes/buildi 03d7b1609d161043e28661d74f53b06d4408f561 data/create/advancements/recipes/building_blocks/cut_asurine_stairs_from_stone_types_asurine_stonecutting.json cba4a6feaf695e665204cac36f9109ba941b12a6 data/create/advancements/recipes/building_blocks/cut_asurine_wall.json 3327651dd3f2fd778abdcfe70d25137d916f3def data/create/advancements/recipes/building_blocks/cut_asurine_wall_from_stone_types_asurine_stonecutting.json -44873f9d05abde7d52a6eacdf3573d8b69c69452 data/create/advancements/recipes/building_blocks/cut_calcite_bricks_from_stone_types_calcite_stonecutting.json a070ffe63c182b33c4c6faedb391f51a209c0e27 data/create/advancements/recipes/building_blocks/cut_calcite_brick_slab.json 7ba1e7add81422599f798153e4fd069e9fbfdebf data/create/advancements/recipes/building_blocks/cut_calcite_brick_slab_from_stone_types_calcite_stonecutting.json f5e80ec393c306485d666d6f9f91c55d9f1ba592 data/create/advancements/recipes/building_blocks/cut_calcite_brick_slab_recycling.json @@ -2749,6 +2426,7 @@ f5e80ec393c306485d666d6f9f91c55d9f1ba592 data/create/advancements/recipes/buildi 627f85aa63133cf95dd828092e0232b9ec8acfd5 data/create/advancements/recipes/building_blocks/cut_calcite_brick_stairs_from_stone_types_calcite_stonecutting.json d8870e522a68274cc90eab07ea17b7b6cdc5a16c data/create/advancements/recipes/building_blocks/cut_calcite_brick_wall.json cdf5927f3c1b3ef8904f38f66317412799e189fb data/create/advancements/recipes/building_blocks/cut_calcite_brick_wall_from_stone_types_calcite_stonecutting.json +44873f9d05abde7d52a6eacdf3573d8b69c69452 data/create/advancements/recipes/building_blocks/cut_calcite_bricks_from_stone_types_calcite_stonecutting.json 9f8c31b0db2aab8f1c8f42bcef15a74bc36887d4 data/create/advancements/recipes/building_blocks/cut_calcite_from_stone_types_calcite_stonecutting.json 857666ad1c6a5cc886f6896a18f560098afaa67b data/create/advancements/recipes/building_blocks/cut_calcite_slab.json c55074cd091b0e078105abdc940c62afa8984265 data/create/advancements/recipes/building_blocks/cut_calcite_slab_from_stone_types_calcite_stonecutting.json @@ -2757,7 +2435,6 @@ c55074cd091b0e078105abdc940c62afa8984265 data/create/advancements/recipes/buildi ba3378e1d08de2af0b2a725727cf9f68bda60044 data/create/advancements/recipes/building_blocks/cut_calcite_stairs_from_stone_types_calcite_stonecutting.json db5f4e1eee91c2a65d36164c20aba0e9d3a502ae data/create/advancements/recipes/building_blocks/cut_calcite_wall.json 19de370083d2cf1234c9c4e6ff45d85ef34a1ac8 data/create/advancements/recipes/building_blocks/cut_calcite_wall_from_stone_types_calcite_stonecutting.json -b9a2edda241f6e0677a2003300f0be5d3ff8f4b0 data/create/advancements/recipes/building_blocks/cut_crimsite_bricks_from_stone_types_crimsite_stonecutting.json 9fda0e6edde197a9c28a854419a2a07e323b6b53 data/create/advancements/recipes/building_blocks/cut_crimsite_brick_slab.json 2da3f139759be7eea552885b2063a0e2dfc647b1 data/create/advancements/recipes/building_blocks/cut_crimsite_brick_slab_from_stone_types_crimsite_stonecutting.json 62d928c8ab2e09a3f87adacb5adb1a5ddc1d2a7b data/create/advancements/recipes/building_blocks/cut_crimsite_brick_slab_recycling.json @@ -2765,6 +2442,7 @@ b9a2edda241f6e0677a2003300f0be5d3ff8f4b0 data/create/advancements/recipes/buildi 89850244feb8a3293ba96702b7a56a4bea84e1f3 data/create/advancements/recipes/building_blocks/cut_crimsite_brick_stairs_from_stone_types_crimsite_stonecutting.json 267cab789c73d474299542fb0719967501fcf0c9 data/create/advancements/recipes/building_blocks/cut_crimsite_brick_wall.json 27007676b86eb8a3498982d8b5e68495b84d62d5 data/create/advancements/recipes/building_blocks/cut_crimsite_brick_wall_from_stone_types_crimsite_stonecutting.json +b9a2edda241f6e0677a2003300f0be5d3ff8f4b0 data/create/advancements/recipes/building_blocks/cut_crimsite_bricks_from_stone_types_crimsite_stonecutting.json a88d252d4e634ff194daa3ff98fd7e965e3ed09a data/create/advancements/recipes/building_blocks/cut_crimsite_from_stone_types_crimsite_stonecutting.json f703136e1783a42252bc1d89c31e5563cbdff583 data/create/advancements/recipes/building_blocks/cut_crimsite_slab.json 3330d332462da22de48d07b62277c1df8e646a3e data/create/advancements/recipes/building_blocks/cut_crimsite_slab_from_stone_types_crimsite_stonecutting.json @@ -2773,7 +2451,6 @@ c2707e5969f0c554537dda9d3e2a4c13e19863c3 data/create/advancements/recipes/buildi e9ba513178090b020525e72468a0450e225da779 data/create/advancements/recipes/building_blocks/cut_crimsite_stairs_from_stone_types_crimsite_stonecutting.json 7fb5ce65b7b5c2d76b4306d407aaa6eefe07b7e5 data/create/advancements/recipes/building_blocks/cut_crimsite_wall.json a83d5b669f92bd833af2768d2cf5d4797a86b63c data/create/advancements/recipes/building_blocks/cut_crimsite_wall_from_stone_types_crimsite_stonecutting.json -bc9eb21df37df4b69e5d202b3b770698a16f4413 data/create/advancements/recipes/building_blocks/cut_deepslate_bricks_from_stone_types_deepslate_stonecutting.json 2c380e8ddc83cef4213f136ff7a196d861728914 data/create/advancements/recipes/building_blocks/cut_deepslate_brick_slab.json 87b5dfc1e61fabe4e7661bea0d7a56cb75197a81 data/create/advancements/recipes/building_blocks/cut_deepslate_brick_slab_from_stone_types_deepslate_stonecutting.json 09cde6df1120cc5f5f129023885f323b4d1eeae9 data/create/advancements/recipes/building_blocks/cut_deepslate_brick_slab_recycling.json @@ -2781,6 +2458,7 @@ bc9eb21df37df4b69e5d202b3b770698a16f4413 data/create/advancements/recipes/buildi 28e15fe2c377540cb631f6648f49090f234e7704 data/create/advancements/recipes/building_blocks/cut_deepslate_brick_stairs_from_stone_types_deepslate_stonecutting.json d2b34f455ab0053f24a4f9dec7dcce45832ef25b data/create/advancements/recipes/building_blocks/cut_deepslate_brick_wall.json 7b174b65b813b4a9ca507e71fa142931e074f336 data/create/advancements/recipes/building_blocks/cut_deepslate_brick_wall_from_stone_types_deepslate_stonecutting.json +bc9eb21df37df4b69e5d202b3b770698a16f4413 data/create/advancements/recipes/building_blocks/cut_deepslate_bricks_from_stone_types_deepslate_stonecutting.json 83db3f5b46c996481b930974bddba75c82c115af data/create/advancements/recipes/building_blocks/cut_deepslate_from_stone_types_deepslate_stonecutting.json 8e8816aad8212c3557e77cc01df551fe1a0a306d data/create/advancements/recipes/building_blocks/cut_deepslate_slab.json 14ea447072200733dd9551a5ac6a9544593dd9f7 data/create/advancements/recipes/building_blocks/cut_deepslate_slab_from_stone_types_deepslate_stonecutting.json @@ -2789,7 +2467,6 @@ c7870abb459c8b174c380282ae211a87ab252521 data/create/advancements/recipes/buildi 4f157401a3019c96cc6ae5a0036f31351c651fbb data/create/advancements/recipes/building_blocks/cut_deepslate_stairs_from_stone_types_deepslate_stonecutting.json 9ae9635fa129aab54a7ec971b9cc61d300d3d53e data/create/advancements/recipes/building_blocks/cut_deepslate_wall.json 9b5df53000c79a7b20e3a1888e003b704809feda data/create/advancements/recipes/building_blocks/cut_deepslate_wall_from_stone_types_deepslate_stonecutting.json -fdef99789ca74623b00b05be2f975b63831645db data/create/advancements/recipes/building_blocks/cut_diorite_bricks_from_stone_types_diorite_stonecutting.json 30a00465dc9b19d8024146e2c2d6b9f41562da30 data/create/advancements/recipes/building_blocks/cut_diorite_brick_slab.json a55e7daf48a487d74b4a01e30b80968094154d2b data/create/advancements/recipes/building_blocks/cut_diorite_brick_slab_from_stone_types_diorite_stonecutting.json e445a3d8fd00f5e4f2ee56c797d8abf548598447 data/create/advancements/recipes/building_blocks/cut_diorite_brick_slab_recycling.json @@ -2797,6 +2474,7 @@ b421f24513612dd7a5d8977d7bff122fd5cf9522 data/create/advancements/recipes/buildi 3fe00adac35beeda79b7f9d930a1f13b033c0f12 data/create/advancements/recipes/building_blocks/cut_diorite_brick_stairs_from_stone_types_diorite_stonecutting.json 6d2235b8587863107a6d1a0818c81ee3dc217cdf data/create/advancements/recipes/building_blocks/cut_diorite_brick_wall.json 0ec4b69e98adf961f5d4d63700f11ad66a4116b5 data/create/advancements/recipes/building_blocks/cut_diorite_brick_wall_from_stone_types_diorite_stonecutting.json +fdef99789ca74623b00b05be2f975b63831645db data/create/advancements/recipes/building_blocks/cut_diorite_bricks_from_stone_types_diorite_stonecutting.json c9f52e0661fdc266f8429faf1570124fecfa2d6a data/create/advancements/recipes/building_blocks/cut_diorite_from_stone_types_diorite_stonecutting.json c7b73ddec6402e8b5ff5daedbbbc74f882338a8e data/create/advancements/recipes/building_blocks/cut_diorite_slab.json 46c841e5aae99106cbc28026dcfec946976127e5 data/create/advancements/recipes/building_blocks/cut_diorite_slab_from_stone_types_diorite_stonecutting.json @@ -2805,7 +2483,6 @@ ce67a5fae622955ad795e2b3d14c159a4c47b936 data/create/advancements/recipes/buildi 3b7ec28df80ea9cf87980b2c2184858ba6152a3f data/create/advancements/recipes/building_blocks/cut_diorite_stairs_from_stone_types_diorite_stonecutting.json c8fe9ab53eda2cdbff08678ebb577c169ea61a91 data/create/advancements/recipes/building_blocks/cut_diorite_wall.json 050f67b5a662bea3ef972521ef7f81c2ba99015c data/create/advancements/recipes/building_blocks/cut_diorite_wall_from_stone_types_diorite_stonecutting.json -b60683fdd629b201f40a6f9bb6594df7c5ac13f1 data/create/advancements/recipes/building_blocks/cut_dripstone_bricks_from_stone_types_dripstone_stonecutting.json 1e0d39ed56e2ab4eac084f26a1c6de905db29220 data/create/advancements/recipes/building_blocks/cut_dripstone_brick_slab.json 020cbc4c8063d186d3f5c9ece429e4cdff53cf63 data/create/advancements/recipes/building_blocks/cut_dripstone_brick_slab_from_stone_types_dripstone_stonecutting.json b44c9e7f9f62ffffb5566901e0a22010ba76641c data/create/advancements/recipes/building_blocks/cut_dripstone_brick_slab_recycling.json @@ -2813,6 +2490,7 @@ b44c9e7f9f62ffffb5566901e0a22010ba76641c data/create/advancements/recipes/buildi 466fbdf7de8dacd1032fb7af690862bb68707876 data/create/advancements/recipes/building_blocks/cut_dripstone_brick_stairs_from_stone_types_dripstone_stonecutting.json 253b54c191c933e88fa6a9b4e7c94340082c7d60 data/create/advancements/recipes/building_blocks/cut_dripstone_brick_wall.json e176568e3de8b8ca17a788f4cea89002b5ad2d1d data/create/advancements/recipes/building_blocks/cut_dripstone_brick_wall_from_stone_types_dripstone_stonecutting.json +b60683fdd629b201f40a6f9bb6594df7c5ac13f1 data/create/advancements/recipes/building_blocks/cut_dripstone_bricks_from_stone_types_dripstone_stonecutting.json ddc5a16cf0d2790d8133ab6801f4c55317d776e4 data/create/advancements/recipes/building_blocks/cut_dripstone_from_stone_types_dripstone_stonecutting.json 6e40c9af0747a8b3adb805ddd8fbb947aedb408c data/create/advancements/recipes/building_blocks/cut_dripstone_slab.json e7761f71f797d2e62dc0860cbd5153955b9be86c data/create/advancements/recipes/building_blocks/cut_dripstone_slab_from_stone_types_dripstone_stonecutting.json @@ -2821,7 +2499,6 @@ a199a9f78a44f4313a922b317893c68f743dc1a9 data/create/advancements/recipes/buildi b68a95a565ee9a3aec017431aa5b8cc6fffec3ef data/create/advancements/recipes/building_blocks/cut_dripstone_stairs_from_stone_types_dripstone_stonecutting.json a4287f34f95c008bdf7c0a886d05c3960665147b data/create/advancements/recipes/building_blocks/cut_dripstone_wall.json 76f5d4a6a9895064b15ae0c0f27a138bb3d57dbf data/create/advancements/recipes/building_blocks/cut_dripstone_wall_from_stone_types_dripstone_stonecutting.json -24cc01d592faf2bad57fc9b9a1de52c50d225446 data/create/advancements/recipes/building_blocks/cut_granite_bricks_from_stone_types_granite_stonecutting.json 83148f66dc7418740b6f9b6a660b0b9306d87f7c data/create/advancements/recipes/building_blocks/cut_granite_brick_slab.json d982802fc11848c87022f7bf05cecf090953002a data/create/advancements/recipes/building_blocks/cut_granite_brick_slab_from_stone_types_granite_stonecutting.json 6b8fa161725a4e2106226c3591a23def74398f48 data/create/advancements/recipes/building_blocks/cut_granite_brick_slab_recycling.json @@ -2829,6 +2506,7 @@ ce1c81b730b3acef9673f41769339f7d68385348 data/create/advancements/recipes/buildi e9732e3beaefbc6a457e0c4fd61f17f429f1cd8c data/create/advancements/recipes/building_blocks/cut_granite_brick_stairs_from_stone_types_granite_stonecutting.json 4f403aee2aae6aa0fc334b434cf5ade362153329 data/create/advancements/recipes/building_blocks/cut_granite_brick_wall.json 625c8849b5c07835b49dcb4322ec44586628a700 data/create/advancements/recipes/building_blocks/cut_granite_brick_wall_from_stone_types_granite_stonecutting.json +24cc01d592faf2bad57fc9b9a1de52c50d225446 data/create/advancements/recipes/building_blocks/cut_granite_bricks_from_stone_types_granite_stonecutting.json 07e6f3835c3683f007fd25140d671b668706484d data/create/advancements/recipes/building_blocks/cut_granite_from_stone_types_granite_stonecutting.json 2f33b7f82e977eb3fd0e0283313b1066eadadd18 data/create/advancements/recipes/building_blocks/cut_granite_slab.json a1b406ca98c2ba7d5225afea8463d586fc538428 data/create/advancements/recipes/building_blocks/cut_granite_slab_from_stone_types_granite_stonecutting.json @@ -2837,7 +2515,6 @@ af12a2d8f8bb2382f55135df8cfec00692a65fe3 data/create/advancements/recipes/buildi 284087e07acd28aa869d5433375e412f083108e9 data/create/advancements/recipes/building_blocks/cut_granite_stairs_from_stone_types_granite_stonecutting.json dbfb50c3d5048b1f5d8d74f39c389ecec81392d7 data/create/advancements/recipes/building_blocks/cut_granite_wall.json 6b287be7a900dbd715290b069a89ab226d6cec9c data/create/advancements/recipes/building_blocks/cut_granite_wall_from_stone_types_granite_stonecutting.json -4ef0a018dcf0b470061a4b1dbadc27684d8d467f data/create/advancements/recipes/building_blocks/cut_limestone_bricks_from_stone_types_limestone_stonecutting.json b0ade7dab7eb095f07882e4c19884162f18e704c data/create/advancements/recipes/building_blocks/cut_limestone_brick_slab.json 4fc2dc61d62a394cebc91e36745699eeaee650e7 data/create/advancements/recipes/building_blocks/cut_limestone_brick_slab_from_stone_types_limestone_stonecutting.json b8ec42f06ce9eb696643154d16150a223bd5ec65 data/create/advancements/recipes/building_blocks/cut_limestone_brick_slab_recycling.json @@ -2845,6 +2522,7 @@ d0b19c27309cd45d08a6a0cd779f1930bc2e7469 data/create/advancements/recipes/buildi 9f65617405592d587a940ff7513fcb34ca6ab423 data/create/advancements/recipes/building_blocks/cut_limestone_brick_stairs_from_stone_types_limestone_stonecutting.json 281e2ddcb58b603dea8f305ed6c8ddea98d0d030 data/create/advancements/recipes/building_blocks/cut_limestone_brick_wall.json 7b0ab5095a7d2b3e876a8c8b990161851c1c58c2 data/create/advancements/recipes/building_blocks/cut_limestone_brick_wall_from_stone_types_limestone_stonecutting.json +4ef0a018dcf0b470061a4b1dbadc27684d8d467f data/create/advancements/recipes/building_blocks/cut_limestone_bricks_from_stone_types_limestone_stonecutting.json f8663a45d71c52a3982c75bbfb61653c8d2fd668 data/create/advancements/recipes/building_blocks/cut_limestone_from_stone_types_limestone_stonecutting.json 9e22972cd4f2d673cfcf07a597f6a14402c91913 data/create/advancements/recipes/building_blocks/cut_limestone_slab.json 388a57bb88582eda9fef904a530f72b066d24e7d data/create/advancements/recipes/building_blocks/cut_limestone_slab_from_stone_types_limestone_stonecutting.json @@ -2853,7 +2531,6 @@ f8663a45d71c52a3982c75bbfb61653c8d2fd668 data/create/advancements/recipes/buildi b6dc46dca3fc039fd0fe53ab791731cb085c3b62 data/create/advancements/recipes/building_blocks/cut_limestone_stairs_from_stone_types_limestone_stonecutting.json a9382d5f876542bf4fa8aed605352daca4ad2f6f data/create/advancements/recipes/building_blocks/cut_limestone_wall.json 69d9116786c53cb3155bed4580d4b01bfe638243 data/create/advancements/recipes/building_blocks/cut_limestone_wall_from_stone_types_limestone_stonecutting.json -1f8ee1a91937295484d5c2fe0186a617589c1761 data/create/advancements/recipes/building_blocks/cut_ochrum_bricks_from_stone_types_ochrum_stonecutting.json a51d6ebed8e21e8808ccfbe9f9540291504da59a data/create/advancements/recipes/building_blocks/cut_ochrum_brick_slab.json eb08f00651259f83f6eced0f90dd8df0e9d0d508 data/create/advancements/recipes/building_blocks/cut_ochrum_brick_slab_from_stone_types_ochrum_stonecutting.json a189e0549723cefbd19a147274cd79909dca2b70 data/create/advancements/recipes/building_blocks/cut_ochrum_brick_slab_recycling.json @@ -2861,6 +2538,7 @@ a5dc9e74ad0d18d83bad3aab8c5e2768355a2370 data/create/advancements/recipes/buildi 27a5331727199b8b8f2dd6c581e25d17d12fc1ba data/create/advancements/recipes/building_blocks/cut_ochrum_brick_stairs_from_stone_types_ochrum_stonecutting.json 648e532441c664310047c5c9c78833d2eaea5920 data/create/advancements/recipes/building_blocks/cut_ochrum_brick_wall.json 053256b7b154ba5c10d2483d86658f132296e8f5 data/create/advancements/recipes/building_blocks/cut_ochrum_brick_wall_from_stone_types_ochrum_stonecutting.json +1f8ee1a91937295484d5c2fe0186a617589c1761 data/create/advancements/recipes/building_blocks/cut_ochrum_bricks_from_stone_types_ochrum_stonecutting.json 6abb6e36229685ca26ee31b5db3074a07453435e data/create/advancements/recipes/building_blocks/cut_ochrum_from_stone_types_ochrum_stonecutting.json 0c5e92fb20048fe5d9dcd42e10fd0f9b155c385a data/create/advancements/recipes/building_blocks/cut_ochrum_slab.json 941aba0ff7967d7ea56e1f811aa6bc34d4711796 data/create/advancements/recipes/building_blocks/cut_ochrum_slab_from_stone_types_ochrum_stonecutting.json @@ -2869,7 +2547,6 @@ fa14009e4de8cfdacdbb7679473ce359f2cb85be data/create/advancements/recipes/buildi d50accd7f37bfd9384790bdd727401757f6dc7e4 data/create/advancements/recipes/building_blocks/cut_ochrum_stairs_from_stone_types_ochrum_stonecutting.json ed0a72f6393c0d16240b89241f5bbac7dc003516 data/create/advancements/recipes/building_blocks/cut_ochrum_wall.json cda838f95015b0bf02fc5427e1a69ed6302b7e20 data/create/advancements/recipes/building_blocks/cut_ochrum_wall_from_stone_types_ochrum_stonecutting.json -a51cd5a82d9b30c8a68f7cdf8dd7a6b2f883c27c data/create/advancements/recipes/building_blocks/cut_scorchia_bricks_from_stone_types_scorchia_stonecutting.json ce33e5a98a83dae1f37ad4b3d4ea148de5bcacdf data/create/advancements/recipes/building_blocks/cut_scorchia_brick_slab.json 498825e9e5502a7ec8a1f23bfe998b960d7fc9eb data/create/advancements/recipes/building_blocks/cut_scorchia_brick_slab_from_stone_types_scorchia_stonecutting.json 8ffa08b1b4e4ab37dfbf09d2ec4a37f93c9503cb data/create/advancements/recipes/building_blocks/cut_scorchia_brick_slab_recycling.json @@ -2877,6 +2554,7 @@ ce33e5a98a83dae1f37ad4b3d4ea148de5bcacdf data/create/advancements/recipes/buildi 3c4b45560f446534821da63d4e713088928e5f4a data/create/advancements/recipes/building_blocks/cut_scorchia_brick_stairs_from_stone_types_scorchia_stonecutting.json 2aba76185175fff82898a7a905d3ec4ff448deaa data/create/advancements/recipes/building_blocks/cut_scorchia_brick_wall.json ca1f54af4425df994c6707f00e43b8db3ce66280 data/create/advancements/recipes/building_blocks/cut_scorchia_brick_wall_from_stone_types_scorchia_stonecutting.json +a51cd5a82d9b30c8a68f7cdf8dd7a6b2f883c27c data/create/advancements/recipes/building_blocks/cut_scorchia_bricks_from_stone_types_scorchia_stonecutting.json df847f312960866d3d53f48297ea3169c27314eb data/create/advancements/recipes/building_blocks/cut_scorchia_from_stone_types_scorchia_stonecutting.json 8095f7be8aac4f11d618549680d537bed8a921c5 data/create/advancements/recipes/building_blocks/cut_scorchia_slab.json a53831cf7f095fa4d0d92051bd0e21f912c2d9dd data/create/advancements/recipes/building_blocks/cut_scorchia_slab_from_stone_types_scorchia_stonecutting.json @@ -2885,7 +2563,6 @@ a53831cf7f095fa4d0d92051bd0e21f912c2d9dd data/create/advancements/recipes/buildi 30f1efaa46771dd22d7f3aa34f24c69bbdb59bd5 data/create/advancements/recipes/building_blocks/cut_scorchia_stairs_from_stone_types_scorchia_stonecutting.json e02d188d64b270682fa9d335a3423880d8358a0d data/create/advancements/recipes/building_blocks/cut_scorchia_wall.json 834c5a2a8d089822fa81a75b290818db276beab7 data/create/advancements/recipes/building_blocks/cut_scorchia_wall_from_stone_types_scorchia_stonecutting.json -2030ec21c96336bd4c4040857f40ec65d1a75075 data/create/advancements/recipes/building_blocks/cut_scoria_bricks_from_stone_types_scoria_stonecutting.json 705dfcd9f4b6b8a0c360436c097cb371c27cf60d data/create/advancements/recipes/building_blocks/cut_scoria_brick_slab.json 482cf1bbb65a4facc0ebf31ea91bab4d03580635 data/create/advancements/recipes/building_blocks/cut_scoria_brick_slab_from_stone_types_scoria_stonecutting.json 51d070acfc8ad4cd8ca4457ca346458c81eaade4 data/create/advancements/recipes/building_blocks/cut_scoria_brick_slab_recycling.json @@ -2893,6 +2570,7 @@ e02d188d64b270682fa9d335a3423880d8358a0d data/create/advancements/recipes/buildi 99ca117e6a4ad242d92566a2f398c28edb3b7061 data/create/advancements/recipes/building_blocks/cut_scoria_brick_stairs_from_stone_types_scoria_stonecutting.json 01e294976d8ce71b59fb14a47e2686bdce4fab21 data/create/advancements/recipes/building_blocks/cut_scoria_brick_wall.json 0c1d31d37a17d4bd752508022ddd9690bb92a521 data/create/advancements/recipes/building_blocks/cut_scoria_brick_wall_from_stone_types_scoria_stonecutting.json +2030ec21c96336bd4c4040857f40ec65d1a75075 data/create/advancements/recipes/building_blocks/cut_scoria_bricks_from_stone_types_scoria_stonecutting.json 41f420c88dbf61d3cb51966cca9b495d10c604d3 data/create/advancements/recipes/building_blocks/cut_scoria_from_stone_types_scoria_stonecutting.json 26c8447854e29243f0697236f59e258fa96ed369 data/create/advancements/recipes/building_blocks/cut_scoria_slab.json f3e2522664de4ff2ad92a89443e064ac857b7aef data/create/advancements/recipes/building_blocks/cut_scoria_slab_from_stone_types_scoria_stonecutting.json @@ -2901,7 +2579,6 @@ a0635452fd698415e8112e9e0f6d71571901ca34 data/create/advancements/recipes/buildi 1bb047298b71a57e8632607af7b17bab2690aecb data/create/advancements/recipes/building_blocks/cut_scoria_stairs_from_stone_types_scoria_stonecutting.json a33878fe778438a746a28c1fd03ca6d01092ebe4 data/create/advancements/recipes/building_blocks/cut_scoria_wall.json 74a637d0d0f360ad692661c0213c18a06a8ec500 data/create/advancements/recipes/building_blocks/cut_scoria_wall_from_stone_types_scoria_stonecutting.json -f0870d596d9ac9e5b5272fb4e3d2c90c29f3a63d data/create/advancements/recipes/building_blocks/cut_tuff_bricks_from_stone_types_tuff_stonecutting.json b75410afdb8775b2a834ded315913e0ae38e4df8 data/create/advancements/recipes/building_blocks/cut_tuff_brick_slab.json 34c2aead2f2355a8f0f9f9aa7dba58dd5187dbba data/create/advancements/recipes/building_blocks/cut_tuff_brick_slab_from_stone_types_tuff_stonecutting.json c071c43e93cc1735bebbbf320f1b8d2cba4be1e3 data/create/advancements/recipes/building_blocks/cut_tuff_brick_slab_recycling.json @@ -2909,6 +2586,7 @@ c89ec2300425688f9e72e45c64def0b09c0219b0 data/create/advancements/recipes/buildi c882f72f5a31bc92a8186834b105a2e07d864366 data/create/advancements/recipes/building_blocks/cut_tuff_brick_stairs_from_stone_types_tuff_stonecutting.json 70295775a6170a1332f5604aaf75a026630c9e93 data/create/advancements/recipes/building_blocks/cut_tuff_brick_wall.json 1b79d0e71dae77967c1554c203e68eeb51fe8054 data/create/advancements/recipes/building_blocks/cut_tuff_brick_wall_from_stone_types_tuff_stonecutting.json +f0870d596d9ac9e5b5272fb4e3d2c90c29f3a63d data/create/advancements/recipes/building_blocks/cut_tuff_bricks_from_stone_types_tuff_stonecutting.json 549d1f911c009a3cafff4edcb37116c92c2b8e21 data/create/advancements/recipes/building_blocks/cut_tuff_from_stone_types_tuff_stonecutting.json 5bc3e40a8e50a521ebd5fa58efa3ec21064163f7 data/create/advancements/recipes/building_blocks/cut_tuff_slab.json f1ab5be6cb7287517d87b173680ddf833a1dd534 data/create/advancements/recipes/building_blocks/cut_tuff_slab_from_stone_types_tuff_stonecutting.json @@ -2917,7 +2595,6 @@ b7d19085017530f0c2122511c35dbef6a50b337f data/create/advancements/recipes/buildi 3c9541b6e4eb8ff7f7b627a75e8c38ed9eeaf342 data/create/advancements/recipes/building_blocks/cut_tuff_stairs_from_stone_types_tuff_stonecutting.json 51ca798b8bd822ddbbfe8f07073eefb948b97b42 data/create/advancements/recipes/building_blocks/cut_tuff_wall.json 1aa1a0d00c19069f0c55e698b474115d7f437355 data/create/advancements/recipes/building_blocks/cut_tuff_wall_from_stone_types_tuff_stonecutting.json -6a80920618d8e9b7919c83c419e751971440d38a data/create/advancements/recipes/building_blocks/cut_veridium_bricks_from_stone_types_veridium_stonecutting.json e263f555c3a47c83187d29ae9b816edc0c1a763b data/create/advancements/recipes/building_blocks/cut_veridium_brick_slab.json f0e84bde804e52f504cd93bee5058a89f6939dc9 data/create/advancements/recipes/building_blocks/cut_veridium_brick_slab_from_stone_types_veridium_stonecutting.json 949fe819c76fd63edfd93bef5898119c8456fda3 data/create/advancements/recipes/building_blocks/cut_veridium_brick_slab_recycling.json @@ -2925,6 +2602,7 @@ fc87560dedbc951d10d9650a6f27192e7c3a1cc5 data/create/advancements/recipes/buildi 35b09d6300ff8e86f01bc0258fca5cfa80d55c61 data/create/advancements/recipes/building_blocks/cut_veridium_brick_stairs_from_stone_types_veridium_stonecutting.json 599d9ce510531c6006a4964bb4049a850a8457ee data/create/advancements/recipes/building_blocks/cut_veridium_brick_wall.json aaaad7a65a1c05071565ca91a181ff3c375e0141 data/create/advancements/recipes/building_blocks/cut_veridium_brick_wall_from_stone_types_veridium_stonecutting.json +6a80920618d8e9b7919c83c419e751971440d38a data/create/advancements/recipes/building_blocks/cut_veridium_bricks_from_stone_types_veridium_stonecutting.json c76ae7944646e8f13ea460ba6655b95b6c2798ea data/create/advancements/recipes/building_blocks/cut_veridium_from_stone_types_veridium_stonecutting.json 3bafa8873b62cb0333b44af77f2c6e824c5b3e95 data/create/advancements/recipes/building_blocks/cut_veridium_slab.json 143f64b0e5536693262f6a62c2a6fbf85bd4203e data/create/advancements/recipes/building_blocks/cut_veridium_slab_from_stone_types_veridium_stonecutting.json @@ -2956,8 +2634,6 @@ e3c5bd9bf6f73620ccb61e0a9cb3beb18b04b527 data/create/advancements/recipes/buildi 85fb8fdb3cebaaacf24794aec90e7894f66a8402 data/create/advancements/recipes/building_blocks/horizontal_framed_glass_from_glass_colorless_stonecutting.json c609b408d6467ec71513ecca19a6040ad7011a79 data/create/advancements/recipes/building_blocks/horizontal_framed_glass_pane.json a587d84e187d6552473f646461539dc56d4e748f data/create/advancements/recipes/building_blocks/industrial_iron_block_from_ingots_iron_stonecutting.json -d6c892f6f3ae052b2f65d5e5a0cdcc7c60da13db data/create/advancements/recipes/building_blocks/industrial_iron_window.json -a26261da3faa6b49a3d2c6b4f7ccc504681f73f8 data/create/advancements/recipes/building_blocks/industrial_iron_window_pane.json 546af6a639e4799fb83d61b131ab0cc38ef6b33a data/create/advancements/recipes/building_blocks/jungle_window.json e8c728c46cc69cc0e9d755551bb9a52f2b61a6c0 data/create/advancements/recipes/building_blocks/jungle_window_pane.json b9d04c53fdf3ba977216021ca71aa5e4f2d9a0b0 data/create/advancements/recipes/building_blocks/layered_andesite_from_stone_types_andesite_stonecutting.json @@ -3110,7 +2786,6 @@ c4c087911453bd979e028d3b3558b273e3cb5926 data/create/advancements/recipes/buildi 780bb3d13fcd8abf6e166b04566b141e023ee11e data/create/advancements/recipes/building_blocks/scorchia_pillar_from_stone_types_scorchia_stonecutting.json 5c5c5080c1136c046caee2d14dd2c3c9f09abad3 data/create/advancements/recipes/building_blocks/scoria_from_stone_types_scoria_stonecutting.json 5a6b12869ffcbd1d9b4fbe1fee444fcde95d2953 data/create/advancements/recipes/building_blocks/scoria_pillar_from_stone_types_scoria_stonecutting.json -a51ca3151c517113338720edeac0e02a46ebb03a data/create/advancements/recipes/building_blocks/small_andesite_bricks_from_stone_types_andesite_stonecutting.json f72093994236a0580c6cafd08fb42f061733de01 data/create/advancements/recipes/building_blocks/small_andesite_brick_slab.json 05092201e6c514d3eae566fb1ce98ad415660112 data/create/advancements/recipes/building_blocks/small_andesite_brick_slab_from_stone_types_andesite_stonecutting.json 0e41d75b613a0ebd0c023669dcfd34f11b14fd0e data/create/advancements/recipes/building_blocks/small_andesite_brick_slab_recycling.json @@ -3118,7 +2793,7 @@ f72093994236a0580c6cafd08fb42f061733de01 data/create/advancements/recipes/buildi 8bbf898cbc47ac7a326c0d082a92a452b6915a7e data/create/advancements/recipes/building_blocks/small_andesite_brick_stairs_from_stone_types_andesite_stonecutting.json 9e0685dd668550c67812d1caccd8c8cae9f2041c data/create/advancements/recipes/building_blocks/small_andesite_brick_wall.json 7a1bfa848f950482f82d7fe7a9cf3cf916f91702 data/create/advancements/recipes/building_blocks/small_andesite_brick_wall_from_stone_types_andesite_stonecutting.json -0bfa788d0038077a88678ff16104a8b82038b3da data/create/advancements/recipes/building_blocks/small_asurine_bricks_from_stone_types_asurine_stonecutting.json +a51ca3151c517113338720edeac0e02a46ebb03a data/create/advancements/recipes/building_blocks/small_andesite_bricks_from_stone_types_andesite_stonecutting.json 3dccee988c08e1988886d9f09f2b5b42332ac083 data/create/advancements/recipes/building_blocks/small_asurine_brick_slab.json 438469fb06dff95a0ab9e0cb183795432d9b78dd data/create/advancements/recipes/building_blocks/small_asurine_brick_slab_from_stone_types_asurine_stonecutting.json 3eb65706d975e6f1e429f43d7384272a58872f10 data/create/advancements/recipes/building_blocks/small_asurine_brick_slab_recycling.json @@ -3126,7 +2801,7 @@ fb8cab1a3ecef97eaf7d744bb0d1d09d46859b60 data/create/advancements/recipes/buildi 525fff52f5dea3178356b7c5f7606d2a369b346e data/create/advancements/recipes/building_blocks/small_asurine_brick_stairs_from_stone_types_asurine_stonecutting.json 39df7ef2b88df45ba4a06bfa9cd7f863f813cb30 data/create/advancements/recipes/building_blocks/small_asurine_brick_wall.json 21aa9dc72b12eb0a33cdc9904ee595de802b55f4 data/create/advancements/recipes/building_blocks/small_asurine_brick_wall_from_stone_types_asurine_stonecutting.json -46666ef8d341971cdd989f14575973777a85cdc6 data/create/advancements/recipes/building_blocks/small_calcite_bricks_from_stone_types_calcite_stonecutting.json +0bfa788d0038077a88678ff16104a8b82038b3da data/create/advancements/recipes/building_blocks/small_asurine_bricks_from_stone_types_asurine_stonecutting.json d61fce64a295a2c3b9433bc27ac50f4f1f6a678d data/create/advancements/recipes/building_blocks/small_calcite_brick_slab.json 7f2e73d01b9bff473c4ecf76ab967b3aa934ff87 data/create/advancements/recipes/building_blocks/small_calcite_brick_slab_from_stone_types_calcite_stonecutting.json 1095487af055116acc2eba87d92dd0918385e9ac data/create/advancements/recipes/building_blocks/small_calcite_brick_slab_recycling.json @@ -3134,7 +2809,7 @@ d61fce64a295a2c3b9433bc27ac50f4f1f6a678d data/create/advancements/recipes/buildi e3bd0900dc92b26fe69c7f4e81db76678505222b data/create/advancements/recipes/building_blocks/small_calcite_brick_stairs_from_stone_types_calcite_stonecutting.json c88fb3af07c32aa127cbe0043075f50fed869839 data/create/advancements/recipes/building_blocks/small_calcite_brick_wall.json ea58b78e177134c73ed5bfb081761f90cc7caa3e data/create/advancements/recipes/building_blocks/small_calcite_brick_wall_from_stone_types_calcite_stonecutting.json -c48216f26cfe93ce99f7f2f0e9f68d1ee2a95e46 data/create/advancements/recipes/building_blocks/small_crimsite_bricks_from_stone_types_crimsite_stonecutting.json +46666ef8d341971cdd989f14575973777a85cdc6 data/create/advancements/recipes/building_blocks/small_calcite_bricks_from_stone_types_calcite_stonecutting.json ed4d6e7779749dd647f744f0486e78b93057aa33 data/create/advancements/recipes/building_blocks/small_crimsite_brick_slab.json 7f3ad6d79eb9d433d5a0e295eb2b099a5f815876 data/create/advancements/recipes/building_blocks/small_crimsite_brick_slab_from_stone_types_crimsite_stonecutting.json b980fcc4b29f9ff897dd867222fc4248d76e808a data/create/advancements/recipes/building_blocks/small_crimsite_brick_slab_recycling.json @@ -3142,7 +2817,7 @@ b980fcc4b29f9ff897dd867222fc4248d76e808a data/create/advancements/recipes/buildi c06600eda4e4bd7c46e4e315a0569fbdfa4bb087 data/create/advancements/recipes/building_blocks/small_crimsite_brick_stairs_from_stone_types_crimsite_stonecutting.json 4021a4a761b06def09f19d6a60bc0722e69ec08d data/create/advancements/recipes/building_blocks/small_crimsite_brick_wall.json 2d8eae517a914e93538307efe23d532582d487e2 data/create/advancements/recipes/building_blocks/small_crimsite_brick_wall_from_stone_types_crimsite_stonecutting.json -ed82f0fac452147faa997af1d45278f501ef165b data/create/advancements/recipes/building_blocks/small_deepslate_bricks_from_stone_types_deepslate_stonecutting.json +c48216f26cfe93ce99f7f2f0e9f68d1ee2a95e46 data/create/advancements/recipes/building_blocks/small_crimsite_bricks_from_stone_types_crimsite_stonecutting.json e4674821cc17adadecacc55d48c028847caf5fea data/create/advancements/recipes/building_blocks/small_deepslate_brick_slab.json 8c0c51d052b110fec3668618be2bdeaf8d0c7cc5 data/create/advancements/recipes/building_blocks/small_deepslate_brick_slab_from_stone_types_deepslate_stonecutting.json f8f7ace802b6c73fabfabbaae1c1383a3c0bcf6b data/create/advancements/recipes/building_blocks/small_deepslate_brick_slab_recycling.json @@ -3150,7 +2825,7 @@ e2e16c3c0e761ef44f9b21ae3bd95300a33459be data/create/advancements/recipes/buildi 37ef4192f1db7dd5c066a47480f86f60687c9894 data/create/advancements/recipes/building_blocks/small_deepslate_brick_stairs_from_stone_types_deepslate_stonecutting.json 6f4d365ce26fb4081a5af0f6e21631209b5b106d data/create/advancements/recipes/building_blocks/small_deepslate_brick_wall.json e0c7377c55dc94b8efd62cb6f57325c94206cbf4 data/create/advancements/recipes/building_blocks/small_deepslate_brick_wall_from_stone_types_deepslate_stonecutting.json -9bb23924495112ba177d12ba2a5adcb872a2b76f data/create/advancements/recipes/building_blocks/small_diorite_bricks_from_stone_types_diorite_stonecutting.json +ed82f0fac452147faa997af1d45278f501ef165b data/create/advancements/recipes/building_blocks/small_deepslate_bricks_from_stone_types_deepslate_stonecutting.json d4b96bcd8902e9bce19603abb99cb7edeb260189 data/create/advancements/recipes/building_blocks/small_diorite_brick_slab.json 2ed3800996491c9a1db23d9cbed04cc5ee963df6 data/create/advancements/recipes/building_blocks/small_diorite_brick_slab_from_stone_types_diorite_stonecutting.json 895d2158ba0783c5fd97b802ef5866d7532df6ba data/create/advancements/recipes/building_blocks/small_diorite_brick_slab_recycling.json @@ -3158,7 +2833,7 @@ d4b96bcd8902e9bce19603abb99cb7edeb260189 data/create/advancements/recipes/buildi 0f4b92965c05ddf71fa24b2b08a0cce358ac8dd1 data/create/advancements/recipes/building_blocks/small_diorite_brick_stairs_from_stone_types_diorite_stonecutting.json 633d921515fb4ad0e3177f3c8f151da80008053b data/create/advancements/recipes/building_blocks/small_diorite_brick_wall.json 3dea60492331bcd3253d90534559cc0bdb0822ae data/create/advancements/recipes/building_blocks/small_diorite_brick_wall_from_stone_types_diorite_stonecutting.json -632ced3760d55b56d1620e447b8b762e0e4a29f3 data/create/advancements/recipes/building_blocks/small_dripstone_bricks_from_stone_types_dripstone_stonecutting.json +9bb23924495112ba177d12ba2a5adcb872a2b76f data/create/advancements/recipes/building_blocks/small_diorite_bricks_from_stone_types_diorite_stonecutting.json 92bb21a400d9720a2f06882049d5b3863a93969d data/create/advancements/recipes/building_blocks/small_dripstone_brick_slab.json 02e2b98eeef9cdc20a8678beec4c7aa8a6cde948 data/create/advancements/recipes/building_blocks/small_dripstone_brick_slab_from_stone_types_dripstone_stonecutting.json 35830242bc48b1355830d6cb17dc4dc547d51bc0 data/create/advancements/recipes/building_blocks/small_dripstone_brick_slab_recycling.json @@ -3166,7 +2841,7 @@ d4b96bcd8902e9bce19603abb99cb7edeb260189 data/create/advancements/recipes/buildi 92523f3058a580743f95e9347fa97e0f5f6483f6 data/create/advancements/recipes/building_blocks/small_dripstone_brick_stairs_from_stone_types_dripstone_stonecutting.json 6e26ab4ad96225b7dd1a4aa06295b0d85e87400b data/create/advancements/recipes/building_blocks/small_dripstone_brick_wall.json e30a5f31d6478dfe7693077727b1abfc40b33f9b data/create/advancements/recipes/building_blocks/small_dripstone_brick_wall_from_stone_types_dripstone_stonecutting.json -1805b7f9db21b4530b173ab6945584e7d852b218 data/create/advancements/recipes/building_blocks/small_granite_bricks_from_stone_types_granite_stonecutting.json +632ced3760d55b56d1620e447b8b762e0e4a29f3 data/create/advancements/recipes/building_blocks/small_dripstone_bricks_from_stone_types_dripstone_stonecutting.json a2929bbd4c81b9601aeca74110936343102b7b5a data/create/advancements/recipes/building_blocks/small_granite_brick_slab.json 0fa83c337d5612e2b8368d5bff34117e0c1cf40a data/create/advancements/recipes/building_blocks/small_granite_brick_slab_from_stone_types_granite_stonecutting.json 0bc47cb22cc70a34879092a57c87551e6fa9f634 data/create/advancements/recipes/building_blocks/small_granite_brick_slab_recycling.json @@ -3174,7 +2849,7 @@ a2929bbd4c81b9601aeca74110936343102b7b5a data/create/advancements/recipes/buildi 44f3e71a4e8b78db74a21a42c3cebfbc15fe0180 data/create/advancements/recipes/building_blocks/small_granite_brick_stairs_from_stone_types_granite_stonecutting.json 3a6edafcb559e767caf421cf1bd6e064940f33e2 data/create/advancements/recipes/building_blocks/small_granite_brick_wall.json cac9914c729c0ecf5e9e1b4fe6498005e7c532f3 data/create/advancements/recipes/building_blocks/small_granite_brick_wall_from_stone_types_granite_stonecutting.json -1ca86b11356749caf7515fc61b8ac5de53d019f6 data/create/advancements/recipes/building_blocks/small_limestone_bricks_from_stone_types_limestone_stonecutting.json +1805b7f9db21b4530b173ab6945584e7d852b218 data/create/advancements/recipes/building_blocks/small_granite_bricks_from_stone_types_granite_stonecutting.json 4f3cc93f422ee9f05587b89d6729a6cc86f572c0 data/create/advancements/recipes/building_blocks/small_limestone_brick_slab.json 02d0c45cd014fd660a9d3eb1c1c6b40ba806b2fb data/create/advancements/recipes/building_blocks/small_limestone_brick_slab_from_stone_types_limestone_stonecutting.json 8fb46bce94f6cca943e4ae427c04d9617ada277d data/create/advancements/recipes/building_blocks/small_limestone_brick_slab_recycling.json @@ -3182,7 +2857,7 @@ cac9914c729c0ecf5e9e1b4fe6498005e7c532f3 data/create/advancements/recipes/buildi 00b61a4d23f8b16a7e4d9bf46fbe52c6b5dd561c data/create/advancements/recipes/building_blocks/small_limestone_brick_stairs_from_stone_types_limestone_stonecutting.json 7c6b80f174687efe10007c0235f2a68db7062b12 data/create/advancements/recipes/building_blocks/small_limestone_brick_wall.json 7f9ade635dcda8d5baae2bbdddc018bcc715f681 data/create/advancements/recipes/building_blocks/small_limestone_brick_wall_from_stone_types_limestone_stonecutting.json -bab018a0adcbc0582ba756158941a87923b20384 data/create/advancements/recipes/building_blocks/small_ochrum_bricks_from_stone_types_ochrum_stonecutting.json +1ca86b11356749caf7515fc61b8ac5de53d019f6 data/create/advancements/recipes/building_blocks/small_limestone_bricks_from_stone_types_limestone_stonecutting.json 9c98b7b56f92f6adc75473f5b0ae4dc69ac8aa9a data/create/advancements/recipes/building_blocks/small_ochrum_brick_slab.json 611fb57772f1446236256f1235751dec6f81cd0e data/create/advancements/recipes/building_blocks/small_ochrum_brick_slab_from_stone_types_ochrum_stonecutting.json 243821a2c3e465f5346ad58e0afda624c09ab946 data/create/advancements/recipes/building_blocks/small_ochrum_brick_slab_recycling.json @@ -3190,8 +2865,8 @@ b9a16792e6158a2923454c9a44d9c176c9607c24 data/create/advancements/recipes/buildi bb91a8ba1ef1c8cb725f18a4d577bb476b9ae68d data/create/advancements/recipes/building_blocks/small_ochrum_brick_stairs_from_stone_types_ochrum_stonecutting.json 5cf5574da0b29895960fa7f0fd63d3f81814f7b3 data/create/advancements/recipes/building_blocks/small_ochrum_brick_wall.json 1b5d14c921a85a3a5cdb9f845d4f0ddf98f87347 data/create/advancements/recipes/building_blocks/small_ochrum_brick_wall_from_stone_types_ochrum_stonecutting.json +bab018a0adcbc0582ba756158941a87923b20384 data/create/advancements/recipes/building_blocks/small_ochrum_bricks_from_stone_types_ochrum_stonecutting.json 8d6ccacf1af917094b1688ed70dc75bf54611e93 data/create/advancements/recipes/building_blocks/small_rose_quartz_tiles_from_polished_rose_quartz_stonecutting.json -7d679c66588f8a717619a7f89861d57ec04f04a1 data/create/advancements/recipes/building_blocks/small_scorchia_bricks_from_stone_types_scorchia_stonecutting.json 2003f1248faaeb4fe6761febda8e29d087f99dc7 data/create/advancements/recipes/building_blocks/small_scorchia_brick_slab.json ff5c50697aefe21c1570230a13255c912744b629 data/create/advancements/recipes/building_blocks/small_scorchia_brick_slab_from_stone_types_scorchia_stonecutting.json 8d1fd41b03940add231fa207d3ddaa1f78cf2b85 data/create/advancements/recipes/building_blocks/small_scorchia_brick_slab_recycling.json @@ -3199,7 +2874,7 @@ ff5c50697aefe21c1570230a13255c912744b629 data/create/advancements/recipes/buildi 8586f387cc9bb74250369373348005f6aa686af2 data/create/advancements/recipes/building_blocks/small_scorchia_brick_stairs_from_stone_types_scorchia_stonecutting.json 94552be031c17f5ef9d97cf5fe33beb15141291f data/create/advancements/recipes/building_blocks/small_scorchia_brick_wall.json 86e866f92095b03b5d77a91425e5e2ef307f4852 data/create/advancements/recipes/building_blocks/small_scorchia_brick_wall_from_stone_types_scorchia_stonecutting.json -e542cd94f84a90530332608b1040e2e6189a51fe data/create/advancements/recipes/building_blocks/small_scoria_bricks_from_stone_types_scoria_stonecutting.json +7d679c66588f8a717619a7f89861d57ec04f04a1 data/create/advancements/recipes/building_blocks/small_scorchia_bricks_from_stone_types_scorchia_stonecutting.json ad4c35afd6c3d55b356e38289c64e8cf6d194d10 data/create/advancements/recipes/building_blocks/small_scoria_brick_slab.json 2f1acca02bb5a40bf174ceeb5272ba1243b8635c data/create/advancements/recipes/building_blocks/small_scoria_brick_slab_from_stone_types_scoria_stonecutting.json dba264e073eab7b2fb1494cb117574b6a6b83919 data/create/advancements/recipes/building_blocks/small_scoria_brick_slab_recycling.json @@ -3207,7 +2882,7 @@ dba264e073eab7b2fb1494cb117574b6a6b83919 data/create/advancements/recipes/buildi 0e64e1dc80a0b84e05260191951ed930a8e578f6 data/create/advancements/recipes/building_blocks/small_scoria_brick_stairs_from_stone_types_scoria_stonecutting.json 95b866fac218affb9aac93272f5436e30dd4678c data/create/advancements/recipes/building_blocks/small_scoria_brick_wall.json 23493359766c969d2fa64575c5af047e6a924373 data/create/advancements/recipes/building_blocks/small_scoria_brick_wall_from_stone_types_scoria_stonecutting.json -b7fc4fbd0d6ce28946b5cbef40d86de3ca37f695 data/create/advancements/recipes/building_blocks/small_tuff_bricks_from_stone_types_tuff_stonecutting.json +e542cd94f84a90530332608b1040e2e6189a51fe data/create/advancements/recipes/building_blocks/small_scoria_bricks_from_stone_types_scoria_stonecutting.json 03acb1becaa3c7f6fc0ced99e6afcf4ac0ec4cb2 data/create/advancements/recipes/building_blocks/small_tuff_brick_slab.json 599693bc47bfd65cc9e3babc0a2f33c0d2bbfd31 data/create/advancements/recipes/building_blocks/small_tuff_brick_slab_from_stone_types_tuff_stonecutting.json aae2cb75ee4b9312e79dfea519c35f5e20ed4da6 data/create/advancements/recipes/building_blocks/small_tuff_brick_slab_recycling.json @@ -3215,7 +2890,7 @@ c72364e32b82f45f17491dd41967373c35d8dfb5 data/create/advancements/recipes/buildi 369763433d6af43d94392e870b3d861f739ba0f9 data/create/advancements/recipes/building_blocks/small_tuff_brick_stairs_from_stone_types_tuff_stonecutting.json 506bbae420bff66d492214c49dabf52e5cbcf6e4 data/create/advancements/recipes/building_blocks/small_tuff_brick_wall.json 6db7e4b981ec28c776988a531c03dbe28fb0a1c2 data/create/advancements/recipes/building_blocks/small_tuff_brick_wall_from_stone_types_tuff_stonecutting.json -9fd6e20a4555b591b17ef225316782de333780fa data/create/advancements/recipes/building_blocks/small_veridium_bricks_from_stone_types_veridium_stonecutting.json +b7fc4fbd0d6ce28946b5cbef40d86de3ca37f695 data/create/advancements/recipes/building_blocks/small_tuff_bricks_from_stone_types_tuff_stonecutting.json b61a773f683c415617a408fa0781e7e7d61cb1af data/create/advancements/recipes/building_blocks/small_veridium_brick_slab.json 526a5323263292bd091c03231a156e18460c34a1 data/create/advancements/recipes/building_blocks/small_veridium_brick_slab_from_stone_types_veridium_stonecutting.json ef040b7189b17cce9dd69c47af61c7abca6f43cd data/create/advancements/recipes/building_blocks/small_veridium_brick_slab_recycling.json @@ -3223,6 +2898,7 @@ ef040b7189b17cce9dd69c47af61c7abca6f43cd data/create/advancements/recipes/buildi 6a12b73815434a544881680cb071f273a75f62a5 data/create/advancements/recipes/building_blocks/small_veridium_brick_stairs_from_stone_types_veridium_stonecutting.json e6dfacd8f2f57d4df42927783750254f7163251a data/create/advancements/recipes/building_blocks/small_veridium_brick_wall.json ee4012cc014539be113ace8f80e51c85d2daead9 data/create/advancements/recipes/building_blocks/small_veridium_brick_wall_from_stone_types_veridium_stonecutting.json +9fd6e20a4555b591b17ef225316782de333780fa data/create/advancements/recipes/building_blocks/small_veridium_bricks_from_stone_types_veridium_stonecutting.json 03a87030672d40b0b2b6ad085103c9a5cef067ce data/create/advancements/recipes/building_blocks/spruce_window.json dfea65f25ebcbe0caf2694dec3d3ea616e2e9291 data/create/advancements/recipes/building_blocks/spruce_window_pane.json 763b3b49296a284f41cbccdc7f1ffb13c89d42db data/create/advancements/recipes/building_blocks/tiled_glass_from_glass_colorless_stonecutting.json @@ -3243,21 +2919,15 @@ a9e35aaf621cdb2648f4b9e9beacc91092e8d3b3 data/create/advancements/recipes/buildi 7eeaf1b7cf0a788d4b9a61274cf4752ba1fe57cb data/create/advancements/recipes/building_blocks/weathered_copper_tile_slab_from_weathered_copper_tiles_stonecutting.json 86e0a3eb797ecdfd1626ce84f26e25c503a68587 data/create/advancements/recipes/building_blocks/weathered_copper_tile_stairs.json f093326ca1f341bede9f7cbefecadf7d73d3f9d7 data/create/advancements/recipes/building_blocks/weathered_copper_tile_stairs_from_weathered_copper_tiles_stonecutting.json -c1b0ce558aad75210d8b95c982dbe063982fe567 data/create/advancements/recipes/building_blocks/weathered_iron_block_from_ingots_iron_stonecutting.json -587dd224181b7008f65ebf3b198bb23475cdec47 data/create/advancements/recipes/building_blocks/weathered_iron_window.json -0847f40c57682514297b0dbf520fd88728507bd1 data/create/advancements/recipes/building_blocks/weathered_iron_window_pane.json 39c93330e07e58d79db13d132d7f1a8f33670e9b data/create/advancements/recipes/decorations/andesite_bars_from_andesite_alloy_stonecutting.json 769926b9bb00dea3bf0534c8d828873b13def961 data/create/advancements/recipes/decorations/andesite_ladder_from_andesite_alloy_stonecutting.json 266700212dece6cba8c338a1e0a8507bb41f92e6 data/create/advancements/recipes/decorations/andesite_scaffolding_from_andesite_alloy_stonecutting.json -f6513fa4fdf26848b2f9ce9bd015377a2583c439 data/create/advancements/recipes/decorations/andesite_table_cloth_from_andesite_alloy_stonecutting.json 07ad89608ed200f4c8051a398f5da9d29769c39f data/create/advancements/recipes/decorations/brass_bars_from_ingots_brass_stonecutting.json d11ca4dc890089326eede1bd5b7a32a97cc91886 data/create/advancements/recipes/decorations/brass_ladder_from_ingots_brass_stonecutting.json cbeb1685b639f0b0b2a637374ff548251c0a932e data/create/advancements/recipes/decorations/brass_scaffolding_from_ingots_brass_stonecutting.json -b3c785f2f494ab60bbe295eafecf9292379a5ff2 data/create/advancements/recipes/decorations/brass_table_cloth_from_ingots_brass_stonecutting.json 2ed97c748d8fe0c9fd060b53a4095a37a10ce67f data/create/advancements/recipes/decorations/copper_bars_from_ingots_copper_stonecutting.json e55c465683e664a0205b62d2e132afeb89ee4dce data/create/advancements/recipes/decorations/copper_ladder_from_ingots_copper_stonecutting.json d3a0524f9fce7293f8c3adbd757c5d5afe74af27 data/create/advancements/recipes/decorations/copper_scaffolding_from_ingots_copper_stonecutting.json -1762dee3f3c416d8867d90e3ce9b68c3c5fe650f data/create/advancements/recipes/decorations/copper_table_cloth_from_ingots_copper_stonecutting.json 34ae39bca445f80d431b3e329de3c1bf847a8eef data/create/advancements/recipes/misc/crafting/kinetics/black_valve_handle_from_other_valve_handle.json e222002ee051e7b72b3658655bb53b5adb825272 data/create/advancements/recipes/misc/crafting/kinetics/blue_valve_handle_from_other_valve_handle.json 472c9e1d515f5f34d97efc334cefe3eb62d860e4 data/create/advancements/recipes/misc/crafting/kinetics/brown_valve_handle_from_other_valve_handle.json @@ -3274,25 +2944,6 @@ c96b1b147139c9d560e9d1e1dd9a726ebb771329 data/create/advancements/recipes/misc/c 004b31d1be78dbc4be60f4fd0879065f1a685518 data/create/advancements/recipes/misc/crafting/kinetics/red_valve_handle_from_other_valve_handle.json cf2920d4d27c40fe71dd8954225e7f2a38ba2a4f data/create/advancements/recipes/misc/crafting/kinetics/white_valve_handle_from_other_valve_handle.json 54bf51dcbdd86635e68d366cb4130f65b9c0fe4a data/create/advancements/recipes/misc/crafting/kinetics/yellow_valve_handle_from_other_valve_handle.json -b60b14d473fc8a841be668e98303f07779916637 data/create/advancements/recipes/misc/crafting/logistics/andesite_table_cloth_clear.json -5e50ee44a3316eb23bbd8f0164c17d5719ab707c data/create/advancements/recipes/misc/crafting/logistics/black_table_cloth_clear.json -b6ce89f748f35694cf2fd4c79693b3a8f3dba864 data/create/advancements/recipes/misc/crafting/logistics/blue_table_cloth_clear.json -2aeabffefd6e7a963e61288b632961783ce9ab69 data/create/advancements/recipes/misc/crafting/logistics/brass_table_cloth_clear.json -a8a4ef79d02e1903464fff524bcbb63b424681ea data/create/advancements/recipes/misc/crafting/logistics/brown_table_cloth_clear.json -a613cb47dd2a7cf5cf2f7b6bd8031f59e6bc554a data/create/advancements/recipes/misc/crafting/logistics/copper_table_cloth_clear.json -e44912e563d11cb42bf45ab668e81c66845725d1 data/create/advancements/recipes/misc/crafting/logistics/cyan_table_cloth_clear.json -13b4e81dcaa87e9862180f10b239de43bf1d1dc8 data/create/advancements/recipes/misc/crafting/logistics/gray_table_cloth_clear.json -df90265b1aba8f4c49564dce7e04609cf65ddba5 data/create/advancements/recipes/misc/crafting/logistics/green_table_cloth_clear.json -05c7735e280b2be640084fecc3724c41544805fd data/create/advancements/recipes/misc/crafting/logistics/light_blue_table_cloth_clear.json -5ee045df398bb091467f5b18df7d8b322ed43c23 data/create/advancements/recipes/misc/crafting/logistics/light_gray_table_cloth_clear.json -ad99b5d2213c5a9d00f4719e4aaaca4215e8191b data/create/advancements/recipes/misc/crafting/logistics/lime_table_cloth_clear.json -97ca5d009fb727f770d3c3d74756eeb571f084b7 data/create/advancements/recipes/misc/crafting/logistics/magenta_table_cloth_clear.json -33cbf02d26d008cd7b261d729aed1e5fcce0cb6e data/create/advancements/recipes/misc/crafting/logistics/orange_table_cloth_clear.json -e23d1bf1143d08074df53d9a07ea0c5304f63271 data/create/advancements/recipes/misc/crafting/logistics/pink_table_cloth_clear.json -b9be0a58a604965048084487294b4c1b9ce0f745 data/create/advancements/recipes/misc/crafting/logistics/purple_table_cloth_clear.json -0d8c16e085d8f869237fdfb428d29ece096a3291 data/create/advancements/recipes/misc/crafting/logistics/red_table_cloth_clear.json -c1768fde21268bb1b035c63b5e9fba81526de83c data/create/advancements/recipes/misc/crafting/logistics/white_table_cloth_clear.json -ccb8f3871eb044360b597ff02ea78896050c3760 data/create/advancements/recipes/misc/crafting/logistics/yellow_table_cloth_clear.json 706a4da01ddbd9c3db4d3183ffdcd602a558a5cd data/create/loot_tables/blocks/acacia_window.json a7b37cec417ec9f9095e2ae11c990e4906d6af0e data/create/loot_tables/blocks/acacia_window_pane.json 5eee4b2702e432e03b1f46c6f1573ceee67b131f data/create/loot_tables/blocks/adjustable_chain_gearshift.json @@ -3309,32 +2960,24 @@ ac6b9e99a900f203f69c5127cc44c0de48b0d946 data/create/loot_tables/blocks/andesite 1d9b959e0a6b965fef70136c2988e37c94f58b9e data/create/loot_tables/blocks/andesite_ladder.json 93e40b5e41c32af364a4636989a72ef7901e6bd6 data/create/loot_tables/blocks/andesite_pillar.json 191c341be37299e8ab0d692eb3a185188157ebdf data/create/loot_tables/blocks/andesite_scaffolding.json -d3a343785cc9e9ac0e9d2309ef4203121c9ab385 data/create/loot_tables/blocks/andesite_table_cloth.json 1c6f1dd9ec49b7db86e43706e940208b51e0f6d5 data/create/loot_tables/blocks/andesite_tunnel.json d408536459078c1d72770b7431137d7d8d8ff3bb data/create/loot_tables/blocks/asurine.json 3129cb3d97d657bf16ea5973b3bde1e31ff054c7 data/create/loot_tables/blocks/asurine_pillar.json -858038cff810f9b47e37e5c80064370573d73255 data/create/loot_tables/blocks/bamboo_window.json -76843e927185385fbdfe403577eb4a85a60e25bd data/create/loot_tables/blocks/bamboo_window_pane.json 8ac6f7a29c32e636b0639ac2caaa60882617f675 data/create/loot_tables/blocks/basin.json d964b7a8f6a4ce28ce640d31a01e77eafcc181e5 data/create/loot_tables/blocks/belt.json a268eb02c10015a901a6543595b2b815a8026d78 data/create/loot_tables/blocks/birch_window.json 43d16eae230de501c528f4e9af666f72a081ed29 data/create/loot_tables/blocks/birch_window_pane.json 4aec2374e76dfa5535fe22b1fc02b4b2d453217d data/create/loot_tables/blocks/black_nixie_tube.json -6ed685605e24af5c6ff5d797dde8492069427b76 data/create/loot_tables/blocks/black_postbox.json 7ce6dd2c0d02eb1b56ec441044dfc608ea6bcb41 data/create/loot_tables/blocks/black_sail.json 2449b8c173fbbc2a96e0b8d1996d72fb60527e64 data/create/loot_tables/blocks/black_seat.json -2ac4a51540f596ddb81f9fa1b72bcc02c3a6b1fd data/create/loot_tables/blocks/black_table_cloth.json 2d33e25b2741f634bbd6cd77b31c17dd94511d94 data/create/loot_tables/blocks/black_toolbox.json f911ac185cd48afa2393d24f28a688936a9fa147 data/create/loot_tables/blocks/black_valve_handle.json eee41c02c8cfcdb56f31e74fc266783b785bea9d data/create/loot_tables/blocks/blaze_burner.json 247d12823eed3b9248003aca8e3ead87972ac61e data/create/loot_tables/blocks/blue_nixie_tube.json -76217732c9bddf77b7de735b4380d9f92adca9b3 data/create/loot_tables/blocks/blue_postbox.json bb9d906a97810ed1461ed321ef8e4bee1dd104fb data/create/loot_tables/blocks/blue_sail.json 833fe6bc3020055dd0d6f46b324cbe27b248708d data/create/loot_tables/blocks/blue_seat.json -2b7aa6506e02be7a7b76228bc16bf05d0920195e data/create/loot_tables/blocks/blue_table_cloth.json 9d22716d9d846dc9587e327dfcdf18dd5955f826 data/create/loot_tables/blocks/blue_toolbox.json 6d7ecb10e21b1e12c83c71736f14cbba3ccd7aaf data/create/loot_tables/blocks/blue_valve_handle.json -53e01f63aa47aa00575240ccdf867b4d6c392385 data/create/loot_tables/blocks/bound_cardboard_block.json 7d8b199f381003e5a74a8144976b65c93a09dbcb data/create/loot_tables/blocks/brass_bars.json 64a5869c6b3edeca06771f8ef64ef9521d83302a data/create/loot_tables/blocks/brass_belt_funnel.json 78ecee2c9baf6b0c78f6c7aa692e102a3f4dda74 data/create/loot_tables/blocks/brass_block.json @@ -3346,21 +2989,14 @@ e466a397f84957616f7e83954db2050355f052c9 data/create/loot_tables/blocks/brass_en 7b79b14f64108cd8a734f95dd8c721830b48ac82 data/create/loot_tables/blocks/brass_funnel.json 8d58d4c771843950a14fd7b800a05736c1fc88d9 data/create/loot_tables/blocks/brass_ladder.json 429d524c9848b44d19028126f0efd678e0c4b680 data/create/loot_tables/blocks/brass_scaffolding.json -ce1aa8d4b40ba0d0898c552811f1a6f7e94879a5 data/create/loot_tables/blocks/brass_table_cloth.json af90102bfe0e3a14bf1330cddec553f27b8fba89 data/create/loot_tables/blocks/brass_tunnel.json d391cff5b741fd6ddf5b6fa64e05526eb3a9f0d9 data/create/loot_tables/blocks/brown_nixie_tube.json -bfa0365507a888134c20b36af4bd7944263687f0 data/create/loot_tables/blocks/brown_postbox.json 862bd3ceed05ea45c03911bb8403817b73c4bc38 data/create/loot_tables/blocks/brown_sail.json 6ddbdd489120be56f50272c86ecdb886afa3a8e4 data/create/loot_tables/blocks/brown_seat.json -0aa66846a1b29feda9c63b9364860c4c75eaf2e4 data/create/loot_tables/blocks/brown_table_cloth.json 588ae3d0da73eed3bc30cb28c583e7f8312d15bd data/create/loot_tables/blocks/brown_toolbox.json 7c7cf4c30786f6e0a699e2b3f9120343e53107f4 data/create/loot_tables/blocks/brown_valve_handle.json 06d1c478e4236210aa12b5911691868fef33bb5f data/create/loot_tables/blocks/calcite_pillar.json -3d65461b1fc2667f446aefa2853621c06068bb38 data/create/loot_tables/blocks/cardboard_block.json 515c839deea520b07b03f7ba65c4a7b22fdf5ba3 data/create/loot_tables/blocks/cart_assembler.json -aadd8aa7f8433896bd4fea56f43e496cbc5be25a data/create/loot_tables/blocks/chain_conveyor.json -5c79f6384b77fc0d817a17f65f3cdfef34a7a039 data/create/loot_tables/blocks/cherry_window.json -d2e962b8cfc208d0c8af5f4b79311b9df14b1738 data/create/loot_tables/blocks/cherry_window_pane.json fb4877d45df15be1a74378ab28f23fbf9d0657ef data/create/loot_tables/blocks/chute.json ace9255cbdd1af5e5068916d2a6bed2f861f81f1 data/create/loot_tables/blocks/clipboard.json bfd871acdde6c239098ead188a5aad7636d11bc0 data/create/loot_tables/blocks/clockwork_bearing.json @@ -3376,13 +3012,12 @@ fa0856e11351ad0882de2066569807e782071881 data/create/loot_tables/blocks/copper_b 0937b9f634b86dbe41e07eda52c69993fce60fb5 data/create/loot_tables/blocks/copper_door.json 8ed70d812f38adfa147db07a4f2bbe206a69ad20 data/create/loot_tables/blocks/copper_ladder.json ac621731ca23e6fbb1003be59edacdf837dbc37e data/create/loot_tables/blocks/copper_scaffolding.json -9be387731859ccc3aec7701c1804ddc3c5dde216 data/create/loot_tables/blocks/copper_shingles.json be31f0c68bfe80dff88959bd30ef9a9080dd3b3b data/create/loot_tables/blocks/copper_shingle_slab.json 83ae2652a2df217730d6fb34a65c3962e82a961d data/create/loot_tables/blocks/copper_shingle_stairs.json -f6a29868a011d9ad73bc29be94ec2a07a2626323 data/create/loot_tables/blocks/copper_table_cloth.json -9cb359c96543d7421250c4ef4e83a5e170974efb data/create/loot_tables/blocks/copper_tiles.json +9be387731859ccc3aec7701c1804ddc3c5dde216 data/create/loot_tables/blocks/copper_shingles.json adbe83d6bf88dd7d2b0b8788bb619cedd37f59d9 data/create/loot_tables/blocks/copper_tile_slab.json 1e06f16b1fa8e78af5cbfc90ba8ff1136de83d2d data/create/loot_tables/blocks/copper_tile_stairs.json +9cb359c96543d7421250c4ef4e83a5e170974efb data/create/loot_tables/blocks/copper_tiles.json 4f75cad20e6b091d1f07cf3db98520d2dc3af5e7 data/create/loot_tables/blocks/copper_valve_handle.json 14a493a7bad6bd399b662da470b71810bd56e812 data/create/loot_tables/blocks/copycat_bars.json 3a2f3ab0834a0c5089ba0a11f5e9784ce59ef6d8 data/create/loot_tables/blocks/copycat_base.json @@ -3398,122 +3033,120 @@ d5d2f565bab2e2b81b0798fc7ce0e21acd362ce5 data/create/loot_tables/blocks/crimson_ b892718d33caf0c260b902c92f46f3bfd827af45 data/create/loot_tables/blocks/crushing_wheel.json ff7853a5d5c0f3bddbcfe07e47efd1ff04b14f0a data/create/loot_tables/blocks/cuckoo_clock.json 9083b026ee254645430434b67c2ba7a842f888bf data/create/loot_tables/blocks/cut_andesite.json -c1aa69f80ba11dd52fb3627fc32377599f5ff887 data/create/loot_tables/blocks/cut_andesite_bricks.json c74a4cac08ab1f66146466ff9fb40c8f210de63c data/create/loot_tables/blocks/cut_andesite_brick_slab.json df3f5dcbf676106800bc1113bb022658eb5e85d6 data/create/loot_tables/blocks/cut_andesite_brick_stairs.json 95c5a4a3327f522d986d7baaa747fce5ead8c032 data/create/loot_tables/blocks/cut_andesite_brick_wall.json +c1aa69f80ba11dd52fb3627fc32377599f5ff887 data/create/loot_tables/blocks/cut_andesite_bricks.json cb6cf8aefaac1e00596bd64a182a329dbba7e659 data/create/loot_tables/blocks/cut_andesite_slab.json 7106a637809dcbeb9d4a02a7ff9dc52f7fd9d7a2 data/create/loot_tables/blocks/cut_andesite_stairs.json e3cfa2ecb0b90ebe07cc98f8e47d22d2c0da67e5 data/create/loot_tables/blocks/cut_andesite_wall.json 75eacbc0656e7a83a20a054755ea7d7d78af983d data/create/loot_tables/blocks/cut_asurine.json -f780d37b956ed734cafcbe42b77f1a8ebfa33350 data/create/loot_tables/blocks/cut_asurine_bricks.json 43ad24bb9da878111f3606a17ef9b45bcc4964ae data/create/loot_tables/blocks/cut_asurine_brick_slab.json 8f4d0af32546b6cc77c68a08dc74494b8be1b7c3 data/create/loot_tables/blocks/cut_asurine_brick_stairs.json bb9ce58aa5b4e38c4d3b29aa8e0d905054023eae data/create/loot_tables/blocks/cut_asurine_brick_wall.json +f780d37b956ed734cafcbe42b77f1a8ebfa33350 data/create/loot_tables/blocks/cut_asurine_bricks.json 972ca04f91a1ce4d35995c14e1b17f773b15b61e data/create/loot_tables/blocks/cut_asurine_slab.json a55778dd8735286c3abc65046186b6b8dff0367e data/create/loot_tables/blocks/cut_asurine_stairs.json 70284c686f16d215ff1a8fb19bbe36fddbd31e18 data/create/loot_tables/blocks/cut_asurine_wall.json 0f450ecf60c5d201f332b2736c552d0b51b159b8 data/create/loot_tables/blocks/cut_calcite.json -aec526af372816f306826eefe4a6318db7964892 data/create/loot_tables/blocks/cut_calcite_bricks.json ec0d2854433ac4f58e53685c69dc19629fee16ca data/create/loot_tables/blocks/cut_calcite_brick_slab.json 584e39fa0b78ba8649f69b53f9f032dd1532d6ac data/create/loot_tables/blocks/cut_calcite_brick_stairs.json cc9cbdb7a50305e47181b2452bfce887f9879437 data/create/loot_tables/blocks/cut_calcite_brick_wall.json +aec526af372816f306826eefe4a6318db7964892 data/create/loot_tables/blocks/cut_calcite_bricks.json b4e5b6d5cb63b7b1a4fe639fd727a381bfd00588 data/create/loot_tables/blocks/cut_calcite_slab.json ca83b89401dba12341e6f26786103c10c90447ca data/create/loot_tables/blocks/cut_calcite_stairs.json 64df1c4a373c28bf9be3630935b01a43abd22e03 data/create/loot_tables/blocks/cut_calcite_wall.json 5df3a2229657d7b616790e922b1d1d558b4a5128 data/create/loot_tables/blocks/cut_crimsite.json -59cb609bc9671ac481832eeaf942533c6861fc0e data/create/loot_tables/blocks/cut_crimsite_bricks.json 6fee8d6425e1c832abed8fd9bccc8e6fae9441fc data/create/loot_tables/blocks/cut_crimsite_brick_slab.json 3123bc9e6123dfeda9bb3cece5c2220ac8485535 data/create/loot_tables/blocks/cut_crimsite_brick_stairs.json 56a8c7b1588f6fa9a1fb438e91b04673e02a0c86 data/create/loot_tables/blocks/cut_crimsite_brick_wall.json +59cb609bc9671ac481832eeaf942533c6861fc0e data/create/loot_tables/blocks/cut_crimsite_bricks.json 90ed82b09f2650ee913956d62803d15fc4c0bdbd data/create/loot_tables/blocks/cut_crimsite_slab.json 0e237e008523ed3e9934c598a708be533aaa0861 data/create/loot_tables/blocks/cut_crimsite_stairs.json 48e1edca75186f160a12fa26ac262c7f86d62c82 data/create/loot_tables/blocks/cut_crimsite_wall.json 7bfe4d183ed26de1d7b241c27880a70d28426502 data/create/loot_tables/blocks/cut_deepslate.json -6e375a42ddf38c99fee86531471573716e27fa44 data/create/loot_tables/blocks/cut_deepslate_bricks.json fa4b940ad8ee432ee0fabf496d2da3d5039c204a data/create/loot_tables/blocks/cut_deepslate_brick_slab.json 1063a94b3e90a52a7492d85b1c086514333f3421 data/create/loot_tables/blocks/cut_deepslate_brick_stairs.json 878d809a038c626e8054f9b71e27be08388d7615 data/create/loot_tables/blocks/cut_deepslate_brick_wall.json +6e375a42ddf38c99fee86531471573716e27fa44 data/create/loot_tables/blocks/cut_deepslate_bricks.json 7b5e46aaf34d71993f50b5b6fa1cd5d7ea64264c data/create/loot_tables/blocks/cut_deepslate_slab.json 7d45e8bb037a1e550132854200d57ce31e073993 data/create/loot_tables/blocks/cut_deepslate_stairs.json cd80fd4f573d59c22f0b9799f1ba7422215d4ff1 data/create/loot_tables/blocks/cut_deepslate_wall.json d79d52657307a30422d9ff2eb1caad78024c24f7 data/create/loot_tables/blocks/cut_diorite.json -9f627b6449ae27a1990b84a60349736129a11e39 data/create/loot_tables/blocks/cut_diorite_bricks.json 1809235166024fa74f65a96b622faa8eddf4ce14 data/create/loot_tables/blocks/cut_diorite_brick_slab.json a6bb9fb4eee3dab9a540b228801ce100c048c2a7 data/create/loot_tables/blocks/cut_diorite_brick_stairs.json 690a938a04543cb60f2952335be26b2df9c75715 data/create/loot_tables/blocks/cut_diorite_brick_wall.json +9f627b6449ae27a1990b84a60349736129a11e39 data/create/loot_tables/blocks/cut_diorite_bricks.json 208999222adb5b1cd4fa47b85000841dbae4ad21 data/create/loot_tables/blocks/cut_diorite_slab.json 12849a868e8dff48ebb688c84fc53d4cee2a4eaa data/create/loot_tables/blocks/cut_diorite_stairs.json 469fffcdd40aea22fedb81b7778cc3c61928f3fd data/create/loot_tables/blocks/cut_diorite_wall.json 302d0bb640f696109fe4edc0c1fa9db332231511 data/create/loot_tables/blocks/cut_dripstone.json -48707f37b94ff1a930ee45bb9e8b6b4b67226945 data/create/loot_tables/blocks/cut_dripstone_bricks.json eb31bc108180e2248d575d5d72325b5585254af0 data/create/loot_tables/blocks/cut_dripstone_brick_slab.json 9b624a456baf55960675d7857e159f69911a281a data/create/loot_tables/blocks/cut_dripstone_brick_stairs.json b4c754d4d5a6c28f537c2d73844e39059b2c1450 data/create/loot_tables/blocks/cut_dripstone_brick_wall.json +48707f37b94ff1a930ee45bb9e8b6b4b67226945 data/create/loot_tables/blocks/cut_dripstone_bricks.json eb9eca9a69f763cbe81dc79375ef76978594b51e data/create/loot_tables/blocks/cut_dripstone_slab.json 47fae3abc8bea3ee802d6759192e631f50329c5f data/create/loot_tables/blocks/cut_dripstone_stairs.json 70b71cc460cba2955694baf0550eadc2187e3a8a data/create/loot_tables/blocks/cut_dripstone_wall.json 26433a16a91414be15b20dc85b81b76d086be889 data/create/loot_tables/blocks/cut_granite.json -65c3936e78a90c53faa0b9f9b3034afc2728e7b9 data/create/loot_tables/blocks/cut_granite_bricks.json c6b8dfa87e9c33a0dd2b3398dcc524347e826d44 data/create/loot_tables/blocks/cut_granite_brick_slab.json 5e00417f06b4d357e7469f0efa6e319dfc587da3 data/create/loot_tables/blocks/cut_granite_brick_stairs.json 8d8779846af8121426f128cc7b5d501037bd1cd4 data/create/loot_tables/blocks/cut_granite_brick_wall.json +65c3936e78a90c53faa0b9f9b3034afc2728e7b9 data/create/loot_tables/blocks/cut_granite_bricks.json 6e7253b2801611b4698e786f495c2ade1088ee0b data/create/loot_tables/blocks/cut_granite_slab.json de8c10fb2c7409a3375f2db5cdce2027c3f419bd data/create/loot_tables/blocks/cut_granite_stairs.json cdf40bb46d9457a66129b300dc4d3f0160cc1de2 data/create/loot_tables/blocks/cut_granite_wall.json ac5f062c7fc270c63d67ccecf19499a9e91fa1c4 data/create/loot_tables/blocks/cut_limestone.json -b60fb652e1f83b1af12a15cb47450bd9a6087f6a data/create/loot_tables/blocks/cut_limestone_bricks.json 3b6d3a9b12cf1c2a20bf337cc0155bb66967f0ee data/create/loot_tables/blocks/cut_limestone_brick_slab.json 701249cc12b7aa6f5cc1691ac4dd17e665aa2180 data/create/loot_tables/blocks/cut_limestone_brick_stairs.json 3b8c5eef9b0e8c35e8573ce91f5fddbac7f76f24 data/create/loot_tables/blocks/cut_limestone_brick_wall.json +b60fb652e1f83b1af12a15cb47450bd9a6087f6a data/create/loot_tables/blocks/cut_limestone_bricks.json ba186786e8677f1c769e8f231fe872c48330e13a data/create/loot_tables/blocks/cut_limestone_slab.json d354966d57804afda39ff27336d8b0f38acf6ea3 data/create/loot_tables/blocks/cut_limestone_stairs.json 28b4eee2c6da259e50c58a51905fa2b79a9b89ef data/create/loot_tables/blocks/cut_limestone_wall.json b3d6d90dd0c3e9d4b47d1f87d5abc354dd8c1447 data/create/loot_tables/blocks/cut_ochrum.json -5856859aae0cc633cbd9d83ea7cf7910ce1a88de data/create/loot_tables/blocks/cut_ochrum_bricks.json 67cadc71d90fb2527b9b2b72a74463d71571e493 data/create/loot_tables/blocks/cut_ochrum_brick_slab.json 487b3e7dc1d9d07183b9b699e33f6371858435aa data/create/loot_tables/blocks/cut_ochrum_brick_stairs.json 289757860f07b63dcce531a74ce7e60b4669c51b data/create/loot_tables/blocks/cut_ochrum_brick_wall.json +5856859aae0cc633cbd9d83ea7cf7910ce1a88de data/create/loot_tables/blocks/cut_ochrum_bricks.json c9deec5e3c7343afa3d013704179e2147b2eb7ec data/create/loot_tables/blocks/cut_ochrum_slab.json e851d829db8ea4398bc1cbe6e743b4fba98d3413 data/create/loot_tables/blocks/cut_ochrum_stairs.json 5dce8524b70baeefaeba13422f5900b1a161a867 data/create/loot_tables/blocks/cut_ochrum_wall.json 293064edf2909db8c9edc26bedd1cc023c647664 data/create/loot_tables/blocks/cut_scorchia.json -767910313f0983ebfb49b80526747d762cbdf782 data/create/loot_tables/blocks/cut_scorchia_bricks.json 895c4b9cc71701a26ae0e765ee67f0c06cc70a9c data/create/loot_tables/blocks/cut_scorchia_brick_slab.json c53d72176cb5dd93977975dd84647391fa563e3a data/create/loot_tables/blocks/cut_scorchia_brick_stairs.json 460232ca38cba2f0adc5316d6db8db94db231953 data/create/loot_tables/blocks/cut_scorchia_brick_wall.json +767910313f0983ebfb49b80526747d762cbdf782 data/create/loot_tables/blocks/cut_scorchia_bricks.json c8201964d877a932fe9a9a2d0360004440f7c380 data/create/loot_tables/blocks/cut_scorchia_slab.json dfd09849dbf48a064269a5ea28d0422caa87e4d4 data/create/loot_tables/blocks/cut_scorchia_stairs.json bd5304e38bb92a445c159e9fe647b906e28b232e data/create/loot_tables/blocks/cut_scorchia_wall.json 6b87a22c39b545d5be92e476751b99ceb4bef740 data/create/loot_tables/blocks/cut_scoria.json -833252d2d63c7502f6f0d7981673a8081046c944 data/create/loot_tables/blocks/cut_scoria_bricks.json 659e86f89499539e435989c2eb29e88e9a0ff9f4 data/create/loot_tables/blocks/cut_scoria_brick_slab.json 8434d461090bc43328eec0b4249d27a9ba383707 data/create/loot_tables/blocks/cut_scoria_brick_stairs.json e3f853395b9b6fb7d5bb103c121a77e04526a9e8 data/create/loot_tables/blocks/cut_scoria_brick_wall.json +833252d2d63c7502f6f0d7981673a8081046c944 data/create/loot_tables/blocks/cut_scoria_bricks.json 8360d736887ae3dc22bcf522791ef981e380456c data/create/loot_tables/blocks/cut_scoria_slab.json c771f03308f45e1e87d92181f94cdfd4e61fa5d8 data/create/loot_tables/blocks/cut_scoria_stairs.json 6fecb7fa2774ea63ac0c66e9c3d0f41d6b8cdff7 data/create/loot_tables/blocks/cut_scoria_wall.json 396074ee7fd5a3ddbac9332c74b7bdc4164919e2 data/create/loot_tables/blocks/cut_tuff.json -81465ef7aa555d36adf249bbc9acfe80abbe308e data/create/loot_tables/blocks/cut_tuff_bricks.json 5148f230c773b83268d52650bdacc660025feb95 data/create/loot_tables/blocks/cut_tuff_brick_slab.json 19719a4a3f63d1ec46a9ca9736a825d2dcc880ff data/create/loot_tables/blocks/cut_tuff_brick_stairs.json e20991b67c07dca62c212b43da5b7e7e98146c0e data/create/loot_tables/blocks/cut_tuff_brick_wall.json +81465ef7aa555d36adf249bbc9acfe80abbe308e data/create/loot_tables/blocks/cut_tuff_bricks.json 6d16bd3860207ff6912afc2bf3f0454b572aabba data/create/loot_tables/blocks/cut_tuff_slab.json c14e52ac9901aa873c33d51988bd26465ce0e095 data/create/loot_tables/blocks/cut_tuff_stairs.json dd70800c79fa2ff56bd4ea032cf069bc27cc9076 data/create/loot_tables/blocks/cut_tuff_wall.json 1957b610d14460cc9ca797fe953bf9831509cdbf data/create/loot_tables/blocks/cut_veridium.json -673d1f0fefa7725ac5bfcabfcea577041adc4eeb data/create/loot_tables/blocks/cut_veridium_bricks.json c1515a908bde249c087be1e73aec37773bc3dc5c data/create/loot_tables/blocks/cut_veridium_brick_slab.json d9552e3e9f4de0e09df8ca9446066e94c6e2c681 data/create/loot_tables/blocks/cut_veridium_brick_stairs.json 584c4bd13d9870f9798155b47cc0d32e5751294d data/create/loot_tables/blocks/cut_veridium_brick_wall.json +673d1f0fefa7725ac5bfcabfcea577041adc4eeb data/create/loot_tables/blocks/cut_veridium_bricks.json 009186ed0efe29a229a28cfd913bc02ddad217d4 data/create/loot_tables/blocks/cut_veridium_slab.json 4845f7127921c7dd93a59118e63c37107d6c2061 data/create/loot_tables/blocks/cut_veridium_stairs.json b56caea031d637321eddfd5d122fc357d2c2e49c data/create/loot_tables/blocks/cut_veridium_wall.json ffb440a03f5e513b8d20c2725a95dc5c9b84c73b data/create/loot_tables/blocks/cyan_nixie_tube.json -914146303ae7e73c4f9283ea61cd5443f49f5cde data/create/loot_tables/blocks/cyan_postbox.json 8858b4e1b4e51889b2006005585a17e4978ed8e9 data/create/loot_tables/blocks/cyan_sail.json 8dccecb2c87d7421efdfb3fb97ae62b79f0b4411 data/create/loot_tables/blocks/cyan_seat.json -30bfeac6b7766ff1985ce9953f0dd6824f177aef data/create/loot_tables/blocks/cyan_table_cloth.json 66ea2f2cc32d49bb434f83cbd07736d6fbacacf3 data/create/loot_tables/blocks/cyan_toolbox.json 8c7fd26e7bd03916014274e005d69ab8f14df973 data/create/loot_tables/blocks/cyan_valve_handle.json 704a10ef59d052e92b7035406422231b9bb2372f data/create/loot_tables/blocks/dark_oak_window.json @@ -3522,7 +3155,6 @@ ccb3ab3c0d9c8fad236ccc790c2f7a1524202e9a data/create/loot_tables/blocks/dark_oak 3c3d83fc964462e2401ec6dac5200709d5ce1957 data/create/loot_tables/blocks/deepslate_zinc_ore.json 8c1d8d9680834419b9049bc11137316b75f59f46 data/create/loot_tables/blocks/deployer.json 9ded269b860ed96c964f6f8960a680a5c87fa033 data/create/loot_tables/blocks/depot.json -eec1b262b34fc05a95bbb3762cf96a050030d010 data/create/loot_tables/blocks/desk_bell.json 98987901bdb35efe2922b420def9cdb116ec5416 data/create/loot_tables/blocks/diorite_pillar.json 6dda1fa6622ce351af2e0aeec2b5c2e4183fb593 data/create/loot_tables/blocks/display_board.json 5320ddec6855d99e5685bb424d02165eca480805 data/create/loot_tables/blocks/display_link.json @@ -3533,13 +3165,12 @@ dfe0af3ff61ed2b3082e49c745d8a3e0c5973f4b data/create/loot_tables/blocks/encased_ a2e9a8a10b7fc730c1d7c8db3b529e7a37b683f5 data/create/loot_tables/blocks/encased_fan.json 7ede9f64839f51e6a2eb05b08577d2873f281401 data/create/loot_tables/blocks/encased_fluid_pipe.json 4869211639326efaabd1aba1067bfbb3ab012884 data/create/loot_tables/blocks/experience_block.json -9fa4b0c8ee313b6c9a57d7d5b687cdd01c8259d3 data/create/loot_tables/blocks/exposed_copper_shingles.json 9dbd37ef5ff549f10475101205c1a9d4a44140bc data/create/loot_tables/blocks/exposed_copper_shingle_slab.json d2c9abd9260eb82ea1c2eeae5e2d6abd0b4d3ce8 data/create/loot_tables/blocks/exposed_copper_shingle_stairs.json -f0905ae4c9bdff8fe9e1ab4682a7b1efe2d27d9d data/create/loot_tables/blocks/exposed_copper_tiles.json +9fa4b0c8ee313b6c9a57d7d5b687cdd01c8259d3 data/create/loot_tables/blocks/exposed_copper_shingles.json 6841c02935838f00011d33fc392965326c4dbc5b data/create/loot_tables/blocks/exposed_copper_tile_slab.json 432a047156b93a09b7e027fc34f5680a8f68dc92 data/create/loot_tables/blocks/exposed_copper_tile_stairs.json -4dd285b35d9b94d48f7aa783e93bdd04d58c4a26 data/create/loot_tables/blocks/factory_gauge.json +f0905ae4c9bdff8fe9e1ab4682a7b1efe2d27d9d data/create/loot_tables/blocks/exposed_copper_tiles.json 3fae2a7a3f133a1d7c76ce91f6c48eab787d6ff6 data/create/loot_tables/blocks/fake_track.json 1d4734d6d9ba039c0dfa2271f08cdb55e35b721f data/create/loot_tables/blocks/fluid_pipe.json 9c112883a3763b2d286d9a5a0980dcea82bcc9e6 data/create/loot_tables/blocks/fluid_tank.json @@ -3556,17 +3187,13 @@ a4c86e5456bbbcc417d736151ac6a15c944d555b data/create/loot_tables/blocks/gearshif ffa2776989447e44fa10673986961ab395ebd592 data/create/loot_tables/blocks/glass_fluid_pipe.json 07d8265c285ebb69b9160d516905ae1f17acc87d data/create/loot_tables/blocks/granite_pillar.json 41feb0f235495384ebca5b6f70d01b6f0c0c8878 data/create/loot_tables/blocks/gray_nixie_tube.json -6f123d5e6612274223ddb695e582abd952d3521c data/create/loot_tables/blocks/gray_postbox.json bd526fc4f0acea571c37b2ecbb7267fee6be29f0 data/create/loot_tables/blocks/gray_sail.json 5e23e2032f92737eaa6e6cfb4c62232566f06e77 data/create/loot_tables/blocks/gray_seat.json -d60c2dfc073632b8488e13190b15436173c9caa4 data/create/loot_tables/blocks/gray_table_cloth.json 6ff8b3e59ea98697b87e71eb64d1e6f7e4631f36 data/create/loot_tables/blocks/gray_toolbox.json aa0d47422e0adc3fb18e5c0eefd25c417ddbf9ae data/create/loot_tables/blocks/gray_valve_handle.json 4cfbe1bdc89916f78f891b9dbaed461cd838584b data/create/loot_tables/blocks/green_nixie_tube.json -e99e3895a19faa928e40fa17fbfbda6d3566b1ed data/create/loot_tables/blocks/green_postbox.json 6c22cf8de05828af7979dc32d9e151297d551fe5 data/create/loot_tables/blocks/green_sail.json fbd61c331d4fda692f0e7174aed5aed3652d3553 data/create/loot_tables/blocks/green_seat.json -b918c78d0c8dabd9a6962e4c441096a12f4f47d1 data/create/loot_tables/blocks/green_table_cloth.json 703a285a5d47fcc13e6775040d45620db2ef5480 data/create/loot_tables/blocks/green_toolbox.json 17cbfa7c5627a2ac92826e349d09509f4722fdef data/create/loot_tables/blocks/green_valve_handle.json 8dfbcb358f008317a0515ca35f3976470ca7c4e9 data/create/loot_tables/blocks/hand_crank.json @@ -3575,10 +3202,7 @@ f917ddc34b196750efbab88ee5565ecd0e38e0e6 data/create/loot_tables/blocks/haunted_ a206598562bcbc9e3bc10dbe12fb22974ee58fcc data/create/loot_tables/blocks/horizontal_framed_glass_pane.json e65fae1b9b72cf2208696463fa20a82a4d64fb62 data/create/loot_tables/blocks/hose_pulley.json 34c239150baa92e03ca89430148560e1b7a1f02d data/create/loot_tables/blocks/industrial_iron_block.json -9c831bbcae1bf3dbddce1126a1279f4f22902a25 data/create/loot_tables/blocks/industrial_iron_window.json -de30f216e9326c27103702ea296c460d927aa3ef data/create/loot_tables/blocks/industrial_iron_window_pane.json c22dea1941471be65c811cdc2ce7b77d2247e9e1 data/create/loot_tables/blocks/item_drain.json -528078b0cf042236d2cb0701fb55f41f54aa932b data/create/loot_tables/blocks/item_hatch.json 72b5a7288f7f54694df5f456e4ab4433bd38dfff data/create/loot_tables/blocks/item_vault.json 13bd1033991eb65354a9b9406fe638c357fea409 data/create/loot_tables/blocks/jungle_window.json fe9c2629eb30393d2ae5a1f252b9732506ef9bef data/create/loot_tables/blocks/jungle_window_pane.json @@ -3601,35 +3225,27 @@ b4882fe056a8d03bddf7a8c4fa70ee06548e1743 data/create/loot_tables/blocks/layered_ 7f9ea6bfcf8344018866013e12d23edf21f034e9 data/create/loot_tables/blocks/layered_veridium.json 54a876a52655d5c9c33325a7d07c7978d33adca6 data/create/loot_tables/blocks/lectern_controller.json 8a6153a0b5857c77cdac0cffcb22e30ae6181f3a data/create/loot_tables/blocks/light_blue_nixie_tube.json -27bbda185ab99cff4974e6bfc40b72265896ef42 data/create/loot_tables/blocks/light_blue_postbox.json 304072298d4078eca7e0fb8c58ea3144afe246a8 data/create/loot_tables/blocks/light_blue_sail.json a1396be526ef27c6d0f97cdd0f0e61f810e7353b data/create/loot_tables/blocks/light_blue_seat.json -b281c6ff8b383f27bba02e11819ddab13c80a473 data/create/loot_tables/blocks/light_blue_table_cloth.json 0cd56baf9f3c9edb97e4ce892d374e21a099374f data/create/loot_tables/blocks/light_blue_toolbox.json bf4e6c308d82f15689406b5b3e88fe95d49a9a44 data/create/loot_tables/blocks/light_blue_valve_handle.json 6928acbfcafdfead9750be6760da163b86532054 data/create/loot_tables/blocks/light_gray_nixie_tube.json -eb95d1e0abb93d5efecb0809e3901f37021c4dfc data/create/loot_tables/blocks/light_gray_postbox.json 886ef98e4bd60d8860b56441da6928e24f262d70 data/create/loot_tables/blocks/light_gray_sail.json 1ae0ff25ac9468e67ab1847b87a37829328d4c84 data/create/loot_tables/blocks/light_gray_seat.json -e61e9b3e116037c4ad44a7e222e5127e5767ddad data/create/loot_tables/blocks/light_gray_table_cloth.json e22dfadefcea50090efe87136a4b92e6ef20d379 data/create/loot_tables/blocks/light_gray_toolbox.json 3e586bc1281f15e25e75475dd726578ff032c6ae data/create/loot_tables/blocks/light_gray_valve_handle.json -c6bb0877c537dda15469934383dc45c608bfd1a4 data/create/loot_tables/blocks/limestone.json -49058a62e1abd34917f983b6bc13cc4353b613a2 data/create/loot_tables/blocks/limestone_pillar.json 582bb26f6df37d0c2dbe12983ad05fc74f5fb5c0 data/create/loot_tables/blocks/lime_nixie_tube.json -ec9d973d218b26d51b82f265603feab31170c619 data/create/loot_tables/blocks/lime_postbox.json 623ac65211a9920325308b55285f78e3b7275751 data/create/loot_tables/blocks/lime_sail.json 7efe69664a781b292f491d5ff89e27dd5991f3cf data/create/loot_tables/blocks/lime_seat.json -10ecd65ecba6b66652dd04a385fc47a44c1f8110 data/create/loot_tables/blocks/lime_table_cloth.json 0f6a465501a445925e9aff7a4c84b3c8e2caa93e data/create/loot_tables/blocks/lime_toolbox.json 1a3ed7cd5660d7ea014956ea642e0b07d89bc297 data/create/loot_tables/blocks/lime_valve_handle.json +c6bb0877c537dda15469934383dc45c608bfd1a4 data/create/loot_tables/blocks/limestone.json +49058a62e1abd34917f983b6bc13cc4353b613a2 data/create/loot_tables/blocks/limestone_pillar.json baf70f9eb579f20b232a2af4e6b00a54f84844e6 data/create/loot_tables/blocks/linear_chassis.json e4c0f8ca822cf7555bd011825b430c3c735160d4 data/create/loot_tables/blocks/lit_blaze_burner.json 6bd8b044cc9c69a5268372e5436f556da2c1bf21 data/create/loot_tables/blocks/magenta_nixie_tube.json -601bc43286b9f6b978ae8681281bf8e195f8211d data/create/loot_tables/blocks/magenta_postbox.json b4d06c9ce7fbec0f23bb6dbc446b77d070f06775 data/create/loot_tables/blocks/magenta_sail.json 300e480d8e43e3a4ca19a92ae1360c02f7c5accd data/create/loot_tables/blocks/magenta_seat.json -64bbc8f91a7b60d86c76e237cb87863f7f7539c9 data/create/loot_tables/blocks/magenta_table_cloth.json 40d2ba0a52eaa2c61900731f0cee2657c5e77c20 data/create/loot_tables/blocks/magenta_toolbox.json 347115d1507997a6f838d222092092ab994db7e5 data/create/loot_tables/blocks/magenta_valve_handle.json 49c68e263386549cc30438d3b3878ec5bbd909cc data/create/loot_tables/blocks/mangrove_window.json @@ -3660,28 +3276,22 @@ fe79cb4cbea87efc84d61d3d31f073bf3c64c73d data/create/loot_tables/blocks/netherit 5dcb11160a51ce17fb06f5fecc14e87d92b1a641 data/create/loot_tables/blocks/oak_window_pane.json 461e9818f41aab34905757a423455cdcee780e67 data/create/loot_tables/blocks/ochrum.json 1259a439286385d5b7c48bff89d0839f1f2e02c2 data/create/loot_tables/blocks/ochrum_pillar.json -3f6940f13ca705bad7cdb9a9b80a3ae84f70f80c data/create/loot_tables/blocks/orange_postbox.json d6323d4b30faa87cd4b5b8b815cb16f78296f203 data/create/loot_tables/blocks/orange_sail.json 119fc4c3055c09c7958ac405925a6b7be2081c6b data/create/loot_tables/blocks/orange_seat.json -24b82ccacdc00d98a660c20384c76927cd8c2948 data/create/loot_tables/blocks/orange_table_cloth.json 54ac8c8166c23f24a8a0870c981ef8ffa64c0b89 data/create/loot_tables/blocks/orange_toolbox.json 30aef2df782b6b35cd16b4c205bb15de85bc0664 data/create/loot_tables/blocks/orange_valve_handle.json f4004c6d16754fc8867ed6618dace8e8f6dcc412 data/create/loot_tables/blocks/ornate_iron_window.json 6f14500e07c6d342804f9127e7b66047ffaeef1e data/create/loot_tables/blocks/ornate_iron_window_pane.json -3e54d3c4755a43d837a1d9b2005ea1dee4d02555 data/create/loot_tables/blocks/oxidized_copper_shingles.json 62c43a533e4ffeeec9f7657db5a796569087f806 data/create/loot_tables/blocks/oxidized_copper_shingle_slab.json f47a01824093455030fca66e7b8a39bcfc61d219 data/create/loot_tables/blocks/oxidized_copper_shingle_stairs.json -4d2a2863697664b3b71f02aa703c3504cd5cc826 data/create/loot_tables/blocks/oxidized_copper_tiles.json +3e54d3c4755a43d837a1d9b2005ea1dee4d02555 data/create/loot_tables/blocks/oxidized_copper_shingles.json 4d815b361af81bd0c0e14c853ca54ad3cde66a57 data/create/loot_tables/blocks/oxidized_copper_tile_slab.json d599ef03d1b69e4367ec0dea78f52c1964c99f9b data/create/loot_tables/blocks/oxidized_copper_tile_stairs.json -ab8cee7abd7dd92428bf7d8f0f5edd35082401a4 data/create/loot_tables/blocks/packager.json -54aa9700df601640b705d912abe773d5b6ee2b1f data/create/loot_tables/blocks/package_frogport.json +4d2a2863697664b3b71f02aa703c3504cd5cc826 data/create/loot_tables/blocks/oxidized_copper_tiles.json 58bd9fe9d6706998bfbda3b077cfd0a740972091 data/create/loot_tables/blocks/peculiar_bell.json 4d7724df6fefee4512c4f7886d0e103d1dc39510 data/create/loot_tables/blocks/pink_nixie_tube.json -df7b12349c64d035eb563535b03cb70d780c5a71 data/create/loot_tables/blocks/pink_postbox.json 85811771fbc36f645fdb9f510639715399503c99 data/create/loot_tables/blocks/pink_sail.json 9a5652002131d14c585a6e434a4457ef36d2f60d data/create/loot_tables/blocks/pink_seat.json -23e3176e0511b3910b9dcefa1821af9c9acfa34b data/create/loot_tables/blocks/pink_table_cloth.json 23e28971460b2a3b8b39412a4778672d7ced4af7 data/create/loot_tables/blocks/pink_toolbox.json e234842b7d2334b77d02e383908795f0714b21a2 data/create/loot_tables/blocks/pink_valve_handle.json 175735e4a055945df59fb6206ef1a6ebf8ca3e8f data/create/loot_tables/blocks/piston_extension_pole.json @@ -3750,29 +3360,22 @@ afe84b9468fba532acc447236a9a0cbdd02c4560 data/create/loot_tables/blocks/powered_ fbc433a7e8518860bc828a52b56dba92e4dff66c data/create/loot_tables/blocks/pulley_magnet.json e654e6cedc0373e97caea947e7e605bc4095da88 data/create/loot_tables/blocks/pulse_extender.json 422385f062dd63edaf246c42fb0e617e92e6cc44 data/create/loot_tables/blocks/pulse_repeater.json -93f0c41aedaa2b9baceda78b93a4b3198962e3f9 data/create/loot_tables/blocks/pulse_timer.json 6f453ea136098a5872aeb4e2ad1e5b78d2fd571f data/create/loot_tables/blocks/purple_nixie_tube.json -53e964048baa1b98877a559e8fda6c8f367d5cd6 data/create/loot_tables/blocks/purple_postbox.json c6b7a02db55cf0824a48156adf469c478dfd6a8d data/create/loot_tables/blocks/purple_sail.json 73cd7cc36fafb491666d2bccf1b4f24624b3c8f2 data/create/loot_tables/blocks/purple_seat.json -b4746e296f4bf63778e40a751b4c7fa8be45d21d data/create/loot_tables/blocks/purple_table_cloth.json 147086b9db173aed1b25d9460d0135708dcebcf9 data/create/loot_tables/blocks/purple_toolbox.json 0354f88c3e1d0b6580b9a23d23752dcd9b86fc31 data/create/loot_tables/blocks/purple_valve_handle.json 9e5e841d9f9a00d560ed17a7e197dc56bae334b7 data/create/loot_tables/blocks/radial_chassis.json 73a03fa31e299cec2c8a3dc0f31a8aa354b49bcd data/create/loot_tables/blocks/railway_casing.json f76e5a157d2aeab5708f464b1f3c8e47b3855f18 data/create/loot_tables/blocks/raw_zinc_block.json -bbc2d61eeea335f8f011d799ef6a5484ca027640 data/create/loot_tables/blocks/redstone_contact.json -4fa70deeac7e56121e42fb602dfa27ee1727f749 data/create/loot_tables/blocks/redstone_link.json -efc3a5595e4daf67fa43f84c9869dfc76fd6fca4 data/create/loot_tables/blocks/redstone_requester.json a50e1c28af16e9f1b4f48aa974461167139768a7 data/create/loot_tables/blocks/red_nixie_tube.json -f36f1e69e4fb8723238f81aadbac892f54b5ac62 data/create/loot_tables/blocks/red_postbox.json 977d724cddf8eba053a3310ad0d30af15199bbed data/create/loot_tables/blocks/red_sail.json 9aedede893e2127a1cdd17695699397d8d5c6ce5 data/create/loot_tables/blocks/red_seat.json -09796bc3be977e17927d0a9e32bff2982618e844 data/create/loot_tables/blocks/red_table_cloth.json 9713071cab536e8c1550a6309dc4563fecc2c4e0 data/create/loot_tables/blocks/red_toolbox.json 17d75711f4ef5d76aa931175364642732fb0c60d data/create/loot_tables/blocks/red_valve_handle.json +bbc2d61eeea335f8f011d799ef6a5484ca027640 data/create/loot_tables/blocks/redstone_contact.json +4fa70deeac7e56121e42fb602dfa27ee1727f749 data/create/loot_tables/blocks/redstone_link.json 632067fe6309e31e78637eb0272209b630750242 data/create/loot_tables/blocks/refined_radiance_casing.json -ee2c4d66d1264ec613e9e84fcac814d2f5806258 data/create/loot_tables/blocks/repackager.json 354a3b6c73379b7100b0dd12b3f3b008830c4d2d data/create/loot_tables/blocks/rope.json f74fdd78961619d712891c36e0a0778c25e145dc data/create/loot_tables/blocks/rope_pulley.json 77d2da2217689608095866de4af4b41104348354 data/create/loot_tables/blocks/rose_quartz_block.json @@ -3780,8 +3383,8 @@ f74fdd78961619d712891c36e0a0778c25e145dc data/create/loot_tables/blocks/rope_pul a0575567d5679f2c54e5a25c6ec12338f8cdc939 data/create/loot_tables/blocks/rose_quartz_tiles.json de74765a3bbffafb87d632857dfcfa83f863f814 data/create/loot_tables/blocks/rotation_speed_controller.json 2af8df3e36ace336c43d68f4e53564640a89845f data/create/loot_tables/blocks/sail_frame.json -d499fd59d30da8b907b0f3a0f428700f066eddff data/create/loot_tables/blocks/schematicannon.json 5a54e930243919991d71a1c3296002ff86dd88e1 data/create/loot_tables/blocks/schematic_table.json +d499fd59d30da8b907b0f3a0f428700f066eddff data/create/loot_tables/blocks/schematicannon.json 1d9b0df1330f44681bbd56f8560a30ef9e2175ff data/create/loot_tables/blocks/scorchia.json e39f189bfaebd31aedceb11e25720f1e08eb238d data/create/loot_tables/blocks/scorchia_pillar.json 5e3a37dbb2fcc0d6be042bfd063fd8b1414d6169 data/create/loot_tables/blocks/scoria.json @@ -3790,64 +3393,64 @@ d39afcaedc84d582c0c1f21ec5945cd0a67d389d data/create/loot_tables/blocks/secondar e33a34b47e07cf3262c0dbdbc651b31b9492b18f data/create/loot_tables/blocks/sequenced_gearshift.json 7d61387106e5e7fcc4aa0b05b9560cd5f4ef7df8 data/create/loot_tables/blocks/shadow_steel_casing.json 7e67d04f861e0a680487e27f94022a7850652dfe data/create/loot_tables/blocks/shaft.json -e88ff4ab1341c2db8338de0708b0ca8f40f15a8b data/create/loot_tables/blocks/small_andesite_bricks.json 220febcbcc4a993d475b683ebef7468ebdb7bf26 data/create/loot_tables/blocks/small_andesite_brick_slab.json b4764c5bb538359bcc2a599ff3b7474ade2115ed data/create/loot_tables/blocks/small_andesite_brick_stairs.json a891496ffb91bef56c3b684cb55a57e27a72154a data/create/loot_tables/blocks/small_andesite_brick_wall.json -576d8f6beca755a4082f1c8941e2590c1d18107b data/create/loot_tables/blocks/small_asurine_bricks.json +e88ff4ab1341c2db8338de0708b0ca8f40f15a8b data/create/loot_tables/blocks/small_andesite_bricks.json 1a5d3543ebb7c0064ba8ff01160a22a0f5f29f36 data/create/loot_tables/blocks/small_asurine_brick_slab.json 64f4b44b786eda91d432f20c8b725b0415440b56 data/create/loot_tables/blocks/small_asurine_brick_stairs.json 60a1d505e955047cf933ae55efc2e7c10d0a5a79 data/create/loot_tables/blocks/small_asurine_brick_wall.json +576d8f6beca755a4082f1c8941e2590c1d18107b data/create/loot_tables/blocks/small_asurine_bricks.json 64bcfece2507b8510633ae20c00ab989232664ff data/create/loot_tables/blocks/small_bogey.json -c03bba06f66262c0ced5e85fa7dcbfbfc8c9db71 data/create/loot_tables/blocks/small_calcite_bricks.json b673542c79f4a82f2e80c0931354e994292811f6 data/create/loot_tables/blocks/small_calcite_brick_slab.json e10d286286bba8e172a56e0eeb9af18d06d1a76d data/create/loot_tables/blocks/small_calcite_brick_stairs.json d7214e942b203823fa2fece883e8406a7721369f data/create/loot_tables/blocks/small_calcite_brick_wall.json -f49d32973b0be51229f4e3fdc13958c9852c5c8a data/create/loot_tables/blocks/small_crimsite_bricks.json +c03bba06f66262c0ced5e85fa7dcbfbfc8c9db71 data/create/loot_tables/blocks/small_calcite_bricks.json ef8b0f604b627715542e8216ae5448e88995cc13 data/create/loot_tables/blocks/small_crimsite_brick_slab.json dbec9246ab957a3ed2dbd0707df12c1496258e05 data/create/loot_tables/blocks/small_crimsite_brick_stairs.json d4d5bd8b101655205c4f293f23e83f610e179e91 data/create/loot_tables/blocks/small_crimsite_brick_wall.json -8caba3e7001dd8df4d3e6365b97849570c74c840 data/create/loot_tables/blocks/small_deepslate_bricks.json +f49d32973b0be51229f4e3fdc13958c9852c5c8a data/create/loot_tables/blocks/small_crimsite_bricks.json 44567c10c28ddd221198824766d3fec289fb29d4 data/create/loot_tables/blocks/small_deepslate_brick_slab.json fc141f5cdb1001d344b5ef8fa3ad1fdfeb01d048 data/create/loot_tables/blocks/small_deepslate_brick_stairs.json 3cf68d27362e9bb5dc3255ccf810097fbee511ba data/create/loot_tables/blocks/small_deepslate_brick_wall.json -4f22a84f105c2fabfd08ff0782ec30bbdc59f940 data/create/loot_tables/blocks/small_diorite_bricks.json +8caba3e7001dd8df4d3e6365b97849570c74c840 data/create/loot_tables/blocks/small_deepslate_bricks.json f6565f4bd11b7e95008b0f8fc3f5f2c7af1b77f8 data/create/loot_tables/blocks/small_diorite_brick_slab.json e3cbe41b4b2c38d0d5e625e34b61fc79db16d3bd data/create/loot_tables/blocks/small_diorite_brick_stairs.json 787dfaa16dc30155c90cc360f6927fa067a30ed8 data/create/loot_tables/blocks/small_diorite_brick_wall.json -d9cc7f58c791e040df4abfce225524e01eb01d49 data/create/loot_tables/blocks/small_dripstone_bricks.json +4f22a84f105c2fabfd08ff0782ec30bbdc59f940 data/create/loot_tables/blocks/small_diorite_bricks.json f72338c9252528e41f60cb183cb4ee07cea47bf0 data/create/loot_tables/blocks/small_dripstone_brick_slab.json bedf0fba68e8a8ce4205a968429ebe9c3ddfb528 data/create/loot_tables/blocks/small_dripstone_brick_stairs.json c1168f58f342dfa332bfa7f53f5f03383c55ccf2 data/create/loot_tables/blocks/small_dripstone_brick_wall.json -8437e7e28e45c10562d182c4c07189bcc108cabb data/create/loot_tables/blocks/small_granite_bricks.json +d9cc7f58c791e040df4abfce225524e01eb01d49 data/create/loot_tables/blocks/small_dripstone_bricks.json 4d111f8580ac97cf1b49b667462f7141846f3d3a data/create/loot_tables/blocks/small_granite_brick_slab.json c16e015251126614960d3e6300cb04d3aeaf49b4 data/create/loot_tables/blocks/small_granite_brick_stairs.json e0ff780ddeb5d5c8d2b6cd7736ac05f4556de52c data/create/loot_tables/blocks/small_granite_brick_wall.json -c60def11fbac5010bf749960e084dd5cd0dc4b07 data/create/loot_tables/blocks/small_limestone_bricks.json +8437e7e28e45c10562d182c4c07189bcc108cabb data/create/loot_tables/blocks/small_granite_bricks.json 5222ac5255c9a9ada0ce1da0fd4f4acbeee8ddb7 data/create/loot_tables/blocks/small_limestone_brick_slab.json 97310b6b1cbea869ebaa52861542787c49cee017 data/create/loot_tables/blocks/small_limestone_brick_stairs.json 0855921034db43692baa9fd0bcb767154f96d591 data/create/loot_tables/blocks/small_limestone_brick_wall.json -eb6b2171a6c99a3a28089752f26ddc6ac1f941d1 data/create/loot_tables/blocks/small_ochrum_bricks.json +c60def11fbac5010bf749960e084dd5cd0dc4b07 data/create/loot_tables/blocks/small_limestone_bricks.json 8ced0c24db685dbf4382b7b71124005edde9e0b2 data/create/loot_tables/blocks/small_ochrum_brick_slab.json 090e7154fb2c3dfd20d37aa87f3df4572a27c615 data/create/loot_tables/blocks/small_ochrum_brick_stairs.json 60f2d9970ad8caf8ffe3aa8083dbba671b8d4b8b data/create/loot_tables/blocks/small_ochrum_brick_wall.json +eb6b2171a6c99a3a28089752f26ddc6ac1f941d1 data/create/loot_tables/blocks/small_ochrum_bricks.json a001d069c2b4d15c6dfd0312749765fc4e89571e data/create/loot_tables/blocks/small_rose_quartz_tiles.json -ce71e670948453691d4f09c8110b952afb41afa1 data/create/loot_tables/blocks/small_scorchia_bricks.json d521cf885c737da2e4717d43072840ffd3f4c5d9 data/create/loot_tables/blocks/small_scorchia_brick_slab.json de6b5d583e1adf4d49147e0719616dfd0165726d data/create/loot_tables/blocks/small_scorchia_brick_stairs.json 895603c6920338ffafd8d0d1310e47ac20bdbfda data/create/loot_tables/blocks/small_scorchia_brick_wall.json -8b7e61477c4fdc834d669bda9197b585d60f26a2 data/create/loot_tables/blocks/small_scoria_bricks.json +ce71e670948453691d4f09c8110b952afb41afa1 data/create/loot_tables/blocks/small_scorchia_bricks.json d1954c07a66f40123d8d78602795efad7c92070f data/create/loot_tables/blocks/small_scoria_brick_slab.json 291b5a560f09ed8f09ccc949a1a4da0006f139c7 data/create/loot_tables/blocks/small_scoria_brick_stairs.json ed572e947f78d637e6e1a4166c111121087c41c3 data/create/loot_tables/blocks/small_scoria_brick_wall.json -2c7097ee677f42452212b5dce8959065d2bb0e15 data/create/loot_tables/blocks/small_tuff_bricks.json +8b7e61477c4fdc834d669bda9197b585d60f26a2 data/create/loot_tables/blocks/small_scoria_bricks.json ad8a3571dc3ae0ee1ec7be7f35c9796e544f0682 data/create/loot_tables/blocks/small_tuff_brick_slab.json 17f4a98a81e5920b75c88133d15b63d431f3fb64 data/create/loot_tables/blocks/small_tuff_brick_stairs.json 7defad704f6278e329af634acfb9efd617b2003e data/create/loot_tables/blocks/small_tuff_brick_wall.json -e499c0a8a0f804003612f3a4c9286cb4b033fe4b data/create/loot_tables/blocks/small_veridium_bricks.json +2c7097ee677f42452212b5dce8959065d2bb0e15 data/create/loot_tables/blocks/small_tuff_bricks.json c7771827a715b9eaacd1a7b7e863e274b1dee11f data/create/loot_tables/blocks/small_veridium_brick_slab.json 818b65dd5d868527e7df7658a4f62a93f2795186 data/create/loot_tables/blocks/small_veridium_brick_stairs.json 7733e53a90f2ba9c17cdedaa8720e70df1a8d2de data/create/loot_tables/blocks/small_veridium_brick_wall.json +e499c0a8a0f804003612f3a4c9286cb4b033fe4b data/create/loot_tables/blocks/small_veridium_bricks.json a121d21b81e93c119b6ee32ca21d260d9c33cb2a data/create/loot_tables/blocks/smart_chute.json 4556eb2d607db3631d0a9524d22a50686ce4a5a8 data/create/loot_tables/blocks/smart_fluid_pipe.json 9601e8ba0eb098cc409557f17b01669d8b971461 data/create/loot_tables/blocks/speedometer.json @@ -3860,8 +3463,6 @@ cae1bd9100b62841e260880faa80e2442f44a141 data/create/loot_tables/blocks/steam_wh 0bc3fdde351129e3a261a2420aff9d3f063c235e data/create/loot_tables/blocks/sticker.json 074f526902cb5fcff2129614428aba1ea05a6649 data/create/loot_tables/blocks/sticky_mechanical_piston.json a7332324e63f7d28621ddfbd54eb3d091461d890 data/create/loot_tables/blocks/stockpile_switch.json -af312881ec9bfb0902438f53c5cac020244bdba2 data/create/loot_tables/blocks/stock_link.json -f4fa9bb255348dc79dcc0468b3beb9ad075eb036 data/create/loot_tables/blocks/stock_ticker.json b13496b1b4bc0be30605832e23894fb374dd796e data/create/loot_tables/blocks/stressometer.json 6a7df4d2730d57ae6e404b4bc8e01367e5ddbf07 data/create/loot_tables/blocks/tiled_glass.json 0ad584e41780dc0183af1fa1e49e126730dfdbab data/create/loot_tables/blocks/tiled_glass_pane.json @@ -3881,54 +3482,47 @@ cfc82d2aa8248caeaa17ff0a60db02607046550d data/create/loot_tables/blocks/warped_w 2eeddb89cfc597bc1ce0736b9f4a6f98e0dfa4d2 data/create/loot_tables/blocks/warped_window_pane.json ccab211722d7f06913a549851b0d6e8278edc845 data/create/loot_tables/blocks/water_wheel.json ea5dfcedc928e8dfa1c59cf3917d1577dff87494 data/create/loot_tables/blocks/water_wheel_structure.json -bbc6fc068adccea464909b87f1d1f426324d74cc data/create/loot_tables/blocks/waxed_copper_shingles.json cb31be1e75ca822454bd0a89954f74c4c8726b33 data/create/loot_tables/blocks/waxed_copper_shingle_slab.json c8e440e42141788d1988c57ab91cb1bfcd977407 data/create/loot_tables/blocks/waxed_copper_shingle_stairs.json -a3b8f12d983077477963fd3fc893c5acd36ad552 data/create/loot_tables/blocks/waxed_copper_tiles.json +bbc6fc068adccea464909b87f1d1f426324d74cc data/create/loot_tables/blocks/waxed_copper_shingles.json 807da1d66d6c7d07efc8973de43415fa4b5ddfdc data/create/loot_tables/blocks/waxed_copper_tile_slab.json 92759871a9c84815b98b6dcd22fcf0dd958bc8ab data/create/loot_tables/blocks/waxed_copper_tile_stairs.json -eb9781d081d52c34c041004c774b52169b4a9ca0 data/create/loot_tables/blocks/waxed_exposed_copper_shingles.json +a3b8f12d983077477963fd3fc893c5acd36ad552 data/create/loot_tables/blocks/waxed_copper_tiles.json be5aabc98f4d70028f2b49ae1eaf0bc68a693c53 data/create/loot_tables/blocks/waxed_exposed_copper_shingle_slab.json a99143d290addb98427be53d7fea1cbc702d630c data/create/loot_tables/blocks/waxed_exposed_copper_shingle_stairs.json -e79c0636852b37a463dc122d66cdec27d3aa10c4 data/create/loot_tables/blocks/waxed_exposed_copper_tiles.json +eb9781d081d52c34c041004c774b52169b4a9ca0 data/create/loot_tables/blocks/waxed_exposed_copper_shingles.json 234cbb59a0e00d82c5508c8e9a61e328c22c1c56 data/create/loot_tables/blocks/waxed_exposed_copper_tile_slab.json de628114eb25f393efc4c0934d79c5bdc4365f75 data/create/loot_tables/blocks/waxed_exposed_copper_tile_stairs.json -60fe0594baab9599956d990ba893f8915835db81 data/create/loot_tables/blocks/waxed_oxidized_copper_shingles.json +e79c0636852b37a463dc122d66cdec27d3aa10c4 data/create/loot_tables/blocks/waxed_exposed_copper_tiles.json c8935df7d4634dee2b01c8a0ac5de12397f4d9ed data/create/loot_tables/blocks/waxed_oxidized_copper_shingle_slab.json 2b9370b7fa362ea88f916dd53747da80e4ae3357 data/create/loot_tables/blocks/waxed_oxidized_copper_shingle_stairs.json -f0721c371b08214337f3f4fce3a3705840310bdb data/create/loot_tables/blocks/waxed_oxidized_copper_tiles.json +60fe0594baab9599956d990ba893f8915835db81 data/create/loot_tables/blocks/waxed_oxidized_copper_shingles.json de4d25cac546559173f740752625c82dfd6bae09 data/create/loot_tables/blocks/waxed_oxidized_copper_tile_slab.json 2ed72fc0ea28303f5c6d1039662f55c677cb7bcb data/create/loot_tables/blocks/waxed_oxidized_copper_tile_stairs.json -f309ffd94dfb3591efd2fab337a871a0ceff1084 data/create/loot_tables/blocks/waxed_weathered_copper_shingles.json +f0721c371b08214337f3f4fce3a3705840310bdb data/create/loot_tables/blocks/waxed_oxidized_copper_tiles.json 9a7b265a963e122d510de64012ed1d98ad9017f9 data/create/loot_tables/blocks/waxed_weathered_copper_shingle_slab.json 62f25a1bc013e9c3d487d9a53407e58d89907c5b data/create/loot_tables/blocks/waxed_weathered_copper_shingle_stairs.json -26e6a96f50e7f3384f896bf8a5c3d5ff2b422526 data/create/loot_tables/blocks/waxed_weathered_copper_tiles.json +f309ffd94dfb3591efd2fab337a871a0ceff1084 data/create/loot_tables/blocks/waxed_weathered_copper_shingles.json 3fa20e33ced4aee01775db57629b9580a6b8e200 data/create/loot_tables/blocks/waxed_weathered_copper_tile_slab.json 59b28bd57f461482a394dbce9ea10ee25fc7c294 data/create/loot_tables/blocks/waxed_weathered_copper_tile_stairs.json -3cd15ae684bc0e4e41f02b3ee79eafdbf052620c data/create/loot_tables/blocks/weathered_copper_shingles.json +26e6a96f50e7f3384f896bf8a5c3d5ff2b422526 data/create/loot_tables/blocks/waxed_weathered_copper_tiles.json 278a56aa433ba3647107b3bf0553da5a5f6d40dd data/create/loot_tables/blocks/weathered_copper_shingle_slab.json 198babfd55c3a30c6ac61e81d5e01b0cf8fca80a data/create/loot_tables/blocks/weathered_copper_shingle_stairs.json -771d98a6627d707228719e843bc80636b02dc985 data/create/loot_tables/blocks/weathered_copper_tiles.json +3cd15ae684bc0e4e41f02b3ee79eafdbf052620c data/create/loot_tables/blocks/weathered_copper_shingles.json d6862dc9f7d291df618fbce71eebf613711a5517 data/create/loot_tables/blocks/weathered_copper_tile_slab.json 57d5065d53016e4b1ef0fbad9b84605b1546bcc4 data/create/loot_tables/blocks/weathered_copper_tile_stairs.json -013deea9b687ce96e5042de13ab0cba9dadce364 data/create/loot_tables/blocks/weathered_iron_block.json -f0c51ad0a713aab00dff913361b8e5e8448b912a data/create/loot_tables/blocks/weathered_iron_window.json -1d3ea471ec3f2bbf10c7a11f040f8bbf0d1576a8 data/create/loot_tables/blocks/weathered_iron_window_pane.json +771d98a6627d707228719e843bc80636b02dc985 data/create/loot_tables/blocks/weathered_copper_tiles.json f6ba0623b4bcea2f3796df4c65c494fc072d2c21 data/create/loot_tables/blocks/weighted_ejector.json 978263272f632ed79a61d52a0080de0b7b8102d6 data/create/loot_tables/blocks/white_nixie_tube.json -3d8a4d4a9634d49b20f65ebcdddaef2d0f21b36b data/create/loot_tables/blocks/white_postbox.json 129c6772c1c12271f9b0d41c77f41ce34fc437b1 data/create/loot_tables/blocks/white_sail.json 84c79bc47b4a74021e91745356bb24fe02402209 data/create/loot_tables/blocks/white_seat.json -cda45c1338e6c9078a107e99c70690fe3e0aa7c2 data/create/loot_tables/blocks/white_table_cloth.json 3c63263c9fb642e34a0a67af4cab2d4348d661c0 data/create/loot_tables/blocks/white_toolbox.json 2fae4331c0ab590aef542cf4e23deea579d734f8 data/create/loot_tables/blocks/white_valve_handle.json bf0ea5c6957a43b6c4b1914df70e0b8f6585e638 data/create/loot_tables/blocks/windmill_bearing.json ed989d41a4b640dc1ffb15c9c0712ee3172d408f data/create/loot_tables/blocks/wooden_bracket.json d9f853e662b004b6ffdbb82af99ad7e774698178 data/create/loot_tables/blocks/yellow_nixie_tube.json -a536699cab16540eb906e0b63a2c5064244c7b6c data/create/loot_tables/blocks/yellow_postbox.json 0ead61521fec15522633d6cfdeb77150bb30d075 data/create/loot_tables/blocks/yellow_sail.json 3ae6d4e380237face57b9187ab8570967226b3b1 data/create/loot_tables/blocks/yellow_seat.json -573457c5bb1a8693f4b877620468703c86051a3a data/create/loot_tables/blocks/yellow_table_cloth.json 11b10beba7a6842ce3d01ea4210bff7d3aa6ab94 data/create/loot_tables/blocks/yellow_toolbox.json b9648ec56e55fe2b9d54adf172405519a46bfa66 data/create/loot_tables/blocks/yellow_valve_handle.json 8be474a69469561dfe759159a40fb135a6ad5de6 data/create/loot_tables/blocks/zinc_block.json @@ -3940,61 +3534,54 @@ b9648ec56e55fe2b9d54adf172405519a46bfa66 data/create/loot_tables/blocks/yellow_v 20bd65d72f1762edf473b2fafc71fcf7d55c01f9 data/create/recipes/andesite_ladder_from_andesite_alloy_stonecutting.json 0b3896151533d220c2d1f3768c6f8e428516ff5b data/create/recipes/andesite_pillar_from_stone_types_andesite_stonecutting.json 367e57a760156a19fc6805a0f23c3f8194cd4255 data/create/recipes/andesite_scaffolding_from_andesite_alloy_stonecutting.json -24e5ad71ab310105a5cb3cf3d0a1fe46b162bd41 data/create/recipes/andesite_table_cloth_from_andesite_alloy_stonecutting.json 5272c61c8c17eb7a528cade93bbc80fd9ef51521 data/create/recipes/asurine_from_stone_types_asurine_stonecutting.json 5bf4b9baf782a461efc36d463b99b9acb0ab4607 data/create/recipes/asurine_pillar_from_stone_types_asurine_stonecutting.json -6e54f07090c60a8163038672bcbf47464219bb9b data/create/recipes/bamboo_window.json -9a243cb03b882d90760ffba791ab78ffe9daade3 data/create/recipes/bamboo_window_pane.json 41f53dd9817c3cc9613c8e97ff8f9ffb895e2b0e data/create/recipes/birch_window.json 998dbc2cc27888a28f009b8e408b7091baac9255 data/create/recipes/birch_window_pane.json 5965f3abe435ac0b3a39d8ec31af71808592642b data/create/recipes/brass_bars_from_ingots_brass_stonecutting.json 4b29884cd866dcda1b93899d81fcd3a2ae4c541b data/create/recipes/brass_ladder_from_ingots_brass_stonecutting.json 9c685014019a7a4f1ef47f235cd1e9b3f9093295 data/create/recipes/brass_scaffolding_from_ingots_brass_stonecutting.json -6f6c35d06c926e7d11e4b3d4e63d867c5546da46 data/create/recipes/brass_table_cloth_from_ingots_brass_stonecutting.json 8f21b67e168a14d354b6c00b5ec795355fdd4209 data/create/recipes/calcite_from_stone_types_calcite_stonecutting.json da3692808565988e21ec5b1d5e976338ccc4a037 data/create/recipes/calcite_pillar_from_stone_types_calcite_stonecutting.json -79bd6c532172149ede8e161f2809362d90f87e7d data/create/recipes/cherry_window.json -22557ebdbe69634968c97e7f348307fdea34d97f data/create/recipes/cherry_window_pane.json 1157b2eab2ada187ea80feae298b77ed7ece4bfd data/create/recipes/copper_bars_from_ingots_copper_stonecutting.json b9d4f55128aa03ee6f6ab1831e709629a42c147e data/create/recipes/copper_ladder_from_ingots_copper_stonecutting.json 922c5ac48c8eb8b3a39f5626a381c2252fbac107 data/create/recipes/copper_scaffolding_from_ingots_copper_stonecutting.json -bab9fa969ba95850dc6e3bd0723387a61cbb05cd data/create/recipes/copper_shingles_from_ingots_copper_stonecutting.json bb083ae1d057dc0106946e4c68f9469b81724396 data/create/recipes/copper_shingle_slab.json 3689feaca2bd5355fa2d4226cd2cc519fa9b97c1 data/create/recipes/copper_shingle_slab_from_copper_shingles_stonecutting.json bd4cd7119f8371164b278afc679795a3c2a53406 data/create/recipes/copper_shingle_stairs.json 59f672e8e88d5f4655467e2696616b552debaf46 data/create/recipes/copper_shingle_stairs_from_copper_shingles_stonecutting.json -0225fc8d7b7a5027b8a61e6a043c3a8e505d876a data/create/recipes/copper_table_cloth_from_ingots_copper_stonecutting.json -d463aa891c7ae1b2eb1a758e4100c5a1c16cfffd data/create/recipes/copper_tiles_from_ingots_copper_stonecutting.json +bab9fa969ba95850dc6e3bd0723387a61cbb05cd data/create/recipes/copper_shingles_from_ingots_copper_stonecutting.json f64ba3f3c607b43ea77e5bccb7ec2048e5c6e424 data/create/recipes/copper_tile_slab.json 91b0390e0c772d43eb46b94a0113323f0f6a4387 data/create/recipes/copper_tile_slab_from_copper_tiles_stonecutting.json d31a41f6f7ef0bd20abab06cc31a9d2c56187117 data/create/recipes/copper_tile_stairs.json bf1b0a447169029161fb07feacd22d5aa806b2bf data/create/recipes/copper_tile_stairs_from_copper_tiles_stonecutting.json +d463aa891c7ae1b2eb1a758e4100c5a1c16cfffd data/create/recipes/copper_tiles_from_ingots_copper_stonecutting.json daa54c9ff3612521f06cc1979116beafcda852dd data/create/recipes/copycat_panel_from_ingots_zinc_stonecutting.json 745816d2c3fa29ede2510e39edc76f6fecee963f data/create/recipes/copycat_step_from_ingots_zinc_stonecutting.json -255c32272a704109fccdbb071d4dbf602cb8c1d8 data/create/recipes/crafting/copper/waxed_copper_shingles_from_honeycomb.json 57ae13042e0f96676fa322bf24db4976d75ca6bc data/create/recipes/crafting/copper/waxed_copper_shingle_slab_from_honeycomb.json 790565897535ea2e741d0a0ed7c0b561d594b69a data/create/recipes/crafting/copper/waxed_copper_shingle_stairs_from_honeycomb.json -0c6e14c5884257850c7360cba66bc8cca91c84e7 data/create/recipes/crafting/copper/waxed_copper_tiles_from_honeycomb.json +255c32272a704109fccdbb071d4dbf602cb8c1d8 data/create/recipes/crafting/copper/waxed_copper_shingles_from_honeycomb.json 4693ee65a4a5e1c93fc2acce7bfbc438e573ad9a data/create/recipes/crafting/copper/waxed_copper_tile_slab_from_honeycomb.json f8772b915663e3f70b3a2405a23c5ce87e8b8e49 data/create/recipes/crafting/copper/waxed_copper_tile_stairs_from_honeycomb.json -6d0dacc4db8966d38156fe17645732084379a887 data/create/recipes/crafting/copper/waxed_exposed_copper_shingles_from_honeycomb.json +0c6e14c5884257850c7360cba66bc8cca91c84e7 data/create/recipes/crafting/copper/waxed_copper_tiles_from_honeycomb.json 3bc0b81ea61229e24570e083caa4e5870d517e75 data/create/recipes/crafting/copper/waxed_exposed_copper_shingle_slab_from_honeycomb.json 191f34b27bc8966c2b6ba41403cc0933718748d3 data/create/recipes/crafting/copper/waxed_exposed_copper_shingle_stairs_from_honeycomb.json -cdd66bdfddbcdfacb27c030872d10b6e7f1356fd data/create/recipes/crafting/copper/waxed_exposed_copper_tiles_from_honeycomb.json +6d0dacc4db8966d38156fe17645732084379a887 data/create/recipes/crafting/copper/waxed_exposed_copper_shingles_from_honeycomb.json 2f6d2f8da4d4da2ed48e33d8f6e0b32d37a3ce6d data/create/recipes/crafting/copper/waxed_exposed_copper_tile_slab_from_honeycomb.json 4ed8482ed29fe7c3273db733fa141743c181d460 data/create/recipes/crafting/copper/waxed_exposed_copper_tile_stairs_from_honeycomb.json -0ca4e58d715d5ed4b051a94f2dff42d4d413ef07 data/create/recipes/crafting/copper/waxed_oxidized_copper_shingles_from_honeycomb.json +cdd66bdfddbcdfacb27c030872d10b6e7f1356fd data/create/recipes/crafting/copper/waxed_exposed_copper_tiles_from_honeycomb.json b421f16aea7c47fa8a62e69973f30e4e382f8a2c data/create/recipes/crafting/copper/waxed_oxidized_copper_shingle_slab_from_honeycomb.json 7ab7f673f57e219d3e486d0add1d7e2a8820cc6b data/create/recipes/crafting/copper/waxed_oxidized_copper_shingle_stairs_from_honeycomb.json -b7edffb9b1a936fd34fe23defefc8cb9ea4f6977 data/create/recipes/crafting/copper/waxed_oxidized_copper_tiles_from_honeycomb.json +0ca4e58d715d5ed4b051a94f2dff42d4d413ef07 data/create/recipes/crafting/copper/waxed_oxidized_copper_shingles_from_honeycomb.json 24582e83e8d36a6267df5c028addfb44c1a637e6 data/create/recipes/crafting/copper/waxed_oxidized_copper_tile_slab_from_honeycomb.json 9185ea241bcb5f2fe09d0d5c65832ef379e06c58 data/create/recipes/crafting/copper/waxed_oxidized_copper_tile_stairs_from_honeycomb.json -90bce9f262b87fb821210aceb88d09d815d15e5a data/create/recipes/crafting/copper/waxed_weathered_copper_shingles_from_honeycomb.json +b7edffb9b1a936fd34fe23defefc8cb9ea4f6977 data/create/recipes/crafting/copper/waxed_oxidized_copper_tiles_from_honeycomb.json a2cc99ad9b1234f5327971ee535af9bc25d0154c data/create/recipes/crafting/copper/waxed_weathered_copper_shingle_slab_from_honeycomb.json 0952753a079593d748b38ca84b666f2f886f5c1e data/create/recipes/crafting/copper/waxed_weathered_copper_shingle_stairs_from_honeycomb.json -724802d206db185ebf20bafbcfc35fe0f982f58a data/create/recipes/crafting/copper/waxed_weathered_copper_tiles_from_honeycomb.json +90bce9f262b87fb821210aceb88d09d815d15e5a data/create/recipes/crafting/copper/waxed_weathered_copper_shingles_from_honeycomb.json 98d0b72eb20e1d80cc590800ae2d642a47c3ae5f data/create/recipes/crafting/copper/waxed_weathered_copper_tile_slab_from_honeycomb.json 594b8fd5c30a84df97667b2c6dccc5dedd039d26 data/create/recipes/crafting/copper/waxed_weathered_copper_tile_stairs_from_honeycomb.json +724802d206db185ebf20bafbcfc35fe0f982f58a data/create/recipes/crafting/copper/waxed_weathered_copper_tiles_from_honeycomb.json 97c3e430ef2aecf61c457d0b8c4bbd23e1b01cc3 data/create/recipes/crafting/kinetics/black_seat.json 1129d02609125b48af2efa48f84dd3f90d51a341 data/create/recipes/crafting/kinetics/black_seat_from_other_seat.json 9e5a73e2343054d35e2fbfd20f0c49834d1a87a6 data/create/recipes/crafting/kinetics/black_valve_handle_from_other_valve_handle.json @@ -4043,94 +3630,10 @@ b04c1cebcfbcf44c4ced04252f54dbfeb8f9ff12 data/create/recipes/crafting/kinetics/w 48c9e3b9f5a8a0f598ab0f57cd8936724337bf1f data/create/recipes/crafting/kinetics/yellow_seat.json 75633a46c374230fab4096a45628b42d6012627d data/create/recipes/crafting/kinetics/yellow_seat_from_other_seat.json 2be097bb4f1e47a6b3a4a6f0ef222dffe31a1e22 data/create/recipes/crafting/kinetics/yellow_valve_handle_from_other_valve_handle.json -113186f64e29efebd628fe3d88ae69f1ef0537f0 data/create/recipes/crafting/logistics/andesite_table_cloth_clear.json -f4eec2dbb24d5fdd6971f8be965d4c908d8d39ea data/create/recipes/crafting/logistics/black_postbox.json -bf48cc90d8269c3c443007ce224c13fa5a2e741b data/create/recipes/crafting/logistics/black_postbox_from_other_postbox.json -a5dd78419a491f70c12e036769ec8244b561806e data/create/recipes/crafting/logistics/black_table_cloth.json -ab88f259eb1ea6767c97969e205241e91c0fe048 data/create/recipes/crafting/logistics/black_table_cloth_clear.json -b1a32a62d0e90fe01fdad31151dc269a2ed38e3f data/create/recipes/crafting/logistics/black_table_cloth_from_other_table_cloth.json -7e010aa7f5d22ac505bf04ad00ab3c56e0a78f3b data/create/recipes/crafting/logistics/blue_postbox.json -888a8202521f186fb7af27770e708f0fd4bb9659 data/create/recipes/crafting/logistics/blue_postbox_from_other_postbox.json -e48d20a774d0004eda8fc94b4589df42dfbb90ef data/create/recipes/crafting/logistics/blue_table_cloth.json -4002ef4244d7556fc132075d38ceb36e50cf1ed1 data/create/recipes/crafting/logistics/blue_table_cloth_clear.json -f34c1edaf347bb7dc863a00cf18650c0b0ee8dc5 data/create/recipes/crafting/logistics/blue_table_cloth_from_other_table_cloth.json -45a400f1b48d12af82615eba8bec4cdefb738333 data/create/recipes/crafting/logistics/brass_table_cloth_clear.json -c12ad278627aeba957aae502bb1762335918aa20 data/create/recipes/crafting/logistics/brown_postbox.json -9b481ac9d99aeb7d8bf334803628f0f200ca0ade data/create/recipes/crafting/logistics/brown_postbox_from_other_postbox.json -ce3245d64c34c3ca8374275a945004228b8cdaaf data/create/recipes/crafting/logistics/brown_table_cloth.json -850593663b67399a027d5126593e98109e626fea data/create/recipes/crafting/logistics/brown_table_cloth_clear.json -faf9a84bb5227353006f2406461a5a04e15e4111 data/create/recipes/crafting/logistics/brown_table_cloth_from_other_table_cloth.json -7c1fa243e64073d435ff2c4117dc04e002abc465 data/create/recipes/crafting/logistics/copper_table_cloth_clear.json -e899b7e0fd04525a362b62e4ee76aaaa43a33c2e data/create/recipes/crafting/logistics/cyan_postbox.json -062ea448224fea069f6455f430e01198a73aa386 data/create/recipes/crafting/logistics/cyan_postbox_from_other_postbox.json -65a946a8eecf693c8ec701d5ddbf1900c60e0744 data/create/recipes/crafting/logistics/cyan_table_cloth.json -5486c2bc2f263dd901e201bc3bad7015cf9e8d49 data/create/recipes/crafting/logistics/cyan_table_cloth_clear.json -4847ea28034779bcd922b1346afbe083ab06031f data/create/recipes/crafting/logistics/cyan_table_cloth_from_other_table_cloth.json -1bb34be88d5d690ed00e708fbe85d119f97f7abe data/create/recipes/crafting/logistics/gray_postbox.json -19cd2ea89699860c7870f1f38ac4fad3a5efd274 data/create/recipes/crafting/logistics/gray_postbox_from_other_postbox.json -e11f331c5bf91a1865efb5486c0314b0b5812be6 data/create/recipes/crafting/logistics/gray_table_cloth.json -8e04ba7eed8faff3c16e1a841c72d3a778c970f3 data/create/recipes/crafting/logistics/gray_table_cloth_clear.json -d21603c4548c977d043a2ff5a2fa4099343424d4 data/create/recipes/crafting/logistics/gray_table_cloth_from_other_table_cloth.json -25842442f3123e92702e502757de6558c710741a data/create/recipes/crafting/logistics/green_postbox.json -98f88f8462004a734db6928b20b1cb11b8efe03c data/create/recipes/crafting/logistics/green_postbox_from_other_postbox.json -85867127ec54aeca64b316b969d0f6b3cab559e5 data/create/recipes/crafting/logistics/green_table_cloth.json -2c630a129fe21227412803d42dc3211ec95b1a38 data/create/recipes/crafting/logistics/green_table_cloth_clear.json -e3056c024840fe30dd5fec142334cf8fbae4306e data/create/recipes/crafting/logistics/green_table_cloth_from_other_table_cloth.json -d84a6c6a145dc74fbbda8b4762c207c4f28674bd data/create/recipes/crafting/logistics/light_blue_postbox.json -1d5e8eb1be029acdb79a02224530d97e52aa791e data/create/recipes/crafting/logistics/light_blue_postbox_from_other_postbox.json -1cfb864aed59cd9b9f6512aff13eda74995f6f4b data/create/recipes/crafting/logistics/light_blue_table_cloth.json -1763f06ba76551bf5c4950d50561dd491a3fb86f data/create/recipes/crafting/logistics/light_blue_table_cloth_clear.json -ed9bffdeb2e60e9a5f219c5a7d3e999db7f3651f data/create/recipes/crafting/logistics/light_blue_table_cloth_from_other_table_cloth.json -49f73e661cdf8974be04cfe46d8aba6de63ed14a data/create/recipes/crafting/logistics/light_gray_postbox.json -b8b16c25f0336449e9a2d165bf40474fed381353 data/create/recipes/crafting/logistics/light_gray_postbox_from_other_postbox.json -976da2180c5da522d07e98284439e9ec89ec21af data/create/recipes/crafting/logistics/light_gray_table_cloth.json -ea87dec016be2987fdc77c82c8ea792f93af3a7b data/create/recipes/crafting/logistics/light_gray_table_cloth_clear.json -7c1e33c5354150e028924a854e8f4dea1232e967 data/create/recipes/crafting/logistics/light_gray_table_cloth_from_other_table_cloth.json -e72d0c641ad9a12c3c388601948cf274c9a8c62a data/create/recipes/crafting/logistics/lime_postbox.json -8f6f03db69e3f96d9dc178236a205971ca920b15 data/create/recipes/crafting/logistics/lime_postbox_from_other_postbox.json -1057fe838babd5a390df5445d5266a87326c0bb6 data/create/recipes/crafting/logistics/lime_table_cloth.json -468f4c27ac1134484ea81bafbc81055aab86ed21 data/create/recipes/crafting/logistics/lime_table_cloth_clear.json -13377a12a40705c8ab25137db21f184e4612600a data/create/recipes/crafting/logistics/lime_table_cloth_from_other_table_cloth.json -b46d3a58d318c38df93327789712c1b41681ea7d data/create/recipes/crafting/logistics/magenta_postbox.json -05886ad239c84fd019e1d378450da89137631317 data/create/recipes/crafting/logistics/magenta_postbox_from_other_postbox.json -49be11385f2164fb55bc49445297a41bf8682d0b data/create/recipes/crafting/logistics/magenta_table_cloth.json -9dd457949a6f5ff746c974f8fbf5ebbfa151e31e data/create/recipes/crafting/logistics/magenta_table_cloth_clear.json -a2e1b7080484cc5114196d01d8472aeebaa0df40 data/create/recipes/crafting/logistics/magenta_table_cloth_from_other_table_cloth.json -5dd83b47f9b5406534060662ed37fcea308f3b5b data/create/recipes/crafting/logistics/orange_postbox.json -72596b49737bf7a5fbbf01b2aec20565d2e1a01b data/create/recipes/crafting/logistics/orange_postbox_from_other_postbox.json -2f61600a28d6aaa3d7b0e7a54ed38ad9650b161e data/create/recipes/crafting/logistics/orange_table_cloth.json -ed88c2ba5ea1a41e97e80aa97979587945919233 data/create/recipes/crafting/logistics/orange_table_cloth_clear.json -6c488a8c66ff3aab59b08ef1d1cb98fce5b2976e data/create/recipes/crafting/logistics/orange_table_cloth_from_other_table_cloth.json -9c53c8e6d8e7bcac36f611995c320ebee4a0778a data/create/recipes/crafting/logistics/pink_postbox.json -75622ad3e1fe195399404ae26efeeb6be310fd92 data/create/recipes/crafting/logistics/pink_postbox_from_other_postbox.json -2ef97ee1ade0ea40e275939870dc34ca941e443c data/create/recipes/crafting/logistics/pink_table_cloth.json -b19c6ae1d968c0966815a78f2c112ea872dc1550 data/create/recipes/crafting/logistics/pink_table_cloth_clear.json -ff9044505caf27fb51922a26aa45edca75c8335c data/create/recipes/crafting/logistics/pink_table_cloth_from_other_table_cloth.json -c75f7138e92a54b6841950c5108ee03ede6af4f2 data/create/recipes/crafting/logistics/purple_postbox.json -b4f58bfe14f0b8b0070b71832150b983192ac52f data/create/recipes/crafting/logistics/purple_postbox_from_other_postbox.json -2fe939437431b6a26e0d9d6ce9453fb66fe45d9a data/create/recipes/crafting/logistics/purple_table_cloth.json -36cefcb804b1806428a6ff33bf4e5408d8f7a07f data/create/recipes/crafting/logistics/purple_table_cloth_clear.json -cb44dfbbcccd626f698d3aae8ff65ce3c9620dd2 data/create/recipes/crafting/logistics/purple_table_cloth_from_other_table_cloth.json -6deeeb05693bc98ecfd33cc11e4c098ecd76563b data/create/recipes/crafting/logistics/red_postbox.json -15310750906f41364522e0a27e8f5c2e5fd6c225 data/create/recipes/crafting/logistics/red_postbox_from_other_postbox.json -50876ccdd85879a29ae6181f2c330799a28f1365 data/create/recipes/crafting/logistics/red_table_cloth.json -bddd8bfab2124ea63df317f74d37a6e4b65a583c data/create/recipes/crafting/logistics/red_table_cloth_clear.json -7c6e582effa01018b6f4048378079150c8cb5e8b data/create/recipes/crafting/logistics/red_table_cloth_from_other_table_cloth.json -3b062eeac9c5b9917f3eed67e7525912fb32dfca data/create/recipes/crafting/logistics/white_postbox.json -ace9f83cc4cba51a8564526044ccf6e51abbdf3e data/create/recipes/crafting/logistics/white_postbox_from_other_postbox.json -fc356d74038607c44c6f7d6e7ec56b84a557ebf1 data/create/recipes/crafting/logistics/white_table_cloth.json -8d292e87ac51ea1f1683d67c53a26601d8b89495 data/create/recipes/crafting/logistics/white_table_cloth_clear.json -a9f10b38ae6a44afee64e4ed590a7fd5bb505420 data/create/recipes/crafting/logistics/white_table_cloth_from_other_table_cloth.json -a005bbb2217a7e2c985d88a1255c4285c11dbe0b data/create/recipes/crafting/logistics/yellow_postbox.json -2e387f66250e68d0dadced19d8a93197ff2481f3 data/create/recipes/crafting/logistics/yellow_postbox_from_other_postbox.json -0b2aa56bbbae1189424207afb312fc2bb69b43a1 data/create/recipes/crafting/logistics/yellow_table_cloth.json -655446f2504c7d57d11a893b0c5b1177e4217e58 data/create/recipes/crafting/logistics/yellow_table_cloth_clear.json -db333d47f9e1d6b02aa670ea0aa10dabbcb0e319 data/create/recipes/crafting/logistics/yellow_table_cloth_from_other_table_cloth.json 44a59669177a5a1b0b0eb7cb3dd46826311f4dfe data/create/recipes/crimsite_from_stone_types_crimsite_stonecutting.json c3f4fd2206f3885904913289761f2b8b758e4c95 data/create/recipes/crimsite_pillar_from_stone_types_crimsite_stonecutting.json e1815f97fbc2786d77f5378a2696e36050d8a1fd data/create/recipes/crimson_window.json 96009a12fe3f5ebf677ac069999e2ea2adbc9b7c data/create/recipes/crimson_window_pane.json -82cb9be82ce5109781169bdb47bbd49238b9824b data/create/recipes/cut_andesite_bricks_from_stone_types_andesite_stonecutting.json d6a41fc914a4a41478f115d9503658dba04a4d02 data/create/recipes/cut_andesite_brick_slab.json edf981198463ac58524606f86dc15d2265e8b993 data/create/recipes/cut_andesite_brick_slab_from_stone_types_andesite_stonecutting.json 72486864f3a0d31a92212552441eb659f2541b60 data/create/recipes/cut_andesite_brick_slab_recycling.json @@ -4138,6 +3641,7 @@ edf981198463ac58524606f86dc15d2265e8b993 data/create/recipes/cut_andesite_brick_ 22f463c679249738bf1a340a3b8ff14806303a70 data/create/recipes/cut_andesite_brick_stairs_from_stone_types_andesite_stonecutting.json 42b7105c1d776aed25c1c6bbd9254375079d7438 data/create/recipes/cut_andesite_brick_wall.json 7d25517650c9f66b65f0f8841cf9bcda7ea401ec data/create/recipes/cut_andesite_brick_wall_from_stone_types_andesite_stonecutting.json +82cb9be82ce5109781169bdb47bbd49238b9824b data/create/recipes/cut_andesite_bricks_from_stone_types_andesite_stonecutting.json c3ab483224c3adbd467a4ec0b26a1f6a53fe81c4 data/create/recipes/cut_andesite_from_stone_types_andesite_stonecutting.json 9f316131bb538da9f6b1bde9eaaa0a5bd5972a66 data/create/recipes/cut_andesite_slab.json 50dcff201da369bdc591fdc320aae3547f114284 data/create/recipes/cut_andesite_slab_from_stone_types_andesite_stonecutting.json @@ -4146,7 +3650,6 @@ c3ab483224c3adbd467a4ec0b26a1f6a53fe81c4 data/create/recipes/cut_andesite_from_s c284fc46aabae9c5ab79071eb63ec9b07a9d1002 data/create/recipes/cut_andesite_stairs_from_stone_types_andesite_stonecutting.json 3b6e66e92656ab5b0d1e15444db62ccb1cc01866 data/create/recipes/cut_andesite_wall.json 5df6e8d558f656533aff514aee8cdec7cf8d6fdf data/create/recipes/cut_andesite_wall_from_stone_types_andesite_stonecutting.json -e335b15907be053ab0f2649338b12a86371b78f7 data/create/recipes/cut_asurine_bricks_from_stone_types_asurine_stonecutting.json 41d085d3b8fce5b12d601d86fd0e88df9b482aec data/create/recipes/cut_asurine_brick_slab.json cf61e0806a3988a771675a261a540cbb62352d80 data/create/recipes/cut_asurine_brick_slab_from_stone_types_asurine_stonecutting.json 86606a0717bba33f457707d96461fec6a22d23de data/create/recipes/cut_asurine_brick_slab_recycling.json @@ -4154,6 +3657,7 @@ cf61e0806a3988a771675a261a540cbb62352d80 data/create/recipes/cut_asurine_brick_s 382a7faa460ac286631fe063280541f2f499d895 data/create/recipes/cut_asurine_brick_stairs_from_stone_types_asurine_stonecutting.json 09699c116bb201e742fef1fd3c987e9de4606e6a data/create/recipes/cut_asurine_brick_wall.json 8bb8a9f8e8dd0d6585311c326dcf3f40227149a9 data/create/recipes/cut_asurine_brick_wall_from_stone_types_asurine_stonecutting.json +e335b15907be053ab0f2649338b12a86371b78f7 data/create/recipes/cut_asurine_bricks_from_stone_types_asurine_stonecutting.json 0188d62fbeede94f8596dd5cc73d361a160e8c95 data/create/recipes/cut_asurine_from_stone_types_asurine_stonecutting.json 118e87a2a344238009b1bbbe70e6f314e27842d9 data/create/recipes/cut_asurine_slab.json 37c502094ee96da9e4983142dae5e023c6bcfe14 data/create/recipes/cut_asurine_slab_from_stone_types_asurine_stonecutting.json @@ -4162,7 +3666,6 @@ fe3dd5c7d5bdea71a75003cf3d50439d9d21458d data/create/recipes/cut_asurine_slab_re cade93c9328afcacf4507aa7699c4b09fb4592d4 data/create/recipes/cut_asurine_stairs_from_stone_types_asurine_stonecutting.json 80bec79b5daea4b2b72c0f5e9f189c1044583465 data/create/recipes/cut_asurine_wall.json 45a712e41a74982cfb94a39da199ec6c95eef798 data/create/recipes/cut_asurine_wall_from_stone_types_asurine_stonecutting.json -da11f21280ba1ed06ffe8afe77db3e9e1bbcb1a3 data/create/recipes/cut_calcite_bricks_from_stone_types_calcite_stonecutting.json 98e849c743ed1e4397bf6168215dfa7006a804c4 data/create/recipes/cut_calcite_brick_slab.json 1c21eb6c785729a8ea274513e1313aed952e105e data/create/recipes/cut_calcite_brick_slab_from_stone_types_calcite_stonecutting.json 2a3f078f7f40ba3bc5c17a037db1f8ee415e4e3f data/create/recipes/cut_calcite_brick_slab_recycling.json @@ -4170,6 +3673,7 @@ e4267c62bc6cfc8373df29ee2685f1e1b286b638 data/create/recipes/cut_calcite_brick_s 10fe509e01e3ed1b04bd2f384c0aa3db96b117f1 data/create/recipes/cut_calcite_brick_stairs_from_stone_types_calcite_stonecutting.json 9b55a6c9cf0ce697a242684953daf9aa94d024dc data/create/recipes/cut_calcite_brick_wall.json 1e67376e484923b84bd64b0b22b4e55b581ac419 data/create/recipes/cut_calcite_brick_wall_from_stone_types_calcite_stonecutting.json +da11f21280ba1ed06ffe8afe77db3e9e1bbcb1a3 data/create/recipes/cut_calcite_bricks_from_stone_types_calcite_stonecutting.json 98b014b64c97371f04aaacbdd23e13e274e36e3b data/create/recipes/cut_calcite_from_stone_types_calcite_stonecutting.json fcab91f11fe97a194b2c1b16115206166d3cd634 data/create/recipes/cut_calcite_slab.json 8426a494b776148056cb4525e62744d0be8b28cd data/create/recipes/cut_calcite_slab_from_stone_types_calcite_stonecutting.json @@ -4178,7 +3682,6 @@ fcab91f11fe97a194b2c1b16115206166d3cd634 data/create/recipes/cut_calcite_slab.js a7e7fb425d3c1f21f5ed53da79957363fed824df data/create/recipes/cut_calcite_stairs_from_stone_types_calcite_stonecutting.json 73eaf7bffa38bc874974871f3002cd3ee7f0c36e data/create/recipes/cut_calcite_wall.json 01b4c23362f15ee0e5c207c46383f96032c89d98 data/create/recipes/cut_calcite_wall_from_stone_types_calcite_stonecutting.json -07aff2bb6424de46463b2c965418ed52efd0a790 data/create/recipes/cut_crimsite_bricks_from_stone_types_crimsite_stonecutting.json 8ffb2c1c747f19ea37c0da3fe248b6c58981c9f6 data/create/recipes/cut_crimsite_brick_slab.json 86c3a5c64561052489b3ceb9e08be5a8729198a9 data/create/recipes/cut_crimsite_brick_slab_from_stone_types_crimsite_stonecutting.json e3215d4e651e70402b896ba50975cb2f23d16278 data/create/recipes/cut_crimsite_brick_slab_recycling.json @@ -4186,6 +3689,7 @@ e49f6e319fae9058cbece0e332a11e108234e608 data/create/recipes/cut_crimsite_brick_ c7186fb1a75f59aff929e843f50a162a090b7bb3 data/create/recipes/cut_crimsite_brick_stairs_from_stone_types_crimsite_stonecutting.json 272d8d01730a88eff4fc6923e93962650b992c46 data/create/recipes/cut_crimsite_brick_wall.json 13ac9464098e8c67e820dc898c025ab0382d852a data/create/recipes/cut_crimsite_brick_wall_from_stone_types_crimsite_stonecutting.json +07aff2bb6424de46463b2c965418ed52efd0a790 data/create/recipes/cut_crimsite_bricks_from_stone_types_crimsite_stonecutting.json 18ce9ff32eda2d869bd11f398a86e78b71f6d0fe data/create/recipes/cut_crimsite_from_stone_types_crimsite_stonecutting.json c39166aa6267ec5bc71893d5756955abfb644217 data/create/recipes/cut_crimsite_slab.json 6271d5bc0377814ba06061bfffcb812ca2ef8f03 data/create/recipes/cut_crimsite_slab_from_stone_types_crimsite_stonecutting.json @@ -4194,7 +3698,6 @@ acfe33dbb889c820c213bcbc8593766703bf3a25 data/create/recipes/cut_crimsite_slab_r 90b03cf1e72d3b803e33755832e0722ff264681b data/create/recipes/cut_crimsite_stairs_from_stone_types_crimsite_stonecutting.json 8dfe19522878af232deaa1fc13d83cf785684cba data/create/recipes/cut_crimsite_wall.json 18f9548175baab0173785d7ef308096067712dd2 data/create/recipes/cut_crimsite_wall_from_stone_types_crimsite_stonecutting.json -de1a11b7ed71f1f7aeea2791fe922feef689fd35 data/create/recipes/cut_deepslate_bricks_from_stone_types_deepslate_stonecutting.json 5e5c0e6b1b3e204de3c48fb6a4cd473a150979c2 data/create/recipes/cut_deepslate_brick_slab.json 2c0795b92759dab751f86f50aa80440df2245526 data/create/recipes/cut_deepslate_brick_slab_from_stone_types_deepslate_stonecutting.json dbcc41c48cf28b71dcd9f3b6ecae43c8de681532 data/create/recipes/cut_deepslate_brick_slab_recycling.json @@ -4202,6 +3705,7 @@ e21f8dc33e70ebd43ea79a4afaf3b4e8a449f4bd data/create/recipes/cut_deepslate_brick 7b3489e5b629a995691be117c5a378769c743449 data/create/recipes/cut_deepslate_brick_stairs_from_stone_types_deepslate_stonecutting.json 158bb41bffebb2543e4aa2d5f14cc8af1cdd8671 data/create/recipes/cut_deepslate_brick_wall.json 73a07a5fa665bb20d131f0a0e40806116316928a data/create/recipes/cut_deepslate_brick_wall_from_stone_types_deepslate_stonecutting.json +de1a11b7ed71f1f7aeea2791fe922feef689fd35 data/create/recipes/cut_deepslate_bricks_from_stone_types_deepslate_stonecutting.json 992fdc2eba2afe3ff8aad0ceee5424ecd3f3026d data/create/recipes/cut_deepslate_from_stone_types_deepslate_stonecutting.json 064e2f5edd9209af7742b0f0eb45204453bed46f data/create/recipes/cut_deepslate_slab.json f341d30b7fd427dea09a51d67e1e9532e5184be8 data/create/recipes/cut_deepslate_slab_from_stone_types_deepslate_stonecutting.json @@ -4210,7 +3714,6 @@ c08e12e44344efca550efa8ba14d0cb2f9f6c2c6 data/create/recipes/cut_deepslate_stair e6deec1352fb5c74c470dc488b71e5f8f55bdfbf data/create/recipes/cut_deepslate_stairs_from_stone_types_deepslate_stonecutting.json 2ad7fb3f3a143e58bea8eefe4cd9db3d1c37a3e6 data/create/recipes/cut_deepslate_wall.json e752527479f71f96bb34878008bf8cfb23fd3045 data/create/recipes/cut_deepslate_wall_from_stone_types_deepslate_stonecutting.json -2c23d13f48f3685bda6c564e080053fbfa71ab99 data/create/recipes/cut_diorite_bricks_from_stone_types_diorite_stonecutting.json 90b83c2a2026d70f49c91813305fdee721926db9 data/create/recipes/cut_diorite_brick_slab.json 9d51c690c77321437561a006dc2f9bba975875e6 data/create/recipes/cut_diorite_brick_slab_from_stone_types_diorite_stonecutting.json fa76e64ac9b569f5d5f2f1ecc54e51f9be15aacf data/create/recipes/cut_diorite_brick_slab_recycling.json @@ -4218,6 +3721,7 @@ aa6aea99e9ce2d5dc3d6555ab3d17928bca6195e data/create/recipes/cut_diorite_brick_s 9a26c4097519a9300e591b6578bbaf6c11f909e1 data/create/recipes/cut_diorite_brick_stairs_from_stone_types_diorite_stonecutting.json 78d37df17c7e2be73ce1d226ee552ff3f49b9e4f data/create/recipes/cut_diorite_brick_wall.json f668f2c78a779bc3d0546a82dea02b9f4688e05c data/create/recipes/cut_diorite_brick_wall_from_stone_types_diorite_stonecutting.json +2c23d13f48f3685bda6c564e080053fbfa71ab99 data/create/recipes/cut_diorite_bricks_from_stone_types_diorite_stonecutting.json 1918ecb2ab16ca7dbb30eee4852b67dd963d872e data/create/recipes/cut_diorite_from_stone_types_diorite_stonecutting.json 07fda5c89128648856f948a03ac56a2a2693cf1b data/create/recipes/cut_diorite_slab.json 28765ac7f8b62373b32f014d1dd7f4afb50e1906 data/create/recipes/cut_diorite_slab_from_stone_types_diorite_stonecutting.json @@ -4226,7 +3730,6 @@ dd5f3c59a5d292f7b5c046be35da7f67e8383aa1 data/create/recipes/cut_diorite_slab_re be2c6c01630b90895e7215edce3d02352793dbc4 data/create/recipes/cut_diorite_stairs_from_stone_types_diorite_stonecutting.json 8984b7b7dbc7e65ee04886516501a13278e889e9 data/create/recipes/cut_diorite_wall.json 8ff5d1ecff2202595f7cba5bd65c466c53ac2cc5 data/create/recipes/cut_diorite_wall_from_stone_types_diorite_stonecutting.json -10550b023989113c26d430136daf1dc49f10ce63 data/create/recipes/cut_dripstone_bricks_from_stone_types_dripstone_stonecutting.json 95717a80bb8ae296c2f77478a8f42b88cea88996 data/create/recipes/cut_dripstone_brick_slab.json f04bf1189b53e24974779d9e959e8973d9677162 data/create/recipes/cut_dripstone_brick_slab_from_stone_types_dripstone_stonecutting.json 332534fc2909ca83f5f7f4ab3adf92680bb17f79 data/create/recipes/cut_dripstone_brick_slab_recycling.json @@ -4234,6 +3737,7 @@ f04bf1189b53e24974779d9e959e8973d9677162 data/create/recipes/cut_dripstone_brick 17bf8160eaf16655d454ddfe22b82c9a86462146 data/create/recipes/cut_dripstone_brick_stairs_from_stone_types_dripstone_stonecutting.json 7d638d156326a2e542ed94837273d9cca5cf4fce data/create/recipes/cut_dripstone_brick_wall.json 154931db54115cf4a64147cdd6d1eb7efff48737 data/create/recipes/cut_dripstone_brick_wall_from_stone_types_dripstone_stonecutting.json +10550b023989113c26d430136daf1dc49f10ce63 data/create/recipes/cut_dripstone_bricks_from_stone_types_dripstone_stonecutting.json 7147f9199f174c9864109fe5723528921aaa0c46 data/create/recipes/cut_dripstone_from_stone_types_dripstone_stonecutting.json f2800b467eac75d0099f2f07e09b47115df4e09f data/create/recipes/cut_dripstone_slab.json a4f62a1a30592f82789988f93d8ae35d176eca59 data/create/recipes/cut_dripstone_slab_from_stone_types_dripstone_stonecutting.json @@ -4242,7 +3746,6 @@ a4f62a1a30592f82789988f93d8ae35d176eca59 data/create/recipes/cut_dripstone_slab_ f2df5efedb6fb25ecb877b888007990082d9aca4 data/create/recipes/cut_dripstone_stairs_from_stone_types_dripstone_stonecutting.json a177092d0270f9e07a4f9bef4d0c8fb2ed91d3bc data/create/recipes/cut_dripstone_wall.json a3731ef689d3ac790bc3e3fd507f1134c99a751a data/create/recipes/cut_dripstone_wall_from_stone_types_dripstone_stonecutting.json -9c4c64666b18d3adb11cd3d56667fabf6e88dfe2 data/create/recipes/cut_granite_bricks_from_stone_types_granite_stonecutting.json aa454bebffd7e77cfa5c1bd711bfbac27e3c5a14 data/create/recipes/cut_granite_brick_slab.json d073b9b0b8ca2fbdc5e1ed16f6f195a5f3af4588 data/create/recipes/cut_granite_brick_slab_from_stone_types_granite_stonecutting.json 1dfd539c17a3342a0cd194ce1465a808aacbeda3 data/create/recipes/cut_granite_brick_slab_recycling.json @@ -4250,6 +3753,7 @@ e069aa5c316feb2823ef98e8e6c89bb1bed23d2e data/create/recipes/cut_granite_brick_s f38fc7014aa83d4914d50d87ee3f8f762c078a78 data/create/recipes/cut_granite_brick_stairs_from_stone_types_granite_stonecutting.json 0fd9c3a778c7bdcd7aa06f892a9c260ad664d367 data/create/recipes/cut_granite_brick_wall.json b81db94b6228f512049324dd1436880f1e86e444 data/create/recipes/cut_granite_brick_wall_from_stone_types_granite_stonecutting.json +9c4c64666b18d3adb11cd3d56667fabf6e88dfe2 data/create/recipes/cut_granite_bricks_from_stone_types_granite_stonecutting.json 01970a95f17648a7ef1fb0337ee2e82eb2279e9e data/create/recipes/cut_granite_from_stone_types_granite_stonecutting.json 8fc1c51591e590c8718be0500a4dbcc2b47830ce data/create/recipes/cut_granite_slab.json d239323b7a3b65b2fd7005350a90d578671c2b81 data/create/recipes/cut_granite_slab_from_stone_types_granite_stonecutting.json @@ -4258,7 +3762,6 @@ d239323b7a3b65b2fd7005350a90d578671c2b81 data/create/recipes/cut_granite_slab_fr 3d85d483073d37fea7d9a95831b3b856c0725b98 data/create/recipes/cut_granite_stairs_from_stone_types_granite_stonecutting.json 3d4130fe5fe6e963fd5e10534e729e0448b9f05f data/create/recipes/cut_granite_wall.json d43a876bf89bf3536c80fd5e3ef0ee36c147cd06 data/create/recipes/cut_granite_wall_from_stone_types_granite_stonecutting.json -7cdd3cf302cfe4ef21c0a89dadef4f781e307bb0 data/create/recipes/cut_limestone_bricks_from_stone_types_limestone_stonecutting.json 0e3285206947bcfdf9606d3f8e61ea7d2899f7d2 data/create/recipes/cut_limestone_brick_slab.json c3d3ff37e29c435b2a13d30bd4ded0f6ca9fbfbc data/create/recipes/cut_limestone_brick_slab_from_stone_types_limestone_stonecutting.json 459babb2bd01e9e1ece4c8cd2865690997f01c66 data/create/recipes/cut_limestone_brick_slab_recycling.json @@ -4266,6 +3769,7 @@ d4f8dc640becf1c35416016500424ecd68d7ecee data/create/recipes/cut_limestone_brick 570983b2b27862dabe9f3d1bcd76d2909b8bdb3c data/create/recipes/cut_limestone_brick_stairs_from_stone_types_limestone_stonecutting.json aad4342a726fd65ca2b4c52a4e8857190e50b5be data/create/recipes/cut_limestone_brick_wall.json 5ac226aff9d854efc47ed71241e6c098b170b9b0 data/create/recipes/cut_limestone_brick_wall_from_stone_types_limestone_stonecutting.json +7cdd3cf302cfe4ef21c0a89dadef4f781e307bb0 data/create/recipes/cut_limestone_bricks_from_stone_types_limestone_stonecutting.json 329950373aaaf8e70c54cf5e2467c7a84f372078 data/create/recipes/cut_limestone_from_stone_types_limestone_stonecutting.json cbacfd31703ac908d28e42968bb571dccfa20612 data/create/recipes/cut_limestone_slab.json 628a0a64c2dcd63f17a3ec9ce55ac643b194eacc data/create/recipes/cut_limestone_slab_from_stone_types_limestone_stonecutting.json @@ -4274,7 +3778,6 @@ cbacfd31703ac908d28e42968bb571dccfa20612 data/create/recipes/cut_limestone_slab. ba301da212ee14ff42c38487d0906a2da203e3c3 data/create/recipes/cut_limestone_stairs_from_stone_types_limestone_stonecutting.json d2aac4ac16f9c842af1efd3896dd3250f6d8424e data/create/recipes/cut_limestone_wall.json b14e6972f8586e569a7ab4ecf6ed5d6db1a2bded data/create/recipes/cut_limestone_wall_from_stone_types_limestone_stonecutting.json -a1a2b95283d88e1d990e00da9a095fe928b2aa2f data/create/recipes/cut_ochrum_bricks_from_stone_types_ochrum_stonecutting.json d5a4fa7787d2e56e0b5c8d533567543b93cf694b data/create/recipes/cut_ochrum_brick_slab.json 58514a5f216706e9bb62b27ad03701fe02bac013 data/create/recipes/cut_ochrum_brick_slab_from_stone_types_ochrum_stonecutting.json 6cc3167ebf075d7b302a359d1afdddf5753d0e26 data/create/recipes/cut_ochrum_brick_slab_recycling.json @@ -4282,6 +3785,7 @@ d5a4fa7787d2e56e0b5c8d533567543b93cf694b data/create/recipes/cut_ochrum_brick_sl ec6339d6658b0d32e46c8a4a4e06d94a388a6332 data/create/recipes/cut_ochrum_brick_stairs_from_stone_types_ochrum_stonecutting.json c4139ae7a9742f7111d308fe66bf1d627533550b data/create/recipes/cut_ochrum_brick_wall.json 1b8a4c81680df542a5e6b9e665c96649cf3eb7fa data/create/recipes/cut_ochrum_brick_wall_from_stone_types_ochrum_stonecutting.json +a1a2b95283d88e1d990e00da9a095fe928b2aa2f data/create/recipes/cut_ochrum_bricks_from_stone_types_ochrum_stonecutting.json 2b967f3424196b5da9b396ea58fb969d406af789 data/create/recipes/cut_ochrum_from_stone_types_ochrum_stonecutting.json 5baa701f3cbe8d69e2e6a5554622dd78ef3ac451 data/create/recipes/cut_ochrum_slab.json 9a26cba276cf135a10c71d31f5b960b2ee6ac444 data/create/recipes/cut_ochrum_slab_from_stone_types_ochrum_stonecutting.json @@ -4290,7 +3794,6 @@ c4139ae7a9742f7111d308fe66bf1d627533550b data/create/recipes/cut_ochrum_brick_wa 75a232ccede0ffa7feb3e69da17c6a514a908907 data/create/recipes/cut_ochrum_stairs_from_stone_types_ochrum_stonecutting.json d9c05b7e4ce4ee86d0f6a9e1ee6c1b585ffee58b data/create/recipes/cut_ochrum_wall.json ee0dff8e1317aeffd061688879b97e81a00b7adb data/create/recipes/cut_ochrum_wall_from_stone_types_ochrum_stonecutting.json -087eefb8ffd61fd88f1db6ca25f9ac31e93f2fdf data/create/recipes/cut_scorchia_bricks_from_stone_types_scorchia_stonecutting.json 72ac9293e5791df07914e2d3ed00e5ff59d64b08 data/create/recipes/cut_scorchia_brick_slab.json 2f38c410d5eb93bdb8c8be0f68ac89726e3c765c data/create/recipes/cut_scorchia_brick_slab_from_stone_types_scorchia_stonecutting.json e296e6af6865bf6e4618dab8a96bb88f6999a9a5 data/create/recipes/cut_scorchia_brick_slab_recycling.json @@ -4298,6 +3801,7 @@ bd5984a6b96443319b7fad32db771d8ded0b0591 data/create/recipes/cut_scorchia_brick_ bd5c803c855222a29998dd784e6d12a18dd612d9 data/create/recipes/cut_scorchia_brick_stairs_from_stone_types_scorchia_stonecutting.json adfe0b08b5b72e579d47f36a4f835045e433e7f7 data/create/recipes/cut_scorchia_brick_wall.json 37fc5ae45d0260de9a5c45b0a1b208e4d146a562 data/create/recipes/cut_scorchia_brick_wall_from_stone_types_scorchia_stonecutting.json +087eefb8ffd61fd88f1db6ca25f9ac31e93f2fdf data/create/recipes/cut_scorchia_bricks_from_stone_types_scorchia_stonecutting.json f6dfd648418f24da093b80978c2f6e070f33ff6d data/create/recipes/cut_scorchia_from_stone_types_scorchia_stonecutting.json 7df99605c0c8761aeb9301d5391e1f16d41f89b3 data/create/recipes/cut_scorchia_slab.json fbd9a92d3c3d9e823cac51347320219f1734ec04 data/create/recipes/cut_scorchia_slab_from_stone_types_scorchia_stonecutting.json @@ -4306,7 +3810,6 @@ ad54182c3142ac9d9dd9bb4c5acc18f82e3fc5e5 data/create/recipes/cut_scorchia_stairs 1ddfefce136201ae78dbc53ba472080332fd6366 data/create/recipes/cut_scorchia_stairs_from_stone_types_scorchia_stonecutting.json 0a011b7cee33200fec5546168734c330952124da data/create/recipes/cut_scorchia_wall.json c594d886a303ad6e24d1283004442835ee861fbc data/create/recipes/cut_scorchia_wall_from_stone_types_scorchia_stonecutting.json -8650c0db70a3521b50404252106e0185b4f25a45 data/create/recipes/cut_scoria_bricks_from_stone_types_scoria_stonecutting.json 8baf09b5ff2004d71091b6f95307aa179a21f4df data/create/recipes/cut_scoria_brick_slab.json e7080ca9b6a507bec4a4a3dd52a28c1c33975628 data/create/recipes/cut_scoria_brick_slab_from_stone_types_scoria_stonecutting.json f5b56f6eb9c1ac0f8168b2b0f0b0ab00655ebfdb data/create/recipes/cut_scoria_brick_slab_recycling.json @@ -4314,6 +3817,7 @@ f5b56f6eb9c1ac0f8168b2b0f0b0ab00655ebfdb data/create/recipes/cut_scoria_brick_sl 3fd560355163f0afafefe886e75fd8b2c3cf2b6f data/create/recipes/cut_scoria_brick_stairs_from_stone_types_scoria_stonecutting.json ed803a4cdcf1dd01af03fff52e783f3539f78546 data/create/recipes/cut_scoria_brick_wall.json 553642a4e0dc5f934da8127a427ccdf53d3f51f9 data/create/recipes/cut_scoria_brick_wall_from_stone_types_scoria_stonecutting.json +8650c0db70a3521b50404252106e0185b4f25a45 data/create/recipes/cut_scoria_bricks_from_stone_types_scoria_stonecutting.json 5702063be3d38fa6b3ae5c998337676a0cf91149 data/create/recipes/cut_scoria_from_stone_types_scoria_stonecutting.json 295356022aee8a33272b430879615af638fc5a2c data/create/recipes/cut_scoria_slab.json 1656e822e823fcdf04120b55235aa477845a69a6 data/create/recipes/cut_scoria_slab_from_stone_types_scoria_stonecutting.json @@ -4322,7 +3826,6 @@ d0c88c037004911e377d88cf5a28ff85a413d07e data/create/recipes/cut_scoria_slab_rec 8748df6152c923930452397367562bb6007058cf data/create/recipes/cut_scoria_stairs_from_stone_types_scoria_stonecutting.json 7f9bd9de7bfba21eef449f8e11ffc8cf37de6b88 data/create/recipes/cut_scoria_wall.json 42235c6ded520ecda3321e8cd8910dcfa05cd61e data/create/recipes/cut_scoria_wall_from_stone_types_scoria_stonecutting.json -c02b4daf0050d705c145c0698aaa3094724ba2f1 data/create/recipes/cut_tuff_bricks_from_stone_types_tuff_stonecutting.json 214b6219b86d94ea5705e40f254a4d9a9ac894b7 data/create/recipes/cut_tuff_brick_slab.json 9e0182206fab754daa0596259be0b98a712ba859 data/create/recipes/cut_tuff_brick_slab_from_stone_types_tuff_stonecutting.json 86938ed4ef969e85163c25e2a60181433247b73b data/create/recipes/cut_tuff_brick_slab_recycling.json @@ -4330,6 +3833,7 @@ b4212528d6c8893c1d57c0a5ada60673105e399d data/create/recipes/cut_tuff_brick_stai 90f3241a3eb47d9b0902b639fadee76e41b92a72 data/create/recipes/cut_tuff_brick_stairs_from_stone_types_tuff_stonecutting.json b920d14ac41465f70b1fb8211c1c06d6c41ccadb data/create/recipes/cut_tuff_brick_wall.json aa41f89028dfa995dc11b881894e5a5993e4c4f9 data/create/recipes/cut_tuff_brick_wall_from_stone_types_tuff_stonecutting.json +c02b4daf0050d705c145c0698aaa3094724ba2f1 data/create/recipes/cut_tuff_bricks_from_stone_types_tuff_stonecutting.json 41dc800ae0a8918f4602d610ff0ba9714cdfe8dc data/create/recipes/cut_tuff_from_stone_types_tuff_stonecutting.json 573fff8b4fba92289dc6b113b58c8de25427f62d data/create/recipes/cut_tuff_slab.json 94667fb1e6203bd66bef10acfee7cd990009d26f data/create/recipes/cut_tuff_slab_from_stone_types_tuff_stonecutting.json @@ -4338,7 +3842,6 @@ aa41f89028dfa995dc11b881894e5a5993e4c4f9 data/create/recipes/cut_tuff_brick_wall 3b3ba319bd67a4e7f555cfcb54f9dc1fc22cf015 data/create/recipes/cut_tuff_stairs_from_stone_types_tuff_stonecutting.json 0c241d763e87b23b8799528e132e0d12b0e16141 data/create/recipes/cut_tuff_wall.json 5705b0312c5c70d48662c2ff375f0b2cfe3b4902 data/create/recipes/cut_tuff_wall_from_stone_types_tuff_stonecutting.json -8ab3c640b57421a8c0341ab4ec5bade31376d059 data/create/recipes/cut_veridium_bricks_from_stone_types_veridium_stonecutting.json 822f97726c72d31c4c614767c08140b3535e0640 data/create/recipes/cut_veridium_brick_slab.json 1705fd5fc9ecc9a650812c89f500b5ef9aec2626 data/create/recipes/cut_veridium_brick_slab_from_stone_types_veridium_stonecutting.json 238aeedf55624671809a37246581d28fe6b2c19e data/create/recipes/cut_veridium_brick_slab_recycling.json @@ -4346,6 +3849,7 @@ dfbef691643cead7111b3b1c51aabcda8419bc19 data/create/recipes/cut_veridium_brick_ db2ea87f3ec8924ba9e0b87cd6a6edeb93c0c2d8 data/create/recipes/cut_veridium_brick_stairs_from_stone_types_veridium_stonecutting.json 5e5c9fab7ba7143d206df7d8184742fb1a17c99c data/create/recipes/cut_veridium_brick_wall.json ed752a7f698e3ecbb5e4f848a78f8b3c7c6bf12e data/create/recipes/cut_veridium_brick_wall_from_stone_types_veridium_stonecutting.json +8ab3c640b57421a8c0341ab4ec5bade31376d059 data/create/recipes/cut_veridium_bricks_from_stone_types_veridium_stonecutting.json e0355543105e4ec9d672d2a050e70b5c198ea472 data/create/recipes/cut_veridium_from_stone_types_veridium_stonecutting.json fb3c671f64676538ea3aa96be483ac15b3cdeb3d data/create/recipes/cut_veridium_slab.json 7d7c80ac03ad8623f9a5d7f0ff0bb6f68985efa5 data/create/recipes/cut_veridium_slab_from_stone_types_veridium_stonecutting.json @@ -4377,8 +3881,6 @@ c1ac5bad113e067bf5cfa8d730dcc835420aecfb data/create/recipes/granite_from_stone_ 8d6448c67261138b6331273024b757a9a58b41c4 data/create/recipes/horizontal_framed_glass_from_glass_colorless_stonecutting.json dde9d763cc1306d48e2f3b813530fca0842a5c14 data/create/recipes/horizontal_framed_glass_pane.json 61f759fec228090a60371add88cc90be3a84a735 data/create/recipes/industrial_iron_block_from_ingots_iron_stonecutting.json -813c68e25ffc543d7457a1417897dd0b579d1b1e data/create/recipes/industrial_iron_window.json -4a4e4f87a2753fb5310f7f70c39143e02b6a6fd0 data/create/recipes/industrial_iron_window_pane.json 2b4a8702db989116dbf97d0021d71a5948336805 data/create/recipes/jungle_window.json 4400d3db46b091d3ead7fbcb64cb712db2fde5de data/create/recipes/jungle_window_pane.json 66da7fc9adbe0119bc41bfad0f6422fb93dcf3b6 data/create/recipes/layered_andesite_from_stone_types_andesite_stonecutting.json @@ -4531,7 +4033,6 @@ a157a43e7788d285b8d72eade5955369c9b9a1de data/create/recipes/rose_quartz_block_f 1268cc2bdd088d26b84fb4e481db27af61f94bd1 data/create/recipes/scorchia_pillar_from_stone_types_scorchia_stonecutting.json 2e8f4cdb3498547a5e6fe658bb33d4be5ce8f54b data/create/recipes/scoria_from_stone_types_scoria_stonecutting.json 770d3453c75f77b16db661f6e636892d3117690b data/create/recipes/scoria_pillar_from_stone_types_scoria_stonecutting.json -75dc56fcdcd6a10288f2d607bf6dcbbe10b35a64 data/create/recipes/small_andesite_bricks_from_stone_types_andesite_stonecutting.json 2e86fddc76285b4e380b845eb1150580b134d0ac data/create/recipes/small_andesite_brick_slab.json 311727e5c08ddbe0aa26275be74e9b83201ac8ab data/create/recipes/small_andesite_brick_slab_from_stone_types_andesite_stonecutting.json 2767e239c9d704b6bb5325b4f40e0aa0acdcdce1 data/create/recipes/small_andesite_brick_slab_recycling.json @@ -4539,7 +4040,7 @@ a157a43e7788d285b8d72eade5955369c9b9a1de data/create/recipes/rose_quartz_block_f 9e82896e00c1e14e514fac818e11e5b9ef5b10d7 data/create/recipes/small_andesite_brick_stairs_from_stone_types_andesite_stonecutting.json 5287d389b4954d954881d9f0293c52870bba88d0 data/create/recipes/small_andesite_brick_wall.json 1172ca76affd948c50b207124ee03c4f480f4ee8 data/create/recipes/small_andesite_brick_wall_from_stone_types_andesite_stonecutting.json -e3b69122b2cfe64b043384235eeb6d04f346e58b data/create/recipes/small_asurine_bricks_from_stone_types_asurine_stonecutting.json +75dc56fcdcd6a10288f2d607bf6dcbbe10b35a64 data/create/recipes/small_andesite_bricks_from_stone_types_andesite_stonecutting.json 9196a055491052afc14ed01667cccf2a0920e793 data/create/recipes/small_asurine_brick_slab.json f4cc3330837a647c098ccb24fbbbf583c3f960fc data/create/recipes/small_asurine_brick_slab_from_stone_types_asurine_stonecutting.json 063b2f0ad7e93698999922040132eb2b23661a38 data/create/recipes/small_asurine_brick_slab_recycling.json @@ -4547,7 +4048,7 @@ a85d2f957223f87ffa2c3f63cdf6f9f0f84bb921 data/create/recipes/small_asurine_brick c7cb218b0d8a1e358d593fc1fef82fc074289552 data/create/recipes/small_asurine_brick_stairs_from_stone_types_asurine_stonecutting.json 08d10ee57995e67ac1fb5feba04b03aee51dbe16 data/create/recipes/small_asurine_brick_wall.json 4c0aa6203295a36a6d7ffe9d7bf0973277162689 data/create/recipes/small_asurine_brick_wall_from_stone_types_asurine_stonecutting.json -07125218f9025833afa189fa0090f4d6b4660db0 data/create/recipes/small_calcite_bricks_from_stone_types_calcite_stonecutting.json +e3b69122b2cfe64b043384235eeb6d04f346e58b data/create/recipes/small_asurine_bricks_from_stone_types_asurine_stonecutting.json a72719de028ca9e07756dae6031af48525520fc2 data/create/recipes/small_calcite_brick_slab.json d8ebf6f1eb2e2372fb20def956398089adec5d13 data/create/recipes/small_calcite_brick_slab_from_stone_types_calcite_stonecutting.json ab4cfc2b34989d41a434781a3150ecd530c4f15b data/create/recipes/small_calcite_brick_slab_recycling.json @@ -4555,7 +4056,7 @@ c77a7700d978e23db14d947915591061dda8eab3 data/create/recipes/small_calcite_brick 4e066bfc60ea142d54ce939d025b6679ac9634ad data/create/recipes/small_calcite_brick_stairs_from_stone_types_calcite_stonecutting.json 64e53d8090fa26cc4cb62efea7c1615ff7f705c2 data/create/recipes/small_calcite_brick_wall.json 3ba736ae76249fa61692c13f7879af954f9bbd36 data/create/recipes/small_calcite_brick_wall_from_stone_types_calcite_stonecutting.json -a3309c81f84bf4fb78e9db2316fb758f9b2f8429 data/create/recipes/small_crimsite_bricks_from_stone_types_crimsite_stonecutting.json +07125218f9025833afa189fa0090f4d6b4660db0 data/create/recipes/small_calcite_bricks_from_stone_types_calcite_stonecutting.json 92cf7e99229c1e72405bb0875e6f939b3f5aea12 data/create/recipes/small_crimsite_brick_slab.json b993e081103c019b7b9b73b38ef8c408fb4500ac data/create/recipes/small_crimsite_brick_slab_from_stone_types_crimsite_stonecutting.json 7f6fa1fab65d910388f5f2ec4ee7d99cbda8df57 data/create/recipes/small_crimsite_brick_slab_recycling.json @@ -4563,7 +4064,7 @@ b993e081103c019b7b9b73b38ef8c408fb4500ac data/create/recipes/small_crimsite_bric 260da721849d1afd6f431d51538d1587ee3af8d5 data/create/recipes/small_crimsite_brick_stairs_from_stone_types_crimsite_stonecutting.json 093ac919f793111b442029198383a9de5b6df027 data/create/recipes/small_crimsite_brick_wall.json 8b8280a8282fa8718620ee3d69182e241a7852c0 data/create/recipes/small_crimsite_brick_wall_from_stone_types_crimsite_stonecutting.json -e7a3cb889ce6b530cd40f19e23bad943374e61b5 data/create/recipes/small_deepslate_bricks_from_stone_types_deepslate_stonecutting.json +a3309c81f84bf4fb78e9db2316fb758f9b2f8429 data/create/recipes/small_crimsite_bricks_from_stone_types_crimsite_stonecutting.json 022690548a46f5cc63adda3626824a81c6ebf490 data/create/recipes/small_deepslate_brick_slab.json 655be9ddf21dea2255fb2cb2628a5fee39eb10e2 data/create/recipes/small_deepslate_brick_slab_from_stone_types_deepslate_stonecutting.json d6d3db5604279cd402f64dbdeae7c3bee6d7ab78 data/create/recipes/small_deepslate_brick_slab_recycling.json @@ -4571,7 +4072,7 @@ d6d3db5604279cd402f64dbdeae7c3bee6d7ab78 data/create/recipes/small_deepslate_bri 0a458e8248fe395748bd6025d43c002db5a7d343 data/create/recipes/small_deepslate_brick_stairs_from_stone_types_deepslate_stonecutting.json 96e2c36ac2f2899c9681f12f43c8ae232ae09180 data/create/recipes/small_deepslate_brick_wall.json e5644f4227b9cc9b98158ce3ded98bff1ffb97f9 data/create/recipes/small_deepslate_brick_wall_from_stone_types_deepslate_stonecutting.json -38b80603a86df24f6be0df9fd5f7d9b7aa33d2f9 data/create/recipes/small_diorite_bricks_from_stone_types_diorite_stonecutting.json +e7a3cb889ce6b530cd40f19e23bad943374e61b5 data/create/recipes/small_deepslate_bricks_from_stone_types_deepslate_stonecutting.json 6c66b44941c8b97cfec5948b5d8b08355f8d8f67 data/create/recipes/small_diorite_brick_slab.json 801f6cc6e06db56344b37c9b76c69f921c6d9293 data/create/recipes/small_diorite_brick_slab_from_stone_types_diorite_stonecutting.json c1fe4bff306e2d2b5d5595e4b35dd85f7e6bf0ce data/create/recipes/small_diorite_brick_slab_recycling.json @@ -4579,7 +4080,7 @@ af6feedf00bdfa45c1b8f0dd46ddaa80da622fed data/create/recipes/small_diorite_brick 30a6f2bdfec2b3f578572c9f94112906411e7c54 data/create/recipes/small_diorite_brick_stairs_from_stone_types_diorite_stonecutting.json 8728b791808736de2ac31e8dc81aa43638ae0ac8 data/create/recipes/small_diorite_brick_wall.json 7a1fdcef7091d76230fbee410fa5241f584845c4 data/create/recipes/small_diorite_brick_wall_from_stone_types_diorite_stonecutting.json -8840d538648516dd02628fbe3ea4f032ceda78bb data/create/recipes/small_dripstone_bricks_from_stone_types_dripstone_stonecutting.json +38b80603a86df24f6be0df9fd5f7d9b7aa33d2f9 data/create/recipes/small_diorite_bricks_from_stone_types_diorite_stonecutting.json 39a545b60040bd2d922cd3bd5af5036b1b9b23ef data/create/recipes/small_dripstone_brick_slab.json c91e4dc211305456c38e5823def91811ad851202 data/create/recipes/small_dripstone_brick_slab_from_stone_types_dripstone_stonecutting.json 55bb37d07e841bb8eecf2013445c01c8e09ff824 data/create/recipes/small_dripstone_brick_slab_recycling.json @@ -4587,7 +4088,7 @@ c91e4dc211305456c38e5823def91811ad851202 data/create/recipes/small_dripstone_bri 1e23c8df90aef6cd3561369f72c6c3106da883f5 data/create/recipes/small_dripstone_brick_stairs_from_stone_types_dripstone_stonecutting.json fda46cc15c21e7843537df5b5331874fd7511e19 data/create/recipes/small_dripstone_brick_wall.json 336e47b35437ffea4bb86d34f94e6361b2bbcfb0 data/create/recipes/small_dripstone_brick_wall_from_stone_types_dripstone_stonecutting.json -42c74dec6c64d3675e15b2b73cb32fc9d24839e9 data/create/recipes/small_granite_bricks_from_stone_types_granite_stonecutting.json +8840d538648516dd02628fbe3ea4f032ceda78bb data/create/recipes/small_dripstone_bricks_from_stone_types_dripstone_stonecutting.json d1bb4e91d80ca8eb9c2f935cbb66ef08b9ca7059 data/create/recipes/small_granite_brick_slab.json ddb2f4652607b56332a927af939212a5789a34db data/create/recipes/small_granite_brick_slab_from_stone_types_granite_stonecutting.json f1388636bcf98d7d9103c23528053b28c6305b4e data/create/recipes/small_granite_brick_slab_recycling.json @@ -4595,7 +4096,7 @@ f1388636bcf98d7d9103c23528053b28c6305b4e data/create/recipes/small_granite_brick ba935a3d64eedbd9b7017d0abfab351f57589593 data/create/recipes/small_granite_brick_stairs_from_stone_types_granite_stonecutting.json dac22c54e8034587a3fcf3aa0ce19bb4b7607cd7 data/create/recipes/small_granite_brick_wall.json 7a8d9e2291675de9e72363d93410de9039216f32 data/create/recipes/small_granite_brick_wall_from_stone_types_granite_stonecutting.json -714f6a84a5b3d5d57c07364925555e6f545b0b3d data/create/recipes/small_limestone_bricks_from_stone_types_limestone_stonecutting.json +42c74dec6c64d3675e15b2b73cb32fc9d24839e9 data/create/recipes/small_granite_bricks_from_stone_types_granite_stonecutting.json b844632a588cb96397750f4387c7e6517f85092c data/create/recipes/small_limestone_brick_slab.json a1c0bc263cd4659a89213f4fcdd87eba7ae04427 data/create/recipes/small_limestone_brick_slab_from_stone_types_limestone_stonecutting.json ec9154a3791113f57dc1c16dfef4c837533b6fc6 data/create/recipes/small_limestone_brick_slab_recycling.json @@ -4603,7 +4104,7 @@ ec9154a3791113f57dc1c16dfef4c837533b6fc6 data/create/recipes/small_limestone_bri 6943fdc8162e4d53c459f425b2ff5b34e9caa477 data/create/recipes/small_limestone_brick_stairs_from_stone_types_limestone_stonecutting.json 27ff69345efea14b9688fe9b182809995ea8ad4a data/create/recipes/small_limestone_brick_wall.json 98a83f757f0ac9cc2a876ae407bb5765071e700d data/create/recipes/small_limestone_brick_wall_from_stone_types_limestone_stonecutting.json -22c69e391110280e13d50693b9c81355da57a315 data/create/recipes/small_ochrum_bricks_from_stone_types_ochrum_stonecutting.json +714f6a84a5b3d5d57c07364925555e6f545b0b3d data/create/recipes/small_limestone_bricks_from_stone_types_limestone_stonecutting.json abdd280694cb30ce0d2703aadeeb378af9a7f8b2 data/create/recipes/small_ochrum_brick_slab.json e37612fa2523fa3711242cac4ec5e596b3e55698 data/create/recipes/small_ochrum_brick_slab_from_stone_types_ochrum_stonecutting.json 8f3f47cb3e759104cf86a422339345f8795143d3 data/create/recipes/small_ochrum_brick_slab_recycling.json @@ -4611,8 +4112,8 @@ de8d7f8e57645c0b5a6e98eb0cc4e573c5cf96ac data/create/recipes/small_ochrum_brick_ 04ebbdd14f81f4b4dc7986cb5241caa9f48f4ff1 data/create/recipes/small_ochrum_brick_stairs_from_stone_types_ochrum_stonecutting.json 07876725f97ff611f8d1710462224f07cab3ebbd data/create/recipes/small_ochrum_brick_wall.json 2331801569ec95562afc802f7e2ff191d329a5c6 data/create/recipes/small_ochrum_brick_wall_from_stone_types_ochrum_stonecutting.json +22c69e391110280e13d50693b9c81355da57a315 data/create/recipes/small_ochrum_bricks_from_stone_types_ochrum_stonecutting.json 68a9f80b97d9322ed33067d7717180494b904bed data/create/recipes/small_rose_quartz_tiles_from_polished_rose_quartz_stonecutting.json -bf27af2e54ed1b09611d67ee7afa6c7f56d00d09 data/create/recipes/small_scorchia_bricks_from_stone_types_scorchia_stonecutting.json 133057778480e1d2e13fe7b2766ba0891feea3a5 data/create/recipes/small_scorchia_brick_slab.json dad342d215c98f3214752e0ebfaf3015943c5ac7 data/create/recipes/small_scorchia_brick_slab_from_stone_types_scorchia_stonecutting.json 0a57ad5fce22d69cdc1dd880403612ffb47af4ba data/create/recipes/small_scorchia_brick_slab_recycling.json @@ -4620,7 +4121,7 @@ dad342d215c98f3214752e0ebfaf3015943c5ac7 data/create/recipes/small_scorchia_bric 7f89c9c6dcea06a3022c72029a5e547aa1721773 data/create/recipes/small_scorchia_brick_stairs_from_stone_types_scorchia_stonecutting.json 43310b3fa43bd791ef0e2e30971a24e788c20139 data/create/recipes/small_scorchia_brick_wall.json de8edc4fa5eec031ad0a63c7f59141985ae9af9e data/create/recipes/small_scorchia_brick_wall_from_stone_types_scorchia_stonecutting.json -b1a67d052e26c2129c34ee0732cfe533beb3e571 data/create/recipes/small_scoria_bricks_from_stone_types_scoria_stonecutting.json +bf27af2e54ed1b09611d67ee7afa6c7f56d00d09 data/create/recipes/small_scorchia_bricks_from_stone_types_scorchia_stonecutting.json d8a41adcc6ae9b0eb71a83b2dd89ff92a10e0057 data/create/recipes/small_scoria_brick_slab.json 34f4dd094f2949e3fd21f95ac890ae803b81fbea data/create/recipes/small_scoria_brick_slab_from_stone_types_scoria_stonecutting.json f15ad1cb05f5b02b630b982d23bd951178a3650c data/create/recipes/small_scoria_brick_slab_recycling.json @@ -4628,7 +4129,7 @@ df5a1437fb112519d904cc9f1cd28d5d891fb04d data/create/recipes/small_scoria_brick_ d36428daf8bf4e560f649e5eb40a8cd7a27e7a0e data/create/recipes/small_scoria_brick_stairs_from_stone_types_scoria_stonecutting.json cad432398d8886d60b94e96b2c2096ae27fffb50 data/create/recipes/small_scoria_brick_wall.json 9cff8370aaa81ece466fe15642c00a9992bd416c data/create/recipes/small_scoria_brick_wall_from_stone_types_scoria_stonecutting.json -e51ced16059f7c37fe3652a1cf4d938f91e956fc data/create/recipes/small_tuff_bricks_from_stone_types_tuff_stonecutting.json +b1a67d052e26c2129c34ee0732cfe533beb3e571 data/create/recipes/small_scoria_bricks_from_stone_types_scoria_stonecutting.json dd83af4a10a9b0ba6a4efb272d8b6b1611524a39 data/create/recipes/small_tuff_brick_slab.json e3a12b87830e47387e9ac118bb3d12b73558d757 data/create/recipes/small_tuff_brick_slab_from_stone_types_tuff_stonecutting.json 85dff00dc49eaf65f1f149a7f21a9f307b1b9710 data/create/recipes/small_tuff_brick_slab_recycling.json @@ -4636,7 +4137,7 @@ e03a8270b01b9a5cad238db4ce2b8f66ea78e8bf data/create/recipes/small_tuff_brick_st cd50bb5842c90038f6ac74e45971ab2e914d1463 data/create/recipes/small_tuff_brick_stairs_from_stone_types_tuff_stonecutting.json e795fbe5062ec47cc660ee26c8398477509c5f18 data/create/recipes/small_tuff_brick_wall.json 34471a7ebb431b6d1e3be5fa480b800b96556fee data/create/recipes/small_tuff_brick_wall_from_stone_types_tuff_stonecutting.json -82f17edc61a319c74dbdfa730584305899bd7572 data/create/recipes/small_veridium_bricks_from_stone_types_veridium_stonecutting.json +e51ced16059f7c37fe3652a1cf4d938f91e956fc data/create/recipes/small_tuff_bricks_from_stone_types_tuff_stonecutting.json f9a2f4ca078364e05b3446fe890ea207e5a56e87 data/create/recipes/small_veridium_brick_slab.json 234c3baee4c9428caab3e344f396ec87064103e3 data/create/recipes/small_veridium_brick_slab_from_stone_types_veridium_stonecutting.json b0db8335e3c7fd88f074c3895bea952efc0e8df8 data/create/recipes/small_veridium_brick_slab_recycling.json @@ -4644,6 +4145,7 @@ a1e214c230574526ca0a2fec059b4157ddec557d data/create/recipes/small_veridium_bric f63031587a64ed88ddba1df07767dd8d8caa1d2e data/create/recipes/small_veridium_brick_stairs_from_stone_types_veridium_stonecutting.json 9b003fbf2bcd975501ba307ea68c6c4bab397683 data/create/recipes/small_veridium_brick_wall.json 1ba48c5cae05b6f4b1ad223ce80925f1eaaf5dfd data/create/recipes/small_veridium_brick_wall_from_stone_types_veridium_stonecutting.json +82f17edc61a319c74dbdfa730584305899bd7572 data/create/recipes/small_veridium_bricks_from_stone_types_veridium_stonecutting.json 47973044b19b35ce169e7d46abc9d11a2f67a487 data/create/recipes/spruce_window.json 810544f79bf4b002981e614eaa8e49b48a7b5397 data/create/recipes/spruce_window_pane.json e343a80c92dab60f99c9b441d00189aceee477a0 data/create/recipes/tiled_glass_from_glass_colorless_stonecutting.json @@ -4664,9 +4166,6 @@ fdd28fc956dbec71ba24cdea5adfc049d6eb31e3 data/create/recipes/tuff_pillar_from_st 93c61ebeda451ebeb37c3047459f95f14fa9f1f9 data/create/recipes/weathered_copper_tile_slab_from_weathered_copper_tiles_stonecutting.json 8a32b955b4320eddff017378785d1c95e1434229 data/create/recipes/weathered_copper_tile_stairs.json f1a03ac86925e26cbec6aeeada2eafb40008fc8e data/create/recipes/weathered_copper_tile_stairs_from_weathered_copper_tiles_stonecutting.json -4b5fc518830e3c57471f930deacf0abee4ae6313 data/create/recipes/weathered_iron_block_from_ingots_iron_stonecutting.json -a57dfe9974b8b6d338b9ab4ae124297fda7780b9 data/create/recipes/weathered_iron_window.json -11034a79e8f167249b78e6e3863e01991ac9d778 data/create/recipes/weathered_iron_window_pane.json f365be4eda73234b73aa49c97b065f1a8baafbf6 data/create/tags/blocks/brittle.json 8b6c0b444b15f7fb2d55b9cbcb68537c1269f877 data/create/tags/blocks/casing.json 35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/create/tags/blocks/contraption_inventory_deny.json @@ -4683,17 +4182,15 @@ f675c20350ed60da4878b5d6301f02c8c05624bd data/create/tags/blocks/fan_processing_ 4970078b49ddac1b1d500ed0469cedf42bdc3d35 data/create/tags/blocks/non_movable.json 06e13efbb7b0d09ff7ecd1a7dc45a0760b91ad67 data/create/tags/blocks/ore_override_stone.json a5874f73c7dc0a3ae12999e6ae8abf45bc7fb9be data/create/tags/blocks/passive_boiler_heaters.json -f400870b8dbcd14238be3ec99c419093073ba3a6 data/create/tags/blocks/postboxes.json 9bc8c13fd80bdbe7f767b91ee1a1042e9aff02b0 data/create/tags/blocks/roots.json -55dccb895bbdacfbd6ee9005486cd3fe9df01249 data/create/tags/blocks/safe_nbt.json +79ed9149ee2ce143114db4ccafda8a2b6a293aac data/create/tags/blocks/safe_nbt.json 79418bd729cef417b322cef9b491e7ae83317d61 data/create/tags/blocks/seats.json -8a6ad3c63fb0c436ec8109f39358213930effd5a data/create/tags/blocks/table_cloths.json 5def5088f7fd31b80e6f28c1c4ea146aa9d7d15b data/create/tags/blocks/toolboxes.json 2589b135c0e96ad29076569e144528fe32ea5b39 data/create/tags/blocks/tracks.json 1b6977d9a399cf6ee042e3f8f5e64e4d3cda5489 data/create/tags/blocks/tree_attachments.json da739ad2160e7df4e0e5cc89587670ce5e9450c3 data/create/tags/blocks/valve_handles.json 72143286fb5cb372a0696550e2eac76ca50e6fbc data/create/tags/blocks/windmill_sails.json -30a54ad8eb06f2335705f5f01d12085ab4841dff data/create/tags/blocks/wrench_pickup.json +58987ea71d488cc48192ceb00c00aa2903e51304 data/create/tags/blocks/wrench_pickup.json 76c0522664726c09461ad4565b6fba80b4f816b2 data/create/tags/entity_types/blaze_burner_capturable.json 35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/create/tags/entity_types/ignore_seat.json 894e1e4fd1e32712abdda18ec64ab13750d3c039 data/create/tags/fluids/bottomless/allow.json @@ -4709,13 +4206,9 @@ f43cac8216e2a9347e48cf93a43de95dd810ca20 data/create/tags/items/contraption_cont d371dfd35e49a7bef19f59c03e7f4ae20992f03d data/create/tags/items/create_ingots.json 910d0f5ccbc4c84b224eca1f1588b1695f41447b data/create/tags/items/crushed_raw_materials.json 0fa526e7e742573b603ad26b09526cf724efa1dc data/create/tags/items/deployable_drink.json -ebd7b09daf2f64c0c04d821696b0e145683d8693 data/create/tags/items/dyed_table_cloths.json 1cebeb92bd514b75d54ac6d5708047801f0501c5 data/create/tags/items/modded_stripped_logs.json 586f8fc5a8b8559c9dc0017e13c78ad918688fae data/create/tags/items/modded_stripped_wood.json -b96668734c9b7a90348235217512d49193e4ea7f data/create/tags/items/packages.json -f400870b8dbcd14238be3ec99c419093073ba3a6 data/create/tags/items/postboxes.json 695d75b352fd190b303c724d1aaee9bb786a903b data/create/tags/items/pressurized_air_sources.json -22c4d4e033a61942b170aa309ed46a89a0ba0c65 data/create/tags/items/pulpifiable.json 2cd3adffd8b151354df137a990dcb97996a665bb data/create/tags/items/sandpaper.json 79418bd729cef417b322cef9b491e7ae83317d61 data/create/tags/items/seats.json e02cb3bc2373336dc04495b0b414107f6f754b61 data/create/tags/items/sleepers.json @@ -4736,7 +4229,6 @@ e22493305e0cebfb7ededae122e19ee9dd24fc9d data/create/tags/items/stone_types/scor 8034ddb85922b193ad1e6251fc6b856b4ae622b1 data/create/tags/items/stone_types/scoria.json 7e4d20c52a25a0c0d13e0122be0250718a9fb645 data/create/tags/items/stone_types/tuff.json 076c79e07eb3a65d74107577dbfd993b13780637 data/create/tags/items/stone_types/veridium.json -8a6ad3c63fb0c436ec8109f39358213930effd5a data/create/tags/items/table_cloths.json 5def5088f7fd31b80e6f28c1c4ea146aa9d7d15b data/create/tags/items/toolboxes.json 2589b135c0e96ad29076569e144528fe32ea5b39 data/create/tags/items/tracks.json a5b5711d1798473a9b25db5b7f749570ed0a2769 data/create/tags/items/upgrade_aquatic/coral.json @@ -4746,27 +4238,23 @@ c59c9fc0cdd45de659aa8023d36f9decb90f708c data/create/tags/items/vanilla_stripped 64441ac1daa64c81601b94b82b21c0ee862b6344 data/create/tags/items/vanilla_stripped_wood.json edf7390f09e622193bbc720ec51ba128ea1e96e6 data/curios/tags/items/head.json 10d5f0c1763f80860a39398ecc33dbbe43099471 data/forge/tags/blocks/glass/colorless.json -220b4c682f6cf536534e7cd6a79a9acc811bacd2 data/forge/tags/blocks/glass_panes.json +de1fc89be6a52473d526d3efe0204b9b8489058c data/forge/tags/blocks/glass_panes.json 81b107ada9c6ac5679a21f8c6a006bf230f69c39 data/forge/tags/blocks/ores.json 81b107ada9c6ac5679a21f8c6a006bf230f69c39 data/forge/tags/blocks/ores/zinc.json e475ad1c52bffedfc544e5331a87c1f5c45149fd data/forge/tags/blocks/ores_in_ground/deepslate.json 2f6068972e364599b6849dc46fcb0724d4219d53 data/forge/tags/blocks/ores_in_ground/stone.json 2589b135c0e96ad29076569e144528fe32ea5b39 data/forge/tags/blocks/relocation_not_supported.json -807ea01d3b028bd226ed0befc142cbd23647e998 data/forge/tags/blocks/storage_blocks.json +b3af02a6fa3dc41bc3f4db933485f22b202deea3 data/forge/tags/blocks/storage_blocks.json 7d10cdf9e46a79753d4437c7bb958e3ab8bf0c89 data/forge/tags/blocks/storage_blocks/andesite_alloy.json 70bba470740dc7a77f51b4cb1747a105b62d4bde data/forge/tags/blocks/storage_blocks/brass.json -18f54179c6f809ff4aee792702fa35d3053e5dc4 data/forge/tags/blocks/storage_blocks/cardboard.json bcd593714f43bc6a0aefbd714c24db3cf9e71250 data/forge/tags/blocks/storage_blocks/raw_zinc.json 41b2a17b5ebcff5623e25dc6232f73cf9aa70387 data/forge/tags/blocks/storage_blocks/zinc.json 8140415f1c16f09167f41eeee25c09706a944be0 data/forge/tags/fluids/chocolate.json 0ccc9ff76001cdd7db1b79c1371f59d3283abe64 data/forge/tags/fluids/honey.json cca816b34ac2e9b7933df680aa9778ff2cfe9605 data/forge/tags/fluids/tea.json -1a9ce7d5f5fe92d3b73e269cd5dbf5cd1f1fe5b8 data/forge/tags/items/armors/boots.json -6749b53c23aefe4baa55c4b2f624bbc6dfe5f423 data/forge/tags/items/armors/chestplate.json +00c856dcfa4368cca671ee5d93c4900835991d68 data/forge/tags/items/armors/boots.json 695d75b352fd190b303c724d1aaee9bb786a903b data/forge/tags/items/armors/chestplates.json -5b91b107f48b47958db20f13cb3cc0c6f7085fdc data/forge/tags/items/armors/helmet.json 3580dae058fc75b45fab4c4ebbd1b01573ba9e11 data/forge/tags/items/armors/helmets.json -afdac448376ff5624f49cbf31feedf691ecbc4c5 data/forge/tags/items/armors/leggings.json 06ebf72e8f6c081862236d4b068b5dfb275a8385 data/forge/tags/items/buckets/honey.json 801d097b0af7153e0c5c72a924d61f8afb4cf264 data/forge/tags/items/dough.json 801d097b0af7153e0c5c72a924d61f8afb4cf264 data/forge/tags/items/dough/wheat.json @@ -4774,7 +4262,7 @@ afdac448376ff5624f49cbf31feedf691ecbc4c5 data/forge/tags/items/armors/leggings.j 745512f10c4ba52f2c224607377e41011fb2ecfe data/forge/tags/items/flour.json 745512f10c4ba52f2c224607377e41011fb2ecfe data/forge/tags/items/flour/wheat.json 10d5f0c1763f80860a39398ecc33dbbe43099471 data/forge/tags/items/glass/colorless.json -220b4c682f6cf536534e7cd6a79a9acc811bacd2 data/forge/tags/items/glass_panes.json +de1fc89be6a52473d526d3efe0204b9b8489058c data/forge/tags/items/glass_panes.json 01d32d3b7b033aff44c047bf289d696de0b0c715 data/forge/tags/items/ingots.json 5a7bffd1d604bc6ea8b35714ef02b95773240f90 data/forge/tags/items/ingots/brass.json ccf5b08295f6362a3f6b3b595f1de1bba4b224ec data/forge/tags/items/ingots/zinc.json @@ -4788,17 +4276,15 @@ e475ad1c52bffedfc544e5331a87c1f5c45149fd data/forge/tags/items/ores_in_ground/de 2f6068972e364599b6849dc46fcb0724d4219d53 data/forge/tags/items/ores_in_ground/stone.json 12c3455bbb7edcea84d47ad6ccde9c209a25d811 data/forge/tags/items/plates.json 23f4874238f7d06e80c699b672d4e9fab6eb464f data/forge/tags/items/plates/brass.json -7f3f85d0978bc274e4689fbf41f7b80b023b7a05 data/forge/tags/items/plates/cardboard.json ef5256892a9d4167bf7371c7138a933a107a123a data/forge/tags/items/plates/copper.json 3ca40ae504b1f68d6e7279726a2bf411509ce322 data/forge/tags/items/plates/gold.json 6f72d5205b399f03e481cee15bd5c085bfe6fe3c data/forge/tags/items/plates/iron.json 07a6e69488ff6994a9ef1cca75b6e911bc3e3358 data/forge/tags/items/plates/obsidian.json 30496416fffaf4f845052a264023e64e52894ee7 data/forge/tags/items/raw_materials.json 30496416fffaf4f845052a264023e64e52894ee7 data/forge/tags/items/raw_materials/zinc.json -807ea01d3b028bd226ed0befc142cbd23647e998 data/forge/tags/items/storage_blocks.json +b3af02a6fa3dc41bc3f4db933485f22b202deea3 data/forge/tags/items/storage_blocks.json 7d10cdf9e46a79753d4437c7bb958e3ab8bf0c89 data/forge/tags/items/storage_blocks/andesite_alloy.json 70bba470740dc7a77f51b4cb1747a105b62d4bde data/forge/tags/items/storage_blocks/brass.json -18f54179c6f809ff4aee792702fa35d3053e5dc4 data/forge/tags/items/storage_blocks/cardboard.json bcd593714f43bc6a0aefbd714c24db3cf9e71250 data/forge/tags/items/storage_blocks/raw_zinc.json 41b2a17b5ebcff5623e25dc6232f73cf9aa70387 data/forge/tags/items/storage_blocks/zinc.json b69fcc7227d44fc000c8ab94524230f55b89aa27 data/forge/tags/items/stripped_logs.json @@ -4809,10 +4295,10 @@ c741ba83b562ae3459d7c4f2db69537f549ea411 data/forge/tags/items/tools/wrench.json 82274e06b6a9f3bfd83c8b59be38dee4a15b8bf3 data/minecraft/tags/blocks/climbable.json 71aef080a900d9e86818cf579438c3d826d6567e data/minecraft/tags/blocks/doors.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/dripstone_replaceable_blocks.json -f8bd9b33238ab9f2f2a83b63bf0c52fbf705b452 data/minecraft/tags/blocks/impermeable.json +e3321ff14704c031a2c16953b7e391f4f24dd70b data/minecraft/tags/blocks/impermeable.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/lush_ground_replaceable.json -632b3589bae819777af7129b534f1c10e810cf5d data/minecraft/tags/blocks/mineable/axe.json -47df6c90d9474d7a708063b0207e520ad01f1998 data/minecraft/tags/blocks/mineable/pickaxe.json +5a030817b2322e363edc8f5376f7c9de73df8b48 data/minecraft/tags/blocks/mineable/axe.json +d794a156fdc9ec9e7c935b3b8962206b7b82eb79 data/minecraft/tags/blocks/mineable/pickaxe.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/moss_replaceable.json 0c13aae0eeb99e89febe8dbe5e002af2ff843a9e data/minecraft/tags/blocks/needs_iron_tool.json 3cb2a92cbdf32ed5978f740dc378d363306c3e84 data/minecraft/tags/blocks/needs_stone_tool.json @@ -4828,6 +4314,5 @@ dafa3bdb72fef5e6c0201c05846db3f2b214e587 data/minecraft/tags/blocks/stairs.json 1ac7c46815461cbec0d4d97f25c085fdc8375dab data/minecraft/tags/items/slabs.json dafa3bdb72fef5e6c0201c05846db3f2b214e587 data/minecraft/tags/items/stairs.json 11427a72e181857e22ec37a22462bc652e127cc5 data/minecraft/tags/items/trapdoors.json -15d3621abbef2048a7c258d410e40d9d87e55dd7 data/minecraft/tags/items/trimmable_armor.json 2bcba05954ff7bc4cf9cc520478083da9973ec76 data/minecraft/tags/items/walls.json 71aef080a900d9e86818cf579438c3d826d6567e data/quark/tags/blocks/non_double_door.json diff --git a/src/generated/resources/assets/create/models/item/acacia_window_pane.json b/src/generated/resources/assets/create/models/item/acacia_window_pane.json index 03ea16c3ac..9ccf7a224c 100644 --- a/src/generated/resources/assets/create/models/item/acacia_window_pane.json +++ b/src/generated/resources/assets/create/models/item/acacia_window_pane.json @@ -1,7 +1,6 @@ { - "parent": "create:item/pane", + "parent": "minecraft:item/generated", "textures": { - "edge": "minecraft:block/acacia_planks", - "pane": "create:block/palettes/acacia_window" + "layer0": "create:block/palettes/acacia_window" } } \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/andesite_bars.json b/src/generated/resources/assets/create/models/item/andesite_bars.json index a881e12f6b..ee12bac6c3 100644 --- a/src/generated/resources/assets/create/models/item/andesite_bars.json +++ b/src/generated/resources/assets/create/models/item/andesite_bars.json @@ -1,7 +1,6 @@ { - "parent": "create:item/bars", + "parent": "minecraft:item/generated", "textures": { - "bars": "create:block/bars/andesite_bars", - "edge": "create:block/bars/andesite_bars_edge" + "layer0": "create:block/bars/andesite_bars" } } \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/birch_window_pane.json b/src/generated/resources/assets/create/models/item/birch_window_pane.json index 3eb2e72698..f7e09d8f24 100644 --- a/src/generated/resources/assets/create/models/item/birch_window_pane.json +++ b/src/generated/resources/assets/create/models/item/birch_window_pane.json @@ -1,7 +1,6 @@ { - "parent": "create:item/pane", + "parent": "minecraft:item/generated", "textures": { - "edge": "minecraft:block/birch_planks", - "pane": "create:block/palettes/birch_window" + "layer0": "create:block/palettes/birch_window" } } \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/brass_bars.json b/src/generated/resources/assets/create/models/item/brass_bars.json index e1b32edd80..8140aae6b3 100644 --- a/src/generated/resources/assets/create/models/item/brass_bars.json +++ b/src/generated/resources/assets/create/models/item/brass_bars.json @@ -1,7 +1,6 @@ { - "parent": "create:item/bars", + "parent": "minecraft:item/generated", "textures": { - "bars": "create:block/bars/brass_bars", - "edge": "create:block/bars/brass_bars_edge" + "layer0": "create:block/bars/brass_bars" } } \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/copper_bars.json b/src/generated/resources/assets/create/models/item/copper_bars.json index 66553f12e1..eeb2a9d626 100644 --- a/src/generated/resources/assets/create/models/item/copper_bars.json +++ b/src/generated/resources/assets/create/models/item/copper_bars.json @@ -1,7 +1,6 @@ { - "parent": "create:item/bars", + "parent": "minecraft:item/generated", "textures": { - "bars": "create:block/bars/copper_bars", - "edge": "create:block/bars/copper_bars_edge" + "layer0": "create:block/bars/copper_bars" } } \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/crimson_window_pane.json b/src/generated/resources/assets/create/models/item/crimson_window_pane.json index 496b0c0fc4..d12dce270a 100644 --- a/src/generated/resources/assets/create/models/item/crimson_window_pane.json +++ b/src/generated/resources/assets/create/models/item/crimson_window_pane.json @@ -1,7 +1,6 @@ { - "parent": "create:item/pane", + "parent": "minecraft:item/generated", "textures": { - "edge": "minecraft:block/crimson_planks", - "pane": "create:block/palettes/crimson_window" + "layer0": "create:block/palettes/crimson_window" } } \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/dark_oak_window_pane.json b/src/generated/resources/assets/create/models/item/dark_oak_window_pane.json index ea970f28e1..b618ec86cc 100644 --- a/src/generated/resources/assets/create/models/item/dark_oak_window_pane.json +++ b/src/generated/resources/assets/create/models/item/dark_oak_window_pane.json @@ -1,7 +1,6 @@ { - "parent": "create:item/pane", + "parent": "minecraft:item/generated", "textures": { - "edge": "minecraft:block/dark_oak_planks", - "pane": "create:block/palettes/dark_oak_window" + "layer0": "create:block/palettes/dark_oak_window" } } \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/framed_glass_pane.json b/src/generated/resources/assets/create/models/item/framed_glass_pane.json index 1d48f846b8..34cd0fa5d8 100644 --- a/src/generated/resources/assets/create/models/item/framed_glass_pane.json +++ b/src/generated/resources/assets/create/models/item/framed_glass_pane.json @@ -1,7 +1,6 @@ { - "parent": "create:item/pane", + "parent": "minecraft:item/generated", "textures": { - "edge": "create:block/palettes/framed_glass_pane_top", - "pane": "create:block/palettes/framed_glass" + "layer0": "create:block/palettes/framed_glass" } } \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/horizontal_framed_glass_pane.json b/src/generated/resources/assets/create/models/item/horizontal_framed_glass_pane.json index 5b8c4b78c6..19ba12ca20 100644 --- a/src/generated/resources/assets/create/models/item/horizontal_framed_glass_pane.json +++ b/src/generated/resources/assets/create/models/item/horizontal_framed_glass_pane.json @@ -1,7 +1,6 @@ { - "parent": "create:item/pane", + "parent": "minecraft:item/generated", "textures": { - "edge": "create:block/palettes/framed_glass_pane_top", - "pane": "create:block/palettes/horizontal_framed_glass" + "layer0": "create:block/palettes/horizontal_framed_glass" } } \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/jungle_window_pane.json b/src/generated/resources/assets/create/models/item/jungle_window_pane.json index 9f783191e1..561935c644 100644 --- a/src/generated/resources/assets/create/models/item/jungle_window_pane.json +++ b/src/generated/resources/assets/create/models/item/jungle_window_pane.json @@ -1,7 +1,6 @@ { - "parent": "create:item/pane", + "parent": "minecraft:item/generated", "textures": { - "edge": "minecraft:block/jungle_planks", - "pane": "create:block/palettes/jungle_window" + "layer0": "create:block/palettes/jungle_window" } } \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/mangrove_window_pane.json b/src/generated/resources/assets/create/models/item/mangrove_window_pane.json index e34b9714e4..5af42dbe6b 100644 --- a/src/generated/resources/assets/create/models/item/mangrove_window_pane.json +++ b/src/generated/resources/assets/create/models/item/mangrove_window_pane.json @@ -1,7 +1,6 @@ { - "parent": "create:item/pane", + "parent": "minecraft:item/generated", "textures": { - "edge": "minecraft:block/mangrove_planks", - "pane": "create:block/palettes/mangrove_window" + "layer0": "create:block/palettes/mangrove_window" } } \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/oak_window_pane.json b/src/generated/resources/assets/create/models/item/oak_window_pane.json index fad014834e..62417042b4 100644 --- a/src/generated/resources/assets/create/models/item/oak_window_pane.json +++ b/src/generated/resources/assets/create/models/item/oak_window_pane.json @@ -1,7 +1,6 @@ { - "parent": "create:item/pane", + "parent": "minecraft:item/generated", "textures": { - "edge": "minecraft:block/oak_planks", - "pane": "create:block/palettes/oak_window" + "layer0": "create:block/palettes/oak_window" } } \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/ornate_iron_window_pane.json b/src/generated/resources/assets/create/models/item/ornate_iron_window_pane.json index e522e49a62..e15dab88e9 100644 --- a/src/generated/resources/assets/create/models/item/ornate_iron_window_pane.json +++ b/src/generated/resources/assets/create/models/item/ornate_iron_window_pane.json @@ -1,7 +1,6 @@ { - "parent": "create:item/pane", + "parent": "minecraft:item/generated", "textures": { - "edge": "create:block/palettes/ornate_iron_window_pane_top", - "pane": "create:block/palettes/ornate_iron_window" + "layer0": "create:block/palettes/ornate_iron_window" } } \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/spruce_window_pane.json b/src/generated/resources/assets/create/models/item/spruce_window_pane.json index f6f6c6e7d3..b40d8d6d35 100644 --- a/src/generated/resources/assets/create/models/item/spruce_window_pane.json +++ b/src/generated/resources/assets/create/models/item/spruce_window_pane.json @@ -1,7 +1,6 @@ { - "parent": "create:item/pane", + "parent": "minecraft:item/generated", "textures": { - "edge": "minecraft:block/spruce_planks", - "pane": "create:block/palettes/spruce_window" + "layer0": "create:block/palettes/spruce_window" } } \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/tiled_glass_pane.json b/src/generated/resources/assets/create/models/item/tiled_glass_pane.json index 8223e7d169..d9c1453d35 100644 --- a/src/generated/resources/assets/create/models/item/tiled_glass_pane.json +++ b/src/generated/resources/assets/create/models/item/tiled_glass_pane.json @@ -1,7 +1,6 @@ { - "parent": "create:item/pane", + "parent": "minecraft:item/generated", "textures": { - "edge": "minecraft:block/glass_pane_top", - "pane": "create:block/palettes/tiled_glass" + "layer0": "create:block/palettes/tiled_glass" } } \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/vertical_framed_glass_pane.json b/src/generated/resources/assets/create/models/item/vertical_framed_glass_pane.json index c5df1d782b..6c15091d70 100644 --- a/src/generated/resources/assets/create/models/item/vertical_framed_glass_pane.json +++ b/src/generated/resources/assets/create/models/item/vertical_framed_glass_pane.json @@ -1,7 +1,6 @@ { - "parent": "create:item/pane", + "parent": "minecraft:item/generated", "textures": { - "edge": "create:block/palettes/framed_glass_pane_top", - "pane": "create:block/palettes/vertical_framed_glass" + "layer0": "create:block/palettes/vertical_framed_glass" } } \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/warped_window_pane.json b/src/generated/resources/assets/create/models/item/warped_window_pane.json index c8569bb459..9158d904b2 100644 --- a/src/generated/resources/assets/create/models/item/warped_window_pane.json +++ b/src/generated/resources/assets/create/models/item/warped_window_pane.json @@ -1,7 +1,6 @@ { - "parent": "create:item/pane", + "parent": "minecraft:item/generated", "textures": { - "edge": "minecraft:block/warped_planks", - "pane": "create:block/palettes/warped_window" + "layer0": "create:block/palettes/warped_window" } } \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/foundation/data/MetalBarsGen.java b/src/main/java/com/simibubi/create/foundation/data/MetalBarsGen.java index 3dc5b325d6..86e73e8148 100644 --- a/src/main/java/com/simibubi/create/foundation/data/MetalBarsGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/MetalBarsGen.java @@ -136,9 +136,7 @@ public class MetalBarsGen { .item() .model((c, p) -> { ResourceLocation barsTexture = p.modLoc("block/bars/" + name + "_bars"); - p.withExistingParent(c.getName(), Create.asResource("item/bars")) - .texture("bars", barsTexture) - .texture("edge", specialEdge ? p.modLoc("block/bars/" + name + "_bars_edge") : barsTexture); + p.generated(c, barsTexture); }) .recipe((c, p) -> p.stonecutting(ingredient.get(), RecipeCategory.DECORATIONS, c::get, 4)) .build() diff --git a/src/main/java/com/simibubi/create/foundation/data/WindowGen.java b/src/main/java/com/simibubi/create/foundation/data/WindowGen.java index b94a1e6604..7dd4deea70 100644 --- a/src/main/java/com/simibubi/create/foundation/data/WindowGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/WindowGen.java @@ -41,6 +41,7 @@ import net.minecraft.world.level.block.state.BlockBehaviour.Properties; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.WoodType; import net.minecraft.world.level.material.MapColor; + import net.minecraftforge.client.model.generators.ConfiguredModel; import net.minecraftforge.client.model.generators.ModelFile; import net.minecraftforge.common.Tags; @@ -68,8 +69,8 @@ public class WindowGen { } public static BlockBuilder randomisedWindowBlock(String name, - Supplier ingredient, Supplier> renderType, boolean translucent, - Supplier color) { + Supplier ingredient, Supplier> renderType, boolean translucent, + Supplier color) { ResourceLocation end_texture = Create.asResource(palettesDir() + name + "_end"); ResourceLocation side_texture = Create.asResource(palettesDir() + name); Function ends = i -> Create.asResource(palettesDir() + name + "_" + i + "_end"); @@ -253,9 +254,7 @@ public class WindowGen { .loot((t, g) -> t.dropWhenSilkTouch(g)) .item() .tag(Tags.Items.GLASS_PANES) - .model((c, p) -> p.withExistingParent(c.getName(), Create.asResource("item/pane")) - .texture("pane", sideTexture) - .texture("edge", topTexture)) + .model((c, p) -> p.generated(c, sideTexture)) .build(); } diff --git a/src/main/resources/assets/create/models/item/bars.json b/src/main/resources/assets/create/models/item/bars.json deleted file mode 100644 index 3577d43a6f..0000000000 --- a/src/main/resources/assets/create/models/item/bars.json +++ /dev/null @@ -1,77 +0,0 @@ -{ - "credit": "Made with Blockbench", - "elements": [ - { - "from": [8, 0, 0], - "to": [8, 16, 16], - "faces": { - "east": {"uv": [16, 0, 0, 16], "texture": "#bars"}, - "west": {"uv": [0, 0, 16, 16], "texture": "#bars"} - } - }, - { - "from": [7, 0, 15.95], - "to": [9, 16, 16], - "faces": { - "north": {"uv": [9, 16, 7, 0], "texture": "#bars"}, - "south": {"uv": [7, 16, 9, 0], "texture": "#bars"} - } - }, - { - "from": [7, 0, 0], - "to": [9, 16, 0.05], - "faces": { - "north": {"uv": [7, 16, 9, 0], "texture": "#bars"}, - "south": {"uv": [9, 16, 7, 0], "texture": "#bars"} - } - }, - { - "from": [7, 15.95, 0], - "to": [9, 16, 16], - "faces": { - "up": {"uv": [7, 0, 9, 16], "rotation": 180, "texture": "#edge"}, - "down": {"uv": [7, 16, 9, 0], "rotation": 180, "texture": "#edge"} - } - }, - { - "from": [7, 0, 0], - "to": [9, 0.05, 16], - "faces": { - "up": {"uv": [7, 16, 9, 0], "rotation": 180, "texture": "#edge"}, - "down": {"uv": [7, 0, 9, 16], "rotation": 180, "texture": "#edge"} - } - } - ], - "display": { - "thirdperson_righthand": { - "rotation": [75, 45, 0], - "translation": [0, 2.5, 0], - "scale": [0.375, 0.375, 0.375] - }, - "thirdperson_lefthand": { - "rotation": [75, 45, 0], - "translation": [0, 2.5, 0], - "scale": [0.375, 0.375, 0.375] - }, - "firstperson_righthand": { - "rotation": [0, 45, 0], - "scale": [0.4, 0.4, 0.4] - }, - "firstperson_lefthand": { - "rotation": [0, 225, 0], - "scale": [0.4, 0.4, 0.4] - }, - "ground": { - "translation": [0, 3, 0], - "scale": [0.25, 0.25, 0.25] - }, - "gui": { - "rotation": [30, 45, 0], - "scale": [0.625, 0.625, 0.625] - }, - "fixed": { - "rotation": [ 0, 270, 0 ], - "scale": [0.5, 0.5, 0.5] - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/pane.json b/src/main/resources/assets/create/models/item/pane.json deleted file mode 100644 index a9f2b67e83..0000000000 --- a/src/main/resources/assets/create/models/item/pane.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "credit": "Made with Blockbench", - "elements": [ - { - "from": [7, 0, 0], - "to": [9, 16, 16], - "faces": { - "north": {"uv": [7, 0, 9, 16], "texture": "#edge"}, - "east": {"uv": [16, 0, 0, 16], "texture": "#pane"}, - "south": {"uv": [7, 0, 9, 16], "texture": "#edge"}, - "west": {"uv": [0, 0, 16, 16], "texture": "#pane"}, - "up": {"uv": [7, 0, 9, 16], "rotation": 180, "texture": "#edge"}, - "down": {"uv": [7, 0, 9, 16], "rotation": 180, "texture": "#edge"} - } - } - ], - "display": { - "thirdperson_righthand": { - "rotation": [75, 45, 0], - "translation": [0, 2.5, 0], - "scale": [0.375, 0.375, 0.375] - }, - "thirdperson_lefthand": { - "rotation": [75, 45, 0], - "translation": [0, 2.5, 0], - "scale": [0.375, 0.375, 0.375] - }, - "firstperson_righthand": { - "rotation": [0, 45, 0], - "scale": [0.4, 0.4, 0.4] - }, - "firstperson_lefthand": { - "rotation": [0, 225, 0], - "scale": [0.4, 0.4, 0.4] - }, - "ground": { - "translation": [0, 3, 0], - "scale": [0.25, 0.25, 0.25] - }, - "gui": { - "rotation": [30, 45, 0], - "scale": [0.625, 0.625, 0.625] - }, - "fixed": { - "rotation": [ 0, 270, 0 ], - "scale": [0.5, 0.5, 0.5] - } - } -} \ No newline at end of file From 7c91e6a213f4da589c1055fe01167890f03d4ecc Mon Sep 17 00:00:00 2001 From: IThundxr Date: Mon, 13 Jan 2025 10:11:01 -0500 Subject: [PATCH 300/515] Odd block choices - Implement a tag to mark items as invalid for paving --- .../data/create/tags/items/invalid_for_track_paving.json | 6 ++++++ src/main/java/com/simibubi/create/AllBlocks.java | 2 ++ src/main/java/com/simibubi/create/AllTags.java | 1 + .../create/content/trains/track/TrackPlacement.java | 2 +- 4 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 src/generated/resources/data/create/tags/items/invalid_for_track_paving.json diff --git a/src/generated/resources/data/create/tags/items/invalid_for_track_paving.json b/src/generated/resources/data/create/tags/items/invalid_for_track_paving.json new file mode 100644 index 0000000000..1f658f8b9a --- /dev/null +++ b/src/generated/resources/data/create/tags/items/invalid_for_track_paving.json @@ -0,0 +1,6 @@ +{ + "values": [ + "create:wooden_bracket", + "create:metal_bracket" + ] +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 2fcb8f773c..0f55a94dc4 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -867,6 +867,7 @@ public class AllBlocks { .properties(p -> p.sound(SoundType.SCAFFOLDING)) .transform(axeOrPickaxe()) .item(BracketBlockItem::new) + .tag(AllItemTags.INVALID_FOR_TRACK_PAVING.tag) .transform(BracketGenerator.itemModel("wooden")) .register(); @@ -875,6 +876,7 @@ public class AllBlocks { .properties(p -> p.sound(SoundType.NETHERITE_BLOCK)) .transform(pickaxeOnly()) .item(BracketBlockItem::new) + .tag(AllItemTags.INVALID_FOR_TRACK_PAVING.tag) .transform(BracketGenerator.itemModel("metal")) .register(); diff --git a/src/main/java/com/simibubi/create/AllTags.java b/src/main/java/com/simibubi/create/AllTags.java index c99802271f..0356ca8503 100644 --- a/src/main/java/com/simibubi/create/AllTags.java +++ b/src/main/java/com/simibubi/create/AllTags.java @@ -171,6 +171,7 @@ public class AllTags { CONTRAPTION_CONTROLLED, CREATE_INGOTS, CRUSHED_RAW_MATERIALS, + INVALID_FOR_TRACK_PAVING, DEPLOYABLE_DRINK, MODDED_STRIPPED_LOGS, MODDED_STRIPPED_WOOD, diff --git a/src/main/java/com/simibubi/create/content/trains/track/TrackPlacement.java b/src/main/java/com/simibubi/create/content/trains/track/TrackPlacement.java index 5862c5831f..f26232eb89 100644 --- a/src/main/java/com/simibubi/create/content/trains/track/TrackPlacement.java +++ b/src/main/java/com/simibubi/create/content/trains/track/TrackPlacement.java @@ -374,7 +374,7 @@ public class TrackPlacement { ItemStack offhandItem = player.getOffhandItem() .copy(); - boolean shouldPave = offhandItem.getItem() instanceof BlockItem; + boolean shouldPave = offhandItem.getItem() instanceof BlockItem && !offhandItem.is(AllTags.AllItemTags.INVALID_FOR_TRACK_PAVING.tag); if (shouldPave) { BlockItem paveItem = (BlockItem) offhandItem.getItem(); paveTracks(level, info, paveItem, true); From fcc862264d86d724b92d090bd61a8daa3fa06ce5 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Tue, 14 Jan 2025 14:25:48 +0100 Subject: [PATCH 301/515] Never scene before - Ponders for Stock link and Stock ticker --- .../resources/assets/create/lang/en_ud.json | 35 +- .../resources/assets/create/lang/en_us.json | 35 +- .../models/item/bamboo_window_pane.json | 5 +- .../models/item/cherry_window_pane.json | 5 +- .../item/industrial_iron_window_pane.json | 5 +- .../item/weathered_iron_window_pane.json | 5 +- .../content/logistics/box/PackageEntity.java | 1 + .../ponder/AllCreatePonderScenes.java | 8 +- .../scenes/highLogistics/PackagerScenes.java | 6 +- .../scenes/highLogistics/PonderHilo.java | 22 +- .../scenes/highLogistics/StockLinkScenes.java | 311 ++++++++ .../highLogistics/StockTickerScenes.java | 666 ++++++++++++++++++ .../ponder/high_logistics/stock_link.nbt | Bin 0 -> 1139 bytes .../ponder/high_logistics/stock_ticker.nbt | Bin 0 -> 1991 bytes .../high_logistics/stock_ticker_address.nbt | Bin 0 -> 2429 bytes 15 files changed, 1080 insertions(+), 24 deletions(-) create mode 100644 src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/StockLinkScenes.java create mode 100644 src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/StockTickerScenes.java create mode 100644 src/main/resources/assets/create/ponder/high_logistics/stock_link.nbt create mode 100644 src/main/resources/assets/create/ponder/high_logistics/stock_ticker.nbt create mode 100644 src/main/resources/assets/create/ponder/high_logistics/stock_ticker_address.nbt diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index a6dcc92cbb..ba3f528b39 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -2158,7 +2158,7 @@ "create.ponder.packager_address.header": "ssǝɹppɐ uɐ ɥʇıʍ sǝbɐʞɔɐd buıʇnoᴚ", "create.ponder.packager_address.text_1": "ǝsnoɥǝɹɐM", "create.ponder.packager_address.text_10": "ʇןǝq ɐ oʇuo ʇɥbıɐɹʇs sǝbɐʞɔɐd dɐɹʍun uɐɔ sʍɐs ןɐɔıuɐɥɔǝɯ 'ssǝuʇɔɐdɯoɔ ɹoℲ", - "create.ponder.packager_address.text_11": "sǝıʇıןıqɐdɐɔ buıʇnoɹ ǝbɐʞɔɐd ǝʌɐɥ sǝxoqʇsoԀ puɐ sʇɹodboɹℲ 'sɹǝʇןıɟ ǝsoɥʇ ɯoɹɟ ǝpısⱯ", + "create.ponder.packager_address.text_11": "sǝıʇıןıqɐ buıʇnoɹ ǝbɐʞɔɐd ǝʌɐɥ sǝxoqʇsoԀ puɐ sʇɹodboɹℲ 'sɹǝʇןıɟ ɯoɹɟ ǝpısⱯ", "create.ponder.packager_address.text_12": "ɹnoıʌɐɥǝq ɹıǝɥʇ ʇnoqɐ ǝɹoɯ ʇno puıɟ oʇ ɯǝɥʇ ʇɔǝdsuI", "create.ponder.packager_address.text_2": "˙˙ɹǝbɐʞɔɐd ɐ uo pǝɔɐןd sı ubıs ɐ uǝɥM", "create.ponder.packager_address.text_3": "ǝsnoɥǝɹɐM →", @@ -2358,6 +2358,39 @@ "create.ponder.sticker.text_2": "ǝʇɐʇs sʇı ǝןbboʇ ןןıʍ ʇı 'ןɐubıs ɐ buıʌıǝɔǝɹ uod∩", "create.ponder.sticker.text_3": "ʇı ɥʇıʍ ǝʌoɯ ןןıʍ ʞɔoןq ǝɥʇ 'uoıʇdɐɹʇuoɔ ɐ uı pǝʌoɯ ʍou sı ʇı ɟI", "create.ponder.sticker.text_4": "pǝɥɔɐʇʇɐ ɹǝbuoן ou sı ʞɔoןq ǝɥʇ 'uıɐbɐ ǝɔuo pǝןbbo⟘", + "create.ponder.stock_link.header": "ʞuıꞀ ʞɔoʇS ǝɥʇ puɐ sʞɹoʍʇǝN sɔıʇsıboꞀ", + "create.ponder.stock_link.text_1": "ʞɹoʍʇǝu ʍǝu ɐ ǝʇɐǝɹɔ sʞuıꞀ ʞɔoʇS 'pǝɔɐןd uǝɥM", + "create.ponder.stock_link.text_2": "ɯǝɥʇ puıq oʇ ʇı buıɔɐןd ǝɹoɟǝq ʞuıן buıʇsıxǝ uɐ ʞɔıןɔ-ʇɥbıᴚ", + "create.ponder.stock_link.text_3": "ʞɹoʍʇǝu ǝɥʇ oʇ ǝןqɐןıɐʌɐ ʎɹoʇuǝʌuı ɹıǝɥʇ ǝʞɐɯ sɹǝbɐʞɔɐd pǝʞuıן-ʞɔoʇS", + "create.ponder.stock_link.text_4": "sɯǝʇı ɹıǝɥʇ ʇsǝnbǝɹ puɐ puıɟ ʍou uɐɔ ʞɹoʍʇǝu ǝɥʇ uo sʇuǝuodɯoɔ ɹǝɥʇO", + "create.ponder.stock_link.text_5": "sǝbɐʞɔɐd oʇuı pǝɔɐןd ǝq ןןıʍ sǝıɹoʇuǝʌuı ǝɥʇ ɯoɹɟ sɯǝʇı 'ʇsǝnbǝɹ uO", + "create.ponder.stock_link.text_6": "uoıʇɐʇɹodsuɐɹʇ ǝɹınbǝɹ sǝbɐʞɔɐd ʇnq 'ǝbuɐɹ pǝʇıɯıןun ǝʌɐɥ sןɐubıs ʞuıꞀ ʞɔoʇS", + "create.ponder.stock_link.text_7": "buıʇsɐɔpɐoɹq ɯoɹɟ ʞuıן ɐ doʇs ןןıʍ ɹǝʍod ǝuoʇspǝɹ ןןnℲ", + "create.ponder.stock_link.text_8": "ʇsɹıɟ ʇɔɐ oʇ sɹǝɥʇo buısnɐɔ 'ʞuıן ɐ ɟo ʎʇıɹoıɹd ǝɥʇ sɹǝʍoן ɹǝʍod boןɐuⱯ", + "create.ponder.stock_ticker.header": "sɹǝʞɔıʇ ʞɔoʇS ɥʇıʍ sɯǝʇı buıɹǝpɹO", + "create.ponder.stock_ticker.text_1": "ʞɹoʍʇǝu sʇı oʇ ʇɔǝuuoɔ oʇ ʇuǝɯǝɔɐןd ǝɹoɟǝq ʞuıן ʞɔoʇS ɐ ʞɔıןɔ-ʇɥbıᴚ", + "create.ponder.stock_ticker.text_10": "uouuɐɔıʇɐɯǝɥɔs ǝɥʇ ɹoɟ pǝɹınbǝɹ sʞɔoןq ʇsǝnbǝɹ osןɐ uɐɔ sɹǝʞɔıʇ ʞɔoʇS", + "create.ponder.stock_ticker.text_11": "ɹǝdǝǝʞ ǝɥʇ oʇ pǝʇɐɹǝuǝb ʇı pɹɐoqdıןɔ pǝʇuıɹd ǝɥʇ puɐɥ ʎןdɯıS", + "create.ponder.stock_ticker.text_2": "ʞɹoʍʇǝu ǝɥʇ oʇ ǝןqɐןıɐʌɐ ʎɹoʇuǝʌuı ɹıǝɥʇ ǝʞɐɯ sɹǝbɐʞɔɐd pǝʞuıן-ʞɔoʇS", + "create.ponder.stock_ticker.text_3": "sǝıɹoʇuǝʌuı ǝsǝɥʇ ɯoɹɟ sɯǝʇı ʇsǝnbǝɹ uɐɔ sɹǝʞɔıʇ ʞɔoʇS", + "create.ponder.stock_ticker.text_4": "ɹǝdǝǝʞ ʞɔoʇS ǝɥʇ sɐ ʇɔɐ ʇı ɟo ʇuoɹɟ uı sɹǝuɹnq ǝzɐןq ɹo sqoɯ pǝʇɐǝS", + "create.ponder.stock_ticker.text_5": "sɯǝʇı buıɹǝpɹo ʇɹɐʇs oʇ ɹǝdǝǝʞ ǝɥʇ ʞɔıןɔ-ʇɥbıᴚ", + "create.ponder.stock_ticker.text_6": "sǝbɐʞɔɐd oʇuı pǝɔɐןd ǝq ןןıʍ sɯǝʇı ǝɥʇ 'pǝʇʇıɯqns sı ɹǝpɹo uɐ uǝɥM", + "create.ponder.stock_ticker.text_7": "ʇuıod ʇsǝnbǝɹ ǝɥʇ oʇ pǝʇɹodsuɐɹʇ ǝq uɐɔ ʎǝɥʇ 'ǝɹǝɥʇ ɯoɹℲ", + "create.ponder.stock_ticker.text_8": "sbuıʇsıן ɯǝʇı ǝɥʇ oʇ pǝppɐ ǝq uɐɔ sǝıɹobǝʇɐɔ 'sɹǝʇןıɟ ʇsıן ɹo ǝʇnqıɹʇʇɐ buıs∩", + "create.ponder.stock_ticker.text_9": "ɹoʇıpǝ ʎɹobǝʇɐɔ ǝɥʇ uǝdo oʇ ɟןǝsʇı ʞɔoןq ǝɥʇ ʞɔıןɔ-ʇɥbıᴚ", + "create.ponder.stock_ticker_address.header": "ɹǝpɹo ɹǝʞɔıʇ ʞɔoʇS ɐ buıssǝɹppⱯ", + "create.ponder.stock_ticker_address.text_1": "ɹǝpɹo ǝɥʇ uı ʇǝs ǝq uɐɔ ssǝɹppɐ ʇǝbɹɐʇ ɐ 'sɯǝʇı buıʇsǝnbǝɹ uǝɥM", + "create.ponder.stock_ticker_address.text_10": "sǝıʇıןıqɐ buıʇnoɹ ǝbɐʞɔɐd ǝʌɐɥ sǝxoqʇsoԀ puɐ sʇɹodboɹℲ 'sɹǝʇןıɟ ɯoɹɟ ǝpısⱯ", + "create.ponder.stock_ticker_address.text_11": "ɹnoıʌɐɥǝq ɹıǝɥʇ ʇnoqɐ ǝɹoɯ ʇno puıɟ oʇ ɯǝɥʇ ʇɔǝdsuI", + "create.ponder.stock_ticker_address.text_2": "doɥsʞɹoM →", + "create.ponder.stock_ticker_address.text_3": "ʇsǝnbǝɹ ǝɥʇ ɹoɟ pǝʇɐǝɹɔ sǝbɐʞɔɐd ןןɐ uo ǝq ןןıʍ ssǝɹppɐ sıɥ⟘", + "create.ponder.stock_ticker_address.text_4": "ob ןןıʍ sǝbɐʞɔɐd ǝɥʇ ǝɹǝɥʍ ןoɹʇuoɔ uɐɔ sıɥʇ 'sɹǝʇןıɟ ǝbɐʞɔɐd buıs∩", + "create.ponder.stock_ticker_address.text_5": "doɥsʞɹoM →", + "create.ponder.stock_ticker_address.text_6": "doɥsʞɹoM", + "create.ponder.stock_ticker_address.text_7": "ʎɹoʇɔɐℲ →", + "create.ponder.stock_ticker_address.text_8": "ʎɹoʇɔɐℲ →", + "create.ponder.stock_ticker_address.text_9": "doɥsʞɹoM", "create.ponder.stressometer.header": "ɹǝʇǝɯossǝɹʇS ǝɥʇ buısn uoıʇɐɯɹoɟuı ɔıʇǝuıʞ buıɹoʇıuoW", "create.ponder.stressometer.text_1": "ʞɹoʍʇǝu ɔıʇǝuıʞ pǝɥɔɐʇʇɐ ǝɥʇ ɟo ʎʇıɔɐdɐƆ ssǝɹʇS ʇuǝɹɹnɔ ǝɥʇ sʎɐןdsıp ɹǝʇǝɯossǝɹʇS ǝɥ⟘", "create.ponder.stressometer.text_2": "ǝbnɐ⅁ ǝɥʇ ɯoɹɟ uoıʇɐɯɹoɟuı pǝןıɐʇǝp ǝɹoɯ ʇǝb uɐɔ ɹǝʎɐןd ǝɥʇ 'sǝןbbo⅁ ,sɹǝǝuıbuƎ buıɹɐǝʍ uǝɥM", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index b44a768e30..99b6e7fc4a 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -2158,7 +2158,7 @@ "create.ponder.packager_address.header": "Routing packages with an address", "create.ponder.packager_address.text_1": "Warehouse", "create.ponder.packager_address.text_10": "For compactness, mechanical saws can unwrap packages straight onto a belt", - "create.ponder.packager_address.text_11": "Aside from those filters, Frogports and Postboxes have package routing capabilities", + "create.ponder.packager_address.text_11": "Aside from filters, Frogports and Postboxes have package routing abilities", "create.ponder.packager_address.text_12": "Inspect them to find out more about their behaviour", "create.ponder.packager_address.text_2": "When a sign is placed on a packager..", "create.ponder.packager_address.text_3": "→ Warehouse", @@ -2358,6 +2358,39 @@ "create.ponder.sticker.text_2": "Upon receiving a signal, it will toggle its state", "create.ponder.sticker.text_3": "If it is now moved in a contraption, the block will move with it", "create.ponder.sticker.text_4": "Toggled once again, the block is no longer attached", + "create.ponder.stock_link.header": "Logistics Networks and the Stock Link", + "create.ponder.stock_link.text_1": "When placed, Stock Links create a new network", + "create.ponder.stock_link.text_2": "Right-click an existing link before placing it to bind them", + "create.ponder.stock_link.text_3": "Stock-linked packagers make their inventory available to the network", + "create.ponder.stock_link.text_4": "Other components on the network can now find and request their items", + "create.ponder.stock_link.text_5": "On request, items from the inventories will be placed into packages", + "create.ponder.stock_link.text_6": "Stock Link signals have unlimited range, but packages require transportation", + "create.ponder.stock_link.text_7": "Full redstone power will stop a link from broadcasting", + "create.ponder.stock_link.text_8": "Analog power lowers the priority of a link, causing others to act first", + "create.ponder.stock_ticker.header": "Ordering items with Stock tickers", + "create.ponder.stock_ticker.text_1": "Right-click a Stock link before placement to connect to its network", + "create.ponder.stock_ticker.text_10": "Stock tickers can also request blocks required for the schematicannon", + "create.ponder.stock_ticker.text_11": "Simply hand the printed clipboard it generated to the keeper", + "create.ponder.stock_ticker.text_2": "Stock-linked packagers make their inventory available to the network", + "create.ponder.stock_ticker.text_3": "Stock tickers can request items from these inventories", + "create.ponder.stock_ticker.text_4": "Seated mobs or blaze burners in front of it act as the Stock Keeper", + "create.ponder.stock_ticker.text_5": "Right-click the keeper to start ordering items", + "create.ponder.stock_ticker.text_6": "When an order is submitted, the items will be placed into packages", + "create.ponder.stock_ticker.text_7": "From there, they can be transported to the request point", + "create.ponder.stock_ticker.text_8": "Using attribute or list filters, categories can be added to the item listings", + "create.ponder.stock_ticker.text_9": "Right-click the block itself to open the category editor", + "create.ponder.stock_ticker_address.header": "Addressing a Stock ticker order", + "create.ponder.stock_ticker_address.text_1": "When requesting items, a target address can be set in the order", + "create.ponder.stock_ticker_address.text_10": "Aside from filters, Frogports and Postboxes have package routing abilities", + "create.ponder.stock_ticker_address.text_11": "Inspect them to find out more about their behaviour", + "create.ponder.stock_ticker_address.text_2": "→ Workshop", + "create.ponder.stock_ticker_address.text_3": "This address will be on all packages created for the request", + "create.ponder.stock_ticker_address.text_4": "Using package filters, this can control where the packages will go", + "create.ponder.stock_ticker_address.text_5": "→ Workshop", + "create.ponder.stock_ticker_address.text_6": "Workshop", + "create.ponder.stock_ticker_address.text_7": "→ Factory", + "create.ponder.stock_ticker_address.text_8": "→ Factory", + "create.ponder.stock_ticker_address.text_9": "Workshop", "create.ponder.stressometer.header": "Monitoring Kinetic information using the Stressometer", "create.ponder.stressometer.text_1": "The Stressometer displays the current Stress Capacity of the attached kinetic network", "create.ponder.stressometer.text_2": "When wearing Engineers' Goggles, the player can get more detailed information from the Gauge", diff --git a/src/generated/resources/assets/create/models/item/bamboo_window_pane.json b/src/generated/resources/assets/create/models/item/bamboo_window_pane.json index d0839f8b6e..12cfd60014 100644 --- a/src/generated/resources/assets/create/models/item/bamboo_window_pane.json +++ b/src/generated/resources/assets/create/models/item/bamboo_window_pane.json @@ -1,7 +1,6 @@ { - "parent": "create:item/pane", + "parent": "minecraft:item/generated", "textures": { - "edge": "minecraft:block/bamboo_planks", - "pane": "create:block/palettes/bamboo_window" + "layer0": "create:block/palettes/bamboo_window" } } \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/cherry_window_pane.json b/src/generated/resources/assets/create/models/item/cherry_window_pane.json index c99c15abd6..3eaeaa351d 100644 --- a/src/generated/resources/assets/create/models/item/cherry_window_pane.json +++ b/src/generated/resources/assets/create/models/item/cherry_window_pane.json @@ -1,7 +1,6 @@ { - "parent": "create:item/pane", + "parent": "minecraft:item/generated", "textures": { - "edge": "minecraft:block/cherry_planks", - "pane": "create:block/palettes/cherry_window" + "layer0": "create:block/palettes/cherry_window" } } \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/industrial_iron_window_pane.json b/src/generated/resources/assets/create/models/item/industrial_iron_window_pane.json index 115e11e0b8..83f5bfd65d 100644 --- a/src/generated/resources/assets/create/models/item/industrial_iron_window_pane.json +++ b/src/generated/resources/assets/create/models/item/industrial_iron_window_pane.json @@ -1,7 +1,6 @@ { - "parent": "create:item/pane", + "parent": "minecraft:item/generated", "textures": { - "edge": "create:block/palettes/industrial_iron_window_pane_top", - "pane": "create:block/palettes/industrial_iron_window" + "layer0": "create:block/palettes/industrial_iron_window" } } \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/weathered_iron_window_pane.json b/src/generated/resources/assets/create/models/item/weathered_iron_window_pane.json index 23fc86eb14..dd738de895 100644 --- a/src/generated/resources/assets/create/models/item/weathered_iron_window_pane.json +++ b/src/generated/resources/assets/create/models/item/weathered_iron_window_pane.json @@ -1,7 +1,6 @@ { - "parent": "create:item/pane", + "parent": "minecraft:item/generated", "textures": { - "edge": "create:block/palettes/weathered_iron_window_pane_top", - "pane": "create:block/palettes/weathered_iron_window" + "layer0": "create:block/palettes/weathered_iron_window" } } \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java index 5aa7c56d11..7d88bda673 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java @@ -75,6 +75,7 @@ public class PackageEntity extends LivingEntity implements IEntityAdditionalSpaw super((EntityType) entityTypeIn, worldIn); box = ItemStack.EMPTY; setYRot(this.random.nextFloat() * 360.0F); + yRotO = getYRot(); insertionDelay = 30; } diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderScenes.java index f648ae5bbb..838b8e5175 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderScenes.java @@ -44,6 +44,8 @@ import com.simibubi.create.infrastructure.ponder.scenes.fluid.SpoutScenes; import com.simibubi.create.infrastructure.ponder.scenes.highLogistics.FrogAndConveyorScenes; import com.simibubi.create.infrastructure.ponder.scenes.highLogistics.PackagerScenes; import com.simibubi.create.infrastructure.ponder.scenes.highLogistics.PostboxScenes; +import com.simibubi.create.infrastructure.ponder.scenes.highLogistics.StockLinkScenes; +import com.simibubi.create.infrastructure.ponder.scenes.highLogistics.StockTickerScenes; import com.simibubi.create.infrastructure.ponder.scenes.trains.TrackObserverScenes; import com.simibubi.create.infrastructure.ponder.scenes.trains.TrackScenes; import com.simibubi.create.infrastructure.ponder.scenes.trains.TrainScenes; @@ -55,7 +57,6 @@ import com.tterrag.registrate.util.entry.RegistryEntry; import net.createmod.ponder.api.registration.PonderSceneRegistrationHelper; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.DyeColor; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.RegistryObject; @@ -361,6 +362,11 @@ public class AllCreatePonderScenes { HELPER.forComponents(AllBlocks.PACKAGER) .addStoryBoard("high_logistics/packager", PackagerScenes::packager) .addStoryBoard("high_logistics/packager_address", PackagerScenes::packagerAddress); + HELPER.forComponents(AllBlocks.STOCK_LINK) + .addStoryBoard("high_logistics/stock_link", StockLinkScenes::stockLink); + HELPER.forComponents(AllBlocks.STOCK_TICKER) + .addStoryBoard("high_logistics/stock_ticker", StockTickerScenes::stockTicker) + .addStoryBoard("high_logistics/stock_ticker_address", StockTickerScenes::stockTickerAddress); // Trains HELPER.forComponents(TrackMaterial.allBlocks() diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/PackagerScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/PackagerScenes.java index e713358119..4d50a250a7 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/PackagerScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/PackagerScenes.java @@ -250,7 +250,7 @@ public class PackagerScenes { scene.idle(40); PonderHilo.packageHopsOffBelt(scene, util.grid() - .at(0, 1, 2), Direction.WEST); + .at(0, 1, 2), Direction.WEST, box); scene.idle(40); } @@ -497,7 +497,7 @@ public class PackagerScenes { scene.idle(40); PonderHilo.packageHopsOffBelt(scene, util.grid() - .at(4, 1, 0), Direction.NORTH); + .at(4, 1, 0), Direction.NORTH, warehouseBox); scene.idle(40); scene.world() .multiplyKineticSpeed(util.select() @@ -547,7 +547,7 @@ public class PackagerScenes { scene.overlay() .showText(100) - .text("Aside from those filters, Frogports and Postboxes have package routing capabilities") + .text("Aside from filters, Frogports and Postboxes have package routing abilities") .attachKeyFrame() .placeNearTarget() .pointAt(util.vector() diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/PonderHilo.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/PonderHilo.java index 2b19469aee..2ba708f1de 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/PonderHilo.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/PonderHilo.java @@ -1,7 +1,6 @@ package com.simibubi.create.infrastructure.ponder.scenes.highLogistics; import com.simibubi.create.content.logistics.box.PackageEntity; -import com.simibubi.create.content.logistics.box.PackageStyles; import com.simibubi.create.content.logistics.packager.PackagerBlockEntity; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; @@ -9,7 +8,9 @@ import net.createmod.ponder.api.element.ElementLink; import net.createmod.ponder.api.element.EntityElement; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.core.particles.VibrationParticleOption; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.gameevent.BlockPositionSource; import net.minecraft.world.phys.Vec3; public class PonderHilo { @@ -38,17 +39,26 @@ public class PonderHilo { } public static ElementLink packageHopsOffBelt(CreateSceneBuilder scene, BlockPos beltPos, - Direction side) { + Direction side, ItemStack box) { scene.world() .removeItemsFromBelt(beltPos); return scene.world() .createEntity(l -> { - PackageEntity packageEntity = new PackageEntity(l, beltPos.getX() + 0.5 + side.getStepX() * 0.25, - beltPos.getY() + 0.875, beltPos.getZ() + 0.5 + side.getStepZ() * 0.25); - packageEntity.setDeltaMovement(new Vec3(side.getStepX(), 0.5f, side.getStepZ()).scale(0.25f)); - packageEntity.box = PackageStyles.getDefaultBox(); + PackageEntity packageEntity = new PackageEntity(l, beltPos.getX() + 0.5 + side.getStepX() * 0.675, + beltPos.getY() + 0.875, beltPos.getZ() + 0.5 + side.getStepZ() * 0.675); + packageEntity.setDeltaMovement(new Vec3(side.getStepX(), 1f, side.getStepZ()).scale(0.125f)); + packageEntity.box = box; return packageEntity; }); } + public static void linkEffect(CreateSceneBuilder scene, BlockPos pos) { + scene.addInstruction(s -> { + Vec3 vec3 = Vec3.atCenterOf(pos); + s.getWorld() + .addParticle(new VibrationParticleOption(new BlockPositionSource(pos.above(3)), 6), vec3.x, vec3.y, + vec3.z, 1, 1, 1); + }); + } + } diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/StockLinkScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/StockLinkScenes.java new file mode 100644 index 0000000000..9a9998c5a9 --- /dev/null +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/StockLinkScenes.java @@ -0,0 +1,311 @@ +package com.simibubi.create.infrastructure.ponder.scenes.highLogistics; + +import java.util.List; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.content.logistics.box.PackageItem; +import com.simibubi.create.content.logistics.packager.PackagerBlock; +import com.simibubi.create.content.redstone.analogLever.AnalogLeverBlockEntity; +import com.simibubi.create.foundation.ponder.CreateSceneBuilder; + +import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.PonderPalette; +import net.createmod.ponder.api.element.ElementLink; +import net.createmod.ponder.api.element.ParrotPose.FacePointOfInterestPose; +import net.createmod.ponder.api.element.WorldSectionElement; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; +import net.createmod.ponder.api.scene.Selection; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.phys.AABB; + +public class StockLinkScenes { + + public static void stockLink(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); + scene.title("stock_link", "Logistics Networks and the Stock Link"); + scene.configureBasePlate(0, 0, 7); + scene.world() + .showSection(util.select() + .layer(0), Direction.UP); + + Selection vault = util.select() + .fromTo(4, 1, 4, 5, 2, 5); + Selection chest = util.select() + .fromTo(2, 1, 4, 2, 1, 5); + BlockPos packager1 = util.grid() + .at(4, 1, 3); + BlockPos packager2 = util.grid() + .at(2, 1, 3); + BlockPos link1 = util.grid() + .at(4, 2, 3); + BlockPos link2 = util.grid() + .at(2, 2, 3); + BlockPos lever = util.grid() + .at(1, 2, 2); + BlockPos analog = util.grid() + .at(1, 2, 3); + Selection casing = util.select() + .position(1, 1, 3); + Selection requester = util.select() + .fromTo(5, 1, 1, 4, 1, 1); + BlockPos seat = util.grid() + .at(5, 1, 1); + BlockPos ticker = util.grid() + .at(4, 1, 1); + Selection packager1S = util.select() + .position(packager1); + Selection packager2S = util.select() + .position(packager2); + Selection link1S = util.select() + .position(link1); + Selection link2S = util.select() + .position(link2); + + scene.idle(10); + ElementLink linkL = scene.world() + .showIndependentSection(link2S, Direction.DOWN); + scene.world() + .moveSection(linkL, util.vector() + .of(0, -1, 0), 0); + scene.idle(25); + + scene.overlay() + .showText(70) + .attachKeyFrame() + .text("When placed, Stock Links create a new network") + .pointAt(util.vector() + .centerOf(link2.below())) + .placeNearTarget(); + scene.idle(80); + + ItemStack linkItem = AllBlocks.STOCK_LINK.asStack(); + scene.overlay() + .showControls(util.vector() + .topOf(link2.below()), Pointing.DOWN, 50) + .rightClick() + .withItem(linkItem); + scene.idle(5); + + AABB bb1 = new AABB(link2.below()); + scene.overlay() + .chaseBoundingBoxOutline(PonderPalette.BLUE, link2, bb1.deflate(0.45), 10); + scene.idle(1); + bb1 = bb1.deflate(1 / 16f) + .contract(0, 8 / 16f, 0); + scene.overlay() + .chaseBoundingBoxOutline(PonderPalette.BLUE, link2, bb1, 50); + scene.idle(26); + + scene.overlay() + .showText(80) + .text("Right-click an existing link before placing it to bind them") + .attachKeyFrame() + .colored(PonderPalette.BLUE) + .placeNearTarget() + .pointAt(util.vector() + .centerOf(link2.below())); + + scene.idle(40); + + scene.world() + .showSectionAndMerge(link1S, Direction.DOWN, linkL); + scene.idle(20); + + scene.overlay() + .chaseBoundingBoxOutline(PonderPalette.GREEN, link1, bb1.move(util.vector() + .of(2, 0, 0)), 40); + scene.overlay() + .chaseBoundingBoxOutline(PonderPalette.GREEN, link2, bb1, 40); + scene.overlay() + .showLine(PonderPalette.GREEN, util.vector() + .centerOf(link1.below()) + .subtract(0, 1 / 4f, 0), + util.vector() + .centerOf(link2.below()) + .subtract(0, 1 / 4f, 0), + 40); + scene.idle(60); + + scene.world() + .cycleBlockProperty(packager1, PackagerBlock.LINKED); + scene.world() + .cycleBlockProperty(packager2, PackagerBlock.LINKED); + + scene.world() + .moveSection(linkL, util.vector() + .of(0, 1.25, 0), 15); + scene.idle(10); + scene.world() + .showSection(packager1S, Direction.NORTH); + scene.idle(2); + scene.world() + .showSection(packager2S, Direction.NORTH); + scene.idle(5); + scene.world() + .moveSection(linkL, util.vector() + .of(0, -.25, 0), 10); + scene.idle(10); + scene.world() + .cycleBlockProperty(packager1, PackagerBlock.LINKED); + scene.world() + .cycleBlockProperty(packager2, PackagerBlock.LINKED); + scene.effects() + .indicateSuccess(packager1); + scene.effects() + .indicateSuccess(packager2); + scene.idle(40); + + scene.overlay() + .showText(100) + .text("Stock-linked packagers make their inventory available to the network") + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector() + .of(2, 1.5, 3)); + scene.idle(40); + + scene.world() + .showSection(chest, Direction.NORTH); + scene.idle(5); + scene.world() + .showSection(vault, Direction.NORTH); + scene.idle(20); + + scene.overlay() + .showOutline(PonderPalette.BLUE, link1, chest, 120); + scene.overlay() + .showOutline(PonderPalette.BLUE, link2, vault, 120); + scene.idle(30); + + scene.world() + .showSection(requester, Direction.DOWN); + scene.idle(3); + scene.special() + .createBirb(util.vector() + .centerOf(seat), FacePointOfInterestPose::new); + scene.idle(20); + + scene.overlay() + .showOutline(PonderPalette.BLUE, seat, util.select() + .position(4, 1, 1), 100); + + scene.overlay() + .showText(100) + .text("Other components on the network can now find and request their items") + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector() + .centerOf(util.grid() + .at(4, 1, 1))); + scene.idle(110); + + scene.effects() + .indicateSuccess(ticker); + scene.idle(5); + PonderHilo.linkEffect(scene, link1); + PonderHilo.packagerCreate(scene, packager1, PackageItem.containing(List.of())); + scene.idle(3); + PonderHilo.linkEffect(scene, link2); + PonderHilo.packagerCreate(scene, packager2, PackageItem.containing(List.of())); + scene.idle(30); + + scene.overlay() + .showText(100) + .text("On request, items from the inventories will be placed into packages") + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector() + .of(2, 1.5, 3)); + scene.idle(120); + + scene.overlay() + .showText(100) + .text("Stock Link signals have unlimited range, but packages require transportation") + .attachKeyFrame() + .colored(PonderPalette.BLUE) + .placeNearTarget() + .pointAt(util.vector() + .centerOf(util.grid() + .at(2, 2, 3))); + scene.idle(110); + + scene.world() + .showSection(casing, Direction.EAST); + scene.idle(10); + ElementLink leverL = scene.world() + .showIndependentSection(util.select() + .position(lever), Direction.DOWN); + scene.world() + .moveSection(leverL, util.vector() + .of(0, 0, 1), 0); + scene.idle(20); + + scene.world() + .toggleRedstonePower(util.select() + .fromTo(1, 2, 2, 2, 2, 3)); + scene.effects() + .indicateRedstone(link2.west()); + scene.idle(10); + scene.overlay() + .showControls(util.vector() + .centerOf(link2), Pointing.DOWN, 40) + .withItem(new ItemStack(Items.BARRIER)); + + scene.idle(20); + scene.overlay() + .showText(80) + .text("Full redstone power will stop a link from broadcasting") + .attachKeyFrame() + .colored(PonderPalette.RED) + .placeNearTarget() + .pointAt(util.vector() + .centerOf(util.grid() + .at(2, 2, 3)) + .add(-0.25, 0, 0)); + scene.idle(70); + + scene.world() + .toggleRedstonePower(util.select() + .fromTo(1, 2, 2, 2, 2, 3)); + scene.idle(10); + scene.world() + .hideIndependentSection(leverL, Direction.SOUTH); + + scene.idle(10); + Selection leverSelection = util.select() + .position(analog); + scene.world() + .showSection(leverSelection, Direction.DOWN); + + scene.idle(20); + scene.effects() + .indicateRedstone(analog); + scene.world() + .toggleRedstonePower(util.select() + .position(2, 2, 3)); + for (int i = 0; i < 10; i++) { + final int state = i + 1; + scene.world() + .modifyBlockEntityNBT(leverSelection, AnalogLeverBlockEntity.class, nbt -> nbt.putInt("State", state)); + scene.idle(2); + } + scene.idle(20); + + scene.overlay() + .showText(100) + .text("Analog power lowers the priority of a link, causing others to act first") + .attachKeyFrame() + .colored(PonderPalette.RED) + .placeNearTarget() + .pointAt(util.vector() + .centerOf(util.grid() + .at(2, 2, 3)) + .add(-0.25, 0, 0)); + scene.idle(80); + } + +} diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/StockTickerScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/StockTickerScenes.java new file mode 100644 index 0000000000..89512a8ca2 --- /dev/null +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/StockTickerScenes.java @@ -0,0 +1,666 @@ +package com.simibubi.create.infrastructure.ponder.scenes.highLogistics; + +import java.util.List; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllItems; +import com.simibubi.create.content.logistics.box.PackageItem; +import com.simibubi.create.content.logistics.packager.PackagerBlock; +import com.simibubi.create.foundation.ponder.CreateSceneBuilder; + +import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.PonderPalette; +import net.createmod.ponder.api.element.ElementLink; +import net.createmod.ponder.api.element.ParrotPose.FacePointOfInterestPose; +import net.createmod.ponder.api.element.WorldSectionElement; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; +import net.createmod.ponder.api.scene.Selection; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; + +public class StockTickerScenes { + + public static void stockTicker(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); + scene.title("stock_ticker", "Ordering items with Stock tickers"); + scene.configureBasePlate(0, 0, 7); + scene.scaleSceneView(0.925f); + scene.setSceneOffsetY(-0.5f); + scene.showBasePlate(); + + BlockPos link1 = util.grid() + .at(3, 3, 5); + BlockPos link2 = util.grid() + .at(5, 3, 5); + BlockPos pack1 = util.grid() + .at(3, 2, 5); + BlockPos pack2 = util.grid() + .at(5, 2, 5); + BlockPos fun1 = util.grid() + .at(3, 2, 4); + BlockPos fun2 = util.grid() + .at(5, 2, 4); + Selection link1S = util.select() + .position(link1); + Selection link2S = util.select() + .position(link2); + Selection pack1S = util.select() + .position(pack1); + Selection pack2S = util.select() + .position(pack2); + Selection fun1S = util.select() + .position(fun1); + Selection fun2S = util.select() + .position(fun2); + Selection vault = util.select() + .fromTo(4, 1, 6, 5, 3, 6); + Selection chest = util.select() + .fromTo(3, 1, 6, 3, 2, 6); + Selection scaff2 = util.select() + .position(5, 1, 5); + Selection scaff1 = util.select() + .position(3, 1, 5); + Selection belt1 = util.select() + .fromTo(6, 1, 4, 2, 1, 4); + Selection cog1 = util.select() + .position(6, 1, 3); + Selection largeCog1 = util.select() + .position(7, 0, 3); + Selection cog2 = util.select() + .position(2, 1, 6); + Selection largeCog2 = util.select() + .position(2, 0, 7); + Selection belt2 = util.select() + .fromTo(1, 1, 6, 1, 1, 1); + Selection trapdoor = util.select() + .position(1, 1, 0); + Selection cannon = util.select() + .position(2, 1, 3); + BlockPos ticker = util.grid() + .at(3, 1, 1); + Selection tickerS = util.select() + .position(3, 1, 1); + Selection seat = util.select() + .position(4, 1, 1); + + scene.idle(10); + + ElementLink linkL = scene.world() + .showIndependentSection(link1S, Direction.DOWN); + scene.world() + .moveSection(linkL, util.vector() + .of(0, -2, 0), 0); + scene.idle(15); + + ItemStack linkItem = AllBlocks.STOCK_TICKER.asStack(); + scene.overlay() + .showControls(util.vector() + .topOf(link1.below(2)), Pointing.DOWN, 50) + .rightClick() + .withItem(linkItem); + scene.idle(5); + + AABB bb1 = new AABB(link1.below(2)); + scene.overlay() + .chaseBoundingBoxOutline(PonderPalette.BLUE, link1, bb1.deflate(0.45), 10); + scene.idle(1); + bb1 = bb1.deflate(1 / 16f) + .contract(0, 8 / 16f, 0); + scene.overlay() + .chaseBoundingBoxOutline(PonderPalette.BLUE, link1, bb1, 50); + scene.idle(26); + + scene.overlay() + .showText(100) + .text("Right-click a Stock link before placement to connect to its network") + .attachKeyFrame() + .colored(PonderPalette.BLUE) + .placeNearTarget() + .pointAt(util.vector() + .centerOf(link1.below(2))); + + scene.idle(40); + + scene.world() + .showSection(tickerS, Direction.DOWN); + scene.idle(20); + + scene.overlay() + .chaseBoundingBoxOutline(PonderPalette.GREEN, ticker, new AABB(ticker), 40); + scene.overlay() + .chaseBoundingBoxOutline(PonderPalette.GREEN, link1, bb1, 40); + scene.overlay() + .showLine(PonderPalette.GREEN, util.vector() + .centerOf(ticker) + .subtract(0, 1 / 4f, 0), + util.vector() + .centerOf(link1.below(2)) + .subtract(0, 1 / 4f, 0), + 40); + scene.idle(60); + + scene.world() + .cycleBlockProperty(pack1, PackagerBlock.LINKED); + scene.world() + .cycleBlockProperty(pack2, PackagerBlock.LINKED); + + scene.world() + .moveSection(linkL, util.vector() + .of(0, 2.25, 0), 15); + scene.idle(5); + scene.world() + .showSection(scaff1, Direction.NORTH); + scene.world() + .showSection(scaff2, Direction.NORTH); + scene.idle(8); + scene.world() + .showSection(pack1S, Direction.NORTH); + scene.idle(2); + scene.world() + .showSection(pack2S, Direction.NORTH); + scene.world() + .showSection(link2S, Direction.DOWN); + scene.idle(2); + scene.world() + .moveSection(linkL, util.vector() + .of(0, -.25, 0), 10); + scene.idle(10); + scene.world() + .cycleBlockProperty(pack1, PackagerBlock.LINKED); + scene.world() + .cycleBlockProperty(pack2, PackagerBlock.LINKED); + scene.effects() + .indicateSuccess(pack1); + scene.effects() + .indicateSuccess(pack2); + scene.idle(15); + scene.world() + .showSection(chest, Direction.NORTH); + scene.idle(2); + scene.world() + .showSection(vault, Direction.NORTH); + scene.idle(15); + + scene.overlay() + .showOutline(PonderPalette.BLUE, link1, util.select() + .position(3, 2, 6), 120); + scene.overlay() + .showOutline(PonderPalette.BLUE, link2, util.select() + .fromTo(4, 2, 6, 5, 3, 6), 120); + scene.idle(30); + + scene.overlay() + .showText(80) + .text("Stock-linked packagers make their inventory available to the network") + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector() + .blockSurface(util.grid() + .at(3, 2, 5), Direction.WEST)); + scene.idle(90); + + scene.overlay() + .showOutline(PonderPalette.BLUE, ticker, tickerS, 40); + + scene.overlay() + .showText(80) + .text("Stock tickers can request items from these inventories") + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector() + .centerOf(ticker)); + scene.idle(90); + + scene.world() + .showSection(seat, Direction.WEST); + scene.idle(10); + scene.special() + .createBirb(util.vector() + .centerOf(ticker.east()), FacePointOfInterestPose::new); + + Vec3 keeper = util.vector() + .blockSurface(ticker.east(), Direction.WEST) + .add(0, 0.5, 0); + scene.overlay() + .showText(80) + .text("Seated mobs or blaze burners in front of it act as the Stock Keeper") + .attachKeyFrame() + .placeNearTarget() + .pointAt(keeper); + scene.idle(90); + + scene.overlay() + .showControls(util.vector() + .topOf(ticker.east()), Pointing.DOWN, 50) + .rightClick(); + scene.idle(10); + + scene.overlay() + .showText(80) + .text("Right-click the keeper to start ordering items") + .attachKeyFrame() + .placeNearTarget() + .pointAt(keeper); + scene.idle(60); + + scene.effects() + .indicateSuccess(ticker); + scene.idle(5); + PonderHilo.linkEffect(scene, link1); + ItemStack box1 = PackageItem.containing(List.of()); + ItemStack box2 = PackageItem.containing(List.of()); + PonderHilo.packagerCreate(scene, pack1, box1); + scene.idle(3); + PonderHilo.linkEffect(scene, link2); + PonderHilo.packagerCreate(scene, pack2, box2); + scene.idle(30); + + scene.overlay() + .showText(100) + .text("When an order is submitted, the items will be placed into packages") + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector() + .centerOf(util.grid() + .at(3, 2, 5))); + scene.idle(80); + + scene.world() + .showSection(largeCog1, Direction.UP); + scene.world() + .showSection(largeCog2, Direction.UP); + scene.idle(5); + scene.world() + .showSection(cog1, Direction.DOWN); + scene.world() + .showSection(cog2, Direction.DOWN); + scene.idle(5); + scene.world() + .showSection(belt1, Direction.DOWN); + scene.world() + .showSection(belt2, Direction.EAST); + scene.idle(10); + scene.world() + .showSection(trapdoor, Direction.SOUTH); + scene.idle(5); + scene.world() + .showSection(fun1S, Direction.DOWN); + scene.idle(5); + scene.world() + .showSection(fun2S, Direction.DOWN); + scene.idle(10); + + scene.world() + .createItemOnBelt(util.grid() + .at(3, 1, 4), Direction.SOUTH, box1); + PonderHilo.packagerClear(scene, pack1); + scene.idle(5); + scene.world() + .createItemOnBelt(util.grid() + .at(5, 1, 4), Direction.SOUTH, box2); + PonderHilo.packagerClear(scene, pack2); + scene.idle(20); + + scene.overlay() + .showText(80) + .text("From there, they can be transported to the request point") + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector() + .centerOf(util.grid() + .at(1, 1, 3))); + scene.idle(110); + + scene.world() + .hideSection(largeCog2, Direction.DOWN); + scene.world() + .hideSection(largeCog1, Direction.DOWN); + scene.idle(2); + scene.world() + .hideSection(belt1, Direction.NORTH); + scene.world() + .hideSection(belt2, Direction.WEST); + scene.world() + .hideSection(cog2, Direction.WEST); + scene.world() + .hideSection(cog1, Direction.NORTH); + scene.world() + .hideSection(trapdoor, Direction.WEST); + scene.world() + .hideSection(fun1S, Direction.NORTH); + scene.world() + .hideSection(fun2S, Direction.NORTH); + scene.idle(30); + + ItemStack filterItem = AllItems.ATTRIBUTE_FILTER.asStack(); + scene.overlay() + .showControls(util.vector() + .topOf(ticker), Pointing.DOWN, 100) + .rightClick() + .withItem(filterItem); + scene.idle(10); + + scene.overlay() + .showText(100) + .text("Using attribute or list filters, categories can be added to the item listings") + .attachKeyFrame() + .colored(PonderPalette.BLUE) + .placeNearTarget() + .pointAt(util.vector() + .centerOf(ticker)); + scene.idle(110); + + scene.overlay() + .showText(80) + .text("Right-click the block itself to open the category editor") + .colored(PonderPalette.BLUE) + .placeNearTarget() + .pointAt(util.vector() + .centerOf(ticker)); + scene.idle(100); + + scene.world() + .showSection(cannon, Direction.DOWN); + + scene.overlay() + .showText(80) + .text("Stock tickers can also request blocks required for the schematicannon") + .colored(PonderPalette.BLUE) + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector() + .centerOf(util.grid() + .at(2, 1, 3))); + scene.idle(100); + + ItemStack clipboardItem = AllBlocks.CLIPBOARD.asStack(); + scene.overlay() + .showControls(keeper, Pointing.DOWN, 100) + .rightClick() + .withItem(clipboardItem); + scene.idle(10); + + scene.overlay() + .showText(80) + .text("Simply hand the printed clipboard it generated to the keeper") + .colored(PonderPalette.BLUE) + .placeNearTarget() + .pointAt(keeper); + scene.idle(50); + + } + + public static void stockTickerAddress(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); + scene.title("stock_ticker_address", "Addressing a Stock ticker order"); + scene.configureBasePlate(0, 0, 9); + scene.scaleSceneView(.875f); + scene.setSceneOffsetY(-1); + scene.showBasePlate(); + + Selection vault = util.select() + .fromTo(6, 1, 6, 8, 3, 8); + Selection scaff = util.select() + .position(7, 1, 5); + BlockPos pack = util.grid() + .at(7, 2, 5); + BlockPos link = util.grid() + .at(7, 3, 5); + Selection belt1 = util.select() + .fromTo(8, 1, 4, 2, 1, 4) + .add(util.select() + .position(4, 2, 4)); + Selection belt2 = util.select() + .fromTo(4, 1, 0, 3, 1, 3); + Selection largeCog = util.select() + .position(2, 0, 9); + Selection cog = util.select() + .fromTo(3, 1, 5, 3, 1, 9); + Selection frog = util.select() + .position(7, 1, 1); + Selection postBox = util.select() + .fromTo(6, 1, 2, 6, 2, 2); + BlockPos seat = util.grid() + .at(1, 1, 6); + Selection tickerS = util.select() + .fromTo(2, 1, 6, 2, 2, 6); + BlockPos ticker = util.grid() + .at(2, 2, 6); + Selection packS = util.select() + .position(pack); + Selection linkS = util.select() + .position(link); + Selection funnel = util.select() + .position(7, 2, 4); + Selection linkAndPackager = util.select() + .fromTo(7, 1, 5, 7, 3, 5); + Selection seatS = util.select() + .position(1, 1, 6); + + scene.idle(10); + scene.world() + .showSection(vault, Direction.DOWN); + scene.world() + .showSection(linkAndPackager, Direction.SOUTH); + scene.idle(5); + scene.world() + .showSection(tickerS, Direction.DOWN); + scene.world() + .showSection(seatS, Direction.EAST); + scene.idle(10); + scene.special() + .createBirb(util.vector() + .centerOf(seat), FacePointOfInterestPose::new); + + scene.idle(20); + + scene.overlay() + .showText(90) + .text("When requesting items, a target address can be set in the order") + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector() + .centerOf(ticker)); + scene.idle(100); + + scene.effects() + .indicateSuccess(ticker); + PonderHilo.linkEffect(scene, link); + + scene.overlay() + .showText(40) + .colored(PonderPalette.GREEN) + .text("\u2192 Workshop") + .placeNearTarget() + .pointAt(util.vector() + .centerOf(ticker)); + + scene.idle(10); + ItemStack box1 = PackageItem.containing(List.of()); + PackageItem.addAddress(box1, "Workshop"); + PonderHilo.packagerCreate(scene, pack, box1); + scene.idle(50); + scene.overlay() + .showText(90) + .text("This address will be on all packages created for the request") + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector() + .blockSurface(pack, Direction.WEST)); + scene.idle(50); + + scene.world() + .showSection(belt1, Direction.WEST); + scene.world() + .showSection(cog, Direction.WEST); + scene.world() + .showSection(largeCog, Direction.UP); + scene.idle(5); + scene.world() + .showSection(belt2, Direction.SOUTH); + scene.idle(45); + scene.rotateCameraY(-15); + scene.idle(15); + + scene.overlay() + .showControls(util.vector() + .of(4, 2.825, 4.5), Pointing.DOWN, 60) + .withItem(AllItems.PACKAGE_FILTER.asStack()); + scene.idle(10); + scene.overlay() + .showFilterSlotInput(util.vector() + .of(4.1, 2.825, 4.5), 50); + scene.idle(30); + + scene.overlay() + .showText(70) + .text("Using package filters, this can control where the packages will go") + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector() + .of(4, 2.825, 4.5)); + scene.idle(60); + scene.world() + .showSection(funnel, Direction.DOWN); + scene.idle(15); + + scene.world() + .createItemOnBelt(util.grid() + .at(7, 1, 4), Direction.SOUTH, box1); + PonderHilo.packagerClear(scene, pack); + scene.idle(15); + + scene.world() + .multiplyKineticSpeed(util.select() + .everywhere(), 1 / 32f); + scene.idle(10); + + scene.overlay() + .showText(50) + .text("\u2192 Workshop") + .colored(PonderPalette.OUTPUT) + .placeNearTarget() + .pointAt(util.vector() + .blockSurface(util.grid() + .at(6, 2, 4), Direction.WEST)); + scene.overlay() + .showText(50) + .colored(PonderPalette.BLUE) + .text("Workshop") + .placeNearTarget() + .pointAt(util.vector() + .of(4, 2.825, 4.5)); + scene.idle(60); + + scene.world() + .multiplyKineticSpeed(util.select() + .everywhere(), 32f); + + scene.idle(60); + PonderHilo.packageHopsOffBelt(scene, util.grid() + .at(2, 1, 4), Direction.WEST, box1); + scene.idle(40); + + scene.effects() + .indicateSuccess(ticker); + PonderHilo.linkEffect(scene, link); + + scene.overlay() + .showText(40) + .colored(PonderPalette.GREEN) + .text("\u2192 Factory") + .placeNearTarget() + .pointAt(util.vector() + .centerOf(ticker)); + + scene.idle(10); + ItemStack box2 = PackageItem.containing(List.of()); + PackageItem.addAddress(box2, "Factory"); + PonderHilo.packagerCreate(scene, pack, box2); + scene.idle(20); + + scene.world() + .createItemOnBelt(util.grid() + .at(7, 1, 4), Direction.SOUTH, box2); + PonderHilo.packagerClear(scene, pack); + scene.idle(15); + + scene.world() + .multiplyKineticSpeed(util.select() + .everywhere(), 1 / 32f); + scene.idle(10); + + scene.overlay() + .showText(30) + .text("\u2192 Factory") + .colored(PonderPalette.OUTPUT) + .placeNearTarget() + .pointAt(util.vector() + .blockSurface(util.grid() + .at(6, 2, 4), Direction.WEST)); + scene.overlay() + .showText(30) + .colored(PonderPalette.BLUE) + .text("Workshop") + .placeNearTarget() + .pointAt(util.vector() + .of(4, 2.825, 4.5)); + scene.idle(40); + + scene.world() + .multiplyKineticSpeed(util.select() + .everywhere(), 32f); + + scene.idle(90); + PonderHilo.packageHopsOffBelt(scene, util.grid() + .at(4, 1, 0), Direction.NORTH, box2); + scene.idle(5); + scene.world() + .hideSection(belt1, Direction.WEST); + scene.world() + .hideSection(cog, Direction.WEST); + scene.world() + .hideSection(largeCog, Direction.DOWN); + scene.world() + .hideSection(funnel, Direction.UP); + scene.idle(5); + scene.world() + .hideSection(belt2, Direction.NORTH); + scene.rotateCameraY(15); + scene.idle(15); + + ElementLink extrasL = scene.world() + .showIndependentSection(postBox, Direction.DOWN); + scene.world() + .moveSection(extrasL, util.vector() + .of(-3, 0, 2), 0); + scene.idle(5); + scene.world() + .showSectionAndMerge(frog, Direction.DOWN, extrasL); + scene.idle(20); + + scene.overlay() + .showText(100) + .text("Aside from filters, Frogports and Postboxes have package routing abilities") + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector() + .blockSurface(util.grid() + .at(3, 2, 4), Direction.NORTH)); + scene.idle(110); + + scene.overlay() + .showText(80) + .text("Inspect them to find out more about their behaviour") + .placeNearTarget() + .pointAt(util.vector() + .blockSurface(util.grid() + .at(3, 2, 4), Direction.NORTH)); + scene.idle(90); + } + +} diff --git a/src/main/resources/assets/create/ponder/high_logistics/stock_link.nbt b/src/main/resources/assets/create/ponder/high_logistics/stock_link.nbt new file mode 100644 index 0000000000000000000000000000000000000000..bad0a4f049b1598d95800c77ddec5d60c2a90ca0 GIT binary patch literal 1139 zcmb2|=3oGW|92zK=S#ba%=`Mz>fc2bRwgH>SH0Zk0!}MpJc1WAa!3X#K1lL?bFym6 z*PfY@w@X#e<*H6-&=&v4_)ow>LGMfbgT8?3%!=7xqw~#PPcPLD6`Q70ZF|4w^WN`g z_f!^jZ&c%6vq!t;Sj4A$2hOWyb39!#`Ou~(S5v+&j`;4E!!2i*VN}0F*Y8xE9rxPD zerM9BB<_(p7TvTm^ub5%4=kb;hq!D?n~rOD?mf{gv7X6)EmMDdqxy;i!eI|q3fpX* zbfep*V_}Uu&r|Cpjr)SmKl>z3l^+S%m;Sr?fg`%0a@!}{6%SAq0>xwvr@T*OMbZov z1Dd-&`~yf9)rJ|TU+pRHjPE#^y>9B0o7zu~>pxs6dW|ch`{%0@m239hE-q4fuygPF zH3oiP@?Ti})B`4nL__9<=(lP~JzC18mvyr##+% z`|TDnn`O_}n-M*(`wv&E+sumpqxrGyJcmG0?G(P5Vz+mwJ~}P_?MB(Q5Bp{nUH&FLa`S4m5JzYu&y$ibAv2y-cgOyX`NEPTwxPtVrH=0jd;5iV z2OnfVPtwz#el+*ikNY_XRS!;kyIE}aq&L_6r_5XBXLR(pk#G0+t1n-^jQ{Y{)MkIB zSm$N7mb>$MS+d{1d?@(h<@?p0=U=fqx#mrf%QRUq?NnW&+%y*bUBY&Ki6_<0Fm2y5 zQ}==O)IX>4-#znE+~eB1Ato!^Upu`-hI_M#`FWv$2+IYxwC36TZ#XnnR*P**8eeOR z^M}idaZBu8$P}>7dTOxN`}u0AaGPs^=3>GUy8Agkvu~anx^T;as@!WYj_hGq&6u|2 z``xq0?f<>rU;E)S|NB3GUQ658&RM(9iBgxBT^2?Rm0ZOH0A!;`9FxtK`IaGQKu_E3ob7X4_Kb7#-XWchpio)0@XS zjvum|_~&!!(t}O@KLa*|i{Cv~!tiRB?OF$IAEzVdm=YEF?{40Ie$&P9O|Pztf6KAk z9^~p-`C7uZX&#rAmB)Dz2ewzqENhc1&Lr=ScyQE`^$Gu~?CXb|3#$rvOgWw%jhfBI zGAX3LXT`x+26J?zI1IEOpDo>&8K^fwZz<&jDQ{!_YJn`jhayo0 z2}LK(ID328mR4Q%`@6EUIYK7U%bw`&gkV~(BZI=5JifdK%Gr#x%` literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/ponder/high_logistics/stock_ticker.nbt b/src/main/resources/assets/create/ponder/high_logistics/stock_ticker.nbt new file mode 100644 index 0000000000000000000000000000000000000000..ba6ae39bdd590cc0269917c5d506ffb6b31eea38 GIT binary patch literal 1991 zcmZvVdo&Xa1BYjFo!nEoj+V3(q27%d@>cUk^~oidnatcKm(YxvOC&LK8`VS#i{=uE zSYd8+TUxzt!{jc)P`cqg=R5uJp6`6W|DJQ6=lrx%B?154?yRd_@YtURG*?HtE4u!o z$1&x566`Zz+Cpsy*^D4HRlR;*;$3Q6fY;jbf+ZUUc_P+NbUoY znLu(NMe7jbD^m-HRbIOSon*MTP+eN6jxE#*;gy~;^QH463z5#JO($rSbOP?lH2OD6 zY!?Zi1ctMYscEeCoa<_;c_*y=jXom(EB|iCp)LRR{+02?{@(|!|KdC=v+Q+FEg{X8 zxh|>ZhQ*dg9#soVq;RQ@V69_Am-f;Y%d0c$)a9qR80!$+Cmn^D&LMq=vT1->!7wb= zPLEz8vL>WtU=FsZiU)Y3c+E@{{3Yc#LbU5tj< z-w(^T)L}H)8X~>)?Mircy0*^QuK65u8=az|y(FIdhMq#f710ZW)3ScL)0F=Hezmpl zKI`9Am@$DLI5zWvzBhJ?u5xLRdH&Gl#U%91uV~%*?2&xNjhBKCiE#X=PF1?i=$R5a zQVM!MJT`6A*XJbD7+M_5zE%+vKk#w^_1Dc2WBI7e#+kdz9N6?CWZH2mRki$jM}Iii zKnlbF`!=OpQ(tBhLl>uB{imW-1tBA5_xFhD$99bf&l0)JPpwv7D@qWmava2*5FjC8 zLo5WtT>x3@ALEK&T*^SW0u(nwEWMVMAPi|sFN#FU^Ya;x%*1UXGAos&H@u%nuZS&n zK9@1!dlnsGMbxyT_4eT2{loz`d5U;bt12CQ`{VsO@55q%2ab!eu_h*-(v`&4XC4P; z@sF^1s7Y)xGZG1BO!T!dZBI1!j9twFHtgk&O4l1bxW8JXxo@xkY-gU2LFS3CdN7X# z1+BB$*L+$9aUkEvc?bn*!+JFs81Y&5#h?q1ZH{53{ESeSiWA>@3TE9+Z#m8uiO*5G z$9@;{w8kzYW{z#YO`A0`RisrHxr=7ejjCXO?^8LfW>BAdh*O&DoU2L+^EHNcEm|H1 zhZvTmm3|)!fa2Bah*SE}0Is*|&pz3T>!0mkQ3RtSU(Mj5_$Nh!I}vHZqJayAv|6}C z8?q-Z6$>Q zoWXVS?mS;EX0zj{DuZNOqVH*KqRl_`>e3uHdNRW&-^z6FU|t%EHFrWG8DJA68XO+q z6#^<#8ojNV4=Y?g zY5M)3#~LZaF!V<)+OzFr!{Liqxfg|wd5b8Kf-yhWgm>8x#T!$N7GCvx704-E(brcz2s9W@miibv5oR7MZ z4#R_6d3KQ|-DY=!L;Vsr+6D0H_;gvI0S`I1^3?0SoJ?1?SG`>oB(uU2ym00u+bzmV zkRAD~=spOhTy=S}MmsN%F56sMyt`?1M_VrpcL?m)$ZdQk|3QqFGa=LI^!7;CCRz%m zIWy*-*YgL)M|0>R&X|!HEobHIy343^=$MPZk+sHE8Ps!Iy=w}vu}9hAw30>WVK<6@ zBsi^Ln;VFFTu9&Ede5I_7?8HRYcb@lc3%UA$+9TDHufQzyhGoLjr_%zC?u{j8Xip_ zL_TWS3iNs*P{p2j2+Ce*!?uURM(7Q?R2N``x)%uf_pMJd|*zn zMo>fC9ywQh)%Vz`+ACT?0yp9+WyRZg89nQq>Wo~}9lbS^ zEK5AL>=}aGx5<`mS0{SNXt0gEjdRCFIA#|W-MFNN=9paXFCj$<;#a? ON7SP(;0_N80Q>_Hv)5Aq literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/ponder/high_logistics/stock_ticker_address.nbt b/src/main/resources/assets/create/ponder/high_logistics/stock_ticker_address.nbt new file mode 100644 index 0000000000000000000000000000000000000000..c69c47bd5e99aecfb9881182538e6e87221e6354 GIT binary patch literal 2429 zcmaKrc{~&TAIE7qbCY9kjX4&LQQwfhTQr8rQATpMxz&=R964gnIexK-g&ZNG!!1{+ z#GACKSXpU>z0e!o7i*YlsZYK9=sf6xAiJC!(Rbyz=g za%yR5tIf0nGtB$D6f!aSgjzEGG{xR^vBy7h*j6er$4#Z9eF)g{X8gmNFZ!nC#aoKA zJUEd44nS~Iu5W&n6{Ig{-(UBfJn6L9pigB(vSCHxKkI5YVmVzKwF}mTIbu-heT5Jy z_yAfU&UTX-L9jzCT_bBH+jjda^HI#L+m~m+%Ct<^#H7{uq5+%M{s5D55nq2VAdrOR z^`-QZfbuB7I~t+-Q9{#Uc?1G6AfHZ>te{Cibwwq811bM|y`z)PR(k&$*TfLy@1zjU z1#mC%e}omQ>ORiE`8bz>q+i{4Z+l?Iv*)%XpauL@m6F8QsRXXM)BpeN1_WwYedPwg z&ScvBJLj=Wd6|;9kMpTBnYAh!RxaG^U!fccXzh)^QEF2|L`DDZa-AxK4>#phEn{0ywekC zZ42L(G|L5LF#aOh(=1NEXP)<>uGcsq9~RN|=FPqtIExVe5|Mir?D#G!U@_yqh@?+KvVGBrHa>@Vk0X_ z`zPEBGJPtvn`Ra&n_?UjeQHLwNr>iR`TvxfTV zM3DQ9JeX%5s4)QPXeRn-sxP3X0-T0PatGM_su_u(smk^T&7fwKbDpbaUhwBcP*){A z?{(fzS0d=>ZIDNE^Ec2=hq~#Zjh8vE7WPTM(Iy^5@??!E(E2k7dDCKw%DpSSN!b|Z zhTjfr8}(xcKc_}aSX>`W+5u2wZ8aTZrD{)nBsm&SAwZuFBW5BG|f zc;Y=U`K6+xjz@HInpj+aY%y<(0$b1E954pL4 zChyG`XFuD>V07&t?%u6ajnn^nU5@NY-M>3i|Bn5475Vn$Chj(BH<_bo~)rut-sDfo%58$Qslp1!%a z?3&r6!e<|@>3? z9#c0O4mWWsS}cu$6vw1K0p3@MOfdlbHTJl_jl29>jop(yLpTq-`>cnlR zww?AO5u$N=(XMZE+=jYz!E9LPHjUmd9J4Cb^fRIJHuD1EdpBM4yQO)tf>dpsUF$po9v5QDKAY`-HuWts|7jmvY{#3l@k0!=Jx$8C{79k2xuwz@ zwQh*umWE)iosVlYTbDzl<_A>RNu`fp_eR0+11sa7lQi7gEou-e9!$WaKke;M2e^dl zj{>Yu!#@~2Fg_}Ttf>dph%XpFyXWx!dloy4 zKvI)yRbx&)tp1wgu(h_u9t>p@N=_xkNAY?VGhBCB)V-;liRs4ppB&G<^+j?#ZiW+! zI%&uTSeWTdzeCxCIsI5CkNwaz9sz)yyCy%v#B&@tp`P!|xFj91c1Lj+p5NoHL;>RO zGBvrutpPESEA24)FbcncDJG%sNou;kb9Xra+0Nh3E&S3VUd1R?Ml8e@-tI}xsPm4r zz)F4=jV=*}i9+GmUuhAZq2>|%BO{1@a z1O*FtZLQjeAnW7=p%OLm`B)dlm)VMG7dlk8>-n8h;djVr#iEf-eU-R^+VM zVkr@wJ9W|VeoqGG+RAEPVpb(D8yv!&Nzmm#^gP-^mKB8e7{y_Ax=vbvxR=%(61u?HU0on9*fyx1_Y_9dQ0a3ATa%*7K z>sj-#Drhf6W?n=-<2v&WYi0h9xoj_C1Is%3dF$3-8Wj#dA8)%Spy}_(uVl%?^A|9% Bqay$S literal 0 HcmV?d00001 From e86b080017645973242012f05f68885845504218 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Tue, 14 Jan 2025 11:54:09 -0500 Subject: [PATCH 302/515] What a bad mix up - Fix accessors by removing and replacing with method handles/AT's --- build.gradle | 2 +- .../armor/TrimmableArmorModelGenerator.java | 22 ++++++++++++++++--- .../accessor/ItemModelGeneratorsAccessor.java | 16 -------------- .../mixin/accessor/ModelBuilderAccessor.java | 14 ------------ .../resources/META-INF/accesstransformer.cfg | 3 +++ src/main/resources/create.mixins.json | 2 -- 6 files changed, 23 insertions(+), 36 deletions(-) delete mode 100644 src/main/java/com/simibubi/create/foundation/mixin/accessor/ItemModelGeneratorsAccessor.java delete mode 100644 src/main/java/com/simibubi/create/foundation/mixin/accessor/ModelBuilderAccessor.java diff --git a/build.gradle b/build.gradle index 23b98f6aea..b06bdcec03 100644 --- a/build.gradle +++ b/build.gradle @@ -134,7 +134,7 @@ legacyForge { } repositories { - maven { url = "https://maven.createmod.net" } // Ponder, Catnip + //maven { url = "https://maven.createmod.net" } // Ponder, Catnip maven { url = "https://maven.tterrag.com" } // Registrate, Flywheel maven { url = "https://maven.blamejared.com" } // JEI, Vazkii's Mods maven { url = "https://harleyoconnor.com/maven" } // Dynamic Trees diff --git a/src/main/java/com/simibubi/create/content/equipment/armor/TrimmableArmorModelGenerator.java b/src/main/java/com/simibubi/create/content/equipment/armor/TrimmableArmorModelGenerator.java index 9f01f16b33..5974e43a4e 100644 --- a/src/main/java/com/simibubi/create/content/equipment/armor/TrimmableArmorModelGenerator.java +++ b/src/main/java/com/simibubi/create/content/equipment/armor/TrimmableArmorModelGenerator.java @@ -1,7 +1,6 @@ package com.simibubi.create.content.equipment.armor; import com.simibubi.create.Create; -import com.simibubi.create.foundation.mixin.accessor.ItemModelGeneratorsAccessor; import com.simibubi.create.foundation.mixin.accessor.ModelBuilderAccessor; import com.tterrag.registrate.providers.DataGenContext; import com.tterrag.registrate.providers.RegistrateItemModelProvider; @@ -13,12 +12,28 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ArmorItem; import net.minecraft.world.item.Item; import net.minecraftforge.client.model.generators.ItemModelBuilder; +import net.minecraftforge.client.model.generators.ModelBuilder; + +import java.lang.invoke.MethodHandles; +import java.lang.invoke.VarHandle; +import java.util.Map; public class TrimmableArmorModelGenerator { + public static final VarHandle TEXTURES_HANDLE; + + static { + try { + MethodHandles.Lookup lookup = MethodHandles.privateLookupIn(ModelBuilder.class, MethodHandles.lookup()); + TEXTURES_HANDLE = lookup.findVarHandle(ModelBuilder.class, "textures", Map.class); + } catch (IllegalAccessException | NoSuchFieldException e) { + throw new RuntimeException(e); + } + } + public static void generate(DataGenContext c, RegistrateItemModelProvider p) { T item = c.get(); ItemModelBuilder builder = p.generated(c); - for (ItemModelGenerators.TrimModelData data : ItemModelGeneratorsAccessor.create$getGENERATED_TRIM_MODELS()) { + for (ItemModelGenerators.TrimModelData data : ItemModelGenerators.GENERATED_TRIM_MODELS) { ResourceLocation modelLoc = ModelLocationUtils.getModelLocation(item); ResourceLocation textureLoc = TextureMapping.getItemTexture(item); String trimId = data.name(item.getMaterial()); @@ -31,7 +46,8 @@ public class TrimmableArmorModelGenerator { } ItemModelBuilder itemModel = p.withExistingParent(trimModelLoc.getPath(), parent) .texture("layer0", textureLoc); - ((ModelBuilderAccessor) itemModel).create$getTextures().put("layer1", trimLoc.toString()); + Map textures = (Map) TEXTURES_HANDLE.get(itemModel); + textures.put("layer1", trimLoc.toString()); builder.override() .predicate(ItemModelGenerators.TRIM_TYPE_PREDICATE_ID, data.itemModelIndex()) .model(itemModel) diff --git a/src/main/java/com/simibubi/create/foundation/mixin/accessor/ItemModelGeneratorsAccessor.java b/src/main/java/com/simibubi/create/foundation/mixin/accessor/ItemModelGeneratorsAccessor.java deleted file mode 100644 index df4f4e7124..0000000000 --- a/src/main/java/com/simibubi/create/foundation/mixin/accessor/ItemModelGeneratorsAccessor.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.simibubi.create.foundation.mixin.accessor; - -import net.minecraft.data.models.ItemModelGenerators; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import java.util.List; - -@Mixin(ItemModelGenerators.class) -public interface ItemModelGeneratorsAccessor { - @Accessor("GENERATED_TRIM_MODELS") - static List create$getGENERATED_TRIM_MODELS() { - throw new AssertionError(); - } -} diff --git a/src/main/java/com/simibubi/create/foundation/mixin/accessor/ModelBuilderAccessor.java b/src/main/java/com/simibubi/create/foundation/mixin/accessor/ModelBuilderAccessor.java deleted file mode 100644 index 86356ac459..0000000000 --- a/src/main/java/com/simibubi/create/foundation/mixin/accessor/ModelBuilderAccessor.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.simibubi.create.foundation.mixin.accessor; - -import net.minecraftforge.client.model.generators.ModelBuilder; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import java.util.Map; - -@Mixin(ModelBuilder.class) -public interface ModelBuilderAccessor { - @Accessor(value = "textures", remap = false) - Map create$getTextures(); -} diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 56dcc8a224..40641cf0a2 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -37,3 +37,6 @@ public net.minecraft.client.gui.components.CommandSuggestions$SuggestionsList Date: Tue, 14 Jan 2025 14:10:52 -0500 Subject: [PATCH 303/515] Cat in the box --- build.gradle | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/build.gradle b/build.gradle index b06bdcec03..643dabec5f 100644 --- a/build.gradle +++ b/build.gradle @@ -134,7 +134,7 @@ legacyForge { } repositories { - //maven { url = "https://maven.createmod.net" } // Ponder, Catnip + maven { url = "https://maven.createmod.net" } // Ponder, Catnip maven { url = "https://maven.tterrag.com" } // Registrate, Flywheel maven { url = "https://maven.blamejared.com" } // JEI, Vazkii's Mods maven { url = "https://harleyoconnor.com/maven" } // Dynamic Trees @@ -151,11 +151,6 @@ repositories { } } - // Mirror of maven.createmod.net - if (System.getProperty("os.name").contains("Mac") && System.getenv("USER") == "ithundxr") { - maven { url = "https://maven.ithundxr.dev/mirror" } - } - mavenCentral() mavenLocal() flatDir { From 90832f471e6467c5a42f9ebd14b6c9513280cba1 Mon Sep 17 00:00:00 2001 From: Kryppers <65094918+Kryppers@users.noreply.github.com> Date: Tue, 14 Jan 2025 19:58:05 +0000 Subject: [PATCH 304/515] Now you're thinking with pipes updated smart pipe textures --- .../models/block/smart_fluid_pipe/block.json | 9 +++++---- .../models/block/smart_fluid_pipe/item.json | 12 +++++++----- .../create/textures/block/smart_pipe_1.png | Bin 362 -> 1587 bytes .../create/textures/block/smart_pipe_2.png | Bin 537 -> 2065 bytes .../create/textures/block/smart_pipe_3.png | Bin 0 -> 212 bytes 5 files changed, 12 insertions(+), 9 deletions(-) create mode 100644 src/main/resources/assets/create/textures/block/smart_pipe_3.png diff --git a/src/main/resources/assets/create/models/block/smart_fluid_pipe/block.json b/src/main/resources/assets/create/models/block/smart_fluid_pipe/block.json index 87269c7a9b..b04a2fb2da 100644 --- a/src/main/resources/assets/create/models/block/smart_fluid_pipe/block.json +++ b/src/main/resources/assets/create/models/block/smart_fluid_pipe/block.json @@ -5,6 +5,7 @@ "2": "create:block/smart_pipe_1", "3": "create:block/smart_pipe_2", "4": "create:block/pipes", + "5": "create:block/smart_pipe_3", "particle": "block/copper_block" }, "elements": [ @@ -12,11 +13,11 @@ "from": [3, 3, 3], "to": [13, 13, 13], "faces": { - "north": {"uv": [3, 3, 4, 4], "texture": "#2"}, - "east": {"uv": [3, 3, 13, 13], "texture": "#2"}, - "south": {"uv": [3, 3, 4, 4], "texture": "#2"}, + "north": {"uv": [3, 3, 13, 13], "texture": "#5"}, + "east": {"uv": [13, 3, 3, 13], "texture": "#2"}, + "south": {"uv": [3, 3, 13, 13], "texture": "#5"}, "west": {"uv": [3, 3, 13, 13], "texture": "#2"}, - "up": {"uv": [3, 3, 13, 13], "rotation": 270, "texture": "#2"}, + "up": {"uv": [13, 3, 3, 13], "rotation": 270, "texture": "#2"}, "down": {"uv": [3, 3, 13, 13], "rotation": 270, "texture": "#2"} } }, diff --git a/src/main/resources/assets/create/models/block/smart_fluid_pipe/item.json b/src/main/resources/assets/create/models/block/smart_fluid_pipe/item.json index 985a8098fb..1b18e17fd1 100644 --- a/src/main/resources/assets/create/models/block/smart_fluid_pipe/item.json +++ b/src/main/resources/assets/create/models/block/smart_fluid_pipe/item.json @@ -4,7 +4,9 @@ "textures": { "1": "create:block/pipes", "2": "create:block/smart_pipe_1", - "3": "create:block/smart_pipe_2" + "3": "create:block/smart_pipe_2", + "4": "create:block/smart_pipe_3", + "particle": "create:block/smart_pipe_3" }, "elements": [ { @@ -37,11 +39,11 @@ "from": [3, 3, 3], "to": [13, 13, 13], "faces": { - "north": {"uv": [3, 3, 4, 4], "texture": "#2"}, - "east": {"uv": [3, 3, 13, 13], "texture": "#2"}, - "south": {"uv": [3, 3, 4, 4], "texture": "#2"}, + "north": {"uv": [3, 3, 13, 13], "texture": "#4"}, + "east": {"uv": [13, 3, 3, 13], "texture": "#2"}, + "south": {"uv": [3, 3, 13, 13], "texture": "#4"}, "west": {"uv": [3, 3, 13, 13], "texture": "#2"}, - "up": {"uv": [3, 3, 13, 13], "rotation": 270, "texture": "#2"}, + "up": {"uv": [13, 3, 3, 13], "rotation": 270, "texture": "#2"}, "down": {"uv": [3, 3, 13, 13], "rotation": 270, "texture": "#2"} } }, diff --git a/src/main/resources/assets/create/textures/block/smart_pipe_1.png b/src/main/resources/assets/create/textures/block/smart_pipe_1.png index 017ca27c8eb473d2229a32606c11fb9e0883eab9..72c3e60ab41c0d28971661f142a475e7bd5d0129 100644 GIT binary patch delta 1571 zcmV+;2Hg4T0<#Q|BYyaB^>EX>4U6ba`-PAZ2)IW&i+q+U-|cwi_u7 z{AU%j1SBC4%i(#>>|mBZMMK-ZH_jwClg~8A2GdZ8DoJ2B{`q^lzwoeUc0rTH9HYk* za>!iJF#mkUsk8TUwF5qM`sgu=+=mx;i%{P6GipICyYsQ0EPo(*nGhc}z3V6a)Gv=^ z_=81u17Xvz{hEF9ua7-Hb9S59vs2@(9nv#EP4R|^9xh>>erL`nE4+UY78#eDJ2 zQSjY2Ur`!mViG?oP^UtZ##J|JFfs7pwDjS|a`l-c&fLTcNpKP*(Bvdpx|pyu9wO-F zhb?rio3G^>8Gjb;gpo`DBh0vpyBq(vyak%GEs6-czqx{4%u5DZEXw-EC+gOMzA)XoxPPVDO=$qCr)o zCN<4kqQnq2#+c%Y#gZh2q$#G9Eag;8ESOrfWMbaGw^Mw%Ag$mRoV1yY$et$DX?N+{>T=R~ljHh$9Ufd6WrPn=-@H z8E2X{^M5Q4)h<=t2hF}!?!Q%|qZ$Nrmu3NjZq?A8(hWf?o#@gGig6$)o|Xb|XkMCm zqY!v0=ayzZGonHnR_YR`(^3oyhC!^89@;&X`$jj1xc^n%_*FT#r28Gpxh35j<-XPJ zjcR@6_qO8DBeAV8T%>wI_+h}X!iEw2wc34k!hav2U#O?jYB;WKLVM{HuQyYyTf5$I zExrhss~;J^)fAMFe5~ClC0{)_p4@0#ZyX)@1Ax`tuAzk~_YXgDF1@qOy)}01X{|~x z((7Jo;v`-PcA1chXE_rF;;mJu+gd7KuQ4lbulE&k+;#73k_{EJjgO2@4P0Qj!nsq% zIe!-%evE=tW(UXrpr+9`FDY}XF;%}2-9Tb$O*edGLFU?Q*r+&?FC$v(cJI5%ejjj7 zzZ&cm93O^TNWR__2qOD%qc-V>Uf>=K$95RTB>*JX$70PR7u>W)Svh8}JEnv^DyVn& z*7LSS7^xyZL~BnsD52Z9oh|s7EN^y31%Jg4pf7WrHmyUDg`0MA7s-qyC)*K{=00NI zi$%S~B+JK7d@AjjqIu|rf?sZ<{5r`GvOkk-hXtg}5s&LuIAFg$B&B>}4mn=qo-E{E zSq@K33m;(kY{q<>bUdj?7{9#^mr{2(zEi`>jfY@`@iU&V2E+#k6!%JT-ppdlH-C)m zjpEKb@>4aRUt_`a0 zNip9h8_wv1veLw0zGDrUVr~+m(SHcy4#&7ql%M9f*x7Z;D=FIY#P!E7<315jqU(s# zyj=p9nV~!M@u%lT(Xe|g;DWQQz=m6NF90X}kcV-h$|r6+?n3+%wz{9%%paiN2$XOi z#Q%EtFZUP5m{6NCV*mgE24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU0DlV;0RWnu z7ytkO2XskIMF;5t4ih&HN&hZ$0002!Nkl_|DGFl$v|evOg2Gy}2=DeV&3K;Qd!88??mjB{;%hQKO(#Rd zCPa#WPP+*}Bo(92H^e4nzJC&YFV{v_%NxA3pLqXxWdTG9xUD(>ezRfl!PdX(pqek7 z=a$YrE$q7veb>3%_v(gYH2|n}yTIl3?402@{IUgg8d|g?DCFF9aP+*ZI!Zk&UT9zw zmqnq0pB${`(j5e0qVxVhtWtKqo;_Bn!84B4;7|UunEmRHBo!hXMI0)F|7>F(EY4Wy VS}o&o;nV;C002ovPDHLkV1nXk>f8VT delta 311 zcmV-70m%Nd4C(@qBM<-vVoOIv06+jc05Gpt+3S-F1s;Fs3={znI8RF6egFUf_en%S zR5;7skTFifKoCVAD9BkvypFLFdMcCya0Db8#3?ufC*U~T0U9_!#^LJ+8&ttDk?yk?jFRo6}s$%u<%H(hiK$aI=-Yi&!DNm0t+}=O8 zeWPxGbOnEB3!iYQIPoQ(H~=6SI~)gswQrEF*qUI!OWY#|fZ4n@1)e1EWcxmwi`HWe z02ocD0PXKh-RL|1p#x2vx+y~UdUhuGisLPwm9bUt4X`y2p*J8gm9-wcLHbz&uzoje zijpX)ci$AhdgHMM=+qD{6D%}78002ov JPDHLkV1n}shnxTa diff --git a/src/main/resources/assets/create/textures/block/smart_pipe_2.png b/src/main/resources/assets/create/textures/block/smart_pipe_2.png index b713f0fe8f6b6037114625e31b78fc1aeb2095dc..8dee533e26169bdbe25daed3305f83a02137c2d1 100644 GIT binary patch delta 2052 zcmV+f2>bV$1d$MsBYy?adQ@0+Qek%>aB^>EX>4U6ba`-PAZ2)IW&i+q+O1b@mMkX- z{qHKW1QAqRj-Tgb2U&iurB;8;^vk>?RcA(jT(3Ek|N4HbXpA~TL^%D475s8;!ay^MJpW@A0HJYsl-9wq>a(o*vv{a{00#iS{voMALWbH?th z8G_;p7b(7k5{s5pas_>=R9{1lRcor*G}pLE^DVU4w566ibx^5G_dWF3wWpp3s5W@W z@FR>kbbq9gZ`3YS%?oBoSB%}ImBMoPWFG99$4jV6bYRE<)V2t7{EH@-zGE zH5Cm$tzAvI2d!m&swh*%UUSsdx6yTf>48t#ED`J8SfomCmk{Th&@B5sI-GR5+Y6=U zmyU{jEfG>Ptqw}v^W}RiE_&Jr0br=nuvmbx6m^*{`EAcK=e~9zuQ|sxPd3D~gVIZC;MV#eA;aw}Mg^#) zwDoAL`Q7giZhODoj%3ZHRV=-D)a+KoHgQ~YMboK=9Uj=f`fYyT_+`qYanoW=uP7?W zr0q`NR&V&<8NzKtJ*di26w}7MS6g4;Xn$iVLdTUsZ9@_`+g>((oO{qJ%)^y^XfH!* zbDJAYOm3Sps3aTEXh%X%*ymvC-R?-fkJRgqY%*xpdW(5eF4rj3HSR^IGI?zX=rVPa zeS~Uz-kysgYR7ieI^4-P0HLj}53@y;6Z>#LZy8Bx^H|o5R#4}J^L>nkc6cS#et%1~ zZ_|aEjs6Ob@hHG9%GT=u2ia}05tVZyPjN*s;SMsE_Nm6NWY1zw`M|BEoV>LW#pP$@ zzDZy{C1ue=Tjb;}A80r#OWe!6k3H!%-x_)!e^BPkYn}UzGB@m0seB^c z7ZS>@*)tvF}F!527US-L^t6J-bySj8x=#>XQbkcm|<>lnqrGTyy zlkc84%h+k6XizTg7HPtrXnq$LX?565*sg-p;u^BH&Yu+Lt5%@&;ja1JpnraH*BpPt z`A$OQ{9HF-7+rvL)&lyeKx;;oAwt4(kN&Qro zBJR~++Wuzic+h4@Y6gSbb3xCDnimROJuESlmncolVb5wmh-5$#w0bbZ%PU2&f} zLf8!f1v{bCuJr?D#HSbkj}iWyr(dpsX$9M7QUq@+OY^!b<#ZK#w8oF5=dfya6N&5( zneh{|fxPB#F1sN1G$O0Z00006VoOIv0RI600RN!9r;`8x010qNS$}f?01FcU01FcV z0GgZ_00007bV*G`2k8M06E_jW_alY?00F^CL_t(I%Z-ygZ_`i|hMz>H`D$xN+6g#nFr>)~8 zQW&DRwQ$m|EiFePoC!B*=Oabuy zXN&uHN|ZJPQeI>zZ3yl?Q26?Oz~=Q8ykHawm|^?T4FLWaJ#OAzrgE!@BoM6_o`=8mTt421iHezieE4 zgjNxuJ$YH+tY!e$9)(*w^Icg%x8p}L|F?-31@6~c92}Yv``<=?x(C+j5RBg3G1hgD i-Mwn~kb&r2(K(1i}Mp|zG0000#FkD?{{y1-+OcL^p=d&Ds>YAv2xJ zAjxl1%;qxy%xVggDHU)KF`diAVo6mQ6D1CdybdV}R28rQ=mz2rhB=S)9fvXRCcwJ% z={pXV?a~dL=o>sor|l1mx}J|~_b^XvE^L?E`+$FmbV?|?thS=KYIgg$5g+*XX-$)Wvb#BCi)-E)a5mdWv~sJB<>KlbK-Ht{)OxzgmgZpF^eYh5~RAL;7u0Y-d%YGc*(*x4<{ dexy+w{{qmGraXc6<`)0}002ovPDHLkV1hzUaiAg_PZ!4!i_^&o5}z6bX9}-e^l5(l4CeK1{rU9!B5l&F30`G6Gi|dS)rIF(?-Dia0J|y$m#m!PC{xWt~$(69BmvKOF!7 literal 0 HcmV?d00001 From 54899c03cf0561720048dbf85df99cd456bb88c4 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Tue, 14 Jan 2025 23:19:43 +0100 Subject: [PATCH 305/515] He who ponders - Redstone requester ponder scene --- .../ponder/AllCreatePonderScenes.java | 3 + .../scenes/highLogistics/PonderHilo.java | 9 + .../highLogistics/RequesterAndShopScenes.java | 283 ++++++++++++++++++ .../highLogistics/StockTickerScenes.java | 8 +- .../high_logistics/redstone_requester.nbt | Bin 0 -> 1763 bytes 5 files changed, 296 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/RequesterAndShopScenes.java create mode 100644 src/main/resources/assets/create/ponder/high_logistics/redstone_requester.nbt diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderScenes.java index 838b8e5175..05e0125015 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderScenes.java @@ -44,6 +44,7 @@ import com.simibubi.create.infrastructure.ponder.scenes.fluid.SpoutScenes; import com.simibubi.create.infrastructure.ponder.scenes.highLogistics.FrogAndConveyorScenes; import com.simibubi.create.infrastructure.ponder.scenes.highLogistics.PackagerScenes; import com.simibubi.create.infrastructure.ponder.scenes.highLogistics.PostboxScenes; +import com.simibubi.create.infrastructure.ponder.scenes.highLogistics.RequesterAndShopScenes; import com.simibubi.create.infrastructure.ponder.scenes.highLogistics.StockLinkScenes; import com.simibubi.create.infrastructure.ponder.scenes.highLogistics.StockTickerScenes; import com.simibubi.create.infrastructure.ponder.scenes.trains.TrackObserverScenes; @@ -367,6 +368,8 @@ public class AllCreatePonderScenes { HELPER.forComponents(AllBlocks.STOCK_TICKER) .addStoryBoard("high_logistics/stock_ticker", StockTickerScenes::stockTicker) .addStoryBoard("high_logistics/stock_ticker_address", StockTickerScenes::stockTickerAddress); + HELPER.forComponents(AllBlocks.REDSTONE_REQUESTER) + .addStoryBoard("high_logistics/redstone_requester", RequesterAndShopScenes::requester); // Trains HELPER.forComponents(TrackMaterial.allBlocks() diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/PonderHilo.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/PonderHilo.java index 2ba708f1de..23675323e4 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/PonderHilo.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/PonderHilo.java @@ -8,6 +8,7 @@ import net.createmod.ponder.api.element.ElementLink; import net.createmod.ponder.api.element.EntityElement; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.core.particles.ParticleTypes; import net.minecraft.core.particles.VibrationParticleOption; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.gameevent.BlockPositionSource; @@ -61,4 +62,12 @@ public class PonderHilo { }); } + public static void requesterEffect(CreateSceneBuilder scene, BlockPos pos) { + scene.addInstruction(s -> { + Vec3 vec3 = Vec3.atCenterOf(pos); + s.getWorld() + .addParticle(ParticleTypes.NOTE, vec3.x, vec3.y + 1, vec3.z, 0, 0, 0); + }); + } + } diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/RequesterAndShopScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/RequesterAndShopScenes.java new file mode 100644 index 0000000000..424a2482ab --- /dev/null +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/RequesterAndShopScenes.java @@ -0,0 +1,283 @@ +package com.simibubi.create.infrastructure.ponder.scenes.highLogistics; + +import java.util.List; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.content.logistics.box.PackageItem; +import com.simibubi.create.content.logistics.packager.PackagerBlock; +import com.simibubi.create.foundation.ponder.CreateSceneBuilder; + +import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.PonderPalette; +import net.createmod.ponder.api.element.ElementLink; +import net.createmod.ponder.api.element.ParrotPose.FacePointOfInterestPose; +import net.createmod.ponder.api.element.WorldSectionElement; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; +import net.createmod.ponder.api.scene.Selection; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; + +public class RequesterAndShopScenes { + + public static void requester(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); + scene.title("redstone_requester", "Automated orders with Redstone Requesters"); + scene.configureBasePlate(0, 0, 7); + scene.showBasePlate(); + + Selection vault = util.select() + .fromTo(4, 1, 3, 5, 2, 5); + Selection packS = util.select() + .fromTo(3, 1, 4, 3, 2, 4); + BlockPos pack = util.grid() + .at(3, 2, 4); + BlockPos link = util.grid() + .at(3, 3, 4); + Selection linkS = util.select() + .position(3, 3, 4); + Selection funnel = util.select() + .position(2, 2, 4); + Selection belt = util.select() + .fromTo(2, 1, 5, 2, 1, 2); + Selection cogs = util.select() + .fromTo(3, 1, 6, 3, 1, 5); + Selection largeCog = util.select() + .position(3, 0, 7); + BlockPos req = util.grid() + .at(3, 1, 1); + Selection reqS = util.select() + .position(3, 1, 1); + Selection buttonAndRedstone = util.select() + .fromTo(1, 1, 1, 2, 1, 1); + Selection ticker = util.select() + .fromTo(3, 1, 0, 4, 1, 0); + + scene.idle(10); + + ElementLink linkL = scene.world() + .showIndependentSection(linkS, Direction.DOWN); + scene.world() + .moveSection(linkL, util.vector() + .of(0, -2, 0), 0); + scene.idle(15); + + ItemStack linkItem = AllBlocks.REDSTONE_REQUESTER.asStack(); + scene.overlay() + .showControls(util.vector() + .topOf(link.below(2)), Pointing.DOWN, 50) + .rightClick() + .withItem(linkItem); + scene.idle(5); + + AABB bb1 = new AABB(link.below(2)); + scene.overlay() + .chaseBoundingBoxOutline(PonderPalette.BLUE, link, bb1.deflate(0.45), 10); + scene.idle(1); + bb1 = bb1.deflate(1 / 16f) + .contract(0, 8 / 16f, 0); + scene.overlay() + .chaseBoundingBoxOutline(PonderPalette.BLUE, link, bb1, 50); + scene.idle(26); + + scene.overlay() + .showText(100) + .text("Right-click a Stock link before placement to connect to its network") + .attachKeyFrame() + .colored(PonderPalette.BLUE) + .placeNearTarget() + .pointAt(util.vector() + .centerOf(link.below(2))); + + scene.idle(40); + + scene.world() + .showSection(reqS, Direction.DOWN); + scene.idle(20); + + scene.overlay() + .chaseBoundingBoxOutline(PonderPalette.GREEN, ticker, new AABB(req), 40); + scene.overlay() + .chaseBoundingBoxOutline(PonderPalette.GREEN, link, bb1, 40); + scene.overlay() + .showLine(PonderPalette.GREEN, util.vector() + .centerOf(req) + .subtract(0, 1 / 4f, 0), + util.vector() + .centerOf(link.below(2)) + .subtract(0, 1 / 4f, 0), + 40); + scene.idle(60); + + scene.world() + .cycleBlockProperty(pack, PackagerBlock.LINKED); + + scene.world() + .moveSection(linkL, util.vector() + .of(0, 2.25, 0), 10); + scene.idle(8); + scene.world() + .showSection(packS, Direction.NORTH); + scene.idle(3); + scene.world() + .moveSection(linkL, util.vector() + .of(0, -.25, 0), 10); + scene.idle(10); + scene.world() + .cycleBlockProperty(pack, PackagerBlock.LINKED); + scene.effects() + .indicateSuccess(pack); + scene.idle(5); + scene.world() + .showSection(vault, Direction.WEST); + scene.idle(30); + + scene.overlay() + .showText(110) + .text("Just like Stock tickers, Redstone requesters can order items from the logistics network") + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector() + .blockSurface(req, Direction.WEST)); + scene.idle(120); + + scene.overlay() + .showControls(util.vector() + .topOf(req), Pointing.DOWN, 80) + .rightClick(); + scene.idle(10); + + scene.overlay() + .showOutlineWithText(reqS, 80) + .text("Right-click the requester to open its configuration UI") + .attachKeyFrame() + .colored(PonderPalette.BLUE) + .placeNearTarget() + .pointAt(util.vector() + .blockSurface(req, Direction.WEST)); + + scene.idle(90); + scene.world() + .showSection(buttonAndRedstone, Direction.EAST); + scene.idle(5); + scene.world() + .showSection(belt, Direction.EAST); + scene.world() + .showSection(cogs, Direction.NORTH); + scene.world() + .showSection(largeCog, Direction.UP); + scene.world() + .showSection(funnel, Direction.DOWN); + scene.idle(30); + + scene.world() + .toggleRedstonePower(util.select() + .fromTo(1, 1, 1, 3, 1, 1)); + scene.effects() + .indicateRedstone(util.grid() + .at(1, 1, 1)); + PonderHilo.requesterEffect(scene, req); + scene.idle(5); + ItemStack box = PackageItem.containing(List.of()); + PonderHilo.packagerCreate(scene, pack, box); + PonderHilo.linkEffect(scene, link); + scene.idle(20); + + PonderHilo.packagerClear(scene, pack); + scene.world() + .createItemOnBelt(util.grid() + .at(2, 1, 4), Direction.EAST, box); + scene.idle(15); + + scene.world() + .toggleRedstonePower(util.select() + .fromTo(1, 1, 1, 3, 1, 1)); + + scene.overlay() + .showText(120) + .text("The order set in the UI will be requested on every redstone pulse") + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector() + .blockSurface(util.grid() + .at(3, 2, 4), Direction.WEST)); + scene.idle(60); + + scene.world() + .toggleRedstonePower(util.select() + .fromTo(1, 1, 1, 3, 1, 1)); + scene.effects() + .indicateRedstone(util.grid() + .at(1, 1, 1)); + PonderHilo.requesterEffect(scene, req); + scene.idle(5); + ItemStack box2 = box.copy(); + PonderHilo.packagerCreate(scene, pack, box2); + PonderHilo.linkEffect(scene, link); + scene.idle(20); + + PonderHilo.packagerClear(scene, pack); + scene.world() + .createItemOnBelt(util.grid() + .at(2, 1, 4), Direction.EAST, box2); + scene.idle(15); + + scene.world() + .toggleRedstonePower(util.select() + .fromTo(1, 1, 1, 3, 1, 1)); + scene.idle(60); + + scene.world() + .hideSection(reqS, Direction.UP); + scene.world() + .hideSection(buttonAndRedstone, Direction.WEST); + scene.idle(15); + ElementLink tickerL = scene.world() + .showIndependentSection(ticker, Direction.DOWN); + scene.world() + .moveSection(tickerL, util.vector() + .of(0, 0, 1), 0); + scene.idle(5); + scene.special() + .createBirb(util.vector() + .centerOf(util.grid() + .at(4, 1, 1)), + FacePointOfInterestPose::new); + scene.idle(20); + + Vec3 keeper = util.vector() + .blockSurface(util.grid() + .at(4, 1, 1), Direction.WEST) + .add(0, 0.5, 0); + scene.overlay() + .showControls(util.vector() + .topOf(util.grid() + .at(4, 1, 1)), + Pointing.DOWN, 50) + .rightClick() + .withItem(linkItem); + scene.idle(10); + + scene.overlay() + .showText(80) + .text("Alternatively, the requester can be fully configured before placement") + .attachKeyFrame() + .colored(PonderPalette.BLUE) + .placeNearTarget() + .pointAt(keeper); + scene.idle(90); + + scene.overlay() + .showText(100) + .text("Right-click a Stock keeper with it and set the desired order there") + .colored(PonderPalette.BLUE) + .placeNearTarget() + .pointAt(keeper); + scene.idle(90); + + } + +} diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/StockTickerScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/StockTickerScenes.java index 89512a8ca2..266a03698f 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/StockTickerScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/StockTickerScenes.java @@ -183,7 +183,7 @@ public class StockTickerScenes { scene.idle(2); scene.world() .showSection(vault, Direction.NORTH); - scene.idle(15); + scene.idle(10); scene.overlay() .showOutline(PonderPalette.BLUE, link1, util.select() @@ -404,8 +404,6 @@ public class StockTickerScenes { Selection vault = util.select() .fromTo(6, 1, 6, 8, 3, 8); - Selection scaff = util.select() - .position(7, 1, 5); BlockPos pack = util.grid() .at(7, 2, 5); BlockPos link = util.grid() @@ -430,10 +428,6 @@ public class StockTickerScenes { .fromTo(2, 1, 6, 2, 2, 6); BlockPos ticker = util.grid() .at(2, 2, 6); - Selection packS = util.select() - .position(pack); - Selection linkS = util.select() - .position(link); Selection funnel = util.select() .position(7, 2, 4); Selection linkAndPackager = util.select() diff --git a/src/main/resources/assets/create/ponder/high_logistics/redstone_requester.nbt b/src/main/resources/assets/create/ponder/high_logistics/redstone_requester.nbt new file mode 100644 index 0000000000000000000000000000000000000000..5b9985092ff1f549eb2a16f9a0a9e072151a4be8 GIT binary patch literal 1763 zcmZvUcQhLc1I6hwVtXQXLrCRR)Tr^i1fj8OloO-Gc+^%gQf;+%wDzc3tvph`QbJU$ z)<{rFUyMgosi2g`_M}$xzVrR_`p0+wx#ymHe^)7kpXYz#j=GKJ%$onA1dT;<>Xi6j zK3hu!Xk1KzfjfjfJIJAC6z7E8zIudJy@8^RVnpmcn0_uy@C}aDBmRR&M1G-1T)C(6F`VsS6r}JIVVP--f8@9Z*MiNdqDh_f+UR1? zlTF%*12gZxE>Sh^>FeBK^Y7?yp`X)F2>Qa$2mgW`)c-9;Ok=!kwuecRSr9d2Udh#l zntD@>-uIS6E*ivZyeF3r<>3&d$(y5lI#IFXs;q;nr`rhH%lo^ zN?5l$)Qz4`#WV;Ux4VQyY;8qd;*K{Y3JQNn-?CW8$f;FjN1Zp~otd3Iu1mqSrmonc zd-5oVVfAtcrwlE81|b^5a{v0yFHhy|+@Ab6`y-sy>c$HZE)lq=u%WSiWbyrh+*>^B zSOIj*u66=(+6%W2I}?SX>K+#IpusoX)W!u_3 zMeU$t-AwhVuRtHVbx4c5FK@AEw&Gorv58HO{YkK40T{9q;~5tX9zs;+ovu-Q3kBqwWgs?!d+u<1O~DHK=f?a=4gp zMr46yVim`7{|i#aO((=t9jYB_)1Vc9Au0B=iqpv6T2{FYS@4A{N?z zwRuq7B=*x8`<`E?LW|BJt`XPxM_sLQQ(kPLbjol8lj_9~T|afGfZgZR0NpPTVoPDc z>XlcItz-Dg9oF&ZIMOTJ)BW%t?XUkdj{8AreAaOo%yu0J$9o;FtPB&dEx`}v<2eJ3 zVB*rFqq*o%s+_Susc`llRBAT60s7C-Wj@73aq_Bi1tp={@c;oVsUDI!xXkY{o;qo0 z1Ju3AM%BNbP+h}D;|&IfF8Po{#Ib?v}GOVkd>z=yk;{Gao-%e*3GtqNI|k z0z7_s9`CdWO71FS|9MAeXn7FiNZaz}j~N4;h|u9cy6Ky;Hr%z7a#rF}kN2jIK=B`T xJsYQgL*qaW(z~?DH%-h`8E}_)M7-C4JQh4cFguUhQzCMC?SrvoV`Uzme*pD{W>^3K literal 0 HcmV?d00001 From a59c510ad0658f9a524fe838cea3705bf82b074c Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Wed, 15 Jan 2025 14:29:39 +0100 Subject: [PATCH 306/515] Fix broken import --- .../equipment/armor/TrimmableArmorModelGenerator.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/equipment/armor/TrimmableArmorModelGenerator.java b/src/main/java/com/simibubi/create/content/equipment/armor/TrimmableArmorModelGenerator.java index 5974e43a4e..7509cfadd8 100644 --- a/src/main/java/com/simibubi/create/content/equipment/armor/TrimmableArmorModelGenerator.java +++ b/src/main/java/com/simibubi/create/content/equipment/armor/TrimmableArmorModelGenerator.java @@ -1,7 +1,10 @@ package com.simibubi.create.content.equipment.armor; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.VarHandle; +import java.util.Map; + import com.simibubi.create.Create; -import com.simibubi.create.foundation.mixin.accessor.ModelBuilderAccessor; import com.tterrag.registrate.providers.DataGenContext; import com.tterrag.registrate.providers.RegistrateItemModelProvider; @@ -14,10 +17,6 @@ import net.minecraft.world.item.Item; import net.minecraftforge.client.model.generators.ItemModelBuilder; import net.minecraftforge.client.model.generators.ModelBuilder; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.VarHandle; -import java.util.Map; - public class TrimmableArmorModelGenerator { public static final VarHandle TEXTURES_HANDLE; From 65a47b77241b8dae439fbd8572edb56985f1a4fa Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Wed, 15 Jan 2025 16:48:00 +0100 Subject: [PATCH 307/515] Keep them pondering - Re-packager scene --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 1344 ++++++++++++----- .../resources/assets/create/lang/en_ud.json | 16 + .../resources/assets/create/lang/en_us.json | 16 + .../ponder/AllCreatePonderScenes.java | 3 + .../highLogistics/RepackagerScenes.java | 394 +++++ .../ponder/high_logistics/repackager.nbt | Bin 0 -> 2214 bytes 6 files changed, 1359 insertions(+), 414 deletions(-) create mode 100644 src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/RepackagerScenes.java create mode 100644 src/main/resources/assets/create/ponder/high_logistics/repackager.nbt diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index b80b758dd8..dd7351f072 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-10-30T20:54:22.388304073 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2025-01-15T16:45:15.2390714 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -15,24 +15,32 @@ c9aa3f6acdcadfcd6f0c48457ddafcdd9ff37104 assets/create/blockstates/andesite_enca 1299bde31535b381cc2d9b40f58097702bd12b92 assets/create/blockstates/andesite_ladder.json afff577673aec43b9a596c4663024cb35127e0c3 assets/create/blockstates/andesite_pillar.json 0d47d0816051dd63837c689de8b838dc1639d2fd assets/create/blockstates/andesite_scaffolding.json +beb5fd89e2c6701bca3c7c579b1b1f965a7ff71a assets/create/blockstates/andesite_table_cloth.json 67c4f7802f0854d24bb29019682b1d0a2f335a15 assets/create/blockstates/andesite_tunnel.json 542af96eb0c1e34df81f15fae7dbbaf4f81287f3 assets/create/blockstates/asurine.json 7f07775d89e3bea45d7161d289daf15470e7f544 assets/create/blockstates/asurine_pillar.json +a850a113b4cfd8f1c827905b79b8629c40de12b0 assets/create/blockstates/bamboo_window.json +dfaec148d3bb21efb2ef7106a2d04454c4134303 assets/create/blockstates/bamboo_window_pane.json 9c62e0ce5d85ac4081bc04c85db7676b996b0f12 assets/create/blockstates/basin.json a97910c7516e7cedec9e34eca51f1183f1e3e681 assets/create/blockstates/belt.json 0ea03133af234921a3313f52521d8cfd02bf5d81 assets/create/blockstates/birch_window.json 2003c43151b731bf19cae58290c63bcb3785848a assets/create/blockstates/birch_window_pane.json c8b65faf51122eb411f5895e718869da9b260c2e assets/create/blockstates/black_nixie_tube.json +fdc7dad3daa231e3d1906a1f0a84f254a31cf2c7 assets/create/blockstates/black_postbox.json 980ae9ba3f6d4e0faea8f3878985f9a9dadc0796 assets/create/blockstates/black_sail.json da3ad0225984a0dcbfb4ed800e307e45aff5aaa1 assets/create/blockstates/black_seat.json +1ea958c40f0cbf63c31d9b5422b6b86f9268e393 assets/create/blockstates/black_table_cloth.json 0083f6aa3fda2c7ebb2e5f2a032e740cf3ae3846 assets/create/blockstates/black_toolbox.json 28f2fb355e80171403e540afd2aed44e9c19659a assets/create/blockstates/black_valve_handle.json 06ecd28cd97f4e8200dc396858695cad57b871c8 assets/create/blockstates/blaze_burner.json 37caf031254b5171a1fbfe9906f4bc65e8dbc909 assets/create/blockstates/blue_nixie_tube.json +80cd0b998a2e21d6ca77419139c24a7ad97c2538 assets/create/blockstates/blue_postbox.json d540f0f23e0d7c03f8e147cf3eebbaf7caec9f93 assets/create/blockstates/blue_sail.json d2fdb432bb037de781260c789e905b223fab408c assets/create/blockstates/blue_seat.json +27241e0fd5a034c461f6920f94b852c6e825ce56 assets/create/blockstates/blue_table_cloth.json f91092da79b69fece9583ccc15350612f439ee1b assets/create/blockstates/blue_toolbox.json e330efa253172b315f73401ed8f2c39270ba90d3 assets/create/blockstates/blue_valve_handle.json +a02d3059619edf0bd19dbf397cb35f0f8b8fb20e assets/create/blockstates/bound_cardboard_block.json 5c7065e56a831e0957b6531d50f720e9efb64309 assets/create/blockstates/brass_bars.json d49d09f1026f816bb05a5dc13c806b860f2eb07a assets/create/blockstates/brass_belt_funnel.json 5a2551315557447abc579cf9225e3a12d9a46641 assets/create/blockstates/brass_block.json @@ -44,14 +52,21 @@ bac88b313b63acfc77c25b1463276a714f22f336 assets/create/blockstates/brass_encased a408005aae4c1caa7aaae5a0ddf9d1ad73cd0254 assets/create/blockstates/brass_funnel.json 1e8eba1ac6a0beb744f8b5feb96bbe5f3a75f214 assets/create/blockstates/brass_ladder.json 6d210298b9d80ae69aa03b09aa73b92e14b9ab1b assets/create/blockstates/brass_scaffolding.json +61f5242e85c36ecf0f7963954236c60596ec9cbe assets/create/blockstates/brass_table_cloth.json 8ee948f9e87b82bb27aaecc522127fa1297b3d9d assets/create/blockstates/brass_tunnel.json debf33346bf410216f21082e1e8d07aa6250b84c assets/create/blockstates/brown_nixie_tube.json +bc6719074acbec67e345005aeee352fd7bc54c09 assets/create/blockstates/brown_postbox.json 1334fc9e71d9f2a6117f448817263467a9c695de assets/create/blockstates/brown_sail.json 19524b2c0672632e63372f405a87dbea35f1d160 assets/create/blockstates/brown_seat.json +41a93cdd7ef066a844b750b657dce766df29d301 assets/create/blockstates/brown_table_cloth.json 1ffc38bf682e84aad4cb300c573375eb0cdcc434 assets/create/blockstates/brown_toolbox.json 440b29e1dffa4374ddc1aed444bff18a485bc1cb assets/create/blockstates/brown_valve_handle.json 2064534de4791b339fdcd4ef3a8129a2e233ec50 assets/create/blockstates/calcite_pillar.json +6a3e661d54423af7a8d642b813deb8f5331013c5 assets/create/blockstates/cardboard_block.json 060c957b28afed9f4e0954cbef7e80cbf4b99f58 assets/create/blockstates/cart_assembler.json +fab98b93ad9b78312742daca83c2575db40fce98 assets/create/blockstates/chain_conveyor.json +178c651f169ffc32556738bb5c19b4a746cfa085 assets/create/blockstates/cherry_window.json +b1796f89bd7785d00dc8618ca90d760da4f258bb assets/create/blockstates/cherry_window_pane.json c7eca70054241944171b1d4ffcba0376b071ec62 assets/create/blockstates/chocolate.json 9eb989b0a0545af9efd052d1f127b2ec28a972d1 assets/create/blockstates/chute.json b5170d754ce5f07ea2b4646eb07c099c50bae249 assets/create/blockstates/clipboard.json @@ -68,12 +83,13 @@ b5170d754ce5f07ea2b4646eb07c099c50bae249 assets/create/blockstates/clipboard.jso f7254f20f91e2f1295e36d2e70390d43f3952d07 assets/create/blockstates/copper_door.json 736777de0eb038ff1ef9e8fe9d04c23d80239eda assets/create/blockstates/copper_ladder.json df3103dfc1c3ba7a9573229d009cb0de4925df16 assets/create/blockstates/copper_scaffolding.json +4d3d29e8a74bf103da39e76a1466b03eb5dcf916 assets/create/blockstates/copper_shingles.json 1ea8fdb990f8cda1762ab69ac38ea3161a835227 assets/create/blockstates/copper_shingle_slab.json 7c35bb802099d6bb5d92eafd8cbb7ea146979a2e assets/create/blockstates/copper_shingle_stairs.json -4d3d29e8a74bf103da39e76a1466b03eb5dcf916 assets/create/blockstates/copper_shingles.json +5c5ba06bf5b0a2c57d0aa42e85880f36d9694a78 assets/create/blockstates/copper_table_cloth.json +9a9f03140a57a7a8903d3e1b159bdc052566a6ec assets/create/blockstates/copper_tiles.json 7db7a0d81887091ca889f40bb8a508d3098c5164 assets/create/blockstates/copper_tile_slab.json c0b7eca017242913d156e4623147add0d03574f6 assets/create/blockstates/copper_tile_stairs.json -9a9f03140a57a7a8903d3e1b159bdc052566a6ec assets/create/blockstates/copper_tiles.json ef3ccb2d8b03f5a972b053a15bb037f8db6af17c assets/create/blockstates/copper_valve_handle.json 4758bed22fb6fe18213f463bc055775c1909e858 assets/create/blockstates/copycat_bars.json 4789c857508452aede1cb7389187b99ce2d7bf62 assets/create/blockstates/copycat_base.json @@ -90,120 +106,122 @@ c9a2c3a7971c46957d0f07c6d94d76f59da54a0b assets/create/blockstates/crushing_whee 4b0e51a1c10685f7d432467339afc9c2e24793b0 assets/create/blockstates/crushing_wheel_controller.json ba9c3ecfacbd398048440d247decffeaefc714b5 assets/create/blockstates/cuckoo_clock.json 1f6d84cba69062a1989d671c9c97317e2c2455b6 assets/create/blockstates/cut_andesite.json +cc62a6499ce8dcfc5e8695f0e8bb3c3d67f41efc assets/create/blockstates/cut_andesite_bricks.json 50d88f806122818af2ffecbd514d13ebbd21e4c9 assets/create/blockstates/cut_andesite_brick_slab.json 32d801225ea18209792921fa91618ed41794dbd0 assets/create/blockstates/cut_andesite_brick_stairs.json 3bf8204bf8c7c5b7b3c388fbc3478bb2d7c47129 assets/create/blockstates/cut_andesite_brick_wall.json -cc62a6499ce8dcfc5e8695f0e8bb3c3d67f41efc assets/create/blockstates/cut_andesite_bricks.json 34e89a828f14383c6115954a235b19851b74f277 assets/create/blockstates/cut_andesite_slab.json 49d58ae14544d89305ddc707cf7f6a81998200fa assets/create/blockstates/cut_andesite_stairs.json 1cc235cb6c388324793ac40f7bf89df8b048faac assets/create/blockstates/cut_andesite_wall.json 13ea54a4b9b89e576879a6e23a029c6341b7c098 assets/create/blockstates/cut_asurine.json +51c22c0547ab8ed2564890afb8733bbe356899f5 assets/create/blockstates/cut_asurine_bricks.json cf09de38f826fe000c5efe5afe56cf746125691d assets/create/blockstates/cut_asurine_brick_slab.json 1835482d5e9a59f2214336a63b12c7132ad815b4 assets/create/blockstates/cut_asurine_brick_stairs.json c48ab37bf7a2aba676af281d29cb6a2103c72fba assets/create/blockstates/cut_asurine_brick_wall.json -51c22c0547ab8ed2564890afb8733bbe356899f5 assets/create/blockstates/cut_asurine_bricks.json 1523a57124239a99da0b12a6b435c09d3d4276a5 assets/create/blockstates/cut_asurine_slab.json cc1acf5e118f1b1e78c5bb291176008960794d59 assets/create/blockstates/cut_asurine_stairs.json 139640bf41070e8eeb48647319eee54bb6804692 assets/create/blockstates/cut_asurine_wall.json 06b8c5cf98366608c480a37e6944d0d668bc8983 assets/create/blockstates/cut_calcite.json +979c70e35d806f1f63fe3381f27d881a17f9f6be assets/create/blockstates/cut_calcite_bricks.json a8f83cb8e1eae587f4e11e37c4cd3d0a1bbef377 assets/create/blockstates/cut_calcite_brick_slab.json 1eabb2e485aa323d317fa9648be02c12556593b7 assets/create/blockstates/cut_calcite_brick_stairs.json a0a33df71c5d26344a7bb0dd7a4622c30cc7825f assets/create/blockstates/cut_calcite_brick_wall.json -979c70e35d806f1f63fe3381f27d881a17f9f6be assets/create/blockstates/cut_calcite_bricks.json e3ddaae92b52cc3ea230088ff23260b5c5c93017 assets/create/blockstates/cut_calcite_slab.json 80c5249eaf9504c743c427fdd1a2c7bfa0f3d48f assets/create/blockstates/cut_calcite_stairs.json b4bbdb08d8114b6741546a0418cb54d645481c02 assets/create/blockstates/cut_calcite_wall.json 449f5180c72a028393afdac55a34e59862728224 assets/create/blockstates/cut_crimsite.json +25d731077a131d03347296c38c76b547194a6320 assets/create/blockstates/cut_crimsite_bricks.json d2c8a3580d3578c8afe44b94d4448be3680dbdeb assets/create/blockstates/cut_crimsite_brick_slab.json a3d9d2190a23b881dd3a7538ab248e0b0a3efa8e assets/create/blockstates/cut_crimsite_brick_stairs.json 3791c00ed477c0aaf7c5a20803a89dfc0e20f013 assets/create/blockstates/cut_crimsite_brick_wall.json -25d731077a131d03347296c38c76b547194a6320 assets/create/blockstates/cut_crimsite_bricks.json c9f19e7a976a7428b3dd58f45d734700ca1a18cd assets/create/blockstates/cut_crimsite_slab.json 1b8d4ac53dc5823083c2af605165a05b73c9ff79 assets/create/blockstates/cut_crimsite_stairs.json 484f9253ed92e963f398973a99fbeacb67ba1188 assets/create/blockstates/cut_crimsite_wall.json c4e95ceb7914da09ebe42d539bf5d976a3d70972 assets/create/blockstates/cut_deepslate.json +75d4ef863cd85d8f3df78226177966954e02ee2b assets/create/blockstates/cut_deepslate_bricks.json e1dc99a48b9066732fc5c62071c5ead16f34f438 assets/create/blockstates/cut_deepslate_brick_slab.json dbb2eddaf1d4ae3e687beb611552ea4283a1e7d8 assets/create/blockstates/cut_deepslate_brick_stairs.json 91c1f3da848503067c64b966ddda22ab91ff8fd5 assets/create/blockstates/cut_deepslate_brick_wall.json -75d4ef863cd85d8f3df78226177966954e02ee2b assets/create/blockstates/cut_deepslate_bricks.json 593198ffd37eae124a8366ae1d4a40b682788f92 assets/create/blockstates/cut_deepslate_slab.json f8cd1f9002ed8593ab71af9cfb7f962625994108 assets/create/blockstates/cut_deepslate_stairs.json c2d8060a0c830e5b8bbb084457083324b5b6f4c9 assets/create/blockstates/cut_deepslate_wall.json aaa6ac5f4fc399c4b03a7f8de856fa7aae97e049 assets/create/blockstates/cut_diorite.json +08b6289ca8b4193c87324ca23ca081e8773fb223 assets/create/blockstates/cut_diorite_bricks.json 423f809f06fa3fd96643f068ba0d3520269b3844 assets/create/blockstates/cut_diorite_brick_slab.json 9011fb92f57e7695c4484c923dd40ecd749ff307 assets/create/blockstates/cut_diorite_brick_stairs.json 41bad89777a33737bc0365ce2c7ffc20720f9620 assets/create/blockstates/cut_diorite_brick_wall.json -08b6289ca8b4193c87324ca23ca081e8773fb223 assets/create/blockstates/cut_diorite_bricks.json b03e7cf494c53c6f24ba93d0ef531e839026932b assets/create/blockstates/cut_diorite_slab.json 95c8094204979acfb0e59c2826003e0274a02fe5 assets/create/blockstates/cut_diorite_stairs.json e2f163d36dd5d03c0741dd2e87d8f77a0c86ae00 assets/create/blockstates/cut_diorite_wall.json f42ca2ce8e8f657c64376759413ec611f8045531 assets/create/blockstates/cut_dripstone.json +2d696162b2085c3d5723308a8d1ccafb29660f01 assets/create/blockstates/cut_dripstone_bricks.json 9310a800fb091014e7c0a220f5f2511c1de379ad assets/create/blockstates/cut_dripstone_brick_slab.json 3ff2f65dafcb4654b99e0d65b7e851760f9a4075 assets/create/blockstates/cut_dripstone_brick_stairs.json cafc956d8dc2053e5a0e8437c4ccde7fa24fc17e assets/create/blockstates/cut_dripstone_brick_wall.json -2d696162b2085c3d5723308a8d1ccafb29660f01 assets/create/blockstates/cut_dripstone_bricks.json 9cb32af3b952b841e9da94789da17cd274c3cfb9 assets/create/blockstates/cut_dripstone_slab.json da0300f54bdfcc705beb8d84f26406be660de5de assets/create/blockstates/cut_dripstone_stairs.json 83ff3eaeb481202c77e6dbdc442b4dd195ca568c assets/create/blockstates/cut_dripstone_wall.json bf501250fd2226838afe0baf68db08cd832e3c4f assets/create/blockstates/cut_granite.json +5c029d7ec837b3239d17ab91a70f025df1bfb124 assets/create/blockstates/cut_granite_bricks.json 773717bd5c140cf025f463c99c67efb9d27bd696 assets/create/blockstates/cut_granite_brick_slab.json 97d20b21e5b7f329c1b21b436fd0bdcaa8d173d0 assets/create/blockstates/cut_granite_brick_stairs.json 5e4175b6c89039ded48937ad1cd13d3bb2d2992a assets/create/blockstates/cut_granite_brick_wall.json -5c029d7ec837b3239d17ab91a70f025df1bfb124 assets/create/blockstates/cut_granite_bricks.json 42549436ce26ad7b44f2e1cba54357b3f25bcb18 assets/create/blockstates/cut_granite_slab.json e9d8fd028d8092e5fa0fd13cd638516f57a22d53 assets/create/blockstates/cut_granite_stairs.json 2daab523202dd2e31daeaf3b9a04cde2a7da4ca5 assets/create/blockstates/cut_granite_wall.json 0652c8b9c41acc1a8da901bd7b8b6018b3581d5b assets/create/blockstates/cut_limestone.json +508ee569f313b7e804f6268ca86f5a61851563ec assets/create/blockstates/cut_limestone_bricks.json 4efbeb34c96918e9b48dc484a82b1ef4811ed39d assets/create/blockstates/cut_limestone_brick_slab.json 11b99cf9b33d7f8de9d11cc1e405e2681682ba32 assets/create/blockstates/cut_limestone_brick_stairs.json b6c02a9e9e47a8e521a54ef9488259267068f032 assets/create/blockstates/cut_limestone_brick_wall.json -508ee569f313b7e804f6268ca86f5a61851563ec assets/create/blockstates/cut_limestone_bricks.json fb63a2581211fe62344985a06feec9dcec4b1888 assets/create/blockstates/cut_limestone_slab.json ffcca1e66718f3e78e544b5fa9954a852c095e91 assets/create/blockstates/cut_limestone_stairs.json a1a90f84b47f96b4384fc2d60bfc48ddbb5ed179 assets/create/blockstates/cut_limestone_wall.json 1b7a133518780d4f49474a70e7f6263d6e88ff51 assets/create/blockstates/cut_ochrum.json +6f37e5e2dca3b443951131cb82c15a981a4e2005 assets/create/blockstates/cut_ochrum_bricks.json f1e9d54a6f9f41b968f117a7be711011effa71a5 assets/create/blockstates/cut_ochrum_brick_slab.json 8d334e026e94b304a1ff1ee96097f434b50175f2 assets/create/blockstates/cut_ochrum_brick_stairs.json e92c026ee7ab2aa35003ad475bef3d6c0e29818c assets/create/blockstates/cut_ochrum_brick_wall.json -6f37e5e2dca3b443951131cb82c15a981a4e2005 assets/create/blockstates/cut_ochrum_bricks.json 5a61edb7d146e83d951795fae33dc306e71b2cb6 assets/create/blockstates/cut_ochrum_slab.json b31944bf6297685acd37631083dde0889c08ede7 assets/create/blockstates/cut_ochrum_stairs.json df33a8af1dc8cb08ddcfd22a50a305499479a4dd assets/create/blockstates/cut_ochrum_wall.json 1606d7481e56755f07e9331cf85a8d7cc9aace9a assets/create/blockstates/cut_scorchia.json +bc2a0e7f11400b8c2a03071be87dadb5edc097de assets/create/blockstates/cut_scorchia_bricks.json 43db25ebac2f5bcaa7ca9cfb6da8fcb20fad8269 assets/create/blockstates/cut_scorchia_brick_slab.json 7a80620590ba5e61967c5168f5c67ecabf09dc00 assets/create/blockstates/cut_scorchia_brick_stairs.json e4eb79360a41bb1a7ca835d61446ea5166e4cda8 assets/create/blockstates/cut_scorchia_brick_wall.json -bc2a0e7f11400b8c2a03071be87dadb5edc097de assets/create/blockstates/cut_scorchia_bricks.json c0d262f54e3b2fce8bc941a2a6df71db5f0229ea assets/create/blockstates/cut_scorchia_slab.json de2e918058e9dd7eafd085a8dec634f6a2832c21 assets/create/blockstates/cut_scorchia_stairs.json 5d2d06799b82449754f62b1d80b9ee9a24c65bad assets/create/blockstates/cut_scorchia_wall.json 76ea4f3438a3effedfc93d2bbabac0899610cd28 assets/create/blockstates/cut_scoria.json +6d9c79e1b71656a73bb69e2a9b100be59084dd2e assets/create/blockstates/cut_scoria_bricks.json 7c7dcd1fe82f3673910620c2eefebad5d0029cdf assets/create/blockstates/cut_scoria_brick_slab.json d535b387bf0a6f9e124eed8b76d899e13699bca9 assets/create/blockstates/cut_scoria_brick_stairs.json c426e1b5e4c77c25cd0d16d10fba0e0731673dd1 assets/create/blockstates/cut_scoria_brick_wall.json -6d9c79e1b71656a73bb69e2a9b100be59084dd2e assets/create/blockstates/cut_scoria_bricks.json fb692494c88358d4d8e687b216f729d6b6bd7174 assets/create/blockstates/cut_scoria_slab.json 950f43bae8f4e3220103ce0c62f444856129ca12 assets/create/blockstates/cut_scoria_stairs.json 01350030831c5b9edef0dc2c778b92f1ebc2b2fc assets/create/blockstates/cut_scoria_wall.json c0c1c4d44eba5babe9703eca31f0279ebd11ed8e assets/create/blockstates/cut_tuff.json +9bddef4a2b4a338c15f03e2397c4cd4c3ae9e5d9 assets/create/blockstates/cut_tuff_bricks.json 11306e83915e0106d48f890df3212c3a47443a08 assets/create/blockstates/cut_tuff_brick_slab.json e8951d94e0d3228700bcb56819928f1c179c3973 assets/create/blockstates/cut_tuff_brick_stairs.json 619340b7cf014cfb72a4b5440b90881535f16108 assets/create/blockstates/cut_tuff_brick_wall.json -9bddef4a2b4a338c15f03e2397c4cd4c3ae9e5d9 assets/create/blockstates/cut_tuff_bricks.json 3577e3f4933ea8cb7464c28e80867ce84917898d assets/create/blockstates/cut_tuff_slab.json 5673fdb02439d622c56dc0ff47a0dca98dc6d027 assets/create/blockstates/cut_tuff_stairs.json 12a46ee82536665400ec2f3befed3be58325d5c6 assets/create/blockstates/cut_tuff_wall.json beb9e47f8d811c2146f68daf992fb805342a65cb assets/create/blockstates/cut_veridium.json +04d07986eb86ffd66baaaf9b65e02d00022e98e2 assets/create/blockstates/cut_veridium_bricks.json 952543c03e730443d85059ec43642efb089485e7 assets/create/blockstates/cut_veridium_brick_slab.json 6a033e7b5a0b26cce5956c6c7c1eff558f866cb5 assets/create/blockstates/cut_veridium_brick_stairs.json 43689138c8018b3ee9f35a11870887e9df3c8fe5 assets/create/blockstates/cut_veridium_brick_wall.json -04d07986eb86ffd66baaaf9b65e02d00022e98e2 assets/create/blockstates/cut_veridium_bricks.json 212d8ee5dfa78802b9539640cf8b263fd5880b87 assets/create/blockstates/cut_veridium_slab.json c11f09df4a23e951bdf9a345515183f4fac7cde3 assets/create/blockstates/cut_veridium_stairs.json 3aa6f5e613ff73952e3de00408051f92316e7f81 assets/create/blockstates/cut_veridium_wall.json bb627b2e78dba6833cf2d357033f253fc89aa1b8 assets/create/blockstates/cyan_nixie_tube.json +21b830af3dc477c527885d6590e0a8419ffb4fa2 assets/create/blockstates/cyan_postbox.json f1061b8f9757374d6608fda07e301a2623e79f72 assets/create/blockstates/cyan_sail.json 538c6d95da5cc460e99c91647dac61726a91479f assets/create/blockstates/cyan_seat.json +c2fc64da0466fe9daa63c18c35221736c1e091df assets/create/blockstates/cyan_table_cloth.json c4d84b719762aca46cdb8decddfeb97dcc50676c assets/create/blockstates/cyan_toolbox.json 477d32008d5aa6ed5a6825a70b9bb7d976e7d0fc assets/create/blockstates/cyan_valve_handle.json f4d7f5a38db9b92399a81f49ff1787d025c6f41f assets/create/blockstates/dark_oak_window.json @@ -212,6 +230,7 @@ c705f9cd47042867c87fab3a898a57152dec6dd5 assets/create/blockstates/deepslate_pil 1073fe9e96ea170c81b613835064034f967945b5 assets/create/blockstates/deepslate_zinc_ore.json d0ec99fdd534e1f3a84cc51fa914d3b74fb2c96a assets/create/blockstates/deployer.json 4f18fd003ca756417fd036bd8b66f323e0ca4852 assets/create/blockstates/depot.json +5b933ed479ec646f8cc2cd3739405c34737d517c assets/create/blockstates/desk_bell.json 26a5a4c176e75b1f48f3eb653a45c23e606f07b4 assets/create/blockstates/diorite_pillar.json d45d92164f81fd42cc1f8c6ba4ac25df0fca79b1 assets/create/blockstates/display_board.json a65771f280051a884725073d14a831539bc0d658 assets/create/blockstates/display_link.json @@ -222,12 +241,13 @@ f7f5df9086c71688cbdb5d05c394dc5acb8fb338 assets/create/blockstates/elevator_cont d47bc65703e9582cc710e6408fb565e16d3514a6 assets/create/blockstates/encased_fan.json 651f9fdb11f56d887d131be8f936f508d0b2fc1d assets/create/blockstates/encased_fluid_pipe.json 489ad4daeaed702d231a3f175f7b66846f5789a6 assets/create/blockstates/experience_block.json +5f6c60a30889b043709066707e80a21081d98155 assets/create/blockstates/exposed_copper_shingles.json 74c8a72db3dd3fa919e29baaa8c5865f13490461 assets/create/blockstates/exposed_copper_shingle_slab.json 4e0b5a9be15f0c2861f5f6bd71bd9c2a4db2a21d assets/create/blockstates/exposed_copper_shingle_stairs.json -5f6c60a30889b043709066707e80a21081d98155 assets/create/blockstates/exposed_copper_shingles.json +5299b4f7b9b3490872e8c26a6b212e14dd05fd9a assets/create/blockstates/exposed_copper_tiles.json 6ee73ff3608d51fdad6e9810feee66ed1773b81c assets/create/blockstates/exposed_copper_tile_slab.json f93e4059876bfc6d70b9fa2bc24d8e3d6943d56f assets/create/blockstates/exposed_copper_tile_stairs.json -5299b4f7b9b3490872e8c26a6b212e14dd05fd9a assets/create/blockstates/exposed_copper_tiles.json +4b30365ed77db9c5754eeda5fee81d47b568b946 assets/create/blockstates/factory_gauge.json f1a03ede031d8c4e33a4d07c529e71936da9dc6d assets/create/blockstates/fake_track.json 21fa4a1bf4ee851e090a21c97c9a38d18cfddf0d assets/create/blockstates/fluid_pipe.json 185e6367c5c5b3632e54148c74987057cbfccaca assets/create/blockstates/fluid_tank.json @@ -244,13 +264,17 @@ ff9f56912d8ac4069df90505232820f9c45f5e06 assets/create/blockstates/gantry_carria 5a193991f33a1af8659192f3693e4d8d3ed0082b assets/create/blockstates/glass_fluid_pipe.json e3f2a093c436cb65c5a7ac049a14cc4dadb22526 assets/create/blockstates/granite_pillar.json 921cf220c44a67195c90a30c4c296e65311738da assets/create/blockstates/gray_nixie_tube.json +024b9e82cc5802e8a9ff22880f8098d07fd192e7 assets/create/blockstates/gray_postbox.json 30ba031a6b5a327d2a4caa12169676da573c2133 assets/create/blockstates/gray_sail.json f35a502c4a5e2703e7c6811b3d2ba16a9c47d4c8 assets/create/blockstates/gray_seat.json +612058f415131fb127280c24d5d089793c103a7a assets/create/blockstates/gray_table_cloth.json 87457e0eddae80225dbb3145f2d120296ea1bfcd assets/create/blockstates/gray_toolbox.json f18b87db39836eef20154b239d488eebb64b3455 assets/create/blockstates/gray_valve_handle.json 0f0fe2bf83f763e04cd2d7a979beb547feac3191 assets/create/blockstates/green_nixie_tube.json +587c4f761858d888097c83f132c0a2d66ded3c56 assets/create/blockstates/green_postbox.json 0a2a5fbf2cf084e1be0426a224c291dc22a826fd assets/create/blockstates/green_sail.json b4aede1847d204ecdb7847559066d9d2ffb66903 assets/create/blockstates/green_seat.json +98587a931a565d4196f71ac4928846a7d55b3645 assets/create/blockstates/green_table_cloth.json 6f080890b3b30c46ba9ceb382c1171940bf4966f assets/create/blockstates/green_toolbox.json a343aefdb4207d1bffa6f4b40e20283a6d42c2f9 assets/create/blockstates/green_valve_handle.json 23430b770b5257af36844dfe9b976e343a6d1180 assets/create/blockstates/hand_crank.json @@ -260,7 +284,10 @@ d0b26c085df3ee5189082bc18945e5f74ee529fa assets/create/blockstates/haunted_bell. bffc2169f5fc3a8e22f8952a90767e0bb8d726b5 assets/create/blockstates/horizontal_framed_glass_pane.json 8ae52808eba950c36b75d62113e9cea9441a1a54 assets/create/blockstates/hose_pulley.json 87fa830c5d3541d096fab32d430c54516c197583 assets/create/blockstates/industrial_iron_block.json +3727801604445df291112fd9b99f99bbdcfa0f6d assets/create/blockstates/industrial_iron_window.json +877418ed76fdc589788db119663ca3e52e26a2aa assets/create/blockstates/industrial_iron_window_pane.json 2788ad2d29996076f7f18ab8d47e40c1ad10b348 assets/create/blockstates/item_drain.json +3151ed4019d851ab2a7b07f1327bc4bfb6ed7227 assets/create/blockstates/item_hatch.json 3e99569e978c0fe17ec18b97881434a9da1a8421 assets/create/blockstates/item_vault.json 8680e9d2a94231f4bbad87b26ab2efdb714903d3 assets/create/blockstates/jungle_window.json ddcf1010e43c5d4a8c93aad37cc97a94343fd9f5 assets/create/blockstates/jungle_window_pane.json @@ -283,27 +310,35 @@ ca124508c59130d21f23d7b1ef354d78bdd24dd4 assets/create/blockstates/layered_tuff. 2ff5466f9ea3b1292c24a8ddb31666d74635c592 assets/create/blockstates/layered_veridium.json fcf02725651ab5973fab1cfc09fdd68cb4b93579 assets/create/blockstates/lectern_controller.json 5d7e1b08b1ec7c7c11b70db11df09311fcd7cf45 assets/create/blockstates/light_blue_nixie_tube.json +3a7ceaefb2f7a24eac6bb3676a8fee01290a535f assets/create/blockstates/light_blue_postbox.json f2354e8cb6086473ac97a5228b99706858dcad8a assets/create/blockstates/light_blue_sail.json 6b7045eaf9efe3a90f2d9a6785be6a5fd534b8e7 assets/create/blockstates/light_blue_seat.json +ba0ae5046b643f82338e98ae56a48c01cf2d5972 assets/create/blockstates/light_blue_table_cloth.json b7065e7871c3c7f1a0656c2f92f82544e606f2fb assets/create/blockstates/light_blue_toolbox.json 549882a0f4de60906ca870a6197330f81d4e1afe assets/create/blockstates/light_blue_valve_handle.json fa5fb2be73c7c54b70e927b66adf3f4d64c5cb6b assets/create/blockstates/light_gray_nixie_tube.json +9af388892d4ae6c4a91dc6021e4f15a504b82695 assets/create/blockstates/light_gray_postbox.json 3d95c9c4442d1bdd660bae382c72c68134db86dd assets/create/blockstates/light_gray_sail.json 8ec5144da4a49dd5b497af07b0d4b88c9c0b6cc0 assets/create/blockstates/light_gray_seat.json +f1901887cd166296e465133c3b0d7ad0d664a614 assets/create/blockstates/light_gray_table_cloth.json 35b151db396069b146d223fbe46be5b0c3dda8a9 assets/create/blockstates/light_gray_toolbox.json 894827ffd176bc733abecf18d96888e9ed5a3eb4 assets/create/blockstates/light_gray_valve_handle.json -7f20b548dd535942b2d6f41c39de7ad4fafe637e assets/create/blockstates/lime_nixie_tube.json -ad1ec304729fd6d336c0d4d0c27c9345af636695 assets/create/blockstates/lime_sail.json -b9934a558e1b495403dc2c71ffb43cce7d396013 assets/create/blockstates/lime_seat.json -49a02f7fc16697ba1cf16cee7e45ab6bfd8b06ce assets/create/blockstates/lime_toolbox.json -ba181485f219d3ae23509a7edf28e25d9edb10f4 assets/create/blockstates/lime_valve_handle.json a6f319c803c03e34bbf841ea52d82f0f7ec7a413 assets/create/blockstates/limestone.json 7ff65e1c4c8e48a0b694cd17506a192e6a7e6e44 assets/create/blockstates/limestone_pillar.json +7f20b548dd535942b2d6f41c39de7ad4fafe637e assets/create/blockstates/lime_nixie_tube.json +c6ac740bf37477ad170576983230b130ac01f355 assets/create/blockstates/lime_postbox.json +ad1ec304729fd6d336c0d4d0c27c9345af636695 assets/create/blockstates/lime_sail.json +b9934a558e1b495403dc2c71ffb43cce7d396013 assets/create/blockstates/lime_seat.json +7c5dc2ffd0bd44ba8785b6a788030714a009bcbc assets/create/blockstates/lime_table_cloth.json +49a02f7fc16697ba1cf16cee7e45ab6bfd8b06ce assets/create/blockstates/lime_toolbox.json +ba181485f219d3ae23509a7edf28e25d9edb10f4 assets/create/blockstates/lime_valve_handle.json 654e845cebed82b7afbcf81380921e0a475b01e9 assets/create/blockstates/linear_chassis.json e195e82e4d0c1fc20474535bc9068cbb77a5e175 assets/create/blockstates/lit_blaze_burner.json 296186b196af94e1ab3f7e8a3254f6d31ae47a5c assets/create/blockstates/magenta_nixie_tube.json +725e695b70bc6aac379fae422c86bed92612e504 assets/create/blockstates/magenta_postbox.json f150922cbed1c05fb3892d4ac91eb471234252e2 assets/create/blockstates/magenta_sail.json bb1ab5c70647933400b3a99ef9d166ba5e3d4709 assets/create/blockstates/magenta_seat.json +a09b8c51cfbb1c9c8a4f670a83cd81c376fe4ba3 assets/create/blockstates/magenta_table_cloth.json fcd226c7863262d98765c701538bf9e44d2b177e assets/create/blockstates/magenta_toolbox.json ecf670d95969a33a738f59e08393299891f78847 assets/create/blockstates/magenta_valve_handle.json 8a30c1ed277ec60963abbcb24cce6efd162d02d3 assets/create/blockstates/mangrove_window.json @@ -334,22 +369,28 @@ ba9c3ecfacbd398048440d247decffeaefc714b5 assets/create/blockstates/mysterious_cu 7f2c5728e24d60ed2f7a095e3a954d7ca4e410e9 assets/create/blockstates/oak_window_pane.json df91d0ca68934c1afd9858a8d1591dd4cb88df65 assets/create/blockstates/ochrum.json 09c9bee3d26edc4b87cb7a5042f125c439ee5956 assets/create/blockstates/ochrum_pillar.json +42f108813ed68f4492d0a168d52f31bbe2e5635b assets/create/blockstates/orange_postbox.json af4c2c4861d1410e1b7371a5bf3fe09ed3ab0077 assets/create/blockstates/orange_sail.json aab812cecf7d10d4e7587f4dead8a98238a15f41 assets/create/blockstates/orange_seat.json +27d90736a8d64fe7f742a6e5874b8d5843f5dd2d assets/create/blockstates/orange_table_cloth.json 2bc30ed9907230271b4e2d0786f106f3e1e25029 assets/create/blockstates/orange_toolbox.json 2af63a4768f84fc93c7e7d67fa9a64438433e59f assets/create/blockstates/orange_valve_handle.json 515ed7dae09b052f289419ba09998a23e0d7083d assets/create/blockstates/ornate_iron_window.json 8118444f37536b9104ef4818d374b0c8a7c987bf assets/create/blockstates/ornate_iron_window_pane.json +97cd78453af94f44cef1187988966626574b29d5 assets/create/blockstates/oxidized_copper_shingles.json 2ddc762b8d8558e69a2f81c028702f3a25b5e978 assets/create/blockstates/oxidized_copper_shingle_slab.json ac536ae742c12e97bfd0b2483c87ff29f3935eaf assets/create/blockstates/oxidized_copper_shingle_stairs.json -97cd78453af94f44cef1187988966626574b29d5 assets/create/blockstates/oxidized_copper_shingles.json +110a6c19bcc9f044e5e982ac6e4b295b03ec0145 assets/create/blockstates/oxidized_copper_tiles.json 3f3924f0f0e368edfa04f4fdd6d6c2319276ddfe assets/create/blockstates/oxidized_copper_tile_slab.json 5e634cfb9abb06d8b29f39d751fc56b28ea5a9cd assets/create/blockstates/oxidized_copper_tile_stairs.json -110a6c19bcc9f044e5e982ac6e4b295b03ec0145 assets/create/blockstates/oxidized_copper_tiles.json +65f3fa5a068189c1c2971af1a1052f69c0e26005 assets/create/blockstates/packager.json +887565a0f89f089d6be888c87394dde4878afda7 assets/create/blockstates/package_frogport.json 36742cc6ce052ead143366d31b11e828a525c1b8 assets/create/blockstates/peculiar_bell.json 53d102e706d53cb2c0dbc0bc11da828084a43519 assets/create/blockstates/pink_nixie_tube.json +db7ef5acb1ce2d3b8f881f34b5d9f40633c3973d assets/create/blockstates/pink_postbox.json 213da5c04a33ae8ae7c0a4dec9844bbb6d670e33 assets/create/blockstates/pink_sail.json 8d5c80d5dc561240dfe8d7f212ffc33ac4e0fcd8 assets/create/blockstates/pink_seat.json +2698986d23ccd7b828af6150d04f0139255a5bf1 assets/create/blockstates/pink_table_cloth.json 90bd26c7c6933f5ebbe17b0fe58f840e2924a0f5 assets/create/blockstates/pink_toolbox.json 9f698d0fe8cfd3c9b727ec00623e6d473d516d4a assets/create/blockstates/pink_valve_handle.json 73c2a6e6e2e0dad1bdcf2d8b089b28dd4c72c825 assets/create/blockstates/piston_extension_pole.json @@ -418,22 +459,29 @@ b1f5ad596067cb4c84eb53b2c7b359be76f1cfbe assets/create/blockstates/powered_shaft df7af1e49c53ae99ac3f0b2fca5d948b8ea91938 assets/create/blockstates/pulley_magnet.json 89d763258c53aa12a1e0c0e586ab701f3de5a1b5 assets/create/blockstates/pulse_extender.json 81281435b8d1eeb4f1e318c6d14d49fa1fd86820 assets/create/blockstates/pulse_repeater.json +65bfd8283749117663f7199204691758fd286e38 assets/create/blockstates/pulse_timer.json b658654aa97e8dd2c897f432a601835a3f8aca10 assets/create/blockstates/purple_nixie_tube.json +6fa2954396474f97dab79955e4bd75346b04acc5 assets/create/blockstates/purple_postbox.json f8f9802df9c0b4e39edeefc3b1abb38255d79801 assets/create/blockstates/purple_sail.json 91b5ab66d7ec5235d278ee2bed6ddd88f39ce81d assets/create/blockstates/purple_seat.json +a4b6bd4e55cd292abf752efeda93cf8d23162657 assets/create/blockstates/purple_table_cloth.json 6aa467b3588359fdf5d7201f844193d5b70f20f7 assets/create/blockstates/purple_toolbox.json 6d02761efbb93349654514f67f5c0b7331e2823a assets/create/blockstates/purple_valve_handle.json 3aca01f2eddb22adb1b25735b98a990bfc7220d2 assets/create/blockstates/radial_chassis.json 72faac9777be540f95f8b662a833856e0e1b8f35 assets/create/blockstates/railway_casing.json 7ce346fa18702f6fe6e2a939efcfa26eda63fe38 assets/create/blockstates/raw_zinc_block.json -e3fd62e466e3e6e7bd6fc8661f764ba972a466fc assets/create/blockstates/red_nixie_tube.json -4c36b562da58ef2af57009da7cf2426059249228 assets/create/blockstates/red_sail.json -145f4e9ffaeff9be180e6c4e4989f2cf44cf0686 assets/create/blockstates/red_seat.json -380f46b7cb72b13c0f16fd4a4287a1a33adeff41 assets/create/blockstates/red_toolbox.json -b689d87a27ed0cb2cab190a2ad2b599818bff56c assets/create/blockstates/red_valve_handle.json ec546afd3ec8036e4393b97d535f05a86f57dbc1 assets/create/blockstates/redstone_contact.json ff205f032b36486753dddb1f2029ef8d53e9c86f assets/create/blockstates/redstone_link.json +e4c645b199a2d7e89c91065071a0a91df5ca8e3c assets/create/blockstates/redstone_requester.json +e3fd62e466e3e6e7bd6fc8661f764ba972a466fc assets/create/blockstates/red_nixie_tube.json +d14d6437a6727da13cea5f7eeb815720c80dde6f assets/create/blockstates/red_postbox.json +4c36b562da58ef2af57009da7cf2426059249228 assets/create/blockstates/red_sail.json +145f4e9ffaeff9be180e6c4e4989f2cf44cf0686 assets/create/blockstates/red_seat.json +90bf31515faa2e7e6d73414a6c5498911910710e assets/create/blockstates/red_table_cloth.json +380f46b7cb72b13c0f16fd4a4287a1a33adeff41 assets/create/blockstates/red_toolbox.json +b689d87a27ed0cb2cab190a2ad2b599818bff56c assets/create/blockstates/red_valve_handle.json 87ab7ca62ecf24d60d7e5c61bd5af97714dad0ad assets/create/blockstates/refined_radiance_casing.json +64a5b256e5af2dc8cb7ed77f0feadcf5134f7335 assets/create/blockstates/repackager.json 3807bcc6ccc3dad0dbfcc8fcf260a361aa488659 assets/create/blockstates/rope.json baa7da231c6c45d5eabaf04985d46e206a3346f8 assets/create/blockstates/rope_pulley.json a8b42f047fe9099f81334e2e1082067de67549db assets/create/blockstates/rose_quartz_block.json @@ -441,8 +489,8 @@ dd63fd8443a2be507281548df838d878b0c3c8c8 assets/create/blockstates/rose_quartz_l dfe69ee57f832a2e4c576ee01bdde1617c81e46a assets/create/blockstates/rose_quartz_tiles.json b9cbbc7c4e1d9abd312263a9a270315bd5f0106b assets/create/blockstates/rotation_speed_controller.json 5a25ecb95b7978cc487491cb24478e4d6a73e977 assets/create/blockstates/sail_frame.json -505510656c77d93ecd3691e7111615193275f29e assets/create/blockstates/schematic_table.json bff758cc56bece375b40c32067b903b675065328 assets/create/blockstates/schematicannon.json +505510656c77d93ecd3691e7111615193275f29e assets/create/blockstates/schematic_table.json 82c9ceb19cfc4e247fbb62a9605630ba08423efe assets/create/blockstates/scorchia.json 6fa99d5f1ff05153660f9917286d4b157eaa1b40 assets/create/blockstates/scorchia_pillar.json 8c34743564aa0473745ecec304a19e15e9e87cf2 assets/create/blockstates/scoria.json @@ -451,64 +499,64 @@ e5aff9dc8fa5e98b060232974194afb06d497d09 assets/create/blockstates/scoria_pillar 3343224d6da4e75f0bc7a7634ba010a4ba54ad70 assets/create/blockstates/sequenced_gearshift.json 4c261d54117ee295b307f6ea3e56a09437631f73 assets/create/blockstates/shadow_steel_casing.json 4c67d2a1a1faea5be2a81ebc0722c32d8e2e84d6 assets/create/blockstates/shaft.json +c606f103619088e8a5afe969ba54929af480a3d2 assets/create/blockstates/small_andesite_bricks.json c5469de5957d77fc11febaa658ee2bfb0d11b0bc assets/create/blockstates/small_andesite_brick_slab.json ed0bcfd07959aa208085910bd3780756979c985d assets/create/blockstates/small_andesite_brick_stairs.json 78e30e63adedf1ca95261eb4010a1db45aecfe9e assets/create/blockstates/small_andesite_brick_wall.json -c606f103619088e8a5afe969ba54929af480a3d2 assets/create/blockstates/small_andesite_bricks.json +b9fedc13dc8cb53a8bb16ce2257ea65f0ac94a6b assets/create/blockstates/small_asurine_bricks.json 653fa70f0aa7fc319d50f72692d507ff7c59c0f4 assets/create/blockstates/small_asurine_brick_slab.json e61a0b891729565434d6ab34aa3aeada7d189f9d assets/create/blockstates/small_asurine_brick_stairs.json 02556b916c198c683279eb4392ebaa31fb41e182 assets/create/blockstates/small_asurine_brick_wall.json -b9fedc13dc8cb53a8bb16ce2257ea65f0ac94a6b assets/create/blockstates/small_asurine_bricks.json e986248237013eea755bccd300f745e44d0a183f assets/create/blockstates/small_bogey.json +031d9492dbcc5de77431e8f54b9b04db412b5690 assets/create/blockstates/small_calcite_bricks.json 898bca10ff6e5402c4b8b84e1b9ba9036b32b8bc assets/create/blockstates/small_calcite_brick_slab.json ecc2276bdb2b24f54e31372bf207171a348e55d3 assets/create/blockstates/small_calcite_brick_stairs.json d9dd243b5b754a487755b53609d404ac1b3fde99 assets/create/blockstates/small_calcite_brick_wall.json -031d9492dbcc5de77431e8f54b9b04db412b5690 assets/create/blockstates/small_calcite_bricks.json +3d4e0b54ffda83f7f6e08b6a745db81049d95f3b assets/create/blockstates/small_crimsite_bricks.json 4094bf00cad8dea2dd234866b482c07175802c4c assets/create/blockstates/small_crimsite_brick_slab.json 7f73a2505e2a3a98a7749fa98f4623aa2d216edd assets/create/blockstates/small_crimsite_brick_stairs.json b477c7f1855c9eb2ef1bf672376e972678dc563f assets/create/blockstates/small_crimsite_brick_wall.json -3d4e0b54ffda83f7f6e08b6a745db81049d95f3b assets/create/blockstates/small_crimsite_bricks.json +17359d1b87399bb066cfc23002bcf0d8f71d8ccd assets/create/blockstates/small_deepslate_bricks.json c67f32adc49f0b24b34f098a390a398813365260 assets/create/blockstates/small_deepslate_brick_slab.json d05aed31d45ed12f8f117a9c64312b1abff8bd2f assets/create/blockstates/small_deepslate_brick_stairs.json 6952b02d8c5adf3d0d1a243221b637c50edaa287 assets/create/blockstates/small_deepslate_brick_wall.json -17359d1b87399bb066cfc23002bcf0d8f71d8ccd assets/create/blockstates/small_deepslate_bricks.json +6c0ac59e09feb76afc078a88431442a2a6381c6c assets/create/blockstates/small_diorite_bricks.json ee39994b434a17ec7497b271a6e0a006cf6311cb assets/create/blockstates/small_diorite_brick_slab.json eb335cf0a857299b9cd0c4f60e00bc8e4ca7efe8 assets/create/blockstates/small_diorite_brick_stairs.json b6f7c563c30483c749849899b96d4f0030b71df1 assets/create/blockstates/small_diorite_brick_wall.json -6c0ac59e09feb76afc078a88431442a2a6381c6c assets/create/blockstates/small_diorite_bricks.json +d51095bfb9d5758f8b3972a973fbe282569b0234 assets/create/blockstates/small_dripstone_bricks.json 3d8109d327099c65ca0fafcb5651051059cad1df assets/create/blockstates/small_dripstone_brick_slab.json 3931e24229db79115ffe2a9f3a069202b9b8dcab assets/create/blockstates/small_dripstone_brick_stairs.json 0d16cefcb8e619bc81ef65111d16d331db58d0aa assets/create/blockstates/small_dripstone_brick_wall.json -d51095bfb9d5758f8b3972a973fbe282569b0234 assets/create/blockstates/small_dripstone_bricks.json +11dcaf8a6da96d178024b4c3ee76b9c373e5d082 assets/create/blockstates/small_granite_bricks.json 096b064f28fbe381e1b637d4668550851cbbb2c2 assets/create/blockstates/small_granite_brick_slab.json e99cc3251937fbf9fc858623d5ea525ed5b79704 assets/create/blockstates/small_granite_brick_stairs.json 62f2b570ac6073c8a98369523095d2c18a353eed assets/create/blockstates/small_granite_brick_wall.json -11dcaf8a6da96d178024b4c3ee76b9c373e5d082 assets/create/blockstates/small_granite_bricks.json +346dbff9a84b988bd9c9af670b486b6af5e18179 assets/create/blockstates/small_limestone_bricks.json d640eed81abaa013ed1c53d68a552f639168ae8b assets/create/blockstates/small_limestone_brick_slab.json d470967200aa6ca618421cf375140b352c45cc90 assets/create/blockstates/small_limestone_brick_stairs.json 8d4a1eff66a3f45d595ff8371c0d1ebaa0ba1773 assets/create/blockstates/small_limestone_brick_wall.json -346dbff9a84b988bd9c9af670b486b6af5e18179 assets/create/blockstates/small_limestone_bricks.json +1464b01d4c8bd9ec56460c1250fd4bb07e936e22 assets/create/blockstates/small_ochrum_bricks.json ddee92141e00898e8d70145cf00c0d64f56b4f48 assets/create/blockstates/small_ochrum_brick_slab.json bad9a5820c64c125494c0eba4f6c7ebebe93341c assets/create/blockstates/small_ochrum_brick_stairs.json ed899a18522adc70ae46185c308904c8de5b5834 assets/create/blockstates/small_ochrum_brick_wall.json -1464b01d4c8bd9ec56460c1250fd4bb07e936e22 assets/create/blockstates/small_ochrum_bricks.json c520e9ba54ff6dfb96f7863bb093cdf15cc95ce4 assets/create/blockstates/small_rose_quartz_tiles.json +371ff795eb4e7cb1220d307abf8cb003f455cbec assets/create/blockstates/small_scorchia_bricks.json 384a1331b92b7beba988f729bb7cda42abec0172 assets/create/blockstates/small_scorchia_brick_slab.json 046a84030a23f5a40f4deac13f2e60ced436cadf assets/create/blockstates/small_scorchia_brick_stairs.json 58bc6e3bb10ed72b8cb5813a88cab300d1183b7d assets/create/blockstates/small_scorchia_brick_wall.json -371ff795eb4e7cb1220d307abf8cb003f455cbec assets/create/blockstates/small_scorchia_bricks.json +0aa51dbfda8349b878e2f6c9bb3314fcfc1a9c39 assets/create/blockstates/small_scoria_bricks.json 5b227400e588abae33c1682196f098adc8006d13 assets/create/blockstates/small_scoria_brick_slab.json 51420bb12b757d3888fd1ceb5c21d83b42bd2266 assets/create/blockstates/small_scoria_brick_stairs.json 36e9bd161fa4ffe18f07153b2945cfeae55e7c0b assets/create/blockstates/small_scoria_brick_wall.json -0aa51dbfda8349b878e2f6c9bb3314fcfc1a9c39 assets/create/blockstates/small_scoria_bricks.json +c1f9f986dd0bfdbdee210c6c7d71981b251c27db assets/create/blockstates/small_tuff_bricks.json 8d1af444031291fe58d850ae344aaf7e97b8bd87 assets/create/blockstates/small_tuff_brick_slab.json 26879e6cadf0035c3eed4b54b3a1fdc0c080a485 assets/create/blockstates/small_tuff_brick_stairs.json 5d58ca7b81ae537454c3cdbb5fc8aacca83cff3f assets/create/blockstates/small_tuff_brick_wall.json -c1f9f986dd0bfdbdee210c6c7d71981b251c27db assets/create/blockstates/small_tuff_bricks.json +ad79aa8ff306695f65386fdeb44c5285547934b6 assets/create/blockstates/small_veridium_bricks.json 6226471fdcadbbf0e02704bb0e7de607e99302a8 assets/create/blockstates/small_veridium_brick_slab.json b54200ebe65c4ad2e5661c81ba5bf939039277ca assets/create/blockstates/small_veridium_brick_stairs.json 0237d58443ca9dc2a9186c2387dd6633702a7598 assets/create/blockstates/small_veridium_brick_wall.json -ad79aa8ff306695f65386fdeb44c5285547934b6 assets/create/blockstates/small_veridium_bricks.json 4d987859e5f5a930c20e955919304088fb6fc6d1 assets/create/blockstates/smart_chute.json 57fc35b2e0ae9ab16c011abd95f507910c70a234 assets/create/blockstates/smart_fluid_pipe.json a70c025de5d85180f371ff05bbdc531d8bdfaab1 assets/create/blockstates/speedometer.json @@ -520,7 +568,9 @@ a60c9c8241e40c2e28f5760c0ca6e80cfe9d59f3 assets/create/blockstates/steam_whistle 636ec6c7e1ef3b737edc716200f138bc63681d78 assets/create/blockstates/steam_whistle_extension.json 8865500bcd2e4d467e74edb3509850fa92a5809f assets/create/blockstates/sticker.json bed0534e618105184bc877b104230403ca85bb58 assets/create/blockstates/sticky_mechanical_piston.json -bab242ab794e6d439645c2d5a0242ae7c81942ff assets/create/blockstates/stockpile_switch.json +c7c17ff17b98ce85d355f2f9b4509271bc283843 assets/create/blockstates/stockpile_switch.json +2d66ca4b6916eac170b3b8552705b699f569bae2 assets/create/blockstates/stock_link.json +9989bda294fbffc5f659d2e608e01dea424c7694 assets/create/blockstates/stock_ticker.json a70c025de5d85180f371ff05bbdc531d8bdfaab1 assets/create/blockstates/stressometer.json 8086f80c532fad42b37fcdc590b890ed7e8c3fe9 assets/create/blockstates/tiled_glass.json 1143ab7223c655764a81ed72ac385ea179664072 assets/create/blockstates/tiled_glass_pane.json @@ -540,53 +590,60 @@ bfb2b7eabba2e7aef4d783328c8a5a1558e7e493 assets/create/blockstates/turntable.jso 116d0a8fb72bcc00bd511db7893ea3e96efda297 assets/create/blockstates/warped_window_pane.json fa3d300520e3bedb926696d9980cbeeb54cfdc68 assets/create/blockstates/water_wheel.json 3dff9e1ec59415779195d2abfa9f07bc17b428a1 assets/create/blockstates/water_wheel_structure.json +2ae175c489b86b78b4646306250ca2dba66b0a5e assets/create/blockstates/waxed_copper_shingles.json 85ed36dcb0a3542e0638601116360202a9670d53 assets/create/blockstates/waxed_copper_shingle_slab.json aaf49f1b6785e2195c5dc2e8792c99c960745f89 assets/create/blockstates/waxed_copper_shingle_stairs.json -2ae175c489b86b78b4646306250ca2dba66b0a5e assets/create/blockstates/waxed_copper_shingles.json +835bfe0d2137ad60e5f8322fa4449d5c7a02187f assets/create/blockstates/waxed_copper_tiles.json b52eda74c9000507a4f34e10fbd1a7846b66c16d assets/create/blockstates/waxed_copper_tile_slab.json 5428969f6f27213d0ec5140d911b3844b5332006 assets/create/blockstates/waxed_copper_tile_stairs.json -835bfe0d2137ad60e5f8322fa4449d5c7a02187f assets/create/blockstates/waxed_copper_tiles.json +306b9cd1efe3abd1fcca11bc464560837fb8fdfa assets/create/blockstates/waxed_exposed_copper_shingles.json bc8f3bb75bdb094c8372d61a68927270d3347437 assets/create/blockstates/waxed_exposed_copper_shingle_slab.json 32382e5f524b50393080fdbd2415a98ddb700c9c assets/create/blockstates/waxed_exposed_copper_shingle_stairs.json -306b9cd1efe3abd1fcca11bc464560837fb8fdfa assets/create/blockstates/waxed_exposed_copper_shingles.json +ae92a9051f1603e7ad4f93cb668706ccffc7a85b assets/create/blockstates/waxed_exposed_copper_tiles.json ca37c3e54d5c78a77fcb4a4aca004a34e271f246 assets/create/blockstates/waxed_exposed_copper_tile_slab.json a864f82ccd6b3e0fa181c800da886ebd3239fb82 assets/create/blockstates/waxed_exposed_copper_tile_stairs.json -ae92a9051f1603e7ad4f93cb668706ccffc7a85b assets/create/blockstates/waxed_exposed_copper_tiles.json +729ca65a140b3d7571a2072f7406cc5f4a2e27c5 assets/create/blockstates/waxed_oxidized_copper_shingles.json ef99e849f9dd6ad53ddf04625c81750f11eaae1c assets/create/blockstates/waxed_oxidized_copper_shingle_slab.json 9386068220f9bb5d2f6d3cc408dc4f78f26b4eeb assets/create/blockstates/waxed_oxidized_copper_shingle_stairs.json -729ca65a140b3d7571a2072f7406cc5f4a2e27c5 assets/create/blockstates/waxed_oxidized_copper_shingles.json +17acf3486e92aabc3efbe99fa1e5d7d664e6ec97 assets/create/blockstates/waxed_oxidized_copper_tiles.json fe79f7eab017d714c0331664a3a2b5579104194e assets/create/blockstates/waxed_oxidized_copper_tile_slab.json 10bbe77a0334b5578b1ec40b398a45cf7d2bb534 assets/create/blockstates/waxed_oxidized_copper_tile_stairs.json -17acf3486e92aabc3efbe99fa1e5d7d664e6ec97 assets/create/blockstates/waxed_oxidized_copper_tiles.json +079acbfd6a9375899687b581f95bbe74940afce2 assets/create/blockstates/waxed_weathered_copper_shingles.json 73572bbe16957e63853ee425d8f34d98e14e4a10 assets/create/blockstates/waxed_weathered_copper_shingle_slab.json ab05925d5bb70e53fec9c149982304f31acd2b1a assets/create/blockstates/waxed_weathered_copper_shingle_stairs.json -079acbfd6a9375899687b581f95bbe74940afce2 assets/create/blockstates/waxed_weathered_copper_shingles.json +202b0f2e6fca9eab949f47eaa1f4ddee249a633a assets/create/blockstates/waxed_weathered_copper_tiles.json fc1b53d3b2b1f0977069abec3c376f3f5c4cd7c8 assets/create/blockstates/waxed_weathered_copper_tile_slab.json 6cd93476a45c3b77f5eda66f68425bae486cfba8 assets/create/blockstates/waxed_weathered_copper_tile_stairs.json -202b0f2e6fca9eab949f47eaa1f4ddee249a633a assets/create/blockstates/waxed_weathered_copper_tiles.json +c11562afd9a5f85945e521dcea5f911d1b6d13c6 assets/create/blockstates/weathered_copper_shingles.json 5a5a1e95988edb7a2b6dc6c6ba5677c2d896a5ae assets/create/blockstates/weathered_copper_shingle_slab.json 07019fc8890cb5e966a42ca636a0ab9cf71cc881 assets/create/blockstates/weathered_copper_shingle_stairs.json -c11562afd9a5f85945e521dcea5f911d1b6d13c6 assets/create/blockstates/weathered_copper_shingles.json +236e072d9056c0dbffdf5d7d973a85a56c2c8de1 assets/create/blockstates/weathered_copper_tiles.json fee668eb9a45dca0d287fee5811219d69f9ec3e2 assets/create/blockstates/weathered_copper_tile_slab.json da110f382368257e15431c77164aef82e014e3f8 assets/create/blockstates/weathered_copper_tile_stairs.json -236e072d9056c0dbffdf5d7d973a85a56c2c8de1 assets/create/blockstates/weathered_copper_tiles.json +64fb3e569da401635b64e71e01ea0b3ff6360611 assets/create/blockstates/weathered_iron_block.json +6fd81f1eb48fbfc44df9db8eedc613690c9b8ef5 assets/create/blockstates/weathered_iron_window.json +1aed351050d73989c4553bf49ce03b3a8fdd210e assets/create/blockstates/weathered_iron_window_pane.json 25ce64b7af5d244f194da91ccf964a9bf5762327 assets/create/blockstates/weighted_ejector.json 2974b34a8cfb0d4e8e010f8bd085584ea631d541 assets/create/blockstates/white_nixie_tube.json +3de81b9e34425a9d3a25c657dabd24d74bf01456 assets/create/blockstates/white_postbox.json f079469d186087d23f0d91b384040f777b0088b1 assets/create/blockstates/white_sail.json 317a6463db64b66d215d25b65ab52fe7f26ba9f8 assets/create/blockstates/white_seat.json +9013272715c2ed3104457a50a6f0795a7c33fc43 assets/create/blockstates/white_table_cloth.json 6cb8c82a429b54d6a87d02eec5cfd1fcd5365f1e assets/create/blockstates/white_toolbox.json c0bfe8416173868f9916c4a54dd9f983887c5bac assets/create/blockstates/white_valve_handle.json ec2720e3f1bc84304d0c81cd23ff1e155b0c2f2c assets/create/blockstates/windmill_bearing.json d688e80dfbd5b17970814887c3698fc721981caa assets/create/blockstates/wooden_bracket.json 157942a838aa02909fb2238ad9ce77edc82f6142 assets/create/blockstates/yellow_nixie_tube.json +f3d0a1335e0d9cd592e177d51a36206749346676 assets/create/blockstates/yellow_postbox.json 68b6e267e93b96dbc0596ea4a1cd26636aa0e04a assets/create/blockstates/yellow_sail.json 4face2dd50a30bda0b21742319e701e666d51f8c assets/create/blockstates/yellow_seat.json +38135a1fda544b7b9624ebfa08d46351bd31ec89 assets/create/blockstates/yellow_table_cloth.json b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbox.json fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -d3d30a92e4f63e8acb6aa3e3358b6e8340aa8cc1 assets/create/lang/en_ud.json -a50be2f8a02b0fdd2b5a8aae9cf8df1490015707 assets/create/lang/en_us.json +1b28037b123722878569af7d483dcfb0af78c701 assets/create/lang/en_ud.json +2e3d21019ffd681d9368f702f037e814d6b8aadb assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -640,12 +697,19 @@ b39661fd20e4b3f5ab2b20cbd51af4ca98e2410e assets/create/models/block/andesite_lad 32551174974fde322de14af09afb160673c4ed23 assets/create/models/block/andesite_scaffolding_horizontal.json e20105b4d1762fbfe67377e08cdb8c7ff9a62128 assets/create/models/block/andesite_side.json b58e7204eef795080abf9fffa41ba11ec2e12426 assets/create/models/block/andesite_side_alt.json +f9bc3af98dedae53161917c78a76353d1a270e7b assets/create/models/block/andesite_table_cloth.json 378df94de8cbce28cd3c2dc30fd3a30dfc451cdd assets/create/models/block/asurine_natural_0.json d6eb7105dd9b42adde48bd70e3f2fba70751c1db assets/create/models/block/asurine_natural_1.json 6d77d2591579619aa1ebb7b2f0e2c939e1648e4a assets/create/models/block/asurine_natural_2.json e80a3d387e8c40bf886735d46a119f9a93c6f5a8 assets/create/models/block/asurine_natural_3.json 1c3ddf07bdd9fc5fcf7c1f35c7a06846cc1add54 assets/create/models/block/asurine_pillar.json 403efa3dcd07e94c351594cc6c5b5becc15e6690 assets/create/models/block/asurine_pillar_horizontal.json +daac4c886b0485449eff2f87d82754d387baba93 assets/create/models/block/bamboo_window.json +75f28c83adcd81ddd7f073596b04ddc5809b421e assets/create/models/block/bamboo_window_pane_noside.json +e70e053d438ec435395c416c6fa7a06aa0527762 assets/create/models/block/bamboo_window_pane_noside_alt.json +568c8603c7606bf77958d0855a7471e6a935bb54 assets/create/models/block/bamboo_window_pane_post.json +d9c964d9e0d77249f1e5caac8fc419ae533ee828 assets/create/models/block/bamboo_window_pane_side.json +c60adf74c20091675c4c9293e69fcc8ded8fef93 assets/create/models/block/bamboo_window_pane_side_alt.json 930e154155eaba67acb96109472b6d8c502907dc assets/create/models/block/birch_window.json 3ba397e70b642bdfa458dd3046b094ccf73b42e5 assets/create/models/block/birch_window_pane_noside.json 3ff792e09a83b47640083f4da20701e47e6a46bb assets/create/models/block/birch_window_pane_noside_alt.json @@ -653,13 +717,19 @@ ee71b0992edc2496025c22806e8de3a3243882aa assets/create/models/block/birch_window 3088aa5e46cf9caa912c80a4e7791904e64e9def assets/create/models/block/birch_window_pane_side.json cb9d3a0dbac6a884d5ce0dc82085322f8c666707 assets/create/models/block/birch_window_pane_side_alt.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/black_nixie_tube.json +1fe4a9cbcae773f32c07f7cef42f52588ec1c1aa assets/create/models/block/black_postbox_closed.json +3caec00f8aa36393cac8049815b3e8bad12d8dae assets/create/models/block/black_postbox_open.json 62c92a681b5a86a5415cc7a70263ffdc794cdd59 assets/create/models/block/black_sail.json 443ed49b053fdd7356cd56f0495e18f2570d57d9 assets/create/models/block/black_seat.json +6f85d70c8fb017e80290a5832cdaf07ad3306b50 assets/create/models/block/black_table_cloth.json f48989d377de8e5067e807adf7e38da781e37ed9 assets/create/models/block/black_toolbox.json 8715787d72c3ef47c5651abcd819539bad6a96f7 assets/create/models/block/black_valve_handle.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/blue_nixie_tube.json +e9e9487a3440b3a6c1ac515f63385ee59e8fb773 assets/create/models/block/blue_postbox_closed.json +7e2df652bfc7fdc27da6a52b52fe732fa175c996 assets/create/models/block/blue_postbox_open.json ddc740084aa5f387bee062bd4141ad8fadb56355 assets/create/models/block/blue_sail.json 96431b1f3a531ce89f876c9286b81838aec9b6d3 assets/create/models/block/blue_seat.json +97aef30303b851c28d4911bf2c6ad8033df628df assets/create/models/block/blue_table_cloth.json 89932aab163b14a21fffd4fab4b8b88a94163089 assets/create/models/block/blue_toolbox.json 3e052466f0b8db75779945c0f1231af9611b723e assets/create/models/block/blue_valve_handle.json 159e2b37a0866c9dbcdd6554be8a207883098168 assets/create/models/block/bracket/cog/ground_metal.json @@ -709,13 +779,23 @@ b2a95218042586aae38dff9278f3ee3f159bc73e assets/create/models/block/brass_post_e 62d99236e09b11af9a24d3c667fb1167cf8db0b0 assets/create/models/block/brass_scaffolding_horizontal.json ec81e9c237ec98b30a3de22e12cb9720922478eb assets/create/models/block/brass_side.json c697cace1f4097468ff34254c4ff6450d9d52f91 assets/create/models/block/brass_side_alt.json +f0552bba877b84ae81051019961cf87d13f976f4 assets/create/models/block/brass_table_cloth.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/brown_nixie_tube.json +b04c80852527a07e01c27686be678cbaf568e821 assets/create/models/block/brown_postbox_closed.json +19a2045ecedd3ef12cda7d69a0d7bc6a4133b7f1 assets/create/models/block/brown_postbox_open.json 50a054d1e0660d16e86cf7a520b9bf36e38401b6 assets/create/models/block/brown_sail.json 0616de192825246e6036d1f69911170438a83b81 assets/create/models/block/brown_seat.json +eb829b796cea3387cb25ace858c795e2497b3703 assets/create/models/block/brown_table_cloth.json 4226a7c5f1bfb0a75457fb4dfd22448503110e5c assets/create/models/block/brown_toolbox.json 0e1fece0854ccea20df2f0abc865e4f44af54d1a assets/create/models/block/brown_valve_handle.json 40a224ce4ea989599f7bd66bd2437ac2b98247d8 assets/create/models/block/calcite_pillar.json 141fc72bb7296c6b5a13499622c0c7384179a7fa assets/create/models/block/calcite_pillar_horizontal.json +09cdcbe8056a81a0a825df47f5cb0e352f98907e assets/create/models/block/cherry_window.json +5275e27c80bdd43b40fa31418dfad175fc809480 assets/create/models/block/cherry_window_pane_noside.json +ae87368850bc6ef1a2e2f633b8ef6ed33ab5b2e0 assets/create/models/block/cherry_window_pane_noside_alt.json +0e5c58632e134aeae3e85e70d7c0ea1ed6e05055 assets/create/models/block/cherry_window_pane_post.json +b13184df1e1c20a7b94fa887ab64845e3b7d0fca assets/create/models/block/cherry_window_pane_side.json +d8e2f395915af41686924cb4654d43097260720c assets/create/models/block/cherry_window_pane_side_alt.json e9d61ba17fa2619af01ef604c3f65cbe9272f010 assets/create/models/block/chocolate.json d8339ab47ffa828985c7da27c37794a95aba8b42 assets/create/models/block/clockwork_bearing.json 8afe6afaff33b94c1fcee68fdaf842d525eec212 assets/create/models/block/copper_cap.json @@ -726,20 +806,21 @@ d063df8e9b974c11fc7810ce176b02d7d924e15b assets/create/models/block/copper_post. 2b5aed4a917694beb33d9b0ecbc800dcbc143ee9 assets/create/models/block/copper_post_ends.json bac7566a726b0fe6d537c744aec4afb383dc165c assets/create/models/block/copper_scaffolding.json dbee65c129740f3b99c07e754b3224d3f9f8c242 assets/create/models/block/copper_scaffolding_horizontal.json +32fdb85b5b62d5a0fb41732874c854788cdd2ba1 assets/create/models/block/copper_shingles.json fb7fb6deebd502946ab57f1b8a9f4a6b5dd48da3 assets/create/models/block/copper_shingle_slab.json 660f61112b8e46dec5050cb0ed4ee936965a7c58 assets/create/models/block/copper_shingle_slab_top.json 5d74be967bbe9feba4b630751f13af817a733d1d assets/create/models/block/copper_shingle_stairs.json 35cb89f29ce3f8d8af13602c08ecd7afbb7cf56a assets/create/models/block/copper_shingle_stairs_inner.json fcb9295f4f388e6d439ec9a3906ca326b6d69077 assets/create/models/block/copper_shingle_stairs_outer.json -32fdb85b5b62d5a0fb41732874c854788cdd2ba1 assets/create/models/block/copper_shingles.json cb218a725f82db34ffe58a5208266e1c768cfc05 assets/create/models/block/copper_side.json d9b4652ca8f1e65007f42d946ecfb38acc3f168f assets/create/models/block/copper_side_alt.json +03a6c5b8bc3041a2be001092f7abd014d6f852a2 assets/create/models/block/copper_table_cloth.json +32f06f39d0b34e4431795aa6e64f87e58dc1597b assets/create/models/block/copper_tiles.json 298c6100de02ed9f813397d8ba38c46f35035c69 assets/create/models/block/copper_tile_slab.json d4422c2d96fb329087d1be70d8b983a8cf6c7f01 assets/create/models/block/copper_tile_slab_top.json fca72048f916d3a3e567b385c948cc1b59711ef4 assets/create/models/block/copper_tile_stairs.json 997479b62ed3d81ab633279ecc2fabd9588a3bf3 assets/create/models/block/copper_tile_stairs_inner.json d5c5bbfb9aaa282e11ad6e6309b1880b172ee653 assets/create/models/block/copper_tile_stairs_outer.json -32f06f39d0b34e4431795aa6e64f87e58dc1597b assets/create/models/block/copper_tiles.json fa2fa91e674eb4de440617049dae34064fd6fa39 assets/create/models/block/copper_valve_handle.json 52ae02c17509e483e35a1b6055296c3a663f85d7 assets/create/models/block/crate/creative/bottom.json 689989ecbd4d59d5836deb8adf7af1d473a377c0 assets/create/models/block/crate/creative/left.json @@ -783,15 +864,15 @@ b3f403f77e3b1b44c56450e387136bca12a84a99 assets/create/models/block/crimson_wind 117d14a1f25cc8ac633bb4cc8a81830a1c016096 assets/create/models/block/crimson_window_pane_side.json ee13522aadfca40f856499d5c29bd86d8f4dda57 assets/create/models/block/crimson_window_pane_side_alt.json 40042ce15d51445ec71b73da34477fa735f3fdd4 assets/create/models/block/cut_andesite.json +5be7d431ac56e2ceb9e3d95589d687f757d5257c assets/create/models/block/cut_andesite_bricks.json +c78e2acf9b54d7370f12e34dcca5c71743f47d55 assets/create/models/block/cut_andesite_bricks_wall_post.json +88e3c8eadf97f772fbafe3b71c8dd27c91c0c0e3 assets/create/models/block/cut_andesite_bricks_wall_side.json +bc264e09c506418b01c6032dcab8ca28080cb70b assets/create/models/block/cut_andesite_bricks_wall_side_tall.json fcbe246aca067dcfeef7afb4e6068b8932da8792 assets/create/models/block/cut_andesite_brick_slab.json e384a98b54ed7317b6ad0e86cf87500491eea824 assets/create/models/block/cut_andesite_brick_slab_top.json 91699e60e29e7524271a2f87200951ee8bfeb8ef assets/create/models/block/cut_andesite_brick_stairs.json e314e0837aed319cdf34a1aaa60f0be6ca169636 assets/create/models/block/cut_andesite_brick_stairs_inner.json aba679c4c6a8d5afc2924d2c9c84af5a2208fde3 assets/create/models/block/cut_andesite_brick_stairs_outer.json -5be7d431ac56e2ceb9e3d95589d687f757d5257c assets/create/models/block/cut_andesite_bricks.json -c78e2acf9b54d7370f12e34dcca5c71743f47d55 assets/create/models/block/cut_andesite_bricks_wall_post.json -88e3c8eadf97f772fbafe3b71c8dd27c91c0c0e3 assets/create/models/block/cut_andesite_bricks_wall_side.json -bc264e09c506418b01c6032dcab8ca28080cb70b assets/create/models/block/cut_andesite_bricks_wall_side_tall.json 8c17ba39e50a440497af089f5fd85649f05bdf8c assets/create/models/block/cut_andesite_slab.json b95ab966cf8c177c799e228759d0cd28c1cfa71f assets/create/models/block/cut_andesite_slab_top.json 81a407a5ff4393b66f784ba4ceee971c3c62de7f assets/create/models/block/cut_andesite_stairs.json @@ -801,15 +882,15 @@ f06abcb3ce691fd30db81b40ea0430462fc972cf assets/create/models/block/cut_andesite 81cef9548137aaff5b6e77d417f387796f2608b2 assets/create/models/block/cut_andesite_wall_side.json dbb99ac37333ee12b7d3859207409aa2599f28eb assets/create/models/block/cut_andesite_wall_side_tall.json a48f77e90c1d02d5b4e6540db723f748118788e9 assets/create/models/block/cut_asurine.json +3b0b7bd63870ac19b9444ce9add9930ec9120821 assets/create/models/block/cut_asurine_bricks.json +89142424e1d702a0f2bc27829304520e48ee1eb3 assets/create/models/block/cut_asurine_bricks_wall_post.json +1f1fcf92e91b1f0d15ba389d6d25e1fba3ad8e5b assets/create/models/block/cut_asurine_bricks_wall_side.json +858d15aff53fe938304bafb52ef32e54e3d44a44 assets/create/models/block/cut_asurine_bricks_wall_side_tall.json 4107317f71d07fb1c113e056c832e963f57b41d7 assets/create/models/block/cut_asurine_brick_slab.json fba2e8dc513184eaa9c4449471b32f206dfe425a assets/create/models/block/cut_asurine_brick_slab_top.json 72bb7b2df330f8d5981f4c12b23429d8d874362d assets/create/models/block/cut_asurine_brick_stairs.json e753ba3830c51539565abbd9b49df9a34f97f2ff assets/create/models/block/cut_asurine_brick_stairs_inner.json ec9182d14517ffc71749e3e016e6546db79e6800 assets/create/models/block/cut_asurine_brick_stairs_outer.json -3b0b7bd63870ac19b9444ce9add9930ec9120821 assets/create/models/block/cut_asurine_bricks.json -89142424e1d702a0f2bc27829304520e48ee1eb3 assets/create/models/block/cut_asurine_bricks_wall_post.json -1f1fcf92e91b1f0d15ba389d6d25e1fba3ad8e5b assets/create/models/block/cut_asurine_bricks_wall_side.json -858d15aff53fe938304bafb52ef32e54e3d44a44 assets/create/models/block/cut_asurine_bricks_wall_side_tall.json b4512f7cef7cef0bc5f85cb955c2dec6de2cbb56 assets/create/models/block/cut_asurine_slab.json 7c1befdd97b1556e9658e968e705c9edbf1ed667 assets/create/models/block/cut_asurine_slab_top.json d04b8a8cf9a50aa7e0b068ceb9a5a2970abc81a7 assets/create/models/block/cut_asurine_stairs.json @@ -819,15 +900,15 @@ ac544a8f948119945aa21362ad26ed8b1c922b0d assets/create/models/block/cut_asurine_ a253210cba60f58e720598323bd0d9ed4c209b4d assets/create/models/block/cut_asurine_wall_side.json c0c2cc13288771699a80c5c80e8e35d352cea684 assets/create/models/block/cut_asurine_wall_side_tall.json a6b10dc7984d22cac7aa314d46ac0928a00e667b assets/create/models/block/cut_calcite.json +6230a499321b175fc441bb662e0655662b3597de assets/create/models/block/cut_calcite_bricks.json +be1462847e9001a062091162802fab2fe6737693 assets/create/models/block/cut_calcite_bricks_wall_post.json +6e6b34468a7a0786efe5f4ebd917a4640b4be6ae assets/create/models/block/cut_calcite_bricks_wall_side.json +8b10c0f4f17f3844cee6d514cc22ddc6cb056c8a assets/create/models/block/cut_calcite_bricks_wall_side_tall.json f046be4f44936946bd3cc2ad5549d112b2e60d97 assets/create/models/block/cut_calcite_brick_slab.json 64953ca8a302ecab9311c617f69e5dcf8c138718 assets/create/models/block/cut_calcite_brick_slab_top.json 19e1b342d05d3cd69c410952dc22507c3c988c15 assets/create/models/block/cut_calcite_brick_stairs.json 18317b0a8bab345abd779f5d43f9620b73df0e67 assets/create/models/block/cut_calcite_brick_stairs_inner.json 0631d4e1bdaf724752f2e55401eb7a54af705b56 assets/create/models/block/cut_calcite_brick_stairs_outer.json -6230a499321b175fc441bb662e0655662b3597de assets/create/models/block/cut_calcite_bricks.json -be1462847e9001a062091162802fab2fe6737693 assets/create/models/block/cut_calcite_bricks_wall_post.json -6e6b34468a7a0786efe5f4ebd917a4640b4be6ae assets/create/models/block/cut_calcite_bricks_wall_side.json -8b10c0f4f17f3844cee6d514cc22ddc6cb056c8a assets/create/models/block/cut_calcite_bricks_wall_side_tall.json 6b35e0f9e6a7e247bf38d8d6d911a2bcc53c2517 assets/create/models/block/cut_calcite_slab.json 0eec7692ee8e119c1258bdb7e852204771c2232d assets/create/models/block/cut_calcite_slab_top.json d07ebf8982e4947852da8b2b0052f6b6000d334f assets/create/models/block/cut_calcite_stairs.json @@ -837,15 +918,15 @@ e8b7b983168ad9f4f4fa1642ca20ff56621935db assets/create/models/block/cut_calcite_ 421e128177bb4dd51391e360f11ba83c5d891cd1 assets/create/models/block/cut_calcite_wall_side.json 5add4bde51bbdd7c229b05f4fabd8a769414fb79 assets/create/models/block/cut_calcite_wall_side_tall.json 2e93da554ea72b90a576bbc9230aea373d3aed0f assets/create/models/block/cut_crimsite.json +39d1a3cdd978c761bc0d67baaba82d11953fc2a0 assets/create/models/block/cut_crimsite_bricks.json +8614cb38c52447fea5245fcf295a951a977071c0 assets/create/models/block/cut_crimsite_bricks_wall_post.json +b0b16f4a2f6dd3f77ec4f65f05e9edb70a196316 assets/create/models/block/cut_crimsite_bricks_wall_side.json +ac41e5b092c6ed81d14004f9427b6151b88dc924 assets/create/models/block/cut_crimsite_bricks_wall_side_tall.json c2474a10109d0476a46d2a509fc1cd37cd52822d assets/create/models/block/cut_crimsite_brick_slab.json efeb149835a389409b7f94bc35765b0871ad7342 assets/create/models/block/cut_crimsite_brick_slab_top.json e5096a1bae43341bae5706f02cd6d564b5a82502 assets/create/models/block/cut_crimsite_brick_stairs.json af3c0018e5e12bbe0f118bc0174b6ca513ae58ae assets/create/models/block/cut_crimsite_brick_stairs_inner.json ed30baef426f2ccf158d87111c7b53f3600bc32a assets/create/models/block/cut_crimsite_brick_stairs_outer.json -39d1a3cdd978c761bc0d67baaba82d11953fc2a0 assets/create/models/block/cut_crimsite_bricks.json -8614cb38c52447fea5245fcf295a951a977071c0 assets/create/models/block/cut_crimsite_bricks_wall_post.json -b0b16f4a2f6dd3f77ec4f65f05e9edb70a196316 assets/create/models/block/cut_crimsite_bricks_wall_side.json -ac41e5b092c6ed81d14004f9427b6151b88dc924 assets/create/models/block/cut_crimsite_bricks_wall_side_tall.json a6cdd4b227210b7487b8431b8d76bbe490636b81 assets/create/models/block/cut_crimsite_slab.json 5c585dba4dbfa9ff0a22a84aa726260cffdeebeb assets/create/models/block/cut_crimsite_slab_top.json 91f60b4277ca48dabfb5d3eebb1ed64a2681a083 assets/create/models/block/cut_crimsite_stairs.json @@ -855,15 +936,15 @@ e6b39a0b1dbab462479fc60fab2efc6a9ceb6a55 assets/create/models/block/cut_crimsite 5b3783862e50fde6ffffc92068900afcc066002f assets/create/models/block/cut_crimsite_wall_side.json b59fbbfe9c6738b1f93f03d59a747f5610164c34 assets/create/models/block/cut_crimsite_wall_side_tall.json 144ec3864fb0a7981e74d357200a96033c75a2d6 assets/create/models/block/cut_deepslate.json +0d599ae1b4e9309f2a7b3362e86061e2150ba3ec assets/create/models/block/cut_deepslate_bricks.json +601894e096edbcd3d96ce0160f06e17a4efca819 assets/create/models/block/cut_deepslate_bricks_wall_post.json +42db46cb5c9c02d684c86f3a518feb3348d83fa0 assets/create/models/block/cut_deepslate_bricks_wall_side.json +c046436d59c350c6beb6b395675513c12184ffe2 assets/create/models/block/cut_deepslate_bricks_wall_side_tall.json af8c7c652e75bf904093bbafc1cf805f842a39c9 assets/create/models/block/cut_deepslate_brick_slab.json 2a01dd0244b07f28454c061a565d1028ca7e3066 assets/create/models/block/cut_deepslate_brick_slab_top.json 62d39eec3621204de82377e74936b9cd338e8004 assets/create/models/block/cut_deepslate_brick_stairs.json 5f90dfbb45b57bd894bf03fcc6c347cb525e3a73 assets/create/models/block/cut_deepslate_brick_stairs_inner.json 512d588c77bdf5a7232826e2f4ce4b3cb991d0ce assets/create/models/block/cut_deepslate_brick_stairs_outer.json -0d599ae1b4e9309f2a7b3362e86061e2150ba3ec assets/create/models/block/cut_deepslate_bricks.json -601894e096edbcd3d96ce0160f06e17a4efca819 assets/create/models/block/cut_deepslate_bricks_wall_post.json -42db46cb5c9c02d684c86f3a518feb3348d83fa0 assets/create/models/block/cut_deepslate_bricks_wall_side.json -c046436d59c350c6beb6b395675513c12184ffe2 assets/create/models/block/cut_deepslate_bricks_wall_side_tall.json c79ae6e97e94d36f2586865ea63f3fab43f8ccbc assets/create/models/block/cut_deepslate_slab.json 5978b93805ccf0bdd953938b34a8dd0ffdcf5565 assets/create/models/block/cut_deepslate_slab_top.json 06a508b2395c3f738d2c5651f366792ee9b9c5ec assets/create/models/block/cut_deepslate_stairs.json @@ -873,15 +954,15 @@ c2850e9f223c459ba53d575a1ef8231589c48c0b assets/create/models/block/cut_deepslat e901746d3e50fe7d9b79d268f4d02251d5cf95f4 assets/create/models/block/cut_deepslate_wall_side.json 1ef794aab31a10bf150a0015cd46e5b5f3c70042 assets/create/models/block/cut_deepslate_wall_side_tall.json 4abb502ea3f6764797641f55a2c48f4858be1ba6 assets/create/models/block/cut_diorite.json +e97babf115a4f81f8555994aba435cf76bebf7a3 assets/create/models/block/cut_diorite_bricks.json +4f7cf44e4d6431587266a4fac78c0812e99d780c assets/create/models/block/cut_diorite_bricks_wall_post.json +1f96f9e190d8e28496ce2db5712f33e449215985 assets/create/models/block/cut_diorite_bricks_wall_side.json +45246192d9cd39837b426e425fc5082422642b65 assets/create/models/block/cut_diorite_bricks_wall_side_tall.json ab61b1b94946f315006a29113f594c234d796bee assets/create/models/block/cut_diorite_brick_slab.json 73597772386c6bbd38907cbea8db816f174a9f8f assets/create/models/block/cut_diorite_brick_slab_top.json c9fbd953ef0789a0e9a915d5f283fd09a76784d6 assets/create/models/block/cut_diorite_brick_stairs.json 5d721f1b3f4376a91707b56950a1f9635adbe603 assets/create/models/block/cut_diorite_brick_stairs_inner.json 9a446bf02732e1873fa96d7745fced0fa04d48d6 assets/create/models/block/cut_diorite_brick_stairs_outer.json -e97babf115a4f81f8555994aba435cf76bebf7a3 assets/create/models/block/cut_diorite_bricks.json -4f7cf44e4d6431587266a4fac78c0812e99d780c assets/create/models/block/cut_diorite_bricks_wall_post.json -1f96f9e190d8e28496ce2db5712f33e449215985 assets/create/models/block/cut_diorite_bricks_wall_side.json -45246192d9cd39837b426e425fc5082422642b65 assets/create/models/block/cut_diorite_bricks_wall_side_tall.json 15195975e7e0ffb7010591b957a657f492e6d59d assets/create/models/block/cut_diorite_slab.json 01c320637843dc0d8b74b48b8d6946cd663d51f6 assets/create/models/block/cut_diorite_slab_top.json 7dcbfe4dc2ec62345da660ecc6ca44056fcd64e7 assets/create/models/block/cut_diorite_stairs.json @@ -891,15 +972,15 @@ e97babf115a4f81f8555994aba435cf76bebf7a3 assets/create/models/block/cut_diorite_ 29075eaaba51ba158f030c2a9583ed5ba52379c8 assets/create/models/block/cut_diorite_wall_side.json 1fb50473359147c7147ea85bc1907e6015ce06bc assets/create/models/block/cut_diorite_wall_side_tall.json 59ee053a884bc9731b4d1b01ae22e0e2b5916cfb assets/create/models/block/cut_dripstone.json +6a4b26a117f58d0187b2cc0c5b117ef71d03d4e9 assets/create/models/block/cut_dripstone_bricks.json +0bb1fa8fb9698dae61096483a01b41bf829666b0 assets/create/models/block/cut_dripstone_bricks_wall_post.json +2019fdc38b401bac72e8344d118d85049ec3efb9 assets/create/models/block/cut_dripstone_bricks_wall_side.json +ebb790b2b6f47d40c92c9bba680e82cb8f054fa9 assets/create/models/block/cut_dripstone_bricks_wall_side_tall.json 84d714b29dcb7eb95a82de8d48491413e26d5fa8 assets/create/models/block/cut_dripstone_brick_slab.json 28b0b1a641d11f8ade57c444e4c1bfd9d617f66a assets/create/models/block/cut_dripstone_brick_slab_top.json 05900c156a6341c12b366790c7e8d15e59a873f0 assets/create/models/block/cut_dripstone_brick_stairs.json 35fb2c83dc89b96951c69253f7502f78c903a9b8 assets/create/models/block/cut_dripstone_brick_stairs_inner.json f69244c1706c95aaadd32d45a24c91ce0848509f assets/create/models/block/cut_dripstone_brick_stairs_outer.json -6a4b26a117f58d0187b2cc0c5b117ef71d03d4e9 assets/create/models/block/cut_dripstone_bricks.json -0bb1fa8fb9698dae61096483a01b41bf829666b0 assets/create/models/block/cut_dripstone_bricks_wall_post.json -2019fdc38b401bac72e8344d118d85049ec3efb9 assets/create/models/block/cut_dripstone_bricks_wall_side.json -ebb790b2b6f47d40c92c9bba680e82cb8f054fa9 assets/create/models/block/cut_dripstone_bricks_wall_side_tall.json 9e42cf588f57de5166f2a2ccdae656743c8b9481 assets/create/models/block/cut_dripstone_slab.json 0da2f782d8ad8fecd81b98c72db182b817bf19eb assets/create/models/block/cut_dripstone_slab_top.json b3c903a1edcd1786ea51a2ccdad5734a1d04ea98 assets/create/models/block/cut_dripstone_stairs.json @@ -909,15 +990,15 @@ b3c903a1edcd1786ea51a2ccdad5734a1d04ea98 assets/create/models/block/cut_dripston 7fab5102d7fa4cd824b9393425639d05727b2ad2 assets/create/models/block/cut_dripstone_wall_side.json c41514cda1c9f5d942d222cbc5f6e620e367afc6 assets/create/models/block/cut_dripstone_wall_side_tall.json dff602c8d2fcd1ceca79f90ae15dbdfbd6cb157d assets/create/models/block/cut_granite.json +31c5299a42f82992e50f711e1e33549c373bd034 assets/create/models/block/cut_granite_bricks.json +ef5a851e57cc4b9c0e625176b1256441e1c17c66 assets/create/models/block/cut_granite_bricks_wall_post.json +815e8dc551c3e813b0b2af29df23a28860de0b53 assets/create/models/block/cut_granite_bricks_wall_side.json +ba241f9c82e27dd98ba6f4e4180922388ab5d1a3 assets/create/models/block/cut_granite_bricks_wall_side_tall.json 9e00dc8fcee23548c0cebda6eadbcfc559e4c20b assets/create/models/block/cut_granite_brick_slab.json 5ad061096451f74e773c3030f96d59424aa93314 assets/create/models/block/cut_granite_brick_slab_top.json 94f8ce607aae5c04ccf9e56f177f9d69203ae879 assets/create/models/block/cut_granite_brick_stairs.json 11d511844fec3bfd05cac8b788332f2decd53021 assets/create/models/block/cut_granite_brick_stairs_inner.json 418eb6a2b52e748a26c2d1914c6c1de94106589f assets/create/models/block/cut_granite_brick_stairs_outer.json -31c5299a42f82992e50f711e1e33549c373bd034 assets/create/models/block/cut_granite_bricks.json -ef5a851e57cc4b9c0e625176b1256441e1c17c66 assets/create/models/block/cut_granite_bricks_wall_post.json -815e8dc551c3e813b0b2af29df23a28860de0b53 assets/create/models/block/cut_granite_bricks_wall_side.json -ba241f9c82e27dd98ba6f4e4180922388ab5d1a3 assets/create/models/block/cut_granite_bricks_wall_side_tall.json 81be5e86cbdaec4945d3ccaf6d376f69c49f40d6 assets/create/models/block/cut_granite_slab.json f72a14e7cf3dd7d93b4462a3bee49683353dfb57 assets/create/models/block/cut_granite_slab_top.json 33bf924f01aae3a7720475f4b32b3a637e69ee36 assets/create/models/block/cut_granite_stairs.json @@ -927,15 +1008,15 @@ fb4969e562ad2039d3bad2dc57a6845d3243d453 assets/create/models/block/cut_granite_ 2972b40134bcb15950a0118306f0251ff5e377b7 assets/create/models/block/cut_granite_wall_side.json abbe71fd17dbb5f176553db2f6edf2f1f7d8974a assets/create/models/block/cut_granite_wall_side_tall.json 019d3c4ffb39e328b5458aee44fee90e0ecbd829 assets/create/models/block/cut_limestone.json +7eae0f9766506f713933bde9f301d2f7f2bbef13 assets/create/models/block/cut_limestone_bricks.json +817e8cf8956af36c70e4b4e30b5d141086d006dd assets/create/models/block/cut_limestone_bricks_wall_post.json +1291cacff1b0980e58b5702a84c9b87ac5ef835d assets/create/models/block/cut_limestone_bricks_wall_side.json +6c9bc8803fe17ac623bde56f85683dd2ff13c33e assets/create/models/block/cut_limestone_bricks_wall_side_tall.json c93f33ba39c62b10dfb94c6e1c339cd4fbebffae assets/create/models/block/cut_limestone_brick_slab.json b12a340897ba98ed732a91dbd4129db7a7188e68 assets/create/models/block/cut_limestone_brick_slab_top.json 3e90b32d95ad1cf7b8a16dae3c16724510d41490 assets/create/models/block/cut_limestone_brick_stairs.json b2e7311667d14b2aa8c00e207f69f76207226567 assets/create/models/block/cut_limestone_brick_stairs_inner.json aac619ec1fb8aa56f1752ad3f354f9cb128771f8 assets/create/models/block/cut_limestone_brick_stairs_outer.json -7eae0f9766506f713933bde9f301d2f7f2bbef13 assets/create/models/block/cut_limestone_bricks.json -817e8cf8956af36c70e4b4e30b5d141086d006dd assets/create/models/block/cut_limestone_bricks_wall_post.json -1291cacff1b0980e58b5702a84c9b87ac5ef835d assets/create/models/block/cut_limestone_bricks_wall_side.json -6c9bc8803fe17ac623bde56f85683dd2ff13c33e assets/create/models/block/cut_limestone_bricks_wall_side_tall.json adc21af1c07edaf0573cfd2c95ebe38e50f7282c assets/create/models/block/cut_limestone_slab.json 2d1ea8fc5c8ce5549c7f7888371b6612bf0f5301 assets/create/models/block/cut_limestone_slab_top.json c1416808a2178996be75e0a9c1cd45849fcd6646 assets/create/models/block/cut_limestone_stairs.json @@ -945,15 +1026,15 @@ c1416808a2178996be75e0a9c1cd45849fcd6646 assets/create/models/block/cut_limeston 2b5e65e662069a5c59e702224778dd407f5d11dd assets/create/models/block/cut_limestone_wall_side.json 052f130fef646242acccbbed2b510add21e18921 assets/create/models/block/cut_limestone_wall_side_tall.json 66cb6054821d45a60ae4d4d1d904dbef0b9f7c0f assets/create/models/block/cut_ochrum.json +0a7e38e3ac32352c5b3ec56a8c26212dbbb637a3 assets/create/models/block/cut_ochrum_bricks.json +47d0c58dd190f1ea894a5ca40ea7efd54a845d3e assets/create/models/block/cut_ochrum_bricks_wall_post.json +b502b5b213996bce0a626d86414045c80921511e assets/create/models/block/cut_ochrum_bricks_wall_side.json +c3f27545b3b7654c3e7a2df6b482d1a9895ccae9 assets/create/models/block/cut_ochrum_bricks_wall_side_tall.json ce16ec490ae8a33671502804e0b45fc42b6f228f assets/create/models/block/cut_ochrum_brick_slab.json fcbee94fdbd96b0b3d4aa245c6c87443abd1de90 assets/create/models/block/cut_ochrum_brick_slab_top.json 827349ed3eb05f5fe700e8f5816bcd82d0347612 assets/create/models/block/cut_ochrum_brick_stairs.json aa81d4135400eb40f891f8c41fcf7fa516ef64f1 assets/create/models/block/cut_ochrum_brick_stairs_inner.json ecd7e1cb9cae717e35eeb58dbe482833e98f5ac0 assets/create/models/block/cut_ochrum_brick_stairs_outer.json -0a7e38e3ac32352c5b3ec56a8c26212dbbb637a3 assets/create/models/block/cut_ochrum_bricks.json -47d0c58dd190f1ea894a5ca40ea7efd54a845d3e assets/create/models/block/cut_ochrum_bricks_wall_post.json -b502b5b213996bce0a626d86414045c80921511e assets/create/models/block/cut_ochrum_bricks_wall_side.json -c3f27545b3b7654c3e7a2df6b482d1a9895ccae9 assets/create/models/block/cut_ochrum_bricks_wall_side_tall.json e23998f88eb77826f5e4d58f3f4bb41a2e09ea97 assets/create/models/block/cut_ochrum_slab.json cd14f1abe3d0c65fbdd052f4a8e0b8fc2a15ad0e assets/create/models/block/cut_ochrum_slab_top.json a751feb4b609df141f971e341b204e76379dcda7 assets/create/models/block/cut_ochrum_stairs.json @@ -963,15 +1044,15 @@ bed6843e39e7e771f6de151dfab0586d3ebad58c assets/create/models/block/cut_ochrum_s df267fb690642cac139aaabefa9eab802f13ddc1 assets/create/models/block/cut_ochrum_wall_side.json ed363b80cc61cb4d0b6fad9da855a0543ecaccc9 assets/create/models/block/cut_ochrum_wall_side_tall.json a65a54a08d9cc3b45e2320482dc2d9e317dd4f3d assets/create/models/block/cut_scorchia.json +9c93a554ab680d7c98c648c16472b52cc2646c50 assets/create/models/block/cut_scorchia_bricks.json +615dc444bb677caa774a4e95686ac24ebe4ec6dc assets/create/models/block/cut_scorchia_bricks_wall_post.json +758a2ad6677f857fbe955c26853eadc7150c105a assets/create/models/block/cut_scorchia_bricks_wall_side.json +f918dfa0751589d18a3eb054c290f669b5c61308 assets/create/models/block/cut_scorchia_bricks_wall_side_tall.json a032cf0a77e4f416ed153b1ffa834c065a73b2ae assets/create/models/block/cut_scorchia_brick_slab.json 716fc6ef58c240b3e6b45acf08d6e1472fe38e7c assets/create/models/block/cut_scorchia_brick_slab_top.json b2870e5ba7c5d5053b3639bf0aa1771ee050810b assets/create/models/block/cut_scorchia_brick_stairs.json 3e8a815eabd1991039a8ad18cedc9c57f46cd097 assets/create/models/block/cut_scorchia_brick_stairs_inner.json 0a9dc3149e7219a70642c242cd86dce5ba5cf4cc assets/create/models/block/cut_scorchia_brick_stairs_outer.json -9c93a554ab680d7c98c648c16472b52cc2646c50 assets/create/models/block/cut_scorchia_bricks.json -615dc444bb677caa774a4e95686ac24ebe4ec6dc assets/create/models/block/cut_scorchia_bricks_wall_post.json -758a2ad6677f857fbe955c26853eadc7150c105a assets/create/models/block/cut_scorchia_bricks_wall_side.json -f918dfa0751589d18a3eb054c290f669b5c61308 assets/create/models/block/cut_scorchia_bricks_wall_side_tall.json a85c4d0467c6746a8ef9c6ac0167d3e16f307d4e assets/create/models/block/cut_scorchia_slab.json 23fd6c65ea83f7ca7ef67dd7faf902c4fa662d70 assets/create/models/block/cut_scorchia_slab_top.json e42329f6fa3aeb958d2349a5442856e9473dc6b5 assets/create/models/block/cut_scorchia_stairs.json @@ -981,15 +1062,15 @@ b9a911675861fee414f82c745399a7707c258f77 assets/create/models/block/cut_scorchia e61af066960897d50dc7f7bc17f95baa962829bd assets/create/models/block/cut_scorchia_wall_side.json 846f84efddca7d51b58ebe5e3bbed78312fb052d assets/create/models/block/cut_scorchia_wall_side_tall.json ce9dcf5b7fe58a97fab832fb98b4f5b6d3778255 assets/create/models/block/cut_scoria.json +fa3ef2bb65299c985b70f6959421e243a9ebc6d8 assets/create/models/block/cut_scoria_bricks.json +24ea1a30f68a918e6737dc8d9babe4528af5716a assets/create/models/block/cut_scoria_bricks_wall_post.json +ba7ae110d51fe510566ab42f5ead299b4409f2b7 assets/create/models/block/cut_scoria_bricks_wall_side.json +f04d12bc4e0b939bb443abcc6eb808e66c352c66 assets/create/models/block/cut_scoria_bricks_wall_side_tall.json edf04cbfb19b6ce99c1b74a71d40cd40c8120551 assets/create/models/block/cut_scoria_brick_slab.json f05725fd6d2764b277f01985d0e2fcbd3bf4a41e assets/create/models/block/cut_scoria_brick_slab_top.json 4bccbaef9dd9a8322087d3feb973e14d740ff27a assets/create/models/block/cut_scoria_brick_stairs.json 13f3b55dfdd97e68a6d525166618477e5bcb336d assets/create/models/block/cut_scoria_brick_stairs_inner.json 465862fb20542cae723fd72818be73aec05dad60 assets/create/models/block/cut_scoria_brick_stairs_outer.json -fa3ef2bb65299c985b70f6959421e243a9ebc6d8 assets/create/models/block/cut_scoria_bricks.json -24ea1a30f68a918e6737dc8d9babe4528af5716a assets/create/models/block/cut_scoria_bricks_wall_post.json -ba7ae110d51fe510566ab42f5ead299b4409f2b7 assets/create/models/block/cut_scoria_bricks_wall_side.json -f04d12bc4e0b939bb443abcc6eb808e66c352c66 assets/create/models/block/cut_scoria_bricks_wall_side_tall.json aeef239ca6b0eee527f75091d11d4a947740416d assets/create/models/block/cut_scoria_slab.json 5dfda9fa8117d35ebc324a5c9cb026e206e3b936 assets/create/models/block/cut_scoria_slab_top.json dfe8dbdb6deca69d847ee46fedfefe2da98dc329 assets/create/models/block/cut_scoria_stairs.json @@ -999,15 +1080,15 @@ e0b2a94ff4b3f1c1e4282c9c8eecf2583bd7c68e assets/create/models/block/cut_scoria_w cf18e3fde94e3ba611f430fe527a9042a57e6936 assets/create/models/block/cut_scoria_wall_side.json 92475d7758b2bf582c585c2aafa6510f330c6f45 assets/create/models/block/cut_scoria_wall_side_tall.json 9f6543d21d9c24a429aae00511e6dbf61caf8030 assets/create/models/block/cut_tuff.json +8b3d9fe37ab7fda79ea4d90f674c525350883ba0 assets/create/models/block/cut_tuff_bricks.json +6b80481e15ff3d6eb40a42128da883c2027e0074 assets/create/models/block/cut_tuff_bricks_wall_post.json +057a34015b49565cb9858a2eea995a446ac0cfd4 assets/create/models/block/cut_tuff_bricks_wall_side.json +9f20bd04ef163076db9a8bf83c20cc802b57ae60 assets/create/models/block/cut_tuff_bricks_wall_side_tall.json 8c16599fda76c38978a2faa14f842a68fbbe4b9c assets/create/models/block/cut_tuff_brick_slab.json 696036e5900bdbb366dd49f5df71a1e701fd8ee3 assets/create/models/block/cut_tuff_brick_slab_top.json 54d4603e36be86e88d9302d61eab81e76cac1bbc assets/create/models/block/cut_tuff_brick_stairs.json 0ebb41a1ce5bf4ca86cbaf95e83cd2edf8f309ea assets/create/models/block/cut_tuff_brick_stairs_inner.json 5d5ed291db4b4bca464717c7fcde682b33d71c3f assets/create/models/block/cut_tuff_brick_stairs_outer.json -8b3d9fe37ab7fda79ea4d90f674c525350883ba0 assets/create/models/block/cut_tuff_bricks.json -6b80481e15ff3d6eb40a42128da883c2027e0074 assets/create/models/block/cut_tuff_bricks_wall_post.json -057a34015b49565cb9858a2eea995a446ac0cfd4 assets/create/models/block/cut_tuff_bricks_wall_side.json -9f20bd04ef163076db9a8bf83c20cc802b57ae60 assets/create/models/block/cut_tuff_bricks_wall_side_tall.json f2a904b7943555e8ec9dcc07513ca1ad9af809c3 assets/create/models/block/cut_tuff_slab.json ea74bb8a69f6acbd520ac8922e147495e5f99f6f assets/create/models/block/cut_tuff_slab_top.json 0262700e59de947907a04fdea9974f9d7e5a22f2 assets/create/models/block/cut_tuff_stairs.json @@ -1017,15 +1098,15 @@ ea74bb8a69f6acbd520ac8922e147495e5f99f6f assets/create/models/block/cut_tuff_sla 8c6492dc9e09359e5bac67ae4d473cffc8f93dbb assets/create/models/block/cut_tuff_wall_side.json f5f24066b6281303f52e25745881d5bca8c49c54 assets/create/models/block/cut_tuff_wall_side_tall.json 167e9a084987bcf7f67f655d0de88ae8ca2fcebb assets/create/models/block/cut_veridium.json +f8ab87c34f211a63525f6d386397face67460f8c assets/create/models/block/cut_veridium_bricks.json +e4e717fa8412032e184aebd1186470f41a2089c0 assets/create/models/block/cut_veridium_bricks_wall_post.json +8c40ccb8f10ef8dcda1bef46ad3490f697d178d2 assets/create/models/block/cut_veridium_bricks_wall_side.json +2c4671c66d904e15883ec3a14681b97ac537135c assets/create/models/block/cut_veridium_bricks_wall_side_tall.json 07c330c501375d5c316677edee80fb040c0fc237 assets/create/models/block/cut_veridium_brick_slab.json 4c8c660afe72e8ce9eaef53a37fdc63eb0c69513 assets/create/models/block/cut_veridium_brick_slab_top.json f802e4ae758e2c37c3129594ce4f5d9ffcfe173d assets/create/models/block/cut_veridium_brick_stairs.json 0d60d5cd0269e05816d28fcbbd2c680fe60cd316 assets/create/models/block/cut_veridium_brick_stairs_inner.json 22656f90b55aeaeeffa448b5f061fb26b5de7b0f assets/create/models/block/cut_veridium_brick_stairs_outer.json -f8ab87c34f211a63525f6d386397face67460f8c assets/create/models/block/cut_veridium_bricks.json -e4e717fa8412032e184aebd1186470f41a2089c0 assets/create/models/block/cut_veridium_bricks_wall_post.json -8c40ccb8f10ef8dcda1bef46ad3490f697d178d2 assets/create/models/block/cut_veridium_bricks_wall_side.json -2c4671c66d904e15883ec3a14681b97ac537135c assets/create/models/block/cut_veridium_bricks_wall_side_tall.json d736230e9b49a9fd40bc8f31df4d5144cdb429c8 assets/create/models/block/cut_veridium_slab.json 750e536c7b71dfb3a005d9b7a128ac435461e57f assets/create/models/block/cut_veridium_slab_top.json 8b05c19560e97ce15a66202717e3d32f6ee153a9 assets/create/models/block/cut_veridium_stairs.json @@ -1035,8 +1116,11 @@ d6423c0fd0af4fbd929d26d6097a1722567acc9d assets/create/models/block/cut_veridium b2e847cee8c01791c15fcdd35787af33ebe46f0a assets/create/models/block/cut_veridium_wall_side.json 5ab4db4245b852edf985fe72595f678eb7372801 assets/create/models/block/cut_veridium_wall_side_tall.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/cyan_nixie_tube.json +0cbd0c6c909effa2f71e198655d51f2e483454aa assets/create/models/block/cyan_postbox_closed.json +ccea6f3023879d84de4590a584f666598f58d6bc assets/create/models/block/cyan_postbox_open.json 27c9aff76b32e4de18d581e133fc23a8239ca412 assets/create/models/block/cyan_sail.json 01a324a92552076589e2aaaeca9d4da2d1e3b39d assets/create/models/block/cyan_seat.json +c7a147b092909c57ae197007818810fa75b9cb68 assets/create/models/block/cyan_table_cloth.json 663f431fe8a02e057980cf9bcfc566eb5adc876f assets/create/models/block/cyan_toolbox.json febd2b2f94194441fb73020b667d0398853add4a assets/create/models/block/cyan_valve_handle.json 339993f53eacf042d8caab6101eb5d4088b35746 assets/create/models/block/dark_oak_window.json @@ -1052,25 +1136,22 @@ db89bc32d0e466bc5008aa7091c682ba3aeec611 assets/create/models/block/diorite_pill a21387ab955f2b91e402b2189145f5fd6623592d assets/create/models/block/diorite_pillar_horizontal.json 44af455badc2b35a763007bba3537bda7d0ac289 assets/create/models/block/dripstone_pillar.json 1e23e3758e3311d0063c83742abb750a05021075 assets/create/models/block/dripstone_pillar_horizontal.json +19a773f91c58c49301f35965bac02d0c05fb2764 assets/create/models/block/exposed_copper_shingles.json a3420b91fdebec40e508a5eebb145c0201bd80c8 assets/create/models/block/exposed_copper_shingle_slab.json 4178ea5e50ee17b3c15f4a59efd019c4a19bb892 assets/create/models/block/exposed_copper_shingle_slab_top.json dd2d747774abc86e428a883e299db66cded78e11 assets/create/models/block/exposed_copper_shingle_stairs.json b6845da62d96a33cee624bb70360e256b26eda83 assets/create/models/block/exposed_copper_shingle_stairs_inner.json 3d8b758e50e75c5adc26ab6f39f9d73f00866673 assets/create/models/block/exposed_copper_shingle_stairs_outer.json -19a773f91c58c49301f35965bac02d0c05fb2764 assets/create/models/block/exposed_copper_shingles.json +9cb20c9d41629d8b9426cb65829365d10966338f assets/create/models/block/exposed_copper_tiles.json cd21d9d2935b6d0103502e2731c11ea27ff64ecf assets/create/models/block/exposed_copper_tile_slab.json 0ec039ba59fb0028183433e52131ff355ace5bff assets/create/models/block/exposed_copper_tile_slab_top.json c51dbd34996ac4513234800e427ac308067d5e1d assets/create/models/block/exposed_copper_tile_stairs.json 68772d4352dc7ade995dfa57ba41a38ef819e855 assets/create/models/block/exposed_copper_tile_stairs_inner.json d932671822ba93b71a9c8b50e7207803a1c4dbab assets/create/models/block/exposed_copper_tile_stairs_outer.json -9cb20c9d41629d8b9426cb65829365d10966338f assets/create/models/block/exposed_copper_tiles.json 2d1ade82820569936fd3021a877283474ced09d0 assets/create/models/block/fake_track.json 9e41f0b90dd1e71766c9d07bdb75d1e553f3392f assets/create/models/block/fluid_pipe/d_x.json 13507730f6ca6462c4cfeddc46e5b21e93fb1287 assets/create/models/block/fluid_pipe/d_y.json 84c09934d3537343a1226389993dabfa850b745e assets/create/models/block/fluid_pipe/d_z.json -b8fd54e514bd50fb287c6b758647818c6b08ef75 assets/create/models/block/fluid_pipe/l_x.json -e985ff9dbe7324cf69ab38e6e9e85c9b554af56c assets/create/models/block/fluid_pipe/l_y.json -e24957d63bac1e754fcc1647a4a86337a67f6298 assets/create/models/block/fluid_pipe/l_z.json eacc5ee5f164ccc7c13cfbbd37a92b401222debe assets/create/models/block/fluid_pipe/ld_x.json 33fc0ecce85fae051c54d5a538793d7081238894 assets/create/models/block/fluid_pipe/ld_y.json 638f1a259cabed1f8d63c6fdaa6d4d4dff539e7d assets/create/models/block/fluid_pipe/ld_z.json @@ -1080,21 +1161,24 @@ c52521cd566294c797312104284ddd343fad9c2e assets/create/models/block/fluid_pipe/l 99637310d3ca1ccfbe62b03aa9b0d82a0cf6f724 assets/create/models/block/fluid_pipe/lu_x.json 986800d441e95553464d1869d39baf456f5d70dc assets/create/models/block/fluid_pipe/lu_y.json 11dcf7d2dcd0df9b043035cb072deee96ab9e6da assets/create/models/block/fluid_pipe/lu_z.json -d44ff2aed71039a7d0ff913d0d9e8398e1318f39 assets/create/models/block/fluid_pipe/r_x.json -92d4044b51a90da0b2277b0613c7ca0bb80c66fe assets/create/models/block/fluid_pipe/r_y.json -fb9a23de00ef4edb4f7e24fb60de345cd12e513f assets/create/models/block/fluid_pipe/r_z.json +b8fd54e514bd50fb287c6b758647818c6b08ef75 assets/create/models/block/fluid_pipe/l_x.json +e985ff9dbe7324cf69ab38e6e9e85c9b554af56c assets/create/models/block/fluid_pipe/l_y.json +e24957d63bac1e754fcc1647a4a86337a67f6298 assets/create/models/block/fluid_pipe/l_z.json bde9ec36b86113a6ca7a51a4f405994460a2eb56 assets/create/models/block/fluid_pipe/rd_x.json bd325f5b37ff08328ddddeeceac1a41be586d20a assets/create/models/block/fluid_pipe/rd_y.json 28f351fd215af3a991ccd9aa05c57b9cd9e6f58d assets/create/models/block/fluid_pipe/rd_z.json 1ff3ea321aeacca70709eb76370c11c7f13163b6 assets/create/models/block/fluid_pipe/ru_x.json 95bc5342fd3909981430c2e13ef98cdbd8f02709 assets/create/models/block/fluid_pipe/ru_y.json e1fc0d1297a83749ac55f51c9cf33ff2ecc9fdc2 assets/create/models/block/fluid_pipe/ru_z.json -4e3debb2ba60398a0730866f781e0455f4316610 assets/create/models/block/fluid_pipe/u_x.json -0f98b30ba09706b8a5ee09aeef912b39acea0216 assets/create/models/block/fluid_pipe/u_y.json -83bf9b1af633c319c051055170debff4cc3508c0 assets/create/models/block/fluid_pipe/u_z.json +d44ff2aed71039a7d0ff913d0d9e8398e1318f39 assets/create/models/block/fluid_pipe/r_x.json +92d4044b51a90da0b2277b0613c7ca0bb80c66fe assets/create/models/block/fluid_pipe/r_y.json +fb9a23de00ef4edb4f7e24fb60de345cd12e513f assets/create/models/block/fluid_pipe/r_z.json 65a41f4b680af197776e03cae6f1815b6d04def2 assets/create/models/block/fluid_pipe/ud_x.json 26398801d89889ffe17b6513b786d27707f6a480 assets/create/models/block/fluid_pipe/ud_y.json 07747cc2b936e1b326bae7ac32a8a5ba77fdffa9 assets/create/models/block/fluid_pipe/ud_z.json +4e3debb2ba60398a0730866f781e0455f4316610 assets/create/models/block/fluid_pipe/u_x.json +0f98b30ba09706b8a5ee09aeef912b39acea0216 assets/create/models/block/fluid_pipe/u_y.json +83bf9b1af633c319c051055170debff4cc3508c0 assets/create/models/block/fluid_pipe/u_z.json 5f70af15ec2569c68a17d31024c7a37cb5c68c7e assets/create/models/block/framed_glass.json f0100e1d44146b256998fbd2af05da80d147e8d9 assets/create/models/block/framed_glass_pane_noside.json 4a032c6ae3f459e3349c2a2218da186170c31e03 assets/create/models/block/framed_glass_pane_noside_alt.json @@ -1116,13 +1200,19 @@ d0fa41de17f65693188f1868ace5fc2ac518739b assets/create/models/block/gantry_shaft 3356069e112cde817da0c99ceb40cd8f207de822 assets/create/models/block/granite_pillar.json ee860a8bd95fda14a859d6632652ee2a95f06c19 assets/create/models/block/granite_pillar_horizontal.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/gray_nixie_tube.json +f2bbb067bc4e91a71303cc92939c4f4707cdc1ab assets/create/models/block/gray_postbox_closed.json +905fb4b54a39ca9bc1d6f48977bb3b158b17c2a1 assets/create/models/block/gray_postbox_open.json 97f382e9b435c81d1d8e0ed487a7fc16e6945958 assets/create/models/block/gray_sail.json 58b51da5c80e4f43582452d97453c93145a516ad assets/create/models/block/gray_seat.json +2efdba46e7e7acbbcbd36468e5d46c22989b8516 assets/create/models/block/gray_table_cloth.json cd3cff8e38d559dcb78df014556a78d5a538af43 assets/create/models/block/gray_toolbox.json 3ee19f46bdeb0ac7489dcd4d51f90ab01ad863c9 assets/create/models/block/gray_valve_handle.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/green_nixie_tube.json +21fbacdc856fb1003f58bf2842fe418124f6b01d assets/create/models/block/green_postbox_closed.json +703df2f5307d39f0f4e5b9a1f99b8c14fd819dd0 assets/create/models/block/green_postbox_open.json 26577589688ec1f39cae9f42704cb36cbc1c48ae assets/create/models/block/green_sail.json ae51eaa500dd036fa27474a7392f381afb677dfd assets/create/models/block/green_seat.json +4fbf52032b062afd32921ee925d8c13160fe2029 assets/create/models/block/green_table_cloth.json 801d277b241332d5f4b49bdb00b911dcd01a7db2 assets/create/models/block/green_toolbox.json f7762c9388198b51686541edbef9a1546041f6e4 assets/create/models/block/green_valve_handle.json f8b51eec36c2eddc08a1b60894d863bb58f55625 assets/create/models/block/haunted_bell_ceiling.json @@ -1137,6 +1227,12 @@ a1a239714f5feb45a692f5c2873c37d6614e1b8b assets/create/models/block/horizontal_f 0f7e518ef02428c55e1683bc9de0d20e2c1e6883 assets/create/models/block/horizontal_framed_glass_pane_side.json db3f9472815fb6acc1ee1d9941b8cc19518ebcbf assets/create/models/block/horizontal_framed_glass_pane_side_alt.json 6868ed1959875efec96a15ca6f32b8c7efefb2d9 assets/create/models/block/industrial_iron_block.json +02806f9c95ba6b74b61e1c92927492b3668ffdc9 assets/create/models/block/industrial_iron_window.json +a0152d54688e8c4bb0c96e0476cca7e5f92dabd7 assets/create/models/block/industrial_iron_window_pane_noside.json +bbc922f5ddce4acfe89911d149204d4663515fc2 assets/create/models/block/industrial_iron_window_pane_noside_alt.json +13c0714510f379830f42488c4f0457c4f4d6be16 assets/create/models/block/industrial_iron_window_pane_post.json +b5bbcb04dd68249b4d9c2bae2fa2c15e9bcd9870 assets/create/models/block/industrial_iron_window_pane_side.json +7763d9f974f859963a48060858b80a6b46f842c9 assets/create/models/block/industrial_iron_window_pane_side_alt.json cdc4f1c608f74824fd270521a846823ca4b6ef16 assets/create/models/block/jungle_window.json 8c5ee8e36756fcff3095c564567a35be1db23cee assets/create/models/block/jungle_window_pane_noside.json 2bb34fe17c7cfafc8658cd0b44ab636191f81348 assets/create/models/block/jungle_window_pane_noside_alt.json @@ -1158,30 +1254,42 @@ b843a6e27c4f90e31108f9f3c1573e70fb3d0927 assets/create/models/block/layered_scor 5fb53db0c6623dc16e486ac0bd094b5a90e2e080 assets/create/models/block/layered_tuff.json 336d1646294e018ea3de60b30a621a10ca7aa6d7 assets/create/models/block/layered_veridium.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/light_blue_nixie_tube.json +cf487c0be9444b7ac124d2ae33e6c545803e14b6 assets/create/models/block/light_blue_postbox_closed.json +7497701edea1599fc51e3eaa0367007ca00bbe69 assets/create/models/block/light_blue_postbox_open.json 2e83d3aaa92640d6b3da2a2644f6a160f97b08e4 assets/create/models/block/light_blue_sail.json ba917560f40a4e46ef190649f18adad9962c5c02 assets/create/models/block/light_blue_seat.json +af065b4c74b0d177075221a996d9ac78b871e8f0 assets/create/models/block/light_blue_table_cloth.json c20616aa90feab3003cecb4a5be5466c0fc83072 assets/create/models/block/light_blue_toolbox.json bcd3d28b8a062649301648ea5e2d0463f93d008d assets/create/models/block/light_blue_valve_handle.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/light_gray_nixie_tube.json +1efabd28f0dc3db1c0e6bea2be62cac883fefd66 assets/create/models/block/light_gray_postbox_closed.json +a42521eac2924269cb1f0e865bafe7dcd147d1cc assets/create/models/block/light_gray_postbox_open.json 09f284574b38ab57579e939bbb088b8d36e0b8f5 assets/create/models/block/light_gray_sail.json d1813d0f548fcddb361df7cc3b5d97582842b10f assets/create/models/block/light_gray_seat.json +debf78f20659bc3c637299a40b649cbe4aa30ebf assets/create/models/block/light_gray_table_cloth.json 4ec5d701dd8b2d8c3dc44d05f527a3d737002cd4 assets/create/models/block/light_gray_toolbox.json adb8dbed70419e0310e7a20f3656bf325b348434 assets/create/models/block/light_gray_valve_handle.json -2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/lime_nixie_tube.json -5a95a72444f523cfba6e8c5adf8eacbb37e2d21e assets/create/models/block/lime_sail.json -09e7bf50cf88c449dbd9e77829cdb5afffb7d88d assets/create/models/block/lime_seat.json -b92822a01e4fbed2463b1bdf7dcc736023988e20 assets/create/models/block/lime_toolbox.json -802b47f34b1053b7af980b08b6511f468e7dd7c1 assets/create/models/block/lime_valve_handle.json 8f53caad3899a30be5087a0ba155080834418cc0 assets/create/models/block/limestone.json 2b80f9421c2fe902d55d9bd95183ad4bae46c315 assets/create/models/block/limestone_pillar.json fb18280a2a708f60b00cc7c675804c219784871a assets/create/models/block/limestone_pillar_horizontal.json +2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/lime_nixie_tube.json +952d292d4dc2158e6106c5079cfa1ddb81c7777e assets/create/models/block/lime_postbox_closed.json +4357f5d9102d54c7fbe5325512a2cd42d94d6d42 assets/create/models/block/lime_postbox_open.json +5a95a72444f523cfba6e8c5adf8eacbb37e2d21e assets/create/models/block/lime_sail.json +09e7bf50cf88c449dbd9e77829cdb5afffb7d88d assets/create/models/block/lime_seat.json +e4142a22c20d6e5b9a8b9f96c13d4e5f96adc59d assets/create/models/block/lime_table_cloth.json +b92822a01e4fbed2463b1bdf7dcc736023988e20 assets/create/models/block/lime_toolbox.json +802b47f34b1053b7af980b08b6511f468e7dd7c1 assets/create/models/block/lime_valve_handle.json 84b9ac6eafdbd037f3ff558c250a8b8952415af1 assets/create/models/block/linear_chassis.json 29ee936c09c1222c6a144e5bb39577b5a9cd28bf assets/create/models/block/linear_chassis_bottom.json a1a3804ddcb1db0a7b5c0693555f8eb326950dd0 assets/create/models/block/linear_chassis_top.json f885acc0ba705cfa9c65b62626ab4007f3b6e329 assets/create/models/block/linear_chassis_top_bottom.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/magenta_nixie_tube.json +bfea3fd456f92391afc9f948ade90b16275e63de assets/create/models/block/magenta_postbox_closed.json +fe224c9e396eb51a6cc0b38175b621a56500fda7 assets/create/models/block/magenta_postbox_open.json 81122f26a12b7ab40fed6d31c97376f4dfffa111 assets/create/models/block/magenta_sail.json b5cd13b021400b3c37499ec4ef22e560c721ac54 assets/create/models/block/magenta_seat.json +8b37821a3c6825488479d4f605bbd84734457c68 assets/create/models/block/magenta_table_cloth.json d7b2b16ba2d6a0b2441aeaf7faa76f61fbdc35e7 assets/create/models/block/magenta_toolbox.json c0d29851d48cebd376b3b6e8f0454e0369d0e265 assets/create/models/block/magenta_valve_handle.json 026384a699d592160624bb7a1606e31fb77751be assets/create/models/block/mangrove_window.json @@ -1204,8 +1312,11 @@ af50363d603d61340b336569d58c1febde253665 assets/create/models/block/ochrum_natur d69effa0a811cb93fead8257bcaad4bbf0094002 assets/create/models/block/ochrum_natural_3.json 24669a4e93925940477fcfc0aca10ab9d87368e0 assets/create/models/block/ochrum_pillar.json c8dd33a0b71dce37712788a61729de89574b117f assets/create/models/block/ochrum_pillar_horizontal.json +dbd0cbfa1c6cfaddd7ac954379b4b1f3056730f2 assets/create/models/block/orange_postbox_closed.json +88cda1f606e502cf0df9430b75a70fd3161fd6ba assets/create/models/block/orange_postbox_open.json cb4cd4e4bfb0d105a09c56454abf4795b155d12b assets/create/models/block/orange_sail.json 6c4addc75fb03911fca3083f891b22f55209b8db assets/create/models/block/orange_seat.json +f004bacf25a9675a87905ddbfa2e140a3891f4b0 assets/create/models/block/orange_table_cloth.json f68eeb8cd828a0659fe8665373daf093ea65f0fc assets/create/models/block/orange_toolbox.json 992367362e20777dd2e1245c6b26b6ffab86b21c assets/create/models/block/orange_valve_handle.json f9010894858512398bddd5d31b922e12594d2e3c assets/create/models/block/ornate_iron_window.json @@ -1214,25 +1325,28 @@ f9010894858512398bddd5d31b922e12594d2e3c assets/create/models/block/ornate_iron_ 92637fbd6bf54891411b32a494064b9a48e59411 assets/create/models/block/ornate_iron_window_pane_post.json 8416d497e7fc8ca4f9f4c608ccc0651036850256 assets/create/models/block/ornate_iron_window_pane_side.json 1cdaa9d4bd23f7b1eb14672dc9322d9dad966502 assets/create/models/block/ornate_iron_window_pane_side_alt.json +561beafce41b9e9c0b07bc6b7176dd4f6918c116 assets/create/models/block/oxidized_copper_shingles.json 7e0bab8109e322c6db5fe1d5999c06536c21c6eb assets/create/models/block/oxidized_copper_shingle_slab.json 42df32c4e2d1ffb2ee62748becfd1717118b440c assets/create/models/block/oxidized_copper_shingle_slab_top.json b55a733e3e68cfbd08d45bb9ac56deef9f728b60 assets/create/models/block/oxidized_copper_shingle_stairs.json 7b8745213af5aa7938fc04a295be6a087c72daa8 assets/create/models/block/oxidized_copper_shingle_stairs_inner.json d89419d48d6ee2f6747e7c93de8699db22ea3f59 assets/create/models/block/oxidized_copper_shingle_stairs_outer.json -561beafce41b9e9c0b07bc6b7176dd4f6918c116 assets/create/models/block/oxidized_copper_shingles.json +5cf92b628ff1f832966138a58ed87d747681274c assets/create/models/block/oxidized_copper_tiles.json ad6134598869711a12e2f95c9b5f25a0f7b8dd93 assets/create/models/block/oxidized_copper_tile_slab.json c17bac0fd6a20540813c6a1c000a553b7c5ac849 assets/create/models/block/oxidized_copper_tile_slab_top.json d5b30340364f5536e46bc67e777ef4fa20a36e04 assets/create/models/block/oxidized_copper_tile_stairs.json b40b315c23cbd3eb4658518bfac836f6091321a5 assets/create/models/block/oxidized_copper_tile_stairs_inner.json f4eaadab29b4f2e915237340e2d6f4aad4ba21d6 assets/create/models/block/oxidized_copper_tile_stairs_outer.json -5cf92b628ff1f832966138a58ed87d747681274c assets/create/models/block/oxidized_copper_tiles.json f8b51eec36c2eddc08a1b60894d863bb58f55625 assets/create/models/block/peculiar_bell_ceiling.json f70f83cfec770879c478eea3760ea187700f2878 assets/create/models/block/peculiar_bell_double_wall.json b9c9d00b844ca2f217ae21cc502cd4d082fed2d5 assets/create/models/block/peculiar_bell_floor.json f7b09c243cfeda8bb38a29a917b9fbdafe47eece assets/create/models/block/peculiar_bell_single_wall.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/pink_nixie_tube.json +084266ced8975953fa158fd9e7261d8f10b94db7 assets/create/models/block/pink_postbox_closed.json +e99518b61a3c7a89570a8aa8c4cb45badfa8547a assets/create/models/block/pink_postbox_open.json 90113a1f53f0f8d9ce11ff14128eb860063f5ddc assets/create/models/block/pink_sail.json 888dba067e751a55205dbd919db8e92ef2be604d assets/create/models/block/pink_seat.json +9a7e7af8cc625a0812304c9bd3b00d13f085f040 assets/create/models/block/pink_table_cloth.json 3cb69299c7787f88fb41c6397362aa7b607c0960 assets/create/models/block/pink_toolbox.json cf2fda0a37a0e5771cf882793ca21f277219796f assets/create/models/block/pink_valve_handle.json 44b05f0e3847c526514f7a7e167d275415408b39 assets/create/models/block/polished_cut_andesite.json @@ -1385,9 +1499,15 @@ b21ec7cde56398b65f44922ddb026d9adb7b6072 assets/create/models/block/polished_cut 66374fdc4d3d55f99b03e406f3b594f8b1bab94d assets/create/models/block/pulse_repeater_powered.json 6bd0d85ca18b468bee279e7bc398bc8395e33a8b assets/create/models/block/pulse_repeater_powered_powering.json de0cc956e7ff1510d0947ca8fd2b6e642944f0ee assets/create/models/block/pulse_repeater_powering.json +addbe93af945ff7ca2680a27225db804d3ac9b46 assets/create/models/block/pulse_timer_powered.json +ab3d7e10abcb53b835d6f5c406b7a777a942d6f7 assets/create/models/block/pulse_timer_powered_powering.json +7b425d9db8d914b52b7faad2f792c020b678f84d assets/create/models/block/pulse_timer_powering.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/purple_nixie_tube.json +afdd265ee175c47ea6e4e44fb08d212e4cef5ee5 assets/create/models/block/purple_postbox_closed.json +fbd874fd63b3d6f50592703dce6bf196f2d63732 assets/create/models/block/purple_postbox_open.json 356378a5839b0b400aa5e0a67740634113c09a38 assets/create/models/block/purple_sail.json bc8e473a5662b6180b00b85e5006241a283c9baa assets/create/models/block/purple_seat.json +d040daf29c44f31c4cd8522998b66f7021b3c746 assets/create/models/block/purple_table_cloth.json 5e85ec98c165a0b5bfe25d391e96df9164372a3a assets/create/models/block/purple_toolbox.json b7e5f69044c7a1d0a31fd2f6efe81a5be060bf19 assets/create/models/block/purple_valve_handle.json e1fdd5fb88d9f5af7d0e90e65cf5ecea0667e1c7 assets/create/models/block/radial_chassis_side_x.json @@ -1399,8 +1519,11 @@ ff65b89683fbb9326f625b9a68f954def5ed000d assets/create/models/block/radial_chass 9d234d1294f927d1e70a5c9b1e6de73ef65e7014 assets/create/models/block/railway_casing.json be8042806b08990786ced1cf140c4942d7a6788b assets/create/models/block/raw_zinc_block.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/red_nixie_tube.json +844614001c30ef34d3136a350c12018c5e9ab341 assets/create/models/block/red_postbox_closed.json +d06791faedd062464a13972a3b64de86053aeac7 assets/create/models/block/red_postbox_open.json b692deeb65f338212fb1073b725a122b7b1359d5 assets/create/models/block/red_sail.json bf3f4ba33e1a61254073ecee3e753958f8debb35 assets/create/models/block/red_seat.json +687a21d7d3e00820430dc47575449dcdbdc5b59c assets/create/models/block/red_table_cloth.json 2a13766aebac1a392ae7bf934bd81d9210c87a24 assets/create/models/block/red_toolbox.json 36f525b420b040b9f78032abe84cd125766cf320 assets/create/models/block/red_valve_handle.json 2aa9e5c535979c912593f30b654ae96334f72a80 assets/create/models/block/refined_radiance_casing.json @@ -1420,133 +1543,133 @@ ff52eb59dadfe675e416440f3115856a501428a6 assets/create/models/block/scoria.json 4d7d36f974d25a310db2f75800e8c7e0377881c6 assets/create/models/block/secondary_linear_chassis_top.json 5ecb821ac06873015d2d7ebcfb7e1f5fe85cf504 assets/create/models/block/secondary_linear_chassis_top_bottom.json e697898a0ec4c308314a4e0b7235fa0a9229da45 assets/create/models/block/shadow_steel_casing.json +73edb947b52c73e85a83422853d0b8a0fb34e82b assets/create/models/block/small_andesite_bricks.json +3bb5c8413b9e81a1adc339f873f37eb656904e06 assets/create/models/block/small_andesite_bricks_wall_post.json +0e70d94fc6ffdc0fd4a50a5910bc1455b401982f assets/create/models/block/small_andesite_bricks_wall_side.json +597fec784e40c1ff3b622824c32773d6d271f3b7 assets/create/models/block/small_andesite_bricks_wall_side_tall.json 593b962350c8de53156901b308617c6a246afa09 assets/create/models/block/small_andesite_brick_slab.json c83de8118653ccdce92a1b7f3501bf7359e0b310 assets/create/models/block/small_andesite_brick_slab_top.json f019380bcc81d52681e2beaf63e2b11836c45922 assets/create/models/block/small_andesite_brick_stairs.json 4fa72fe0115ad9ec83837852a2b2e2d22dde19ca assets/create/models/block/small_andesite_brick_stairs_inner.json f80f485f62dce86e98815b343c89e96b10623e53 assets/create/models/block/small_andesite_brick_stairs_outer.json -73edb947b52c73e85a83422853d0b8a0fb34e82b assets/create/models/block/small_andesite_bricks.json -3bb5c8413b9e81a1adc339f873f37eb656904e06 assets/create/models/block/small_andesite_bricks_wall_post.json -0e70d94fc6ffdc0fd4a50a5910bc1455b401982f assets/create/models/block/small_andesite_bricks_wall_side.json -597fec784e40c1ff3b622824c32773d6d271f3b7 assets/create/models/block/small_andesite_bricks_wall_side_tall.json +4750724972cbac6d7dac31e0689681eab6c37093 assets/create/models/block/small_asurine_bricks.json +407c7bea509bb0e9bf9f04e947ace584103d012d assets/create/models/block/small_asurine_bricks_wall_post.json +60491dfb4f2a6b78effdf18612b9a1cd7d930d8a assets/create/models/block/small_asurine_bricks_wall_side.json +e5d3172c08b65696a6d72220495463636d8b352c assets/create/models/block/small_asurine_bricks_wall_side_tall.json cdd354726eda82d83dc89871fa587b8c07b02a16 assets/create/models/block/small_asurine_brick_slab.json 7bdb6ed1e74437d083bca7d89c0d1b7c81e80b53 assets/create/models/block/small_asurine_brick_slab_top.json 086b9d4284d343967a582fd0a7d194bafd980e13 assets/create/models/block/small_asurine_brick_stairs.json db69f1580ca405b9a99f0e4ea8d9b9950ed6444e assets/create/models/block/small_asurine_brick_stairs_inner.json dd572cbff713b0f4830aef0bf3ba4adb80ee9908 assets/create/models/block/small_asurine_brick_stairs_outer.json -4750724972cbac6d7dac31e0689681eab6c37093 assets/create/models/block/small_asurine_bricks.json -407c7bea509bb0e9bf9f04e947ace584103d012d assets/create/models/block/small_asurine_bricks_wall_post.json -60491dfb4f2a6b78effdf18612b9a1cd7d930d8a assets/create/models/block/small_asurine_bricks_wall_side.json -e5d3172c08b65696a6d72220495463636d8b352c assets/create/models/block/small_asurine_bricks_wall_side_tall.json +c2c72734ac526c319cb01e982824680bfb5f1186 assets/create/models/block/small_calcite_bricks.json +f17f2ecd5e5a32f92ec0ad0ba9e861a80432c0f2 assets/create/models/block/small_calcite_bricks_wall_post.json +1ad7654125aff67267567c0007cc03b8a15131b0 assets/create/models/block/small_calcite_bricks_wall_side.json +10c339f64c0e78f4fbb7a95c10bf7f9f399c0c6b assets/create/models/block/small_calcite_bricks_wall_side_tall.json d07c57748981a54ffcdadc30ec21f728a3557bea assets/create/models/block/small_calcite_brick_slab.json 9a5e6a93328ad35b256b2512c28e683a74e807a9 assets/create/models/block/small_calcite_brick_slab_top.json c3d39e013dd0142f044f8f0a90de849a0d961e84 assets/create/models/block/small_calcite_brick_stairs.json 4e47a4708dafc0ea476e2d5b6567acfdc2c5c148 assets/create/models/block/small_calcite_brick_stairs_inner.json 6a41c44680a958299a787d8c8c8778d52167cd65 assets/create/models/block/small_calcite_brick_stairs_outer.json -c2c72734ac526c319cb01e982824680bfb5f1186 assets/create/models/block/small_calcite_bricks.json -f17f2ecd5e5a32f92ec0ad0ba9e861a80432c0f2 assets/create/models/block/small_calcite_bricks_wall_post.json -1ad7654125aff67267567c0007cc03b8a15131b0 assets/create/models/block/small_calcite_bricks_wall_side.json -10c339f64c0e78f4fbb7a95c10bf7f9f399c0c6b assets/create/models/block/small_calcite_bricks_wall_side_tall.json +485f6c0e37b24124ff23efa3f0caa2cfe85663dd assets/create/models/block/small_crimsite_bricks.json +57b050751e68c9a881d9598cfe8dfb45f19df08c assets/create/models/block/small_crimsite_bricks_wall_post.json +cb01f90c7ac1f56a6f79e1fecb126c349b6d53b0 assets/create/models/block/small_crimsite_bricks_wall_side.json +80932617b1d4b718071c1f8558398ba881743892 assets/create/models/block/small_crimsite_bricks_wall_side_tall.json 827867ddd9b5f6e2daa916c968531c7183ce7fa2 assets/create/models/block/small_crimsite_brick_slab.json dd19ebdbd1a2de827d467b0abd2d1d3ee5822305 assets/create/models/block/small_crimsite_brick_slab_top.json 58048cb41b740b008a98420ea93b567f38e2910f assets/create/models/block/small_crimsite_brick_stairs.json a943586885ea7d48fc27595d9741f97d852446e7 assets/create/models/block/small_crimsite_brick_stairs_inner.json 8dc173b8a9912341ccb9cd8c9a0d2d893571eb85 assets/create/models/block/small_crimsite_brick_stairs_outer.json -485f6c0e37b24124ff23efa3f0caa2cfe85663dd assets/create/models/block/small_crimsite_bricks.json -57b050751e68c9a881d9598cfe8dfb45f19df08c assets/create/models/block/small_crimsite_bricks_wall_post.json -cb01f90c7ac1f56a6f79e1fecb126c349b6d53b0 assets/create/models/block/small_crimsite_bricks_wall_side.json -80932617b1d4b718071c1f8558398ba881743892 assets/create/models/block/small_crimsite_bricks_wall_side_tall.json +cd855b25c38be2c36dcbf6ab0d963a2c76043171 assets/create/models/block/small_deepslate_bricks.json +88a6c43f64c6d53b34719f41707622635108342b assets/create/models/block/small_deepslate_bricks_wall_post.json +dea1773ca9baf9e1a6a7a4288d348127b858c42d assets/create/models/block/small_deepslate_bricks_wall_side.json +673ab543b38a597fd74285cd25b8004c9e2bd706 assets/create/models/block/small_deepslate_bricks_wall_side_tall.json 67c78a3e9250351d0ea18538640b596f05e957a4 assets/create/models/block/small_deepslate_brick_slab.json bc1af783fbcbe73df05e12c93625035db8089d16 assets/create/models/block/small_deepslate_brick_slab_top.json 91e00675337592d17a04032808ca64c4a159c814 assets/create/models/block/small_deepslate_brick_stairs.json 39e78262242637628628a07dc47908fb1593d3f2 assets/create/models/block/small_deepslate_brick_stairs_inner.json d7a61bc4c84070e0fd53e0957a5282078daff7f1 assets/create/models/block/small_deepslate_brick_stairs_outer.json -cd855b25c38be2c36dcbf6ab0d963a2c76043171 assets/create/models/block/small_deepslate_bricks.json -88a6c43f64c6d53b34719f41707622635108342b assets/create/models/block/small_deepslate_bricks_wall_post.json -dea1773ca9baf9e1a6a7a4288d348127b858c42d assets/create/models/block/small_deepslate_bricks_wall_side.json -673ab543b38a597fd74285cd25b8004c9e2bd706 assets/create/models/block/small_deepslate_bricks_wall_side_tall.json +73e801fb607d76b42e1862323e9d149910a68298 assets/create/models/block/small_diorite_bricks.json +2bdb593d3ae4d856e96cc877f4927da25841af54 assets/create/models/block/small_diorite_bricks_wall_post.json +dd064be7962a2418784a513725fc7b5835e4ab40 assets/create/models/block/small_diorite_bricks_wall_side.json +3753c64785d74f1997b9f8f856fa873302621f39 assets/create/models/block/small_diorite_bricks_wall_side_tall.json 59fc1d9dac0b6867779346413953174fc6b55d3c assets/create/models/block/small_diorite_brick_slab.json cbd6fe711e1203aa746d86d12bb85016b7142749 assets/create/models/block/small_diorite_brick_slab_top.json a6c823fa96ba8a06d101ca96a6898fe8a1faf83e assets/create/models/block/small_diorite_brick_stairs.json 7f128501d989122df9d2ab002a497356831caa1c assets/create/models/block/small_diorite_brick_stairs_inner.json 26222975b0efb2acea6473d0bcc99453aa9ed561 assets/create/models/block/small_diorite_brick_stairs_outer.json -73e801fb607d76b42e1862323e9d149910a68298 assets/create/models/block/small_diorite_bricks.json -2bdb593d3ae4d856e96cc877f4927da25841af54 assets/create/models/block/small_diorite_bricks_wall_post.json -dd064be7962a2418784a513725fc7b5835e4ab40 assets/create/models/block/small_diorite_bricks_wall_side.json -3753c64785d74f1997b9f8f856fa873302621f39 assets/create/models/block/small_diorite_bricks_wall_side_tall.json +7f55f9c8cae6a79a9ab22a4b593a2c5829390573 assets/create/models/block/small_dripstone_bricks.json +fd0880b2e55435c8dc6945fa71c67ba34d7b1e69 assets/create/models/block/small_dripstone_bricks_wall_post.json +c00e9c0bfb108b70975514694f38d3c4cd63e819 assets/create/models/block/small_dripstone_bricks_wall_side.json +26382c01766e04cfe7ea585cabc1baa1c409e0a0 assets/create/models/block/small_dripstone_bricks_wall_side_tall.json 7b18bb56d4509f490a73b2812a8e40333f400369 assets/create/models/block/small_dripstone_brick_slab.json 39b7aa7d1494e5328e8774acb8adec8a346e972f assets/create/models/block/small_dripstone_brick_slab_top.json 3d265aed7a723713d525d0fabf3a70600d9d60e4 assets/create/models/block/small_dripstone_brick_stairs.json 2be41e9c1367af7f0eb99856e35900df96974bd4 assets/create/models/block/small_dripstone_brick_stairs_inner.json 4026a9327d47d55218b00b0b4b92464b6448ad91 assets/create/models/block/small_dripstone_brick_stairs_outer.json -7f55f9c8cae6a79a9ab22a4b593a2c5829390573 assets/create/models/block/small_dripstone_bricks.json -fd0880b2e55435c8dc6945fa71c67ba34d7b1e69 assets/create/models/block/small_dripstone_bricks_wall_post.json -c00e9c0bfb108b70975514694f38d3c4cd63e819 assets/create/models/block/small_dripstone_bricks_wall_side.json -26382c01766e04cfe7ea585cabc1baa1c409e0a0 assets/create/models/block/small_dripstone_bricks_wall_side_tall.json +ad4cf29e0e67d0d202d5836486531551909c71bf assets/create/models/block/small_granite_bricks.json +d20963cbb5d2321a069bf42d203855a5584f8607 assets/create/models/block/small_granite_bricks_wall_post.json +b860879b66d2d23349fa95ff644d9eba21eb29bd assets/create/models/block/small_granite_bricks_wall_side.json +11593a2a0e307b3e1d847c84d8c61bc78fef2967 assets/create/models/block/small_granite_bricks_wall_side_tall.json cb0a72cedb6b2b043eaf8c8869648802d74a2eeb assets/create/models/block/small_granite_brick_slab.json d635840492541787d55cc005c7e207532edcdef3 assets/create/models/block/small_granite_brick_slab_top.json ba9bfedf5854fccaba8a5e60c26efb6e34ede3cd assets/create/models/block/small_granite_brick_stairs.json 9bebe59176e74926e28a139dc557c25283285e89 assets/create/models/block/small_granite_brick_stairs_inner.json 15d71900e76c131285447628e63bf1479ce7025a assets/create/models/block/small_granite_brick_stairs_outer.json -ad4cf29e0e67d0d202d5836486531551909c71bf assets/create/models/block/small_granite_bricks.json -d20963cbb5d2321a069bf42d203855a5584f8607 assets/create/models/block/small_granite_bricks_wall_post.json -b860879b66d2d23349fa95ff644d9eba21eb29bd assets/create/models/block/small_granite_bricks_wall_side.json -11593a2a0e307b3e1d847c84d8c61bc78fef2967 assets/create/models/block/small_granite_bricks_wall_side_tall.json +6224f2763224d3e746dafdaaf14fae68e2469b93 assets/create/models/block/small_limestone_bricks.json +ca038e240e4157897a6273692db2c952ab5b17d7 assets/create/models/block/small_limestone_bricks_wall_post.json +7920f8cfda77b22d4d29638faa6ae07d89e51ab3 assets/create/models/block/small_limestone_bricks_wall_side.json +6e1fa27744f4592111945e5cafee6d7d67b5299b assets/create/models/block/small_limestone_bricks_wall_side_tall.json 0e0f551bac87421e6b693aa9ca98fd5da2ee168b assets/create/models/block/small_limestone_brick_slab.json 6669c1e87ed79097f96e7e46eecf3ab6e7c9778c assets/create/models/block/small_limestone_brick_slab_top.json 5aff0145d2fc89549ac541db325dda25b8941583 assets/create/models/block/small_limestone_brick_stairs.json 250aa2c237a9532b19621fa604027433183961c3 assets/create/models/block/small_limestone_brick_stairs_inner.json 92da57d330e9905d017705dd931af1d1d6c1a00d assets/create/models/block/small_limestone_brick_stairs_outer.json -6224f2763224d3e746dafdaaf14fae68e2469b93 assets/create/models/block/small_limestone_bricks.json -ca038e240e4157897a6273692db2c952ab5b17d7 assets/create/models/block/small_limestone_bricks_wall_post.json -7920f8cfda77b22d4d29638faa6ae07d89e51ab3 assets/create/models/block/small_limestone_bricks_wall_side.json -6e1fa27744f4592111945e5cafee6d7d67b5299b assets/create/models/block/small_limestone_bricks_wall_side_tall.json +242e4f39f6df26917f21899f0c7d0415a166d4b9 assets/create/models/block/small_ochrum_bricks.json +06cb9faca0062947c08b2a7309a958aac5ab24ac assets/create/models/block/small_ochrum_bricks_wall_post.json +8d9d53206e222839333026c779b66b9fd8cf2cf9 assets/create/models/block/small_ochrum_bricks_wall_side.json +f412fbaa509f7b2d47a27d4bcb13590bfcae74ca assets/create/models/block/small_ochrum_bricks_wall_side_tall.json 517e3605a9e86a07c673e18d94c2c37109a2aef5 assets/create/models/block/small_ochrum_brick_slab.json 855ad9f6fe03ceb2cc33d9df3536cb4394acfa9b assets/create/models/block/small_ochrum_brick_slab_top.json c5fc35d6b0fe96c11537bc10d34a63ef80f3270c assets/create/models/block/small_ochrum_brick_stairs.json 9a2631d9f6821d2c01bc8b2588a69702d3b083cc assets/create/models/block/small_ochrum_brick_stairs_inner.json 1f0ccdef29dae18535ea304e954e06c91bb0620b assets/create/models/block/small_ochrum_brick_stairs_outer.json -242e4f39f6df26917f21899f0c7d0415a166d4b9 assets/create/models/block/small_ochrum_bricks.json -06cb9faca0062947c08b2a7309a958aac5ab24ac assets/create/models/block/small_ochrum_bricks_wall_post.json -8d9d53206e222839333026c779b66b9fd8cf2cf9 assets/create/models/block/small_ochrum_bricks_wall_side.json -f412fbaa509f7b2d47a27d4bcb13590bfcae74ca assets/create/models/block/small_ochrum_bricks_wall_side_tall.json be96f070be1f838c6fb442c164b5f9b4e5cfcee5 assets/create/models/block/small_rose_quartz_tiles.json +41e56d8e334b81a0d5270bdbe87617981e1f98b4 assets/create/models/block/small_scorchia_bricks.json +56aa81e05019533ce0e0f1ee3ef7bf20fcc400b4 assets/create/models/block/small_scorchia_bricks_wall_post.json +1e1fa90c8b144813770c4d53a3b734ae450895d6 assets/create/models/block/small_scorchia_bricks_wall_side.json +6a46cf73c03a2abea25a81dbb28f4150b355900c assets/create/models/block/small_scorchia_bricks_wall_side_tall.json 6aa3825ace2e73bec454aaa8597e3a892ee29eb7 assets/create/models/block/small_scorchia_brick_slab.json f0378625001171c449a403e372e59623f0fc6569 assets/create/models/block/small_scorchia_brick_slab_top.json 49fa4a3940f84902319df257d39812eb71c8a9e2 assets/create/models/block/small_scorchia_brick_stairs.json 4dee6e6dbe6a98a8eaa04f6812f322343f62fca1 assets/create/models/block/small_scorchia_brick_stairs_inner.json 8a19e7e5c03c155c9ef9332486ae0b069dea0502 assets/create/models/block/small_scorchia_brick_stairs_outer.json -41e56d8e334b81a0d5270bdbe87617981e1f98b4 assets/create/models/block/small_scorchia_bricks.json -56aa81e05019533ce0e0f1ee3ef7bf20fcc400b4 assets/create/models/block/small_scorchia_bricks_wall_post.json -1e1fa90c8b144813770c4d53a3b734ae450895d6 assets/create/models/block/small_scorchia_bricks_wall_side.json -6a46cf73c03a2abea25a81dbb28f4150b355900c assets/create/models/block/small_scorchia_bricks_wall_side_tall.json +6b435123d852579ba8467c4915cd5d0adaadeca0 assets/create/models/block/small_scoria_bricks.json +86b243074845ca66916ce96ef3774862cf9a39d4 assets/create/models/block/small_scoria_bricks_wall_post.json +57ccb3efbdc4a69cad60c8b90321338ba2e68321 assets/create/models/block/small_scoria_bricks_wall_side.json +d4c5398e10b25d2dc3cb3754a449fc2b60e4074f assets/create/models/block/small_scoria_bricks_wall_side_tall.json 918351c1270c26932c0c4783543779a25ca7e986 assets/create/models/block/small_scoria_brick_slab.json 4138e756b4b36f227e178acbcc233edb082ae603 assets/create/models/block/small_scoria_brick_slab_top.json b8e70cd7d9acdcf91be9783cd91d70275a006ea2 assets/create/models/block/small_scoria_brick_stairs.json 625bfbd58440ea4e270d57cc748f2b5f6cece63b assets/create/models/block/small_scoria_brick_stairs_inner.json 602a46fb2736acb8c50b0d04222e6c33e52dee87 assets/create/models/block/small_scoria_brick_stairs_outer.json -6b435123d852579ba8467c4915cd5d0adaadeca0 assets/create/models/block/small_scoria_bricks.json -86b243074845ca66916ce96ef3774862cf9a39d4 assets/create/models/block/small_scoria_bricks_wall_post.json -57ccb3efbdc4a69cad60c8b90321338ba2e68321 assets/create/models/block/small_scoria_bricks_wall_side.json -d4c5398e10b25d2dc3cb3754a449fc2b60e4074f assets/create/models/block/small_scoria_bricks_wall_side_tall.json +a8e8c633dfb6d9f14425b1fd28e88ecf08a88cc6 assets/create/models/block/small_tuff_bricks.json +1c3a22bed504cd7a7e507e83ee21399f8a3fb299 assets/create/models/block/small_tuff_bricks_wall_post.json +1aeb8cac7d0178a18ac1cf98c9a45ca8e67514b0 assets/create/models/block/small_tuff_bricks_wall_side.json +4c6b5c7c60ec4cad314064b171413a3e866e5f99 assets/create/models/block/small_tuff_bricks_wall_side_tall.json 6b2c4d8c8609de0d3d6ce1e30b1dd26ba59cb86d assets/create/models/block/small_tuff_brick_slab.json 1ba07367fcba6a3914f1703115304a7c19979542 assets/create/models/block/small_tuff_brick_slab_top.json 1a5ab239d0f2f041ee04005ceb60111e6848f5de assets/create/models/block/small_tuff_brick_stairs.json be3ee2c36f85a534a71d42a7d63a7816945b3c30 assets/create/models/block/small_tuff_brick_stairs_inner.json aa84e448041d5f74c75565f5e409b1e9b7e5155d assets/create/models/block/small_tuff_brick_stairs_outer.json -a8e8c633dfb6d9f14425b1fd28e88ecf08a88cc6 assets/create/models/block/small_tuff_bricks.json -1c3a22bed504cd7a7e507e83ee21399f8a3fb299 assets/create/models/block/small_tuff_bricks_wall_post.json -1aeb8cac7d0178a18ac1cf98c9a45ca8e67514b0 assets/create/models/block/small_tuff_bricks_wall_side.json -4c6b5c7c60ec4cad314064b171413a3e866e5f99 assets/create/models/block/small_tuff_bricks_wall_side_tall.json +e9c75f1b4b663dce09b0a2f8282e574839c19d06 assets/create/models/block/small_veridium_bricks.json +725f6d3dbcfb469cede6fb27a98c1f398f3f3c8c assets/create/models/block/small_veridium_bricks_wall_post.json +b33ee496d43e315a5bed5eaabfd553e361fec1a9 assets/create/models/block/small_veridium_bricks_wall_side.json +80e950f93def51d82a63848b1fb6ac11600ab1bf assets/create/models/block/small_veridium_bricks_wall_side_tall.json 30b150fe3cf9bdb6ee32cd6b0f51179b44be57d3 assets/create/models/block/small_veridium_brick_slab.json 2158dd9e71f6f60e5132105c68a41ad6e3927438 assets/create/models/block/small_veridium_brick_slab_top.json bbbfc8e3696945ed1f6c3afe73ae0745ff8deda1 assets/create/models/block/small_veridium_brick_stairs.json fc3a996b0ca01c2c09ad84b881c46e92918d084f assets/create/models/block/small_veridium_brick_stairs_inner.json e27a77984e8e28e6032f26bb010efcadfaeb5407 assets/create/models/block/small_veridium_brick_stairs_outer.json -e9c75f1b4b663dce09b0a2f8282e574839c19d06 assets/create/models/block/small_veridium_bricks.json -725f6d3dbcfb469cede6fb27a98c1f398f3f3c8c assets/create/models/block/small_veridium_bricks_wall_post.json -b33ee496d43e315a5bed5eaabfd553e361fec1a9 assets/create/models/block/small_veridium_bricks_wall_side.json -80e950f93def51d82a63848b1fb6ac11600ab1bf assets/create/models/block/small_veridium_bricks_wall_side_tall.json d7c1c2679c8ba543ae7be3b9cf3f4eea3c1a2f68 assets/create/models/block/spruce_window.json f4a4fbb9eea6fb1d0633e349eae6acdaf329e8d5 assets/create/models/block/spruce_window_pane_noside.json 02a25202a42debcd2b4aaa4113e3de4f8f6ee47c assets/create/models/block/spruce_window_pane_noside_alt.json @@ -1559,6 +1682,24 @@ e13aabf77b949a4eaf33c772e8b7112b1a7f1e72 assets/create/models/block/spruce_windo 9bf5008df74b7caea128580021605a6abcae6841 assets/create/models/block/steam_whistle/block_medium_wall_powered.json 92eba6564e2c65e08bc628107fbf89a5ff7ab53e assets/create/models/block/steam_whistle/block_small_floor_powered.json d768a02c31606cc46a4bbd619906e313099cce2d assets/create/models/block/steam_whistle/block_small_wall_powered.json +63d74987f8461b4e94c00030d380d4891707d2ae assets/create/models/block/threshold_switch/block_ceiling_0.json +12496e505374e7fff2d1f800218848635d86ec71 assets/create/models/block/threshold_switch/block_ceiling_1.json +523bc69211b6e90cc381356f103b01b8d7e15771 assets/create/models/block/threshold_switch/block_ceiling_2.json +c62cbd9fe144326c46702ba4e512c832484ea4e8 assets/create/models/block/threshold_switch/block_ceiling_3.json +fe1017b4338d3027771d5eb8b4e2444ddb842b36 assets/create/models/block/threshold_switch/block_ceiling_4.json +d090a659a8df0b86d9892214ac5b06641aaabc9a assets/create/models/block/threshold_switch/block_ceiling_5.json +dffc869ccce392b1908c833631e3df374c6a3012 assets/create/models/block/threshold_switch/block_floor_0.json +ab3d51ab5dd8ef6c1cad5d65406180915340dd7e assets/create/models/block/threshold_switch/block_floor_1.json +7a69fb5a6e77b457c381495c951aa0ba9c7df7f0 assets/create/models/block/threshold_switch/block_floor_2.json +3a6bbc80eea8d824a981e257f8025997946b3260 assets/create/models/block/threshold_switch/block_floor_3.json +a76fae0415604615be0e822394e0879ca81bf166 assets/create/models/block/threshold_switch/block_floor_4.json +28ddae97613f1a06885f06faa20b1b2a5bcaa7db assets/create/models/block/threshold_switch/block_floor_5.json +ab50d142c25c95b0865dd41176cc07a0c76109ac assets/create/models/block/threshold_switch/block_wall_0.json +be730f505bf937db4b3658b2bd3763b514d295c2 assets/create/models/block/threshold_switch/block_wall_1.json +f7f6d92ab5dea5a85ec3d570cdd169329dd4225f assets/create/models/block/threshold_switch/block_wall_2.json +41009d15d22c946a2ed4c6ba98447c3c7cc26315 assets/create/models/block/threshold_switch/block_wall_3.json +ad3204842128db2c7bebdbf3c40fccc45c82de44 assets/create/models/block/threshold_switch/block_wall_4.json +197a6ed7fd9514de13daf58605c24a7156c00bd1 assets/create/models/block/threshold_switch/block_wall_5.json 9e74256a37ee71de978395fb911e6e6db9fcc41e assets/create/models/block/tiled_glass.json 49c76af85635454ba3b6278f7317bb1729c4c58a assets/create/models/block/tiled_glass_pane_noside.json 4319255a3fcb0b9b60cba96273c513329a480a6b assets/create/models/block/tiled_glass_pane_noside_alt.json @@ -1595,74 +1736,90 @@ e84875a4eb11e2161a93ec7569aa2ac1c2f60cef assets/create/models/block/warped_windo 378c865ff8213ff56f1f7a4b2d9cf26c71f036e8 assets/create/models/block/warped_window_pane_post.json f320de08cb113a9ad17acd2ebb8dfc57759e4f7d assets/create/models/block/warped_window_pane_side.json 2fc182d9697b5cddd93b01d1236931af27eee8fe assets/create/models/block/warped_window_pane_side_alt.json +32fdb85b5b62d5a0fb41732874c854788cdd2ba1 assets/create/models/block/waxed_copper_shingles.json fb7fb6deebd502946ab57f1b8a9f4a6b5dd48da3 assets/create/models/block/waxed_copper_shingle_slab.json 660f61112b8e46dec5050cb0ed4ee936965a7c58 assets/create/models/block/waxed_copper_shingle_slab_top.json 5d74be967bbe9feba4b630751f13af817a733d1d assets/create/models/block/waxed_copper_shingle_stairs.json 35cb89f29ce3f8d8af13602c08ecd7afbb7cf56a assets/create/models/block/waxed_copper_shingle_stairs_inner.json fcb9295f4f388e6d439ec9a3906ca326b6d69077 assets/create/models/block/waxed_copper_shingle_stairs_outer.json -32fdb85b5b62d5a0fb41732874c854788cdd2ba1 assets/create/models/block/waxed_copper_shingles.json +32f06f39d0b34e4431795aa6e64f87e58dc1597b assets/create/models/block/waxed_copper_tiles.json 298c6100de02ed9f813397d8ba38c46f35035c69 assets/create/models/block/waxed_copper_tile_slab.json d4422c2d96fb329087d1be70d8b983a8cf6c7f01 assets/create/models/block/waxed_copper_tile_slab_top.json fca72048f916d3a3e567b385c948cc1b59711ef4 assets/create/models/block/waxed_copper_tile_stairs.json 997479b62ed3d81ab633279ecc2fabd9588a3bf3 assets/create/models/block/waxed_copper_tile_stairs_inner.json d5c5bbfb9aaa282e11ad6e6309b1880b172ee653 assets/create/models/block/waxed_copper_tile_stairs_outer.json -32f06f39d0b34e4431795aa6e64f87e58dc1597b assets/create/models/block/waxed_copper_tiles.json +19a773f91c58c49301f35965bac02d0c05fb2764 assets/create/models/block/waxed_exposed_copper_shingles.json a3420b91fdebec40e508a5eebb145c0201bd80c8 assets/create/models/block/waxed_exposed_copper_shingle_slab.json 4178ea5e50ee17b3c15f4a59efd019c4a19bb892 assets/create/models/block/waxed_exposed_copper_shingle_slab_top.json dd2d747774abc86e428a883e299db66cded78e11 assets/create/models/block/waxed_exposed_copper_shingle_stairs.json b6845da62d96a33cee624bb70360e256b26eda83 assets/create/models/block/waxed_exposed_copper_shingle_stairs_inner.json 3d8b758e50e75c5adc26ab6f39f9d73f00866673 assets/create/models/block/waxed_exposed_copper_shingle_stairs_outer.json -19a773f91c58c49301f35965bac02d0c05fb2764 assets/create/models/block/waxed_exposed_copper_shingles.json +9cb20c9d41629d8b9426cb65829365d10966338f assets/create/models/block/waxed_exposed_copper_tiles.json cd21d9d2935b6d0103502e2731c11ea27ff64ecf assets/create/models/block/waxed_exposed_copper_tile_slab.json 0ec039ba59fb0028183433e52131ff355ace5bff assets/create/models/block/waxed_exposed_copper_tile_slab_top.json c51dbd34996ac4513234800e427ac308067d5e1d assets/create/models/block/waxed_exposed_copper_tile_stairs.json 68772d4352dc7ade995dfa57ba41a38ef819e855 assets/create/models/block/waxed_exposed_copper_tile_stairs_inner.json d932671822ba93b71a9c8b50e7207803a1c4dbab assets/create/models/block/waxed_exposed_copper_tile_stairs_outer.json -9cb20c9d41629d8b9426cb65829365d10966338f assets/create/models/block/waxed_exposed_copper_tiles.json +561beafce41b9e9c0b07bc6b7176dd4f6918c116 assets/create/models/block/waxed_oxidized_copper_shingles.json 7e0bab8109e322c6db5fe1d5999c06536c21c6eb assets/create/models/block/waxed_oxidized_copper_shingle_slab.json 42df32c4e2d1ffb2ee62748becfd1717118b440c assets/create/models/block/waxed_oxidized_copper_shingle_slab_top.json b55a733e3e68cfbd08d45bb9ac56deef9f728b60 assets/create/models/block/waxed_oxidized_copper_shingle_stairs.json 7b8745213af5aa7938fc04a295be6a087c72daa8 assets/create/models/block/waxed_oxidized_copper_shingle_stairs_inner.json d89419d48d6ee2f6747e7c93de8699db22ea3f59 assets/create/models/block/waxed_oxidized_copper_shingle_stairs_outer.json -561beafce41b9e9c0b07bc6b7176dd4f6918c116 assets/create/models/block/waxed_oxidized_copper_shingles.json +5cf92b628ff1f832966138a58ed87d747681274c assets/create/models/block/waxed_oxidized_copper_tiles.json ad6134598869711a12e2f95c9b5f25a0f7b8dd93 assets/create/models/block/waxed_oxidized_copper_tile_slab.json c17bac0fd6a20540813c6a1c000a553b7c5ac849 assets/create/models/block/waxed_oxidized_copper_tile_slab_top.json d5b30340364f5536e46bc67e777ef4fa20a36e04 assets/create/models/block/waxed_oxidized_copper_tile_stairs.json b40b315c23cbd3eb4658518bfac836f6091321a5 assets/create/models/block/waxed_oxidized_copper_tile_stairs_inner.json f4eaadab29b4f2e915237340e2d6f4aad4ba21d6 assets/create/models/block/waxed_oxidized_copper_tile_stairs_outer.json -5cf92b628ff1f832966138a58ed87d747681274c assets/create/models/block/waxed_oxidized_copper_tiles.json +9c73020e80c31cd710c218f9699ba9a795758ad0 assets/create/models/block/waxed_weathered_copper_shingles.json 897cfc177b073ca1bcb635c74108567f8748b5c4 assets/create/models/block/waxed_weathered_copper_shingle_slab.json efa57ba131c27e0064c0d958e69b10530a26ac41 assets/create/models/block/waxed_weathered_copper_shingle_slab_top.json 4ef11a7e3de630ad46b9179e8a9a34d55202f6c5 assets/create/models/block/waxed_weathered_copper_shingle_stairs.json f32a18c76cfaca2153f6321880a8da1347be37ce assets/create/models/block/waxed_weathered_copper_shingle_stairs_inner.json 9637f78e51ca7ed812e4c64c52e08f6fa0adbfc3 assets/create/models/block/waxed_weathered_copper_shingle_stairs_outer.json -9c73020e80c31cd710c218f9699ba9a795758ad0 assets/create/models/block/waxed_weathered_copper_shingles.json +9782a25341dd2ffb146430edbe6916932250c326 assets/create/models/block/waxed_weathered_copper_tiles.json 0c9669588972d4c2152bd2b043b8386b76a6e1c4 assets/create/models/block/waxed_weathered_copper_tile_slab.json 2d01a583cc948e9e0cb814cad968ed16a07dd46c assets/create/models/block/waxed_weathered_copper_tile_slab_top.json e26dd64495ff8801593e9c22203cbf364075badd assets/create/models/block/waxed_weathered_copper_tile_stairs.json b658c1022587bd670b5acee267607719c1544332 assets/create/models/block/waxed_weathered_copper_tile_stairs_inner.json e7ae89577be9d26a071bf96cbd7ed80293902b63 assets/create/models/block/waxed_weathered_copper_tile_stairs_outer.json -9782a25341dd2ffb146430edbe6916932250c326 assets/create/models/block/waxed_weathered_copper_tiles.json +9c73020e80c31cd710c218f9699ba9a795758ad0 assets/create/models/block/weathered_copper_shingles.json 897cfc177b073ca1bcb635c74108567f8748b5c4 assets/create/models/block/weathered_copper_shingle_slab.json efa57ba131c27e0064c0d958e69b10530a26ac41 assets/create/models/block/weathered_copper_shingle_slab_top.json 4ef11a7e3de630ad46b9179e8a9a34d55202f6c5 assets/create/models/block/weathered_copper_shingle_stairs.json f32a18c76cfaca2153f6321880a8da1347be37ce assets/create/models/block/weathered_copper_shingle_stairs_inner.json 9637f78e51ca7ed812e4c64c52e08f6fa0adbfc3 assets/create/models/block/weathered_copper_shingle_stairs_outer.json -9c73020e80c31cd710c218f9699ba9a795758ad0 assets/create/models/block/weathered_copper_shingles.json +9782a25341dd2ffb146430edbe6916932250c326 assets/create/models/block/weathered_copper_tiles.json 0c9669588972d4c2152bd2b043b8386b76a6e1c4 assets/create/models/block/weathered_copper_tile_slab.json 2d01a583cc948e9e0cb814cad968ed16a07dd46c assets/create/models/block/weathered_copper_tile_slab_top.json e26dd64495ff8801593e9c22203cbf364075badd assets/create/models/block/weathered_copper_tile_stairs.json b658c1022587bd670b5acee267607719c1544332 assets/create/models/block/weathered_copper_tile_stairs_inner.json e7ae89577be9d26a071bf96cbd7ed80293902b63 assets/create/models/block/weathered_copper_tile_stairs_outer.json -9782a25341dd2ffb146430edbe6916932250c326 assets/create/models/block/weathered_copper_tiles.json +045b812ddb1ca8dd6cd9b49852ddbd37f86cd2a6 assets/create/models/block/weathered_iron_block.json +a569ddd725898a86f8745e46723edeff7fe7f2e9 assets/create/models/block/weathered_iron_window_1.json +133928d853037efb81022b69377669f0b16239bc assets/create/models/block/weathered_iron_window_2.json +06b0109b8dd43f433de00ff271042b416be7d86c assets/create/models/block/weathered_iron_window_3.json +f7199168a6ac364a03c52dd186bf8a3ec79954e4 assets/create/models/block/weathered_iron_window_4.json +847adaa7197d84669d4c69146595980f179f44e7 assets/create/models/block/weathered_iron_window_pane_noside.json +c0f40f2f698ebc2f2a3affd8aa7520735debb577 assets/create/models/block/weathered_iron_window_pane_noside_alt.json +48a7646b44a34d9721311bbf489214a02ca5cf83 assets/create/models/block/weathered_iron_window_pane_post.json +f6d98f8518f48feb8faf5691ce1de02e9430eefa assets/create/models/block/weathered_iron_window_pane_side.json +94a6c852930e980640a5733536bac21b1c327d18 assets/create/models/block/weathered_iron_window_pane_side_alt.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/white_nixie_tube.json +998d838964c6c5bc2a1903b5098491abf5d819bc assets/create/models/block/white_postbox_closed.json +e89fe63260b94fc70e360eceb3d04b74242c248f assets/create/models/block/white_postbox_open.json 99f0628623a36ac1700a5876cec010ee6353162f assets/create/models/block/white_seat.json +29d6f3efddd06f6c9fd876aefb3f95043fc928e6 assets/create/models/block/white_table_cloth.json f252f8c68702a0c050797a2dc2a51c586408722d assets/create/models/block/white_toolbox.json c9e344a06ee8bca1bfddd70481198135cabafbce assets/create/models/block/white_valve_handle.json 68d8eddfb724c73938862fb1a213a99c95814fdb assets/create/models/block/windmill_bearing.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/yellow_nixie_tube.json +9abbd0af47396b1cb18362b423f497ddb40eede4 assets/create/models/block/yellow_postbox_closed.json +098b675ef5071a32bce387445da09067917852c7 assets/create/models/block/yellow_postbox_open.json cf8477d6c7558ceba38416fae755567086a856a6 assets/create/models/block/yellow_sail.json 07b68f0e4c617dfe3e935a1b9e8e020ab3131c0b assets/create/models/block/yellow_seat.json +199a767acb9a27b5fead0870c00068f3f5602bc4 assets/create/models/block/yellow_table_cloth.json 21bb6e0b43984214c496e531e16dd60aeb619a42 assets/create/models/block/yellow_toolbox.json 467109ede866fb030d2cdc46c832643630d982b5 assets/create/models/block/yellow_valve_handle.json 23d6852eca1bf1480dc74ed51d15c098e26a520f assets/create/models/block/zinc_block.json @@ -1683,24 +1840,32 @@ af792bb7d70029e66cc8aa21ed61322f899fb134 assets/create/models/item/andesite_enca 113fb6cb131bc3cdf63f558be71b8d77f9ae64c9 assets/create/models/item/andesite_ladder.json f187d676688c728804ab3758eb4b78a431c7ec21 assets/create/models/item/andesite_pillar.json d0dd86f6c7418c27c0f930cfd20e0867936eca3d assets/create/models/item/andesite_scaffolding.json +2ef7426efa3c2609e67d2eef73f6f84a1b13d46c assets/create/models/item/andesite_table_cloth.json d5375c3de6272a00f3e3787fee6b8255f828d686 assets/create/models/item/andesite_tunnel.json d6eb7105dd9b42adde48bd70e3f2fba70751c1db assets/create/models/item/asurine.json 8b61987c61ae461e4bea0fccf5b1bb3399ac9226 assets/create/models/item/asurine_pillar.json a8e9fab6ce8dc5da29b451c827663fb553669a23 assets/create/models/item/attribute_filter.json +2a57b4e07c5a853d4875fae7916cdb71f3b3f378 assets/create/models/item/bamboo_window.json +3baee1bf202692d9e14865b7ba1e2606f761774f assets/create/models/item/bamboo_window_pane.json 6913f9acbb272de28387918ce92984fa767b4389 assets/create/models/item/bar_of_chocolate.json def88cd2c79a1f0ed40bbf5a0332187dd1d6006e assets/create/models/item/basin.json 35a1e2cb2645a8386dfee2697b47547b3f9a1dd2 assets/create/models/item/belt_connector.json f5dcb9096a52d5d2eab1e4204fbd1222e0d5094d assets/create/models/item/birch_window.json 9589b0f3d31028c1499a49298600eede6d84f7bb assets/create/models/item/birch_window_pane.json +641b85751f91c0b4931307548c12034fc56286bc assets/create/models/item/black_postbox.json 7ca635d45fef81e6681a492be6c7bb71fd0f4574 assets/create/models/item/black_seat.json +67256e7c62c3ed2cee1dc88c2437083966165f92 assets/create/models/item/black_table_cloth.json e2dc1a8db84d84d592bfd91a26464343b8706bc0 assets/create/models/item/black_toolbox.json 20fbeb136e85d146c0e041f7f1570b1d1fd34585 assets/create/models/item/black_valve_handle.json c31038397821b6abe296d2799aa81edf3c12d095 assets/create/models/item/blaze_burner.json 9d28754112688323a6b55ecb6742e918eabfd6a3 assets/create/models/item/blaze_cake.json 01637416bb932d861e9c9b10b256b2fdf4c96d44 assets/create/models/item/blaze_cake_base.json +ef453775edb9342dc68e0e4ed7aa2e845b819fa6 assets/create/models/item/blue_postbox.json de8beb7ef521822eb9b2826806baf1fa3344a45d assets/create/models/item/blue_seat.json +b1059dd00b8b4102e345a3d4f3e903a92c372ea1 assets/create/models/item/blue_table_cloth.json a82bc56a503cd15d2354c86a49fc6d1d4ed22767 assets/create/models/item/blue_toolbox.json 2f90f781cd9b5d144a6cfd4748ae3a87c9f12ba8 assets/create/models/item/blue_valve_handle.json +d16ce54ed4e2546f168d3bcf7d748ff749565316 assets/create/models/item/bound_cardboard_block.json 8facd82128e77ed41de3bb92d7714e56fc58ada6 assets/create/models/item/brass_bars.json 136f97f26217c51c932d79bf715b2a1a92e6595e assets/create/models/item/brass_block.json c876713c3b8ed6511679d1e3186e6d6031190dd5 assets/create/models/item/brass_casing.json @@ -1715,13 +1880,70 @@ a51a28424e75dbd11c845f455c778d4c578b9da4 assets/create/models/item/brass_ladder. 55208677f9135c3ca897c2432caa332bb1b858f2 assets/create/models/item/brass_nugget.json af97ba84be90381e2cc9434e31e2199c2e7e3aa6 assets/create/models/item/brass_scaffolding.json b78e9274156f5027a9a3b6fb7725c57a7aecc8bb assets/create/models/item/brass_sheet.json +7085ab446db5fa59aafe9bbba41c0e0f43bf749a assets/create/models/item/brass_table_cloth.json 28e104d5041c1f4676704c0f6b4e2e80aac43106 assets/create/models/item/brass_tunnel.json +35c8539a0b2f927e65a43c3a2c3cb82db429c2eb assets/create/models/item/brown_postbox.json fce64539b36fc8a5ffa39d7a3f73765818437cbf assets/create/models/item/brown_seat.json +a126a50454ea449e66c6f6e36eb96bff96652c92 assets/create/models/item/brown_table_cloth.json 90c1ec317beed0b5735c8731e3115a695b7060f7 assets/create/models/item/brown_toolbox.json 9477ab491586f1314bebf4d58387425ae56d0bad assets/create/models/item/brown_valve_handle.json 1db479848369140bb913ba09f3f1d994e4ac864c assets/create/models/item/builders_tea.json f5ff4e2ed2ea2e43b6d02f6a95ba02b2e4b611dc assets/create/models/item/calcite_pillar.json +cc2692f7964f4266ecf00fcab176b1ef0b78673f assets/create/models/item/cardboard.json +607272f2b906fdffd46677d47a4e6ecb94184eff assets/create/models/item/cardboard_block.json +70ab4eb53188efef1a157823ce90e5fd09e35d3c assets/create/models/item/cardboard_boots.json +5c67ce75ffe3f5c9a32877ffdb4005b2a44d6483 assets/create/models/item/cardboard_boots_amethyst_trim.json +2027e70e42e1c931537e591c51b1f2d1aed6833c assets/create/models/item/cardboard_boots_copper_trim.json +881e17e4d8b2be53403833ee262a7a17040695bd assets/create/models/item/cardboard_boots_diamond_trim.json +ae9617e768f8a711d932a5137bd7946c7bb1fbe3 assets/create/models/item/cardboard_boots_emerald_trim.json +62dbafe3a1493be7d46270168e57ff1f866bc669 assets/create/models/item/cardboard_boots_gold_trim.json +dcdc125780505d55bf76302fe982b23083c08845 assets/create/models/item/cardboard_boots_iron_trim.json +86a5435fcf899530bd1caa3fdf83e1dee337f22d assets/create/models/item/cardboard_boots_lapis_trim.json +527602bacf19e6ddb40023e1ad9fd532d96699ed assets/create/models/item/cardboard_boots_netherite_trim.json +bf4ec4f542e5d96ca9b6b90e298526acaa8cb8b9 assets/create/models/item/cardboard_boots_quartz_trim.json +d0a89aae893a45b14173f2f104dc0bb72d14516e assets/create/models/item/cardboard_boots_redstone_trim.json +169470769f90bb6fa0e503c78d8dde4bf63c0e7f assets/create/models/item/cardboard_chestplate.json +37ba0d5584aabd317e984d46e2e56622c10c74d0 assets/create/models/item/cardboard_chestplate_amethyst_trim.json +e50df07949d1a0a7e54e5b1635827adf8c250583 assets/create/models/item/cardboard_chestplate_copper_trim.json +1b82a900bb783a55a32d308fbec4c103981ca0ea assets/create/models/item/cardboard_chestplate_diamond_trim.json +90f5afe6a3e8292a37814ae6b8d1ca78bf1279b7 assets/create/models/item/cardboard_chestplate_emerald_trim.json +84ac8525c149e6f630fa02ca53d1e0a0b5f55b3e assets/create/models/item/cardboard_chestplate_gold_trim.json +6327a6514a3c19e9faf31c5388103e1e8cc7d01c assets/create/models/item/cardboard_chestplate_iron_trim.json +0df84176624b1cb081f8bff881156fbe530fda43 assets/create/models/item/cardboard_chestplate_lapis_trim.json +f27591c2befb21f6aa944bd2f54e7c4f58833917 assets/create/models/item/cardboard_chestplate_netherite_trim.json +3ace2f1c1a773d5d9d2b4f3d6c93f742d9bd971d assets/create/models/item/cardboard_chestplate_quartz_trim.json +9e74713fbdc8d90697f264562316f991de51d49e assets/create/models/item/cardboard_chestplate_redstone_trim.json +0b46dc6ac222fcf998100f1656047058fb8ef1ee assets/create/models/item/cardboard_helmet.json +61fad07fcc7da51ed9806938c7c1d930481015d2 assets/create/models/item/cardboard_helmet_amethyst_trim.json +c185e1b969ffb78df3d956a5907486a5abe81d55 assets/create/models/item/cardboard_helmet_copper_trim.json +b5ecea23091e2fa7d0b004a73a210ec4cf970035 assets/create/models/item/cardboard_helmet_diamond_trim.json +1b908f938a492f1faddf7f47e44f99dd0e0cc700 assets/create/models/item/cardboard_helmet_emerald_trim.json +f7096241733b0623eade076fcc536c0a3dd9f252 assets/create/models/item/cardboard_helmet_gold_trim.json +079c0ea69a5c8a7d1bb2e1bdd23ccc9c92e036d5 assets/create/models/item/cardboard_helmet_iron_trim.json +4db478f4669c26edef502b87be277be314933cab assets/create/models/item/cardboard_helmet_lapis_trim.json +ab46809613299865e33dcca39df597a239174df8 assets/create/models/item/cardboard_helmet_netherite_trim.json +03d4eb863c7b4cfc60a81b270a569440f0c62c85 assets/create/models/item/cardboard_helmet_quartz_trim.json +2703a1c5c65fe5c74c03bfe8ab6acfc4e5849cf9 assets/create/models/item/cardboard_helmet_redstone_trim.json +9987b29466b2a83ef25c66f51086b26ccd2c5a5b assets/create/models/item/cardboard_leggings.json +6a98f395678073c3ec0c09556b38cc9ac9e63492 assets/create/models/item/cardboard_leggings_amethyst_trim.json +5e932da44be1022af8c97061caca61a97c99b6d6 assets/create/models/item/cardboard_leggings_copper_trim.json +e010c6af3e4c3c5cba26491c84c2c73c3c9386c7 assets/create/models/item/cardboard_leggings_diamond_trim.json +6f7a3ed21abf915f5803922db3a15fb6210162c6 assets/create/models/item/cardboard_leggings_emerald_trim.json +8176633be5a2ea548fa39df1d875a29851a7b091 assets/create/models/item/cardboard_leggings_gold_trim.json +56254db2e5432386b4de1ab00603f72255a8aa61 assets/create/models/item/cardboard_leggings_iron_trim.json +ca37276063d58483994ab51e3f72ef20521902c2 assets/create/models/item/cardboard_leggings_lapis_trim.json +55dfc8af30c392b0a70390d90c4239aba011d0ac assets/create/models/item/cardboard_leggings_netherite_trim.json +3f7d0d84790570dd92bb83071d6ecfddadce047d assets/create/models/item/cardboard_leggings_quartz_trim.json +47963712e6a470c5d14d7ea1bc8fff2a0553267b assets/create/models/item/cardboard_leggings_redstone_trim.json +123f7b8f5129e07beead05846744ff06161ec7a1 assets/create/models/item/cardboard_package_10x12.json +4f22bc19ebf19be0efc32b5d2fe449349e6f5b2f assets/create/models/item/cardboard_package_10x8.json +599d305569d025d8771993d0b56a377f910e2a95 assets/create/models/item/cardboard_package_12x10.json +563720f20bee58dfc5b2c628cd037f7b6daf6a34 assets/create/models/item/cardboard_package_12x12.json +9dccb21720687bbd516c8598c5449028077f8467 assets/create/models/item/cardboard_sword.json 1cdb2b8801551c1540bb9b2a9cc3d725a2b433e7 assets/create/models/item/cart_assembler.json +390a06d81c8c2a0ff83196bd0154dd292206e3b6 assets/create/models/item/chain_conveyor.json +74c265b6ea2df76ae1b2e8e920eaa91749f74c1a assets/create/models/item/cherry_window.json +7aecdbca8bc44bdf9a6926889bdbf4e74c4407a7 assets/create/models/item/cherry_window_pane.json a197d08618f4035182c91a6b16031eb681ab8a7c assets/create/models/item/chest_minecart_contraption.json 293cfa8b1073f8641a2c623b73a90907576c36ed assets/create/models/item/chocolate_bucket.json 77654cbd16cdfa95181ea3f85fcfa3cd352b69fd assets/create/models/item/chocolate_glazed_berries.json @@ -1749,12 +1971,13 @@ aaac7663d062731433c920d94a24b9b3a521dd8c assets/create/models/item/copper_bars.j ccdf08652511e5737a8489d86ea9422ade4f4ca5 assets/create/models/item/copper_nugget.json 86a770e9b2af1f19bf633f5cfeecd84848f73fbd assets/create/models/item/copper_scaffolding.json a4fd2f4f00e03b2ac5d863e93827d39a984cc2ff assets/create/models/item/copper_sheet.json +13b18ba2938e283d507fbca70518cf52198cdc71 assets/create/models/item/copper_shingles.json 79d9f8667965072f12e51e6601b5c36f8acc125f assets/create/models/item/copper_shingle_slab.json 9fe6f0bdea4595b403ed2d2cbc2023a9abeb79f0 assets/create/models/item/copper_shingle_stairs.json -13b18ba2938e283d507fbca70518cf52198cdc71 assets/create/models/item/copper_shingles.json +9a33eeb0f7c682ee2f8c0abbfa174f8828acc2b5 assets/create/models/item/copper_table_cloth.json +19642e4ea5deecaf57059827c4c13a19d2e73822 assets/create/models/item/copper_tiles.json a7147444fc28a4cce21b6cf38e9528537e27c352 assets/create/models/item/copper_tile_slab.json 7330324d6c64f0340d676ecef83a930515d9130e assets/create/models/item/copper_tile_stairs.json -19642e4ea5deecaf57059827c4c13a19d2e73822 assets/create/models/item/copper_tiles.json 08c35e85afe4eb2b106133c5d9c7d7c64ca9a915 assets/create/models/item/copper_valve_handle.json 5cec229a3117ea5987aa42288c070427ac48a5dc assets/create/models/item/copycat_panel.json 1b6707005830ca066a7e997c73391ca88c70bdb0 assets/create/models/item/copycat_step.json @@ -1784,118 +2007,120 @@ b6acd86be9e6cac8b9ed2bc6297d27941ca05f46 assets/create/models/item/crushed_raw_z b67e95801010eab58de02f2b0160bff3f008bd18 assets/create/models/item/crushing_wheel.json af189b0c04482064520d84546d81af8154824292 assets/create/models/item/cuckoo_clock.json 314fb287c7b16a6478fbefde0da80de8828b684e assets/create/models/item/cut_andesite.json +e2840073eac2e6419cd312b3d0177d4c64a5346c assets/create/models/item/cut_andesite_bricks.json 680fe77d50f7c3253ec4997f74761f962b784e15 assets/create/models/item/cut_andesite_brick_slab.json 3c1d56f9686bb2b97c168b0509ddfd06e80be9a0 assets/create/models/item/cut_andesite_brick_stairs.json 4222b965f8a18f78b92838e4642a28fa3e0ad648 assets/create/models/item/cut_andesite_brick_wall.json -e2840073eac2e6419cd312b3d0177d4c64a5346c assets/create/models/item/cut_andesite_bricks.json c100e02ef9b05f4f6df3ddbbfe91db1032d4854b assets/create/models/item/cut_andesite_slab.json f435a67b3d89d12b6e8cb5071a67e35f0918dc79 assets/create/models/item/cut_andesite_stairs.json df9084d532a085220280bc7bee579e1079fbf786 assets/create/models/item/cut_andesite_wall.json 025eedca45b222b91d93b9a3a89fac5ad328b152 assets/create/models/item/cut_asurine.json +1ceb483f428448f00a08541fbcf4f4787aef3f1e assets/create/models/item/cut_asurine_bricks.json 022c56e7aafa7ca4cdd1a88426eb43f9e02c3cc2 assets/create/models/item/cut_asurine_brick_slab.json 3131e09a221c2f0a17cfc7277603f2e3c8164bc7 assets/create/models/item/cut_asurine_brick_stairs.json dc1f5f03acc1165606c48df97953164f6bd7f092 assets/create/models/item/cut_asurine_brick_wall.json -1ceb483f428448f00a08541fbcf4f4787aef3f1e assets/create/models/item/cut_asurine_bricks.json e81d7df1f1b8281c38400713b09cbac59c4d53cc assets/create/models/item/cut_asurine_slab.json cf534603fe71423e0ab80d431ab12394d0a6bb21 assets/create/models/item/cut_asurine_stairs.json 7ca803f5a7798ea034db6385a5f36a48e235c247 assets/create/models/item/cut_asurine_wall.json 707fb799ca44280cad0b817f29a7c75dd0f0ce5e assets/create/models/item/cut_calcite.json +5678b9f76823efac2c6624acc7b2b911402112f4 assets/create/models/item/cut_calcite_bricks.json f794423b242228c43345dc1f40653133fb7f3db6 assets/create/models/item/cut_calcite_brick_slab.json 8e9b46e52758ec7f21c3b84c212e2f6565bf71d9 assets/create/models/item/cut_calcite_brick_stairs.json 1447d21b7fc331528bfd15e5b9d694eb1a31cfb3 assets/create/models/item/cut_calcite_brick_wall.json -5678b9f76823efac2c6624acc7b2b911402112f4 assets/create/models/item/cut_calcite_bricks.json c78c99c78a19097d890414b21270014b52bafd8d assets/create/models/item/cut_calcite_slab.json e6a9144a4bb9e5af3f57d0acdb26d66dc4547217 assets/create/models/item/cut_calcite_stairs.json daf2a2513f6636d140c23b90ba87aad35476c498 assets/create/models/item/cut_calcite_wall.json 29f2bc72aa50cdf34d1d5bfd01a4512d5974dc65 assets/create/models/item/cut_crimsite.json +20bc810ca5b2a35a423e57f287e2f42ad9940b89 assets/create/models/item/cut_crimsite_bricks.json 7c37d3de9674e70595498d1c46c5693d9f39a502 assets/create/models/item/cut_crimsite_brick_slab.json b974c0f2f0e5119d9bac6a36946d4dfdd65b4b5f assets/create/models/item/cut_crimsite_brick_stairs.json c1289ddff572149b2171859689228615802dc825 assets/create/models/item/cut_crimsite_brick_wall.json -20bc810ca5b2a35a423e57f287e2f42ad9940b89 assets/create/models/item/cut_crimsite_bricks.json 8855eb44a68277668c77858715652d6851fa507f assets/create/models/item/cut_crimsite_slab.json 57101d3c2d570bc2c389c1e05e1354d79de70a0a assets/create/models/item/cut_crimsite_stairs.json a10cd65d675a05b9dfbdac67a2d9ca3b4381396a assets/create/models/item/cut_crimsite_wall.json a4ad900cf65136835c259c1e349781538d537a9c assets/create/models/item/cut_deepslate.json +81b10b5d159db4000f4f6569b83fc7e8f702f015 assets/create/models/item/cut_deepslate_bricks.json a63bbe474ca7d8ceafb6bfcb21a88841980fe8e6 assets/create/models/item/cut_deepslate_brick_slab.json 7c1ad49844eafbd87f8c69a077a8c18ccdd4a919 assets/create/models/item/cut_deepslate_brick_stairs.json 6a4ee2e810731e0702c1493237343a567cc736d6 assets/create/models/item/cut_deepslate_brick_wall.json -81b10b5d159db4000f4f6569b83fc7e8f702f015 assets/create/models/item/cut_deepslate_bricks.json ff0d08d1b59de36b016f7952d2bd72d8e1eb1293 assets/create/models/item/cut_deepslate_slab.json 627c806a6eba8b730682821deb31627d75683e88 assets/create/models/item/cut_deepslate_stairs.json 9bdb85a688b09eb34eb8024a6808406118f78133 assets/create/models/item/cut_deepslate_wall.json c33c48d71d98f4b8a84c7f0a4ee88918fed3e798 assets/create/models/item/cut_diorite.json +e8a697df63b0b5fa74dbc70e76b55718a2cc388f assets/create/models/item/cut_diorite_bricks.json 63bc297b782c40c513873b7f8fd8284abce01753 assets/create/models/item/cut_diorite_brick_slab.json f604d088c8c7c6d847795459231d0df8c73d95fb assets/create/models/item/cut_diorite_brick_stairs.json b06be3da6017aa7fbc38b8aecda0d30dae313c13 assets/create/models/item/cut_diorite_brick_wall.json -e8a697df63b0b5fa74dbc70e76b55718a2cc388f assets/create/models/item/cut_diorite_bricks.json 4650f375365caeb237947f6e933d174ebbfbc1e2 assets/create/models/item/cut_diorite_slab.json 933d14f51272b39fc13e94d58f3100469d7cbe06 assets/create/models/item/cut_diorite_stairs.json 0cc44bb9ad0ed3ff11bc6113d0a9e31e99b169b8 assets/create/models/item/cut_diorite_wall.json e2123180fd5312d1e67b3a030fcbc4b6f11aa8bf assets/create/models/item/cut_dripstone.json +4b5d7bbee5741b112e2cb354c5fe49c088fc9b2f assets/create/models/item/cut_dripstone_bricks.json a815b2a927853d6d82d8b69f862be3091c5c8caa assets/create/models/item/cut_dripstone_brick_slab.json b8cb1b04eb869a06ded04c4c3acac6e5a315ee78 assets/create/models/item/cut_dripstone_brick_stairs.json 87fafd603eb4ba41981cd9c9371ac4618909f94d assets/create/models/item/cut_dripstone_brick_wall.json -4b5d7bbee5741b112e2cb354c5fe49c088fc9b2f assets/create/models/item/cut_dripstone_bricks.json 756c801f6bba006fbfd3486e95ba870909ab2902 assets/create/models/item/cut_dripstone_slab.json c59d314e1b5cce1c3745ce164c2a094e17f7a003 assets/create/models/item/cut_dripstone_stairs.json 125b24d28a9957740855467440ad8508d21c24d7 assets/create/models/item/cut_dripstone_wall.json 2fbce0b481f7cf2cf4f0fd03c86ef743b7c30879 assets/create/models/item/cut_granite.json +d8860602cc52fac5a09354c56e78fdfd7d9cb6a9 assets/create/models/item/cut_granite_bricks.json 3584117ed8a69c3842fde1d6accfaaa2c72e44f4 assets/create/models/item/cut_granite_brick_slab.json c68d1c09b9091bc501279115be16f83508b88fed assets/create/models/item/cut_granite_brick_stairs.json 5a37b24319a8708e444902eae3596b68daaffd15 assets/create/models/item/cut_granite_brick_wall.json -d8860602cc52fac5a09354c56e78fdfd7d9cb6a9 assets/create/models/item/cut_granite_bricks.json c2f6603e8cbfc0cdf5e5ef10c6a4baef9c917b6d assets/create/models/item/cut_granite_slab.json 66f8e6d556446441e157427437e9563075e2d6ce assets/create/models/item/cut_granite_stairs.json fe06c8aeab9e4c8a145375af46cbdaed701baad4 assets/create/models/item/cut_granite_wall.json b5c3df9c28a14683a363769cad5d154af56b8da4 assets/create/models/item/cut_limestone.json +7d026353711a464400e69c7e86c9b9c6aa70bf6d assets/create/models/item/cut_limestone_bricks.json 2822ebe1d4211f240e31866759e25add5f0fb56d assets/create/models/item/cut_limestone_brick_slab.json 694dfb73585167011d8123d64f5896697594f4ce assets/create/models/item/cut_limestone_brick_stairs.json db8851d6a1b7604ca1ba7615e1f162f6f5220801 assets/create/models/item/cut_limestone_brick_wall.json -7d026353711a464400e69c7e86c9b9c6aa70bf6d assets/create/models/item/cut_limestone_bricks.json 75584aa5e06168d8866b022fcd72377351b774d9 assets/create/models/item/cut_limestone_slab.json 1df9a186a146e597b48da4c4461f1a98ecf3646a assets/create/models/item/cut_limestone_stairs.json b70ac5462ef4d0363332656aa7cb82919f679893 assets/create/models/item/cut_limestone_wall.json 92bc693db4e0ba6164cd35d4f5fa0982f3b8f796 assets/create/models/item/cut_ochrum.json +3e8e00c602b1fbce888e6fe22d9525f1c025129d assets/create/models/item/cut_ochrum_bricks.json 1edc47c279fadde74322d3fa89ef776bdd6fb354 assets/create/models/item/cut_ochrum_brick_slab.json 4678e2a97c73139b458cea657a55f74659bc36d5 assets/create/models/item/cut_ochrum_brick_stairs.json 85044ec7033cd4c6aa913c4c4bb6c0e3a4386023 assets/create/models/item/cut_ochrum_brick_wall.json -3e8e00c602b1fbce888e6fe22d9525f1c025129d assets/create/models/item/cut_ochrum_bricks.json e0e494fb7fa1767241507347318560335339a2a8 assets/create/models/item/cut_ochrum_slab.json de7c5917bcb14f398d39e3932bfe5e1967ed7a24 assets/create/models/item/cut_ochrum_stairs.json 5a8f8c84e95ee0ab97106a801a456282f5ac207c assets/create/models/item/cut_ochrum_wall.json 1631a807135cf993d9a81068c65e78face2f24e0 assets/create/models/item/cut_scorchia.json +5ecb9692e478e29d64aeb5867e8677671560755d assets/create/models/item/cut_scorchia_bricks.json ac3a29573ce099ac57f59d0a2f1cdc0a453e0621 assets/create/models/item/cut_scorchia_brick_slab.json d3a8a8e0e85aaaadccb18cdce33da54ae0e8a8d7 assets/create/models/item/cut_scorchia_brick_stairs.json 83be13f6cbd9a58e10869e4152066cf3b265f347 assets/create/models/item/cut_scorchia_brick_wall.json -5ecb9692e478e29d64aeb5867e8677671560755d assets/create/models/item/cut_scorchia_bricks.json 0fee2e7f8e80bbd33e4d928c8374e6dae65f0b1f assets/create/models/item/cut_scorchia_slab.json 88a6b3709bab76390ace6f641eac18d43c9d099f assets/create/models/item/cut_scorchia_stairs.json d733d43252bf27b6fb1d7e016dc77556c3d1eb71 assets/create/models/item/cut_scorchia_wall.json ce75fb80c38c94bf6bf631eeb756909decaaaab0 assets/create/models/item/cut_scoria.json +81aa0bd4ec878754043a107466dcd87d49b3697c assets/create/models/item/cut_scoria_bricks.json d78a5126aefdd4cd182f9ec0ddda64df00d0f01c assets/create/models/item/cut_scoria_brick_slab.json 661d49b996f9c97a333e7e39dd13a0476db6b142 assets/create/models/item/cut_scoria_brick_stairs.json 3be69c075b479ac53c6201d7d7224d399f8009b6 assets/create/models/item/cut_scoria_brick_wall.json -81aa0bd4ec878754043a107466dcd87d49b3697c assets/create/models/item/cut_scoria_bricks.json 824bedfbeec53ec8f539fe73c0a3c3d927a21aa4 assets/create/models/item/cut_scoria_slab.json 15560f1251f18d53fe1b71adc6be5060c4d8fb94 assets/create/models/item/cut_scoria_stairs.json e35ebcc4f7f7b94623af85b181d916e48fbbb5ed assets/create/models/item/cut_scoria_wall.json 71284d3d6dba230dbecd01eb015e0e65877b820d assets/create/models/item/cut_tuff.json +4de100799e290db3fd46923781a83e6a12654266 assets/create/models/item/cut_tuff_bricks.json 4c7d5fadb0b0eaecf2055a0cd279f9ec130b93d0 assets/create/models/item/cut_tuff_brick_slab.json 6f32b83c9f82424c0e2a2e0a8813eb44c2ac4527 assets/create/models/item/cut_tuff_brick_stairs.json 9088296b7677bddf16d670858a619d846a134ef6 assets/create/models/item/cut_tuff_brick_wall.json -4de100799e290db3fd46923781a83e6a12654266 assets/create/models/item/cut_tuff_bricks.json e9134027cc917e2e878456edb49bcfee382e73b1 assets/create/models/item/cut_tuff_slab.json 8235a34249197c100645b55ded5ff619a055d8a6 assets/create/models/item/cut_tuff_stairs.json a1626993eafa8d85dc950e17cbf78378ed64c7d2 assets/create/models/item/cut_tuff_wall.json a343c74f1e55426330df18f522e6d2a81276c499 assets/create/models/item/cut_veridium.json +3c3fd197f8e299ff90850e24c6507ea12f373123 assets/create/models/item/cut_veridium_bricks.json c1c5561ce31e237b7ea8f1adfb6a79e661b7f940 assets/create/models/item/cut_veridium_brick_slab.json f633006045ccfcdf486d7a240217229d6eed717e assets/create/models/item/cut_veridium_brick_stairs.json 8182109a002317dd8d2767b3828f8c44166a053f assets/create/models/item/cut_veridium_brick_wall.json -3c3fd197f8e299ff90850e24c6507ea12f373123 assets/create/models/item/cut_veridium_bricks.json 410b949304faa5856028f7c42ab762b7498ffd95 assets/create/models/item/cut_veridium_slab.json 62697c0922b11537914d2f4f84faa0b909ee518d assets/create/models/item/cut_veridium_stairs.json 3921d61a26d48d999cbb2f6645611e53ea71978b assets/create/models/item/cut_veridium_wall.json +73c2eed9b6a906a519e27361211ae05bc6ed2d87 assets/create/models/item/cyan_postbox.json eef3be2fa3b6424436a553e3c1bfee3979015962 assets/create/models/item/cyan_seat.json +fb3660aa1b33ef63361d91598c2b46dd5b1c30d7 assets/create/models/item/cyan_table_cloth.json 265d5d6de4238442bb9b161dba0a2fc2f063df0b assets/create/models/item/cyan_toolbox.json 8beb6459822efe59d0f60749143d73c5390e39f2 assets/create/models/item/cyan_valve_handle.json 2e0a1bb3f3498454eb23dab5d4eb6fad98fe586c assets/create/models/item/dark_oak_window.json @@ -1904,6 +2129,7 @@ e30c50f79332cb2cd2815554af84747c58545a39 assets/create/models/item/dark_oak_wind 9b5b804fe75a3e748a0d9a6761ab46178e5f3850 assets/create/models/item/deepslate_zinc_ore.json 7ff5075e907b57d6b0f6fd0a31d0e46464afe634 assets/create/models/item/deployer.json aa44d681c3ccffe08aedbda093062b1a5ab3302e assets/create/models/item/depot.json +63e24083922af9d5300aea771bb63bb9962ba3e6 assets/create/models/item/desk_bell.json 85a5830ca034be9a0ed534186210aa975278b20b assets/create/models/item/diorite_pillar.json 2a992f0961b8bab5628e075da413c91e903e424c assets/create/models/item/display_board.json 0dd4d33644c9ec7dbf920d7fd7b713e4b413b330 assets/create/models/item/display_link.json @@ -1918,13 +2144,14 @@ badd4326fac0b0a1590a2e9bce7c2cdd4e4562f3 assets/create/models/item/empty_schemat 7ec3ed4aaab72d76f6414447bbb3ad7887adf61f assets/create/models/item/encased_fan.json 3e1fdcc80fd68199b1890bcc830f78c48e7c0e43 assets/create/models/item/experience_block.json 9775e83414c0febb5c5b832437b0580e91bcbff3 assets/create/models/item/experience_nugget.json +87add851ae3271d733c9e6888865c288b6716f3b assets/create/models/item/exposed_copper_shingles.json 721c8ac46bf23abec2bbf4cff6dbfdf96cc569a6 assets/create/models/item/exposed_copper_shingle_slab.json 6e1c7fcd8da84dc2d49adb9802ce4fb431eddae1 assets/create/models/item/exposed_copper_shingle_stairs.json -87add851ae3271d733c9e6888865c288b6716f3b assets/create/models/item/exposed_copper_shingles.json +fa7ffb172a43774cc07a2bb201e7010a2549001d assets/create/models/item/exposed_copper_tiles.json a443633d90ef9ac2a866b69b2ecdfad1841dc3e1 assets/create/models/item/exposed_copper_tile_slab.json 9bb425a14635fc8b36a9a95f3d0c54e0b129b7b4 assets/create/models/item/exposed_copper_tile_stairs.json -fa7ffb172a43774cc07a2bb201e7010a2549001d assets/create/models/item/exposed_copper_tiles.json 8b64a93d9b6e33e3caa66adb7a0cc8c5cd473023 assets/create/models/item/extendo_grip.json +9114fa2e92ea4b7bf949b2e5a26290b0bade1af3 assets/create/models/item/factory_gauge.json dad31483f65baaf187e6553e3cd301c5d69e9db4 assets/create/models/item/filter.json 575047531b8e324df9e58abba79cfe9ee3db8b16 assets/create/models/item/fluid_pipe.json 51d34caaa63685e901b8bfe6ced13ff2e8914ce7 assets/create/models/item/fluid_tank.json @@ -1942,25 +2169,32 @@ b17d9fd1a92db0965f2e5da6215956b0451af29e assets/create/models/item/furnace_minec 7c850a41a754e46bb9c9f257ed621e37a1b9506a assets/create/models/item/goggles.json b1ae37998326c8ca054e57b0cbff0b51cad98625 assets/create/models/item/golden_sheet.json 85c301898775d5720d4d11c1c555b331a5c2e93b assets/create/models/item/granite_pillar.json +44173ca711aa497d08ca3b8a9613290378072870 assets/create/models/item/gray_postbox.json b8d6d2d163e2ab5f654bbc4eda9ad63f8064d27c assets/create/models/item/gray_seat.json +4a9aa604745afcb19c3495a879013e263415f214 assets/create/models/item/gray_table_cloth.json 6492f86b693f924d0222d0ca1d16fbe33d797b1a assets/create/models/item/gray_toolbox.json 2a9500f9630b1da44615c7c9ca145b56324c46bb assets/create/models/item/gray_valve_handle.json +1a97f63df2977ac2f2e3363c61a7e36bf60d3ce3 assets/create/models/item/green_postbox.json 2843370b0e693e1ba1777c26416914edbd87c4f9 assets/create/models/item/green_seat.json +334fd81d5e6574220ee5815f1452b4f4aa7ad223 assets/create/models/item/green_table_cloth.json 561e0579101bf602b252c0b9a5eec468c89d0e40 assets/create/models/item/green_toolbox.json 7d3ddad087b4d2c6a32f97092533cbfb5de0cb3b assets/create/models/item/green_valve_handle.json -dac0331061c464e6d3e2070b232781c632840191 assets/create/models/item/hand_crank.json 9e352162c8135773a4eca41871beea8f3ca650ae assets/create/models/item/handheld_worldshaper.json +dac0331061c464e6d3e2070b232781c632840191 assets/create/models/item/hand_crank.json 7bb435c53cbf935d80a28746125aebbd6263e45c assets/create/models/item/haunted_bell.json -2e97629313eab1a4ac4b38785dbe7ed45346e625 assets/create/models/item/honey_bucket.json 81d67fb0e59f25762a412990884813c72d399d55 assets/create/models/item/honeyed_apple.json +2e97629313eab1a4ac4b38785dbe7ed45346e625 assets/create/models/item/honey_bucket.json 70185e640169d6253f06fb98f31b240f4807a53e assets/create/models/item/horizontal_framed_glass.json d47884b13fadf545bd585cd9ae347368924b04b0 assets/create/models/item/horizontal_framed_glass_pane.json 58b6f4ec2af3a69ae7145fb25d73451b6e8a2834 assets/create/models/item/hose_pulley.json 14ae1ba5e842715fc4526b19e20c74d10102eb4a assets/create/models/item/incomplete_precision_mechanism.json ae5c5925ecf775a4f5c3dc3c79d9766d7dd34ab6 assets/create/models/item/incomplete_track.json 43173d18384817288a9ba687da77a4fab31b1957 assets/create/models/item/industrial_iron_block.json +4596b83d7da43a670f2274c8389cca9897ae379d assets/create/models/item/industrial_iron_window.json +199e1b60315fc2d016b69d2d60fcb790a6e075fc assets/create/models/item/industrial_iron_window_pane.json c6e3e4ca8b3dfdaaa943faa3dc89c0b2e6f2b5c4 assets/create/models/item/iron_sheet.json d1fbf1be53208c3ab5384dfd6be4d980c858941c assets/create/models/item/item_drain.json +5adda29ca25d00eb41884d0b7ad4a471e250ae10 assets/create/models/item/item_hatch.json 908dd0a4eafd868d280e25cfb7721f20b649560f assets/create/models/item/item_vault.json 5fba1fa33e360c2744ec74d7ccb63f9baa295546 assets/create/models/item/jungle_window.json 1a76bf2c7cf1036c458651536a7be8511a39d551 assets/create/models/item/jungle_window_pane.json @@ -1980,20 +2214,28 @@ a22638fd361a8185175e107a8ee092a9ac030b7b assets/create/models/item/layered_grani 14494272713544a1595d654fd397a986b2da0951 assets/create/models/item/layered_scoria.json b1174d783c62dda84aafd4259c622197f4664421 assets/create/models/item/layered_tuff.json 952b07dbf9ecc1883deabaa1344667f13936f7f2 assets/create/models/item/layered_veridium.json +623c937db944651cf1075b3875afe002db527ed6 assets/create/models/item/light_blue_postbox.json b44a9f1bd9079f3533d7f708d76eb19a864e5ebb assets/create/models/item/light_blue_seat.json +df2a3c76b7dbe1f5f6556436e7db3b72288b2232 assets/create/models/item/light_blue_table_cloth.json dae914625ff1bc3ebe1463485cad4526a7d7e9f5 assets/create/models/item/light_blue_toolbox.json 1d94314f185151eb9dcabcef950abf6f86c3c836 assets/create/models/item/light_blue_valve_handle.json +b56a28924b0b1b2530ebac7834e011700b09b966 assets/create/models/item/light_gray_postbox.json 1747bcdea3b1d3f5dfb786102069e07198d36dfe assets/create/models/item/light_gray_seat.json +cc8834024208662cb100f7cd38a04637da3b6852 assets/create/models/item/light_gray_table_cloth.json c8513eb1c89652783e26d7dcfcf64afa97619bc8 assets/create/models/item/light_gray_toolbox.json 3774d23e76b5712e7004e333e0a770f2230c2998 assets/create/models/item/light_gray_valve_handle.json -32cd55a1c97a31a13ad106a457ec9925aa91f6d3 assets/create/models/item/lime_seat.json -931d187c11cb95a0eeae8f256187ef551b42007e assets/create/models/item/lime_toolbox.json -d0f4148bdb0a905e68f54b5dfd829fd47e528fea assets/create/models/item/lime_valve_handle.json 8f53caad3899a30be5087a0ba155080834418cc0 assets/create/models/item/limestone.json fba1e7d1cad39c89976b427db62544d80f47ad5d assets/create/models/item/limestone_pillar.json +26b8e1daf9cc4b206fb5f62904c7f1701ba93e67 assets/create/models/item/lime_postbox.json +32cd55a1c97a31a13ad106a457ec9925aa91f6d3 assets/create/models/item/lime_seat.json +a0843c3731fa3c4d23bc2b91fd68410fcf1df149 assets/create/models/item/lime_table_cloth.json +931d187c11cb95a0eeae8f256187ef551b42007e assets/create/models/item/lime_toolbox.json +d0f4148bdb0a905e68f54b5dfd829fd47e528fea assets/create/models/item/lime_valve_handle.json 1d30f9b525e8e9736b34a92f848e235c71fd6bd8 assets/create/models/item/linear_chassis.json 8f622f5f79446f6060d9e8815205fce919c8c829 assets/create/models/item/linked_controller.json +538e28af9013a43c258a659cbe67671991f3eee7 assets/create/models/item/magenta_postbox.json ad6fd371ee989c9c3c21e762273e8a4e903f0af8 assets/create/models/item/magenta_seat.json +c50cb6b0285ee3a2b7d7f592ee48672d66e02af3 assets/create/models/item/magenta_table_cloth.json 7c0e3f91e5ab029473736deffb2b2aab9d4763c7 assets/create/models/item/magenta_toolbox.json 6d82582e5afea919927606b20a74cbda5223956f assets/create/models/item/magenta_valve_handle.json a4ecba2ee36699401de661b89065bf0738487a87 assets/create/models/item/mangrove_window.json @@ -2026,19 +2268,26 @@ f80358eba19bc8d1741e4e25753866799631a118 assets/create/models/item/nixie_tube.js 7d9eef77eb18dd5c768e48b5871ca2dcdd1a136c assets/create/models/item/oak_window_pane.json af50363d603d61340b336569d58c1febde253665 assets/create/models/item/ochrum.json 62ec1afee14f9de3f5b02ee930d002a240a3c337 assets/create/models/item/ochrum_pillar.json +226f99c241b1d8b03d8fc57db32c1bee0721b64f assets/create/models/item/orange_postbox.json 56e7d28824d3fc566b5f551babbe423a550ef08c assets/create/models/item/orange_seat.json +9f122183a1b04ac6346631db4f505e53ed333acf assets/create/models/item/orange_table_cloth.json 96cc543d5afed90a022ece7b8671cd47a9b6fb68 assets/create/models/item/orange_toolbox.json 7e767ca9e0ddb769b38fabd9289648ac63f5413d assets/create/models/item/orange_valve_handle.json 82152bca4310111d91584a2a78f05e158bb4bd90 assets/create/models/item/ornate_iron_window.json ca749a88faeef441c55c0527d81257187938b6b0 assets/create/models/item/ornate_iron_window_pane.json +09b3cd8ff7b29a6dd59f739a95bb708646d23537 assets/create/models/item/oxidized_copper_shingles.json c9c7ccdb68de2e77cd9f7053fab19493dd30a985 assets/create/models/item/oxidized_copper_shingle_slab.json 89c5f7a0a28f238ebed2641e243a47e4be2ad5ab assets/create/models/item/oxidized_copper_shingle_stairs.json -09b3cd8ff7b29a6dd59f739a95bb708646d23537 assets/create/models/item/oxidized_copper_shingles.json +1c3428e2aed32a013631db012642a34d4eaf0785 assets/create/models/item/oxidized_copper_tiles.json f1af7c5f3840efc3ae07940ee6719eb3417a0e1a assets/create/models/item/oxidized_copper_tile_slab.json ef2fe68d407a03bf1ed8f2d2f3e7323777d061bb assets/create/models/item/oxidized_copper_tile_stairs.json -1c3428e2aed32a013631db012642a34d4eaf0785 assets/create/models/item/oxidized_copper_tiles.json +b21a1f3ee7de3e17f69d27fd13ae6b23b62aa22c assets/create/models/item/packager.json +5b974e55caffdbfc2156eb8b59dd99db12243bd3 assets/create/models/item/package_filter.json +7fd76e7d2e6c6d94352f1fa08d096b63616ad01e assets/create/models/item/package_frogport.json 76aeceb41bb7df873dbafe1bd5e26deb24abf93f assets/create/models/item/peculiar_bell.json +ab6c05a0468f3f4295a07adb362fa2d36cf6e3e8 assets/create/models/item/pink_postbox.json df13d4281dc45041ecd93504d45daef61d070581 assets/create/models/item/pink_seat.json +d142627de73dc821281d64ab54fe9956936253b4 assets/create/models/item/pink_table_cloth.json 842afb2a345dbaba857e90f7dffa724841ef7b2d assets/create/models/item/pink_toolbox.json 6b85a0da81b2d18fb54eb05e187a2ce8cd7b09eb assets/create/models/item/pink_valve_handle.json 9e8b4c1a0bbcb0ea9b15aec174d8f98b572133d1 assets/create/models/item/piston_extension_pole.json @@ -2108,23 +2357,35 @@ a06275da5e5cec7c17edaae8b5a693a3eeff2fe2 assets/create/models/item/powered_latch a1c6fd9b035eed7de732f4080cedaa118a2bc559 assets/create/models/item/powered_toggle_latch.json bd70b798ca9f73f4e5aabc30e286487f5363122e assets/create/models/item/precision_mechanism.json d9a736e7a6fc70e0848de3e318c739d58b1e563f assets/create/models/item/propeller.json +34c09fb1eb46ed362aa384958c2ad2cc96688abb assets/create/models/item/pulp.json 9b41eec5759887be9bae3d27654bf478a7eff676 assets/create/models/item/pulse_extender.json ea76bd3bd9e5bea4d64d91347d473b538e926b02 assets/create/models/item/pulse_repeater.json +6ff9ce0cc633ea39b779b2e873a1d0fd7cfe7119 assets/create/models/item/pulse_timer.json +8496f6c5449a70eef12e9c68ba46eee2f365fb77 assets/create/models/item/purple_postbox.json 7e165f83266edf34bb03fa3e8d2a83d44829c10a assets/create/models/item/purple_seat.json +0d688a25e03c9f0e7059998a44a5be31e570a04d assets/create/models/item/purple_table_cloth.json d75c4969334f2ee1ae4a3d8ac28b001735c76b97 assets/create/models/item/purple_toolbox.json ebffb05119f499fcec051a4337aadc47654baed2 assets/create/models/item/purple_valve_handle.json f91405b9aec1e0142c1b90582e03a1973251da05 assets/create/models/item/radial_chassis.json 1c984ea9dbaec02e88dba1b81906c9acca7ed672 assets/create/models/item/railway_casing.json +87c4c0e13441cf0238103ca065c0c16f80f60f26 assets/create/models/item/rare_creeper_package.json +f982794c2e01a70fcc2bb009bcb8cd06a2ea5510 assets/create/models/item/rare_jinx_package.json +9f4de06da4d9c2b54b758b2b01e0595811338b94 assets/create/models/item/rare_kryppers_package.json +7830b48ef4292922f0ef13f9a7c2ee7d47366169 assets/create/models/item/rare_simi_package.json 5f8e5283fbebb452f1a1141b33ee73f08879c75d assets/create/models/item/raw_zinc.json 4631d67976cef148c346a7016baaa6703e4f243e assets/create/models/item/raw_zinc_block.json -8d00eb1a10055a802556eab10e13f522d12acd1c assets/create/models/item/red_sand_paper.json -b64a054c92cbd2e055502d470f3921d1077e63a1 assets/create/models/item/red_seat.json -ac4695cc465d094b4adba1a4e9efec42c916f37d assets/create/models/item/red_toolbox.json -02473f42ef4b53dc809c7c58ae657c014bfaf652 assets/create/models/item/red_valve_handle.json 9dc6c52e258b00cac6ed23147983045c43218b5d assets/create/models/item/redstone_contact.json f8f733364bdd32b2ad597e81103bc02344ce63bd assets/create/models/item/redstone_link.json +ae0ba4827a81bd51c5c01178c2ccdae3a722628a assets/create/models/item/redstone_requester.json +4b73ee9cc2651a3d1a97476d100f9c4d7e2b2efe assets/create/models/item/red_postbox.json +8d00eb1a10055a802556eab10e13f522d12acd1c assets/create/models/item/red_sand_paper.json +b64a054c92cbd2e055502d470f3921d1077e63a1 assets/create/models/item/red_seat.json +359d9bdb2496140e297a1e5a98c9563bc09d56b9 assets/create/models/item/red_table_cloth.json +ac4695cc465d094b4adba1a4e9efec42c916f37d assets/create/models/item/red_toolbox.json +02473f42ef4b53dc809c7c58ae657c014bfaf652 assets/create/models/item/red_valve_handle.json 9926bbe6dad7c4c1a146492116d232e941c80d2b assets/create/models/item/refined_radiance.json bf827486dc7a1b3aeae577844d2dab2a97051db9 assets/create/models/item/refined_radiance_casing.json +a982c29763d90556cca03074c168462a52cb9526 assets/create/models/item/repackager.json 69dc8139280bce3a7e08532afbbc5c41e7942be1 assets/create/models/item/rope_pulley.json 7a93e1b9557422f6b5dfc17e44524805ec4575c6 assets/create/models/item/rose_quartz.json bfbe599cada68962c66cbc6a3e88019fbd9cffd5 assets/create/models/item/rose_quartz_block.json @@ -2135,9 +2396,9 @@ d45005a89e2c0d29944e0112be274365e0e318a5 assets/create/models/item/rose_quartz_t 670e978a34faf6a3acd7880b2f94c2574178d586 assets/create/models/item/sand_paper.json 6854451e331242ec50c186a545538024b07ec123 assets/create/models/item/schedule.json 0effa517c214ba07dba2f4ed12dfcf4785e42dd8 assets/create/models/item/schematic.json +8b7727844d8c12c3c22828c7f65fc7ac2d273e36 assets/create/models/item/schematicannon.json 2a52f084fa8187dd8da28fe820dde50c47a93b57 assets/create/models/item/schematic_and_quill.json 4c8b34627001e35ee15412a0cd037d0f24ba914e assets/create/models/item/schematic_table.json -8b7727844d8c12c3c22828c7f65fc7ac2d273e36 assets/create/models/item/schematicannon.json 2955563914c2f84ed06474c135062e91189ddf3a assets/create/models/item/scorchia.json 669041e5ad29d2166cc8895f85aa262040671d3e assets/create/models/item/scorchia_pillar.json ff52eb59dadfe675e416440f3115856a501428a6 assets/create/models/item/scoria.json @@ -2147,63 +2408,64 @@ ff36a19e124caf2ee8a03767e39601df6866075b assets/create/models/item/secondary_lin abaa6da82babc26717ffff44fc41327bd015c9a6 assets/create/models/item/shadow_steel.json ffaec38d11b91add4e150e33d0e0e49394f5beca assets/create/models/item/shadow_steel_casing.json b6fcd9722e5a09a9207964cba68752512e3b945a assets/create/models/item/shaft.json +617c6e2f759b2a95da7ee7192a2661afc6f6e8f8 assets/create/models/item/shopping_list.json +58ca190177e77db90c8195347c29d52c2cd0c556 assets/create/models/item/small_andesite_bricks.json fa92996fada8545fc340fb401bd0568f56809bf0 assets/create/models/item/small_andesite_brick_slab.json 08474bf814a55795c1f94203ceb8a969be2a2132 assets/create/models/item/small_andesite_brick_stairs.json 0e00bc6aa5be242217ed6fe8cbe1ccdf180742fb assets/create/models/item/small_andesite_brick_wall.json -58ca190177e77db90c8195347c29d52c2cd0c556 assets/create/models/item/small_andesite_bricks.json +543055fabb706a93037c6a9e47c334508e41b06c assets/create/models/item/small_asurine_bricks.json b160c3277f00f19687cffb87f9cb3aa32d3633aa assets/create/models/item/small_asurine_brick_slab.json 183fa4919f06e8c3c10f1efeceefd55389a96102 assets/create/models/item/small_asurine_brick_stairs.json d6a5ffdb493fb2c8176a7e6b42e05c2d393a2782 assets/create/models/item/small_asurine_brick_wall.json -543055fabb706a93037c6a9e47c334508e41b06c assets/create/models/item/small_asurine_bricks.json +26d9361e33e362a772220146724c0927453831e0 assets/create/models/item/small_calcite_bricks.json 8c1b5d5d40393636c9ff10afc09038c89bc1b383 assets/create/models/item/small_calcite_brick_slab.json 481ce90fb6abb05c904f01df3fe635f702bbfac0 assets/create/models/item/small_calcite_brick_stairs.json 02adb90bdf06a7c4c57d09dfd3c77cceef9b7fbe assets/create/models/item/small_calcite_brick_wall.json -26d9361e33e362a772220146724c0927453831e0 assets/create/models/item/small_calcite_bricks.json +d5a033d3dedb799c4752b7e68b6881529f38f8e5 assets/create/models/item/small_crimsite_bricks.json 8f382537c99eac3335f72db8dba33ab71f99a919 assets/create/models/item/small_crimsite_brick_slab.json b5d012cf0c5c94b73e6825b6884ab1d3eee7d64e assets/create/models/item/small_crimsite_brick_stairs.json 236457bb16bc7e949c16f3f091ee74dc3f3e6973 assets/create/models/item/small_crimsite_brick_wall.json -d5a033d3dedb799c4752b7e68b6881529f38f8e5 assets/create/models/item/small_crimsite_bricks.json +6ce2cb7882f41fcbcd641a442c98767bda61f65f assets/create/models/item/small_deepslate_bricks.json ce79900b7aa1eff0d42cabcd0a7f80ef20824551 assets/create/models/item/small_deepslate_brick_slab.json a260711af72c749a6b72f72515bbecb2e01e3ed8 assets/create/models/item/small_deepslate_brick_stairs.json 4e474891c6a269166c2eb413fae78699e5657af4 assets/create/models/item/small_deepslate_brick_wall.json -6ce2cb7882f41fcbcd641a442c98767bda61f65f assets/create/models/item/small_deepslate_bricks.json +e412eaa393965ef5426c3d8d95d5c9d69e37e054 assets/create/models/item/small_diorite_bricks.json 55b82c2f30d52acee5c3807ab2ffaed1d773cfa8 assets/create/models/item/small_diorite_brick_slab.json 49a17610b5b05595894ca2683056cecd724c1111 assets/create/models/item/small_diorite_brick_stairs.json dd3630a9c5500e6cf09e95d09e7a3cc99db11899 assets/create/models/item/small_diorite_brick_wall.json -e412eaa393965ef5426c3d8d95d5c9d69e37e054 assets/create/models/item/small_diorite_bricks.json +c29d35da520d0fe828bb364db403b8cdf55f0a2e assets/create/models/item/small_dripstone_bricks.json 21e281ec7a82d48018366a0737c6867f625b4663 assets/create/models/item/small_dripstone_brick_slab.json 6862e72eedf80536f40b6ac42ff78f13f62d012f assets/create/models/item/small_dripstone_brick_stairs.json ca8613bb64ceb562c36dd1d6a3b76b5f15f35be9 assets/create/models/item/small_dripstone_brick_wall.json -c29d35da520d0fe828bb364db403b8cdf55f0a2e assets/create/models/item/small_dripstone_bricks.json +81eae95d20a9e99a070dfb8f6e6c22ef29f628d3 assets/create/models/item/small_granite_bricks.json a19aa13eb3c04a9e0931e22e4170eec80950efab assets/create/models/item/small_granite_brick_slab.json 51bc02587cad5dfcfaf9d040848faa5277a25a5f assets/create/models/item/small_granite_brick_stairs.json 147a6f42be8312fbf050ad53c1625a1458f73cc3 assets/create/models/item/small_granite_brick_wall.json -81eae95d20a9e99a070dfb8f6e6c22ef29f628d3 assets/create/models/item/small_granite_bricks.json +bfa76583bca68134bbe2793c263cc0b71e1406af assets/create/models/item/small_limestone_bricks.json a9599981e872e683dacd01b2f0af511f416dd526 assets/create/models/item/small_limestone_brick_slab.json d8f8eadea13fc90a1c8ee5aca4be71fb22a79fd0 assets/create/models/item/small_limestone_brick_stairs.json 67626afe8b0fc9135456a24ea49c602b83d6970d assets/create/models/item/small_limestone_brick_wall.json -bfa76583bca68134bbe2793c263cc0b71e1406af assets/create/models/item/small_limestone_bricks.json +2d4b22d4028c55cbabc7eb405c2c6d485390afab assets/create/models/item/small_ochrum_bricks.json f7547aacb8bdaf61424cd56565e40d3cd40a1cfa assets/create/models/item/small_ochrum_brick_slab.json 8a320ff9e75e16a182cb7d07784a595fe7876e04 assets/create/models/item/small_ochrum_brick_stairs.json 0eedd4fe5b0a82de16fed148836087ff4ae64a74 assets/create/models/item/small_ochrum_brick_wall.json -2d4b22d4028c55cbabc7eb405c2c6d485390afab assets/create/models/item/small_ochrum_bricks.json 97b8e3eaddac0b93d4b6bc140f573969fcba5823 assets/create/models/item/small_rose_quartz_tiles.json +ac1bf1d2344517c18b945afa198d5d05e2866f6b assets/create/models/item/small_scorchia_bricks.json 63ef9901ba1014027e8c873d8374d86abb73158e assets/create/models/item/small_scorchia_brick_slab.json f52601fe54695c225a595a65e9130665582db856 assets/create/models/item/small_scorchia_brick_stairs.json b4e0db087dc88e0a3a4a82197a0ce347d3c7a7aa assets/create/models/item/small_scorchia_brick_wall.json -ac1bf1d2344517c18b945afa198d5d05e2866f6b assets/create/models/item/small_scorchia_bricks.json +25b6bb40701e782ed64414ec8391b304ad5e6b12 assets/create/models/item/small_scoria_bricks.json a4bdeb066dcc44f8be058e6d9dfc0a3fd34819bf assets/create/models/item/small_scoria_brick_slab.json 5ffb0e7de917013cd82cece2506d72fce2cd5fc6 assets/create/models/item/small_scoria_brick_stairs.json 67dcbc7d52fbbe88f89b36e04f970b27024741e4 assets/create/models/item/small_scoria_brick_wall.json -25b6bb40701e782ed64414ec8391b304ad5e6b12 assets/create/models/item/small_scoria_bricks.json +90943707d8b232d816392bec8ae05e06b6eedd72 assets/create/models/item/small_tuff_bricks.json 91a144100eea8b4e67a0a4f31b35a714693fa001 assets/create/models/item/small_tuff_brick_slab.json b3f89c9f8e46fbdfc58171073d6ad91c588e5853 assets/create/models/item/small_tuff_brick_stairs.json 52c1d4cfb5f1726c9ccbb00db60bdd6f760bf40f assets/create/models/item/small_tuff_brick_wall.json -90943707d8b232d816392bec8ae05e06b6eedd72 assets/create/models/item/small_tuff_bricks.json +6935d6d9dbdb99fe7258d9347419d65571711263 assets/create/models/item/small_veridium_bricks.json 0bb60fc6ab570db83214fd10c83d931f6677e361 assets/create/models/item/small_veridium_brick_slab.json 89918d98b6830477b21ab7fb9e30807d3ca1d379 assets/create/models/item/small_veridium_brick_stairs.json ab4e7695e99548f83a89f3d5ad7690a576bafcc0 assets/create/models/item/small_veridium_brick_wall.json -6935d6d9dbdb99fe7258d9347419d65571711263 assets/create/models/item/small_veridium_bricks.json 6cf508dbd3d015ea730366db92bb17844dc2ca06 assets/create/models/item/smart_chute.json 9201f00edcf2ffa33cb079c28b5c33e39872c824 assets/create/models/item/smart_fluid_pipe.json 67804bdd890f167010f6101a700e85a3245f4cc3 assets/create/models/item/speedometer.json @@ -2215,6 +2477,8 @@ b82ab0c69df330f6f938ed1beee7b4add67d2e50 assets/create/models/item/steam_engine. 54f200be903e056e5cf9e2186f0a0a51f8f0f84e assets/create/models/item/sticker.json 0f88de164439640cc175ceef2017f7416b5a7018 assets/create/models/item/sticky_mechanical_piston.json 4b640b66765b206f8c2884b7c1a1ef860b81d841 assets/create/models/item/stockpile_switch.json +c04a4ef6debb04d305d74d9b034c1e95c6b9e956 assets/create/models/item/stock_link.json +67c98c6c7f2122850acfbee34688572934fdd226 assets/create/models/item/stock_ticker.json 6ee792277b9fd980c40e18e841afa63fc500ed0b assets/create/models/item/stressometer.json 8d4ce1ccf180016506292f63188c10d0dabe0ee3 assets/create/models/item/sturdy_sheet.json a10bb4d6d1a4483a806e3aaa086d48c0e20aaefe assets/create/models/item/super_glue.json @@ -2227,6 +2491,7 @@ c4bd1224b988ca10708fe9538a0baa8b88272eb5 assets/create/models/item/track_observe c08a82b94666ca81a6d9134c740cc9c28ddae892 assets/create/models/item/track_station.json be3b40aee1c62680ddcf9129fd9f926bab790590 assets/create/models/item/train_door.json 1d45bba128629e6c962a9260d49f2df83958ed16 assets/create/models/item/train_trapdoor.json +b3a5de0cddc4d9d2d1858535220cb527735e86bc assets/create/models/item/transmitter.json ba7a9f542e9f65bdce3d3330a95f1166a0be0673 assets/create/models/item/tree_fertilizer.json 55aafc103c38057faa3295ccc76da99f4a91de52 assets/create/models/item/tuff_pillar.json 0e199ab3e450156aae2d54c227383af9bb3f7082 assets/create/models/item/turntable.json @@ -2240,117 +2505,110 @@ b0f6d37aa695395e28a23d36775092f63ab3f5a5 assets/create/models/item/vertical_gear 9c5087114e35052c5e56bb752252de5d092408c5 assets/create/models/item/warped_window.json cdc1226f8a098adbc420fe50c98466507c3a3157 assets/create/models/item/warped_window_pane.json e5939b47bf7440dc101c667e68ef6bf750a3290f assets/create/models/item/water_wheel.json +be2f058a7ecb015599ee052ec27c4360d636999a assets/create/models/item/waxed_copper_shingles.json adc188e4e48bea80607c6e0c7076c9bdd7236cb0 assets/create/models/item/waxed_copper_shingle_slab.json 7e224aceaa94361256e95e4c44d8814aebaf297c assets/create/models/item/waxed_copper_shingle_stairs.json -be2f058a7ecb015599ee052ec27c4360d636999a assets/create/models/item/waxed_copper_shingles.json +eced19a2f721c54b968e5979cde2705f15faf3e1 assets/create/models/item/waxed_copper_tiles.json 68b3632c34adb9991aa993385f53624632c260f2 assets/create/models/item/waxed_copper_tile_slab.json a7fc0cc2d32dcd49c3274597ce7121f01fca03f8 assets/create/models/item/waxed_copper_tile_stairs.json -eced19a2f721c54b968e5979cde2705f15faf3e1 assets/create/models/item/waxed_copper_tiles.json +5336907eba067492f6d00b4b8514f9663830a1d5 assets/create/models/item/waxed_exposed_copper_shingles.json fd428034c46a240c4bb2a1aee625b8767f41c3ef assets/create/models/item/waxed_exposed_copper_shingle_slab.json 43d714187fe6c0cd1ed7abcddef1ebcd63979ff4 assets/create/models/item/waxed_exposed_copper_shingle_stairs.json -5336907eba067492f6d00b4b8514f9663830a1d5 assets/create/models/item/waxed_exposed_copper_shingles.json +962b24b3611abefc21920d01452944710ab0da3f assets/create/models/item/waxed_exposed_copper_tiles.json 25f5a10fe8e6acbdbf8457d56aeee065835a93ec assets/create/models/item/waxed_exposed_copper_tile_slab.json 22917505d328fb5b489b9f7f9068f1514b784abb assets/create/models/item/waxed_exposed_copper_tile_stairs.json -962b24b3611abefc21920d01452944710ab0da3f assets/create/models/item/waxed_exposed_copper_tiles.json +12c3dd893bddb66b9b387652c67c8f0e24b643ff assets/create/models/item/waxed_oxidized_copper_shingles.json 9b7c82376ea8c1c8ecbc7bbe15283f84b0d50d94 assets/create/models/item/waxed_oxidized_copper_shingle_slab.json fbb6043eb935aa0641a482ee7300c780be257440 assets/create/models/item/waxed_oxidized_copper_shingle_stairs.json -12c3dd893bddb66b9b387652c67c8f0e24b643ff assets/create/models/item/waxed_oxidized_copper_shingles.json +6b8f75d4818db903b22f4626d02671ab76a61023 assets/create/models/item/waxed_oxidized_copper_tiles.json 6e7bc8eb9a87d903dcc590e9918ce8d4411bf190 assets/create/models/item/waxed_oxidized_copper_tile_slab.json 10136759b31e4d957e8374948460d6c984711326 assets/create/models/item/waxed_oxidized_copper_tile_stairs.json -6b8f75d4818db903b22f4626d02671ab76a61023 assets/create/models/item/waxed_oxidized_copper_tiles.json +ce2dcfc01205da1dc70f34091a2c24f563e72466 assets/create/models/item/waxed_weathered_copper_shingles.json 2bf249c677d30a4febf950fa7c6caa87c348c54e assets/create/models/item/waxed_weathered_copper_shingle_slab.json 9fa84f2555d82b5a1550b748a332ceb443a04fae assets/create/models/item/waxed_weathered_copper_shingle_stairs.json -ce2dcfc01205da1dc70f34091a2c24f563e72466 assets/create/models/item/waxed_weathered_copper_shingles.json +02d2ac048c9bea86d10673254dfc107f3c9c5bb5 assets/create/models/item/waxed_weathered_copper_tiles.json ab40b1a5a03cd290d53ef2ea65f90dcfcd2673de assets/create/models/item/waxed_weathered_copper_tile_slab.json dadc7b65a4527e288c21a20df978796a8c444fd2 assets/create/models/item/waxed_weathered_copper_tile_stairs.json -02d2ac048c9bea86d10673254dfc107f3c9c5bb5 assets/create/models/item/waxed_weathered_copper_tiles.json +86b8e71fa8b7aeb73eafda89d8d06d83da6a5d25 assets/create/models/item/weathered_copper_shingles.json 94db30ad2381d2f2c37cdfd0d5ce5c45a2807640 assets/create/models/item/weathered_copper_shingle_slab.json 7262c01df4b5a8cd8c6a5545062f251d5ad9fd06 assets/create/models/item/weathered_copper_shingle_stairs.json -86b8e71fa8b7aeb73eafda89d8d06d83da6a5d25 assets/create/models/item/weathered_copper_shingles.json +99f17b16b68201aefb78298b3e6c657e3c2235e0 assets/create/models/item/weathered_copper_tiles.json 0b1b299d6dfab65b6060305a8b3e51f6e2df09f4 assets/create/models/item/weathered_copper_tile_slab.json 0c3989b44fde934ba8b88b071887e5ede522c417 assets/create/models/item/weathered_copper_tile_stairs.json -99f17b16b68201aefb78298b3e6c657e3c2235e0 assets/create/models/item/weathered_copper_tiles.json +b5d591fbb40e062efe301b3b3b49580e5ad64566 assets/create/models/item/weathered_iron_block.json +a569ddd725898a86f8745e46723edeff7fe7f2e9 assets/create/models/item/weathered_iron_window.json +68ca3316942b2df1623893cda722402238ab7724 assets/create/models/item/weathered_iron_window_pane.json 79431edb868e6560f4f6d5b3441c0176c7699f5e assets/create/models/item/weighted_ejector.json 0fd2214cdff8a92e05d9d5ee888329b3235143c0 assets/create/models/item/wheat_flour.json aacced59d21212090d508a9684bb46c9472a8a2f assets/create/models/item/whisk.json +bcf3104e463ec212dc239281033e4e80d78e1d74 assets/create/models/item/white_postbox.json 4e112e82185e2c1a5c57f5a94fa11c59c92cef0d assets/create/models/item/white_sail.json 17ed8ac7d745117f622190a46c5e1b42892afc29 assets/create/models/item/white_seat.json +0fa9208df662c018499902e3aeddf1bbec16c3db assets/create/models/item/white_table_cloth.json 432040f39177ab3df6003df24e818c73e28cf754 assets/create/models/item/white_toolbox.json 8ba8a6d4baf98f0f037f83b4b704f75a8d46a26e assets/create/models/item/white_valve_handle.json bccccbdfa5d376936e123defa44f2907dc317617 assets/create/models/item/windmill_bearing.json 47c6ad1c146366156a0ec4bc1cbf74282784698f assets/create/models/item/wooden_bracket.json 6c08d2fa59e56e4848063ab6f3e45894b89f1744 assets/create/models/item/wrench.json +3a899db3044ee39ac5d6385c16630733e00f77ca assets/create/models/item/yellow_postbox.json ac59f141cd3c3f7e57a794e542d6e22bf8ebb8f9 assets/create/models/item/yellow_seat.json +1f9f7c6102a0c5e1a6e50a6ac67858009a13153f assets/create/models/item/yellow_table_cloth.json 532a429d58a177f61b4d67180db7676fa7536052 assets/create/models/item/yellow_toolbox.json 2c87ef8a26a01a17b2f3799d62cb27cf1107d061 assets/create/models/item/yellow_valve_handle.json bcf63b7198d31d3a94b2566171b7e3e84464601c assets/create/models/item/zinc_block.json d4a3290393c1c659f3d4dd4e267a87d287bd49a6 assets/create/models/item/zinc_ingot.json 1e9656f81ec01a89796b175cf029d1de45b758fe assets/create/models/item/zinc_nugget.json f3719d4d3a8d1e0d9f36db5d1317894ecacf3bf3 assets/create/models/item/zinc_ore.json -63d74987f8461b4e94c00030d380d4891707d2ae assets/create/models/threshold_switch/block_ceiling_0.json -12496e505374e7fff2d1f800218848635d86ec71 assets/create/models/threshold_switch/block_ceiling_1.json -523bc69211b6e90cc381356f103b01b8d7e15771 assets/create/models/threshold_switch/block_ceiling_2.json -c62cbd9fe144326c46702ba4e512c832484ea4e8 assets/create/models/threshold_switch/block_ceiling_3.json -fe1017b4338d3027771d5eb8b4e2444ddb842b36 assets/create/models/threshold_switch/block_ceiling_4.json -d090a659a8df0b86d9892214ac5b06641aaabc9a assets/create/models/threshold_switch/block_ceiling_5.json -dffc869ccce392b1908c833631e3df374c6a3012 assets/create/models/threshold_switch/block_floor_0.json -ab3d51ab5dd8ef6c1cad5d65406180915340dd7e assets/create/models/threshold_switch/block_floor_1.json -7a69fb5a6e77b457c381495c951aa0ba9c7df7f0 assets/create/models/threshold_switch/block_floor_2.json -3a6bbc80eea8d824a981e257f8025997946b3260 assets/create/models/threshold_switch/block_floor_3.json -a76fae0415604615be0e822394e0879ca81bf166 assets/create/models/threshold_switch/block_floor_4.json -28ddae97613f1a06885f06faa20b1b2a5bcaa7db assets/create/models/threshold_switch/block_floor_5.json -ab50d142c25c95b0865dd41176cc07a0c76109ac assets/create/models/threshold_switch/block_wall_0.json -be730f505bf937db4b3658b2bd3763b514d295c2 assets/create/models/threshold_switch/block_wall_1.json -f7f6d92ab5dea5a85ec3d570cdd169329dd4225f assets/create/models/threshold_switch/block_wall_2.json -41009d15d22c946a2ed4c6ba98447c3c7cc26315 assets/create/models/threshold_switch/block_wall_3.json -ad3204842128db2c7bebdbf3c40fccc45c82de44 assets/create/models/threshold_switch/block_wall_4.json -197a6ed7fd9514de13daf58605c24a7156c00bd1 assets/create/models/threshold_switch/block_wall_5.json 7dbef6df108c395c2481c8183517c9ea568a7d88 data/create/advancements/recipes/building_blocks/acacia_window.json 8005cd18b80bcee4f5a2111ee78f87d117d6fcdf data/create/advancements/recipes/building_blocks/acacia_window_pane.json a2b7fe4d1b1c8d173da0e6dfcf41379648a92a80 data/create/advancements/recipes/building_blocks/andesite_from_stone_types_andesite_stonecutting.json ab03b83587129f06998ec86e9c417e622baff713 data/create/advancements/recipes/building_blocks/andesite_pillar_from_stone_types_andesite_stonecutting.json 676eca0ab460b460ae76c66926ac91da4612a201 data/create/advancements/recipes/building_blocks/asurine_from_stone_types_asurine_stonecutting.json fb36a2f400347c3291978a49e59374f3ac459f14 data/create/advancements/recipes/building_blocks/asurine_pillar_from_stone_types_asurine_stonecutting.json +a41990f2ea73c54ce3af41a3a61c4fdd4134d3b9 data/create/advancements/recipes/building_blocks/bamboo_window.json +b25b8c230fde8d6d77e8d516bed52236652b5ca6 data/create/advancements/recipes/building_blocks/bamboo_window_pane.json 7a7eb78c70e1591d339115b367cd3114fb7c1799 data/create/advancements/recipes/building_blocks/birch_window.json 6df6a6885c3ebf92f98f105be16d8e0c80da19f0 data/create/advancements/recipes/building_blocks/birch_window_pane.json 0d724aefa51b969dbadb59b1193172a44ecf5644 data/create/advancements/recipes/building_blocks/calcite_from_stone_types_calcite_stonecutting.json 537fe5dffa659e5838379587fbd84f2f641551ea data/create/advancements/recipes/building_blocks/calcite_pillar_from_stone_types_calcite_stonecutting.json +2636ac059b6412a46402cccbe5abe4fb49143662 data/create/advancements/recipes/building_blocks/cherry_window.json +3e08f575543f1e0abea979dbaee643572734788b data/create/advancements/recipes/building_blocks/cherry_window_pane.json +09f332cd34e6a92af9e8e4e757418c7ba8b536da data/create/advancements/recipes/building_blocks/copper_shingles_from_ingots_copper_stonecutting.json 55214a0fd27318b17163cace66c7525785127ef8 data/create/advancements/recipes/building_blocks/copper_shingle_slab.json fb4210dbbfb74459e10da94a540f3bfdf91c4a8d data/create/advancements/recipes/building_blocks/copper_shingle_slab_from_copper_shingles_stonecutting.json 31b04ac1b117fb65f5129c5bbb48e42c1c4c1003 data/create/advancements/recipes/building_blocks/copper_shingle_stairs.json bef4a9a4c2e722d4f086d6b4c9d6fa1d0836ec10 data/create/advancements/recipes/building_blocks/copper_shingle_stairs_from_copper_shingles_stonecutting.json -09f332cd34e6a92af9e8e4e757418c7ba8b536da data/create/advancements/recipes/building_blocks/copper_shingles_from_ingots_copper_stonecutting.json +f66a48f01afb4fa1babee4a8c28b032280c3ac9e data/create/advancements/recipes/building_blocks/copper_tiles_from_ingots_copper_stonecutting.json ef79744ebf31453d1c81789afed7b717837b3515 data/create/advancements/recipes/building_blocks/copper_tile_slab.json 8e9997c43b1c06521fe8d38b04ccb3f04c93d537 data/create/advancements/recipes/building_blocks/copper_tile_slab_from_copper_tiles_stonecutting.json a2609aa8b5453f2294f38c81d26e0b8dad71087d data/create/advancements/recipes/building_blocks/copper_tile_stairs.json d47e46c66bf69e8310e6687716858842e8aed7b5 data/create/advancements/recipes/building_blocks/copper_tile_stairs_from_copper_tiles_stonecutting.json -f66a48f01afb4fa1babee4a8c28b032280c3ac9e data/create/advancements/recipes/building_blocks/copper_tiles_from_ingots_copper_stonecutting.json cc14d10c75ab0fdd7c54db1922e5e56667739fef data/create/advancements/recipes/building_blocks/copycat_panel_from_ingots_zinc_stonecutting.json 55d2812be912c857ff666d581174378857d3bce2 data/create/advancements/recipes/building_blocks/copycat_step_from_ingots_zinc_stonecutting.json +8615fc107b1f4df86711081a9dccac8631b02e6b data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_shingles_from_honeycomb.json 0e0eba8550768ef69087dff8112814f25233fab7 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_shingle_slab_from_honeycomb.json 2c960d55273df4c0c8c33b2c329175b35b18fc8c data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_shingle_stairs_from_honeycomb.json -8615fc107b1f4df86711081a9dccac8631b02e6b data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_shingles_from_honeycomb.json +fa8f3ed9a4c6f0c3cd4c21b0ae4dc8ca4dba8678 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_tiles_from_honeycomb.json d6f2aa7fd10c96f71c47bdabb3e53dc4c4e73706 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_tile_slab_from_honeycomb.json eca165eee20adba1557ccc74ef50ee90311b3019 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_tile_stairs_from_honeycomb.json -fa8f3ed9a4c6f0c3cd4c21b0ae4dc8ca4dba8678 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_tiles_from_honeycomb.json +88a236933e8dfe0d809bda098d16782288c4800c data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_shingles_from_honeycomb.json 301149dabc4dce290b4884f4ed3cb2132123adf0 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_shingle_slab_from_honeycomb.json f360dce7bece72672f2624710c88edbe3e3f8885 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_shingle_stairs_from_honeycomb.json -88a236933e8dfe0d809bda098d16782288c4800c data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_shingles_from_honeycomb.json +bc27959288766492746f41c4810350dcef1b320d data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_tiles_from_honeycomb.json 7ceb4b74ff84ed404518b6cb5e1432dac5903b5f data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_tile_slab_from_honeycomb.json ec1eec3bc25534484cb264134e62b578525422aa data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_tile_stairs_from_honeycomb.json -bc27959288766492746f41c4810350dcef1b320d data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_tiles_from_honeycomb.json +2e8f1da032110e8c5ec375ffd425e5eed7f58cae data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_shingles_from_honeycomb.json e34abb4d51c1d00419fc3d3799ca0d9fe7ea1027 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_shingle_slab_from_honeycomb.json 9471e190beb603f022fb234f2cf35b5b4b93f0c0 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_shingle_stairs_from_honeycomb.json -2e8f1da032110e8c5ec375ffd425e5eed7f58cae data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_shingles_from_honeycomb.json +17fe14b753953a68887cd001fcaa264ef031463f data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_tiles_from_honeycomb.json 2577754364f05264fac325f67597230d01fa0c1d data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_tile_slab_from_honeycomb.json 003e384d9594a4e6ef5678e74f04b56de047dbde data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_tile_stairs_from_honeycomb.json -17fe14b753953a68887cd001fcaa264ef031463f data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_tiles_from_honeycomb.json +5009a82a897a15407fec785005107b0d228fffe7 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_shingles_from_honeycomb.json 70ce32937dcf349dce77fef8022bc0c15863f6a6 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_shingle_slab_from_honeycomb.json 1fc498238dcc2705152573ba7f74bb50e7e66ca7 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_shingle_stairs_from_honeycomb.json -5009a82a897a15407fec785005107b0d228fffe7 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_shingles_from_honeycomb.json +d12aa3dd5457327224fd007211878eec21043971 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_tiles_from_honeycomb.json 6f461d7036de914c636b7916dc798775ccf25be1 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_tile_slab_from_honeycomb.json 3bc9efcddecd23fd06c6056a0ee7b937959cecc0 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_tile_stairs_from_honeycomb.json -d12aa3dd5457327224fd007211878eec21043971 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_tiles_from_honeycomb.json 3064c52dea808a00c211bfedb96106b563f480da data/create/advancements/recipes/building_blocks/crafting/kinetics/black_seat.json f07a0b21db200ab68a7df02db519869f68953286 data/create/advancements/recipes/building_blocks/crafting/kinetics/black_seat_from_other_seat.json 80ac4db5c53c7efc2666a7abb4e2e876c5f86588 data/create/advancements/recipes/building_blocks/crafting/kinetics/blue_seat.json @@ -2383,10 +2641,75 @@ fc6babcc211f6ed7f231ed8da12f42f0ab858f4f data/create/advancements/recipes/buildi 8ef5d43ae4344f548efb55793ecc889cc011c0a1 data/create/advancements/recipes/building_blocks/crafting/kinetics/white_seat_from_other_seat.json 415435d450d42d97335416c6faa12538dc8e0fb6 data/create/advancements/recipes/building_blocks/crafting/kinetics/yellow_seat.json e71219bcfe8c712fc7e7368c2933533b3c5ef121 data/create/advancements/recipes/building_blocks/crafting/kinetics/yellow_seat_from_other_seat.json +2171371d683e03c5d6b5b7e89be6c674804adab7 data/create/advancements/recipes/building_blocks/crafting/logistics/black_postbox.json +f62a87aaa90fd82730c7bc0b2f6fcecfbdaa8042 data/create/advancements/recipes/building_blocks/crafting/logistics/black_postbox_from_other_postbox.json +f598f4689e6e02c7e4325085ee3bb9f43a96377e data/create/advancements/recipes/building_blocks/crafting/logistics/black_table_cloth.json +123399acf7acf989d92735600d74c14ef5849ffc data/create/advancements/recipes/building_blocks/crafting/logistics/black_table_cloth_from_other_table_cloth.json +f2dda3b77262a1d14ab3bc39fbe0bc10a519b947 data/create/advancements/recipes/building_blocks/crafting/logistics/blue_postbox.json +8997db26c93945f3ef6deb87b51c12e2f28789b9 data/create/advancements/recipes/building_blocks/crafting/logistics/blue_postbox_from_other_postbox.json +06207bb81c2ee103d79dc8b8f9d38119b6b6bf55 data/create/advancements/recipes/building_blocks/crafting/logistics/blue_table_cloth.json +5383fc14b57fb591ebfee9962a774c354f5e99f4 data/create/advancements/recipes/building_blocks/crafting/logistics/blue_table_cloth_from_other_table_cloth.json +29f34e0859d0ff8476dcd23d3076d0ed27656a06 data/create/advancements/recipes/building_blocks/crafting/logistics/brown_postbox.json +6fafc9beff44de0c4f0636dd2f24580b5a357621 data/create/advancements/recipes/building_blocks/crafting/logistics/brown_postbox_from_other_postbox.json +5237f007a87e119f9083234f825ac757b9fd7883 data/create/advancements/recipes/building_blocks/crafting/logistics/brown_table_cloth.json +366e5c9fdcd9cf9d1189eed5074b3e7cb1759970 data/create/advancements/recipes/building_blocks/crafting/logistics/brown_table_cloth_from_other_table_cloth.json +35afab0036df98cc60d4e728492694a416c75309 data/create/advancements/recipes/building_blocks/crafting/logistics/cyan_postbox.json +661c1356fe0c8a13c11c6026cc2526e10dcd039f data/create/advancements/recipes/building_blocks/crafting/logistics/cyan_postbox_from_other_postbox.json +607e923aeb6ce8b346f4da35ed67a17c69df570f data/create/advancements/recipes/building_blocks/crafting/logistics/cyan_table_cloth.json +ec07ec408fb4beb8189f827d8c5b53007944c693 data/create/advancements/recipes/building_blocks/crafting/logistics/cyan_table_cloth_from_other_table_cloth.json +958fab294f6a55a9ae18b21196600d7764de095a data/create/advancements/recipes/building_blocks/crafting/logistics/gray_postbox.json +93d63182b51e66a76dbea7f2f27ac0ada953cfa8 data/create/advancements/recipes/building_blocks/crafting/logistics/gray_postbox_from_other_postbox.json +da207311c49105b9bb3cb7cf53ebdb8d0121f1a1 data/create/advancements/recipes/building_blocks/crafting/logistics/gray_table_cloth.json +6102c4f5d72c16b2b2e6aedd53c91c9a00585620 data/create/advancements/recipes/building_blocks/crafting/logistics/gray_table_cloth_from_other_table_cloth.json +e23b3d1e71a5b81093f6e71ad3ae1fa60923ad86 data/create/advancements/recipes/building_blocks/crafting/logistics/green_postbox.json +0be2943dfe2c6a98092dd44cbe2437b9c142f81a data/create/advancements/recipes/building_blocks/crafting/logistics/green_postbox_from_other_postbox.json +7c091e9a30e29cdb934c0bdb9c04b57f0a9a369a data/create/advancements/recipes/building_blocks/crafting/logistics/green_table_cloth.json +7c5cbfaccf7d14241c97c04fe5baf7f6031cc620 data/create/advancements/recipes/building_blocks/crafting/logistics/green_table_cloth_from_other_table_cloth.json +8f4bc79097e67045ec7b7394d47f845809f9851f data/create/advancements/recipes/building_blocks/crafting/logistics/light_blue_postbox.json +1a4b12a60b3b971fd7222a90425908b33fa7985d data/create/advancements/recipes/building_blocks/crafting/logistics/light_blue_postbox_from_other_postbox.json +166ee7c019768be4b9494608d13a7265e1e97a80 data/create/advancements/recipes/building_blocks/crafting/logistics/light_blue_table_cloth.json +64189712c7c89ddb53860e4ecbbb1cfe84173e90 data/create/advancements/recipes/building_blocks/crafting/logistics/light_blue_table_cloth_from_other_table_cloth.json +12b80ed2b31d3b65a831463538fc8d7788d9a77a data/create/advancements/recipes/building_blocks/crafting/logistics/light_gray_postbox.json +bd0ebfb2379f37aeb3c03d39a6d8aa005ef3d4cf data/create/advancements/recipes/building_blocks/crafting/logistics/light_gray_postbox_from_other_postbox.json +e1ce7076edd98e38e8d749c046ed6d289dae204e data/create/advancements/recipes/building_blocks/crafting/logistics/light_gray_table_cloth.json +70e7e4df0f8b00490ac85cc7c38e501baf799d88 data/create/advancements/recipes/building_blocks/crafting/logistics/light_gray_table_cloth_from_other_table_cloth.json +39182b8805ecd20842cd9d94825f5504d0bd8a0a data/create/advancements/recipes/building_blocks/crafting/logistics/lime_postbox.json +d7ddb4841e306859b471be6c32f91d4bd471eae6 data/create/advancements/recipes/building_blocks/crafting/logistics/lime_postbox_from_other_postbox.json +96f70bf632c5ec0dcead6ea9b03967a92321c767 data/create/advancements/recipes/building_blocks/crafting/logistics/lime_table_cloth.json +e0192fb9ef0422d25deaa1801228357f135097cc data/create/advancements/recipes/building_blocks/crafting/logistics/lime_table_cloth_from_other_table_cloth.json +e6b6ba626266d2ea84cce1a389df27cd44eeb15b data/create/advancements/recipes/building_blocks/crafting/logistics/magenta_postbox.json +7da22d10a137d0e1a953c2cb6b0c15f64cf4f453 data/create/advancements/recipes/building_blocks/crafting/logistics/magenta_postbox_from_other_postbox.json +416ef49b1c7cd1738c7329901dacad1688febae6 data/create/advancements/recipes/building_blocks/crafting/logistics/magenta_table_cloth.json +fc94c20112d6a0a8c85dd63dc6b036d7a8d6c9d4 data/create/advancements/recipes/building_blocks/crafting/logistics/magenta_table_cloth_from_other_table_cloth.json +13b2e283564460e095069fb9723a6d4cdcee6931 data/create/advancements/recipes/building_blocks/crafting/logistics/orange_postbox.json +1f38371e0896d74abeb6616dde615345d57e3f1d data/create/advancements/recipes/building_blocks/crafting/logistics/orange_postbox_from_other_postbox.json +1c49627c32669b053945c1dc6b99868e03224a05 data/create/advancements/recipes/building_blocks/crafting/logistics/orange_table_cloth.json +0b302e3ab914de973e1a836b7babb0bfb89b8e79 data/create/advancements/recipes/building_blocks/crafting/logistics/orange_table_cloth_from_other_table_cloth.json +f7ec699ff45bba54777c0b824a30b5e9a72e093a data/create/advancements/recipes/building_blocks/crafting/logistics/pink_postbox.json +8e1188506d566763fddf96d5452aae6c409504e9 data/create/advancements/recipes/building_blocks/crafting/logistics/pink_postbox_from_other_postbox.json +fa809c6e9eb3f7ff752976516ad57fa06cc2df6f data/create/advancements/recipes/building_blocks/crafting/logistics/pink_table_cloth.json +dde27c90e1a922b75ac35939d44ce4a3c2557371 data/create/advancements/recipes/building_blocks/crafting/logistics/pink_table_cloth_from_other_table_cloth.json +b99839abaeec938e903068ade927913e752df6ae data/create/advancements/recipes/building_blocks/crafting/logistics/purple_postbox.json +5ff2cf3a429f02f067ee0cfe5317937e69b816fd data/create/advancements/recipes/building_blocks/crafting/logistics/purple_postbox_from_other_postbox.json +9ba73de4e8069ecaf76b87b1746751264e8924b4 data/create/advancements/recipes/building_blocks/crafting/logistics/purple_table_cloth.json +8d27b828d4a39ccae7fb77ffd5774458850cb7ef data/create/advancements/recipes/building_blocks/crafting/logistics/purple_table_cloth_from_other_table_cloth.json +a9f13b04c89f2511b4ad83a14d6a1c64c16da745 data/create/advancements/recipes/building_blocks/crafting/logistics/red_postbox.json +6cb3089269221dc534c514bbcc1377a5199a273f data/create/advancements/recipes/building_blocks/crafting/logistics/red_postbox_from_other_postbox.json +675b04c5050796702e0fa970bc5f4a4153d12be2 data/create/advancements/recipes/building_blocks/crafting/logistics/red_table_cloth.json +489e033281e72dd1dee6a16bdee524f58a7b6679 data/create/advancements/recipes/building_blocks/crafting/logistics/red_table_cloth_from_other_table_cloth.json +ab72539b2ebe8cc2874a62dc32463421c9c685d1 data/create/advancements/recipes/building_blocks/crafting/logistics/white_postbox.json +b4bd005477650d6f6b5bbc244e5b25f8ad9f5f14 data/create/advancements/recipes/building_blocks/crafting/logistics/white_postbox_from_other_postbox.json +84040091909e565b1390576e3ed58cdc9735f24e data/create/advancements/recipes/building_blocks/crafting/logistics/white_table_cloth.json +113d0c96d61d27e419ef414550667379e37c5bf6 data/create/advancements/recipes/building_blocks/crafting/logistics/white_table_cloth_from_other_table_cloth.json +7d2c65210628be4a3d0c09dbf1e6fbbe868a9e56 data/create/advancements/recipes/building_blocks/crafting/logistics/yellow_postbox.json +9c2e00b2ac4f81f0cac0d9be6b06a0d077a23310 data/create/advancements/recipes/building_blocks/crafting/logistics/yellow_postbox_from_other_postbox.json +f116a1d549313a99135282a2a13262aada1a1dee data/create/advancements/recipes/building_blocks/crafting/logistics/yellow_table_cloth.json +2d0f3dc8fb9620ef3085ebbb932c7f0705ed893d data/create/advancements/recipes/building_blocks/crafting/logistics/yellow_table_cloth_from_other_table_cloth.json f3188b24f8108be4219016689a4768f826b4fef3 data/create/advancements/recipes/building_blocks/crimsite_from_stone_types_crimsite_stonecutting.json e88373b83226d860b0c2131213f5d3b09f31ab96 data/create/advancements/recipes/building_blocks/crimsite_pillar_from_stone_types_crimsite_stonecutting.json 09f7122cf360fd56bde2b1659bbed526f9a119c4 data/create/advancements/recipes/building_blocks/crimson_window.json b5234c6050bc0c6fe872a5ddc87d46ba39e07971 data/create/advancements/recipes/building_blocks/crimson_window_pane.json +b32f4345517c3c7299a06489325bd85f987145dc data/create/advancements/recipes/building_blocks/cut_andesite_bricks_from_stone_types_andesite_stonecutting.json 22fe2e61d7e9836d9f71c39bfbba50efc2fa184d data/create/advancements/recipes/building_blocks/cut_andesite_brick_slab.json 6d8d28364f1016dfd1d7cbe4a2637e2b6224e4d8 data/create/advancements/recipes/building_blocks/cut_andesite_brick_slab_from_stone_types_andesite_stonecutting.json 39e904f66d2194de5437b5da2f8db8b6f03d78f4 data/create/advancements/recipes/building_blocks/cut_andesite_brick_slab_recycling.json @@ -2394,7 +2717,6 @@ b5234c6050bc0c6fe872a5ddc87d46ba39e07971 data/create/advancements/recipes/buildi 480c696956b99c96cbaf46e7dad9711c40680ec8 data/create/advancements/recipes/building_blocks/cut_andesite_brick_stairs_from_stone_types_andesite_stonecutting.json 8d504cdb99f5dc59bef5ff35d0b443f2f4ba21d2 data/create/advancements/recipes/building_blocks/cut_andesite_brick_wall.json e1b8e5906d54368c98867b83143dc7acc7b0aa28 data/create/advancements/recipes/building_blocks/cut_andesite_brick_wall_from_stone_types_andesite_stonecutting.json -b32f4345517c3c7299a06489325bd85f987145dc data/create/advancements/recipes/building_blocks/cut_andesite_bricks_from_stone_types_andesite_stonecutting.json d5b44158f9a98d874d941fc4df99de7a2657af21 data/create/advancements/recipes/building_blocks/cut_andesite_from_stone_types_andesite_stonecutting.json c11998f554bbd42efdbdf58cf8efe5bcf69230de data/create/advancements/recipes/building_blocks/cut_andesite_slab.json 1f457c0e816e4dd70e1a960015d2004814d11926 data/create/advancements/recipes/building_blocks/cut_andesite_slab_from_stone_types_andesite_stonecutting.json @@ -2403,6 +2725,7 @@ a4d7adf49472a2069bad72defd39b111b83def3d data/create/advancements/recipes/buildi 6d38bb2b9812761c594ebdf717284ba8d32e88bc data/create/advancements/recipes/building_blocks/cut_andesite_stairs_from_stone_types_andesite_stonecutting.json 2f6b2296b11e0e743d68749e65af5ffa0f374998 data/create/advancements/recipes/building_blocks/cut_andesite_wall.json caf3b1c62d0f8df3ce126535f0566c899577bedb data/create/advancements/recipes/building_blocks/cut_andesite_wall_from_stone_types_andesite_stonecutting.json +54188623046e989d21e6e155933e4084fb2882c4 data/create/advancements/recipes/building_blocks/cut_asurine_bricks_from_stone_types_asurine_stonecutting.json 536a2bed2ed1e7e249886ef376c96a8d5a1facdc data/create/advancements/recipes/building_blocks/cut_asurine_brick_slab.json a4e833cadfbb82222a70d66524e804c83ea13f7b data/create/advancements/recipes/building_blocks/cut_asurine_brick_slab_from_stone_types_asurine_stonecutting.json 610163ac2f4b06121931a81ac4b3df39ece61998 data/create/advancements/recipes/building_blocks/cut_asurine_brick_slab_recycling.json @@ -2410,7 +2733,6 @@ a4e833cadfbb82222a70d66524e804c83ea13f7b data/create/advancements/recipes/buildi f92f31e80cc026160217afb6c757987f75ed0b33 data/create/advancements/recipes/building_blocks/cut_asurine_brick_stairs_from_stone_types_asurine_stonecutting.json fa6dc7eaa32652a00a7217ae25967de0791088b6 data/create/advancements/recipes/building_blocks/cut_asurine_brick_wall.json 33f361369bfd92f53b3e40c837b336edd04a26e9 data/create/advancements/recipes/building_blocks/cut_asurine_brick_wall_from_stone_types_asurine_stonecutting.json -54188623046e989d21e6e155933e4084fb2882c4 data/create/advancements/recipes/building_blocks/cut_asurine_bricks_from_stone_types_asurine_stonecutting.json a6b871faa10badaaaa1a0ebbba94c4f2f627c43f data/create/advancements/recipes/building_blocks/cut_asurine_from_stone_types_asurine_stonecutting.json 719e1d4fea3457f2990be6a5d6cd87915d546217 data/create/advancements/recipes/building_blocks/cut_asurine_slab.json 586918291dda711c79941cf484cb62dbb853a271 data/create/advancements/recipes/building_blocks/cut_asurine_slab_from_stone_types_asurine_stonecutting.json @@ -2419,6 +2741,7 @@ bd2a630d242ae9c89b071b0401285068071a346c data/create/advancements/recipes/buildi 03d7b1609d161043e28661d74f53b06d4408f561 data/create/advancements/recipes/building_blocks/cut_asurine_stairs_from_stone_types_asurine_stonecutting.json cba4a6feaf695e665204cac36f9109ba941b12a6 data/create/advancements/recipes/building_blocks/cut_asurine_wall.json 3327651dd3f2fd778abdcfe70d25137d916f3def data/create/advancements/recipes/building_blocks/cut_asurine_wall_from_stone_types_asurine_stonecutting.json +44873f9d05abde7d52a6eacdf3573d8b69c69452 data/create/advancements/recipes/building_blocks/cut_calcite_bricks_from_stone_types_calcite_stonecutting.json a070ffe63c182b33c4c6faedb391f51a209c0e27 data/create/advancements/recipes/building_blocks/cut_calcite_brick_slab.json 7ba1e7add81422599f798153e4fd069e9fbfdebf data/create/advancements/recipes/building_blocks/cut_calcite_brick_slab_from_stone_types_calcite_stonecutting.json f5e80ec393c306485d666d6f9f91c55d9f1ba592 data/create/advancements/recipes/building_blocks/cut_calcite_brick_slab_recycling.json @@ -2426,7 +2749,6 @@ f5e80ec393c306485d666d6f9f91c55d9f1ba592 data/create/advancements/recipes/buildi 627f85aa63133cf95dd828092e0232b9ec8acfd5 data/create/advancements/recipes/building_blocks/cut_calcite_brick_stairs_from_stone_types_calcite_stonecutting.json d8870e522a68274cc90eab07ea17b7b6cdc5a16c data/create/advancements/recipes/building_blocks/cut_calcite_brick_wall.json cdf5927f3c1b3ef8904f38f66317412799e189fb data/create/advancements/recipes/building_blocks/cut_calcite_brick_wall_from_stone_types_calcite_stonecutting.json -44873f9d05abde7d52a6eacdf3573d8b69c69452 data/create/advancements/recipes/building_blocks/cut_calcite_bricks_from_stone_types_calcite_stonecutting.json 9f8c31b0db2aab8f1c8f42bcef15a74bc36887d4 data/create/advancements/recipes/building_blocks/cut_calcite_from_stone_types_calcite_stonecutting.json 857666ad1c6a5cc886f6896a18f560098afaa67b data/create/advancements/recipes/building_blocks/cut_calcite_slab.json c55074cd091b0e078105abdc940c62afa8984265 data/create/advancements/recipes/building_blocks/cut_calcite_slab_from_stone_types_calcite_stonecutting.json @@ -2435,6 +2757,7 @@ c55074cd091b0e078105abdc940c62afa8984265 data/create/advancements/recipes/buildi ba3378e1d08de2af0b2a725727cf9f68bda60044 data/create/advancements/recipes/building_blocks/cut_calcite_stairs_from_stone_types_calcite_stonecutting.json db5f4e1eee91c2a65d36164c20aba0e9d3a502ae data/create/advancements/recipes/building_blocks/cut_calcite_wall.json 19de370083d2cf1234c9c4e6ff45d85ef34a1ac8 data/create/advancements/recipes/building_blocks/cut_calcite_wall_from_stone_types_calcite_stonecutting.json +b9a2edda241f6e0677a2003300f0be5d3ff8f4b0 data/create/advancements/recipes/building_blocks/cut_crimsite_bricks_from_stone_types_crimsite_stonecutting.json 9fda0e6edde197a9c28a854419a2a07e323b6b53 data/create/advancements/recipes/building_blocks/cut_crimsite_brick_slab.json 2da3f139759be7eea552885b2063a0e2dfc647b1 data/create/advancements/recipes/building_blocks/cut_crimsite_brick_slab_from_stone_types_crimsite_stonecutting.json 62d928c8ab2e09a3f87adacb5adb1a5ddc1d2a7b data/create/advancements/recipes/building_blocks/cut_crimsite_brick_slab_recycling.json @@ -2442,7 +2765,6 @@ db5f4e1eee91c2a65d36164c20aba0e9d3a502ae data/create/advancements/recipes/buildi 89850244feb8a3293ba96702b7a56a4bea84e1f3 data/create/advancements/recipes/building_blocks/cut_crimsite_brick_stairs_from_stone_types_crimsite_stonecutting.json 267cab789c73d474299542fb0719967501fcf0c9 data/create/advancements/recipes/building_blocks/cut_crimsite_brick_wall.json 27007676b86eb8a3498982d8b5e68495b84d62d5 data/create/advancements/recipes/building_blocks/cut_crimsite_brick_wall_from_stone_types_crimsite_stonecutting.json -b9a2edda241f6e0677a2003300f0be5d3ff8f4b0 data/create/advancements/recipes/building_blocks/cut_crimsite_bricks_from_stone_types_crimsite_stonecutting.json a88d252d4e634ff194daa3ff98fd7e965e3ed09a data/create/advancements/recipes/building_blocks/cut_crimsite_from_stone_types_crimsite_stonecutting.json f703136e1783a42252bc1d89c31e5563cbdff583 data/create/advancements/recipes/building_blocks/cut_crimsite_slab.json 3330d332462da22de48d07b62277c1df8e646a3e data/create/advancements/recipes/building_blocks/cut_crimsite_slab_from_stone_types_crimsite_stonecutting.json @@ -2451,6 +2773,7 @@ c2707e5969f0c554537dda9d3e2a4c13e19863c3 data/create/advancements/recipes/buildi e9ba513178090b020525e72468a0450e225da779 data/create/advancements/recipes/building_blocks/cut_crimsite_stairs_from_stone_types_crimsite_stonecutting.json 7fb5ce65b7b5c2d76b4306d407aaa6eefe07b7e5 data/create/advancements/recipes/building_blocks/cut_crimsite_wall.json a83d5b669f92bd833af2768d2cf5d4797a86b63c data/create/advancements/recipes/building_blocks/cut_crimsite_wall_from_stone_types_crimsite_stonecutting.json +bc9eb21df37df4b69e5d202b3b770698a16f4413 data/create/advancements/recipes/building_blocks/cut_deepslate_bricks_from_stone_types_deepslate_stonecutting.json 2c380e8ddc83cef4213f136ff7a196d861728914 data/create/advancements/recipes/building_blocks/cut_deepslate_brick_slab.json 87b5dfc1e61fabe4e7661bea0d7a56cb75197a81 data/create/advancements/recipes/building_blocks/cut_deepslate_brick_slab_from_stone_types_deepslate_stonecutting.json 09cde6df1120cc5f5f129023885f323b4d1eeae9 data/create/advancements/recipes/building_blocks/cut_deepslate_brick_slab_recycling.json @@ -2458,7 +2781,6 @@ a83d5b669f92bd833af2768d2cf5d4797a86b63c data/create/advancements/recipes/buildi 28e15fe2c377540cb631f6648f49090f234e7704 data/create/advancements/recipes/building_blocks/cut_deepslate_brick_stairs_from_stone_types_deepslate_stonecutting.json d2b34f455ab0053f24a4f9dec7dcce45832ef25b data/create/advancements/recipes/building_blocks/cut_deepslate_brick_wall.json 7b174b65b813b4a9ca507e71fa142931e074f336 data/create/advancements/recipes/building_blocks/cut_deepslate_brick_wall_from_stone_types_deepslate_stonecutting.json -bc9eb21df37df4b69e5d202b3b770698a16f4413 data/create/advancements/recipes/building_blocks/cut_deepslate_bricks_from_stone_types_deepslate_stonecutting.json 83db3f5b46c996481b930974bddba75c82c115af data/create/advancements/recipes/building_blocks/cut_deepslate_from_stone_types_deepslate_stonecutting.json 8e8816aad8212c3557e77cc01df551fe1a0a306d data/create/advancements/recipes/building_blocks/cut_deepslate_slab.json 14ea447072200733dd9551a5ac6a9544593dd9f7 data/create/advancements/recipes/building_blocks/cut_deepslate_slab_from_stone_types_deepslate_stonecutting.json @@ -2467,6 +2789,7 @@ c7870abb459c8b174c380282ae211a87ab252521 data/create/advancements/recipes/buildi 4f157401a3019c96cc6ae5a0036f31351c651fbb data/create/advancements/recipes/building_blocks/cut_deepslate_stairs_from_stone_types_deepslate_stonecutting.json 9ae9635fa129aab54a7ec971b9cc61d300d3d53e data/create/advancements/recipes/building_blocks/cut_deepslate_wall.json 9b5df53000c79a7b20e3a1888e003b704809feda data/create/advancements/recipes/building_blocks/cut_deepslate_wall_from_stone_types_deepslate_stonecutting.json +fdef99789ca74623b00b05be2f975b63831645db data/create/advancements/recipes/building_blocks/cut_diorite_bricks_from_stone_types_diorite_stonecutting.json 30a00465dc9b19d8024146e2c2d6b9f41562da30 data/create/advancements/recipes/building_blocks/cut_diorite_brick_slab.json a55e7daf48a487d74b4a01e30b80968094154d2b data/create/advancements/recipes/building_blocks/cut_diorite_brick_slab_from_stone_types_diorite_stonecutting.json e445a3d8fd00f5e4f2ee56c797d8abf548598447 data/create/advancements/recipes/building_blocks/cut_diorite_brick_slab_recycling.json @@ -2474,7 +2797,6 @@ b421f24513612dd7a5d8977d7bff122fd5cf9522 data/create/advancements/recipes/buildi 3fe00adac35beeda79b7f9d930a1f13b033c0f12 data/create/advancements/recipes/building_blocks/cut_diorite_brick_stairs_from_stone_types_diorite_stonecutting.json 6d2235b8587863107a6d1a0818c81ee3dc217cdf data/create/advancements/recipes/building_blocks/cut_diorite_brick_wall.json 0ec4b69e98adf961f5d4d63700f11ad66a4116b5 data/create/advancements/recipes/building_blocks/cut_diorite_brick_wall_from_stone_types_diorite_stonecutting.json -fdef99789ca74623b00b05be2f975b63831645db data/create/advancements/recipes/building_blocks/cut_diorite_bricks_from_stone_types_diorite_stonecutting.json c9f52e0661fdc266f8429faf1570124fecfa2d6a data/create/advancements/recipes/building_blocks/cut_diorite_from_stone_types_diorite_stonecutting.json c7b73ddec6402e8b5ff5daedbbbc74f882338a8e data/create/advancements/recipes/building_blocks/cut_diorite_slab.json 46c841e5aae99106cbc28026dcfec946976127e5 data/create/advancements/recipes/building_blocks/cut_diorite_slab_from_stone_types_diorite_stonecutting.json @@ -2483,6 +2805,7 @@ ce67a5fae622955ad795e2b3d14c159a4c47b936 data/create/advancements/recipes/buildi 3b7ec28df80ea9cf87980b2c2184858ba6152a3f data/create/advancements/recipes/building_blocks/cut_diorite_stairs_from_stone_types_diorite_stonecutting.json c8fe9ab53eda2cdbff08678ebb577c169ea61a91 data/create/advancements/recipes/building_blocks/cut_diorite_wall.json 050f67b5a662bea3ef972521ef7f81c2ba99015c data/create/advancements/recipes/building_blocks/cut_diorite_wall_from_stone_types_diorite_stonecutting.json +b60683fdd629b201f40a6f9bb6594df7c5ac13f1 data/create/advancements/recipes/building_blocks/cut_dripstone_bricks_from_stone_types_dripstone_stonecutting.json 1e0d39ed56e2ab4eac084f26a1c6de905db29220 data/create/advancements/recipes/building_blocks/cut_dripstone_brick_slab.json 020cbc4c8063d186d3f5c9ece429e4cdff53cf63 data/create/advancements/recipes/building_blocks/cut_dripstone_brick_slab_from_stone_types_dripstone_stonecutting.json b44c9e7f9f62ffffb5566901e0a22010ba76641c data/create/advancements/recipes/building_blocks/cut_dripstone_brick_slab_recycling.json @@ -2490,7 +2813,6 @@ b44c9e7f9f62ffffb5566901e0a22010ba76641c data/create/advancements/recipes/buildi 466fbdf7de8dacd1032fb7af690862bb68707876 data/create/advancements/recipes/building_blocks/cut_dripstone_brick_stairs_from_stone_types_dripstone_stonecutting.json 253b54c191c933e88fa6a9b4e7c94340082c7d60 data/create/advancements/recipes/building_blocks/cut_dripstone_brick_wall.json e176568e3de8b8ca17a788f4cea89002b5ad2d1d data/create/advancements/recipes/building_blocks/cut_dripstone_brick_wall_from_stone_types_dripstone_stonecutting.json -b60683fdd629b201f40a6f9bb6594df7c5ac13f1 data/create/advancements/recipes/building_blocks/cut_dripstone_bricks_from_stone_types_dripstone_stonecutting.json ddc5a16cf0d2790d8133ab6801f4c55317d776e4 data/create/advancements/recipes/building_blocks/cut_dripstone_from_stone_types_dripstone_stonecutting.json 6e40c9af0747a8b3adb805ddd8fbb947aedb408c data/create/advancements/recipes/building_blocks/cut_dripstone_slab.json e7761f71f797d2e62dc0860cbd5153955b9be86c data/create/advancements/recipes/building_blocks/cut_dripstone_slab_from_stone_types_dripstone_stonecutting.json @@ -2499,6 +2821,7 @@ a199a9f78a44f4313a922b317893c68f743dc1a9 data/create/advancements/recipes/buildi b68a95a565ee9a3aec017431aa5b8cc6fffec3ef data/create/advancements/recipes/building_blocks/cut_dripstone_stairs_from_stone_types_dripstone_stonecutting.json a4287f34f95c008bdf7c0a886d05c3960665147b data/create/advancements/recipes/building_blocks/cut_dripstone_wall.json 76f5d4a6a9895064b15ae0c0f27a138bb3d57dbf data/create/advancements/recipes/building_blocks/cut_dripstone_wall_from_stone_types_dripstone_stonecutting.json +24cc01d592faf2bad57fc9b9a1de52c50d225446 data/create/advancements/recipes/building_blocks/cut_granite_bricks_from_stone_types_granite_stonecutting.json 83148f66dc7418740b6f9b6a660b0b9306d87f7c data/create/advancements/recipes/building_blocks/cut_granite_brick_slab.json d982802fc11848c87022f7bf05cecf090953002a data/create/advancements/recipes/building_blocks/cut_granite_brick_slab_from_stone_types_granite_stonecutting.json 6b8fa161725a4e2106226c3591a23def74398f48 data/create/advancements/recipes/building_blocks/cut_granite_brick_slab_recycling.json @@ -2506,7 +2829,6 @@ ce1c81b730b3acef9673f41769339f7d68385348 data/create/advancements/recipes/buildi e9732e3beaefbc6a457e0c4fd61f17f429f1cd8c data/create/advancements/recipes/building_blocks/cut_granite_brick_stairs_from_stone_types_granite_stonecutting.json 4f403aee2aae6aa0fc334b434cf5ade362153329 data/create/advancements/recipes/building_blocks/cut_granite_brick_wall.json 625c8849b5c07835b49dcb4322ec44586628a700 data/create/advancements/recipes/building_blocks/cut_granite_brick_wall_from_stone_types_granite_stonecutting.json -24cc01d592faf2bad57fc9b9a1de52c50d225446 data/create/advancements/recipes/building_blocks/cut_granite_bricks_from_stone_types_granite_stonecutting.json 07e6f3835c3683f007fd25140d671b668706484d data/create/advancements/recipes/building_blocks/cut_granite_from_stone_types_granite_stonecutting.json 2f33b7f82e977eb3fd0e0283313b1066eadadd18 data/create/advancements/recipes/building_blocks/cut_granite_slab.json a1b406ca98c2ba7d5225afea8463d586fc538428 data/create/advancements/recipes/building_blocks/cut_granite_slab_from_stone_types_granite_stonecutting.json @@ -2515,6 +2837,7 @@ af12a2d8f8bb2382f55135df8cfec00692a65fe3 data/create/advancements/recipes/buildi 284087e07acd28aa869d5433375e412f083108e9 data/create/advancements/recipes/building_blocks/cut_granite_stairs_from_stone_types_granite_stonecutting.json dbfb50c3d5048b1f5d8d74f39c389ecec81392d7 data/create/advancements/recipes/building_blocks/cut_granite_wall.json 6b287be7a900dbd715290b069a89ab226d6cec9c data/create/advancements/recipes/building_blocks/cut_granite_wall_from_stone_types_granite_stonecutting.json +4ef0a018dcf0b470061a4b1dbadc27684d8d467f data/create/advancements/recipes/building_blocks/cut_limestone_bricks_from_stone_types_limestone_stonecutting.json b0ade7dab7eb095f07882e4c19884162f18e704c data/create/advancements/recipes/building_blocks/cut_limestone_brick_slab.json 4fc2dc61d62a394cebc91e36745699eeaee650e7 data/create/advancements/recipes/building_blocks/cut_limestone_brick_slab_from_stone_types_limestone_stonecutting.json b8ec42f06ce9eb696643154d16150a223bd5ec65 data/create/advancements/recipes/building_blocks/cut_limestone_brick_slab_recycling.json @@ -2522,7 +2845,6 @@ d0b19c27309cd45d08a6a0cd779f1930bc2e7469 data/create/advancements/recipes/buildi 9f65617405592d587a940ff7513fcb34ca6ab423 data/create/advancements/recipes/building_blocks/cut_limestone_brick_stairs_from_stone_types_limestone_stonecutting.json 281e2ddcb58b603dea8f305ed6c8ddea98d0d030 data/create/advancements/recipes/building_blocks/cut_limestone_brick_wall.json 7b0ab5095a7d2b3e876a8c8b990161851c1c58c2 data/create/advancements/recipes/building_blocks/cut_limestone_brick_wall_from_stone_types_limestone_stonecutting.json -4ef0a018dcf0b470061a4b1dbadc27684d8d467f data/create/advancements/recipes/building_blocks/cut_limestone_bricks_from_stone_types_limestone_stonecutting.json f8663a45d71c52a3982c75bbfb61653c8d2fd668 data/create/advancements/recipes/building_blocks/cut_limestone_from_stone_types_limestone_stonecutting.json 9e22972cd4f2d673cfcf07a597f6a14402c91913 data/create/advancements/recipes/building_blocks/cut_limestone_slab.json 388a57bb88582eda9fef904a530f72b066d24e7d data/create/advancements/recipes/building_blocks/cut_limestone_slab_from_stone_types_limestone_stonecutting.json @@ -2531,6 +2853,7 @@ f8663a45d71c52a3982c75bbfb61653c8d2fd668 data/create/advancements/recipes/buildi b6dc46dca3fc039fd0fe53ab791731cb085c3b62 data/create/advancements/recipes/building_blocks/cut_limestone_stairs_from_stone_types_limestone_stonecutting.json a9382d5f876542bf4fa8aed605352daca4ad2f6f data/create/advancements/recipes/building_blocks/cut_limestone_wall.json 69d9116786c53cb3155bed4580d4b01bfe638243 data/create/advancements/recipes/building_blocks/cut_limestone_wall_from_stone_types_limestone_stonecutting.json +1f8ee1a91937295484d5c2fe0186a617589c1761 data/create/advancements/recipes/building_blocks/cut_ochrum_bricks_from_stone_types_ochrum_stonecutting.json a51d6ebed8e21e8808ccfbe9f9540291504da59a data/create/advancements/recipes/building_blocks/cut_ochrum_brick_slab.json eb08f00651259f83f6eced0f90dd8df0e9d0d508 data/create/advancements/recipes/building_blocks/cut_ochrum_brick_slab_from_stone_types_ochrum_stonecutting.json a189e0549723cefbd19a147274cd79909dca2b70 data/create/advancements/recipes/building_blocks/cut_ochrum_brick_slab_recycling.json @@ -2538,7 +2861,6 @@ a5dc9e74ad0d18d83bad3aab8c5e2768355a2370 data/create/advancements/recipes/buildi 27a5331727199b8b8f2dd6c581e25d17d12fc1ba data/create/advancements/recipes/building_blocks/cut_ochrum_brick_stairs_from_stone_types_ochrum_stonecutting.json 648e532441c664310047c5c9c78833d2eaea5920 data/create/advancements/recipes/building_blocks/cut_ochrum_brick_wall.json 053256b7b154ba5c10d2483d86658f132296e8f5 data/create/advancements/recipes/building_blocks/cut_ochrum_brick_wall_from_stone_types_ochrum_stonecutting.json -1f8ee1a91937295484d5c2fe0186a617589c1761 data/create/advancements/recipes/building_blocks/cut_ochrum_bricks_from_stone_types_ochrum_stonecutting.json 6abb6e36229685ca26ee31b5db3074a07453435e data/create/advancements/recipes/building_blocks/cut_ochrum_from_stone_types_ochrum_stonecutting.json 0c5e92fb20048fe5d9dcd42e10fd0f9b155c385a data/create/advancements/recipes/building_blocks/cut_ochrum_slab.json 941aba0ff7967d7ea56e1f811aa6bc34d4711796 data/create/advancements/recipes/building_blocks/cut_ochrum_slab_from_stone_types_ochrum_stonecutting.json @@ -2547,6 +2869,7 @@ fa14009e4de8cfdacdbb7679473ce359f2cb85be data/create/advancements/recipes/buildi d50accd7f37bfd9384790bdd727401757f6dc7e4 data/create/advancements/recipes/building_blocks/cut_ochrum_stairs_from_stone_types_ochrum_stonecutting.json ed0a72f6393c0d16240b89241f5bbac7dc003516 data/create/advancements/recipes/building_blocks/cut_ochrum_wall.json cda838f95015b0bf02fc5427e1a69ed6302b7e20 data/create/advancements/recipes/building_blocks/cut_ochrum_wall_from_stone_types_ochrum_stonecutting.json +a51cd5a82d9b30c8a68f7cdf8dd7a6b2f883c27c data/create/advancements/recipes/building_blocks/cut_scorchia_bricks_from_stone_types_scorchia_stonecutting.json ce33e5a98a83dae1f37ad4b3d4ea148de5bcacdf data/create/advancements/recipes/building_blocks/cut_scorchia_brick_slab.json 498825e9e5502a7ec8a1f23bfe998b960d7fc9eb data/create/advancements/recipes/building_blocks/cut_scorchia_brick_slab_from_stone_types_scorchia_stonecutting.json 8ffa08b1b4e4ab37dfbf09d2ec4a37f93c9503cb data/create/advancements/recipes/building_blocks/cut_scorchia_brick_slab_recycling.json @@ -2554,7 +2877,6 @@ ce33e5a98a83dae1f37ad4b3d4ea148de5bcacdf data/create/advancements/recipes/buildi 3c4b45560f446534821da63d4e713088928e5f4a data/create/advancements/recipes/building_blocks/cut_scorchia_brick_stairs_from_stone_types_scorchia_stonecutting.json 2aba76185175fff82898a7a905d3ec4ff448deaa data/create/advancements/recipes/building_blocks/cut_scorchia_brick_wall.json ca1f54af4425df994c6707f00e43b8db3ce66280 data/create/advancements/recipes/building_blocks/cut_scorchia_brick_wall_from_stone_types_scorchia_stonecutting.json -a51cd5a82d9b30c8a68f7cdf8dd7a6b2f883c27c data/create/advancements/recipes/building_blocks/cut_scorchia_bricks_from_stone_types_scorchia_stonecutting.json df847f312960866d3d53f48297ea3169c27314eb data/create/advancements/recipes/building_blocks/cut_scorchia_from_stone_types_scorchia_stonecutting.json 8095f7be8aac4f11d618549680d537bed8a921c5 data/create/advancements/recipes/building_blocks/cut_scorchia_slab.json a53831cf7f095fa4d0d92051bd0e21f912c2d9dd data/create/advancements/recipes/building_blocks/cut_scorchia_slab_from_stone_types_scorchia_stonecutting.json @@ -2563,6 +2885,7 @@ a53831cf7f095fa4d0d92051bd0e21f912c2d9dd data/create/advancements/recipes/buildi 30f1efaa46771dd22d7f3aa34f24c69bbdb59bd5 data/create/advancements/recipes/building_blocks/cut_scorchia_stairs_from_stone_types_scorchia_stonecutting.json e02d188d64b270682fa9d335a3423880d8358a0d data/create/advancements/recipes/building_blocks/cut_scorchia_wall.json 834c5a2a8d089822fa81a75b290818db276beab7 data/create/advancements/recipes/building_blocks/cut_scorchia_wall_from_stone_types_scorchia_stonecutting.json +2030ec21c96336bd4c4040857f40ec65d1a75075 data/create/advancements/recipes/building_blocks/cut_scoria_bricks_from_stone_types_scoria_stonecutting.json 705dfcd9f4b6b8a0c360436c097cb371c27cf60d data/create/advancements/recipes/building_blocks/cut_scoria_brick_slab.json 482cf1bbb65a4facc0ebf31ea91bab4d03580635 data/create/advancements/recipes/building_blocks/cut_scoria_brick_slab_from_stone_types_scoria_stonecutting.json 51d070acfc8ad4cd8ca4457ca346458c81eaade4 data/create/advancements/recipes/building_blocks/cut_scoria_brick_slab_recycling.json @@ -2570,7 +2893,6 @@ e02d188d64b270682fa9d335a3423880d8358a0d data/create/advancements/recipes/buildi 99ca117e6a4ad242d92566a2f398c28edb3b7061 data/create/advancements/recipes/building_blocks/cut_scoria_brick_stairs_from_stone_types_scoria_stonecutting.json 01e294976d8ce71b59fb14a47e2686bdce4fab21 data/create/advancements/recipes/building_blocks/cut_scoria_brick_wall.json 0c1d31d37a17d4bd752508022ddd9690bb92a521 data/create/advancements/recipes/building_blocks/cut_scoria_brick_wall_from_stone_types_scoria_stonecutting.json -2030ec21c96336bd4c4040857f40ec65d1a75075 data/create/advancements/recipes/building_blocks/cut_scoria_bricks_from_stone_types_scoria_stonecutting.json 41f420c88dbf61d3cb51966cca9b495d10c604d3 data/create/advancements/recipes/building_blocks/cut_scoria_from_stone_types_scoria_stonecutting.json 26c8447854e29243f0697236f59e258fa96ed369 data/create/advancements/recipes/building_blocks/cut_scoria_slab.json f3e2522664de4ff2ad92a89443e064ac857b7aef data/create/advancements/recipes/building_blocks/cut_scoria_slab_from_stone_types_scoria_stonecutting.json @@ -2579,6 +2901,7 @@ a0635452fd698415e8112e9e0f6d71571901ca34 data/create/advancements/recipes/buildi 1bb047298b71a57e8632607af7b17bab2690aecb data/create/advancements/recipes/building_blocks/cut_scoria_stairs_from_stone_types_scoria_stonecutting.json a33878fe778438a746a28c1fd03ca6d01092ebe4 data/create/advancements/recipes/building_blocks/cut_scoria_wall.json 74a637d0d0f360ad692661c0213c18a06a8ec500 data/create/advancements/recipes/building_blocks/cut_scoria_wall_from_stone_types_scoria_stonecutting.json +f0870d596d9ac9e5b5272fb4e3d2c90c29f3a63d data/create/advancements/recipes/building_blocks/cut_tuff_bricks_from_stone_types_tuff_stonecutting.json b75410afdb8775b2a834ded315913e0ae38e4df8 data/create/advancements/recipes/building_blocks/cut_tuff_brick_slab.json 34c2aead2f2355a8f0f9f9aa7dba58dd5187dbba data/create/advancements/recipes/building_blocks/cut_tuff_brick_slab_from_stone_types_tuff_stonecutting.json c071c43e93cc1735bebbbf320f1b8d2cba4be1e3 data/create/advancements/recipes/building_blocks/cut_tuff_brick_slab_recycling.json @@ -2586,7 +2909,6 @@ c89ec2300425688f9e72e45c64def0b09c0219b0 data/create/advancements/recipes/buildi c882f72f5a31bc92a8186834b105a2e07d864366 data/create/advancements/recipes/building_blocks/cut_tuff_brick_stairs_from_stone_types_tuff_stonecutting.json 70295775a6170a1332f5604aaf75a026630c9e93 data/create/advancements/recipes/building_blocks/cut_tuff_brick_wall.json 1b79d0e71dae77967c1554c203e68eeb51fe8054 data/create/advancements/recipes/building_blocks/cut_tuff_brick_wall_from_stone_types_tuff_stonecutting.json -f0870d596d9ac9e5b5272fb4e3d2c90c29f3a63d data/create/advancements/recipes/building_blocks/cut_tuff_bricks_from_stone_types_tuff_stonecutting.json 549d1f911c009a3cafff4edcb37116c92c2b8e21 data/create/advancements/recipes/building_blocks/cut_tuff_from_stone_types_tuff_stonecutting.json 5bc3e40a8e50a521ebd5fa58efa3ec21064163f7 data/create/advancements/recipes/building_blocks/cut_tuff_slab.json f1ab5be6cb7287517d87b173680ddf833a1dd534 data/create/advancements/recipes/building_blocks/cut_tuff_slab_from_stone_types_tuff_stonecutting.json @@ -2595,6 +2917,7 @@ b7d19085017530f0c2122511c35dbef6a50b337f data/create/advancements/recipes/buildi 3c9541b6e4eb8ff7f7b627a75e8c38ed9eeaf342 data/create/advancements/recipes/building_blocks/cut_tuff_stairs_from_stone_types_tuff_stonecutting.json 51ca798b8bd822ddbbfe8f07073eefb948b97b42 data/create/advancements/recipes/building_blocks/cut_tuff_wall.json 1aa1a0d00c19069f0c55e698b474115d7f437355 data/create/advancements/recipes/building_blocks/cut_tuff_wall_from_stone_types_tuff_stonecutting.json +6a80920618d8e9b7919c83c419e751971440d38a data/create/advancements/recipes/building_blocks/cut_veridium_bricks_from_stone_types_veridium_stonecutting.json e263f555c3a47c83187d29ae9b816edc0c1a763b data/create/advancements/recipes/building_blocks/cut_veridium_brick_slab.json f0e84bde804e52f504cd93bee5058a89f6939dc9 data/create/advancements/recipes/building_blocks/cut_veridium_brick_slab_from_stone_types_veridium_stonecutting.json 949fe819c76fd63edfd93bef5898119c8456fda3 data/create/advancements/recipes/building_blocks/cut_veridium_brick_slab_recycling.json @@ -2602,7 +2925,6 @@ fc87560dedbc951d10d9650a6f27192e7c3a1cc5 data/create/advancements/recipes/buildi 35b09d6300ff8e86f01bc0258fca5cfa80d55c61 data/create/advancements/recipes/building_blocks/cut_veridium_brick_stairs_from_stone_types_veridium_stonecutting.json 599d9ce510531c6006a4964bb4049a850a8457ee data/create/advancements/recipes/building_blocks/cut_veridium_brick_wall.json aaaad7a65a1c05071565ca91a181ff3c375e0141 data/create/advancements/recipes/building_blocks/cut_veridium_brick_wall_from_stone_types_veridium_stonecutting.json -6a80920618d8e9b7919c83c419e751971440d38a data/create/advancements/recipes/building_blocks/cut_veridium_bricks_from_stone_types_veridium_stonecutting.json c76ae7944646e8f13ea460ba6655b95b6c2798ea data/create/advancements/recipes/building_blocks/cut_veridium_from_stone_types_veridium_stonecutting.json 3bafa8873b62cb0333b44af77f2c6e824c5b3e95 data/create/advancements/recipes/building_blocks/cut_veridium_slab.json 143f64b0e5536693262f6a62c2a6fbf85bd4203e data/create/advancements/recipes/building_blocks/cut_veridium_slab_from_stone_types_veridium_stonecutting.json @@ -2634,6 +2956,8 @@ e3c5bd9bf6f73620ccb61e0a9cb3beb18b04b527 data/create/advancements/recipes/buildi 85fb8fdb3cebaaacf24794aec90e7894f66a8402 data/create/advancements/recipes/building_blocks/horizontal_framed_glass_from_glass_colorless_stonecutting.json c609b408d6467ec71513ecca19a6040ad7011a79 data/create/advancements/recipes/building_blocks/horizontal_framed_glass_pane.json a587d84e187d6552473f646461539dc56d4e748f data/create/advancements/recipes/building_blocks/industrial_iron_block_from_ingots_iron_stonecutting.json +d6c892f6f3ae052b2f65d5e5a0cdcc7c60da13db data/create/advancements/recipes/building_blocks/industrial_iron_window.json +a26261da3faa6b49a3d2c6b4f7ccc504681f73f8 data/create/advancements/recipes/building_blocks/industrial_iron_window_pane.json 546af6a639e4799fb83d61b131ab0cc38ef6b33a data/create/advancements/recipes/building_blocks/jungle_window.json e8c728c46cc69cc0e9d755551bb9a52f2b61a6c0 data/create/advancements/recipes/building_blocks/jungle_window_pane.json b9d04c53fdf3ba977216021ca71aa5e4f2d9a0b0 data/create/advancements/recipes/building_blocks/layered_andesite_from_stone_types_andesite_stonecutting.json @@ -2786,6 +3110,7 @@ c4c087911453bd979e028d3b3558b273e3cb5926 data/create/advancements/recipes/buildi 780bb3d13fcd8abf6e166b04566b141e023ee11e data/create/advancements/recipes/building_blocks/scorchia_pillar_from_stone_types_scorchia_stonecutting.json 5c5c5080c1136c046caee2d14dd2c3c9f09abad3 data/create/advancements/recipes/building_blocks/scoria_from_stone_types_scoria_stonecutting.json 5a6b12869ffcbd1d9b4fbe1fee444fcde95d2953 data/create/advancements/recipes/building_blocks/scoria_pillar_from_stone_types_scoria_stonecutting.json +a51ca3151c517113338720edeac0e02a46ebb03a data/create/advancements/recipes/building_blocks/small_andesite_bricks_from_stone_types_andesite_stonecutting.json f72093994236a0580c6cafd08fb42f061733de01 data/create/advancements/recipes/building_blocks/small_andesite_brick_slab.json 05092201e6c514d3eae566fb1ce98ad415660112 data/create/advancements/recipes/building_blocks/small_andesite_brick_slab_from_stone_types_andesite_stonecutting.json 0e41d75b613a0ebd0c023669dcfd34f11b14fd0e data/create/advancements/recipes/building_blocks/small_andesite_brick_slab_recycling.json @@ -2793,7 +3118,7 @@ f72093994236a0580c6cafd08fb42f061733de01 data/create/advancements/recipes/buildi 8bbf898cbc47ac7a326c0d082a92a452b6915a7e data/create/advancements/recipes/building_blocks/small_andesite_brick_stairs_from_stone_types_andesite_stonecutting.json 9e0685dd668550c67812d1caccd8c8cae9f2041c data/create/advancements/recipes/building_blocks/small_andesite_brick_wall.json 7a1bfa848f950482f82d7fe7a9cf3cf916f91702 data/create/advancements/recipes/building_blocks/small_andesite_brick_wall_from_stone_types_andesite_stonecutting.json -a51ca3151c517113338720edeac0e02a46ebb03a data/create/advancements/recipes/building_blocks/small_andesite_bricks_from_stone_types_andesite_stonecutting.json +0bfa788d0038077a88678ff16104a8b82038b3da data/create/advancements/recipes/building_blocks/small_asurine_bricks_from_stone_types_asurine_stonecutting.json 3dccee988c08e1988886d9f09f2b5b42332ac083 data/create/advancements/recipes/building_blocks/small_asurine_brick_slab.json 438469fb06dff95a0ab9e0cb183795432d9b78dd data/create/advancements/recipes/building_blocks/small_asurine_brick_slab_from_stone_types_asurine_stonecutting.json 3eb65706d975e6f1e429f43d7384272a58872f10 data/create/advancements/recipes/building_blocks/small_asurine_brick_slab_recycling.json @@ -2801,7 +3126,7 @@ fb8cab1a3ecef97eaf7d744bb0d1d09d46859b60 data/create/advancements/recipes/buildi 525fff52f5dea3178356b7c5f7606d2a369b346e data/create/advancements/recipes/building_blocks/small_asurine_brick_stairs_from_stone_types_asurine_stonecutting.json 39df7ef2b88df45ba4a06bfa9cd7f863f813cb30 data/create/advancements/recipes/building_blocks/small_asurine_brick_wall.json 21aa9dc72b12eb0a33cdc9904ee595de802b55f4 data/create/advancements/recipes/building_blocks/small_asurine_brick_wall_from_stone_types_asurine_stonecutting.json -0bfa788d0038077a88678ff16104a8b82038b3da data/create/advancements/recipes/building_blocks/small_asurine_bricks_from_stone_types_asurine_stonecutting.json +46666ef8d341971cdd989f14575973777a85cdc6 data/create/advancements/recipes/building_blocks/small_calcite_bricks_from_stone_types_calcite_stonecutting.json d61fce64a295a2c3b9433bc27ac50f4f1f6a678d data/create/advancements/recipes/building_blocks/small_calcite_brick_slab.json 7f2e73d01b9bff473c4ecf76ab967b3aa934ff87 data/create/advancements/recipes/building_blocks/small_calcite_brick_slab_from_stone_types_calcite_stonecutting.json 1095487af055116acc2eba87d92dd0918385e9ac data/create/advancements/recipes/building_blocks/small_calcite_brick_slab_recycling.json @@ -2809,7 +3134,7 @@ d61fce64a295a2c3b9433bc27ac50f4f1f6a678d data/create/advancements/recipes/buildi e3bd0900dc92b26fe69c7f4e81db76678505222b data/create/advancements/recipes/building_blocks/small_calcite_brick_stairs_from_stone_types_calcite_stonecutting.json c88fb3af07c32aa127cbe0043075f50fed869839 data/create/advancements/recipes/building_blocks/small_calcite_brick_wall.json ea58b78e177134c73ed5bfb081761f90cc7caa3e data/create/advancements/recipes/building_blocks/small_calcite_brick_wall_from_stone_types_calcite_stonecutting.json -46666ef8d341971cdd989f14575973777a85cdc6 data/create/advancements/recipes/building_blocks/small_calcite_bricks_from_stone_types_calcite_stonecutting.json +c48216f26cfe93ce99f7f2f0e9f68d1ee2a95e46 data/create/advancements/recipes/building_blocks/small_crimsite_bricks_from_stone_types_crimsite_stonecutting.json ed4d6e7779749dd647f744f0486e78b93057aa33 data/create/advancements/recipes/building_blocks/small_crimsite_brick_slab.json 7f3ad6d79eb9d433d5a0e295eb2b099a5f815876 data/create/advancements/recipes/building_blocks/small_crimsite_brick_slab_from_stone_types_crimsite_stonecutting.json b980fcc4b29f9ff897dd867222fc4248d76e808a data/create/advancements/recipes/building_blocks/small_crimsite_brick_slab_recycling.json @@ -2817,7 +3142,7 @@ b980fcc4b29f9ff897dd867222fc4248d76e808a data/create/advancements/recipes/buildi c06600eda4e4bd7c46e4e315a0569fbdfa4bb087 data/create/advancements/recipes/building_blocks/small_crimsite_brick_stairs_from_stone_types_crimsite_stonecutting.json 4021a4a761b06def09f19d6a60bc0722e69ec08d data/create/advancements/recipes/building_blocks/small_crimsite_brick_wall.json 2d8eae517a914e93538307efe23d532582d487e2 data/create/advancements/recipes/building_blocks/small_crimsite_brick_wall_from_stone_types_crimsite_stonecutting.json -c48216f26cfe93ce99f7f2f0e9f68d1ee2a95e46 data/create/advancements/recipes/building_blocks/small_crimsite_bricks_from_stone_types_crimsite_stonecutting.json +ed82f0fac452147faa997af1d45278f501ef165b data/create/advancements/recipes/building_blocks/small_deepslate_bricks_from_stone_types_deepslate_stonecutting.json e4674821cc17adadecacc55d48c028847caf5fea data/create/advancements/recipes/building_blocks/small_deepslate_brick_slab.json 8c0c51d052b110fec3668618be2bdeaf8d0c7cc5 data/create/advancements/recipes/building_blocks/small_deepslate_brick_slab_from_stone_types_deepslate_stonecutting.json f8f7ace802b6c73fabfabbaae1c1383a3c0bcf6b data/create/advancements/recipes/building_blocks/small_deepslate_brick_slab_recycling.json @@ -2825,7 +3150,7 @@ e2e16c3c0e761ef44f9b21ae3bd95300a33459be data/create/advancements/recipes/buildi 37ef4192f1db7dd5c066a47480f86f60687c9894 data/create/advancements/recipes/building_blocks/small_deepslate_brick_stairs_from_stone_types_deepslate_stonecutting.json 6f4d365ce26fb4081a5af0f6e21631209b5b106d data/create/advancements/recipes/building_blocks/small_deepslate_brick_wall.json e0c7377c55dc94b8efd62cb6f57325c94206cbf4 data/create/advancements/recipes/building_blocks/small_deepslate_brick_wall_from_stone_types_deepslate_stonecutting.json -ed82f0fac452147faa997af1d45278f501ef165b data/create/advancements/recipes/building_blocks/small_deepslate_bricks_from_stone_types_deepslate_stonecutting.json +9bb23924495112ba177d12ba2a5adcb872a2b76f data/create/advancements/recipes/building_blocks/small_diorite_bricks_from_stone_types_diorite_stonecutting.json d4b96bcd8902e9bce19603abb99cb7edeb260189 data/create/advancements/recipes/building_blocks/small_diorite_brick_slab.json 2ed3800996491c9a1db23d9cbed04cc5ee963df6 data/create/advancements/recipes/building_blocks/small_diorite_brick_slab_from_stone_types_diorite_stonecutting.json 895d2158ba0783c5fd97b802ef5866d7532df6ba data/create/advancements/recipes/building_blocks/small_diorite_brick_slab_recycling.json @@ -2833,7 +3158,7 @@ d4b96bcd8902e9bce19603abb99cb7edeb260189 data/create/advancements/recipes/buildi 0f4b92965c05ddf71fa24b2b08a0cce358ac8dd1 data/create/advancements/recipes/building_blocks/small_diorite_brick_stairs_from_stone_types_diorite_stonecutting.json 633d921515fb4ad0e3177f3c8f151da80008053b data/create/advancements/recipes/building_blocks/small_diorite_brick_wall.json 3dea60492331bcd3253d90534559cc0bdb0822ae data/create/advancements/recipes/building_blocks/small_diorite_brick_wall_from_stone_types_diorite_stonecutting.json -9bb23924495112ba177d12ba2a5adcb872a2b76f data/create/advancements/recipes/building_blocks/small_diorite_bricks_from_stone_types_diorite_stonecutting.json +632ced3760d55b56d1620e447b8b762e0e4a29f3 data/create/advancements/recipes/building_blocks/small_dripstone_bricks_from_stone_types_dripstone_stonecutting.json 92bb21a400d9720a2f06882049d5b3863a93969d data/create/advancements/recipes/building_blocks/small_dripstone_brick_slab.json 02e2b98eeef9cdc20a8678beec4c7aa8a6cde948 data/create/advancements/recipes/building_blocks/small_dripstone_brick_slab_from_stone_types_dripstone_stonecutting.json 35830242bc48b1355830d6cb17dc4dc547d51bc0 data/create/advancements/recipes/building_blocks/small_dripstone_brick_slab_recycling.json @@ -2841,7 +3166,7 @@ d4b96bcd8902e9bce19603abb99cb7edeb260189 data/create/advancements/recipes/buildi 92523f3058a580743f95e9347fa97e0f5f6483f6 data/create/advancements/recipes/building_blocks/small_dripstone_brick_stairs_from_stone_types_dripstone_stonecutting.json 6e26ab4ad96225b7dd1a4aa06295b0d85e87400b data/create/advancements/recipes/building_blocks/small_dripstone_brick_wall.json e30a5f31d6478dfe7693077727b1abfc40b33f9b data/create/advancements/recipes/building_blocks/small_dripstone_brick_wall_from_stone_types_dripstone_stonecutting.json -632ced3760d55b56d1620e447b8b762e0e4a29f3 data/create/advancements/recipes/building_blocks/small_dripstone_bricks_from_stone_types_dripstone_stonecutting.json +1805b7f9db21b4530b173ab6945584e7d852b218 data/create/advancements/recipes/building_blocks/small_granite_bricks_from_stone_types_granite_stonecutting.json a2929bbd4c81b9601aeca74110936343102b7b5a data/create/advancements/recipes/building_blocks/small_granite_brick_slab.json 0fa83c337d5612e2b8368d5bff34117e0c1cf40a data/create/advancements/recipes/building_blocks/small_granite_brick_slab_from_stone_types_granite_stonecutting.json 0bc47cb22cc70a34879092a57c87551e6fa9f634 data/create/advancements/recipes/building_blocks/small_granite_brick_slab_recycling.json @@ -2849,7 +3174,7 @@ a2929bbd4c81b9601aeca74110936343102b7b5a data/create/advancements/recipes/buildi 44f3e71a4e8b78db74a21a42c3cebfbc15fe0180 data/create/advancements/recipes/building_blocks/small_granite_brick_stairs_from_stone_types_granite_stonecutting.json 3a6edafcb559e767caf421cf1bd6e064940f33e2 data/create/advancements/recipes/building_blocks/small_granite_brick_wall.json cac9914c729c0ecf5e9e1b4fe6498005e7c532f3 data/create/advancements/recipes/building_blocks/small_granite_brick_wall_from_stone_types_granite_stonecutting.json -1805b7f9db21b4530b173ab6945584e7d852b218 data/create/advancements/recipes/building_blocks/small_granite_bricks_from_stone_types_granite_stonecutting.json +1ca86b11356749caf7515fc61b8ac5de53d019f6 data/create/advancements/recipes/building_blocks/small_limestone_bricks_from_stone_types_limestone_stonecutting.json 4f3cc93f422ee9f05587b89d6729a6cc86f572c0 data/create/advancements/recipes/building_blocks/small_limestone_brick_slab.json 02d0c45cd014fd660a9d3eb1c1c6b40ba806b2fb data/create/advancements/recipes/building_blocks/small_limestone_brick_slab_from_stone_types_limestone_stonecutting.json 8fb46bce94f6cca943e4ae427c04d9617ada277d data/create/advancements/recipes/building_blocks/small_limestone_brick_slab_recycling.json @@ -2857,7 +3182,7 @@ cac9914c729c0ecf5e9e1b4fe6498005e7c532f3 data/create/advancements/recipes/buildi 00b61a4d23f8b16a7e4d9bf46fbe52c6b5dd561c data/create/advancements/recipes/building_blocks/small_limestone_brick_stairs_from_stone_types_limestone_stonecutting.json 7c6b80f174687efe10007c0235f2a68db7062b12 data/create/advancements/recipes/building_blocks/small_limestone_brick_wall.json 7f9ade635dcda8d5baae2bbdddc018bcc715f681 data/create/advancements/recipes/building_blocks/small_limestone_brick_wall_from_stone_types_limestone_stonecutting.json -1ca86b11356749caf7515fc61b8ac5de53d019f6 data/create/advancements/recipes/building_blocks/small_limestone_bricks_from_stone_types_limestone_stonecutting.json +bab018a0adcbc0582ba756158941a87923b20384 data/create/advancements/recipes/building_blocks/small_ochrum_bricks_from_stone_types_ochrum_stonecutting.json 9c98b7b56f92f6adc75473f5b0ae4dc69ac8aa9a data/create/advancements/recipes/building_blocks/small_ochrum_brick_slab.json 611fb57772f1446236256f1235751dec6f81cd0e data/create/advancements/recipes/building_blocks/small_ochrum_brick_slab_from_stone_types_ochrum_stonecutting.json 243821a2c3e465f5346ad58e0afda624c09ab946 data/create/advancements/recipes/building_blocks/small_ochrum_brick_slab_recycling.json @@ -2865,8 +3190,8 @@ b9a16792e6158a2923454c9a44d9c176c9607c24 data/create/advancements/recipes/buildi bb91a8ba1ef1c8cb725f18a4d577bb476b9ae68d data/create/advancements/recipes/building_blocks/small_ochrum_brick_stairs_from_stone_types_ochrum_stonecutting.json 5cf5574da0b29895960fa7f0fd63d3f81814f7b3 data/create/advancements/recipes/building_blocks/small_ochrum_brick_wall.json 1b5d14c921a85a3a5cdb9f845d4f0ddf98f87347 data/create/advancements/recipes/building_blocks/small_ochrum_brick_wall_from_stone_types_ochrum_stonecutting.json -bab018a0adcbc0582ba756158941a87923b20384 data/create/advancements/recipes/building_blocks/small_ochrum_bricks_from_stone_types_ochrum_stonecutting.json 8d6ccacf1af917094b1688ed70dc75bf54611e93 data/create/advancements/recipes/building_blocks/small_rose_quartz_tiles_from_polished_rose_quartz_stonecutting.json +7d679c66588f8a717619a7f89861d57ec04f04a1 data/create/advancements/recipes/building_blocks/small_scorchia_bricks_from_stone_types_scorchia_stonecutting.json 2003f1248faaeb4fe6761febda8e29d087f99dc7 data/create/advancements/recipes/building_blocks/small_scorchia_brick_slab.json ff5c50697aefe21c1570230a13255c912744b629 data/create/advancements/recipes/building_blocks/small_scorchia_brick_slab_from_stone_types_scorchia_stonecutting.json 8d1fd41b03940add231fa207d3ddaa1f78cf2b85 data/create/advancements/recipes/building_blocks/small_scorchia_brick_slab_recycling.json @@ -2874,7 +3199,7 @@ ff5c50697aefe21c1570230a13255c912744b629 data/create/advancements/recipes/buildi 8586f387cc9bb74250369373348005f6aa686af2 data/create/advancements/recipes/building_blocks/small_scorchia_brick_stairs_from_stone_types_scorchia_stonecutting.json 94552be031c17f5ef9d97cf5fe33beb15141291f data/create/advancements/recipes/building_blocks/small_scorchia_brick_wall.json 86e866f92095b03b5d77a91425e5e2ef307f4852 data/create/advancements/recipes/building_blocks/small_scorchia_brick_wall_from_stone_types_scorchia_stonecutting.json -7d679c66588f8a717619a7f89861d57ec04f04a1 data/create/advancements/recipes/building_blocks/small_scorchia_bricks_from_stone_types_scorchia_stonecutting.json +e542cd94f84a90530332608b1040e2e6189a51fe data/create/advancements/recipes/building_blocks/small_scoria_bricks_from_stone_types_scoria_stonecutting.json ad4c35afd6c3d55b356e38289c64e8cf6d194d10 data/create/advancements/recipes/building_blocks/small_scoria_brick_slab.json 2f1acca02bb5a40bf174ceeb5272ba1243b8635c data/create/advancements/recipes/building_blocks/small_scoria_brick_slab_from_stone_types_scoria_stonecutting.json dba264e073eab7b2fb1494cb117574b6a6b83919 data/create/advancements/recipes/building_blocks/small_scoria_brick_slab_recycling.json @@ -2882,7 +3207,7 @@ dba264e073eab7b2fb1494cb117574b6a6b83919 data/create/advancements/recipes/buildi 0e64e1dc80a0b84e05260191951ed930a8e578f6 data/create/advancements/recipes/building_blocks/small_scoria_brick_stairs_from_stone_types_scoria_stonecutting.json 95b866fac218affb9aac93272f5436e30dd4678c data/create/advancements/recipes/building_blocks/small_scoria_brick_wall.json 23493359766c969d2fa64575c5af047e6a924373 data/create/advancements/recipes/building_blocks/small_scoria_brick_wall_from_stone_types_scoria_stonecutting.json -e542cd94f84a90530332608b1040e2e6189a51fe data/create/advancements/recipes/building_blocks/small_scoria_bricks_from_stone_types_scoria_stonecutting.json +b7fc4fbd0d6ce28946b5cbef40d86de3ca37f695 data/create/advancements/recipes/building_blocks/small_tuff_bricks_from_stone_types_tuff_stonecutting.json 03acb1becaa3c7f6fc0ced99e6afcf4ac0ec4cb2 data/create/advancements/recipes/building_blocks/small_tuff_brick_slab.json 599693bc47bfd65cc9e3babc0a2f33c0d2bbfd31 data/create/advancements/recipes/building_blocks/small_tuff_brick_slab_from_stone_types_tuff_stonecutting.json aae2cb75ee4b9312e79dfea519c35f5e20ed4da6 data/create/advancements/recipes/building_blocks/small_tuff_brick_slab_recycling.json @@ -2890,7 +3215,7 @@ c72364e32b82f45f17491dd41967373c35d8dfb5 data/create/advancements/recipes/buildi 369763433d6af43d94392e870b3d861f739ba0f9 data/create/advancements/recipes/building_blocks/small_tuff_brick_stairs_from_stone_types_tuff_stonecutting.json 506bbae420bff66d492214c49dabf52e5cbcf6e4 data/create/advancements/recipes/building_blocks/small_tuff_brick_wall.json 6db7e4b981ec28c776988a531c03dbe28fb0a1c2 data/create/advancements/recipes/building_blocks/small_tuff_brick_wall_from_stone_types_tuff_stonecutting.json -b7fc4fbd0d6ce28946b5cbef40d86de3ca37f695 data/create/advancements/recipes/building_blocks/small_tuff_bricks_from_stone_types_tuff_stonecutting.json +9fd6e20a4555b591b17ef225316782de333780fa data/create/advancements/recipes/building_blocks/small_veridium_bricks_from_stone_types_veridium_stonecutting.json b61a773f683c415617a408fa0781e7e7d61cb1af data/create/advancements/recipes/building_blocks/small_veridium_brick_slab.json 526a5323263292bd091c03231a156e18460c34a1 data/create/advancements/recipes/building_blocks/small_veridium_brick_slab_from_stone_types_veridium_stonecutting.json ef040b7189b17cce9dd69c47af61c7abca6f43cd data/create/advancements/recipes/building_blocks/small_veridium_brick_slab_recycling.json @@ -2898,7 +3223,6 @@ ef040b7189b17cce9dd69c47af61c7abca6f43cd data/create/advancements/recipes/buildi 6a12b73815434a544881680cb071f273a75f62a5 data/create/advancements/recipes/building_blocks/small_veridium_brick_stairs_from_stone_types_veridium_stonecutting.json e6dfacd8f2f57d4df42927783750254f7163251a data/create/advancements/recipes/building_blocks/small_veridium_brick_wall.json ee4012cc014539be113ace8f80e51c85d2daead9 data/create/advancements/recipes/building_blocks/small_veridium_brick_wall_from_stone_types_veridium_stonecutting.json -9fd6e20a4555b591b17ef225316782de333780fa data/create/advancements/recipes/building_blocks/small_veridium_bricks_from_stone_types_veridium_stonecutting.json 03a87030672d40b0b2b6ad085103c9a5cef067ce data/create/advancements/recipes/building_blocks/spruce_window.json dfea65f25ebcbe0caf2694dec3d3ea616e2e9291 data/create/advancements/recipes/building_blocks/spruce_window_pane.json 763b3b49296a284f41cbccdc7f1ffb13c89d42db data/create/advancements/recipes/building_blocks/tiled_glass_from_glass_colorless_stonecutting.json @@ -2919,15 +3243,21 @@ a9e35aaf621cdb2648f4b9e9beacc91092e8d3b3 data/create/advancements/recipes/buildi 7eeaf1b7cf0a788d4b9a61274cf4752ba1fe57cb data/create/advancements/recipes/building_blocks/weathered_copper_tile_slab_from_weathered_copper_tiles_stonecutting.json 86e0a3eb797ecdfd1626ce84f26e25c503a68587 data/create/advancements/recipes/building_blocks/weathered_copper_tile_stairs.json f093326ca1f341bede9f7cbefecadf7d73d3f9d7 data/create/advancements/recipes/building_blocks/weathered_copper_tile_stairs_from_weathered_copper_tiles_stonecutting.json +c1b0ce558aad75210d8b95c982dbe063982fe567 data/create/advancements/recipes/building_blocks/weathered_iron_block_from_ingots_iron_stonecutting.json +587dd224181b7008f65ebf3b198bb23475cdec47 data/create/advancements/recipes/building_blocks/weathered_iron_window.json +0847f40c57682514297b0dbf520fd88728507bd1 data/create/advancements/recipes/building_blocks/weathered_iron_window_pane.json 39c93330e07e58d79db13d132d7f1a8f33670e9b data/create/advancements/recipes/decorations/andesite_bars_from_andesite_alloy_stonecutting.json 769926b9bb00dea3bf0534c8d828873b13def961 data/create/advancements/recipes/decorations/andesite_ladder_from_andesite_alloy_stonecutting.json 266700212dece6cba8c338a1e0a8507bb41f92e6 data/create/advancements/recipes/decorations/andesite_scaffolding_from_andesite_alloy_stonecutting.json +f6513fa4fdf26848b2f9ce9bd015377a2583c439 data/create/advancements/recipes/decorations/andesite_table_cloth_from_andesite_alloy_stonecutting.json 07ad89608ed200f4c8051a398f5da9d29769c39f data/create/advancements/recipes/decorations/brass_bars_from_ingots_brass_stonecutting.json d11ca4dc890089326eede1bd5b7a32a97cc91886 data/create/advancements/recipes/decorations/brass_ladder_from_ingots_brass_stonecutting.json cbeb1685b639f0b0b2a637374ff548251c0a932e data/create/advancements/recipes/decorations/brass_scaffolding_from_ingots_brass_stonecutting.json +b3c785f2f494ab60bbe295eafecf9292379a5ff2 data/create/advancements/recipes/decorations/brass_table_cloth_from_ingots_brass_stonecutting.json 2ed97c748d8fe0c9fd060b53a4095a37a10ce67f data/create/advancements/recipes/decorations/copper_bars_from_ingots_copper_stonecutting.json e55c465683e664a0205b62d2e132afeb89ee4dce data/create/advancements/recipes/decorations/copper_ladder_from_ingots_copper_stonecutting.json d3a0524f9fce7293f8c3adbd757c5d5afe74af27 data/create/advancements/recipes/decorations/copper_scaffolding_from_ingots_copper_stonecutting.json +1762dee3f3c416d8867d90e3ce9b68c3c5fe650f data/create/advancements/recipes/decorations/copper_table_cloth_from_ingots_copper_stonecutting.json 34ae39bca445f80d431b3e329de3c1bf847a8eef data/create/advancements/recipes/misc/crafting/kinetics/black_valve_handle_from_other_valve_handle.json e222002ee051e7b72b3658655bb53b5adb825272 data/create/advancements/recipes/misc/crafting/kinetics/blue_valve_handle_from_other_valve_handle.json 472c9e1d515f5f34d97efc334cefe3eb62d860e4 data/create/advancements/recipes/misc/crafting/kinetics/brown_valve_handle_from_other_valve_handle.json @@ -2944,6 +3274,25 @@ c96b1b147139c9d560e9d1e1dd9a726ebb771329 data/create/advancements/recipes/misc/c 004b31d1be78dbc4be60f4fd0879065f1a685518 data/create/advancements/recipes/misc/crafting/kinetics/red_valve_handle_from_other_valve_handle.json cf2920d4d27c40fe71dd8954225e7f2a38ba2a4f data/create/advancements/recipes/misc/crafting/kinetics/white_valve_handle_from_other_valve_handle.json 54bf51dcbdd86635e68d366cb4130f65b9c0fe4a data/create/advancements/recipes/misc/crafting/kinetics/yellow_valve_handle_from_other_valve_handle.json +b60b14d473fc8a841be668e98303f07779916637 data/create/advancements/recipes/misc/crafting/logistics/andesite_table_cloth_clear.json +5e50ee44a3316eb23bbd8f0164c17d5719ab707c data/create/advancements/recipes/misc/crafting/logistics/black_table_cloth_clear.json +b6ce89f748f35694cf2fd4c79693b3a8f3dba864 data/create/advancements/recipes/misc/crafting/logistics/blue_table_cloth_clear.json +2aeabffefd6e7a963e61288b632961783ce9ab69 data/create/advancements/recipes/misc/crafting/logistics/brass_table_cloth_clear.json +a8a4ef79d02e1903464fff524bcbb63b424681ea data/create/advancements/recipes/misc/crafting/logistics/brown_table_cloth_clear.json +a613cb47dd2a7cf5cf2f7b6bd8031f59e6bc554a data/create/advancements/recipes/misc/crafting/logistics/copper_table_cloth_clear.json +e44912e563d11cb42bf45ab668e81c66845725d1 data/create/advancements/recipes/misc/crafting/logistics/cyan_table_cloth_clear.json +13b4e81dcaa87e9862180f10b239de43bf1d1dc8 data/create/advancements/recipes/misc/crafting/logistics/gray_table_cloth_clear.json +df90265b1aba8f4c49564dce7e04609cf65ddba5 data/create/advancements/recipes/misc/crafting/logistics/green_table_cloth_clear.json +05c7735e280b2be640084fecc3724c41544805fd data/create/advancements/recipes/misc/crafting/logistics/light_blue_table_cloth_clear.json +5ee045df398bb091467f5b18df7d8b322ed43c23 data/create/advancements/recipes/misc/crafting/logistics/light_gray_table_cloth_clear.json +ad99b5d2213c5a9d00f4719e4aaaca4215e8191b data/create/advancements/recipes/misc/crafting/logistics/lime_table_cloth_clear.json +97ca5d009fb727f770d3c3d74756eeb571f084b7 data/create/advancements/recipes/misc/crafting/logistics/magenta_table_cloth_clear.json +33cbf02d26d008cd7b261d729aed1e5fcce0cb6e data/create/advancements/recipes/misc/crafting/logistics/orange_table_cloth_clear.json +e23d1bf1143d08074df53d9a07ea0c5304f63271 data/create/advancements/recipes/misc/crafting/logistics/pink_table_cloth_clear.json +b9be0a58a604965048084487294b4c1b9ce0f745 data/create/advancements/recipes/misc/crafting/logistics/purple_table_cloth_clear.json +0d8c16e085d8f869237fdfb428d29ece096a3291 data/create/advancements/recipes/misc/crafting/logistics/red_table_cloth_clear.json +c1768fde21268bb1b035c63b5e9fba81526de83c data/create/advancements/recipes/misc/crafting/logistics/white_table_cloth_clear.json +ccb8f3871eb044360b597ff02ea78896050c3760 data/create/advancements/recipes/misc/crafting/logistics/yellow_table_cloth_clear.json 706a4da01ddbd9c3db4d3183ffdcd602a558a5cd data/create/loot_tables/blocks/acacia_window.json a7b37cec417ec9f9095e2ae11c990e4906d6af0e data/create/loot_tables/blocks/acacia_window_pane.json 5eee4b2702e432e03b1f46c6f1573ceee67b131f data/create/loot_tables/blocks/adjustable_chain_gearshift.json @@ -2960,24 +3309,32 @@ ac6b9e99a900f203f69c5127cc44c0de48b0d946 data/create/loot_tables/blocks/andesite 1d9b959e0a6b965fef70136c2988e37c94f58b9e data/create/loot_tables/blocks/andesite_ladder.json 93e40b5e41c32af364a4636989a72ef7901e6bd6 data/create/loot_tables/blocks/andesite_pillar.json 191c341be37299e8ab0d692eb3a185188157ebdf data/create/loot_tables/blocks/andesite_scaffolding.json +d3a343785cc9e9ac0e9d2309ef4203121c9ab385 data/create/loot_tables/blocks/andesite_table_cloth.json 1c6f1dd9ec49b7db86e43706e940208b51e0f6d5 data/create/loot_tables/blocks/andesite_tunnel.json d408536459078c1d72770b7431137d7d8d8ff3bb data/create/loot_tables/blocks/asurine.json 3129cb3d97d657bf16ea5973b3bde1e31ff054c7 data/create/loot_tables/blocks/asurine_pillar.json +858038cff810f9b47e37e5c80064370573d73255 data/create/loot_tables/blocks/bamboo_window.json +76843e927185385fbdfe403577eb4a85a60e25bd data/create/loot_tables/blocks/bamboo_window_pane.json 8ac6f7a29c32e636b0639ac2caaa60882617f675 data/create/loot_tables/blocks/basin.json d964b7a8f6a4ce28ce640d31a01e77eafcc181e5 data/create/loot_tables/blocks/belt.json a268eb02c10015a901a6543595b2b815a8026d78 data/create/loot_tables/blocks/birch_window.json 43d16eae230de501c528f4e9af666f72a081ed29 data/create/loot_tables/blocks/birch_window_pane.json 4aec2374e76dfa5535fe22b1fc02b4b2d453217d data/create/loot_tables/blocks/black_nixie_tube.json +6ed685605e24af5c6ff5d797dde8492069427b76 data/create/loot_tables/blocks/black_postbox.json 7ce6dd2c0d02eb1b56ec441044dfc608ea6bcb41 data/create/loot_tables/blocks/black_sail.json 2449b8c173fbbc2a96e0b8d1996d72fb60527e64 data/create/loot_tables/blocks/black_seat.json +2ac4a51540f596ddb81f9fa1b72bcc02c3a6b1fd data/create/loot_tables/blocks/black_table_cloth.json 2d33e25b2741f634bbd6cd77b31c17dd94511d94 data/create/loot_tables/blocks/black_toolbox.json f911ac185cd48afa2393d24f28a688936a9fa147 data/create/loot_tables/blocks/black_valve_handle.json eee41c02c8cfcdb56f31e74fc266783b785bea9d data/create/loot_tables/blocks/blaze_burner.json 247d12823eed3b9248003aca8e3ead87972ac61e data/create/loot_tables/blocks/blue_nixie_tube.json +76217732c9bddf77b7de735b4380d9f92adca9b3 data/create/loot_tables/blocks/blue_postbox.json bb9d906a97810ed1461ed321ef8e4bee1dd104fb data/create/loot_tables/blocks/blue_sail.json 833fe6bc3020055dd0d6f46b324cbe27b248708d data/create/loot_tables/blocks/blue_seat.json +2b7aa6506e02be7a7b76228bc16bf05d0920195e data/create/loot_tables/blocks/blue_table_cloth.json 9d22716d9d846dc9587e327dfcdf18dd5955f826 data/create/loot_tables/blocks/blue_toolbox.json 6d7ecb10e21b1e12c83c71736f14cbba3ccd7aaf data/create/loot_tables/blocks/blue_valve_handle.json +53e01f63aa47aa00575240ccdf867b4d6c392385 data/create/loot_tables/blocks/bound_cardboard_block.json 7d8b199f381003e5a74a8144976b65c93a09dbcb data/create/loot_tables/blocks/brass_bars.json 64a5869c6b3edeca06771f8ef64ef9521d83302a data/create/loot_tables/blocks/brass_belt_funnel.json 78ecee2c9baf6b0c78f6c7aa692e102a3f4dda74 data/create/loot_tables/blocks/brass_block.json @@ -2989,14 +3346,21 @@ e466a397f84957616f7e83954db2050355f052c9 data/create/loot_tables/blocks/brass_en 7b79b14f64108cd8a734f95dd8c721830b48ac82 data/create/loot_tables/blocks/brass_funnel.json 8d58d4c771843950a14fd7b800a05736c1fc88d9 data/create/loot_tables/blocks/brass_ladder.json 429d524c9848b44d19028126f0efd678e0c4b680 data/create/loot_tables/blocks/brass_scaffolding.json +ce1aa8d4b40ba0d0898c552811f1a6f7e94879a5 data/create/loot_tables/blocks/brass_table_cloth.json af90102bfe0e3a14bf1330cddec553f27b8fba89 data/create/loot_tables/blocks/brass_tunnel.json d391cff5b741fd6ddf5b6fa64e05526eb3a9f0d9 data/create/loot_tables/blocks/brown_nixie_tube.json +bfa0365507a888134c20b36af4bd7944263687f0 data/create/loot_tables/blocks/brown_postbox.json 862bd3ceed05ea45c03911bb8403817b73c4bc38 data/create/loot_tables/blocks/brown_sail.json 6ddbdd489120be56f50272c86ecdb886afa3a8e4 data/create/loot_tables/blocks/brown_seat.json +0aa66846a1b29feda9c63b9364860c4c75eaf2e4 data/create/loot_tables/blocks/brown_table_cloth.json 588ae3d0da73eed3bc30cb28c583e7f8312d15bd data/create/loot_tables/blocks/brown_toolbox.json 7c7cf4c30786f6e0a699e2b3f9120343e53107f4 data/create/loot_tables/blocks/brown_valve_handle.json 06d1c478e4236210aa12b5911691868fef33bb5f data/create/loot_tables/blocks/calcite_pillar.json +3d65461b1fc2667f446aefa2853621c06068bb38 data/create/loot_tables/blocks/cardboard_block.json 515c839deea520b07b03f7ba65c4a7b22fdf5ba3 data/create/loot_tables/blocks/cart_assembler.json +aadd8aa7f8433896bd4fea56f43e496cbc5be25a data/create/loot_tables/blocks/chain_conveyor.json +5c79f6384b77fc0d817a17f65f3cdfef34a7a039 data/create/loot_tables/blocks/cherry_window.json +d2e962b8cfc208d0c8af5f4b79311b9df14b1738 data/create/loot_tables/blocks/cherry_window_pane.json fb4877d45df15be1a74378ab28f23fbf9d0657ef data/create/loot_tables/blocks/chute.json ace9255cbdd1af5e5068916d2a6bed2f861f81f1 data/create/loot_tables/blocks/clipboard.json bfd871acdde6c239098ead188a5aad7636d11bc0 data/create/loot_tables/blocks/clockwork_bearing.json @@ -3012,12 +3376,13 @@ fa0856e11351ad0882de2066569807e782071881 data/create/loot_tables/blocks/copper_b 0937b9f634b86dbe41e07eda52c69993fce60fb5 data/create/loot_tables/blocks/copper_door.json 8ed70d812f38adfa147db07a4f2bbe206a69ad20 data/create/loot_tables/blocks/copper_ladder.json ac621731ca23e6fbb1003be59edacdf837dbc37e data/create/loot_tables/blocks/copper_scaffolding.json +9be387731859ccc3aec7701c1804ddc3c5dde216 data/create/loot_tables/blocks/copper_shingles.json be31f0c68bfe80dff88959bd30ef9a9080dd3b3b data/create/loot_tables/blocks/copper_shingle_slab.json 83ae2652a2df217730d6fb34a65c3962e82a961d data/create/loot_tables/blocks/copper_shingle_stairs.json -9be387731859ccc3aec7701c1804ddc3c5dde216 data/create/loot_tables/blocks/copper_shingles.json +f6a29868a011d9ad73bc29be94ec2a07a2626323 data/create/loot_tables/blocks/copper_table_cloth.json +9cb359c96543d7421250c4ef4e83a5e170974efb data/create/loot_tables/blocks/copper_tiles.json adbe83d6bf88dd7d2b0b8788bb619cedd37f59d9 data/create/loot_tables/blocks/copper_tile_slab.json 1e06f16b1fa8e78af5cbfc90ba8ff1136de83d2d data/create/loot_tables/blocks/copper_tile_stairs.json -9cb359c96543d7421250c4ef4e83a5e170974efb data/create/loot_tables/blocks/copper_tiles.json 4f75cad20e6b091d1f07cf3db98520d2dc3af5e7 data/create/loot_tables/blocks/copper_valve_handle.json 14a493a7bad6bd399b662da470b71810bd56e812 data/create/loot_tables/blocks/copycat_bars.json 3a2f3ab0834a0c5089ba0a11f5e9784ce59ef6d8 data/create/loot_tables/blocks/copycat_base.json @@ -3033,120 +3398,122 @@ d5d2f565bab2e2b81b0798fc7ce0e21acd362ce5 data/create/loot_tables/blocks/crimson_ b892718d33caf0c260b902c92f46f3bfd827af45 data/create/loot_tables/blocks/crushing_wheel.json ff7853a5d5c0f3bddbcfe07e47efd1ff04b14f0a data/create/loot_tables/blocks/cuckoo_clock.json 9083b026ee254645430434b67c2ba7a842f888bf data/create/loot_tables/blocks/cut_andesite.json +c1aa69f80ba11dd52fb3627fc32377599f5ff887 data/create/loot_tables/blocks/cut_andesite_bricks.json c74a4cac08ab1f66146466ff9fb40c8f210de63c data/create/loot_tables/blocks/cut_andesite_brick_slab.json df3f5dcbf676106800bc1113bb022658eb5e85d6 data/create/loot_tables/blocks/cut_andesite_brick_stairs.json 95c5a4a3327f522d986d7baaa747fce5ead8c032 data/create/loot_tables/blocks/cut_andesite_brick_wall.json -c1aa69f80ba11dd52fb3627fc32377599f5ff887 data/create/loot_tables/blocks/cut_andesite_bricks.json cb6cf8aefaac1e00596bd64a182a329dbba7e659 data/create/loot_tables/blocks/cut_andesite_slab.json 7106a637809dcbeb9d4a02a7ff9dc52f7fd9d7a2 data/create/loot_tables/blocks/cut_andesite_stairs.json e3cfa2ecb0b90ebe07cc98f8e47d22d2c0da67e5 data/create/loot_tables/blocks/cut_andesite_wall.json 75eacbc0656e7a83a20a054755ea7d7d78af983d data/create/loot_tables/blocks/cut_asurine.json +f780d37b956ed734cafcbe42b77f1a8ebfa33350 data/create/loot_tables/blocks/cut_asurine_bricks.json 43ad24bb9da878111f3606a17ef9b45bcc4964ae data/create/loot_tables/blocks/cut_asurine_brick_slab.json 8f4d0af32546b6cc77c68a08dc74494b8be1b7c3 data/create/loot_tables/blocks/cut_asurine_brick_stairs.json bb9ce58aa5b4e38c4d3b29aa8e0d905054023eae data/create/loot_tables/blocks/cut_asurine_brick_wall.json -f780d37b956ed734cafcbe42b77f1a8ebfa33350 data/create/loot_tables/blocks/cut_asurine_bricks.json 972ca04f91a1ce4d35995c14e1b17f773b15b61e data/create/loot_tables/blocks/cut_asurine_slab.json a55778dd8735286c3abc65046186b6b8dff0367e data/create/loot_tables/blocks/cut_asurine_stairs.json 70284c686f16d215ff1a8fb19bbe36fddbd31e18 data/create/loot_tables/blocks/cut_asurine_wall.json 0f450ecf60c5d201f332b2736c552d0b51b159b8 data/create/loot_tables/blocks/cut_calcite.json +aec526af372816f306826eefe4a6318db7964892 data/create/loot_tables/blocks/cut_calcite_bricks.json ec0d2854433ac4f58e53685c69dc19629fee16ca data/create/loot_tables/blocks/cut_calcite_brick_slab.json 584e39fa0b78ba8649f69b53f9f032dd1532d6ac data/create/loot_tables/blocks/cut_calcite_brick_stairs.json cc9cbdb7a50305e47181b2452bfce887f9879437 data/create/loot_tables/blocks/cut_calcite_brick_wall.json -aec526af372816f306826eefe4a6318db7964892 data/create/loot_tables/blocks/cut_calcite_bricks.json b4e5b6d5cb63b7b1a4fe639fd727a381bfd00588 data/create/loot_tables/blocks/cut_calcite_slab.json ca83b89401dba12341e6f26786103c10c90447ca data/create/loot_tables/blocks/cut_calcite_stairs.json 64df1c4a373c28bf9be3630935b01a43abd22e03 data/create/loot_tables/blocks/cut_calcite_wall.json 5df3a2229657d7b616790e922b1d1d558b4a5128 data/create/loot_tables/blocks/cut_crimsite.json +59cb609bc9671ac481832eeaf942533c6861fc0e data/create/loot_tables/blocks/cut_crimsite_bricks.json 6fee8d6425e1c832abed8fd9bccc8e6fae9441fc data/create/loot_tables/blocks/cut_crimsite_brick_slab.json 3123bc9e6123dfeda9bb3cece5c2220ac8485535 data/create/loot_tables/blocks/cut_crimsite_brick_stairs.json 56a8c7b1588f6fa9a1fb438e91b04673e02a0c86 data/create/loot_tables/blocks/cut_crimsite_brick_wall.json -59cb609bc9671ac481832eeaf942533c6861fc0e data/create/loot_tables/blocks/cut_crimsite_bricks.json 90ed82b09f2650ee913956d62803d15fc4c0bdbd data/create/loot_tables/blocks/cut_crimsite_slab.json 0e237e008523ed3e9934c598a708be533aaa0861 data/create/loot_tables/blocks/cut_crimsite_stairs.json 48e1edca75186f160a12fa26ac262c7f86d62c82 data/create/loot_tables/blocks/cut_crimsite_wall.json 7bfe4d183ed26de1d7b241c27880a70d28426502 data/create/loot_tables/blocks/cut_deepslate.json +6e375a42ddf38c99fee86531471573716e27fa44 data/create/loot_tables/blocks/cut_deepslate_bricks.json fa4b940ad8ee432ee0fabf496d2da3d5039c204a data/create/loot_tables/blocks/cut_deepslate_brick_slab.json 1063a94b3e90a52a7492d85b1c086514333f3421 data/create/loot_tables/blocks/cut_deepslate_brick_stairs.json 878d809a038c626e8054f9b71e27be08388d7615 data/create/loot_tables/blocks/cut_deepslate_brick_wall.json -6e375a42ddf38c99fee86531471573716e27fa44 data/create/loot_tables/blocks/cut_deepslate_bricks.json 7b5e46aaf34d71993f50b5b6fa1cd5d7ea64264c data/create/loot_tables/blocks/cut_deepslate_slab.json 7d45e8bb037a1e550132854200d57ce31e073993 data/create/loot_tables/blocks/cut_deepslate_stairs.json cd80fd4f573d59c22f0b9799f1ba7422215d4ff1 data/create/loot_tables/blocks/cut_deepslate_wall.json d79d52657307a30422d9ff2eb1caad78024c24f7 data/create/loot_tables/blocks/cut_diorite.json +9f627b6449ae27a1990b84a60349736129a11e39 data/create/loot_tables/blocks/cut_diorite_bricks.json 1809235166024fa74f65a96b622faa8eddf4ce14 data/create/loot_tables/blocks/cut_diorite_brick_slab.json a6bb9fb4eee3dab9a540b228801ce100c048c2a7 data/create/loot_tables/blocks/cut_diorite_brick_stairs.json 690a938a04543cb60f2952335be26b2df9c75715 data/create/loot_tables/blocks/cut_diorite_brick_wall.json -9f627b6449ae27a1990b84a60349736129a11e39 data/create/loot_tables/blocks/cut_diorite_bricks.json 208999222adb5b1cd4fa47b85000841dbae4ad21 data/create/loot_tables/blocks/cut_diorite_slab.json 12849a868e8dff48ebb688c84fc53d4cee2a4eaa data/create/loot_tables/blocks/cut_diorite_stairs.json 469fffcdd40aea22fedb81b7778cc3c61928f3fd data/create/loot_tables/blocks/cut_diorite_wall.json 302d0bb640f696109fe4edc0c1fa9db332231511 data/create/loot_tables/blocks/cut_dripstone.json +48707f37b94ff1a930ee45bb9e8b6b4b67226945 data/create/loot_tables/blocks/cut_dripstone_bricks.json eb31bc108180e2248d575d5d72325b5585254af0 data/create/loot_tables/blocks/cut_dripstone_brick_slab.json 9b624a456baf55960675d7857e159f69911a281a data/create/loot_tables/blocks/cut_dripstone_brick_stairs.json b4c754d4d5a6c28f537c2d73844e39059b2c1450 data/create/loot_tables/blocks/cut_dripstone_brick_wall.json -48707f37b94ff1a930ee45bb9e8b6b4b67226945 data/create/loot_tables/blocks/cut_dripstone_bricks.json eb9eca9a69f763cbe81dc79375ef76978594b51e data/create/loot_tables/blocks/cut_dripstone_slab.json 47fae3abc8bea3ee802d6759192e631f50329c5f data/create/loot_tables/blocks/cut_dripstone_stairs.json 70b71cc460cba2955694baf0550eadc2187e3a8a data/create/loot_tables/blocks/cut_dripstone_wall.json 26433a16a91414be15b20dc85b81b76d086be889 data/create/loot_tables/blocks/cut_granite.json +65c3936e78a90c53faa0b9f9b3034afc2728e7b9 data/create/loot_tables/blocks/cut_granite_bricks.json c6b8dfa87e9c33a0dd2b3398dcc524347e826d44 data/create/loot_tables/blocks/cut_granite_brick_slab.json 5e00417f06b4d357e7469f0efa6e319dfc587da3 data/create/loot_tables/blocks/cut_granite_brick_stairs.json 8d8779846af8121426f128cc7b5d501037bd1cd4 data/create/loot_tables/blocks/cut_granite_brick_wall.json -65c3936e78a90c53faa0b9f9b3034afc2728e7b9 data/create/loot_tables/blocks/cut_granite_bricks.json 6e7253b2801611b4698e786f495c2ade1088ee0b data/create/loot_tables/blocks/cut_granite_slab.json de8c10fb2c7409a3375f2db5cdce2027c3f419bd data/create/loot_tables/blocks/cut_granite_stairs.json cdf40bb46d9457a66129b300dc4d3f0160cc1de2 data/create/loot_tables/blocks/cut_granite_wall.json ac5f062c7fc270c63d67ccecf19499a9e91fa1c4 data/create/loot_tables/blocks/cut_limestone.json +b60fb652e1f83b1af12a15cb47450bd9a6087f6a data/create/loot_tables/blocks/cut_limestone_bricks.json 3b6d3a9b12cf1c2a20bf337cc0155bb66967f0ee data/create/loot_tables/blocks/cut_limestone_brick_slab.json 701249cc12b7aa6f5cc1691ac4dd17e665aa2180 data/create/loot_tables/blocks/cut_limestone_brick_stairs.json 3b8c5eef9b0e8c35e8573ce91f5fddbac7f76f24 data/create/loot_tables/blocks/cut_limestone_brick_wall.json -b60fb652e1f83b1af12a15cb47450bd9a6087f6a data/create/loot_tables/blocks/cut_limestone_bricks.json ba186786e8677f1c769e8f231fe872c48330e13a data/create/loot_tables/blocks/cut_limestone_slab.json d354966d57804afda39ff27336d8b0f38acf6ea3 data/create/loot_tables/blocks/cut_limestone_stairs.json 28b4eee2c6da259e50c58a51905fa2b79a9b89ef data/create/loot_tables/blocks/cut_limestone_wall.json b3d6d90dd0c3e9d4b47d1f87d5abc354dd8c1447 data/create/loot_tables/blocks/cut_ochrum.json +5856859aae0cc633cbd9d83ea7cf7910ce1a88de data/create/loot_tables/blocks/cut_ochrum_bricks.json 67cadc71d90fb2527b9b2b72a74463d71571e493 data/create/loot_tables/blocks/cut_ochrum_brick_slab.json 487b3e7dc1d9d07183b9b699e33f6371858435aa data/create/loot_tables/blocks/cut_ochrum_brick_stairs.json 289757860f07b63dcce531a74ce7e60b4669c51b data/create/loot_tables/blocks/cut_ochrum_brick_wall.json -5856859aae0cc633cbd9d83ea7cf7910ce1a88de data/create/loot_tables/blocks/cut_ochrum_bricks.json c9deec5e3c7343afa3d013704179e2147b2eb7ec data/create/loot_tables/blocks/cut_ochrum_slab.json e851d829db8ea4398bc1cbe6e743b4fba98d3413 data/create/loot_tables/blocks/cut_ochrum_stairs.json 5dce8524b70baeefaeba13422f5900b1a161a867 data/create/loot_tables/blocks/cut_ochrum_wall.json 293064edf2909db8c9edc26bedd1cc023c647664 data/create/loot_tables/blocks/cut_scorchia.json +767910313f0983ebfb49b80526747d762cbdf782 data/create/loot_tables/blocks/cut_scorchia_bricks.json 895c4b9cc71701a26ae0e765ee67f0c06cc70a9c data/create/loot_tables/blocks/cut_scorchia_brick_slab.json c53d72176cb5dd93977975dd84647391fa563e3a data/create/loot_tables/blocks/cut_scorchia_brick_stairs.json 460232ca38cba2f0adc5316d6db8db94db231953 data/create/loot_tables/blocks/cut_scorchia_brick_wall.json -767910313f0983ebfb49b80526747d762cbdf782 data/create/loot_tables/blocks/cut_scorchia_bricks.json c8201964d877a932fe9a9a2d0360004440f7c380 data/create/loot_tables/blocks/cut_scorchia_slab.json dfd09849dbf48a064269a5ea28d0422caa87e4d4 data/create/loot_tables/blocks/cut_scorchia_stairs.json bd5304e38bb92a445c159e9fe647b906e28b232e data/create/loot_tables/blocks/cut_scorchia_wall.json 6b87a22c39b545d5be92e476751b99ceb4bef740 data/create/loot_tables/blocks/cut_scoria.json +833252d2d63c7502f6f0d7981673a8081046c944 data/create/loot_tables/blocks/cut_scoria_bricks.json 659e86f89499539e435989c2eb29e88e9a0ff9f4 data/create/loot_tables/blocks/cut_scoria_brick_slab.json 8434d461090bc43328eec0b4249d27a9ba383707 data/create/loot_tables/blocks/cut_scoria_brick_stairs.json e3f853395b9b6fb7d5bb103c121a77e04526a9e8 data/create/loot_tables/blocks/cut_scoria_brick_wall.json -833252d2d63c7502f6f0d7981673a8081046c944 data/create/loot_tables/blocks/cut_scoria_bricks.json 8360d736887ae3dc22bcf522791ef981e380456c data/create/loot_tables/blocks/cut_scoria_slab.json c771f03308f45e1e87d92181f94cdfd4e61fa5d8 data/create/loot_tables/blocks/cut_scoria_stairs.json 6fecb7fa2774ea63ac0c66e9c3d0f41d6b8cdff7 data/create/loot_tables/blocks/cut_scoria_wall.json 396074ee7fd5a3ddbac9332c74b7bdc4164919e2 data/create/loot_tables/blocks/cut_tuff.json +81465ef7aa555d36adf249bbc9acfe80abbe308e data/create/loot_tables/blocks/cut_tuff_bricks.json 5148f230c773b83268d52650bdacc660025feb95 data/create/loot_tables/blocks/cut_tuff_brick_slab.json 19719a4a3f63d1ec46a9ca9736a825d2dcc880ff data/create/loot_tables/blocks/cut_tuff_brick_stairs.json e20991b67c07dca62c212b43da5b7e7e98146c0e data/create/loot_tables/blocks/cut_tuff_brick_wall.json -81465ef7aa555d36adf249bbc9acfe80abbe308e data/create/loot_tables/blocks/cut_tuff_bricks.json 6d16bd3860207ff6912afc2bf3f0454b572aabba data/create/loot_tables/blocks/cut_tuff_slab.json c14e52ac9901aa873c33d51988bd26465ce0e095 data/create/loot_tables/blocks/cut_tuff_stairs.json dd70800c79fa2ff56bd4ea032cf069bc27cc9076 data/create/loot_tables/blocks/cut_tuff_wall.json 1957b610d14460cc9ca797fe953bf9831509cdbf data/create/loot_tables/blocks/cut_veridium.json +673d1f0fefa7725ac5bfcabfcea577041adc4eeb data/create/loot_tables/blocks/cut_veridium_bricks.json c1515a908bde249c087be1e73aec37773bc3dc5c data/create/loot_tables/blocks/cut_veridium_brick_slab.json d9552e3e9f4de0e09df8ca9446066e94c6e2c681 data/create/loot_tables/blocks/cut_veridium_brick_stairs.json 584c4bd13d9870f9798155b47cc0d32e5751294d data/create/loot_tables/blocks/cut_veridium_brick_wall.json -673d1f0fefa7725ac5bfcabfcea577041adc4eeb data/create/loot_tables/blocks/cut_veridium_bricks.json 009186ed0efe29a229a28cfd913bc02ddad217d4 data/create/loot_tables/blocks/cut_veridium_slab.json 4845f7127921c7dd93a59118e63c37107d6c2061 data/create/loot_tables/blocks/cut_veridium_stairs.json b56caea031d637321eddfd5d122fc357d2c2e49c data/create/loot_tables/blocks/cut_veridium_wall.json ffb440a03f5e513b8d20c2725a95dc5c9b84c73b data/create/loot_tables/blocks/cyan_nixie_tube.json +914146303ae7e73c4f9283ea61cd5443f49f5cde data/create/loot_tables/blocks/cyan_postbox.json 8858b4e1b4e51889b2006005585a17e4978ed8e9 data/create/loot_tables/blocks/cyan_sail.json 8dccecb2c87d7421efdfb3fb97ae62b79f0b4411 data/create/loot_tables/blocks/cyan_seat.json +30bfeac6b7766ff1985ce9953f0dd6824f177aef data/create/loot_tables/blocks/cyan_table_cloth.json 66ea2f2cc32d49bb434f83cbd07736d6fbacacf3 data/create/loot_tables/blocks/cyan_toolbox.json 8c7fd26e7bd03916014274e005d69ab8f14df973 data/create/loot_tables/blocks/cyan_valve_handle.json 704a10ef59d052e92b7035406422231b9bb2372f data/create/loot_tables/blocks/dark_oak_window.json @@ -3155,6 +3522,7 @@ ccb3ab3c0d9c8fad236ccc790c2f7a1524202e9a data/create/loot_tables/blocks/dark_oak 3c3d83fc964462e2401ec6dac5200709d5ce1957 data/create/loot_tables/blocks/deepslate_zinc_ore.json 8c1d8d9680834419b9049bc11137316b75f59f46 data/create/loot_tables/blocks/deployer.json 9ded269b860ed96c964f6f8960a680a5c87fa033 data/create/loot_tables/blocks/depot.json +eec1b262b34fc05a95bbb3762cf96a050030d010 data/create/loot_tables/blocks/desk_bell.json 98987901bdb35efe2922b420def9cdb116ec5416 data/create/loot_tables/blocks/diorite_pillar.json 6dda1fa6622ce351af2e0aeec2b5c2e4183fb593 data/create/loot_tables/blocks/display_board.json 5320ddec6855d99e5685bb424d02165eca480805 data/create/loot_tables/blocks/display_link.json @@ -3165,12 +3533,13 @@ dfe0af3ff61ed2b3082e49c745d8a3e0c5973f4b data/create/loot_tables/blocks/encased_ a2e9a8a10b7fc730c1d7c8db3b529e7a37b683f5 data/create/loot_tables/blocks/encased_fan.json 7ede9f64839f51e6a2eb05b08577d2873f281401 data/create/loot_tables/blocks/encased_fluid_pipe.json 4869211639326efaabd1aba1067bfbb3ab012884 data/create/loot_tables/blocks/experience_block.json +9fa4b0c8ee313b6c9a57d7d5b687cdd01c8259d3 data/create/loot_tables/blocks/exposed_copper_shingles.json 9dbd37ef5ff549f10475101205c1a9d4a44140bc data/create/loot_tables/blocks/exposed_copper_shingle_slab.json d2c9abd9260eb82ea1c2eeae5e2d6abd0b4d3ce8 data/create/loot_tables/blocks/exposed_copper_shingle_stairs.json -9fa4b0c8ee313b6c9a57d7d5b687cdd01c8259d3 data/create/loot_tables/blocks/exposed_copper_shingles.json +f0905ae4c9bdff8fe9e1ab4682a7b1efe2d27d9d data/create/loot_tables/blocks/exposed_copper_tiles.json 6841c02935838f00011d33fc392965326c4dbc5b data/create/loot_tables/blocks/exposed_copper_tile_slab.json 432a047156b93a09b7e027fc34f5680a8f68dc92 data/create/loot_tables/blocks/exposed_copper_tile_stairs.json -f0905ae4c9bdff8fe9e1ab4682a7b1efe2d27d9d data/create/loot_tables/blocks/exposed_copper_tiles.json +4dd285b35d9b94d48f7aa783e93bdd04d58c4a26 data/create/loot_tables/blocks/factory_gauge.json 3fae2a7a3f133a1d7c76ce91f6c48eab787d6ff6 data/create/loot_tables/blocks/fake_track.json 1d4734d6d9ba039c0dfa2271f08cdb55e35b721f data/create/loot_tables/blocks/fluid_pipe.json 9c112883a3763b2d286d9a5a0980dcea82bcc9e6 data/create/loot_tables/blocks/fluid_tank.json @@ -3187,13 +3556,17 @@ a4c86e5456bbbcc417d736151ac6a15c944d555b data/create/loot_tables/blocks/gearshif ffa2776989447e44fa10673986961ab395ebd592 data/create/loot_tables/blocks/glass_fluid_pipe.json 07d8265c285ebb69b9160d516905ae1f17acc87d data/create/loot_tables/blocks/granite_pillar.json 41feb0f235495384ebca5b6f70d01b6f0c0c8878 data/create/loot_tables/blocks/gray_nixie_tube.json +6f123d5e6612274223ddb695e582abd952d3521c data/create/loot_tables/blocks/gray_postbox.json bd526fc4f0acea571c37b2ecbb7267fee6be29f0 data/create/loot_tables/blocks/gray_sail.json 5e23e2032f92737eaa6e6cfb4c62232566f06e77 data/create/loot_tables/blocks/gray_seat.json +d60c2dfc073632b8488e13190b15436173c9caa4 data/create/loot_tables/blocks/gray_table_cloth.json 6ff8b3e59ea98697b87e71eb64d1e6f7e4631f36 data/create/loot_tables/blocks/gray_toolbox.json aa0d47422e0adc3fb18e5c0eefd25c417ddbf9ae data/create/loot_tables/blocks/gray_valve_handle.json 4cfbe1bdc89916f78f891b9dbaed461cd838584b data/create/loot_tables/blocks/green_nixie_tube.json +e99e3895a19faa928e40fa17fbfbda6d3566b1ed data/create/loot_tables/blocks/green_postbox.json 6c22cf8de05828af7979dc32d9e151297d551fe5 data/create/loot_tables/blocks/green_sail.json fbd61c331d4fda692f0e7174aed5aed3652d3553 data/create/loot_tables/blocks/green_seat.json +b918c78d0c8dabd9a6962e4c441096a12f4f47d1 data/create/loot_tables/blocks/green_table_cloth.json 703a285a5d47fcc13e6775040d45620db2ef5480 data/create/loot_tables/blocks/green_toolbox.json 17cbfa7c5627a2ac92826e349d09509f4722fdef data/create/loot_tables/blocks/green_valve_handle.json 8dfbcb358f008317a0515ca35f3976470ca7c4e9 data/create/loot_tables/blocks/hand_crank.json @@ -3202,7 +3575,10 @@ f917ddc34b196750efbab88ee5565ecd0e38e0e6 data/create/loot_tables/blocks/haunted_ a206598562bcbc9e3bc10dbe12fb22974ee58fcc data/create/loot_tables/blocks/horizontal_framed_glass_pane.json e65fae1b9b72cf2208696463fa20a82a4d64fb62 data/create/loot_tables/blocks/hose_pulley.json 34c239150baa92e03ca89430148560e1b7a1f02d data/create/loot_tables/blocks/industrial_iron_block.json +9c831bbcae1bf3dbddce1126a1279f4f22902a25 data/create/loot_tables/blocks/industrial_iron_window.json +de30f216e9326c27103702ea296c460d927aa3ef data/create/loot_tables/blocks/industrial_iron_window_pane.json c22dea1941471be65c811cdc2ce7b77d2247e9e1 data/create/loot_tables/blocks/item_drain.json +528078b0cf042236d2cb0701fb55f41f54aa932b data/create/loot_tables/blocks/item_hatch.json 72b5a7288f7f54694df5f456e4ab4433bd38dfff data/create/loot_tables/blocks/item_vault.json 13bd1033991eb65354a9b9406fe638c357fea409 data/create/loot_tables/blocks/jungle_window.json fe9c2629eb30393d2ae5a1f252b9732506ef9bef data/create/loot_tables/blocks/jungle_window_pane.json @@ -3225,27 +3601,35 @@ b4882fe056a8d03bddf7a8c4fa70ee06548e1743 data/create/loot_tables/blocks/layered_ 7f9ea6bfcf8344018866013e12d23edf21f034e9 data/create/loot_tables/blocks/layered_veridium.json 54a876a52655d5c9c33325a7d07c7978d33adca6 data/create/loot_tables/blocks/lectern_controller.json 8a6153a0b5857c77cdac0cffcb22e30ae6181f3a data/create/loot_tables/blocks/light_blue_nixie_tube.json +27bbda185ab99cff4974e6bfc40b72265896ef42 data/create/loot_tables/blocks/light_blue_postbox.json 304072298d4078eca7e0fb8c58ea3144afe246a8 data/create/loot_tables/blocks/light_blue_sail.json a1396be526ef27c6d0f97cdd0f0e61f810e7353b data/create/loot_tables/blocks/light_blue_seat.json +b281c6ff8b383f27bba02e11819ddab13c80a473 data/create/loot_tables/blocks/light_blue_table_cloth.json 0cd56baf9f3c9edb97e4ce892d374e21a099374f data/create/loot_tables/blocks/light_blue_toolbox.json bf4e6c308d82f15689406b5b3e88fe95d49a9a44 data/create/loot_tables/blocks/light_blue_valve_handle.json 6928acbfcafdfead9750be6760da163b86532054 data/create/loot_tables/blocks/light_gray_nixie_tube.json +eb95d1e0abb93d5efecb0809e3901f37021c4dfc data/create/loot_tables/blocks/light_gray_postbox.json 886ef98e4bd60d8860b56441da6928e24f262d70 data/create/loot_tables/blocks/light_gray_sail.json 1ae0ff25ac9468e67ab1847b87a37829328d4c84 data/create/loot_tables/blocks/light_gray_seat.json +e61e9b3e116037c4ad44a7e222e5127e5767ddad data/create/loot_tables/blocks/light_gray_table_cloth.json e22dfadefcea50090efe87136a4b92e6ef20d379 data/create/loot_tables/blocks/light_gray_toolbox.json 3e586bc1281f15e25e75475dd726578ff032c6ae data/create/loot_tables/blocks/light_gray_valve_handle.json -582bb26f6df37d0c2dbe12983ad05fc74f5fb5c0 data/create/loot_tables/blocks/lime_nixie_tube.json -623ac65211a9920325308b55285f78e3b7275751 data/create/loot_tables/blocks/lime_sail.json -7efe69664a781b292f491d5ff89e27dd5991f3cf data/create/loot_tables/blocks/lime_seat.json -0f6a465501a445925e9aff7a4c84b3c8e2caa93e data/create/loot_tables/blocks/lime_toolbox.json -1a3ed7cd5660d7ea014956ea642e0b07d89bc297 data/create/loot_tables/blocks/lime_valve_handle.json c6bb0877c537dda15469934383dc45c608bfd1a4 data/create/loot_tables/blocks/limestone.json 49058a62e1abd34917f983b6bc13cc4353b613a2 data/create/loot_tables/blocks/limestone_pillar.json +582bb26f6df37d0c2dbe12983ad05fc74f5fb5c0 data/create/loot_tables/blocks/lime_nixie_tube.json +ec9d973d218b26d51b82f265603feab31170c619 data/create/loot_tables/blocks/lime_postbox.json +623ac65211a9920325308b55285f78e3b7275751 data/create/loot_tables/blocks/lime_sail.json +7efe69664a781b292f491d5ff89e27dd5991f3cf data/create/loot_tables/blocks/lime_seat.json +10ecd65ecba6b66652dd04a385fc47a44c1f8110 data/create/loot_tables/blocks/lime_table_cloth.json +0f6a465501a445925e9aff7a4c84b3c8e2caa93e data/create/loot_tables/blocks/lime_toolbox.json +1a3ed7cd5660d7ea014956ea642e0b07d89bc297 data/create/loot_tables/blocks/lime_valve_handle.json baf70f9eb579f20b232a2af4e6b00a54f84844e6 data/create/loot_tables/blocks/linear_chassis.json e4c0f8ca822cf7555bd011825b430c3c735160d4 data/create/loot_tables/blocks/lit_blaze_burner.json 6bd8b044cc9c69a5268372e5436f556da2c1bf21 data/create/loot_tables/blocks/magenta_nixie_tube.json +601bc43286b9f6b978ae8681281bf8e195f8211d data/create/loot_tables/blocks/magenta_postbox.json b4d06c9ce7fbec0f23bb6dbc446b77d070f06775 data/create/loot_tables/blocks/magenta_sail.json 300e480d8e43e3a4ca19a92ae1360c02f7c5accd data/create/loot_tables/blocks/magenta_seat.json +64bbc8f91a7b60d86c76e237cb87863f7f7539c9 data/create/loot_tables/blocks/magenta_table_cloth.json 40d2ba0a52eaa2c61900731f0cee2657c5e77c20 data/create/loot_tables/blocks/magenta_toolbox.json 347115d1507997a6f838d222092092ab994db7e5 data/create/loot_tables/blocks/magenta_valve_handle.json 49c68e263386549cc30438d3b3878ec5bbd909cc data/create/loot_tables/blocks/mangrove_window.json @@ -3276,22 +3660,28 @@ fe79cb4cbea87efc84d61d3d31f073bf3c64c73d data/create/loot_tables/blocks/netherit 5dcb11160a51ce17fb06f5fecc14e87d92b1a641 data/create/loot_tables/blocks/oak_window_pane.json 461e9818f41aab34905757a423455cdcee780e67 data/create/loot_tables/blocks/ochrum.json 1259a439286385d5b7c48bff89d0839f1f2e02c2 data/create/loot_tables/blocks/ochrum_pillar.json +3f6940f13ca705bad7cdb9a9b80a3ae84f70f80c data/create/loot_tables/blocks/orange_postbox.json d6323d4b30faa87cd4b5b8b815cb16f78296f203 data/create/loot_tables/blocks/orange_sail.json 119fc4c3055c09c7958ac405925a6b7be2081c6b data/create/loot_tables/blocks/orange_seat.json +24b82ccacdc00d98a660c20384c76927cd8c2948 data/create/loot_tables/blocks/orange_table_cloth.json 54ac8c8166c23f24a8a0870c981ef8ffa64c0b89 data/create/loot_tables/blocks/orange_toolbox.json 30aef2df782b6b35cd16b4c205bb15de85bc0664 data/create/loot_tables/blocks/orange_valve_handle.json f4004c6d16754fc8867ed6618dace8e8f6dcc412 data/create/loot_tables/blocks/ornate_iron_window.json 6f14500e07c6d342804f9127e7b66047ffaeef1e data/create/loot_tables/blocks/ornate_iron_window_pane.json +3e54d3c4755a43d837a1d9b2005ea1dee4d02555 data/create/loot_tables/blocks/oxidized_copper_shingles.json 62c43a533e4ffeeec9f7657db5a796569087f806 data/create/loot_tables/blocks/oxidized_copper_shingle_slab.json f47a01824093455030fca66e7b8a39bcfc61d219 data/create/loot_tables/blocks/oxidized_copper_shingle_stairs.json -3e54d3c4755a43d837a1d9b2005ea1dee4d02555 data/create/loot_tables/blocks/oxidized_copper_shingles.json +4d2a2863697664b3b71f02aa703c3504cd5cc826 data/create/loot_tables/blocks/oxidized_copper_tiles.json 4d815b361af81bd0c0e14c853ca54ad3cde66a57 data/create/loot_tables/blocks/oxidized_copper_tile_slab.json d599ef03d1b69e4367ec0dea78f52c1964c99f9b data/create/loot_tables/blocks/oxidized_copper_tile_stairs.json -4d2a2863697664b3b71f02aa703c3504cd5cc826 data/create/loot_tables/blocks/oxidized_copper_tiles.json +ab8cee7abd7dd92428bf7d8f0f5edd35082401a4 data/create/loot_tables/blocks/packager.json +54aa9700df601640b705d912abe773d5b6ee2b1f data/create/loot_tables/blocks/package_frogport.json 58bd9fe9d6706998bfbda3b077cfd0a740972091 data/create/loot_tables/blocks/peculiar_bell.json 4d7724df6fefee4512c4f7886d0e103d1dc39510 data/create/loot_tables/blocks/pink_nixie_tube.json +df7b12349c64d035eb563535b03cb70d780c5a71 data/create/loot_tables/blocks/pink_postbox.json 85811771fbc36f645fdb9f510639715399503c99 data/create/loot_tables/blocks/pink_sail.json 9a5652002131d14c585a6e434a4457ef36d2f60d data/create/loot_tables/blocks/pink_seat.json +23e3176e0511b3910b9dcefa1821af9c9acfa34b data/create/loot_tables/blocks/pink_table_cloth.json 23e28971460b2a3b8b39412a4778672d7ced4af7 data/create/loot_tables/blocks/pink_toolbox.json e234842b7d2334b77d02e383908795f0714b21a2 data/create/loot_tables/blocks/pink_valve_handle.json 175735e4a055945df59fb6206ef1a6ebf8ca3e8f data/create/loot_tables/blocks/piston_extension_pole.json @@ -3360,22 +3750,29 @@ afe84b9468fba532acc447236a9a0cbdd02c4560 data/create/loot_tables/blocks/powered_ fbc433a7e8518860bc828a52b56dba92e4dff66c data/create/loot_tables/blocks/pulley_magnet.json e654e6cedc0373e97caea947e7e605bc4095da88 data/create/loot_tables/blocks/pulse_extender.json 422385f062dd63edaf246c42fb0e617e92e6cc44 data/create/loot_tables/blocks/pulse_repeater.json +93f0c41aedaa2b9baceda78b93a4b3198962e3f9 data/create/loot_tables/blocks/pulse_timer.json 6f453ea136098a5872aeb4e2ad1e5b78d2fd571f data/create/loot_tables/blocks/purple_nixie_tube.json +53e964048baa1b98877a559e8fda6c8f367d5cd6 data/create/loot_tables/blocks/purple_postbox.json c6b7a02db55cf0824a48156adf469c478dfd6a8d data/create/loot_tables/blocks/purple_sail.json 73cd7cc36fafb491666d2bccf1b4f24624b3c8f2 data/create/loot_tables/blocks/purple_seat.json +b4746e296f4bf63778e40a751b4c7fa8be45d21d data/create/loot_tables/blocks/purple_table_cloth.json 147086b9db173aed1b25d9460d0135708dcebcf9 data/create/loot_tables/blocks/purple_toolbox.json 0354f88c3e1d0b6580b9a23d23752dcd9b86fc31 data/create/loot_tables/blocks/purple_valve_handle.json 9e5e841d9f9a00d560ed17a7e197dc56bae334b7 data/create/loot_tables/blocks/radial_chassis.json 73a03fa31e299cec2c8a3dc0f31a8aa354b49bcd data/create/loot_tables/blocks/railway_casing.json f76e5a157d2aeab5708f464b1f3c8e47b3855f18 data/create/loot_tables/blocks/raw_zinc_block.json -a50e1c28af16e9f1b4f48aa974461167139768a7 data/create/loot_tables/blocks/red_nixie_tube.json -977d724cddf8eba053a3310ad0d30af15199bbed data/create/loot_tables/blocks/red_sail.json -9aedede893e2127a1cdd17695699397d8d5c6ce5 data/create/loot_tables/blocks/red_seat.json -9713071cab536e8c1550a6309dc4563fecc2c4e0 data/create/loot_tables/blocks/red_toolbox.json -17d75711f4ef5d76aa931175364642732fb0c60d data/create/loot_tables/blocks/red_valve_handle.json bbc2d61eeea335f8f011d799ef6a5484ca027640 data/create/loot_tables/blocks/redstone_contact.json 4fa70deeac7e56121e42fb602dfa27ee1727f749 data/create/loot_tables/blocks/redstone_link.json +efc3a5595e4daf67fa43f84c9869dfc76fd6fca4 data/create/loot_tables/blocks/redstone_requester.json +a50e1c28af16e9f1b4f48aa974461167139768a7 data/create/loot_tables/blocks/red_nixie_tube.json +f36f1e69e4fb8723238f81aadbac892f54b5ac62 data/create/loot_tables/blocks/red_postbox.json +977d724cddf8eba053a3310ad0d30af15199bbed data/create/loot_tables/blocks/red_sail.json +9aedede893e2127a1cdd17695699397d8d5c6ce5 data/create/loot_tables/blocks/red_seat.json +09796bc3be977e17927d0a9e32bff2982618e844 data/create/loot_tables/blocks/red_table_cloth.json +9713071cab536e8c1550a6309dc4563fecc2c4e0 data/create/loot_tables/blocks/red_toolbox.json +17d75711f4ef5d76aa931175364642732fb0c60d data/create/loot_tables/blocks/red_valve_handle.json 632067fe6309e31e78637eb0272209b630750242 data/create/loot_tables/blocks/refined_radiance_casing.json +ee2c4d66d1264ec613e9e84fcac814d2f5806258 data/create/loot_tables/blocks/repackager.json 354a3b6c73379b7100b0dd12b3f3b008830c4d2d data/create/loot_tables/blocks/rope.json f74fdd78961619d712891c36e0a0778c25e145dc data/create/loot_tables/blocks/rope_pulley.json 77d2da2217689608095866de4af4b41104348354 data/create/loot_tables/blocks/rose_quartz_block.json @@ -3383,8 +3780,8 @@ f74fdd78961619d712891c36e0a0778c25e145dc data/create/loot_tables/blocks/rope_pul a0575567d5679f2c54e5a25c6ec12338f8cdc939 data/create/loot_tables/blocks/rose_quartz_tiles.json de74765a3bbffafb87d632857dfcfa83f863f814 data/create/loot_tables/blocks/rotation_speed_controller.json 2af8df3e36ace336c43d68f4e53564640a89845f data/create/loot_tables/blocks/sail_frame.json -5a54e930243919991d71a1c3296002ff86dd88e1 data/create/loot_tables/blocks/schematic_table.json d499fd59d30da8b907b0f3a0f428700f066eddff data/create/loot_tables/blocks/schematicannon.json +5a54e930243919991d71a1c3296002ff86dd88e1 data/create/loot_tables/blocks/schematic_table.json 1d9b0df1330f44681bbd56f8560a30ef9e2175ff data/create/loot_tables/blocks/scorchia.json e39f189bfaebd31aedceb11e25720f1e08eb238d data/create/loot_tables/blocks/scorchia_pillar.json 5e3a37dbb2fcc0d6be042bfd063fd8b1414d6169 data/create/loot_tables/blocks/scoria.json @@ -3393,64 +3790,64 @@ d39afcaedc84d582c0c1f21ec5945cd0a67d389d data/create/loot_tables/blocks/secondar e33a34b47e07cf3262c0dbdbc651b31b9492b18f data/create/loot_tables/blocks/sequenced_gearshift.json 7d61387106e5e7fcc4aa0b05b9560cd5f4ef7df8 data/create/loot_tables/blocks/shadow_steel_casing.json 7e67d04f861e0a680487e27f94022a7850652dfe data/create/loot_tables/blocks/shaft.json +e88ff4ab1341c2db8338de0708b0ca8f40f15a8b data/create/loot_tables/blocks/small_andesite_bricks.json 220febcbcc4a993d475b683ebef7468ebdb7bf26 data/create/loot_tables/blocks/small_andesite_brick_slab.json b4764c5bb538359bcc2a599ff3b7474ade2115ed data/create/loot_tables/blocks/small_andesite_brick_stairs.json a891496ffb91bef56c3b684cb55a57e27a72154a data/create/loot_tables/blocks/small_andesite_brick_wall.json -e88ff4ab1341c2db8338de0708b0ca8f40f15a8b data/create/loot_tables/blocks/small_andesite_bricks.json +576d8f6beca755a4082f1c8941e2590c1d18107b data/create/loot_tables/blocks/small_asurine_bricks.json 1a5d3543ebb7c0064ba8ff01160a22a0f5f29f36 data/create/loot_tables/blocks/small_asurine_brick_slab.json 64f4b44b786eda91d432f20c8b725b0415440b56 data/create/loot_tables/blocks/small_asurine_brick_stairs.json 60a1d505e955047cf933ae55efc2e7c10d0a5a79 data/create/loot_tables/blocks/small_asurine_brick_wall.json -576d8f6beca755a4082f1c8941e2590c1d18107b data/create/loot_tables/blocks/small_asurine_bricks.json 64bcfece2507b8510633ae20c00ab989232664ff data/create/loot_tables/blocks/small_bogey.json +c03bba06f66262c0ced5e85fa7dcbfbfc8c9db71 data/create/loot_tables/blocks/small_calcite_bricks.json b673542c79f4a82f2e80c0931354e994292811f6 data/create/loot_tables/blocks/small_calcite_brick_slab.json e10d286286bba8e172a56e0eeb9af18d06d1a76d data/create/loot_tables/blocks/small_calcite_brick_stairs.json d7214e942b203823fa2fece883e8406a7721369f data/create/loot_tables/blocks/small_calcite_brick_wall.json -c03bba06f66262c0ced5e85fa7dcbfbfc8c9db71 data/create/loot_tables/blocks/small_calcite_bricks.json +f49d32973b0be51229f4e3fdc13958c9852c5c8a data/create/loot_tables/blocks/small_crimsite_bricks.json ef8b0f604b627715542e8216ae5448e88995cc13 data/create/loot_tables/blocks/small_crimsite_brick_slab.json dbec9246ab957a3ed2dbd0707df12c1496258e05 data/create/loot_tables/blocks/small_crimsite_brick_stairs.json d4d5bd8b101655205c4f293f23e83f610e179e91 data/create/loot_tables/blocks/small_crimsite_brick_wall.json -f49d32973b0be51229f4e3fdc13958c9852c5c8a data/create/loot_tables/blocks/small_crimsite_bricks.json +8caba3e7001dd8df4d3e6365b97849570c74c840 data/create/loot_tables/blocks/small_deepslate_bricks.json 44567c10c28ddd221198824766d3fec289fb29d4 data/create/loot_tables/blocks/small_deepslate_brick_slab.json fc141f5cdb1001d344b5ef8fa3ad1fdfeb01d048 data/create/loot_tables/blocks/small_deepslate_brick_stairs.json 3cf68d27362e9bb5dc3255ccf810097fbee511ba data/create/loot_tables/blocks/small_deepslate_brick_wall.json -8caba3e7001dd8df4d3e6365b97849570c74c840 data/create/loot_tables/blocks/small_deepslate_bricks.json +4f22a84f105c2fabfd08ff0782ec30bbdc59f940 data/create/loot_tables/blocks/small_diorite_bricks.json f6565f4bd11b7e95008b0f8fc3f5f2c7af1b77f8 data/create/loot_tables/blocks/small_diorite_brick_slab.json e3cbe41b4b2c38d0d5e625e34b61fc79db16d3bd data/create/loot_tables/blocks/small_diorite_brick_stairs.json 787dfaa16dc30155c90cc360f6927fa067a30ed8 data/create/loot_tables/blocks/small_diorite_brick_wall.json -4f22a84f105c2fabfd08ff0782ec30bbdc59f940 data/create/loot_tables/blocks/small_diorite_bricks.json +d9cc7f58c791e040df4abfce225524e01eb01d49 data/create/loot_tables/blocks/small_dripstone_bricks.json f72338c9252528e41f60cb183cb4ee07cea47bf0 data/create/loot_tables/blocks/small_dripstone_brick_slab.json bedf0fba68e8a8ce4205a968429ebe9c3ddfb528 data/create/loot_tables/blocks/small_dripstone_brick_stairs.json c1168f58f342dfa332bfa7f53f5f03383c55ccf2 data/create/loot_tables/blocks/small_dripstone_brick_wall.json -d9cc7f58c791e040df4abfce225524e01eb01d49 data/create/loot_tables/blocks/small_dripstone_bricks.json +8437e7e28e45c10562d182c4c07189bcc108cabb data/create/loot_tables/blocks/small_granite_bricks.json 4d111f8580ac97cf1b49b667462f7141846f3d3a data/create/loot_tables/blocks/small_granite_brick_slab.json c16e015251126614960d3e6300cb04d3aeaf49b4 data/create/loot_tables/blocks/small_granite_brick_stairs.json e0ff780ddeb5d5c8d2b6cd7736ac05f4556de52c data/create/loot_tables/blocks/small_granite_brick_wall.json -8437e7e28e45c10562d182c4c07189bcc108cabb data/create/loot_tables/blocks/small_granite_bricks.json +c60def11fbac5010bf749960e084dd5cd0dc4b07 data/create/loot_tables/blocks/small_limestone_bricks.json 5222ac5255c9a9ada0ce1da0fd4f4acbeee8ddb7 data/create/loot_tables/blocks/small_limestone_brick_slab.json 97310b6b1cbea869ebaa52861542787c49cee017 data/create/loot_tables/blocks/small_limestone_brick_stairs.json 0855921034db43692baa9fd0bcb767154f96d591 data/create/loot_tables/blocks/small_limestone_brick_wall.json -c60def11fbac5010bf749960e084dd5cd0dc4b07 data/create/loot_tables/blocks/small_limestone_bricks.json +eb6b2171a6c99a3a28089752f26ddc6ac1f941d1 data/create/loot_tables/blocks/small_ochrum_bricks.json 8ced0c24db685dbf4382b7b71124005edde9e0b2 data/create/loot_tables/blocks/small_ochrum_brick_slab.json 090e7154fb2c3dfd20d37aa87f3df4572a27c615 data/create/loot_tables/blocks/small_ochrum_brick_stairs.json 60f2d9970ad8caf8ffe3aa8083dbba671b8d4b8b data/create/loot_tables/blocks/small_ochrum_brick_wall.json -eb6b2171a6c99a3a28089752f26ddc6ac1f941d1 data/create/loot_tables/blocks/small_ochrum_bricks.json a001d069c2b4d15c6dfd0312749765fc4e89571e data/create/loot_tables/blocks/small_rose_quartz_tiles.json +ce71e670948453691d4f09c8110b952afb41afa1 data/create/loot_tables/blocks/small_scorchia_bricks.json d521cf885c737da2e4717d43072840ffd3f4c5d9 data/create/loot_tables/blocks/small_scorchia_brick_slab.json de6b5d583e1adf4d49147e0719616dfd0165726d data/create/loot_tables/blocks/small_scorchia_brick_stairs.json 895603c6920338ffafd8d0d1310e47ac20bdbfda data/create/loot_tables/blocks/small_scorchia_brick_wall.json -ce71e670948453691d4f09c8110b952afb41afa1 data/create/loot_tables/blocks/small_scorchia_bricks.json +8b7e61477c4fdc834d669bda9197b585d60f26a2 data/create/loot_tables/blocks/small_scoria_bricks.json d1954c07a66f40123d8d78602795efad7c92070f data/create/loot_tables/blocks/small_scoria_brick_slab.json 291b5a560f09ed8f09ccc949a1a4da0006f139c7 data/create/loot_tables/blocks/small_scoria_brick_stairs.json ed572e947f78d637e6e1a4166c111121087c41c3 data/create/loot_tables/blocks/small_scoria_brick_wall.json -8b7e61477c4fdc834d669bda9197b585d60f26a2 data/create/loot_tables/blocks/small_scoria_bricks.json +2c7097ee677f42452212b5dce8959065d2bb0e15 data/create/loot_tables/blocks/small_tuff_bricks.json ad8a3571dc3ae0ee1ec7be7f35c9796e544f0682 data/create/loot_tables/blocks/small_tuff_brick_slab.json 17f4a98a81e5920b75c88133d15b63d431f3fb64 data/create/loot_tables/blocks/small_tuff_brick_stairs.json 7defad704f6278e329af634acfb9efd617b2003e data/create/loot_tables/blocks/small_tuff_brick_wall.json -2c7097ee677f42452212b5dce8959065d2bb0e15 data/create/loot_tables/blocks/small_tuff_bricks.json +e499c0a8a0f804003612f3a4c9286cb4b033fe4b data/create/loot_tables/blocks/small_veridium_bricks.json c7771827a715b9eaacd1a7b7e863e274b1dee11f data/create/loot_tables/blocks/small_veridium_brick_slab.json 818b65dd5d868527e7df7658a4f62a93f2795186 data/create/loot_tables/blocks/small_veridium_brick_stairs.json 7733e53a90f2ba9c17cdedaa8720e70df1a8d2de data/create/loot_tables/blocks/small_veridium_brick_wall.json -e499c0a8a0f804003612f3a4c9286cb4b033fe4b data/create/loot_tables/blocks/small_veridium_bricks.json a121d21b81e93c119b6ee32ca21d260d9c33cb2a data/create/loot_tables/blocks/smart_chute.json 4556eb2d607db3631d0a9524d22a50686ce4a5a8 data/create/loot_tables/blocks/smart_fluid_pipe.json 9601e8ba0eb098cc409557f17b01669d8b971461 data/create/loot_tables/blocks/speedometer.json @@ -3463,6 +3860,8 @@ cae1bd9100b62841e260880faa80e2442f44a141 data/create/loot_tables/blocks/steam_wh 0bc3fdde351129e3a261a2420aff9d3f063c235e data/create/loot_tables/blocks/sticker.json 074f526902cb5fcff2129614428aba1ea05a6649 data/create/loot_tables/blocks/sticky_mechanical_piston.json a7332324e63f7d28621ddfbd54eb3d091461d890 data/create/loot_tables/blocks/stockpile_switch.json +af312881ec9bfb0902438f53c5cac020244bdba2 data/create/loot_tables/blocks/stock_link.json +f4fa9bb255348dc79dcc0468b3beb9ad075eb036 data/create/loot_tables/blocks/stock_ticker.json b13496b1b4bc0be30605832e23894fb374dd796e data/create/loot_tables/blocks/stressometer.json 6a7df4d2730d57ae6e404b4bc8e01367e5ddbf07 data/create/loot_tables/blocks/tiled_glass.json 0ad584e41780dc0183af1fa1e49e126730dfdbab data/create/loot_tables/blocks/tiled_glass_pane.json @@ -3482,47 +3881,54 @@ cfc82d2aa8248caeaa17ff0a60db02607046550d data/create/loot_tables/blocks/warped_w 2eeddb89cfc597bc1ce0736b9f4a6f98e0dfa4d2 data/create/loot_tables/blocks/warped_window_pane.json ccab211722d7f06913a549851b0d6e8278edc845 data/create/loot_tables/blocks/water_wheel.json ea5dfcedc928e8dfa1c59cf3917d1577dff87494 data/create/loot_tables/blocks/water_wheel_structure.json +bbc6fc068adccea464909b87f1d1f426324d74cc data/create/loot_tables/blocks/waxed_copper_shingles.json cb31be1e75ca822454bd0a89954f74c4c8726b33 data/create/loot_tables/blocks/waxed_copper_shingle_slab.json c8e440e42141788d1988c57ab91cb1bfcd977407 data/create/loot_tables/blocks/waxed_copper_shingle_stairs.json -bbc6fc068adccea464909b87f1d1f426324d74cc data/create/loot_tables/blocks/waxed_copper_shingles.json +a3b8f12d983077477963fd3fc893c5acd36ad552 data/create/loot_tables/blocks/waxed_copper_tiles.json 807da1d66d6c7d07efc8973de43415fa4b5ddfdc data/create/loot_tables/blocks/waxed_copper_tile_slab.json 92759871a9c84815b98b6dcd22fcf0dd958bc8ab data/create/loot_tables/blocks/waxed_copper_tile_stairs.json -a3b8f12d983077477963fd3fc893c5acd36ad552 data/create/loot_tables/blocks/waxed_copper_tiles.json +eb9781d081d52c34c041004c774b52169b4a9ca0 data/create/loot_tables/blocks/waxed_exposed_copper_shingles.json be5aabc98f4d70028f2b49ae1eaf0bc68a693c53 data/create/loot_tables/blocks/waxed_exposed_copper_shingle_slab.json a99143d290addb98427be53d7fea1cbc702d630c data/create/loot_tables/blocks/waxed_exposed_copper_shingle_stairs.json -eb9781d081d52c34c041004c774b52169b4a9ca0 data/create/loot_tables/blocks/waxed_exposed_copper_shingles.json +e79c0636852b37a463dc122d66cdec27d3aa10c4 data/create/loot_tables/blocks/waxed_exposed_copper_tiles.json 234cbb59a0e00d82c5508c8e9a61e328c22c1c56 data/create/loot_tables/blocks/waxed_exposed_copper_tile_slab.json de628114eb25f393efc4c0934d79c5bdc4365f75 data/create/loot_tables/blocks/waxed_exposed_copper_tile_stairs.json -e79c0636852b37a463dc122d66cdec27d3aa10c4 data/create/loot_tables/blocks/waxed_exposed_copper_tiles.json +60fe0594baab9599956d990ba893f8915835db81 data/create/loot_tables/blocks/waxed_oxidized_copper_shingles.json c8935df7d4634dee2b01c8a0ac5de12397f4d9ed data/create/loot_tables/blocks/waxed_oxidized_copper_shingle_slab.json 2b9370b7fa362ea88f916dd53747da80e4ae3357 data/create/loot_tables/blocks/waxed_oxidized_copper_shingle_stairs.json -60fe0594baab9599956d990ba893f8915835db81 data/create/loot_tables/blocks/waxed_oxidized_copper_shingles.json +f0721c371b08214337f3f4fce3a3705840310bdb data/create/loot_tables/blocks/waxed_oxidized_copper_tiles.json de4d25cac546559173f740752625c82dfd6bae09 data/create/loot_tables/blocks/waxed_oxidized_copper_tile_slab.json 2ed72fc0ea28303f5c6d1039662f55c677cb7bcb data/create/loot_tables/blocks/waxed_oxidized_copper_tile_stairs.json -f0721c371b08214337f3f4fce3a3705840310bdb data/create/loot_tables/blocks/waxed_oxidized_copper_tiles.json +f309ffd94dfb3591efd2fab337a871a0ceff1084 data/create/loot_tables/blocks/waxed_weathered_copper_shingles.json 9a7b265a963e122d510de64012ed1d98ad9017f9 data/create/loot_tables/blocks/waxed_weathered_copper_shingle_slab.json 62f25a1bc013e9c3d487d9a53407e58d89907c5b data/create/loot_tables/blocks/waxed_weathered_copper_shingle_stairs.json -f309ffd94dfb3591efd2fab337a871a0ceff1084 data/create/loot_tables/blocks/waxed_weathered_copper_shingles.json +26e6a96f50e7f3384f896bf8a5c3d5ff2b422526 data/create/loot_tables/blocks/waxed_weathered_copper_tiles.json 3fa20e33ced4aee01775db57629b9580a6b8e200 data/create/loot_tables/blocks/waxed_weathered_copper_tile_slab.json 59b28bd57f461482a394dbce9ea10ee25fc7c294 data/create/loot_tables/blocks/waxed_weathered_copper_tile_stairs.json -26e6a96f50e7f3384f896bf8a5c3d5ff2b422526 data/create/loot_tables/blocks/waxed_weathered_copper_tiles.json +3cd15ae684bc0e4e41f02b3ee79eafdbf052620c data/create/loot_tables/blocks/weathered_copper_shingles.json 278a56aa433ba3647107b3bf0553da5a5f6d40dd data/create/loot_tables/blocks/weathered_copper_shingle_slab.json 198babfd55c3a30c6ac61e81d5e01b0cf8fca80a data/create/loot_tables/blocks/weathered_copper_shingle_stairs.json -3cd15ae684bc0e4e41f02b3ee79eafdbf052620c data/create/loot_tables/blocks/weathered_copper_shingles.json +771d98a6627d707228719e843bc80636b02dc985 data/create/loot_tables/blocks/weathered_copper_tiles.json d6862dc9f7d291df618fbce71eebf613711a5517 data/create/loot_tables/blocks/weathered_copper_tile_slab.json 57d5065d53016e4b1ef0fbad9b84605b1546bcc4 data/create/loot_tables/blocks/weathered_copper_tile_stairs.json -771d98a6627d707228719e843bc80636b02dc985 data/create/loot_tables/blocks/weathered_copper_tiles.json +013deea9b687ce96e5042de13ab0cba9dadce364 data/create/loot_tables/blocks/weathered_iron_block.json +f0c51ad0a713aab00dff913361b8e5e8448b912a data/create/loot_tables/blocks/weathered_iron_window.json +1d3ea471ec3f2bbf10c7a11f040f8bbf0d1576a8 data/create/loot_tables/blocks/weathered_iron_window_pane.json f6ba0623b4bcea2f3796df4c65c494fc072d2c21 data/create/loot_tables/blocks/weighted_ejector.json 978263272f632ed79a61d52a0080de0b7b8102d6 data/create/loot_tables/blocks/white_nixie_tube.json +3d8a4d4a9634d49b20f65ebcdddaef2d0f21b36b data/create/loot_tables/blocks/white_postbox.json 129c6772c1c12271f9b0d41c77f41ce34fc437b1 data/create/loot_tables/blocks/white_sail.json 84c79bc47b4a74021e91745356bb24fe02402209 data/create/loot_tables/blocks/white_seat.json +cda45c1338e6c9078a107e99c70690fe3e0aa7c2 data/create/loot_tables/blocks/white_table_cloth.json 3c63263c9fb642e34a0a67af4cab2d4348d661c0 data/create/loot_tables/blocks/white_toolbox.json 2fae4331c0ab590aef542cf4e23deea579d734f8 data/create/loot_tables/blocks/white_valve_handle.json bf0ea5c6957a43b6c4b1914df70e0b8f6585e638 data/create/loot_tables/blocks/windmill_bearing.json ed989d41a4b640dc1ffb15c9c0712ee3172d408f data/create/loot_tables/blocks/wooden_bracket.json d9f853e662b004b6ffdbb82af99ad7e774698178 data/create/loot_tables/blocks/yellow_nixie_tube.json +a536699cab16540eb906e0b63a2c5064244c7b6c data/create/loot_tables/blocks/yellow_postbox.json 0ead61521fec15522633d6cfdeb77150bb30d075 data/create/loot_tables/blocks/yellow_sail.json 3ae6d4e380237face57b9187ab8570967226b3b1 data/create/loot_tables/blocks/yellow_seat.json +573457c5bb1a8693f4b877620468703c86051a3a data/create/loot_tables/blocks/yellow_table_cloth.json 11b10beba7a6842ce3d01ea4210bff7d3aa6ab94 data/create/loot_tables/blocks/yellow_toolbox.json b9648ec56e55fe2b9d54adf172405519a46bfa66 data/create/loot_tables/blocks/yellow_valve_handle.json 8be474a69469561dfe759159a40fb135a6ad5de6 data/create/loot_tables/blocks/zinc_block.json @@ -3534,54 +3940,61 @@ b9648ec56e55fe2b9d54adf172405519a46bfa66 data/create/loot_tables/blocks/yellow_v 20bd65d72f1762edf473b2fafc71fcf7d55c01f9 data/create/recipes/andesite_ladder_from_andesite_alloy_stonecutting.json 0b3896151533d220c2d1f3768c6f8e428516ff5b data/create/recipes/andesite_pillar_from_stone_types_andesite_stonecutting.json 367e57a760156a19fc6805a0f23c3f8194cd4255 data/create/recipes/andesite_scaffolding_from_andesite_alloy_stonecutting.json +24e5ad71ab310105a5cb3cf3d0a1fe46b162bd41 data/create/recipes/andesite_table_cloth_from_andesite_alloy_stonecutting.json 5272c61c8c17eb7a528cade93bbc80fd9ef51521 data/create/recipes/asurine_from_stone_types_asurine_stonecutting.json 5bf4b9baf782a461efc36d463b99b9acb0ab4607 data/create/recipes/asurine_pillar_from_stone_types_asurine_stonecutting.json +6e54f07090c60a8163038672bcbf47464219bb9b data/create/recipes/bamboo_window.json +9a243cb03b882d90760ffba791ab78ffe9daade3 data/create/recipes/bamboo_window_pane.json 41f53dd9817c3cc9613c8e97ff8f9ffb895e2b0e data/create/recipes/birch_window.json 998dbc2cc27888a28f009b8e408b7091baac9255 data/create/recipes/birch_window_pane.json 5965f3abe435ac0b3a39d8ec31af71808592642b data/create/recipes/brass_bars_from_ingots_brass_stonecutting.json 4b29884cd866dcda1b93899d81fcd3a2ae4c541b data/create/recipes/brass_ladder_from_ingots_brass_stonecutting.json 9c685014019a7a4f1ef47f235cd1e9b3f9093295 data/create/recipes/brass_scaffolding_from_ingots_brass_stonecutting.json +6f6c35d06c926e7d11e4b3d4e63d867c5546da46 data/create/recipes/brass_table_cloth_from_ingots_brass_stonecutting.json 8f21b67e168a14d354b6c00b5ec795355fdd4209 data/create/recipes/calcite_from_stone_types_calcite_stonecutting.json da3692808565988e21ec5b1d5e976338ccc4a037 data/create/recipes/calcite_pillar_from_stone_types_calcite_stonecutting.json +79bd6c532172149ede8e161f2809362d90f87e7d data/create/recipes/cherry_window.json +22557ebdbe69634968c97e7f348307fdea34d97f data/create/recipes/cherry_window_pane.json 1157b2eab2ada187ea80feae298b77ed7ece4bfd data/create/recipes/copper_bars_from_ingots_copper_stonecutting.json b9d4f55128aa03ee6f6ab1831e709629a42c147e data/create/recipes/copper_ladder_from_ingots_copper_stonecutting.json 922c5ac48c8eb8b3a39f5626a381c2252fbac107 data/create/recipes/copper_scaffolding_from_ingots_copper_stonecutting.json +bab9fa969ba95850dc6e3bd0723387a61cbb05cd data/create/recipes/copper_shingles_from_ingots_copper_stonecutting.json bb083ae1d057dc0106946e4c68f9469b81724396 data/create/recipes/copper_shingle_slab.json 3689feaca2bd5355fa2d4226cd2cc519fa9b97c1 data/create/recipes/copper_shingle_slab_from_copper_shingles_stonecutting.json bd4cd7119f8371164b278afc679795a3c2a53406 data/create/recipes/copper_shingle_stairs.json 59f672e8e88d5f4655467e2696616b552debaf46 data/create/recipes/copper_shingle_stairs_from_copper_shingles_stonecutting.json -bab9fa969ba95850dc6e3bd0723387a61cbb05cd data/create/recipes/copper_shingles_from_ingots_copper_stonecutting.json +0225fc8d7b7a5027b8a61e6a043c3a8e505d876a data/create/recipes/copper_table_cloth_from_ingots_copper_stonecutting.json +d463aa891c7ae1b2eb1a758e4100c5a1c16cfffd data/create/recipes/copper_tiles_from_ingots_copper_stonecutting.json f64ba3f3c607b43ea77e5bccb7ec2048e5c6e424 data/create/recipes/copper_tile_slab.json 91b0390e0c772d43eb46b94a0113323f0f6a4387 data/create/recipes/copper_tile_slab_from_copper_tiles_stonecutting.json d31a41f6f7ef0bd20abab06cc31a9d2c56187117 data/create/recipes/copper_tile_stairs.json bf1b0a447169029161fb07feacd22d5aa806b2bf data/create/recipes/copper_tile_stairs_from_copper_tiles_stonecutting.json -d463aa891c7ae1b2eb1a758e4100c5a1c16cfffd data/create/recipes/copper_tiles_from_ingots_copper_stonecutting.json daa54c9ff3612521f06cc1979116beafcda852dd data/create/recipes/copycat_panel_from_ingots_zinc_stonecutting.json 745816d2c3fa29ede2510e39edc76f6fecee963f data/create/recipes/copycat_step_from_ingots_zinc_stonecutting.json +255c32272a704109fccdbb071d4dbf602cb8c1d8 data/create/recipes/crafting/copper/waxed_copper_shingles_from_honeycomb.json 57ae13042e0f96676fa322bf24db4976d75ca6bc data/create/recipes/crafting/copper/waxed_copper_shingle_slab_from_honeycomb.json 790565897535ea2e741d0a0ed7c0b561d594b69a data/create/recipes/crafting/copper/waxed_copper_shingle_stairs_from_honeycomb.json -255c32272a704109fccdbb071d4dbf602cb8c1d8 data/create/recipes/crafting/copper/waxed_copper_shingles_from_honeycomb.json +0c6e14c5884257850c7360cba66bc8cca91c84e7 data/create/recipes/crafting/copper/waxed_copper_tiles_from_honeycomb.json 4693ee65a4a5e1c93fc2acce7bfbc438e573ad9a data/create/recipes/crafting/copper/waxed_copper_tile_slab_from_honeycomb.json f8772b915663e3f70b3a2405a23c5ce87e8b8e49 data/create/recipes/crafting/copper/waxed_copper_tile_stairs_from_honeycomb.json -0c6e14c5884257850c7360cba66bc8cca91c84e7 data/create/recipes/crafting/copper/waxed_copper_tiles_from_honeycomb.json +6d0dacc4db8966d38156fe17645732084379a887 data/create/recipes/crafting/copper/waxed_exposed_copper_shingles_from_honeycomb.json 3bc0b81ea61229e24570e083caa4e5870d517e75 data/create/recipes/crafting/copper/waxed_exposed_copper_shingle_slab_from_honeycomb.json 191f34b27bc8966c2b6ba41403cc0933718748d3 data/create/recipes/crafting/copper/waxed_exposed_copper_shingle_stairs_from_honeycomb.json -6d0dacc4db8966d38156fe17645732084379a887 data/create/recipes/crafting/copper/waxed_exposed_copper_shingles_from_honeycomb.json +cdd66bdfddbcdfacb27c030872d10b6e7f1356fd data/create/recipes/crafting/copper/waxed_exposed_copper_tiles_from_honeycomb.json 2f6d2f8da4d4da2ed48e33d8f6e0b32d37a3ce6d data/create/recipes/crafting/copper/waxed_exposed_copper_tile_slab_from_honeycomb.json 4ed8482ed29fe7c3273db733fa141743c181d460 data/create/recipes/crafting/copper/waxed_exposed_copper_tile_stairs_from_honeycomb.json -cdd66bdfddbcdfacb27c030872d10b6e7f1356fd data/create/recipes/crafting/copper/waxed_exposed_copper_tiles_from_honeycomb.json +0ca4e58d715d5ed4b051a94f2dff42d4d413ef07 data/create/recipes/crafting/copper/waxed_oxidized_copper_shingles_from_honeycomb.json b421f16aea7c47fa8a62e69973f30e4e382f8a2c data/create/recipes/crafting/copper/waxed_oxidized_copper_shingle_slab_from_honeycomb.json 7ab7f673f57e219d3e486d0add1d7e2a8820cc6b data/create/recipes/crafting/copper/waxed_oxidized_copper_shingle_stairs_from_honeycomb.json -0ca4e58d715d5ed4b051a94f2dff42d4d413ef07 data/create/recipes/crafting/copper/waxed_oxidized_copper_shingles_from_honeycomb.json +b7edffb9b1a936fd34fe23defefc8cb9ea4f6977 data/create/recipes/crafting/copper/waxed_oxidized_copper_tiles_from_honeycomb.json 24582e83e8d36a6267df5c028addfb44c1a637e6 data/create/recipes/crafting/copper/waxed_oxidized_copper_tile_slab_from_honeycomb.json 9185ea241bcb5f2fe09d0d5c65832ef379e06c58 data/create/recipes/crafting/copper/waxed_oxidized_copper_tile_stairs_from_honeycomb.json -b7edffb9b1a936fd34fe23defefc8cb9ea4f6977 data/create/recipes/crafting/copper/waxed_oxidized_copper_tiles_from_honeycomb.json +90bce9f262b87fb821210aceb88d09d815d15e5a data/create/recipes/crafting/copper/waxed_weathered_copper_shingles_from_honeycomb.json a2cc99ad9b1234f5327971ee535af9bc25d0154c data/create/recipes/crafting/copper/waxed_weathered_copper_shingle_slab_from_honeycomb.json 0952753a079593d748b38ca84b666f2f886f5c1e data/create/recipes/crafting/copper/waxed_weathered_copper_shingle_stairs_from_honeycomb.json -90bce9f262b87fb821210aceb88d09d815d15e5a data/create/recipes/crafting/copper/waxed_weathered_copper_shingles_from_honeycomb.json +724802d206db185ebf20bafbcfc35fe0f982f58a data/create/recipes/crafting/copper/waxed_weathered_copper_tiles_from_honeycomb.json 98d0b72eb20e1d80cc590800ae2d642a47c3ae5f data/create/recipes/crafting/copper/waxed_weathered_copper_tile_slab_from_honeycomb.json 594b8fd5c30a84df97667b2c6dccc5dedd039d26 data/create/recipes/crafting/copper/waxed_weathered_copper_tile_stairs_from_honeycomb.json -724802d206db185ebf20bafbcfc35fe0f982f58a data/create/recipes/crafting/copper/waxed_weathered_copper_tiles_from_honeycomb.json 97c3e430ef2aecf61c457d0b8c4bbd23e1b01cc3 data/create/recipes/crafting/kinetics/black_seat.json 1129d02609125b48af2efa48f84dd3f90d51a341 data/create/recipes/crafting/kinetics/black_seat_from_other_seat.json 9e5a73e2343054d35e2fbfd20f0c49834d1a87a6 data/create/recipes/crafting/kinetics/black_valve_handle_from_other_valve_handle.json @@ -3630,10 +4043,94 @@ b04c1cebcfbcf44c4ced04252f54dbfeb8f9ff12 data/create/recipes/crafting/kinetics/w 48c9e3b9f5a8a0f598ab0f57cd8936724337bf1f data/create/recipes/crafting/kinetics/yellow_seat.json 75633a46c374230fab4096a45628b42d6012627d data/create/recipes/crafting/kinetics/yellow_seat_from_other_seat.json 2be097bb4f1e47a6b3a4a6f0ef222dffe31a1e22 data/create/recipes/crafting/kinetics/yellow_valve_handle_from_other_valve_handle.json +113186f64e29efebd628fe3d88ae69f1ef0537f0 data/create/recipes/crafting/logistics/andesite_table_cloth_clear.json +f4eec2dbb24d5fdd6971f8be965d4c908d8d39ea data/create/recipes/crafting/logistics/black_postbox.json +bf48cc90d8269c3c443007ce224c13fa5a2e741b data/create/recipes/crafting/logistics/black_postbox_from_other_postbox.json +a5dd78419a491f70c12e036769ec8244b561806e data/create/recipes/crafting/logistics/black_table_cloth.json +ab88f259eb1ea6767c97969e205241e91c0fe048 data/create/recipes/crafting/logistics/black_table_cloth_clear.json +b1a32a62d0e90fe01fdad31151dc269a2ed38e3f data/create/recipes/crafting/logistics/black_table_cloth_from_other_table_cloth.json +7e010aa7f5d22ac505bf04ad00ab3c56e0a78f3b data/create/recipes/crafting/logistics/blue_postbox.json +888a8202521f186fb7af27770e708f0fd4bb9659 data/create/recipes/crafting/logistics/blue_postbox_from_other_postbox.json +e48d20a774d0004eda8fc94b4589df42dfbb90ef data/create/recipes/crafting/logistics/blue_table_cloth.json +4002ef4244d7556fc132075d38ceb36e50cf1ed1 data/create/recipes/crafting/logistics/blue_table_cloth_clear.json +f34c1edaf347bb7dc863a00cf18650c0b0ee8dc5 data/create/recipes/crafting/logistics/blue_table_cloth_from_other_table_cloth.json +45a400f1b48d12af82615eba8bec4cdefb738333 data/create/recipes/crafting/logistics/brass_table_cloth_clear.json +c12ad278627aeba957aae502bb1762335918aa20 data/create/recipes/crafting/logistics/brown_postbox.json +9b481ac9d99aeb7d8bf334803628f0f200ca0ade data/create/recipes/crafting/logistics/brown_postbox_from_other_postbox.json +ce3245d64c34c3ca8374275a945004228b8cdaaf data/create/recipes/crafting/logistics/brown_table_cloth.json +850593663b67399a027d5126593e98109e626fea data/create/recipes/crafting/logistics/brown_table_cloth_clear.json +faf9a84bb5227353006f2406461a5a04e15e4111 data/create/recipes/crafting/logistics/brown_table_cloth_from_other_table_cloth.json +7c1fa243e64073d435ff2c4117dc04e002abc465 data/create/recipes/crafting/logistics/copper_table_cloth_clear.json +e899b7e0fd04525a362b62e4ee76aaaa43a33c2e data/create/recipes/crafting/logistics/cyan_postbox.json +062ea448224fea069f6455f430e01198a73aa386 data/create/recipes/crafting/logistics/cyan_postbox_from_other_postbox.json +65a946a8eecf693c8ec701d5ddbf1900c60e0744 data/create/recipes/crafting/logistics/cyan_table_cloth.json +5486c2bc2f263dd901e201bc3bad7015cf9e8d49 data/create/recipes/crafting/logistics/cyan_table_cloth_clear.json +4847ea28034779bcd922b1346afbe083ab06031f data/create/recipes/crafting/logistics/cyan_table_cloth_from_other_table_cloth.json +1bb34be88d5d690ed00e708fbe85d119f97f7abe data/create/recipes/crafting/logistics/gray_postbox.json +19cd2ea89699860c7870f1f38ac4fad3a5efd274 data/create/recipes/crafting/logistics/gray_postbox_from_other_postbox.json +e11f331c5bf91a1865efb5486c0314b0b5812be6 data/create/recipes/crafting/logistics/gray_table_cloth.json +8e04ba7eed8faff3c16e1a841c72d3a778c970f3 data/create/recipes/crafting/logistics/gray_table_cloth_clear.json +d21603c4548c977d043a2ff5a2fa4099343424d4 data/create/recipes/crafting/logistics/gray_table_cloth_from_other_table_cloth.json +25842442f3123e92702e502757de6558c710741a data/create/recipes/crafting/logistics/green_postbox.json +98f88f8462004a734db6928b20b1cb11b8efe03c data/create/recipes/crafting/logistics/green_postbox_from_other_postbox.json +85867127ec54aeca64b316b969d0f6b3cab559e5 data/create/recipes/crafting/logistics/green_table_cloth.json +2c630a129fe21227412803d42dc3211ec95b1a38 data/create/recipes/crafting/logistics/green_table_cloth_clear.json +e3056c024840fe30dd5fec142334cf8fbae4306e data/create/recipes/crafting/logistics/green_table_cloth_from_other_table_cloth.json +d84a6c6a145dc74fbbda8b4762c207c4f28674bd data/create/recipes/crafting/logistics/light_blue_postbox.json +1d5e8eb1be029acdb79a02224530d97e52aa791e data/create/recipes/crafting/logistics/light_blue_postbox_from_other_postbox.json +1cfb864aed59cd9b9f6512aff13eda74995f6f4b data/create/recipes/crafting/logistics/light_blue_table_cloth.json +1763f06ba76551bf5c4950d50561dd491a3fb86f data/create/recipes/crafting/logistics/light_blue_table_cloth_clear.json +ed9bffdeb2e60e9a5f219c5a7d3e999db7f3651f data/create/recipes/crafting/logistics/light_blue_table_cloth_from_other_table_cloth.json +49f73e661cdf8974be04cfe46d8aba6de63ed14a data/create/recipes/crafting/logistics/light_gray_postbox.json +b8b16c25f0336449e9a2d165bf40474fed381353 data/create/recipes/crafting/logistics/light_gray_postbox_from_other_postbox.json +976da2180c5da522d07e98284439e9ec89ec21af data/create/recipes/crafting/logistics/light_gray_table_cloth.json +ea87dec016be2987fdc77c82c8ea792f93af3a7b data/create/recipes/crafting/logistics/light_gray_table_cloth_clear.json +7c1e33c5354150e028924a854e8f4dea1232e967 data/create/recipes/crafting/logistics/light_gray_table_cloth_from_other_table_cloth.json +e72d0c641ad9a12c3c388601948cf274c9a8c62a data/create/recipes/crafting/logistics/lime_postbox.json +8f6f03db69e3f96d9dc178236a205971ca920b15 data/create/recipes/crafting/logistics/lime_postbox_from_other_postbox.json +1057fe838babd5a390df5445d5266a87326c0bb6 data/create/recipes/crafting/logistics/lime_table_cloth.json +468f4c27ac1134484ea81bafbc81055aab86ed21 data/create/recipes/crafting/logistics/lime_table_cloth_clear.json +13377a12a40705c8ab25137db21f184e4612600a data/create/recipes/crafting/logistics/lime_table_cloth_from_other_table_cloth.json +b46d3a58d318c38df93327789712c1b41681ea7d data/create/recipes/crafting/logistics/magenta_postbox.json +05886ad239c84fd019e1d378450da89137631317 data/create/recipes/crafting/logistics/magenta_postbox_from_other_postbox.json +49be11385f2164fb55bc49445297a41bf8682d0b data/create/recipes/crafting/logistics/magenta_table_cloth.json +9dd457949a6f5ff746c974f8fbf5ebbfa151e31e data/create/recipes/crafting/logistics/magenta_table_cloth_clear.json +a2e1b7080484cc5114196d01d8472aeebaa0df40 data/create/recipes/crafting/logistics/magenta_table_cloth_from_other_table_cloth.json +5dd83b47f9b5406534060662ed37fcea308f3b5b data/create/recipes/crafting/logistics/orange_postbox.json +72596b49737bf7a5fbbf01b2aec20565d2e1a01b data/create/recipes/crafting/logistics/orange_postbox_from_other_postbox.json +2f61600a28d6aaa3d7b0e7a54ed38ad9650b161e data/create/recipes/crafting/logistics/orange_table_cloth.json +ed88c2ba5ea1a41e97e80aa97979587945919233 data/create/recipes/crafting/logistics/orange_table_cloth_clear.json +6c488a8c66ff3aab59b08ef1d1cb98fce5b2976e data/create/recipes/crafting/logistics/orange_table_cloth_from_other_table_cloth.json +9c53c8e6d8e7bcac36f611995c320ebee4a0778a data/create/recipes/crafting/logistics/pink_postbox.json +75622ad3e1fe195399404ae26efeeb6be310fd92 data/create/recipes/crafting/logistics/pink_postbox_from_other_postbox.json +2ef97ee1ade0ea40e275939870dc34ca941e443c data/create/recipes/crafting/logistics/pink_table_cloth.json +b19c6ae1d968c0966815a78f2c112ea872dc1550 data/create/recipes/crafting/logistics/pink_table_cloth_clear.json +ff9044505caf27fb51922a26aa45edca75c8335c data/create/recipes/crafting/logistics/pink_table_cloth_from_other_table_cloth.json +c75f7138e92a54b6841950c5108ee03ede6af4f2 data/create/recipes/crafting/logistics/purple_postbox.json +b4f58bfe14f0b8b0070b71832150b983192ac52f data/create/recipes/crafting/logistics/purple_postbox_from_other_postbox.json +2fe939437431b6a26e0d9d6ce9453fb66fe45d9a data/create/recipes/crafting/logistics/purple_table_cloth.json +36cefcb804b1806428a6ff33bf4e5408d8f7a07f data/create/recipes/crafting/logistics/purple_table_cloth_clear.json +cb44dfbbcccd626f698d3aae8ff65ce3c9620dd2 data/create/recipes/crafting/logistics/purple_table_cloth_from_other_table_cloth.json +6deeeb05693bc98ecfd33cc11e4c098ecd76563b data/create/recipes/crafting/logistics/red_postbox.json +15310750906f41364522e0a27e8f5c2e5fd6c225 data/create/recipes/crafting/logistics/red_postbox_from_other_postbox.json +50876ccdd85879a29ae6181f2c330799a28f1365 data/create/recipes/crafting/logistics/red_table_cloth.json +bddd8bfab2124ea63df317f74d37a6e4b65a583c data/create/recipes/crafting/logistics/red_table_cloth_clear.json +7c6e582effa01018b6f4048378079150c8cb5e8b data/create/recipes/crafting/logistics/red_table_cloth_from_other_table_cloth.json +3b062eeac9c5b9917f3eed67e7525912fb32dfca data/create/recipes/crafting/logistics/white_postbox.json +ace9f83cc4cba51a8564526044ccf6e51abbdf3e data/create/recipes/crafting/logistics/white_postbox_from_other_postbox.json +fc356d74038607c44c6f7d6e7ec56b84a557ebf1 data/create/recipes/crafting/logistics/white_table_cloth.json +8d292e87ac51ea1f1683d67c53a26601d8b89495 data/create/recipes/crafting/logistics/white_table_cloth_clear.json +a9f10b38ae6a44afee64e4ed590a7fd5bb505420 data/create/recipes/crafting/logistics/white_table_cloth_from_other_table_cloth.json +a005bbb2217a7e2c985d88a1255c4285c11dbe0b data/create/recipes/crafting/logistics/yellow_postbox.json +2e387f66250e68d0dadced19d8a93197ff2481f3 data/create/recipes/crafting/logistics/yellow_postbox_from_other_postbox.json +0b2aa56bbbae1189424207afb312fc2bb69b43a1 data/create/recipes/crafting/logistics/yellow_table_cloth.json +655446f2504c7d57d11a893b0c5b1177e4217e58 data/create/recipes/crafting/logistics/yellow_table_cloth_clear.json +db333d47f9e1d6b02aa670ea0aa10dabbcb0e319 data/create/recipes/crafting/logistics/yellow_table_cloth_from_other_table_cloth.json 44a59669177a5a1b0b0eb7cb3dd46826311f4dfe data/create/recipes/crimsite_from_stone_types_crimsite_stonecutting.json c3f4fd2206f3885904913289761f2b8b758e4c95 data/create/recipes/crimsite_pillar_from_stone_types_crimsite_stonecutting.json e1815f97fbc2786d77f5378a2696e36050d8a1fd data/create/recipes/crimson_window.json 96009a12fe3f5ebf677ac069999e2ea2adbc9b7c data/create/recipes/crimson_window_pane.json +82cb9be82ce5109781169bdb47bbd49238b9824b data/create/recipes/cut_andesite_bricks_from_stone_types_andesite_stonecutting.json d6a41fc914a4a41478f115d9503658dba04a4d02 data/create/recipes/cut_andesite_brick_slab.json edf981198463ac58524606f86dc15d2265e8b993 data/create/recipes/cut_andesite_brick_slab_from_stone_types_andesite_stonecutting.json 72486864f3a0d31a92212552441eb659f2541b60 data/create/recipes/cut_andesite_brick_slab_recycling.json @@ -3641,7 +4138,6 @@ edf981198463ac58524606f86dc15d2265e8b993 data/create/recipes/cut_andesite_brick_ 22f463c679249738bf1a340a3b8ff14806303a70 data/create/recipes/cut_andesite_brick_stairs_from_stone_types_andesite_stonecutting.json 42b7105c1d776aed25c1c6bbd9254375079d7438 data/create/recipes/cut_andesite_brick_wall.json 7d25517650c9f66b65f0f8841cf9bcda7ea401ec data/create/recipes/cut_andesite_brick_wall_from_stone_types_andesite_stonecutting.json -82cb9be82ce5109781169bdb47bbd49238b9824b data/create/recipes/cut_andesite_bricks_from_stone_types_andesite_stonecutting.json c3ab483224c3adbd467a4ec0b26a1f6a53fe81c4 data/create/recipes/cut_andesite_from_stone_types_andesite_stonecutting.json 9f316131bb538da9f6b1bde9eaaa0a5bd5972a66 data/create/recipes/cut_andesite_slab.json 50dcff201da369bdc591fdc320aae3547f114284 data/create/recipes/cut_andesite_slab_from_stone_types_andesite_stonecutting.json @@ -3650,6 +4146,7 @@ c3ab483224c3adbd467a4ec0b26a1f6a53fe81c4 data/create/recipes/cut_andesite_from_s c284fc46aabae9c5ab79071eb63ec9b07a9d1002 data/create/recipes/cut_andesite_stairs_from_stone_types_andesite_stonecutting.json 3b6e66e92656ab5b0d1e15444db62ccb1cc01866 data/create/recipes/cut_andesite_wall.json 5df6e8d558f656533aff514aee8cdec7cf8d6fdf data/create/recipes/cut_andesite_wall_from_stone_types_andesite_stonecutting.json +e335b15907be053ab0f2649338b12a86371b78f7 data/create/recipes/cut_asurine_bricks_from_stone_types_asurine_stonecutting.json 41d085d3b8fce5b12d601d86fd0e88df9b482aec data/create/recipes/cut_asurine_brick_slab.json cf61e0806a3988a771675a261a540cbb62352d80 data/create/recipes/cut_asurine_brick_slab_from_stone_types_asurine_stonecutting.json 86606a0717bba33f457707d96461fec6a22d23de data/create/recipes/cut_asurine_brick_slab_recycling.json @@ -3657,7 +4154,6 @@ cf61e0806a3988a771675a261a540cbb62352d80 data/create/recipes/cut_asurine_brick_s 382a7faa460ac286631fe063280541f2f499d895 data/create/recipes/cut_asurine_brick_stairs_from_stone_types_asurine_stonecutting.json 09699c116bb201e742fef1fd3c987e9de4606e6a data/create/recipes/cut_asurine_brick_wall.json 8bb8a9f8e8dd0d6585311c326dcf3f40227149a9 data/create/recipes/cut_asurine_brick_wall_from_stone_types_asurine_stonecutting.json -e335b15907be053ab0f2649338b12a86371b78f7 data/create/recipes/cut_asurine_bricks_from_stone_types_asurine_stonecutting.json 0188d62fbeede94f8596dd5cc73d361a160e8c95 data/create/recipes/cut_asurine_from_stone_types_asurine_stonecutting.json 118e87a2a344238009b1bbbe70e6f314e27842d9 data/create/recipes/cut_asurine_slab.json 37c502094ee96da9e4983142dae5e023c6bcfe14 data/create/recipes/cut_asurine_slab_from_stone_types_asurine_stonecutting.json @@ -3666,6 +4162,7 @@ fe3dd5c7d5bdea71a75003cf3d50439d9d21458d data/create/recipes/cut_asurine_slab_re cade93c9328afcacf4507aa7699c4b09fb4592d4 data/create/recipes/cut_asurine_stairs_from_stone_types_asurine_stonecutting.json 80bec79b5daea4b2b72c0f5e9f189c1044583465 data/create/recipes/cut_asurine_wall.json 45a712e41a74982cfb94a39da199ec6c95eef798 data/create/recipes/cut_asurine_wall_from_stone_types_asurine_stonecutting.json +da11f21280ba1ed06ffe8afe77db3e9e1bbcb1a3 data/create/recipes/cut_calcite_bricks_from_stone_types_calcite_stonecutting.json 98e849c743ed1e4397bf6168215dfa7006a804c4 data/create/recipes/cut_calcite_brick_slab.json 1c21eb6c785729a8ea274513e1313aed952e105e data/create/recipes/cut_calcite_brick_slab_from_stone_types_calcite_stonecutting.json 2a3f078f7f40ba3bc5c17a037db1f8ee415e4e3f data/create/recipes/cut_calcite_brick_slab_recycling.json @@ -3673,7 +4170,6 @@ e4267c62bc6cfc8373df29ee2685f1e1b286b638 data/create/recipes/cut_calcite_brick_s 10fe509e01e3ed1b04bd2f384c0aa3db96b117f1 data/create/recipes/cut_calcite_brick_stairs_from_stone_types_calcite_stonecutting.json 9b55a6c9cf0ce697a242684953daf9aa94d024dc data/create/recipes/cut_calcite_brick_wall.json 1e67376e484923b84bd64b0b22b4e55b581ac419 data/create/recipes/cut_calcite_brick_wall_from_stone_types_calcite_stonecutting.json -da11f21280ba1ed06ffe8afe77db3e9e1bbcb1a3 data/create/recipes/cut_calcite_bricks_from_stone_types_calcite_stonecutting.json 98b014b64c97371f04aaacbdd23e13e274e36e3b data/create/recipes/cut_calcite_from_stone_types_calcite_stonecutting.json fcab91f11fe97a194b2c1b16115206166d3cd634 data/create/recipes/cut_calcite_slab.json 8426a494b776148056cb4525e62744d0be8b28cd data/create/recipes/cut_calcite_slab_from_stone_types_calcite_stonecutting.json @@ -3682,6 +4178,7 @@ fcab91f11fe97a194b2c1b16115206166d3cd634 data/create/recipes/cut_calcite_slab.js a7e7fb425d3c1f21f5ed53da79957363fed824df data/create/recipes/cut_calcite_stairs_from_stone_types_calcite_stonecutting.json 73eaf7bffa38bc874974871f3002cd3ee7f0c36e data/create/recipes/cut_calcite_wall.json 01b4c23362f15ee0e5c207c46383f96032c89d98 data/create/recipes/cut_calcite_wall_from_stone_types_calcite_stonecutting.json +07aff2bb6424de46463b2c965418ed52efd0a790 data/create/recipes/cut_crimsite_bricks_from_stone_types_crimsite_stonecutting.json 8ffb2c1c747f19ea37c0da3fe248b6c58981c9f6 data/create/recipes/cut_crimsite_brick_slab.json 86c3a5c64561052489b3ceb9e08be5a8729198a9 data/create/recipes/cut_crimsite_brick_slab_from_stone_types_crimsite_stonecutting.json e3215d4e651e70402b896ba50975cb2f23d16278 data/create/recipes/cut_crimsite_brick_slab_recycling.json @@ -3689,7 +4186,6 @@ e49f6e319fae9058cbece0e332a11e108234e608 data/create/recipes/cut_crimsite_brick_ c7186fb1a75f59aff929e843f50a162a090b7bb3 data/create/recipes/cut_crimsite_brick_stairs_from_stone_types_crimsite_stonecutting.json 272d8d01730a88eff4fc6923e93962650b992c46 data/create/recipes/cut_crimsite_brick_wall.json 13ac9464098e8c67e820dc898c025ab0382d852a data/create/recipes/cut_crimsite_brick_wall_from_stone_types_crimsite_stonecutting.json -07aff2bb6424de46463b2c965418ed52efd0a790 data/create/recipes/cut_crimsite_bricks_from_stone_types_crimsite_stonecutting.json 18ce9ff32eda2d869bd11f398a86e78b71f6d0fe data/create/recipes/cut_crimsite_from_stone_types_crimsite_stonecutting.json c39166aa6267ec5bc71893d5756955abfb644217 data/create/recipes/cut_crimsite_slab.json 6271d5bc0377814ba06061bfffcb812ca2ef8f03 data/create/recipes/cut_crimsite_slab_from_stone_types_crimsite_stonecutting.json @@ -3698,6 +4194,7 @@ acfe33dbb889c820c213bcbc8593766703bf3a25 data/create/recipes/cut_crimsite_slab_r 90b03cf1e72d3b803e33755832e0722ff264681b data/create/recipes/cut_crimsite_stairs_from_stone_types_crimsite_stonecutting.json 8dfe19522878af232deaa1fc13d83cf785684cba data/create/recipes/cut_crimsite_wall.json 18f9548175baab0173785d7ef308096067712dd2 data/create/recipes/cut_crimsite_wall_from_stone_types_crimsite_stonecutting.json +de1a11b7ed71f1f7aeea2791fe922feef689fd35 data/create/recipes/cut_deepslate_bricks_from_stone_types_deepslate_stonecutting.json 5e5c0e6b1b3e204de3c48fb6a4cd473a150979c2 data/create/recipes/cut_deepslate_brick_slab.json 2c0795b92759dab751f86f50aa80440df2245526 data/create/recipes/cut_deepslate_brick_slab_from_stone_types_deepslate_stonecutting.json dbcc41c48cf28b71dcd9f3b6ecae43c8de681532 data/create/recipes/cut_deepslate_brick_slab_recycling.json @@ -3705,7 +4202,6 @@ e21f8dc33e70ebd43ea79a4afaf3b4e8a449f4bd data/create/recipes/cut_deepslate_brick 7b3489e5b629a995691be117c5a378769c743449 data/create/recipes/cut_deepslate_brick_stairs_from_stone_types_deepslate_stonecutting.json 158bb41bffebb2543e4aa2d5f14cc8af1cdd8671 data/create/recipes/cut_deepslate_brick_wall.json 73a07a5fa665bb20d131f0a0e40806116316928a data/create/recipes/cut_deepslate_brick_wall_from_stone_types_deepslate_stonecutting.json -de1a11b7ed71f1f7aeea2791fe922feef689fd35 data/create/recipes/cut_deepslate_bricks_from_stone_types_deepslate_stonecutting.json 992fdc2eba2afe3ff8aad0ceee5424ecd3f3026d data/create/recipes/cut_deepslate_from_stone_types_deepslate_stonecutting.json 064e2f5edd9209af7742b0f0eb45204453bed46f data/create/recipes/cut_deepslate_slab.json f341d30b7fd427dea09a51d67e1e9532e5184be8 data/create/recipes/cut_deepslate_slab_from_stone_types_deepslate_stonecutting.json @@ -3714,6 +4210,7 @@ c08e12e44344efca550efa8ba14d0cb2f9f6c2c6 data/create/recipes/cut_deepslate_stair e6deec1352fb5c74c470dc488b71e5f8f55bdfbf data/create/recipes/cut_deepslate_stairs_from_stone_types_deepslate_stonecutting.json 2ad7fb3f3a143e58bea8eefe4cd9db3d1c37a3e6 data/create/recipes/cut_deepslate_wall.json e752527479f71f96bb34878008bf8cfb23fd3045 data/create/recipes/cut_deepslate_wall_from_stone_types_deepslate_stonecutting.json +2c23d13f48f3685bda6c564e080053fbfa71ab99 data/create/recipes/cut_diorite_bricks_from_stone_types_diorite_stonecutting.json 90b83c2a2026d70f49c91813305fdee721926db9 data/create/recipes/cut_diorite_brick_slab.json 9d51c690c77321437561a006dc2f9bba975875e6 data/create/recipes/cut_diorite_brick_slab_from_stone_types_diorite_stonecutting.json fa76e64ac9b569f5d5f2f1ecc54e51f9be15aacf data/create/recipes/cut_diorite_brick_slab_recycling.json @@ -3721,7 +4218,6 @@ aa6aea99e9ce2d5dc3d6555ab3d17928bca6195e data/create/recipes/cut_diorite_brick_s 9a26c4097519a9300e591b6578bbaf6c11f909e1 data/create/recipes/cut_diorite_brick_stairs_from_stone_types_diorite_stonecutting.json 78d37df17c7e2be73ce1d226ee552ff3f49b9e4f data/create/recipes/cut_diorite_brick_wall.json f668f2c78a779bc3d0546a82dea02b9f4688e05c data/create/recipes/cut_diorite_brick_wall_from_stone_types_diorite_stonecutting.json -2c23d13f48f3685bda6c564e080053fbfa71ab99 data/create/recipes/cut_diorite_bricks_from_stone_types_diorite_stonecutting.json 1918ecb2ab16ca7dbb30eee4852b67dd963d872e data/create/recipes/cut_diorite_from_stone_types_diorite_stonecutting.json 07fda5c89128648856f948a03ac56a2a2693cf1b data/create/recipes/cut_diorite_slab.json 28765ac7f8b62373b32f014d1dd7f4afb50e1906 data/create/recipes/cut_diorite_slab_from_stone_types_diorite_stonecutting.json @@ -3730,6 +4226,7 @@ dd5f3c59a5d292f7b5c046be35da7f67e8383aa1 data/create/recipes/cut_diorite_slab_re be2c6c01630b90895e7215edce3d02352793dbc4 data/create/recipes/cut_diorite_stairs_from_stone_types_diorite_stonecutting.json 8984b7b7dbc7e65ee04886516501a13278e889e9 data/create/recipes/cut_diorite_wall.json 8ff5d1ecff2202595f7cba5bd65c466c53ac2cc5 data/create/recipes/cut_diorite_wall_from_stone_types_diorite_stonecutting.json +10550b023989113c26d430136daf1dc49f10ce63 data/create/recipes/cut_dripstone_bricks_from_stone_types_dripstone_stonecutting.json 95717a80bb8ae296c2f77478a8f42b88cea88996 data/create/recipes/cut_dripstone_brick_slab.json f04bf1189b53e24974779d9e959e8973d9677162 data/create/recipes/cut_dripstone_brick_slab_from_stone_types_dripstone_stonecutting.json 332534fc2909ca83f5f7f4ab3adf92680bb17f79 data/create/recipes/cut_dripstone_brick_slab_recycling.json @@ -3737,7 +4234,6 @@ f04bf1189b53e24974779d9e959e8973d9677162 data/create/recipes/cut_dripstone_brick 17bf8160eaf16655d454ddfe22b82c9a86462146 data/create/recipes/cut_dripstone_brick_stairs_from_stone_types_dripstone_stonecutting.json 7d638d156326a2e542ed94837273d9cca5cf4fce data/create/recipes/cut_dripstone_brick_wall.json 154931db54115cf4a64147cdd6d1eb7efff48737 data/create/recipes/cut_dripstone_brick_wall_from_stone_types_dripstone_stonecutting.json -10550b023989113c26d430136daf1dc49f10ce63 data/create/recipes/cut_dripstone_bricks_from_stone_types_dripstone_stonecutting.json 7147f9199f174c9864109fe5723528921aaa0c46 data/create/recipes/cut_dripstone_from_stone_types_dripstone_stonecutting.json f2800b467eac75d0099f2f07e09b47115df4e09f data/create/recipes/cut_dripstone_slab.json a4f62a1a30592f82789988f93d8ae35d176eca59 data/create/recipes/cut_dripstone_slab_from_stone_types_dripstone_stonecutting.json @@ -3746,6 +4242,7 @@ a4f62a1a30592f82789988f93d8ae35d176eca59 data/create/recipes/cut_dripstone_slab_ f2df5efedb6fb25ecb877b888007990082d9aca4 data/create/recipes/cut_dripstone_stairs_from_stone_types_dripstone_stonecutting.json a177092d0270f9e07a4f9bef4d0c8fb2ed91d3bc data/create/recipes/cut_dripstone_wall.json a3731ef689d3ac790bc3e3fd507f1134c99a751a data/create/recipes/cut_dripstone_wall_from_stone_types_dripstone_stonecutting.json +9c4c64666b18d3adb11cd3d56667fabf6e88dfe2 data/create/recipes/cut_granite_bricks_from_stone_types_granite_stonecutting.json aa454bebffd7e77cfa5c1bd711bfbac27e3c5a14 data/create/recipes/cut_granite_brick_slab.json d073b9b0b8ca2fbdc5e1ed16f6f195a5f3af4588 data/create/recipes/cut_granite_brick_slab_from_stone_types_granite_stonecutting.json 1dfd539c17a3342a0cd194ce1465a808aacbeda3 data/create/recipes/cut_granite_brick_slab_recycling.json @@ -3753,7 +4250,6 @@ e069aa5c316feb2823ef98e8e6c89bb1bed23d2e data/create/recipes/cut_granite_brick_s f38fc7014aa83d4914d50d87ee3f8f762c078a78 data/create/recipes/cut_granite_brick_stairs_from_stone_types_granite_stonecutting.json 0fd9c3a778c7bdcd7aa06f892a9c260ad664d367 data/create/recipes/cut_granite_brick_wall.json b81db94b6228f512049324dd1436880f1e86e444 data/create/recipes/cut_granite_brick_wall_from_stone_types_granite_stonecutting.json -9c4c64666b18d3adb11cd3d56667fabf6e88dfe2 data/create/recipes/cut_granite_bricks_from_stone_types_granite_stonecutting.json 01970a95f17648a7ef1fb0337ee2e82eb2279e9e data/create/recipes/cut_granite_from_stone_types_granite_stonecutting.json 8fc1c51591e590c8718be0500a4dbcc2b47830ce data/create/recipes/cut_granite_slab.json d239323b7a3b65b2fd7005350a90d578671c2b81 data/create/recipes/cut_granite_slab_from_stone_types_granite_stonecutting.json @@ -3762,6 +4258,7 @@ d239323b7a3b65b2fd7005350a90d578671c2b81 data/create/recipes/cut_granite_slab_fr 3d85d483073d37fea7d9a95831b3b856c0725b98 data/create/recipes/cut_granite_stairs_from_stone_types_granite_stonecutting.json 3d4130fe5fe6e963fd5e10534e729e0448b9f05f data/create/recipes/cut_granite_wall.json d43a876bf89bf3536c80fd5e3ef0ee36c147cd06 data/create/recipes/cut_granite_wall_from_stone_types_granite_stonecutting.json +7cdd3cf302cfe4ef21c0a89dadef4f781e307bb0 data/create/recipes/cut_limestone_bricks_from_stone_types_limestone_stonecutting.json 0e3285206947bcfdf9606d3f8e61ea7d2899f7d2 data/create/recipes/cut_limestone_brick_slab.json c3d3ff37e29c435b2a13d30bd4ded0f6ca9fbfbc data/create/recipes/cut_limestone_brick_slab_from_stone_types_limestone_stonecutting.json 459babb2bd01e9e1ece4c8cd2865690997f01c66 data/create/recipes/cut_limestone_brick_slab_recycling.json @@ -3769,7 +4266,6 @@ d4f8dc640becf1c35416016500424ecd68d7ecee data/create/recipes/cut_limestone_brick 570983b2b27862dabe9f3d1bcd76d2909b8bdb3c data/create/recipes/cut_limestone_brick_stairs_from_stone_types_limestone_stonecutting.json aad4342a726fd65ca2b4c52a4e8857190e50b5be data/create/recipes/cut_limestone_brick_wall.json 5ac226aff9d854efc47ed71241e6c098b170b9b0 data/create/recipes/cut_limestone_brick_wall_from_stone_types_limestone_stonecutting.json -7cdd3cf302cfe4ef21c0a89dadef4f781e307bb0 data/create/recipes/cut_limestone_bricks_from_stone_types_limestone_stonecutting.json 329950373aaaf8e70c54cf5e2467c7a84f372078 data/create/recipes/cut_limestone_from_stone_types_limestone_stonecutting.json cbacfd31703ac908d28e42968bb571dccfa20612 data/create/recipes/cut_limestone_slab.json 628a0a64c2dcd63f17a3ec9ce55ac643b194eacc data/create/recipes/cut_limestone_slab_from_stone_types_limestone_stonecutting.json @@ -3778,6 +4274,7 @@ cbacfd31703ac908d28e42968bb571dccfa20612 data/create/recipes/cut_limestone_slab. ba301da212ee14ff42c38487d0906a2da203e3c3 data/create/recipes/cut_limestone_stairs_from_stone_types_limestone_stonecutting.json d2aac4ac16f9c842af1efd3896dd3250f6d8424e data/create/recipes/cut_limestone_wall.json b14e6972f8586e569a7ab4ecf6ed5d6db1a2bded data/create/recipes/cut_limestone_wall_from_stone_types_limestone_stonecutting.json +a1a2b95283d88e1d990e00da9a095fe928b2aa2f data/create/recipes/cut_ochrum_bricks_from_stone_types_ochrum_stonecutting.json d5a4fa7787d2e56e0b5c8d533567543b93cf694b data/create/recipes/cut_ochrum_brick_slab.json 58514a5f216706e9bb62b27ad03701fe02bac013 data/create/recipes/cut_ochrum_brick_slab_from_stone_types_ochrum_stonecutting.json 6cc3167ebf075d7b302a359d1afdddf5753d0e26 data/create/recipes/cut_ochrum_brick_slab_recycling.json @@ -3785,7 +4282,6 @@ d5a4fa7787d2e56e0b5c8d533567543b93cf694b data/create/recipes/cut_ochrum_brick_sl ec6339d6658b0d32e46c8a4a4e06d94a388a6332 data/create/recipes/cut_ochrum_brick_stairs_from_stone_types_ochrum_stonecutting.json c4139ae7a9742f7111d308fe66bf1d627533550b data/create/recipes/cut_ochrum_brick_wall.json 1b8a4c81680df542a5e6b9e665c96649cf3eb7fa data/create/recipes/cut_ochrum_brick_wall_from_stone_types_ochrum_stonecutting.json -a1a2b95283d88e1d990e00da9a095fe928b2aa2f data/create/recipes/cut_ochrum_bricks_from_stone_types_ochrum_stonecutting.json 2b967f3424196b5da9b396ea58fb969d406af789 data/create/recipes/cut_ochrum_from_stone_types_ochrum_stonecutting.json 5baa701f3cbe8d69e2e6a5554622dd78ef3ac451 data/create/recipes/cut_ochrum_slab.json 9a26cba276cf135a10c71d31f5b960b2ee6ac444 data/create/recipes/cut_ochrum_slab_from_stone_types_ochrum_stonecutting.json @@ -3794,6 +4290,7 @@ a1a2b95283d88e1d990e00da9a095fe928b2aa2f data/create/recipes/cut_ochrum_bricks_f 75a232ccede0ffa7feb3e69da17c6a514a908907 data/create/recipes/cut_ochrum_stairs_from_stone_types_ochrum_stonecutting.json d9c05b7e4ce4ee86d0f6a9e1ee6c1b585ffee58b data/create/recipes/cut_ochrum_wall.json ee0dff8e1317aeffd061688879b97e81a00b7adb data/create/recipes/cut_ochrum_wall_from_stone_types_ochrum_stonecutting.json +087eefb8ffd61fd88f1db6ca25f9ac31e93f2fdf data/create/recipes/cut_scorchia_bricks_from_stone_types_scorchia_stonecutting.json 72ac9293e5791df07914e2d3ed00e5ff59d64b08 data/create/recipes/cut_scorchia_brick_slab.json 2f38c410d5eb93bdb8c8be0f68ac89726e3c765c data/create/recipes/cut_scorchia_brick_slab_from_stone_types_scorchia_stonecutting.json e296e6af6865bf6e4618dab8a96bb88f6999a9a5 data/create/recipes/cut_scorchia_brick_slab_recycling.json @@ -3801,7 +4298,6 @@ bd5984a6b96443319b7fad32db771d8ded0b0591 data/create/recipes/cut_scorchia_brick_ bd5c803c855222a29998dd784e6d12a18dd612d9 data/create/recipes/cut_scorchia_brick_stairs_from_stone_types_scorchia_stonecutting.json adfe0b08b5b72e579d47f36a4f835045e433e7f7 data/create/recipes/cut_scorchia_brick_wall.json 37fc5ae45d0260de9a5c45b0a1b208e4d146a562 data/create/recipes/cut_scorchia_brick_wall_from_stone_types_scorchia_stonecutting.json -087eefb8ffd61fd88f1db6ca25f9ac31e93f2fdf data/create/recipes/cut_scorchia_bricks_from_stone_types_scorchia_stonecutting.json f6dfd648418f24da093b80978c2f6e070f33ff6d data/create/recipes/cut_scorchia_from_stone_types_scorchia_stonecutting.json 7df99605c0c8761aeb9301d5391e1f16d41f89b3 data/create/recipes/cut_scorchia_slab.json fbd9a92d3c3d9e823cac51347320219f1734ec04 data/create/recipes/cut_scorchia_slab_from_stone_types_scorchia_stonecutting.json @@ -3810,6 +4306,7 @@ ad54182c3142ac9d9dd9bb4c5acc18f82e3fc5e5 data/create/recipes/cut_scorchia_stairs 1ddfefce136201ae78dbc53ba472080332fd6366 data/create/recipes/cut_scorchia_stairs_from_stone_types_scorchia_stonecutting.json 0a011b7cee33200fec5546168734c330952124da data/create/recipes/cut_scorchia_wall.json c594d886a303ad6e24d1283004442835ee861fbc data/create/recipes/cut_scorchia_wall_from_stone_types_scorchia_stonecutting.json +8650c0db70a3521b50404252106e0185b4f25a45 data/create/recipes/cut_scoria_bricks_from_stone_types_scoria_stonecutting.json 8baf09b5ff2004d71091b6f95307aa179a21f4df data/create/recipes/cut_scoria_brick_slab.json e7080ca9b6a507bec4a4a3dd52a28c1c33975628 data/create/recipes/cut_scoria_brick_slab_from_stone_types_scoria_stonecutting.json f5b56f6eb9c1ac0f8168b2b0f0b0ab00655ebfdb data/create/recipes/cut_scoria_brick_slab_recycling.json @@ -3817,7 +4314,6 @@ f5b56f6eb9c1ac0f8168b2b0f0b0ab00655ebfdb data/create/recipes/cut_scoria_brick_sl 3fd560355163f0afafefe886e75fd8b2c3cf2b6f data/create/recipes/cut_scoria_brick_stairs_from_stone_types_scoria_stonecutting.json ed803a4cdcf1dd01af03fff52e783f3539f78546 data/create/recipes/cut_scoria_brick_wall.json 553642a4e0dc5f934da8127a427ccdf53d3f51f9 data/create/recipes/cut_scoria_brick_wall_from_stone_types_scoria_stonecutting.json -8650c0db70a3521b50404252106e0185b4f25a45 data/create/recipes/cut_scoria_bricks_from_stone_types_scoria_stonecutting.json 5702063be3d38fa6b3ae5c998337676a0cf91149 data/create/recipes/cut_scoria_from_stone_types_scoria_stonecutting.json 295356022aee8a33272b430879615af638fc5a2c data/create/recipes/cut_scoria_slab.json 1656e822e823fcdf04120b55235aa477845a69a6 data/create/recipes/cut_scoria_slab_from_stone_types_scoria_stonecutting.json @@ -3826,6 +4322,7 @@ d0c88c037004911e377d88cf5a28ff85a413d07e data/create/recipes/cut_scoria_slab_rec 8748df6152c923930452397367562bb6007058cf data/create/recipes/cut_scoria_stairs_from_stone_types_scoria_stonecutting.json 7f9bd9de7bfba21eef449f8e11ffc8cf37de6b88 data/create/recipes/cut_scoria_wall.json 42235c6ded520ecda3321e8cd8910dcfa05cd61e data/create/recipes/cut_scoria_wall_from_stone_types_scoria_stonecutting.json +c02b4daf0050d705c145c0698aaa3094724ba2f1 data/create/recipes/cut_tuff_bricks_from_stone_types_tuff_stonecutting.json 214b6219b86d94ea5705e40f254a4d9a9ac894b7 data/create/recipes/cut_tuff_brick_slab.json 9e0182206fab754daa0596259be0b98a712ba859 data/create/recipes/cut_tuff_brick_slab_from_stone_types_tuff_stonecutting.json 86938ed4ef969e85163c25e2a60181433247b73b data/create/recipes/cut_tuff_brick_slab_recycling.json @@ -3833,7 +4330,6 @@ b4212528d6c8893c1d57c0a5ada60673105e399d data/create/recipes/cut_tuff_brick_stai 90f3241a3eb47d9b0902b639fadee76e41b92a72 data/create/recipes/cut_tuff_brick_stairs_from_stone_types_tuff_stonecutting.json b920d14ac41465f70b1fb8211c1c06d6c41ccadb data/create/recipes/cut_tuff_brick_wall.json aa41f89028dfa995dc11b881894e5a5993e4c4f9 data/create/recipes/cut_tuff_brick_wall_from_stone_types_tuff_stonecutting.json -c02b4daf0050d705c145c0698aaa3094724ba2f1 data/create/recipes/cut_tuff_bricks_from_stone_types_tuff_stonecutting.json 41dc800ae0a8918f4602d610ff0ba9714cdfe8dc data/create/recipes/cut_tuff_from_stone_types_tuff_stonecutting.json 573fff8b4fba92289dc6b113b58c8de25427f62d data/create/recipes/cut_tuff_slab.json 94667fb1e6203bd66bef10acfee7cd990009d26f data/create/recipes/cut_tuff_slab_from_stone_types_tuff_stonecutting.json @@ -3842,6 +4338,7 @@ c02b4daf0050d705c145c0698aaa3094724ba2f1 data/create/recipes/cut_tuff_bricks_fro 3b3ba319bd67a4e7f555cfcb54f9dc1fc22cf015 data/create/recipes/cut_tuff_stairs_from_stone_types_tuff_stonecutting.json 0c241d763e87b23b8799528e132e0d12b0e16141 data/create/recipes/cut_tuff_wall.json 5705b0312c5c70d48662c2ff375f0b2cfe3b4902 data/create/recipes/cut_tuff_wall_from_stone_types_tuff_stonecutting.json +8ab3c640b57421a8c0341ab4ec5bade31376d059 data/create/recipes/cut_veridium_bricks_from_stone_types_veridium_stonecutting.json 822f97726c72d31c4c614767c08140b3535e0640 data/create/recipes/cut_veridium_brick_slab.json 1705fd5fc9ecc9a650812c89f500b5ef9aec2626 data/create/recipes/cut_veridium_brick_slab_from_stone_types_veridium_stonecutting.json 238aeedf55624671809a37246581d28fe6b2c19e data/create/recipes/cut_veridium_brick_slab_recycling.json @@ -3849,7 +4346,6 @@ dfbef691643cead7111b3b1c51aabcda8419bc19 data/create/recipes/cut_veridium_brick_ db2ea87f3ec8924ba9e0b87cd6a6edeb93c0c2d8 data/create/recipes/cut_veridium_brick_stairs_from_stone_types_veridium_stonecutting.json 5e5c9fab7ba7143d206df7d8184742fb1a17c99c data/create/recipes/cut_veridium_brick_wall.json ed752a7f698e3ecbb5e4f848a78f8b3c7c6bf12e data/create/recipes/cut_veridium_brick_wall_from_stone_types_veridium_stonecutting.json -8ab3c640b57421a8c0341ab4ec5bade31376d059 data/create/recipes/cut_veridium_bricks_from_stone_types_veridium_stonecutting.json e0355543105e4ec9d672d2a050e70b5c198ea472 data/create/recipes/cut_veridium_from_stone_types_veridium_stonecutting.json fb3c671f64676538ea3aa96be483ac15b3cdeb3d data/create/recipes/cut_veridium_slab.json 7d7c80ac03ad8623f9a5d7f0ff0bb6f68985efa5 data/create/recipes/cut_veridium_slab_from_stone_types_veridium_stonecutting.json @@ -3881,6 +4377,8 @@ c1ac5bad113e067bf5cfa8d730dcc835420aecfb data/create/recipes/granite_from_stone_ 8d6448c67261138b6331273024b757a9a58b41c4 data/create/recipes/horizontal_framed_glass_from_glass_colorless_stonecutting.json dde9d763cc1306d48e2f3b813530fca0842a5c14 data/create/recipes/horizontal_framed_glass_pane.json 61f759fec228090a60371add88cc90be3a84a735 data/create/recipes/industrial_iron_block_from_ingots_iron_stonecutting.json +813c68e25ffc543d7457a1417897dd0b579d1b1e data/create/recipes/industrial_iron_window.json +4a4e4f87a2753fb5310f7f70c39143e02b6a6fd0 data/create/recipes/industrial_iron_window_pane.json 2b4a8702db989116dbf97d0021d71a5948336805 data/create/recipes/jungle_window.json 4400d3db46b091d3ead7fbcb64cb712db2fde5de data/create/recipes/jungle_window_pane.json 66da7fc9adbe0119bc41bfad0f6422fb93dcf3b6 data/create/recipes/layered_andesite_from_stone_types_andesite_stonecutting.json @@ -4033,6 +4531,7 @@ a157a43e7788d285b8d72eade5955369c9b9a1de data/create/recipes/rose_quartz_block_f 1268cc2bdd088d26b84fb4e481db27af61f94bd1 data/create/recipes/scorchia_pillar_from_stone_types_scorchia_stonecutting.json 2e8f4cdb3498547a5e6fe658bb33d4be5ce8f54b data/create/recipes/scoria_from_stone_types_scoria_stonecutting.json 770d3453c75f77b16db661f6e636892d3117690b data/create/recipes/scoria_pillar_from_stone_types_scoria_stonecutting.json +75dc56fcdcd6a10288f2d607bf6dcbbe10b35a64 data/create/recipes/small_andesite_bricks_from_stone_types_andesite_stonecutting.json 2e86fddc76285b4e380b845eb1150580b134d0ac data/create/recipes/small_andesite_brick_slab.json 311727e5c08ddbe0aa26275be74e9b83201ac8ab data/create/recipes/small_andesite_brick_slab_from_stone_types_andesite_stonecutting.json 2767e239c9d704b6bb5325b4f40e0aa0acdcdce1 data/create/recipes/small_andesite_brick_slab_recycling.json @@ -4040,7 +4539,7 @@ a157a43e7788d285b8d72eade5955369c9b9a1de data/create/recipes/rose_quartz_block_f 9e82896e00c1e14e514fac818e11e5b9ef5b10d7 data/create/recipes/small_andesite_brick_stairs_from_stone_types_andesite_stonecutting.json 5287d389b4954d954881d9f0293c52870bba88d0 data/create/recipes/small_andesite_brick_wall.json 1172ca76affd948c50b207124ee03c4f480f4ee8 data/create/recipes/small_andesite_brick_wall_from_stone_types_andesite_stonecutting.json -75dc56fcdcd6a10288f2d607bf6dcbbe10b35a64 data/create/recipes/small_andesite_bricks_from_stone_types_andesite_stonecutting.json +e3b69122b2cfe64b043384235eeb6d04f346e58b data/create/recipes/small_asurine_bricks_from_stone_types_asurine_stonecutting.json 9196a055491052afc14ed01667cccf2a0920e793 data/create/recipes/small_asurine_brick_slab.json f4cc3330837a647c098ccb24fbbbf583c3f960fc data/create/recipes/small_asurine_brick_slab_from_stone_types_asurine_stonecutting.json 063b2f0ad7e93698999922040132eb2b23661a38 data/create/recipes/small_asurine_brick_slab_recycling.json @@ -4048,7 +4547,7 @@ a85d2f957223f87ffa2c3f63cdf6f9f0f84bb921 data/create/recipes/small_asurine_brick c7cb218b0d8a1e358d593fc1fef82fc074289552 data/create/recipes/small_asurine_brick_stairs_from_stone_types_asurine_stonecutting.json 08d10ee57995e67ac1fb5feba04b03aee51dbe16 data/create/recipes/small_asurine_brick_wall.json 4c0aa6203295a36a6d7ffe9d7bf0973277162689 data/create/recipes/small_asurine_brick_wall_from_stone_types_asurine_stonecutting.json -e3b69122b2cfe64b043384235eeb6d04f346e58b data/create/recipes/small_asurine_bricks_from_stone_types_asurine_stonecutting.json +07125218f9025833afa189fa0090f4d6b4660db0 data/create/recipes/small_calcite_bricks_from_stone_types_calcite_stonecutting.json a72719de028ca9e07756dae6031af48525520fc2 data/create/recipes/small_calcite_brick_slab.json d8ebf6f1eb2e2372fb20def956398089adec5d13 data/create/recipes/small_calcite_brick_slab_from_stone_types_calcite_stonecutting.json ab4cfc2b34989d41a434781a3150ecd530c4f15b data/create/recipes/small_calcite_brick_slab_recycling.json @@ -4056,7 +4555,7 @@ c77a7700d978e23db14d947915591061dda8eab3 data/create/recipes/small_calcite_brick 4e066bfc60ea142d54ce939d025b6679ac9634ad data/create/recipes/small_calcite_brick_stairs_from_stone_types_calcite_stonecutting.json 64e53d8090fa26cc4cb62efea7c1615ff7f705c2 data/create/recipes/small_calcite_brick_wall.json 3ba736ae76249fa61692c13f7879af954f9bbd36 data/create/recipes/small_calcite_brick_wall_from_stone_types_calcite_stonecutting.json -07125218f9025833afa189fa0090f4d6b4660db0 data/create/recipes/small_calcite_bricks_from_stone_types_calcite_stonecutting.json +a3309c81f84bf4fb78e9db2316fb758f9b2f8429 data/create/recipes/small_crimsite_bricks_from_stone_types_crimsite_stonecutting.json 92cf7e99229c1e72405bb0875e6f939b3f5aea12 data/create/recipes/small_crimsite_brick_slab.json b993e081103c019b7b9b73b38ef8c408fb4500ac data/create/recipes/small_crimsite_brick_slab_from_stone_types_crimsite_stonecutting.json 7f6fa1fab65d910388f5f2ec4ee7d99cbda8df57 data/create/recipes/small_crimsite_brick_slab_recycling.json @@ -4064,7 +4563,7 @@ b993e081103c019b7b9b73b38ef8c408fb4500ac data/create/recipes/small_crimsite_bric 260da721849d1afd6f431d51538d1587ee3af8d5 data/create/recipes/small_crimsite_brick_stairs_from_stone_types_crimsite_stonecutting.json 093ac919f793111b442029198383a9de5b6df027 data/create/recipes/small_crimsite_brick_wall.json 8b8280a8282fa8718620ee3d69182e241a7852c0 data/create/recipes/small_crimsite_brick_wall_from_stone_types_crimsite_stonecutting.json -a3309c81f84bf4fb78e9db2316fb758f9b2f8429 data/create/recipes/small_crimsite_bricks_from_stone_types_crimsite_stonecutting.json +e7a3cb889ce6b530cd40f19e23bad943374e61b5 data/create/recipes/small_deepslate_bricks_from_stone_types_deepslate_stonecutting.json 022690548a46f5cc63adda3626824a81c6ebf490 data/create/recipes/small_deepslate_brick_slab.json 655be9ddf21dea2255fb2cb2628a5fee39eb10e2 data/create/recipes/small_deepslate_brick_slab_from_stone_types_deepslate_stonecutting.json d6d3db5604279cd402f64dbdeae7c3bee6d7ab78 data/create/recipes/small_deepslate_brick_slab_recycling.json @@ -4072,7 +4571,7 @@ d6d3db5604279cd402f64dbdeae7c3bee6d7ab78 data/create/recipes/small_deepslate_bri 0a458e8248fe395748bd6025d43c002db5a7d343 data/create/recipes/small_deepslate_brick_stairs_from_stone_types_deepslate_stonecutting.json 96e2c36ac2f2899c9681f12f43c8ae232ae09180 data/create/recipes/small_deepslate_brick_wall.json e5644f4227b9cc9b98158ce3ded98bff1ffb97f9 data/create/recipes/small_deepslate_brick_wall_from_stone_types_deepslate_stonecutting.json -e7a3cb889ce6b530cd40f19e23bad943374e61b5 data/create/recipes/small_deepslate_bricks_from_stone_types_deepslate_stonecutting.json +38b80603a86df24f6be0df9fd5f7d9b7aa33d2f9 data/create/recipes/small_diorite_bricks_from_stone_types_diorite_stonecutting.json 6c66b44941c8b97cfec5948b5d8b08355f8d8f67 data/create/recipes/small_diorite_brick_slab.json 801f6cc6e06db56344b37c9b76c69f921c6d9293 data/create/recipes/small_diorite_brick_slab_from_stone_types_diorite_stonecutting.json c1fe4bff306e2d2b5d5595e4b35dd85f7e6bf0ce data/create/recipes/small_diorite_brick_slab_recycling.json @@ -4080,7 +4579,7 @@ af6feedf00bdfa45c1b8f0dd46ddaa80da622fed data/create/recipes/small_diorite_brick 30a6f2bdfec2b3f578572c9f94112906411e7c54 data/create/recipes/small_diorite_brick_stairs_from_stone_types_diorite_stonecutting.json 8728b791808736de2ac31e8dc81aa43638ae0ac8 data/create/recipes/small_diorite_brick_wall.json 7a1fdcef7091d76230fbee410fa5241f584845c4 data/create/recipes/small_diorite_brick_wall_from_stone_types_diorite_stonecutting.json -38b80603a86df24f6be0df9fd5f7d9b7aa33d2f9 data/create/recipes/small_diorite_bricks_from_stone_types_diorite_stonecutting.json +8840d538648516dd02628fbe3ea4f032ceda78bb data/create/recipes/small_dripstone_bricks_from_stone_types_dripstone_stonecutting.json 39a545b60040bd2d922cd3bd5af5036b1b9b23ef data/create/recipes/small_dripstone_brick_slab.json c91e4dc211305456c38e5823def91811ad851202 data/create/recipes/small_dripstone_brick_slab_from_stone_types_dripstone_stonecutting.json 55bb37d07e841bb8eecf2013445c01c8e09ff824 data/create/recipes/small_dripstone_brick_slab_recycling.json @@ -4088,7 +4587,7 @@ c91e4dc211305456c38e5823def91811ad851202 data/create/recipes/small_dripstone_bri 1e23c8df90aef6cd3561369f72c6c3106da883f5 data/create/recipes/small_dripstone_brick_stairs_from_stone_types_dripstone_stonecutting.json fda46cc15c21e7843537df5b5331874fd7511e19 data/create/recipes/small_dripstone_brick_wall.json 336e47b35437ffea4bb86d34f94e6361b2bbcfb0 data/create/recipes/small_dripstone_brick_wall_from_stone_types_dripstone_stonecutting.json -8840d538648516dd02628fbe3ea4f032ceda78bb data/create/recipes/small_dripstone_bricks_from_stone_types_dripstone_stonecutting.json +42c74dec6c64d3675e15b2b73cb32fc9d24839e9 data/create/recipes/small_granite_bricks_from_stone_types_granite_stonecutting.json d1bb4e91d80ca8eb9c2f935cbb66ef08b9ca7059 data/create/recipes/small_granite_brick_slab.json ddb2f4652607b56332a927af939212a5789a34db data/create/recipes/small_granite_brick_slab_from_stone_types_granite_stonecutting.json f1388636bcf98d7d9103c23528053b28c6305b4e data/create/recipes/small_granite_brick_slab_recycling.json @@ -4096,7 +4595,7 @@ f1388636bcf98d7d9103c23528053b28c6305b4e data/create/recipes/small_granite_brick ba935a3d64eedbd9b7017d0abfab351f57589593 data/create/recipes/small_granite_brick_stairs_from_stone_types_granite_stonecutting.json dac22c54e8034587a3fcf3aa0ce19bb4b7607cd7 data/create/recipes/small_granite_brick_wall.json 7a8d9e2291675de9e72363d93410de9039216f32 data/create/recipes/small_granite_brick_wall_from_stone_types_granite_stonecutting.json -42c74dec6c64d3675e15b2b73cb32fc9d24839e9 data/create/recipes/small_granite_bricks_from_stone_types_granite_stonecutting.json +714f6a84a5b3d5d57c07364925555e6f545b0b3d data/create/recipes/small_limestone_bricks_from_stone_types_limestone_stonecutting.json b844632a588cb96397750f4387c7e6517f85092c data/create/recipes/small_limestone_brick_slab.json a1c0bc263cd4659a89213f4fcdd87eba7ae04427 data/create/recipes/small_limestone_brick_slab_from_stone_types_limestone_stonecutting.json ec9154a3791113f57dc1c16dfef4c837533b6fc6 data/create/recipes/small_limestone_brick_slab_recycling.json @@ -4104,7 +4603,7 @@ ec9154a3791113f57dc1c16dfef4c837533b6fc6 data/create/recipes/small_limestone_bri 6943fdc8162e4d53c459f425b2ff5b34e9caa477 data/create/recipes/small_limestone_brick_stairs_from_stone_types_limestone_stonecutting.json 27ff69345efea14b9688fe9b182809995ea8ad4a data/create/recipes/small_limestone_brick_wall.json 98a83f757f0ac9cc2a876ae407bb5765071e700d data/create/recipes/small_limestone_brick_wall_from_stone_types_limestone_stonecutting.json -714f6a84a5b3d5d57c07364925555e6f545b0b3d data/create/recipes/small_limestone_bricks_from_stone_types_limestone_stonecutting.json +22c69e391110280e13d50693b9c81355da57a315 data/create/recipes/small_ochrum_bricks_from_stone_types_ochrum_stonecutting.json abdd280694cb30ce0d2703aadeeb378af9a7f8b2 data/create/recipes/small_ochrum_brick_slab.json e37612fa2523fa3711242cac4ec5e596b3e55698 data/create/recipes/small_ochrum_brick_slab_from_stone_types_ochrum_stonecutting.json 8f3f47cb3e759104cf86a422339345f8795143d3 data/create/recipes/small_ochrum_brick_slab_recycling.json @@ -4112,8 +4611,8 @@ de8d7f8e57645c0b5a6e98eb0cc4e573c5cf96ac data/create/recipes/small_ochrum_brick_ 04ebbdd14f81f4b4dc7986cb5241caa9f48f4ff1 data/create/recipes/small_ochrum_brick_stairs_from_stone_types_ochrum_stonecutting.json 07876725f97ff611f8d1710462224f07cab3ebbd data/create/recipes/small_ochrum_brick_wall.json 2331801569ec95562afc802f7e2ff191d329a5c6 data/create/recipes/small_ochrum_brick_wall_from_stone_types_ochrum_stonecutting.json -22c69e391110280e13d50693b9c81355da57a315 data/create/recipes/small_ochrum_bricks_from_stone_types_ochrum_stonecutting.json 68a9f80b97d9322ed33067d7717180494b904bed data/create/recipes/small_rose_quartz_tiles_from_polished_rose_quartz_stonecutting.json +bf27af2e54ed1b09611d67ee7afa6c7f56d00d09 data/create/recipes/small_scorchia_bricks_from_stone_types_scorchia_stonecutting.json 133057778480e1d2e13fe7b2766ba0891feea3a5 data/create/recipes/small_scorchia_brick_slab.json dad342d215c98f3214752e0ebfaf3015943c5ac7 data/create/recipes/small_scorchia_brick_slab_from_stone_types_scorchia_stonecutting.json 0a57ad5fce22d69cdc1dd880403612ffb47af4ba data/create/recipes/small_scorchia_brick_slab_recycling.json @@ -4121,7 +4620,7 @@ dad342d215c98f3214752e0ebfaf3015943c5ac7 data/create/recipes/small_scorchia_bric 7f89c9c6dcea06a3022c72029a5e547aa1721773 data/create/recipes/small_scorchia_brick_stairs_from_stone_types_scorchia_stonecutting.json 43310b3fa43bd791ef0e2e30971a24e788c20139 data/create/recipes/small_scorchia_brick_wall.json de8edc4fa5eec031ad0a63c7f59141985ae9af9e data/create/recipes/small_scorchia_brick_wall_from_stone_types_scorchia_stonecutting.json -bf27af2e54ed1b09611d67ee7afa6c7f56d00d09 data/create/recipes/small_scorchia_bricks_from_stone_types_scorchia_stonecutting.json +b1a67d052e26c2129c34ee0732cfe533beb3e571 data/create/recipes/small_scoria_bricks_from_stone_types_scoria_stonecutting.json d8a41adcc6ae9b0eb71a83b2dd89ff92a10e0057 data/create/recipes/small_scoria_brick_slab.json 34f4dd094f2949e3fd21f95ac890ae803b81fbea data/create/recipes/small_scoria_brick_slab_from_stone_types_scoria_stonecutting.json f15ad1cb05f5b02b630b982d23bd951178a3650c data/create/recipes/small_scoria_brick_slab_recycling.json @@ -4129,7 +4628,7 @@ df5a1437fb112519d904cc9f1cd28d5d891fb04d data/create/recipes/small_scoria_brick_ d36428daf8bf4e560f649e5eb40a8cd7a27e7a0e data/create/recipes/small_scoria_brick_stairs_from_stone_types_scoria_stonecutting.json cad432398d8886d60b94e96b2c2096ae27fffb50 data/create/recipes/small_scoria_brick_wall.json 9cff8370aaa81ece466fe15642c00a9992bd416c data/create/recipes/small_scoria_brick_wall_from_stone_types_scoria_stonecutting.json -b1a67d052e26c2129c34ee0732cfe533beb3e571 data/create/recipes/small_scoria_bricks_from_stone_types_scoria_stonecutting.json +e51ced16059f7c37fe3652a1cf4d938f91e956fc data/create/recipes/small_tuff_bricks_from_stone_types_tuff_stonecutting.json dd83af4a10a9b0ba6a4efb272d8b6b1611524a39 data/create/recipes/small_tuff_brick_slab.json e3a12b87830e47387e9ac118bb3d12b73558d757 data/create/recipes/small_tuff_brick_slab_from_stone_types_tuff_stonecutting.json 85dff00dc49eaf65f1f149a7f21a9f307b1b9710 data/create/recipes/small_tuff_brick_slab_recycling.json @@ -4137,7 +4636,7 @@ e03a8270b01b9a5cad238db4ce2b8f66ea78e8bf data/create/recipes/small_tuff_brick_st cd50bb5842c90038f6ac74e45971ab2e914d1463 data/create/recipes/small_tuff_brick_stairs_from_stone_types_tuff_stonecutting.json e795fbe5062ec47cc660ee26c8398477509c5f18 data/create/recipes/small_tuff_brick_wall.json 34471a7ebb431b6d1e3be5fa480b800b96556fee data/create/recipes/small_tuff_brick_wall_from_stone_types_tuff_stonecutting.json -e51ced16059f7c37fe3652a1cf4d938f91e956fc data/create/recipes/small_tuff_bricks_from_stone_types_tuff_stonecutting.json +82f17edc61a319c74dbdfa730584305899bd7572 data/create/recipes/small_veridium_bricks_from_stone_types_veridium_stonecutting.json f9a2f4ca078364e05b3446fe890ea207e5a56e87 data/create/recipes/small_veridium_brick_slab.json 234c3baee4c9428caab3e344f396ec87064103e3 data/create/recipes/small_veridium_brick_slab_from_stone_types_veridium_stonecutting.json b0db8335e3c7fd88f074c3895bea952efc0e8df8 data/create/recipes/small_veridium_brick_slab_recycling.json @@ -4145,7 +4644,6 @@ a1e214c230574526ca0a2fec059b4157ddec557d data/create/recipes/small_veridium_bric f63031587a64ed88ddba1df07767dd8d8caa1d2e data/create/recipes/small_veridium_brick_stairs_from_stone_types_veridium_stonecutting.json 9b003fbf2bcd975501ba307ea68c6c4bab397683 data/create/recipes/small_veridium_brick_wall.json 1ba48c5cae05b6f4b1ad223ce80925f1eaaf5dfd data/create/recipes/small_veridium_brick_wall_from_stone_types_veridium_stonecutting.json -82f17edc61a319c74dbdfa730584305899bd7572 data/create/recipes/small_veridium_bricks_from_stone_types_veridium_stonecutting.json 47973044b19b35ce169e7d46abc9d11a2f67a487 data/create/recipes/spruce_window.json 810544f79bf4b002981e614eaa8e49b48a7b5397 data/create/recipes/spruce_window_pane.json e343a80c92dab60f99c9b441d00189aceee477a0 data/create/recipes/tiled_glass_from_glass_colorless_stonecutting.json @@ -4166,6 +4664,9 @@ fdd28fc956dbec71ba24cdea5adfc049d6eb31e3 data/create/recipes/tuff_pillar_from_st 93c61ebeda451ebeb37c3047459f95f14fa9f1f9 data/create/recipes/weathered_copper_tile_slab_from_weathered_copper_tiles_stonecutting.json 8a32b955b4320eddff017378785d1c95e1434229 data/create/recipes/weathered_copper_tile_stairs.json f1a03ac86925e26cbec6aeeada2eafb40008fc8e data/create/recipes/weathered_copper_tile_stairs_from_weathered_copper_tiles_stonecutting.json +4b5fc518830e3c57471f930deacf0abee4ae6313 data/create/recipes/weathered_iron_block_from_ingots_iron_stonecutting.json +a57dfe9974b8b6d338b9ab4ae124297fda7780b9 data/create/recipes/weathered_iron_window.json +11034a79e8f167249b78e6e3863e01991ac9d778 data/create/recipes/weathered_iron_window_pane.json f365be4eda73234b73aa49c97b065f1a8baafbf6 data/create/tags/blocks/brittle.json 8b6c0b444b15f7fb2d55b9cbcb68537c1269f877 data/create/tags/blocks/casing.json 35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/create/tags/blocks/contraption_inventory_deny.json @@ -4182,15 +4683,17 @@ f675c20350ed60da4878b5d6301f02c8c05624bd data/create/tags/blocks/fan_processing_ 4970078b49ddac1b1d500ed0469cedf42bdc3d35 data/create/tags/blocks/non_movable.json 06e13efbb7b0d09ff7ecd1a7dc45a0760b91ad67 data/create/tags/blocks/ore_override_stone.json a5874f73c7dc0a3ae12999e6ae8abf45bc7fb9be data/create/tags/blocks/passive_boiler_heaters.json +f400870b8dbcd14238be3ec99c419093073ba3a6 data/create/tags/blocks/postboxes.json 9bc8c13fd80bdbe7f767b91ee1a1042e9aff02b0 data/create/tags/blocks/roots.json -79ed9149ee2ce143114db4ccafda8a2b6a293aac data/create/tags/blocks/safe_nbt.json +55dccb895bbdacfbd6ee9005486cd3fe9df01249 data/create/tags/blocks/safe_nbt.json 79418bd729cef417b322cef9b491e7ae83317d61 data/create/tags/blocks/seats.json +8a6ad3c63fb0c436ec8109f39358213930effd5a data/create/tags/blocks/table_cloths.json 5def5088f7fd31b80e6f28c1c4ea146aa9d7d15b data/create/tags/blocks/toolboxes.json 2589b135c0e96ad29076569e144528fe32ea5b39 data/create/tags/blocks/tracks.json 1b6977d9a399cf6ee042e3f8f5e64e4d3cda5489 data/create/tags/blocks/tree_attachments.json da739ad2160e7df4e0e5cc89587670ce5e9450c3 data/create/tags/blocks/valve_handles.json 72143286fb5cb372a0696550e2eac76ca50e6fbc data/create/tags/blocks/windmill_sails.json -58987ea71d488cc48192ceb00c00aa2903e51304 data/create/tags/blocks/wrench_pickup.json +30a54ad8eb06f2335705f5f01d12085ab4841dff data/create/tags/blocks/wrench_pickup.json 76c0522664726c09461ad4565b6fba80b4f816b2 data/create/tags/entity_types/blaze_burner_capturable.json 35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/create/tags/entity_types/ignore_seat.json 894e1e4fd1e32712abdda18ec64ab13750d3c039 data/create/tags/fluids/bottomless/allow.json @@ -4206,9 +4709,14 @@ f43cac8216e2a9347e48cf93a43de95dd810ca20 data/create/tags/items/contraption_cont d371dfd35e49a7bef19f59c03e7f4ae20992f03d data/create/tags/items/create_ingots.json 910d0f5ccbc4c84b224eca1f1588b1695f41447b data/create/tags/items/crushed_raw_materials.json 0fa526e7e742573b603ad26b09526cf724efa1dc data/create/tags/items/deployable_drink.json +ebd7b09daf2f64c0c04d821696b0e145683d8693 data/create/tags/items/dyed_table_cloths.json +d2bb65d893d71d2d9871f81f430c233a93adb4bb data/create/tags/items/invalid_for_track_paving.json 1cebeb92bd514b75d54ac6d5708047801f0501c5 data/create/tags/items/modded_stripped_logs.json 586f8fc5a8b8559c9dc0017e13c78ad918688fae data/create/tags/items/modded_stripped_wood.json +b96668734c9b7a90348235217512d49193e4ea7f data/create/tags/items/packages.json +f400870b8dbcd14238be3ec99c419093073ba3a6 data/create/tags/items/postboxes.json 695d75b352fd190b303c724d1aaee9bb786a903b data/create/tags/items/pressurized_air_sources.json +22c4d4e033a61942b170aa309ed46a89a0ba0c65 data/create/tags/items/pulpifiable.json 2cd3adffd8b151354df137a990dcb97996a665bb data/create/tags/items/sandpaper.json 79418bd729cef417b322cef9b491e7ae83317d61 data/create/tags/items/seats.json e02cb3bc2373336dc04495b0b414107f6f754b61 data/create/tags/items/sleepers.json @@ -4229,6 +4737,7 @@ e22493305e0cebfb7ededae122e19ee9dd24fc9d data/create/tags/items/stone_types/scor 8034ddb85922b193ad1e6251fc6b856b4ae622b1 data/create/tags/items/stone_types/scoria.json 7e4d20c52a25a0c0d13e0122be0250718a9fb645 data/create/tags/items/stone_types/tuff.json 076c79e07eb3a65d74107577dbfd993b13780637 data/create/tags/items/stone_types/veridium.json +8a6ad3c63fb0c436ec8109f39358213930effd5a data/create/tags/items/table_cloths.json 5def5088f7fd31b80e6f28c1c4ea146aa9d7d15b data/create/tags/items/toolboxes.json 2589b135c0e96ad29076569e144528fe32ea5b39 data/create/tags/items/tracks.json a5b5711d1798473a9b25db5b7f749570ed0a2769 data/create/tags/items/upgrade_aquatic/coral.json @@ -4238,23 +4747,27 @@ c59c9fc0cdd45de659aa8023d36f9decb90f708c data/create/tags/items/vanilla_stripped 64441ac1daa64c81601b94b82b21c0ee862b6344 data/create/tags/items/vanilla_stripped_wood.json edf7390f09e622193bbc720ec51ba128ea1e96e6 data/curios/tags/items/head.json 10d5f0c1763f80860a39398ecc33dbbe43099471 data/forge/tags/blocks/glass/colorless.json -de1fc89be6a52473d526d3efe0204b9b8489058c data/forge/tags/blocks/glass_panes.json +220b4c682f6cf536534e7cd6a79a9acc811bacd2 data/forge/tags/blocks/glass_panes.json 81b107ada9c6ac5679a21f8c6a006bf230f69c39 data/forge/tags/blocks/ores.json 81b107ada9c6ac5679a21f8c6a006bf230f69c39 data/forge/tags/blocks/ores/zinc.json e475ad1c52bffedfc544e5331a87c1f5c45149fd data/forge/tags/blocks/ores_in_ground/deepslate.json 2f6068972e364599b6849dc46fcb0724d4219d53 data/forge/tags/blocks/ores_in_ground/stone.json 2589b135c0e96ad29076569e144528fe32ea5b39 data/forge/tags/blocks/relocation_not_supported.json -b3af02a6fa3dc41bc3f4db933485f22b202deea3 data/forge/tags/blocks/storage_blocks.json +807ea01d3b028bd226ed0befc142cbd23647e998 data/forge/tags/blocks/storage_blocks.json 7d10cdf9e46a79753d4437c7bb958e3ab8bf0c89 data/forge/tags/blocks/storage_blocks/andesite_alloy.json 70bba470740dc7a77f51b4cb1747a105b62d4bde data/forge/tags/blocks/storage_blocks/brass.json +18f54179c6f809ff4aee792702fa35d3053e5dc4 data/forge/tags/blocks/storage_blocks/cardboard.json bcd593714f43bc6a0aefbd714c24db3cf9e71250 data/forge/tags/blocks/storage_blocks/raw_zinc.json 41b2a17b5ebcff5623e25dc6232f73cf9aa70387 data/forge/tags/blocks/storage_blocks/zinc.json 8140415f1c16f09167f41eeee25c09706a944be0 data/forge/tags/fluids/chocolate.json 0ccc9ff76001cdd7db1b79c1371f59d3283abe64 data/forge/tags/fluids/honey.json cca816b34ac2e9b7933df680aa9778ff2cfe9605 data/forge/tags/fluids/tea.json -00c856dcfa4368cca671ee5d93c4900835991d68 data/forge/tags/items/armors/boots.json +1a9ce7d5f5fe92d3b73e269cd5dbf5cd1f1fe5b8 data/forge/tags/items/armors/boots.json +6749b53c23aefe4baa55c4b2f624bbc6dfe5f423 data/forge/tags/items/armors/chestplate.json 695d75b352fd190b303c724d1aaee9bb786a903b data/forge/tags/items/armors/chestplates.json +5b91b107f48b47958db20f13cb3cc0c6f7085fdc data/forge/tags/items/armors/helmet.json 3580dae058fc75b45fab4c4ebbd1b01573ba9e11 data/forge/tags/items/armors/helmets.json +afdac448376ff5624f49cbf31feedf691ecbc4c5 data/forge/tags/items/armors/leggings.json 06ebf72e8f6c081862236d4b068b5dfb275a8385 data/forge/tags/items/buckets/honey.json 801d097b0af7153e0c5c72a924d61f8afb4cf264 data/forge/tags/items/dough.json 801d097b0af7153e0c5c72a924d61f8afb4cf264 data/forge/tags/items/dough/wheat.json @@ -4262,7 +4775,7 @@ cca816b34ac2e9b7933df680aa9778ff2cfe9605 data/forge/tags/fluids/tea.json 745512f10c4ba52f2c224607377e41011fb2ecfe data/forge/tags/items/flour.json 745512f10c4ba52f2c224607377e41011fb2ecfe data/forge/tags/items/flour/wheat.json 10d5f0c1763f80860a39398ecc33dbbe43099471 data/forge/tags/items/glass/colorless.json -de1fc89be6a52473d526d3efe0204b9b8489058c data/forge/tags/items/glass_panes.json +220b4c682f6cf536534e7cd6a79a9acc811bacd2 data/forge/tags/items/glass_panes.json 01d32d3b7b033aff44c047bf289d696de0b0c715 data/forge/tags/items/ingots.json 5a7bffd1d604bc6ea8b35714ef02b95773240f90 data/forge/tags/items/ingots/brass.json ccf5b08295f6362a3f6b3b595f1de1bba4b224ec data/forge/tags/items/ingots/zinc.json @@ -4276,15 +4789,17 @@ e475ad1c52bffedfc544e5331a87c1f5c45149fd data/forge/tags/items/ores_in_ground/de 2f6068972e364599b6849dc46fcb0724d4219d53 data/forge/tags/items/ores_in_ground/stone.json 12c3455bbb7edcea84d47ad6ccde9c209a25d811 data/forge/tags/items/plates.json 23f4874238f7d06e80c699b672d4e9fab6eb464f data/forge/tags/items/plates/brass.json +7f3f85d0978bc274e4689fbf41f7b80b023b7a05 data/forge/tags/items/plates/cardboard.json ef5256892a9d4167bf7371c7138a933a107a123a data/forge/tags/items/plates/copper.json 3ca40ae504b1f68d6e7279726a2bf411509ce322 data/forge/tags/items/plates/gold.json 6f72d5205b399f03e481cee15bd5c085bfe6fe3c data/forge/tags/items/plates/iron.json 07a6e69488ff6994a9ef1cca75b6e911bc3e3358 data/forge/tags/items/plates/obsidian.json 30496416fffaf4f845052a264023e64e52894ee7 data/forge/tags/items/raw_materials.json 30496416fffaf4f845052a264023e64e52894ee7 data/forge/tags/items/raw_materials/zinc.json -b3af02a6fa3dc41bc3f4db933485f22b202deea3 data/forge/tags/items/storage_blocks.json +807ea01d3b028bd226ed0befc142cbd23647e998 data/forge/tags/items/storage_blocks.json 7d10cdf9e46a79753d4437c7bb958e3ab8bf0c89 data/forge/tags/items/storage_blocks/andesite_alloy.json 70bba470740dc7a77f51b4cb1747a105b62d4bde data/forge/tags/items/storage_blocks/brass.json +18f54179c6f809ff4aee792702fa35d3053e5dc4 data/forge/tags/items/storage_blocks/cardboard.json bcd593714f43bc6a0aefbd714c24db3cf9e71250 data/forge/tags/items/storage_blocks/raw_zinc.json 41b2a17b5ebcff5623e25dc6232f73cf9aa70387 data/forge/tags/items/storage_blocks/zinc.json b69fcc7227d44fc000c8ab94524230f55b89aa27 data/forge/tags/items/stripped_logs.json @@ -4295,10 +4810,10 @@ c741ba83b562ae3459d7c4f2db69537f549ea411 data/forge/tags/items/tools/wrench.json 82274e06b6a9f3bfd83c8b59be38dee4a15b8bf3 data/minecraft/tags/blocks/climbable.json 71aef080a900d9e86818cf579438c3d826d6567e data/minecraft/tags/blocks/doors.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/dripstone_replaceable_blocks.json -e3321ff14704c031a2c16953b7e391f4f24dd70b data/minecraft/tags/blocks/impermeable.json +f8bd9b33238ab9f2f2a83b63bf0c52fbf705b452 data/minecraft/tags/blocks/impermeable.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/lush_ground_replaceable.json -5a030817b2322e363edc8f5376f7c9de73df8b48 data/minecraft/tags/blocks/mineable/axe.json -d794a156fdc9ec9e7c935b3b8962206b7b82eb79 data/minecraft/tags/blocks/mineable/pickaxe.json +632b3589bae819777af7129b534f1c10e810cf5d data/minecraft/tags/blocks/mineable/axe.json +47df6c90d9474d7a708063b0207e520ad01f1998 data/minecraft/tags/blocks/mineable/pickaxe.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/moss_replaceable.json 0c13aae0eeb99e89febe8dbe5e002af2ff843a9e data/minecraft/tags/blocks/needs_iron_tool.json 3cb2a92cbdf32ed5978f740dc378d363306c3e84 data/minecraft/tags/blocks/needs_stone_tool.json @@ -4314,5 +4829,6 @@ dafa3bdb72fef5e6c0201c05846db3f2b214e587 data/minecraft/tags/blocks/stairs.json 1ac7c46815461cbec0d4d97f25c085fdc8375dab data/minecraft/tags/items/slabs.json dafa3bdb72fef5e6c0201c05846db3f2b214e587 data/minecraft/tags/items/stairs.json 11427a72e181857e22ec37a22462bc652e127cc5 data/minecraft/tags/items/trapdoors.json +15d3621abbef2048a7c258d410e40d9d87e55dd7 data/minecraft/tags/items/trimmable_armor.json 2bcba05954ff7bc4cf9cc520478083da9973ec76 data/minecraft/tags/items/walls.json 71aef080a900d9e86818cf579438c3d826d6567e data/quark/tags/blocks/non_double_door.json diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index ba3f528b39..0fdc8e2eff 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -2250,6 +2250,22 @@ "create.ponder.redstone_link.text_4": "sʞɔoןq 9ϛᄅ uıɥʇıʍ sɹǝʇʇıɯsuɐɹʇ ɟo ɹǝʍod ǝuoʇspǝɹ ǝɥʇ ʇıɯǝ sɹǝʌıǝɔǝᴚ", "create.ponder.redstone_link.text_5": "ʎɔuǝnbǝɹℲ ɐ ʎɟıɔǝds uɐɔ sʇoןs oʍʇ ǝɥʇ uı sɯǝʇı buıɔɐןԀ", "create.ponder.redstone_link.text_6": "ǝʇɐɔıunɯɯoɔ ןןıʍ sǝıɔuǝnbǝɹℲ buıɥɔʇɐɯ ɥʇıʍ sʞuıן ǝɥʇ ʎןuO", + "create.ponder.redstone_requester.header": "sɹǝʇsǝnbǝᴚ ǝuoʇspǝᴚ ɥʇıʍ sɹǝpɹo pǝʇɐɯoʇnⱯ", + "create.ponder.redstone_requester.text_1": "ʞɹoʍʇǝu sʇı oʇ ʇɔǝuuoɔ oʇ ʇuǝɯǝɔɐןd ǝɹoɟǝq ʞuıן ʞɔoʇS ɐ ʞɔıןɔ-ʇɥbıᴚ", + "create.ponder.redstone_requester.text_2": "ʞɹoʍʇǝu sɔıʇsıboן ǝɥʇ ɯoɹɟ sɯǝʇı ɹǝpɹo uɐɔ sɹǝʇsǝnbǝɹ ǝuoʇspǝᴚ 'sɹǝʞɔıʇ ʞɔoʇS ǝʞıן ʇsnſ", + "create.ponder.redstone_requester.text_3": "I∩ uoıʇɐɹnbıɟuoɔ sʇı uǝdo oʇ ɹǝʇsǝnbǝɹ ǝɥʇ ʞɔıןɔ-ʇɥbıᴚ", + "create.ponder.redstone_requester.text_4": "ǝsןnd ǝuoʇspǝɹ ʎɹǝʌǝ uo pǝʇsǝnbǝɹ ǝq ןןıʍ I∩ ǝɥʇ uı ʇǝs ɹǝpɹo ǝɥ⟘", + "create.ponder.redstone_requester.text_5": "ʇuǝɯǝɔɐןd ǝɹoɟǝq pǝɹnbıɟuoɔ ʎןןnɟ ǝq uɐɔ ɹǝʇsǝnbǝɹ ǝɥʇ 'ʎןǝʌıʇɐuɹǝʇןⱯ", + "create.ponder.redstone_requester.text_6": "ǝɹǝɥʇ ɹǝpɹo pǝɹısǝp ǝɥʇ ʇǝs puɐ ʇı ɥʇıʍ ɹǝdǝǝʞ ʞɔoʇS ɐ ʞɔıןɔ-ʇɥbıᴚ", + "create.ponder.repackager.header": "ʇsǝnbǝɹ ɐ ɯoɹɟ sǝbɐʞɔɐd buıbɹǝW", + "create.ponder.repackager.text_1": "ǝbɐʞɔɐd ǝןbuıs ɐ sɐ ǝʌıɹɹɐ oʇ sʇsǝnbǝɹ ןɐɔıʇsıboן ɹoɟ ןɐıɔnɹɔ sı ʇı 'sǝɯıʇǝɯoS", + "create.ponder.repackager.text_2": "Ɐ ɹǝpɹO", + "create.ponder.repackager.text_3": "ᗺ ɹǝpɹO", + "create.ponder.repackager.text_4": "uǝǝʍʇǝquı ǝʌıɹɹɐ pןnoɔ sǝbɐʞɔɐd ɹǝɥʇo 'ǝsıʍɹǝɥʇO", + "create.ponder.repackager.text_5": "ʎɹoʇuǝʌuı uɐ oʇ sǝbɐʞɔɐd ʇɔǝɹıpǝɹ 'ǝsɐɔ ǝɥʇ sı sıɥʇ uǝɥM", + "create.ponder.repackager.text_6": "ǝuoʇspǝɹ ɥʇıʍ ʇı ɹǝʍod puɐ 'ɹǝbɐʞɔɐd-ǝɹ ɐ ɥɔɐʇʇⱯ", + "create.ponder.repackager.text_7": "ǝbɐʞɔɐd ʍǝu ɐ sɐ pǝʇɹodxǝ ǝq ןןıʍ ʎǝɥʇ 'pǝʌıɹɹɐ sʇuǝɯbɐɹɟ ןןɐ ǝɔuO", + "create.ponder.repackager.text_8": "ɹǝpɹo ǝןqɐʇɔıpǝɹd ɐ uı puɐ ɹǝɥʇǝboʇ ǝʌıɹɹɐ sɯǝʇı pǝʇsǝnbǝɹ 'ʍoN", "create.ponder.rope_pulley.header": "sʎǝןןnԀ ǝdoᴚ buısn sǝɹnʇɔnɹʇS buıʌoW", "create.ponder.rope_pulley.text_1": "ǝɔɹoℲ ןɐuoıʇɐʇoᴚ uǝʌıb uǝɥʍ ʎןןɐɔıʇɹǝʌ sʞɔoןq ǝʌoɯ uɐɔ sʎǝןןnԀ ǝdoᴚ", "create.ponder.rope_pulley.text_2": "ʇnduI ןɐuoıʇɐʇoᴚ ǝɥʇ uo puǝdǝp ʇuǝɯǝʌoɯ ɟo pǝǝdS puɐ uoıʇɔǝɹıᗡ", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 99b6e7fc4a..1bbdff9d06 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -2250,6 +2250,22 @@ "create.ponder.redstone_link.text_4": "Receivers emit the redstone power of transmitters within 256 blocks", "create.ponder.redstone_link.text_5": "Placing items in the two slots can specify a Frequency", "create.ponder.redstone_link.text_6": "Only the links with matching Frequencies will communicate", + "create.ponder.redstone_requester.header": "Automated orders with Redstone Requesters", + "create.ponder.redstone_requester.text_1": "Right-click a Stock link before placement to connect to its network", + "create.ponder.redstone_requester.text_2": "Just like Stock tickers, Redstone requesters can order items from the logistics network", + "create.ponder.redstone_requester.text_3": "Right-click the requester to open its configuration UI", + "create.ponder.redstone_requester.text_4": "The order set in the UI will be requested on every redstone pulse", + "create.ponder.redstone_requester.text_5": "Alternatively, the requester can be fully configured before placement", + "create.ponder.redstone_requester.text_6": "Right-click a Stock keeper with it and set the desired order there", + "create.ponder.repackager.header": "Merging packages from a request", + "create.ponder.repackager.text_1": "Sometimes, it is crucial for logistical requests to arrive as a single package", + "create.ponder.repackager.text_2": "Order A", + "create.ponder.repackager.text_3": "Order B", + "create.ponder.repackager.text_4": "Otherwise, other packages could arrive inbetween", + "create.ponder.repackager.text_5": "When this is the case, redirect packages to an inventory", + "create.ponder.repackager.text_6": "Attach a re-packager, and power it with redstone", + "create.ponder.repackager.text_7": "Once all fragments arrived, they will be exported as a new package", + "create.ponder.repackager.text_8": "Now, requested items arrive together and in a predictable order", "create.ponder.rope_pulley.header": "Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "Rope Pulleys can move blocks vertically when given Rotational Force", "create.ponder.rope_pulley.text_2": "Direction and Speed of movement depend on the Rotational Input", diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderScenes.java index 05e0125015..4522db190a 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderScenes.java @@ -44,6 +44,7 @@ import com.simibubi.create.infrastructure.ponder.scenes.fluid.SpoutScenes; import com.simibubi.create.infrastructure.ponder.scenes.highLogistics.FrogAndConveyorScenes; import com.simibubi.create.infrastructure.ponder.scenes.highLogistics.PackagerScenes; import com.simibubi.create.infrastructure.ponder.scenes.highLogistics.PostboxScenes; +import com.simibubi.create.infrastructure.ponder.scenes.highLogistics.RepackagerScenes; import com.simibubi.create.infrastructure.ponder.scenes.highLogistics.RequesterAndShopScenes; import com.simibubi.create.infrastructure.ponder.scenes.highLogistics.StockLinkScenes; import com.simibubi.create.infrastructure.ponder.scenes.highLogistics.StockTickerScenes; @@ -370,6 +371,8 @@ public class AllCreatePonderScenes { .addStoryBoard("high_logistics/stock_ticker_address", StockTickerScenes::stockTickerAddress); HELPER.forComponents(AllBlocks.REDSTONE_REQUESTER) .addStoryBoard("high_logistics/redstone_requester", RequesterAndShopScenes::requester); + HELPER.forComponents(AllBlocks.REPACKAGER) + .addStoryBoard("high_logistics/repackager", RepackagerScenes::repackager); // Trains HELPER.forComponents(TrackMaterial.allBlocks() diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/RepackagerScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/RepackagerScenes.java new file mode 100644 index 0000000000..276cdc3076 --- /dev/null +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/RepackagerScenes.java @@ -0,0 +1,394 @@ +package com.simibubi.create.infrastructure.ponder.scenes.highLogistics; + +import java.util.List; + +import com.simibubi.create.content.kinetics.crafter.MechanicalCrafterBlockEntity; +import com.simibubi.create.content.logistics.box.PackageItem; +import com.simibubi.create.foundation.ponder.CreateSceneBuilder; + +import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.PonderPalette; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; +import net.createmod.ponder.api.scene.Selection; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.phys.AABB; +import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.ItemHandlerHelper; + +public class RepackagerScenes { + + public static void repackager(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); + scene.title("repackager", "Merging packages from a request"); + scene.configureBasePlate(1, 0, 7); + scene.setSceneOffsetY(-.5f); + scene.showBasePlate(); + + Selection belt2 = util.select() + .fromTo(7, 1, 2, 6, 1, 1); + Selection belt1 = util.select() + .fromTo(1, 1, 2, 4, 1, 1); + Selection belt3 = util.select() + .fromTo(5, 1, 1, 5, 1, 6) + .add(util.select() + .fromTo(6, 1, 5, 6, 1, 6)); + Selection crafterCogs = util.select() + .fromTo(1, 1, 6, 0, 2, 6) + .add(util.select() + .position(0, 2, 5)) + .add(util.select() + .fromTo(1, 1, 7, 2, 0, 7)); + Selection crafter = util.select() + .fromTo(1, 2, 5, 3, 4, 5); + Selection crafterScaff = util.select() + .fromTo(3, 1, 5, 1, 1, 5); + Selection packager = util.select() + .fromTo(4, 1, 5, 4, 2, 5); + BlockPos pack = util.grid() + .at(4, 2, 5); + Selection packFunnel = util.select() + .position(5, 2, 5); + Selection largeCog1 = util.select() + .position(0, 0, 2); + Selection largeCog2 = util.select() + .position(8, 0, 2); + BlockPos funnel1 = util.grid() + .at(4, 2, 1); + BlockPos funnel2 = util.grid() + .at(6, 2, 1); + Selection f3s = util.select() + .position(5, 2, 3); + Selection f2s = util.select() + .position(funnel2); + Selection f1s = util.select() + .position(funnel1); + Selection barrel = util.select() + .position(5, 2, 1); + BlockPos repack = util.grid() + .at(5, 2, 2); + Selection repackS = util.select() + .fromTo(5, 2, 2, 5, 3, 2); + Selection largeCog3 = util.select() + .position(6, 0, 7); + + scene.world() + .multiplyKineticSpeed(util.select() + .everywhere(), 1 / 2f); + + scene.idle(10); + + scene.world() + .showSection(crafterScaff, Direction.NORTH); + scene.idle(3); + scene.world() + .showSection(crafter, Direction.DOWN); + scene.idle(5); + scene.world() + .showSection(packager, Direction.WEST); + scene.world() + .showSection(crafterCogs, Direction.EAST); + scene.idle(5); + + scene.overlay() + .showText(120) + .text("Sometimes, it is crucial for logistical requests to arrive as a single package") + .attachKeyFrame() + .placeNearTarget() + .independent(130); + + scene.idle(90); + scene.world() + .showSection(belt3, Direction.WEST); + scene.world() + .showSection(largeCog3, Direction.UP); + scene.idle(5); + scene.world() + .showSection(belt2, Direction.WEST); + scene.world() + .showSection(largeCog2, Direction.UP); + scene.idle(5); + scene.world() + .showSection(belt1, Direction.EAST); + scene.world() + .showSection(largeCog1, Direction.UP); + scene.world() + .showSection(packFunnel, Direction.DOWN); + scene.idle(20); + + scene.world() + .setBlock(util.grid() + .at(4, 2, 1), Blocks.AIR.defaultBlockState(), false); + scene.world() + .setBlock(util.grid() + .at(6, 2, 1), Blocks.AIR.defaultBlockState(), false); + + ItemStack box1 = PackageItem.containing(List.of()); + ItemStack box2 = PackageItem.containing(List.of()); + ItemStack box3 = PackageItem.containing(List.of()); + scene.world() + .createItemOnBelt(util.grid() + .at(3, 1, 1), Direction.DOWN, box1); + scene.world() + .createItemOnBelt(util.grid() + .at(2, 1, 1), Direction.DOWN, box2); + scene.idle(13); + scene.world() + .createItemOnBelt(util.grid() + .at(7, 1, 1), Direction.DOWN, box3); + scene.idle(3); + scene.world() + .multiplyKineticSpeed(util.select() + .everywhere(), 1 / 16f); + + AABB bb1 = new AABB(util.grid() + .at(2, 2, 1)).deflate(0.125, 0.5, 0.125) + .inflate(0.65, 0, 0) + .move(1.05, -.5, 0); + AABB bb2 = new AABB(util.grid() + .at(7, 2, 1)).deflate(0.125, 0.5, 0.125) + .move(-.25, -.5, 0); + + scene.overlay() + .chaseBoundingBoxOutline(PonderPalette.INPUT, pack, new AABB(bb1.getCenter(), bb1.getCenter()), 1); + scene.overlay() + .chaseBoundingBoxOutline(PonderPalette.OUTPUT, repack, new AABB(bb2.getCenter(), bb2.getCenter()), 1); + scene.idle(1); + scene.overlay() + .chaseBoundingBoxOutline(PonderPalette.INPUT, pack, bb1, 60); + scene.overlay() + .chaseBoundingBoxOutline(PonderPalette.OUTPUT, repack, bb2, 60); + + scene.overlay() + .showText(60) + .text("Order A") + .attachKeyFrame() + .colored(PonderPalette.INPUT) + .pointAt(util.vector() + .of(3, 2, 1.5)) + .placeNearTarget(); + + scene.overlay() + .showText(60) + .text("Order B") + .attachKeyFrame() + .colored(PonderPalette.OUTPUT) + .pointAt(util.vector() + .of(7, 2, 1.5)) + .placeNearTarget(); + scene.idle(60); + + scene.world() + .multiplyKineticSpeed(util.select() + .everywhere(), 24f); + scene.idle(60); + + scene.world() + .multiplyKineticSpeed(util.select() + .everywhere(), 1 / 24f); + + scene.overlay() + .showText(60) + .text("Otherwise, other packages could arrive inbetween") + .attachKeyFrame() + .colored(PonderPalette.RED) + .pointAt(util.vector() + .of(5.5, 2, 3)) + .placeNearTarget(); + scene.idle(60); + + scene.world() + .multiplyKineticSpeed(util.select() + .everywhere(), 16f); + scene.idle(40); + scene.world() + .removeItemsFromBelt(util.grid() + .at(5, 1, 5)); + PonderHilo.packagerUnpack(scene, pack, box1); + scene.idle(15); + insertItemsIntoCrafter(util, scene, new ItemStack(Items.IRON_INGOT, 4)); + scene.idle(15); + scene.world() + .removeItemsFromBelt(util.grid() + .at(5, 1, 5)); + PonderHilo.packagerUnpack(scene, pack, box2); + scene.idle(15); + insertItemsIntoCrafter(util, scene, new ItemStack(Items.OAK_PLANKS, 3)); + scene.idle(15); + + scene.overlay() + .showControls(util.vector() + .blockSurface(util.grid() + .at(2, 3, 5), Direction.NORTH), + Pointing.DOWN, 40) + .withItem(new ItemStack(Items.BARRIER)); + + scene.idle(20); + scene.world() + .modifyBlockEntity(util.grid() + .at(2, 2, 5), MechanicalCrafterBlockEntity.class, be -> be.ejectWholeGrid()); + scene.world() + .removeItemsFromBelt(util.grid() + .at(5, 1, 5)); + + scene.idle(40); + scene.world() + .showSection(barrel, Direction.DOWN); + scene.world() + .showSection(repackS, Direction.NORTH); + scene.rotateCameraY(-15); + scene.idle(15); + + scene.overlay() + .showText(80) + .text("When this is the case, redirect packages to an inventory") + .attachKeyFrame() + .pointAt(util.vector() + .blockSurface(util.grid() + .at(5, 2, 1), Direction.WEST)) + .placeNearTarget(); + scene.idle(90); + + scene.overlay() + .showText(60) + .text("Attach a re-packager, and power it with redstone") + .attachKeyFrame() + .pointAt(util.vector() + .blockSurface(util.grid() + .at(5, 2, 2), Direction.WEST)) + .placeNearTarget(); + scene.idle(40); + + scene.world() + .toggleRedstonePower(repackS); + scene.effects() + .indicateRedstone(util.grid() + .at(5, 3, 2)); + scene.idle(40); + + scene.world() + .restoreBlocks(f1s); + scene.world() + .restoreBlocks(f2s); + scene.world() + .showSection(f1s, Direction.DOWN); + scene.world() + .showSection(f2s, Direction.DOWN); + scene.idle(5); + scene.world() + .showSection(f3s, Direction.DOWN); + scene.idle(20); + + scene.world() + .createItemOnBelt(util.grid() + .at(3, 1, 1), Direction.DOWN, box1); + scene.world() + .createItemOnBelt(util.grid() + .at(1, 1, 1), Direction.DOWN, box2); + scene.world() + .createItemOnBelt(util.grid() + .at(7, 1, 1), Direction.DOWN, box3); + scene.idle(23); + scene.world() + .removeItemsFromBelt(util.grid() + .at(4, 1, 1)); + scene.world() + .removeItemsFromBelt(util.grid() + .at(6, 1, 1)); + scene.world() + .flapFunnel(util.grid() + .at(4, 2, 1), false); + scene.idle(63); + scene.world() + .removeItemsFromBelt(util.grid() + .at(4, 1, 1)); + scene.world() + .flapFunnel(util.grid() + .at(4, 2, 1), false); + scene.idle(3); + + PonderHilo.packagerCreate(scene, repack, box3); + scene.effects() + .indicateSuccess(repack); + scene.idle(20); + + scene.overlay() + .showText(60) + .text("Once all fragments arrived, they will be exported as a new package") + .attachKeyFrame() + .colored(PonderPalette.GREEN) + .pointAt(util.vector() + .of(5.5, 2, 3)) + .placeNearTarget(); + scene.idle(60); + scene.world() + .multiplyKineticSpeed(util.select() + .everywhere(), 2f); + scene.rotateCameraY(15); + scene.world() + .createItemOnBelt(util.grid() + .at(5, 1, 3), Direction.NORTH, box3); + PonderHilo.packagerClear(scene, repack); + scene.idle(20); + PonderHilo.packagerCreate(scene, repack, box3); + scene.idle(20); + scene.world() + .createItemOnBelt(util.grid() + .at(5, 1, 3), Direction.NORTH, box3); + PonderHilo.packagerClear(scene, repack); + scene.world() + .removeItemsFromBelt(util.grid() + .at(5, 1, 5)); + PonderHilo.packagerUnpack(scene, pack, box3); + scene.idle(15); + insertItemsIntoCrafter(util, scene, new ItemStack(Items.IRON_INGOT, 9)); + scene.world() + .setCraftingResult(util.grid() + .at(2, 2, 5), new ItemStack(Items.IRON_BLOCK)); + scene.idle(15); + + scene.overlay() + .showText(120) + .text("Now, requested items arrive together and in a predictable order") + .attachKeyFrame() + .colored(PonderPalette.BLUE) + .pointAt(util.vector() + .blockSurface(util.grid() + .at(2, 3, 5), Direction.NORTH)) + .placeNearTarget(); + + scene.idle(75); + scene.world() + .removeItemsFromBelt(util.grid() + .at(5, 1, 5)); + PonderHilo.packagerUnpack(scene, pack, box3); + scene.idle(15); + insertItemsIntoCrafter(util, scene, new ItemStack(Items.OAK_PLANKS, 3)); + scene.world() + .setCraftingResult(util.grid() + .at(2, 2, 5), new ItemStack(Items.OAK_SLAB)); + scene.idle(20); + scene.world() + .modifyBlockEntity(util.grid() + .at(2, 2, 5), MechanicalCrafterBlockEntity.class, be -> be.checkCompletedRecipe(true)); + } + + private static void insertItemsIntoCrafter(SceneBuildingUtil util, CreateSceneBuilder scene, ItemStack stack) { + scene.world() + .modifyBlockEntity(util.grid() + .at(3, 2, 5), BlockEntity.class, be -> { + IItemHandler handler = be.getCapability(ForgeCapabilities.ITEM_HANDLER) + .orElse(null); + if (handler == null) + return; + ItemHandlerHelper.insertItemStacked(handler, stack, false); + }); + } + +} diff --git a/src/main/resources/assets/create/ponder/high_logistics/repackager.nbt b/src/main/resources/assets/create/ponder/high_logistics/repackager.nbt new file mode 100644 index 0000000000000000000000000000000000000000..038a3ab8bf8c8153a945ea8d08b56ab522f11ff2 GIT binary patch literal 2214 zcmZ{bc{CJ?0*8^Y@4Gif!q~=6*6fnqAi8MA5|J6(*doG=LD@2mWm2NDMcImL-?EOF zcuklYB-t_%qKxI8_s+TRocGSTzyH4P{J!(q98CY&8QsSrnqn>G>&0)j8(M)a+BHQj z_i5^emEW4qBsh92RL&gW=4=r@!d|=ePgI|=SWjfX)7PDBo=3YIxoZl z0YTjA#(gCbhIOR%$th^iEp<6YI80^0$3hEt(5;&k4D5j+Eku zG%RbUe_H3yRe>6pO|dD^_Hqag74J0xDD6qkP9V<2DQ^OfSA8yv@YA@U@{ zU+;eU)Bp7~LLEB5g6|VHFN|9RHztwRe_^LW#s8VV@Y~-e7yd3O2FC>J$UdpQ?@^ykzUdcliE_59@!9L&WPWAxE6uO5)k0q&jhh$0NnTi(ftBAqG-n@X>mTKB;}?ZC zt3^`ZWjQykQ|NgZy|yrMK}x-=LqoPx2d8WJ7M*@#Zx%5<#lF8M2D+2+3EjP1Lj0{+ z9IM%e^coGw*Z9tMz52BkKnJLBAhl)`(~*TfhFqURzG-f~a_KRPzPbk%!@x*Uu^jV@ zA}a#|^PAl{B4*1dD>_<9e{z1cQIs?T3cdMhNA73&ifmY|F8;w z_y)bK+$84oht_@vqT@fppL=ixN z)HefU@ET?mDr+4pof~|a>dy?e_p~2J;Zp~cYRNRpXr3?Orkv)-U!^ zY-h`4vahVDZ^6=%AlOt*L@uWTTkE$>lygji(oGiPyCfArzY-4ea)S8-gBoN<$^wn- z8x^Zoa#+DX;CEuU@c6Gv1zXI*?kLX(H*$nx$MF&^_(+5;rgzaL?sU9B5OZXp=cypENr=byN6UthE0stmiSA@tB8%& z*sF%LlAPbyHOsqWep>_sfD$$iT|T|q0PmYzv>8!LB92w;t&V!-Uu!@m~U@1Y_dOKH3IIY1>`J2_>~Q3W;>$mJ184C z6_V$Lw6~4n5d8t~8fuPd#N{Y~?3aE`EyazW=umNs8mM@&CU!A}ciK5RNG*ml>O&92YCXaz5S(cz!0cFvb^HA|xxd0@S1JNMTN$xK;MAL5h- zA_38ZbvHu3nEHyuE+y#c`h;itrbd5A4H?T-FQmAp9we+iD&AK#12?AJU?iqHFb_9N z>e?RdInsU#R%t~qP$V;h@6NrYJeV!J^Iorwk>k-fkwJ^84fStnK>wcVsL8IcBT+M) zL>5ogt^YLsEaxboe+5hO(*Ee^BBia-Q9OrJxC2lZ*%fUi^3QYGps+33m z`&$U+58@Knxaau!B?^mBveVsb30XBc?T7C#dCg-^t%3$x)UE?>J&V$+HMip!fffV3H#@L~wz;#0 zpnl(8_z*l(x&*m0)8djpi2*gtS&NZ?q#v$;tE!3bFt6{W?%oAR_()%X8z&k?rl4Vv z8|#eH9!?-{#|)o(E_dnjRb4=g+6p^DWa8P|@)^H8HwCr$F8J9hA=zIyWF6|;u^nrd zZB%i3yG{E{-zh%CPN^_HlIyi^Synz7PE z!w;6w$dQ9IRQwW_=4>pWj|o8@cxRPu82X+YhVefnk1n0En~)CCO?#XkTA0Yd!$LdL%H*xR)=B-_!!z6GPA=uKRtGHuMr=}Az5bSzTeC&7H2 zek-OIpj_?I0UFXY;E4hoBxA&(-IDNzUH5#7p=2ICoL@Tsg-T~*aU9UIG41Jxy0d}y z&o?J5ovYf3PhMM%g;s^tROv+pn2)-=LKBvBlR^HA2kVB&@7z1*vsEe4Fe@gee*uXu BJgxu$ literal 0 HcmV?d00001 From d86e3b29fc8f0b126b40f7bda386db1a3f456958 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Wed, 15 Jan 2025 19:24:11 +0100 Subject: [PATCH 308/515] Ponders wonders - Table cloth scene --- .../logistics/tableCloth/TableClothBlock.java | 2 + .../ponder/AllCreatePonderScenes.java | 5 + .../ponder/AllCreatePonderTags.java | 2 +- .../highLogistics/TableClothScenes.java | 372 ++++++++++++++++++ .../ponder/high_logistics/table_cloth.nbt | Bin 0 -> 1625 bytes 5 files changed, 380 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/TableClothScenes.java create mode 100644 src/main/resources/assets/create/ponder/high_logistics/table_cloth.nbt diff --git a/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothBlock.java b/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothBlock.java index c1dd242aea..68fc50d30d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothBlock.java @@ -90,6 +90,8 @@ public class TableClothBlock extends Block implements IHaveBigOutline, IWrenchab BlockHitResult ray) { if (ray.getDirection() == Direction.DOWN) return InteractionResult.PASS; + if (world.isClientSide) + return InteractionResult.SUCCESS; ItemStack heldItem = player.getItemInHand(hand); boolean shiftKeyDown = player.isShiftKeyDown(); diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderScenes.java index 4522db190a..2bfee75de7 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderScenes.java @@ -48,6 +48,7 @@ import com.simibubi.create.infrastructure.ponder.scenes.highLogistics.Repackager import com.simibubi.create.infrastructure.ponder.scenes.highLogistics.RequesterAndShopScenes; import com.simibubi.create.infrastructure.ponder.scenes.highLogistics.StockLinkScenes; import com.simibubi.create.infrastructure.ponder.scenes.highLogistics.StockTickerScenes; +import com.simibubi.create.infrastructure.ponder.scenes.highLogistics.TableClothScenes; import com.simibubi.create.infrastructure.ponder.scenes.trains.TrackObserverScenes; import com.simibubi.create.infrastructure.ponder.scenes.trains.TrackScenes; import com.simibubi.create.infrastructure.ponder.scenes.trains.TrainScenes; @@ -373,6 +374,10 @@ public class AllCreatePonderScenes { .addStoryBoard("high_logistics/redstone_requester", RequesterAndShopScenes::requester); HELPER.forComponents(AllBlocks.REPACKAGER) .addStoryBoard("high_logistics/repackager", RepackagerScenes::repackager); + HELPER.forComponents(AllBlocks.TABLE_CLOTHS.toArray()) + .addStoryBoard("high_logistics/table_cloth", TableClothScenes::tableCloth); + HELPER.forComponents(AllBlocks.ANDESITE_TABLE_CLOTH, AllBlocks.BRASS_TABLE_CLOTH, AllBlocks.COPPER_TABLE_CLOTH) + .addStoryBoard("high_logistics/table_cloth", TableClothScenes::tableCloth); // Trains HELPER.forComponents(TrackMaterial.allBlocks() diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderTags.java b/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderTags.java index 1c21c061a2..5053be90ef 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderTags.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderTags.java @@ -361,7 +361,7 @@ public class AllCreatePonderTags { .add(AllBlocks.STOCK_LINK) .add(AllBlocks.STOCK_TICKER) .add(AllBlocks.REDSTONE_REQUESTER) - .add(AllBlocks.TABLE_CLOTHS.get(DyeColor.WHITE)) + .add(AllBlocks.TABLE_CLOTHS.get(DyeColor.RED)) .add(AllBlocks.FACTORY_GAUGE) .add(AllBlocks.REPACKAGER) .add(AllItems.PACKAGE_FILTER); diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/TableClothScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/TableClothScenes.java new file mode 100644 index 0000000000..d95afedb5c --- /dev/null +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/TableClothScenes.java @@ -0,0 +1,372 @@ +package com.simibubi.create.infrastructure.ponder.scenes.highLogistics; + +import java.util.List; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllItems; +import com.simibubi.create.content.logistics.BigItemStack; +import com.simibubi.create.content.logistics.box.PackageItem; +import com.simibubi.create.content.logistics.redstoneRequester.AutoRequestData; +import com.simibubi.create.content.logistics.stockTicker.PackageOrder; +import com.simibubi.create.content.logistics.tableCloth.TableClothBlock; +import com.simibubi.create.content.logistics.tableCloth.TableClothBlockEntity; +import com.simibubi.create.foundation.ponder.CreateSceneBuilder; + +import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.PonderPalette; +import net.createmod.ponder.api.element.ParrotPose.FacePointOfInterestPose; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; +import net.createmod.ponder.api.scene.Selection; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; + +public class TableClothScenes { + + public static void tableCloth(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); + scene.title("table_cloth", "Selling items with Table Cloths"); + scene.configureBasePlate(0, 0, 7); + scene.scaleSceneView(0.925f); + scene.setSceneOffsetY(-0.5f); + scene.showBasePlate(); + + Selection initialCloth = util.select() + .fromTo(3, 1, 3, 3, 2, 3); + Selection scaff1 = util.select() + .position(5, 1, 1); + Selection cloth1 = util.select() + .position(5, 2, 1); + Selection vault = util.select() + .fromTo(4, 1, 4, 3, 3, 5); + Selection packScaff = util.select() + .position(2, 1, 4); + BlockPos pack = util.grid() + .at(2, 2, 4); + Selection packager = util.select() + .position(2, 2, 4); + BlockPos link = util.grid() + .at(2, 3, 4); + Selection linkS = util.select() + .position(2, 3, 4); + Selection funnel = util.select() + .position(1, 2, 4); + Selection belt = util.select() + .fromTo(1, 1, 5, 1, 1, 0); + Selection largeCog = util.select() + .position(2, 0, 7); + Selection cogs = util.select() + .fromTo(2, 1, 5, 2, 1, 6); + Selection ticker = util.select() + .position(3, 1, 1); + Selection seat = util.select() + .position(3, 1, 2); + + scene.idle(10); + + scene.world() + .showSection(initialCloth, Direction.DOWN); + scene.idle(15); + + ItemStack grass = new ItemStack(Items.OAK_LOG); + scene.overlay() + .showControls(util.vector() + .centerOf(3, 2, 3), Pointing.DOWN, 50) + .rightClick() + .withItem(grass); + + scene.idle(7); + scene.effects() + .indicateSuccess(util.grid() + .at(3, 2, 3)); + scene.world() + .cycleBlockProperty(util.grid() + .at(3, 2, 3), TableClothBlock.HAS_BE); + scene.world() + .modifyBlockEntity(util.grid() + .at(3, 2, 3), TableClothBlockEntity.class, be -> be.manuallyAddedItems.add(grass)); + scene.idle(10); + + scene.overlay() + .showText(60) + .text("Table cloths can be used to display items") + .attachKeyFrame() + .pointAt(util.vector() + .topOf(3, 1, 3)) + .placeNearTarget(); + scene.idle(70); + + scene.effects() + .indicateSuccess(util.grid() + .at(3, 2, 3)); + scene.world() + .modifyBlockEntity(util.grid() + .at(3, 2, 3), TableClothBlockEntity.class, be -> { + AutoRequestData d = new AutoRequestData(); + d.encodedRequest = new PackageOrder(List.of(new BigItemStack(grass))); + d.isValid = true; + be.requestData = d; + be.priceTag.setFilter(new ItemStack(Items.DIAMOND)); + be.priceTag.count = 1; + be.facing = Direction.NORTH; + }); + + scene.overlay() + .showText(100) + .text("With the help of a logistics system, they can also be used to sell items") + .attachKeyFrame() + .pointAt(util.vector() + .of(3, 1.75, 3)) + .placeNearTarget(); + scene.idle(110); + + scene.world() + .hideSection(initialCloth, Direction.UP); + scene.idle(20); + scene.world() + .showSection(vault, Direction.NORTH); + scene.world() + .showSection(packScaff, Direction.NORTH); + scene.idle(10); + scene.world() + .showSection(packager, Direction.EAST); + scene.idle(10); + scene.world() + .showSection(linkS, Direction.DOWN); + + scene.overlay() + .showOutlineWithText(util.select() + .fromTo(3, 2, 4, 4, 3, 5), 100) + .text("Start with the shop's inventory, a Packager and Stock link") + .attachKeyFrame() + .colored(PonderPalette.BLUE) + .pointAt(util.vector() + .of(2, 3, 4)) + .placeNearTarget(); + scene.idle(110); + + ItemStack tickerItem = AllBlocks.STOCK_TICKER.asStack(); + scene.overlay() + .showControls(util.vector() + .centerOf(2, 3, 4), Pointing.DOWN, 80) + .rightClick() + .withItem(tickerItem); + scene.idle(5); + + AABB bb1 = new AABB(link); + scene.overlay() + .chaseBoundingBoxOutline(PonderPalette.BLUE, link, bb1.deflate(0.45), 10); + scene.idle(1); + bb1 = bb1.deflate(1 / 16f) + .contract(0, 8 / 16f, 0); + scene.overlay() + .chaseBoundingBoxOutline(PonderPalette.BLUE, link, bb1, 50); + scene.idle(26); + + scene.overlay() + .showText(80) + .text("Bind a Stock ticker to the link and place it in the shop") + .attachKeyFrame() + .colored(PonderPalette.BLUE) + .pointAt(util.vector() + .centerOf(link)) + .placeNearTarget(); + scene.idle(70); + + scene.world() + .showSection(ticker, Direction.DOWN); + scene.idle(10); + scene.world() + .showSection(seat, Direction.NORTH); + scene.idle(10); + scene.special() + .createBirb(util.vector() + .centerOf(util.grid() + .at(3, 1, 2)), + FacePointOfInterestPose::new); + scene.idle(20); + + scene.overlay() + .showText(90) + .text("Employ a mob or blaze burner as the shop keeper") + .attachKeyFrame() + .pointAt(util.vector() + .of(2.5, 2.75, 1.5)) + .placeNearTarget(); + scene.idle(100); + + ItemStack logItem1 = new ItemStack(Items.OAK_LOG); + ItemStack logItem2 = new ItemStack(Items.BIRCH_LOG); + scene.overlay() + .showControls(util.vector() + .of(5, 3.5, 4), Pointing.RIGHT, 80) + .withItem(logItem1); + scene.overlay() + .showControls(util.vector() + .of(5, 2, 4), Pointing.RIGHT, 80) + .withItem(logItem2); + scene.idle(10); + + scene.overlay() + .showText(70) + .text("Fill the shop inventory with items to be sold") + .attachKeyFrame() + .pointAt(util.vector() + .of(4, 3, 4)) + .placeNearTarget(); + scene.idle(80); + + ItemStack clothItem = AllBlocks.TABLE_CLOTHS.get(DyeColor.LIGHT_GRAY) + .asStack(); + scene.overlay() + .showControls(util.vector() + .of(3, 3, 1.75), Pointing.DOWN, 120) + .rightClick() + .withItem(clothItem); + scene.idle(30); + + scene.overlay() + .showText(100) + .text("To create a new trade, interact with the shop keeper while holding a table cloth") + .attachKeyFrame() + .pointAt(util.vector() + .of(2.5, 2.75, 1.5)) + .placeNearTarget(); + scene.idle(100); + + scene.world() + .cycleBlockProperty(util.grid() + .at(5, 2, 1), TableClothBlock.HAS_BE); + scene.world() + .modifyBlockEntity(util.grid() + .at(5, 2, 1), TableClothBlockEntity.class, be -> { + AutoRequestData d = new AutoRequestData(); + d.encodedRequest = new PackageOrder(List.of(new BigItemStack(logItem1))); + d.isValid = true; + be.requestData = d; + be.facing = Direction.NORTH; + }); + + scene.world() + .showSection(scaff1, Direction.DOWN); + scene.idle(10); + scene.world() + .showSection(cloth1, Direction.DOWN); + scene.idle(20); + + ItemStack diamondItem = new ItemStack(Items.DIAMOND); + Vec3 filterSlot = util.vector() + .of(5.25, 1.825, 1); + scene.overlay() + .showControls(filterSlot, Pointing.DOWN, 120) + .rightClick() + .withItem(diamondItem); + scene.idle(5); + scene.world() + .setFilterData(util.select() + .position(5, 2, 1), TableClothBlockEntity.class, diamondItem); + scene.idle(15); + + scene.overlay() + .showText(90) + .text("Once placed, set a price in the item slot on the side") + .attachKeyFrame() + .pointAt(filterSlot) + .placeNearTarget(); + scene.idle(120); + + scene.overlay() + .showControls(util.vector() + .centerOf(util.grid() + .at(5, 2, 1)), + Pointing.DOWN, 90) + .rightClick(); + scene.idle(10); + + scene.overlay() + .showText(90) + .text("Other players can now interact with the shop") + .attachKeyFrame() + .pointAt(util.vector() + .of(5, 2, 1.5)) + .placeNearTarget(); + scene.idle(100); + + ItemStack listItem = AllItems.SHOPPING_LIST.asStack(); + scene.overlay() + .showControls(util.vector() + .of(3, 3, 1.75), Pointing.DOWN, 90) + .rightClick() + .withItem(listItem); + scene.idle(5); + scene.effects() + .indicateSuccess(util.grid() + .at(3, 1, 1)); + PonderHilo.linkEffect(scene, link); + ItemStack box = PackageItem.containing(List.of()); + PonderHilo.packagerCreate(scene, pack, box); + scene.idle(30); + + scene.overlay() + .showText(120) + .text("When checking out at the cashier, the bought items will be placed into a package") + .attachKeyFrame() + .pointAt(util.vector() + .of(2.5, 2.5, 4)) + .placeNearTarget(); + scene.idle(100); + + scene.world() + .showSection(largeCog, Direction.UP); + scene.idle(3); + scene.world() + .showSection(cogs, Direction.DOWN); + scene.idle(3); + scene.world() + .showSection(belt, Direction.EAST); + scene.idle(5); + scene.world() + .showSection(funnel, Direction.DOWN); + scene.idle(15); + scene.world() + .createItemOnBelt(util.grid() + .at(1, 1, 4), Direction.EAST, box); + PonderHilo.packagerClear(scene, pack); + scene.idle(45); + + scene.overlay() + .showText(90) + .text("From there, they can be transported to the shop front") + .attachKeyFrame() + .pointAt(util.vector() + .of(1, 2.5, 1.5)) + .placeNearTarget(); + scene.idle(100); + + scene.overlay() + .showControls(util.vector() + .topOf(util.grid() + .at(3, 1, 1)), + Pointing.DOWN, 100) + .rightClick() + .withItem(diamondItem); + scene.idle(10); + + scene.overlay() + .showText(90) + .text("The payments will be stored inside the stock ticker block") + .attachKeyFrame() + .pointAt(util.vector() + .centerOf(util.grid() + .at(3, 1, 1))) + .placeNearTarget(); + scene.idle(100); + + } + +} diff --git a/src/main/resources/assets/create/ponder/high_logistics/table_cloth.nbt b/src/main/resources/assets/create/ponder/high_logistics/table_cloth.nbt new file mode 100644 index 0000000000000000000000000000000000000000..e6fb0dfd735b7b6df6e269c73f957d77b62ced2a GIT binary patch literal 1625 zcmZupdpr}00%pQY^NO9c&GUGS#j*~eaGj#%(FqaKJQl|dGk15GGcg>_*)l~VDe_oH z+&0V{w$?l@+Ci)$$-K_;HkC&Rr+fdo{c*qF_xpX{_xpX{XGjAo{1^NE!TosX8Qt>r z^e#h8;je*}kF*Rex)ej)fa?li)OeJuqA_7{ zB4e`SrdRB~%3kKVGBH%1zf2#Q@o|-$ZiJ0JO_gs-<^6XZNO})INhv9XuYtx}m#Dc) zj3njT7^J(lPX3=*?&WtW+ z2Ev)qU%KSjut?JFwhDh3Aj%ID<@<~BLq+*99DngIVJ%fC^KrfIYJNuvG3apN3Mfhv z7UA8-SnLe<{G!%$Omfb#`N#h&C4=U^N?%R*%3mLRHGBg2KQ}=oXDCuhq^)cX>@^cL zyJYJ{8^4p)p#B;${l|CVWdPC_UcOxgD3JgL%#M;AdVDb-zti-0%BVGQmg?CgwH$J% zx+WN>#LOSjRuZ?_Sd9>!e1YRZ=&b<0%!aJuJt+)3q;DqK8@<01Jf4@<7 zEp)_YzHwe%nw`O1ATm%oeTzCTZU?8QBN`Z%W_Z1`&(=KZPd+Uw%C|I|1yy&s7$6${ zW7Vs>950`%k15hwd+FylO5dC`@fqa+-YL)52$5V#1?=%i8jhx{1(Y;xilcD&?Tp9o zaB`rg^S!;X)ZBXmtt`Uc+*YE!!Qic?;?7ojAe6q8!+kzA>9ZT!3x{_!7A-2^{aM2E zwZ^k{rr2k<_TNj^cdnZS@q`onT{)iZ`q`-FGqn==+eAEI%qBvQ%hRT|UqY)8j}R5$ zkwxt0=XvKVI8+sbjf#y=-}=XB>PAS%&$~WhHm$~Sd7X)Uq1mqxHvmp~{&=YjrITG# z9Yih&E}vrlp7Fiq-&=fl8VZ=j{;$cl6s52}2<`%Jo8WDt?l@8iFWsb^!Ccd@*0)tp zT@=3cSZ(9!|D)r;OYk_hYqpCF+u#6W1xmHD*xHx8PSVLhHr4m1Hx`sTo=<6GxVDNw zv=p8d5lsaTh}_WQlme^turN@&){a8HekVI|gb2E#yKjSDm4 zp}m2RUd7_S`E+2A#)3x2`W+r^NU>A5&OQ>mG9`>lE7Y*hEDyQlNe0&Cf~EwB?5%(p z=e4+m``;S1B)YNT9)(q!y^dUWvRjY0aZg3TLPsF@HdK4#f$Krpt<9i4{>Q=e&4uSJ z6Fc)O(1~=rSGV@}c8l59uR Date: Wed, 15 Jan 2025 19:09:35 -0500 Subject: [PATCH 309/515] Can't do that. - Mark unmodifiable views with the annotation --- .../kinetics/fan/processing/FanProcessingTypeRegistry.java | 4 ++++ .../kinetics/mechanicalArm/ArmInteractionPointType.java | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/src/main/java/com/simibubi/create/content/kinetics/fan/processing/FanProcessingTypeRegistry.java b/src/main/java/com/simibubi/create/content/kinetics/fan/processing/FanProcessingTypeRegistry.java index 284fb08ed5..5bdeb86fc1 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/fan/processing/FanProcessingTypeRegistry.java +++ b/src/main/java/com/simibubi/create/content/kinetics/fan/processing/FanProcessingTypeRegistry.java @@ -7,10 +7,14 @@ import com.simibubi.create.AllRegistries; import it.unimi.dsi.fastutil.objects.ReferenceArrayList; +import org.jetbrains.annotations.UnmodifiableView; + public class FanProcessingTypeRegistry { private static List sortedTypes = null; + @UnmodifiableView private static List sortedTypesView = null; + @UnmodifiableView public static List getSortedTypesView() { if (sortedTypes == null) { sortedTypes = new ReferenceArrayList<>(); diff --git a/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmInteractionPointType.java b/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmInteractionPointType.java index 858eb62c56..677cef13ad 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmInteractionPointType.java +++ b/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmInteractionPointType.java @@ -13,14 +13,18 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.UnmodifiableView; + public abstract class ArmInteractionPointType { private static List sortedTypes = null; + @UnmodifiableView private static List sortedTypesView = null; public static void forEach(Consumer action) { getSorted().forEach(action); } + @UnmodifiableView public static List getSorted() { if (sortedTypes == null) { sortedTypes = new ReferenceArrayList<>(); From 9be39b7f3b0567388901ef926c717ea3f34649bf Mon Sep 17 00:00:00 2001 From: IThundxr Date: Thu, 16 Jan 2025 12:28:44 -0500 Subject: [PATCH 310/515] Moving On II --- changelog.md | 2 +- gradle.properties | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/changelog.md b/changelog.md index b0ff6ea59a..1a220b8f48 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,5 @@ ------------------------------------------------------ -Create 0.5.2 +Create 6.0.0 ------------------------------------------------------ Additions - Example diff --git a/gradle.properties b/gradle.properties index 16c33ca7cb..3683163f44 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,8 +7,8 @@ org.gradle.caching = true # mod version info # build_info_mod_version is the version that gets filled into CreateBuildInfo.java -mod_version = 0.5.2 -build_info_mod_version = 0.5.2-experimental +mod_version = 6.0.0 +build_info_mod_version = 6.0.0-experimental artifact_minecraft_version = 1.20.1 minecraft_version = 1.20.1 From efedee7d486100eecebfaba3c30cd5ef81544e7c Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Thu, 16 Jan 2025 12:18:35 -0800 Subject: [PATCH 311/515] Confused diffuse - Fix bottom of chain conveyor guards not matching the bottom of chain conveyors - Bump flywheel build, add vanillin at runtime --- build.gradle | 1 + gradle.properties | 2 +- .../elevator/ElevatorPulleyVisual.java | 8 ++-- .../chainConveyor/ChainConveyorVisual.java | 3 +- .../content/trains/track/TrackVisual.java | 8 ++-- .../foundation/render/ShaderLightPartial.java | 38 ------------------ .../foundation/render/SpecialModels.java | 40 +++++++++++++++++++ 7 files changed, 52 insertions(+), 48 deletions(-) delete mode 100644 src/main/java/com/simibubi/create/foundation/render/ShaderLightPartial.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/SpecialModels.java diff --git a/build.gradle b/build.gradle index 643dabec5f..54b988da43 100644 --- a/build.gradle +++ b/build.gradle @@ -191,6 +191,7 @@ dependencies { modCompileOnly("dev.engine_room.flywheel:flywheel-forge-api-${flywheel_minecraft_version}:${flywheel_version}") modRuntimeOnly("dev.engine_room.flywheel:flywheel-forge-${flywheel_minecraft_version}:${flywheel_version}") + modRuntimeOnly("dev.engine_room.vanillin:vanillin-forge-${flywheel_minecraft_version}:${flywheel_version}") if (catnipInWorkspace) { implementation project(":catnip:Common") diff --git a/gradle.properties b/gradle.properties index 3683163f44..70fbefaba0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -22,7 +22,7 @@ use_parchment = true # dependency versions registrate_version = MC1.20-1.3.3 flywheel_minecraft_version = 1.20.1 -flywheel_version = 1.0.0-beta-177 +flywheel_version = 1.0.0-beta-182 jei_minecraft_version = 1.20.1 jei_version = 15.10.0.39 curios_minecraft_version = 1.20.1 diff --git a/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorPulleyVisual.java b/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorPulleyVisual.java index 5678ab1470..ee76dec47f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorPulleyVisual.java +++ b/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorPulleyVisual.java @@ -11,7 +11,7 @@ import com.simibubi.create.content.contraptions.pulley.PulleyRenderer; import com.simibubi.create.content.kinetics.base.ShaftVisual; import com.simibubi.create.content.processing.burner.ScrollInstance; import com.simibubi.create.foundation.render.AllInstanceTypes; -import com.simibubi.create.foundation.render.ShaderLightPartial; +import com.simibubi.create.foundation.render.SpecialModels; import dev.engine_room.flywheel.api.visual.DynamicVisual; import dev.engine_room.flywheel.api.visual.ShaderLightVisual; @@ -54,13 +54,13 @@ public class ElevatorPulleyVisual extends ShaftVisual topSection = SectionPos.of(pos).asLong(); belt = new InstanceRecycler<>(() -> context.instancerProvider() - .instancer(AllInstanceTypes.SCROLLING, ShaderLightPartial.flat(AllPartialModels.ELEVATOR_BELT)) + .instancer(AllInstanceTypes.SCROLLING, SpecialModels.flatLit(AllPartialModels.ELEVATOR_BELT)) .createInstance() .rotation(rotation) .setSpriteShift(AllSpriteShifts.ELEVATOR_BELT)); halfBelt = context.instancerProvider() - .instancer(AllInstanceTypes.SCROLLING, ShaderLightPartial.flat(AllPartialModels.ELEVATOR_BELT_HALF)) + .instancer(AllInstanceTypes.SCROLLING, SpecialModels.flatLit(AllPartialModels.ELEVATOR_BELT_HALF)) .createInstance() .rotation(rotation) .setSpriteShift(AllSpriteShifts.ELEVATOR_BELT); @@ -75,7 +75,7 @@ public class ElevatorPulleyVisual extends ShaftVisual coil.setChanged(); magnet = context.instancerProvider() - .instancer(InstanceTypes.TRANSFORMED, ShaderLightPartial.flat(AllPartialModels.ELEVATOR_MAGNET)) + .instancer(InstanceTypes.TRANSFORMED, SpecialModels.flatLit(AllPartialModels.ELEVATOR_MAGNET)) .createInstance(); // Cache the magnet's transform to avoid recalculating this unchanging bit every frame diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorVisual.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorVisual.java index b3aca74516..431792846b 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorVisual.java @@ -7,6 +7,7 @@ import java.util.Map; import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.kinetics.base.SingleRotatingVisual; import com.simibubi.create.content.logistics.box.PackageItem; +import com.simibubi.create.foundation.render.SpecialModels; import dev.engine_room.flywheel.api.model.Model; import dev.engine_room.flywheel.api.visual.DynamicVisual; @@ -147,7 +148,7 @@ public class ChainConveyorVisual extends SingleRotatingVisual imp TrackMaterial.TrackModelHolder modelHolder = bc.getMaterial().getModelHolder(); - instancerProvider().instancer(InstanceTypes.TRANSFORMED, ShaderLightPartial.flat(modelHolder.tie())) + instancerProvider().instancer(InstanceTypes.TRANSFORMED, SpecialModels.flatChunk(modelHolder.tie())) .createInstances(ties); - instancerProvider().instancer(InstanceTypes.TRANSFORMED, ShaderLightPartial.flat(modelHolder.leftSegment())) + instancerProvider().instancer(InstanceTypes.TRANSFORMED, SpecialModels.flatChunk(modelHolder.leftSegment())) .createInstances(left); - instancerProvider().instancer(InstanceTypes.TRANSFORMED, ShaderLightPartial.flat(modelHolder.rightSegment())) + instancerProvider().instancer(InstanceTypes.TRANSFORMED, SpecialModels.flatChunk(modelHolder.rightSegment())) .createInstances(right); SegmentAngles[] segments = bc.getBakedSegments(); diff --git a/src/main/java/com/simibubi/create/foundation/render/ShaderLightPartial.java b/src/main/java/com/simibubi/create/foundation/render/ShaderLightPartial.java deleted file mode 100644 index c71e136447..0000000000 --- a/src/main/java/com/simibubi/create/foundation/render/ShaderLightPartial.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.simibubi.create.foundation.render; - -import org.jetbrains.annotations.Nullable; - -import dev.engine_room.flywheel.api.material.LightShader; -import dev.engine_room.flywheel.api.model.Model; -import dev.engine_room.flywheel.lib.material.LightShaders; -import dev.engine_room.flywheel.lib.material.SimpleMaterial; -import dev.engine_room.flywheel.lib.model.ModelUtil; -import dev.engine_room.flywheel.lib.model.baked.BakedModelBuilder; -import dev.engine_room.flywheel.lib.model.baked.PartialModel; -import dev.engine_room.flywheel.lib.util.RendererReloadCache; -import net.minecraft.client.renderer.RenderType; - -public class ShaderLightPartial { - private static final RendererReloadCache FLAT = new RendererReloadCache<>(it -> BakedModelBuilder.create(it.get()) - .materialFunc((renderType, aBoolean) -> getMaterial(renderType, aBoolean, LightShaders.FLAT)) - .build()); - - private static final RendererReloadCache SMOOTH = new RendererReloadCache<>(it -> BakedModelBuilder.create(it.get()) - .materialFunc((renderType, aBoolean) -> getMaterial(renderType, aBoolean, LightShaders.SMOOTH)) - .build()); - - public static Model flat(PartialModel partial) { - return FLAT.get(partial); - } - - @Nullable - private static SimpleMaterial getMaterial(RenderType renderType, Boolean aBoolean, LightShader lightShader) { - var material = ModelUtil.getMaterial(renderType, aBoolean); - if (material == null) { - return null; - } - return SimpleMaterial.builderOf(material) - .light(lightShader) - .build(); - } -} diff --git a/src/main/java/com/simibubi/create/foundation/render/SpecialModels.java b/src/main/java/com/simibubi/create/foundation/render/SpecialModels.java new file mode 100644 index 0000000000..145aa3d2b5 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/SpecialModels.java @@ -0,0 +1,40 @@ +package com.simibubi.create.foundation.render; + +import dev.engine_room.flywheel.api.material.CardinalLightingMode; +import dev.engine_room.flywheel.api.material.LightShader; +import dev.engine_room.flywheel.api.model.Model; +import dev.engine_room.flywheel.lib.material.LightShaders; +import dev.engine_room.flywheel.lib.material.SimpleMaterial; +import dev.engine_room.flywheel.lib.model.ModelUtil; +import dev.engine_room.flywheel.lib.model.baked.BakedModelBuilder; +import dev.engine_room.flywheel.lib.model.baked.PartialModel; +import dev.engine_room.flywheel.lib.util.RendererReloadCache; + +public class SpecialModels { + private static final RendererReloadCache FLAT = new RendererReloadCache<>(it -> BakedModelBuilder.create(it.partial.get()) + .materialFunc((renderType, aBoolean) -> { + var material = ModelUtil.getMaterial(renderType, aBoolean); + if (material == null) { + return null; + } + return SimpleMaterial.builderOf(material) + .light(it.light) + .cardinalLightingMode(it.cardinalLightingMode) + .build(); + }) + .build()); + + public static Model flatLit(PartialModel partial) { + return FLAT.get(new Key(partial, LightShaders.FLAT, CardinalLightingMode.ENTITY)); + } + + public static Model flatChunk(PartialModel partial) { + return FLAT.get(new Key(partial, LightShaders.FLAT, CardinalLightingMode.CHUNK)); + } + + public static Model chunkDiffuse(PartialModel partial) { + return FLAT.get(new Key(partial, LightShaders.SMOOTH_WHEN_EMBEDDED, CardinalLightingMode.CHUNK)); + } + + private record Key(PartialModel partial, LightShader light, CardinalLightingMode cardinalLightingMode) {} +} From f3f46827f1312b9c19054476595f22ab358011a9 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Thu, 16 Jan 2025 15:47:45 -0500 Subject: [PATCH 312/515] Arts and crafts II - Hook up recipe for trimming cardboard armor --- .../foundation/mixin/SmithingMenuMixin.java | 26 +++++++++++++++++++ src/main/resources/create.mixins.json | 1 + 2 files changed, 27 insertions(+) create mode 100644 src/main/java/com/simibubi/create/foundation/mixin/SmithingMenuMixin.java diff --git a/src/main/java/com/simibubi/create/foundation/mixin/SmithingMenuMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/SmithingMenuMixin.java new file mode 100644 index 0000000000..016513710f --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/mixin/SmithingMenuMixin.java @@ -0,0 +1,26 @@ +package com.simibubi.create.foundation.mixin; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.simibubi.create.AllItems; +import com.simibubi.create.foundation.advancement.AllAdvancements; + +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.SmithingMenu; +import net.minecraft.world.item.ItemStack; + +@Mixin(SmithingMenu.class) +public class SmithingMenuMixin { + @Inject(method = "onTake", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/inventory/ResultContainer;awardUsedRecipes(Lnet/minecraft/world/entity/player/Player;Ljava/util/List;)V")) + private void create$awardAdvancementWhenTrimmingCardboardArmor(Player player, ItemStack stack, CallbackInfo ci) { + if (AllItems.CARDBOARD_HELMET.isIn(stack) || + AllItems.CARDBOARD_CHESTPLATE.isIn(stack) || + AllItems.CARDBOARD_LEGGINGS.isIn(stack) || + AllItems.CARDBOARD_BOOTS.isIn(stack)) { + AllAdvancements.CARDBOARD_ARMOR_TRIM.awardTo(player); + } + } +} diff --git a/src/main/resources/create.mixins.json b/src/main/resources/create.mixins.json index be11df5569..0859c48e82 100644 --- a/src/main/resources/create.mixins.json +++ b/src/main/resources/create.mixins.json @@ -17,6 +17,7 @@ "MainMixin", "MapItemSavedDataMixin", "ShulkerBoxBlockMixin", + "SmithingMenuMixin", "TestCommandMixin", "WaterWheelFluidSpreadMixin", "accessor.AbstractProjectileDispenseBehaviorAccessor", From a1bcf6be5fa9a2838859833ffb070324bf9ee97c Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 17 Jan 2025 00:11:12 +0100 Subject: [PATCH 313/515] Final thoughts - Ponder scenes for the factory gauge --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 6 +- .../resources/assets/create/lang/en_ud.json | 59 + .../resources/assets/create/lang/en_us.json | 59 + .../factoryBoard/FactoryPanelBehaviour.java | 17 +- .../factoryBoard/FactoryPanelModel.java | 11 +- .../ponder/AllCreatePonderScenes.java | 6 + .../highLogistics/FactoryGaugeScenes.java | 1523 +++++++++++++++++ .../high_logistics/factory_gauge_crafting.nbt | Bin 0 -> 2705 bytes .../high_logistics/factory_gauge_links.nbt | Bin 0 -> 965 bytes .../high_logistics/factory_gauge_recipe.nbt | Bin 0 -> 3715 bytes .../factory_gauge_restocker.nbt | Bin 0 -> 1814 bytes 11 files changed, 1668 insertions(+), 13 deletions(-) create mode 100644 src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/FactoryGaugeScenes.java create mode 100644 src/main/resources/assets/create/ponder/high_logistics/factory_gauge_crafting.nbt create mode 100644 src/main/resources/assets/create/ponder/high_logistics/factory_gauge_links.nbt create mode 100644 src/main/resources/assets/create/ponder/high_logistics/factory_gauge_recipe.nbt create mode 100644 src/main/resources/assets/create/ponder/high_logistics/factory_gauge_restocker.nbt diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index dd7351f072..386a902547 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2025-01-15T16:45:15.2390714 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2025-01-17T00:09:44.5040448 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -642,8 +642,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -1b28037b123722878569af7d483dcfb0af78c701 assets/create/lang/en_ud.json -2e3d21019ffd681d9368f702f037e814d6b8aadb assets/create/lang/en_us.json +7c975eddc8318d59bb77fa5667d4358f1bd168c5 assets/create/lang/en_ud.json +5bb378436e68d5a1428ac801c3bc5a4443f8b657 assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 0fdc8e2eff..30c8d32388 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -1851,6 +1851,52 @@ "create.ponder.encased_fluid_pipe.text_1": "sǝdıԀ pınןℲ ǝʇɐɹoɔǝp oʇ pǝsn ǝq uɐɔ buısɐƆ ɹǝddoƆ", "create.ponder.encased_fluid_pipe.text_2": "ǝʇɐʇs ʎʇıʌıʇɔǝuuoɔ ɹıǝɥʇ oʇuı pǝʞɔoן ǝɹɐ sǝdıԀ pǝsɐɔuƎ 'pǝןɐǝɔuoɔ buıǝq ɯoɹɟ ǝpısⱯ", "create.ponder.encased_fluid_pipe.text_3": "pǝʌoɯǝɹ ɹo pǝppɐ buıǝq sʞɔoןq buıɹnoqɥbıǝu ʎuɐ oʇ ʇɔɐǝɹ ɹǝbuoן ou ןןıʍ ʇI", + "create.ponder.factory_gauge_crafting.header": "sǝbnɐ⅁ ʎɹoʇɔɐℲ ɥʇıʍ buıʇɟɐɹƆ ɔıʇɐɯoʇnⱯ", + "create.ponder.factory_gauge_crafting.text_1": "sǝdıɔǝɹ ǝןqɐʇ buıʇɟɐɹɔ ɹoɟ ʇuǝɯǝbuɐɹɹɐ-oʇnɐ ǝpıʌoɹd sǝbnɐb ʎɹoʇɔɐℲ", + "create.ponder.factory_gauge_crafting.text_2": "ǝɹoɟǝq sɐ sʇuǝıpǝɹbuı pǝɹınbǝɹ ǝɥʇ ʇɔǝuuoƆ", + "create.ponder.factory_gauge_crafting.text_3": "I∩ ǝɥʇ uı sɹɐǝddɐ uoʇʇnq ʍǝu ɐ 'pǝʇɔǝʇǝp sı ǝdıɔǝɹ pıןɐʌ ɐ uǝɥM", + "create.ponder.factory_gauge_crafting.text_4": "ʎןʇɔǝɹıp sɹǝʇɟɐɹɔ oʇuı pǝddɐɹʍun ǝq uɐɔ sǝxoq ǝɥʇ 'ǝʌıʇɔɐ ʇuǝɯǝbuɐɹɹɐ-oʇnɐ ɥʇıM", + "create.ponder.factory_gauge_crafting.text_5": "ɥɔuǝɹʍ ɐıʌ pǝʇɔǝuuoɔ ǝq oʇ ǝʌɐɥ sɹǝʇɟɐɹɔ ǝɥʇ puɐ ƐxƐ ǝq ʇsnɯ dnʇǝs ǝɥ⟘", + "create.ponder.factory_gauge_crafting.text_6": "ʇunoɯɐ ʇǝbɹɐʇ ǝɥʇ ʇǝs oʇ ǝbnɐb ǝɥʇ uo ʞɔıןɔ-ʇɥbıᴚ pןoH", + "create.ponder.factory_gauge_crafting.text_7": "sǝdıɔǝɹ ʇuǝɹǝɟɟıp ɥʇıʍ sǝbnɐb ǝɹoɯ ʎq 'ʎןןɐsɹǝʌıun pǝsn ǝq ʍou uɐɔ ɹǝʇɟɐɹɔ sıɥ⟘", + "create.ponder.factory_gauge_crafting.text_8": "dooן ǝɥʇ ǝsoןɔ oʇ ʎɹoʇuǝʌuı pǝʞuıן ɐ oʇ ʞɔɐq ʇuǝs ǝq pןnoɥs sʇndʇnO", + "create.ponder.factory_gauge_crafting.text_9": "sǝbɐʞɔɐd ʇnduı ɟo uoıʇɐʇuǝɯbɐɹɟ ʇuǝʌǝɹd oʇ pǝpuǝɯɯoɔǝɹ sı ɹǝbɐʞɔɐd-ǝᴚ ɐ buıs∩", + "create.ponder.factory_gauge_links.header": "sʞɔoןᗺ ɹǝɥʇo oʇ sǝbnɐ⅁ buıʇɔǝuuoƆ", + "create.ponder.factory_gauge_links.text_1": "˙˙˙I∩ ǝɥʇ ɯoɹɟ uoıʇɔǝuuoɔ ʍǝu ɐ buıppɐ uǝɥM", + "create.ponder.factory_gauge_links.text_2": "sʞuıꞀ ʎɐןdsıᗡ puɐ ǝuoʇspǝᴚ sʇdǝɔɔɐ osןɐ ǝbnɐb ǝɥʇ˙˙˙", + "create.ponder.factory_gauge_links.text_3": "ʇunoɯɐ ʇǝbɹɐʇ ǝɥʇ ǝʌoqɐ ɹo ʇɐ sı ןǝʌǝן ʞɔoʇs ǝɥʇ uǝɥʍ pǝɹǝʍod ǝq ןןıʍ sʞuıן ǝuoʇspǝᴚ", + "create.ponder.factory_gauge_links.text_4": "sʇsǝnbǝɹ buıpuǝs ɯoɹɟ ǝbnɐb ǝɥʇ doʇs uɐɔ sʞuıן 'ǝpoɯ ɹǝʌıǝɔǝɹ uI", + "create.ponder.factory_gauge_links.text_5": "sǝbnɐb pǝʇɔǝuuoɔ ɟo ʍǝıʌɹǝʌo snʇɐʇs ɐ ǝpıʌoɹd uɐɔ sʞuıן ʎɐןdsıᗡ", + "create.ponder.factory_gauge_recipe.header": "sǝbnɐ⅁ ʎɹoʇɔɐℲ ɥʇıʍ sǝdıɔǝᴚ pǝʇɐɯoʇnⱯ", + "create.ponder.factory_gauge_recipe.text_1": "˙˙˙ɹǝbɐʞɔɐd ɐ uo pǝɔɐןd ʇou ǝɹɐ sǝbnɐb ɹǝʌǝuǝɥM", + "create.ponder.factory_gauge_recipe.text_10": "oʇ ʇuǝs ǝq pןnoɥs sʇuǝıpǝɹbuı ʇɐɥʇ ssǝɹppɐ ǝɥʇ ʎɟıɔǝdS", + "create.ponder.factory_gauge_recipe.text_11": "ǝbnɐb ǝɥʇ uo ʞɔıןɔ-ʇɥbıᴚ buıpןoɥ ʎq ʇǝs ǝq ʍou uɐɔ uıɐʇuıɐɯ oʇ ʇunoɯɐ ʇǝbɹɐʇ ǝɥ⟘", + "create.ponder.factory_gauge_recipe.text_12": "˙˙˙ʇunoɯɐ ǝɥʇ uɐɥʇ sɯǝʇı ɹǝʍǝɟ sɐɥ ʞɹoʍʇǝu ǝɥʇ ɹǝʌǝuǝɥM", + "create.ponder.factory_gauge_recipe.text_13": "ssǝɹppɐ pǝıɟıɔǝds ǝɥʇ oʇ sʇuǝıpǝɹbuı ʍǝu puǝs ןןıʍ ʇı˙˙˙", + "create.ponder.factory_gauge_recipe.text_14": "sǝıɹoʇuǝʌuı pǝʞuıן ǝɥʇ ɟo ʎuɐ oʇ uɹnʇǝɹ oʇ pǝǝu uǝɥʇ sʇndʇno ǝɥ⟘", + "create.ponder.factory_gauge_recipe.text_15": "pǝɥɔɐǝɹ uǝǝq sɐɥ ʇunoɯɐ ʇǝbɹɐʇ ǝɥʇ ʇɐɥʇ ǝʇɐɔıpuı suoıʇɔǝuuoɔ uǝǝɹ⅁", + "create.ponder.factory_gauge_recipe.text_16": "sdǝʇs ǝdıɔǝɹ ǝɹoɯ ǝpnןɔuı oʇ puɐdxǝ uɐɔ sǝbnɐb ɟo pɹɐoq ǝɥ⟘", + "create.ponder.factory_gauge_recipe.text_17": "ʎןʇuǝpuǝdǝpuı ɯǝʇı sʇı ɟo ןǝʌǝן ʞɔoʇs ǝɥʇ suıɐʇuıɐɯ ǝbnɐb ɥɔɐƎ", + "create.ponder.factory_gauge_recipe.text_2": "sǝıɹoʇuǝʌuı pǝʞuıן ןןɐ ɟo sןǝʌǝן ʞɔoʇs ɹoʇıuoɯ pɐǝʇsuı ןןıʍ ʎǝɥ⟘", + "create.ponder.factory_gauge_recipe.text_3": "pǝɹoʇıuoɯ ǝq pןnoɥs ʇɐɥʇ ɯǝʇı ǝɥʇ ɥʇıʍ ʇı ʞɔıןɔ-ʇɥbıᴚ", + "create.ponder.factory_gauge_recipe.text_4": "ʞɹoʍʇǝu ǝɥʇ uo ʇuǝsǝɹd ʇunoɯɐ ןɐʇoʇ ǝɥʇ ʎɐןdsıp ʍou ןןıʍ ʇI", + "create.ponder.factory_gauge_recipe.text_5": "pǝssǝɔoɹd ǝq oʇ sɯǝʇı ɹǝɥʇo buıpuǝs ʎq sןǝʌǝן ʞɔoʇs ɥsıuǝןdǝɹ uɐɔ ǝbnɐb ǝɥ⟘", + "create.ponder.factory_gauge_recipe.text_6": "sǝbnɐb ʎɹoʇɔɐɟ ʍǝu sɐ sʇuǝıpǝɹbuı pǝɹınbǝɹ ǝɥʇ ppɐ 'ʇsɹıℲ", + "create.ponder.factory_gauge_recipe.text_7": "ǝpɐɯ ǝq uɐɔ suoıʇɔǝuuoɔ ʍǝu 'I∩ s,ʇǝbɹɐʇ ǝɥʇ ɯoɹℲ", + "create.ponder.factory_gauge_recipe.text_8": "buıɥʇɐd ǝɥʇ ǝbuɐɥɔ oʇ pǝɥɔuǝɹʍ ǝq uɐɔ sןǝuɐd ʇnduı 'sɔıʇǝɥʇsǝɐ ɹoℲ", + "create.ponder.factory_gauge_recipe.text_9": "ɥɔʇɐq ɹǝd ǝpɐɯ sʇǝb ʇndʇno ǝɥʇ ɟo ɥɔnɯ ʍoɥ ʎɟıɔǝds puɐ sʇnduı ǝɥʇ ʍǝıʌǝɹ 'I∩ ǝɥʇ uI", + "create.ponder.factory_gauge_restocker.header": "sǝbnɐ⅁ ʎɹoʇɔɐℲ ɥʇıʍ buıʞɔoʇsǝᴚ", + "create.ponder.factory_gauge_restocker.text_1": "ʞɹoʍʇǝu sʇı oʇ ʇɔǝuuoɔ oʇ ʇuǝɯǝɔɐןd ǝɹoɟǝq ʞuıן ʞɔoʇS ɐ ʞɔıןɔ-ʇɥbıᴚ", + "create.ponder.factory_gauge_restocker.text_10": "ssǝɹppɐ pǝıɟıɔǝds ǝɥʇ ɥʇıʍ 'ǝɹoɯ spuǝs ʞɹoʍʇǝu sɔıʇsıboן ǝɥʇ˙˙˙", + "create.ponder.factory_gauge_restocker.text_11": "ɹǝbɐʞɔɐd ǝɥʇ oʇ pǝʇnoɹ ǝq uɐɔ ʎǝɥʇ 'ǝɹǝɥʇ ɯoɹℲ", + "create.ponder.factory_gauge_restocker.text_2": "ʎɹoʇuǝʌuı ǝɥʇ ǝpısuı sɯǝʇı ɹoʇıuoɯ uɐɔ sǝbnɐb ʎɹoʇɔɐɟ 'ɹǝbɐʞɔɐd ɐ uo pǝɔɐןd uǝɥM", + "create.ponder.factory_gauge_restocker.text_3": "pǝɹoʇıuoɯ ǝq pןnoɥs ʇɐɥʇ ɯǝʇı ǝɥʇ ɥʇıʍ ʇı ʞɔıןɔ-ʇɥbıᴚ", + "create.ponder.factory_gauge_restocker.text_4": "ʎɹoʇuǝʌuı ǝɥʇ uı ʇuǝsǝɹd ʇunoɯɐ ǝɥʇ ʎɐןdsıp ʍou ןןıʍ ʇI", + "create.ponder.factory_gauge_restocker.text_5": "ʞɹoʍʇǝu sɔıʇsıboן ǝɥʇ ɯoɹɟ ʎɹoʇuǝʌuı sıɥʇ ןןıɟǝɹ uɐɔ ǝbnɐb ǝɥ⟘", + "create.ponder.factory_gauge_restocker.text_6": "I∩ uoıʇɐɹnbıɟuoɔ sʇı uǝdo oʇ uıɐbɐ ʇı ʞɔıןɔ-ʇɥbıᴚ", + "create.ponder.factory_gauge_restocker.text_7": "sɯǝʇı pǝʇsǝnbǝɹ ǝɥʇ ɹoɟ pǝsn ǝq pןnoɥs ʇɐɥʇ ssǝɹppɐ uɐ ʇǝS", + "create.ponder.factory_gauge_restocker.text_8": "ǝbnɐb ǝɥʇ uo ʞɔıןɔ-ʇɥbıᴚ buıpןoɥ ʎq ʇǝs ǝq ʍou uɐɔ uıɐʇuıɐɯ oʇ ʇunoɯɐ ʇǝbɹɐʇ ǝɥ⟘", + "create.ponder.factory_gauge_restocker.text_9": "˙˙˙ʇunoɯɐ sıɥʇ uɐɥʇ sɯǝʇı ɹǝʍǝɟ sɐɥ ʇsǝɥɔ ǝɥʇ ɹǝʌǝuǝɥM", "create.ponder.fan_direction.header": "suɐℲ pǝsɐɔuƎ ɟo ʍoןɟ ɹıⱯ", "create.ponder.fan_direction.text_1": "ʇuǝɹɹnƆ ɹıⱯ uɐ ǝʇɐǝɹɔ oʇ ǝɔɹoℲ ןɐuoıʇɐʇoᴚ ǝsn suɐℲ pǝsɐɔuƎ", "create.ponder.fan_direction.text_2": "ʇnduI ןɐuoıʇɐʇoᴚ ǝɥʇ uo spuǝdǝp ʍoןℲ ɟo uoıʇɔǝɹıᗡ puɐ ɥʇbuǝɹʇS", @@ -2418,6 +2464,19 @@ "create.ponder.super_glue.text_4": "buoןɐ ɹǝɥʇo ɥɔɐǝ ןןnd ןןıʍ ɐǝɹɐ uɐ buıɹɐɥs sʞɔoןq ʇuǝɔɐظpⱯ", "create.ponder.super_glue.text_5": "ɹǝɥʇǝboʇ ǝʌoɯ ןןıʍ sǝɯnןoʌ ǝnןb buıddɐןɹǝʌO", "create.ponder.super_glue.text_6": "ǝnןb ǝɹınbǝɹ ʇou op ʎןןɐnsn sɹǝɥʇo uo buıbuɐɥ sʞɔoןᗺ", + "create.ponder.table_cloth.header": "sɥʇoןƆ ǝןqɐ⟘ ɥʇıʍ sɯǝʇı buıןןǝS", + "create.ponder.table_cloth.text_1": "sɯǝʇı ʎɐןdsıp oʇ pǝsn ǝq uɐɔ sɥʇoןɔ ǝןqɐ⟘", + "create.ponder.table_cloth.text_10": "ǝbɐʞɔɐd ɐ oʇuı pǝɔɐןd ǝq ןןıʍ sɯǝʇı ʇɥbnoq ǝɥʇ 'ɹǝıɥsɐɔ ǝɥʇ ʇɐ ʇno buıʞɔǝɥɔ uǝɥM", + "create.ponder.table_cloth.text_11": "ʇuoɹɟ doɥs ǝɥʇ oʇ pǝʇɹodsuɐɹʇ ǝq uɐɔ ʎǝɥʇ 'ǝɹǝɥʇ ɯoɹℲ", + "create.ponder.table_cloth.text_12": "ʞɔoןq ɹǝʞɔıʇ ʞɔoʇs ǝɥʇ ǝpısuı pǝɹoʇs ǝq ןןıʍ sʇuǝɯʎɐd ǝɥ⟘", + "create.ponder.table_cloth.text_2": "sɯǝʇı ןןǝs oʇ pǝsn ǝq osןɐ uɐɔ ʎǝɥʇ 'ɯǝʇsʎs sɔıʇsıboן ɐ ɟo dןǝɥ ǝɥʇ ɥʇıM", + "create.ponder.table_cloth.text_3": "ʞuıן ʞɔoʇS puɐ ɹǝbɐʞɔɐԀ ɐ 'ʎɹoʇuǝʌuı s,doɥs ǝɥʇ ɥʇıʍ ʇɹɐʇS", + "create.ponder.table_cloth.text_4": "doɥs ǝɥʇ uı ʇı ǝɔɐןd puɐ ʞuıן ǝɥʇ oʇ ɹǝʞɔıʇ ʞɔoʇS ɐ puıᗺ", + "create.ponder.table_cloth.text_5": "ɹǝdǝǝʞ doɥs ǝɥʇ sɐ ɹǝuɹnq ǝzɐןq ɹo qoɯ ɐ ʎoןdɯƎ", + "create.ponder.table_cloth.text_6": "pןos ǝq oʇ sɯǝʇı ɥʇıʍ ʎɹoʇuǝʌuı doɥs ǝɥʇ ןןıℲ", + "create.ponder.table_cloth.text_7": "ɥʇoןɔ ǝןqɐʇ ɐ buıpןoɥ ǝןıɥʍ ɹǝdǝǝʞ doɥs ǝɥʇ ɥʇıʍ ʇɔɐɹǝʇuı 'ǝpɐɹʇ ʍǝu ɐ ǝʇɐǝɹɔ o⟘", + "create.ponder.table_cloth.text_8": "ǝpıs ǝɥʇ uo ʇoןs ɯǝʇı ǝɥʇ uı ǝɔıɹd ɐ ʇǝs 'pǝɔɐןd ǝɔuO", + "create.ponder.table_cloth.text_9": "doɥs ǝɥʇ ɥʇıʍ ʇɔɐɹǝʇuı ʍou uɐɔ sɹǝʎɐןd ɹǝɥʇO", "create.ponder.tag.arm_targets": "sɯɹⱯ ןɐɔıuɐɥɔǝW ɹoɟ sʇǝbɹɐ⟘", "create.ponder.tag.arm_targets.description": "ɯɹⱯ ןɐɔıuɐɥɔǝW ǝɥʇ oʇ sʇndʇno ɹo sʇnduı sɐ pǝʇɔǝןǝs ǝq uɐɔ ɥɔıɥʍ sʇuǝuodɯoƆ", "create.ponder.tag.contraption_actor": "sɹoʇɔⱯ uoıʇdɐɹʇuoƆ", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 1bbdff9d06..1ef1098357 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1851,6 +1851,52 @@ "create.ponder.encased_fluid_pipe.text_1": "Copper Casing can be used to decorate Fluid Pipes", "create.ponder.encased_fluid_pipe.text_2": "Aside from being concealed, Encased Pipes are locked into their connectivity state", "create.ponder.encased_fluid_pipe.text_3": "It will no longer react to any neighbouring blocks being added or removed", + "create.ponder.factory_gauge_crafting.header": "Automatic Crafting with Factory Gauges", + "create.ponder.factory_gauge_crafting.text_1": "Factory gauges provide auto-arrangement for crafting table recipes", + "create.ponder.factory_gauge_crafting.text_2": "Connect the required ingredients as before", + "create.ponder.factory_gauge_crafting.text_3": "When a valid recipe is detected, a new button appears in the UI", + "create.ponder.factory_gauge_crafting.text_4": "With auto-arrangement active, the boxes can be unwrapped into crafters directly", + "create.ponder.factory_gauge_crafting.text_5": "The setup must be 3x3 and the crafters have to be connected via wrench", + "create.ponder.factory_gauge_crafting.text_6": "Hold Right-click on the gauge to set the target amount", + "create.ponder.factory_gauge_crafting.text_7": "This crafter can now be used universally, by more gauges with different recipes", + "create.ponder.factory_gauge_crafting.text_8": "Outputs should be sent back to a linked inventory to close the loop", + "create.ponder.factory_gauge_crafting.text_9": "Using a Re-packager is recommended to prevent fragmentation of input packages", + "create.ponder.factory_gauge_links.header": "Connecting Gauges to other Blocks", + "create.ponder.factory_gauge_links.text_1": "When adding a new connection from the UI...", + "create.ponder.factory_gauge_links.text_2": "...the gauge also accepts Redstone and Display Links", + "create.ponder.factory_gauge_links.text_3": "Redstone links will be powered when the stock level is at or above the target amount", + "create.ponder.factory_gauge_links.text_4": "In receiver mode, links can stop the gauge from sending requests", + "create.ponder.factory_gauge_links.text_5": "Display links can provide a status overview of connected gauges", + "create.ponder.factory_gauge_recipe.header": "Automated Recipes with Factory Gauges", + "create.ponder.factory_gauge_recipe.text_1": "Whenever gauges are not placed on a packager...", + "create.ponder.factory_gauge_recipe.text_10": "Specify the address that ingredients should be sent to", + "create.ponder.factory_gauge_recipe.text_11": "The target amount to maintain can now be set by holding Right-click on the gauge", + "create.ponder.factory_gauge_recipe.text_12": "Whenever the network has fewer items than the amount...", + "create.ponder.factory_gauge_recipe.text_13": "...it will send new ingredients to the specified address", + "create.ponder.factory_gauge_recipe.text_14": "The outputs then need to return to any of the linked inventories", + "create.ponder.factory_gauge_recipe.text_15": "Green connections indicate that the target amount has been reached", + "create.ponder.factory_gauge_recipe.text_16": "The board of gauges can expand to include more recipe steps", + "create.ponder.factory_gauge_recipe.text_17": "Each gauge maintains the stock level of its item independently", + "create.ponder.factory_gauge_recipe.text_2": "They will instead monitor stock levels of all linked inventories", + "create.ponder.factory_gauge_recipe.text_3": "Right-click it with the item that should be monitored", + "create.ponder.factory_gauge_recipe.text_4": "It will now display the total amount present on the network", + "create.ponder.factory_gauge_recipe.text_5": "The gauge can replenish stock levels by sending other items to be processed", + "create.ponder.factory_gauge_recipe.text_6": "First, add the required ingredients as new factory gauges", + "create.ponder.factory_gauge_recipe.text_7": "From the target's UI, new connections can be made", + "create.ponder.factory_gauge_recipe.text_8": "For aesthetics, input panels can be wrenched to change the pathing", + "create.ponder.factory_gauge_recipe.text_9": "In the UI, review the inputs and specify how much of the output gets made per batch", + "create.ponder.factory_gauge_restocker.header": "Restocking with Factory Gauges", + "create.ponder.factory_gauge_restocker.text_1": "Right-click a Stock link before placement to connect to its network", + "create.ponder.factory_gauge_restocker.text_10": "...the logistics network sends more, with the specified address", + "create.ponder.factory_gauge_restocker.text_11": "From there, they can be routed to the packager", + "create.ponder.factory_gauge_restocker.text_2": "When placed on a packager, factory gauges can monitor items inside the inventory", + "create.ponder.factory_gauge_restocker.text_3": "Right-click it with the item that should be monitored", + "create.ponder.factory_gauge_restocker.text_4": "It will now display the amount present in the inventory", + "create.ponder.factory_gauge_restocker.text_5": "The gauge can refill this inventory from the logistics network", + "create.ponder.factory_gauge_restocker.text_6": "Right-click it again to open its configuration UI", + "create.ponder.factory_gauge_restocker.text_7": "Set an address that should be used for the requested items", + "create.ponder.factory_gauge_restocker.text_8": "The target amount to maintain can now be set by holding Right-click on the gauge", + "create.ponder.factory_gauge_restocker.text_9": "Whenever the chest has fewer items than this amount...", "create.ponder.fan_direction.header": "Air flow of Encased Fans", "create.ponder.fan_direction.text_1": "Encased Fans use Rotational Force to create an Air Current", "create.ponder.fan_direction.text_2": "Strength and Direction of Flow depends on the Rotational Input", @@ -2418,6 +2464,19 @@ "create.ponder.super_glue.text_4": "Adjacent blocks sharing an area will pull each other along", "create.ponder.super_glue.text_5": "Overlapping glue volumes will move together", "create.ponder.super_glue.text_6": "Blocks hanging on others usually do not require glue", + "create.ponder.table_cloth.header": "Selling items with Table Cloths", + "create.ponder.table_cloth.text_1": "Table cloths can be used to display items", + "create.ponder.table_cloth.text_10": "When checking out at the cashier, the bought items will be placed into a package", + "create.ponder.table_cloth.text_11": "From there, they can be transported to the shop front", + "create.ponder.table_cloth.text_12": "The payments will be stored inside the stock ticker block", + "create.ponder.table_cloth.text_2": "With the help of a logistics system, they can also be used to sell items", + "create.ponder.table_cloth.text_3": "Start with the shop's inventory, a Packager and Stock link", + "create.ponder.table_cloth.text_4": "Bind a Stock ticker to the link and place it in the shop", + "create.ponder.table_cloth.text_5": "Employ a mob or blaze burner as the shop keeper", + "create.ponder.table_cloth.text_6": "Fill the shop inventory with items to be sold", + "create.ponder.table_cloth.text_7": "To create a new trade, interact with the shop keeper while holding a table cloth", + "create.ponder.table_cloth.text_8": "Once placed, set a price in the item slot on the side", + "create.ponder.table_cloth.text_9": "Other players can now interact with the shop", "create.ponder.tag.arm_targets": "Targets for Mechanical Arms", "create.ponder.tag.arm_targets.description": "Components which can be selected as inputs or outputs to the Mechanical Arm", "create.ponder.tag.contraption_actor": "Contraption Actors", diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java index 2b89052015..431d4794f0 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java @@ -88,13 +88,13 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { public int promiseClearingInterval; public boolean forceClearPromises; public UUID network; + public boolean active; public boolean redstonePowered; public RequestPromiseQueue restockerPromises; private boolean promisePrimedForMarkDirty; - private boolean active; private int lastReportedUnloadedLinks; private int lastReportedLevelInStorage; private int lastReportedPromises; @@ -119,7 +119,7 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { this.promiseClearingInterval = -1; this.bulb = LerpedFloat.linear() .startWithValue(0) - .chase(0, 0.125, Chaser.EXP); + .chase(0, 0.175, Chaser.EXP); this.restockerPromises = new RequestPromiseQueue(be::setChanged); this.promisePrimedForMarkDirty = true; this.network = UUID.randomUUID(); @@ -179,6 +179,8 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { public void tick() { super.tick(); if (getWorld().isClientSide()) { + if (blockEntity.isVirtual()) + tickStorageMonitor(); bulb.updateChaseTarget(redstonePowered || satisfied ? 1 : 0); bulb.tickChaser(); return; @@ -248,7 +250,7 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { && lastReportedUnloadedLinks == unloadedLinkCount && satisfied == shouldSatisfy && promisedSatisfied == shouldPromiseSatisfy && waitingForNetwork == shouldWait) return; - + if (!satisfied && shouldSatisfy) { AllSoundEvents.CONFIRM.playOnServer(getWorld(), getPos(), 0.075f, 1f); AllSoundEvents.CONFIRM_2.playOnServer(getWorld(), getPos(), 0.125f, 0.575f); @@ -261,7 +263,8 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { promisedSatisfied = shouldPromiseSatisfy; lastReportedUnloadedLinks = unloadedLinkCount; waitingForNetwork = shouldWait; - blockEntity.sendData(); + if (!getWorld().isClientSide) + blockEntity.sendData(); if (notifyOutputs) notifyRedstoneOutputs(); } @@ -349,7 +352,7 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { RequestPromiseQueue promises = Create.LOGISTICS.getQueuedPromises(network); if (promises != null) promises.add(new RequestPromise(new BigItemStack(getFilter(), recipeOutput))); - + panelBE.advancements.awardPlayer(AllAdvancements.FACTORY_GAUGE); } @@ -560,6 +563,8 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { } public int getLevelInStorage() { + if (blockEntity.isVirtual()) + return 1; if (getWorld().isClientSide()) return lastReportedLevelInStorage; if (getFilter().isEmpty()) @@ -667,7 +672,7 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { active = false; return; } - + active = true; filter = FilterItemStack.of(panelTag.getCompound("Filter")); count = panelTag.getInt("FilterAmount"); diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelModel.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelModel.java index 62fe717d5a..b6e1b6faf3 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelModel.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelModel.java @@ -15,6 +15,7 @@ import com.simibubi.create.foundation.model.BakedQuadHelper; import dev.engine_room.flywheel.lib.model.baked.PartialModel; import net.createmod.catnip.utility.VecHelper; +import net.createmod.ponder.api.level.PonderLevel; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.resources.model.BakedModel; @@ -49,6 +50,7 @@ public class FactoryPanelModel extends BakedModelWrapperWithData { data.states.put(slot, behaviour.count == 0 ? PanelState.PASSIVE : PanelState.ACTIVE); data.type = behaviour.panelBE().restocker ? PanelType.PACKAGER : PanelType.NETWORK; } + data.ponder = world instanceof PonderLevel; return builder.with(PANEL_PROPERTY, data); } @@ -62,12 +64,12 @@ public class FactoryPanelModel extends BakedModelWrapperWithData { for (PanelSlot panelSlot : PanelSlot.values()) if (modelData.states.containsKey(panelSlot)) addPanel(quads, state, panelSlot, modelData.type, modelData.states.get(panelSlot), rand, data, - renderType); + renderType, modelData.ponder); return quads; } public void addPanel(List quads, BlockState state, PanelSlot slot, PanelType type, PanelState panelState, - RandomSource rand, ModelData data, RenderType renderType) { + RandomSource rand, ModelData data, RenderType renderType, boolean ponder) { PartialModel factoryPanel = panelState == PanelState.PASSIVE ? type == PanelType.NETWORK ? AllPartialModels.FACTORY_PANEL : AllPartialModels.FACTORY_PANEL_RESTOCKER : type == PanelType.NETWORK ? AllPartialModels.FACTORY_PANEL_WITH_BULB @@ -78,7 +80,7 @@ public class FactoryPanelModel extends BakedModelWrapperWithData { float xRot = Mth.RAD_TO_DEG * FactoryPanelBlock.getXRot(state); float yRot = Mth.RAD_TO_DEG * FactoryPanelBlock.getYRot(state); - + for (BakedQuad bakedQuad : quadsToAdd) { int[] vertices = bakedQuad.getVertices(); int[] transformedVertices = Arrays.copyOf(vertices, vertices.length); @@ -109,7 +111,7 @@ public class FactoryPanelModel extends BakedModelWrapperWithData { Direction newNormal = Direction.fromDelta((int) Math.round(quadNormal.x), (int) Math.round(quadNormal.y), (int) Math.round(quadNormal.z)); quads.add(new BakedQuad(transformedVertices, bakedQuad.getTintIndex(), newNormal, bakedQuad.getSprite(), - bakedQuad.isShade())); + !ponder && bakedQuad.isShade())); } } @@ -117,6 +119,7 @@ public class FactoryPanelModel extends BakedModelWrapperWithData { private static class FactoryPanelModelData { public PanelType type; public EnumMap states = new EnumMap<>(PanelSlot.class); + private boolean ponder; } } diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderScenes.java index 2bfee75de7..ef527b9a43 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderScenes.java @@ -41,6 +41,7 @@ import com.simibubi.create.infrastructure.ponder.scenes.fluid.HosePulleyScenes; import com.simibubi.create.infrastructure.ponder.scenes.fluid.PipeScenes; import com.simibubi.create.infrastructure.ponder.scenes.fluid.PumpScenes; import com.simibubi.create.infrastructure.ponder.scenes.fluid.SpoutScenes; +import com.simibubi.create.infrastructure.ponder.scenes.highLogistics.FactoryGaugeScenes; import com.simibubi.create.infrastructure.ponder.scenes.highLogistics.FrogAndConveyorScenes; import com.simibubi.create.infrastructure.ponder.scenes.highLogistics.PackagerScenes; import com.simibubi.create.infrastructure.ponder.scenes.highLogistics.PostboxScenes; @@ -378,6 +379,11 @@ public class AllCreatePonderScenes { .addStoryBoard("high_logistics/table_cloth", TableClothScenes::tableCloth); HELPER.forComponents(AllBlocks.ANDESITE_TABLE_CLOTH, AllBlocks.BRASS_TABLE_CLOTH, AllBlocks.COPPER_TABLE_CLOTH) .addStoryBoard("high_logistics/table_cloth", TableClothScenes::tableCloth); + HELPER.forComponents(AllBlocks.FACTORY_GAUGE) + .addStoryBoard("high_logistics/factory_gauge_restocker", FactoryGaugeScenes::restocker) + .addStoryBoard("high_logistics/factory_gauge_recipe", FactoryGaugeScenes::recipe) + .addStoryBoard("high_logistics/factory_gauge_crafting", FactoryGaugeScenes::crafting) + .addStoryBoard("high_logistics/factory_gauge_links", FactoryGaugeScenes::links); // Trains HELPER.forComponents(TrackMaterial.allBlocks() diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/FactoryGaugeScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/FactoryGaugeScenes.java new file mode 100644 index 0000000000..f2348ad563 --- /dev/null +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/FactoryGaugeScenes.java @@ -0,0 +1,1523 @@ +package com.simibubi.create.infrastructure.ponder.scenes.highLogistics; + +import java.util.List; +import java.util.function.Consumer; + +import com.google.common.collect.ImmutableList; +import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllItems; +import com.simibubi.create.content.kinetics.crafter.MechanicalCrafterBlockEntity; +import com.simibubi.create.content.kinetics.mixer.MechanicalMixerBlockEntity; +import com.simibubi.create.content.logistics.box.PackageItem; +import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBehaviour; +import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBlock.PanelSlot; +import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBlockEntity; +import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelConnection; +import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelPosition; +import com.simibubi.create.content.processing.basin.BasinBlockEntity; +import com.simibubi.create.content.redstone.link.RedstoneLinkBlock; +import com.simibubi.create.foundation.gui.AllIcons; +import com.simibubi.create.foundation.ponder.CreateSceneBuilder; + +import net.createmod.catnip.utility.IntAttached; +import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.utility.Pointing; +import net.createmod.ponder.api.PonderPalette; +import net.createmod.ponder.api.element.ElementLink; +import net.createmod.ponder.api.element.WorldSectionElement; +import net.createmod.ponder.api.scene.SceneBuilder; +import net.createmod.ponder.api.scene.SceneBuildingUtil; +import net.createmod.ponder.api.scene.Selection; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; + +public class FactoryGaugeScenes { + + public static void restocker(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); + scene.title("factory_gauge_restocker", "Restocking with Factory Gauges"); + scene.configureBasePlate(0, 0, 7); + scene.scaleSceneView(0.925f); + scene.setSceneOffsetY(-0.5f); + scene.showBasePlate(); + + Selection vault = util.select() + .fromTo(5, 1, 4, 6, 3, 6); + Selection packager = util.select() + .fromTo(4, 1, 5, 4, 2, 5); + BlockPos pack = util.grid() + .at(4, 2, 5); + BlockPos link = util.grid() + .at(4, 3, 5); + Selection linkS = util.select() + .position(4, 3, 5); + Selection funnel = util.select() + .position(3, 2, 5); + Selection funnel2 = util.select() + .position(1, 2, 2); + Selection belt1 = util.select() + .fromTo(1, 1, 2, 1, 1, 6) + .add(util.select() + .fromTo(2, 1, 6, 2, 1, 7)); + Selection largeCog = util.select() + .position(1, 0, 7); + Selection belt2 = util.select() + .fromTo(3, 1, 5, 2, 1, 5); + Selection chest = util.select() + .fromTo(3, 2, 1, 2, 2, 1); + Selection chestScaff = util.select() + .fromTo(3, 1, 1, 2, 1, 1); + Selection packScaff = util.select() + .position(1, 1, 1); + BlockPos pack2 = util.grid() + .at(1, 2, 1); + Selection pack2S = util.select() + .position(1, 2, 1); + BlockPos gauge = util.grid() + .at(1, 2, 0); + Selection gaugeS = util.select() + .position(1, 2, 0); + + scene.idle(10); + + ElementLink linkL = scene.world() + .showIndependentSection(linkS, Direction.DOWN); + scene.world() + .moveSection(linkL, util.vector() + .of(0, -2, 0), 0); + + ElementLink chestL = scene.world() + .showIndependentSection(chest, Direction.DOWN); + scene.world() + .moveSection(chestL, util.vector() + .of(0, -1, 0), 0); + scene.idle(5); + scene.world() + .showSectionAndMerge(pack2S, Direction.EAST, chestL); + + scene.idle(15); + + ItemStack linkItem = AllBlocks.FACTORY_GAUGE.asStack(); + scene.overlay() + .showControls(util.vector() + .topOf(link.below(2)), Pointing.DOWN, 50) + .rightClick() + .withItem(linkItem); + scene.idle(5); + + AABB bb1 = new AABB(link.below(2)); + scene.overlay() + .chaseBoundingBoxOutline(PonderPalette.BLUE, link, bb1.deflate(0.45), 10); + scene.idle(1); + bb1 = bb1.deflate(1 / 16f) + .contract(0, 8 / 16f, 0); + scene.overlay() + .chaseBoundingBoxOutline(PonderPalette.BLUE, link, bb1, 50); + scene.idle(26); + + scene.overlay() + .showText(100) + .text("Right-click a Stock link before placement to connect to its network") + .attachKeyFrame() + .colored(PonderPalette.BLUE) + .placeNearTarget() + .pointAt(util.vector() + .centerOf(link.below(2))); + + scene.idle(60); + scene.world() + .showSectionAndMerge(gaugeS, Direction.SOUTH, chestL); + scene.idle(50); + + Vec3 gaugeMiddle = util.vector() + .of(1.25, 1.75, 1); + scene.overlay() + .showText(100) + .text("When placed on a packager, factory gauges can monitor items inside the inventory") + .attachKeyFrame() + .placeNearTarget() + .pointAt(gaugeMiddle); + scene.idle(30); + + scene.overlay() + .showOutline(PonderPalette.BLUE, gauge, util.select() + .fromTo(3, 1, 1, 2, 1, 1), 70); + scene.idle(80); + + ItemStack monitorItem = new ItemStack(Items.CHARCOAL); + scene.overlay() + .showControls(gaugeMiddle, Pointing.DOWN, 50) + .withItem(monitorItem) + .rightClick(); + scene.idle(7); + setPanelItem(builder, gauge, PanelSlot.TOP_RIGHT, monitorItem); + + scene.world() + .modifyBlockEntity(gauge, FactoryPanelBlockEntity.class, be -> { + FactoryPanelBehaviour pb = be.panels.get(PanelSlot.BOTTOM_LEFT); + pb.setFilter(monitorItem); + }); + + scene.overlay() + .showText(80) + .text("Right-click it with the item that should be monitored") + .attachKeyFrame() + .placeNearTarget() + .pointAt(gaugeMiddle); + scene.idle(90); + + scene.overlay() + .showOutline(PonderPalette.BLUE, gauge, util.select() + .fromTo(3, 1, 1, 2, 1, 1), 70); + scene.overlay() + .showText(70) + .text("It will now display the amount present in the inventory") + .colored(PonderPalette.BLUE) + .placeNearTarget() + .pointAt(gaugeMiddle); + + scene.idle(80); + + scene.world() + .moveSection(linkL, util.vector() + .of(0, 2.25, 0), 15); + scene.idle(5); + scene.idle(8); + scene.world() + .showSection(vault, Direction.NORTH); + scene.idle(5); + scene.world() + .showSection(packager, Direction.EAST); + scene.idle(2); + scene.world() + .moveSection(linkL, util.vector() + .of(0, -.25, 0), 10); + scene.idle(10); + + scene.overlay() + .showText(90) + .text("The gauge can refill this inventory from the logistics network") + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector() + .of(3, 2, 1.5)); + scene.idle(100); + + scene.overlay() + .showControls(gaugeMiddle, Pointing.DOWN, 50) + .rightClick(); + scene.idle(7); + AABB boundingBox = new AABB(gaugeMiddle, gaugeMiddle).inflate(0.19, 0.19, 0); + scene.overlay() + .chaseBoundingBoxOutline(PonderPalette.BLUE, gauge, boundingBox, 150); + scene.overlay() + .showText(70) + .text("Right-click it again to open its configuration UI") + .attachKeyFrame() + .colored(PonderPalette.BLUE) + .placeNearTarget() + .pointAt(gaugeMiddle); + scene.idle(80); + + scene.overlay() + .showText(70) + .text("Set an address that should be used for the requested items") + .attachKeyFrame() + .placeNearTarget() + .pointAt(gaugeMiddle); + scene.idle(80); + + scene.world() + .moveSection(chestL, util.vector() + .of(0, 1, 0), 10); + scene.idle(10); + scene.world() + .showSection(chestScaff, Direction.NORTH); + scene.world() + .showSection(packScaff, Direction.NORTH); + scene.idle(10); + scene.world() + .showSection(largeCog, Direction.UP); + scene.world() + .showSection(belt1, Direction.EAST); + scene.idle(5); + scene.world() + .showSection(belt2, Direction.SOUTH); + scene.idle(15); + + gaugeMiddle = gaugeMiddle.add(0, 1, 0); + + scene.overlay() + .showControls(gaugeMiddle, Pointing.DOWN, 100) + .rightClick(); + scene.idle(7); + scene.overlay() + .chaseBoundingBoxOutline(PonderPalette.GREEN, gauge, boundingBox.move(0, 1, 0), 100); + scene.overlay() + .showText(100) + .text("The target amount to maintain can now be set by holding Right-click on the gauge") + .attachKeyFrame() + .colored(PonderPalette.GREEN) + .placeNearTarget() + .pointAt(gaugeMiddle); + scene.idle(40); + + setPanelNotSatisfied(builder, gauge, PanelSlot.TOP_RIGHT); + + scene.idle(70); + scene.overlay() + .showText(70) + .text("Whenever the chest has fewer items than this amount...") + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector() + .of(3, 3, 1.5)); + scene.idle(50); + + PonderHilo.linkEffect(scene, link); + ItemStack box = PackageItem.containing(List.of()); + PonderHilo.packagerCreate(scene, pack, box); + scene.idle(30); + + scene.overlay() + .showText(70) + .text("...the logistics network sends more, with the specified address") + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector() + .of(4, 2.5, 5.5)); + scene.idle(50); + + scene.world() + .showSection(funnel, Direction.DOWN); + scene.idle(10); + scene.world() + .showSection(funnel2, Direction.DOWN); + scene.idle(5); + scene.world() + .createItemOnBelt(util.grid() + .at(3, 1, 5), Direction.EAST, box); + PonderHilo.packagerClear(scene, pack); + scene.idle(40); + + scene.overlay() + .showText(70) + .text("From there, they can be routed to the packager") + .placeNearTarget() + .pointAt(util.vector() + .of(1, 2.5, 3.5)); + + scene.idle(30); + scene.world() + .removeItemsFromBelt(util.grid() + .at(1, 1, 2)); + PonderHilo.packagerUnpack(scene, pack2, box); + scene.idle(15); + + setPanelSatisfied(builder, gauge, PanelSlot.TOP_RIGHT); + } + + public static void recipe(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); + scene.title("factory_gauge_recipe", "Automated Recipes with Factory Gauges"); + scene.configureBasePlate(0, 0, 9); + scene.scaleSceneView(0.925f); + scene.setSceneOffsetY(-0.5f); + + Selection fakeFloor = util.select() + .fromTo(8, 6, 0, 0, 6, 8); + Selection belt1 = util.select() + .fromTo(1, 0, 7, 1, 0, 2); + Selection belt2 = util.select() + .fromTo(1, 0, 1, 3, 0, 1); + Selection saw = util.select() + .position(4, 0, 1); + Selection belt3 = util.select() + .fromTo(5, 0, 1, 6, 0, 1); + Selection belt4 = util.select() + .fromTo(7, 0, 7, 7, 0, 5); + Selection funnel1 = util.select() + .position(1, 1, 7); + Selection funnel2 = util.select() + .position(6, 1, 1); + Selection funnel3 = util.select() + .position(7, 1, 5); + Selection pack2S = util.select() + .fromTo(7, 1, 7, 6, 1, 7); + Selection basin = util.select() + .position(7, 1, 1); + Selection mixer = util.select() + .fromTo(7, 3, 1, 9, 3, 1) + .add(util.select() + .fromTo(9, 2, 1, 9, 0, 1)); + Selection basinOut = util.select() + .fromTo(7, 0, 2, 7, 1, 2); + Selection barrelAndPackager = util.select() + .fromTo(7, 2, 4, 7, 1, 3); + BlockPos pack = util.grid() + .at(2, 1, 7); + Selection packS = util.select() + .fromTo(2, 1, 7, 2, 2, 7); + BlockPos link = util.grid() + .at(2, 2, 7); + Selection vault = util.select() + .fromTo(5, 2, 7, 3, 1, 6); + Selection scaff1 = util.select() + .fromTo(5, 1, 4, 3, 1, 4); + Selection scaff2 = util.select() + .position(2, 1, 4); + Selection board1 = util.select() + .fromTo(5, 2, 4, 3, 3, 4); + Selection board2 = util.select() + .fromTo(6, 5, 4, 2, 2, 4) + .substract(board1); + + BlockPos alloyG = util.grid() + .at(3, 3, 3); + BlockPos andeG = util.grid() + .at(4, 3, 3); + BlockPos nuggG = util.grid() + .at(4, 2, 3); + BlockPos ironG = util.grid() + .at(5, 2, 3); + BlockPos rawIronG = util.grid() + .at(6, 3, 3); + BlockPos dioriteG = util.grid() + .at(5, 3, 3); + BlockPos planksG = util.grid() + .at(3, 4, 3); + BlockPos logsG = util.grid() + .at(4, 4, 3); + BlockPos cogG = util.grid() + .at(2, 2, 3); + BlockPos quartzG = util.grid() + .at(6, 4, 3); + BlockPos cobbleG = util.grid() + .at(5, 4, 3); + + ElementLink floorL = scene.world() + .showIndependentSection(fakeFloor, Direction.UP); + scene.world() + .moveSection(floorL, util.vector() + .of(0, -6, 0), 0); + scene.idle(10); + + setPanelVisible(builder, alloyG, PanelSlot.TOP_RIGHT, false); + setPanelPassive(builder, alloyG, PanelSlot.BOTTOM_LEFT); + removePanelConnections(builder, alloyG, PanelSlot.BOTTOM_LEFT); + setPanelItem(builder, alloyG, PanelSlot.BOTTOM_LEFT, ItemStack.EMPTY); + + scene.world() + .showSection(scaff1, Direction.DOWN); + scene.idle(5); + scene.world() + .showSection(board1, Direction.DOWN); + scene.idle(10); + scene.world() + .showSection(util.select() + .position(alloyG), Direction.SOUTH); + scene.idle(25); + + Vec3 panelM = util.vector() + .of(3.75, 3.25, 4); + scene.overlay() + .showText(60) + .text("Whenever gauges are not placed on a packager...") + .attachKeyFrame() + .placeNearTarget() + .pointAt(panelM); + scene.idle(50); + + scene.world() + .showSection(vault, Direction.NORTH); + scene.idle(5); + scene.world() + .showSection(packS, Direction.EAST); + scene.idle(15); + + scene.overlay() + .showOutlineWithText(vault, 100) + .text("They will instead monitor stock levels of all linked inventories") + .attachKeyFrame() + .colored(PonderPalette.BLUE) + .placeNearTarget() + .pointAt(util.vector() + .of(4, 3, 7)); + scene.idle(110); + + ItemStack monitorItem = AllItems.ANDESITE_ALLOY.asStack(); + scene.overlay() + .showControls(panelM, Pointing.DOWN, 50) + .withItem(monitorItem) + .rightClick(); + scene.idle(7); + + setPanelItem(builder, alloyG, PanelSlot.BOTTOM_LEFT, monitorItem); + + scene.overlay() + .showText(80) + .text("Right-click it with the item that should be monitored") + .attachKeyFrame() + .placeNearTarget() + .pointAt(panelM); + scene.idle(90); + + scene.overlay() + .showOutlineWithText(vault, 100) + .text("It will now display the total amount present on the network") + .colored(PonderPalette.BLUE) + .placeNearTarget() + .pointAt(panelM); + + scene.idle(100); + + scene.world() + .showSection(mixer, Direction.WEST); + scene.world() + .showSection(basin, Direction.WEST); + scene.idle(20); + + scene.overlay() + .showText(110) + .text("The gauge can replenish stock levels by sending other items to be processed") + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector() + .blockSurface(util.grid() + .at(7, 1, 1), Direction.WEST)); + scene.idle(120); + + setPanelPassive(builder, andeG, PanelSlot.BOTTOM_LEFT); + removePanelConnections(builder, andeG, PanelSlot.BOTTOM_LEFT); + setPanelPassive(builder, nuggG, PanelSlot.TOP_LEFT); + removePanelConnections(builder, nuggG, PanelSlot.TOP_LEFT); + + scene.world() + .showSection(util.select() + .position(andeG), Direction.SOUTH); + scene.idle(5); + scene.world() + .showSection(util.select() + .position(nuggG), Direction.SOUTH); + scene.idle(20); + + scene.overlay() + .showText(70) + .text("First, add the required ingredients as new factory gauges") + .attachKeyFrame() + .placeNearTarget() + .pointAt(panelM.add(1, -0.5, 0)); + scene.idle(80); + + scene.world() + .multiplyKineticSpeed(util.select() + .fromTo(6, 0, 1, 1, 0, 7), 2); + + scene.overlay() + .showControls(panelM, Pointing.DOWN, 40) + .rightClick(); + scene.idle(7); + AABB boundingBox = new AABB(panelM, panelM).inflate(0.19, 0.19, 0); + scene.overlay() + .chaseBoundingBoxOutline(PonderPalette.BLUE, alloyG, boundingBox, 100); + scene.overlay() + .showText(70) + .text("From the target's UI, new connections can be made") + .attachKeyFrame() + .placeNearTarget() + .pointAt(panelM); + scene.idle(40); + scene.overlay() + .showControls(panelM, Pointing.DOWN, 40) + .showing(AllIcons.I_ADD); + scene.idle(50); + + scene.overlay() + .showControls(panelM.add(1, -0.5, 0), Pointing.DOWN, 50) + .rightClick(); + scene.idle(7); + scene.overlay() + .chaseBoundingBoxOutline(PonderPalette.GREEN, nuggG, boundingBox.move(1, -.5, 0), 40); + scene.overlay() + .chaseBoundingBoxOutline(PonderPalette.GREEN, alloyG, boundingBox, 40); + scene.idle(10); + + addPanelConnection(builder, alloyG, PanelSlot.BOTTOM_LEFT, nuggG, PanelSlot.TOP_LEFT); + setArrowMode(builder, alloyG, PanelSlot.BOTTOM_LEFT, nuggG, PanelSlot.TOP_LEFT, 1); + scene.idle(45); + + scene.overlay() + .showControls(panelM, Pointing.DOWN, 40) + .showing(AllIcons.I_ADD); + scene.idle(50); + scene.overlay() + .showControls(panelM.add(1, 0, 0), Pointing.DOWN, 50) + .rightClick(); + scene.idle(7); + scene.overlay() + .chaseBoundingBoxOutline(PonderPalette.GREEN, andeG, boundingBox.move(1, 0, 0), 40); + scene.overlay() + .chaseBoundingBoxOutline(PonderPalette.GREEN, alloyG, boundingBox, 40); + scene.idle(10); + + addPanelConnection(builder, alloyG, PanelSlot.BOTTOM_LEFT, andeG, PanelSlot.BOTTOM_LEFT); + scene.idle(45); + + scene.overlay() + .showText(70) + .text("For aesthetics, input panels can be wrenched to change the pathing") + .colored(PonderPalette.BLUE) + .attachKeyFrame() + .placeNearTarget() + .pointAt(panelM.add(1, -0.5, 0)); + scene.idle(80); + + scene.overlay() + .showControls(panelM.add(1.125, -0.5, 0), Pointing.RIGHT, 50) + .rightClick() + .withItem(AllItems.WRENCH.asStack()); + scene.idle(7); + setArrowMode(builder, alloyG, PanelSlot.BOTTOM_LEFT, nuggG, PanelSlot.TOP_LEFT, 2); + scene.idle(60); + + scene.overlay() + .showControls(panelM, Pointing.DOWN, 100) + .rightClick(); + scene.idle(7); + scene.overlay() + .chaseBoundingBoxOutline(PonderPalette.BLUE, alloyG, boundingBox, 100); + scene.overlay() + .showText(110) + .text("In the UI, review the inputs and specify how much of the output gets made per batch") + .attachKeyFrame() + .placeNearTarget() + .pointAt(panelM); + scene.idle(120); + scene.overlay() + .showText(80) + .text("Specify the address that ingredients should be sent to") + .attachKeyFrame() + .placeNearTarget() + .pointAt(panelM); + scene.idle(70); + + scene.world() + .showSection(belt1, Direction.DOWN); + scene.idle(1); + scene.world() + .setBlocks(util.select() + .fromTo(1, 6, 7, 1, 6, 2), Blocks.AIR.defaultBlockState(), false); + scene.idle(3); + scene.world() + .showSection(belt2, Direction.DOWN); + scene.idle(1); + scene.world() + .setBlocks(util.select() + .fromTo(1, 6, 1, 3, 6, 1), Blocks.AIR.defaultBlockState(), false); + scene.idle(3); + scene.world() + .showSection(saw, Direction.DOWN); + scene.idle(1); + scene.world() + .setBlocks(util.select() + .position(4, 6, 1), Blocks.AIR.defaultBlockState(), false); + scene.idle(3); + scene.world() + .showSection(belt3, Direction.DOWN); + scene.idle(1); + scene.world() + .setBlocks(util.select() + .fromTo(5, 6, 1, 6, 6, 1), Blocks.AIR.defaultBlockState(), false); + scene.idle(20); + + scene.overlay() + .showControls(panelM, Pointing.DOWN, 100) + .rightClick(); + scene.idle(7); + scene.overlay() + .chaseBoundingBoxOutline(PonderPalette.GREEN, alloyG, boundingBox, 100); + scene.overlay() + .showText(100) + .text("The target amount to maintain can now be set by holding Right-click on the gauge") + .attachKeyFrame() + .colored(PonderPalette.GREEN) + .placeNearTarget() + .pointAt(panelM); + scene.idle(110); + + setPanelNotSatisfied(builder, alloyG, PanelSlot.BOTTOM_LEFT); + scene.idle(20); + + scene.overlay() + .showOutlineWithText(vault, 80) + .text("Whenever the network has fewer items than the amount...") + .colored(PonderPalette.BLUE) + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector() + .of(4, 3, 7)); + + scene.idle(90); + PonderHilo.linkEffect(scene, link); + ItemStack andesiteItem = new ItemStack(Items.ANDESITE); + ItemStack nuggetItem = new ItemStack(Items.IRON_NUGGET); + ItemStack box = PackageItem.containing(List.of(andesiteItem, nuggetItem)); + PonderHilo.packagerCreate(scene, pack, box); + flash(builder, alloyG, PanelSlot.BOTTOM_LEFT); + scene.idle(20); + + scene.overlay() + .showText(70) + .text("...it will send new ingredients to the specified address") + .colored(PonderPalette.BLUE) + .placeNearTarget() + .attachKeyFrame() + .pointAt(util.vector() + .blockSurface(pack, Direction.WEST)); + scene.idle(80); + + scene.world() + .showSection(funnel1, Direction.DOWN); + scene.idle(5); + scene.world() + .showSection(funnel2, Direction.DOWN); + scene.idle(10); + + scene.world() + .createItemOnBelt(util.grid() + .at(1, 0, 7), Direction.EAST, box); + PonderHilo.packagerClear(scene, pack); + scene.idle(75); + scene.world() + .removeItemsFromBelt(util.grid() + .at(6, 0, 1)); + scene.world() + .flapFunnel(util.grid() + .at(6, 1, 1), false); + scene.idle(8); + scene.world() + .removeItemsFromBelt(util.grid() + .at(6, 0, 1)); + scene.world() + .flapFunnel(util.grid() + .at(6, 1, 1), false); + + scene.idle(5); + Class type = MechanicalMixerBlockEntity.class; + scene.world() + .modifyBlockEntity(util.grid() + .at(7, 3, 1), type, pte -> pte.startProcessingBasin()); + scene.world() + .createItemOnBeltLike(util.grid() + .at(7, 1, 1), Direction.UP, andesiteItem); + scene.world() + .createItemOnBeltLike(util.grid() + .at(7, 1, 1), Direction.UP, nuggetItem); + scene.idle(20); + + scene.world() + .showSection(basinOut, Direction.DOWN); + scene.idle(1); + scene.world() + .setBlocks(util.select() + .fromTo(7, 6, 2, 7, 6, 3), Blocks.AIR.defaultBlockState(), false); + scene.world() + .showSection(barrelAndPackager, Direction.DOWN); + + scene.idle(20); + scene.world() + .modifyBlockEntityNBT(basin, BasinBlockEntity.class, nbt -> { + nbt.put("VisualizedItems", + NBTHelper.writeCompoundList( + ImmutableList.of(IntAttached.with(1, AllItems.ANDESITE_ALLOY.asStack())), ia -> ia.getValue() + .serializeNBT())); + }); + scene.idle(4); + scene.rotateCameraY(90); + scene.idle(40); + + scene.overlay() + .showText(90) + .text("The outputs then need to return to any of the linked inventories") + .colored(PonderPalette.BLUE) + .placeNearTarget() + .attachKeyFrame() + .pointAt(util.vector() + .blockSurface(util.grid() + .at(7, 1, 3), Direction.UP)); + scene.idle(70); + + scene.world() + .showSection(belt4, Direction.DOWN); + scene.idle(1); + scene.world() + .setBlocks(util.select() + .fromTo(7, 6, 5, 7, 6, 7), Blocks.AIR.defaultBlockState(), false); + scene.world() + .showSection(pack2S, Direction.DOWN); + scene.idle(5); + scene.world() + .showSection(funnel3, Direction.DOWN); + scene.idle(10); + scene.world() + .toggleRedstonePower(util.select() + .fromTo(7, 1, 4, 7, 2, 4)); + scene.effects() + .indicateRedstone(util.grid() + .at(7, 2, 4)); + ItemStack box2 = PackageItem.containing(List.of()); + PonderHilo.packagerCreate(scene, util.grid() + .at(7, 1, 4), box2); + scene.idle(20); + PonderHilo.packagerClear(scene, util.grid() + .at(7, 1, 4)); + scene.world() + .createItemOnBelt(util.grid() + .at(7, 0, 5), Direction.NORTH, box2); + scene.idle(35); + scene.world() + .removeItemsFromBelt(util.grid() + .at(7, 0, 7)); + scene.world() + .flapFunnel(util.grid() + .at(7, 1, 7), false); + PonderHilo.packagerUnpack(scene, util.grid() + .at(6, 1, 7), box2); + scene.idle(20); + setPanelSatisfied(scene, alloyG, PanelSlot.BOTTOM_LEFT); + + scene.rotateCameraY(-90); + scene.idle(40); + + scene.overlay() + .showText(110) + .text("Green connections indicate that the target amount has been reached") + .attachKeyFrame() + .colored(PonderPalette.GREEN) + .placeNearTarget() + .pointAt(panelM.add(0.5, 0, 0)); + scene.idle(120); + + scene.world() + .hideSection(mixer, Direction.EAST); + scene.world() + .hideSection(basin, Direction.EAST); + scene.world() + .hideSection(basinOut, Direction.UP); + scene.idle(3); + scene.world() + .hideSection(barrelAndPackager, Direction.EAST); + scene.world() + .hideSection(funnel1, Direction.UP); + scene.world() + .hideSection(util.select() + .position(6, 1, 1), Direction.UP); + scene.world() + .hideSection(util.select() + .position(7, 1, 5), Direction.UP); + scene.world() + .hideSection(util.select() + .fromTo(6, 0, 1, 1, 0, 1), Direction.DOWN); + scene.world() + .hideSection(util.select() + .fromTo(1, 0, 7, 1, 0, 2), Direction.DOWN); + scene.idle(5); + scene.world() + .restoreBlocks(util.select() + .fromTo(6, 6, 1, 1, 6, 1)); + scene.world() + .restoreBlocks(util.select() + .fromTo(1, 6, 7, 1, 6, 2)); + scene.world() + .restoreBlocks(util.select() + .fromTo(7, 6, 4, 7, 6, 1)); + scene.idle(15); + + scene.world() + .showSection(scaff2, Direction.DOWN); + ElementLink scaffL = scene.world() + .showIndependentSection(scaff2, Direction.DOWN); + scene.world() + .moveSection(scaffL, util.vector() + .of(4, 0, 0), 0); + scene.idle(10); + scene.world() + .showSection(board2, Direction.DOWN); + scene.idle(10); + + setPanelPassive(builder, ironG, PanelSlot.TOP_LEFT); + removePanelConnections(builder, ironG, PanelSlot.TOP_LEFT); + scene.world() + .showSection(util.select() + .position(ironG), Direction.SOUTH); + scene.idle(15); + + addPanelConnection(builder, nuggG, PanelSlot.TOP_LEFT, ironG, PanelSlot.TOP_LEFT); + setPanelNotSatisfied(builder, nuggG, PanelSlot.TOP_LEFT); + scene.idle(15); + + scene.overlay() + .showText(110) + .text("The board of gauges can expand to include more recipe steps") + .attachKeyFrame() + .colored(PonderPalette.BLUE) + .placeNearTarget() + .pointAt(panelM.add(1, -0.5, 0)); + scene.idle(120); + + setPanelPassive(builder, dioriteG, PanelSlot.TOP_LEFT); + removePanelConnections(builder, dioriteG, PanelSlot.TOP_LEFT); + scene.world() + .showSection(util.select() + .position(dioriteG), Direction.SOUTH); + scene.idle(5); + setPanelPassive(builder, cobbleG, PanelSlot.TOP_LEFT); + removePanelConnections(builder, cobbleG, PanelSlot.TOP_LEFT); + scene.world() + .showSection(util.select() + .position(cobbleG), Direction.SOUTH); + scene.idle(10); + + addPanelConnection(builder, andeG, PanelSlot.BOTTOM_LEFT, dioriteG, PanelSlot.TOP_LEFT); + setPanelNotSatisfied(builder, andeG, PanelSlot.BOTTOM_LEFT); + scene.idle(5); + addPanelConnection(builder, andeG, PanelSlot.BOTTOM_LEFT, cobbleG, PanelSlot.TOP_LEFT); + setArrowMode(builder, andeG, PanelSlot.BOTTOM_LEFT, cobbleG, PanelSlot.TOP_LEFT, 2); + setPanelNotSatisfied(builder, andeG, PanelSlot.BOTTOM_LEFT); + scene.idle(15); + + removePanelConnections(builder, quartzG, PanelSlot.BOTTOM_RIGHT); + removePanelConnections(builder, logsG, PanelSlot.TOP_LEFT); + removePanelConnections(builder, alloyG, PanelSlot.TOP_RIGHT); + removePanelConnections(builder, logsG, PanelSlot.BOTTOM_RIGHT); + removePanelConnections(builder, planksG, PanelSlot.BOTTOM_RIGHT); + removePanelConnections(builder, rawIronG, PanelSlot.BOTTOM_RIGHT); + removePanelConnections(builder, cogG, PanelSlot.TOP_LEFT); + + scene.overlay() + .showText(110) + .text("Each gauge maintains the stock level of its item independently") + .attachKeyFrame() + .colored(PonderPalette.BLUE) + .placeNearTarget() + .pointAt(panelM.add(1, 0, 0)); + scene.idle(120); + + setPanelPassive(builder, quartzG, PanelSlot.BOTTOM_RIGHT); + scene.world() + .showSection(util.select() + .position(quartzG), Direction.SOUTH); + scene.idle(15); + + addPanelConnection(builder, dioriteG, PanelSlot.TOP_LEFT, quartzG, PanelSlot.BOTTOM_RIGHT); + addPanelConnection(builder, dioriteG, PanelSlot.TOP_LEFT, cobbleG, PanelSlot.TOP_LEFT); + setPanelNotSatisfied(builder, dioriteG, PanelSlot.TOP_LEFT); + scene.idle(5); + + scene.world() + .showSection(util.select() + .position(logsG), Direction.SOUTH); + scene.idle(10); + + scene.world() + .showSection(util.select() + .position(rawIronG), Direction.SOUTH); + + scene.idle(4); + setPanelVisible(builder, alloyG, PanelSlot.TOP_RIGHT, true); + scene.idle(1); + addPanelConnection(builder, logsG, PanelSlot.BOTTOM_RIGHT, logsG, PanelSlot.TOP_LEFT); + setPanelNotSatisfied(builder, logsG, PanelSlot.BOTTOM_RIGHT); + scene.world() + .showSection(util.select() + .position(planksG), Direction.SOUTH); + scene.idle(5); + scene.world() + .showSection(util.select() + .position(cogG), Direction.SOUTH); + addPanelConnection(builder, alloyG, PanelSlot.TOP_RIGHT, alloyG, PanelSlot.BOTTOM_LEFT); + setPanelNotSatisfied(builder, alloyG, PanelSlot.TOP_RIGHT); + scene.idle(5); + addPanelConnection(builder, ironG, PanelSlot.TOP_LEFT, rawIronG, PanelSlot.BOTTOM_RIGHT); + setPanelNotSatisfied(builder, ironG, PanelSlot.TOP_LEFT); + scene.idle(5); + addPanelConnection(builder, planksG, PanelSlot.BOTTOM_RIGHT, logsG, PanelSlot.BOTTOM_RIGHT); + setPanelNotSatisfied(builder, planksG, PanelSlot.BOTTOM_RIGHT); + scene.idle(5); + addPanelConnection(builder, cogG, PanelSlot.TOP_LEFT, planksG, PanelSlot.BOTTOM_RIGHT); + addPanelConnection(builder, cogG, PanelSlot.TOP_LEFT, alloyG, PanelSlot.TOP_RIGHT); + setPanelNotSatisfied(builder, cogG, PanelSlot.TOP_LEFT); + + } + + public static void crafting(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); + scene.title("factory_gauge_crafting", "Automatic Crafting with Factory Gauges"); + scene.configureBasePlate(0, 0, 9); + scene.scaleSceneView(0.925f); + scene.setSceneOffsetY(-0.5f); + scene.showBasePlate(); + + Selection scaff = util.select() + .fromTo(3, 1, 5, 1, 1, 5); + Selection board = util.select() + .fromTo(3, 2, 5, 1, 3, 5); + FactoryPanelPosition pickG = new FactoryPanelPosition(util.grid() + .at(1, 3, 4), PanelSlot.BOTTOM_LEFT); + FactoryPanelPosition stickG = new FactoryPanelPosition(util.grid() + .at(2, 2, 4), PanelSlot.TOP_LEFT); + FactoryPanelPosition diaG = new FactoryPanelPosition(util.grid() + .at(3, 3, 4), PanelSlot.BOTTOM_RIGHT); + + BlockPos funnelToDelete = util.grid() + .at(1, 2, 1); + scene.world() + .setBlock(funnelToDelete, Blocks.AIR.defaultBlockState(), false); + + Selection belt1 = util.select() + .fromTo(0, 1, 1, 7, 1, 1); + Selection belt2 = util.select() + .fromTo(7, 1, 7, 0, 1, 7); + Selection repacker = util.select() + .fromTo(1, 2, 1, 4, 3, 1); + Selection crafterBits = util.select() + .fromTo(6, 1, 3, 7, 1, 3); + Selection crafter = util.select() + .fromTo(6, 1, 2, 6, 4, 4) + .substract(crafterBits); + BlockPos pack = util.grid() + .at(6, 2, 1); + Selection packS = util.select() + .position(6, 2, 1); + Selection cogs1 = util.select() + .fromTo(7, 1, 2, 8, 1, 2); + Selection cogs2 = util.select() + .fromTo(7, 1, 6, 8, 1, 6); + Selection largeCog1 = util.select() + .position(9, 0, 2); + Selection largeCog2 = util.select() + .position(9, 0, 6); + Selection barrel = util.select() + .fromTo(6, 1, 5, 6, 2, 5); + Selection outPacker = util.select() + .fromTo(6, 1, 6, 6, 3, 6) + .add(util.select() + .position(5, 2, 6)); + Selection outFunnel = util.select() + .position(6, 2, 7); + + scene.idle(10); + scene.world() + .showSection(scaff, Direction.NORTH); + scene.world() + .showSection(board, Direction.DOWN); + scene.idle(10); + scene.world() + .showSection(crafterBits, Direction.WEST); + scene.world() + .showSection(largeCog1, Direction.UP); + scene.world() + .showSection(cogs1, Direction.SOUTH); + scene.idle(5); + scene.world() + .showSection(crafter, Direction.DOWN); + scene.idle(15); + + scene.overlay() + .showText(100) + .text("Factory gauges provide auto-arrangement for crafting table recipes") + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector() + .blockSurface(util.grid() + .at(6, 3, 3), Direction.WEST)); + scene.idle(110); + + removePanelConnections(builder, pickG.pos(), pickG.slot()); + setPanelPassive(builder, pickG.pos(), pickG.slot()); + + scene.world() + .showSection(util.select() + .position(diaG.pos()), Direction.SOUTH); + scene.idle(5); + scene.world() + .showSection(util.select() + .position(stickG.pos()), Direction.SOUTH); + scene.idle(5); + scene.world() + .showSection(util.select() + .position(pickG.pos()), Direction.SOUTH); + scene.idle(15); + addPanelConnection(builder, pickG.pos(), pickG.slot(), diaG.pos(), diaG.slot()); + scene.idle(5); + addPanelConnection(builder, pickG.pos(), pickG.slot(), stickG.pos(), stickG.slot()); + scene.idle(5); + + Vec3 midl = util.vector() + .of(1.75, 3.25, 5); + scene.overlay() + .showText(60) + .text("Connect the required ingredients as before") + .attachKeyFrame() + .placeNearTarget() + .pointAt(midl); + scene.idle(80); + + scene.overlay() + .showControls(midl, Pointing.DOWN, 120) + .showing(AllIcons.I_3x3); + scene.idle(7); + AABB boundingBox = new AABB(midl, midl).inflate(0.19, 0.19, 0); + scene.overlay() + .chaseBoundingBoxOutline(PonderPalette.BLUE, pickG, boundingBox, 100); + scene.idle(10); + scene.overlay() + .showText(90) + .text("When a valid recipe is detected, a new button appears in the UI") + .attachKeyFrame() + .colored(PonderPalette.BLUE) + .placeNearTarget() + .pointAt(midl); + scene.idle(100); + + scene.world() + .showSection(belt1, Direction.SOUTH); + scene.world() + .showSection(packS, Direction.DOWN); + scene.idle(30); + + scene.overlay() + .showText(120) + .text("With auto-arrangement active, the boxes can be unwrapped into crafters directly") + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector() + .blockSurface(util.grid() + .at(6, 2, 1), Direction.WEST)); + scene.idle(130); + scene.rotateCameraY(90); + scene.idle(40); + + scene.overlay() + .showControls(util.vector() + .blockSurface(util.grid() + .at(6, 3, 4), Direction.EAST), + Pointing.RIGHT, 120) + .rightClick() + .withItem(AllItems.WRENCH.asStack()); + scene.idle(7); + + scene.world() + .connectCrafterInvs(util.grid() + .at(6, 4, 4), + util.grid() + .at(6, 4, 3)); + scene.world() + .connectCrafterInvs(util.grid() + .at(6, 4, 3), + util.grid() + .at(6, 4, 2)); + scene.world() + .connectCrafterInvs(util.grid() + .at(6, 4, 4), + util.grid() + .at(6, 3, 4)); + scene.world() + .connectCrafterInvs(util.grid() + .at(6, 4, 3), + util.grid() + .at(6, 3, 3)); + scene.world() + .connectCrafterInvs(util.grid() + .at(6, 4, 2), + util.grid() + .at(6, 3, 2)); + scene.world() + .connectCrafterInvs(util.grid() + .at(6, 3, 4), + util.grid() + .at(6, 2, 4)); + scene.world() + .connectCrafterInvs(util.grid() + .at(6, 3, 3), + util.grid() + .at(6, 2, 3)); + scene.world() + .connectCrafterInvs(util.grid() + .at(6, 3, 2), + util.grid() + .at(6, 2, 2)); + for (int y = 0; y < 3; y++) + for (int z = 0; z < 3; z++) + scene.effects() + .indicateSuccess(util.grid() + .at(6, 2 + y, 2 + z)); + scene.idle(20); + + scene.overlay() + .showOutlineWithText(util.select() + .fromTo(6, 2, 2, 6, 4, 4), 100) + .text("The setup must be 3x3 and the crafters have to be connected via wrench") + .attachKeyFrame() + .colored(PonderPalette.GREEN) + .placeNearTarget() + .pointAt(util.vector() + .blockSurface(util.grid() + .at(6, 3, 2), Direction.NORTH)); + + scene.idle(100); + scene.rotateCameraY(-90); + scene.idle(20); + scene.world() + .showSection(util.select() + .position(5, 2, 1), Direction.DOWN); + scene.idle(10); + scene.world() + .showSection(barrel, Direction.NORTH); + scene.idle(20); + + scene.overlay() + .showControls(midl, Pointing.DOWN, 60) + .rightClick(); + scene.idle(7); + scene.overlay() + .chaseBoundingBoxOutline(PonderPalette.GREEN, pickG, boundingBox, 100); + scene.overlay() + .showText(60) + .text("Hold Right-click on the gauge to set the target amount") + .attachKeyFrame() + .colored(PonderPalette.GREEN) + .placeNearTarget() + .pointAt(midl); + + scene.idle(70); + setPanelNotSatisfied(builder, pickG.pos(), pickG.slot()); + scene.idle(10); + ItemStack box = PackageItem.containing(List.of()); + scene.world() + .createItemOnBelt(util.grid() + .at(0, 1, 1), Direction.WEST, box); + scene.idle(40); + scene.world() + .removeItemsFromBelt(util.grid() + .at(5, 1, 1)); + scene.world() + .flapFunnel(util.grid() + .at(5, 2, 1), false); + PonderHilo.packagerUnpack(scene, pack, box); + scene.rotateCameraY(-15); + scene.idle(15); + + insertItemsIntoCrafter(scene, util.grid() + .at(6, 4, 2), new ItemStack(Items.DIAMOND)); + insertItemsIntoCrafter(scene, util.grid() + .at(6, 4, 3), new ItemStack(Items.DIAMOND)); + insertItemsIntoCrafter(scene, util.grid() + .at(6, 4, 4), new ItemStack(Items.DIAMOND)); + insertItemsIntoCrafter(scene, util.grid() + .at(6, 3, 3), new ItemStack(Items.STICK)); + insertItemsIntoCrafter(scene, util.grid() + .at(6, 2, 3), new ItemStack(Items.STICK)); + scene.world() + .setCraftingResult(util.grid() + .at(6, 2, 4), new ItemStack(Items.DIAMOND_PICKAXE)); + scene.world() + .modifyBlockEntity(util.grid() + .at(6, 3, 2), MechanicalCrafterBlockEntity.class, be -> be.checkCompletedRecipe(true)); + + scene.idle(60); + scene.overlay() + .showText(120) + .text("This crafter can now be used universally, by more gauges with different recipes") + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector() + .blockSurface(util.grid() + .at(6, 3, 4), Direction.WEST)); + + scene.idle(120); + + scene.world() + .showSection(outPacker, Direction.NORTH); + scene.idle(20); + scene.rotateCameraY(15); + scene.world() + .toggleRedstonePower(util.select() + .fromTo(6, 2, 6, 6, 3, 6)); + scene.effects() + .indicateRedstone(util.grid() + .at(6, 3, 6)); + scene.world() + .showSection(belt2, Direction.NORTH); + scene.world() + .showSection(outFunnel, Direction.DOWN); + scene.world() + .showSection(largeCog2, Direction.UP); + scene.world() + .showSection(cogs2, Direction.WEST); + scene.world() + .restoreBlocks(util.select() + .position(funnelToDelete)); + scene.idle(15); + ItemStack box2 = PackageItem.containing(List.of()); + PonderHilo.packagerCreate(scene, util.grid() + .at(6, 2, 6), box2); + scene.idle(20); + PonderHilo.packagerClear(scene, util.grid() + .at(6, 2, 6)); + scene.world() + .createItemOnBelt(util.grid() + .at(6, 1, 7), Direction.NORTH, box2); + + scene.overlay() + .showText(100) + .text("Outputs should be sent back to a linked inventory to close the loop") + .attachKeyFrame() + .colored(PonderPalette.BLUE) + .placeNearTarget() + .pointAt(util.vector() + .blockSurface(util.grid() + .at(6, 2, 6), Direction.WEST)); + + scene.idle(45); + PonderHilo.packageHopsOffBelt(scene, util.grid() + .at(0, 1, 7), Direction.WEST, box2); + scene.idle(50); + + scene.world() + .showSection(repacker, Direction.DOWN); + scene.idle(20); + + scene.overlay() + .showText(120) + .text("Using a Re-packager is recommended to prevent fragmentation of input packages") + .attachKeyFrame() + .colored(PonderPalette.BLUE) + .placeNearTarget() + .pointAt(util.vector() + .blockSurface(util.grid() + .at(3, 2, 1), Direction.NORTH)); + scene.idle(120); + } + + public static void links(SceneBuilder builder, SceneBuildingUtil util) { + CreateSceneBuilder scene = new CreateSceneBuilder(builder); + scene.title("factory_gauge_links", "Connecting Gauges to other Blocks"); + scene.setSceneOffsetY(-1f); + scene.configureBasePlate(0, 0, 5); + scene.showBasePlate(); + + Selection scaff = util.select() + .fromTo(3, 1, 2, 1, 1, 2); + Selection board = util.select() + .fromTo(3, 3, 2, 1, 2, 2); + BlockPos link = util.grid() + .at(3, 2, 1); + BlockPos display = util.grid() + .at(1, 2, 1); + BlockPos gauge = util.grid() + .at(2, 3, 1); + Selection linkS = util.select() + .position(3, 2, 1); + Selection displayS = util.select() + .position(1, 2, 1); + Selection gaugeS = util.select() + .position(2, 3, 1); + PanelSlot slot = PanelSlot.TOP_LEFT; + + removePanelConnections(scene, gauge, slot); + scene.idle(10); + scene.world() + .showSection(scaff, Direction.NORTH); + scene.world() + .showSection(board, Direction.DOWN); + scene.idle(10); + scene.world() + .showSection(gaugeS, Direction.SOUTH); + scene.idle(20); + + Vec3 midl = util.vector() + .of(2.75, 3.75, 2); + AABB boundingBox = new AABB(midl, midl).inflate(0.19, 0.19, 0); + scene.overlay() + .showControls(midl, Pointing.DOWN, 60) + .showing(AllIcons.I_ADD); + scene.idle(7); + scene.overlay() + .chaseBoundingBoxOutline(PonderPalette.BLUE, gauge, boundingBox, 100); + scene.idle(10); + scene.overlay() + .showText(70) + .text("When adding a new connection from the UI...") + .attachKeyFrame() + .colored(PonderPalette.BLUE) + .placeNearTarget() + .pointAt(midl); + scene.idle(50); + + scene.world() + .showSection(linkS, Direction.SOUTH); + scene.idle(5); + scene.world() + .showSection(displayS, Direction.SOUTH); + + scene.idle(30); + scene.overlay() + .showControls(util.vector() + .of(4, 2.5, 2), Pointing.RIGHT, 60) + .rightClick(); + + scene.idle(7); + scene.overlay() + .chaseBoundingBoxOutline(PonderPalette.GREEN, link, boundingBox.move(0.75, -1.25, 0) + .inflate(0.15, 0.25, 0), 40); + scene.overlay() + .chaseBoundingBoxOutline(PonderPalette.GREEN, gauge, boundingBox, 40); + + addPanelConnection(builder, gauge, slot, link, PanelSlot.TOP_RIGHT); + setArrowMode(builder, gauge, slot, link, PanelSlot.TOP_RIGHT, 0); + scene.idle(20); + + scene.overlay() + .showText(70) + .text("...the gauge also accepts Redstone and Display Links") + .attachKeyFrame() + .colored(PonderPalette.BLUE) + .placeNearTarget() + .pointAt(midl.add(0.5, -1.5, 0)); + scene.idle(80); + + setPanelSatisfied(builder, gauge, slot); + scene.world() + .toggleRedstonePower(util.select() + .position(3, 2, 1)); + scene.effects() + .indicateRedstone(util.grid() + .at(3, 2, 1)); + scene.idle(40); + + scene.overlay() + .showText(120) + .text("Redstone links will be powered when the stock level is at or above the target amount") + .attachKeyFrame() + .placeNearTarget() + .pointAt(midl); + scene.idle(130); + + scene.world() + .toggleRedstonePower(util.select() + .position(3, 2, 1)); + setPanelNotSatisfied(builder, gauge, slot); + + scene.idle(30); + scene.overlay() + .showControls(util.vector() + .of(4, 2.5, 2), Pointing.RIGHT, 60) + .withItem(AllItems.WRENCH.asStack()) + .rightClick(); + scene.idle(7); + scene.world() + .cycleBlockProperty(util.grid() + .at(3, 2, 1), RedstoneLinkBlock.RECEIVER); + scene.idle(30); + + scene.world() + .toggleRedstonePower(util.select() + .position(3, 2, 1)); + scene.effects() + .indicateRedstone(util.grid() + .at(3, 2, 1)); + setPanelPowered(builder, gauge, slot, true); + scene.idle(30); + + scene.overlay() + .showText(100) + .text("In receiver mode, links can stop the gauge from sending requests") + .attachKeyFrame() + .placeNearTarget() + .pointAt(midl); + scene.idle(130); + + addPanelConnection(builder, gauge, slot, display, slot); + setArrowMode(builder, gauge, slot, display, slot, 2); + + scene.overlay() + .showText(100) + .text("Display links can provide a status overview of connected gauges") + .attachKeyFrame() + .colored(PonderPalette.BLUE) + .placeNearTarget() + .pointAt(util.vector() + .of(1, 3, 1)); + scene.idle(100); + + } + + private static void setPanelItem(SceneBuilder builder, BlockPos gauge, PanelSlot slot, ItemStack item) { + withGaugeDo(builder, gauge, slot, pb -> pb.setFilter(item)); + } + + private static void setPanelPowered(SceneBuilder builder, BlockPos gauge, PanelSlot slot, boolean power) { + withGaugeDo(builder, gauge, slot, pb -> pb.redstonePowered = power); + } + + private static void setPanelVisible(SceneBuilder builder, BlockPos gauge, PanelSlot slot, boolean visible) { + withGaugeDo(builder, gauge, slot, pb -> pb.active = visible); + } + + private static void setPanelNotSatisfied(SceneBuilder builder, BlockPos gauge, PanelSlot slot) { + withGaugeDo(builder, gauge, slot, pb -> pb.count = 2); + } + + private static void flash(SceneBuilder builder, BlockPos gauge, PanelSlot slot) { + withGaugeDo(builder, gauge, slot, pb -> pb.bulb.setValue(1)); + } + + private static void setPanelSatisfied(SceneBuilder builder, BlockPos gauge, PanelSlot slot) { + withGaugeDo(builder, gauge, slot, pb -> pb.count = 1); + } + + private static void setPanelPassive(SceneBuilder builder, BlockPos gauge, PanelSlot slot) { + withGaugeDo(builder, gauge, slot, pb -> pb.count = 0); + } + + private static void removePanelConnections(SceneBuilder builder, BlockPos gauge, PanelSlot slot) { + withGaugeDo(builder, gauge, slot, pb -> pb.disconnectAll()); + } + + private static void setArrowMode(SceneBuilder builder, BlockPos gauge, PanelSlot slot, BlockPos fromGauge, + PanelSlot fromSlot, int mode) { + withGaugeDo(builder, gauge, slot, pb -> { + FactoryPanelConnection connection = pb.targetedBy.get(new FactoryPanelPosition(fromGauge, fromSlot)); + if (connection == null) { + connection = pb.targetedByLinks.get(fromGauge); + if (connection == null) + return; + } + connection.arrowBendMode = mode; + }); + } + + private static void addPanelConnection(SceneBuilder builder, BlockPos gauge, PanelSlot slot, BlockPos fromGauge, + PanelSlot fromSlot) { + withGaugeDo(builder, gauge, slot, pb -> pb.addConnection(new FactoryPanelPosition(fromGauge, fromSlot))); + } + + private static void insertItemsIntoCrafter(CreateSceneBuilder scene, BlockPos pos, ItemStack stack) { + scene.world() + .modifyBlockEntity(pos, MechanicalCrafterBlockEntity.class, be -> be.getInventory() + .setItem(0, stack)); + } + + private static void withGaugeDo(SceneBuilder builder, BlockPos gauge, PanelSlot slot, + Consumer call) { + builder.world() + .modifyBlockEntity(gauge, FactoryPanelBlockEntity.class, be -> call.accept(be.panels.get(slot))); + } + +} diff --git a/src/main/resources/assets/create/ponder/high_logistics/factory_gauge_crafting.nbt b/src/main/resources/assets/create/ponder/high_logistics/factory_gauge_crafting.nbt new file mode 100644 index 0000000000000000000000000000000000000000..7536e7b08e9638b5d6fec9ead98030b7afa13efb GIT binary patch literal 2705 zcmaKnXFMDH7RTEvsv-6sxxJcNHBws43c#^c@Asn0b0x-s&qAv4azbp=F+c1{xZ(mUe54EhD zILZLQbW7ACNL4u$TXuosKRpqJP~lbIn9HaDP8k>42S!&58M|Btv&OEnt%gQsS) zSNR?C*FDrwvQ^NVE+=A~m0L?PO_y{Np}ooSz!C}j`a{L!5x{0rX9igBDv#F1l3Nxb zNyA0+Vo9dh2SDZueDpZW;HFb*aT^7mgjWs7?k% zrMu^ED`qhMLY!t|zG7|b8uN4zX9CYc4pE0rOPw7vRZ$w?9>;QRi0=)H z-^d>7R&g0y_pV9}Y%Wg&Or#EdSl8e&&vALfi8^d?UUh}b>l@Zb-A;Uo(}oM9#TgsEggQY@#j$w)px0%<8y z6@`G!>57(fh=w*qvc(|yW#K>W`H@q%mBSMn6$*w2oWdW(hm&PUf;*HQ+f*Ngg6A7! znJEat1Q&)mffaw=Yaa`r*pf^b#RL;#9k0H2B5BoBem9EAfLZ47kLlRH8v7J%{CeW+ z>+$9kq`!EkI(NCbh)1kYz^N0_%b#o&_AOz@AxRIzE+g&dj0I>lsy!7@EmY8+B@n|E zzqB90FVBz?+9LVqQ@!KVpk$nszno(j;r6nQ^l`>5@P6`CHJ~=pvx=!esTkdx&pO;a zN<{V$`MSbXeH>!`BH^$n^TTH)Z7s)*_qI;=DWH?}#{qDr;OdnRPWDbt^GkL!k7s}x z5dF9^K;7*U;Px?0xZ)mag`VJY9L6Hvr0X6#zM)}7FjnI`?$BH_U`58#zi{l>Cj6a; z_ktuVg=eEbU}l|Ck2R}7+6uLm39H7qapu6UyoR?=TBTYeHdXSi@zV{nW>DCde(AS@ z(We546h?1^MXAKM^GG^Ogs0Y0R{S<8%@!mVsFLKHT&Zgo?HrcHc=@z#=d)8ASM=G& ztBCVcXmje>N%ruT>a(9;$85f}`A9t)Wn1GbXHM>VeSI`qcM|NgmhZFAKvOpJhNbRv zXC540FG+$|=*_-h(}y16I1My}SKedZ+RE(fj_v1&+53K*YpMJ3`-^I^*W>fvn)ChDVZX2b!~Q2a*-|lGnm$eQ!kq&C zPj*jPLuB);mtkfe@+m(V*#IY8;Elrh@9+@{4-NyGSS@~UYM~Xx#`IpJj@GGTFHg$c zU#4D*CiekvoE7il@V!MC%6&vzuVJsK_gGEl8kdI5PSInV7ZU4LS8PT#xQ+`sb(4rg zgEq@)^5v!wKd^oUs`Est+!o(ek;mG--285`dSX`ko+a!x$`qbZOzAPAvyIq!gm}w zqMZ|vHn|3Eox78Y!D{-|iSrL4ALt!r&e=xjxhak-Eo!#ovgcX4J&l^amg61kN@&+- zjk9)dYxPU!1!6rKo)#*(cCj5rl}83XfzK7$vAkqFtvtB1?>cKey{oEz7>VV=>zV*) zM4~?zf6SRTC*8$7_SAkvQCP-tKV!QPm2#=BbmOaXJLT}l|8Pu?-;rw@*=5ni7 zyN=GW%KxxlYo_y>=1-hq4@(XhQo$03LY{d|PcJ@SmZ${OK);)bDxJ*WGbnI8!LVibY2A{NP>J zREeD~vMdE{r|uea&V2cW<-EWH!ThO<9t~JP9iWS=4XEbG{NoU#6riw%Wtyp`EDy~< z7`&z|LB5B=n0#zCn$G{soZ4_*(Qa|^feLGDw_ zW~^X~#lJ*MR4at`|1v3hkj8Lnxne6)84g`Qp9;LY7{JCox}|LEXfGIuFL$8dbbl@x zB_82omLM=MVqr(oRT1oO>yup%yQITZ(}XoeJ~l&Ivfx+sQPj24|5 zBYE%JsOT)2QZ=QqGV;FkOoBu-29^t9J_z2gy<#-q`^dR6sa zb!ifSE<~Dtiy;8mt4&vA?_G#d7;ZRfu)i+soa8b+(+NG?=|WgY?Sq!T5Zc->gH^;P zOt69puEDe#@PrL`q8grHL(S_v9uqX+X*J*p8}LLmJgo*gdrY0q9#f~Y$JFWUF?BjG z{ixybm^z(3rcP&%sngkG>U548=$ z+J*@mU;^LU3MSmZa}|?7C{9cQyKPvRS41JT$+`t?p$Z`>d-}1qann{iU~dC zB?WclAE{Of=sdy{`8m3md(~4mIAvmj8PVK0WZHZtfb1 zFw;f~EE`MUwF8CU%uu9@1Fp1j*#49xNfjHLyNs&<+5>KFc*D zy{cNfQmxMR1Y#qLQI2C0_l+YZr(EM8N2a)#d?HBJbCy%Z7p0s|lp{Gu5{N43y4fIT zbz0j4TWPgddZa%ua5ytGORl!w0ndqZe`=esCDNGNUJvmca~D-w^hD&6WtdqZwR5xc z1>{%y2#CR8;~yE{W6ccI7A&8It2TVtFnXt8VSNCNR6VDAOhG zl=b$NlJk2gGS?n0ubpMx-p~&#Ltkz(v?0gGS2=@I5xN3#x(@bmQk-)g{DkpCzAd)$L-Duq;fg23!pt_xyBe`+FOQ+6d`ywrjI^pjGR_) zmkHippB$aC@mS`imup!%MRg{8h8@z+;@UzgbGqc*v^TeM#men5wT*q__PQb@#Uey= nItSON)3llOQJL6%M}x6@pBeTPl`hw7|9kisAq@XYg9`uvCEDE% literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/ponder/high_logistics/factory_gauge_recipe.nbt b/src/main/resources/assets/create/ponder/high_logistics/factory_gauge_recipe.nbt new file mode 100644 index 0000000000000000000000000000000000000000..01674b6d26f7aeb68e1057273e5a0e6389c9ef5d GIT binary patch literal 3715 zcmYjRbyO2x8&*V6Is}I@x&}xLkQ_*Zl#~*JD5a#75&|OKumRGOkP(iMP6Z|*jF4`S z(J*4LG0KmhzwbNeyZ=1*JyN@?ahBR%)~R*-PCgDt5988SpXfEJc@#Z;qHBoNsg-lkCQuS zZIY8PBjc#p=X_|}P|&CIybkUENlOB)I7j*60U=5(!_sdBkPl&wzBlxEp?%f<>n8_TVPGSuGp27&=B`


U+(WP%VAXksR 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 literal 0 HcmV?d00001 From 86e14b3828e8d50f93949bdb0162298090f9c6bb Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Thu, 16 Jan 2025 19:04:37 -0800 Subject: [PATCH 314/515] Partially complete - Begin work moving fully to partial models - Add rotateToFace and rotateTo methods to RotatingInstance - Port: - ShaftVisual (pulleys, chain drives, press, etc.) - Saw - Hand crank - Valve handle (now a separate visual) - Rope pulley - Flywheel - Where possible in the above visuals, combine the models from different axes/facings --- .../simibubi/create/AllBlockEntityTypes.java | 5 +- .../com/simibubi/create/AllPartialModels.java | 17 +++-- .../contraptions/pulley/RopePulleyVisual.java | 8 +-- .../kinetics/base/RotatingInstance.java | 18 +++++ .../content/kinetics/base/ShaftVisual.java | 12 ++-- .../kinetics/base/SingleRotatingVisual.java | 10 ++- .../kinetics/crank/HandCrankBlockEntity.java | 8 --- .../kinetics/crank/HandCrankVisual.java | 34 +++++----- .../crank/ValveHandleBlockEntity.java | 10 ++- .../kinetics/crank/ValveHandleVisual.java | 66 +++++++++++++++++++ .../deployer/DeployerActorVisual.java | 6 +- .../kinetics/flywheel/FlywheelVisual.java | 41 +++++++----- .../content/kinetics/saw/SawActorVisual.java | 3 +- .../content/kinetics/saw/SawVisual.java | 31 +++++---- 14 files changed, 184 insertions(+), 85 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/kinetics/crank/ValveHandleVisual.java diff --git a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java index 2bbcc0c19e..295b47591a 100644 --- a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java +++ b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java @@ -95,6 +95,7 @@ import com.simibubi.create.content.kinetics.crank.HandCrankBlockEntity; import com.simibubi.create.content.kinetics.crank.HandCrankRenderer; import com.simibubi.create.content.kinetics.crank.HandCrankVisual; import com.simibubi.create.content.kinetics.crank.ValveHandleBlockEntity; +import com.simibubi.create.content.kinetics.crank.ValveHandleVisual; import com.simibubi.create.content.kinetics.crusher.CrushingWheelBlockEntity; import com.simibubi.create.content.kinetics.crusher.CrushingWheelControllerBlockEntity; import com.simibubi.create.content.kinetics.deployer.DeployerBlockEntity; @@ -349,7 +350,7 @@ public class AllBlockEntityTypes { public static final BlockEntityEntry VALVE_HANDLE = REGISTRATE .blockEntity("valve_handle", ValveHandleBlockEntity::new) - .visual(() -> HandCrankVisual::new) + .visual(() -> ValveHandleVisual::new) .validBlocks(AllBlocks.COPPER_VALVE_HANDLE) .validBlocks(AllBlocks.DYED_VALVE_HANDLES.toArray()) .renderer(() -> HandCrankRenderer::new) @@ -506,7 +507,7 @@ public class AllBlockEntityTypes { .validBlocks(AllBlocks.PACKAGER) .renderer(() -> PackagerRenderer::new) .register(); - + public static final BlockEntityEntry REPACKAGER = REGISTRATE .blockEntity("repackager", RepackagerBlockEntity::new) .validBlocks(AllBlocks.REPACKAGER) diff --git a/src/main/java/com/simibubi/create/AllPartialModels.java b/src/main/java/com/simibubi/create/AllPartialModels.java index 553a6ec264..d34d48895d 100644 --- a/src/main/java/com/simibubi/create/AllPartialModels.java +++ b/src/main/java/com/simibubi/create/AllPartialModels.java @@ -26,6 +26,7 @@ public class AllPartialModels { SHAFTLESS_COGWHEEL = block("cogwheel_shaftless"), SHAFTLESS_LARGE_COGWHEEL = block("large_cogwheel_shaftless"), COGWHEEL_SHAFT = block("cogwheel_shaft"), SHAFT_HALF = block("shaft_half"), + SHAFT = block("shaft"), BELT_PULLEY = block("belt_pulley"), BELT_START = block("belt/start"), BELT_MIDDLE = block("belt/middle"), BELT_END = block("belt/end"), BELT_START_BOTTOM = block("belt/start_bottom"), @@ -38,6 +39,8 @@ public class AllPartialModels { BRASS_BELT_COVER_Z = block("belt_cover/brass_belt_cover_z"), ENCASED_FAN_INNER = block("encased_fan/propeller"), HAND_CRANK_HANDLE = block("hand_crank/handle"), + HAND_CRANK_BASE = block("hand_crank/block"), + VALVE_HANDLE = block("valve_handle"), MECHANICAL_PRESS_HEAD = block("mechanical_press/head"), MECHANICAL_MIXER_POLE = block("mechanical_mixer/pole"), MECHANICAL_MIXER_HEAD = block("mechanical_mixer/head"), MECHANICAL_CRAFTER_LID = block("mechanical_crafter/lid"), @@ -71,6 +74,8 @@ public class AllPartialModels { ROPE_COIL = block("rope_pulley/rope_coil"), ROPE_HALF = block("rope_pulley/rope_half"), ROPE_HALF_MAGNET = block("rope_pulley/rope_half_magnet"), + ROPE = block("rope_pulley/rope"), + PULLEY_MAGNET = block("rope_pulley/pulley_magnet"), HOSE_COIL = block("hose_pulley/hose_coil"), HOSE = block("hose_pulley/rope"), HOSE_MAGNET = block("hose_pulley/pulley_magnet"), HOSE_HALF = block("hose_pulley/rope_half"), @@ -85,7 +90,7 @@ public class AllPartialModels { SYMMETRY_TRIPLEPLANE = block("symmetry_effect/tripleplane"), STICKER_HEAD = block("sticker/head"), - + DESK_BELL_PLUNGER = block("desk_bell/plunger"), DESK_BELL_BELL = block("desk_bell/bell"), @@ -127,7 +132,7 @@ public class AllPartialModels { PACKAGER_TRAY_REGULAR = block("packager/tray"), PACKAGER_TRAY_DEFRAG = block("repackager/tray"), PACKAGER_HATCH_OPEN = block("packager/hatch_open"), PACKAGER_HATCH_CLOSED = block("packager/hatch_closed"), - + TABLE_CLOTH_PRICE_SIDE = block("table_cloth/price_tag_side"), TABLE_CLOTH_PRICE_TOP = block("table_cloth/price_tag_top"), @@ -187,7 +192,7 @@ public class AllPartialModels { WATER_WHEEL = block("water_wheel/wheel"), LARGE_WATER_WHEEL = block("large_water_wheel/block"), LARGE_WATER_WHEEL_EXTENSION = block("large_water_wheel/block_extension"), - + FACTORY_PANEL = block("factory_gauge/panel"), FACTORY_PANEL_WITH_BULB = block("factory_gauge/panel_with_bulb"), FACTORY_PANEL_RESTOCKER = block("factory_gauge/panel_restocker"), @@ -199,7 +204,9 @@ public class AllPartialModels { TABLE_CLOTH_NE = block("table_cloth/north_east"), TABLE_CLOTH_SW = block("table_cloth/south_west"), TABLE_CLOTH_SE = block("table_cloth/south_east"), - + + FLYWHEEL = block("flywheel/block"), + CRAFTING_BLUEPRINT_1x1 = entity("crafting_blueprint_small"), CRAFTING_BLUEPRINT_2x2 = entity("crafting_blueprint_medium"), CRAFTING_BLUEPRINT_3x3 = entity("crafting_blueprint_large"), @@ -217,7 +224,7 @@ public class AllPartialModels { public static final Map FACTORY_PANEL_ARROWS = new EnumMap<>(Direction.class); public static final Map FACTORY_PANEL_LINES = new EnumMap<>(Direction.class); public static final Map FACTORY_PANEL_DOTTED = new EnumMap<>(Direction.class); - + public static final Map METAL_GIRDER_BRACKETS = new EnumMap<>(Direction.class); public static final Map TOOLBOX_LIDS = new EnumMap<>(DyeColor.class); public static final Map> FOLDING_DOORS = new HashMap<>(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/pulley/RopePulleyVisual.java b/src/main/java/com/simibubi/create/content/contraptions/pulley/RopePulleyVisual.java index f877d1c652..98ae55a47f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/pulley/RopePulleyVisual.java +++ b/src/main/java/com/simibubi/create/content/contraptions/pulley/RopePulleyVisual.java @@ -22,12 +22,12 @@ public class RopePulleyVisual extends AbstractPulleyVisual { @Override protected Instancer getRopeModel() { - return instancerProvider().instancer(InstanceTypes.TRANSFORMED, VirtualRenderHelper.blockModel(AllBlocks.ROPE.getDefaultState())); + return instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.ROPE)); } @Override protected Instancer getMagnetModel() { - return instancerProvider().instancer(InstanceTypes.TRANSFORMED, VirtualRenderHelper.blockModel(AllBlocks.PULLEY_MAGNET.getDefaultState())); + return instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.PULLEY_MAGNET)); } @Override @@ -54,10 +54,10 @@ public class RopePulleyVisual extends AbstractPulleyVisual { protected boolean isRunning() { return PulleyRenderer.isPulleyRunning(blockEntity); } - + @Override protected SpriteShiftEntry getCoilAnimation() { return AllSpriteShifts.ROPE_PULLEY_COIL; } - + } diff --git a/src/main/java/com/simibubi/create/content/kinetics/base/RotatingInstance.java b/src/main/java/com/simibubi/create/content/kinetics/base/RotatingInstance.java index 9569aac356..f9988a0023 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/base/RotatingInstance.java +++ b/src/main/java/com/simibubi/create/content/kinetics/base/RotatingInstance.java @@ -43,6 +43,24 @@ public class RotatingInstance extends ColoredLitInstance { return 0xFFFFFF; } + public RotatingInstance rotateToFace(Direction.Axis axis) { + Direction orientation = Direction.get(Direction.AxisDirection.POSITIVE, axis); + return rotateToFace(orientation); + } + + public RotatingInstance rotateToFace(Direction orientation) { + return rotateToFace(orientation.getStepX(), orientation.getStepY(), orientation.getStepZ()); + } + + public RotatingInstance rotateToFace(float stepX, float stepY, float stepZ) { + return rotateTo(0, 1, 0, stepX, stepY, stepZ); + } + + public RotatingInstance rotateTo(float fromX, float fromY, float fromZ, float toX, float toY, float toZ) { + rotation.rotateTo(fromX, fromY, fromZ, toX, toY, toZ); + return this; + } + public RotatingInstance setRotationAxis(Direction.Axis axis) { Direction orientation = Direction.get(Direction.AxisDirection.POSITIVE, axis); return setRotationAxis(orientation.step()); diff --git a/src/main/java/com/simibubi/create/content/kinetics/base/ShaftVisual.java b/src/main/java/com/simibubi/create/content/kinetics/base/ShaftVisual.java index a6c7fad018..3af17a4a71 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/base/ShaftVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/base/ShaftVisual.java @@ -1,8 +1,10 @@ package com.simibubi.create.content.kinetics.base; -import dev.engine_room.flywheel.api.model.Model; +import com.simibubi.create.AllPartialModels; +import com.simibubi.create.foundation.render.AllInstanceTypes; + import dev.engine_room.flywheel.api.visualization.VisualizationContext; -import net.createmod.catnip.render.VirtualRenderHelper; +import dev.engine_room.flywheel.lib.model.Models; public class ShaftVisual extends SingleRotatingVisual { @@ -11,7 +13,9 @@ public class ShaftVisual extends SingleRotatingVis } @Override - protected Model model() { - return VirtualRenderHelper.blockModel(shaft()); + public RotatingInstance createRotatingInstance() { + return instancerProvider().instancer(AllInstanceTypes.ROTATING, Models.partial(AllPartialModels.SHAFT)) + .createInstance() + .rotateToFace(rotationAxis()); } } diff --git a/src/main/java/com/simibubi/create/content/kinetics/base/SingleRotatingVisual.java b/src/main/java/com/simibubi/create/content/kinetics/base/SingleRotatingVisual.java index 0a065eefdf..cc5c24f71e 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/base/SingleRotatingVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/base/SingleRotatingVisual.java @@ -11,12 +11,11 @@ import net.createmod.catnip.render.VirtualRenderHelper; public class SingleRotatingVisual extends KineticBlockEntityVisual { - protected RotatingInstance rotatingModel; + protected final RotatingInstance rotatingModel; public SingleRotatingVisual(VisualizationContext context, T blockEntity, float partialTick) { super(context, blockEntity, partialTick); - rotatingModel = instancerProvider().instancer(AllInstanceTypes.ROTATING, model()) - .createInstance(); + rotatingModel = createRotatingInstance(); setup(rotatingModel); } @@ -35,6 +34,11 @@ public class SingleRotatingVisual extends KineticB rotatingModel.delete(); } + public RotatingInstance createRotatingInstance() { + return instancerProvider().instancer(AllInstanceTypes.ROTATING, model()) + .createInstance(); + } + protected Model model() { return VirtualRenderHelper.blockModel(blockState); } diff --git a/src/main/java/com/simibubi/create/content/kinetics/crank/HandCrankBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/crank/HandCrankBlockEntity.java index fb0f2e5de0..cf757f2d87 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/crank/HandCrankBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/crank/HandCrankBlockEntity.java @@ -100,14 +100,6 @@ public class HandCrankBlockEntity extends GeneratingKineticBlockEntity { return CachedBuffers.partialFacing(AllPartialModels.HAND_CRANK_HANDLE, blockState, facing.getOpposite()); } - @OnlyIn(Dist.CLIENT) - public Model getRenderedHandleInstance() { - BlockState blockState = getBlockState(); - Direction facing = blockState.getOptionalValue(HandCrankBlock.FACING) - .orElse(Direction.UP); - return Models.partial(AllPartialModels.HAND_CRANK_HANDLE, facing.getOpposite()); - } - @OnlyIn(Dist.CLIENT) public boolean shouldRenderShaft() { return true; diff --git a/src/main/java/com/simibubi/create/content/kinetics/crank/HandCrankVisual.java b/src/main/java/com/simibubi/create/content/kinetics/crank/HandCrankVisual.java index 00d3c1751d..01af44aadd 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/crank/HandCrankVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/crank/HandCrankVisual.java @@ -2,6 +2,9 @@ package com.simibubi.create.content.kinetics.crank; import java.util.function.Consumer; +import org.joml.Quaternionf; + +import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.kinetics.base.KineticBlockEntityVisual; import com.simibubi.create.content.kinetics.base.RotatingInstance; import com.simibubi.create.foundation.render.AllInstanceTypes; @@ -12,31 +15,27 @@ import dev.engine_room.flywheel.api.visual.DynamicVisual; import dev.engine_room.flywheel.api.visualization.VisualizationContext; import dev.engine_room.flywheel.lib.instance.InstanceTypes; import dev.engine_room.flywheel.lib.instance.TransformedInstance; +import dev.engine_room.flywheel.lib.model.Models; import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; -import net.createmod.catnip.render.VirtualRenderHelper; import net.minecraft.core.Direction; import net.minecraft.world.level.block.state.properties.BlockStateProperties; public class HandCrankVisual extends KineticBlockEntityVisual implements SimpleDynamicVisual { - protected RotatingInstance rotatingModel; + private final RotatingInstance rotatingModel; private final TransformedInstance crank; - private final Direction facing; public HandCrankVisual(VisualizationContext modelManager, HandCrankBlockEntity blockEntity, float partialTick) { super(modelManager, blockEntity, partialTick); - facing = blockState.getValue(BlockStateProperties.FACING); - Model model = blockEntity.getRenderedHandleInstance(); - crank = instancerProvider().instancer(InstanceTypes.TRANSFORMED, model) + crank = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.HAND_CRANK_HANDLE)) .createInstance(); rotateCrank(partialTick); - if (blockEntity.shouldRenderShaft()) { - rotatingModel = instancerProvider().instancer(AllInstanceTypes.ROTATING, VirtualRenderHelper.blockModel(blockState)) - .createInstance(); - setup(rotatingModel); - } + rotatingModel = instancerProvider().instancer(AllInstanceTypes.ROTATING, Models.partial(AllPartialModels.HAND_CRANK_BASE)) + .createInstance() + .rotateToFace(blockState.getValue(BlockStateProperties.FACING)); + setup(rotatingModel); } @Override @@ -45,13 +44,14 @@ public class HandCrankVisual extends KineticBlockEntityVisual implements SimpleDynamicVisual { + private final TransformedInstance crank; + + public ValveHandleVisual(VisualizationContext modelManager, HandCrankBlockEntity blockEntity, float partialTick) { + super(modelManager, blockEntity, partialTick); + + crank = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.VALVE_HANDLE)) + .createInstance(); + + rotateCrank(partialTick); + } + + @Override + public void beginFrame(Context ctx) { + rotateCrank(ctx.partialTick()); + } + + private void rotateCrank(float pt) { + var facing = blockState.getValue(BlockStateProperties.FACING); + float angle = blockEntity.getIndependentAngle(pt); + + crank.setIdentityTransform() + .translate(getVisualPosition()) + .center() + .rotate(angle, Direction.get(Direction.AxisDirection.POSITIVE, facing.getAxis())) + .rotate(new Quaternionf().rotateTo(0, 1, 0, facing.getStepX(), facing.getStepY(), facing.getStepZ())) + .uncenter() + .setChanged(); + } + + @Override + protected void _delete() { + crank.delete(); + } + + @Override + public void updateLight(float partialTick) { + relight(crank); + } + + @Override + public void collectCrumblingInstances(Consumer consumer) { + consumer.accept(crank); + } +} diff --git a/src/main/java/com/simibubi/create/content/kinetics/deployer/DeployerActorVisual.java b/src/main/java/com/simibubi/create/content/kinetics/deployer/DeployerActorVisual.java index b8e01e8ac2..d8cddb6d3f 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/deployer/DeployerActorVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/deployer/DeployerActorVisual.java @@ -19,7 +19,6 @@ import dev.engine_room.flywheel.lib.instance.InstanceTypes; import dev.engine_room.flywheel.lib.instance.TransformedInstance; import dev.engine_room.flywheel.lib.model.Models; import dev.engine_room.flywheel.lib.model.baked.PartialModel; -import net.createmod.catnip.render.VirtualRenderHelper; import net.createmod.catnip.utility.AnimationTickHolder; import net.createmod.catnip.utility.NBTHelper; import net.createmod.catnip.utility.VecHelper; @@ -60,8 +59,9 @@ public class DeployerActorVisual extends ActorVisual { hand = instancerProvider.instancer(InstanceTypes.TRANSFORMED, Models.partial(handPose)).createInstance(); Direction.Axis axis = KineticBlockEntityVisual.rotationAxis(state); - shaft = instancerProvider.instancer(AllInstanceTypes.ROTATING, VirtualRenderHelper.blockModel(KineticBlockEntityVisual.shaft(axis))) - .createInstance(); + shaft = instancerProvider.instancer(AllInstanceTypes.ROTATING, Models.partial(AllPartialModels.SHAFT)) + .createInstance() + .rotateToFace(axis); int blockLight = localBlockLight(); diff --git a/src/main/java/com/simibubi/create/content/kinetics/flywheel/FlywheelVisual.java b/src/main/java/com/simibubi/create/content/kinetics/flywheel/FlywheelVisual.java index 81274b8d15..a530402f5b 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/flywheel/FlywheelVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/flywheel/FlywheelVisual.java @@ -2,7 +2,10 @@ package com.simibubi.create.content.kinetics.flywheel; import java.util.function.Consumer; -import com.mojang.blaze3d.vertex.PoseStack; +import org.joml.Matrix4f; +import org.joml.Quaternionf; + +import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.kinetics.base.KineticBlockEntityVisual; import com.simibubi.create.content.kinetics.base.RotatingInstance; import com.simibubi.create.foundation.render.AllInstanceTypes; @@ -12,9 +15,8 @@ import dev.engine_room.flywheel.api.visual.DynamicVisual; import dev.engine_room.flywheel.api.visualization.VisualizationContext; import dev.engine_room.flywheel.lib.instance.InstanceTypes; import dev.engine_room.flywheel.lib.instance.TransformedInstance; -import dev.engine_room.flywheel.lib.transform.TransformStack; +import dev.engine_room.flywheel.lib.model.Models; import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; -import net.createmod.catnip.render.VirtualRenderHelper; import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.core.Direction; @@ -24,14 +26,27 @@ public class FlywheelVisual extends KineticBlockEntityVisual { } @Override - protected Model model() { - return shaftModel(level, pos, blockState); + public RotatingInstance createRotatingInstance() { + return shaft(instancerProvider(), level, pos, blockState); } - public static Model shaftModel(LevelAccessor level, BlockPos pos, BlockState state) { - if (state.getValue(BlockStateProperties.FACING) - .getAxis() - .isHorizontal()) { - BlockState referenceState = state.rotate(level, pos, Rotation.CLOCKWISE_180); - Direction facing = referenceState.getValue(BlockStateProperties.FACING); - return Models.partial(AllPartialModels.SHAFT_HALF, facing); + public static RotatingInstance shaft(InstancerProvider instancerProvider, LevelAccessor level, BlockPos pos, BlockState state) { + var facing = state.getValue(BlockStateProperties.FACING); + var axis = facing + .getAxis(); + if (axis.isHorizontal()) { + Direction align = facing.getOpposite(); + return instancerProvider.instancer(AllInstanceTypes.ROTATING, Models.partial(AllPartialModels.SHAFT_HALF)) + .createInstance() + .rotateTo(0, 0, 1, align.getStepX(), align.getStepY(), align.getStepZ()); } else { - return VirtualRenderHelper.blockModel(KineticBlockEntityVisual.shaft(state)); + return instancerProvider.instancer(AllInstanceTypes.ROTATING, Models.partial(AllPartialModels.SHAFT)) + .createInstance() + .rotateToFace(state.getValue(SawBlock.AXIS_ALONG_FIRST_COORDINATE) ? Axis.X : Axis.Z); } } } From 3fb6e71ec8a0ad4086584782c624fea6aa43e26b Mon Sep 17 00:00:00 2001 From: zelophed Date: Fri, 17 Jan 2025 14:52:52 +0100 Subject: [PATCH 315/515] remove references to catnip as a mod --- build.gradle | 28 ++----------------- gradle.properties | 1 - .../chassis/ChassisRangeDisplay.java | 14 +++++----- .../glue/SuperGlueSelectionHandler.java | 13 +++++---- .../minecart/CouplingRenderer.java | 6 ++-- .../contraptions/pulley/RopePulleyVisual.java | 6 ++-- .../girder/GirderWrenchBehavior.java | 5 ++-- .../goggles/GoggleOverlayRenderer.java | 5 ++-- .../equipment/zapper/ZapperRenderHandler.java | 4 +-- .../WorldshaperRenderHandler.java | 4 +-- .../content/kinetics/KineticDebugger.java | 6 ++-- .../content/kinetics/base/ShaftVisual.java | 2 +- .../kinetics/base/SingleRotatingVisual.java | 2 +- .../content/kinetics/belt/BeltSlicer.java | 5 ++-- .../ChainConveyorConnectionHandler.java | 9 +++--- .../ChainConveyorInteractionHandler.java | 5 ++-- .../kinetics/crank/HandCrankVisual.java | 2 +- .../crank/ValveHandleBlockEntity.java | 3 +- .../deployer/DeployerActorVisual.java | 2 +- .../kinetics/flywheel/FlywheelVisual.java | 2 +- .../ArmInteractionPointHandler.java | 5 ++-- .../content/kinetics/saw/SawVisual.java | 2 +- .../BracketedKineticBlockModel.java | 3 +- .../waterwheel/LargeWaterWheelBlockItem.java | 5 ++-- .../logistics/depot/EjectorTargetHandler.java | 7 +++-- .../FactoryPanelConnectionHandler.java | 4 +-- .../PackagePortTargetSelectionHandler.java | 14 +++++----- .../LogisticallyLinkedClientHandler.java | 4 +-- .../displayLink/ClickToLinkBlockItem.java | 5 ++-- .../content/redstone/link/LinkRenderer.java | 4 +-- .../LinkedControllerClientHandler.java | 5 ++-- .../cannon/SchematicannonRenderer.java | 2 +- .../client/SchematicAndQuillHandler.java | 3 +- .../create/content/trains/CubeParticle.java | 4 +-- .../trains/bogey/StandardBogeyVisual.java | 2 +- .../content/trains/entity/TrainRelocator.java | 7 +++-- .../trains/graph/TrackGraphVisualizer.java | 19 ++++++------- .../content/trains/track/TrackPlacement.java | 17 +++++------ .../EdgeInteractionRenderer.java | 4 +-- .../filtering/FilteringRenderer.java | 4 +-- .../scrollValue/ScrollValueRenderer.java | 6 ++-- .../command/ClearBufferCacheCommand.java | 5 ++-- .../command/HighlightPacket.java | 5 ++-- src/main/resources/META-INF/mods.toml | 7 ----- 44 files changed, 126 insertions(+), 141 deletions(-) diff --git a/build.gradle b/build.gradle index 89d9b78bb1..0dfc5b5c2d 100644 --- a/build.gradle +++ b/build.gradle @@ -24,19 +24,14 @@ base { } boolean inMultiModWorkspace = rootProject.hasProperty('multiModWorkspace.enabled') -boolean catnipInWorkspace = rootProject.hasProperty('multiModWorkspace.catnip') boolean ponderInWorkspace = rootProject.hasProperty('multiModWorkspace.ponder') -if (catnipInWorkspace) { - evaluationDependsOn(":catnip:Forge") -} - if (ponderInWorkspace) { evaluationDependsOn(":ponder:Forge") } project.logger.lifecycle("MultiModWorkspace ${inMultiModWorkspace ? 'enabled' : 'disabled'} for project ${project.name}.") -project.logger.lifecycle("Dependencies included in Workspace: [Catnip: ${catnipInWorkspace}], [Ponder: ${ponderInWorkspace}]") +project.logger.lifecycle("Dependencies included in Workspace: [Ponder: ${ponderInWorkspace}]") mixin { add sourceSets.main, 'create.refmap.json' @@ -94,20 +89,13 @@ minecraft { property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" arg '-mixin.config=create.mixins.json' - arg '-mixin.config=catnip.mixins.json' + arg '-mixin.config=ponder.mixins.json' mods { create { source sourceSets.main } - if (catnipInWorkspace) { - catnip { - source project(":catnip:Common").sourceSets.main - source project(":catnip:Forge").sourceSets.main - } - } - if (ponderInWorkspace) { ponder { source project(":ponder:Common").sourceSets.main @@ -193,7 +181,7 @@ repositories { } } maven { - // Location of the maven for Ponder, Catnip + // Location of the maven for Ponder name = 'createmod maven' url 'https://maven.createmod.net' } @@ -233,9 +221,6 @@ dependencies { jarJar.ranged(it, '[1.0,2.0)') } - jarJar("net.createmod.catnip:Catnip-Forge-${minecraft_version}:${catnip_version}") { - jarJar.ranged(it, '[0.7.5,)') - } jarJar("net.createmod.ponder:Ponder-Forge-${minecraft_version}:${ponder_version}") { jarJar.ranged(it, '[0.7.5,)') } @@ -249,13 +234,6 @@ dependencies { compileOnly fg.deobf("dev.engine_room.flywheel:flywheel-forge-api-${flywheel_minecraft_version}:${flywheel_version}") runtimeOnly fg.deobf("dev.engine_room.flywheel:flywheel-forge-${flywheel_minecraft_version}:${flywheel_version}") - if (catnipInWorkspace) { - implementation project(":catnip:Common") - implementation project(":catnip:Forge") - } else { - implementation fg.deobf("net.createmod.catnip:Catnip-Forge-${minecraft_version}:${catnip_version}") - } - if (ponderInWorkspace) { implementation project(":ponder:Common") implementation project(":ponder:Forge") diff --git a/gradle.properties b/gradle.properties index 06c7b19a44..a421e83e91 100644 --- a/gradle.properties +++ b/gradle.properties @@ -28,7 +28,6 @@ jei_minecraft_version = 1.20.1 jei_version = 15.10.0.39 curios_minecraft_version = 1.20.1 curios_version = 5.3.1 -catnip_version = 0.8.42 ponder_version = 0.8.16 mixin_extras_version = 0.4.1 diff --git a/src/main/java/com/simibubi/create/content/contraptions/chassis/ChassisRangeDisplay.java b/src/main/java/com/simibubi/create/content/contraptions/chassis/ChassisRangeDisplay.java index 3b9c1c23f3..247339bc5a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/chassis/ChassisRangeDisplay.java +++ b/src/main/java/com/simibubi/create/content/contraptions/chassis/ChassisRangeDisplay.java @@ -14,7 +14,7 @@ import com.simibubi.create.AllItems; import com.simibubi.create.AllKeys; import com.simibubi.create.AllSpecialTextures; -import net.createmod.catnip.CatnipClient; +import net.createmod.catnip.utility.outliner.Outliner; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.world.entity.player.Player; @@ -35,7 +35,7 @@ public class ChassisRangeDisplay { public Entry(ChassisBlockEntity be) { this.be = be; timer = DISPLAY_TIME; - CatnipClient.OUTLINER.showCluster(getOutlineKey(), createSelection(be)) + Outliner.getInstance().showCluster(getOutlineKey(), createSelection(be)) .colored(0xFFFFFF) .disableLineNormals() .lineWidth(1 / 16f) @@ -97,7 +97,7 @@ public class ChassisRangeDisplay { Entry entry = entries.get(pos); if (tickEntry(entry, hasWrench)) iterator.remove(); - CatnipClient.OUTLINER.keep(entry.getOutlineKey()); + Outliner.getInstance().keep(entry.getOutlineKey()); } for (Iterator iterator = groupEntries.iterator(); iterator.hasNext();) { @@ -107,7 +107,7 @@ public class ChassisRangeDisplay { if (group == lastHoveredGroup) lastHoveredGroup = null; } - CatnipClient.OUTLINER.keep(group.getOutlineKey()); + Outliner.getInstance().keep(group.getOutlineKey()); } if (!hasWrench) @@ -173,9 +173,9 @@ public class ChassisRangeDisplay { GroupEntry hoveredGroup = new GroupEntry(chassis); for (ChassisBlockEntity included : hoveredGroup.includedBEs) - CatnipClient.OUTLINER.remove(Pair.of(included.getBlockPos(), 1)); + Outliner.getInstance().remove(Pair.of(included.getBlockPos(), 1)); - groupEntries.forEach(entry -> CatnipClient.OUTLINER.remove(entry.getOutlineKey())); + groupEntries.forEach(entry -> Outliner.getInstance().remove(entry.getOutlineKey())); groupEntries.clear(); entries.clear(); groupEntries.add(hoveredGroup); @@ -186,7 +186,7 @@ public class ChassisRangeDisplay { BlockPos pos = chassis.getBlockPos(); GroupEntry entry = getExistingGroupForPos(pos); if (entry != null) - CatnipClient.OUTLINER.remove(entry.getOutlineKey()); + Outliner.getInstance().remove(entry.getOutlineKey()); groupEntries.clear(); entries.clear(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/glue/SuperGlueSelectionHandler.java b/src/main/java/com/simibubi/create/content/contraptions/glue/SuperGlueSelectionHandler.java index 19cee16f3b..2bd74e4627 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/glue/SuperGlueSelectionHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/glue/SuperGlueSelectionHandler.java @@ -12,8 +12,8 @@ import com.simibubi.create.content.contraptions.chassis.AbstractChassisBlock; import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.foundation.utility.RaycastHelper; -import net.createmod.catnip.CatnipClient; import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.utility.outliner.Outliner; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.player.LocalPlayer; @@ -28,6 +28,7 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.HitResult.Type; import net.minecraft.world.phys.Vec3; + import net.minecraftforge.common.ForgeMod; public class SuperGlueSelectionHandler { @@ -63,7 +64,7 @@ public class SuperGlueSelectionHandler { if (clusterCooldown > 0) { if (clusterCooldown == 25) player.displayClientMessage(Components.immutableEmpty(), true); - CatnipClient.OUTLINER.keep(clusterOutlineSlot); + Outliner.getInstance().keep(clusterOutlineSlot); clusterCooldown--; } @@ -97,7 +98,7 @@ public class SuperGlueSelectionHandler { for (SuperGlueEntity glueEntity : glueNearby) { boolean h = clusterCooldown == 0 && glueEntity == selected; AllSpecialTextures faceTex = h ? AllSpecialTextures.GLUE : null; - CatnipClient.OUTLINER.showAABB(glueEntity, glueEntity.getBoundingBox()) + Outliner.getInstance().showAABB(glueEntity, glueEntity.getBoundingBox()) .colored(h ? HIGHLIGHT : PASSIVE) .withFaceTextures(faceTex, faceTex) .disableLineNormals() @@ -152,13 +153,13 @@ public class SuperGlueSelectionHandler { .sendStatus(player); if (currentSelectionBox != null) - CatnipClient.OUTLINER.showAABB(bbOutlineSlot, currentSelectionBox) + Outliner.getInstance().showAABB(bbOutlineSlot, currentSelectionBox) .colored(canReach && canAfford && !cancel ? HIGHLIGHT : FAIL) .withFaceTextures(AllSpecialTextures.GLUE, AllSpecialTextures.GLUE) .disableLineNormals() .lineWidth(1 / 16f); - CatnipClient.OUTLINER.showCluster(clusterOutlineSlot, currentCluster) + Outliner.getInstance().showCluster(clusterOutlineSlot, currentCluster) .colored(0x4D9162) .disableLineNormals() .lineWidth(1 / 64f); @@ -258,7 +259,7 @@ public class SuperGlueSelectionHandler { player.level().playSound(player, hoveredPos, SoundEvents.ITEM_FRAME_ADD_ITEM, SoundSource.BLOCKS, 0.75f, 1); if (currentCluster != null) - CatnipClient.OUTLINER.showCluster(clusterOutlineSlot, currentCluster) + Outliner.getInstance().showCluster(clusterOutlineSlot, currentCluster) .colored(0xB5F2C6) .withFaceTextures(AllSpecialTextures.GLUE, AllSpecialTextures.HIGHLIGHT_CHECKERED) .disableLineNormals() diff --git a/src/main/java/com/simibubi/create/content/contraptions/minecart/CouplingRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/minecart/CouplingRenderer.java index 7da8dfb831..522ad44a04 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/minecart/CouplingRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/minecart/CouplingRenderer.java @@ -9,12 +9,12 @@ import com.simibubi.create.content.contraptions.minecart.capability.MinecartCont import com.simibubi.create.content.kinetics.KineticDebugger; import dev.engine_room.flywheel.lib.transform.TransformStack; -import net.createmod.catnip.CatnipClient; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.utility.AnimationTickHolder; import net.createmod.catnip.utility.Couple; import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.outliner.Outliner; import net.createmod.catnip.utility.theme.Color; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; @@ -227,13 +227,13 @@ public class CouplingRenderer { int color = Color.mixColors(0xabf0e9, 0xee8572, (float) Mth .clamp(Math.abs(first.getCouplingLength(true) - connectedCenter.distanceTo(mainCenter)) * 8, 0, 1)); - CatnipClient.OUTLINER.showLine(mainCart.getId() + "", mainCenter, connectedCenter) + Outliner.getInstance().showLine(mainCart.getId() + "", mainCenter, connectedCenter) .colored(color) .lineWidth(1 / 8f); Vec3 point = mainCart.position() .add(0, yOffset, 0); - CatnipClient.OUTLINER.showLine(mainCart.getId() + "_dot", point, point.add(0, 1 / 128f, 0)) + Outliner.getInstance().showLine(mainCart.getId() + "_dot", point, point.add(0, 1 / 128f, 0)) .colored(0xffffff) .lineWidth(1 / 4f); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/pulley/RopePulleyVisual.java b/src/main/java/com/simibubi/create/content/contraptions/pulley/RopePulleyVisual.java index f877d1c652..d89ded5150 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/pulley/RopePulleyVisual.java +++ b/src/main/java/com/simibubi/create/content/contraptions/pulley/RopePulleyVisual.java @@ -13,7 +13,7 @@ import dev.engine_room.flywheel.lib.instance.InstanceTypes; import dev.engine_room.flywheel.lib.instance.TransformedInstance; import dev.engine_room.flywheel.lib.model.Models; import net.createmod.catnip.render.SpriteShiftEntry; -import net.createmod.catnip.render.VirtualRenderHelper; +import net.createmod.ponder.render.VirtualRenderHelper; public class RopePulleyVisual extends AbstractPulleyVisual { public RopePulleyVisual(VisualizationContext context, PulleyBlockEntity blockEntity, float partialTick) { @@ -54,10 +54,10 @@ public class RopePulleyVisual extends AbstractPulleyVisual { protected boolean isRunning() { return PulleyRenderer.isPulleyRunning(blockEntity); } - + @Override protected SpriteShiftEntry getCoilAnimation() { return AllSpriteShifts.ROPE_PULLEY_COIL; } - + } diff --git a/src/main/java/com/simibubi/create/content/decoration/girder/GirderWrenchBehavior.java b/src/main/java/com/simibubi/create/content/decoration/girder/GirderWrenchBehavior.java index 140ac8bda5..780b6ed387 100644 --- a/src/main/java/com/simibubi/create/content/decoration/girder/GirderWrenchBehavior.java +++ b/src/main/java/com/simibubi/create/content/decoration/girder/GirderWrenchBehavior.java @@ -9,10 +9,10 @@ import org.jetbrains.annotations.Nullable; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; -import net.createmod.catnip.CatnipClient; import net.createmod.catnip.utility.Iterate; import net.createmod.catnip.utility.Pair; import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.outliner.Outliner; import net.createmod.catnip.utility.placement.IPlacementHelper; import net.createmod.catnip.utility.theme.Color; import net.minecraft.client.Minecraft; @@ -28,6 +28,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.Vec3; + import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -91,7 +92,7 @@ public class GirderWrenchBehavior { .getNormal()) .scale(0.1 * normalMultiplier)); - CatnipClient.OUTLINER.showAABB("girderWrench", new AABB(corner1, corner2)) + Outliner.getInstance().showAABB("girderWrench", new AABB(corner1, corner2)) .lineWidth(1 / 32f) .colored(new Color(127, 127, 127)); } diff --git a/src/main/java/com/simibubi/create/content/equipment/goggles/GoggleOverlayRenderer.java b/src/main/java/com/simibubi/create/content/equipment/goggles/GoggleOverlayRenderer.java index 9988290791..421c5a41f9 100644 --- a/src/main/java/com/simibubi/create/content/equipment/goggles/GoggleOverlayRenderer.java +++ b/src/main/java/com/simibubi/create/content/equipment/goggles/GoggleOverlayRenderer.java @@ -20,12 +20,12 @@ import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.infrastructure.config.AllConfigs; import com.simibubi.create.infrastructure.config.CClient; -import net.createmod.catnip.CatnipClient; import net.createmod.catnip.gui.element.BoxElement; import net.createmod.catnip.gui.element.GuiGameElement; import net.createmod.catnip.utility.Iterate; import net.createmod.catnip.utility.lang.Components; import net.createmod.catnip.utility.outliner.Outline; +import net.createmod.catnip.utility.outliner.Outliner; import net.createmod.catnip.utility.outliner.Outliner.OutlineEntry; import net.createmod.catnip.utility.theme.Color; import net.minecraft.client.Minecraft; @@ -44,6 +44,7 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.HitResult; + import net.minecraftforge.client.gui.overlay.ForgeGui; import net.minecraftforge.client.gui.overlay.IGuiOverlay; @@ -51,7 +52,7 @@ public class GoggleOverlayRenderer { public static final IGuiOverlay OVERLAY = GoggleOverlayRenderer::renderOverlay; - private static final Map outlines = CatnipClient.OUTLINER.getOutlines(); + private static final Map outlines = Outliner.getInstance().getOutlines(); public static int hoverTicks = 0; public static BlockPos lastHovered = null; diff --git a/src/main/java/com/simibubi/create/content/equipment/zapper/ZapperRenderHandler.java b/src/main/java/com/simibubi/create/content/equipment/zapper/ZapperRenderHandler.java index 118ca2b2dc..086ba2dbc9 100644 --- a/src/main/java/com/simibubi/create/content/equipment/zapper/ZapperRenderHandler.java +++ b/src/main/java/com/simibubi/create/content/equipment/zapper/ZapperRenderHandler.java @@ -9,7 +9,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Axis; import com.simibubi.create.AllSoundEvents; -import net.createmod.catnip.CatnipClient; +import net.createmod.catnip.utility.outliner.Outliner; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.core.particles.ParticleTypes; @@ -38,7 +38,7 @@ public class ZapperRenderHandler extends ShootableGadgetRenderHandler { return; cachedBeams.forEach(beam -> { - CatnipClient.OUTLINER.endChasingLine(beam, beam.start, beam.end, 1 - beam.itensity, false) + Outliner.getInstance().endChasingLine(beam, beam.start, beam.end, 1 - beam.itensity, false) .disableLineNormals() .colored(0xffffff) .lineWidth(beam.itensity * 1 / 8f); diff --git a/src/main/java/com/simibubi/create/content/equipment/zapper/terrainzapper/WorldshaperRenderHandler.java b/src/main/java/com/simibubi/create/content/equipment/zapper/terrainzapper/WorldshaperRenderHandler.java index 07de94f09b..b24fa1f202 100644 --- a/src/main/java/com/simibubi/create/content/equipment/zapper/terrainzapper/WorldshaperRenderHandler.java +++ b/src/main/java/com/simibubi/create/content/equipment/zapper/terrainzapper/WorldshaperRenderHandler.java @@ -7,8 +7,8 @@ import java.util.function.Supplier; import com.simibubi.create.AllItems; import com.simibubi.create.AllSpecialTextures; -import net.createmod.catnip.CatnipClient; import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.utility.outliner.Outliner; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; import net.minecraft.core.BlockPos; @@ -31,7 +31,7 @@ public class WorldshaperRenderHandler { if (renderedPositions == null) return; - CatnipClient.OUTLINER.showCluster("terrainZapper", renderedPositions.get()) + Outliner.getInstance().showCluster("terrainZapper", renderedPositions.get()) .colored(0xbfbfbf) .disableLineNormals() .lineWidth(1 / 32f) diff --git a/src/main/java/com/simibubi/create/content/kinetics/KineticDebugger.java b/src/main/java/com/simibubi/create/content/kinetics/KineticDebugger.java index d5f2d00c79..5c5e042e43 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/KineticDebugger.java +++ b/src/main/java/com/simibubi/create/content/kinetics/KineticDebugger.java @@ -5,9 +5,9 @@ import com.simibubi.create.content.kinetics.base.KineticBlockEntity; import com.simibubi.create.content.kinetics.base.KineticBlockEntityRenderer; import com.simibubi.create.infrastructure.config.AllConfigs; -import net.createmod.catnip.CatnipClient; import net.createmod.catnip.render.SuperByteBufferCache; import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.outliner.Outliner; import net.createmod.catnip.utility.theme.Color; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; @@ -45,7 +45,7 @@ public class KineticDebugger { .getBlockSupportShape(world, toOutline); if (be.getTheoreticalSpeed() != 0 && !shape.isEmpty()) - CatnipClient.OUTLINER.chaseAABB("kineticSource", shape.bounds() + Outliner.getInstance().chaseAABB("kineticSource", shape.bounds() .move(toOutline)) .lineWidth(1 / 16f) .colored(be.hasSource() ? Color.generateFromLong(be.network).getRGB() : 0xffcc00); @@ -55,7 +55,7 @@ public class KineticDebugger { Vec3 vec = Vec3.atLowerCornerOf(Direction.get(AxisDirection.POSITIVE, axis) .getNormal()); Vec3 center = VecHelper.getCenterOf(be.getBlockPos()); - CatnipClient.OUTLINER.showLine("rotationAxis", center.add(vec), center.subtract(vec)) + Outliner.getInstance().showLine("rotationAxis", center.add(vec), center.subtract(vec)) .lineWidth(1 / 16f); } diff --git a/src/main/java/com/simibubi/create/content/kinetics/base/ShaftVisual.java b/src/main/java/com/simibubi/create/content/kinetics/base/ShaftVisual.java index a6c7fad018..0c832dc322 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/base/ShaftVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/base/ShaftVisual.java @@ -2,7 +2,7 @@ package com.simibubi.create.content.kinetics.base; import dev.engine_room.flywheel.api.model.Model; import dev.engine_room.flywheel.api.visualization.VisualizationContext; -import net.createmod.catnip.render.VirtualRenderHelper; +import net.createmod.ponder.render.VirtualRenderHelper; public class ShaftVisual extends SingleRotatingVisual { diff --git a/src/main/java/com/simibubi/create/content/kinetics/base/SingleRotatingVisual.java b/src/main/java/com/simibubi/create/content/kinetics/base/SingleRotatingVisual.java index 0a065eefdf..0869fc9e2d 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/base/SingleRotatingVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/base/SingleRotatingVisual.java @@ -7,7 +7,7 @@ import com.simibubi.create.foundation.render.AllInstanceTypes; import dev.engine_room.flywheel.api.instance.Instance; import dev.engine_room.flywheel.api.model.Model; import dev.engine_room.flywheel.api.visualization.VisualizationContext; -import net.createmod.catnip.render.VirtualRenderHelper; +import net.createmod.ponder.render.VirtualRenderHelper; public class SingleRotatingVisual extends KineticBlockEntityVisual { diff --git a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltSlicer.java b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltSlicer.java index f9e217801f..05c2d92e5c 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltSlicer.java +++ b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltSlicer.java @@ -15,9 +15,9 @@ import com.simibubi.create.content.kinetics.belt.transport.TransportedItemStack; import com.simibubi.create.foundation.block.ProperWaterloggedBlock; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.CatnipClient; import net.createmod.catnip.utility.VecHelper; import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.utility.outliner.Outliner; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; @@ -40,6 +40,7 @@ import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; + import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -479,7 +480,7 @@ public class BeltSlicer { mc.player.displayClientMessage(Components.immutableEmpty(), true); if (feedback.bb != null) - CatnipClient.OUTLINER.chaseAABB("BeltSlicer", feedback.bb) + Outliner.getInstance().chaseAABB("BeltSlicer", feedback.bb) .lineWidth(1 / 16f) .colored(feedback.color); } diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorConnectionHandler.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorConnectionHandler.java index fd5d965572..b9cca4539f 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorConnectionHandler.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorConnectionHandler.java @@ -7,9 +7,9 @@ import com.simibubi.create.content.equipment.blueprint.BlueprintOverlayRenderer; import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.infrastructure.config.AllConfigs; -import net.createmod.catnip.CatnipClient; import net.createmod.catnip.utility.Iterate; import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.outliner.Outliner; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; @@ -31,6 +31,7 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.HitResult.Type; import net.minecraft.world.phys.Vec3; + import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.common.util.FakePlayer; import net.minecraftforge.event.entity.player.PlayerInteractEvent; @@ -190,10 +191,10 @@ public class ChainConveyorConnectionHandler { .normalize() .scale(.875); - CatnipClient.OUTLINER.showLine("chain_connect_line", from.add(normal), to.add(normal)) + Outliner.getInstance().showLine("chain_connect_line", from.add(normal), to.add(normal)) .lineWidth(1 / 16f) .colored(color); - CatnipClient.OUTLINER.showLine("chain_connect_line_1", from.subtract(normal), to.subtract(normal)) + Outliner.getInstance().showLine("chain_connect_line_1", from.subtract(normal), to.subtract(normal)) .lineWidth(1 / 16f) .colored(color); @@ -206,7 +207,7 @@ public class ChainConveyorConnectionHandler { for (int i = 0; i < 8; i++) { Vec3 v = VecHelper.rotate(new Vec3(0, .125 + y * .75, 1.25), 22.5 + i * 45, Axis.Y) .add(Vec3.atBottomCenterOf(pos)); - CatnipClient.OUTLINER.showLine(key + y + i, prevV, v) + Outliner.getInstance().showLine(key + y + i, prevV, v) .lineWidth(1 / 16f) .colored(color); prevV = v; diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorInteractionHandler.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorInteractionHandler.java index e559057a39..7cf03d896d 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorInteractionHandler.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorInteractionHandler.java @@ -15,8 +15,8 @@ import com.simibubi.create.content.logistics.packagePort.PackagePortTargetSelect import com.simibubi.create.foundation.utility.RaycastHelper; import com.simibubi.create.foundation.utility.TickBasedCache; -import net.createmod.catnip.CatnipClient; import net.createmod.catnip.utility.WorldAttached; +import net.createmod.catnip.utility.outliner.Outliner; import net.createmod.catnip.utility.theme.Color; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; @@ -26,6 +26,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; + import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.RenderHighlightEvent; import net.minecraftforge.common.ForgeMod; @@ -103,7 +104,7 @@ public class ChainConveyorInteractionHandler { selectedBakedPosition = bestShape.getVec(bestLift, selectedChainPosition); if (!isWrench) { - CatnipClient.OUTLINER + Outliner.getInstance() .chaseAABB("ChainPointSelection", new AABB(selectedBakedPosition, selectedBakedPosition)) .colored(Color.WHITE) .lineWidth(1 / 6f) diff --git a/src/main/java/com/simibubi/create/content/kinetics/crank/HandCrankVisual.java b/src/main/java/com/simibubi/create/content/kinetics/crank/HandCrankVisual.java index 00d3c1751d..7e4742bb51 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/crank/HandCrankVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/crank/HandCrankVisual.java @@ -13,7 +13,7 @@ import dev.engine_room.flywheel.api.visualization.VisualizationContext; import dev.engine_room.flywheel.lib.instance.InstanceTypes; import dev.engine_room.flywheel.lib.instance.TransformedInstance; import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; -import net.createmod.catnip.render.VirtualRenderHelper; +import net.createmod.ponder.render.VirtualRenderHelper; import net.minecraft.core.Direction; import net.minecraft.world.level.block.state.properties.BlockStateProperties; diff --git a/src/main/java/com/simibubi/create/content/kinetics/crank/ValveHandleBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/crank/ValveHandleBlockEntity.java index 9bd8f41d2b..772e686372 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/crank/ValveHandleBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/crank/ValveHandleBlockEntity.java @@ -19,9 +19,9 @@ import com.simibubi.create.foundation.utility.CreateLang; import dev.engine_room.flywheel.api.model.Model; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; -import net.createmod.catnip.render.VirtualRenderHelper; import net.createmod.catnip.utility.VecHelper; import net.createmod.catnip.utility.lang.Components; +import net.createmod.ponder.render.VirtualRenderHelper; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -36,6 +36,7 @@ import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.Vec3; + import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; diff --git a/src/main/java/com/simibubi/create/content/kinetics/deployer/DeployerActorVisual.java b/src/main/java/com/simibubi/create/content/kinetics/deployer/DeployerActorVisual.java index b8e01e8ac2..ed96ea0a4f 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/deployer/DeployerActorVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/deployer/DeployerActorVisual.java @@ -19,11 +19,11 @@ import dev.engine_room.flywheel.lib.instance.InstanceTypes; import dev.engine_room.flywheel.lib.instance.TransformedInstance; import dev.engine_room.flywheel.lib.model.Models; import dev.engine_room.flywheel.lib.model.baked.PartialModel; -import net.createmod.catnip.render.VirtualRenderHelper; import net.createmod.catnip.utility.AnimationTickHolder; import net.createmod.catnip.utility.NBTHelper; import net.createmod.catnip.utility.VecHelper; import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.ponder.render.VirtualRenderHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.util.Mth; diff --git a/src/main/java/com/simibubi/create/content/kinetics/flywheel/FlywheelVisual.java b/src/main/java/com/simibubi/create/content/kinetics/flywheel/FlywheelVisual.java index 81274b8d15..80cefd7847 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/flywheel/FlywheelVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/flywheel/FlywheelVisual.java @@ -14,8 +14,8 @@ import dev.engine_room.flywheel.lib.instance.InstanceTypes; import dev.engine_room.flywheel.lib.instance.TransformedInstance; import dev.engine_room.flywheel.lib.transform.TransformStack; import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; -import net.createmod.catnip.render.VirtualRenderHelper; import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.ponder.render.VirtualRenderHelper; import net.minecraft.core.Direction; public class FlywheelVisual extends KineticBlockEntityVisual implements SimpleDynamicVisual { diff --git a/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmInteractionPointHandler.java b/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmInteractionPointHandler.java index 401c2bca7c..d7577d7ffb 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmInteractionPointHandler.java +++ b/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmInteractionPointHandler.java @@ -11,7 +11,7 @@ import com.simibubi.create.AllPackets; import com.simibubi.create.content.kinetics.mechanicalArm.ArmInteractionPoint.Mode; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.CatnipClient; +import net.createmod.catnip.utility.outliner.Outliner; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; @@ -25,6 +25,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.shapes.VoxelShape; + import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; @@ -201,7 +202,7 @@ public class ArmInteractionPointHandler { int color = point.getMode() .getColor(); - CatnipClient.OUTLINER.showAABB(point, shape.bounds() + Outliner.getInstance().showAABB(point, shape.bounds() .move(pos)) .colored(color) .lineWidth(1 / 16f); diff --git a/src/main/java/com/simibubi/create/content/kinetics/saw/SawVisual.java b/src/main/java/com/simibubi/create/content/kinetics/saw/SawVisual.java index 2b8d6b366d..75294af4d6 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/saw/SawVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/saw/SawVisual.java @@ -7,7 +7,7 @@ import com.simibubi.create.content.kinetics.base.SingleRotatingVisual; import dev.engine_room.flywheel.api.model.Model; import dev.engine_room.flywheel.api.visualization.VisualizationContext; import dev.engine_room.flywheel.lib.model.Models; -import net.createmod.catnip.render.VirtualRenderHelper; +import net.createmod.ponder.render.VirtualRenderHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.LevelAccessor; diff --git a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/BracketedKineticBlockModel.java b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/BracketedKineticBlockModel.java index 93a58a58ee..02518d8633 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/BracketedKineticBlockModel.java +++ b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/BracketedKineticBlockModel.java @@ -6,7 +6,7 @@ import java.util.List; import com.simibubi.create.content.decoration.bracket.BracketedBlockEntityBehaviour; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; -import net.createmod.catnip.render.VirtualRenderHelper; +import net.createmod.ponder.render.VirtualRenderHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.model.BakedQuad; @@ -16,6 +16,7 @@ import net.minecraft.core.Direction; import net.minecraft.util.RandomSource; import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.block.state.BlockState; + import net.minecraftforge.client.model.BakedModelWrapper; import net.minecraftforge.client.model.data.ModelData; import net.minecraftforge.client.model.data.ModelProperty; diff --git a/src/main/java/com/simibubi/create/content/kinetics/waterwheel/LargeWaterWheelBlockItem.java b/src/main/java/com/simibubi/create/content/kinetics/waterwheel/LargeWaterWheelBlockItem.java index 5a91354a03..67cd8f3f78 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/waterwheel/LargeWaterWheelBlockItem.java +++ b/src/main/java/com/simibubi/create/content/kinetics/waterwheel/LargeWaterWheelBlockItem.java @@ -2,8 +2,8 @@ package com.simibubi.create.content.kinetics.waterwheel; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.CatnipClient; import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.utility.outliner.Outliner; import net.minecraft.client.player.LocalPlayer; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -15,6 +15,7 @@ import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.block.Block; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; + import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fml.DistExecutor; @@ -48,7 +49,7 @@ public class LargeWaterWheelBlockItem extends BlockItem { .getNormal()); if (!(context.getPlayer()instanceof LocalPlayer localPlayer)) return; - CatnipClient.OUTLINER.showAABB(Pair.of("waterwheel", pos), new AABB(pos).inflate(1) + Outliner.getInstance().showAABB(Pair.of("waterwheel", pos), new AABB(pos).inflate(1) .deflate(contract.x, contract.y, contract.z)) .colored(0xFF_ff5d6c); CreateLang.translate("large_water_wheel.not_enough_space") diff --git a/src/main/java/com/simibubi/create/content/logistics/depot/EjectorTargetHandler.java b/src/main/java/com/simibubi/create/content/logistics/depot/EjectorTargetHandler.java index 9fa59bc71d..a76f861c63 100644 --- a/src/main/java/com/simibubi/create/content/logistics/depot/EjectorTargetHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/depot/EjectorTargetHandler.java @@ -8,9 +8,9 @@ import com.simibubi.create.AllPackets; import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.infrastructure.config.AllConfigs; -import net.createmod.catnip.CatnipClient; import net.createmod.catnip.utility.AnimationTickHolder; import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.outliner.Outliner; import net.createmod.catnip.utility.theme.Color; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; @@ -33,6 +33,7 @@ import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.HitResult.Type; import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.VoxelShape; + import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; @@ -211,7 +212,7 @@ public class EjectorTargetHandler { ClientLevel world = mc.level; AABB bb = new AABB(0, 0, 0, 1, 0, 1).move(currentSelection.offset(-validX, -yDiff, -validZ)); - CatnipClient.OUTLINER.chaseAABB("valid", bb) + Outliner.getInstance().chaseAABB("valid", bb) .colored(intColor) .lineWidth(1 / 16f); @@ -261,7 +262,7 @@ public class EjectorTargetHandler { BlockState state = world.getBlockState(pos); VoxelShape shape = state.getShape(world, pos); AABB boundingBox = shape.isEmpty() ? new AABB(BlockPos.ZERO) : shape.bounds(); - CatnipClient.OUTLINER.showAABB("target", boundingBox.move(pos)) + Outliner.getInstance().showAABB("target", boundingBox.move(pos)) .colored(0xffcb74) .lineWidth(1 / 16f); } diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionHandler.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionHandler.java index 7d78012693..af159bd8bb 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionHandler.java @@ -9,9 +9,9 @@ import com.simibubi.create.foundation.block.WrenchableDirectionalBlock; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.CatnipClient; import net.createmod.catnip.utility.AnimationTickHolder; import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.outliner.Outliner; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; @@ -159,7 +159,7 @@ public class FactoryPanelConnectionHandler { return; } - CatnipClient.OUTLINER.showAABB(connectingFrom, connectingFromBox) + Outliner.getInstance().showAABB(connectingFrom, connectingFromBox) .colored(AnimationTickHolder.getTicks() % 16 > 8 ? 0x38b764 : 0xa7f070) .lineWidth(1 / 16f); diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTargetSelectionHandler.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTargetSelectionHandler.java index 3ef705e192..2428cb0bd1 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTargetSelectionHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTargetSelectionHandler.java @@ -7,8 +7,8 @@ import com.simibubi.create.content.trains.station.StationBlockEntity; import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.infrastructure.config.AllConfigs; -import net.createmod.catnip.CatnipClient; import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.outliner.Outliner; import net.createmod.catnip.utility.theme.Color; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; @@ -75,7 +75,7 @@ public class PackagePortTargetSelectionHandler { LocalPlayer player = mc.player; boolean isPostbox = AllItemTags.POSTBOXES.matches(player.getMainHandItem()); boolean isWrench = AllItemTags.WRENCH.matches(player.getMainHandItem()); - + if (!isWrench) { if (activePackageTarget == null) return; @@ -101,16 +101,16 @@ public class PackagePortTargetSelectionHandler { return; Color color = new Color(0x9ede73); animateConnection(mc, source, target, color); - CatnipClient.OUTLINER.chaseAABB("ChainPointSelected", new AABB(target, target)) + Outliner.getInstance().chaseAABB("ChainPointSelected", new AABB(target, target)) .colored(color) .lineWidth(1 / 5f) .disableLineNormals(); return; } - + Vec3 target = exactPositionOfTarget; if (blockRayTraceResult.getType() == Type.MISS) { - CatnipClient.OUTLINER.chaseAABB("ChainPointSelected", new AABB(target, target)) + Outliner.getInstance().chaseAABB("ChainPointSelected", new AABB(target, target)) .colored(0x9ede73) .lineWidth(1 / 5f) .disableLineNormals(); @@ -131,7 +131,7 @@ public class PackagePortTargetSelectionHandler { .color(color.getRGB()) .sendStatus(player); - CatnipClient.OUTLINER.chaseAABB("ChainPointSelected", new AABB(target, target)) + Outliner.getInstance().chaseAABB("ChainPointSelected", new AABB(target, target)) .colored(color) .lineWidth(1 / 5f) .disableLineNormals(); @@ -140,7 +140,7 @@ public class PackagePortTargetSelectionHandler { .canBeReplaced()) return; - CatnipClient.OUTLINER.chaseAABB("TargetedFrogPos", new AABB(pos).contract(0, 1, 0) + Outliner.getInstance().chaseAABB("TargetedFrogPos", new AABB(pos).contract(0, 1, 0) .deflate(0.125, 0, 0.125)) .colored(color) .lineWidth(1 / 16f) diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedClientHandler.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedClientHandler.java index 1bd998668a..925d97f172 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedClientHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedClientHandler.java @@ -6,8 +6,8 @@ import org.apache.commons.lang3.tuple.Pair; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; -import net.createmod.catnip.CatnipClient; import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.utility.outliner.Outliner; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; import net.minecraft.nbt.CompoundTag; @@ -46,7 +46,7 @@ public class LogisticallyLinkedClientHandler { .size(); i++) { AABB aabb = shape.toAabbs() .get(i); - CatnipClient.OUTLINER.showAABB(Pair.of(behaviour, i), aabb.inflate(-1 / 128f) + Outliner.getInstance().showAABB(Pair.of(behaviour, i), aabb.inflate(-1 / 128f) .move(be.getBlockPos()), 2) .lineWidth(1 / 32f) .disableLineNormals() diff --git a/src/main/java/com/simibubi/create/content/redstone/displayLink/ClickToLinkBlockItem.java b/src/main/java/com/simibubi/create/content/redstone/displayLink/ClickToLinkBlockItem.java index 5ab65126fd..d791446bd0 100644 --- a/src/main/java/com/simibubi/create/content/redstone/displayLink/ClickToLinkBlockItem.java +++ b/src/main/java/com/simibubi/create/content/redstone/displayLink/ClickToLinkBlockItem.java @@ -3,7 +3,7 @@ package com.simibubi.create.content.redstone.displayLink; import com.simibubi.create.AllSoundEvents; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.CatnipClient; +import net.createmod.catnip.utility.outliner.Outliner; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; @@ -20,6 +20,7 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.shapes.VoxelShape; + import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.event.entity.player.PlayerInteractEvent; @@ -154,7 +155,7 @@ public abstract class ClickToLinkBlockItem extends BlockItem { lastShownPos = selectedPos; } - CatnipClient.OUTLINER.showAABB("target", lastShownAABB) + Outliner.getInstance().showAABB("target", lastShownAABB) .colored(0xffcb74) .lineWidth(1 / 16f); } diff --git a/src/main/java/com/simibubi/create/content/redstone/link/LinkRenderer.java b/src/main/java/com/simibubi/create/content/redstone/link/LinkRenderer.java index cf1d20ad5f..c154ff1373 100644 --- a/src/main/java/com/simibubi/create/content/redstone/link/LinkRenderer.java +++ b/src/main/java/com/simibubi/create/content/redstone/link/LinkRenderer.java @@ -14,9 +14,9 @@ import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform; import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.infrastructure.config.AllConfigs; -import net.createmod.catnip.CatnipClient; import net.createmod.catnip.utility.Iterate; import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.outliner.Outliner; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.MultiBufferSource; @@ -64,7 +64,7 @@ public class LinkRenderer { if (!empty) box.wideOutline(); - CatnipClient.OUTLINER.showOutline(Pair.of(Boolean.valueOf(first), pos), box.transform(transform)) + Outliner.getInstance().showOutline(Pair.of(Boolean.valueOf(first), pos), box.transform(transform)) .highlightFace(result.getDirection()); if (!hit) diff --git a/src/main/java/com/simibubi/create/content/redstone/link/controller/LinkedControllerClientHandler.java b/src/main/java/com/simibubi/create/content/redstone/link/controller/LinkedControllerClientHandler.java index 56fd5f3891..fa78fc0543 100644 --- a/src/main/java/com/simibubi/create/content/redstone/link/controller/LinkedControllerClientHandler.java +++ b/src/main/java/com/simibubi/create/content/redstone/link/controller/LinkedControllerClientHandler.java @@ -20,9 +20,9 @@ import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.utility.ControlsUtil; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.CatnipClient; import net.createmod.catnip.utility.FontHelper.Palette; import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.utility.outliner.Outliner; import net.minecraft.ChatFormatting; import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; @@ -33,6 +33,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; import net.minecraft.world.item.ItemStack; import net.minecraft.world.phys.shapes.VoxelShape; + import net.minecraftforge.client.gui.overlay.ForgeGui; import net.minecraftforge.client.gui.overlay.IGuiOverlay; @@ -189,7 +190,7 @@ public class LinkedControllerClientHandler { VoxelShape shape = mc.level.getBlockState(selectedLocation) .getShape(mc.level, selectedLocation); if (!shape.isEmpty()) - CatnipClient.OUTLINER.showAABB("controller", shape.bounds() + Outliner.getInstance().showAABB("controller", shape.bounds() .move(selectedLocation)) .colored(0xB73C2D) .lineWidth(1 / 16f); diff --git a/src/main/java/com/simibubi/create/content/schematics/cannon/SchematicannonRenderer.java b/src/main/java/com/simibubi/create/content/schematics/cannon/SchematicannonRenderer.java index f82a511f4b..ab69eb1454 100644 --- a/src/main/java/com/simibubi/create/content/schematics/cannon/SchematicannonRenderer.java +++ b/src/main/java/com/simibubi/create/content/schematics/cannon/SchematicannonRenderer.java @@ -13,7 +13,7 @@ import com.simibubi.create.foundation.blockEntity.renderer.SafeBlockEntityRender import dev.engine_room.flywheel.api.visualization.VisualizationManager; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; -import net.createmod.catnip.render.VirtualRenderHelper; +import net.createmod.ponder.render.VirtualRenderHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; diff --git a/src/main/java/com/simibubi/create/content/schematics/client/SchematicAndQuillHandler.java b/src/main/java/com/simibubi/create/content/schematics/client/SchematicAndQuillHandler.java index a056b5100b..db72b88344 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/SchematicAndQuillHandler.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/SchematicAndQuillHandler.java @@ -16,7 +16,6 @@ import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.foundation.utility.RaycastHelper; import com.simibubi.create.foundation.utility.RaycastHelper.PredicateTraceResult; -import net.createmod.catnip.CatnipClient; import net.createmod.catnip.gui.ScreenOpener; import net.createmod.catnip.utility.AnimationTickHolder; import net.createmod.catnip.utility.VecHelper; @@ -231,7 +230,7 @@ public class SchematicAndQuillHandler { } private Outliner outliner() { - return CatnipClient.OUTLINER; + return Outliner.getInstance(); } } diff --git a/src/main/java/com/simibubi/create/content/trains/CubeParticle.java b/src/main/java/com/simibubi/create/content/trains/CubeParticle.java index 6d6dfc7dbb..f07b163ef7 100644 --- a/src/main/java/com/simibubi/create/content/trains/CubeParticle.java +++ b/src/main/java/com/simibubi/create/content/trains/CubeParticle.java @@ -8,7 +8,7 @@ import com.mojang.blaze3d.vertex.Tesselator; import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.blaze3d.vertex.VertexFormat; -import net.createmod.catnip.enums.CatnipSpecialTextures; +import net.createmod.ponder.enums.PonderSpecialTextures; import net.minecraft.client.Camera; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.particle.Particle; @@ -44,7 +44,7 @@ public class CubeParticle extends Particle { private static final ParticleRenderType RENDER_TYPE = new ParticleRenderType() { @Override public void begin(BufferBuilder builder, TextureManager textureManager) { - CatnipSpecialTextures.BLANK.bind(); + PonderSpecialTextures.BLANK.bind(); // transparent, additive blending RenderSystem.depthMask(false); diff --git a/src/main/java/com/simibubi/create/content/trains/bogey/StandardBogeyVisual.java b/src/main/java/com/simibubi/create/content/trains/bogey/StandardBogeyVisual.java index deead25eb8..40bfee9c31 100644 --- a/src/main/java/com/simibubi/create/content/trains/bogey/StandardBogeyVisual.java +++ b/src/main/java/com/simibubi/create/content/trains/bogey/StandardBogeyVisual.java @@ -14,8 +14,8 @@ import dev.engine_room.flywheel.api.visualization.VisualizationContext; import dev.engine_room.flywheel.lib.instance.InstanceTypes; import dev.engine_room.flywheel.lib.instance.TransformedInstance; import dev.engine_room.flywheel.lib.model.Models; -import net.createmod.catnip.render.VirtualRenderHelper; import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.ponder.render.VirtualRenderHelper; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/trains/entity/TrainRelocator.java b/src/main/java/com/simibubi/create/content/trains/entity/TrainRelocator.java index b701e3425a..6004d09a7b 100644 --- a/src/main/java/com/simibubi/create/content/trains/entity/TrainRelocator.java +++ b/src/main/java/com/simibubi/create/content/trains/entity/TrainRelocator.java @@ -33,9 +33,9 @@ import com.simibubi.create.content.trains.track.TrackBlockOutline.BezierPointSel import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.CatnipClient; import net.createmod.catnip.utility.Couple; import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.utility.outliner.Outliner; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; @@ -50,6 +50,7 @@ import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; + import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.event.InputEvent; @@ -122,7 +123,7 @@ public class TrainRelocator { for (int i = 0; i < toVisualise.size() - 1; i++) { Vec3 vec1 = toVisualise.get(i).add(offset); Vec3 vec2 = toVisualise.get(i + 1).add(offset); - CatnipClient.OUTLINER.showLine(Pair.of(relocating, i), vec1.add(0, -.925f, 0), vec2.add(0, -.925f, 0)) + Outliner.getInstance().showLine(Pair.of(relocating, i), vec1.add(0, -.925f, 0), vec2.add(0, -.925f, 0)) .colored(lastHoveredResult || i != toVisualise.size() - 2 ? 0x95CD41 : 0xEA5C2B) .disableLineNormals() .lineWidth(i % 2 == 1 ? 1 / 6f : 1 / 4f); @@ -270,7 +271,7 @@ public class TrainRelocator { @OnlyIn(Dist.CLIENT) public static void visualise(Train train, int i, Vec3 v1, Vec3 v2, boolean valid) { - CatnipClient.OUTLINER.showLine(Pair.of(train, i), v1.add(0, -.825f, 0), v2.add(0, -.825f, 0)) + Outliner.getInstance().showLine(Pair.of(train, i), v1.add(0, -.825f, 0), v2.add(0, -.825f, 0)) .colored(valid ? 0x95CD41 : 0xEA5C2B) .disableLineNormals() .lineWidth(i % 2 == 1 ? 1 / 6f : 1 / 4f); diff --git a/src/main/java/com/simibubi/create/content/trains/graph/TrackGraphVisualizer.java b/src/main/java/com/simibubi/create/content/trains/graph/TrackGraphVisualizer.java index d72f986b91..be4e12f435 100644 --- a/src/main/java/com/simibubi/create/content/trains/graph/TrackGraphVisualizer.java +++ b/src/main/java/com/simibubi/create/content/trains/graph/TrackGraphVisualizer.java @@ -14,7 +14,6 @@ import com.simibubi.create.content.trains.signal.SignalEdgeGroup; import com.simibubi.create.content.trains.signal.TrackEdgePoint; import com.simibubi.create.content.trains.track.BezierConnection; -import net.createmod.catnip.CatnipClient; import net.createmod.catnip.utility.Pair; import net.createmod.catnip.utility.outliner.Outliner; import net.createmod.catnip.utility.theme.Color; @@ -36,7 +35,7 @@ public class TrackGraphVisualizer { return; Vec3 camera = cameraEntity.getEyePosition(); - Outliner outliner = CatnipClient.OUTLINER; + Outliner outliner = Outliner.getInstance(); Map allGroups = Create.RAILWAYS.sided(null).signalEdgeGroups; float width = 1 / 8f; @@ -239,7 +238,7 @@ public class TrackGraphVisualizer { Vec3 yOffset = new Vec3(0, 3 / 16f, 0); Vec3 v1 = location.add(yOffset); Vec3 v2 = v1.add(node.normal.scale(3 / 16f)); - CatnipClient.OUTLINER.showLine(Integer.valueOf(node.netId), v1, v2) + Outliner.getInstance().showLine(Integer.valueOf(node.netId), v1, v2) .colored(Color.mixColors(Color.WHITE, graph.color, 1)) .lineWidth(1 / 8f); @@ -255,7 +254,7 @@ public class TrackGraphVisualizer { if (!edge.node1.location.dimension.equals(edge.node2.location.dimension)) { v1 = location.add(yOffset); v2 = v1.add(node.normal.scale(3 / 16f)); - CatnipClient.OUTLINER.showLine(Integer.valueOf(node.netId), v1, v2) + Outliner.getInstance().showLine(Integer.valueOf(node.netId), v1, v2) .colored(Color.mixColors(Color.WHITE, graph.color, 1)) .lineWidth(1 / 4f); continue; @@ -268,15 +267,15 @@ public class TrackGraphVisualizer { if (extended) { Vec3 materialPos = edge.getPosition(graph, 0.5) .add(0, 1, 0); - CatnipClient.OUTLINER.showItem(Pair.of(edge, edge.edgeData), materialPos, + Outliner.getInstance().showItem(Pair.of(edge, edge.edgeData), materialPos, edge.getTrackMaterial() .asStack()); - CatnipClient.OUTLINER.showAABB(edge.edgeData, AABB.ofSize(materialPos, .25, 0, .25) + Outliner.getInstance().showAABB(edge.edgeData, AABB.ofSize(materialPos, .25, 0, .25) .move(0, -0.5, 0)) .lineWidth(1 / 16f) .colored(graph.color); } - CatnipClient.OUTLINER.showLine(edge, edge.getPosition(graph, 0) + Outliner.getInstance().showLine(edge, edge.getPosition(graph, 0) .add(yOffset), edge.getPosition(graph, 1) .add(yOffset)) @@ -290,9 +289,9 @@ public class TrackGraphVisualizer { if (extended) { Vec3 materialPos = edge.getPosition(graph, 0.5) .add(0, 1, 0); - CatnipClient.OUTLINER.showItem(Pair.of(edge, edge.edgeData), materialPos, edge.getTrackMaterial() + Outliner.getInstance().showItem(Pair.of(edge, edge.edgeData), materialPos, edge.getTrackMaterial() .asStack()); - CatnipClient.OUTLINER.showAABB(edge.edgeData, AABB.ofSize(materialPos, .25, 0, .25) + Outliner.getInstance().showAABB(edge.edgeData, AABB.ofSize(materialPos, .25, 0, .25) .move(0, -0.5, 0)) .lineWidth(1 / 16f) .colored(graph.color); @@ -300,7 +299,7 @@ public class TrackGraphVisualizer { for (int i = 0; i <= turn.getSegmentCount(); i++) { Vec3 current = edge.getPosition(graph, i * 1f / turn.getSegmentCount()); if (previous != null) - CatnipClient.OUTLINER + Outliner.getInstance() .showLine(Pair.of(edge, previous), previous.add(yOffset), current.add(yOffset)) .colored(graph.color) .lineWidth(1 / 16f); diff --git a/src/main/java/com/simibubi/create/content/trains/track/TrackPlacement.java b/src/main/java/com/simibubi/create/content/trains/track/TrackPlacement.java index 5862c5831f..b5d1fede48 100644 --- a/src/main/java/com/simibubi/create/content/trains/track/TrackPlacement.java +++ b/src/main/java/com/simibubi/create/content/trains/track/TrackPlacement.java @@ -14,7 +14,6 @@ import com.simibubi.create.foundation.utility.BlockHelper; import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.infrastructure.config.AllConfigs; -import net.createmod.catnip.CatnipClient; import net.createmod.catnip.utility.Couple; import net.createmod.catnip.utility.Iterate; import net.createmod.catnip.utility.Pair; @@ -22,6 +21,7 @@ import net.createmod.catnip.utility.VecHelper; import net.createmod.catnip.utility.animation.LerpedFloat; import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.utility.outliner.Outliner; import net.createmod.catnip.utility.theme.Color; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; @@ -50,6 +50,7 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.HitResult.Type; import net.minecraft.world.phys.Vec3; + import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.items.ItemHandlerHelper; @@ -653,11 +654,11 @@ public class TrackPlacement { } if (hints != null && !hints.either(Collection::isEmpty)) { - CatnipClient.OUTLINER.showCluster("track_valid", hints.getFirst()) + Outliner.getInstance().showCluster("track_valid", hints.getFirst()) .withFaceTexture(AllSpecialTextures.THIN_CHECKERED) .colored(0x95CD41) .lineWidth(0); - CatnipClient.OUTLINER.showCluster("track_invalid", hints.getSecond()) + Outliner.getInstance().showCluster("track_invalid", hints.getSecond()) .withFaceTexture(AllSpecialTextures.THIN_CHECKERED) .colored(0xEA5C2B) .lineWidth(0); @@ -737,13 +738,13 @@ public class TrackPlacement { .scale(0.5f); Vec3 middle2 = rail2.add(previous2) .scale(0.5f); - CatnipClient.OUTLINER + Outliner.getInstance() .showLine(Pair.of(key, i * 2), VecHelper.lerp(s, middle1, previous1), VecHelper.lerp(s, middle1, rail1)) .colored(railcolor) .disableLineNormals() .lineWidth(lw); - CatnipClient.OUTLINER + Outliner.getInstance() .showLine(Pair.of(key, i * 2 + 1), VecHelper.lerp(s, middle2, previous2), VecHelper.lerp(s, middle2, rail2)) .colored(railcolor) @@ -756,8 +757,8 @@ public class TrackPlacement { } for (int i = segCount + 1; i <= lastLineCount; i++) { - CatnipClient.OUTLINER.remove(Pair.of(key, i * 2)); - CatnipClient.OUTLINER.remove(Pair.of(key, i * 2 + 1)); + Outliner.getInstance().remove(Pair.of(key, i * 2)); + Outliner.getInstance().remove(Pair.of(key, i * 2 + 1)); } lastLineCount = segCount; @@ -766,7 +767,7 @@ public class TrackPlacement { @OnlyIn(Dist.CLIENT) private static void line(int id, Vec3 v1, Vec3 o1, Vec3 ex) { int color = Color.mixColors(0xEA5C2B, 0x95CD41, animation.getValue()); - CatnipClient.OUTLINER.showLine(Pair.of("start", id), v1.subtract(o1), v1.add(ex)) + Outliner.getInstance().showLine(Pair.of("start", id), v1.subtract(o1), v1.add(ex)) .lineWidth(1 / 8f) .disableLineNormals() .colored(color); diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/edgeInteraction/EdgeInteractionRenderer.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/edgeInteraction/EdgeInteractionRenderer.java index fffc0bfa30..e15c5a1fc7 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/edgeInteraction/EdgeInteractionRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/edgeInteraction/EdgeInteractionRenderer.java @@ -11,9 +11,9 @@ import com.simibubi.create.foundation.blockEntity.behaviour.ValueBox; import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.CatnipClient; import net.createmod.catnip.utility.VecHelper; import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.utility.outliner.Outliner; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.core.BlockPos; @@ -80,7 +80,7 @@ public class EdgeInteractionRenderer { ValueBox box = new ValueBox(Components.immutableEmpty(), bb, pos).passive(!hit) .transform(new EdgeValueBoxTransform(offset)) .wideOutline(); - CatnipClient.OUTLINER.showOutline("edge", box) + Outliner.getInstance().showOutline("edge", box) .highlightFace(face); if (!hit) diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringRenderer.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringRenderer.java index fc055722fb..46bd094a75 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringRenderer.java @@ -16,10 +16,10 @@ import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxRenderer; import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform; import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform.Sided; -import net.createmod.catnip.CatnipClient; import net.createmod.catnip.utility.Iterate; import net.createmod.catnip.utility.Pair; import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.outliner.Outliner; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.MultiBufferSource; @@ -89,7 +89,7 @@ public class FilteringRenderer { ValueBox box = new ItemValueBox(label, bb, pos, filter, behaviour.getCountLabelForValueBox()); box.passive(!hit || behaviour.bypassesInput(mainhandItem)); - CatnipClient.OUTLINER + Outliner.getInstance() .showOutline(Pair.of("filter" + behaviour.netId(), pos), box.transform(behaviour.slotPositioning)) .lineWidth(1 / 64f) .withFaceTexture(hit ? AllSpecialTextures.THIN_CHECKERED : null) diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/scrollValue/ScrollValueRenderer.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/scrollValue/ScrollValueRenderer.java index 7568f35098..e450cfc9cb 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/scrollValue/ScrollValueRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/scrollValue/ScrollValueRenderer.java @@ -13,8 +13,8 @@ import com.simibubi.create.foundation.blockEntity.behaviour.ValueBox.IconValueBo import com.simibubi.create.foundation.blockEntity.behaviour.ValueBox.TextValueBox; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.CatnipClient; import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.utility.outliner.Outliner; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.core.BlockPos; @@ -50,7 +50,7 @@ public class ScrollValueRenderer { continue; if (!behaviour.isActive()) { - CatnipClient.OUTLINER.remove(behaviour); + Outliner.getInstance().remove(behaviour); continue; } @@ -98,7 +98,7 @@ public class ScrollValueRenderer { box.passive(!highlight) .wideOutline(); - CatnipClient.OUTLINER.showOutline(behaviour, box.transform(behaviour.slotPositioning)) + Outliner.getInstance().showOutline(behaviour, box.transform(behaviour.slotPositioning)) .highlightFace(face); } diff --git a/src/main/java/com/simibubi/create/infrastructure/command/ClearBufferCacheCommand.java b/src/main/java/com/simibubi/create/infrastructure/command/ClearBufferCacheCommand.java index b91f2e965b..41fd164c52 100644 --- a/src/main/java/com/simibubi/create/infrastructure/command/ClearBufferCacheCommand.java +++ b/src/main/java/com/simibubi/create/infrastructure/command/ClearBufferCacheCommand.java @@ -3,10 +3,11 @@ package com.simibubi.create.infrastructure.command; import com.mojang.brigadier.builder.ArgumentBuilder; import com.simibubi.create.CreateClient; -import net.createmod.catnip.CatnipClient; import net.createmod.catnip.utility.lang.Components; +import net.createmod.ponder.PonderClient; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; + import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fml.DistExecutor; @@ -26,7 +27,7 @@ public class ClearBufferCacheCommand { @OnlyIn(Dist.CLIENT) private static void execute() { - CatnipClient.invalidateRenderers(); + PonderClient.invalidateRenderers(); CreateClient.invalidateRenderers(); } } diff --git a/src/main/java/com/simibubi/create/infrastructure/command/HighlightPacket.java b/src/main/java/com/simibubi/create/infrastructure/command/HighlightPacket.java index 343b83c467..42ec509823 100644 --- a/src/main/java/com/simibubi/create/infrastructure/command/HighlightPacket.java +++ b/src/main/java/com/simibubi/create/infrastructure/command/HighlightPacket.java @@ -3,11 +3,12 @@ package com.simibubi.create.infrastructure.command; import com.simibubi.create.AllSpecialTextures; import com.simibubi.create.foundation.networking.SimplePacketBase; -import net.createmod.catnip.CatnipClient; +import net.createmod.catnip.utility.outliner.Outliner; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.phys.shapes.Shapes; + import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fml.DistExecutor; @@ -43,7 +44,7 @@ public class HighlightPacket extends SimplePacketBase { if (Minecraft.getInstance().level == null || !Minecraft.getInstance().level.isLoaded(pos)) return; - CatnipClient.OUTLINER.showAABB("highlightCommand", Shapes.block() + Outliner.getInstance().showAABB("highlightCommand", Shapes.block() .bounds() .move(pos), 200) .lineWidth(1 / 32f) diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index 4c66cec392..4b0f1c22a1 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -37,13 +37,6 @@ ${mod_description} ordering="AFTER" side="CLIENT" -[[dependencies.create]] - modId="catnip" - mandatory=true - versionRange="[0.8,)" - ordering="AFTER" - side="BOTH" - [[dependencies.create]] modId="ponder" mandatory=true From b04a2828c1713e729d79e811d878297efc713e09 Mon Sep 17 00:00:00 2001 From: zelophed Date: Fri, 17 Jan 2025 17:27:14 +0100 Subject: [PATCH 316/515] util shuffle - refactor and flatten catnip.utility package --- .../java/com/simibubi/create/AllBlocks.java | 4 +-- .../com/simibubi/create/AllBogeyStyles.java | 2 +- .../simibubi/create/AllCreativeModeTabs.java | 10 +++--- .../com/simibubi/create/AllEntityTypes.java | 6 ++-- .../java/com/simibubi/create/AllFluids.java | 2 +- .../com/simibubi/create/AllPartialModels.java | 16 ++++----- .../com/simibubi/create/AllParticleTypes.java | 2 +- .../com/simibubi/create/AllRecipeTypes.java | 4 +-- .../java/com/simibubi/create/AllShapes.java | 4 +-- .../com/simibubi/create/AllSpriteShifts.java | 8 ++--- .../java/com/simibubi/create/AllTags.java | 2 +- src/main/java/com/simibubi/create/Create.java | 4 +-- .../com/simibubi/create/CreateClient.java | 4 +-- .../api/connectivity/ConnectivityHandler.java | 3 +- .../java/com/simibubi/create/compat/Mods.java | 3 +- .../peripherals/StationPeripheral.java | 3 +- .../jei/PotionFluidSubtypeInterpreter.java | 3 +- .../compat/jei/category/BasinCategory.java | 16 +++++---- .../jei/category/CreateRecipeCategory.java | 22 ++++++++----- .../compat/jei/category/CrushingCategory.java | 12 ++++--- .../category/MechanicalCraftingCategory.java | 3 +- .../category/SequencedAssemblyCategory.java | 19 ++++++----- .../animations/AnimatedBlazeBurner.java | 5 ++- .../category/animations/AnimatedDeployer.java | 3 +- .../category/animations/AnimatedKinetics.java | 2 +- .../category/animations/AnimatedMixer.java | 3 +- .../category/animations/AnimatedPress.java | 3 +- .../category/animations/AnimatedSpout.java | 8 +++-- .../compat/trainmap/TrainMapManager.java | 10 +++--- .../compat/trainmap/TrainMapRenderer.java | 2 +- .../create/compat/trainmap/TrainMapSync.java | 3 +- .../compat/trainmap/TrainMapSyncClient.java | 6 ++-- .../compat/trainmap/TrainMapSyncPacket.java | 3 +- .../AbstractContraptionEntity.java | 5 +-- .../content/contraptions/Contraption.java | 19 ++++++----- .../contraptions/ContraptionCollider.java | 33 ++++++++++--------- .../contraptions/ContraptionHandler.java | 4 +-- .../ContraptionHandlerClient.java | 20 ++++++----- .../contraptions/ContraptionWorld.java | 2 +- .../ControlledContraptionEntity.java | 7 ++-- .../DirectionalExtenderScrollOptionSlot.java | 2 +- .../contraptions/IControlContraption.java | 2 +- .../IDisplayAssemblyExceptions.java | 4 +-- .../contraptions/MountedFluidStorage.java | 8 +++-- .../content/contraptions/MountedStorage.java | 21 ++++++------ .../contraptions/MountedStorageManager.java | 9 ++--- .../OrientedContraptionEntity.java | 11 ++++--- .../contraptions/StructureTransform.java | 3 +- .../ContraptionControlsBlockEntity.java | 8 ++--- .../ContraptionControlsMovement.java | 9 ++--- .../ContraptionControlsRenderer.java | 12 +++---- .../harvester/HarvesterActorVisual.java | 6 ++-- .../harvester/HarvesterMovementBehaviour.java | 3 +- .../actors/harvester/HarvesterRenderer.java | 8 ++--- .../plough/PloughMovementBehaviour.java | 3 +- .../contraptions/actors/psi/PIInstance.java | 2 +- .../actors/psi/PSIActorVisual.java | 4 +-- .../PortableStorageInterfaceBlockEntity.java | 2 +- .../psi/PortableStorageInterfaceMovement.java | 7 ++-- .../psi/PortableStorageInterfaceRenderer.java | 6 ++-- .../contraptions/actors/roller/PaveTask.java | 2 +- .../actors/roller/RollerBlock.java | 4 +-- .../actors/roller/RollerBlockEntity.java | 8 ++--- .../roller/RollerMovementBehaviour.java | 9 ++--- .../actors/roller/RollerRenderer.java | 4 +-- .../actors/roller/TrackPaverV2.java | 6 ++-- .../ContraptionPlayerPassengerRotation.java | 4 +-- .../actors/seat/SeatMovementBehaviour.java | 2 +- .../ControlsMovementBehaviour.java | 9 ++--- .../trainControls/ControlsRenderer.java | 4 +-- .../trainControls/ControlsServerHandler.java | 4 +-- .../contraptions/bearing/BearingRenderer.java | 2 +- .../contraptions/bearing/BearingVisual.java | 2 +- .../bearing/ClockworkBearingBlockEntity.java | 4 +-- .../bearing/ClockworkContraption.java | 2 +- .../bearing/MechanicalBearingBlockEntity.java | 2 +- .../contraptions/bearing/SailBlock.java | 8 ++--- .../StabilizedBearingMovementBehaviour.java | 3 +- .../bearing/StabilizedBearingVisual.java | 2 +- .../bearing/WindmillBearingBlock.java | 2 +- .../bearing/WindmillBearingBlockEntity.java | 2 +- .../behaviour/MovementContext.java | 2 +- .../chassis/AbstractChassisBlock.java | 4 ++- .../chassis/ChassisBlockEntity.java | 3 +- .../chassis/ChassisRangeDisplay.java | 2 +- .../chassis/StickerBlockEntity.java | 5 +-- .../contraptions/chassis/StickerRenderer.java | 6 ++-- .../contraptions/chassis/StickerVisual.java | 2 +- .../contraptions/elevator/ElevatorColumn.java | 10 +++--- .../elevator/ElevatorContactBlockEntity.java | 4 +-- .../elevator/ElevatorContactScreen.java | 8 +++-- .../elevator/ElevatorContraption.java | 5 +-- .../elevator/ElevatorControlsHandler.java | 3 +- .../elevator/ElevatorFloorListPacket.java | 12 ++++--- .../elevator/ElevatorPulleyRenderer.java | 2 +- .../elevator/ElevatorPulleyVisual.java | 2 +- .../gantry/GantryCarriageBlock.java | 2 +- .../gantry/GantryCarriageRenderer.java | 8 ++--- .../gantry/GantryCarriageVisual.java | 4 +-- .../gantry/GantryContraptionEntity.java | 6 ++-- .../contraptions/glue/SuperGlueEntity.java | 7 ++-- .../contraptions/glue/SuperGlueHandler.java | 14 ++++---- .../contraptions/glue/SuperGlueItem.java | 3 +- .../glue/SuperGlueSelectionHandler.java | 4 +-- .../glue/SuperGlueSelectionHelper.java | 2 +- .../minecart/CouplingHandler.java | 5 +-- .../minecart/CouplingHandlerClient.java | 6 ++-- .../minecart/CouplingPhysics.java | 7 ++-- .../minecart/CouplingRenderer.java | 10 +++--- .../minecart/MinecartCouplingItem.java | 3 +- .../minecart/MinecartSim2020.java | 8 +++-- .../CapabilityMinecartController.java | 9 ++--- .../capability/MinecartController.java | 28 +++++++++------- .../mounted/CartAssembleRailType.java | 2 +- .../mounted/CartAssemblerBlockEntity.java | 9 ++--- .../mounted/MinecartContraptionItem.java | 14 +++++--- .../mounted/MountedContraption.java | 7 ++-- .../piston/MechanicalPistonBlock.java | 3 +- .../piston/PistonContraption.java | 2 +- .../piston/PistonExtensionPoleBlock.java | 4 +-- .../pulley/AbstractPulleyVisual.java | 4 +-- .../pulley/PulleyBlockEntity.java | 14 ++++---- .../render/ContraptionMatrices.java | 2 +- .../render/ContraptionRenderInfoManager.java | 3 +- .../sync/ContraptionSeatMappingPacket.java | 3 +- .../contraptions/wrench/RadialWrenchMenu.java | 6 ++-- .../content/decoration/MetalLadderBlock.java | 7 ++-- .../decoration/RoofBlockCTBehaviour.java | 2 +- .../decoration/bracket/BracketBlock.java | 2 +- .../BracketedBlockEntityBehaviour.java | 2 +- .../copycat/CopycatBlockEntity.java | 12 ++++--- .../decoration/copycat/CopycatModel.java | 3 +- .../decoration/copycat/CopycatPanelBlock.java | 13 ++++---- .../decoration/copycat/CopycatPanelModel.java | 3 +- .../decoration/copycat/CopycatStepBlock.java | 8 ++--- .../decoration/copycat/CopycatStepModel.java | 3 +- .../girder/ConnectedGirderModel.java | 3 +- .../decoration/girder/GirderBlock.java | 6 ++-- .../girder/GirderBlockStateGenerator.java | 3 +- .../girder/GirderPlacementHelper.java | 12 ++++--- .../girder/GirderWrenchBehavior.java | 12 +++---- .../palettes/AllPaletteStoneTypes.java | 14 ++++---- .../palettes/ConnectedPillarBlock.java | 2 +- .../palettes/PaletteBlockPartial.java | 3 +- .../placard/PlacardBlockEntity.java | 10 +++--- .../decoration/placard/PlacardRenderer.java | 2 +- .../decoration/slidingDoor/DoorControl.java | 7 ++-- .../slidingDoor/DoorControlBehaviour.java | 2 +- .../slidingDoor/SlidingDoorBlockEntity.java | 4 +-- .../SlidingDoorMovementBehaviour.java | 2 +- .../slidingDoor/SlidingDoorRenderer.java | 7 ++-- .../decoration/steamWhistle/WhistleBlock.java | 3 +- .../steamWhistle/WhistleBlockEntity.java | 9 ++--- .../steamWhistle/WhistleExtenderBlock.java | 2 +- .../steamWhistle/WhistleRenderer.java | 6 ++-- .../content/equipment/TreeFertilizerItem.java | 2 +- .../equipment/armor/BacktankArmorLayer.java | 6 ++-- .../equipment/armor/BacktankBlockEntity.java | 14 ++++---- .../equipment/armor/BacktankRenderer.java | 6 ++-- .../content/equipment/armor/BacktankUtil.java | 12 ++++--- .../armor/CardboardArmorHandlerClient.java | 3 +- .../armor/CardboardArmorStealthOverlay.java | 5 +-- .../equipment/armor/DivingBootsItem.java | 3 +- .../equipment/armor/RemainingAirOverlay.java | 10 +++--- .../bell/AbstractBellBlockEntity.java | 3 +- .../content/equipment/bell/BellRenderer.java | 2 +- .../equipment/bell/HauntedBellPulser.java | 2 +- .../equipment/bell/SoulPulseEffect.java | 2 +- .../equipment/blueprint/BlueprintEntity.java | 4 +-- .../blueprint/BlueprintOverlayRenderer.java | 13 ++++---- .../blueprint/BlueprintRenderer.java | 2 +- .../equipment/clipboard/ClipboardEntry.java | 2 +- .../equipment/clipboard/ClipboardScreen.java | 2 +- .../ClipboardValueSettingsHandler.java | 2 +- .../extendoGrip/ExtendoGripItem.java | 2 +- .../extendoGrip/ExtendoGripItemRenderer.java | 2 +- .../extendoGrip/ExtendoGripRenderHandler.java | 2 +- .../equipment/goggles/GoggleConfigScreen.java | 2 +- .../goggles/GoggleOverlayRenderer.java | 12 +++---- .../goggles/IHaveGoggleInformation.java | 2 +- .../content/equipment/hats/EntityHats.java | 4 +-- .../BuiltinPotatoProjectileTypes.java | 2 +- .../potatoCannon/PotatoCannonItem.java | 6 ++-- .../PotatoCannonItemRenderer.java | 2 +- .../PotatoCannonRenderHandler.java | 2 +- .../potatoCannon/PotatoProjectileEntity.java | 2 +- .../PotatoProjectileRenderMode.java | 2 +- .../equipment/sandPaper/SandPaperItem.java | 2 +- .../sandPaper/SandPaperItemRenderer.java | 2 +- .../symmetryWand/SymmetryHandler.java | 4 +-- .../symmetryWand/SymmetryWandItem.java | 4 +-- .../SymmetryWandItemRenderer.java | 2 +- .../symmetryWand/SymmetryWandScreen.java | 2 +- .../equipment/toolbox/RadialToolboxMenu.java | 6 ++-- .../equipment/toolbox/ToolBoxVisual.java | 2 +- .../equipment/toolbox/ToolboxBlockEntity.java | 6 ++-- .../equipment/toolbox/ToolboxHandler.java | 2 +- .../equipment/toolbox/ToolboxInventory.java | 2 +- .../equipment/toolbox/ToolboxRenderer.java | 2 +- .../equipment/toolbox/ToolboxScreen.java | 2 +- .../content/equipment/wrench/IWrenchable.java | 2 +- .../equipment/wrench/WrenchItemRenderer.java | 2 +- .../equipment/zapper/PlacementPatterns.java | 2 +- .../content/equipment/zapper/ZapperItem.java | 4 +-- .../equipment/zapper/ZapperRenderHandler.java | 2 +- .../equipment/zapper/ZapperScreen.java | 4 +-- .../zapper/terrainzapper/CylinderBrush.java | 2 +- .../terrainzapper/PlacementOptions.java | 2 +- .../zapper/terrainzapper/SphereBrush.java | 2 +- .../zapper/terrainzapper/TerrainTools.java | 2 +- .../zapper/terrainzapper/WorldshaperItem.java | 2 +- .../WorldshaperItemRenderer.java | 2 +- .../WorldshaperRenderHandler.java | 4 +-- .../terrainzapper/WorldshaperScreen.java | 4 +-- .../create/content/fluids/FlowSource.java | 2 +- .../create/content/fluids/FluidFX.java | 2 +- .../create/content/fluids/FluidNetwork.java | 6 ++-- .../content/fluids/FluidPropagator.java | 4 +-- .../fluids/FluidTransportBehaviour.java | 4 +-- .../create/content/fluids/OpenEndedPipe.java | 2 +- .../content/fluids/PipeAttachmentModel.java | 12 +++---- .../create/content/fluids/PipeConnection.java | 10 +++--- .../fluids/drain/ItemDrainBlockEntity.java | 6 ++-- .../fluids/drain/ItemDrainRenderer.java | 2 +- .../fluids/hosePulley/HosePulleyBlock.java | 2 +- .../hosePulley/HosePulleyBlockEntity.java | 2 +- .../fluids/particle/BasinFluidParticle.java | 2 +- .../fluids/particle/FluidStackParticle.java | 2 +- .../content/fluids/pipes/AxisPipeBlock.java | 2 +- .../fluids/pipes/EncasedPipeBlock.java | 2 +- .../content/fluids/pipes/FluidPipeBlock.java | 2 +- .../fluids/pipes/FluidPipeBlockRotation.java | 2 +- .../fluids/pipes/SmartFluidPipeBlock.java | 4 +-- .../pipes/SmartFluidPipeBlockEntity.java | 4 +-- .../TransparentStraightPipeRenderer.java | 4 +-- .../fluids/pipes/valve/FluidValveBlock.java | 2 +- .../pipes/valve/FluidValveBlockEntity.java | 4 +-- .../pipes/valve/FluidValveRenderer.java | 2 +- .../fluids/pipes/valve/FluidValveVisual.java | 2 +- .../content/fluids/potion/PotionFluid.java | 2 +- .../fluids/potion/PotionFluidHandler.java | 8 ++--- .../create/content/fluids/pump/PumpBlock.java | 2 +- .../content/fluids/pump/PumpBlockEntity.java | 8 ++--- .../fluids/spout/SpoutBlockEntity.java | 4 +-- .../content/fluids/tank/BoilerData.java | 8 ++--- .../content/fluids/tank/FluidTankBlock.java | 2 +- .../fluids/tank/FluidTankBlockEntity.java | 6 ++-- .../content/fluids/tank/FluidTankModel.java | 2 +- .../fluids/tank/FluidTankRenderer.java | 4 +-- .../fluids/transfer/FillingRecipe.java | 2 +- .../transfer/FluidDrainingBehaviour.java | 4 +-- .../transfer/FluidFillingBehaviour.java | 4 +-- .../transfer/FluidManipulationBehaviour.java | 6 ++-- .../fluids/transfer/GenericItemEmptying.java | 2 +- .../content/kinetics/BlockStressDefaults.java | 2 +- .../content/kinetics/BlockStressValues.java | 2 +- .../content/kinetics/KineticDebugger.java | 6 ++-- .../content/kinetics/RotationPropagator.java | 2 +- .../content/kinetics/TorquePropagator.java | 2 +- .../base/BlockBreakingKineticBlockEntity.java | 2 +- .../base/DirectionalAxisKineticBlock.java | 2 +- .../base/DirectionalKineticBlock.java | 2 +- .../base/HorizontalAxisKineticBlock.java | 2 +- .../kinetics/base/HorizontalKineticBlock.java | 2 +- .../create/content/kinetics/base/IRotate.java | 4 +-- .../kinetics/base/KineticBlockEntity.java | 2 +- .../base/KineticBlockEntityRenderer.java | 6 ++-- .../kinetics/base/KineticEffectHandler.java | 2 +- .../base/RotatedPillarKineticBlock.java | 2 +- .../kinetics/base/RotatingInstance.java | 2 +- .../base/RotationIndicatorParticle.java | 8 ++--- .../content/kinetics/belt/BeltBlock.java | 4 +-- .../kinetics/belt/BeltBlockEntity.java | 2 +- .../content/kinetics/belt/BeltHelper.java | 2 +- .../content/kinetics/belt/BeltPart.java | 2 +- .../content/kinetics/belt/BeltRenderer.java | 10 +++--- .../content/kinetics/belt/BeltShapes.java | 2 +- .../content/kinetics/belt/BeltSlicer.java | 6 ++-- .../content/kinetics/belt/BeltSlope.java | 2 +- .../content/kinetics/belt/BeltVisual.java | 2 +- .../TransportedItemStackHandlerBehaviour.java | 2 +- .../kinetics/belt/item/BeltConnectorItem.java | 2 +- .../BeltTunnelInteractionHandler.java | 2 +- .../ChainConveyorBlockEntity.java | 10 +++--- .../ChainConveyorConnectionHandler.java | 6 ++-- .../ChainConveyorInteractionHandler.java | 6 ++-- .../chainConveyor/ChainConveyorPackage.java | 16 ++++----- .../chainConveyor/ChainConveyorRenderer.java | 8 ++--- .../ChainConveyorRidingHandler.java | 4 +-- .../ChainConveyorRoutingTable.java | 2 +- .../chainConveyor/ChainConveyorShape.java | 2 +- .../chainConveyor/ChainConveyorVisual.java | 4 +-- .../ChainPackageInteractionPacket.java | 2 +- .../kinetics/chainDrive/ChainDriveBlock.java | 4 +-- .../clock/CuckooClockBlockEntity.java | 10 +++--- .../kinetics/clock/CuckooClockRenderer.java | 2 +- .../crafter/ConnectedInputHandler.java | 2 +- .../crafter/MechanicalCrafterBlock.java | 8 ++--- .../crafter/MechanicalCrafterBlockEntity.java | 8 ++--- .../crafter/MechanicalCrafterRenderer.java | 6 ++-- .../kinetics/crafter/RecipeGridHandler.java | 4 +-- .../kinetics/crank/HandCrankBlock.java | 2 +- .../kinetics/crank/HandCrankBlockEntity.java | 2 +- .../kinetics/crank/ValveHandleBlock.java | 2 +- .../crank/ValveHandleBlockEntity.java | 4 +-- .../kinetics/crusher/CrushingWheelBlock.java | 2 +- .../crusher/CrushingWheelBlockEntity.java | 2 +- .../crusher/CrushingWheelControllerBlock.java | 2 +- .../CrushingWheelControllerBlockEntity.java | 4 +-- .../deployer/DeployerActorVisual.java | 8 ++--- .../deployer/DeployerApplicationRecipe.java | 2 +- .../kinetics/deployer/DeployerBlock.java | 6 ++-- .../deployer/DeployerBlockEntity.java | 8 ++--- .../kinetics/deployer/DeployerFilterSlot.java | 4 +-- .../kinetics/deployer/DeployerHandler.java | 2 +- .../deployer/DeployerMovementBehaviour.java | 6 ++-- .../deployer/DeployerMovingInteraction.java | 2 +- .../kinetics/deployer/DeployerRenderer.java | 13 ++++---- .../kinetics/deployer/DeployerVisual.java | 2 +- .../kinetics/drill/CobbleGenOptimisation.java | 6 ++-- .../kinetics/drill/DrillActorVisual.java | 4 +-- .../content/kinetics/drill/DrillBlock.java | 6 ++-- .../drill/DrillMovementBehaviour.java | 2 +- .../content/kinetics/drill/DrillRenderer.java | 6 ++-- .../content/kinetics/fan/AirCurrent.java | 4 +-- .../content/kinetics/fan/AirFlowParticle.java | 2 +- .../content/kinetics/fan/EncasedFanBlock.java | 2 +- .../kinetics/fan/EncasedFanRenderer.java | 4 +-- .../kinetics/fan/NozzleBlockEntity.java | 2 +- .../fan/processing/AllFanProcessingTypes.java | 8 ++--- .../flywheel/FlywheelBlockEntity.java | 4 +-- .../kinetics/flywheel/FlywheelRenderer.java | 2 +- .../kinetics/flywheel/FlywheelVisual.java | 2 +- .../kinetics/gantry/GantryShaftBlock.java | 10 +++--- .../gantry/GantryShaftBlockEntity.java | 2 +- .../content/kinetics/gauge/GaugeBlock.java | 10 +++--- .../content/kinetics/gauge/GaugeRenderer.java | 2 +- .../content/kinetics/gauge/GaugeShaper.java | 2 +- .../content/kinetics/gauge/GaugeVisual.java | 6 ++-- .../kinetics/gauge/SpeedGaugeBlockEntity.java | 2 +- .../gauge/StressGaugeBlockEntity.java | 4 +-- .../kinetics/gearbox/GearboxRenderer.java | 6 ++-- .../kinetics/gearbox/GearboxVisual.java | 2 +- .../kinetics/gearbox/VerticalGearboxItem.java | 2 +- .../AllArmInteractionPointTypes.java | 3 +- .../mechanicalArm/ArmAngleTarget.java | 4 +-- .../mechanicalArm/ArmBlockEntity.java | 10 +++--- .../mechanicalArm/ArmInteractionPoint.java | 4 +-- .../ArmInteractionPointHandler.java | 2 +- .../kinetics/mechanicalArm/ArmRenderer.java | 9 +++-- .../kinetics/mechanicalArm/ArmVisual.java | 8 ++--- .../kinetics/millstone/MillstoneBlock.java | 2 +- .../millstone/MillstoneBlockEntity.java | 2 +- .../mixer/MechanicalMixerBlockEntity.java | 6 ++-- .../mixer/MechanicalMixerRenderer.java | 4 +-- .../motor/CreativeMotorBlockEntity.java | 4 +-- .../motor/KineticScrollValueBehaviour.java | 2 +- .../press/MechanicalPressBlockEntity.java | 2 +- .../content/kinetics/press/PressVisual.java | 2 +- .../kinetics/press/PressingBehaviour.java | 4 +-- .../create/content/kinetics/saw/SawBlock.java | 6 ++-- .../content/kinetics/saw/SawBlockEntity.java | 6 ++-- .../content/kinetics/saw/SawFilterSlot.java | 2 +- .../kinetics/saw/SawMovementBehaviour.java | 2 +- .../content/kinetics/saw/SawRenderer.java | 4 +-- .../BracketedKineticBlockEntityRenderer.java | 4 +-- .../kinetics/simpleRelays/CogWheelBlock.java | 2 +- .../simpleRelays/CogwheelBlockItem.java | 8 ++--- .../kinetics/simpleRelays/ShaftBlock.java | 6 ++-- .../encased/EncasedCogCTBehaviour.java | 2 +- .../encased/EncasedCogRenderer.java | 2 +- .../encased/EncasedCogVisual.java | 2 +- .../encased/EncasedCogwheelBlock.java | 4 +-- .../speedController/SpeedControllerBlock.java | 6 ++-- .../SpeedControllerBlockEntity.java | 2 +- .../steamEngine/PoweredShaftBlock.java | 6 ++-- .../steamEngine/SteamEngineBlock.java | 8 ++--- .../steamEngine/SteamEngineBlockEntity.java | 4 +-- .../steamEngine/SteamEngineRenderer.java | 2 +- .../steamEngine/SteamEngineValueBox.java | 6 ++-- .../steamEngine/SteamEngineVisual.java | 2 +- .../transmission/SplitShaftRenderer.java | 6 ++-- .../transmission/SplitShaftVisual.java | 2 +- .../transmission/sequencer/Instruction.java | 2 +- .../sequencer/InstructionSpeedModifiers.java | 4 +-- .../SequencedGearshiftBlockEntity.java | 2 +- .../sequencer/SequencedGearshiftScreen.java | 2 +- .../sequencer/SequencerInstructions.java | 2 +- .../kinetics/turntable/TurntableBlock.java | 2 +- .../kinetics/turntable/TurntableHandler.java | 4 +-- .../waterwheel/LargeWaterWheelBlock.java | 6 ++-- .../waterwheel/LargeWaterWheelBlockItem.java | 4 +-- .../kinetics/waterwheel/WaterWheelBlock.java | 8 ++--- .../waterwheel/WaterWheelBlockEntity.java | 4 +-- .../legacy/ChromaticCompoundColor.java | 4 +-- .../content/legacy/ChromaticCompoundItem.java | 4 +-- .../legacy/NoGravMagicalDohickyItem.java | 2 +- .../content/logistics/AddressEditBox.java | 2 +- .../logistics/AddressEditBoxHelper.java | 2 +- .../create/content/logistics/FlapStuffs.java | 4 +-- .../logistics/box/PackageDestroyPacket.java | 6 ++-- .../content/logistics/box/PackageEntity.java | 10 +++--- .../content/logistics/box/PackageItem.java | 6 ++-- .../logistics/box/PackageRenderer.java | 2 +- .../logistics/chute/AbstractChuteBlock.java | 2 +- .../content/logistics/chute/ChuteBlock.java | 4 +-- .../logistics/chute/ChuteBlockEntity.java | 10 +++--- .../SmartChuteFilterSlotPositioning.java | 4 +-- .../logistics/depot/DepotBehaviour.java | 4 +-- .../logistics/depot/DepotRenderer.java | 2 +- .../content/logistics/depot/EjectorBlock.java | 2 +- .../logistics/depot/EjectorBlockEntity.java | 16 ++++----- .../logistics/depot/EjectorRenderer.java | 6 ++-- .../logistics/depot/EjectorTargetHandler.java | 8 ++--- .../logistics/depot/EntityLauncher.java | 4 +-- .../depot/SharedDepotBlockMethods.java | 2 +- .../factoryBoard/FactoryPanelBehaviour.java | 14 ++++---- .../factoryBoard/FactoryPanelBlock.java | 4 +-- .../factoryBoard/FactoryPanelBlockEntity.java | 10 +++--- .../factoryBoard/FactoryPanelConnection.java | 4 +-- .../FactoryPanelConnectionHandler.java | 6 ++-- .../factoryBoard/FactoryPanelModel.java | 4 +-- .../factoryBoard/FactoryPanelRenderer.java | 2 +- .../FactoryPanelSlotPositioning.java | 4 +-- .../FactoryPanelSupportBehaviour.java | 2 +- .../filter/AbstractFilterScreen.java | 2 +- .../logistics/filter/AttributeFilterMenu.java | 4 +-- .../filter/AttributeFilterScreen.java | 4 +-- .../content/logistics/filter/FilterItem.java | 2 +- .../logistics/filter/FilterItemStack.java | 2 +- .../logistics/filter/FilterScreen.java | 2 +- .../logistics/funnel/BeltFunnelBlock.java | 4 +-- .../content/logistics/funnel/FunnelBlock.java | 2 +- .../logistics/funnel/FunnelBlockEntity.java | 8 ++--- .../funnel/FunnelFilterSlotPositioning.java | 4 +-- .../attributes/EnchantAttribute.java | 4 +-- .../attribute/attributes/InTagAttribute.java | 2 +- .../AstralSorceryAmuletAttribute.java | 2 +- .../AstralSorceryAttunementAttribute.java | 2 +- .../AstralSorceryCrystalAttribute.java | 2 +- .../AstralSorceryPerkGemAttribute.java | 2 +- .../logistics/itemHatch/HatchFilterSlot.java | 6 ++-- .../packagePort/PackagePortBlockEntity.java | 6 ++-- .../packagePort/PackagePortScreen.java | 2 +- .../PackagePortTargetSelectionHandler.java | 6 ++-- .../packagePort/frogport/FrogportBlock.java | 6 ++-- .../frogport/FrogportBlockEntity.java | 16 ++++----- .../frogport/FrogportRenderer.java | 2 +- .../postbox/PostboxBlockEntity.java | 6 ++-- .../packagePort/postbox/PostboxRenderer.java | 2 +- .../logistics/packager/InventorySummary.java | 6 ++-- .../packager/PackagerBlockEntity.java | 10 +++--- .../logistics/packager/PackagerRenderer.java | 2 +- .../LogisticallyLinkedBehaviour.java | 6 ++-- .../LogisticallyLinkedClientHandler.java | 4 +-- .../packagerLink/LogisticsManager.java | 4 +-- .../packagerLink/LogisticsNetwork.java | 4 +-- .../LogisticsNetworkSavedData.java | 2 +- .../packagerLink/PackagerLinkBlock.java | 2 +- .../packagerLink/PackagerLinkBlockEntity.java | 2 +- .../packagerLink/RequestPromiseQueue.java | 2 +- .../RedstoneRequesterBlockEntity.java | 2 +- .../logistics/stockTicker/PackageOrder.java | 2 +- .../StockKeeperCategoryScreen.java | 10 +++--- .../stockTicker/StockKeeperRequestScreen.java | 32 +++++++++--------- .../stockTicker/StockTickerBlockEntity.java | 8 ++--- .../StockTickerInteractionHandler.java | 6 ++-- .../tableCloth/ShoppingListItem.java | 8 ++--- .../logistics/tableCloth/TableClothBlock.java | 6 ++-- .../tableCloth/TableClothBlockEntity.java | 8 ++--- .../tableCloth/TableClothFilterSlot.java | 4 +-- .../TableClothFilteringBehaviour.java | 8 ++--- .../logistics/tableCloth/TableClothModel.java | 2 +- .../logistics/tunnel/BeltTunnelBlock.java | 4 +-- .../tunnel/BeltTunnelBlockEntity.java | 6 ++-- .../logistics/tunnel/BeltTunnelRenderer.java | 2 +- .../logistics/tunnel/BeltTunnelShapes.java | 2 +- .../logistics/tunnel/BeltTunnelVisual.java | 2 +- .../tunnel/BrassTunnelBlockEntity.java | 10 +++--- .../tunnel/BrassTunnelFilterSlot.java | 2 +- .../logistics/vault/ItemVaultItem.java | 2 +- .../content/materials/ExperienceBlock.java | 2 +- .../materials/ExperienceNuggetItem.java | 2 +- .../processing/basin/BasinBlockEntity.java | 20 +++++------ .../content/processing/basin/BasinRecipe.java | 6 ++-- .../processing/basin/BasinRenderer.java | 10 +++--- .../processing/burner/BlazeBurnerBlock.java | 2 +- .../burner/BlazeBurnerBlockEntity.java | 14 ++++---- .../burner/BlazeBurnerBlockItem.java | 2 +- .../BlazeBurnerInteractionBehaviour.java | 2 +- .../burner/BlazeBurnerMovementBehaviour.java | 10 +++--- .../burner/BlazeBurnerRenderer.java | 10 +++--- .../processing/burner/BlazeBurnerVisual.java | 7 ++-- .../burner/LitBlazeBurnerBlock.java | 2 +- .../processing/recipe/HeatCondition.java | 2 +- .../processing/recipe/ProcessingOutput.java | 2 +- .../recipe/ProcessingRecipeBuilder.java | 2 +- .../sequenced/SequencedAssemblyItem.java | 2 +- .../sequenced/SequencedAssemblyRecipe.java | 4 +-- .../redstone/FilteredDetectorFilterSlot.java | 4 +-- .../content/redstone/RoseQuartzLampBlock.java | 2 +- .../analogLever/AnalogLeverBlockEntity.java | 4 +-- .../analogLever/AnalogLeverRenderer.java | 4 +-- .../analogLever/AnalogLeverVisual.java | 4 +-- .../deskBell/DeskBellBlockEntity.java | 6 ++-- .../redstone/deskBell/DeskBellRenderer.java | 2 +- .../redstone/diodes/BrassDiodeRenderer.java | 2 +- .../redstone/diodes/BrassDiodeScrollSlot.java | 4 +-- .../BrassDiodeScrollValueBehaviour.java | 2 +- .../redstone/diodes/BrassDiodeVisual.java | 2 +- .../displayLink/ClickToLinkBlockItem.java | 2 +- .../displayLink/DisplayLinkBlock.java | 4 +-- .../displayLink/DisplayLinkScreen.java | 4 +-- .../displayLink/LinkBulbRenderer.java | 2 +- .../displayLink/LinkWithBulbBlockEntity.java | 20 +++++------ .../AccumulatedItemCountDisplaySource.java | 2 +- .../source/BoilerDisplaySource.java | 2 +- .../source/ComputerDisplaySource.java | 2 +- .../source/CurrentFloorDisplaySource.java | 2 +- .../displayLink/source/DisplaySource.java | 6 ++-- .../source/EnchantPowerDisplaySource.java | 2 +- .../source/FactoryGaugeDisplaySource.java | 4 +-- .../source/FluidAmountDisplaySource.java | 2 +- .../source/FluidListDisplaySource.java | 6 ++-- .../source/ItemCountDisplaySource.java | 2 +- .../source/ItemListDisplaySource.java | 2 +- .../source/KineticStressDisplaySource.java | 2 +- .../NumericSingleLineDisplaySource.java | 2 +- .../PercentOrProgressBarDisplaySource.java | 2 +- .../source/RedstonePowerDisplaySource.java | 2 +- .../source/ScoreboardDisplaySource.java | 4 +-- .../source/SingleLineDisplaySource.java | 2 +- .../source/StatTrackingDisplaySource.java | 2 +- .../source/StationSummaryDisplaySource.java | 2 +- .../source/StopWatchDisplaySource.java | 2 +- .../source/TimeOfDayDisplaySource.java | 2 +- .../source/ValueListDisplaySource.java | 6 ++-- .../displayLink/target/SignDisplayTarget.java | 4 +-- .../redstone/link/IRedstoneLinkable.java | 2 +- .../content/redstone/link/LinkBehaviour.java | 2 +- .../content/redstone/link/LinkRenderer.java | 6 ++-- .../redstone/link/RedstoneLinkBlock.java | 4 +-- .../link/RedstoneLinkFrequencySlot.java | 4 +-- .../link/RedstoneLinkNetworkHandler.java | 4 +-- .../controller/LecternControllerRenderer.java | 2 +- .../LinkedControllerClientHandler.java | 6 ++-- .../link/controller/LinkedControllerItem.java | 2 +- .../LinkedControllerItemRenderer.java | 6 ++-- .../LinkedControllerServerHandler.java | 6 ++-- .../redstone/nixieTube/NixieTubeBlock.java | 2 +- .../nixieTube/NixieTubeBlockEntity.java | 4 +-- .../redstone/nixieTube/NixieTubeRenderer.java | 12 +++---- .../redstone/rail/ControllerRailBlock.java | 4 +-- .../smartObserver/SmartObserverBlock.java | 2 +- .../SmartObserverBlockEntity.java | 4 +-- .../ThresholdSwitchBlockEntity.java | 6 ++-- .../ThresholdSwitchGenerator.java | 2 +- .../ThresholdSwitchScreen.java | 4 +-- .../schematics/SchematicAndQuillItem.java | 2 +- .../schematics/SchematicInstances.java | 5 ++- .../content/schematics/SchematicItem.java | 8 ++--- .../content/schematics/SchematicPrinter.java | 5 ++- .../schematics/SchematicProcessor.java | 2 +- .../schematics/ServerSchematicLoader.java | 3 +- .../schematics/cannon/MaterialChecklist.java | 2 +- .../cannon/SchematicannonBlockEntity.java | 6 ++-- .../cannon/SchematicannonScreen.java | 4 +-- .../client/ClientSchematicLoader.java | 2 +- .../client/SchematicAndQuillHandler.java | 6 ++-- .../client/SchematicEditScreen.java | 2 +- .../schematics/client/SchematicHandler.java | 9 +++-- .../client/SchematicPromptScreen.java | 2 +- .../schematics/client/SchematicRenderer.java | 2 +- .../client/SchematicTransformation.java | 8 ++--- .../client/ToolSelectionScreen.java | 2 +- .../schematics/client/tools/DeployTool.java | 4 +-- .../schematics/client/tools/FlipTool.java | 4 +-- .../schematics/client/tools/MoveTool.java | 2 +- .../schematics/client/tools/RotateTool.java | 4 +-- .../client/tools/SchematicToolBase.java | 6 ++-- .../schematics/client/tools/ToolType.java | 2 +- .../requirement/ItemRequirement.java | 4 +-- .../table/SchematicTableScreen.java | 2 +- .../trains/CameraDistanceModifier.java | 4 +-- .../content/trains/RailwaySavedData.java | 2 +- .../create/content/trains/TrainHUD.java | 8 ++--- .../trains/bogey/AbstractBogeyBlock.java | 2 +- .../bogey/AbstractBogeyBlockEntity.java | 4 +-- .../trains/bogey/StandardBogeyRenderer.java | 4 +-- .../trains/bogey/StandardBogeyVisual.java | 2 +- .../trains/display/FlapDisplayBlock.java | 10 +++--- .../display/FlapDisplayBlockEntity.java | 4 +-- .../trains/display/FlapDisplayLayout.java | 2 +- .../trains/display/FlapDisplayRenderer.java | 10 +++--- .../trains/display/FlapDisplaySection.java | 2 +- .../trains/entity/ArrivalSoundQueue.java | 4 +-- .../content/trains/entity/Carriage.java | 10 +++--- .../content/trains/entity/CarriageBogey.java | 12 +++---- .../trains/entity/CarriageContraption.java | 10 +++--- .../entity/CarriageContraptionEntity.java | 8 ++--- .../entity/CarriageContraptionVisual.java | 4 +-- .../entity/CarriageCouplingRenderer.java | 4 +-- .../trains/entity/CarriageParticles.java | 8 ++--- .../content/trains/entity/CarriageSounds.java | 6 ++-- .../trains/entity/CarriageSyncData.java | 12 +++---- .../content/trains/entity/Navigation.java | 10 +++--- .../create/content/trains/entity/Train.java | 12 +++---- .../content/trains/entity/TrainMigration.java | 4 +-- .../content/trains/entity/TrainPacket.java | 4 +-- .../trains/entity/TrainRelocationPacket.java | 2 +- .../content/trains/entity/TrainRelocator.java | 6 ++-- .../content/trains/entity/TrainStatus.java | 4 +-- .../trains/entity/TravellingPoint.java | 4 +-- .../trains/graph/DimensionPalette.java | 2 +- .../content/trains/graph/DiscoveredPath.java | 2 +- .../create/content/trains/graph/EdgeData.java | 4 +-- .../trains/graph/EdgePointManager.java | 4 +-- .../trains/graph/EdgePointStorage.java | 2 +- .../content/trains/graph/TrackEdge.java | 2 +- .../trains/graph/TrackEdgeIntersection.java | 2 +- .../content/trains/graph/TrackGraph.java | 10 +++--- .../trains/graph/TrackGraphHelper.java | 2 +- .../trains/graph/TrackGraphLocation.java | 2 +- .../content/trains/graph/TrackGraphSync.java | 4 +-- .../trains/graph/TrackGraphSyncPacket.java | 8 ++--- .../trains/graph/TrackGraphVisualizer.java | 6 ++-- .../trains/graph/TrackNodeLocation.java | 2 +- .../schedule/DestinationSuggestions.java | 4 +-- .../trains/schedule/IScheduleInput.java | 4 +-- .../content/trains/schedule/Schedule.java | 6 ++-- .../trains/schedule/ScheduleEntry.java | 2 +- .../content/trains/schedule/ScheduleItem.java | 4 +-- .../ScheduleItemEntityInteraction.java | 2 +- .../trains/schedule/ScheduleRuntime.java | 14 ++++---- .../trains/schedule/ScheduleScreen.java | 10 +++--- .../condition/CargoThresholdCondition.java | 6 ++-- .../condition/FluidThresholdCondition.java | 4 +-- .../condition/IdleCargoCondition.java | 2 +- .../condition/ItemThresholdCondition.java | 4 +-- .../condition/PlayerPassengerCondition.java | 4 +-- .../condition/RedstoneLinkCondition.java | 6 ++-- .../condition/ScheduleWaitCondition.java | 2 +- .../schedule/condition/ScheduledDelay.java | 2 +- .../condition/StationPoweredCondition.java | 2 +- .../condition/StationUnloadedCondition.java | 2 +- .../condition/TimeOfDayCondition.java | 4 +-- .../condition/TimedWaitCondition.java | 2 +- .../ChangeThrottleInstruction.java | 4 +-- .../destination/ChangeTitleInstruction.java | 4 +-- .../DeliverPackagesInstruction.java | 2 +- .../destination/DestinationInstruction.java | 4 +-- .../destination/FetchPackagesInstruction.java | 4 +-- .../destination/ScheduleInstruction.java | 4 +-- .../destination/TextScheduleInstruction.java | 2 +- .../content/trains/signal/EdgeGroupColor.java | 2 +- .../content/trains/signal/SignalBlock.java | 2 +- .../trains/signal/SignalBlockEntity.java | 2 +- .../content/trains/signal/SignalBoundary.java | 6 ++-- .../trains/signal/SignalEdgeGroup.java | 2 +- .../trains/signal/SignalPropagator.java | 6 ++-- .../content/trains/signal/SignalRenderer.java | 4 +-- .../content/trains/signal/TrackEdgePoint.java | 2 +- .../trains/station/AbstractStationScreen.java | 2 +- .../content/trains/station/GlobalStation.java | 6 ++-- .../trains/station/StationBlockEntity.java | 12 +++---- .../content/trains/station/StationMarker.java | 2 +- .../content/trains/station/StationScreen.java | 20 +++++------ .../trains/station/TrainEditPacket.java | 2 +- .../content/trains/track/AllPortalTracks.java | 4 +-- .../trains/track/BezierConnection.java | 10 +++--- .../trains/track/CurvedTrackInteraction.java | 2 +- .../content/trains/track/ITrackBlock.java | 4 +-- .../content/trains/track/TrackBlock.java | 12 +++---- .../trains/track/TrackBlockEntity.java | 2 +- .../trains/track/TrackBlockEntityTilt.java | 4 +-- .../content/trains/track/TrackBlockItem.java | 4 +-- .../trains/track/TrackBlockOutline.java | 12 +++---- .../content/trains/track/TrackModel.java | 2 +- .../content/trains/track/TrackPaver.java | 6 ++-- .../content/trains/track/TrackPlacement.java | 18 +++++----- .../trains/track/TrackPlacementOverlay.java | 4 +-- .../content/trains/track/TrackRenderer.java | 6 ++-- .../content/trains/track/TrackShape.java | 2 +- .../trains/track/TrackTargetingBehaviour.java | 6 ++-- .../trains/track/TrackTargetingBlockItem.java | 2 +- .../content/trains/track/TrackVisual.java | 4 +-- .../advancement/CreateAdvancement.java | 2 +- .../create/foundation/block/BigOutlines.java | 6 ++-- .../foundation/block/CopperBlockSet.java | 8 ++--- .../foundation/block/ItemUseOverrides.java | 2 +- .../block/connected/AllCTTypes.java | 14 ++++---- .../foundation/block/connected/CTModel.java | 2 +- .../CenteredSideValueBoxTransform.java | 2 +- .../blockEntity/behaviour/ValueBox.java | 4 +-- .../behaviour/ValueBoxTransform.java | 4 +-- .../behaviour/ValueSettingsClient.java | 2 +- .../behaviour/ValueSettingsScreen.java | 4 +-- .../EdgeInteractionHandler.java | 2 +- .../EdgeInteractionRenderer.java | 6 ++-- .../filtering/FilteringBehaviour.java | 8 ++--- .../filtering/FilteringRenderer.java | 8 ++--- .../filtering/SidedFilteringBehaviour.java | 4 +-- .../fluid/SmartFluidTankBehaviour.java | 6 ++-- .../CapManipulationBehaviourBase.java | 4 +-- .../scrollValue/ScrollOptionBehaviour.java | 2 +- .../scrollValue/ScrollValueBehaviour.java | 2 +- .../scrollValue/ScrollValueHandler.java | 2 +- .../scrollValue/ScrollValueRenderer.java | 4 +-- .../create/foundation/data/BlockStateGen.java | 4 +-- .../foundation/data/recipe/CompatMetals.java | 4 +-- .../data/recipe/CrushingRecipeGen.java | 2 +- .../foundation/events/ClientEvents.java | 4 +-- .../foundation/events/CommonEvents.java | 4 +-- .../foundation/fluid/CombinedTankWrapper.java | 2 +- .../create/foundation/fluid/FluidHelper.java | 2 +- .../foundation/fluid/FluidRenderer.java | 4 +-- .../create/foundation/gui/AllGuiTextures.java | 8 ++--- .../create/foundation/gui/AllIcons.java | 4 +-- .../create/foundation/gui/ModularGuiLine.java | 4 +-- .../foundation/gui/ModularGuiLineBuilder.java | 6 ++-- .../create/foundation/gui/widget/Label.java | 2 +- .../foundation/gui/widget/ScrollInput.java | 2 +- .../gui/widget/SelectionScrollInput.java | 2 +- .../foundation/item/CountedItemStackList.java | 2 +- .../foundation/item/ItemDescription.java | 4 +-- .../create/foundation/item/ItemHelper.java | 8 ++--- .../create/foundation/item/KineticStats.java | 8 ++--- .../create/foundation/item/TooltipHelper.java | 6 ++-- .../item/render/PartialItemModelRenderer.java | 2 +- .../mixin/client/ModelDataRefreshMixin.java | 2 +- .../foundation/model/BakedModelHelper.java | 4 +-- .../foundation/particle/AirParticle.java | 2 +- .../foundation/placement/PoleHelper.java | 4 +-- .../foundation/ponder/CreateSceneBuilder.java | 6 ++-- .../render/BlockEntityRenderHelper.java | 2 +- .../render/PlayerSkyhookRenderer.java | 4 +-- .../foundation/sound/RepeatingSound.java | 2 +- .../create/foundation/sound/SoundScape.java | 4 +-- .../create/foundation/sound/SoundScapes.java | 4 +-- .../foundation/utility/BlockHelper.java | 2 +- .../utility/CameraAngleAnimationService.java | 4 +-- .../create/foundation/utility/CreateLang.java | 10 +++--- .../utility/CreateNBTProcessors.java | 4 +-- .../create/foundation/utility/Debug.java | 2 +- .../create/foundation/utility/DyeHelper.java | 2 +- .../foundation/utility/DynamicComponent.java | 2 +- .../foundation/utility/FilesHelper.java | 2 +- .../foundation/utility/FluidFormatter.java | 4 +-- .../utility/ServerSpeedProvider.java | 4 +-- .../create/foundation/utility/TreeCutter.java | 2 +- .../command/ClearBufferCacheCommand.java | 2 +- .../infrastructure/command/CloneCommand.java | 2 +- .../command/CouplingCommand.java | 6 ++-- .../command/CreateTestCommand.java | 2 +- .../command/DebugValueCommand.java | 2 +- .../command/DumpRailwaysCommand.java | 2 +- .../command/FixLightingCommand.java | 4 +-- .../command/HighlightCommand.java | 4 +-- .../command/HighlightPacket.java | 2 +- .../command/OverlayConfigCommand.java | 2 +- .../ReplaceInCommandBlocksCommand.java | 2 +- .../command/SimpleCreateActions.java | 2 +- .../infrastructure/command/TrainCommand.java | 2 +- .../create/infrastructure/config/CStress.java | 2 +- .../gametest/tests/TestItems.java | 2 +- .../gui/CreateMainMenuScreen.java | 10 +++--- .../gui/OpenCreateMenuButton.java | 4 +-- .../ponder/scenes/ArmScenes.java | 2 +- .../ponder/scenes/BearingScenes.java | 4 +-- .../ponder/scenes/BeltScenes.java | 4 +-- .../ponder/scenes/CartAssemblerScenes.java | 2 +- .../ponder/scenes/ChainDriveScenes.java | 2 +- .../ponder/scenes/ChassisScenes.java | 2 +- .../ponder/scenes/ChuteScenes.java | 2 +- .../ponder/scenes/CrafterScenes.java | 4 +-- .../ponder/scenes/DeployerScenes.java | 2 +- .../ponder/scenes/DetectorScenes.java | 2 +- .../ponder/scenes/DisplayScenes.java | 4 +-- .../ponder/scenes/EjectorScenes.java | 4 +-- .../ponder/scenes/ElevatorScenes.java | 4 +-- .../ponder/scenes/FanScenes.java | 2 +- .../ponder/scenes/FunnelScenes.java | 2 +- .../ponder/scenes/GantryScenes.java | 4 +-- .../ponder/scenes/ItemVaultScenes.java | 2 +- .../ponder/scenes/KineticsScenes.java | 2 +- .../ponder/scenes/MechanicalDrillScenes.java | 2 +- .../ponder/scenes/MechanicalSawScenes.java | 2 +- .../ponder/scenes/MovementActorScenes.java | 2 +- .../ponder/scenes/PistonScenes.java | 2 +- .../ponder/scenes/ProcessingScenes.java | 8 ++--- .../ponder/scenes/PulleyScenes.java | 2 +- .../ponder/scenes/RedstoneScenes.java | 4 +-- .../ponder/scenes/RedstoneScenes2.java | 6 ++-- .../ponder/scenes/RollerScenes.java | 2 +- .../ponder/scenes/SteamScenes.java | 4 +-- .../ponder/scenes/TunnelScenes.java | 8 ++--- .../ponder/scenes/fluid/DrainScenes.java | 2 +- .../fluid/FluidMovementActorScenes.java | 2 +- .../ponder/scenes/fluid/FluidTankScenes.java | 4 +-- .../ponder/scenes/fluid/PipeScenes.java | 2 +- .../ponder/scenes/fluid/PumpScenes.java | 2 +- .../ponder/scenes/fluid/SpoutScenes.java | 4 +-- .../highLogistics/FrogAndConveyorScenes.java | 4 +-- .../scenes/highLogistics/PackagerScenes.java | 2 +- .../scenes/highLogistics/PostboxScenes.java | 2 +- .../scenes/trains/TrackObserverScenes.java | 2 +- .../ponder/scenes/trains/TrackScenes.java | 2 +- .../ponder/scenes/trains/TrainScenes.java | 2 +- .../scenes/trains/TrainSignalScenes.java | 2 +- .../scenes/trains/TrainStationScenes.java | 2 +- .../infrastructure/worldgen/LayerPattern.java | 2 +- 811 files changed, 1875 insertions(+), 1784 deletions(-) diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 2fcb8f773c..9c47fa5db4 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -290,7 +290,7 @@ import com.tterrag.registrate.providers.loot.RegistrateBlockLootTables; import com.tterrag.registrate.util.DataIngredient; import com.tterrag.registrate.util.entry.BlockEntry; -import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.data.Couple; import net.minecraft.client.renderer.RenderType; import net.minecraft.core.Direction.Axis; import net.minecraft.core.Direction.AxisDirection; @@ -2546,7 +2546,7 @@ public class AllBlocks { .transform(BuilderTransformers.palettesIronBlock()) .lang("Block of Industrial Iron") .register(); - + public static final BlockEntry WEATHERED_IRON_BLOCK = REGISTRATE.block("weathered_iron_block", Block::new) .transform(BuilderTransformers.palettesIronBlock()) .lang("Block of Weathered Iron") diff --git a/src/main/java/com/simibubi/create/AllBogeyStyles.java b/src/main/java/com/simibubi/create/AllBogeyStyles.java index ee82c4067e..0a927761f7 100644 --- a/src/main/java/com/simibubi/create/AllBogeyStyles.java +++ b/src/main/java/com/simibubi/create/AllBogeyStyles.java @@ -12,7 +12,7 @@ import com.simibubi.create.content.trains.bogey.BogeyStyle.SizeRenderer; import com.simibubi.create.content.trains.bogey.StandardBogeyRenderer; import com.simibubi.create.content.trains.bogey.StandardBogeyVisual; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.resources.ResourceLocation; public class AllBogeyStyles { diff --git a/src/main/java/com/simibubi/create/AllCreativeModeTabs.java b/src/main/java/com/simibubi/create/AllCreativeModeTabs.java index aee0f12cdf..b0502b6ba4 100644 --- a/src/main/java/com/simibubi/create/AllCreativeModeTabs.java +++ b/src/main/java/com/simibubi/create/AllCreativeModeTabs.java @@ -29,7 +29,7 @@ import it.unimi.dsi.fastutil.objects.Reference2ReferenceOpenHashMap; import it.unimi.dsi.fastutil.objects.ReferenceArrayList; import it.unimi.dsi.fastutil.objects.ReferenceLinkedOpenHashSet; import it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.entity.ItemRenderer; import net.minecraft.client.resources.model.BakedModel; @@ -154,7 +154,7 @@ public class AllCreativeModeTabs { AllItems.CRUSHED_URANIUM, AllItems.CRUSHED_NICKEL ); - + exclusions.addAll(PackageStyles.RARE_BOXES); for (ItemProviderEntry entry : simpleExclusions) { @@ -190,7 +190,7 @@ public class AllCreativeModeTabs { simpleAfterOrderings.forEach((entry, otherEntry) -> { orderings.add(ItemOrdering.after(entry.asItem(), otherEntry.asItem())); }); - + PackageStyles.STANDARD_BOXES.forEach(item -> { orderings.add(ItemOrdering.after(item, AllBlocks.PACKAGER.asItem())); }); @@ -248,14 +248,14 @@ public class AllCreativeModeTabs { visibilities.put(entry.asItem(), TabVisibility.SEARCH_TAB_ONLY); } } - + for (BlockEntry entry : AllBlocks.TABLE_CLOTHS) { TableClothBlock block = entry.get(); if (block.getColor() != DyeColor.RED) { visibilities.put(entry.asItem(), TabVisibility.SEARCH_TAB_ONLY); } } - + for (BlockEntry entry : AllBlocks.PACKAGE_POSTBOXES) { PostboxBlock block = entry.get(); if (block.getColor() != DyeColor.WHITE) { diff --git a/src/main/java/com/simibubi/create/AllEntityTypes.java b/src/main/java/com/simibubi/create/AllEntityTypes.java index 30984943e8..5e5a08622a 100644 --- a/src/main/java/com/simibubi/create/AllEntityTypes.java +++ b/src/main/java/com/simibubi/create/AllEntityTypes.java @@ -25,7 +25,7 @@ import com.tterrag.registrate.util.nullness.NonNullConsumer; import com.tterrag.registrate.util.nullness.NonNullFunction; import com.tterrag.registrate.util.nullness.NonNullSupplier; -import net.createmod.catnip.utility.lang.Lang; +import net.createmod.catnip.lang.Lang; import net.minecraft.client.renderer.entity.EntityRenderer; import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.world.entity.Entity; @@ -69,7 +69,7 @@ public class AllEntityTypes { public static final EntityEntry SEAT = register("seat", SeatEntity::new, () -> SeatEntity.Render::new, MobCategory.MISC, 5, Integer.MAX_VALUE, false, true, SeatEntity::build).register(); - + public static final EntityEntry PACKAGE = register("package", PackageEntity::new, () -> PackageRenderer::new, MobCategory.MISC, 10, 3, true, false, PackageEntity::build).register(); @@ -99,7 +99,7 @@ public class AllEntityTypes { }) .renderer(renderer); } - + public static void registerEntityAttributes(EntityAttributeCreationEvent event) { event.put(PACKAGE.get(), PackageEntity.createPackageAttributes() .build()); diff --git a/src/main/java/com/simibubi/create/AllFluids.java b/src/main/java/com/simibubi/create/AllFluids.java index eea55ba3da..8fbdb28f95 100644 --- a/src/main/java/com/simibubi/create/AllFluids.java +++ b/src/main/java/com/simibubi/create/AllFluids.java @@ -21,7 +21,7 @@ import com.simibubi.create.infrastructure.config.AllConfigs; import com.tterrag.registrate.builders.FluidBuilder.FluidTypeFactory; import com.tterrag.registrate.util.entry.FluidEntry; -import net.createmod.catnip.utility.theme.Color; +import net.createmod.catnip.theme.Color; import net.minecraft.client.Camera; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.FogRenderer.FogMode; diff --git a/src/main/java/com/simibubi/create/AllPartialModels.java b/src/main/java/com/simibubi/create/AllPartialModels.java index 553a6ec264..045adb9044 100644 --- a/src/main/java/com/simibubi/create/AllPartialModels.java +++ b/src/main/java/com/simibubi/create/AllPartialModels.java @@ -11,9 +11,9 @@ import com.simibubi.create.content.logistics.box.PackageStyles; import com.simibubi.create.content.logistics.box.PackageStyles.PackageStyle; import dev.engine_room.flywheel.lib.model.baked.PartialModel; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.lang.Lang; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.lang.Lang; import net.minecraft.core.Direction; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.DyeColor; @@ -85,7 +85,7 @@ public class AllPartialModels { SYMMETRY_TRIPLEPLANE = block("symmetry_effect/tripleplane"), STICKER_HEAD = block("sticker/head"), - + DESK_BELL_PLUNGER = block("desk_bell/plunger"), DESK_BELL_BELL = block("desk_bell/bell"), @@ -127,7 +127,7 @@ public class AllPartialModels { PACKAGER_TRAY_REGULAR = block("packager/tray"), PACKAGER_TRAY_DEFRAG = block("repackager/tray"), PACKAGER_HATCH_OPEN = block("packager/hatch_open"), PACKAGER_HATCH_CLOSED = block("packager/hatch_closed"), - + TABLE_CLOTH_PRICE_SIDE = block("table_cloth/price_tag_side"), TABLE_CLOTH_PRICE_TOP = block("table_cloth/price_tag_top"), @@ -187,7 +187,7 @@ public class AllPartialModels { WATER_WHEEL = block("water_wheel/wheel"), LARGE_WATER_WHEEL = block("large_water_wheel/block"), LARGE_WATER_WHEEL_EXTENSION = block("large_water_wheel/block_extension"), - + FACTORY_PANEL = block("factory_gauge/panel"), FACTORY_PANEL_WITH_BULB = block("factory_gauge/panel_with_bulb"), FACTORY_PANEL_RESTOCKER = block("factory_gauge/panel_restocker"), @@ -199,7 +199,7 @@ public class AllPartialModels { TABLE_CLOTH_NE = block("table_cloth/north_east"), TABLE_CLOTH_SW = block("table_cloth/south_west"), TABLE_CLOTH_SE = block("table_cloth/south_east"), - + CRAFTING_BLUEPRINT_1x1 = entity("crafting_blueprint_small"), CRAFTING_BLUEPRINT_2x2 = entity("crafting_blueprint_medium"), CRAFTING_BLUEPRINT_3x3 = entity("crafting_blueprint_large"), @@ -217,7 +217,7 @@ public class AllPartialModels { public static final Map FACTORY_PANEL_ARROWS = new EnumMap<>(Direction.class); public static final Map FACTORY_PANEL_LINES = new EnumMap<>(Direction.class); public static final Map FACTORY_PANEL_DOTTED = new EnumMap<>(Direction.class); - + public static final Map METAL_GIRDER_BRACKETS = new EnumMap<>(Direction.class); public static final Map TOOLBOX_LIDS = new EnumMap<>(DyeColor.class); public static final Map> FOLDING_DOORS = new HashMap<>(); diff --git a/src/main/java/com/simibubi/create/AllParticleTypes.java b/src/main/java/com/simibubi/create/AllParticleTypes.java index 7cb2b0a653..78706ee0a6 100644 --- a/src/main/java/com/simibubi/create/AllParticleTypes.java +++ b/src/main/java/com/simibubi/create/AllParticleTypes.java @@ -12,7 +12,7 @@ import com.simibubi.create.content.trains.CubeParticleData; import com.simibubi.create.foundation.particle.AirParticleData; import com.simibubi.create.foundation.particle.ICustomParticleData; -import net.createmod.catnip.utility.lang.Lang; +import net.createmod.catnip.lang.Lang; import net.minecraft.core.particles.ParticleOptions; import net.minecraft.core.particles.ParticleType; import net.minecraftforge.api.distmarker.Dist; diff --git a/src/main/java/com/simibubi/create/AllRecipeTypes.java b/src/main/java/com/simibubi/create/AllRecipeTypes.java index 058cd6c84f..3962526ffe 100644 --- a/src/main/java/com/simibubi/create/AllRecipeTypes.java +++ b/src/main/java/com/simibubi/create/AllRecipeTypes.java @@ -28,7 +28,7 @@ import com.simibubi.create.content.processing.recipe.ProcessingRecipeSerializer; import com.simibubi.create.content.processing.sequenced.SequencedAssemblyRecipeSerializer; import com.simibubi.create.foundation.recipe.IRecipeTypeInfo; -import net.createmod.catnip.utility.lang.Lang; +import net.createmod.catnip.lang.Lang; import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.Container; @@ -128,7 +128,7 @@ public enum AllRecipeTypes implements IRecipeTypeInfo { return world.getRecipeManager() .getRecipeFor(getType(), inv, world); } - + public static boolean shouldIgnoreInAutomation(Recipe recipe) { RecipeSerializer serializer = recipe.getSerializer(); if (serializer != null && AllTags.AllRecipeSerializerTags.AUTOMATION_IGNORE.matches(serializer)) diff --git a/src/main/java/com/simibubi/create/AllShapes.java b/src/main/java/com/simibubi/create/AllShapes.java index 9f7ebdca61..6ce52c3ada 100644 --- a/src/main/java/com/simibubi/create/AllShapes.java +++ b/src/main/java/com/simibubi/create/AllShapes.java @@ -10,7 +10,7 @@ import java.util.function.BiFunction; import com.simibubi.create.content.logistics.chute.ChuteShapes; import com.simibubi.create.content.trains.track.TrackVoxelShapes; -import net.createmod.catnip.utility.VoxelShaper; +import net.createmod.catnip.math.VoxelShaper; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; import net.minecraft.world.level.block.Block; @@ -180,7 +180,7 @@ public class AllShapes { WHISTLE_BASE = shape(1, 0, 1, 15, 3, 15).add(5, 0, 5, 11, 8, 11) .forDirectional(UP), - + DESK_BELL = shape(3, 0, 3, 13, 3, 13).add(4, 0, 4, 12, 9, 12) .forDirectional(UP), diff --git a/src/main/java/com/simibubi/create/AllSpriteShifts.java b/src/main/java/com/simibubi/create/AllSpriteShifts.java index 30cfc96662..8191d4c6e1 100644 --- a/src/main/java/com/simibubi/create/AllSpriteShifts.java +++ b/src/main/java/com/simibubi/create/AllSpriteShifts.java @@ -12,8 +12,8 @@ import com.simibubi.create.foundation.block.connected.CTType; import net.createmod.catnip.render.SpriteShiftEntry; import net.createmod.catnip.render.SpriteShifter; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.lang.Lang; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.lang.Lang; import net.minecraft.world.item.DyeColor; import net.minecraft.world.level.block.WeatheringCopper.WeatherState; import net.minecraft.world.level.block.state.properties.WoodType; @@ -46,7 +46,7 @@ public class AllSpriteShifts { VERTICAL_FRAMED_GLASS = getCT(AllCTTypes.VERTICAL, "palettes/framed_glass", "palettes/vertical_framed_glass"), ORNATE_IRON_WINDOW = vertical("palettes/ornate_iron_window"), INDUSTRIAL_IRON_WINDOW = getCT(AllCTTypes.RECTANGLE, "palettes/industrial_iron_window"), - + OLD_FACTORY_WINDOW_1 = getCT(AllCTTypes.RECTANGLE, "palettes/weathered_iron_window", "palettes/weathered_iron_window_1"), OLD_FACTORY_WINDOW_2 = getCT(AllCTTypes.RECTANGLE, "palettes/weathered_iron_window", "palettes/weathered_iron_window_2"), OLD_FACTORY_WINDOW_3 = getCT(AllCTTypes.RECTANGLE, "palettes/weathered_iron_window", "palettes/weathered_iron_window_3"), @@ -160,5 +160,5 @@ public class AllSpriteShifts { public static CTSpriteShiftEntry getWoodenWindow(WoodType woodType) { return WOODEN_WINDOWS.get(woodType); } - + } diff --git a/src/main/java/com/simibubi/create/AllTags.java b/src/main/java/com/simibubi/create/AllTags.java index c99802271f..ed20b235fe 100644 --- a/src/main/java/com/simibubi/create/AllTags.java +++ b/src/main/java/com/simibubi/create/AllTags.java @@ -8,7 +8,7 @@ import static com.simibubi.create.AllTags.NameSpace.TIC; import java.util.Collections; -import net.createmod.catnip.utility.lang.Lang; +import net.createmod.catnip.lang.Lang; import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.BlockTags; diff --git a/src/main/java/com/simibubi/create/Create.java b/src/main/java/com/simibubi/create/Create.java index c99ffe4234..5c2af2c10f 100644 --- a/src/main/java/com/simibubi/create/Create.java +++ b/src/main/java/com/simibubi/create/Create.java @@ -41,8 +41,8 @@ import com.simibubi.create.infrastructure.data.CreateDatagen; import com.simibubi.create.infrastructure.worldgen.AllFeatures; import com.simibubi.create.infrastructure.worldgen.AllPlacementModifiers; -import net.createmod.catnip.utility.FontHelper; -import net.createmod.catnip.utility.lang.LangBuilder; +import net.createmod.catnip.lang.FontHelper; +import net.createmod.catnip.lang.LangBuilder; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.Entity; diff --git a/src/main/java/com/simibubi/create/CreateClient.java b/src/main/java/com/simibubi/create/CreateClient.java index 689b9f24b4..ccde97761e 100644 --- a/src/main/java/com/simibubi/create/CreateClient.java +++ b/src/main/java/com/simibubi/create/CreateClient.java @@ -30,7 +30,7 @@ import net.createmod.catnip.config.ui.BaseConfigScreen; import net.createmod.catnip.config.ui.ConfigScreen; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBufferCache; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.createmod.ponder.foundation.PonderIndex; import net.minecraft.ChatFormatting; import net.minecraft.client.GraphicsStatus; @@ -71,7 +71,7 @@ public class CreateClient { ZAPPER_RENDER_HANDLER.registerListeners(forgeEventBus); POTATO_CANNON_RENDER_HANDLER.registerListeners(forgeEventBus); - + Mods.FTBLIBRARY.executeIfInstalled(() -> () -> FTBIntegration.init(modEventBus, forgeEventBus)); } diff --git a/src/main/java/com/simibubi/create/api/connectivity/ConnectivityHandler.java b/src/main/java/com/simibubi/create/api/connectivity/ConnectivityHandler.java index c844b1bda1..364c50ae51 100644 --- a/src/main/java/com/simibubi/create/api/connectivity/ConnectivityHandler.java +++ b/src/main/java/com/simibubi/create/api/connectivity/ConnectivityHandler.java @@ -16,13 +16,14 @@ import org.apache.commons.lang3.tuple.Pair; import com.simibubi.create.content.fluids.tank.CreativeFluidTankBlockEntity; import com.simibubi.create.foundation.blockEntity.IMultiBlockEntityContainer; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; + import net.minecraftforge.common.capabilities.ForgeCapabilities; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.IFluidTank; diff --git a/src/main/java/com/simibubi/create/compat/Mods.java b/src/main/java/com/simibubi/create/compat/Mods.java index e4ce3adaaa..308f7b174e 100644 --- a/src/main/java/com/simibubi/create/compat/Mods.java +++ b/src/main/java/com/simibubi/create/compat/Mods.java @@ -3,12 +3,13 @@ package com.simibubi.create.compat; import java.util.Optional; import java.util.function.Supplier; +import net.createmod.catnip.lang.Lang; import net.createmod.catnip.platform.CatnipServices; -import net.createmod.catnip.utility.lang.Lang; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.block.Block; + import net.minecraftforge.fml.ModList; import net.minecraftforge.registries.ForgeRegistries; diff --git a/src/main/java/com/simibubi/create/compat/computercraft/implementation/peripherals/StationPeripheral.java b/src/main/java/com/simibubi/create/compat/computercraft/implementation/peripherals/StationPeripheral.java index 5f410b63e0..5c3ee36278 100644 --- a/src/main/java/com/simibubi/create/compat/computercraft/implementation/peripherals/StationPeripheral.java +++ b/src/main/java/com/simibubi/create/compat/computercraft/implementation/peripherals/StationPeripheral.java @@ -18,7 +18,7 @@ import com.simibubi.create.foundation.utility.StringHelper; import dan200.computercraft.api.lua.IArguments; import dan200.computercraft.api.lua.LuaException; import dan200.computercraft.api.lua.LuaFunction; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.nbt.ByteTag; import net.minecraft.nbt.CollectionTag; import net.minecraft.nbt.CompoundTag; @@ -28,6 +28,7 @@ import net.minecraft.nbt.ListTag; import net.minecraft.nbt.NumericTag; import net.minecraft.nbt.StringTag; import net.minecraft.nbt.Tag; + import net.minecraftforge.network.PacketDistributor; public class StationPeripheral extends SyncedPeripheral { diff --git a/src/main/java/com/simibubi/create/compat/jei/PotionFluidSubtypeInterpreter.java b/src/main/java/com/simibubi/create/compat/jei/PotionFluidSubtypeInterpreter.java index 0950f04dbd..4eb0abceb7 100644 --- a/src/main/java/com/simibubi/create/compat/jei/PotionFluidSubtypeInterpreter.java +++ b/src/main/java/com/simibubi/create/compat/jei/PotionFluidSubtypeInterpreter.java @@ -6,11 +6,12 @@ import com.simibubi.create.content.fluids.potion.PotionFluid.BottleType; import mezz.jei.api.ingredients.subtypes.IIngredientSubtypeInterpreter; import mezz.jei.api.ingredients.subtypes.UidContext; -import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.nbt.NBTHelper; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.item.alchemy.Potion; import net.minecraft.world.item.alchemy.PotionUtils; + import net.minecraftforge.fluids.FluidStack; /* From JEI's Potion item subtype interpreter */ diff --git a/src/main/java/com/simibubi/create/compat/jei/category/BasinCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/BasinCategory.java index 25ec83c525..3dbec0d052 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/BasinCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/BasinCategory.java @@ -1,5 +1,12 @@ package com.simibubi.create.compat.jei.category; +import java.util.ArrayList; +import java.util.List; + +import javax.annotation.ParametersAreNonnullByDefault; + +import org.apache.commons.lang3.mutable.MutableInt; + import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.content.processing.basin.BasinRecipe; @@ -10,22 +17,19 @@ import com.simibubi.create.foundation.fluid.FluidIngredient; import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.item.ItemHelper; import com.simibubi.create.foundation.utility.CreateLang; + import mezz.jei.api.forge.ForgeTypes; import mezz.jei.api.gui.builder.IRecipeLayoutBuilder; import mezz.jei.api.gui.ingredient.IRecipeSlotsView; import mezz.jei.api.recipe.IFocusGroup; import mezz.jei.api.recipe.RecipeIngredientRole; -import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.data.Pair; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; -import net.minecraftforge.fluids.FluidStack; -import org.apache.commons.lang3.mutable.MutableInt; -import javax.annotation.ParametersAreNonnullByDefault; -import java.util.ArrayList; -import java.util.List; +import net.minecraftforge.fluids.FluidStack; @ParametersAreNonnullByDefault public class BasinCategory extends CreateRecipeCategory { diff --git a/src/main/java/com/simibubi/create/compat/jei/category/CreateRecipeCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/CreateRecipeCategory.java index 1ba9b1aa12..6f91e6f543 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/CreateRecipeCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/CreateRecipeCategory.java @@ -1,10 +1,21 @@ package com.simibubi.create.compat.jei.category; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.function.Supplier; +import java.util.stream.Collectors; + +import javax.annotation.ParametersAreNonnullByDefault; + +import org.jetbrains.annotations.NotNull; + import com.simibubi.create.AllFluids; import com.simibubi.create.content.fluids.potion.PotionFluidHandler; import com.simibubi.create.content.processing.recipe.ProcessingOutput; import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.utility.CreateLang; + import mezz.jei.api.forge.ForgeTypes; import mezz.jei.api.gui.drawable.IDrawable; import mezz.jei.api.gui.ingredient.IRecipeSlotTooltipCallback; @@ -12,7 +23,7 @@ import mezz.jei.api.recipe.RecipeType; import mezz.jei.api.recipe.category.IRecipeCategory; import mezz.jei.api.registration.IRecipeCatalystRegistration; import mezz.jei.api.registration.IRecipeRegistration; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.client.Minecraft; @@ -21,15 +32,8 @@ import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.network.chat.Component; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Recipe; -import net.minecraftforge.fluids.FluidStack; -import org.jetbrains.annotations.NotNull; -import javax.annotation.ParametersAreNonnullByDefault; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; -import java.util.function.Supplier; -import java.util.stream.Collectors; +import net.minecraftforge.fluids.FluidStack; @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault diff --git a/src/main/java/com/simibubi/create/compat/jei/category/CrushingCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/CrushingCategory.java index 5c9c89e942..4affa69993 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/CrushingCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/CrushingCategory.java @@ -1,21 +1,23 @@ package com.simibubi.create.compat.jei.category; +import java.util.ArrayList; +import java.util.List; + +import javax.annotation.ParametersAreNonnullByDefault; + import com.simibubi.create.compat.jei.category.animations.AnimatedCrushingWheels; import com.simibubi.create.content.kinetics.crusher.AbstractCrushingRecipe; import com.simibubi.create.content.processing.recipe.ProcessingOutput; import com.simibubi.create.content.processing.recipe.ProcessingRecipe; import com.simibubi.create.foundation.gui.AllGuiTextures; + import mezz.jei.api.gui.builder.IRecipeLayoutBuilder; import mezz.jei.api.gui.ingredient.IRecipeSlotsView; import mezz.jei.api.recipe.IFocusGroup; import mezz.jei.api.recipe.RecipeIngredientRole; -import net.createmod.catnip.utility.layout.LayoutHelper; +import net.createmod.catnip.layout.LayoutHelper; import net.minecraft.client.gui.GuiGraphics; -import javax.annotation.ParametersAreNonnullByDefault; -import java.util.ArrayList; -import java.util.List; - @ParametersAreNonnullByDefault public class CrushingCategory extends CreateRecipeCategory { diff --git a/src/main/java/com/simibubi/create/compat/jei/category/MechanicalCraftingCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/MechanicalCraftingCategory.java index 8a8e5b28f1..9e66cf2c66 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/MechanicalCraftingCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/MechanicalCraftingCategory.java @@ -18,7 +18,7 @@ import mezz.jei.api.gui.ingredient.IRecipeSlotsView; import mezz.jei.api.ingredients.IIngredientRenderer; import mezz.jei.api.recipe.IFocusGroup; import mezz.jei.api.recipe.RecipeIngredientRole; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; @@ -30,6 +30,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.crafting.CraftingRecipe; import net.minecraft.world.item.crafting.Ingredient; + import net.minecraftforge.common.crafting.IShapedRecipe; @ParametersAreNonnullByDefault diff --git a/src/main/java/com/simibubi/create/compat/jei/category/SequencedAssemblyCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/SequencedAssemblyCategory.java index 20945896b0..4c3810e868 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/SequencedAssemblyCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/SequencedAssemblyCategory.java @@ -1,5 +1,14 @@ package com.simibubi.create.compat.jei.category; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.annotation.ParametersAreNonnullByDefault; + +import org.jetbrains.annotations.NotNull; + import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.compat.jei.category.sequencedAssembly.SequencedAssemblySubCategory; import com.simibubi.create.content.processing.sequenced.SequencedAssemblyRecipe; @@ -7,12 +16,13 @@ import com.simibubi.create.content.processing.sequenced.SequencedRecipe; import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.utility.CreateLang; + import mezz.jei.api.gui.builder.IRecipeLayoutBuilder; import mezz.jei.api.gui.ingredient.IRecipeSlotsView; import mezz.jei.api.recipe.IFocusGroup; import mezz.jei.api.recipe.RecipeIngredientRole; +import net.createmod.catnip.lang.Components; import net.createmod.catnip.platform.CatnipServices; -import net.createmod.catnip.utility.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; @@ -20,13 +30,6 @@ import net.minecraft.client.gui.GuiGraphics; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.resources.ResourceLocation; -import org.jetbrains.annotations.NotNull; - -import javax.annotation.ParametersAreNonnullByDefault; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; @ParametersAreNonnullByDefault public class SequencedAssemblyCategory extends CreateRecipeCategory { diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedBlazeBurner.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedBlazeBurner.java index 0eac67ea7f..5696e636b6 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedBlazeBurner.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedBlazeBurner.java @@ -8,10 +8,9 @@ import com.simibubi.create.AllSpriteShifts; import com.simibubi.create.content.processing.burner.BlazeBurnerBlock.HeatLevel; import dev.engine_room.flywheel.lib.model.baked.PartialModel; +import net.createmod.catnip.animation.AnimationTickHolder; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SpriteShiftEntry; -import net.createmod.catnip.utility.AnimationTickHolder; -import net.createmod.ponder.utility.LevelTickHolder; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.renderer.LightTexture; @@ -72,7 +71,7 @@ public class AnimatedBlazeBurner extends AnimatedKinetics { - spriteShift.getTarget() .getV0(); - float time = LevelTickHolder.getRenderTime(Minecraft.getInstance().level); + float time = AnimationTickHolder.getRenderTime(Minecraft.getInstance().level); float speed = 1 / 32f + 1 / 64f * heatLevel.ordinal(); double vScroll = speed * time; diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedDeployer.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedDeployer.java index 0cbf27e6be..b0302fb69c 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedDeployer.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedDeployer.java @@ -5,7 +5,8 @@ import com.mojang.math.Axis; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.kinetics.deployer.DeployerBlock; -import net.createmod.catnip.utility.AnimationTickHolder; + +import net.createmod.catnip.animation.AnimationTickHolder; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedKinetics.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedKinetics.java index 45b6d0314b..82d554caf6 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedKinetics.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedKinetics.java @@ -6,9 +6,9 @@ import com.simibubi.create.foundation.gui.CustomLightingSettings; import dev.engine_room.flywheel.lib.model.baked.PartialModel; import mezz.jei.api.gui.drawable.IDrawable; +import net.createmod.catnip.animation.AnimationTickHolder; import net.createmod.catnip.gui.ILightingSettings; import net.createmod.catnip.gui.element.GuiGameElement; -import net.createmod.catnip.utility.AnimationTickHolder; import net.minecraft.core.Direction.Axis; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockStateProperties; diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedMixer.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedMixer.java index 4647fbf6ed..b4c3398c62 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedMixer.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedMixer.java @@ -4,7 +4,8 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Axis; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllPartialModels; -import net.createmod.catnip.utility.AnimationTickHolder; + +import net.createmod.catnip.animation.AnimationTickHolder; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.util.Mth; diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedPress.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedPress.java index 011c24d8fa..eac104209f 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedPress.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedPress.java @@ -4,7 +4,8 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Axis; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllPartialModels; -import net.createmod.catnip.utility.AnimationTickHolder; + +import net.createmod.catnip.animation.AnimationTickHolder; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSpout.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSpout.java index 31301e369a..4827f6b9c9 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSpout.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSpout.java @@ -1,5 +1,7 @@ package com.simibubi.create.compat.jei.category.animations; +import java.util.List; + import com.mojang.blaze3d.platform.Lighting; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.Tesselator; @@ -7,16 +9,16 @@ import com.mojang.math.Axis; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllPartialModels; import com.simibubi.create.foundation.fluid.FluidRenderer; + +import net.createmod.catnip.animation.AnimationTickHolder; import net.createmod.catnip.gui.UIRenderHelper; -import net.createmod.catnip.utility.AnimationTickHolder; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.MultiBufferSource.BufferSource; import net.minecraft.util.Mth; -import net.minecraftforge.fluids.FluidStack; -import java.util.List; +import net.minecraftforge.fluids.FluidStack; public class AnimatedSpout extends AnimatedKinetics { diff --git a/src/main/java/com/simibubi/create/compat/trainmap/TrainMapManager.java b/src/main/java/com/simibubi/create/compat/trainmap/TrainMapManager.java index 76f19b08e2..f4882794b7 100644 --- a/src/main/java/com/simibubi/create/compat/trainmap/TrainMapManager.java +++ b/src/main/java/com/simibubi/create/compat/trainmap/TrainMapManager.java @@ -29,11 +29,11 @@ import com.simibubi.create.infrastructure.config.AllConfigs; import com.simibubi.create.infrastructure.config.CClient; import it.unimi.dsi.fastutil.objects.ObjectArrayList; -import net.createmod.catnip.utility.AnimationTickHolder; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.Pair; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.animation.AnimationTickHolder; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.data.Pair; +import net.createmod.catnip.lang.Components; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.renderer.Rect2i; diff --git a/src/main/java/com/simibubi/create/compat/trainmap/TrainMapRenderer.java b/src/main/java/com/simibubi/create/compat/trainmap/TrainMapRenderer.java index 6cc613bbf9..a1c0d206ed 100644 --- a/src/main/java/com/simibubi/create/compat/trainmap/TrainMapRenderer.java +++ b/src/main/java/com/simibubi/create/compat/trainmap/TrainMapRenderer.java @@ -13,7 +13,7 @@ import com.simibubi.create.infrastructure.config.CClient; import it.unimi.dsi.fastutil.objects.Object2ObjectMap; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; -import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.data.Couple; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.renderer.LightTexture; diff --git a/src/main/java/com/simibubi/create/compat/trainmap/TrainMapSync.java b/src/main/java/com/simibubi/create/compat/trainmap/TrainMapSync.java index d58fea1fd1..c79e23210f 100644 --- a/src/main/java/com/simibubi/create/compat/trainmap/TrainMapSync.java +++ b/src/main/java/com/simibubi/create/compat/trainmap/TrainMapSync.java @@ -21,7 +21,7 @@ import com.simibubi.create.content.trains.signal.SignalEdgeGroup; import com.simibubi.create.content.trains.station.GlobalStation; import com.simibubi.create.foundation.utility.TickBasedCache; -import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.data.Pair; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceKey; import net.minecraft.server.MinecraftServer; @@ -29,6 +29,7 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.util.Mth; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; + import net.minecraftforge.event.TickEvent.ServerTickEvent; import net.minecraftforge.network.PacketDistributor; diff --git a/src/main/java/com/simibubi/create/compat/trainmap/TrainMapSyncClient.java b/src/main/java/com/simibubi/create/compat/trainmap/TrainMapSyncClient.java index 694240bfce..986df7d378 100644 --- a/src/main/java/com/simibubi/create/compat/trainmap/TrainMapSyncClient.java +++ b/src/main/java/com/simibubi/create/compat/trainmap/TrainMapSyncClient.java @@ -9,8 +9,8 @@ import java.util.UUID; import com.simibubi.create.AllPackets; import com.simibubi.create.compat.trainmap.TrainMapSync.TrainMapSyncEntry; -import net.createmod.catnip.utility.AnimationTickHolder; -import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.animation.AnimationTickHolder; +import net.createmod.catnip.data.Pair; public class TrainMapSyncClient { @@ -35,7 +35,7 @@ public class TrainMapSyncClient { public static void receive(TrainMapSyncPacket packet) { if (ticks == 0) return; - + lastPacket = AnimationTickHolder.getTicks(); lastPacket += AnimationTickHolder.getPartialTicks(); diff --git a/src/main/java/com/simibubi/create/compat/trainmap/TrainMapSyncPacket.java b/src/main/java/com/simibubi/create/compat/trainmap/TrainMapSyncPacket.java index 76a5341e6b..269449fc3e 100644 --- a/src/main/java/com/simibubi/create/compat/trainmap/TrainMapSyncPacket.java +++ b/src/main/java/com/simibubi/create/compat/trainmap/TrainMapSyncPacket.java @@ -8,8 +8,9 @@ import com.simibubi.create.compat.trainmap.TrainMapSync.TrainMapSyncEntry; import com.simibubi.create.content.trains.graph.DimensionPalette; import com.simibubi.create.foundation.networking.SimplePacketBase; -import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.data.Pair; import net.minecraft.network.FriendlyByteBuf; + import net.minecraftforge.network.NetworkEvent.Context; public class TrainMapSyncPacket extends SimplePacketBase { diff --git a/src/main/java/com/simibubi/create/content/contraptions/AbstractContraptionEntity.java b/src/main/java/com/simibubi/create/content/contraptions/AbstractContraptionEntity.java index 6cbe09cf57..aed5425cd6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/AbstractContraptionEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/AbstractContraptionEntity.java @@ -39,8 +39,8 @@ import com.simibubi.create.foundation.collision.Matrix3d; import com.simibubi.create.foundation.mixin.accessor.ServerLevelAccessor; import dev.engine_room.flywheel.api.backend.BackendManager; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.math.AngleHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -73,6 +73,7 @@ import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemp import net.minecraft.world.level.material.PushReaction; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; + import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.entity.IEntityAdditionalSpawnData; diff --git a/src/main/java/com/simibubi/create/content/contraptions/Contraption.java b/src/main/java/com/simibubi/create/content/contraptions/Contraption.java index a769bd1693..502acc26f2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/Contraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/Contraption.java @@ -75,12 +75,12 @@ import com.simibubi.create.foundation.utility.BlockHelper; import com.simibubi.create.foundation.utility.ICoordinate; import com.simibubi.create.infrastructure.config.AllConfigs; -import net.createmod.catnip.utility.BBHelper; -import net.createmod.catnip.utility.BlockFace; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.NBTHelper; -import net.createmod.catnip.utility.NBTProcessors; -import net.createmod.catnip.utility.UniqueLinkedList; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.data.UniqueLinkedList; +import net.createmod.catnip.math.BBHelper; +import net.createmod.catnip.math.BlockFace; +import net.createmod.catnip.nbt.NBTHelper; +import net.createmod.catnip.nbt.NBTProcessors; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -122,6 +122,7 @@ import net.minecraft.world.phys.shapes.BooleanOp; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; + import net.minecraftforge.client.model.data.ModelData; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.IFluidHandler; @@ -340,7 +341,7 @@ public abstract class Contraption { && !BlockMovementChecks.isNotSupportive(world.getBlockState(attached), offset.getOpposite())) frontier.add(attached); } - + if (world.getBlockEntity(pos) instanceof ChainConveyorBlockEntity ccbe) ccbe.notifyConnectedToValidate(); @@ -1459,7 +1460,7 @@ public abstract class Contraption { public IFluidHandler getSharedFluidTanks() { return storage.getFluids(); } - + public MountedStorageManager getStorageManager() { return storage; } @@ -1489,7 +1490,7 @@ public abstract class Contraption { public void handleContraptionFluidPacket(BlockPos localPos, FluidStack containedFluid) { storage.updateContainedFluid(localPos, containedFluid); } - + public void handleContraptionItemPacket(BlockPos localPos, List containedItems) { storage.updateContainedItem(localPos, containedItems); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/ContraptionCollider.java b/src/main/java/com/simibubi/create/content/contraptions/ContraptionCollider.java index ae4899ed93..11cb86d4bd 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/ContraptionCollider.java +++ b/src/main/java/com/simibubi/create/content/contraptions/ContraptionCollider.java @@ -1,5 +1,19 @@ package com.simibubi.create.content.contraptions; +import static net.minecraft.world.entity.Entity.collideBoundingBox; + +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.WeakHashMap; + +import org.apache.commons.lang3.mutable.MutableBoolean; +import org.apache.commons.lang3.mutable.MutableFloat; +import org.apache.commons.lang3.mutable.MutableObject; +import org.apache.commons.lang3.tuple.MutablePair; + import com.google.common.base.Predicates; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllMovementBehaviours; @@ -19,8 +33,9 @@ import com.simibubi.create.foundation.collision.OrientedBB; import com.simibubi.create.foundation.damageTypes.CreateDamageSources; import com.simibubi.create.foundation.utility.BlockHelper; import com.simibubi.create.infrastructure.config.AllConfigs; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.VecHelper; + +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.math.VecHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.multiplayer.ClientPacketListener; @@ -49,22 +64,10 @@ import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.VoxelShape; + import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fml.DistExecutor; -import org.apache.commons.lang3.mutable.MutableBoolean; -import org.apache.commons.lang3.mutable.MutableFloat; -import org.apache.commons.lang3.mutable.MutableObject; -import org.apache.commons.lang3.tuple.MutablePair; - -import java.lang.ref.WeakReference; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.WeakHashMap; - -import static net.minecraft.world.entity.Entity.collideBoundingBox; public class ContraptionCollider { diff --git a/src/main/java/com/simibubi/create/content/contraptions/ContraptionHandler.java b/src/main/java/com/simibubi/create/content/contraptions/ContraptionHandler.java index 14b6715d36..b909708607 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/ContraptionHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/ContraptionHandler.java @@ -9,8 +9,8 @@ import java.util.Map; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import it.unimi.dsi.fastutil.objects.ObjectLists; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.WorldAttached; +import net.createmod.catnip.data.WorldAttached; +import net.createmod.catnip.math.VecHelper; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; import net.minecraft.world.entity.Entity; diff --git a/src/main/java/com/simibubi/create/content/contraptions/ContraptionHandlerClient.java b/src/main/java/com/simibubi/create/content/contraptions/ContraptionHandlerClient.java index 3b89798e68..c8fbb0ae97 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/ContraptionHandlerClient.java +++ b/src/main/java/com/simibubi/create/content/contraptions/ContraptionHandlerClient.java @@ -1,5 +1,12 @@ package com.simibubi.create.content.contraptions; +import java.lang.ref.WeakReference; +import java.util.Collection; + +import javax.annotation.Nullable; + +import org.apache.commons.lang3.mutable.MutableObject; + import com.simibubi.create.AllItems; import com.simibubi.create.AllPackets; import com.simibubi.create.content.contraptions.sync.ContraptionInteractionPacket; @@ -7,9 +14,10 @@ import com.simibubi.create.content.trains.entity.CarriageContraptionEntity; import com.simibubi.create.content.trains.entity.TrainRelocator; import com.simibubi.create.foundation.utility.RaycastHelper; import com.simibubi.create.foundation.utility.RaycastHelper.PredicateTraceResult; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.VecHelper; + +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.math.VecHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; import net.minecraft.client.player.RemotePlayer; @@ -24,6 +32,7 @@ import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.VoxelShape; + import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.event.InputEvent; @@ -31,11 +40,6 @@ import net.minecraftforge.event.TickEvent.Phase; import net.minecraftforge.event.TickEvent.PlayerTickEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; -import org.apache.commons.lang3.mutable.MutableObject; - -import javax.annotation.Nullable; -import java.lang.ref.WeakReference; -import java.util.Collection; @EventBusSubscriber public class ContraptionHandlerClient { diff --git a/src/main/java/com/simibubi/create/content/contraptions/ContraptionWorld.java b/src/main/java/com/simibubi/create/content/contraptions/ContraptionWorld.java index 2376ec8e0d..dcd6157a15 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/ContraptionWorld.java +++ b/src/main/java/com/simibubi/create/content/contraptions/ContraptionWorld.java @@ -1,6 +1,6 @@ package com.simibubi.create.content.contraptions; -import net.createmod.catnip.utility.levelWrappers.WrappedLevel; +import net.createmod.catnip.levelWrappers.WrappedLevel; import net.minecraft.core.BlockPos; import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundSource; diff --git a/src/main/java/com/simibubi/create/content/contraptions/ControlledContraptionEntity.java b/src/main/java/com/simibubi/create/content/contraptions/ControlledContraptionEntity.java index 80d0dd8ddd..2eae9b00d4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/ControlledContraptionEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/ControlledContraptionEntity.java @@ -7,9 +7,9 @@ import com.simibubi.create.content.contraptions.behaviour.MovementBehaviour; import com.simibubi.create.content.contraptions.behaviour.MovementContext; import dev.engine_room.flywheel.lib.transform.TransformStack; -import net.createmod.catnip.utility.NBTHelper; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.math.AngleHelper; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.nbt.NBTHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -21,6 +21,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate.StructureBlockInfo; import net.minecraft.world.phys.Vec3; + import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; diff --git a/src/main/java/com/simibubi/create/content/contraptions/DirectionalExtenderScrollOptionSlot.java b/src/main/java/com/simibubi/create/content/contraptions/DirectionalExtenderScrollOptionSlot.java index 5bfb564f38..60d815a0b3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/DirectionalExtenderScrollOptionSlot.java +++ b/src/main/java/com/simibubi/create/content/contraptions/DirectionalExtenderScrollOptionSlot.java @@ -6,7 +6,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.foundation.blockEntity.behaviour.CenteredSideValueBoxTransform; import dev.engine_room.flywheel.lib.transform.TransformStack; -import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.math.AngleHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.LevelAccessor; diff --git a/src/main/java/com/simibubi/create/content/contraptions/IControlContraption.java b/src/main/java/com/simibubi/create/content/contraptions/IControlContraption.java index 042f66b483..2493c5b11c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/IControlContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/IControlContraption.java @@ -3,7 +3,7 @@ package com.simibubi.create.content.contraptions; import com.simibubi.create.foundation.blockEntity.behaviour.scrollValue.INamedIconOptions; import com.simibubi.create.foundation.gui.AllIcons; -import net.createmod.catnip.utility.lang.Lang; +import net.createmod.catnip.lang.Lang; import net.minecraft.core.BlockPos; public interface IControlContraption { diff --git a/src/main/java/com/simibubi/create/content/contraptions/IDisplayAssemblyExceptions.java b/src/main/java/com/simibubi/create/content/contraptions/IDisplayAssemblyExceptions.java index f7ad232d27..ab3983abb1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/IDisplayAssemblyExceptions.java +++ b/src/main/java/com/simibubi/create/content/contraptions/IDisplayAssemblyExceptions.java @@ -6,8 +6,8 @@ import java.util.List; import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.FontHelper.Palette; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; +import net.createmod.catnip.lang.FontHelper.Palette; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; diff --git a/src/main/java/com/simibubi/create/content/contraptions/MountedFluidStorage.java b/src/main/java/com/simibubi/create/content/contraptions/MountedFluidStorage.java index 53ddd303f6..f0024dce60 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/MountedFluidStorage.java +++ b/src/main/java/com/simibubi/create/content/contraptions/MountedFluidStorage.java @@ -6,13 +6,15 @@ import com.simibubi.create.content.fluids.tank.CreativeFluidTankBlockEntity; import com.simibubi.create.content.fluids.tank.CreativeFluidTankBlockEntity.CreativeSmartFluidTank; import com.simibubi.create.content.fluids.tank.FluidTankBlockEntity; import com.simibubi.create.foundation.fluid.SmartFluidTank; -import net.createmod.catnip.utility.NBTHelper; -import net.createmod.catnip.utility.animation.LerpedFloat; -import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; + +import net.createmod.catnip.animation.LerpedFloat; +import net.createmod.catnip.animation.LerpedFloat.Chaser; +import net.createmod.catnip.nbt.NBTHelper; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.block.entity.BlockEntity; + import net.minecraftforge.common.capabilities.ForgeCapabilities; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.fluids.FluidStack; diff --git a/src/main/java/com/simibubi/create/content/contraptions/MountedStorage.java b/src/main/java/com/simibubi/create/content/contraptions/MountedStorage.java index b6a1db3c39..faa6be9e7e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/MountedStorage.java +++ b/src/main/java/com/simibubi/create/content/contraptions/MountedStorage.java @@ -15,7 +15,7 @@ import com.simibubi.create.content.logistics.depot.DepotBlockEntity; import com.simibubi.create.content.logistics.vault.ItemVaultBlockEntity; import com.simibubi.create.content.processing.recipe.ProcessingInventory; -import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.nbt.NBTHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.NonNullList; import net.minecraft.nbt.CompoundTag; @@ -27,6 +27,7 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.ChestBlockEntity; import net.minecraft.world.level.block.entity.ShulkerBoxBlockEntity; import net.minecraft.world.level.block.state.BlockState; + import net.minecraftforge.common.capabilities.ForgeCapabilities; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.items.IItemHandler; @@ -42,7 +43,7 @@ public class MountedStorage { ItemStackHandler handler; boolean noFuel; boolean valid; - + private int packetCooldown = 0; private boolean sendPacket = false; @@ -111,7 +112,7 @@ public class MountedStorage { valid = true; return; } - + if (blockEntity instanceof ChestBlockEntity) { CompoundTag tag = blockEntity.saveWithFullMetadata(); if (tag.contains("LootTable", 8)) @@ -219,7 +220,7 @@ public class MountedStorage { if (blockEntity instanceof DepotBlockEntity depot) depot.setHeldItem(handler.getStackInSlot(0)); } - + public IItemHandlerModifiable getItemHandler() { return handler; } @@ -235,7 +236,7 @@ public class MountedStorage { NBTHelper.putMarker(tag, "Toolbox"); if (needsSync()) NBTHelper.putMarker(tag, "Synced"); - + if (!(handler instanceof BottomlessItemHandler)) return tag; @@ -254,7 +255,7 @@ public class MountedStorage { storage.handler = new ToolboxInventory(null); if (nbt.contains("Synced")) storage.handler = storage.new SyncedMountedItemStackHandler(1); - + storage.valid = true; storage.noFuel = nbt.contains("NoFuel"); @@ -275,13 +276,13 @@ public class MountedStorage { public boolean canUseForFuel() { return !noFuel; } - + public boolean needsSync() { return handler instanceof SyncedMountedItemStackHandler; } - + public class SyncedMountedItemStackHandler extends ItemStackHandler { - + public SyncedMountedItemStackHandler(int i) { super(i); } @@ -290,7 +291,7 @@ public class MountedStorage { protected void onContentsChanged(int slot) { sendPacket = true; } - + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/MountedStorageManager.java b/src/main/java/com/simibubi/create/content/contraptions/MountedStorageManager.java index 71809cc994..b62f34270e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/MountedStorageManager.java +++ b/src/main/java/com/simibubi/create/content/contraptions/MountedStorageManager.java @@ -15,8 +15,8 @@ import com.simibubi.create.content.fluids.tank.FluidTankBlockEntity; import com.simibubi.create.content.logistics.depot.DepotBlockEntity; import com.simibubi.create.foundation.fluid.CombinedTankWrapper; -import net.createmod.catnip.utility.NBTHelper; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; +import net.createmod.catnip.nbt.NBTHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; @@ -33,6 +33,7 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.properties.ChestType; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate.StructureBlockInfo; import net.minecraft.world.phys.Vec3; + import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.IFluidTank; import net.minecraftforge.fluids.capability.IFluidHandler; @@ -230,11 +231,11 @@ public class MountedStorageManager { public IFluidHandler getFluids() { return fluidInventory; } - + public Map getMountedItemStorage() { return storage; } - + public Map getMountedFluidStorage() { return fluidStorage; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/OrientedContraptionEntity.java b/src/main/java/com/simibubi/create/content/contraptions/OrientedContraptionEntity.java index cdd6c9be6c..eb7c1db7a4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/OrientedContraptionEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/OrientedContraptionEntity.java @@ -1,6 +1,6 @@ package com.simibubi.create.content.contraptions; -import static net.createmod.catnip.utility.math.AngleHelper.angleLerp; +import static net.createmod.catnip.math.AngleHelper.angleLerp; import java.util.Optional; import java.util.UUID; @@ -18,10 +18,10 @@ import com.simibubi.create.content.contraptions.mounted.MountedContraption; import com.simibubi.create.foundation.item.ItemHelper; import dev.engine_room.flywheel.lib.transform.TransformStack; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.NBTHelper; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.math.AngleHelper; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.nbt.NBTHelper; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -45,6 +45,7 @@ import net.minecraft.world.level.block.BaseRailBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.RailShape; import net.minecraft.world.phys.Vec3; + import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.common.util.LazyOptional; diff --git a/src/main/java/com/simibubi/create/content/contraptions/StructureTransform.java b/src/main/java/com/simibubi/create/content/contraptions/StructureTransform.java index 68b412b96f..f4b0bf3422 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/StructureTransform.java +++ b/src/main/java/com/simibubi/create/content/contraptions/StructureTransform.java @@ -7,10 +7,9 @@ import static net.minecraft.world.level.block.state.properties.BlockStatePropert import com.simibubi.create.api.contraption.transformable.ContraptionTransformableRegistry; import com.simibubi.create.api.contraption.transformable.ITransformableBlock; import com.simibubi.create.api.contraption.transformable.ITransformableBlockEntity; - import com.simibubi.create.impl.contraption.transformable.ContraptionTransformableRegistryImpl; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/contraptions/actors/contraptionControls/ContraptionControlsBlockEntity.java b/src/main/java/com/simibubi/create/content/contraptions/actors/contraptionControls/ContraptionControlsBlockEntity.java index d89cf9c078..700251e8fd 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/actors/contraptionControls/ContraptionControlsBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/actors/contraptionControls/ContraptionControlsBlockEntity.java @@ -13,10 +13,10 @@ import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.foundation.utility.DyeHelper; import dev.engine_room.flywheel.lib.transform.TransformStack; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.animation.LerpedFloat; -import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; -import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.animation.LerpedFloat; +import net.createmod.catnip.animation.LerpedFloat.Chaser; +import net.createmod.catnip.math.AngleHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/contraptions/actors/contraptionControls/ContraptionControlsMovement.java b/src/main/java/com/simibubi/create/content/contraptions/actors/contraptionControls/ContraptionControlsMovement.java index faebc91ff6..dbc798f3d5 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/actors/contraptionControls/ContraptionControlsMovement.java +++ b/src/main/java/com/simibubi/create/content/contraptions/actors/contraptionControls/ContraptionControlsMovement.java @@ -8,14 +8,15 @@ import com.simibubi.create.content.contraptions.render.ContraptionMatrices; import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.foundation.virtualWorld.VirtualRenderWorld; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.IntAttached; -import net.createmod.catnip.utility.animation.LerpedFloat; -import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.animation.LerpedFloat; +import net.createmod.catnip.animation.LerpedFloat.Chaser; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.data.IntAttached; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.nbt.CompoundTag; import net.minecraft.util.Mth; import net.minecraft.world.item.ItemStack; + import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.items.ItemHandlerHelper; diff --git a/src/main/java/com/simibubi/create/content/contraptions/actors/contraptionControls/ContraptionControlsRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/actors/contraptionControls/ContraptionControlsRenderer.java index 6fdd7672b1..0a15a37541 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/actors/contraptionControls/ContraptionControlsRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/actors/contraptionControls/ContraptionControlsRenderer.java @@ -15,12 +15,12 @@ import com.simibubi.create.foundation.utility.DyeHelper; import com.simibubi.create.foundation.virtualWorld.VirtualRenderWorld; import dev.engine_room.flywheel.lib.transform.TransformStack; +import net.createmod.catnip.animation.AnimationTickHolder; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.math.AngleHelper; +import net.createmod.catnip.math.VecHelper; import net.createmod.catnip.render.CachedBuffers; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.math.AngleHelper; -import net.createmod.catnip.utility.theme.Color; -import net.createmod.ponder.utility.LevelTickHolder; +import net.createmod.catnip.theme.Color; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; import net.minecraft.client.renderer.MultiBufferSource; @@ -104,7 +104,7 @@ public class ContraptionControlsRenderer extends SmartBlockEntityRenderer, ITransformableBlock { diff --git a/src/main/java/com/simibubi/create/content/contraptions/chassis/ChassisBlockEntity.java b/src/main/java/com/simibubi/create/content/contraptions/chassis/ChassisBlockEntity.java index fc135c2863..2105489ee4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/chassis/ChassisBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/chassis/ChassisBlockEntity.java @@ -24,7 +24,7 @@ import com.simibubi.create.foundation.blockEntity.behaviour.scrollValue.ScrollVa import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.infrastructure.config.AllConfigs; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -37,6 +37,7 @@ import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.phys.BlockHitResult; + import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fml.DistExecutor; diff --git a/src/main/java/com/simibubi/create/content/contraptions/chassis/ChassisRangeDisplay.java b/src/main/java/com/simibubi/create/content/contraptions/chassis/ChassisRangeDisplay.java index 247339bc5a..ed18a0a3b7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/chassis/ChassisRangeDisplay.java +++ b/src/main/java/com/simibubi/create/content/contraptions/chassis/ChassisRangeDisplay.java @@ -14,7 +14,7 @@ import com.simibubi.create.AllItems; import com.simibubi.create.AllKeys; import com.simibubi.create.AllSpecialTextures; -import net.createmod.catnip.utility.outliner.Outliner; +import net.createmod.catnip.outliner.Outliner; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.world.entity.player.Player; diff --git a/src/main/java/com/simibubi/create/content/contraptions/chassis/StickerBlockEntity.java b/src/main/java/com/simibubi/create/content/contraptions/chassis/StickerBlockEntity.java index baac9ee400..53ca8c9396 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/chassis/StickerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/chassis/StickerBlockEntity.java @@ -10,14 +10,15 @@ import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import dev.engine_room.flywheel.lib.visualization.VisualizationHelper; -import net.createmod.catnip.utility.animation.LerpedFloat; -import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.animation.LerpedFloat; +import net.createmod.catnip.animation.LerpedFloat.Chaser; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; + import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fml.DistExecutor; diff --git a/src/main/java/com/simibubi/create/content/contraptions/chassis/StickerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/chassis/StickerRenderer.java index a2b41832bf..724446f39c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/chassis/StickerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/chassis/StickerRenderer.java @@ -5,10 +5,10 @@ import com.simibubi.create.AllPartialModels; import com.simibubi.create.foundation.blockEntity.renderer.SafeBlockEntityRenderer; import dev.engine_room.flywheel.api.visualization.VisualizationManager; +import net.createmod.catnip.animation.AnimationTickHolder; +import net.createmod.catnip.math.AngleHelper; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; -import net.createmod.catnip.utility.math.AngleHelper; -import net.createmod.ponder.utility.LevelTickHolder; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; @@ -29,7 +29,7 @@ public class StickerRenderer extends SafeBlockEntityRenderer BlockState state = be.getBlockState(); SuperByteBuffer head = CachedBuffers.partial(AllPartialModels.STICKER_HEAD, state); - float offset = be.piston.getValue(LevelTickHolder.getPartialTicks(be.getLevel())); + float offset = be.piston.getValue(AnimationTickHolder.getPartialTicks(be.getLevel())); if (be.getLevel() != Minecraft.getInstance().level && !be.isVirtual()) offset = state.getValue(StickerBlock.EXTENDED) ? 1 : 0; diff --git a/src/main/java/com/simibubi/create/content/contraptions/chassis/StickerVisual.java b/src/main/java/com/simibubi/create/content/contraptions/chassis/StickerVisual.java index dc1433db18..21899a34c1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/chassis/StickerVisual.java +++ b/src/main/java/com/simibubi/create/content/contraptions/chassis/StickerVisual.java @@ -12,7 +12,7 @@ import dev.engine_room.flywheel.lib.instance.TransformedInstance; import dev.engine_room.flywheel.lib.model.Models; import dev.engine_room.flywheel.lib.visual.AbstractBlockEntityVisual; import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; -import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.math.AngleHelper; import net.minecraft.client.Minecraft; import net.minecraft.core.Direction; import net.minecraft.util.Mth; diff --git a/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorColumn.java b/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorColumn.java index 74e4114b91..7dd6cfc26b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorColumn.java +++ b/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorColumn.java @@ -12,10 +12,10 @@ import javax.annotation.Nullable; import com.simibubi.create.AllBlocks; import com.simibubi.create.foundation.utility.BlockHelper; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.IntAttached; -import net.createmod.catnip.utility.NBTHelper; -import net.createmod.catnip.utility.WorldAttached; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.data.IntAttached; +import net.createmod.catnip.data.WorldAttached; +import net.createmod.catnip.nbt.NBTHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; @@ -117,7 +117,7 @@ public class ElevatorColumn { targetedYLevel = yLevel; targetAvailable = true; } - + public boolean isTargetAvailable() { return targetAvailable; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorContactBlockEntity.java b/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorContactBlockEntity.java index 52b97dbf93..110609b38c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorContactBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorContactBlockEntity.java @@ -8,8 +8,8 @@ import com.simibubi.create.content.redstone.displayLink.DisplayLinkBlock; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.nbt.NBTHelper; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.block.entity.BlockEntityType; diff --git a/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorContactScreen.java b/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorContactScreen.java index d872b9a64d..7c2f76b2f6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorContactScreen.java +++ b/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorContactScreen.java @@ -1,5 +1,7 @@ package com.simibubi.create.content.contraptions.elevator; +import org.lwjgl.glfw.GLFW; + import com.google.common.collect.ImmutableList; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllPackets; @@ -11,17 +13,17 @@ import com.simibubi.create.foundation.gui.widget.Label; import com.simibubi.create.foundation.gui.widget.ScrollInput; import com.simibubi.create.foundation.gui.widget.TooltipArea; import com.simibubi.create.foundation.utility.CreateLang; + +import net.createmod.catnip.data.Pair; import net.createmod.catnip.gui.AbstractSimiScreen; import net.createmod.catnip.gui.element.GuiGameElement; -import net.createmod.catnip.utility.Pair; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.EditBox; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.MutableComponent; import net.minecraft.util.FormattedCharSequence; -import org.lwjgl.glfw.GLFW; public class ElevatorContactScreen extends AbstractSimiScreen { diff --git a/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorContraption.java b/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorContraption.java index d6df9000e9..b3c5dfdf0e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorContraption.java @@ -18,8 +18,8 @@ import com.simibubi.create.content.contraptions.pulley.PulleyContraption; import com.simibubi.create.content.redstone.contact.RedstoneContactBlock; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.IntAttached; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.data.IntAttached; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -28,6 +28,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate.StructureBlockInfo; + import net.minecraftforge.network.PacketDistributor; public class ElevatorContraption extends PulleyContraption { diff --git a/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorControlsHandler.java b/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorControlsHandler.java index 5f5e85288d..bdf9028ce2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorControlsHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorControlsHandler.java @@ -17,7 +17,7 @@ import com.simibubi.create.content.contraptions.actors.contraptionControls.Contr import com.simibubi.create.content.contraptions.actors.contraptionControls.ContraptionControlsMovement.ElevatorFloorSelection; import com.simibubi.create.content.contraptions.behaviour.MovementContext; -import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.data.Couple; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; import net.minecraft.core.BlockPos; @@ -28,6 +28,7 @@ import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemp import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.Vec3; + import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; diff --git a/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorFloorListPacket.java b/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorFloorListPacket.java index 335af1c854..de9cccbbe1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorFloorListPacket.java +++ b/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorFloorListPacket.java @@ -1,20 +1,22 @@ package com.simibubi.create.content.contraptions.elevator; +import java.util.ArrayList; +import java.util.List; + import com.simibubi.create.AllPackets; import com.simibubi.create.content.contraptions.AbstractContraptionEntity; import com.simibubi.create.foundation.networking.SimplePacketBase; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.IntAttached; + +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.data.IntAttached; import net.minecraft.client.Minecraft; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; + import net.minecraftforge.network.NetworkEvent.Context; import net.minecraftforge.network.PacketDistributor; -import java.util.ArrayList; -import java.util.List; - public class ElevatorFloorListPacket extends SimplePacketBase { private int entityId; diff --git a/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorPulleyRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorPulleyRenderer.java index 302e17aeac..b430a52f88 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorPulleyRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorPulleyRenderer.java @@ -9,10 +9,10 @@ import com.simibubi.create.content.contraptions.pulley.PulleyRenderer; import com.simibubi.create.content.kinetics.base.KineticBlockEntity; import com.simibubi.create.content.kinetics.base.KineticBlockEntityRenderer; +import net.createmod.catnip.math.AngleHelper; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SpriteShiftEntry; import net.createmod.catnip.render.SuperByteBuffer; -import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; diff --git a/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorPulleyVisual.java b/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorPulleyVisual.java index 5678ab1470..3718d7bbeb 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorPulleyVisual.java +++ b/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorPulleyVisual.java @@ -23,7 +23,7 @@ import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; import dev.engine_room.flywheel.lib.visual.util.InstanceRecycler; import it.unimi.dsi.fastutil.longs.LongArraySet; import it.unimi.dsi.fastutil.longs.LongSet; -import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.math.AngleHelper; import net.minecraft.core.SectionPos; import net.minecraft.util.Mth; diff --git a/src/main/java/com/simibubi/create/content/contraptions/gantry/GantryCarriageBlock.java b/src/main/java/com/simibubi/create/content/contraptions/gantry/GantryCarriageBlock.java index 9192921226..94cd3edea1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/gantry/GantryCarriageBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/gantry/GantryCarriageBlock.java @@ -7,7 +7,7 @@ import com.simibubi.create.content.kinetics.base.IRotate; import com.simibubi.create.content.kinetics.gantry.GantryShaftBlock; import com.simibubi.create.foundation.block.IBE; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/contraptions/gantry/GantryCarriageRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/gantry/GantryCarriageRenderer.java index f1071e9348..63af5ff508 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/gantry/GantryCarriageRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/gantry/GantryCarriageRenderer.java @@ -6,11 +6,11 @@ import com.simibubi.create.content.kinetics.base.KineticBlockEntity; import com.simibubi.create.content.kinetics.base.KineticBlockEntityRenderer; import dev.engine_room.flywheel.api.visualization.VisualizationManager; +import net.createmod.catnip.animation.AnimationTickHolder; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.math.AngleHelper; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.math.AngleHelper; -import net.createmod.ponder.utility.LevelTickHolder; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; @@ -70,7 +70,7 @@ public class GantryCarriageRenderer extends KineticBlockEntityRenderer toRemove = new ArrayList<>(); - + for (Entry entry : carts.entrySet()) { MinecartController controller = entry.getValue(); if (controller != null) { @@ -141,7 +142,7 @@ public class CapabilityMinecartController implements ICapabilitySerializable { diff --git a/src/main/java/com/simibubi/create/content/contraptions/piston/PistonContraption.java b/src/main/java/com/simibubi/create/content/contraptions/piston/PistonContraption.java index 817c9cd936..05edb3a379 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/piston/PistonContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/piston/PistonContraption.java @@ -21,7 +21,7 @@ import com.simibubi.create.content.contraptions.TranslatingContraption; import com.simibubi.create.content.contraptions.piston.MechanicalPistonBlock.PistonState; import com.simibubi.create.infrastructure.config.AllConfigs; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/contraptions/piston/PistonExtensionPoleBlock.java b/src/main/java/com/simibubi/create/content/contraptions/piston/PistonExtensionPoleBlock.java index ec8affdd86..66586a728d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/piston/PistonExtensionPoleBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/piston/PistonExtensionPoleBlock.java @@ -13,8 +13,8 @@ import com.simibubi.create.content.equipment.wrench.IWrenchable; import com.simibubi.create.foundation.block.WrenchableDirectionalBlock; import com.simibubi.create.foundation.placement.PoleHelper; -import net.createmod.catnip.utility.placement.IPlacementHelper; -import net.createmod.catnip.utility.placement.PlacementHelpers; +import net.createmod.catnip.placement.IPlacementHelper; +import net.createmod.catnip.placement.PlacementHelpers; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/contraptions/pulley/AbstractPulleyVisual.java b/src/main/java/com/simibubi/create/content/contraptions/pulley/AbstractPulleyVisual.java index e5ea0c911e..f716556001 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/pulley/AbstractPulleyVisual.java +++ b/src/main/java/com/simibubi/create/content/contraptions/pulley/AbstractPulleyVisual.java @@ -22,8 +22,8 @@ import it.unimi.dsi.fastutil.bytes.ByteArrayList; import it.unimi.dsi.fastutil.bytes.ByteList; import it.unimi.dsi.fastutil.longs.LongOpenHashSet; import it.unimi.dsi.fastutil.longs.LongSet; +import net.createmod.catnip.math.AngleHelper; import net.createmod.catnip.render.SpriteShiftEntry; -import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.renderer.LightTexture; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -87,7 +87,7 @@ public abstract class AbstractPulleyVisual extends protected abstract float getOffset(float pt); protected abstract boolean isRunning(); - + protected abstract SpriteShiftEntry getCoilAnimation(); private Instancer magnetInstancer() { diff --git a/src/main/java/com/simibubi/create/content/contraptions/pulley/PulleyBlockEntity.java b/src/main/java/com/simibubi/create/content/contraptions/pulley/PulleyBlockEntity.java index cbb5f5e891..1c16c974ce 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/pulley/PulleyBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/pulley/PulleyBlockEntity.java @@ -21,8 +21,8 @@ import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform; import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.infrastructure.config.AllConfigs; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.nbt.NBTHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; @@ -388,23 +388,23 @@ public class PulleyBlockEntity extends LinearActuatorBlockEntity implements Thre public void animateOffset(float forcedOffset) { offset = forcedOffset; } - + public BlockPos getMirrorParent() { return mirrorParent; } // Threshold switch - + @Override public int getCurrentValue() { return worldPosition.getY() - (int) getInterpolatedOffset(.5f); } - + @Override public int getMinValue() { return level.getMinBuildHeight(); } - + @Override public int getMaxValue() { return worldPosition.getY(); @@ -414,5 +414,5 @@ public class PulleyBlockEntity extends LinearActuatorBlockEntity implements Thre public MutableComponent format(int value) { return CreateLang.translateDirect("gui.threshold_switch.pulley_y_level", value); } - + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionMatrices.java b/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionMatrices.java index 8f16306c71..d6faa3984c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionMatrices.java +++ b/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionMatrices.java @@ -5,7 +5,7 @@ import org.joml.Matrix4f; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.content.contraptions.AbstractContraptionEntity; -import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.animation.AnimationTickHolder; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; diff --git a/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionRenderInfoManager.java b/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionRenderInfoManager.java index 796744c49b..f575ff71ad 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionRenderInfoManager.java +++ b/src/main/java/com/simibubi/create/content/contraptions/render/ContraptionRenderInfoManager.java @@ -5,10 +5,11 @@ import com.simibubi.create.content.contraptions.Contraption; import dev.engine_room.flywheel.api.event.ReloadLevelRendererEvent; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; -import net.createmod.catnip.utility.WorldAttached; +import net.createmod.catnip.data.WorldAttached; import net.minecraft.client.Minecraft; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; + import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; diff --git a/src/main/java/com/simibubi/create/content/contraptions/sync/ContraptionSeatMappingPacket.java b/src/main/java/com/simibubi/create/content/contraptions/sync/ContraptionSeatMappingPacket.java index eaa136d035..da69ee740d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/sync/ContraptionSeatMappingPacket.java +++ b/src/main/java/com/simibubi/create/content/contraptions/sync/ContraptionSeatMappingPacket.java @@ -7,11 +7,12 @@ import java.util.UUID; import com.simibubi.create.content.contraptions.AbstractContraptionEntity; import com.simibubi.create.foundation.networking.SimplePacketBase; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.client.Minecraft; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.entity.Entity; import net.minecraft.world.phys.Vec3; + import net.minecraftforge.network.NetworkEvent.Context; public class ContraptionSeatMappingPacket extends SimplePacketBase { diff --git a/src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchMenu.java b/src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchMenu.java index e23b1709ab..e4da0aa611 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchMenu.java +++ b/src/main/java/com/simibubi/create/content/contraptions/wrench/RadialWrenchMenu.java @@ -32,14 +32,14 @@ import com.simibubi.create.content.redstone.DirectedDirectionalBlock; import com.simibubi.create.foundation.gui.AllIcons; import dev.engine_room.flywheel.lib.transform.TransformStack; +import net.createmod.catnip.animation.AnimationTickHolder; import net.createmod.catnip.gui.AbstractSimiScreen; import net.createmod.catnip.gui.UIRenderHelper; import net.createmod.catnip.gui.element.GuiGameElement; import net.createmod.catnip.gui.element.RenderElement; +import net.createmod.catnip.math.AngleHelper; import net.createmod.catnip.platform.CatnipServices; -import net.createmod.catnip.utility.AnimationTickHolder; -import net.createmod.catnip.utility.math.AngleHelper; -import net.createmod.catnip.utility.theme.Color; +import net.createmod.catnip.theme.Color; import net.createmod.ponder.enums.PonderGuiTextures; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; diff --git a/src/main/java/com/simibubi/create/content/decoration/MetalLadderBlock.java b/src/main/java/com/simibubi/create/content/decoration/MetalLadderBlock.java index 7cbc03e682..63395a7642 100644 --- a/src/main/java/com/simibubi/create/content/decoration/MetalLadderBlock.java +++ b/src/main/java/com/simibubi/create/content/decoration/MetalLadderBlock.java @@ -7,9 +7,9 @@ import com.simibubi.create.content.equipment.extendoGrip.ExtendoGripItem; import com.simibubi.create.content.equipment.wrench.IWrenchable; import com.simibubi.create.infrastructure.config.AllConfigs; -import net.createmod.catnip.utility.placement.IPlacementHelper; -import net.createmod.catnip.utility.placement.PlacementHelpers; -import net.createmod.catnip.utility.placement.PlacementOffset; +import net.createmod.catnip.placement.IPlacementHelper; +import net.createmod.catnip.placement.PlacementHelpers; +import net.createmod.catnip.placement.PlacementOffset; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -29,6 +29,7 @@ import net.minecraft.world.level.block.LadderBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.shapes.VoxelShape; + import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.common.ForgeMod; diff --git a/src/main/java/com/simibubi/create/content/decoration/RoofBlockCTBehaviour.java b/src/main/java/com/simibubi/create/content/decoration/RoofBlockCTBehaviour.java index 95bd8c1083..6049a1d32f 100644 --- a/src/main/java/com/simibubi/create/content/decoration/RoofBlockCTBehaviour.java +++ b/src/main/java/com/simibubi/create/content/decoration/RoofBlockCTBehaviour.java @@ -7,7 +7,7 @@ import com.simibubi.create.foundation.block.connected.CTSpriteShiftEntry; import com.simibubi.create.foundation.block.connected.CTType; import com.simibubi.create.foundation.block.connected.ConnectedTextureBehaviour; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/decoration/bracket/BracketBlock.java b/src/main/java/com/simibubi/create/content/decoration/bracket/BracketBlock.java index 2eaafc0eda..94be0e067e 100644 --- a/src/main/java/com/simibubi/create/content/decoration/bracket/BracketBlock.java +++ b/src/main/java/com/simibubi/create/content/decoration/bracket/BracketBlock.java @@ -9,7 +9,7 @@ import com.simibubi.create.content.kinetics.simpleRelays.AbstractSimpleShaftBloc import com.simibubi.create.content.kinetics.simpleRelays.CogWheelBlock; import com.simibubi.create.foundation.block.WrenchableDirectionalBlock; -import net.createmod.catnip.utility.lang.Lang; +import net.createmod.catnip.lang.Lang; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; import net.minecraft.util.StringRepresentable; diff --git a/src/main/java/com/simibubi/create/content/decoration/bracket/BracketedBlockEntityBehaviour.java b/src/main/java/com/simibubi/create/content/decoration/bracket/BracketedBlockEntityBehaviour.java index 4a85fa16d0..5a501c5bd0 100644 --- a/src/main/java/com/simibubi/create/content/decoration/bracket/BracketedBlockEntityBehaviour.java +++ b/src/main/java/com/simibubi/create/content/decoration/bracket/BracketedBlockEntityBehaviour.java @@ -10,7 +10,7 @@ import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BehaviourType; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; -import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.nbt.NBTHelper; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; import net.minecraft.world.level.Level; diff --git a/src/main/java/com/simibubi/create/content/decoration/copycat/CopycatBlockEntity.java b/src/main/java/com/simibubi/create/content/decoration/copycat/CopycatBlockEntity.java index c8b956d03c..8ce129e90c 100644 --- a/src/main/java/com/simibubi/create/content/decoration/copycat/CopycatBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/decoration/copycat/CopycatBlockEntity.java @@ -1,16 +1,19 @@ package com.simibubi.create.content.decoration.copycat; +import java.util.List; + import com.simibubi.create.AllBlocks; import com.simibubi.create.api.contraption.transformable.ITransformableBlockEntity; +import com.simibubi.create.api.schematic.nbt.IPartialSafeNBT; +import com.simibubi.create.api.schematic.requirement.ISpecialBlockEntityItemRequirement; import com.simibubi.create.content.contraptions.StructureTransform; import com.simibubi.create.content.redstone.RoseQuartzLampBlock; -import com.simibubi.create.api.schematic.requirement.ISpecialBlockEntityItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement.ItemUseType; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; -import com.simibubi.create.api.schematic.nbt.IPartialSafeNBT; -import net.createmod.catnip.utility.Iterate; + +import net.createmod.catnip.data.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; @@ -20,11 +23,10 @@ import net.minecraft.world.level.block.TrapDoorBlock; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockStateProperties; + import net.minecraftforge.client.model.data.ModelData; import net.minecraftforge.items.ItemHandlerHelper; -import java.util.List; - public class CopycatBlockEntity extends SmartBlockEntity implements ISpecialBlockEntityItemRequirement, ITransformableBlockEntity, IPartialSafeNBT { diff --git a/src/main/java/com/simibubi/create/content/decoration/copycat/CopycatModel.java b/src/main/java/com/simibubi/create/content/decoration/copycat/CopycatModel.java index fc022af546..15233e3e0e 100644 --- a/src/main/java/com/simibubi/create/content/decoration/copycat/CopycatModel.java +++ b/src/main/java/com/simibubi/create/content/decoration/copycat/CopycatModel.java @@ -9,7 +9,7 @@ import javax.annotation.Nullable; import com.simibubi.create.AllBlocks; import com.simibubi.create.foundation.model.BakedModelWrapperWithData; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.model.BakedQuad; @@ -22,6 +22,7 @@ import net.minecraft.util.RandomSource; import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; + import net.minecraftforge.client.model.data.ModelData; import net.minecraftforge.client.model.data.ModelData.Builder; import net.minecraftforge.client.model.data.ModelProperty; diff --git a/src/main/java/com/simibubi/create/content/decoration/copycat/CopycatPanelBlock.java b/src/main/java/com/simibubi/create/content/decoration/copycat/CopycatPanelBlock.java index d731727452..63ceed842f 100644 --- a/src/main/java/com/simibubi/create/content/decoration/copycat/CopycatPanelBlock.java +++ b/src/main/java/com/simibubi/create/content/decoration/copycat/CopycatPanelBlock.java @@ -1,10 +1,14 @@ package com.simibubi.create.content.decoration.copycat; +import java.util.List; +import java.util.function.Predicate; + import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; -import net.createmod.catnip.utility.placement.IPlacementHelper; -import net.createmod.catnip.utility.placement.PlacementHelpers; -import net.createmod.catnip.utility.placement.PlacementOffset; + +import net.createmod.catnip.placement.IPlacementHelper; +import net.createmod.catnip.placement.PlacementHelpers; +import net.createmod.catnip.placement.PlacementOffset; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -32,9 +36,6 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; -import java.util.List; -import java.util.function.Predicate; - public class CopycatPanelBlock extends WaterloggedCopycatBlock { public static final DirectionProperty FACING = BlockStateProperties.FACING; diff --git a/src/main/java/com/simibubi/create/content/decoration/copycat/CopycatPanelModel.java b/src/main/java/com/simibubi/create/content/decoration/copycat/CopycatPanelModel.java index 33ec5b74f5..393d2aebb7 100644 --- a/src/main/java/com/simibubi/create/content/decoration/copycat/CopycatPanelModel.java +++ b/src/main/java/com/simibubi/create/content/decoration/copycat/CopycatPanelModel.java @@ -7,7 +7,7 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.foundation.model.BakedModelHelper; import com.simibubi.create.foundation.model.BakedQuadHelper; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.BlockRenderDispatcher; @@ -20,6 +20,7 @@ import net.minecraft.world.level.block.DirectionalBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; + import net.minecraftforge.client.model.data.ModelData; public class CopycatPanelModel extends CopycatModel { diff --git a/src/main/java/com/simibubi/create/content/decoration/copycat/CopycatStepBlock.java b/src/main/java/com/simibubi/create/content/decoration/copycat/CopycatStepBlock.java index 9d9d1075d7..3f78fe6cd6 100644 --- a/src/main/java/com/simibubi/create/content/decoration/copycat/CopycatStepBlock.java +++ b/src/main/java/com/simibubi/create/content/decoration/copycat/CopycatStepBlock.java @@ -8,10 +8,10 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; import com.simibubi.create.foundation.placement.PoleHelper; -import net.createmod.catnip.utility.VoxelShaper; -import net.createmod.catnip.utility.placement.IPlacementHelper; -import net.createmod.catnip.utility.placement.PlacementHelpers; -import net.createmod.catnip.utility.placement.PlacementOffset; +import net.createmod.catnip.math.VoxelShaper; +import net.createmod.catnip.placement.IPlacementHelper; +import net.createmod.catnip.placement.PlacementHelpers; +import net.createmod.catnip.placement.PlacementOffset; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/decoration/copycat/CopycatStepModel.java b/src/main/java/com/simibubi/create/content/decoration/copycat/CopycatStepModel.java index 873ac7e4c6..b1dc784832 100644 --- a/src/main/java/com/simibubi/create/content/decoration/copycat/CopycatStepModel.java +++ b/src/main/java/com/simibubi/create/content/decoration/copycat/CopycatStepModel.java @@ -6,7 +6,7 @@ import java.util.List; import com.simibubi.create.foundation.model.BakedModelHelper; import com.simibubi.create.foundation.model.BakedQuadHelper; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.resources.model.BakedModel; @@ -17,6 +17,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.Half; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; + import net.minecraftforge.client.model.data.ModelData; public class CopycatStepModel extends CopycatModel { diff --git a/src/main/java/com/simibubi/create/content/decoration/girder/ConnectedGirderModel.java b/src/main/java/com/simibubi/create/content/decoration/girder/ConnectedGirderModel.java index 469d0e935d..874e20ea16 100644 --- a/src/main/java/com/simibubi/create/content/decoration/girder/ConnectedGirderModel.java +++ b/src/main/java/com/simibubi/create/content/decoration/girder/ConnectedGirderModel.java @@ -7,7 +7,7 @@ import java.util.List; import com.simibubi.create.AllPartialModels; import com.simibubi.create.foundation.block.connected.CTModel; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.resources.model.BakedModel; @@ -16,6 +16,7 @@ import net.minecraft.core.Direction; import net.minecraft.util.RandomSource; import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.block.state.BlockState; + import net.minecraftforge.client.model.data.ModelData; import net.minecraftforge.client.model.data.ModelData.Builder; import net.minecraftforge.client.model.data.ModelProperty; diff --git a/src/main/java/com/simibubi/create/content/decoration/girder/GirderBlock.java b/src/main/java/com/simibubi/create/content/decoration/girder/GirderBlock.java index bcdab909ad..07924a12db 100644 --- a/src/main/java/com/simibubi/create/content/decoration/girder/GirderBlock.java +++ b/src/main/java/com/simibubi/create/content/decoration/girder/GirderBlock.java @@ -19,9 +19,9 @@ import com.simibubi.create.content.trains.track.TrackBlock; import com.simibubi.create.content.trains.track.TrackShape; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.placement.IPlacementHelper; -import net.createmod.catnip.utility.placement.PlacementHelpers; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.placement.IPlacementHelper; +import net.createmod.catnip.placement.PlacementHelpers; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/decoration/girder/GirderBlockStateGenerator.java b/src/main/java/com/simibubi/create/content/decoration/girder/GirderBlockStateGenerator.java index ea857c9388..f932ff4280 100644 --- a/src/main/java/com/simibubi/create/content/decoration/girder/GirderBlockStateGenerator.java +++ b/src/main/java/com/simibubi/create/content/decoration/girder/GirderBlockStateGenerator.java @@ -4,9 +4,10 @@ import com.simibubi.create.foundation.data.AssetLookup; import com.tterrag.registrate.providers.DataGenContext; import com.tterrag.registrate.providers.RegistrateBlockstateProvider; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.core.Direction.Axis; import net.minecraft.world.level.block.Block; + import net.minecraftforge.client.model.generators.MultiPartBlockStateBuilder; public class GirderBlockStateGenerator { diff --git a/src/main/java/com/simibubi/create/content/decoration/girder/GirderPlacementHelper.java b/src/main/java/com/simibubi/create/content/decoration/girder/GirderPlacementHelper.java index 8988517538..7b1d00e05a 100644 --- a/src/main/java/com/simibubi/create/content/decoration/girder/GirderPlacementHelper.java +++ b/src/main/java/com/simibubi/create/content/decoration/girder/GirderPlacementHelper.java @@ -1,11 +1,15 @@ package com.simibubi.create.content.decoration.girder; +import java.util.List; +import java.util.function.Predicate; + import com.google.common.base.Predicates; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.equipment.extendoGrip.ExtendoGripItem; import com.simibubi.create.infrastructure.config.AllConfigs; -import net.createmod.catnip.utility.placement.IPlacementHelper; -import net.createmod.catnip.utility.placement.PlacementOffset; + +import net.createmod.catnip.placement.IPlacementHelper; +import net.createmod.catnip.placement.PlacementOffset; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -16,10 +20,8 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; -import net.minecraftforge.common.ForgeMod; -import java.util.List; -import java.util.function.Predicate; +import net.minecraftforge.common.ForgeMod; public class GirderPlacementHelper implements IPlacementHelper { diff --git a/src/main/java/com/simibubi/create/content/decoration/girder/GirderWrenchBehavior.java b/src/main/java/com/simibubi/create/content/decoration/girder/GirderWrenchBehavior.java index 780b6ed387..459ef04996 100644 --- a/src/main/java/com/simibubi/create/content/decoration/girder/GirderWrenchBehavior.java +++ b/src/main/java/com/simibubi/create/content/decoration/girder/GirderWrenchBehavior.java @@ -9,12 +9,12 @@ import org.jetbrains.annotations.Nullable; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.Pair; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.outliner.Outliner; -import net.createmod.catnip.utility.placement.IPlacementHelper; -import net.createmod.catnip.utility.theme.Color; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.data.Pair; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.outliner.Outliner; +import net.createmod.catnip.placement.IPlacementHelper; +import net.createmod.catnip.theme.Color; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/simibubi/create/content/decoration/palettes/AllPaletteStoneTypes.java b/src/main/java/com/simibubi/create/content/decoration/palettes/AllPaletteStoneTypes.java index d8a981ab24..8dce934e20 100644 --- a/src/main/java/com/simibubi/create/content/decoration/palettes/AllPaletteStoneTypes.java +++ b/src/main/java/com/simibubi/create/content/decoration/palettes/AllPaletteStoneTypes.java @@ -1,22 +1,24 @@ package com.simibubi.create.content.decoration.palettes; +import static com.simibubi.create.content.decoration.palettes.PaletteBlockPattern.STANDARD_RANGE; +import static com.simibubi.create.content.decoration.palettes.PaletteBlockPattern.VANILLA_RANGE; + +import java.util.function.Function; + import com.simibubi.create.AllTags; import com.simibubi.create.Create; import com.simibubi.create.foundation.data.CreateRegistrate; import com.tterrag.registrate.util.nullness.NonNullSupplier; -import net.createmod.catnip.utility.lang.Lang; + +import net.createmod.catnip.lang.Lang; import net.minecraft.tags.TagKey; import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.material.MapColor; + import net.minecraftforge.registries.ForgeRegistries; -import java.util.function.Function; - -import static com.simibubi.create.content.decoration.palettes.PaletteBlockPattern.STANDARD_RANGE; -import static com.simibubi.create.content.decoration.palettes.PaletteBlockPattern.VANILLA_RANGE; - public enum AllPaletteStoneTypes { GRANITE(VANILLA_RANGE, r -> () -> Blocks.GRANITE), diff --git a/src/main/java/com/simibubi/create/content/decoration/palettes/ConnectedPillarBlock.java b/src/main/java/com/simibubi/create/content/decoration/palettes/ConnectedPillarBlock.java index 1f1be11eb6..a375347278 100644 --- a/src/main/java/com/simibubi/create/content/decoration/palettes/ConnectedPillarBlock.java +++ b/src/main/java/com/simibubi/create/content/decoration/palettes/ConnectedPillarBlock.java @@ -1,6 +1,6 @@ package com.simibubi.create.content.decoration.palettes; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/decoration/palettes/PaletteBlockPartial.java b/src/main/java/com/simibubi/create/content/decoration/palettes/PaletteBlockPartial.java index 9b2fb0ab05..17c40e6d6a 100644 --- a/src/main/java/com/simibubi/create/content/decoration/palettes/PaletteBlockPartial.java +++ b/src/main/java/com/simibubi/create/content/decoration/palettes/PaletteBlockPartial.java @@ -16,7 +16,7 @@ import com.tterrag.registrate.util.DataIngredient; import com.tterrag.registrate.util.entry.BlockEntry; import com.tterrag.registrate.util.nullness.NonnullType; -import net.createmod.catnip.utility.lang.Lang; +import net.createmod.catnip.lang.Lang; import net.minecraft.data.recipes.RecipeCategory; import net.minecraft.data.recipes.ShapedRecipeBuilder; import net.minecraft.data.recipes.ShapelessRecipeBuilder; @@ -31,6 +31,7 @@ import net.minecraft.world.level.block.SlabBlock; import net.minecraft.world.level.block.StairBlock; import net.minecraft.world.level.block.WallBlock; import net.minecraft.world.level.block.state.BlockBehaviour.Properties; + import net.minecraftforge.client.model.generators.ModelFile; public abstract class PaletteBlockPartial { diff --git a/src/main/java/com/simibubi/create/content/decoration/placard/PlacardBlockEntity.java b/src/main/java/com/simibubi/create/content/decoration/placard/PlacardBlockEntity.java index 1e262ae5b6..55e33d12b1 100644 --- a/src/main/java/com/simibubi/create/content/decoration/placard/PlacardBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/decoration/placard/PlacardBlockEntity.java @@ -1,9 +1,14 @@ package com.simibubi.create.content.decoration.placard; +import java.util.List; + +import org.joml.Vector3f; + import com.simibubi.create.AllBlocks; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; -import net.createmod.catnip.utility.VecHelper; + +import net.createmod.catnip.math.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.particles.DustParticleOptions; import net.minecraft.nbt.CompoundTag; @@ -11,9 +16,6 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; -import org.joml.Vector3f; - -import java.util.List; public class PlacardBlockEntity extends SmartBlockEntity { diff --git a/src/main/java/com/simibubi/create/content/decoration/placard/PlacardRenderer.java b/src/main/java/com/simibubi/create/content/decoration/placard/PlacardRenderer.java index 37c74a4f23..ee35f2b16e 100644 --- a/src/main/java/com/simibubi/create/content/decoration/placard/PlacardRenderer.java +++ b/src/main/java/com/simibubi/create/content/decoration/placard/PlacardRenderer.java @@ -4,7 +4,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.foundation.blockEntity.renderer.SafeBlockEntityRenderer; import dev.engine_room.flywheel.lib.transform.TransformStack; -import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.math.AngleHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; diff --git a/src/main/java/com/simibubi/create/content/decoration/slidingDoor/DoorControl.java b/src/main/java/com/simibubi/create/content/decoration/slidingDoor/DoorControl.java index 7c2a800a6a..d68fc93b49 100644 --- a/src/main/java/com/simibubi/create/content/decoration/slidingDoor/DoorControl.java +++ b/src/main/java/com/simibubi/create/content/decoration/slidingDoor/DoorControl.java @@ -8,12 +8,13 @@ import com.simibubi.create.foundation.gui.widget.ScrollInput; import com.simibubi.create.foundation.gui.widget.SelectionScrollInput; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.Pair; -import net.createmod.catnip.utility.lang.Components; -import net.createmod.catnip.utility.lang.Lang; +import net.createmod.catnip.data.Pair; +import net.createmod.catnip.lang.Components; +import net.createmod.catnip.lang.Lang; import net.minecraft.client.Minecraft; import net.minecraft.core.Direction; import net.minecraft.world.entity.Entity; + import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; diff --git a/src/main/java/com/simibubi/create/content/decoration/slidingDoor/DoorControlBehaviour.java b/src/main/java/com/simibubi/create/content/decoration/slidingDoor/DoorControlBehaviour.java index 5b139e5619..bc89f17b5e 100644 --- a/src/main/java/com/simibubi/create/content/decoration/slidingDoor/DoorControlBehaviour.java +++ b/src/main/java/com/simibubi/create/content/decoration/slidingDoor/DoorControlBehaviour.java @@ -4,7 +4,7 @@ import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BehaviourType; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; -import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.nbt.NBTHelper; import net.minecraft.nbt.CompoundTag; public class DoorControlBehaviour extends BlockEntityBehaviour { diff --git a/src/main/java/com/simibubi/create/content/decoration/slidingDoor/SlidingDoorBlockEntity.java b/src/main/java/com/simibubi/create/content/decoration/slidingDoor/SlidingDoorBlockEntity.java index 9a26047023..abd95d582b 100644 --- a/src/main/java/com/simibubi/create/content/decoration/slidingDoor/SlidingDoorBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/decoration/slidingDoor/SlidingDoorBlockEntity.java @@ -5,8 +5,8 @@ import java.util.List; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; -import net.createmod.catnip.utility.animation.LerpedFloat; -import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.animation.LerpedFloat; +import net.createmod.catnip.animation.LerpedFloat.Chaser; import net.minecraft.core.BlockPos; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; diff --git a/src/main/java/com/simibubi/create/content/decoration/slidingDoor/SlidingDoorMovementBehaviour.java b/src/main/java/com/simibubi/create/content/decoration/slidingDoor/SlidingDoorMovementBehaviour.java index 7563656f80..829e314d7b 100644 --- a/src/main/java/com/simibubi/create/content/decoration/slidingDoor/SlidingDoorMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/decoration/slidingDoor/SlidingDoorMovementBehaviour.java @@ -14,7 +14,7 @@ import com.simibubi.create.content.trains.entity.CarriageContraptionEntity; import com.simibubi.create.content.trains.station.GlobalStation; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; -import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.animation.LerpedFloat.Chaser; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.AxisDirection; diff --git a/src/main/java/com/simibubi/create/content/decoration/slidingDoor/SlidingDoorRenderer.java b/src/main/java/com/simibubi/create/content/decoration/slidingDoor/SlidingDoorRenderer.java index 5961e785cd..527f2b9e99 100644 --- a/src/main/java/com/simibubi/create/content/decoration/slidingDoor/SlidingDoorRenderer.java +++ b/src/main/java/com/simibubi/create/content/decoration/slidingDoor/SlidingDoorRenderer.java @@ -6,11 +6,11 @@ import com.simibubi.create.AllPartialModels; import com.simibubi.create.foundation.blockEntity.renderer.SafeBlockEntityRenderer; import dev.engine_room.flywheel.lib.model.baked.PartialModel; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.math.AngleHelper; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider.Context; @@ -21,6 +21,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.DoorHingeSide; import net.minecraft.world.level.block.state.properties.DoubleBlockHalf; import net.minecraft.world.phys.Vec3; + import net.minecraftforge.registries.ForgeRegistries; public class SlidingDoorRenderer extends SafeBlockEntityRenderer { diff --git a/src/main/java/com/simibubi/create/content/decoration/steamWhistle/WhistleBlock.java b/src/main/java/com/simibubi/create/content/decoration/steamWhistle/WhistleBlock.java index 4037a008b2..934ceb33e9 100644 --- a/src/main/java/com/simibubi/create/content/decoration/steamWhistle/WhistleBlock.java +++ b/src/main/java/com/simibubi/create/content/decoration/steamWhistle/WhistleBlock.java @@ -8,7 +8,8 @@ import com.simibubi.create.content.equipment.wrench.IWrenchable; import com.simibubi.create.content.fluids.tank.FluidTankBlock; import com.simibubi.create.foundation.advancement.AdvancementBehaviour; import com.simibubi.create.foundation.block.IBE; -import net.createmod.catnip.utility.lang.Lang; + +import net.createmod.catnip.lang.Lang; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/decoration/steamWhistle/WhistleBlockEntity.java b/src/main/java/com/simibubi/create/content/decoration/steamWhistle/WhistleBlockEntity.java index 910924e047..95c3abf35f 100644 --- a/src/main/java/com/simibubi/create/content/decoration/steamWhistle/WhistleBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/decoration/steamWhistle/WhistleBlockEntity.java @@ -15,10 +15,10 @@ import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.animation.LerpedFloat; -import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; -import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.animation.LerpedFloat; +import net.createmod.catnip.animation.LerpedFloat.Chaser; +import net.createmod.catnip.math.AngleHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -30,6 +30,7 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; + import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fml.DistExecutor; diff --git a/src/main/java/com/simibubi/create/content/decoration/steamWhistle/WhistleExtenderBlock.java b/src/main/java/com/simibubi/create/content/decoration/steamWhistle/WhistleExtenderBlock.java index 0663c00ec0..9c5090ed96 100644 --- a/src/main/java/com/simibubi/create/content/decoration/steamWhistle/WhistleExtenderBlock.java +++ b/src/main/java/com/simibubi/create/content/decoration/steamWhistle/WhistleExtenderBlock.java @@ -5,7 +5,7 @@ import com.simibubi.create.AllShapes; import com.simibubi.create.content.decoration.steamWhistle.WhistleBlock.WhistleSize; import com.simibubi.create.content.equipment.wrench.IWrenchable; -import net.createmod.catnip.utility.lang.Lang; +import net.createmod.catnip.lang.Lang; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/decoration/steamWhistle/WhistleRenderer.java b/src/main/java/com/simibubi/create/content/decoration/steamWhistle/WhistleRenderer.java index 3f2a7c6438..6495b4376e 100644 --- a/src/main/java/com/simibubi/create/content/decoration/steamWhistle/WhistleRenderer.java +++ b/src/main/java/com/simibubi/create/content/decoration/steamWhistle/WhistleRenderer.java @@ -6,9 +6,9 @@ import com.simibubi.create.content.decoration.steamWhistle.WhistleBlock.WhistleS import com.simibubi.create.foundation.blockEntity.renderer.SafeBlockEntityRenderer; import dev.engine_room.flywheel.lib.model.baked.PartialModel; +import net.createmod.catnip.animation.AnimationTickHolder; +import net.createmod.catnip.math.AngleHelper; import net.createmod.catnip.render.CachedBuffers; -import net.createmod.catnip.utility.math.AngleHelper; -import net.createmod.ponder.utility.LevelTickHolder; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; @@ -35,7 +35,7 @@ public class WhistleRenderer extends SafeBlockEntityRenderer float offset = be.animation.getValue(partialTicks); if (be.animation.getChaseTarget() > 0 && be.animation.getValue() > 0.5f) { - float wiggleProgress = (LevelTickHolder.getTicks(be.getLevel()) + partialTicks) / 8f; + float wiggleProgress = (AnimationTickHolder.getTicks(be.getLevel()) + partialTicks) / 8f; offset -= Math.sin(wiggleProgress * (2 * Mth.PI) * (4 - size.ordinal())) / 16f; } diff --git a/src/main/java/com/simibubi/create/content/equipment/TreeFertilizerItem.java b/src/main/java/com/simibubi/create/content/equipment/TreeFertilizerItem.java index b956631474..2e69ea8d1d 100644 --- a/src/main/java/com/simibubi/create/content/equipment/TreeFertilizerItem.java +++ b/src/main/java/com/simibubi/create/content/equipment/TreeFertilizerItem.java @@ -1,7 +1,7 @@ package com.simibubi.create.content.equipment; -import net.createmod.catnip.utility.levelWrappers.PlacementSimulationServerLevel; +import net.createmod.catnip.levelWrappers.PlacementSimulationServerLevel; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.tags.BlockTags; diff --git a/src/main/java/com/simibubi/create/content/equipment/armor/BacktankArmorLayer.java b/src/main/java/com/simibubi/create/content/equipment/armor/BacktankArmorLayer.java index 8ef93ce505..b604794999 100644 --- a/src/main/java/com/simibubi/create/content/equipment/armor/BacktankArmorLayer.java +++ b/src/main/java/com/simibubi/create/content/equipment/armor/BacktankArmorLayer.java @@ -3,10 +3,10 @@ package com.simibubi.create.content.equipment.armor; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; +import net.createmod.catnip.animation.AnimationTickHolder; +import net.createmod.catnip.math.AngleHelper; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; -import net.createmod.catnip.utility.math.AngleHelper; -import net.createmod.ponder.utility.LevelTickHolder; import net.minecraft.client.model.EntityModel; import net.minecraft.client.model.HumanoidModel; import net.minecraft.client.renderer.MultiBufferSource; @@ -69,7 +69,7 @@ public class BacktankArmorLayer .rotateYDegrees(180) .uncenter() .translate(0, 6.5f / 16, 11f / 16) - .rotate(AngleHelper.rad(2 * LevelTickHolder.getRenderTime(entity.level()) % 360), Direction.EAST) + .rotate(AngleHelper.rad(2 * AnimationTickHolder.getRenderTime(entity.level()) % 360), Direction.EAST) .translate(0, -6.5f / 16, -11f / 16); cogs.disableDiffuse() diff --git a/src/main/java/com/simibubi/create/content/equipment/armor/BacktankBlockEntity.java b/src/main/java/com/simibubi/create/content/equipment/armor/BacktankBlockEntity.java index cb3cacdd67..6d7788d8e7 100644 --- a/src/main/java/com/simibubi/create/content/equipment/armor/BacktankBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/equipment/armor/BacktankBlockEntity.java @@ -13,7 +13,7 @@ import com.simibubi.create.foundation.blockEntity.ComparatorUtil; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import com.simibubi.create.foundation.particle.AirParticleData; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction.Axis; import net.minecraft.core.particles.ParticleTypes; @@ -120,10 +120,10 @@ public class BacktankBlockEntity extends KineticBlockEntity implements Nameable compound.putInt("Air", airLevel); compound.putInt("Timer", airLevelTimer); compound.putInt("CapacityEnchantment", capacityEnchantLevel); - + if (this.customName != null) compound.putString("CustomName", Component.Serializer.toJson(this.customName)); - + compound.put("VanillaTag", vanillaTag); if (forgeCapsTag != null) compound.put("ForgeCapsTag", forgeCapsTag); @@ -136,10 +136,10 @@ public class BacktankBlockEntity extends KineticBlockEntity implements Nameable airLevel = compound.getInt("Air"); airLevelTimer = compound.getInt("Timer"); capacityEnchantLevel = compound.getInt("CapacityEnchantment"); - + if (compound.contains("CustomName", 8)) this.customName = Component.Serializer.fromJson(compound.getString("CustomName")); - + vanillaTag = compound.getCompound("VanillaTag"); forgeCapsTag = compound.contains("ForgeCapsTag") ? compound.getCompound("ForgeCapsTag") : null; @@ -181,7 +181,7 @@ public class BacktankBlockEntity extends KineticBlockEntity implements Nameable public void setCapacityEnchantLevel(int capacityEnchantLevel) { this.capacityEnchantLevel = capacityEnchantLevel; } - + public void setTags(CompoundTag vanillaTag, @Nullable CompoundTag forgeCapsTag) { this.vanillaTag = vanillaTag; this.forgeCapsTag = forgeCapsTag; @@ -190,7 +190,7 @@ public class BacktankBlockEntity extends KineticBlockEntity implements Nameable public CompoundTag getVanillaTag() { return vanillaTag; } - + public CompoundTag getForgeCapsTag() { return forgeCapsTag; } diff --git a/src/main/java/com/simibubi/create/content/equipment/armor/BacktankRenderer.java b/src/main/java/com/simibubi/create/content/equipment/armor/BacktankRenderer.java index 2e8b8dc04d..2dce458179 100644 --- a/src/main/java/com/simibubi/create/content/equipment/armor/BacktankRenderer.java +++ b/src/main/java/com/simibubi/create/content/equipment/armor/BacktankRenderer.java @@ -6,10 +6,10 @@ import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.kinetics.base.KineticBlockEntityRenderer; import dev.engine_room.flywheel.lib.model.baked.PartialModel; +import net.createmod.catnip.animation.AnimationTickHolder; +import net.createmod.catnip.math.AngleHelper; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; -import net.createmod.catnip.utility.math.AngleHelper; -import net.createmod.ponder.utility.LevelTickHolder; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; @@ -32,7 +32,7 @@ public class BacktankRenderer extends KineticBlockEntityRenderer>> BACKTANK_SUPPLIERS = new ArrayList<>(); diff --git a/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorHandlerClient.java b/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorHandlerClient.java index 0b523a6022..5642345b92 100644 --- a/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorHandlerClient.java +++ b/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorHandlerClient.java @@ -10,11 +10,12 @@ import com.simibubi.create.content.logistics.box.PackageRenderer; import com.simibubi.create.foundation.utility.TickBasedCache; import dev.engine_room.flywheel.lib.model.baked.PartialModel; -import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.animation.AnimationTickHolder; import net.minecraft.client.CameraType; import net.minecraft.client.Minecraft; import net.minecraft.util.Mth; import net.minecraft.world.entity.player.Player; + import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.RenderPlayerEvent; import net.minecraftforge.event.TickEvent.Phase; diff --git a/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorStealthOverlay.java b/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorStealthOverlay.java index 40f49fa718..708b31080b 100644 --- a/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorStealthOverlay.java +++ b/src/main/java/com/simibubi/create/content/equipment/armor/CardboardArmorStealthOverlay.java @@ -2,8 +2,8 @@ package com.simibubi.create.content.equipment.armor; import com.simibubi.create.Create; -import net.createmod.catnip.utility.animation.LerpedFloat; -import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.animation.LerpedFloat; +import net.createmod.catnip.animation.LerpedFloat.Chaser; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Gui; import net.minecraft.client.gui.GuiGraphics; @@ -11,6 +11,7 @@ import net.minecraft.client.player.LocalPlayer; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; + import net.minecraftforge.client.extensions.common.IClientItemExtensions; public class CardboardArmorStealthOverlay extends Gui implements IClientItemExtensions { diff --git a/src/main/java/com/simibubi/create/content/equipment/armor/DivingBootsItem.java b/src/main/java/com/simibubi/create/content/equipment/armor/DivingBootsItem.java index 9f675cfb0d..dfc0296158 100644 --- a/src/main/java/com/simibubi/create/content/equipment/armor/DivingBootsItem.java +++ b/src/main/java/com/simibubi/create/content/equipment/armor/DivingBootsItem.java @@ -1,6 +1,6 @@ package com.simibubi.create.content.equipment.armor; -import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.nbt.NBTHelper; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.FluidTags; import net.minecraft.world.entity.Entity; @@ -12,6 +12,7 @@ import net.minecraft.world.item.ArmorItem; import net.minecraft.world.item.ArmorMaterial; import net.minecraft.world.item.ItemStack; import net.minecraft.world.phys.Vec3; + import net.minecraftforge.event.entity.living.LivingEvent.LivingTickEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; diff --git a/src/main/java/com/simibubi/create/content/equipment/armor/RemainingAirOverlay.java b/src/main/java/com/simibubi/create/content/equipment/armor/RemainingAirOverlay.java index 0474b6ad89..5c063676b6 100644 --- a/src/main/java/com/simibubi/create/content/equipment/armor/RemainingAirOverlay.java +++ b/src/main/java/com/simibubi/create/content/equipment/armor/RemainingAirOverlay.java @@ -1,10 +1,13 @@ package com.simibubi.create.content.equipment.armor; +import java.util.List; + import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllItems; + import net.createmod.catnip.gui.element.GuiGameElement; -import net.createmod.catnip.utility.lang.Components; -import net.createmod.catnip.utility.theme.Color; +import net.createmod.catnip.lang.Components; +import net.createmod.catnip.theme.Color; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.player.LocalPlayer; @@ -13,11 +16,10 @@ import net.minecraft.tags.FluidTags; import net.minecraft.util.StringUtil; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.GameType; + import net.minecraftforge.client.gui.overlay.ForgeGui; import net.minecraftforge.client.gui.overlay.IGuiOverlay; -import java.util.List; - public class RemainingAirOverlay implements IGuiOverlay { public static final RemainingAirOverlay INSTANCE = new RemainingAirOverlay(); diff --git a/src/main/java/com/simibubi/create/content/equipment/bell/AbstractBellBlockEntity.java b/src/main/java/com/simibubi/create/content/equipment/bell/AbstractBellBlockEntity.java index 99ebb218b3..512d359b62 100644 --- a/src/main/java/com/simibubi/create/content/equipment/bell/AbstractBellBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/equipment/bell/AbstractBellBlockEntity.java @@ -6,13 +6,14 @@ import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import dev.engine_room.flywheel.lib.model.baked.PartialModel; -import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.nbt.NBTHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; + import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; diff --git a/src/main/java/com/simibubi/create/content/equipment/bell/BellRenderer.java b/src/main/java/com/simibubi/create/content/equipment/bell/BellRenderer.java index 498d255f57..420053b53f 100644 --- a/src/main/java/com/simibubi/create/content/equipment/bell/BellRenderer.java +++ b/src/main/java/com/simibubi/create/content/equipment/bell/BellRenderer.java @@ -5,7 +5,7 @@ import com.simibubi.create.foundation.blockEntity.renderer.SafeBlockEntityRender import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; -import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.math.AngleHelper; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; diff --git a/src/main/java/com/simibubi/create/content/equipment/bell/HauntedBellPulser.java b/src/main/java/com/simibubi/create/content/equipment/bell/HauntedBellPulser.java index 26d27b750c..e43b2a1d96 100644 --- a/src/main/java/com/simibubi/create/content/equipment/bell/HauntedBellPulser.java +++ b/src/main/java/com/simibubi/create/content/equipment/bell/HauntedBellPulser.java @@ -4,7 +4,7 @@ import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllPackets; -import net.createmod.catnip.utility.IntAttached; +import net.createmod.catnip.data.IntAttached; import net.minecraft.core.BlockPos; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.Level; diff --git a/src/main/java/com/simibubi/create/content/equipment/bell/SoulPulseEffect.java b/src/main/java/com/simibubi/create/content/equipment/bell/SoulPulseEffect.java index 28ddae56ec..83614f8aba 100644 --- a/src/main/java/com/simibubi/create/content/equipment/bell/SoulPulseEffect.java +++ b/src/main/java/com/simibubi/create/content/equipment/bell/SoulPulseEffect.java @@ -8,7 +8,7 @@ import java.util.stream.Stream; import com.google.common.collect.Streams; import com.simibubi.create.content.equipment.bell.SoulParticle.ExpandingPerimeterData; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.SpawnPlacements; diff --git a/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintEntity.java b/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintEntity.java index 82ad2fed9b..f54ec39320 100644 --- a/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintEntity.java +++ b/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintEntity.java @@ -19,8 +19,8 @@ import com.simibubi.create.content.schematics.requirement.ItemRequirement.ItemUs import com.simibubi.create.foundation.networking.ISyncPersistentData; import com.simibubi.create.foundation.utility.IInteractionChecker; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.math.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintOverlayRenderer.java b/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintOverlayRenderer.java index 4f2f60f470..dd37588ac1 100644 --- a/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintOverlayRenderer.java +++ b/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintOverlayRenderer.java @@ -25,12 +25,11 @@ import com.simibubi.create.content.trains.track.TrackPlacement.PlacementInfo; import com.simibubi.create.foundation.gui.AllGuiTextures; import net.createmod.catnip.gui.element.GuiGameElement; -import net.createmod.catnip.utility.AnimationTickHolder; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.Pair; -import net.createmod.catnip.utility.lang.Components; -import net.createmod.ponder.utility.LevelTickHolder; +import net.createmod.catnip.animation.AnimationTickHolder; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.data.Pair; +import net.createmod.catnip.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; @@ -424,7 +423,7 @@ public class BlueprintOverlayRenderer { public static void drawItemStack(GuiGraphics graphics, Minecraft mc, int x, int y, ItemStack itemStack, String count) { if (itemStack.getItem() instanceof FilterItem) { - int step = LevelTickHolder.getTicks(mc.level) / 10; + int step = AnimationTickHolder.getTicks(mc.level) / 10; ItemStack[] itemsMatchingFilter = getItemsMatchingFilter(itemStack); if (itemsMatchingFilter.length > 0) itemStack = itemsMatchingFilter[step % itemsMatchingFilter.length]; diff --git a/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintRenderer.java b/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintRenderer.java index 4ea2a7fff9..a77b0ae81e 100644 --- a/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintRenderer.java +++ b/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintRenderer.java @@ -10,7 +10,7 @@ import dev.engine_room.flywheel.lib.model.baked.PartialModel; import dev.engine_room.flywheel.lib.transform.TransformStack; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; -import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.data.Couple; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.Sheets; diff --git a/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardEntry.java b/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardEntry.java index c8676d4f24..7b092f3e66 100644 --- a/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardEntry.java +++ b/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardEntry.java @@ -3,7 +3,7 @@ package com.simibubi.create.content.equipment.clipboard; import java.util.ArrayList; import java.util.List; -import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.nbt.NBTHelper; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; diff --git a/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardScreen.java b/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardScreen.java index f731491955..655b70d4e0 100644 --- a/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardScreen.java +++ b/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardScreen.java @@ -29,7 +29,7 @@ import com.simibubi.create.foundation.utility.CreateLang; import it.unimi.dsi.fastutil.ints.IntArrayList; import it.unimi.dsi.fastutil.ints.IntList; import net.createmod.catnip.gui.AbstractSimiScreen; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.SharedConstants; import net.minecraft.Util; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardValueSettingsHandler.java b/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardValueSettingsHandler.java index 8fd81e694e..c300796a9a 100644 --- a/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardValueSettingsHandler.java +++ b/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardValueSettingsHandler.java @@ -13,7 +13,7 @@ import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.RenderType; diff --git a/src/main/java/com/simibubi/create/content/equipment/extendoGrip/ExtendoGripItem.java b/src/main/java/com/simibubi/create/content/equipment/extendoGrip/ExtendoGripItem.java index 22cd008bfa..35223f7e7e 100644 --- a/src/main/java/com/simibubi/create/content/equipment/extendoGrip/ExtendoGripItem.java +++ b/src/main/java/com/simibubi/create/content/equipment/extendoGrip/ExtendoGripItem.java @@ -9,7 +9,7 @@ import com.simibubi.create.content.equipment.armor.BacktankUtil; import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.item.render.SimpleCustomRenderer; import com.simibubi.create.infrastructure.config.AllConfigs; -import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.animation.AnimationTickHolder; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/equipment/extendoGrip/ExtendoGripItemRenderer.java b/src/main/java/com/simibubi/create/content/equipment/extendoGrip/ExtendoGripItemRenderer.java index ca9ad7e945..7df40ffd41 100644 --- a/src/main/java/com/simibubi/create/content/equipment/extendoGrip/ExtendoGripItemRenderer.java +++ b/src/main/java/com/simibubi/create/content/equipment/extendoGrip/ExtendoGripItemRenderer.java @@ -9,7 +9,7 @@ import com.simibubi.create.foundation.item.render.PartialItemModelRenderer; import dev.engine_room.flywheel.lib.model.baked.PartialModel; import dev.engine_room.flywheel.lib.transform.TransformStack; -import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.animation.AnimationTickHolder; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.util.Mth; import net.minecraft.world.item.ItemDisplayContext; diff --git a/src/main/java/com/simibubi/create/content/equipment/extendoGrip/ExtendoGripRenderHandler.java b/src/main/java/com/simibubi/create/content/equipment/extendoGrip/ExtendoGripRenderHandler.java index 346ed6d855..59a223655b 100644 --- a/src/main/java/com/simibubi/create/content/equipment/extendoGrip/ExtendoGripRenderHandler.java +++ b/src/main/java/com/simibubi/create/content/equipment/extendoGrip/ExtendoGripRenderHandler.java @@ -7,7 +7,7 @@ import com.simibubi.create.AllPartialModels; import dev.engine_room.flywheel.lib.model.baked.PartialModel; import dev.engine_room.flywheel.lib.transform.TransformStack; -import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.animation.AnimationTickHolder; import net.minecraft.client.Minecraft; import net.minecraft.client.player.AbstractClientPlayer; import net.minecraft.client.player.LocalPlayer; diff --git a/src/main/java/com/simibubi/create/content/equipment/goggles/GoggleConfigScreen.java b/src/main/java/com/simibubi/create/content/equipment/goggles/GoggleConfigScreen.java index 310a8b2735..578f8d3811 100644 --- a/src/main/java/com/simibubi/create/content/equipment/goggles/GoggleConfigScreen.java +++ b/src/main/java/com/simibubi/create/content/equipment/goggles/GoggleConfigScreen.java @@ -5,7 +5,7 @@ import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.infrastructure.config.AllConfigs; import net.createmod.catnip.gui.AbstractSimiScreen; import net.createmod.catnip.gui.element.GuiGameElement; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.network.chat.Component; diff --git a/src/main/java/com/simibubi/create/content/equipment/goggles/GoggleOverlayRenderer.java b/src/main/java/com/simibubi/create/content/equipment/goggles/GoggleOverlayRenderer.java index 421c5a41f9..5b75419936 100644 --- a/src/main/java/com/simibubi/create/content/equipment/goggles/GoggleOverlayRenderer.java +++ b/src/main/java/com/simibubi/create/content/equipment/goggles/GoggleOverlayRenderer.java @@ -22,12 +22,12 @@ import com.simibubi.create.infrastructure.config.CClient; import net.createmod.catnip.gui.element.BoxElement; import net.createmod.catnip.gui.element.GuiGameElement; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.lang.Components; -import net.createmod.catnip.utility.outliner.Outline; -import net.createmod.catnip.utility.outliner.Outliner; -import net.createmod.catnip.utility.outliner.Outliner.OutlineEntry; -import net.createmod.catnip.utility.theme.Color; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.lang.Components; +import net.createmod.catnip.outliner.Outline; +import net.createmod.catnip.outliner.Outliner; +import net.createmod.catnip.outliner.Outliner.OutlineEntry; +import net.createmod.catnip.theme.Color; import net.minecraft.client.Minecraft; import net.minecraft.client.MouseHandler; import net.minecraft.client.gui.GuiGraphics; diff --git a/src/main/java/com/simibubi/create/content/equipment/goggles/IHaveGoggleInformation.java b/src/main/java/com/simibubi/create/content/equipment/goggles/IHaveGoggleInformation.java index 9f83112e79..77ccfd708f 100644 --- a/src/main/java/com/simibubi/create/content/equipment/goggles/IHaveGoggleInformation.java +++ b/src/main/java/com/simibubi/create/content/equipment/goggles/IHaveGoggleInformation.java @@ -5,7 +5,7 @@ import java.util.Optional; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.lang.LangBuilder; +import net.createmod.catnip.lang.LangBuilder; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.world.level.block.entity.BlockEntity; diff --git a/src/main/java/com/simibubi/create/content/equipment/hats/EntityHats.java b/src/main/java/com/simibubi/create/content/equipment/hats/EntityHats.java index fec601d616..65e0203b33 100644 --- a/src/main/java/com/simibubi/create/content/equipment/hats/EntityHats.java +++ b/src/main/java/com/simibubi/create/content/equipment/hats/EntityHats.java @@ -10,8 +10,8 @@ import com.simibubi.create.content.trains.entity.CarriageContraption; import com.simibubi.create.content.trains.entity.CarriageContraptionEntity; import dev.engine_room.flywheel.lib.model.baked.PartialModel; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.data.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.entity.EquipmentSlot; diff --git a/src/main/java/com/simibubi/create/content/equipment/potatoCannon/BuiltinPotatoProjectileTypes.java b/src/main/java/com/simibubi/create/content/equipment/potatoCannon/BuiltinPotatoProjectileTypes.java index 72786b1a3b..e684674e81 100644 --- a/src/main/java/com/simibubi/create/content/equipment/potatoCannon/BuiltinPotatoProjectileTypes.java +++ b/src/main/java/com/simibubi/create/content/equipment/potatoCannon/BuiltinPotatoProjectileTypes.java @@ -5,7 +5,7 @@ import com.mojang.datafixers.util.Pair; import com.simibubi.create.AllItems; import com.simibubi.create.Create; import com.simibubi.create.foundation.mixin.accessor.FallingBlockEntityAccessor; -import net.createmod.catnip.utility.WorldAttached; +import net.createmod.catnip.data.WorldAttached; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; diff --git a/src/main/java/com/simibubi/create/content/equipment/potatoCannon/PotatoCannonItem.java b/src/main/java/com/simibubi/create/content/equipment/potatoCannon/PotatoCannonItem.java index e270831bf1..28f1c2337e 100644 --- a/src/main/java/com/simibubi/create/content/equipment/potatoCannon/PotatoCannonItem.java +++ b/src/main/java/com/simibubi/create/content/equipment/potatoCannon/PotatoCannonItem.java @@ -18,9 +18,9 @@ import com.simibubi.create.foundation.item.render.SimpleCustomRenderer; import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.infrastructure.config.AllConfigs; -import net.createmod.catnip.utility.AnimationTickHolder; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.animation.AnimationTickHolder; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.model.HumanoidModel.ArmPose; diff --git a/src/main/java/com/simibubi/create/content/equipment/potatoCannon/PotatoCannonItemRenderer.java b/src/main/java/com/simibubi/create/content/equipment/potatoCannon/PotatoCannonItemRenderer.java index 32f5c3de3b..4a7c89e2b4 100644 --- a/src/main/java/com/simibubi/create/content/equipment/potatoCannon/PotatoCannonItemRenderer.java +++ b/src/main/java/com/simibubi/create/content/equipment/potatoCannon/PotatoCannonItemRenderer.java @@ -10,7 +10,7 @@ import com.simibubi.create.foundation.item.render.PartialItemModelRenderer; import dev.engine_room.flywheel.lib.model.baked.PartialModel; import dev.engine_room.flywheel.lib.transform.TransformStack; -import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.animation.AnimationTickHolder; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; import net.minecraft.client.renderer.MultiBufferSource; diff --git a/src/main/java/com/simibubi/create/content/equipment/potatoCannon/PotatoCannonRenderHandler.java b/src/main/java/com/simibubi/create/content/equipment/potatoCannon/PotatoCannonRenderHandler.java index 8c011b8a68..f2211e2964 100644 --- a/src/main/java/com/simibubi/create/content/equipment/potatoCannon/PotatoCannonRenderHandler.java +++ b/src/main/java/com/simibubi/create/content/equipment/potatoCannon/PotatoCannonRenderHandler.java @@ -6,7 +6,7 @@ import com.simibubi.create.content.equipment.zapper.ShootableGadgetRenderHandler import com.simibubi.create.foundation.particle.AirParticleData; import dev.engine_room.flywheel.lib.transform.TransformStack; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.core.particles.ItemParticleOption; diff --git a/src/main/java/com/simibubi/create/content/equipment/potatoCannon/PotatoProjectileEntity.java b/src/main/java/com/simibubi/create/content/equipment/potatoCannon/PotatoProjectileEntity.java index ad5685f311..379cc79043 100644 --- a/src/main/java/com/simibubi/create/content/equipment/potatoCannon/PotatoProjectileEntity.java +++ b/src/main/java/com/simibubi/create/content/equipment/potatoCannon/PotatoProjectileEntity.java @@ -8,7 +8,7 @@ import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.damageTypes.CreateDamageSources; import com.simibubi.create.foundation.particle.AirParticleData; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.particles.ItemParticleOption; import net.minecraft.core.particles.ParticleOptions; diff --git a/src/main/java/com/simibubi/create/content/equipment/potatoCannon/PotatoProjectileRenderMode.java b/src/main/java/com/simibubi/create/content/equipment/potatoCannon/PotatoProjectileRenderMode.java index 781fc4b85b..cd3380d63b 100644 --- a/src/main/java/com/simibubi/create/content/equipment/potatoCannon/PotatoProjectileRenderMode.java +++ b/src/main/java/com/simibubi/create/content/equipment/potatoCannon/PotatoProjectileRenderMode.java @@ -5,7 +5,7 @@ import static com.simibubi.create.content.equipment.potatoCannon.PotatoProjectil import com.mojang.blaze3d.vertex.PoseStack; import dev.engine_room.flywheel.lib.transform.TransformStack; -import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.math.AngleHelper; import net.minecraft.client.Minecraft; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; diff --git a/src/main/java/com/simibubi/create/content/equipment/sandPaper/SandPaperItem.java b/src/main/java/com/simibubi/create/content/equipment/sandPaper/SandPaperItem.java index c66d4c2955..06f97c6c0f 100644 --- a/src/main/java/com/simibubi/create/content/equipment/sandPaper/SandPaperItem.java +++ b/src/main/java/com/simibubi/create/content/equipment/sandPaper/SandPaperItem.java @@ -9,7 +9,7 @@ import com.simibubi.create.foundation.item.CustomUseEffectsItem; import com.simibubi.create.foundation.item.render.SimpleCustomRenderer; import com.simibubi.create.foundation.mixin.accessor.LivingEntityAccessor; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.particles.ItemParticleOption; diff --git a/src/main/java/com/simibubi/create/content/equipment/sandPaper/SandPaperItemRenderer.java b/src/main/java/com/simibubi/create/content/equipment/sandPaper/SandPaperItemRenderer.java index cefe36ab52..85c6734ae2 100644 --- a/src/main/java/com/simibubi/create/content/equipment/sandPaper/SandPaperItemRenderer.java +++ b/src/main/java/com/simibubi/create/content/equipment/sandPaper/SandPaperItemRenderer.java @@ -6,7 +6,7 @@ import com.simibubi.create.foundation.item.render.CustomRenderedItemModel; import com.simibubi.create.foundation.item.render.CustomRenderedItemModelRenderer; import com.simibubi.create.foundation.item.render.PartialItemModelRenderer; -import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.animation.AnimationTickHolder; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; import net.minecraft.client.renderer.MultiBufferSource; diff --git a/src/main/java/com/simibubi/create/content/equipment/symmetryWand/SymmetryHandler.java b/src/main/java/com/simibubi/create/content/equipment/symmetryWand/SymmetryHandler.java index 3a8772ca46..b8f443e8dc 100644 --- a/src/main/java/com/simibubi/create/content/equipment/symmetryWand/SymmetryHandler.java +++ b/src/main/java/com/simibubi/create/content/equipment/symmetryWand/SymmetryHandler.java @@ -10,7 +10,7 @@ import com.simibubi.create.AllItems; import com.simibubi.create.content.equipment.symmetryWand.mirror.EmptyMirror; import com.simibubi.create.content.equipment.symmetryWand.mirror.SymmetryMirror; -import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.animation.AnimationTickHolder; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; @@ -79,7 +79,7 @@ public class SymmetryHandler { public static void onRenderWorld(RenderLevelStageEvent event) { if (event.getStage() != Stage.AFTER_PARTICLES) return; - + Minecraft mc = Minecraft.getInstance(); LocalPlayer player = mc.player; RandomSource random = RandomSource.create(); diff --git a/src/main/java/com/simibubi/create/content/equipment/symmetryWand/SymmetryWandItem.java b/src/main/java/com/simibubi/create/content/equipment/symmetryWand/SymmetryWandItem.java index 63b8a719b5..1870725522 100644 --- a/src/main/java/com/simibubi/create/content/equipment/symmetryWand/SymmetryWandItem.java +++ b/src/main/java/com/simibubi/create/content/equipment/symmetryWand/SymmetryWandItem.java @@ -21,7 +21,7 @@ import com.simibubi.create.foundation.utility.BlockHelper; import com.simibubi.create.infrastructure.config.AllConfigs; import net.createmod.catnip.gui.ScreenOpener; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; @@ -330,7 +330,7 @@ public class SymmetryWandItem extends Item { public void initializeClient(Consumer consumer) { consumer.accept(SimpleCustomRenderer.create(this, new SymmetryWandItemRenderer())); } - + public static boolean presentInHotbar(Player player) { Inventory inv = player.getInventory(); for (int i = 0; i < Inventory.getSelectionSize(); i++) diff --git a/src/main/java/com/simibubi/create/content/equipment/symmetryWand/SymmetryWandItemRenderer.java b/src/main/java/com/simibubi/create/content/equipment/symmetryWand/SymmetryWandItemRenderer.java index 4179f6c0c4..eb04c0b9e5 100644 --- a/src/main/java/com/simibubi/create/content/equipment/symmetryWand/SymmetryWandItemRenderer.java +++ b/src/main/java/com/simibubi/create/content/equipment/symmetryWand/SymmetryWandItemRenderer.java @@ -8,7 +8,7 @@ import com.simibubi.create.foundation.item.render.CustomRenderedItemModelRendere import com.simibubi.create.foundation.item.render.PartialItemModelRenderer; import dev.engine_room.flywheel.lib.model.baked.PartialModel; -import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.animation.AnimationTickHolder; import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.util.Mth; diff --git a/src/main/java/com/simibubi/create/content/equipment/symmetryWand/SymmetryWandScreen.java b/src/main/java/com/simibubi/create/content/equipment/symmetryWand/SymmetryWandScreen.java index 890d4fd5c6..805518fd31 100644 --- a/src/main/java/com/simibubi/create/content/equipment/symmetryWand/SymmetryWandScreen.java +++ b/src/main/java/com/simibubi/create/content/equipment/symmetryWand/SymmetryWandScreen.java @@ -20,7 +20,7 @@ import com.simibubi.create.foundation.utility.CreateLang; import net.createmod.catnip.gui.AbstractSimiScreen; import net.createmod.catnip.gui.element.GuiGameElement; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionHand; diff --git a/src/main/java/com/simibubi/create/content/equipment/toolbox/RadialToolboxMenu.java b/src/main/java/com/simibubi/create/content/equipment/toolbox/RadialToolboxMenu.java index 17468ad483..e04438c9c0 100644 --- a/src/main/java/com/simibubi/create/content/equipment/toolbox/RadialToolboxMenu.java +++ b/src/main/java/com/simibubi/create/content/equipment/toolbox/RadialToolboxMenu.java @@ -20,9 +20,9 @@ import com.simibubi.create.foundation.utility.CreateLang; import dev.engine_room.flywheel.lib.transform.TransformStack; import net.createmod.catnip.gui.AbstractSimiScreen; import net.createmod.catnip.gui.element.GuiGameElement; -import net.createmod.catnip.utility.AnimationTickHolder; -import net.createmod.catnip.utility.math.AngleHelper; -import net.createmod.catnip.utility.theme.Color; +import net.createmod.catnip.animation.AnimationTickHolder; +import net.createmod.catnip.math.AngleHelper; +import net.createmod.catnip.theme.Color; import net.minecraft.ChatFormatting; import net.minecraft.client.KeyMapping; import net.minecraft.client.gui.GuiGraphics; diff --git a/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolBoxVisual.java b/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolBoxVisual.java index c661193f2d..75efd8229b 100644 --- a/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolBoxVisual.java +++ b/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolBoxVisual.java @@ -13,7 +13,7 @@ import dev.engine_room.flywheel.lib.instance.TransformedInstance; import dev.engine_room.flywheel.lib.model.Models; import dev.engine_room.flywheel.lib.visual.AbstractBlockEntityVisual; import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.core.Direction; public class ToolBoxVisual extends AbstractBlockEntityVisual implements SimpleDynamicVisual { diff --git a/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolboxBlockEntity.java b/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolboxBlockEntity.java index 90542b1968..3fb2141113 100644 --- a/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolboxBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolboxBlockEntity.java @@ -16,9 +16,9 @@ import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour import com.simibubi.create.foundation.blockEntity.behaviour.animatedContainer.AnimatedContainerBehaviour; import com.simibubi.create.foundation.utility.ResetableLazy; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.animation.LerpedFloat; -import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.animation.LerpedFloat; +import net.createmod.catnip.animation.LerpedFloat.Chaser; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolboxHandler.java b/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolboxHandler.java index a3242cbaa6..232c85cad7 100644 --- a/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolboxHandler.java +++ b/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolboxHandler.java @@ -8,7 +8,7 @@ import com.simibubi.create.AllPackets; import com.simibubi.create.foundation.networking.ISyncPersistentData.PersistentDataPacket; import com.simibubi.create.infrastructure.config.AllConfigs; -import net.createmod.catnip.utility.WorldAttached; +import net.createmod.catnip.data.WorldAttached; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; diff --git a/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolboxInventory.java b/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolboxInventory.java index d391f50239..f42768c367 100644 --- a/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolboxInventory.java +++ b/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolboxInventory.java @@ -8,7 +8,7 @@ import javax.annotation.Nonnull; import com.simibubi.create.AllItems; -import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.nbt.NBTHelper; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; import net.minecraft.world.item.ItemStack; diff --git a/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolboxRenderer.java b/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolboxRenderer.java index 137d11beb0..1a61d5bade 100644 --- a/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolboxRenderer.java +++ b/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolboxRenderer.java @@ -7,7 +7,7 @@ import com.simibubi.create.foundation.blockEntity.renderer.SmartBlockEntityRende import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; diff --git a/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolboxScreen.java b/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolboxScreen.java index 97c8120e61..bd3dab1f38 100644 --- a/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolboxScreen.java +++ b/src/main/java/com/simibubi/create/content/equipment/toolbox/ToolboxScreen.java @@ -17,7 +17,7 @@ import com.simibubi.create.foundation.utility.CreateLang; import dev.engine_room.flywheel.lib.transform.TransformStack; import net.createmod.catnip.gui.element.GuiGameElement; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.renderer.Rect2i; import net.minecraft.network.chat.Component; diff --git a/src/main/java/com/simibubi/create/content/equipment/wrench/IWrenchable.java b/src/main/java/com/simibubi/create/content/equipment/wrench/IWrenchable.java index 877b7f815c..551645d5bf 100644 --- a/src/main/java/com/simibubi/create/content/equipment/wrench/IWrenchable.java +++ b/src/main/java/com/simibubi/create/content/equipment/wrench/IWrenchable.java @@ -9,7 +9,7 @@ import com.simibubi.create.content.kinetics.base.HorizontalKineticBlock; import com.simibubi.create.content.kinetics.base.KineticBlockEntity; import com.simibubi.create.content.kinetics.base.RotatedPillarKineticBlock; -import net.createmod.catnip.utility.VoxelShaper; +import net.createmod.catnip.math.VoxelShaper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; diff --git a/src/main/java/com/simibubi/create/content/equipment/wrench/WrenchItemRenderer.java b/src/main/java/com/simibubi/create/content/equipment/wrench/WrenchItemRenderer.java index 67aff52b40..93561881fa 100644 --- a/src/main/java/com/simibubi/create/content/equipment/wrench/WrenchItemRenderer.java +++ b/src/main/java/com/simibubi/create/content/equipment/wrench/WrenchItemRenderer.java @@ -9,7 +9,7 @@ import com.simibubi.create.foundation.item.render.CustomRenderedItemModelRendere import com.simibubi.create.foundation.item.render.PartialItemModelRenderer; import dev.engine_room.flywheel.lib.model.baked.PartialModel; -import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.animation.AnimationTickHolder; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; diff --git a/src/main/java/com/simibubi/create/content/equipment/zapper/PlacementPatterns.java b/src/main/java/com/simibubi/create/content/equipment/zapper/PlacementPatterns.java index 5f482639da..c4d1e6b70f 100644 --- a/src/main/java/com/simibubi/create/content/equipment/zapper/PlacementPatterns.java +++ b/src/main/java/com/simibubi/create/content/equipment/zapper/PlacementPatterns.java @@ -7,7 +7,7 @@ import java.util.function.Predicate; import com.google.common.base.Predicates; import com.simibubi.create.foundation.gui.AllIcons; -import net.createmod.catnip.utility.lang.Lang; +import net.createmod.catnip.lang.Lang; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.ItemStack; diff --git a/src/main/java/com/simibubi/create/content/equipment/zapper/ZapperItem.java b/src/main/java/com/simibubi/create/content/equipment/zapper/ZapperItem.java index 2fa55b7cbd..fc91256633 100644 --- a/src/main/java/com/simibubi/create/content/equipment/zapper/ZapperItem.java +++ b/src/main/java/com/simibubi/create/content/equipment/zapper/ZapperItem.java @@ -13,8 +13,8 @@ import com.simibubi.create.foundation.item.CustomArmPoseItem; import com.simibubi.create.foundation.utility.BlockHelper; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.NBTHelper; -import net.createmod.catnip.utility.NBTProcessors; +import net.createmod.catnip.nbt.NBTHelper; +import net.createmod.catnip.nbt.NBTProcessors; import net.minecraft.ChatFormatting; import net.minecraft.client.model.HumanoidModel.ArmPose; import net.minecraft.client.player.AbstractClientPlayer; diff --git a/src/main/java/com/simibubi/create/content/equipment/zapper/ZapperRenderHandler.java b/src/main/java/com/simibubi/create/content/equipment/zapper/ZapperRenderHandler.java index 086ba2dbc9..43af3b4ff5 100644 --- a/src/main/java/com/simibubi/create/content/equipment/zapper/ZapperRenderHandler.java +++ b/src/main/java/com/simibubi/create/content/equipment/zapper/ZapperRenderHandler.java @@ -9,7 +9,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Axis; import com.simibubi.create.AllSoundEvents; -import net.createmod.catnip.utility.outliner.Outliner; +import net.createmod.catnip.outliner.Outliner; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.core.particles.ParticleTypes; diff --git a/src/main/java/com/simibubi/create/content/equipment/zapper/ZapperScreen.java b/src/main/java/com/simibubi/create/content/equipment/zapper/ZapperScreen.java index 24936ff892..9da3238df6 100644 --- a/src/main/java/com/simibubi/create/content/equipment/zapper/ZapperScreen.java +++ b/src/main/java/com/simibubi/create/content/equipment/zapper/ZapperScreen.java @@ -12,8 +12,8 @@ import com.simibubi.create.foundation.utility.CreateLang; import net.createmod.catnip.gui.AbstractSimiScreen; import net.createmod.catnip.gui.element.GuiGameElement; -import net.createmod.catnip.utility.NBTHelper; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.nbt.NBTHelper; +import net.createmod.catnip.lang.Components; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/equipment/zapper/terrainzapper/CylinderBrush.java b/src/main/java/com/simibubi/create/content/equipment/zapper/terrainzapper/CylinderBrush.java index 51c5008984..8dfec4faf6 100644 --- a/src/main/java/com/simibubi/create/content/equipment/zapper/terrainzapper/CylinderBrush.java +++ b/src/main/java/com/simibubi/create/content/equipment/zapper/terrainzapper/CylinderBrush.java @@ -10,7 +10,7 @@ import org.apache.commons.lang3.tuple.Pair; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.AxisDirection; diff --git a/src/main/java/com/simibubi/create/content/equipment/zapper/terrainzapper/PlacementOptions.java b/src/main/java/com/simibubi/create/content/equipment/zapper/terrainzapper/PlacementOptions.java index 090a1849a1..ec37d6b707 100644 --- a/src/main/java/com/simibubi/create/content/equipment/zapper/terrainzapper/PlacementOptions.java +++ b/src/main/java/com/simibubi/create/content/equipment/zapper/terrainzapper/PlacementOptions.java @@ -2,7 +2,7 @@ package com.simibubi.create.content.equipment.zapper.terrainzapper; import com.simibubi.create.foundation.gui.AllIcons; -import net.createmod.catnip.utility.lang.Lang; +import net.createmod.catnip.lang.Lang; public enum PlacementOptions { diff --git a/src/main/java/com/simibubi/create/content/equipment/zapper/terrainzapper/SphereBrush.java b/src/main/java/com/simibubi/create/content/equipment/zapper/terrainzapper/SphereBrush.java index 995afd4544..560deb3278 100644 --- a/src/main/java/com/simibubi/create/content/equipment/zapper/terrainzapper/SphereBrush.java +++ b/src/main/java/com/simibubi/create/content/equipment/zapper/terrainzapper/SphereBrush.java @@ -7,7 +7,7 @@ import java.util.stream.Collectors; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; diff --git a/src/main/java/com/simibubi/create/content/equipment/zapper/terrainzapper/TerrainTools.java b/src/main/java/com/simibubi/create/content/equipment/zapper/terrainzapper/TerrainTools.java index 4b3422b9b3..930754e438 100644 --- a/src/main/java/com/simibubi/create/content/equipment/zapper/terrainzapper/TerrainTools.java +++ b/src/main/java/com/simibubi/create/content/equipment/zapper/terrainzapper/TerrainTools.java @@ -7,7 +7,7 @@ import javax.annotation.Nullable; import com.simibubi.create.content.equipment.zapper.ZapperItem; import com.simibubi.create.foundation.gui.AllIcons; -import net.createmod.catnip.utility.lang.Lang; +import net.createmod.catnip.lang.Lang; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/equipment/zapper/terrainzapper/WorldshaperItem.java b/src/main/java/com/simibubi/create/content/equipment/zapper/terrainzapper/WorldshaperItem.java index 79fdc24dfc..acd5b6204f 100644 --- a/src/main/java/com/simibubi/create/content/equipment/zapper/terrainzapper/WorldshaperItem.java +++ b/src/main/java/com/simibubi/create/content/equipment/zapper/terrainzapper/WorldshaperItem.java @@ -10,7 +10,7 @@ import com.simibubi.create.foundation.item.render.SimpleCustomRenderer; import com.simibubi.create.foundation.utility.CreateLang; import net.createmod.catnip.gui.ScreenOpener; -import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.nbt.NBTHelper; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; diff --git a/src/main/java/com/simibubi/create/content/equipment/zapper/terrainzapper/WorldshaperItemRenderer.java b/src/main/java/com/simibubi/create/content/equipment/zapper/terrainzapper/WorldshaperItemRenderer.java index db63100636..336a3b71c3 100644 --- a/src/main/java/com/simibubi/create/content/equipment/zapper/terrainzapper/WorldshaperItemRenderer.java +++ b/src/main/java/com/simibubi/create/content/equipment/zapper/terrainzapper/WorldshaperItemRenderer.java @@ -10,7 +10,7 @@ import com.simibubi.create.foundation.item.render.CustomRenderedItemModel; import com.simibubi.create.foundation.item.render.PartialItemModelRenderer; import dev.engine_room.flywheel.lib.model.baked.PartialModel; -import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.animation.AnimationTickHolder; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; import net.minecraft.client.renderer.LightTexture; diff --git a/src/main/java/com/simibubi/create/content/equipment/zapper/terrainzapper/WorldshaperRenderHandler.java b/src/main/java/com/simibubi/create/content/equipment/zapper/terrainzapper/WorldshaperRenderHandler.java index b24fa1f202..230d28d28d 100644 --- a/src/main/java/com/simibubi/create/content/equipment/zapper/terrainzapper/WorldshaperRenderHandler.java +++ b/src/main/java/com/simibubi/create/content/equipment/zapper/terrainzapper/WorldshaperRenderHandler.java @@ -7,8 +7,8 @@ import java.util.function.Supplier; import com.simibubi.create.AllItems; import com.simibubi.create.AllSpecialTextures; -import net.createmod.catnip.utility.NBTHelper; -import net.createmod.catnip.utility.outliner.Outliner; +import net.createmod.catnip.nbt.NBTHelper; +import net.createmod.catnip.outliner.Outliner; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/simibubi/create/content/equipment/zapper/terrainzapper/WorldshaperScreen.java b/src/main/java/com/simibubi/create/content/equipment/zapper/terrainzapper/WorldshaperScreen.java index 72a42ff23c..386132ffcd 100644 --- a/src/main/java/com/simibubi/create/content/equipment/zapper/terrainzapper/WorldshaperScreen.java +++ b/src/main/java/com/simibubi/create/content/equipment/zapper/terrainzapper/WorldshaperScreen.java @@ -15,8 +15,8 @@ import com.simibubi.create.foundation.gui.widget.ScrollInput; import com.simibubi.create.foundation.gui.widget.SelectionScrollInput; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.NBTHelper; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.nbt.NBTHelper; +import net.createmod.catnip.lang.Components; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/fluids/FlowSource.java b/src/main/java/com/simibubi/create/content/fluids/FlowSource.java index 1018ec642e..8afe52a46d 100644 --- a/src/main/java/com/simibubi/create/content/fluids/FlowSource.java +++ b/src/main/java/com/simibubi/create/content/fluids/FlowSource.java @@ -5,7 +5,7 @@ import java.util.function.Predicate; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; -import net.createmod.catnip.utility.BlockFace; +import net.createmod.catnip.math.BlockFace; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraftforge.common.capabilities.ForgeCapabilities; diff --git a/src/main/java/com/simibubi/create/content/fluids/FluidFX.java b/src/main/java/com/simibubi/create/content/fluids/FluidFX.java index 40c8b66c08..6ca828353d 100644 --- a/src/main/java/com/simibubi/create/content/fluids/FluidFX.java +++ b/src/main/java/com/simibubi/create/content/fluids/FluidFX.java @@ -4,7 +4,7 @@ import com.simibubi.create.AllParticleTypes; import com.simibubi.create.content.fluids.particle.FluidParticleData; import com.simibubi.create.foundation.fluid.FluidHelper; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/fluids/FluidNetwork.java b/src/main/java/com/simibubi/create/content/fluids/FluidNetwork.java index b5e70e6708..810fc5721a 100644 --- a/src/main/java/com/simibubi/create/content/fluids/FluidNetwork.java +++ b/src/main/java/com/simibubi/create/content/fluids/FluidNetwork.java @@ -18,9 +18,9 @@ import com.simibubi.create.content.fluids.PipeConnection.Flow; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import com.simibubi.create.foundation.fluid.FluidHelper; -import net.createmod.catnip.utility.BlockFace; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.math.BlockFace; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.data.Pair; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.Level; diff --git a/src/main/java/com/simibubi/create/content/fluids/FluidPropagator.java b/src/main/java/com/simibubi/create/content/fluids/FluidPropagator.java index dae537a67c..874a985fff 100644 --- a/src/main/java/com/simibubi/create/content/fluids/FluidPropagator.java +++ b/src/main/java/com/simibubi/create/content/fluids/FluidPropagator.java @@ -21,8 +21,8 @@ import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour import com.simibubi.create.foundation.utility.BlockHelper; import com.simibubi.create.infrastructure.config.AllConfigs; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.data.Pair; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/fluids/FluidTransportBehaviour.java b/src/main/java/com/simibubi/create/content/fluids/FluidTransportBehaviour.java index e011f98a8d..b2ee5fac40 100644 --- a/src/main/java/com/simibubi/create/content/fluids/FluidTransportBehaviour.java +++ b/src/main/java/com/simibubi/create/content/fluids/FluidTransportBehaviour.java @@ -15,8 +15,8 @@ import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BehaviourType; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.WorldAttached; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.data.WorldAttached; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/fluids/OpenEndedPipe.java b/src/main/java/com/simibubi/create/content/fluids/OpenEndedPipe.java index 29c525f3b3..03e1c061ed 100644 --- a/src/main/java/com/simibubi/create/content/fluids/OpenEndedPipe.java +++ b/src/main/java/com/simibubi/create/content/fluids/OpenEndedPipe.java @@ -16,7 +16,7 @@ import com.simibubi.create.foundation.fluid.FluidHelper; import com.simibubi.create.foundation.mixin.accessor.FlowingFluidAccessor; import com.simibubi.create.infrastructure.config.AllConfigs; -import net.createmod.catnip.utility.BlockFace; +import net.createmod.catnip.math.BlockFace; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/fluids/PipeAttachmentModel.java b/src/main/java/com/simibubi/create/content/fluids/PipeAttachmentModel.java index eb17afba72..a7a33b0005 100644 --- a/src/main/java/com/simibubi/create/content/fluids/PipeAttachmentModel.java +++ b/src/main/java/com/simibubi/create/content/fluids/PipeAttachmentModel.java @@ -14,7 +14,7 @@ import com.simibubi.create.content.fluids.pipes.FluidPipeBlock; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import com.simibubi.create.foundation.model.BakedModelWrapperWithData; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.ItemBlockRenderTypes; import net.minecraft.client.renderer.RenderType; @@ -38,11 +38,11 @@ public class PipeAttachmentModel extends BakedModelWrapperWithData { public static PipeAttachmentModel withAO(BakedModel template) { return new PipeAttachmentModel(template, true); } - + public static PipeAttachmentModel withoutAO(BakedModel template) { return new PipeAttachmentModel(template, false); } - + public PipeAttachmentModel(BakedModel template, boolean ao) { super(template); this.ao = ao; @@ -85,17 +85,17 @@ public class PipeAttachmentModel extends BakedModelWrapperWithData { } return quads; } - + @Override public boolean useAmbientOcclusion(BlockState state, RenderType renderType) { return ao; } - + @Override public boolean useAmbientOcclusion(BlockState state) { return ao; } - + @Override public boolean useAmbientOcclusion() { return ao; diff --git a/src/main/java/com/simibubi/create/content/fluids/PipeConnection.java b/src/main/java/com/simibubi/create/content/fluids/PipeConnection.java index 0f2a194ca5..c89023e3bf 100644 --- a/src/main/java/com/simibubi/create/content/fluids/PipeConnection.java +++ b/src/main/java/com/simibubi/create/content/fluids/PipeConnection.java @@ -6,11 +6,11 @@ import java.util.function.Predicate; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; -import net.createmod.catnip.utility.BlockFace; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.animation.LerpedFloat; +import net.createmod.catnip.math.BlockFace; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.animation.LerpedFloat; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/fluids/drain/ItemDrainBlockEntity.java b/src/main/java/com/simibubi/create/content/fluids/drain/ItemDrainBlockEntity.java index c049ac3d54..a7cfbc30e0 100644 --- a/src/main/java/com/simibubi/create/content/fluids/drain/ItemDrainBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/fluids/drain/ItemDrainBlockEntity.java @@ -14,9 +14,9 @@ import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour import com.simibubi.create.foundation.blockEntity.behaviour.fluid.SmartFluidTankBehaviour; import com.simibubi.create.foundation.utility.BlockHelper; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.Pair; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.data.Pair; +import net.createmod.catnip.math.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/fluids/drain/ItemDrainRenderer.java b/src/main/java/com/simibubi/create/content/fluids/drain/ItemDrainRenderer.java index 0a19b95d70..b930f91abb 100644 --- a/src/main/java/com/simibubi/create/content/fluids/drain/ItemDrainRenderer.java +++ b/src/main/java/com/simibubi/create/content/fluids/drain/ItemDrainRenderer.java @@ -13,7 +13,7 @@ import com.simibubi.create.foundation.blockEntity.renderer.SmartBlockEntityRende import com.simibubi.create.foundation.fluid.FluidRenderer; import dev.engine_room.flywheel.lib.transform.TransformStack; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; diff --git a/src/main/java/com/simibubi/create/content/fluids/hosePulley/HosePulleyBlock.java b/src/main/java/com/simibubi/create/content/fluids/hosePulley/HosePulleyBlock.java index 7a1fcde22a..f81d9c8f2c 100644 --- a/src/main/java/com/simibubi/create/content/fluids/hosePulley/HosePulleyBlock.java +++ b/src/main/java/com/simibubi/create/content/fluids/hosePulley/HosePulleyBlock.java @@ -5,7 +5,7 @@ import com.simibubi.create.content.fluids.pipes.FluidPipeBlock; import com.simibubi.create.content.kinetics.base.HorizontalKineticBlock; import com.simibubi.create.foundation.block.IBE; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/fluids/hosePulley/HosePulleyBlockEntity.java b/src/main/java/com/simibubi/create/content/fluids/hosePulley/HosePulleyBlockEntity.java index a47ba5f907..671093d761 100644 --- a/src/main/java/com/simibubi/create/content/fluids/hosePulley/HosePulleyBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/fluids/hosePulley/HosePulleyBlockEntity.java @@ -11,7 +11,7 @@ import com.simibubi.create.foundation.fluid.SmartFluidTank; import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.utility.ServerSpeedProvider; -import net.createmod.catnip.utility.animation.LerpedFloat; +import net.createmod.catnip.animation.LerpedFloat; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/fluids/particle/BasinFluidParticle.java b/src/main/java/com/simibubi/create/content/fluids/particle/BasinFluidParticle.java index 9573a8b1f7..e1369f87ed 100644 --- a/src/main/java/com/simibubi/create/content/fluids/particle/BasinFluidParticle.java +++ b/src/main/java/com/simibubi/create/content/fluids/particle/BasinFluidParticle.java @@ -7,7 +7,7 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.content.processing.basin.BasinBlock; import com.simibubi.create.content.processing.basin.BasinBlockEntity; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.client.Camera; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/simibubi/create/content/fluids/particle/FluidStackParticle.java b/src/main/java/com/simibubi/create/content/fluids/particle/FluidStackParticle.java index a55c4b96ae..96aa117295 100644 --- a/src/main/java/com/simibubi/create/content/fluids/particle/FluidStackParticle.java +++ b/src/main/java/com/simibubi/create/content/fluids/particle/FluidStackParticle.java @@ -3,7 +3,7 @@ package com.simibubi.create.content.fluids.particle; import com.simibubi.create.AllParticleTypes; import com.simibubi.create.content.fluids.potion.PotionFluid; -import net.createmod.catnip.utility.theme.Color; +import net.createmod.catnip.theme.Color; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.particle.ParticleRenderType; diff --git a/src/main/java/com/simibubi/create/content/fluids/pipes/AxisPipeBlock.java b/src/main/java/com/simibubi/create/content/fluids/pipes/AxisPipeBlock.java index 82eb02ae37..62924f5f30 100644 --- a/src/main/java/com/simibubi/create/content/fluids/pipes/AxisPipeBlock.java +++ b/src/main/java/com/simibubi/create/content/fluids/pipes/AxisPipeBlock.java @@ -12,7 +12,7 @@ import com.simibubi.create.content.fluids.FluidTransportBehaviour; import com.simibubi.create.foundation.advancement.AdvancementBehaviour; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/fluids/pipes/EncasedPipeBlock.java b/src/main/java/com/simibubi/create/content/fluids/pipes/EncasedPipeBlock.java index 77cbe367e6..b3ed1bc109 100644 --- a/src/main/java/com/simibubi/create/content/fluids/pipes/EncasedPipeBlock.java +++ b/src/main/java/com/simibubi/create/content/fluids/pipes/EncasedPipeBlock.java @@ -23,7 +23,7 @@ import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.foundation.advancement.AdvancementBehaviour; import com.simibubi.create.foundation.block.IBE; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.protocol.game.DebugPackets; diff --git a/src/main/java/com/simibubi/create/content/fluids/pipes/FluidPipeBlock.java b/src/main/java/com/simibubi/create/content/fluids/pipes/FluidPipeBlock.java index 634b8b234e..8c3cf43958 100644 --- a/src/main/java/com/simibubi/create/content/fluids/pipes/FluidPipeBlock.java +++ b/src/main/java/com/simibubi/create/content/fluids/pipes/FluidPipeBlock.java @@ -19,7 +19,7 @@ import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.block.IBE; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/fluids/pipes/FluidPipeBlockRotation.java b/src/main/java/com/simibubi/create/content/fluids/pipes/FluidPipeBlockRotation.java index 8f66ce1b73..0c044fa00d 100644 --- a/src/main/java/com/simibubi/create/content/fluids/pipes/FluidPipeBlockRotation.java +++ b/src/main/java/com/simibubi/create/content/fluids/pipes/FluidPipeBlockRotation.java @@ -4,7 +4,7 @@ import java.util.Map; import com.simibubi.create.content.contraptions.StructureTransform; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.core.Direction; import net.minecraft.world.level.block.Mirror; import net.minecraft.world.level.block.PipeBlock; diff --git a/src/main/java/com/simibubi/create/content/fluids/pipes/SmartFluidPipeBlock.java b/src/main/java/com/simibubi/create/content/fluids/pipes/SmartFluidPipeBlock.java index cd970bbce0..12d56a771c 100644 --- a/src/main/java/com/simibubi/create/content/fluids/pipes/SmartFluidPipeBlock.java +++ b/src/main/java/com/simibubi/create/content/fluids/pipes/SmartFluidPipeBlock.java @@ -8,8 +8,8 @@ import com.simibubi.create.foundation.advancement.AdvancementBehaviour; import com.simibubi.create.foundation.block.IBE; import com.simibubi.create.foundation.block.ProperWaterloggedBlock; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.VoxelShaper; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.math.VoxelShaper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/fluids/pipes/SmartFluidPipeBlockEntity.java b/src/main/java/com/simibubi/create/content/fluids/pipes/SmartFluidPipeBlockEntity.java index 3fbf8aabdb..2bc10105f1 100644 --- a/src/main/java/com/simibubi/create/content/fluids/pipes/SmartFluidPipeBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/fluids/pipes/SmartFluidPipeBlockEntity.java @@ -11,8 +11,8 @@ import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform; import com.simibubi.create.foundation.blockEntity.behaviour.filtering.FilteringBehaviour; import dev.engine_room.flywheel.lib.transform.TransformStack; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.math.AngleHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/fluids/pipes/TransparentStraightPipeRenderer.java b/src/main/java/com/simibubi/create/content/fluids/pipes/TransparentStraightPipeRenderer.java index ae77501251..3789ccd50f 100644 --- a/src/main/java/com/simibubi/create/content/fluids/pipes/TransparentStraightPipeRenderer.java +++ b/src/main/java/com/simibubi/create/content/fluids/pipes/TransparentStraightPipeRenderer.java @@ -7,8 +7,8 @@ import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour import com.simibubi.create.foundation.blockEntity.renderer.SafeBlockEntityRenderer; import com.simibubi.create.foundation.fluid.FluidRenderer; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.animation.LerpedFloat; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.animation.LerpedFloat; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/fluids/pipes/valve/FluidValveBlock.java b/src/main/java/com/simibubi/create/content/fluids/pipes/valve/FluidValveBlock.java index 15ad21b160..37a5639dfc 100644 --- a/src/main/java/com/simibubi/create/content/fluids/pipes/valve/FluidValveBlock.java +++ b/src/main/java/com/simibubi/create/content/fluids/pipes/valve/FluidValveBlock.java @@ -11,7 +11,7 @@ import com.simibubi.create.content.kinetics.base.DirectionalAxisKineticBlock; import com.simibubi.create.foundation.block.IBE; import com.simibubi.create.foundation.block.ProperWaterloggedBlock; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/fluids/pipes/valve/FluidValveBlockEntity.java b/src/main/java/com/simibubi/create/content/fluids/pipes/valve/FluidValveBlockEntity.java index e98113cf96..11d4027ee1 100644 --- a/src/main/java/com/simibubi/create/content/fluids/pipes/valve/FluidValveBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/fluids/pipes/valve/FluidValveBlockEntity.java @@ -8,8 +8,8 @@ import com.simibubi.create.content.kinetics.base.KineticBlockEntity; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; -import net.createmod.catnip.utility.animation.LerpedFloat; -import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.animation.LerpedFloat; +import net.createmod.catnip.animation.LerpedFloat.Chaser; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/fluids/pipes/valve/FluidValveRenderer.java b/src/main/java/com/simibubi/create/content/fluids/pipes/valve/FluidValveRenderer.java index 712cf28472..5294b1a53a 100644 --- a/src/main/java/com/simibubi/create/content/fluids/pipes/valve/FluidValveRenderer.java +++ b/src/main/java/com/simibubi/create/content/fluids/pipes/valve/FluidValveRenderer.java @@ -7,7 +7,7 @@ import com.simibubi.create.content.kinetics.base.KineticBlockEntityRenderer; import dev.engine_room.flywheel.api.visualization.VisualizationManager; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; -import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.math.AngleHelper; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; diff --git a/src/main/java/com/simibubi/create/content/fluids/pipes/valve/FluidValveVisual.java b/src/main/java/com/simibubi/create/content/fluids/pipes/valve/FluidValveVisual.java index ce62d4af94..f7dc4e3cbc 100644 --- a/src/main/java/com/simibubi/create/content/fluids/pipes/valve/FluidValveVisual.java +++ b/src/main/java/com/simibubi/create/content/fluids/pipes/valve/FluidValveVisual.java @@ -13,7 +13,7 @@ import dev.engine_room.flywheel.lib.instance.InstanceTypes; import dev.engine_room.flywheel.lib.instance.TransformedInstance; import dev.engine_room.flywheel.lib.model.Models; import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; -import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.math.AngleHelper; import net.minecraft.core.Direction; import net.minecraft.util.Mth; diff --git a/src/main/java/com/simibubi/create/content/fluids/potion/PotionFluid.java b/src/main/java/com/simibubi/create/content/fluids/potion/PotionFluid.java index cebd8f1208..56c434eba9 100644 --- a/src/main/java/com/simibubi/create/content/fluids/potion/PotionFluid.java +++ b/src/main/java/com/simibubi/create/content/fluids/potion/PotionFluid.java @@ -8,7 +8,7 @@ import com.simibubi.create.AllFluids.TintedFluidType; import com.simibubi.create.content.fluids.VirtualFluid; import net.createmod.catnip.platform.CatnipServices; -import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.nbt.NBTHelper; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; diff --git a/src/main/java/com/simibubi/create/content/fluids/potion/PotionFluidHandler.java b/src/main/java/com/simibubi/create/content/fluids/potion/PotionFluidHandler.java index 517c6ded09..9657acf8fb 100644 --- a/src/main/java/com/simibubi/create/content/fluids/potion/PotionFluidHandler.java +++ b/src/main/java/com/simibubi/create/content/fluids/potion/PotionFluidHandler.java @@ -9,9 +9,9 @@ import com.simibubi.create.content.fluids.potion.PotionFluid.BottleType; import com.simibubi.create.foundation.fluid.FluidHelper; import com.simibubi.create.foundation.fluid.FluidIngredient; -import net.createmod.catnip.utility.NBTHelper; -import net.createmod.catnip.utility.Pair; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.nbt.NBTHelper; +import net.createmod.catnip.data.Pair; +import net.createmod.catnip.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; @@ -42,7 +42,7 @@ public class PotionFluidHandler { return stack.getItem() instanceof PotionItem && !(stack.getCraftingRemainingItem() .getItem() instanceof BucketItem); } - + public static Pair emptyPotion(ItemStack stack, boolean simulate) { FluidStack fluid = getFluidFromPotionItem(stack); if (!simulate) diff --git a/src/main/java/com/simibubi/create/content/fluids/pump/PumpBlock.java b/src/main/java/com/simibubi/create/content/fluids/pump/PumpBlock.java index 276ab112ef..a0b0fae2c2 100644 --- a/src/main/java/com/simibubi/create/content/fluids/pump/PumpBlock.java +++ b/src/main/java/com/simibubi/create/content/fluids/pump/PumpBlock.java @@ -9,7 +9,7 @@ import com.simibubi.create.content.kinetics.simpleRelays.ICogWheel; import com.simibubi.create.foundation.block.IBE; import com.simibubi.create.foundation.block.ProperWaterloggedBlock; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/fluids/pump/PumpBlockEntity.java b/src/main/java/com/simibubi/create/content/fluids/pump/PumpBlockEntity.java index 87fb272aa4..0a2bb05d3d 100644 --- a/src/main/java/com/simibubi/create/content/fluids/pump/PumpBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/fluids/pump/PumpBlockEntity.java @@ -21,10 +21,10 @@ import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; -import net.createmod.catnip.utility.BlockFace; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.math.BlockFace; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.data.Pair; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/fluids/spout/SpoutBlockEntity.java b/src/main/java/com/simibubi/create/content/fluids/spout/SpoutBlockEntity.java index ea509d7843..6f804d6299 100644 --- a/src/main/java/com/simibubi/create/content/fluids/spout/SpoutBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/fluids/spout/SpoutBlockEntity.java @@ -25,8 +25,8 @@ import com.simibubi.create.foundation.fluid.FluidHelper; import com.simibubi.create.impl.behaviour.BlockSpoutingBehaviourImpl; -import net.createmod.catnip.utility.NBTHelper; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.nbt.NBTHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.particles.ParticleOptions; diff --git a/src/main/java/com/simibubi/create/content/fluids/tank/BoilerData.java b/src/main/java/com/simibubi/create/content/fluids/tank/BoilerData.java index eaacdc44f8..70d7d1de3d 100644 --- a/src/main/java/com/simibubi/create/content/fluids/tank/BoilerData.java +++ b/src/main/java/com/simibubi/create/content/fluids/tank/BoilerData.java @@ -20,10 +20,10 @@ import com.simibubi.create.foundation.fluid.FluidHelper; import com.simibubi.create.foundation.utility.CreateLang; import joptsimple.internal.Strings; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.animation.LerpedFloat; -import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.animation.LerpedFloat; +import net.createmod.catnip.animation.LerpedFloat.Chaser; +import net.createmod.catnip.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/fluids/tank/FluidTankBlock.java b/src/main/java/com/simibubi/create/content/fluids/tank/FluidTankBlock.java index 1568bb7eee..ebd07cb36a 100644 --- a/src/main/java/com/simibubi/create/content/fluids/tank/FluidTankBlock.java +++ b/src/main/java/com/simibubi/create/content/fluids/tank/FluidTankBlock.java @@ -12,7 +12,7 @@ import com.simibubi.create.foundation.blockEntity.ComparatorUtil; import com.simibubi.create.foundation.fluid.FluidHelper; import com.simibubi.create.foundation.fluid.FluidHelper.FluidExchange; -import net.createmod.catnip.utility.lang.Lang; +import net.createmod.catnip.lang.Lang; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.particles.BlockParticleOption; diff --git a/src/main/java/com/simibubi/create/content/fluids/tank/FluidTankBlockEntity.java b/src/main/java/com/simibubi/create/content/fluids/tank/FluidTankBlockEntity.java index d922cb1df0..7b3ca45908 100644 --- a/src/main/java/com/simibubi/create/content/fluids/tank/FluidTankBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/fluids/tank/FluidTankBlockEntity.java @@ -18,8 +18,8 @@ import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour import com.simibubi.create.foundation.fluid.SmartFluidTank; import com.simibubi.create.infrastructure.config.AllConfigs; -import net.createmod.catnip.utility.animation.LerpedFloat; -import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.animation.LerpedFloat; +import net.createmod.catnip.animation.LerpedFloat.Chaser; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; @@ -118,7 +118,7 @@ public class FluidTankBlockEntity extends SmartBlockEntity implements IHaveGoggl if (isController()) boiler.tick(this); } - + @Override public void lazyTick() { super.lazyTick(); diff --git a/src/main/java/com/simibubi/create/content/fluids/tank/FluidTankModel.java b/src/main/java/com/simibubi/create/content/fluids/tank/FluidTankModel.java index d5a209707c..57f23ea334 100644 --- a/src/main/java/com/simibubi/create/content/fluids/tank/FluidTankModel.java +++ b/src/main/java/com/simibubi/create/content/fluids/tank/FluidTankModel.java @@ -10,7 +10,7 @@ import com.simibubi.create.api.connectivity.ConnectivityHandler; import com.simibubi.create.foundation.block.connected.CTModel; import com.simibubi.create.foundation.block.connected.CTSpriteShiftEntry; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.resources.model.BakedModel; diff --git a/src/main/java/com/simibubi/create/content/fluids/tank/FluidTankRenderer.java b/src/main/java/com/simibubi/create/content/fluids/tank/FluidTankRenderer.java index bcaaa97689..034c3e3a6b 100644 --- a/src/main/java/com/simibubi/create/content/fluids/tank/FluidTankRenderer.java +++ b/src/main/java/com/simibubi/create/content/fluids/tank/FluidTankRenderer.java @@ -8,8 +8,8 @@ import com.simibubi.create.foundation.fluid.FluidRenderer; import dev.engine_room.flywheel.lib.transform.TransformStack; import net.createmod.catnip.render.CachedBuffers; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.animation.LerpedFloat; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.animation.LerpedFloat; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; diff --git a/src/main/java/com/simibubi/create/content/fluids/transfer/FillingRecipe.java b/src/main/java/com/simibubi/create/content/fluids/transfer/FillingRecipe.java index 373aff64f2..97631ae4ce 100644 --- a/src/main/java/com/simibubi/create/content/fluids/transfer/FillingRecipe.java +++ b/src/main/java/com/simibubi/create/content/fluids/transfer/FillingRecipe.java @@ -13,7 +13,7 @@ import com.simibubi.create.content.processing.sequenced.IAssemblyRecipe; import com.simibubi.create.foundation.fluid.FluidIngredient; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.network.chat.Component; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.level.ItemLike; diff --git a/src/main/java/com/simibubi/create/content/fluids/transfer/FluidDrainingBehaviour.java b/src/main/java/com/simibubi/create/content/fluids/transfer/FluidDrainingBehaviour.java index 130809d9ec..e37ce1039c 100644 --- a/src/main/java/com/simibubi/create/content/fluids/transfer/FluidDrainingBehaviour.java +++ b/src/main/java/com/simibubi/create/content/fluids/transfer/FluidDrainingBehaviour.java @@ -15,8 +15,8 @@ import com.simibubi.create.foundation.fluid.FluidHelper; import it.unimi.dsi.fastutil.PriorityQueue; import it.unimi.dsi.fastutil.objects.ObjectHeapPriorityQueue; -import net.createmod.catnip.utility.BBHelper; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.math.BBHelper; +import net.createmod.catnip.data.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/fluids/transfer/FluidFillingBehaviour.java b/src/main/java/com/simibubi/create/content/fluids/transfer/FluidFillingBehaviour.java index b0c87b02c0..5cf08b74e2 100644 --- a/src/main/java/com/simibubi/create/content/fluids/transfer/FluidFillingBehaviour.java +++ b/src/main/java/com/simibubi/create/content/fluids/transfer/FluidFillingBehaviour.java @@ -14,8 +14,8 @@ import com.simibubi.create.infrastructure.config.AllConfigs; import it.unimi.dsi.fastutil.PriorityQueue; import it.unimi.dsi.fastutil.objects.ObjectHeapPriorityQueue; -import net.createmod.catnip.utility.BBHelper; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.math.BBHelper; +import net.createmod.catnip.data.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.sounds.SoundEvents; diff --git a/src/main/java/com/simibubi/create/content/fluids/transfer/FluidManipulationBehaviour.java b/src/main/java/com/simibubi/create/content/fluids/transfer/FluidManipulationBehaviour.java index df8478f004..1781bcf40f 100644 --- a/src/main/java/com/simibubi/create/content/fluids/transfer/FluidManipulationBehaviour.java +++ b/src/main/java/com/simibubi/create/content/fluids/transfer/FluidManipulationBehaviour.java @@ -14,9 +14,9 @@ import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour import com.simibubi.create.foundation.fluid.FluidHelper; import com.simibubi.create.infrastructure.config.AllConfigs; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.NBTHelper; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.nbt.NBTHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/fluids/transfer/GenericItemEmptying.java b/src/main/java/com/simibubi/create/content/fluids/transfer/GenericItemEmptying.java index 609ac4d7c5..672e5a9c0d 100644 --- a/src/main/java/com/simibubi/create/content/fluids/transfer/GenericItemEmptying.java +++ b/src/main/java/com/simibubi/create/content/fluids/transfer/GenericItemEmptying.java @@ -6,7 +6,7 @@ import java.util.Optional; import com.simibubi.create.AllRecipeTypes; import com.simibubi.create.content.fluids.potion.PotionFluidHandler; -import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.data.Pair; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.level.Level; diff --git a/src/main/java/com/simibubi/create/content/kinetics/BlockStressDefaults.java b/src/main/java/com/simibubi/create/content/kinetics/BlockStressDefaults.java index c2e83cacf3..8acbf2156c 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/BlockStressDefaults.java +++ b/src/main/java/com/simibubi/create/content/kinetics/BlockStressDefaults.java @@ -7,7 +7,7 @@ import java.util.function.Supplier; import com.tterrag.registrate.builders.BlockBuilder; import com.tterrag.registrate.util.nullness.NonNullUnaryOperator; -import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.data.Couple; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.Block; diff --git a/src/main/java/com/simibubi/create/content/kinetics/BlockStressValues.java b/src/main/java/com/simibubi/create/content/kinetics/BlockStressValues.java index e53596b3eb..d0b6d24b61 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/BlockStressValues.java +++ b/src/main/java/com/simibubi/create/content/kinetics/BlockStressValues.java @@ -6,7 +6,7 @@ import java.util.Map; import javax.annotation.Nullable; import net.createmod.catnip.platform.CatnipServices; -import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.data.Couple; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.Block; diff --git a/src/main/java/com/simibubi/create/content/kinetics/KineticDebugger.java b/src/main/java/com/simibubi/create/content/kinetics/KineticDebugger.java index 5c5e042e43..42bc5c6625 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/KineticDebugger.java +++ b/src/main/java/com/simibubi/create/content/kinetics/KineticDebugger.java @@ -6,9 +6,9 @@ import com.simibubi.create.content.kinetics.base.KineticBlockEntityRenderer; import com.simibubi.create.infrastructure.config.AllConfigs; import net.createmod.catnip.render.SuperByteBufferCache; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.outliner.Outliner; -import net.createmod.catnip.utility.theme.Color; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.outliner.Outliner; +import net.createmod.catnip.theme.Color; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/simibubi/create/content/kinetics/RotationPropagator.java b/src/main/java/com/simibubi/create/content/kinetics/RotationPropagator.java index 366a138eaf..848b579748 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/RotationPropagator.java +++ b/src/main/java/com/simibubi/create/content/kinetics/RotationPropagator.java @@ -18,7 +18,7 @@ import com.simibubi.create.content.kinetics.speedController.SpeedControllerBlock import com.simibubi.create.content.kinetics.transmission.SplitShaftBlockEntity; import com.simibubi.create.infrastructure.config.AllConfigs; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/kinetics/TorquePropagator.java b/src/main/java/com/simibubi/create/content/kinetics/TorquePropagator.java index 6950a30d6b..bd4dbaf69b 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/TorquePropagator.java +++ b/src/main/java/com/simibubi/create/content/kinetics/TorquePropagator.java @@ -6,7 +6,7 @@ import java.util.Map; import com.simibubi.create.Create; import com.simibubi.create.content.kinetics.base.KineticBlockEntity; -import net.createmod.catnip.utility.WorldHelper; +import net.createmod.catnip.levelWrappers.WorldHelper; import net.minecraft.world.level.LevelAccessor; public class TorquePropagator { diff --git a/src/main/java/com/simibubi/create/content/kinetics/base/BlockBreakingKineticBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/base/BlockBreakingKineticBlockEntity.java index c080daec0e..b72e11e6f9 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/base/BlockBreakingKineticBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/base/BlockBreakingKineticBlockEntity.java @@ -4,7 +4,7 @@ import java.util.concurrent.atomic.AtomicInteger; import com.simibubi.create.foundation.utility.BlockHelper; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; diff --git a/src/main/java/com/simibubi/create/content/kinetics/base/DirectionalAxisKineticBlock.java b/src/main/java/com/simibubi/create/content/kinetics/base/DirectionalAxisKineticBlock.java index 2a6f020994..ad41239c71 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/base/DirectionalAxisKineticBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/base/DirectionalAxisKineticBlock.java @@ -3,7 +3,7 @@ package com.simibubi.create.content.kinetics.base; import com.simibubi.create.api.contraption.transformable.ITransformableBlock; import com.simibubi.create.content.contraptions.StructureTransform; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/kinetics/base/DirectionalKineticBlock.java b/src/main/java/com/simibubi/create/content/kinetics/base/DirectionalKineticBlock.java index 5e650d74c0..6ff6962bf4 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/base/DirectionalKineticBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/base/DirectionalKineticBlock.java @@ -1,6 +1,6 @@ package com.simibubi.create.content.kinetics.base; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.core.Direction; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.block.Block; diff --git a/src/main/java/com/simibubi/create/content/kinetics/base/HorizontalAxisKineticBlock.java b/src/main/java/com/simibubi/create/content/kinetics/base/HorizontalAxisKineticBlock.java index 63b245e63f..827615518f 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/base/HorizontalAxisKineticBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/base/HorizontalAxisKineticBlock.java @@ -1,6 +1,6 @@ package com.simibubi.create.content.kinetics.base; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/kinetics/base/HorizontalKineticBlock.java b/src/main/java/com/simibubi/create/content/kinetics/base/HorizontalKineticBlock.java index 7f6e5b9300..cfbc1bd4df 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/base/HorizontalKineticBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/base/HorizontalKineticBlock.java @@ -1,6 +1,6 @@ package com.simibubi.create.content.kinetics.base; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.core.Direction; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.block.Block; diff --git a/src/main/java/com/simibubi/create/content/kinetics/base/IRotate.java b/src/main/java/com/simibubi/create/content/kinetics/base/IRotate.java index e43981e609..1275ec7f35 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/base/IRotate.java +++ b/src/main/java/com/simibubi/create/content/kinetics/base/IRotate.java @@ -5,8 +5,8 @@ import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.infrastructure.config.AllConfigs; -import net.createmod.catnip.utility.lang.Lang; -import net.createmod.catnip.utility.lang.LangBuilder; +import net.createmod.catnip.lang.Lang; +import net.createmod.catnip.lang.LangBuilder; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/kinetics/base/KineticBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/base/KineticBlockEntity.java index f164a1b6a6..29cfcc3df5 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/base/KineticBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/base/KineticBlockEntity.java @@ -27,7 +27,7 @@ import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.infrastructure.config.AllConfigs; import dev.engine_room.flywheel.lib.visualization.VisualizationHelper; -import net.createmod.catnip.utility.FontHelper.Palette; +import net.createmod.catnip.lang.FontHelper.Palette; import net.minecraft.ChatFormatting; import net.minecraft.client.resources.language.I18n; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/simibubi/create/content/kinetics/base/KineticBlockEntityRenderer.java b/src/main/java/com/simibubi/create/content/kinetics/base/KineticBlockEntityRenderer.java index a6eb85f684..ec924455ce 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/base/KineticBlockEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/kinetics/base/KineticBlockEntityRenderer.java @@ -1,5 +1,6 @@ package com.simibubi.create.content.kinetics.base; +import net.createmod.catnip.animation.AnimationTickHolder; import org.apache.commons.lang3.ArrayUtils; import com.mojang.blaze3d.vertex.PoseStack; @@ -12,8 +13,7 @@ import dev.engine_room.flywheel.api.visualization.VisualizationManager; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.render.SuperByteBufferCache; -import net.createmod.catnip.utility.theme.Color; -import net.createmod.ponder.utility.LevelTickHolder; +import net.createmod.catnip.theme.Color; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; @@ -83,7 +83,7 @@ public class KineticBlockEntityRenderer extends Sa } public static float getAngleForBe(KineticBlockEntity be, final BlockPos pos, Axis axis) { - float time = LevelTickHolder.getRenderTime(be.getLevel()); + float time = AnimationTickHolder.getRenderTime(be.getLevel()); float offset = getRotationOffsetForPosition(be, pos, axis); float angle = ((time * be.getSpeed() * 3f / 10 + offset) % 360) / 180 * (float) Math.PI; return angle; diff --git a/src/main/java/com/simibubi/create/content/kinetics/base/KineticEffectHandler.java b/src/main/java/com/simibubi/create/content/kinetics/base/KineticEffectHandler.java index c6b36d24a0..ef97f7638d 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/base/KineticEffectHandler.java +++ b/src/main/java/com/simibubi/create/content/kinetics/base/KineticEffectHandler.java @@ -2,7 +2,7 @@ package com.simibubi.create.content.kinetics.base; import com.simibubi.create.content.kinetics.base.IRotate.SpeedLevel; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction.Axis; import net.minecraft.core.particles.ParticleOptions; diff --git a/src/main/java/com/simibubi/create/content/kinetics/base/RotatedPillarKineticBlock.java b/src/main/java/com/simibubi/create/content/kinetics/base/RotatedPillarKineticBlock.java index 68f0b5c34c..f56a793d85 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/base/RotatedPillarKineticBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/base/RotatedPillarKineticBlock.java @@ -1,6 +1,6 @@ package com.simibubi.create.content.kinetics.base; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; import net.minecraft.world.item.context.BlockPlaceContext; diff --git a/src/main/java/com/simibubi/create/content/kinetics/base/RotatingInstance.java b/src/main/java/com/simibubi/create/content/kinetics/base/RotatingInstance.java index 9569aac356..cdcbfb725e 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/base/RotatingInstance.java +++ b/src/main/java/com/simibubi/create/content/kinetics/base/RotatingInstance.java @@ -6,7 +6,7 @@ import org.joml.Vector3f; import dev.engine_room.flywheel.api.instance.InstanceHandle; import dev.engine_room.flywheel.api.instance.InstanceType; import dev.engine_room.flywheel.lib.instance.ColoredLitInstance; -import net.createmod.catnip.utility.theme.Color; +import net.createmod.catnip.theme.Color; import net.minecraft.core.Direction; import net.minecraft.core.Vec3i; diff --git a/src/main/java/com/simibubi/create/content/kinetics/base/RotationIndicatorParticle.java b/src/main/java/com/simibubi/create/content/kinetics/base/RotationIndicatorParticle.java index fb5b894d47..66eeaad9d6 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/base/RotationIndicatorParticle.java +++ b/src/main/java/com/simibubi/create/content/kinetics/base/RotationIndicatorParticle.java @@ -3,9 +3,9 @@ package com.simibubi.create.content.kinetics.base; import com.mojang.blaze3d.vertex.VertexConsumer; import com.simibubi.create.content.equipment.goggles.GogglesItem; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.theme.Color; -import net.createmod.ponder.utility.LevelTickHolder; +import net.createmod.catnip.animation.AnimationTickHolder; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.theme.Color; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; @@ -67,7 +67,7 @@ public class RotationIndicatorParticle extends SimpleAnimatedParticle { } public void move(double x, double y, double z) { - float time = LevelTickHolder.getTicks(level); + float time = AnimationTickHolder.getTicks(level); float angle = (float) ((time * speed) % 360) - (speed / 2 * age * (((float) age) / lifetime)); if (speed < 0 && axis.isVertical()) angle += 180; diff --git a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltBlock.java b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltBlock.java index 4145b42eba..2914a1f2bc 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltBlock.java @@ -36,8 +36,8 @@ import com.simibubi.create.foundation.block.render.MultiPosDestructionHandler; import com.simibubi.create.foundation.block.render.ReducedDestroyEffects; import com.simibubi.create.foundation.item.ItemHelper; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.math.VecHelper; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltBlockEntity.java index 0a8a95d17e..9d25aaacf8 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltBlockEntity.java @@ -28,7 +28,7 @@ import com.simibubi.create.content.logistics.tunnel.BrassTunnelBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import com.simibubi.create.foundation.blockEntity.behaviour.inventory.VersionedInventoryTrackerBehaviour; -import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.nbt.NBTHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltHelper.java b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltHelper.java index 6974354ed1..40edc1c8f0 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltHelper.java +++ b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltHelper.java @@ -5,7 +5,7 @@ import java.util.Map; import com.simibubi.create.AllTags.AllItemTags; import it.unimi.dsi.fastutil.objects.Object2BooleanOpenHashMap; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Vec3i; import net.minecraft.server.packs.resources.ResourceManagerReloadListener; diff --git a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltPart.java b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltPart.java index d0228742b2..370245ea12 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltPart.java +++ b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltPart.java @@ -1,6 +1,6 @@ package com.simibubi.create.content.kinetics.belt; -import net.createmod.catnip.utility.lang.Lang; +import net.createmod.catnip.lang.Lang; import net.minecraft.util.StringRepresentable; public enum BeltPart implements StringRepresentable { diff --git a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltRenderer.java b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltRenderer.java index d0bf158d92..68c10ce112 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltRenderer.java +++ b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltRenderer.java @@ -19,13 +19,13 @@ import com.simibubi.create.foundation.render.ShadowRenderHelper; import dev.engine_room.flywheel.api.visualization.VisualizationManager; import dev.engine_room.flywheel.lib.model.baked.PartialModel; import dev.engine_room.flywheel.lib.transform.TransformStack; +import net.createmod.catnip.animation.AnimationTickHolder; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SpriteShiftEntry; import net.createmod.catnip.render.SuperByteBuffer; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.levelWrappers.WrappedLevel; -import net.createmod.catnip.utility.math.AngleHelper; -import net.createmod.ponder.utility.LevelTickHolder; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.levelWrappers.WrappedLevel; +import net.createmod.catnip.math.AngleHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.MultiBufferSource; @@ -79,7 +79,7 @@ public class BeltRenderer extends SafeBlockEntityRenderer { PoseStack localTransforms = new PoseStack(); var msr = TransformStack.of(localTransforms); VertexConsumer vb = buffer.getBuffer(RenderType.solid()); - float renderTick = LevelTickHolder.getRenderTime(be.getLevel()); + float renderTick = AnimationTickHolder.getRenderTime(be.getLevel()); msr.center() .rotateYDegrees(AngleHelper.horizontalAngle(facing) + (upward ? 180 : 0) + (sideways ? 270 : 0)) diff --git a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltShapes.java b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltShapes.java index 634bef5d80..44b1201c8d 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltShapes.java +++ b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltShapes.java @@ -7,7 +7,7 @@ import java.util.Map; import com.simibubi.create.AllShapes; -import net.createmod.catnip.utility.VoxelShaper; +import net.createmod.catnip.math.VoxelShaper; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; import net.minecraft.world.level.block.state.BlockState; diff --git a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltSlicer.java b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltSlicer.java index 05c2d92e5c..29177009b3 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltSlicer.java +++ b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltSlicer.java @@ -15,9 +15,9 @@ import com.simibubi.create.content.kinetics.belt.transport.TransportedItemStack; import com.simibubi.create.foundation.block.ProperWaterloggedBlock; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.lang.Components; -import net.createmod.catnip.utility.outliner.Outliner; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.lang.Components; +import net.createmod.catnip.outliner.Outliner; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; diff --git a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltSlope.java b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltSlope.java index 5f60199ca4..bd45112741 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltSlope.java +++ b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltSlope.java @@ -1,6 +1,6 @@ package com.simibubi.create.content.kinetics.belt; -import net.createmod.catnip.utility.lang.Lang; +import net.createmod.catnip.lang.Lang; import net.minecraft.util.StringRepresentable; public enum BeltSlope implements StringRepresentable { diff --git a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltVisual.java b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltVisual.java index 75f8035df8..8acd974f25 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltVisual.java @@ -19,7 +19,7 @@ import dev.engine_room.flywheel.lib.model.Models; import dev.engine_room.flywheel.lib.model.baked.PartialModel; import dev.engine_room.flywheel.lib.transform.TransformStack; import net.createmod.catnip.render.SpriteShiftEntry; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.core.Direction; import net.minecraft.util.Mth; import net.minecraft.world.item.DyeColor; diff --git a/src/main/java/com/simibubi/create/content/kinetics/belt/behaviour/TransportedItemStackHandlerBehaviour.java b/src/main/java/com/simibubi/create/content/kinetics/belt/behaviour/TransportedItemStackHandlerBehaviour.java index 78623613f1..b637f13b60 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/belt/behaviour/TransportedItemStackHandlerBehaviour.java +++ b/src/main/java/com/simibubi/create/content/kinetics/belt/behaviour/TransportedItemStackHandlerBehaviour.java @@ -11,7 +11,7 @@ import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BehaviourType; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.world.item.ItemStack; import net.minecraft.world.phys.Vec3; diff --git a/src/main/java/com/simibubi/create/content/kinetics/belt/item/BeltConnectorItem.java b/src/main/java/com/simibubi/create/content/kinetics/belt/item/BeltConnectorItem.java index 29b72d75c9..130a59a5fe 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/belt/item/BeltConnectorItem.java +++ b/src/main/java/com/simibubi/create/content/kinetics/belt/item/BeltConnectorItem.java @@ -16,7 +16,7 @@ import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.block.ProperWaterloggedBlock; import com.simibubi.create.infrastructure.config.AllConfigs; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/kinetics/belt/transport/BeltTunnelInteractionHandler.java b/src/main/java/com/simibubi/create/content/kinetics/belt/transport/BeltTunnelInteractionHandler.java index 975c749443..ce5a8b5db0 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/belt/transport/BeltTunnelInteractionHandler.java +++ b/src/main/java/com/simibubi/create/content/kinetics/belt/transport/BeltTunnelInteractionHandler.java @@ -14,7 +14,7 @@ import com.simibubi.create.content.redstone.displayLink.DisplayLinkBlock; import com.simibubi.create.content.redstone.displayLink.source.AccumulatedItemCountDisplaySource; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.item.ItemStack; diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java index 2fe5a08376..6de9d8a23a 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorBlockEntity.java @@ -27,10 +27,10 @@ import com.simibubi.create.foundation.utility.ServerSpeedProvider; import com.simibubi.create.infrastructure.config.AllConfigs; import dev.engine_room.flywheel.api.visualization.VisualizationManager; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.NBTHelper; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.nbt.NBTHelper; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.math.AngleHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction.Axis; import net.minecraft.core.particles.BlockParticleOption; @@ -705,7 +705,7 @@ public class ChainConveyorBlockEntity extends KineticBlockEntity implements ITra connectionStats = null; updateBoxWorldPositions(); updateChainShapes(); - + if (connections.size() != sizeBefore && level != null && level.isClientSide) invalidateRenderBoundingBox(); } diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorConnectionHandler.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorConnectionHandler.java index b9cca4539f..a4eb6ee2f2 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorConnectionHandler.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorConnectionHandler.java @@ -7,9 +7,9 @@ import com.simibubi.create.content.equipment.blueprint.BlueprintOverlayRenderer; import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.infrastructure.config.AllConfigs; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.outliner.Outliner; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.outliner.Outliner; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorInteractionHandler.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorInteractionHandler.java index 7cf03d896d..8431c3cff1 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorInteractionHandler.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorInteractionHandler.java @@ -15,9 +15,9 @@ import com.simibubi.create.content.logistics.packagePort.PackagePortTargetSelect import com.simibubi.create.foundation.utility.RaycastHelper; import com.simibubi.create.foundation.utility.TickBasedCache; -import net.createmod.catnip.utility.WorldAttached; -import net.createmod.catnip.utility.outliner.Outliner; -import net.createmod.catnip.utility.theme.Color; +import net.createmod.catnip.data.WorldAttached; +import net.createmod.catnip.outliner.Outliner; +import net.createmod.catnip.theme.Color; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorPackage.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorPackage.java index 6ba67be9ad..040b2b52f2 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorPackage.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorPackage.java @@ -7,8 +7,8 @@ import java.util.concurrent.atomic.AtomicInteger; import com.google.common.cache.Cache; import com.simibubi.create.foundation.utility.TickBasedCache; -import net.createmod.catnip.utility.AnimationTickHolder; -import net.createmod.catnip.utility.WorldAttached; +import net.createmod.catnip.animation.AnimationTickHolder; +import net.createmod.catnip.data.WorldAttached; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; @@ -24,20 +24,20 @@ public class ChainConveyorPackage { private static final int ticksUntilExpired = 30; public static final WorldAttached> physicsDataCache = new WorldAttached<>($ -> new TickBasedCache<>(ticksUntilExpired, true)); - + public class ChainConveyorPackagePhysicsData { public Vec3 targetPos; public Vec3 prevTargetPos; public Vec3 prevPos; public Vec3 pos; - + public Vec3 motion; public int lastTick; public float yaw; public float prevYaw; public boolean flipped; public ResourceLocation modelKey; - + public WeakReference beReference; public ChainConveyorPackagePhysicsData(Vec3 serverPosition) { @@ -45,7 +45,7 @@ public class ChainConveyorPackage { this.prevTargetPos = null; this.pos = null; this.prevPos = null; - + this.motion = Vec3.ZERO; this.lastTick = AnimationTickHolder.getTicks(); } @@ -56,12 +56,12 @@ public class ChainConveyorPackage { lastTick = AnimationTickHolder.getTicks(); return true; } - + public void setBE(ChainConveyorBlockEntity ccbe) { if (beReference == null || beReference.get() != ccbe) beReference = new WeakReference(ccbe); } - + } public float chainPosition; diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRenderer.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRenderer.java index eee6d6f037..e6cb998284 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRenderer.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRenderer.java @@ -3,6 +3,7 @@ package com.simibubi.create.content.kinetics.chainConveyor; import java.util.List; import java.util.Map.Entry; +import net.createmod.catnip.animation.AnimationTickHolder; import org.joml.Matrix3f; import org.joml.Matrix4f; @@ -19,9 +20,8 @@ import dev.engine_room.flywheel.api.visualization.VisualizationManager; import dev.engine_room.flywheel.lib.transform.TransformStack; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.math.AngleHelper; -import net.createmod.ponder.utility.LevelTickHolder; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.math.AngleHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.MultiBufferSource; @@ -129,7 +129,7 @@ public class ChainConveyorRenderer extends KineticBlockEntityRenderer 0) speed = Mth.clamp(speed, 80, 64 * 20); diff --git a/src/main/java/com/simibubi/create/content/kinetics/fan/NozzleBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/fan/NozzleBlockEntity.java index 1c8f2741d9..ff51c7679c 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/fan/NozzleBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/fan/NozzleBlockEntity.java @@ -8,7 +8,7 @@ import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import com.simibubi.create.infrastructure.config.AllConfigs; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/kinetics/fan/processing/AllFanProcessingTypes.java b/src/main/java/com/simibubi/create/content/kinetics/fan/processing/AllFanProcessingTypes.java index 014e6f2e35..17e2e004f5 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/fan/processing/AllFanProcessingTypes.java +++ b/src/main/java/com/simibubi/create/content/kinetics/fan/processing/AllFanProcessingTypes.java @@ -4,13 +4,9 @@ import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Optional; -import java.util.function.Function; import java.util.function.Supplier; import com.simibubi.create.AllRegistries; -import com.simibubi.create.content.kinetics.mechanicalArm.ArmInteractionPointType; - -import net.minecraft.resources.ResourceLocation; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.registries.DeferredRegister; @@ -30,8 +26,8 @@ import com.simibubi.create.foundation.damageTypes.CreateDamageSources; import com.simibubi.create.foundation.recipe.RecipeApplier; import it.unimi.dsi.fastutil.objects.Object2ReferenceOpenHashMap; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.theme.Color; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.theme.Color; import net.minecraft.core.BlockPos; import net.minecraft.core.RegistryAccess; import net.minecraft.core.particles.BlockParticleOption; diff --git a/src/main/java/com/simibubi/create/content/kinetics/flywheel/FlywheelBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/flywheel/FlywheelBlockEntity.java index 20ead39149..85e17589ee 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/flywheel/FlywheelBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/flywheel/FlywheelBlockEntity.java @@ -2,8 +2,8 @@ package com.simibubi.create.content.kinetics.flywheel; import com.simibubi.create.content.kinetics.base.KineticBlockEntity; -import net.createmod.catnip.utility.animation.LerpedFloat; -import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.animation.LerpedFloat; +import net.createmod.catnip.animation.LerpedFloat.Chaser; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.block.entity.BlockEntityType; diff --git a/src/main/java/com/simibubi/create/content/kinetics/flywheel/FlywheelRenderer.java b/src/main/java/com/simibubi/create/content/kinetics/flywheel/FlywheelRenderer.java index ef58578cc1..ba9bfbf2f8 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/flywheel/FlywheelRenderer.java +++ b/src/main/java/com/simibubi/create/content/kinetics/flywheel/FlywheelRenderer.java @@ -7,7 +7,7 @@ import com.simibubi.create.content.kinetics.base.KineticBlockEntityRenderer; import dev.engine_room.flywheel.api.visualization.VisualizationManager; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; -import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.math.AngleHelper; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; diff --git a/src/main/java/com/simibubi/create/content/kinetics/flywheel/FlywheelVisual.java b/src/main/java/com/simibubi/create/content/kinetics/flywheel/FlywheelVisual.java index 80cefd7847..4342fd499c 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/flywheel/FlywheelVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/flywheel/FlywheelVisual.java @@ -14,7 +14,7 @@ import dev.engine_room.flywheel.lib.instance.InstanceTypes; import dev.engine_room.flywheel.lib.instance.TransformedInstance; import dev.engine_room.flywheel.lib.transform.TransformStack; import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; -import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.math.AngleHelper; import net.createmod.ponder.render.VirtualRenderHelper; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/kinetics/gantry/GantryShaftBlock.java b/src/main/java/com/simibubi/create/content/kinetics/gantry/GantryShaftBlock.java index 1f7f6216f5..6e95ef045e 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/gantry/GantryShaftBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/gantry/GantryShaftBlock.java @@ -12,11 +12,11 @@ import com.simibubi.create.content.kinetics.base.KineticBlockEntity; import com.simibubi.create.foundation.block.IBE; import com.simibubi.create.foundation.placement.PoleHelper; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.lang.Lang; -import net.createmod.catnip.utility.placement.IPlacementHelper; -import net.createmod.catnip.utility.placement.PlacementHelpers; -import net.createmod.catnip.utility.placement.PlacementOffset; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.lang.Lang; +import net.createmod.catnip.placement.IPlacementHelper; +import net.createmod.catnip.placement.PlacementHelpers; +import net.createmod.catnip.placement.PlacementOffset; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/kinetics/gantry/GantryShaftBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/gantry/GantryShaftBlockEntity.java index b4659fc3e2..25e7619336 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/gantry/GantryShaftBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/gantry/GantryShaftBlockEntity.java @@ -5,7 +5,7 @@ import com.simibubi.create.content.contraptions.gantry.GantryCarriageBlock; import com.simibubi.create.content.contraptions.gantry.GantryCarriageBlockEntity; import com.simibubi.create.content.kinetics.base.KineticBlockEntity; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.util.Mth; diff --git a/src/main/java/com/simibubi/create/content/kinetics/gauge/GaugeBlock.java b/src/main/java/com/simibubi/create/content/kinetics/gauge/GaugeBlock.java index 08c171a89e..292c310315 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/gauge/GaugeBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/gauge/GaugeBlock.java @@ -7,11 +7,11 @@ import com.simibubi.create.content.kinetics.base.DirectionalAxisKineticBlock; import com.simibubi.create.content.kinetics.base.IRotate; import com.simibubi.create.foundation.block.IBE; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.lang.Lang; -import net.createmod.catnip.utility.levelWrappers.WrappedLevel; -import net.createmod.catnip.utility.theme.Color; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.lang.Lang; +import net.createmod.catnip.levelWrappers.WrappedLevel; +import net.createmod.catnip.theme.Color; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/kinetics/gauge/GaugeRenderer.java b/src/main/java/com/simibubi/create/content/kinetics/gauge/GaugeRenderer.java index a936f565da..9d23c235af 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/gauge/GaugeRenderer.java +++ b/src/main/java/com/simibubi/create/content/kinetics/gauge/GaugeRenderer.java @@ -10,7 +10,7 @@ import dev.engine_room.flywheel.api.visualization.VisualizationManager; import dev.engine_room.flywheel.lib.model.baked.PartialModel; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; diff --git a/src/main/java/com/simibubi/create/content/kinetics/gauge/GaugeShaper.java b/src/main/java/com/simibubi/create/content/kinetics/gauge/GaugeShaper.java index fab8b9d149..6f9f59520c 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/gauge/GaugeShaper.java +++ b/src/main/java/com/simibubi/create/content/kinetics/gauge/GaugeShaper.java @@ -4,7 +4,7 @@ import java.util.Arrays; import com.simibubi.create.AllShapes; -import net.createmod.catnip.utility.VoxelShaper; +import net.createmod.catnip.math.VoxelShaper; import net.minecraft.core.Direction; import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.VoxelShape; diff --git a/src/main/java/com/simibubi/create/content/kinetics/gauge/GaugeVisual.java b/src/main/java/com/simibubi/create/content/kinetics/gauge/GaugeVisual.java index ecab9bb5db..ede4ceeb6d 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/gauge/GaugeVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/gauge/GaugeVisual.java @@ -17,9 +17,9 @@ import dev.engine_room.flywheel.lib.instance.TransformedInstance; import dev.engine_room.flywheel.lib.model.Models; import dev.engine_room.flywheel.lib.transform.TransformStack; import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; -import net.createmod.catnip.utility.AnimationTickHolder; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.animation.AnimationTickHolder; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.data.Iterate; import net.minecraft.core.Direction; import net.minecraft.util.Mth; diff --git a/src/main/java/com/simibubi/create/content/kinetics/gauge/SpeedGaugeBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/gauge/SpeedGaugeBlockEntity.java index 9541f12087..3b483818db 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/gauge/SpeedGaugeBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/gauge/SpeedGaugeBlockEntity.java @@ -12,7 +12,7 @@ import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.infrastructure.config.AllConfigs; -import net.createmod.catnip.utility.theme.Color; +import net.createmod.catnip.theme.Color; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/kinetics/gauge/StressGaugeBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/gauge/StressGaugeBlockEntity.java index a9687c3f05..881ba243e7 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/gauge/StressGaugeBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/gauge/StressGaugeBlockEntity.java @@ -14,8 +14,8 @@ import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.lang.LangBuilder; -import net.createmod.catnip.utility.theme.Color; +import net.createmod.catnip.lang.LangBuilder; +import net.createmod.catnip.theme.Color; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/kinetics/gearbox/GearboxRenderer.java b/src/main/java/com/simibubi/create/content/kinetics/gearbox/GearboxRenderer.java index 9909917d91..efb3917ddd 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/gearbox/GearboxRenderer.java +++ b/src/main/java/com/simibubi/create/content/kinetics/gearbox/GearboxRenderer.java @@ -5,10 +5,10 @@ import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.kinetics.base.KineticBlockEntityRenderer; import dev.engine_room.flywheel.api.visualization.VisualizationManager; +import net.createmod.catnip.animation.AnimationTickHolder; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; -import net.createmod.catnip.utility.Iterate; -import net.createmod.ponder.utility.LevelTickHolder; +import net.createmod.catnip.data.Iterate; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; @@ -30,7 +30,7 @@ public class GearboxRenderer extends KineticBlockEntityRenderer { boolean rave = be.phase == Phase.DANCING && be.getSpeed() != 0; if (rave) { - float renderTick = LevelTickHolder.getRenderTime(be.getLevel()) + (be.hashCode() % 64); + float renderTick = AnimationTickHolder.getRenderTime(be.getLevel()) + (be.hashCode() % 64); baseAngle = (renderTick * 10) % 360; lowerArmAngle = Mth.lerp((Mth.sin(renderTick / 4) + 1) / 2, -45, 15); upperArmAngle = Mth.lerp((Mth.sin(renderTick / 8) + 1) / 4, -45, 95); diff --git a/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmVisual.java b/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmVisual.java index 538b09776a..38b801f580 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmVisual.java @@ -19,9 +19,9 @@ import dev.engine_room.flywheel.lib.model.Models; import dev.engine_room.flywheel.lib.transform.TransformStack; import dev.engine_room.flywheel.lib.util.RecyclingPoseStack; import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.theme.Color; -import net.createmod.ponder.utility.LevelTickHolder; +import net.createmod.catnip.animation.AnimationTickHolder; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.theme.Color; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.entity.ItemRenderer; import net.minecraft.util.Mth; @@ -111,7 +111,7 @@ public class ArmVisual extends SingleRotatingVisual implements S } private void animateRave(float partialTick) { - var ticks = LevelTickHolder.getTicks(blockEntity.getLevel()); + var ticks = AnimationTickHolder.getTicks(blockEntity.getLevel()); float renderTick = ticks + partialTick + (blockEntity.hashCode() % 64); float baseAngle = (renderTick * 10) % 360; diff --git a/src/main/java/com/simibubi/create/content/kinetics/millstone/MillstoneBlock.java b/src/main/java/com/simibubi/create/content/kinetics/millstone/MillstoneBlock.java index 58adc5828e..4a1edbfbf6 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/millstone/MillstoneBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/millstone/MillstoneBlock.java @@ -6,7 +6,7 @@ import com.simibubi.create.content.kinetics.base.KineticBlock; import com.simibubi.create.content.kinetics.simpleRelays.ICogWheel; import com.simibubi.create.foundation.block.IBE; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/kinetics/millstone/MillstoneBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/millstone/MillstoneBlockEntity.java index 0996532d46..e56086073a 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/millstone/MillstoneBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/millstone/MillstoneBlockEntity.java @@ -12,7 +12,7 @@ import com.simibubi.create.foundation.item.ItemHelper; import com.simibubi.create.foundation.sound.SoundScapes; import com.simibubi.create.foundation.sound.SoundScapes.AmbienceGroup; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/kinetics/mixer/MechanicalMixerBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/mixer/MechanicalMixerBlockEntity.java index 42f1a1f96b..1b11dc3dfd 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/mixer/MechanicalMixerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/mixer/MechanicalMixerBlockEntity.java @@ -19,9 +19,9 @@ import com.simibubi.create.foundation.blockEntity.behaviour.fluid.SmartFluidTank import com.simibubi.create.foundation.item.SmartInventory; import com.simibubi.create.infrastructure.config.AllConfigs; -import net.createmod.catnip.utility.AnimationTickHolder; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.animation.AnimationTickHolder; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.math.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction.Axis; import net.minecraft.core.particles.ItemParticleOption; diff --git a/src/main/java/com/simibubi/create/content/kinetics/mixer/MechanicalMixerRenderer.java b/src/main/java/com/simibubi/create/content/kinetics/mixer/MechanicalMixerRenderer.java index 66dd0ac436..3234ab5554 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/mixer/MechanicalMixerRenderer.java +++ b/src/main/java/com/simibubi/create/content/kinetics/mixer/MechanicalMixerRenderer.java @@ -6,9 +6,9 @@ import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.kinetics.base.KineticBlockEntityRenderer; import dev.engine_room.flywheel.api.visualization.VisualizationManager; +import net.createmod.catnip.animation.AnimationTickHolder; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; -import net.createmod.ponder.utility.LevelTickHolder; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; @@ -41,7 +41,7 @@ public class MechanicalMixerRenderer extends KineticBlockEntityRenderer implements SimpleDynamicVisual { diff --git a/src/main/java/com/simibubi/create/content/kinetics/press/PressingBehaviour.java b/src/main/java/com/simibubi/create/content/kinetics/press/PressingBehaviour.java index c85e7b2b8d..487becd06b 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/press/PressingBehaviour.java +++ b/src/main/java/com/simibubi/create/content/kinetics/press/PressingBehaviour.java @@ -11,8 +11,8 @@ import com.simibubi.create.content.processing.basin.BasinBlock; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; -import net.createmod.catnip.utility.NBTHelper; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.nbt.NBTHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.particles.ItemParticleOption; import net.minecraft.core.particles.ParticleTypes; diff --git a/src/main/java/com/simibubi/create/content/kinetics/saw/SawBlock.java b/src/main/java/com/simibubi/create/content/kinetics/saw/SawBlock.java index ce36cf02b7..24bd53bcd4 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/saw/SawBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/saw/SawBlock.java @@ -13,9 +13,9 @@ import com.simibubi.create.content.kinetics.drill.DrillBlock; import com.simibubi.create.foundation.block.IBE; import com.simibubi.create.foundation.damageTypes.CreateDamageSources; -import net.createmod.catnip.utility.placement.IPlacementHelper; -import net.createmod.catnip.utility.placement.PlacementHelpers; -import net.createmod.catnip.utility.placement.PlacementOffset; +import net.createmod.catnip.placement.IPlacementHelper; +import net.createmod.catnip.placement.PlacementHelpers; +import net.createmod.catnip.placement.PlacementOffset; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/kinetics/saw/SawBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/saw/SawBlockEntity.java index d7ea5f3d6e..5d79c4c666 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/saw/SawBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/saw/SawBlockEntity.java @@ -29,7 +29,7 @@ import com.simibubi.create.foundation.utility.AbstractBlockBreakQueue; import com.simibubi.create.foundation.utility.TreeCutter; import com.simibubi.create.infrastructure.config.AllConfigs; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -329,7 +329,7 @@ public class SawBlockEntity extends BlockBreakingKineticBlockEntity { private void applyRecipe() { ItemStack input = inventory.getStackInSlot(0); List list = new ArrayList<>(); - + if (PackageItem.isPackage(input)) { inventory.clear(); ItemStackHandler results = PackageItem.getContents(input); @@ -342,7 +342,7 @@ public class SawBlockEntity extends BlockBreakingKineticBlockEntity { inventory.setStackInSlot(slot + 1, list.get(slot)); return; } - + List> recipes = getRecipes(); if (recipes.isEmpty()) return; diff --git a/src/main/java/com/simibubi/create/content/kinetics/saw/SawFilterSlot.java b/src/main/java/com/simibubi/create/content/kinetics/saw/SawFilterSlot.java index a16eeab8bf..8afeb3f0ff 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/saw/SawFilterSlot.java +++ b/src/main/java/com/simibubi/create/content/kinetics/saw/SawFilterSlot.java @@ -4,7 +4,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform; import dev.engine_room.flywheel.lib.transform.TransformStack; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.LevelAccessor; diff --git a/src/main/java/com/simibubi/create/content/kinetics/saw/SawMovementBehaviour.java b/src/main/java/com/simibubi/create/content/kinetics/saw/SawMovementBehaviour.java index 0716f32f83..ee6c7029b8 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/saw/SawMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/kinetics/saw/SawMovementBehaviour.java @@ -14,7 +14,7 @@ import com.simibubi.create.foundation.utility.TreeCutter; import com.simibubi.create.foundation.virtualWorld.VirtualRenderWorld; import dev.engine_room.flywheel.api.visualization.VisualizationContext; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/kinetics/saw/SawRenderer.java b/src/main/java/com/simibubi/create/content/kinetics/saw/SawRenderer.java index 304819df94..72f50b0ff8 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/saw/SawRenderer.java +++ b/src/main/java/com/simibubi/create/content/kinetics/saw/SawRenderer.java @@ -19,8 +19,8 @@ import dev.engine_room.flywheel.lib.model.baked.PartialModel; import dev.engine_room.flywheel.lib.transform.TransformStack; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.math.AngleHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.MultiBufferSource; diff --git a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/BracketedKineticBlockEntityRenderer.java b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/BracketedKineticBlockEntityRenderer.java index 2f035ded91..9b1cd661e2 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/BracketedKineticBlockEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/BracketedKineticBlockEntityRenderer.java @@ -8,9 +8,9 @@ import com.simibubi.create.content.kinetics.base.KineticBlockEntityRenderer; import com.simibubi.create.content.kinetics.base.KineticBlockEntityVisual; import dev.engine_room.flywheel.api.visualization.VisualizationManager; +import net.createmod.catnip.animation.AnimationTickHolder; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; -import net.createmod.ponder.utility.LevelTickHolder; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider.Context; @@ -58,7 +58,7 @@ public class BracketedKineticBlockEntityRenderer extends KineticBlockEntityRende public static float getAngleForLargeCogShaft(SimpleKineticBlockEntity be, Axis axis) { BlockPos pos = be.getBlockPos(); float offset = getShaftAngleOffset(axis, pos); - float time = LevelTickHolder.getRenderTime(be.getLevel()); + float time = AnimationTickHolder.getRenderTime(be.getLevel()); float angle = ((time * be.getSpeed() * 3f / 10 + offset) % 360) / 180 * (float) Math.PI; return angle; } diff --git a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/CogWheelBlock.java b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/CogWheelBlock.java index 4e83dfa2b7..0f9e5eaf22 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/CogWheelBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/CogWheelBlock.java @@ -9,7 +9,7 @@ import com.simibubi.create.content.kinetics.base.IRotate; import com.simibubi.create.content.kinetics.speedController.SpeedControllerBlock; import com.simibubi.create.foundation.advancement.AllAdvancements; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/CogwheelBlockItem.java b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/CogwheelBlockItem.java index ecc4833058..acf45bc4a6 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/CogwheelBlockItem.java +++ b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/CogwheelBlockItem.java @@ -11,10 +11,10 @@ import com.simibubi.create.content.kinetics.base.HorizontalKineticBlock; import com.simibubi.create.content.kinetics.base.IRotate; import com.simibubi.create.content.kinetics.base.RotatedPillarKineticBlock; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.placement.IPlacementHelper; -import net.createmod.catnip.utility.placement.PlacementHelpers; -import net.createmod.catnip.utility.placement.PlacementOffset; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.placement.IPlacementHelper; +import net.createmod.catnip.placement.PlacementHelpers; +import net.createmod.catnip.placement.PlacementOffset; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/ShaftBlock.java b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/ShaftBlock.java index e234990f89..0c9a5f7e82 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/ShaftBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/ShaftBlock.java @@ -11,9 +11,9 @@ import com.simibubi.create.content.kinetics.base.KineticBlockEntity; import com.simibubi.create.content.kinetics.steamEngine.PoweredShaftBlock; import com.simibubi.create.foundation.placement.PoleHelper; -import net.createmod.catnip.utility.placement.IPlacementHelper; -import net.createmod.catnip.utility.placement.PlacementHelpers; -import net.createmod.catnip.utility.placement.PlacementOffset; +import net.createmod.catnip.placement.IPlacementHelper; +import net.createmod.catnip.placement.PlacementHelpers; +import net.createmod.catnip.placement.PlacementOffset; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogCTBehaviour.java b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogCTBehaviour.java index cfd78d7af0..057f3a9276 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogCTBehaviour.java +++ b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogCTBehaviour.java @@ -9,7 +9,7 @@ import com.simibubi.create.content.kinetics.base.IRotate; import com.simibubi.create.content.kinetics.simpleRelays.ICogWheel; import com.simibubi.create.foundation.block.connected.CTSpriteShiftEntry; -import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.data.Couple; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogRenderer.java b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogRenderer.java index 863e134b5c..8a0461aac1 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogRenderer.java +++ b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogRenderer.java @@ -10,7 +10,7 @@ import com.simibubi.create.content.kinetics.simpleRelays.SimpleKineticBlockEntit import dev.engine_room.flywheel.api.visualization.VisualizationManager; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; diff --git a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogVisual.java b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogVisual.java index 95b81dfee7..c52605f745 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogVisual.java @@ -20,7 +20,7 @@ import dev.engine_room.flywheel.api.visualization.VisualizationContext; import dev.engine_room.flywheel.lib.model.Models; import dev.engine_room.flywheel.lib.model.baked.PartialModel; import dev.engine_room.flywheel.lib.transform.TransformStack; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.core.Direction; import net.minecraft.core.Direction.AxisDirection; import net.minecraft.world.level.block.Block; diff --git a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogwheelBlock.java b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogwheelBlock.java index 6275f53cef..444ad42130 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogwheelBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogwheelBlock.java @@ -18,8 +18,8 @@ import com.simibubi.create.api.schematic.requirement.ISpecialBlockItemRequiremen import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.foundation.block.IBE; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.VoxelShaper; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.math.VoxelShaper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/kinetics/speedController/SpeedControllerBlock.java b/src/main/java/com/simibubi/create/content/kinetics/speedController/SpeedControllerBlock.java index d5a8bff432..db75cdc052 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/speedController/SpeedControllerBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/speedController/SpeedControllerBlock.java @@ -12,9 +12,9 @@ import com.simibubi.create.content.kinetics.simpleRelays.CogWheelBlock; import com.simibubi.create.content.kinetics.simpleRelays.ICogWheel; import com.simibubi.create.foundation.block.IBE; -import net.createmod.catnip.utility.placement.IPlacementHelper; -import net.createmod.catnip.utility.placement.PlacementHelpers; -import net.createmod.catnip.utility.placement.PlacementOffset; +import net.createmod.catnip.placement.IPlacementHelper; +import net.createmod.catnip.placement.PlacementHelpers; +import net.createmod.catnip.placement.PlacementOffset; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/kinetics/speedController/SpeedControllerBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/speedController/SpeedControllerBlockEntity.java index 1f26390f52..dcb869b5ba 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/speedController/SpeedControllerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/speedController/SpeedControllerBlockEntity.java @@ -19,7 +19,7 @@ import com.simibubi.create.foundation.blockEntity.behaviour.scrollValue.ScrollVa import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.infrastructure.config.AllConfigs; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.block.entity.BlockEntityType; diff --git a/src/main/java/com/simibubi/create/content/kinetics/steamEngine/PoweredShaftBlock.java b/src/main/java/com/simibubi/create/content/kinetics/steamEngine/PoweredShaftBlock.java index 343ae3afde..34b74eb56d 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/steamEngine/PoweredShaftBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/steamEngine/PoweredShaftBlock.java @@ -7,9 +7,9 @@ import com.simibubi.create.content.kinetics.base.KineticBlockEntity; import com.simibubi.create.content.kinetics.simpleRelays.AbstractShaftBlock; import com.simibubi.create.content.kinetics.simpleRelays.ShaftBlock; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.placement.IPlacementHelper; -import net.createmod.catnip.utility.placement.PlacementHelpers; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.placement.IPlacementHelper; +import net.createmod.catnip.placement.PlacementHelpers; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; diff --git a/src/main/java/com/simibubi/create/content/kinetics/steamEngine/SteamEngineBlock.java b/src/main/java/com/simibubi/create/content/kinetics/steamEngine/SteamEngineBlock.java index 8735c74fe8..aa5684e93a 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/steamEngine/SteamEngineBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/steamEngine/SteamEngineBlock.java @@ -14,10 +14,10 @@ import com.simibubi.create.foundation.advancement.AdvancementBehaviour; import com.simibubi.create.foundation.block.IBE; import com.simibubi.create.foundation.utility.BlockHelper; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.placement.IPlacementHelper; -import net.createmod.catnip.utility.placement.PlacementHelpers; -import net.createmod.catnip.utility.placement.PlacementOffset; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.placement.IPlacementHelper; +import net.createmod.catnip.placement.PlacementHelpers; +import net.createmod.catnip.placement.PlacementOffset; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/kinetics/steamEngine/SteamEngineBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/steamEngine/SteamEngineBlockEntity.java index af1828d722..9023a95674 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/steamEngine/SteamEngineBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/steamEngine/SteamEngineBlockEntity.java @@ -18,8 +18,8 @@ import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour import com.simibubi.create.foundation.blockEntity.behaviour.scrollValue.ScrollOptionBehaviour; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.math.AngleHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/kinetics/steamEngine/SteamEngineRenderer.java b/src/main/java/com/simibubi/create/content/kinetics/steamEngine/SteamEngineRenderer.java index cd246e8aac..201b5f21c3 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/steamEngine/SteamEngineRenderer.java +++ b/src/main/java/com/simibubi/create/content/kinetics/steamEngine/SteamEngineRenderer.java @@ -10,7 +10,7 @@ import dev.engine_room.flywheel.api.visualization.VisualizationManager; import dev.engine_room.flywheel.lib.model.baked.PartialModel; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; -import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.math.AngleHelper; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; diff --git a/src/main/java/com/simibubi/create/content/kinetics/steamEngine/SteamEngineValueBox.java b/src/main/java/com/simibubi/create/content/kinetics/steamEngine/SteamEngineValueBox.java index 40f5fd7e2d..8d6e6f8082 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/steamEngine/SteamEngineValueBox.java +++ b/src/main/java/com/simibubi/create/content/kinetics/steamEngine/SteamEngineValueBox.java @@ -4,9 +4,9 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform; import dev.engine_room.flywheel.lib.transform.TransformStack; -import net.createmod.catnip.utility.Pointing; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.math.Pointing; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.math.AngleHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/kinetics/steamEngine/SteamEngineVisual.java b/src/main/java/com/simibubi/create/content/kinetics/steamEngine/SteamEngineVisual.java index 4e17c05061..8b144a9ec0 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/steamEngine/SteamEngineVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/steamEngine/SteamEngineVisual.java @@ -16,7 +16,7 @@ import dev.engine_room.flywheel.lib.instance.TransformedInstance; import dev.engine_room.flywheel.lib.model.Models; import dev.engine_room.flywheel.lib.visual.AbstractBlockEntityVisual; import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; -import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.math.AngleHelper; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; import net.minecraft.util.Mth; diff --git a/src/main/java/com/simibubi/create/content/kinetics/transmission/SplitShaftRenderer.java b/src/main/java/com/simibubi/create/content/kinetics/transmission/SplitShaftRenderer.java index adaf1e3d99..ede2893f16 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/transmission/SplitShaftRenderer.java +++ b/src/main/java/com/simibubi/create/content/kinetics/transmission/SplitShaftRenderer.java @@ -6,10 +6,10 @@ import com.simibubi.create.content.kinetics.base.IRotate; import com.simibubi.create.content.kinetics.base.KineticBlockEntityRenderer; import dev.engine_room.flywheel.api.visualization.VisualizationManager; +import net.createmod.catnip.animation.AnimationTickHolder; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; -import net.createmod.catnip.utility.Iterate; -import net.createmod.ponder.utility.LevelTickHolder; +import net.createmod.catnip.data.Iterate; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; @@ -32,7 +32,7 @@ public class SplitShaftRenderer extends KineticBlockEntityRenderer getSpeedRange() { return Couple.create(4, 4); } - + @Override public boolean isFlammable(BlockState state, BlockGetter level, BlockPos pos, Direction direction) { return false; diff --git a/src/main/java/com/simibubi/create/content/kinetics/waterwheel/LargeWaterWheelBlockItem.java b/src/main/java/com/simibubi/create/content/kinetics/waterwheel/LargeWaterWheelBlockItem.java index 67cd8f3f78..0e51e2ed0e 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/waterwheel/LargeWaterWheelBlockItem.java +++ b/src/main/java/com/simibubi/create/content/kinetics/waterwheel/LargeWaterWheelBlockItem.java @@ -2,8 +2,8 @@ package com.simibubi.create.content.kinetics.waterwheel; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.Pair; -import net.createmod.catnip.utility.outliner.Outliner; +import net.createmod.catnip.data.Pair; +import net.createmod.catnip.outliner.Outliner; import net.minecraft.client.player.LocalPlayer; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/kinetics/waterwheel/WaterWheelBlock.java b/src/main/java/com/simibubi/create/content/kinetics/waterwheel/WaterWheelBlock.java index 73b4965e47..e52c6113de 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/waterwheel/WaterWheelBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/waterwheel/WaterWheelBlock.java @@ -5,9 +5,9 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.content.kinetics.base.DirectionalKineticBlock; import com.simibubi.create.foundation.block.IBE; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.levelWrappers.WrappedLevel; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.levelWrappers.WrappedLevel; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -130,7 +130,7 @@ public class WaterWheelBlock extends DirectionalKineticBlock implements IBE getSpeedRange() { return Couple.create(8, 8); } - + @Override public boolean isFlammable(BlockState state, BlockGetter level, BlockPos pos, Direction direction) { return false; diff --git a/src/main/java/com/simibubi/create/content/kinetics/waterwheel/WaterWheelBlockEntity.java b/src/main/java/com/simibubi/create/content/kinetics/waterwheel/WaterWheelBlockEntity.java index ad7418c4d0..36a60adeda 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/waterwheel/WaterWheelBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/kinetics/waterwheel/WaterWheelBlockEntity.java @@ -12,8 +12,8 @@ import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import com.simibubi.create.foundation.fluid.FluidHelper; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.math.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/legacy/ChromaticCompoundColor.java b/src/main/java/com/simibubi/create/content/legacy/ChromaticCompoundColor.java index ef5e35d5ca..47e0a05bcc 100644 --- a/src/main/java/com/simibubi/create/content/legacy/ChromaticCompoundColor.java +++ b/src/main/java/com/simibubi/create/content/legacy/ChromaticCompoundColor.java @@ -1,7 +1,7 @@ package com.simibubi.create.content.legacy; -import net.createmod.catnip.utility.AnimationTickHolder; -import net.createmod.catnip.utility.theme.Color; +import net.createmod.catnip.animation.AnimationTickHolder; +import net.createmod.catnip.theme.Color; import net.minecraft.client.Minecraft; import net.minecraft.client.color.item.ItemColor; import net.minecraft.util.Mth; diff --git a/src/main/java/com/simibubi/create/content/legacy/ChromaticCompoundItem.java b/src/main/java/com/simibubi/create/content/legacy/ChromaticCompoundItem.java index 45693c4c76..6a1f5f49dd 100644 --- a/src/main/java/com/simibubi/create/content/legacy/ChromaticCompoundItem.java +++ b/src/main/java/com/simibubi/create/content/legacy/ChromaticCompoundItem.java @@ -10,8 +10,8 @@ import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour import com.simibubi.create.infrastructure.config.AllConfigs; import com.simibubi.create.infrastructure.config.CRecipes; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.theme.Color; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.theme.Color; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.particles.ParticleTypes; diff --git a/src/main/java/com/simibubi/create/content/legacy/NoGravMagicalDohickyItem.java b/src/main/java/com/simibubi/create/content/legacy/NoGravMagicalDohickyItem.java index 264bf519b5..82c65b9c75 100644 --- a/src/main/java/com/simibubi/create/content/legacy/NoGravMagicalDohickyItem.java +++ b/src/main/java/com/simibubi/create/content/legacy/NoGravMagicalDohickyItem.java @@ -1,6 +1,6 @@ package com.simibubi.create.content.legacy; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.nbt.CompoundTag; import net.minecraft.util.Mth; diff --git a/src/main/java/com/simibubi/create/content/logistics/AddressEditBox.java b/src/main/java/com/simibubi/create/content/logistics/AddressEditBox.java index 6dd887100a..30fc4e78a4 100644 --- a/src/main/java/com/simibubi/create/content/logistics/AddressEditBox.java +++ b/src/main/java/com/simibubi/create/content/logistics/AddressEditBox.java @@ -11,7 +11,7 @@ import com.simibubi.create.content.trains.schedule.DestinationSuggestions; import com.simibubi.create.foundation.gui.widget.ScrollInput; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; diff --git a/src/main/java/com/simibubi/create/content/logistics/AddressEditBoxHelper.java b/src/main/java/com/simibubi/create/content/logistics/AddressEditBoxHelper.java index 1bd4356ae5..8cf84038fe 100644 --- a/src/main/java/com/simibubi/create/content/logistics/AddressEditBoxHelper.java +++ b/src/main/java/com/simibubi/create/content/logistics/AddressEditBoxHelper.java @@ -13,7 +13,7 @@ import com.simibubi.create.content.equipment.clipboard.ClipboardEntry; import com.simibubi.create.content.trains.schedule.DestinationSuggestions; import com.simibubi.create.foundation.utility.TickBasedCache; -import net.createmod.catnip.utility.IntAttached; +import net.createmod.catnip.data.IntAttached; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.EditBox; import net.minecraft.client.gui.screens.Screen; diff --git a/src/main/java/com/simibubi/create/content/logistics/FlapStuffs.java b/src/main/java/com/simibubi/create/content/logistics/FlapStuffs.java index a735e298f1..dce0621803 100644 --- a/src/main/java/com/simibubi/create/content/logistics/FlapStuffs.java +++ b/src/main/java/com/simibubi/create/content/logistics/FlapStuffs.java @@ -16,8 +16,8 @@ import dev.engine_room.flywheel.lib.instance.TransformedInstance; import dev.engine_room.flywheel.lib.transform.TransformStack; import dev.engine_room.flywheel.lib.transform.Translate; import net.createmod.catnip.render.SuperByteBuffer; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.math.AngleHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.util.Mth; diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageDestroyPacket.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageDestroyPacket.java index f445553019..2842f0c019 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageDestroyPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageDestroyPacket.java @@ -2,7 +2,7 @@ package com.simibubi.create.content.logistics.box; import com.simibubi.create.foundation.networking.SimplePacketBase; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.core.particles.ItemParticleOption; @@ -35,7 +35,7 @@ public class PackageDestroyPacket extends SimplePacketBase { buffer.writeDouble(location.z); buffer.writeItem(box); } - + @Override public boolean handle(Context ctx) { ctx.enqueueWork(() -> { @@ -50,4 +50,4 @@ public class PackageDestroyPacket extends SimplePacketBase { return true; } -} \ No newline at end of file +} diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java index 5aa7c56d11..ade4a18589 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java @@ -11,8 +11,8 @@ import com.simibubi.create.AllPackets; import com.simibubi.create.AllSoundEvents; import com.simibubi.create.content.logistics.chute.ChuteBlock; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.math.AngleHelper; import net.createmod.ponder.api.level.PonderLevel; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -67,7 +67,7 @@ public class PackageEntity extends LivingEntity implements IEntityAdditionalSpaw public int insertionDelay; public Vec3 clientPosition, vec2 = Vec3.ZERO, vec3 = Vec3.ZERO; - + public WeakReference tossedBy = new WeakReference<>(null); @SuppressWarnings("unchecked") @@ -276,10 +276,10 @@ public class PackageEntity extends LivingEntity implements IEntityAdditionalSpaw @Override public void push(Entity entityIn) { boolean isOtherPackage = entityIn instanceof PackageEntity; - + if (!isOtherPackage && tossedBy.get() != null) tossedBy = new WeakReference(null); // no nudging - + if (isOtherPackage) { if (entityIn.getBoundingBox().minY < this.getBoundingBox().maxY) super.push(entityIn); diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java index 3e5fe59a07..f3326b2f85 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java @@ -11,8 +11,8 @@ import com.simibubi.create.Create; import com.simibubi.create.content.logistics.box.PackageStyles.PackageStyle; import com.simibubi.create.content.logistics.stockTicker.PackageOrder; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -393,4 +393,4 @@ public class PackageItem extends Item { return f; } -} \ No newline at end of file +} diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageRenderer.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageRenderer.java index 94cbd04984..66cb5e02d5 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageRenderer.java @@ -7,7 +7,7 @@ import com.simibubi.create.AllPartialModels; import dev.engine_room.flywheel.lib.model.baked.PartialModel; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; -import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.math.AngleHelper; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.entity.EntityRenderer; diff --git a/src/main/java/com/simibubi/create/content/logistics/chute/AbstractChuteBlock.java b/src/main/java/com/simibubi/create/content/logistics/chute/AbstractChuteBlock.java index ceb600eb22..1b24b0d0b7 100644 --- a/src/main/java/com/simibubi/create/content/logistics/chute/AbstractChuteBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/chute/AbstractChuteBlock.java @@ -14,7 +14,7 @@ import com.simibubi.create.foundation.block.render.ReducedDestroyEffects; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import com.simibubi.create.foundation.item.ItemHelper; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; diff --git a/src/main/java/com/simibubi/create/content/logistics/chute/ChuteBlock.java b/src/main/java/com/simibubi/create/content/logistics/chute/ChuteBlock.java index 75f5b17776..f7d6c9f080 100644 --- a/src/main/java/com/simibubi/create/content/logistics/chute/ChuteBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/chute/ChuteBlock.java @@ -8,8 +8,8 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.content.logistics.funnel.FunnelBlock; import com.simibubi.create.foundation.block.ProperWaterloggedBlock; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.lang.Lang; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.lang.Lang; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.sounds.SoundEvents; diff --git a/src/main/java/com/simibubi/create/content/logistics/chute/ChuteBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/chute/ChuteBlockEntity.java index ba68a596ce..436e375d19 100644 --- a/src/main/java/com/simibubi/create/content/logistics/chute/ChuteBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/chute/ChuteBlockEntity.java @@ -28,10 +28,10 @@ import com.simibubi.create.foundation.utility.BlockHelper; import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.infrastructure.config.AllConfigs; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.animation.LerpedFloat; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.animation.LerpedFloat; +import net.createmod.catnip.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; @@ -83,7 +83,7 @@ public class ChuteBlockEntity extends SmartBlockEntity implements IHaveGoggleInf int entitySearchCooldown; VersionedInventoryTrackerBehaviour invVersionTracker; - + LazyOptional capAbove; LazyOptional capBelow; diff --git a/src/main/java/com/simibubi/create/content/logistics/chute/SmartChuteFilterSlotPositioning.java b/src/main/java/com/simibubi/create/content/logistics/chute/SmartChuteFilterSlotPositioning.java index 016621b943..d63776b695 100644 --- a/src/main/java/com/simibubi/create/content/logistics/chute/SmartChuteFilterSlotPositioning.java +++ b/src/main/java/com/simibubi/create/content/logistics/chute/SmartChuteFilterSlotPositioning.java @@ -2,8 +2,8 @@ package com.simibubi.create.content.logistics.chute; import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.math.AngleHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/logistics/depot/DepotBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/depot/DepotBehaviour.java index 16ea84c1ef..21a7f1ce5e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/depot/DepotBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/depot/DepotBehaviour.java @@ -22,8 +22,8 @@ import com.simibubi.create.foundation.blockEntity.behaviour.BehaviourType; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import com.simibubi.create.foundation.item.ItemHelper; -import net.createmod.catnip.utility.NBTHelper; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.nbt.NBTHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/logistics/depot/DepotRenderer.java b/src/main/java/com/simibubi/create/content/logistics/depot/DepotRenderer.java index deb82321ce..8e21d77705 100644 --- a/src/main/java/com/simibubi/create/content/logistics/depot/DepotRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/depot/DepotRenderer.java @@ -11,7 +11,7 @@ import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.renderer.SafeBlockEntityRenderer; import dev.engine_room.flywheel.lib.transform.TransformStack; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; diff --git a/src/main/java/com/simibubi/create/content/logistics/depot/EjectorBlock.java b/src/main/java/com/simibubi/create/content/logistics/depot/EjectorBlock.java index 0ee37547af..d3c2b05345 100644 --- a/src/main/java/com/simibubi/create/content/logistics/depot/EjectorBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/depot/EjectorBlock.java @@ -13,7 +13,7 @@ import com.simibubi.create.foundation.block.IBE; import com.simibubi.create.foundation.block.ProperWaterloggedBlock; import com.simibubi.create.foundation.item.ItemHelper; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/logistics/depot/EjectorBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/depot/EjectorBlockEntity.java index d68d81f3d7..58e7e09788 100644 --- a/src/main/java/com/simibubi/create/content/logistics/depot/EjectorBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/depot/EjectorBlockEntity.java @@ -22,14 +22,14 @@ import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.infrastructure.config.AllConfigs; import dev.engine_room.flywheel.lib.transform.TransformStack; -import net.createmod.catnip.utility.IntAttached; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.NBTHelper; -import net.createmod.catnip.utility.Pair; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.animation.LerpedFloat; -import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; -import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.data.IntAttached; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.nbt.NBTHelper; +import net.createmod.catnip.data.Pair; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.animation.LerpedFloat; +import net.createmod.catnip.animation.LerpedFloat.Chaser; +import net.createmod.catnip.math.AngleHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/logistics/depot/EjectorRenderer.java b/src/main/java/com/simibubi/create/content/logistics/depot/EjectorRenderer.java index 1317fe5285..8935d016f1 100644 --- a/src/main/java/com/simibubi/create/content/logistics/depot/EjectorRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/depot/EjectorRenderer.java @@ -12,9 +12,9 @@ import dev.engine_room.flywheel.lib.transform.TransformStack; import dev.engine_room.flywheel.lib.transform.Translate; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; -import net.createmod.catnip.utility.IntAttached; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.data.IntAttached; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.math.AngleHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; diff --git a/src/main/java/com/simibubi/create/content/logistics/depot/EjectorTargetHandler.java b/src/main/java/com/simibubi/create/content/logistics/depot/EjectorTargetHandler.java index a76f861c63..985bb6b4d4 100644 --- a/src/main/java/com/simibubi/create/content/logistics/depot/EjectorTargetHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/depot/EjectorTargetHandler.java @@ -8,10 +8,10 @@ import com.simibubi.create.AllPackets; import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.infrastructure.config.AllConfigs; -import net.createmod.catnip.utility.AnimationTickHolder; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.outliner.Outliner; -import net.createmod.catnip.utility.theme.Color; +import net.createmod.catnip.animation.AnimationTickHolder; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.outliner.Outliner; +import net.createmod.catnip.theme.Color; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; diff --git a/src/main/java/com/simibubi/create/content/logistics/depot/EntityLauncher.java b/src/main/java/com/simibubi/create/content/logistics/depot/EntityLauncher.java index f6a98136ee..65df58497b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/depot/EntityLauncher.java +++ b/src/main/java/com/simibubi/create/content/logistics/depot/EntityLauncher.java @@ -1,7 +1,7 @@ package com.simibubi.create.content.logistics.depot; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.math.AngleHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/logistics/depot/SharedDepotBlockMethods.java b/src/main/java/com/simibubi/create/content/logistics/depot/SharedDepotBlockMethods.java index ee68abd0fe..32e63049ae 100644 --- a/src/main/java/com/simibubi/create/content/logistics/depot/SharedDepotBlockMethods.java +++ b/src/main/java/com/simibubi/create/content/logistics/depot/SharedDepotBlockMethods.java @@ -9,7 +9,7 @@ import com.simibubi.create.content.logistics.box.PackageEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import com.simibubi.create.foundation.item.ItemHelper; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.sounds.SoundEvents; diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java index 2b89052015..cbe880e6ae 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java @@ -44,10 +44,10 @@ import com.simibubi.create.foundation.blockEntity.behaviour.filtering.FilteringB import com.simibubi.create.foundation.utility.CreateLang; import net.createmod.catnip.gui.ScreenOpener; -import net.createmod.catnip.utility.NBTHelper; -import net.createmod.catnip.utility.animation.LerpedFloat; -import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.nbt.NBTHelper; +import net.createmod.catnip.animation.LerpedFloat; +import net.createmod.catnip.animation.LerpedFloat.Chaser; +import net.createmod.catnip.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.client.player.LocalPlayer; import net.minecraft.core.BlockPos; @@ -248,7 +248,7 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { && lastReportedUnloadedLinks == unloadedLinkCount && satisfied == shouldSatisfy && promisedSatisfied == shouldPromiseSatisfy && waitingForNetwork == shouldWait) return; - + if (!satisfied && shouldSatisfy) { AllSoundEvents.CONFIRM.playOnServer(getWorld(), getPos(), 0.075f, 1f); AllSoundEvents.CONFIRM_2.playOnServer(getWorld(), getPos(), 0.125f, 0.575f); @@ -349,7 +349,7 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { RequestPromiseQueue promises = Create.LOGISTICS.getQueuedPromises(network); if (promises != null) promises.add(new RequestPromise(new BigItemStack(getFilter(), recipeOutput))); - + panelBE.advancements.awardPlayer(AllAdvancements.FACTORY_GAUGE); } @@ -667,7 +667,7 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { active = false; return; } - + active = true; filter = FilterItemStack.of(panelTag.getCompound("Filter")); count = panelTag.getInt("FilterAmount"); diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java index 7881c174a4..73efb3a4e3 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java @@ -15,8 +15,8 @@ import com.simibubi.create.foundation.block.IBE; import com.simibubi.create.foundation.block.ProperWaterloggedBlock; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.math.AngleHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java index dd6db20ea7..7755dde83c 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java @@ -15,8 +15,8 @@ import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; -import net.createmod.catnip.utility.NBTHelper; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.nbt.NBTHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -39,7 +39,7 @@ public class FactoryPanelBlockEntity extends SmartBlockEntity { public boolean restocker; private VoxelShape lastShape; - + public AdvancementBehaviour advancements; public FactoryPanelBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { @@ -56,7 +56,7 @@ public class FactoryPanelBlockEntity extends SmartBlockEntity { panels.put(slot, e); behaviours.add(e); } - + behaviours.add(advancements = new AdvancementBehaviour(this, AllAdvancements.FACTORY_GAUGE)); } @@ -105,7 +105,7 @@ public class FactoryPanelBlockEntity extends SmartBlockEntity { result++; return result; } - + @Override public void remove() { for (FactoryPanelBehaviour panelBehaviour : panels.values()) diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnection.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnection.java index 2d3b9263dd..d90c375fa2 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnection.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnection.java @@ -4,7 +4,7 @@ import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -109,7 +109,7 @@ public class FactoryPanelConnection { float yRot = Mth.RAD_TO_DEG * FactoryPanelBlock.getYRot(state); int slotDiffx = to.slot().xOffset - from.slot().xOffset; int slotDiffY = to.slot().yOffset - from.slot().yOffset; - + Vec3 diff = Vec3.atLowerCornerOf(to.pos() .subtract(from.pos())); diff = VecHelper.rotate(diff, -yRot, Axis.Y); diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionHandler.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionHandler.java index af159bd8bb..f4f416b8da 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnectionHandler.java @@ -9,9 +9,9 @@ import com.simibubi.create.foundation.block.WrenchableDirectionalBlock; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.AnimationTickHolder; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.outliner.Outliner; +import net.createmod.catnip.animation.AnimationTickHolder; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.outliner.Outliner; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelModel.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelModel.java index 62fe717d5a..d2f43cfe92 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelModel.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelModel.java @@ -14,7 +14,7 @@ import com.simibubi.create.foundation.model.BakedModelWrapperWithData; import com.simibubi.create.foundation.model.BakedQuadHelper; import dev.engine_room.flywheel.lib.model.baked.PartialModel; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.resources.model.BakedModel; @@ -78,7 +78,7 @@ public class FactoryPanelModel extends BakedModelWrapperWithData { float xRot = Mth.RAD_TO_DEG * FactoryPanelBlock.getXRot(state); float yRot = Mth.RAD_TO_DEG * FactoryPanelBlock.getYRot(state); - + for (BakedQuad bakedQuad : quadsToAdd) { int[] vertices = bakedQuad.getVertices(); int[] transformedVertices = Arrays.copyOf(vertices, vertices.length); diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelRenderer.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelRenderer.java index b5d6c1f7c8..f9b109431f 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelRenderer.java @@ -13,7 +13,7 @@ import com.simibubi.create.foundation.render.RenderTypes; import dev.engine_room.flywheel.lib.model.baked.PartialModel; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; -import net.createmod.catnip.utility.theme.Color; +import net.createmod.catnip.theme.Color; import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelSlotPositioning.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelSlotPositioning.java index d788c12798..4bc0d574d2 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelSlotPositioning.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelSlotPositioning.java @@ -5,7 +5,7 @@ import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBlock.Pane import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform; import dev.engine_room.flywheel.lib.transform.TransformStack; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -51,4 +51,4 @@ class FactoryPanelSlotPositioning extends ValueBoxTransform { .rotate(-FactoryPanelBlock.getXRot(state), Direction.EAST); } -} \ No newline at end of file +} diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelSupportBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelSupportBehaviour.java index 8314431745..71eed11bd2 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelSupportBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelSupportBehaviour.java @@ -11,7 +11,7 @@ import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BehaviourType; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; -import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.nbt.NBTHelper; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/AbstractFilterScreen.java b/src/main/java/com/simibubi/create/content/logistics/filter/AbstractFilterScreen.java index d79f8b9237..ed9e3db1ed 100644 --- a/src/main/java/com/simibubi/create/content/logistics/filter/AbstractFilterScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/filter/AbstractFilterScreen.java @@ -18,7 +18,7 @@ import com.simibubi.create.foundation.gui.widget.Indicator.State; import com.simibubi.create.foundation.item.TooltipHelper; import net.createmod.catnip.gui.element.GuiGameElement; -import net.createmod.catnip.utility.FontHelper.Palette; +import net.createmod.catnip.lang.FontHelper.Palette; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.renderer.Rect2i; import net.minecraft.network.chat.Component; diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/AttributeFilterMenu.java b/src/main/java/com/simibubi/create/content/logistics/filter/AttributeFilterMenu.java index 29ee29772c..194690f3d8 100644 --- a/src/main/java/com/simibubi/create/content/logistics/filter/AttributeFilterMenu.java +++ b/src/main/java/com/simibubi/create/content/logistics/filter/AttributeFilterMenu.java @@ -7,8 +7,8 @@ import com.simibubi.create.AllMenuTypes; import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttribute; -import net.createmod.catnip.utility.Pair; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.data.Pair; +import net.createmod.catnip.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/AttributeFilterScreen.java b/src/main/java/com/simibubi/create/content/logistics/filter/AttributeFilterScreen.java index 2ec44f8eba..1a8ba38fc3 100644 --- a/src/main/java/com/simibubi/create/content/logistics/filter/AttributeFilterScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/filter/AttributeFilterScreen.java @@ -20,8 +20,8 @@ import com.simibubi.create.foundation.gui.widget.Label; import com.simibubi.create.foundation.gui.widget.SelectionScrollInput; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.Pair; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.data.Pair; +import net.createmod.catnip.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/FilterItem.java b/src/main/java/com/simibubi/create/content/logistics/filter/FilterItem.java index 97c8138d97..07c4cfd5df 100644 --- a/src/main/java/com/simibubi/create/content/logistics/filter/FilterItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/filter/FilterItem.java @@ -17,7 +17,7 @@ import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttribute import com.simibubi.create.foundation.item.ItemHelper; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/FilterItemStack.java b/src/main/java/com/simibubi/create/content/logistics/filter/FilterItemStack.java index dd2da3cc1e..b98688873b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/filter/FilterItemStack.java +++ b/src/main/java/com/simibubi/create/content/logistics/filter/FilterItemStack.java @@ -8,7 +8,7 @@ import com.simibubi.create.content.fluids.transfer.GenericItemEmptying; import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttribute; import com.simibubi.create.content.logistics.box.PackageItem; -import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.data.Pair; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/FilterScreen.java b/src/main/java/com/simibubi/create/content/logistics/filter/FilterScreen.java index 179a2184eb..ffc6609426 100644 --- a/src/main/java/com/simibubi/create/content/logistics/filter/FilterScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/filter/FilterScreen.java @@ -10,7 +10,7 @@ import com.simibubi.create.foundation.gui.widget.IconButton; import com.simibubi.create.foundation.gui.widget.Indicator; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.world.entity.player.Inventory; diff --git a/src/main/java/com/simibubi/create/content/logistics/funnel/BeltFunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/funnel/BeltFunnelBlock.java index 227bc8e29b..5da9c71a1b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/funnel/BeltFunnelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/funnel/BeltFunnelBlock.java @@ -12,8 +12,8 @@ import com.simibubi.create.foundation.block.ProperWaterloggedBlock; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import com.tterrag.registrate.util.entry.BlockEntry; -import net.createmod.catnip.utility.VoxelShaper; -import net.createmod.catnip.utility.lang.Lang; +import net.createmod.catnip.math.VoxelShaper; +import net.createmod.catnip.lang.Lang; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.util.StringRepresentable; diff --git a/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelBlock.java index 6bf909ff63..ae5ff78b2c 100644 --- a/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelBlock.java @@ -8,7 +8,7 @@ import com.simibubi.create.foundation.advancement.AdvancementBehaviour; import com.simibubi.create.foundation.block.ProperWaterloggedBlock; import com.simibubi.create.foundation.item.ItemHelper; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.AxisDirection; diff --git a/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelBlockEntity.java index 6bcdf7d6ba..54e55aeb64 100644 --- a/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelBlockEntity.java @@ -25,10 +25,10 @@ import com.simibubi.create.foundation.item.ItemHelper.ExtractionCountMode; import com.simibubi.create.infrastructure.config.AllConfigs; import dev.engine_room.flywheel.lib.visualization.VisualizationHelper; -import net.createmod.catnip.utility.BlockFace; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.animation.LerpedFloat; -import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.math.BlockFace; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.animation.LerpedFloat; +import net.createmod.catnip.animation.LerpedFloat.Chaser; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelFilterSlotPositioning.java b/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelFilterSlotPositioning.java index d9c1acf0c5..53782f5a8b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelFilterSlotPositioning.java +++ b/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelFilterSlotPositioning.java @@ -5,8 +5,8 @@ import com.simibubi.create.content.logistics.funnel.BeltFunnelBlock.Shape; import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform; import dev.engine_room.flywheel.lib.transform.TransformStack; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.math.AngleHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/EnchantAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/EnchantAttribute.java index 831f8ac068..01023bb7d8 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/EnchantAttribute.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/EnchantAttribute.java @@ -3,8 +3,8 @@ package com.simibubi.create.content.logistics.item.filter.attribute.attributes; import java.util.ArrayList; import java.util.List; -import net.createmod.catnip.utility.NBTHelper; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.nbt.NBTHelper; +import net.createmod.catnip.lang.Components; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/InTagAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/InTagAttribute.java index 0ca1a8067b..2a195a0127 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/InTagAttribute.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/InTagAttribute.java @@ -3,7 +3,7 @@ package com.simibubi.create.content.logistics.item.filter.attribute.attributes; import java.util.List; import java.util.stream.Collectors; -import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.nbt.NBTHelper; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/astralsorcery/AstralSorceryAmuletAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/astralsorcery/AstralSorceryAmuletAttribute.java index e35e788be4..fe49a9fce7 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/astralsorcery/AstralSorceryAmuletAttribute.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/astralsorcery/AstralSorceryAmuletAttribute.java @@ -5,7 +5,7 @@ import java.util.List; import com.simibubi.create.content.logistics.item.filter.attribute.AllItemAttributeTypes; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/astralsorcery/AstralSorceryAttunementAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/astralsorcery/AstralSorceryAttunementAttribute.java index 6dfb8d4d62..4e5644a902 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/astralsorcery/AstralSorceryAttunementAttribute.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/astralsorcery/AstralSorceryAttunementAttribute.java @@ -3,7 +3,7 @@ package com.simibubi.create.content.logistics.item.filter.attribute.attributes.a import java.util.ArrayList; import java.util.List; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/astralsorcery/AstralSorceryCrystalAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/astralsorcery/AstralSorceryCrystalAttribute.java index a446d2d4eb..c494fbec08 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/astralsorcery/AstralSorceryCrystalAttribute.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/astralsorcery/AstralSorceryCrystalAttribute.java @@ -3,7 +3,7 @@ package com.simibubi.create.content.logistics.item.filter.attribute.attributes.a import java.util.ArrayList; import java.util.List; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/astralsorcery/AstralSorceryPerkGemAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/astralsorcery/AstralSorceryPerkGemAttribute.java index e5dfafbb72..149661463b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/astralsorcery/AstralSorceryPerkGemAttribute.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/attributes/astralsorcery/AstralSorceryPerkGemAttribute.java @@ -3,7 +3,7 @@ package com.simibubi.create.content.logistics.item.filter.attribute.attributes.a import java.util.ArrayList; import java.util.List; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/simibubi/create/content/logistics/itemHatch/HatchFilterSlot.java b/src/main/java/com/simibubi/create/content/logistics/itemHatch/HatchFilterSlot.java index ac5c55fd5a..e8ea30f5b6 100644 --- a/src/main/java/com/simibubi/create/content/logistics/itemHatch/HatchFilterSlot.java +++ b/src/main/java/com/simibubi/create/content/logistics/itemHatch/HatchFilterSlot.java @@ -4,8 +4,8 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Axis; import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.math.AngleHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.LevelAccessor; @@ -39,4 +39,4 @@ public class HatchFilterSlot extends ValueBoxTransform { .orElse(Direction.NORTH)); } -} \ No newline at end of file +} diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java index 0c33762fda..d53d631f65 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortBlockEntity.java @@ -15,7 +15,7 @@ import com.simibubi.create.foundation.blockEntity.behaviour.animatedContainer.An import com.simibubi.create.foundation.item.SmartInventory; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; @@ -145,10 +145,10 @@ public abstract class PackagePortBlockEntity extends SmartBlockEntity implements return InteractionResult.PASS; if (player instanceof FakePlayer) return InteractionResult.PASS; - + ItemStack mainHandItem = player.getMainHandItem(); boolean clipboard = AllBlocks.CLIPBOARD.isIn(mainHandItem); - + if (level.isClientSide) { if (!clipboard) onOpenedManually(); diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortScreen.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortScreen.java index 9b113c2b1a..a110f58412 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortScreen.java @@ -17,7 +17,7 @@ import com.simibubi.create.foundation.utility.CreateLang; import net.createmod.catnip.gui.element.GuiGameElement; import net.createmod.catnip.gui.widget.AbstractSimiWidget; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.EditBox; diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTargetSelectionHandler.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTargetSelectionHandler.java index 2428cb0bd1..b3f0b4d2f8 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTargetSelectionHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/PackagePortTargetSelectionHandler.java @@ -7,9 +7,9 @@ import com.simibubi.create.content.trains.station.StationBlockEntity; import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.infrastructure.config.AllConfigs; -import net.createmod.catnip.utility.AnimationTickHolder; -import net.createmod.catnip.utility.outliner.Outliner; -import net.createmod.catnip.utility.theme.Color; +import net.createmod.catnip.animation.AnimationTickHolder; +import net.createmod.catnip.outliner.Outliner; +import net.createmod.catnip.theme.Color; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.player.LocalPlayer; diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportBlock.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportBlock.java index 05153ee830..bbfa7a0e67 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportBlock.java @@ -9,7 +9,7 @@ import com.simibubi.create.content.equipment.wrench.IWrenchable; import com.simibubi.create.foundation.advancement.AdvancementBehaviour; import com.simibubi.create.foundation.block.IBE; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.util.Mth; import net.minecraft.world.InteractionHand; @@ -82,12 +82,12 @@ public class FrogportBlock extends Block implements IBE, IW public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pMovedByPiston) { IBE.onRemove(pState, pLevel, pPos, pNewState); } - + @Override public boolean isPathfindable(BlockState state, BlockGetter reader, BlockPos pos, PathComputationType type) { return false; } - + @Override public boolean hasAnalogOutputSignal(BlockState pState) { return true; diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportBlockEntity.java index 69746e37bf..281e3a859b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportBlockEntity.java @@ -14,10 +14,10 @@ import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour import com.simibubi.create.foundation.item.ItemHelper; import com.simibubi.create.foundation.item.TooltipHelper; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.NBTHelper; -import net.createmod.catnip.utility.animation.LerpedFloat; -import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.nbt.NBTHelper; +import net.createmod.catnip.animation.LerpedFloat; +import net.createmod.catnip.animation.LerpedFloat.Chaser; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.particles.BlockParticleOption; @@ -51,7 +51,7 @@ public class FrogportBlockEntity extends PackagePortBlockEntity implements IHave private boolean failedLastExport; private FrogportSounds sounds; - + private AdvancementBehaviour advancements; public FrogportBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { @@ -69,7 +69,7 @@ public class FrogportBlockEntity extends PackagePortBlockEntity implements IHave behaviours.add(advancements = new AdvancementBehaviour(this, AllAdvancements.FROGPORT)); super.addBehaviours(behaviours); } - + public boolean isAnimationInProgress() { return animationProgress.getChaseTarget() == 1; } @@ -185,13 +185,13 @@ public class FrogportBlockEntity extends PackagePortBlockEntity implements IHave animationProgress.chase(1, 0.1, Chaser.LINEAR); animatedPackage = box; currentlyDepositing = deposit; - + if (level != null && !deposit && !level.isClientSide()) advancements.awardPlayer(AllAdvancements.FROGPORT); if (level != null && level.isClientSide()) { sounds.open(level, worldPosition); - + if (currentlyDepositing) { sounds.depositPackage(level, worldPosition); diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportRenderer.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportRenderer.java index 508a7ad6e6..e7ef9604ec 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportRenderer.java @@ -7,7 +7,7 @@ import com.simibubi.create.foundation.blockEntity.renderer.SmartBlockEntityRende import dev.engine_room.flywheel.api.visualization.VisualizationManager; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider.Context; diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/postbox/PostboxBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/postbox/PostboxBlockEntity.java index 961570bc03..48443aaf83 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/postbox/PostboxBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/postbox/PostboxBlockEntity.java @@ -8,9 +8,9 @@ import com.simibubi.create.content.logistics.packagePort.PackagePortBlockEntity; import com.simibubi.create.content.trains.station.GlobalStation; import com.simibubi.create.content.trains.station.GlobalStation.GlobalPackagePort; -import net.createmod.catnip.utility.NBTHelper; -import net.createmod.catnip.utility.animation.LerpedFloat; -import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.nbt.NBTHelper; +import net.createmod.catnip.animation.LerpedFloat; +import net.createmod.catnip.animation.LerpedFloat.Chaser; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.sounds.SoundEvents; diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/postbox/PostboxRenderer.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/postbox/PostboxRenderer.java index b078d66007..cdd39ec3ea 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/postbox/PostboxRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/postbox/PostboxRenderer.java @@ -8,7 +8,7 @@ import com.simibubi.create.foundation.blockEntity.renderer.SmartBlockEntityRende import dev.engine_room.flywheel.lib.transform.Transform; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider.Context; diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/InventorySummary.java b/src/main/java/com/simibubi/create/content/logistics/packager/InventorySummary.java index 70f17efa00..e57f1cc1df 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/InventorySummary.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/InventorySummary.java @@ -15,7 +15,7 @@ import com.simibubi.create.AllPackets; import com.simibubi.create.content.logistics.BigItemStack; import com.simibubi.create.content.logistics.stockTicker.LogisticalStockResponsePacket; -import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.nbt.NBTHelper; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; @@ -48,7 +48,7 @@ public class InventorySummary { public void add(BigItemStack entry) { add(entry.stack, entry.count); } - + public Map> getItemMap() { return items; } @@ -75,7 +75,7 @@ public class InventorySummary { return; } } - + if (stack.getCount() > stack.getMaxStackSize()) stack = stack.copyWithCount(1); diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java index b8bb2b27a3..73cd37d29c 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java @@ -35,8 +35,8 @@ import com.simibubi.create.foundation.blockEntity.behaviour.inventory.InvManipul import com.simibubi.create.foundation.blockEntity.behaviour.inventory.VersionedInventoryTrackerBehaviour; import com.simibubi.create.foundation.item.ItemHelper; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.nbt.NBTHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; @@ -80,7 +80,7 @@ public class PackagerBlockEntity extends SmartBlockEntity { private InventorySummary availableItems; private VersionedInventoryTrackerBehaviour invVersionTracker; - + private AdvancementBehaviour advancements; // @@ -124,7 +124,7 @@ public class PackagerBlockEntity extends SmartBlockEntity { if (buttonCooldown > 0) buttonCooldown--; - + if (animationTicks == 0) { previouslyUnwrapped = ItemStack.EMPTY; @@ -540,7 +540,7 @@ public class PackagerBlockEntity extends SmartBlockEntity { heldBox = createdBox; animationInward = false; animationTicks = CYCLE; - + advancements.awardPlayer(AllAdvancements.PACKAGER); triggerStockCheck(); notifyUpdate(); diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerRenderer.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerRenderer.java index 4c14844816..60a74a558d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerRenderer.java @@ -9,7 +9,7 @@ import dev.engine_room.flywheel.lib.model.baked.PartialModel; import dev.engine_room.flywheel.lib.transform.TransformStack; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; -import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.math.AngleHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java index dbb4ba1699..942f1921e0 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBehaviour.java @@ -25,7 +25,7 @@ import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.foundation.utility.TickBasedCache; -import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.data.Pair; import net.minecraft.ChatFormatting; import net.minecraft.core.GlobalPos; import net.minecraft.nbt.CompoundTag; @@ -213,12 +213,12 @@ public class LogisticallyLinkedBehaviour extends BlockEntityBehaviour { public boolean isSafeNBT() { return true; } - + @Override public void writeSafe(CompoundTag tag) { tag.putUUID("Freq", freqId); } - + @Override public void write(CompoundTag tag, boolean clientPacket) { super.write(tag, clientPacket); diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedClientHandler.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedClientHandler.java index 925d97f172..e25a9379c3 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedClientHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedClientHandler.java @@ -6,8 +6,8 @@ import org.apache.commons.lang3.tuple.Pair; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; -import net.createmod.catnip.utility.AnimationTickHolder; -import net.createmod.catnip.utility.outliner.Outliner; +import net.createmod.catnip.animation.AnimationTickHolder; +import net.createmod.catnip.outliner.Outliner; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsManager.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsManager.java index f2170912df..89e7b50460 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsManager.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsManager.java @@ -24,7 +24,7 @@ import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedBeha import com.simibubi.create.content.logistics.stockTicker.PackageOrder; import com.simibubi.create.foundation.utility.TickBasedCache; -import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.data.Pair; import net.minecraft.world.item.ItemStack; import net.minecraftforge.items.IItemHandler; @@ -66,7 +66,7 @@ public class LogisticsManager { IItemHandler ignoredHandler, String address) { if (order.isEmpty()) return false; - + Multimap requests = findPackagersForRequest(freqId, order, null, ignoredHandler, address); diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsNetwork.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsNetwork.java index 81cb81f36f..f37a809e84 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsNetwork.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsNetwork.java @@ -6,7 +6,7 @@ import java.util.UUID; import com.simibubi.create.Create; -import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.nbt.NBTHelper; import net.minecraft.core.GlobalPos; import net.minecraft.core.registries.Registries; import net.minecraft.nbt.CompoundTag; @@ -52,7 +52,7 @@ public class LogisticsNetwork { if (owner != null) tag.putUUID("Owner", owner); - + tag.putBoolean("Locked", locked); return tag; } diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsNetworkSavedData.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsNetworkSavedData.java index 7e2623a9c6..d62b36ca49 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsNetworkSavedData.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsNetworkSavedData.java @@ -9,7 +9,7 @@ import com.simibubi.create.Create; import com.simibubi.create.foundation.utility.SavedDataUtil; -import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.nbt.NBTHelper; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; import net.minecraft.server.MinecraftServer; diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlock.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlock.java index 13355e4814..d959441ee6 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlock.java @@ -6,7 +6,7 @@ import com.simibubi.create.content.equipment.wrench.IWrenchable; import com.simibubi.create.foundation.block.IBE; import com.simibubi.create.foundation.block.ProperWaterloggedBlock; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.entity.LivingEntity; diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java index 85f4dedeaa..3fa7225829 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java @@ -17,7 +17,7 @@ import com.simibubi.create.content.logistics.stockTicker.PackageOrder; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; -import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.data.Pair; import net.minecraft.core.BlockPos; import net.minecraft.core.particles.VibrationParticleOption; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/RequestPromiseQueue.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/RequestPromiseQueue.java index 0db4280584..a98bbb6884 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/RequestPromiseQueue.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/RequestPromiseQueue.java @@ -10,7 +10,7 @@ import java.util.Map; import com.simibubi.create.content.logistics.BigItemStack; -import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.nbt.NBTHelper; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; import net.minecraft.world.item.Item; diff --git a/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlockEntity.java index 6645397012..8b164d684d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlockEntity.java @@ -8,7 +8,7 @@ import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedBeha import com.simibubi.create.content.logistics.stockTicker.PackageOrder; import com.simibubi.create.content.logistics.stockTicker.StockCheckingBlockEntity; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.core.BlockPos; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrder.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrder.java index cb47da241d..68fc5cf201 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrder.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrder.java @@ -5,7 +5,7 @@ import java.util.List; import com.simibubi.create.content.logistics.BigItemStack; -import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.nbt.NBTHelper; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; import net.minecraft.network.FriendlyByteBuf; diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryScreen.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryScreen.java index a06347ec2b..18f0bcc2d1 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperCategoryScreen.java @@ -25,9 +25,9 @@ import com.simibubi.create.foundation.utility.CreateLang; import net.createmod.catnip.gui.UIRenderHelper; import net.createmod.catnip.gui.element.GuiGameElement; -import net.createmod.catnip.utility.animation.LerpedFloat; -import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.animation.LerpedFloat; +import net.createmod.catnip.animation.LerpedFloat.Chaser; +import net.createmod.catnip.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphics; @@ -120,7 +120,7 @@ public class StockKeeperCategoryScreen extends AbstractSimiContainerScreen(blockEntity.hiddenCategoriesByPlayer.getOrDefault(menu.player.getUUID(), List.of())); - + forcedEntries = new InventorySummary(); itemToProgram = menu.player.getMainHandItem(); @@ -254,7 +254,7 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen list : displayedItems) allEmpty &= list.isEmpty(); @@ -1178,10 +1178,10 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen(); blockEntity.ticksSinceLastUpdate = 10; successTicks = 1; - + if (isSchematicListMode()) menu.player.closeContainer(); } diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java index 142ace2827..27ede9994e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlockEntity.java @@ -24,9 +24,9 @@ import com.simibubi.create.foundation.item.ItemHelper; import com.simibubi.create.foundation.item.SmartInventory; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.NBTHelper; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.nbt.NBTHelper; +import net.createmod.catnip.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; @@ -100,7 +100,7 @@ public class StockTickerBlockEntity extends StockCheckingBlockEntity implements notifyUpdate(); return result; } - + @Override public InventorySummary getRecentSummary() { InventorySummary recentSummary = super.getRecentSummary(); diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java index b2cda711b9..eedcd19054 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerInteractionHandler.java @@ -15,8 +15,8 @@ import com.simibubi.create.content.logistics.tableCloth.ShoppingListItem; import com.simibubi.create.content.logistics.tableCloth.ShoppingListItem.ShoppingList; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.data.Iterate; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -91,7 +91,7 @@ public class StockTickerInteractionHandler { stbe.getRecentSummary() .divideAndSendTo(sp, targetPos); } - + return true; } diff --git a/src/main/java/com/simibubi/create/content/logistics/tableCloth/ShoppingListItem.java b/src/main/java/com/simibubi/create/content/logistics/tableCloth/ShoppingListItem.java index 21b97476f1..4d436c9b2b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/tableCloth/ShoppingListItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/tableCloth/ShoppingListItem.java @@ -9,10 +9,10 @@ import com.simibubi.create.content.logistics.BigItemStack; import com.simibubi.create.content.logistics.packager.InventorySummary; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.IntAttached; -import net.createmod.catnip.utility.NBTHelper; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.data.IntAttached; +import net.createmod.catnip.nbt.NBTHelper; +import net.createmod.catnip.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothBlock.java b/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothBlock.java index c1dd242aea..61b074bead 100644 --- a/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothBlock.java @@ -14,9 +14,9 @@ import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.block.IBE; import com.simibubi.create.foundation.block.IHaveBigOutline; -import net.createmod.catnip.utility.placement.IPlacementHelper; -import net.createmod.catnip.utility.placement.PlacementHelpers; -import net.createmod.catnip.utility.placement.PlacementOffset; +import net.createmod.catnip.placement.IPlacementHelper; +import net.createmod.catnip.placement.PlacementHelpers; +import net.createmod.catnip.placement.PlacementOffset; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothBlockEntity.java index 8aca06925c..930229df70 100644 --- a/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothBlockEntity.java @@ -21,8 +21,8 @@ import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour import com.simibubi.create.foundation.blockEntity.behaviour.filtering.FilteringBehaviour; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.IntAttached; -import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.data.IntAttached; +import net.createmod.catnip.nbt.NBTHelper; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -114,7 +114,7 @@ public class TableClothBlockEntity extends SmartBlockEntity { return InteractionResult.SUCCESS; player.setItemInHand(InteractionHand.MAIN_HAND, manuallyAddedItems.remove(manuallyAddedItems.size() - 1)); level.playSound(null, worldPosition, SoundEvents.ITEM_FRAME_REMOVE_ITEM, SoundSource.BLOCKS, 0.5f, 1f); - + if (manuallyAddedItems.isEmpty()) { level.setBlock(worldPosition, getBlockState().setValue(TableClothBlock.HAS_BE, false), 3); AllPackets.getChannel() @@ -239,7 +239,7 @@ public class TableClothBlockEntity extends SmartBlockEntity { for (IntAttached entry : list.purchases()) if (worldPosition.equals(entry.getValue())) entry.setFirst(Math.min(stockLevel, entry.getFirst())); - + if (clientSide) CreateLang.translate("stock_keeper.limited_stock") .style(ChatFormatting.RED) diff --git a/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothFilterSlot.java b/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothFilterSlot.java index 56620d2e65..ffb76be2b2 100644 --- a/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothFilterSlot.java +++ b/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothFilterSlot.java @@ -4,7 +4,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform; import dev.engine_room.flywheel.lib.transform.TransformStack; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction.Axis; import net.minecraft.world.level.LevelAccessor; @@ -32,4 +32,4 @@ class TableClothFilterSlot extends ValueBoxTransform { .rotateXDegrees(be.sideOccluded ? 90 : 0); } -} \ No newline at end of file +} diff --git a/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothFilteringBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothFilteringBehaviour.java index 7ab0815ea6..6577edde41 100644 --- a/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothFilteringBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothFilteringBehaviour.java @@ -6,7 +6,7 @@ import com.simibubi.create.foundation.blockEntity.behaviour.ValueSettingsFormatt import com.simibubi.create.foundation.blockEntity.behaviour.filtering.FilteringBehaviour; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.core.Direction; import net.minecraft.network.chat.MutableComponent; import net.minecraft.world.InteractionHand; @@ -41,7 +41,7 @@ public class TableClothFilteringBehaviour extends FilteringBehaviour { return dbe().owner == null || player.getUUID() .equals(dbe().owner); } - + @Override public boolean isSafeNBT() { return false; @@ -55,7 +55,7 @@ public class TableClothFilteringBehaviour extends FilteringBehaviour { public boolean isCountVisible() { return !filter.isEmpty(); } - + @Override public boolean setFilter(ItemStack stack) { int before = count; @@ -63,7 +63,7 @@ public class TableClothFilteringBehaviour extends FilteringBehaviour { count = before; return result; } - + @Override public void setValueSettings(Player player, ValueSettings settings, boolean ctrlDown) { if (getValueSettings().equals(settings)) diff --git a/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothModel.java b/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothModel.java index 79bd2905b3..ece6473f68 100644 --- a/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothModel.java +++ b/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothModel.java @@ -15,7 +15,7 @@ import com.simibubi.create.foundation.model.BakedQuadHelper; import dev.engine_room.flywheel.lib.model.baked.PartialModel; import net.createmod.catnip.render.SpriteShiftEntry; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.texture.TextureAtlasSprite; diff --git a/src/main/java/com/simibubi/create/content/logistics/tunnel/BeltTunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/tunnel/BeltTunnelBlock.java index e802e03eae..c8bb55eae6 100644 --- a/src/main/java/com/simibubi/create/content/logistics/tunnel/BeltTunnelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/tunnel/BeltTunnelBlock.java @@ -10,8 +10,8 @@ import com.simibubi.create.content.logistics.funnel.BeltFunnelBlock; import com.simibubi.create.foundation.block.IBE; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; -import net.createmod.catnip.utility.lang.Lang; -import net.createmod.catnip.utility.levelWrappers.WrappedLevel; +import net.createmod.catnip.lang.Lang; +import net.createmod.catnip.levelWrappers.WrappedLevel; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/logistics/tunnel/BeltTunnelBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/tunnel/BeltTunnelBlockEntity.java index 7039bd322a..106e035712 100644 --- a/src/main/java/com/simibubi/create/content/logistics/tunnel/BeltTunnelBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/tunnel/BeltTunnelBlockEntity.java @@ -17,9 +17,9 @@ import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import dev.engine_room.flywheel.lib.visualization.VisualizationHelper; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.animation.LerpedFloat; -import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.animation.LerpedFloat; +import net.createmod.catnip.animation.LerpedFloat.Chaser; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/logistics/tunnel/BeltTunnelRenderer.java b/src/main/java/com/simibubi/create/content/logistics/tunnel/BeltTunnelRenderer.java index 4e4b93595c..c2edb61511 100644 --- a/src/main/java/com/simibubi/create/content/logistics/tunnel/BeltTunnelRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/tunnel/BeltTunnelRenderer.java @@ -9,7 +9,7 @@ import com.simibubi.create.foundation.blockEntity.renderer.SmartBlockEntityRende import dev.engine_room.flywheel.api.visualization.VisualizationManager; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; diff --git a/src/main/java/com/simibubi/create/content/logistics/tunnel/BeltTunnelShapes.java b/src/main/java/com/simibubi/create/content/logistics/tunnel/BeltTunnelShapes.java index 9dcf98999c..b505d33520 100644 --- a/src/main/java/com/simibubi/create/content/logistics/tunnel/BeltTunnelShapes.java +++ b/src/main/java/com/simibubi/create/content/logistics/tunnel/BeltTunnelShapes.java @@ -2,7 +2,7 @@ package com.simibubi.create.content.logistics.tunnel; import static net.minecraft.world.level.block.Block.box; -import net.createmod.catnip.utility.VoxelShaper; +import net.createmod.catnip.math.VoxelShaper; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; import net.minecraft.world.level.block.state.BlockState; diff --git a/src/main/java/com/simibubi/create/content/logistics/tunnel/BeltTunnelVisual.java b/src/main/java/com/simibubi/create/content/logistics/tunnel/BeltTunnelVisual.java index 321fdfb8d2..526a5a9c89 100644 --- a/src/main/java/com/simibubi/create/content/logistics/tunnel/BeltTunnelVisual.java +++ b/src/main/java/com/simibubi/create/content/logistics/tunnel/BeltTunnelVisual.java @@ -13,7 +13,7 @@ import dev.engine_room.flywheel.api.visualization.VisualizationContext; import dev.engine_room.flywheel.lib.model.Models; import dev.engine_room.flywheel.lib.visual.AbstractBlockEntityVisual; import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; -import net.createmod.catnip.utility.animation.LerpedFloat; +import net.createmod.catnip.animation.LerpedFloat; import net.minecraft.core.Direction; public class BeltTunnelVisual extends AbstractBlockEntityVisual implements SimpleDynamicVisual { diff --git a/src/main/java/com/simibubi/create/content/logistics/tunnel/BrassTunnelBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/tunnel/BrassTunnelBlockEntity.java index 3a2dba7bf8..5a946a0b40 100644 --- a/src/main/java/com/simibubi/create/content/logistics/tunnel/BrassTunnelBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/tunnel/BrassTunnelBlockEntity.java @@ -31,11 +31,11 @@ import com.simibubi.create.foundation.utility.BlockHelper; import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.infrastructure.config.AllConfigs; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.NBTHelper; -import net.createmod.catnip.utility.lang.Components; -import net.createmod.catnip.utility.lang.Lang; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.nbt.NBTHelper; +import net.createmod.catnip.lang.Components; +import net.createmod.catnip.lang.Lang; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/logistics/tunnel/BrassTunnelFilterSlot.java b/src/main/java/com/simibubi/create/content/logistics/tunnel/BrassTunnelFilterSlot.java index d06b5a0086..a51b307344 100644 --- a/src/main/java/com/simibubi/create/content/logistics/tunnel/BrassTunnelFilterSlot.java +++ b/src/main/java/com/simibubi/create/content/logistics/tunnel/BrassTunnelFilterSlot.java @@ -2,7 +2,7 @@ package com.simibubi.create.content.logistics.tunnel; import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.world.phys.Vec3; public class BrassTunnelFilterSlot extends ValueBoxTransform.Sided { diff --git a/src/main/java/com/simibubi/create/content/logistics/vault/ItemVaultItem.java b/src/main/java/com/simibubi/create/content/logistics/vault/ItemVaultItem.java index b4aacb92b2..b7ea12f37b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/vault/ItemVaultItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/vault/ItemVaultItem.java @@ -4,7 +4,7 @@ import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.api.connectivity.ConnectivityHandler; import com.simibubi.create.content.equipment.symmetryWand.SymmetryWandItem; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/materials/ExperienceBlock.java b/src/main/java/com/simibubi/create/content/materials/ExperienceBlock.java index 8dac29ea64..857cc1e098 100644 --- a/src/main/java/com/simibubi/create/content/materials/ExperienceBlock.java +++ b/src/main/java/com/simibubi/create/content/materials/ExperienceBlock.java @@ -1,6 +1,6 @@ package com.simibubi.create.content.materials; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.util.RandomSource; diff --git a/src/main/java/com/simibubi/create/content/materials/ExperienceNuggetItem.java b/src/main/java/com/simibubi/create/content/materials/ExperienceNuggetItem.java index 6f6d9ffe0c..7deb022ed5 100644 --- a/src/main/java/com/simibubi/create/content/materials/ExperienceNuggetItem.java +++ b/src/main/java/com/simibubi/create/content/materials/ExperienceNuggetItem.java @@ -1,6 +1,6 @@ package com.simibubi.create.content.materials; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.core.Direction.Axis; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; diff --git a/src/main/java/com/simibubi/create/content/processing/basin/BasinBlockEntity.java b/src/main/java/com/simibubi/create/content/processing/basin/BasinBlockEntity.java index 62a9f130cf..e72c1c07bc 100644 --- a/src/main/java/com/simibubi/create/content/processing/basin/BasinBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/processing/basin/BasinBlockEntity.java @@ -31,16 +31,16 @@ import com.simibubi.create.foundation.item.SmartInventory; import com.simibubi.create.foundation.utility.BlockHelper; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.AnimationTickHolder; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.IntAttached; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.NBTHelper; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.animation.LerpedFloat; -import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; -import net.createmod.catnip.utility.lang.Components; -import net.createmod.catnip.utility.lang.LangBuilder; +import net.createmod.catnip.animation.AnimationTickHolder; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.data.IntAttached; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.nbt.NBTHelper; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.animation.LerpedFloat; +import net.createmod.catnip.animation.LerpedFloat.Chaser; +import net.createmod.catnip.lang.Components; +import net.createmod.catnip.lang.LangBuilder; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/processing/basin/BasinRecipe.java b/src/main/java/com/simibubi/create/content/processing/basin/BasinRecipe.java index 22db4fd888..765760fa4f 100644 --- a/src/main/java/com/simibubi/create/content/processing/basin/BasinRecipe.java +++ b/src/main/java/com/simibubi/create/content/processing/basin/BasinRecipe.java @@ -20,7 +20,7 @@ import com.simibubi.create.foundation.item.SmartInventory; import com.simibubi.create.foundation.recipe.DummyCraftingContainer; import com.simibubi.create.foundation.recipe.IRecipeTypeInfo; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.client.Minecraft; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.CraftingRecipe; @@ -150,14 +150,14 @@ public class BasinRecipe extends ProcessingRecipe { if (simulate) { if (recipe instanceof BasinRecipe basinRecipe) { recipeOutputItems.addAll(basinRecipe.rollResults()); - + for (FluidStack fluidStack : basinRecipe.getFluidResults()) if (!fluidStack.isEmpty()) recipeOutputFluids.add(fluidStack); for (ItemStack stack : basinRecipe.getRemainingItems(basin.getInputInventory())) if (!stack.isEmpty()) recipeOutputItems.add(stack); - + } else { recipeOutputItems.add(recipe.getResultItem(basin.getLevel() .registryAccess())); diff --git a/src/main/java/com/simibubi/create/content/processing/basin/BasinRenderer.java b/src/main/java/com/simibubi/create/content/processing/basin/BasinRenderer.java index 19afb74030..97a5475241 100644 --- a/src/main/java/com/simibubi/create/content/processing/basin/BasinRenderer.java +++ b/src/main/java/com/simibubi/create/content/processing/basin/BasinRenderer.java @@ -7,10 +7,10 @@ import com.simibubi.create.foundation.blockEntity.renderer.SmartBlockEntityRende import com.simibubi.create.foundation.fluid.FluidRenderer; import dev.engine_room.flywheel.lib.transform.TransformStack; -import net.createmod.catnip.utility.IntAttached; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.math.AngleHelper; -import net.createmod.ponder.utility.LevelTickHolder; +import net.createmod.catnip.animation.AnimationTickHolder; +import net.createmod.catnip.data.IntAttached; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.math.AngleHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; @@ -72,7 +72,7 @@ public class BasinRenderer extends SmartBlockEntityRenderer { if (fluidLevel > 0) { ms.translate(0, (Mth.sin( - LevelTickHolder.getRenderTime(basin.getLevel()) / 12f + anglePartition * itemCount) + 1.5f) + AnimationTickHolder.getRenderTime(basin.getLevel()) / 12f + anglePartition * itemCount) + 1.5f) * 1 / 32f, 0); } diff --git a/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerBlock.java b/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerBlock.java index d39b378dc8..5460ae4c3e 100644 --- a/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerBlock.java +++ b/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerBlock.java @@ -15,7 +15,7 @@ import com.simibubi.create.content.logistics.stockTicker.StockTickerInteractionH import com.simibubi.create.content.processing.basin.BasinBlockEntity; import com.simibubi.create.foundation.block.IBE; -import net.createmod.catnip.utility.lang.Lang; +import net.createmod.catnip.lang.Lang; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.advancements.critereon.StatePropertiesPredicate; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerBlockEntity.java b/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerBlockEntity.java index dfcc5097dc..0d0d147095 100644 --- a/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerBlockEntity.java @@ -16,11 +16,11 @@ import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import dev.engine_room.flywheel.api.backend.BackendManager; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.animation.LerpedFloat; -import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; -import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.animation.LerpedFloat; +import net.createmod.catnip.animation.LerpedFloat.Chaser; +import net.createmod.catnip.math.AngleHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; import net.minecraft.core.BlockPos; @@ -120,7 +120,7 @@ public class BlazeBurnerBlockEntity extends SmartBlockEntity { super.lazyTick(); stockKeeper = getStockTicker(level, worldPosition) != null; } - + @Nullable public static StockTickerBlockEntity getStockTicker(LevelAccessor level, BlockPos pos) { for (Direction direction : Iterate.horizontalDirections) { @@ -206,7 +206,7 @@ public class BlazeBurnerBlockEntity extends SmartBlockEntity { public BlazeBurnerBlock.HeatLevel getHeatLevelFromBlock() { return BlazeBurnerBlock.getHeatLevelOf(getBlockState()); } - + public BlazeBurnerBlock.HeatLevel getHeatLevelForRender() { HeatLevel heatLevel = getHeatLevelFromBlock(); if (!heatLevel.isAtLeast(HeatLevel.FADING) && stockKeeper) diff --git a/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerBlockItem.java b/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerBlockItem.java index 41f7b1e5fe..7d7989ea86 100644 --- a/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerBlockItem.java +++ b/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerBlockItem.java @@ -11,7 +11,7 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.AllTags.AllEntityTags; import net.createmod.catnip.platform.CatnipServices; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.particles.ParticleTypes; diff --git a/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerInteractionBehaviour.java b/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerInteractionBehaviour.java index af4b0229e1..57de865192 100644 --- a/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerInteractionBehaviour.java +++ b/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerInteractionBehaviour.java @@ -14,7 +14,7 @@ import com.simibubi.create.content.trains.schedule.ScheduleItem; import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerMovementBehaviour.java b/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerMovementBehaviour.java index 6eeed8f1ff..ba0223b69e 100644 --- a/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerMovementBehaviour.java @@ -9,11 +9,11 @@ import com.simibubi.create.content.trains.entity.CarriageContraption; import com.simibubi.create.content.trains.entity.CarriageContraptionEntity; import com.simibubi.create.foundation.virtualWorld.VirtualRenderWorld; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.animation.LerpedFloat; -import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; -import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.animation.LerpedFloat; +import net.createmod.catnip.animation.LerpedFloat.Chaser; +import net.createmod.catnip.math.AngleHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerRenderer.java b/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerRenderer.java index 896014c598..4cc509ded1 100644 --- a/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerRenderer.java +++ b/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerRenderer.java @@ -13,12 +13,12 @@ import com.simibubi.create.foundation.blockEntity.renderer.SafeBlockEntityRender import com.simibubi.create.foundation.virtualWorld.VirtualRenderWorld; import dev.engine_room.flywheel.lib.model.baked.PartialModel; +import net.createmod.catnip.animation.AnimationTickHolder; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SpriteShiftEntry; import net.createmod.catnip.render.SuperByteBuffer; -import net.createmod.catnip.utility.animation.LerpedFloat; -import net.createmod.catnip.utility.math.AngleHelper; -import net.createmod.ponder.utility.LevelTickHolder; +import net.createmod.catnip.animation.LerpedFloat; +import net.createmod.catnip.math.AngleHelper; import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; @@ -64,7 +64,7 @@ public class BlazeBurnerRenderer extends SafeBlockEntityRenderer 0.125f; - float time = LevelTickHolder.getRenderTime(level); + float time = AnimationTickHolder.getRenderTime(level); float renderTick = time + (hashCode % 13) * 16f; float offsetMult = heatLevel.isAtLeast(HeatLevel.FADING) ? 64 : 16; float offset = Mth.sin((float) ((renderTick / 16f) % (2 * Math.PI))) / offsetMult; diff --git a/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerVisual.java b/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerVisual.java index 63656ff96d..2077f20bac 100644 --- a/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerVisual.java +++ b/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerVisual.java @@ -2,11 +2,11 @@ package com.simibubi.create.content.processing.burner; import java.util.function.Consumer; +import net.createmod.catnip.animation.AnimationTickHolder; import org.jetbrains.annotations.Nullable; import com.simibubi.create.AllPartialModels; import com.simibubi.create.AllSpriteShifts; -import com.simibubi.create.content.processing.burner.BlazeBurnerBlock.HeatLevel; import com.simibubi.create.foundation.render.AllInstanceTypes; import dev.engine_room.flywheel.api.instance.Instance; @@ -22,8 +22,7 @@ import dev.engine_room.flywheel.lib.visual.AbstractBlockEntityVisual; import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; import dev.engine_room.flywheel.lib.visual.SimpleTickableVisual; import net.createmod.catnip.render.SpriteShiftEntry; -import net.createmod.catnip.utility.math.AngleHelper; -import net.createmod.ponder.utility.LevelTickHolder; +import net.createmod.catnip.math.AngleHelper; import net.minecraft.client.renderer.LightTexture; import net.minecraft.core.Direction; import net.minecraft.util.Mth; @@ -140,7 +139,7 @@ public class BlazeBurnerVisual extends AbstractBlockEntityVisual { diff --git a/src/main/java/com/simibubi/create/content/redstone/diodes/BrassDiodeScrollSlot.java b/src/main/java/com/simibubi/create/content/redstone/diodes/BrassDiodeScrollSlot.java index e88ffbedb6..8992b8f528 100644 --- a/src/main/java/com/simibubi/create/content/redstone/diodes/BrassDiodeScrollSlot.java +++ b/src/main/java/com/simibubi/create/content/redstone/diodes/BrassDiodeScrollSlot.java @@ -4,8 +4,8 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform; import dev.engine_room.flywheel.lib.transform.TransformStack; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.math.AngleHelper; import net.minecraft.core.BlockPos; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.state.BlockState; diff --git a/src/main/java/com/simibubi/create/content/redstone/diodes/BrassDiodeScrollValueBehaviour.java b/src/main/java/com/simibubi/create/content/redstone/diodes/BrassDiodeScrollValueBehaviour.java index 20d99c40da..7c853d1106 100644 --- a/src/main/java/com/simibubi/create/content/redstone/diodes/BrassDiodeScrollValueBehaviour.java +++ b/src/main/java/com/simibubi/create/content/redstone/diodes/BrassDiodeScrollValueBehaviour.java @@ -7,7 +7,7 @@ import com.simibubi.create.foundation.blockEntity.behaviour.ValueSettingsFormatt import com.simibubi.create.foundation.blockEntity.behaviour.scrollValue.ScrollValueBehaviour; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; diff --git a/src/main/java/com/simibubi/create/content/redstone/diodes/BrassDiodeVisual.java b/src/main/java/com/simibubi/create/content/redstone/diodes/BrassDiodeVisual.java index 78843dddd5..bbcfa8a1dc 100644 --- a/src/main/java/com/simibubi/create/content/redstone/diodes/BrassDiodeVisual.java +++ b/src/main/java/com/simibubi/create/content/redstone/diodes/BrassDiodeVisual.java @@ -12,7 +12,7 @@ import dev.engine_room.flywheel.lib.instance.TransformedInstance; import dev.engine_room.flywheel.lib.model.Models; import dev.engine_room.flywheel.lib.visual.AbstractBlockEntityVisual; import dev.engine_room.flywheel.lib.visual.SimpleTickableVisual; -import net.createmod.catnip.utility.theme.Color; +import net.createmod.catnip.theme.Color; public class BrassDiodeVisual extends AbstractBlockEntityVisual implements SimpleTickableVisual { diff --git a/src/main/java/com/simibubi/create/content/redstone/displayLink/ClickToLinkBlockItem.java b/src/main/java/com/simibubi/create/content/redstone/displayLink/ClickToLinkBlockItem.java index d791446bd0..19108c7dba 100644 --- a/src/main/java/com/simibubi/create/content/redstone/displayLink/ClickToLinkBlockItem.java +++ b/src/main/java/com/simibubi/create/content/redstone/displayLink/ClickToLinkBlockItem.java @@ -3,7 +3,7 @@ package com.simibubi.create.content.redstone.displayLink; import com.simibubi.create.AllSoundEvents; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.outliner.Outliner; +import net.createmod.catnip.outliner.Outliner; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/simibubi/create/content/redstone/displayLink/DisplayLinkBlock.java b/src/main/java/com/simibubi/create/content/redstone/displayLink/DisplayLinkBlock.java index d0fb308c80..54f73a36cd 100644 --- a/src/main/java/com/simibubi/create/content/redstone/displayLink/DisplayLinkBlock.java +++ b/src/main/java/com/simibubi/create/content/redstone/displayLink/DisplayLinkBlock.java @@ -14,7 +14,7 @@ import com.simibubi.create.foundation.block.WrenchableDirectionalBlock; import com.simibubi.create.foundation.utility.CreateLang; import net.createmod.catnip.gui.ScreenOpener; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.client.player.LocalPlayer; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -63,7 +63,7 @@ public class DisplayLinkBlock extends WrenchableDirectionalBlock implements IBE< super.setPlacedBy(pLevel, pPos, pState, pPlacer, pStack); AdvancementBehaviour.setPlacedBy(pLevel, pPos, pPlacer); } - + @Override public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pMovedByPiston) { IBE.onRemove(pState, pLevel, pPos, pNewState); diff --git a/src/main/java/com/simibubi/create/content/redstone/displayLink/DisplayLinkScreen.java b/src/main/java/com/simibubi/create/content/redstone/displayLink/DisplayLinkScreen.java index 856a62b84d..e96e1da4f3 100644 --- a/src/main/java/com/simibubi/create/content/redstone/displayLink/DisplayLinkScreen.java +++ b/src/main/java/com/simibubi/create/content/redstone/displayLink/DisplayLinkScreen.java @@ -26,8 +26,8 @@ import net.createmod.catnip.gui.ScreenOpener; import net.createmod.catnip.gui.element.GuiGameElement; import net.createmod.catnip.gui.widget.AbstractSimiWidget; import net.createmod.catnip.gui.widget.ElementWidget; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.lang.Components; import net.createmod.ponder.foundation.ui.PonderTagScreen; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.GuiGraphics; diff --git a/src/main/java/com/simibubi/create/content/redstone/displayLink/LinkBulbRenderer.java b/src/main/java/com/simibubi/create/content/redstone/displayLink/LinkBulbRenderer.java index 84d6392b77..8865784706 100644 --- a/src/main/java/com/simibubi/create/content/redstone/displayLink/LinkBulbRenderer.java +++ b/src/main/java/com/simibubi/create/content/redstone/displayLink/LinkBulbRenderer.java @@ -7,7 +7,7 @@ import com.simibubi.create.foundation.render.RenderTypes; import dev.engine_room.flywheel.lib.transform.TransformStack; import net.createmod.catnip.render.CachedBuffers; -import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.math.AngleHelper; import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; diff --git a/src/main/java/com/simibubi/create/content/redstone/displayLink/LinkWithBulbBlockEntity.java b/src/main/java/com/simibubi/create/content/redstone/displayLink/LinkWithBulbBlockEntity.java index 5319c006e0..9dbac55349 100644 --- a/src/main/java/com/simibubi/create/content/redstone/displayLink/LinkWithBulbBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/redstone/displayLink/LinkWithBulbBlockEntity.java @@ -2,9 +2,9 @@ package com.simibubi.create.content.redstone.displayLink; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; -import net.createmod.catnip.utility.NBTHelper; -import net.createmod.catnip.utility.animation.LerpedFloat; -import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.nbt.NBTHelper; +import net.createmod.catnip.animation.LerpedFloat; +import net.createmod.catnip.animation.LerpedFloat.Chaser; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.block.entity.BlockEntityType; @@ -14,33 +14,33 @@ public abstract class LinkWithBulbBlockEntity extends SmartBlockEntity { private LerpedFloat glow; private boolean sendPulse; - + public LinkWithBulbBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); glow = LerpedFloat.linear() .startWithValue(0); glow.chase(0, 0.5f, Chaser.EXP); } - + @Override public void tick() { super.tick(); if (isVirtual() || level.isClientSide()) glow.tickChaser(); } - + public float getGlow(float partialTicks) { return glow.getValue(partialTicks); } - + public void sendPulseNextSync() { sendPulse = true; } - + public void pulse() { glow.setValue(2); } - + @Override protected void write(CompoundTag tag, boolean clientPacket) { super.write(tag, clientPacket); @@ -49,7 +49,7 @@ public abstract class LinkWithBulbBlockEntity extends SmartBlockEntity { NBTHelper.putMarker(tag, "Pulse"); } } - + @Override protected void read(CompoundTag tag, boolean clientPacket) { super.read(tag, clientPacket); diff --git a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/AccumulatedItemCountDisplaySource.java b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/AccumulatedItemCountDisplaySource.java index a2d249cd25..e01d76ed47 100644 --- a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/AccumulatedItemCountDisplaySource.java +++ b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/AccumulatedItemCountDisplaySource.java @@ -5,7 +5,7 @@ import com.simibubi.create.content.redstone.displayLink.DisplayLinkBlockEntity; import com.simibubi.create.content.redstone.displayLink.DisplayLinkContext; import com.simibubi.create.content.redstone.displayLink.target.DisplayTargetStats; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.network.chat.MutableComponent; public class AccumulatedItemCountDisplaySource extends NumericSingleLineDisplaySource { diff --git a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/BoilerDisplaySource.java b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/BoilerDisplaySource.java index 376675203f..d7ebffe5c7 100644 --- a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/BoilerDisplaySource.java +++ b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/BoilerDisplaySource.java @@ -14,7 +14,7 @@ import com.simibubi.create.content.trains.display.FlapDisplaySection; import com.simibubi.create.foundation.utility.CreateLang; import joptsimple.internal.Strings; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.MutableComponent; import net.minecraft.world.level.block.entity.BlockEntity; diff --git a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/ComputerDisplaySource.java b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/ComputerDisplaySource.java index 61d2b962b4..451147f148 100644 --- a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/ComputerDisplaySource.java +++ b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/ComputerDisplaySource.java @@ -6,7 +6,7 @@ import java.util.List; import com.simibubi.create.content.redstone.displayLink.DisplayLinkContext; import com.simibubi.create.content.redstone.displayLink.target.DisplayTargetStats; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; import net.minecraft.network.chat.MutableComponent; diff --git a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/CurrentFloorDisplaySource.java b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/CurrentFloorDisplaySource.java index e63a6e1891..f092286034 100644 --- a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/CurrentFloorDisplaySource.java +++ b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/CurrentFloorDisplaySource.java @@ -4,7 +4,7 @@ import com.simibubi.create.content.contraptions.elevator.ElevatorContactBlockEnt import com.simibubi.create.content.redstone.displayLink.DisplayLinkContext; import com.simibubi.create.content.redstone.displayLink.target.DisplayTargetStats; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.network.chat.MutableComponent; public class CurrentFloorDisplaySource extends SingleLineDisplaySource { diff --git a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/DisplaySource.java b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/DisplaySource.java index 53874302f1..125284b8d1 100644 --- a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/DisplaySource.java +++ b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/DisplaySource.java @@ -13,8 +13,8 @@ import com.simibubi.create.content.trains.display.FlapDisplayBlockEntity; import com.simibubi.create.content.trains.display.FlapDisplayLayout; import com.simibubi.create.foundation.gui.ModularGuiLineBuilder; -import net.createmod.catnip.utility.NBTProcessors; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.nbt.NBTProcessors; +import net.createmod.catnip.lang.Components; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraftforge.api.distmarker.Dist; @@ -44,7 +44,7 @@ public abstract class DisplaySource extends DisplayBehaviour { for (MutableComponent component : text) if (NBTProcessors.textComponentHasClickEvent(component)) return; // Naughty - + activeTarget.acceptText(line, text, context); } diff --git a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/EnchantPowerDisplaySource.java b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/EnchantPowerDisplaySource.java index 5991a967fe..b6bb412c6d 100644 --- a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/EnchantPowerDisplaySource.java +++ b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/EnchantPowerDisplaySource.java @@ -3,7 +3,7 @@ package com.simibubi.create.content.redstone.displayLink.source; import com.simibubi.create.content.redstone.displayLink.DisplayLinkContext; import com.simibubi.create.content.redstone.displayLink.target.DisplayTargetStats; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.MutableComponent; import net.minecraft.util.RandomSource; diff --git a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/FactoryGaugeDisplaySource.java b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/FactoryGaugeDisplaySource.java index ca62f10f32..04770804f2 100644 --- a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/FactoryGaugeDisplaySource.java +++ b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/FactoryGaugeDisplaySource.java @@ -10,8 +10,8 @@ import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBehaviour; import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelPosition; import com.simibubi.create.content.redstone.displayLink.DisplayLinkContext; -import net.createmod.catnip.utility.IntAttached; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.data.IntAttached; +import net.createmod.catnip.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.MutableComponent; import net.minecraft.world.item.ItemStack; diff --git a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/FluidAmountDisplaySource.java b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/FluidAmountDisplaySource.java index 0c37909fad..89af25d13f 100644 --- a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/FluidAmountDisplaySource.java +++ b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/FluidAmountDisplaySource.java @@ -7,7 +7,7 @@ import com.simibubi.create.foundation.blockEntity.behaviour.filtering.FilteringB import com.simibubi.create.foundation.blockEntity.behaviour.inventory.TankManipulationBehaviour; import com.simibubi.create.foundation.utility.FluidFormatter; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.network.chat.MutableComponent; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraftforge.fluids.FluidStack; diff --git a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/FluidListDisplaySource.java b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/FluidListDisplaySource.java index c9bfd5f3e9..901a57d02c 100644 --- a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/FluidListDisplaySource.java +++ b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/FluidListDisplaySource.java @@ -17,9 +17,9 @@ import com.simibubi.create.foundation.blockEntity.behaviour.filtering.FilteringB import com.simibubi.create.foundation.blockEntity.behaviour.inventory.TankManipulationBehaviour; import com.simibubi.create.foundation.utility.FluidFormatter; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.IntAttached; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.data.IntAttached; +import net.createmod.catnip.lang.Components; import net.minecraft.network.chat.MutableComponent; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.material.Fluid; diff --git a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/ItemCountDisplaySource.java b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/ItemCountDisplaySource.java index 2d1b42e96f..1f329fe5cb 100644 --- a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/ItemCountDisplaySource.java +++ b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/ItemCountDisplaySource.java @@ -6,7 +6,7 @@ import com.simibubi.create.content.redstone.smartObserver.SmartObserverBlockEnti import com.simibubi.create.foundation.blockEntity.behaviour.filtering.FilteringBehaviour; import com.simibubi.create.foundation.blockEntity.behaviour.inventory.InvManipulationBehaviour; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.network.chat.MutableComponent; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntity; diff --git a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/ItemListDisplaySource.java b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/ItemListDisplaySource.java index 733b86f218..085b78a642 100644 --- a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/ItemListDisplaySource.java +++ b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/ItemListDisplaySource.java @@ -8,7 +8,7 @@ import com.simibubi.create.foundation.blockEntity.behaviour.filtering.FilteringB import com.simibubi.create.foundation.blockEntity.behaviour.inventory.InvManipulationBehaviour; import com.simibubi.create.foundation.item.CountedItemStackList; -import net.createmod.catnip.utility.IntAttached; +import net.createmod.catnip.data.IntAttached; import net.minecraft.network.chat.MutableComponent; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraftforge.items.IItemHandler; diff --git a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/KineticStressDisplaySource.java b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/KineticStressDisplaySource.java index e0ac677b23..d39e8278cb 100644 --- a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/KineticStressDisplaySource.java +++ b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/KineticStressDisplaySource.java @@ -6,7 +6,7 @@ import com.simibubi.create.content.trains.display.FlapDisplayBlockEntity; import com.simibubi.create.foundation.gui.ModularGuiLineBuilder; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.lang.LangBuilder; +import net.createmod.catnip.lang.LangBuilder; import net.minecraft.network.chat.MutableComponent; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; diff --git a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/NumericSingleLineDisplaySource.java b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/NumericSingleLineDisplaySource.java index d644d48c83..38a50f09d2 100644 --- a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/NumericSingleLineDisplaySource.java +++ b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/NumericSingleLineDisplaySource.java @@ -3,7 +3,7 @@ package com.simibubi.create.content.redstone.displayLink.source; import com.simibubi.create.content.redstone.displayLink.DisplayLinkContext; import com.simibubi.create.content.trains.display.FlapDisplaySection; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.network.chat.Component; public abstract class NumericSingleLineDisplaySource extends SingleLineDisplaySource { diff --git a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/PercentOrProgressBarDisplaySource.java b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/PercentOrProgressBarDisplaySource.java index 72a680ed38..871a48f89b 100644 --- a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/PercentOrProgressBarDisplaySource.java +++ b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/PercentOrProgressBarDisplaySource.java @@ -9,7 +9,7 @@ import com.simibubi.create.content.redstone.displayLink.target.DisplayTargetStat import com.simibubi.create.content.trains.display.FlapDisplayBlockEntity; import com.simibubi.create.content.trains.display.FlapDisplaySection; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.network.chat.MutableComponent; import net.minecraft.util.Mth; import net.minecraft.world.level.block.entity.SignBlockEntity; diff --git a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/RedstonePowerDisplaySource.java b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/RedstonePowerDisplaySource.java index 3f4d155e95..d49e5c76b1 100644 --- a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/RedstonePowerDisplaySource.java +++ b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/RedstonePowerDisplaySource.java @@ -4,7 +4,7 @@ import com.simibubi.create.content.redstone.displayLink.DisplayLinkContext; import com.simibubi.create.foundation.gui.ModularGuiLineBuilder; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.network.chat.MutableComponent; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockStateProperties; diff --git a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/ScoreboardDisplaySource.java b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/ScoreboardDisplaySource.java index 111d03d50e..f7672b9c14 100644 --- a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/ScoreboardDisplaySource.java +++ b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/ScoreboardDisplaySource.java @@ -7,8 +7,8 @@ import com.simibubi.create.content.redstone.displayLink.DisplayLinkContext; import com.simibubi.create.foundation.gui.ModularGuiLineBuilder; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.IntAttached; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.data.IntAttached; +import net.createmod.catnip.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.MutableComponent; import net.minecraft.server.level.ServerLevel; diff --git a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/SingleLineDisplaySource.java b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/SingleLineDisplaySource.java index 10adde9ad2..614323fd80 100644 --- a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/SingleLineDisplaySource.java +++ b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/SingleLineDisplaySource.java @@ -11,7 +11,7 @@ import com.simibubi.create.content.trains.display.FlapDisplaySection; import com.simibubi.create.foundation.gui.ModularGuiLineBuilder; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.MutableComponent; import net.minecraftforge.api.distmarker.Dist; diff --git a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/StatTrackingDisplaySource.java b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/StatTrackingDisplaySource.java index 7e5d700189..b8f34dbed7 100644 --- a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/StatTrackingDisplaySource.java +++ b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/StatTrackingDisplaySource.java @@ -5,7 +5,7 @@ import java.util.stream.Stream; import com.simibubi.create.content.redstone.displayLink.DisplayLinkContext; import com.simibubi.create.foundation.gui.ModularGuiLineBuilder; -import net.createmod.catnip.utility.IntAttached; +import net.createmod.catnip.data.IntAttached; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.server.level.ServerLevel; diff --git a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/StationSummaryDisplaySource.java b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/StationSummaryDisplaySource.java index a1a28ee760..c52779b783 100644 --- a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/StationSummaryDisplaySource.java +++ b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/StationSummaryDisplaySource.java @@ -18,7 +18,7 @@ import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.gui.ModularGuiLineBuilder; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.MutableComponent; diff --git a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/StopWatchDisplaySource.java b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/StopWatchDisplaySource.java index a86d271f0c..b9ee3c9b24 100644 --- a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/StopWatchDisplaySource.java +++ b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/StopWatchDisplaySource.java @@ -5,7 +5,7 @@ import com.simibubi.create.content.redstone.displayLink.DisplayLinkContext; import com.simibubi.create.content.redstone.displayLink.target.DisplayTargetStats; import com.simibubi.create.content.trains.display.FlapDisplaySection; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.network.chat.MutableComponent; public class StopWatchDisplaySource extends SingleLineDisplaySource { diff --git a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/TimeOfDayDisplaySource.java b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/TimeOfDayDisplaySource.java index 546686dec3..749c84acf6 100644 --- a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/TimeOfDayDisplaySource.java +++ b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/TimeOfDayDisplaySource.java @@ -7,7 +7,7 @@ import com.simibubi.create.content.trains.display.FlapDisplaySection; import com.simibubi.create.foundation.gui.ModularGuiLineBuilder; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.network.chat.MutableComponent; import net.minecraft.server.level.ServerLevel; import net.minecraftforge.api.distmarker.Dist; diff --git a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/ValueListDisplaySource.java b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/ValueListDisplaySource.java index 863874c71d..1c36ac4c69 100644 --- a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/ValueListDisplaySource.java +++ b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/ValueListDisplaySource.java @@ -17,9 +17,9 @@ import com.simibubi.create.content.trains.display.FlapDisplaySection; import com.simibubi.create.foundation.gui.ModularGuiLineBuilder; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.IntAttached; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.data.IntAttached; +import net.createmod.catnip.lang.Components; import net.minecraft.network.chat.MutableComponent; import net.minecraft.world.level.block.entity.LecternBlockEntity; import net.minecraftforge.api.distmarker.Dist; diff --git a/src/main/java/com/simibubi/create/content/redstone/displayLink/target/SignDisplayTarget.java b/src/main/java/com/simibubi/create/content/redstone/displayLink/target/SignDisplayTarget.java index 5269168cab..de7f0194a3 100644 --- a/src/main/java/com/simibubi/create/content/redstone/displayLink/target/SignDisplayTarget.java +++ b/src/main/java/com/simibubi/create/content/redstone/displayLink/target/SignDisplayTarget.java @@ -4,7 +4,7 @@ import java.util.List; import com.simibubi.create.content.redstone.displayLink.DisplayLinkContext; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.network.chat.MutableComponent; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.SignBlockEntity; @@ -41,7 +41,7 @@ public class SignDisplayTarget extends DisplayTarget { public DisplayTargetStats provideStats(DisplayLinkContext context) { return new DisplayTargetStats(4, 15, this); } - + @Override public boolean requiresComponentSanitization() { return true; diff --git a/src/main/java/com/simibubi/create/content/redstone/link/IRedstoneLinkable.java b/src/main/java/com/simibubi/create/content/redstone/link/IRedstoneLinkable.java index 59ab830eb7..bb5438196e 100644 --- a/src/main/java/com/simibubi/create/content/redstone/link/IRedstoneLinkable.java +++ b/src/main/java/com/simibubi/create/content/redstone/link/IRedstoneLinkable.java @@ -2,7 +2,7 @@ package com.simibubi.create.content.redstone.link; import com.simibubi.create.content.redstone.link.RedstoneLinkNetworkHandler.Frequency; -import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.data.Couple; import net.minecraft.core.BlockPos; public interface IRedstoneLinkable { diff --git a/src/main/java/com/simibubi/create/content/redstone/link/LinkBehaviour.java b/src/main/java/com/simibubi/create/content/redstone/link/LinkBehaviour.java index c7b95a9077..65ca26405f 100644 --- a/src/main/java/com/simibubi/create/content/redstone/link/LinkBehaviour.java +++ b/src/main/java/com/simibubi/create/content/redstone/link/LinkBehaviour.java @@ -14,7 +14,7 @@ import com.simibubi.create.foundation.blockEntity.behaviour.BehaviourType; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform; -import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.data.Couple; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/redstone/link/LinkRenderer.java b/src/main/java/com/simibubi/create/content/redstone/link/LinkRenderer.java index c154ff1373..e73b9ca959 100644 --- a/src/main/java/com/simibubi/create/content/redstone/link/LinkRenderer.java +++ b/src/main/java/com/simibubi/create/content/redstone/link/LinkRenderer.java @@ -14,9 +14,9 @@ import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform; import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.infrastructure.config.AllConfigs; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.outliner.Outliner; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.outliner.Outliner; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.MultiBufferSource; diff --git a/src/main/java/com/simibubi/create/content/redstone/link/RedstoneLinkBlock.java b/src/main/java/com/simibubi/create/content/redstone/link/RedstoneLinkBlock.java index dd3896f2e3..9b1aeadfb7 100644 --- a/src/main/java/com/simibubi/create/content/redstone/link/RedstoneLinkBlock.java +++ b/src/main/java/com/simibubi/create/content/redstone/link/RedstoneLinkBlock.java @@ -5,7 +5,7 @@ import com.simibubi.create.AllShapes; import com.simibubi.create.foundation.block.IBE; import com.simibubi.create.foundation.block.WrenchableDirectionalBlock; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; @@ -75,7 +75,7 @@ public class RedstoneLinkBlock extends WrenchableDirectionalBlock implements IBE public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pMovedByPiston) { IBE.onRemove(pState, pLevel, pPos, pNewState); } - + public void updateTransmittedSignal(BlockState state, Level worldIn, BlockPos pos) { if (worldIn.isClientSide) return; diff --git a/src/main/java/com/simibubi/create/content/redstone/link/RedstoneLinkFrequencySlot.java b/src/main/java/com/simibubi/create/content/redstone/link/RedstoneLinkFrequencySlot.java index 16061e1879..6244bbc097 100644 --- a/src/main/java/com/simibubi/create/content/redstone/link/RedstoneLinkFrequencySlot.java +++ b/src/main/java/com/simibubi/create/content/redstone/link/RedstoneLinkFrequencySlot.java @@ -4,8 +4,8 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform; import dev.engine_room.flywheel.lib.transform.TransformStack; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.math.AngleHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/redstone/link/RedstoneLinkNetworkHandler.java b/src/main/java/com/simibubi/create/content/redstone/link/RedstoneLinkNetworkHandler.java index 560e33c5ac..73153bf16c 100644 --- a/src/main/java/com/simibubi/create/content/redstone/link/RedstoneLinkNetworkHandler.java +++ b/src/main/java/com/simibubi/create/content/redstone/link/RedstoneLinkNetworkHandler.java @@ -11,8 +11,8 @@ import java.util.concurrent.atomic.AtomicInteger; import com.simibubi.create.Create; import com.simibubi.create.infrastructure.config.AllConfigs; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.WorldHelper; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.levelWrappers.WorldHelper; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; diff --git a/src/main/java/com/simibubi/create/content/redstone/link/controller/LecternControllerRenderer.java b/src/main/java/com/simibubi/create/content/redstone/link/controller/LecternControllerRenderer.java index 62f78dc8b5..45290387b1 100644 --- a/src/main/java/com/simibubi/create/content/redstone/link/controller/LecternControllerRenderer.java +++ b/src/main/java/com/simibubi/create/content/redstone/link/controller/LecternControllerRenderer.java @@ -7,7 +7,7 @@ import com.simibubi.create.foundation.item.render.CustomRenderedItemModel; import com.simibubi.create.foundation.item.render.PartialItemModelRenderer; import dev.engine_room.flywheel.lib.transform.TransformStack; -import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.math.AngleHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; diff --git a/src/main/java/com/simibubi/create/content/redstone/link/controller/LinkedControllerClientHandler.java b/src/main/java/com/simibubi/create/content/redstone/link/controller/LinkedControllerClientHandler.java index fa78fc0543..46e0e975f9 100644 --- a/src/main/java/com/simibubi/create/content/redstone/link/controller/LinkedControllerClientHandler.java +++ b/src/main/java/com/simibubi/create/content/redstone/link/controller/LinkedControllerClientHandler.java @@ -20,9 +20,9 @@ import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.utility.ControlsUtil; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.FontHelper.Palette; -import net.createmod.catnip.utility.lang.Components; -import net.createmod.catnip.utility.outliner.Outliner; +import net.createmod.catnip.lang.FontHelper.Palette; +import net.createmod.catnip.lang.Components; +import net.createmod.catnip.outliner.Outliner; import net.minecraft.ChatFormatting; import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/simibubi/create/content/redstone/link/controller/LinkedControllerItem.java b/src/main/java/com/simibubi/create/content/redstone/link/controller/LinkedControllerItem.java index eb13a1abfa..644262d3d6 100644 --- a/src/main/java/com/simibubi/create/content/redstone/link/controller/LinkedControllerItem.java +++ b/src/main/java/com/simibubi/create/content/redstone/link/controller/LinkedControllerItem.java @@ -8,7 +8,7 @@ import com.simibubi.create.content.redstone.link.RedstoneLinkNetworkHandler; import com.simibubi.create.content.redstone.link.RedstoneLinkNetworkHandler.Frequency; import com.simibubi.create.foundation.item.render.SimpleCustomRenderer; -import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.data.Couple; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; diff --git a/src/main/java/com/simibubi/create/content/redstone/link/controller/LinkedControllerItemRenderer.java b/src/main/java/com/simibubi/create/content/redstone/link/controller/LinkedControllerItemRenderer.java index 65d36e16c5..5e34a5be06 100644 --- a/src/main/java/com/simibubi/create/content/redstone/link/controller/LinkedControllerItemRenderer.java +++ b/src/main/java/com/simibubi/create/content/redstone/link/controller/LinkedControllerItemRenderer.java @@ -12,9 +12,9 @@ import com.simibubi.create.foundation.item.render.PartialItemModelRenderer; import dev.engine_room.flywheel.lib.model.baked.PartialModel; import dev.engine_room.flywheel.lib.transform.TransformStack; -import net.createmod.catnip.utility.AnimationTickHolder; -import net.createmod.catnip.utility.animation.LerpedFloat; -import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.animation.AnimationTickHolder; +import net.createmod.catnip.animation.LerpedFloat; +import net.createmod.catnip.animation.LerpedFloat.Chaser; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.resources.model.BakedModel; diff --git a/src/main/java/com/simibubi/create/content/redstone/link/controller/LinkedControllerServerHandler.java b/src/main/java/com/simibubi/create/content/redstone/link/controller/LinkedControllerServerHandler.java index 9d01047742..6729912cbd 100644 --- a/src/main/java/com/simibubi/create/content/redstone/link/controller/LinkedControllerServerHandler.java +++ b/src/main/java/com/simibubi/create/content/redstone/link/controller/LinkedControllerServerHandler.java @@ -15,9 +15,9 @@ import com.simibubi.create.content.redstone.link.LinkBehaviour; import com.simibubi.create.content.redstone.link.RedstoneLinkNetworkHandler.Frequency; import com.simibubi.create.foundation.advancement.AllAdvancements; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.IntAttached; -import net.createmod.catnip.utility.WorldAttached; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.data.IntAttached; +import net.createmod.catnip.data.WorldAttached; import net.minecraft.core.BlockPos; import net.minecraft.world.level.LevelAccessor; diff --git a/src/main/java/com/simibubi/create/content/redstone/nixieTube/NixieTubeBlock.java b/src/main/java/com/simibubi/create/content/redstone/nixieTube/NixieTubeBlock.java index fb0ee5e94d..f2f0694282 100644 --- a/src/main/java/com/simibubi/create/content/redstone/nixieTube/NixieTubeBlock.java +++ b/src/main/java/com/simibubi/create/content/redstone/nixieTube/NixieTubeBlock.java @@ -15,7 +15,7 @@ import com.simibubi.create.content.schematics.requirement.ItemRequirement; import com.simibubi.create.content.schematics.requirement.ItemRequirement.ItemUseType; import com.simibubi.create.foundation.block.IBE; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/redstone/nixieTube/NixieTubeBlockEntity.java b/src/main/java/com/simibubi/create/content/redstone/nixieTube/NixieTubeBlockEntity.java index ee29b04ed6..d8ea7c1e17 100644 --- a/src/main/java/com/simibubi/create/content/redstone/nixieTube/NixieTubeBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/redstone/nixieTube/NixieTubeBlockEntity.java @@ -11,8 +11,8 @@ import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import com.simibubi.create.foundation.utility.DynamicComponent; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.lang.Components; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/redstone/nixieTube/NixieTubeRenderer.java b/src/main/java/com/simibubi/create/content/redstone/nixieTube/NixieTubeRenderer.java index a59150b684..c7cef022bf 100644 --- a/src/main/java/com/simibubi/create/content/redstone/nixieTube/NixieTubeRenderer.java +++ b/src/main/java/com/simibubi/create/content/redstone/nixieTube/NixieTubeRenderer.java @@ -10,12 +10,12 @@ import com.simibubi.create.foundation.render.RenderTypes; import com.simibubi.create.foundation.utility.DyeHelper; import dev.engine_room.flywheel.lib.transform.TransformStack; +import net.createmod.catnip.animation.AnimationTickHolder; import net.createmod.catnip.render.CachedBuffers; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.math.AngleHelper; -import net.createmod.catnip.utility.theme.Color; -import net.createmod.ponder.utility.LevelTickHolder; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.math.AngleHelper; +import net.createmod.catnip.theme.Color; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.font.glyphs.BakedGlyph; @@ -143,7 +143,7 @@ public class NixieTubeRenderer extends SafeBlockEntityRenderer getShotsPerGunpowder()) { remainingFuel = getShotsPerGunpowder(); sendUpdate = true; - return; + return; } - + if (remainingFuel > 0) return; diff --git a/src/main/java/com/simibubi/create/content/schematics/cannon/SchematicannonScreen.java b/src/main/java/com/simibubi/create/content/schematics/cannon/SchematicannonScreen.java index 36efa72712..b62c7a89e2 100644 --- a/src/main/java/com/simibubi/create/content/schematics/cannon/SchematicannonScreen.java +++ b/src/main/java/com/simibubi/create/content/schematics/cannon/SchematicannonScreen.java @@ -23,8 +23,8 @@ import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.utility.CreateLang; import net.createmod.catnip.gui.element.GuiGameElement; -import net.createmod.catnip.utility.FontHelper.Palette; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.FontHelper.Palette; +import net.createmod.catnip.lang.Components; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.renderer.Rect2i; diff --git a/src/main/java/com/simibubi/create/content/schematics/client/ClientSchematicLoader.java b/src/main/java/com/simibubi/create/content/schematics/client/ClientSchematicLoader.java index 50c4b38589..c2908579ed 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/ClientSchematicLoader.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/ClientSchematicLoader.java @@ -23,7 +23,7 @@ import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.foundation.utility.FilesHelper; import com.simibubi.create.infrastructure.config.AllConfigs; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; import net.minecraft.network.chat.Component; diff --git a/src/main/java/com/simibubi/create/content/schematics/client/SchematicAndQuillHandler.java b/src/main/java/com/simibubi/create/content/schematics/client/SchematicAndQuillHandler.java index db72b88344..6c2cfc6413 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/SchematicAndQuillHandler.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/SchematicAndQuillHandler.java @@ -17,9 +17,9 @@ import com.simibubi.create.foundation.utility.RaycastHelper; import com.simibubi.create.foundation.utility.RaycastHelper.PredicateTraceResult; import net.createmod.catnip.gui.ScreenOpener; -import net.createmod.catnip.utility.AnimationTickHolder; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.outliner.Outliner; +import net.createmod.catnip.animation.AnimationTickHolder; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.outliner.Outliner; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; diff --git a/src/main/java/com/simibubi/create/content/schematics/client/SchematicEditScreen.java b/src/main/java/com/simibubi/create/content/schematics/client/SchematicEditScreen.java index ed41c0ad12..e5269dde82 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/SchematicEditScreen.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/SchematicEditScreen.java @@ -14,7 +14,7 @@ import com.simibubi.create.foundation.utility.CreateLang; import net.createmod.catnip.gui.AbstractSimiScreen; import net.createmod.catnip.gui.element.GuiGameElement; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.EditBox; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java b/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java index 2ba6dd68ef..ffe3c0217a 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java @@ -21,17 +21,16 @@ import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.utility.CreateLang; import net.createmod.catnip.render.SuperRenderTypeBuffer; -import net.createmod.catnip.utility.AnimationTickHolder; -import net.createmod.catnip.utility.NBTHelper; -import net.createmod.catnip.utility.levelWrappers.SchematicLevel; -import net.createmod.catnip.utility.outliner.AABBOutline; +import net.createmod.catnip.animation.AnimationTickHolder; +import net.createmod.catnip.nbt.NBTHelper; +import net.createmod.catnip.levelWrappers.SchematicLevel; +import net.createmod.catnip.outliner.AABBOutline; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.player.LocalPlayer; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction.Axis; import net.minecraft.core.Vec3i; -import net.minecraft.core.registries.Registries; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; import net.minecraft.nbt.Tag; diff --git a/src/main/java/com/simibubi/create/content/schematics/client/SchematicPromptScreen.java b/src/main/java/com/simibubi/create/content/schematics/client/SchematicPromptScreen.java index 4027c37a31..1170a85705 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/SchematicPromptScreen.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/SchematicPromptScreen.java @@ -11,7 +11,7 @@ import com.simibubi.create.foundation.utility.CreateLang; import net.createmod.catnip.gui.AbstractSimiScreen; import net.createmod.catnip.gui.element.GuiGameElement; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.EditBox; import net.minecraft.network.chat.Component; diff --git a/src/main/java/com/simibubi/create/content/schematics/client/SchematicRenderer.java b/src/main/java/com/simibubi/create/content/schematics/client/SchematicRenderer.java index 072885a5b9..7e9e401ae1 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/SchematicRenderer.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/SchematicRenderer.java @@ -9,7 +9,7 @@ import com.simibubi.create.foundation.render.BlockEntityRenderHelper; import net.createmod.catnip.render.ShadedBlockSbbBuilder; import net.createmod.catnip.render.SuperByteBuffer; import net.createmod.catnip.render.SuperRenderTypeBuffer; -import net.createmod.catnip.utility.levelWrappers.SchematicLevel; +import net.createmod.catnip.levelWrappers.SchematicLevel; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.BlockRenderDispatcher; diff --git a/src/main/java/com/simibubi/create/content/schematics/client/SchematicTransformation.java b/src/main/java/com/simibubi/create/content/schematics/client/SchematicTransformation.java index 3580ffcd11..0735a2f9c6 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/SchematicTransformation.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/SchematicTransformation.java @@ -5,10 +5,10 @@ import static java.lang.Math.abs; import com.mojang.blaze3d.vertex.PoseStack; import dev.engine_room.flywheel.lib.transform.TransformStack; -import net.createmod.catnip.utility.AnimationTickHolder; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.animation.LerpedFloat; -import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.animation.AnimationTickHolder; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.animation.LerpedFloat; +import net.createmod.catnip.animation.LerpedFloat.Chaser; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction.Axis; import net.minecraft.world.level.block.Mirror; diff --git a/src/main/java/com/simibubi/create/content/schematics/client/ToolSelectionScreen.java b/src/main/java/com/simibubi/create/content/schematics/client/ToolSelectionScreen.java index 21d188b8a2..8efbec004c 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/ToolSelectionScreen.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/ToolSelectionScreen.java @@ -11,7 +11,7 @@ import com.simibubi.create.content.schematics.client.tools.ToolType; import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.screens.Screen; diff --git a/src/main/java/com/simibubi/create/content/schematics/client/tools/DeployTool.java b/src/main/java/com/simibubi/create/content/schematics/client/tools/DeployTool.java index 48fb4ec62b..ec42b72c50 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/tools/DeployTool.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/tools/DeployTool.java @@ -6,8 +6,8 @@ import com.simibubi.create.content.schematics.client.SchematicTransformation; import dev.engine_room.flywheel.lib.transform.TransformStack; import net.createmod.catnip.render.SuperRenderTypeBuffer; -import net.createmod.catnip.utility.AnimationTickHolder; -import net.createmod.catnip.utility.outliner.AABBOutline; +import net.createmod.catnip.animation.AnimationTickHolder; +import net.createmod.catnip.outliner.AABBOutline; import net.minecraft.core.BlockPos; import net.minecraft.nbt.NbtUtils; import net.minecraft.util.Mth; diff --git a/src/main/java/com/simibubi/create/content/schematics/client/tools/FlipTool.java b/src/main/java/com/simibubi/create/content/schematics/client/tools/FlipTool.java index 978bf333da..3efe2dd2f5 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/tools/FlipTool.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/tools/FlipTool.java @@ -4,8 +4,8 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllSpecialTextures; import net.createmod.catnip.render.SuperRenderTypeBuffer; -import net.createmod.catnip.utility.AnimationTickHolder; -import net.createmod.catnip.utility.outliner.AABBOutline; +import net.createmod.catnip.animation.AnimationTickHolder; +import net.createmod.catnip.outliner.AABBOutline; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.AxisDirection; diff --git a/src/main/java/com/simibubi/create/content/schematics/client/tools/MoveTool.java b/src/main/java/com/simibubi/create/content/schematics/client/tools/MoveTool.java index f1b8a69bfd..4961935dc1 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/tools/MoveTool.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/tools/MoveTool.java @@ -2,7 +2,7 @@ package com.simibubi.create.content.schematics.client.tools; import com.simibubi.create.content.schematics.client.SchematicTransformation; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.core.Direction.Axis; import net.minecraft.world.phys.Vec3; diff --git a/src/main/java/com/simibubi/create/content/schematics/client/tools/RotateTool.java b/src/main/java/com/simibubi/create/content/schematics/client/tools/RotateTool.java index 83a7fe6f4a..045e046db1 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/tools/RotateTool.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/tools/RotateTool.java @@ -3,8 +3,8 @@ package com.simibubi.create.content.schematics.client.tools; import com.mojang.blaze3d.vertex.PoseStack; import net.createmod.catnip.render.SuperRenderTypeBuffer; -import net.createmod.catnip.utility.AnimationTickHolder; -import net.createmod.catnip.utility.outliner.LineOutline; +import net.createmod.catnip.animation.AnimationTickHolder; +import net.createmod.catnip.outliner.LineOutline; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; diff --git a/src/main/java/com/simibubi/create/content/schematics/client/tools/SchematicToolBase.java b/src/main/java/com/simibubi/create/content/schematics/client/tools/SchematicToolBase.java index aa05d78338..753d7a690f 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/tools/SchematicToolBase.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/tools/SchematicToolBase.java @@ -13,9 +13,9 @@ import com.simibubi.create.foundation.utility.RaycastHelper; import com.simibubi.create.foundation.utility.RaycastHelper.PredicateTraceResult; import net.createmod.catnip.render.SuperRenderTypeBuffer; -import net.createmod.catnip.utility.AnimationTickHolder; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.outliner.AABBOutline; +import net.createmod.catnip.animation.AnimationTickHolder; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.outliner.AABBOutline; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.player.LocalPlayer; diff --git a/src/main/java/com/simibubi/create/content/schematics/client/tools/ToolType.java b/src/main/java/com/simibubi/create/content/schematics/client/tools/ToolType.java index 4327acf138..e8d92d9255 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/tools/ToolType.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/tools/ToolType.java @@ -7,7 +7,7 @@ import java.util.List; import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.lang.Lang; +import net.createmod.catnip.lang.Lang; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; diff --git a/src/main/java/com/simibubi/create/content/schematics/requirement/ItemRequirement.java b/src/main/java/com/simibubi/create/content/schematics/requirement/ItemRequirement.java index 32eeaa6e29..1e90c3a54c 100644 --- a/src/main/java/com/simibubi/create/content/schematics/requirement/ItemRequirement.java +++ b/src/main/java/com/simibubi/create/content/schematics/requirement/ItemRequirement.java @@ -3,8 +3,6 @@ package com.simibubi.create.content.schematics.requirement; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.function.BiFunction; -import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -17,7 +15,7 @@ import com.simibubi.create.foundation.data.recipe.Mods; import com.simibubi.create.impl.schematic.requirement.SchematicRequirementsRegistryImpl; -import net.createmod.catnip.utility.NBTProcessors; +import net.createmod.catnip.nbt.NBTProcessors; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.decoration.ArmorStand; import net.minecraft.world.entity.decoration.ItemFrame; diff --git a/src/main/java/com/simibubi/create/content/schematics/table/SchematicTableScreen.java b/src/main/java/com/simibubi/create/content/schematics/table/SchematicTableScreen.java index 34874c174b..dde519b867 100644 --- a/src/main/java/com/simibubi/create/content/schematics/table/SchematicTableScreen.java +++ b/src/main/java/com/simibubi/create/content/schematics/table/SchematicTableScreen.java @@ -21,7 +21,7 @@ import com.simibubi.create.foundation.gui.widget.SelectionScrollInput; import com.simibubi.create.foundation.utility.CreateLang; import net.createmod.catnip.gui.element.GuiGameElement; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.Util; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.renderer.Rect2i; diff --git a/src/main/java/com/simibubi/create/content/trains/CameraDistanceModifier.java b/src/main/java/com/simibubi/create/content/trains/CameraDistanceModifier.java index f0eb5ff30b..685bd1112f 100644 --- a/src/main/java/com/simibubi/create/content/trains/CameraDistanceModifier.java +++ b/src/main/java/com/simibubi/create/content/trains/CameraDistanceModifier.java @@ -2,8 +2,8 @@ package com.simibubi.create.content.trains; import com.simibubi.create.infrastructure.config.AllConfigs; -import net.createmod.catnip.utility.AnimationTickHolder; -import net.createmod.catnip.utility.animation.LerpedFloat; +import net.createmod.catnip.animation.AnimationTickHolder; +import net.createmod.catnip.animation.LerpedFloat; public class CameraDistanceModifier { diff --git a/src/main/java/com/simibubi/create/content/trains/RailwaySavedData.java b/src/main/java/com/simibubi/create/content/trains/RailwaySavedData.java index f9284a8d4b..78feb99bae 100644 --- a/src/main/java/com/simibubi/create/content/trains/RailwaySavedData.java +++ b/src/main/java/com/simibubi/create/content/trains/RailwaySavedData.java @@ -15,7 +15,7 @@ import com.simibubi.create.content.trains.signal.SignalEdgeGroup; import com.simibubi.create.foundation.utility.SavedDataUtil; -import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.nbt.NBTHelper; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; import net.minecraft.server.MinecraftServer; diff --git a/src/main/java/com/simibubi/create/content/trains/TrainHUD.java b/src/main/java/com/simibubi/create/content/trains/TrainHUD.java index 12caa99ee8..f3f37b2308 100644 --- a/src/main/java/com/simibubi/create/content/trains/TrainHUD.java +++ b/src/main/java/com/simibubi/create/content/trains/TrainHUD.java @@ -11,10 +11,10 @@ import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.utility.ControlsUtil; import com.simibubi.create.infrastructure.config.AllConfigs; -import net.createmod.catnip.utility.animation.LerpedFloat; -import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; -import net.createmod.catnip.utility.math.AngleHelper; -import net.createmod.catnip.utility.placement.PlacementClient; +import net.createmod.catnip.animation.LerpedFloat; +import net.createmod.catnip.animation.LerpedFloat.Chaser; +import net.createmod.catnip.math.AngleHelper; +import net.createmod.catnip.placement.PlacementClient; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphics; diff --git a/src/main/java/com/simibubi/create/content/trains/bogey/AbstractBogeyBlock.java b/src/main/java/com/simibubi/create/content/trains/bogey/AbstractBogeyBlock.java index d57ee8c94e..7c43084755 100644 --- a/src/main/java/com/simibubi/create/content/trains/bogey/AbstractBogeyBlock.java +++ b/src/main/java/com/simibubi/create/content/trains/bogey/AbstractBogeyBlock.java @@ -29,7 +29,7 @@ import com.simibubi.create.foundation.block.ProperWaterloggedBlock; import com.simibubi.create.foundation.utility.CreateLang; import net.createmod.catnip.platform.CatnipServices; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/trains/bogey/AbstractBogeyBlockEntity.java b/src/main/java/com/simibubi/create/content/trains/bogey/AbstractBogeyBlockEntity.java index 98baf6f05e..b24fde4a2c 100644 --- a/src/main/java/com/simibubi/create/content/trains/bogey/AbstractBogeyBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/trains/bogey/AbstractBogeyBlockEntity.java @@ -7,8 +7,8 @@ import org.jetbrains.annotations.NotNull; import com.simibubi.create.AllBogeyStyles; import com.simibubi.create.foundation.blockEntity.CachedRenderBBBlockEntity; -import net.createmod.catnip.utility.NBTHelper; -import net.createmod.catnip.utility.animation.LerpedFloat; +import net.createmod.catnip.nbt.NBTHelper; +import net.createmod.catnip.animation.LerpedFloat; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; diff --git a/src/main/java/com/simibubi/create/content/trains/bogey/StandardBogeyRenderer.java b/src/main/java/com/simibubi/create/content/trains/bogey/StandardBogeyRenderer.java index f1cab2876e..fbd23291ce 100644 --- a/src/main/java/com/simibubi/create/content/trains/bogey/StandardBogeyRenderer.java +++ b/src/main/java/com/simibubi/create/content/trains/bogey/StandardBogeyRenderer.java @@ -8,8 +8,8 @@ import com.simibubi.create.content.kinetics.simpleRelays.ShaftBlock; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.math.AngleHelper; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/trains/bogey/StandardBogeyVisual.java b/src/main/java/com/simibubi/create/content/trains/bogey/StandardBogeyVisual.java index 40bfee9c31..22b72d47b5 100644 --- a/src/main/java/com/simibubi/create/content/trains/bogey/StandardBogeyVisual.java +++ b/src/main/java/com/simibubi/create/content/trains/bogey/StandardBogeyVisual.java @@ -14,7 +14,7 @@ import dev.engine_room.flywheel.api.visualization.VisualizationContext; import dev.engine_room.flywheel.lib.instance.InstanceTypes; import dev.engine_room.flywheel.lib.instance.TransformedInstance; import dev.engine_room.flywheel.lib.model.Models; -import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.math.AngleHelper; import net.createmod.ponder.render.VirtualRenderHelper; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/trains/display/FlapDisplayBlock.java b/src/main/java/com/simibubi/create/content/trains/display/FlapDisplayBlock.java index 975f882416..5509129da4 100644 --- a/src/main/java/com/simibubi/create/content/trains/display/FlapDisplayBlock.java +++ b/src/main/java/com/simibubi/create/content/trains/display/FlapDisplayBlock.java @@ -15,11 +15,11 @@ import com.simibubi.create.content.kinetics.base.KineticBlockEntity; import com.simibubi.create.content.kinetics.simpleRelays.ICogWheel; import com.simibubi.create.foundation.block.IBE; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.lang.Components; -import net.createmod.catnip.utility.placement.IPlacementHelper; -import net.createmod.catnip.utility.placement.PlacementHelpers; -import net.createmod.catnip.utility.placement.PlacementOffset; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.lang.Components; +import net.createmod.catnip.placement.IPlacementHelper; +import net.createmod.catnip.placement.PlacementHelpers; +import net.createmod.catnip.placement.PlacementOffset; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; diff --git a/src/main/java/com/simibubi/create/content/trains/display/FlapDisplayBlockEntity.java b/src/main/java/com/simibubi/create/content/trains/display/FlapDisplayBlockEntity.java index 3515742534..2f79ec4bb5 100644 --- a/src/main/java/com/simibubi/create/content/trains/display/FlapDisplayBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/trains/display/FlapDisplayBlockEntity.java @@ -11,8 +11,8 @@ import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour import com.simibubi.create.foundation.utility.DyeHelper; import com.simibubi.create.foundation.utility.DynamicComponent; -import net.createmod.catnip.utility.NBTHelper; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.nbt.NBTHelper; +import net.createmod.catnip.lang.Components; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/content/trains/display/FlapDisplayLayout.java b/src/main/java/com/simibubi/create/content/trains/display/FlapDisplayLayout.java index b06daf4b7d..63d73b3238 100644 --- a/src/main/java/com/simibubi/create/content/trains/display/FlapDisplayLayout.java +++ b/src/main/java/com/simibubi/create/content/trains/display/FlapDisplayLayout.java @@ -5,7 +5,7 @@ import java.util.List; import org.apache.commons.lang3.mutable.MutableInt; -import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.nbt.NBTHelper; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; diff --git a/src/main/java/com/simibubi/create/content/trains/display/FlapDisplayRenderer.java b/src/main/java/com/simibubi/create/content/trains/display/FlapDisplayRenderer.java index 31809cd1ec..65c289c582 100644 --- a/src/main/java/com/simibubi/create/content/trains/display/FlapDisplayRenderer.java +++ b/src/main/java/com/simibubi/create/content/trains/display/FlapDisplayRenderer.java @@ -2,6 +2,7 @@ package com.simibubi.create.content.trains.display; import java.util.List; +import net.createmod.catnip.animation.AnimationTickHolder; import org.joml.Matrix4f; import com.mojang.blaze3d.font.GlyphInfo; @@ -14,8 +15,7 @@ import com.simibubi.create.content.kinetics.base.KineticBlockEntityRenderer; import dev.engine_room.flywheel.lib.transform.TransformStack; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; -import net.createmod.catnip.utility.math.AngleHelper; -import net.createmod.ponder.utility.LevelTickHolder; +import net.createmod.catnip.math.AngleHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.font.FontSet; @@ -86,7 +86,7 @@ public class FlapDisplayRenderer extends KineticBlockEntityRenderer { diff --git a/src/main/java/com/simibubi/create/content/trains/entity/CarriageCouplingRenderer.java b/src/main/java/com/simibubi/create/content/trains/entity/CarriageCouplingRenderer.java index 9640311fad..2299495cbd 100644 --- a/src/main/java/com/simibubi/create/content/trains/entity/CarriageCouplingRenderer.java +++ b/src/main/java/com/simibubi/create/content/trains/entity/CarriageCouplingRenderer.java @@ -9,8 +9,8 @@ import com.simibubi.create.AllPartialModels; import com.simibubi.create.CreateClient; import net.createmod.catnip.render.CachedBuffers; -import net.createmod.catnip.utility.AnimationTickHolder; -import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.animation.AnimationTickHolder; +import net.createmod.catnip.math.AngleHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.MultiBufferSource; diff --git a/src/main/java/com/simibubi/create/content/trains/entity/CarriageParticles.java b/src/main/java/com/simibubi/create/content/trains/entity/CarriageParticles.java index 515cf1b8d6..ae91071c10 100644 --- a/src/main/java/com/simibubi/create/content/trains/entity/CarriageParticles.java +++ b/src/main/java/com/simibubi/create/content/trains/entity/CarriageParticles.java @@ -2,10 +2,10 @@ package com.simibubi.create.content.trains.entity; import com.simibubi.create.content.trains.entity.Carriage.DimensionalCarriageEntity; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.animation.LerpedFloat; -import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.animation.LerpedFloat; +import net.createmod.catnip.animation.LerpedFloat.Chaser; import net.minecraft.client.Minecraft; import net.minecraft.core.Direction.Axis; import net.minecraft.util.RandomSource; diff --git a/src/main/java/com/simibubi/create/content/trains/entity/CarriageSounds.java b/src/main/java/com/simibubi/create/content/trains/entity/CarriageSounds.java index 79f73ff747..ee2a60d950 100644 --- a/src/main/java/com/simibubi/create/content/trains/entity/CarriageSounds.java +++ b/src/main/java/com/simibubi/create/content/trains/entity/CarriageSounds.java @@ -4,9 +4,9 @@ import com.simibubi.create.AllSoundEvents; import com.simibubi.create.AllSoundEvents.SoundEntry; import com.simibubi.create.content.trains.entity.Carriage.DimensionalCarriageEntity; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.animation.LerpedFloat; -import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.animation.LerpedFloat; +import net.createmod.catnip.animation.LerpedFloat.Chaser; import net.minecraft.client.Minecraft; import net.minecraft.client.resources.sounds.AbstractTickableSoundInstance; import net.minecraft.client.resources.sounds.SoundInstance; diff --git a/src/main/java/com/simibubi/create/content/trains/entity/CarriageSyncData.java b/src/main/java/com/simibubi/create/content/trains/entity/CarriageSyncData.java index 1a3eb7a4b7..af6beea214 100644 --- a/src/main/java/com/simibubi/create/content/trains/entity/CarriageSyncData.java +++ b/src/main/java/com/simibubi/create/content/trains/entity/CarriageSyncData.java @@ -20,10 +20,10 @@ import com.simibubi.create.content.trains.graph.TrackGraph; import com.simibubi.create.content.trains.graph.TrackNode; import com.simibubi.create.foundation.utility.ServerSpeedProvider; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.Pair; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.data.Pair; +import net.createmod.catnip.math.VecHelper; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.util.Mth; import net.minecraft.world.phys.Vec3; @@ -304,11 +304,11 @@ public class CarriageSyncData { TrackNode initialNode1 = forward ? current.node1 : current.node2; TrackNode initialNode2 = forward ? current.node2 : current.node1; - + Map connectionsFromInitial = graph.getConnectionsFrom(initialNode1); if (connectionsFromInitial == null) return -1; - + TrackEdge initialEdge = connectionsFromInitial.get(initialNode2); if (initialEdge == null) return -1; // graph changed diff --git a/src/main/java/com/simibubi/create/content/trains/entity/Navigation.java b/src/main/java/com/simibubi/create/content/trains/entity/Navigation.java index 273bfc0b26..40c351f51d 100644 --- a/src/main/java/com/simibubi/create/content/trains/entity/Navigation.java +++ b/src/main/java/com/simibubi/create/content/trains/entity/Navigation.java @@ -36,10 +36,10 @@ import com.simibubi.create.content.trains.station.GlobalStation; import com.simibubi.create.content.trains.track.BezierConnection; import com.simibubi.create.content.trains.track.TrackMaterial; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.NBTHelper; -import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.nbt.NBTHelper; +import net.createmod.catnip.data.Pair; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; import net.minecraft.util.Mth; @@ -265,7 +265,7 @@ public class Navigation { if (targetDistance < 10) { double maxApproachSpeed = topSpeed * ((targetDistance) / 10); double speedRelativeToStation = train.speed * speedMod; - + if (speedRelativeToStation > maxApproachSpeed) { train.speed += (maxApproachSpeed - Math.abs(train.speed)) * .5f * speedMod; return; diff --git a/src/main/java/com/simibubi/create/content/trains/entity/Train.java b/src/main/java/com/simibubi/create/content/trains/entity/Train.java index 292e59e891..11a150f316 100644 --- a/src/main/java/com/simibubi/create/content/trains/entity/Train.java +++ b/src/main/java/com/simibubi/create/content/trains/entity/Train.java @@ -49,11 +49,11 @@ import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.infrastructure.config.AllConfigs; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.NBTHelper; -import net.createmod.catnip.utility.Pair; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.nbt.NBTHelper; +import net.createmod.catnip.data.Pair; +import net.createmod.catnip.math.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -269,7 +269,7 @@ public class Train { updateConductors(); return; } - + GlobalStation currentStation = getCurrentStation(); if (currentStation != null) { ticksSinceLastMailTransfer++; diff --git a/src/main/java/com/simibubi/create/content/trains/entity/TrainMigration.java b/src/main/java/com/simibubi/create/content/trains/entity/TrainMigration.java index 9e34d426d2..e2f442fdb7 100644 --- a/src/main/java/com/simibubi/create/content/trains/entity/TrainMigration.java +++ b/src/main/java/com/simibubi/create/content/trains/entity/TrainMigration.java @@ -9,8 +9,8 @@ import com.simibubi.create.content.trains.graph.TrackGraphLocation; import com.simibubi.create.content.trains.graph.TrackNode; import com.simibubi.create.content.trains.graph.TrackNodeLocation; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.math.VecHelper; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; import net.minecraft.util.Mth; diff --git a/src/main/java/com/simibubi/create/content/trains/entity/TrainPacket.java b/src/main/java/com/simibubi/create/content/trains/entity/TrainPacket.java index d2055e23d3..ddbbf9adfd 100644 --- a/src/main/java/com/simibubi/create/content/trains/entity/TrainPacket.java +++ b/src/main/java/com/simibubi/create/content/trains/entity/TrainPacket.java @@ -10,8 +10,8 @@ import com.simibubi.create.content.trains.bogey.AbstractBogeyBlock; import com.simibubi.create.foundation.networking.SimplePacketBase; import net.createmod.catnip.platform.CatnipServices; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.data.Iterate; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; diff --git a/src/main/java/com/simibubi/create/content/trains/entity/TrainRelocationPacket.java b/src/main/java/com/simibubi/create/content/trains/entity/TrainRelocationPacket.java index de6198e042..40d7cca6e9 100644 --- a/src/main/java/com/simibubi/create/content/trains/entity/TrainRelocationPacket.java +++ b/src/main/java/com/simibubi/create/content/trains/entity/TrainRelocationPacket.java @@ -10,7 +10,7 @@ import com.simibubi.create.foundation.networking.SimplePacketBase; import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.infrastructure.config.AllConfigs; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.network.FriendlyByteBuf; diff --git a/src/main/java/com/simibubi/create/content/trains/entity/TrainRelocator.java b/src/main/java/com/simibubi/create/content/trains/entity/TrainRelocator.java index 6004d09a7b..d3b6d2fce3 100644 --- a/src/main/java/com/simibubi/create/content/trains/entity/TrainRelocator.java +++ b/src/main/java/com/simibubi/create/content/trains/entity/TrainRelocator.java @@ -33,9 +33,9 @@ import com.simibubi.create.content.trains.track.TrackBlockOutline.BezierPointSel import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.Pair; -import net.createmod.catnip.utility.outliner.Outliner; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.data.Pair; +import net.createmod.catnip.outliner.Outliner; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; diff --git a/src/main/java/com/simibubi/create/content/trains/entity/TrainStatus.java b/src/main/java/com/simibubi/create/content/trains/entity/TrainStatus.java index ee8f7c120b..92e7d2335a 100644 --- a/src/main/java/com/simibubi/create/content/trains/entity/TrainStatus.java +++ b/src/main/java/com/simibubi/create/content/trains/entity/TrainStatus.java @@ -8,7 +8,7 @@ import java.util.stream.Stream; import com.google.common.collect.Streams; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; @@ -44,7 +44,7 @@ public class TrainStatus { displayInformation("no_match", false, filter); navigation = true; } - + public void failedPackageNoTarget(String address) { if (navigation) return; diff --git a/src/main/java/com/simibubi/create/content/trains/entity/TravellingPoint.java b/src/main/java/com/simibubi/create/content/trains/entity/TravellingPoint.java index 8b5a0c091b..73cca1b6d4 100644 --- a/src/main/java/com/simibubi/create/content/trains/entity/TravellingPoint.java +++ b/src/main/java/com/simibubi/create/content/trains/entity/TravellingPoint.java @@ -25,8 +25,8 @@ import com.simibubi.create.content.trains.graph.TrackNode; import com.simibubi.create.content.trains.graph.TrackNodeLocation; import com.simibubi.create.content.trains.signal.TrackEdgePoint; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.data.Pair; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; import net.minecraft.util.Mth; diff --git a/src/main/java/com/simibubi/create/content/trains/graph/DimensionPalette.java b/src/main/java/com/simibubi/create/content/trains/graph/DimensionPalette.java index c6bba4c992..8d4b4b6b0f 100644 --- a/src/main/java/com/simibubi/create/content/trains/graph/DimensionPalette.java +++ b/src/main/java/com/simibubi/create/content/trains/graph/DimensionPalette.java @@ -3,7 +3,7 @@ package com.simibubi.create.content.trains.graph; import java.util.ArrayList; import java.util.List; -import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.nbt.NBTHelper; import net.minecraft.core.registries.Registries; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; diff --git a/src/main/java/com/simibubi/create/content/trains/graph/DiscoveredPath.java b/src/main/java/com/simibubi/create/content/trains/graph/DiscoveredPath.java index 6c5634c090..77dafc7735 100644 --- a/src/main/java/com/simibubi/create/content/trains/graph/DiscoveredPath.java +++ b/src/main/java/com/simibubi/create/content/trains/graph/DiscoveredPath.java @@ -4,7 +4,7 @@ import java.util.List; import com.simibubi.create.content.trains.station.GlobalStation; -import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.data.Couple; public class DiscoveredPath { public List> path; diff --git a/src/main/java/com/simibubi/create/content/trains/graph/EdgeData.java b/src/main/java/com/simibubi/create/content/trains/graph/EdgeData.java index 265f7b793a..e8223d281c 100644 --- a/src/main/java/com/simibubi/create/content/trains/graph/EdgeData.java +++ b/src/main/java/com/simibubi/create/content/trains/graph/EdgeData.java @@ -14,8 +14,8 @@ import com.simibubi.create.content.trains.signal.SignalBoundary; import com.simibubi.create.content.trains.signal.SignalEdgeGroup; import com.simibubi.create.content.trains.signal.TrackEdgePoint; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.nbt.NBTHelper; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; import net.minecraft.resources.ResourceLocation; diff --git a/src/main/java/com/simibubi/create/content/trains/graph/EdgePointManager.java b/src/main/java/com/simibubi/create/content/trains/graph/EdgePointManager.java index 0644542bfd..ce559457a4 100644 --- a/src/main/java/com/simibubi/create/content/trains/graph/EdgePointManager.java +++ b/src/main/java/com/simibubi/create/content/trains/graph/EdgePointManager.java @@ -3,8 +3,8 @@ package com.simibubi.create.content.trains.graph; import com.simibubi.create.Create; import com.simibubi.create.content.trains.signal.TrackEdgePoint; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.data.Iterate; public class EdgePointManager { diff --git a/src/main/java/com/simibubi/create/content/trains/graph/EdgePointStorage.java b/src/main/java/com/simibubi/create/content/trains/graph/EdgePointStorage.java index 2efdd0fa0f..9b26f4a25f 100644 --- a/src/main/java/com/simibubi/create/content/trains/graph/EdgePointStorage.java +++ b/src/main/java/com/simibubi/create/content/trains/graph/EdgePointStorage.java @@ -9,7 +9,7 @@ import java.util.UUID; import com.simibubi.create.Create; import com.simibubi.create.content.trains.signal.TrackEdgePoint; -import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.nbt.NBTHelper; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; diff --git a/src/main/java/com/simibubi/create/content/trains/graph/TrackEdge.java b/src/main/java/com/simibubi/create/content/trains/graph/TrackEdge.java index c664b5f743..1208163396 100644 --- a/src/main/java/com/simibubi/create/content/trains/graph/TrackEdge.java +++ b/src/main/java/com/simibubi/create/content/trains/graph/TrackEdge.java @@ -10,7 +10,7 @@ import com.google.common.collect.ImmutableList; import com.simibubi.create.content.trains.track.BezierConnection; import com.simibubi.create.content.trains.track.TrackMaterial; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction.Axis; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/trains/graph/TrackEdgeIntersection.java b/src/main/java/com/simibubi/create/content/trains/graph/TrackEdgeIntersection.java index 1c5bfb64f6..ec9059dd01 100644 --- a/src/main/java/com/simibubi/create/content/trains/graph/TrackEdgeIntersection.java +++ b/src/main/java/com/simibubi/create/content/trains/graph/TrackEdgeIntersection.java @@ -2,7 +2,7 @@ package com.simibubi.create.content.trains.graph; import java.util.UUID; -import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.data.Couple; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; diff --git a/src/main/java/com/simibubi/create/content/trains/graph/TrackGraph.java b/src/main/java/com/simibubi/create/content/trains/graph/TrackGraph.java index 5b076be123..53eb1572fc 100644 --- a/src/main/java/com/simibubi/create/content/trains/graph/TrackGraph.java +++ b/src/main/java/com/simibubi/create/content/trains/graph/TrackGraph.java @@ -26,11 +26,11 @@ import com.simibubi.create.content.trains.signal.TrackEdgePoint; import com.simibubi.create.content.trains.track.BezierConnection; import com.simibubi.create.content.trains.track.TrackMaterial; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.NBTHelper; -import net.createmod.catnip.utility.Pair; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.theme.Color; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.nbt.NBTHelper; +import net.createmod.catnip.data.Pair; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.theme.Color; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; diff --git a/src/main/java/com/simibubi/create/content/trains/graph/TrackGraphHelper.java b/src/main/java/com/simibubi/create/content/trains/graph/TrackGraphHelper.java index 1343277df9..6edac3aed1 100644 --- a/src/main/java/com/simibubi/create/content/trains/graph/TrackGraphHelper.java +++ b/src/main/java/com/simibubi/create/content/trains/graph/TrackGraphHelper.java @@ -13,7 +13,7 @@ import com.simibubi.create.content.trains.track.BezierTrackPointLocation; import com.simibubi.create.content.trains.track.ITrackBlock; import com.simibubi.create.content.trains.track.TrackBlockEntity; -import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.data.Couple; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction.AxisDirection; import net.minecraft.world.level.Level; diff --git a/src/main/java/com/simibubi/create/content/trains/graph/TrackGraphLocation.java b/src/main/java/com/simibubi/create/content/trains/graph/TrackGraphLocation.java index 8cd441d186..a43223735f 100644 --- a/src/main/java/com/simibubi/create/content/trains/graph/TrackGraphLocation.java +++ b/src/main/java/com/simibubi/create/content/trains/graph/TrackGraphLocation.java @@ -1,6 +1,6 @@ package com.simibubi.create.content.trains.graph; -import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.data.Couple; public class TrackGraphLocation { diff --git a/src/main/java/com/simibubi/create/content/trains/graph/TrackGraphSync.java b/src/main/java/com/simibubi/create/content/trains/graph/TrackGraphSync.java index 7db6d9123c..f4f11aee46 100644 --- a/src/main/java/com/simibubi/create/content/trains/graph/TrackGraphSync.java +++ b/src/main/java/com/simibubi/create/content/trains/graph/TrackGraphSync.java @@ -15,8 +15,8 @@ import com.simibubi.create.content.trains.signal.EdgeGroupColor; import com.simibubi.create.content.trains.signal.SignalEdgeGroupPacket; import com.simibubi.create.content.trains.signal.TrackEdgePoint; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.data.Pair; import net.minecraft.server.level.ServerPlayer; import net.minecraftforge.network.PacketDistributor; diff --git a/src/main/java/com/simibubi/create/content/trains/graph/TrackGraphSyncPacket.java b/src/main/java/com/simibubi/create/content/trains/graph/TrackGraphSyncPacket.java index e5ce62fe75..2d9eb74f20 100644 --- a/src/main/java/com/simibubi/create/content/trains/graph/TrackGraphSyncPacket.java +++ b/src/main/java/com/simibubi/create/content/trains/graph/TrackGraphSyncPacket.java @@ -14,9 +14,9 @@ import com.simibubi.create.content.trains.signal.TrackEdgePoint; import com.simibubi.create.content.trains.track.BezierConnection; import com.simibubi.create.content.trains.track.TrackMaterial; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.Pair; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.data.Pair; +import net.createmod.catnip.math.VecHelper; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.phys.Vec3; @@ -172,7 +172,7 @@ public class TrackGraphSyncPacket extends TrackGraphPacket { @Override protected void handle(GlobalRailwayManager manager, TrackGraph graph) { manager.version++; - + if (packetDeletesGraph) { manager.removeGraph(graph); return; diff --git a/src/main/java/com/simibubi/create/content/trains/graph/TrackGraphVisualizer.java b/src/main/java/com/simibubi/create/content/trains/graph/TrackGraphVisualizer.java index be4e12f435..214c83b47e 100644 --- a/src/main/java/com/simibubi/create/content/trains/graph/TrackGraphVisualizer.java +++ b/src/main/java/com/simibubi/create/content/trains/graph/TrackGraphVisualizer.java @@ -14,9 +14,9 @@ import com.simibubi.create.content.trains.signal.SignalEdgeGroup; import com.simibubi.create.content.trains.signal.TrackEdgePoint; import com.simibubi.create.content.trains.track.BezierConnection; -import net.createmod.catnip.utility.Pair; -import net.createmod.catnip.utility.outliner.Outliner; -import net.createmod.catnip.utility.theme.Color; +import net.createmod.catnip.data.Pair; +import net.createmod.catnip.outliner.Outliner; +import net.createmod.catnip.theme.Color; import net.minecraft.client.Minecraft; import net.minecraft.world.entity.Entity; import net.minecraft.world.phys.AABB; diff --git a/src/main/java/com/simibubi/create/content/trains/graph/TrackNodeLocation.java b/src/main/java/com/simibubi/create/content/trains/graph/TrackNodeLocation.java index 81b2f667d6..1e453dca97 100644 --- a/src/main/java/com/simibubi/create/content/trains/graph/TrackNodeLocation.java +++ b/src/main/java/com/simibubi/create/content/trains/graph/TrackNodeLocation.java @@ -8,7 +8,7 @@ import java.util.Set; import com.simibubi.create.content.trains.track.BezierConnection; import com.simibubi.create.content.trains.track.TrackMaterial; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Vec3i; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/DestinationSuggestions.java b/src/main/java/com/simibubi/create/content/trains/schedule/DestinationSuggestions.java index fb71e940d5..495055f246 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/DestinationSuggestions.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/DestinationSuggestions.java @@ -6,7 +6,7 @@ import java.util.List; import com.mojang.brigadier.context.StringRange; import com.mojang.brigadier.suggestion.Suggestion; -import net.createmod.catnip.utility.IntAttached; +import net.createmod.catnip.data.IntAttached; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.components.CommandSuggestions; @@ -81,7 +81,7 @@ public class DestinationSuggestions extends CommandSuggestions { int x = Mth.clamp(textBox.getScreenX(0), 0, textBox.getScreenX(0) + textBox.getInnerWidth() - width); suggestions = new CommandSuggestions.SuggestionsList(x, 72 + yOffset, width, currentSuggestions, false); } - + public boolean isEmpty() { return viableStations.isEmpty(); } diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/IScheduleInput.java b/src/main/java/com/simibubi/create/content/trains/schedule/IScheduleInput.java index e4cbd985f5..779a5cc133 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/IScheduleInput.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/IScheduleInput.java @@ -7,8 +7,8 @@ import javax.annotation.Nullable; import com.google.common.collect.ImmutableList; import com.simibubi.create.foundation.gui.ModularGuiLineBuilder; -import net.createmod.catnip.utility.Pair; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.data.Pair; +import net.createmod.catnip.lang.Components; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/Schedule.java b/src/main/java/com/simibubi/create/content/trains/schedule/Schedule.java index b50407d4e6..d8e88e86ce 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/Schedule.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/Schedule.java @@ -22,9 +22,9 @@ import com.simibubi.create.content.trains.schedule.destination.DestinationInstru import com.simibubi.create.content.trains.schedule.destination.FetchPackagesInstruction; import com.simibubi.create.content.trains.schedule.destination.ScheduleInstruction; -import net.createmod.catnip.utility.NBTHelper; -import net.createmod.catnip.utility.Pair; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.nbt.NBTHelper; +import net.createmod.catnip.data.Pair; +import net.createmod.catnip.lang.Components; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleEntry.java b/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleEntry.java index 9251cd5d6b..83239e8236 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleEntry.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleEntry.java @@ -6,7 +6,7 @@ import java.util.List; import com.simibubi.create.content.trains.schedule.condition.ScheduleWaitCondition; import com.simibubi.create.content.trains.schedule.destination.ScheduleInstruction; -import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.nbt.NBTHelper; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleItem.java b/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleItem.java index 52c3b60481..e7b509458b 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleItem.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleItem.java @@ -12,8 +12,8 @@ import com.simibubi.create.content.trains.schedule.destination.DestinationInstru import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleItemEntityInteraction.java b/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleItemEntityInteraction.java index eb285fb32a..9d90cd83ea 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleItemEntityInteraction.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleItemEntityInteraction.java @@ -8,7 +8,7 @@ import com.simibubi.create.content.trains.entity.CarriageContraptionEntity; import com.simibubi.create.content.trains.entity.Train; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.data.Couple; import net.minecraft.core.BlockPos; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleRuntime.java b/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleRuntime.java index e0595c913a..aad5dcf717 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleRuntime.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleRuntime.java @@ -17,8 +17,8 @@ import com.simibubi.create.content.trains.schedule.destination.DestinationInstru import com.simibubi.create.content.trains.schedule.destination.ScheduleInstruction; import com.simibubi.create.content.trains.station.GlobalStation; -import net.createmod.catnip.utility.NBTHelper; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.nbt.NBTHelper; +import net.createmod.catnip.lang.Components; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; import net.minecraft.network.chat.MutableComponent; @@ -43,7 +43,7 @@ public class ScheduleRuntime { public boolean completed; public int currentEntry; public State state; - + public List conditionProgress; public List conditionContext; public String currentTitle; @@ -52,7 +52,7 @@ public class ScheduleRuntime { public List predictionTicks; public boolean displayLinkUpdateRequested; - + private static final int INTERVAL = 40; private int cooldown; @@ -60,7 +60,7 @@ public class ScheduleRuntime { this.train = train; reset(); } - + public void startCooldown() { cooldown = INTERVAL; } @@ -146,13 +146,13 @@ public class ScheduleRuntime { public void tickConditions(Level level) { ScheduleEntry entry = schedule.entries.get(currentEntry); List> conditions = entry.conditions; - + if (!entry.instruction.supportsConditions()) { state = State.PRE_TRANSIT; currentEntry++; return; } - + for (int i = 0; i < conditions.size(); i++) { List list = conditions.get(i); int progress = conditionProgress.get(i); diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleScreen.java b/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleScreen.java index ee453212e1..09e2c1ae62 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleScreen.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleScreen.java @@ -41,11 +41,11 @@ import com.simibubi.create.foundation.utility.CreateLang; import dev.engine_room.flywheel.lib.transform.TransformStack; import net.createmod.catnip.gui.UIRenderHelper; import net.createmod.catnip.gui.element.GuiGameElement; -import net.createmod.catnip.utility.IntAttached; -import net.createmod.catnip.utility.Pair; -import net.createmod.catnip.utility.animation.LerpedFloat; -import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.data.IntAttached; +import net.createmod.catnip.data.Pair; +import net.createmod.catnip.animation.LerpedFloat; +import net.createmod.catnip.animation.LerpedFloat.Chaser; +import net.createmod.catnip.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphics; diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/condition/CargoThresholdCondition.java b/src/main/java/com/simibubi/create/content/trains/schedule/condition/CargoThresholdCondition.java index 503087bee3..13d0162324 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/condition/CargoThresholdCondition.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/condition/CargoThresholdCondition.java @@ -9,9 +9,9 @@ import com.simibubi.create.content.trains.entity.Train; import com.simibubi.create.foundation.gui.ModularGuiLineBuilder; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.Pair; -import net.createmod.catnip.utility.lang.Components; -import net.createmod.catnip.utility.lang.Lang; +import net.createmod.catnip.data.Pair; +import net.createmod.catnip.lang.Components; +import net.createmod.catnip.lang.Lang; import net.minecraft.ChatFormatting; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/condition/FluidThresholdCondition.java b/src/main/java/com/simibubi/create/content/trains/schedule/condition/FluidThresholdCondition.java index 02cc0027b1..6b9d5740be 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/condition/FluidThresholdCondition.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/condition/FluidThresholdCondition.java @@ -10,8 +10,8 @@ import com.simibubi.create.content.trains.entity.Train; import com.simibubi.create.foundation.gui.ModularGuiLineBuilder; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.lang.Components; -import net.createmod.catnip.utility.lang.Lang; +import net.createmod.catnip.lang.Components; +import net.createmod.catnip.lang.Lang; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/condition/IdleCargoCondition.java b/src/main/java/com/simibubi/create/content/trains/schedule/condition/IdleCargoCondition.java index f582eb1d7d..0ed6eef95a 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/condition/IdleCargoCondition.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/condition/IdleCargoCondition.java @@ -5,7 +5,7 @@ import com.simibubi.create.content.trains.entity.Carriage; import com.simibubi.create.content.trains.entity.Train; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.data.Pair; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/condition/ItemThresholdCondition.java b/src/main/java/com/simibubi/create/content/trains/schedule/condition/ItemThresholdCondition.java index 7705445213..31a6132f4a 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/condition/ItemThresholdCondition.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/condition/ItemThresholdCondition.java @@ -10,8 +10,8 @@ import com.simibubi.create.content.trains.entity.Train; import com.simibubi.create.foundation.gui.ModularGuiLineBuilder; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.lang.Components; -import net.createmod.catnip.utility.lang.Lang; +import net.createmod.catnip.lang.Components; +import net.createmod.catnip.lang.Lang; import net.minecraft.ChatFormatting; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/condition/PlayerPassengerCondition.java b/src/main/java/com/simibubi/create/content/trains/schedule/condition/PlayerPassengerCondition.java index 462b0ef549..d76c2ee4f6 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/condition/PlayerPassengerCondition.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/condition/PlayerPassengerCondition.java @@ -9,8 +9,8 @@ import com.simibubi.create.content.trains.entity.Train; import com.simibubi.create.foundation.gui.ModularGuiLineBuilder; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.Pair; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.data.Pair; +import net.createmod.catnip.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/condition/RedstoneLinkCondition.java b/src/main/java/com/simibubi/create/content/trains/schedule/condition/RedstoneLinkCondition.java index 7f35b8dfd5..0a9dba3daf 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/condition/RedstoneLinkCondition.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/condition/RedstoneLinkCondition.java @@ -10,9 +10,9 @@ import com.simibubi.create.content.trains.entity.Train; import com.simibubi.create.foundation.gui.ModularGuiLineBuilder; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.Pair; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.data.Pair; +import net.createmod.catnip.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/condition/ScheduleWaitCondition.java b/src/main/java/com/simibubi/create/content/trains/schedule/condition/ScheduleWaitCondition.java index ea9d235a82..f65a23dd19 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/condition/ScheduleWaitCondition.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/condition/ScheduleWaitCondition.java @@ -7,7 +7,7 @@ import com.simibubi.create.content.trains.entity.Train; import com.simibubi.create.content.trains.schedule.Schedule; import com.simibubi.create.content.trains.schedule.ScheduleDataEntry; -import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.data.Pair; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.MutableComponent; import net.minecraft.resources.ResourceLocation; diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/condition/ScheduledDelay.java b/src/main/java/com/simibubi/create/content/trains/schedule/condition/ScheduledDelay.java index 1246f273e3..8d26748e7b 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/condition/ScheduledDelay.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/condition/ScheduledDelay.java @@ -4,7 +4,7 @@ import com.simibubi.create.Create; import com.simibubi.create.content.trains.entity.Train; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.data.Pair; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/condition/StationPoweredCondition.java b/src/main/java/com/simibubi/create/content/trains/schedule/condition/StationPoweredCondition.java index bb0b5477bf..ad5f469cad 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/condition/StationPoweredCondition.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/condition/StationPoweredCondition.java @@ -5,7 +5,7 @@ import com.simibubi.create.content.trains.entity.Train; import com.simibubi.create.content.trains.station.GlobalStation; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.data.Pair; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/condition/StationUnloadedCondition.java b/src/main/java/com/simibubi/create/content/trains/schedule/condition/StationUnloadedCondition.java index 96484b27c3..c4d50b90a6 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/condition/StationUnloadedCondition.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/condition/StationUnloadedCondition.java @@ -5,7 +5,7 @@ import com.simibubi.create.content.trains.entity.Train; import com.simibubi.create.content.trains.station.GlobalStation; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.data.Pair; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/condition/TimeOfDayCondition.java b/src/main/java/com/simibubi/create/content/trains/schedule/condition/TimeOfDayCondition.java index ab708b650e..51bb5efd78 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/condition/TimeOfDayCondition.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/condition/TimeOfDayCondition.java @@ -12,8 +12,8 @@ import com.simibubi.create.foundation.gui.widget.Label; import com.simibubi.create.foundation.gui.widget.ScrollInput; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.Pair; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.data.Pair; +import net.createmod.catnip.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/condition/TimedWaitCondition.java b/src/main/java/com/simibubi/create/content/trains/schedule/condition/TimedWaitCondition.java index 34e52f8a58..bcef265980 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/condition/TimedWaitCondition.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/condition/TimedWaitCondition.java @@ -7,7 +7,7 @@ import com.simibubi.create.content.trains.entity.Train; import com.simibubi.create.foundation.gui.ModularGuiLineBuilder; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/destination/ChangeThrottleInstruction.java b/src/main/java/com/simibubi/create/content/trains/schedule/destination/ChangeThrottleInstruction.java index 9459fa79bc..1fa5c539b8 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/destination/ChangeThrottleInstruction.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/destination/ChangeThrottleInstruction.java @@ -13,8 +13,8 @@ import com.simibubi.create.content.trains.schedule.ScheduleRuntime.State; import com.simibubi.create.foundation.gui.ModularGuiLineBuilder; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.Pair; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.data.Pair; +import net.createmod.catnip.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/destination/ChangeTitleInstruction.java b/src/main/java/com/simibubi/create/content/trains/schedule/destination/ChangeTitleInstruction.java index efbce32038..4ffe525f75 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/destination/ChangeTitleInstruction.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/destination/ChangeTitleInstruction.java @@ -11,8 +11,8 @@ import com.simibubi.create.content.trains.schedule.ScheduleRuntime; import com.simibubi.create.content.trains.schedule.ScheduleRuntime.State; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.Pair; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.data.Pair; +import net.createmod.catnip.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/destination/DeliverPackagesInstruction.java b/src/main/java/com/simibubi/create/content/trains/schedule/destination/DeliverPackagesInstruction.java index c48f87c1f0..f9bafe17f1 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/destination/DeliverPackagesInstruction.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/destination/DeliverPackagesInstruction.java @@ -20,7 +20,7 @@ import com.simibubi.create.content.trains.station.GlobalStation; import com.simibubi.create.content.trains.station.GlobalStation.GlobalPackagePort; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.data.Pair; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/destination/DestinationInstruction.java b/src/main/java/com/simibubi/create/content/trains/schedule/destination/DestinationInstruction.java index 10130ca88a..9245cea0a2 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/destination/DestinationInstruction.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/destination/DestinationInstruction.java @@ -18,8 +18,8 @@ import com.simibubi.create.content.trains.schedule.ScheduleRuntime; import com.simibubi.create.content.trains.station.GlobalStation; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.Pair; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.data.Pair; +import net.createmod.catnip.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.components.EditBox; import net.minecraft.network.chat.Component; diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/destination/FetchPackagesInstruction.java b/src/main/java/com/simibubi/create/content/trains/schedule/destination/FetchPackagesInstruction.java index b214c58e3e..0d3b5f7661 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/destination/FetchPackagesInstruction.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/destination/FetchPackagesInstruction.java @@ -23,8 +23,8 @@ import com.simibubi.create.content.trains.station.GlobalStation; import com.simibubi.create.content.trains.station.GlobalStation.GlobalPackagePort; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.Pair; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.data.Pair; +import net.createmod.catnip.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.components.EditBox; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/destination/ScheduleInstruction.java b/src/main/java/com/simibubi/create/content/trains/schedule/destination/ScheduleInstruction.java index 533d1a67e5..c66f4d7790 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/destination/ScheduleInstruction.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/destination/ScheduleInstruction.java @@ -10,14 +10,14 @@ import com.simibubi.create.content.trains.schedule.Schedule; import com.simibubi.create.content.trains.schedule.ScheduleDataEntry; import com.simibubi.create.content.trains.schedule.ScheduleRuntime; -import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.data.Pair; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; public abstract class ScheduleInstruction extends ScheduleDataEntry { public abstract boolean supportsConditions(); - + @Nullable public abstract DiscoveredPath start(ScheduleRuntime runtime); diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/destination/TextScheduleInstruction.java b/src/main/java/com/simibubi/create/content/trains/schedule/destination/TextScheduleInstruction.java index 7634d4339d..8fc78f4e08 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/destination/TextScheduleInstruction.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/destination/TextScheduleInstruction.java @@ -6,7 +6,7 @@ import com.google.common.collect.ImmutableList; import com.simibubi.create.foundation.gui.ModularGuiLineBuilder; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.components.EditBox; import net.minecraft.network.chat.Component; diff --git a/src/main/java/com/simibubi/create/content/trains/signal/EdgeGroupColor.java b/src/main/java/com/simibubi/create/content/trains/signal/EdgeGroupColor.java index 97971a226f..845932b874 100644 --- a/src/main/java/com/simibubi/create/content/trains/signal/EdgeGroupColor.java +++ b/src/main/java/com/simibubi/create/content/trains/signal/EdgeGroupColor.java @@ -1,6 +1,6 @@ package com.simibubi.create.content.trains.signal; -import net.createmod.catnip.utility.theme.Color; +import net.createmod.catnip.theme.Color; public enum EdgeGroupColor { diff --git a/src/main/java/com/simibubi/create/content/trains/signal/SignalBlock.java b/src/main/java/com/simibubi/create/content/trains/signal/SignalBlock.java index 0a1e109a69..cf76148d16 100644 --- a/src/main/java/com/simibubi/create/content/trains/signal/SignalBlock.java +++ b/src/main/java/com/simibubi/create/content/trains/signal/SignalBlock.java @@ -7,7 +7,7 @@ import com.simibubi.create.content.equipment.wrench.IWrenchable; import com.simibubi.create.foundation.block.IBE; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.lang.Lang; +import net.createmod.catnip.lang.Lang; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; diff --git a/src/main/java/com/simibubi/create/content/trains/signal/SignalBlockEntity.java b/src/main/java/com/simibubi/create/content/trains/signal/SignalBlockEntity.java index fede195d88..d6629af78f 100644 --- a/src/main/java/com/simibubi/create/content/trains/signal/SignalBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/trains/signal/SignalBlockEntity.java @@ -12,7 +12,7 @@ import com.simibubi.create.content.trains.track.TrackTargetingBehaviour; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; -import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.nbt.NBTHelper; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.block.entity.BlockEntityType; diff --git a/src/main/java/com/simibubi/create/content/trains/signal/SignalBoundary.java b/src/main/java/com/simibubi/create/content/trains/signal/SignalBoundary.java index 0feab5fd7d..72469e7b5e 100644 --- a/src/main/java/com/simibubi/create/content/trains/signal/SignalBoundary.java +++ b/src/main/java/com/simibubi/create/content/trains/signal/SignalBoundary.java @@ -16,9 +16,9 @@ import com.simibubi.create.content.trains.signal.SignalBlock.SignalType; import com.simibubi.create.content.trains.signal.SignalBlockEntity.OverlayState; import com.simibubi.create.content.trains.signal.SignalBlockEntity.SignalState; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.nbt.NBTHelper; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; diff --git a/src/main/java/com/simibubi/create/content/trains/signal/SignalEdgeGroup.java b/src/main/java/com/simibubi/create/content/trains/signal/SignalEdgeGroup.java index d173e2d891..1f6bb55679 100644 --- a/src/main/java/com/simibubi/create/content/trains/signal/SignalEdgeGroup.java +++ b/src/main/java/com/simibubi/create/content/trains/signal/SignalEdgeGroup.java @@ -14,7 +14,7 @@ import com.google.common.base.Predicates; import com.simibubi.create.Create; import com.simibubi.create.content.trains.entity.Train; -import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.nbt.NBTHelper; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; diff --git a/src/main/java/com/simibubi/create/content/trains/signal/SignalPropagator.java b/src/main/java/com/simibubi/create/content/trains/signal/SignalPropagator.java index bad8a28d5f..751d40849c 100644 --- a/src/main/java/com/simibubi/create/content/trains/signal/SignalPropagator.java +++ b/src/main/java/com/simibubi/create/content/trains/signal/SignalPropagator.java @@ -21,9 +21,9 @@ import com.simibubi.create.content.trains.graph.TrackGraphSync; import com.simibubi.create.content.trains.graph.TrackNode; import com.simibubi.create.content.trains.graph.TrackNodeLocation; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.data.Pair; public class SignalPropagator { diff --git a/src/main/java/com/simibubi/create/content/trains/signal/SignalRenderer.java b/src/main/java/com/simibubi/create/content/trains/signal/SignalRenderer.java index 3b6d10c26e..3e890e271c 100644 --- a/src/main/java/com/simibubi/create/content/trains/signal/SignalRenderer.java +++ b/src/main/java/com/simibubi/create/content/trains/signal/SignalRenderer.java @@ -10,8 +10,8 @@ import com.simibubi.create.content.trains.track.TrackTargetingBehaviour.Rendered import com.simibubi.create.foundation.blockEntity.renderer.SafeBlockEntityRenderer; import dev.engine_room.flywheel.lib.transform.TransformStack; +import net.createmod.catnip.animation.AnimationTickHolder; import net.createmod.catnip.render.CachedBuffers; -import net.createmod.ponder.utility.LevelTickHolder; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; @@ -31,7 +31,7 @@ public class SignalRenderer extends SafeBlockEntityRenderer { SignalState signalState = be.getState(); OverlayState overlayState = be.getOverlay(); - float renderTime = LevelTickHolder.getRenderTime(be.getLevel()); + float renderTime = AnimationTickHolder.getRenderTime(be.getLevel()); if (signalState.isRedLight(renderTime)) CachedBuffers.partial(AllPartialModels.SIGNAL_ON, blockState) .renderInto(ms, buffer.getBuffer(RenderType.solid())); diff --git a/src/main/java/com/simibubi/create/content/trains/signal/TrackEdgePoint.java b/src/main/java/com/simibubi/create/content/trains/signal/TrackEdgePoint.java index 574b3aa5bb..720e759260 100644 --- a/src/main/java/com/simibubi/create/content/trains/signal/TrackEdgePoint.java +++ b/src/main/java/com/simibubi/create/content/trains/signal/TrackEdgePoint.java @@ -12,7 +12,7 @@ import com.simibubi.create.content.trains.graph.TrackNodeLocation; import com.simibubi.create.content.trains.track.TrackTargetingBehaviour; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; -import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.data.Couple; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; diff --git a/src/main/java/com/simibubi/create/content/trains/station/AbstractStationScreen.java b/src/main/java/com/simibubi/create/content/trains/station/AbstractStationScreen.java index 217a5afe42..3293e4b9f5 100644 --- a/src/main/java/com/simibubi/create/content/trains/station/AbstractStationScreen.java +++ b/src/main/java/com/simibubi/create/content/trains/station/AbstractStationScreen.java @@ -17,7 +17,7 @@ import dev.engine_room.flywheel.lib.model.baked.PartialModel; import dev.engine_room.flywheel.lib.transform.TransformStack; import net.createmod.catnip.gui.AbstractSimiScreen; import net.createmod.catnip.gui.element.GuiGameElement; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.world.level.block.state.properties.BlockStateProperties; diff --git a/src/main/java/com/simibubi/create/content/trains/station/GlobalStation.java b/src/main/java/com/simibubi/create/content/trains/station/GlobalStation.java index 6e711304fd..a8c58fdae4 100644 --- a/src/main/java/com/simibubi/create/content/trains/station/GlobalStation.java +++ b/src/main/java/com/simibubi/create/content/trains/station/GlobalStation.java @@ -17,7 +17,7 @@ import com.simibubi.create.content.trains.graph.DimensionPalette; import com.simibubi.create.content.trains.graph.TrackNode; import com.simibubi.create.content.trains.signal.SingleBlockEntityEdgePoint; -import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.nbt.NBTHelper; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; @@ -216,7 +216,7 @@ public class GlobalStation extends SingleBlockEntityEdgePoint { box.spawnParticles(); } } - + // Export to station for (int slot = 0; slot < carriageInventory.getSlots(); slot++) { ItemStack stack = carriageInventory.getStackInSlot(slot); @@ -246,7 +246,7 @@ public class GlobalStation extends SingleBlockEntityEdgePoint { carriageInventory.setStackInSlot(slot, ItemStack.EMPTY); if (box != null) box.spawnParticles(); - + break; } } diff --git a/src/main/java/com/simibubi/create/content/trains/station/StationBlockEntity.java b/src/main/java/com/simibubi/create/content/trains/station/StationBlockEntity.java index 16185df4b5..de7bf8e28d 100644 --- a/src/main/java/com/simibubi/create/content/trains/station/StationBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/trains/station/StationBlockEntity.java @@ -60,12 +60,12 @@ import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.infrastructure.config.AllConfigs; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.NBTHelper; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.WorldAttached; -import net.createmod.catnip.utility.animation.LerpedFloat; -import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.nbt.NBTHelper; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.data.WorldAttached; +import net.createmod.catnip.animation.LerpedFloat; +import net.createmod.catnip.animation.LerpedFloat.Chaser; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; diff --git a/src/main/java/com/simibubi/create/content/trains/station/StationMarker.java b/src/main/java/com/simibubi/create/content/trains/station/StationMarker.java index a52d8b778c..465e80a94d 100644 --- a/src/main/java/com/simibubi/create/content/trains/station/StationMarker.java +++ b/src/main/java/com/simibubi/create/content/trains/station/StationMarker.java @@ -13,7 +13,7 @@ import com.simibubi.create.content.trains.track.TrackTargetingBehaviour; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import com.simibubi.create.foundation.map.CustomRenderedMapDecoration; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; import net.minecraft.client.renderer.MultiBufferSource; diff --git a/src/main/java/com/simibubi/create/content/trains/station/StationScreen.java b/src/main/java/com/simibubi/create/content/trains/station/StationScreen.java index 7634ae4086..6ce90f1d9b 100644 --- a/src/main/java/com/simibubi/create/content/trains/station/StationScreen.java +++ b/src/main/java/com/simibubi/create/content/trains/station/StationScreen.java @@ -24,10 +24,10 @@ import com.simibubi.create.foundation.utility.CreateLang; import dev.engine_room.flywheel.lib.model.baked.PartialModel; import net.createmod.catnip.gui.UIRenderHelper; -import net.createmod.catnip.utility.AnimationTickHolder; -import net.createmod.catnip.utility.Pair; -import net.createmod.catnip.utility.animation.LerpedFloat; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.animation.AnimationTickHolder; +import net.createmod.catnip.data.Pair; +import net.createmod.catnip.animation.LerpedFloat; +import net.createmod.catnip.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.EditBox; @@ -46,7 +46,7 @@ public class StationScreen extends AbstractStationScreen { private int leavingAnimation; private LerpedFloat trainPosition; private DoorControl doorControl; - + private ScrollInput colorTypeScroll; private int messedWithColors; @@ -104,7 +104,7 @@ public class StationScreen extends AbstractStationScreen { dropScheduleButton.withCallback(() -> AllPackets.getChannel() .sendToServer(StationEditPacket.dropSchedule(blockEntity.getBlockPos()))); addRenderableWidget(dropScheduleButton); - + colorTypeScroll = new ScrollInput(x + 166, y + 17, 22, 14).titled(CreateLang.translateDirect("station.train_map_color")); colorTypeScroll.withRange(0, 16); colorTypeScroll.withStepFunction(ctx -> colorTypeScroll.standardStep() @@ -113,7 +113,7 @@ public class StationScreen extends AbstractStationScreen { Train train = displayedTrain.get(); if (train != null) { train.mapColorIndex = s; - messedWithColors = 10; + messedWithColors = 10; } }); colorTypeScroll.active = colorTypeScroll.visible = false; @@ -150,7 +150,7 @@ public class StationScreen extends AbstractStationScreen { .length()); trainNameBox.setHighlightPos(trainNameBox.getCursorPosition()); } - + if (messedWithColors > 0) { messedWithColors--; if (messedWithColors == 0) @@ -334,10 +334,10 @@ public class StationScreen extends AbstractStationScreen { if (font.width(text) > trainNameBox.getWidth()) graphics.drawString(font, "...", guiLeft + 26, guiTop + 47, 0xa6a6a6); } - + if (!mapModsPresent()) return; - + AllGuiTextures sprite = AllGuiTextures.TRAINMAP_SPRITES; sprite.bind(); int trainColorIndex = colorTypeScroll.getState(); diff --git a/src/main/java/com/simibubi/create/content/trains/station/TrainEditPacket.java b/src/main/java/com/simibubi/create/content/trains/station/TrainEditPacket.java index 6c394d8770..4839ef3f98 100644 --- a/src/main/java/com/simibubi/create/content/trains/station/TrainEditPacket.java +++ b/src/main/java/com/simibubi/create/content/trains/station/TrainEditPacket.java @@ -8,7 +8,7 @@ import com.simibubi.create.content.trains.entity.Train; import com.simibubi.create.content.trains.entity.TrainIconType; import com.simibubi.create.foundation.networking.SimplePacketBase; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; diff --git a/src/main/java/com/simibubi/create/content/trains/track/AllPortalTracks.java b/src/main/java/com/simibubi/create/content/trains/track/AllPortalTracks.java index f85d63fc4d..bc96b52f61 100644 --- a/src/main/java/com/simibubi/create/content/trains/track/AllPortalTracks.java +++ b/src/main/java/com/simibubi/create/content/trains/track/AllPortalTracks.java @@ -7,8 +7,8 @@ import com.simibubi.create.compat.Mods; import com.simibubi.create.content.contraptions.glue.SuperGlueEntity; import com.simibubi.create.foundation.utility.AttachedRegistry; -import net.createmod.catnip.utility.BlockFace; -import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.math.BlockFace; +import net.createmod.catnip.data.Pair; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.registries.Registries; diff --git a/src/main/java/com/simibubi/create/content/trains/track/BezierConnection.java b/src/main/java/com/simibubi/create/content/trains/track/BezierConnection.java index 9bb9c89283..669b6e905d 100644 --- a/src/main/java/com/simibubi/create/content/trains/track/BezierConnection.java +++ b/src/main/java/com/simibubi/create/content/trains/track/BezierConnection.java @@ -9,11 +9,11 @@ import com.mojang.blaze3d.vertex.PoseStack.Pose; import com.simibubi.create.AllBlocks; import dev.engine_room.flywheel.lib.transform.TransformStack; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.NBTHelper; -import net.createmod.catnip.utility.Pair; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.nbt.NBTHelper; +import net.createmod.catnip.data.Pair; +import net.createmod.catnip.math.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction.Axis; import net.minecraft.core.particles.BlockParticleOption; diff --git a/src/main/java/com/simibubi/create/content/trains/track/CurvedTrackInteraction.java b/src/main/java/com/simibubi/create/content/trains/track/CurvedTrackInteraction.java index 6770ba21cb..a6def30ebd 100644 --- a/src/main/java/com/simibubi/create/content/trains/track/CurvedTrackInteraction.java +++ b/src/main/java/com/simibubi/create/content/trains/track/CurvedTrackInteraction.java @@ -6,7 +6,7 @@ import com.simibubi.create.AllTags; import com.simibubi.create.content.trains.track.TrackBlockOutline.BezierPointSelection; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; diff --git a/src/main/java/com/simibubi/create/content/trains/track/ITrackBlock.java b/src/main/java/com/simibubi/create/content/trains/track/ITrackBlock.java index bbbeb17f9b..f116fbcebc 100644 --- a/src/main/java/com/simibubi/create/content/trains/track/ITrackBlock.java +++ b/src/main/java/com/simibubi/create/content/trains/track/ITrackBlock.java @@ -14,8 +14,8 @@ import com.simibubi.create.content.trains.graph.TrackNodeLocation.DiscoveredLoca import com.simibubi.create.content.trains.track.TrackTargetingBehaviour.RenderedTrackOverlayType; import dev.engine_room.flywheel.lib.model.baked.PartialModel; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.data.Pair; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.AxisDirection; diff --git a/src/main/java/com/simibubi/create/content/trains/track/TrackBlock.java b/src/main/java/com/simibubi/create/content/trains/track/TrackBlock.java index 9474c423e6..fc30fae929 100644 --- a/src/main/java/com/simibubi/create/content/trains/track/TrackBlock.java +++ b/src/main/java/com/simibubi/create/content/trains/track/TrackBlock.java @@ -49,12 +49,12 @@ import dev.engine_room.flywheel.lib.model.baked.PartialModel; import dev.engine_room.flywheel.lib.transform.TransformStack; import it.unimi.dsi.fastutil.objects.Object2IntArrayMap; import it.unimi.dsi.fastutil.objects.Object2IntMap; -import net.createmod.catnip.utility.BlockFace; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.Pair; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.lang.Components; -import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.math.BlockFace; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.data.Pair; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.lang.Components; +import net.createmod.catnip.math.AngleHelper; import net.minecraft.ChatFormatting; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/simibubi/create/content/trains/track/TrackBlockEntity.java b/src/main/java/com/simibubi/create/content/trains/track/TrackBlockEntity.java index 6d425a57e4..f9d56b37f4 100644 --- a/src/main/java/com/simibubi/create/content/trains/track/TrackBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/trains/track/TrackBlockEntity.java @@ -21,7 +21,7 @@ import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import dev.engine_room.flywheel.lib.visualization.VisualizationHelper; -import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.data.Pair; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction.Axis; import net.minecraft.core.registries.Registries; diff --git a/src/main/java/com/simibubi/create/content/trains/track/TrackBlockEntityTilt.java b/src/main/java/com/simibubi/create/content/trains/track/TrackBlockEntityTilt.java index 1dab9b71b8..3fae5d1065 100644 --- a/src/main/java/com/simibubi/create/content/trains/track/TrackBlockEntityTilt.java +++ b/src/main/java/com/simibubi/create/content/trains/track/TrackBlockEntityTilt.java @@ -7,8 +7,8 @@ import java.util.Optional; import com.simibubi.create.content.trains.graph.TrackNodeLocation; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.data.Pair; import net.minecraft.core.BlockPos; import net.minecraft.util.Mth; import net.minecraft.world.level.Level; diff --git a/src/main/java/com/simibubi/create/content/trains/track/TrackBlockItem.java b/src/main/java/com/simibubi/create/content/trains/track/TrackBlockItem.java index 82b9c834f0..48cd77d7fa 100644 --- a/src/main/java/com/simibubi/create/content/trains/track/TrackBlockItem.java +++ b/src/main/java/com/simibubi/create/content/trains/track/TrackBlockItem.java @@ -7,8 +7,8 @@ import com.simibubi.create.AllTags; import com.simibubi.create.content.trains.track.TrackPlacement.PlacementInfo; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.Pair; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.data.Pair; +import net.createmod.catnip.math.VecHelper; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/simibubi/create/content/trains/track/TrackBlockOutline.java b/src/main/java/com/simibubi/create/content/trains/track/TrackBlockOutline.java index 89b3414044..8eacdac2cf 100644 --- a/src/main/java/com/simibubi/create/content/trains/track/TrackBlockOutline.java +++ b/src/main/java/com/simibubi/create/content/trains/track/TrackBlockOutline.java @@ -12,11 +12,11 @@ import com.simibubi.create.AllTags; import com.simibubi.create.foundation.utility.RaycastHelper; import dev.engine_room.flywheel.lib.transform.TransformStack; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.WorldAttached; -import net.createmod.catnip.utility.math.AngleHelper; -import net.createmod.ponder.utility.LevelTickHolder; +import net.createmod.catnip.animation.AnimationTickHolder; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.data.WorldAttached; +import net.createmod.catnip.math.AngleHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; import net.minecraft.client.renderer.MultiBufferSource; @@ -55,7 +55,7 @@ public class TrackBlockOutline { if (mc.level == null) return; - Vec3 origin = player.getEyePosition(LevelTickHolder.getPartialTicks(mc.level)); + Vec3 origin = player.getEyePosition(AnimationTickHolder.getPartialTicks(mc.level)); double maxRange = mc.hitResult == null ? Double.MAX_VALUE : mc.hitResult.getLocation() diff --git a/src/main/java/com/simibubi/create/content/trains/track/TrackModel.java b/src/main/java/com/simibubi/create/content/trains/track/TrackModel.java index be83b4a3c9..9fc35e1e43 100644 --- a/src/main/java/com/simibubi/create/content/trains/track/TrackModel.java +++ b/src/main/java/com/simibubi/create/content/trains/track/TrackModel.java @@ -9,7 +9,7 @@ import org.jetbrains.annotations.Nullable; import com.simibubi.create.foundation.model.BakedQuadHelper; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.resources.model.BakedModel; diff --git a/src/main/java/com/simibubi/create/content/trains/track/TrackPaver.java b/src/main/java/com/simibubi/create/content/trains/track/TrackPaver.java index a5b99da2c7..8203dab923 100644 --- a/src/main/java/com/simibubi/create/content/trains/track/TrackPaver.java +++ b/src/main/java/com/simibubi/create/content/trains/track/TrackPaver.java @@ -10,9 +10,9 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.content.decoration.girder.GirderBlock; import com.simibubi.create.foundation.block.ProperWaterloggedBlock; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.Pair; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.data.Pair; +import net.createmod.catnip.math.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/content/trains/track/TrackPlacement.java b/src/main/java/com/simibubi/create/content/trains/track/TrackPlacement.java index b5d1fede48..2e9843e6e3 100644 --- a/src/main/java/com/simibubi/create/content/trains/track/TrackPlacement.java +++ b/src/main/java/com/simibubi/create/content/trains/track/TrackPlacement.java @@ -14,15 +14,15 @@ import com.simibubi.create.foundation.utility.BlockHelper; import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.infrastructure.config.AllConfigs; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.Pair; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.animation.LerpedFloat; -import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; -import net.createmod.catnip.utility.math.AngleHelper; -import net.createmod.catnip.utility.outliner.Outliner; -import net.createmod.catnip.utility.theme.Color; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.data.Pair; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.animation.LerpedFloat; +import net.createmod.catnip.animation.LerpedFloat.Chaser; +import net.createmod.catnip.math.AngleHelper; +import net.createmod.catnip.outliner.Outliner; +import net.createmod.catnip.theme.Color; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; diff --git a/src/main/java/com/simibubi/create/content/trains/track/TrackPlacementOverlay.java b/src/main/java/com/simibubi/create/content/trains/track/TrackPlacementOverlay.java index 3433c0986c..ee6daa4fef 100644 --- a/src/main/java/com/simibubi/create/content/trains/track/TrackPlacementOverlay.java +++ b/src/main/java/com/simibubi/create/content/trains/track/TrackPlacementOverlay.java @@ -3,8 +3,8 @@ package com.simibubi.create.content.trains.track; import com.mojang.blaze3d.platform.Window; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.lang.Components; -import net.createmod.catnip.utility.theme.Color; +import net.createmod.catnip.lang.Components; +import net.createmod.catnip.theme.Color; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Gui; diff --git a/src/main/java/com/simibubi/create/content/trains/track/TrackRenderer.java b/src/main/java/com/simibubi/create/content/trains/track/TrackRenderer.java index 36cf8981c3..476047783d 100644 --- a/src/main/java/com/simibubi/create/content/trains/track/TrackRenderer.java +++ b/src/main/java/com/simibubi/create/content/trains/track/TrackRenderer.java @@ -13,9 +13,9 @@ import com.simibubi.create.foundation.blockEntity.renderer.SafeBlockEntityRender import dev.engine_room.flywheel.api.visualization.VisualizationManager; import net.createmod.catnip.render.CachedBuffers; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.math.AngleHelper; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; diff --git a/src/main/java/com/simibubi/create/content/trains/track/TrackShape.java b/src/main/java/com/simibubi/create/content/trains/track/TrackShape.java index 56c8756d88..dfb23cddaf 100644 --- a/src/main/java/com/simibubi/create/content/trains/track/TrackShape.java +++ b/src/main/java/com/simibubi/create/content/trains/track/TrackShape.java @@ -6,7 +6,7 @@ import java.util.List; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; -import net.createmod.catnip.utility.lang.Lang; +import net.createmod.catnip.lang.Lang; import net.minecraft.core.Direction; import net.minecraft.util.StringRepresentable; import net.minecraft.world.level.block.Mirror; diff --git a/src/main/java/com/simibubi/create/content/trains/track/TrackTargetingBehaviour.java b/src/main/java/com/simibubi/create/content/trains/track/TrackTargetingBehaviour.java index 7ca051a4e0..6b2ee80c0f 100644 --- a/src/main/java/com/simibubi/create/content/trains/track/TrackTargetingBehaviour.java +++ b/src/main/java/com/simibubi/create/content/trains/track/TrackTargetingBehaviour.java @@ -24,9 +24,9 @@ import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour import dev.engine_room.flywheel.lib.model.baked.PartialModel; import net.createmod.catnip.render.CachedBuffers; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.levelWrappers.SchematicLevel; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.levelWrappers.SchematicLevel; import net.createmod.ponder.api.level.PonderLevel; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.MultiBufferSource; diff --git a/src/main/java/com/simibubi/create/content/trains/track/TrackTargetingBlockItem.java b/src/main/java/com/simibubi/create/content/trains/track/TrackTargetingBlockItem.java index a06a84cd1e..57ee267ddb 100644 --- a/src/main/java/com/simibubi/create/content/trains/track/TrackTargetingBlockItem.java +++ b/src/main/java/com/simibubi/create/content/trains/track/TrackTargetingBlockItem.java @@ -19,7 +19,7 @@ import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.utility.CreateLang; import com.tterrag.registrate.util.nullness.NonNullBiFunction; -import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.data.Couple; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; diff --git a/src/main/java/com/simibubi/create/content/trains/track/TrackVisual.java b/src/main/java/com/simibubi/create/content/trains/track/TrackVisual.java index d37765931e..5b61d0cfbc 100644 --- a/src/main/java/com/simibubi/create/content/trains/track/TrackVisual.java +++ b/src/main/java/com/simibubi/create/content/trains/track/TrackVisual.java @@ -26,8 +26,8 @@ import dev.engine_room.flywheel.lib.transform.TransformStack; import dev.engine_room.flywheel.lib.visual.AbstractBlockEntityVisual; import it.unimi.dsi.fastutil.longs.LongArraySet; import it.unimi.dsi.fastutil.longs.LongSet; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.data.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.SectionPos; import net.minecraft.world.level.Level; diff --git a/src/main/java/com/simibubi/create/foundation/advancement/CreateAdvancement.java b/src/main/java/com/simibubi/create/foundation/advancement/CreateAdvancement.java index f3481f6756..76c12fe432 100644 --- a/src/main/java/com/simibubi/create/foundation/advancement/CreateAdvancement.java +++ b/src/main/java/com/simibubi/create/foundation/advancement/CreateAdvancement.java @@ -7,7 +7,7 @@ import java.util.function.UnaryOperator; import com.simibubi.create.Create; import com.tterrag.registrate.util.entry.ItemProviderEntry; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.advancements.Advancement; import net.minecraft.advancements.CriterionTriggerInstance; import net.minecraft.advancements.FrameType; diff --git a/src/main/java/com/simibubi/create/foundation/block/BigOutlines.java b/src/main/java/com/simibubi/create/foundation/block/BigOutlines.java index de98ba5501..191d2aa5b9 100644 --- a/src/main/java/com/simibubi/create/foundation/block/BigOutlines.java +++ b/src/main/java/com/simibubi/create/foundation/block/BigOutlines.java @@ -2,8 +2,8 @@ package com.simibubi.create.foundation.block; import com.simibubi.create.foundation.utility.RaycastHelper; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.ponder.utility.LevelTickHolder; +import net.createmod.catnip.animation.AnimationTickHolder; +import net.createmod.catnip.math.VecHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; import net.minecraft.core.BlockPos; @@ -30,7 +30,7 @@ public class BigOutlines { result = null; - Vec3 origin = player.getEyePosition(LevelTickHolder.getPartialTicks(mc.level)); + Vec3 origin = player.getEyePosition(AnimationTickHolder.getPartialTicks(mc.level)); double maxRange = mc.hitResult == null ? Double.MAX_VALUE : mc.hitResult.getLocation() diff --git a/src/main/java/com/simibubi/create/foundation/block/CopperBlockSet.java b/src/main/java/com/simibubi/create/foundation/block/CopperBlockSet.java index d533197c43..a497516635 100644 --- a/src/main/java/com/simibubi/create/foundation/block/CopperBlockSet.java +++ b/src/main/java/com/simibubi/create/foundation/block/CopperBlockSet.java @@ -22,8 +22,8 @@ import com.tterrag.registrate.util.nullness.NonNullBiConsumer; import com.tterrag.registrate.util.nullness.NonNullFunction; import net.createmod.catnip.platform.CatnipServices; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.lang.Lang; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.lang.Lang; import net.minecraft.data.recipes.RecipeCategory; import net.minecraft.data.recipes.ShapelessRecipeBuilder; import net.minecraft.resources.ResourceLocation; @@ -76,7 +76,7 @@ public class CopperBlockSet { public CopperBlockSet(AbstractRegistrate registrate, String name, String endTextureName, Variant[] variants, NonNullBiConsumer, RegistrateRecipeProvider> mainBlockRecipe) { this(registrate, name, endTextureName, variants, mainBlockRecipe, "copper/", NonNullBiConsumer.noop()); } - + public CopperBlockSet(AbstractRegistrate registrate, String name, String endTextureName, Variant[] variants, NonNullBiConsumer, RegistrateRecipeProvider> mainBlockRecipe, NonNullBiConsumer onRegister) { this(registrate, name, endTextureName, variants, mainBlockRecipe, "copper/", onRegister); } @@ -89,7 +89,7 @@ public class CopperBlockSet { this.variants = variants; this.mainBlockRecipe = mainBlockRecipe; this.onRegister = onRegister; - + for (boolean waxed : Iterate.falseAndTrue) { for (Variant variant : this.variants) { BlockEntry[] entries = diff --git a/src/main/java/com/simibubi/create/foundation/block/ItemUseOverrides.java b/src/main/java/com/simibubi/create/foundation/block/ItemUseOverrides.java index b0e805e14a..9da6425598 100644 --- a/src/main/java/com/simibubi/create/foundation/block/ItemUseOverrides.java +++ b/src/main/java/com/simibubi/create/foundation/block/ItemUseOverrides.java @@ -6,7 +6,7 @@ import java.util.Set; import com.simibubi.create.AllItems; import net.createmod.catnip.platform.CatnipServices; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.InteractionResult; import net.minecraft.world.level.block.Block; diff --git a/src/main/java/com/simibubi/create/foundation/block/connected/AllCTTypes.java b/src/main/java/com/simibubi/create/foundation/block/connected/AllCTTypes.java index 5bf1fd00ec..b8246c7f5b 100644 --- a/src/main/java/com/simibubi/create/foundation/block/connected/AllCTTypes.java +++ b/src/main/java/com/simibubi/create/foundation/block/connected/AllCTTypes.java @@ -4,7 +4,7 @@ import com.simibubi.create.Create; import com.simibubi.create.foundation.block.connected.ConnectedTextureBehaviour.CTContext; import com.simibubi.create.foundation.block.connected.ConnectedTextureBehaviour.ContextRequirement; -import net.createmod.catnip.utility.lang.Lang; +import net.createmod.catnip.lang.Lang; import net.minecraft.resources.ResourceLocation; public enum AllCTTypes implements CTType { @@ -104,7 +104,7 @@ public enum AllCTTypes implements CTType { return context.bottomLeft ? 2 : 5; return 1; } - + if (downDrops) { if (leftDrops) return context.topRight ? 8 : 5; @@ -112,15 +112,15 @@ public enum AllCTTypes implements CTType { return context.topLeft ? 10 : 5; return 9; } - + if (leftDrops) return 4; if (rightDrops) return 6; - + if (!context.up || !context.down || !context.left || !context.right) return 5; - + if (context.bottomLeft && context.topRight) { if (context.topLeft && !context.bottomRight) return 12; @@ -129,7 +129,7 @@ public enum AllCTTypes implements CTType { if (!context.bottomRight && !context.topLeft) return 7; } - + if (context.bottomRight && context.topLeft) { if (context.topRight && !context.bottomLeft) return 13; @@ -138,7 +138,7 @@ public enum AllCTTypes implements CTType { if (!context.bottomLeft && !context.topRight) return 11; } - + return 5; } }, diff --git a/src/main/java/com/simibubi/create/foundation/block/connected/CTModel.java b/src/main/java/com/simibubi/create/foundation/block/connected/CTModel.java index 29c54f9989..73f028934b 100644 --- a/src/main/java/com/simibubi/create/foundation/block/connected/CTModel.java +++ b/src/main/java/com/simibubi/create/foundation/block/connected/CTModel.java @@ -9,7 +9,7 @@ import com.simibubi.create.foundation.block.connected.ConnectedTextureBehaviour. import com.simibubi.create.foundation.model.BakedModelWrapperWithData; import com.simibubi.create.foundation.model.BakedQuadHelper; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.resources.model.BakedModel; diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/CenteredSideValueBoxTransform.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/CenteredSideValueBoxTransform.java index bc03190861..8133079fe0 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/CenteredSideValueBoxTransform.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/CenteredSideValueBoxTransform.java @@ -2,7 +2,7 @@ package com.simibubi.create.foundation.blockEntity.behaviour; import java.util.function.BiPredicate; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.core.Direction; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBox.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBox.java index a1459d299a..bc7511e09a 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBox.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBox.java @@ -9,8 +9,8 @@ import com.simibubi.create.foundation.blockEntity.behaviour.scrollValue.INamedIc import com.simibubi.create.foundation.gui.AllIcons; import net.createmod.catnip.render.SuperRenderTypeBuffer; -import net.createmod.catnip.utility.lang.Components; -import net.createmod.catnip.utility.outliner.ChasingAABBOutline; +import net.createmod.catnip.lang.Components; +import net.createmod.catnip.outliner.ChasingAABBOutline; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; import net.minecraft.client.renderer.LightTexture; diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBoxTransform.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBoxTransform.java index 0e3d5d6447..988bafcea0 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBoxTransform.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBoxTransform.java @@ -7,8 +7,8 @@ import org.apache.commons.lang3.tuple.Pair; import com.mojang.blaze3d.vertex.PoseStack; import dev.engine_room.flywheel.lib.transform.TransformStack; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.math.AngleHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsClient.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsClient.java index 8366cbe0d1..b05bad59b3 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsClient.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsClient.java @@ -6,7 +6,7 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.AllPackets; import net.createmod.catnip.gui.ScreenOpener; -import net.createmod.catnip.utility.theme.Color; +import net.createmod.catnip.theme.Color; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsScreen.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsScreen.java index 4f72edd259..e2489c4dc5 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsScreen.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsScreen.java @@ -18,8 +18,8 @@ import com.simibubi.create.foundation.utility.CreateLang; import net.createmod.catnip.gui.AbstractSimiScreen; import net.createmod.catnip.gui.UIRenderHelper; -import net.createmod.catnip.utility.AnimationTickHolder; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.animation.AnimationTickHolder; +import net.createmod.catnip.lang.Components; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.resources.sounds.SimpleSoundInstance; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/edgeInteraction/EdgeInteractionHandler.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/edgeInteraction/EdgeInteractionHandler.java index bc885d4bf6..f071791c43 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/edgeInteraction/EdgeInteractionHandler.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/edgeInteraction/EdgeInteractionHandler.java @@ -7,7 +7,7 @@ import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour import com.simibubi.create.foundation.utility.BlockHelper; import com.simibubi.create.foundation.utility.RaycastHelper; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Vec3i; diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/edgeInteraction/EdgeInteractionRenderer.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/edgeInteraction/EdgeInteractionRenderer.java index e15c5a1fc7..05b900b4dd 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/edgeInteraction/EdgeInteractionRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/edgeInteraction/EdgeInteractionRenderer.java @@ -11,9 +11,9 @@ import com.simibubi.create.foundation.blockEntity.behaviour.ValueBox; import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.lang.Components; -import net.createmod.catnip.utility.outliner.Outliner; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.lang.Components; +import net.createmod.catnip.outliner.Outliner; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringBehaviour.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringBehaviour.java index 0f31d3ab57..506a162e0a 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringBehaviour.java @@ -21,9 +21,9 @@ import com.simibubi.create.foundation.item.ItemHelper; import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.infrastructure.config.AllConfigs; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -413,7 +413,7 @@ public class FilteringBehaviour extends BlockEntityBehaviour implements ValueSet public boolean bypassesInput(ItemStack mainhandItem) { return false; } - + @Override public int netId() { return 1; diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringRenderer.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringRenderer.java index 46bd094a75..074f931ced 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/FilteringRenderer.java @@ -16,10 +16,10 @@ import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxRenderer; import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform; import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform.Sided; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.Pair; -import net.createmod.catnip.utility.VecHelper; -import net.createmod.catnip.utility.outliner.Outliner; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.data.Pair; +import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.outliner.Outliner; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.MultiBufferSource; diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/SidedFilteringBehaviour.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/SidedFilteringBehaviour.java index 4d740b3af7..04f0b45a6b 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/SidedFilteringBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/filtering/SidedFilteringBehaviour.java @@ -12,8 +12,8 @@ import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform; import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform.Sided; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.NBTHelper; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.nbt.NBTHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/fluid/SmartFluidTankBehaviour.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/fluid/SmartFluidTankBehaviour.java index b8ca154d4b..26740e2c4e 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/fluid/SmartFluidTankBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/fluid/SmartFluidTankBehaviour.java @@ -10,9 +10,9 @@ import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour import com.simibubi.create.foundation.fluid.CombinedTankWrapper; import com.simibubi.create.foundation.fluid.SmartFluidTank; -import net.createmod.catnip.utility.NBTHelper; -import net.createmod.catnip.utility.animation.LerpedFloat; -import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.nbt.NBTHelper; +import net.createmod.catnip.animation.LerpedFloat; +import net.createmod.catnip.animation.LerpedFloat.Chaser; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/inventory/CapManipulationBehaviourBase.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/inventory/CapManipulationBehaviourBase.java index e2130cd1ef..b5f8859c46 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/inventory/CapManipulationBehaviourBase.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/inventory/CapManipulationBehaviourBase.java @@ -9,7 +9,7 @@ import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour import com.simibubi.create.foundation.blockEntity.behaviour.filtering.FilteringBehaviour; import com.simibubi.create.foundation.item.ItemHelper.ExtractionCountMode; -import net.createmod.catnip.utility.BlockFace; +import net.createmod.catnip.math.BlockFace; import net.minecraft.core.BlockPos; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; @@ -68,7 +68,7 @@ public abstract class CapManipulationBehaviourBase filter) { this.filter = filter; diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/scrollValue/ScrollOptionBehaviour.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/scrollValue/ScrollOptionBehaviour.java index feafc6adb8..42f143471c 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/scrollValue/ScrollOptionBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/scrollValue/ScrollOptionBehaviour.java @@ -6,7 +6,7 @@ import com.simibubi.create.foundation.blockEntity.behaviour.ValueBoxTransform; import com.simibubi.create.foundation.blockEntity.behaviour.ValueSettingsBoard; import com.simibubi.create.foundation.blockEntity.behaviour.ValueSettingsFormatter.ScrollOptionSettingsFormatter; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Player; import net.minecraft.world.phys.BlockHitResult; diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/scrollValue/ScrollValueBehaviour.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/scrollValue/ScrollValueBehaviour.java index e66db19e0b..9006b5dc8c 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/scrollValue/ScrollValueBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/scrollValue/ScrollValueBehaviour.java @@ -13,7 +13,7 @@ import com.simibubi.create.foundation.blockEntity.behaviour.ValueSettingsBehavio import com.simibubi.create.foundation.blockEntity.behaviour.ValueSettingsBoard; import com.simibubi.create.foundation.blockEntity.behaviour.ValueSettingsFormatter; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/scrollValue/ScrollValueHandler.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/scrollValue/ScrollValueHandler.java index 5eb292b7a2..82608ccbf0 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/scrollValue/ScrollValueHandler.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/scrollValue/ScrollValueHandler.java @@ -1,7 +1,7 @@ package com.simibubi.create.foundation.blockEntity.behaviour.scrollValue; -import net.createmod.catnip.utility.animation.PhysicalFloat; +import net.createmod.catnip.animation.PhysicalFloat; import net.minecraft.client.Minecraft; import net.minecraft.util.Mth; import net.minecraftforge.api.distmarker.Dist; diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/scrollValue/ScrollValueRenderer.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/scrollValue/ScrollValueRenderer.java index e450cfc9cb..f390d0a702 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/scrollValue/ScrollValueRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/scrollValue/ScrollValueRenderer.java @@ -13,8 +13,8 @@ import com.simibubi.create.foundation.blockEntity.behaviour.ValueBox.IconValueBo import com.simibubi.create.foundation.blockEntity.behaviour.ValueBox.TextValueBox; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.lang.Components; -import net.createmod.catnip.utility.outliner.Outliner; +import net.createmod.catnip.lang.Components; +import net.createmod.catnip.outliner.Outliner; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/simibubi/create/foundation/data/BlockStateGen.java b/src/main/java/com/simibubi/create/foundation/data/BlockStateGen.java index fa67a24cfb..7aa8238027 100644 --- a/src/main/java/com/simibubi/create/foundation/data/BlockStateGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/BlockStateGen.java @@ -30,8 +30,8 @@ import com.tterrag.registrate.providers.RegistrateBlockstateProvider; import com.tterrag.registrate.util.nullness.NonNullBiConsumer; import com.tterrag.registrate.util.nullness.NonnullType; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.math.Pointing; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; import net.minecraft.core.Direction.AxisDirection; diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/CompatMetals.java b/src/main/java/com/simibubi/create/foundation/data/recipe/CompatMetals.java index 575f7d63ea..7f2d27cc53 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/CompatMetals.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/CompatMetals.java @@ -8,7 +8,7 @@ import static com.simibubi.create.foundation.data.recipe.Mods.MEK; import static com.simibubi.create.foundation.data.recipe.Mods.OREGANIZED; import static com.simibubi.create.foundation.data.recipe.Mods.TH; -import net.createmod.catnip.utility.lang.Lang; +import net.createmod.catnip.lang.Lang; public enum CompatMetals { ALUMINUM(IE, IC2), @@ -32,7 +32,7 @@ public enum CompatMetals { public String getName() { return name; } - + public String getName(Mods mod) { if (this == ALUMINUM && mod == IC2) // include in mods.builder if this happens again return "aluminium"; diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/CrushingRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/CrushingRecipeGen.java index e762cd78c6..4a6db2a6c9 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/CrushingRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/CrushingRecipeGen.java @@ -21,7 +21,7 @@ import com.simibubi.create.content.decoration.palettes.AllPaletteStoneTypes; import com.simibubi.create.content.processing.recipe.ProcessingRecipe; import com.simibubi.create.content.processing.recipe.ProcessingRecipeBuilder; -import net.createmod.catnip.utility.lang.Lang; +import net.createmod.catnip.lang.Lang; import net.minecraft.data.PackOutput; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.ItemTags; diff --git a/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java b/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java index 1f13ea16ed..d6127b77fa 100644 --- a/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/foundation/events/ClientEvents.java @@ -74,8 +74,8 @@ import com.simibubi.create.infrastructure.config.AllConfigs; import net.createmod.catnip.config.ui.BaseConfigScreen; import net.createmod.catnip.render.DefaultSuperRenderTypeBuffer; import net.createmod.catnip.render.SuperRenderTypeBuffer; -import net.createmod.catnip.utility.AnimationTickHolder; -import net.createmod.catnip.utility.levelWrappers.WrappedClientLevel; +import net.createmod.catnip.animation.AnimationTickHolder; +import net.createmod.catnip.levelWrappers.WrappedClientLevel; import net.createmod.ponder.foundation.PonderTooltipHandler; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/simibubi/create/foundation/events/CommonEvents.java b/src/main/java/com/simibubi/create/foundation/events/CommonEvents.java index 5999f879cd..4b0a03fbd6 100644 --- a/src/main/java/com/simibubi/create/foundation/events/CommonEvents.java +++ b/src/main/java/com/simibubi/create/foundation/events/CommonEvents.java @@ -22,8 +22,8 @@ import com.simibubi.create.foundation.utility.ServerSpeedProvider; import com.simibubi.create.foundation.utility.TickBasedCache; import com.simibubi.create.infrastructure.command.AllCommands; -import net.createmod.catnip.utility.WorldAttached; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.data.WorldAttached; +import net.createmod.catnip.lang.Components; import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.packs.PackType; import net.minecraft.server.packs.repository.Pack; diff --git a/src/main/java/com/simibubi/create/foundation/fluid/CombinedTankWrapper.java b/src/main/java/com/simibubi/create/foundation/fluid/CombinedTankWrapper.java index e589109175..cdd0af69dd 100644 --- a/src/main/java/com/simibubi/create/foundation/fluid/CombinedTankWrapper.java +++ b/src/main/java/com/simibubi/create/foundation/fluid/CombinedTankWrapper.java @@ -1,6 +1,6 @@ package com.simibubi.create.foundation.fluid; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.items.wrapper.EmptyHandler; diff --git a/src/main/java/com/simibubi/create/foundation/fluid/FluidHelper.java b/src/main/java/com/simibubi/create/foundation/fluid/FluidHelper.java index bf04209ff1..6eb95f42f4 100644 --- a/src/main/java/com/simibubi/create/foundation/fluid/FluidHelper.java +++ b/src/main/java/com/simibubi/create/foundation/fluid/FluidHelper.java @@ -13,7 +13,7 @@ import com.simibubi.create.content.fluids.transfer.GenericItemFilling; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import net.createmod.catnip.platform.CatnipServices; -import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.data.Pair; import net.minecraft.nbt.TagParser; import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvent; diff --git a/src/main/java/com/simibubi/create/foundation/fluid/FluidRenderer.java b/src/main/java/com/simibubi/create/foundation/fluid/FluidRenderer.java index e0406dd7f8..4ec0142619 100644 --- a/src/main/java/com/simibubi/create/foundation/fluid/FluidRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/fluid/FluidRenderer.java @@ -6,8 +6,8 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import dev.engine_room.flywheel.lib.transform.TransformStack; -import net.createmod.catnip.utility.BasicFluidRenderer; -import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.render.BasicFluidRenderer; +import net.createmod.catnip.math.AngleHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.texture.TextureAtlasSprite; diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java index e07cd129e5..aad42d1977 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java @@ -5,7 +5,7 @@ import com.simibubi.create.Create; import net.createmod.catnip.gui.TextureSheetSegment; import net.createmod.catnip.gui.UIRenderHelper; import net.createmod.catnip.gui.element.ScreenElement; -import net.createmod.catnip.utility.theme.Color; +import net.createmod.catnip.theme.Color; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; @@ -156,7 +156,7 @@ public enum AllGuiTextures implements ScreenElement, TextureSheetSegment { FACTORY_GAUGE_RECIPE("factory_gauge", 32, 0, 192, 96), FACTORY_GAUGE_RESTOCK("factory_gauge", 32, 112, 192, 40), FACTORY_GAUGE_BOTTOM("factory_gauge", 32, 176, 200, 64), - + STOCK_KEEPER_REQUEST_HEADER("stock_keeper", 0, 0, 256, 36), STOCK_KEEPER_REQUEST_BODY("stock_keeper", 0, 48, 256, 20), STOCK_KEEPER_REQUEST_FOOTER("stock_keeper", 0, 80, 256, 80), @@ -190,7 +190,7 @@ public enum AllGuiTextures implements ScreenElement, TextureSheetSegment { STOCK_KEEPER_CATEGORY_ENTRY("stock_keeper_categories", 38, 159, 171, 18), STOCK_KEEPER_CATEGORY_UP("stock_keeper_categories", 211, 160, 8, 8), STOCK_KEEPER_CATEGORY_DOWN("stock_keeper_categories", 211, 169, 8, 8), - + REDSTONE_REQUESTER("requester", 16, 16, 232, 120), // JEI @@ -259,7 +259,7 @@ public enum AllGuiTextures implements ScreenElement, TextureSheetSegment { COMPUTER("computer", 200, 102); ; - + public static final int FONT_COLOR = 0x575F7A; public final ResourceLocation location; diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java b/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java index 5c23ee4e07..3cd064cffb 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java @@ -9,7 +9,7 @@ import com.simibubi.create.Create; import net.createmod.catnip.gui.element.DelegatedStencilElement; import net.createmod.catnip.gui.element.ScreenElement; -import net.createmod.catnip.utility.theme.Color; +import net.createmod.catnip.theme.Color; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.MultiBufferSource; @@ -162,7 +162,7 @@ public class AllIcons implements ScreenElement { I_FX_FIELD_ON = next(), I_FX_BLEND = next(), I_FX_BLEND_OFF = next(), - + I_SEND_ONLY = newRow(), I_SEND_AND_RECEIVE = next(), I_PARTIAL_REQUESTS = next(), diff --git a/src/main/java/com/simibubi/create/foundation/gui/ModularGuiLine.java b/src/main/java/com/simibubi/create/foundation/gui/ModularGuiLine.java index 16652fdbc4..825e4e337b 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/ModularGuiLine.java +++ b/src/main/java/com/simibubi/create/foundation/gui/ModularGuiLine.java @@ -8,8 +8,8 @@ import com.simibubi.create.foundation.gui.widget.ScrollInput; import com.simibubi.create.foundation.gui.widget.TooltipArea; import net.createmod.catnip.gui.UIRenderHelper; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.data.Pair; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.components.EditBox; diff --git a/src/main/java/com/simibubi/create/foundation/gui/ModularGuiLineBuilder.java b/src/main/java/com/simibubi/create/foundation/gui/ModularGuiLineBuilder.java index 9b3b7268cd..f6645fe046 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/ModularGuiLineBuilder.java +++ b/src/main/java/com/simibubi/create/foundation/gui/ModularGuiLineBuilder.java @@ -7,9 +7,9 @@ import com.simibubi.create.foundation.gui.widget.ScrollInput; import com.simibubi.create.foundation.gui.widget.SelectionScrollInput; import com.simibubi.create.foundation.gui.widget.TooltipArea; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.Pair; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.data.Pair; +import net.createmod.catnip.lang.Components; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.components.EditBox; diff --git a/src/main/java/com/simibubi/create/foundation/gui/widget/Label.java b/src/main/java/com/simibubi/create/foundation/gui/widget/Label.java index a1dd3a0c59..99023ebc74 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/widget/Label.java +++ b/src/main/java/com/simibubi/create/foundation/gui/widget/Label.java @@ -5,7 +5,7 @@ import javax.annotation.Nonnull; import com.mojang.blaze3d.systems.RenderSystem; import net.createmod.catnip.gui.widget.AbstractSimiWidget; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphics; diff --git a/src/main/java/com/simibubi/create/foundation/gui/widget/ScrollInput.java b/src/main/java/com/simibubi/create/foundation/gui/widget/ScrollInput.java index 776b7a6fb3..6b959b03fc 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/widget/ScrollInput.java +++ b/src/main/java/com/simibubi/create/foundation/gui/widget/ScrollInput.java @@ -9,7 +9,7 @@ import com.simibubi.create.foundation.blockEntity.behaviour.scrollValue.ScrollVa import com.simibubi.create.foundation.utility.CreateLang; import net.createmod.catnip.gui.widget.AbstractSimiWidget; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.resources.sounds.SimpleSoundInstance; diff --git a/src/main/java/com/simibubi/create/foundation/gui/widget/SelectionScrollInput.java b/src/main/java/com/simibubi/create/foundation/gui/widget/SelectionScrollInput.java index dafbb7fefa..105e2bea01 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/widget/SelectionScrollInput.java +++ b/src/main/java/com/simibubi/create/foundation/gui/widget/SelectionScrollInput.java @@ -5,7 +5,7 @@ import java.util.List; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; diff --git a/src/main/java/com/simibubi/create/foundation/item/CountedItemStackList.java b/src/main/java/com/simibubi/create/foundation/item/CountedItemStackList.java index 5a259b001a..7e8f5e8772 100644 --- a/src/main/java/com/simibubi/create/foundation/item/CountedItemStackList.java +++ b/src/main/java/com/simibubi/create/foundation/item/CountedItemStackList.java @@ -9,7 +9,7 @@ import java.util.stream.Stream; import com.simibubi.create.foundation.blockEntity.behaviour.filtering.FilteringBehaviour; -import net.createmod.catnip.utility.IntAttached; +import net.createmod.catnip.data.IntAttached; import net.minecraft.network.chat.MutableComponent; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; diff --git a/src/main/java/com/simibubi/create/foundation/item/ItemDescription.java b/src/main/java/com/simibubi/create/foundation/item/ItemDescription.java index 5fdc3deb62..2e20a50aa5 100644 --- a/src/main/java/com/simibubi/create/foundation/item/ItemDescription.java +++ b/src/main/java/com/simibubi/create/foundation/item/ItemDescription.java @@ -17,8 +17,8 @@ import org.jetbrains.annotations.Nullable; import com.google.common.collect.ImmutableList; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.FontHelper.Palette; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.FontHelper.Palette; +import net.createmod.catnip.lang.Components; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.resources.language.I18n; diff --git a/src/main/java/com/simibubi/create/foundation/item/ItemHelper.java b/src/main/java/com/simibubi/create/foundation/item/ItemHelper.java index ffdd7895ca..15da360793 100644 --- a/src/main/java/com/simibubi/create/foundation/item/ItemHelper.java +++ b/src/main/java/com/simibubi/create/foundation/item/ItemHelper.java @@ -11,7 +11,7 @@ import org.apache.commons.lang3.mutable.MutableInt; import com.simibubi.create.content.logistics.box.PackageEntity; -import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.data.Pair; import net.minecraft.core.BlockPos; import net.minecraft.core.NonNullList; import net.minecraft.util.Mth; @@ -29,7 +29,7 @@ public class ItemHelper { public static boolean sameItem(ItemStack stack, ItemStack otherStack) { return !otherStack.isEmpty() && stack.is(otherStack.getItem()); } - + public static Predicate sameItemPredicate(ItemStack stack) { return s -> sameItem(stack, s); } @@ -287,7 +287,7 @@ public class ItemHelper { } return -1; } - + public static ItemStack fromItemEntity(Entity entityIn) { if (!entityIn.isAlive()) return ItemStack.EMPTY; @@ -308,5 +308,5 @@ public class ItemHelper { stack.setCount(max); return remainder; } - + } diff --git a/src/main/java/com/simibubi/create/foundation/item/KineticStats.java b/src/main/java/com/simibubi/create/foundation/item/KineticStats.java index ed5caa4bb5..337d87dcf5 100644 --- a/src/main/java/com/simibubi/create/foundation/item/KineticStats.java +++ b/src/main/java/com/simibubi/create/foundation/item/KineticStats.java @@ -19,10 +19,10 @@ import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.infrastructure.config.AllConfigs; import com.simibubi.create.infrastructure.config.CKinetics; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.lang.Components; -import net.createmod.catnip.utility.lang.Lang; -import net.createmod.catnip.utility.lang.LangBuilder; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.lang.Components; +import net.createmod.catnip.lang.Lang; +import net.createmod.catnip.lang.LangBuilder; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.BlockItem; diff --git a/src/main/java/com/simibubi/create/foundation/item/TooltipHelper.java b/src/main/java/com/simibubi/create/foundation/item/TooltipHelper.java index e11b1b6748..12f359a2e1 100644 --- a/src/main/java/com/simibubi/create/foundation/item/TooltipHelper.java +++ b/src/main/java/com/simibubi/create/foundation/item/TooltipHelper.java @@ -8,9 +8,9 @@ import java.util.List; import com.google.common.base.Strings; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.FontHelper; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.lang.FontHelper; +import net.createmod.catnip.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; diff --git a/src/main/java/com/simibubi/create/foundation/item/render/PartialItemModelRenderer.java b/src/main/java/com/simibubi/create/foundation/item/render/PartialItemModelRenderer.java index 384262f654..b4e7cc2857 100644 --- a/src/main/java/com/simibubi/create/foundation/item/render/PartialItemModelRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/item/render/PartialItemModelRenderer.java @@ -4,7 +4,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.simibubi.create.foundation.render.RenderTypes; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; diff --git a/src/main/java/com/simibubi/create/foundation/mixin/client/ModelDataRefreshMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/client/ModelDataRefreshMixin.java index dd28af8a5e..560fb1ef5d 100644 --- a/src/main/java/com/simibubi/create/foundation/mixin/client/ModelDataRefreshMixin.java +++ b/src/main/java/com/simibubi/create/foundation/mixin/client/ModelDataRefreshMixin.java @@ -5,7 +5,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import net.createmod.catnip.utility.levelWrappers.SchematicLevel; +import net.createmod.catnip.levelWrappers.SchematicLevel; import net.minecraft.client.Minecraft; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; diff --git a/src/main/java/com/simibubi/create/foundation/model/BakedModelHelper.java b/src/main/java/com/simibubi/create/foundation/model/BakedModelHelper.java index 54c41b4933..a840b8fdd6 100644 --- a/src/main/java/com/simibubi/create/foundation/model/BakedModelHelper.java +++ b/src/main/java/com/simibubi/create/foundation/model/BakedModelHelper.java @@ -10,8 +10,8 @@ import java.util.List; import java.util.Map; import java.util.function.UnaryOperator; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.math.VecHelper; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.block.model.ItemOverrides; diff --git a/src/main/java/com/simibubi/create/foundation/particle/AirParticle.java b/src/main/java/com/simibubi/create/foundation/particle/AirParticle.java index 890eabbb68..70e6fd0548 100644 --- a/src/main/java/com/simibubi/create/foundation/particle/AirParticle.java +++ b/src/main/java/com/simibubi/create/foundation/particle/AirParticle.java @@ -2,7 +2,7 @@ package com.simibubi.create.foundation.particle; import com.simibubi.create.Create; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.particle.Particle; import net.minecraft.client.particle.ParticleProvider; diff --git a/src/main/java/com/simibubi/create/foundation/placement/PoleHelper.java b/src/main/java/com/simibubi/create/foundation/placement/PoleHelper.java index 3efd9b7190..0bb9046b92 100644 --- a/src/main/java/com/simibubi/create/foundation/placement/PoleHelper.java +++ b/src/main/java/com/simibubi/create/foundation/placement/PoleHelper.java @@ -7,8 +7,8 @@ import java.util.function.Predicate; import com.simibubi.create.content.equipment.extendoGrip.ExtendoGripItem; import com.simibubi.create.infrastructure.config.AllConfigs; -import net.createmod.catnip.utility.placement.IPlacementHelper; -import net.createmod.catnip.utility.placement.PlacementOffset; +import net.createmod.catnip.placement.IPlacementHelper; +import net.createmod.catnip.placement.PlacementOffset; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/main/java/com/simibubi/create/foundation/ponder/CreateSceneBuilder.java b/src/main/java/com/simibubi/create/foundation/ponder/CreateSceneBuilder.java index fc52bed1be..9ac91dff07 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/CreateSceneBuilder.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/CreateSceneBuilder.java @@ -28,9 +28,9 @@ import com.simibubi.create.foundation.ponder.element.BeltItemElement; import com.simibubi.create.foundation.ponder.element.ExpandedParrotElement; import com.simibubi.create.foundation.ponder.instruction.AnimateBlockEntityInstruction; -import net.createmod.catnip.utility.FunctionalHelper; -import net.createmod.catnip.utility.NBTHelper; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.data.FunctionalHelper; +import net.createmod.catnip.nbt.NBTHelper; +import net.createmod.catnip.math.VecHelper; import net.createmod.ponder.api.element.ElementLink; import net.createmod.ponder.api.element.ParrotElement; import net.createmod.ponder.api.element.ParrotPose; diff --git a/src/main/java/com/simibubi/create/foundation/render/BlockEntityRenderHelper.java b/src/main/java/com/simibubi/create/foundation/render/BlockEntityRenderHelper.java index ad6b246ba8..e8962bfabb 100644 --- a/src/main/java/com/simibubi/create/foundation/render/BlockEntityRenderHelper.java +++ b/src/main/java/com/simibubi/create/foundation/render/BlockEntityRenderHelper.java @@ -17,7 +17,7 @@ import dev.engine_room.flywheel.lib.transform.TransformStack; import dev.engine_room.flywheel.lib.visualization.VisualizationHelper; import net.createmod.catnip.platform.CatnipServices; import net.createmod.catnip.render.SuperByteBuffer; -import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.animation.AnimationTickHolder; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.MultiBufferSource; diff --git a/src/main/java/com/simibubi/create/foundation/render/PlayerSkyhookRenderer.java b/src/main/java/com/simibubi/create/foundation/render/PlayerSkyhookRenderer.java index 78f650ddc5..8055ad529c 100644 --- a/src/main/java/com/simibubi/create/foundation/render/PlayerSkyhookRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/render/PlayerSkyhookRenderer.java @@ -5,8 +5,8 @@ import java.util.HashSet; import java.util.Set; import java.util.UUID; -import net.createmod.catnip.utility.AnimationTickHolder; -import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.animation.AnimationTickHolder; +import net.createmod.catnip.math.AngleHelper; import net.minecraft.client.model.HumanoidModel; import net.minecraft.util.Mth; import net.minecraft.world.entity.player.Player; diff --git a/src/main/java/com/simibubi/create/foundation/sound/RepeatingSound.java b/src/main/java/com/simibubi/create/foundation/sound/RepeatingSound.java index bb9815a55b..4ecc193391 100644 --- a/src/main/java/com/simibubi/create/foundation/sound/RepeatingSound.java +++ b/src/main/java/com/simibubi/create/foundation/sound/RepeatingSound.java @@ -1,6 +1,6 @@ package com.simibubi.create.foundation.sound; -import net.createmod.catnip.utility.AnimationTickHolder; +import net.createmod.catnip.animation.AnimationTickHolder; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.sounds.SoundEvent; diff --git a/src/main/java/com/simibubi/create/foundation/sound/SoundScape.java b/src/main/java/com/simibubi/create/foundation/sound/SoundScape.java index 40ff8f26df..a3d14eb25e 100644 --- a/src/main/java/com/simibubi/create/foundation/sound/SoundScape.java +++ b/src/main/java/com/simibubi/create/foundation/sound/SoundScape.java @@ -7,8 +7,8 @@ import com.simibubi.create.foundation.sound.SoundScapes.AmbienceGroup; import com.simibubi.create.foundation.sound.SoundScapes.PitchGroup; import com.simibubi.create.infrastructure.config.AllConfigs; -import net.createmod.catnip.utility.AnimationTickHolder; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.animation.AnimationTickHolder; +import net.createmod.catnip.math.VecHelper; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.sounds.SoundEvent; diff --git a/src/main/java/com/simibubi/create/foundation/sound/SoundScapes.java b/src/main/java/com/simibubi/create/foundation/sound/SoundScapes.java index 6d7b246a3a..8e57dc1ee1 100644 --- a/src/main/java/com/simibubi/create/foundation/sound/SoundScapes.java +++ b/src/main/java/com/simibubi/create/foundation/sound/SoundScapes.java @@ -13,8 +13,8 @@ import java.util.function.BiFunction; import com.simibubi.create.AllSoundEvents; import com.simibubi.create.infrastructure.config.AllConfigs; -import net.createmod.catnip.utility.AnimationTickHolder; -import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.animation.AnimationTickHolder; +import net.createmod.catnip.data.Pair; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.sounds.SoundEvents; diff --git a/src/main/java/com/simibubi/create/foundation/utility/BlockHelper.java b/src/main/java/com/simibubi/create/foundation/utility/BlockHelper.java index 637ec761da..20c8cc7e48 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/BlockHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/BlockHelper.java @@ -17,7 +17,7 @@ import com.simibubi.create.foundation.blockEntity.IMergeableBE; import com.simibubi.create.foundation.blockEntity.IMultiBlockEntityContainer; import com.simibubi.create.impl.schematic.nbt.SchematicSafeNBTRegistryImpl; -import net.createmod.catnip.utility.NBTProcessors; +import net.createmod.catnip.nbt.NBTProcessors; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.SectionPos; diff --git a/src/main/java/com/simibubi/create/foundation/utility/CameraAngleAnimationService.java b/src/main/java/com/simibubi/create/foundation/utility/CameraAngleAnimationService.java index de84d21b9b..3234776216 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/CameraAngleAnimationService.java +++ b/src/main/java/com/simibubi/create/foundation/utility/CameraAngleAnimationService.java @@ -1,7 +1,7 @@ package com.simibubi.create.foundation.utility; -import net.createmod.catnip.utility.animation.LerpedFloat; -import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.animation.LerpedFloat; +import net.createmod.catnip.math.AngleHelper; import net.minecraft.client.Minecraft; import net.minecraft.util.Mth; diff --git a/src/main/java/com/simibubi/create/foundation/utility/CreateLang.java b/src/main/java/com/simibubi/create/foundation/utility/CreateLang.java index cc3b039939..368f298d5e 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/CreateLang.java +++ b/src/main/java/com/simibubi/create/foundation/utility/CreateLang.java @@ -5,10 +5,10 @@ import java.util.List; import com.simibubi.create.Create; -import net.createmod.catnip.utility.lang.Components; -import net.createmod.catnip.utility.lang.Lang; -import net.createmod.catnip.utility.lang.LangBuilder; -import net.createmod.catnip.utility.lang.LangNumberFormat; +import net.createmod.catnip.lang.Components; +import net.createmod.catnip.lang.Lang; +import net.createmod.catnip.lang.LangBuilder; +import net.createmod.catnip.lang.LangNumberFormat; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.world.item.ItemStack; @@ -64,7 +64,7 @@ public class CreateLang extends Lang { public static LangBuilder text(String text) { return builder().text(text); } - + @Deprecated // Use while implementing and replace all references with Lang.translate public static LangBuilder temporaryText(String text) { return builder().text(text); diff --git a/src/main/java/com/simibubi/create/foundation/utility/CreateNBTProcessors.java b/src/main/java/com/simibubi/create/foundation/utility/CreateNBTProcessors.java index 2d3f36e8fd..c55e66907d 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/CreateNBTProcessors.java +++ b/src/main/java/com/simibubi/create/foundation/utility/CreateNBTProcessors.java @@ -4,8 +4,8 @@ import java.util.List; import com.simibubi.create.AllBlockEntityTypes; -import net.createmod.catnip.utility.NBTHelper; -import net.createmod.catnip.utility.NBTProcessors; +import net.createmod.catnip.nbt.NBTHelper; +import net.createmod.catnip.nbt.NBTProcessors; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; diff --git a/src/main/java/com/simibubi/create/foundation/utility/Debug.java b/src/main/java/com/simibubi/create/foundation/utility/Debug.java index a663012d5c..e1cc300c9e 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/Debug.java +++ b/src/main/java/com/simibubi/create/foundation/utility/Debug.java @@ -2,7 +2,7 @@ package com.simibubi.create.foundation.utility; import com.simibubi.create.Create; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.network.chat.Component; diff --git a/src/main/java/com/simibubi/create/foundation/utility/DyeHelper.java b/src/main/java/com/simibubi/create/foundation/utility/DyeHelper.java index 772f0aaf7c..cad6890758 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/DyeHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/DyeHelper.java @@ -4,7 +4,7 @@ import java.util.Map; import com.google.common.collect.ImmutableMap; -import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.data.Couple; import net.minecraft.world.item.DyeColor; import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.block.Blocks; diff --git a/src/main/java/com/simibubi/create/foundation/utility/DynamicComponent.java b/src/main/java/com/simibubi/create/foundation/utility/DynamicComponent.java index 78cf5af81c..5792f794ee 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/DynamicComponent.java +++ b/src/main/java/com/simibubi/create/foundation/utility/DynamicComponent.java @@ -6,7 +6,7 @@ import com.google.gson.JsonParser; import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.simibubi.create.Create; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.commands.CommandSource; import net.minecraft.commands.CommandSourceStack; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/simibubi/create/foundation/utility/FilesHelper.java b/src/main/java/com/simibubi/create/foundation/utility/FilesHelper.java index 560f38833a..18f7c54b6f 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/FilesHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/FilesHelper.java @@ -16,7 +16,7 @@ import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; import com.simibubi.create.Create; -import net.createmod.catnip.utility.lang.Lang; +import net.createmod.catnip.lang.Lang; import net.minecraft.nbt.CompoundTag; public class FilesHelper { diff --git a/src/main/java/com/simibubi/create/foundation/utility/FluidFormatter.java b/src/main/java/com/simibubi/create/foundation/utility/FluidFormatter.java index 117d7c706d..c29d7777dc 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/FluidFormatter.java +++ b/src/main/java/com/simibubi/create/foundation/utility/FluidFormatter.java @@ -1,7 +1,7 @@ package com.simibubi.create.foundation.utility; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.lang.Components; import net.minecraft.network.chat.MutableComponent; public class FluidFormatter { diff --git a/src/main/java/com/simibubi/create/foundation/utility/ServerSpeedProvider.java b/src/main/java/com/simibubi/create/foundation/utility/ServerSpeedProvider.java index 3e37ec7405..16dbf7f853 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/ServerSpeedProvider.java +++ b/src/main/java/com/simibubi/create/foundation/utility/ServerSpeedProvider.java @@ -4,8 +4,8 @@ import com.simibubi.create.AllPackets; import com.simibubi.create.foundation.networking.SimplePacketBase; import com.simibubi.create.infrastructure.config.AllConfigs; -import net.createmod.catnip.utility.animation.LerpedFloat; -import net.createmod.catnip.utility.animation.LerpedFloat.Chaser; +import net.createmod.catnip.animation.LerpedFloat; +import net.createmod.catnip.animation.LerpedFloat.Chaser; import net.minecraft.client.Minecraft; import net.minecraft.network.FriendlyByteBuf; import net.minecraftforge.api.distmarker.Dist; diff --git a/src/main/java/com/simibubi/create/foundation/utility/TreeCutter.java b/src/main/java/com/simibubi/create/foundation/utility/TreeCutter.java index 7422940357..aa03c5a7f5 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/TreeCutter.java +++ b/src/main/java/com/simibubi/create/foundation/utility/TreeCutter.java @@ -19,7 +19,7 @@ import com.simibubi.create.AllTags.AllBlockTags; import com.simibubi.create.compat.Mods; import com.simibubi.create.compat.dynamictrees.DynamicTree; -import net.createmod.catnip.utility.Iterate; +import net.createmod.catnip.data.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.tags.BlockTags; diff --git a/src/main/java/com/simibubi/create/infrastructure/command/ClearBufferCacheCommand.java b/src/main/java/com/simibubi/create/infrastructure/command/ClearBufferCacheCommand.java index 41fd164c52..65d1366df1 100644 --- a/src/main/java/com/simibubi/create/infrastructure/command/ClearBufferCacheCommand.java +++ b/src/main/java/com/simibubi/create/infrastructure/command/ClearBufferCacheCommand.java @@ -3,7 +3,7 @@ package com.simibubi.create.infrastructure.command; import com.mojang.brigadier.builder.ArgumentBuilder; import com.simibubi.create.CreateClient; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.createmod.ponder.PonderClient; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; diff --git a/src/main/java/com/simibubi/create/infrastructure/command/CloneCommand.java b/src/main/java/com/simibubi/create/infrastructure/command/CloneCommand.java index 30e7679ff8..5bd830cec2 100644 --- a/src/main/java/com/simibubi/create/infrastructure/command/CloneCommand.java +++ b/src/main/java/com/simibubi/create/infrastructure/command/CloneCommand.java @@ -9,7 +9,7 @@ import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.brigadier.exceptions.Dynamic2CommandExceptionType; import com.simibubi.create.content.contraptions.glue.SuperGlueEntity; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; import net.minecraft.commands.arguments.coordinates.BlockPosArgument; diff --git a/src/main/java/com/simibubi/create/infrastructure/command/CouplingCommand.java b/src/main/java/com/simibubi/create/infrastructure/command/CouplingCommand.java index 3ff24ad742..49594fd0ed 100644 --- a/src/main/java/com/simibubi/create/infrastructure/command/CouplingCommand.java +++ b/src/main/java/com/simibubi/create/infrastructure/command/CouplingCommand.java @@ -13,8 +13,8 @@ import com.simibubi.create.content.contraptions.minecart.CouplingHandler; import com.simibubi.create.content.contraptions.minecart.capability.CapabilityMinecartController; import com.simibubi.create.content.contraptions.minecart.capability.MinecartController; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.lang.Components; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; import net.minecraft.commands.arguments.EntityArgument; @@ -170,7 +170,7 @@ public class CouplingCommand { controller.decouple(); ctx.getSource() - .sendSuccess(() -> + .sendSuccess(() -> Components.literal("Removed " + couplings + " couplings from the Minecart"), true); return couplings; diff --git a/src/main/java/com/simibubi/create/infrastructure/command/CreateTestCommand.java b/src/main/java/com/simibubi/create/infrastructure/command/CreateTestCommand.java index 5efb2f27c6..72ca80fd69 100644 --- a/src/main/java/com/simibubi/create/infrastructure/command/CreateTestCommand.java +++ b/src/main/java/com/simibubi/create/infrastructure/command/CreateTestCommand.java @@ -20,7 +20,7 @@ import com.simibubi.create.content.schematics.SchematicExport; import com.simibubi.create.content.schematics.SchematicExport.SchematicExportResult; import com.simibubi.create.content.schematics.client.SchematicAndQuillHandler; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.commands.CommandSourceStack; import net.minecraft.server.level.ServerLevel; diff --git a/src/main/java/com/simibubi/create/infrastructure/command/DebugValueCommand.java b/src/main/java/com/simibubi/create/infrastructure/command/DebugValueCommand.java index d6c2667658..c35646a18e 100644 --- a/src/main/java/com/simibubi/create/infrastructure/command/DebugValueCommand.java +++ b/src/main/java/com/simibubi/create/infrastructure/command/DebugValueCommand.java @@ -3,7 +3,7 @@ package com.simibubi.create.infrastructure.command; import com.mojang.brigadier.arguments.FloatArgumentType; import com.mojang.brigadier.builder.ArgumentBuilder; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; diff --git a/src/main/java/com/simibubi/create/infrastructure/command/DumpRailwaysCommand.java b/src/main/java/com/simibubi/create/infrastructure/command/DumpRailwaysCommand.java index 9be001c436..95adee274f 100644 --- a/src/main/java/com/simibubi/create/infrastructure/command/DumpRailwaysCommand.java +++ b/src/main/java/com/simibubi/create/infrastructure/command/DumpRailwaysCommand.java @@ -15,7 +15,7 @@ import com.simibubi.create.content.trains.schedule.ScheduleRuntime; import com.simibubi.create.content.trains.signal.SignalBoundary; import com.simibubi.create.content.trains.station.GlobalStation; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; diff --git a/src/main/java/com/simibubi/create/infrastructure/command/FixLightingCommand.java b/src/main/java/com/simibubi/create/infrastructure/command/FixLightingCommand.java index 287087e609..96c13f22ab 100644 --- a/src/main/java/com/simibubi/create/infrastructure/command/FixLightingCommand.java +++ b/src/main/java/com/simibubi/create/infrastructure/command/FixLightingCommand.java @@ -3,7 +3,7 @@ package com.simibubi.create.infrastructure.command; import com.mojang.brigadier.builder.ArgumentBuilder; import net.createmod.catnip.platform.CatnipServices; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; import net.minecraft.server.level.ServerPlayer; @@ -21,7 +21,7 @@ public class FixLightingCommand { ); ctx.getSource() - .sendSuccess(() -> + .sendSuccess(() -> Components.literal("Forge's experimental block rendering pipeline is now enabled."), true); return 1; diff --git a/src/main/java/com/simibubi/create/infrastructure/command/HighlightCommand.java b/src/main/java/com/simibubi/create/infrastructure/command/HighlightCommand.java index 6e0af02f78..ddfa79f728 100644 --- a/src/main/java/com/simibubi/create/infrastructure/command/HighlightCommand.java +++ b/src/main/java/com/simibubi/create/infrastructure/command/HighlightCommand.java @@ -8,7 +8,7 @@ import com.simibubi.create.AllPackets; import com.simibubi.create.content.contraptions.AssemblyException; import com.simibubi.create.content.contraptions.IDisplayAssemblyExceptions; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; import net.minecraft.commands.arguments.EntityArgument; @@ -59,7 +59,7 @@ public class HighlightCommand { } private static void sendMissMessage(CommandSourceStack source) { - source.sendSuccess(() -> + source.sendSuccess(() -> Components.literal("Try looking at a Block that has failed to assemble a Contraption and try again."), true); } diff --git a/src/main/java/com/simibubi/create/infrastructure/command/HighlightPacket.java b/src/main/java/com/simibubi/create/infrastructure/command/HighlightPacket.java index 42ec509823..e67955a094 100644 --- a/src/main/java/com/simibubi/create/infrastructure/command/HighlightPacket.java +++ b/src/main/java/com/simibubi/create/infrastructure/command/HighlightPacket.java @@ -3,7 +3,7 @@ package com.simibubi.create.infrastructure.command; import com.simibubi.create.AllSpecialTextures; import com.simibubi.create.foundation.networking.SimplePacketBase; -import net.createmod.catnip.utility.outliner.Outliner; +import net.createmod.catnip.outliner.Outliner; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.network.FriendlyByteBuf; diff --git a/src/main/java/com/simibubi/create/infrastructure/command/OverlayConfigCommand.java b/src/main/java/com/simibubi/create/infrastructure/command/OverlayConfigCommand.java index 431a2cbc2c..50ffbc88cc 100644 --- a/src/main/java/com/simibubi/create/infrastructure/command/OverlayConfigCommand.java +++ b/src/main/java/com/simibubi/create/infrastructure/command/OverlayConfigCommand.java @@ -4,7 +4,7 @@ import com.mojang.brigadier.Command; import com.mojang.brigadier.builder.ArgumentBuilder; import net.createmod.catnip.platform.CatnipServices; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; import net.minecraft.server.level.ServerPlayer; diff --git a/src/main/java/com/simibubi/create/infrastructure/command/ReplaceInCommandBlocksCommand.java b/src/main/java/com/simibubi/create/infrastructure/command/ReplaceInCommandBlocksCommand.java index b492f0da5e..c304d34de3 100644 --- a/src/main/java/com/simibubi/create/infrastructure/command/ReplaceInCommandBlocksCommand.java +++ b/src/main/java/com/simibubi/create/infrastructure/command/ReplaceInCommandBlocksCommand.java @@ -5,7 +5,7 @@ import org.apache.commons.lang3.mutable.MutableInt; import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.builder.ArgumentBuilder; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; import net.minecraft.commands.arguments.coordinates.BlockPosArgument; diff --git a/src/main/java/com/simibubi/create/infrastructure/command/SimpleCreateActions.java b/src/main/java/com/simibubi/create/infrastructure/command/SimpleCreateActions.java index a278c97399..b0f0e2d4fa 100644 --- a/src/main/java/com/simibubi/create/infrastructure/command/SimpleCreateActions.java +++ b/src/main/java/com/simibubi/create/infrastructure/command/SimpleCreateActions.java @@ -7,7 +7,7 @@ import com.simibubi.create.foundation.utility.CameraAngleAnimationService; import com.simibubi.create.infrastructure.config.AllConfigs; import net.createmod.catnip.gui.ScreenOpener; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; diff --git a/src/main/java/com/simibubi/create/infrastructure/command/TrainCommand.java b/src/main/java/com/simibubi/create/infrastructure/command/TrainCommand.java index a474586001..61094b472a 100644 --- a/src/main/java/com/simibubi/create/infrastructure/command/TrainCommand.java +++ b/src/main/java/com/simibubi/create/infrastructure/command/TrainCommand.java @@ -10,7 +10,7 @@ import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.simibubi.create.Create; import com.simibubi.create.content.trains.entity.Train; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; import net.minecraft.commands.arguments.UuidArgument; diff --git a/src/main/java/com/simibubi/create/infrastructure/config/CStress.java b/src/main/java/com/simibubi/create/infrastructure/config/CStress.java index 1119acf277..4d5a3f104b 100644 --- a/src/main/java/com/simibubi/create/infrastructure/config/CStress.java +++ b/src/main/java/com/simibubi/create/infrastructure/config/CStress.java @@ -10,7 +10,7 @@ import com.simibubi.create.content.kinetics.BlockStressValues.IStressValueProvid import net.createmod.catnip.config.ConfigBase; import net.createmod.catnip.platform.CatnipServices; -import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.data.Couple; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.Block; import net.minecraftforge.common.ForgeConfigSpec.Builder; diff --git a/src/main/java/com/simibubi/create/infrastructure/gametest/tests/TestItems.java b/src/main/java/com/simibubi/create/infrastructure/gametest/tests/TestItems.java index ee1e080d09..e7695807b5 100644 --- a/src/main/java/com/simibubi/create/infrastructure/gametest/tests/TestItems.java +++ b/src/main/java/com/simibubi/create/infrastructure/gametest/tests/TestItems.java @@ -18,7 +18,7 @@ import com.simibubi.create.infrastructure.gametest.CreateGameTestHelper; import com.simibubi.create.infrastructure.gametest.GameTestGroup; import it.unimi.dsi.fastutil.objects.Object2LongMap; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.Util; import net.minecraft.core.BlockPos; import net.minecraft.gametest.framework.GameTest; diff --git a/src/main/java/com/simibubi/create/infrastructure/gui/CreateMainMenuScreen.java b/src/main/java/com/simibubi/create/infrastructure/gui/CreateMainMenuScreen.java index 9b9ce5b545..80294228c4 100644 --- a/src/main/java/com/simibubi/create/infrastructure/gui/CreateMainMenuScreen.java +++ b/src/main/java/com/simibubi/create/infrastructure/gui/CreateMainMenuScreen.java @@ -14,11 +14,11 @@ import net.createmod.catnip.gui.AbstractSimiScreen; import net.createmod.catnip.gui.ScreenOpener; import net.createmod.catnip.gui.element.BoxElement; import net.createmod.catnip.gui.element.GuiGameElement; -import net.createmod.catnip.utility.FontHelper; -import net.createmod.catnip.utility.FontHelper.Palette; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.lang.Components; -import net.createmod.catnip.utility.theme.Color; +import net.createmod.catnip.lang.FontHelper; +import net.createmod.catnip.lang.FontHelper.Palette; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.lang.Components; +import net.createmod.catnip.theme.Color; import net.createmod.ponder.foundation.ui.PonderTagIndexScreen; import net.minecraft.ChatFormatting; import net.minecraft.Util; diff --git a/src/main/java/com/simibubi/create/infrastructure/gui/OpenCreateMenuButton.java b/src/main/java/com/simibubi/create/infrastructure/gui/OpenCreateMenuButton.java index e5abd3aeec..444c57329d 100644 --- a/src/main/java/com/simibubi/create/infrastructure/gui/OpenCreateMenuButton.java +++ b/src/main/java/com/simibubi/create/infrastructure/gui/OpenCreateMenuButton.java @@ -10,7 +10,7 @@ import com.simibubi.create.AllItems; import com.simibubi.create.infrastructure.config.AllConfigs; import net.createmod.catnip.gui.ScreenOpener; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.lang.Components; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphics; @@ -39,7 +39,7 @@ public class OpenCreateMenuButton extends Button { public void renderString(GuiGraphics graphics, Font pFont, int pColor) { graphics.renderItem(ICON, getX() + 2, getY() + 2); } - + public static void click(Button b) { ScreenOpener.open(new CreateMainMenuScreen(Minecraft.getInstance().screen)); } diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ArmScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ArmScenes.java index 0dcdf97e72..92ed388cb2 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ArmScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ArmScenes.java @@ -7,7 +7,7 @@ import com.simibubi.create.content.kinetics.mechanicalArm.ArmBlockEntity.Phase; import com.simibubi.create.content.logistics.funnel.FunnelBlockEntity; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; -import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.math.Pointing; import net.createmod.ponder.api.PonderPalette; import net.createmod.ponder.api.element.ElementLink; import net.createmod.ponder.api.element.WorldSectionElement; diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/BearingScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/BearingScenes.java index 8826126d59..a7e7bc1324 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/BearingScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/BearingScenes.java @@ -7,8 +7,8 @@ import com.simibubi.create.content.contraptions.bearing.SailBlock; import com.simibubi.create.content.contraptions.glue.SuperGlueEntity; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.math.Pointing; import net.createmod.ponder.api.PonderPalette; import net.createmod.ponder.api.element.ElementLink; import net.createmod.ponder.api.element.WorldSectionElement; diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/BeltScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/BeltScenes.java index 97e73d9432..7ae49e27e8 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/BeltScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/BeltScenes.java @@ -16,8 +16,8 @@ import com.simibubi.create.content.kinetics.press.PressingBehaviour.Mode; import com.simibubi.create.content.kinetics.simpleRelays.ShaftBlock; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; -import net.createmod.catnip.utility.NBTHelper; -import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.nbt.NBTHelper; +import net.createmod.catnip.math.Pointing; import net.createmod.ponder.api.PonderPalette; import net.createmod.ponder.api.element.ElementLink; import net.createmod.ponder.api.element.EntityElement; diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/CartAssemblerScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/CartAssemblerScenes.java index 79dcb784cc..00da8ea3f4 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/CartAssemblerScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/CartAssemblerScenes.java @@ -6,7 +6,7 @@ import com.simibubi.create.content.contraptions.mounted.CartAssembleRailType; import com.simibubi.create.content.contraptions.mounted.CartAssemblerBlock; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; -import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.math.Pointing; import net.createmod.ponder.api.ParticleEmitter; import net.createmod.ponder.api.PonderPalette; import net.createmod.ponder.api.element.ElementLink; diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ChainDriveScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ChainDriveScenes.java index 45fcb27292..bdeb4d3a99 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ChainDriveScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ChainDriveScenes.java @@ -5,7 +5,7 @@ import com.simibubi.create.content.kinetics.chainDrive.ChainDriveBlock; import com.simibubi.create.content.redstone.analogLever.AnalogLeverBlockEntity; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; -import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.math.Pointing; import net.createmod.ponder.api.PonderPalette; import net.createmod.ponder.api.element.ElementLink; import net.createmod.ponder.api.element.TextElementBuilder; diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ChassisScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ChassisScenes.java index 0db35ab9dc..0f7d0057a7 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ChassisScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ChassisScenes.java @@ -7,7 +7,7 @@ import com.simibubi.create.content.contraptions.chassis.LinearChassisBlock; import com.simibubi.create.content.contraptions.chassis.RadialChassisBlock; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; -import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.math.Pointing; import net.createmod.ponder.api.PonderPalette; import net.createmod.ponder.api.element.ElementLink; import net.createmod.ponder.api.element.WorldSectionElement; diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ChuteScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ChuteScenes.java index 91104d6c79..a59545546d 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ChuteScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ChuteScenes.java @@ -9,7 +9,7 @@ import com.simibubi.create.content.logistics.chute.ChuteBlock.Shape; import com.simibubi.create.content.logistics.chute.SmartChuteBlockEntity; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; -import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.math.Pointing; import net.createmod.ponder.api.PonderPalette; import net.createmod.ponder.api.element.ElementLink; import net.createmod.ponder.api.element.EntityElement; diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/CrafterScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/CrafterScenes.java index 507511dcaa..d7d176d7fa 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/CrafterScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/CrafterScenes.java @@ -8,8 +8,8 @@ import com.simibubi.create.content.kinetics.crafter.MechanicalCrafterBlock; import com.simibubi.create.content.kinetics.crafter.MechanicalCrafterBlockEntity; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; -import net.createmod.catnip.utility.Couple; -import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.math.Pointing; import net.createmod.ponder.api.PonderPalette; import net.createmod.ponder.api.element.ElementLink; import net.createmod.ponder.api.element.EntityElement; diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/DeployerScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/DeployerScenes.java index 078ff70c6b..079274e06c 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/DeployerScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/DeployerScenes.java @@ -7,7 +7,7 @@ import com.simibubi.create.content.kinetics.deployer.DeployerBlockEntity; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import com.simibubi.create.foundation.ponder.element.BeltItemElement; -import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.math.Pointing; import net.createmod.ponder.api.PonderPalette; import net.createmod.ponder.api.element.ElementLink; import net.createmod.ponder.api.element.EntityElement; diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/DetectorScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/DetectorScenes.java index d4828efd09..f3b20941cf 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/DetectorScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/DetectorScenes.java @@ -4,7 +4,7 @@ import com.simibubi.create.content.redstone.smartObserver.SmartObserverBlockEnti import com.simibubi.create.content.redstone.thresholdSwitch.ThresholdSwitchBlock; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; -import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.math.Pointing; import net.createmod.ponder.api.PonderPalette; import net.createmod.ponder.api.element.ElementLink; import net.createmod.ponder.api.element.WorldSectionElement; diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/DisplayScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/DisplayScenes.java index 29a475e6a7..ea80ec8bd5 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/DisplayScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/DisplayScenes.java @@ -7,8 +7,8 @@ import com.simibubi.create.content.equipment.clipboard.ClipboardOverrides.Clipbo import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.utility.Pointing; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.math.Pointing; +import net.createmod.catnip.lang.Components; import net.createmod.ponder.api.PonderPalette; import net.createmod.ponder.api.element.ElementLink; import net.createmod.ponder.api.element.WorldSectionElement; diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/EjectorScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/EjectorScenes.java index d4efb9cb50..ca675ec21a 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/EjectorScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/EjectorScenes.java @@ -5,8 +5,8 @@ import com.simibubi.create.content.logistics.depot.EjectorBlockEntity; import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; -import net.createmod.catnip.utility.NBTHelper; -import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.nbt.NBTHelper; +import net.createmod.catnip.math.Pointing; import net.createmod.ponder.api.PonderPalette; import net.createmod.ponder.api.element.ElementLink; import net.createmod.ponder.api.element.ParrotElement; diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ElevatorScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ElevatorScenes.java index 7f16873b40..6f19b1f4af 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ElevatorScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ElevatorScenes.java @@ -8,8 +8,8 @@ import com.simibubi.create.content.redstone.nixieTube.NixieTubeBlock; import com.simibubi.create.content.redstone.nixieTube.NixieTubeBlockEntity; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; -import net.createmod.catnip.utility.Pointing; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.math.Pointing; +import net.createmod.catnip.lang.Components; import net.createmod.ponder.api.PonderPalette; import net.createmod.ponder.api.element.ElementLink; import net.createmod.ponder.api.element.WorldSectionElement; diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/FanScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/FanScenes.java index 8c0917317c..4eff23213b 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/FanScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/FanScenes.java @@ -5,7 +5,7 @@ import com.simibubi.create.content.logistics.depot.DepotBlockEntity; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import com.simibubi.create.foundation.ponder.element.BeltItemElement; -import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.math.Pointing; import net.createmod.ponder.api.PonderPalette; import net.createmod.ponder.api.element.ElementLink; import net.createmod.ponder.api.element.EntityElement; diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/FunnelScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/FunnelScenes.java index 82af5c1bb4..e39746b6d0 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/FunnelScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/FunnelScenes.java @@ -7,7 +7,7 @@ import com.simibubi.create.content.logistics.funnel.FunnelBlock; import com.simibubi.create.content.logistics.funnel.FunnelBlockEntity; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; -import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.math.Pointing; import net.createmod.ponder.api.PonderPalette; import net.createmod.ponder.api.element.ElementLink; import net.createmod.ponder.api.element.EntityElement; diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/GantryScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/GantryScenes.java index 2f1464cfc9..43d51a1848 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/GantryScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/GantryScenes.java @@ -3,8 +3,8 @@ package com.simibubi.create.infrastructure.ponder.scenes; import com.simibubi.create.AllItems; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.math.Pointing; import net.createmod.ponder.api.PonderPalette; import net.createmod.ponder.api.element.ElementLink; import net.createmod.ponder.api.element.WorldSectionElement; diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ItemVaultScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ItemVaultScenes.java index 8eeb84ba0c..7e459f60ba 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ItemVaultScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ItemVaultScenes.java @@ -4,7 +4,7 @@ import com.simibubi.create.AllItems; import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; -import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.math.Pointing; import net.createmod.ponder.api.PonderPalette; import net.createmod.ponder.api.element.ElementLink; import net.createmod.ponder.api.element.WorldSectionElement; diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/KineticsScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/KineticsScenes.java index 6490e0ea59..b765ca4a35 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/KineticsScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/KineticsScenes.java @@ -17,7 +17,7 @@ import com.simibubi.create.content.redstone.nixieTube.NixieTubeBlockEntity; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import com.tterrag.registrate.util.entry.BlockEntry; -import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.math.Pointing; import net.createmod.ponder.api.PonderPalette; import net.createmod.ponder.api.element.ElementLink; import net.createmod.ponder.api.element.WorldSectionElement; diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/MechanicalDrillScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/MechanicalDrillScenes.java index 74ebd73dff..40cb1cfb3a 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/MechanicalDrillScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/MechanicalDrillScenes.java @@ -2,7 +2,7 @@ package com.simibubi.create.infrastructure.ponder.scenes; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; -import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.math.Pointing; import net.createmod.ponder.api.element.ElementLink; import net.createmod.ponder.api.element.EntityElement; import net.createmod.ponder.api.element.WorldSectionElement; diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/MechanicalSawScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/MechanicalSawScenes.java index 1a0cefd8e3..66d400cae4 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/MechanicalSawScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/MechanicalSawScenes.java @@ -5,7 +5,7 @@ import com.simibubi.create.content.kinetics.saw.SawBlockEntity; import com.simibubi.create.content.kinetics.simpleRelays.ShaftBlock; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; -import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.math.Pointing; import net.createmod.ponder.api.PonderPalette; import net.createmod.ponder.api.element.ElementLink; import net.createmod.ponder.api.element.EntityElement; diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/MovementActorScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/MovementActorScenes.java index 100875d897..7b48e560f4 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/MovementActorScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/MovementActorScenes.java @@ -8,7 +8,7 @@ import com.simibubi.create.content.contraptions.actors.psi.PortableStorageInterf import com.simibubi.create.content.contraptions.chassis.LinearChassisBlock; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; -import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.math.Pointing; import net.createmod.ponder.api.PonderPalette; import net.createmod.ponder.api.element.ElementLink; import net.createmod.ponder.api.element.EntityElement; diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/PistonScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/PistonScenes.java index 5ff861952c..4ba9990d33 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/PistonScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/PistonScenes.java @@ -4,7 +4,7 @@ import com.simibubi.create.AllItems; import com.simibubi.create.content.contraptions.piston.MechanicalPistonHeadBlock; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; -import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.math.Pointing; import net.createmod.ponder.api.PonderPalette; import net.createmod.ponder.api.element.ElementLink; import net.createmod.ponder.api.element.ParrotElement; diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ProcessingScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ProcessingScenes.java index f564545af2..0352274234 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ProcessingScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/ProcessingScenes.java @@ -16,10 +16,10 @@ import com.simibubi.create.content.processing.burner.LitBlazeBurnerBlock; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import com.simibubi.create.foundation.ponder.element.BeltItemElement; -import net.createmod.catnip.utility.IntAttached; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.NBTHelper; -import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.data.IntAttached; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.nbt.NBTHelper; +import net.createmod.catnip.math.Pointing; import net.createmod.ponder.api.ParticleEmitter; import net.createmod.ponder.api.PonderPalette; import net.createmod.ponder.api.element.ElementLink; diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/PulleyScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/PulleyScenes.java index 4435fd99fb..ad804cdc94 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/PulleyScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/PulleyScenes.java @@ -3,7 +3,7 @@ package com.simibubi.create.infrastructure.ponder.scenes; import com.simibubi.create.AllItems; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; -import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.math.Pointing; import net.createmod.ponder.api.PonderPalette; import net.createmod.ponder.api.element.ElementLink; import net.createmod.ponder.api.element.WorldSectionElement; diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/RedstoneScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/RedstoneScenes.java index 3f48f20ab9..11365bfcdd 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/RedstoneScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/RedstoneScenes.java @@ -18,8 +18,8 @@ import com.simibubi.create.content.redstone.nixieTube.NixieTubeBlock; import com.simibubi.create.content.redstone.nixieTube.NixieTubeBlockEntity; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; -import net.createmod.catnip.utility.Pointing; -import net.createmod.catnip.utility.lang.Components; +import net.createmod.catnip.math.Pointing; +import net.createmod.catnip.lang.Components; import net.createmod.ponder.api.PonderPalette; import net.createmod.ponder.api.element.ElementLink; import net.createmod.ponder.api.element.ParrotPose; diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/RedstoneScenes2.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/RedstoneScenes2.java index 1fd3bd01b3..d808247fec 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/RedstoneScenes2.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/RedstoneScenes2.java @@ -8,7 +8,7 @@ import com.simibubi.create.content.redstone.nixieTube.NixieTubeBlockEntity; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import com.simibubi.create.foundation.ponder.CreateSceneBuilder.WorldInstructions; -import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.math.Pointing; import net.createmod.ponder.api.element.ElementLink; import net.createmod.ponder.api.element.WorldSectionElement; import net.createmod.ponder.api.scene.SceneBuilder; @@ -360,9 +360,9 @@ public class RedstoneScenes2 { scene.idle(1); world.toggleRedstonePower(select.position(0, 1, 2)); scene.idle(10); - + scene.markAsFinished(); - + scene.idle(86); world.cycleBlockProperty(circuitPos, BrassDiodeBlock.POWERING); world.toggleRedstonePower(select.fromTo(1, 1, 2, 0, 1, 2)); diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/RollerScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/RollerScenes.java index 7b04545e6c..0f83016cc2 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/RollerScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/RollerScenes.java @@ -5,7 +5,7 @@ import com.simibubi.create.content.trains.station.StationBlock; import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; -import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.math.Pointing; import net.createmod.ponder.api.PonderPalette; import net.createmod.ponder.api.element.ElementLink; import net.createmod.ponder.api.element.ParrotElement; diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/SteamScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/SteamScenes.java index 37aba99e73..6399c305d3 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/SteamScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/SteamScenes.java @@ -10,8 +10,8 @@ import com.simibubi.create.content.processing.burner.BlazeBurnerBlock; import com.simibubi.create.content.processing.burner.BlazeBurnerBlock.HeatLevel; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.math.Pointing; import net.createmod.ponder.api.PonderPalette; import net.createmod.ponder.api.element.ElementLink; import net.createmod.ponder.api.element.WorldSectionElement; diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/TunnelScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/TunnelScenes.java index 6c9c22d8f1..7fdb72f102 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/TunnelScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/TunnelScenes.java @@ -11,10 +11,10 @@ import com.simibubi.create.foundation.blockEntity.behaviour.scrollValue.ScrollOp import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; -import net.createmod.catnip.utility.Iterate; -import net.createmod.catnip.utility.NBTHelper; -import net.createmod.catnip.utility.Pointing; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.nbt.NBTHelper; +import net.createmod.catnip.math.Pointing; +import net.createmod.catnip.math.VecHelper; import net.createmod.ponder.api.PonderPalette; import net.createmod.ponder.api.element.ElementLink; import net.createmod.ponder.api.element.WorldSectionElement; diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/DrainScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/DrainScenes.java index e86154ebef..781c14b0d5 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/DrainScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/DrainScenes.java @@ -4,7 +4,7 @@ import com.simibubi.create.content.fluids.drain.ItemDrainBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.fluid.SmartFluidTankBehaviour; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; -import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.math.Pointing; import net.createmod.ponder.api.element.ElementLink; import net.createmod.ponder.api.element.WorldSectionElement; import net.createmod.ponder.api.scene.SceneBuilder; diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/FluidMovementActorScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/FluidMovementActorScenes.java index 5f61d8753c..4aa674b225 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/FluidMovementActorScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/FluidMovementActorScenes.java @@ -7,7 +7,7 @@ import com.simibubi.create.content.fluids.tank.FluidTankBlockEntity; import com.simibubi.create.foundation.fluid.FluidHelper; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; -import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.math.Pointing; import net.createmod.ponder.api.PonderPalette; import net.createmod.ponder.api.element.ElementLink; import net.createmod.ponder.api.element.WorldSectionElement; diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/FluidTankScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/FluidTankScenes.java index 251f8bc58a..aed5c7cb70 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/FluidTankScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/FluidTankScenes.java @@ -15,8 +15,8 @@ import com.simibubi.create.foundation.fluid.FluidHelper; import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; -import net.createmod.catnip.utility.Pointing; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.math.Pointing; +import net.createmod.catnip.math.VecHelper; import net.createmod.ponder.api.PonderPalette; import net.createmod.ponder.api.element.ElementLink; import net.createmod.ponder.api.element.WorldSectionElement; diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/PipeScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/PipeScenes.java index b9483d58e7..eba751f78d 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/PipeScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/PipeScenes.java @@ -17,7 +17,7 @@ import com.simibubi.create.foundation.blockEntity.behaviour.fluid.SmartFluidTank import com.simibubi.create.foundation.fluid.FluidHelper; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; -import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.math.Pointing; import net.createmod.ponder.api.PonderPalette; import net.createmod.ponder.api.element.ElementLink; import net.createmod.ponder.api.element.WorldSectionElement; diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/PumpScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/PumpScenes.java index 90328d26bb..bab97c6225 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/PumpScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/PumpScenes.java @@ -9,7 +9,7 @@ import com.simibubi.create.content.fluids.tank.FluidTankBlockEntity; import com.simibubi.create.content.kinetics.simpleRelays.CogWheelBlock; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; -import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.math.Pointing; import net.createmod.ponder.api.PonderPalette; import net.createmod.ponder.api.element.ElementLink; import net.createmod.ponder.api.element.WorldSectionElement; diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/SpoutScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/SpoutScenes.java index 4cd6047e61..f383e7c984 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/SpoutScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/fluid/SpoutScenes.java @@ -9,8 +9,8 @@ import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import com.simibubi.create.foundation.ponder.element.BeltItemElement; -import net.createmod.catnip.utility.Pointing; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.math.Pointing; +import net.createmod.catnip.math.VecHelper; import net.createmod.ponder.api.PonderPalette; import net.createmod.ponder.api.element.ElementLink; import net.createmod.ponder.api.element.WorldSectionElement; diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/FrogAndConveyorScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/FrogAndConveyorScenes.java index 30f25bd262..4c002bfe4c 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/FrogAndConveyorScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/FrogAndConveyorScenes.java @@ -15,8 +15,8 @@ import com.simibubi.create.content.logistics.packagePort.frogport.FrogportBlockE import com.simibubi.create.content.logistics.packager.PackagerBlockEntity; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; -import net.createmod.catnip.utility.Pointing; -import net.createmod.catnip.utility.math.AngleHelper; +import net.createmod.catnip.math.Pointing; +import net.createmod.catnip.math.AngleHelper; import net.createmod.ponder.api.PonderPalette; import net.createmod.ponder.api.element.ElementLink; import net.createmod.ponder.api.element.ParrotElement; diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/PackagerScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/PackagerScenes.java index e713358119..b300a267fc 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/PackagerScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/PackagerScenes.java @@ -7,7 +7,7 @@ import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.content.logistics.box.PackageStyles; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; -import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.math.Pointing; import net.createmod.ponder.api.PonderPalette; import net.createmod.ponder.api.element.ElementLink; import net.createmod.ponder.api.element.WorldSectionElement; diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/PostboxScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/PostboxScenes.java index ae1f07507a..709a4fb774 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/PostboxScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/PostboxScenes.java @@ -8,7 +8,7 @@ import com.simibubi.create.content.logistics.box.PackageStyles; import com.simibubi.create.content.logistics.packagePort.postbox.PostboxBlockEntity; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; -import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.math.Pointing; import net.createmod.ponder.api.PonderPalette; import net.createmod.ponder.api.element.ElementLink; import net.createmod.ponder.api.element.ParrotElement; diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrackObserverScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrackObserverScenes.java index c5c9f56135..013d05bc01 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrackObserverScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrackObserverScenes.java @@ -4,7 +4,7 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.content.trains.observer.TrackObserverBlockEntity; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; -import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.math.Pointing; import net.createmod.ponder.api.PonderPalette; import net.createmod.ponder.api.element.ElementLink; import net.createmod.ponder.api.element.ParrotElement; diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrackScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrackScenes.java index a862eb35d1..759e5eed07 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrackScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrackScenes.java @@ -6,7 +6,7 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.content.processing.burner.BlazeBurnerBlock; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; -import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.math.Pointing; import net.createmod.ponder.api.PonderPalette; import net.createmod.ponder.api.element.ElementLink; import net.createmod.ponder.api.element.ParrotElement; diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrainScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrainScenes.java index efeff69d6e..252f77e6c8 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrainScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrainScenes.java @@ -5,7 +5,7 @@ import com.simibubi.create.content.processing.burner.BlazeBurnerBlock; import com.simibubi.create.content.trains.station.StationBlock; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; -import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.math.Pointing; import net.createmod.ponder.api.PonderPalette; import net.createmod.ponder.api.element.ElementLink; import net.createmod.ponder.api.element.ParrotElement; diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrainSignalScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrainSignalScenes.java index 1a6f94cea8..29de797462 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrainSignalScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrainSignalScenes.java @@ -6,7 +6,7 @@ import com.simibubi.create.content.trains.signal.SignalBlock; import com.simibubi.create.content.trains.signal.SignalBlockEntity.SignalState; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; -import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.math.Pointing; import net.createmod.ponder.api.PonderPalette; import net.createmod.ponder.api.element.ElementLink; import net.createmod.ponder.api.element.ParrotElement; diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrainStationScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrainStationScenes.java index 5aff486fe7..6ca1649e6c 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrainStationScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrainStationScenes.java @@ -5,7 +5,7 @@ import com.simibubi.create.AllItems; import com.simibubi.create.content.trains.station.StationBlock; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; -import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.math.Pointing; import net.createmod.ponder.api.PonderPalette; import net.createmod.ponder.api.element.ElementLink; import net.createmod.ponder.api.element.ParrotElement; diff --git a/src/main/java/com/simibubi/create/infrastructure/worldgen/LayerPattern.java b/src/main/java/com/simibubi/create/infrastructure/worldgen/LayerPattern.java index 648b0485ed..5316d65c09 100644 --- a/src/main/java/com/simibubi/create/infrastructure/worldgen/LayerPattern.java +++ b/src/main/java/com/simibubi/create/infrastructure/worldgen/LayerPattern.java @@ -10,7 +10,7 @@ import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import com.tterrag.registrate.util.nullness.NonNullSupplier; -import net.createmod.catnip.utility.Couple; +import net.createmod.catnip.data.Couple; import net.minecraft.tags.BlockTags; import net.minecraft.util.RandomSource; import net.minecraft.world.level.block.Block; From 26250e7d9e42378829fd306f2dcf0d3b7c52dc28 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Fri, 17 Jan 2025 11:36:20 -0500 Subject: [PATCH 317/515] There you are - Remove suppliers around FanProcessingType's; we need to often use the objects right away, and or in other parts of the code --- .../content/kinetics/fan/AirCurrent.java | 11 ++-- .../content/kinetics/fan/AirFlowParticle.java | 4 +- .../fan/processing/AllFanProcessingTypes.java | 57 +++++++------------ .../fan/processing/FanProcessingType.java | 10 ++-- .../attribute/AllItemAttributeTypes.java | 14 +---- 5 files changed, 36 insertions(+), 60 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/kinetics/fan/AirCurrent.java b/src/main/java/com/simibubi/create/content/kinetics/fan/AirCurrent.java index 63748e7fa7..2780b77618 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/fan/AirCurrent.java +++ b/src/main/java/com/simibubi/create/content/kinetics/fan/AirCurrent.java @@ -35,6 +35,7 @@ import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; + import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fml.DistExecutor; @@ -107,7 +108,7 @@ public class AirCurrent { FanProcessingType processingType = getTypeAt((float) entityDistance); - if (processingType == AllFanProcessingTypes.NONE.get()) + if (processingType == AllFanProcessingTypes.NONE) continue; if (entity instanceof ItemEntity itemEntity) { @@ -176,7 +177,7 @@ public class AirCurrent { // Determine segments with transported fluids/gases segments.clear(); AirCurrentSegment currentSegment = null; - FanProcessingType type = AllFanProcessingTypes.NONE.get(); + FanProcessingType type = AllFanProcessingTypes.NONE; int limit = getLimit(); int searchStart = pushing ? 1 : limit; @@ -187,7 +188,7 @@ public class AirCurrent { for (int i = searchStart; i * searchStep <= searchEnd * searchStep; i += searchStep) { BlockPos currentPos = start.relative(direction, i); FanProcessingType newType = FanProcessingType.getAt(world, currentPos); - if (newType != AllFanProcessingTypes.NONE.get()) { + if (newType != AllFanProcessingTypes.NONE) { type = newType; } if (currentSegment == null) { @@ -320,7 +321,7 @@ public class AirCurrent { BlockEntityBehaviour.get(world, pos, TransportedItemStackHandlerBehaviour.TYPE); if (behaviour != null) { FanProcessingType type = FanProcessingType.getAt(world, pos); - if (type == AllFanProcessingTypes.NONE.get()) + if (type == AllFanProcessingTypes.NONE) type = segmentType; affectedItemHandlers.add(Pair.of(behaviour, type)); } @@ -353,7 +354,7 @@ public class AirCurrent { } } } - return AllFanProcessingTypes.NONE.get(); + return AllFanProcessingTypes.NONE; } private static class AirCurrentSegment { diff --git a/src/main/java/com/simibubi/create/content/kinetics/fan/AirFlowParticle.java b/src/main/java/com/simibubi/create/content/kinetics/fan/AirFlowParticle.java index 3c2d7cbb60..b84938551c 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/fan/AirFlowParticle.java +++ b/src/main/java/com/simibubi/create/content/kinetics/fan/AirFlowParticle.java @@ -78,7 +78,7 @@ public class AirFlowParticle extends SimpleAnimatedParticle { motion = motion.scale(airCurrent.maxDistance - (distance - 1f)).scale(.5f); FanProcessingType type = getType(distance); - if (type == AllFanProcessingTypes.NONE.get()) { + if (type == AllFanProcessingTypes.NONE) { setColor(0xEEEEEE); setAlpha(.25f); selectSprite((int) Mth.clamp((distance / airCurrent.maxDistance) * 8 + random.nextInt(4), @@ -102,7 +102,7 @@ public class AirFlowParticle extends SimpleAnimatedParticle { private FanProcessingType getType(double distance) { if (source.getAirCurrent() == null) - return AllFanProcessingTypes.NONE.get(); + return AllFanProcessingTypes.NONE; return source.getAirCurrent().getTypeAt((float) distance); } diff --git a/src/main/java/com/simibubi/create/content/kinetics/fan/processing/AllFanProcessingTypes.java b/src/main/java/com/simibubi/create/content/kinetics/fan/processing/AllFanProcessingTypes.java index 014e6f2e35..ac7a85f601 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/fan/processing/AllFanProcessingTypes.java +++ b/src/main/java/com/simibubi/create/content/kinetics/fan/processing/AllFanProcessingTypes.java @@ -4,21 +4,12 @@ import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Optional; -import java.util.function.Function; -import java.util.function.Supplier; - -import com.simibubi.create.AllRegistries; -import com.simibubi.create.content.kinetics.mechanicalArm.ArmInteractionPointType; - -import net.minecraft.resources.ResourceLocation; - -import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.registries.DeferredRegister; import org.jetbrains.annotations.Nullable; import org.joml.Vector3f; import com.simibubi.create.AllRecipeTypes; +import com.simibubi.create.AllRegistries; import com.simibubi.create.AllTags.AllBlockTags; import com.simibubi.create.AllTags.AllFluidTags; import com.simibubi.create.Create; @@ -62,22 +53,25 @@ import net.minecraft.world.level.block.CampfireBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.FluidState; import net.minecraft.world.phys.Vec3; + +import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.items.ItemStackHandler; import net.minecraftforge.items.wrapper.RecipeWrapper; +import net.minecraftforge.registries.DeferredRegister; public class AllFanProcessingTypes { private static final DeferredRegister REGISTER = DeferredRegister.create(AllRegistries.Keys.FAN_PROCESSING_TYPES, Create.ID); - public static final Supplier NONE = register("none", new NoneType()); - public static final Supplier BLASTING = register("blasting", new BlastingType()); - public static final Supplier HAUNTING = register("haunting", new HauntingType()); - public static final Supplier SMOKING = register("smoking", new SmokingType()); - public static final Supplier SPLASHING = register("splashing", new SplashingType()); + public static final NoneType NONE = register("none", new NoneType()); + public static final BlastingType BLASTING = register("blasting", new BlastingType()); + public static final HauntingType HAUNTING = register("haunting", new HauntingType()); + public static final SmokingType SMOKING = register("smoking", new SmokingType()); + public static final SplashingType SPLASHING = register("splashing", new SplashingType()); - private static final Map> LEGACY_NAME_MAP; + private static final Map LEGACY_NAME_MAP; static { - Object2ReferenceOpenHashMap> map = new Object2ReferenceOpenHashMap<>(); + Object2ReferenceOpenHashMap map = new Object2ReferenceOpenHashMap<>(); map.put("NONE", NONE); map.put("BLASTING", BLASTING); map.put("HAUNTING", HAUNTING); @@ -87,8 +81,9 @@ public class AllFanProcessingTypes { LEGACY_NAME_MAP = map; } - private static Supplier register(String name, T type) { - return REGISTER.register(name, () -> type); + private static T register(String name, T type) { + REGISTER.register(name, () -> type); + return type; } public static void register(IEventBus eventBus) { @@ -97,7 +92,7 @@ public class AllFanProcessingTypes { @Nullable public static FanProcessingType ofLegacyName(String name) { - return LEGACY_NAME_MAP.get(name).get(); + return LEGACY_NAME_MAP.get(name); } public static FanProcessingType parseLegacy(String str) { @@ -154,10 +149,7 @@ public class AllFanProcessingTypes { } BlockState blockState = level.getBlockState(pos); if (AllBlockTags.FAN_PROCESSING_CATALYSTS_BLASTING.matches(blockState)) { - if (blockState.hasProperty(BlazeBurnerBlock.HEAT_LEVEL) && !blockState.getValue(BlazeBurnerBlock.HEAT_LEVEL).isAtLeast(BlazeBurnerBlock.HeatLevel.FADING)) { - return false; - } - return true; + return !blockState.hasProperty(BlazeBurnerBlock.HEAT_LEVEL) || blockState.getValue(BlazeBurnerBlock.HEAT_LEVEL).isAtLeast(BlazeBurnerBlock.HeatLevel.FADING); } return false; } @@ -211,7 +203,7 @@ public class AllFanProcessingTypes { if (smeltingRecipe.isPresent()) { RegistryAccess registryAccess = level.registryAccess(); if (!smokingRecipe.isPresent() || !ItemStack.isSameItem(smokingRecipe.get() - .getResultItem(registryAccess), + .getResultItem(registryAccess), smeltingRecipe.get() .getResultItem(registryAccess))) { return RecipeApplier.applyRecipeOn(level, stack, smeltingRecipe.get()); @@ -264,10 +256,7 @@ public class AllFanProcessingTypes { if (blockState.is(BlockTags.CAMPFIRES) && blockState.hasProperty(CampfireBlock.LIT) && !blockState.getValue(CampfireBlock.LIT)) { return false; } - if (blockState.hasProperty(LitBlazeBurnerBlock.FLAME_TYPE) && blockState.getValue(LitBlazeBurnerBlock.FLAME_TYPE) != LitBlazeBurnerBlock.FlameType.SOUL) { - return false; - } - return true; + return !blockState.hasProperty(LitBlazeBurnerBlock.FLAME_TYPE) || blockState.getValue(LitBlazeBurnerBlock.FLAME_TYPE) == LitBlazeBurnerBlock.FlameType.SOUL; } return false; } @@ -387,10 +376,7 @@ public class AllFanProcessingTypes { if (blockState.hasProperty(LitBlazeBurnerBlock.FLAME_TYPE) && blockState.getValue(LitBlazeBurnerBlock.FLAME_TYPE) != LitBlazeBurnerBlock.FlameType.REGULAR) { return false; } - if (blockState.hasProperty(BlazeBurnerBlock.HEAT_LEVEL) && blockState.getValue(BlazeBurnerBlock.HEAT_LEVEL) != BlazeBurnerBlock.HeatLevel.SMOULDERING) { - return false; - } - return true; + return !blockState.hasProperty(BlazeBurnerBlock.HEAT_LEVEL) || blockState.getValue(BlazeBurnerBlock.HEAT_LEVEL) == BlazeBurnerBlock.HeatLevel.SMOULDERING; } return false; } @@ -463,10 +449,7 @@ public class AllFanProcessingTypes { return true; } BlockState blockState = level.getBlockState(pos); - if (AllBlockTags.FAN_PROCESSING_CATALYSTS_SPLASHING.matches(blockState)) { - return true; - } - return false; + return AllBlockTags.FAN_PROCESSING_CATALYSTS_SPLASHING.matches(blockState); } @Override diff --git a/src/main/java/com/simibubi/create/content/kinetics/fan/processing/FanProcessingType.java b/src/main/java/com/simibubi/create/content/kinetics/fan/processing/FanProcessingType.java index 5885435dc0..d30e56d67c 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/fan/processing/FanProcessingType.java +++ b/src/main/java/com/simibubi/create/content/kinetics/fan/processing/FanProcessingType.java @@ -2,10 +2,10 @@ package com.simibubi.create.content.kinetics.fan.processing; import java.util.List; -import com.simibubi.create.AllRegistries; - import org.jetbrains.annotations.Nullable; +import com.simibubi.create.AllRegistries; + import net.minecraft.core.BlockPos; import net.minecraft.core.particles.ParticleOptions; import net.minecraft.resources.ResourceLocation; @@ -34,11 +34,11 @@ public interface FanProcessingType { static FanProcessingType parse(String str) { ResourceLocation id = ResourceLocation.tryParse(str); if (id == null) { - return AllFanProcessingTypes.NONE.get(); + return AllFanProcessingTypes.NONE; } FanProcessingType type = AllRegistries.FAN_PROCESSING_TYPES.get().getValue(id); if (type == null) { - return AllFanProcessingTypes.NONE.get(); + return AllFanProcessingTypes.NONE; } return type; } @@ -49,7 +49,7 @@ public interface FanProcessingType { return type; } } - return AllFanProcessingTypes.NONE.get(); + return AllFanProcessingTypes.NONE; } interface AirFlowParticleAccess { diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/AllItemAttributeTypes.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/AllItemAttributeTypes.java index aa7fd89aca..face9fd8da 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/AllItemAttributeTypes.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/AllItemAttributeTypes.java @@ -4,9 +4,6 @@ import java.util.function.BiPredicate; import java.util.function.Predicate; import java.util.function.Supplier; -import com.simibubi.create.content.kinetics.fan.processing.AllFanProcessingTypes.HauntingType; -import com.simibubi.create.content.kinetics.fan.processing.AllFanProcessingTypes.SplashingType; - import org.jetbrains.annotations.ApiStatus; import com.simibubi.create.AllRecipeTypes; @@ -40,6 +37,7 @@ import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.ComposterBlock; import net.minecraft.world.level.block.entity.AbstractFurnaceBlockEntity; + import net.minecraftforge.common.capabilities.ForgeCapabilities; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.items.ItemStackHandler; @@ -65,14 +63,8 @@ public class AllItemAttributeTypes { EQUIPABLE = singleton("equipable", s -> LivingEntity.getEquipmentSlotForItem(s) .getType() != EquipmentSlot.Type.HAND), FURNACE_FUEL = singleton("furnace_fuel", AbstractFurnaceBlockEntity::isFuel), - WASHABLE = singleton("washable", (s, l) -> { - SplashingType type = AllFanProcessingTypes.SPLASHING.get(); - return type != null && type.canProcess(s, l); - }), - HAUNTABLE = singleton("hauntable", (s, l) -> { - HauntingType type = AllFanProcessingTypes.HAUNTING.get(); - return type != null && type.canProcess(s, l); - }), + WASHABLE = singleton("washable", AllFanProcessingTypes.SPLASHING::canProcess), + HAUNTABLE = singleton("hauntable", AllFanProcessingTypes.HAUNTING::canProcess), CRUSHABLE = singleton("crushable", (s, w) -> testRecipe(s, w, AllRecipeTypes.CRUSHING.getType()) || testRecipe(s, w, AllRecipeTypes.MILLING.getType())), SMELTABLE = singleton("smeltable", (s, w) -> testRecipe(s, w, RecipeType.SMELTING)), From e8eed60cd023a6349486e0c36c690a52652faf95 Mon Sep 17 00:00:00 2001 From: Kryppers <65094918+Kryppers@users.noreply.github.com> Date: Fri, 17 Jan 2025 21:03:19 +0000 Subject: [PATCH 318/515] refining visuals updated visuals for linked packager and stock ticker in preparation for new link models. --- .../create/models/block/stock_ticker.json | 18 +++++++++++++++--- .../block/packager_horizontal_linked.png | Bin 593 -> 2121 bytes .../block/packager_horizontal_powered.png | Bin 983 -> 3261 bytes .../block/packager_vertical_linked.png | Bin 605 -> 2250 bytes .../block/packager_vertical_powered.png | Bin 1028 -> 3453 bytes .../block/redstone_requester_powered.png | Bin 561 -> 1704 bytes .../create/textures/block/stock_ticker.png | Bin 1522 -> 4955 bytes 7 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/main/resources/assets/create/models/block/stock_ticker.json b/src/main/resources/assets/create/models/block/stock_ticker.json index 2047d1835a..ba04f537c4 100644 --- a/src/main/resources/assets/create/models/block/stock_ticker.json +++ b/src/main/resources/assets/create/models/block/stock_ticker.json @@ -31,6 +31,18 @@ "down": {"uv": [8, 2.5, 8.5, 3], "texture": "#0"} } }, + { + "from": [4.5, 4, 9], + "to": [11.5, 6, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [4, 4, 9]}, + "faces": { + "north": {"uv": [14, 11, 13, 14.5], "rotation": 90, "texture": "#0"}, + "east": {"uv": [16, 14.5, 14, 15.5], "texture": "#0"}, + "south": {"uv": [14, 11, 13, 14.5], "rotation": 90, "texture": "#0"}, + "west": {"uv": [14, 14.5, 16, 15.5], "texture": "#0"}, + "up": {"uv": [14, 11, 16, 14.5], "rotation": 90, "texture": "#0"} + } + }, { "from": [6.5, -3, -0.1], "to": [9.5, 2, -0.1], @@ -124,15 +136,15 @@ "name": "base", "origin": [5, 0, 0], "color": 0, - "children": [0, 1] + "children": [0, 1, 2] }, - 2, 3, 4, 5, 6, 7, 8, - 9 + 9, + 10 ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/block/packager_horizontal_linked.png b/src/main/resources/assets/create/textures/block/packager_horizontal_linked.png index 2041f078958d2124d8139f9f6107c46c1537962c..4d6c778115589850e2f44535182c36ec19207adf 100644 GIT binary patch delta 2119 zcmV-N2)Osr1j!JP8Gi-<0047(dh`GQ1)+LWSaechcOYFm~~j`;Z9sfR1q6E^ls)H&uD zfw$o~u2C^cZh0iqJoCsMV^Ad~$(xiWHQKbUdC-7~%8LUt^I*BwiUe04l7&Q*s3>g? zsWPPq%itw~ReyfkLYLlpsT)+FcoKFpK^Wo0HPYkZzmAuJ_8uoh1n(cQf?do920Brc z^NC#mg!Y3+b_Mt`KE41fgeZ2MFc&!3a=(e_MsM7bbO9~cXqfeOIObgdLIm9gV@QBN zb`m3}9Lzz4I2Pd3U^z=t?tp;Ic*06n5eGPhk8Yd^x_|bv@ogC?1RzXY0?<@xz)IB= zxfWW$p=M%gW^Q4{sx=o^H+K&|x!6KN!@?t?M2%LYXtClYN-4FpRJjUr)vDL1rPkUS zlr~6iINeIaLgy}ByLIo;ORv2R&}Znd;Uh*Fb+j~j%G7DoXUsC|Y>O7Cv~=0>6|1be z+6L9OY=7Ohea9}l?)F6OLN&d^>@#xzj2hih17PXGOtI;K8kQp-BIuM8JD346Rs!O2 z5CEb1V3rH1@g%yMO9g)ywO1J0y_7!cG&Y@43gy&?Arw}ia^x47}Q$fX0_uRtyx z=w2ZA8Mhax%~RjU$-|7ocGBj%-p}ddLYCD7**@ELzUHEWHZ`554|AEIhHNw>;5Rh7 zF9#3(wJ=X)EOB+8S&9fN!b1 z@C}KyrM~wKbQ{PZRPU&Bs#Bc+21%#A!=jP;HYx3r(Gh_9MJzw71BtgPH1@Ve>xqUU zyUM06C?HFbj;pvoiE^0eV>?RG*z@ua{QJy<^qLr3=X{6({S@8lE9d6TxwOZxaepqg z{%f2|U$Op$bKrd0clt~^6*0*3#vK)vDWP~yJUkLiQJ{Y!!){#nh3j#LWYjVj+|<_W z6Xg1a2TZ+wRUN*Yr3HdY>5lf=?uG9XKt`W z2{*?zP}#Q*R48abgITGIqOtf|hMHX)`WLrV@f{eyB{Ul9ck(#BOXxPOqT?cZb)vs9 zj9V8-1%Sa9G|CXz-UirX$2|nZy=fpur=bKe!-dNbc97@30B9E=AvDO7!hc+P4k1(q zz32t)=-3Df)S<_ujpm|LwFZOL+yn6#ra?dfaJ*En8t13#0%500v@9M??Tx07L*Jz;LbD00009 za7bBm000id000id0mpBsWB>pF2XskIMF;5t5fKR^MjQIv0006hNq2+wu_AX9xpYi3s?|t9z`#kRxnaN#n;}Z&JGbixF z$I3U_8#X^XTL2{DQ-8knR=WX!?EPHVlIU8RX7ziTD(9V)7Wemc%ey+`e=FP@Bxp-*R;=Nz-a$ZMnWr?L*JW~9-tAf`qGC(x_+M^B(v?*}#zQ=>xzUSIpc)BKYJyq5BVr)jPa5Mtba3yN{< zx;%OUxmqT00=ZfS+3Iuwn47!i-n?;{M=M`>fBq9OHHwlL!?u2*B*tid_`$ig(_FuJ ziibV&EdzZZx>ICP?7B>^T47=FC9$Il z#Zr0LPAxOA0jFgWS$_K1tr`YTmR~TNJ#%0^7-o%Psm#?YmzdUd?%sQV)o$#Y2YcU! zy>;SgwcK2SDCn5lIb62v*Y-6jdgs4ik*2 xQ9iE^$kj3o90#Xm1{z=?At50lAtC=KzX6vf+hxCDqXqx~002ovPDHLkV1o4o^UeSO literal 593 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCijq1AIbU4Xi92JzO#~leD!BZEZYSn#$+Tp1fzA)cwtzXFiY;E(!7r{*M6|Hr3wY07`QfctjR6Fz_7)VaDV6 zD^h@h5+$w?CBgY=CFO}lsSE*$nRz98ey$-3rh0~YhDlq4cz|lQrABzBd3tIwfJ|X! zkYZ$IU<9(ffLI#J2KiWnkr^z`1Y{dBGBF4M=_nx1Y-a(BX93wDkO0IW{V*EMQU+j{ zO<-qW0je-CGB#jb05KJ$gLMJKq$xl)2rvQ7VFIfRva|rQpt=kV3_!BdC6}jM;b`Lq zGUs@@IEGmGzn$pKcUXbPCHK$4wk4Ux{|}3;5O-X$`^_zLA*mx70&EPISy`0!Ib1pC zTD*L%7U#@!+(!~7C0+JNI`@$MO@dV2g0N=}jHe&6-+U#r!aHF$^Y5agcI?}%rBwbn zwFX?UmYGQ9>dmJHo-nV*024c(W^CTQXQGkews_FY@NiQ$hmp?uD7vUEsR~R hhyQEjw->ZHZ@xs&)_ae~nrR?6d%F6$taD0e0sv7Jsu2JH diff --git a/src/main/resources/assets/create/textures/block/packager_horizontal_powered.png b/src/main/resources/assets/create/textures/block/packager_horizontal_powered.png index e15bda38ca9ac14cf08d0045d81e0d063e4089e7..cb3de3996827c7989f95a3477390a040cb0e42a6 100644 GIT binary patch delta 3233 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 delta 947 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 Z{13#JeR$M ztPj@gYK^Cle8k0b=eS;&W81?!m>3^NRa=l1nWr{`thPqZS=uaHcOQw3Uq0zs+AOl# zO7E5fv3NR_+s(DkDDvaDPuL)00yey5?VQSe*am zR}Q`TI-OnXkyVWwS4L6VQ~->k#)eHB0Z^2d$QTb^m|3gfEtuS~eQU&fT{p#^a>*bi zC7GElpj8}Llc13(Z7Lssc>#cTUf#i-Bo2^BCr~8F>whM?X)f6m=z1h5FX%LFj*_LL zDD_ZR%reuHQ*2h7SgFJTT-${#^mx~qsu(oiyC8=~NQCT3goJbSep^P1UKPJElmFWmxE1DFiq~ z&cO$yrGNQ2GmJSg2Z)Cee>b9=Cg#}tp4|JSuPEPxHERJja_?jHjpg6C^247bfRWP& zz1}ScV!_hL>4RQ8d}%&*A9}Nit4DF5H}~VlvOLISJ>Ry?+2iMV_HcdQ+2iK{=kS`aPU}P*$mOz;aq*g6stImzs(ssvzFXBam}iiAwaHlk(z1KDdn)MH4Fz732LTI&PzuQU;6!G3?BDB`QRs^d+Duh zShJ=u4&aolNZAzK{YxXz-7iNYupIExDc@0d#)z!H@ZMnpX2bfK6F;}`#uIbGIN(RZ z^nd3c9@ynIEW?6PLy;CrGB8XOpamoP+nP05x1r8#H^)p~?9-8&*Wpwgq)ZB_St6O1 zkeVf&io-L{rNntDld4xixn$rh)OfyF2Tkzed{Gz91!vBj8s|_524_x<1JK(b-{Xbb z{#r*oqKh?ZM$0v%pcxH*b1B9uNZfD${C`V>JckJ>ok|L40=<96mw}@LUVdzXp1y8B zQVa9JV}r4QqXV94 z*Gi~ri=gQ6JZNM=3KmOj;OKy-sx7p4b&yrEn1)HkEYqCLkX5o2Ca3*Yoy`FFU4KxU zWANDEU8P_#`b7ltV-x6FiLq-}{d_kyQJtR`qrgFv-{GqB^Ws%^E3>n-Oq zi!UNo$uKozkZwz2I5kwoPf5|VQI!lvu`E*bNN0}iZR=tHL&Kxq{_Pv@2+E=1QE&gr z^RZf zviA_}T^)kuEW<)pC&9 From 7590ef2446f62f8739fa98131cb00f23792683a2 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Fri, 17 Jan 2025 17:00:31 -0500 Subject: [PATCH 319/515] That's mine! - Fix item hatches not dropping item filters upon being broken --- .../create/content/logistics/itemHatch/ItemHatchBlock.java | 5 +++++ src/main/java/com/simibubi/create/foundation/block/IBE.java | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/itemHatch/ItemHatchBlock.java b/src/main/java/com/simibubi/create/content/logistics/itemHatch/ItemHatchBlock.java index 052ab25a97..6a84ff7d9c 100644 --- a/src/main/java/com/simibubi/create/content/logistics/itemHatch/ItemHatchBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/itemHatch/ItemHatchBlock.java @@ -172,6 +172,11 @@ public class ItemHatchBlock extends HorizontalDirectionalBlock pLevel.setBlockAndUpdate(pPos, pState.setValue(OPEN, false)); } + @Override + public void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean movedByPiston) { + IBE.onRemove(state, level, pos, newState); + } + @Override public Class getBlockEntityClass() { return ItemHatchBlockEntity.class; diff --git a/src/main/java/com/simibubi/create/foundation/block/IBE.java b/src/main/java/com/simibubi/create/foundation/block/IBE.java index b616490d45..c2a21d67d1 100644 --- a/src/main/java/com/simibubi/create/foundation/block/IBE.java +++ b/src/main/java/com/simibubi/create/foundation/block/IBE.java @@ -38,7 +38,7 @@ public interface IBE extends EntityBlock { * if the IBE is bound to a SmartBlockEntity, which implements destroy(),
* call this method in BlockBehaviour::onRemove (replace super call) */ - public static void onRemove(BlockState blockState, Level level, BlockPos pos, BlockState newBlockState) { + static void onRemove(BlockState blockState, Level level, BlockPos pos, BlockState newBlockState) { if (!blockState.hasBlockEntity()) return; if (blockState.is(newBlockState.getBlock()) && newBlockState.hasBlockEntity()) From 6ac654d722599f987845d641067191850a5d7a93 Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Fri, 17 Jan 2025 14:10:16 -0600 Subject: [PATCH 320/515] Wrench art online: partialization - Remove SingleRotatingVisual and many hyper-specialized subclasses - Add OrientedRotatingVisual and SingleAxisRotatingVisual, which accept a model in the constructor as well as orientation information - Inline the remnants of SingleRotatingVisual into saw visual because it has the most complicated orientation rules - Separate large cogwheel visual from small cog and shaft - Add partial models for every possible gantry shaft blockstate - Move RotatingInstance "setup" logic into RotatingInstance itself --- .../simibubi/create/AllBlockEntityTypes.java | 45 +++----- .../com/simibubi/create/AllPartialModels.java | 36 ++++++ .../contraptions/bearing/BearingVisual.java | 6 +- .../equipment/armor/BacktankVisual.java | 19 --- .../content/fluids/pump/PumpCogVisual.java | 25 ---- .../kinetics/base/BackHalfShaftVisual.java | 16 --- .../kinetics/base/HalfShaftVisual.java | 24 ---- .../base/HorizontalHalfShaftVisual.java | 17 --- .../base/KineticBlockEntityVisual.java | 49 ++------ .../kinetics/base/OrientedRotatingVisual.java | 95 +++++++++++++++ .../kinetics/base/RotatingInstance.java | 36 ++++++ .../content/kinetics/base/ShaftVisual.java | 14 +-- .../base/SingleAxisRotatingVisual.java | 84 ++++++++++++++ .../kinetics/base/SingleRotatingVisual.java | 50 -------- .../chainConveyor/ChainConveyorVisual.java | 12 +- .../crafter/ShaftlessCogwheelVisual.java | 36 ------ .../content/kinetics/drill/DrillVisual.java | 24 ---- .../kinetics/mechanicalArm/ArmVisual.java | 13 +-- .../millstone/MillstoneCogVisual.java | 20 ---- .../content/kinetics/saw/SawActorVisual.java | 3 +- .../content/kinetics/saw/SawVisual.java | 51 +++++++-- .../BracketedKineticBlockEntityVisual.java | 108 ++++++++---------- 22 files changed, 382 insertions(+), 401 deletions(-) delete mode 100644 src/main/java/com/simibubi/create/content/equipment/armor/BacktankVisual.java delete mode 100644 src/main/java/com/simibubi/create/content/fluids/pump/PumpCogVisual.java delete mode 100644 src/main/java/com/simibubi/create/content/kinetics/base/BackHalfShaftVisual.java delete mode 100644 src/main/java/com/simibubi/create/content/kinetics/base/HalfShaftVisual.java delete mode 100644 src/main/java/com/simibubi/create/content/kinetics/base/HorizontalHalfShaftVisual.java create mode 100644 src/main/java/com/simibubi/create/content/kinetics/base/OrientedRotatingVisual.java create mode 100644 src/main/java/com/simibubi/create/content/kinetics/base/SingleAxisRotatingVisual.java delete mode 100644 src/main/java/com/simibubi/create/content/kinetics/base/SingleRotatingVisual.java delete mode 100644 src/main/java/com/simibubi/create/content/kinetics/crafter/ShaftlessCogwheelVisual.java delete mode 100644 src/main/java/com/simibubi/create/content/kinetics/drill/DrillVisual.java delete mode 100644 src/main/java/com/simibubi/create/content/kinetics/millstone/MillstoneCogVisual.java diff --git a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java index 295b47591a..b74b4ca8ab 100644 --- a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java +++ b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java @@ -45,7 +45,6 @@ import com.simibubi.create.content.decoration.steamWhistle.WhistleBlockEntity; import com.simibubi.create.content.decoration.steamWhistle.WhistleRenderer; import com.simibubi.create.content.equipment.armor.BacktankBlockEntity; import com.simibubi.create.content.equipment.armor.BacktankRenderer; -import com.simibubi.create.content.equipment.armor.BacktankVisual; import com.simibubi.create.content.equipment.bell.BellRenderer; import com.simibubi.create.content.equipment.bell.HauntedBellBlockEntity; import com.simibubi.create.content.equipment.bell.PeculiarBellBlockEntity; @@ -65,20 +64,17 @@ import com.simibubi.create.content.fluids.pipes.valve.FluidValveBlockEntity; import com.simibubi.create.content.fluids.pipes.valve.FluidValveRenderer; import com.simibubi.create.content.fluids.pipes.valve.FluidValveVisual; import com.simibubi.create.content.fluids.pump.PumpBlockEntity; -import com.simibubi.create.content.fluids.pump.PumpCogVisual; import com.simibubi.create.content.fluids.pump.PumpRenderer; import com.simibubi.create.content.fluids.spout.SpoutBlockEntity; import com.simibubi.create.content.fluids.spout.SpoutRenderer; import com.simibubi.create.content.fluids.tank.CreativeFluidTankBlockEntity; import com.simibubi.create.content.fluids.tank.FluidTankBlockEntity; import com.simibubi.create.content.fluids.tank.FluidTankRenderer; -import com.simibubi.create.content.kinetics.base.HalfShaftVisual; -import com.simibubi.create.content.kinetics.base.HorizontalHalfShaftVisual; import com.simibubi.create.content.kinetics.base.KineticBlockEntity; import com.simibubi.create.content.kinetics.base.KineticBlockEntityRenderer; +import com.simibubi.create.content.kinetics.base.OrientedRotatingVisual; import com.simibubi.create.content.kinetics.base.ShaftRenderer; -import com.simibubi.create.content.kinetics.base.ShaftVisual; -import com.simibubi.create.content.kinetics.base.SingleRotatingVisual; +import com.simibubi.create.content.kinetics.base.SingleAxisRotatingVisual; import com.simibubi.create.content.kinetics.belt.BeltBlockEntity; import com.simibubi.create.content.kinetics.belt.BeltRenderer; import com.simibubi.create.content.kinetics.belt.BeltVisual; @@ -90,7 +86,6 @@ import com.simibubi.create.content.kinetics.clock.CuckooClockBlockEntity; import com.simibubi.create.content.kinetics.clock.CuckooClockRenderer; import com.simibubi.create.content.kinetics.crafter.MechanicalCrafterBlockEntity; import com.simibubi.create.content.kinetics.crafter.MechanicalCrafterRenderer; -import com.simibubi.create.content.kinetics.crafter.ShaftlessCogwheelVisual; import com.simibubi.create.content.kinetics.crank.HandCrankBlockEntity; import com.simibubi.create.content.kinetics.crank.HandCrankRenderer; import com.simibubi.create.content.kinetics.crank.HandCrankVisual; @@ -103,7 +98,6 @@ import com.simibubi.create.content.kinetics.deployer.DeployerRenderer; import com.simibubi.create.content.kinetics.deployer.DeployerVisual; import com.simibubi.create.content.kinetics.drill.DrillBlockEntity; import com.simibubi.create.content.kinetics.drill.DrillRenderer; -import com.simibubi.create.content.kinetics.drill.DrillVisual; import com.simibubi.create.content.kinetics.fan.EncasedFanBlockEntity; import com.simibubi.create.content.kinetics.fan.EncasedFanRenderer; import com.simibubi.create.content.kinetics.fan.FanVisual; @@ -123,7 +117,6 @@ import com.simibubi.create.content.kinetics.mechanicalArm.ArmBlockEntity; import com.simibubi.create.content.kinetics.mechanicalArm.ArmRenderer; import com.simibubi.create.content.kinetics.mechanicalArm.ArmVisual; import com.simibubi.create.content.kinetics.millstone.MillstoneBlockEntity; -import com.simibubi.create.content.kinetics.millstone.MillstoneCogVisual; import com.simibubi.create.content.kinetics.millstone.MillstoneRenderer; import com.simibubi.create.content.kinetics.mixer.MechanicalMixerBlockEntity; import com.simibubi.create.content.kinetics.mixer.MechanicalMixerRenderer; @@ -259,14 +252,14 @@ public class AllBlockEntityTypes { // Kinetics public static final BlockEntityEntry BRACKETED_KINETIC = REGISTRATE .blockEntity("simple_kinetic", BracketedKineticBlockEntity::new) - .visual(() -> BracketedKineticBlockEntityVisual::new, false) + .visual(() -> BracketedKineticBlockEntityVisual::create, false) .validBlocks(AllBlocks.SHAFT, AllBlocks.COGWHEEL, AllBlocks.LARGE_COGWHEEL) .renderer(() -> BracketedKineticBlockEntityRenderer::new) .register(); public static final BlockEntityEntry MOTOR = REGISTRATE .blockEntity("motor", CreativeMotorBlockEntity::new) - .visual(() -> HalfShaftVisual::new, false) + .visual(() -> OrientedRotatingVisual.of(AllPartialModels.SHAFT_HALF), false) .validBlocks(AllBlocks.CREATIVE_MOTOR) .renderer(() -> CreativeMotorRenderer::new) .register(); @@ -280,7 +273,7 @@ public class AllBlockEntityTypes { public static final BlockEntityEntry ENCASED_SHAFT = REGISTRATE .blockEntity("encased_shaft", KineticBlockEntity::new) - .visual(() -> ShaftVisual::new, false) + .visual(() -> SingleAxisRotatingVisual::shaft, false) .validBlocks(AllBlocks.ANDESITE_ENCASED_SHAFT, AllBlocks.BRASS_ENCASED_SHAFT, AllBlocks.ENCASED_CHAIN_DRIVE, AllBlocks.METAL_GIRDER_ENCASED_SHAFT) .renderer(() -> ShaftRenderer::new) @@ -302,7 +295,7 @@ public class AllBlockEntityTypes { public static final BlockEntityEntry ADJUSTABLE_CHAIN_GEARSHIFT = REGISTRATE .blockEntity("adjustable_chain_gearshift", ChainGearshiftBlockEntity::new) - .visual(() -> ShaftVisual::new, false) + .visual(() -> SingleAxisRotatingVisual::shaft, false) .validBlocks(AllBlocks.ADJUSTABLE_CHAIN_GEARSHIFT) .renderer(() -> ShaftRenderer::new) .register(); @@ -336,7 +329,7 @@ public class AllBlockEntityTypes { public static final BlockEntityEntry TURNTABLE = REGISTRATE .blockEntity("turntable", TurntableBlockEntity::new) - .visual(() -> SingleRotatingVisual::new, false) + .visual(() -> SingleAxisRotatingVisual.of(AllPartialModels.TURNTABLE), false) .validBlocks(AllBlocks.TURNTABLE) .renderer(() -> KineticBlockEntityRenderer::new) .register(); @@ -358,14 +351,14 @@ public class AllBlockEntityTypes { public static final BlockEntityEntry CUCKOO_CLOCK = REGISTRATE .blockEntity("cuckoo_clock", CuckooClockBlockEntity::new) - .visual(() -> HorizontalHalfShaftVisual::new) + .visual(() -> OrientedRotatingVisual.backHorizontal(AllPartialModels.SHAFT_HALF)) .validBlocks(AllBlocks.CUCKOO_CLOCK, AllBlocks.MYSTERIOUS_CUCKOO_CLOCK) .renderer(() -> CuckooClockRenderer::new) .register(); public static final BlockEntityEntry GANTRY_SHAFT = REGISTRATE .blockEntity("gantry_shaft", GantryShaftBlockEntity::new) - .visual(() -> SingleRotatingVisual::new, false) + .visual(() -> OrientedRotatingVisual::gantryShaft, false) .validBlocks(AllBlocks.GANTRY_SHAFT) .renderer(() -> KineticBlockEntityRenderer::new) .register(); @@ -386,7 +379,7 @@ public class AllBlockEntityTypes { public static final BlockEntityEntry MECHANICAL_PUMP = REGISTRATE .blockEntity("mechanical_pump", PumpBlockEntity::new) - .visual(() -> PumpCogVisual::new) + .visual(() -> SingleAxisRotatingVisual.ofZ(AllPartialModels.MECHANICAL_PUMP_COG)) .validBlocks(AllBlocks.MECHANICAL_PUMP) .renderer(() -> PumpRenderer::new) .register(); @@ -553,7 +546,7 @@ public class AllBlockEntityTypes { public static final BlockEntityEntry MECHANICAL_PISTON = REGISTRATE .blockEntity("mechanical_piston", MechanicalPistonBlockEntity::new) - .visual(() -> ShaftVisual::new, false) + .visual(() -> SingleAxisRotatingVisual::shaft, false) .validBlocks(AllBlocks.MECHANICAL_PISTON, AllBlocks.STICKY_MECHANICAL_PISTON) .renderer(() -> MechanicalPistonRenderer::new) .register(); @@ -619,7 +612,7 @@ public class AllBlockEntityTypes { public static final BlockEntityEntry DRILL = REGISTRATE .blockEntity("drill", DrillBlockEntity::new) - .visual(() -> DrillVisual::new, false) + .visual(() -> OrientedRotatingVisual.of(AllPartialModels.DRILL_HEAD), false) .validBlocks(AllBlocks.MECHANICAL_DRILL) .renderer(() -> DrillRenderer::new) .register(); @@ -674,7 +667,7 @@ public class AllBlockEntityTypes { public static final BlockEntityEntry POWERED_SHAFT = REGISTRATE .blockEntity("powered_shaft", PoweredShaftBlockEntity::new) - .visual(() -> SingleRotatingVisual::new, false) + .visual(() -> SingleAxisRotatingVisual.of(AllPartialModels.POWERED_SHAFT), false) .validBlocks(AllBlocks.POWERED_SHAFT) .renderer(() -> KineticBlockEntityRenderer::new) .register(); @@ -688,14 +681,14 @@ public class AllBlockEntityTypes { public static final BlockEntityEntry MILLSTONE = REGISTRATE .blockEntity("millstone", MillstoneBlockEntity::new) - .visual(() -> MillstoneCogVisual::new, false) + .visual(() -> SingleAxisRotatingVisual.of(AllPartialModels.MILLSTONE_COG), false) .validBlocks(AllBlocks.MILLSTONE) .renderer(() -> MillstoneRenderer::new) .register(); public static final BlockEntityEntry CRUSHING_WHEEL = REGISTRATE .blockEntity("crushing_wheel", CrushingWheelBlockEntity::new) - .visual(() -> SingleRotatingVisual::new, false) + .visual(() -> SingleAxisRotatingVisual.of(AllPartialModels.CRUSHING_WHEEL), false) .validBlocks(AllBlocks.CRUSHING_WHEEL) .renderer(() -> KineticBlockEntityRenderer::new) .register(); @@ -757,7 +750,7 @@ public class AllBlockEntityTypes { public static final BlockEntityEntry MECHANICAL_CRAFTER = REGISTRATE .blockEntity("mechanical_crafter", MechanicalCrafterBlockEntity::new) - .visual(() -> ShaftlessCogwheelVisual::new) + .visual(() -> SingleAxisRotatingVisual.of(AllPartialModels.SHAFTLESS_COGWHEEL)) .validBlocks(AllBlocks.MECHANICAL_CRAFTER) .renderer(() -> MechanicalCrafterRenderer::new) .register(); @@ -771,7 +764,7 @@ public class AllBlockEntityTypes { public static final BlockEntityEntry ROTATION_SPEED_CONTROLLER = REGISTRATE .blockEntity("rotation_speed_controller", SpeedControllerBlockEntity::new) - .visual(() -> ShaftVisual::new) + .visual(() -> SingleAxisRotatingVisual::shaft) .validBlocks(AllBlocks.ROTATION_SPEED_CONTROLLER) .renderer(() -> SpeedControllerRenderer::new) .register(); @@ -906,7 +899,7 @@ public class AllBlockEntityTypes { // Curiosities public static final BlockEntityEntry BACKTANK = REGISTRATE .blockEntity("backtank", BacktankBlockEntity::new) - .visual(() -> BacktankVisual::new) + .visual(() -> SingleAxisRotatingVisual::backtank) .validBlocks(AllBlocks.COPPER_BACKTANK, AllBlocks.NETHERITE_BACKTANK) .renderer(() -> BacktankRenderer::new) .register(); @@ -975,7 +968,7 @@ public class AllBlockEntityTypes { public static final BlockEntityEntry FLAP_DISPLAY = REGISTRATE .blockEntity("flap_display", FlapDisplayBlockEntity::new) - .visual(() -> ShaftlessCogwheelVisual::new) + .visual(() -> SingleAxisRotatingVisual.of(AllPartialModels.SHAFTLESS_COGWHEEL)) .renderer(() -> FlapDisplayRenderer::new) .validBlocks(AllBlocks.DISPLAY_BOARD) .register(); diff --git a/src/main/java/com/simibubi/create/AllPartialModels.java b/src/main/java/com/simibubi/create/AllPartialModels.java index d34d48895d..6caf89e1df 100644 --- a/src/main/java/com/simibubi/create/AllPartialModels.java +++ b/src/main/java/com/simibubi/create/AllPartialModels.java @@ -7,6 +7,7 @@ import java.util.List; import java.util.Map; import com.simibubi.create.content.fluids.FluidTransportBehaviour; +import com.simibubi.create.content.kinetics.gantry.GantryShaftBlock; import com.simibubi.create.content.logistics.box.PackageStyles; import com.simibubi.create.content.logistics.box.PackageStyles.PackageStyle; @@ -27,6 +28,7 @@ public class AllPartialModels { SHAFTLESS_COGWHEEL = block("cogwheel_shaftless"), SHAFTLESS_LARGE_COGWHEEL = block("large_cogwheel_shaftless"), COGWHEEL_SHAFT = block("cogwheel_shaft"), SHAFT_HALF = block("shaft_half"), SHAFT = block("shaft"), + COGWHEEL = block("cogwheel"), BELT_PULLEY = block("belt_pulley"), BELT_START = block("belt/start"), BELT_MIDDLE = block("belt/middle"), BELT_END = block("belt/end"), BELT_START_BOTTOM = block("belt/start_bottom"), @@ -206,6 +208,13 @@ public class AllPartialModels { TABLE_CLOTH_SE = block("table_cloth/south_east"), FLYWHEEL = block("flywheel/block"), + CRUSHING_WHEEL = block("crushing_wheel/block"), + TURNTABLE = block("turntable"), + GANTRY_SHAFT_START = block("gantry_shaft/block_start"), + GANTRY_SHAFT_END = block("gantry_shaft/block_end"), + GANTRY_SHAFT_MIDDLE = block("gantry_shaft/block_middle"), + GANTRY_SHAFT_SINGLE = block("gantry_shaft/block_single"), + POWERED_SHAFT = block("powered_shaft"), CRAFTING_BLUEPRINT_1x1 = entity("crafting_blueprint_small"), CRAFTING_BLUEPRINT_2x2 = entity("crafting_blueprint_medium"), @@ -234,6 +243,8 @@ public class AllPartialModels { public static final List PACKAGES_TO_HIDE_AS = new ArrayList<>(); public static final Map PACKAGE_RIGGING = new HashMap<>(); + public static final Map GANTRY_SHAFTS = new HashMap<>(); + static { for (FluidTransportBehaviour.AttachmentTypes.ComponentPartials type : FluidTransportBehaviour.AttachmentTypes.ComponentPartials .values()) { @@ -266,6 +277,31 @@ public class AllPartialModels { PACKAGES_TO_HIDE_AS.add(model); PACKAGE_RIGGING.put(key, PartialModel.of(style.getRiggingModel())); } + + for (boolean flipped : Iterate.trueAndFalse) { + for (boolean powered : Iterate.trueAndFalse) { + for (GantryShaftBlock.Part part : GantryShaftBlock.Part.values()) { + GantryShaftKey key = new GantryShaftKey(part, powered, flipped); + GANTRY_SHAFTS.put(key, PartialModel.of(key.name())); + } + } + } + } + + public record GantryShaftKey(GantryShaftBlock.Part part, boolean powered, boolean flipped) { + private ResourceLocation name() { + String partName = part.getSerializedName(); + + if (!(flipped || powered)) { + // Non-generated + return Create.asResource("block/gantry_shaft/block_" + partName); + } + + String flipped = this.flipped ? "_flipped" : ""; + String powered = this.powered ? "_powered" : ""; + + return Create.asResource("block/gantry_shaft_" + partName + powered + flipped); + } } private static void putFoldingDoor(String path) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/bearing/BearingVisual.java b/src/main/java/com/simibubi/create/content/contraptions/bearing/BearingVisual.java index 3678eb8998..1214f972a8 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/bearing/BearingVisual.java +++ b/src/main/java/com/simibubi/create/content/contraptions/bearing/BearingVisual.java @@ -6,8 +6,8 @@ import org.joml.Quaternionf; import com.mojang.math.Axis; import com.simibubi.create.AllPartialModels; -import com.simibubi.create.content.kinetics.base.BackHalfShaftVisual; import com.simibubi.create.content.kinetics.base.KineticBlockEntity; +import com.simibubi.create.content.kinetics.base.OrientedRotatingVisual; import dev.engine_room.flywheel.api.instance.Instance; import dev.engine_room.flywheel.api.visual.DynamicVisual; @@ -21,14 +21,14 @@ import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.core.Direction; import net.minecraft.world.level.block.state.properties.BlockStateProperties; -public class BearingVisual extends BackHalfShaftVisual implements SimpleDynamicVisual { +public class BearingVisual extends OrientedRotatingVisual implements SimpleDynamicVisual { final OrientedInstance topInstance; final Axis rotationAxis; final Quaternionf blockOrientation; public BearingVisual(VisualizationContext context, B blockEntity, float partialTick) { - super(context, blockEntity, partialTick); + super(context, blockEntity, partialTick, Direction.SOUTH, blockEntity.getBlockState().getValue(BlockStateProperties.FACING).getOpposite(), Models.partial(AllPartialModels.SHAFT_HALF)); Direction facing = blockState.getValue(BlockStateProperties.FACING); rotationAxis = Axis.of(Direction.get(Direction.AxisDirection.POSITIVE, rotationAxis()).step()); diff --git a/src/main/java/com/simibubi/create/content/equipment/armor/BacktankVisual.java b/src/main/java/com/simibubi/create/content/equipment/armor/BacktankVisual.java deleted file mode 100644 index 8f8b9fca87..0000000000 --- a/src/main/java/com/simibubi/create/content/equipment/armor/BacktankVisual.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.simibubi.create.content.equipment.armor; - -import com.simibubi.create.content.kinetics.base.SingleRotatingVisual; - -import dev.engine_room.flywheel.api.model.Model; -import dev.engine_room.flywheel.api.visualization.VisualizationContext; -import dev.engine_room.flywheel.lib.model.Models; - -public class BacktankVisual extends SingleRotatingVisual { - - public BacktankVisual(VisualizationContext context, BacktankBlockEntity blockEntity, float partialTick) { - super(context, blockEntity, partialTick); - } - - @Override - protected Model model() { - return Models.partial(BacktankRenderer.getShaftModel(blockState)); - } -} diff --git a/src/main/java/com/simibubi/create/content/fluids/pump/PumpCogVisual.java b/src/main/java/com/simibubi/create/content/fluids/pump/PumpCogVisual.java deleted file mode 100644 index c94099d615..0000000000 --- a/src/main/java/com/simibubi/create/content/fluids/pump/PumpCogVisual.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.simibubi.create.content.fluids.pump; - -import com.simibubi.create.AllPartialModels; -import com.simibubi.create.content.kinetics.base.SingleRotatingVisual; - -import dev.engine_room.flywheel.api.model.Model; -import dev.engine_room.flywheel.api.visualization.VisualizationContext; -import dev.engine_room.flywheel.lib.model.Models; -import net.minecraft.core.Direction; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.state.properties.BlockStateProperties; - -public class PumpCogVisual extends SingleRotatingVisual { - - public PumpCogVisual(VisualizationContext context, PumpBlockEntity blockEntity, float partialTick) { - super(context, blockEntity, partialTick); - } - - @Override - protected Model model() { - BlockState referenceState = blockEntity.getBlockState(); - Direction facing = referenceState.getValue(BlockStateProperties.FACING); - return Models.partial(AllPartialModels.MECHANICAL_PUMP_COG, facing); - } -} diff --git a/src/main/java/com/simibubi/create/content/kinetics/base/BackHalfShaftVisual.java b/src/main/java/com/simibubi/create/content/kinetics/base/BackHalfShaftVisual.java deleted file mode 100644 index 5a464e698c..0000000000 --- a/src/main/java/com/simibubi/create/content/kinetics/base/BackHalfShaftVisual.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.simibubi.create.content.kinetics.base; - -import dev.engine_room.flywheel.api.visualization.VisualizationContext; -import net.minecraft.core.Direction; -import net.minecraft.world.level.block.state.properties.BlockStateProperties; - -public class BackHalfShaftVisual extends HalfShaftVisual { - public BackHalfShaftVisual(VisualizationContext context, T blockEntity, float partialTick) { - super(context, blockEntity, partialTick); - } - - @Override - protected Direction getShaftDirection() { - return blockState.getValue(BlockStateProperties.FACING).getOpposite(); - } -} diff --git a/src/main/java/com/simibubi/create/content/kinetics/base/HalfShaftVisual.java b/src/main/java/com/simibubi/create/content/kinetics/base/HalfShaftVisual.java deleted file mode 100644 index d20ec91a9d..0000000000 --- a/src/main/java/com/simibubi/create/content/kinetics/base/HalfShaftVisual.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.simibubi.create.content.kinetics.base; - -import com.simibubi.create.AllPartialModels; - -import dev.engine_room.flywheel.api.model.Model; -import dev.engine_room.flywheel.api.visualization.VisualizationContext; -import dev.engine_room.flywheel.lib.model.Models; -import net.minecraft.core.Direction; -import net.minecraft.world.level.block.state.properties.BlockStateProperties; - -public class HalfShaftVisual extends SingleRotatingVisual { - public HalfShaftVisual(VisualizationContext context, T blockEntity, float partialTick) { - super(context, blockEntity, partialTick); - } - - @Override - protected Model model() { - return Models.partial(AllPartialModels.SHAFT_HALF, getShaftDirection()); - } - - protected Direction getShaftDirection() { - return blockState.getValue(BlockStateProperties.FACING); - } -} diff --git a/src/main/java/com/simibubi/create/content/kinetics/base/HorizontalHalfShaftVisual.java b/src/main/java/com/simibubi/create/content/kinetics/base/HorizontalHalfShaftVisual.java deleted file mode 100644 index 48effc0247..0000000000 --- a/src/main/java/com/simibubi/create/content/kinetics/base/HorizontalHalfShaftVisual.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.simibubi.create.content.kinetics.base; - -import dev.engine_room.flywheel.api.visualization.VisualizationContext; -import net.minecraft.core.Direction; -import net.minecraft.world.level.block.state.properties.BlockStateProperties; - -public class HorizontalHalfShaftVisual extends HalfShaftVisual { - - public HorizontalHalfShaftVisual(VisualizationContext context, T blockEntity, float partialTick) { - super(context, blockEntity, partialTick); - } - - @Override - protected Direction getShaftDirection() { - return blockState.getValue(BlockStateProperties.HORIZONTAL_FACING).getOpposite(); - } -} diff --git a/src/main/java/com/simibubi/create/content/kinetics/base/KineticBlockEntityVisual.java b/src/main/java/com/simibubi/create/content/kinetics/base/KineticBlockEntityVisual.java index 528aee931b..df99f4c30b 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/base/KineticBlockEntityVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/base/KineticBlockEntityVisual.java @@ -18,45 +18,37 @@ public abstract class KineticBlockEntityVisual ext } protected final void updateRotation(RotatingInstance instance) { - updateRotation(instance, rotationAxis(), getBlockEntitySpeed()); + instance.setup(blockEntity) + .setChanged(); } protected final void updateRotation(RotatingInstance instance, Direction.Axis axis) { - updateRotation(instance, axis, getBlockEntitySpeed()); + instance.setup(blockEntity, axis) + .setChanged(); } protected final void updateRotation(RotatingInstance instance, float speed) { - updateRotation(instance, rotationAxis(), speed); + instance.setup(blockEntity, speed) + .setChanged(); } protected final void updateRotation(RotatingInstance instance, Direction.Axis axis, float speed) { - instance.setRotationAxis(axis) - .setRotationOffset(getRotationOffset(axis)) - .setRotationalSpeed(speed * RotatingInstance.SPEED_MULTIPLIER) - .setColor(blockEntity) + instance.setup(blockEntity, axis, speed) .setChanged(); } protected final RotatingInstance setup(RotatingInstance key) { - return setup(key, rotationAxis(), getBlockEntitySpeed()); + key.setup(blockEntity).setPosition(getVisualPosition()).setChanged(); + return key; } protected final RotatingInstance setup(RotatingInstance key, Direction.Axis axis) { - return setup(key, axis, getBlockEntitySpeed()); + key.setup(blockEntity, axis).setPosition(getVisualPosition()).setChanged(); + return key; } protected final RotatingInstance setup(RotatingInstance key, float speed) { - return setup(key, rotationAxis(), speed); - } - - protected final RotatingInstance setup(RotatingInstance key, Direction.Axis axis, float speed) { - key.setRotationAxis(axis) - .setRotationalSpeed(speed * RotatingInstance.SPEED_MULTIPLIER) - .setRotationOffset(getRotationOffset(axis)) - .setColor(blockEntity) - .setPosition(getVisualPosition()) - .setChanged(); - + key.setup(blockEntity, speed).setPosition(getVisualPosition()).setChanged(); return key; } @@ -68,14 +60,6 @@ public abstract class KineticBlockEntityVisual ext return rotationAxis(blockState); } - protected float getBlockEntitySpeed() { - return blockEntity.getSpeed(); - } - - protected BlockState shaft() { - return shaft(rotationAxis()); - } - public static float rotationOffset(BlockState state, Axis axis, Vec3i pos) { if (shouldOffset(axis, pos)) { return 22.5f; @@ -95,13 +79,4 @@ public abstract class KineticBlockEntityVisual ext public static Axis rotationAxis(BlockState blockState) { return (blockState.getBlock() instanceof IRotate irotate) ? irotate.getRotationAxis(blockState) : Axis.Y; } - - public static BlockState shaft(Direction.Axis axis) { - return AllBlocks.SHAFT.getDefaultState() - .setValue(ShaftBlock.AXIS, axis); - } - - public static BlockState shaft(BlockState blockState) { - return shaft(rotationAxis(blockState)); - } } diff --git a/src/main/java/com/simibubi/create/content/kinetics/base/OrientedRotatingVisual.java b/src/main/java/com/simibubi/create/content/kinetics/base/OrientedRotatingVisual.java new file mode 100644 index 0000000000..ee358d9280 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/kinetics/base/OrientedRotatingVisual.java @@ -0,0 +1,95 @@ +package com.simibubi.create.content.kinetics.base; + +import java.util.function.Consumer; + +import com.simibubi.create.AllPartialModels; +import com.simibubi.create.AllPartialModels.GantryShaftKey; +import com.simibubi.create.content.kinetics.gantry.GantryShaftBlock; +import com.simibubi.create.content.kinetics.gantry.GantryShaftBlock.Part; +import com.simibubi.create.content.kinetics.gantry.GantryShaftBlockEntity; +import com.simibubi.create.foundation.render.AllInstanceTypes; + +import dev.engine_room.flywheel.api.instance.Instance; +import dev.engine_room.flywheel.api.model.Model; +import dev.engine_room.flywheel.api.visual.BlockEntityVisual; +import dev.engine_room.flywheel.api.visualization.VisualizationContext; +import dev.engine_room.flywheel.lib.model.Models; +import dev.engine_room.flywheel.lib.model.baked.PartialModel; +import dev.engine_room.flywheel.lib.visualization.SimpleBlockEntityVisualizer; +import net.minecraft.core.Direction; +import net.minecraft.core.Direction.AxisDirection; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.Property; + +public class OrientedRotatingVisual extends KineticBlockEntityVisual { + protected final RotatingInstance rotatingModel; + + /** + * @param from The source model orientation to rotate away from. + * @param to The orientation to rotate to. + * @param model The model to spin. + */ + public OrientedRotatingVisual(VisualizationContext context, T blockEntity, float partialTick, Direction from, Direction to, Model model) { + super(context, blockEntity, partialTick); + + rotatingModel = instancerProvider().instancer(AllInstanceTypes.ROTATING, model) + .createInstance() + .rotateToFace(from, to) + .setup(blockEntity) + .setPosition(getVisualPosition()); + + rotatingModel.setChanged(); + } + + public static SimpleBlockEntityVisualizer.Factory of(PartialModel partial) { + return (context, blockEntity, partialTick) -> { + Direction facing = blockEntity.getBlockState() + .getValue(BlockStateProperties.FACING); + return new OrientedRotatingVisual<>(context, blockEntity, partialTick, Direction.SOUTH, facing, Models.partial(partial)); + }; + } + + public static SimpleBlockEntityVisualizer.Factory backHorizontal(PartialModel partial) { + return (context, blockEntity, partialTick) -> { + Direction facing = blockEntity.getBlockState() + .getValue(BlockStateProperties.HORIZONTAL_FACING) + .getOpposite(); + return new OrientedRotatingVisual<>(context, blockEntity, partialTick, Direction.SOUTH, facing, Models.partial(partial)); + }; + } + + public static BlockEntityVisual gantryShaft(VisualizationContext visualizationContext, GantryShaftBlockEntity gantryShaftBlockEntity, float partialTick) { + var blockState = gantryShaftBlockEntity.getBlockState(); + + Part part = blockState.getValue(GantryShaftBlock.PART); + + boolean isPowered = blockState.getValue(GantryShaftBlock.POWERED); + boolean isFlipped = blockState.getValue(GantryShaftBlock.FACING) + .getAxisDirection() == AxisDirection.NEGATIVE; + + var model = Models.partial(AllPartialModels.GANTRY_SHAFTS.get(new GantryShaftKey(part, isPowered, isFlipped))); + + return new OrientedRotatingVisual<>(visualizationContext, gantryShaftBlockEntity, partialTick, Direction.UP, blockState.getValue(GantryShaftBlock.FACING), model); + } + + @Override + public void update(float pt) { + rotatingModel.setup(blockEntity) + .setChanged(); + } + + @Override + public void updateLight(float partialTick) { + relight(rotatingModel); + } + + @Override + protected void _delete() { + rotatingModel.delete(); + } + + @Override + public void collectCrumblingInstances(Consumer consumer) { + consumer.accept(rotatingModel); + } +} diff --git a/src/main/java/com/simibubi/create/content/kinetics/base/RotatingInstance.java b/src/main/java/com/simibubi/create/content/kinetics/base/RotatingInstance.java index f9988a0023..3771cc828c 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/base/RotatingInstance.java +++ b/src/main/java/com/simibubi/create/content/kinetics/base/RotatingInstance.java @@ -8,7 +8,9 @@ import dev.engine_room.flywheel.api.instance.InstanceType; import dev.engine_room.flywheel.lib.instance.ColoredLitInstance; import net.createmod.catnip.utility.theme.Color; import net.minecraft.core.Direction; +import net.minecraft.core.Direction.Axis; import net.minecraft.core.Vec3i; +import net.minecraft.world.level.block.state.BlockState; public class RotatingInstance extends ColoredLitInstance { public static final float SPEED_MULTIPLIER = 6; @@ -43,15 +45,49 @@ public class RotatingInstance extends ColoredLitInstance { return 0xFFFFFF; } + public RotatingInstance setup(KineticBlockEntity blockEntity) { + var blockState = blockEntity.getBlockState(); + var axis = KineticBlockEntityVisual.rotationAxis(blockState); + return setup(blockEntity, axis, blockEntity.getSpeed()); + } + + public RotatingInstance setup(KineticBlockEntity blockEntity, Axis axis) { + return setup(blockEntity, axis, blockEntity.getSpeed()); + } + + public RotatingInstance setup(KineticBlockEntity blockEntity, float speed) { + var blockState = blockEntity.getBlockState(); + var axis = KineticBlockEntityVisual.rotationAxis(blockState); + return setup(blockEntity, axis, speed); + } + + public RotatingInstance setup(KineticBlockEntity blockEntity, Axis axis, float speed) { + var blockState = blockEntity.getBlockState(); + var pos = blockEntity.getBlockPos(); + return setRotationAxis(axis) + .setRotationalSpeed(speed * RotatingInstance.SPEED_MULTIPLIER) + .setRotationOffset(KineticBlockEntityVisual.rotationOffset(blockState, axis, pos) + blockEntity.getRotationAngleOffset(axis)) + .setColor(blockEntity); + } + public RotatingInstance rotateToFace(Direction.Axis axis) { Direction orientation = Direction.get(Direction.AxisDirection.POSITIVE, axis); return rotateToFace(orientation); } + public RotatingInstance rotateToFace(Direction from, Direction.Axis axis) { + Direction orientation = Direction.get(Direction.AxisDirection.POSITIVE, axis); + return rotateToFace(from, orientation); + } + public RotatingInstance rotateToFace(Direction orientation) { return rotateToFace(orientation.getStepX(), orientation.getStepY(), orientation.getStepZ()); } + public RotatingInstance rotateToFace(Direction from, Direction orientation) { + return rotateTo(from.getStepX(), from.getStepY(), from.getStepZ(), orientation.getStepX(), orientation.getStepY(), orientation.getStepZ()); + } + public RotatingInstance rotateToFace(float stepX, float stepY, float stepZ) { return rotateTo(0, 1, 0, stepX, stepY, stepZ); } diff --git a/src/main/java/com/simibubi/create/content/kinetics/base/ShaftVisual.java b/src/main/java/com/simibubi/create/content/kinetics/base/ShaftVisual.java index 3af17a4a71..58f21a5610 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/base/ShaftVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/base/ShaftVisual.java @@ -1,21 +1,13 @@ package com.simibubi.create.content.kinetics.base; import com.simibubi.create.AllPartialModels; -import com.simibubi.create.foundation.render.AllInstanceTypes; import dev.engine_room.flywheel.api.visualization.VisualizationContext; import dev.engine_room.flywheel.lib.model.Models; +import net.minecraft.core.Direction; -public class ShaftVisual extends SingleRotatingVisual { - +public class ShaftVisual extends SingleAxisRotatingVisual { public ShaftVisual(VisualizationContext context, T blockEntity, float partialTick) { - super(context, blockEntity, partialTick); - } - - @Override - public RotatingInstance createRotatingInstance() { - return instancerProvider().instancer(AllInstanceTypes.ROTATING, Models.partial(AllPartialModels.SHAFT)) - .createInstance() - .rotateToFace(rotationAxis()); + super(context, blockEntity, partialTick, Models.partial(AllPartialModels.SHAFT)); } } diff --git a/src/main/java/com/simibubi/create/content/kinetics/base/SingleAxisRotatingVisual.java b/src/main/java/com/simibubi/create/content/kinetics/base/SingleAxisRotatingVisual.java new file mode 100644 index 0000000000..5cdd4bc1b9 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/kinetics/base/SingleAxisRotatingVisual.java @@ -0,0 +1,84 @@ +package com.simibubi.create.content.kinetics.base; + +import java.util.function.Consumer; + +import com.simibubi.create.AllPartialModels; +import com.simibubi.create.content.equipment.armor.BacktankRenderer; +import com.simibubi.create.foundation.render.AllInstanceTypes; + +import dev.engine_room.flywheel.api.instance.Instance; +import dev.engine_room.flywheel.api.model.Model; +import dev.engine_room.flywheel.api.visualization.VisualizationContext; +import dev.engine_room.flywheel.lib.model.Models; +import dev.engine_room.flywheel.lib.model.baked.PartialModel; +import dev.engine_room.flywheel.lib.visualization.SimpleBlockEntityVisualizer; +import net.minecraft.core.Direction; + +public class SingleAxisRotatingVisual extends KineticBlockEntityVisual { + + protected final RotatingInstance rotatingModel; + + public SingleAxisRotatingVisual(VisualizationContext context, T blockEntity, float partialTick, Model model) { + this(context, blockEntity, partialTick, Direction.UP, model); + } + + /** + * @param from The source model orientation to rotate away from. + * @param model The model to spin. + */ + public SingleAxisRotatingVisual(VisualizationContext context, T blockEntity, float partialTick, Direction from, Model model) { + super(context, blockEntity, partialTick); + rotatingModel = instancerProvider().instancer(AllInstanceTypes.ROTATING, model) + .createInstance() + .rotateToFace(from, rotationAxis()) + .setup(blockEntity) + .setPosition(getVisualPosition()); + + rotatingModel.setChanged(); + } + + public static SimpleBlockEntityVisualizer.Factory of(PartialModel partial) { + return (context, blockEntity, partialTick) -> { + return new SingleAxisRotatingVisual<>(context, blockEntity, partialTick, Models.partial(partial)); + }; + } + + /** + * For partial models whose source model is aligned with the Z axis instead of Y + */ + public static SimpleBlockEntityVisualizer.Factory ofZ(PartialModel partial) { + return (context, blockEntity, partialTick) -> { + return new SingleAxisRotatingVisual<>(context, blockEntity, partialTick, Direction.SOUTH, Models.partial(partial)); + }; + } + + public static SingleAxisRotatingVisual shaft(VisualizationContext context, T blockEntity, float partialTick) { + return new SingleAxisRotatingVisual<>(context, blockEntity, partialTick, Models.partial(AllPartialModels.SHAFT)); + } + + public static SingleAxisRotatingVisual backtank(VisualizationContext context, T blockEntity, float partialTick) { + var model = Models.partial(BacktankRenderer.getShaftModel(blockEntity.getBlockState())); + return new SingleAxisRotatingVisual<>(context, blockEntity, partialTick, model); + } + + @Override + public void update(float pt) { + rotatingModel.setup(blockEntity) + .setChanged(); + } + + @Override + public void updateLight(float partialTick) { + relight(rotatingModel); + } + + @Override + protected void _delete() { + rotatingModel.delete(); + } + + @Override + public void collectCrumblingInstances(Consumer consumer) { + consumer.accept(rotatingModel); + } +} diff --git a/src/main/java/com/simibubi/create/content/kinetics/base/SingleRotatingVisual.java b/src/main/java/com/simibubi/create/content/kinetics/base/SingleRotatingVisual.java deleted file mode 100644 index cc5c24f71e..0000000000 --- a/src/main/java/com/simibubi/create/content/kinetics/base/SingleRotatingVisual.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.simibubi.create.content.kinetics.base; - -import java.util.function.Consumer; - -import com.simibubi.create.foundation.render.AllInstanceTypes; - -import dev.engine_room.flywheel.api.instance.Instance; -import dev.engine_room.flywheel.api.model.Model; -import dev.engine_room.flywheel.api.visualization.VisualizationContext; -import net.createmod.catnip.render.VirtualRenderHelper; - -public class SingleRotatingVisual extends KineticBlockEntityVisual { - - protected final RotatingInstance rotatingModel; - - public SingleRotatingVisual(VisualizationContext context, T blockEntity, float partialTick) { - super(context, blockEntity, partialTick); - rotatingModel = createRotatingInstance(); - setup(rotatingModel); - } - - @Override - public void update(float pt) { - updateRotation(rotatingModel); - } - - @Override - public void updateLight(float partialTick) { - relight(rotatingModel); - } - - @Override - protected void _delete() { - rotatingModel.delete(); - } - - public RotatingInstance createRotatingInstance() { - return instancerProvider().instancer(AllInstanceTypes.ROTATING, model()) - .createInstance(); - } - - protected Model model() { - return VirtualRenderHelper.blockModel(blockState); - } - - @Override - public void collectCrumblingInstances(Consumer consumer) { - consumer.accept(rotatingModel); - } -} diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorVisual.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorVisual.java index 431792846b..5bc4ea9407 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorVisual.java @@ -5,11 +5,10 @@ import java.util.List; import java.util.Map; import com.simibubi.create.AllPartialModels; -import com.simibubi.create.content.kinetics.base.SingleRotatingVisual; +import com.simibubi.create.content.kinetics.base.SingleAxisRotatingVisual; import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.foundation.render.SpecialModels; -import dev.engine_room.flywheel.api.model.Model; import dev.engine_room.flywheel.api.visual.DynamicVisual; import dev.engine_room.flywheel.api.visual.TickableVisual; import dev.engine_room.flywheel.api.visualization.VisualizationContext; @@ -31,7 +30,7 @@ import net.minecraft.world.level.LightLayer; import net.minecraft.world.phys.Vec3; import net.minecraftforge.registries.ForgeRegistries; -public class ChainConveyorVisual extends SingleRotatingVisual implements SimpleDynamicVisual, SimpleTickableVisual { +public class ChainConveyorVisual extends SingleAxisRotatingVisual implements SimpleDynamicVisual, SimpleTickableVisual { private final List guards = new ArrayList<>(); @@ -39,7 +38,7 @@ public class ChainConveyorVisual extends SingleRotatingVisual rigging; public ChainConveyorVisual(VisualizationContext context, ChainConveyorBlockEntity blockEntity, float partialTick) { - super(context, blockEntity, partialTick); + super(context, blockEntity, partialTick, Models.partial(AllPartialModels.CHAIN_CONVEYOR_SHAFT)); setupGuards(); @@ -172,11 +171,6 @@ public class ChainConveyorVisual extends SingleRotatingVisual { - - public ShaftlessCogwheelVisual(VisualizationContext context, KineticBlockEntity blockEntity, float partialTick) { - super(context, blockEntity, partialTick); - } - - @Override - protected Model model() { - Direction facing = blockState.getValue(MechanicalCrafterBlock.HORIZONTAL_FACING); - - return Models.partial(AllPartialModels.SHAFTLESS_COGWHEEL, facing, ShaftlessCogwheelVisual::rotateToFace); - } - - private static void rotateToFace(Direction facing, PoseStack stack) { - var stacker = TransformStack.of(stack) - .center(); - - if (facing.getAxis() == Direction.Axis.X) stacker.rotateZDegrees(90); - else if (facing.getAxis() == Direction.Axis.Z) stacker.rotateXDegrees(90); - - stacker.uncenter(); - } -} diff --git a/src/main/java/com/simibubi/create/content/kinetics/drill/DrillVisual.java b/src/main/java/com/simibubi/create/content/kinetics/drill/DrillVisual.java deleted file mode 100644 index 1d5dbb60c1..0000000000 --- a/src/main/java/com/simibubi/create/content/kinetics/drill/DrillVisual.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.simibubi.create.content.kinetics.drill; - -import com.simibubi.create.AllPartialModels; -import com.simibubi.create.content.kinetics.base.SingleRotatingVisual; - -import dev.engine_room.flywheel.api.model.Model; -import dev.engine_room.flywheel.api.visualization.VisualizationContext; -import dev.engine_room.flywheel.lib.model.Models; -import net.minecraft.core.Direction; -import net.minecraft.world.level.block.state.properties.BlockStateProperties; - -public class DrillVisual extends SingleRotatingVisual { - - public DrillVisual(VisualizationContext context, DrillBlockEntity blockEntity, float partialTick) { - super(context, blockEntity, partialTick); - } - - @Override - protected Model model() { - Direction facing = blockEntity.getBlockState() - .getValue(BlockStateProperties.FACING); - return Models.partial(AllPartialModels.DRILL_HEAD, facing); - } -} diff --git a/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmVisual.java b/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmVisual.java index 538b09776a..f46c2601c1 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/mechanicalArm/ArmVisual.java @@ -5,10 +5,9 @@ import java.util.function.Consumer; import com.google.common.collect.Lists; import com.simibubi.create.AllPartialModels; -import com.simibubi.create.content.kinetics.base.SingleRotatingVisual; +import com.simibubi.create.content.kinetics.base.SingleAxisRotatingVisual; import dev.engine_room.flywheel.api.instance.Instance; -import dev.engine_room.flywheel.api.model.Model; import dev.engine_room.flywheel.api.visual.DynamicVisual; import dev.engine_room.flywheel.api.visualization.VisualizationContext; import dev.engine_room.flywheel.lib.instance.AbstractInstance; @@ -24,11 +23,12 @@ import net.createmod.catnip.utility.theme.Color; import net.createmod.ponder.utility.LevelTickHolder; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.entity.ItemRenderer; +import net.minecraft.core.Direction; import net.minecraft.util.Mth; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.ItemStack; -public class ArmVisual extends SingleRotatingVisual implements SimpleDynamicVisual { +public class ArmVisual extends SingleAxisRotatingVisual implements SimpleDynamicVisual { final TransformedInstance base; final TransformedInstance lowerBody; @@ -48,7 +48,7 @@ public class ArmVisual extends SingleRotatingVisual implements S private float headAngle = Float.NaN; public ArmVisual(VisualizationContext context, ArmBlockEntity blockEntity, float partialTick) { - super(context, blockEntity, partialTick); + super(context, blockEntity, partialTick, Models.partial(AllPartialModels.ARM_COG)); base = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.ARM_BASE)) .createInstance(); @@ -192,11 +192,6 @@ public class ArmVisual extends SingleRotatingVisual implements S relight(models.toArray(FlatLit[]::new)); } - @Override - protected Model model() { - return Models.partial(AllPartialModels.ARM_COG); - } - @Override protected void _delete() { super._delete(); diff --git a/src/main/java/com/simibubi/create/content/kinetics/millstone/MillstoneCogVisual.java b/src/main/java/com/simibubi/create/content/kinetics/millstone/MillstoneCogVisual.java deleted file mode 100644 index cc2a6aea18..0000000000 --- a/src/main/java/com/simibubi/create/content/kinetics/millstone/MillstoneCogVisual.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.simibubi.create.content.kinetics.millstone; - -import com.simibubi.create.AllPartialModels; -import com.simibubi.create.content.kinetics.base.SingleRotatingVisual; - -import dev.engine_room.flywheel.api.model.Model; -import dev.engine_room.flywheel.api.visualization.VisualizationContext; -import dev.engine_room.flywheel.lib.model.Models; - -public class MillstoneCogVisual extends SingleRotatingVisual { - - public MillstoneCogVisual(VisualizationContext context, MillstoneBlockEntity blockEntity, float partialTick) { - super(context, blockEntity, partialTick); - } - - @Override - protected Model model() { - return Models.partial(AllPartialModels.MILLSTONE_COG); - } -} diff --git a/src/main/java/com/simibubi/create/content/kinetics/saw/SawActorVisual.java b/src/main/java/com/simibubi/create/content/kinetics/saw/SawActorVisual.java index 1981a6ac06..bed637b9eb 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/saw/SawActorVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/saw/SawActorVisual.java @@ -4,7 +4,6 @@ import com.simibubi.create.content.contraptions.behaviour.MovementContext; import com.simibubi.create.content.contraptions.render.ActorVisual; import com.simibubi.create.content.kinetics.base.KineticBlockEntityVisual; import com.simibubi.create.content.kinetics.base.RotatingInstance; -import com.simibubi.create.foundation.render.AllInstanceTypes; import com.simibubi.create.foundation.virtualWorld.VirtualRenderWorld; import dev.engine_room.flywheel.api.visualization.VisualizationContext; @@ -17,7 +16,7 @@ public class SawActorVisual extends ActorVisual { var state = movementContext.state; var localPos = movementContext.localPos; - shaft = SawVisual.shaft(instancerProvider, simulationWorld, localPos, state); + shaft = SawVisual.shaft(instancerProvider, state); var axis = KineticBlockEntityVisual.rotationAxis(state); shaft.setRotationAxis(axis) diff --git a/src/main/java/com/simibubi/create/content/kinetics/saw/SawVisual.java b/src/main/java/com/simibubi/create/content/kinetics/saw/SawVisual.java index f591f9a9e7..d8ac3d2099 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/saw/SawVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/saw/SawVisual.java @@ -1,36 +1,40 @@ package com.simibubi.create.content.kinetics.saw; +import java.util.function.Consumer; + import com.simibubi.create.AllPartialModels; +import com.simibubi.create.content.kinetics.base.KineticBlockEntityVisual; import com.simibubi.create.content.kinetics.base.RotatingInstance; -import com.simibubi.create.content.kinetics.base.SingleRotatingVisual; import com.simibubi.create.foundation.render.AllInstanceTypes; +import dev.engine_room.flywheel.api.instance.Instance; import dev.engine_room.flywheel.api.instance.InstancerProvider; +import dev.engine_room.flywheel.api.model.Model; import dev.engine_room.flywheel.api.visualization.VisualizationContext; import dev.engine_room.flywheel.lib.model.Models; -import net.minecraft.core.BlockPos; +import net.createmod.catnip.render.VirtualRenderHelper; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; -import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.level.block.Rotation; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockStateProperties; -public class SawVisual extends SingleRotatingVisual { +public class SawVisual extends KineticBlockEntityVisual { + + protected final RotatingInstance rotatingModel; public SawVisual(VisualizationContext context, SawBlockEntity blockEntity, float partialTick) { super(context, blockEntity, partialTick); + rotatingModel = shaft(instancerProvider(), blockState) + .setup(blockEntity) + .setPosition(getVisualPosition()); + rotatingModel.setChanged(); } - @Override - public RotatingInstance createRotatingInstance() { - return shaft(instancerProvider(), level, pos, blockState); - } - - public static RotatingInstance shaft(InstancerProvider instancerProvider, LevelAccessor level, BlockPos pos, BlockState state) { + public static RotatingInstance shaft(InstancerProvider instancerProvider, BlockState state) { var facing = state.getValue(BlockStateProperties.FACING); var axis = facing .getAxis(); + // We could change this to return either an Oriented- or SingleAxisRotatingVisual if (axis.isHorizontal()) { Direction align = facing.getOpposite(); return instancerProvider.instancer(AllInstanceTypes.ROTATING, Models.partial(AllPartialModels.SHAFT_HALF)) @@ -42,4 +46,29 @@ public class SawVisual extends SingleRotatingVisual { .rotateToFace(state.getValue(SawBlock.AXIS_ALONG_FIRST_COORDINATE) ? Axis.X : Axis.Z); } } + + @Override + public void update(float pt) { + rotatingModel.setup(blockEntity) + .setChanged(); + } + + @Override + public void updateLight(float partialTick) { + relight(rotatingModel); + } + + @Override + protected void _delete() { + rotatingModel.delete(); + } + + protected Model model() { + return VirtualRenderHelper.blockModel(blockState); + } + + @Override + public void collectCrumblingInstances(Consumer consumer) { + consumer.accept(rotatingModel); + } } diff --git a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/BracketedKineticBlockEntityVisual.java b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/BracketedKineticBlockEntityVisual.java index ceb9513cb1..13762ee478 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/BracketedKineticBlockEntityVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/BracketedKineticBlockEntityVisual.java @@ -2,97 +2,81 @@ package com.simibubi.create.content.kinetics.simpleRelays; import java.util.function.Consumer; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.math.Axis; +import com.simibubi.create.AllBlocks; import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.kinetics.base.KineticBlockEntityRenderer; import com.simibubi.create.content.kinetics.base.RotatingInstance; -import com.simibubi.create.content.kinetics.base.SingleRotatingVisual; +import com.simibubi.create.content.kinetics.base.SingleAxisRotatingVisual; import com.simibubi.create.foundation.render.AllInstanceTypes; import dev.engine_room.flywheel.api.instance.Instance; -import dev.engine_room.flywheel.api.instance.Instancer; import dev.engine_room.flywheel.api.model.Model; +import dev.engine_room.flywheel.api.visual.BlockEntityVisual; import dev.engine_room.flywheel.api.visualization.VisualizationContext; import dev.engine_room.flywheel.lib.model.Models; -import dev.engine_room.flywheel.lib.transform.TransformStack; -import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.core.Direction.AxisDirection; -public class BracketedKineticBlockEntityVisual extends SingleRotatingVisual { +public class BracketedKineticBlockEntityVisual { - protected RotatingInstance additionalShaft; - - public BracketedKineticBlockEntityVisual(VisualizationContext context, BracketedKineticBlockEntity blockEntity, float partialTick) { - super(context, blockEntity, partialTick); - init(); + public static BlockEntityVisual create(VisualizationContext context, BracketedKineticBlockEntity blockEntity, float partialTick) { + if (ICogWheel.isLargeCog(blockEntity.getBlockState())) { + return new LargeCogVisual(context, blockEntity, partialTick); + } else { + Model model; + if (AllBlocks.COGWHEEL.is(blockEntity.getBlockState().getBlock())) { + model = Models.partial(AllPartialModels.COGWHEEL); + } else { + model = Models.partial(AllPartialModels.SHAFT); + } + return new SingleAxisRotatingVisual<>(context, blockEntity, partialTick, model); + } } - public void init() { - if (ICogWheel.isLargeCog(blockEntity.getBlockState())) { - // Large cogs sometimes have to offset their teeth by 11.25 degrees in order to - // mesh properly + // Large cogs sometimes have to offset their teeth by 11.25 degrees in order to + // mesh properly + public static class LargeCogVisual extends SingleAxisRotatingVisual { - float speed = blockEntity.getSpeed(); - Direction.Axis axis = KineticBlockEntityRenderer.getRotationAxisOf(blockEntity); - BlockPos pos = blockEntity.getBlockPos(); - float offset = BracketedKineticBlockEntityRenderer.getShaftAngleOffset(axis, pos); - var model = Models.partial(AllPartialModels.COGWHEEL_SHAFT, axis, BracketedKineticBlockEntityVisual::rotateToAxis); - Instancer half = instancerProvider().instancer(AllInstanceTypes.ROTATING, model); + protected final RotatingInstance additionalShaft; - additionalShaft = setup(half.createInstance(), speed); - additionalShaft.setRotationOffset(offset) - .setChanged(); - } - } + private LargeCogVisual(VisualizationContext context, BracketedKineticBlockEntity blockEntity, float partialTick) { + super(context, blockEntity, partialTick, Models.partial(AllPartialModels.SHAFTLESS_LARGE_COGWHEEL)); - @Override - protected Model model() { - if (!ICogWheel.isLargeCog(blockEntity.getBlockState())) - return super.model(); + Direction.Axis axis = KineticBlockEntityRenderer.getRotationAxisOf(blockEntity); - Direction.Axis axis = KineticBlockEntityRenderer.getRotationAxisOf(blockEntity); - return Models.partial(AllPartialModels.SHAFTLESS_LARGE_COGWHEEL, axis, BracketedKineticBlockEntityVisual::rotateToAxis); - } + additionalShaft = instancerProvider().instancer(AllInstanceTypes.ROTATING, Models.partial(AllPartialModels.COGWHEEL_SHAFT)) + .createInstance(); - private static void rotateToAxis(Direction.Axis axis, PoseStack ms) { - Direction facing = Direction.fromAxisAndDirection(axis, AxisDirection.POSITIVE); - TransformStack.of(ms) - .center() - .rotateToFace(facing) - .rotate(Axis.XN.rotationDegrees(-90)) - .uncenter(); - } + additionalShaft.rotateToFace(axis) + .setup(blockEntity) + .setRotationOffset(BracketedKineticBlockEntityRenderer.getShaftAngleOffset(axis, pos)) + .setPosition(getVisualPosition()) + .setChanged(); + } - @Override - public void update(float pt) { - super.update(pt); - if (additionalShaft != null) { + @Override + public void update(float pt) { + super.update(pt); updateRotation(additionalShaft); additionalShaft.setRotationOffset(BracketedKineticBlockEntityRenderer.getShaftAngleOffset(rotationAxis(), pos)) .setChanged(); } - } - @Override - public void updateLight(float partialTick) { - super.updateLight(partialTick); - if (additionalShaft != null) + @Override + public void updateLight(float partialTick) { + super.updateLight(partialTick); relight(additionalShaft); - } + } - @Override - protected void _delete() { - super._delete(); - if (additionalShaft != null) + @Override + protected void _delete() { + super._delete(); additionalShaft.delete(); - } + } - @Override - public void collectCrumblingInstances(Consumer consumer) { - super.collectCrumblingInstances(consumer); - if (additionalShaft != null) + @Override + public void collectCrumblingInstances(Consumer consumer) { + super.collectCrumblingInstances(consumer); consumer.accept(additionalShaft); + } } } From 24acef316d98da1be123576ee8aec8e0a3dde52f Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Fri, 17 Jan 2025 16:39:42 -0600 Subject: [PATCH 321/515] Unite them - Reduce usage of rotated partial models - Instead use per-instance rotation to reduce draw calls and memory usage - Migrate to RotatingInstance.setup where possible --- .../bearing/StabilizedBearingVisual.java | 3 +- .../base/KineticBlockEntityVisual.java | 2 - .../content/kinetics/fan/FanVisual.java | 24 ++++++++---- .../kinetics/gearbox/GearboxVisual.java | 37 +++++++++---------- .../transmission/SplitShaftVisual.java | 13 +++++-- 5 files changed, 47 insertions(+), 32 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/bearing/StabilizedBearingVisual.java b/src/main/java/com/simibubi/create/content/contraptions/bearing/StabilizedBearingVisual.java index 431aa38023..a0612eed5b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/bearing/StabilizedBearingVisual.java +++ b/src/main/java/com/simibubi/create/content/contraptions/bearing/StabilizedBearingVisual.java @@ -48,7 +48,7 @@ public class StabilizedBearingVisual extends ActorVisual { .light(blockLight, 0) .setChanged(); - shaft = instancerProvider.instancer(AllInstanceTypes.ROTATING, Models.partial(AllPartialModels.SHAFT_HALF, blockState.getValue(BlockStateProperties.FACING).getOpposite())) + shaft = instancerProvider.instancer(AllInstanceTypes.ROTATING, Models.partial(AllPartialModels.SHAFT_HALF)) .createInstance(); // not rotating so no need to set speed. @@ -56,6 +56,7 @@ public class StabilizedBearingVisual extends ActorVisual { shaft.setRotationAxis(axis) .setRotationOffset(KineticBlockEntityVisual.rotationOffset(blockState, axis, movementContext.localPos)) .setPosition(movementContext.localPos) + .rotateToFace(Direction.SOUTH, blockState.getValue(BlockStateProperties.FACING).getOpposite()) .light(blockLight, 0) .setChanged(); } diff --git a/src/main/java/com/simibubi/create/content/kinetics/base/KineticBlockEntityVisual.java b/src/main/java/com/simibubi/create/content/kinetics/base/KineticBlockEntityVisual.java index df99f4c30b..6539c7b207 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/base/KineticBlockEntityVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/base/KineticBlockEntityVisual.java @@ -1,8 +1,6 @@ package com.simibubi.create.content.kinetics.base; -import com.simibubi.create.AllBlocks; import com.simibubi.create.content.kinetics.simpleRelays.ICogWheel; -import com.simibubi.create.content.kinetics.simpleRelays.ShaftBlock; import dev.engine_room.flywheel.api.visualization.VisualizationContext; import dev.engine_room.flywheel.lib.visual.AbstractBlockEntityVisual; diff --git a/src/main/java/com/simibubi/create/content/kinetics/fan/FanVisual.java b/src/main/java/com/simibubi/create/content/kinetics/fan/FanVisual.java index 57aa69a525..9b8e4cd53f 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/fan/FanVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/fan/FanVisual.java @@ -29,12 +29,20 @@ public class FanVisual extends KineticBlockEntityVisual { direction = blockState.getValue(FACING); opposite = direction.getOpposite(); - shaft = instancerProvider().instancer(AllInstanceTypes.ROTATING, Models.partial(AllPartialModels.SHAFT_HALF, opposite)).createInstance(); - fan = instancerProvider().instancer(AllInstanceTypes.ROTATING, Models.partial(AllPartialModels.ENCASED_FAN_INNER, opposite)) + shaft = instancerProvider().instancer(AllInstanceTypes.ROTATING, Models.partial(AllPartialModels.SHAFT_HALF)) + .createInstance(); + fan = instancerProvider().instancer(AllInstanceTypes.ROTATING, Models.partial(AllPartialModels.ENCASED_FAN_INNER)) .createInstance(); - setup(shaft); - setup(fan, getFanSpeed()); + shaft.setup(blockEntity) + .setPosition(getVisualPosition()) + .rotateToFace(Direction.SOUTH, opposite) + .setChanged(); + + fan.setup(blockEntity, getFanSpeed()) + .setPosition(getVisualPosition()) + .rotateToFace(Direction.SOUTH, opposite) + .setChanged(); } private float getFanSpeed() { @@ -48,9 +56,11 @@ public class FanVisual extends KineticBlockEntityVisual { @Override public void update(float pt) { - updateRotation(shaft); - updateRotation(fan, getFanSpeed()); - } + shaft.setup(blockEntity) + .setChanged(); + fan.setup(blockEntity, getFanSpeed()) + .setChanged(); + } @Override public void updateLight(float partialTick) { diff --git a/src/main/java/com/simibubi/create/content/kinetics/gearbox/GearboxVisual.java b/src/main/java/com/simibubi/create/content/kinetics/gearbox/GearboxVisual.java index 3d173b56e6..20938d693e 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/gearbox/GearboxVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/gearbox/GearboxVisual.java @@ -10,6 +10,7 @@ import com.simibubi.create.content.kinetics.base.RotatingInstance; import com.simibubi.create.foundation.render.AllInstanceTypes; import dev.engine_room.flywheel.api.instance.Instance; +import dev.engine_room.flywheel.api.instance.Instancer; import dev.engine_room.flywheel.api.visualization.VisualizationContext; import dev.engine_room.flywheel.lib.instance.AbstractInstance; import dev.engine_room.flywheel.lib.instance.FlatLit; @@ -22,36 +23,32 @@ import net.minecraft.world.level.block.state.properties.BlockStateProperties; public class GearboxVisual extends KineticBlockEntityVisual { - protected final EnumMap keys; + protected final EnumMap keys = new EnumMap<>(Direction.class); protected Direction sourceFacing; public GearboxVisual(VisualizationContext context, GearboxBlockEntity blockEntity, float partialTick) { super(context, blockEntity, partialTick); - keys = new EnumMap<>(Direction.class); + final Direction.Axis boxAxis = blockState.getValue(BlockStateProperties.AXIS); - final Direction.Axis boxAxis = blockState.getValue(BlockStateProperties.AXIS); - - int blockLight = level.getBrightness(LightLayer.BLOCK, pos); - int skyLight = level.getBrightness(LightLayer.SKY, pos); updateSourceFacing(); - for (Direction direction : Iterate.directions) { + var instancer = instancerProvider().instancer(AllInstanceTypes.ROTATING, Models.partial(AllPartialModels.SHAFT_HALF)); + + for (Direction direction : Iterate.directions) { final Direction.Axis axis = direction.getAxis(); - if (boxAxis == axis) + if (boxAxis == axis) { continue; + } - RotatingInstance key = instancerProvider().instancer(AllInstanceTypes.ROTATING, Models.partial(AllPartialModels.SHAFT_HALF, direction)) - .createInstance(); + RotatingInstance instance = instancer.createInstance(); - key.setRotationAxis(axis) - .setRotationalSpeed(getSpeed(direction) * RotatingInstance.SPEED_MULTIPLIER) - .setRotationOffset(getRotationOffset(axis)).setColor(blockEntity) - .setPosition(getVisualPosition()) - .light(blockLight, skyLight) - .setChanged(); + instance.setup(blockEntity, axis, getSpeed(direction)) + .setPosition(getVisualPosition()) + .rotateToFace(Direction.SOUTH, direction) + .setChanged(); - keys.put(direction, key); + keys.put(direction, instance); } } @@ -83,8 +80,10 @@ public class GearboxVisual extends KineticBlockEntityVisual Direction direction = key.getKey(); Direction.Axis axis = direction.getAxis(); - updateRotation(key.getValue(), axis, getSpeed(direction)); - } + key.getValue() + .setup(blockEntity, axis, getSpeed(direction)) + .setChanged(); + } } @Override diff --git a/src/main/java/com/simibubi/create/content/kinetics/transmission/SplitShaftVisual.java b/src/main/java/com/simibubi/create/content/kinetics/transmission/SplitShaftVisual.java index c2f1fce6f7..d03ffadcfe 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/transmission/SplitShaftVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/transmission/SplitShaftVisual.java @@ -33,10 +33,15 @@ public class SplitShaftVisual extends KineticBlockEntityVisual Date: Fri, 17 Jan 2025 22:23:56 -0500 Subject: [PATCH 322/515] Looking good - Update gametest structure files --- .../gametest/contraptions/arrow_dispenser.nbt | Bin 1054 -> 1066 bytes .../gametest/contraptions/controls.nbt | Bin 1579 -> 1578 bytes .../gametest/contraptions/crop_farming.nbt | Bin 2276 -> 2283 bytes .../gametest/contraptions/elevator.nbt | Bin 1109 -> 1111 bytes .../contraptions/mounted_fluid_drain.nbt | Bin 1368 -> 1368 bytes .../contraptions/mounted_item_extract.nbt | Bin 1114 -> 1107 bytes .../gametest/contraptions/ploughing.nbt | Bin 855 -> 864 bytes .../contraptions/redstone_contacts.nbt | Bin 1501 -> 1510 bytes .../gametest/contraptions/roller_filling.nbt | Bin 1120 -> 1123 bytes .../roller_paving_and_clearing.nbt | Bin 796 -> 805 bytes .../gametest/contraptions/train_observer.nbt | Bin 3331 -> 3316 bytes .../gametest/fluids/3_pipe_combine.nbt | Bin 1141 -> 1140 bytes .../gametest/fluids/3_pipe_split.nbt | Bin 1128 -> 1134 bytes .../gametest/fluids/hose_pulley_transfer.nbt | Bin 1710 -> 1717 bytes .../gametest/fluids/in_world_pumping_in.nbt | Bin 970 -> 970 bytes .../gametest/fluids/in_world_pumping_out.nbt | Bin 948 -> 951 bytes .../gametest/fluids/large_waterwheel.nbt | Bin 804 -> 814 bytes .../gametest/fluids/small_waterwheel.nbt | Bin 687 -> 700 bytes .../gametest/fluids/smart_observer_pipes.nbt | Bin 1171 -> 1174 bytes .../gametest/fluids/steam_engine.nbt | Bin 1594 -> 1604 bytes .../gametest/fluids/waterwheel_materials.nbt | Bin 1093 -> 1095 bytes .../gametest/items/andesite_tunnel_split.nbt | Bin 1260 -> 1261 bytes .../gametest/items/arm_purgatory.nbt | Bin 1132 -> 1135 bytes .../gametest/items/attribute_filters.nbt | Bin 1883 -> 1903 bytes .../gametest/items/belt_coaster.nbt | Bin 3459 -> 3496 bytes .../gametest/items/brass_tunnel_filtering.nbt | Bin 1650 -> 1649 bytes .../items/brass_tunnel_prefer_nearest.nbt | Bin 1371 -> 1358 bytes .../items/brass_tunnel_round_robin.nbt | Bin 1556 -> 1534 bytes .../items/brass_tunnel_single_split.nbt | Bin 1209 -> 1212 bytes .../gametest/items/brass_tunnel_split.nbt | Bin 1564 -> 1543 bytes .../items/brass_tunnel_sync_input.nbt | Bin 1715 -> 1699 bytes .../gametest/items/depot_display.nbt | Bin 1526 -> 1528 bytes .../items/smart_observer_belt_and_funnel.nbt | Bin 1661 -> 1663 bytes .../gametest/items/smart_observer_chutes.nbt | Bin 628 -> 632 bytes .../items/smart_observer_counting.nbt | Bin 812 -> 819 bytes .../items/smart_observer_filtered_storage.nbt | Bin 638 -> 633 bytes .../gametest/items/smart_observer_storage.nbt | Bin 541 -> 539 bytes .../structures/gametest/items/storages.nbt | Bin 1789 -> 1777 bytes .../gametest/items/threshold_switch.nbt | Bin 504 -> 500 bytes .../items/vault_comparator_output.nbt | Bin 1908 -> 1906 bytes .../gametest/misc/netherite_backtank.nbt | Bin 970 -> 967 bytes .../gametest/misc/schematicannon.nbt | Bin 1320 -> 1318 bytes .../structures/gametest/misc/shearing.nbt | Bin 1078 -> 1073 bytes .../gametest/misc/smart_observer_blocks.nbt | Bin 507 -> 503 bytes .../gametest/misc/threshold_switch_pulley.nbt | Bin 839 -> 840 bytes .../gametest/processing/brass_mixing.nbt | Bin 2154 -> 2135 bytes .../gametest/processing/brass_mixing_2.nbt | Bin 2846 -> 2858 bytes .../processing/crushing_wheel_crafting.nbt | Bin 2715 -> 2719 bytes .../gametest/processing/iron_compacting.nbt | Bin 1865 -> 1872 bytes .../precision_mechanism_crafting.nbt | Bin 2413 -> 2400 bytes .../gametest/processing/sand_washing.nbt | Bin 1370 -> 1381 bytes .../processing/stone_cobble_sand_crushing.nbt | Bin 2508 -> 2498 bytes .../gametest/processing/track_crafting.nbt | Bin 2098 -> 2102 bytes .../processing/water_filling_bottle.nbt | Bin 1797 -> 1807 bytes .../gametest/processing/wheat_milling.nbt | Bin 986 -> 976 bytes 55 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/data/create/structures/gametest/contraptions/arrow_dispenser.nbt b/src/main/resources/data/create/structures/gametest/contraptions/arrow_dispenser.nbt index 62320b6d4b0a0299c227279e39f56425a6fbc8e2..f4f8dc3a57b9455fa2ded04edfb0b4292e4df3e5 100644 GIT binary patch literal 1066 zcmV+_1l9W=iwFP!00000|HYWkZW}ichi6HyEy;Egpy;6wkW&yKryvNBgONW-E@==0 zMv{v`uV{JU)l%V7QQV?{uYHO>LeF`p90T-PuB4II^eoA^1tLI@rTxhHJgeWVq!GXn zwr8?Z)~XQz+!}y*EvE{8E{u{^JvOqe7V`Y4kWE=nU<9K#M$eS7rD_I{&-6kW$Q}T$ zyE83oRTz03(g4Ec$y8uwz}=(#;bB(Jq`&+wpF zD7Sp|Y*X~7%c5GI9i6DUP;_0~CcW_b*?+8?@c(X}{@A)#8@*f~u8RlvE)UAm{9o<= zZk-#~4fX#9bx)*wQ7mLt4P3(7n7ESbO}E^^HcjhNxbN-DeJk}zUF#t(WAhpKIbA-K zpVZM*TYYV%FCgUSvVrXU^5o$*)!Y`RDTRMoub8UhRMur7tD|Ej4KXB!)|9T{rqlAC z26P%bE}NOE8`lI5JI|z*hsrdit^xM`9D-=d-xPQAs=eoUAHqP@wrs0HdmF;maixp1 zrk!km41v#dgNrsd?#{n;|Hyg;#bgN#OJH~cBLYm8;EYVj8JUnXG9hPVLe4C~8JUnX zG9hPVLe9v9oHyqqfeASy6LLl-7wsnEzzyYgs~qOC$i!v=k2oU}n+3izH4A)a zD#N~W9}}AezB85cm@^}tug-#Yiyg>+UDWOyn=ARxz593ndj9as-ygre{PyVc?~dEA zC)M&(U*&jmw z%Btz|*Oe@D*ZWFakwN}c&ug2ng53E@OB$mW>wNe8(6cGAM_W+Ij&*`1bb=>zf|H$~ knOL%8&OE_cBsdGgxsM5@L=et>%vERj7obJLvSJtj00Sl!)&Kwi literal 1054 zcmV+(1mXK1iwFP!00000|HYV1Z__Xs$Di2F)^-e#5C=X0CxpZap-DSTyl7ltV$uX$ zCNK56Xjxnwcilip`zCw@&U`11NL+E+y35St7X}iQsy4~b@o!J^f8uoj&fgmI*mqCgg0Hkn{3-BrqXo%Y>XQ6LPjp$eATLTPEae znUJ$(Le7>6InP`iXX0VH&eX$@1coLsU1x^e^R9F5VY<#M9)=_^G=X6OACllqQ0D>A z`atK9?~a8SZe4)cv-(QtsZ_@~^q%rDFG_vBebJtT?V6_Co+^j+t>I7%?co;}Z5_$W zp*d*2?ri3;va6M7=53n7+HRp_RqgR=(w^XU4@fzL8-)@^WaC6?sXV&f@(nypsCr--wU2|3dQXNEYhdYDkO7~LeXM~a}S9hah$PsKqAhTiM0a~akfmX z9k|X|J8+$`7`x6sCe{vIXDsS5XM#BQuh|X)(Vqu>eG&Acn&{$aUT&JXZq38QdO@sq%Oykt6YB-B>rE4!X@WCDoUvXI%N0YMeN3zuxXxHF zppG-v3uwgIGO=DjBhHqI^#a!!>jkbemSNY~$HaPp>x|_*=1frMtG%E-#Tw+Vr?pV+ zls_Lly#M9-<8NO-eBb`@j_w1uz6i2)+3tsIX z2(H>8xLdbYH#|%%`>|Rr?}Y>=mi^fEr3ub7!I>e>SoUK%Vu-VkiDln)#GqGgHoN0nH zOK@h0vyTa-gdxs8#&upD^Gawf+Pmat57;YyBH-?#zbjr=Q+~c*@TTqU0~qWmITot@ z39kqFSWeA-kv#%C?)K$s))@Q2nnl?;$rk*_2mR&m^pkiJ5Y7(iL;CP19m3d)`hfuEeSMt%i0O znT)~B>FlFC75nqwVw{n#0OMz61KIiI#k=wkUdqIQ1)wv!uT^OZt~w?66aanbm=)+V YuKAu&O(|=$i2VY;0P~qV=wcWE0HKW#$^ZZW diff --git a/src/main/resources/data/create/structures/gametest/contraptions/controls.nbt b/src/main/resources/data/create/structures/gametest/contraptions/controls.nbt index c1b8456f9fdef17da154fc8bfaeb1933ec5af297..335c029ea01f21eaa5a08db1619e8d7028259818 100644 GIT binary patch delta 1434 zcmV;L1!elH45|!&ABzY8000000RP3A&5zqe7>8fScH(5W+fPuT95`{}zy%>yD&1() zEfMT?wI8MQ5>4#c#I55AV>{{gLdC6IIU^y&|IrE|aYaJv8U6r7Z-@h0#viZONu0N? zTC|Z?&L+>i^P9&rv&n1=pb3pJ^LQBY764qZz}RLZ4sY0hlCzLsmCW^~?5Jn6!1V`! zZ?BD9pWBihhF2X|hWYDnX3d!I@W2f@wrfFaM~X3*q00jctdVeoFp?a!kMgz`PHG-9 zIr3DE`F5tqC)@+=gS^q%lSWh3v7B$Av%yR!MSiHF&hslt6;BKX+yV2Dc>%Yee#q>2 z6lNfzaG2MBx||Jm#O)#TU7LBmu_vOzaK5Oa+H)|b%=0XzTTHnuscvu<6il834MO4b zUOx)e^`-I}Q(mZeDT`~1@sZ8K-kABy3H2=z53`=}r4J2OyZ$8dd@fnv<4^;=?Mm%^4Xj)KO(`O^ zi>ZD$r5Gi3p3b#@@_TyKVQoj*XWoVoUNXESp|vZNITgZ;gJB~RRyWmV(ovfzQ^rzM z-w{F5#gpeLwZ4^JpWgXCxz-^1Lx6ur2O^`;j72b71(OT{ z8U*cR_Zm6jy)>eF` z<1+7shqrOPwb?_l;@Y(qKN2PCPdQez{BG-~9Dl1-9?LxCSSyS3tauZfV8*e6bYn`2 zEuL-`%B_}9e=L_($l{!wV-_l$Dc?NMlL_YDm~#h`*UYv*@REH}gT`*;`|+4{SlP3s z@Vwj1i;|5k?UpzPE%d*(I0AiUR@XOOPi0PPErcQ!fEFhgoCWmn`rNPBdSkMkbW)HcuAx7gUJvMJ_^KdHUeG{w=HfFXP z9;KCxJ@;Yq2g-n2*HI)q7*}*6!!+-40+I{l<2u0BcL&*gtXlZO&NOkz#;>HCWk^ ze1bPb&4@h_Nt^4S-BBa_S6#nQ*fn*%tA77(<`dev#r0q;xmBfFyR%wNIMa3KZfwU(-0Sj+FG9#(N0XJ_|$-1CcZv%j7H0rM@v9=;p^03zMc6#xJL delta 1459 zcmV;k1x)&?466)(ABzY8000000RPRIOK;p%6o9X1?0F?kpP)inuwuoc8-!G;G^0#Y zMvyehqm*t&cRV*UZau!k_4Q2C4HdhxWsN|H|IrE|u|-1a8h!wxJH!HocT8p6|mj&_9Kg5N7GR`vS2$!Z%? zJJPEqeBsAn%Uy38xSmkF?+R97)wZLIcMaCK>D^E=@CISK>q?HJJWq1*kAIDiRkpGv zmFDi6lw_B|*A4cC&QO{i{?RJVFDsV-?^^;~lDZ(2tssr6?s z-8xc7)*n8vb+nzgpRs=B(bJ9Jep>B4`m@vj{`b2(7mKXdlcKGx^|x}?FC-`6JBp8H z{=GN?6Q!Rjv!KsfBoRf7QG%(IV5%h;vjk(6U}`0pdI_dMFh&WJe*+o>=?W~tlYs*m z1nGP&!IOal8375Ce*+or4(lb8F#{BT$WRWEp&T|!I7EhW zhz#Wr8Ok9tltW}FhsaP4k)a$SbJBMkBUiIgu&)|9KZ}?e!Qj(OwyjFR+Bu1-mtc&7 zepMILY?NTKdCUb&oycPp)NB>xspRTe#MB7}9cJfPtzaz7Ts`&V8MwvFt`_6?f$_EE zfl+bCo$-U7&3(sz8yd`7gQr|=KuBW)t}BPT4Q6igu~-no;(RN~MO#h|Y_1Ew2IX}( zUVT|O!r9f|{Qs1d9q87pFUu+z#HIB8iWQdS#~V|W?9ABlgsu3#zS8GP33tJi&!$^W z(j^&^azQR@)o8(LQN^u=;l3d10TcY-z_<(sgff zH;6X2xY;+7X2-%FanG^2+v^Li!jR)VsOEaGl8#et-EpDjIOoOVIVY|RhNGjwsv{a`r)5*20#OLoC=}OIu1zaX?^3 z?8rdbqRNch(8Iss_$gpl;dlpr|GMZwEr0VlQ!rG8TD$XFEq1Cs7{FL0m)9SLxfiNF zwwB+2jy){nG?rTCw+|EVmzi?U0#l!GS7p%%+yr0INJIcAw)!2m``8dlJQ`lII%W2T*qo5g&=kQ!a zl@I3{$?_v8HP0_aSzI|B!i=!?x$BDttL?*om_RQqUj}-V=32PP<&&BaFPJ&wF5H*u zlVrZ-vzvnZ8Iwna`dWIT*AFxtpQ~PTCNdc>%-`*L6Yhb_=jy*FRi^(hA>q8x7f(3v zuvES|Sr7?Vyd-a$==i<;1$s%{Y8Dn3{Z|Du5O?fce0>V5GvIDoQ;G3i;DEZt9b4Z% z)9?)HVkT_7&_c4|7?&X%zwh|WxSu8__U>{zaIcCE&Q$c`-4FK24%hsaP(IWO-`&1p N{{XsXU@yKL000~$=RN=c diff --git a/src/main/resources/data/create/structures/gametest/contraptions/crop_farming.nbt b/src/main/resources/data/create/structures/gametest/contraptions/crop_farming.nbt index 45e0887b89e925ed64f98c0499d84fddcde4b0d0..13f1f2487f45aa909a4dd99ac055f3fc1bd5f68a 100644 GIT binary patch literal 2283 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 diff --git a/src/main/resources/data/create/structures/gametest/contraptions/elevator.nbt b/src/main/resources/data/create/structures/gametest/contraptions/elevator.nbt index 6e962e5ca72b5c684124e279a9f6ff9fbf1bd5bc..efb1a642884d0d042ed2637e0f26c589b844ed33 100644 GIT binary patch literal 1111 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 al@%h$Jv{g@?jyy03;zPIr8f956953px~}yA diff --git a/src/main/resources/data/create/structures/gametest/contraptions/mounted_item_extract.nbt b/src/main/resources/data/create/structures/gametest/contraptions/mounted_item_extract.nbt index 1597619715ecb7c687289b54eaeb94d99e9b1e8d..f7d482c9ecb61bb1aa33aea64e48d0c438c3380a 100644 GIT binary patch literal 1107 zcmV-Z1g!fXiwFP!00000|E-rjZ`(!~#~;2)lx){-UK)2Oifk>=PY@K41shI0G!`N! zXbKd!5pBW9Nghv5k zqcJ72W+hyG_%3-7C172YR$GNtz)}@V*GsP#VLn9XbTkt<4{%`PfGF~e$|MpTVC&ls zxJmSqI=F(fcdK~29q=hvQI;cH-BuSIK2{xQeIXQvwhDdi%Yw}#ex5Q;WmZD4!RbfR z`pg3Vm_L*vb*P5(MF6&(l>8>u%i&(FUpprSl`ivrL+U~ ziO4N_1!eE`>bL>!)2BxVS<${3?hJqV{n75vi+^^1eE!kb8SI#e;0!Tzg{=bGM!LA5 z>-}3$!Rm$rxdiAQUic(kU8$6bR*Ynphprin*uns~f5c(kU8M{AmRwC1Mu z>|V)bfj$SlBSmLP9=1F>j4QMfW}DTpDsB$!oJhixQz}n4O!d3&9yIa+<^t<)bF6k{4n zya0^{a&M`;U7Z*YaRGCac=yI47=of@tSoY`ev#MguHL)dT`hB4R}*{S4P%NHkhLP- z@to%n?w=3;u)l}T*>|7*@Y5%MIVtM;dC#B2x1Xe(XKf>Pgu_4z#-0)Eb}r9`hW@p} z);5dc)Uf@w!2ge+{g|q`kY_m8eG+5WsxBTavH*989cUKjf_;P&Y5xi^=zGu_DoK;- z`M25%cTpiy8DRHneTkZnaeR(rAIGnjr+kIguRq@ZFRKSz{V=4V{`qi``CZFz)VbK1 Zo4U?Le_rBtOx&X1{SQ-5*zbD|002G`B#Qt5 literal 1114 zcmV-g1f}~QiwFP!00000|E-t5ZzDw%$KU?49VbV^{oq1@&~+g37o3osC{gZGaEZ>j z6NiMX@$QSg%6Mj(os9`qY8ndu03`kb3M!g|hMIzgj*j+9y5r66j$`jS8y`AH(Zu%m zecxwh-@KW00oK4z<8ROd0Q1`_fBiM+pwO|7G40ZOrwg7K>NRM6CUq=DtJE)jIk0gk z&ND7hu^~rr!P||M^N9nUBk@SdOhhK{fs&Kl=jGpv@h@K$qX+LCOQjj#lafbrD$Iuj z_Ec(SAOd>p+Mob74jAYAajKaJv5xm%1bVZ;hwzwUq=NAPZ_ zkZF9FW(lgnh-bJ4?upDTdL?D=)#A7g{TmUb`TgOLF25z zV>L}YR@1~|HBCIT%2+|u#A7v0JXX`hGh4?MG)+8K)5K#nO+5YzJXX`hV>L}YR@1~2 ztiWS6O*~f9#A7u#)w5s8<$&#j!J)=UnuiswV{;M<3>7=o55qC0ddUhn6*sqZ^I+>l zF_E64TI_VSBwJTW#xkKEbxoG}xqGuL!AU%!keSpq*^LA!a*!Fs#6xC z1MOouMTHS9S!cetE?F$MGCjYtSf+<zf+`b86ro6Mt)I6)c`$p>bY7|3^6di!I z2Xenq-kG16h^T-?op}4kMW_jeOey5o6#4w_3hKM7_ttlpza(+1OdLSaPmnCYTt$MT zsmLMxKOgCe`&q?zkjW1~2rSXfR%P()~^Q@i!$r`|| z-6+DyetmFhyszc2t#i3EH|#n~s*WYNK?Qe>e%cA+s5P2~N{z;U!X^m!N+ZQ$K4lk! zkfr8fb)kE#B%KuICQn*Zci>OyrraT)vif|jGVDN$zBDm`ppqSfb)GxfIG$5=RXo?H zlvi;%8ks^qWjvkp@~3nbl9Rqj5LyO_N^psDab{MW7l8;Eh1p3Z@XV%uDmMDe;%?rd z*BQB4LMHUNC?~v(rR*WsSmX=y7Et{Bx?p`8wrwT8`tW`Bb)158F|%6SYpbQVMVJrq gISz`lrsCgcnmtFA(!Xugr+$F{0M^&bdwUK50NK+t(*OVf diff --git a/src/main/resources/data/create/structures/gametest/contraptions/ploughing.nbt b/src/main/resources/data/create/structures/gametest/contraptions/ploughing.nbt index 64329baa3259f70a483a3eb1996c476336de0db0..91a5bfe3a49e598a5a61b0d696acbd2738049f22 100644 GIT binary patch literal 864 zcmV-m1E2gKiwFP!00000|DBfIZqqOn$4@@orX6EkFbN?fo@2WL@gXLmfv7Y-ZXz!^ zZLOtoEwX*@E822`yPZ0sZsi8Ot#dbSzI(CgkS(!|nH!2^hlgv)}~^$*_#zV4*BU z#wQa@fsAQZVg$W0O)BdUX}L9ev5sG`Qt~{;8;NOXqJO7LzX zcv5|eX~y$OJZ3^U)?qfj&)3kHtBPY9D|D8}sbJT8S?_}CAlt=QdnMUiCVN?%^U~{H z4=QLp2$X^*5>r#2tM%Rldbti%N|s#R#?3{lm)u;?0P}Q{>77Fu zTRj6fcuOU{KvC^1fWuz{2upT{fqE0FzutNb2M}Q{Sw#ZXGl1S@#*?eEdS^ZiASigL zCvBcU*JU-sr12ayzJn&PXgmiVt+DZFjg3cZY&^aLkJi|Dw8qAxH8!429UU|_9<8zQ zXpN00bl}k%8;{o5c(lgGLmYUt#>S&HHXg09@zim4c>ETP=b-T&G=W9qIq-N6Je~uO z=fLAT@c0HEP#rhOFC_soDo`CO>WRQ-DLmcjq2*K^drkYE*}W~QjXrRo4-EAF4*l=@ zDxdy2$^{o!1fn;zP-m9BJ-e?A!jWq8)wB@&GnFd&x%~U;gg|d31(vHOze@h$Av#nF zJ{O5PBD`-(bF9YiYCKWnkL7at=K*-%%-xoctuCQMT|z@$y#K5Vfy38nimCqj{e9)% zS}S#wjuOGM?1ECfv)Q=R%x0h?K#@3PW#X*P2Du4?&BtM zlLJ^yDgul=EoqvuGFa#JtSh70|0HAvI>NOld zgt=srVF}e^0KJQhCzs_=y?H-?px~w6w0;CYN=YTwJK8j!gT{Bz1Qw0wz@s%b9<8zQ zXpN1>ci_<)8;{o5c(lgGv-Z(JW8={p8;{o5ctQsrt+DZFjg3cZY&^t)M{8_6T4UqU z8XM0tPlLxdXgmjv@1O}R8qa~pbKvnDcsvIl-+{+(;Q<&zkY7jwWKpJX$cOovLrXChHw5#Cp&IaKR6wH~SU z`(m;9-FD)ezVr-aq<6VE445h^Cufbjf;TgR`IINpQP?pW6cnLNmO^ zol?VsDqAX_g;ek84J*OBiQq}~DyA9FC-ImG6>*tn9rtBD5JE>2?|jl!7J_)3!QS_j{e_Wu2&$EV;amcSc{kp#kRU hy3#v`G&VogIDSJVJx5V>mTLZ=@E5WN-FH(D008NZsiFV? diff --git a/src/main/resources/data/create/structures/gametest/contraptions/redstone_contacts.nbt b/src/main/resources/data/create/structures/gametest/contraptions/redstone_contacts.nbt index 60b165139b62885e7b7da2e2357fe042de86572b..d9db6863f7b07449c90770ece708e5cd84d1f9cf 100644 GIT binary patch literal 1510 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 literal 1120 zcmb2|=3oGW|5s=D=HE7xI4-~U<|pr6Jh!`Qnq$lECb~ANcuY`|oyJ-$y=HgCmLnD} z8G#F4Sa4Ron0{mF^mp8E_C;6UUVfwYxa{`WJ?_)w)`z7=MO5A3k?2_?|Nqa#Ng776 z4SYXl?szK4@Z>&U-R&Q|Rsx@na41(?JDR+lJI=^RHlucFPk`s@C)xIVU-~DnUg@(V zP5I=Z)=zei@||pv|J`HtNu}ps->?1}|37ew+#T!CTLzU2ru1CZX>3jW z(QBkLo#VrWrCy9*`e#gOS2EV=tZ1xSt`%+a@mY7%Eo;qF=I8gtPtnWbIQ#swK#btw z_KDBVd|CK z>D*{3oLs!D`W{pUs@{+5%_@RK*P6&zmOLWllyMExAe3lHo|TE z%F{Yi-Z&IAa2tKreD;-XVpz~T!ZFIgtm0y5Hen%CY$)GJJFbUSrhb(^gqXTOQHIlr4v zwqEwK*RK?QroLumX`b@=2Sfd9r{68JXI`4l*ut)pI?=$qUtIAYL%B?)3q$np!k(JS zUoTweJ(WBD`Dgs@&-V2-5)Ro3Cg(RLm96f3+3mE`pLs>kB~yQoQ1cZpp51i4bUgLa z3{|)LJi!wmm@Q6YX!1&W9naUWbaU&4Finw@D?9Z*sL8BY*;lapS&jAl^Yw>6Np9lb z_=m4Q{@UK%uZ#?*$FXt*t*>$#i ziyh8=@rb=1^B^mXe`eV!74x>|pB?O3{5X z?L@}PW64)I&doei(eY4R=jhx&TMro+U-hhH)0jQaadBixWbc>rlJ8FZm3(*JIV9M4 zo#Acss;-N=HZ!wXINyEMpVlb<$C%%T}{di@0)vtFf zJJpWPT^1nw%T;mRj}0?cU%T?wQ-80{)^(CScx;bU zv}~dMdDiD?GdEkEUbEJ3@tfs7(jO{>)=Pi9wR}NjPPWpch;@6Xm3y3%7s!1l6vKDt j?WUlw5098%Q8a$j^IE6A(BZx4AKp7tlHR2VGcW)ErRX?| diff --git a/src/main/resources/data/create/structures/gametest/contraptions/roller_paving_and_clearing.nbt b/src/main/resources/data/create/structures/gametest/contraptions/roller_paving_and_clearing.nbt index 4ee3f97877dffeb6bd7255dac5b0e20c62a1888e..ee852a33f0706b52719fe4d762392fdaae7474fd 100644 GIT binary patch literal 805 zcmV+=1KRu_iwFP!00000|E-qIZrd;n$7x%3?6lnq>;rp@o!iTb4h6PDF(6y9?Gh+9 zn+jDdLspu$r(X98JMB&OPP+{lkV%Q1x^a>cNDUZDZ1Vr3C`)7)Ac0Q7B^rZW0N9Oz zo$?XFt5hR5c%ZqE6MoZAc`5QCEMAX9j;ZG7<{(vrfyC0N9H9%{Pg)hIjlj~{p7Rue zO}Lb?#i$8t%zzm^#uy^|(n&JprCA6+zZaHxg?d?XXJVt$QVoYzDLm)0Y)VbAA@!!3 z!U)p~o{N;rzE)DUHEVZ&Tv%WGJg<}&Qv3H&4Y<}QH%P#83TK13!v07ZwHD4YHOXVx z=hvd_bE)!S|6FK0ouyD-SE@sv8|~IbYr%)D)Gue7IbHB>7CL)%baHIci?!}`idn(6 zfdKPtUAkX946MAc*&@nDBavlt?Luy$9G1oo+Xz>QyInXvtDTVRfx3nOcHVQt&rp{_ z5@4mc#lY?-ce{NRx!(!Im>c1A!CeVN1F6!>(pkJsAShH>J1wqYHV1>1$0{3- zVB>GF@d&KiW)sUJuzUi`C$M}1D8{#`(hR&J~VE&cr@>H`iL* zLwLZx6rYvXT+^Vvz2<40hnYb5!Qg0i+I!Z&CzUHjgpgTf)^0-@bk^Q*O?n7nuRzR> z!BwQrDVmAWmm$Q*ys)*=+TK8)KFGzl&yq{0N;RBm$G zS##saao2TMdk${kO?W5nkdTVqCS8{$n?)BXO56PB`;U+9<8}dJAO*k1008XWHFsz~ z#}Hwrx#n1ayo`YAVdC1Fi@bVqJ zd0X>$}OnZjc>nBPIamK_HR}-_dA{X}p*6ry96vxMvUhh;G7o0H4dmcs5)ni_ri`sBv4{P*c% z@%Pu_&(A{&VP7jOigIb!YI?Iud8aC%)KWF<(|WqJmM$#k-jZIHq%q61nh$cGahWv~ zpuS4N|17`*gIy)GTPBoWj(H@%TH}m~_Qv+P!=b=J%M5L5AC=5e+5ePAJ7Ng}nK2QmljEo6?zSRehU_OiK>q5%}iEG$nn^a=!l786E(vPRBNxSGplfanwwbj zdsdRysQZns9Rc+cE+7072dkdb5=l}y%OcogSG*W7A+zyd#FZINEtUPdizYGYa5lbI z`g*mA<$^a~bMAJF*6^ytBxg!PfLYpB?#9*Zh7Bh?O-1WOZb7ySUFmJWW#O*ZLG?{$ aPMUX2volnMJpiEh1O5R5Vs3YI4FCYJ%X;Vl diff --git a/src/main/resources/data/create/structures/gametest/contraptions/train_observer.nbt b/src/main/resources/data/create/structures/gametest/contraptions/train_observer.nbt index 84b841857477b54ab5eb119896c8f7eed7b0f9be..d416ad8c8efce960dbef0379ae253688e770ce6a 100644 GIT binary patch literal 3316 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 literal 3331 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 diff --git a/src/main/resources/data/create/structures/gametest/fluids/3_pipe_combine.nbt b/src/main/resources/data/create/structures/gametest/fluids/3_pipe_combine.nbt index b7a9d2b54f87abfcfe51fb84266e230661efedd9..dfe35b91d3f8974924d73b1d8a596831cebdcb3c 100644 GIT binary patch literal 1140 zcmV-)1dID0iwFP!00000|J9exlG{WO$J_d{EpIA7@lnMiaHEP-iiE5;qynUtEld*N zVkXk8J+-n%r5VLpPA+a-IPwm_fk)uLog44LBhVvhytXV21M6K_Rk>uzf3<%7pPrd^ z2rz_xMiMF|4FMn=fOkw56kd;VN+i7#@hqeHG$MkfGYBC($vNJTjEVvHVoov&!IGsh zUk<>PJOlrfB!Uhgc+REd3-DxKP|$H-t>d011&gPWq-V{b!6}Kno+7;N+&u(`hpj7t|flTbG%x=uO!!3PH|zfhrXxvRfoqJ!y(!aPkmM4)EC!D zv%YM>*`qtH2rfxvcLBUr2c0EEh-r7|))`ahp(l)yx12F9j2;k4p3+<}o&wzZZU~-W z-%uB)u=@1tvp<9ZO(jz=2XzebEeVg#gqrN{4Z+R0&=0K-7cnKivVNjX)3eYx78=(= z;~6wP3udh`F>8&9S!+zpT4Q2%ESR;%#H=+YX00(XYmJF{JsuVs6SLNsn6<{ltTiTP z&w^QNOw3wiV%8cHv(}iHeG6u-F)?e6iCJq*%vxh&4lJ0p#>A{OCT6WMF>B2>a|mww zT!s*gIZJ5nLU?*_;WPR4b(q!KBEt{8b6yf;Yi6y>cylTr6111(W9$ZSaV)*<7JJxaqODWuFLP^f{i6cq(xd z7{KtM`l)JIFc^(;aw_l8MJCTN-r<55soWXK-tGdYK2B|@5B?;hG(K9X`>!11S5e-m z9SWg;Oy!d2XFd#$NQSMLJpXtF8`-%&+&YY7j8XsmaHS@T^HB_N8^3;iR}F^DsSpoV zCB|qH8=^0kAWKlDZ<~-WY!)wpOT`v!vLp^@yr=N{O9oAiH^WpNri{WT# zKR5XN-EFQa*T3hhDx#fXQ&9HK20?30jkjycoJ7!`gtH%$TlxQy$^CXdnb*a?GGD6of~Ip@Lw5v@WjT@tC{l9F!bN|>GwA3vf*8~U7@l{wXQ0ij<$c(o8fNf z>Ref|UEZ5~3o3> G82|vYgf-Cs literal 1141 zcmV-*1d96~iwFP!00000|J9gHkK05T#~;7OaTYBgUL-yOHzZCKEo`<_1*&C5XbW7z ztUa5I*6~=Lant1#@c}q;7j8A8mkAh)|i;J#>A{OCT6WMG21{kYA*H znVu?a>l>8a!Rxnpy^YuJN&pAk3D)$=weUf)U?~?&URJdJeadEYg>DC6vl!lpa)hI| z&Xa=0Q%TZ`5Jq3)<(Q`u7l8nV_tZ}(WI^E&JEKuf&gCt-$mAvVceLO|Dxt+ttA1|| zj8z-zfj7x0jgMFAyVpYf{&tiZ>{P_KCH5f9dLfl=INTW%V^CWphl7gzoRt6l@1}wPbc}EDFd1E(1_^UGn zm*RNgQhKTwikx~-S4|Z)n8q5}zM@ZPE@<4-icx7r749cyBM@v!cfm?1^{Q-nN83W9 zIZ0VWl4({fGMot$UgQz2^Y7zE{`qaoL^BJVJ!XL+&?=C(>p%osWC@*KUJt1_aUVN;Ou z+$dK z*v|;^(j0MGL0;A6d)z2H?sYBSOKg;HEZ?KQ+xBqH6tixeq1Uz_Y8v|HKV62l?T2oT zq5l76=)uD-L!FmyC^QUx{(btLjl67l*KJp*tWsN76;8*tzh&oYHz6h zyRkGo_0RE~gwHBBU+Z@I7*t+xFs9Xcx6yV~R^5cpW;DJ6(H*MY+PcGz17fcpUGkI( zu%50vJ6yXpTh1v>n!Qx9lumSXS)E|Cq}uLZJ+CC!cXn}QvWvc_^<9U@Nxa-G4hr(#(~jYBFQ6~3&vBdJ-@(zjgqb^ H4jBLd3e7JB diff --git a/src/main/resources/data/create/structures/gametest/fluids/3_pipe_split.nbt b/src/main/resources/data/create/structures/gametest/fluids/3_pipe_split.nbt index 88f648db6b679ee8e855201a36e9601f52e5d188..ab242bff9297cfd6f56ddacc28cc3e21bfa1b665 100644 GIT binary patch literal 1134 zcmV-!1d;n6iwFP!00000|J9evZrer_hL3m?MI~rj^aAt|vMbP4&=j$q21%N@M%5;5 zH|m5OO9PV}f-{Wbu7vKg$ujSdcF{-ZqA%2CmpwyrWSJtzOe`C*0D+?P^UQbtxtyZ_ zUaor7*5f4cL! z&KBKiMX*UMyBEM`bS-G?h#Z4(c_+QDPn*3ANe39D$v2p&wekY{Zl}Wc@^&X3#@p_0ZToG>$8&9S!+zpRu5*aF)?e6iCJq*%vxh&Ud=}jjfq)nOw3wiV%8cHv(tlF zYfQ{qV`A1C6SLNsnB5-CT4Q3?8WXeDn3%Q3#O(E8)*2JD)|i;J#>A{OrjUt;I;f0qGVdxQn=+Z2n_fx;gAgt7;C z{TZ*f@%l>%V1qNkGre*xcvK`T<$}rMiq^YN*=(-REi8I0YN-he&v5y}``9v*%F)ppB(!FCgBB)xQCYWL>;VN4?8eQB86JF#Yt=Hef#`^P4tpaH6uTJK1!eDS5Ol7o-IJ*>C*idxVQt6cR{pm#dDzZ()*^U2i#q=i ztbzEO4MLyU)<&5?PP{k=$XPRXX^zsYZC9YIQmv~>r=#s(_hz)&xmp*t*v{|G zL>GTW}(F8T;v^o6?YvS&z+q)_C9Nfg5-V9+Fg9)9PaGdG0* zLvRIqMjZf9e}nq$4I!YZWRg(<>KKB5obc#Wgn04g5S)w){nF}iz!Q>4TEEezv3h9i z9vY{I#x-cH9?V)}V%8cHv(}iHwZ_D3_h8l<6SLNsn6<{ltTiU)ReSW%n3%Q3#H=+Y zX00(XyFHk-#>A{OCT6WMF>8&9+3UfqH6~`QF)?e6iCJq*%zh7MtuZlcjfq)nOw3yI zDsu=w?m)N~N%n-^r9@Wn!Q&YdGO0#N5BzbFWyx7d4WlC>gjQSN|Cq%X z7_%9ClTKM$kFNOOF-v2Hes2H%#q#Bgzr^0>|1Lwg@_-2WZORwv zk;1lqLfJh$|BUCGc>bjXaKIhom|nRSJ}Bla<$}qxiq^kN*>tAR?Eq{R!-r9haP-DW zQm}X;NqQQ>=m$I<@KoX?5Ww(`dUQzU6s}@08s+3f-dNyEXotTy=S7O~uK(9Is9BAM zv1&s-@WvUX@xfBvyLO2GitS-jTv)-Pny3{^?A? zrPy9Ll^!XEBB!cX*ec`lFts(ZeNUgzT+q0u6{FIMD&1RVBM@vsx4{%s30K+jskVhi zGm^51B$KR|XV??QyvQS3*Wdj{{rPRvM6(K<9ae!M(JGNo>O=&aX9=C0Vg*YUHS=ip zqs}}wOTk?Y53NnTfBla?U)$6nhU0~twKYc>pskx`ETb(`o7EU9z1Q&RQtV>b6r?;i z3OZ|Qf87+llh`a4e>Wz#^1rRgn?*3_ZE_!rKC2O?3CXIi)X0w z-VKF@p>MxV|9Yb?8{T!>6)LOL(p9C?vFvYIx!R3l8(vUv9yYvj-_4utF}0;`?8eA; zS-g42y4fBcJG{A!b>r{Wo2@N?_QrX|n;{G`l29qB`f)T2z%56zkLzznJj-Z4iHKn7 z6pajza*j9DPpbijnGsyc_=|FM4#1H-1Mh?+f(GCpb1C^8T$$s3Rma`Vr5V&e!F>{b zt6Y4o-qYKl@`Q~ssrI{#cSq&6KH<|Tjn^Qp0XsH`y&}5gDHC8lT?M!K?ytY6)|sm-yI7m-qVH*a)!}iu*xU_IeO2Mq7w1W{x@^JOp*yVz u4oPHp0d%hN`}CMP58Yvmyk(DZV04>E@`&bw@f63N-{60~0sz$x82|vk9z3!D diff --git a/src/main/resources/data/create/structures/gametest/fluids/hose_pulley_transfer.nbt b/src/main/resources/data/create/structures/gametest/fluids/hose_pulley_transfer.nbt index 5a21ce41116af67f39800f0e4737ba0f029fa034..0ed45feddf8589f717a2b0bcf16db2cf149d729c 100644 GIT binary patch literal 1717 zcmZvYdpOg39LIk@W^^b-TJE<-N5|zTG;`@7_jEcT%cVys8Or_E*&ZQMT~1b5u{KzJI))@ALhB-k0xJD^~_sTPuvRw)`PSWtu_h zX_{u@4($_C7$>(B1ZdQu_vEDPl+B`cybY)k)06;Cr7GAWGM9iR-p-(HL`Uvy1Gk{fHE#2 zl~uapwp69t3X=-9SP%-6V^eVt?-IkCPFAYL(bIZ&6nl>bR{D9X^u+r-?`$w_N7lPZ zTb2?W6yFKRj3>N4!N6qm;zgxtjfyeXlbI-kWKG1%`$3-s_@O@tXhZnSqdxS3lDaXp z3z5)RmHg)Jd^7BLXk-=L8$VPc)Z@74Cnu*&ctH62cW|<$?-+uMZh;{Uu$F<^k*Pyo z{G0Vv{ItuAN;*1RCp@OMj}%2Jv_w41^kf$5x);4>1?<#$VuR^#oVE+N?$>_}?}lN_ zL-Jg-gLaRz+8T^IC)k8frv&mfsHH-i#vUhD@#RapBHi%9DpD=+p2AyRhf6ggHT2fd z#5Dh@P5jaY#}m2mh=^=~V$L(-Ll0&|;=v2HIT`*}c5B=}>PxZ?&fW$-haJ_Y z8e%s9VeO`R+SX?N3BeDh9-m_6jNVgv6l#z~w}q~6_RE#vV8-hcLqgE>yU}{=H_HD6 zsX)l8%QxaxdjtFb=d4ZyNPdm|A`mD%{j&e6asH8h82FJM_9K0e*wDHtbYlH z$(e3Gs!WB*nM0BJAoCcN51T_mk?vF?{9tv}u-@v~_lU^DLgPRk``DBWVc5@?(I8B=51kN%jYZR?s^44U4)^>2MOpe$c zW^VvZ*?S>cw6IRI2|;PJ2x7xL2V>7(+RNnYh@0X&u&dtstKJ$?JP3A^8HL>?u0O9< z#{BHOmT?ZtRp`nAa57zH;tvY87u(oT0u?w*Lg{g*m6fv}0X=Y^nFplzJQk&RfDSas ziNQk+H)d@#T}ouJ7{$%76q+#>Q|%ep2C=D1*b*u>b8Ily5(2EliS2-AU3vi zgwCh=&bas?BP0~B?IhsHn3!0dr2EF`SAQ<|Xjx(~LN0;DY^8`sY4aFiWQGV)bG3so z!BcZqZ|;vCp46CM3^1C3ux;?n$iV^D>Chr+Z!&LyX)Pe;Mdr2=>9#xMtM~hJXe=~u z-(kJpqMKHUG(6n62Myr?)v{wG*FKY2S#_erth@IuZhb_9>tnrB% z21`N9&FxA2EIIWiyOb&l1%+wvWuNFi(-BWPJeH6$qxv#rygtNgXN_pGpmvbaa*+W-{9pd8+#mY2>wR%ZIp6Sy7Ft`#Zfa z4@T*+XDvPsN9j!(slinRi+u*~g(EpMT(QH{oGaN&q~+C_JK`EHXaz>X>>zJ>Nft!& y#f3Jfp*v?&9nUZ56FQNtyZQrzBKxLPadE@Kg(J-$?gm)8i@=U)EkyCJ0Prshd|G4x literal 1710 zcmZvac|6o<9LIlVgd91Gmqw*^MbRY5G@_WWuBiD(rStd4`}KQ0&*$^~e4p?0?2Q)!K7DI#X)g+?#xgOg z_X1w+A<9Vndo4%pMAx>3UH03fDL)gRU@iSKnrnK3r<<;%JG+eLprI{y+5V-hl4o{(T z>vQauLHz2sW}YaF|3`kYANg@V@~`at{#38f1_l%F(h?5aV*diN02P2h-rFdpp$$KR-AU|=szu{OZy3S>HrIb|V;T2A0cDG{;& zg>4LeL#?=x&{LwlBCZuq{9t^n$0PFR+#sO^4M_Whwj@EC4<^tK#af9jT$3x5t@p3l z7c+%`(=eBwn&LcN!&xSwaOu%>gN{)QjJL>L2#)cHw>AO6gxhVfRshd5{BeG9gQvlG z9U5{IMg->(?3;Gq`3Yle5+6#GAPuhB_ewV^e3PlD-k8f=wT%qSr;G@)5i6%i`=~=W zOo~@M34{U>Wb2p4aYdVypUdYXZvp~Z6&6ITH=_#TRd)k2O;u~0`Zl|!~ z)fm}P;x|v!EXBQ+?7rtSaMU3VZEK>#?(srWIibmPcBSN`%`f-$+;GY2<~LPjUK|-d zzC=;i@U>TN8NcgTkWMdjT0)jub+oPyo*X0Z)qtL`|2sWXa^bKm+odvp#>ZSLu0Jaq zR?@~r%pGsmWwVoN!}mg`7S$O&eR}18%nWFhmoqDHsH}L@ZPj4?VZDEf%E}d%if2X0 zLlqb!fkL#v`D6N)HxF6{5=--fi@3f7(w^Mf-tgMa{IYHsk)_=mr($lRq{Zx?tNl$w zEWf*m?w7Y1LG^8!JQz~0O@d!WbOo?o(d5GV1rgb4h2H5!1)^9|`s<#R;nTDFjx+Fw zoJVHXgG@b5-E-d6iQz~semCM%D&*-=s_`_BFST8ItanWR>C zb=8GC5-C*Qoz?JClQ9!UpFtQ@nPkV|I-j(%GAh|z?^+K#My5u3seDOTfO&n=e^W|C zOE)SqN?B$yvb6NAJ|*&9s9zo?tqU2jpD`%zT);kt@sMSqI$J+5u5t*rYI!de#*ycC zvHZ>-eC=0lDxTNzVrF*DQ6y-kYuq)E<%>Yx?cQJ#)x^4l0Iu h(^pn!3vZK?RWQDJFbxqRHA*T9{PgCj3wMqH!2dEWV4?s3 diff --git a/src/main/resources/data/create/structures/gametest/fluids/in_world_pumping_in.nbt b/src/main/resources/data/create/structures/gametest/fluids/in_world_pumping_in.nbt index 5098188f0755a009769a9633ba21ccf67308be5d..53b47debd9db33e2e10b14d47ebf93a772aa35e6 100644 GIT binary patch literal 970 zcmV;*12y~~iwFP!00000|LvE(j@w2M$A=;*k(3W{kuSf5;o8Ulw|14ng@N>Wh*U_&hF9XuKP%JjY@ji!#Y(z@wj~NrrJDruyzoin4?VqO(Gg zQYTmj;7fdk5}Z427IX4jG%dWTh!Om$RH_IFNzJjq33$4wFn~Udn)u!vOWo$v#M|*X zTtt#;HX~2|RLFAE6^ad4U)Ix2F}@O65(_!bt2FQA(G#ze5}em-u2t@4^DCr0bn)T} zsrS45s&=`^_IN6*WHQc^9GkA2iQ92>z-+S8@m14&m7Iy1XDgcFp5QT$OCJx?J!}O<`+`HjUFk)9avdJ7_$M#_7P!8XGffY|N~&F|)?T-0Q&18XGff zY|N~&F|)?TyjqVA8XGffY|N~&F|)?T>~&yfjg6T#HfGk?m|0_E_B$}M#>UJV8#8Nc z%&f67_d77N#>UJV8#8Nc%&hsR_lDDm<+Pj&r@_2W<95(&#_F}~jb6i#OEtpHF0~K- zC`T$rbPd5joo7^|$>i|&_rLu0>%DhB|NZUDKmYh}GpdVmv@9YK3{G>*9%U2ycOi;I zWI8ad0TsQ?nvZF&e;~lYStTWvAjgB?NaR$G=<#CBzPa+C{~%RWrg^C&2p+4LYLdzb z^2|)cdA8(tp40u1?l0*6wJBxCrYG^9J{q0VlK^@Ye_x}pF@10M#4obgl9i=TE|z7I z<`T!(G((-ln=bu!mz?NE0&BN>dxj0i{oU1UWBu);$=u)x>bWYe{dJyCJ{m)BL?zsq zdC)tdi8=Sd`RUMy{zw;CE(`dQX}kT1NTI4C#(EL_#vI+}xa)^!qwry{^AjDfaoOapz0qdlDf1Sd%f#KQaIornLTCB%gu*LDJ~^WM!8x`HkQI0)-1Vmf2km z+z;zz`9EQ86w6(>)rULaeV3mrhZ^Nm`u3p@r+K~g4vtNzt%sY(DA+BO|K`a1aPVL< s!3hr^zcEL1?`wd*07h}4q~xT1zdbkpPFUfF?YQ*+6BXL*MZFFH0HmhvRR910 literal 970 zcmV;*12y~~iwFP!00000|LvE}ZrnBy$44t^KeRELL(`9!D0&X+AgL1r27=hYx^CLb zme$U$2~#3NQQkDCoO|k_hXOt1mWSvm=&eB>BQKF#NUdhQD{EPyryjb7L0kOK@W&a> zP@4dZAS(C^3<1FX4(c%;!4Px94aWl9X9WFoA=AquvHyHEf>6nVjMkqJ;=(Y4wMCmI z=%DF!(1aZ{kw+7BU?z=^nKV9T()gH3<74i1U?z=^nKV9T()gH3<6~auql3oBOd20E zX?)D2@i9jom`USfCXJ7oG(Kk1_?Y7k%%t%#lg7tP8Xq%he9Zk0%%t%#lg7tP8Xq%h z{;6*SjkSW7x(FJ~yEI`3&E{IYmb1}o_z59_Fh4gj#1n-$bGsNre7ww2JCpste|!D@ z&wIc8@!{KN@814?JAnvUVXRfO#KI&nI98ZH%4hbkGp0Gq%@E?bDESON$#{;bW^;2F zGi83ZfP<4#2%ay32!;ntv6S1#RnES-h@k%tA%aj=|a|?OmHWEBt@drQH zao>(V+VKk*LUhPdgy{Q6lT-U-2tB+0XQ@WJ%ext-7cA!~6H`@Ys-?=Ck&9ZQvhsPS z_F3>u37lTq9U7kQaJd=ixOUkHVD0wv+U-KHqL^0Un<}obC4)`YeuMR|H!gC6Cuo*Z zU&hyQK6>MvL=$_3I~Ni3j_k&Q`w;xPA47j)G#0B1e8sd^Go_+5=|y4{veYToNr)Rs z__D1NHG?o%2Vs0%8daJjgIRG6H5x%&J)#4U9OWHU{X;Gc>Kgm{)G@9Dh!5PEa`kfi zAurguz}ZB}YW2EiYnD@%uU=Vt3B-@_3I&Dq-bi$851Se>yMr3fy|A4 z4eC+{T@JtV`(L04;npg;>xuiLIxYVPtc_xI3UAfLbIuB$2M~RyPGw+Ul#j1a&xKsp zM{n=YEw%Nq<#KG6{P16vd<=UJW;2}8^x;caraRj}2;)hrr4SUfpSJgwNh9?R+|8;V z*`I-80*yg;ToT)^pRf$!Q|d5MDb&-{#cBaGyAl7YExLAaqNP>3ZyGjD!X+DmuiGq^ z)~{|_M00mZ*z`(io5euMC2HH;Bcn?kLf_81^{Fr4@afjO;d5NAB;;aYJ;ie-icMEl zt0z~x?xQXqBlesZ5In!;TE}j&yg(a=E?z<=%x;%EFQJC(X5el(+P*oO=Ih|h@~ diff --git a/src/main/resources/data/create/structures/gametest/fluids/in_world_pumping_out.nbt b/src/main/resources/data/create/structures/gametest/fluids/in_world_pumping_out.nbt index 911d2aaef60360f1a5e0427b280d31c326ad7cc9..880269d1fa2af01f33a1643cd6e887a200540348 100644 GIT binary patch literal 951 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 T2W6Y<|Fc#y?kl$vU|;|MT2YtL literal 804 zcmb2|=3oGW|7)k8&b#a&(x(1V)h{T+wKd^j8*kFdS-ehbwN#F{uDY_;wA4>%wQ#?w zv0`p~gY0?+>3I#jkLFge9}DZtp84_Q1)-DOSML9LKHFH_RQT92ohv_0S$a0UlDw_H z(cdJEQ$)?&GUM1Q@sB$v+-#k9LqGqxj>ghsj%U>qCYs$jP}b5dSz+MJul6CqsY$ZJ zLfP38j`(foOk9XSv%h{w&`3{#qURS5OG=)CBg;<(Zf!+y)Q76oUGCh800io6H#V9A zL%ZKScU*q$K;eHLt8=wJ4hD^juU#l)+r2gB`IgzjUkrAiJGXAmjpTP57l%!kto$PR z+vBTxk-pXqsi&#kS?rg3!@3vYa}g=NOZDu3C14}Wbnw240S#$(;7t&E{} zJ=}vlj%F==(bHXO`?`hqvt;!I%?%UvOQ$M@2lW2f{b$4C9nUrFQ!lprGKS9m@ci>~ zdprB;(r<5{y!yU=@B4T)oyv6gRdc#qTHpWVy0JJk&SBY)J2!4+&2^08ii>%%_WI+s z(;s9pzFa0XCvO_Vp?Q~t70s8=45^*HpxWcz-^Fj&N>z6Bns9AVv%Yz6!FOF_t(^?X z3x4gdm;c>d`MfK8Zd%OqqfHM_|DF9zx1}~;-Qwqp6wXz@Oeb!rIJdcrzcKrAPt~U0 zoKoYhyI!AJldE5?)b{#Q9^*r{cdrD_Jz4gHU$FD<(bCKXGj7@noZWfhLW|s;k}YSp zPGr4#sVpGF`@Ws}CGVAIt{rQev05l1#$)TFMVz%aczvfINWc5!f?9K~x%jsUyP< zZ@F%4d6arVjQ;#{Z-1GrU7vLG!LH7idz;>+J>R3jWM=!UZGPjbxi`LO|7Je_K*irm HfPn!32S%GG diff --git a/src/main/resources/data/create/structures/gametest/fluids/small_waterwheel.nbt b/src/main/resources/data/create/structures/gametest/fluids/small_waterwheel.nbt index ea60331a79eb9a6b728fc04a432787666571463f..14a34b6ddf8fb62e68b9f4b4fa63b74d3c52ad1e 100644 GIT binary patch literal 700 zcmb2|=3oGW|4XNx&%bOSay(vmx3{%`u<)ZZtc6e7ws^O;sph!X)gO5IYnO(vtg)8s)LH%e-zVEI|0t2b!oGAuhHf9@0|Uly zaXNy1!M%qbo%G>OUbfPpvXHan^FgnTWrF~^IU0d<+PQn zJQNOQce}Ppe%LvIZM&s=xn*kJ8m(_^3k|kO9$6E2*S>vr>!q^f$4+m2I}LQE#BuH9 zt-ZuIS1%ytZOXGrf)T1qeC~Ly;`&-Pue@~U>22NXzE1wZSsL-8>fHBpPrj}fV$721rwTdbFnMskZ;aag5CjY%# zzpdLS)q8Wtk%Av?5rvJnp5!$jIJ{mtLG6Ff#@pY%mOfawaQBZBZ#N%$R+_rPURmPY z60h|>e;f8lImT!?H*cGNBUkHnSDssmVKajoSHdHPw#pff4aSCc=}9%`j{KO@`O(sy z5y}vLT&#BN`JT7#3}A*&&-s}W^NqO+fPzpqP@CKX1RH3?VFrXj!k54AH_W&yRbnIF zJngfc+BX9og?82_9~jcz;&|0wB}AOJa-UsQdtUSXOHISt^RDr0R~)u{x8iErjd?rG z=l%o|Gat^YG|iUXVO|?^Mu)vFPF^PA?)=Bw5AE3&wuJkP-_=bqclRCmxpI=%;S{67 zAFUHse_bQo@oCNH9~W0lezWRM-t)Vk+7H-=v`W8A`}_Ln=K1mS{Pp(Dzx(Is-v`IH z8>+m273`&_B5OA9-rPk#E5kMYyfwSDFMrCC$&2AXw`A41;HCMuuYHgyt#&VqgFO literal 687 zcmb2|=3oGW|4XNx&%5j((60W?s!&KpOY6u??nfthJH1=FwDkT=)OsqFJJ&P0^zqg* z^BqrFcYGCna7ehoagXr(16Hq=Ox$?fyYq?j?EL!AXW!&K;XEMGa@IbXhvBR7r}G!= zPf7&o#Jnro5>S84z$V;k_ZH#*$4?s`S-NdY#{W*mjeb^pVlN)!VVa@Q(8(-u(4d(i zJ;?%&o@*SKDRB;tD)-AX@;vu}AswbUoevRcGOE_Z24llHFjTu=y4h{5(8qDYlW7iXrK~|9w{q1pnY-6s?_TbCexA_fa{XUfuDa(6z1ONKTUFVY_yLKO zHrZO)Yf=YU9zD9FI$_S#4(}Up&wq^0jJH0GBN`VRxsF1YX8RN8efVeg~&pUx^z-8N;u)2D@6e~RvZJ^$RlzNXS_cD?o9e}7*e z{63p=$@@QElf9=lRp^^@_?uNW&YYL9ny+m#wy~Kde7?tPe(9F0T5enn zL+#HGc{$>z>fa};$@l7Ayz)L)lPBD0b>+q@p%Z_ZZ_;i*dZ~QgnkAcdoVVO{TC@0d z$wkSQOS=v$JUsL5pJiuk_T#+VnvUIif^Ds4(ks6$?4P}`+w@ebapaE_mO#&^{8v|8 z5uH^#zr0j<{@ZK0pM!s#%nu28vF>?wy4u%zQJ%OhYj4PYShvviwo$8c<<#4)A-i@& ytSL&4E!MyNuE0Iv@SdmB{?7M$9ov!k%gxHtJ-N8vA>o(kKZb%u-p}267#IM3-%#`b diff --git a/src/main/resources/data/create/structures/gametest/fluids/smart_observer_pipes.nbt b/src/main/resources/data/create/structures/gametest/fluids/smart_observer_pipes.nbt index 7da76b1e4d5a7ea689fc8028811691be732094d3..ac739a4670363a262642a6f8eb25646b4c405922 100644 GIT binary patch literal 1174 zcmb2|=3oGW|5wBBc0F+sSyxhLHFsW|=tV~PgV}G0V?s)~5oY& zU23O)P1(Xon`Glh=T>@1IxY)WmfIX~ai^U}#j4bpwQusn(&o4s>L6)b_m8n(s!U zgZ7dTyB*r$K8>>Ot9x?y6olzq75%O)op*4a(bWejA{SJT7O)0QozU(2bf5p7khH2! z0rP2G?+P{=w3Q1qoIT~U?oky_oc3Z%amo3=$Lh>G9-garFKri}tun=CVa%FoJ)M3! zZ-3ToUeXn@V~HXE${8w=Q?5w9K6TRI@;`d-#wPfNiS39v{|wJnP_>tQq(C&TK1_KIdgU z@0DWV`}Ii{WsQ%H|9h`rx3BcW>Fxe?)qnne)}P1zlu_z|CTF|C{H^ngMK@l)Bfoa* z-$QXnMIR(aPk1LIvVFzfvaH>UzS&KPF<|BAJ6xl+gL#T;?2rCw2G_eE6_j?GpPS?o zvyQuo$N!+pBHc%}9%(ymXMeHp5;s^V&Tgb*6UD#$TG@$v(tm$`mH%d~e!uqXyKeb= z|DNSJeDhOCnSaDUe$KOXQT>eHBxCGbU+362x%2m0 z_vlaC`8q86#OFkFg~P@>WJE7d_Gdf(GwAQ;CfCk=Ec*_7q;1SI>AWr%u$*Uw_npE+ z2@y^4583--HT#7Qsy$Ee_*^i1(|sE^u3KuU+bctJ7Ubm-&x;Inf>l_-_8cj9VK`RP`F|wL-u-!&aKK^OyZsTx+_I_v8 z)(Q{TX~Hq0Ro^x&xE9YJ{qCKq|Mlr}q?S*UDmD+9omO7G_?hD`{oEsZKlkSxnfyOX eIj+7cFZambcwcElHj%6+`sWjjmi!Z9U;qHmAv4YZ literal 1171 zcmb2|=3oGW|7XMF^B=ni$R96zr1F;0DWJ3efU(nxOP*7lN@cFbF8%hez{5qldh(iG zAERD>U20nxWY45m1% zXKpb!*j22oI2Oxr;(yiCTW_5YBrEqk(0sDruH<-7>++Wj`enZ#sA(;2Up1e*E^Efa zr^3Dx%UPFQW_rBsK!vWsKGw%u9=J+K>mRyNA$aUqw}Dw)%f^qdu!yaCb&DzaF{;uy zZjfrFo?h|9oIM;6+5N1jW&vfxx1)=lDgFEO${P#b8GgK%Z#G0ee|L!CPDM`JgZuGE zVxFtjz5Dy~(e>!v`)j{H=|667_y5&T2Agw1%^volGiN$7$O;~mUid5{rCiBauvci} zhqjq7u6%ki^`BPs5C1hKsU^!ztfuPtx?i6a=f6LG=DWHjEl;F&zHN20d0KuUWnuS& zi#|)-#M)Q$-+ip(`Q&GifPszE^p>&(zZE)*4(olf>s+p+$DeYiLgkT%?wqevYB&7- zZeG9hz3jgaUw`Y@Reis`oB4*-ktwxet6giRw7<1+yCJ@#uJ3hj%=`zx_@ut~eKcL5 zaq5A=?CyxAhvtZ1EPG#IIQQv7YhO)s9Xr_rA6TZ>ib~hyb1bNzkbgJ1m~Z_;L%A$7 z!`(IWW)yGPZXO<)v%oQV%7xOuC8t|{J&;$QG(bx$}MIO*(U-hbDhieLHjzv(;Mh26)`I=u{*Z>pWP zL4doUJhP?i^2Y_AHQ9C-Gx`--U+=wWqstQ5vL&`n$U`cQqO_Mdah z#Ny9~?!QzV%(w2X-S)b*`sKb3rZNbF;8NFMJ5-Vh~RG&Jl zZN78B^(?jwY%tJTS5_8gJu#tJ)P3<&@yxsZ?R6Hj zrg}Y$c&VCo(Dc{Go^wC6xGt>?Ki~7j!hYS2n6mK9q#ZuyCv4#+bidFx^9R d-VS-=!*WG)xn#5q{>c4f+~zU&_&*^A1^~mKQN#cM diff --git a/src/main/resources/data/create/structures/gametest/fluids/steam_engine.nbt b/src/main/resources/data/create/structures/gametest/fluids/steam_engine.nbt index 4edf9e7bd5db6f09a2baf4f2a9a99aca3835199e..16b01483c6b37c2842d4de6d61fa333b05e9cfbd 100644 GIT binary patch literal 1604 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 ScvEt^L`u0MR>2=7CG|I3tP`#P diff --git a/src/main/resources/data/create/structures/gametest/fluids/waterwheel_materials.nbt b/src/main/resources/data/create/structures/gametest/fluids/waterwheel_materials.nbt index 0cbebcc7ff2dd4b4733ceb5d465785e44c4e1234..8f18e1c86d21e8f33ec3fd27ac71a1ec637bcc64 100644 GIT binary patch literal 1095 zcmb2|=3oGW|8J-J=RbB4IWYgfYT>1Ki&{lxelXqH@ve(`;ZpAj+oCn^K0U8G>(=_t ztDVQs^vq7%S@7VH_=7Wz{D&Ha)7RCo^?7iJq{;aIvp9FstsWi3m!H%FvjwbIuyK9rnIKJr+Bs^lQc`=ZD>EUm9NMy{^zCb<*2j-k@XVZ8aNy z2V6a|YL9=O5aYSCTE`a(F4)CpD%GvU6u}8f}LR55gmBYRC!!7S=76%+UZn5dgqVO8`n-yzbC0=4p zax!X}w(8B43$>@89|*~ubb9X7pxNcsr$Xc`uOEKV>%KAXqKoj}C-Iu48yTdRe_K%Q zqf*(pXN9^m!f|41#f3QNe^a*$4!_)k`4xE1RgI=4w%2iKk%Hyey#<@E=E_) zPW)Vc+^W+)%8m3{!XzFjh(xj{ov-vRkIvg_kRDkJzsa3Y?ugq%|y1Q6cdd~LiynQD^)cY6rO#0$=;L?g^mSLqf3vqoDfd-v&v^~+8lTowDNv(MKhb7Zyf`#ts zjq`ja6|grc%f8CE{5d76XJu2=={?^Bu3qNvZqKg2CO?PYZ@$jQSAmBczeQG>aVg3y zxxVUYYE9e=%Ln%7&&}K%xgxK2;VSMY|DE1yPWit6{g1uuj<@%{f4gtdUEbSzKek`D zWB9MLT%>F7j}OXfsc9PxmgJnL9G^=*Oq?Cl?~te^2VuGXydFLT=0(_gKG85jVKhA&(I literal 1093 zcmb2|=3oGW|8J-J=RbB4IWRxjx^PlicY~HUTAfK0BHQ}GtXLm}!`j;tH3F7A1tv@b;VSK$pdd*M@TYwhh?yo`HYT|^&W zO^`B`*v}?xA+f$~b85`FX@!>2$DZa$PA^`J%Kuztmt~-retO3o-N!}SdQMxecnDO5 z&?0lK04RFX2&NBcGMksaK%;VC1(wBMTTJE$G-*et+-YKfey&umAP>x&6M6`~I(G zz8Ks!h4Zl>%krGA59drg4X5QSkzeg|E=eY3&eG{zMT^b37w_bhKBL|-=T*g_qkH7J zcdou#wN&+9)!9u}UNc_56|XX!|FYteqSKiapYuug#7{r{Vb5_?L|GCh!Qmc*Q-{*hF?cU5)nX{_SLUeP8@IOJ@ zK)c;emWy7k&vLl@Q}a`z|Klwh$J2}=m25fseO9FJx>jiv+w19g)@Hr6iqg}op(f6Sl^eW(ItDq6sKu3sZ8yAryLJ(a_#{o!j+tJUHbx##4@%KE z`?`?jtl-xAU)Bz8%{NbckK6l`XUa0w)#+PU%9muE+4NhL<5@*~dxFNZm#>#{Xs|kY zto06foSEu+o}=UVS%!r|#aP2frIoj-K zxk*QU!)uqu^1bH@Kfn9yrCL<8@!09_@z?*jerV&AH_*HEF=2|wu6G4Tb{z7(=q0;r z&idZ#Qo*TZ>2f>6s&<~+xH)p#4>JHEi@(&HhtN&TkpE> zJiW&zr}IfiyR5xQZl+N4YNOvVj47u67vCI+oB5}#ug>Mygzy7$Rj=i(UvD`RGBvt1 z_4THZqw5yGU3nq8{(fXQx61xmXR}v-o3{VTv2zy%>a})PeXHA7JInd{N<)eHhabMa zvh4kol|`{kGXE`^0-wr@9-n!yhW&1MPr?eX+2$7){On06h<$PM_o_(Y`rZcp(x*MY z_~XwjF3Huck#f7B!otg+A<=j|)5*q9_)+030e`0lK(haGOT`?uBbWP?9l@d?J`0kn zew7avz8z3qk;iX7OsqEPS>VYbC3nF<|GY#+Wv=Rpmq9Dv%oj~Ke{kof@3;0$H?Z-Y zz9aP}|K!kQ^<_I=nmnCQP%|l2tJr@2+F4SnlX)KO7Ts{wo3nYP>8e$`x@7#)-NcXX z-m>EA2_?YRWP9)~6PzuV#=js2Un)ZE11*4y+q{$;-Xe8z!{pnDJ1)}Cz_ z+_gO`u=J_*zAF{49(=4%H1c6t+PrezS)aFs-!6w~w$`7RWV>0xBzV#RpPPDjeq|=| zxQlO%z4k4%w)parcWq@mraqWv{j%Rf!=Pp%)8>H2cJ=4$@B66lpVTe0?#}168zp`m zPugCz&OT)4zntG$Q>$kM|Brq;Nk3xe_JgNnVRDua*UpJQyf3Qs=)4{lMP<(u9#zJl zvYnpKSNY(uy)Ef^q0qy^SvM-@xKv0qwhKZCAtwJvPczdM{8nvNiVd4>bR?*?V7yKXGmQ9u{a%%fypQd47-B#n@HfO>@g%piFlD|wBTB>r`Ogf;< z2_YUtHK}c5|G?3I`N+2h34Y}d224Ogg=JpLfyn|DLQMSX9||BuzrqI&CJ3SO!Gj5y z52@-H&8}v&}-xm8)J~Dl2c9d;OTukdRS6fKLowD{W5lZy&3lx(%Lc`tr_;_7FGQn7NT zOWukGO}AgaZL-|Y;%|5Pl9Oi%95eaYw=!P%wsMlqoCAkBAw<&wWeyuKf$-Udmr2zv zJ;3Ce(?3B_&h0^B+`NA)3un!tLgwq}?Kw%u)$#JeHTfpE&=q&pqfQ!?6Re9&KL2aG}oq?(|;8 zsZ%w56tgqzlOD028VUAWNDR#9oR z;Of?g2bOzley$HocrP=@yLkN-5%Fe#E=yF^0;g6p4PT#S$i{5JJ zrDl1cTw7uFbs4wd#i_C7f|hg6ZP7Z-zbNO)1o><*#dh%?t)^z^2?|DBay4UD>Pd@Y_8BQ}Nu^6SA7wnADntbr0Yx1<-%FB1|Y+1K^p>Mg& zm#cgJGJLLRcsP^E$BEI;|J?n3v;FE^*)3&uPIpe;D7*7wgPO?By4>n(C%#sG`QH)q zsb^xfeD@sb?zbmoc`}?PCf_^p)AUK?;?p*A9~pg5DEEEnsJ8u-?etpS{ey#fd(!Jd zp@)UDZdA>2so-d8SAY;gEdGz4-b`8GyJ~Zg&g)#++e@DI$3}5kC%+X^U+)tfx@n8p zcsx8c9DmQt`#Q)~};Lc3x$W0$Lft+woC=h2Qam0E>Uq15W`P&L(xo4*@Lvt`Ne2h2QxDm?&W3cmDt; z9FEJ*j@LQ#*kt3+qe?a`2c7rW%lT=y=}0&v$oL zuXT-$zgfJ}=ud_YoENCNg(An0; zdDe|Jy&qu#1Pz-HjPsh8YAiL}boR|*ksCWBJbomqPffoYJ?-7YdsfpO%T`_udi6~{ zD6CldjnwgXu93^O6_)C6J<}+8_k@Vsw}-!CSBY$WDgEc!%7a1oPU_Dp3ELCaJM(** zzSW7ZOLt5TpKX5T_c2-9{er2vf;TR$Tk~4+LK?ru*6rTeoHt`$KH9vhN8|UsZTD@y znwQ5N<@tK&=f0N}TQolHxg*b2bAE>1iZ!3sUu9hX{Ln1f8QQUT&gEMB*oc@;XuntW zAY{+|3wc^!uFc~;pYTI_>DfC{x7AFa{-En+>r*EG*8d^?XLZWA IP+0~B0KoHSZ0$O(x@;KUViVJ{pJ5)vmK0`VSbLpyOh6US+{R)DZ%S+f6K{p+f( zs!o~!4XDjngi>M?0P1z1*KCULmM@S=Ji8SvNrpa4!gvh&V{015=nFQIXDk%Zgl13h z844LC6GEC=y^lHG#ZN&Y%Bn@)V0C&a{Jt)6i@Diz}%|?`I919Jx(6|;F zYS1_q%vxh&)*2JD)|i;J#>7l4n6<{ltTiTPtuZlcjfpvrhlR$(tTiTPtuZlcjft6B zFl&v8S!+zpT4Q3?8WZz|rNHbQ(Kr?wVxe&@G}NGRN|~GB#<#Kw_2(D`9f?y9YCVCA z9#7t1H-2maOFx4GfSKXWTaL^rgu6v&jTzEWSVvMrK!&r9W z0AFPO>-&O7(G82{xZS8vIdcA&? zHn=MusMEpV{NpxMTOda*)Gph-Zof0gB3j<^9kute_WUqGZ+sb<(Nd zKL6z6`8J#SCF!KL>-ztcPU(pMBAs-UihE7JH|;fQkxp7;N++!`^+ByM^+9UE3|Ssk z^=?wZtTk1=n^Z7sO;zu%V%8cHvtz;RSTH*l%*2A3STK_kW>P4%zpg;Nsa>O7a&hND z{esQZ4>ft;S*1pFNh1_UM&xMa!M*o!Mvxls+FUcm4hnx<=ewTQ&kSCLZ06inyPY8#Y`=jsRc8&V5X(a@Hgec^h;9}0020a BJRtx8 literal 1132 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 OILa$m=>nVZ@%;^U^s(Ro literal 1883 zcmY+8cQ_l08pcV?pwv}j9Z{pT#UZvDwGNe-tx>B=t=cH*)5rs_3Gh-rC!+~=F#{2q1TvYkyuF6z=;dvT}!rvalUHx3*xhP%6g^$P`n zG3hUDkcUhLk}9k8t6Ems#OjHplO+$4D!>ZXbmf#kSM@|4|9p5LyNbRu^>s$6`(&&_d9(#Cr2bF&&s94qeQ05f) zA2NkdW``Z)@9j()InKPljb`juJXFy{;@0Asu>KF|_#;sJM@F?9?|&=bn_X@{2A|;m zN4(zZ^Wj32GEJ8}4q&zTUDulkw$4gC9Vk9(k`aos`jnq3(Wf``hlct-l?aKK6ul?@ z#!S+%%G&4~Yu-~I?zV4?*_M8Vm_7ISDW_b83iiWib-Wovf*YE2dh(4b;KDTS-qHeG zeU|Hjh$mt?V^t{ip*0VL2@QFByn#29=K(y0rF`X5e~PiCo~wQ_v<5?-a8+AdeqJTI z@lAN#Nv+)o5Tk}g5PsC zoshnV$9^)OxO2JTy9P*TLuNLuZ?8mi@us5fGx=}@V!*z!u;bUBd*Fi0qUa@WxYj$1 zyV`zU8T^FK!M#9PjsBmx7wFMLlq+6|YfN%w{IT+i54faF^s-N1)C!$bX}iRE0H(3> zqQWdGMV4g9=QQBvkQC%iO4G^Qd1GGEre<@LtiM7}QaWYvlPIEf$W$|uE=kF!61PKr zRf9~GCFzRRBfBbgu-_we{_j^EGRBP5LsE)(ZFjUCh!`LUt$0$L=gVA=o<@`K<<0{H znX2D~s-CGUaR`cL@_TnHAUDkzzg~;?*jF z9*Y$21xkSy<9bVeTN;LNZ0Sw~N@`j5H!6kj#qchiljEK#IBfF>L+k@X|f^Yf^Lt^c01X zSih!M7K5KsCft!}j`c61*&94xo^AH09wxDQgCH_*gN1po5{{+#F55*|>pHxzRu#Fj zX_{^&%r&>|I57?59?y)K=FPR}AoG^<>J!Vjr_B>)0ezRoV_n3TmEB>nga(4@Hv0_? zt2j&vZJC#v__|jYTJYuJ8XvIoh%(%rDfr${% zg!Hr2Ns-86m5l;y8*YMv3!A`^=LK2u(7e<(prRO9uN^xcGu~^r#KftfHKH58xCo9P zr|H53g1nJ z0#^Z%F&uTrS-{RqbL)G6U;H*%c~uHxs$qlvm<}$gVvoLF;V9e2%TfxM{rcLCAPC~|_T zN-DVx-SD^<}yu96t z@Ei3wl^x@jnz$*yXplITuCEO9F#t|%Eb@vT>Zp1Vv89DCCes|Pd4LNBY;6AqdPSW7 diff --git a/src/main/resources/data/create/structures/gametest/items/belt_coaster.nbt b/src/main/resources/data/create/structures/gametest/items/belt_coaster.nbt index df3cb2642aea36757daca5824b4cdf0ef1fa6859..5a553460ff6d7a24a8f88c00dadbe12d208d077d 100644 GIT binary patch literal 3496 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 IuzY;~0YI*=fdBvi literal 3459 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 UwN7R0hZfLV!@k|X1@iIz2apVvIRF3v diff --git a/src/main/resources/data/create/structures/gametest/items/brass_tunnel_filtering.nbt b/src/main/resources/data/create/structures/gametest/items/brass_tunnel_filtering.nbt index c877ddd0aa2ae5c48689090ddbb76b45d01afff8..ab4c1b81a31d6f3b50c034ccd7718d87458ca5f2 100644 GIT binary patch literal 1649 zcmZ`(do&XY7++lE)k-H>Tr00wTiWyx+F~)XVz_y>F|>qvlqo{9sGAAPV;)(EP)i<( zORn8oR*B4`XRJ|oujwQ`&0AH*#O#}<&o*>gi|?YB4%~E`c~YttYQCWZ-rNvFjz0%gPfjQ=dHV8Sg5Q`(3tlN^#O)#5Gu7 zci@6X#e`vwEhN$-0d=L_l)r0+L+nYQ$;?&yuZ}}{Y4A^~{eycqOYYj34iId{U`MD2 z_MxiUUAR-0GOf162$)u9q6EflO$2%DK_^B)7p#-{N}!|Q0OPpyqVIr@>c8mi3d-6Mgtrz9nz(dlF*HP4^g!;V;D{)blEhkKxV?CzP`o#|i zHEP2D$Q(C2EvP(a*}nO6%xG^+np_+wUa+Wh$Wo>|Ih}PAM*ggzd-=-pK{uWaKG_#9 zsV&Ak#<0#vzbY|dz_jj= zXhBs=HEeLLfaLhlqjEO8yFzn)&Q!S}I+$m@c2zStH8iCJ&4o*6mPejHC0Dao4o)w1 z6BXh@Q19PKgQ|BU>shlQt7>G!CPnYL0x#1RZj5y@#4bG|EcDpWRUw-`{QiZp;N+%G z*CsuLTc&)9u|C=s1gaDrNrpVnC^~vPpq#P!@4zf{?wg>|D*_|bW!wGFc>2(gJf@fC zn_FLQmd(BWwFkPg&IAq-yTXp3l{9finNtsZ3DC3q%KHTF!C`DJku$0s(q~h>4Y+Y> z*DC%owu)~>zJWG)oaX~N&Y!@Flo^)x!Yba%u1KSr+o2TT(8(M9P4>SS&CPFU96JoL z6;cMRG3)pPRhxAAlPBB{v}oPqhWCI^g*i%(-7GUdpK{$$C*>#v?JTj_rBn}5=+Nu!YK(za$i-K5q#8z^5Yq2um4$1c*ZsK&lapuqbc+)zsq&R|tpNdz8 z&_u^EzVKRL*TUFTKXS$?U^b5NsIJja|L&^nHAw6NazNG~@h00%)-)uE2$xR(iN_*rtE$p+HqRfRqKDojgBSxzPAZHfG{U1Hy&buvNqKgkD zS6n>&Y(e))4`&BDDxBv$x&`5OA&D+lzvRGbwE+iU!vNSX`H7MD{ql&qwE;JfytFCQ1AOsi@^%od9^uPRHS@Qx7`ak=heb(QFaXbGujGYkxtI1DALPqEdNXP_z87;vki^d?QhaU}-){C$TTUp&6fF8WEM$;rO3tLUtqUSD6E%rZiLc;1X9WeNyr*(3F z70ILEqH@ck4;~ZBI>!;;j7I>@+?2iEI_Oe-s;wt)>yb)zUXRKBELb%{J}~ac}9_w6ZH6wJisM1a>XEOz^vHEC8fpq;529`wa%~z znO!V19X#f}Mwn!uOgBw+N;|ckQcpGC%4)UVTSLLJlepZ1=m9!~r!tn71GG09L9I4{QBg^coJUcQJJj z9@W}4t>%1B{(_FL05 z=st@@3(YH_=JfpBLJCAMF-D@@@<>V<*{FFo%AqG?T*va?Tj(dka-DvPVJi%X1U2No zxfyEI$Ouy3u|+?z>9YW^m$o67bj0afh=T?Y`LRx60vD}zek2)r9^Jj~0S^80k?D&iBZ^P84)MRVnE_+w2Dt?5S!%UX7 zX=|^z%`Q$omp8zX2=id{C2MyQLUlB#A%6^`U80njs1rP^u1&B~3ZssAu?L(-u7Axd z`Z4cNqv!9?{voaprw-AZDe_C}M&sqw(iv#tx=IWUpXhm$;nXa7s2zUZra#L6HUleF zpSx!yYZ^WVP7zJ(SFTT{@UBm I3jqN98|nihcK`qY diff --git a/src/main/resources/data/create/structures/gametest/items/brass_tunnel_prefer_nearest.nbt b/src/main/resources/data/create/structures/gametest/items/brass_tunnel_prefer_nearest.nbt index bdbbacd9e4e2262b3f8a723117bdd57e9314e991..c0d5bf9d65c0dfdd4812e17a9740138da7bbcfbb 100644 GIT binary patch literal 1358 zcmV-U1+n@ciwFP!00000|LvIDZrer>hKEN>vXr!Fil*qB1PD;asR09l?OI0A_QqI~ zBZ)A@6_zWXu6oXY#$mF93uxH1`Gn!&zWzA|8j@y0d!$!#&VPrdjRmP z1K|;yBK(jDWD;Lp2v(No2`jT=4D{n*niZG`Hj=McCZGqs6TxRFWQL{Ej97vYjdIRK zM@8q?C@_UkiaB;5R=?_4QOW0W(uREg5HiOrTnoD4vL74F>X2RG`IJk(cJV4h$ZoO{ zyt{{jC`>+=$z&~eQ+_mJd8sd-F(DzqB7NWrud$RJg_o=Apf}+nyW@pqd7ERGI*Pg6 zl!5rF1W_r~VIc*wr%n-1voy`|smri7>Pf0t&al?0537Ps_M4L_&iGp9-D~xe$oY7z zd_?J6R~B5ziHaj{Rl-;!=4kSEGErpP>=~64rowauO2HC|tKDk@|Iz@nBE>S3c&^Ji zAI*yb^VK9x&`zmhX5)!$SHTUK*SxI51hD&-N%kH^nehT(@J|=QGP}b-JudYBPIHX9 z(7{4xIvwc0F2ol(PcBRSV9B}=%y>x`wSPf%^CUJ`m^7Y)#&^&J4w}%S@f?^*V`C80D%L=o%LE|}SdA&h+4|a}FUUP97L1&-M)Xpkz53B3K zq1xDVs0apoX^JWReDJqkQ~qHJ@ZwkSX0IcNhf-i!Hg4Pe_q0j z%$UIjm)M-t?yeRm8Orq*%k>w^1zWk%o727F&{Xf~+HL7U_prE9Qx+GuT@_#Av~1S% z;DoCYP`v^ji&UX3vB&1}zJQWmK5xJ{sx5Xjkei;V*^jnKOQxEdD3Svf6n%Z|i()?7UfHo4QD2o4QD2n-pUQW`O3c z&Ox(ny7jj(lV;m=>u+K99GFS7ZMt1&uH8k3(H}oNPZ=raa^OL<&*z1VYwvCN$f|!@ z`)0I|V%JQu>NwA#6TU+ye1}f>hEC8r3*fsm!HQBXsC~}!lwTJ*qZ&dFvRvwoy>3eL zpkMj896-O8?M<~vU%5Qej_5m8o49XgGfjfq`V$!YLv{7vX6j^-;5!^uWLY~z1nwt;W9 z`5J6vdcoYb*@ec<&aANw1EjHya-^}1a-jorr|kppw&z#Ka;#}3S~19R-a Q92=S8e}u4es2v~x0HJ8B2LJ#7 literal 1371 zcmV-h1*G~PiwFP!00000|LvLWZre5#hL2=Pu@$@Bunz06J1J0LZQ1|~)y%t~WoRvHtt(wLZC3udJ;F)NLUS!qnnN@HSPKMxCyiCJk(%t~WoRvHttXThvA zCT68EF)NLUS!qnnz6G<=n3$Eu#H=(XW~DJP2NujqV`5es6SLBon3cxFT(Y#79gW7Z z(6|r7V!KG19~7WLyj$YOde`>CjQYpQdaiXjAh zBu}zAc!x)a??VXh`>8RfEzBQvm`x}78jZ)qAhq>gZ%X1H!6Trh>}zdd;~op!~0 zvh`R(7#(DnSYblUK?(tDf&}|XD&)pqC8b{IC-;$)L~aY?O7>JPo>#CmJ|%okMYUe|@Ioqi za$bmpWyhS&Reg@z%k&0&h^uv{E8G$6G&^(P8Ezw(B0=MmWWEp%3aU1x+1zr~ip$#f z@i~V3Uc7(N3(kW5l&o@t<4_;xBtbaBeonWE<5EU9qYT&JsiOq*vl z$<#F&Md>QUmr2;dKj!o@VMV^){57^|PMOJ9+x(Ah<9tfnxL>es;Hz!ERND+TY}2jj zJ7D$|14?5m29(BB%6T2kI!)hUrH|RSVD>GTeG6vaf;q5Y4lI}h3+BLrInXfgtVl|Q zpmLr+8{#3BEUB($t!{2jnh;l?73K1Of~c91h=M;$8RJ9jon6VL3p~LKif3iKTfS+@ zS%If()n%g)PU$7x>QvM0d-cLoUhv3#R=t94HEuI_&|Pd!AiOyW4D zPaTFaQBM-Z<_KGvdRP?d$BlOc?U8q{@D@+me2zX+!>?VLF)kL^kGR1B1BsZ@E^k+d zydHb{`GR0KBTfY;a*JtYZ{6`vH88;)BToc9li{4zC#BXPb*Dqz2Z`Jt*R$Xny61eg dS;;#39TDUs76Mph;PLZM_y-{=f~*}N003Ejo*V!G diff --git a/src/main/resources/data/create/structures/gametest/items/brass_tunnel_round_robin.nbt b/src/main/resources/data/create/structures/gametest/items/brass_tunnel_round_robin.nbt index 310e8b882a89b2e74f572f201557e2801898b526..7f340b7dfff327c7635606cac500046148303a48 100644 GIT binary patch literal 1534 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 diff --git a/src/main/resources/data/create/structures/gametest/items/brass_tunnel_single_split.nbt b/src/main/resources/data/create/structures/gametest/items/brass_tunnel_single_split.nbt index ec6eaf4e38066244c32acca40039a44207f153c9..eb31923d11a0a7fa95ca68e75b7bb42c8ce5a9f4 100644 GIT binary patch literal 1212 zcmV;t1Vj5DiwFP!00000|Gk*oZsRr(hDQh5mJ@e-1o{Gfh~1kan{ChlizHYFi*|1U zMxt#YifE8jPFKC{YxPO?35q^J)1f5FCz>MCq5%RS($AT1hC>dSF+c*tB`ugzYzzPg zBZ$xFErV}T!Kh+yt_79yDy1?n=U_fgZu63*g3i<%nhO}i_(Jd{6DnsCH8YwrAhUvV zF+%J7o(YygtVG2|FuZOrHdWkZTMtH3#o@MsZdCw@UbF`8I|}akp+%~@q&x|iI<8NotFcXQ&y<% zX;@l%A%(npI`Vifs?A#i6%72Kpy~!F9pY8>yGdrv#!Umu67+6V;WW zSUbX|2|P5RhbHpS#12j1!E7`xW}|U28;y(EXk5&p2eZ+*n2pB8Y&0%rqj52J^WmX! zF&mAG*=StMM&n|RJ(!Kg#cVV#W}|U28;y&ZcrY7{i`i&g%tqs4HX0Xm&9cQD?9l`s zn$SZNd1zvXCh%Z38W(fm!5mnaZTm(ab7*BALsVWX0%W>mEc*lBjbV7k)IAqB1V+bn zi5*Hkp4Q{yDK-i1hQQ<~%UEVUpZuolGd#@zzW(v~@6WFZ45msjDcfp1n5Kdk#Yb9H z?D_fm^9aH`>so(vW?AEk?C3AWb)YpMo5!CqDtIMQ?1#ZGsQDS6zvA;XK0hJ-pBp)h z?X2MzYg1N-r}7vNCps5QU}X&6vvQ8dxuyh8%Zxp&sMgOdcvd)Wk3whXXFuUVU}a|y z=3hvVoR)Xk!MS)$(7a-|vaRpQ1(&%#FrJGHNj4%P_K2cA1?4KbuBmxw0!v|T)=7Ot z9K+#xrIwX?Tg_%Vcr(qTjSx3n4(uL1<_Px9QQ(>*^7g~gbm})r>zqS7=XU1JdspUT zkIWm5Yl||P@PC_~cu&-^N7Te4YT^+!u|{pzxS9#^V1{-r^)~ExEcpq#{2ac^@nxB^_iR>2n82$hXqH`4F=wjTcL;o| zl_I~c6yAODGCem(0o?efk7yxl_Agu75*V%<3*Zaf-!avAm;azI;9Ag(sf#wMcfYJ| zsV|=^SXqhx6D#4ru!3vyq@c@<3efv9iC|);ph-ntpI=QCO>ZuFmviQJ=}CsimoD-3 zgl`@&R~2si_Xmcc6JZVELa@7>SF$^Ztyk^XUXZrt+_xxVk40fLea*RV%QqU=mLGdC a6AxzM!Av}ui3c;WGQ&SxsFaS<6#xJ)R8fZj literal 1209 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 literal 1564 zcmY+DdpHvc7{)P4G$gr4l#=5zm$qb%A}XQDWyt*)(%N#387G}0q)x0EGUPJ%F}GNx z$t9*m=F%oq)>)R@YFflmr|0za{qw!g^S$r){qy}a(4k`RF-TKu{{ngD=0sR-d`8^Xkb>(MrbA1Bf=bcTTZ=EZlMll0XSPwL_1Z3ER z>VKc(MH`r%>_$?QF)M>EI)@{|QM0|_* z+FX1#aOE|jH+FTp-IvPiQl?=a3Rf5;L%yB;GSsgvJVfEtoia2n>KPh^S{LNxKS4q= z)sGVMrFDX&QE{I!YOm!(xAa}wCSMx4%Mk#((R#Dcos!7Zn*O5ZT|oPExo~5o(b8SB z*d@RK*%VJ$NO$1YPs_i=7{!5|T^_u%W_9Uv7NS^J!$M9)_q)uRqOIszNZP&PH^qKp ziflo{6RhjwH4?Cax39(4#{9fnx13Yh$uT|B9Bvrl+BVOJ#}_-hbXYX?%GW&(h!JI0 z{|yKHp@7%wv%5Zzk=-k_x-b|R{fe(fLA`*5xK3U1+!)_YFXtYCv;J@2p0e#3Gnzy5303}zVNp6y zR={l1TUP^#6@`nhWFL6+ff!SE-CoXY43-!K&7ASDOfQ4N4eku=HAW6a<&RSBXkg`S z)PQ}w*^?i~v&Ky55d_$(bxHjLderg5>l*tihEJpg!tktxMKB*U#G;|JSQca2J(Vfk zCFnrxOPY&D!3l%hTGP-3EQma*v<*wJUDMGt>XYDwiw?XQE4p{dty;-&)%iC>#1VLE zpHm58I!|=m*AD*N#=F|Wkt^fzh@I1|@fa*-QxdzTm*a4E%hmgXG^8MqnWjXVAM7Pe z3SMK68G)o_hA-jY9Dc8@5;LeJ!`4os0jDxtmGj#btM0sxI&7mi4u*F%#X8KPQ&C?V ze^+7B+^&$f7A60wEwt6<2*dd3ddIka=z4J8M*YQV@_98@A6PJn&1KK~Vy$`LtjZ%c|yLT1MS63X?1CU^dK5 zCqQIg+1y9wK_A)T9u$4k(O-y|F2Kd%N_0TNav=$mLyU73LR3xMA! ze{{XoO4_AXVQh}Ov%vhsj5*rko&w}Tx{C;le)II#cb0`Jb4=E5lJ!YVj8Zn{cHphd z$az!Qc|%{$yTIDAD#OzUh&aDRFOtDvB5h&hqfYBIIvp+4%c$D!^x5!fPIN-v^Ox|* zrtyJ~li>tTn@}HD7r(6EF&kkxL*M{>r9OCocA2y)=19G8ySYp)YL@J4ku22AbS;&G zvSTC{ps8f2ONn7rjb|Mj8e@%yjEC4*Rci>~>D}$o&SzEH-FmIa29P7!EdyBzIyA}& u&Hgf2woBF1wOfabd~7ckGZKufcXcGS?WhdYwb=0A5G_ZKtdey_ME(UvJsSD| diff --git a/src/main/resources/data/create/structures/gametest/items/brass_tunnel_sync_input.nbt b/src/main/resources/data/create/structures/gametest/items/brass_tunnel_sync_input.nbt index 284d4e143faeaa380bc47b0f6ed718998f2dc4f5..6c4ebf77eaaa84ad4c5bd167362629683f1e34f1 100644 GIT binary patch literal 1699 zcmYL}dpHw{8^<|BVV&}e+&xi5WX#4Q9cQx>MrSH=pEEXFBDdpq5OSN&mRM$PttrcG zSdm1Wb3LycFC&+RfjbV!DHW-EsqUv8yMD~>#rg0phxUj;Fv0d^ zmvfrNzTFn7iz#+nOF?~*UzF2Pg-Une+A?}q$I9Ucf6`lx+Hdl4+MY~&Uwcr^86xv| zbJ?IDZb6pLqK?1+wI5kpR@JoL>=7d-9_^&lQ~#A$Hf$2|c>f*Sw(BnS_I|j_j5uf6ms<(h z4YZir#HW;Ioa`ql%BPS_zU_xsy<-t=^q0II;-;O5$i% zYJPX5>6$3VuqmFNd8~0O{8|s*v_8Vl({5&u54K`raG*yIQ3(+zX^<#0k?a8U_;@W) z-LQ4&Qx~O!QWXUph}JG)c@mLg0&@;E`pEGK9GQu4p8K)Hsih$Xbv9Nt)@Ctf{b*)2Wk#3kMF7|Jq-EgpiEncrpAJ?S z*ktSq&wqT76fpTb&~@AI^NPQyO5;D3ibhHzH>rwc#*t=!JpTMItab0JUdzsw z)C_RqeA>J7tw)K%KE0TvR;0iNbwXYLRLZ|L@^-m3X9uj?yvL$=(=W3g%D+Ak3`G$x zX6k%6nY`GLGDHiMNN~x?wX7%8b8)VgtK3@2fP41z@As>gZx)CxfGmr8;JuMDG_LUcS&-8;_c6h-QWD@f$?W4yRegquNq2~d}GB1 zVnPA^O&vfYA}+;Yn5_xnkSlp7qad?`OAqu;`u(HAqh9M|Ns8MQD;{vEu@ynkDNr1! zqE45>yE{_N&%tN*iKsX>ip~>2FyWYTo_z|#Ny&0f+!e*Ke@o)QNW}Hkk%I7b@gfum zikQ$Fnw*2;w{&RGmPT@$rtv}r_+#ys;&YSj4ZAfyR*>0zruQ1Rflpe0e}27T{r%ML zcb4m++Khyx3so=WI~GA^Re!1PbMSouGm5~7E^kEDA~2GeH%mqLsfeqtsDSFl`c|ho zPoLJZj$uRc)VWC*W|F66>V^PNj2Kxi1uz9r=lsYan4s{r2*73HT^1G;u;2DlXay{3 z>M+`I!nBL4+!4_?BUa2^OCXeLOj_LG-eTINCl@;;H(NX%(#@J!Yg!J+YDE<<#E73Q;q0 zwCSxJG8UTp6$JUD6Y}Cwi|2 zS2hD049r#$U+>bfqVCLRj6%n|;L8-S!`651yUVekp%HFpT}0hsmQ-^EHV@sbx$`-M zSfEG+o82|9L9GLSJ8RnA;L2Pf7|0S>A2D=`{8N*wmm$OelT@(eu6avpvI3irUen|{ iWC(FUMHTUtA1!Ed5B;x&fj*UO+5Ge&PQ0az%zpuj_eQV) literal 1715 zcmYL|dpz6s9>xvFr4_A9N8)ZOQ`%P|k*;;Cp?c72sj<2wii8BMTS?P!ET>{3%czo| zSdo=nG!0s5X&mhcKXTl9q#A42RXT!_ik*cz>Dt%X_pkTsd40am^T+e~IM9rA{(L*j zbxT=uD9fSt`^ras-1~X6^_H)xsDu)oVDsrMNOV zZEU;lx=JfR%p1WD_a0l1`s-~7W`@A9Ca7nXnbg`n z>mE+Pd@x$N*yL{roGUZg6weTf zgjsnU#0o=__aa>blFg8)oA9G7DiAu}I@qxGjp~iVhWvYCNPJ@X+Z%&h6pUH8GciB5 zS~!GN6c(k z zW^j3z-;y{X3=M3_Pu2MXk$c!r4-iQWd?5f%eaUah?)tJl=Va3c20|aglYr&p!329T zw;oprQe`Nzc|;wH`qpC<)=+Pfs=4JCpW^KdpZO7A@z({?d4Bl3w7q-J#V5ctSx06?!Ytd}JxiKVFosgnGFLh>xuuyRFVUc-To(k%C@}!_9J_A^kRb`@ z`N?V{?Rm>SgOT*HO=4|bWL;qdMr{n3@b&43+PaZI^F&)$O{vWBeS4FOOpxyT%8UWm z5}6CEULSi+oMFb~nJ%dLl10qQRIK(Fcmh86r@iM*n(!p%k`Z89B6EUy>tm^6r8zS} zR~Ux5WDFeo7|ReV&6vI)WBp2GP?*LSn0GGgt@ioZ+i#skwro)KBih#&UT&C%W#%E= z%!|%FxE1Gy>cIzgD-zxyi@Rge*#rMX;2^sz|L7oRvo0`M2dDOLvN$WBK1@wL@1}^p z-raJWiGD*5C6$x)R&`$0zW%1E=EDB&U3bCC=j3Ym%Rx~fJ?2}~)5O0GvkbCptkC-H z9yc3CyjWwD@a?4(!2wBWZsl=@AZN-weA~OY-8|5y&#pn{YL6KWn#8*rR-}^0dc0(! z<(Ifwtxyar;X5juZdY-F02IJ%Z5Ts}4c-2XEzc)e#MMZ7XfnLM9cNS5i7gLm&EYRr z#&iT64yhpi=Sq})AAxNGtvBqb3m8d-{3^k^Uygq4&;5tqb#H9t*{B~E$A4RFxH~i4 w5s6NH6wv4vgP0;c@r|lY=hP`S6ZJg{N2ff@jgv{mw|8{XpF24f!gX~12a2de3jhEB diff --git a/src/main/resources/data/create/structures/gametest/items/depot_display.nbt b/src/main/resources/data/create/structures/gametest/items/depot_display.nbt index f266d3e7eb5fa6be6a29bdee7bb88c75a2cfe5dc..468a7b5a951eef180fd37bcb6b52dd109e537ad5 100644 GIT binary patch literal 1528 zcmYjQYd8}M7@mlA(m@<^iDhn4lZFY?kzAgZOpLh~6)Kv$xui8ovlz;4$J|>T)1nb8 zk#Z@Q&|;a4S|+5Ki4)?e{OEhW=Y5{{`|&>S_k8aMCIJCIYrVIy4?6-^>MYsg`ha?7 zHd*PDg?a)HPyJ)T@pbu;TE>p7@(XdI5Tf(d7v&BoV%PyT*yqkxvk%-JvDff^v9p(J zR{mVkkL3nbgbrkC5EDZ1vC^_uL;2*AB~38+wk%*-UV!+^nhXQ_$)!I+ieIMQ=}B%MNT`HqfxfS zV`V+*rI%0o$JPax>(Qe~Qeyt+nrZEL!)uEF>KX;pl@o2cl8B)0a~|vU1v4pT!Hzlf zMzcs}-M)@y3>m8DI~5S^dH(%kzpQEgD`Q_@T2xyuEMh)@59h3AyVyfa@b|#WHl&ZN zxn9D3p0zkgaD1g-vCz3{xHREwuj}!%(P;GTh}SZI=cj7a;lAljaI-kt6jM#xBl2ov zWg>Zm2meE@8i+jDhyxNj&--rjK1e1ogS5%ZfSU9Ok>@Wi+j`o}Xp`&P%xz9LRJJMn zrWGWv7U7_3a%Eb;3}HVm10gxb%!c37CSq2m0C4av%l%(3T4-*ckQ_C)dZ5alk$g;V zuRN%Jk&CFHwihJ57`)Oi*TJ_90XKC<1qojwq#)mxRe;l3WTaBauczR|q~G_e%n_Ht%ykL(zKN=|~$WaIpQ-5k65@@;s2H>JSNo z>7@}P!U_r<+^ZWqD1O?|!?C)ACXt;y8uEg*Qv$26P^qgRl?`k;pwO#^N%hX4+g_5A zv!CmiE{+*9Af!QXDugtxU$DjTz456Pmb{3rXxwsjDYY0G(^eWsniRNHk%h%*e(0>R zr4K$_v^DD=PJvgcH!;xvs5mv0JYf%e>2?4CJLalC5NNZ^i!CLQ;NA2wN^ zftkGJ5>G3PbjSIl<3qnb-$h^2)@3g!pt`%B@}|GQTKW#As>At=JM6VDNcZcWmL7aV zC_Ms7m2Z`F0oy827(q^!xM~_*HBN*BYRa|pwKfi%w)+<(Ns-CpA_c@DLK=L&I#2ZF zsC&ng5%H^~S{7y$lnsxoV?K84d(rF^c&Sm0sc*0G={#}%VtPCUOv$_3i&~rfpz>@a zu%{c1QM6`kAM^44{;|lTk7cHIS6}&j{TSJ;SZ;=f-4b;y=n*#|2!;1(=%FTbH~C`= z!3?Q-&aS10NzwIPp5lrW;~QJu^_xuap}cl7ReZtw7L23d4xkt_ZJACb{!0>{F16ONGmEDQt{dmYN-m5CPb1@GEkRl;g~^LCJ9f=xha z#`N;uE|RsEPQqen?BH;66oUKVO$>4>-P{7(v`#+oMD$G6?e$JK!gYhgZEvtQ&M|2- zm4oekZQPz8dHM;zg-QyAAKxaAkRa&W&0Pf+%eQW9Q~K%xhFq$F@L&&WhscmQPx+k0 zyi0gf#@R}tu8(j0cYwCss?2RA K-x?$Y0QetFdG_}J literal 1526 zcmYk5dpr{g6vt(Yx!r7QWmz?uydT9T$>#mIc~ugwJH)&rA#AgYP#U+El()H4UUv(T zOWu#nb8eE?NFFhd)E0UmyDFc1JD>CUem>`X&hK;1AHO4$1QPicLQcj%v{BQ&?YT?R zdRYOCjiMLJv1Bpox%|!HrN4^u9;*hPch+#9vJQWkL+l~e%}dFyvXfzOjR0MN_~l8i zFh);&Q^NM(g*U`I0fR^br(%e5h(|P!!>iX>_Ewk&1c-E|@US8=?_Z*W{Kq{3Wb6Rd zmMA%M5zvx+TX1$<$IVvfaEIrm1M03jp5f7)MJXEum?3~>HZcScti$xwBLti_P)(!& zzmmmnBWP>T%??7pceiSjAE%UJ+x_v|s?#?nwzXSRFxhP_k{K+p|H2Xw)&E{muaVrM*4q@$s@qrfHzFo)w5l3oUd9%UkvYv6?U z&~xH=gKX=N5&)mxlTlx|EH%!H&Vc_Mqo19Rzh@(?J6hrzNt&)rt7;H_%BpJE(2Us} zV}CjF5SxC#kgR{@337*D-A&{}!kAc2%G%?>%KrI0`k z4oolid(wib{W}xH%?p-qiB_lbg~6zeUGk!?ZYYZB*NkPGVlLv*7~cuM{%Rs9HUY!` zq>g}tjreDPV6*RtzeP2<`qn3#=9Uxt1csX+D-1xdjUP&VbfQo3qiuJ1_}epfyA7*1 zL^notilqN^7Ett4W&xiqamSZEGbQw~S|)ai0uQC3Q13!ITBl2wQ1VXaA%0OHA(Tg7 zvl^Y&lo@T0aJx$iSe1)uj$%E4&@z-P0g*n;ZhQY?=gW@g_Eq}gixVLxivA#*EVlL) z6cB7!FJb0eBSmP8Yxl2_n$|#qo2O-oSRjoyA%J4_W7{qGKoDJ|8FrW`3IzMT*44Wi zVcYFDHkwmPkx8#u(5Ho=`WLP&NRRk*I>}rTx~A?Y^NvUzBwKqXc%OPP>%f;VxaymB z+DZ1xNM8zhD$Z- zLIqxj@i#Tnl3HCy}do#u{@Ex`y4Pxi!%(Mv7SUg+e)wQ@MlthYrdUq-> zfAl! zEj!`>`eG;DQM}peVlOdMW(!5qVu0NlwMtjFA75^>XrasN5*5pAF*BLeNuxaW27bu1 zrAP9Qo^%LqIxRccYkxr1to!^v`W7?`ZQi%jztHq$ChH;nB z@FN+BD)SP{?!3U(!Qmx_pD!|paH8=f@Yt|dCT>=x)K(=1l!(Z`f{5$Y diff --git a/src/main/resources/data/create/structures/gametest/items/smart_observer_belt_and_funnel.nbt b/src/main/resources/data/create/structures/gametest/items/smart_observer_belt_and_funnel.nbt index 48a5e98d7f56cc110de54e3214fbe8707855ab25..d03ee915bf22d481214790183bbb9df11e6ada3f 100644 GIT binary patch literal 1663 zcmZ{eeLNEg9LD7(FLPTjlNcsWIYw`cA(CD+ujLHUA=#9bW?m+v7cZ5KM>N3_WTewSw$=#?h}lu;6U zaLy5YMEm8f)0m?z?VoU_VuZ{FW~VpFJlO_(iUbducFjas6Lov*8S=v6wfte6NJ`K; z9M^-MIbd+((B#2Zmoea|w;?)?dr8o*doz(ia1#stq)Dd0l7(6f3~{}!o|7|tnAEOr zi;uM-AIZ)S+!U(e@?J!HGb?ACo*_PYBNXLY`N*0OmzNjrgB{_xT&$Q z+tGOhAB1>yY-_HN0e8TuBGglJBJOVGC}GbA(JVi9vK*O{78qD~Ga|n3t*&7vYa&g~ zAZ2Z5Afq>6G2OTm8;~7DT{PNO&DSq;ZJ6C`nO*9N!c_Nbv?!@@;~P_qGh>w4-YbsG z!5Xp|XxDq|UN=1|zCky4S@+|r`(w95_$ivMWr1K6Jz(`jj%;LXq2ZPxJ-wQjzi@g~`%OW?f)Deu z3OfN)i?qHhN$trEANXaM2;07X=i>bybV*SaA*o#@f~VGurkRv40rH1s=%=vKwk)3& ze*lDDKGt>pN4a}w06jhf=)9e5VDXNV0E6>~;z@lD8Y6ieI|#&D`^5bUqmc7zW>E^M z9`+-s7XsrD%|te{Nzoh(6}S`K9cJyndG?nm@f=LhOaYxYwEa1MF)w-e4>3o4prDz; zFX9`8{KNkumcL{fvj4^U3~np?T(s?F>EB>q2_6qWzrJ7p+VR!?TjHEwSP_f zGluS4Ydf_?a+uO3K=#xZuuUg1p~?;d*i>rpUTauf{P+kCX*Rzlm4q|ll%m?7pU&fq zd*0Ab($+ptsatW_uT2;m!4E&@MgJGA2C$w*ujnhiJH1Axd_D1_u$H47EN8deB2Hh7_JD^R?EfK8+ z33;8Giu!6Z^Os?`NgJq+qcPN{fq1#6ynK1yz;pd*_q%9rhM%|eLe%K~2T{k#VNdjf z#tSs8z4*QL-?Alg%)L?K+*xGZQx$TV)0qxaGA`8GD*28FvuoR3;hFU1%HDT$vYg~{ zq}Niqk}oPvtbQk`hKN52yOHmukp3KHLG)iFtjt2Xr1I6gCz!m)gF}u7saJ|8Q2Qb# z8%F$Uh1`}%m7%p+w#ff=+L^MWbl}@>>onDYsu|R;yM|tb_*M6d8|1yS995atz8C{$cqd*`6ZAOGz zjIkcph^nu@v2nLai9K`ysj(ccRdF`CbGjDA021ZL zMKplB?F=3lKfJO!+0qClG!k`fV^<}1ZYQHzXs@xrP1(X_MA($X32)N&8`n@|WLMWa z3K1V^WCj`Xf~T*BQEp6t`(MI#0LfxdF}l0C#``{tSMtyVp?G#*1G5j$FJKqBPTO_M Lb603PWMqB^dK5SZ literal 1661 zcmZ{edpOez9L7=3CPqZAxeGfS)UsTY6_SpXX`^B;L$*djp|;$nMWm7tHYH@ORxU*? zRFZ8jwcKU3qTGr##*aGHd3t)zdCvL%_rBlf{k*SUCRpmnedQJGj2U!WO#vALn0jRz^*sO!gW(A}*xu7CL7h4_0mUhcnG-@rLO--;~C z(7S)ZeiAD7etT7Z`PuQ){#IC;_D=Yss?e7@x`tnnMWf3aB8?`FzK!A_s`*6H0 zg3lN~<7+c$kw6L;vgBbe)wDoD|6H_5e*T?p=Xuqw{tPYMgBf-pgn{GQUdEdw!V6y+ z*gW9KAFt6~Cn^cpbC-Y>UvBOU;SCULESs|xWat9I6cr3C_N{yoEY9v)Qx#y(VDU1B z#NrRc$!6!1H+5UtJZR(U!V~dxqrxP`>U9w&Wp6VgNv?mD7)xxLpzom zo51XjxOcma`F&@v>t&Wp>Z9{q^T_G!OdsctB4RM+ha_RD(V%z5X zYf~TRKk1pry~UF)<}QG!w|w78&X~F1py^D=er}hF>07)wCa1K8^m$-NO2!{(+Jr0- zVU6`WwycT8n>Qq<4dtg54O@+H(g6T}Ww;Mwbi<7~htuf&P3LlR6@o0KZed$rkUN>B z3cu-wWAUsKYRWeq%`won)5sP`qq77v6Ba3+g-lU@e-Y?jY*80^BYB1#*22A`{#cCgkMr11D`BPtqFm z@a`L337g5QJ$UWucor(E*eB3$#z{ZVms4mNmpPtZU-@htp$oo|E*-5s8kC{*IM#Rb z9>>!S#96a+cPnlU9XVRR12U?>gN5`Qpj6m~DMv6DUB`0xiPnd?2)|DrkFwNEkzN|x zxgTcqRkl+oq^qz05SVhXUb1$T3t+-2my?Yyo)PVf*6Z4A6%N^Cc2eJh<27pv475)j zUiw@Jk9-~!Z-%&)TT*K@vhky9RoKT#Y8zNxf;*Q=^Lkb0Fq78?6j6$?sX_!3RxQI( z5cZ+jv?GmyZ2N=7-H}N$rYL=2c>~jHG#S=85>mBA&c!v3COG?yFWg6FD z6WHue&WC)GT2lRPal&}A$J9)Z^tW*z>|G>BCcB1zwYzc_?O&Vx=ou)b5Sr5`jTg!dFI)f$rK=gNy&30!YKg6F$C{;f$%uh$O$i& znj5o7xe;;=Q<%=RDp8X_6GOD(Y5liXl`+Kll~87wLAc_%L2yhD3n4Mpd_@Dy5plgnYMg3acAQGu1EPgm8q__G92>h2f3yoX1=qA_g!yoG#fg7HZG=5fIRBYI zV8nOyZ40?OvUix+zK|s93{YPQM7Kw5>SlYEfL|)(0``}0-6ETF7tx1dBQV|wj6VVs z3}Dy@%?>l9*JIs(~hZ)lBjnM2cLz*3CNVCHXX?B?Vd}bs3VI%zUIvCc2@jDo= z2NQJk_;#XvxugWbH-tsg@G*EIySp+D!h-%P*p6)qLCx0ioVPq&Xa?bHRY|gQ2En|t zGY|FGC$AKdDlUb-&eitH?p!WYY{eWcncGOSX(DHJrnxe9UX^_Q_Sf%2ongO|tf9Z|ef3WIhlh0rrhX?dOZg#J1Y_Ii Sp9U;!KK}q>-|aO22mk;jt2>4O literal 628 zcmV-)0*n10iwFP!00000|Fu=oj*~zXy}&?eyGEliCVq+!>gr|_6QfOBeQl=nwj~ZT zWaeUZpZpVl$i!cAC=65<5FaGrf%e>U&pC51ECA-fOnQp}0JuA{cQ}U_C8d<2f%2L| zv=J)#Y!>$6=^TPw8CTF;0fdG)VO`OO@g`vW37B94hK*pn37Q>dOtZs`X?B<~%?>lB z*`J`4`HHT*6};* zEKK=L@GRvAp$Mjq(c}dS?=09HW;qu~gk|SA2KJ6;2#;#Z8_kVbC)}iRZK3;U?zk`rj_E!pJX&0D=5R)c`SV6$0 za#Odn=EjljkPWmGCyq$_8hjWId>JmoY2v=Dsg-UZF(OS-v!DO@*^gt}2dG0eLKI7h zeE_J{z5*{ziawU(aqFjuGR6ix+11!N!5T)bbjXXGDp~Ru=u&%)TBj)8r z1&fyyZ6u1|lnn+8JFep7X@tS0xG%@yt3wjvfTOr@(A1Do^;7jhpehb-oSTA;jr z)WviJ@Acrpf?cE|MtCP+v3g1*9*UXaw&uSMYc%6@uPe_9Rg#%fbFz{m!Y%N2(^yM2 zUCFSWVfsJ?Jk1&`+T0wdwqqWuu~clu0{2bSX4bTrT`cDOYhw0TuJk;)P}fbHCr)v% z^*pJAx0kjV9lzA59a1K(Oz&R)Miln2P{H{*Y*M2fcV>GteP+|FtywQ)?~XeYsm=Tn z>}a@}!RtB95uu41rdit6w7;D7$`aPMma)EF&N`#!PB>GQbBinI6jaXrU&p|k-C$ xt?kz1N3F9OG+(2{@bA>9@I*g$s?Kjs_LZHs%uZWZbFwF2`fn&u%_ScX004{epcw!F literal 812 zcmV+{1JnE;iwFP!00000|J|2OZ__Xs$Dh3QCEXZkjA!p3(=IR#Atp@>v4Vh0 z2=vesbOS=h9!h{|)J{<6bL=qPx${4ExV^?6D3XE%D ztP0MWF*$3-CN~ zle1<_&YCefYi8Qn2PY1t4@(`y`&b_IdIC!athc$j^)9!w-e+fMfp;*BG0$Q)&d$GF zY(4(|`TYL3AN1!#3s#>au_Gmlj&OIE4U$wU(g8n@-Y4MD_VAj+NyYi9MV z@vLjl2vw4~((*tVMjZ9zHX_^tZ#RpzRLoM2?F_ODD&R>zV11631NBbIW3`rwty$o{ zPCCq*BQ{ww`(F^VwOpy#AN%A&9XGH~?2}a^2!)pc15uro1Ow+WhX@4>6 zr3I{SEn!qZflNbOvNhQ=PW3A}ZJM1nt2^2HNuP3RLOnqgONmF_-2nFm8sO5BD}VnbXR55( zzmbL-$cC8XE_gjeh1yDLJrre}7c(x8U^Z)V1Dc!VN}f(cxfltlzRJ`c(c$Rs3aA+C+h}!vbYj44$6Z--V zN`J`n*dtUXyghbW)x{(1E=x3me((SP_gwmX;|3AGEWHUF#tbu51Zp3s9=aT(sJ>^8 z_PVb+&v&f|o8V{`y2;Iz^%ctu4UR{u;!+2X?$zk#Dn2^BWM#oZ&oB$&J!^h%yg2E3 zMpNq)Ekll?W;cGpm2AQ@X4K~%ia6bN&HA%?b#deUfUmy(=4_FiJEJ65i@iCpdQ#W5 zV_o~Ma|lOIIH35trgzq_Yu1O7w+TPWYGt|D#=SAVFHf>KQZUS9a&d1~!=HCdZw~42 zDu^v|-CT25fT{U%w%;Fat=JP>5B{WcP1LJXF#fwaKj+?wx?m5VbBEFxelIbY$vw0F z>bA@J!3kTh=w*C2*!&`;s7%m#Rzi!K%)&%vlZo!aJqcw}@|!RJm@)U*@i!)R&k9%& zoV4X14d4GVbb6eOP$SceqJjVI^99d^dA?{%Y&@4-b7-D_#xkMR&!#y2>D!Rg?#7h3 zafiJe|DhWNqK?m}9elD(AWd((-}!HT+L~gU-@0%q)M?M|VtQO~ZPj|O-_0K@?;ew# zy@bavPdc}X-VDsus QDMvlS(tT|u2e}v+06YjafB*mh literal 638 zcmV-^0)hP>iwFP!00000|J|11iqk+4$0yCEZPF9rRPG6UiTfa)9tVPG!PBp0n@-x` zCL4Aq7JV6C=)hNUx9O%OCVRn8VjzUJ|M|~vc4jwC0AgS||A8R@*gG;ev(FgjSW-?o zYOq%f)3uQ4SDly-FJlNRsa;Teg%D}tgvW?JO)x?;8KDVBXqZP6j9_*eAG6c=n4QMQ z>@+^+$p~hr@i9A%kJ)K_%ueHDZu>Dp<70LjAG6c=n4QMQ%tkOfjgQ%Be9TVcV|JRy z<~iv21U>x1rWWJbxDDVx@golh5f?#yl&#IQiaC&I+Z1vQ*9;J8r3&c zAGTE}Q2c0ZEg~mDKgjHGmZSf;-q2I8n`Zlp4~*p}A?Y~Pmz`OZ3Qq-%-sa)J;Cm83vI$1-xj$3K zFsrygBD86zb6_8Mf$;3O&}+rDUZq^;<8*_W#fvLXi_h85bJC#a*2k6mB%h z5?6v3RX3Jp+_XB%gp_7ZW|iEd(E}q@;~b{uSDP@>vZh^YepaABvz5E1i@iZsLT
    Gv7+x4!qgTdu+O?#yN-2BIAl8|uC_?P_S|fPb~y$Pp+Wn@0<_^h<8E5E YxaGvZpwecx0Tw^uH|MQG5y1)o0IVHBkN^Mx diff --git a/src/main/resources/data/create/structures/gametest/items/smart_observer_storage.nbt b/src/main/resources/data/create/structures/gametest/items/smart_observer_storage.nbt index bd344d8dabf22ff7f64d7b57c7673f388216a1ce..70336198ba96fb601d346b059d310e1726e73738 100644 GIT binary patch literal 539 zcmV+$0_6Q4iwFP!00000|DBX!Z<{a>h7T|lXsbzEtNoXLTDPjwzHE`&?Q7(aOR#2a zWFL#Rf3SZ&6L6AJ!q6-sBzW(==g#)!02y4=Tp|(X0Fb1>zVHg+U15+D-mMI`c3E&M z)E08c7e?1;NT5w2l7b-KaA^^I-1|x>EDYb!ox!ywt#B!MRS#p?h8GBI$E8dif!?8$ z10&O53W@vK=8LUvs62STIeJU{iDu||xpTxu>h0E9bzCQ2N*gMj75%CalC~a+W7b89 zmWI{`!gIC>akEA0Dmr$f?_!}9p`xW;Su`W$FB@>4IALgDogVf~|Z3bvp2FXh5;)iWF`Zj~8*476cR^*yaE@vMxrU_ufAu*S_yi-GaKIC~ zQy!@mWe|TRthz&(LMYa+uiHsjG@d=^-Ev4Cg>?74bGkk{abW_8Kj}tM;6krD*?rZ1 za0VZ`fOA(ef{W+IsIQyNzW2bs)z3OO1!Lo2;Q@@bWlm$oz!r@g5N^#ZB!=6Mnn+jo z!aPd7dk~IC71$l3GewRJj(uiZo)#CwRZG0k)(wevmb^Td@%R=8gKcf6N#HD>q^5p* dZ;rKWwOlXvW9L}Xf1QE;{TKR-9BZ-$004TX0L=gZ literal 541 zcmV+&0^=UW2L}Wjg-E{%pfV;eb7X@dKBha>f@7eja7-= z5{-m>a|&rIZfIQ|8p5`-JzR!M;nowcv~`z+RwG9r4-O(79IL-gB4_zkYC0Y7yFSZa z%k8?ocKS%OcOdy^2MV~UxkMuLZL=KMXI>$^J>}gPZtc3{R;azhT&#?)(fAuMheQg3 zbjPJd2zB>8gTbvOt#B=QRS#>~j=PDoBbPFF1p0_h4vb8LIb`ln-!HYgp~KnxBA-OJ zU_;O4(GeS|_j_m6ab0*RZRp^v=vR%9`8*P@S$CrwSf2^UY%}6!kJKgVr!n$sjM}#Y fIG0~pI(K5rCr9!&zgH*ml4aY=`G}b;KCI9{6sD`3{U_6I(D+yy9-`s8 z8~Y*TQb*_Qi*vG&eM72+Yq!}CGZY-MgDqJp(OJ2~*_wBo5B43-e5@$T&&t_=C-XGC zy8ySYgvhR3pE_DG?Pz=cpoyDb9#LC8+~eR=EBG^a?YOt)wO4FS1>V+0(Q5dXg>qSs zTK7o9TJ=#_MMr>D*70^Q6zOi5L8-#rC=uR71YeuX4`AAe>|rFWfg~O;~-$;Q>EeB%O()$B&MU2i<-gX zNTv)Yo1qg^oPyeAG3C$c7_IqQ)1$c`ag&1}l&Pb0bNC`n?R=74|##TO#mhZOJiAP?4E6_2JlLoU4x@4R&64=%5} zinOt~s`Q-e6Y!F;?(}@a!aN?$rYx){#z3pT@eGMo?bJmhV6Zg!!6-5HU2J7$we7~U zj*Pp@;(Rs-vm4n)h7X9=?YL4OH^lF;4u@tO>k)N_!}4P$?v*sSulwZ=mu z<+&ESXz}ftXn&CmaMU{JhYJbESEuF1zB{$#hJ>R<)n< zlN8lLihAoFtE@d*8XR5c{Cme9$apGx`x=F_BTP>wHqI(7+@{kG;1_zLV8K?Q|Lr=} zv}Q4=UZ@}5M>;C1QFpC|0h$kj;N+G7x?Lb0m4j&vLtcZCPxo4T^m6@RSy$dbx+yQN9X0VR>x->~~K#+~yiRUCQ3+jja< z5+iEKueYnl^>o~q5s7batJ~N416z;OIl6%fWnx^fO>rzzT;k+2mi8Kcz3pNUASP%A zkJrA*A^-5zw>0pkEF#c4La)3Y?4j({k59Tgt7a=k8i%zejh?rayM9n5v#Q8_At!>Y zD&chIWK%t+n)sp-JEa{;85P;`vs){iSwBA(2IA^#yedlGzUMghH6F@4xrQl>So-{6 zPV~0@A=aLovW-Y=f0$aNl?G`rpp^X_=2!2;T0q$+;vH?((PqWaIl!OBU-ef8VBh%= zCk&3K`sdhF^?x91M5-?4b}kTFTpI0rKv&CsXP50q6w8E}tCbmJDcwLmO70rg`i}Hj zOLkmuYBr}Q@`)!MWAm(Aq`qf?1@mlX-l)fAhq>C{Y7v zHDO!+k}Z4I2#)4@ti#=i@mP(4JqcSN_JtjzEwMJuxr;p DG{K4; literal 1789 zcmYk3dpHvcAIGuh%v)$h9Cs!0$lNA7N4e!ya?r5l?vTs7jOCnAY$m;Xx87_nH4(XU z%q4}+3~iX#bz6ohOhYo4d2`KWE_uB<&r`qW^Zfq!J>Sb8KONHFq`uDno7{z4V^CG1 z;X<%h6m_;tD1jc0wSQJ)U#n}JQ8Kd8U1WUWgf0nqdA2`@N%^FEN1FL6t!jO=9*moA zz_=%~gu5A-mh1s<-`r zf8Z4lY?AzmNgw1e+aF*#9lv0P;<)rn+@lbFk&VvtIeGwXhJr zR_CY6NuF0TgSPtsZN2a?zOTb#wV;meW$xMWoReVQ zjjFsb^Vc5t_Ee(V^Pub1OK)eR#cMg+ zyMZ|EDj9}F%SpJGVmhkBgYR2W&?L;jJ6D>h*`|l8{AbwI?j-U^+3sAF-_TlGxy!~p zpK9lQTAqD;CgAo!iN977mB1qElsh{S?Y0Vu`?d3PzB);C0xL_?%xC5r9kRKZDJeFI z>5=AWs)A#JYq`Q(;o}qV8K-9MY1yxb`z*+2^OGhzm8-J=d7xR#Jvhh$IgE)KuFxj@ zi(|IcbaMDH`7Eo0z$7~4?nb7>`+GC!z|5p_Ti=BrvkJ}u;Qy~p7^&f6vFu%qz?lrd zS7%#rj+2o6UI3q&5P#Q_xV!|RZ)93YLULpcMwK~3oN07Xb9PhFy(Q1M5EAk)4wr>S{ zD!^(c(*3otPVk8+z^h!jYf)M)9JqG9kwO~%CnrPxS5r}lVGtPkDrA#i{pRyel%7$5UYWD$qO4Ux^uwGP#RW&HjJ!4NJP40bt-X@w_h-pqQuYKPv05Z zQ4o8`m16VXRqkkMKwFD9wlmiiP@4)U&;>7SzdIJk1_EiaK-z<=pHNiXvtS@-8r_rkN!E2$qY18)LN4`b{?W)zTU`S z=@ebWjvOB@A`CFq#8W93pw~-?f(4Eqq{0SLf$Ogm$STl4{!dY#m?~E`w@b%HNs_f5 zPYP7@cPVLpxf%0}+r$QvA{I zjY-VS6Aq-+hIv-`W!?A&;hxmws$i#f5a%#!O`=O~ylE|=7~=F1;4$MXUFOO|BA-{$No_4Mq&!w0`*0tY2e(}4!8JN5o#%D)-&(3C z`tFRK()*yndfTYnDtP`>Egv$~=h;ViiJ2XCMLTyq3h7Ops*EPJyeG@Wv6D@VLLb)~ zHSjCF&ox@)&Qxh2FA?;hoGG{LKAO5~kaBj_9X-aRZUWE3nZFLNqT?^ZZmM8?ppxB3 z0d*_lO;_?~MuK9u;Z6uK6=c}u*<+gT5ZyH5*q^w9h-}in*&nkeS0yjQDl3BbR-Ne_ zGLIAP54;O7dfp|Hd}y^U`8R9wgnd+?@1K3Cd8Q%)s-%Ve3n>otI{E?a*Y}wzF%4?A z7)piB;$Aae$d8MZ5`}EbtPd9)4>WSEK<_XV*RDzGgiwFP!00000|BaNvZrd;nhAGKTYi~!c_TH3fCT`g86@|zMtEO3lmV|- zPI|vArB`MH1r(3YHt2#vpMlUSKw3%d5r()AwK7;bS%qtdYagt^rIvNG7hE0$Qn_Qx zi#9@?wwn#Ed+Q8ll`K1aYOD*}XcS%=gjtu8K9JuYjLR+haBQ6`vsR@H)&cu`FiqM{ zyHCF_J0@QKY?Q{OZ&fI_AmHLw2KfV>SJnVr{>~xs>KBUGweCs!x5yzw6I2IFDOW{(j6sG}aG6`y(LrA%gpeF%2VV_=JWLSc7JY#Rx1;U~vMA6Ig=45(JhYuwbbF zm4=_tFoK3pXxJ#L0AW@khx9IBy&JF$xLW@|{;$HsxHCIJoXUz%WL3cIyV7xg8KgJ% z$pp4b?P%p0WOwE{u4P`%5d;^r72z7~37W@UOnI7U}2LJ$N`r>T> literal 504 zcmVK*7rrnLqO_D5*{jsG%P~HCp0XA)oZ3$EP}-&SUiHoBUmDWB_dcN zf(8BiztZp#4U5q52@M-$6(G!-a!Bt9>-~Ubz|{uc)yiP$WJNdS4n2*yz3xhkXr{X2 z6I~TB`>r&hW02n3Cqr!C+S^lWQn^r`-J550gqz^VI(JmO#OM@`$TGA)-fBVas ub*{`tm6B`-_~(;p(stTo`y(+9i?_IwB!8mw${K*hANU6j@^JTK2LJ$9i}8y9 diff --git a/src/main/resources/data/create/structures/gametest/items/vault_comparator_output.nbt b/src/main/resources/data/create/structures/gametest/items/vault_comparator_output.nbt index 51b8830d66a268d3cdba5d7e94031d4925b1381f..73b54a469b402309b18b5983cd74e60ebd43ad62 100644 GIT binary patch literal 1906 zcma)6dsLEV9Jb>Wn`k>nU6_*9mYHiox$;IjbZHka5U8b@unKQ@$qSA&TrzPB%gRy< z6U{`@NSq2PC75Z=`@EE*;-rx#f)`S9r0&yBXP%w4?fc{RzVGwUDh&-Z>m3%Z`x z%Cppab0~5UYnhE`cyc!wO{=g9vec(qNcJ7GBxUV?(imCU+S=n`ar#v=p|R`bNuwq-k86pz zBpu93`zE+$5Zuml7bcU(PvgA}neOuH5Ia}YDLLN}8GW^#W7^i0>2vLRF@)2FVf4?> zv1m_zC1TLgVXAKvrHOv=f#w@bUYW@hxmnNKrE%req`F(=TBi#NJX!21J9CrZxxRjA zTT4aJz8%lpd1q6b1hdad%WsG)w$KTUFE8qgdSK#dhl507QiUoW`;9j-3)cNOMpYJ zsegjsRZA#J=m(kh(f`6Ug#K-x)!U~Tu2!%*0|*;kw9W$=w2ID8n?r`ruQku7SfeYNwmGH}54sg4NFK+Bx`8LE@*gIppB^UpMZuCyJ= zXzikxgi)cxgXHR+zH%w9=D_XhvsC25{+m0MP9u3$H=-v=hAF4Vy?Ua}TvU$+9J%ygWVQ2eBO+9z30W`}P9B>3q zJXp{DP6tf)6LA~YVEA^n>gjr)l2WR=fBbuVsZHEbD4ZBC;`Xj-@CAVb-Yur|!TLhc z@|_%Q%ie~dqBj?QAiiMa@dM}W=vUwN5j3G2I$DCbW-(#3;TEJJt zXV6}~`V*y@29@?RR|ONJ3JVJ&3~^7$XC+25AxhE`c|&83EX|7D(9vzh-szlF5g;}m z8VR($5PR4tK_Ha7AtOVjk?MpYAnS>B?JkAhoCRxSAF05obTFlUBY3wlc0HJ9 zcB=QbBjPD4H((`|@>i+^se8#_H=KAmqHI*e4crUiwdi&`apXurfgQi{K1e}J8SJXv zSZVfg$zeHGpkt`ebt{T584__x+6`iZ^yZ-+*DoP+D1Ep6A%*K4%6IHwAV}#W&kPOlaFXa99Wnun@qP!Mc^yhax~(=?g4nGKS>wX6mc* zez)mNXBLz4W?HgM`0&jb9k!&I2wm?|L$^P^MA6s$DsgomWd*E=g3=( ze0dn;XcxMGWTxpKLziudLjksQBFVb{4eI@{T>qi?{ynQ(Wm%%qT`#6?&R~{Z>{%tj z^>nlRqu}GA7>+H3C&BfdrQ*-&&}K~_vpEHT`x&NywJX!r&9+L21tcyM0bfP|yB-V= qOTG)#Y7PTO5C>Uz;CdF10P5$m0q*}QRn-QooIQP|at|*ptv>-?D!$_Y literal 1908 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 literal 970 zcmV;*12y~~iwFP!00000|BaTvj~hi4$KUJ^WA7!o2oa$mKmiF9Bt%kBU6ZrVx*t+< zoH&An6v>Re@7AN6-LYoJJ~=c9QS#$YfC^Djg_PL z&F=U8_`LUKJqbVuqEbA>5CH5iUff$9Xk%f75m+X)W(kDF&?FG|G#5nz?HqHZ>8;hT z?@qPp%|8-3mWJmOGJpg++e&BH=Y})5zNL{H+($D;Ee!U>OcYs9m~x##vWt8+?5AF$ z-mg7$ptDP9?HSCgp$zP!kg%(`r?+a==H1V$`{{!lP}eE4qy6NG9cl}=w2x}|*GAR+ zZxn8?4AN?|42IPPfq2Vy#%@T%vk+Q+p7RXduvibTo|W&+iNq`;FO3{rzmS665Y&U? z3)Z$=MEj*PeSKB-W0W}>e{=?G`^pagfg~SPsG)DuOuZ4V{wO)9YaS_PF2{iyDf zMcp@}+Si?b7x(|bwX0RxSGB%bTR2C{D}D*9ICNm(%#ToW{rHG(Ik; z@o_~BxSYnv~ znX>P|s`oJ~Wu5s1j@zXxE!6nIEV+;8g}HIEknznWJ9DM1jgQUo_5D)4YumHusi~Kb z?OQK@DfDMWu=%xT=BKxu>#An{{MbtS%_gt+v%dH9M<(aXoi?(M`TMe>bn{xX%IBYU zKYn_<#=6Gv{I$dWe^Nf*S)2EwD01o1+UFPTW%R?#zJ9v(^JCPk(6qF)&#Ug-SamYT z*7Wi2lAHVfoM6@L`~S}J%DeDyXYcJeZvO4+)2g2d*ZFiVFVf%^p0)Y(7SI1%Lg((Z zKl{_Zv-8!PeCb{03-|io(Jk7pVi+8461kh@@;{Zdn%UD&uP^;w_ILJ-g5YZv7appc z6yDu(`iA|Y^F1~`4-%dDg)3*=INW1<=Ez~6PRUA>mPFpf2xp0F0&S*9OdcDlLmS!* z)+q91a~wuy%6(hij#WnwE*;0@uvq}K>o_in@?0z4<;-bM5}Ejgt7e=yd_*qoO`@7y zn%9{Vi!mGoc4p#(i>U60du46p;lsZlLVWlv_3%v2?%Qc;$L4R^v+?SQBjQiDWw-?k zr>uS#X=sxF?alPk?lbQsqs$BJY<~KC{!e=JoOMU@^Ft?da~I`I-5vbvN!H~Z&dIh$ z>D}vZKJyNH@Ap*s^E>|CCoeDEd#>oWV7goRrJ8-ey?1WfZLVP!T)uAa`kdJJ_gl<= zyPl8Un)Tl6&gzr%?`*ESA!~Yj_pPrnw|1AzHm_gWFMj{F^||LOt!3xiO^?32=M>j< zMZHi+`f8refNbucXhvWp8qoccj0NP`}(hU-OFpkUGIO4S-QPeA>jtQ(x)E|2R87t@cf2SL5+#=S_W^tS;5I7xxdX|Ij=kOvn`1R z34YRTAchH$aSX&Lmp?SeYz~jawSqUmSa|C!v5i0RhFweIZ)6T{Z>8OXY6;U7Y>O0o zq(Yc43b^sEYRuqR%y!kmLdnISFlp8QXf#^dkZn~Ma1a9sH8ki=1)!-Y@nzY$@hxgrF zc6&qqwwGpaX6NqW{f#6P2u_SZz26jjX60V718Kh1ZjiMtke9a(=<3@oKv&PobppEj ztl2`aaRCrl!z=+w09`#RHw5fzAPsc&?G->*1I+-tO77d5c95GYc2t68+TR=VgPr#Y zWS%t8-!Ky(Iybt5=o0B~XU*=m)o%9Po_Ig!a_$Xtgivpm1=wrSTlqmYAl!cTb=$N0 MOueRi|J4{60BC-C`2YX_ literal 1320 zcmb2|=3oGW|Gl^3{cnfK9Q!Ez|Frx9@$Bl&(=Y87?Fz}24Qy6>%Qf=}Lzt}frnySr z*nSy(b5qYf&gsuF@2?HJrqdC5>u0kcznFgD%#4+tuiofOOC{gBedDfD`E0+lN5p)u zrED{Md;N;a_R5`q!p`5}|L^0wLo@qL$qz2y81u~J`QKj{EAtCi%(!saMNaLTL1(*U z^$bo!<^DE8)irR3G2`+_##t%3dHnnk z@2!_U=M!)34v+X9U?1(b`^-Cz zwblFAtg(L7es}wu-Fpjv?_hsn-}qQP<5vxn@MN7kvA1uz+|=4`Y`pK5No3>|<>F00 zrseKSDV;0&J@5ba__u2Q)4y4reyhGGo#*Vy&v)ZbO}%UDxN+v0)t~llD&1Qzo2s~cw-n@WxqUw) z>(Tk%*!TWx^AEg<6WGjnSdT-Z%+W<;+nz7435Ls6nUcC4RT};Z74mhAfAG6O zRsgSyvxMmiwnd6PQX$M21>AU7HD*|R%HUYc7J3!LTLqE`1*uup21=hG8mKLlH}T4X zRZ@pmIEI?G1UIkBs;IEx2kU_(-zzzbr9cS>L?2pl)6KLcaC2`K$Ko{Us|MeIrl-x$ zJG}4avfCT-x4krbGdp(|?{6fbKwe>B+REA%_*%g2tXY;U$b_{(yKk>(W4mwLGb`5# z=+d)h3&92jm;lZ8)sX75LAME{W>w+?uv(x$X61%J%mA6p%b$JiFvwvxcWgj1hY!D= z*$#4}L?y^Ps9V7%fOQ@Q<|v>#RCl5}-Obbo;sl6OOF_Qf$_EUB%hwC`coyF_+4eVn z)#T33I{)j}{`B-ukiQiAvm)61+B5UhCEpdT&+MM=|6g8y)3JLt(^Bhh{Q8&rIxRZ) z)46Bc^=IdQe*58=O*Fs!kCV@KTJK(XHg&4l_qluPt8T{Jy!twKu6_EMTjyV%?p=Fp zzoL&%(R97r@%BZIUDMlN|G(^3{`qzPqr0CAiYA)9l;5_>`1@kZpSS<8-~Ac#|Gydo F0{{zrfiwUB diff --git a/src/main/resources/data/create/structures/gametest/misc/shearing.nbt b/src/main/resources/data/create/structures/gametest/misc/shearing.nbt index 2656d5a5bb6af8c5bde319507d74cb6bdad0e2f4..2ec663ba3be159a9dfd02754b4e3034cec83aee3 100644 GIT binary patch delta 1045 zcmV+w1nT>?2(bu%ABzY8000000RP35&2Jk;7>D1T89TPqkkE2K98f@9kf7?h5+qKn zkcgC60fYFE(y=|ZSJ~a!&W;;3TzcSwdgvbkho0a75^zAR;D!WOPDot1a6tSA<(=If zCoSIbNJz!fYCZNdGtc{*j}|}^mQo%Gtwjp}8Vz7?@mRora|0!~7FV+gAIg)XObZbm z4R{tNW3bFh942C*_()&np@J5)x=N-(=}=_I2%c$RT1`a*mQQdn70K~f452pSQHDR( zGC9=~i_{XSux0;bCjz?{t=Wv1&SsSS_-G`OftWw99map+vh^S5^{98&{D0?tH0Zql z6Uq6>&Fcz(+GAb{%N?%yyFz85OaN9sZ34@}Q$g{dn5SmnO=yTjhsMtwqM!vd>FXBM zwiFMO7BpfJONIX$esy=M^wzC+!WcbxoMHz&gsryLD(p{nF$Adt+v1tnyaG@F&1-TP zjzW~lr>H}{9m{E=H*S3Y;%|3;d7nb_05jq`cZFbo8Cb8k*TJvs_Uj+K@a*a4Pv719 zBTz%>e>wZo%mC%R>>613itY9NMf9MfpSg}vnFG{UaD9|??j zt=-Rmq)JU$MZu7#{!|y<hr1uWY}+-c?+PC2Njp!Y zwk;#6OlbRJq>Zo`1_Z|pRq#pxjf3P3g`o@s+=7Qv=c}LBvGwO4!*b)8UVB=^#l|u} zt+f^I$Hz)%wsiY6fp%q<+djB*JGa|>??LhIT?e~w%}}%9SrIhb!L%Me3}9uOC*5#= zaNJAxrPNr*(%TckO_Br}<{%V{fde)AksKW3g!XiiJOF&7M_PJpvLdC8zl*nRn{e~~ zxx|}A4?EE8L-At3h(y_A9us&l#Dk$840AAnhqGl|&X#dGTgK&V8J9EhaJG!g*)lF? z%eb5^<8q#@hX>ET3!E*p=nRqt&X!qp1{XP7#^oH7X9Fz^ P<~qYa_esfuWDx)WU#baI delta 1068 zcmV+{1k?Mm2(}1+ABzY8000000RP39zi%T&6oB8(%sRGnN5UNiqCf%BAOX4>2@)q( zNJNfU0fYD0`VUlZ+1OS zIK1PLkPb_$^?1K|^S!sT(mpo<8o=`COi%zYM`+ItsEbs8M>-OD6URXlXxi6J2zM2a z(k9dskw}GC4Zm?PReJZ<8&M*1&65l#VBls;YZdjUx(q>Tz;<~qcCG=GK;ya`Mx#im za)}z$T8W&ddi%zAPyhPS&u>#`9A`pt9m&)H>%h9*!!~|pw_kqesmITDe*E^%hu?gi zY<^J(_8L!r1Y9}c=};zHdB$hyR$r#m9PG6xlPDDf#Yg(Zu}FoA1}}_c9Lrfx@pLR; z?zjC@_UUi9hMl(c?`es=DH1GCFVBP+LIBNu9>@FfttcI1IU4&?4aBg8F^x7{I!td) zW1PzSvA_~cSt(veE@cu&fBC}$>rV`MLx$n6Nrnhr$C)eh4m6fgq< zjke%=Vk&Pcx^aN%x0THHCWg<=?IbUK{@4fR2;gc5YmKo4UON#trjbJXI*@1x8|PW( z6Ctt-wf-{y^U*uc9G~6&?1$&y&3@@pp!3ukP`fTo8nyYhDL!|@q5qOaR{{o z!DBstX%*E7_hc-UDcX@3X(KF#0l}D&3Z4s~ew@CduqeX-x8RA?#oaIR*!|=8;e6wm zS%+FA<;F5UZMGEd#|KhpHg$V6fOceF*xtK#yRh4N>t1>8z7KZanox`ItSmI!$747^9zYr%NaJ%;zJ?Ct)azy#xf@GV2B4pJs9R-0uN`)xSTEHa<+`i*)lF? z;^Ax=m$PMD&X#dGTgK(QxE~&j%h@t6XUn*pE#q>wd*0=28JDwVT+WtpIa|i%T(~@c z;2cyifd@l880x_=2NQTWTjruOsbDTT(+cLIGpk@+&cwr+EO8Di7+0Oi66dNoE@$fD zOqV#Gx2aH9?rzWnRqyp3IrQ}DxB9c9t*97c{Q!uM(K%x!d^sR|G=?- z>0z58;@*JgrYW+_u`HjMwm^U;4?*CXG>@c&)+pM@?X m=0B7=KfHBah4xsN!g`x){-$ZO&3_i_pTOVA{4tkg5dZ+=mkwV5 diff --git a/src/main/resources/data/create/structures/gametest/misc/smart_observer_blocks.nbt b/src/main/resources/data/create/structures/gametest/misc/smart_observer_blocks.nbt index 8881a617311baf41011dcd9a3a15fbbd25c2a6d3..36dd6669635be9d7e9c2510bafa47d4d903b0eae 100644 GIT binary patch literal 503 zcmV!)U139@^idK*fNy5LnL=6tl(6r)L?WyJU|&G?g`W^!HwHQ3&B1VM>xNsQ zj!;4M&FCHt3A6?5I^GPA({o=yfxieR~PUsh`JYt_O6%QfpJVQRoLWV-Hh{xz%U7 z8?(QhvP=AlW}bCDkJ5(j+&yt~M1t&rOF2nD4ZYFI&5~+;uxN(#44!@B#DAc%!c7id z{4F7~;tw*nX2Y4gGaIg@TL?vB(1776VRxCC9ai^U39Q%F2aN}F{gEsD6tTo45lkAv zum~m#FiC{7XF|@N2|0Tv+A*G^S-UAcJKkBoh#ASQ_NPjpD4_u!2 tk8x|e34{IZ*{H8wcli+@``+K`i!9agdN7^pC4{-kg=Yma`8}s=mu+zSo>R- zZ10F1sLHLqP+@pNhx5?%4pp_zgi9Q4t_C&-R0Pk>Buo?$cA?w#dwreL*L_ll!RS+PZDvX*L}35(Bk ziT@mx(|Yq&_Uf=lH|r(#O-S$d6u+j_EEG|`K&Wi~5+xJMC7T+{)o&)|x_EDQUpwp7 zCtH7o-wV#ms_NZdo&M`@X2ru#cWjTxUT2GabUUj2$+;FUd7WAE84_>apI`R-(zfaL zOds<9?v1-uoMX2BZvB(vVt=`Ae0Ne5e;w<}M7;lKP!0&}GH6xR#38i#YyiKus^4FmX}jevuxhWpd+Sa0-OGwes$!*jf>leTz3<^5t9i??8O}@7_Nbfw2w%im?2~ diff --git a/src/main/resources/data/create/structures/gametest/misc/threshold_switch_pulley.nbt b/src/main/resources/data/create/structures/gametest/misc/threshold_switch_pulley.nbt index a405da75ce7b043f5b51a74535c66c9d0c5eab9b..93d1aa6991af1e05afd548441f33dee99245213b 100644 GIT binary patch literal 840 zcmV-O1GoGiiwFP!00000|BY4MZqqOnK53HvZ52NgLPFw#H$dWU(qLV?iC)l6YhjF= z%1cf+Yi=BDr`@=k#1(IW5U;=mcf1OByaN*DIBmLY-KJQI>?G%W-{)ida~+@tm6!=M z2I~M&u7cNPBZRd;Av3ssq?p!&fN35bLmldSO2()RM@^AK79jXTA*HGkjGUmtkUlV> zu?l7SZL_=yY6BVYy%CQvP;6+{1&&c&2lee&0nYOr05Wap)i8C8hVYmW3%tj3q1wpc zH0A;adcsX`vLu$BaShJdBJtro(Z&qoLLv$QNYAvPQEsjld4++e3B`_j|oNr zhJ#~dN}uqdxek1DX&%i1(vFXDFp@?paABp*410%4a~T0NzSO|e{1dvgVD>4~Q?cV3 zR53E#a)50$C?5$bi?&PqxCU-4b(XYfZZ@e|#!WF!ftb=AF-`%lEaomQrvO)}09UC1 zSE&G(TY$?gz~vU;@(OTy1-QHdTz&yAzW|qCfGgX;c^rq%iyIx8I+S;~Fi7rF;vqCH zt%GspfZviyWE={wb|QOJt@%K8cR1WaAtx^{Ec)sUp*ga#guOY#y3ICxsO(0~BRR%b zn|1<~R-zQ9nZ#4sn|quC59Y(>kkH#G*g1Xl-o}0DX`BW3wezGTgdc9)MrUUVjKD=qN-PNa=W0z>B1i9$S^QX{ZFAEmk}WGxrc zP874fjdEb^HPcOFSa5=2OOE2iq&GsPi)JF#DXnIU#pIRde1_!p$oH%y4@#YII{i1D z{@vT4iS&#@ow?p>jxY7T5?O5jJVt2r-|lw@?M|=X?6$T^WmYhc-2ROW`H+)<%Fgco zL36(iS(>}uZRdiWTY_!L@3;m0D}|u@;5gIlz{;M&akjf?-}hvq0&;lgJ=N(i^@kL; zLH!4M|8ZrtyyXLR+iKld+0Mn4%KFe~h9ND-{P)gn6tj_C@-C+y4 S{<0s<;d#rmgs?5E2px-T;XkQh_v~A_vl_N%^}( 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 literal 2154 zcma)+e>fA`AIG;At1H~Pm15ETQhHo8Z73?#(~2mRX`z-e8>5i&d*t!0?CVD~W~(OT zrthL{EI;Q**N}y<`8izL_RPrdRc7^_?yY<8f8X=R>zwC&&htL!bI$vGj7S>*U)z@% znkeiYXIpEjt|yiGkiZ=pUD6n$jqE+u!4!DJMsPq zr~Sle0d96E;faQCFd_&6GtMRw32cpEG_+QD`CXh%|7e(C~ny9)@nJV8}|uXB(rRZ`m_!zXCTbm?Xw?5^ z_J;11iskN=FJ<+7obW+Cc;?*8%Q|t})9=1Ot8+pXKrPO%S(Vh_;fH$!slq#1pTHPi z;^GHd{}{13|DY$C5%NPviof|~Rt(|eAZ4bQ+-FWV?C@=Ioi>d^K48tw$$sxYZsU7p zJztr_m6fk3yH=DxsZ@D18jUCeZqiAM^lQ2=5IfqIze9;uuFcl6gi&v*<1eN!J64>B zklAMBPz-T6n2%5X zZGS^eW}dBq@@0EK6E#n1&DqE?e;;PsG+;nQkEXamm5f1_G{R|WAbBiQxS>Y>{>LTTWcS_xZ}!8>t<9bs4Z#uq16OY6k7hEcbwcF+C&{*vF6}^ zyjYU_xpPW|4T$A(j8#bps;PGb9RImq_OD=;fyY~e3w^hQCmK|uH*&gRtcUVS$Y>); ze|SNH#rTYxg4jJ4QpzD4_BlmFk)zV=pusKSc3~m%X+IO>cMpMyUz|`PW`Jl%_9!JkD_3I5N za3Zq@?K+S4sP6F;RS5lI;`NdenDzcoNPO%Iq(<=kTmj&GmKS*XtvBi+L>dtf zw~*GeHAZtQ!J!RZ+5X(kgZFo=`ovg9K6B<)g)Ok7bI<=8kx1e?iq9Rd=p7l_`a?~X zK-|7q{5tzs|CUt~I=P%lT9TcS-X!wGsnIp3Ta8nAoa-QJxY@~0u-B*64s;XZT|Gi<#;Pj=eyIUEabn1HAQh<1>r~Hst|g> zB2x05^f-!}en0y*N&R{|6F}taV2YpJE~){H3QAcbV-1Gita zptjijHYpcW-=eJ*8SY5I0P*lFbS1@do_1tI<_u)YQtoi3RhwUk{JbZ$ukCvFRuuJJ z5qtUx!*!TL&sXqq6@K!D2CE_BQ62)fvulOaYiCcBL@XWaSDKx6(!@z?zdT;vCdx^vjG(2q(kezL-UUh^7WUX433u(-t1E685r_jec8YG)KZ+) zVwPB4v;u%NLMwpZpaYNq(BJSQS|=`lHg}RB1;s6l3Y|!qBCy4VmmyqTZGG?9$ox!@ z#5nzz`fA_K|MMs|(38C;c`of(pQ$2B>h1P?-(3rg>>9%-q{+kA!zV+PS=tT%eO=0+ zIym=Hb4|e)78$~J_k!(&JubHioiAkc1q=pA#Zi`BVq{U_iE&fsOLA;8 z-m~=6L9@zW_Rz5T^0fzM3F8&$~X)&&Jx0skvT(H->h!l%u_+RN!XXQ46C-0H)ru+`>HUd+H&~u&DFW?Sa u%OV8YEvI5)t?q4qHDnyJxu>RX#mu8U5+y*Ppd6)@Qa6RR@m$PN0N{TlEk(xw diff --git a/src/main/resources/data/create/structures/gametest/processing/brass_mixing_2.nbt b/src/main/resources/data/create/structures/gametest/processing/brass_mixing_2.nbt index 44de42dfea2bf58181979644850faef5d3bc52fc..b48679ee8f993b0e88ac31b988d3e1d56447b853 100644 GIT binary patch literal 2858 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 Xjj`HElV!ne4)`=$?Zm#{ICSVgR#qoV diff --git a/src/main/resources/data/create/structures/gametest/processing/crushing_wheel_crafting.nbt b/src/main/resources/data/create/structures/gametest/processing/crushing_wheel_crafting.nbt index 099e093a93f170665dd3b83372af89ffbaad555c..43966b6a18316bcbebd2610be3cd773d99727e18 100644 GIT binary patch literal 2719 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 literal 1865 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 diff --git a/src/main/resources/data/create/structures/gametest/processing/sand_washing.nbt b/src/main/resources/data/create/structures/gametest/processing/sand_washing.nbt index 75ade7053ccdf27359f701f6bc19068a02178478..86ff397ad92357a32dfc2d570723ef8e6750e347 100644 GIT binary patch literal 1381 zcmY+?dpOez7zgn6C{&Azj?LVil1smAE^#8~w5~!kx8t&`3sbJcauA1f+%NT5?J#pm zaxK{$d*X?S8Pm2J#TvD_Eg~eF2WyA(Jg1)C=kwS5e&6SL|9JItR6+lhf>|^gA+*&@ zDM&sfI9qI^`{c+l5Qiye?x5=;z*kej%og&mO&?CwSZMF1SU+RWUBL2ar(w%6>y@Ys zli#S@RJRKC5UBg!aPG9S zzJ|d;2%p1+4Y%OAPWPfso$qEjTN%}AuG9r&sU8?=B_T*!T1J0iODFCoTh&ZBV~qA{ zQU@CskP5#KQ*-r%?n>A01|m}skM>s2Z%Y;^fAU+G;Nw(Anmc?(477ZVR3t1yJ&x?1 zmoCs8Kh|t5JCYPK!m0(E05<#eEZ@Z=G+KE9Yy|(~xeGaH)@;JAMLE_4(9;&HENG2X)YjvC;z@W_M*N6x}Z?@H}M#CWu(3F|JJ~` zD+j-kq=<9Dli%ndO72vAclyU{=8svc@4<~F7^#$I#jpeS1X=2(EpG3*XlH!6OLAC=Ik`d{(RugsCiS!W&0-z zcW+<$OGSmt@>bftg$&C2T+x6;8{O0A3|foidp=lMToWdk|BSG)r@Tfgh!gb>(`*A1 zG3{>;<62^6oYr>?i}GNP?!R4oQ6>gg!c1I+J2D|$c$a;!9ZOkam>!)E<$^{Bj-)kF ztT8!Oh?c^Kq4?{YuW^(U8zNYz(!v5R3I3pqfWSr)$A5r|XHdh`Ud+hzwBJ|rC6;^% zf-lkL54|U>Op~prLp{D|-0lnY2wDN?9eBN1m?U)k*?dvFot!wfCN!O!_wF6$PP7mo z^JMa|``DC4hUz1wB74mFzkNVc;$Hmii$zu9_0?jyvCx3M^cN23%&#NM+FzdyX4vZoWoRW%i4UIsce*ygN BzhnRa literal 1370 zcmY+>dpOez9LMo4L$a1qC!VH~Yns_w#_Acxd0kFNXFFMRzgY?xkPMdi*qoM z4$Z>R#HR4H_@SLl?qOz3x#XB+PS1IsQ%~RL_2>Ja&-2}zwrSmex7NZK4DUzpNG$hv ziM}6%SCen4edD|9BBwbl1#IWN&yF)=M1&b_dz`9jZ;Y>+-@zNKkawT(K2j@BO))-R ztzrTa@19#I&y_F;G4q=Eb3vy?O)2>fVU!Nz}hlTaWJ^s2aUM6 zsKqJi_DKtWrKzP!&*I}iMknZrBVh2vchK#u8-gFsEbc?lQU9a5MyRS%zawk{_{1L$ z2z0dDzoX%PYJs0y%+IZ?S^~AAC-QHBjP@gt%^*-PF|Jb(7QAch8srPhE{Wu_hEo^92j_#48o zJ1-nvYqnVLT2L<*VJ*1>b#DaA1XXunV#Ofi^#l~kEP zpFT)k75Ow-YB**}Y&&oc&;dOtZBiU4|F-6;zpuNkZ{qs~OC=>ry`T&pqwcWhOBBOO zTdv#+KApeq4>*5-3m0g;OU8Qp&cFO3Y>+rd7WT76P zwd``lrBk$g(^H+X`ge0sew1OWrRTe)pBxN=@VzGER)c)|;~{l#Ok#Af=yJ zR`gUvW|i?0rfnloep7Zd6Y4sQp&}X!2Ba*om2|M@UayjJSKPrk>2aXK)=wOb=GG16 zKS1A8bt%1aYPyot{{j|@^!V!9G|rxZ#CXd)*vaku)r{%d>GwsI_L5ndG`MNuvdYjo zweVP9FzzEnSm!$~X^GS^4$8WNAa`{tEg`L9+DdgHMiAy4BOHbduW#`C%1oqS~x?QLKp7-dDF>aV4~vv6P$X3?x@41fkMLj6QKr zYh-g?*D&n8=D+&vfMLeG0+gtb@#Y3Xl%u;#ptT@>uEy-#O32PRqAtg?+8QHyOp6$J z*M^R;9JR^h)sILN*IMwVmjg2>vtyS$DGTNnxAA%(?Odn{qLkL_EaAz~^XEp_Ph-bW zq=_dbo(zotytj!KmuX=!+$Z`wd5=kfnf&1>dr;43X8`aZD7!3eG1rB}D-)&%jA@h$ ztEzh%yzOOc&u{#q_X3tywB2p@tD&si_-EQ#A8LO?j1!vPHi9v#bxbL;71D5$ymeqm z--#;dXm(hzr;>~!;WFO6{%0L6PD`FK3^V2?>Ek{KU|45;*oEgB*B!KSXJ$)m0#8s} vUw;Ahs1bSGgLlmo8A(>1Xkrl1z diff --git a/src/main/resources/data/create/structures/gametest/processing/stone_cobble_sand_crushing.nbt b/src/main/resources/data/create/structures/gametest/processing/stone_cobble_sand_crushing.nbt index d56e9423d7fb0a826f2d386fb36c16d6f4519f4a..42690c041bd92c045fd7401c0146ce51bd7f71f9 100644 GIT binary patch literal 2498 zcmY*a4LH-=A1`@HcPqQ4m}O5EQ_0&*lnoc%_Ai7ed0&haV%Qy%w3xhvA;v<)P4;L)+k;o{p8s(Fk;bVL^DfCUA1%x2 zMy8xRlk$FVpLOXbE#Hv(M(>&)6dms{q*l7!!(*;@;=~kvVjTf%gg=joJ&nPAe!Fx> z?n{>niAr~zzu8ia@iR8kOf5b632vX2yK5zAP2;6s%Q>r0ds3_Sp6g#hI$1%=^r-`bIW;4~KY$jlzUnt|ZP zUxSh7oDoWePkSD@jf6sRz)fs-_JH@|jNl4%8TtKy zStBX?=6%m;+eA(5`Yyle;xD(I_B+-(S5@scgG8X3D~4z0t8MTpJo0;NnZbw z6laaI;2QfkhWd-DK2$Y?Pdom&`p@XUH^R*B*bAfW=j6xMuh-}P{p}+VG{UsXmf5MZ z(GKyp*c5a(vB(oK=L_<0XX7FVR+^@}-GgL`WEH@F^{L0GE%-=CBYa4#ym=k+i!J~d zTIH$zqw_P`%Wvyj$uyn3BAu9|sE6hyw~2oGH{*%ozp3JA%zuX=I{&8PMDtwv?_z?? z!cIuAk3`IAUA?%6vZ$?cLo0o=3~H&>IuV(Yv92_khCU-Dr9TFwl9>MylC2%TO@} z7buxLczEc7Wm}?sYK!^JOFQFUTv0iN{uYOAx^ssz*F#;do5O|O0ItpWoFh8fYBz$1dUVOcPp^++Foc} zYUNd{>>T~t6Bl+$F09<3_Zmvkg)kMGA3r(CatKKoDLLfwwkRk3%pH7n7p67VqBS99qfsDzvmU7Q@piI6VuLFqTty@u8zZ8f4rN2;V_^OnmK0VEj1(BmUy;-vunQV<*Qsv0{~c)VdX9%FI`gtL?~ z%!;yaa&6$(vfUVKigMZL!`=8wEX5Un@=n99qw!fb#Jq>jQug1m^SXk_^jjdRrQc`) zo9B#)Jrlzvw45K@ifK9BAuRWMiY)BOrD7WTaHgr*%Y{Q?VnvMaeLvicw`mz_b?@MWKTG;-}=?EfGc`plqd$mmQ?tEPqThU8FNM4eD}#&f8n+)g>6 zRITsHB}=U3;6f<8V)>-C=6!jAsi~DaT=ljagQS+8A@{N;i^S`_+#)pG@Oq<(Ujlv7 z|MG6d*n`F#i@HIeEjS$68{2^#KU`hV?C{AIZ%bMAE%ilC`blIt@%4#~g6TQktL0uy zFA1GCHlw6Y)~C2;NBV)jQ7V%;wi--utz{BT*^EkNYlv@z`45Y227HET_}_SN8EO+4 zuNb%kScA?V0_%tk7e9TeaOn3ecWF`VwMeVtMNlUIJg(SKf3!m0x(R7(vAuvGYSdS! zrl-e}ZdwU;vtu5F+0CaUtf-$R?E^!d&1QRTS#fQUe3tRtU!M}`VdGOdVb>l}>b?$y z%fP!5=ARlbHYW)`-WzpCXO&`KDu@JIVw9xFfV;2QibXrm8^M1{Y_bHx&@rIgSWxbt zdvix-7Axx8Lb^ZyWXxSGu9QQFuZ7GZN$w&*BwF`p#oLN{X~P8~>1LztL}g{@u69R5!sWmgv+bB@TT|zLddilyXl+D=8|_RWc?)3D_&d5<_uUbx+aRa`v6QGQ3li_*u({YGsU|w) z7+u+Y_*U^fCn`V1EqJ0JI@~QdL^kx)rT|3GA4E43Np?hR!4}Eybbm0lrZA6`_osNI sa;UJqj}3KAx{6L5C4pch9Z>_Loy{x*_TdwB<2Sb}==2I+SZ~|*52*suEdT%j literal 2508 zcmY*adpy(o8$Y(4;mi~#IxV+jmGg6FGR!4uq+U{vxs_w6xr|ss8*`mHCHy3e5uH$M zxviX`VQF(>A#z#Bahp03ne9ZzZ>rOI{l0&^U+>rRd7jVfd3~Pe{r+laDtz$-x_xZy`W;u>Cl=w!J!@yfnzf8T6~TB^|z$NpL8@;Dbi-CfQ5oBdG8_x@$& zNOtw0-s`=)UdOI0xxLc)8+~6no*36WUS#c}z1ILh$#}S>xhYKUjaHsN`p&G0vthpG ztjP0`vTwJ;rAA1fibnlvRgAeM8E)k&+8jBTV;05YJo(9F%1LCxIqS>K54R5-xCDag zg@PPsP!?LLdn}A`{Vb~EOb|FLv*`OT|-rE(+0e{PnW3AIbC z?Cm+wJ9dRwjW2_U89%(f8X6XTGbgjHQAu(q48L&sv2MOMSZ1ZIG7KcCAoy8;sa+M%IB zg#(#xGeOx3eDQ7!y^&-bmWHU+UJ;2=tEett`R#%RT!pDLyIB19Dm)x&S zn0KvOM<@D`NBi7QcwoGURmEwm_lIdt((JjHktT;T!Suh(OsqJN^UG<-Ulf`?5>-Ox zs`VuzTg}-#hL+pp-dp>^Fy2oPr;De<63j$a)l1Q*5rS7lqadYYl0~8LqD`-PzTc&n zn@7~MdbCe0yX@Rh0VhYmyptdRrjF@HXW^Vw_}qYTR9h3e;4EAhNO#EQSpM6#6bj&%b!;hS@{wepIHSxfOF`c4hs}qCL z!dU)0yKcI^!{qU6dSUj&lGiHCHa{O=h^BOk}(lM7u{eD&8tE3ij3}geo4A>sp|9Qtbdt7pxG3JMk49vFae) z7m#G}M{Mrphn7AV953kgJX12;7fD+td#AoQ7&Z3WRJNjB%L>Ji%T?1m%g}E*^}tPm zu3ygwLcK89B0VVIa+~nwQmu7NJdyV^Ma(y`lA`TA8s& zu(Ca5_$G{=Sc3D*IdLRyS*uNh!P|V@m{|?XG)wr@rn7K}wthbjyHr;VOb9sB4D4Yn z9(+3tC}_5+e?s25*imaW^sXbEmE3PrKM`Rbi*1NV)BK*!sm*nZa1&f)Dld@n^Ff%v z_i}GLg6J9+KBdjD!h=Ia?coehUkBr%KUo@ov4^}$$O|==tznHK;lL~o8kkVLT5lnz zT`+joO-=mpa0r9m>f0Lp92@OTEf2QqHw$I2|m=? zo}k~3(-4(ZYh6?30lj)ZlS48$86wF&R)R5xJ7v5yBbcw1`q}CAw(Wi!WLo|t=zmoG zw$!;rxeNMmFm}^cF?vkGj(k4uJUM1pnSW!(W?q_Npz!l!eTd=53XVMuOgF4w$osTY zJE=fG%pt6@0{_QUYYTIeyI6K!K(p3nXHOhyWsdYAKH^r%bXj4Ypc8#z_z}}H@oo$w z5f(BLbm{JYE^EJ39>9_!TPGVr>viRrDBV#gjB&KXW1p_63kWyNhZ?9JrtGos$=#_d zTf}Ri>)SkKdlPdy_=^0JuaMSZsKEaM3*S@80NEc@qR6*T^;M}^ild9=Ff0z^@Q27T1ML&iay*n#}q3~LQ;b&Wn|%Wb?> zMO4O{zs80bJ<>Jqnb~Bd%SXlanvfXrKC^Jli>=(7!zDa2cQ&ke9$n$mr&n_lDD>v~ zpbh(%hJ&A)YkPOD{rA4IQ;qS9?sCU;9ru|BFFHTmVcn||{Zzv(Z@YF}>h4>$p2tA) zGiPbG^y!O9rE&NRbFh?xIW#1az`qx80}^X{+)x!8eM<>k-E#2o44Tpn{yjG1+0~@G zM@3A8ra6n>Xhx#`m7!&G@07>6@1_{8FZQ(16dN^oBx=@S40^oIGhSJgI*GqD6H(q> z;n8*Q10lw8)UE9U(ZhTx<44k>)AYNpS#-$(1M8OSskgdM>nYi{;A~Hgln@Z1rml^S z_F-98cGojh3bUa`Rd!``RQpO+@dnL!X&|a;{EtF>NZS62fND dUWrxhw29}b6FC=FQh4Di!9hZ`YT&6H)Zi~iT;-n}H=j_Nv?#!{_ z#9VUAx}mniax$4)k-6u7+gyIDb55`NJ%7Ak&+GZTp4aR1JfF|=C@1X#zKrdGOt+x^ z)&ucUEk2Ii7dDt8<4=(TXX>qPGcL*MBhp@*j}|HGNkqW9_VaGk9_>ktE^aI^%G0a= z>DC3lMc2@!yvZ~sotxTAcKq25bl~u*M^UgvR^&dP4#_Y}ojk7`xhnL>w0ncHvN;rO zE2CV8(*YkrcGT*MHez)LQ(`!&(AoX9ReFw|auNQ#DHu+D>w3iof+>gDssCEAXi|D% zoYP%g=4F2EvPMy!6EdJL(XYmrLQ@-RLRY1AezYybrb=g*oG;JXJ%;YSc$hg&c{OLx zA+R;%`Eal;BE99JH&Kq}zAxON$`=>m@yH&5@dy*RG^B2j4|O^e8aIVM@Nrf_g7Yhh zzXvY0F(*gf+apW&+{EUawkif(EzCmaOi@PUC}|XFTT14&#)%p0dy{Bt)_)wTO1rF7 zdsL5KjyBTUuUoSZ2U0ElCs$1?lw_F(ET$5JHv}b28O*JW%+&!V$ zI)*P+n28S`u^tLl8@n43Xc?%=?%QjEG|{VlFi| z+XHOm3H^e8e>huzbBe{*1BK3^xkboV)DDD|4qp)a>|BhBn4zG0TWnK#YTMV?z1bx9h3vlx`&3a9>02sG=GHez3To_jQx$wlm1>#`F=O=;Phv+MFMmws9-0m>#pTRIQmFp2hScggsjPYPUJf|Hm0B0aQ3Sj#Od^U&~FzERj<>M=N`A(7Um|EBmu z&rGoRI==Rj#nid+aOdoV5-GdcDe%Nj)x)!P{EF43vE1b`0e?}mr>DngT;zq1-z6Kb zKh~BX3?mgN;wZbQIH~rFs$fNLGHY!ij)u#rliYsq-<2{(t9Gj18`Y%qGv>KBzCK4n_M^68*1;Z(o8i^b;z!>5SOA^tG~0|HB=K1J=0gGXtFgZXTo`BLIPC0 z2<6YN6KH&#mO4NONIMv(Bv}HTGs2u?mK!6DN2pJtLE0GC?z&lz6=9SlrJ!37ZrmE< zFFU{d%zTSCl~;eWX$jsO=B3pHIvj7i`3pSX-GIBlg|3!!yxY31akamX zkaP>pjhOg>{lOlmgE?0|^(`W;GL$Ta$gMTk|u`L2yA|=N3OZZ*KJjQ8o&X8-gb6wKRxQqb-`a z;U+4BH2EL66_y*ea?bjQx#V7D+CVc|W8p&j$PFx3r4crQg<~f6hgKbk2p$M08YyKP zz+s!L$FPkidV*fUH8aq_hxa!wug!N)`UV%(B`tmMYYflz)olrA{=xg!fS(L=-9!>kP0& zJ>))D_dZ`a2mm{FA38^J9-(HMf`kdtTM@dA!pM5XNYSyqpnoAOiJ0o*jXetXkKNtP zIABP@+?#@9+)qau1o!>Gy85qapoW5VogR%0VlA5cu()AJ0T;&kYcx9{AeFhggW6QL z!{{_U%g;0;MtCFfkZq?pfzOF6?s0g@z!SG!c|xP&^(>)LHfxz-284)1+kgVRG-=3hfQ>Dj50VcG6)mQcNtCJ{C5|-^Q=jF5rONlWp#)5x^2;|9=D}S2mdJUdLM8+Qg{+Yz@S65 fEWULl`HiE0{{cYw2S})DZ_4ji^BHhD3jqHE+t(MA literal 2098 zcmZ{kc{JNuAI5*NkDjU)Rgp4Nr?j;+gxZ%fx}_LYGqzGoP{La=G^Lqn>!l@Q)KH!Ye?X9@SWH00_ ziey^4U4FJXCqDEZtNH}V=4DJ9JL3x$(6^v)xf;7Hd;CnAO(`>&dCDOA?u&a0eJLa4^UiXEbcyLCQzP_XW1b3Or}#8$ zDf^`?%lPLY$^Omg(aTD5rjSQpL0n|QgHm;Yzm_W*u6ho`xp%$@Rfl zrdzHDxZP-)-%Zd{mNMj~Ks?T5m$y$#KJ#cm;^in%bfi+ka3 z0>Ko2(^xYg_*(-(HhtEAQy8`>EZW-W<#0F&*MaUkJ{-j8QG8vA;6A2hoQMqJLo|+s ziRE!d*ykH>23adVO}V+E(KZ1g(>K5aR5>VWPf~v9kK$#+kSK=*5j2W9sV5ZEEU+jc*;HC_jrGrCFjd zzfkslZB&YDYm})zVl-FQ85(z?aCUbK`5`fGh2j?_QXJXR;qWk9O-bL+ShYo`EFBC` z=&r>pWJ8Ghw@a_4z-1lJKv5|vJ3+NefhGM#7|j96y9+UA|i>Cz`LwV ztQINRvLF%@$GI;3og?AWo29wrgYp^LWG_zqu9yA$oezio5I;trd`7-ERL&}@acyqZ z!PE3E9pSJm8Wx+V*#7?N#qL$uqlYZl)}{^c~GcOHdd&=rgBe zP1A{=xmxJeSNU{L&N1u{?xf+>)s;s_d~M6(nQ_P=e1Bg1(_4v}qiyYJ2TCeqTMLf4 zp}Y?FLW=12K@QwyJ(-O=z>kO0?VX@6byOj&y$qN%%lI>3fgm7>t|fy70c8SRpR%eK zN6#8;WyqP*LtoFhDGIW!Hk#buIv~QXXiO}yNKz%p z;>|yPKMxH!sf^2$mL#9fwa~@_aCrc$08jml(*QOkl-^V=s@NL8%}-U&8BMJbOg_wM z6-=AAZi>y<>7sWr_QKhQo1LwwrjUUdy>&zENZOs$nOZwTPN$Xazt@VjSL2=EdU}Is z@*@qZ^+j5ut*>ewxt#N1?tDF(keQzH7&*{=k=I7)D%j$`;qeFfdc%EFi^FR#KsXpx zYX^H3rD)&$N^AGR?EE2dAkDwIeAwROdE6e;d=ls?$j%HEEJ_{>wb?#byU|3#aov&b=?Xg2UT}Q=)XV(jMzqoZ(if->~dV zesGA`vNraz?&Vwrwo&V1w11`3TX}Zk{HkM%6ih!0Lc8VASszF zQ~DhUHfae%>|61Ti8R`biBxEanS4!Pq5{NoNQn3h*ZS0om&Q@X11XkN;C_G#d`dO* z`SBP48o+@iN;*wde()ZNUD-^OnONeVC6MPtu$1`>sXQJ16||xzwK3q*zruERd2fV! z<(6Bs7x1NH7Y&u}ijsc~w=;_C<*-cqqS+o)AvtH(xcd^zxBXUrfK7k^+D6}CYgc$U=|Z4BV=(2xKjSXe4*9>B{-H~36V6=zu`%ce8nAj z1OMED^&GZr`0SM=cax62wyaXV;WIn*pkTkx|BGIEN;_Rg+eQa!;opkXza>1vp1v?y zWnFt~m52*=;QF4t!R#Oy^Vi`_dI_J?Wr!vI36;jI1yX97|d-Vr_YeDP-DlD+g0uj*T1eg$FZ&P^<;w{0Q?8%TOS7i diff --git a/src/main/resources/data/create/structures/gametest/processing/water_filling_bottle.nbt b/src/main/resources/data/create/structures/gametest/processing/water_filling_bottle.nbt index d2b527bdf19541a5142d5ef1c134ce64a2ed3408..13e3b41a186ae7e40f0f11c6c54a355d8e5ca65b 100644 GIT binary patch literal 1807 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 literal 986 zcmV<0110<)iwFP!00000|DBg#ZreBz#)qQh*iNzyTJ$pM!)}@)fM2=+5)|EiNokph zg;1hE(($HGy~$oB*puu@);qK;$A3g~PyvQ)>*M@JGao5&2rz)u7T+ZY0RKtxbL77d zpf4*|xI$X+#{ha`rSnHS#2>c<;I+2xp!LBavrag<8quX;1Wj^4!w9TabBM(Vtc1Wy z2&{y_;sh2ausDGQ?fq|PSU|%Fn&g0nb+U%QtFaqEHgd9T4AzIFn82H|sAO)$y*tmR z(z-yj&8&Dpb119iKvo>iZjGqyy)>6vtBIahO$qmsJ$p@ds_R;s0A(}VG@v<@E$_^> zTXU#ioWO$CuLMoZ8wtT1`>du58DuxLl#_p60RK7qEZtn2#|-+Hq854Ko<}c!TzZ3x zmyeJ_GMZp{7mNSkLk7JYXQZ{4FY9K#&y7UHxh=|C$-75voh$MoD)r3dxB#-RsC|d$ zKk)nk&wnl!i+{V;joo|C0-BfuL-#&}Uq)3ubEE1B*I;d)U+GB{l}xV?OJxWycfZ*rrR`XbcK2l&=B{iJQW zM*9WQ-MsCifF?F^VkJ&GSRqZ!Ix!X}usDI`kCb4Ylwh5dV4WC?5m=1CN(iikz)A=# zPGE5YixXJ>$O!$)2>r?k{fe;|fyD@{q?6S?m{R`~VUS(wS>;$W>rY=_gG6C)aC$vc z%7?%;|Ef?E=nK3|JB5J+dj`rVccClojJKA z+i6qL6QAj|wz!4S)vrIG>+!N%uYN!i^IWVqyn_|e#5~s{c&jkVl7J@W zxqa65Cc*DJ8N)}G((bhN6W`l4%%|vz{rB^+Fh;5Xb~F7!Kohe-tW>;%71Hdoj%uN# zbJCY!*oXA9C?&jG`G0JLwRgF&MfCvf#hnQ@gyFT(xIyvTdDPqsoLuQ#DAmW{dM=He zKs+#KubP_sd9e?+IHkjse!`KdM zcOA=9@g(n>SEHS=+dWth?pWeN)OCsRQnk9huG*~T0lvU}5>9-P#^UM-aQrv?59qH* IhYS(`04c)v00000 From 071c3969f50c8ccdcd5bf036aca9786aa01954d9 Mon Sep 17 00:00:00 2001 From: zelophed Date: Sat, 18 Jan 2025 15:21:02 +0100 Subject: [PATCH 323/515] merge mc1.20.1/feature-dev & bump ponder version --- gradle.properties | 2 +- .../ponder/scenes/highLogistics/FactoryGaugeScenes.java | 8 ++++---- .../ponder/scenes/highLogistics/RepackagerScenes.java | 3 ++- .../scenes/highLogistics/RequesterAndShopScenes.java | 2 +- .../ponder/scenes/highLogistics/StockLinkScenes.java | 2 +- .../ponder/scenes/highLogistics/StockTickerScenes.java | 2 +- .../ponder/scenes/highLogistics/TableClothScenes.java | 2 +- 7 files changed, 11 insertions(+), 10 deletions(-) diff --git a/gradle.properties b/gradle.properties index 3a65270721..885182f198 100644 --- a/gradle.properties +++ b/gradle.properties @@ -27,7 +27,7 @@ jei_minecraft_version = 1.20.1 jei_version = 15.10.0.39 curios_minecraft_version = 1.20.1 curios_version = 5.3.1 -ponder_version = 0.8.16 +ponder_version = 0.9.17 mixin_extras_version = 0.4.1 cc_tweaked_enable = true diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/FactoryGaugeScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/FactoryGaugeScenes.java index f2348ad563..2967837c80 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/FactoryGaugeScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/FactoryGaugeScenes.java @@ -19,9 +19,9 @@ import com.simibubi.create.content.redstone.link.RedstoneLinkBlock; import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; -import net.createmod.catnip.utility.IntAttached; -import net.createmod.catnip.utility.NBTHelper; -import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.data.IntAttached; +import net.createmod.catnip.math.Pointing; +import net.createmod.catnip.nbt.NBTHelper; import net.createmod.ponder.api.PonderPalette; import net.createmod.ponder.api.element.ElementLink; import net.createmod.ponder.api.element.WorldSectionElement; @@ -1461,7 +1461,7 @@ public class FactoryGaugeScenes { private static void setPanelItem(SceneBuilder builder, BlockPos gauge, PanelSlot slot, ItemStack item) { withGaugeDo(builder, gauge, slot, pb -> pb.setFilter(item)); } - + private static void setPanelPowered(SceneBuilder builder, BlockPos gauge, PanelSlot slot, boolean power) { withGaugeDo(builder, gauge, slot, pb -> pb.redstonePowered = power); } diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/RepackagerScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/RepackagerScenes.java index 276cdc3076..b3f88f3347 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/RepackagerScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/RepackagerScenes.java @@ -6,7 +6,7 @@ import com.simibubi.create.content.kinetics.crafter.MechanicalCrafterBlockEntity import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; -import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.math.Pointing; import net.createmod.ponder.api.PonderPalette; import net.createmod.ponder.api.scene.SceneBuilder; import net.createmod.ponder.api.scene.SceneBuildingUtil; @@ -18,6 +18,7 @@ import net.minecraft.world.item.Items; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.phys.AABB; + import net.minecraftforge.common.capabilities.ForgeCapabilities; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.ItemHandlerHelper; diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/RequesterAndShopScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/RequesterAndShopScenes.java index 424a2482ab..419a32743a 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/RequesterAndShopScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/RequesterAndShopScenes.java @@ -7,7 +7,7 @@ import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.content.logistics.packager.PackagerBlock; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; -import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.math.Pointing; import net.createmod.ponder.api.PonderPalette; import net.createmod.ponder.api.element.ElementLink; import net.createmod.ponder.api.element.ParrotPose.FacePointOfInterestPose; diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/StockLinkScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/StockLinkScenes.java index 9a9998c5a9..90c0ea8ce7 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/StockLinkScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/StockLinkScenes.java @@ -8,7 +8,7 @@ import com.simibubi.create.content.logistics.packager.PackagerBlock; import com.simibubi.create.content.redstone.analogLever.AnalogLeverBlockEntity; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; -import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.math.Pointing; import net.createmod.ponder.api.PonderPalette; import net.createmod.ponder.api.element.ElementLink; import net.createmod.ponder.api.element.ParrotPose.FacePointOfInterestPose; diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/StockTickerScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/StockTickerScenes.java index 266a03698f..b48a45f3a9 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/StockTickerScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/StockTickerScenes.java @@ -8,7 +8,7 @@ import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.content.logistics.packager.PackagerBlock; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; -import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.math.Pointing; import net.createmod.ponder.api.PonderPalette; import net.createmod.ponder.api.element.ElementLink; import net.createmod.ponder.api.element.ParrotPose.FacePointOfInterestPose; diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/TableClothScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/TableClothScenes.java index d95afedb5c..537da1c477 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/TableClothScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/TableClothScenes.java @@ -12,7 +12,7 @@ import com.simibubi.create.content.logistics.tableCloth.TableClothBlock; import com.simibubi.create.content.logistics.tableCloth.TableClothBlockEntity; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; -import net.createmod.catnip.utility.Pointing; +import net.createmod.catnip.math.Pointing; import net.createmod.ponder.api.PonderPalette; import net.createmod.ponder.api.element.ParrotPose.FacePointOfInterestPose; import net.createmod.ponder.api.scene.SceneBuilder; From d520e32ed1fefd8885ddbf48625a9df0a7669f4a Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Sat, 18 Jan 2025 15:30:25 +0100 Subject: [PATCH 324/515] Put the baubles back on - New assets for Stock links and Display links - New particle effect for logistics networks - Removed ponder placeholder tooltips --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 10 +- .../assets/create/blockstates/stock_link.json | 160 ++++++++--------- .../resources/assets/create/lang/en_ud.json | 14 -- .../resources/assets/create/lang/en_us.json | 14 -- .../assets/create/models/item/stock_link.json | 2 +- .../simibubi/create/AllBlockEntityTypes.java | 9 +- .../java/com/simibubi/create/AllBlocks.java | 5 +- .../java/com/simibubi/create/AllPackets.java | 4 +- .../com/simibubi/create/AllParticleTypes.java | 2 + .../java/com/simibubi/create/AllShapes.java | 2 +- .../packager/PackagerBlockEntity.java | 19 +- .../packagerLink/LogisticsManager.java | 4 +- .../packagerLink/PackagerLinkBlock.java | 2 +- .../packagerLink/PackagerLinkBlockEntity.java | 59 ++++++- .../packagerLink/PackagerLinkGenerator.java | 37 ++++ ...ffectPacket.java => WiFiEffectPacket.java} | 19 +- .../logistics/packagerLink/WiFiParticle.java | 61 +++++++ .../PackageOrderRequestPacket.java | 4 +- .../stockTicker/StockTickerBlockEntity.java | 9 + .../displayLink/DisplayLinkBlockEntity.java | 9 + .../displayLink/LinkBulbRenderer.java | 11 +- .../displayLink/LinkWithBulbBlockEntity.java | 24 ++- .../scenes/highLogistics/PonderHilo.java | 8 +- .../assets/create/lang/default/tooltips.json | 17 -- .../models/block/display_link/block.json | 165 ++++++++++-------- .../block/display_link/block_powered.json | 135 +++++++------- .../models/block/display_link/glow.json | 44 ++--- .../block/display_link/model_for_editing.json | 113 ++++++++++++ .../models/block/display_link/tube.json | 44 ++--- .../models/block/factory_gauge/item.json | 13 +- .../block/redstone_link/transmitter.json | 2 +- .../create/models/block/stock_link/block.json | 48 ----- .../block/stock_link/block_horizontal.json | 120 +++++++++++++ .../stock_link/block_horizontal_powered.json | 120 +++++++++++++ .../block/stock_link/block_powered.json | 6 - .../block/stock_link/block_vertical.json | 152 ++++++++++++++++ .../stock_link/block_vertical_powered.json | 120 +++++++++++++ .../stock_link/horizontal_for_editing.json | 128 ++++++++++++++ .../stock_link/vertical_for_editing.json | 128 ++++++++++++++ .../assets/create/particles/wifi.json | 20 +++ .../create/textures/block/display_link.png | Bin 1583 -> 0 bytes .../textures/block/display_link_side.png | Bin 221 -> 0 bytes .../block/display_link_side_powered.png | Bin 219 -> 0 bytes .../textures/block/link_base_powered.png | Bin 0 -> 1445 bytes .../textures/block/link_base_unpowered.png | Bin 0 -> 1447 bytes .../create/textures/block/link_details.png | Bin 0 -> 1633 bytes .../create/textures/particle/wifi_0.png | Bin 0 -> 363 bytes .../create/textures/particle/wifi_1.png | Bin 0 -> 384 bytes .../create/textures/particle/wifi_10.png | Bin 0 -> 463 bytes .../create/textures/particle/wifi_11.png | Bin 0 -> 438 bytes .../create/textures/particle/wifi_12.png | Bin 0 -> 395 bytes .../create/textures/particle/wifi_13.png | Bin 0 -> 363 bytes .../create/textures/particle/wifi_14.png | Bin 0 -> 363 bytes .../create/textures/particle/wifi_15.png | Bin 0 -> 363 bytes .../create/textures/particle/wifi_2.png | Bin 0 -> 420 bytes .../create/textures/particle/wifi_3.png | Bin 0 -> 421 bytes .../create/textures/particle/wifi_4.png | Bin 0 -> 449 bytes .../create/textures/particle/wifi_5.png | Bin 0 -> 474 bytes .../create/textures/particle/wifi_6.png | Bin 0 -> 478 bytes .../create/textures/particle/wifi_7.png | Bin 0 -> 483 bytes .../create/textures/particle/wifi_8.png | Bin 0 -> 483 bytes .../create/textures/particle/wifi_9.png | Bin 0 -> 476 bytes 62 files changed, 1409 insertions(+), 454 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkGenerator.java rename src/main/java/com/simibubi/create/content/logistics/packagerLink/{PackagerLinkEffectPacket.java => WiFiEffectPacket.java} (50%) create mode 100644 src/main/java/com/simibubi/create/content/logistics/packagerLink/WiFiParticle.java create mode 100644 src/main/resources/assets/create/models/block/display_link/model_for_editing.json delete mode 100644 src/main/resources/assets/create/models/block/stock_link/block.json create mode 100644 src/main/resources/assets/create/models/block/stock_link/block_horizontal.json create mode 100644 src/main/resources/assets/create/models/block/stock_link/block_horizontal_powered.json delete mode 100644 src/main/resources/assets/create/models/block/stock_link/block_powered.json create mode 100644 src/main/resources/assets/create/models/block/stock_link/block_vertical.json create mode 100644 src/main/resources/assets/create/models/block/stock_link/block_vertical_powered.json create mode 100644 src/main/resources/assets/create/models/block/stock_link/horizontal_for_editing.json create mode 100644 src/main/resources/assets/create/models/block/stock_link/vertical_for_editing.json create mode 100644 src/main/resources/assets/create/particles/wifi.json delete mode 100644 src/main/resources/assets/create/textures/block/display_link.png delete mode 100644 src/main/resources/assets/create/textures/block/display_link_side.png delete mode 100644 src/main/resources/assets/create/textures/block/display_link_side_powered.png create mode 100644 src/main/resources/assets/create/textures/block/link_base_powered.png create mode 100644 src/main/resources/assets/create/textures/block/link_base_unpowered.png create mode 100644 src/main/resources/assets/create/textures/block/link_details.png create mode 100644 src/main/resources/assets/create/textures/particle/wifi_0.png create mode 100644 src/main/resources/assets/create/textures/particle/wifi_1.png create mode 100644 src/main/resources/assets/create/textures/particle/wifi_10.png create mode 100644 src/main/resources/assets/create/textures/particle/wifi_11.png create mode 100644 src/main/resources/assets/create/textures/particle/wifi_12.png create mode 100644 src/main/resources/assets/create/textures/particle/wifi_13.png create mode 100644 src/main/resources/assets/create/textures/particle/wifi_14.png create mode 100644 src/main/resources/assets/create/textures/particle/wifi_15.png create mode 100644 src/main/resources/assets/create/textures/particle/wifi_2.png create mode 100644 src/main/resources/assets/create/textures/particle/wifi_3.png create mode 100644 src/main/resources/assets/create/textures/particle/wifi_4.png create mode 100644 src/main/resources/assets/create/textures/particle/wifi_5.png create mode 100644 src/main/resources/assets/create/textures/particle/wifi_6.png create mode 100644 src/main/resources/assets/create/textures/particle/wifi_7.png create mode 100644 src/main/resources/assets/create/textures/particle/wifi_8.png create mode 100644 src/main/resources/assets/create/textures/particle/wifi_9.png diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 386a902547..9c0109753c 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2025-01-17T00:09:44.5040448 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2025-01-18T13:14:26.2262033 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -569,7 +569,7 @@ a60c9c8241e40c2e28f5760c0ca6e80cfe9d59f3 assets/create/blockstates/steam_whistle 8865500bcd2e4d467e74edb3509850fa92a5809f assets/create/blockstates/sticker.json bed0534e618105184bc877b104230403ca85bb58 assets/create/blockstates/sticky_mechanical_piston.json c7c17ff17b98ce85d355f2f9b4509271bc283843 assets/create/blockstates/stockpile_switch.json -2d66ca4b6916eac170b3b8552705b699f569bae2 assets/create/blockstates/stock_link.json +d17e6ac368278bd60442e2f19eb064a31c4106d2 assets/create/blockstates/stock_link.json 9989bda294fbffc5f659d2e608e01dea424c7694 assets/create/blockstates/stock_ticker.json a70c025de5d85180f371ff05bbdc531d8bdfaab1 assets/create/blockstates/stressometer.json 8086f80c532fad42b37fcdc590b890ed7e8c3fe9 assets/create/blockstates/tiled_glass.json @@ -642,8 +642,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -7c975eddc8318d59bb77fa5667d4358f1bd168c5 assets/create/lang/en_ud.json -5bb378436e68d5a1428ac801c3bc5a4443f8b657 assets/create/lang/en_us.json +1c24597f2b10409d8b8cf6819dd8dfe41f2861f2 assets/create/lang/en_ud.json +575042f88772cd1553c19a924aa1d95d38cd93ba assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -2477,7 +2477,7 @@ b82ab0c69df330f6f938ed1beee7b4add67d2e50 assets/create/models/item/steam_engine. 54f200be903e056e5cf9e2186f0a0a51f8f0f84e assets/create/models/item/sticker.json 0f88de164439640cc175ceef2017f7416b5a7018 assets/create/models/item/sticky_mechanical_piston.json 4b640b66765b206f8c2884b7c1a1ef860b81d841 assets/create/models/item/stockpile_switch.json -c04a4ef6debb04d305d74d9b034c1e95c6b9e956 assets/create/models/item/stock_link.json +97222d9eb36944a89b8047423eafa6af3da82b0b assets/create/models/item/stock_link.json 67c98c6c7f2122850acfbee34688572934fdd226 assets/create/models/item/stock_ticker.json 6ee792277b9fd980c40e18e841afa63fc500ed0b assets/create/models/item/stressometer.json 8d4ce1ccf180016506292f63188c10d0dabe0ee3 assets/create/models/item/sturdy_sheet.json diff --git a/src/generated/resources/assets/create/blockstates/stock_link.json b/src/generated/resources/assets/create/blockstates/stock_link.json index 8b1c44ce75..d256e0a8f1 100644 --- a/src/generated/resources/assets/create/blockstates/stock_link.json +++ b/src/generated/resources/assets/create/blockstates/stock_link.json @@ -1,216 +1,200 @@ { "variants": { "face=ceiling,facing=east,powered=false,waterlogged=false": { - "model": "create:block/stock_link/block", + "model": "create:block/stock_link/block_vertical", "x": 180, "y": 270 }, "face=ceiling,facing=east,powered=false,waterlogged=true": { - "model": "create:block/stock_link/block", + "model": "create:block/stock_link/block_vertical", "x": 180, "y": 270 }, "face=ceiling,facing=east,powered=true,waterlogged=false": { - "model": "create:block/stock_link/block_powered", + "model": "create:block/stock_link/block_vertical_powered", "x": 180, "y": 270 }, "face=ceiling,facing=east,powered=true,waterlogged=true": { - "model": "create:block/stock_link/block_powered", + "model": "create:block/stock_link/block_vertical_powered", "x": 180, "y": 270 }, "face=ceiling,facing=north,powered=false,waterlogged=false": { - "model": "create:block/stock_link/block", + "model": "create:block/stock_link/block_vertical", "x": 180, "y": 180 }, "face=ceiling,facing=north,powered=false,waterlogged=true": { - "model": "create:block/stock_link/block", + "model": "create:block/stock_link/block_vertical", "x": 180, "y": 180 }, "face=ceiling,facing=north,powered=true,waterlogged=false": { - "model": "create:block/stock_link/block_powered", + "model": "create:block/stock_link/block_vertical_powered", "x": 180, "y": 180 }, "face=ceiling,facing=north,powered=true,waterlogged=true": { - "model": "create:block/stock_link/block_powered", + "model": "create:block/stock_link/block_vertical_powered", "x": 180, "y": 180 }, "face=ceiling,facing=south,powered=false,waterlogged=false": { - "model": "create:block/stock_link/block", + "model": "create:block/stock_link/block_vertical", "x": 180 }, "face=ceiling,facing=south,powered=false,waterlogged=true": { - "model": "create:block/stock_link/block", + "model": "create:block/stock_link/block_vertical", "x": 180 }, "face=ceiling,facing=south,powered=true,waterlogged=false": { - "model": "create:block/stock_link/block_powered", + "model": "create:block/stock_link/block_vertical_powered", "x": 180 }, "face=ceiling,facing=south,powered=true,waterlogged=true": { - "model": "create:block/stock_link/block_powered", + "model": "create:block/stock_link/block_vertical_powered", "x": 180 }, "face=ceiling,facing=west,powered=false,waterlogged=false": { - "model": "create:block/stock_link/block", + "model": "create:block/stock_link/block_vertical", "x": 180, "y": 90 }, "face=ceiling,facing=west,powered=false,waterlogged=true": { - "model": "create:block/stock_link/block", + "model": "create:block/stock_link/block_vertical", "x": 180, "y": 90 }, "face=ceiling,facing=west,powered=true,waterlogged=false": { - "model": "create:block/stock_link/block_powered", + "model": "create:block/stock_link/block_vertical_powered", "x": 180, "y": 90 }, "face=ceiling,facing=west,powered=true,waterlogged=true": { - "model": "create:block/stock_link/block_powered", + "model": "create:block/stock_link/block_vertical_powered", "x": 180, "y": 90 }, "face=floor,facing=east,powered=false,waterlogged=false": { - "model": "create:block/stock_link/block", - "y": 90 + "model": "create:block/stock_link/block_vertical", + "y": 270 }, "face=floor,facing=east,powered=false,waterlogged=true": { - "model": "create:block/stock_link/block", - "y": 90 + "model": "create:block/stock_link/block_vertical", + "y": 270 }, "face=floor,facing=east,powered=true,waterlogged=false": { - "model": "create:block/stock_link/block_powered", - "y": 90 + "model": "create:block/stock_link/block_vertical_powered", + "y": 270 }, "face=floor,facing=east,powered=true,waterlogged=true": { - "model": "create:block/stock_link/block_powered", - "y": 90 + "model": "create:block/stock_link/block_vertical_powered", + "y": 270 }, "face=floor,facing=north,powered=false,waterlogged=false": { - "model": "create:block/stock_link/block" + "model": "create:block/stock_link/block_vertical", + "y": 180 }, "face=floor,facing=north,powered=false,waterlogged=true": { - "model": "create:block/stock_link/block" + "model": "create:block/stock_link/block_vertical", + "y": 180 }, "face=floor,facing=north,powered=true,waterlogged=false": { - "model": "create:block/stock_link/block_powered" + "model": "create:block/stock_link/block_vertical_powered", + "y": 180 }, "face=floor,facing=north,powered=true,waterlogged=true": { - "model": "create:block/stock_link/block_powered" + "model": "create:block/stock_link/block_vertical_powered", + "y": 180 }, "face=floor,facing=south,powered=false,waterlogged=false": { - "model": "create:block/stock_link/block", - "y": 180 + "model": "create:block/stock_link/block_vertical" }, "face=floor,facing=south,powered=false,waterlogged=true": { - "model": "create:block/stock_link/block", - "y": 180 + "model": "create:block/stock_link/block_vertical" }, "face=floor,facing=south,powered=true,waterlogged=false": { - "model": "create:block/stock_link/block_powered", - "y": 180 + "model": "create:block/stock_link/block_vertical_powered" }, "face=floor,facing=south,powered=true,waterlogged=true": { - "model": "create:block/stock_link/block_powered", - "y": 180 + "model": "create:block/stock_link/block_vertical_powered" }, "face=floor,facing=west,powered=false,waterlogged=false": { - "model": "create:block/stock_link/block", - "y": 270 + "model": "create:block/stock_link/block_vertical", + "y": 90 }, "face=floor,facing=west,powered=false,waterlogged=true": { - "model": "create:block/stock_link/block", - "y": 270 + "model": "create:block/stock_link/block_vertical", + "y": 90 }, "face=floor,facing=west,powered=true,waterlogged=false": { - "model": "create:block/stock_link/block_powered", - "y": 270 + "model": "create:block/stock_link/block_vertical_powered", + "y": 90 }, "face=floor,facing=west,powered=true,waterlogged=true": { - "model": "create:block/stock_link/block_powered", - "y": 270 + "model": "create:block/stock_link/block_vertical_powered", + "y": 90 }, "face=wall,facing=east,powered=false,waterlogged=false": { - "model": "create:block/stock_link/block", - "x": 90, - "y": 90 + "model": "create:block/stock_link/block_horizontal", + "y": 270 }, "face=wall,facing=east,powered=false,waterlogged=true": { - "model": "create:block/stock_link/block", - "x": 90, - "y": 90 + "model": "create:block/stock_link/block_horizontal", + "y": 270 }, "face=wall,facing=east,powered=true,waterlogged=false": { - "model": "create:block/stock_link/block_powered", - "x": 90, - "y": 90 + "model": "create:block/stock_link/block_horizontal_powered", + "y": 270 }, "face=wall,facing=east,powered=true,waterlogged=true": { - "model": "create:block/stock_link/block_powered", - "x": 90, - "y": 90 + "model": "create:block/stock_link/block_horizontal_powered", + "y": 270 }, "face=wall,facing=north,powered=false,waterlogged=false": { - "model": "create:block/stock_link/block", - "x": 90 + "model": "create:block/stock_link/block_horizontal", + "y": 180 }, "face=wall,facing=north,powered=false,waterlogged=true": { - "model": "create:block/stock_link/block", - "x": 90 + "model": "create:block/stock_link/block_horizontal", + "y": 180 }, "face=wall,facing=north,powered=true,waterlogged=false": { - "model": "create:block/stock_link/block_powered", - "x": 90 + "model": "create:block/stock_link/block_horizontal_powered", + "y": 180 }, "face=wall,facing=north,powered=true,waterlogged=true": { - "model": "create:block/stock_link/block_powered", - "x": 90 + "model": "create:block/stock_link/block_horizontal_powered", + "y": 180 }, "face=wall,facing=south,powered=false,waterlogged=false": { - "model": "create:block/stock_link/block", - "x": 90, - "y": 180 + "model": "create:block/stock_link/block_horizontal" }, "face=wall,facing=south,powered=false,waterlogged=true": { - "model": "create:block/stock_link/block", - "x": 90, - "y": 180 + "model": "create:block/stock_link/block_horizontal" }, "face=wall,facing=south,powered=true,waterlogged=false": { - "model": "create:block/stock_link/block_powered", - "x": 90, - "y": 180 + "model": "create:block/stock_link/block_horizontal_powered" }, "face=wall,facing=south,powered=true,waterlogged=true": { - "model": "create:block/stock_link/block_powered", - "x": 90, - "y": 180 + "model": "create:block/stock_link/block_horizontal_powered" }, "face=wall,facing=west,powered=false,waterlogged=false": { - "model": "create:block/stock_link/block", - "x": 90, - "y": 270 + "model": "create:block/stock_link/block_horizontal", + "y": 90 }, "face=wall,facing=west,powered=false,waterlogged=true": { - "model": "create:block/stock_link/block", - "x": 90, - "y": 270 + "model": "create:block/stock_link/block_horizontal", + "y": 90 }, "face=wall,facing=west,powered=true,waterlogged=false": { - "model": "create:block/stock_link/block_powered", - "x": 90, - "y": 270 + "model": "create:block/stock_link/block_horizontal_powered", + "y": 90 }, "face=wall,facing=west,powered=true,waterlogged=true": { - "model": "create:block/stock_link/block_powered", - "x": 90, - "y": 270 + "model": "create:block/stock_link/block_horizontal_powered", + "y": 90 } } } \ No newline at end of file diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 30c8d32388..89cfd48e62 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -269,7 +269,6 @@ "block.create.cardboard_block": "pɹɐoqpɹɐƆ ɟo ʞɔoןᗺ", "block.create.cart_assembler": "ɹǝןqɯǝssⱯ ʇɹɐƆ", "block.create.chain_conveyor": "ɹoʎǝʌuoƆ uıɐɥƆ", - "block.create.chain_conveyor.tooltip.summary": "˙ǝpıɹ ɐ ǝʞɐʇ oʇ ɥɔuǝɹʍ ǝs∩ ˙ɯǝɥʇ uo sǝbɐʞɔɐd ʇɹodsuɐɹʇ oʇ sʇɹodboɹɟ ǝs∩ ˙sʞɹoʍʇǝu ɹoʎǝʌuoɔ ɯɹoɟ oʇ suıɐɥɔ ɥʇıʍ ʇɔǝuuoƆ ]ɹǝpuod[", "block.create.cherry_window": "ʍopuıM ʎɹɹǝɥƆ", "block.create.cherry_window_pane": "ǝuɐԀ ʍopuıM ʎɹɹǝɥƆ", "block.create.chocolate": "ǝʇɐןoɔoɥƆ", @@ -476,11 +475,6 @@ "block.create.exposed_copper_tile_stairs": "sɹıɐʇS ǝןı⟘ ɹǝddoƆ pǝsodxƎ", "block.create.exposed_copper_tiles": "sǝןı⟘ ɹǝddoƆ pǝsodxƎ", "block.create.factory_gauge": "ǝbnɐ⅁ ʎɹoʇɔɐℲ", - "block.create.factory_gauge.tooltip.behaviour1": "˙ssǝɹppɐ uɐ ʇǝs oʇ ןǝuɐd ǝɥʇ ʞɔıןɔ ʇɹoɥS ˙ɹǝuıɐʇuoɔ ǝɥʇ uı sı ʇunoɯɐ ʇǝbɹɐʇ ǝɥʇ ןıʇun ssǝɹppɐ pǝıɟıɔǝds ǝɥʇ oʇ ʞɹoʍʇǝu ǝɥʇ ɯoɹɟ sɯǝʇı sʇsǝnbǝɹ ןǝuɐԀ :ǝpoɯ ɹǝʞɔoʇsǝᴚ", - "block.create.factory_gauge.tooltip.behaviour2": "˙sןǝuɐd ɹǝɥʇo ɹoɟ ʇnduı uɐ sɐ pǝsnǝɹ ǝq osןɐ uɐɔ ɯǝʇı ʇndʇno uɐ buıʎɟıɔǝds sןǝuɐԀ ˙sɯǝʇı ʇnduı sɐ sןǝuɐd ɹǝɥʇo ʇɔǝuuoɔ puɐ ssǝɹppɐ uɐ ʇǝs oʇ ןǝuɐd ǝɥʇ ʞɔıןɔ ʇɹoɥS ˙)ʞɹoʍʇǝu uo sʞuɐןԀ ㄣ9 ʇsɐǝן ʇɐ ןıʇun 'sʞuɐןԀ 9 ʇɔǝdxǝ puɐ ,ʍɐs, oʇ boꞀ Ɩ puǝS ˙b˙ǝ( ʞɹoʍʇǝu ǝɥʇ uo punoɟ sı ɯǝʇı ʇndʇno ǝɥʇ ɟo pǝʇunoɯɐ ʇǝbɹɐʇ ǝɥʇ ןıʇun ssǝɹppɐ uɐ oʇ sʇuǝıpǝɹbuı sʇsǝnbǝɹ ןǝuɐԀ :ǝpoɯ ǝdıɔǝᴚ", - "block.create.factory_gauge.tooltip.condition1": "ɹǝbɐʞɔɐԀ oʇ pǝɥɔɐʇʇɐ uǝɥM", - "block.create.factory_gauge.tooltip.condition2": "ɹǝbɐʞɔɐԀ oʇ pǝɥɔɐʇʇɐ ʇou uǝɥM", - "block.create.factory_gauge.tooltip.summary": "˙ǝbɐɹoʇs uı uıɐʇuıɐɯ oʇ ʇunoɯɐ ʇǝbɹɐʇ ɐ ʎɟıɔǝds oʇ ʞɔıןɔ pןoH ˙ʇoןs ɹǝʇןıɟ uı ɹoʇıuoɯ oʇ ɯǝʇı ǝɔɐןԀ ˙ʎɔuǝnbǝɹɟ sʇı ǝsn oʇ ʇuǝɯǝɔɐןd ǝɹoɟǝq ʞuıן ʞɔoʇs ʞɔıןƆ ]ɹǝpuod[", "block.create.fake_track": "sdɐW ɹoɟ ɹǝʞɹɐW ʞɔɐɹ⟘", "block.create.fluid_pipe": "ǝdıԀ pınןℲ", "block.create.fluid_tank": "ʞuɐ⟘ pınןℲ", @@ -628,10 +622,7 @@ "block.create.oxidized_copper_tile_stairs": "sɹıɐʇS ǝןı⟘ ɹǝddoƆ pǝzıpıxO", "block.create.oxidized_copper_tiles": "sǝןı⟘ ɹǝddoƆ pǝzıpıxO", "block.create.package_frogport": "ʇɹodboɹℲ ǝbɐʞɔɐԀ", - "block.create.package_frogport.tooltip.summary": "˙ɐsɹǝʌ ǝɔıʌ puɐ suıɐɥɔ ɯoɹɟ pǝʌoɯǝɹ ǝq ןןıʍ sǝbɐʞɔɐd buıɥɔʇɐW ˙I∩ uı ɹǝʇןıɟ ssǝɹppɐ ʇǝS ˙ssǝɹppɐ ɹıǝɥʇ uo pǝsɐq suıɐɥɔ ɯoɹɟ puɐ oʇ sǝbɐʞɔɐd sǝʌoW ˙ǝɔɐןd uǝɥʇ ʞuıן oʇ ɹoʎǝʌuoɔ uıɐɥɔ ɐ ʞɔıןƆ ]ɹǝpuod[", - "block.create.package_postbox.tooltip.summary": "˙ɐsɹǝʌ ǝɔıʌ puɐ suıɐɹʇ ɯoɹɟ pǝʌoɯǝɹ ǝq ןןıʍ sǝbɐʞɔɐd buıɥɔʇɐW ˙I∩ uı ɹǝʇןıɟ ssǝɹppɐ ʇǝS ˙ssǝɹppɐ ɹıǝɥʇ uo pǝsɐq suıɐɹʇ ɯoɹɟ puɐ oʇ sǝbɐʞɔɐd sǝʌoW ˙ǝɔɐןd uǝɥʇ ʞuıן oʇ uoıʇɐʇs uıɐɹʇ ɐ ʞɔıןƆ ]ɹǝpuod[", "block.create.packager": "ɹǝbɐʞɔɐԀ", - "block.create.packager.tooltip.summary": "˙ʞɹoʍʇǝu sɔıʇsıboן ɐ oʇ sʇuǝʇuoɔ ʎɹoʇuǝʌuı ʇıɯqns oʇ ʞuıן ʞɔoʇs ɥɔɐʇʇɐ 'ʎןǝʌıʇɐuɹǝʇןⱯ ˙ssǝɹppɐ ʇǝbɹɐʇ ʎɟıɔǝds oʇ ubıs ɥɔɐʇʇⱯ ˙ǝuoʇspǝɹ uo ʎɹoʇuǝʌuı pǝɥɔɐʇʇɐ ɯoɹɟ sǝbɐʞɔɐd sǝʇɐǝɹƆ ]ɹǝpuod[", "block.create.peculiar_bell": "ןןǝᗺ ɹɐıןnɔǝԀ", "block.create.peculiar_bell.tooltip.summary": "˙˙˙sʇɔǝɟɟǝ-ǝpıs ǝʌɐɥ ʎɐɯ ‾ǝɹıℲ ןnoS‾ uǝdo ǝʌoqɐ ʇɥbıɹ ʇı buıɔɐןԀ ˙‾ןןǝᗺ ssɐɹᗺ‾ ǝʌıʇɐɹoɔǝp Ɐ", "block.create.pink_nixie_tube": "ǝqn⟘ ǝıxıN ʞuıԀ", @@ -713,7 +704,6 @@ "block.create.pulse_extender": "ɹǝpuǝʇxƎ ǝsןnԀ", "block.create.pulse_repeater": "ɹǝʇɐǝdǝᴚ ǝsןnԀ", "block.create.pulse_timer": "ɹǝɯı⟘ ǝsןnԀ", - "block.create.pulse_timer.tooltip.summary": "˙ןɐubıs ʇuɐʇsuoɔ ɐ ʎq pǝɹǝʍod sı ǝpıs ʇnduı ǝɥʇ ssǝןun sǝsןnd ǝuoʇspǝɹ sʇıɯǝ ʎןpǝʇɐǝdǝᴚ ˙ʇoןs ʇnduı ǝɥʇ buısn ʎɐןǝp ɐ ʇǝS ]ɹǝpuod[", "block.create.purple_nixie_tube": "ǝqn⟘ ǝıxıN ǝןdɹnԀ", "block.create.purple_postbox": "xoqʇsoԀ ǝןdɹnԀ", "block.create.purple_sail": "ןıɐS ǝןdɹnԀ", @@ -734,7 +724,6 @@ "block.create.redstone_contact": "ʇɔɐʇuoƆ ǝuoʇspǝᴚ", "block.create.redstone_link": "ʞuıꞀ ǝuoʇspǝᴚ", "block.create.redstone_requester": "ɹǝʇsǝnbǝᴚ ǝuoʇspǝᴚ", - "block.create.redstone_requester.tooltip.summary": "˙ʇuǝɯǝɔɐןd ǝɹoɟǝq ɹǝdǝǝʞ ʞɔoʇs ɐ ʇɐ pǝɹnbıɟuoɔ ǝq uɐɔ ʇsǝnbǝɹ sıɥʇ ʎןǝʌıʇɐuɹǝʇןⱯ ˙pǝʌıǝɔǝɹ sı ǝsןnd ǝuoʇspǝɹ ɐ uǝɥʍ ssǝɹppɐ uɐ oʇ pǝʇsǝnbǝɹ sɯǝʇı ʎɟıɔǝds oʇ I∩ uǝdO ˙ʎɔuǝnbǝɹɟ sʇı ǝsn oʇ ʇuǝɯǝɔɐןd ǝɹoɟǝq ʞuıן ʞɔoʇs ʞɔıןƆ ]ɹǝpuod[", "block.create.refined_radiance_casing": "buısɐƆ ʇuɐıpɐᴚ", "block.create.repackager": "ɹǝbɐʞɔɐԀ-ǝᴚ", "block.create.rope": "ǝdoᴚ", @@ -833,12 +822,9 @@ "block.create.sticker": "ɹǝʞɔıʇS", "block.create.sticky_mechanical_piston": "uoʇsıԀ ןɐɔıuɐɥɔǝW ʎʞɔıʇS", "block.create.stock_link": "ʞuıꞀ ʞɔoʇS", - "block.create.stock_link.tooltip.summary": "suoıʇɐʇıɯıן ǝbuɐɹ oN ˙ʎɔuǝnbǝɹɟ ɹıǝɥʇ ǝɹɐɥs oʇ ʇuǝɯǝɔɐןd ǝɹoɟǝq sʞuıן ɹǝɥʇo ʞɔıןƆ ˙ɯoɹɟ ʇsǝnbǝɹ oʇ ǝןqɐןıɐʌɐ ʎɹoʇuǝʌuı ʇǝbɹɐʇ sʇı ǝʞɐɯ oʇ ɹǝbɐʞɔɐd oʇ ɥɔɐʇʇⱯ ]ɹǝpuod[", "block.create.stock_ticker": "ɹǝʞɔı⟘ ʞɔoʇS", - "block.create.stock_ticker.tooltip.summary": "˙sǝıɹobǝʇɐɔ oʇuı sɯǝʇı pǝʎɐןdsıp ǝsıuɐbɹo oʇ ʞɔoןq ɹǝʞɔıʇ ʞɔoʇs ǝɥʇ ʞɔıןƆ ˙ssǝɹppɐ uǝʌıb ɐ oʇ sɹǝbɐʞɔɐd pǝʞuıן ʎuɐ ɯoɹɟ sɯǝʇı ʇsǝnbǝɹ oʇ ʎʇıʇuǝ ǝɥʇ ʞɔıןƆ ˙ɹǝdǝǝʞ ʞɔoʇs sʇı sɐ ʇɐǝs ɐ uo ʎʇıʇuǝ ʇuǝɔɐظpɐ uɐ spǝǝN ˙ʎɔuǝnbǝɹɟ sʇı ǝsn oʇ ʇuǝɯǝɔɐןd ǝɹoɟǝq ʞuıן ʞɔoʇs ʞɔıןƆ ]ɹǝpuod[", "block.create.stockpile_switch": "ɥɔʇıʍS pןoɥsǝɹɥ⟘", "block.create.stressometer": "ɹǝʇǝɯossǝɹʇS", - "block.create.table_cloth.tooltip.summary": "˙ɥʇoןɔ ǝןqɐʇ pǝɹnbıɟuoɔ ǝɥʇ buıɔɐןd ɹǝʇɟɐ pǝıɟıɔǝds ǝq uɐɔ ʇsoɔ ǝɥ⟘ ˙sɹǝʎɐןd ɹǝɥʇo ʎq pǝsɐɥɔɹnd ǝq uɐɔ ʇɐɥʇ ʞɹoʍʇǝu ɹnoʎ ɯoɹɟ ʇsǝnbǝɹ ɐ ʎɟıɔǝds 'ɹǝdǝǝʞ ʞɔoʇs ɐ uo pǝsn uǝɥʍ 'ʎןǝʌıʇɐuɹǝʇןⱯ ˙ɯǝɥʇ ʎɐןdsıp oʇ ɯǝʇı ɥʇıʍ ʞɔıןɔ 'uoıʇɐɹoɔǝp ɹoɟ pǝsn ǝq uɐƆ ]ɹǝpuod[", "block.create.tiled_glass": "ssɐן⅁ pǝןı⟘", "block.create.tiled_glass_pane": "ǝuɐԀ ssɐן⅁ pǝןı⟘", "block.create.toolbox.tooltip.behaviour1": "˙‾sʇuǝʇuoƆ‾ ʎɹoʇuǝʌuI ‾suıɐʇǝᴚ‾", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 1ef1098357..356411de31 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -269,7 +269,6 @@ "block.create.cardboard_block": "Block of Cardboard", "block.create.cart_assembler": "Cart Assembler", "block.create.chain_conveyor": "Chain Conveyor", - "block.create.chain_conveyor.tooltip.summary": "[ponder] Connect with chains to form conveyor networks. Use frogports to transport packages on them. Use wrench to take a ride.", "block.create.cherry_window": "Cherry Window", "block.create.cherry_window_pane": "Cherry Window Pane", "block.create.chocolate": "Chocolate", @@ -476,11 +475,6 @@ "block.create.exposed_copper_tile_stairs": "Exposed Copper Tile Stairs", "block.create.exposed_copper_tiles": "Exposed Copper Tiles", "block.create.factory_gauge": "Factory Gauge", - "block.create.factory_gauge.tooltip.behaviour1": "Restocker mode: Panel requests items from the network to the specified address until the target amount is in the container. Short click the panel to set an address.", - "block.create.factory_gauge.tooltip.behaviour2": "Recipe mode: Panel requests ingredients to an address until the target amounted of the output item is found on the network (e.g. Send 1 Log to 'saw' and expect 6 Planks, until at least 64 Planks on network). Short click the panel to set an address and connect other panels as input items. Panels specifying an output item can also be reused as an input for other panels.", - "block.create.factory_gauge.tooltip.condition1": "When attached to Packager", - "block.create.factory_gauge.tooltip.condition2": "When not attached to Packager", - "block.create.factory_gauge.tooltip.summary": "[ponder] Click stock link before placement to use its frequency. Place item to monitor in filter slot. Hold click to specify a target amount to maintain in storage.", "block.create.fake_track": "Track Marker for Maps", "block.create.fluid_pipe": "Fluid Pipe", "block.create.fluid_tank": "Fluid Tank", @@ -628,10 +622,7 @@ "block.create.oxidized_copper_tile_stairs": "Oxidized Copper Tile Stairs", "block.create.oxidized_copper_tiles": "Oxidized Copper Tiles", "block.create.package_frogport": "Package Frogport", - "block.create.package_frogport.tooltip.summary": "[ponder] Click a chain conveyor to link then place. Moves packages to and from chains based on their address. Set address filter in UI. Matching packages will be removed from chains and vice versa.", - "block.create.package_postbox.tooltip.summary": "[ponder] Click a train station to link then place. Moves packages to and from trains based on their address. Set address filter in UI. Matching packages will be removed from trains and vice versa.", "block.create.packager": "Packager", - "block.create.packager.tooltip.summary": "[ponder] Creates packages from attached inventory on redstone. Attach sign to specify target address. Alternatively, attach stock link to submit inventory contents to a logistics network.", "block.create.peculiar_bell": "Peculiar Bell", "block.create.peculiar_bell.tooltip.summary": "A decorative _Brass Bell_. Placing it right above open _Soul Fire_ may have side-effects...", "block.create.pink_nixie_tube": "Pink Nixie Tube", @@ -713,7 +704,6 @@ "block.create.pulse_extender": "Pulse Extender", "block.create.pulse_repeater": "Pulse Repeater", "block.create.pulse_timer": "Pulse Timer", - "block.create.pulse_timer.tooltip.summary": "[ponder] Set a delay using the input slot. Repeatedly emits redstone pulses unless the input side is powered by a constant signal.", "block.create.purple_nixie_tube": "Purple Nixie Tube", "block.create.purple_postbox": "Purple Postbox", "block.create.purple_sail": "Purple Sail", @@ -734,7 +724,6 @@ "block.create.redstone_contact": "Redstone Contact", "block.create.redstone_link": "Redstone Link", "block.create.redstone_requester": "Redstone Requester", - "block.create.redstone_requester.tooltip.summary": "[ponder] Click stock link before placement to use its frequency. Open UI to specify items requested to an address when a redstone pulse is received. Alternatively this request can be configured at a stock keeper before placement.", "block.create.refined_radiance_casing": "Radiant Casing", "block.create.repackager": "Re-Packager", "block.create.rope": "Rope", @@ -833,12 +822,9 @@ "block.create.sticker": "Sticker", "block.create.sticky_mechanical_piston": "Sticky Mechanical Piston", "block.create.stock_link": "Stock Link", - "block.create.stock_link.tooltip.summary": "[ponder] Attach to packager to make its target inventory available to request from. Click other links before placement to share their frequency. No range limitations", "block.create.stock_ticker": "Stock Ticker", - "block.create.stock_ticker.tooltip.summary": "[ponder] Click stock link before placement to use its frequency. Needs an adjacent entity on a seat as its stock keeper. Click the entity to request items from any linked packagers to a given address. Click the stock ticker block to organise displayed items into categories.", "block.create.stockpile_switch": "Threshold Switch", "block.create.stressometer": "Stressometer", - "block.create.table_cloth.tooltip.summary": "[ponder] Can be used for decoration, click with item to display them. Alternatively, when used on a stock keeper, specify a request from your network that can be purchased by other players. The cost can be specified after placing the configured table cloth.", "block.create.tiled_glass": "Tiled Glass", "block.create.tiled_glass_pane": "Tiled Glass Pane", "block.create.toolbox.tooltip.behaviour1": "_Retains_ Inventory _Contents_.", diff --git a/src/generated/resources/assets/create/models/item/stock_link.json b/src/generated/resources/assets/create/models/item/stock_link.json index 65fae657f8..498a66c399 100644 --- a/src/generated/resources/assets/create/models/item/stock_link.json +++ b/src/generated/resources/assets/create/models/item/stock_link.json @@ -1,3 +1,3 @@ { - "parent": "create:block/stock_link/block" + "parent": "create:block/stock_link/block_vertical" } \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java index b74b4ca8ab..227b2a5684 100644 --- a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java +++ b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java @@ -529,10 +529,11 @@ public class AllBlockEntityTypes { .renderer(() -> TableClothRenderer::new) .register(); - public static final BlockEntityEntry PACKAGER_LINK = REGISTRATE - .blockEntity("packager_link", PackagerLinkBlockEntity::new) - .validBlocks(AllBlocks.STOCK_LINK) - .register(); + public static final BlockEntityEntry PACKAGER_LINK = + REGISTRATE.blockEntity("packager_link", PackagerLinkBlockEntity::new) + .validBlocks(AllBlocks.STOCK_LINK) + .renderer(() -> LinkBulbRenderer::new) + .register(); public static final BlockEntityEntry STOCK_TICKER = REGISTRATE .blockEntity("stock_ticker", StockTickerBlockEntity::new) diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 0f55a94dc4..0ff794f809 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -188,6 +188,7 @@ import com.simibubi.create.content.logistics.packager.PackagerBlock; import com.simibubi.create.content.logistics.packager.repackager.RepackagerBlock; import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedBlockItem; import com.simibubi.create.content.logistics.packagerLink.PackagerLinkBlock; +import com.simibubi.create.content.logistics.packagerLink.PackagerLinkGenerator; import com.simibubi.create.content.logistics.redstoneRequester.RedstoneRequesterBlock; import com.simibubi.create.content.logistics.redstoneRequester.RedstoneRequesterBlockItem; import com.simibubi.create.content.logistics.stockTicker.StockTickerBlock; @@ -1923,9 +1924,9 @@ public class AllBlocks { .properties(p -> p.mapColor(MapColor.TERRACOTTA_BLUE) .sound(SoundType.NETHERITE_BLOCK)) .transform(pickaxeOnly()) - .blockstate((c, p) -> p.horizontalFaceBlock(c.get(), AssetLookup.forPowered(c, p))) + .blockstate(new PackagerLinkGenerator()::generate) .item(LogisticallyLinkedBlockItem::new) - .transform(customItemModel("_", "block")) + .transform(customItemModel("_", "block_vertical")) .register(); public static final BlockEntry STOCK_TICKER = diff --git a/src/main/java/com/simibubi/create/AllPackets.java b/src/main/java/com/simibubi/create/AllPackets.java index bc2ae469f4..cf771352b4 100644 --- a/src/main/java/com/simibubi/create/AllPackets.java +++ b/src/main/java/com/simibubi/create/AllPackets.java @@ -69,7 +69,7 @@ import com.simibubi.create.content.logistics.filter.FilterScreenPacket; import com.simibubi.create.content.logistics.funnel.FunnelFlapPacket; import com.simibubi.create.content.logistics.packagePort.PackagePortConfigurationPacket; import com.simibubi.create.content.logistics.packagePort.PackagePortPlacementPacket; -import com.simibubi.create.content.logistics.packagerLink.PackagerLinkEffectPacket; +import com.simibubi.create.content.logistics.packagerLink.WiFiEffectPacket; import com.simibubi.create.content.logistics.redstoneRequester.RedstoneRequesterConfigurationPacket; import com.simibubi.create.content.logistics.redstoneRequester.RedstoneRequesterEffectPacket; import com.simibubi.create.content.logistics.stockTicker.LogisticalStockRequestPacket; @@ -255,7 +255,7 @@ public enum AllPackets { PACKAGE_DESTROYED(PackageDestroyPacket.class, PackageDestroyPacket::new, PLAY_TO_CLIENT), LOGISTICS_STOCK_RESPONSE(LogisticalStockResponsePacket.class, LogisticalStockResponsePacket::new, PLAY_TO_CLIENT), FACTORY_PANEL_EFFECT(FactoryPanelEffectPacket.class, FactoryPanelEffectPacket::new, PLAY_TO_CLIENT), - PACKAGER_LINK_EFFECT(PackagerLinkEffectPacket.class, PackagerLinkEffectPacket::new, PLAY_TO_CLIENT), + PACKAGER_LINK_EFFECT(WiFiEffectPacket.class, WiFiEffectPacket::new, PLAY_TO_CLIENT), REDSTONE_REQUESTER_EFFECT(RedstoneRequesterEffectPacket.class, RedstoneRequesterEffectPacket::new, PLAY_TO_CLIENT), KNOCKBACK(KnockbackPacket.class, KnockbackPacket::new, PLAY_TO_CLIENT), TRAIN_MAP_SYNC(TrainMapSyncPacket.class, TrainMapSyncPacket::new, PLAY_TO_CLIENT), diff --git a/src/main/java/com/simibubi/create/AllParticleTypes.java b/src/main/java/com/simibubi/create/AllParticleTypes.java index 7cb2b0a653..644080d4aa 100644 --- a/src/main/java/com/simibubi/create/AllParticleTypes.java +++ b/src/main/java/com/simibubi/create/AllParticleTypes.java @@ -8,6 +8,7 @@ import com.simibubi.create.content.fluids.particle.FluidParticleData; import com.simibubi.create.content.kinetics.base.RotationIndicatorParticleData; import com.simibubi.create.content.kinetics.fan.AirFlowParticleData; import com.simibubi.create.content.kinetics.steamEngine.SteamJetParticleData; +import com.simibubi.create.content.logistics.packagerLink.WiFiParticle; import com.simibubi.create.content.trains.CubeParticleData; import com.simibubi.create.foundation.particle.AirParticleData; import com.simibubi.create.foundation.particle.ICustomParticleData; @@ -33,6 +34,7 @@ public enum AllParticleTypes { FLUID_PARTICLE(FluidParticleData::new), BASIN_FLUID(FluidParticleData::new), FLUID_DRIP(FluidParticleData::new), + WIFI(WiFiParticle.Data::new), SOUL(SoulParticle.Data::new), SOUL_BASE(SoulBaseParticle.Data::new), SOUL_PERIMETER(SoulParticle.PerimeterData::new), diff --git a/src/main/java/com/simibubi/create/AllShapes.java b/src/main/java/com/simibubi/create/AllShapes.java index 9f7ebdca61..a98a2fe380 100644 --- a/src/main/java/com/simibubi/create/AllShapes.java +++ b/src/main/java/com/simibubi/create/AllShapes.java @@ -151,7 +151,7 @@ public class AllShapes { DATA_GATHERER = shape(1, 0, 1, 15, 6, 15).add(3, 5, 3, 13, 9, 13) .forDirectional(), - STOCK_LINK = shape(1, 0, 1, 15, 6, 15).forDirectional(), + STOCK_LINK = shape(1, 0, 1, 15, 5, 15).forDirectional(), STEAM_ENGINE = shape(1, 0, 1, 15, 3, 15).add(3, 0, 3, 13, 15, 13) .add(1, 5, 4, 15, 13, 12) diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java index b8bb2b27a3..897d8796eb 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java @@ -24,6 +24,7 @@ import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedBeha import com.simibubi.create.content.logistics.packagerLink.PackagerLinkBlock; import com.simibubi.create.content.logistics.packagerLink.PackagerLinkBlockEntity; import com.simibubi.create.content.logistics.packagerLink.RequestPromiseQueue; +import com.simibubi.create.content.logistics.packagerLink.WiFiEffectPacket; import com.simibubi.create.content.logistics.stockTicker.PackageOrder; import com.simibubi.create.content.processing.basin.BasinBlockEntity; import com.simibubi.create.foundation.advancement.AdvancementBehaviour; @@ -80,7 +81,7 @@ public class PackagerBlockEntity extends SmartBlockEntity { private InventorySummary availableItems; private VersionedInventoryTrackerBehaviour invVersionTracker; - + private AdvancementBehaviour advancements; // @@ -124,7 +125,7 @@ public class PackagerBlockEntity extends SmartBlockEntity { if (buttonCooldown > 0) buttonCooldown--; - + if (animationTicks == 0) { previouslyUnwrapped = ItemStack.EMPTY; @@ -283,6 +284,18 @@ public class PackagerBlockEntity extends SmartBlockEntity { return false; } + public void flashLink() { + for (Direction d : Iterate.directions) { + BlockState adjacentState = level.getBlockState(worldPosition.relative(d)); + if (!AllBlocks.STOCK_LINK.has(adjacentState)) + continue; + if (PackagerLinkBlock.getConnectedDirection(adjacentState) != d) + continue; + WiFiEffectPacket.send(level, worldPosition.relative(d)); + return; + } + } + public boolean isTooBusyFor(RequestType type) { int queue = queuedExitingPackages.size(); return queue >= switch (type) { @@ -540,7 +553,7 @@ public class PackagerBlockEntity extends SmartBlockEntity { heldBox = createdBox; animationInward = false; animationTicks = CYCLE; - + advancements.awardPlayer(AllAdvancements.PACKAGER); triggerStockCheck(); notifyUpdate(); diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsManager.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsManager.java index f2170912df..33e302d601 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsManager.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticsManager.java @@ -66,7 +66,7 @@ public class LogisticsManager { IItemHandler ignoredHandler, String address) { if (order.isEmpty()) return false; - + Multimap requests = findPackagersForRequest(freqId, order, null, ignoredHandler, address); @@ -144,6 +144,8 @@ public class LogisticsManager { ArrayList queuedRequests = new ArrayList<>(entry.getValue()); PackagerBlockEntity packager = entry.getKey(); + if (!queuedRequests.isEmpty()) + packager.flashLink(); for (int i = 0; i < 100; i++) { if (queuedRequests.isEmpty()) break; diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlock.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlock.java index 13355e4814..dd82ce5fc2 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlock.java @@ -47,7 +47,7 @@ public class PackagerLinkBlock extends FaceAttachedHorizontalDirectionalBlock BlockState placed = super.getStateForPlacement(context); if (placed == null) return null; - if (placed.getValue(FACE) == AttachFace.FLOOR) + if (placed.getValue(FACE) == AttachFace.CEILING) placed = placed.setValue(FACING, placed.getValue(FACING) .getOpposite()); return withWater(placed.setValue(POWERED, getPower(placed, context.getLevel(), pos) > 0), context); diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java index 85f4dedeaa..a21acdf816 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java @@ -1,34 +1,38 @@ package com.simibubi.create.content.logistics.packagerLink; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.UUID; import javax.annotation.Nullable; import org.apache.commons.lang3.mutable.MutableBoolean; -import com.simibubi.create.AllPackets; import com.simibubi.create.AllSoundEvents; import com.simibubi.create.content.logistics.packager.InventorySummary; import com.simibubi.create.content.logistics.packager.PackagerBlockEntity; import com.simibubi.create.content.logistics.packager.PackagingRequest; import com.simibubi.create.content.logistics.packager.repackager.RepackagerBlockEntity; import com.simibubi.create.content.logistics.stockTicker.PackageOrder; -import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; +import com.simibubi.create.content.redstone.displayLink.LinkWithBulbBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; import net.createmod.catnip.utility.Pair; +import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.utility.math.AngleHelper; import net.minecraft.core.BlockPos; -import net.minecraft.core.particles.VibrationParticleOption; +import net.minecraft.core.Direction; +import net.minecraft.core.Direction.Axis; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.gameevent.BlockPositionSource; +import net.minecraft.world.level.block.state.properties.AttachFace; import net.minecraft.world.phys.Vec3; import net.minecraftforge.items.IItemHandler; -public class PackagerLinkBlockEntity extends SmartBlockEntity { +public class PackagerLinkBlockEntity extends LinkWithBulbBlockEntity { public LogisticallyLinkedBehaviour behaviour; public UUID placedBy; @@ -51,8 +55,24 @@ public class PackagerLinkBlockEntity extends SmartBlockEntity { public void playEffect() { AllSoundEvents.STOCK_LINK.playAt(level, worldPosition, 1.0f, 1.0f, false); Vec3 vec3 = Vec3.atCenterOf(worldPosition); - level.addParticle(new VibrationParticleOption(new BlockPositionSource(worldPosition.above(3)), 6), vec3.x, - vec3.y, vec3.z, 1, 1, 1); + + BlockState state = getBlockState(); + float f = 1; + + AttachFace face = state.getOptionalValue(PackagerLinkBlock.FACE) + .orElse(AttachFace.FLOOR); + if (face != AttachFace.FLOOR) + f = -1; + if (face == AttachFace.WALL) + vec3 = vec3.add(0, 0.25, 0); + + vec3 = vec3.add(Vec3.atLowerCornerOf(state.getOptionalValue(PackagerLinkBlock.FACING) + .orElse(Direction.SOUTH) + .getNormal()) + .scale(f * 0.125)); + + pulse(); + level.addParticle(new WiFiParticle.Data(), vec3.x, vec3.y, vec3.z, 1, face == AttachFace.CEILING ? -1 : 1, 1); } public Pair processRequest(ItemStack stack, int amount, String address, @@ -69,8 +89,6 @@ public class PackagerLinkBlockEntity extends SmartBlockEntity { if (availableCount == 0) return null; int toWithdraw = Math.min(amount, availableCount); - if (toWithdraw != 0) - AllPackets.sendToNear(level, worldPosition, 32, new PackagerLinkEffectPacket(worldPosition)); return Pair.of(packager, PackagingRequest.create(stack, toWithdraw, address, linkIndex, finalLink, 0, orderId, orderContext)); } @@ -116,4 +134,27 @@ public class PackagerLinkBlockEntity extends SmartBlockEntity { return packager; } + @Override + public Direction getBulbFacing(BlockState state) { + return PackagerLinkBlock.getConnectedDirection(state); + } + + private static final Map bulbOffsets = new HashMap<>(); + + @Override + public Vec3 getBulbOffset(BlockState state) { + return bulbOffsets.computeIfAbsent(state, s -> { + Vec3 offset = VecHelper.voxelSpace(5, 6, 11); + Vec3 wallOffset = VecHelper.voxelSpace(11, 6, 5); + AttachFace face = s.getValue(PackagerLinkBlock.FACE); + Vec3 vec = face == AttachFace.WALL ? wallOffset : offset; + float angle = AngleHelper.horizontalAngle(s.getValue(PackagerLinkBlock.FACING)); + if (face == AttachFace.CEILING) + angle = -angle; + if (face == AttachFace.WALL) + angle = 0; + return VecHelper.rotateCentered(vec, angle, Axis.Y); + }); + } + } diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkGenerator.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkGenerator.java new file mode 100644 index 0000000000..ec1e441972 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkGenerator.java @@ -0,0 +1,37 @@ +package com.simibubi.create.content.logistics.packagerLink; + +import com.simibubi.create.foundation.data.SpecialBlockStateGen; +import com.tterrag.registrate.providers.DataGenContext; +import com.tterrag.registrate.providers.RegistrateBlockstateProvider; + +import net.minecraft.core.Direction; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.AttachFace; +import net.minecraftforge.client.model.generators.ModelFile; + +public class PackagerLinkGenerator extends SpecialBlockStateGen { + + @Override + protected int getXRotation(BlockState state) { + return state.getValue(PackagerLinkBlock.FACE) == AttachFace.CEILING ? 180 : 0; + } + + @Override + protected int getYRotation(BlockState state) { + Direction facing = state.getValue(PackagerLinkBlock.FACING); + return horizontalAngle(facing); + } + + @Override + public ModelFile getModel(DataGenContext ctx, RegistrateBlockstateProvider prov, + BlockState state) { + String variant = + state.getValue(PackagerLinkBlock.FACE) == AttachFace.WALL ? "block_horizontal" : "block_vertical"; + if (state.getValue(PackagerLinkBlock.POWERED)) + variant += "_powered"; + return prov.models() + .getExistingFile(prov.modLoc("block/stock_link/" + variant)); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkEffectPacket.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/WiFiEffectPacket.java similarity index 50% rename from src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkEffectPacket.java rename to src/main/java/com/simibubi/create/content/logistics/packagerLink/WiFiEffectPacket.java index d47525db94..fc19698c24 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkEffectPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/WiFiEffectPacket.java @@ -1,23 +1,31 @@ package com.simibubi.create.content.logistics.packagerLink; +import com.simibubi.create.AllPackets; +import com.simibubi.create.content.logistics.stockTicker.StockTickerBlockEntity; import com.simibubi.create.foundation.networking.SimplePacketBase; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.network.NetworkEvent.Context; -public class PackagerLinkEffectPacket extends SimplePacketBase { +public class WiFiEffectPacket extends SimplePacketBase { private BlockPos pos; + + public static void send(Level level, BlockPos pos) { + AllPackets.sendToNear(level, pos, 32, new WiFiEffectPacket(pos)); + } - public PackagerLinkEffectPacket(BlockPos pos) { + public WiFiEffectPacket(BlockPos pos) { this.pos = pos; } - public PackagerLinkEffectPacket(FriendlyByteBuf buffer) { + public WiFiEffectPacket(FriendlyByteBuf buffer) { pos = buffer.readBlockPos(); } @@ -30,7 +38,10 @@ public class PackagerLinkEffectPacket extends SimplePacketBase { @OnlyIn(Dist.CLIENT) public boolean handle(Context context) { context.enqueueWork(() -> { - if (Minecraft.getInstance().level.getBlockEntity(pos) instanceof PackagerLinkBlockEntity plbe) + BlockEntity blockEntity = Minecraft.getInstance().level.getBlockEntity(pos); + if (blockEntity instanceof PackagerLinkBlockEntity plbe) + plbe.playEffect(); + if (blockEntity instanceof StockTickerBlockEntity plbe) plbe.playEffect(); }); return true; diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/WiFiParticle.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/WiFiParticle.java new file mode 100644 index 0000000000..a9f157bf93 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/WiFiParticle.java @@ -0,0 +1,61 @@ +package com.simibubi.create.content.logistics.packagerLink; + +import org.joml.Quaternionf; + +import com.simibubi.create.AllParticleTypes; +import com.simibubi.create.content.equipment.bell.BasicParticleData; +import com.simibubi.create.content.equipment.bell.CustomRotationParticle; + +import net.minecraft.client.Camera; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.particle.SpriteSet; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.core.particles.ParticleType; +import net.minecraft.util.Mth; + +public class WiFiParticle extends CustomRotationParticle { + + private SpriteSet animatedSprite; + private boolean downward; + + public WiFiParticle(ClientLevel worldIn, double x, double y, double z, double vx, double vy, double vz, + SpriteSet spriteSet) { + super(worldIn, x, y + (vy < 0 ? -1 : 1), z, spriteSet, 0); + this.animatedSprite = spriteSet; + this.quadSize = 0.5f; + this.setSize(this.quadSize, this.quadSize); + this.loopLength = 16; + this.lifetime = 16; + this.setSpriteFromAge(spriteSet); + this.stoppedByCollision = true; // disable movement + this.downward = vy < 0; + } + + @Override + public void tick() { + setSpriteFromAge(animatedSprite); + if (age++ >= lifetime) + remove(); + } + + @Override + public Quaternionf getCustomRotation(Camera camera, float partialTicks) { + return new Quaternionf().rotateY(-camera.getYRot() * Mth.DEG_TO_RAD) + .mul(new Quaternionf().rotateZ(downward ? Mth.PI : 0)); + } + + public static class Data extends BasicParticleData implements ParticleOptions { + + @Override + public IBasicParticleFactory getBasicFactory() { + return WiFiParticle::new; + } + + @Override + public ParticleType getType() { + return AllParticleTypes.WIFI.get(); + } + + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrderRequestPacket.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrderRequestPacket.java index ce3caa5132..9089885278 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrderRequestPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/PackageOrderRequestPacket.java @@ -2,6 +2,7 @@ package com.simibubi.create.content.logistics.stockTicker; import com.simibubi.create.AllSoundEvents; import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedBehaviour.RequestType; +import com.simibubi.create.content.logistics.packagerLink.WiFiEffectPacket; import com.simibubi.create.content.logistics.redstoneRequester.RedstoneRequesterBlock; import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.networking.BlockEntityConfigurationPacket; @@ -53,10 +54,11 @@ public class PackageOrderRequestPacket extends BlockEntityConfigurationPacket type, BlockPos pos, BlockState state) { super(type, pos, state); glow = LerpedFloat.linear() .startWithValue(0); glow.chase(0, 0.5f, Chaser.EXP); } - + @Override public void tick() { super.tick(); if (isVirtual() || level.isClientSide()) glow.tickChaser(); } - + public float getGlow(float partialTicks) { return glow.getValue(partialTicks); } - + public void sendPulseNextSync() { sendPulse = true; } - + public void pulse() { glow.setValue(2); } - + @Override protected void write(CompoundTag tag, boolean clientPacket) { super.write(tag, clientPacket); @@ -49,7 +51,7 @@ public abstract class LinkWithBulbBlockEntity extends SmartBlockEntity { NBTHelper.putMarker(tag, "Pulse"); } } - + @Override protected void read(CompoundTag tag, boolean clientPacket) { super.read(tag, clientPacket); @@ -57,4 +59,12 @@ public abstract class LinkWithBulbBlockEntity extends SmartBlockEntity { pulse(); } + public Vec3 getBulbOffset(BlockState state) { + return Vec3.ZERO; + } + + public Direction getBulbFacing(BlockState state) { + return state.getValue(DisplayLinkBlock.FACING); + } + } diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/PonderHilo.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/PonderHilo.java index 23675323e4..bf83dd25d5 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/PonderHilo.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/PonderHilo.java @@ -2,6 +2,7 @@ package com.simibubi.create.infrastructure.ponder.scenes.highLogistics; import com.simibubi.create.content.logistics.box.PackageEntity; import com.simibubi.create.content.logistics.packager.PackagerBlockEntity; +import com.simibubi.create.content.logistics.packagerLink.WiFiParticle; import com.simibubi.create.foundation.ponder.CreateSceneBuilder; import net.createmod.ponder.api.element.ElementLink; @@ -9,9 +10,7 @@ import net.createmod.ponder.api.element.EntityElement; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.core.particles.VibrationParticleOption; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.gameevent.BlockPositionSource; import net.minecraft.world.phys.Vec3; public class PonderHilo { @@ -54,11 +53,12 @@ public class PonderHilo { } public static void linkEffect(CreateSceneBuilder scene, BlockPos pos) { + scene.world() + .flashDisplayLink(pos); scene.addInstruction(s -> { Vec3 vec3 = Vec3.atCenterOf(pos); s.getWorld() - .addParticle(new VibrationParticleOption(new BlockPositionSource(pos.above(3)), 6), vec3.x, vec3.y, - vec3.z, 1, 1, 1); + .addParticle(new WiFiParticle.Data(), vec3.x, vec3.y, vec3.z, 1, 1, 1); }); } diff --git a/src/main/resources/assets/create/lang/default/tooltips.json b/src/main/resources/assets/create/lang/default/tooltips.json index 7afe86eac8..bc7f0f71be 100644 --- a/src/main/resources/assets/create/lang/default/tooltips.json +++ b/src/main/resources/assets/create/lang/default/tooltips.json @@ -205,23 +205,6 @@ "block.create.item_hatch.tooltip.condition1": "When R-Clicked", "block.create.item_hatch.tooltip.behaviour1": "_Deposits_ your items into the _container_ it is placed on. _Hotbar items_ and items _with contents_ will _not_ be transferred.", - - - "block.create.chain_conveyor.tooltip.summary": "[ponder] Connect with chains to form conveyor networks. Use frogports to transport packages on them. Use wrench to take a ride.", - "block.create.packager.tooltip.summary": "[ponder] Creates packages from attached inventory on redstone. Attach sign to specify target address. Alternatively, attach stock link to submit inventory contents to a logistics network.", - "block.create.package_frogport.tooltip.summary": "[ponder] Click a chain conveyor to link then place. Moves packages to and from chains based on their address. Set address filter in UI. Matching packages will be removed from chains and vice versa.", - "block.create.package_postbox.tooltip.summary": "[ponder] Click a train station to link then place. Moves packages to and from trains based on their address. Set address filter in UI. Matching packages will be removed from trains and vice versa.", - "block.create.stock_link.tooltip.summary": "[ponder] Attach to packager to make its target inventory available to request from. Click other links before placement to share their frequency. No range limitations", - "block.create.stock_ticker.tooltip.summary": "[ponder] Click stock link before placement to use its frequency. Needs an adjacent entity on a seat as its stock keeper. Click the entity to request items from any linked packagers to a given address. Click the stock ticker block to organise displayed items into categories.", - "block.create.redstone_requester.tooltip.summary": "[ponder] Click stock link before placement to use its frequency. Open UI to specify items requested to an address when a redstone pulse is received. Alternatively this request can be configured at a stock keeper before placement.", - "block.create.factory_gauge.tooltip.summary": "[ponder] Click stock link before placement to use its frequency. Place item to monitor in filter slot. Hold click to specify a target amount to maintain in storage.", - "block.create.factory_gauge.tooltip.condition1": "When attached to Packager", - "block.create.factory_gauge.tooltip.behaviour1": "Restocker mode: Panel requests items from the network to the specified address until the target amount is in the container. Short click the panel to set an address.", - "block.create.factory_gauge.tooltip.condition2": "When not attached to Packager", - "block.create.factory_gauge.tooltip.behaviour2": "Recipe mode: Panel requests ingredients to an address until the target amounted of the output item is found on the network (e.g. Send 1 Log to 'saw' and expect 6 Planks, until at least 64 Planks on network). Short click the panel to set an address and connect other panels as input items. Panels specifying an output item can also be reused as an input for other panels.", - "block.create.table_cloth.tooltip.summary": "[ponder] Can be used for decoration, click with item to display them. Alternatively, when used on a stock keeper, specify a request from your network that can be purchased by other players. The cost can be specified after placing the configured table cloth.", - "block.create.pulse_timer.tooltip.summary": "[ponder] Set a delay using the input slot. Repeatedly emits redstone pulses unless the input side is powered by a constant signal.", - "block.create.clipboard.tooltip.summary": "_Keeps your notes_ and makes you look more professional.", "block.create.clipboard.tooltip.condition1": "When R-Clicked", "block.create.clipboard.tooltip.behaviour1": "Opens the _Interface_. _Sneak-Click_ to _place_ it on a surface.", diff --git a/src/main/resources/assets/create/models/block/display_link/block.json b/src/main/resources/assets/create/models/block/display_link/block.json index 94b13ae24c..c136af24de 100644 --- a/src/main/resources/assets/create/models/block/display_link/block.json +++ b/src/main/resources/assets/create/models/block/display_link/block.json @@ -7,93 +7,80 @@ }, "children": { "base": { - "render_type": "minecraft:solid", + "render_type": "minecraft:cutout_mipped", "textures": { - "0": "create:block/display_link", - "3": "create:block/display_link_side" + "0": "create:block/link_base_unpowered", + "1": "create:block/link_details" }, "elements": [ - { - "from": [9, 6, 3.5], - "to": [13, 9, 12.5], - "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, - "faces": { - "north": {"uv": [14.5, 0, 12.5, 1.5], "texture": "#0"}, - "east": {"uv": [14.5, 6, 16, 1.5], "rotation": 90, "texture": "#0"}, - "south": {"uv": [12.5, 0, 14.5, 1.5], "texture": "#0"}, - "west": {"uv": [14.5, 6, 16, 1.5], "rotation": 90, "texture": "#0"}, - "up": {"uv": [14.5, 1.5, 12.5, 6], "rotation": 180, "texture": "#0"} - } - }, { "from": [1, 1, 1], - "to": [15, 6, 15], + "to": [15, 5, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [1, 1, 1]}, "faces": { - "north": {"uv": [0, 0, 14, 5], "texture": "#3"}, - "east": {"uv": [7.5, 9, 10, 16], "rotation": 90, "texture": "#0"}, - "south": {"uv": [0, 0, 14, 5], "texture": "#3"}, - "west": {"uv": [7.5, 9, 10, 16], "rotation": 90, "texture": "#0"}, - "up": {"uv": [0, 9, 7, 16], "texture": "#0"}, - "down": {"uv": [0, 1.5, 7, 8.5], "texture": "#0"} + "north": {"uv": [15.5, 8.5, 8.5, 10.5], "texture": "#0"}, + "east": {"uv": [8.5, 11, 15.5, 13], "texture": "#0"}, + "south": {"uv": [8.5, 8.5, 15.5, 10.5], "texture": "#0"}, + "west": {"uv": [8.5, 11, 15.5, 13], "texture": "#0"}, + "up": {"uv": [0.5, 8.5, 7.5, 15.5], "texture": "#0"}, + "down": {"uv": [0.5, 8.5, 7.5, 15.5], "texture": "#0"} } }, { "from": [2, -1, 2], "to": [14, 1, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [2, -1, 2]}, "faces": { - "north": {"uv": [0.5, 0, 6.5, 1], "texture": "#0"}, - "east": {"uv": [0.5, 0, 6.5, 1], "texture": "#0"}, - "south": {"uv": [0.5, 0, 6.5, 1], "texture": "#0"}, - "west": {"uv": [0.5, 0, 6.5, 1], "texture": "#0"}, - "down": {"uv": [0.5, 2, 6.5, 8], "texture": "#0"} + "north": {"uv": [9, 13, 15, 14], "texture": "#0"}, + "east": {"uv": [9, 13, 15, 14], "texture": "#0"}, + "south": {"uv": [9, 13, 15, 14], "texture": "#0"}, + "west": {"uv": [9, 13, 15, 14], "texture": "#0"}, + "down": {"uv": [1, 9, 7, 15], "texture": "#1"} } }, { - "from": [3, 5, 3], - "to": [7, 7, 7], - "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "from": [3, 5, 3.5], + "to": [7, 8, 12.5], + "rotation": {"angle": 0, "axis": "y", "origin": [3, 5, 3]}, "faces": { - "north": {"uv": [13.5, 10, 11.5, 11], "texture": "#0"}, - "east": {"uv": [13.5, 10, 11.5, 11], "texture": "#0"}, - "south": {"uv": [13.5, 10, 11.5, 11], "texture": "#0"}, - "west": {"uv": [13.5, 10, 11.5, 11], "texture": "#0"}, - "up": {"uv": [13.5, 8, 11.5, 10], "texture": "#0"} + "north": {"uv": [8, 0, 10, 1.5], "texture": "#1"}, + "east": {"uv": [10, 1.5, 11.5, 6], "rotation": 90, "texture": "#1"}, + "south": {"uv": [8, 0, 10, 1.5], "texture": "#1"}, + "west": {"uv": [10, 1.5, 11.5, 6], "rotation": 90, "texture": "#1"}, + "up": {"uv": [8, 1.5, 10, 6], "texture": "#1"} } }, { - "from": [3, 6, 8], - "to": [7, 8, 12], - "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "from": [9, 5, 3], + "to": [13, 7, 7], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 5, 3]}, "faces": { - "north": {"uv": [13.5, 8, 11.5, 9], "texture": "#0"}, - "east": {"uv": [13.5, 8, 11.5, 9], "texture": "#0"}, - "south": {"uv": [13.5, 8, 11.5, 9], "texture": "#0"}, - "west": {"uv": [13.5, 8, 11.5, 9], "texture": "#0"}, - "up": {"uv": [13.5, 6, 11.5, 8], "texture": "#0"} - } - } - ] - }, - "bulb_inner": { - "render_type": "minecraft:cutout", - "textures": { - "0": "create:block/display_link" - }, - "elements": [ - { - "from": [2.5, 8, 9], - "to": [7.5, 13, 10], - "rotation": {"angle": 0, "axis": "y", "origin": [6, 7.5, 19]}, - "faces": { - "south": {"uv": [16, 13.5, 13.5, 16], "texture": "#0"} + "north": {"uv": [6, 7, 8, 8], "texture": "#1"}, + "east": {"uv": [6, 7, 8, 8], "texture": "#1"}, + "south": {"uv": [6, 7, 8, 8], "texture": "#1"}, + "west": {"uv": [6, 7, 8, 8], "texture": "#1"}, + "up": {"uv": [6, 0, 8, 2], "texture": "#1"} } }, { - "from": [2.5, 8, 10], - "to": [7.5, 13, 11], - "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "from": [9, 5, 9], + "to": [13, 7, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 5, 9]}, "faces": { - "north": {"uv": [16, 13.5, 13.5, 16], "texture": "#0"} + "north": {"uv": [6, 7, 8, 8], "texture": "#1"}, + "east": {"uv": [6, 7, 8, 8], "texture": "#1"}, + "south": {"uv": [6, 7, 8, 8], "texture": "#1"}, + "west": {"uv": [6, 7, 8, 8], "texture": "#1"}, + "up": {"uv": [6, 2.5, 8, 4.5], "texture": "#1"} + } + }, + { + "from": [9.5, 7, 5], + "to": [12.5, 11, 5], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 7, 5]}, + "faces": { + "north": {"uv": [11.5, 6, 13, 8], "texture": "#1"}, + "south": {"uv": [11.5, 6, 13, 8], "texture": "#1"} } } ] @@ -101,23 +88,55 @@ "bulb": { "render_type": "minecraft:translucent", "textures": { - "0": "create:block/display_link" + "1": "create:block/link_details" }, "elements": [ { - "from": [2.5, 8, 7.5], - "to": [7.5, 13, 12.5], - "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "from": [8.5, 7, 2.5], + "to": [13.5, 12, 7.5], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 7, 2]}, "faces": { - "north": {"uv": [16, 8.5, 13.5, 11], "texture": "#0"}, - "east": {"uv": [16, 8.5, 13.5, 11], "texture": "#0"}, - "south": {"uv": [16, 8.5, 13.5, 11], "texture": "#0"}, - "west": {"uv": [16, 8.5, 13.5, 11], "texture": "#0"}, - "up": {"uv": [16, 6, 13.5, 8.5], "texture": "#0"}, - "down": {"uv": [16, 11, 13.5, 13.5], "texture": "#0"} + "north": {"uv": [16, 2.5, 13.5, 5], "texture": "#1"}, + "east": {"uv": [16, 2.5, 13.5, 5], "texture": "#1"}, + "south": {"uv": [13.5, 2.5, 16, 5], "texture": "#1"}, + "west": {"uv": [13.5, 2.5, 16, 5], "texture": "#1"}, + "up": {"uv": [13.5, 0, 16, 2.5], "texture": "#1"}, + "down": {"uv": [13.5, 5, 16, 7.5], "texture": "#1"} } } ] } + }, + "display": { + "thirdperson_righthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "thirdperson_lefthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "firstperson_righthand": { + "rotation": [0, 45, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "scale": [0.4, 0.4, 0.4] + }, + "ground": { + "translation": [0, 3, 0], + "scale": [0.25, 0.25, 0.25] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0, 1.5, 0], + "scale": [0.625, 0.625, 0.625] + }, + "fixed": { + "scale": [0.5, 0.5, 0.5] + } } } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/display_link/block_powered.json b/src/main/resources/assets/create/models/block/display_link/block_powered.json index 9484f22db3..edcff2c6ff 100644 --- a/src/main/resources/assets/create/models/block/display_link/block_powered.json +++ b/src/main/resources/assets/create/models/block/display_link/block_powered.json @@ -7,93 +7,80 @@ }, "children": { "base": { - "render_type": "minecraft:solid", + "render_type": "minecraft:cutout_mipped", "textures": { - "0": "create:block/display_link", - "3": "create:block/display_link_side_powered" + "0": "create:block/link_base_powered", + "1": "create:block/link_details" }, "elements": [ - { - "from": [9, 6, 3.5], - "to": [13, 9, 12.5], - "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, - "faces": { - "north": {"uv": [14.5, 0, 12.5, 1.5], "texture": "#0"}, - "east": {"uv": [14.5, 6, 16, 1.5], "rotation": 90, "texture": "#0"}, - "south": {"uv": [12.5, 0, 14.5, 1.5], "texture": "#0"}, - "west": {"uv": [14.5, 6, 16, 1.5], "rotation": 90, "texture": "#0"}, - "up": {"uv": [14.5, 1.5, 12.5, 6], "rotation": 180, "texture": "#0"} - } - }, { "from": [1, 1, 1], - "to": [15, 6, 15], + "to": [15, 5, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [1, 1, 1]}, "faces": { - "north": {"uv": [0, 0, 14, 5], "texture": "#3"}, - "east": {"uv": [7.5, 9, 10, 16], "rotation": 90, "texture": "#0"}, - "south": {"uv": [0, 0, 14, 5], "texture": "#3"}, - "west": {"uv": [7.5, 9, 10, 16], "rotation": 90, "texture": "#0"}, - "up": {"uv": [0, 9, 7, 16], "texture": "#0"}, - "down": {"uv": [0, 1.5, 7, 8.5], "texture": "#0"} + "north": {"uv": [15.5, 8.5, 8.5, 10.5], "texture": "#0"}, + "east": {"uv": [8.5, 11, 15.5, 13], "texture": "#0"}, + "south": {"uv": [8.5, 8.5, 15.5, 10.5], "texture": "#0"}, + "west": {"uv": [8.5, 11, 15.5, 13], "texture": "#0"}, + "up": {"uv": [0.5, 8.5, 7.5, 15.5], "texture": "#0"}, + "down": {"uv": [0.5, 8.5, 7.5, 15.5], "texture": "#0"} } }, { "from": [2, -1, 2], "to": [14, 1, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [2, -1, 2]}, "faces": { - "north": {"uv": [0.5, 0, 6.5, 1], "texture": "#0"}, - "east": {"uv": [0.5, 0, 6.5, 1], "texture": "#0"}, - "south": {"uv": [0.5, 0, 6.5, 1], "texture": "#0"}, - "west": {"uv": [0.5, 0, 6.5, 1], "texture": "#0"}, - "down": {"uv": [0.5, 2, 6.5, 8], "texture": "#0"} + "north": {"uv": [9, 13, 15, 14], "texture": "#0"}, + "east": {"uv": [9, 13, 15, 14], "texture": "#0"}, + "south": {"uv": [9, 13, 15, 14], "texture": "#0"}, + "west": {"uv": [9, 13, 15, 14], "texture": "#0"}, + "down": {"uv": [1, 9, 7, 15], "texture": "#1"} } }, { - "from": [3, 5, 3], - "to": [7, 7, 7], - "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "from": [3, 5, 3.5], + "to": [7, 8, 12.5], + "rotation": {"angle": 0, "axis": "y", "origin": [3, 5, 3]}, "faces": { - "north": {"uv": [13.5, 10, 11.5, 11], "texture": "#0"}, - "east": {"uv": [13.5, 10, 11.5, 11], "texture": "#0"}, - "south": {"uv": [13.5, 10, 11.5, 11], "texture": "#0"}, - "west": {"uv": [13.5, 10, 11.5, 11], "texture": "#0"}, - "up": {"uv": [13.5, 8, 11.5, 10], "texture": "#0"} + "north": {"uv": [8, 0, 10, 1.5], "texture": "#1"}, + "east": {"uv": [10, 1.5, 11.5, 6], "rotation": 90, "texture": "#1"}, + "south": {"uv": [8, 0, 10, 1.5], "texture": "#1"}, + "west": {"uv": [10, 1.5, 11.5, 6], "rotation": 90, "texture": "#1"}, + "up": {"uv": [8, 1.5, 10, 6], "texture": "#1"} } }, { - "from": [3, 6, 8], - "to": [7, 8, 12], - "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "from": [9, 5, 3], + "to": [13, 7, 7], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 5, 3]}, "faces": { - "north": {"uv": [13.5, 8, 11.5, 9], "texture": "#0"}, - "east": {"uv": [13.5, 8, 11.5, 9], "texture": "#0"}, - "south": {"uv": [13.5, 8, 11.5, 9], "texture": "#0"}, - "west": {"uv": [13.5, 8, 11.5, 9], "texture": "#0"}, - "up": {"uv": [13.5, 6, 11.5, 8], "texture": "#0"} - } - } - ] - }, - "bulb_inner": { - "render_type": "minecraft:cutout", - "textures": { - "0": "create:block/display_link" - }, - "elements": [ - { - "from": [2.5, 8, 9], - "to": [7.5, 13, 10], - "rotation": {"angle": 0, "axis": "y", "origin": [6, 7.5, 19]}, - "faces": { - "south": {"uv": [16, 13.5, 13.5, 16], "texture": "#0"} + "north": {"uv": [6, 7, 8, 8], "texture": "#1"}, + "east": {"uv": [6, 7, 8, 8], "texture": "#1"}, + "south": {"uv": [6, 7, 8, 8], "texture": "#1"}, + "west": {"uv": [6, 7, 8, 8], "texture": "#1"}, + "up": {"uv": [6, 0, 8, 2], "texture": "#1"} } }, { - "from": [2.5, 8, 10], - "to": [7.5, 13, 11], - "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "from": [9, 5, 9], + "to": [13, 7, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 5, 9]}, "faces": { - "north": {"uv": [16, 13.5, 13.5, 16], "texture": "#0"} + "north": {"uv": [6, 7, 8, 8], "texture": "#1"}, + "east": {"uv": [6, 7, 8, 8], "texture": "#1"}, + "south": {"uv": [6, 7, 8, 8], "texture": "#1"}, + "west": {"uv": [6, 7, 8, 8], "texture": "#1"}, + "up": {"uv": [6, 2.5, 8, 4.5], "texture": "#1"} + } + }, + { + "from": [9.5, 7, 5], + "to": [12.5, 11, 5], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 7, 5]}, + "faces": { + "north": {"uv": [11.5, 6, 13, 8], "texture": "#1"}, + "south": {"uv": [11.5, 6, 13, 8], "texture": "#1"} } } ] @@ -101,23 +88,23 @@ "bulb": { "render_type": "minecraft:translucent", "textures": { - "0": "create:block/display_link" + "1": "create:block/link_details" }, "elements": [ { - "from": [2.5, 8, 7.5], - "to": [7.5, 13, 12.5], - "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "from": [8.5, 7, 2.5], + "to": [13.5, 12, 7.5], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 7, 2]}, "faces": { - "north": {"uv": [16, 8.5, 13.5, 11], "texture": "#0"}, - "east": {"uv": [16, 8.5, 13.5, 11], "texture": "#0"}, - "south": {"uv": [16, 8.5, 13.5, 11], "texture": "#0"}, - "west": {"uv": [16, 8.5, 13.5, 11], "texture": "#0"}, - "up": {"uv": [16, 6, 13.5, 8.5], "texture": "#0"}, - "down": {"uv": [16, 11, 13.5, 13.5], "texture": "#0"} + "north": {"uv": [16, 2.5, 13.5, 5], "texture": "#1"}, + "east": {"uv": [16, 2.5, 13.5, 5], "texture": "#1"}, + "south": {"uv": [13.5, 2.5, 16, 5], "texture": "#1"}, + "west": {"uv": [13.5, 2.5, 16, 5], "texture": "#1"}, + "up": {"uv": [13.5, 0, 16, 2.5], "texture": "#1"}, + "down": {"uv": [13.5, 5, 16, 7.5], "texture": "#1"} } } ] } } -} +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/display_link/glow.json b/src/main/resources/assets/create/models/block/display_link/glow.json index c862cf2242..3fa6a60534 100644 --- a/src/main/resources/assets/create/models/block/display_link/glow.json +++ b/src/main/resources/assets/create/models/block/display_link/glow.json @@ -1,46 +1,30 @@ { "credit": "Made with Blockbench", - "parent": "block/block", "textures": { - "0": "create:block/display_link" + "1": "create:block/link_details", + "particle": "create:block/brass_casing" }, "elements": [ { - "from": [2, 7.5, 7], - "to": [8, 13.5, 13], - "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "from": [-3, -0.5, -3], + "to": [3, 5.5, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 7, 2]}, "faces": { - "north": {"uv": [16, 8.5, 13.5, 11], "texture": "#0"}, - "east": {"uv": [16, 8.5, 13.5, 11], "texture": "#0"}, - "south": {"uv": [16, 8.5, 13.5, 11], "texture": "#0"}, - "west": {"uv": [16, 8.5, 13.5, 11], "texture": "#0"}, - "up": {"uv": [16, 6, 13.5, 8.5], "texture": "#0"}, - "down": {"uv": [16, 11, 13.5, 13.5], "texture": "#0"} - } - }, - { - "from": [2.5, 8, 9], - "to": [7.5, 13, 10], - "rotation": {"angle": 0, "axis": "y", "origin": [6, 7.5, 19]}, - "faces": { - "south": {"uv": [16, 13.5, 13.5, 16], "texture": "#0"} - } - }, - { - "from": [2.5, 8, 10], - "to": [7.5, 13, 11], - "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, - "faces": { - "north": {"uv": [16, 13.5, 13.5, 16], "texture": "#0"} + "north": {"uv": [16, 2.5, 13.5, 5], "texture": "#1"}, + "east": {"uv": [16, 2.5, 13.5, 5], "texture": "#1"}, + "south": {"uv": [13.5, 2.5, 16, 5], "texture": "#1"}, + "west": {"uv": [13.5, 2.5, 16, 5], "texture": "#1"}, + "up": {"uv": [13.5, 0, 16, 2.5], "texture": "#1"}, + "down": {"uv": [13.5, 5, 16, 7.5], "texture": "#1"} } } ], "groups": [ { - "name": "group", - "origin": [16, 0, 0], + "name": "bulb", + "origin": [8, 8, 8], "color": 0, - "children": [0, 1, 2] + "children": [0] } ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/display_link/model_for_editing.json b/src/main/resources/assets/create/models/block/display_link/model_for_editing.json new file mode 100644 index 0000000000..de480e81e4 --- /dev/null +++ b/src/main/resources/assets/create/models/block/display_link/model_for_editing.json @@ -0,0 +1,113 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/link_base_unpowered", + "1": "create:block/link_details", + "particle": "create:block/brass_casing" + }, + "elements": [ + { + "from": [1, 1, 1], + "to": [15, 5, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [1, 1, 1]}, + "faces": { + "north": {"uv": [15.5, 8.5, 8.5, 10.5], "texture": "#0"}, + "east": {"uv": [8.5, 11, 15.5, 13], "texture": "#0"}, + "south": {"uv": [8.5, 8.5, 15.5, 10.5], "texture": "#0"}, + "west": {"uv": [8.5, 11, 15.5, 13], "texture": "#0"}, + "up": {"uv": [0.5, 8.5, 7.5, 15.5], "texture": "#0"}, + "down": {"uv": [0.5, 8.5, 7.5, 15.5], "texture": "#0"} + } + }, + { + "from": [2, -1, 2], + "to": [14, 1, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [2, -1, 2]}, + "faces": { + "north": {"uv": [9, 13, 15, 14], "texture": "#0"}, + "east": {"uv": [9, 13, 15, 14], "texture": "#0"}, + "south": {"uv": [9, 13, 15, 14], "texture": "#0"}, + "west": {"uv": [9, 13, 15, 14], "texture": "#0"}, + "down": {"uv": [1, 9, 7, 15], "texture": "#1"} + } + }, + { + "from": [3, 5, 3.5], + "to": [7, 8, 12.5], + "rotation": {"angle": 0, "axis": "y", "origin": [3, 5, 3]}, + "faces": { + "north": {"uv": [8, 0, 10, 1.5], "texture": "#1"}, + "east": {"uv": [10, 1.5, 11.5, 6], "rotation": 90, "texture": "#1"}, + "south": {"uv": [8, 0, 10, 1.5], "texture": "#1"}, + "west": {"uv": [10, 1.5, 11.5, 6], "rotation": 90, "texture": "#1"}, + "up": {"uv": [8, 1.5, 10, 6], "texture": "#1"} + } + }, + { + "from": [9, 5, 3], + "to": [13, 7, 7], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 5, 3]}, + "faces": { + "north": {"uv": [6, 7, 8, 8], "texture": "#1"}, + "east": {"uv": [6, 7, 8, 8], "texture": "#1"}, + "south": {"uv": [6, 7, 8, 8], "texture": "#1"}, + "west": {"uv": [6, 7, 8, 8], "texture": "#1"}, + "up": {"uv": [6, 0, 8, 2], "texture": "#1"} + } + }, + { + "from": [9, 5, 9], + "to": [13, 7, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 5, 9]}, + "faces": { + "north": {"uv": [6, 7, 8, 8], "texture": "#1"}, + "east": {"uv": [6, 7, 8, 8], "texture": "#1"}, + "south": {"uv": [6, 7, 8, 8], "texture": "#1"}, + "west": {"uv": [6, 7, 8, 8], "texture": "#1"}, + "up": {"uv": [6, 2.5, 8, 4.5], "texture": "#1"} + } + }, + { + "from": [9.5, 7, 5], + "to": [12.5, 11, 5], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 7, 5]}, + "faces": { + "north": {"uv": [11.5, 6, 13, 8], "texture": "#1"}, + "south": {"uv": [11.5, 6, 13, 8], "texture": "#1"} + } + }, + { + "from": [8.5, 7, 2.5], + "to": [13.5, 12, 7.5], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 7, 2]}, + "faces": { + "north": {"uv": [16, 2.5, 13.5, 5], "texture": "#1"}, + "east": {"uv": [16, 2.5, 13.5, 5], "texture": "#1"}, + "south": {"uv": [13.5, 2.5, 16, 5], "texture": "#1"}, + "west": {"uv": [13.5, 2.5, 16, 5], "texture": "#1"}, + "up": {"uv": [13.5, 0, 16, 2.5], "texture": "#1"}, + "down": {"uv": [13.5, 5, 16, 7.5], "texture": "#1"} + } + } + ], + "groups": [ + { + "name": "base", + "origin": [2, -1, 2], + "color": 0, + "children": [0, 1] + }, + { + "name": "details", + "origin": [10, 7, 5], + "color": 0, + "children": [2, 3, 4, 5] + }, + { + "name": "bulb", + "origin": [8, 8, 8], + "color": 0, + "children": [6] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/display_link/tube.json b/src/main/resources/assets/create/models/block/display_link/tube.json index 8f54a51373..182500e339 100644 --- a/src/main/resources/assets/create/models/block/display_link/tube.json +++ b/src/main/resources/assets/create/models/block/display_link/tube.json @@ -1,46 +1,30 @@ { "credit": "Made with Blockbench", - "parent": "block/block", "textures": { - "0": "create:block/display_link" + "1": "create:block/link_details", + "particle": "create:block/brass_casing" }, "elements": [ { - "from": [2.5, 8, 7.5], - "to": [7.5, 13, 12.5], - "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "from": [-2.5, 0, -2.5], + "to": [2.5, 5, 2.5], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 7, 2]}, "faces": { - "north": {"uv": [16, 8.5, 13.5, 11], "texture": "#0"}, - "east": {"uv": [16, 8.5, 13.5, 11], "texture": "#0"}, - "south": {"uv": [16, 8.5, 13.5, 11], "texture": "#0"}, - "west": {"uv": [16, 8.5, 13.5, 11], "texture": "#0"}, - "up": {"uv": [16, 6, 13.5, 8.5], "texture": "#0"}, - "down": {"uv": [16, 11, 13.5, 13.5], "texture": "#0"} - } - }, - { - "from": [2.5, 8, 9], - "to": [7.5, 13, 10], - "rotation": {"angle": 0, "axis": "y", "origin": [6, 7.5, 19]}, - "faces": { - "south": {"uv": [16, 13.5, 13.5, 16], "texture": "#0"} - } - }, - { - "from": [2.5, 8, 10], - "to": [7.5, 13, 11], - "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, - "faces": { - "north": {"uv": [16, 13.5, 13.5, 16], "texture": "#0"} + "north": {"uv": [16, 2.5, 13.5, 5], "texture": "#1"}, + "east": {"uv": [16, 2.5, 13.5, 5], "texture": "#1"}, + "south": {"uv": [13.5, 2.5, 16, 5], "texture": "#1"}, + "west": {"uv": [13.5, 2.5, 16, 5], "texture": "#1"}, + "up": {"uv": [13.5, 0, 16, 2.5], "texture": "#1"}, + "down": {"uv": [13.5, 5, 16, 7.5], "texture": "#1"} } } ], "groups": [ { - "name": "group", - "origin": [16, 0, 0], + "name": "bulb", + "origin": [8, 8, 8], "color": 0, - "children": [0, 1, 2] + "children": [0] } ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/factory_gauge/item.json b/src/main/resources/assets/create/models/block/factory_gauge/item.json index e905a4f160..6dd16b6606 100644 --- a/src/main/resources/assets/create/models/block/factory_gauge/item.json +++ b/src/main/resources/assets/create/models/block/factory_gauge/item.json @@ -2,7 +2,6 @@ "credit": "Made with Blockbench", "textures": { "0": "create:block/factory_panel", - "2": "create:block/display_link", "particle": "create:block/factory_panel" }, "elements": [ @@ -11,12 +10,12 @@ "to": [6, 3, 12], "rotation": {"angle": 0, "axis": "y", "origin": [4, 1, 10]}, "faces": { - "north": {"uv": [13.5, 7, 14.5, 8], "texture": "#2"}, - "east": {"uv": [13.5, 7, 14.5, 8], "texture": "#2"}, - "south": {"uv": [15, 7, 16, 8], "texture": "#2"}, - "west": {"uv": [15, 7, 16, 8], "texture": "#2"}, - "up": {"uv": [14.5, 7, 15.5, 8], "texture": "#2"}, - "down": {"uv": [14, 6.5, 15, 7.5], "texture": "#2"} + "north": {"uv": [9, 8, 11, 10], "texture": "#0"}, + "east": {"uv": [9, 8, 11, 10], "rotation": 90, "texture": "#0"}, + "south": {"uv": [9, 8, 11, 10], "rotation": 270, "texture": "#0"}, + "west": {"uv": [9, 8, 11, 10], "texture": "#0"}, + "up": {"uv": [9, 8, 11, 10], "rotation": 180, "texture": "#0"}, + "down": {"uv": [9, 8, 11, 10], "texture": "#0"} } }, { diff --git a/src/main/resources/assets/create/models/block/redstone_link/transmitter.json b/src/main/resources/assets/create/models/block/redstone_link/transmitter.json index bb95e3d9e0..ef6d72fb41 100644 --- a/src/main/resources/assets/create/models/block/redstone_link/transmitter.json +++ b/src/main/resources/assets/create/models/block/redstone_link/transmitter.json @@ -95,7 +95,7 @@ }, "gui": { "rotation": [30, 225, 0], - "translation": [0, 2.5, 0], + "translation": [0, 1.5, 0], "scale": [0.625, 0.625, 0.625] }, "fixed": { diff --git a/src/main/resources/assets/create/models/block/stock_link/block.json b/src/main/resources/assets/create/models/block/stock_link/block.json deleted file mode 100644 index 1c4ad6780a..0000000000 --- a/src/main/resources/assets/create/models/block/stock_link/block.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "credit": "Made with Blockbench", - "parent": "block/block", - "textures": { - "0": "create:block/stock_link", - "2": "create:block/stock_link_unpowered", - "particle": "create:block/vault/vault_front_small" - }, - "elements": [ - { - "from": [2, -1, 2], - "to": [14, 1, 14], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [9, 8.5, 15, 9.5], "texture": "#0"}, - "east": {"uv": [9, 8.5, 15, 9.5], "texture": "#0"}, - "south": {"uv": [9, 8.5, 15, 9.5], "texture": "#0"}, - "west": {"uv": [9, 8.5, 15, 9.5], "texture": "#0"}, - "down": {"uv": [1, 9, 7, 15], "rotation": 180, "texture": "#0"} - } - }, - { - "from": [1, 1, 1], - "to": [15, 6, 15], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [8.5, 5.5, 15.5, 3], "texture": "#0"}, - "east": {"uv": [1, 1, 6, 15], "rotation": 90, "texture": "#2"}, - "south": {"uv": [8.5, 2.5, 15.5, 0], "texture": "#0"}, - "west": {"uv": [1, 1, 6, 15], "rotation": 90, "texture": "#2"}, - "up": {"uv": [0.5, 0.5, 7.5, 7.5], "rotation": 180, "texture": "#0"}, - "down": {"uv": [0.5, 8.5, 7.5, 15.5], "rotation": 180, "texture": "#0"} - } - }, - { - "from": [4, 2, 0], - "to": [12, 6, 1], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, - "faces": { - "north": {"uv": [10, 6, 14, 8], "texture": "#0"}, - "east": {"uv": [9.5, 6, 10, 8], "texture": "#0"}, - "west": {"uv": [9.5, 6, 10, 8], "texture": "#0"}, - "up": {"uv": [2, 7.5, 6, 8], "rotation": 180, "texture": "#0"}, - "down": {"uv": [2, 7.5, 6, 8], "rotation": 180, "texture": "#0"} - } - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/stock_link/block_horizontal.json b/src/main/resources/assets/create/models/block/stock_link/block_horizontal.json new file mode 100644 index 0000000000..7e4d4b349d --- /dev/null +++ b/src/main/resources/assets/create/models/block/stock_link/block_horizontal.json @@ -0,0 +1,120 @@ +{ + "credit": "Made with Blockbench", + "loader": "forge:composite", + "parent": "block/block", + "textures": { + "particle": "create:block/brass_casing" + }, + "children": { + "base": { + "render_type": "minecraft:cutout_mipped", + "textures": { + "0": "create:block/link_base_unpowered", + "1": "create:block/link_details", + "particle": "create:block/vault/vault_front_small" + }, + "elements": [ + { + "from": [1.95, 1.95, -1.05], + "to": [14.05, 14.05, 1.05], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [9, 9, 15, 15], "rotation": 180, "texture": "#1"}, + "east": {"uv": [9, 4, 15, 5], "rotation": 270, "texture": "#0"}, + "west": {"uv": [9, 4, 15, 5], "rotation": 90, "texture": "#0"}, + "up": {"uv": [9, 5, 15, 6], "rotation": 180, "texture": "#0"}, + "down": {"uv": [9, 5, 15, 6], "texture": "#0"} + } + }, + { + "from": [1, 1, 1], + "to": [15, 15, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [8.5, 8.5, 15.5, 15.5], "rotation": 180, "texture": "#1"}, + "east": {"uv": [8.5, 2.5, 15.5, 4], "rotation": 270, "texture": "#0"}, + "south": {"uv": [0.5, 0.5, 7.5, 7.5], "texture": "#0"}, + "west": {"uv": [8.5, 2.5, 15.5, 4], "rotation": 90, "texture": "#0"}, + "up": {"uv": [15.5, 0.5, 8.5, 2], "rotation": 180, "texture": "#0"}, + "down": {"uv": [8.5, 0.5, 15.5, 2], "texture": "#0"} + } + }, + { + "from": [3, 3, 4], + "to": [7, 7, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "east": {"uv": [6, 7, 8, 8], "rotation": 270, "texture": "#1"}, + "south": {"uv": [6, 0, 8, 2], "texture": "#1"}, + "west": {"uv": [6, 7, 8, 8], "rotation": 90, "texture": "#1"}, + "up": {"uv": [6, 7, 8, 8], "rotation": 180, "texture": "#1"}, + "down": {"uv": [6, 7, 8, 8], "texture": "#1"} + } + }, + { + "from": [9, 3, 4], + "to": [13, 7, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "east": {"uv": [6, 7, 8, 8], "rotation": 270, "texture": "#1"}, + "south": {"uv": [6, 5, 8, 7], "texture": "#1"}, + "west": {"uv": [6, 7, 8, 8], "rotation": 90, "texture": "#1"}, + "up": {"uv": [6, 7, 8, 8], "rotation": 180, "texture": "#1"}, + "down": {"uv": [6, 7, 8, 8], "texture": "#1"} + } + }, + { + "from": [3.5, 5, 6], + "to": [6.5, 5, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "up": {"uv": [11.5, 6, 13, 8], "rotation": 180, "texture": "#1"}, + "down": {"uv": [11.5, 6, 13, 8], "texture": "#1"} + } + }, + { + "from": [5, 8, 4], + "to": [11, 12, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 5]}, + "faces": { + "east": {"uv": [1, 0, 0, 2], "texture": "#1"}, + "south": {"uv": [1, 0, 4, 2], "texture": "#1"}, + "west": {"uv": [1, 2, 0, 0], "rotation": 180, "texture": "#1"}, + "up": {"uv": [1, 2, 4, 3], "rotation": 180, "texture": "#1"}, + "down": {"uv": [1, 2, 4, 3], "texture": "#1"} + } + }, + { + "from": [3, 12, 5], + "to": [13, 22, 5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 11, 5]}, + "faces": { + "north": {"uv": [0, 8, 5, 3], "rotation": 180, "texture": "#1"}, + "south": {"uv": [0, 3, 5, 8], "texture": "#1"} + } + } + ] + }, + "bulb": { + "render_type": "minecraft:translucent", + "textures": { + "1": "create:block/link_details" + }, + "elements": [ + { + "from": [2.5, 2.5, 6], + "to": [7.5, 7.5, 11], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [13.5, 5, 16, 7.5], "rotation": 180, "texture": "#1"}, + "east": {"uv": [16, 2.5, 13.5, 5], "rotation": 270, "texture": "#1"}, + "south": {"uv": [13.5, 0, 16, 2.5], "texture": "#1"}, + "west": {"uv": [13.5, 2.5, 16, 5], "rotation": 90, "texture": "#1"}, + "up": {"uv": [16, 2.5, 13.5, 5], "rotation": 180, "texture": "#1"}, + "down": {"uv": [13.5, 2.5, 16, 5], "texture": "#1"} + } + } + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/stock_link/block_horizontal_powered.json b/src/main/resources/assets/create/models/block/stock_link/block_horizontal_powered.json new file mode 100644 index 0000000000..7070e115ae --- /dev/null +++ b/src/main/resources/assets/create/models/block/stock_link/block_horizontal_powered.json @@ -0,0 +1,120 @@ +{ + "credit": "Made with Blockbench", + "loader": "forge:composite", + "parent": "block/block", + "textures": { + "particle": "create:block/brass_casing" + }, + "children": { + "base": { + "render_type": "minecraft:cutout_mipped", + "textures": { + "0": "create:block/link_base_powered", + "1": "create:block/link_details", + "particle": "create:block/vault/vault_front_small" + }, + "elements": [ + { + "from": [1.95, 1.95, -1.05], + "to": [14.05, 14.05, 1.05], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [9, 9, 15, 15], "rotation": 180, "texture": "#1"}, + "east": {"uv": [9, 4, 15, 5], "rotation": 270, "texture": "#0"}, + "west": {"uv": [9, 4, 15, 5], "rotation": 90, "texture": "#0"}, + "up": {"uv": [9, 5, 15, 6], "rotation": 180, "texture": "#0"}, + "down": {"uv": [9, 5, 15, 6], "texture": "#0"} + } + }, + { + "from": [1, 1, 1], + "to": [15, 15, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [8.5, 8.5, 15.5, 15.5], "rotation": 180, "texture": "#1"}, + "east": {"uv": [8.5, 2.5, 15.5, 4], "rotation": 270, "texture": "#0"}, + "south": {"uv": [0.5, 0.5, 7.5, 7.5], "texture": "#0"}, + "west": {"uv": [8.5, 2.5, 15.5, 4], "rotation": 90, "texture": "#0"}, + "up": {"uv": [15.5, 0.5, 8.5, 2], "rotation": 180, "texture": "#0"}, + "down": {"uv": [8.5, 0.5, 15.5, 2], "texture": "#0"} + } + }, + { + "from": [3, 3, 4], + "to": [7, 7, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "east": {"uv": [6, 7, 8, 8], "rotation": 270, "texture": "#1"}, + "south": {"uv": [6, 0, 8, 2], "texture": "#1"}, + "west": {"uv": [6, 7, 8, 8], "rotation": 90, "texture": "#1"}, + "up": {"uv": [6, 7, 8, 8], "rotation": 180, "texture": "#1"}, + "down": {"uv": [6, 7, 8, 8], "texture": "#1"} + } + }, + { + "from": [9, 3, 4], + "to": [13, 7, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "east": {"uv": [6, 7, 8, 8], "rotation": 270, "texture": "#1"}, + "south": {"uv": [6, 5, 8, 7], "texture": "#1"}, + "west": {"uv": [6, 7, 8, 8], "rotation": 90, "texture": "#1"}, + "up": {"uv": [6, 7, 8, 8], "rotation": 180, "texture": "#1"}, + "down": {"uv": [6, 7, 8, 8], "texture": "#1"} + } + }, + { + "from": [3.5, 5, 6], + "to": [6.5, 5, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "up": {"uv": [11.5, 6, 13, 8], "rotation": 180, "texture": "#1"}, + "down": {"uv": [11.5, 6, 13, 8], "texture": "#1"} + } + }, + { + "from": [5, 8, 4], + "to": [11, 12, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 5]}, + "faces": { + "east": {"uv": [1, 0, 0, 2], "texture": "#1"}, + "south": {"uv": [1, 0, 4, 2], "texture": "#1"}, + "west": {"uv": [1, 2, 0, 0], "rotation": 180, "texture": "#1"}, + "up": {"uv": [1, 2, 4, 3], "rotation": 180, "texture": "#1"}, + "down": {"uv": [1, 2, 4, 3], "texture": "#1"} + } + }, + { + "from": [3, 12, 5], + "to": [13, 22, 5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 11, 5]}, + "faces": { + "north": {"uv": [0, 8, 5, 3], "rotation": 180, "texture": "#1"}, + "south": {"uv": [0, 3, 5, 8], "texture": "#1"} + } + } + ] + }, + "bulb": { + "render_type": "minecraft:translucent", + "textures": { + "1": "create:block/link_details" + }, + "elements": [ + { + "from": [2.5, 2.5, 6], + "to": [7.5, 7.5, 11], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [13.5, 5, 16, 7.5], "rotation": 180, "texture": "#1"}, + "east": {"uv": [16, 2.5, 13.5, 5], "rotation": 270, "texture": "#1"}, + "south": {"uv": [13.5, 0, 16, 2.5], "texture": "#1"}, + "west": {"uv": [13.5, 2.5, 16, 5], "rotation": 90, "texture": "#1"}, + "up": {"uv": [16, 2.5, 13.5, 5], "rotation": 180, "texture": "#1"}, + "down": {"uv": [13.5, 2.5, 16, 5], "texture": "#1"} + } + } + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/stock_link/block_powered.json b/src/main/resources/assets/create/models/block/stock_link/block_powered.json deleted file mode 100644 index 4f39b8edad..0000000000 --- a/src/main/resources/assets/create/models/block/stock_link/block_powered.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/stock_link/block", - "textures": { - "2": "create:block/stock_link_powered" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/stock_link/block_vertical.json b/src/main/resources/assets/create/models/block/stock_link/block_vertical.json new file mode 100644 index 0000000000..e84e2915d4 --- /dev/null +++ b/src/main/resources/assets/create/models/block/stock_link/block_vertical.json @@ -0,0 +1,152 @@ +{ + "credit": "Made with Blockbench", + "loader": "forge:composite", + "parent": "block/block", + "textures": { + "particle": "create:block/brass_casing" + }, + "children": { + "base": { + "render_type": "minecraft:cutout_mipped", + "textures": { + "0": "create:block/link_base_unpowered", + "1": "create:block/link_details", + "particle": "create:block/vault/vault_front_small" + }, + "elements": [ + { + "from": [1, 1, 1], + "to": [15, 4, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [8.5, 0.5, 15.5, 2], "texture": "#0"}, + "east": {"uv": [8.5, 2.5, 15.5, 4], "texture": "#0"}, + "south": {"uv": [15.5, 0.5, 8.5, 2], "texture": "#0"}, + "west": {"uv": [8.5, 2.5, 15.5, 4], "texture": "#0"}, + "up": {"uv": [0.5, 0.5, 7.5, 7.5], "rotation": 180, "texture": "#0"}, + "down": {"uv": [8.5, 8.5, 15.5, 15.5], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [1.95, -1.05, 1.95], + "to": [14.05, 1.05, 14.05], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [9, 5, 15, 6], "texture": "#0"}, + "east": {"uv": [9, 4, 15, 5], "texture": "#0"}, + "south": {"uv": [9, 5, 15, 6], "texture": "#0"}, + "west": {"uv": [9, 4, 15, 5], "texture": "#0"}, + "down": {"uv": [9, 9, 15, 15], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [9, 4, 3], + "to": [13, 6, 7], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [6, 7, 8, 8], "texture": "#1"}, + "east": {"uv": [6, 7, 8, 8], "texture": "#1"}, + "south": {"uv": [6, 7, 8, 8], "texture": "#1"}, + "west": {"uv": [6, 7, 8, 8], "texture": "#1"}, + "up": {"uv": [6, 0, 8, 2], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [3, 4, 3], + "to": [7, 6, 7], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [6, 7, 8, 8], "texture": "#1"}, + "east": {"uv": [6, 7, 8, 8], "texture": "#1"}, + "south": {"uv": [6, 7, 8, 8], "texture": "#1"}, + "west": {"uv": [6, 7, 8, 8], "texture": "#1"}, + "up": {"uv": [6, 5, 8, 7], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [9.5, 6, 5], + "to": [12.5, 10, 5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11.5, 6, 13, 8], "texture": "#1"}, + "south": {"uv": [11.5, 6, 13, 8], "texture": "#1"} + } + }, + { + "from": [5, 4, 8], + "to": [11, 6, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [1, 2, 4, 3], "texture": "#1"}, + "east": {"uv": [1, 2, 0, 0], "rotation": 90, "texture": "#1"}, + "south": {"uv": [1, 2, 4, 3], "texture": "#1"}, + "west": {"uv": [1, 0, 0, 2], "rotation": 90, "texture": "#1"}, + "up": {"uv": [1, 0, 4, 2], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [3, 6, 10], + "to": [13, 16, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 3, 5, 8], "texture": "#1"}, + "south": {"uv": [0, 8, 5, 3], "rotation": 180, "texture": "#1"} + } + } + ] + }, + "bulb": { + "render_type": "minecraft:translucent", + "textures": { + "1": "create:block/link_details" + }, + "elements": [ + { + "from": [8.5, 6, 2.5], + "to": [13.5, 11, 7.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [13.5, 2.5, 16, 5], "texture": "#1"}, + "east": {"uv": [13.5, 2.5, 16, 5], "texture": "#1"}, + "south": {"uv": [16, 2.5, 13.5, 5], "texture": "#1"}, + "west": {"uv": [16, 2.5, 13.5, 5], "texture": "#1"}, + "up": {"uv": [13.5, 0, 16, 2.5], "rotation": 180, "texture": "#1"}, + "down": {"uv": [13.5, 5, 16, 7.5], "rotation": 180, "texture": "#1"} + } + } + ] + } + }, + "display": { + "thirdperson_righthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "thirdperson_lefthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "firstperson_righthand": { + "rotation": [0, 45, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "scale": [0.4, 0.4, 0.4] + }, + "ground": { + "translation": [0, 3, 0], + "scale": [0.25, 0.25, 0.25] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0, 1.5, 0], + "scale": [0.625, 0.625, 0.625] + }, + "fixed": { + "scale": [0.5, 0.5, 0.5] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/stock_link/block_vertical_powered.json b/src/main/resources/assets/create/models/block/stock_link/block_vertical_powered.json new file mode 100644 index 0000000000..54ed687d45 --- /dev/null +++ b/src/main/resources/assets/create/models/block/stock_link/block_vertical_powered.json @@ -0,0 +1,120 @@ +{ + "credit": "Made with Blockbench", + "loader": "forge:composite", + "parent": "block/block", + "textures": { + "particle": "create:block/brass_casing" + }, + "children": { + "base": { + "render_type": "minecraft:cutout_mipped", + "textures": { + "0": "create:block/link_base_powered", + "1": "create:block/link_details", + "particle": "create:block/vault/vault_front_small" + }, + "elements": [ + { + "from": [1, 1, 1], + "to": [15, 4, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [8.5, 0.5, 15.5, 2], "texture": "#0"}, + "east": {"uv": [8.5, 2.5, 15.5, 4], "texture": "#0"}, + "south": {"uv": [15.5, 0.5, 8.5, 2], "texture": "#0"}, + "west": {"uv": [8.5, 2.5, 15.5, 4], "texture": "#0"}, + "up": {"uv": [0.5, 0.5, 7.5, 7.5], "rotation": 180, "texture": "#0"}, + "down": {"uv": [8.5, 8.5, 15.5, 15.5], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [1.95, -1.05, 1.95], + "to": [14.05, 1.05, 14.05], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [9, 5, 15, 6], "texture": "#0"}, + "east": {"uv": [9, 4, 15, 5], "texture": "#0"}, + "south": {"uv": [9, 5, 15, 6], "texture": "#0"}, + "west": {"uv": [9, 4, 15, 5], "texture": "#0"}, + "down": {"uv": [9, 9, 15, 15], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [9, 4, 3], + "to": [13, 6, 7], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [6, 7, 8, 8], "texture": "#1"}, + "east": {"uv": [6, 7, 8, 8], "texture": "#1"}, + "south": {"uv": [6, 7, 8, 8], "texture": "#1"}, + "west": {"uv": [6, 7, 8, 8], "texture": "#1"}, + "up": {"uv": [6, 0, 8, 2], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [3, 4, 3], + "to": [7, 6, 7], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [6, 7, 8, 8], "texture": "#1"}, + "east": {"uv": [6, 7, 8, 8], "texture": "#1"}, + "south": {"uv": [6, 7, 8, 8], "texture": "#1"}, + "west": {"uv": [6, 7, 8, 8], "texture": "#1"}, + "up": {"uv": [6, 5, 8, 7], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [9.5, 6, 5], + "to": [12.5, 10, 5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11.5, 6, 13, 8], "texture": "#1"}, + "south": {"uv": [11.5, 6, 13, 8], "texture": "#1"} + } + }, + { + "from": [5, 4, 8], + "to": [11, 6, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [1, 2, 4, 3], "texture": "#1"}, + "east": {"uv": [1, 2, 0, 0], "rotation": 90, "texture": "#1"}, + "south": {"uv": [1, 2, 4, 3], "texture": "#1"}, + "west": {"uv": [1, 0, 0, 2], "rotation": 90, "texture": "#1"}, + "up": {"uv": [1, 0, 4, 2], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [3, 6, 10], + "to": [13, 16, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 3, 5, 8], "texture": "#1"}, + "south": {"uv": [0, 8, 5, 3], "rotation": 180, "texture": "#1"} + } + } + ] + }, + "bulb": { + "render_type": "minecraft:translucent", + "textures": { + "1": "create:block/link_details" + }, + "elements": [ + { + "from": [8.5, 6, 2.5], + "to": [13.5, 11, 7.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [13.5, 2.5, 16, 5], "texture": "#1"}, + "east": {"uv": [13.5, 2.5, 16, 5], "texture": "#1"}, + "south": {"uv": [16, 2.5, 13.5, 5], "texture": "#1"}, + "west": {"uv": [16, 2.5, 13.5, 5], "texture": "#1"}, + "up": {"uv": [13.5, 0, 16, 2.5], "rotation": 180, "texture": "#1"}, + "down": {"uv": [13.5, 5, 16, 7.5], "rotation": 180, "texture": "#1"} + } + } + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/stock_link/horizontal_for_editing.json b/src/main/resources/assets/create/models/block/stock_link/horizontal_for_editing.json new file mode 100644 index 0000000000..33dcbdc4b6 --- /dev/null +++ b/src/main/resources/assets/create/models/block/stock_link/horizontal_for_editing.json @@ -0,0 +1,128 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/link_base_unpowered", + "1": "create:block/link_details", + "particle": "create:block/vault/vault_front_small" + }, + "elements": [ + { + "from": [1.95, 1.95, -1.05], + "to": [14.05, 14.05, 1.05], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [9, 9, 15, 15], "rotation": 180, "texture": "#1"}, + "east": {"uv": [9, 4, 15, 5], "rotation": 270, "texture": "#0"}, + "west": {"uv": [9, 4, 15, 5], "rotation": 90, "texture": "#0"}, + "up": {"uv": [9, 5, 15, 6], "rotation": 180, "texture": "#0"}, + "down": {"uv": [9, 5, 15, 6], "texture": "#0"} + } + }, + { + "from": [1, 1, 1], + "to": [15, 15, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [8.5, 8.5, 15.5, 15.5], "rotation": 180, "texture": "#1"}, + "east": {"uv": [8.5, 2.5, 15.5, 4], "rotation": 270, "texture": "#0"}, + "south": {"uv": [0.5, 0.5, 7.5, 7.5], "texture": "#0"}, + "west": {"uv": [8.5, 2.5, 15.5, 4], "rotation": 90, "texture": "#0"}, + "up": {"uv": [15.5, 0.5, 8.5, 2], "rotation": 180, "texture": "#0"}, + "down": {"uv": [8.5, 0.5, 15.5, 2], "texture": "#0"} + } + }, + { + "from": [3, 3, 4], + "to": [7, 7, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "east": {"uv": [6, 7, 8, 8], "rotation": 270, "texture": "#1"}, + "south": {"uv": [6, 0, 8, 2], "texture": "#1"}, + "west": {"uv": [6, 7, 8, 8], "rotation": 90, "texture": "#1"}, + "up": {"uv": [6, 7, 8, 8], "rotation": 180, "texture": "#1"}, + "down": {"uv": [6, 7, 8, 8], "texture": "#1"} + } + }, + { + "from": [9, 3, 4], + "to": [13, 7, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "east": {"uv": [6, 7, 8, 8], "rotation": 270, "texture": "#1"}, + "south": {"uv": [6, 5, 8, 7], "texture": "#1"}, + "west": {"uv": [6, 7, 8, 8], "rotation": 90, "texture": "#1"}, + "up": {"uv": [6, 7, 8, 8], "rotation": 180, "texture": "#1"}, + "down": {"uv": [6, 7, 8, 8], "texture": "#1"} + } + }, + { + "from": [3.5, 5, 6], + "to": [6.5, 5, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "up": {"uv": [11.5, 6, 13, 8], "rotation": 180, "texture": "#1"}, + "down": {"uv": [11.5, 6, 13, 8], "texture": "#1"} + } + }, + { + "from": [2.5, 2.5, 6], + "to": [7.5, 7.5, 11], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [13.5, 5, 16, 7.5], "rotation": 180, "texture": "#1"}, + "east": {"uv": [16, 2.5, 13.5, 5], "rotation": 270, "texture": "#1"}, + "south": {"uv": [13.5, 0, 16, 2.5], "texture": "#1"}, + "west": {"uv": [13.5, 2.5, 16, 5], "rotation": 90, "texture": "#1"}, + "up": {"uv": [16, 2.5, 13.5, 5], "rotation": 180, "texture": "#1"}, + "down": {"uv": [13.5, 2.5, 16, 5], "texture": "#1"} + } + }, + { + "from": [5, 8, 4], + "to": [11, 12, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 5]}, + "faces": { + "east": {"uv": [1, 0, 0, 2], "texture": "#1"}, + "south": {"uv": [1, 0, 4, 2], "texture": "#1"}, + "west": {"uv": [1, 2, 0, 0], "rotation": 180, "texture": "#1"}, + "up": {"uv": [1, 2, 4, 3], "rotation": 180, "texture": "#1"}, + "down": {"uv": [1, 2, 4, 3], "texture": "#1"} + } + }, + { + "from": [3, 12, 5], + "to": [13, 22, 5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 11, 5]}, + "faces": { + "north": {"uv": [0, 8, 5, 3], "rotation": 180, "texture": "#1"}, + "south": {"uv": [0, 3, 5, 8], "texture": "#1"} + } + } + ], + "groups": [ + { + "name": "base", + "origin": [1, 1, 1], + "color": 0, + "children": [0, 1] + }, + { + "name": "details", + "origin": [4, 6, 11], + "color": 0, + "children": [2, 3, 4] + }, + { + "name": "bulb", + "origin": [3, 6, 8], + "color": 0, + "children": [5] + }, + { + "name": "antenna", + "origin": [8, 6, 6], + "color": 0, + "children": [6, 7] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/stock_link/vertical_for_editing.json b/src/main/resources/assets/create/models/block/stock_link/vertical_for_editing.json new file mode 100644 index 0000000000..4e4e9d1d7f --- /dev/null +++ b/src/main/resources/assets/create/models/block/stock_link/vertical_for_editing.json @@ -0,0 +1,128 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/link_base_unpowered", + "1": "create:block/link_details", + "particle": "create:block/vault/vault_front_small" + }, + "elements": [ + { + "from": [1, 1, 1], + "to": [15, 4, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [8.5, 0.5, 15.5, 2], "texture": "#0"}, + "east": {"uv": [8.5, 2.5, 15.5, 4], "texture": "#0"}, + "south": {"uv": [15.5, 0.5, 8.5, 2], "texture": "#0"}, + "west": {"uv": [8.5, 2.5, 15.5, 4], "texture": "#0"}, + "up": {"uv": [0.5, 0.5, 7.5, 7.5], "rotation": 180, "texture": "#0"}, + "down": {"uv": [8.5, 8.5, 15.5, 15.5], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [1.95, -1.05, 1.95], + "to": [14.05, 1.05, 14.05], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [9, 5, 15, 6], "texture": "#0"}, + "east": {"uv": [9, 4, 15, 5], "texture": "#0"}, + "south": {"uv": [9, 5, 15, 6], "texture": "#0"}, + "west": {"uv": [9, 4, 15, 5], "texture": "#0"}, + "down": {"uv": [9, 9, 15, 15], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [9, 4, 3], + "to": [13, 6, 7], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [6, 7, 8, 8], "texture": "#1"}, + "east": {"uv": [6, 7, 8, 8], "texture": "#1"}, + "south": {"uv": [6, 7, 8, 8], "texture": "#1"}, + "west": {"uv": [6, 7, 8, 8], "texture": "#1"}, + "up": {"uv": [6, 0, 8, 2], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [3, 4, 3], + "to": [7, 6, 7], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [6, 7, 8, 8], "texture": "#1"}, + "east": {"uv": [6, 7, 8, 8], "texture": "#1"}, + "south": {"uv": [6, 7, 8, 8], "texture": "#1"}, + "west": {"uv": [6, 7, 8, 8], "texture": "#1"}, + "up": {"uv": [6, 5, 8, 7], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [9.5, 6, 5], + "to": [12.5, 10, 5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11.5, 6, 13, 8], "texture": "#1"}, + "south": {"uv": [11.5, 6, 13, 8], "texture": "#1"} + } + }, + { + "from": [8.5, 6, 2.5], + "to": [13.5, 11, 7.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [13.5, 2.5, 16, 5], "texture": "#1"}, + "east": {"uv": [13.5, 2.5, 16, 5], "texture": "#1"}, + "south": {"uv": [16, 2.5, 13.5, 5], "texture": "#1"}, + "west": {"uv": [16, 2.5, 13.5, 5], "texture": "#1"}, + "up": {"uv": [13.5, 0, 16, 2.5], "rotation": 180, "texture": "#1"}, + "down": {"uv": [13.5, 5, 16, 7.5], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [5, 4, 8], + "to": [11, 6, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [1, 2, 4, 3], "texture": "#1"}, + "east": {"uv": [1, 2, 0, 0], "rotation": 90, "texture": "#1"}, + "south": {"uv": [1, 2, 4, 3], "texture": "#1"}, + "west": {"uv": [1, 0, 0, 2], "rotation": 90, "texture": "#1"}, + "up": {"uv": [1, 0, 4, 2], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [3, 6, 10], + "to": [13, 16, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 3, 5, 8], "texture": "#1"}, + "south": {"uv": [0, 8, 5, 3], "rotation": 180, "texture": "#1"} + } + } + ], + "groups": [ + { + "name": "base", + "origin": [2, -1, 2], + "color": 0, + "children": [0, 1] + }, + { + "name": "details", + "origin": [10, 7, 5], + "color": 0, + "children": [2, 3, 4] + }, + { + "name": "bulb", + "origin": [8, 8, 8], + "color": 0, + "children": [5] + }, + { + "name": "antenna", + "origin": [8, 8, 8], + "color": 0, + "children": [6, 7] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/particles/wifi.json b/src/main/resources/assets/create/particles/wifi.json new file mode 100644 index 0000000000..fc66f4b243 --- /dev/null +++ b/src/main/resources/assets/create/particles/wifi.json @@ -0,0 +1,20 @@ +{ + "textures": [ + "create:wifi_0", + "create:wifi_1", + "create:wifi_2", + "create:wifi_3", + "create:wifi_4", + "create:wifi_5", + "create:wifi_6", + "create:wifi_7", + "create:wifi_8", + "create:wifi_9", + "create:wifi_10", + "create:wifi_11", + "create:wifi_12", + "create:wifi_13", + "create:wifi_14", + "create:wifi_15" + ] +} diff --git a/src/main/resources/assets/create/textures/block/display_link.png b/src/main/resources/assets/create/textures/block/display_link.png deleted file mode 100644 index 2f55176701ce815da259336309585b64d77f621f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1583 zcmV+~2GIG5P)Z21J15V~?2P~b1-wZ_ zK~z}7wU60vv%`A z!XvG;-g!Om^MBswec%5I0DpPw+wsNKkEzw$%o;gVRbmvb8z#?QI`b^w`S}L|kAQ#t z@LTcHTm^ueds{sB+rK8?7XcPmbc|0l0F0tG_5vjdB_-SX@AC2;KMH1Ac6B=+AwdO1!AEEsu~ zmx?&mkaiF2wi;t|pCpUM{m3si#o=?m1m@gHmnoYz{ z_jhpA5Lt`~oshgPVc7w)D3RACf=Iyg145@q=1O&+J68I{R$sBt!&jHe9LXAEY8^W| z-SdFiY%~9qPOaW%ZG9I>OLsx&^t#}9Wd_d=k`g@;1qO8vB7s>W$MMPxN>&Cy7L!u3 zw!Vww1(XW8#2W(yuJd>bXo{Tt(eZ-hch4tDI#A__E8zJdN>;{fw#P_lij1bni4vM3 zrw9(va38}1N>;*bwkZ{I>{OeKDl#eA|APA}08lFAQuQ8SKqRkA_f24X{^NOI6lQa> zp$2U@I-nke_kZ?We7vl(YwlyY+r0Lf`%g7Dg{q6Vc7)sR_B`PE0cJDkEgW*x1ZOO9 zt=^_QU+DWFUGtXXO(bxtVZK&m5Lj(WH^&BqYSI%#>N4FLI^2kEBUd4{S6=PSrh#1SCyDQ)IrrSf;oUy?jY{gEdcIVbwVe^jGe>>qsu6C zL+&+fHoFZ5-+36!l?3+8o?>oG5Q(5026#4t=Yhcg5m)|jHr_MiK8ctgthKLZl_|2S zfbYimUKjCK-#rsQ|3aDbzr4(>kxT7?QRhpV#LiBgci%Y6hnIG^@TXN_u*wHGyrxH! z&y@tkOh(RRricQ_WI)Uah|5bwPMj=ZDvnZcUy&LsJ9vztxq{|vc#=xHUJAo zp66dEC*ilQ6?y0KM=1|rD$JDxuJ5?e5u~`&;}?2eKp4&eSrVBmX#|mgEXD-UusYUA z%we23S>n?B+YIiMqo`T^b~Y7imO~un#BL}M`7xrLAqwIl0Z9_sGaV)_r@}C15-zTO zOnJUQ;fTWO#=(%lXKk9Qhwnyg*JC0rCv~G3Q4$E8m~Pm=6DpMocTJ06LVwrlZI-|B z3;=gc3#C#4wo@^MBML@-{IdG?pRcA&{>5`g8=Vexyf}R+1$cTo$BCuci6^|?8ODs= zm@5@>dUoP28ADf?!krqLMD3nR2z0svEhkECKy@(lm0`@2##GPkrwPMOl3dM782R4i z)Ey~H7NI;rb!2AEL+#YF0|RAPA!g^LFjgGOFEE;{>cV z>Xysq?Y-3C37ux&gew5lEq5%Tx3xvv_9vR~Fm7M^dw!w<-qsdR&l`OC*bD%198Wgk zyn(m1HTL3W%Oj`Tv~B;PMEL!?zldKs|E4hX01$*B)dQRAflbSalApnB7{pA%OJ|;C zr`qKD?RyVQ{?i}79=~$_P2s|;-;Yxspi4?dKM0edWR1ie#>TqI;)>2&E8pbSHJjCq z5AI8#*)V&^a_!DO+3fJ2N8fk)pZ`S>xMjO+teb4!Y$VI)!%L)= h(StBZTyOQ>@n2g*>dT6Ehw}gc002ovPDHLkV1nrT`O5$R diff --git a/src/main/resources/assets/create/textures/block/display_link_side.png b/src/main/resources/assets/create/textures/block/display_link_side.png deleted file mode 100644 index d833d6e26c0591bc21d076c8f20c9f0fa65c112e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!O@L2`>xP+~K<2pxQR^%H+fyuh zBJ8W8ObUYZirfvOTvVbRRl;l(LapQj%w?SP#q2eO!x$O885wOE84Q>h^eh~X12r?2 z1o;IsI6S+N2ITmAx;TbZ+}eA>ldnO6hv5L*K|K+TxBvgIQk>I~{@lVLQ^R<*R=*2F zK#=qN%V#z$-L&XgN5S`)a*juTou-JEl-~X2`XTj};6rx>IYp-b)eQ5OG4nJCZf^h@ O&EVF!dr$1-J)pqD;LxpJXCQI--)=TVttnRFasd*j&a676EWq&O z!iBSI!g3VfYh>!ZTRBJINV?+`S&`jxwn8-ZWGA_$rsJRSf502y>e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00j+6L_t(o!|j*tYg2a=$3M~B zhu)+~Z){Uz>KYNz(lK?NAQcp=%ral?0p?`jkg<1rF%ic8f-xA|J3-$J#@4lCU0+S= z@PTfu3^&&nb+J=vyP7`PCQVFk?#;DkFK+Km(%fn{gu&Q>@XPOa&&fUKd(QX#PT*e_ z55TLhzg!H5ROUx6(J?pyKqD~gvR-a)rhexk=8`FTd-^;82RjcJ54E>3(%((T-~^38 zGcd7Yy}E3_v-2322Cs3Y|DwkW5DuwCBMr=t!00Q_p~xbW%O2Y6s9pd-$Y?|(4HZ#@ zg0(~=P5iD1ur}kI$3M8vyugB(}xsNgE~I#Pt0t zI3-D8^7spAdVx{faXS!Mv~<#i3LD3P&Cw{5q!0@F5xqr*;t5A7n>Ppr{e*zAIZOBI zZ$r-W-kv^BZ%^Nv^Zwa)?^ZhikWHnzWoVe1S!Hy6G_mRr9_&0^3PZrJOu*l=YH=+z>&iRVzMnLxlB`!pRdy-D|*(Ds4be zvI?)f2o+gGmPFD9RS5L<^m%r*?=7A=`?Ym2Ke;LbXU`l#Fm4*OO{ZABG zK+{bW*`~GWoF(LE+*6R4zK358vL#&dPB$zB?C3>rkJQQMA`>pV^I0?Z{-PJTCc z{rbeqC^3ECvH4$~$~^G#u>-}9&L|(A`)N({zz6T_<8pt3)7=9efKx|y7vFrNh4((X zz_IwkW9NbHmJNLR{t>?TD$XYthOE0_>y|oNT0@viOML&@OQ^MV1kyJuu2Xw86G>WH zLrje3oG3P_f#n8M^Tc_;*0F6I8p^R4qTt1J6n&17=q*xs=t1-rnVQQW$6{rpN=Zb) z%i`O60a#o;!Q$ z$>si)2n5H%!!k4_Ok?jRJYYMAHkFPM{6=vBHUPV-5Y^PSQ0nOt4nQ?~{Pf zOBYhkApJn+_<>#Q*7xYq8qD;X|t_o|{z%bE`LDYZ`(OX`% zeBNX(l_jkD`Q?Xsr-@b2uxX=;wn`CtJQgWE@RTc=b#mnFe@*1X;4 zPQ!v(D!AFCR>5VP#|6`LZA8z%)#X_$1J0d~yEh^pQBm>EKORv)60HalGwD?u(LbIC z?v5=IziGkp;y33Xdl}K*O#Eh&yJL(0jqCU?O|cp<;icto00000NkvXXu0mjfo;;zu literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/link_base_unpowered.png b/src/main/resources/assets/create/textures/block/link_base_unpowered.png new file mode 100644 index 0000000000000000000000000000000000000000..23fbc43dae30c15520d6e92d3099f6c491316cf9 GIT binary patch literal 1447 zcmV;Y1z7rtP)ZWG9suVw&C>t?02y>e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00j?8L_t(o!|j*fYZO-$$3LSx zJCoVXZe~qZla0-ah=!D^O$CXd_yY{JFZ}_vQm{zrTOTSy>0eL^rF|3hrBK>5DNXZK ziQo^?(oovk7}Tz*O4i0rVt(wp>+bB#j&b_1nc3aUB&J0ulpYAP_ug~wJwLwRb5G!3 z76IVZ*I%}x5tX^oi%bsRB>*UbfM!{)Z@8Y23DQ-&%S%tZ2&+%ljWwNVQQvp)3veGvIp+(K4eA0^?wU|>FmP_1^^~f zDMUqN+r}sW7k?V7+0fb10>Id0fr(Vgg@K#blSI_@_(XZdiyxUf>CAn$JsSsLO?3*& zmgPxj^RA84^982o3mAsx=q{BL$B(d9QjnXP5$n~OKe?%ywUWY#<43$PV0)D{AS{)E zR}Df%_9IJvvIedQ^!E)2JGypTr_X#{o|v0hHUg*5Ody6Ohr*5lsi}KNl0tL1jMnYj zS{yXnmsjg96*UwjlgqCv|7s}cjzFxrmC;O=TbWvAQ4t}hIb%~Zm!%;IV z^Xn5Iqtw)_v*&+#D*eF6NB3C=x?_BJ_DAPE_X>XjXz6O>gLn3DX)wj9-XQ_tzJYl5x~Ij- zRGRjV2zSQ{&RmNcS}ZVi%s!zXXbRQU>~Ux)$K&`#AEr~S0?q|~pGE1BfZt~^Ig>+< z#{qY_^@~1UdVBYZAs@Lp?OllUWD>E;fK0C7P|zqlQ6dq=>3P*Cq3XqALQYdWQshR}Z`|FW>gAgsqK19xndw-m}HKkd4o{ z=1v~oY1uhltxRTe6%g98@VHVGyZWEB?CqR590s;02y>e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00qfOL_t(o!_AgmXdKrS$A2Tu z?2cwv`!SZrlD5?cc0w(Ii=33`$!VV==m%~C2_z2=((DNTbn4{KCv6#f{qlTwPrwNJrF;Lci1C^s~o8`|$V(uTSRz*le0CKlijB z%$H8sn^tA7^u63m4&Px!H$Fr}j3G=OowI8)d+13hm>A)^8C zukU}&AIW87n^me7$KQBY2<8N|Ke{*$jB{hv=6|c}`(~h7_et7b$F>JMDG2_YIXKPd z&;B~b#I2wIz`vIWm!Esu-!B7Rbr3uJ^6{#J-2nEBog%#aesSLn_?|$k9Cvx&0UViA zk&iwO_9dpBHu8*cUm93@@1G9`_T=JME{egTVEpUbzw-gU_2jpOo&SZfFVVKFzQrcM z3(x<^A3HEg>28^yz4(is^9F+GD^-hgCl>t7@GzO-Va}ac@GI4hlVDCjySco=X0gnT zReMji#tw|~oge;G7&|c9{}u$N3%b~EzFPDFzWdIFFybf!mf>+@TS}JU?HNGnZaFpv zw8sKi*{Fo~{G*k%urHiDvEUy)JQ+5e0RK3@!bCm;z`D6N16I|DjnVvnW*`8Zer(>K z$Y=P})-kIN`J95=?9eMGJDtmIdNdjy`JBRo8I5(*=9lM}1c1k%{HCv|dDcF7kF45h z$(|EWkEBT3X>*u-WD(sk`ODjX6GVWCe1=0aIh>M5t>rP2OCcu{Bt##(9t4u$>Mfm- zT#7?ex%kz(-bs<8%~HF$M0zMmt zj44k>)@%n5>m>xw=COXeAvD*$VU0KI*Td3J|xTY5z*Q3^GqR3L`Aj1_Fi4$pnT~iv) zlL0v?VOTZPY?@-piZOC8XFJjFkqMjzC+`(p&vtBB zPR|Xa#bqxMMzs()?k7eu(16=)VOTA6vxY_*U2t|e*3BA)vFx@Eyn8axPYXR6kdqyn zwS1a~<|aCAzuw$~e!MJrM3nKt*-CV-iF2y_5zhy3wpPEO_4zpH?l;WVR z-nLCV$HVZQPzTXw!lvI6;>1s;*b3=DjSL74G){)!Z!phSslL`iUdT1k0gQ7S_~VrE{6o}X)of~lUN zp3(0;%-eu!wxvdRrg?g5F>nAmtPE0&tPG4mmKP99L)jqLXfQH^#hHL?Lq;YB0U#X( z#F_0ZVDT&<8w3)77^ELYqgl$p%)l^#oq+|Y!obMbfN=rDRFDqV1rU>_0NEhG1T=>U ztTM>b0?2~uGBhv%$-cb$&EnLpoGKtw%G1R$B*OjeK}L`!lvI6;>1s;*b3=DjSL74G){)!Z!phSslL`iUdT1k0gQ7S_~VrE{6o}X)of~lUN zp3(0;%-eu!wxvdRrg?g5F>nAmtPE0&tPG4mmKP99L)jqLXfQH^#hHL?Lq;YB0U#X( z#F_0ZVDT&<8w3)77^ELYqgl$p%)l^#oq+|Y!obMbfN=rDRFDqV1rU>_0NEhG1T=>U ztTM>b0?2~uGBhv%$-cb$&EnLpoGKtw-_yl0B*Oje@q?TU1{^Gop8r#qGIJXVtT`~> qfcbPG$n4djudR!!-1DC0Z|q<{8q0Hj_jdbkkTIUFelF{r5}E+~FiY?N literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/particle/wifi_10.png b/src/main/resources/assets/create/textures/particle/wifi_10.png new file mode 100644 index 0000000000000000000000000000000000000000..87f80519db82faca832dcd1540ad996c236dac40 GIT binary patch literal 463 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$1AIbU4_~_U|Nnm=uj|GAk3fpKB*-rqC~*B0FHkK5XMsm#F#`kNVGw3K zp1&dmC@4|l8c`CQpH@$cc0dZzK3s^i0$OeG~AO`7&(P)-3 z0R23Hoq+|Y!obMbfN=rDRFDqV1rU>_0NEhG1T=>UtTM>b0?2~uGBhv%$-cb$&EnLp zoGKtQ%G1R$#KQk=uc6oh1rBG;@Ag|fnpoeicDDY--sBl_k#{+RALEp!7{9M8*n%8R zOSINS|54euEAz-C+bzjUuk=rLoca0Qf+W44A3n|TxOkcQ;l1Ri=MPE8bFboMs%D=b SSNSs%WTU66pUXO@geCxOMsy$m literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/particle/wifi_11.png b/src/main/resources/assets/create/textures/particle/wifi_11.png new file mode 100644 index 0000000000000000000000000000000000000000..44f5d80b50e6494775c284d2936c1d7b457bfb00 GIT binary patch literal 438 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSL74G){)!Z!phSslL`iUdT1k0gQ7S_~VrE{6o}X)of~lUN zp3(0;%-eu!wxvdRrg?g5F>nAmtPE0&tPG4mmKP99L)jqLXfQH^#hHL?Lq;YB0U#X( z#F_0ZVDT&<8w3)77^ELYqgl$p%)l^#oq+|Y!obMbfN=rDRFDqV1rU>_0NEhG1T=>U ztTM>b0?2~uGBhv%$-cb$&EnLpoGKtQ)zif>B*Ojeg=nq@10I))kN%ZE<=dsW)JSk* z7iT8x!+G=RMWXF9_usF%$oR)o)4Fo%k>x9w+%E@N?&<31vd$@?2>?=UX(a#v literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/particle/wifi_12.png b/src/main/resources/assets/create/textures/particle/wifi_12.png new file mode 100644 index 0000000000000000000000000000000000000000..38b3b40efa65855b61d164ec5f11cf814c62b23a GIT binary patch literal 395 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSL74G){)!Z!phSslL`iUdT1k0gQ7S_~VrE{6o}X)of~lUN zp3(0;%-eu!wxvdRrg?g5F>nAmtPE0&tPG4mmKP99L)jqLXfQH^#hHL?Lq;YB0U#X( z#F_0ZVDT&<8w3)77^ELYqgl$p%)l^#oq+|Y!obMbfN=rDRFDqV1rU>_0NEhG1T=>U ztTM>b0?2~uGBhv%$-cb$&EnLpoGKvG%G1R$B*Ojex!t_L0AqFd7Jr&I#=|)&)%8zF zx$2$|91IU!Ue~@U+IFoz#c}D9S=zfTzkLy8c+lU$xywmg@oWdrA&`llu6{1-oD!M< D8+244 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/particle/wifi_13.png b/src/main/resources/assets/create/textures/particle/wifi_13.png new file mode 100644 index 0000000000000000000000000000000000000000..1e16298abe9b5ac2c1c413639891ef48a4d2de5a GIT binary patch literal 363 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSL74G){)!Z!phSslL`iUdT1k0gQ7S_~VrE{6o}X)of~lUN zp3(0;%-eu!wxvdRrg?g5F>nAmtPE0&tPG4mmKP99L)jqLXfQH^#hHL?Lq;YB0U#X( z#F_0ZVDT&<8w3)77^ELYqgl$p%)l^#oq+|Y!obMbfN=rDRFDqV1rU>_0NEhG1T=>U ztTM>b0?2~uGBhv%$-cb$&EnLpoGKtw%G1R$B*OjeK}L`!lvI6;>1s;*b3=DjSL74G){)!Z!phSslL`iUdT1k0gQ7S_~VrE{6o}X)of~lUN zp3(0;%-eu!wxvdRrg?g5F>nAmtPE0&tPG4mmKP99L)jqLXfQH^#hHL?Lq;YB0U#X( z#F_0ZVDT&<8w3)77^ELYqgl$p%)l^#oq+|Y!obMbfN=rDRFDqV1rU>_0NEhG1T=>U ztTM>b0?2~uGBhv%$-cb$&EnLpoGKtw%G1R$B*OjeK}L`!lvI6;>1s;*b3=DjSL74G){)!Z!phSslL`iUdT1k0gQ7S_~VrE{6o}X)of~lUN zp3(0;%-eu!wxvdRrg?g5F>nAmtPE0&tPG4mmKP99L)jqLXfQH^#hHL?Lq;YB0U#X( z#F_0ZVDT&<8w3)77^ELYqgl$p%)l^#oq+|Y!obMbfN=rDRFDqV1rU>_0NEhG1T=>U ztTM>b0?2~uGBhv%$-cb$&EnLpoGKtw%G1R$B*OjeK}L`!lvI6;>1s;*b3=DjSL74G){)!Z!phSslL`iUdT1k0gQ7S_~VrE{6o}X)of~lUN zp3(0;%-eu!wxvdRrg?g5F>nAmtPE0&tPG4mmKP99L)jqLXfQH^#hHL?Lq;YB0U#X( z#F_0ZVDT&<8w3)77^ELYqgl$p%)l^#oq+|Y!obMbfN=rDRFDqV1rU>_0NEhG1T=>U ztTM>b0?2~uGBhv%$-cb$&EnLpoGKtQ*we)^B*OjeMMtg!1{^MdZ~x|BougnGAbn(- z(5^u7n}663-eh4H0qHuB_saOqEE}o0Hf>An)}EH1Db#*`idoy!lvI6;>1s;*b3=DjSL74G){)!Z!phSslL`iUdT1k0gQ7S_~VrE{6o}X)of~lUN zp3(0;%-eu!wxvdRrg?g5F>nAmtPE0&tPG4mmKP99L)jqLXfQH^#hHL?Lq;YB0U#X( z#F_0ZVDT&<8w3)77^ELYqgl$p%)l^#oq+|Y!obMbfN=rDRFDqV1rU>_0NEhG1T=>U ztTM>b0?2~uGBhv%$-cb$&EnLpoGKtQ#M8wwB*Ojeg@e2Y6gXNFOa8Cj)yTb4W&QMH zVLp!+zWg8S;K^bL()44=;we>6%eC}9yAtpDybO3Xe?;iTj3$tClU#zmG ev|-JU@HF1XCv9I$sw-^=Y4ddTb6Mw<&;$T&>10a) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/particle/wifi_4.png b/src/main/resources/assets/create/textures/particle/wifi_4.png new file mode 100644 index 0000000000000000000000000000000000000000..ce39b077159d8bfbf382a08d6b4449044359ecd2 GIT binary patch literal 449 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$1AIbU4_~_U|Nnm=uj|GAk3fpKB*-rqC~*B0FHkK5XMsm#F#`kNVGw3K zp1&dmC@4|l8c`CQpH@$cc0dZzK3s^i0$OeG~AO`7&(P)-3 z0R23Hoq+|Y!obMbfN=rDRFDqV1rU>_0NEhG1T=>UtTM>b0?2~uGBhv%$-cb$&EnLp zoGKvG$J50z#KQk=k0&1}P#gc--*Ph4yC|{#n5Bm^`%%7{#+t@G8XZlUQ!jVklALDA zSjEY$cc0dZzK3s^i0$OeG~AO`7&(P)-3 z0R23Hoq+|Y!obMbfN=rDRFDqV1rU>_0NEhG1T=>UtTM>b0?2~uGBhv%$-cb$&EnLp zoGKtQ)zif>#KQk=-$A|u3LMT8|Nnm>x+3(Z%750gLxE3A-S?=lT=d#Wzp$Pzh1bPAh literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/particle/wifi_6.png b/src/main/resources/assets/create/textures/particle/wifi_6.png new file mode 100644 index 0000000000000000000000000000000000000000..cb0d52a4366058c6deda32f247ed5a1c01dddb16 GIT binary patch literal 478 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$1AIbU4_~_U|Nnm=uj|GAk3fpKB*-rqC~*B0FHkK5XMsm#F#`kNVGw3K zp1&dmC@4|l8c`CQpH@$cc0dZzK3s^i0$OeG~AO`7&(P)-3 z0R23Hoq+|Y!obMbfN=rDRFDqV1rU>_0NEhG1T=>UtTM>b0?2~uGBhv%$-cb$&EnLp zoGKtQ)6>N<#KQk=ucOcbV4&*$uP^cC;E+w<^W}w{PlLi?zB>)Y%;(NGew=V`vY!dt zR&CSA4F^_6GL`ZR-sI^y|5V5Mw@jyj(E7@I(HjMwj!LXK$Mxas+8@37lVd)0?PJeS hpUv=+G4L$cc0dZzK3s^i0$OeG~AO`7&(P)-3 z0R23Hoq+|Y!obMbfN=rDRFDqV1rU>_0NEhG1T=>UtTM>b0?2~uGBhv%$-cb$&EnLp zoGKtQ&(p;*#KQk=|3$$A3LMTWfAi}qPGo*Pm-~lZgWADWz1;c^aSdAm6k8#R`Sx4U=>?_}t o?`n2q`ufHNKhl3nSr{E-IsKG9^u}E$P#iFLy85}Sb4q9e07^4|KL7v# literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/particle/wifi_8.png b/src/main/resources/assets/create/textures/particle/wifi_8.png new file mode 100644 index 0000000000000000000000000000000000000000..e2354113bc41f2934a52e3350339a5b38da1542e GIT binary patch literal 483 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$1AIbU4_~_U|Nnm=uj|GAk3fpKB*-rqC~*B0FHkK5XMsm#F#`kNVGw3K zp1&dmC@4|l8c`CQpH@$cc0dZzK3s^i0$OeG~AO`7&(P)-3 z0R23Hoq+|Y!obMbfN=rDRFDqV1rU>_0NEhG1T=>UtTM>b0?2~uGBhv%$-cb$&EnLp zoGKtQ&(p;*#KQk=e<0rh1s1D#VO@n`Jbu2OYa3@LO{P}?TlS+}l^|cl+EZN9&+Tli2f$(w$x!M2tbtRe3U%W7( owaDXJ@NL#@?`Q4NyJPU2^XL@z^vYkit3j^tboFyt=akR{0H7FtyZ`_I literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/particle/wifi_9.png b/src/main/resources/assets/create/textures/particle/wifi_9.png new file mode 100644 index 0000000000000000000000000000000000000000..8c2cd615e554e9f1c7bf1ec55ae3d86672da7571 GIT binary patch literal 476 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$1AIbU4_~_U|Nnm=uj|GAk3fpKB*-rqC~*B0FHkK5XMsm#F#`kNVGw3K zp1&dmC@4|l8c`CQpH@$cc0dZzK3s^i0$OeG~AO`7&(P)-3 z0R23Hoq+|Y!obMbfN=rDRFDqV1rU>_0NEhG1T=>UtTM>b0?2~uGBhv%$-cb$&EnLp zoGKtQ-P6S}#KQk=Um)KB1rBG)@AhAgh-&B@)46$m(%0o%Z9*>g);+ky&S=>d#VSAP z#7vGA)u;chOF!@@`M0X9fmtDU_}peqZw<}|w$1{~6TTJ6+ Date: Sat, 18 Jan 2025 15:47:16 +0100 Subject: [PATCH 325/515] Postmerge --- .../content/redstone/displayLink/DisplayLinkBlockEntity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/simibubi/create/content/redstone/displayLink/DisplayLinkBlockEntity.java b/src/main/java/com/simibubi/create/content/redstone/displayLink/DisplayLinkBlockEntity.java index c72e7cf026..f256d0e1de 100644 --- a/src/main/java/com/simibubi/create/content/redstone/displayLink/DisplayLinkBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/redstone/displayLink/DisplayLinkBlockEntity.java @@ -14,7 +14,7 @@ import com.simibubi.create.content.redstone.displayLink.target.DisplayTarget; import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; -import net.createmod.catnip.utility.VecHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; From 1135b287a25a9666f75fbf2a4b7da73e46076ee2 Mon Sep 17 00:00:00 2001 From: Kryppers <65094918+Kryppers@users.noreply.github.com> Date: Sat, 18 Jan 2025 15:48:42 +0000 Subject: [PATCH 326/515] bit more yellow tweaked linked packager colours --- .../block/packager_horizontal_linked.png | Bin 2121 -> 2153 bytes .../block/packager_vertical_linked.png | Bin 2250 -> 2281 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/create/textures/block/packager_horizontal_linked.png b/src/main/resources/assets/create/textures/block/packager_horizontal_linked.png index 4d6c778115589850e2f44535182c36ec19207adf..d6e5f93c0365fe4d71e75d981a2e464ca02b995c 100644 GIT binary patch delta 2084 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 KMNUMnLSTZOl;zL> diff --git a/src/main/resources/assets/create/textures/block/packager_vertical_linked.png b/src/main/resources/assets/create/textures/block/packager_vertical_linked.png index e1069290f824c89d401cbe159fad5389cce90db4..d3eb41a37ebb66dda539ef39419953a8aebe52c0 100644 GIT binary patch delta 2241 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 From fa17dd851ec3e4b85ace7ba2c123960a8e407166 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Sat, 18 Jan 2025 18:24:32 +0100 Subject: [PATCH 327/515] Split personality - Fix chain riding players not animating the hat layer - Registered new rare packages to show in game - Players now dismount from chain conveyors if they unequip the wrench - Packages on belts no longer all face the same direction - Brass tunnels now try to distribute an item more quickly when it first arrives --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 10 +++++++-- .../models/item/rare_darcy_package.json | 6 +++++ .../create/models/item/rare_evan_package.json | 6 +++++ .../models/item/rare_starlotte_package.json | 6 +++++ .../models/item/rare_thunder_package.json | 6 +++++ .../create/models/item/rare_up_package.json | 6 +++++ .../models/item/rare_vector_package.json | 6 +++++ .../data/create/tags/items/packages.json | 12 +++++++--- .../belt/transport/TransportedItemStack.java | 2 +- .../ChainConveyorRidingHandler.java | 5 +++++ .../content/logistics/box/PackageStyles.java | 22 ++++++++++++++----- .../tunnel/BrassTunnelBlockEntity.java | 16 ++++++++++---- .../render/PlayerSkyhookRenderer.java | 5 +++++ 13 files changed, 92 insertions(+), 16 deletions(-) create mode 100644 src/generated/resources/assets/create/models/item/rare_darcy_package.json create mode 100644 src/generated/resources/assets/create/models/item/rare_evan_package.json create mode 100644 src/generated/resources/assets/create/models/item/rare_starlotte_package.json create mode 100644 src/generated/resources/assets/create/models/item/rare_thunder_package.json create mode 100644 src/generated/resources/assets/create/models/item/rare_up_package.json create mode 100644 src/generated/resources/assets/create/models/item/rare_vector_package.json diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 9c0109753c..455fb12c6d 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2025-01-18T13:14:26.2262033 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2025-01-18T17:58:23.8133105 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -2369,9 +2369,15 @@ ebffb05119f499fcec051a4337aadc47654baed2 assets/create/models/item/purple_valve_ f91405b9aec1e0142c1b90582e03a1973251da05 assets/create/models/item/radial_chassis.json 1c984ea9dbaec02e88dba1b81906c9acca7ed672 assets/create/models/item/railway_casing.json 87c4c0e13441cf0238103ca065c0c16f80f60f26 assets/create/models/item/rare_creeper_package.json +f15145349b717dbd58b696019d38c7c8c506dee2 assets/create/models/item/rare_darcy_package.json +8bb602b530ac2c1301776b83673ef062b7b0ace6 assets/create/models/item/rare_evan_package.json f982794c2e01a70fcc2bb009bcb8cd06a2ea5510 assets/create/models/item/rare_jinx_package.json 9f4de06da4d9c2b54b758b2b01e0595811338b94 assets/create/models/item/rare_kryppers_package.json 7830b48ef4292922f0ef13f9a7c2ee7d47366169 assets/create/models/item/rare_simi_package.json +fd2345d4e4012ba238501985962cf9d34ab2cd34 assets/create/models/item/rare_starlotte_package.json +d3274003067a943d749ba5d23b5abc0fee8727a2 assets/create/models/item/rare_thunder_package.json +95aae4907a2435e31f079411dd1b3625ab2689c4 assets/create/models/item/rare_up_package.json +48ceaaead35ae1422542a615c9db55bd88f464e6 assets/create/models/item/rare_vector_package.json 5f8e5283fbebb452f1a1141b33ee73f08879c75d assets/create/models/item/raw_zinc.json 4631d67976cef148c346a7016baaa6703e4f243e assets/create/models/item/raw_zinc_block.json 9dc6c52e258b00cac6ed23147983045c43218b5d assets/create/models/item/redstone_contact.json @@ -4713,7 +4719,7 @@ ebd7b09daf2f64c0c04d821696b0e145683d8693 data/create/tags/items/dyed_table_cloth d2bb65d893d71d2d9871f81f430c233a93adb4bb data/create/tags/items/invalid_for_track_paving.json 1cebeb92bd514b75d54ac6d5708047801f0501c5 data/create/tags/items/modded_stripped_logs.json 586f8fc5a8b8559c9dc0017e13c78ad918688fae data/create/tags/items/modded_stripped_wood.json -b96668734c9b7a90348235217512d49193e4ea7f data/create/tags/items/packages.json +cebf5fd98eddf5c14befdd47052be678eea79542 data/create/tags/items/packages.json f400870b8dbcd14238be3ec99c419093073ba3a6 data/create/tags/items/postboxes.json 695d75b352fd190b303c724d1aaee9bb786a903b data/create/tags/items/pressurized_air_sources.json 22c4d4e033a61942b170aa309ed46a89a0ba0c65 data/create/tags/items/pulpifiable.json diff --git a/src/generated/resources/assets/create/models/item/rare_darcy_package.json b/src/generated/resources/assets/create/models/item/rare_darcy_package.json new file mode 100644 index 0000000000..d5a366d229 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/rare_darcy_package.json @@ -0,0 +1,6 @@ +{ + "parent": "create:item/package/custom_12x10", + "textures": { + "2": "create:item/package/rare_darcy" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/rare_evan_package.json b/src/generated/resources/assets/create/models/item/rare_evan_package.json new file mode 100644 index 0000000000..28aa663b83 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/rare_evan_package.json @@ -0,0 +1,6 @@ +{ + "parent": "create:item/package/custom_12x10", + "textures": { + "2": "create:item/package/rare_evan" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/rare_starlotte_package.json b/src/generated/resources/assets/create/models/item/rare_starlotte_package.json new file mode 100644 index 0000000000..d46b50c63e --- /dev/null +++ b/src/generated/resources/assets/create/models/item/rare_starlotte_package.json @@ -0,0 +1,6 @@ +{ + "parent": "create:item/package/custom_12x10", + "textures": { + "2": "create:item/package/rare_starlotte" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/rare_thunder_package.json b/src/generated/resources/assets/create/models/item/rare_thunder_package.json new file mode 100644 index 0000000000..45d192ce32 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/rare_thunder_package.json @@ -0,0 +1,6 @@ +{ + "parent": "create:item/package/custom_12x10", + "textures": { + "2": "create:item/package/rare_thunder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/rare_up_package.json b/src/generated/resources/assets/create/models/item/rare_up_package.json new file mode 100644 index 0000000000..562b182ac2 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/rare_up_package.json @@ -0,0 +1,6 @@ +{ + "parent": "create:item/package/custom_12x10", + "textures": { + "2": "create:item/package/rare_up" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/rare_vector_package.json b/src/generated/resources/assets/create/models/item/rare_vector_package.json new file mode 100644 index 0000000000..4aa2f054e5 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/rare_vector_package.json @@ -0,0 +1,6 @@ +{ + "parent": "create:item/package/custom_12x10", + "textures": { + "2": "create:item/package/rare_vector" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/tags/items/packages.json b/src/generated/resources/data/create/tags/items/packages.json index a08a75211a..3dac74ee02 100644 --- a/src/generated/resources/data/create/tags/items/packages.json +++ b/src/generated/resources/data/create/tags/items/packages.json @@ -4,9 +4,15 @@ "create:cardboard_package_10x12", "create:cardboard_package_10x8", "create:cardboard_package_12x10", - "create:rare_kryppers_package", - "create:rare_jinx_package", "create:rare_creeper_package", - "create:rare_simi_package" + "create:rare_darcy_package", + "create:rare_evan_package", + "create:rare_jinx_package", + "create:rare_kryppers_package", + "create:rare_simi_package", + "create:rare_starlotte_package", + "create:rare_thunder_package", + "create:rare_up_package", + "create:rare_vector_package" ] } \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/content/kinetics/belt/transport/TransportedItemStack.java b/src/main/java/com/simibubi/create/content/kinetics/belt/transport/TransportedItemStack.java index 5ad1801a17..215a17ef4f 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/belt/transport/TransportedItemStack.java +++ b/src/main/java/com/simibubi/create/content/kinetics/belt/transport/TransportedItemStack.java @@ -34,7 +34,7 @@ public class TransportedItemStack implements Comparable { boolean centered = BeltHelper.isItemUpright(stack); angle = centered ? 180 : R.nextInt(360); if (PackageItem.isPackage(stack)) - angle = 180 + R.nextInt(10); + angle = R.nextInt(4) * 90 + R.nextInt(20) - 10; sideOffset = prevSideOffset = getTargetSideOffset(); insertedFrom = Direction.UP; } diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRidingHandler.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRidingHandler.java index 14252d017d..4efd53ab27 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRidingHandler.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRidingHandler.java @@ -1,6 +1,7 @@ package com.simibubi.create.content.kinetics.chainConveyor; import com.simibubi.create.AllPackets; +import com.simibubi.create.AllTags.AllItemTags; import com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorBlockEntity.ConnectionStats; import com.simibubi.create.foundation.utility.ServerSpeedProvider; @@ -45,6 +46,10 @@ public class ChainConveyorRidingHandler { Minecraft mc = Minecraft.getInstance(); if (mc.isPaused()) return; + if (!AllItemTags.WRENCH.matches(mc.player.getMainHandItem())) { + stopRiding(); + return; + } BlockEntity blockEntity = mc.level.getBlockEntity(ridingChainConveyor); if (mc.player.isShiftKeyDown() || !(blockEntity instanceof ChainConveyorBlockEntity clbe)) { stopRiding(); diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageStyles.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageStyles.java index 57b391e93c..ade6e1095a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageStyles.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageStyles.java @@ -33,11 +33,17 @@ public class PackageStyles { new PackageStyle("cardboard", 10, 8, 18f, false), new PackageStyle("cardboard", 12, 10, 21f, false), - new PackageStyle("rare_kryppers", 12, 10, 21f, true), - new PackageStyle("rare_jinx", 12, 10, 21f, true), - new PackageStyle("rare_creeper", 12, 10, 21f, true), - new PackageStyle("rare_simi", 12, 10, 21f, true) - + rare("creeper"), + rare("darcy"), + rare("evan"), + rare("jinx"), + rare("kryppers"), + rare("simi"), + rare("starlotte"), + rare("thunder"), + rare("up"), + rare("vector") + )); public static final List ALL_BOXES = new ArrayList<>(); @@ -45,7 +51,7 @@ public class PackageStyles { public static final List RARE_BOXES = new ArrayList<>(); private static final Random STYLE_PICKER = new Random(); - private static final int RARE_CHANCE = 5000; // addons, have mercy + private static final int RARE_CHANCE = 7500; // addons, have mercy public static ItemStack getRandomBox() { List pool = STYLE_PICKER.nextInt(RARE_CHANCE) == 0 ? RARE_BOXES : STANDARD_BOXES; @@ -55,5 +61,9 @@ public class PackageStyles { public static ItemStack getDefaultBox() { return new ItemStack(ALL_BOXES.get(0)); } + + private static PackageStyle rare(String name) { + return new PackageStyle("rare_" + name, 12, 10, 21f, true); + } } diff --git a/src/main/java/com/simibubi/create/content/logistics/tunnel/BrassTunnelBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/tunnel/BrassTunnelBlockEntity.java index 5a946a0b40..9ad5197130 100644 --- a/src/main/java/com/simibubi/create/content/logistics/tunnel/BrassTunnelBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/tunnel/BrassTunnelBlockEntity.java @@ -76,6 +76,7 @@ public class BrassTunnelBlockEntity extends BeltTunnelBlockEntity implements IHa // Couple>> distributionTargets; + private boolean newItemArrived; private boolean syncedOutputActive; private Set syncSet; @@ -175,11 +176,16 @@ public class BrassTunnelBlockEntity extends BeltTunnelBlockEntity implements IHa .isEmpty()) return; - if (selectionMode.get() != SelectionMode.SYNCHRONIZE || syncedOutputActive) { - distributionProgress = AllConfigs.server().logistics.brassTunnelTimer.get(); - sendData(); + if (newItemArrived) { + newItemArrived = false; + distributionProgress = 2; + } else { + if (selectionMode.get() != SelectionMode.SYNCHRONIZE || syncedOutputActive) { + distributionProgress = AllConfigs.server().logistics.brassTunnelTimer.get(); + sendData(); + } + return; } - return; } if (distributionProgress != 0) @@ -328,6 +334,8 @@ public class BrassTunnelBlockEntity extends BeltTunnelBlockEntity implements IHa stackToDistribute = stack; stackEnteredFrom = enteredFrom; distributionProgress = -1; + if (!stack.isEmpty()) + newItemArrived = true; sendData(); setChanged(); } diff --git a/src/main/java/com/simibubi/create/foundation/render/PlayerSkyhookRenderer.java b/src/main/java/com/simibubi/create/foundation/render/PlayerSkyhookRenderer.java index 8055ad529c..7a897445e2 100644 --- a/src/main/java/com/simibubi/create/foundation/render/PlayerSkyhookRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/render/PlayerSkyhookRenderer.java @@ -25,6 +25,7 @@ public class PlayerSkyhookRenderer { return; model.head.resetPose(); + model.hat.resetPose(); model.body.resetPose(); model.leftArm.resetPose(); model.rightArm.resetPose(); @@ -39,6 +40,7 @@ public class PlayerSkyhookRenderer { private static void setHangingPose(HumanoidModel model) { model.head.x = 0; + model.hat.x = 0; model.body.resetPose(); model.leftArm.resetPose(); model.rightArm.resetPose(); @@ -53,6 +55,7 @@ public class PlayerSkyhookRenderer { model.body.zRot = bodySwing; model.head.zRot = bodySwing; + model.hat.zRot = bodySwing; model.rightArm.y -= 3; @@ -87,12 +90,14 @@ public class PlayerSkyhookRenderer { model.leftLeg.xRot = AngleHelper.rad(10); model.leftLeg.zRot = -AngleHelper.rad(10) + 0.5f * bodySwing + limbSwing; + model.hat.x -= armPivotX; model.head.x -= armPivotX; model.body.x -= armPivotX; model.leftArm.x -= armPivotX; model.leftLeg.x -= armPivotX; model.rightLeg.x -= armPivotX; + model.hat.y -= armPivotY; model.head.y -= armPivotY; model.body.y -= armPivotY; model.leftArm.y -= armPivotY; From ae04f58dcb7bbcfbcddbc6fd307872701701603a Mon Sep 17 00:00:00 2001 From: Kryppers <65094918+Kryppers@users.noreply.github.com> Date: Sat, 18 Jan 2025 18:24:07 +0000 Subject: [PATCH 328/515] brass tacks updated brass sheet asset --- .../assets/create/textures/item/brass_sheet.png | Bin 337 -> 365 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/create/textures/item/brass_sheet.png b/src/main/resources/assets/create/textures/item/brass_sheet.png index 17416e41e6ffce2e53145e376645b6a94b5e7a8b..1b2861c362029f784294c2978c6447617570b4a5 100644 GIT binary patch delta 332 zcmcb}^p~zVC zSB)NBI-<1x@Q3FQMJ>)AIB*~!wsZ>PT>-Zl&$j%mj}@5cpB|W_kiuci%*@=(AspSz z^`4o{@NfwmTUZ(!TbU+X+x+vA5d co4FYnY@7>qFVdQ&MBb@0L+Jn(f|Me delta 304 zcmaFMbdhO-R=qg`5EkF={LH|>z**oCS Date: Sat, 18 Jan 2025 12:04:26 -0600 Subject: [PATCH 329/515] Right in the wheels - Combine water wheel models in visuals between axes - Add WaterWHeelRenderer.Variant to distinguish between small, large, and large extension models - Move WaterWheelModelKey back into WaterWheelRenderer - Add separate WaterWheelVisual.ModelKey because it needs less data - Combine encased cog models between axes - Move MixerVisual to extend SingleAxisRotatingVisual --- .../content/kinetics/mixer/MixerVisual.java | 10 +--- .../encased/EncasedCogVisual.java | 57 +++++++++---------- .../waterwheel/WaterWheelModelKey.java | 6 -- .../waterwheel/WaterWheelRenderer.java | 56 ++++++++++++------ .../kinetics/waterwheel/WaterWheelVisual.java | 36 ++++++------ 5 files changed, 86 insertions(+), 79 deletions(-) delete mode 100644 src/main/java/com/simibubi/create/content/kinetics/waterwheel/WaterWheelModelKey.java diff --git a/src/main/java/com/simibubi/create/content/kinetics/mixer/MixerVisual.java b/src/main/java/com/simibubi/create/content/kinetics/mixer/MixerVisual.java index 1157b7d889..a810d473d5 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/mixer/MixerVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/mixer/MixerVisual.java @@ -4,6 +4,7 @@ import java.util.function.Consumer; import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.kinetics.base.RotatingInstance; +import com.simibubi.create.content.kinetics.base.SingleAxisRotatingVisual; import com.simibubi.create.content.kinetics.simpleRelays.encased.EncasedCogVisual; import com.simibubi.create.foundation.render.AllInstanceTypes; @@ -17,14 +18,14 @@ import dev.engine_room.flywheel.lib.model.Models; import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; import net.minecraft.core.Direction; -public class MixerVisual extends EncasedCogVisual implements SimpleDynamicVisual { +public class MixerVisual extends SingleAxisRotatingVisual implements SimpleDynamicVisual { private final RotatingInstance mixerHead; private final OrientedInstance mixerPole; private final MechanicalMixerBlockEntity mixer; public MixerVisual(VisualizationContext context, MechanicalMixerBlockEntity blockEntity, float partialTick) { - super(context, blockEntity, false, partialTick); + super(context, blockEntity, partialTick, Models.partial(AllPartialModels.SHAFTLESS_COGWHEEL)); this.mixer = blockEntity; mixerHead = instancerProvider().instancer(AllInstanceTypes.ROTATING, Models.partial(AllPartialModels.MECHANICAL_MIXER_HEAD)) @@ -38,11 +39,6 @@ public class MixerVisual extends EncasedCogVisual implements SimpleDynamicVisual animate(partialTick); } - @Override - protected Model getCogModel() { - return Models.partial(AllPartialModels.SHAFTLESS_COGWHEEL); - } - @Override public void beginFrame(DynamicVisual.Context ctx) { animate(ctx.partialTick()); diff --git a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogVisual.java b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogVisual.java index c52605f745..bdbff6786c 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/simpleRelays/encased/EncasedCogVisual.java @@ -38,19 +38,24 @@ public class EncasedCogVisual extends KineticBlockEntityVisual consumer) { consumer.accept(rotatingModel); diff --git a/src/main/java/com/simibubi/create/content/kinetics/waterwheel/WaterWheelModelKey.java b/src/main/java/com/simibubi/create/content/kinetics/waterwheel/WaterWheelModelKey.java deleted file mode 100644 index 4999cb96db..0000000000 --- a/src/main/java/com/simibubi/create/content/kinetics/waterwheel/WaterWheelModelKey.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.simibubi.create.content.kinetics.waterwheel; - -import net.minecraft.world.level.block.state.BlockState; - -public record WaterWheelModelKey(boolean large, BlockState state, BlockState material) { -} diff --git a/src/main/java/com/simibubi/create/content/kinetics/waterwheel/WaterWheelRenderer.java b/src/main/java/com/simibubi/create/content/kinetics/waterwheel/WaterWheelRenderer.java index 35cc8bf1c8..a76dd26df6 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/waterwheel/WaterWheelRenderer.java +++ b/src/main/java/com/simibubi/create/content/kinetics/waterwheel/WaterWheelRenderer.java @@ -11,6 +11,7 @@ import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.kinetics.base.KineticBlockEntityRenderer; import com.simibubi.create.foundation.model.BakedModelHelper; +import dev.engine_room.flywheel.lib.model.baked.PartialModel; import it.unimi.dsi.fastutil.objects.Reference2ReferenceOpenHashMap; import net.createmod.catnip.platform.CatnipServices; import net.createmod.catnip.render.CachedBuffers; @@ -35,7 +36,7 @@ import net.minecraftforge.client.model.data.ModelData; import net.minecraftforge.registries.ForgeRegistries; public class WaterWheelRenderer extends KineticBlockEntityRenderer { - public static final SuperByteBufferCache.Compartment WATER_WHEEL = new SuperByteBufferCache.Compartment<>(); + public static final SuperByteBufferCache.Compartment WATER_WHEEL = new SuperByteBufferCache.Compartment<>(); public static final StitchedSprite OAK_PLANKS_TEMPLATE = new StitchedSprite(new ResourceLocation("block/oak_planks")); public static final StitchedSprite OAK_LOG_TEMPLATE = new StitchedSprite(new ResourceLocation("block/oak_log")); @@ -58,7 +59,7 @@ public class WaterWheelRenderer extends Kinetic @Override protected SuperByteBuffer getRotatedModel(T be, BlockState state) { - WaterWheelModelKey key = new WaterWheelModelKey(large, state, be.material); + ModelKey key = new ModelKey(large, state, be.material); return SuperByteBufferCache.getInstance().get(WATER_WHEEL, key, () -> { BakedModel model = generateModel(key); BlockState state1 = key.state(); @@ -73,21 +74,12 @@ public class WaterWheelRenderer extends Kinetic }); } - public static BakedModel generateModel(WaterWheelModelKey key) { - BakedModel template; - if (key.large()) { - boolean extension = key.state() - .getValue(LargeWaterWheelBlock.EXTENSION); - if (extension) { - template = AllPartialModels.LARGE_WATER_WHEEL_EXTENSION.get(); - } else { - template = AllPartialModels.LARGE_WATER_WHEEL.get(); - } - } else { - template = AllPartialModels.WATER_WHEEL.get(); - } + public static BakedModel generateModel(ModelKey key) { + return generateModel(Variant.of(key.large(), key.state()), key.material()); + } - return generateModel(template, key.material()); + public static BakedModel generateModel(Variant variant, BlockState material) { + return generateModel(variant.model(), material); } public static BakedModel generateModel(BakedModel template, BlockState planksBlockState) { @@ -168,4 +160,36 @@ public class WaterWheelRenderer extends Kinetic return model.getParticleIcon(ModelData.EMPTY); } + public enum Variant { + SMALL(AllPartialModels.WATER_WHEEL), + LARGE(AllPartialModels.LARGE_WATER_WHEEL), + LARGE_EXTENSION(AllPartialModels.LARGE_WATER_WHEEL_EXTENSION), + ; + + private final PartialModel partial; + + Variant(PartialModel partial) { + this.partial = partial; + } + + public BakedModel model() { + return partial.get(); + } + + public static Variant of(boolean large, BlockState blockState) { + if (large) { + boolean extension = blockState.getValue(LargeWaterWheelBlock.EXTENSION); + if (extension) { + return LARGE_EXTENSION; + } else { + return LARGE; + } + } else { + return SMALL; + } + } + } + + public record ModelKey(boolean large, BlockState state, BlockState material) { + } } diff --git a/src/main/java/com/simibubi/create/content/kinetics/waterwheel/WaterWheelVisual.java b/src/main/java/com/simibubi/create/content/kinetics/waterwheel/WaterWheelVisual.java index f89364570e..886e808221 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/waterwheel/WaterWheelVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/waterwheel/WaterWheelVisual.java @@ -2,9 +2,9 @@ package com.simibubi.create.content.kinetics.waterwheel; import java.util.function.Consumer; -import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.content.kinetics.base.KineticBlockEntityVisual; import com.simibubi.create.content.kinetics.base.RotatingInstance; +import com.simibubi.create.content.kinetics.waterwheel.WaterWheelRenderer.Variant; import com.simibubi.create.foundation.render.AllInstanceTypes; import dev.engine_room.flywheel.api.instance.Instance; @@ -12,14 +12,11 @@ import dev.engine_room.flywheel.api.model.Model; import dev.engine_room.flywheel.api.visualization.VisualizationContext; import dev.engine_room.flywheel.lib.model.baked.BakedModelBuilder; import dev.engine_room.flywheel.lib.util.RendererReloadCache; -import net.createmod.catnip.render.CachedBuffers; import net.minecraft.client.resources.model.BakedModel; -import net.minecraft.core.Direction; -import net.minecraft.core.Direction.AxisDirection; import net.minecraft.world.level.block.state.BlockState; public class WaterWheelVisual extends KineticBlockEntityVisual { - private static final RendererReloadCache MODEL_CACHE = new RendererReloadCache<>(WaterWheelVisual::createModel); + private static final RendererReloadCache MODEL_CACHE = new RendererReloadCache<>(WaterWheelVisual::createModel); protected final boolean large; protected BlockState lastMaterial; @@ -42,9 +39,12 @@ public class WaterWheelVisual extends KineticBl private void setupInstance() { lastMaterial = blockEntity.material; - rotatingModel = instancerProvider().instancer(AllInstanceTypes.ROTATING, MODEL_CACHE.get(new WaterWheelModelKey(large, blockState, blockEntity.material))) + rotatingModel = instancerProvider().instancer(AllInstanceTypes.ROTATING, MODEL_CACHE.get(new ModelKey(Variant.of(large, blockState), blockEntity.material))) .createInstance(); - setup(rotatingModel); + rotatingModel.setup(blockEntity) + .setPosition(getVisualPosition()) + .rotateToFace(rotationAxis()) + .setChanged(); } @Override @@ -52,9 +52,10 @@ public class WaterWheelVisual extends KineticBl if (lastMaterial != blockEntity.material) { rotatingModel.delete(); setupInstance(); + } else { + rotatingModel.setup(blockEntity) + .setChanged(); } - - updateRotation(rotatingModel); } @Override @@ -72,18 +73,13 @@ public class WaterWheelVisual extends KineticBl consumer.accept(rotatingModel); } - private static Model createModel(WaterWheelModelKey key) { - BakedModel model = WaterWheelRenderer.generateModel(key); - BlockState state = key.state(); - Direction dir; - if (key.large()) { - dir = Direction.fromAxisAndDirection(state.getValue(LargeWaterWheelBlock.AXIS), AxisDirection.POSITIVE); - } else { - dir = state.getValue(WaterWheelBlock.FACING); - } - PoseStack transform = CachedBuffers.rotateToFaceVertical(dir).get(); + private static Model createModel(ModelKey key) { + BakedModel model = WaterWheelRenderer.generateModel(key.variant(), key.material()); return BakedModelBuilder.create(model) - .poseStack(transform) .build(); } + + public record ModelKey(WaterWheelRenderer.Variant variant, BlockState material) { + + } } From 565864eae54dad226e10c5eb83cc546658fa5cc2 Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Sat, 18 Jan 2025 12:45:14 -0600 Subject: [PATCH 330/515] It's a setup - Inline KineticBlockEntityVisual#updateRotation and #setup --- .../base/KineticBlockEntityVisual.java | 39 ------------------- .../content/kinetics/belt/BeltVisual.java | 13 +++++-- .../kinetics/crank/HandCrankVisual.java | 13 ++++--- .../kinetics/flywheel/FlywheelVisual.java | 14 +++++-- .../BracketedKineticBlockEntityVisual.java | 6 +-- 5 files changed, 30 insertions(+), 55 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/kinetics/base/KineticBlockEntityVisual.java b/src/main/java/com/simibubi/create/content/kinetics/base/KineticBlockEntityVisual.java index 6539c7b207..87291d3c53 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/base/KineticBlockEntityVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/base/KineticBlockEntityVisual.java @@ -15,45 +15,6 @@ public abstract class KineticBlockEntityVisual ext super(context, blockEntity, partialTick); } - protected final void updateRotation(RotatingInstance instance) { - instance.setup(blockEntity) - .setChanged(); - } - - protected final void updateRotation(RotatingInstance instance, Direction.Axis axis) { - instance.setup(blockEntity, axis) - .setChanged(); - } - - protected final void updateRotation(RotatingInstance instance, float speed) { - instance.setup(blockEntity, speed) - .setChanged(); - } - - protected final void updateRotation(RotatingInstance instance, Direction.Axis axis, float speed) { - instance.setup(blockEntity, axis, speed) - .setChanged(); - } - - protected final RotatingInstance setup(RotatingInstance key) { - key.setup(blockEntity).setPosition(getVisualPosition()).setChanged(); - return key; - } - - protected final RotatingInstance setup(RotatingInstance key, Direction.Axis axis) { - key.setup(blockEntity, axis).setPosition(getVisualPosition()).setChanged(); - return key; - } - - protected final RotatingInstance setup(RotatingInstance key, float speed) { - key.setup(blockEntity, speed).setPosition(getVisualPosition()).setChanged(); - return key; - } - - protected float getRotationOffset(final Direction.Axis axis) { - return rotationOffset(blockState, axis, pos) + blockEntity.getRotationAngleOffset(axis); - } - protected Direction.Axis rotationAxis() { return rotationAxis(blockState); } diff --git a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltVisual.java b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltVisual.java index 8acd974f25..05f20ca30a 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltVisual.java @@ -60,9 +60,13 @@ public class BeltVisual extends KineticBlockEntityVisual { } if (blockEntity.hasPulley()) { - pulley = setup(instancerProvider() + pulley = instancerProvider() .instancer(AllInstanceTypes.ROTATING, getPulleyModel()) - .createInstance()); + .createInstance(); + + pulley.setup(BeltVisual.this.blockEntity) + .setPosition(getVisualPosition()) + .setChanged(); } else { pulley = null; } @@ -82,8 +86,9 @@ public class BeltVisual extends KineticBlockEntityVisual { } if (pulley != null) { - updateRotation(pulley); - } + pulley.setup(blockEntity) + .setChanged(); + } } @Override diff --git a/src/main/java/com/simibubi/create/content/kinetics/crank/HandCrankVisual.java b/src/main/java/com/simibubi/create/content/kinetics/crank/HandCrankVisual.java index 01af44aadd..2183e52438 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/crank/HandCrankVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/crank/HandCrankVisual.java @@ -10,7 +10,6 @@ import com.simibubi.create.content.kinetics.base.RotatingInstance; import com.simibubi.create.foundation.render.AllInstanceTypes; import dev.engine_room.flywheel.api.instance.Instance; -import dev.engine_room.flywheel.api.model.Model; import dev.engine_room.flywheel.api.visual.DynamicVisual; import dev.engine_room.flywheel.api.visualization.VisualizationContext; import dev.engine_room.flywheel.lib.instance.InstanceTypes; @@ -33,9 +32,12 @@ public class HandCrankVisual extends KineticBlockEntityVisual Date: Sat, 18 Jan 2025 16:25:57 -0500 Subject: [PATCH 331/515] Lockdown - Convert STYLES list into an immutable list and mark it as internal --- .../content/logistics/box/PackageStyles.java | 29 +++++++++++-------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageStyles.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageStyles.java index ade6e1095a..d1f7bea35b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageStyles.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageStyles.java @@ -4,30 +4,37 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; +import com.google.common.collect.ImmutableList; import com.simibubi.create.Create; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; -public class PackageStyles { +import org.jetbrains.annotations.ApiStatus.Internal; +import org.jetbrains.annotations.UnmodifiableView; - public static record PackageStyle(String type, int width, int height, float riggingOffset, boolean rare) { - +public class PackageStyles { + public record PackageStyle(String type, int width, int height, float riggingOffset, boolean rare) { public ResourceLocation getItemId() { String size = "_" + width + "x" + height; String id = type + "_package" + (rare ? "" : size); return Create.asResource(id); } - + public ResourceLocation getRiggingModel() { String size = width + "x" + height; return Create.asResource("item/package/rigging_" + size); } - }; - public static final List STYLES = new ArrayList<>(List.of( - + /** + * This is used for registration, if you insert into this list, you will be registering items under Create's namespace. + * Instead, you should handle registration yourself + * and use the PackageItem class so your packages end up in the correct lists. + */ + @Internal + @UnmodifiableView + public static final List STYLES = ImmutableList.of( new PackageStyle("cardboard", 12, 12, 23f, false), new PackageStyle("cardboard", 10, 12, 22f, false), new PackageStyle("cardboard", 10, 8, 18f, false), @@ -43,8 +50,7 @@ public class PackageStyles { rare("thunder"), rare("up"), rare("vector") - - )); + ); public static final List ALL_BOXES = new ArrayList<>(); public static final List STANDARD_BOXES = new ArrayList<>(); @@ -57,13 +63,12 @@ public class PackageStyles { List pool = STYLE_PICKER.nextInt(RARE_CHANCE) == 0 ? RARE_BOXES : STANDARD_BOXES; return new ItemStack(pool.get(STYLE_PICKER.nextInt(pool.size()))); } - + public static ItemStack getDefaultBox() { return new ItemStack(ALL_BOXES.get(0)); } - + private static PackageStyle rare(String name) { return new PackageStyle("rare_" + name, 12, 10, 21f, true); } - } From 528bf0aaeb8f557ce7b3861020ccd7d312eff079 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Sat, 18 Jan 2025 20:56:03 -0500 Subject: [PATCH 332/515] The cat is out of the box --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 885182f198..c7781bb2f5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -27,7 +27,7 @@ jei_minecraft_version = 1.20.1 jei_version = 15.10.0.39 curios_minecraft_version = 1.20.1 curios_version = 5.3.1 -ponder_version = 0.9.17 +ponder_version = 0.9.18 mixin_extras_version = 0.4.1 cc_tweaked_enable = true From 664a7fa954c1b6dba9775faf0f5e351433add380 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Sat, 18 Jan 2025 21:04:54 -0500 Subject: [PATCH 333/515] Old days - Fix forge bundling an old version of ponder --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index a33863bf29..2e904c4308 100644 --- a/build.gradle +++ b/build.gradle @@ -160,7 +160,7 @@ dependencies { jarJar("net.createmod.ponder:Ponder-Forge-${minecraft_version}:${ponder_version}") { version { - strictly "[0.7.5,)" + strictly "[${ponder_version},)" } } From 0c277b1b95d49269b180355a7d5c497661862fb9 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Sun, 19 Jan 2025 10:58:01 -0500 Subject: [PATCH 334/515] Refreshing drink - Switch to using food properties and simplify BuildersTeaItem#finishUsingItem - Fixes Creators-of-Create/Create#7295 --- .../java/com/simibubi/create/AllItems.java | 13 ++++- .../content/equipment/BuildersTeaItem.java | 55 +++++-------------- 2 files changed, 27 insertions(+), 41 deletions(-) diff --git a/src/main/java/com/simibubi/create/AllItems.java b/src/main/java/com/simibubi/create/AllItems.java index 79cb68596e..de0d1e92cf 100644 --- a/src/main/java/com/simibubi/create/AllItems.java +++ b/src/main/java/com/simibubi/create/AllItems.java @@ -73,6 +73,8 @@ import com.tterrag.registrate.util.nullness.NonNullBiConsumer; import net.minecraft.core.registries.Registries; import net.minecraft.tags.ItemTags; import net.minecraft.tags.TagKey; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; import net.minecraft.world.food.FoodProperties; import net.minecraft.world.item.ArmorItem; import net.minecraft.world.item.ArmorMaterials; @@ -152,7 +154,16 @@ public class AllItems { public static final ItemEntry BUILDERS_TEA = REGISTRATE.item("builders_tea", BuildersTeaItem::new) .tag(AllItemTags.UPRIGHT_ON_BELT.tag) - .properties(p -> p.stacksTo(16)) + .properties(p -> p + .stacksTo(16) + .food(new FoodProperties.Builder() + .nutrition(1) + .saturationMod(.6F) + .alwaysEat() + .effect(() -> new MobEffectInstance(MobEffects.DIG_SPEED, 3 * 60 * 20, 0, false, false, false), 1F) + .build() + ) + ) .lang("Builder's Tea") .register(); diff --git a/src/main/java/com/simibubi/create/content/equipment/BuildersTeaItem.java b/src/main/java/com/simibubi/create/content/equipment/BuildersTeaItem.java index caea8034c0..cc02d0e7b5 100644 --- a/src/main/java/com/simibubi/create/content/equipment/BuildersTeaItem.java +++ b/src/main/java/com/simibubi/create/content/equipment/BuildersTeaItem.java @@ -1,12 +1,5 @@ package com.simibubi.create.content.equipment; -import net.minecraft.advancements.CriteriaTriggers; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.stats.Stats; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResultHolder; -import net.minecraft.world.effect.MobEffectInstance; -import net.minecraft.world.effect.MobEffects; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; @@ -15,48 +8,30 @@ import net.minecraft.world.item.Items; import net.minecraft.world.item.UseAnim; import net.minecraft.world.level.Level; +import org.jetbrains.annotations.NotNull; + public class BuildersTeaItem extends Item { - - public BuildersTeaItem(Properties p_i48487_1_) { - super(p_i48487_1_); + public BuildersTeaItem(Properties properties) { + super(properties); } - public ItemStack finishUsingItem(ItemStack stack, Level world, LivingEntity entity) { - Player playerentity = entity instanceof Player ? (Player) entity : null; - if (playerentity instanceof ServerPlayer) - CriteriaTriggers.CONSUME_ITEM.trigger((ServerPlayer) playerentity, stack); - - if (!world.isClientSide) - entity.addEffect(new MobEffectInstance(MobEffects.DIG_SPEED, 3 * 60 * 20, 0, false, false, false)); - - if (playerentity != null) { - playerentity.awardStat(Stats.ITEM_USED.get(this)); - playerentity.getFoodData().eat(1, .6F); - if (!playerentity.getAbilities().instabuild) - stack.shrink(1); + public @NotNull ItemStack finishUsingItem(@NotNull ItemStack stack, @NotNull Level level, @NotNull LivingEntity livingEntity) { + ItemStack eatResult = super.finishUsingItem(stack, level, livingEntity); + if (livingEntity instanceof Player player && !player.getAbilities().instabuild) { + if (eatResult.isEmpty()) { + return Items.GLASS_BOTTLE.getDefaultInstance(); + } else { + player.getInventory().add(Items.GLASS_BOTTLE.getDefaultInstance()); + } } - - if (playerentity == null || !playerentity.getAbilities().instabuild) { - if (stack.isEmpty()) - return new ItemStack(Items.GLASS_BOTTLE); - if (playerentity != null) - playerentity.getInventory().add(new ItemStack(Items.GLASS_BOTTLE)); - } - - return stack; + return eatResult; } - public int getUseDuration(ItemStack p_77626_1_) { + public int getUseDuration(@NotNull ItemStack stack) { return 42; } - public UseAnim getUseAnimation(ItemStack p_77661_1_) { + public @NotNull UseAnim getUseAnimation(@NotNull ItemStack stack) { return UseAnim.DRINK; } - - public InteractionResultHolder use(Level p_77659_1_, Player p_77659_2_, InteractionHand p_77659_3_) { - p_77659_2_.startUsingItem(p_77659_3_); - return InteractionResultHolder.success(p_77659_2_.getItemInHand(p_77659_3_)); - } - } From a8c8b4cfea8d6f885e7e485aa3f26cb65b687f08 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Mon, 20 Jan 2025 10:07:49 +0100 Subject: [PATCH 335/515] UI Tweaks --- .../symmetryWand/SymmetryWandScreen.java | 7 +-- .../equipment/zapper/ZapperScreen.java | 8 ++-- .../terrainzapper/WorldshaperScreen.java | 12 ++--- .../cannon/SchematicannonScreen.java | 42 +++++++++--------- .../client/SchematicEditScreen.java | 6 +-- .../client/SchematicPromptScreen.java | 8 ++-- .../schematics/table/SchematicTableMenu.java | 8 ++-- .../table/SchematicTableScreen.java | 13 +++--- .../trains/schedule/ScheduleScreen.java | 34 +++++++++----- .../create/foundation/gui/AllGuiTextures.java | 9 ++-- .../create/textures/gui/display_link.png | Bin 1414 -> 2222 bytes .../assets/create/textures/gui/schedule.png | Bin 1393 -> 3524 bytes .../assets/create/textures/gui/schematics.png | Bin 1275 -> 2249 bytes .../create/textures/gui/schematics_2.png | Bin 2946 -> 3948 bytes .../assets/create/textures/gui/toolbox.png | Bin 1031 -> 1679 bytes 15 files changed, 81 insertions(+), 66 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/equipment/symmetryWand/SymmetryWandScreen.java b/src/main/java/com/simibubi/create/content/equipment/symmetryWand/SymmetryWandScreen.java index 805518fd31..3963b7fb06 100644 --- a/src/main/java/com/simibubi/create/content/equipment/symmetryWand/SymmetryWandScreen.java +++ b/src/main/java/com/simibubi/create/content/equipment/symmetryWand/SymmetryWandScreen.java @@ -64,9 +64,9 @@ public class SymmetryWandScreen extends AbstractSimiScreen { int x = guiLeft; int y = guiTop; - labelType = new Label(x + 49, y + 28, Components.immutableEmpty()).colored(0xFFFFFFFF) + labelType = new Label(x + 51, y + 28, Components.immutableEmpty()).colored(0xFFFFFFFF) .withShadow(); - labelAlign = new Label(x + 49, y + 50, Components.immutableEmpty()).colored(0xFFFFFFFF) + labelAlign = new Label(x + 51, y + 50, Components.immutableEmpty()).colored(0xFFFFFFFF) .withShadow(); int state = @@ -125,7 +125,8 @@ public class SymmetryWandScreen extends AbstractSimiScreen { int y = guiTop; background.render(graphics, x, y); - graphics.drawString(font, wand.getHoverName(), x + 11, y + 4, 0x592424, false); + graphics.drawString(font, wand.getHoverName(), + x + (background.getWidth() - font.width(wand.getHoverName())) / 2, y + 4, 0x592424, false); renderBlock(graphics, x, y); GuiGameElement.of(wand) diff --git a/src/main/java/com/simibubi/create/content/equipment/zapper/ZapperScreen.java b/src/main/java/com/simibubi/create/content/equipment/zapper/ZapperScreen.java index 9da3238df6..411454c7a0 100644 --- a/src/main/java/com/simibubi/create/content/equipment/zapper/ZapperScreen.java +++ b/src/main/java/com/simibubi/create/content/equipment/zapper/ZapperScreen.java @@ -79,8 +79,8 @@ public abstract class ZapperScreen extends AbstractSimiScreen { PlacementPatterns pattern = PlacementPatterns.values()[id]; IconButton patternButton = new IconButton(x + background.getWidth() - 76 + col * 18, y + 21 + row * 18, pattern.icon); patternButton.withCallback(() -> { - patternButtons.forEach(b -> b.active = true); - patternButton.active = false; + patternButtons.forEach(b -> b.green = false); + patternButton.green = true; currentPattern = pattern; }); patternButton.setToolTip(CreateLang.translateDirect("gui.terrainzapper.pattern." + pattern.translationKey)); @@ -88,7 +88,7 @@ public abstract class ZapperScreen extends AbstractSimiScreen { } } - patternButtons.get(currentPattern.ordinal()).active = false; + patternButtons.get(currentPattern.ordinal()).green = true; addRenderableWidgets(patternButtons); } @@ -106,7 +106,7 @@ public abstract class ZapperScreen extends AbstractSimiScreen { } protected void drawOnBackground(GuiGraphics graphics, int x, int y) { - graphics.drawString(font, title, x + 11, y + 4, 0x54214F, false); + graphics.drawString(font, title, x + (background.getWidth() - font.width(title)) / 2, y + 4, 0x54214F, false); } @Override diff --git a/src/main/java/com/simibubi/create/content/equipment/zapper/terrainzapper/WorldshaperScreen.java b/src/main/java/com/simibubi/create/content/equipment/zapper/terrainzapper/WorldshaperScreen.java index 386132ffcd..fc6cc9dd98 100644 --- a/src/main/java/com/simibubi/create/content/equipment/zapper/terrainzapper/WorldshaperScreen.java +++ b/src/main/java/com/simibubi/create/content/equipment/zapper/terrainzapper/WorldshaperScreen.java @@ -192,8 +192,8 @@ public class WorldshaperScreen extends ZapperScreen { TerrainTools tool = toolValues[id]; IconButton toolButton = new IconButton(x + 7 + id * 18, y + 79, tool.icon); toolButton.withCallback(() -> { - toolButtons.forEach(b -> b.active = true); - toolButton.active = false; + toolButtons.forEach(b -> b.green = false); + toolButton.green = true; currentTool = tool; }); toolButton.setToolTip(CreateLang.translateDirect("gui.terrainzapper.tool." + tool.translationKey)); @@ -208,7 +208,7 @@ public class WorldshaperScreen extends ZapperScreen { currentTool = toolValues[0]; toolIndex = 0; } - toolButtons.get(toolIndex).active = false; + toolButtons.get(toolIndex).green = true; addRenderableWidgets(toolButtons); @@ -224,15 +224,15 @@ public class WorldshaperScreen extends ZapperScreen { PlacementOptions option = placementValues[id]; IconButton placementButton = new IconButton(x + 136 + id * 18, y + 79, option.icon); placementButton.withCallback(() -> { - placementButtons.forEach(b -> b.active = true); - placementButton.active = false; + placementButtons.forEach(b -> b.green = false); + placementButton.green = true; currentPlacement = option; }); placementButton.setToolTip(CreateLang.translateDirect("gui.terrainzapper.placement." + option.translationKey)); placementButtons.add(placementButton); } - placementButtons.get(currentPlacement.ordinal()).active = false; + placementButtons.get(currentPlacement.ordinal()).green = true; addRenderableWidgets(placementButtons); } diff --git a/src/main/java/com/simibubi/create/content/schematics/cannon/SchematicannonScreen.java b/src/main/java/com/simibubi/create/content/schematics/cannon/SchematicannonScreen.java index b62c7a89e2..9cdb734fb4 100644 --- a/src/main/java/com/simibubi/create/content/schematics/cannon/SchematicannonScreen.java +++ b/src/main/java/com/simibubi/create/content/schematics/cannon/SchematicannonScreen.java @@ -25,6 +25,7 @@ import com.simibubi.create.foundation.utility.CreateLang; import net.createmod.catnip.gui.element.GuiGameElement; import net.createmod.catnip.lang.FontHelper.Palette; import net.createmod.catnip.lang.Components; +import net.minecraft.ChatFormatting; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.renderer.Rect2i; @@ -90,17 +91,17 @@ public class SchematicannonScreen extends AbstractSimiContainerScreen { sendOptionUpdate(Option.PLAY, true); }); playIndicator = new Indicator(x + 75, y + 79, Components.immutableEmpty()); - pauseButton = new IconButton(x + 93, y + 86, AllIcons.I_PAUSE); + pauseButton = new IconButton(x + 93, y + 85, AllIcons.I_PAUSE); pauseButton.withCallback(() -> { sendOptionUpdate(Option.PAUSE, true); }); pauseIndicator = new Indicator(x + 93, y + 79, Components.immutableEmpty()); - resetButton = new IconButton(x + 111, y + 86, AllIcons.I_STOP); + resetButton = new IconButton(x + 111, y + 85, AllIcons.I_STOP); resetButton.withCallback(() -> { sendOptionUpdate(Option.STOP, true); }); @@ -109,12 +110,12 @@ public class SchematicannonScreen extends AbstractSimiContainerScreen { minecraft.player.closeContainer(); }); addRenderableWidget(confirmButton); - showSettingsButton = new IconButton(x + 9, y + 117, AllIcons.I_PLACEMENT_SETTINGS); + showSettingsButton = new IconButton(x + 8, y + 111, AllIcons.I_PLACEMENT_SETTINGS); showSettingsButton.withCallback(() -> { showSettingsIndicator.state = placementSettingsHidden() ? State.GREEN : State.OFF; initPlacementSettings(); @@ -122,7 +123,7 @@ public class SchematicannonScreen extends AbstractSimiContainerScreen { if (menu.contentHolder.replaceMode != replaceMode) @@ -161,24 +162,24 @@ public class SchematicannonScreen extends AbstractSimiContainerScreen { sendOptionUpdate(Option.SKIP_MISSING, !menu.contentHolder.skipMissing); }); skipMissingButton.setToolTip(CreateLang.translateDirect("gui.schematicannon.option.skipMissing")); skipMissingIndicator = new Indicator(x + 111, y + 111, Components.immutableEmpty()); - Collections.addAll(placementSettingWidgets, skipMissingButton, skipMissingIndicator); + Collections.addAll(placementSettingWidgets, skipMissingButton); - skipBlockEntitiesButton = new IconButton(x + 129, y + 117, AllIcons.I_SKIP_BLOCK_ENTITIES); + skipBlockEntitiesButton = new IconButton(x + 135, y + 111, AllIcons.I_SKIP_BLOCK_ENTITIES); skipBlockEntitiesButton.withCallback(() -> { sendOptionUpdate(Option.SKIP_BLOCK_ENTITIES, !menu.contentHolder.replaceBlockEntities); }); skipBlockEntitiesButton.setToolTip(CreateLang.translateDirect("gui.schematicannon.option.skipBlockEntities")); skipBlockEntitiesIndicator = new Indicator(x + 129, y + 111, Components.immutableEmpty()); - Collections.addAll(placementSettingWidgets, skipBlockEntitiesButton, skipBlockEntitiesIndicator); + Collections.addAll(placementSettingWidgets, skipBlockEntitiesButton); addRenderableWidgets(placementSettingWidgets); } @@ -195,11 +196,11 @@ public class SchematicannonScreen extends AbstractSimiContainerScreen tip = button.getToolTip(); tip.add((enabled ? optionEnabled : optionDisabled).plainCopy() - .withStyle(BLUE)); + .withStyle(enabled ? ChatFormatting.DARK_GREEN : ChatFormatting.RED)); tip.addAll(TooltipHelper .cutTextComponent(CreateLang.translateDirect("gui.schematicannon.option." + tooltipKey + ".description"), Palette.ALL_GRAY)); } @@ -280,6 +281,7 @@ public class SchematicannonScreen extends AbstractSimiContainerScreen { onClose(); }); @@ -157,7 +157,7 @@ public class SchematicEditScreen extends AbstractSimiScreen { background.render(graphics, x, y); String title = handler.getCurrentSchematicName(); - graphics.drawCenteredString(font, title, x + (background.getWidth() - 8) / 2, y + 3, 0xFFFFFF); + graphics.drawString(font, title, x + (background.getWidth() - 8 - font.width(title)) / 2, y + 4, 0x505050, false); GuiGameElement.of(AllItems.SCHEMATIC.asStack()) .at(x + background.getWidth() + 6, y + background.getHeight() - 40, -200) diff --git a/src/main/java/com/simibubi/create/content/schematics/client/SchematicPromptScreen.java b/src/main/java/com/simibubi/create/content/schematics/client/SchematicPromptScreen.java index 1170a85705..9ea508fb1b 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/SchematicPromptScreen.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/SchematicPromptScreen.java @@ -40,7 +40,7 @@ public class SchematicPromptScreen extends AbstractSimiScreen { super.init(); int x = guiLeft; - int y = guiTop; + int y = guiTop + 2; nameField = new EditBox(font, x + 49, y + 26, 131, 10, Components.immutableEmpty()); nameField.setTextColor(-1); @@ -80,15 +80,15 @@ public class SchematicPromptScreen extends AbstractSimiScreen { int y = guiTop; background.render(graphics, x, y); - graphics.drawCenteredString(font, title, x + (background.getWidth() - 8) / 2, y + 3, 0xFFFFFF); + graphics.drawString(font, title, x + (background.getWidth() - 8 - font.width(title)) / 2, y + 4, 0x505050, false); GuiGameElement.of(AllItems.SCHEMATIC.asStack()) - .at(x + 22, y + 23, 0) + .at(x + 22, y + 24, 0) .render(graphics); GuiGameElement.of(AllItems.SCHEMATIC_AND_QUILL.asStack()) .scale(3) - .at(x + background.getWidth() + 6, y + background.getHeight() - 40, -200) + .at(x + background.getWidth() + 6, y + background.getHeight() - 38, -200) .render(graphics); } diff --git a/src/main/java/com/simibubi/create/content/schematics/table/SchematicTableMenu.java b/src/main/java/com/simibubi/create/content/schematics/table/SchematicTableMenu.java index ea6841b835..3f4c6f5b3a 100644 --- a/src/main/java/com/simibubi/create/content/schematics/table/SchematicTableMenu.java +++ b/src/main/java/com/simibubi/create/content/schematics/table/SchematicTableMenu.java @@ -68,7 +68,7 @@ public class SchematicTableMenu extends MenuBase { @Override protected void addSlots() { - inputSlot = new SlotItemHandler(contentHolder.inventory, 0, 21, 57) { + inputSlot = new SlotItemHandler(contentHolder.inventory, 0, 21, 59) { @Override public boolean mayPlace(ItemStack stack) { return AllItems.EMPTY_SCHEMATIC.isIn(stack) || AllItems.SCHEMATIC_AND_QUILL.isIn(stack) @@ -76,7 +76,7 @@ public class SchematicTableMenu extends MenuBase { } }; - outputSlot = new SlotItemHandler(contentHolder.inventory, 1, 166, 57) { + outputSlot = new SlotItemHandler(contentHolder.inventory, 1, 166, 59) { @Override public boolean mayPlace(ItemStack stack) { return false; @@ -89,12 +89,12 @@ public class SchematicTableMenu extends MenuBase { // player Slots for (int row = 0; row < 3; ++row) { for (int col = 0; col < 9; ++col) { - this.addSlot(new Slot(player.getInventory(), col + row * 9 + 9, 38 + col * 18, 105 + row * 18)); + this.addSlot(new Slot(player.getInventory(), col + row * 9 + 9, 38 + col * 18, 107 + row * 18)); } } for (int hotbarSlot = 0; hotbarSlot < 9; ++hotbarSlot) { - this.addSlot(new Slot(player.getInventory(), hotbarSlot, 38 + hotbarSlot * 18, 163)); + this.addSlot(new Slot(player.getInventory(), hotbarSlot, 38 + hotbarSlot * 18, 165)); } } diff --git a/src/main/java/com/simibubi/create/content/schematics/table/SchematicTableScreen.java b/src/main/java/com/simibubi/create/content/schematics/table/SchematicTableScreen.java index dde519b867..d64edd9d01 100644 --- a/src/main/java/com/simibubi/create/content/schematics/table/SchematicTableScreen.java +++ b/src/main/java/com/simibubi/create/content/schematics/table/SchematicTableScreen.java @@ -71,9 +71,9 @@ public class SchematicTableScreen extends AbstractSimiContainerScreen availableSchematics = CreateClient.SCHEMATIC_SENDER.getAvailableSchematics(); int x = leftPos; - int y = topPos; + int y = topPos + 2; - schematicsLabel = new Label(x + 49, y + 26, Components.immutableEmpty()).withShadow(); + schematicsLabel = new Label(x + 51, y + 26, Components.immutableEmpty()).withShadow(); schematicsLabel.text = Components.immutableEmpty(); if (!availableSchematics.isEmpty()) { schematicsArea = @@ -95,14 +95,14 @@ public class SchematicTableScreen extends AbstractSimiContainerScreen { Util.getPlatform() .openFile(Paths.get("schematics/") .toFile()); }); folderButton.setToolTip(folder); - refreshButton = new IconButton(x + 207, y + 21, AllIcons.I_REFRESH); + refreshButton = new IconButton(x + 206, y + 21, AllIcons.I_REFRESH); refreshButton.withCallback(() -> { ClientSchematicLoader schematicSender = CreateClient.SCHEMATIC_SENDER; schematicSender.refresh(); @@ -152,7 +152,8 @@ public class SchematicTableScreen extends AbstractSimiContainerScreen im super.init(); clearWidgets(); - confirmButton = new IconButton(leftPos + bg.getWidth() - 42, topPos + bg.getHeight() - 24, AllIcons.I_CONFIRM); + confirmButton = new IconButton(leftPos + bg.getWidth() - 42, topPos + bg.getHeight() - 30, AllIcons.I_CONFIRM); confirmButton.withCallback(() -> minecraft.player.closeContainer()); addRenderableWidget(confirmButton); cyclicIndicator = new Indicator(leftPos + 21, topPos + 196, Components.immutableEmpty()); cyclicIndicator.state = schedule.cyclic ? State.ON : State.OFF; - addRenderableWidget(cyclicIndicator); - - cyclicButton = new IconButton(leftPos + 21, topPos + 202, AllIcons.I_REFRESH); - cyclicButton.withCallback(() -> { - schedule.cyclic = !schedule.cyclic; - cyclicIndicator.state = schedule.cyclic ? State.ON : State.OFF; - }); - - List tip = cyclicButton.getToolTip(); + + List tip = new ArrayList<>(); tip.add(CreateLang.translateDirect("schedule.loop")); + tip.add(CreateLang.translateDirect("gui.schematicannon.optionDisabled") + .withStyle(ChatFormatting.RED)); tip.add(CreateLang.translateDirect("schedule.loop1") .withStyle(ChatFormatting.GRAY)); tip.add(CreateLang.translateDirect("schedule.loop2") .withStyle(ChatFormatting.GRAY)); + + List tipEnabled = new ArrayList<>(tip); + tipEnabled.set(1, CreateLang.translateDirect("gui.schematicannon.optionEnabled") + .withStyle(ChatFormatting.DARK_GREEN)); + + cyclicButton = new IconButton(leftPos + 21, topPos + 196, AllIcons.I_REFRESH); + cyclicButton.withCallback(() -> { + schedule.cyclic = !schedule.cyclic; + cyclicButton.green = schedule.cyclic; + cyclicButton.getToolTip().clear(); + cyclicButton.getToolTip().addAll(schedule.cyclic ? tipEnabled : tip); + }); + cyclicButton.green = schedule.cyclic; + cyclicButton.getToolTip().clear(); + cyclicButton.getToolTip().addAll(schedule.cyclic ? tipEnabled : tip); addRenderableWidget(cyclicButton); - resetProgress = new IconButton(leftPos + 45, topPos + 202, AllIcons.I_PRIORITY_VERY_HIGH); + resetProgress = new IconButton(leftPos + 45, topPos + 196, AllIcons.I_PRIORITY_VERY_HIGH); resetProgress.withCallback(() -> { schedule.savedProgress = 0; resetProgress.active = false; @@ -142,7 +152,7 @@ public class ScheduleScreen extends AbstractSimiContainerScreen im resetProgress.setToolTip(CreateLang.translateDirect("schedule.reset")); addRenderableWidget(resetProgress); - skipProgress = new IconButton(leftPos + 63, topPos + 202, AllIcons.I_PRIORITY_LOW); + skipProgress = new IconButton(leftPos + 63, topPos + 196, AllIcons.I_PRIORITY_LOW); skipProgress.withCallback(() -> { schedule.savedProgress++; schedule.savedProgress %= schedule.entries.size(); diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java index aad42d1977..31bcdd9da2 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java @@ -24,13 +24,14 @@ public enum AllGuiTextures implements ScreenElement, TextureSheetSegment { CURSEFORGE_LOGO("platform_icons/curseforge", 256, 256), MODRINTH_LOGO("platform_icons/modrinth", 256, 256), - SCHEMATIC("schematics", 192, 121), + SCHEMATIC("schematics", 10, 8, 192, 123), + SCHEMATIC_TITLE("schematics_2", 205, 15), SCHEMATIC_SLOT("widgets", 54, 0, 16, 16), - SCHEMATIC_PROMPT("schematics_2", 213, 77), + SCHEMATIC_PROMPT("schematics_2", 213, 79), HUD_BACKGROUND("overlay", 0, 0, 16, 16), - SCHEMATIC_TABLE("schematics", 0, 121, 214, 83), - SCHEMATIC_TABLE_PROGRESS("schematics", 0, 204, 84, 16), + SCHEMATIC_TABLE("schematics", 10, 139, 214, 85), + SCHEMATIC_TABLE_PROGRESS("schematics", 10, 224, 84, 16), SCHEMATICANNON_TOP("schematics_2", 0, 77, 213, 42), SCHEMATICANNON_BOTTOM("schematics_2", 0, 119, 213, 99), diff --git a/src/main/resources/assets/create/textures/gui/display_link.png b/src/main/resources/assets/create/textures/gui/display_link.png index 7c56fa99ebf083cb01acf1bb8010cfbdbbd66511..a7218e600e305d5870fb48830242e1a78337ad8e 100644 GIT binary patch delta 2038 zcmZ8ic~}!!60hzwN4N$^bdW=WBFL;FLE*y#2?#^NEhHGx(MAymR74Gkcy!CU<2dSa z=rSAwW<~@AWP-|_kzPj;MdU_65yWFZL@^>DceaDhAG`1CdavsBuc}_XSFhd=+QkM* zmd41TKuh$TV$ z!zG795AK41(1<9Bt)GXG<6z6RwV#qR%4kg4F0mk7AovC}X+aH)5j8+)&Wk3KFMJ@) zFGU!0^C-=85ft?4F@&aw(-=KZ07TM)s^K)L4E#0zpI2Z2BxwLfBkb%~+9A@p$$ zQk5xyi!`YkN=xV*GH|sM&3)10+S#f84z!OsJ?P#W51?KmAlzMraogTyX&=7q$UfDz zE@M?gVcEyXl%AWTO6B=~*)G;Ej{DZlEu->3cc>k=kFC{w*k3Igy}YKd;Lyxs^Q<#w z``&DAFg-04eO+0YASy4YKYO{=x_Sz)G2NKd|fRZqTb zs;NOn==KfG{%WH}`Sh-j5|-DVZ0o_GV^WJuzjb{2(1m!pgI-Q9$U5Fz!j`9LX<$V; zCG9}d!0DXP)R1s0`&F_e|8QRLkJ#HWYa;&5=7oaJtPod2a(i1H#QANohI5Ro zGA5;WCs>Z*j%D&CeXsqr7c4!XQ*pt+Da~9X=_jR_$*(1Hu$&jY+tE|xbFO+Hvz1x5 z1zmMAJZeOrf10ep@;BnOF+6*0ot0EE2q)&p1?+ZR>8u8}9y{xIqHUb-bIY|UCn6~$ zlU%SHxi`$$$|h%8uTG|V2L7?O)XfqP(n=Fg-ys;B+Q zA>-!vZT_DVu_KTdOzJZKT1!;kZd3jd0q?^Mqtg|=WpYKA24+v5 zP9Jg>+bg`m3K&CdTHU-WNY zD~=yMYHpe2O#b}oQ=$br!HAm}H(C?`WGGsR25i6?coHucMu^o?HO26UE^m%M^!K8Q z;faZ^4IFPMB}{lOC*{yq`@DwHH#%CX1F!Ef$!*F?GxWi+7rkiHdzWf1HQb9DDK7PL zIw$vo&P3x^@{ zMtnt96SECvRlQb247_IXjSO|_glG6%=G*K*72We#eS9!ZuZ~HR`LWGppMsbBQuts+ z9&^yWnKkyT;4YK*aebcRXkdh0rxvj?cDWxo4qOyKcx!SaMsS3F>GUl(oA9A$g$6rS z{mjvpk2O)K;Ydv+8mQ`81{|Uy+PNGLwD6yZjiJ~9k?ZlJO-IsU>(({949PCZ%aurH zPLLIn=Id$7_`HT_>rtCQcLRC_SD1CVsaBj!RVAumbCI}rs*Cpaa9HpK0@$;sG_!N= zZ&F-+rB2q@ZFQiZl7PLU4ZaRlSwAr0cQd+rF2l$?!*H*7a!RDjtNL5_L5Yb{58l>v zEcA{x56?#L=t7g|TC(Kp!B`XJd@u^QJy}1*EY^`e*(Z00EWg%l1dq)Q*1%ayHOMH( zNDyOkRQ#GS17gy&3H`qM{1hf@Qhoz>YSg3yrSA-=K;<6DpLqg0NFvNvzKG*P>4EY0 zz`N{B%PdW8YT60Gjddq6*+m{7y5}--Rmg}I{@hNVP3r4^^3o;Cn!{#+jT~vVhoWyY zvys03*ld&`!yr|;26ZPx# delta 1226 zcmYjQ2~d+~5Zyn25@-k!P$FQc@xai*0-=IJKmrN^(<(TH8b&SwkwcKn0%G!^KwCy^ zxC%HNK@w~VMkr;#D*9{1i&zgdc0dCIC@3JIfI>@2<5j!!c6Mjp&d%=6TZM7Hfp~3^ zN27>b=eyP8%Z%QMYHUZJy^(h(>1f-npz(@ySwh0FR(rM5_JF^CRUo6~@MNpXD?mC? z6Pm!0G;(W|mn&K|0RhYiRsl_3MyqCs>TMv_N zuYnAg&?MTe;O8IJn_~lAvl!7cm6aM2JC4#ZOvdPO{=`JuBknh|bF0R8`%+lBXzu?FqKZSml8(Y9c^t^x_@&1cDYgS|vj zeo~1wk=`xyeyeA6>rt6C_47S^Upp@@3IyE#E!ZtsiA-C&y~Kq6$IMFF2&`(p>!z3B z)I|EPhqwi^YU`;Nf#q5g3%eD1*upvJ;_{|nQjhb48p}nD$C!NZ2M-9%M-5Z zV8kyWKB7(cmq&&y&!6ijx#RFP{yH2KI;zb z6r8YSNam;gC-!+`89$cukBZ*OR-1$@{cIi%mpN5qD#I(?j+tGY4Fh}Gp^6(eo9nPO zi`5Gt-4LD|Ypy0Kv6ZoJ6l+sz!JZv+BzO;~`k0Iw<%bT#-%vxzV1_e%BGL4gqId^` zNpdFV+xO3*xe3B8x&6ikph=IRqsb?tb?P{C-F1kqFzy>0GwM`BMr9p~$9Pu4{KTPH zI4{4Xt}=1o(w=-8q&;bIAbUjeZTn1I;%l=%?o~@;_ yj}J?gclPfdv*GH7f=IZpPO75PW|(?J>LTe{$jj@7$q{a^DPOPcTNR$+NB#wSFZK)o diff --git a/src/main/resources/assets/create/textures/gui/schedule.png b/src/main/resources/assets/create/textures/gui/schedule.png index 1f553be8986dd1657b9e381f4eb30c12b1a1e37c..d553cd7ef470135af50a9e61f05e9a6b42e509b5 100644 GIT binary patch literal 3524 zcmeHIhf`Bo7r!ACaY3XkL9nd|W<_aIq(&m4xFQIKq8O@_fP@ZG5?Do6SqM!LSfwh` zi&O~&MVccZ;sydz1VtbLqJ)5yWFNXa^UeMT-^`wwGpC<>-ko=U=a$tuQ_-EWI{^Tq z=4Qs$0Kgy>26hNS!ZGl%$F>z@ZHfjJeS7C1gWuE0!U%wB@(-IX0+222Z{`pLz^?Xf zhIJ7hyF*TyV2pjR4Z$Ng%q8#&uyXPC3syddxo}WZSxs4eg95LIa_X9|b!g zLjcIa1il@82D0S-)}d(t5(fX~=Yw=L7$4XT$%_zs$Mb*l;~{;UoFU#G{U7NPrqxpK=EDOGxMph!ZXy^0qnT*p_;i{8e0+SWVa{vE zl$ASi4i0KqKhXOEsK&kqKv6~(wDF&YgL}?i07#060_R`zVBoB(28a>9DF{@bZ71D( zLlD5>a7o&>c6M&?wppu|9~*<=W+GtP%~!O|>-h2G7zTsUqYOl{=jP_Th{SO%B?R?+ zG3*`X+6moAjxT%d^R(B}c#F*RPowh-uk%jZl2Qe&u8CK5-|v+1DSH$MM+O$Db;_3h z1aoF~gYP8>+fk31nP!c%?Mh<5KRlICsV{q35pwVcq@Uw>!5)uYh7(=GELK!Mf zNzrp}6l^|jk@xSDR%ntzRumE{*2xQT_&YsTbhg63uH zNfI|Im_aLd7t4LX#)J095crKpFcxO(hFV>+?__}t0Fq7yOc^_Fc5ZE~THL{ri(ufS zo7=R@#snh7sZJQe!M!!r)hWJMA3g{iv;4n&=n0p?4Dds^sp*{j+)^?t=J?AD@9m&k znle|ta&KXFTTA5XRPWj;7?k8zi2p3K-ykC07X#OXL9mTeN807roC0@ye_euFM zDRU_Y_pywiPkncumbX2Bj_$hph|u3hC;A6AO3aPUk89~EYz?QclSHf~rysF5024)5 ze&g9wQO)>DAlb8P^19(l*HU*$DslC~7LBi%;HJY_lSaiUrt49xnHdk}(Ho<)Tzbo5 z0)knIQy_gUnGf=}n;J=_10pY=XxXdi#tgkq#nkemP5r)>hI$peR(8&jqEhu0%GeRv z#PxHE@B0h(>4*F04kTn|W?IXW*pttR_q?0#M{ORC(9x+CRhpqC^pFl?ud3-8q_zVCbKZTby2WI>B`zIH z6|UXot_7MoV)EprKPa>+Mb=*{; z#FDvO*K10ReZD?mfw5jB{i(f5;Ms?_T4lpLR)z_Cnr<4QGVa|y1zdi8~`I7+``Lj=wdv0 zM2ktD!Y72IW7&&XxKLo1>Uo6E z<=YdBrj;pC^iwbT zm6Q_=^y*zM1!FR)gB`*GPK7LZ!GkTKTPql=i3hidiAw$-U*4fDjy1a-iO0ukrmL>I z^e?H-pX)NHWvneaOmMKJnHY(ftuo5_^w6&Hi2R2MsA&C!GCJz_L&MD1Th>k~8Qk^W z*}2S`NL0d8typ3(BHC86F=7R;FO5K?$@7Y4zt7n1^s%mk3bi(chr4k{5F>FM4TI&2 z?~4t^?GM9-`)gcOjBbi2DL7gGw&=QKw`oFS9xxFvp?Dfyt_|_#3q`$IeHe*K)}9VK zfC^>W>zD0LbA9KU9MsY|H&~RmBuiOKjBD!Gb@Z&qx;DSY)hO=v7$e3F`Q}8^@L4&E z@qu4yc21N4)kXy8{D)ehhk6`DiwIJ0Bh1Eq=D>|ZC#ZJll*-D=u8r8L96TS#@s+Fz zEkMqM_L)+R$(#}!UdLv)YO49E7fo@>JbRQnuElg&g@+(m08h)o&Jot#oPWoK@swF7g-x!ot?;T zy-yZP`px`jqWlw>hFsziPR)1>k1?WeX3HAGWr{5F=Z)_G-hZt$Ai5w>@Jef!=7RCyj-mDINtAxY8)8c$x?jw4#P)Z@$KF1M u4kcN5@pYa|nAqv0v25vR0b=CxXGv1WUh3$yC0T7_vpMFRaRu7>*S`QMH}OsY literal 1393 zcmc&!TToM16y4`?10jG=phg~I)Dchwf>aym)CLX8O9+ybfR3e3i&7q;V=RFXxWd$0 z1$i_)1O{lq7Bny@Pyq)_u~Mj5Q91^sRZ2^tfII^UgpgiGo&NN%AKi0it$p^av-Y0z zu|MYqA2g%c(g48B-;Z+`0FfyIssTx{asiK|dTtQUS11(HXwPN(=E#3N?YS@OpQgl- zf*049MZJDxWMp7qaA06SsZ@4#b&-O#rU+eAq>jW!!Rqz!mX?<4>guYhs$2Qb-`>oL z%+1ZcK!)Vxc}a{^Dm^Fph;$Z<#Uhc293~+lAv!ubJUpDw=ks_xHk<9`<;7$&U0htq zAwA~gRwP-A4hM&kJU73fT3k|VG|MY1TJ7qpZpUO}Apm~NpX0+5Kb}$|!`n>zJHPeV z&?u2qE-z?wjc%uqxuWR%>NThC`$ow!^`fRgn}7;u58;AL<>Su)qcVtB&@khgk_l;< zmz7(^%|-7M&yq)G0jv+wgW;6$EM=F?o8& z(kNwYJNX?!6mhd~Q*U-B+nR81dvdk3%=y|qv&~G$0uQ}D=hw)y62^f%-yIR{s_&mk zBTDWzUo!I~4#k`u!sD`VqG4SW#o`g#>N$A^iA=i+!e8@~GZ-p9zzE_oO1XZTyX6BTbD3r&_!ijrRG z48#*Srv;g}CZpFBU6z?ElCJ3AV`xiH8~Sg*~kHVS%YWrl>%S zR;!n;8~XJ(o$?Tdc%JWUJ-;vg3Ua#<1J>TQij#+nL}-{EPYm)0S2LO@vU!SPS7Ncl zCywmthqyBb!A28;iIz&BEQniZ6lg@u^_{RzuEW!N;`QCQ0_WVMa^7sJGx$lWMC*uc zXy@cX*B>7hd5=Gh-KN&tc_dTGR zF;0|iv>Cfo&VZdq&>ud)*^N5OEp-ws_0Sk=Cd3IIQd%l9zbq^)hmQkac)0@{b0@;p mB34%aanEs<{q$R?cfq{mivH(fSNnW&1A)J9FsFWBRL0-AHXJ(u diff --git a/src/main/resources/assets/create/textures/gui/schematics.png b/src/main/resources/assets/create/textures/gui/schematics.png index 269d7fd8a8bb8473dd4bf1afd2a36587fd2cfc94..1f961d1b07419a2f6afb23368b2c04cbcc75000d 100644 GIT binary patch literal 2249 zcmZWq2~?BE7M}mlA4pJ2Oh9=k`}#n3T#F`9s3J&E63U_&1cFq`A^{5&`Ee;IK8&ak ziY!lUM36i7;e<& zx%=~cW4OHIA;-djPe^1m&&J!GWw6P{-o|0+A)yxM)Q04`KlkR_rj2?I9RYa2bft$P8q~{w0o;gM&|Hs{W9F+Z5pW2<8j~>=KgJ4arC>Fy`7zMb)s)!>*F7zk^xX9dAPZ-z7C!)JexRX zL2+;3ZFltG-t~IDoR)w%BY{SDw0wj%<}SO0L%s7g8=u$8W_N5g0`lriF!#s^7HedY z81%RhHDPh4t@LruH8}ch-H1EDRord}yP+hk!NC>D1Z&U1O^q0j(N-EUygyp}2s|BnxL;0LYNg+8` z$cEppZ+>(9)S3F>cY-TN6Q~?SFv9gJki`TM5@;pF(uRu35uMT;^j0hrzgj0G-J519 ze$xHJ92U4`erC*(ooO8$w zsP{94`qAN5fmyptk}W6VRp9r?*Aj%|&Azw@C;C-hG&hK0*Ey}Al12PR!v!V`D%yGT zSS|?AYAYW(ze5AF@@0>EiF+R3OC)1g%ZwsU;&k@i|{K{Jr z?K?<5DM5WBT(*Cz+p&DqOchNmZxP0R1(CI**pj{~acEnhRxMdPKgQ-%vqSX%IHfV< zX(#NA^BGA>loC#=frP_T1t27C8D!to3 z@uIIe1iVFpeJnJXH<7*6{BZa$RV`av($8J@u&lwDjGgQ5cArj7Tkdeg4r0?|V~$-Q z1rj}dx{>ga7^cIqWXOZAXz?S^n_yl?iu|;*>6v=9X35kd@>64D<9_v6P0r*ZF-)6d zifLxc*1_*O^9Cc#FhwAFcUAGAFURsk6=A~BUt<8fDZ9{?p{TMi!h0=D5vTZT&u+w<80oRn zLo^f4*#i9s$s{UKs;iP>G;D~|XhsaYXFnz_;Eihl`}F=3XP+iX>o+zsbI=Ufy>L`x z{6oc^RHH`ES_<|{%Bdym(HEyZq2bi(=uY_I5@*N+$^n;o*(-^y-is=tDlatLwYK5C zAigM{&h^9=9wpU%|HPEII2e5JCI|Le>?Vqw>T`NEqN=J`#?XhZ6m%;j%cnb#KW7|@F@SdT9WsQr1KJ*Rc!VvVBa1cUr`MJ&EU@XR@LITccynH# z{GyEfrkf#0cwAKG6}wYi499jcUPEQaN)TyodJiGDn~X&s(GZ(sq253-t9RrQXsuGU zpjFE&b)qBV1BUdms|T#|fUx2KEZD4kk4y`V$&4yKvbq>;rW>R?7OFycGFD+peV_3y zK(Rw8v-QkocOWCq8a4&>eUvUNCQ{KFQx;YB%fvO=cb$x1Aj)V>A)(IPZh+2zahMY zTWm#zwu}L$1?EUGG>|ZAfo~HHjWccD(M~39;@c>z$%ELfat%R(kL}on%H6HO;sz^& zwV?X$RW6qNgv_35m+2_7&(0+UFL=@T(aXXE5eIzouyC$m-Ep^(mKk4C}UF+H@#IYh3=Z`QY*M=2E81c}Qjcxh|6A ztO$eaoE1DWXZ8baCsEMLG($b*ELhUZG(|Q3{$VML|IZ(+OA0qOEvwGPw{ptH@7F8; OM-O*zw@O#e$^QXnVWq(U delta 1255 zcmXw(4NOyK6o${ey@j?2A_X#`VqN4%V9G=Ve`>Ex#@~dB{3)X#kRk$eXhp-6`w2J| zrY#fHq0Bm%I7G?@BI>41%Mi^_BaC)MY+*yBIKhaDw6rTGOHR)7y*bI7_arCZ-FZf) zbTJhr_$)3I04x@Z!C)8~8q#R~(r7elwYsyjQ>j$8{HAGWXsD~JtF5h-NF?Ru9l zC6{a|GA|EH86D#|HUImmThsN9`K%x1d%_jY3Monrbf)g5s-tnyLDjJQRU{gijKQCV zwwd-uGn@C#lVemj1!qS1W3h%c76QmO<6Iq~|46Ub@vtOf4<3>kMHbQ0>=|*)t`~V} zQu%ig+{*U*d`uLMjjUJLWV`Cm(O1}!r8$aL$GZ>i1cVLCw|HNQ7FeTccO2&RCiqd$ zWo-q;4m)$apUEydDSB*W4$DVYayehs6PfTXf9#osfiGot!Md3&+~c?-OkGvZY!Wg_ z&!-wzhR5VMQKCy$WZQR{_u%W8lR`fImve71%sjwf(C07PO17X9?asps>JpM_WKJ^T zl1qYLV~wn!Sj#N*L~Snjk5laf9U7LTFkhLV(d&GYx2wi>RbFXcWGTH8;3S<1Y*Rj* z-nP9PueR>7!&Ttd7%h13bCz+~O+**)SSB3|#`e{9f|K~e@z`4MI+{P33WKirq zC^+V($iLR_y%X-tco04q0yYF%ufqduV4QF;c2GE&15u-DP#O*jJ|Kk_)9*Xo3DdVm zVB#gfL=3>~n}n4=+gRrcK8Ajs17Ldff*3r{22&u8tQIM5el)JUgCK#BaZr7I(V<5= zw_01loTx(K@h0^$e1FQZ+2Q;0r~-y!FE6s1&KY;1-l&&U-A?&_(5vwA(%X~ryb5c| z+10FAm2gDWs}&>$VLcBr^HGR9tBM_fA)2#RFcCqn1%tQZi)t@!+Yef%Vs(1w4V$E( zE-6fngd_WVOhla`KKSsVr&THlaCnry2^dl@Ad(7-ZJ^YMo*$5kux_0CrUg2J?Znys zoQr)&dzlUFxc`s$Rt*erFZ2(q$|ghMPSvvm!bN~N0@nUG@gK}_+?PS};Qa61orXS^ z{-h;$n+uDihZaJG2Wj#}Dbo`8!+;%?(9U?YZk>5dC+(I>7sG-N4*p}&EYEr%&v zL?sC&G&ocSU$&>_!OMII-qGTPBu7@UQHEDJ?F{FIddLm%*L^UxYrGyDwq3r?P*NF2 znDQQAD*2=SV5#ikny7{3oQ&a-n=29m4}yuEm_G5q7R-qZ?$^c}G-N87HyeC{7u%B> zajk30H@C|L=fQ5AuSsJP1^D)3M2NX5%AEYfc&eK8iP7h6h9@jvHlo%HzV>z*9h+Nm x%j`Id=_8sMOZMCobn6!bHt&*SGQ!?JXQheAK&#z1<96}0Dk3y`V^c_4@qckD5|RJ_ diff --git a/src/main/resources/assets/create/textures/gui/schematics_2.png b/src/main/resources/assets/create/textures/gui/schematics_2.png index 6e90db147a519806a1db9ccdd4101db5219c276e..2c06d9445f74555333280ece95ed2d337879b6be 100644 GIT binary patch literal 3948 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 HpBDE&*JCx^ diff --git a/src/main/resources/assets/create/textures/gui/toolbox.png b/src/main/resources/assets/create/textures/gui/toolbox.png index 7699dd64bd0b3b809700f764022f9badedcb79a3..ee72d643fd80075cbb2fd4a01a1406946d70b2b1 100644 GIT binary patch literal 1679 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 Date: Mon, 20 Jan 2025 10:44:32 +0100 Subject: [PATCH 336/515] Watch where you're going - Fixed package entity yaw being inverted - Added missing lang entry for train status - Stock ticker now shows a tooltip when trying to use it without a keeper - Fixed ornate iron window not connecting textures - Copper roof item models now use the copper block texture --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 6 +++--- .../resources/assets/create/lang/en_ud.json | 2 ++ .../resources/assets/create/lang/en_us.json | 2 ++ .../decoration/palettes/AllPaletteBlocks.java | 5 +++-- .../content/logistics/box/PackageEntity.java | 1 + .../content/logistics/box/PackageRenderer.java | 2 +- .../stockTicker/StockTickerBlock.java | 10 ++++++++-- .../scenes/highLogistics/PostboxScenes.java | 1 + .../ponder/scenes/trains/TrackScenes.java | 1 + .../assets/create/lang/default/interface.json | 2 ++ .../textures/block/copper/copper_roof_top.png | Bin 1654 -> 502 bytes .../block/copper/exposed_copper_roof_top.png | Bin 419 -> 494 bytes .../block/copper/oxidized_copper_roof_top.png | Bin 453 -> 496 bytes .../block/copper/weathered_copper_roof_top.png | Bin 455 -> 502 bytes 14 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 455fb12c6d..cede4d04b8 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2025-01-18T17:58:23.8133105 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2025-01-20T10:31:13.8923616 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -642,8 +642,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -1c24597f2b10409d8b8cf6819dd8dfe41f2861f2 assets/create/lang/en_ud.json -575042f88772cd1553c19a924aa1d95d38cd93ba assets/create/lang/en_us.json +0934b657da0d6042201c4a876b371e4fd02dda0c assets/create/lang/en_ud.json +1058b0dd870b8625d455991288794049a0dd58ee assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 89cfd48e62..b81b61f1c1 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -2899,6 +2899,7 @@ "create.stock_keeper.use_list_to_add_purchases": "ǝsɐɥɔɹnd ɹnoʎ oʇ ǝɹoɯ ppɐ oʇ ʇsıן sıɥʇ ǝs∩", "create.stock_ticker.click_to_retrieve": "ǝʌǝıɹʇǝɹ oʇ ʞɔıןƆ", "create.stock_ticker.contains_payments": ":sʇuǝɯʎɐd suıɐʇuoƆ", + "create.stock_ticker.keeper_missing": "ʇı ǝsn oʇ ʞɔoןq sıɥʇ oʇ ʇxǝu ɹǝuɹnq ǝzɐןq ɹo qoɯ ɐ ʇɐǝS", "create.subtitle.blaze_munch": "sǝɥɔunɯ ɹǝuɹnᗺ ǝzɐןᗺ", "create.subtitle.cardboard_bonk": "ʞuoq ʇuɐuosǝᴚ", "create.subtitle.cogs": "ǝןqɯnɹ sןǝǝɥʍboƆ", @@ -3072,6 +3073,7 @@ "create.train.status.missing_driver": "buıssıɯ ǝuob sɐɥ ɹǝʌıɹᗡ", "create.train.status.navigation_success": "pǝpǝǝɔɔns uoıʇɐbıʌɐN", "create.train.status.no_match": ",%1$s, sǝɥɔʇɐɯ ɥdɐɹb uo uoıʇɐʇs oN", + "create.train.status.no_package_target": "ssǝɹppɐ sʇı sǝɥɔʇɐɯ ʇɐɥʇ xoqʇsod ou sɐɥ obɹɐɔ uı ǝbɐʞɔɐd Ɐ", "create.train.status.no_path": "punoɟ ǝq pןnoɔ uoıʇɐuıʇsǝp pǝןnpǝɥɔS ʇxǝu ǝɥʇ oʇ ɥʇɐd ǝןqɐʇıns oN", "create.train.status.opposite_driver": "uoıʇɔǝɹıp ǝʇısoddo ǝɥʇ buıɔɐɟ ɹǝʌıɹp ɐ sǝɹınbǝɹ ɥʇɐԀ", "create.train.status.paused_for_manual": "sןoɹʇuoɔ ןɐnuɐɯ ɹoɟ pǝsnɐd ǝןnpǝɥɔS", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 356411de31..481e27233f 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -2899,6 +2899,7 @@ "create.stock_keeper.use_list_to_add_purchases": "Use this list to add more to your purchase", "create.stock_ticker.click_to_retrieve": "Click to retrieve", "create.stock_ticker.contains_payments": "Contains payments:", + "create.stock_ticker.keeper_missing": "Seat a mob or blaze burner next to this block to use it", "create.subtitle.blaze_munch": "Blaze Burner munches", "create.subtitle.cardboard_bonk": "Resonant bonk", "create.subtitle.cogs": "Cogwheels rumble", @@ -3072,6 +3073,7 @@ "create.train.status.missing_driver": "Driver has gone missing", "create.train.status.navigation_success": "Navigation succeeded", "create.train.status.no_match": "No station on graph matches '%1$s'", + "create.train.status.no_package_target": "A package in cargo has no postbox that matches its address", "create.train.status.no_path": "No suitable path to the next Scheduled destination could be found", "create.train.status.opposite_driver": "Path requires a driver facing the opposite direction", "create.train.status.paused_for_manual": "Schedule paused for manual controls", diff --git a/src/main/java/com/simibubi/create/content/decoration/palettes/AllPaletteBlocks.java b/src/main/java/com/simibubi/create/content/decoration/palettes/AllPaletteBlocks.java index 59b5088bd2..bd5ddb9465 100644 --- a/src/main/java/com/simibubi/create/content/decoration/palettes/AllPaletteBlocks.java +++ b/src/main/java/com/simibubi/create/content/decoration/palettes/AllPaletteBlocks.java @@ -81,8 +81,9 @@ public class AllPaletteBlocks { WARPED_WINDOW = woodenWindowBlock(WoodType.WARPED, Blocks.WARPED_PLANKS), CHERRY_WINDOW = woodenWindowBlock(WoodType.CHERRY, Blocks.CHERRY_PLANKS), BAMBOO_WINDOW = woodenWindowBlock(WoodType.BAMBOO, Blocks.BAMBOO_PLANKS), - ORNATE_IRON_WINDOW = customWindowBlock("ornate_iron_window", () -> Items.IRON_NUGGET, null, - () -> RenderType::cutout, false, () -> MapColor.TERRACOTTA_LIGHT_GRAY), + ORNATE_IRON_WINDOW = + customWindowBlock("ornate_iron_window", () -> Items.IRON_NUGGET, () -> AllSpriteShifts.ORNATE_IRON_WINDOW, + () -> RenderType::cutout, false, () -> MapColor.TERRACOTTA_LIGHT_GRAY), INDUSTRIAL_IRON_WINDOW = customWindowBlock("industrial_iron_window", AllBlocks.INDUSTRIAL_IRON_BLOCK, () -> AllSpriteShifts.INDUSTRIAL_IRON_WINDOW, () -> RenderType::cutout, false, () -> MapColor.COLOR_GRAY), WEATHERED_IRON_WINDOW = WindowGen diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java index ad2fefa81f..53850c9bb8 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java @@ -75,6 +75,7 @@ public class PackageEntity extends LivingEntity implements IEntityAdditionalSpaw super((EntityType) entityTypeIn, worldIn); box = ItemStack.EMPTY; setYRot(this.random.nextFloat() * 360.0F); + setYHeadRot(getYRot()); yRotO = getYRot(); insertionDelay = 30; } diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageRenderer.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageRenderer.java index 66cb5e02d5..e7717eb6d6 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageRenderer.java @@ -42,7 +42,7 @@ public class PackageRenderer extends EntityRenderer { return; SuperByteBuffer sbb = CachedBuffers.partial(model, Blocks.AIR.defaultBlockState()); sbb.translate(-.5, 0, -.5) - .rotateCentered(AngleHelper.rad(yaw), Direction.UP) + .rotateCentered(-AngleHelper.rad(yaw + 90), Direction.UP) .light(light) .nudge(entity.getId()); sbb.renderInto(ms, buffer.getBuffer(RenderType.solid())); diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlock.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlock.java index 203efbcc5c..4e6c5375bf 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockTickerBlock.java @@ -7,6 +7,7 @@ import com.simibubi.create.AllSoundEvents; import com.simibubi.create.content.equipment.wrench.IWrenchable; import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedBlockItem; import com.simibubi.create.foundation.block.IBE; +import com.simibubi.create.foundation.utility.CreateLang; import dev.engine_room.flywheel.lib.model.baked.PartialModel; import net.minecraft.core.BlockPos; @@ -74,8 +75,13 @@ public class StockTickerBlock extends HorizontalDirectionalBlock implements IBE< return InteractionResult.SUCCESS; } - if (pPlayer instanceof ServerPlayer sp && stbe.isKeeperPresent()) - NetworkHooks.openScreen(sp, stbe.new CategoryMenuProvider(), stbe.getBlockPos()); + if (pPlayer instanceof ServerPlayer sp) { + if (stbe.isKeeperPresent()) + NetworkHooks.openScreen(sp, stbe.new CategoryMenuProvider(), stbe.getBlockPos()); + else + CreateLang.translate("stock_ticker.keeper_missing") + .sendStatus(pPlayer); + } return InteractionResult.SUCCESS; }); diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/PostboxScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/PostboxScenes.java index 709a4fb774..aed0b971c8 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/PostboxScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/PostboxScenes.java @@ -31,6 +31,7 @@ public class PostboxScenes { scene.title("postbox", "Transporting packages between Postboxes"); scene.configureBasePlate(0, 1, 9); scene.scaleSceneView(.875f); + scene.removeShadow(); scene.setSceneOffsetY(-0.5f); BlockPos station = util.grid() diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrackScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrackScenes.java index 759e5eed07..6a551aeffa 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrackScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/trains/TrackScenes.java @@ -342,6 +342,7 @@ public class TrackScenes { scene.title("track_chunks", "Traversing unloaded Chunks"); scene.configureBasePlate(0, 0, 9); scene.scaleSceneView(.65f); + scene.removeShadow(); scene.setSceneOffsetY(-1); scene.world().cycleBlockProperty(util.grid().at(5, 3, 4), BlazeBurnerBlock.HEAT_LEVEL); diff --git a/src/main/resources/assets/create/lang/default/interface.json b/src/main/resources/assets/create/lang/default/interface.json index f60b897e06..e726e327a0 100644 --- a/src/main/resources/assets/create/lang/default/interface.json +++ b/src/main/resources/assets/create/lang/default/interface.json @@ -350,6 +350,7 @@ "create.stock_ticker.contains_payments": "Contains payments:", "create.stock_ticker.click_to_retrieve": "Click to retrieve", + "create.stock_ticker.keeper_missing": "Seat a mob or blaze burner next to this block to use it", "create.gui.stock_ticker.category_editor": "Category Editor", "create.gui.stock_ticker.shift_moves_top": "Shift moves to top", @@ -991,6 +992,7 @@ "create.train.status.navigation_success": "Navigation succeeded", "create.train.status.no_match": "No station on graph matches '%1$s'", "create.train.status.no_path": "No suitable path to the next Scheduled destination could be found", + "create.train.status.no_package_target": "A package in cargo has no postbox that matches its address", "create.track_signal.cannot_change_mode": "Unable to switch mode of this Signal", "create.track_signal.mode_change.entry_signal": "-> Allow passage if section unoccupied", diff --git a/src/main/resources/assets/create/textures/block/copper/copper_roof_top.png b/src/main/resources/assets/create/textures/block/copper/copper_roof_top.png index 942ee43f4c8c05c6b8bd637281304578acfbd1b3..6c097991393d9b2a0e82bc29b6a0fd4b66e2a43f 100644 GIT binary patch literal 502 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF)#r7@5K1OhC3FBNNyMQ9yQPI}2Dm3&;imPf13G7eJ4} zXf#V1fKn6K8CZZS4UCKp7#BcH1=+~D0AkVyJcniT%#Zs{H}2Nn$e_%+Ackh~`9oEv#_7RX_q Lu6{1-oD!MUh$qG;M* ztO5&kt~|0mz^lDKAQnaht6G=?985Y76WP+0TSj%F4HjDTGB*1<4Io4~+X4(3FrXb7 zOOCW>_C$zd06z)H*(l)*3dmZnK*?f^137`)+1TT$uYYCBV;Us{BCK)7gPLd(xDv5~ zTJsW+L&+K|)>>!14K~{3j1y;_bKbRDOx}3$);sTg@X@DWf&?2}@F9d4l8PJ+YSl&; zeGDQkAQzQf+nB*HB|k2OUVI zLk@em!+#&)h(|h+YNt8nw5L1$8P0g7&01$wy>Rx)+^<=q$r=b#oio9r#Tur)UnZ!@ ziEW&LF%|;jzA=D==Ej*0B*Kk3)i~3UQ5BYf(l&A`HO9c89K`md&E3V^2X6{>|EIk1 zojKL0`y0%uM%@E*pS(S=R-3+;R)-qG*2=I2RezhaF(H=P_aJ$QN*hA2^cOu@fL0t5 z{?bGAyNxRnUm#Whqs%Sqm!n1u0ay z1AkNl8Ru>ra)4(JfpLLhcaF&rGr8?U8q`=y!Kya`CNvnK=_+Jx`VvE^W_pD>DBXQ2 zvBycZK*ZNrEahncJrN>tSJdIwh0q($VmGg==E|>RuU&W0@v#hG#YNtNs?$1Wnoq~k^82`eWGf; zdQpxoNw*Kg)Vg-`Cj3*yt$Nq1>snJj@o!=LygI2b?odlf5w8&{;@7HwsDJ+V-k-SK zMfD%c541jF`Hjs0000JJOGiWivH)TLM=-A|b^rhX32;bRa{vGf6951U69E94oEQKA z00(qQO+^Rj3=$VKGZe69P5=M_1xZ9fR4C7dkxfp+Fc5_wk2S5#QYq4mj4~J z(0h%W*O$k&9Pa2gTDQz0nw{nVs!FN>0PQjdH9PfNg;gkW$01wuJ6+~V4vQ~c&mo;T v=jNi{jzgDI+qwcU%OQ3BoNKs$7K|e}dG+=w00000NkvXXu0mjf#;gOY diff --git a/src/main/resources/assets/create/textures/block/copper/exposed_copper_roof_top.png b/src/main/resources/assets/create/textures/block/copper/exposed_copper_roof_top.png index a8b27e7d0e255dcd67291ec64361a1f0d78e552d..beba452042de81b6d717028c042e92339e6263ce 100644 GIT binary patch literal 494 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFjH>LQ-Ev`U;>)U1XdYjX#r$Gbr~8MfMoSA<$sg> z_3tE*S>x&A7$R|*xBH-Ivw{HY{&n}7*RZ-IF>ZKZ*>aWXi{t;LEw}en8Xqv&!?3v_ z>ExvIZJnPU&9qvwXX7&FB?n)hkKOw*?Av$FBDX_lwcU=#&R|}w|L)qQWWI-s%ic~G z&VStJ*&Xq7-i();he{It46E&=jx9TLJ8t8(YgxHp`6C5HHS*_m&jq>3)78&qol`;+ E0RNqb!2kdN delta 384 zcmV-`0e}AP1ET|w7#j!z0001xk!Usm000JJOGiWidjQn{)|0d9n~`4_e+P6)O+^Rj z3?B0?UC+dNl zH{${0K^nS9bPFhi&3c$-O3@~6Hrd&4W;V0`Z#~@K;c(4mTNopv)4%y#wsEuoP}CJA zN=Vr^m(n7hm~7ej%xyyae@yDA!kA8J<~PkvUx|->czu!-klvhTKJzCOOs;O@YWt97uxrfrnbKmJ7ipaqx>Tz7J5UX0fk$L90|U1( z2s1Lwnj-j1z-+898`LxPey8^3=MLCB(o7>n#7xHND(($?- z{^e-K;cS-=u8V(4I>%m`^r}Zs@At; zg-jdA_1aW%ZyaO)5NBMkqma?FRaq1=0Hu86dOe>F=d+=|CC=#Ykw^fXU(B>|rivSx z16Vyj(bY&K!~rk>+PF_y5#7Ci`5A09S!M-*Wmb6JCTQbc9#?9SQm!8wfafiwms+GW zM%mfYMw2cdh<|A#b8f1*d`)+&4+gkCZ)AQZE&&jyuK_eNF9Ei(J#jsTssOltn+8<{ z*6Bh*Ro|TXKv&m+b^Pk~=4ju&aZFXxhQ~cbA)`gfLs#gY2W=dcO^Z_B0JbV4xK)|= z(}q&tIA298^k+~7m{~SQ;A+XL@?&_Lt htS+Rh>+WpCe*n$#56QSo{>A_R002ovPDHLkV1nt!x=8>4 diff --git a/src/main/resources/assets/create/textures/block/copper/weathered_copper_roof_top.png b/src/main/resources/assets/create/textures/block/copper/weathered_copper_roof_top.png index 956cf04508de42e0b435c8493dfdca463094c1fb..d38b3803ab0d7eeae6e0240e6e3030d60508b887 100644 GIT binary patch literal 502 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF*AN9$JwrXC-+P$10o80vjqptK^weVD z0CHFvq!?Kl7=bJ=AeM%*K@QYlWCn{f0ojI(Okf{G0oj@DEMW00AR7ccB^eoB06hky z(JW;EN=;yAU;(N$Ffuk^TmUf@WFzYWh)Gj`Y!F}qn#%-M8DwbzWI=Tq8W@0N^)Kar zll=AXB#_zY>Eak7aar_?Azzb&fZN0RcAxX>IRBoR5OJ6(dhu&U6RSH8c?+(K@1DNC z!hu6~g4zV$jr}(rWrA%tE-qYH`i-|HfAZP&Op{hb&X?9ulUOYvCA)Dj){P(}VZ{Ev)-5`?tx=p+dcmK)y z|H1w96Mk#g0KiF6h$~5LhS(~jeVrj5JUrgf>QN>5ILW>5+r<&y zHJIx*oh;%}FNdI6CnoCWKn^xS`#NZbn^7-^B8Rq;IZvIx&e?7b#H}(cXx2_s)`BZ} zGKZPiU-8_mmM`3H$-AzzGtp{a1AEQ_yQOq?@1NvdS2DnrToq}TGumDismnq8+A5Qn jD69@SEY+Aa|IXnDfj;WmPRPs-00000NkvXXu0mjfw`#xz From 946b80d5e4412e3956dd910cb6c5e23308b4be44 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Mon, 20 Jan 2025 15:17:39 +0100 Subject: [PATCH 337/515] Ponder feedback --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 6 ++-- .../resources/assets/create/lang/en_ud.json | 24 +++++++------- .../resources/assets/create/lang/en_us.json | 24 +++++++------- .../ponder/AllCreatePonderTags.java | 32 +++++++++---------- .../highLogistics/FrogAndConveyorScenes.java | 8 ++--- .../scenes/highLogistics/PackagerScenes.java | 4 +-- .../scenes/highLogistics/StockLinkScenes.java | 2 +- .../highLogistics/StockTickerScenes.java | 16 +++++----- 8 files changed, 58 insertions(+), 58 deletions(-) diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index cede4d04b8..cde0ce3d8c 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2025-01-20T10:31:13.8923616 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2025-01-20T15:09:32.7206817 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -642,8 +642,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -0934b657da0d6042201c4a876b371e4fd02dda0c assets/create/lang/en_ud.json -1058b0dd870b8625d455991288794049a0dd58ee assets/create/lang/en_us.json +8d13fe09a474ee6fa5a989f1a135faeb762cf06e assets/create/lang/en_ud.json +591f942809c644aa11ee28c8dab15c498e719a22 assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index b81b61f1c1..5e91f96cc3 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -1678,7 +1678,7 @@ "create.ponder.cart_assembler_rails.text_4": "sǝıɹoʇuǝʌuı pǝɥɔɐʇʇɐ ʎuɐ ɯoɹɟ ןǝnɟ buıןןnd 'pǝɹǝʍod sǝʌןǝsɯǝɥʇ dǝǝʞ ןןıʍ sʇɹɐƆ ǝɔɐuɹnℲ", "create.ponder.chain_conveyor.header": "sɹoʎǝʌuoƆ uıɐɥƆ buısn ǝɔɹoɟ ןɐuoıʇɐʇoɹ buıʎɐןǝᴚ", "create.ponder.chain_conveyor.text_1": "ɯǝɥʇ ʇɔǝuuoɔ oʇ suıɐɥɔ ɥʇıʍ sɹoʎǝʌuoɔ oʍʇ ʞɔıןɔ-ʇɥbıᴚ", - "create.ponder.chain_conveyor.text_2": "˙˙ʎןqıxǝןɟ ʎɹǝʌ ɹǝɥʇo ɥɔɐǝ oʇ ɹǝʍod ןɐuoıʇɐʇoɹ ʎɐןǝɹ ǝsǝɥ⟘", + "create.ponder.chain_conveyor.text_2": "˙˙ɹǝɥʇo ɥɔɐǝ uǝǝʍʇǝq ɹǝʍod ןɐuoıʇɐʇoɹ ʎɐןǝɹ sɹoʎǝʌuoɔ uıɐɥƆ", "create.ponder.chain_conveyor.text_3": "ɯǝɥʇ ʍoןǝq ɹo ǝʌoqɐ sʇɟɐɥs oʇ ʇɔǝuuoɔ puɐ˙˙", "create.ponder.chain_conveyor.text_4": "uıɐɥɔ ǝɥʇ uo buıןןǝʌɐɹʇ ʇɹɐʇs oʇ ɥɔuǝɹʍ ɐ buıpןoɥ ʞɔıןɔ-ʇɥbıᴚ", "create.ponder.chain_conveyor.text_5": "ʇı ʍoןןoɟ oʇ uıɐɥɔ ɐ spɹɐʍoʇ ǝɔɐɟ 'uoıʇɔunظ ɐ ʇⱯ", @@ -2166,7 +2166,7 @@ "create.ponder.package_frogport.text_11": "ɹǝʇǝԀ", "create.ponder.package_frogport.text_12": "ɹǝʇǝԀ →", "create.ponder.package_frogport.text_13": "ɯǝɥʇ ʍoןǝq sǝıɹoʇuǝʌuı ɥʇıʍ ǝɔɐɟɹǝʇuı ʎןʇɔǝɹıp uɐɔ sʇɹodboɹℲ", - "create.ponder.package_frogport.text_14": "ʎןʇɔǝɹıp pǝddıɥs puɐ pǝʞɔɐd ǝq uɐɔ sɯǝʇı 'sɹǝbɐʞɔɐd ɥʇıʍ sʞɹoʍ sıɥ⟘", + "create.ponder.package_frogport.text_14": "ʎןʇɔǝɹıp pǝddıɥs puɐ pǝʞɔɐd ǝq uɐɔ sɯǝʇI ˙sɹǝbɐʞɔɐd ɥʇıʍ sʞɹoʍ osןɐ sıɥ⟘", "create.ponder.package_frogport.text_15": "ʇɹǝqןⱯ", "create.ponder.package_frogport.text_16": "ɹǝʇǝԀ", "create.ponder.package_frogport.text_17": ",ɹǝʇǝԀ, oʇ sǝbɐʞɔɐd sǝssǝɹppⱯ", @@ -2181,7 +2181,7 @@ "create.ponder.package_frogport.text_8": "ʞɹoʍʇǝu uıɐɥɔ ǝɥʇ uo ǝɹǝɥʍʎuɐ pǝppɐ ǝq uɐɔ sʇɹodboɹℲ ǝɹoW", "create.ponder.package_frogport.text_9": "ɹǝʇǝԀ", "create.ponder.packager.header": "sǝbɐʞɔɐd buıddɐɹʍun puɐ buıʇɐǝɹƆ", - "create.ponder.packager.text_1": "ʇǝbɹɐʇ pןnoɥs ʎǝɥʇ ʎɹoʇuǝʌuı ǝɥʇ oʇ ʇxǝu sɹǝbɐʞɔɐd ǝɔɐןԀ", + "create.ponder.packager.text_1": "ʇǝbɹɐʇ pןnoɥs ʎǝɥʇ ʎɹoʇuǝʌuı ǝɥʇ oʇ sɹǝbɐʞɔɐd ɥɔɐʇʇⱯ", "create.ponder.packager.text_2": "ǝbɐʞɔɐd ɐ oʇuı ʎɹoʇuǝʌuı ǝɥʇ ɯoɹɟ sɯǝʇı ʞɔɐd ןןıʍ ʇı 'ɹǝʍod ǝuoʇspǝɹ uǝʌı⅁", "create.ponder.packager.text_3": "ɯǝʇı ɹǝɥʇo ʎuɐ ǝʞıן pǝʇɹodsuɐɹʇ puɐ dn pǝʞɔıd ǝq uɐɔ ǝsǝɥ⟘", "create.ponder.packager.text_4": "ʎɹoʇuǝʌuı ǝɥʇ oʇuı sʇuǝʇuoɔ ǝɥʇ buıʞɔɐdun 'pǝʎoɹʇsǝp ǝq ןןıʍ pǝʇɹǝsuı sǝbɐʞɔɐԀ", @@ -2189,7 +2189,7 @@ "create.ponder.packager.text_6": "ʞɔɐdun ʎןןnɟ ʇouuɐɔ ʎǝɥʇ sǝbɐʞɔɐd ʇdǝɔɔɐ ʇou ןןıʍ sɹǝbɐʞɔɐԀ", "create.ponder.packager_address.header": "ssǝɹppɐ uɐ ɥʇıʍ sǝbɐʞɔɐd buıʇnoᴚ", "create.ponder.packager_address.text_1": "ǝsnoɥǝɹɐM", - "create.ponder.packager_address.text_10": "ʇןǝq ɐ oʇuo ʇɥbıɐɹʇs sǝbɐʞɔɐd dɐɹʍun uɐɔ sʍɐs ןɐɔıuɐɥɔǝɯ 'ssǝuʇɔɐdɯoɔ ɹoℲ", + "create.ponder.packager_address.text_10": "ʇןǝq ɐ oʇuo ʇɥbıɐɹʇs ʞɔɐdun uɐɔ sʍɐs ןɐɔıuɐɥɔǝɯ 'ssǝuʇɔɐdɯoɔ ɹoℲ", "create.ponder.packager_address.text_11": "sǝıʇıןıqɐ buıʇnoɹ ǝbɐʞɔɐd ǝʌɐɥ sǝxoqʇsoԀ puɐ sʇɹodboɹℲ 'sɹǝʇןıɟ ɯoɹɟ ǝpısⱯ", "create.ponder.packager_address.text_12": "ɹnoıʌɐɥǝq ɹıǝɥʇ ʇnoqɐ ǝɹoɯ ʇno puıɟ oʇ ɯǝɥʇ ʇɔǝdsuI", "create.ponder.packager_address.text_2": "˙˙ɹǝbɐʞɔɐd ɐ uo pǝɔɐןd sı ubıs ɐ uǝɥM", @@ -2407,7 +2407,7 @@ "create.ponder.sticker.text_3": "ʇı ɥʇıʍ ǝʌoɯ ןןıʍ ʞɔoןq ǝɥʇ 'uoıʇdɐɹʇuoɔ ɐ uı pǝʌoɯ ʍou sı ʇı ɟI", "create.ponder.sticker.text_4": "pǝɥɔɐʇʇɐ ɹǝbuoן ou sı ʞɔoןq ǝɥʇ 'uıɐbɐ ǝɔuo pǝןbbo⟘", "create.ponder.stock_link.header": "ʞuıꞀ ʞɔoʇS ǝɥʇ puɐ sʞɹoʍʇǝN sɔıʇsıboꞀ", - "create.ponder.stock_link.text_1": "ʞɹoʍʇǝu ʍǝu ɐ ǝʇɐǝɹɔ sʞuıꞀ ʞɔoʇS 'pǝɔɐןd uǝɥM", + "create.ponder.stock_link.text_1": "ʞɹoʍʇǝu ʞɔoʇs ʍǝu ɐ ǝʇɐǝɹɔ sʞuıꞀ ʞɔoʇS 'pǝɔɐןd uǝɥM", "create.ponder.stock_link.text_2": "ɯǝɥʇ puıq oʇ ʇı buıɔɐןd ǝɹoɟǝq ʞuıן buıʇsıxǝ uɐ ʞɔıןɔ-ʇɥbıᴚ", "create.ponder.stock_link.text_3": "ʞɹoʍʇǝu ǝɥʇ oʇ ǝןqɐןıɐʌɐ ʎɹoʇuǝʌuı ɹıǝɥʇ ǝʞɐɯ sɹǝbɐʞɔɐd pǝʞuıן-ʞɔoʇS", "create.ponder.stock_link.text_4": "sɯǝʇı ɹıǝɥʇ ʇsǝnbǝɹ puɐ puıɟ ʍou uɐɔ ʞɹoʍʇǝu ǝɥʇ uo sʇuǝuodɯoɔ ɹǝɥʇO", @@ -2417,18 +2417,18 @@ "create.ponder.stock_link.text_8": "ʇsɹıɟ ʇɔɐ oʇ sɹǝɥʇo buısnɐɔ 'ʞuıן ɐ ɟo ʎʇıɹoıɹd ǝɥʇ sɹǝʍoן ɹǝʍod boןɐuⱯ", "create.ponder.stock_ticker.header": "sɹǝʞɔıʇ ʞɔoʇS ɥʇıʍ sɯǝʇı buıɹǝpɹO", "create.ponder.stock_ticker.text_1": "ʞɹoʍʇǝu sʇı oʇ ʇɔǝuuoɔ oʇ ʇuǝɯǝɔɐןd ǝɹoɟǝq ʞuıן ʞɔoʇS ɐ ʞɔıןɔ-ʇɥbıᴚ", - "create.ponder.stock_ticker.text_10": "uouuɐɔıʇɐɯǝɥɔs ǝɥʇ ɹoɟ pǝɹınbǝɹ sʞɔoןq ʇsǝnbǝɹ osןɐ uɐɔ sɹǝʞɔıʇ ʞɔoʇS", - "create.ponder.stock_ticker.text_11": "ɹǝdǝǝʞ ǝɥʇ oʇ pǝʇɐɹǝuǝb ʇı pɹɐoqdıןɔ pǝʇuıɹd ǝɥʇ puɐɥ ʎןdɯıS", - "create.ponder.stock_ticker.text_2": "ʞɹoʍʇǝu ǝɥʇ oʇ ǝןqɐןıɐʌɐ ʎɹoʇuǝʌuı ɹıǝɥʇ ǝʞɐɯ sɹǝbɐʞɔɐd pǝʞuıן-ʞɔoʇS", - "create.ponder.stock_ticker.text_3": "sǝıɹoʇuǝʌuı ǝsǝɥʇ ɯoɹɟ sɯǝʇı ʇsǝnbǝɹ uɐɔ sɹǝʞɔıʇ ʞɔoʇS", + "create.ponder.stock_ticker.text_10": "uouuɐɔıʇɐɯǝɥɔs ǝɥʇ ɹoɟ pǝɹınbǝɹ sʞɔoןq ɹǝpɹo osןɐ uɐɔ sɹǝʞɔıʇ ʞɔoʇS", + "create.ponder.stock_ticker.text_11": "ɹǝdǝǝʞ ʞɔoʇS ǝɥʇ oʇ pǝʇɐɹǝuǝb ʇı pɹɐoqdıןɔ pǝʇuıɹd ǝɥʇ puɐɥ ʎןdɯıS", + "create.ponder.stock_ticker.text_2": "ʞɹoʍʇǝu ǝɥʇ oʇ ǝןqɐןıɐʌɐ ʎɹoʇuǝʌuı pǝɥɔɐʇʇɐ ɹıǝɥʇ ǝʞɐɯ sɹǝbɐʞɔɐd pǝʞuıן-ʞɔoʇS", + "create.ponder.stock_ticker.text_3": "sǝıɹoʇuǝʌuı ǝsǝɥʇ ɯoɹɟ sɯǝʇı ɹǝpɹo uɐɔ sɹǝʞɔıʇ ʞɔoʇS", "create.ponder.stock_ticker.text_4": "ɹǝdǝǝʞ ʞɔoʇS ǝɥʇ sɐ ʇɔɐ ʇı ɟo ʇuoɹɟ uı sɹǝuɹnq ǝzɐןq ɹo sqoɯ pǝʇɐǝS", "create.ponder.stock_ticker.text_5": "sɯǝʇı buıɹǝpɹo ʇɹɐʇs oʇ ɹǝdǝǝʞ ǝɥʇ ʞɔıןɔ-ʇɥbıᴚ", "create.ponder.stock_ticker.text_6": "sǝbɐʞɔɐd oʇuı pǝɔɐןd ǝq ןןıʍ sɯǝʇı ǝɥʇ 'pǝʇʇıɯqns sı ɹǝpɹo uɐ uǝɥM", "create.ponder.stock_ticker.text_7": "ʇuıod ʇsǝnbǝɹ ǝɥʇ oʇ pǝʇɹodsuɐɹʇ ǝq uɐɔ ʎǝɥʇ 'ǝɹǝɥʇ ɯoɹℲ", "create.ponder.stock_ticker.text_8": "sbuıʇsıן ɯǝʇı ǝɥʇ oʇ pǝppɐ ǝq uɐɔ sǝıɹobǝʇɐɔ 'sɹǝʇןıɟ ʇsıן ɹo ǝʇnqıɹʇʇɐ buıs∩", - "create.ponder.stock_ticker.text_9": "ɹoʇıpǝ ʎɹobǝʇɐɔ ǝɥʇ uǝdo oʇ ɟןǝsʇı ʞɔoןq ǝɥʇ ʞɔıןɔ-ʇɥbıᴚ", + "create.ponder.stock_ticker.text_9": "ɹoʇıpǝ ʎɹobǝʇɐɔ ǝɥʇ uǝdo oʇ ɹǝʞɔıʇ ʞɔoʇS ǝɥʇ ʞɔıןɔ-ʇɥbıᴚ", "create.ponder.stock_ticker_address.header": "ɹǝpɹo ɹǝʞɔıʇ ʞɔoʇS ɐ buıssǝɹppⱯ", - "create.ponder.stock_ticker_address.text_1": "ɹǝpɹo ǝɥʇ uı ʇǝs ǝq uɐɔ ssǝɹppɐ ʇǝbɹɐʇ ɐ 'sɯǝʇı buıʇsǝnbǝɹ uǝɥM", + "create.ponder.stock_ticker_address.text_1": "ʇsǝnbǝɹ ǝɥʇ uı ʇǝs ǝq uɐɔ ssǝɹppɐ ʇǝbɹɐʇ ɐ 'sɯǝʇı buıɹǝpɹo uǝɥM", "create.ponder.stock_ticker_address.text_10": "sǝıʇıןıqɐ buıʇnoɹ ǝbɐʞɔɐd ǝʌɐɥ sǝxoqʇsoԀ puɐ sʇɹodboɹℲ 'sɹǝʇןıɟ ɯoɹɟ ǝpısⱯ", "create.ponder.stock_ticker_address.text_11": "ɹnoıʌɐɥǝq ɹıǝɥʇ ʇnoqɐ ǝɹoɯ ʇno puıɟ oʇ ɯǝɥʇ ʇɔǝdsuI", "create.ponder.stock_ticker_address.text_2": "doɥsʞɹoM →", @@ -2480,7 +2480,7 @@ "create.ponder.tag.fluids": "sɹoʇɐןndıuɐW pınןℲ", "create.ponder.tag.fluids.description": "spınןℲ ɟo ǝsn buıʞɐɯ puɐ buıʎɐןǝɹ dןǝɥ ɥɔıɥʍ sʇuǝuodɯoƆ", "create.ponder.tag.high_logistics": "sɔıʇsıboꞀ ɥbıH", - "create.ponder.tag.high_logistics.description": "ʎɹoʇɔɐɟ ɹnoʎ punoɹɐ sʇsǝnbǝɹ pǝʇɐɯoʇnɐ puɐ ǝbɐɹoʇs ɯǝʇı pǝʇnqıɹʇsıp buıbɐuɐɯ dןǝɥ ɥɔıɥʍ sʇuǝuodɯoƆ", + "create.ponder.tag.high_logistics.description": "ʎɹoʇɔɐɟ ɹnoʎ punoɹɐ sʇsǝnbǝɹ pǝʇɐɯoʇnɐ puɐ ǝbɐɹoʇs ɯǝʇı pǝʇnqıɹʇsıp ǝbɐuɐɯ dןǝɥ ɥɔıɥʍ sʇuǝuodɯoƆ", "create.ponder.tag.kinetic_appliances": "sǝɔuɐıןddⱯ ɔıʇǝuıʞ", "create.ponder.tag.kinetic_appliances.description": "ǝɔɹoℲ ןɐuoıʇɐʇoᴚ ɟo ǝsn ǝʞɐɯ ɥɔıɥʍ sʇuǝuodɯoƆ", "create.ponder.tag.kinetic_relays": "sʞɔoןᗺ ɔıʇǝuıʞ", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 481e27233f..6d17309831 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1678,7 +1678,7 @@ "create.ponder.cart_assembler_rails.text_4": "Furnace Carts will keep themselves powered, pulling fuel from any attached inventories", "create.ponder.chain_conveyor.header": "Relaying rotational force using Chain Conveyors", "create.ponder.chain_conveyor.text_1": "Right-click two conveyors with chains to connect them", - "create.ponder.chain_conveyor.text_2": "These relay rotational power to each other very flexibly..", + "create.ponder.chain_conveyor.text_2": "Chain conveyors relay rotational power between each other..", "create.ponder.chain_conveyor.text_3": "..and connect to shafts above or below them", "create.ponder.chain_conveyor.text_4": "Right-click holding a wrench to start travelling on the chain", "create.ponder.chain_conveyor.text_5": "At a junction, face towards a chain to follow it", @@ -2166,7 +2166,7 @@ "create.ponder.package_frogport.text_11": "Peter", "create.ponder.package_frogport.text_12": "→ Peter", "create.ponder.package_frogport.text_13": "Frogports can directly interface with inventories below them", - "create.ponder.package_frogport.text_14": "This works with packagers, items can be packed and shipped directly", + "create.ponder.package_frogport.text_14": "This also works with packagers. Items can be packed and shipped directly", "create.ponder.package_frogport.text_15": "Albert", "create.ponder.package_frogport.text_16": "Peter", "create.ponder.package_frogport.text_17": "Addresses packages to 'Peter'", @@ -2181,7 +2181,7 @@ "create.ponder.package_frogport.text_8": "More Frogports can be added anywhere on the chain network", "create.ponder.package_frogport.text_9": "Peter", "create.ponder.packager.header": "Creating and unwrapping packages", - "create.ponder.packager.text_1": "Place packagers next to the inventory they should target", + "create.ponder.packager.text_1": "Attach packagers to the inventory they should target", "create.ponder.packager.text_2": "Given redstone power, it will pack items from the inventory into a package", "create.ponder.packager.text_3": "These can be picked up and transported like any other item", "create.ponder.packager.text_4": "Packages inserted will be destroyed, unpacking the contents into the inventory", @@ -2189,7 +2189,7 @@ "create.ponder.packager.text_6": "Packagers will not accept packages they cannot fully unpack", "create.ponder.packager_address.header": "Routing packages with an address", "create.ponder.packager_address.text_1": "Warehouse", - "create.ponder.packager_address.text_10": "For compactness, mechanical saws can unwrap packages straight onto a belt", + "create.ponder.packager_address.text_10": "For compactness, mechanical saws can unpack straight onto a belt", "create.ponder.packager_address.text_11": "Aside from filters, Frogports and Postboxes have package routing abilities", "create.ponder.packager_address.text_12": "Inspect them to find out more about their behaviour", "create.ponder.packager_address.text_2": "When a sign is placed on a packager..", @@ -2407,7 +2407,7 @@ "create.ponder.sticker.text_3": "If it is now moved in a contraption, the block will move with it", "create.ponder.sticker.text_4": "Toggled once again, the block is no longer attached", "create.ponder.stock_link.header": "Logistics Networks and the Stock Link", - "create.ponder.stock_link.text_1": "When placed, Stock Links create a new network", + "create.ponder.stock_link.text_1": "When placed, Stock Links create a new stock network", "create.ponder.stock_link.text_2": "Right-click an existing link before placing it to bind them", "create.ponder.stock_link.text_3": "Stock-linked packagers make their inventory available to the network", "create.ponder.stock_link.text_4": "Other components on the network can now find and request their items", @@ -2417,18 +2417,18 @@ "create.ponder.stock_link.text_8": "Analog power lowers the priority of a link, causing others to act first", "create.ponder.stock_ticker.header": "Ordering items with Stock tickers", "create.ponder.stock_ticker.text_1": "Right-click a Stock link before placement to connect to its network", - "create.ponder.stock_ticker.text_10": "Stock tickers can also request blocks required for the schematicannon", - "create.ponder.stock_ticker.text_11": "Simply hand the printed clipboard it generated to the keeper", - "create.ponder.stock_ticker.text_2": "Stock-linked packagers make their inventory available to the network", - "create.ponder.stock_ticker.text_3": "Stock tickers can request items from these inventories", + "create.ponder.stock_ticker.text_10": "Stock tickers can also order blocks required for the schematicannon", + "create.ponder.stock_ticker.text_11": "Simply hand the printed clipboard it generated to the Stock keeper", + "create.ponder.stock_ticker.text_2": "Stock-linked packagers make their attached inventory available to the network", + "create.ponder.stock_ticker.text_3": "Stock tickers can order items from these inventories", "create.ponder.stock_ticker.text_4": "Seated mobs or blaze burners in front of it act as the Stock Keeper", "create.ponder.stock_ticker.text_5": "Right-click the keeper to start ordering items", "create.ponder.stock_ticker.text_6": "When an order is submitted, the items will be placed into packages", "create.ponder.stock_ticker.text_7": "From there, they can be transported to the request point", "create.ponder.stock_ticker.text_8": "Using attribute or list filters, categories can be added to the item listings", - "create.ponder.stock_ticker.text_9": "Right-click the block itself to open the category editor", + "create.ponder.stock_ticker.text_9": "Right-click the Stock ticker to open the category editor", "create.ponder.stock_ticker_address.header": "Addressing a Stock ticker order", - "create.ponder.stock_ticker_address.text_1": "When requesting items, a target address can be set in the order", + "create.ponder.stock_ticker_address.text_1": "When ordering items, a target address can be set in the request", "create.ponder.stock_ticker_address.text_10": "Aside from filters, Frogports and Postboxes have package routing abilities", "create.ponder.stock_ticker_address.text_11": "Inspect them to find out more about their behaviour", "create.ponder.stock_ticker_address.text_2": "→ Workshop", @@ -2480,7 +2480,7 @@ "create.ponder.tag.fluids": "Fluid Manipulators", "create.ponder.tag.fluids.description": "Components which help relaying and making use of Fluids", "create.ponder.tag.high_logistics": "High Logistics", - "create.ponder.tag.high_logistics.description": "Components which help managing distributed item storage and automated requests around your factory", + "create.ponder.tag.high_logistics.description": "Components which help manage distributed item storage and automated requests around your factory", "create.ponder.tag.kinetic_appliances": "Kinetic Appliances", "create.ponder.tag.kinetic_appliances.description": "Components which make use of Rotational Force", "create.ponder.tag.kinetic_relays": "Kinetic Blocks", diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderTags.java b/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderTags.java index 5053be90ef..ed1f5578e8 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderTags.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/AllCreatePonderTags.java @@ -53,84 +53,84 @@ public class AllCreatePonderTags { helper.registerTag(KINETIC_RELAYS) .addToIndex() - .item(AllBlocks.COGWHEEL.get()) + .item(AllBlocks.COGWHEEL.get(), true, false) .title("Kinetic Blocks") .description("Components which help relaying Rotational Force elsewhere") .register(); helper.registerTag(KINETIC_SOURCES) .addToIndex() - .item(AllBlocks.WATER_WHEEL.get()) + .item(AllBlocks.WATER_WHEEL.get(), true, false) .title("Kinetic Sources") .description("Components which generate Rotational Force") .register(); helper.registerTag(KINETIC_APPLIANCES) .addToIndex() - .item(AllBlocks.MECHANICAL_PRESS.get()) + .item(AllBlocks.MECHANICAL_PRESS.get(), true, false) .title("Kinetic Appliances") .description("Components which make use of Rotational Force") .register(); helper.registerTag(FLUIDS) .addToIndex() - .item(AllBlocks.FLUID_PIPE.get()) + .item(AllBlocks.FLUID_PIPE.get(), true, false) .title("Fluid Manipulators") .description("Components which help relaying and making use of Fluids") .register(); helper.registerTag(LOGISTICS) .addToIndex() - .item(Blocks.CHEST) + .item(Blocks.CHEST, true, false) .title("Item Transportation") .description("Components which help moving items around") .register(); helper.registerTag(HIGH_LOGISTICS) .addToIndex() - .item(AllBlocks.STOCK_TICKER.get()) + .item(AllBlocks.STOCK_TICKER.get(), true, false) .title("High Logistics") - .description("Components which help managing distributed item storage and automated requests around your factory") + .description("Components which help manage distributed item storage and automated requests around your factory") .register(); helper.registerTag(REDSTONE) .addToIndex() - .item(Items.REDSTONE) + .item(Items.REDSTONE, true, false) .title("Logic Components") .description("Components which help with redstone engineering") .register(); helper.registerTag(DECORATION) .addToIndex() - .item(Items.ROSE_BUSH) + .item(Items.ROSE_BUSH, true, false) .title("Aesthetics") .description("Components used mostly for decorative purposes") .register(); helper.registerTag(CREATIVE) .addToIndex() - .item(AllBlocks.CREATIVE_CRATE.get()) + .item(AllBlocks.CREATIVE_CRATE.get(), true, false) .title("Creative Mode") .description("Components not usually available for Survival Mode") .register(); helper.registerTag(MOVEMENT_ANCHOR) .addToIndex() - .item(AllBlocks.MECHANICAL_PISTON.get()) + .item(AllBlocks.MECHANICAL_PISTON.get(), true, false) .title("Movement Anchors") .description("Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways") .register(); helper.registerTag(CONTRAPTION_ACTOR) .addToIndex() - .item(AllBlocks.MECHANICAL_HARVESTER.get()) + .item(AllBlocks.MECHANICAL_HARVESTER.get(), true, false) .title("Contraption Actors") .description("Components which expose special behaviour when attached to a moving contraption") .register(); helper.registerTag(CONTRAPTION_ASSEMBLY) .addToIndex() - .item(AllItems.SUPER_GLUE.get()) + .item(AllItems.SUPER_GLUE.get(), true, false) .title("Block Attachment Utility") .description("Tools and Components used to assemble structures moved as an animated Contraption") .register(); @@ -149,7 +149,7 @@ public class AllCreatePonderTags { helper.registerTag(TRAIN_RELATED) .addToIndex() - .item(AllBlocks.TRACK.get()) + .item(AllBlocks.TRACK.get(), true, false) .title("Railway Equipment") .description("Components used in the construction or management of Train Contraptions") .register(); @@ -356,10 +356,10 @@ public class AllCreatePonderTags { HELPER.addToTag(HIGH_LOGISTICS) .add(AllBlocks.PACKAGER) - .add(AllBlocks.PACKAGE_FROGPORT) - .add(AllBlocks.PACKAGE_POSTBOXES.get(DyeColor.WHITE)) .add(AllBlocks.STOCK_LINK) .add(AllBlocks.STOCK_TICKER) + .add(AllBlocks.PACKAGE_FROGPORT) + .add(AllBlocks.PACKAGE_POSTBOXES.get(DyeColor.WHITE)) .add(AllBlocks.REDSTONE_REQUESTER) .add(AllBlocks.TABLE_CLOTHS.get(DyeColor.RED)) .add(AllBlocks.FACTORY_GAUGE) diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/FrogAndConveyorScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/FrogAndConveyorScenes.java index 4c002bfe4c..1b7bed6be4 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/FrogAndConveyorScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/FrogAndConveyorScenes.java @@ -182,13 +182,13 @@ public class FrogAndConveyorScenes { scene.idle(20); scene.overlay() - .showText(60) - .text("These relay rotational power to each other very flexibly..") + .showText(70) + .text("Chain conveyors relay rotational power between each other..") .attachKeyFrame() .placeNearTarget() .pointAt(util.vector() .topOf(conv3.offset(-1, 0, -1))); - scene.idle(50); + scene.idle(60); scene.world() .hideIndependentSection(poleE, Direction.SOUTH); @@ -790,7 +790,7 @@ public class FrogAndConveyorScenes { scene.overlay() .showText(90) .attachKeyFrame() - .text("This works with packagers, items can be packed and shipped directly") + .text("This also works with packagers. Items can be packed and shipped directly") .pointAt(util.vector() .blockSurface(fromFrog.below(), Direction.WEST)) .placeNearTarget(); diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/PackagerScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/PackagerScenes.java index 996827af57..2f286a7e36 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/PackagerScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/PackagerScenes.java @@ -81,7 +81,7 @@ public class PackagerScenes { scene.overlay() .showText(80) - .text("Place packagers next to the inventory they should target") + .text("Attach packagers to the inventory they should target") .attachKeyFrame() .placeNearTarget() .pointAt(util.vector() @@ -504,7 +504,7 @@ public class PackagerScenes { .everywhere(), 1 / 32f); scene.overlay() .showText(100) - .text("For compactness, mechanical saws can unwrap packages straight onto a belt") + .text("For compactness, mechanical saws can unpack straight onto a belt") .attachKeyFrame() .placeNearTarget() .pointAt(util.vector() diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/StockLinkScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/StockLinkScenes.java index 90c0ea8ce7..f62554eb25 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/StockLinkScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/StockLinkScenes.java @@ -76,7 +76,7 @@ public class StockLinkScenes { scene.overlay() .showText(70) .attachKeyFrame() - .text("When placed, Stock Links create a new network") + .text("When placed, Stock Links create a new stock network") .pointAt(util.vector() .centerOf(link2.below())) .placeNearTarget(); diff --git a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/StockTickerScenes.java b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/StockTickerScenes.java index b48a45f3a9..f648f85233 100644 --- a/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/StockTickerScenes.java +++ b/src/main/java/com/simibubi/create/infrastructure/ponder/scenes/highLogistics/StockTickerScenes.java @@ -194,21 +194,21 @@ public class StockTickerScenes { scene.idle(30); scene.overlay() - .showText(80) - .text("Stock-linked packagers make their inventory available to the network") + .showText(100) + .text("Stock-linked packagers make their attached inventory available to the network") .attachKeyFrame() .placeNearTarget() .pointAt(util.vector() .blockSurface(util.grid() .at(3, 2, 5), Direction.WEST)); - scene.idle(90); + scene.idle(110); scene.overlay() .showOutline(PonderPalette.BLUE, ticker, tickerS, 40); scene.overlay() .showText(80) - .text("Stock tickers can request items from these inventories") + .text("Stock tickers can order items from these inventories") .attachKeyFrame() .placeNearTarget() .pointAt(util.vector() @@ -356,7 +356,7 @@ public class StockTickerScenes { scene.overlay() .showText(80) - .text("Right-click the block itself to open the category editor") + .text("Right-click the Stock ticker to open the category editor") .colored(PonderPalette.BLUE) .placeNearTarget() .pointAt(util.vector() @@ -368,7 +368,7 @@ public class StockTickerScenes { scene.overlay() .showText(80) - .text("Stock tickers can also request blocks required for the schematicannon") + .text("Stock tickers can also order blocks required for the schematicannon") .colored(PonderPalette.BLUE) .attachKeyFrame() .placeNearTarget() @@ -386,7 +386,7 @@ public class StockTickerScenes { scene.overlay() .showText(80) - .text("Simply hand the printed clipboard it generated to the keeper") + .text("Simply hand the printed clipboard it generated to the Stock keeper") .colored(PonderPalette.BLUE) .placeNearTarget() .pointAt(keeper); @@ -454,7 +454,7 @@ public class StockTickerScenes { scene.overlay() .showText(90) - .text("When requesting items, a target address can be set in the order") + .text("When ordering items, a target address can be set in the request") .attachKeyFrame() .placeNearTarget() .pointAt(util.vector() From 6a03d1ad61c895fe0d72bd2fb2193026025085cd Mon Sep 17 00:00:00 2001 From: IThundxr Date: Mon, 20 Jan 2025 09:31:35 -0500 Subject: [PATCH 338/515] Typos all around --- changelog.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/changelog.md b/changelog.md index 1a220b8f48..6dda60e1d8 100644 --- a/changelog.md +++ b/changelog.md @@ -5,7 +5,8 @@ Additions - Example Changes -- Bumped the defalt max rope length to 384 + +- Bumped the default max rope length to 384 - Set vault capacity limit to 2048 slots to prevent people from OOM-ing themselves if they set the capacity too high Bug Fixes From f98a8f7efb6b62ca23f2be6cc00729490e91111b Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Mon, 20 Jan 2025 18:05:52 +0100 Subject: [PATCH 339/515] Ambient confusion - Stock link antennas no longer shade - Chain conveyor casing is now rendered through flywheel - Tweaks to copper roof connectivity - Requesters now use the wifi particle when successful --- .../com/simibubi/create/AllPartialModels.java | 3 +- .../decoration/RoofBlockCTBehaviour.java | 6 +- .../chainConveyor/ChainConveyorRenderer.java | 11 +- .../chainConveyor/ChainConveyorVisual.java | 9 + .../RedstoneRequesterBlockEntity.java | 3 +- .../models/block/chain_conveyor/block.json | 130 +++++++++- .../block/chain_conveyor/conveyor_casing.mtl | 7 + .../block/chain_conveyor/conveyor_wheel.mtl | 6 + .../block/chain_conveyor/conveyor_wheel.obj | 237 ++++++++++++++++++ .../models/block/chain_conveyor/wheel.json | 6 + .../block/stock_link/block_horizontal.json | 6 +- .../stock_link/block_horizontal_powered.json | 6 +- .../block/stock_link/block_vertical.json | 6 +- .../stock_link/block_vertical_powered.json | 6 +- .../create/textures/block/conveyor_casing.png | Bin 1704 -> 1026 bytes 15 files changed, 423 insertions(+), 19 deletions(-) create mode 100644 src/main/resources/assets/create/models/block/chain_conveyor/conveyor_wheel.mtl create mode 100644 src/main/resources/assets/create/models/block/chain_conveyor/conveyor_wheel.obj create mode 100644 src/main/resources/assets/create/models/block/chain_conveyor/wheel.json diff --git a/src/main/java/com/simibubi/create/AllPartialModels.java b/src/main/java/com/simibubi/create/AllPartialModels.java index 7f857aec5d..a803bb378d 100644 --- a/src/main/java/com/simibubi/create/AllPartialModels.java +++ b/src/main/java/com/simibubi/create/AllPartialModels.java @@ -126,7 +126,8 @@ public class AllPartialModels { EJECTOR_TOP = block("weighted_ejector/top"), - CHAIN_CONVEYOR_GUARD = block("chain_conveyor/guard"), CHAIN_CONVEYOR_SHAFT = block("chain_conveyor/shaft"), + CHAIN_CONVEYOR_WHEEL = block("chain_conveyor/wheel"), CHAIN_CONVEYOR_GUARD = block("chain_conveyor/guard"), + CHAIN_CONVEYOR_SHAFT = block("chain_conveyor/shaft"), FROGPORT_BODY = block("package_frogport/body"), FROGPORT_HEAD = block("package_frogport/head"), FROGPORT_TONGUE = block("package_frogport/tongue"), diff --git a/src/main/java/com/simibubi/create/content/decoration/RoofBlockCTBehaviour.java b/src/main/java/com/simibubi/create/content/decoration/RoofBlockCTBehaviour.java index 6049a1d32f..bd9b39a347 100644 --- a/src/main/java/com/simibubi/create/content/decoration/RoofBlockCTBehaviour.java +++ b/src/main/java/com/simibubi/create/content/decoration/RoofBlockCTBehaviour.java @@ -15,6 +15,7 @@ import net.minecraft.core.Direction.Axis; import net.minecraft.util.Mth; import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.block.SlabBlock; +import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.StairBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.Half; @@ -110,8 +111,9 @@ public class RoofBlockCTBehaviour extends ConnectedTextureBehaviour.Base { protected boolean connects(BlockAndTintGetter reader, BlockPos pos, BlockState state, BlockState other) { double top = state.getCollisionShape(reader, pos) .max(Axis.Y); - double topOther = other.getCollisionShape(reader, pos) - .max(Axis.Y); + double topOther = other.getSoundType() != SoundType.COPPER ? 0 + : other.getCollisionShape(reader, pos) + .max(Axis.Y); return Mth.equal(top, topOther); } diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRenderer.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRenderer.java index e6cb998284..afff699b51 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRenderer.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRenderer.java @@ -3,7 +3,6 @@ package com.simibubi.create.content.kinetics.chainConveyor; import java.util.List; import java.util.Map.Entry; -import net.createmod.catnip.animation.AnimationTickHolder; import org.joml.Matrix3f; import org.joml.Matrix4f; @@ -18,10 +17,11 @@ import com.simibubi.create.foundation.render.RenderTypes; import dev.engine_room.flywheel.api.visualization.VisualizationManager; import dev.engine_room.flywheel.lib.transform.TransformStack; +import net.createmod.catnip.animation.AnimationTickHolder; +import net.createmod.catnip.math.AngleHelper; +import net.createmod.catnip.math.VecHelper; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; -import net.createmod.catnip.math.VecHelper; -import net.createmod.catnip.math.AngleHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.MultiBufferSource; @@ -58,6 +58,11 @@ public class ChainConveyorRenderer extends KineticBlockEntityRenderer> entry : be.travellingPackages.entrySet()) diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorVisual.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorVisual.java index cbced260bf..aa9b7e9521 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorVisual.java @@ -147,8 +147,17 @@ public class ChainConveyorVisual extends SingleAxisRotatingVisualpg3WD^i zqD&;kM4A$Ies zvJDxT7zBWH6cA^&vw+33fNT)Zmt8W1Z*E;Y?YihDz+_vVmlmE}Jwyz^!>~fDVox*As(yx#+ zQA+Pu^ChR#ky5wAJPvQt_xIrkVazg*-Hk-3`Y1xboZ4CPu7ZkP?e*At~ zaLpGv2A;c97=9MfRCT+vuAoP>@MuW4KsswL%RF(A>$X|9ten{n@0-ziR%^s-u9OpPIi?XYiF>|Imw<)J zKh}b+9~u=~lxExL3Z2*0e!_H~hn4TmTfbksq+O#JcXXMX*ZwcO;s4HT(vd^kJv4rQ zGvm4bI&VkreO3v3Up1A3AN3v`KmXD8Sp4H3zmw&RKiBqoUcA3~d47p#h{GGp>RS@8 jnT(dL5G)h#JN|*)W`$AW$54qipakOS>gTe~DWM4fdo^3r delta 1699 zcmV;U23+}q2&fH^8Gi-<0047(dh`GQ00v@9M??S_02Tlgmcm6d00009a7bBm000XT z000XT0n*)m`~Uy|2XskIMF;2x1Q#qft^_LV000IxNklm<>BtVnvu1{P7espy>rjKXTINazUSu7 zU%W5{D3=`o%wmyvFi`)}%wiEh&2_s0X-oU3*B!K{^w&?F{wlSn>Nu`L;0N@B5Zfuy z4?=o=Pi?a7E`MV?B>=UywbKOnzx;E+^w+=p4S)I7&sb!6E1wyUq7eWu{pb=ueEluX zo%#|0uBjd9llGJE_Pkgi0MHLY@>U+huy76V6L1aTXqg27qId{^Z$S8oPd^9&_~4${ z=m+1~5O5n}eVh!5;vtq1RBNjgUHaK?W^CaVv!%U5oygmn=1pIc0Ys?OpftW^t z3gG!6eu65o^A|5Xk`BE2+yOcu7bQtV)v>4@vH=*5bC^bff!F`G{)~XI@&uL2igNJ0JvE+x?s}gn2&2Ic zYc*HVhwhtp1*j3a@kSY`KaCS&9~m5arYkisSuW+Kgt{=zcPwN0FryT&N2(+ ztvq_U>~QqUPxH*lXCJGZeRS(Xkq16X^M8lq+)O>4St-kTX{}CQiId*#25fzNo2`#; zKNbQ2-5?+zjj*bPjDV%pPyWlG=4DqxZU_)rUm=) zghspjP#NZf2=;r;sO5_)kQ@Ku=RXx+x-U)ff&wsgF>mT{^xLljaQL|wAE}Iw&wrJ1 z)D5tt5<0HHW_`7UZR+&nG1DpZBLS&x6|jpMQ9QviHSV`VDwP!)Tig6+^CJ!tvc}eS zO31bs3YiWl$rReS#CxqGZn=z85hb=4hIow*XOB#nPA4RziIU>AS`E`Q#4nXUGGF32 z!88rxIH4N^43Y%T^LYQC{}KV1#eX9GAXLy_zoTIo2Ai9kJZQH8SglssSYPM*orG^~ zOfd2qJ->%(im(03$&;!|Wd6uDpQ)%@x5RujyL0IAV1VtEh{q5oW889?&CN~jH)s7` zKA$*og8twh$!LP-?GeWb<+8)FyUeve{h9V|Qy}LGQ;~5EE|<%2X*(r_oP<4{gnwSABPuPP-D+hp z>Q-#(;Q4(t4aWPygahd?VLZ+OLq?Mc1$~wS5`pSko%U{XA#&9<(L*F<{U}nw=u)3g zU&vla=Jk7C=hHOw{2u3CdHHjND2>3?cdrWJec`1Sr)9@c7tlqQ()l@QyR8 tspM8lvP4J9a~vo9w;ZvJZCM#9{tQ!8qROa9Z)N}h002ovPDHLkV1mEVK*0b2 From 153c63f1c8a85a00b9e4c1858f5fc27d75badd3d Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Sun, 19 Jan 2025 14:58:51 -0600 Subject: [PATCH 340/515] Package deal - Add package entity visual - Add packager visual - Don't render the box model in the visual because it relies on item transforms - Bump flywheel build - Upgrade to some of the newer Affine functions where applicable --- gradle.properties | 2 +- .../simibubi/create/AllBlockEntityTypes.java | 3 + .../com/simibubi/create/AllEntityTypes.java | 5 +- .../logistics/box/PackageRenderer.java | 12 ++- .../content/logistics/box/PackageVisual.java | 69 ++++++++++++ .../logistics/packager/PackagerRenderer.java | 60 +++++++---- .../logistics/packager/PackagerVisual.java | 102 ++++++++++++++++++ 7 files changed, 223 insertions(+), 30 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/logistics/box/PackageVisual.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/packager/PackagerVisual.java diff --git a/gradle.properties b/gradle.properties index c7781bb2f5..3ab81a692c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -22,7 +22,7 @@ use_parchment = true # dependency versions registrate_version = MC1.20-1.3.3 flywheel_minecraft_version = 1.20.1 -flywheel_version = 1.0.0-beta-182 +flywheel_version = 1.0.0-beta-184 jei_minecraft_version = 1.20.1 jei_version = 15.10.0.39 curios_minecraft_version = 1.20.1 diff --git a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java index 227b2a5684..574b5223ef 100644 --- a/src/main/java/com/simibubi/create/AllBlockEntityTypes.java +++ b/src/main/java/com/simibubi/create/AllBlockEntityTypes.java @@ -174,6 +174,7 @@ import com.simibubi.create.content.logistics.packagePort.postbox.PostboxBlockEnt import com.simibubi.create.content.logistics.packagePort.postbox.PostboxRenderer; import com.simibubi.create.content.logistics.packager.PackagerBlockEntity; import com.simibubi.create.content.logistics.packager.PackagerRenderer; +import com.simibubi.create.content.logistics.packager.PackagerVisual; import com.simibubi.create.content.logistics.packager.repackager.RepackagerBlockEntity; import com.simibubi.create.content.logistics.packagerLink.PackagerLinkBlockEntity; import com.simibubi.create.content.logistics.redstoneRequester.RedstoneRequesterBlockEntity; @@ -497,12 +498,14 @@ public class AllBlockEntityTypes { public static final BlockEntityEntry PACKAGER = REGISTRATE .blockEntity("packager", PackagerBlockEntity::new) + .visual(() -> PackagerVisual::new, true) .validBlocks(AllBlocks.PACKAGER) .renderer(() -> PackagerRenderer::new) .register(); public static final BlockEntityEntry REPACKAGER = REGISTRATE .blockEntity("repackager", RepackagerBlockEntity::new) + .visual(() -> PackagerVisual::new, true) .validBlocks(AllBlocks.REPACKAGER) .renderer(() -> PackagerRenderer::new) .register(); diff --git a/src/main/java/com/simibubi/create/AllEntityTypes.java b/src/main/java/com/simibubi/create/AllEntityTypes.java index 5e5a08622a..2c04ea664f 100644 --- a/src/main/java/com/simibubi/create/AllEntityTypes.java +++ b/src/main/java/com/simibubi/create/AllEntityTypes.java @@ -16,6 +16,7 @@ import com.simibubi.create.content.equipment.potatoCannon.PotatoProjectileEntity import com.simibubi.create.content.equipment.potatoCannon.PotatoProjectileRenderer; import com.simibubi.create.content.logistics.box.PackageEntity; import com.simibubi.create.content.logistics.box.PackageRenderer; +import com.simibubi.create.content.logistics.box.PackageVisual; import com.simibubi.create.content.trains.entity.CarriageContraptionEntity; import com.simibubi.create.content.trains.entity.CarriageContraptionEntityRenderer; import com.simibubi.create.content.trains.entity.CarriageContraptionVisual; @@ -71,7 +72,9 @@ public class AllEntityTypes { MobCategory.MISC, 5, Integer.MAX_VALUE, false, true, SeatEntity::build).register(); public static final EntityEntry PACKAGE = register("package", PackageEntity::new, () -> PackageRenderer::new, - MobCategory.MISC, 10, 3, true, false, PackageEntity::build).register(); + MobCategory.MISC, 10, 3, true, false, PackageEntity::build) + .visual(() -> PackageVisual::new, true) + .register(); // diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageRenderer.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageRenderer.java index e7717eb6d6..f786bf1f70 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageRenderer.java @@ -4,6 +4,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllPartialModels; +import dev.engine_room.flywheel.api.backend.BackendManager; import dev.engine_room.flywheel.lib.model.baked.PartialModel; import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.render.SuperByteBuffer; @@ -28,11 +29,12 @@ public class PackageRenderer extends EntityRenderer { @Override public void render(PackageEntity entity, float yaw, float pt, PoseStack ms, MultiBufferSource buffer, int light) { - ItemStack box = entity.box; - if (box.isEmpty() || !PackageItem.isPackage(box)) - box = AllBlocks.CARDBOARD_BLOCK.asStack(); - PartialModel model = AllPartialModels.PACKAGES.get(ForgeRegistries.ITEMS.getKey(box.getItem())); - renderBox(entity, yaw, ms, buffer, light, model); + if (!BackendManager.isBackendOn()) { + ItemStack box = entity.box; + if (box.isEmpty() || !PackageItem.isPackage(box)) box = AllBlocks.CARDBOARD_BLOCK.asStack(); + PartialModel model = AllPartialModels.PACKAGES.get(ForgeRegistries.ITEMS.getKey(box.getItem())); + renderBox(entity, yaw, ms, buffer, light, model); + } super.render(entity, yaw, pt, ms, buffer, light); } diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageVisual.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageVisual.java new file mode 100644 index 0000000000..2c44d9bcd8 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageVisual.java @@ -0,0 +1,69 @@ +package com.simibubi.create.content.logistics.box; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllPartialModels; + +import dev.engine_room.flywheel.api.visualization.VisualizationContext; +import dev.engine_room.flywheel.lib.instance.InstanceTypes; +import dev.engine_room.flywheel.lib.instance.TransformedInstance; +import dev.engine_room.flywheel.lib.model.Models; +import dev.engine_room.flywheel.lib.model.baked.PartialModel; +import dev.engine_room.flywheel.lib.transform.Translate; +import dev.engine_room.flywheel.lib.visual.AbstractEntityVisual; +import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; +import net.minecraft.util.Mth; +import net.minecraft.world.item.ItemStack; + +import net.minecraft.world.phys.Vec3; + +import net.minecraftforge.registries.ForgeRegistries; + +public class PackageVisual extends AbstractEntityVisual implements SimpleDynamicVisual { + public final TransformedInstance instance; + + public PackageVisual(VisualizationContext ctx, PackageEntity entity, float partialTick) { + super(ctx, entity, partialTick); + + ItemStack box = entity.box; + if (box.isEmpty() || !PackageItem.isPackage(box)) + box = AllBlocks.CARDBOARD_BLOCK.asStack(); + PartialModel model = AllPartialModels.PACKAGES.get(ForgeRegistries.ITEMS.getKey(box.getItem())); + + instance = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(model)) + .createInstance(); + + animate(partialTick); + } + + @Override + public void beginFrame(Context ctx) { + animate(ctx.partialTick()); + } + + private void animate(float partialTick) { + float yaw = Mth.lerp(partialTick, entity.yRotO, entity.getYRot()); + + Vec3 pos = PackageVisual.this.entity.position(); + var renderOrigin = renderOrigin(); + var x = (float) (Mth.lerp(partialTick, this.entity.xo, pos.x) - renderOrigin.getX()); + var y = (float) (Mth.lerp(partialTick, this.entity.yo, pos.y) - renderOrigin.getY()); + var z = (float) (Mth.lerp(partialTick, this.entity.zo, pos.z) - renderOrigin.getZ()); + + long randomBits = (long) entity.getId() * 31L * 493286711L; + randomBits = randomBits * randomBits * 4392167121L + randomBits * 98761L; + float xNudge = (((float) (randomBits >> 16 & 7L) + 0.5F) / 8.0F - 0.5F) * 0.004F; + float yNudge = (((float) (randomBits >> 20 & 7L) + 0.5F) / 8.0F - 0.5F) * 0.004F; + float zNudge = (((float) (randomBits >> 24 & 7L) + 0.5F) / 8.0F - 0.5F) * 0.004F; + + instance.setIdentityTransform() + .translate(x - 0.5 + xNudge, y + yNudge, z - 0.5 + zNudge) + .rotateYCenteredDegrees(yaw) + .light(computePackedLight(partialTick)) + .setChanged(); + } + + @Override + protected void _delete() { + instance.delete(); + } +} diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerRenderer.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerRenderer.java index 60a74a558d..491c9db3dc 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerRenderer.java @@ -5,6 +5,8 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.AllPartialModels; import com.simibubi.create.foundation.blockEntity.renderer.SmartBlockEntityRenderer; +import dev.engine_room.flywheel.api.backend.BackendManager; +import dev.engine_room.flywheel.api.model.Model; import dev.engine_room.flywheel.lib.model.baked.PartialModel; import dev.engine_room.flywheel.lib.transform.TransformStack; import net.createmod.catnip.render.CachedBuffers; @@ -33,36 +35,35 @@ public class PackagerRenderer extends SmartBlockEntityRenderer (be.animationInward ? 1 : 5) - && be.animationTicks < PackagerBlockEntity.CYCLE - (be.animationInward ? 5 : 1); BlockState blockState = be.getBlockState(); Direction facing = blockState.getValue(PackagerBlock.FACING) .getOpposite(); - PartialModel hatchModel = - hatchOpen ? AllPartialModels.PACKAGER_HATCH_OPEN : AllPartialModels.PACKAGER_HATCH_CLOSED; + if (!BackendManager.isBackendOn()) { + var hatchModel = getHatchModel(be); - SuperByteBuffer sbb = CachedBuffers.partial(hatchModel, blockState); - sbb.translate(Vec3.atLowerCornerOf(facing.getNormal()) - .scale(.49999f)) - .rotateCentered(AngleHelper.rad(AngleHelper.horizontalAngle(facing)), Direction.UP) - .rotateCentered(AngleHelper.rad(AngleHelper.verticalAngle(facing)), Direction.EAST) - .light(light) - .renderInto(ms, buffer.getBuffer(RenderType.solid())); + SuperByteBuffer sbb = CachedBuffers.partial(hatchModel, blockState); + sbb.translate(Vec3.atLowerCornerOf(facing.getNormal()) + .scale(.49999f)) + .rotateYCenteredDegrees(AngleHelper.horizontalAngle(facing)) + .rotateXCenteredDegrees(AngleHelper.verticalAngle(facing)) + .light(light) + .renderInto(ms, buffer.getBuffer(RenderType.solid())); - ms.pushPose(); - var msr = TransformStack.of(ms); - msr.translate(Vec3.atLowerCornerOf(facing.getNormal()) - .scale(trayOffset)); - - sbb = CachedBuffers.partial(AllBlocks.PACKAGER.has(blockState) ? AllPartialModels.PACKAGER_TRAY_REGULAR - : AllPartialModels.PACKAGER_TRAY_DEFRAG, blockState); - sbb.rotateCentered(AngleHelper.rad(facing.toYRot()), Direction.UP) - .light(light) - .renderInto(ms, buffer.getBuffer(RenderType.cutoutMipped())); + sbb = CachedBuffers.partial(getTrayModel(blockState), blockState); + sbb.translate(Vec3.atLowerCornerOf(facing.getNormal()) + .scale(trayOffset)) + .rotateYCenteredDegrees(facing.toYRot()) + .light(light) + .renderInto(ms, buffer.getBuffer(RenderType.cutoutMipped())); + } if (!renderedBox.isEmpty()) { - msr.translate(.5f, .5f, .5f) + ms.pushPose(); + var msr = TransformStack.of(ms); + msr.translate(Vec3.atLowerCornerOf(facing.getNormal()) + .scale(trayOffset)) + .translate(.5f, .5f, .5f) .rotateYDegrees(facing.toYRot()) .translate(0, 2 / 16f, 0) .scale(1.49f, 1.49f, 1.49f); @@ -70,9 +71,22 @@ public class PackagerRenderer extends SmartBlockEntityRenderer (be.animationInward ? 1 : 5) + && be.animationTicks < PackagerBlockEntity.CYCLE - (be.animationInward ? 5 : 1); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerVisual.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerVisual.java new file mode 100644 index 0000000000..e7e909d389 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerVisual.java @@ -0,0 +1,102 @@ +package com.simibubi.create.content.logistics.packager; + +import java.util.function.Consumer; + +import org.jetbrains.annotations.Nullable; + +import dev.engine_room.flywheel.api.instance.Instance; +import dev.engine_room.flywheel.api.visualization.VisualizationContext; +import dev.engine_room.flywheel.lib.instance.InstanceTypes; +import dev.engine_room.flywheel.lib.instance.TransformedInstance; +import dev.engine_room.flywheel.lib.model.Models; +import dev.engine_room.flywheel.lib.model.baked.PartialModel; +import dev.engine_room.flywheel.lib.visual.AbstractBlockEntityVisual; +import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; +import net.createmod.catnip.math.AngleHelper; +import net.minecraft.core.Direction; +import net.minecraft.world.phys.Vec3; + +public class PackagerVisual extends AbstractBlockEntityVisual implements SimpleDynamicVisual { + public final TransformedInstance hatch; + public final TransformedInstance tray; + + public float lastTrayOffset = Float.NaN; + public PartialModel lastHatchPartial; + + + public PackagerVisual(VisualizationContext ctx, T blockEntity, float partialTick) { + super(ctx, blockEntity, partialTick); + + lastHatchPartial = PackagerRenderer.getHatchModel(blockEntity); + hatch = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(lastHatchPartial)) + .createInstance(); + + tray = instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(PackagerRenderer.getTrayModel(blockState))) + .createInstance(); + + Direction facing = blockState.getValue(PackagerBlock.FACING) + .getOpposite(); + + var lowerCorner = Vec3.atLowerCornerOf(facing.getNormal()); + hatch.setIdentityTransform() + .translate(getVisualPosition()) + .translate(lowerCorner + .scale(.49999f)) + .rotateYCenteredDegrees(AngleHelper.horizontalAngle(facing)) + .rotateXCenteredDegrees(AngleHelper.verticalAngle(facing)) + .setChanged(); + + // TODO: I think we need proper ItemVisuals to handle rendering the boxes in here + + animate(partialTick); + } + + @Override + public void beginFrame(Context ctx) { + animate(ctx.partialTick()); + } + + public void animate(float partialTick) { + var hatchPartial = PackagerRenderer.getHatchModel(blockEntity); + + if (hatchPartial != this.lastHatchPartial) { + instancerProvider().instancer(InstanceTypes.TRANSFORMED, Models.partial(hatchPartial)) + .stealInstance(hatch); + + this.lastHatchPartial = hatchPartial; + } + + float trayOffset = blockEntity.getTrayOffset(partialTick); + + if (trayOffset != lastTrayOffset) { + Direction facing = blockState.getValue(PackagerBlock.FACING) + .getOpposite(); + + var lowerCorner = Vec3.atLowerCornerOf(facing.getNormal()); + + tray.setIdentityTransform() + .translate(getVisualPosition()) + .translate(lowerCorner.scale(trayOffset)) + .rotateYCenteredDegrees(facing.toYRot()) + .setChanged(); + + lastTrayOffset = trayOffset; + } + } + + @Override + public void updateLight(float partialTick) { + relight(hatch, tray); + } + + @Override + protected void _delete() { + hatch.delete(); + tray.delete(); + } + + @Override + public void collectCrumblingInstances(Consumer<@Nullable Instance> consumer) { + + } +} From ddb56e38155336ecc58299fed8832d2c8bac8b8b Mon Sep 17 00:00:00 2001 From: IThundxr Date: Mon, 20 Jan 2025 15:50:20 -0500 Subject: [PATCH 341/515] NBA Superstar - Fix throwing packages in creative taking away the package --- .../simibubi/create/content/logistics/box/PackageItem.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java index f3326b2f85..bfb13bbe2c 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageItem.java @@ -366,11 +366,8 @@ public class PackageItem extends Item { SoundSource.NEUTRAL, 0.5F, 0.5F); ItemStack copy = stack.copy(); - stack.shrink(1); - - if (stack.isEmpty()) - player.getInventory() - .removeItem(stack); + if (!player.getAbilities().instabuild) + stack.shrink(1); Vec3 vec = new Vec3(entity.getX(), entity.getY() + entity.getBoundingBox() .getYsize() / 2f, entity.getZ()); From 547709c2e04cf89349193bf952603aea95efac73 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Tue, 21 Jan 2025 17:17:04 +0100 Subject: [PATCH 342/515] The last arrow bender - Factory gauges try to default to an arrow direction that doesn't clip into blocks --- gradle.properties | 2 +- .../factoryBoard/FactoryPanelBlock.java | 7 +- .../factoryBoard/FactoryPanelConnection.java | 119 +++++++++++------- .../factoryBoard/FactoryPanelRenderer.java | 2 +- 4 files changed, 84 insertions(+), 46 deletions(-) diff --git a/gradle.properties b/gradle.properties index 3ab81a692c..fd696388f0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -27,7 +27,7 @@ jei_minecraft_version = 1.20.1 jei_version = 15.10.0.39 curios_minecraft_version = 1.20.1 curios_version = 5.3.1 -ponder_version = 0.9.18 +ponder_version = 0.9.19 mixin_extras_version = 0.4.1 cc_tweaked_enable = true diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java index 73efb3a4e3..7004556103 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlock.java @@ -15,8 +15,8 @@ import com.simibubi.create.foundation.block.IBE; import com.simibubi.create.foundation.block.ProperWaterloggedBlock; import com.simibubi.create.foundation.utility.CreateLang; -import net.createmod.catnip.math.VecHelper; import net.createmod.catnip.math.AngleHelper; +import net.createmod.catnip.math.VecHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -48,6 +48,7 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.EntityCollisionContext; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraftforge.common.ForgeMod; @@ -147,7 +148,7 @@ public class FactoryPanelBlock extends FaceAttachedHorizontalDirectionalBlock Player player = context.getPlayer(); PanelSlot slot = getTargetedSlot(pos, state, context.getClickLocation()); - if (!(world instanceof ServerLevel serverLevel)) + if (!(world instanceof ServerLevel)) return InteractionResult.SUCCESS; return onBlockEntityUse(world, pos, be -> { @@ -294,6 +295,8 @@ public class FactoryPanelBlock extends FaceAttachedHorizontalDirectionalBlock @Override public VoxelShape getCollisionShape(BlockState pState, BlockGetter pLevel, BlockPos pPos, CollisionContext pContext) { + if (pContext instanceof EntityCollisionContext ecc && ecc.getEntity() == null) + return getShape(pState, pLevel, pPos, pContext); return Shapes.empty(); } diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnection.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnection.java index d90c375fa2..faf48616c9 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnection.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelConnection.java @@ -10,7 +10,9 @@ import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; import net.minecraft.nbt.CompoundTag; import net.minecraft.util.Mth; +import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; public class FactoryPanelConnection { @@ -49,58 +51,91 @@ public class FactoryPanelConnection { return nbt; } - public List getPath(BlockState state, FactoryPanelPosition to) { + public List getPath(Level level, BlockState state, FactoryPanelPosition to) { if (!path.isEmpty() && arrowBendModeCurrentPathUses == arrowBendMode) return path; + boolean findSuitable = arrowBendMode == -1; arrowBendModeCurrentPathUses = arrowBendMode; - path.clear(); - Vec3 diff = calculatePathDiff(state, to); - BlockPos toTravelFirst = BlockPos.ZERO; - BlockPos toTravelLast = BlockPos.containing(diff.scale(2) - .add(0.1, 0.1, 0.1)); + FactoryPanelBehaviour fromBehaviour = FactoryPanelBehaviour.at(level, to); + final Vec3 diff = calculatePathDiff(state, to); + final Vec3 start = fromBehaviour != null ? fromBehaviour.getSlotPositioning() + .getLocalOffset(level, to.pos(), state) + .add(Vec3.atLowerCornerOf(to.pos())) : Vec3.ZERO; + final float xRot = Mth.RAD_TO_DEG * FactoryPanelBlock.getXRot(state); + final float yRot = Mth.RAD_TO_DEG * FactoryPanelBlock.getYRot(state); - if (arrowBendMode > 1) { - boolean flipX = diff.x > 0 ^ (arrowBendMode % 2 == 1); - boolean flipZ = diff.z > 0 ^ (arrowBendMode % 2 == 0); - int ceilX = Mth.positiveCeilDiv(toTravelLast.getX(), 2); - int ceilZ = Mth.positiveCeilDiv(toTravelLast.getZ(), 2); - int floorZ = Mth.floorDiv(toTravelLast.getZ(), 2); - int floorX = Mth.floorDiv(toTravelLast.getX(), 2); - toTravelFirst = new BlockPos(flipX ? floorX : ceilX, 0, flipZ ? floorZ : ceilZ); - toTravelLast = new BlockPos(!flipX ? floorX : ceilX, 0, !flipZ ? floorZ : ceilZ); - } + // When mode is not locked, find one that doesnt intersect with other gauges + ModeFinder: for (int actualMode = 0; actualMode <= 4; actualMode++) { + path.clear(); + if (!findSuitable && actualMode != arrowBendMode) + continue; + boolean desperateOption = actualMode == 4; - Direction lastDirection = null; - Direction currentDirection = null; + BlockPos toTravelFirst = BlockPos.ZERO; + BlockPos toTravelLast = BlockPos.containing(diff.scale(2) + .add(0.1, 0.1, 0.1)); - for (BlockPos toTravel : List.of(toTravelFirst, toTravelLast)) { - boolean zIsPreferred = - arrowBendMode == -1 ? (Math.abs(toTravel.getZ()) > Math.abs(toTravel.getX())) : arrowBendMode % 2 == 1; - List directionOrder = - zIsPreferred ? List.of(Direction.SOUTH, Direction.NORTH, Direction.WEST, Direction.EAST) - : List.of(Direction.WEST, Direction.EAST, Direction.SOUTH, Direction.NORTH); - - for (int i = 0; i < 100; i++) { - if (toTravel.equals(BlockPos.ZERO)) - break; - - for (Direction d : directionOrder) { - if (lastDirection != null && d == lastDirection.getOpposite()) - continue; - if (currentDirection == null || toTravel.relative(d) - .distManhattan(BlockPos.ZERO) < toTravel.relative(currentDirection) - .distManhattan(BlockPos.ZERO)) - currentDirection = d; - } - - lastDirection = currentDirection; - toTravel = toTravel.relative(currentDirection); - path.add(currentDirection); + if (actualMode > 1) { + boolean flipX = diff.x > 0 ^ (actualMode % 2 == 1); + boolean flipZ = diff.z > 0 ^ (actualMode % 2 == 0); + int ceilX = Mth.positiveCeilDiv(toTravelLast.getX(), 2); + int ceilZ = Mth.positiveCeilDiv(toTravelLast.getZ(), 2); + int floorZ = Mth.floorDiv(toTravelLast.getZ(), 2); + int floorX = Mth.floorDiv(toTravelLast.getX(), 2); + toTravelFirst = new BlockPos(flipX ? floorX : ceilX, 0, flipZ ? floorZ : ceilZ); + toTravelLast = new BlockPos(!flipX ? floorX : ceilX, 0, !flipZ ? floorZ : ceilZ); } - } + Direction lastDirection = null; + Direction currentDirection = null; + + for (BlockPos toTravel : List.of(toTravelFirst, toTravelLast)) { + boolean zIsFarther = Math.abs(toTravel.getZ()) > Math.abs(toTravel.getX()); + boolean zIsPreferred = desperateOption ? zIsFarther : actualMode % 2 == 1; + List directionOrder = + zIsPreferred ? List.of(Direction.SOUTH, Direction.NORTH, Direction.WEST, Direction.EAST) + : List.of(Direction.WEST, Direction.EAST, Direction.SOUTH, Direction.NORTH); + + for (int i = 0; i < 100; i++) { + if (toTravel.equals(BlockPos.ZERO)) + break; + + for (Direction d : directionOrder) { + if (lastDirection != null && d == lastDirection.getOpposite()) + continue; + if (currentDirection == null || toTravel.relative(d) + .distManhattan(BlockPos.ZERO) < toTravel.relative(currentDirection) + .distManhattan(BlockPos.ZERO)) + currentDirection = d; + } + + lastDirection = currentDirection; + toTravel = toTravel.relative(currentDirection); + path.add(currentDirection); + } + } + + if (findSuitable && !desperateOption) { + BlockPos travelled = BlockPos.ZERO; + for (int i = 0; i < path.size() - 1; i++) { + Direction d = path.get(i); + travelled = travelled.relative(d); + Vec3 testOffset = Vec3.atLowerCornerOf(travelled) + .scale(0.5); + testOffset = VecHelper.rotate(testOffset, 180, Axis.Y); + testOffset = VecHelper.rotate(testOffset, xRot + 90, Axis.X); + testOffset = VecHelper.rotate(testOffset, yRot, Axis.Y); + Vec3 v = start.add(testOffset); + if (!level.noCollision(new AABB(v, v).inflate(1 / 128f))) + continue ModeFinder; + } + } + + break; + } + return path; } diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelRenderer.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelRenderer.java index f9b109431f..951481cb88 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelRenderer.java @@ -86,7 +86,7 @@ public class FactoryPanelRenderer extends SmartBlockEntityRenderer path = connection.getPath(blockState, behaviour.getPanelPosition()); + List path = connection.getPath(behaviour.getWorld(), blockState, behaviour.getPanelPosition()); float xRot = FactoryPanelBlock.getXRot(blockState) + Mth.PI / 2; float yRot = FactoryPanelBlock.getYRot(blockState); From 71509d5792419acdc9f8b74c90e64a5d4df6c177 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Tue, 21 Jan 2025 11:35:32 -0500 Subject: [PATCH 343/515] An odd looking wrench - Implemented #create:chain_rideable to mark items as valid for riding a chain with --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 751 +++++++++--------- .../create/tags/items/chain_rideable.json | 5 + .../java/com/simibubi/create/AllTags.java | 2 + .../ChainConveyorRidingHandler.java | 2 +- .../data/CreateRegistrateTags.java | 7 +- 5 files changed, 390 insertions(+), 377 deletions(-) create mode 100644 src/generated/resources/data/create/tags/items/chain_rideable.json diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index cde0ce3d8c..ab0b5cd762 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2025-01-20T15:09:32.7206817 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2025-01-21T11:34:55.158385 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -83,13 +83,13 @@ b5170d754ce5f07ea2b4646eb07c099c50bae249 assets/create/blockstates/clipboard.jso f7254f20f91e2f1295e36d2e70390d43f3952d07 assets/create/blockstates/copper_door.json 736777de0eb038ff1ef9e8fe9d04c23d80239eda assets/create/blockstates/copper_ladder.json df3103dfc1c3ba7a9573229d009cb0de4925df16 assets/create/blockstates/copper_scaffolding.json -4d3d29e8a74bf103da39e76a1466b03eb5dcf916 assets/create/blockstates/copper_shingles.json 1ea8fdb990f8cda1762ab69ac38ea3161a835227 assets/create/blockstates/copper_shingle_slab.json 7c35bb802099d6bb5d92eafd8cbb7ea146979a2e assets/create/blockstates/copper_shingle_stairs.json +4d3d29e8a74bf103da39e76a1466b03eb5dcf916 assets/create/blockstates/copper_shingles.json 5c5ba06bf5b0a2c57d0aa42e85880f36d9694a78 assets/create/blockstates/copper_table_cloth.json -9a9f03140a57a7a8903d3e1b159bdc052566a6ec assets/create/blockstates/copper_tiles.json 7db7a0d81887091ca889f40bb8a508d3098c5164 assets/create/blockstates/copper_tile_slab.json c0b7eca017242913d156e4623147add0d03574f6 assets/create/blockstates/copper_tile_stairs.json +9a9f03140a57a7a8903d3e1b159bdc052566a6ec assets/create/blockstates/copper_tiles.json ef3ccb2d8b03f5a972b053a15bb037f8db6af17c assets/create/blockstates/copper_valve_handle.json 4758bed22fb6fe18213f463bc055775c1909e858 assets/create/blockstates/copycat_bars.json 4789c857508452aede1cb7389187b99ce2d7bf62 assets/create/blockstates/copycat_base.json @@ -106,114 +106,114 @@ c9a2c3a7971c46957d0f07c6d94d76f59da54a0b assets/create/blockstates/crushing_whee 4b0e51a1c10685f7d432467339afc9c2e24793b0 assets/create/blockstates/crushing_wheel_controller.json ba9c3ecfacbd398048440d247decffeaefc714b5 assets/create/blockstates/cuckoo_clock.json 1f6d84cba69062a1989d671c9c97317e2c2455b6 assets/create/blockstates/cut_andesite.json -cc62a6499ce8dcfc5e8695f0e8bb3c3d67f41efc assets/create/blockstates/cut_andesite_bricks.json 50d88f806122818af2ffecbd514d13ebbd21e4c9 assets/create/blockstates/cut_andesite_brick_slab.json 32d801225ea18209792921fa91618ed41794dbd0 assets/create/blockstates/cut_andesite_brick_stairs.json 3bf8204bf8c7c5b7b3c388fbc3478bb2d7c47129 assets/create/blockstates/cut_andesite_brick_wall.json +cc62a6499ce8dcfc5e8695f0e8bb3c3d67f41efc assets/create/blockstates/cut_andesite_bricks.json 34e89a828f14383c6115954a235b19851b74f277 assets/create/blockstates/cut_andesite_slab.json 49d58ae14544d89305ddc707cf7f6a81998200fa assets/create/blockstates/cut_andesite_stairs.json 1cc235cb6c388324793ac40f7bf89df8b048faac assets/create/blockstates/cut_andesite_wall.json 13ea54a4b9b89e576879a6e23a029c6341b7c098 assets/create/blockstates/cut_asurine.json -51c22c0547ab8ed2564890afb8733bbe356899f5 assets/create/blockstates/cut_asurine_bricks.json cf09de38f826fe000c5efe5afe56cf746125691d assets/create/blockstates/cut_asurine_brick_slab.json 1835482d5e9a59f2214336a63b12c7132ad815b4 assets/create/blockstates/cut_asurine_brick_stairs.json c48ab37bf7a2aba676af281d29cb6a2103c72fba assets/create/blockstates/cut_asurine_brick_wall.json +51c22c0547ab8ed2564890afb8733bbe356899f5 assets/create/blockstates/cut_asurine_bricks.json 1523a57124239a99da0b12a6b435c09d3d4276a5 assets/create/blockstates/cut_asurine_slab.json cc1acf5e118f1b1e78c5bb291176008960794d59 assets/create/blockstates/cut_asurine_stairs.json 139640bf41070e8eeb48647319eee54bb6804692 assets/create/blockstates/cut_asurine_wall.json 06b8c5cf98366608c480a37e6944d0d668bc8983 assets/create/blockstates/cut_calcite.json -979c70e35d806f1f63fe3381f27d881a17f9f6be assets/create/blockstates/cut_calcite_bricks.json a8f83cb8e1eae587f4e11e37c4cd3d0a1bbef377 assets/create/blockstates/cut_calcite_brick_slab.json 1eabb2e485aa323d317fa9648be02c12556593b7 assets/create/blockstates/cut_calcite_brick_stairs.json a0a33df71c5d26344a7bb0dd7a4622c30cc7825f assets/create/blockstates/cut_calcite_brick_wall.json +979c70e35d806f1f63fe3381f27d881a17f9f6be assets/create/blockstates/cut_calcite_bricks.json e3ddaae92b52cc3ea230088ff23260b5c5c93017 assets/create/blockstates/cut_calcite_slab.json 80c5249eaf9504c743c427fdd1a2c7bfa0f3d48f assets/create/blockstates/cut_calcite_stairs.json b4bbdb08d8114b6741546a0418cb54d645481c02 assets/create/blockstates/cut_calcite_wall.json 449f5180c72a028393afdac55a34e59862728224 assets/create/blockstates/cut_crimsite.json -25d731077a131d03347296c38c76b547194a6320 assets/create/blockstates/cut_crimsite_bricks.json d2c8a3580d3578c8afe44b94d4448be3680dbdeb assets/create/blockstates/cut_crimsite_brick_slab.json a3d9d2190a23b881dd3a7538ab248e0b0a3efa8e assets/create/blockstates/cut_crimsite_brick_stairs.json 3791c00ed477c0aaf7c5a20803a89dfc0e20f013 assets/create/blockstates/cut_crimsite_brick_wall.json +25d731077a131d03347296c38c76b547194a6320 assets/create/blockstates/cut_crimsite_bricks.json c9f19e7a976a7428b3dd58f45d734700ca1a18cd assets/create/blockstates/cut_crimsite_slab.json 1b8d4ac53dc5823083c2af605165a05b73c9ff79 assets/create/blockstates/cut_crimsite_stairs.json 484f9253ed92e963f398973a99fbeacb67ba1188 assets/create/blockstates/cut_crimsite_wall.json c4e95ceb7914da09ebe42d539bf5d976a3d70972 assets/create/blockstates/cut_deepslate.json -75d4ef863cd85d8f3df78226177966954e02ee2b assets/create/blockstates/cut_deepslate_bricks.json e1dc99a48b9066732fc5c62071c5ead16f34f438 assets/create/blockstates/cut_deepslate_brick_slab.json dbb2eddaf1d4ae3e687beb611552ea4283a1e7d8 assets/create/blockstates/cut_deepslate_brick_stairs.json 91c1f3da848503067c64b966ddda22ab91ff8fd5 assets/create/blockstates/cut_deepslate_brick_wall.json +75d4ef863cd85d8f3df78226177966954e02ee2b assets/create/blockstates/cut_deepslate_bricks.json 593198ffd37eae124a8366ae1d4a40b682788f92 assets/create/blockstates/cut_deepslate_slab.json f8cd1f9002ed8593ab71af9cfb7f962625994108 assets/create/blockstates/cut_deepslate_stairs.json c2d8060a0c830e5b8bbb084457083324b5b6f4c9 assets/create/blockstates/cut_deepslate_wall.json aaa6ac5f4fc399c4b03a7f8de856fa7aae97e049 assets/create/blockstates/cut_diorite.json -08b6289ca8b4193c87324ca23ca081e8773fb223 assets/create/blockstates/cut_diorite_bricks.json 423f809f06fa3fd96643f068ba0d3520269b3844 assets/create/blockstates/cut_diorite_brick_slab.json 9011fb92f57e7695c4484c923dd40ecd749ff307 assets/create/blockstates/cut_diorite_brick_stairs.json 41bad89777a33737bc0365ce2c7ffc20720f9620 assets/create/blockstates/cut_diorite_brick_wall.json +08b6289ca8b4193c87324ca23ca081e8773fb223 assets/create/blockstates/cut_diorite_bricks.json b03e7cf494c53c6f24ba93d0ef531e839026932b assets/create/blockstates/cut_diorite_slab.json 95c8094204979acfb0e59c2826003e0274a02fe5 assets/create/blockstates/cut_diorite_stairs.json e2f163d36dd5d03c0741dd2e87d8f77a0c86ae00 assets/create/blockstates/cut_diorite_wall.json f42ca2ce8e8f657c64376759413ec611f8045531 assets/create/blockstates/cut_dripstone.json -2d696162b2085c3d5723308a8d1ccafb29660f01 assets/create/blockstates/cut_dripstone_bricks.json 9310a800fb091014e7c0a220f5f2511c1de379ad assets/create/blockstates/cut_dripstone_brick_slab.json 3ff2f65dafcb4654b99e0d65b7e851760f9a4075 assets/create/blockstates/cut_dripstone_brick_stairs.json cafc956d8dc2053e5a0e8437c4ccde7fa24fc17e assets/create/blockstates/cut_dripstone_brick_wall.json +2d696162b2085c3d5723308a8d1ccafb29660f01 assets/create/blockstates/cut_dripstone_bricks.json 9cb32af3b952b841e9da94789da17cd274c3cfb9 assets/create/blockstates/cut_dripstone_slab.json da0300f54bdfcc705beb8d84f26406be660de5de assets/create/blockstates/cut_dripstone_stairs.json 83ff3eaeb481202c77e6dbdc442b4dd195ca568c assets/create/blockstates/cut_dripstone_wall.json bf501250fd2226838afe0baf68db08cd832e3c4f assets/create/blockstates/cut_granite.json -5c029d7ec837b3239d17ab91a70f025df1bfb124 assets/create/blockstates/cut_granite_bricks.json 773717bd5c140cf025f463c99c67efb9d27bd696 assets/create/blockstates/cut_granite_brick_slab.json 97d20b21e5b7f329c1b21b436fd0bdcaa8d173d0 assets/create/blockstates/cut_granite_brick_stairs.json 5e4175b6c89039ded48937ad1cd13d3bb2d2992a assets/create/blockstates/cut_granite_brick_wall.json +5c029d7ec837b3239d17ab91a70f025df1bfb124 assets/create/blockstates/cut_granite_bricks.json 42549436ce26ad7b44f2e1cba54357b3f25bcb18 assets/create/blockstates/cut_granite_slab.json e9d8fd028d8092e5fa0fd13cd638516f57a22d53 assets/create/blockstates/cut_granite_stairs.json 2daab523202dd2e31daeaf3b9a04cde2a7da4ca5 assets/create/blockstates/cut_granite_wall.json 0652c8b9c41acc1a8da901bd7b8b6018b3581d5b assets/create/blockstates/cut_limestone.json -508ee569f313b7e804f6268ca86f5a61851563ec assets/create/blockstates/cut_limestone_bricks.json 4efbeb34c96918e9b48dc484a82b1ef4811ed39d assets/create/blockstates/cut_limestone_brick_slab.json 11b99cf9b33d7f8de9d11cc1e405e2681682ba32 assets/create/blockstates/cut_limestone_brick_stairs.json b6c02a9e9e47a8e521a54ef9488259267068f032 assets/create/blockstates/cut_limestone_brick_wall.json +508ee569f313b7e804f6268ca86f5a61851563ec assets/create/blockstates/cut_limestone_bricks.json fb63a2581211fe62344985a06feec9dcec4b1888 assets/create/blockstates/cut_limestone_slab.json ffcca1e66718f3e78e544b5fa9954a852c095e91 assets/create/blockstates/cut_limestone_stairs.json a1a90f84b47f96b4384fc2d60bfc48ddbb5ed179 assets/create/blockstates/cut_limestone_wall.json 1b7a133518780d4f49474a70e7f6263d6e88ff51 assets/create/blockstates/cut_ochrum.json -6f37e5e2dca3b443951131cb82c15a981a4e2005 assets/create/blockstates/cut_ochrum_bricks.json f1e9d54a6f9f41b968f117a7be711011effa71a5 assets/create/blockstates/cut_ochrum_brick_slab.json 8d334e026e94b304a1ff1ee96097f434b50175f2 assets/create/blockstates/cut_ochrum_brick_stairs.json e92c026ee7ab2aa35003ad475bef3d6c0e29818c assets/create/blockstates/cut_ochrum_brick_wall.json +6f37e5e2dca3b443951131cb82c15a981a4e2005 assets/create/blockstates/cut_ochrum_bricks.json 5a61edb7d146e83d951795fae33dc306e71b2cb6 assets/create/blockstates/cut_ochrum_slab.json b31944bf6297685acd37631083dde0889c08ede7 assets/create/blockstates/cut_ochrum_stairs.json df33a8af1dc8cb08ddcfd22a50a305499479a4dd assets/create/blockstates/cut_ochrum_wall.json 1606d7481e56755f07e9331cf85a8d7cc9aace9a assets/create/blockstates/cut_scorchia.json -bc2a0e7f11400b8c2a03071be87dadb5edc097de assets/create/blockstates/cut_scorchia_bricks.json 43db25ebac2f5bcaa7ca9cfb6da8fcb20fad8269 assets/create/blockstates/cut_scorchia_brick_slab.json 7a80620590ba5e61967c5168f5c67ecabf09dc00 assets/create/blockstates/cut_scorchia_brick_stairs.json e4eb79360a41bb1a7ca835d61446ea5166e4cda8 assets/create/blockstates/cut_scorchia_brick_wall.json +bc2a0e7f11400b8c2a03071be87dadb5edc097de assets/create/blockstates/cut_scorchia_bricks.json c0d262f54e3b2fce8bc941a2a6df71db5f0229ea assets/create/blockstates/cut_scorchia_slab.json de2e918058e9dd7eafd085a8dec634f6a2832c21 assets/create/blockstates/cut_scorchia_stairs.json 5d2d06799b82449754f62b1d80b9ee9a24c65bad assets/create/blockstates/cut_scorchia_wall.json 76ea4f3438a3effedfc93d2bbabac0899610cd28 assets/create/blockstates/cut_scoria.json -6d9c79e1b71656a73bb69e2a9b100be59084dd2e assets/create/blockstates/cut_scoria_bricks.json 7c7dcd1fe82f3673910620c2eefebad5d0029cdf assets/create/blockstates/cut_scoria_brick_slab.json d535b387bf0a6f9e124eed8b76d899e13699bca9 assets/create/blockstates/cut_scoria_brick_stairs.json c426e1b5e4c77c25cd0d16d10fba0e0731673dd1 assets/create/blockstates/cut_scoria_brick_wall.json +6d9c79e1b71656a73bb69e2a9b100be59084dd2e assets/create/blockstates/cut_scoria_bricks.json fb692494c88358d4d8e687b216f729d6b6bd7174 assets/create/blockstates/cut_scoria_slab.json 950f43bae8f4e3220103ce0c62f444856129ca12 assets/create/blockstates/cut_scoria_stairs.json 01350030831c5b9edef0dc2c778b92f1ebc2b2fc assets/create/blockstates/cut_scoria_wall.json c0c1c4d44eba5babe9703eca31f0279ebd11ed8e assets/create/blockstates/cut_tuff.json -9bddef4a2b4a338c15f03e2397c4cd4c3ae9e5d9 assets/create/blockstates/cut_tuff_bricks.json 11306e83915e0106d48f890df3212c3a47443a08 assets/create/blockstates/cut_tuff_brick_slab.json e8951d94e0d3228700bcb56819928f1c179c3973 assets/create/blockstates/cut_tuff_brick_stairs.json 619340b7cf014cfb72a4b5440b90881535f16108 assets/create/blockstates/cut_tuff_brick_wall.json +9bddef4a2b4a338c15f03e2397c4cd4c3ae9e5d9 assets/create/blockstates/cut_tuff_bricks.json 3577e3f4933ea8cb7464c28e80867ce84917898d assets/create/blockstates/cut_tuff_slab.json 5673fdb02439d622c56dc0ff47a0dca98dc6d027 assets/create/blockstates/cut_tuff_stairs.json 12a46ee82536665400ec2f3befed3be58325d5c6 assets/create/blockstates/cut_tuff_wall.json beb9e47f8d811c2146f68daf992fb805342a65cb assets/create/blockstates/cut_veridium.json -04d07986eb86ffd66baaaf9b65e02d00022e98e2 assets/create/blockstates/cut_veridium_bricks.json 952543c03e730443d85059ec43642efb089485e7 assets/create/blockstates/cut_veridium_brick_slab.json 6a033e7b5a0b26cce5956c6c7c1eff558f866cb5 assets/create/blockstates/cut_veridium_brick_stairs.json 43689138c8018b3ee9f35a11870887e9df3c8fe5 assets/create/blockstates/cut_veridium_brick_wall.json +04d07986eb86ffd66baaaf9b65e02d00022e98e2 assets/create/blockstates/cut_veridium_bricks.json 212d8ee5dfa78802b9539640cf8b263fd5880b87 assets/create/blockstates/cut_veridium_slab.json c11f09df4a23e951bdf9a345515183f4fac7cde3 assets/create/blockstates/cut_veridium_stairs.json 3aa6f5e613ff73952e3de00408051f92316e7f81 assets/create/blockstates/cut_veridium_wall.json @@ -241,12 +241,12 @@ f7f5df9086c71688cbdb5d05c394dc5acb8fb338 assets/create/blockstates/elevator_cont d47bc65703e9582cc710e6408fb565e16d3514a6 assets/create/blockstates/encased_fan.json 651f9fdb11f56d887d131be8f936f508d0b2fc1d assets/create/blockstates/encased_fluid_pipe.json 489ad4daeaed702d231a3f175f7b66846f5789a6 assets/create/blockstates/experience_block.json -5f6c60a30889b043709066707e80a21081d98155 assets/create/blockstates/exposed_copper_shingles.json 74c8a72db3dd3fa919e29baaa8c5865f13490461 assets/create/blockstates/exposed_copper_shingle_slab.json 4e0b5a9be15f0c2861f5f6bd71bd9c2a4db2a21d assets/create/blockstates/exposed_copper_shingle_stairs.json -5299b4f7b9b3490872e8c26a6b212e14dd05fd9a assets/create/blockstates/exposed_copper_tiles.json +5f6c60a30889b043709066707e80a21081d98155 assets/create/blockstates/exposed_copper_shingles.json 6ee73ff3608d51fdad6e9810feee66ed1773b81c assets/create/blockstates/exposed_copper_tile_slab.json f93e4059876bfc6d70b9fa2bc24d8e3d6943d56f assets/create/blockstates/exposed_copper_tile_stairs.json +5299b4f7b9b3490872e8c26a6b212e14dd05fd9a assets/create/blockstates/exposed_copper_tiles.json 4b30365ed77db9c5754eeda5fee81d47b568b946 assets/create/blockstates/factory_gauge.json f1a03ede031d8c4e33a4d07c529e71936da9dc6d assets/create/blockstates/fake_track.json 21fa4a1bf4ee851e090a21c97c9a38d18cfddf0d assets/create/blockstates/fluid_pipe.json @@ -323,8 +323,6 @@ fa5fb2be73c7c54b70e927b66adf3f4d64c5cb6b assets/create/blockstates/light_gray_ni f1901887cd166296e465133c3b0d7ad0d664a614 assets/create/blockstates/light_gray_table_cloth.json 35b151db396069b146d223fbe46be5b0c3dda8a9 assets/create/blockstates/light_gray_toolbox.json 894827ffd176bc733abecf18d96888e9ed5a3eb4 assets/create/blockstates/light_gray_valve_handle.json -a6f319c803c03e34bbf841ea52d82f0f7ec7a413 assets/create/blockstates/limestone.json -7ff65e1c4c8e48a0b694cd17506a192e6a7e6e44 assets/create/blockstates/limestone_pillar.json 7f20b548dd535942b2d6f41c39de7ad4fafe637e assets/create/blockstates/lime_nixie_tube.json c6ac740bf37477ad170576983230b130ac01f355 assets/create/blockstates/lime_postbox.json ad1ec304729fd6d336c0d4d0c27c9345af636695 assets/create/blockstates/lime_sail.json @@ -332,6 +330,8 @@ b9934a558e1b495403dc2c71ffb43cce7d396013 assets/create/blockstates/lime_seat.jso 7c5dc2ffd0bd44ba8785b6a788030714a009bcbc assets/create/blockstates/lime_table_cloth.json 49a02f7fc16697ba1cf16cee7e45ab6bfd8b06ce assets/create/blockstates/lime_toolbox.json ba181485f219d3ae23509a7edf28e25d9edb10f4 assets/create/blockstates/lime_valve_handle.json +a6f319c803c03e34bbf841ea52d82f0f7ec7a413 assets/create/blockstates/limestone.json +7ff65e1c4c8e48a0b694cd17506a192e6a7e6e44 assets/create/blockstates/limestone_pillar.json 654e845cebed82b7afbcf81380921e0a475b01e9 assets/create/blockstates/linear_chassis.json e195e82e4d0c1fc20474535bc9068cbb77a5e175 assets/create/blockstates/lit_blaze_burner.json 296186b196af94e1ab3f7e8a3254f6d31ae47a5c assets/create/blockstates/magenta_nixie_tube.json @@ -377,14 +377,14 @@ aab812cecf7d10d4e7587f4dead8a98238a15f41 assets/create/blockstates/orange_seat.j 2af63a4768f84fc93c7e7d67fa9a64438433e59f assets/create/blockstates/orange_valve_handle.json 515ed7dae09b052f289419ba09998a23e0d7083d assets/create/blockstates/ornate_iron_window.json 8118444f37536b9104ef4818d374b0c8a7c987bf assets/create/blockstates/ornate_iron_window_pane.json -97cd78453af94f44cef1187988966626574b29d5 assets/create/blockstates/oxidized_copper_shingles.json 2ddc762b8d8558e69a2f81c028702f3a25b5e978 assets/create/blockstates/oxidized_copper_shingle_slab.json ac536ae742c12e97bfd0b2483c87ff29f3935eaf assets/create/blockstates/oxidized_copper_shingle_stairs.json -110a6c19bcc9f044e5e982ac6e4b295b03ec0145 assets/create/blockstates/oxidized_copper_tiles.json +97cd78453af94f44cef1187988966626574b29d5 assets/create/blockstates/oxidized_copper_shingles.json 3f3924f0f0e368edfa04f4fdd6d6c2319276ddfe assets/create/blockstates/oxidized_copper_tile_slab.json 5e634cfb9abb06d8b29f39d751fc56b28ea5a9cd assets/create/blockstates/oxidized_copper_tile_stairs.json -65f3fa5a068189c1c2971af1a1052f69c0e26005 assets/create/blockstates/packager.json +110a6c19bcc9f044e5e982ac6e4b295b03ec0145 assets/create/blockstates/oxidized_copper_tiles.json 887565a0f89f089d6be888c87394dde4878afda7 assets/create/blockstates/package_frogport.json +65f3fa5a068189c1c2971af1a1052f69c0e26005 assets/create/blockstates/packager.json 36742cc6ce052ead143366d31b11e828a525c1b8 assets/create/blockstates/peculiar_bell.json 53d102e706d53cb2c0dbc0bc11da828084a43519 assets/create/blockstates/pink_nixie_tube.json db7ef5acb1ce2d3b8f881f34b5d9f40633c3973d assets/create/blockstates/pink_postbox.json @@ -470,9 +470,6 @@ a4b6bd4e55cd292abf752efeda93cf8d23162657 assets/create/blockstates/purple_table_ 3aca01f2eddb22adb1b25735b98a990bfc7220d2 assets/create/blockstates/radial_chassis.json 72faac9777be540f95f8b662a833856e0e1b8f35 assets/create/blockstates/railway_casing.json 7ce346fa18702f6fe6e2a939efcfa26eda63fe38 assets/create/blockstates/raw_zinc_block.json -ec546afd3ec8036e4393b97d535f05a86f57dbc1 assets/create/blockstates/redstone_contact.json -ff205f032b36486753dddb1f2029ef8d53e9c86f assets/create/blockstates/redstone_link.json -e4c645b199a2d7e89c91065071a0a91df5ca8e3c assets/create/blockstates/redstone_requester.json e3fd62e466e3e6e7bd6fc8661f764ba972a466fc assets/create/blockstates/red_nixie_tube.json d14d6437a6727da13cea5f7eeb815720c80dde6f assets/create/blockstates/red_postbox.json 4c36b562da58ef2af57009da7cf2426059249228 assets/create/blockstates/red_sail.json @@ -480,6 +477,9 @@ d14d6437a6727da13cea5f7eeb815720c80dde6f assets/create/blockstates/red_postbox.j 90bf31515faa2e7e6d73414a6c5498911910710e assets/create/blockstates/red_table_cloth.json 380f46b7cb72b13c0f16fd4a4287a1a33adeff41 assets/create/blockstates/red_toolbox.json b689d87a27ed0cb2cab190a2ad2b599818bff56c assets/create/blockstates/red_valve_handle.json +ec546afd3ec8036e4393b97d535f05a86f57dbc1 assets/create/blockstates/redstone_contact.json +ff205f032b36486753dddb1f2029ef8d53e9c86f assets/create/blockstates/redstone_link.json +e4c645b199a2d7e89c91065071a0a91df5ca8e3c assets/create/blockstates/redstone_requester.json 87ab7ca62ecf24d60d7e5c61bd5af97714dad0ad assets/create/blockstates/refined_radiance_casing.json 64a5b256e5af2dc8cb7ed77f0feadcf5134f7335 assets/create/blockstates/repackager.json 3807bcc6ccc3dad0dbfcc8fcf260a361aa488659 assets/create/blockstates/rope.json @@ -489,8 +489,8 @@ dd63fd8443a2be507281548df838d878b0c3c8c8 assets/create/blockstates/rose_quartz_l dfe69ee57f832a2e4c576ee01bdde1617c81e46a assets/create/blockstates/rose_quartz_tiles.json b9cbbc7c4e1d9abd312263a9a270315bd5f0106b assets/create/blockstates/rotation_speed_controller.json 5a25ecb95b7978cc487491cb24478e4d6a73e977 assets/create/blockstates/sail_frame.json -bff758cc56bece375b40c32067b903b675065328 assets/create/blockstates/schematicannon.json 505510656c77d93ecd3691e7111615193275f29e assets/create/blockstates/schematic_table.json +bff758cc56bece375b40c32067b903b675065328 assets/create/blockstates/schematicannon.json 82c9ceb19cfc4e247fbb62a9605630ba08423efe assets/create/blockstates/scorchia.json 6fa99d5f1ff05153660f9917286d4b157eaa1b40 assets/create/blockstates/scorchia_pillar.json 8c34743564aa0473745ecec304a19e15e9e87cf2 assets/create/blockstates/scoria.json @@ -499,64 +499,64 @@ e5aff9dc8fa5e98b060232974194afb06d497d09 assets/create/blockstates/scoria_pillar 3343224d6da4e75f0bc7a7634ba010a4ba54ad70 assets/create/blockstates/sequenced_gearshift.json 4c261d54117ee295b307f6ea3e56a09437631f73 assets/create/blockstates/shadow_steel_casing.json 4c67d2a1a1faea5be2a81ebc0722c32d8e2e84d6 assets/create/blockstates/shaft.json -c606f103619088e8a5afe969ba54929af480a3d2 assets/create/blockstates/small_andesite_bricks.json c5469de5957d77fc11febaa658ee2bfb0d11b0bc assets/create/blockstates/small_andesite_brick_slab.json ed0bcfd07959aa208085910bd3780756979c985d assets/create/blockstates/small_andesite_brick_stairs.json 78e30e63adedf1ca95261eb4010a1db45aecfe9e assets/create/blockstates/small_andesite_brick_wall.json -b9fedc13dc8cb53a8bb16ce2257ea65f0ac94a6b assets/create/blockstates/small_asurine_bricks.json +c606f103619088e8a5afe969ba54929af480a3d2 assets/create/blockstates/small_andesite_bricks.json 653fa70f0aa7fc319d50f72692d507ff7c59c0f4 assets/create/blockstates/small_asurine_brick_slab.json e61a0b891729565434d6ab34aa3aeada7d189f9d assets/create/blockstates/small_asurine_brick_stairs.json 02556b916c198c683279eb4392ebaa31fb41e182 assets/create/blockstates/small_asurine_brick_wall.json +b9fedc13dc8cb53a8bb16ce2257ea65f0ac94a6b assets/create/blockstates/small_asurine_bricks.json e986248237013eea755bccd300f745e44d0a183f assets/create/blockstates/small_bogey.json -031d9492dbcc5de77431e8f54b9b04db412b5690 assets/create/blockstates/small_calcite_bricks.json 898bca10ff6e5402c4b8b84e1b9ba9036b32b8bc assets/create/blockstates/small_calcite_brick_slab.json ecc2276bdb2b24f54e31372bf207171a348e55d3 assets/create/blockstates/small_calcite_brick_stairs.json d9dd243b5b754a487755b53609d404ac1b3fde99 assets/create/blockstates/small_calcite_brick_wall.json -3d4e0b54ffda83f7f6e08b6a745db81049d95f3b assets/create/blockstates/small_crimsite_bricks.json +031d9492dbcc5de77431e8f54b9b04db412b5690 assets/create/blockstates/small_calcite_bricks.json 4094bf00cad8dea2dd234866b482c07175802c4c assets/create/blockstates/small_crimsite_brick_slab.json 7f73a2505e2a3a98a7749fa98f4623aa2d216edd assets/create/blockstates/small_crimsite_brick_stairs.json b477c7f1855c9eb2ef1bf672376e972678dc563f assets/create/blockstates/small_crimsite_brick_wall.json -17359d1b87399bb066cfc23002bcf0d8f71d8ccd assets/create/blockstates/small_deepslate_bricks.json +3d4e0b54ffda83f7f6e08b6a745db81049d95f3b assets/create/blockstates/small_crimsite_bricks.json c67f32adc49f0b24b34f098a390a398813365260 assets/create/blockstates/small_deepslate_brick_slab.json d05aed31d45ed12f8f117a9c64312b1abff8bd2f assets/create/blockstates/small_deepslate_brick_stairs.json 6952b02d8c5adf3d0d1a243221b637c50edaa287 assets/create/blockstates/small_deepslate_brick_wall.json -6c0ac59e09feb76afc078a88431442a2a6381c6c assets/create/blockstates/small_diorite_bricks.json +17359d1b87399bb066cfc23002bcf0d8f71d8ccd assets/create/blockstates/small_deepslate_bricks.json ee39994b434a17ec7497b271a6e0a006cf6311cb assets/create/blockstates/small_diorite_brick_slab.json eb335cf0a857299b9cd0c4f60e00bc8e4ca7efe8 assets/create/blockstates/small_diorite_brick_stairs.json b6f7c563c30483c749849899b96d4f0030b71df1 assets/create/blockstates/small_diorite_brick_wall.json -d51095bfb9d5758f8b3972a973fbe282569b0234 assets/create/blockstates/small_dripstone_bricks.json +6c0ac59e09feb76afc078a88431442a2a6381c6c assets/create/blockstates/small_diorite_bricks.json 3d8109d327099c65ca0fafcb5651051059cad1df assets/create/blockstates/small_dripstone_brick_slab.json 3931e24229db79115ffe2a9f3a069202b9b8dcab assets/create/blockstates/small_dripstone_brick_stairs.json 0d16cefcb8e619bc81ef65111d16d331db58d0aa assets/create/blockstates/small_dripstone_brick_wall.json -11dcaf8a6da96d178024b4c3ee76b9c373e5d082 assets/create/blockstates/small_granite_bricks.json +d51095bfb9d5758f8b3972a973fbe282569b0234 assets/create/blockstates/small_dripstone_bricks.json 096b064f28fbe381e1b637d4668550851cbbb2c2 assets/create/blockstates/small_granite_brick_slab.json e99cc3251937fbf9fc858623d5ea525ed5b79704 assets/create/blockstates/small_granite_brick_stairs.json 62f2b570ac6073c8a98369523095d2c18a353eed assets/create/blockstates/small_granite_brick_wall.json -346dbff9a84b988bd9c9af670b486b6af5e18179 assets/create/blockstates/small_limestone_bricks.json +11dcaf8a6da96d178024b4c3ee76b9c373e5d082 assets/create/blockstates/small_granite_bricks.json d640eed81abaa013ed1c53d68a552f639168ae8b assets/create/blockstates/small_limestone_brick_slab.json d470967200aa6ca618421cf375140b352c45cc90 assets/create/blockstates/small_limestone_brick_stairs.json 8d4a1eff66a3f45d595ff8371c0d1ebaa0ba1773 assets/create/blockstates/small_limestone_brick_wall.json -1464b01d4c8bd9ec56460c1250fd4bb07e936e22 assets/create/blockstates/small_ochrum_bricks.json +346dbff9a84b988bd9c9af670b486b6af5e18179 assets/create/blockstates/small_limestone_bricks.json ddee92141e00898e8d70145cf00c0d64f56b4f48 assets/create/blockstates/small_ochrum_brick_slab.json bad9a5820c64c125494c0eba4f6c7ebebe93341c assets/create/blockstates/small_ochrum_brick_stairs.json ed899a18522adc70ae46185c308904c8de5b5834 assets/create/blockstates/small_ochrum_brick_wall.json +1464b01d4c8bd9ec56460c1250fd4bb07e936e22 assets/create/blockstates/small_ochrum_bricks.json c520e9ba54ff6dfb96f7863bb093cdf15cc95ce4 assets/create/blockstates/small_rose_quartz_tiles.json -371ff795eb4e7cb1220d307abf8cb003f455cbec assets/create/blockstates/small_scorchia_bricks.json 384a1331b92b7beba988f729bb7cda42abec0172 assets/create/blockstates/small_scorchia_brick_slab.json 046a84030a23f5a40f4deac13f2e60ced436cadf assets/create/blockstates/small_scorchia_brick_stairs.json 58bc6e3bb10ed72b8cb5813a88cab300d1183b7d assets/create/blockstates/small_scorchia_brick_wall.json -0aa51dbfda8349b878e2f6c9bb3314fcfc1a9c39 assets/create/blockstates/small_scoria_bricks.json +371ff795eb4e7cb1220d307abf8cb003f455cbec assets/create/blockstates/small_scorchia_bricks.json 5b227400e588abae33c1682196f098adc8006d13 assets/create/blockstates/small_scoria_brick_slab.json 51420bb12b757d3888fd1ceb5c21d83b42bd2266 assets/create/blockstates/small_scoria_brick_stairs.json 36e9bd161fa4ffe18f07153b2945cfeae55e7c0b assets/create/blockstates/small_scoria_brick_wall.json -c1f9f986dd0bfdbdee210c6c7d71981b251c27db assets/create/blockstates/small_tuff_bricks.json +0aa51dbfda8349b878e2f6c9bb3314fcfc1a9c39 assets/create/blockstates/small_scoria_bricks.json 8d1af444031291fe58d850ae344aaf7e97b8bd87 assets/create/blockstates/small_tuff_brick_slab.json 26879e6cadf0035c3eed4b54b3a1fdc0c080a485 assets/create/blockstates/small_tuff_brick_stairs.json 5d58ca7b81ae537454c3cdbb5fc8aacca83cff3f assets/create/blockstates/small_tuff_brick_wall.json -ad79aa8ff306695f65386fdeb44c5285547934b6 assets/create/blockstates/small_veridium_bricks.json +c1f9f986dd0bfdbdee210c6c7d71981b251c27db assets/create/blockstates/small_tuff_bricks.json 6226471fdcadbbf0e02704bb0e7de607e99302a8 assets/create/blockstates/small_veridium_brick_slab.json b54200ebe65c4ad2e5661c81ba5bf939039277ca assets/create/blockstates/small_veridium_brick_stairs.json 0237d58443ca9dc2a9186c2387dd6633702a7598 assets/create/blockstates/small_veridium_brick_wall.json +ad79aa8ff306695f65386fdeb44c5285547934b6 assets/create/blockstates/small_veridium_bricks.json 4d987859e5f5a930c20e955919304088fb6fc6d1 assets/create/blockstates/smart_chute.json 57fc35b2e0ae9ab16c011abd95f507910c70a234 assets/create/blockstates/smart_fluid_pipe.json a70c025de5d85180f371ff05bbdc531d8bdfaab1 assets/create/blockstates/speedometer.json @@ -568,9 +568,9 @@ a60c9c8241e40c2e28f5760c0ca6e80cfe9d59f3 assets/create/blockstates/steam_whistle 636ec6c7e1ef3b737edc716200f138bc63681d78 assets/create/blockstates/steam_whistle_extension.json 8865500bcd2e4d467e74edb3509850fa92a5809f assets/create/blockstates/sticker.json bed0534e618105184bc877b104230403ca85bb58 assets/create/blockstates/sticky_mechanical_piston.json -c7c17ff17b98ce85d355f2f9b4509271bc283843 assets/create/blockstates/stockpile_switch.json d17e6ac368278bd60442e2f19eb064a31c4106d2 assets/create/blockstates/stock_link.json 9989bda294fbffc5f659d2e608e01dea424c7694 assets/create/blockstates/stock_ticker.json +c7c17ff17b98ce85d355f2f9b4509271bc283843 assets/create/blockstates/stockpile_switch.json a70c025de5d85180f371ff05bbdc531d8bdfaab1 assets/create/blockstates/stressometer.json 8086f80c532fad42b37fcdc590b890ed7e8c3fe9 assets/create/blockstates/tiled_glass.json 1143ab7223c655764a81ed72ac385ea179664072 assets/create/blockstates/tiled_glass_pane.json @@ -590,36 +590,36 @@ bfb2b7eabba2e7aef4d783328c8a5a1558e7e493 assets/create/blockstates/turntable.jso 116d0a8fb72bcc00bd511db7893ea3e96efda297 assets/create/blockstates/warped_window_pane.json fa3d300520e3bedb926696d9980cbeeb54cfdc68 assets/create/blockstates/water_wheel.json 3dff9e1ec59415779195d2abfa9f07bc17b428a1 assets/create/blockstates/water_wheel_structure.json -2ae175c489b86b78b4646306250ca2dba66b0a5e assets/create/blockstates/waxed_copper_shingles.json 85ed36dcb0a3542e0638601116360202a9670d53 assets/create/blockstates/waxed_copper_shingle_slab.json aaf49f1b6785e2195c5dc2e8792c99c960745f89 assets/create/blockstates/waxed_copper_shingle_stairs.json -835bfe0d2137ad60e5f8322fa4449d5c7a02187f assets/create/blockstates/waxed_copper_tiles.json +2ae175c489b86b78b4646306250ca2dba66b0a5e assets/create/blockstates/waxed_copper_shingles.json b52eda74c9000507a4f34e10fbd1a7846b66c16d assets/create/blockstates/waxed_copper_tile_slab.json 5428969f6f27213d0ec5140d911b3844b5332006 assets/create/blockstates/waxed_copper_tile_stairs.json -306b9cd1efe3abd1fcca11bc464560837fb8fdfa assets/create/blockstates/waxed_exposed_copper_shingles.json +835bfe0d2137ad60e5f8322fa4449d5c7a02187f assets/create/blockstates/waxed_copper_tiles.json bc8f3bb75bdb094c8372d61a68927270d3347437 assets/create/blockstates/waxed_exposed_copper_shingle_slab.json 32382e5f524b50393080fdbd2415a98ddb700c9c assets/create/blockstates/waxed_exposed_copper_shingle_stairs.json -ae92a9051f1603e7ad4f93cb668706ccffc7a85b assets/create/blockstates/waxed_exposed_copper_tiles.json +306b9cd1efe3abd1fcca11bc464560837fb8fdfa assets/create/blockstates/waxed_exposed_copper_shingles.json ca37c3e54d5c78a77fcb4a4aca004a34e271f246 assets/create/blockstates/waxed_exposed_copper_tile_slab.json a864f82ccd6b3e0fa181c800da886ebd3239fb82 assets/create/blockstates/waxed_exposed_copper_tile_stairs.json -729ca65a140b3d7571a2072f7406cc5f4a2e27c5 assets/create/blockstates/waxed_oxidized_copper_shingles.json +ae92a9051f1603e7ad4f93cb668706ccffc7a85b assets/create/blockstates/waxed_exposed_copper_tiles.json ef99e849f9dd6ad53ddf04625c81750f11eaae1c assets/create/blockstates/waxed_oxidized_copper_shingle_slab.json 9386068220f9bb5d2f6d3cc408dc4f78f26b4eeb assets/create/blockstates/waxed_oxidized_copper_shingle_stairs.json -17acf3486e92aabc3efbe99fa1e5d7d664e6ec97 assets/create/blockstates/waxed_oxidized_copper_tiles.json +729ca65a140b3d7571a2072f7406cc5f4a2e27c5 assets/create/blockstates/waxed_oxidized_copper_shingles.json fe79f7eab017d714c0331664a3a2b5579104194e assets/create/blockstates/waxed_oxidized_copper_tile_slab.json 10bbe77a0334b5578b1ec40b398a45cf7d2bb534 assets/create/blockstates/waxed_oxidized_copper_tile_stairs.json -079acbfd6a9375899687b581f95bbe74940afce2 assets/create/blockstates/waxed_weathered_copper_shingles.json +17acf3486e92aabc3efbe99fa1e5d7d664e6ec97 assets/create/blockstates/waxed_oxidized_copper_tiles.json 73572bbe16957e63853ee425d8f34d98e14e4a10 assets/create/blockstates/waxed_weathered_copper_shingle_slab.json ab05925d5bb70e53fec9c149982304f31acd2b1a assets/create/blockstates/waxed_weathered_copper_shingle_stairs.json -202b0f2e6fca9eab949f47eaa1f4ddee249a633a assets/create/blockstates/waxed_weathered_copper_tiles.json +079acbfd6a9375899687b581f95bbe74940afce2 assets/create/blockstates/waxed_weathered_copper_shingles.json fc1b53d3b2b1f0977069abec3c376f3f5c4cd7c8 assets/create/blockstates/waxed_weathered_copper_tile_slab.json 6cd93476a45c3b77f5eda66f68425bae486cfba8 assets/create/blockstates/waxed_weathered_copper_tile_stairs.json -c11562afd9a5f85945e521dcea5f911d1b6d13c6 assets/create/blockstates/weathered_copper_shingles.json +202b0f2e6fca9eab949f47eaa1f4ddee249a633a assets/create/blockstates/waxed_weathered_copper_tiles.json 5a5a1e95988edb7a2b6dc6c6ba5677c2d896a5ae assets/create/blockstates/weathered_copper_shingle_slab.json 07019fc8890cb5e966a42ca636a0ab9cf71cc881 assets/create/blockstates/weathered_copper_shingle_stairs.json -236e072d9056c0dbffdf5d7d973a85a56c2c8de1 assets/create/blockstates/weathered_copper_tiles.json +c11562afd9a5f85945e521dcea5f911d1b6d13c6 assets/create/blockstates/weathered_copper_shingles.json fee668eb9a45dca0d287fee5811219d69f9ec3e2 assets/create/blockstates/weathered_copper_tile_slab.json da110f382368257e15431c77164aef82e014e3f8 assets/create/blockstates/weathered_copper_tile_stairs.json +236e072d9056c0dbffdf5d7d973a85a56c2c8de1 assets/create/blockstates/weathered_copper_tiles.json 64fb3e569da401635b64e71e01ea0b3ff6360611 assets/create/blockstates/weathered_iron_block.json 6fd81f1eb48fbfc44df9db8eedc613690c9b8ef5 assets/create/blockstates/weathered_iron_window.json 1aed351050d73989c4553bf49ce03b3a8fdd210e assets/create/blockstates/weathered_iron_window_pane.json @@ -806,21 +806,21 @@ d063df8e9b974c11fc7810ce176b02d7d924e15b assets/create/models/block/copper_post. 2b5aed4a917694beb33d9b0ecbc800dcbc143ee9 assets/create/models/block/copper_post_ends.json bac7566a726b0fe6d537c744aec4afb383dc165c assets/create/models/block/copper_scaffolding.json dbee65c129740f3b99c07e754b3224d3f9f8c242 assets/create/models/block/copper_scaffolding_horizontal.json -32fdb85b5b62d5a0fb41732874c854788cdd2ba1 assets/create/models/block/copper_shingles.json fb7fb6deebd502946ab57f1b8a9f4a6b5dd48da3 assets/create/models/block/copper_shingle_slab.json 660f61112b8e46dec5050cb0ed4ee936965a7c58 assets/create/models/block/copper_shingle_slab_top.json 5d74be967bbe9feba4b630751f13af817a733d1d assets/create/models/block/copper_shingle_stairs.json 35cb89f29ce3f8d8af13602c08ecd7afbb7cf56a assets/create/models/block/copper_shingle_stairs_inner.json fcb9295f4f388e6d439ec9a3906ca326b6d69077 assets/create/models/block/copper_shingle_stairs_outer.json +32fdb85b5b62d5a0fb41732874c854788cdd2ba1 assets/create/models/block/copper_shingles.json cb218a725f82db34ffe58a5208266e1c768cfc05 assets/create/models/block/copper_side.json d9b4652ca8f1e65007f42d946ecfb38acc3f168f assets/create/models/block/copper_side_alt.json 03a6c5b8bc3041a2be001092f7abd014d6f852a2 assets/create/models/block/copper_table_cloth.json -32f06f39d0b34e4431795aa6e64f87e58dc1597b assets/create/models/block/copper_tiles.json 298c6100de02ed9f813397d8ba38c46f35035c69 assets/create/models/block/copper_tile_slab.json d4422c2d96fb329087d1be70d8b983a8cf6c7f01 assets/create/models/block/copper_tile_slab_top.json fca72048f916d3a3e567b385c948cc1b59711ef4 assets/create/models/block/copper_tile_stairs.json 997479b62ed3d81ab633279ecc2fabd9588a3bf3 assets/create/models/block/copper_tile_stairs_inner.json d5c5bbfb9aaa282e11ad6e6309b1880b172ee653 assets/create/models/block/copper_tile_stairs_outer.json +32f06f39d0b34e4431795aa6e64f87e58dc1597b assets/create/models/block/copper_tiles.json fa2fa91e674eb4de440617049dae34064fd6fa39 assets/create/models/block/copper_valve_handle.json 52ae02c17509e483e35a1b6055296c3a663f85d7 assets/create/models/block/crate/creative/bottom.json 689989ecbd4d59d5836deb8adf7af1d473a377c0 assets/create/models/block/crate/creative/left.json @@ -864,15 +864,15 @@ b3f403f77e3b1b44c56450e387136bca12a84a99 assets/create/models/block/crimson_wind 117d14a1f25cc8ac633bb4cc8a81830a1c016096 assets/create/models/block/crimson_window_pane_side.json ee13522aadfca40f856499d5c29bd86d8f4dda57 assets/create/models/block/crimson_window_pane_side_alt.json 40042ce15d51445ec71b73da34477fa735f3fdd4 assets/create/models/block/cut_andesite.json -5be7d431ac56e2ceb9e3d95589d687f757d5257c assets/create/models/block/cut_andesite_bricks.json -c78e2acf9b54d7370f12e34dcca5c71743f47d55 assets/create/models/block/cut_andesite_bricks_wall_post.json -88e3c8eadf97f772fbafe3b71c8dd27c91c0c0e3 assets/create/models/block/cut_andesite_bricks_wall_side.json -bc264e09c506418b01c6032dcab8ca28080cb70b assets/create/models/block/cut_andesite_bricks_wall_side_tall.json fcbe246aca067dcfeef7afb4e6068b8932da8792 assets/create/models/block/cut_andesite_brick_slab.json e384a98b54ed7317b6ad0e86cf87500491eea824 assets/create/models/block/cut_andesite_brick_slab_top.json 91699e60e29e7524271a2f87200951ee8bfeb8ef assets/create/models/block/cut_andesite_brick_stairs.json e314e0837aed319cdf34a1aaa60f0be6ca169636 assets/create/models/block/cut_andesite_brick_stairs_inner.json aba679c4c6a8d5afc2924d2c9c84af5a2208fde3 assets/create/models/block/cut_andesite_brick_stairs_outer.json +5be7d431ac56e2ceb9e3d95589d687f757d5257c assets/create/models/block/cut_andesite_bricks.json +c78e2acf9b54d7370f12e34dcca5c71743f47d55 assets/create/models/block/cut_andesite_bricks_wall_post.json +88e3c8eadf97f772fbafe3b71c8dd27c91c0c0e3 assets/create/models/block/cut_andesite_bricks_wall_side.json +bc264e09c506418b01c6032dcab8ca28080cb70b assets/create/models/block/cut_andesite_bricks_wall_side_tall.json 8c17ba39e50a440497af089f5fd85649f05bdf8c assets/create/models/block/cut_andesite_slab.json b95ab966cf8c177c799e228759d0cd28c1cfa71f assets/create/models/block/cut_andesite_slab_top.json 81a407a5ff4393b66f784ba4ceee971c3c62de7f assets/create/models/block/cut_andesite_stairs.json @@ -882,15 +882,15 @@ f06abcb3ce691fd30db81b40ea0430462fc972cf assets/create/models/block/cut_andesite 81cef9548137aaff5b6e77d417f387796f2608b2 assets/create/models/block/cut_andesite_wall_side.json dbb99ac37333ee12b7d3859207409aa2599f28eb assets/create/models/block/cut_andesite_wall_side_tall.json a48f77e90c1d02d5b4e6540db723f748118788e9 assets/create/models/block/cut_asurine.json -3b0b7bd63870ac19b9444ce9add9930ec9120821 assets/create/models/block/cut_asurine_bricks.json -89142424e1d702a0f2bc27829304520e48ee1eb3 assets/create/models/block/cut_asurine_bricks_wall_post.json -1f1fcf92e91b1f0d15ba389d6d25e1fba3ad8e5b assets/create/models/block/cut_asurine_bricks_wall_side.json -858d15aff53fe938304bafb52ef32e54e3d44a44 assets/create/models/block/cut_asurine_bricks_wall_side_tall.json 4107317f71d07fb1c113e056c832e963f57b41d7 assets/create/models/block/cut_asurine_brick_slab.json fba2e8dc513184eaa9c4449471b32f206dfe425a assets/create/models/block/cut_asurine_brick_slab_top.json 72bb7b2df330f8d5981f4c12b23429d8d874362d assets/create/models/block/cut_asurine_brick_stairs.json e753ba3830c51539565abbd9b49df9a34f97f2ff assets/create/models/block/cut_asurine_brick_stairs_inner.json ec9182d14517ffc71749e3e016e6546db79e6800 assets/create/models/block/cut_asurine_brick_stairs_outer.json +3b0b7bd63870ac19b9444ce9add9930ec9120821 assets/create/models/block/cut_asurine_bricks.json +89142424e1d702a0f2bc27829304520e48ee1eb3 assets/create/models/block/cut_asurine_bricks_wall_post.json +1f1fcf92e91b1f0d15ba389d6d25e1fba3ad8e5b assets/create/models/block/cut_asurine_bricks_wall_side.json +858d15aff53fe938304bafb52ef32e54e3d44a44 assets/create/models/block/cut_asurine_bricks_wall_side_tall.json b4512f7cef7cef0bc5f85cb955c2dec6de2cbb56 assets/create/models/block/cut_asurine_slab.json 7c1befdd97b1556e9658e968e705c9edbf1ed667 assets/create/models/block/cut_asurine_slab_top.json d04b8a8cf9a50aa7e0b068ceb9a5a2970abc81a7 assets/create/models/block/cut_asurine_stairs.json @@ -900,15 +900,15 @@ ac544a8f948119945aa21362ad26ed8b1c922b0d assets/create/models/block/cut_asurine_ a253210cba60f58e720598323bd0d9ed4c209b4d assets/create/models/block/cut_asurine_wall_side.json c0c2cc13288771699a80c5c80e8e35d352cea684 assets/create/models/block/cut_asurine_wall_side_tall.json a6b10dc7984d22cac7aa314d46ac0928a00e667b assets/create/models/block/cut_calcite.json -6230a499321b175fc441bb662e0655662b3597de assets/create/models/block/cut_calcite_bricks.json -be1462847e9001a062091162802fab2fe6737693 assets/create/models/block/cut_calcite_bricks_wall_post.json -6e6b34468a7a0786efe5f4ebd917a4640b4be6ae assets/create/models/block/cut_calcite_bricks_wall_side.json -8b10c0f4f17f3844cee6d514cc22ddc6cb056c8a assets/create/models/block/cut_calcite_bricks_wall_side_tall.json f046be4f44936946bd3cc2ad5549d112b2e60d97 assets/create/models/block/cut_calcite_brick_slab.json 64953ca8a302ecab9311c617f69e5dcf8c138718 assets/create/models/block/cut_calcite_brick_slab_top.json 19e1b342d05d3cd69c410952dc22507c3c988c15 assets/create/models/block/cut_calcite_brick_stairs.json 18317b0a8bab345abd779f5d43f9620b73df0e67 assets/create/models/block/cut_calcite_brick_stairs_inner.json 0631d4e1bdaf724752f2e55401eb7a54af705b56 assets/create/models/block/cut_calcite_brick_stairs_outer.json +6230a499321b175fc441bb662e0655662b3597de assets/create/models/block/cut_calcite_bricks.json +be1462847e9001a062091162802fab2fe6737693 assets/create/models/block/cut_calcite_bricks_wall_post.json +6e6b34468a7a0786efe5f4ebd917a4640b4be6ae assets/create/models/block/cut_calcite_bricks_wall_side.json +8b10c0f4f17f3844cee6d514cc22ddc6cb056c8a assets/create/models/block/cut_calcite_bricks_wall_side_tall.json 6b35e0f9e6a7e247bf38d8d6d911a2bcc53c2517 assets/create/models/block/cut_calcite_slab.json 0eec7692ee8e119c1258bdb7e852204771c2232d assets/create/models/block/cut_calcite_slab_top.json d07ebf8982e4947852da8b2b0052f6b6000d334f assets/create/models/block/cut_calcite_stairs.json @@ -918,15 +918,15 @@ e8b7b983168ad9f4f4fa1642ca20ff56621935db assets/create/models/block/cut_calcite_ 421e128177bb4dd51391e360f11ba83c5d891cd1 assets/create/models/block/cut_calcite_wall_side.json 5add4bde51bbdd7c229b05f4fabd8a769414fb79 assets/create/models/block/cut_calcite_wall_side_tall.json 2e93da554ea72b90a576bbc9230aea373d3aed0f assets/create/models/block/cut_crimsite.json -39d1a3cdd978c761bc0d67baaba82d11953fc2a0 assets/create/models/block/cut_crimsite_bricks.json -8614cb38c52447fea5245fcf295a951a977071c0 assets/create/models/block/cut_crimsite_bricks_wall_post.json -b0b16f4a2f6dd3f77ec4f65f05e9edb70a196316 assets/create/models/block/cut_crimsite_bricks_wall_side.json -ac41e5b092c6ed81d14004f9427b6151b88dc924 assets/create/models/block/cut_crimsite_bricks_wall_side_tall.json c2474a10109d0476a46d2a509fc1cd37cd52822d assets/create/models/block/cut_crimsite_brick_slab.json efeb149835a389409b7f94bc35765b0871ad7342 assets/create/models/block/cut_crimsite_brick_slab_top.json e5096a1bae43341bae5706f02cd6d564b5a82502 assets/create/models/block/cut_crimsite_brick_stairs.json af3c0018e5e12bbe0f118bc0174b6ca513ae58ae assets/create/models/block/cut_crimsite_brick_stairs_inner.json ed30baef426f2ccf158d87111c7b53f3600bc32a assets/create/models/block/cut_crimsite_brick_stairs_outer.json +39d1a3cdd978c761bc0d67baaba82d11953fc2a0 assets/create/models/block/cut_crimsite_bricks.json +8614cb38c52447fea5245fcf295a951a977071c0 assets/create/models/block/cut_crimsite_bricks_wall_post.json +b0b16f4a2f6dd3f77ec4f65f05e9edb70a196316 assets/create/models/block/cut_crimsite_bricks_wall_side.json +ac41e5b092c6ed81d14004f9427b6151b88dc924 assets/create/models/block/cut_crimsite_bricks_wall_side_tall.json a6cdd4b227210b7487b8431b8d76bbe490636b81 assets/create/models/block/cut_crimsite_slab.json 5c585dba4dbfa9ff0a22a84aa726260cffdeebeb assets/create/models/block/cut_crimsite_slab_top.json 91f60b4277ca48dabfb5d3eebb1ed64a2681a083 assets/create/models/block/cut_crimsite_stairs.json @@ -936,15 +936,15 @@ e6b39a0b1dbab462479fc60fab2efc6a9ceb6a55 assets/create/models/block/cut_crimsite 5b3783862e50fde6ffffc92068900afcc066002f assets/create/models/block/cut_crimsite_wall_side.json b59fbbfe9c6738b1f93f03d59a747f5610164c34 assets/create/models/block/cut_crimsite_wall_side_tall.json 144ec3864fb0a7981e74d357200a96033c75a2d6 assets/create/models/block/cut_deepslate.json -0d599ae1b4e9309f2a7b3362e86061e2150ba3ec assets/create/models/block/cut_deepslate_bricks.json -601894e096edbcd3d96ce0160f06e17a4efca819 assets/create/models/block/cut_deepslate_bricks_wall_post.json -42db46cb5c9c02d684c86f3a518feb3348d83fa0 assets/create/models/block/cut_deepslate_bricks_wall_side.json -c046436d59c350c6beb6b395675513c12184ffe2 assets/create/models/block/cut_deepslate_bricks_wall_side_tall.json af8c7c652e75bf904093bbafc1cf805f842a39c9 assets/create/models/block/cut_deepslate_brick_slab.json 2a01dd0244b07f28454c061a565d1028ca7e3066 assets/create/models/block/cut_deepslate_brick_slab_top.json 62d39eec3621204de82377e74936b9cd338e8004 assets/create/models/block/cut_deepslate_brick_stairs.json 5f90dfbb45b57bd894bf03fcc6c347cb525e3a73 assets/create/models/block/cut_deepslate_brick_stairs_inner.json 512d588c77bdf5a7232826e2f4ce4b3cb991d0ce assets/create/models/block/cut_deepslate_brick_stairs_outer.json +0d599ae1b4e9309f2a7b3362e86061e2150ba3ec assets/create/models/block/cut_deepslate_bricks.json +601894e096edbcd3d96ce0160f06e17a4efca819 assets/create/models/block/cut_deepslate_bricks_wall_post.json +42db46cb5c9c02d684c86f3a518feb3348d83fa0 assets/create/models/block/cut_deepslate_bricks_wall_side.json +c046436d59c350c6beb6b395675513c12184ffe2 assets/create/models/block/cut_deepslate_bricks_wall_side_tall.json c79ae6e97e94d36f2586865ea63f3fab43f8ccbc assets/create/models/block/cut_deepslate_slab.json 5978b93805ccf0bdd953938b34a8dd0ffdcf5565 assets/create/models/block/cut_deepslate_slab_top.json 06a508b2395c3f738d2c5651f366792ee9b9c5ec assets/create/models/block/cut_deepslate_stairs.json @@ -954,15 +954,15 @@ c2850e9f223c459ba53d575a1ef8231589c48c0b assets/create/models/block/cut_deepslat e901746d3e50fe7d9b79d268f4d02251d5cf95f4 assets/create/models/block/cut_deepslate_wall_side.json 1ef794aab31a10bf150a0015cd46e5b5f3c70042 assets/create/models/block/cut_deepslate_wall_side_tall.json 4abb502ea3f6764797641f55a2c48f4858be1ba6 assets/create/models/block/cut_diorite.json -e97babf115a4f81f8555994aba435cf76bebf7a3 assets/create/models/block/cut_diorite_bricks.json -4f7cf44e4d6431587266a4fac78c0812e99d780c assets/create/models/block/cut_diorite_bricks_wall_post.json -1f96f9e190d8e28496ce2db5712f33e449215985 assets/create/models/block/cut_diorite_bricks_wall_side.json -45246192d9cd39837b426e425fc5082422642b65 assets/create/models/block/cut_diorite_bricks_wall_side_tall.json ab61b1b94946f315006a29113f594c234d796bee assets/create/models/block/cut_diorite_brick_slab.json 73597772386c6bbd38907cbea8db816f174a9f8f assets/create/models/block/cut_diorite_brick_slab_top.json c9fbd953ef0789a0e9a915d5f283fd09a76784d6 assets/create/models/block/cut_diorite_brick_stairs.json 5d721f1b3f4376a91707b56950a1f9635adbe603 assets/create/models/block/cut_diorite_brick_stairs_inner.json 9a446bf02732e1873fa96d7745fced0fa04d48d6 assets/create/models/block/cut_diorite_brick_stairs_outer.json +e97babf115a4f81f8555994aba435cf76bebf7a3 assets/create/models/block/cut_diorite_bricks.json +4f7cf44e4d6431587266a4fac78c0812e99d780c assets/create/models/block/cut_diorite_bricks_wall_post.json +1f96f9e190d8e28496ce2db5712f33e449215985 assets/create/models/block/cut_diorite_bricks_wall_side.json +45246192d9cd39837b426e425fc5082422642b65 assets/create/models/block/cut_diorite_bricks_wall_side_tall.json 15195975e7e0ffb7010591b957a657f492e6d59d assets/create/models/block/cut_diorite_slab.json 01c320637843dc0d8b74b48b8d6946cd663d51f6 assets/create/models/block/cut_diorite_slab_top.json 7dcbfe4dc2ec62345da660ecc6ca44056fcd64e7 assets/create/models/block/cut_diorite_stairs.json @@ -972,15 +972,15 @@ c9fbd953ef0789a0e9a915d5f283fd09a76784d6 assets/create/models/block/cut_diorite_ 29075eaaba51ba158f030c2a9583ed5ba52379c8 assets/create/models/block/cut_diorite_wall_side.json 1fb50473359147c7147ea85bc1907e6015ce06bc assets/create/models/block/cut_diorite_wall_side_tall.json 59ee053a884bc9731b4d1b01ae22e0e2b5916cfb assets/create/models/block/cut_dripstone.json -6a4b26a117f58d0187b2cc0c5b117ef71d03d4e9 assets/create/models/block/cut_dripstone_bricks.json -0bb1fa8fb9698dae61096483a01b41bf829666b0 assets/create/models/block/cut_dripstone_bricks_wall_post.json -2019fdc38b401bac72e8344d118d85049ec3efb9 assets/create/models/block/cut_dripstone_bricks_wall_side.json -ebb790b2b6f47d40c92c9bba680e82cb8f054fa9 assets/create/models/block/cut_dripstone_bricks_wall_side_tall.json 84d714b29dcb7eb95a82de8d48491413e26d5fa8 assets/create/models/block/cut_dripstone_brick_slab.json 28b0b1a641d11f8ade57c444e4c1bfd9d617f66a assets/create/models/block/cut_dripstone_brick_slab_top.json 05900c156a6341c12b366790c7e8d15e59a873f0 assets/create/models/block/cut_dripstone_brick_stairs.json 35fb2c83dc89b96951c69253f7502f78c903a9b8 assets/create/models/block/cut_dripstone_brick_stairs_inner.json f69244c1706c95aaadd32d45a24c91ce0848509f assets/create/models/block/cut_dripstone_brick_stairs_outer.json +6a4b26a117f58d0187b2cc0c5b117ef71d03d4e9 assets/create/models/block/cut_dripstone_bricks.json +0bb1fa8fb9698dae61096483a01b41bf829666b0 assets/create/models/block/cut_dripstone_bricks_wall_post.json +2019fdc38b401bac72e8344d118d85049ec3efb9 assets/create/models/block/cut_dripstone_bricks_wall_side.json +ebb790b2b6f47d40c92c9bba680e82cb8f054fa9 assets/create/models/block/cut_dripstone_bricks_wall_side_tall.json 9e42cf588f57de5166f2a2ccdae656743c8b9481 assets/create/models/block/cut_dripstone_slab.json 0da2f782d8ad8fecd81b98c72db182b817bf19eb assets/create/models/block/cut_dripstone_slab_top.json b3c903a1edcd1786ea51a2ccdad5734a1d04ea98 assets/create/models/block/cut_dripstone_stairs.json @@ -990,15 +990,15 @@ b3c903a1edcd1786ea51a2ccdad5734a1d04ea98 assets/create/models/block/cut_dripston 7fab5102d7fa4cd824b9393425639d05727b2ad2 assets/create/models/block/cut_dripstone_wall_side.json c41514cda1c9f5d942d222cbc5f6e620e367afc6 assets/create/models/block/cut_dripstone_wall_side_tall.json dff602c8d2fcd1ceca79f90ae15dbdfbd6cb157d assets/create/models/block/cut_granite.json -31c5299a42f82992e50f711e1e33549c373bd034 assets/create/models/block/cut_granite_bricks.json -ef5a851e57cc4b9c0e625176b1256441e1c17c66 assets/create/models/block/cut_granite_bricks_wall_post.json -815e8dc551c3e813b0b2af29df23a28860de0b53 assets/create/models/block/cut_granite_bricks_wall_side.json -ba241f9c82e27dd98ba6f4e4180922388ab5d1a3 assets/create/models/block/cut_granite_bricks_wall_side_tall.json 9e00dc8fcee23548c0cebda6eadbcfc559e4c20b assets/create/models/block/cut_granite_brick_slab.json 5ad061096451f74e773c3030f96d59424aa93314 assets/create/models/block/cut_granite_brick_slab_top.json 94f8ce607aae5c04ccf9e56f177f9d69203ae879 assets/create/models/block/cut_granite_brick_stairs.json 11d511844fec3bfd05cac8b788332f2decd53021 assets/create/models/block/cut_granite_brick_stairs_inner.json 418eb6a2b52e748a26c2d1914c6c1de94106589f assets/create/models/block/cut_granite_brick_stairs_outer.json +31c5299a42f82992e50f711e1e33549c373bd034 assets/create/models/block/cut_granite_bricks.json +ef5a851e57cc4b9c0e625176b1256441e1c17c66 assets/create/models/block/cut_granite_bricks_wall_post.json +815e8dc551c3e813b0b2af29df23a28860de0b53 assets/create/models/block/cut_granite_bricks_wall_side.json +ba241f9c82e27dd98ba6f4e4180922388ab5d1a3 assets/create/models/block/cut_granite_bricks_wall_side_tall.json 81be5e86cbdaec4945d3ccaf6d376f69c49f40d6 assets/create/models/block/cut_granite_slab.json f72a14e7cf3dd7d93b4462a3bee49683353dfb57 assets/create/models/block/cut_granite_slab_top.json 33bf924f01aae3a7720475f4b32b3a637e69ee36 assets/create/models/block/cut_granite_stairs.json @@ -1008,15 +1008,15 @@ fb4969e562ad2039d3bad2dc57a6845d3243d453 assets/create/models/block/cut_granite_ 2972b40134bcb15950a0118306f0251ff5e377b7 assets/create/models/block/cut_granite_wall_side.json abbe71fd17dbb5f176553db2f6edf2f1f7d8974a assets/create/models/block/cut_granite_wall_side_tall.json 019d3c4ffb39e328b5458aee44fee90e0ecbd829 assets/create/models/block/cut_limestone.json -7eae0f9766506f713933bde9f301d2f7f2bbef13 assets/create/models/block/cut_limestone_bricks.json -817e8cf8956af36c70e4b4e30b5d141086d006dd assets/create/models/block/cut_limestone_bricks_wall_post.json -1291cacff1b0980e58b5702a84c9b87ac5ef835d assets/create/models/block/cut_limestone_bricks_wall_side.json -6c9bc8803fe17ac623bde56f85683dd2ff13c33e assets/create/models/block/cut_limestone_bricks_wall_side_tall.json c93f33ba39c62b10dfb94c6e1c339cd4fbebffae assets/create/models/block/cut_limestone_brick_slab.json b12a340897ba98ed732a91dbd4129db7a7188e68 assets/create/models/block/cut_limestone_brick_slab_top.json 3e90b32d95ad1cf7b8a16dae3c16724510d41490 assets/create/models/block/cut_limestone_brick_stairs.json b2e7311667d14b2aa8c00e207f69f76207226567 assets/create/models/block/cut_limestone_brick_stairs_inner.json aac619ec1fb8aa56f1752ad3f354f9cb128771f8 assets/create/models/block/cut_limestone_brick_stairs_outer.json +7eae0f9766506f713933bde9f301d2f7f2bbef13 assets/create/models/block/cut_limestone_bricks.json +817e8cf8956af36c70e4b4e30b5d141086d006dd assets/create/models/block/cut_limestone_bricks_wall_post.json +1291cacff1b0980e58b5702a84c9b87ac5ef835d assets/create/models/block/cut_limestone_bricks_wall_side.json +6c9bc8803fe17ac623bde56f85683dd2ff13c33e assets/create/models/block/cut_limestone_bricks_wall_side_tall.json adc21af1c07edaf0573cfd2c95ebe38e50f7282c assets/create/models/block/cut_limestone_slab.json 2d1ea8fc5c8ce5549c7f7888371b6612bf0f5301 assets/create/models/block/cut_limestone_slab_top.json c1416808a2178996be75e0a9c1cd45849fcd6646 assets/create/models/block/cut_limestone_stairs.json @@ -1026,15 +1026,15 @@ c1416808a2178996be75e0a9c1cd45849fcd6646 assets/create/models/block/cut_limeston 2b5e65e662069a5c59e702224778dd407f5d11dd assets/create/models/block/cut_limestone_wall_side.json 052f130fef646242acccbbed2b510add21e18921 assets/create/models/block/cut_limestone_wall_side_tall.json 66cb6054821d45a60ae4d4d1d904dbef0b9f7c0f assets/create/models/block/cut_ochrum.json -0a7e38e3ac32352c5b3ec56a8c26212dbbb637a3 assets/create/models/block/cut_ochrum_bricks.json -47d0c58dd190f1ea894a5ca40ea7efd54a845d3e assets/create/models/block/cut_ochrum_bricks_wall_post.json -b502b5b213996bce0a626d86414045c80921511e assets/create/models/block/cut_ochrum_bricks_wall_side.json -c3f27545b3b7654c3e7a2df6b482d1a9895ccae9 assets/create/models/block/cut_ochrum_bricks_wall_side_tall.json ce16ec490ae8a33671502804e0b45fc42b6f228f assets/create/models/block/cut_ochrum_brick_slab.json fcbee94fdbd96b0b3d4aa245c6c87443abd1de90 assets/create/models/block/cut_ochrum_brick_slab_top.json 827349ed3eb05f5fe700e8f5816bcd82d0347612 assets/create/models/block/cut_ochrum_brick_stairs.json aa81d4135400eb40f891f8c41fcf7fa516ef64f1 assets/create/models/block/cut_ochrum_brick_stairs_inner.json ecd7e1cb9cae717e35eeb58dbe482833e98f5ac0 assets/create/models/block/cut_ochrum_brick_stairs_outer.json +0a7e38e3ac32352c5b3ec56a8c26212dbbb637a3 assets/create/models/block/cut_ochrum_bricks.json +47d0c58dd190f1ea894a5ca40ea7efd54a845d3e assets/create/models/block/cut_ochrum_bricks_wall_post.json +b502b5b213996bce0a626d86414045c80921511e assets/create/models/block/cut_ochrum_bricks_wall_side.json +c3f27545b3b7654c3e7a2df6b482d1a9895ccae9 assets/create/models/block/cut_ochrum_bricks_wall_side_tall.json e23998f88eb77826f5e4d58f3f4bb41a2e09ea97 assets/create/models/block/cut_ochrum_slab.json cd14f1abe3d0c65fbdd052f4a8e0b8fc2a15ad0e assets/create/models/block/cut_ochrum_slab_top.json a751feb4b609df141f971e341b204e76379dcda7 assets/create/models/block/cut_ochrum_stairs.json @@ -1044,15 +1044,15 @@ bed6843e39e7e771f6de151dfab0586d3ebad58c assets/create/models/block/cut_ochrum_s df267fb690642cac139aaabefa9eab802f13ddc1 assets/create/models/block/cut_ochrum_wall_side.json ed363b80cc61cb4d0b6fad9da855a0543ecaccc9 assets/create/models/block/cut_ochrum_wall_side_tall.json a65a54a08d9cc3b45e2320482dc2d9e317dd4f3d assets/create/models/block/cut_scorchia.json -9c93a554ab680d7c98c648c16472b52cc2646c50 assets/create/models/block/cut_scorchia_bricks.json -615dc444bb677caa774a4e95686ac24ebe4ec6dc assets/create/models/block/cut_scorchia_bricks_wall_post.json -758a2ad6677f857fbe955c26853eadc7150c105a assets/create/models/block/cut_scorchia_bricks_wall_side.json -f918dfa0751589d18a3eb054c290f669b5c61308 assets/create/models/block/cut_scorchia_bricks_wall_side_tall.json a032cf0a77e4f416ed153b1ffa834c065a73b2ae assets/create/models/block/cut_scorchia_brick_slab.json 716fc6ef58c240b3e6b45acf08d6e1472fe38e7c assets/create/models/block/cut_scorchia_brick_slab_top.json b2870e5ba7c5d5053b3639bf0aa1771ee050810b assets/create/models/block/cut_scorchia_brick_stairs.json 3e8a815eabd1991039a8ad18cedc9c57f46cd097 assets/create/models/block/cut_scorchia_brick_stairs_inner.json 0a9dc3149e7219a70642c242cd86dce5ba5cf4cc assets/create/models/block/cut_scorchia_brick_stairs_outer.json +9c93a554ab680d7c98c648c16472b52cc2646c50 assets/create/models/block/cut_scorchia_bricks.json +615dc444bb677caa774a4e95686ac24ebe4ec6dc assets/create/models/block/cut_scorchia_bricks_wall_post.json +758a2ad6677f857fbe955c26853eadc7150c105a assets/create/models/block/cut_scorchia_bricks_wall_side.json +f918dfa0751589d18a3eb054c290f669b5c61308 assets/create/models/block/cut_scorchia_bricks_wall_side_tall.json a85c4d0467c6746a8ef9c6ac0167d3e16f307d4e assets/create/models/block/cut_scorchia_slab.json 23fd6c65ea83f7ca7ef67dd7faf902c4fa662d70 assets/create/models/block/cut_scorchia_slab_top.json e42329f6fa3aeb958d2349a5442856e9473dc6b5 assets/create/models/block/cut_scorchia_stairs.json @@ -1062,15 +1062,15 @@ b9a911675861fee414f82c745399a7707c258f77 assets/create/models/block/cut_scorchia e61af066960897d50dc7f7bc17f95baa962829bd assets/create/models/block/cut_scorchia_wall_side.json 846f84efddca7d51b58ebe5e3bbed78312fb052d assets/create/models/block/cut_scorchia_wall_side_tall.json ce9dcf5b7fe58a97fab832fb98b4f5b6d3778255 assets/create/models/block/cut_scoria.json -fa3ef2bb65299c985b70f6959421e243a9ebc6d8 assets/create/models/block/cut_scoria_bricks.json -24ea1a30f68a918e6737dc8d9babe4528af5716a assets/create/models/block/cut_scoria_bricks_wall_post.json -ba7ae110d51fe510566ab42f5ead299b4409f2b7 assets/create/models/block/cut_scoria_bricks_wall_side.json -f04d12bc4e0b939bb443abcc6eb808e66c352c66 assets/create/models/block/cut_scoria_bricks_wall_side_tall.json edf04cbfb19b6ce99c1b74a71d40cd40c8120551 assets/create/models/block/cut_scoria_brick_slab.json f05725fd6d2764b277f01985d0e2fcbd3bf4a41e assets/create/models/block/cut_scoria_brick_slab_top.json 4bccbaef9dd9a8322087d3feb973e14d740ff27a assets/create/models/block/cut_scoria_brick_stairs.json 13f3b55dfdd97e68a6d525166618477e5bcb336d assets/create/models/block/cut_scoria_brick_stairs_inner.json 465862fb20542cae723fd72818be73aec05dad60 assets/create/models/block/cut_scoria_brick_stairs_outer.json +fa3ef2bb65299c985b70f6959421e243a9ebc6d8 assets/create/models/block/cut_scoria_bricks.json +24ea1a30f68a918e6737dc8d9babe4528af5716a assets/create/models/block/cut_scoria_bricks_wall_post.json +ba7ae110d51fe510566ab42f5ead299b4409f2b7 assets/create/models/block/cut_scoria_bricks_wall_side.json +f04d12bc4e0b939bb443abcc6eb808e66c352c66 assets/create/models/block/cut_scoria_bricks_wall_side_tall.json aeef239ca6b0eee527f75091d11d4a947740416d assets/create/models/block/cut_scoria_slab.json 5dfda9fa8117d35ebc324a5c9cb026e206e3b936 assets/create/models/block/cut_scoria_slab_top.json dfe8dbdb6deca69d847ee46fedfefe2da98dc329 assets/create/models/block/cut_scoria_stairs.json @@ -1080,15 +1080,15 @@ e0b2a94ff4b3f1c1e4282c9c8eecf2583bd7c68e assets/create/models/block/cut_scoria_w cf18e3fde94e3ba611f430fe527a9042a57e6936 assets/create/models/block/cut_scoria_wall_side.json 92475d7758b2bf582c585c2aafa6510f330c6f45 assets/create/models/block/cut_scoria_wall_side_tall.json 9f6543d21d9c24a429aae00511e6dbf61caf8030 assets/create/models/block/cut_tuff.json -8b3d9fe37ab7fda79ea4d90f674c525350883ba0 assets/create/models/block/cut_tuff_bricks.json -6b80481e15ff3d6eb40a42128da883c2027e0074 assets/create/models/block/cut_tuff_bricks_wall_post.json -057a34015b49565cb9858a2eea995a446ac0cfd4 assets/create/models/block/cut_tuff_bricks_wall_side.json -9f20bd04ef163076db9a8bf83c20cc802b57ae60 assets/create/models/block/cut_tuff_bricks_wall_side_tall.json 8c16599fda76c38978a2faa14f842a68fbbe4b9c assets/create/models/block/cut_tuff_brick_slab.json 696036e5900bdbb366dd49f5df71a1e701fd8ee3 assets/create/models/block/cut_tuff_brick_slab_top.json 54d4603e36be86e88d9302d61eab81e76cac1bbc assets/create/models/block/cut_tuff_brick_stairs.json 0ebb41a1ce5bf4ca86cbaf95e83cd2edf8f309ea assets/create/models/block/cut_tuff_brick_stairs_inner.json 5d5ed291db4b4bca464717c7fcde682b33d71c3f assets/create/models/block/cut_tuff_brick_stairs_outer.json +8b3d9fe37ab7fda79ea4d90f674c525350883ba0 assets/create/models/block/cut_tuff_bricks.json +6b80481e15ff3d6eb40a42128da883c2027e0074 assets/create/models/block/cut_tuff_bricks_wall_post.json +057a34015b49565cb9858a2eea995a446ac0cfd4 assets/create/models/block/cut_tuff_bricks_wall_side.json +9f20bd04ef163076db9a8bf83c20cc802b57ae60 assets/create/models/block/cut_tuff_bricks_wall_side_tall.json f2a904b7943555e8ec9dcc07513ca1ad9af809c3 assets/create/models/block/cut_tuff_slab.json ea74bb8a69f6acbd520ac8922e147495e5f99f6f assets/create/models/block/cut_tuff_slab_top.json 0262700e59de947907a04fdea9974f9d7e5a22f2 assets/create/models/block/cut_tuff_stairs.json @@ -1098,15 +1098,15 @@ ea74bb8a69f6acbd520ac8922e147495e5f99f6f assets/create/models/block/cut_tuff_sla 8c6492dc9e09359e5bac67ae4d473cffc8f93dbb assets/create/models/block/cut_tuff_wall_side.json f5f24066b6281303f52e25745881d5bca8c49c54 assets/create/models/block/cut_tuff_wall_side_tall.json 167e9a084987bcf7f67f655d0de88ae8ca2fcebb assets/create/models/block/cut_veridium.json -f8ab87c34f211a63525f6d386397face67460f8c assets/create/models/block/cut_veridium_bricks.json -e4e717fa8412032e184aebd1186470f41a2089c0 assets/create/models/block/cut_veridium_bricks_wall_post.json -8c40ccb8f10ef8dcda1bef46ad3490f697d178d2 assets/create/models/block/cut_veridium_bricks_wall_side.json -2c4671c66d904e15883ec3a14681b97ac537135c assets/create/models/block/cut_veridium_bricks_wall_side_tall.json 07c330c501375d5c316677edee80fb040c0fc237 assets/create/models/block/cut_veridium_brick_slab.json 4c8c660afe72e8ce9eaef53a37fdc63eb0c69513 assets/create/models/block/cut_veridium_brick_slab_top.json f802e4ae758e2c37c3129594ce4f5d9ffcfe173d assets/create/models/block/cut_veridium_brick_stairs.json 0d60d5cd0269e05816d28fcbbd2c680fe60cd316 assets/create/models/block/cut_veridium_brick_stairs_inner.json 22656f90b55aeaeeffa448b5f061fb26b5de7b0f assets/create/models/block/cut_veridium_brick_stairs_outer.json +f8ab87c34f211a63525f6d386397face67460f8c assets/create/models/block/cut_veridium_bricks.json +e4e717fa8412032e184aebd1186470f41a2089c0 assets/create/models/block/cut_veridium_bricks_wall_post.json +8c40ccb8f10ef8dcda1bef46ad3490f697d178d2 assets/create/models/block/cut_veridium_bricks_wall_side.json +2c4671c66d904e15883ec3a14681b97ac537135c assets/create/models/block/cut_veridium_bricks_wall_side_tall.json d736230e9b49a9fd40bc8f31df4d5144cdb429c8 assets/create/models/block/cut_veridium_slab.json 750e536c7b71dfb3a005d9b7a128ac435461e57f assets/create/models/block/cut_veridium_slab_top.json 8b05c19560e97ce15a66202717e3d32f6ee153a9 assets/create/models/block/cut_veridium_stairs.json @@ -1136,22 +1136,25 @@ db89bc32d0e466bc5008aa7091c682ba3aeec611 assets/create/models/block/diorite_pill a21387ab955f2b91e402b2189145f5fd6623592d assets/create/models/block/diorite_pillar_horizontal.json 44af455badc2b35a763007bba3537bda7d0ac289 assets/create/models/block/dripstone_pillar.json 1e23e3758e3311d0063c83742abb750a05021075 assets/create/models/block/dripstone_pillar_horizontal.json -19a773f91c58c49301f35965bac02d0c05fb2764 assets/create/models/block/exposed_copper_shingles.json a3420b91fdebec40e508a5eebb145c0201bd80c8 assets/create/models/block/exposed_copper_shingle_slab.json 4178ea5e50ee17b3c15f4a59efd019c4a19bb892 assets/create/models/block/exposed_copper_shingle_slab_top.json dd2d747774abc86e428a883e299db66cded78e11 assets/create/models/block/exposed_copper_shingle_stairs.json b6845da62d96a33cee624bb70360e256b26eda83 assets/create/models/block/exposed_copper_shingle_stairs_inner.json 3d8b758e50e75c5adc26ab6f39f9d73f00866673 assets/create/models/block/exposed_copper_shingle_stairs_outer.json -9cb20c9d41629d8b9426cb65829365d10966338f assets/create/models/block/exposed_copper_tiles.json +19a773f91c58c49301f35965bac02d0c05fb2764 assets/create/models/block/exposed_copper_shingles.json cd21d9d2935b6d0103502e2731c11ea27ff64ecf assets/create/models/block/exposed_copper_tile_slab.json 0ec039ba59fb0028183433e52131ff355ace5bff assets/create/models/block/exposed_copper_tile_slab_top.json c51dbd34996ac4513234800e427ac308067d5e1d assets/create/models/block/exposed_copper_tile_stairs.json 68772d4352dc7ade995dfa57ba41a38ef819e855 assets/create/models/block/exposed_copper_tile_stairs_inner.json d932671822ba93b71a9c8b50e7207803a1c4dbab assets/create/models/block/exposed_copper_tile_stairs_outer.json +9cb20c9d41629d8b9426cb65829365d10966338f assets/create/models/block/exposed_copper_tiles.json 2d1ade82820569936fd3021a877283474ced09d0 assets/create/models/block/fake_track.json 9e41f0b90dd1e71766c9d07bdb75d1e553f3392f assets/create/models/block/fluid_pipe/d_x.json 13507730f6ca6462c4cfeddc46e5b21e93fb1287 assets/create/models/block/fluid_pipe/d_y.json 84c09934d3537343a1226389993dabfa850b745e assets/create/models/block/fluid_pipe/d_z.json +b8fd54e514bd50fb287c6b758647818c6b08ef75 assets/create/models/block/fluid_pipe/l_x.json +e985ff9dbe7324cf69ab38e6e9e85c9b554af56c assets/create/models/block/fluid_pipe/l_y.json +e24957d63bac1e754fcc1647a4a86337a67f6298 assets/create/models/block/fluid_pipe/l_z.json eacc5ee5f164ccc7c13cfbbd37a92b401222debe assets/create/models/block/fluid_pipe/ld_x.json 33fc0ecce85fae051c54d5a538793d7081238894 assets/create/models/block/fluid_pipe/ld_y.json 638f1a259cabed1f8d63c6fdaa6d4d4dff539e7d assets/create/models/block/fluid_pipe/ld_z.json @@ -1161,24 +1164,21 @@ c52521cd566294c797312104284ddd343fad9c2e assets/create/models/block/fluid_pipe/l 99637310d3ca1ccfbe62b03aa9b0d82a0cf6f724 assets/create/models/block/fluid_pipe/lu_x.json 986800d441e95553464d1869d39baf456f5d70dc assets/create/models/block/fluid_pipe/lu_y.json 11dcf7d2dcd0df9b043035cb072deee96ab9e6da assets/create/models/block/fluid_pipe/lu_z.json -b8fd54e514bd50fb287c6b758647818c6b08ef75 assets/create/models/block/fluid_pipe/l_x.json -e985ff9dbe7324cf69ab38e6e9e85c9b554af56c assets/create/models/block/fluid_pipe/l_y.json -e24957d63bac1e754fcc1647a4a86337a67f6298 assets/create/models/block/fluid_pipe/l_z.json +d44ff2aed71039a7d0ff913d0d9e8398e1318f39 assets/create/models/block/fluid_pipe/r_x.json +92d4044b51a90da0b2277b0613c7ca0bb80c66fe assets/create/models/block/fluid_pipe/r_y.json +fb9a23de00ef4edb4f7e24fb60de345cd12e513f assets/create/models/block/fluid_pipe/r_z.json bde9ec36b86113a6ca7a51a4f405994460a2eb56 assets/create/models/block/fluid_pipe/rd_x.json bd325f5b37ff08328ddddeeceac1a41be586d20a assets/create/models/block/fluid_pipe/rd_y.json 28f351fd215af3a991ccd9aa05c57b9cd9e6f58d assets/create/models/block/fluid_pipe/rd_z.json 1ff3ea321aeacca70709eb76370c11c7f13163b6 assets/create/models/block/fluid_pipe/ru_x.json 95bc5342fd3909981430c2e13ef98cdbd8f02709 assets/create/models/block/fluid_pipe/ru_y.json e1fc0d1297a83749ac55f51c9cf33ff2ecc9fdc2 assets/create/models/block/fluid_pipe/ru_z.json -d44ff2aed71039a7d0ff913d0d9e8398e1318f39 assets/create/models/block/fluid_pipe/r_x.json -92d4044b51a90da0b2277b0613c7ca0bb80c66fe assets/create/models/block/fluid_pipe/r_y.json -fb9a23de00ef4edb4f7e24fb60de345cd12e513f assets/create/models/block/fluid_pipe/r_z.json -65a41f4b680af197776e03cae6f1815b6d04def2 assets/create/models/block/fluid_pipe/ud_x.json -26398801d89889ffe17b6513b786d27707f6a480 assets/create/models/block/fluid_pipe/ud_y.json -07747cc2b936e1b326bae7ac32a8a5ba77fdffa9 assets/create/models/block/fluid_pipe/ud_z.json 4e3debb2ba60398a0730866f781e0455f4316610 assets/create/models/block/fluid_pipe/u_x.json 0f98b30ba09706b8a5ee09aeef912b39acea0216 assets/create/models/block/fluid_pipe/u_y.json 83bf9b1af633c319c051055170debff4cc3508c0 assets/create/models/block/fluid_pipe/u_z.json +65a41f4b680af197776e03cae6f1815b6d04def2 assets/create/models/block/fluid_pipe/ud_x.json +26398801d89889ffe17b6513b786d27707f6a480 assets/create/models/block/fluid_pipe/ud_y.json +07747cc2b936e1b326bae7ac32a8a5ba77fdffa9 assets/create/models/block/fluid_pipe/ud_z.json 5f70af15ec2569c68a17d31024c7a37cb5c68c7e assets/create/models/block/framed_glass.json f0100e1d44146b256998fbd2af05da80d147e8d9 assets/create/models/block/framed_glass_pane_noside.json 4a032c6ae3f459e3349c2a2218da186170c31e03 assets/create/models/block/framed_glass_pane_noside_alt.json @@ -1269,9 +1269,6 @@ d1813d0f548fcddb361df7cc3b5d97582842b10f assets/create/models/block/light_gray_s debf78f20659bc3c637299a40b649cbe4aa30ebf assets/create/models/block/light_gray_table_cloth.json 4ec5d701dd8b2d8c3dc44d05f527a3d737002cd4 assets/create/models/block/light_gray_toolbox.json adb8dbed70419e0310e7a20f3656bf325b348434 assets/create/models/block/light_gray_valve_handle.json -8f53caad3899a30be5087a0ba155080834418cc0 assets/create/models/block/limestone.json -2b80f9421c2fe902d55d9bd95183ad4bae46c315 assets/create/models/block/limestone_pillar.json -fb18280a2a708f60b00cc7c675804c219784871a assets/create/models/block/limestone_pillar_horizontal.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/lime_nixie_tube.json 952d292d4dc2158e6106c5079cfa1ddb81c7777e assets/create/models/block/lime_postbox_closed.json 4357f5d9102d54c7fbe5325512a2cd42d94d6d42 assets/create/models/block/lime_postbox_open.json @@ -1280,6 +1277,9 @@ fb18280a2a708f60b00cc7c675804c219784871a assets/create/models/block/limestone_pi e4142a22c20d6e5b9a8b9f96c13d4e5f96adc59d assets/create/models/block/lime_table_cloth.json b92822a01e4fbed2463b1bdf7dcc736023988e20 assets/create/models/block/lime_toolbox.json 802b47f34b1053b7af980b08b6511f468e7dd7c1 assets/create/models/block/lime_valve_handle.json +8f53caad3899a30be5087a0ba155080834418cc0 assets/create/models/block/limestone.json +2b80f9421c2fe902d55d9bd95183ad4bae46c315 assets/create/models/block/limestone_pillar.json +fb18280a2a708f60b00cc7c675804c219784871a assets/create/models/block/limestone_pillar_horizontal.json 84b9ac6eafdbd037f3ff558c250a8b8952415af1 assets/create/models/block/linear_chassis.json 29ee936c09c1222c6a144e5bb39577b5a9cd28bf assets/create/models/block/linear_chassis_bottom.json a1a3804ddcb1db0a7b5c0693555f8eb326950dd0 assets/create/models/block/linear_chassis_top.json @@ -1325,18 +1325,18 @@ f9010894858512398bddd5d31b922e12594d2e3c assets/create/models/block/ornate_iron_ 92637fbd6bf54891411b32a494064b9a48e59411 assets/create/models/block/ornate_iron_window_pane_post.json 8416d497e7fc8ca4f9f4c608ccc0651036850256 assets/create/models/block/ornate_iron_window_pane_side.json 1cdaa9d4bd23f7b1eb14672dc9322d9dad966502 assets/create/models/block/ornate_iron_window_pane_side_alt.json -561beafce41b9e9c0b07bc6b7176dd4f6918c116 assets/create/models/block/oxidized_copper_shingles.json 7e0bab8109e322c6db5fe1d5999c06536c21c6eb assets/create/models/block/oxidized_copper_shingle_slab.json 42df32c4e2d1ffb2ee62748becfd1717118b440c assets/create/models/block/oxidized_copper_shingle_slab_top.json b55a733e3e68cfbd08d45bb9ac56deef9f728b60 assets/create/models/block/oxidized_copper_shingle_stairs.json 7b8745213af5aa7938fc04a295be6a087c72daa8 assets/create/models/block/oxidized_copper_shingle_stairs_inner.json d89419d48d6ee2f6747e7c93de8699db22ea3f59 assets/create/models/block/oxidized_copper_shingle_stairs_outer.json -5cf92b628ff1f832966138a58ed87d747681274c assets/create/models/block/oxidized_copper_tiles.json +561beafce41b9e9c0b07bc6b7176dd4f6918c116 assets/create/models/block/oxidized_copper_shingles.json ad6134598869711a12e2f95c9b5f25a0f7b8dd93 assets/create/models/block/oxidized_copper_tile_slab.json c17bac0fd6a20540813c6a1c000a553b7c5ac849 assets/create/models/block/oxidized_copper_tile_slab_top.json d5b30340364f5536e46bc67e777ef4fa20a36e04 assets/create/models/block/oxidized_copper_tile_stairs.json b40b315c23cbd3eb4658518bfac836f6091321a5 assets/create/models/block/oxidized_copper_tile_stairs_inner.json f4eaadab29b4f2e915237340e2d6f4aad4ba21d6 assets/create/models/block/oxidized_copper_tile_stairs_outer.json +5cf92b628ff1f832966138a58ed87d747681274c assets/create/models/block/oxidized_copper_tiles.json f8b51eec36c2eddc08a1b60894d863bb58f55625 assets/create/models/block/peculiar_bell_ceiling.json f70f83cfec770879c478eea3760ea187700f2878 assets/create/models/block/peculiar_bell_double_wall.json b9c9d00b844ca2f217ae21cc502cd4d082fed2d5 assets/create/models/block/peculiar_bell_floor.json @@ -1543,133 +1543,133 @@ ff52eb59dadfe675e416440f3115856a501428a6 assets/create/models/block/scoria.json 4d7d36f974d25a310db2f75800e8c7e0377881c6 assets/create/models/block/secondary_linear_chassis_top.json 5ecb821ac06873015d2d7ebcfb7e1f5fe85cf504 assets/create/models/block/secondary_linear_chassis_top_bottom.json e697898a0ec4c308314a4e0b7235fa0a9229da45 assets/create/models/block/shadow_steel_casing.json -73edb947b52c73e85a83422853d0b8a0fb34e82b assets/create/models/block/small_andesite_bricks.json -3bb5c8413b9e81a1adc339f873f37eb656904e06 assets/create/models/block/small_andesite_bricks_wall_post.json -0e70d94fc6ffdc0fd4a50a5910bc1455b401982f assets/create/models/block/small_andesite_bricks_wall_side.json -597fec784e40c1ff3b622824c32773d6d271f3b7 assets/create/models/block/small_andesite_bricks_wall_side_tall.json 593b962350c8de53156901b308617c6a246afa09 assets/create/models/block/small_andesite_brick_slab.json c83de8118653ccdce92a1b7f3501bf7359e0b310 assets/create/models/block/small_andesite_brick_slab_top.json f019380bcc81d52681e2beaf63e2b11836c45922 assets/create/models/block/small_andesite_brick_stairs.json 4fa72fe0115ad9ec83837852a2b2e2d22dde19ca assets/create/models/block/small_andesite_brick_stairs_inner.json f80f485f62dce86e98815b343c89e96b10623e53 assets/create/models/block/small_andesite_brick_stairs_outer.json -4750724972cbac6d7dac31e0689681eab6c37093 assets/create/models/block/small_asurine_bricks.json -407c7bea509bb0e9bf9f04e947ace584103d012d assets/create/models/block/small_asurine_bricks_wall_post.json -60491dfb4f2a6b78effdf18612b9a1cd7d930d8a assets/create/models/block/small_asurine_bricks_wall_side.json -e5d3172c08b65696a6d72220495463636d8b352c assets/create/models/block/small_asurine_bricks_wall_side_tall.json +73edb947b52c73e85a83422853d0b8a0fb34e82b assets/create/models/block/small_andesite_bricks.json +3bb5c8413b9e81a1adc339f873f37eb656904e06 assets/create/models/block/small_andesite_bricks_wall_post.json +0e70d94fc6ffdc0fd4a50a5910bc1455b401982f assets/create/models/block/small_andesite_bricks_wall_side.json +597fec784e40c1ff3b622824c32773d6d271f3b7 assets/create/models/block/small_andesite_bricks_wall_side_tall.json cdd354726eda82d83dc89871fa587b8c07b02a16 assets/create/models/block/small_asurine_brick_slab.json 7bdb6ed1e74437d083bca7d89c0d1b7c81e80b53 assets/create/models/block/small_asurine_brick_slab_top.json 086b9d4284d343967a582fd0a7d194bafd980e13 assets/create/models/block/small_asurine_brick_stairs.json db69f1580ca405b9a99f0e4ea8d9b9950ed6444e assets/create/models/block/small_asurine_brick_stairs_inner.json dd572cbff713b0f4830aef0bf3ba4adb80ee9908 assets/create/models/block/small_asurine_brick_stairs_outer.json -c2c72734ac526c319cb01e982824680bfb5f1186 assets/create/models/block/small_calcite_bricks.json -f17f2ecd5e5a32f92ec0ad0ba9e861a80432c0f2 assets/create/models/block/small_calcite_bricks_wall_post.json -1ad7654125aff67267567c0007cc03b8a15131b0 assets/create/models/block/small_calcite_bricks_wall_side.json -10c339f64c0e78f4fbb7a95c10bf7f9f399c0c6b assets/create/models/block/small_calcite_bricks_wall_side_tall.json +4750724972cbac6d7dac31e0689681eab6c37093 assets/create/models/block/small_asurine_bricks.json +407c7bea509bb0e9bf9f04e947ace584103d012d assets/create/models/block/small_asurine_bricks_wall_post.json +60491dfb4f2a6b78effdf18612b9a1cd7d930d8a assets/create/models/block/small_asurine_bricks_wall_side.json +e5d3172c08b65696a6d72220495463636d8b352c assets/create/models/block/small_asurine_bricks_wall_side_tall.json d07c57748981a54ffcdadc30ec21f728a3557bea assets/create/models/block/small_calcite_brick_slab.json 9a5e6a93328ad35b256b2512c28e683a74e807a9 assets/create/models/block/small_calcite_brick_slab_top.json c3d39e013dd0142f044f8f0a90de849a0d961e84 assets/create/models/block/small_calcite_brick_stairs.json 4e47a4708dafc0ea476e2d5b6567acfdc2c5c148 assets/create/models/block/small_calcite_brick_stairs_inner.json 6a41c44680a958299a787d8c8c8778d52167cd65 assets/create/models/block/small_calcite_brick_stairs_outer.json -485f6c0e37b24124ff23efa3f0caa2cfe85663dd assets/create/models/block/small_crimsite_bricks.json -57b050751e68c9a881d9598cfe8dfb45f19df08c assets/create/models/block/small_crimsite_bricks_wall_post.json -cb01f90c7ac1f56a6f79e1fecb126c349b6d53b0 assets/create/models/block/small_crimsite_bricks_wall_side.json -80932617b1d4b718071c1f8558398ba881743892 assets/create/models/block/small_crimsite_bricks_wall_side_tall.json +c2c72734ac526c319cb01e982824680bfb5f1186 assets/create/models/block/small_calcite_bricks.json +f17f2ecd5e5a32f92ec0ad0ba9e861a80432c0f2 assets/create/models/block/small_calcite_bricks_wall_post.json +1ad7654125aff67267567c0007cc03b8a15131b0 assets/create/models/block/small_calcite_bricks_wall_side.json +10c339f64c0e78f4fbb7a95c10bf7f9f399c0c6b assets/create/models/block/small_calcite_bricks_wall_side_tall.json 827867ddd9b5f6e2daa916c968531c7183ce7fa2 assets/create/models/block/small_crimsite_brick_slab.json dd19ebdbd1a2de827d467b0abd2d1d3ee5822305 assets/create/models/block/small_crimsite_brick_slab_top.json 58048cb41b740b008a98420ea93b567f38e2910f assets/create/models/block/small_crimsite_brick_stairs.json a943586885ea7d48fc27595d9741f97d852446e7 assets/create/models/block/small_crimsite_brick_stairs_inner.json 8dc173b8a9912341ccb9cd8c9a0d2d893571eb85 assets/create/models/block/small_crimsite_brick_stairs_outer.json -cd855b25c38be2c36dcbf6ab0d963a2c76043171 assets/create/models/block/small_deepslate_bricks.json -88a6c43f64c6d53b34719f41707622635108342b assets/create/models/block/small_deepslate_bricks_wall_post.json -dea1773ca9baf9e1a6a7a4288d348127b858c42d assets/create/models/block/small_deepslate_bricks_wall_side.json -673ab543b38a597fd74285cd25b8004c9e2bd706 assets/create/models/block/small_deepslate_bricks_wall_side_tall.json +485f6c0e37b24124ff23efa3f0caa2cfe85663dd assets/create/models/block/small_crimsite_bricks.json +57b050751e68c9a881d9598cfe8dfb45f19df08c assets/create/models/block/small_crimsite_bricks_wall_post.json +cb01f90c7ac1f56a6f79e1fecb126c349b6d53b0 assets/create/models/block/small_crimsite_bricks_wall_side.json +80932617b1d4b718071c1f8558398ba881743892 assets/create/models/block/small_crimsite_bricks_wall_side_tall.json 67c78a3e9250351d0ea18538640b596f05e957a4 assets/create/models/block/small_deepslate_brick_slab.json bc1af783fbcbe73df05e12c93625035db8089d16 assets/create/models/block/small_deepslate_brick_slab_top.json 91e00675337592d17a04032808ca64c4a159c814 assets/create/models/block/small_deepslate_brick_stairs.json 39e78262242637628628a07dc47908fb1593d3f2 assets/create/models/block/small_deepslate_brick_stairs_inner.json d7a61bc4c84070e0fd53e0957a5282078daff7f1 assets/create/models/block/small_deepslate_brick_stairs_outer.json -73e801fb607d76b42e1862323e9d149910a68298 assets/create/models/block/small_diorite_bricks.json -2bdb593d3ae4d856e96cc877f4927da25841af54 assets/create/models/block/small_diorite_bricks_wall_post.json -dd064be7962a2418784a513725fc7b5835e4ab40 assets/create/models/block/small_diorite_bricks_wall_side.json -3753c64785d74f1997b9f8f856fa873302621f39 assets/create/models/block/small_diorite_bricks_wall_side_tall.json +cd855b25c38be2c36dcbf6ab0d963a2c76043171 assets/create/models/block/small_deepslate_bricks.json +88a6c43f64c6d53b34719f41707622635108342b assets/create/models/block/small_deepslate_bricks_wall_post.json +dea1773ca9baf9e1a6a7a4288d348127b858c42d assets/create/models/block/small_deepslate_bricks_wall_side.json +673ab543b38a597fd74285cd25b8004c9e2bd706 assets/create/models/block/small_deepslate_bricks_wall_side_tall.json 59fc1d9dac0b6867779346413953174fc6b55d3c assets/create/models/block/small_diorite_brick_slab.json cbd6fe711e1203aa746d86d12bb85016b7142749 assets/create/models/block/small_diorite_brick_slab_top.json a6c823fa96ba8a06d101ca96a6898fe8a1faf83e assets/create/models/block/small_diorite_brick_stairs.json 7f128501d989122df9d2ab002a497356831caa1c assets/create/models/block/small_diorite_brick_stairs_inner.json 26222975b0efb2acea6473d0bcc99453aa9ed561 assets/create/models/block/small_diorite_brick_stairs_outer.json -7f55f9c8cae6a79a9ab22a4b593a2c5829390573 assets/create/models/block/small_dripstone_bricks.json -fd0880b2e55435c8dc6945fa71c67ba34d7b1e69 assets/create/models/block/small_dripstone_bricks_wall_post.json -c00e9c0bfb108b70975514694f38d3c4cd63e819 assets/create/models/block/small_dripstone_bricks_wall_side.json -26382c01766e04cfe7ea585cabc1baa1c409e0a0 assets/create/models/block/small_dripstone_bricks_wall_side_tall.json +73e801fb607d76b42e1862323e9d149910a68298 assets/create/models/block/small_diorite_bricks.json +2bdb593d3ae4d856e96cc877f4927da25841af54 assets/create/models/block/small_diorite_bricks_wall_post.json +dd064be7962a2418784a513725fc7b5835e4ab40 assets/create/models/block/small_diorite_bricks_wall_side.json +3753c64785d74f1997b9f8f856fa873302621f39 assets/create/models/block/small_diorite_bricks_wall_side_tall.json 7b18bb56d4509f490a73b2812a8e40333f400369 assets/create/models/block/small_dripstone_brick_slab.json 39b7aa7d1494e5328e8774acb8adec8a346e972f assets/create/models/block/small_dripstone_brick_slab_top.json 3d265aed7a723713d525d0fabf3a70600d9d60e4 assets/create/models/block/small_dripstone_brick_stairs.json 2be41e9c1367af7f0eb99856e35900df96974bd4 assets/create/models/block/small_dripstone_brick_stairs_inner.json 4026a9327d47d55218b00b0b4b92464b6448ad91 assets/create/models/block/small_dripstone_brick_stairs_outer.json -ad4cf29e0e67d0d202d5836486531551909c71bf assets/create/models/block/small_granite_bricks.json -d20963cbb5d2321a069bf42d203855a5584f8607 assets/create/models/block/small_granite_bricks_wall_post.json -b860879b66d2d23349fa95ff644d9eba21eb29bd assets/create/models/block/small_granite_bricks_wall_side.json -11593a2a0e307b3e1d847c84d8c61bc78fef2967 assets/create/models/block/small_granite_bricks_wall_side_tall.json +7f55f9c8cae6a79a9ab22a4b593a2c5829390573 assets/create/models/block/small_dripstone_bricks.json +fd0880b2e55435c8dc6945fa71c67ba34d7b1e69 assets/create/models/block/small_dripstone_bricks_wall_post.json +c00e9c0bfb108b70975514694f38d3c4cd63e819 assets/create/models/block/small_dripstone_bricks_wall_side.json +26382c01766e04cfe7ea585cabc1baa1c409e0a0 assets/create/models/block/small_dripstone_bricks_wall_side_tall.json cb0a72cedb6b2b043eaf8c8869648802d74a2eeb assets/create/models/block/small_granite_brick_slab.json d635840492541787d55cc005c7e207532edcdef3 assets/create/models/block/small_granite_brick_slab_top.json ba9bfedf5854fccaba8a5e60c26efb6e34ede3cd assets/create/models/block/small_granite_brick_stairs.json 9bebe59176e74926e28a139dc557c25283285e89 assets/create/models/block/small_granite_brick_stairs_inner.json 15d71900e76c131285447628e63bf1479ce7025a assets/create/models/block/small_granite_brick_stairs_outer.json -6224f2763224d3e746dafdaaf14fae68e2469b93 assets/create/models/block/small_limestone_bricks.json -ca038e240e4157897a6273692db2c952ab5b17d7 assets/create/models/block/small_limestone_bricks_wall_post.json -7920f8cfda77b22d4d29638faa6ae07d89e51ab3 assets/create/models/block/small_limestone_bricks_wall_side.json -6e1fa27744f4592111945e5cafee6d7d67b5299b assets/create/models/block/small_limestone_bricks_wall_side_tall.json +ad4cf29e0e67d0d202d5836486531551909c71bf assets/create/models/block/small_granite_bricks.json +d20963cbb5d2321a069bf42d203855a5584f8607 assets/create/models/block/small_granite_bricks_wall_post.json +b860879b66d2d23349fa95ff644d9eba21eb29bd assets/create/models/block/small_granite_bricks_wall_side.json +11593a2a0e307b3e1d847c84d8c61bc78fef2967 assets/create/models/block/small_granite_bricks_wall_side_tall.json 0e0f551bac87421e6b693aa9ca98fd5da2ee168b assets/create/models/block/small_limestone_brick_slab.json 6669c1e87ed79097f96e7e46eecf3ab6e7c9778c assets/create/models/block/small_limestone_brick_slab_top.json 5aff0145d2fc89549ac541db325dda25b8941583 assets/create/models/block/small_limestone_brick_stairs.json 250aa2c237a9532b19621fa604027433183961c3 assets/create/models/block/small_limestone_brick_stairs_inner.json 92da57d330e9905d017705dd931af1d1d6c1a00d assets/create/models/block/small_limestone_brick_stairs_outer.json -242e4f39f6df26917f21899f0c7d0415a166d4b9 assets/create/models/block/small_ochrum_bricks.json -06cb9faca0062947c08b2a7309a958aac5ab24ac assets/create/models/block/small_ochrum_bricks_wall_post.json -8d9d53206e222839333026c779b66b9fd8cf2cf9 assets/create/models/block/small_ochrum_bricks_wall_side.json -f412fbaa509f7b2d47a27d4bcb13590bfcae74ca assets/create/models/block/small_ochrum_bricks_wall_side_tall.json +6224f2763224d3e746dafdaaf14fae68e2469b93 assets/create/models/block/small_limestone_bricks.json +ca038e240e4157897a6273692db2c952ab5b17d7 assets/create/models/block/small_limestone_bricks_wall_post.json +7920f8cfda77b22d4d29638faa6ae07d89e51ab3 assets/create/models/block/small_limestone_bricks_wall_side.json +6e1fa27744f4592111945e5cafee6d7d67b5299b assets/create/models/block/small_limestone_bricks_wall_side_tall.json 517e3605a9e86a07c673e18d94c2c37109a2aef5 assets/create/models/block/small_ochrum_brick_slab.json 855ad9f6fe03ceb2cc33d9df3536cb4394acfa9b assets/create/models/block/small_ochrum_brick_slab_top.json c5fc35d6b0fe96c11537bc10d34a63ef80f3270c assets/create/models/block/small_ochrum_brick_stairs.json 9a2631d9f6821d2c01bc8b2588a69702d3b083cc assets/create/models/block/small_ochrum_brick_stairs_inner.json 1f0ccdef29dae18535ea304e954e06c91bb0620b assets/create/models/block/small_ochrum_brick_stairs_outer.json +242e4f39f6df26917f21899f0c7d0415a166d4b9 assets/create/models/block/small_ochrum_bricks.json +06cb9faca0062947c08b2a7309a958aac5ab24ac assets/create/models/block/small_ochrum_bricks_wall_post.json +8d9d53206e222839333026c779b66b9fd8cf2cf9 assets/create/models/block/small_ochrum_bricks_wall_side.json +f412fbaa509f7b2d47a27d4bcb13590bfcae74ca assets/create/models/block/small_ochrum_bricks_wall_side_tall.json be96f070be1f838c6fb442c164b5f9b4e5cfcee5 assets/create/models/block/small_rose_quartz_tiles.json -41e56d8e334b81a0d5270bdbe87617981e1f98b4 assets/create/models/block/small_scorchia_bricks.json -56aa81e05019533ce0e0f1ee3ef7bf20fcc400b4 assets/create/models/block/small_scorchia_bricks_wall_post.json -1e1fa90c8b144813770c4d53a3b734ae450895d6 assets/create/models/block/small_scorchia_bricks_wall_side.json -6a46cf73c03a2abea25a81dbb28f4150b355900c assets/create/models/block/small_scorchia_bricks_wall_side_tall.json 6aa3825ace2e73bec454aaa8597e3a892ee29eb7 assets/create/models/block/small_scorchia_brick_slab.json f0378625001171c449a403e372e59623f0fc6569 assets/create/models/block/small_scorchia_brick_slab_top.json 49fa4a3940f84902319df257d39812eb71c8a9e2 assets/create/models/block/small_scorchia_brick_stairs.json 4dee6e6dbe6a98a8eaa04f6812f322343f62fca1 assets/create/models/block/small_scorchia_brick_stairs_inner.json 8a19e7e5c03c155c9ef9332486ae0b069dea0502 assets/create/models/block/small_scorchia_brick_stairs_outer.json -6b435123d852579ba8467c4915cd5d0adaadeca0 assets/create/models/block/small_scoria_bricks.json -86b243074845ca66916ce96ef3774862cf9a39d4 assets/create/models/block/small_scoria_bricks_wall_post.json -57ccb3efbdc4a69cad60c8b90321338ba2e68321 assets/create/models/block/small_scoria_bricks_wall_side.json -d4c5398e10b25d2dc3cb3754a449fc2b60e4074f assets/create/models/block/small_scoria_bricks_wall_side_tall.json +41e56d8e334b81a0d5270bdbe87617981e1f98b4 assets/create/models/block/small_scorchia_bricks.json +56aa81e05019533ce0e0f1ee3ef7bf20fcc400b4 assets/create/models/block/small_scorchia_bricks_wall_post.json +1e1fa90c8b144813770c4d53a3b734ae450895d6 assets/create/models/block/small_scorchia_bricks_wall_side.json +6a46cf73c03a2abea25a81dbb28f4150b355900c assets/create/models/block/small_scorchia_bricks_wall_side_tall.json 918351c1270c26932c0c4783543779a25ca7e986 assets/create/models/block/small_scoria_brick_slab.json 4138e756b4b36f227e178acbcc233edb082ae603 assets/create/models/block/small_scoria_brick_slab_top.json b8e70cd7d9acdcf91be9783cd91d70275a006ea2 assets/create/models/block/small_scoria_brick_stairs.json 625bfbd58440ea4e270d57cc748f2b5f6cece63b assets/create/models/block/small_scoria_brick_stairs_inner.json 602a46fb2736acb8c50b0d04222e6c33e52dee87 assets/create/models/block/small_scoria_brick_stairs_outer.json -a8e8c633dfb6d9f14425b1fd28e88ecf08a88cc6 assets/create/models/block/small_tuff_bricks.json -1c3a22bed504cd7a7e507e83ee21399f8a3fb299 assets/create/models/block/small_tuff_bricks_wall_post.json -1aeb8cac7d0178a18ac1cf98c9a45ca8e67514b0 assets/create/models/block/small_tuff_bricks_wall_side.json -4c6b5c7c60ec4cad314064b171413a3e866e5f99 assets/create/models/block/small_tuff_bricks_wall_side_tall.json +6b435123d852579ba8467c4915cd5d0adaadeca0 assets/create/models/block/small_scoria_bricks.json +86b243074845ca66916ce96ef3774862cf9a39d4 assets/create/models/block/small_scoria_bricks_wall_post.json +57ccb3efbdc4a69cad60c8b90321338ba2e68321 assets/create/models/block/small_scoria_bricks_wall_side.json +d4c5398e10b25d2dc3cb3754a449fc2b60e4074f assets/create/models/block/small_scoria_bricks_wall_side_tall.json 6b2c4d8c8609de0d3d6ce1e30b1dd26ba59cb86d assets/create/models/block/small_tuff_brick_slab.json 1ba07367fcba6a3914f1703115304a7c19979542 assets/create/models/block/small_tuff_brick_slab_top.json 1a5ab239d0f2f041ee04005ceb60111e6848f5de assets/create/models/block/small_tuff_brick_stairs.json be3ee2c36f85a534a71d42a7d63a7816945b3c30 assets/create/models/block/small_tuff_brick_stairs_inner.json aa84e448041d5f74c75565f5e409b1e9b7e5155d assets/create/models/block/small_tuff_brick_stairs_outer.json -e9c75f1b4b663dce09b0a2f8282e574839c19d06 assets/create/models/block/small_veridium_bricks.json -725f6d3dbcfb469cede6fb27a98c1f398f3f3c8c assets/create/models/block/small_veridium_bricks_wall_post.json -b33ee496d43e315a5bed5eaabfd553e361fec1a9 assets/create/models/block/small_veridium_bricks_wall_side.json -80e950f93def51d82a63848b1fb6ac11600ab1bf assets/create/models/block/small_veridium_bricks_wall_side_tall.json +a8e8c633dfb6d9f14425b1fd28e88ecf08a88cc6 assets/create/models/block/small_tuff_bricks.json +1c3a22bed504cd7a7e507e83ee21399f8a3fb299 assets/create/models/block/small_tuff_bricks_wall_post.json +1aeb8cac7d0178a18ac1cf98c9a45ca8e67514b0 assets/create/models/block/small_tuff_bricks_wall_side.json +4c6b5c7c60ec4cad314064b171413a3e866e5f99 assets/create/models/block/small_tuff_bricks_wall_side_tall.json 30b150fe3cf9bdb6ee32cd6b0f51179b44be57d3 assets/create/models/block/small_veridium_brick_slab.json 2158dd9e71f6f60e5132105c68a41ad6e3927438 assets/create/models/block/small_veridium_brick_slab_top.json bbbfc8e3696945ed1f6c3afe73ae0745ff8deda1 assets/create/models/block/small_veridium_brick_stairs.json fc3a996b0ca01c2c09ad84b881c46e92918d084f assets/create/models/block/small_veridium_brick_stairs_inner.json e27a77984e8e28e6032f26bb010efcadfaeb5407 assets/create/models/block/small_veridium_brick_stairs_outer.json +e9c75f1b4b663dce09b0a2f8282e574839c19d06 assets/create/models/block/small_veridium_bricks.json +725f6d3dbcfb469cede6fb27a98c1f398f3f3c8c assets/create/models/block/small_veridium_bricks_wall_post.json +b33ee496d43e315a5bed5eaabfd553e361fec1a9 assets/create/models/block/small_veridium_bricks_wall_side.json +80e950f93def51d82a63848b1fb6ac11600ab1bf assets/create/models/block/small_veridium_bricks_wall_side_tall.json d7c1c2679c8ba543ae7be3b9cf3f4eea3c1a2f68 assets/create/models/block/spruce_window.json f4a4fbb9eea6fb1d0633e349eae6acdaf329e8d5 assets/create/models/block/spruce_window_pane_noside.json 02a25202a42debcd2b4aaa4113e3de4f8f6ee47c assets/create/models/block/spruce_window_pane_noside_alt.json @@ -1736,66 +1736,66 @@ e84875a4eb11e2161a93ec7569aa2ac1c2f60cef assets/create/models/block/warped_windo 378c865ff8213ff56f1f7a4b2d9cf26c71f036e8 assets/create/models/block/warped_window_pane_post.json f320de08cb113a9ad17acd2ebb8dfc57759e4f7d assets/create/models/block/warped_window_pane_side.json 2fc182d9697b5cddd93b01d1236931af27eee8fe assets/create/models/block/warped_window_pane_side_alt.json -32fdb85b5b62d5a0fb41732874c854788cdd2ba1 assets/create/models/block/waxed_copper_shingles.json fb7fb6deebd502946ab57f1b8a9f4a6b5dd48da3 assets/create/models/block/waxed_copper_shingle_slab.json 660f61112b8e46dec5050cb0ed4ee936965a7c58 assets/create/models/block/waxed_copper_shingle_slab_top.json 5d74be967bbe9feba4b630751f13af817a733d1d assets/create/models/block/waxed_copper_shingle_stairs.json 35cb89f29ce3f8d8af13602c08ecd7afbb7cf56a assets/create/models/block/waxed_copper_shingle_stairs_inner.json fcb9295f4f388e6d439ec9a3906ca326b6d69077 assets/create/models/block/waxed_copper_shingle_stairs_outer.json -32f06f39d0b34e4431795aa6e64f87e58dc1597b assets/create/models/block/waxed_copper_tiles.json +32fdb85b5b62d5a0fb41732874c854788cdd2ba1 assets/create/models/block/waxed_copper_shingles.json 298c6100de02ed9f813397d8ba38c46f35035c69 assets/create/models/block/waxed_copper_tile_slab.json d4422c2d96fb329087d1be70d8b983a8cf6c7f01 assets/create/models/block/waxed_copper_tile_slab_top.json fca72048f916d3a3e567b385c948cc1b59711ef4 assets/create/models/block/waxed_copper_tile_stairs.json 997479b62ed3d81ab633279ecc2fabd9588a3bf3 assets/create/models/block/waxed_copper_tile_stairs_inner.json d5c5bbfb9aaa282e11ad6e6309b1880b172ee653 assets/create/models/block/waxed_copper_tile_stairs_outer.json -19a773f91c58c49301f35965bac02d0c05fb2764 assets/create/models/block/waxed_exposed_copper_shingles.json +32f06f39d0b34e4431795aa6e64f87e58dc1597b assets/create/models/block/waxed_copper_tiles.json a3420b91fdebec40e508a5eebb145c0201bd80c8 assets/create/models/block/waxed_exposed_copper_shingle_slab.json 4178ea5e50ee17b3c15f4a59efd019c4a19bb892 assets/create/models/block/waxed_exposed_copper_shingle_slab_top.json dd2d747774abc86e428a883e299db66cded78e11 assets/create/models/block/waxed_exposed_copper_shingle_stairs.json b6845da62d96a33cee624bb70360e256b26eda83 assets/create/models/block/waxed_exposed_copper_shingle_stairs_inner.json 3d8b758e50e75c5adc26ab6f39f9d73f00866673 assets/create/models/block/waxed_exposed_copper_shingle_stairs_outer.json -9cb20c9d41629d8b9426cb65829365d10966338f assets/create/models/block/waxed_exposed_copper_tiles.json +19a773f91c58c49301f35965bac02d0c05fb2764 assets/create/models/block/waxed_exposed_copper_shingles.json cd21d9d2935b6d0103502e2731c11ea27ff64ecf assets/create/models/block/waxed_exposed_copper_tile_slab.json 0ec039ba59fb0028183433e52131ff355ace5bff assets/create/models/block/waxed_exposed_copper_tile_slab_top.json c51dbd34996ac4513234800e427ac308067d5e1d assets/create/models/block/waxed_exposed_copper_tile_stairs.json 68772d4352dc7ade995dfa57ba41a38ef819e855 assets/create/models/block/waxed_exposed_copper_tile_stairs_inner.json d932671822ba93b71a9c8b50e7207803a1c4dbab assets/create/models/block/waxed_exposed_copper_tile_stairs_outer.json -561beafce41b9e9c0b07bc6b7176dd4f6918c116 assets/create/models/block/waxed_oxidized_copper_shingles.json +9cb20c9d41629d8b9426cb65829365d10966338f assets/create/models/block/waxed_exposed_copper_tiles.json 7e0bab8109e322c6db5fe1d5999c06536c21c6eb assets/create/models/block/waxed_oxidized_copper_shingle_slab.json 42df32c4e2d1ffb2ee62748becfd1717118b440c assets/create/models/block/waxed_oxidized_copper_shingle_slab_top.json b55a733e3e68cfbd08d45bb9ac56deef9f728b60 assets/create/models/block/waxed_oxidized_copper_shingle_stairs.json 7b8745213af5aa7938fc04a295be6a087c72daa8 assets/create/models/block/waxed_oxidized_copper_shingle_stairs_inner.json d89419d48d6ee2f6747e7c93de8699db22ea3f59 assets/create/models/block/waxed_oxidized_copper_shingle_stairs_outer.json -5cf92b628ff1f832966138a58ed87d747681274c assets/create/models/block/waxed_oxidized_copper_tiles.json +561beafce41b9e9c0b07bc6b7176dd4f6918c116 assets/create/models/block/waxed_oxidized_copper_shingles.json ad6134598869711a12e2f95c9b5f25a0f7b8dd93 assets/create/models/block/waxed_oxidized_copper_tile_slab.json c17bac0fd6a20540813c6a1c000a553b7c5ac849 assets/create/models/block/waxed_oxidized_copper_tile_slab_top.json d5b30340364f5536e46bc67e777ef4fa20a36e04 assets/create/models/block/waxed_oxidized_copper_tile_stairs.json b40b315c23cbd3eb4658518bfac836f6091321a5 assets/create/models/block/waxed_oxidized_copper_tile_stairs_inner.json f4eaadab29b4f2e915237340e2d6f4aad4ba21d6 assets/create/models/block/waxed_oxidized_copper_tile_stairs_outer.json -9c73020e80c31cd710c218f9699ba9a795758ad0 assets/create/models/block/waxed_weathered_copper_shingles.json +5cf92b628ff1f832966138a58ed87d747681274c assets/create/models/block/waxed_oxidized_copper_tiles.json 897cfc177b073ca1bcb635c74108567f8748b5c4 assets/create/models/block/waxed_weathered_copper_shingle_slab.json efa57ba131c27e0064c0d958e69b10530a26ac41 assets/create/models/block/waxed_weathered_copper_shingle_slab_top.json 4ef11a7e3de630ad46b9179e8a9a34d55202f6c5 assets/create/models/block/waxed_weathered_copper_shingle_stairs.json f32a18c76cfaca2153f6321880a8da1347be37ce assets/create/models/block/waxed_weathered_copper_shingle_stairs_inner.json 9637f78e51ca7ed812e4c64c52e08f6fa0adbfc3 assets/create/models/block/waxed_weathered_copper_shingle_stairs_outer.json -9782a25341dd2ffb146430edbe6916932250c326 assets/create/models/block/waxed_weathered_copper_tiles.json +9c73020e80c31cd710c218f9699ba9a795758ad0 assets/create/models/block/waxed_weathered_copper_shingles.json 0c9669588972d4c2152bd2b043b8386b76a6e1c4 assets/create/models/block/waxed_weathered_copper_tile_slab.json 2d01a583cc948e9e0cb814cad968ed16a07dd46c assets/create/models/block/waxed_weathered_copper_tile_slab_top.json e26dd64495ff8801593e9c22203cbf364075badd assets/create/models/block/waxed_weathered_copper_tile_stairs.json b658c1022587bd670b5acee267607719c1544332 assets/create/models/block/waxed_weathered_copper_tile_stairs_inner.json e7ae89577be9d26a071bf96cbd7ed80293902b63 assets/create/models/block/waxed_weathered_copper_tile_stairs_outer.json -9c73020e80c31cd710c218f9699ba9a795758ad0 assets/create/models/block/weathered_copper_shingles.json +9782a25341dd2ffb146430edbe6916932250c326 assets/create/models/block/waxed_weathered_copper_tiles.json 897cfc177b073ca1bcb635c74108567f8748b5c4 assets/create/models/block/weathered_copper_shingle_slab.json efa57ba131c27e0064c0d958e69b10530a26ac41 assets/create/models/block/weathered_copper_shingle_slab_top.json 4ef11a7e3de630ad46b9179e8a9a34d55202f6c5 assets/create/models/block/weathered_copper_shingle_stairs.json f32a18c76cfaca2153f6321880a8da1347be37ce assets/create/models/block/weathered_copper_shingle_stairs_inner.json 9637f78e51ca7ed812e4c64c52e08f6fa0adbfc3 assets/create/models/block/weathered_copper_shingle_stairs_outer.json -9782a25341dd2ffb146430edbe6916932250c326 assets/create/models/block/weathered_copper_tiles.json +9c73020e80c31cd710c218f9699ba9a795758ad0 assets/create/models/block/weathered_copper_shingles.json 0c9669588972d4c2152bd2b043b8386b76a6e1c4 assets/create/models/block/weathered_copper_tile_slab.json 2d01a583cc948e9e0cb814cad968ed16a07dd46c assets/create/models/block/weathered_copper_tile_slab_top.json e26dd64495ff8801593e9c22203cbf364075badd assets/create/models/block/weathered_copper_tile_stairs.json b658c1022587bd670b5acee267607719c1544332 assets/create/models/block/weathered_copper_tile_stairs_inner.json e7ae89577be9d26a071bf96cbd7ed80293902b63 assets/create/models/block/weathered_copper_tile_stairs_outer.json +9782a25341dd2ffb146430edbe6916932250c326 assets/create/models/block/weathered_copper_tiles.json 045b812ddb1ca8dd6cd9b49852ddbd37f86cd2a6 assets/create/models/block/weathered_iron_block.json a569ddd725898a86f8745e46723edeff7fe7f2e9 assets/create/models/block/weathered_iron_window_1.json 133928d853037efb81022b69377669f0b16239bc assets/create/models/block/weathered_iron_window_2.json @@ -1971,13 +1971,13 @@ aaac7663d062731433c920d94a24b9b3a521dd8c assets/create/models/item/copper_bars.j ccdf08652511e5737a8489d86ea9422ade4f4ca5 assets/create/models/item/copper_nugget.json 86a770e9b2af1f19bf633f5cfeecd84848f73fbd assets/create/models/item/copper_scaffolding.json a4fd2f4f00e03b2ac5d863e93827d39a984cc2ff assets/create/models/item/copper_sheet.json -13b18ba2938e283d507fbca70518cf52198cdc71 assets/create/models/item/copper_shingles.json 79d9f8667965072f12e51e6601b5c36f8acc125f assets/create/models/item/copper_shingle_slab.json 9fe6f0bdea4595b403ed2d2cbc2023a9abeb79f0 assets/create/models/item/copper_shingle_stairs.json +13b18ba2938e283d507fbca70518cf52198cdc71 assets/create/models/item/copper_shingles.json 9a33eeb0f7c682ee2f8c0abbfa174f8828acc2b5 assets/create/models/item/copper_table_cloth.json -19642e4ea5deecaf57059827c4c13a19d2e73822 assets/create/models/item/copper_tiles.json a7147444fc28a4cce21b6cf38e9528537e27c352 assets/create/models/item/copper_tile_slab.json 7330324d6c64f0340d676ecef83a930515d9130e assets/create/models/item/copper_tile_stairs.json +19642e4ea5deecaf57059827c4c13a19d2e73822 assets/create/models/item/copper_tiles.json 08c35e85afe4eb2b106133c5d9c7d7c64ca9a915 assets/create/models/item/copper_valve_handle.json 5cec229a3117ea5987aa42288c070427ac48a5dc assets/create/models/item/copycat_panel.json 1b6707005830ca066a7e997c73391ca88c70bdb0 assets/create/models/item/copycat_step.json @@ -2007,114 +2007,114 @@ b6acd86be9e6cac8b9ed2bc6297d27941ca05f46 assets/create/models/item/crushed_raw_z b67e95801010eab58de02f2b0160bff3f008bd18 assets/create/models/item/crushing_wheel.json af189b0c04482064520d84546d81af8154824292 assets/create/models/item/cuckoo_clock.json 314fb287c7b16a6478fbefde0da80de8828b684e assets/create/models/item/cut_andesite.json -e2840073eac2e6419cd312b3d0177d4c64a5346c assets/create/models/item/cut_andesite_bricks.json 680fe77d50f7c3253ec4997f74761f962b784e15 assets/create/models/item/cut_andesite_brick_slab.json 3c1d56f9686bb2b97c168b0509ddfd06e80be9a0 assets/create/models/item/cut_andesite_brick_stairs.json 4222b965f8a18f78b92838e4642a28fa3e0ad648 assets/create/models/item/cut_andesite_brick_wall.json +e2840073eac2e6419cd312b3d0177d4c64a5346c assets/create/models/item/cut_andesite_bricks.json c100e02ef9b05f4f6df3ddbbfe91db1032d4854b assets/create/models/item/cut_andesite_slab.json f435a67b3d89d12b6e8cb5071a67e35f0918dc79 assets/create/models/item/cut_andesite_stairs.json df9084d532a085220280bc7bee579e1079fbf786 assets/create/models/item/cut_andesite_wall.json 025eedca45b222b91d93b9a3a89fac5ad328b152 assets/create/models/item/cut_asurine.json -1ceb483f428448f00a08541fbcf4f4787aef3f1e assets/create/models/item/cut_asurine_bricks.json 022c56e7aafa7ca4cdd1a88426eb43f9e02c3cc2 assets/create/models/item/cut_asurine_brick_slab.json 3131e09a221c2f0a17cfc7277603f2e3c8164bc7 assets/create/models/item/cut_asurine_brick_stairs.json dc1f5f03acc1165606c48df97953164f6bd7f092 assets/create/models/item/cut_asurine_brick_wall.json +1ceb483f428448f00a08541fbcf4f4787aef3f1e assets/create/models/item/cut_asurine_bricks.json e81d7df1f1b8281c38400713b09cbac59c4d53cc assets/create/models/item/cut_asurine_slab.json cf534603fe71423e0ab80d431ab12394d0a6bb21 assets/create/models/item/cut_asurine_stairs.json 7ca803f5a7798ea034db6385a5f36a48e235c247 assets/create/models/item/cut_asurine_wall.json 707fb799ca44280cad0b817f29a7c75dd0f0ce5e assets/create/models/item/cut_calcite.json -5678b9f76823efac2c6624acc7b2b911402112f4 assets/create/models/item/cut_calcite_bricks.json f794423b242228c43345dc1f40653133fb7f3db6 assets/create/models/item/cut_calcite_brick_slab.json 8e9b46e52758ec7f21c3b84c212e2f6565bf71d9 assets/create/models/item/cut_calcite_brick_stairs.json 1447d21b7fc331528bfd15e5b9d694eb1a31cfb3 assets/create/models/item/cut_calcite_brick_wall.json +5678b9f76823efac2c6624acc7b2b911402112f4 assets/create/models/item/cut_calcite_bricks.json c78c99c78a19097d890414b21270014b52bafd8d assets/create/models/item/cut_calcite_slab.json e6a9144a4bb9e5af3f57d0acdb26d66dc4547217 assets/create/models/item/cut_calcite_stairs.json daf2a2513f6636d140c23b90ba87aad35476c498 assets/create/models/item/cut_calcite_wall.json 29f2bc72aa50cdf34d1d5bfd01a4512d5974dc65 assets/create/models/item/cut_crimsite.json -20bc810ca5b2a35a423e57f287e2f42ad9940b89 assets/create/models/item/cut_crimsite_bricks.json 7c37d3de9674e70595498d1c46c5693d9f39a502 assets/create/models/item/cut_crimsite_brick_slab.json b974c0f2f0e5119d9bac6a36946d4dfdd65b4b5f assets/create/models/item/cut_crimsite_brick_stairs.json c1289ddff572149b2171859689228615802dc825 assets/create/models/item/cut_crimsite_brick_wall.json +20bc810ca5b2a35a423e57f287e2f42ad9940b89 assets/create/models/item/cut_crimsite_bricks.json 8855eb44a68277668c77858715652d6851fa507f assets/create/models/item/cut_crimsite_slab.json 57101d3c2d570bc2c389c1e05e1354d79de70a0a assets/create/models/item/cut_crimsite_stairs.json a10cd65d675a05b9dfbdac67a2d9ca3b4381396a assets/create/models/item/cut_crimsite_wall.json a4ad900cf65136835c259c1e349781538d537a9c assets/create/models/item/cut_deepslate.json -81b10b5d159db4000f4f6569b83fc7e8f702f015 assets/create/models/item/cut_deepslate_bricks.json a63bbe474ca7d8ceafb6bfcb21a88841980fe8e6 assets/create/models/item/cut_deepslate_brick_slab.json 7c1ad49844eafbd87f8c69a077a8c18ccdd4a919 assets/create/models/item/cut_deepslate_brick_stairs.json 6a4ee2e810731e0702c1493237343a567cc736d6 assets/create/models/item/cut_deepslate_brick_wall.json +81b10b5d159db4000f4f6569b83fc7e8f702f015 assets/create/models/item/cut_deepslate_bricks.json ff0d08d1b59de36b016f7952d2bd72d8e1eb1293 assets/create/models/item/cut_deepslate_slab.json 627c806a6eba8b730682821deb31627d75683e88 assets/create/models/item/cut_deepslate_stairs.json 9bdb85a688b09eb34eb8024a6808406118f78133 assets/create/models/item/cut_deepslate_wall.json c33c48d71d98f4b8a84c7f0a4ee88918fed3e798 assets/create/models/item/cut_diorite.json -e8a697df63b0b5fa74dbc70e76b55718a2cc388f assets/create/models/item/cut_diorite_bricks.json 63bc297b782c40c513873b7f8fd8284abce01753 assets/create/models/item/cut_diorite_brick_slab.json f604d088c8c7c6d847795459231d0df8c73d95fb assets/create/models/item/cut_diorite_brick_stairs.json b06be3da6017aa7fbc38b8aecda0d30dae313c13 assets/create/models/item/cut_diorite_brick_wall.json +e8a697df63b0b5fa74dbc70e76b55718a2cc388f assets/create/models/item/cut_diorite_bricks.json 4650f375365caeb237947f6e933d174ebbfbc1e2 assets/create/models/item/cut_diorite_slab.json 933d14f51272b39fc13e94d58f3100469d7cbe06 assets/create/models/item/cut_diorite_stairs.json 0cc44bb9ad0ed3ff11bc6113d0a9e31e99b169b8 assets/create/models/item/cut_diorite_wall.json e2123180fd5312d1e67b3a030fcbc4b6f11aa8bf assets/create/models/item/cut_dripstone.json -4b5d7bbee5741b112e2cb354c5fe49c088fc9b2f assets/create/models/item/cut_dripstone_bricks.json a815b2a927853d6d82d8b69f862be3091c5c8caa assets/create/models/item/cut_dripstone_brick_slab.json b8cb1b04eb869a06ded04c4c3acac6e5a315ee78 assets/create/models/item/cut_dripstone_brick_stairs.json 87fafd603eb4ba41981cd9c9371ac4618909f94d assets/create/models/item/cut_dripstone_brick_wall.json +4b5d7bbee5741b112e2cb354c5fe49c088fc9b2f assets/create/models/item/cut_dripstone_bricks.json 756c801f6bba006fbfd3486e95ba870909ab2902 assets/create/models/item/cut_dripstone_slab.json c59d314e1b5cce1c3745ce164c2a094e17f7a003 assets/create/models/item/cut_dripstone_stairs.json 125b24d28a9957740855467440ad8508d21c24d7 assets/create/models/item/cut_dripstone_wall.json 2fbce0b481f7cf2cf4f0fd03c86ef743b7c30879 assets/create/models/item/cut_granite.json -d8860602cc52fac5a09354c56e78fdfd7d9cb6a9 assets/create/models/item/cut_granite_bricks.json 3584117ed8a69c3842fde1d6accfaaa2c72e44f4 assets/create/models/item/cut_granite_brick_slab.json c68d1c09b9091bc501279115be16f83508b88fed assets/create/models/item/cut_granite_brick_stairs.json 5a37b24319a8708e444902eae3596b68daaffd15 assets/create/models/item/cut_granite_brick_wall.json +d8860602cc52fac5a09354c56e78fdfd7d9cb6a9 assets/create/models/item/cut_granite_bricks.json c2f6603e8cbfc0cdf5e5ef10c6a4baef9c917b6d assets/create/models/item/cut_granite_slab.json 66f8e6d556446441e157427437e9563075e2d6ce assets/create/models/item/cut_granite_stairs.json fe06c8aeab9e4c8a145375af46cbdaed701baad4 assets/create/models/item/cut_granite_wall.json b5c3df9c28a14683a363769cad5d154af56b8da4 assets/create/models/item/cut_limestone.json -7d026353711a464400e69c7e86c9b9c6aa70bf6d assets/create/models/item/cut_limestone_bricks.json 2822ebe1d4211f240e31866759e25add5f0fb56d assets/create/models/item/cut_limestone_brick_slab.json 694dfb73585167011d8123d64f5896697594f4ce assets/create/models/item/cut_limestone_brick_stairs.json db8851d6a1b7604ca1ba7615e1f162f6f5220801 assets/create/models/item/cut_limestone_brick_wall.json +7d026353711a464400e69c7e86c9b9c6aa70bf6d assets/create/models/item/cut_limestone_bricks.json 75584aa5e06168d8866b022fcd72377351b774d9 assets/create/models/item/cut_limestone_slab.json 1df9a186a146e597b48da4c4461f1a98ecf3646a assets/create/models/item/cut_limestone_stairs.json b70ac5462ef4d0363332656aa7cb82919f679893 assets/create/models/item/cut_limestone_wall.json 92bc693db4e0ba6164cd35d4f5fa0982f3b8f796 assets/create/models/item/cut_ochrum.json -3e8e00c602b1fbce888e6fe22d9525f1c025129d assets/create/models/item/cut_ochrum_bricks.json 1edc47c279fadde74322d3fa89ef776bdd6fb354 assets/create/models/item/cut_ochrum_brick_slab.json 4678e2a97c73139b458cea657a55f74659bc36d5 assets/create/models/item/cut_ochrum_brick_stairs.json 85044ec7033cd4c6aa913c4c4bb6c0e3a4386023 assets/create/models/item/cut_ochrum_brick_wall.json +3e8e00c602b1fbce888e6fe22d9525f1c025129d assets/create/models/item/cut_ochrum_bricks.json e0e494fb7fa1767241507347318560335339a2a8 assets/create/models/item/cut_ochrum_slab.json de7c5917bcb14f398d39e3932bfe5e1967ed7a24 assets/create/models/item/cut_ochrum_stairs.json 5a8f8c84e95ee0ab97106a801a456282f5ac207c assets/create/models/item/cut_ochrum_wall.json 1631a807135cf993d9a81068c65e78face2f24e0 assets/create/models/item/cut_scorchia.json -5ecb9692e478e29d64aeb5867e8677671560755d assets/create/models/item/cut_scorchia_bricks.json ac3a29573ce099ac57f59d0a2f1cdc0a453e0621 assets/create/models/item/cut_scorchia_brick_slab.json d3a8a8e0e85aaaadccb18cdce33da54ae0e8a8d7 assets/create/models/item/cut_scorchia_brick_stairs.json 83be13f6cbd9a58e10869e4152066cf3b265f347 assets/create/models/item/cut_scorchia_brick_wall.json +5ecb9692e478e29d64aeb5867e8677671560755d assets/create/models/item/cut_scorchia_bricks.json 0fee2e7f8e80bbd33e4d928c8374e6dae65f0b1f assets/create/models/item/cut_scorchia_slab.json 88a6b3709bab76390ace6f641eac18d43c9d099f assets/create/models/item/cut_scorchia_stairs.json d733d43252bf27b6fb1d7e016dc77556c3d1eb71 assets/create/models/item/cut_scorchia_wall.json ce75fb80c38c94bf6bf631eeb756909decaaaab0 assets/create/models/item/cut_scoria.json -81aa0bd4ec878754043a107466dcd87d49b3697c assets/create/models/item/cut_scoria_bricks.json d78a5126aefdd4cd182f9ec0ddda64df00d0f01c assets/create/models/item/cut_scoria_brick_slab.json 661d49b996f9c97a333e7e39dd13a0476db6b142 assets/create/models/item/cut_scoria_brick_stairs.json 3be69c075b479ac53c6201d7d7224d399f8009b6 assets/create/models/item/cut_scoria_brick_wall.json +81aa0bd4ec878754043a107466dcd87d49b3697c assets/create/models/item/cut_scoria_bricks.json 824bedfbeec53ec8f539fe73c0a3c3d927a21aa4 assets/create/models/item/cut_scoria_slab.json 15560f1251f18d53fe1b71adc6be5060c4d8fb94 assets/create/models/item/cut_scoria_stairs.json e35ebcc4f7f7b94623af85b181d916e48fbbb5ed assets/create/models/item/cut_scoria_wall.json 71284d3d6dba230dbecd01eb015e0e65877b820d assets/create/models/item/cut_tuff.json -4de100799e290db3fd46923781a83e6a12654266 assets/create/models/item/cut_tuff_bricks.json 4c7d5fadb0b0eaecf2055a0cd279f9ec130b93d0 assets/create/models/item/cut_tuff_brick_slab.json 6f32b83c9f82424c0e2a2e0a8813eb44c2ac4527 assets/create/models/item/cut_tuff_brick_stairs.json 9088296b7677bddf16d670858a619d846a134ef6 assets/create/models/item/cut_tuff_brick_wall.json +4de100799e290db3fd46923781a83e6a12654266 assets/create/models/item/cut_tuff_bricks.json e9134027cc917e2e878456edb49bcfee382e73b1 assets/create/models/item/cut_tuff_slab.json 8235a34249197c100645b55ded5ff619a055d8a6 assets/create/models/item/cut_tuff_stairs.json a1626993eafa8d85dc950e17cbf78378ed64c7d2 assets/create/models/item/cut_tuff_wall.json a343c74f1e55426330df18f522e6d2a81276c499 assets/create/models/item/cut_veridium.json -3c3fd197f8e299ff90850e24c6507ea12f373123 assets/create/models/item/cut_veridium_bricks.json c1c5561ce31e237b7ea8f1adfb6a79e661b7f940 assets/create/models/item/cut_veridium_brick_slab.json f633006045ccfcdf486d7a240217229d6eed717e assets/create/models/item/cut_veridium_brick_stairs.json 8182109a002317dd8d2767b3828f8c44166a053f assets/create/models/item/cut_veridium_brick_wall.json +3c3fd197f8e299ff90850e24c6507ea12f373123 assets/create/models/item/cut_veridium_bricks.json 410b949304faa5856028f7c42ab762b7498ffd95 assets/create/models/item/cut_veridium_slab.json 62697c0922b11537914d2f4f84faa0b909ee518d assets/create/models/item/cut_veridium_stairs.json 3921d61a26d48d999cbb2f6645611e53ea71978b assets/create/models/item/cut_veridium_wall.json @@ -2144,12 +2144,12 @@ badd4326fac0b0a1590a2e9bce7c2cdd4e4562f3 assets/create/models/item/empty_schemat 7ec3ed4aaab72d76f6414447bbb3ad7887adf61f assets/create/models/item/encased_fan.json 3e1fdcc80fd68199b1890bcc830f78c48e7c0e43 assets/create/models/item/experience_block.json 9775e83414c0febb5c5b832437b0580e91bcbff3 assets/create/models/item/experience_nugget.json -87add851ae3271d733c9e6888865c288b6716f3b assets/create/models/item/exposed_copper_shingles.json 721c8ac46bf23abec2bbf4cff6dbfdf96cc569a6 assets/create/models/item/exposed_copper_shingle_slab.json 6e1c7fcd8da84dc2d49adb9802ce4fb431eddae1 assets/create/models/item/exposed_copper_shingle_stairs.json -fa7ffb172a43774cc07a2bb201e7010a2549001d assets/create/models/item/exposed_copper_tiles.json +87add851ae3271d733c9e6888865c288b6716f3b assets/create/models/item/exposed_copper_shingles.json a443633d90ef9ac2a866b69b2ecdfad1841dc3e1 assets/create/models/item/exposed_copper_tile_slab.json 9bb425a14635fc8b36a9a95f3d0c54e0b129b7b4 assets/create/models/item/exposed_copper_tile_stairs.json +fa7ffb172a43774cc07a2bb201e7010a2549001d assets/create/models/item/exposed_copper_tiles.json 8b64a93d9b6e33e3caa66adb7a0cc8c5cd473023 assets/create/models/item/extendo_grip.json 9114fa2e92ea4b7bf949b2e5a26290b0bade1af3 assets/create/models/item/factory_gauge.json dad31483f65baaf187e6553e3cd301c5d69e9db4 assets/create/models/item/filter.json @@ -2179,11 +2179,11 @@ b8d6d2d163e2ab5f654bbc4eda9ad63f8064d27c assets/create/models/item/gray_seat.jso 334fd81d5e6574220ee5815f1452b4f4aa7ad223 assets/create/models/item/green_table_cloth.json 561e0579101bf602b252c0b9a5eec468c89d0e40 assets/create/models/item/green_toolbox.json 7d3ddad087b4d2c6a32f97092533cbfb5de0cb3b assets/create/models/item/green_valve_handle.json -9e352162c8135773a4eca41871beea8f3ca650ae assets/create/models/item/handheld_worldshaper.json dac0331061c464e6d3e2070b232781c632840191 assets/create/models/item/hand_crank.json +9e352162c8135773a4eca41871beea8f3ca650ae assets/create/models/item/handheld_worldshaper.json 7bb435c53cbf935d80a28746125aebbd6263e45c assets/create/models/item/haunted_bell.json -81d67fb0e59f25762a412990884813c72d399d55 assets/create/models/item/honeyed_apple.json 2e97629313eab1a4ac4b38785dbe7ed45346e625 assets/create/models/item/honey_bucket.json +81d67fb0e59f25762a412990884813c72d399d55 assets/create/models/item/honeyed_apple.json 70185e640169d6253f06fb98f31b240f4807a53e assets/create/models/item/horizontal_framed_glass.json d47884b13fadf545bd585cd9ae347368924b04b0 assets/create/models/item/horizontal_framed_glass_pane.json 58b6f4ec2af3a69ae7145fb25d73451b6e8a2834 assets/create/models/item/hose_pulley.json @@ -2224,13 +2224,13 @@ b56a28924b0b1b2530ebac7834e011700b09b966 assets/create/models/item/light_gray_po cc8834024208662cb100f7cd38a04637da3b6852 assets/create/models/item/light_gray_table_cloth.json c8513eb1c89652783e26d7dcfcf64afa97619bc8 assets/create/models/item/light_gray_toolbox.json 3774d23e76b5712e7004e333e0a770f2230c2998 assets/create/models/item/light_gray_valve_handle.json -8f53caad3899a30be5087a0ba155080834418cc0 assets/create/models/item/limestone.json -fba1e7d1cad39c89976b427db62544d80f47ad5d assets/create/models/item/limestone_pillar.json 26b8e1daf9cc4b206fb5f62904c7f1701ba93e67 assets/create/models/item/lime_postbox.json 32cd55a1c97a31a13ad106a457ec9925aa91f6d3 assets/create/models/item/lime_seat.json a0843c3731fa3c4d23bc2b91fd68410fcf1df149 assets/create/models/item/lime_table_cloth.json 931d187c11cb95a0eeae8f256187ef551b42007e assets/create/models/item/lime_toolbox.json d0f4148bdb0a905e68f54b5dfd829fd47e528fea assets/create/models/item/lime_valve_handle.json +8f53caad3899a30be5087a0ba155080834418cc0 assets/create/models/item/limestone.json +fba1e7d1cad39c89976b427db62544d80f47ad5d assets/create/models/item/limestone_pillar.json 1d30f9b525e8e9736b34a92f848e235c71fd6bd8 assets/create/models/item/linear_chassis.json 8f622f5f79446f6060d9e8815205fce919c8c829 assets/create/models/item/linked_controller.json 538e28af9013a43c258a659cbe67671991f3eee7 assets/create/models/item/magenta_postbox.json @@ -2275,15 +2275,15 @@ af50363d603d61340b336569d58c1febde253665 assets/create/models/item/ochrum.json 7e767ca9e0ddb769b38fabd9289648ac63f5413d assets/create/models/item/orange_valve_handle.json 82152bca4310111d91584a2a78f05e158bb4bd90 assets/create/models/item/ornate_iron_window.json ca749a88faeef441c55c0527d81257187938b6b0 assets/create/models/item/ornate_iron_window_pane.json -09b3cd8ff7b29a6dd59f739a95bb708646d23537 assets/create/models/item/oxidized_copper_shingles.json c9c7ccdb68de2e77cd9f7053fab19493dd30a985 assets/create/models/item/oxidized_copper_shingle_slab.json 89c5f7a0a28f238ebed2641e243a47e4be2ad5ab assets/create/models/item/oxidized_copper_shingle_stairs.json -1c3428e2aed32a013631db012642a34d4eaf0785 assets/create/models/item/oxidized_copper_tiles.json +09b3cd8ff7b29a6dd59f739a95bb708646d23537 assets/create/models/item/oxidized_copper_shingles.json f1af7c5f3840efc3ae07940ee6719eb3417a0e1a assets/create/models/item/oxidized_copper_tile_slab.json ef2fe68d407a03bf1ed8f2d2f3e7323777d061bb assets/create/models/item/oxidized_copper_tile_stairs.json -b21a1f3ee7de3e17f69d27fd13ae6b23b62aa22c assets/create/models/item/packager.json +1c3428e2aed32a013631db012642a34d4eaf0785 assets/create/models/item/oxidized_copper_tiles.json 5b974e55caffdbfc2156eb8b59dd99db12243bd3 assets/create/models/item/package_filter.json 7fd76e7d2e6c6d94352f1fa08d096b63616ad01e assets/create/models/item/package_frogport.json +b21a1f3ee7de3e17f69d27fd13ae6b23b62aa22c assets/create/models/item/packager.json 76aeceb41bb7df873dbafe1bd5e26deb24abf93f assets/create/models/item/peculiar_bell.json ab6c05a0468f3f4295a07adb362fa2d36cf6e3e8 assets/create/models/item/pink_postbox.json df13d4281dc45041ecd93504d45daef61d070581 assets/create/models/item/pink_seat.json @@ -2380,15 +2380,15 @@ d3274003067a943d749ba5d23b5abc0fee8727a2 assets/create/models/item/rare_thunder_ 48ceaaead35ae1422542a615c9db55bd88f464e6 assets/create/models/item/rare_vector_package.json 5f8e5283fbebb452f1a1141b33ee73f08879c75d assets/create/models/item/raw_zinc.json 4631d67976cef148c346a7016baaa6703e4f243e assets/create/models/item/raw_zinc_block.json -9dc6c52e258b00cac6ed23147983045c43218b5d assets/create/models/item/redstone_contact.json -f8f733364bdd32b2ad597e81103bc02344ce63bd assets/create/models/item/redstone_link.json -ae0ba4827a81bd51c5c01178c2ccdae3a722628a assets/create/models/item/redstone_requester.json 4b73ee9cc2651a3d1a97476d100f9c4d7e2b2efe assets/create/models/item/red_postbox.json 8d00eb1a10055a802556eab10e13f522d12acd1c assets/create/models/item/red_sand_paper.json b64a054c92cbd2e055502d470f3921d1077e63a1 assets/create/models/item/red_seat.json 359d9bdb2496140e297a1e5a98c9563bc09d56b9 assets/create/models/item/red_table_cloth.json ac4695cc465d094b4adba1a4e9efec42c916f37d assets/create/models/item/red_toolbox.json 02473f42ef4b53dc809c7c58ae657c014bfaf652 assets/create/models/item/red_valve_handle.json +9dc6c52e258b00cac6ed23147983045c43218b5d assets/create/models/item/redstone_contact.json +f8f733364bdd32b2ad597e81103bc02344ce63bd assets/create/models/item/redstone_link.json +ae0ba4827a81bd51c5c01178c2ccdae3a722628a assets/create/models/item/redstone_requester.json 9926bbe6dad7c4c1a146492116d232e941c80d2b assets/create/models/item/refined_radiance.json bf827486dc7a1b3aeae577844d2dab2a97051db9 assets/create/models/item/refined_radiance_casing.json a982c29763d90556cca03074c168462a52cb9526 assets/create/models/item/repackager.json @@ -2402,9 +2402,9 @@ d45005a89e2c0d29944e0112be274365e0e318a5 assets/create/models/item/rose_quartz_t 670e978a34faf6a3acd7880b2f94c2574178d586 assets/create/models/item/sand_paper.json 6854451e331242ec50c186a545538024b07ec123 assets/create/models/item/schedule.json 0effa517c214ba07dba2f4ed12dfcf4785e42dd8 assets/create/models/item/schematic.json -8b7727844d8c12c3c22828c7f65fc7ac2d273e36 assets/create/models/item/schematicannon.json 2a52f084fa8187dd8da28fe820dde50c47a93b57 assets/create/models/item/schematic_and_quill.json 4c8b34627001e35ee15412a0cd037d0f24ba914e assets/create/models/item/schematic_table.json +8b7727844d8c12c3c22828c7f65fc7ac2d273e36 assets/create/models/item/schematicannon.json 2955563914c2f84ed06474c135062e91189ddf3a assets/create/models/item/scorchia.json 669041e5ad29d2166cc8895f85aa262040671d3e assets/create/models/item/scorchia_pillar.json ff52eb59dadfe675e416440f3115856a501428a6 assets/create/models/item/scoria.json @@ -2415,63 +2415,63 @@ abaa6da82babc26717ffff44fc41327bd015c9a6 assets/create/models/item/shadow_steel. ffaec38d11b91add4e150e33d0e0e49394f5beca assets/create/models/item/shadow_steel_casing.json b6fcd9722e5a09a9207964cba68752512e3b945a assets/create/models/item/shaft.json 617c6e2f759b2a95da7ee7192a2661afc6f6e8f8 assets/create/models/item/shopping_list.json -58ca190177e77db90c8195347c29d52c2cd0c556 assets/create/models/item/small_andesite_bricks.json fa92996fada8545fc340fb401bd0568f56809bf0 assets/create/models/item/small_andesite_brick_slab.json 08474bf814a55795c1f94203ceb8a969be2a2132 assets/create/models/item/small_andesite_brick_stairs.json 0e00bc6aa5be242217ed6fe8cbe1ccdf180742fb assets/create/models/item/small_andesite_brick_wall.json -543055fabb706a93037c6a9e47c334508e41b06c assets/create/models/item/small_asurine_bricks.json +58ca190177e77db90c8195347c29d52c2cd0c556 assets/create/models/item/small_andesite_bricks.json b160c3277f00f19687cffb87f9cb3aa32d3633aa assets/create/models/item/small_asurine_brick_slab.json 183fa4919f06e8c3c10f1efeceefd55389a96102 assets/create/models/item/small_asurine_brick_stairs.json d6a5ffdb493fb2c8176a7e6b42e05c2d393a2782 assets/create/models/item/small_asurine_brick_wall.json -26d9361e33e362a772220146724c0927453831e0 assets/create/models/item/small_calcite_bricks.json +543055fabb706a93037c6a9e47c334508e41b06c assets/create/models/item/small_asurine_bricks.json 8c1b5d5d40393636c9ff10afc09038c89bc1b383 assets/create/models/item/small_calcite_brick_slab.json 481ce90fb6abb05c904f01df3fe635f702bbfac0 assets/create/models/item/small_calcite_brick_stairs.json 02adb90bdf06a7c4c57d09dfd3c77cceef9b7fbe assets/create/models/item/small_calcite_brick_wall.json -d5a033d3dedb799c4752b7e68b6881529f38f8e5 assets/create/models/item/small_crimsite_bricks.json +26d9361e33e362a772220146724c0927453831e0 assets/create/models/item/small_calcite_bricks.json 8f382537c99eac3335f72db8dba33ab71f99a919 assets/create/models/item/small_crimsite_brick_slab.json b5d012cf0c5c94b73e6825b6884ab1d3eee7d64e assets/create/models/item/small_crimsite_brick_stairs.json 236457bb16bc7e949c16f3f091ee74dc3f3e6973 assets/create/models/item/small_crimsite_brick_wall.json -6ce2cb7882f41fcbcd641a442c98767bda61f65f assets/create/models/item/small_deepslate_bricks.json +d5a033d3dedb799c4752b7e68b6881529f38f8e5 assets/create/models/item/small_crimsite_bricks.json ce79900b7aa1eff0d42cabcd0a7f80ef20824551 assets/create/models/item/small_deepslate_brick_slab.json a260711af72c749a6b72f72515bbecb2e01e3ed8 assets/create/models/item/small_deepslate_brick_stairs.json 4e474891c6a269166c2eb413fae78699e5657af4 assets/create/models/item/small_deepslate_brick_wall.json -e412eaa393965ef5426c3d8d95d5c9d69e37e054 assets/create/models/item/small_diorite_bricks.json +6ce2cb7882f41fcbcd641a442c98767bda61f65f assets/create/models/item/small_deepslate_bricks.json 55b82c2f30d52acee5c3807ab2ffaed1d773cfa8 assets/create/models/item/small_diorite_brick_slab.json 49a17610b5b05595894ca2683056cecd724c1111 assets/create/models/item/small_diorite_brick_stairs.json dd3630a9c5500e6cf09e95d09e7a3cc99db11899 assets/create/models/item/small_diorite_brick_wall.json -c29d35da520d0fe828bb364db403b8cdf55f0a2e assets/create/models/item/small_dripstone_bricks.json +e412eaa393965ef5426c3d8d95d5c9d69e37e054 assets/create/models/item/small_diorite_bricks.json 21e281ec7a82d48018366a0737c6867f625b4663 assets/create/models/item/small_dripstone_brick_slab.json 6862e72eedf80536f40b6ac42ff78f13f62d012f assets/create/models/item/small_dripstone_brick_stairs.json ca8613bb64ceb562c36dd1d6a3b76b5f15f35be9 assets/create/models/item/small_dripstone_brick_wall.json -81eae95d20a9e99a070dfb8f6e6c22ef29f628d3 assets/create/models/item/small_granite_bricks.json +c29d35da520d0fe828bb364db403b8cdf55f0a2e assets/create/models/item/small_dripstone_bricks.json a19aa13eb3c04a9e0931e22e4170eec80950efab assets/create/models/item/small_granite_brick_slab.json 51bc02587cad5dfcfaf9d040848faa5277a25a5f assets/create/models/item/small_granite_brick_stairs.json 147a6f42be8312fbf050ad53c1625a1458f73cc3 assets/create/models/item/small_granite_brick_wall.json -bfa76583bca68134bbe2793c263cc0b71e1406af assets/create/models/item/small_limestone_bricks.json +81eae95d20a9e99a070dfb8f6e6c22ef29f628d3 assets/create/models/item/small_granite_bricks.json a9599981e872e683dacd01b2f0af511f416dd526 assets/create/models/item/small_limestone_brick_slab.json d8f8eadea13fc90a1c8ee5aca4be71fb22a79fd0 assets/create/models/item/small_limestone_brick_stairs.json 67626afe8b0fc9135456a24ea49c602b83d6970d assets/create/models/item/small_limestone_brick_wall.json -2d4b22d4028c55cbabc7eb405c2c6d485390afab assets/create/models/item/small_ochrum_bricks.json +bfa76583bca68134bbe2793c263cc0b71e1406af assets/create/models/item/small_limestone_bricks.json f7547aacb8bdaf61424cd56565e40d3cd40a1cfa assets/create/models/item/small_ochrum_brick_slab.json 8a320ff9e75e16a182cb7d07784a595fe7876e04 assets/create/models/item/small_ochrum_brick_stairs.json 0eedd4fe5b0a82de16fed148836087ff4ae64a74 assets/create/models/item/small_ochrum_brick_wall.json +2d4b22d4028c55cbabc7eb405c2c6d485390afab assets/create/models/item/small_ochrum_bricks.json 97b8e3eaddac0b93d4b6bc140f573969fcba5823 assets/create/models/item/small_rose_quartz_tiles.json -ac1bf1d2344517c18b945afa198d5d05e2866f6b assets/create/models/item/small_scorchia_bricks.json 63ef9901ba1014027e8c873d8374d86abb73158e assets/create/models/item/small_scorchia_brick_slab.json f52601fe54695c225a595a65e9130665582db856 assets/create/models/item/small_scorchia_brick_stairs.json b4e0db087dc88e0a3a4a82197a0ce347d3c7a7aa assets/create/models/item/small_scorchia_brick_wall.json -25b6bb40701e782ed64414ec8391b304ad5e6b12 assets/create/models/item/small_scoria_bricks.json +ac1bf1d2344517c18b945afa198d5d05e2866f6b assets/create/models/item/small_scorchia_bricks.json a4bdeb066dcc44f8be058e6d9dfc0a3fd34819bf assets/create/models/item/small_scoria_brick_slab.json 5ffb0e7de917013cd82cece2506d72fce2cd5fc6 assets/create/models/item/small_scoria_brick_stairs.json 67dcbc7d52fbbe88f89b36e04f970b27024741e4 assets/create/models/item/small_scoria_brick_wall.json -90943707d8b232d816392bec8ae05e06b6eedd72 assets/create/models/item/small_tuff_bricks.json +25b6bb40701e782ed64414ec8391b304ad5e6b12 assets/create/models/item/small_scoria_bricks.json 91a144100eea8b4e67a0a4f31b35a714693fa001 assets/create/models/item/small_tuff_brick_slab.json b3f89c9f8e46fbdfc58171073d6ad91c588e5853 assets/create/models/item/small_tuff_brick_stairs.json 52c1d4cfb5f1726c9ccbb00db60bdd6f760bf40f assets/create/models/item/small_tuff_brick_wall.json -6935d6d9dbdb99fe7258d9347419d65571711263 assets/create/models/item/small_veridium_bricks.json +90943707d8b232d816392bec8ae05e06b6eedd72 assets/create/models/item/small_tuff_bricks.json 0bb60fc6ab570db83214fd10c83d931f6677e361 assets/create/models/item/small_veridium_brick_slab.json 89918d98b6830477b21ab7fb9e30807d3ca1d379 assets/create/models/item/small_veridium_brick_stairs.json ab4e7695e99548f83a89f3d5ad7690a576bafcc0 assets/create/models/item/small_veridium_brick_wall.json +6935d6d9dbdb99fe7258d9347419d65571711263 assets/create/models/item/small_veridium_bricks.json 6cf508dbd3d015ea730366db92bb17844dc2ca06 assets/create/models/item/smart_chute.json 9201f00edcf2ffa33cb079c28b5c33e39872c824 assets/create/models/item/smart_fluid_pipe.json 67804bdd890f167010f6101a700e85a3245f4cc3 assets/create/models/item/speedometer.json @@ -2482,9 +2482,9 @@ b82ab0c69df330f6f938ed1beee7b4add67d2e50 assets/create/models/item/steam_engine. 24acc593a5e910b6301afcb3f23cba526d23a0ab assets/create/models/item/steam_whistle.json 54f200be903e056e5cf9e2186f0a0a51f8f0f84e assets/create/models/item/sticker.json 0f88de164439640cc175ceef2017f7416b5a7018 assets/create/models/item/sticky_mechanical_piston.json -4b640b66765b206f8c2884b7c1a1ef860b81d841 assets/create/models/item/stockpile_switch.json 97222d9eb36944a89b8047423eafa6af3da82b0b assets/create/models/item/stock_link.json 67c98c6c7f2122850acfbee34688572934fdd226 assets/create/models/item/stock_ticker.json +4b640b66765b206f8c2884b7c1a1ef860b81d841 assets/create/models/item/stockpile_switch.json 6ee792277b9fd980c40e18e841afa63fc500ed0b assets/create/models/item/stressometer.json 8d4ce1ccf180016506292f63188c10d0dabe0ee3 assets/create/models/item/sturdy_sheet.json a10bb4d6d1a4483a806e3aaa086d48c0e20aaefe assets/create/models/item/super_glue.json @@ -2511,36 +2511,36 @@ b0f6d37aa695395e28a23d36775092f63ab3f5a5 assets/create/models/item/vertical_gear 9c5087114e35052c5e56bb752252de5d092408c5 assets/create/models/item/warped_window.json cdc1226f8a098adbc420fe50c98466507c3a3157 assets/create/models/item/warped_window_pane.json e5939b47bf7440dc101c667e68ef6bf750a3290f assets/create/models/item/water_wheel.json -be2f058a7ecb015599ee052ec27c4360d636999a assets/create/models/item/waxed_copper_shingles.json adc188e4e48bea80607c6e0c7076c9bdd7236cb0 assets/create/models/item/waxed_copper_shingle_slab.json 7e224aceaa94361256e95e4c44d8814aebaf297c assets/create/models/item/waxed_copper_shingle_stairs.json -eced19a2f721c54b968e5979cde2705f15faf3e1 assets/create/models/item/waxed_copper_tiles.json +be2f058a7ecb015599ee052ec27c4360d636999a assets/create/models/item/waxed_copper_shingles.json 68b3632c34adb9991aa993385f53624632c260f2 assets/create/models/item/waxed_copper_tile_slab.json a7fc0cc2d32dcd49c3274597ce7121f01fca03f8 assets/create/models/item/waxed_copper_tile_stairs.json -5336907eba067492f6d00b4b8514f9663830a1d5 assets/create/models/item/waxed_exposed_copper_shingles.json +eced19a2f721c54b968e5979cde2705f15faf3e1 assets/create/models/item/waxed_copper_tiles.json fd428034c46a240c4bb2a1aee625b8767f41c3ef assets/create/models/item/waxed_exposed_copper_shingle_slab.json 43d714187fe6c0cd1ed7abcddef1ebcd63979ff4 assets/create/models/item/waxed_exposed_copper_shingle_stairs.json -962b24b3611abefc21920d01452944710ab0da3f assets/create/models/item/waxed_exposed_copper_tiles.json +5336907eba067492f6d00b4b8514f9663830a1d5 assets/create/models/item/waxed_exposed_copper_shingles.json 25f5a10fe8e6acbdbf8457d56aeee065835a93ec assets/create/models/item/waxed_exposed_copper_tile_slab.json 22917505d328fb5b489b9f7f9068f1514b784abb assets/create/models/item/waxed_exposed_copper_tile_stairs.json -12c3dd893bddb66b9b387652c67c8f0e24b643ff assets/create/models/item/waxed_oxidized_copper_shingles.json +962b24b3611abefc21920d01452944710ab0da3f assets/create/models/item/waxed_exposed_copper_tiles.json 9b7c82376ea8c1c8ecbc7bbe15283f84b0d50d94 assets/create/models/item/waxed_oxidized_copper_shingle_slab.json fbb6043eb935aa0641a482ee7300c780be257440 assets/create/models/item/waxed_oxidized_copper_shingle_stairs.json -6b8f75d4818db903b22f4626d02671ab76a61023 assets/create/models/item/waxed_oxidized_copper_tiles.json +12c3dd893bddb66b9b387652c67c8f0e24b643ff assets/create/models/item/waxed_oxidized_copper_shingles.json 6e7bc8eb9a87d903dcc590e9918ce8d4411bf190 assets/create/models/item/waxed_oxidized_copper_tile_slab.json 10136759b31e4d957e8374948460d6c984711326 assets/create/models/item/waxed_oxidized_copper_tile_stairs.json -ce2dcfc01205da1dc70f34091a2c24f563e72466 assets/create/models/item/waxed_weathered_copper_shingles.json +6b8f75d4818db903b22f4626d02671ab76a61023 assets/create/models/item/waxed_oxidized_copper_tiles.json 2bf249c677d30a4febf950fa7c6caa87c348c54e assets/create/models/item/waxed_weathered_copper_shingle_slab.json 9fa84f2555d82b5a1550b748a332ceb443a04fae assets/create/models/item/waxed_weathered_copper_shingle_stairs.json -02d2ac048c9bea86d10673254dfc107f3c9c5bb5 assets/create/models/item/waxed_weathered_copper_tiles.json +ce2dcfc01205da1dc70f34091a2c24f563e72466 assets/create/models/item/waxed_weathered_copper_shingles.json ab40b1a5a03cd290d53ef2ea65f90dcfcd2673de assets/create/models/item/waxed_weathered_copper_tile_slab.json dadc7b65a4527e288c21a20df978796a8c444fd2 assets/create/models/item/waxed_weathered_copper_tile_stairs.json -86b8e71fa8b7aeb73eafda89d8d06d83da6a5d25 assets/create/models/item/weathered_copper_shingles.json +02d2ac048c9bea86d10673254dfc107f3c9c5bb5 assets/create/models/item/waxed_weathered_copper_tiles.json 94db30ad2381d2f2c37cdfd0d5ce5c45a2807640 assets/create/models/item/weathered_copper_shingle_slab.json 7262c01df4b5a8cd8c6a5545062f251d5ad9fd06 assets/create/models/item/weathered_copper_shingle_stairs.json -99f17b16b68201aefb78298b3e6c657e3c2235e0 assets/create/models/item/weathered_copper_tiles.json +86b8e71fa8b7aeb73eafda89d8d06d83da6a5d25 assets/create/models/item/weathered_copper_shingles.json 0b1b299d6dfab65b6060305a8b3e51f6e2df09f4 assets/create/models/item/weathered_copper_tile_slab.json 0c3989b44fde934ba8b88b071887e5ede522c417 assets/create/models/item/weathered_copper_tile_stairs.json +99f17b16b68201aefb78298b3e6c657e3c2235e0 assets/create/models/item/weathered_copper_tiles.json b5d591fbb40e062efe301b3b3b49580e5ad64566 assets/create/models/item/weathered_iron_block.json a569ddd725898a86f8745e46723edeff7fe7f2e9 assets/create/models/item/weathered_iron_window.json 68ca3316942b2df1623893cda722402238ab7724 assets/create/models/item/weathered_iron_window_pane.json @@ -2579,42 +2579,42 @@ b25b8c230fde8d6d77e8d516bed52236652b5ca6 data/create/advancements/recipes/buildi 537fe5dffa659e5838379587fbd84f2f641551ea data/create/advancements/recipes/building_blocks/calcite_pillar_from_stone_types_calcite_stonecutting.json 2636ac059b6412a46402cccbe5abe4fb49143662 data/create/advancements/recipes/building_blocks/cherry_window.json 3e08f575543f1e0abea979dbaee643572734788b data/create/advancements/recipes/building_blocks/cherry_window_pane.json -09f332cd34e6a92af9e8e4e757418c7ba8b536da data/create/advancements/recipes/building_blocks/copper_shingles_from_ingots_copper_stonecutting.json 55214a0fd27318b17163cace66c7525785127ef8 data/create/advancements/recipes/building_blocks/copper_shingle_slab.json fb4210dbbfb74459e10da94a540f3bfdf91c4a8d data/create/advancements/recipes/building_blocks/copper_shingle_slab_from_copper_shingles_stonecutting.json 31b04ac1b117fb65f5129c5bbb48e42c1c4c1003 data/create/advancements/recipes/building_blocks/copper_shingle_stairs.json bef4a9a4c2e722d4f086d6b4c9d6fa1d0836ec10 data/create/advancements/recipes/building_blocks/copper_shingle_stairs_from_copper_shingles_stonecutting.json -f66a48f01afb4fa1babee4a8c28b032280c3ac9e data/create/advancements/recipes/building_blocks/copper_tiles_from_ingots_copper_stonecutting.json +09f332cd34e6a92af9e8e4e757418c7ba8b536da data/create/advancements/recipes/building_blocks/copper_shingles_from_ingots_copper_stonecutting.json ef79744ebf31453d1c81789afed7b717837b3515 data/create/advancements/recipes/building_blocks/copper_tile_slab.json 8e9997c43b1c06521fe8d38b04ccb3f04c93d537 data/create/advancements/recipes/building_blocks/copper_tile_slab_from_copper_tiles_stonecutting.json a2609aa8b5453f2294f38c81d26e0b8dad71087d data/create/advancements/recipes/building_blocks/copper_tile_stairs.json d47e46c66bf69e8310e6687716858842e8aed7b5 data/create/advancements/recipes/building_blocks/copper_tile_stairs_from_copper_tiles_stonecutting.json +f66a48f01afb4fa1babee4a8c28b032280c3ac9e data/create/advancements/recipes/building_blocks/copper_tiles_from_ingots_copper_stonecutting.json cc14d10c75ab0fdd7c54db1922e5e56667739fef data/create/advancements/recipes/building_blocks/copycat_panel_from_ingots_zinc_stonecutting.json 55d2812be912c857ff666d581174378857d3bce2 data/create/advancements/recipes/building_blocks/copycat_step_from_ingots_zinc_stonecutting.json -8615fc107b1f4df86711081a9dccac8631b02e6b data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_shingles_from_honeycomb.json 0e0eba8550768ef69087dff8112814f25233fab7 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_shingle_slab_from_honeycomb.json 2c960d55273df4c0c8c33b2c329175b35b18fc8c data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_shingle_stairs_from_honeycomb.json -fa8f3ed9a4c6f0c3cd4c21b0ae4dc8ca4dba8678 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_tiles_from_honeycomb.json +8615fc107b1f4df86711081a9dccac8631b02e6b data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_shingles_from_honeycomb.json d6f2aa7fd10c96f71c47bdabb3e53dc4c4e73706 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_tile_slab_from_honeycomb.json eca165eee20adba1557ccc74ef50ee90311b3019 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_tile_stairs_from_honeycomb.json -88a236933e8dfe0d809bda098d16782288c4800c data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_shingles_from_honeycomb.json +fa8f3ed9a4c6f0c3cd4c21b0ae4dc8ca4dba8678 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_tiles_from_honeycomb.json 301149dabc4dce290b4884f4ed3cb2132123adf0 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_shingle_slab_from_honeycomb.json f360dce7bece72672f2624710c88edbe3e3f8885 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_shingle_stairs_from_honeycomb.json -bc27959288766492746f41c4810350dcef1b320d data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_tiles_from_honeycomb.json +88a236933e8dfe0d809bda098d16782288c4800c data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_shingles_from_honeycomb.json 7ceb4b74ff84ed404518b6cb5e1432dac5903b5f data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_tile_slab_from_honeycomb.json ec1eec3bc25534484cb264134e62b578525422aa data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_tile_stairs_from_honeycomb.json -2e8f1da032110e8c5ec375ffd425e5eed7f58cae data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_shingles_from_honeycomb.json +bc27959288766492746f41c4810350dcef1b320d data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_tiles_from_honeycomb.json e34abb4d51c1d00419fc3d3799ca0d9fe7ea1027 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_shingle_slab_from_honeycomb.json 9471e190beb603f022fb234f2cf35b5b4b93f0c0 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_shingle_stairs_from_honeycomb.json -17fe14b753953a68887cd001fcaa264ef031463f data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_tiles_from_honeycomb.json +2e8f1da032110e8c5ec375ffd425e5eed7f58cae data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_shingles_from_honeycomb.json 2577754364f05264fac325f67597230d01fa0c1d data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_tile_slab_from_honeycomb.json 003e384d9594a4e6ef5678e74f04b56de047dbde data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_tile_stairs_from_honeycomb.json -5009a82a897a15407fec785005107b0d228fffe7 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_shingles_from_honeycomb.json +17fe14b753953a68887cd001fcaa264ef031463f data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_tiles_from_honeycomb.json 70ce32937dcf349dce77fef8022bc0c15863f6a6 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_shingle_slab_from_honeycomb.json 1fc498238dcc2705152573ba7f74bb50e7e66ca7 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_shingle_stairs_from_honeycomb.json -d12aa3dd5457327224fd007211878eec21043971 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_tiles_from_honeycomb.json +5009a82a897a15407fec785005107b0d228fffe7 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_shingles_from_honeycomb.json 6f461d7036de914c636b7916dc798775ccf25be1 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_tile_slab_from_honeycomb.json 3bc9efcddecd23fd06c6056a0ee7b937959cecc0 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_tile_stairs_from_honeycomb.json +d12aa3dd5457327224fd007211878eec21043971 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_tiles_from_honeycomb.json 3064c52dea808a00c211bfedb96106b563f480da data/create/advancements/recipes/building_blocks/crafting/kinetics/black_seat.json f07a0b21db200ab68a7df02db519869f68953286 data/create/advancements/recipes/building_blocks/crafting/kinetics/black_seat_from_other_seat.json 80ac4db5c53c7efc2666a7abb4e2e876c5f86588 data/create/advancements/recipes/building_blocks/crafting/kinetics/blue_seat.json @@ -2715,7 +2715,6 @@ f3188b24f8108be4219016689a4768f826b4fef3 data/create/advancements/recipes/buildi e88373b83226d860b0c2131213f5d3b09f31ab96 data/create/advancements/recipes/building_blocks/crimsite_pillar_from_stone_types_crimsite_stonecutting.json 09f7122cf360fd56bde2b1659bbed526f9a119c4 data/create/advancements/recipes/building_blocks/crimson_window.json b5234c6050bc0c6fe872a5ddc87d46ba39e07971 data/create/advancements/recipes/building_blocks/crimson_window_pane.json -b32f4345517c3c7299a06489325bd85f987145dc data/create/advancements/recipes/building_blocks/cut_andesite_bricks_from_stone_types_andesite_stonecutting.json 22fe2e61d7e9836d9f71c39bfbba50efc2fa184d data/create/advancements/recipes/building_blocks/cut_andesite_brick_slab.json 6d8d28364f1016dfd1d7cbe4a2637e2b6224e4d8 data/create/advancements/recipes/building_blocks/cut_andesite_brick_slab_from_stone_types_andesite_stonecutting.json 39e904f66d2194de5437b5da2f8db8b6f03d78f4 data/create/advancements/recipes/building_blocks/cut_andesite_brick_slab_recycling.json @@ -2723,6 +2722,7 @@ b32f4345517c3c7299a06489325bd85f987145dc data/create/advancements/recipes/buildi 480c696956b99c96cbaf46e7dad9711c40680ec8 data/create/advancements/recipes/building_blocks/cut_andesite_brick_stairs_from_stone_types_andesite_stonecutting.json 8d504cdb99f5dc59bef5ff35d0b443f2f4ba21d2 data/create/advancements/recipes/building_blocks/cut_andesite_brick_wall.json e1b8e5906d54368c98867b83143dc7acc7b0aa28 data/create/advancements/recipes/building_blocks/cut_andesite_brick_wall_from_stone_types_andesite_stonecutting.json +b32f4345517c3c7299a06489325bd85f987145dc data/create/advancements/recipes/building_blocks/cut_andesite_bricks_from_stone_types_andesite_stonecutting.json d5b44158f9a98d874d941fc4df99de7a2657af21 data/create/advancements/recipes/building_blocks/cut_andesite_from_stone_types_andesite_stonecutting.json c11998f554bbd42efdbdf58cf8efe5bcf69230de data/create/advancements/recipes/building_blocks/cut_andesite_slab.json 1f457c0e816e4dd70e1a960015d2004814d11926 data/create/advancements/recipes/building_blocks/cut_andesite_slab_from_stone_types_andesite_stonecutting.json @@ -2731,7 +2731,6 @@ a4d7adf49472a2069bad72defd39b111b83def3d data/create/advancements/recipes/buildi 6d38bb2b9812761c594ebdf717284ba8d32e88bc data/create/advancements/recipes/building_blocks/cut_andesite_stairs_from_stone_types_andesite_stonecutting.json 2f6b2296b11e0e743d68749e65af5ffa0f374998 data/create/advancements/recipes/building_blocks/cut_andesite_wall.json caf3b1c62d0f8df3ce126535f0566c899577bedb data/create/advancements/recipes/building_blocks/cut_andesite_wall_from_stone_types_andesite_stonecutting.json -54188623046e989d21e6e155933e4084fb2882c4 data/create/advancements/recipes/building_blocks/cut_asurine_bricks_from_stone_types_asurine_stonecutting.json 536a2bed2ed1e7e249886ef376c96a8d5a1facdc data/create/advancements/recipes/building_blocks/cut_asurine_brick_slab.json a4e833cadfbb82222a70d66524e804c83ea13f7b data/create/advancements/recipes/building_blocks/cut_asurine_brick_slab_from_stone_types_asurine_stonecutting.json 610163ac2f4b06121931a81ac4b3df39ece61998 data/create/advancements/recipes/building_blocks/cut_asurine_brick_slab_recycling.json @@ -2739,6 +2738,7 @@ a4e833cadfbb82222a70d66524e804c83ea13f7b data/create/advancements/recipes/buildi f92f31e80cc026160217afb6c757987f75ed0b33 data/create/advancements/recipes/building_blocks/cut_asurine_brick_stairs_from_stone_types_asurine_stonecutting.json fa6dc7eaa32652a00a7217ae25967de0791088b6 data/create/advancements/recipes/building_blocks/cut_asurine_brick_wall.json 33f361369bfd92f53b3e40c837b336edd04a26e9 data/create/advancements/recipes/building_blocks/cut_asurine_brick_wall_from_stone_types_asurine_stonecutting.json +54188623046e989d21e6e155933e4084fb2882c4 data/create/advancements/recipes/building_blocks/cut_asurine_bricks_from_stone_types_asurine_stonecutting.json a6b871faa10badaaaa1a0ebbba94c4f2f627c43f data/create/advancements/recipes/building_blocks/cut_asurine_from_stone_types_asurine_stonecutting.json 719e1d4fea3457f2990be6a5d6cd87915d546217 data/create/advancements/recipes/building_blocks/cut_asurine_slab.json 586918291dda711c79941cf484cb62dbb853a271 data/create/advancements/recipes/building_blocks/cut_asurine_slab_from_stone_types_asurine_stonecutting.json @@ -2747,7 +2747,6 @@ bd2a630d242ae9c89b071b0401285068071a346c data/create/advancements/recipes/buildi 03d7b1609d161043e28661d74f53b06d4408f561 data/create/advancements/recipes/building_blocks/cut_asurine_stairs_from_stone_types_asurine_stonecutting.json cba4a6feaf695e665204cac36f9109ba941b12a6 data/create/advancements/recipes/building_blocks/cut_asurine_wall.json 3327651dd3f2fd778abdcfe70d25137d916f3def data/create/advancements/recipes/building_blocks/cut_asurine_wall_from_stone_types_asurine_stonecutting.json -44873f9d05abde7d52a6eacdf3573d8b69c69452 data/create/advancements/recipes/building_blocks/cut_calcite_bricks_from_stone_types_calcite_stonecutting.json a070ffe63c182b33c4c6faedb391f51a209c0e27 data/create/advancements/recipes/building_blocks/cut_calcite_brick_slab.json 7ba1e7add81422599f798153e4fd069e9fbfdebf data/create/advancements/recipes/building_blocks/cut_calcite_brick_slab_from_stone_types_calcite_stonecutting.json f5e80ec393c306485d666d6f9f91c55d9f1ba592 data/create/advancements/recipes/building_blocks/cut_calcite_brick_slab_recycling.json @@ -2755,6 +2754,7 @@ f5e80ec393c306485d666d6f9f91c55d9f1ba592 data/create/advancements/recipes/buildi 627f85aa63133cf95dd828092e0232b9ec8acfd5 data/create/advancements/recipes/building_blocks/cut_calcite_brick_stairs_from_stone_types_calcite_stonecutting.json d8870e522a68274cc90eab07ea17b7b6cdc5a16c data/create/advancements/recipes/building_blocks/cut_calcite_brick_wall.json cdf5927f3c1b3ef8904f38f66317412799e189fb data/create/advancements/recipes/building_blocks/cut_calcite_brick_wall_from_stone_types_calcite_stonecutting.json +44873f9d05abde7d52a6eacdf3573d8b69c69452 data/create/advancements/recipes/building_blocks/cut_calcite_bricks_from_stone_types_calcite_stonecutting.json 9f8c31b0db2aab8f1c8f42bcef15a74bc36887d4 data/create/advancements/recipes/building_blocks/cut_calcite_from_stone_types_calcite_stonecutting.json 857666ad1c6a5cc886f6896a18f560098afaa67b data/create/advancements/recipes/building_blocks/cut_calcite_slab.json c55074cd091b0e078105abdc940c62afa8984265 data/create/advancements/recipes/building_blocks/cut_calcite_slab_from_stone_types_calcite_stonecutting.json @@ -2763,7 +2763,6 @@ c55074cd091b0e078105abdc940c62afa8984265 data/create/advancements/recipes/buildi ba3378e1d08de2af0b2a725727cf9f68bda60044 data/create/advancements/recipes/building_blocks/cut_calcite_stairs_from_stone_types_calcite_stonecutting.json db5f4e1eee91c2a65d36164c20aba0e9d3a502ae data/create/advancements/recipes/building_blocks/cut_calcite_wall.json 19de370083d2cf1234c9c4e6ff45d85ef34a1ac8 data/create/advancements/recipes/building_blocks/cut_calcite_wall_from_stone_types_calcite_stonecutting.json -b9a2edda241f6e0677a2003300f0be5d3ff8f4b0 data/create/advancements/recipes/building_blocks/cut_crimsite_bricks_from_stone_types_crimsite_stonecutting.json 9fda0e6edde197a9c28a854419a2a07e323b6b53 data/create/advancements/recipes/building_blocks/cut_crimsite_brick_slab.json 2da3f139759be7eea552885b2063a0e2dfc647b1 data/create/advancements/recipes/building_blocks/cut_crimsite_brick_slab_from_stone_types_crimsite_stonecutting.json 62d928c8ab2e09a3f87adacb5adb1a5ddc1d2a7b data/create/advancements/recipes/building_blocks/cut_crimsite_brick_slab_recycling.json @@ -2771,6 +2770,7 @@ b9a2edda241f6e0677a2003300f0be5d3ff8f4b0 data/create/advancements/recipes/buildi 89850244feb8a3293ba96702b7a56a4bea84e1f3 data/create/advancements/recipes/building_blocks/cut_crimsite_brick_stairs_from_stone_types_crimsite_stonecutting.json 267cab789c73d474299542fb0719967501fcf0c9 data/create/advancements/recipes/building_blocks/cut_crimsite_brick_wall.json 27007676b86eb8a3498982d8b5e68495b84d62d5 data/create/advancements/recipes/building_blocks/cut_crimsite_brick_wall_from_stone_types_crimsite_stonecutting.json +b9a2edda241f6e0677a2003300f0be5d3ff8f4b0 data/create/advancements/recipes/building_blocks/cut_crimsite_bricks_from_stone_types_crimsite_stonecutting.json a88d252d4e634ff194daa3ff98fd7e965e3ed09a data/create/advancements/recipes/building_blocks/cut_crimsite_from_stone_types_crimsite_stonecutting.json f703136e1783a42252bc1d89c31e5563cbdff583 data/create/advancements/recipes/building_blocks/cut_crimsite_slab.json 3330d332462da22de48d07b62277c1df8e646a3e data/create/advancements/recipes/building_blocks/cut_crimsite_slab_from_stone_types_crimsite_stonecutting.json @@ -2779,7 +2779,6 @@ c2707e5969f0c554537dda9d3e2a4c13e19863c3 data/create/advancements/recipes/buildi e9ba513178090b020525e72468a0450e225da779 data/create/advancements/recipes/building_blocks/cut_crimsite_stairs_from_stone_types_crimsite_stonecutting.json 7fb5ce65b7b5c2d76b4306d407aaa6eefe07b7e5 data/create/advancements/recipes/building_blocks/cut_crimsite_wall.json a83d5b669f92bd833af2768d2cf5d4797a86b63c data/create/advancements/recipes/building_blocks/cut_crimsite_wall_from_stone_types_crimsite_stonecutting.json -bc9eb21df37df4b69e5d202b3b770698a16f4413 data/create/advancements/recipes/building_blocks/cut_deepslate_bricks_from_stone_types_deepslate_stonecutting.json 2c380e8ddc83cef4213f136ff7a196d861728914 data/create/advancements/recipes/building_blocks/cut_deepslate_brick_slab.json 87b5dfc1e61fabe4e7661bea0d7a56cb75197a81 data/create/advancements/recipes/building_blocks/cut_deepslate_brick_slab_from_stone_types_deepslate_stonecutting.json 09cde6df1120cc5f5f129023885f323b4d1eeae9 data/create/advancements/recipes/building_blocks/cut_deepslate_brick_slab_recycling.json @@ -2787,6 +2786,7 @@ bc9eb21df37df4b69e5d202b3b770698a16f4413 data/create/advancements/recipes/buildi 28e15fe2c377540cb631f6648f49090f234e7704 data/create/advancements/recipes/building_blocks/cut_deepslate_brick_stairs_from_stone_types_deepslate_stonecutting.json d2b34f455ab0053f24a4f9dec7dcce45832ef25b data/create/advancements/recipes/building_blocks/cut_deepslate_brick_wall.json 7b174b65b813b4a9ca507e71fa142931e074f336 data/create/advancements/recipes/building_blocks/cut_deepslate_brick_wall_from_stone_types_deepslate_stonecutting.json +bc9eb21df37df4b69e5d202b3b770698a16f4413 data/create/advancements/recipes/building_blocks/cut_deepslate_bricks_from_stone_types_deepslate_stonecutting.json 83db3f5b46c996481b930974bddba75c82c115af data/create/advancements/recipes/building_blocks/cut_deepslate_from_stone_types_deepslate_stonecutting.json 8e8816aad8212c3557e77cc01df551fe1a0a306d data/create/advancements/recipes/building_blocks/cut_deepslate_slab.json 14ea447072200733dd9551a5ac6a9544593dd9f7 data/create/advancements/recipes/building_blocks/cut_deepslate_slab_from_stone_types_deepslate_stonecutting.json @@ -2795,7 +2795,6 @@ c7870abb459c8b174c380282ae211a87ab252521 data/create/advancements/recipes/buildi 4f157401a3019c96cc6ae5a0036f31351c651fbb data/create/advancements/recipes/building_blocks/cut_deepslate_stairs_from_stone_types_deepslate_stonecutting.json 9ae9635fa129aab54a7ec971b9cc61d300d3d53e data/create/advancements/recipes/building_blocks/cut_deepslate_wall.json 9b5df53000c79a7b20e3a1888e003b704809feda data/create/advancements/recipes/building_blocks/cut_deepslate_wall_from_stone_types_deepslate_stonecutting.json -fdef99789ca74623b00b05be2f975b63831645db data/create/advancements/recipes/building_blocks/cut_diorite_bricks_from_stone_types_diorite_stonecutting.json 30a00465dc9b19d8024146e2c2d6b9f41562da30 data/create/advancements/recipes/building_blocks/cut_diorite_brick_slab.json a55e7daf48a487d74b4a01e30b80968094154d2b data/create/advancements/recipes/building_blocks/cut_diorite_brick_slab_from_stone_types_diorite_stonecutting.json e445a3d8fd00f5e4f2ee56c797d8abf548598447 data/create/advancements/recipes/building_blocks/cut_diorite_brick_slab_recycling.json @@ -2803,6 +2802,7 @@ b421f24513612dd7a5d8977d7bff122fd5cf9522 data/create/advancements/recipes/buildi 3fe00adac35beeda79b7f9d930a1f13b033c0f12 data/create/advancements/recipes/building_blocks/cut_diorite_brick_stairs_from_stone_types_diorite_stonecutting.json 6d2235b8587863107a6d1a0818c81ee3dc217cdf data/create/advancements/recipes/building_blocks/cut_diorite_brick_wall.json 0ec4b69e98adf961f5d4d63700f11ad66a4116b5 data/create/advancements/recipes/building_blocks/cut_diorite_brick_wall_from_stone_types_diorite_stonecutting.json +fdef99789ca74623b00b05be2f975b63831645db data/create/advancements/recipes/building_blocks/cut_diorite_bricks_from_stone_types_diorite_stonecutting.json c9f52e0661fdc266f8429faf1570124fecfa2d6a data/create/advancements/recipes/building_blocks/cut_diorite_from_stone_types_diorite_stonecutting.json c7b73ddec6402e8b5ff5daedbbbc74f882338a8e data/create/advancements/recipes/building_blocks/cut_diorite_slab.json 46c841e5aae99106cbc28026dcfec946976127e5 data/create/advancements/recipes/building_blocks/cut_diorite_slab_from_stone_types_diorite_stonecutting.json @@ -2811,7 +2811,6 @@ ce67a5fae622955ad795e2b3d14c159a4c47b936 data/create/advancements/recipes/buildi 3b7ec28df80ea9cf87980b2c2184858ba6152a3f data/create/advancements/recipes/building_blocks/cut_diorite_stairs_from_stone_types_diorite_stonecutting.json c8fe9ab53eda2cdbff08678ebb577c169ea61a91 data/create/advancements/recipes/building_blocks/cut_diorite_wall.json 050f67b5a662bea3ef972521ef7f81c2ba99015c data/create/advancements/recipes/building_blocks/cut_diorite_wall_from_stone_types_diorite_stonecutting.json -b60683fdd629b201f40a6f9bb6594df7c5ac13f1 data/create/advancements/recipes/building_blocks/cut_dripstone_bricks_from_stone_types_dripstone_stonecutting.json 1e0d39ed56e2ab4eac084f26a1c6de905db29220 data/create/advancements/recipes/building_blocks/cut_dripstone_brick_slab.json 020cbc4c8063d186d3f5c9ece429e4cdff53cf63 data/create/advancements/recipes/building_blocks/cut_dripstone_brick_slab_from_stone_types_dripstone_stonecutting.json b44c9e7f9f62ffffb5566901e0a22010ba76641c data/create/advancements/recipes/building_blocks/cut_dripstone_brick_slab_recycling.json @@ -2819,6 +2818,7 @@ b44c9e7f9f62ffffb5566901e0a22010ba76641c data/create/advancements/recipes/buildi 466fbdf7de8dacd1032fb7af690862bb68707876 data/create/advancements/recipes/building_blocks/cut_dripstone_brick_stairs_from_stone_types_dripstone_stonecutting.json 253b54c191c933e88fa6a9b4e7c94340082c7d60 data/create/advancements/recipes/building_blocks/cut_dripstone_brick_wall.json e176568e3de8b8ca17a788f4cea89002b5ad2d1d data/create/advancements/recipes/building_blocks/cut_dripstone_brick_wall_from_stone_types_dripstone_stonecutting.json +b60683fdd629b201f40a6f9bb6594df7c5ac13f1 data/create/advancements/recipes/building_blocks/cut_dripstone_bricks_from_stone_types_dripstone_stonecutting.json ddc5a16cf0d2790d8133ab6801f4c55317d776e4 data/create/advancements/recipes/building_blocks/cut_dripstone_from_stone_types_dripstone_stonecutting.json 6e40c9af0747a8b3adb805ddd8fbb947aedb408c data/create/advancements/recipes/building_blocks/cut_dripstone_slab.json e7761f71f797d2e62dc0860cbd5153955b9be86c data/create/advancements/recipes/building_blocks/cut_dripstone_slab_from_stone_types_dripstone_stonecutting.json @@ -2827,7 +2827,6 @@ a199a9f78a44f4313a922b317893c68f743dc1a9 data/create/advancements/recipes/buildi b68a95a565ee9a3aec017431aa5b8cc6fffec3ef data/create/advancements/recipes/building_blocks/cut_dripstone_stairs_from_stone_types_dripstone_stonecutting.json a4287f34f95c008bdf7c0a886d05c3960665147b data/create/advancements/recipes/building_blocks/cut_dripstone_wall.json 76f5d4a6a9895064b15ae0c0f27a138bb3d57dbf data/create/advancements/recipes/building_blocks/cut_dripstone_wall_from_stone_types_dripstone_stonecutting.json -24cc01d592faf2bad57fc9b9a1de52c50d225446 data/create/advancements/recipes/building_blocks/cut_granite_bricks_from_stone_types_granite_stonecutting.json 83148f66dc7418740b6f9b6a660b0b9306d87f7c data/create/advancements/recipes/building_blocks/cut_granite_brick_slab.json d982802fc11848c87022f7bf05cecf090953002a data/create/advancements/recipes/building_blocks/cut_granite_brick_slab_from_stone_types_granite_stonecutting.json 6b8fa161725a4e2106226c3591a23def74398f48 data/create/advancements/recipes/building_blocks/cut_granite_brick_slab_recycling.json @@ -2835,6 +2834,7 @@ ce1c81b730b3acef9673f41769339f7d68385348 data/create/advancements/recipes/buildi e9732e3beaefbc6a457e0c4fd61f17f429f1cd8c data/create/advancements/recipes/building_blocks/cut_granite_brick_stairs_from_stone_types_granite_stonecutting.json 4f403aee2aae6aa0fc334b434cf5ade362153329 data/create/advancements/recipes/building_blocks/cut_granite_brick_wall.json 625c8849b5c07835b49dcb4322ec44586628a700 data/create/advancements/recipes/building_blocks/cut_granite_brick_wall_from_stone_types_granite_stonecutting.json +24cc01d592faf2bad57fc9b9a1de52c50d225446 data/create/advancements/recipes/building_blocks/cut_granite_bricks_from_stone_types_granite_stonecutting.json 07e6f3835c3683f007fd25140d671b668706484d data/create/advancements/recipes/building_blocks/cut_granite_from_stone_types_granite_stonecutting.json 2f33b7f82e977eb3fd0e0283313b1066eadadd18 data/create/advancements/recipes/building_blocks/cut_granite_slab.json a1b406ca98c2ba7d5225afea8463d586fc538428 data/create/advancements/recipes/building_blocks/cut_granite_slab_from_stone_types_granite_stonecutting.json @@ -2843,7 +2843,6 @@ af12a2d8f8bb2382f55135df8cfec00692a65fe3 data/create/advancements/recipes/buildi 284087e07acd28aa869d5433375e412f083108e9 data/create/advancements/recipes/building_blocks/cut_granite_stairs_from_stone_types_granite_stonecutting.json dbfb50c3d5048b1f5d8d74f39c389ecec81392d7 data/create/advancements/recipes/building_blocks/cut_granite_wall.json 6b287be7a900dbd715290b069a89ab226d6cec9c data/create/advancements/recipes/building_blocks/cut_granite_wall_from_stone_types_granite_stonecutting.json -4ef0a018dcf0b470061a4b1dbadc27684d8d467f data/create/advancements/recipes/building_blocks/cut_limestone_bricks_from_stone_types_limestone_stonecutting.json b0ade7dab7eb095f07882e4c19884162f18e704c data/create/advancements/recipes/building_blocks/cut_limestone_brick_slab.json 4fc2dc61d62a394cebc91e36745699eeaee650e7 data/create/advancements/recipes/building_blocks/cut_limestone_brick_slab_from_stone_types_limestone_stonecutting.json b8ec42f06ce9eb696643154d16150a223bd5ec65 data/create/advancements/recipes/building_blocks/cut_limestone_brick_slab_recycling.json @@ -2851,6 +2850,7 @@ d0b19c27309cd45d08a6a0cd779f1930bc2e7469 data/create/advancements/recipes/buildi 9f65617405592d587a940ff7513fcb34ca6ab423 data/create/advancements/recipes/building_blocks/cut_limestone_brick_stairs_from_stone_types_limestone_stonecutting.json 281e2ddcb58b603dea8f305ed6c8ddea98d0d030 data/create/advancements/recipes/building_blocks/cut_limestone_brick_wall.json 7b0ab5095a7d2b3e876a8c8b990161851c1c58c2 data/create/advancements/recipes/building_blocks/cut_limestone_brick_wall_from_stone_types_limestone_stonecutting.json +4ef0a018dcf0b470061a4b1dbadc27684d8d467f data/create/advancements/recipes/building_blocks/cut_limestone_bricks_from_stone_types_limestone_stonecutting.json f8663a45d71c52a3982c75bbfb61653c8d2fd668 data/create/advancements/recipes/building_blocks/cut_limestone_from_stone_types_limestone_stonecutting.json 9e22972cd4f2d673cfcf07a597f6a14402c91913 data/create/advancements/recipes/building_blocks/cut_limestone_slab.json 388a57bb88582eda9fef904a530f72b066d24e7d data/create/advancements/recipes/building_blocks/cut_limestone_slab_from_stone_types_limestone_stonecutting.json @@ -2859,7 +2859,6 @@ f8663a45d71c52a3982c75bbfb61653c8d2fd668 data/create/advancements/recipes/buildi b6dc46dca3fc039fd0fe53ab791731cb085c3b62 data/create/advancements/recipes/building_blocks/cut_limestone_stairs_from_stone_types_limestone_stonecutting.json a9382d5f876542bf4fa8aed605352daca4ad2f6f data/create/advancements/recipes/building_blocks/cut_limestone_wall.json 69d9116786c53cb3155bed4580d4b01bfe638243 data/create/advancements/recipes/building_blocks/cut_limestone_wall_from_stone_types_limestone_stonecutting.json -1f8ee1a91937295484d5c2fe0186a617589c1761 data/create/advancements/recipes/building_blocks/cut_ochrum_bricks_from_stone_types_ochrum_stonecutting.json a51d6ebed8e21e8808ccfbe9f9540291504da59a data/create/advancements/recipes/building_blocks/cut_ochrum_brick_slab.json eb08f00651259f83f6eced0f90dd8df0e9d0d508 data/create/advancements/recipes/building_blocks/cut_ochrum_brick_slab_from_stone_types_ochrum_stonecutting.json a189e0549723cefbd19a147274cd79909dca2b70 data/create/advancements/recipes/building_blocks/cut_ochrum_brick_slab_recycling.json @@ -2867,6 +2866,7 @@ a5dc9e74ad0d18d83bad3aab8c5e2768355a2370 data/create/advancements/recipes/buildi 27a5331727199b8b8f2dd6c581e25d17d12fc1ba data/create/advancements/recipes/building_blocks/cut_ochrum_brick_stairs_from_stone_types_ochrum_stonecutting.json 648e532441c664310047c5c9c78833d2eaea5920 data/create/advancements/recipes/building_blocks/cut_ochrum_brick_wall.json 053256b7b154ba5c10d2483d86658f132296e8f5 data/create/advancements/recipes/building_blocks/cut_ochrum_brick_wall_from_stone_types_ochrum_stonecutting.json +1f8ee1a91937295484d5c2fe0186a617589c1761 data/create/advancements/recipes/building_blocks/cut_ochrum_bricks_from_stone_types_ochrum_stonecutting.json 6abb6e36229685ca26ee31b5db3074a07453435e data/create/advancements/recipes/building_blocks/cut_ochrum_from_stone_types_ochrum_stonecutting.json 0c5e92fb20048fe5d9dcd42e10fd0f9b155c385a data/create/advancements/recipes/building_blocks/cut_ochrum_slab.json 941aba0ff7967d7ea56e1f811aa6bc34d4711796 data/create/advancements/recipes/building_blocks/cut_ochrum_slab_from_stone_types_ochrum_stonecutting.json @@ -2875,7 +2875,6 @@ fa14009e4de8cfdacdbb7679473ce359f2cb85be data/create/advancements/recipes/buildi d50accd7f37bfd9384790bdd727401757f6dc7e4 data/create/advancements/recipes/building_blocks/cut_ochrum_stairs_from_stone_types_ochrum_stonecutting.json ed0a72f6393c0d16240b89241f5bbac7dc003516 data/create/advancements/recipes/building_blocks/cut_ochrum_wall.json cda838f95015b0bf02fc5427e1a69ed6302b7e20 data/create/advancements/recipes/building_blocks/cut_ochrum_wall_from_stone_types_ochrum_stonecutting.json -a51cd5a82d9b30c8a68f7cdf8dd7a6b2f883c27c data/create/advancements/recipes/building_blocks/cut_scorchia_bricks_from_stone_types_scorchia_stonecutting.json ce33e5a98a83dae1f37ad4b3d4ea148de5bcacdf data/create/advancements/recipes/building_blocks/cut_scorchia_brick_slab.json 498825e9e5502a7ec8a1f23bfe998b960d7fc9eb data/create/advancements/recipes/building_blocks/cut_scorchia_brick_slab_from_stone_types_scorchia_stonecutting.json 8ffa08b1b4e4ab37dfbf09d2ec4a37f93c9503cb data/create/advancements/recipes/building_blocks/cut_scorchia_brick_slab_recycling.json @@ -2883,6 +2882,7 @@ ce33e5a98a83dae1f37ad4b3d4ea148de5bcacdf data/create/advancements/recipes/buildi 3c4b45560f446534821da63d4e713088928e5f4a data/create/advancements/recipes/building_blocks/cut_scorchia_brick_stairs_from_stone_types_scorchia_stonecutting.json 2aba76185175fff82898a7a905d3ec4ff448deaa data/create/advancements/recipes/building_blocks/cut_scorchia_brick_wall.json ca1f54af4425df994c6707f00e43b8db3ce66280 data/create/advancements/recipes/building_blocks/cut_scorchia_brick_wall_from_stone_types_scorchia_stonecutting.json +a51cd5a82d9b30c8a68f7cdf8dd7a6b2f883c27c data/create/advancements/recipes/building_blocks/cut_scorchia_bricks_from_stone_types_scorchia_stonecutting.json df847f312960866d3d53f48297ea3169c27314eb data/create/advancements/recipes/building_blocks/cut_scorchia_from_stone_types_scorchia_stonecutting.json 8095f7be8aac4f11d618549680d537bed8a921c5 data/create/advancements/recipes/building_blocks/cut_scorchia_slab.json a53831cf7f095fa4d0d92051bd0e21f912c2d9dd data/create/advancements/recipes/building_blocks/cut_scorchia_slab_from_stone_types_scorchia_stonecutting.json @@ -2891,7 +2891,6 @@ a53831cf7f095fa4d0d92051bd0e21f912c2d9dd data/create/advancements/recipes/buildi 30f1efaa46771dd22d7f3aa34f24c69bbdb59bd5 data/create/advancements/recipes/building_blocks/cut_scorchia_stairs_from_stone_types_scorchia_stonecutting.json e02d188d64b270682fa9d335a3423880d8358a0d data/create/advancements/recipes/building_blocks/cut_scorchia_wall.json 834c5a2a8d089822fa81a75b290818db276beab7 data/create/advancements/recipes/building_blocks/cut_scorchia_wall_from_stone_types_scorchia_stonecutting.json -2030ec21c96336bd4c4040857f40ec65d1a75075 data/create/advancements/recipes/building_blocks/cut_scoria_bricks_from_stone_types_scoria_stonecutting.json 705dfcd9f4b6b8a0c360436c097cb371c27cf60d data/create/advancements/recipes/building_blocks/cut_scoria_brick_slab.json 482cf1bbb65a4facc0ebf31ea91bab4d03580635 data/create/advancements/recipes/building_blocks/cut_scoria_brick_slab_from_stone_types_scoria_stonecutting.json 51d070acfc8ad4cd8ca4457ca346458c81eaade4 data/create/advancements/recipes/building_blocks/cut_scoria_brick_slab_recycling.json @@ -2899,6 +2898,7 @@ e02d188d64b270682fa9d335a3423880d8358a0d data/create/advancements/recipes/buildi 99ca117e6a4ad242d92566a2f398c28edb3b7061 data/create/advancements/recipes/building_blocks/cut_scoria_brick_stairs_from_stone_types_scoria_stonecutting.json 01e294976d8ce71b59fb14a47e2686bdce4fab21 data/create/advancements/recipes/building_blocks/cut_scoria_brick_wall.json 0c1d31d37a17d4bd752508022ddd9690bb92a521 data/create/advancements/recipes/building_blocks/cut_scoria_brick_wall_from_stone_types_scoria_stonecutting.json +2030ec21c96336bd4c4040857f40ec65d1a75075 data/create/advancements/recipes/building_blocks/cut_scoria_bricks_from_stone_types_scoria_stonecutting.json 41f420c88dbf61d3cb51966cca9b495d10c604d3 data/create/advancements/recipes/building_blocks/cut_scoria_from_stone_types_scoria_stonecutting.json 26c8447854e29243f0697236f59e258fa96ed369 data/create/advancements/recipes/building_blocks/cut_scoria_slab.json f3e2522664de4ff2ad92a89443e064ac857b7aef data/create/advancements/recipes/building_blocks/cut_scoria_slab_from_stone_types_scoria_stonecutting.json @@ -2907,7 +2907,6 @@ a0635452fd698415e8112e9e0f6d71571901ca34 data/create/advancements/recipes/buildi 1bb047298b71a57e8632607af7b17bab2690aecb data/create/advancements/recipes/building_blocks/cut_scoria_stairs_from_stone_types_scoria_stonecutting.json a33878fe778438a746a28c1fd03ca6d01092ebe4 data/create/advancements/recipes/building_blocks/cut_scoria_wall.json 74a637d0d0f360ad692661c0213c18a06a8ec500 data/create/advancements/recipes/building_blocks/cut_scoria_wall_from_stone_types_scoria_stonecutting.json -f0870d596d9ac9e5b5272fb4e3d2c90c29f3a63d data/create/advancements/recipes/building_blocks/cut_tuff_bricks_from_stone_types_tuff_stonecutting.json b75410afdb8775b2a834ded315913e0ae38e4df8 data/create/advancements/recipes/building_blocks/cut_tuff_brick_slab.json 34c2aead2f2355a8f0f9f9aa7dba58dd5187dbba data/create/advancements/recipes/building_blocks/cut_tuff_brick_slab_from_stone_types_tuff_stonecutting.json c071c43e93cc1735bebbbf320f1b8d2cba4be1e3 data/create/advancements/recipes/building_blocks/cut_tuff_brick_slab_recycling.json @@ -2915,6 +2914,7 @@ c89ec2300425688f9e72e45c64def0b09c0219b0 data/create/advancements/recipes/buildi c882f72f5a31bc92a8186834b105a2e07d864366 data/create/advancements/recipes/building_blocks/cut_tuff_brick_stairs_from_stone_types_tuff_stonecutting.json 70295775a6170a1332f5604aaf75a026630c9e93 data/create/advancements/recipes/building_blocks/cut_tuff_brick_wall.json 1b79d0e71dae77967c1554c203e68eeb51fe8054 data/create/advancements/recipes/building_blocks/cut_tuff_brick_wall_from_stone_types_tuff_stonecutting.json +f0870d596d9ac9e5b5272fb4e3d2c90c29f3a63d data/create/advancements/recipes/building_blocks/cut_tuff_bricks_from_stone_types_tuff_stonecutting.json 549d1f911c009a3cafff4edcb37116c92c2b8e21 data/create/advancements/recipes/building_blocks/cut_tuff_from_stone_types_tuff_stonecutting.json 5bc3e40a8e50a521ebd5fa58efa3ec21064163f7 data/create/advancements/recipes/building_blocks/cut_tuff_slab.json f1ab5be6cb7287517d87b173680ddf833a1dd534 data/create/advancements/recipes/building_blocks/cut_tuff_slab_from_stone_types_tuff_stonecutting.json @@ -2923,7 +2923,6 @@ b7d19085017530f0c2122511c35dbef6a50b337f data/create/advancements/recipes/buildi 3c9541b6e4eb8ff7f7b627a75e8c38ed9eeaf342 data/create/advancements/recipes/building_blocks/cut_tuff_stairs_from_stone_types_tuff_stonecutting.json 51ca798b8bd822ddbbfe8f07073eefb948b97b42 data/create/advancements/recipes/building_blocks/cut_tuff_wall.json 1aa1a0d00c19069f0c55e698b474115d7f437355 data/create/advancements/recipes/building_blocks/cut_tuff_wall_from_stone_types_tuff_stonecutting.json -6a80920618d8e9b7919c83c419e751971440d38a data/create/advancements/recipes/building_blocks/cut_veridium_bricks_from_stone_types_veridium_stonecutting.json e263f555c3a47c83187d29ae9b816edc0c1a763b data/create/advancements/recipes/building_blocks/cut_veridium_brick_slab.json f0e84bde804e52f504cd93bee5058a89f6939dc9 data/create/advancements/recipes/building_blocks/cut_veridium_brick_slab_from_stone_types_veridium_stonecutting.json 949fe819c76fd63edfd93bef5898119c8456fda3 data/create/advancements/recipes/building_blocks/cut_veridium_brick_slab_recycling.json @@ -2931,6 +2930,7 @@ fc87560dedbc951d10d9650a6f27192e7c3a1cc5 data/create/advancements/recipes/buildi 35b09d6300ff8e86f01bc0258fca5cfa80d55c61 data/create/advancements/recipes/building_blocks/cut_veridium_brick_stairs_from_stone_types_veridium_stonecutting.json 599d9ce510531c6006a4964bb4049a850a8457ee data/create/advancements/recipes/building_blocks/cut_veridium_brick_wall.json aaaad7a65a1c05071565ca91a181ff3c375e0141 data/create/advancements/recipes/building_blocks/cut_veridium_brick_wall_from_stone_types_veridium_stonecutting.json +6a80920618d8e9b7919c83c419e751971440d38a data/create/advancements/recipes/building_blocks/cut_veridium_bricks_from_stone_types_veridium_stonecutting.json c76ae7944646e8f13ea460ba6655b95b6c2798ea data/create/advancements/recipes/building_blocks/cut_veridium_from_stone_types_veridium_stonecutting.json 3bafa8873b62cb0333b44af77f2c6e824c5b3e95 data/create/advancements/recipes/building_blocks/cut_veridium_slab.json 143f64b0e5536693262f6a62c2a6fbf85bd4203e data/create/advancements/recipes/building_blocks/cut_veridium_slab_from_stone_types_veridium_stonecutting.json @@ -3116,7 +3116,6 @@ c4c087911453bd979e028d3b3558b273e3cb5926 data/create/advancements/recipes/buildi 780bb3d13fcd8abf6e166b04566b141e023ee11e data/create/advancements/recipes/building_blocks/scorchia_pillar_from_stone_types_scorchia_stonecutting.json 5c5c5080c1136c046caee2d14dd2c3c9f09abad3 data/create/advancements/recipes/building_blocks/scoria_from_stone_types_scoria_stonecutting.json 5a6b12869ffcbd1d9b4fbe1fee444fcde95d2953 data/create/advancements/recipes/building_blocks/scoria_pillar_from_stone_types_scoria_stonecutting.json -a51ca3151c517113338720edeac0e02a46ebb03a data/create/advancements/recipes/building_blocks/small_andesite_bricks_from_stone_types_andesite_stonecutting.json f72093994236a0580c6cafd08fb42f061733de01 data/create/advancements/recipes/building_blocks/small_andesite_brick_slab.json 05092201e6c514d3eae566fb1ce98ad415660112 data/create/advancements/recipes/building_blocks/small_andesite_brick_slab_from_stone_types_andesite_stonecutting.json 0e41d75b613a0ebd0c023669dcfd34f11b14fd0e data/create/advancements/recipes/building_blocks/small_andesite_brick_slab_recycling.json @@ -3124,7 +3123,7 @@ f72093994236a0580c6cafd08fb42f061733de01 data/create/advancements/recipes/buildi 8bbf898cbc47ac7a326c0d082a92a452b6915a7e data/create/advancements/recipes/building_blocks/small_andesite_brick_stairs_from_stone_types_andesite_stonecutting.json 9e0685dd668550c67812d1caccd8c8cae9f2041c data/create/advancements/recipes/building_blocks/small_andesite_brick_wall.json 7a1bfa848f950482f82d7fe7a9cf3cf916f91702 data/create/advancements/recipes/building_blocks/small_andesite_brick_wall_from_stone_types_andesite_stonecutting.json -0bfa788d0038077a88678ff16104a8b82038b3da data/create/advancements/recipes/building_blocks/small_asurine_bricks_from_stone_types_asurine_stonecutting.json +a51ca3151c517113338720edeac0e02a46ebb03a data/create/advancements/recipes/building_blocks/small_andesite_bricks_from_stone_types_andesite_stonecutting.json 3dccee988c08e1988886d9f09f2b5b42332ac083 data/create/advancements/recipes/building_blocks/small_asurine_brick_slab.json 438469fb06dff95a0ab9e0cb183795432d9b78dd data/create/advancements/recipes/building_blocks/small_asurine_brick_slab_from_stone_types_asurine_stonecutting.json 3eb65706d975e6f1e429f43d7384272a58872f10 data/create/advancements/recipes/building_blocks/small_asurine_brick_slab_recycling.json @@ -3132,7 +3131,7 @@ fb8cab1a3ecef97eaf7d744bb0d1d09d46859b60 data/create/advancements/recipes/buildi 525fff52f5dea3178356b7c5f7606d2a369b346e data/create/advancements/recipes/building_blocks/small_asurine_brick_stairs_from_stone_types_asurine_stonecutting.json 39df7ef2b88df45ba4a06bfa9cd7f863f813cb30 data/create/advancements/recipes/building_blocks/small_asurine_brick_wall.json 21aa9dc72b12eb0a33cdc9904ee595de802b55f4 data/create/advancements/recipes/building_blocks/small_asurine_brick_wall_from_stone_types_asurine_stonecutting.json -46666ef8d341971cdd989f14575973777a85cdc6 data/create/advancements/recipes/building_blocks/small_calcite_bricks_from_stone_types_calcite_stonecutting.json +0bfa788d0038077a88678ff16104a8b82038b3da data/create/advancements/recipes/building_blocks/small_asurine_bricks_from_stone_types_asurine_stonecutting.json d61fce64a295a2c3b9433bc27ac50f4f1f6a678d data/create/advancements/recipes/building_blocks/small_calcite_brick_slab.json 7f2e73d01b9bff473c4ecf76ab967b3aa934ff87 data/create/advancements/recipes/building_blocks/small_calcite_brick_slab_from_stone_types_calcite_stonecutting.json 1095487af055116acc2eba87d92dd0918385e9ac data/create/advancements/recipes/building_blocks/small_calcite_brick_slab_recycling.json @@ -3140,7 +3139,7 @@ d61fce64a295a2c3b9433bc27ac50f4f1f6a678d data/create/advancements/recipes/buildi e3bd0900dc92b26fe69c7f4e81db76678505222b data/create/advancements/recipes/building_blocks/small_calcite_brick_stairs_from_stone_types_calcite_stonecutting.json c88fb3af07c32aa127cbe0043075f50fed869839 data/create/advancements/recipes/building_blocks/small_calcite_brick_wall.json ea58b78e177134c73ed5bfb081761f90cc7caa3e data/create/advancements/recipes/building_blocks/small_calcite_brick_wall_from_stone_types_calcite_stonecutting.json -c48216f26cfe93ce99f7f2f0e9f68d1ee2a95e46 data/create/advancements/recipes/building_blocks/small_crimsite_bricks_from_stone_types_crimsite_stonecutting.json +46666ef8d341971cdd989f14575973777a85cdc6 data/create/advancements/recipes/building_blocks/small_calcite_bricks_from_stone_types_calcite_stonecutting.json ed4d6e7779749dd647f744f0486e78b93057aa33 data/create/advancements/recipes/building_blocks/small_crimsite_brick_slab.json 7f3ad6d79eb9d433d5a0e295eb2b099a5f815876 data/create/advancements/recipes/building_blocks/small_crimsite_brick_slab_from_stone_types_crimsite_stonecutting.json b980fcc4b29f9ff897dd867222fc4248d76e808a data/create/advancements/recipes/building_blocks/small_crimsite_brick_slab_recycling.json @@ -3148,7 +3147,7 @@ b980fcc4b29f9ff897dd867222fc4248d76e808a data/create/advancements/recipes/buildi c06600eda4e4bd7c46e4e315a0569fbdfa4bb087 data/create/advancements/recipes/building_blocks/small_crimsite_brick_stairs_from_stone_types_crimsite_stonecutting.json 4021a4a761b06def09f19d6a60bc0722e69ec08d data/create/advancements/recipes/building_blocks/small_crimsite_brick_wall.json 2d8eae517a914e93538307efe23d532582d487e2 data/create/advancements/recipes/building_blocks/small_crimsite_brick_wall_from_stone_types_crimsite_stonecutting.json -ed82f0fac452147faa997af1d45278f501ef165b data/create/advancements/recipes/building_blocks/small_deepslate_bricks_from_stone_types_deepslate_stonecutting.json +c48216f26cfe93ce99f7f2f0e9f68d1ee2a95e46 data/create/advancements/recipes/building_blocks/small_crimsite_bricks_from_stone_types_crimsite_stonecutting.json e4674821cc17adadecacc55d48c028847caf5fea data/create/advancements/recipes/building_blocks/small_deepslate_brick_slab.json 8c0c51d052b110fec3668618be2bdeaf8d0c7cc5 data/create/advancements/recipes/building_blocks/small_deepslate_brick_slab_from_stone_types_deepslate_stonecutting.json f8f7ace802b6c73fabfabbaae1c1383a3c0bcf6b data/create/advancements/recipes/building_blocks/small_deepslate_brick_slab_recycling.json @@ -3156,7 +3155,7 @@ e2e16c3c0e761ef44f9b21ae3bd95300a33459be data/create/advancements/recipes/buildi 37ef4192f1db7dd5c066a47480f86f60687c9894 data/create/advancements/recipes/building_blocks/small_deepslate_brick_stairs_from_stone_types_deepslate_stonecutting.json 6f4d365ce26fb4081a5af0f6e21631209b5b106d data/create/advancements/recipes/building_blocks/small_deepslate_brick_wall.json e0c7377c55dc94b8efd62cb6f57325c94206cbf4 data/create/advancements/recipes/building_blocks/small_deepslate_brick_wall_from_stone_types_deepslate_stonecutting.json -9bb23924495112ba177d12ba2a5adcb872a2b76f data/create/advancements/recipes/building_blocks/small_diorite_bricks_from_stone_types_diorite_stonecutting.json +ed82f0fac452147faa997af1d45278f501ef165b data/create/advancements/recipes/building_blocks/small_deepslate_bricks_from_stone_types_deepslate_stonecutting.json d4b96bcd8902e9bce19603abb99cb7edeb260189 data/create/advancements/recipes/building_blocks/small_diorite_brick_slab.json 2ed3800996491c9a1db23d9cbed04cc5ee963df6 data/create/advancements/recipes/building_blocks/small_diorite_brick_slab_from_stone_types_diorite_stonecutting.json 895d2158ba0783c5fd97b802ef5866d7532df6ba data/create/advancements/recipes/building_blocks/small_diorite_brick_slab_recycling.json @@ -3164,7 +3163,7 @@ d4b96bcd8902e9bce19603abb99cb7edeb260189 data/create/advancements/recipes/buildi 0f4b92965c05ddf71fa24b2b08a0cce358ac8dd1 data/create/advancements/recipes/building_blocks/small_diorite_brick_stairs_from_stone_types_diorite_stonecutting.json 633d921515fb4ad0e3177f3c8f151da80008053b data/create/advancements/recipes/building_blocks/small_diorite_brick_wall.json 3dea60492331bcd3253d90534559cc0bdb0822ae data/create/advancements/recipes/building_blocks/small_diorite_brick_wall_from_stone_types_diorite_stonecutting.json -632ced3760d55b56d1620e447b8b762e0e4a29f3 data/create/advancements/recipes/building_blocks/small_dripstone_bricks_from_stone_types_dripstone_stonecutting.json +9bb23924495112ba177d12ba2a5adcb872a2b76f data/create/advancements/recipes/building_blocks/small_diorite_bricks_from_stone_types_diorite_stonecutting.json 92bb21a400d9720a2f06882049d5b3863a93969d data/create/advancements/recipes/building_blocks/small_dripstone_brick_slab.json 02e2b98eeef9cdc20a8678beec4c7aa8a6cde948 data/create/advancements/recipes/building_blocks/small_dripstone_brick_slab_from_stone_types_dripstone_stonecutting.json 35830242bc48b1355830d6cb17dc4dc547d51bc0 data/create/advancements/recipes/building_blocks/small_dripstone_brick_slab_recycling.json @@ -3172,7 +3171,7 @@ d4b96bcd8902e9bce19603abb99cb7edeb260189 data/create/advancements/recipes/buildi 92523f3058a580743f95e9347fa97e0f5f6483f6 data/create/advancements/recipes/building_blocks/small_dripstone_brick_stairs_from_stone_types_dripstone_stonecutting.json 6e26ab4ad96225b7dd1a4aa06295b0d85e87400b data/create/advancements/recipes/building_blocks/small_dripstone_brick_wall.json e30a5f31d6478dfe7693077727b1abfc40b33f9b data/create/advancements/recipes/building_blocks/small_dripstone_brick_wall_from_stone_types_dripstone_stonecutting.json -1805b7f9db21b4530b173ab6945584e7d852b218 data/create/advancements/recipes/building_blocks/small_granite_bricks_from_stone_types_granite_stonecutting.json +632ced3760d55b56d1620e447b8b762e0e4a29f3 data/create/advancements/recipes/building_blocks/small_dripstone_bricks_from_stone_types_dripstone_stonecutting.json a2929bbd4c81b9601aeca74110936343102b7b5a data/create/advancements/recipes/building_blocks/small_granite_brick_slab.json 0fa83c337d5612e2b8368d5bff34117e0c1cf40a data/create/advancements/recipes/building_blocks/small_granite_brick_slab_from_stone_types_granite_stonecutting.json 0bc47cb22cc70a34879092a57c87551e6fa9f634 data/create/advancements/recipes/building_blocks/small_granite_brick_slab_recycling.json @@ -3180,7 +3179,7 @@ a2929bbd4c81b9601aeca74110936343102b7b5a data/create/advancements/recipes/buildi 44f3e71a4e8b78db74a21a42c3cebfbc15fe0180 data/create/advancements/recipes/building_blocks/small_granite_brick_stairs_from_stone_types_granite_stonecutting.json 3a6edafcb559e767caf421cf1bd6e064940f33e2 data/create/advancements/recipes/building_blocks/small_granite_brick_wall.json cac9914c729c0ecf5e9e1b4fe6498005e7c532f3 data/create/advancements/recipes/building_blocks/small_granite_brick_wall_from_stone_types_granite_stonecutting.json -1ca86b11356749caf7515fc61b8ac5de53d019f6 data/create/advancements/recipes/building_blocks/small_limestone_bricks_from_stone_types_limestone_stonecutting.json +1805b7f9db21b4530b173ab6945584e7d852b218 data/create/advancements/recipes/building_blocks/small_granite_bricks_from_stone_types_granite_stonecutting.json 4f3cc93f422ee9f05587b89d6729a6cc86f572c0 data/create/advancements/recipes/building_blocks/small_limestone_brick_slab.json 02d0c45cd014fd660a9d3eb1c1c6b40ba806b2fb data/create/advancements/recipes/building_blocks/small_limestone_brick_slab_from_stone_types_limestone_stonecutting.json 8fb46bce94f6cca943e4ae427c04d9617ada277d data/create/advancements/recipes/building_blocks/small_limestone_brick_slab_recycling.json @@ -3188,7 +3187,7 @@ cac9914c729c0ecf5e9e1b4fe6498005e7c532f3 data/create/advancements/recipes/buildi 00b61a4d23f8b16a7e4d9bf46fbe52c6b5dd561c data/create/advancements/recipes/building_blocks/small_limestone_brick_stairs_from_stone_types_limestone_stonecutting.json 7c6b80f174687efe10007c0235f2a68db7062b12 data/create/advancements/recipes/building_blocks/small_limestone_brick_wall.json 7f9ade635dcda8d5baae2bbdddc018bcc715f681 data/create/advancements/recipes/building_blocks/small_limestone_brick_wall_from_stone_types_limestone_stonecutting.json -bab018a0adcbc0582ba756158941a87923b20384 data/create/advancements/recipes/building_blocks/small_ochrum_bricks_from_stone_types_ochrum_stonecutting.json +1ca86b11356749caf7515fc61b8ac5de53d019f6 data/create/advancements/recipes/building_blocks/small_limestone_bricks_from_stone_types_limestone_stonecutting.json 9c98b7b56f92f6adc75473f5b0ae4dc69ac8aa9a data/create/advancements/recipes/building_blocks/small_ochrum_brick_slab.json 611fb57772f1446236256f1235751dec6f81cd0e data/create/advancements/recipes/building_blocks/small_ochrum_brick_slab_from_stone_types_ochrum_stonecutting.json 243821a2c3e465f5346ad58e0afda624c09ab946 data/create/advancements/recipes/building_blocks/small_ochrum_brick_slab_recycling.json @@ -3196,8 +3195,8 @@ b9a16792e6158a2923454c9a44d9c176c9607c24 data/create/advancements/recipes/buildi bb91a8ba1ef1c8cb725f18a4d577bb476b9ae68d data/create/advancements/recipes/building_blocks/small_ochrum_brick_stairs_from_stone_types_ochrum_stonecutting.json 5cf5574da0b29895960fa7f0fd63d3f81814f7b3 data/create/advancements/recipes/building_blocks/small_ochrum_brick_wall.json 1b5d14c921a85a3a5cdb9f845d4f0ddf98f87347 data/create/advancements/recipes/building_blocks/small_ochrum_brick_wall_from_stone_types_ochrum_stonecutting.json +bab018a0adcbc0582ba756158941a87923b20384 data/create/advancements/recipes/building_blocks/small_ochrum_bricks_from_stone_types_ochrum_stonecutting.json 8d6ccacf1af917094b1688ed70dc75bf54611e93 data/create/advancements/recipes/building_blocks/small_rose_quartz_tiles_from_polished_rose_quartz_stonecutting.json -7d679c66588f8a717619a7f89861d57ec04f04a1 data/create/advancements/recipes/building_blocks/small_scorchia_bricks_from_stone_types_scorchia_stonecutting.json 2003f1248faaeb4fe6761febda8e29d087f99dc7 data/create/advancements/recipes/building_blocks/small_scorchia_brick_slab.json ff5c50697aefe21c1570230a13255c912744b629 data/create/advancements/recipes/building_blocks/small_scorchia_brick_slab_from_stone_types_scorchia_stonecutting.json 8d1fd41b03940add231fa207d3ddaa1f78cf2b85 data/create/advancements/recipes/building_blocks/small_scorchia_brick_slab_recycling.json @@ -3205,7 +3204,7 @@ ff5c50697aefe21c1570230a13255c912744b629 data/create/advancements/recipes/buildi 8586f387cc9bb74250369373348005f6aa686af2 data/create/advancements/recipes/building_blocks/small_scorchia_brick_stairs_from_stone_types_scorchia_stonecutting.json 94552be031c17f5ef9d97cf5fe33beb15141291f data/create/advancements/recipes/building_blocks/small_scorchia_brick_wall.json 86e866f92095b03b5d77a91425e5e2ef307f4852 data/create/advancements/recipes/building_blocks/small_scorchia_brick_wall_from_stone_types_scorchia_stonecutting.json -e542cd94f84a90530332608b1040e2e6189a51fe data/create/advancements/recipes/building_blocks/small_scoria_bricks_from_stone_types_scoria_stonecutting.json +7d679c66588f8a717619a7f89861d57ec04f04a1 data/create/advancements/recipes/building_blocks/small_scorchia_bricks_from_stone_types_scorchia_stonecutting.json ad4c35afd6c3d55b356e38289c64e8cf6d194d10 data/create/advancements/recipes/building_blocks/small_scoria_brick_slab.json 2f1acca02bb5a40bf174ceeb5272ba1243b8635c data/create/advancements/recipes/building_blocks/small_scoria_brick_slab_from_stone_types_scoria_stonecutting.json dba264e073eab7b2fb1494cb117574b6a6b83919 data/create/advancements/recipes/building_blocks/small_scoria_brick_slab_recycling.json @@ -3213,7 +3212,7 @@ dba264e073eab7b2fb1494cb117574b6a6b83919 data/create/advancements/recipes/buildi 0e64e1dc80a0b84e05260191951ed930a8e578f6 data/create/advancements/recipes/building_blocks/small_scoria_brick_stairs_from_stone_types_scoria_stonecutting.json 95b866fac218affb9aac93272f5436e30dd4678c data/create/advancements/recipes/building_blocks/small_scoria_brick_wall.json 23493359766c969d2fa64575c5af047e6a924373 data/create/advancements/recipes/building_blocks/small_scoria_brick_wall_from_stone_types_scoria_stonecutting.json -b7fc4fbd0d6ce28946b5cbef40d86de3ca37f695 data/create/advancements/recipes/building_blocks/small_tuff_bricks_from_stone_types_tuff_stonecutting.json +e542cd94f84a90530332608b1040e2e6189a51fe data/create/advancements/recipes/building_blocks/small_scoria_bricks_from_stone_types_scoria_stonecutting.json 03acb1becaa3c7f6fc0ced99e6afcf4ac0ec4cb2 data/create/advancements/recipes/building_blocks/small_tuff_brick_slab.json 599693bc47bfd65cc9e3babc0a2f33c0d2bbfd31 data/create/advancements/recipes/building_blocks/small_tuff_brick_slab_from_stone_types_tuff_stonecutting.json aae2cb75ee4b9312e79dfea519c35f5e20ed4da6 data/create/advancements/recipes/building_blocks/small_tuff_brick_slab_recycling.json @@ -3221,7 +3220,7 @@ c72364e32b82f45f17491dd41967373c35d8dfb5 data/create/advancements/recipes/buildi 369763433d6af43d94392e870b3d861f739ba0f9 data/create/advancements/recipes/building_blocks/small_tuff_brick_stairs_from_stone_types_tuff_stonecutting.json 506bbae420bff66d492214c49dabf52e5cbcf6e4 data/create/advancements/recipes/building_blocks/small_tuff_brick_wall.json 6db7e4b981ec28c776988a531c03dbe28fb0a1c2 data/create/advancements/recipes/building_blocks/small_tuff_brick_wall_from_stone_types_tuff_stonecutting.json -9fd6e20a4555b591b17ef225316782de333780fa data/create/advancements/recipes/building_blocks/small_veridium_bricks_from_stone_types_veridium_stonecutting.json +b7fc4fbd0d6ce28946b5cbef40d86de3ca37f695 data/create/advancements/recipes/building_blocks/small_tuff_bricks_from_stone_types_tuff_stonecutting.json b61a773f683c415617a408fa0781e7e7d61cb1af data/create/advancements/recipes/building_blocks/small_veridium_brick_slab.json 526a5323263292bd091c03231a156e18460c34a1 data/create/advancements/recipes/building_blocks/small_veridium_brick_slab_from_stone_types_veridium_stonecutting.json ef040b7189b17cce9dd69c47af61c7abca6f43cd data/create/advancements/recipes/building_blocks/small_veridium_brick_slab_recycling.json @@ -3229,6 +3228,7 @@ ef040b7189b17cce9dd69c47af61c7abca6f43cd data/create/advancements/recipes/buildi 6a12b73815434a544881680cb071f273a75f62a5 data/create/advancements/recipes/building_blocks/small_veridium_brick_stairs_from_stone_types_veridium_stonecutting.json e6dfacd8f2f57d4df42927783750254f7163251a data/create/advancements/recipes/building_blocks/small_veridium_brick_wall.json ee4012cc014539be113ace8f80e51c85d2daead9 data/create/advancements/recipes/building_blocks/small_veridium_brick_wall_from_stone_types_veridium_stonecutting.json +9fd6e20a4555b591b17ef225316782de333780fa data/create/advancements/recipes/building_blocks/small_veridium_bricks_from_stone_types_veridium_stonecutting.json 03a87030672d40b0b2b6ad085103c9a5cef067ce data/create/advancements/recipes/building_blocks/spruce_window.json dfea65f25ebcbe0caf2694dec3d3ea616e2e9291 data/create/advancements/recipes/building_blocks/spruce_window_pane.json 763b3b49296a284f41cbccdc7f1ffb13c89d42db data/create/advancements/recipes/building_blocks/tiled_glass_from_glass_colorless_stonecutting.json @@ -3382,13 +3382,13 @@ fa0856e11351ad0882de2066569807e782071881 data/create/loot_tables/blocks/copper_b 0937b9f634b86dbe41e07eda52c69993fce60fb5 data/create/loot_tables/blocks/copper_door.json 8ed70d812f38adfa147db07a4f2bbe206a69ad20 data/create/loot_tables/blocks/copper_ladder.json ac621731ca23e6fbb1003be59edacdf837dbc37e data/create/loot_tables/blocks/copper_scaffolding.json -9be387731859ccc3aec7701c1804ddc3c5dde216 data/create/loot_tables/blocks/copper_shingles.json be31f0c68bfe80dff88959bd30ef9a9080dd3b3b data/create/loot_tables/blocks/copper_shingle_slab.json 83ae2652a2df217730d6fb34a65c3962e82a961d data/create/loot_tables/blocks/copper_shingle_stairs.json +9be387731859ccc3aec7701c1804ddc3c5dde216 data/create/loot_tables/blocks/copper_shingles.json f6a29868a011d9ad73bc29be94ec2a07a2626323 data/create/loot_tables/blocks/copper_table_cloth.json -9cb359c96543d7421250c4ef4e83a5e170974efb data/create/loot_tables/blocks/copper_tiles.json adbe83d6bf88dd7d2b0b8788bb619cedd37f59d9 data/create/loot_tables/blocks/copper_tile_slab.json 1e06f16b1fa8e78af5cbfc90ba8ff1136de83d2d data/create/loot_tables/blocks/copper_tile_stairs.json +9cb359c96543d7421250c4ef4e83a5e170974efb data/create/loot_tables/blocks/copper_tiles.json 4f75cad20e6b091d1f07cf3db98520d2dc3af5e7 data/create/loot_tables/blocks/copper_valve_handle.json 14a493a7bad6bd399b662da470b71810bd56e812 data/create/loot_tables/blocks/copycat_bars.json 3a2f3ab0834a0c5089ba0a11f5e9784ce59ef6d8 data/create/loot_tables/blocks/copycat_base.json @@ -3404,114 +3404,114 @@ d5d2f565bab2e2b81b0798fc7ce0e21acd362ce5 data/create/loot_tables/blocks/crimson_ b892718d33caf0c260b902c92f46f3bfd827af45 data/create/loot_tables/blocks/crushing_wheel.json ff7853a5d5c0f3bddbcfe07e47efd1ff04b14f0a data/create/loot_tables/blocks/cuckoo_clock.json 9083b026ee254645430434b67c2ba7a842f888bf data/create/loot_tables/blocks/cut_andesite.json -c1aa69f80ba11dd52fb3627fc32377599f5ff887 data/create/loot_tables/blocks/cut_andesite_bricks.json c74a4cac08ab1f66146466ff9fb40c8f210de63c data/create/loot_tables/blocks/cut_andesite_brick_slab.json df3f5dcbf676106800bc1113bb022658eb5e85d6 data/create/loot_tables/blocks/cut_andesite_brick_stairs.json 95c5a4a3327f522d986d7baaa747fce5ead8c032 data/create/loot_tables/blocks/cut_andesite_brick_wall.json +c1aa69f80ba11dd52fb3627fc32377599f5ff887 data/create/loot_tables/blocks/cut_andesite_bricks.json cb6cf8aefaac1e00596bd64a182a329dbba7e659 data/create/loot_tables/blocks/cut_andesite_slab.json 7106a637809dcbeb9d4a02a7ff9dc52f7fd9d7a2 data/create/loot_tables/blocks/cut_andesite_stairs.json e3cfa2ecb0b90ebe07cc98f8e47d22d2c0da67e5 data/create/loot_tables/blocks/cut_andesite_wall.json 75eacbc0656e7a83a20a054755ea7d7d78af983d data/create/loot_tables/blocks/cut_asurine.json -f780d37b956ed734cafcbe42b77f1a8ebfa33350 data/create/loot_tables/blocks/cut_asurine_bricks.json 43ad24bb9da878111f3606a17ef9b45bcc4964ae data/create/loot_tables/blocks/cut_asurine_brick_slab.json 8f4d0af32546b6cc77c68a08dc74494b8be1b7c3 data/create/loot_tables/blocks/cut_asurine_brick_stairs.json bb9ce58aa5b4e38c4d3b29aa8e0d905054023eae data/create/loot_tables/blocks/cut_asurine_brick_wall.json +f780d37b956ed734cafcbe42b77f1a8ebfa33350 data/create/loot_tables/blocks/cut_asurine_bricks.json 972ca04f91a1ce4d35995c14e1b17f773b15b61e data/create/loot_tables/blocks/cut_asurine_slab.json a55778dd8735286c3abc65046186b6b8dff0367e data/create/loot_tables/blocks/cut_asurine_stairs.json 70284c686f16d215ff1a8fb19bbe36fddbd31e18 data/create/loot_tables/blocks/cut_asurine_wall.json 0f450ecf60c5d201f332b2736c552d0b51b159b8 data/create/loot_tables/blocks/cut_calcite.json -aec526af372816f306826eefe4a6318db7964892 data/create/loot_tables/blocks/cut_calcite_bricks.json ec0d2854433ac4f58e53685c69dc19629fee16ca data/create/loot_tables/blocks/cut_calcite_brick_slab.json 584e39fa0b78ba8649f69b53f9f032dd1532d6ac data/create/loot_tables/blocks/cut_calcite_brick_stairs.json cc9cbdb7a50305e47181b2452bfce887f9879437 data/create/loot_tables/blocks/cut_calcite_brick_wall.json +aec526af372816f306826eefe4a6318db7964892 data/create/loot_tables/blocks/cut_calcite_bricks.json b4e5b6d5cb63b7b1a4fe639fd727a381bfd00588 data/create/loot_tables/blocks/cut_calcite_slab.json ca83b89401dba12341e6f26786103c10c90447ca data/create/loot_tables/blocks/cut_calcite_stairs.json 64df1c4a373c28bf9be3630935b01a43abd22e03 data/create/loot_tables/blocks/cut_calcite_wall.json 5df3a2229657d7b616790e922b1d1d558b4a5128 data/create/loot_tables/blocks/cut_crimsite.json -59cb609bc9671ac481832eeaf942533c6861fc0e data/create/loot_tables/blocks/cut_crimsite_bricks.json 6fee8d6425e1c832abed8fd9bccc8e6fae9441fc data/create/loot_tables/blocks/cut_crimsite_brick_slab.json 3123bc9e6123dfeda9bb3cece5c2220ac8485535 data/create/loot_tables/blocks/cut_crimsite_brick_stairs.json 56a8c7b1588f6fa9a1fb438e91b04673e02a0c86 data/create/loot_tables/blocks/cut_crimsite_brick_wall.json +59cb609bc9671ac481832eeaf942533c6861fc0e data/create/loot_tables/blocks/cut_crimsite_bricks.json 90ed82b09f2650ee913956d62803d15fc4c0bdbd data/create/loot_tables/blocks/cut_crimsite_slab.json 0e237e008523ed3e9934c598a708be533aaa0861 data/create/loot_tables/blocks/cut_crimsite_stairs.json 48e1edca75186f160a12fa26ac262c7f86d62c82 data/create/loot_tables/blocks/cut_crimsite_wall.json 7bfe4d183ed26de1d7b241c27880a70d28426502 data/create/loot_tables/blocks/cut_deepslate.json -6e375a42ddf38c99fee86531471573716e27fa44 data/create/loot_tables/blocks/cut_deepslate_bricks.json fa4b940ad8ee432ee0fabf496d2da3d5039c204a data/create/loot_tables/blocks/cut_deepslate_brick_slab.json 1063a94b3e90a52a7492d85b1c086514333f3421 data/create/loot_tables/blocks/cut_deepslate_brick_stairs.json 878d809a038c626e8054f9b71e27be08388d7615 data/create/loot_tables/blocks/cut_deepslate_brick_wall.json +6e375a42ddf38c99fee86531471573716e27fa44 data/create/loot_tables/blocks/cut_deepslate_bricks.json 7b5e46aaf34d71993f50b5b6fa1cd5d7ea64264c data/create/loot_tables/blocks/cut_deepslate_slab.json 7d45e8bb037a1e550132854200d57ce31e073993 data/create/loot_tables/blocks/cut_deepslate_stairs.json cd80fd4f573d59c22f0b9799f1ba7422215d4ff1 data/create/loot_tables/blocks/cut_deepslate_wall.json d79d52657307a30422d9ff2eb1caad78024c24f7 data/create/loot_tables/blocks/cut_diorite.json -9f627b6449ae27a1990b84a60349736129a11e39 data/create/loot_tables/blocks/cut_diorite_bricks.json 1809235166024fa74f65a96b622faa8eddf4ce14 data/create/loot_tables/blocks/cut_diorite_brick_slab.json a6bb9fb4eee3dab9a540b228801ce100c048c2a7 data/create/loot_tables/blocks/cut_diorite_brick_stairs.json 690a938a04543cb60f2952335be26b2df9c75715 data/create/loot_tables/blocks/cut_diorite_brick_wall.json +9f627b6449ae27a1990b84a60349736129a11e39 data/create/loot_tables/blocks/cut_diorite_bricks.json 208999222adb5b1cd4fa47b85000841dbae4ad21 data/create/loot_tables/blocks/cut_diorite_slab.json 12849a868e8dff48ebb688c84fc53d4cee2a4eaa data/create/loot_tables/blocks/cut_diorite_stairs.json 469fffcdd40aea22fedb81b7778cc3c61928f3fd data/create/loot_tables/blocks/cut_diorite_wall.json 302d0bb640f696109fe4edc0c1fa9db332231511 data/create/loot_tables/blocks/cut_dripstone.json -48707f37b94ff1a930ee45bb9e8b6b4b67226945 data/create/loot_tables/blocks/cut_dripstone_bricks.json eb31bc108180e2248d575d5d72325b5585254af0 data/create/loot_tables/blocks/cut_dripstone_brick_slab.json 9b624a456baf55960675d7857e159f69911a281a data/create/loot_tables/blocks/cut_dripstone_brick_stairs.json b4c754d4d5a6c28f537c2d73844e39059b2c1450 data/create/loot_tables/blocks/cut_dripstone_brick_wall.json +48707f37b94ff1a930ee45bb9e8b6b4b67226945 data/create/loot_tables/blocks/cut_dripstone_bricks.json eb9eca9a69f763cbe81dc79375ef76978594b51e data/create/loot_tables/blocks/cut_dripstone_slab.json 47fae3abc8bea3ee802d6759192e631f50329c5f data/create/loot_tables/blocks/cut_dripstone_stairs.json 70b71cc460cba2955694baf0550eadc2187e3a8a data/create/loot_tables/blocks/cut_dripstone_wall.json 26433a16a91414be15b20dc85b81b76d086be889 data/create/loot_tables/blocks/cut_granite.json -65c3936e78a90c53faa0b9f9b3034afc2728e7b9 data/create/loot_tables/blocks/cut_granite_bricks.json c6b8dfa87e9c33a0dd2b3398dcc524347e826d44 data/create/loot_tables/blocks/cut_granite_brick_slab.json 5e00417f06b4d357e7469f0efa6e319dfc587da3 data/create/loot_tables/blocks/cut_granite_brick_stairs.json 8d8779846af8121426f128cc7b5d501037bd1cd4 data/create/loot_tables/blocks/cut_granite_brick_wall.json +65c3936e78a90c53faa0b9f9b3034afc2728e7b9 data/create/loot_tables/blocks/cut_granite_bricks.json 6e7253b2801611b4698e786f495c2ade1088ee0b data/create/loot_tables/blocks/cut_granite_slab.json de8c10fb2c7409a3375f2db5cdce2027c3f419bd data/create/loot_tables/blocks/cut_granite_stairs.json cdf40bb46d9457a66129b300dc4d3f0160cc1de2 data/create/loot_tables/blocks/cut_granite_wall.json ac5f062c7fc270c63d67ccecf19499a9e91fa1c4 data/create/loot_tables/blocks/cut_limestone.json -b60fb652e1f83b1af12a15cb47450bd9a6087f6a data/create/loot_tables/blocks/cut_limestone_bricks.json 3b6d3a9b12cf1c2a20bf337cc0155bb66967f0ee data/create/loot_tables/blocks/cut_limestone_brick_slab.json 701249cc12b7aa6f5cc1691ac4dd17e665aa2180 data/create/loot_tables/blocks/cut_limestone_brick_stairs.json 3b8c5eef9b0e8c35e8573ce91f5fddbac7f76f24 data/create/loot_tables/blocks/cut_limestone_brick_wall.json +b60fb652e1f83b1af12a15cb47450bd9a6087f6a data/create/loot_tables/blocks/cut_limestone_bricks.json ba186786e8677f1c769e8f231fe872c48330e13a data/create/loot_tables/blocks/cut_limestone_slab.json d354966d57804afda39ff27336d8b0f38acf6ea3 data/create/loot_tables/blocks/cut_limestone_stairs.json 28b4eee2c6da259e50c58a51905fa2b79a9b89ef data/create/loot_tables/blocks/cut_limestone_wall.json b3d6d90dd0c3e9d4b47d1f87d5abc354dd8c1447 data/create/loot_tables/blocks/cut_ochrum.json -5856859aae0cc633cbd9d83ea7cf7910ce1a88de data/create/loot_tables/blocks/cut_ochrum_bricks.json 67cadc71d90fb2527b9b2b72a74463d71571e493 data/create/loot_tables/blocks/cut_ochrum_brick_slab.json 487b3e7dc1d9d07183b9b699e33f6371858435aa data/create/loot_tables/blocks/cut_ochrum_brick_stairs.json 289757860f07b63dcce531a74ce7e60b4669c51b data/create/loot_tables/blocks/cut_ochrum_brick_wall.json +5856859aae0cc633cbd9d83ea7cf7910ce1a88de data/create/loot_tables/blocks/cut_ochrum_bricks.json c9deec5e3c7343afa3d013704179e2147b2eb7ec data/create/loot_tables/blocks/cut_ochrum_slab.json e851d829db8ea4398bc1cbe6e743b4fba98d3413 data/create/loot_tables/blocks/cut_ochrum_stairs.json 5dce8524b70baeefaeba13422f5900b1a161a867 data/create/loot_tables/blocks/cut_ochrum_wall.json 293064edf2909db8c9edc26bedd1cc023c647664 data/create/loot_tables/blocks/cut_scorchia.json -767910313f0983ebfb49b80526747d762cbdf782 data/create/loot_tables/blocks/cut_scorchia_bricks.json 895c4b9cc71701a26ae0e765ee67f0c06cc70a9c data/create/loot_tables/blocks/cut_scorchia_brick_slab.json c53d72176cb5dd93977975dd84647391fa563e3a data/create/loot_tables/blocks/cut_scorchia_brick_stairs.json 460232ca38cba2f0adc5316d6db8db94db231953 data/create/loot_tables/blocks/cut_scorchia_brick_wall.json +767910313f0983ebfb49b80526747d762cbdf782 data/create/loot_tables/blocks/cut_scorchia_bricks.json c8201964d877a932fe9a9a2d0360004440f7c380 data/create/loot_tables/blocks/cut_scorchia_slab.json dfd09849dbf48a064269a5ea28d0422caa87e4d4 data/create/loot_tables/blocks/cut_scorchia_stairs.json bd5304e38bb92a445c159e9fe647b906e28b232e data/create/loot_tables/blocks/cut_scorchia_wall.json 6b87a22c39b545d5be92e476751b99ceb4bef740 data/create/loot_tables/blocks/cut_scoria.json -833252d2d63c7502f6f0d7981673a8081046c944 data/create/loot_tables/blocks/cut_scoria_bricks.json 659e86f89499539e435989c2eb29e88e9a0ff9f4 data/create/loot_tables/blocks/cut_scoria_brick_slab.json 8434d461090bc43328eec0b4249d27a9ba383707 data/create/loot_tables/blocks/cut_scoria_brick_stairs.json e3f853395b9b6fb7d5bb103c121a77e04526a9e8 data/create/loot_tables/blocks/cut_scoria_brick_wall.json +833252d2d63c7502f6f0d7981673a8081046c944 data/create/loot_tables/blocks/cut_scoria_bricks.json 8360d736887ae3dc22bcf522791ef981e380456c data/create/loot_tables/blocks/cut_scoria_slab.json c771f03308f45e1e87d92181f94cdfd4e61fa5d8 data/create/loot_tables/blocks/cut_scoria_stairs.json 6fecb7fa2774ea63ac0c66e9c3d0f41d6b8cdff7 data/create/loot_tables/blocks/cut_scoria_wall.json 396074ee7fd5a3ddbac9332c74b7bdc4164919e2 data/create/loot_tables/blocks/cut_tuff.json -81465ef7aa555d36adf249bbc9acfe80abbe308e data/create/loot_tables/blocks/cut_tuff_bricks.json 5148f230c773b83268d52650bdacc660025feb95 data/create/loot_tables/blocks/cut_tuff_brick_slab.json 19719a4a3f63d1ec46a9ca9736a825d2dcc880ff data/create/loot_tables/blocks/cut_tuff_brick_stairs.json e20991b67c07dca62c212b43da5b7e7e98146c0e data/create/loot_tables/blocks/cut_tuff_brick_wall.json +81465ef7aa555d36adf249bbc9acfe80abbe308e data/create/loot_tables/blocks/cut_tuff_bricks.json 6d16bd3860207ff6912afc2bf3f0454b572aabba data/create/loot_tables/blocks/cut_tuff_slab.json c14e52ac9901aa873c33d51988bd26465ce0e095 data/create/loot_tables/blocks/cut_tuff_stairs.json dd70800c79fa2ff56bd4ea032cf069bc27cc9076 data/create/loot_tables/blocks/cut_tuff_wall.json 1957b610d14460cc9ca797fe953bf9831509cdbf data/create/loot_tables/blocks/cut_veridium.json -673d1f0fefa7725ac5bfcabfcea577041adc4eeb data/create/loot_tables/blocks/cut_veridium_bricks.json c1515a908bde249c087be1e73aec37773bc3dc5c data/create/loot_tables/blocks/cut_veridium_brick_slab.json d9552e3e9f4de0e09df8ca9446066e94c6e2c681 data/create/loot_tables/blocks/cut_veridium_brick_stairs.json 584c4bd13d9870f9798155b47cc0d32e5751294d data/create/loot_tables/blocks/cut_veridium_brick_wall.json +673d1f0fefa7725ac5bfcabfcea577041adc4eeb data/create/loot_tables/blocks/cut_veridium_bricks.json 009186ed0efe29a229a28cfd913bc02ddad217d4 data/create/loot_tables/blocks/cut_veridium_slab.json 4845f7127921c7dd93a59118e63c37107d6c2061 data/create/loot_tables/blocks/cut_veridium_stairs.json b56caea031d637321eddfd5d122fc357d2c2e49c data/create/loot_tables/blocks/cut_veridium_wall.json @@ -3539,12 +3539,12 @@ dfe0af3ff61ed2b3082e49c745d8a3e0c5973f4b data/create/loot_tables/blocks/encased_ a2e9a8a10b7fc730c1d7c8db3b529e7a37b683f5 data/create/loot_tables/blocks/encased_fan.json 7ede9f64839f51e6a2eb05b08577d2873f281401 data/create/loot_tables/blocks/encased_fluid_pipe.json 4869211639326efaabd1aba1067bfbb3ab012884 data/create/loot_tables/blocks/experience_block.json -9fa4b0c8ee313b6c9a57d7d5b687cdd01c8259d3 data/create/loot_tables/blocks/exposed_copper_shingles.json 9dbd37ef5ff549f10475101205c1a9d4a44140bc data/create/loot_tables/blocks/exposed_copper_shingle_slab.json d2c9abd9260eb82ea1c2eeae5e2d6abd0b4d3ce8 data/create/loot_tables/blocks/exposed_copper_shingle_stairs.json -f0905ae4c9bdff8fe9e1ab4682a7b1efe2d27d9d data/create/loot_tables/blocks/exposed_copper_tiles.json +9fa4b0c8ee313b6c9a57d7d5b687cdd01c8259d3 data/create/loot_tables/blocks/exposed_copper_shingles.json 6841c02935838f00011d33fc392965326c4dbc5b data/create/loot_tables/blocks/exposed_copper_tile_slab.json 432a047156b93a09b7e027fc34f5680a8f68dc92 data/create/loot_tables/blocks/exposed_copper_tile_stairs.json +f0905ae4c9bdff8fe9e1ab4682a7b1efe2d27d9d data/create/loot_tables/blocks/exposed_copper_tiles.json 4dd285b35d9b94d48f7aa783e93bdd04d58c4a26 data/create/loot_tables/blocks/factory_gauge.json 3fae2a7a3f133a1d7c76ce91f6c48eab787d6ff6 data/create/loot_tables/blocks/fake_track.json 1d4734d6d9ba039c0dfa2271f08cdb55e35b721f data/create/loot_tables/blocks/fluid_pipe.json @@ -3620,8 +3620,6 @@ eb95d1e0abb93d5efecb0809e3901f37021c4dfc data/create/loot_tables/blocks/light_gr e61e9b3e116037c4ad44a7e222e5127e5767ddad data/create/loot_tables/blocks/light_gray_table_cloth.json e22dfadefcea50090efe87136a4b92e6ef20d379 data/create/loot_tables/blocks/light_gray_toolbox.json 3e586bc1281f15e25e75475dd726578ff032c6ae data/create/loot_tables/blocks/light_gray_valve_handle.json -c6bb0877c537dda15469934383dc45c608bfd1a4 data/create/loot_tables/blocks/limestone.json -49058a62e1abd34917f983b6bc13cc4353b613a2 data/create/loot_tables/blocks/limestone_pillar.json 582bb26f6df37d0c2dbe12983ad05fc74f5fb5c0 data/create/loot_tables/blocks/lime_nixie_tube.json ec9d973d218b26d51b82f265603feab31170c619 data/create/loot_tables/blocks/lime_postbox.json 623ac65211a9920325308b55285f78e3b7275751 data/create/loot_tables/blocks/lime_sail.json @@ -3629,6 +3627,8 @@ ec9d973d218b26d51b82f265603feab31170c619 data/create/loot_tables/blocks/lime_pos 10ecd65ecba6b66652dd04a385fc47a44c1f8110 data/create/loot_tables/blocks/lime_table_cloth.json 0f6a465501a445925e9aff7a4c84b3c8e2caa93e data/create/loot_tables/blocks/lime_toolbox.json 1a3ed7cd5660d7ea014956ea642e0b07d89bc297 data/create/loot_tables/blocks/lime_valve_handle.json +c6bb0877c537dda15469934383dc45c608bfd1a4 data/create/loot_tables/blocks/limestone.json +49058a62e1abd34917f983b6bc13cc4353b613a2 data/create/loot_tables/blocks/limestone_pillar.json baf70f9eb579f20b232a2af4e6b00a54f84844e6 data/create/loot_tables/blocks/linear_chassis.json e4c0f8ca822cf7555bd011825b430c3c735160d4 data/create/loot_tables/blocks/lit_blaze_burner.json 6bd8b044cc9c69a5268372e5436f556da2c1bf21 data/create/loot_tables/blocks/magenta_nixie_tube.json @@ -3674,14 +3674,14 @@ d6323d4b30faa87cd4b5b8b815cb16f78296f203 data/create/loot_tables/blocks/orange_s 30aef2df782b6b35cd16b4c205bb15de85bc0664 data/create/loot_tables/blocks/orange_valve_handle.json f4004c6d16754fc8867ed6618dace8e8f6dcc412 data/create/loot_tables/blocks/ornate_iron_window.json 6f14500e07c6d342804f9127e7b66047ffaeef1e data/create/loot_tables/blocks/ornate_iron_window_pane.json -3e54d3c4755a43d837a1d9b2005ea1dee4d02555 data/create/loot_tables/blocks/oxidized_copper_shingles.json 62c43a533e4ffeeec9f7657db5a796569087f806 data/create/loot_tables/blocks/oxidized_copper_shingle_slab.json f47a01824093455030fca66e7b8a39bcfc61d219 data/create/loot_tables/blocks/oxidized_copper_shingle_stairs.json -4d2a2863697664b3b71f02aa703c3504cd5cc826 data/create/loot_tables/blocks/oxidized_copper_tiles.json +3e54d3c4755a43d837a1d9b2005ea1dee4d02555 data/create/loot_tables/blocks/oxidized_copper_shingles.json 4d815b361af81bd0c0e14c853ca54ad3cde66a57 data/create/loot_tables/blocks/oxidized_copper_tile_slab.json d599ef03d1b69e4367ec0dea78f52c1964c99f9b data/create/loot_tables/blocks/oxidized_copper_tile_stairs.json -ab8cee7abd7dd92428bf7d8f0f5edd35082401a4 data/create/loot_tables/blocks/packager.json +4d2a2863697664b3b71f02aa703c3504cd5cc826 data/create/loot_tables/blocks/oxidized_copper_tiles.json 54aa9700df601640b705d912abe773d5b6ee2b1f data/create/loot_tables/blocks/package_frogport.json +ab8cee7abd7dd92428bf7d8f0f5edd35082401a4 data/create/loot_tables/blocks/packager.json 58bd9fe9d6706998bfbda3b077cfd0a740972091 data/create/loot_tables/blocks/peculiar_bell.json 4d7724df6fefee4512c4f7886d0e103d1dc39510 data/create/loot_tables/blocks/pink_nixie_tube.json df7b12349c64d035eb563535b03cb70d780c5a71 data/create/loot_tables/blocks/pink_postbox.json @@ -3767,9 +3767,6 @@ b4746e296f4bf63778e40a751b4c7fa8be45d21d data/create/loot_tables/blocks/purple_t 9e5e841d9f9a00d560ed17a7e197dc56bae334b7 data/create/loot_tables/blocks/radial_chassis.json 73a03fa31e299cec2c8a3dc0f31a8aa354b49bcd data/create/loot_tables/blocks/railway_casing.json f76e5a157d2aeab5708f464b1f3c8e47b3855f18 data/create/loot_tables/blocks/raw_zinc_block.json -bbc2d61eeea335f8f011d799ef6a5484ca027640 data/create/loot_tables/blocks/redstone_contact.json -4fa70deeac7e56121e42fb602dfa27ee1727f749 data/create/loot_tables/blocks/redstone_link.json -efc3a5595e4daf67fa43f84c9869dfc76fd6fca4 data/create/loot_tables/blocks/redstone_requester.json a50e1c28af16e9f1b4f48aa974461167139768a7 data/create/loot_tables/blocks/red_nixie_tube.json f36f1e69e4fb8723238f81aadbac892f54b5ac62 data/create/loot_tables/blocks/red_postbox.json 977d724cddf8eba053a3310ad0d30af15199bbed data/create/loot_tables/blocks/red_sail.json @@ -3777,6 +3774,9 @@ f36f1e69e4fb8723238f81aadbac892f54b5ac62 data/create/loot_tables/blocks/red_post 09796bc3be977e17927d0a9e32bff2982618e844 data/create/loot_tables/blocks/red_table_cloth.json 9713071cab536e8c1550a6309dc4563fecc2c4e0 data/create/loot_tables/blocks/red_toolbox.json 17d75711f4ef5d76aa931175364642732fb0c60d data/create/loot_tables/blocks/red_valve_handle.json +bbc2d61eeea335f8f011d799ef6a5484ca027640 data/create/loot_tables/blocks/redstone_contact.json +4fa70deeac7e56121e42fb602dfa27ee1727f749 data/create/loot_tables/blocks/redstone_link.json +efc3a5595e4daf67fa43f84c9869dfc76fd6fca4 data/create/loot_tables/blocks/redstone_requester.json 632067fe6309e31e78637eb0272209b630750242 data/create/loot_tables/blocks/refined_radiance_casing.json ee2c4d66d1264ec613e9e84fcac814d2f5806258 data/create/loot_tables/blocks/repackager.json 354a3b6c73379b7100b0dd12b3f3b008830c4d2d data/create/loot_tables/blocks/rope.json @@ -3786,8 +3786,8 @@ f74fdd78961619d712891c36e0a0778c25e145dc data/create/loot_tables/blocks/rope_pul a0575567d5679f2c54e5a25c6ec12338f8cdc939 data/create/loot_tables/blocks/rose_quartz_tiles.json de74765a3bbffafb87d632857dfcfa83f863f814 data/create/loot_tables/blocks/rotation_speed_controller.json 2af8df3e36ace336c43d68f4e53564640a89845f data/create/loot_tables/blocks/sail_frame.json -d499fd59d30da8b907b0f3a0f428700f066eddff data/create/loot_tables/blocks/schematicannon.json 5a54e930243919991d71a1c3296002ff86dd88e1 data/create/loot_tables/blocks/schematic_table.json +d499fd59d30da8b907b0f3a0f428700f066eddff data/create/loot_tables/blocks/schematicannon.json 1d9b0df1330f44681bbd56f8560a30ef9e2175ff data/create/loot_tables/blocks/scorchia.json e39f189bfaebd31aedceb11e25720f1e08eb238d data/create/loot_tables/blocks/scorchia_pillar.json 5e3a37dbb2fcc0d6be042bfd063fd8b1414d6169 data/create/loot_tables/blocks/scoria.json @@ -3796,64 +3796,64 @@ d39afcaedc84d582c0c1f21ec5945cd0a67d389d data/create/loot_tables/blocks/secondar e33a34b47e07cf3262c0dbdbc651b31b9492b18f data/create/loot_tables/blocks/sequenced_gearshift.json 7d61387106e5e7fcc4aa0b05b9560cd5f4ef7df8 data/create/loot_tables/blocks/shadow_steel_casing.json 7e67d04f861e0a680487e27f94022a7850652dfe data/create/loot_tables/blocks/shaft.json -e88ff4ab1341c2db8338de0708b0ca8f40f15a8b data/create/loot_tables/blocks/small_andesite_bricks.json 220febcbcc4a993d475b683ebef7468ebdb7bf26 data/create/loot_tables/blocks/small_andesite_brick_slab.json b4764c5bb538359bcc2a599ff3b7474ade2115ed data/create/loot_tables/blocks/small_andesite_brick_stairs.json a891496ffb91bef56c3b684cb55a57e27a72154a data/create/loot_tables/blocks/small_andesite_brick_wall.json -576d8f6beca755a4082f1c8941e2590c1d18107b data/create/loot_tables/blocks/small_asurine_bricks.json +e88ff4ab1341c2db8338de0708b0ca8f40f15a8b data/create/loot_tables/blocks/small_andesite_bricks.json 1a5d3543ebb7c0064ba8ff01160a22a0f5f29f36 data/create/loot_tables/blocks/small_asurine_brick_slab.json 64f4b44b786eda91d432f20c8b725b0415440b56 data/create/loot_tables/blocks/small_asurine_brick_stairs.json 60a1d505e955047cf933ae55efc2e7c10d0a5a79 data/create/loot_tables/blocks/small_asurine_brick_wall.json +576d8f6beca755a4082f1c8941e2590c1d18107b data/create/loot_tables/blocks/small_asurine_bricks.json 64bcfece2507b8510633ae20c00ab989232664ff data/create/loot_tables/blocks/small_bogey.json -c03bba06f66262c0ced5e85fa7dcbfbfc8c9db71 data/create/loot_tables/blocks/small_calcite_bricks.json b673542c79f4a82f2e80c0931354e994292811f6 data/create/loot_tables/blocks/small_calcite_brick_slab.json e10d286286bba8e172a56e0eeb9af18d06d1a76d data/create/loot_tables/blocks/small_calcite_brick_stairs.json d7214e942b203823fa2fece883e8406a7721369f data/create/loot_tables/blocks/small_calcite_brick_wall.json -f49d32973b0be51229f4e3fdc13958c9852c5c8a data/create/loot_tables/blocks/small_crimsite_bricks.json +c03bba06f66262c0ced5e85fa7dcbfbfc8c9db71 data/create/loot_tables/blocks/small_calcite_bricks.json ef8b0f604b627715542e8216ae5448e88995cc13 data/create/loot_tables/blocks/small_crimsite_brick_slab.json dbec9246ab957a3ed2dbd0707df12c1496258e05 data/create/loot_tables/blocks/small_crimsite_brick_stairs.json d4d5bd8b101655205c4f293f23e83f610e179e91 data/create/loot_tables/blocks/small_crimsite_brick_wall.json -8caba3e7001dd8df4d3e6365b97849570c74c840 data/create/loot_tables/blocks/small_deepslate_bricks.json +f49d32973b0be51229f4e3fdc13958c9852c5c8a data/create/loot_tables/blocks/small_crimsite_bricks.json 44567c10c28ddd221198824766d3fec289fb29d4 data/create/loot_tables/blocks/small_deepslate_brick_slab.json fc141f5cdb1001d344b5ef8fa3ad1fdfeb01d048 data/create/loot_tables/blocks/small_deepslate_brick_stairs.json 3cf68d27362e9bb5dc3255ccf810097fbee511ba data/create/loot_tables/blocks/small_deepslate_brick_wall.json -4f22a84f105c2fabfd08ff0782ec30bbdc59f940 data/create/loot_tables/blocks/small_diorite_bricks.json +8caba3e7001dd8df4d3e6365b97849570c74c840 data/create/loot_tables/blocks/small_deepslate_bricks.json f6565f4bd11b7e95008b0f8fc3f5f2c7af1b77f8 data/create/loot_tables/blocks/small_diorite_brick_slab.json e3cbe41b4b2c38d0d5e625e34b61fc79db16d3bd data/create/loot_tables/blocks/small_diorite_brick_stairs.json 787dfaa16dc30155c90cc360f6927fa067a30ed8 data/create/loot_tables/blocks/small_diorite_brick_wall.json -d9cc7f58c791e040df4abfce225524e01eb01d49 data/create/loot_tables/blocks/small_dripstone_bricks.json +4f22a84f105c2fabfd08ff0782ec30bbdc59f940 data/create/loot_tables/blocks/small_diorite_bricks.json f72338c9252528e41f60cb183cb4ee07cea47bf0 data/create/loot_tables/blocks/small_dripstone_brick_slab.json bedf0fba68e8a8ce4205a968429ebe9c3ddfb528 data/create/loot_tables/blocks/small_dripstone_brick_stairs.json c1168f58f342dfa332bfa7f53f5f03383c55ccf2 data/create/loot_tables/blocks/small_dripstone_brick_wall.json -8437e7e28e45c10562d182c4c07189bcc108cabb data/create/loot_tables/blocks/small_granite_bricks.json +d9cc7f58c791e040df4abfce225524e01eb01d49 data/create/loot_tables/blocks/small_dripstone_bricks.json 4d111f8580ac97cf1b49b667462f7141846f3d3a data/create/loot_tables/blocks/small_granite_brick_slab.json c16e015251126614960d3e6300cb04d3aeaf49b4 data/create/loot_tables/blocks/small_granite_brick_stairs.json e0ff780ddeb5d5c8d2b6cd7736ac05f4556de52c data/create/loot_tables/blocks/small_granite_brick_wall.json -c60def11fbac5010bf749960e084dd5cd0dc4b07 data/create/loot_tables/blocks/small_limestone_bricks.json +8437e7e28e45c10562d182c4c07189bcc108cabb data/create/loot_tables/blocks/small_granite_bricks.json 5222ac5255c9a9ada0ce1da0fd4f4acbeee8ddb7 data/create/loot_tables/blocks/small_limestone_brick_slab.json 97310b6b1cbea869ebaa52861542787c49cee017 data/create/loot_tables/blocks/small_limestone_brick_stairs.json 0855921034db43692baa9fd0bcb767154f96d591 data/create/loot_tables/blocks/small_limestone_brick_wall.json -eb6b2171a6c99a3a28089752f26ddc6ac1f941d1 data/create/loot_tables/blocks/small_ochrum_bricks.json +c60def11fbac5010bf749960e084dd5cd0dc4b07 data/create/loot_tables/blocks/small_limestone_bricks.json 8ced0c24db685dbf4382b7b71124005edde9e0b2 data/create/loot_tables/blocks/small_ochrum_brick_slab.json 090e7154fb2c3dfd20d37aa87f3df4572a27c615 data/create/loot_tables/blocks/small_ochrum_brick_stairs.json 60f2d9970ad8caf8ffe3aa8083dbba671b8d4b8b data/create/loot_tables/blocks/small_ochrum_brick_wall.json +eb6b2171a6c99a3a28089752f26ddc6ac1f941d1 data/create/loot_tables/blocks/small_ochrum_bricks.json a001d069c2b4d15c6dfd0312749765fc4e89571e data/create/loot_tables/blocks/small_rose_quartz_tiles.json -ce71e670948453691d4f09c8110b952afb41afa1 data/create/loot_tables/blocks/small_scorchia_bricks.json d521cf885c737da2e4717d43072840ffd3f4c5d9 data/create/loot_tables/blocks/small_scorchia_brick_slab.json de6b5d583e1adf4d49147e0719616dfd0165726d data/create/loot_tables/blocks/small_scorchia_brick_stairs.json 895603c6920338ffafd8d0d1310e47ac20bdbfda data/create/loot_tables/blocks/small_scorchia_brick_wall.json -8b7e61477c4fdc834d669bda9197b585d60f26a2 data/create/loot_tables/blocks/small_scoria_bricks.json +ce71e670948453691d4f09c8110b952afb41afa1 data/create/loot_tables/blocks/small_scorchia_bricks.json d1954c07a66f40123d8d78602795efad7c92070f data/create/loot_tables/blocks/small_scoria_brick_slab.json 291b5a560f09ed8f09ccc949a1a4da0006f139c7 data/create/loot_tables/blocks/small_scoria_brick_stairs.json ed572e947f78d637e6e1a4166c111121087c41c3 data/create/loot_tables/blocks/small_scoria_brick_wall.json -2c7097ee677f42452212b5dce8959065d2bb0e15 data/create/loot_tables/blocks/small_tuff_bricks.json +8b7e61477c4fdc834d669bda9197b585d60f26a2 data/create/loot_tables/blocks/small_scoria_bricks.json ad8a3571dc3ae0ee1ec7be7f35c9796e544f0682 data/create/loot_tables/blocks/small_tuff_brick_slab.json 17f4a98a81e5920b75c88133d15b63d431f3fb64 data/create/loot_tables/blocks/small_tuff_brick_stairs.json 7defad704f6278e329af634acfb9efd617b2003e data/create/loot_tables/blocks/small_tuff_brick_wall.json -e499c0a8a0f804003612f3a4c9286cb4b033fe4b data/create/loot_tables/blocks/small_veridium_bricks.json +2c7097ee677f42452212b5dce8959065d2bb0e15 data/create/loot_tables/blocks/small_tuff_bricks.json c7771827a715b9eaacd1a7b7e863e274b1dee11f data/create/loot_tables/blocks/small_veridium_brick_slab.json 818b65dd5d868527e7df7658a4f62a93f2795186 data/create/loot_tables/blocks/small_veridium_brick_stairs.json 7733e53a90f2ba9c17cdedaa8720e70df1a8d2de data/create/loot_tables/blocks/small_veridium_brick_wall.json +e499c0a8a0f804003612f3a4c9286cb4b033fe4b data/create/loot_tables/blocks/small_veridium_bricks.json a121d21b81e93c119b6ee32ca21d260d9c33cb2a data/create/loot_tables/blocks/smart_chute.json 4556eb2d607db3631d0a9524d22a50686ce4a5a8 data/create/loot_tables/blocks/smart_fluid_pipe.json 9601e8ba0eb098cc409557f17b01669d8b971461 data/create/loot_tables/blocks/speedometer.json @@ -3865,9 +3865,9 @@ bcd632c1180efbc990b077314cfce8514a25da7c data/create/loot_tables/blocks/spruce_w cae1bd9100b62841e260880faa80e2442f44a141 data/create/loot_tables/blocks/steam_whistle_extension.json 0bc3fdde351129e3a261a2420aff9d3f063c235e data/create/loot_tables/blocks/sticker.json 074f526902cb5fcff2129614428aba1ea05a6649 data/create/loot_tables/blocks/sticky_mechanical_piston.json -a7332324e63f7d28621ddfbd54eb3d091461d890 data/create/loot_tables/blocks/stockpile_switch.json af312881ec9bfb0902438f53c5cac020244bdba2 data/create/loot_tables/blocks/stock_link.json f4fa9bb255348dc79dcc0468b3beb9ad075eb036 data/create/loot_tables/blocks/stock_ticker.json +a7332324e63f7d28621ddfbd54eb3d091461d890 data/create/loot_tables/blocks/stockpile_switch.json b13496b1b4bc0be30605832e23894fb374dd796e data/create/loot_tables/blocks/stressometer.json 6a7df4d2730d57ae6e404b4bc8e01367e5ddbf07 data/create/loot_tables/blocks/tiled_glass.json 0ad584e41780dc0183af1fa1e49e126730dfdbab data/create/loot_tables/blocks/tiled_glass_pane.json @@ -3887,36 +3887,36 @@ cfc82d2aa8248caeaa17ff0a60db02607046550d data/create/loot_tables/blocks/warped_w 2eeddb89cfc597bc1ce0736b9f4a6f98e0dfa4d2 data/create/loot_tables/blocks/warped_window_pane.json ccab211722d7f06913a549851b0d6e8278edc845 data/create/loot_tables/blocks/water_wheel.json ea5dfcedc928e8dfa1c59cf3917d1577dff87494 data/create/loot_tables/blocks/water_wheel_structure.json -bbc6fc068adccea464909b87f1d1f426324d74cc data/create/loot_tables/blocks/waxed_copper_shingles.json cb31be1e75ca822454bd0a89954f74c4c8726b33 data/create/loot_tables/blocks/waxed_copper_shingle_slab.json c8e440e42141788d1988c57ab91cb1bfcd977407 data/create/loot_tables/blocks/waxed_copper_shingle_stairs.json -a3b8f12d983077477963fd3fc893c5acd36ad552 data/create/loot_tables/blocks/waxed_copper_tiles.json +bbc6fc068adccea464909b87f1d1f426324d74cc data/create/loot_tables/blocks/waxed_copper_shingles.json 807da1d66d6c7d07efc8973de43415fa4b5ddfdc data/create/loot_tables/blocks/waxed_copper_tile_slab.json 92759871a9c84815b98b6dcd22fcf0dd958bc8ab data/create/loot_tables/blocks/waxed_copper_tile_stairs.json -eb9781d081d52c34c041004c774b52169b4a9ca0 data/create/loot_tables/blocks/waxed_exposed_copper_shingles.json +a3b8f12d983077477963fd3fc893c5acd36ad552 data/create/loot_tables/blocks/waxed_copper_tiles.json be5aabc98f4d70028f2b49ae1eaf0bc68a693c53 data/create/loot_tables/blocks/waxed_exposed_copper_shingle_slab.json a99143d290addb98427be53d7fea1cbc702d630c data/create/loot_tables/blocks/waxed_exposed_copper_shingle_stairs.json -e79c0636852b37a463dc122d66cdec27d3aa10c4 data/create/loot_tables/blocks/waxed_exposed_copper_tiles.json +eb9781d081d52c34c041004c774b52169b4a9ca0 data/create/loot_tables/blocks/waxed_exposed_copper_shingles.json 234cbb59a0e00d82c5508c8e9a61e328c22c1c56 data/create/loot_tables/blocks/waxed_exposed_copper_tile_slab.json de628114eb25f393efc4c0934d79c5bdc4365f75 data/create/loot_tables/blocks/waxed_exposed_copper_tile_stairs.json -60fe0594baab9599956d990ba893f8915835db81 data/create/loot_tables/blocks/waxed_oxidized_copper_shingles.json +e79c0636852b37a463dc122d66cdec27d3aa10c4 data/create/loot_tables/blocks/waxed_exposed_copper_tiles.json c8935df7d4634dee2b01c8a0ac5de12397f4d9ed data/create/loot_tables/blocks/waxed_oxidized_copper_shingle_slab.json 2b9370b7fa362ea88f916dd53747da80e4ae3357 data/create/loot_tables/blocks/waxed_oxidized_copper_shingle_stairs.json -f0721c371b08214337f3f4fce3a3705840310bdb data/create/loot_tables/blocks/waxed_oxidized_copper_tiles.json +60fe0594baab9599956d990ba893f8915835db81 data/create/loot_tables/blocks/waxed_oxidized_copper_shingles.json de4d25cac546559173f740752625c82dfd6bae09 data/create/loot_tables/blocks/waxed_oxidized_copper_tile_slab.json 2ed72fc0ea28303f5c6d1039662f55c677cb7bcb data/create/loot_tables/blocks/waxed_oxidized_copper_tile_stairs.json -f309ffd94dfb3591efd2fab337a871a0ceff1084 data/create/loot_tables/blocks/waxed_weathered_copper_shingles.json +f0721c371b08214337f3f4fce3a3705840310bdb data/create/loot_tables/blocks/waxed_oxidized_copper_tiles.json 9a7b265a963e122d510de64012ed1d98ad9017f9 data/create/loot_tables/blocks/waxed_weathered_copper_shingle_slab.json 62f25a1bc013e9c3d487d9a53407e58d89907c5b data/create/loot_tables/blocks/waxed_weathered_copper_shingle_stairs.json -26e6a96f50e7f3384f896bf8a5c3d5ff2b422526 data/create/loot_tables/blocks/waxed_weathered_copper_tiles.json +f309ffd94dfb3591efd2fab337a871a0ceff1084 data/create/loot_tables/blocks/waxed_weathered_copper_shingles.json 3fa20e33ced4aee01775db57629b9580a6b8e200 data/create/loot_tables/blocks/waxed_weathered_copper_tile_slab.json 59b28bd57f461482a394dbce9ea10ee25fc7c294 data/create/loot_tables/blocks/waxed_weathered_copper_tile_stairs.json -3cd15ae684bc0e4e41f02b3ee79eafdbf052620c data/create/loot_tables/blocks/weathered_copper_shingles.json +26e6a96f50e7f3384f896bf8a5c3d5ff2b422526 data/create/loot_tables/blocks/waxed_weathered_copper_tiles.json 278a56aa433ba3647107b3bf0553da5a5f6d40dd data/create/loot_tables/blocks/weathered_copper_shingle_slab.json 198babfd55c3a30c6ac61e81d5e01b0cf8fca80a data/create/loot_tables/blocks/weathered_copper_shingle_stairs.json -771d98a6627d707228719e843bc80636b02dc985 data/create/loot_tables/blocks/weathered_copper_tiles.json +3cd15ae684bc0e4e41f02b3ee79eafdbf052620c data/create/loot_tables/blocks/weathered_copper_shingles.json d6862dc9f7d291df618fbce71eebf613711a5517 data/create/loot_tables/blocks/weathered_copper_tile_slab.json 57d5065d53016e4b1ef0fbad9b84605b1546bcc4 data/create/loot_tables/blocks/weathered_copper_tile_stairs.json +771d98a6627d707228719e843bc80636b02dc985 data/create/loot_tables/blocks/weathered_copper_tiles.json 013deea9b687ce96e5042de13ab0cba9dadce364 data/create/loot_tables/blocks/weathered_iron_block.json f0c51ad0a713aab00dff913361b8e5e8448b912a data/create/loot_tables/blocks/weathered_iron_window.json 1d3ea471ec3f2bbf10c7a11f040f8bbf0d1576a8 data/create/loot_tables/blocks/weathered_iron_window_pane.json @@ -3964,43 +3964,43 @@ da3692808565988e21ec5b1d5e976338ccc4a037 data/create/recipes/calcite_pillar_from 1157b2eab2ada187ea80feae298b77ed7ece4bfd data/create/recipes/copper_bars_from_ingots_copper_stonecutting.json b9d4f55128aa03ee6f6ab1831e709629a42c147e data/create/recipes/copper_ladder_from_ingots_copper_stonecutting.json 922c5ac48c8eb8b3a39f5626a381c2252fbac107 data/create/recipes/copper_scaffolding_from_ingots_copper_stonecutting.json -bab9fa969ba95850dc6e3bd0723387a61cbb05cd data/create/recipes/copper_shingles_from_ingots_copper_stonecutting.json bb083ae1d057dc0106946e4c68f9469b81724396 data/create/recipes/copper_shingle_slab.json 3689feaca2bd5355fa2d4226cd2cc519fa9b97c1 data/create/recipes/copper_shingle_slab_from_copper_shingles_stonecutting.json bd4cd7119f8371164b278afc679795a3c2a53406 data/create/recipes/copper_shingle_stairs.json 59f672e8e88d5f4655467e2696616b552debaf46 data/create/recipes/copper_shingle_stairs_from_copper_shingles_stonecutting.json +bab9fa969ba95850dc6e3bd0723387a61cbb05cd data/create/recipes/copper_shingles_from_ingots_copper_stonecutting.json 0225fc8d7b7a5027b8a61e6a043c3a8e505d876a data/create/recipes/copper_table_cloth_from_ingots_copper_stonecutting.json -d463aa891c7ae1b2eb1a758e4100c5a1c16cfffd data/create/recipes/copper_tiles_from_ingots_copper_stonecutting.json f64ba3f3c607b43ea77e5bccb7ec2048e5c6e424 data/create/recipes/copper_tile_slab.json 91b0390e0c772d43eb46b94a0113323f0f6a4387 data/create/recipes/copper_tile_slab_from_copper_tiles_stonecutting.json d31a41f6f7ef0bd20abab06cc31a9d2c56187117 data/create/recipes/copper_tile_stairs.json bf1b0a447169029161fb07feacd22d5aa806b2bf data/create/recipes/copper_tile_stairs_from_copper_tiles_stonecutting.json +d463aa891c7ae1b2eb1a758e4100c5a1c16cfffd data/create/recipes/copper_tiles_from_ingots_copper_stonecutting.json daa54c9ff3612521f06cc1979116beafcda852dd data/create/recipes/copycat_panel_from_ingots_zinc_stonecutting.json 745816d2c3fa29ede2510e39edc76f6fecee963f data/create/recipes/copycat_step_from_ingots_zinc_stonecutting.json -255c32272a704109fccdbb071d4dbf602cb8c1d8 data/create/recipes/crafting/copper/waxed_copper_shingles_from_honeycomb.json 57ae13042e0f96676fa322bf24db4976d75ca6bc data/create/recipes/crafting/copper/waxed_copper_shingle_slab_from_honeycomb.json 790565897535ea2e741d0a0ed7c0b561d594b69a data/create/recipes/crafting/copper/waxed_copper_shingle_stairs_from_honeycomb.json -0c6e14c5884257850c7360cba66bc8cca91c84e7 data/create/recipes/crafting/copper/waxed_copper_tiles_from_honeycomb.json +255c32272a704109fccdbb071d4dbf602cb8c1d8 data/create/recipes/crafting/copper/waxed_copper_shingles_from_honeycomb.json 4693ee65a4a5e1c93fc2acce7bfbc438e573ad9a data/create/recipes/crafting/copper/waxed_copper_tile_slab_from_honeycomb.json f8772b915663e3f70b3a2405a23c5ce87e8b8e49 data/create/recipes/crafting/copper/waxed_copper_tile_stairs_from_honeycomb.json -6d0dacc4db8966d38156fe17645732084379a887 data/create/recipes/crafting/copper/waxed_exposed_copper_shingles_from_honeycomb.json +0c6e14c5884257850c7360cba66bc8cca91c84e7 data/create/recipes/crafting/copper/waxed_copper_tiles_from_honeycomb.json 3bc0b81ea61229e24570e083caa4e5870d517e75 data/create/recipes/crafting/copper/waxed_exposed_copper_shingle_slab_from_honeycomb.json 191f34b27bc8966c2b6ba41403cc0933718748d3 data/create/recipes/crafting/copper/waxed_exposed_copper_shingle_stairs_from_honeycomb.json -cdd66bdfddbcdfacb27c030872d10b6e7f1356fd data/create/recipes/crafting/copper/waxed_exposed_copper_tiles_from_honeycomb.json +6d0dacc4db8966d38156fe17645732084379a887 data/create/recipes/crafting/copper/waxed_exposed_copper_shingles_from_honeycomb.json 2f6d2f8da4d4da2ed48e33d8f6e0b32d37a3ce6d data/create/recipes/crafting/copper/waxed_exposed_copper_tile_slab_from_honeycomb.json 4ed8482ed29fe7c3273db733fa141743c181d460 data/create/recipes/crafting/copper/waxed_exposed_copper_tile_stairs_from_honeycomb.json -0ca4e58d715d5ed4b051a94f2dff42d4d413ef07 data/create/recipes/crafting/copper/waxed_oxidized_copper_shingles_from_honeycomb.json +cdd66bdfddbcdfacb27c030872d10b6e7f1356fd data/create/recipes/crafting/copper/waxed_exposed_copper_tiles_from_honeycomb.json b421f16aea7c47fa8a62e69973f30e4e382f8a2c data/create/recipes/crafting/copper/waxed_oxidized_copper_shingle_slab_from_honeycomb.json 7ab7f673f57e219d3e486d0add1d7e2a8820cc6b data/create/recipes/crafting/copper/waxed_oxidized_copper_shingle_stairs_from_honeycomb.json -b7edffb9b1a936fd34fe23defefc8cb9ea4f6977 data/create/recipes/crafting/copper/waxed_oxidized_copper_tiles_from_honeycomb.json +0ca4e58d715d5ed4b051a94f2dff42d4d413ef07 data/create/recipes/crafting/copper/waxed_oxidized_copper_shingles_from_honeycomb.json 24582e83e8d36a6267df5c028addfb44c1a637e6 data/create/recipes/crafting/copper/waxed_oxidized_copper_tile_slab_from_honeycomb.json 9185ea241bcb5f2fe09d0d5c65832ef379e06c58 data/create/recipes/crafting/copper/waxed_oxidized_copper_tile_stairs_from_honeycomb.json -90bce9f262b87fb821210aceb88d09d815d15e5a data/create/recipes/crafting/copper/waxed_weathered_copper_shingles_from_honeycomb.json +b7edffb9b1a936fd34fe23defefc8cb9ea4f6977 data/create/recipes/crafting/copper/waxed_oxidized_copper_tiles_from_honeycomb.json a2cc99ad9b1234f5327971ee535af9bc25d0154c data/create/recipes/crafting/copper/waxed_weathered_copper_shingle_slab_from_honeycomb.json 0952753a079593d748b38ca84b666f2f886f5c1e data/create/recipes/crafting/copper/waxed_weathered_copper_shingle_stairs_from_honeycomb.json -724802d206db185ebf20bafbcfc35fe0f982f58a data/create/recipes/crafting/copper/waxed_weathered_copper_tiles_from_honeycomb.json +90bce9f262b87fb821210aceb88d09d815d15e5a data/create/recipes/crafting/copper/waxed_weathered_copper_shingles_from_honeycomb.json 98d0b72eb20e1d80cc590800ae2d642a47c3ae5f data/create/recipes/crafting/copper/waxed_weathered_copper_tile_slab_from_honeycomb.json 594b8fd5c30a84df97667b2c6dccc5dedd039d26 data/create/recipes/crafting/copper/waxed_weathered_copper_tile_stairs_from_honeycomb.json +724802d206db185ebf20bafbcfc35fe0f982f58a data/create/recipes/crafting/copper/waxed_weathered_copper_tiles_from_honeycomb.json 97c3e430ef2aecf61c457d0b8c4bbd23e1b01cc3 data/create/recipes/crafting/kinetics/black_seat.json 1129d02609125b48af2efa48f84dd3f90d51a341 data/create/recipes/crafting/kinetics/black_seat_from_other_seat.json 9e5a73e2343054d35e2fbfd20f0c49834d1a87a6 data/create/recipes/crafting/kinetics/black_valve_handle_from_other_valve_handle.json @@ -4136,7 +4136,6 @@ db333d47f9e1d6b02aa670ea0aa10dabbcb0e319 data/create/recipes/crafting/logistics/ c3f4fd2206f3885904913289761f2b8b758e4c95 data/create/recipes/crimsite_pillar_from_stone_types_crimsite_stonecutting.json e1815f97fbc2786d77f5378a2696e36050d8a1fd data/create/recipes/crimson_window.json 96009a12fe3f5ebf677ac069999e2ea2adbc9b7c data/create/recipes/crimson_window_pane.json -82cb9be82ce5109781169bdb47bbd49238b9824b data/create/recipes/cut_andesite_bricks_from_stone_types_andesite_stonecutting.json d6a41fc914a4a41478f115d9503658dba04a4d02 data/create/recipes/cut_andesite_brick_slab.json edf981198463ac58524606f86dc15d2265e8b993 data/create/recipes/cut_andesite_brick_slab_from_stone_types_andesite_stonecutting.json 72486864f3a0d31a92212552441eb659f2541b60 data/create/recipes/cut_andesite_brick_slab_recycling.json @@ -4144,6 +4143,7 @@ edf981198463ac58524606f86dc15d2265e8b993 data/create/recipes/cut_andesite_brick_ 22f463c679249738bf1a340a3b8ff14806303a70 data/create/recipes/cut_andesite_brick_stairs_from_stone_types_andesite_stonecutting.json 42b7105c1d776aed25c1c6bbd9254375079d7438 data/create/recipes/cut_andesite_brick_wall.json 7d25517650c9f66b65f0f8841cf9bcda7ea401ec data/create/recipes/cut_andesite_brick_wall_from_stone_types_andesite_stonecutting.json +82cb9be82ce5109781169bdb47bbd49238b9824b data/create/recipes/cut_andesite_bricks_from_stone_types_andesite_stonecutting.json c3ab483224c3adbd467a4ec0b26a1f6a53fe81c4 data/create/recipes/cut_andesite_from_stone_types_andesite_stonecutting.json 9f316131bb538da9f6b1bde9eaaa0a5bd5972a66 data/create/recipes/cut_andesite_slab.json 50dcff201da369bdc591fdc320aae3547f114284 data/create/recipes/cut_andesite_slab_from_stone_types_andesite_stonecutting.json @@ -4152,7 +4152,6 @@ c3ab483224c3adbd467a4ec0b26a1f6a53fe81c4 data/create/recipes/cut_andesite_from_s c284fc46aabae9c5ab79071eb63ec9b07a9d1002 data/create/recipes/cut_andesite_stairs_from_stone_types_andesite_stonecutting.json 3b6e66e92656ab5b0d1e15444db62ccb1cc01866 data/create/recipes/cut_andesite_wall.json 5df6e8d558f656533aff514aee8cdec7cf8d6fdf data/create/recipes/cut_andesite_wall_from_stone_types_andesite_stonecutting.json -e335b15907be053ab0f2649338b12a86371b78f7 data/create/recipes/cut_asurine_bricks_from_stone_types_asurine_stonecutting.json 41d085d3b8fce5b12d601d86fd0e88df9b482aec data/create/recipes/cut_asurine_brick_slab.json cf61e0806a3988a771675a261a540cbb62352d80 data/create/recipes/cut_asurine_brick_slab_from_stone_types_asurine_stonecutting.json 86606a0717bba33f457707d96461fec6a22d23de data/create/recipes/cut_asurine_brick_slab_recycling.json @@ -4160,6 +4159,7 @@ cf61e0806a3988a771675a261a540cbb62352d80 data/create/recipes/cut_asurine_brick_s 382a7faa460ac286631fe063280541f2f499d895 data/create/recipes/cut_asurine_brick_stairs_from_stone_types_asurine_stonecutting.json 09699c116bb201e742fef1fd3c987e9de4606e6a data/create/recipes/cut_asurine_brick_wall.json 8bb8a9f8e8dd0d6585311c326dcf3f40227149a9 data/create/recipes/cut_asurine_brick_wall_from_stone_types_asurine_stonecutting.json +e335b15907be053ab0f2649338b12a86371b78f7 data/create/recipes/cut_asurine_bricks_from_stone_types_asurine_stonecutting.json 0188d62fbeede94f8596dd5cc73d361a160e8c95 data/create/recipes/cut_asurine_from_stone_types_asurine_stonecutting.json 118e87a2a344238009b1bbbe70e6f314e27842d9 data/create/recipes/cut_asurine_slab.json 37c502094ee96da9e4983142dae5e023c6bcfe14 data/create/recipes/cut_asurine_slab_from_stone_types_asurine_stonecutting.json @@ -4168,7 +4168,6 @@ fe3dd5c7d5bdea71a75003cf3d50439d9d21458d data/create/recipes/cut_asurine_slab_re cade93c9328afcacf4507aa7699c4b09fb4592d4 data/create/recipes/cut_asurine_stairs_from_stone_types_asurine_stonecutting.json 80bec79b5daea4b2b72c0f5e9f189c1044583465 data/create/recipes/cut_asurine_wall.json 45a712e41a74982cfb94a39da199ec6c95eef798 data/create/recipes/cut_asurine_wall_from_stone_types_asurine_stonecutting.json -da11f21280ba1ed06ffe8afe77db3e9e1bbcb1a3 data/create/recipes/cut_calcite_bricks_from_stone_types_calcite_stonecutting.json 98e849c743ed1e4397bf6168215dfa7006a804c4 data/create/recipes/cut_calcite_brick_slab.json 1c21eb6c785729a8ea274513e1313aed952e105e data/create/recipes/cut_calcite_brick_slab_from_stone_types_calcite_stonecutting.json 2a3f078f7f40ba3bc5c17a037db1f8ee415e4e3f data/create/recipes/cut_calcite_brick_slab_recycling.json @@ -4176,6 +4175,7 @@ e4267c62bc6cfc8373df29ee2685f1e1b286b638 data/create/recipes/cut_calcite_brick_s 10fe509e01e3ed1b04bd2f384c0aa3db96b117f1 data/create/recipes/cut_calcite_brick_stairs_from_stone_types_calcite_stonecutting.json 9b55a6c9cf0ce697a242684953daf9aa94d024dc data/create/recipes/cut_calcite_brick_wall.json 1e67376e484923b84bd64b0b22b4e55b581ac419 data/create/recipes/cut_calcite_brick_wall_from_stone_types_calcite_stonecutting.json +da11f21280ba1ed06ffe8afe77db3e9e1bbcb1a3 data/create/recipes/cut_calcite_bricks_from_stone_types_calcite_stonecutting.json 98b014b64c97371f04aaacbdd23e13e274e36e3b data/create/recipes/cut_calcite_from_stone_types_calcite_stonecutting.json fcab91f11fe97a194b2c1b16115206166d3cd634 data/create/recipes/cut_calcite_slab.json 8426a494b776148056cb4525e62744d0be8b28cd data/create/recipes/cut_calcite_slab_from_stone_types_calcite_stonecutting.json @@ -4184,7 +4184,6 @@ fcab91f11fe97a194b2c1b16115206166d3cd634 data/create/recipes/cut_calcite_slab.js a7e7fb425d3c1f21f5ed53da79957363fed824df data/create/recipes/cut_calcite_stairs_from_stone_types_calcite_stonecutting.json 73eaf7bffa38bc874974871f3002cd3ee7f0c36e data/create/recipes/cut_calcite_wall.json 01b4c23362f15ee0e5c207c46383f96032c89d98 data/create/recipes/cut_calcite_wall_from_stone_types_calcite_stonecutting.json -07aff2bb6424de46463b2c965418ed52efd0a790 data/create/recipes/cut_crimsite_bricks_from_stone_types_crimsite_stonecutting.json 8ffb2c1c747f19ea37c0da3fe248b6c58981c9f6 data/create/recipes/cut_crimsite_brick_slab.json 86c3a5c64561052489b3ceb9e08be5a8729198a9 data/create/recipes/cut_crimsite_brick_slab_from_stone_types_crimsite_stonecutting.json e3215d4e651e70402b896ba50975cb2f23d16278 data/create/recipes/cut_crimsite_brick_slab_recycling.json @@ -4192,6 +4191,7 @@ e49f6e319fae9058cbece0e332a11e108234e608 data/create/recipes/cut_crimsite_brick_ c7186fb1a75f59aff929e843f50a162a090b7bb3 data/create/recipes/cut_crimsite_brick_stairs_from_stone_types_crimsite_stonecutting.json 272d8d01730a88eff4fc6923e93962650b992c46 data/create/recipes/cut_crimsite_brick_wall.json 13ac9464098e8c67e820dc898c025ab0382d852a data/create/recipes/cut_crimsite_brick_wall_from_stone_types_crimsite_stonecutting.json +07aff2bb6424de46463b2c965418ed52efd0a790 data/create/recipes/cut_crimsite_bricks_from_stone_types_crimsite_stonecutting.json 18ce9ff32eda2d869bd11f398a86e78b71f6d0fe data/create/recipes/cut_crimsite_from_stone_types_crimsite_stonecutting.json c39166aa6267ec5bc71893d5756955abfb644217 data/create/recipes/cut_crimsite_slab.json 6271d5bc0377814ba06061bfffcb812ca2ef8f03 data/create/recipes/cut_crimsite_slab_from_stone_types_crimsite_stonecutting.json @@ -4200,7 +4200,6 @@ acfe33dbb889c820c213bcbc8593766703bf3a25 data/create/recipes/cut_crimsite_slab_r 90b03cf1e72d3b803e33755832e0722ff264681b data/create/recipes/cut_crimsite_stairs_from_stone_types_crimsite_stonecutting.json 8dfe19522878af232deaa1fc13d83cf785684cba data/create/recipes/cut_crimsite_wall.json 18f9548175baab0173785d7ef308096067712dd2 data/create/recipes/cut_crimsite_wall_from_stone_types_crimsite_stonecutting.json -de1a11b7ed71f1f7aeea2791fe922feef689fd35 data/create/recipes/cut_deepslate_bricks_from_stone_types_deepslate_stonecutting.json 5e5c0e6b1b3e204de3c48fb6a4cd473a150979c2 data/create/recipes/cut_deepslate_brick_slab.json 2c0795b92759dab751f86f50aa80440df2245526 data/create/recipes/cut_deepslate_brick_slab_from_stone_types_deepslate_stonecutting.json dbcc41c48cf28b71dcd9f3b6ecae43c8de681532 data/create/recipes/cut_deepslate_brick_slab_recycling.json @@ -4208,6 +4207,7 @@ e21f8dc33e70ebd43ea79a4afaf3b4e8a449f4bd data/create/recipes/cut_deepslate_brick 7b3489e5b629a995691be117c5a378769c743449 data/create/recipes/cut_deepslate_brick_stairs_from_stone_types_deepslate_stonecutting.json 158bb41bffebb2543e4aa2d5f14cc8af1cdd8671 data/create/recipes/cut_deepslate_brick_wall.json 73a07a5fa665bb20d131f0a0e40806116316928a data/create/recipes/cut_deepslate_brick_wall_from_stone_types_deepslate_stonecutting.json +de1a11b7ed71f1f7aeea2791fe922feef689fd35 data/create/recipes/cut_deepslate_bricks_from_stone_types_deepslate_stonecutting.json 992fdc2eba2afe3ff8aad0ceee5424ecd3f3026d data/create/recipes/cut_deepslate_from_stone_types_deepslate_stonecutting.json 064e2f5edd9209af7742b0f0eb45204453bed46f data/create/recipes/cut_deepslate_slab.json f341d30b7fd427dea09a51d67e1e9532e5184be8 data/create/recipes/cut_deepslate_slab_from_stone_types_deepslate_stonecutting.json @@ -4216,7 +4216,6 @@ c08e12e44344efca550efa8ba14d0cb2f9f6c2c6 data/create/recipes/cut_deepslate_stair e6deec1352fb5c74c470dc488b71e5f8f55bdfbf data/create/recipes/cut_deepslate_stairs_from_stone_types_deepslate_stonecutting.json 2ad7fb3f3a143e58bea8eefe4cd9db3d1c37a3e6 data/create/recipes/cut_deepslate_wall.json e752527479f71f96bb34878008bf8cfb23fd3045 data/create/recipes/cut_deepslate_wall_from_stone_types_deepslate_stonecutting.json -2c23d13f48f3685bda6c564e080053fbfa71ab99 data/create/recipes/cut_diorite_bricks_from_stone_types_diorite_stonecutting.json 90b83c2a2026d70f49c91813305fdee721926db9 data/create/recipes/cut_diorite_brick_slab.json 9d51c690c77321437561a006dc2f9bba975875e6 data/create/recipes/cut_diorite_brick_slab_from_stone_types_diorite_stonecutting.json fa76e64ac9b569f5d5f2f1ecc54e51f9be15aacf data/create/recipes/cut_diorite_brick_slab_recycling.json @@ -4224,6 +4223,7 @@ aa6aea99e9ce2d5dc3d6555ab3d17928bca6195e data/create/recipes/cut_diorite_brick_s 9a26c4097519a9300e591b6578bbaf6c11f909e1 data/create/recipes/cut_diorite_brick_stairs_from_stone_types_diorite_stonecutting.json 78d37df17c7e2be73ce1d226ee552ff3f49b9e4f data/create/recipes/cut_diorite_brick_wall.json f668f2c78a779bc3d0546a82dea02b9f4688e05c data/create/recipes/cut_diorite_brick_wall_from_stone_types_diorite_stonecutting.json +2c23d13f48f3685bda6c564e080053fbfa71ab99 data/create/recipes/cut_diorite_bricks_from_stone_types_diorite_stonecutting.json 1918ecb2ab16ca7dbb30eee4852b67dd963d872e data/create/recipes/cut_diorite_from_stone_types_diorite_stonecutting.json 07fda5c89128648856f948a03ac56a2a2693cf1b data/create/recipes/cut_diorite_slab.json 28765ac7f8b62373b32f014d1dd7f4afb50e1906 data/create/recipes/cut_diorite_slab_from_stone_types_diorite_stonecutting.json @@ -4232,7 +4232,6 @@ dd5f3c59a5d292f7b5c046be35da7f67e8383aa1 data/create/recipes/cut_diorite_slab_re be2c6c01630b90895e7215edce3d02352793dbc4 data/create/recipes/cut_diorite_stairs_from_stone_types_diorite_stonecutting.json 8984b7b7dbc7e65ee04886516501a13278e889e9 data/create/recipes/cut_diorite_wall.json 8ff5d1ecff2202595f7cba5bd65c466c53ac2cc5 data/create/recipes/cut_diorite_wall_from_stone_types_diorite_stonecutting.json -10550b023989113c26d430136daf1dc49f10ce63 data/create/recipes/cut_dripstone_bricks_from_stone_types_dripstone_stonecutting.json 95717a80bb8ae296c2f77478a8f42b88cea88996 data/create/recipes/cut_dripstone_brick_slab.json f04bf1189b53e24974779d9e959e8973d9677162 data/create/recipes/cut_dripstone_brick_slab_from_stone_types_dripstone_stonecutting.json 332534fc2909ca83f5f7f4ab3adf92680bb17f79 data/create/recipes/cut_dripstone_brick_slab_recycling.json @@ -4240,6 +4239,7 @@ f04bf1189b53e24974779d9e959e8973d9677162 data/create/recipes/cut_dripstone_brick 17bf8160eaf16655d454ddfe22b82c9a86462146 data/create/recipes/cut_dripstone_brick_stairs_from_stone_types_dripstone_stonecutting.json 7d638d156326a2e542ed94837273d9cca5cf4fce data/create/recipes/cut_dripstone_brick_wall.json 154931db54115cf4a64147cdd6d1eb7efff48737 data/create/recipes/cut_dripstone_brick_wall_from_stone_types_dripstone_stonecutting.json +10550b023989113c26d430136daf1dc49f10ce63 data/create/recipes/cut_dripstone_bricks_from_stone_types_dripstone_stonecutting.json 7147f9199f174c9864109fe5723528921aaa0c46 data/create/recipes/cut_dripstone_from_stone_types_dripstone_stonecutting.json f2800b467eac75d0099f2f07e09b47115df4e09f data/create/recipes/cut_dripstone_slab.json a4f62a1a30592f82789988f93d8ae35d176eca59 data/create/recipes/cut_dripstone_slab_from_stone_types_dripstone_stonecutting.json @@ -4248,7 +4248,6 @@ a4f62a1a30592f82789988f93d8ae35d176eca59 data/create/recipes/cut_dripstone_slab_ f2df5efedb6fb25ecb877b888007990082d9aca4 data/create/recipes/cut_dripstone_stairs_from_stone_types_dripstone_stonecutting.json a177092d0270f9e07a4f9bef4d0c8fb2ed91d3bc data/create/recipes/cut_dripstone_wall.json a3731ef689d3ac790bc3e3fd507f1134c99a751a data/create/recipes/cut_dripstone_wall_from_stone_types_dripstone_stonecutting.json -9c4c64666b18d3adb11cd3d56667fabf6e88dfe2 data/create/recipes/cut_granite_bricks_from_stone_types_granite_stonecutting.json aa454bebffd7e77cfa5c1bd711bfbac27e3c5a14 data/create/recipes/cut_granite_brick_slab.json d073b9b0b8ca2fbdc5e1ed16f6f195a5f3af4588 data/create/recipes/cut_granite_brick_slab_from_stone_types_granite_stonecutting.json 1dfd539c17a3342a0cd194ce1465a808aacbeda3 data/create/recipes/cut_granite_brick_slab_recycling.json @@ -4256,6 +4255,7 @@ e069aa5c316feb2823ef98e8e6c89bb1bed23d2e data/create/recipes/cut_granite_brick_s f38fc7014aa83d4914d50d87ee3f8f762c078a78 data/create/recipes/cut_granite_brick_stairs_from_stone_types_granite_stonecutting.json 0fd9c3a778c7bdcd7aa06f892a9c260ad664d367 data/create/recipes/cut_granite_brick_wall.json b81db94b6228f512049324dd1436880f1e86e444 data/create/recipes/cut_granite_brick_wall_from_stone_types_granite_stonecutting.json +9c4c64666b18d3adb11cd3d56667fabf6e88dfe2 data/create/recipes/cut_granite_bricks_from_stone_types_granite_stonecutting.json 01970a95f17648a7ef1fb0337ee2e82eb2279e9e data/create/recipes/cut_granite_from_stone_types_granite_stonecutting.json 8fc1c51591e590c8718be0500a4dbcc2b47830ce data/create/recipes/cut_granite_slab.json d239323b7a3b65b2fd7005350a90d578671c2b81 data/create/recipes/cut_granite_slab_from_stone_types_granite_stonecutting.json @@ -4264,7 +4264,6 @@ d239323b7a3b65b2fd7005350a90d578671c2b81 data/create/recipes/cut_granite_slab_fr 3d85d483073d37fea7d9a95831b3b856c0725b98 data/create/recipes/cut_granite_stairs_from_stone_types_granite_stonecutting.json 3d4130fe5fe6e963fd5e10534e729e0448b9f05f data/create/recipes/cut_granite_wall.json d43a876bf89bf3536c80fd5e3ef0ee36c147cd06 data/create/recipes/cut_granite_wall_from_stone_types_granite_stonecutting.json -7cdd3cf302cfe4ef21c0a89dadef4f781e307bb0 data/create/recipes/cut_limestone_bricks_from_stone_types_limestone_stonecutting.json 0e3285206947bcfdf9606d3f8e61ea7d2899f7d2 data/create/recipes/cut_limestone_brick_slab.json c3d3ff37e29c435b2a13d30bd4ded0f6ca9fbfbc data/create/recipes/cut_limestone_brick_slab_from_stone_types_limestone_stonecutting.json 459babb2bd01e9e1ece4c8cd2865690997f01c66 data/create/recipes/cut_limestone_brick_slab_recycling.json @@ -4272,6 +4271,7 @@ d4f8dc640becf1c35416016500424ecd68d7ecee data/create/recipes/cut_limestone_brick 570983b2b27862dabe9f3d1bcd76d2909b8bdb3c data/create/recipes/cut_limestone_brick_stairs_from_stone_types_limestone_stonecutting.json aad4342a726fd65ca2b4c52a4e8857190e50b5be data/create/recipes/cut_limestone_brick_wall.json 5ac226aff9d854efc47ed71241e6c098b170b9b0 data/create/recipes/cut_limestone_brick_wall_from_stone_types_limestone_stonecutting.json +7cdd3cf302cfe4ef21c0a89dadef4f781e307bb0 data/create/recipes/cut_limestone_bricks_from_stone_types_limestone_stonecutting.json 329950373aaaf8e70c54cf5e2467c7a84f372078 data/create/recipes/cut_limestone_from_stone_types_limestone_stonecutting.json cbacfd31703ac908d28e42968bb571dccfa20612 data/create/recipes/cut_limestone_slab.json 628a0a64c2dcd63f17a3ec9ce55ac643b194eacc data/create/recipes/cut_limestone_slab_from_stone_types_limestone_stonecutting.json @@ -4280,7 +4280,6 @@ cbacfd31703ac908d28e42968bb571dccfa20612 data/create/recipes/cut_limestone_slab. ba301da212ee14ff42c38487d0906a2da203e3c3 data/create/recipes/cut_limestone_stairs_from_stone_types_limestone_stonecutting.json d2aac4ac16f9c842af1efd3896dd3250f6d8424e data/create/recipes/cut_limestone_wall.json b14e6972f8586e569a7ab4ecf6ed5d6db1a2bded data/create/recipes/cut_limestone_wall_from_stone_types_limestone_stonecutting.json -a1a2b95283d88e1d990e00da9a095fe928b2aa2f data/create/recipes/cut_ochrum_bricks_from_stone_types_ochrum_stonecutting.json d5a4fa7787d2e56e0b5c8d533567543b93cf694b data/create/recipes/cut_ochrum_brick_slab.json 58514a5f216706e9bb62b27ad03701fe02bac013 data/create/recipes/cut_ochrum_brick_slab_from_stone_types_ochrum_stonecutting.json 6cc3167ebf075d7b302a359d1afdddf5753d0e26 data/create/recipes/cut_ochrum_brick_slab_recycling.json @@ -4288,6 +4287,7 @@ d5a4fa7787d2e56e0b5c8d533567543b93cf694b data/create/recipes/cut_ochrum_brick_sl ec6339d6658b0d32e46c8a4a4e06d94a388a6332 data/create/recipes/cut_ochrum_brick_stairs_from_stone_types_ochrum_stonecutting.json c4139ae7a9742f7111d308fe66bf1d627533550b data/create/recipes/cut_ochrum_brick_wall.json 1b8a4c81680df542a5e6b9e665c96649cf3eb7fa data/create/recipes/cut_ochrum_brick_wall_from_stone_types_ochrum_stonecutting.json +a1a2b95283d88e1d990e00da9a095fe928b2aa2f data/create/recipes/cut_ochrum_bricks_from_stone_types_ochrum_stonecutting.json 2b967f3424196b5da9b396ea58fb969d406af789 data/create/recipes/cut_ochrum_from_stone_types_ochrum_stonecutting.json 5baa701f3cbe8d69e2e6a5554622dd78ef3ac451 data/create/recipes/cut_ochrum_slab.json 9a26cba276cf135a10c71d31f5b960b2ee6ac444 data/create/recipes/cut_ochrum_slab_from_stone_types_ochrum_stonecutting.json @@ -4296,7 +4296,6 @@ c4139ae7a9742f7111d308fe66bf1d627533550b data/create/recipes/cut_ochrum_brick_wa 75a232ccede0ffa7feb3e69da17c6a514a908907 data/create/recipes/cut_ochrum_stairs_from_stone_types_ochrum_stonecutting.json d9c05b7e4ce4ee86d0f6a9e1ee6c1b585ffee58b data/create/recipes/cut_ochrum_wall.json ee0dff8e1317aeffd061688879b97e81a00b7adb data/create/recipes/cut_ochrum_wall_from_stone_types_ochrum_stonecutting.json -087eefb8ffd61fd88f1db6ca25f9ac31e93f2fdf data/create/recipes/cut_scorchia_bricks_from_stone_types_scorchia_stonecutting.json 72ac9293e5791df07914e2d3ed00e5ff59d64b08 data/create/recipes/cut_scorchia_brick_slab.json 2f38c410d5eb93bdb8c8be0f68ac89726e3c765c data/create/recipes/cut_scorchia_brick_slab_from_stone_types_scorchia_stonecutting.json e296e6af6865bf6e4618dab8a96bb88f6999a9a5 data/create/recipes/cut_scorchia_brick_slab_recycling.json @@ -4304,6 +4303,7 @@ bd5984a6b96443319b7fad32db771d8ded0b0591 data/create/recipes/cut_scorchia_brick_ bd5c803c855222a29998dd784e6d12a18dd612d9 data/create/recipes/cut_scorchia_brick_stairs_from_stone_types_scorchia_stonecutting.json adfe0b08b5b72e579d47f36a4f835045e433e7f7 data/create/recipes/cut_scorchia_brick_wall.json 37fc5ae45d0260de9a5c45b0a1b208e4d146a562 data/create/recipes/cut_scorchia_brick_wall_from_stone_types_scorchia_stonecutting.json +087eefb8ffd61fd88f1db6ca25f9ac31e93f2fdf data/create/recipes/cut_scorchia_bricks_from_stone_types_scorchia_stonecutting.json f6dfd648418f24da093b80978c2f6e070f33ff6d data/create/recipes/cut_scorchia_from_stone_types_scorchia_stonecutting.json 7df99605c0c8761aeb9301d5391e1f16d41f89b3 data/create/recipes/cut_scorchia_slab.json fbd9a92d3c3d9e823cac51347320219f1734ec04 data/create/recipes/cut_scorchia_slab_from_stone_types_scorchia_stonecutting.json @@ -4312,7 +4312,6 @@ ad54182c3142ac9d9dd9bb4c5acc18f82e3fc5e5 data/create/recipes/cut_scorchia_stairs 1ddfefce136201ae78dbc53ba472080332fd6366 data/create/recipes/cut_scorchia_stairs_from_stone_types_scorchia_stonecutting.json 0a011b7cee33200fec5546168734c330952124da data/create/recipes/cut_scorchia_wall.json c594d886a303ad6e24d1283004442835ee861fbc data/create/recipes/cut_scorchia_wall_from_stone_types_scorchia_stonecutting.json -8650c0db70a3521b50404252106e0185b4f25a45 data/create/recipes/cut_scoria_bricks_from_stone_types_scoria_stonecutting.json 8baf09b5ff2004d71091b6f95307aa179a21f4df data/create/recipes/cut_scoria_brick_slab.json e7080ca9b6a507bec4a4a3dd52a28c1c33975628 data/create/recipes/cut_scoria_brick_slab_from_stone_types_scoria_stonecutting.json f5b56f6eb9c1ac0f8168b2b0f0b0ab00655ebfdb data/create/recipes/cut_scoria_brick_slab_recycling.json @@ -4320,6 +4319,7 @@ f5b56f6eb9c1ac0f8168b2b0f0b0ab00655ebfdb data/create/recipes/cut_scoria_brick_sl 3fd560355163f0afafefe886e75fd8b2c3cf2b6f data/create/recipes/cut_scoria_brick_stairs_from_stone_types_scoria_stonecutting.json ed803a4cdcf1dd01af03fff52e783f3539f78546 data/create/recipes/cut_scoria_brick_wall.json 553642a4e0dc5f934da8127a427ccdf53d3f51f9 data/create/recipes/cut_scoria_brick_wall_from_stone_types_scoria_stonecutting.json +8650c0db70a3521b50404252106e0185b4f25a45 data/create/recipes/cut_scoria_bricks_from_stone_types_scoria_stonecutting.json 5702063be3d38fa6b3ae5c998337676a0cf91149 data/create/recipes/cut_scoria_from_stone_types_scoria_stonecutting.json 295356022aee8a33272b430879615af638fc5a2c data/create/recipes/cut_scoria_slab.json 1656e822e823fcdf04120b55235aa477845a69a6 data/create/recipes/cut_scoria_slab_from_stone_types_scoria_stonecutting.json @@ -4328,7 +4328,6 @@ d0c88c037004911e377d88cf5a28ff85a413d07e data/create/recipes/cut_scoria_slab_rec 8748df6152c923930452397367562bb6007058cf data/create/recipes/cut_scoria_stairs_from_stone_types_scoria_stonecutting.json 7f9bd9de7bfba21eef449f8e11ffc8cf37de6b88 data/create/recipes/cut_scoria_wall.json 42235c6ded520ecda3321e8cd8910dcfa05cd61e data/create/recipes/cut_scoria_wall_from_stone_types_scoria_stonecutting.json -c02b4daf0050d705c145c0698aaa3094724ba2f1 data/create/recipes/cut_tuff_bricks_from_stone_types_tuff_stonecutting.json 214b6219b86d94ea5705e40f254a4d9a9ac894b7 data/create/recipes/cut_tuff_brick_slab.json 9e0182206fab754daa0596259be0b98a712ba859 data/create/recipes/cut_tuff_brick_slab_from_stone_types_tuff_stonecutting.json 86938ed4ef969e85163c25e2a60181433247b73b data/create/recipes/cut_tuff_brick_slab_recycling.json @@ -4336,6 +4335,7 @@ b4212528d6c8893c1d57c0a5ada60673105e399d data/create/recipes/cut_tuff_brick_stai 90f3241a3eb47d9b0902b639fadee76e41b92a72 data/create/recipes/cut_tuff_brick_stairs_from_stone_types_tuff_stonecutting.json b920d14ac41465f70b1fb8211c1c06d6c41ccadb data/create/recipes/cut_tuff_brick_wall.json aa41f89028dfa995dc11b881894e5a5993e4c4f9 data/create/recipes/cut_tuff_brick_wall_from_stone_types_tuff_stonecutting.json +c02b4daf0050d705c145c0698aaa3094724ba2f1 data/create/recipes/cut_tuff_bricks_from_stone_types_tuff_stonecutting.json 41dc800ae0a8918f4602d610ff0ba9714cdfe8dc data/create/recipes/cut_tuff_from_stone_types_tuff_stonecutting.json 573fff8b4fba92289dc6b113b58c8de25427f62d data/create/recipes/cut_tuff_slab.json 94667fb1e6203bd66bef10acfee7cd990009d26f data/create/recipes/cut_tuff_slab_from_stone_types_tuff_stonecutting.json @@ -4344,7 +4344,6 @@ aa41f89028dfa995dc11b881894e5a5993e4c4f9 data/create/recipes/cut_tuff_brick_wall 3b3ba319bd67a4e7f555cfcb54f9dc1fc22cf015 data/create/recipes/cut_tuff_stairs_from_stone_types_tuff_stonecutting.json 0c241d763e87b23b8799528e132e0d12b0e16141 data/create/recipes/cut_tuff_wall.json 5705b0312c5c70d48662c2ff375f0b2cfe3b4902 data/create/recipes/cut_tuff_wall_from_stone_types_tuff_stonecutting.json -8ab3c640b57421a8c0341ab4ec5bade31376d059 data/create/recipes/cut_veridium_bricks_from_stone_types_veridium_stonecutting.json 822f97726c72d31c4c614767c08140b3535e0640 data/create/recipes/cut_veridium_brick_slab.json 1705fd5fc9ecc9a650812c89f500b5ef9aec2626 data/create/recipes/cut_veridium_brick_slab_from_stone_types_veridium_stonecutting.json 238aeedf55624671809a37246581d28fe6b2c19e data/create/recipes/cut_veridium_brick_slab_recycling.json @@ -4352,6 +4351,7 @@ dfbef691643cead7111b3b1c51aabcda8419bc19 data/create/recipes/cut_veridium_brick_ db2ea87f3ec8924ba9e0b87cd6a6edeb93c0c2d8 data/create/recipes/cut_veridium_brick_stairs_from_stone_types_veridium_stonecutting.json 5e5c9fab7ba7143d206df7d8184742fb1a17c99c data/create/recipes/cut_veridium_brick_wall.json ed752a7f698e3ecbb5e4f848a78f8b3c7c6bf12e data/create/recipes/cut_veridium_brick_wall_from_stone_types_veridium_stonecutting.json +8ab3c640b57421a8c0341ab4ec5bade31376d059 data/create/recipes/cut_veridium_bricks_from_stone_types_veridium_stonecutting.json e0355543105e4ec9d672d2a050e70b5c198ea472 data/create/recipes/cut_veridium_from_stone_types_veridium_stonecutting.json fb3c671f64676538ea3aa96be483ac15b3cdeb3d data/create/recipes/cut_veridium_slab.json 7d7c80ac03ad8623f9a5d7f0ff0bb6f68985efa5 data/create/recipes/cut_veridium_slab_from_stone_types_veridium_stonecutting.json @@ -4537,7 +4537,6 @@ a157a43e7788d285b8d72eade5955369c9b9a1de data/create/recipes/rose_quartz_block_f 1268cc2bdd088d26b84fb4e481db27af61f94bd1 data/create/recipes/scorchia_pillar_from_stone_types_scorchia_stonecutting.json 2e8f4cdb3498547a5e6fe658bb33d4be5ce8f54b data/create/recipes/scoria_from_stone_types_scoria_stonecutting.json 770d3453c75f77b16db661f6e636892d3117690b data/create/recipes/scoria_pillar_from_stone_types_scoria_stonecutting.json -75dc56fcdcd6a10288f2d607bf6dcbbe10b35a64 data/create/recipes/small_andesite_bricks_from_stone_types_andesite_stonecutting.json 2e86fddc76285b4e380b845eb1150580b134d0ac data/create/recipes/small_andesite_brick_slab.json 311727e5c08ddbe0aa26275be74e9b83201ac8ab data/create/recipes/small_andesite_brick_slab_from_stone_types_andesite_stonecutting.json 2767e239c9d704b6bb5325b4f40e0aa0acdcdce1 data/create/recipes/small_andesite_brick_slab_recycling.json @@ -4545,7 +4544,7 @@ a157a43e7788d285b8d72eade5955369c9b9a1de data/create/recipes/rose_quartz_block_f 9e82896e00c1e14e514fac818e11e5b9ef5b10d7 data/create/recipes/small_andesite_brick_stairs_from_stone_types_andesite_stonecutting.json 5287d389b4954d954881d9f0293c52870bba88d0 data/create/recipes/small_andesite_brick_wall.json 1172ca76affd948c50b207124ee03c4f480f4ee8 data/create/recipes/small_andesite_brick_wall_from_stone_types_andesite_stonecutting.json -e3b69122b2cfe64b043384235eeb6d04f346e58b data/create/recipes/small_asurine_bricks_from_stone_types_asurine_stonecutting.json +75dc56fcdcd6a10288f2d607bf6dcbbe10b35a64 data/create/recipes/small_andesite_bricks_from_stone_types_andesite_stonecutting.json 9196a055491052afc14ed01667cccf2a0920e793 data/create/recipes/small_asurine_brick_slab.json f4cc3330837a647c098ccb24fbbbf583c3f960fc data/create/recipes/small_asurine_brick_slab_from_stone_types_asurine_stonecutting.json 063b2f0ad7e93698999922040132eb2b23661a38 data/create/recipes/small_asurine_brick_slab_recycling.json @@ -4553,7 +4552,7 @@ a85d2f957223f87ffa2c3f63cdf6f9f0f84bb921 data/create/recipes/small_asurine_brick c7cb218b0d8a1e358d593fc1fef82fc074289552 data/create/recipes/small_asurine_brick_stairs_from_stone_types_asurine_stonecutting.json 08d10ee57995e67ac1fb5feba04b03aee51dbe16 data/create/recipes/small_asurine_brick_wall.json 4c0aa6203295a36a6d7ffe9d7bf0973277162689 data/create/recipes/small_asurine_brick_wall_from_stone_types_asurine_stonecutting.json -07125218f9025833afa189fa0090f4d6b4660db0 data/create/recipes/small_calcite_bricks_from_stone_types_calcite_stonecutting.json +e3b69122b2cfe64b043384235eeb6d04f346e58b data/create/recipes/small_asurine_bricks_from_stone_types_asurine_stonecutting.json a72719de028ca9e07756dae6031af48525520fc2 data/create/recipes/small_calcite_brick_slab.json d8ebf6f1eb2e2372fb20def956398089adec5d13 data/create/recipes/small_calcite_brick_slab_from_stone_types_calcite_stonecutting.json ab4cfc2b34989d41a434781a3150ecd530c4f15b data/create/recipes/small_calcite_brick_slab_recycling.json @@ -4561,7 +4560,7 @@ c77a7700d978e23db14d947915591061dda8eab3 data/create/recipes/small_calcite_brick 4e066bfc60ea142d54ce939d025b6679ac9634ad data/create/recipes/small_calcite_brick_stairs_from_stone_types_calcite_stonecutting.json 64e53d8090fa26cc4cb62efea7c1615ff7f705c2 data/create/recipes/small_calcite_brick_wall.json 3ba736ae76249fa61692c13f7879af954f9bbd36 data/create/recipes/small_calcite_brick_wall_from_stone_types_calcite_stonecutting.json -a3309c81f84bf4fb78e9db2316fb758f9b2f8429 data/create/recipes/small_crimsite_bricks_from_stone_types_crimsite_stonecutting.json +07125218f9025833afa189fa0090f4d6b4660db0 data/create/recipes/small_calcite_bricks_from_stone_types_calcite_stonecutting.json 92cf7e99229c1e72405bb0875e6f939b3f5aea12 data/create/recipes/small_crimsite_brick_slab.json b993e081103c019b7b9b73b38ef8c408fb4500ac data/create/recipes/small_crimsite_brick_slab_from_stone_types_crimsite_stonecutting.json 7f6fa1fab65d910388f5f2ec4ee7d99cbda8df57 data/create/recipes/small_crimsite_brick_slab_recycling.json @@ -4569,7 +4568,7 @@ b993e081103c019b7b9b73b38ef8c408fb4500ac data/create/recipes/small_crimsite_bric 260da721849d1afd6f431d51538d1587ee3af8d5 data/create/recipes/small_crimsite_brick_stairs_from_stone_types_crimsite_stonecutting.json 093ac919f793111b442029198383a9de5b6df027 data/create/recipes/small_crimsite_brick_wall.json 8b8280a8282fa8718620ee3d69182e241a7852c0 data/create/recipes/small_crimsite_brick_wall_from_stone_types_crimsite_stonecutting.json -e7a3cb889ce6b530cd40f19e23bad943374e61b5 data/create/recipes/small_deepslate_bricks_from_stone_types_deepslate_stonecutting.json +a3309c81f84bf4fb78e9db2316fb758f9b2f8429 data/create/recipes/small_crimsite_bricks_from_stone_types_crimsite_stonecutting.json 022690548a46f5cc63adda3626824a81c6ebf490 data/create/recipes/small_deepslate_brick_slab.json 655be9ddf21dea2255fb2cb2628a5fee39eb10e2 data/create/recipes/small_deepslate_brick_slab_from_stone_types_deepslate_stonecutting.json d6d3db5604279cd402f64dbdeae7c3bee6d7ab78 data/create/recipes/small_deepslate_brick_slab_recycling.json @@ -4577,7 +4576,7 @@ d6d3db5604279cd402f64dbdeae7c3bee6d7ab78 data/create/recipes/small_deepslate_bri 0a458e8248fe395748bd6025d43c002db5a7d343 data/create/recipes/small_deepslate_brick_stairs_from_stone_types_deepslate_stonecutting.json 96e2c36ac2f2899c9681f12f43c8ae232ae09180 data/create/recipes/small_deepslate_brick_wall.json e5644f4227b9cc9b98158ce3ded98bff1ffb97f9 data/create/recipes/small_deepslate_brick_wall_from_stone_types_deepslate_stonecutting.json -38b80603a86df24f6be0df9fd5f7d9b7aa33d2f9 data/create/recipes/small_diorite_bricks_from_stone_types_diorite_stonecutting.json +e7a3cb889ce6b530cd40f19e23bad943374e61b5 data/create/recipes/small_deepslate_bricks_from_stone_types_deepslate_stonecutting.json 6c66b44941c8b97cfec5948b5d8b08355f8d8f67 data/create/recipes/small_diorite_brick_slab.json 801f6cc6e06db56344b37c9b76c69f921c6d9293 data/create/recipes/small_diorite_brick_slab_from_stone_types_diorite_stonecutting.json c1fe4bff306e2d2b5d5595e4b35dd85f7e6bf0ce data/create/recipes/small_diorite_brick_slab_recycling.json @@ -4585,7 +4584,7 @@ af6feedf00bdfa45c1b8f0dd46ddaa80da622fed data/create/recipes/small_diorite_brick 30a6f2bdfec2b3f578572c9f94112906411e7c54 data/create/recipes/small_diorite_brick_stairs_from_stone_types_diorite_stonecutting.json 8728b791808736de2ac31e8dc81aa43638ae0ac8 data/create/recipes/small_diorite_brick_wall.json 7a1fdcef7091d76230fbee410fa5241f584845c4 data/create/recipes/small_diorite_brick_wall_from_stone_types_diorite_stonecutting.json -8840d538648516dd02628fbe3ea4f032ceda78bb data/create/recipes/small_dripstone_bricks_from_stone_types_dripstone_stonecutting.json +38b80603a86df24f6be0df9fd5f7d9b7aa33d2f9 data/create/recipes/small_diorite_bricks_from_stone_types_diorite_stonecutting.json 39a545b60040bd2d922cd3bd5af5036b1b9b23ef data/create/recipes/small_dripstone_brick_slab.json c91e4dc211305456c38e5823def91811ad851202 data/create/recipes/small_dripstone_brick_slab_from_stone_types_dripstone_stonecutting.json 55bb37d07e841bb8eecf2013445c01c8e09ff824 data/create/recipes/small_dripstone_brick_slab_recycling.json @@ -4593,7 +4592,7 @@ c91e4dc211305456c38e5823def91811ad851202 data/create/recipes/small_dripstone_bri 1e23c8df90aef6cd3561369f72c6c3106da883f5 data/create/recipes/small_dripstone_brick_stairs_from_stone_types_dripstone_stonecutting.json fda46cc15c21e7843537df5b5331874fd7511e19 data/create/recipes/small_dripstone_brick_wall.json 336e47b35437ffea4bb86d34f94e6361b2bbcfb0 data/create/recipes/small_dripstone_brick_wall_from_stone_types_dripstone_stonecutting.json -42c74dec6c64d3675e15b2b73cb32fc9d24839e9 data/create/recipes/small_granite_bricks_from_stone_types_granite_stonecutting.json +8840d538648516dd02628fbe3ea4f032ceda78bb data/create/recipes/small_dripstone_bricks_from_stone_types_dripstone_stonecutting.json d1bb4e91d80ca8eb9c2f935cbb66ef08b9ca7059 data/create/recipes/small_granite_brick_slab.json ddb2f4652607b56332a927af939212a5789a34db data/create/recipes/small_granite_brick_slab_from_stone_types_granite_stonecutting.json f1388636bcf98d7d9103c23528053b28c6305b4e data/create/recipes/small_granite_brick_slab_recycling.json @@ -4601,7 +4600,7 @@ f1388636bcf98d7d9103c23528053b28c6305b4e data/create/recipes/small_granite_brick ba935a3d64eedbd9b7017d0abfab351f57589593 data/create/recipes/small_granite_brick_stairs_from_stone_types_granite_stonecutting.json dac22c54e8034587a3fcf3aa0ce19bb4b7607cd7 data/create/recipes/small_granite_brick_wall.json 7a8d9e2291675de9e72363d93410de9039216f32 data/create/recipes/small_granite_brick_wall_from_stone_types_granite_stonecutting.json -714f6a84a5b3d5d57c07364925555e6f545b0b3d data/create/recipes/small_limestone_bricks_from_stone_types_limestone_stonecutting.json +42c74dec6c64d3675e15b2b73cb32fc9d24839e9 data/create/recipes/small_granite_bricks_from_stone_types_granite_stonecutting.json b844632a588cb96397750f4387c7e6517f85092c data/create/recipes/small_limestone_brick_slab.json a1c0bc263cd4659a89213f4fcdd87eba7ae04427 data/create/recipes/small_limestone_brick_slab_from_stone_types_limestone_stonecutting.json ec9154a3791113f57dc1c16dfef4c837533b6fc6 data/create/recipes/small_limestone_brick_slab_recycling.json @@ -4609,7 +4608,7 @@ ec9154a3791113f57dc1c16dfef4c837533b6fc6 data/create/recipes/small_limestone_bri 6943fdc8162e4d53c459f425b2ff5b34e9caa477 data/create/recipes/small_limestone_brick_stairs_from_stone_types_limestone_stonecutting.json 27ff69345efea14b9688fe9b182809995ea8ad4a data/create/recipes/small_limestone_brick_wall.json 98a83f757f0ac9cc2a876ae407bb5765071e700d data/create/recipes/small_limestone_brick_wall_from_stone_types_limestone_stonecutting.json -22c69e391110280e13d50693b9c81355da57a315 data/create/recipes/small_ochrum_bricks_from_stone_types_ochrum_stonecutting.json +714f6a84a5b3d5d57c07364925555e6f545b0b3d data/create/recipes/small_limestone_bricks_from_stone_types_limestone_stonecutting.json abdd280694cb30ce0d2703aadeeb378af9a7f8b2 data/create/recipes/small_ochrum_brick_slab.json e37612fa2523fa3711242cac4ec5e596b3e55698 data/create/recipes/small_ochrum_brick_slab_from_stone_types_ochrum_stonecutting.json 8f3f47cb3e759104cf86a422339345f8795143d3 data/create/recipes/small_ochrum_brick_slab_recycling.json @@ -4617,8 +4616,8 @@ de8d7f8e57645c0b5a6e98eb0cc4e573c5cf96ac data/create/recipes/small_ochrum_brick_ 04ebbdd14f81f4b4dc7986cb5241caa9f48f4ff1 data/create/recipes/small_ochrum_brick_stairs_from_stone_types_ochrum_stonecutting.json 07876725f97ff611f8d1710462224f07cab3ebbd data/create/recipes/small_ochrum_brick_wall.json 2331801569ec95562afc802f7e2ff191d329a5c6 data/create/recipes/small_ochrum_brick_wall_from_stone_types_ochrum_stonecutting.json +22c69e391110280e13d50693b9c81355da57a315 data/create/recipes/small_ochrum_bricks_from_stone_types_ochrum_stonecutting.json 68a9f80b97d9322ed33067d7717180494b904bed data/create/recipes/small_rose_quartz_tiles_from_polished_rose_quartz_stonecutting.json -bf27af2e54ed1b09611d67ee7afa6c7f56d00d09 data/create/recipes/small_scorchia_bricks_from_stone_types_scorchia_stonecutting.json 133057778480e1d2e13fe7b2766ba0891feea3a5 data/create/recipes/small_scorchia_brick_slab.json dad342d215c98f3214752e0ebfaf3015943c5ac7 data/create/recipes/small_scorchia_brick_slab_from_stone_types_scorchia_stonecutting.json 0a57ad5fce22d69cdc1dd880403612ffb47af4ba data/create/recipes/small_scorchia_brick_slab_recycling.json @@ -4626,7 +4625,7 @@ dad342d215c98f3214752e0ebfaf3015943c5ac7 data/create/recipes/small_scorchia_bric 7f89c9c6dcea06a3022c72029a5e547aa1721773 data/create/recipes/small_scorchia_brick_stairs_from_stone_types_scorchia_stonecutting.json 43310b3fa43bd791ef0e2e30971a24e788c20139 data/create/recipes/small_scorchia_brick_wall.json de8edc4fa5eec031ad0a63c7f59141985ae9af9e data/create/recipes/small_scorchia_brick_wall_from_stone_types_scorchia_stonecutting.json -b1a67d052e26c2129c34ee0732cfe533beb3e571 data/create/recipes/small_scoria_bricks_from_stone_types_scoria_stonecutting.json +bf27af2e54ed1b09611d67ee7afa6c7f56d00d09 data/create/recipes/small_scorchia_bricks_from_stone_types_scorchia_stonecutting.json d8a41adcc6ae9b0eb71a83b2dd89ff92a10e0057 data/create/recipes/small_scoria_brick_slab.json 34f4dd094f2949e3fd21f95ac890ae803b81fbea data/create/recipes/small_scoria_brick_slab_from_stone_types_scoria_stonecutting.json f15ad1cb05f5b02b630b982d23bd951178a3650c data/create/recipes/small_scoria_brick_slab_recycling.json @@ -4634,7 +4633,7 @@ df5a1437fb112519d904cc9f1cd28d5d891fb04d data/create/recipes/small_scoria_brick_ d36428daf8bf4e560f649e5eb40a8cd7a27e7a0e data/create/recipes/small_scoria_brick_stairs_from_stone_types_scoria_stonecutting.json cad432398d8886d60b94e96b2c2096ae27fffb50 data/create/recipes/small_scoria_brick_wall.json 9cff8370aaa81ece466fe15642c00a9992bd416c data/create/recipes/small_scoria_brick_wall_from_stone_types_scoria_stonecutting.json -e51ced16059f7c37fe3652a1cf4d938f91e956fc data/create/recipes/small_tuff_bricks_from_stone_types_tuff_stonecutting.json +b1a67d052e26c2129c34ee0732cfe533beb3e571 data/create/recipes/small_scoria_bricks_from_stone_types_scoria_stonecutting.json dd83af4a10a9b0ba6a4efb272d8b6b1611524a39 data/create/recipes/small_tuff_brick_slab.json e3a12b87830e47387e9ac118bb3d12b73558d757 data/create/recipes/small_tuff_brick_slab_from_stone_types_tuff_stonecutting.json 85dff00dc49eaf65f1f149a7f21a9f307b1b9710 data/create/recipes/small_tuff_brick_slab_recycling.json @@ -4642,7 +4641,7 @@ e03a8270b01b9a5cad238db4ce2b8f66ea78e8bf data/create/recipes/small_tuff_brick_st cd50bb5842c90038f6ac74e45971ab2e914d1463 data/create/recipes/small_tuff_brick_stairs_from_stone_types_tuff_stonecutting.json e795fbe5062ec47cc660ee26c8398477509c5f18 data/create/recipes/small_tuff_brick_wall.json 34471a7ebb431b6d1e3be5fa480b800b96556fee data/create/recipes/small_tuff_brick_wall_from_stone_types_tuff_stonecutting.json -82f17edc61a319c74dbdfa730584305899bd7572 data/create/recipes/small_veridium_bricks_from_stone_types_veridium_stonecutting.json +e51ced16059f7c37fe3652a1cf4d938f91e956fc data/create/recipes/small_tuff_bricks_from_stone_types_tuff_stonecutting.json f9a2f4ca078364e05b3446fe890ea207e5a56e87 data/create/recipes/small_veridium_brick_slab.json 234c3baee4c9428caab3e344f396ec87064103e3 data/create/recipes/small_veridium_brick_slab_from_stone_types_veridium_stonecutting.json b0db8335e3c7fd88f074c3895bea952efc0e8df8 data/create/recipes/small_veridium_brick_slab_recycling.json @@ -4650,6 +4649,7 @@ a1e214c230574526ca0a2fec059b4157ddec557d data/create/recipes/small_veridium_bric f63031587a64ed88ddba1df07767dd8d8caa1d2e data/create/recipes/small_veridium_brick_stairs_from_stone_types_veridium_stonecutting.json 9b003fbf2bcd975501ba307ea68c6c4bab397683 data/create/recipes/small_veridium_brick_wall.json 1ba48c5cae05b6f4b1ad223ce80925f1eaaf5dfd data/create/recipes/small_veridium_brick_wall_from_stone_types_veridium_stonecutting.json +82f17edc61a319c74dbdfa730584305899bd7572 data/create/recipes/small_veridium_bricks_from_stone_types_veridium_stonecutting.json 47973044b19b35ce169e7d46abc9d11a2f67a487 data/create/recipes/spruce_window.json 810544f79bf4b002981e614eaa8e49b48a7b5397 data/create/recipes/spruce_window_pane.json e343a80c92dab60f99c9b441d00189aceee477a0 data/create/recipes/tiled_glass_from_glass_colorless_stonecutting.json @@ -4711,6 +4711,7 @@ c9ae54a7510073b17edf82f7591e14bdb2c51837 data/create/tags/fluids/fan_processing_ 35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/create/tags/items/blaze_burner_fuel/regular.json 8ba98bf390a326abeebfd5d84be5f740c935a8b6 data/create/tags/items/blaze_burner_fuel/special.json 8b6c0b444b15f7fb2d55b9cbcb68537c1269f877 data/create/tags/items/casing.json +3e65a1f943cae7927da2f45388efe248474e5397 data/create/tags/items/chain_rideable.json f43cac8216e2a9347e48cf93a43de95dd810ca20 data/create/tags/items/contraption_controlled.json d371dfd35e49a7bef19f59c03e7f4ae20992f03d data/create/tags/items/create_ingots.json 910d0f5ccbc4c84b224eca1f1588b1695f41447b data/create/tags/items/crushed_raw_materials.json diff --git a/src/generated/resources/data/create/tags/items/chain_rideable.json b/src/generated/resources/data/create/tags/items/chain_rideable.json new file mode 100644 index 0000000000..5cb6cb4b6e --- /dev/null +++ b/src/generated/resources/data/create/tags/items/chain_rideable.json @@ -0,0 +1,5 @@ +{ + "values": [ + "#forge:tools/wrench" + ] +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllTags.java b/src/main/java/com/simibubi/create/AllTags.java index 06b9325478..c8e51aa3de 100644 --- a/src/main/java/com/simibubi/create/AllTags.java +++ b/src/main/java/com/simibubi/create/AllTags.java @@ -25,6 +25,7 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.Fluid; import net.minecraft.world.level.material.FluidState; + import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.IForgeRegistry; @@ -185,6 +186,7 @@ public class AllTags { SLEEPERS, TOOLBOXES, PACKAGES, + CHAIN_RIDEABLE, TRACKS, UPRIGHT_ON_BELT, VALVE_HANDLES, diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRidingHandler.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRidingHandler.java index 4efd53ab27..883caa0da0 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRidingHandler.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRidingHandler.java @@ -46,7 +46,7 @@ public class ChainConveyorRidingHandler { Minecraft mc = Minecraft.getInstance(); if (mc.isPaused()) return; - if (!AllItemTags.WRENCH.matches(mc.player.getMainHandItem())) { + if (!AllItemTags.CHAIN_RIDEABLE.matches(mc.player.getMainHandItem())) { stopRiding(); return; } diff --git a/src/main/java/com/simibubi/create/infrastructure/data/CreateRegistrateTags.java b/src/main/java/com/simibubi/create/infrastructure/data/CreateRegistrateTags.java index 986309bb66..34e68c9598 100644 --- a/src/main/java/com/simibubi/create/infrastructure/data/CreateRegistrateTags.java +++ b/src/main/java/com/simibubi/create/infrastructure/data/CreateRegistrateTags.java @@ -25,6 +25,7 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.material.Fluid; import net.minecraft.world.level.material.Fluids; + import net.minecraftforge.common.Tags; public class CreateRegistrateTags { @@ -146,6 +147,9 @@ public class CreateRegistrateTags { private static void genItemTags(RegistrateTagsProvider provIn) { CreateTagsProvider prov = new CreateTagsProvider<>(provIn, Item::builtInRegistryHolder); + prov.tag(AllItemTags.CHAIN_RIDEABLE.tag) + .addTag(AllItemTags.WRENCH.tag); + prov.tag(AllItemTags.PULPIFIABLE.tag) .add(Items.BAMBOO, Items.SUGAR_CANE) .addTag(ItemTags.SAPLINGS); @@ -193,7 +197,8 @@ public class CreateRegistrateTags { genStrippedWoodItemTags(prov); - prov.tag(AllItemTags.CURIOS_HEAD.tag).add(AllItems.GOGGLES.get()); + prov.tag(AllItemTags.CURIOS_HEAD.tag) + .add(AllItems.GOGGLES.get()); TagGen.addOptional(prov.tag(AllItemTags.ALLURITE.tag), Mods.GS, gsPalette("allurite")); From 5e3a4ed862e822b647b2169dad9f250d16554871 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Tue, 21 Jan 2025 17:52:36 +0100 Subject: [PATCH 344/515] Turn it up - Boost some of the new sounds - Metal table cloths are now called table cover --- .../resources/assets/create/lang/en_ud.json | 6 +++--- .../resources/assets/create/lang/en_us.json | 6 +++--- .../java/com/simibubi/create/AllBlocks.java | 3 +++ .../com/simibubi/create/AllSoundEvents.java | 2 +- .../factoryBoard/FactoryPanelBlockEntity.java | 5 +++++ .../packagePort/frogport/FrogportSounds.java | 2 +- .../packager/PackagerBlockEntity.java | 2 +- .../packagerLink/PackagerLinkBlockEntity.java | 2 +- .../RedstoneRequesterBlockEntity.java | 2 +- .../assets/create/sounds/frogport_catch.ogg | Bin 9435 -> 9433 bytes .../assets/create/sounds/frogport_catch_1.ogg | Bin 8916 -> 9251 bytes .../assets/create/sounds/frogport_catch_2.ogg | Bin 9049 -> 9507 bytes .../assets/create/sounds/frogport_catch_3.ogg | Bin 9288 -> 9230 bytes .../assets/create/sounds/frogport_close.ogg | Bin 5885 -> 4989 bytes .../assets/create/sounds/stock_link.ogg | Bin 7213 -> 7237 bytes 15 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 5e91f96cc3..93c372f8ce 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -219,7 +219,7 @@ "block.create.andesite_ladder": "ɹǝppɐꞀ ǝʇısǝpuⱯ", "block.create.andesite_pillar": "ɹɐןןıԀ ǝʇısǝpuⱯ", "block.create.andesite_scaffolding": "buıpןoɟɟɐɔS ǝʇısǝpuⱯ", - "block.create.andesite_table_cloth": "ɥʇoןƆ ǝןqɐ⟘ ǝʇısǝpuⱯ", + "block.create.andesite_table_cloth": "ɹǝʌoƆ ǝןqɐ⟘ ǝʇısǝpuⱯ", "block.create.andesite_tunnel": "ןǝuun⟘ ǝʇısǝpuⱯ", "block.create.asurine": "ǝuıɹnsⱯ", "block.create.asurine_pillar": "ɹɐןןıԀ ǝuıɹnsⱯ", @@ -256,7 +256,7 @@ "block.create.brass_funnel": "ןǝuunℲ ssɐɹᗺ", "block.create.brass_ladder": "ɹǝppɐꞀ ssɐɹᗺ", "block.create.brass_scaffolding": "buıpןoɟɟɐɔS ssɐɹᗺ", - "block.create.brass_table_cloth": "ɥʇoןƆ ǝןqɐ⟘ ssɐɹᗺ", + "block.create.brass_table_cloth": "ɹǝʌoƆ ǝןqɐ⟘ ssɐɹᗺ", "block.create.brass_tunnel": "ןǝuun⟘ ssɐɹᗺ", "block.create.brown_nixie_tube": "ǝqn⟘ ǝıxıN uʍoɹᗺ", "block.create.brown_postbox": "xoqʇsoԀ uʍoɹᗺ", @@ -296,7 +296,7 @@ "block.create.copper_shingle_slab": "qɐןS ǝןbuıɥS ɹǝddoƆ", "block.create.copper_shingle_stairs": "sɹıɐʇS ǝןbuıɥS ɹǝddoƆ", "block.create.copper_shingles": "sǝןbuıɥS ɹǝddoƆ", - "block.create.copper_table_cloth": "ɥʇoןƆ ǝןqɐ⟘ ɹǝddoƆ", + "block.create.copper_table_cloth": "ɹǝʌoƆ ǝןqɐ⟘ ɹǝddoƆ", "block.create.copper_tile_slab": "qɐןS ǝןı⟘ ɹǝddoƆ", "block.create.copper_tile_stairs": "sɹıɐʇS ǝןı⟘ ɹǝddoƆ", "block.create.copper_tiles": "sǝןı⟘ ɹǝddoƆ", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 6d17309831..067377ab2b 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -219,7 +219,7 @@ "block.create.andesite_ladder": "Andesite Ladder", "block.create.andesite_pillar": "Andesite Pillar", "block.create.andesite_scaffolding": "Andesite Scaffolding", - "block.create.andesite_table_cloth": "Andesite Table Cloth", + "block.create.andesite_table_cloth": "Andesite Table Cover", "block.create.andesite_tunnel": "Andesite Tunnel", "block.create.asurine": "Asurine", "block.create.asurine_pillar": "Asurine Pillar", @@ -256,7 +256,7 @@ "block.create.brass_funnel": "Brass Funnel", "block.create.brass_ladder": "Brass Ladder", "block.create.brass_scaffolding": "Brass Scaffolding", - "block.create.brass_table_cloth": "Brass Table Cloth", + "block.create.brass_table_cloth": "Brass Table Cover", "block.create.brass_tunnel": "Brass Tunnel", "block.create.brown_nixie_tube": "Brown Nixie Tube", "block.create.brown_postbox": "Brown Postbox", @@ -296,7 +296,7 @@ "block.create.copper_shingle_slab": "Copper Shingle Slab", "block.create.copper_shingle_stairs": "Copper Shingle Stairs", "block.create.copper_shingles": "Copper Shingles", - "block.create.copper_table_cloth": "Copper Table Cloth", + "block.create.copper_table_cloth": "Copper Table Cover", "block.create.copper_tile_slab": "Copper Tile Slab", "block.create.copper_tile_stairs": "Copper Tile Stairs", "block.create.copper_tiles": "Copper Tiles", diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 2464678621..503ed8b76f 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -1994,6 +1994,7 @@ public class AllBlocks { .recipe((c, p) -> p.stonecutting(DataIngredient.items(AllItems.ANDESITE_ALLOY.get()), RecipeCategory.DECORATIONS, c::get, 2)) .transform(pickaxeOnly()) + .lang("Andesite Table Cover") .register(); public static final BlockEntry BRASS_TABLE_CLOTH = @@ -2004,6 +2005,7 @@ public class AllBlocks { .recipe((c, p) -> p.stonecutting(DataIngredient.tag(AllTags.forgeItemTag("ingots/brass")), RecipeCategory.DECORATIONS, c::get, 2)) .transform(pickaxeOnly()) + .lang("Brass Table Cover") .register(); public static final BlockEntry COPPER_TABLE_CLOTH = @@ -2013,6 +2015,7 @@ public class AllBlocks { .recipe((c, p) -> p.stonecutting(DataIngredient.tag(AllTags.forgeItemTag("ingots/copper")), RecipeCategory.DECORATIONS, c::get, 2)) .transform(pickaxeOnly()) + .lang("Copper Table Cover") .register(); public static final BlockEntry DISPLAY_LINK = diff --git a/src/main/java/com/simibubi/create/AllSoundEvents.java b/src/main/java/com/simibubi/create/AllSoundEvents.java index eb4a0eb964..ec9daeb21c 100644 --- a/src/main/java/com/simibubi/create/AllSoundEvents.java +++ b/src/main/java/com/simibubi/create/AllSoundEvents.java @@ -65,7 +65,7 @@ public class AllSoundEvents { .build(), PACKAGER = create("packager").subtitle("Packager packages") - .playExisting(SoundEvents.SHULKER_OPEN, 0.125f, 0.75f) + .playExisting(SoundEvents.SHULKER_OPEN, 0.5f, 0.75f) .category(SoundSource.BLOCKS) .build(), diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java index 7755dde83c..16a4a64236 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java @@ -46,6 +46,11 @@ public class FactoryPanelBlockEntity extends SmartBlockEntity { super(type, pos, state); restocker = false; } + + @Override + protected AABB createRenderBoundingBox() { + return new AABB(worldPosition).inflate(8); + } @Override public void addBehaviours(List behaviours) { diff --git a/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportSounds.java b/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportSounds.java index f7518a69eb..a509e840f5 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportSounds.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagePort/frogport/FrogportSounds.java @@ -10,7 +10,7 @@ import net.minecraft.world.phys.Vec3; public class FrogportSounds { public void open(Level level, BlockPos pos) { - AllSoundEvents.FROGPORT_OPEN.playAt(level, Vec3.atCenterOf(pos), 0.125f, 1, false); + AllSoundEvents.FROGPORT_OPEN.playAt(level, Vec3.atCenterOf(pos), 0.5f, 1, false); } public void close(Level level, BlockPos pos) { diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java index 475282096d..3d0b3e4c02 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java @@ -143,7 +143,7 @@ public class PackagerBlockEntity extends SmartBlockEntity { if (animationTicks == CYCLE - (animationInward ? 5 : 1)) AllSoundEvents.PACKAGER.playAt(level, worldPosition, 1, 1, true); if (animationTicks == (animationInward ? 1 : 5)) - level.playLocalSound(worldPosition, SoundEvents.IRON_TRAPDOOR_CLOSE, SoundSource.BLOCKS, 0.075f, 0.75f, + level.playLocalSound(worldPosition, SoundEvents.IRON_TRAPDOOR_CLOSE, SoundSource.BLOCKS, 0.25f, 0.75f, true); } diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java index 922e15770d..821f416aa9 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/PackagerLinkBlockEntity.java @@ -53,7 +53,7 @@ public class PackagerLinkBlockEntity extends LinkWithBulbBlockEntity { } public void playEffect() { - AllSoundEvents.STOCK_LINK.playAt(level, worldPosition, 1.0f, 1.0f, false); + AllSoundEvents.STOCK_LINK.playAt(level, worldPosition, 0.75f, 1.25f, false); Vec3 vec3 = Vec3.atCenterOf(worldPosition); BlockState state = getBlockState(); diff --git a/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlockEntity.java index 6417ddc894..4d7a01a2b4 100644 --- a/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterBlockEntity.java @@ -135,10 +135,10 @@ public class RedstoneRequesterBlockEntity extends StockCheckingBlockEntity imple } public void playEffect(boolean success) { - AllSoundEvents.STOCK_LINK.playAt(level, worldPosition, 1.0f, 1.0f, false); Vec3 vec3 = Vec3.atCenterOf(worldPosition); if (success) { AllSoundEvents.CONFIRM.playAt(level, worldPosition, 0.5f, 1.5f, false); + AllSoundEvents.STOCK_LINK.playAt(level, worldPosition, 1.0f, 1.0f, false); level.addParticle(new WiFiParticle.Data(), vec3.x, vec3.y, vec3.z, 1, 1, 1); } else { AllSoundEvents.DENY.playAt(level, worldPosition, 0.5f, 1, false); diff --git a/src/main/resources/assets/create/sounds/frogport_catch.ogg b/src/main/resources/assets/create/sounds/frogport_catch.ogg index 92783f48a1fd2cb609e3716a52cee8c3f33f95e7..c724df6f623b35345c9f10a8e7c94dc38a68aa8b 100644 GIT binary patch delta 5540 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 delta 5522 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 USvyYNYA~t-z;OV-Z74vs28$6+fdBvi diff --git a/src/main/resources/assets/create/sounds/frogport_catch_1.ogg b/src/main/resources/assets/create/sounds/frogport_catch_1.ogg index 90737e4de7336f2d11cd96047c10014cbd428cf8..50d40000d3fa120c5f59231c9cfc6ee264a59e2b 100644 GIT binary patch delta 5308 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%0D!Rub&)H$ diff --git a/src/main/resources/assets/create/sounds/frogport_catch_2.ogg b/src/main/resources/assets/create/sounds/frogport_catch_2.ogg index 2f674e5050497a39dd764a04f42d264801ba2a7e..faec92c46ce3a4955c2a7e24b60f9326184faab8 100644 GIT binary patch delta 5602 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 N@|9?E*mFy6@P8_DC)fZ0 delta 5123 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 d1Xz0lJH@dXZ$7+_#d1=H+BF3 diff --git a/src/main/resources/assets/create/sounds/frogport_catch_3.ogg b/src/main/resources/assets/create/sounds/frogport_catch_3.ogg index be2c118849b722f569ef50c183a09ea97c8d8998..059eb72fae012b83c503821947e83f6013d6c17b 100644 GIT binary patch delta 5268 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 delta 5327 zcmV;=6foS00000008lxXIhaOE(|q100031007vO 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 diff --git a/src/main/resources/assets/create/sounds/stock_link.ogg b/src/main/resources/assets/create/sounds/stock_link.ogg index a7b203ccde934a91e8c7910684c0c242c50f3fef..0a509e0189e86e2d02a71917f552c548db063559 100644 GIT binary patch delta 3302 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 delta 3236 zcmV;V3|sTXIITDuPiJRS00IC2000000031^00000003217_yNXE(}#p0003100583 zz#g$w6%T(^P5=M`0002R9HX)kB+k&%%fY$F$kEZl&C|%otNa8>2AT22^X8U-kw6Sl zT&EnpF%Vd{Tw}_*Gy8wpoy30(2fAfM`Xwo~^h6%4M#}^2>GhQ87(xeCmH441(b`b} zu-0L1GE~yHdnRX;ytUo_{oKT%>Rb1+8@W)<{Of-&x=xEHsT=ljBolo&tgN(E@kf?P2K;LZ|}AFS^vLo4Yz_<$W6n4aoy7;uvMtyDxMi$>*c!q!S<4L&tpOfp98&-L*cRB@Q-s@(MaelvMjOLbfqOCjq9X2V`Z2K9 zxHoNaL+dZ}~KlX0^NXE?6dAOVU^5uRFQ|Bjh{%okBzC-|4SCc@6NpE3okc{1SRO)Ge?v#}8 zqSDR2wl^I|{ARv%jmAWc12J*phZ1bo9sqxVf&no zWafT~pn2Kn0>h?)alb^}&B?5MfaiH>6--~?*`9h=qv3G=?MG$V$G}hsj+V@8{QSANHMb+4j4-Ho23zIG z;W}&4kr*f7&2!YfTZnC}=g80n&~d2P*z2Nl*+A&-Wz1f1AUHwf%O7xCI%Jd}eigje zf1Pt24hyX^+U(?ux1&~aZ4uo{c6M0%omDrjSxXhxmHAx-P=#Kc(j$;!>-Ld6>1L3Z z`O8d@dIAOBxh(GAc~QV%`FNzx@qmURz*ueKmv%xi0A%|NDrhQKS;hNj}Sk+NTA?gVU}jrS~bU&uBzdx|-Nk@_rUp3vOQ$bwXPyR|QrmdOAX^#t)YB(kFC3e-F9? zeu;GE-#~)cShqY@*P{S!O$Dm}lM8Xo-JSL;8<^l&~=e|LMqnudbA zE#B2=rI}dde@A1T_>#PnJ4lyZ+d6oE5% zB0}k#1DF=adtLJu@P44V*J}O%;_ZQ9P)IWGNK+6xDaoi?6114HDIaI=v*o*bHTV2% z{bLg{$KOBR$W~_X-H&o0e~gRddzDG=3qPr@PP>_O6-sXKldO=CU)UFI>i%8;-e*MU z-yj3T!&c1sZLHDQ2#jGl(TSg!C@A0)^V63PKbX((we|Lk`&(^q1|6s^A$i&IB)83b zG8xy&TQ8hsC`m9YgiXnOL%mLR+!Zb77-s=QG(A*qGbEYLRJR*wMl!w(0+mmZ3hQxR z59eTZDF@!Fnne`=R^*;*y5s_FI*pzk_2)w_>CMS#^|GsYXzX^-FfOZgPyEA^ZoA+b ze1IChe?5wmYZo1VXZ4okc@D0!wZY{h7+XIk!c&?R z1pqS+9JQ}Q|Cmz$BNdFTF8T=J>eu?W{?xb*C4*Bjq1E?!VDLg z;Y-72DH;NL#1#`7Of`fqY=j!febey{7+yfi2qacc9^&Y5n6_VqP~a8VOot_)({bti)lnfEi+nD@ zi~Oj~*f+mKAXPdNzGWoH4@r0^h__Uq6)T6>RHM^jGL^F{k>%(F1pxP_>B(cWZf(gP zpKN~qI@b99Eo~aTl?ug6P--2f2%YvcZ+r)*)v6lSL{VPCcvt8eu;yS(no+bxKX#Zc zO+cW3Nmlkd=hBpi^U?;91W%fsTUM(+nDd*S+MrQDHEV~?58aJPMCN?g@zZ8F&Mzs2 z-KqFxs(;C+RXR+EP73cHi782!9*)lSm+nj;#?s3DGa8Z zrT?r7SNt&2LGmBun}MJTo@J!wCNW=0zm>y(*3F@vHV-hC-$vh%QD_PPs{MiK`q#XD zvuQ6)=Jm~fu>QGp#j|d*G8)ak48g-us58K_E!Gm;h*XD7=QJ0&CJ)A5}eKeoe6*XNGSwa)C1G-dyliy#D?Dsm7R_+cjyXkf)!Js!b-0JUIoy+X) zX$|+JZ($^*_~~P)XPK=g>?S08Ve0kok`ng-$B87%r^FCQA?fwJoZJGh!H|d|;>#JSRuxfVXI2^)$*J|!(%E0csNVkIB!wsZ=X}y>6 zFOve^Wqe=eZ(#ty0k|qCImy|4D!L-zM=GV~o!>i+Z*S zU|6mmN)M#qk{LjZ{YcfV=Rjt=?0eC%Y zg|!Ku2}_$y;hCnU@!P_5AFf_~H7Rll*!H WFyTKuKL7w95060xa6gyh3 Date: Tue, 21 Jan 2025 14:25:12 -0500 Subject: [PATCH 345/515] A terrible view --- .../create/content/logistics/box/PackageStyles.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageStyles.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageStyles.java index d1f7bea35b..9493390d06 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageStyles.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageStyles.java @@ -4,15 +4,15 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; +import org.jetbrains.annotations.ApiStatus.Internal; +import org.jetbrains.annotations.Unmodifiable; + import com.google.common.collect.ImmutableList; import com.simibubi.create.Create; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; -import org.jetbrains.annotations.ApiStatus.Internal; -import org.jetbrains.annotations.UnmodifiableView; - public class PackageStyles { public record PackageStyle(String type, int width, int height, float riggingOffset, boolean rare) { public ResourceLocation getItemId() { @@ -33,7 +33,7 @@ public class PackageStyles { * and use the PackageItem class so your packages end up in the correct lists. */ @Internal - @UnmodifiableView + @Unmodifiable public static final List STYLES = ImmutableList.of( new PackageStyle("cardboard", 12, 12, 23f, false), new PackageStyle("cardboard", 10, 12, 22f, false), From 9ab45928eb2f3f9bcc336321d00bb0f3f31200b5 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Wed, 22 Jan 2025 12:27:35 +0100 Subject: [PATCH 346/515] Playtest bugs - Display links on 'combine item names' now read a packages' address rather than their name - Fixed goggles in curio slot not rotating correctly when riding chain conveyors - Fixed incorrect yaw of package visuals - Fixed entity name display source not working for players on signs - Fixed price tag not working when table cloth is not on a full block - Redstone Requesters no longer have wooden material properties --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 756 +++++++++--------- .../minecraft/tags/blocks/mineable/axe.json | 1 - .../java/com/simibubi/create/AllBlocks.java | 4 +- .../compat/curios/GogglesCurioRenderer.java | 1 + .../content/logistics/box/PackageVisual.java | 2 +- .../tableCloth/TableClothBlockEntity.java | 75 +- .../source/EntityNameDisplaySource.java | 3 +- .../source/ItemNameDisplaySource.java | 10 +- .../behaviour/ValueSettingsInputHandler.java | 3 +- 9 files changed, 420 insertions(+), 435 deletions(-) diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index ab0b5cd762..5f04078f56 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2025-01-21T11:34:55.158385 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2025-01-22T12:22:55.6799395 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -83,13 +83,13 @@ b5170d754ce5f07ea2b4646eb07c099c50bae249 assets/create/blockstates/clipboard.jso f7254f20f91e2f1295e36d2e70390d43f3952d07 assets/create/blockstates/copper_door.json 736777de0eb038ff1ef9e8fe9d04c23d80239eda assets/create/blockstates/copper_ladder.json df3103dfc1c3ba7a9573229d009cb0de4925df16 assets/create/blockstates/copper_scaffolding.json +4d3d29e8a74bf103da39e76a1466b03eb5dcf916 assets/create/blockstates/copper_shingles.json 1ea8fdb990f8cda1762ab69ac38ea3161a835227 assets/create/blockstates/copper_shingle_slab.json 7c35bb802099d6bb5d92eafd8cbb7ea146979a2e assets/create/blockstates/copper_shingle_stairs.json -4d3d29e8a74bf103da39e76a1466b03eb5dcf916 assets/create/blockstates/copper_shingles.json 5c5ba06bf5b0a2c57d0aa42e85880f36d9694a78 assets/create/blockstates/copper_table_cloth.json +9a9f03140a57a7a8903d3e1b159bdc052566a6ec assets/create/blockstates/copper_tiles.json 7db7a0d81887091ca889f40bb8a508d3098c5164 assets/create/blockstates/copper_tile_slab.json c0b7eca017242913d156e4623147add0d03574f6 assets/create/blockstates/copper_tile_stairs.json -9a9f03140a57a7a8903d3e1b159bdc052566a6ec assets/create/blockstates/copper_tiles.json ef3ccb2d8b03f5a972b053a15bb037f8db6af17c assets/create/blockstates/copper_valve_handle.json 4758bed22fb6fe18213f463bc055775c1909e858 assets/create/blockstates/copycat_bars.json 4789c857508452aede1cb7389187b99ce2d7bf62 assets/create/blockstates/copycat_base.json @@ -106,114 +106,114 @@ c9a2c3a7971c46957d0f07c6d94d76f59da54a0b assets/create/blockstates/crushing_whee 4b0e51a1c10685f7d432467339afc9c2e24793b0 assets/create/blockstates/crushing_wheel_controller.json ba9c3ecfacbd398048440d247decffeaefc714b5 assets/create/blockstates/cuckoo_clock.json 1f6d84cba69062a1989d671c9c97317e2c2455b6 assets/create/blockstates/cut_andesite.json +cc62a6499ce8dcfc5e8695f0e8bb3c3d67f41efc assets/create/blockstates/cut_andesite_bricks.json 50d88f806122818af2ffecbd514d13ebbd21e4c9 assets/create/blockstates/cut_andesite_brick_slab.json 32d801225ea18209792921fa91618ed41794dbd0 assets/create/blockstates/cut_andesite_brick_stairs.json 3bf8204bf8c7c5b7b3c388fbc3478bb2d7c47129 assets/create/blockstates/cut_andesite_brick_wall.json -cc62a6499ce8dcfc5e8695f0e8bb3c3d67f41efc assets/create/blockstates/cut_andesite_bricks.json 34e89a828f14383c6115954a235b19851b74f277 assets/create/blockstates/cut_andesite_slab.json 49d58ae14544d89305ddc707cf7f6a81998200fa assets/create/blockstates/cut_andesite_stairs.json 1cc235cb6c388324793ac40f7bf89df8b048faac assets/create/blockstates/cut_andesite_wall.json 13ea54a4b9b89e576879a6e23a029c6341b7c098 assets/create/blockstates/cut_asurine.json +51c22c0547ab8ed2564890afb8733bbe356899f5 assets/create/blockstates/cut_asurine_bricks.json cf09de38f826fe000c5efe5afe56cf746125691d assets/create/blockstates/cut_asurine_brick_slab.json 1835482d5e9a59f2214336a63b12c7132ad815b4 assets/create/blockstates/cut_asurine_brick_stairs.json c48ab37bf7a2aba676af281d29cb6a2103c72fba assets/create/blockstates/cut_asurine_brick_wall.json -51c22c0547ab8ed2564890afb8733bbe356899f5 assets/create/blockstates/cut_asurine_bricks.json 1523a57124239a99da0b12a6b435c09d3d4276a5 assets/create/blockstates/cut_asurine_slab.json cc1acf5e118f1b1e78c5bb291176008960794d59 assets/create/blockstates/cut_asurine_stairs.json 139640bf41070e8eeb48647319eee54bb6804692 assets/create/blockstates/cut_asurine_wall.json 06b8c5cf98366608c480a37e6944d0d668bc8983 assets/create/blockstates/cut_calcite.json +979c70e35d806f1f63fe3381f27d881a17f9f6be assets/create/blockstates/cut_calcite_bricks.json a8f83cb8e1eae587f4e11e37c4cd3d0a1bbef377 assets/create/blockstates/cut_calcite_brick_slab.json 1eabb2e485aa323d317fa9648be02c12556593b7 assets/create/blockstates/cut_calcite_brick_stairs.json a0a33df71c5d26344a7bb0dd7a4622c30cc7825f assets/create/blockstates/cut_calcite_brick_wall.json -979c70e35d806f1f63fe3381f27d881a17f9f6be assets/create/blockstates/cut_calcite_bricks.json e3ddaae92b52cc3ea230088ff23260b5c5c93017 assets/create/blockstates/cut_calcite_slab.json 80c5249eaf9504c743c427fdd1a2c7bfa0f3d48f assets/create/blockstates/cut_calcite_stairs.json b4bbdb08d8114b6741546a0418cb54d645481c02 assets/create/blockstates/cut_calcite_wall.json 449f5180c72a028393afdac55a34e59862728224 assets/create/blockstates/cut_crimsite.json +25d731077a131d03347296c38c76b547194a6320 assets/create/blockstates/cut_crimsite_bricks.json d2c8a3580d3578c8afe44b94d4448be3680dbdeb assets/create/blockstates/cut_crimsite_brick_slab.json a3d9d2190a23b881dd3a7538ab248e0b0a3efa8e assets/create/blockstates/cut_crimsite_brick_stairs.json 3791c00ed477c0aaf7c5a20803a89dfc0e20f013 assets/create/blockstates/cut_crimsite_brick_wall.json -25d731077a131d03347296c38c76b547194a6320 assets/create/blockstates/cut_crimsite_bricks.json c9f19e7a976a7428b3dd58f45d734700ca1a18cd assets/create/blockstates/cut_crimsite_slab.json 1b8d4ac53dc5823083c2af605165a05b73c9ff79 assets/create/blockstates/cut_crimsite_stairs.json 484f9253ed92e963f398973a99fbeacb67ba1188 assets/create/blockstates/cut_crimsite_wall.json c4e95ceb7914da09ebe42d539bf5d976a3d70972 assets/create/blockstates/cut_deepslate.json +75d4ef863cd85d8f3df78226177966954e02ee2b assets/create/blockstates/cut_deepslate_bricks.json e1dc99a48b9066732fc5c62071c5ead16f34f438 assets/create/blockstates/cut_deepslate_brick_slab.json dbb2eddaf1d4ae3e687beb611552ea4283a1e7d8 assets/create/blockstates/cut_deepslate_brick_stairs.json 91c1f3da848503067c64b966ddda22ab91ff8fd5 assets/create/blockstates/cut_deepslate_brick_wall.json -75d4ef863cd85d8f3df78226177966954e02ee2b assets/create/blockstates/cut_deepslate_bricks.json 593198ffd37eae124a8366ae1d4a40b682788f92 assets/create/blockstates/cut_deepslate_slab.json f8cd1f9002ed8593ab71af9cfb7f962625994108 assets/create/blockstates/cut_deepslate_stairs.json c2d8060a0c830e5b8bbb084457083324b5b6f4c9 assets/create/blockstates/cut_deepslate_wall.json aaa6ac5f4fc399c4b03a7f8de856fa7aae97e049 assets/create/blockstates/cut_diorite.json +08b6289ca8b4193c87324ca23ca081e8773fb223 assets/create/blockstates/cut_diorite_bricks.json 423f809f06fa3fd96643f068ba0d3520269b3844 assets/create/blockstates/cut_diorite_brick_slab.json 9011fb92f57e7695c4484c923dd40ecd749ff307 assets/create/blockstates/cut_diorite_brick_stairs.json 41bad89777a33737bc0365ce2c7ffc20720f9620 assets/create/blockstates/cut_diorite_brick_wall.json -08b6289ca8b4193c87324ca23ca081e8773fb223 assets/create/blockstates/cut_diorite_bricks.json b03e7cf494c53c6f24ba93d0ef531e839026932b assets/create/blockstates/cut_diorite_slab.json 95c8094204979acfb0e59c2826003e0274a02fe5 assets/create/blockstates/cut_diorite_stairs.json e2f163d36dd5d03c0741dd2e87d8f77a0c86ae00 assets/create/blockstates/cut_diorite_wall.json f42ca2ce8e8f657c64376759413ec611f8045531 assets/create/blockstates/cut_dripstone.json +2d696162b2085c3d5723308a8d1ccafb29660f01 assets/create/blockstates/cut_dripstone_bricks.json 9310a800fb091014e7c0a220f5f2511c1de379ad assets/create/blockstates/cut_dripstone_brick_slab.json 3ff2f65dafcb4654b99e0d65b7e851760f9a4075 assets/create/blockstates/cut_dripstone_brick_stairs.json cafc956d8dc2053e5a0e8437c4ccde7fa24fc17e assets/create/blockstates/cut_dripstone_brick_wall.json -2d696162b2085c3d5723308a8d1ccafb29660f01 assets/create/blockstates/cut_dripstone_bricks.json 9cb32af3b952b841e9da94789da17cd274c3cfb9 assets/create/blockstates/cut_dripstone_slab.json da0300f54bdfcc705beb8d84f26406be660de5de assets/create/blockstates/cut_dripstone_stairs.json 83ff3eaeb481202c77e6dbdc442b4dd195ca568c assets/create/blockstates/cut_dripstone_wall.json bf501250fd2226838afe0baf68db08cd832e3c4f assets/create/blockstates/cut_granite.json +5c029d7ec837b3239d17ab91a70f025df1bfb124 assets/create/blockstates/cut_granite_bricks.json 773717bd5c140cf025f463c99c67efb9d27bd696 assets/create/blockstates/cut_granite_brick_slab.json 97d20b21e5b7f329c1b21b436fd0bdcaa8d173d0 assets/create/blockstates/cut_granite_brick_stairs.json 5e4175b6c89039ded48937ad1cd13d3bb2d2992a assets/create/blockstates/cut_granite_brick_wall.json -5c029d7ec837b3239d17ab91a70f025df1bfb124 assets/create/blockstates/cut_granite_bricks.json 42549436ce26ad7b44f2e1cba54357b3f25bcb18 assets/create/blockstates/cut_granite_slab.json e9d8fd028d8092e5fa0fd13cd638516f57a22d53 assets/create/blockstates/cut_granite_stairs.json 2daab523202dd2e31daeaf3b9a04cde2a7da4ca5 assets/create/blockstates/cut_granite_wall.json 0652c8b9c41acc1a8da901bd7b8b6018b3581d5b assets/create/blockstates/cut_limestone.json +508ee569f313b7e804f6268ca86f5a61851563ec assets/create/blockstates/cut_limestone_bricks.json 4efbeb34c96918e9b48dc484a82b1ef4811ed39d assets/create/blockstates/cut_limestone_brick_slab.json 11b99cf9b33d7f8de9d11cc1e405e2681682ba32 assets/create/blockstates/cut_limestone_brick_stairs.json b6c02a9e9e47a8e521a54ef9488259267068f032 assets/create/blockstates/cut_limestone_brick_wall.json -508ee569f313b7e804f6268ca86f5a61851563ec assets/create/blockstates/cut_limestone_bricks.json fb63a2581211fe62344985a06feec9dcec4b1888 assets/create/blockstates/cut_limestone_slab.json ffcca1e66718f3e78e544b5fa9954a852c095e91 assets/create/blockstates/cut_limestone_stairs.json a1a90f84b47f96b4384fc2d60bfc48ddbb5ed179 assets/create/blockstates/cut_limestone_wall.json 1b7a133518780d4f49474a70e7f6263d6e88ff51 assets/create/blockstates/cut_ochrum.json +6f37e5e2dca3b443951131cb82c15a981a4e2005 assets/create/blockstates/cut_ochrum_bricks.json f1e9d54a6f9f41b968f117a7be711011effa71a5 assets/create/blockstates/cut_ochrum_brick_slab.json 8d334e026e94b304a1ff1ee96097f434b50175f2 assets/create/blockstates/cut_ochrum_brick_stairs.json e92c026ee7ab2aa35003ad475bef3d6c0e29818c assets/create/blockstates/cut_ochrum_brick_wall.json -6f37e5e2dca3b443951131cb82c15a981a4e2005 assets/create/blockstates/cut_ochrum_bricks.json 5a61edb7d146e83d951795fae33dc306e71b2cb6 assets/create/blockstates/cut_ochrum_slab.json b31944bf6297685acd37631083dde0889c08ede7 assets/create/blockstates/cut_ochrum_stairs.json df33a8af1dc8cb08ddcfd22a50a305499479a4dd assets/create/blockstates/cut_ochrum_wall.json 1606d7481e56755f07e9331cf85a8d7cc9aace9a assets/create/blockstates/cut_scorchia.json +bc2a0e7f11400b8c2a03071be87dadb5edc097de assets/create/blockstates/cut_scorchia_bricks.json 43db25ebac2f5bcaa7ca9cfb6da8fcb20fad8269 assets/create/blockstates/cut_scorchia_brick_slab.json 7a80620590ba5e61967c5168f5c67ecabf09dc00 assets/create/blockstates/cut_scorchia_brick_stairs.json e4eb79360a41bb1a7ca835d61446ea5166e4cda8 assets/create/blockstates/cut_scorchia_brick_wall.json -bc2a0e7f11400b8c2a03071be87dadb5edc097de assets/create/blockstates/cut_scorchia_bricks.json c0d262f54e3b2fce8bc941a2a6df71db5f0229ea assets/create/blockstates/cut_scorchia_slab.json de2e918058e9dd7eafd085a8dec634f6a2832c21 assets/create/blockstates/cut_scorchia_stairs.json 5d2d06799b82449754f62b1d80b9ee9a24c65bad assets/create/blockstates/cut_scorchia_wall.json 76ea4f3438a3effedfc93d2bbabac0899610cd28 assets/create/blockstates/cut_scoria.json +6d9c79e1b71656a73bb69e2a9b100be59084dd2e assets/create/blockstates/cut_scoria_bricks.json 7c7dcd1fe82f3673910620c2eefebad5d0029cdf assets/create/blockstates/cut_scoria_brick_slab.json d535b387bf0a6f9e124eed8b76d899e13699bca9 assets/create/blockstates/cut_scoria_brick_stairs.json c426e1b5e4c77c25cd0d16d10fba0e0731673dd1 assets/create/blockstates/cut_scoria_brick_wall.json -6d9c79e1b71656a73bb69e2a9b100be59084dd2e assets/create/blockstates/cut_scoria_bricks.json fb692494c88358d4d8e687b216f729d6b6bd7174 assets/create/blockstates/cut_scoria_slab.json 950f43bae8f4e3220103ce0c62f444856129ca12 assets/create/blockstates/cut_scoria_stairs.json 01350030831c5b9edef0dc2c778b92f1ebc2b2fc assets/create/blockstates/cut_scoria_wall.json c0c1c4d44eba5babe9703eca31f0279ebd11ed8e assets/create/blockstates/cut_tuff.json +9bddef4a2b4a338c15f03e2397c4cd4c3ae9e5d9 assets/create/blockstates/cut_tuff_bricks.json 11306e83915e0106d48f890df3212c3a47443a08 assets/create/blockstates/cut_tuff_brick_slab.json e8951d94e0d3228700bcb56819928f1c179c3973 assets/create/blockstates/cut_tuff_brick_stairs.json 619340b7cf014cfb72a4b5440b90881535f16108 assets/create/blockstates/cut_tuff_brick_wall.json -9bddef4a2b4a338c15f03e2397c4cd4c3ae9e5d9 assets/create/blockstates/cut_tuff_bricks.json 3577e3f4933ea8cb7464c28e80867ce84917898d assets/create/blockstates/cut_tuff_slab.json 5673fdb02439d622c56dc0ff47a0dca98dc6d027 assets/create/blockstates/cut_tuff_stairs.json 12a46ee82536665400ec2f3befed3be58325d5c6 assets/create/blockstates/cut_tuff_wall.json beb9e47f8d811c2146f68daf992fb805342a65cb assets/create/blockstates/cut_veridium.json +04d07986eb86ffd66baaaf9b65e02d00022e98e2 assets/create/blockstates/cut_veridium_bricks.json 952543c03e730443d85059ec43642efb089485e7 assets/create/blockstates/cut_veridium_brick_slab.json 6a033e7b5a0b26cce5956c6c7c1eff558f866cb5 assets/create/blockstates/cut_veridium_brick_stairs.json 43689138c8018b3ee9f35a11870887e9df3c8fe5 assets/create/blockstates/cut_veridium_brick_wall.json -04d07986eb86ffd66baaaf9b65e02d00022e98e2 assets/create/blockstates/cut_veridium_bricks.json 212d8ee5dfa78802b9539640cf8b263fd5880b87 assets/create/blockstates/cut_veridium_slab.json c11f09df4a23e951bdf9a345515183f4fac7cde3 assets/create/blockstates/cut_veridium_stairs.json 3aa6f5e613ff73952e3de00408051f92316e7f81 assets/create/blockstates/cut_veridium_wall.json @@ -241,12 +241,12 @@ f7f5df9086c71688cbdb5d05c394dc5acb8fb338 assets/create/blockstates/elevator_cont d47bc65703e9582cc710e6408fb565e16d3514a6 assets/create/blockstates/encased_fan.json 651f9fdb11f56d887d131be8f936f508d0b2fc1d assets/create/blockstates/encased_fluid_pipe.json 489ad4daeaed702d231a3f175f7b66846f5789a6 assets/create/blockstates/experience_block.json +5f6c60a30889b043709066707e80a21081d98155 assets/create/blockstates/exposed_copper_shingles.json 74c8a72db3dd3fa919e29baaa8c5865f13490461 assets/create/blockstates/exposed_copper_shingle_slab.json 4e0b5a9be15f0c2861f5f6bd71bd9c2a4db2a21d assets/create/blockstates/exposed_copper_shingle_stairs.json -5f6c60a30889b043709066707e80a21081d98155 assets/create/blockstates/exposed_copper_shingles.json +5299b4f7b9b3490872e8c26a6b212e14dd05fd9a assets/create/blockstates/exposed_copper_tiles.json 6ee73ff3608d51fdad6e9810feee66ed1773b81c assets/create/blockstates/exposed_copper_tile_slab.json f93e4059876bfc6d70b9fa2bc24d8e3d6943d56f assets/create/blockstates/exposed_copper_tile_stairs.json -5299b4f7b9b3490872e8c26a6b212e14dd05fd9a assets/create/blockstates/exposed_copper_tiles.json 4b30365ed77db9c5754eeda5fee81d47b568b946 assets/create/blockstates/factory_gauge.json f1a03ede031d8c4e33a4d07c529e71936da9dc6d assets/create/blockstates/fake_track.json 21fa4a1bf4ee851e090a21c97c9a38d18cfddf0d assets/create/blockstates/fluid_pipe.json @@ -323,6 +323,8 @@ fa5fb2be73c7c54b70e927b66adf3f4d64c5cb6b assets/create/blockstates/light_gray_ni f1901887cd166296e465133c3b0d7ad0d664a614 assets/create/blockstates/light_gray_table_cloth.json 35b151db396069b146d223fbe46be5b0c3dda8a9 assets/create/blockstates/light_gray_toolbox.json 894827ffd176bc733abecf18d96888e9ed5a3eb4 assets/create/blockstates/light_gray_valve_handle.json +a6f319c803c03e34bbf841ea52d82f0f7ec7a413 assets/create/blockstates/limestone.json +7ff65e1c4c8e48a0b694cd17506a192e6a7e6e44 assets/create/blockstates/limestone_pillar.json 7f20b548dd535942b2d6f41c39de7ad4fafe637e assets/create/blockstates/lime_nixie_tube.json c6ac740bf37477ad170576983230b130ac01f355 assets/create/blockstates/lime_postbox.json ad1ec304729fd6d336c0d4d0c27c9345af636695 assets/create/blockstates/lime_sail.json @@ -330,8 +332,6 @@ b9934a558e1b495403dc2c71ffb43cce7d396013 assets/create/blockstates/lime_seat.jso 7c5dc2ffd0bd44ba8785b6a788030714a009bcbc assets/create/blockstates/lime_table_cloth.json 49a02f7fc16697ba1cf16cee7e45ab6bfd8b06ce assets/create/blockstates/lime_toolbox.json ba181485f219d3ae23509a7edf28e25d9edb10f4 assets/create/blockstates/lime_valve_handle.json -a6f319c803c03e34bbf841ea52d82f0f7ec7a413 assets/create/blockstates/limestone.json -7ff65e1c4c8e48a0b694cd17506a192e6a7e6e44 assets/create/blockstates/limestone_pillar.json 654e845cebed82b7afbcf81380921e0a475b01e9 assets/create/blockstates/linear_chassis.json e195e82e4d0c1fc20474535bc9068cbb77a5e175 assets/create/blockstates/lit_blaze_burner.json 296186b196af94e1ab3f7e8a3254f6d31ae47a5c assets/create/blockstates/magenta_nixie_tube.json @@ -377,14 +377,14 @@ aab812cecf7d10d4e7587f4dead8a98238a15f41 assets/create/blockstates/orange_seat.j 2af63a4768f84fc93c7e7d67fa9a64438433e59f assets/create/blockstates/orange_valve_handle.json 515ed7dae09b052f289419ba09998a23e0d7083d assets/create/blockstates/ornate_iron_window.json 8118444f37536b9104ef4818d374b0c8a7c987bf assets/create/blockstates/ornate_iron_window_pane.json +97cd78453af94f44cef1187988966626574b29d5 assets/create/blockstates/oxidized_copper_shingles.json 2ddc762b8d8558e69a2f81c028702f3a25b5e978 assets/create/blockstates/oxidized_copper_shingle_slab.json ac536ae742c12e97bfd0b2483c87ff29f3935eaf assets/create/blockstates/oxidized_copper_shingle_stairs.json -97cd78453af94f44cef1187988966626574b29d5 assets/create/blockstates/oxidized_copper_shingles.json +110a6c19bcc9f044e5e982ac6e4b295b03ec0145 assets/create/blockstates/oxidized_copper_tiles.json 3f3924f0f0e368edfa04f4fdd6d6c2319276ddfe assets/create/blockstates/oxidized_copper_tile_slab.json 5e634cfb9abb06d8b29f39d751fc56b28ea5a9cd assets/create/blockstates/oxidized_copper_tile_stairs.json -110a6c19bcc9f044e5e982ac6e4b295b03ec0145 assets/create/blockstates/oxidized_copper_tiles.json -887565a0f89f089d6be888c87394dde4878afda7 assets/create/blockstates/package_frogport.json 65f3fa5a068189c1c2971af1a1052f69c0e26005 assets/create/blockstates/packager.json +887565a0f89f089d6be888c87394dde4878afda7 assets/create/blockstates/package_frogport.json 36742cc6ce052ead143366d31b11e828a525c1b8 assets/create/blockstates/peculiar_bell.json 53d102e706d53cb2c0dbc0bc11da828084a43519 assets/create/blockstates/pink_nixie_tube.json db7ef5acb1ce2d3b8f881f34b5d9f40633c3973d assets/create/blockstates/pink_postbox.json @@ -470,6 +470,9 @@ a4b6bd4e55cd292abf752efeda93cf8d23162657 assets/create/blockstates/purple_table_ 3aca01f2eddb22adb1b25735b98a990bfc7220d2 assets/create/blockstates/radial_chassis.json 72faac9777be540f95f8b662a833856e0e1b8f35 assets/create/blockstates/railway_casing.json 7ce346fa18702f6fe6e2a939efcfa26eda63fe38 assets/create/blockstates/raw_zinc_block.json +ec546afd3ec8036e4393b97d535f05a86f57dbc1 assets/create/blockstates/redstone_contact.json +ff205f032b36486753dddb1f2029ef8d53e9c86f assets/create/blockstates/redstone_link.json +e4c645b199a2d7e89c91065071a0a91df5ca8e3c assets/create/blockstates/redstone_requester.json e3fd62e466e3e6e7bd6fc8661f764ba972a466fc assets/create/blockstates/red_nixie_tube.json d14d6437a6727da13cea5f7eeb815720c80dde6f assets/create/blockstates/red_postbox.json 4c36b562da58ef2af57009da7cf2426059249228 assets/create/blockstates/red_sail.json @@ -477,9 +480,6 @@ d14d6437a6727da13cea5f7eeb815720c80dde6f assets/create/blockstates/red_postbox.j 90bf31515faa2e7e6d73414a6c5498911910710e assets/create/blockstates/red_table_cloth.json 380f46b7cb72b13c0f16fd4a4287a1a33adeff41 assets/create/blockstates/red_toolbox.json b689d87a27ed0cb2cab190a2ad2b599818bff56c assets/create/blockstates/red_valve_handle.json -ec546afd3ec8036e4393b97d535f05a86f57dbc1 assets/create/blockstates/redstone_contact.json -ff205f032b36486753dddb1f2029ef8d53e9c86f assets/create/blockstates/redstone_link.json -e4c645b199a2d7e89c91065071a0a91df5ca8e3c assets/create/blockstates/redstone_requester.json 87ab7ca62ecf24d60d7e5c61bd5af97714dad0ad assets/create/blockstates/refined_radiance_casing.json 64a5b256e5af2dc8cb7ed77f0feadcf5134f7335 assets/create/blockstates/repackager.json 3807bcc6ccc3dad0dbfcc8fcf260a361aa488659 assets/create/blockstates/rope.json @@ -489,8 +489,8 @@ dd63fd8443a2be507281548df838d878b0c3c8c8 assets/create/blockstates/rose_quartz_l dfe69ee57f832a2e4c576ee01bdde1617c81e46a assets/create/blockstates/rose_quartz_tiles.json b9cbbc7c4e1d9abd312263a9a270315bd5f0106b assets/create/blockstates/rotation_speed_controller.json 5a25ecb95b7978cc487491cb24478e4d6a73e977 assets/create/blockstates/sail_frame.json -505510656c77d93ecd3691e7111615193275f29e assets/create/blockstates/schematic_table.json bff758cc56bece375b40c32067b903b675065328 assets/create/blockstates/schematicannon.json +505510656c77d93ecd3691e7111615193275f29e assets/create/blockstates/schematic_table.json 82c9ceb19cfc4e247fbb62a9605630ba08423efe assets/create/blockstates/scorchia.json 6fa99d5f1ff05153660f9917286d4b157eaa1b40 assets/create/blockstates/scorchia_pillar.json 8c34743564aa0473745ecec304a19e15e9e87cf2 assets/create/blockstates/scoria.json @@ -499,64 +499,64 @@ e5aff9dc8fa5e98b060232974194afb06d497d09 assets/create/blockstates/scoria_pillar 3343224d6da4e75f0bc7a7634ba010a4ba54ad70 assets/create/blockstates/sequenced_gearshift.json 4c261d54117ee295b307f6ea3e56a09437631f73 assets/create/blockstates/shadow_steel_casing.json 4c67d2a1a1faea5be2a81ebc0722c32d8e2e84d6 assets/create/blockstates/shaft.json +c606f103619088e8a5afe969ba54929af480a3d2 assets/create/blockstates/small_andesite_bricks.json c5469de5957d77fc11febaa658ee2bfb0d11b0bc assets/create/blockstates/small_andesite_brick_slab.json ed0bcfd07959aa208085910bd3780756979c985d assets/create/blockstates/small_andesite_brick_stairs.json 78e30e63adedf1ca95261eb4010a1db45aecfe9e assets/create/blockstates/small_andesite_brick_wall.json -c606f103619088e8a5afe969ba54929af480a3d2 assets/create/blockstates/small_andesite_bricks.json +b9fedc13dc8cb53a8bb16ce2257ea65f0ac94a6b assets/create/blockstates/small_asurine_bricks.json 653fa70f0aa7fc319d50f72692d507ff7c59c0f4 assets/create/blockstates/small_asurine_brick_slab.json e61a0b891729565434d6ab34aa3aeada7d189f9d assets/create/blockstates/small_asurine_brick_stairs.json 02556b916c198c683279eb4392ebaa31fb41e182 assets/create/blockstates/small_asurine_brick_wall.json -b9fedc13dc8cb53a8bb16ce2257ea65f0ac94a6b assets/create/blockstates/small_asurine_bricks.json e986248237013eea755bccd300f745e44d0a183f assets/create/blockstates/small_bogey.json +031d9492dbcc5de77431e8f54b9b04db412b5690 assets/create/blockstates/small_calcite_bricks.json 898bca10ff6e5402c4b8b84e1b9ba9036b32b8bc assets/create/blockstates/small_calcite_brick_slab.json ecc2276bdb2b24f54e31372bf207171a348e55d3 assets/create/blockstates/small_calcite_brick_stairs.json d9dd243b5b754a487755b53609d404ac1b3fde99 assets/create/blockstates/small_calcite_brick_wall.json -031d9492dbcc5de77431e8f54b9b04db412b5690 assets/create/blockstates/small_calcite_bricks.json +3d4e0b54ffda83f7f6e08b6a745db81049d95f3b assets/create/blockstates/small_crimsite_bricks.json 4094bf00cad8dea2dd234866b482c07175802c4c assets/create/blockstates/small_crimsite_brick_slab.json 7f73a2505e2a3a98a7749fa98f4623aa2d216edd assets/create/blockstates/small_crimsite_brick_stairs.json b477c7f1855c9eb2ef1bf672376e972678dc563f assets/create/blockstates/small_crimsite_brick_wall.json -3d4e0b54ffda83f7f6e08b6a745db81049d95f3b assets/create/blockstates/small_crimsite_bricks.json +17359d1b87399bb066cfc23002bcf0d8f71d8ccd assets/create/blockstates/small_deepslate_bricks.json c67f32adc49f0b24b34f098a390a398813365260 assets/create/blockstates/small_deepslate_brick_slab.json d05aed31d45ed12f8f117a9c64312b1abff8bd2f assets/create/blockstates/small_deepslate_brick_stairs.json 6952b02d8c5adf3d0d1a243221b637c50edaa287 assets/create/blockstates/small_deepslate_brick_wall.json -17359d1b87399bb066cfc23002bcf0d8f71d8ccd assets/create/blockstates/small_deepslate_bricks.json +6c0ac59e09feb76afc078a88431442a2a6381c6c assets/create/blockstates/small_diorite_bricks.json ee39994b434a17ec7497b271a6e0a006cf6311cb assets/create/blockstates/small_diorite_brick_slab.json eb335cf0a857299b9cd0c4f60e00bc8e4ca7efe8 assets/create/blockstates/small_diorite_brick_stairs.json b6f7c563c30483c749849899b96d4f0030b71df1 assets/create/blockstates/small_diorite_brick_wall.json -6c0ac59e09feb76afc078a88431442a2a6381c6c assets/create/blockstates/small_diorite_bricks.json +d51095bfb9d5758f8b3972a973fbe282569b0234 assets/create/blockstates/small_dripstone_bricks.json 3d8109d327099c65ca0fafcb5651051059cad1df assets/create/blockstates/small_dripstone_brick_slab.json 3931e24229db79115ffe2a9f3a069202b9b8dcab assets/create/blockstates/small_dripstone_brick_stairs.json 0d16cefcb8e619bc81ef65111d16d331db58d0aa assets/create/blockstates/small_dripstone_brick_wall.json -d51095bfb9d5758f8b3972a973fbe282569b0234 assets/create/blockstates/small_dripstone_bricks.json +11dcaf8a6da96d178024b4c3ee76b9c373e5d082 assets/create/blockstates/small_granite_bricks.json 096b064f28fbe381e1b637d4668550851cbbb2c2 assets/create/blockstates/small_granite_brick_slab.json e99cc3251937fbf9fc858623d5ea525ed5b79704 assets/create/blockstates/small_granite_brick_stairs.json 62f2b570ac6073c8a98369523095d2c18a353eed assets/create/blockstates/small_granite_brick_wall.json -11dcaf8a6da96d178024b4c3ee76b9c373e5d082 assets/create/blockstates/small_granite_bricks.json +346dbff9a84b988bd9c9af670b486b6af5e18179 assets/create/blockstates/small_limestone_bricks.json d640eed81abaa013ed1c53d68a552f639168ae8b assets/create/blockstates/small_limestone_brick_slab.json d470967200aa6ca618421cf375140b352c45cc90 assets/create/blockstates/small_limestone_brick_stairs.json 8d4a1eff66a3f45d595ff8371c0d1ebaa0ba1773 assets/create/blockstates/small_limestone_brick_wall.json -346dbff9a84b988bd9c9af670b486b6af5e18179 assets/create/blockstates/small_limestone_bricks.json +1464b01d4c8bd9ec56460c1250fd4bb07e936e22 assets/create/blockstates/small_ochrum_bricks.json ddee92141e00898e8d70145cf00c0d64f56b4f48 assets/create/blockstates/small_ochrum_brick_slab.json bad9a5820c64c125494c0eba4f6c7ebebe93341c assets/create/blockstates/small_ochrum_brick_stairs.json ed899a18522adc70ae46185c308904c8de5b5834 assets/create/blockstates/small_ochrum_brick_wall.json -1464b01d4c8bd9ec56460c1250fd4bb07e936e22 assets/create/blockstates/small_ochrum_bricks.json c520e9ba54ff6dfb96f7863bb093cdf15cc95ce4 assets/create/blockstates/small_rose_quartz_tiles.json +371ff795eb4e7cb1220d307abf8cb003f455cbec assets/create/blockstates/small_scorchia_bricks.json 384a1331b92b7beba988f729bb7cda42abec0172 assets/create/blockstates/small_scorchia_brick_slab.json 046a84030a23f5a40f4deac13f2e60ced436cadf assets/create/blockstates/small_scorchia_brick_stairs.json 58bc6e3bb10ed72b8cb5813a88cab300d1183b7d assets/create/blockstates/small_scorchia_brick_wall.json -371ff795eb4e7cb1220d307abf8cb003f455cbec assets/create/blockstates/small_scorchia_bricks.json +0aa51dbfda8349b878e2f6c9bb3314fcfc1a9c39 assets/create/blockstates/small_scoria_bricks.json 5b227400e588abae33c1682196f098adc8006d13 assets/create/blockstates/small_scoria_brick_slab.json 51420bb12b757d3888fd1ceb5c21d83b42bd2266 assets/create/blockstates/small_scoria_brick_stairs.json 36e9bd161fa4ffe18f07153b2945cfeae55e7c0b assets/create/blockstates/small_scoria_brick_wall.json -0aa51dbfda8349b878e2f6c9bb3314fcfc1a9c39 assets/create/blockstates/small_scoria_bricks.json +c1f9f986dd0bfdbdee210c6c7d71981b251c27db assets/create/blockstates/small_tuff_bricks.json 8d1af444031291fe58d850ae344aaf7e97b8bd87 assets/create/blockstates/small_tuff_brick_slab.json 26879e6cadf0035c3eed4b54b3a1fdc0c080a485 assets/create/blockstates/small_tuff_brick_stairs.json 5d58ca7b81ae537454c3cdbb5fc8aacca83cff3f assets/create/blockstates/small_tuff_brick_wall.json -c1f9f986dd0bfdbdee210c6c7d71981b251c27db assets/create/blockstates/small_tuff_bricks.json +ad79aa8ff306695f65386fdeb44c5285547934b6 assets/create/blockstates/small_veridium_bricks.json 6226471fdcadbbf0e02704bb0e7de607e99302a8 assets/create/blockstates/small_veridium_brick_slab.json b54200ebe65c4ad2e5661c81ba5bf939039277ca assets/create/blockstates/small_veridium_brick_stairs.json 0237d58443ca9dc2a9186c2387dd6633702a7598 assets/create/blockstates/small_veridium_brick_wall.json -ad79aa8ff306695f65386fdeb44c5285547934b6 assets/create/blockstates/small_veridium_bricks.json 4d987859e5f5a930c20e955919304088fb6fc6d1 assets/create/blockstates/smart_chute.json 57fc35b2e0ae9ab16c011abd95f507910c70a234 assets/create/blockstates/smart_fluid_pipe.json a70c025de5d85180f371ff05bbdc531d8bdfaab1 assets/create/blockstates/speedometer.json @@ -568,9 +568,9 @@ a60c9c8241e40c2e28f5760c0ca6e80cfe9d59f3 assets/create/blockstates/steam_whistle 636ec6c7e1ef3b737edc716200f138bc63681d78 assets/create/blockstates/steam_whistle_extension.json 8865500bcd2e4d467e74edb3509850fa92a5809f assets/create/blockstates/sticker.json bed0534e618105184bc877b104230403ca85bb58 assets/create/blockstates/sticky_mechanical_piston.json +c7c17ff17b98ce85d355f2f9b4509271bc283843 assets/create/blockstates/stockpile_switch.json d17e6ac368278bd60442e2f19eb064a31c4106d2 assets/create/blockstates/stock_link.json 9989bda294fbffc5f659d2e608e01dea424c7694 assets/create/blockstates/stock_ticker.json -c7c17ff17b98ce85d355f2f9b4509271bc283843 assets/create/blockstates/stockpile_switch.json a70c025de5d85180f371ff05bbdc531d8bdfaab1 assets/create/blockstates/stressometer.json 8086f80c532fad42b37fcdc590b890ed7e8c3fe9 assets/create/blockstates/tiled_glass.json 1143ab7223c655764a81ed72ac385ea179664072 assets/create/blockstates/tiled_glass_pane.json @@ -590,36 +590,36 @@ bfb2b7eabba2e7aef4d783328c8a5a1558e7e493 assets/create/blockstates/turntable.jso 116d0a8fb72bcc00bd511db7893ea3e96efda297 assets/create/blockstates/warped_window_pane.json fa3d300520e3bedb926696d9980cbeeb54cfdc68 assets/create/blockstates/water_wheel.json 3dff9e1ec59415779195d2abfa9f07bc17b428a1 assets/create/blockstates/water_wheel_structure.json +2ae175c489b86b78b4646306250ca2dba66b0a5e assets/create/blockstates/waxed_copper_shingles.json 85ed36dcb0a3542e0638601116360202a9670d53 assets/create/blockstates/waxed_copper_shingle_slab.json aaf49f1b6785e2195c5dc2e8792c99c960745f89 assets/create/blockstates/waxed_copper_shingle_stairs.json -2ae175c489b86b78b4646306250ca2dba66b0a5e assets/create/blockstates/waxed_copper_shingles.json +835bfe0d2137ad60e5f8322fa4449d5c7a02187f assets/create/blockstates/waxed_copper_tiles.json b52eda74c9000507a4f34e10fbd1a7846b66c16d assets/create/blockstates/waxed_copper_tile_slab.json 5428969f6f27213d0ec5140d911b3844b5332006 assets/create/blockstates/waxed_copper_tile_stairs.json -835bfe0d2137ad60e5f8322fa4449d5c7a02187f assets/create/blockstates/waxed_copper_tiles.json +306b9cd1efe3abd1fcca11bc464560837fb8fdfa assets/create/blockstates/waxed_exposed_copper_shingles.json bc8f3bb75bdb094c8372d61a68927270d3347437 assets/create/blockstates/waxed_exposed_copper_shingle_slab.json 32382e5f524b50393080fdbd2415a98ddb700c9c assets/create/blockstates/waxed_exposed_copper_shingle_stairs.json -306b9cd1efe3abd1fcca11bc464560837fb8fdfa assets/create/blockstates/waxed_exposed_copper_shingles.json +ae92a9051f1603e7ad4f93cb668706ccffc7a85b assets/create/blockstates/waxed_exposed_copper_tiles.json ca37c3e54d5c78a77fcb4a4aca004a34e271f246 assets/create/blockstates/waxed_exposed_copper_tile_slab.json a864f82ccd6b3e0fa181c800da886ebd3239fb82 assets/create/blockstates/waxed_exposed_copper_tile_stairs.json -ae92a9051f1603e7ad4f93cb668706ccffc7a85b assets/create/blockstates/waxed_exposed_copper_tiles.json +729ca65a140b3d7571a2072f7406cc5f4a2e27c5 assets/create/blockstates/waxed_oxidized_copper_shingles.json ef99e849f9dd6ad53ddf04625c81750f11eaae1c assets/create/blockstates/waxed_oxidized_copper_shingle_slab.json 9386068220f9bb5d2f6d3cc408dc4f78f26b4eeb assets/create/blockstates/waxed_oxidized_copper_shingle_stairs.json -729ca65a140b3d7571a2072f7406cc5f4a2e27c5 assets/create/blockstates/waxed_oxidized_copper_shingles.json +17acf3486e92aabc3efbe99fa1e5d7d664e6ec97 assets/create/blockstates/waxed_oxidized_copper_tiles.json fe79f7eab017d714c0331664a3a2b5579104194e assets/create/blockstates/waxed_oxidized_copper_tile_slab.json 10bbe77a0334b5578b1ec40b398a45cf7d2bb534 assets/create/blockstates/waxed_oxidized_copper_tile_stairs.json -17acf3486e92aabc3efbe99fa1e5d7d664e6ec97 assets/create/blockstates/waxed_oxidized_copper_tiles.json +079acbfd6a9375899687b581f95bbe74940afce2 assets/create/blockstates/waxed_weathered_copper_shingles.json 73572bbe16957e63853ee425d8f34d98e14e4a10 assets/create/blockstates/waxed_weathered_copper_shingle_slab.json ab05925d5bb70e53fec9c149982304f31acd2b1a assets/create/blockstates/waxed_weathered_copper_shingle_stairs.json -079acbfd6a9375899687b581f95bbe74940afce2 assets/create/blockstates/waxed_weathered_copper_shingles.json +202b0f2e6fca9eab949f47eaa1f4ddee249a633a assets/create/blockstates/waxed_weathered_copper_tiles.json fc1b53d3b2b1f0977069abec3c376f3f5c4cd7c8 assets/create/blockstates/waxed_weathered_copper_tile_slab.json 6cd93476a45c3b77f5eda66f68425bae486cfba8 assets/create/blockstates/waxed_weathered_copper_tile_stairs.json -202b0f2e6fca9eab949f47eaa1f4ddee249a633a assets/create/blockstates/waxed_weathered_copper_tiles.json +c11562afd9a5f85945e521dcea5f911d1b6d13c6 assets/create/blockstates/weathered_copper_shingles.json 5a5a1e95988edb7a2b6dc6c6ba5677c2d896a5ae assets/create/blockstates/weathered_copper_shingle_slab.json 07019fc8890cb5e966a42ca636a0ab9cf71cc881 assets/create/blockstates/weathered_copper_shingle_stairs.json -c11562afd9a5f85945e521dcea5f911d1b6d13c6 assets/create/blockstates/weathered_copper_shingles.json +236e072d9056c0dbffdf5d7d973a85a56c2c8de1 assets/create/blockstates/weathered_copper_tiles.json fee668eb9a45dca0d287fee5811219d69f9ec3e2 assets/create/blockstates/weathered_copper_tile_slab.json da110f382368257e15431c77164aef82e014e3f8 assets/create/blockstates/weathered_copper_tile_stairs.json -236e072d9056c0dbffdf5d7d973a85a56c2c8de1 assets/create/blockstates/weathered_copper_tiles.json 64fb3e569da401635b64e71e01ea0b3ff6360611 assets/create/blockstates/weathered_iron_block.json 6fd81f1eb48fbfc44df9db8eedc613690c9b8ef5 assets/create/blockstates/weathered_iron_window.json 1aed351050d73989c4553bf49ce03b3a8fdd210e assets/create/blockstates/weathered_iron_window_pane.json @@ -642,8 +642,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -8d13fe09a474ee6fa5a989f1a135faeb762cf06e assets/create/lang/en_ud.json -591f942809c644aa11ee28c8dab15c498e719a22 assets/create/lang/en_us.json +72dcfc12eacda22db7ab211e6784692f4358bacf assets/create/lang/en_ud.json +9a139116d316f83bf4d1791a4938915772cedf99 assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -806,21 +806,21 @@ d063df8e9b974c11fc7810ce176b02d7d924e15b assets/create/models/block/copper_post. 2b5aed4a917694beb33d9b0ecbc800dcbc143ee9 assets/create/models/block/copper_post_ends.json bac7566a726b0fe6d537c744aec4afb383dc165c assets/create/models/block/copper_scaffolding.json dbee65c129740f3b99c07e754b3224d3f9f8c242 assets/create/models/block/copper_scaffolding_horizontal.json +32fdb85b5b62d5a0fb41732874c854788cdd2ba1 assets/create/models/block/copper_shingles.json fb7fb6deebd502946ab57f1b8a9f4a6b5dd48da3 assets/create/models/block/copper_shingle_slab.json 660f61112b8e46dec5050cb0ed4ee936965a7c58 assets/create/models/block/copper_shingle_slab_top.json 5d74be967bbe9feba4b630751f13af817a733d1d assets/create/models/block/copper_shingle_stairs.json 35cb89f29ce3f8d8af13602c08ecd7afbb7cf56a assets/create/models/block/copper_shingle_stairs_inner.json fcb9295f4f388e6d439ec9a3906ca326b6d69077 assets/create/models/block/copper_shingle_stairs_outer.json -32fdb85b5b62d5a0fb41732874c854788cdd2ba1 assets/create/models/block/copper_shingles.json cb218a725f82db34ffe58a5208266e1c768cfc05 assets/create/models/block/copper_side.json d9b4652ca8f1e65007f42d946ecfb38acc3f168f assets/create/models/block/copper_side_alt.json 03a6c5b8bc3041a2be001092f7abd014d6f852a2 assets/create/models/block/copper_table_cloth.json +32f06f39d0b34e4431795aa6e64f87e58dc1597b assets/create/models/block/copper_tiles.json 298c6100de02ed9f813397d8ba38c46f35035c69 assets/create/models/block/copper_tile_slab.json d4422c2d96fb329087d1be70d8b983a8cf6c7f01 assets/create/models/block/copper_tile_slab_top.json fca72048f916d3a3e567b385c948cc1b59711ef4 assets/create/models/block/copper_tile_stairs.json 997479b62ed3d81ab633279ecc2fabd9588a3bf3 assets/create/models/block/copper_tile_stairs_inner.json d5c5bbfb9aaa282e11ad6e6309b1880b172ee653 assets/create/models/block/copper_tile_stairs_outer.json -32f06f39d0b34e4431795aa6e64f87e58dc1597b assets/create/models/block/copper_tiles.json fa2fa91e674eb4de440617049dae34064fd6fa39 assets/create/models/block/copper_valve_handle.json 52ae02c17509e483e35a1b6055296c3a663f85d7 assets/create/models/block/crate/creative/bottom.json 689989ecbd4d59d5836deb8adf7af1d473a377c0 assets/create/models/block/crate/creative/left.json @@ -864,15 +864,15 @@ b3f403f77e3b1b44c56450e387136bca12a84a99 assets/create/models/block/crimson_wind 117d14a1f25cc8ac633bb4cc8a81830a1c016096 assets/create/models/block/crimson_window_pane_side.json ee13522aadfca40f856499d5c29bd86d8f4dda57 assets/create/models/block/crimson_window_pane_side_alt.json 40042ce15d51445ec71b73da34477fa735f3fdd4 assets/create/models/block/cut_andesite.json +5be7d431ac56e2ceb9e3d95589d687f757d5257c assets/create/models/block/cut_andesite_bricks.json +c78e2acf9b54d7370f12e34dcca5c71743f47d55 assets/create/models/block/cut_andesite_bricks_wall_post.json +88e3c8eadf97f772fbafe3b71c8dd27c91c0c0e3 assets/create/models/block/cut_andesite_bricks_wall_side.json +bc264e09c506418b01c6032dcab8ca28080cb70b assets/create/models/block/cut_andesite_bricks_wall_side_tall.json fcbe246aca067dcfeef7afb4e6068b8932da8792 assets/create/models/block/cut_andesite_brick_slab.json e384a98b54ed7317b6ad0e86cf87500491eea824 assets/create/models/block/cut_andesite_brick_slab_top.json 91699e60e29e7524271a2f87200951ee8bfeb8ef assets/create/models/block/cut_andesite_brick_stairs.json e314e0837aed319cdf34a1aaa60f0be6ca169636 assets/create/models/block/cut_andesite_brick_stairs_inner.json aba679c4c6a8d5afc2924d2c9c84af5a2208fde3 assets/create/models/block/cut_andesite_brick_stairs_outer.json -5be7d431ac56e2ceb9e3d95589d687f757d5257c assets/create/models/block/cut_andesite_bricks.json -c78e2acf9b54d7370f12e34dcca5c71743f47d55 assets/create/models/block/cut_andesite_bricks_wall_post.json -88e3c8eadf97f772fbafe3b71c8dd27c91c0c0e3 assets/create/models/block/cut_andesite_bricks_wall_side.json -bc264e09c506418b01c6032dcab8ca28080cb70b assets/create/models/block/cut_andesite_bricks_wall_side_tall.json 8c17ba39e50a440497af089f5fd85649f05bdf8c assets/create/models/block/cut_andesite_slab.json b95ab966cf8c177c799e228759d0cd28c1cfa71f assets/create/models/block/cut_andesite_slab_top.json 81a407a5ff4393b66f784ba4ceee971c3c62de7f assets/create/models/block/cut_andesite_stairs.json @@ -882,15 +882,15 @@ f06abcb3ce691fd30db81b40ea0430462fc972cf assets/create/models/block/cut_andesite 81cef9548137aaff5b6e77d417f387796f2608b2 assets/create/models/block/cut_andesite_wall_side.json dbb99ac37333ee12b7d3859207409aa2599f28eb assets/create/models/block/cut_andesite_wall_side_tall.json a48f77e90c1d02d5b4e6540db723f748118788e9 assets/create/models/block/cut_asurine.json +3b0b7bd63870ac19b9444ce9add9930ec9120821 assets/create/models/block/cut_asurine_bricks.json +89142424e1d702a0f2bc27829304520e48ee1eb3 assets/create/models/block/cut_asurine_bricks_wall_post.json +1f1fcf92e91b1f0d15ba389d6d25e1fba3ad8e5b assets/create/models/block/cut_asurine_bricks_wall_side.json +858d15aff53fe938304bafb52ef32e54e3d44a44 assets/create/models/block/cut_asurine_bricks_wall_side_tall.json 4107317f71d07fb1c113e056c832e963f57b41d7 assets/create/models/block/cut_asurine_brick_slab.json fba2e8dc513184eaa9c4449471b32f206dfe425a assets/create/models/block/cut_asurine_brick_slab_top.json 72bb7b2df330f8d5981f4c12b23429d8d874362d assets/create/models/block/cut_asurine_brick_stairs.json e753ba3830c51539565abbd9b49df9a34f97f2ff assets/create/models/block/cut_asurine_brick_stairs_inner.json ec9182d14517ffc71749e3e016e6546db79e6800 assets/create/models/block/cut_asurine_brick_stairs_outer.json -3b0b7bd63870ac19b9444ce9add9930ec9120821 assets/create/models/block/cut_asurine_bricks.json -89142424e1d702a0f2bc27829304520e48ee1eb3 assets/create/models/block/cut_asurine_bricks_wall_post.json -1f1fcf92e91b1f0d15ba389d6d25e1fba3ad8e5b assets/create/models/block/cut_asurine_bricks_wall_side.json -858d15aff53fe938304bafb52ef32e54e3d44a44 assets/create/models/block/cut_asurine_bricks_wall_side_tall.json b4512f7cef7cef0bc5f85cb955c2dec6de2cbb56 assets/create/models/block/cut_asurine_slab.json 7c1befdd97b1556e9658e968e705c9edbf1ed667 assets/create/models/block/cut_asurine_slab_top.json d04b8a8cf9a50aa7e0b068ceb9a5a2970abc81a7 assets/create/models/block/cut_asurine_stairs.json @@ -900,15 +900,15 @@ ac544a8f948119945aa21362ad26ed8b1c922b0d assets/create/models/block/cut_asurine_ a253210cba60f58e720598323bd0d9ed4c209b4d assets/create/models/block/cut_asurine_wall_side.json c0c2cc13288771699a80c5c80e8e35d352cea684 assets/create/models/block/cut_asurine_wall_side_tall.json a6b10dc7984d22cac7aa314d46ac0928a00e667b assets/create/models/block/cut_calcite.json +6230a499321b175fc441bb662e0655662b3597de assets/create/models/block/cut_calcite_bricks.json +be1462847e9001a062091162802fab2fe6737693 assets/create/models/block/cut_calcite_bricks_wall_post.json +6e6b34468a7a0786efe5f4ebd917a4640b4be6ae assets/create/models/block/cut_calcite_bricks_wall_side.json +8b10c0f4f17f3844cee6d514cc22ddc6cb056c8a assets/create/models/block/cut_calcite_bricks_wall_side_tall.json f046be4f44936946bd3cc2ad5549d112b2e60d97 assets/create/models/block/cut_calcite_brick_slab.json 64953ca8a302ecab9311c617f69e5dcf8c138718 assets/create/models/block/cut_calcite_brick_slab_top.json 19e1b342d05d3cd69c410952dc22507c3c988c15 assets/create/models/block/cut_calcite_brick_stairs.json 18317b0a8bab345abd779f5d43f9620b73df0e67 assets/create/models/block/cut_calcite_brick_stairs_inner.json 0631d4e1bdaf724752f2e55401eb7a54af705b56 assets/create/models/block/cut_calcite_brick_stairs_outer.json -6230a499321b175fc441bb662e0655662b3597de assets/create/models/block/cut_calcite_bricks.json -be1462847e9001a062091162802fab2fe6737693 assets/create/models/block/cut_calcite_bricks_wall_post.json -6e6b34468a7a0786efe5f4ebd917a4640b4be6ae assets/create/models/block/cut_calcite_bricks_wall_side.json -8b10c0f4f17f3844cee6d514cc22ddc6cb056c8a assets/create/models/block/cut_calcite_bricks_wall_side_tall.json 6b35e0f9e6a7e247bf38d8d6d911a2bcc53c2517 assets/create/models/block/cut_calcite_slab.json 0eec7692ee8e119c1258bdb7e852204771c2232d assets/create/models/block/cut_calcite_slab_top.json d07ebf8982e4947852da8b2b0052f6b6000d334f assets/create/models/block/cut_calcite_stairs.json @@ -918,15 +918,15 @@ e8b7b983168ad9f4f4fa1642ca20ff56621935db assets/create/models/block/cut_calcite_ 421e128177bb4dd51391e360f11ba83c5d891cd1 assets/create/models/block/cut_calcite_wall_side.json 5add4bde51bbdd7c229b05f4fabd8a769414fb79 assets/create/models/block/cut_calcite_wall_side_tall.json 2e93da554ea72b90a576bbc9230aea373d3aed0f assets/create/models/block/cut_crimsite.json +39d1a3cdd978c761bc0d67baaba82d11953fc2a0 assets/create/models/block/cut_crimsite_bricks.json +8614cb38c52447fea5245fcf295a951a977071c0 assets/create/models/block/cut_crimsite_bricks_wall_post.json +b0b16f4a2f6dd3f77ec4f65f05e9edb70a196316 assets/create/models/block/cut_crimsite_bricks_wall_side.json +ac41e5b092c6ed81d14004f9427b6151b88dc924 assets/create/models/block/cut_crimsite_bricks_wall_side_tall.json c2474a10109d0476a46d2a509fc1cd37cd52822d assets/create/models/block/cut_crimsite_brick_slab.json efeb149835a389409b7f94bc35765b0871ad7342 assets/create/models/block/cut_crimsite_brick_slab_top.json e5096a1bae43341bae5706f02cd6d564b5a82502 assets/create/models/block/cut_crimsite_brick_stairs.json af3c0018e5e12bbe0f118bc0174b6ca513ae58ae assets/create/models/block/cut_crimsite_brick_stairs_inner.json ed30baef426f2ccf158d87111c7b53f3600bc32a assets/create/models/block/cut_crimsite_brick_stairs_outer.json -39d1a3cdd978c761bc0d67baaba82d11953fc2a0 assets/create/models/block/cut_crimsite_bricks.json -8614cb38c52447fea5245fcf295a951a977071c0 assets/create/models/block/cut_crimsite_bricks_wall_post.json -b0b16f4a2f6dd3f77ec4f65f05e9edb70a196316 assets/create/models/block/cut_crimsite_bricks_wall_side.json -ac41e5b092c6ed81d14004f9427b6151b88dc924 assets/create/models/block/cut_crimsite_bricks_wall_side_tall.json a6cdd4b227210b7487b8431b8d76bbe490636b81 assets/create/models/block/cut_crimsite_slab.json 5c585dba4dbfa9ff0a22a84aa726260cffdeebeb assets/create/models/block/cut_crimsite_slab_top.json 91f60b4277ca48dabfb5d3eebb1ed64a2681a083 assets/create/models/block/cut_crimsite_stairs.json @@ -936,15 +936,15 @@ e6b39a0b1dbab462479fc60fab2efc6a9ceb6a55 assets/create/models/block/cut_crimsite 5b3783862e50fde6ffffc92068900afcc066002f assets/create/models/block/cut_crimsite_wall_side.json b59fbbfe9c6738b1f93f03d59a747f5610164c34 assets/create/models/block/cut_crimsite_wall_side_tall.json 144ec3864fb0a7981e74d357200a96033c75a2d6 assets/create/models/block/cut_deepslate.json +0d599ae1b4e9309f2a7b3362e86061e2150ba3ec assets/create/models/block/cut_deepslate_bricks.json +601894e096edbcd3d96ce0160f06e17a4efca819 assets/create/models/block/cut_deepslate_bricks_wall_post.json +42db46cb5c9c02d684c86f3a518feb3348d83fa0 assets/create/models/block/cut_deepslate_bricks_wall_side.json +c046436d59c350c6beb6b395675513c12184ffe2 assets/create/models/block/cut_deepslate_bricks_wall_side_tall.json af8c7c652e75bf904093bbafc1cf805f842a39c9 assets/create/models/block/cut_deepslate_brick_slab.json 2a01dd0244b07f28454c061a565d1028ca7e3066 assets/create/models/block/cut_deepslate_brick_slab_top.json 62d39eec3621204de82377e74936b9cd338e8004 assets/create/models/block/cut_deepslate_brick_stairs.json 5f90dfbb45b57bd894bf03fcc6c347cb525e3a73 assets/create/models/block/cut_deepslate_brick_stairs_inner.json 512d588c77bdf5a7232826e2f4ce4b3cb991d0ce assets/create/models/block/cut_deepslate_brick_stairs_outer.json -0d599ae1b4e9309f2a7b3362e86061e2150ba3ec assets/create/models/block/cut_deepslate_bricks.json -601894e096edbcd3d96ce0160f06e17a4efca819 assets/create/models/block/cut_deepslate_bricks_wall_post.json -42db46cb5c9c02d684c86f3a518feb3348d83fa0 assets/create/models/block/cut_deepslate_bricks_wall_side.json -c046436d59c350c6beb6b395675513c12184ffe2 assets/create/models/block/cut_deepslate_bricks_wall_side_tall.json c79ae6e97e94d36f2586865ea63f3fab43f8ccbc assets/create/models/block/cut_deepslate_slab.json 5978b93805ccf0bdd953938b34a8dd0ffdcf5565 assets/create/models/block/cut_deepslate_slab_top.json 06a508b2395c3f738d2c5651f366792ee9b9c5ec assets/create/models/block/cut_deepslate_stairs.json @@ -954,15 +954,15 @@ c2850e9f223c459ba53d575a1ef8231589c48c0b assets/create/models/block/cut_deepslat e901746d3e50fe7d9b79d268f4d02251d5cf95f4 assets/create/models/block/cut_deepslate_wall_side.json 1ef794aab31a10bf150a0015cd46e5b5f3c70042 assets/create/models/block/cut_deepslate_wall_side_tall.json 4abb502ea3f6764797641f55a2c48f4858be1ba6 assets/create/models/block/cut_diorite.json +e97babf115a4f81f8555994aba435cf76bebf7a3 assets/create/models/block/cut_diorite_bricks.json +4f7cf44e4d6431587266a4fac78c0812e99d780c assets/create/models/block/cut_diorite_bricks_wall_post.json +1f96f9e190d8e28496ce2db5712f33e449215985 assets/create/models/block/cut_diorite_bricks_wall_side.json +45246192d9cd39837b426e425fc5082422642b65 assets/create/models/block/cut_diorite_bricks_wall_side_tall.json ab61b1b94946f315006a29113f594c234d796bee assets/create/models/block/cut_diorite_brick_slab.json 73597772386c6bbd38907cbea8db816f174a9f8f assets/create/models/block/cut_diorite_brick_slab_top.json c9fbd953ef0789a0e9a915d5f283fd09a76784d6 assets/create/models/block/cut_diorite_brick_stairs.json 5d721f1b3f4376a91707b56950a1f9635adbe603 assets/create/models/block/cut_diorite_brick_stairs_inner.json 9a446bf02732e1873fa96d7745fced0fa04d48d6 assets/create/models/block/cut_diorite_brick_stairs_outer.json -e97babf115a4f81f8555994aba435cf76bebf7a3 assets/create/models/block/cut_diorite_bricks.json -4f7cf44e4d6431587266a4fac78c0812e99d780c assets/create/models/block/cut_diorite_bricks_wall_post.json -1f96f9e190d8e28496ce2db5712f33e449215985 assets/create/models/block/cut_diorite_bricks_wall_side.json -45246192d9cd39837b426e425fc5082422642b65 assets/create/models/block/cut_diorite_bricks_wall_side_tall.json 15195975e7e0ffb7010591b957a657f492e6d59d assets/create/models/block/cut_diorite_slab.json 01c320637843dc0d8b74b48b8d6946cd663d51f6 assets/create/models/block/cut_diorite_slab_top.json 7dcbfe4dc2ec62345da660ecc6ca44056fcd64e7 assets/create/models/block/cut_diorite_stairs.json @@ -972,15 +972,15 @@ e97babf115a4f81f8555994aba435cf76bebf7a3 assets/create/models/block/cut_diorite_ 29075eaaba51ba158f030c2a9583ed5ba52379c8 assets/create/models/block/cut_diorite_wall_side.json 1fb50473359147c7147ea85bc1907e6015ce06bc assets/create/models/block/cut_diorite_wall_side_tall.json 59ee053a884bc9731b4d1b01ae22e0e2b5916cfb assets/create/models/block/cut_dripstone.json +6a4b26a117f58d0187b2cc0c5b117ef71d03d4e9 assets/create/models/block/cut_dripstone_bricks.json +0bb1fa8fb9698dae61096483a01b41bf829666b0 assets/create/models/block/cut_dripstone_bricks_wall_post.json +2019fdc38b401bac72e8344d118d85049ec3efb9 assets/create/models/block/cut_dripstone_bricks_wall_side.json +ebb790b2b6f47d40c92c9bba680e82cb8f054fa9 assets/create/models/block/cut_dripstone_bricks_wall_side_tall.json 84d714b29dcb7eb95a82de8d48491413e26d5fa8 assets/create/models/block/cut_dripstone_brick_slab.json 28b0b1a641d11f8ade57c444e4c1bfd9d617f66a assets/create/models/block/cut_dripstone_brick_slab_top.json 05900c156a6341c12b366790c7e8d15e59a873f0 assets/create/models/block/cut_dripstone_brick_stairs.json 35fb2c83dc89b96951c69253f7502f78c903a9b8 assets/create/models/block/cut_dripstone_brick_stairs_inner.json f69244c1706c95aaadd32d45a24c91ce0848509f assets/create/models/block/cut_dripstone_brick_stairs_outer.json -6a4b26a117f58d0187b2cc0c5b117ef71d03d4e9 assets/create/models/block/cut_dripstone_bricks.json -0bb1fa8fb9698dae61096483a01b41bf829666b0 assets/create/models/block/cut_dripstone_bricks_wall_post.json -2019fdc38b401bac72e8344d118d85049ec3efb9 assets/create/models/block/cut_dripstone_bricks_wall_side.json -ebb790b2b6f47d40c92c9bba680e82cb8f054fa9 assets/create/models/block/cut_dripstone_bricks_wall_side_tall.json 9e42cf588f57de5166f2a2ccdae656743c8b9481 assets/create/models/block/cut_dripstone_slab.json 0da2f782d8ad8fecd81b98c72db182b817bf19eb assets/create/models/block/cut_dripstone_slab_top.json b3c903a1edcd1786ea51a2ccdad5734a1d04ea98 assets/create/models/block/cut_dripstone_stairs.json @@ -990,15 +990,15 @@ b3c903a1edcd1786ea51a2ccdad5734a1d04ea98 assets/create/models/block/cut_dripston 7fab5102d7fa4cd824b9393425639d05727b2ad2 assets/create/models/block/cut_dripstone_wall_side.json c41514cda1c9f5d942d222cbc5f6e620e367afc6 assets/create/models/block/cut_dripstone_wall_side_tall.json dff602c8d2fcd1ceca79f90ae15dbdfbd6cb157d assets/create/models/block/cut_granite.json +31c5299a42f82992e50f711e1e33549c373bd034 assets/create/models/block/cut_granite_bricks.json +ef5a851e57cc4b9c0e625176b1256441e1c17c66 assets/create/models/block/cut_granite_bricks_wall_post.json +815e8dc551c3e813b0b2af29df23a28860de0b53 assets/create/models/block/cut_granite_bricks_wall_side.json +ba241f9c82e27dd98ba6f4e4180922388ab5d1a3 assets/create/models/block/cut_granite_bricks_wall_side_tall.json 9e00dc8fcee23548c0cebda6eadbcfc559e4c20b assets/create/models/block/cut_granite_brick_slab.json 5ad061096451f74e773c3030f96d59424aa93314 assets/create/models/block/cut_granite_brick_slab_top.json 94f8ce607aae5c04ccf9e56f177f9d69203ae879 assets/create/models/block/cut_granite_brick_stairs.json 11d511844fec3bfd05cac8b788332f2decd53021 assets/create/models/block/cut_granite_brick_stairs_inner.json 418eb6a2b52e748a26c2d1914c6c1de94106589f assets/create/models/block/cut_granite_brick_stairs_outer.json -31c5299a42f82992e50f711e1e33549c373bd034 assets/create/models/block/cut_granite_bricks.json -ef5a851e57cc4b9c0e625176b1256441e1c17c66 assets/create/models/block/cut_granite_bricks_wall_post.json -815e8dc551c3e813b0b2af29df23a28860de0b53 assets/create/models/block/cut_granite_bricks_wall_side.json -ba241f9c82e27dd98ba6f4e4180922388ab5d1a3 assets/create/models/block/cut_granite_bricks_wall_side_tall.json 81be5e86cbdaec4945d3ccaf6d376f69c49f40d6 assets/create/models/block/cut_granite_slab.json f72a14e7cf3dd7d93b4462a3bee49683353dfb57 assets/create/models/block/cut_granite_slab_top.json 33bf924f01aae3a7720475f4b32b3a637e69ee36 assets/create/models/block/cut_granite_stairs.json @@ -1008,15 +1008,15 @@ fb4969e562ad2039d3bad2dc57a6845d3243d453 assets/create/models/block/cut_granite_ 2972b40134bcb15950a0118306f0251ff5e377b7 assets/create/models/block/cut_granite_wall_side.json abbe71fd17dbb5f176553db2f6edf2f1f7d8974a assets/create/models/block/cut_granite_wall_side_tall.json 019d3c4ffb39e328b5458aee44fee90e0ecbd829 assets/create/models/block/cut_limestone.json +7eae0f9766506f713933bde9f301d2f7f2bbef13 assets/create/models/block/cut_limestone_bricks.json +817e8cf8956af36c70e4b4e30b5d141086d006dd assets/create/models/block/cut_limestone_bricks_wall_post.json +1291cacff1b0980e58b5702a84c9b87ac5ef835d assets/create/models/block/cut_limestone_bricks_wall_side.json +6c9bc8803fe17ac623bde56f85683dd2ff13c33e assets/create/models/block/cut_limestone_bricks_wall_side_tall.json c93f33ba39c62b10dfb94c6e1c339cd4fbebffae assets/create/models/block/cut_limestone_brick_slab.json b12a340897ba98ed732a91dbd4129db7a7188e68 assets/create/models/block/cut_limestone_brick_slab_top.json 3e90b32d95ad1cf7b8a16dae3c16724510d41490 assets/create/models/block/cut_limestone_brick_stairs.json b2e7311667d14b2aa8c00e207f69f76207226567 assets/create/models/block/cut_limestone_brick_stairs_inner.json aac619ec1fb8aa56f1752ad3f354f9cb128771f8 assets/create/models/block/cut_limestone_brick_stairs_outer.json -7eae0f9766506f713933bde9f301d2f7f2bbef13 assets/create/models/block/cut_limestone_bricks.json -817e8cf8956af36c70e4b4e30b5d141086d006dd assets/create/models/block/cut_limestone_bricks_wall_post.json -1291cacff1b0980e58b5702a84c9b87ac5ef835d assets/create/models/block/cut_limestone_bricks_wall_side.json -6c9bc8803fe17ac623bde56f85683dd2ff13c33e assets/create/models/block/cut_limestone_bricks_wall_side_tall.json adc21af1c07edaf0573cfd2c95ebe38e50f7282c assets/create/models/block/cut_limestone_slab.json 2d1ea8fc5c8ce5549c7f7888371b6612bf0f5301 assets/create/models/block/cut_limestone_slab_top.json c1416808a2178996be75e0a9c1cd45849fcd6646 assets/create/models/block/cut_limestone_stairs.json @@ -1026,15 +1026,15 @@ c1416808a2178996be75e0a9c1cd45849fcd6646 assets/create/models/block/cut_limeston 2b5e65e662069a5c59e702224778dd407f5d11dd assets/create/models/block/cut_limestone_wall_side.json 052f130fef646242acccbbed2b510add21e18921 assets/create/models/block/cut_limestone_wall_side_tall.json 66cb6054821d45a60ae4d4d1d904dbef0b9f7c0f assets/create/models/block/cut_ochrum.json +0a7e38e3ac32352c5b3ec56a8c26212dbbb637a3 assets/create/models/block/cut_ochrum_bricks.json +47d0c58dd190f1ea894a5ca40ea7efd54a845d3e assets/create/models/block/cut_ochrum_bricks_wall_post.json +b502b5b213996bce0a626d86414045c80921511e assets/create/models/block/cut_ochrum_bricks_wall_side.json +c3f27545b3b7654c3e7a2df6b482d1a9895ccae9 assets/create/models/block/cut_ochrum_bricks_wall_side_tall.json ce16ec490ae8a33671502804e0b45fc42b6f228f assets/create/models/block/cut_ochrum_brick_slab.json fcbee94fdbd96b0b3d4aa245c6c87443abd1de90 assets/create/models/block/cut_ochrum_brick_slab_top.json 827349ed3eb05f5fe700e8f5816bcd82d0347612 assets/create/models/block/cut_ochrum_brick_stairs.json aa81d4135400eb40f891f8c41fcf7fa516ef64f1 assets/create/models/block/cut_ochrum_brick_stairs_inner.json ecd7e1cb9cae717e35eeb58dbe482833e98f5ac0 assets/create/models/block/cut_ochrum_brick_stairs_outer.json -0a7e38e3ac32352c5b3ec56a8c26212dbbb637a3 assets/create/models/block/cut_ochrum_bricks.json -47d0c58dd190f1ea894a5ca40ea7efd54a845d3e assets/create/models/block/cut_ochrum_bricks_wall_post.json -b502b5b213996bce0a626d86414045c80921511e assets/create/models/block/cut_ochrum_bricks_wall_side.json -c3f27545b3b7654c3e7a2df6b482d1a9895ccae9 assets/create/models/block/cut_ochrum_bricks_wall_side_tall.json e23998f88eb77826f5e4d58f3f4bb41a2e09ea97 assets/create/models/block/cut_ochrum_slab.json cd14f1abe3d0c65fbdd052f4a8e0b8fc2a15ad0e assets/create/models/block/cut_ochrum_slab_top.json a751feb4b609df141f971e341b204e76379dcda7 assets/create/models/block/cut_ochrum_stairs.json @@ -1044,15 +1044,15 @@ bed6843e39e7e771f6de151dfab0586d3ebad58c assets/create/models/block/cut_ochrum_s df267fb690642cac139aaabefa9eab802f13ddc1 assets/create/models/block/cut_ochrum_wall_side.json ed363b80cc61cb4d0b6fad9da855a0543ecaccc9 assets/create/models/block/cut_ochrum_wall_side_tall.json a65a54a08d9cc3b45e2320482dc2d9e317dd4f3d assets/create/models/block/cut_scorchia.json +9c93a554ab680d7c98c648c16472b52cc2646c50 assets/create/models/block/cut_scorchia_bricks.json +615dc444bb677caa774a4e95686ac24ebe4ec6dc assets/create/models/block/cut_scorchia_bricks_wall_post.json +758a2ad6677f857fbe955c26853eadc7150c105a assets/create/models/block/cut_scorchia_bricks_wall_side.json +f918dfa0751589d18a3eb054c290f669b5c61308 assets/create/models/block/cut_scorchia_bricks_wall_side_tall.json a032cf0a77e4f416ed153b1ffa834c065a73b2ae assets/create/models/block/cut_scorchia_brick_slab.json 716fc6ef58c240b3e6b45acf08d6e1472fe38e7c assets/create/models/block/cut_scorchia_brick_slab_top.json b2870e5ba7c5d5053b3639bf0aa1771ee050810b assets/create/models/block/cut_scorchia_brick_stairs.json 3e8a815eabd1991039a8ad18cedc9c57f46cd097 assets/create/models/block/cut_scorchia_brick_stairs_inner.json 0a9dc3149e7219a70642c242cd86dce5ba5cf4cc assets/create/models/block/cut_scorchia_brick_stairs_outer.json -9c93a554ab680d7c98c648c16472b52cc2646c50 assets/create/models/block/cut_scorchia_bricks.json -615dc444bb677caa774a4e95686ac24ebe4ec6dc assets/create/models/block/cut_scorchia_bricks_wall_post.json -758a2ad6677f857fbe955c26853eadc7150c105a assets/create/models/block/cut_scorchia_bricks_wall_side.json -f918dfa0751589d18a3eb054c290f669b5c61308 assets/create/models/block/cut_scorchia_bricks_wall_side_tall.json a85c4d0467c6746a8ef9c6ac0167d3e16f307d4e assets/create/models/block/cut_scorchia_slab.json 23fd6c65ea83f7ca7ef67dd7faf902c4fa662d70 assets/create/models/block/cut_scorchia_slab_top.json e42329f6fa3aeb958d2349a5442856e9473dc6b5 assets/create/models/block/cut_scorchia_stairs.json @@ -1062,15 +1062,15 @@ b9a911675861fee414f82c745399a7707c258f77 assets/create/models/block/cut_scorchia e61af066960897d50dc7f7bc17f95baa962829bd assets/create/models/block/cut_scorchia_wall_side.json 846f84efddca7d51b58ebe5e3bbed78312fb052d assets/create/models/block/cut_scorchia_wall_side_tall.json ce9dcf5b7fe58a97fab832fb98b4f5b6d3778255 assets/create/models/block/cut_scoria.json +fa3ef2bb65299c985b70f6959421e243a9ebc6d8 assets/create/models/block/cut_scoria_bricks.json +24ea1a30f68a918e6737dc8d9babe4528af5716a assets/create/models/block/cut_scoria_bricks_wall_post.json +ba7ae110d51fe510566ab42f5ead299b4409f2b7 assets/create/models/block/cut_scoria_bricks_wall_side.json +f04d12bc4e0b939bb443abcc6eb808e66c352c66 assets/create/models/block/cut_scoria_bricks_wall_side_tall.json edf04cbfb19b6ce99c1b74a71d40cd40c8120551 assets/create/models/block/cut_scoria_brick_slab.json f05725fd6d2764b277f01985d0e2fcbd3bf4a41e assets/create/models/block/cut_scoria_brick_slab_top.json 4bccbaef9dd9a8322087d3feb973e14d740ff27a assets/create/models/block/cut_scoria_brick_stairs.json 13f3b55dfdd97e68a6d525166618477e5bcb336d assets/create/models/block/cut_scoria_brick_stairs_inner.json 465862fb20542cae723fd72818be73aec05dad60 assets/create/models/block/cut_scoria_brick_stairs_outer.json -fa3ef2bb65299c985b70f6959421e243a9ebc6d8 assets/create/models/block/cut_scoria_bricks.json -24ea1a30f68a918e6737dc8d9babe4528af5716a assets/create/models/block/cut_scoria_bricks_wall_post.json -ba7ae110d51fe510566ab42f5ead299b4409f2b7 assets/create/models/block/cut_scoria_bricks_wall_side.json -f04d12bc4e0b939bb443abcc6eb808e66c352c66 assets/create/models/block/cut_scoria_bricks_wall_side_tall.json aeef239ca6b0eee527f75091d11d4a947740416d assets/create/models/block/cut_scoria_slab.json 5dfda9fa8117d35ebc324a5c9cb026e206e3b936 assets/create/models/block/cut_scoria_slab_top.json dfe8dbdb6deca69d847ee46fedfefe2da98dc329 assets/create/models/block/cut_scoria_stairs.json @@ -1080,15 +1080,15 @@ e0b2a94ff4b3f1c1e4282c9c8eecf2583bd7c68e assets/create/models/block/cut_scoria_w cf18e3fde94e3ba611f430fe527a9042a57e6936 assets/create/models/block/cut_scoria_wall_side.json 92475d7758b2bf582c585c2aafa6510f330c6f45 assets/create/models/block/cut_scoria_wall_side_tall.json 9f6543d21d9c24a429aae00511e6dbf61caf8030 assets/create/models/block/cut_tuff.json +8b3d9fe37ab7fda79ea4d90f674c525350883ba0 assets/create/models/block/cut_tuff_bricks.json +6b80481e15ff3d6eb40a42128da883c2027e0074 assets/create/models/block/cut_tuff_bricks_wall_post.json +057a34015b49565cb9858a2eea995a446ac0cfd4 assets/create/models/block/cut_tuff_bricks_wall_side.json +9f20bd04ef163076db9a8bf83c20cc802b57ae60 assets/create/models/block/cut_tuff_bricks_wall_side_tall.json 8c16599fda76c38978a2faa14f842a68fbbe4b9c assets/create/models/block/cut_tuff_brick_slab.json 696036e5900bdbb366dd49f5df71a1e701fd8ee3 assets/create/models/block/cut_tuff_brick_slab_top.json 54d4603e36be86e88d9302d61eab81e76cac1bbc assets/create/models/block/cut_tuff_brick_stairs.json 0ebb41a1ce5bf4ca86cbaf95e83cd2edf8f309ea assets/create/models/block/cut_tuff_brick_stairs_inner.json 5d5ed291db4b4bca464717c7fcde682b33d71c3f assets/create/models/block/cut_tuff_brick_stairs_outer.json -8b3d9fe37ab7fda79ea4d90f674c525350883ba0 assets/create/models/block/cut_tuff_bricks.json -6b80481e15ff3d6eb40a42128da883c2027e0074 assets/create/models/block/cut_tuff_bricks_wall_post.json -057a34015b49565cb9858a2eea995a446ac0cfd4 assets/create/models/block/cut_tuff_bricks_wall_side.json -9f20bd04ef163076db9a8bf83c20cc802b57ae60 assets/create/models/block/cut_tuff_bricks_wall_side_tall.json f2a904b7943555e8ec9dcc07513ca1ad9af809c3 assets/create/models/block/cut_tuff_slab.json ea74bb8a69f6acbd520ac8922e147495e5f99f6f assets/create/models/block/cut_tuff_slab_top.json 0262700e59de947907a04fdea9974f9d7e5a22f2 assets/create/models/block/cut_tuff_stairs.json @@ -1098,15 +1098,15 @@ ea74bb8a69f6acbd520ac8922e147495e5f99f6f assets/create/models/block/cut_tuff_sla 8c6492dc9e09359e5bac67ae4d473cffc8f93dbb assets/create/models/block/cut_tuff_wall_side.json f5f24066b6281303f52e25745881d5bca8c49c54 assets/create/models/block/cut_tuff_wall_side_tall.json 167e9a084987bcf7f67f655d0de88ae8ca2fcebb assets/create/models/block/cut_veridium.json +f8ab87c34f211a63525f6d386397face67460f8c assets/create/models/block/cut_veridium_bricks.json +e4e717fa8412032e184aebd1186470f41a2089c0 assets/create/models/block/cut_veridium_bricks_wall_post.json +8c40ccb8f10ef8dcda1bef46ad3490f697d178d2 assets/create/models/block/cut_veridium_bricks_wall_side.json +2c4671c66d904e15883ec3a14681b97ac537135c assets/create/models/block/cut_veridium_bricks_wall_side_tall.json 07c330c501375d5c316677edee80fb040c0fc237 assets/create/models/block/cut_veridium_brick_slab.json 4c8c660afe72e8ce9eaef53a37fdc63eb0c69513 assets/create/models/block/cut_veridium_brick_slab_top.json f802e4ae758e2c37c3129594ce4f5d9ffcfe173d assets/create/models/block/cut_veridium_brick_stairs.json 0d60d5cd0269e05816d28fcbbd2c680fe60cd316 assets/create/models/block/cut_veridium_brick_stairs_inner.json 22656f90b55aeaeeffa448b5f061fb26b5de7b0f assets/create/models/block/cut_veridium_brick_stairs_outer.json -f8ab87c34f211a63525f6d386397face67460f8c assets/create/models/block/cut_veridium_bricks.json -e4e717fa8412032e184aebd1186470f41a2089c0 assets/create/models/block/cut_veridium_bricks_wall_post.json -8c40ccb8f10ef8dcda1bef46ad3490f697d178d2 assets/create/models/block/cut_veridium_bricks_wall_side.json -2c4671c66d904e15883ec3a14681b97ac537135c assets/create/models/block/cut_veridium_bricks_wall_side_tall.json d736230e9b49a9fd40bc8f31df4d5144cdb429c8 assets/create/models/block/cut_veridium_slab.json 750e536c7b71dfb3a005d9b7a128ac435461e57f assets/create/models/block/cut_veridium_slab_top.json 8b05c19560e97ce15a66202717e3d32f6ee153a9 assets/create/models/block/cut_veridium_stairs.json @@ -1136,25 +1136,22 @@ db89bc32d0e466bc5008aa7091c682ba3aeec611 assets/create/models/block/diorite_pill a21387ab955f2b91e402b2189145f5fd6623592d assets/create/models/block/diorite_pillar_horizontal.json 44af455badc2b35a763007bba3537bda7d0ac289 assets/create/models/block/dripstone_pillar.json 1e23e3758e3311d0063c83742abb750a05021075 assets/create/models/block/dripstone_pillar_horizontal.json +19a773f91c58c49301f35965bac02d0c05fb2764 assets/create/models/block/exposed_copper_shingles.json a3420b91fdebec40e508a5eebb145c0201bd80c8 assets/create/models/block/exposed_copper_shingle_slab.json 4178ea5e50ee17b3c15f4a59efd019c4a19bb892 assets/create/models/block/exposed_copper_shingle_slab_top.json dd2d747774abc86e428a883e299db66cded78e11 assets/create/models/block/exposed_copper_shingle_stairs.json b6845da62d96a33cee624bb70360e256b26eda83 assets/create/models/block/exposed_copper_shingle_stairs_inner.json 3d8b758e50e75c5adc26ab6f39f9d73f00866673 assets/create/models/block/exposed_copper_shingle_stairs_outer.json -19a773f91c58c49301f35965bac02d0c05fb2764 assets/create/models/block/exposed_copper_shingles.json +9cb20c9d41629d8b9426cb65829365d10966338f assets/create/models/block/exposed_copper_tiles.json cd21d9d2935b6d0103502e2731c11ea27ff64ecf assets/create/models/block/exposed_copper_tile_slab.json 0ec039ba59fb0028183433e52131ff355ace5bff assets/create/models/block/exposed_copper_tile_slab_top.json c51dbd34996ac4513234800e427ac308067d5e1d assets/create/models/block/exposed_copper_tile_stairs.json 68772d4352dc7ade995dfa57ba41a38ef819e855 assets/create/models/block/exposed_copper_tile_stairs_inner.json d932671822ba93b71a9c8b50e7207803a1c4dbab assets/create/models/block/exposed_copper_tile_stairs_outer.json -9cb20c9d41629d8b9426cb65829365d10966338f assets/create/models/block/exposed_copper_tiles.json 2d1ade82820569936fd3021a877283474ced09d0 assets/create/models/block/fake_track.json 9e41f0b90dd1e71766c9d07bdb75d1e553f3392f assets/create/models/block/fluid_pipe/d_x.json 13507730f6ca6462c4cfeddc46e5b21e93fb1287 assets/create/models/block/fluid_pipe/d_y.json 84c09934d3537343a1226389993dabfa850b745e assets/create/models/block/fluid_pipe/d_z.json -b8fd54e514bd50fb287c6b758647818c6b08ef75 assets/create/models/block/fluid_pipe/l_x.json -e985ff9dbe7324cf69ab38e6e9e85c9b554af56c assets/create/models/block/fluid_pipe/l_y.json -e24957d63bac1e754fcc1647a4a86337a67f6298 assets/create/models/block/fluid_pipe/l_z.json eacc5ee5f164ccc7c13cfbbd37a92b401222debe assets/create/models/block/fluid_pipe/ld_x.json 33fc0ecce85fae051c54d5a538793d7081238894 assets/create/models/block/fluid_pipe/ld_y.json 638f1a259cabed1f8d63c6fdaa6d4d4dff539e7d assets/create/models/block/fluid_pipe/ld_z.json @@ -1164,21 +1161,24 @@ c52521cd566294c797312104284ddd343fad9c2e assets/create/models/block/fluid_pipe/l 99637310d3ca1ccfbe62b03aa9b0d82a0cf6f724 assets/create/models/block/fluid_pipe/lu_x.json 986800d441e95553464d1869d39baf456f5d70dc assets/create/models/block/fluid_pipe/lu_y.json 11dcf7d2dcd0df9b043035cb072deee96ab9e6da assets/create/models/block/fluid_pipe/lu_z.json -d44ff2aed71039a7d0ff913d0d9e8398e1318f39 assets/create/models/block/fluid_pipe/r_x.json -92d4044b51a90da0b2277b0613c7ca0bb80c66fe assets/create/models/block/fluid_pipe/r_y.json -fb9a23de00ef4edb4f7e24fb60de345cd12e513f assets/create/models/block/fluid_pipe/r_z.json +b8fd54e514bd50fb287c6b758647818c6b08ef75 assets/create/models/block/fluid_pipe/l_x.json +e985ff9dbe7324cf69ab38e6e9e85c9b554af56c assets/create/models/block/fluid_pipe/l_y.json +e24957d63bac1e754fcc1647a4a86337a67f6298 assets/create/models/block/fluid_pipe/l_z.json bde9ec36b86113a6ca7a51a4f405994460a2eb56 assets/create/models/block/fluid_pipe/rd_x.json bd325f5b37ff08328ddddeeceac1a41be586d20a assets/create/models/block/fluid_pipe/rd_y.json 28f351fd215af3a991ccd9aa05c57b9cd9e6f58d assets/create/models/block/fluid_pipe/rd_z.json 1ff3ea321aeacca70709eb76370c11c7f13163b6 assets/create/models/block/fluid_pipe/ru_x.json 95bc5342fd3909981430c2e13ef98cdbd8f02709 assets/create/models/block/fluid_pipe/ru_y.json e1fc0d1297a83749ac55f51c9cf33ff2ecc9fdc2 assets/create/models/block/fluid_pipe/ru_z.json -4e3debb2ba60398a0730866f781e0455f4316610 assets/create/models/block/fluid_pipe/u_x.json -0f98b30ba09706b8a5ee09aeef912b39acea0216 assets/create/models/block/fluid_pipe/u_y.json -83bf9b1af633c319c051055170debff4cc3508c0 assets/create/models/block/fluid_pipe/u_z.json +d44ff2aed71039a7d0ff913d0d9e8398e1318f39 assets/create/models/block/fluid_pipe/r_x.json +92d4044b51a90da0b2277b0613c7ca0bb80c66fe assets/create/models/block/fluid_pipe/r_y.json +fb9a23de00ef4edb4f7e24fb60de345cd12e513f assets/create/models/block/fluid_pipe/r_z.json 65a41f4b680af197776e03cae6f1815b6d04def2 assets/create/models/block/fluid_pipe/ud_x.json 26398801d89889ffe17b6513b786d27707f6a480 assets/create/models/block/fluid_pipe/ud_y.json 07747cc2b936e1b326bae7ac32a8a5ba77fdffa9 assets/create/models/block/fluid_pipe/ud_z.json +4e3debb2ba60398a0730866f781e0455f4316610 assets/create/models/block/fluid_pipe/u_x.json +0f98b30ba09706b8a5ee09aeef912b39acea0216 assets/create/models/block/fluid_pipe/u_y.json +83bf9b1af633c319c051055170debff4cc3508c0 assets/create/models/block/fluid_pipe/u_z.json 5f70af15ec2569c68a17d31024c7a37cb5c68c7e assets/create/models/block/framed_glass.json f0100e1d44146b256998fbd2af05da80d147e8d9 assets/create/models/block/framed_glass_pane_noside.json 4a032c6ae3f459e3349c2a2218da186170c31e03 assets/create/models/block/framed_glass_pane_noside_alt.json @@ -1269,6 +1269,9 @@ d1813d0f548fcddb361df7cc3b5d97582842b10f assets/create/models/block/light_gray_s debf78f20659bc3c637299a40b649cbe4aa30ebf assets/create/models/block/light_gray_table_cloth.json 4ec5d701dd8b2d8c3dc44d05f527a3d737002cd4 assets/create/models/block/light_gray_toolbox.json adb8dbed70419e0310e7a20f3656bf325b348434 assets/create/models/block/light_gray_valve_handle.json +8f53caad3899a30be5087a0ba155080834418cc0 assets/create/models/block/limestone.json +2b80f9421c2fe902d55d9bd95183ad4bae46c315 assets/create/models/block/limestone_pillar.json +fb18280a2a708f60b00cc7c675804c219784871a assets/create/models/block/limestone_pillar_horizontal.json 2f040681214af58a97e70d3a6e77a0fc2e02c624 assets/create/models/block/lime_nixie_tube.json 952d292d4dc2158e6106c5079cfa1ddb81c7777e assets/create/models/block/lime_postbox_closed.json 4357f5d9102d54c7fbe5325512a2cd42d94d6d42 assets/create/models/block/lime_postbox_open.json @@ -1277,9 +1280,6 @@ adb8dbed70419e0310e7a20f3656bf325b348434 assets/create/models/block/light_gray_v e4142a22c20d6e5b9a8b9f96c13d4e5f96adc59d assets/create/models/block/lime_table_cloth.json b92822a01e4fbed2463b1bdf7dcc736023988e20 assets/create/models/block/lime_toolbox.json 802b47f34b1053b7af980b08b6511f468e7dd7c1 assets/create/models/block/lime_valve_handle.json -8f53caad3899a30be5087a0ba155080834418cc0 assets/create/models/block/limestone.json -2b80f9421c2fe902d55d9bd95183ad4bae46c315 assets/create/models/block/limestone_pillar.json -fb18280a2a708f60b00cc7c675804c219784871a assets/create/models/block/limestone_pillar_horizontal.json 84b9ac6eafdbd037f3ff558c250a8b8952415af1 assets/create/models/block/linear_chassis.json 29ee936c09c1222c6a144e5bb39577b5a9cd28bf assets/create/models/block/linear_chassis_bottom.json a1a3804ddcb1db0a7b5c0693555f8eb326950dd0 assets/create/models/block/linear_chassis_top.json @@ -1325,18 +1325,18 @@ f9010894858512398bddd5d31b922e12594d2e3c assets/create/models/block/ornate_iron_ 92637fbd6bf54891411b32a494064b9a48e59411 assets/create/models/block/ornate_iron_window_pane_post.json 8416d497e7fc8ca4f9f4c608ccc0651036850256 assets/create/models/block/ornate_iron_window_pane_side.json 1cdaa9d4bd23f7b1eb14672dc9322d9dad966502 assets/create/models/block/ornate_iron_window_pane_side_alt.json +561beafce41b9e9c0b07bc6b7176dd4f6918c116 assets/create/models/block/oxidized_copper_shingles.json 7e0bab8109e322c6db5fe1d5999c06536c21c6eb assets/create/models/block/oxidized_copper_shingle_slab.json 42df32c4e2d1ffb2ee62748becfd1717118b440c assets/create/models/block/oxidized_copper_shingle_slab_top.json b55a733e3e68cfbd08d45bb9ac56deef9f728b60 assets/create/models/block/oxidized_copper_shingle_stairs.json 7b8745213af5aa7938fc04a295be6a087c72daa8 assets/create/models/block/oxidized_copper_shingle_stairs_inner.json d89419d48d6ee2f6747e7c93de8699db22ea3f59 assets/create/models/block/oxidized_copper_shingle_stairs_outer.json -561beafce41b9e9c0b07bc6b7176dd4f6918c116 assets/create/models/block/oxidized_copper_shingles.json +5cf92b628ff1f832966138a58ed87d747681274c assets/create/models/block/oxidized_copper_tiles.json ad6134598869711a12e2f95c9b5f25a0f7b8dd93 assets/create/models/block/oxidized_copper_tile_slab.json c17bac0fd6a20540813c6a1c000a553b7c5ac849 assets/create/models/block/oxidized_copper_tile_slab_top.json d5b30340364f5536e46bc67e777ef4fa20a36e04 assets/create/models/block/oxidized_copper_tile_stairs.json b40b315c23cbd3eb4658518bfac836f6091321a5 assets/create/models/block/oxidized_copper_tile_stairs_inner.json f4eaadab29b4f2e915237340e2d6f4aad4ba21d6 assets/create/models/block/oxidized_copper_tile_stairs_outer.json -5cf92b628ff1f832966138a58ed87d747681274c assets/create/models/block/oxidized_copper_tiles.json f8b51eec36c2eddc08a1b60894d863bb58f55625 assets/create/models/block/peculiar_bell_ceiling.json f70f83cfec770879c478eea3760ea187700f2878 assets/create/models/block/peculiar_bell_double_wall.json b9c9d00b844ca2f217ae21cc502cd4d082fed2d5 assets/create/models/block/peculiar_bell_floor.json @@ -1543,133 +1543,133 @@ ff52eb59dadfe675e416440f3115856a501428a6 assets/create/models/block/scoria.json 4d7d36f974d25a310db2f75800e8c7e0377881c6 assets/create/models/block/secondary_linear_chassis_top.json 5ecb821ac06873015d2d7ebcfb7e1f5fe85cf504 assets/create/models/block/secondary_linear_chassis_top_bottom.json e697898a0ec4c308314a4e0b7235fa0a9229da45 assets/create/models/block/shadow_steel_casing.json +73edb947b52c73e85a83422853d0b8a0fb34e82b assets/create/models/block/small_andesite_bricks.json +3bb5c8413b9e81a1adc339f873f37eb656904e06 assets/create/models/block/small_andesite_bricks_wall_post.json +0e70d94fc6ffdc0fd4a50a5910bc1455b401982f assets/create/models/block/small_andesite_bricks_wall_side.json +597fec784e40c1ff3b622824c32773d6d271f3b7 assets/create/models/block/small_andesite_bricks_wall_side_tall.json 593b962350c8de53156901b308617c6a246afa09 assets/create/models/block/small_andesite_brick_slab.json c83de8118653ccdce92a1b7f3501bf7359e0b310 assets/create/models/block/small_andesite_brick_slab_top.json f019380bcc81d52681e2beaf63e2b11836c45922 assets/create/models/block/small_andesite_brick_stairs.json 4fa72fe0115ad9ec83837852a2b2e2d22dde19ca assets/create/models/block/small_andesite_brick_stairs_inner.json f80f485f62dce86e98815b343c89e96b10623e53 assets/create/models/block/small_andesite_brick_stairs_outer.json -73edb947b52c73e85a83422853d0b8a0fb34e82b assets/create/models/block/small_andesite_bricks.json -3bb5c8413b9e81a1adc339f873f37eb656904e06 assets/create/models/block/small_andesite_bricks_wall_post.json -0e70d94fc6ffdc0fd4a50a5910bc1455b401982f assets/create/models/block/small_andesite_bricks_wall_side.json -597fec784e40c1ff3b622824c32773d6d271f3b7 assets/create/models/block/small_andesite_bricks_wall_side_tall.json +4750724972cbac6d7dac31e0689681eab6c37093 assets/create/models/block/small_asurine_bricks.json +407c7bea509bb0e9bf9f04e947ace584103d012d assets/create/models/block/small_asurine_bricks_wall_post.json +60491dfb4f2a6b78effdf18612b9a1cd7d930d8a assets/create/models/block/small_asurine_bricks_wall_side.json +e5d3172c08b65696a6d72220495463636d8b352c assets/create/models/block/small_asurine_bricks_wall_side_tall.json cdd354726eda82d83dc89871fa587b8c07b02a16 assets/create/models/block/small_asurine_brick_slab.json 7bdb6ed1e74437d083bca7d89c0d1b7c81e80b53 assets/create/models/block/small_asurine_brick_slab_top.json 086b9d4284d343967a582fd0a7d194bafd980e13 assets/create/models/block/small_asurine_brick_stairs.json db69f1580ca405b9a99f0e4ea8d9b9950ed6444e assets/create/models/block/small_asurine_brick_stairs_inner.json dd572cbff713b0f4830aef0bf3ba4adb80ee9908 assets/create/models/block/small_asurine_brick_stairs_outer.json -4750724972cbac6d7dac31e0689681eab6c37093 assets/create/models/block/small_asurine_bricks.json -407c7bea509bb0e9bf9f04e947ace584103d012d assets/create/models/block/small_asurine_bricks_wall_post.json -60491dfb4f2a6b78effdf18612b9a1cd7d930d8a assets/create/models/block/small_asurine_bricks_wall_side.json -e5d3172c08b65696a6d72220495463636d8b352c assets/create/models/block/small_asurine_bricks_wall_side_tall.json +c2c72734ac526c319cb01e982824680bfb5f1186 assets/create/models/block/small_calcite_bricks.json +f17f2ecd5e5a32f92ec0ad0ba9e861a80432c0f2 assets/create/models/block/small_calcite_bricks_wall_post.json +1ad7654125aff67267567c0007cc03b8a15131b0 assets/create/models/block/small_calcite_bricks_wall_side.json +10c339f64c0e78f4fbb7a95c10bf7f9f399c0c6b assets/create/models/block/small_calcite_bricks_wall_side_tall.json d07c57748981a54ffcdadc30ec21f728a3557bea assets/create/models/block/small_calcite_brick_slab.json 9a5e6a93328ad35b256b2512c28e683a74e807a9 assets/create/models/block/small_calcite_brick_slab_top.json c3d39e013dd0142f044f8f0a90de849a0d961e84 assets/create/models/block/small_calcite_brick_stairs.json 4e47a4708dafc0ea476e2d5b6567acfdc2c5c148 assets/create/models/block/small_calcite_brick_stairs_inner.json 6a41c44680a958299a787d8c8c8778d52167cd65 assets/create/models/block/small_calcite_brick_stairs_outer.json -c2c72734ac526c319cb01e982824680bfb5f1186 assets/create/models/block/small_calcite_bricks.json -f17f2ecd5e5a32f92ec0ad0ba9e861a80432c0f2 assets/create/models/block/small_calcite_bricks_wall_post.json -1ad7654125aff67267567c0007cc03b8a15131b0 assets/create/models/block/small_calcite_bricks_wall_side.json -10c339f64c0e78f4fbb7a95c10bf7f9f399c0c6b assets/create/models/block/small_calcite_bricks_wall_side_tall.json +485f6c0e37b24124ff23efa3f0caa2cfe85663dd assets/create/models/block/small_crimsite_bricks.json +57b050751e68c9a881d9598cfe8dfb45f19df08c assets/create/models/block/small_crimsite_bricks_wall_post.json +cb01f90c7ac1f56a6f79e1fecb126c349b6d53b0 assets/create/models/block/small_crimsite_bricks_wall_side.json +80932617b1d4b718071c1f8558398ba881743892 assets/create/models/block/small_crimsite_bricks_wall_side_tall.json 827867ddd9b5f6e2daa916c968531c7183ce7fa2 assets/create/models/block/small_crimsite_brick_slab.json dd19ebdbd1a2de827d467b0abd2d1d3ee5822305 assets/create/models/block/small_crimsite_brick_slab_top.json 58048cb41b740b008a98420ea93b567f38e2910f assets/create/models/block/small_crimsite_brick_stairs.json a943586885ea7d48fc27595d9741f97d852446e7 assets/create/models/block/small_crimsite_brick_stairs_inner.json 8dc173b8a9912341ccb9cd8c9a0d2d893571eb85 assets/create/models/block/small_crimsite_brick_stairs_outer.json -485f6c0e37b24124ff23efa3f0caa2cfe85663dd assets/create/models/block/small_crimsite_bricks.json -57b050751e68c9a881d9598cfe8dfb45f19df08c assets/create/models/block/small_crimsite_bricks_wall_post.json -cb01f90c7ac1f56a6f79e1fecb126c349b6d53b0 assets/create/models/block/small_crimsite_bricks_wall_side.json -80932617b1d4b718071c1f8558398ba881743892 assets/create/models/block/small_crimsite_bricks_wall_side_tall.json +cd855b25c38be2c36dcbf6ab0d963a2c76043171 assets/create/models/block/small_deepslate_bricks.json +88a6c43f64c6d53b34719f41707622635108342b assets/create/models/block/small_deepslate_bricks_wall_post.json +dea1773ca9baf9e1a6a7a4288d348127b858c42d assets/create/models/block/small_deepslate_bricks_wall_side.json +673ab543b38a597fd74285cd25b8004c9e2bd706 assets/create/models/block/small_deepslate_bricks_wall_side_tall.json 67c78a3e9250351d0ea18538640b596f05e957a4 assets/create/models/block/small_deepslate_brick_slab.json bc1af783fbcbe73df05e12c93625035db8089d16 assets/create/models/block/small_deepslate_brick_slab_top.json 91e00675337592d17a04032808ca64c4a159c814 assets/create/models/block/small_deepslate_brick_stairs.json 39e78262242637628628a07dc47908fb1593d3f2 assets/create/models/block/small_deepslate_brick_stairs_inner.json d7a61bc4c84070e0fd53e0957a5282078daff7f1 assets/create/models/block/small_deepslate_brick_stairs_outer.json -cd855b25c38be2c36dcbf6ab0d963a2c76043171 assets/create/models/block/small_deepslate_bricks.json -88a6c43f64c6d53b34719f41707622635108342b assets/create/models/block/small_deepslate_bricks_wall_post.json -dea1773ca9baf9e1a6a7a4288d348127b858c42d assets/create/models/block/small_deepslate_bricks_wall_side.json -673ab543b38a597fd74285cd25b8004c9e2bd706 assets/create/models/block/small_deepslate_bricks_wall_side_tall.json +73e801fb607d76b42e1862323e9d149910a68298 assets/create/models/block/small_diorite_bricks.json +2bdb593d3ae4d856e96cc877f4927da25841af54 assets/create/models/block/small_diorite_bricks_wall_post.json +dd064be7962a2418784a513725fc7b5835e4ab40 assets/create/models/block/small_diorite_bricks_wall_side.json +3753c64785d74f1997b9f8f856fa873302621f39 assets/create/models/block/small_diorite_bricks_wall_side_tall.json 59fc1d9dac0b6867779346413953174fc6b55d3c assets/create/models/block/small_diorite_brick_slab.json cbd6fe711e1203aa746d86d12bb85016b7142749 assets/create/models/block/small_diorite_brick_slab_top.json a6c823fa96ba8a06d101ca96a6898fe8a1faf83e assets/create/models/block/small_diorite_brick_stairs.json 7f128501d989122df9d2ab002a497356831caa1c assets/create/models/block/small_diorite_brick_stairs_inner.json 26222975b0efb2acea6473d0bcc99453aa9ed561 assets/create/models/block/small_diorite_brick_stairs_outer.json -73e801fb607d76b42e1862323e9d149910a68298 assets/create/models/block/small_diorite_bricks.json -2bdb593d3ae4d856e96cc877f4927da25841af54 assets/create/models/block/small_diorite_bricks_wall_post.json -dd064be7962a2418784a513725fc7b5835e4ab40 assets/create/models/block/small_diorite_bricks_wall_side.json -3753c64785d74f1997b9f8f856fa873302621f39 assets/create/models/block/small_diorite_bricks_wall_side_tall.json +7f55f9c8cae6a79a9ab22a4b593a2c5829390573 assets/create/models/block/small_dripstone_bricks.json +fd0880b2e55435c8dc6945fa71c67ba34d7b1e69 assets/create/models/block/small_dripstone_bricks_wall_post.json +c00e9c0bfb108b70975514694f38d3c4cd63e819 assets/create/models/block/small_dripstone_bricks_wall_side.json +26382c01766e04cfe7ea585cabc1baa1c409e0a0 assets/create/models/block/small_dripstone_bricks_wall_side_tall.json 7b18bb56d4509f490a73b2812a8e40333f400369 assets/create/models/block/small_dripstone_brick_slab.json 39b7aa7d1494e5328e8774acb8adec8a346e972f assets/create/models/block/small_dripstone_brick_slab_top.json 3d265aed7a723713d525d0fabf3a70600d9d60e4 assets/create/models/block/small_dripstone_brick_stairs.json 2be41e9c1367af7f0eb99856e35900df96974bd4 assets/create/models/block/small_dripstone_brick_stairs_inner.json 4026a9327d47d55218b00b0b4b92464b6448ad91 assets/create/models/block/small_dripstone_brick_stairs_outer.json -7f55f9c8cae6a79a9ab22a4b593a2c5829390573 assets/create/models/block/small_dripstone_bricks.json -fd0880b2e55435c8dc6945fa71c67ba34d7b1e69 assets/create/models/block/small_dripstone_bricks_wall_post.json -c00e9c0bfb108b70975514694f38d3c4cd63e819 assets/create/models/block/small_dripstone_bricks_wall_side.json -26382c01766e04cfe7ea585cabc1baa1c409e0a0 assets/create/models/block/small_dripstone_bricks_wall_side_tall.json +ad4cf29e0e67d0d202d5836486531551909c71bf assets/create/models/block/small_granite_bricks.json +d20963cbb5d2321a069bf42d203855a5584f8607 assets/create/models/block/small_granite_bricks_wall_post.json +b860879b66d2d23349fa95ff644d9eba21eb29bd assets/create/models/block/small_granite_bricks_wall_side.json +11593a2a0e307b3e1d847c84d8c61bc78fef2967 assets/create/models/block/small_granite_bricks_wall_side_tall.json cb0a72cedb6b2b043eaf8c8869648802d74a2eeb assets/create/models/block/small_granite_brick_slab.json d635840492541787d55cc005c7e207532edcdef3 assets/create/models/block/small_granite_brick_slab_top.json ba9bfedf5854fccaba8a5e60c26efb6e34ede3cd assets/create/models/block/small_granite_brick_stairs.json 9bebe59176e74926e28a139dc557c25283285e89 assets/create/models/block/small_granite_brick_stairs_inner.json 15d71900e76c131285447628e63bf1479ce7025a assets/create/models/block/small_granite_brick_stairs_outer.json -ad4cf29e0e67d0d202d5836486531551909c71bf assets/create/models/block/small_granite_bricks.json -d20963cbb5d2321a069bf42d203855a5584f8607 assets/create/models/block/small_granite_bricks_wall_post.json -b860879b66d2d23349fa95ff644d9eba21eb29bd assets/create/models/block/small_granite_bricks_wall_side.json -11593a2a0e307b3e1d847c84d8c61bc78fef2967 assets/create/models/block/small_granite_bricks_wall_side_tall.json +6224f2763224d3e746dafdaaf14fae68e2469b93 assets/create/models/block/small_limestone_bricks.json +ca038e240e4157897a6273692db2c952ab5b17d7 assets/create/models/block/small_limestone_bricks_wall_post.json +7920f8cfda77b22d4d29638faa6ae07d89e51ab3 assets/create/models/block/small_limestone_bricks_wall_side.json +6e1fa27744f4592111945e5cafee6d7d67b5299b assets/create/models/block/small_limestone_bricks_wall_side_tall.json 0e0f551bac87421e6b693aa9ca98fd5da2ee168b assets/create/models/block/small_limestone_brick_slab.json 6669c1e87ed79097f96e7e46eecf3ab6e7c9778c assets/create/models/block/small_limestone_brick_slab_top.json 5aff0145d2fc89549ac541db325dda25b8941583 assets/create/models/block/small_limestone_brick_stairs.json 250aa2c237a9532b19621fa604027433183961c3 assets/create/models/block/small_limestone_brick_stairs_inner.json 92da57d330e9905d017705dd931af1d1d6c1a00d assets/create/models/block/small_limestone_brick_stairs_outer.json -6224f2763224d3e746dafdaaf14fae68e2469b93 assets/create/models/block/small_limestone_bricks.json -ca038e240e4157897a6273692db2c952ab5b17d7 assets/create/models/block/small_limestone_bricks_wall_post.json -7920f8cfda77b22d4d29638faa6ae07d89e51ab3 assets/create/models/block/small_limestone_bricks_wall_side.json -6e1fa27744f4592111945e5cafee6d7d67b5299b assets/create/models/block/small_limestone_bricks_wall_side_tall.json +242e4f39f6df26917f21899f0c7d0415a166d4b9 assets/create/models/block/small_ochrum_bricks.json +06cb9faca0062947c08b2a7309a958aac5ab24ac assets/create/models/block/small_ochrum_bricks_wall_post.json +8d9d53206e222839333026c779b66b9fd8cf2cf9 assets/create/models/block/small_ochrum_bricks_wall_side.json +f412fbaa509f7b2d47a27d4bcb13590bfcae74ca assets/create/models/block/small_ochrum_bricks_wall_side_tall.json 517e3605a9e86a07c673e18d94c2c37109a2aef5 assets/create/models/block/small_ochrum_brick_slab.json 855ad9f6fe03ceb2cc33d9df3536cb4394acfa9b assets/create/models/block/small_ochrum_brick_slab_top.json c5fc35d6b0fe96c11537bc10d34a63ef80f3270c assets/create/models/block/small_ochrum_brick_stairs.json 9a2631d9f6821d2c01bc8b2588a69702d3b083cc assets/create/models/block/small_ochrum_brick_stairs_inner.json 1f0ccdef29dae18535ea304e954e06c91bb0620b assets/create/models/block/small_ochrum_brick_stairs_outer.json -242e4f39f6df26917f21899f0c7d0415a166d4b9 assets/create/models/block/small_ochrum_bricks.json -06cb9faca0062947c08b2a7309a958aac5ab24ac assets/create/models/block/small_ochrum_bricks_wall_post.json -8d9d53206e222839333026c779b66b9fd8cf2cf9 assets/create/models/block/small_ochrum_bricks_wall_side.json -f412fbaa509f7b2d47a27d4bcb13590bfcae74ca assets/create/models/block/small_ochrum_bricks_wall_side_tall.json be96f070be1f838c6fb442c164b5f9b4e5cfcee5 assets/create/models/block/small_rose_quartz_tiles.json +41e56d8e334b81a0d5270bdbe87617981e1f98b4 assets/create/models/block/small_scorchia_bricks.json +56aa81e05019533ce0e0f1ee3ef7bf20fcc400b4 assets/create/models/block/small_scorchia_bricks_wall_post.json +1e1fa90c8b144813770c4d53a3b734ae450895d6 assets/create/models/block/small_scorchia_bricks_wall_side.json +6a46cf73c03a2abea25a81dbb28f4150b355900c assets/create/models/block/small_scorchia_bricks_wall_side_tall.json 6aa3825ace2e73bec454aaa8597e3a892ee29eb7 assets/create/models/block/small_scorchia_brick_slab.json f0378625001171c449a403e372e59623f0fc6569 assets/create/models/block/small_scorchia_brick_slab_top.json 49fa4a3940f84902319df257d39812eb71c8a9e2 assets/create/models/block/small_scorchia_brick_stairs.json 4dee6e6dbe6a98a8eaa04f6812f322343f62fca1 assets/create/models/block/small_scorchia_brick_stairs_inner.json 8a19e7e5c03c155c9ef9332486ae0b069dea0502 assets/create/models/block/small_scorchia_brick_stairs_outer.json -41e56d8e334b81a0d5270bdbe87617981e1f98b4 assets/create/models/block/small_scorchia_bricks.json -56aa81e05019533ce0e0f1ee3ef7bf20fcc400b4 assets/create/models/block/small_scorchia_bricks_wall_post.json -1e1fa90c8b144813770c4d53a3b734ae450895d6 assets/create/models/block/small_scorchia_bricks_wall_side.json -6a46cf73c03a2abea25a81dbb28f4150b355900c assets/create/models/block/small_scorchia_bricks_wall_side_tall.json +6b435123d852579ba8467c4915cd5d0adaadeca0 assets/create/models/block/small_scoria_bricks.json +86b243074845ca66916ce96ef3774862cf9a39d4 assets/create/models/block/small_scoria_bricks_wall_post.json +57ccb3efbdc4a69cad60c8b90321338ba2e68321 assets/create/models/block/small_scoria_bricks_wall_side.json +d4c5398e10b25d2dc3cb3754a449fc2b60e4074f assets/create/models/block/small_scoria_bricks_wall_side_tall.json 918351c1270c26932c0c4783543779a25ca7e986 assets/create/models/block/small_scoria_brick_slab.json 4138e756b4b36f227e178acbcc233edb082ae603 assets/create/models/block/small_scoria_brick_slab_top.json b8e70cd7d9acdcf91be9783cd91d70275a006ea2 assets/create/models/block/small_scoria_brick_stairs.json 625bfbd58440ea4e270d57cc748f2b5f6cece63b assets/create/models/block/small_scoria_brick_stairs_inner.json 602a46fb2736acb8c50b0d04222e6c33e52dee87 assets/create/models/block/small_scoria_brick_stairs_outer.json -6b435123d852579ba8467c4915cd5d0adaadeca0 assets/create/models/block/small_scoria_bricks.json -86b243074845ca66916ce96ef3774862cf9a39d4 assets/create/models/block/small_scoria_bricks_wall_post.json -57ccb3efbdc4a69cad60c8b90321338ba2e68321 assets/create/models/block/small_scoria_bricks_wall_side.json -d4c5398e10b25d2dc3cb3754a449fc2b60e4074f assets/create/models/block/small_scoria_bricks_wall_side_tall.json +a8e8c633dfb6d9f14425b1fd28e88ecf08a88cc6 assets/create/models/block/small_tuff_bricks.json +1c3a22bed504cd7a7e507e83ee21399f8a3fb299 assets/create/models/block/small_tuff_bricks_wall_post.json +1aeb8cac7d0178a18ac1cf98c9a45ca8e67514b0 assets/create/models/block/small_tuff_bricks_wall_side.json +4c6b5c7c60ec4cad314064b171413a3e866e5f99 assets/create/models/block/small_tuff_bricks_wall_side_tall.json 6b2c4d8c8609de0d3d6ce1e30b1dd26ba59cb86d assets/create/models/block/small_tuff_brick_slab.json 1ba07367fcba6a3914f1703115304a7c19979542 assets/create/models/block/small_tuff_brick_slab_top.json 1a5ab239d0f2f041ee04005ceb60111e6848f5de assets/create/models/block/small_tuff_brick_stairs.json be3ee2c36f85a534a71d42a7d63a7816945b3c30 assets/create/models/block/small_tuff_brick_stairs_inner.json aa84e448041d5f74c75565f5e409b1e9b7e5155d assets/create/models/block/small_tuff_brick_stairs_outer.json -a8e8c633dfb6d9f14425b1fd28e88ecf08a88cc6 assets/create/models/block/small_tuff_bricks.json -1c3a22bed504cd7a7e507e83ee21399f8a3fb299 assets/create/models/block/small_tuff_bricks_wall_post.json -1aeb8cac7d0178a18ac1cf98c9a45ca8e67514b0 assets/create/models/block/small_tuff_bricks_wall_side.json -4c6b5c7c60ec4cad314064b171413a3e866e5f99 assets/create/models/block/small_tuff_bricks_wall_side_tall.json +e9c75f1b4b663dce09b0a2f8282e574839c19d06 assets/create/models/block/small_veridium_bricks.json +725f6d3dbcfb469cede6fb27a98c1f398f3f3c8c assets/create/models/block/small_veridium_bricks_wall_post.json +b33ee496d43e315a5bed5eaabfd553e361fec1a9 assets/create/models/block/small_veridium_bricks_wall_side.json +80e950f93def51d82a63848b1fb6ac11600ab1bf assets/create/models/block/small_veridium_bricks_wall_side_tall.json 30b150fe3cf9bdb6ee32cd6b0f51179b44be57d3 assets/create/models/block/small_veridium_brick_slab.json 2158dd9e71f6f60e5132105c68a41ad6e3927438 assets/create/models/block/small_veridium_brick_slab_top.json bbbfc8e3696945ed1f6c3afe73ae0745ff8deda1 assets/create/models/block/small_veridium_brick_stairs.json fc3a996b0ca01c2c09ad84b881c46e92918d084f assets/create/models/block/small_veridium_brick_stairs_inner.json e27a77984e8e28e6032f26bb010efcadfaeb5407 assets/create/models/block/small_veridium_brick_stairs_outer.json -e9c75f1b4b663dce09b0a2f8282e574839c19d06 assets/create/models/block/small_veridium_bricks.json -725f6d3dbcfb469cede6fb27a98c1f398f3f3c8c assets/create/models/block/small_veridium_bricks_wall_post.json -b33ee496d43e315a5bed5eaabfd553e361fec1a9 assets/create/models/block/small_veridium_bricks_wall_side.json -80e950f93def51d82a63848b1fb6ac11600ab1bf assets/create/models/block/small_veridium_bricks_wall_side_tall.json d7c1c2679c8ba543ae7be3b9cf3f4eea3c1a2f68 assets/create/models/block/spruce_window.json f4a4fbb9eea6fb1d0633e349eae6acdaf329e8d5 assets/create/models/block/spruce_window_pane_noside.json 02a25202a42debcd2b4aaa4113e3de4f8f6ee47c assets/create/models/block/spruce_window_pane_noside_alt.json @@ -1736,66 +1736,66 @@ e84875a4eb11e2161a93ec7569aa2ac1c2f60cef assets/create/models/block/warped_windo 378c865ff8213ff56f1f7a4b2d9cf26c71f036e8 assets/create/models/block/warped_window_pane_post.json f320de08cb113a9ad17acd2ebb8dfc57759e4f7d assets/create/models/block/warped_window_pane_side.json 2fc182d9697b5cddd93b01d1236931af27eee8fe assets/create/models/block/warped_window_pane_side_alt.json +32fdb85b5b62d5a0fb41732874c854788cdd2ba1 assets/create/models/block/waxed_copper_shingles.json fb7fb6deebd502946ab57f1b8a9f4a6b5dd48da3 assets/create/models/block/waxed_copper_shingle_slab.json 660f61112b8e46dec5050cb0ed4ee936965a7c58 assets/create/models/block/waxed_copper_shingle_slab_top.json 5d74be967bbe9feba4b630751f13af817a733d1d assets/create/models/block/waxed_copper_shingle_stairs.json 35cb89f29ce3f8d8af13602c08ecd7afbb7cf56a assets/create/models/block/waxed_copper_shingle_stairs_inner.json fcb9295f4f388e6d439ec9a3906ca326b6d69077 assets/create/models/block/waxed_copper_shingle_stairs_outer.json -32fdb85b5b62d5a0fb41732874c854788cdd2ba1 assets/create/models/block/waxed_copper_shingles.json +32f06f39d0b34e4431795aa6e64f87e58dc1597b assets/create/models/block/waxed_copper_tiles.json 298c6100de02ed9f813397d8ba38c46f35035c69 assets/create/models/block/waxed_copper_tile_slab.json d4422c2d96fb329087d1be70d8b983a8cf6c7f01 assets/create/models/block/waxed_copper_tile_slab_top.json fca72048f916d3a3e567b385c948cc1b59711ef4 assets/create/models/block/waxed_copper_tile_stairs.json 997479b62ed3d81ab633279ecc2fabd9588a3bf3 assets/create/models/block/waxed_copper_tile_stairs_inner.json d5c5bbfb9aaa282e11ad6e6309b1880b172ee653 assets/create/models/block/waxed_copper_tile_stairs_outer.json -32f06f39d0b34e4431795aa6e64f87e58dc1597b assets/create/models/block/waxed_copper_tiles.json +19a773f91c58c49301f35965bac02d0c05fb2764 assets/create/models/block/waxed_exposed_copper_shingles.json a3420b91fdebec40e508a5eebb145c0201bd80c8 assets/create/models/block/waxed_exposed_copper_shingle_slab.json 4178ea5e50ee17b3c15f4a59efd019c4a19bb892 assets/create/models/block/waxed_exposed_copper_shingle_slab_top.json dd2d747774abc86e428a883e299db66cded78e11 assets/create/models/block/waxed_exposed_copper_shingle_stairs.json b6845da62d96a33cee624bb70360e256b26eda83 assets/create/models/block/waxed_exposed_copper_shingle_stairs_inner.json 3d8b758e50e75c5adc26ab6f39f9d73f00866673 assets/create/models/block/waxed_exposed_copper_shingle_stairs_outer.json -19a773f91c58c49301f35965bac02d0c05fb2764 assets/create/models/block/waxed_exposed_copper_shingles.json +9cb20c9d41629d8b9426cb65829365d10966338f assets/create/models/block/waxed_exposed_copper_tiles.json cd21d9d2935b6d0103502e2731c11ea27ff64ecf assets/create/models/block/waxed_exposed_copper_tile_slab.json 0ec039ba59fb0028183433e52131ff355ace5bff assets/create/models/block/waxed_exposed_copper_tile_slab_top.json c51dbd34996ac4513234800e427ac308067d5e1d assets/create/models/block/waxed_exposed_copper_tile_stairs.json 68772d4352dc7ade995dfa57ba41a38ef819e855 assets/create/models/block/waxed_exposed_copper_tile_stairs_inner.json d932671822ba93b71a9c8b50e7207803a1c4dbab assets/create/models/block/waxed_exposed_copper_tile_stairs_outer.json -9cb20c9d41629d8b9426cb65829365d10966338f assets/create/models/block/waxed_exposed_copper_tiles.json +561beafce41b9e9c0b07bc6b7176dd4f6918c116 assets/create/models/block/waxed_oxidized_copper_shingles.json 7e0bab8109e322c6db5fe1d5999c06536c21c6eb assets/create/models/block/waxed_oxidized_copper_shingle_slab.json 42df32c4e2d1ffb2ee62748becfd1717118b440c assets/create/models/block/waxed_oxidized_copper_shingle_slab_top.json b55a733e3e68cfbd08d45bb9ac56deef9f728b60 assets/create/models/block/waxed_oxidized_copper_shingle_stairs.json 7b8745213af5aa7938fc04a295be6a087c72daa8 assets/create/models/block/waxed_oxidized_copper_shingle_stairs_inner.json d89419d48d6ee2f6747e7c93de8699db22ea3f59 assets/create/models/block/waxed_oxidized_copper_shingle_stairs_outer.json -561beafce41b9e9c0b07bc6b7176dd4f6918c116 assets/create/models/block/waxed_oxidized_copper_shingles.json +5cf92b628ff1f832966138a58ed87d747681274c assets/create/models/block/waxed_oxidized_copper_tiles.json ad6134598869711a12e2f95c9b5f25a0f7b8dd93 assets/create/models/block/waxed_oxidized_copper_tile_slab.json c17bac0fd6a20540813c6a1c000a553b7c5ac849 assets/create/models/block/waxed_oxidized_copper_tile_slab_top.json d5b30340364f5536e46bc67e777ef4fa20a36e04 assets/create/models/block/waxed_oxidized_copper_tile_stairs.json b40b315c23cbd3eb4658518bfac836f6091321a5 assets/create/models/block/waxed_oxidized_copper_tile_stairs_inner.json f4eaadab29b4f2e915237340e2d6f4aad4ba21d6 assets/create/models/block/waxed_oxidized_copper_tile_stairs_outer.json -5cf92b628ff1f832966138a58ed87d747681274c assets/create/models/block/waxed_oxidized_copper_tiles.json +9c73020e80c31cd710c218f9699ba9a795758ad0 assets/create/models/block/waxed_weathered_copper_shingles.json 897cfc177b073ca1bcb635c74108567f8748b5c4 assets/create/models/block/waxed_weathered_copper_shingle_slab.json efa57ba131c27e0064c0d958e69b10530a26ac41 assets/create/models/block/waxed_weathered_copper_shingle_slab_top.json 4ef11a7e3de630ad46b9179e8a9a34d55202f6c5 assets/create/models/block/waxed_weathered_copper_shingle_stairs.json f32a18c76cfaca2153f6321880a8da1347be37ce assets/create/models/block/waxed_weathered_copper_shingle_stairs_inner.json 9637f78e51ca7ed812e4c64c52e08f6fa0adbfc3 assets/create/models/block/waxed_weathered_copper_shingle_stairs_outer.json -9c73020e80c31cd710c218f9699ba9a795758ad0 assets/create/models/block/waxed_weathered_copper_shingles.json +9782a25341dd2ffb146430edbe6916932250c326 assets/create/models/block/waxed_weathered_copper_tiles.json 0c9669588972d4c2152bd2b043b8386b76a6e1c4 assets/create/models/block/waxed_weathered_copper_tile_slab.json 2d01a583cc948e9e0cb814cad968ed16a07dd46c assets/create/models/block/waxed_weathered_copper_tile_slab_top.json e26dd64495ff8801593e9c22203cbf364075badd assets/create/models/block/waxed_weathered_copper_tile_stairs.json b658c1022587bd670b5acee267607719c1544332 assets/create/models/block/waxed_weathered_copper_tile_stairs_inner.json e7ae89577be9d26a071bf96cbd7ed80293902b63 assets/create/models/block/waxed_weathered_copper_tile_stairs_outer.json -9782a25341dd2ffb146430edbe6916932250c326 assets/create/models/block/waxed_weathered_copper_tiles.json +9c73020e80c31cd710c218f9699ba9a795758ad0 assets/create/models/block/weathered_copper_shingles.json 897cfc177b073ca1bcb635c74108567f8748b5c4 assets/create/models/block/weathered_copper_shingle_slab.json efa57ba131c27e0064c0d958e69b10530a26ac41 assets/create/models/block/weathered_copper_shingle_slab_top.json 4ef11a7e3de630ad46b9179e8a9a34d55202f6c5 assets/create/models/block/weathered_copper_shingle_stairs.json f32a18c76cfaca2153f6321880a8da1347be37ce assets/create/models/block/weathered_copper_shingle_stairs_inner.json 9637f78e51ca7ed812e4c64c52e08f6fa0adbfc3 assets/create/models/block/weathered_copper_shingle_stairs_outer.json -9c73020e80c31cd710c218f9699ba9a795758ad0 assets/create/models/block/weathered_copper_shingles.json +9782a25341dd2ffb146430edbe6916932250c326 assets/create/models/block/weathered_copper_tiles.json 0c9669588972d4c2152bd2b043b8386b76a6e1c4 assets/create/models/block/weathered_copper_tile_slab.json 2d01a583cc948e9e0cb814cad968ed16a07dd46c assets/create/models/block/weathered_copper_tile_slab_top.json e26dd64495ff8801593e9c22203cbf364075badd assets/create/models/block/weathered_copper_tile_stairs.json b658c1022587bd670b5acee267607719c1544332 assets/create/models/block/weathered_copper_tile_stairs_inner.json e7ae89577be9d26a071bf96cbd7ed80293902b63 assets/create/models/block/weathered_copper_tile_stairs_outer.json -9782a25341dd2ffb146430edbe6916932250c326 assets/create/models/block/weathered_copper_tiles.json 045b812ddb1ca8dd6cd9b49852ddbd37f86cd2a6 assets/create/models/block/weathered_iron_block.json a569ddd725898a86f8745e46723edeff7fe7f2e9 assets/create/models/block/weathered_iron_window_1.json 133928d853037efb81022b69377669f0b16239bc assets/create/models/block/weathered_iron_window_2.json @@ -1971,13 +1971,13 @@ aaac7663d062731433c920d94a24b9b3a521dd8c assets/create/models/item/copper_bars.j ccdf08652511e5737a8489d86ea9422ade4f4ca5 assets/create/models/item/copper_nugget.json 86a770e9b2af1f19bf633f5cfeecd84848f73fbd assets/create/models/item/copper_scaffolding.json a4fd2f4f00e03b2ac5d863e93827d39a984cc2ff assets/create/models/item/copper_sheet.json +13b18ba2938e283d507fbca70518cf52198cdc71 assets/create/models/item/copper_shingles.json 79d9f8667965072f12e51e6601b5c36f8acc125f assets/create/models/item/copper_shingle_slab.json 9fe6f0bdea4595b403ed2d2cbc2023a9abeb79f0 assets/create/models/item/copper_shingle_stairs.json -13b18ba2938e283d507fbca70518cf52198cdc71 assets/create/models/item/copper_shingles.json 9a33eeb0f7c682ee2f8c0abbfa174f8828acc2b5 assets/create/models/item/copper_table_cloth.json +19642e4ea5deecaf57059827c4c13a19d2e73822 assets/create/models/item/copper_tiles.json a7147444fc28a4cce21b6cf38e9528537e27c352 assets/create/models/item/copper_tile_slab.json 7330324d6c64f0340d676ecef83a930515d9130e assets/create/models/item/copper_tile_stairs.json -19642e4ea5deecaf57059827c4c13a19d2e73822 assets/create/models/item/copper_tiles.json 08c35e85afe4eb2b106133c5d9c7d7c64ca9a915 assets/create/models/item/copper_valve_handle.json 5cec229a3117ea5987aa42288c070427ac48a5dc assets/create/models/item/copycat_panel.json 1b6707005830ca066a7e997c73391ca88c70bdb0 assets/create/models/item/copycat_step.json @@ -2007,114 +2007,114 @@ b6acd86be9e6cac8b9ed2bc6297d27941ca05f46 assets/create/models/item/crushed_raw_z b67e95801010eab58de02f2b0160bff3f008bd18 assets/create/models/item/crushing_wheel.json af189b0c04482064520d84546d81af8154824292 assets/create/models/item/cuckoo_clock.json 314fb287c7b16a6478fbefde0da80de8828b684e assets/create/models/item/cut_andesite.json +e2840073eac2e6419cd312b3d0177d4c64a5346c assets/create/models/item/cut_andesite_bricks.json 680fe77d50f7c3253ec4997f74761f962b784e15 assets/create/models/item/cut_andesite_brick_slab.json 3c1d56f9686bb2b97c168b0509ddfd06e80be9a0 assets/create/models/item/cut_andesite_brick_stairs.json 4222b965f8a18f78b92838e4642a28fa3e0ad648 assets/create/models/item/cut_andesite_brick_wall.json -e2840073eac2e6419cd312b3d0177d4c64a5346c assets/create/models/item/cut_andesite_bricks.json c100e02ef9b05f4f6df3ddbbfe91db1032d4854b assets/create/models/item/cut_andesite_slab.json f435a67b3d89d12b6e8cb5071a67e35f0918dc79 assets/create/models/item/cut_andesite_stairs.json df9084d532a085220280bc7bee579e1079fbf786 assets/create/models/item/cut_andesite_wall.json 025eedca45b222b91d93b9a3a89fac5ad328b152 assets/create/models/item/cut_asurine.json +1ceb483f428448f00a08541fbcf4f4787aef3f1e assets/create/models/item/cut_asurine_bricks.json 022c56e7aafa7ca4cdd1a88426eb43f9e02c3cc2 assets/create/models/item/cut_asurine_brick_slab.json 3131e09a221c2f0a17cfc7277603f2e3c8164bc7 assets/create/models/item/cut_asurine_brick_stairs.json dc1f5f03acc1165606c48df97953164f6bd7f092 assets/create/models/item/cut_asurine_brick_wall.json -1ceb483f428448f00a08541fbcf4f4787aef3f1e assets/create/models/item/cut_asurine_bricks.json e81d7df1f1b8281c38400713b09cbac59c4d53cc assets/create/models/item/cut_asurine_slab.json cf534603fe71423e0ab80d431ab12394d0a6bb21 assets/create/models/item/cut_asurine_stairs.json 7ca803f5a7798ea034db6385a5f36a48e235c247 assets/create/models/item/cut_asurine_wall.json 707fb799ca44280cad0b817f29a7c75dd0f0ce5e assets/create/models/item/cut_calcite.json +5678b9f76823efac2c6624acc7b2b911402112f4 assets/create/models/item/cut_calcite_bricks.json f794423b242228c43345dc1f40653133fb7f3db6 assets/create/models/item/cut_calcite_brick_slab.json 8e9b46e52758ec7f21c3b84c212e2f6565bf71d9 assets/create/models/item/cut_calcite_brick_stairs.json 1447d21b7fc331528bfd15e5b9d694eb1a31cfb3 assets/create/models/item/cut_calcite_brick_wall.json -5678b9f76823efac2c6624acc7b2b911402112f4 assets/create/models/item/cut_calcite_bricks.json c78c99c78a19097d890414b21270014b52bafd8d assets/create/models/item/cut_calcite_slab.json e6a9144a4bb9e5af3f57d0acdb26d66dc4547217 assets/create/models/item/cut_calcite_stairs.json daf2a2513f6636d140c23b90ba87aad35476c498 assets/create/models/item/cut_calcite_wall.json 29f2bc72aa50cdf34d1d5bfd01a4512d5974dc65 assets/create/models/item/cut_crimsite.json +20bc810ca5b2a35a423e57f287e2f42ad9940b89 assets/create/models/item/cut_crimsite_bricks.json 7c37d3de9674e70595498d1c46c5693d9f39a502 assets/create/models/item/cut_crimsite_brick_slab.json b974c0f2f0e5119d9bac6a36946d4dfdd65b4b5f assets/create/models/item/cut_crimsite_brick_stairs.json c1289ddff572149b2171859689228615802dc825 assets/create/models/item/cut_crimsite_brick_wall.json -20bc810ca5b2a35a423e57f287e2f42ad9940b89 assets/create/models/item/cut_crimsite_bricks.json 8855eb44a68277668c77858715652d6851fa507f assets/create/models/item/cut_crimsite_slab.json 57101d3c2d570bc2c389c1e05e1354d79de70a0a assets/create/models/item/cut_crimsite_stairs.json a10cd65d675a05b9dfbdac67a2d9ca3b4381396a assets/create/models/item/cut_crimsite_wall.json a4ad900cf65136835c259c1e349781538d537a9c assets/create/models/item/cut_deepslate.json +81b10b5d159db4000f4f6569b83fc7e8f702f015 assets/create/models/item/cut_deepslate_bricks.json a63bbe474ca7d8ceafb6bfcb21a88841980fe8e6 assets/create/models/item/cut_deepslate_brick_slab.json 7c1ad49844eafbd87f8c69a077a8c18ccdd4a919 assets/create/models/item/cut_deepslate_brick_stairs.json 6a4ee2e810731e0702c1493237343a567cc736d6 assets/create/models/item/cut_deepslate_brick_wall.json -81b10b5d159db4000f4f6569b83fc7e8f702f015 assets/create/models/item/cut_deepslate_bricks.json ff0d08d1b59de36b016f7952d2bd72d8e1eb1293 assets/create/models/item/cut_deepslate_slab.json 627c806a6eba8b730682821deb31627d75683e88 assets/create/models/item/cut_deepslate_stairs.json 9bdb85a688b09eb34eb8024a6808406118f78133 assets/create/models/item/cut_deepslate_wall.json c33c48d71d98f4b8a84c7f0a4ee88918fed3e798 assets/create/models/item/cut_diorite.json +e8a697df63b0b5fa74dbc70e76b55718a2cc388f assets/create/models/item/cut_diorite_bricks.json 63bc297b782c40c513873b7f8fd8284abce01753 assets/create/models/item/cut_diorite_brick_slab.json f604d088c8c7c6d847795459231d0df8c73d95fb assets/create/models/item/cut_diorite_brick_stairs.json b06be3da6017aa7fbc38b8aecda0d30dae313c13 assets/create/models/item/cut_diorite_brick_wall.json -e8a697df63b0b5fa74dbc70e76b55718a2cc388f assets/create/models/item/cut_diorite_bricks.json 4650f375365caeb237947f6e933d174ebbfbc1e2 assets/create/models/item/cut_diorite_slab.json 933d14f51272b39fc13e94d58f3100469d7cbe06 assets/create/models/item/cut_diorite_stairs.json 0cc44bb9ad0ed3ff11bc6113d0a9e31e99b169b8 assets/create/models/item/cut_diorite_wall.json e2123180fd5312d1e67b3a030fcbc4b6f11aa8bf assets/create/models/item/cut_dripstone.json +4b5d7bbee5741b112e2cb354c5fe49c088fc9b2f assets/create/models/item/cut_dripstone_bricks.json a815b2a927853d6d82d8b69f862be3091c5c8caa assets/create/models/item/cut_dripstone_brick_slab.json b8cb1b04eb869a06ded04c4c3acac6e5a315ee78 assets/create/models/item/cut_dripstone_brick_stairs.json 87fafd603eb4ba41981cd9c9371ac4618909f94d assets/create/models/item/cut_dripstone_brick_wall.json -4b5d7bbee5741b112e2cb354c5fe49c088fc9b2f assets/create/models/item/cut_dripstone_bricks.json 756c801f6bba006fbfd3486e95ba870909ab2902 assets/create/models/item/cut_dripstone_slab.json c59d314e1b5cce1c3745ce164c2a094e17f7a003 assets/create/models/item/cut_dripstone_stairs.json 125b24d28a9957740855467440ad8508d21c24d7 assets/create/models/item/cut_dripstone_wall.json 2fbce0b481f7cf2cf4f0fd03c86ef743b7c30879 assets/create/models/item/cut_granite.json +d8860602cc52fac5a09354c56e78fdfd7d9cb6a9 assets/create/models/item/cut_granite_bricks.json 3584117ed8a69c3842fde1d6accfaaa2c72e44f4 assets/create/models/item/cut_granite_brick_slab.json c68d1c09b9091bc501279115be16f83508b88fed assets/create/models/item/cut_granite_brick_stairs.json 5a37b24319a8708e444902eae3596b68daaffd15 assets/create/models/item/cut_granite_brick_wall.json -d8860602cc52fac5a09354c56e78fdfd7d9cb6a9 assets/create/models/item/cut_granite_bricks.json c2f6603e8cbfc0cdf5e5ef10c6a4baef9c917b6d assets/create/models/item/cut_granite_slab.json 66f8e6d556446441e157427437e9563075e2d6ce assets/create/models/item/cut_granite_stairs.json fe06c8aeab9e4c8a145375af46cbdaed701baad4 assets/create/models/item/cut_granite_wall.json b5c3df9c28a14683a363769cad5d154af56b8da4 assets/create/models/item/cut_limestone.json +7d026353711a464400e69c7e86c9b9c6aa70bf6d assets/create/models/item/cut_limestone_bricks.json 2822ebe1d4211f240e31866759e25add5f0fb56d assets/create/models/item/cut_limestone_brick_slab.json 694dfb73585167011d8123d64f5896697594f4ce assets/create/models/item/cut_limestone_brick_stairs.json db8851d6a1b7604ca1ba7615e1f162f6f5220801 assets/create/models/item/cut_limestone_brick_wall.json -7d026353711a464400e69c7e86c9b9c6aa70bf6d assets/create/models/item/cut_limestone_bricks.json 75584aa5e06168d8866b022fcd72377351b774d9 assets/create/models/item/cut_limestone_slab.json 1df9a186a146e597b48da4c4461f1a98ecf3646a assets/create/models/item/cut_limestone_stairs.json b70ac5462ef4d0363332656aa7cb82919f679893 assets/create/models/item/cut_limestone_wall.json 92bc693db4e0ba6164cd35d4f5fa0982f3b8f796 assets/create/models/item/cut_ochrum.json +3e8e00c602b1fbce888e6fe22d9525f1c025129d assets/create/models/item/cut_ochrum_bricks.json 1edc47c279fadde74322d3fa89ef776bdd6fb354 assets/create/models/item/cut_ochrum_brick_slab.json 4678e2a97c73139b458cea657a55f74659bc36d5 assets/create/models/item/cut_ochrum_brick_stairs.json 85044ec7033cd4c6aa913c4c4bb6c0e3a4386023 assets/create/models/item/cut_ochrum_brick_wall.json -3e8e00c602b1fbce888e6fe22d9525f1c025129d assets/create/models/item/cut_ochrum_bricks.json e0e494fb7fa1767241507347318560335339a2a8 assets/create/models/item/cut_ochrum_slab.json de7c5917bcb14f398d39e3932bfe5e1967ed7a24 assets/create/models/item/cut_ochrum_stairs.json 5a8f8c84e95ee0ab97106a801a456282f5ac207c assets/create/models/item/cut_ochrum_wall.json 1631a807135cf993d9a81068c65e78face2f24e0 assets/create/models/item/cut_scorchia.json +5ecb9692e478e29d64aeb5867e8677671560755d assets/create/models/item/cut_scorchia_bricks.json ac3a29573ce099ac57f59d0a2f1cdc0a453e0621 assets/create/models/item/cut_scorchia_brick_slab.json d3a8a8e0e85aaaadccb18cdce33da54ae0e8a8d7 assets/create/models/item/cut_scorchia_brick_stairs.json 83be13f6cbd9a58e10869e4152066cf3b265f347 assets/create/models/item/cut_scorchia_brick_wall.json -5ecb9692e478e29d64aeb5867e8677671560755d assets/create/models/item/cut_scorchia_bricks.json 0fee2e7f8e80bbd33e4d928c8374e6dae65f0b1f assets/create/models/item/cut_scorchia_slab.json 88a6b3709bab76390ace6f641eac18d43c9d099f assets/create/models/item/cut_scorchia_stairs.json d733d43252bf27b6fb1d7e016dc77556c3d1eb71 assets/create/models/item/cut_scorchia_wall.json ce75fb80c38c94bf6bf631eeb756909decaaaab0 assets/create/models/item/cut_scoria.json +81aa0bd4ec878754043a107466dcd87d49b3697c assets/create/models/item/cut_scoria_bricks.json d78a5126aefdd4cd182f9ec0ddda64df00d0f01c assets/create/models/item/cut_scoria_brick_slab.json 661d49b996f9c97a333e7e39dd13a0476db6b142 assets/create/models/item/cut_scoria_brick_stairs.json 3be69c075b479ac53c6201d7d7224d399f8009b6 assets/create/models/item/cut_scoria_brick_wall.json -81aa0bd4ec878754043a107466dcd87d49b3697c assets/create/models/item/cut_scoria_bricks.json 824bedfbeec53ec8f539fe73c0a3c3d927a21aa4 assets/create/models/item/cut_scoria_slab.json 15560f1251f18d53fe1b71adc6be5060c4d8fb94 assets/create/models/item/cut_scoria_stairs.json e35ebcc4f7f7b94623af85b181d916e48fbbb5ed assets/create/models/item/cut_scoria_wall.json 71284d3d6dba230dbecd01eb015e0e65877b820d assets/create/models/item/cut_tuff.json +4de100799e290db3fd46923781a83e6a12654266 assets/create/models/item/cut_tuff_bricks.json 4c7d5fadb0b0eaecf2055a0cd279f9ec130b93d0 assets/create/models/item/cut_tuff_brick_slab.json 6f32b83c9f82424c0e2a2e0a8813eb44c2ac4527 assets/create/models/item/cut_tuff_brick_stairs.json 9088296b7677bddf16d670858a619d846a134ef6 assets/create/models/item/cut_tuff_brick_wall.json -4de100799e290db3fd46923781a83e6a12654266 assets/create/models/item/cut_tuff_bricks.json e9134027cc917e2e878456edb49bcfee382e73b1 assets/create/models/item/cut_tuff_slab.json 8235a34249197c100645b55ded5ff619a055d8a6 assets/create/models/item/cut_tuff_stairs.json a1626993eafa8d85dc950e17cbf78378ed64c7d2 assets/create/models/item/cut_tuff_wall.json a343c74f1e55426330df18f522e6d2a81276c499 assets/create/models/item/cut_veridium.json +3c3fd197f8e299ff90850e24c6507ea12f373123 assets/create/models/item/cut_veridium_bricks.json c1c5561ce31e237b7ea8f1adfb6a79e661b7f940 assets/create/models/item/cut_veridium_brick_slab.json f633006045ccfcdf486d7a240217229d6eed717e assets/create/models/item/cut_veridium_brick_stairs.json 8182109a002317dd8d2767b3828f8c44166a053f assets/create/models/item/cut_veridium_brick_wall.json -3c3fd197f8e299ff90850e24c6507ea12f373123 assets/create/models/item/cut_veridium_bricks.json 410b949304faa5856028f7c42ab762b7498ffd95 assets/create/models/item/cut_veridium_slab.json 62697c0922b11537914d2f4f84faa0b909ee518d assets/create/models/item/cut_veridium_stairs.json 3921d61a26d48d999cbb2f6645611e53ea71978b assets/create/models/item/cut_veridium_wall.json @@ -2144,12 +2144,12 @@ badd4326fac0b0a1590a2e9bce7c2cdd4e4562f3 assets/create/models/item/empty_schemat 7ec3ed4aaab72d76f6414447bbb3ad7887adf61f assets/create/models/item/encased_fan.json 3e1fdcc80fd68199b1890bcc830f78c48e7c0e43 assets/create/models/item/experience_block.json 9775e83414c0febb5c5b832437b0580e91bcbff3 assets/create/models/item/experience_nugget.json +87add851ae3271d733c9e6888865c288b6716f3b assets/create/models/item/exposed_copper_shingles.json 721c8ac46bf23abec2bbf4cff6dbfdf96cc569a6 assets/create/models/item/exposed_copper_shingle_slab.json 6e1c7fcd8da84dc2d49adb9802ce4fb431eddae1 assets/create/models/item/exposed_copper_shingle_stairs.json -87add851ae3271d733c9e6888865c288b6716f3b assets/create/models/item/exposed_copper_shingles.json +fa7ffb172a43774cc07a2bb201e7010a2549001d assets/create/models/item/exposed_copper_tiles.json a443633d90ef9ac2a866b69b2ecdfad1841dc3e1 assets/create/models/item/exposed_copper_tile_slab.json 9bb425a14635fc8b36a9a95f3d0c54e0b129b7b4 assets/create/models/item/exposed_copper_tile_stairs.json -fa7ffb172a43774cc07a2bb201e7010a2549001d assets/create/models/item/exposed_copper_tiles.json 8b64a93d9b6e33e3caa66adb7a0cc8c5cd473023 assets/create/models/item/extendo_grip.json 9114fa2e92ea4b7bf949b2e5a26290b0bade1af3 assets/create/models/item/factory_gauge.json dad31483f65baaf187e6553e3cd301c5d69e9db4 assets/create/models/item/filter.json @@ -2179,11 +2179,11 @@ b8d6d2d163e2ab5f654bbc4eda9ad63f8064d27c assets/create/models/item/gray_seat.jso 334fd81d5e6574220ee5815f1452b4f4aa7ad223 assets/create/models/item/green_table_cloth.json 561e0579101bf602b252c0b9a5eec468c89d0e40 assets/create/models/item/green_toolbox.json 7d3ddad087b4d2c6a32f97092533cbfb5de0cb3b assets/create/models/item/green_valve_handle.json -dac0331061c464e6d3e2070b232781c632840191 assets/create/models/item/hand_crank.json 9e352162c8135773a4eca41871beea8f3ca650ae assets/create/models/item/handheld_worldshaper.json +dac0331061c464e6d3e2070b232781c632840191 assets/create/models/item/hand_crank.json 7bb435c53cbf935d80a28746125aebbd6263e45c assets/create/models/item/haunted_bell.json -2e97629313eab1a4ac4b38785dbe7ed45346e625 assets/create/models/item/honey_bucket.json 81d67fb0e59f25762a412990884813c72d399d55 assets/create/models/item/honeyed_apple.json +2e97629313eab1a4ac4b38785dbe7ed45346e625 assets/create/models/item/honey_bucket.json 70185e640169d6253f06fb98f31b240f4807a53e assets/create/models/item/horizontal_framed_glass.json d47884b13fadf545bd585cd9ae347368924b04b0 assets/create/models/item/horizontal_framed_glass_pane.json 58b6f4ec2af3a69ae7145fb25d73451b6e8a2834 assets/create/models/item/hose_pulley.json @@ -2224,13 +2224,13 @@ b56a28924b0b1b2530ebac7834e011700b09b966 assets/create/models/item/light_gray_po cc8834024208662cb100f7cd38a04637da3b6852 assets/create/models/item/light_gray_table_cloth.json c8513eb1c89652783e26d7dcfcf64afa97619bc8 assets/create/models/item/light_gray_toolbox.json 3774d23e76b5712e7004e333e0a770f2230c2998 assets/create/models/item/light_gray_valve_handle.json +8f53caad3899a30be5087a0ba155080834418cc0 assets/create/models/item/limestone.json +fba1e7d1cad39c89976b427db62544d80f47ad5d assets/create/models/item/limestone_pillar.json 26b8e1daf9cc4b206fb5f62904c7f1701ba93e67 assets/create/models/item/lime_postbox.json 32cd55a1c97a31a13ad106a457ec9925aa91f6d3 assets/create/models/item/lime_seat.json a0843c3731fa3c4d23bc2b91fd68410fcf1df149 assets/create/models/item/lime_table_cloth.json 931d187c11cb95a0eeae8f256187ef551b42007e assets/create/models/item/lime_toolbox.json d0f4148bdb0a905e68f54b5dfd829fd47e528fea assets/create/models/item/lime_valve_handle.json -8f53caad3899a30be5087a0ba155080834418cc0 assets/create/models/item/limestone.json -fba1e7d1cad39c89976b427db62544d80f47ad5d assets/create/models/item/limestone_pillar.json 1d30f9b525e8e9736b34a92f848e235c71fd6bd8 assets/create/models/item/linear_chassis.json 8f622f5f79446f6060d9e8815205fce919c8c829 assets/create/models/item/linked_controller.json 538e28af9013a43c258a659cbe67671991f3eee7 assets/create/models/item/magenta_postbox.json @@ -2275,15 +2275,15 @@ af50363d603d61340b336569d58c1febde253665 assets/create/models/item/ochrum.json 7e767ca9e0ddb769b38fabd9289648ac63f5413d assets/create/models/item/orange_valve_handle.json 82152bca4310111d91584a2a78f05e158bb4bd90 assets/create/models/item/ornate_iron_window.json ca749a88faeef441c55c0527d81257187938b6b0 assets/create/models/item/ornate_iron_window_pane.json +09b3cd8ff7b29a6dd59f739a95bb708646d23537 assets/create/models/item/oxidized_copper_shingles.json c9c7ccdb68de2e77cd9f7053fab19493dd30a985 assets/create/models/item/oxidized_copper_shingle_slab.json 89c5f7a0a28f238ebed2641e243a47e4be2ad5ab assets/create/models/item/oxidized_copper_shingle_stairs.json -09b3cd8ff7b29a6dd59f739a95bb708646d23537 assets/create/models/item/oxidized_copper_shingles.json +1c3428e2aed32a013631db012642a34d4eaf0785 assets/create/models/item/oxidized_copper_tiles.json f1af7c5f3840efc3ae07940ee6719eb3417a0e1a assets/create/models/item/oxidized_copper_tile_slab.json ef2fe68d407a03bf1ed8f2d2f3e7323777d061bb assets/create/models/item/oxidized_copper_tile_stairs.json -1c3428e2aed32a013631db012642a34d4eaf0785 assets/create/models/item/oxidized_copper_tiles.json +b21a1f3ee7de3e17f69d27fd13ae6b23b62aa22c assets/create/models/item/packager.json 5b974e55caffdbfc2156eb8b59dd99db12243bd3 assets/create/models/item/package_filter.json 7fd76e7d2e6c6d94352f1fa08d096b63616ad01e assets/create/models/item/package_frogport.json -b21a1f3ee7de3e17f69d27fd13ae6b23b62aa22c assets/create/models/item/packager.json 76aeceb41bb7df873dbafe1bd5e26deb24abf93f assets/create/models/item/peculiar_bell.json ab6c05a0468f3f4295a07adb362fa2d36cf6e3e8 assets/create/models/item/pink_postbox.json df13d4281dc45041ecd93504d45daef61d070581 assets/create/models/item/pink_seat.json @@ -2380,15 +2380,15 @@ d3274003067a943d749ba5d23b5abc0fee8727a2 assets/create/models/item/rare_thunder_ 48ceaaead35ae1422542a615c9db55bd88f464e6 assets/create/models/item/rare_vector_package.json 5f8e5283fbebb452f1a1141b33ee73f08879c75d assets/create/models/item/raw_zinc.json 4631d67976cef148c346a7016baaa6703e4f243e assets/create/models/item/raw_zinc_block.json +9dc6c52e258b00cac6ed23147983045c43218b5d assets/create/models/item/redstone_contact.json +f8f733364bdd32b2ad597e81103bc02344ce63bd assets/create/models/item/redstone_link.json +ae0ba4827a81bd51c5c01178c2ccdae3a722628a assets/create/models/item/redstone_requester.json 4b73ee9cc2651a3d1a97476d100f9c4d7e2b2efe assets/create/models/item/red_postbox.json 8d00eb1a10055a802556eab10e13f522d12acd1c assets/create/models/item/red_sand_paper.json b64a054c92cbd2e055502d470f3921d1077e63a1 assets/create/models/item/red_seat.json 359d9bdb2496140e297a1e5a98c9563bc09d56b9 assets/create/models/item/red_table_cloth.json ac4695cc465d094b4adba1a4e9efec42c916f37d assets/create/models/item/red_toolbox.json 02473f42ef4b53dc809c7c58ae657c014bfaf652 assets/create/models/item/red_valve_handle.json -9dc6c52e258b00cac6ed23147983045c43218b5d assets/create/models/item/redstone_contact.json -f8f733364bdd32b2ad597e81103bc02344ce63bd assets/create/models/item/redstone_link.json -ae0ba4827a81bd51c5c01178c2ccdae3a722628a assets/create/models/item/redstone_requester.json 9926bbe6dad7c4c1a146492116d232e941c80d2b assets/create/models/item/refined_radiance.json bf827486dc7a1b3aeae577844d2dab2a97051db9 assets/create/models/item/refined_radiance_casing.json a982c29763d90556cca03074c168462a52cb9526 assets/create/models/item/repackager.json @@ -2402,9 +2402,9 @@ d45005a89e2c0d29944e0112be274365e0e318a5 assets/create/models/item/rose_quartz_t 670e978a34faf6a3acd7880b2f94c2574178d586 assets/create/models/item/sand_paper.json 6854451e331242ec50c186a545538024b07ec123 assets/create/models/item/schedule.json 0effa517c214ba07dba2f4ed12dfcf4785e42dd8 assets/create/models/item/schematic.json +8b7727844d8c12c3c22828c7f65fc7ac2d273e36 assets/create/models/item/schematicannon.json 2a52f084fa8187dd8da28fe820dde50c47a93b57 assets/create/models/item/schematic_and_quill.json 4c8b34627001e35ee15412a0cd037d0f24ba914e assets/create/models/item/schematic_table.json -8b7727844d8c12c3c22828c7f65fc7ac2d273e36 assets/create/models/item/schematicannon.json 2955563914c2f84ed06474c135062e91189ddf3a assets/create/models/item/scorchia.json 669041e5ad29d2166cc8895f85aa262040671d3e assets/create/models/item/scorchia_pillar.json ff52eb59dadfe675e416440f3115856a501428a6 assets/create/models/item/scoria.json @@ -2415,63 +2415,63 @@ abaa6da82babc26717ffff44fc41327bd015c9a6 assets/create/models/item/shadow_steel. ffaec38d11b91add4e150e33d0e0e49394f5beca assets/create/models/item/shadow_steel_casing.json b6fcd9722e5a09a9207964cba68752512e3b945a assets/create/models/item/shaft.json 617c6e2f759b2a95da7ee7192a2661afc6f6e8f8 assets/create/models/item/shopping_list.json +58ca190177e77db90c8195347c29d52c2cd0c556 assets/create/models/item/small_andesite_bricks.json fa92996fada8545fc340fb401bd0568f56809bf0 assets/create/models/item/small_andesite_brick_slab.json 08474bf814a55795c1f94203ceb8a969be2a2132 assets/create/models/item/small_andesite_brick_stairs.json 0e00bc6aa5be242217ed6fe8cbe1ccdf180742fb assets/create/models/item/small_andesite_brick_wall.json -58ca190177e77db90c8195347c29d52c2cd0c556 assets/create/models/item/small_andesite_bricks.json +543055fabb706a93037c6a9e47c334508e41b06c assets/create/models/item/small_asurine_bricks.json b160c3277f00f19687cffb87f9cb3aa32d3633aa assets/create/models/item/small_asurine_brick_slab.json 183fa4919f06e8c3c10f1efeceefd55389a96102 assets/create/models/item/small_asurine_brick_stairs.json d6a5ffdb493fb2c8176a7e6b42e05c2d393a2782 assets/create/models/item/small_asurine_brick_wall.json -543055fabb706a93037c6a9e47c334508e41b06c assets/create/models/item/small_asurine_bricks.json +26d9361e33e362a772220146724c0927453831e0 assets/create/models/item/small_calcite_bricks.json 8c1b5d5d40393636c9ff10afc09038c89bc1b383 assets/create/models/item/small_calcite_brick_slab.json 481ce90fb6abb05c904f01df3fe635f702bbfac0 assets/create/models/item/small_calcite_brick_stairs.json 02adb90bdf06a7c4c57d09dfd3c77cceef9b7fbe assets/create/models/item/small_calcite_brick_wall.json -26d9361e33e362a772220146724c0927453831e0 assets/create/models/item/small_calcite_bricks.json +d5a033d3dedb799c4752b7e68b6881529f38f8e5 assets/create/models/item/small_crimsite_bricks.json 8f382537c99eac3335f72db8dba33ab71f99a919 assets/create/models/item/small_crimsite_brick_slab.json b5d012cf0c5c94b73e6825b6884ab1d3eee7d64e assets/create/models/item/small_crimsite_brick_stairs.json 236457bb16bc7e949c16f3f091ee74dc3f3e6973 assets/create/models/item/small_crimsite_brick_wall.json -d5a033d3dedb799c4752b7e68b6881529f38f8e5 assets/create/models/item/small_crimsite_bricks.json +6ce2cb7882f41fcbcd641a442c98767bda61f65f assets/create/models/item/small_deepslate_bricks.json ce79900b7aa1eff0d42cabcd0a7f80ef20824551 assets/create/models/item/small_deepslate_brick_slab.json a260711af72c749a6b72f72515bbecb2e01e3ed8 assets/create/models/item/small_deepslate_brick_stairs.json 4e474891c6a269166c2eb413fae78699e5657af4 assets/create/models/item/small_deepslate_brick_wall.json -6ce2cb7882f41fcbcd641a442c98767bda61f65f assets/create/models/item/small_deepslate_bricks.json +e412eaa393965ef5426c3d8d95d5c9d69e37e054 assets/create/models/item/small_diorite_bricks.json 55b82c2f30d52acee5c3807ab2ffaed1d773cfa8 assets/create/models/item/small_diorite_brick_slab.json 49a17610b5b05595894ca2683056cecd724c1111 assets/create/models/item/small_diorite_brick_stairs.json dd3630a9c5500e6cf09e95d09e7a3cc99db11899 assets/create/models/item/small_diorite_brick_wall.json -e412eaa393965ef5426c3d8d95d5c9d69e37e054 assets/create/models/item/small_diorite_bricks.json +c29d35da520d0fe828bb364db403b8cdf55f0a2e assets/create/models/item/small_dripstone_bricks.json 21e281ec7a82d48018366a0737c6867f625b4663 assets/create/models/item/small_dripstone_brick_slab.json 6862e72eedf80536f40b6ac42ff78f13f62d012f assets/create/models/item/small_dripstone_brick_stairs.json ca8613bb64ceb562c36dd1d6a3b76b5f15f35be9 assets/create/models/item/small_dripstone_brick_wall.json -c29d35da520d0fe828bb364db403b8cdf55f0a2e assets/create/models/item/small_dripstone_bricks.json +81eae95d20a9e99a070dfb8f6e6c22ef29f628d3 assets/create/models/item/small_granite_bricks.json a19aa13eb3c04a9e0931e22e4170eec80950efab assets/create/models/item/small_granite_brick_slab.json 51bc02587cad5dfcfaf9d040848faa5277a25a5f assets/create/models/item/small_granite_brick_stairs.json 147a6f42be8312fbf050ad53c1625a1458f73cc3 assets/create/models/item/small_granite_brick_wall.json -81eae95d20a9e99a070dfb8f6e6c22ef29f628d3 assets/create/models/item/small_granite_bricks.json +bfa76583bca68134bbe2793c263cc0b71e1406af assets/create/models/item/small_limestone_bricks.json a9599981e872e683dacd01b2f0af511f416dd526 assets/create/models/item/small_limestone_brick_slab.json d8f8eadea13fc90a1c8ee5aca4be71fb22a79fd0 assets/create/models/item/small_limestone_brick_stairs.json 67626afe8b0fc9135456a24ea49c602b83d6970d assets/create/models/item/small_limestone_brick_wall.json -bfa76583bca68134bbe2793c263cc0b71e1406af assets/create/models/item/small_limestone_bricks.json +2d4b22d4028c55cbabc7eb405c2c6d485390afab assets/create/models/item/small_ochrum_bricks.json f7547aacb8bdaf61424cd56565e40d3cd40a1cfa assets/create/models/item/small_ochrum_brick_slab.json 8a320ff9e75e16a182cb7d07784a595fe7876e04 assets/create/models/item/small_ochrum_brick_stairs.json 0eedd4fe5b0a82de16fed148836087ff4ae64a74 assets/create/models/item/small_ochrum_brick_wall.json -2d4b22d4028c55cbabc7eb405c2c6d485390afab assets/create/models/item/small_ochrum_bricks.json 97b8e3eaddac0b93d4b6bc140f573969fcba5823 assets/create/models/item/small_rose_quartz_tiles.json +ac1bf1d2344517c18b945afa198d5d05e2866f6b assets/create/models/item/small_scorchia_bricks.json 63ef9901ba1014027e8c873d8374d86abb73158e assets/create/models/item/small_scorchia_brick_slab.json f52601fe54695c225a595a65e9130665582db856 assets/create/models/item/small_scorchia_brick_stairs.json b4e0db087dc88e0a3a4a82197a0ce347d3c7a7aa assets/create/models/item/small_scorchia_brick_wall.json -ac1bf1d2344517c18b945afa198d5d05e2866f6b assets/create/models/item/small_scorchia_bricks.json +25b6bb40701e782ed64414ec8391b304ad5e6b12 assets/create/models/item/small_scoria_bricks.json a4bdeb066dcc44f8be058e6d9dfc0a3fd34819bf assets/create/models/item/small_scoria_brick_slab.json 5ffb0e7de917013cd82cece2506d72fce2cd5fc6 assets/create/models/item/small_scoria_brick_stairs.json 67dcbc7d52fbbe88f89b36e04f970b27024741e4 assets/create/models/item/small_scoria_brick_wall.json -25b6bb40701e782ed64414ec8391b304ad5e6b12 assets/create/models/item/small_scoria_bricks.json +90943707d8b232d816392bec8ae05e06b6eedd72 assets/create/models/item/small_tuff_bricks.json 91a144100eea8b4e67a0a4f31b35a714693fa001 assets/create/models/item/small_tuff_brick_slab.json b3f89c9f8e46fbdfc58171073d6ad91c588e5853 assets/create/models/item/small_tuff_brick_stairs.json 52c1d4cfb5f1726c9ccbb00db60bdd6f760bf40f assets/create/models/item/small_tuff_brick_wall.json -90943707d8b232d816392bec8ae05e06b6eedd72 assets/create/models/item/small_tuff_bricks.json +6935d6d9dbdb99fe7258d9347419d65571711263 assets/create/models/item/small_veridium_bricks.json 0bb60fc6ab570db83214fd10c83d931f6677e361 assets/create/models/item/small_veridium_brick_slab.json 89918d98b6830477b21ab7fb9e30807d3ca1d379 assets/create/models/item/small_veridium_brick_stairs.json ab4e7695e99548f83a89f3d5ad7690a576bafcc0 assets/create/models/item/small_veridium_brick_wall.json -6935d6d9dbdb99fe7258d9347419d65571711263 assets/create/models/item/small_veridium_bricks.json 6cf508dbd3d015ea730366db92bb17844dc2ca06 assets/create/models/item/smart_chute.json 9201f00edcf2ffa33cb079c28b5c33e39872c824 assets/create/models/item/smart_fluid_pipe.json 67804bdd890f167010f6101a700e85a3245f4cc3 assets/create/models/item/speedometer.json @@ -2482,9 +2482,9 @@ b82ab0c69df330f6f938ed1beee7b4add67d2e50 assets/create/models/item/steam_engine. 24acc593a5e910b6301afcb3f23cba526d23a0ab assets/create/models/item/steam_whistle.json 54f200be903e056e5cf9e2186f0a0a51f8f0f84e assets/create/models/item/sticker.json 0f88de164439640cc175ceef2017f7416b5a7018 assets/create/models/item/sticky_mechanical_piston.json +4b640b66765b206f8c2884b7c1a1ef860b81d841 assets/create/models/item/stockpile_switch.json 97222d9eb36944a89b8047423eafa6af3da82b0b assets/create/models/item/stock_link.json 67c98c6c7f2122850acfbee34688572934fdd226 assets/create/models/item/stock_ticker.json -4b640b66765b206f8c2884b7c1a1ef860b81d841 assets/create/models/item/stockpile_switch.json 6ee792277b9fd980c40e18e841afa63fc500ed0b assets/create/models/item/stressometer.json 8d4ce1ccf180016506292f63188c10d0dabe0ee3 assets/create/models/item/sturdy_sheet.json a10bb4d6d1a4483a806e3aaa086d48c0e20aaefe assets/create/models/item/super_glue.json @@ -2511,36 +2511,36 @@ b0f6d37aa695395e28a23d36775092f63ab3f5a5 assets/create/models/item/vertical_gear 9c5087114e35052c5e56bb752252de5d092408c5 assets/create/models/item/warped_window.json cdc1226f8a098adbc420fe50c98466507c3a3157 assets/create/models/item/warped_window_pane.json e5939b47bf7440dc101c667e68ef6bf750a3290f assets/create/models/item/water_wheel.json +be2f058a7ecb015599ee052ec27c4360d636999a assets/create/models/item/waxed_copper_shingles.json adc188e4e48bea80607c6e0c7076c9bdd7236cb0 assets/create/models/item/waxed_copper_shingle_slab.json 7e224aceaa94361256e95e4c44d8814aebaf297c assets/create/models/item/waxed_copper_shingle_stairs.json -be2f058a7ecb015599ee052ec27c4360d636999a assets/create/models/item/waxed_copper_shingles.json +eced19a2f721c54b968e5979cde2705f15faf3e1 assets/create/models/item/waxed_copper_tiles.json 68b3632c34adb9991aa993385f53624632c260f2 assets/create/models/item/waxed_copper_tile_slab.json a7fc0cc2d32dcd49c3274597ce7121f01fca03f8 assets/create/models/item/waxed_copper_tile_stairs.json -eced19a2f721c54b968e5979cde2705f15faf3e1 assets/create/models/item/waxed_copper_tiles.json +5336907eba067492f6d00b4b8514f9663830a1d5 assets/create/models/item/waxed_exposed_copper_shingles.json fd428034c46a240c4bb2a1aee625b8767f41c3ef assets/create/models/item/waxed_exposed_copper_shingle_slab.json 43d714187fe6c0cd1ed7abcddef1ebcd63979ff4 assets/create/models/item/waxed_exposed_copper_shingle_stairs.json -5336907eba067492f6d00b4b8514f9663830a1d5 assets/create/models/item/waxed_exposed_copper_shingles.json +962b24b3611abefc21920d01452944710ab0da3f assets/create/models/item/waxed_exposed_copper_tiles.json 25f5a10fe8e6acbdbf8457d56aeee065835a93ec assets/create/models/item/waxed_exposed_copper_tile_slab.json 22917505d328fb5b489b9f7f9068f1514b784abb assets/create/models/item/waxed_exposed_copper_tile_stairs.json -962b24b3611abefc21920d01452944710ab0da3f assets/create/models/item/waxed_exposed_copper_tiles.json +12c3dd893bddb66b9b387652c67c8f0e24b643ff assets/create/models/item/waxed_oxidized_copper_shingles.json 9b7c82376ea8c1c8ecbc7bbe15283f84b0d50d94 assets/create/models/item/waxed_oxidized_copper_shingle_slab.json fbb6043eb935aa0641a482ee7300c780be257440 assets/create/models/item/waxed_oxidized_copper_shingle_stairs.json -12c3dd893bddb66b9b387652c67c8f0e24b643ff assets/create/models/item/waxed_oxidized_copper_shingles.json +6b8f75d4818db903b22f4626d02671ab76a61023 assets/create/models/item/waxed_oxidized_copper_tiles.json 6e7bc8eb9a87d903dcc590e9918ce8d4411bf190 assets/create/models/item/waxed_oxidized_copper_tile_slab.json 10136759b31e4d957e8374948460d6c984711326 assets/create/models/item/waxed_oxidized_copper_tile_stairs.json -6b8f75d4818db903b22f4626d02671ab76a61023 assets/create/models/item/waxed_oxidized_copper_tiles.json +ce2dcfc01205da1dc70f34091a2c24f563e72466 assets/create/models/item/waxed_weathered_copper_shingles.json 2bf249c677d30a4febf950fa7c6caa87c348c54e assets/create/models/item/waxed_weathered_copper_shingle_slab.json 9fa84f2555d82b5a1550b748a332ceb443a04fae assets/create/models/item/waxed_weathered_copper_shingle_stairs.json -ce2dcfc01205da1dc70f34091a2c24f563e72466 assets/create/models/item/waxed_weathered_copper_shingles.json +02d2ac048c9bea86d10673254dfc107f3c9c5bb5 assets/create/models/item/waxed_weathered_copper_tiles.json ab40b1a5a03cd290d53ef2ea65f90dcfcd2673de assets/create/models/item/waxed_weathered_copper_tile_slab.json dadc7b65a4527e288c21a20df978796a8c444fd2 assets/create/models/item/waxed_weathered_copper_tile_stairs.json -02d2ac048c9bea86d10673254dfc107f3c9c5bb5 assets/create/models/item/waxed_weathered_copper_tiles.json +86b8e71fa8b7aeb73eafda89d8d06d83da6a5d25 assets/create/models/item/weathered_copper_shingles.json 94db30ad2381d2f2c37cdfd0d5ce5c45a2807640 assets/create/models/item/weathered_copper_shingle_slab.json 7262c01df4b5a8cd8c6a5545062f251d5ad9fd06 assets/create/models/item/weathered_copper_shingle_stairs.json -86b8e71fa8b7aeb73eafda89d8d06d83da6a5d25 assets/create/models/item/weathered_copper_shingles.json +99f17b16b68201aefb78298b3e6c657e3c2235e0 assets/create/models/item/weathered_copper_tiles.json 0b1b299d6dfab65b6060305a8b3e51f6e2df09f4 assets/create/models/item/weathered_copper_tile_slab.json 0c3989b44fde934ba8b88b071887e5ede522c417 assets/create/models/item/weathered_copper_tile_stairs.json -99f17b16b68201aefb78298b3e6c657e3c2235e0 assets/create/models/item/weathered_copper_tiles.json b5d591fbb40e062efe301b3b3b49580e5ad64566 assets/create/models/item/weathered_iron_block.json a569ddd725898a86f8745e46723edeff7fe7f2e9 assets/create/models/item/weathered_iron_window.json 68ca3316942b2df1623893cda722402238ab7724 assets/create/models/item/weathered_iron_window_pane.json @@ -2579,42 +2579,42 @@ b25b8c230fde8d6d77e8d516bed52236652b5ca6 data/create/advancements/recipes/buildi 537fe5dffa659e5838379587fbd84f2f641551ea data/create/advancements/recipes/building_blocks/calcite_pillar_from_stone_types_calcite_stonecutting.json 2636ac059b6412a46402cccbe5abe4fb49143662 data/create/advancements/recipes/building_blocks/cherry_window.json 3e08f575543f1e0abea979dbaee643572734788b data/create/advancements/recipes/building_blocks/cherry_window_pane.json +09f332cd34e6a92af9e8e4e757418c7ba8b536da data/create/advancements/recipes/building_blocks/copper_shingles_from_ingots_copper_stonecutting.json 55214a0fd27318b17163cace66c7525785127ef8 data/create/advancements/recipes/building_blocks/copper_shingle_slab.json fb4210dbbfb74459e10da94a540f3bfdf91c4a8d data/create/advancements/recipes/building_blocks/copper_shingle_slab_from_copper_shingles_stonecutting.json 31b04ac1b117fb65f5129c5bbb48e42c1c4c1003 data/create/advancements/recipes/building_blocks/copper_shingle_stairs.json bef4a9a4c2e722d4f086d6b4c9d6fa1d0836ec10 data/create/advancements/recipes/building_blocks/copper_shingle_stairs_from_copper_shingles_stonecutting.json -09f332cd34e6a92af9e8e4e757418c7ba8b536da data/create/advancements/recipes/building_blocks/copper_shingles_from_ingots_copper_stonecutting.json +f66a48f01afb4fa1babee4a8c28b032280c3ac9e data/create/advancements/recipes/building_blocks/copper_tiles_from_ingots_copper_stonecutting.json ef79744ebf31453d1c81789afed7b717837b3515 data/create/advancements/recipes/building_blocks/copper_tile_slab.json 8e9997c43b1c06521fe8d38b04ccb3f04c93d537 data/create/advancements/recipes/building_blocks/copper_tile_slab_from_copper_tiles_stonecutting.json a2609aa8b5453f2294f38c81d26e0b8dad71087d data/create/advancements/recipes/building_blocks/copper_tile_stairs.json d47e46c66bf69e8310e6687716858842e8aed7b5 data/create/advancements/recipes/building_blocks/copper_tile_stairs_from_copper_tiles_stonecutting.json -f66a48f01afb4fa1babee4a8c28b032280c3ac9e data/create/advancements/recipes/building_blocks/copper_tiles_from_ingots_copper_stonecutting.json cc14d10c75ab0fdd7c54db1922e5e56667739fef data/create/advancements/recipes/building_blocks/copycat_panel_from_ingots_zinc_stonecutting.json 55d2812be912c857ff666d581174378857d3bce2 data/create/advancements/recipes/building_blocks/copycat_step_from_ingots_zinc_stonecutting.json +8615fc107b1f4df86711081a9dccac8631b02e6b data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_shingles_from_honeycomb.json 0e0eba8550768ef69087dff8112814f25233fab7 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_shingle_slab_from_honeycomb.json 2c960d55273df4c0c8c33b2c329175b35b18fc8c data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_shingle_stairs_from_honeycomb.json -8615fc107b1f4df86711081a9dccac8631b02e6b data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_shingles_from_honeycomb.json +fa8f3ed9a4c6f0c3cd4c21b0ae4dc8ca4dba8678 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_tiles_from_honeycomb.json d6f2aa7fd10c96f71c47bdabb3e53dc4c4e73706 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_tile_slab_from_honeycomb.json eca165eee20adba1557ccc74ef50ee90311b3019 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_tile_stairs_from_honeycomb.json -fa8f3ed9a4c6f0c3cd4c21b0ae4dc8ca4dba8678 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_copper_tiles_from_honeycomb.json +88a236933e8dfe0d809bda098d16782288c4800c data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_shingles_from_honeycomb.json 301149dabc4dce290b4884f4ed3cb2132123adf0 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_shingle_slab_from_honeycomb.json f360dce7bece72672f2624710c88edbe3e3f8885 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_shingle_stairs_from_honeycomb.json -88a236933e8dfe0d809bda098d16782288c4800c data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_shingles_from_honeycomb.json +bc27959288766492746f41c4810350dcef1b320d data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_tiles_from_honeycomb.json 7ceb4b74ff84ed404518b6cb5e1432dac5903b5f data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_tile_slab_from_honeycomb.json ec1eec3bc25534484cb264134e62b578525422aa data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_tile_stairs_from_honeycomb.json -bc27959288766492746f41c4810350dcef1b320d data/create/advancements/recipes/building_blocks/crafting/copper/waxed_exposed_copper_tiles_from_honeycomb.json +2e8f1da032110e8c5ec375ffd425e5eed7f58cae data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_shingles_from_honeycomb.json e34abb4d51c1d00419fc3d3799ca0d9fe7ea1027 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_shingle_slab_from_honeycomb.json 9471e190beb603f022fb234f2cf35b5b4b93f0c0 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_shingle_stairs_from_honeycomb.json -2e8f1da032110e8c5ec375ffd425e5eed7f58cae data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_shingles_from_honeycomb.json +17fe14b753953a68887cd001fcaa264ef031463f data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_tiles_from_honeycomb.json 2577754364f05264fac325f67597230d01fa0c1d data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_tile_slab_from_honeycomb.json 003e384d9594a4e6ef5678e74f04b56de047dbde data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_tile_stairs_from_honeycomb.json -17fe14b753953a68887cd001fcaa264ef031463f data/create/advancements/recipes/building_blocks/crafting/copper/waxed_oxidized_copper_tiles_from_honeycomb.json +5009a82a897a15407fec785005107b0d228fffe7 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_shingles_from_honeycomb.json 70ce32937dcf349dce77fef8022bc0c15863f6a6 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_shingle_slab_from_honeycomb.json 1fc498238dcc2705152573ba7f74bb50e7e66ca7 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_shingle_stairs_from_honeycomb.json -5009a82a897a15407fec785005107b0d228fffe7 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_shingles_from_honeycomb.json +d12aa3dd5457327224fd007211878eec21043971 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_tiles_from_honeycomb.json 6f461d7036de914c636b7916dc798775ccf25be1 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_tile_slab_from_honeycomb.json 3bc9efcddecd23fd06c6056a0ee7b937959cecc0 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_tile_stairs_from_honeycomb.json -d12aa3dd5457327224fd007211878eec21043971 data/create/advancements/recipes/building_blocks/crafting/copper/waxed_weathered_copper_tiles_from_honeycomb.json 3064c52dea808a00c211bfedb96106b563f480da data/create/advancements/recipes/building_blocks/crafting/kinetics/black_seat.json f07a0b21db200ab68a7df02db519869f68953286 data/create/advancements/recipes/building_blocks/crafting/kinetics/black_seat_from_other_seat.json 80ac4db5c53c7efc2666a7abb4e2e876c5f86588 data/create/advancements/recipes/building_blocks/crafting/kinetics/blue_seat.json @@ -2715,6 +2715,7 @@ f3188b24f8108be4219016689a4768f826b4fef3 data/create/advancements/recipes/buildi e88373b83226d860b0c2131213f5d3b09f31ab96 data/create/advancements/recipes/building_blocks/crimsite_pillar_from_stone_types_crimsite_stonecutting.json 09f7122cf360fd56bde2b1659bbed526f9a119c4 data/create/advancements/recipes/building_blocks/crimson_window.json b5234c6050bc0c6fe872a5ddc87d46ba39e07971 data/create/advancements/recipes/building_blocks/crimson_window_pane.json +b32f4345517c3c7299a06489325bd85f987145dc data/create/advancements/recipes/building_blocks/cut_andesite_bricks_from_stone_types_andesite_stonecutting.json 22fe2e61d7e9836d9f71c39bfbba50efc2fa184d data/create/advancements/recipes/building_blocks/cut_andesite_brick_slab.json 6d8d28364f1016dfd1d7cbe4a2637e2b6224e4d8 data/create/advancements/recipes/building_blocks/cut_andesite_brick_slab_from_stone_types_andesite_stonecutting.json 39e904f66d2194de5437b5da2f8db8b6f03d78f4 data/create/advancements/recipes/building_blocks/cut_andesite_brick_slab_recycling.json @@ -2722,7 +2723,6 @@ b5234c6050bc0c6fe872a5ddc87d46ba39e07971 data/create/advancements/recipes/buildi 480c696956b99c96cbaf46e7dad9711c40680ec8 data/create/advancements/recipes/building_blocks/cut_andesite_brick_stairs_from_stone_types_andesite_stonecutting.json 8d504cdb99f5dc59bef5ff35d0b443f2f4ba21d2 data/create/advancements/recipes/building_blocks/cut_andesite_brick_wall.json e1b8e5906d54368c98867b83143dc7acc7b0aa28 data/create/advancements/recipes/building_blocks/cut_andesite_brick_wall_from_stone_types_andesite_stonecutting.json -b32f4345517c3c7299a06489325bd85f987145dc data/create/advancements/recipes/building_blocks/cut_andesite_bricks_from_stone_types_andesite_stonecutting.json d5b44158f9a98d874d941fc4df99de7a2657af21 data/create/advancements/recipes/building_blocks/cut_andesite_from_stone_types_andesite_stonecutting.json c11998f554bbd42efdbdf58cf8efe5bcf69230de data/create/advancements/recipes/building_blocks/cut_andesite_slab.json 1f457c0e816e4dd70e1a960015d2004814d11926 data/create/advancements/recipes/building_blocks/cut_andesite_slab_from_stone_types_andesite_stonecutting.json @@ -2731,6 +2731,7 @@ a4d7adf49472a2069bad72defd39b111b83def3d data/create/advancements/recipes/buildi 6d38bb2b9812761c594ebdf717284ba8d32e88bc data/create/advancements/recipes/building_blocks/cut_andesite_stairs_from_stone_types_andesite_stonecutting.json 2f6b2296b11e0e743d68749e65af5ffa0f374998 data/create/advancements/recipes/building_blocks/cut_andesite_wall.json caf3b1c62d0f8df3ce126535f0566c899577bedb data/create/advancements/recipes/building_blocks/cut_andesite_wall_from_stone_types_andesite_stonecutting.json +54188623046e989d21e6e155933e4084fb2882c4 data/create/advancements/recipes/building_blocks/cut_asurine_bricks_from_stone_types_asurine_stonecutting.json 536a2bed2ed1e7e249886ef376c96a8d5a1facdc data/create/advancements/recipes/building_blocks/cut_asurine_brick_slab.json a4e833cadfbb82222a70d66524e804c83ea13f7b data/create/advancements/recipes/building_blocks/cut_asurine_brick_slab_from_stone_types_asurine_stonecutting.json 610163ac2f4b06121931a81ac4b3df39ece61998 data/create/advancements/recipes/building_blocks/cut_asurine_brick_slab_recycling.json @@ -2738,7 +2739,6 @@ a4e833cadfbb82222a70d66524e804c83ea13f7b data/create/advancements/recipes/buildi f92f31e80cc026160217afb6c757987f75ed0b33 data/create/advancements/recipes/building_blocks/cut_asurine_brick_stairs_from_stone_types_asurine_stonecutting.json fa6dc7eaa32652a00a7217ae25967de0791088b6 data/create/advancements/recipes/building_blocks/cut_asurine_brick_wall.json 33f361369bfd92f53b3e40c837b336edd04a26e9 data/create/advancements/recipes/building_blocks/cut_asurine_brick_wall_from_stone_types_asurine_stonecutting.json -54188623046e989d21e6e155933e4084fb2882c4 data/create/advancements/recipes/building_blocks/cut_asurine_bricks_from_stone_types_asurine_stonecutting.json a6b871faa10badaaaa1a0ebbba94c4f2f627c43f data/create/advancements/recipes/building_blocks/cut_asurine_from_stone_types_asurine_stonecutting.json 719e1d4fea3457f2990be6a5d6cd87915d546217 data/create/advancements/recipes/building_blocks/cut_asurine_slab.json 586918291dda711c79941cf484cb62dbb853a271 data/create/advancements/recipes/building_blocks/cut_asurine_slab_from_stone_types_asurine_stonecutting.json @@ -2747,6 +2747,7 @@ bd2a630d242ae9c89b071b0401285068071a346c data/create/advancements/recipes/buildi 03d7b1609d161043e28661d74f53b06d4408f561 data/create/advancements/recipes/building_blocks/cut_asurine_stairs_from_stone_types_asurine_stonecutting.json cba4a6feaf695e665204cac36f9109ba941b12a6 data/create/advancements/recipes/building_blocks/cut_asurine_wall.json 3327651dd3f2fd778abdcfe70d25137d916f3def data/create/advancements/recipes/building_blocks/cut_asurine_wall_from_stone_types_asurine_stonecutting.json +44873f9d05abde7d52a6eacdf3573d8b69c69452 data/create/advancements/recipes/building_blocks/cut_calcite_bricks_from_stone_types_calcite_stonecutting.json a070ffe63c182b33c4c6faedb391f51a209c0e27 data/create/advancements/recipes/building_blocks/cut_calcite_brick_slab.json 7ba1e7add81422599f798153e4fd069e9fbfdebf data/create/advancements/recipes/building_blocks/cut_calcite_brick_slab_from_stone_types_calcite_stonecutting.json f5e80ec393c306485d666d6f9f91c55d9f1ba592 data/create/advancements/recipes/building_blocks/cut_calcite_brick_slab_recycling.json @@ -2754,7 +2755,6 @@ f5e80ec393c306485d666d6f9f91c55d9f1ba592 data/create/advancements/recipes/buildi 627f85aa63133cf95dd828092e0232b9ec8acfd5 data/create/advancements/recipes/building_blocks/cut_calcite_brick_stairs_from_stone_types_calcite_stonecutting.json d8870e522a68274cc90eab07ea17b7b6cdc5a16c data/create/advancements/recipes/building_blocks/cut_calcite_brick_wall.json cdf5927f3c1b3ef8904f38f66317412799e189fb data/create/advancements/recipes/building_blocks/cut_calcite_brick_wall_from_stone_types_calcite_stonecutting.json -44873f9d05abde7d52a6eacdf3573d8b69c69452 data/create/advancements/recipes/building_blocks/cut_calcite_bricks_from_stone_types_calcite_stonecutting.json 9f8c31b0db2aab8f1c8f42bcef15a74bc36887d4 data/create/advancements/recipes/building_blocks/cut_calcite_from_stone_types_calcite_stonecutting.json 857666ad1c6a5cc886f6896a18f560098afaa67b data/create/advancements/recipes/building_blocks/cut_calcite_slab.json c55074cd091b0e078105abdc940c62afa8984265 data/create/advancements/recipes/building_blocks/cut_calcite_slab_from_stone_types_calcite_stonecutting.json @@ -2763,6 +2763,7 @@ c55074cd091b0e078105abdc940c62afa8984265 data/create/advancements/recipes/buildi ba3378e1d08de2af0b2a725727cf9f68bda60044 data/create/advancements/recipes/building_blocks/cut_calcite_stairs_from_stone_types_calcite_stonecutting.json db5f4e1eee91c2a65d36164c20aba0e9d3a502ae data/create/advancements/recipes/building_blocks/cut_calcite_wall.json 19de370083d2cf1234c9c4e6ff45d85ef34a1ac8 data/create/advancements/recipes/building_blocks/cut_calcite_wall_from_stone_types_calcite_stonecutting.json +b9a2edda241f6e0677a2003300f0be5d3ff8f4b0 data/create/advancements/recipes/building_blocks/cut_crimsite_bricks_from_stone_types_crimsite_stonecutting.json 9fda0e6edde197a9c28a854419a2a07e323b6b53 data/create/advancements/recipes/building_blocks/cut_crimsite_brick_slab.json 2da3f139759be7eea552885b2063a0e2dfc647b1 data/create/advancements/recipes/building_blocks/cut_crimsite_brick_slab_from_stone_types_crimsite_stonecutting.json 62d928c8ab2e09a3f87adacb5adb1a5ddc1d2a7b data/create/advancements/recipes/building_blocks/cut_crimsite_brick_slab_recycling.json @@ -2770,7 +2771,6 @@ db5f4e1eee91c2a65d36164c20aba0e9d3a502ae data/create/advancements/recipes/buildi 89850244feb8a3293ba96702b7a56a4bea84e1f3 data/create/advancements/recipes/building_blocks/cut_crimsite_brick_stairs_from_stone_types_crimsite_stonecutting.json 267cab789c73d474299542fb0719967501fcf0c9 data/create/advancements/recipes/building_blocks/cut_crimsite_brick_wall.json 27007676b86eb8a3498982d8b5e68495b84d62d5 data/create/advancements/recipes/building_blocks/cut_crimsite_brick_wall_from_stone_types_crimsite_stonecutting.json -b9a2edda241f6e0677a2003300f0be5d3ff8f4b0 data/create/advancements/recipes/building_blocks/cut_crimsite_bricks_from_stone_types_crimsite_stonecutting.json a88d252d4e634ff194daa3ff98fd7e965e3ed09a data/create/advancements/recipes/building_blocks/cut_crimsite_from_stone_types_crimsite_stonecutting.json f703136e1783a42252bc1d89c31e5563cbdff583 data/create/advancements/recipes/building_blocks/cut_crimsite_slab.json 3330d332462da22de48d07b62277c1df8e646a3e data/create/advancements/recipes/building_blocks/cut_crimsite_slab_from_stone_types_crimsite_stonecutting.json @@ -2779,6 +2779,7 @@ c2707e5969f0c554537dda9d3e2a4c13e19863c3 data/create/advancements/recipes/buildi e9ba513178090b020525e72468a0450e225da779 data/create/advancements/recipes/building_blocks/cut_crimsite_stairs_from_stone_types_crimsite_stonecutting.json 7fb5ce65b7b5c2d76b4306d407aaa6eefe07b7e5 data/create/advancements/recipes/building_blocks/cut_crimsite_wall.json a83d5b669f92bd833af2768d2cf5d4797a86b63c data/create/advancements/recipes/building_blocks/cut_crimsite_wall_from_stone_types_crimsite_stonecutting.json +bc9eb21df37df4b69e5d202b3b770698a16f4413 data/create/advancements/recipes/building_blocks/cut_deepslate_bricks_from_stone_types_deepslate_stonecutting.json 2c380e8ddc83cef4213f136ff7a196d861728914 data/create/advancements/recipes/building_blocks/cut_deepslate_brick_slab.json 87b5dfc1e61fabe4e7661bea0d7a56cb75197a81 data/create/advancements/recipes/building_blocks/cut_deepslate_brick_slab_from_stone_types_deepslate_stonecutting.json 09cde6df1120cc5f5f129023885f323b4d1eeae9 data/create/advancements/recipes/building_blocks/cut_deepslate_brick_slab_recycling.json @@ -2786,7 +2787,6 @@ a83d5b669f92bd833af2768d2cf5d4797a86b63c data/create/advancements/recipes/buildi 28e15fe2c377540cb631f6648f49090f234e7704 data/create/advancements/recipes/building_blocks/cut_deepslate_brick_stairs_from_stone_types_deepslate_stonecutting.json d2b34f455ab0053f24a4f9dec7dcce45832ef25b data/create/advancements/recipes/building_blocks/cut_deepslate_brick_wall.json 7b174b65b813b4a9ca507e71fa142931e074f336 data/create/advancements/recipes/building_blocks/cut_deepslate_brick_wall_from_stone_types_deepslate_stonecutting.json -bc9eb21df37df4b69e5d202b3b770698a16f4413 data/create/advancements/recipes/building_blocks/cut_deepslate_bricks_from_stone_types_deepslate_stonecutting.json 83db3f5b46c996481b930974bddba75c82c115af data/create/advancements/recipes/building_blocks/cut_deepslate_from_stone_types_deepslate_stonecutting.json 8e8816aad8212c3557e77cc01df551fe1a0a306d data/create/advancements/recipes/building_blocks/cut_deepslate_slab.json 14ea447072200733dd9551a5ac6a9544593dd9f7 data/create/advancements/recipes/building_blocks/cut_deepslate_slab_from_stone_types_deepslate_stonecutting.json @@ -2795,6 +2795,7 @@ c7870abb459c8b174c380282ae211a87ab252521 data/create/advancements/recipes/buildi 4f157401a3019c96cc6ae5a0036f31351c651fbb data/create/advancements/recipes/building_blocks/cut_deepslate_stairs_from_stone_types_deepslate_stonecutting.json 9ae9635fa129aab54a7ec971b9cc61d300d3d53e data/create/advancements/recipes/building_blocks/cut_deepslate_wall.json 9b5df53000c79a7b20e3a1888e003b704809feda data/create/advancements/recipes/building_blocks/cut_deepslate_wall_from_stone_types_deepslate_stonecutting.json +fdef99789ca74623b00b05be2f975b63831645db data/create/advancements/recipes/building_blocks/cut_diorite_bricks_from_stone_types_diorite_stonecutting.json 30a00465dc9b19d8024146e2c2d6b9f41562da30 data/create/advancements/recipes/building_blocks/cut_diorite_brick_slab.json a55e7daf48a487d74b4a01e30b80968094154d2b data/create/advancements/recipes/building_blocks/cut_diorite_brick_slab_from_stone_types_diorite_stonecutting.json e445a3d8fd00f5e4f2ee56c797d8abf548598447 data/create/advancements/recipes/building_blocks/cut_diorite_brick_slab_recycling.json @@ -2802,7 +2803,6 @@ b421f24513612dd7a5d8977d7bff122fd5cf9522 data/create/advancements/recipes/buildi 3fe00adac35beeda79b7f9d930a1f13b033c0f12 data/create/advancements/recipes/building_blocks/cut_diorite_brick_stairs_from_stone_types_diorite_stonecutting.json 6d2235b8587863107a6d1a0818c81ee3dc217cdf data/create/advancements/recipes/building_blocks/cut_diorite_brick_wall.json 0ec4b69e98adf961f5d4d63700f11ad66a4116b5 data/create/advancements/recipes/building_blocks/cut_diorite_brick_wall_from_stone_types_diorite_stonecutting.json -fdef99789ca74623b00b05be2f975b63831645db data/create/advancements/recipes/building_blocks/cut_diorite_bricks_from_stone_types_diorite_stonecutting.json c9f52e0661fdc266f8429faf1570124fecfa2d6a data/create/advancements/recipes/building_blocks/cut_diorite_from_stone_types_diorite_stonecutting.json c7b73ddec6402e8b5ff5daedbbbc74f882338a8e data/create/advancements/recipes/building_blocks/cut_diorite_slab.json 46c841e5aae99106cbc28026dcfec946976127e5 data/create/advancements/recipes/building_blocks/cut_diorite_slab_from_stone_types_diorite_stonecutting.json @@ -2811,6 +2811,7 @@ ce67a5fae622955ad795e2b3d14c159a4c47b936 data/create/advancements/recipes/buildi 3b7ec28df80ea9cf87980b2c2184858ba6152a3f data/create/advancements/recipes/building_blocks/cut_diorite_stairs_from_stone_types_diorite_stonecutting.json c8fe9ab53eda2cdbff08678ebb577c169ea61a91 data/create/advancements/recipes/building_blocks/cut_diorite_wall.json 050f67b5a662bea3ef972521ef7f81c2ba99015c data/create/advancements/recipes/building_blocks/cut_diorite_wall_from_stone_types_diorite_stonecutting.json +b60683fdd629b201f40a6f9bb6594df7c5ac13f1 data/create/advancements/recipes/building_blocks/cut_dripstone_bricks_from_stone_types_dripstone_stonecutting.json 1e0d39ed56e2ab4eac084f26a1c6de905db29220 data/create/advancements/recipes/building_blocks/cut_dripstone_brick_slab.json 020cbc4c8063d186d3f5c9ece429e4cdff53cf63 data/create/advancements/recipes/building_blocks/cut_dripstone_brick_slab_from_stone_types_dripstone_stonecutting.json b44c9e7f9f62ffffb5566901e0a22010ba76641c data/create/advancements/recipes/building_blocks/cut_dripstone_brick_slab_recycling.json @@ -2818,7 +2819,6 @@ b44c9e7f9f62ffffb5566901e0a22010ba76641c data/create/advancements/recipes/buildi 466fbdf7de8dacd1032fb7af690862bb68707876 data/create/advancements/recipes/building_blocks/cut_dripstone_brick_stairs_from_stone_types_dripstone_stonecutting.json 253b54c191c933e88fa6a9b4e7c94340082c7d60 data/create/advancements/recipes/building_blocks/cut_dripstone_brick_wall.json e176568e3de8b8ca17a788f4cea89002b5ad2d1d data/create/advancements/recipes/building_blocks/cut_dripstone_brick_wall_from_stone_types_dripstone_stonecutting.json -b60683fdd629b201f40a6f9bb6594df7c5ac13f1 data/create/advancements/recipes/building_blocks/cut_dripstone_bricks_from_stone_types_dripstone_stonecutting.json ddc5a16cf0d2790d8133ab6801f4c55317d776e4 data/create/advancements/recipes/building_blocks/cut_dripstone_from_stone_types_dripstone_stonecutting.json 6e40c9af0747a8b3adb805ddd8fbb947aedb408c data/create/advancements/recipes/building_blocks/cut_dripstone_slab.json e7761f71f797d2e62dc0860cbd5153955b9be86c data/create/advancements/recipes/building_blocks/cut_dripstone_slab_from_stone_types_dripstone_stonecutting.json @@ -2827,6 +2827,7 @@ a199a9f78a44f4313a922b317893c68f743dc1a9 data/create/advancements/recipes/buildi b68a95a565ee9a3aec017431aa5b8cc6fffec3ef data/create/advancements/recipes/building_blocks/cut_dripstone_stairs_from_stone_types_dripstone_stonecutting.json a4287f34f95c008bdf7c0a886d05c3960665147b data/create/advancements/recipes/building_blocks/cut_dripstone_wall.json 76f5d4a6a9895064b15ae0c0f27a138bb3d57dbf data/create/advancements/recipes/building_blocks/cut_dripstone_wall_from_stone_types_dripstone_stonecutting.json +24cc01d592faf2bad57fc9b9a1de52c50d225446 data/create/advancements/recipes/building_blocks/cut_granite_bricks_from_stone_types_granite_stonecutting.json 83148f66dc7418740b6f9b6a660b0b9306d87f7c data/create/advancements/recipes/building_blocks/cut_granite_brick_slab.json d982802fc11848c87022f7bf05cecf090953002a data/create/advancements/recipes/building_blocks/cut_granite_brick_slab_from_stone_types_granite_stonecutting.json 6b8fa161725a4e2106226c3591a23def74398f48 data/create/advancements/recipes/building_blocks/cut_granite_brick_slab_recycling.json @@ -2834,7 +2835,6 @@ ce1c81b730b3acef9673f41769339f7d68385348 data/create/advancements/recipes/buildi e9732e3beaefbc6a457e0c4fd61f17f429f1cd8c data/create/advancements/recipes/building_blocks/cut_granite_brick_stairs_from_stone_types_granite_stonecutting.json 4f403aee2aae6aa0fc334b434cf5ade362153329 data/create/advancements/recipes/building_blocks/cut_granite_brick_wall.json 625c8849b5c07835b49dcb4322ec44586628a700 data/create/advancements/recipes/building_blocks/cut_granite_brick_wall_from_stone_types_granite_stonecutting.json -24cc01d592faf2bad57fc9b9a1de52c50d225446 data/create/advancements/recipes/building_blocks/cut_granite_bricks_from_stone_types_granite_stonecutting.json 07e6f3835c3683f007fd25140d671b668706484d data/create/advancements/recipes/building_blocks/cut_granite_from_stone_types_granite_stonecutting.json 2f33b7f82e977eb3fd0e0283313b1066eadadd18 data/create/advancements/recipes/building_blocks/cut_granite_slab.json a1b406ca98c2ba7d5225afea8463d586fc538428 data/create/advancements/recipes/building_blocks/cut_granite_slab_from_stone_types_granite_stonecutting.json @@ -2843,6 +2843,7 @@ af12a2d8f8bb2382f55135df8cfec00692a65fe3 data/create/advancements/recipes/buildi 284087e07acd28aa869d5433375e412f083108e9 data/create/advancements/recipes/building_blocks/cut_granite_stairs_from_stone_types_granite_stonecutting.json dbfb50c3d5048b1f5d8d74f39c389ecec81392d7 data/create/advancements/recipes/building_blocks/cut_granite_wall.json 6b287be7a900dbd715290b069a89ab226d6cec9c data/create/advancements/recipes/building_blocks/cut_granite_wall_from_stone_types_granite_stonecutting.json +4ef0a018dcf0b470061a4b1dbadc27684d8d467f data/create/advancements/recipes/building_blocks/cut_limestone_bricks_from_stone_types_limestone_stonecutting.json b0ade7dab7eb095f07882e4c19884162f18e704c data/create/advancements/recipes/building_blocks/cut_limestone_brick_slab.json 4fc2dc61d62a394cebc91e36745699eeaee650e7 data/create/advancements/recipes/building_blocks/cut_limestone_brick_slab_from_stone_types_limestone_stonecutting.json b8ec42f06ce9eb696643154d16150a223bd5ec65 data/create/advancements/recipes/building_blocks/cut_limestone_brick_slab_recycling.json @@ -2850,7 +2851,6 @@ d0b19c27309cd45d08a6a0cd779f1930bc2e7469 data/create/advancements/recipes/buildi 9f65617405592d587a940ff7513fcb34ca6ab423 data/create/advancements/recipes/building_blocks/cut_limestone_brick_stairs_from_stone_types_limestone_stonecutting.json 281e2ddcb58b603dea8f305ed6c8ddea98d0d030 data/create/advancements/recipes/building_blocks/cut_limestone_brick_wall.json 7b0ab5095a7d2b3e876a8c8b990161851c1c58c2 data/create/advancements/recipes/building_blocks/cut_limestone_brick_wall_from_stone_types_limestone_stonecutting.json -4ef0a018dcf0b470061a4b1dbadc27684d8d467f data/create/advancements/recipes/building_blocks/cut_limestone_bricks_from_stone_types_limestone_stonecutting.json f8663a45d71c52a3982c75bbfb61653c8d2fd668 data/create/advancements/recipes/building_blocks/cut_limestone_from_stone_types_limestone_stonecutting.json 9e22972cd4f2d673cfcf07a597f6a14402c91913 data/create/advancements/recipes/building_blocks/cut_limestone_slab.json 388a57bb88582eda9fef904a530f72b066d24e7d data/create/advancements/recipes/building_blocks/cut_limestone_slab_from_stone_types_limestone_stonecutting.json @@ -2859,6 +2859,7 @@ f8663a45d71c52a3982c75bbfb61653c8d2fd668 data/create/advancements/recipes/buildi b6dc46dca3fc039fd0fe53ab791731cb085c3b62 data/create/advancements/recipes/building_blocks/cut_limestone_stairs_from_stone_types_limestone_stonecutting.json a9382d5f876542bf4fa8aed605352daca4ad2f6f data/create/advancements/recipes/building_blocks/cut_limestone_wall.json 69d9116786c53cb3155bed4580d4b01bfe638243 data/create/advancements/recipes/building_blocks/cut_limestone_wall_from_stone_types_limestone_stonecutting.json +1f8ee1a91937295484d5c2fe0186a617589c1761 data/create/advancements/recipes/building_blocks/cut_ochrum_bricks_from_stone_types_ochrum_stonecutting.json a51d6ebed8e21e8808ccfbe9f9540291504da59a data/create/advancements/recipes/building_blocks/cut_ochrum_brick_slab.json eb08f00651259f83f6eced0f90dd8df0e9d0d508 data/create/advancements/recipes/building_blocks/cut_ochrum_brick_slab_from_stone_types_ochrum_stonecutting.json a189e0549723cefbd19a147274cd79909dca2b70 data/create/advancements/recipes/building_blocks/cut_ochrum_brick_slab_recycling.json @@ -2866,7 +2867,6 @@ a5dc9e74ad0d18d83bad3aab8c5e2768355a2370 data/create/advancements/recipes/buildi 27a5331727199b8b8f2dd6c581e25d17d12fc1ba data/create/advancements/recipes/building_blocks/cut_ochrum_brick_stairs_from_stone_types_ochrum_stonecutting.json 648e532441c664310047c5c9c78833d2eaea5920 data/create/advancements/recipes/building_blocks/cut_ochrum_brick_wall.json 053256b7b154ba5c10d2483d86658f132296e8f5 data/create/advancements/recipes/building_blocks/cut_ochrum_brick_wall_from_stone_types_ochrum_stonecutting.json -1f8ee1a91937295484d5c2fe0186a617589c1761 data/create/advancements/recipes/building_blocks/cut_ochrum_bricks_from_stone_types_ochrum_stonecutting.json 6abb6e36229685ca26ee31b5db3074a07453435e data/create/advancements/recipes/building_blocks/cut_ochrum_from_stone_types_ochrum_stonecutting.json 0c5e92fb20048fe5d9dcd42e10fd0f9b155c385a data/create/advancements/recipes/building_blocks/cut_ochrum_slab.json 941aba0ff7967d7ea56e1f811aa6bc34d4711796 data/create/advancements/recipes/building_blocks/cut_ochrum_slab_from_stone_types_ochrum_stonecutting.json @@ -2875,6 +2875,7 @@ fa14009e4de8cfdacdbb7679473ce359f2cb85be data/create/advancements/recipes/buildi d50accd7f37bfd9384790bdd727401757f6dc7e4 data/create/advancements/recipes/building_blocks/cut_ochrum_stairs_from_stone_types_ochrum_stonecutting.json ed0a72f6393c0d16240b89241f5bbac7dc003516 data/create/advancements/recipes/building_blocks/cut_ochrum_wall.json cda838f95015b0bf02fc5427e1a69ed6302b7e20 data/create/advancements/recipes/building_blocks/cut_ochrum_wall_from_stone_types_ochrum_stonecutting.json +a51cd5a82d9b30c8a68f7cdf8dd7a6b2f883c27c data/create/advancements/recipes/building_blocks/cut_scorchia_bricks_from_stone_types_scorchia_stonecutting.json ce33e5a98a83dae1f37ad4b3d4ea148de5bcacdf data/create/advancements/recipes/building_blocks/cut_scorchia_brick_slab.json 498825e9e5502a7ec8a1f23bfe998b960d7fc9eb data/create/advancements/recipes/building_blocks/cut_scorchia_brick_slab_from_stone_types_scorchia_stonecutting.json 8ffa08b1b4e4ab37dfbf09d2ec4a37f93c9503cb data/create/advancements/recipes/building_blocks/cut_scorchia_brick_slab_recycling.json @@ -2882,7 +2883,6 @@ ce33e5a98a83dae1f37ad4b3d4ea148de5bcacdf data/create/advancements/recipes/buildi 3c4b45560f446534821da63d4e713088928e5f4a data/create/advancements/recipes/building_blocks/cut_scorchia_brick_stairs_from_stone_types_scorchia_stonecutting.json 2aba76185175fff82898a7a905d3ec4ff448deaa data/create/advancements/recipes/building_blocks/cut_scorchia_brick_wall.json ca1f54af4425df994c6707f00e43b8db3ce66280 data/create/advancements/recipes/building_blocks/cut_scorchia_brick_wall_from_stone_types_scorchia_stonecutting.json -a51cd5a82d9b30c8a68f7cdf8dd7a6b2f883c27c data/create/advancements/recipes/building_blocks/cut_scorchia_bricks_from_stone_types_scorchia_stonecutting.json df847f312960866d3d53f48297ea3169c27314eb data/create/advancements/recipes/building_blocks/cut_scorchia_from_stone_types_scorchia_stonecutting.json 8095f7be8aac4f11d618549680d537bed8a921c5 data/create/advancements/recipes/building_blocks/cut_scorchia_slab.json a53831cf7f095fa4d0d92051bd0e21f912c2d9dd data/create/advancements/recipes/building_blocks/cut_scorchia_slab_from_stone_types_scorchia_stonecutting.json @@ -2891,6 +2891,7 @@ a53831cf7f095fa4d0d92051bd0e21f912c2d9dd data/create/advancements/recipes/buildi 30f1efaa46771dd22d7f3aa34f24c69bbdb59bd5 data/create/advancements/recipes/building_blocks/cut_scorchia_stairs_from_stone_types_scorchia_stonecutting.json e02d188d64b270682fa9d335a3423880d8358a0d data/create/advancements/recipes/building_blocks/cut_scorchia_wall.json 834c5a2a8d089822fa81a75b290818db276beab7 data/create/advancements/recipes/building_blocks/cut_scorchia_wall_from_stone_types_scorchia_stonecutting.json +2030ec21c96336bd4c4040857f40ec65d1a75075 data/create/advancements/recipes/building_blocks/cut_scoria_bricks_from_stone_types_scoria_stonecutting.json 705dfcd9f4b6b8a0c360436c097cb371c27cf60d data/create/advancements/recipes/building_blocks/cut_scoria_brick_slab.json 482cf1bbb65a4facc0ebf31ea91bab4d03580635 data/create/advancements/recipes/building_blocks/cut_scoria_brick_slab_from_stone_types_scoria_stonecutting.json 51d070acfc8ad4cd8ca4457ca346458c81eaade4 data/create/advancements/recipes/building_blocks/cut_scoria_brick_slab_recycling.json @@ -2898,7 +2899,6 @@ e02d188d64b270682fa9d335a3423880d8358a0d data/create/advancements/recipes/buildi 99ca117e6a4ad242d92566a2f398c28edb3b7061 data/create/advancements/recipes/building_blocks/cut_scoria_brick_stairs_from_stone_types_scoria_stonecutting.json 01e294976d8ce71b59fb14a47e2686bdce4fab21 data/create/advancements/recipes/building_blocks/cut_scoria_brick_wall.json 0c1d31d37a17d4bd752508022ddd9690bb92a521 data/create/advancements/recipes/building_blocks/cut_scoria_brick_wall_from_stone_types_scoria_stonecutting.json -2030ec21c96336bd4c4040857f40ec65d1a75075 data/create/advancements/recipes/building_blocks/cut_scoria_bricks_from_stone_types_scoria_stonecutting.json 41f420c88dbf61d3cb51966cca9b495d10c604d3 data/create/advancements/recipes/building_blocks/cut_scoria_from_stone_types_scoria_stonecutting.json 26c8447854e29243f0697236f59e258fa96ed369 data/create/advancements/recipes/building_blocks/cut_scoria_slab.json f3e2522664de4ff2ad92a89443e064ac857b7aef data/create/advancements/recipes/building_blocks/cut_scoria_slab_from_stone_types_scoria_stonecutting.json @@ -2907,6 +2907,7 @@ a0635452fd698415e8112e9e0f6d71571901ca34 data/create/advancements/recipes/buildi 1bb047298b71a57e8632607af7b17bab2690aecb data/create/advancements/recipes/building_blocks/cut_scoria_stairs_from_stone_types_scoria_stonecutting.json a33878fe778438a746a28c1fd03ca6d01092ebe4 data/create/advancements/recipes/building_blocks/cut_scoria_wall.json 74a637d0d0f360ad692661c0213c18a06a8ec500 data/create/advancements/recipes/building_blocks/cut_scoria_wall_from_stone_types_scoria_stonecutting.json +f0870d596d9ac9e5b5272fb4e3d2c90c29f3a63d data/create/advancements/recipes/building_blocks/cut_tuff_bricks_from_stone_types_tuff_stonecutting.json b75410afdb8775b2a834ded315913e0ae38e4df8 data/create/advancements/recipes/building_blocks/cut_tuff_brick_slab.json 34c2aead2f2355a8f0f9f9aa7dba58dd5187dbba data/create/advancements/recipes/building_blocks/cut_tuff_brick_slab_from_stone_types_tuff_stonecutting.json c071c43e93cc1735bebbbf320f1b8d2cba4be1e3 data/create/advancements/recipes/building_blocks/cut_tuff_brick_slab_recycling.json @@ -2914,7 +2915,6 @@ c89ec2300425688f9e72e45c64def0b09c0219b0 data/create/advancements/recipes/buildi c882f72f5a31bc92a8186834b105a2e07d864366 data/create/advancements/recipes/building_blocks/cut_tuff_brick_stairs_from_stone_types_tuff_stonecutting.json 70295775a6170a1332f5604aaf75a026630c9e93 data/create/advancements/recipes/building_blocks/cut_tuff_brick_wall.json 1b79d0e71dae77967c1554c203e68eeb51fe8054 data/create/advancements/recipes/building_blocks/cut_tuff_brick_wall_from_stone_types_tuff_stonecutting.json -f0870d596d9ac9e5b5272fb4e3d2c90c29f3a63d data/create/advancements/recipes/building_blocks/cut_tuff_bricks_from_stone_types_tuff_stonecutting.json 549d1f911c009a3cafff4edcb37116c92c2b8e21 data/create/advancements/recipes/building_blocks/cut_tuff_from_stone_types_tuff_stonecutting.json 5bc3e40a8e50a521ebd5fa58efa3ec21064163f7 data/create/advancements/recipes/building_blocks/cut_tuff_slab.json f1ab5be6cb7287517d87b173680ddf833a1dd534 data/create/advancements/recipes/building_blocks/cut_tuff_slab_from_stone_types_tuff_stonecutting.json @@ -2923,6 +2923,7 @@ b7d19085017530f0c2122511c35dbef6a50b337f data/create/advancements/recipes/buildi 3c9541b6e4eb8ff7f7b627a75e8c38ed9eeaf342 data/create/advancements/recipes/building_blocks/cut_tuff_stairs_from_stone_types_tuff_stonecutting.json 51ca798b8bd822ddbbfe8f07073eefb948b97b42 data/create/advancements/recipes/building_blocks/cut_tuff_wall.json 1aa1a0d00c19069f0c55e698b474115d7f437355 data/create/advancements/recipes/building_blocks/cut_tuff_wall_from_stone_types_tuff_stonecutting.json +6a80920618d8e9b7919c83c419e751971440d38a data/create/advancements/recipes/building_blocks/cut_veridium_bricks_from_stone_types_veridium_stonecutting.json e263f555c3a47c83187d29ae9b816edc0c1a763b data/create/advancements/recipes/building_blocks/cut_veridium_brick_slab.json f0e84bde804e52f504cd93bee5058a89f6939dc9 data/create/advancements/recipes/building_blocks/cut_veridium_brick_slab_from_stone_types_veridium_stonecutting.json 949fe819c76fd63edfd93bef5898119c8456fda3 data/create/advancements/recipes/building_blocks/cut_veridium_brick_slab_recycling.json @@ -2930,7 +2931,6 @@ fc87560dedbc951d10d9650a6f27192e7c3a1cc5 data/create/advancements/recipes/buildi 35b09d6300ff8e86f01bc0258fca5cfa80d55c61 data/create/advancements/recipes/building_blocks/cut_veridium_brick_stairs_from_stone_types_veridium_stonecutting.json 599d9ce510531c6006a4964bb4049a850a8457ee data/create/advancements/recipes/building_blocks/cut_veridium_brick_wall.json aaaad7a65a1c05071565ca91a181ff3c375e0141 data/create/advancements/recipes/building_blocks/cut_veridium_brick_wall_from_stone_types_veridium_stonecutting.json -6a80920618d8e9b7919c83c419e751971440d38a data/create/advancements/recipes/building_blocks/cut_veridium_bricks_from_stone_types_veridium_stonecutting.json c76ae7944646e8f13ea460ba6655b95b6c2798ea data/create/advancements/recipes/building_blocks/cut_veridium_from_stone_types_veridium_stonecutting.json 3bafa8873b62cb0333b44af77f2c6e824c5b3e95 data/create/advancements/recipes/building_blocks/cut_veridium_slab.json 143f64b0e5536693262f6a62c2a6fbf85bd4203e data/create/advancements/recipes/building_blocks/cut_veridium_slab_from_stone_types_veridium_stonecutting.json @@ -3116,6 +3116,7 @@ c4c087911453bd979e028d3b3558b273e3cb5926 data/create/advancements/recipes/buildi 780bb3d13fcd8abf6e166b04566b141e023ee11e data/create/advancements/recipes/building_blocks/scorchia_pillar_from_stone_types_scorchia_stonecutting.json 5c5c5080c1136c046caee2d14dd2c3c9f09abad3 data/create/advancements/recipes/building_blocks/scoria_from_stone_types_scoria_stonecutting.json 5a6b12869ffcbd1d9b4fbe1fee444fcde95d2953 data/create/advancements/recipes/building_blocks/scoria_pillar_from_stone_types_scoria_stonecutting.json +a51ca3151c517113338720edeac0e02a46ebb03a data/create/advancements/recipes/building_blocks/small_andesite_bricks_from_stone_types_andesite_stonecutting.json f72093994236a0580c6cafd08fb42f061733de01 data/create/advancements/recipes/building_blocks/small_andesite_brick_slab.json 05092201e6c514d3eae566fb1ce98ad415660112 data/create/advancements/recipes/building_blocks/small_andesite_brick_slab_from_stone_types_andesite_stonecutting.json 0e41d75b613a0ebd0c023669dcfd34f11b14fd0e data/create/advancements/recipes/building_blocks/small_andesite_brick_slab_recycling.json @@ -3123,7 +3124,7 @@ f72093994236a0580c6cafd08fb42f061733de01 data/create/advancements/recipes/buildi 8bbf898cbc47ac7a326c0d082a92a452b6915a7e data/create/advancements/recipes/building_blocks/small_andesite_brick_stairs_from_stone_types_andesite_stonecutting.json 9e0685dd668550c67812d1caccd8c8cae9f2041c data/create/advancements/recipes/building_blocks/small_andesite_brick_wall.json 7a1bfa848f950482f82d7fe7a9cf3cf916f91702 data/create/advancements/recipes/building_blocks/small_andesite_brick_wall_from_stone_types_andesite_stonecutting.json -a51ca3151c517113338720edeac0e02a46ebb03a data/create/advancements/recipes/building_blocks/small_andesite_bricks_from_stone_types_andesite_stonecutting.json +0bfa788d0038077a88678ff16104a8b82038b3da data/create/advancements/recipes/building_blocks/small_asurine_bricks_from_stone_types_asurine_stonecutting.json 3dccee988c08e1988886d9f09f2b5b42332ac083 data/create/advancements/recipes/building_blocks/small_asurine_brick_slab.json 438469fb06dff95a0ab9e0cb183795432d9b78dd data/create/advancements/recipes/building_blocks/small_asurine_brick_slab_from_stone_types_asurine_stonecutting.json 3eb65706d975e6f1e429f43d7384272a58872f10 data/create/advancements/recipes/building_blocks/small_asurine_brick_slab_recycling.json @@ -3131,7 +3132,7 @@ fb8cab1a3ecef97eaf7d744bb0d1d09d46859b60 data/create/advancements/recipes/buildi 525fff52f5dea3178356b7c5f7606d2a369b346e data/create/advancements/recipes/building_blocks/small_asurine_brick_stairs_from_stone_types_asurine_stonecutting.json 39df7ef2b88df45ba4a06bfa9cd7f863f813cb30 data/create/advancements/recipes/building_blocks/small_asurine_brick_wall.json 21aa9dc72b12eb0a33cdc9904ee595de802b55f4 data/create/advancements/recipes/building_blocks/small_asurine_brick_wall_from_stone_types_asurine_stonecutting.json -0bfa788d0038077a88678ff16104a8b82038b3da data/create/advancements/recipes/building_blocks/small_asurine_bricks_from_stone_types_asurine_stonecutting.json +46666ef8d341971cdd989f14575973777a85cdc6 data/create/advancements/recipes/building_blocks/small_calcite_bricks_from_stone_types_calcite_stonecutting.json d61fce64a295a2c3b9433bc27ac50f4f1f6a678d data/create/advancements/recipes/building_blocks/small_calcite_brick_slab.json 7f2e73d01b9bff473c4ecf76ab967b3aa934ff87 data/create/advancements/recipes/building_blocks/small_calcite_brick_slab_from_stone_types_calcite_stonecutting.json 1095487af055116acc2eba87d92dd0918385e9ac data/create/advancements/recipes/building_blocks/small_calcite_brick_slab_recycling.json @@ -3139,7 +3140,7 @@ d61fce64a295a2c3b9433bc27ac50f4f1f6a678d data/create/advancements/recipes/buildi e3bd0900dc92b26fe69c7f4e81db76678505222b data/create/advancements/recipes/building_blocks/small_calcite_brick_stairs_from_stone_types_calcite_stonecutting.json c88fb3af07c32aa127cbe0043075f50fed869839 data/create/advancements/recipes/building_blocks/small_calcite_brick_wall.json ea58b78e177134c73ed5bfb081761f90cc7caa3e data/create/advancements/recipes/building_blocks/small_calcite_brick_wall_from_stone_types_calcite_stonecutting.json -46666ef8d341971cdd989f14575973777a85cdc6 data/create/advancements/recipes/building_blocks/small_calcite_bricks_from_stone_types_calcite_stonecutting.json +c48216f26cfe93ce99f7f2f0e9f68d1ee2a95e46 data/create/advancements/recipes/building_blocks/small_crimsite_bricks_from_stone_types_crimsite_stonecutting.json ed4d6e7779749dd647f744f0486e78b93057aa33 data/create/advancements/recipes/building_blocks/small_crimsite_brick_slab.json 7f3ad6d79eb9d433d5a0e295eb2b099a5f815876 data/create/advancements/recipes/building_blocks/small_crimsite_brick_slab_from_stone_types_crimsite_stonecutting.json b980fcc4b29f9ff897dd867222fc4248d76e808a data/create/advancements/recipes/building_blocks/small_crimsite_brick_slab_recycling.json @@ -3147,7 +3148,7 @@ b980fcc4b29f9ff897dd867222fc4248d76e808a data/create/advancements/recipes/buildi c06600eda4e4bd7c46e4e315a0569fbdfa4bb087 data/create/advancements/recipes/building_blocks/small_crimsite_brick_stairs_from_stone_types_crimsite_stonecutting.json 4021a4a761b06def09f19d6a60bc0722e69ec08d data/create/advancements/recipes/building_blocks/small_crimsite_brick_wall.json 2d8eae517a914e93538307efe23d532582d487e2 data/create/advancements/recipes/building_blocks/small_crimsite_brick_wall_from_stone_types_crimsite_stonecutting.json -c48216f26cfe93ce99f7f2f0e9f68d1ee2a95e46 data/create/advancements/recipes/building_blocks/small_crimsite_bricks_from_stone_types_crimsite_stonecutting.json +ed82f0fac452147faa997af1d45278f501ef165b data/create/advancements/recipes/building_blocks/small_deepslate_bricks_from_stone_types_deepslate_stonecutting.json e4674821cc17adadecacc55d48c028847caf5fea data/create/advancements/recipes/building_blocks/small_deepslate_brick_slab.json 8c0c51d052b110fec3668618be2bdeaf8d0c7cc5 data/create/advancements/recipes/building_blocks/small_deepslate_brick_slab_from_stone_types_deepslate_stonecutting.json f8f7ace802b6c73fabfabbaae1c1383a3c0bcf6b data/create/advancements/recipes/building_blocks/small_deepslate_brick_slab_recycling.json @@ -3155,7 +3156,7 @@ e2e16c3c0e761ef44f9b21ae3bd95300a33459be data/create/advancements/recipes/buildi 37ef4192f1db7dd5c066a47480f86f60687c9894 data/create/advancements/recipes/building_blocks/small_deepslate_brick_stairs_from_stone_types_deepslate_stonecutting.json 6f4d365ce26fb4081a5af0f6e21631209b5b106d data/create/advancements/recipes/building_blocks/small_deepslate_brick_wall.json e0c7377c55dc94b8efd62cb6f57325c94206cbf4 data/create/advancements/recipes/building_blocks/small_deepslate_brick_wall_from_stone_types_deepslate_stonecutting.json -ed82f0fac452147faa997af1d45278f501ef165b data/create/advancements/recipes/building_blocks/small_deepslate_bricks_from_stone_types_deepslate_stonecutting.json +9bb23924495112ba177d12ba2a5adcb872a2b76f data/create/advancements/recipes/building_blocks/small_diorite_bricks_from_stone_types_diorite_stonecutting.json d4b96bcd8902e9bce19603abb99cb7edeb260189 data/create/advancements/recipes/building_blocks/small_diorite_brick_slab.json 2ed3800996491c9a1db23d9cbed04cc5ee963df6 data/create/advancements/recipes/building_blocks/small_diorite_brick_slab_from_stone_types_diorite_stonecutting.json 895d2158ba0783c5fd97b802ef5866d7532df6ba data/create/advancements/recipes/building_blocks/small_diorite_brick_slab_recycling.json @@ -3163,7 +3164,7 @@ d4b96bcd8902e9bce19603abb99cb7edeb260189 data/create/advancements/recipes/buildi 0f4b92965c05ddf71fa24b2b08a0cce358ac8dd1 data/create/advancements/recipes/building_blocks/small_diorite_brick_stairs_from_stone_types_diorite_stonecutting.json 633d921515fb4ad0e3177f3c8f151da80008053b data/create/advancements/recipes/building_blocks/small_diorite_brick_wall.json 3dea60492331bcd3253d90534559cc0bdb0822ae data/create/advancements/recipes/building_blocks/small_diorite_brick_wall_from_stone_types_diorite_stonecutting.json -9bb23924495112ba177d12ba2a5adcb872a2b76f data/create/advancements/recipes/building_blocks/small_diorite_bricks_from_stone_types_diorite_stonecutting.json +632ced3760d55b56d1620e447b8b762e0e4a29f3 data/create/advancements/recipes/building_blocks/small_dripstone_bricks_from_stone_types_dripstone_stonecutting.json 92bb21a400d9720a2f06882049d5b3863a93969d data/create/advancements/recipes/building_blocks/small_dripstone_brick_slab.json 02e2b98eeef9cdc20a8678beec4c7aa8a6cde948 data/create/advancements/recipes/building_blocks/small_dripstone_brick_slab_from_stone_types_dripstone_stonecutting.json 35830242bc48b1355830d6cb17dc4dc547d51bc0 data/create/advancements/recipes/building_blocks/small_dripstone_brick_slab_recycling.json @@ -3171,7 +3172,7 @@ d4b96bcd8902e9bce19603abb99cb7edeb260189 data/create/advancements/recipes/buildi 92523f3058a580743f95e9347fa97e0f5f6483f6 data/create/advancements/recipes/building_blocks/small_dripstone_brick_stairs_from_stone_types_dripstone_stonecutting.json 6e26ab4ad96225b7dd1a4aa06295b0d85e87400b data/create/advancements/recipes/building_blocks/small_dripstone_brick_wall.json e30a5f31d6478dfe7693077727b1abfc40b33f9b data/create/advancements/recipes/building_blocks/small_dripstone_brick_wall_from_stone_types_dripstone_stonecutting.json -632ced3760d55b56d1620e447b8b762e0e4a29f3 data/create/advancements/recipes/building_blocks/small_dripstone_bricks_from_stone_types_dripstone_stonecutting.json +1805b7f9db21b4530b173ab6945584e7d852b218 data/create/advancements/recipes/building_blocks/small_granite_bricks_from_stone_types_granite_stonecutting.json a2929bbd4c81b9601aeca74110936343102b7b5a data/create/advancements/recipes/building_blocks/small_granite_brick_slab.json 0fa83c337d5612e2b8368d5bff34117e0c1cf40a data/create/advancements/recipes/building_blocks/small_granite_brick_slab_from_stone_types_granite_stonecutting.json 0bc47cb22cc70a34879092a57c87551e6fa9f634 data/create/advancements/recipes/building_blocks/small_granite_brick_slab_recycling.json @@ -3179,7 +3180,7 @@ a2929bbd4c81b9601aeca74110936343102b7b5a data/create/advancements/recipes/buildi 44f3e71a4e8b78db74a21a42c3cebfbc15fe0180 data/create/advancements/recipes/building_blocks/small_granite_brick_stairs_from_stone_types_granite_stonecutting.json 3a6edafcb559e767caf421cf1bd6e064940f33e2 data/create/advancements/recipes/building_blocks/small_granite_brick_wall.json cac9914c729c0ecf5e9e1b4fe6498005e7c532f3 data/create/advancements/recipes/building_blocks/small_granite_brick_wall_from_stone_types_granite_stonecutting.json -1805b7f9db21b4530b173ab6945584e7d852b218 data/create/advancements/recipes/building_blocks/small_granite_bricks_from_stone_types_granite_stonecutting.json +1ca86b11356749caf7515fc61b8ac5de53d019f6 data/create/advancements/recipes/building_blocks/small_limestone_bricks_from_stone_types_limestone_stonecutting.json 4f3cc93f422ee9f05587b89d6729a6cc86f572c0 data/create/advancements/recipes/building_blocks/small_limestone_brick_slab.json 02d0c45cd014fd660a9d3eb1c1c6b40ba806b2fb data/create/advancements/recipes/building_blocks/small_limestone_brick_slab_from_stone_types_limestone_stonecutting.json 8fb46bce94f6cca943e4ae427c04d9617ada277d data/create/advancements/recipes/building_blocks/small_limestone_brick_slab_recycling.json @@ -3187,7 +3188,7 @@ cac9914c729c0ecf5e9e1b4fe6498005e7c532f3 data/create/advancements/recipes/buildi 00b61a4d23f8b16a7e4d9bf46fbe52c6b5dd561c data/create/advancements/recipes/building_blocks/small_limestone_brick_stairs_from_stone_types_limestone_stonecutting.json 7c6b80f174687efe10007c0235f2a68db7062b12 data/create/advancements/recipes/building_blocks/small_limestone_brick_wall.json 7f9ade635dcda8d5baae2bbdddc018bcc715f681 data/create/advancements/recipes/building_blocks/small_limestone_brick_wall_from_stone_types_limestone_stonecutting.json -1ca86b11356749caf7515fc61b8ac5de53d019f6 data/create/advancements/recipes/building_blocks/small_limestone_bricks_from_stone_types_limestone_stonecutting.json +bab018a0adcbc0582ba756158941a87923b20384 data/create/advancements/recipes/building_blocks/small_ochrum_bricks_from_stone_types_ochrum_stonecutting.json 9c98b7b56f92f6adc75473f5b0ae4dc69ac8aa9a data/create/advancements/recipes/building_blocks/small_ochrum_brick_slab.json 611fb57772f1446236256f1235751dec6f81cd0e data/create/advancements/recipes/building_blocks/small_ochrum_brick_slab_from_stone_types_ochrum_stonecutting.json 243821a2c3e465f5346ad58e0afda624c09ab946 data/create/advancements/recipes/building_blocks/small_ochrum_brick_slab_recycling.json @@ -3195,8 +3196,8 @@ b9a16792e6158a2923454c9a44d9c176c9607c24 data/create/advancements/recipes/buildi bb91a8ba1ef1c8cb725f18a4d577bb476b9ae68d data/create/advancements/recipes/building_blocks/small_ochrum_brick_stairs_from_stone_types_ochrum_stonecutting.json 5cf5574da0b29895960fa7f0fd63d3f81814f7b3 data/create/advancements/recipes/building_blocks/small_ochrum_brick_wall.json 1b5d14c921a85a3a5cdb9f845d4f0ddf98f87347 data/create/advancements/recipes/building_blocks/small_ochrum_brick_wall_from_stone_types_ochrum_stonecutting.json -bab018a0adcbc0582ba756158941a87923b20384 data/create/advancements/recipes/building_blocks/small_ochrum_bricks_from_stone_types_ochrum_stonecutting.json 8d6ccacf1af917094b1688ed70dc75bf54611e93 data/create/advancements/recipes/building_blocks/small_rose_quartz_tiles_from_polished_rose_quartz_stonecutting.json +7d679c66588f8a717619a7f89861d57ec04f04a1 data/create/advancements/recipes/building_blocks/small_scorchia_bricks_from_stone_types_scorchia_stonecutting.json 2003f1248faaeb4fe6761febda8e29d087f99dc7 data/create/advancements/recipes/building_blocks/small_scorchia_brick_slab.json ff5c50697aefe21c1570230a13255c912744b629 data/create/advancements/recipes/building_blocks/small_scorchia_brick_slab_from_stone_types_scorchia_stonecutting.json 8d1fd41b03940add231fa207d3ddaa1f78cf2b85 data/create/advancements/recipes/building_blocks/small_scorchia_brick_slab_recycling.json @@ -3204,7 +3205,7 @@ ff5c50697aefe21c1570230a13255c912744b629 data/create/advancements/recipes/buildi 8586f387cc9bb74250369373348005f6aa686af2 data/create/advancements/recipes/building_blocks/small_scorchia_brick_stairs_from_stone_types_scorchia_stonecutting.json 94552be031c17f5ef9d97cf5fe33beb15141291f data/create/advancements/recipes/building_blocks/small_scorchia_brick_wall.json 86e866f92095b03b5d77a91425e5e2ef307f4852 data/create/advancements/recipes/building_blocks/small_scorchia_brick_wall_from_stone_types_scorchia_stonecutting.json -7d679c66588f8a717619a7f89861d57ec04f04a1 data/create/advancements/recipes/building_blocks/small_scorchia_bricks_from_stone_types_scorchia_stonecutting.json +e542cd94f84a90530332608b1040e2e6189a51fe data/create/advancements/recipes/building_blocks/small_scoria_bricks_from_stone_types_scoria_stonecutting.json ad4c35afd6c3d55b356e38289c64e8cf6d194d10 data/create/advancements/recipes/building_blocks/small_scoria_brick_slab.json 2f1acca02bb5a40bf174ceeb5272ba1243b8635c data/create/advancements/recipes/building_blocks/small_scoria_brick_slab_from_stone_types_scoria_stonecutting.json dba264e073eab7b2fb1494cb117574b6a6b83919 data/create/advancements/recipes/building_blocks/small_scoria_brick_slab_recycling.json @@ -3212,7 +3213,7 @@ dba264e073eab7b2fb1494cb117574b6a6b83919 data/create/advancements/recipes/buildi 0e64e1dc80a0b84e05260191951ed930a8e578f6 data/create/advancements/recipes/building_blocks/small_scoria_brick_stairs_from_stone_types_scoria_stonecutting.json 95b866fac218affb9aac93272f5436e30dd4678c data/create/advancements/recipes/building_blocks/small_scoria_brick_wall.json 23493359766c969d2fa64575c5af047e6a924373 data/create/advancements/recipes/building_blocks/small_scoria_brick_wall_from_stone_types_scoria_stonecutting.json -e542cd94f84a90530332608b1040e2e6189a51fe data/create/advancements/recipes/building_blocks/small_scoria_bricks_from_stone_types_scoria_stonecutting.json +b7fc4fbd0d6ce28946b5cbef40d86de3ca37f695 data/create/advancements/recipes/building_blocks/small_tuff_bricks_from_stone_types_tuff_stonecutting.json 03acb1becaa3c7f6fc0ced99e6afcf4ac0ec4cb2 data/create/advancements/recipes/building_blocks/small_tuff_brick_slab.json 599693bc47bfd65cc9e3babc0a2f33c0d2bbfd31 data/create/advancements/recipes/building_blocks/small_tuff_brick_slab_from_stone_types_tuff_stonecutting.json aae2cb75ee4b9312e79dfea519c35f5e20ed4da6 data/create/advancements/recipes/building_blocks/small_tuff_brick_slab_recycling.json @@ -3220,7 +3221,7 @@ c72364e32b82f45f17491dd41967373c35d8dfb5 data/create/advancements/recipes/buildi 369763433d6af43d94392e870b3d861f739ba0f9 data/create/advancements/recipes/building_blocks/small_tuff_brick_stairs_from_stone_types_tuff_stonecutting.json 506bbae420bff66d492214c49dabf52e5cbcf6e4 data/create/advancements/recipes/building_blocks/small_tuff_brick_wall.json 6db7e4b981ec28c776988a531c03dbe28fb0a1c2 data/create/advancements/recipes/building_blocks/small_tuff_brick_wall_from_stone_types_tuff_stonecutting.json -b7fc4fbd0d6ce28946b5cbef40d86de3ca37f695 data/create/advancements/recipes/building_blocks/small_tuff_bricks_from_stone_types_tuff_stonecutting.json +9fd6e20a4555b591b17ef225316782de333780fa data/create/advancements/recipes/building_blocks/small_veridium_bricks_from_stone_types_veridium_stonecutting.json b61a773f683c415617a408fa0781e7e7d61cb1af data/create/advancements/recipes/building_blocks/small_veridium_brick_slab.json 526a5323263292bd091c03231a156e18460c34a1 data/create/advancements/recipes/building_blocks/small_veridium_brick_slab_from_stone_types_veridium_stonecutting.json ef040b7189b17cce9dd69c47af61c7abca6f43cd data/create/advancements/recipes/building_blocks/small_veridium_brick_slab_recycling.json @@ -3228,7 +3229,6 @@ ef040b7189b17cce9dd69c47af61c7abca6f43cd data/create/advancements/recipes/buildi 6a12b73815434a544881680cb071f273a75f62a5 data/create/advancements/recipes/building_blocks/small_veridium_brick_stairs_from_stone_types_veridium_stonecutting.json e6dfacd8f2f57d4df42927783750254f7163251a data/create/advancements/recipes/building_blocks/small_veridium_brick_wall.json ee4012cc014539be113ace8f80e51c85d2daead9 data/create/advancements/recipes/building_blocks/small_veridium_brick_wall_from_stone_types_veridium_stonecutting.json -9fd6e20a4555b591b17ef225316782de333780fa data/create/advancements/recipes/building_blocks/small_veridium_bricks_from_stone_types_veridium_stonecutting.json 03a87030672d40b0b2b6ad085103c9a5cef067ce data/create/advancements/recipes/building_blocks/spruce_window.json dfea65f25ebcbe0caf2694dec3d3ea616e2e9291 data/create/advancements/recipes/building_blocks/spruce_window_pane.json 763b3b49296a284f41cbccdc7f1ffb13c89d42db data/create/advancements/recipes/building_blocks/tiled_glass_from_glass_colorless_stonecutting.json @@ -3382,13 +3382,13 @@ fa0856e11351ad0882de2066569807e782071881 data/create/loot_tables/blocks/copper_b 0937b9f634b86dbe41e07eda52c69993fce60fb5 data/create/loot_tables/blocks/copper_door.json 8ed70d812f38adfa147db07a4f2bbe206a69ad20 data/create/loot_tables/blocks/copper_ladder.json ac621731ca23e6fbb1003be59edacdf837dbc37e data/create/loot_tables/blocks/copper_scaffolding.json +9be387731859ccc3aec7701c1804ddc3c5dde216 data/create/loot_tables/blocks/copper_shingles.json be31f0c68bfe80dff88959bd30ef9a9080dd3b3b data/create/loot_tables/blocks/copper_shingle_slab.json 83ae2652a2df217730d6fb34a65c3962e82a961d data/create/loot_tables/blocks/copper_shingle_stairs.json -9be387731859ccc3aec7701c1804ddc3c5dde216 data/create/loot_tables/blocks/copper_shingles.json f6a29868a011d9ad73bc29be94ec2a07a2626323 data/create/loot_tables/blocks/copper_table_cloth.json +9cb359c96543d7421250c4ef4e83a5e170974efb data/create/loot_tables/blocks/copper_tiles.json adbe83d6bf88dd7d2b0b8788bb619cedd37f59d9 data/create/loot_tables/blocks/copper_tile_slab.json 1e06f16b1fa8e78af5cbfc90ba8ff1136de83d2d data/create/loot_tables/blocks/copper_tile_stairs.json -9cb359c96543d7421250c4ef4e83a5e170974efb data/create/loot_tables/blocks/copper_tiles.json 4f75cad20e6b091d1f07cf3db98520d2dc3af5e7 data/create/loot_tables/blocks/copper_valve_handle.json 14a493a7bad6bd399b662da470b71810bd56e812 data/create/loot_tables/blocks/copycat_bars.json 3a2f3ab0834a0c5089ba0a11f5e9784ce59ef6d8 data/create/loot_tables/blocks/copycat_base.json @@ -3404,114 +3404,114 @@ d5d2f565bab2e2b81b0798fc7ce0e21acd362ce5 data/create/loot_tables/blocks/crimson_ b892718d33caf0c260b902c92f46f3bfd827af45 data/create/loot_tables/blocks/crushing_wheel.json ff7853a5d5c0f3bddbcfe07e47efd1ff04b14f0a data/create/loot_tables/blocks/cuckoo_clock.json 9083b026ee254645430434b67c2ba7a842f888bf data/create/loot_tables/blocks/cut_andesite.json +c1aa69f80ba11dd52fb3627fc32377599f5ff887 data/create/loot_tables/blocks/cut_andesite_bricks.json c74a4cac08ab1f66146466ff9fb40c8f210de63c data/create/loot_tables/blocks/cut_andesite_brick_slab.json df3f5dcbf676106800bc1113bb022658eb5e85d6 data/create/loot_tables/blocks/cut_andesite_brick_stairs.json 95c5a4a3327f522d986d7baaa747fce5ead8c032 data/create/loot_tables/blocks/cut_andesite_brick_wall.json -c1aa69f80ba11dd52fb3627fc32377599f5ff887 data/create/loot_tables/blocks/cut_andesite_bricks.json cb6cf8aefaac1e00596bd64a182a329dbba7e659 data/create/loot_tables/blocks/cut_andesite_slab.json 7106a637809dcbeb9d4a02a7ff9dc52f7fd9d7a2 data/create/loot_tables/blocks/cut_andesite_stairs.json e3cfa2ecb0b90ebe07cc98f8e47d22d2c0da67e5 data/create/loot_tables/blocks/cut_andesite_wall.json 75eacbc0656e7a83a20a054755ea7d7d78af983d data/create/loot_tables/blocks/cut_asurine.json +f780d37b956ed734cafcbe42b77f1a8ebfa33350 data/create/loot_tables/blocks/cut_asurine_bricks.json 43ad24bb9da878111f3606a17ef9b45bcc4964ae data/create/loot_tables/blocks/cut_asurine_brick_slab.json 8f4d0af32546b6cc77c68a08dc74494b8be1b7c3 data/create/loot_tables/blocks/cut_asurine_brick_stairs.json bb9ce58aa5b4e38c4d3b29aa8e0d905054023eae data/create/loot_tables/blocks/cut_asurine_brick_wall.json -f780d37b956ed734cafcbe42b77f1a8ebfa33350 data/create/loot_tables/blocks/cut_asurine_bricks.json 972ca04f91a1ce4d35995c14e1b17f773b15b61e data/create/loot_tables/blocks/cut_asurine_slab.json a55778dd8735286c3abc65046186b6b8dff0367e data/create/loot_tables/blocks/cut_asurine_stairs.json 70284c686f16d215ff1a8fb19bbe36fddbd31e18 data/create/loot_tables/blocks/cut_asurine_wall.json 0f450ecf60c5d201f332b2736c552d0b51b159b8 data/create/loot_tables/blocks/cut_calcite.json +aec526af372816f306826eefe4a6318db7964892 data/create/loot_tables/blocks/cut_calcite_bricks.json ec0d2854433ac4f58e53685c69dc19629fee16ca data/create/loot_tables/blocks/cut_calcite_brick_slab.json 584e39fa0b78ba8649f69b53f9f032dd1532d6ac data/create/loot_tables/blocks/cut_calcite_brick_stairs.json cc9cbdb7a50305e47181b2452bfce887f9879437 data/create/loot_tables/blocks/cut_calcite_brick_wall.json -aec526af372816f306826eefe4a6318db7964892 data/create/loot_tables/blocks/cut_calcite_bricks.json b4e5b6d5cb63b7b1a4fe639fd727a381bfd00588 data/create/loot_tables/blocks/cut_calcite_slab.json ca83b89401dba12341e6f26786103c10c90447ca data/create/loot_tables/blocks/cut_calcite_stairs.json 64df1c4a373c28bf9be3630935b01a43abd22e03 data/create/loot_tables/blocks/cut_calcite_wall.json 5df3a2229657d7b616790e922b1d1d558b4a5128 data/create/loot_tables/blocks/cut_crimsite.json +59cb609bc9671ac481832eeaf942533c6861fc0e data/create/loot_tables/blocks/cut_crimsite_bricks.json 6fee8d6425e1c832abed8fd9bccc8e6fae9441fc data/create/loot_tables/blocks/cut_crimsite_brick_slab.json 3123bc9e6123dfeda9bb3cece5c2220ac8485535 data/create/loot_tables/blocks/cut_crimsite_brick_stairs.json 56a8c7b1588f6fa9a1fb438e91b04673e02a0c86 data/create/loot_tables/blocks/cut_crimsite_brick_wall.json -59cb609bc9671ac481832eeaf942533c6861fc0e data/create/loot_tables/blocks/cut_crimsite_bricks.json 90ed82b09f2650ee913956d62803d15fc4c0bdbd data/create/loot_tables/blocks/cut_crimsite_slab.json 0e237e008523ed3e9934c598a708be533aaa0861 data/create/loot_tables/blocks/cut_crimsite_stairs.json 48e1edca75186f160a12fa26ac262c7f86d62c82 data/create/loot_tables/blocks/cut_crimsite_wall.json 7bfe4d183ed26de1d7b241c27880a70d28426502 data/create/loot_tables/blocks/cut_deepslate.json +6e375a42ddf38c99fee86531471573716e27fa44 data/create/loot_tables/blocks/cut_deepslate_bricks.json fa4b940ad8ee432ee0fabf496d2da3d5039c204a data/create/loot_tables/blocks/cut_deepslate_brick_slab.json 1063a94b3e90a52a7492d85b1c086514333f3421 data/create/loot_tables/blocks/cut_deepslate_brick_stairs.json 878d809a038c626e8054f9b71e27be08388d7615 data/create/loot_tables/blocks/cut_deepslate_brick_wall.json -6e375a42ddf38c99fee86531471573716e27fa44 data/create/loot_tables/blocks/cut_deepslate_bricks.json 7b5e46aaf34d71993f50b5b6fa1cd5d7ea64264c data/create/loot_tables/blocks/cut_deepslate_slab.json 7d45e8bb037a1e550132854200d57ce31e073993 data/create/loot_tables/blocks/cut_deepslate_stairs.json cd80fd4f573d59c22f0b9799f1ba7422215d4ff1 data/create/loot_tables/blocks/cut_deepslate_wall.json d79d52657307a30422d9ff2eb1caad78024c24f7 data/create/loot_tables/blocks/cut_diorite.json +9f627b6449ae27a1990b84a60349736129a11e39 data/create/loot_tables/blocks/cut_diorite_bricks.json 1809235166024fa74f65a96b622faa8eddf4ce14 data/create/loot_tables/blocks/cut_diorite_brick_slab.json a6bb9fb4eee3dab9a540b228801ce100c048c2a7 data/create/loot_tables/blocks/cut_diorite_brick_stairs.json 690a938a04543cb60f2952335be26b2df9c75715 data/create/loot_tables/blocks/cut_diorite_brick_wall.json -9f627b6449ae27a1990b84a60349736129a11e39 data/create/loot_tables/blocks/cut_diorite_bricks.json 208999222adb5b1cd4fa47b85000841dbae4ad21 data/create/loot_tables/blocks/cut_diorite_slab.json 12849a868e8dff48ebb688c84fc53d4cee2a4eaa data/create/loot_tables/blocks/cut_diorite_stairs.json 469fffcdd40aea22fedb81b7778cc3c61928f3fd data/create/loot_tables/blocks/cut_diorite_wall.json 302d0bb640f696109fe4edc0c1fa9db332231511 data/create/loot_tables/blocks/cut_dripstone.json +48707f37b94ff1a930ee45bb9e8b6b4b67226945 data/create/loot_tables/blocks/cut_dripstone_bricks.json eb31bc108180e2248d575d5d72325b5585254af0 data/create/loot_tables/blocks/cut_dripstone_brick_slab.json 9b624a456baf55960675d7857e159f69911a281a data/create/loot_tables/blocks/cut_dripstone_brick_stairs.json b4c754d4d5a6c28f537c2d73844e39059b2c1450 data/create/loot_tables/blocks/cut_dripstone_brick_wall.json -48707f37b94ff1a930ee45bb9e8b6b4b67226945 data/create/loot_tables/blocks/cut_dripstone_bricks.json eb9eca9a69f763cbe81dc79375ef76978594b51e data/create/loot_tables/blocks/cut_dripstone_slab.json 47fae3abc8bea3ee802d6759192e631f50329c5f data/create/loot_tables/blocks/cut_dripstone_stairs.json 70b71cc460cba2955694baf0550eadc2187e3a8a data/create/loot_tables/blocks/cut_dripstone_wall.json 26433a16a91414be15b20dc85b81b76d086be889 data/create/loot_tables/blocks/cut_granite.json +65c3936e78a90c53faa0b9f9b3034afc2728e7b9 data/create/loot_tables/blocks/cut_granite_bricks.json c6b8dfa87e9c33a0dd2b3398dcc524347e826d44 data/create/loot_tables/blocks/cut_granite_brick_slab.json 5e00417f06b4d357e7469f0efa6e319dfc587da3 data/create/loot_tables/blocks/cut_granite_brick_stairs.json 8d8779846af8121426f128cc7b5d501037bd1cd4 data/create/loot_tables/blocks/cut_granite_brick_wall.json -65c3936e78a90c53faa0b9f9b3034afc2728e7b9 data/create/loot_tables/blocks/cut_granite_bricks.json 6e7253b2801611b4698e786f495c2ade1088ee0b data/create/loot_tables/blocks/cut_granite_slab.json de8c10fb2c7409a3375f2db5cdce2027c3f419bd data/create/loot_tables/blocks/cut_granite_stairs.json cdf40bb46d9457a66129b300dc4d3f0160cc1de2 data/create/loot_tables/blocks/cut_granite_wall.json ac5f062c7fc270c63d67ccecf19499a9e91fa1c4 data/create/loot_tables/blocks/cut_limestone.json +b60fb652e1f83b1af12a15cb47450bd9a6087f6a data/create/loot_tables/blocks/cut_limestone_bricks.json 3b6d3a9b12cf1c2a20bf337cc0155bb66967f0ee data/create/loot_tables/blocks/cut_limestone_brick_slab.json 701249cc12b7aa6f5cc1691ac4dd17e665aa2180 data/create/loot_tables/blocks/cut_limestone_brick_stairs.json 3b8c5eef9b0e8c35e8573ce91f5fddbac7f76f24 data/create/loot_tables/blocks/cut_limestone_brick_wall.json -b60fb652e1f83b1af12a15cb47450bd9a6087f6a data/create/loot_tables/blocks/cut_limestone_bricks.json ba186786e8677f1c769e8f231fe872c48330e13a data/create/loot_tables/blocks/cut_limestone_slab.json d354966d57804afda39ff27336d8b0f38acf6ea3 data/create/loot_tables/blocks/cut_limestone_stairs.json 28b4eee2c6da259e50c58a51905fa2b79a9b89ef data/create/loot_tables/blocks/cut_limestone_wall.json b3d6d90dd0c3e9d4b47d1f87d5abc354dd8c1447 data/create/loot_tables/blocks/cut_ochrum.json +5856859aae0cc633cbd9d83ea7cf7910ce1a88de data/create/loot_tables/blocks/cut_ochrum_bricks.json 67cadc71d90fb2527b9b2b72a74463d71571e493 data/create/loot_tables/blocks/cut_ochrum_brick_slab.json 487b3e7dc1d9d07183b9b699e33f6371858435aa data/create/loot_tables/blocks/cut_ochrum_brick_stairs.json 289757860f07b63dcce531a74ce7e60b4669c51b data/create/loot_tables/blocks/cut_ochrum_brick_wall.json -5856859aae0cc633cbd9d83ea7cf7910ce1a88de data/create/loot_tables/blocks/cut_ochrum_bricks.json c9deec5e3c7343afa3d013704179e2147b2eb7ec data/create/loot_tables/blocks/cut_ochrum_slab.json e851d829db8ea4398bc1cbe6e743b4fba98d3413 data/create/loot_tables/blocks/cut_ochrum_stairs.json 5dce8524b70baeefaeba13422f5900b1a161a867 data/create/loot_tables/blocks/cut_ochrum_wall.json 293064edf2909db8c9edc26bedd1cc023c647664 data/create/loot_tables/blocks/cut_scorchia.json +767910313f0983ebfb49b80526747d762cbdf782 data/create/loot_tables/blocks/cut_scorchia_bricks.json 895c4b9cc71701a26ae0e765ee67f0c06cc70a9c data/create/loot_tables/blocks/cut_scorchia_brick_slab.json c53d72176cb5dd93977975dd84647391fa563e3a data/create/loot_tables/blocks/cut_scorchia_brick_stairs.json 460232ca38cba2f0adc5316d6db8db94db231953 data/create/loot_tables/blocks/cut_scorchia_brick_wall.json -767910313f0983ebfb49b80526747d762cbdf782 data/create/loot_tables/blocks/cut_scorchia_bricks.json c8201964d877a932fe9a9a2d0360004440f7c380 data/create/loot_tables/blocks/cut_scorchia_slab.json dfd09849dbf48a064269a5ea28d0422caa87e4d4 data/create/loot_tables/blocks/cut_scorchia_stairs.json bd5304e38bb92a445c159e9fe647b906e28b232e data/create/loot_tables/blocks/cut_scorchia_wall.json 6b87a22c39b545d5be92e476751b99ceb4bef740 data/create/loot_tables/blocks/cut_scoria.json +833252d2d63c7502f6f0d7981673a8081046c944 data/create/loot_tables/blocks/cut_scoria_bricks.json 659e86f89499539e435989c2eb29e88e9a0ff9f4 data/create/loot_tables/blocks/cut_scoria_brick_slab.json 8434d461090bc43328eec0b4249d27a9ba383707 data/create/loot_tables/blocks/cut_scoria_brick_stairs.json e3f853395b9b6fb7d5bb103c121a77e04526a9e8 data/create/loot_tables/blocks/cut_scoria_brick_wall.json -833252d2d63c7502f6f0d7981673a8081046c944 data/create/loot_tables/blocks/cut_scoria_bricks.json 8360d736887ae3dc22bcf522791ef981e380456c data/create/loot_tables/blocks/cut_scoria_slab.json c771f03308f45e1e87d92181f94cdfd4e61fa5d8 data/create/loot_tables/blocks/cut_scoria_stairs.json 6fecb7fa2774ea63ac0c66e9c3d0f41d6b8cdff7 data/create/loot_tables/blocks/cut_scoria_wall.json 396074ee7fd5a3ddbac9332c74b7bdc4164919e2 data/create/loot_tables/blocks/cut_tuff.json +81465ef7aa555d36adf249bbc9acfe80abbe308e data/create/loot_tables/blocks/cut_tuff_bricks.json 5148f230c773b83268d52650bdacc660025feb95 data/create/loot_tables/blocks/cut_tuff_brick_slab.json 19719a4a3f63d1ec46a9ca9736a825d2dcc880ff data/create/loot_tables/blocks/cut_tuff_brick_stairs.json e20991b67c07dca62c212b43da5b7e7e98146c0e data/create/loot_tables/blocks/cut_tuff_brick_wall.json -81465ef7aa555d36adf249bbc9acfe80abbe308e data/create/loot_tables/blocks/cut_tuff_bricks.json 6d16bd3860207ff6912afc2bf3f0454b572aabba data/create/loot_tables/blocks/cut_tuff_slab.json c14e52ac9901aa873c33d51988bd26465ce0e095 data/create/loot_tables/blocks/cut_tuff_stairs.json dd70800c79fa2ff56bd4ea032cf069bc27cc9076 data/create/loot_tables/blocks/cut_tuff_wall.json 1957b610d14460cc9ca797fe953bf9831509cdbf data/create/loot_tables/blocks/cut_veridium.json +673d1f0fefa7725ac5bfcabfcea577041adc4eeb data/create/loot_tables/blocks/cut_veridium_bricks.json c1515a908bde249c087be1e73aec37773bc3dc5c data/create/loot_tables/blocks/cut_veridium_brick_slab.json d9552e3e9f4de0e09df8ca9446066e94c6e2c681 data/create/loot_tables/blocks/cut_veridium_brick_stairs.json 584c4bd13d9870f9798155b47cc0d32e5751294d data/create/loot_tables/blocks/cut_veridium_brick_wall.json -673d1f0fefa7725ac5bfcabfcea577041adc4eeb data/create/loot_tables/blocks/cut_veridium_bricks.json 009186ed0efe29a229a28cfd913bc02ddad217d4 data/create/loot_tables/blocks/cut_veridium_slab.json 4845f7127921c7dd93a59118e63c37107d6c2061 data/create/loot_tables/blocks/cut_veridium_stairs.json b56caea031d637321eddfd5d122fc357d2c2e49c data/create/loot_tables/blocks/cut_veridium_wall.json @@ -3539,12 +3539,12 @@ dfe0af3ff61ed2b3082e49c745d8a3e0c5973f4b data/create/loot_tables/blocks/encased_ a2e9a8a10b7fc730c1d7c8db3b529e7a37b683f5 data/create/loot_tables/blocks/encased_fan.json 7ede9f64839f51e6a2eb05b08577d2873f281401 data/create/loot_tables/blocks/encased_fluid_pipe.json 4869211639326efaabd1aba1067bfbb3ab012884 data/create/loot_tables/blocks/experience_block.json +9fa4b0c8ee313b6c9a57d7d5b687cdd01c8259d3 data/create/loot_tables/blocks/exposed_copper_shingles.json 9dbd37ef5ff549f10475101205c1a9d4a44140bc data/create/loot_tables/blocks/exposed_copper_shingle_slab.json d2c9abd9260eb82ea1c2eeae5e2d6abd0b4d3ce8 data/create/loot_tables/blocks/exposed_copper_shingle_stairs.json -9fa4b0c8ee313b6c9a57d7d5b687cdd01c8259d3 data/create/loot_tables/blocks/exposed_copper_shingles.json +f0905ae4c9bdff8fe9e1ab4682a7b1efe2d27d9d data/create/loot_tables/blocks/exposed_copper_tiles.json 6841c02935838f00011d33fc392965326c4dbc5b data/create/loot_tables/blocks/exposed_copper_tile_slab.json 432a047156b93a09b7e027fc34f5680a8f68dc92 data/create/loot_tables/blocks/exposed_copper_tile_stairs.json -f0905ae4c9bdff8fe9e1ab4682a7b1efe2d27d9d data/create/loot_tables/blocks/exposed_copper_tiles.json 4dd285b35d9b94d48f7aa783e93bdd04d58c4a26 data/create/loot_tables/blocks/factory_gauge.json 3fae2a7a3f133a1d7c76ce91f6c48eab787d6ff6 data/create/loot_tables/blocks/fake_track.json 1d4734d6d9ba039c0dfa2271f08cdb55e35b721f data/create/loot_tables/blocks/fluid_pipe.json @@ -3620,6 +3620,8 @@ eb95d1e0abb93d5efecb0809e3901f37021c4dfc data/create/loot_tables/blocks/light_gr e61e9b3e116037c4ad44a7e222e5127e5767ddad data/create/loot_tables/blocks/light_gray_table_cloth.json e22dfadefcea50090efe87136a4b92e6ef20d379 data/create/loot_tables/blocks/light_gray_toolbox.json 3e586bc1281f15e25e75475dd726578ff032c6ae data/create/loot_tables/blocks/light_gray_valve_handle.json +c6bb0877c537dda15469934383dc45c608bfd1a4 data/create/loot_tables/blocks/limestone.json +49058a62e1abd34917f983b6bc13cc4353b613a2 data/create/loot_tables/blocks/limestone_pillar.json 582bb26f6df37d0c2dbe12983ad05fc74f5fb5c0 data/create/loot_tables/blocks/lime_nixie_tube.json ec9d973d218b26d51b82f265603feab31170c619 data/create/loot_tables/blocks/lime_postbox.json 623ac65211a9920325308b55285f78e3b7275751 data/create/loot_tables/blocks/lime_sail.json @@ -3627,8 +3629,6 @@ ec9d973d218b26d51b82f265603feab31170c619 data/create/loot_tables/blocks/lime_pos 10ecd65ecba6b66652dd04a385fc47a44c1f8110 data/create/loot_tables/blocks/lime_table_cloth.json 0f6a465501a445925e9aff7a4c84b3c8e2caa93e data/create/loot_tables/blocks/lime_toolbox.json 1a3ed7cd5660d7ea014956ea642e0b07d89bc297 data/create/loot_tables/blocks/lime_valve_handle.json -c6bb0877c537dda15469934383dc45c608bfd1a4 data/create/loot_tables/blocks/limestone.json -49058a62e1abd34917f983b6bc13cc4353b613a2 data/create/loot_tables/blocks/limestone_pillar.json baf70f9eb579f20b232a2af4e6b00a54f84844e6 data/create/loot_tables/blocks/linear_chassis.json e4c0f8ca822cf7555bd011825b430c3c735160d4 data/create/loot_tables/blocks/lit_blaze_burner.json 6bd8b044cc9c69a5268372e5436f556da2c1bf21 data/create/loot_tables/blocks/magenta_nixie_tube.json @@ -3674,14 +3674,14 @@ d6323d4b30faa87cd4b5b8b815cb16f78296f203 data/create/loot_tables/blocks/orange_s 30aef2df782b6b35cd16b4c205bb15de85bc0664 data/create/loot_tables/blocks/orange_valve_handle.json f4004c6d16754fc8867ed6618dace8e8f6dcc412 data/create/loot_tables/blocks/ornate_iron_window.json 6f14500e07c6d342804f9127e7b66047ffaeef1e data/create/loot_tables/blocks/ornate_iron_window_pane.json +3e54d3c4755a43d837a1d9b2005ea1dee4d02555 data/create/loot_tables/blocks/oxidized_copper_shingles.json 62c43a533e4ffeeec9f7657db5a796569087f806 data/create/loot_tables/blocks/oxidized_copper_shingle_slab.json f47a01824093455030fca66e7b8a39bcfc61d219 data/create/loot_tables/blocks/oxidized_copper_shingle_stairs.json -3e54d3c4755a43d837a1d9b2005ea1dee4d02555 data/create/loot_tables/blocks/oxidized_copper_shingles.json +4d2a2863697664b3b71f02aa703c3504cd5cc826 data/create/loot_tables/blocks/oxidized_copper_tiles.json 4d815b361af81bd0c0e14c853ca54ad3cde66a57 data/create/loot_tables/blocks/oxidized_copper_tile_slab.json d599ef03d1b69e4367ec0dea78f52c1964c99f9b data/create/loot_tables/blocks/oxidized_copper_tile_stairs.json -4d2a2863697664b3b71f02aa703c3504cd5cc826 data/create/loot_tables/blocks/oxidized_copper_tiles.json -54aa9700df601640b705d912abe773d5b6ee2b1f data/create/loot_tables/blocks/package_frogport.json ab8cee7abd7dd92428bf7d8f0f5edd35082401a4 data/create/loot_tables/blocks/packager.json +54aa9700df601640b705d912abe773d5b6ee2b1f data/create/loot_tables/blocks/package_frogport.json 58bd9fe9d6706998bfbda3b077cfd0a740972091 data/create/loot_tables/blocks/peculiar_bell.json 4d7724df6fefee4512c4f7886d0e103d1dc39510 data/create/loot_tables/blocks/pink_nixie_tube.json df7b12349c64d035eb563535b03cb70d780c5a71 data/create/loot_tables/blocks/pink_postbox.json @@ -3767,6 +3767,9 @@ b4746e296f4bf63778e40a751b4c7fa8be45d21d data/create/loot_tables/blocks/purple_t 9e5e841d9f9a00d560ed17a7e197dc56bae334b7 data/create/loot_tables/blocks/radial_chassis.json 73a03fa31e299cec2c8a3dc0f31a8aa354b49bcd data/create/loot_tables/blocks/railway_casing.json f76e5a157d2aeab5708f464b1f3c8e47b3855f18 data/create/loot_tables/blocks/raw_zinc_block.json +bbc2d61eeea335f8f011d799ef6a5484ca027640 data/create/loot_tables/blocks/redstone_contact.json +4fa70deeac7e56121e42fb602dfa27ee1727f749 data/create/loot_tables/blocks/redstone_link.json +efc3a5595e4daf67fa43f84c9869dfc76fd6fca4 data/create/loot_tables/blocks/redstone_requester.json a50e1c28af16e9f1b4f48aa974461167139768a7 data/create/loot_tables/blocks/red_nixie_tube.json f36f1e69e4fb8723238f81aadbac892f54b5ac62 data/create/loot_tables/blocks/red_postbox.json 977d724cddf8eba053a3310ad0d30af15199bbed data/create/loot_tables/blocks/red_sail.json @@ -3774,9 +3777,6 @@ f36f1e69e4fb8723238f81aadbac892f54b5ac62 data/create/loot_tables/blocks/red_post 09796bc3be977e17927d0a9e32bff2982618e844 data/create/loot_tables/blocks/red_table_cloth.json 9713071cab536e8c1550a6309dc4563fecc2c4e0 data/create/loot_tables/blocks/red_toolbox.json 17d75711f4ef5d76aa931175364642732fb0c60d data/create/loot_tables/blocks/red_valve_handle.json -bbc2d61eeea335f8f011d799ef6a5484ca027640 data/create/loot_tables/blocks/redstone_contact.json -4fa70deeac7e56121e42fb602dfa27ee1727f749 data/create/loot_tables/blocks/redstone_link.json -efc3a5595e4daf67fa43f84c9869dfc76fd6fca4 data/create/loot_tables/blocks/redstone_requester.json 632067fe6309e31e78637eb0272209b630750242 data/create/loot_tables/blocks/refined_radiance_casing.json ee2c4d66d1264ec613e9e84fcac814d2f5806258 data/create/loot_tables/blocks/repackager.json 354a3b6c73379b7100b0dd12b3f3b008830c4d2d data/create/loot_tables/blocks/rope.json @@ -3786,8 +3786,8 @@ f74fdd78961619d712891c36e0a0778c25e145dc data/create/loot_tables/blocks/rope_pul a0575567d5679f2c54e5a25c6ec12338f8cdc939 data/create/loot_tables/blocks/rose_quartz_tiles.json de74765a3bbffafb87d632857dfcfa83f863f814 data/create/loot_tables/blocks/rotation_speed_controller.json 2af8df3e36ace336c43d68f4e53564640a89845f data/create/loot_tables/blocks/sail_frame.json -5a54e930243919991d71a1c3296002ff86dd88e1 data/create/loot_tables/blocks/schematic_table.json d499fd59d30da8b907b0f3a0f428700f066eddff data/create/loot_tables/blocks/schematicannon.json +5a54e930243919991d71a1c3296002ff86dd88e1 data/create/loot_tables/blocks/schematic_table.json 1d9b0df1330f44681bbd56f8560a30ef9e2175ff data/create/loot_tables/blocks/scorchia.json e39f189bfaebd31aedceb11e25720f1e08eb238d data/create/loot_tables/blocks/scorchia_pillar.json 5e3a37dbb2fcc0d6be042bfd063fd8b1414d6169 data/create/loot_tables/blocks/scoria.json @@ -3796,64 +3796,64 @@ d39afcaedc84d582c0c1f21ec5945cd0a67d389d data/create/loot_tables/blocks/secondar e33a34b47e07cf3262c0dbdbc651b31b9492b18f data/create/loot_tables/blocks/sequenced_gearshift.json 7d61387106e5e7fcc4aa0b05b9560cd5f4ef7df8 data/create/loot_tables/blocks/shadow_steel_casing.json 7e67d04f861e0a680487e27f94022a7850652dfe data/create/loot_tables/blocks/shaft.json +e88ff4ab1341c2db8338de0708b0ca8f40f15a8b data/create/loot_tables/blocks/small_andesite_bricks.json 220febcbcc4a993d475b683ebef7468ebdb7bf26 data/create/loot_tables/blocks/small_andesite_brick_slab.json b4764c5bb538359bcc2a599ff3b7474ade2115ed data/create/loot_tables/blocks/small_andesite_brick_stairs.json a891496ffb91bef56c3b684cb55a57e27a72154a data/create/loot_tables/blocks/small_andesite_brick_wall.json -e88ff4ab1341c2db8338de0708b0ca8f40f15a8b data/create/loot_tables/blocks/small_andesite_bricks.json +576d8f6beca755a4082f1c8941e2590c1d18107b data/create/loot_tables/blocks/small_asurine_bricks.json 1a5d3543ebb7c0064ba8ff01160a22a0f5f29f36 data/create/loot_tables/blocks/small_asurine_brick_slab.json 64f4b44b786eda91d432f20c8b725b0415440b56 data/create/loot_tables/blocks/small_asurine_brick_stairs.json 60a1d505e955047cf933ae55efc2e7c10d0a5a79 data/create/loot_tables/blocks/small_asurine_brick_wall.json -576d8f6beca755a4082f1c8941e2590c1d18107b data/create/loot_tables/blocks/small_asurine_bricks.json 64bcfece2507b8510633ae20c00ab989232664ff data/create/loot_tables/blocks/small_bogey.json +c03bba06f66262c0ced5e85fa7dcbfbfc8c9db71 data/create/loot_tables/blocks/small_calcite_bricks.json b673542c79f4a82f2e80c0931354e994292811f6 data/create/loot_tables/blocks/small_calcite_brick_slab.json e10d286286bba8e172a56e0eeb9af18d06d1a76d data/create/loot_tables/blocks/small_calcite_brick_stairs.json d7214e942b203823fa2fece883e8406a7721369f data/create/loot_tables/blocks/small_calcite_brick_wall.json -c03bba06f66262c0ced5e85fa7dcbfbfc8c9db71 data/create/loot_tables/blocks/small_calcite_bricks.json +f49d32973b0be51229f4e3fdc13958c9852c5c8a data/create/loot_tables/blocks/small_crimsite_bricks.json ef8b0f604b627715542e8216ae5448e88995cc13 data/create/loot_tables/blocks/small_crimsite_brick_slab.json dbec9246ab957a3ed2dbd0707df12c1496258e05 data/create/loot_tables/blocks/small_crimsite_brick_stairs.json d4d5bd8b101655205c4f293f23e83f610e179e91 data/create/loot_tables/blocks/small_crimsite_brick_wall.json -f49d32973b0be51229f4e3fdc13958c9852c5c8a data/create/loot_tables/blocks/small_crimsite_bricks.json +8caba3e7001dd8df4d3e6365b97849570c74c840 data/create/loot_tables/blocks/small_deepslate_bricks.json 44567c10c28ddd221198824766d3fec289fb29d4 data/create/loot_tables/blocks/small_deepslate_brick_slab.json fc141f5cdb1001d344b5ef8fa3ad1fdfeb01d048 data/create/loot_tables/blocks/small_deepslate_brick_stairs.json 3cf68d27362e9bb5dc3255ccf810097fbee511ba data/create/loot_tables/blocks/small_deepslate_brick_wall.json -8caba3e7001dd8df4d3e6365b97849570c74c840 data/create/loot_tables/blocks/small_deepslate_bricks.json +4f22a84f105c2fabfd08ff0782ec30bbdc59f940 data/create/loot_tables/blocks/small_diorite_bricks.json f6565f4bd11b7e95008b0f8fc3f5f2c7af1b77f8 data/create/loot_tables/blocks/small_diorite_brick_slab.json e3cbe41b4b2c38d0d5e625e34b61fc79db16d3bd data/create/loot_tables/blocks/small_diorite_brick_stairs.json 787dfaa16dc30155c90cc360f6927fa067a30ed8 data/create/loot_tables/blocks/small_diorite_brick_wall.json -4f22a84f105c2fabfd08ff0782ec30bbdc59f940 data/create/loot_tables/blocks/small_diorite_bricks.json +d9cc7f58c791e040df4abfce225524e01eb01d49 data/create/loot_tables/blocks/small_dripstone_bricks.json f72338c9252528e41f60cb183cb4ee07cea47bf0 data/create/loot_tables/blocks/small_dripstone_brick_slab.json bedf0fba68e8a8ce4205a968429ebe9c3ddfb528 data/create/loot_tables/blocks/small_dripstone_brick_stairs.json c1168f58f342dfa332bfa7f53f5f03383c55ccf2 data/create/loot_tables/blocks/small_dripstone_brick_wall.json -d9cc7f58c791e040df4abfce225524e01eb01d49 data/create/loot_tables/blocks/small_dripstone_bricks.json +8437e7e28e45c10562d182c4c07189bcc108cabb data/create/loot_tables/blocks/small_granite_bricks.json 4d111f8580ac97cf1b49b667462f7141846f3d3a data/create/loot_tables/blocks/small_granite_brick_slab.json c16e015251126614960d3e6300cb04d3aeaf49b4 data/create/loot_tables/blocks/small_granite_brick_stairs.json e0ff780ddeb5d5c8d2b6cd7736ac05f4556de52c data/create/loot_tables/blocks/small_granite_brick_wall.json -8437e7e28e45c10562d182c4c07189bcc108cabb data/create/loot_tables/blocks/small_granite_bricks.json +c60def11fbac5010bf749960e084dd5cd0dc4b07 data/create/loot_tables/blocks/small_limestone_bricks.json 5222ac5255c9a9ada0ce1da0fd4f4acbeee8ddb7 data/create/loot_tables/blocks/small_limestone_brick_slab.json 97310b6b1cbea869ebaa52861542787c49cee017 data/create/loot_tables/blocks/small_limestone_brick_stairs.json 0855921034db43692baa9fd0bcb767154f96d591 data/create/loot_tables/blocks/small_limestone_brick_wall.json -c60def11fbac5010bf749960e084dd5cd0dc4b07 data/create/loot_tables/blocks/small_limestone_bricks.json +eb6b2171a6c99a3a28089752f26ddc6ac1f941d1 data/create/loot_tables/blocks/small_ochrum_bricks.json 8ced0c24db685dbf4382b7b71124005edde9e0b2 data/create/loot_tables/blocks/small_ochrum_brick_slab.json 090e7154fb2c3dfd20d37aa87f3df4572a27c615 data/create/loot_tables/blocks/small_ochrum_brick_stairs.json 60f2d9970ad8caf8ffe3aa8083dbba671b8d4b8b data/create/loot_tables/blocks/small_ochrum_brick_wall.json -eb6b2171a6c99a3a28089752f26ddc6ac1f941d1 data/create/loot_tables/blocks/small_ochrum_bricks.json a001d069c2b4d15c6dfd0312749765fc4e89571e data/create/loot_tables/blocks/small_rose_quartz_tiles.json +ce71e670948453691d4f09c8110b952afb41afa1 data/create/loot_tables/blocks/small_scorchia_bricks.json d521cf885c737da2e4717d43072840ffd3f4c5d9 data/create/loot_tables/blocks/small_scorchia_brick_slab.json de6b5d583e1adf4d49147e0719616dfd0165726d data/create/loot_tables/blocks/small_scorchia_brick_stairs.json 895603c6920338ffafd8d0d1310e47ac20bdbfda data/create/loot_tables/blocks/small_scorchia_brick_wall.json -ce71e670948453691d4f09c8110b952afb41afa1 data/create/loot_tables/blocks/small_scorchia_bricks.json +8b7e61477c4fdc834d669bda9197b585d60f26a2 data/create/loot_tables/blocks/small_scoria_bricks.json d1954c07a66f40123d8d78602795efad7c92070f data/create/loot_tables/blocks/small_scoria_brick_slab.json 291b5a560f09ed8f09ccc949a1a4da0006f139c7 data/create/loot_tables/blocks/small_scoria_brick_stairs.json ed572e947f78d637e6e1a4166c111121087c41c3 data/create/loot_tables/blocks/small_scoria_brick_wall.json -8b7e61477c4fdc834d669bda9197b585d60f26a2 data/create/loot_tables/blocks/small_scoria_bricks.json +2c7097ee677f42452212b5dce8959065d2bb0e15 data/create/loot_tables/blocks/small_tuff_bricks.json ad8a3571dc3ae0ee1ec7be7f35c9796e544f0682 data/create/loot_tables/blocks/small_tuff_brick_slab.json 17f4a98a81e5920b75c88133d15b63d431f3fb64 data/create/loot_tables/blocks/small_tuff_brick_stairs.json 7defad704f6278e329af634acfb9efd617b2003e data/create/loot_tables/blocks/small_tuff_brick_wall.json -2c7097ee677f42452212b5dce8959065d2bb0e15 data/create/loot_tables/blocks/small_tuff_bricks.json +e499c0a8a0f804003612f3a4c9286cb4b033fe4b data/create/loot_tables/blocks/small_veridium_bricks.json c7771827a715b9eaacd1a7b7e863e274b1dee11f data/create/loot_tables/blocks/small_veridium_brick_slab.json 818b65dd5d868527e7df7658a4f62a93f2795186 data/create/loot_tables/blocks/small_veridium_brick_stairs.json 7733e53a90f2ba9c17cdedaa8720e70df1a8d2de data/create/loot_tables/blocks/small_veridium_brick_wall.json -e499c0a8a0f804003612f3a4c9286cb4b033fe4b data/create/loot_tables/blocks/small_veridium_bricks.json a121d21b81e93c119b6ee32ca21d260d9c33cb2a data/create/loot_tables/blocks/smart_chute.json 4556eb2d607db3631d0a9524d22a50686ce4a5a8 data/create/loot_tables/blocks/smart_fluid_pipe.json 9601e8ba0eb098cc409557f17b01669d8b971461 data/create/loot_tables/blocks/speedometer.json @@ -3865,9 +3865,9 @@ bcd632c1180efbc990b077314cfce8514a25da7c data/create/loot_tables/blocks/spruce_w cae1bd9100b62841e260880faa80e2442f44a141 data/create/loot_tables/blocks/steam_whistle_extension.json 0bc3fdde351129e3a261a2420aff9d3f063c235e data/create/loot_tables/blocks/sticker.json 074f526902cb5fcff2129614428aba1ea05a6649 data/create/loot_tables/blocks/sticky_mechanical_piston.json +a7332324e63f7d28621ddfbd54eb3d091461d890 data/create/loot_tables/blocks/stockpile_switch.json af312881ec9bfb0902438f53c5cac020244bdba2 data/create/loot_tables/blocks/stock_link.json f4fa9bb255348dc79dcc0468b3beb9ad075eb036 data/create/loot_tables/blocks/stock_ticker.json -a7332324e63f7d28621ddfbd54eb3d091461d890 data/create/loot_tables/blocks/stockpile_switch.json b13496b1b4bc0be30605832e23894fb374dd796e data/create/loot_tables/blocks/stressometer.json 6a7df4d2730d57ae6e404b4bc8e01367e5ddbf07 data/create/loot_tables/blocks/tiled_glass.json 0ad584e41780dc0183af1fa1e49e126730dfdbab data/create/loot_tables/blocks/tiled_glass_pane.json @@ -3887,36 +3887,36 @@ cfc82d2aa8248caeaa17ff0a60db02607046550d data/create/loot_tables/blocks/warped_w 2eeddb89cfc597bc1ce0736b9f4a6f98e0dfa4d2 data/create/loot_tables/blocks/warped_window_pane.json ccab211722d7f06913a549851b0d6e8278edc845 data/create/loot_tables/blocks/water_wheel.json ea5dfcedc928e8dfa1c59cf3917d1577dff87494 data/create/loot_tables/blocks/water_wheel_structure.json +bbc6fc068adccea464909b87f1d1f426324d74cc data/create/loot_tables/blocks/waxed_copper_shingles.json cb31be1e75ca822454bd0a89954f74c4c8726b33 data/create/loot_tables/blocks/waxed_copper_shingle_slab.json c8e440e42141788d1988c57ab91cb1bfcd977407 data/create/loot_tables/blocks/waxed_copper_shingle_stairs.json -bbc6fc068adccea464909b87f1d1f426324d74cc data/create/loot_tables/blocks/waxed_copper_shingles.json +a3b8f12d983077477963fd3fc893c5acd36ad552 data/create/loot_tables/blocks/waxed_copper_tiles.json 807da1d66d6c7d07efc8973de43415fa4b5ddfdc data/create/loot_tables/blocks/waxed_copper_tile_slab.json 92759871a9c84815b98b6dcd22fcf0dd958bc8ab data/create/loot_tables/blocks/waxed_copper_tile_stairs.json -a3b8f12d983077477963fd3fc893c5acd36ad552 data/create/loot_tables/blocks/waxed_copper_tiles.json +eb9781d081d52c34c041004c774b52169b4a9ca0 data/create/loot_tables/blocks/waxed_exposed_copper_shingles.json be5aabc98f4d70028f2b49ae1eaf0bc68a693c53 data/create/loot_tables/blocks/waxed_exposed_copper_shingle_slab.json a99143d290addb98427be53d7fea1cbc702d630c data/create/loot_tables/blocks/waxed_exposed_copper_shingle_stairs.json -eb9781d081d52c34c041004c774b52169b4a9ca0 data/create/loot_tables/blocks/waxed_exposed_copper_shingles.json +e79c0636852b37a463dc122d66cdec27d3aa10c4 data/create/loot_tables/blocks/waxed_exposed_copper_tiles.json 234cbb59a0e00d82c5508c8e9a61e328c22c1c56 data/create/loot_tables/blocks/waxed_exposed_copper_tile_slab.json de628114eb25f393efc4c0934d79c5bdc4365f75 data/create/loot_tables/blocks/waxed_exposed_copper_tile_stairs.json -e79c0636852b37a463dc122d66cdec27d3aa10c4 data/create/loot_tables/blocks/waxed_exposed_copper_tiles.json +60fe0594baab9599956d990ba893f8915835db81 data/create/loot_tables/blocks/waxed_oxidized_copper_shingles.json c8935df7d4634dee2b01c8a0ac5de12397f4d9ed data/create/loot_tables/blocks/waxed_oxidized_copper_shingle_slab.json 2b9370b7fa362ea88f916dd53747da80e4ae3357 data/create/loot_tables/blocks/waxed_oxidized_copper_shingle_stairs.json -60fe0594baab9599956d990ba893f8915835db81 data/create/loot_tables/blocks/waxed_oxidized_copper_shingles.json +f0721c371b08214337f3f4fce3a3705840310bdb data/create/loot_tables/blocks/waxed_oxidized_copper_tiles.json de4d25cac546559173f740752625c82dfd6bae09 data/create/loot_tables/blocks/waxed_oxidized_copper_tile_slab.json 2ed72fc0ea28303f5c6d1039662f55c677cb7bcb data/create/loot_tables/blocks/waxed_oxidized_copper_tile_stairs.json -f0721c371b08214337f3f4fce3a3705840310bdb data/create/loot_tables/blocks/waxed_oxidized_copper_tiles.json +f309ffd94dfb3591efd2fab337a871a0ceff1084 data/create/loot_tables/blocks/waxed_weathered_copper_shingles.json 9a7b265a963e122d510de64012ed1d98ad9017f9 data/create/loot_tables/blocks/waxed_weathered_copper_shingle_slab.json 62f25a1bc013e9c3d487d9a53407e58d89907c5b data/create/loot_tables/blocks/waxed_weathered_copper_shingle_stairs.json -f309ffd94dfb3591efd2fab337a871a0ceff1084 data/create/loot_tables/blocks/waxed_weathered_copper_shingles.json +26e6a96f50e7f3384f896bf8a5c3d5ff2b422526 data/create/loot_tables/blocks/waxed_weathered_copper_tiles.json 3fa20e33ced4aee01775db57629b9580a6b8e200 data/create/loot_tables/blocks/waxed_weathered_copper_tile_slab.json 59b28bd57f461482a394dbce9ea10ee25fc7c294 data/create/loot_tables/blocks/waxed_weathered_copper_tile_stairs.json -26e6a96f50e7f3384f896bf8a5c3d5ff2b422526 data/create/loot_tables/blocks/waxed_weathered_copper_tiles.json +3cd15ae684bc0e4e41f02b3ee79eafdbf052620c data/create/loot_tables/blocks/weathered_copper_shingles.json 278a56aa433ba3647107b3bf0553da5a5f6d40dd data/create/loot_tables/blocks/weathered_copper_shingle_slab.json 198babfd55c3a30c6ac61e81d5e01b0cf8fca80a data/create/loot_tables/blocks/weathered_copper_shingle_stairs.json -3cd15ae684bc0e4e41f02b3ee79eafdbf052620c data/create/loot_tables/blocks/weathered_copper_shingles.json +771d98a6627d707228719e843bc80636b02dc985 data/create/loot_tables/blocks/weathered_copper_tiles.json d6862dc9f7d291df618fbce71eebf613711a5517 data/create/loot_tables/blocks/weathered_copper_tile_slab.json 57d5065d53016e4b1ef0fbad9b84605b1546bcc4 data/create/loot_tables/blocks/weathered_copper_tile_stairs.json -771d98a6627d707228719e843bc80636b02dc985 data/create/loot_tables/blocks/weathered_copper_tiles.json 013deea9b687ce96e5042de13ab0cba9dadce364 data/create/loot_tables/blocks/weathered_iron_block.json f0c51ad0a713aab00dff913361b8e5e8448b912a data/create/loot_tables/blocks/weathered_iron_window.json 1d3ea471ec3f2bbf10c7a11f040f8bbf0d1576a8 data/create/loot_tables/blocks/weathered_iron_window_pane.json @@ -3964,43 +3964,43 @@ da3692808565988e21ec5b1d5e976338ccc4a037 data/create/recipes/calcite_pillar_from 1157b2eab2ada187ea80feae298b77ed7ece4bfd data/create/recipes/copper_bars_from_ingots_copper_stonecutting.json b9d4f55128aa03ee6f6ab1831e709629a42c147e data/create/recipes/copper_ladder_from_ingots_copper_stonecutting.json 922c5ac48c8eb8b3a39f5626a381c2252fbac107 data/create/recipes/copper_scaffolding_from_ingots_copper_stonecutting.json +bab9fa969ba95850dc6e3bd0723387a61cbb05cd data/create/recipes/copper_shingles_from_ingots_copper_stonecutting.json bb083ae1d057dc0106946e4c68f9469b81724396 data/create/recipes/copper_shingle_slab.json 3689feaca2bd5355fa2d4226cd2cc519fa9b97c1 data/create/recipes/copper_shingle_slab_from_copper_shingles_stonecutting.json bd4cd7119f8371164b278afc679795a3c2a53406 data/create/recipes/copper_shingle_stairs.json 59f672e8e88d5f4655467e2696616b552debaf46 data/create/recipes/copper_shingle_stairs_from_copper_shingles_stonecutting.json -bab9fa969ba95850dc6e3bd0723387a61cbb05cd data/create/recipes/copper_shingles_from_ingots_copper_stonecutting.json 0225fc8d7b7a5027b8a61e6a043c3a8e505d876a data/create/recipes/copper_table_cloth_from_ingots_copper_stonecutting.json +d463aa891c7ae1b2eb1a758e4100c5a1c16cfffd data/create/recipes/copper_tiles_from_ingots_copper_stonecutting.json f64ba3f3c607b43ea77e5bccb7ec2048e5c6e424 data/create/recipes/copper_tile_slab.json 91b0390e0c772d43eb46b94a0113323f0f6a4387 data/create/recipes/copper_tile_slab_from_copper_tiles_stonecutting.json d31a41f6f7ef0bd20abab06cc31a9d2c56187117 data/create/recipes/copper_tile_stairs.json bf1b0a447169029161fb07feacd22d5aa806b2bf data/create/recipes/copper_tile_stairs_from_copper_tiles_stonecutting.json -d463aa891c7ae1b2eb1a758e4100c5a1c16cfffd data/create/recipes/copper_tiles_from_ingots_copper_stonecutting.json daa54c9ff3612521f06cc1979116beafcda852dd data/create/recipes/copycat_panel_from_ingots_zinc_stonecutting.json 745816d2c3fa29ede2510e39edc76f6fecee963f data/create/recipes/copycat_step_from_ingots_zinc_stonecutting.json +255c32272a704109fccdbb071d4dbf602cb8c1d8 data/create/recipes/crafting/copper/waxed_copper_shingles_from_honeycomb.json 57ae13042e0f96676fa322bf24db4976d75ca6bc data/create/recipes/crafting/copper/waxed_copper_shingle_slab_from_honeycomb.json 790565897535ea2e741d0a0ed7c0b561d594b69a data/create/recipes/crafting/copper/waxed_copper_shingle_stairs_from_honeycomb.json -255c32272a704109fccdbb071d4dbf602cb8c1d8 data/create/recipes/crafting/copper/waxed_copper_shingles_from_honeycomb.json +0c6e14c5884257850c7360cba66bc8cca91c84e7 data/create/recipes/crafting/copper/waxed_copper_tiles_from_honeycomb.json 4693ee65a4a5e1c93fc2acce7bfbc438e573ad9a data/create/recipes/crafting/copper/waxed_copper_tile_slab_from_honeycomb.json f8772b915663e3f70b3a2405a23c5ce87e8b8e49 data/create/recipes/crafting/copper/waxed_copper_tile_stairs_from_honeycomb.json -0c6e14c5884257850c7360cba66bc8cca91c84e7 data/create/recipes/crafting/copper/waxed_copper_tiles_from_honeycomb.json +6d0dacc4db8966d38156fe17645732084379a887 data/create/recipes/crafting/copper/waxed_exposed_copper_shingles_from_honeycomb.json 3bc0b81ea61229e24570e083caa4e5870d517e75 data/create/recipes/crafting/copper/waxed_exposed_copper_shingle_slab_from_honeycomb.json 191f34b27bc8966c2b6ba41403cc0933718748d3 data/create/recipes/crafting/copper/waxed_exposed_copper_shingle_stairs_from_honeycomb.json -6d0dacc4db8966d38156fe17645732084379a887 data/create/recipes/crafting/copper/waxed_exposed_copper_shingles_from_honeycomb.json +cdd66bdfddbcdfacb27c030872d10b6e7f1356fd data/create/recipes/crafting/copper/waxed_exposed_copper_tiles_from_honeycomb.json 2f6d2f8da4d4da2ed48e33d8f6e0b32d37a3ce6d data/create/recipes/crafting/copper/waxed_exposed_copper_tile_slab_from_honeycomb.json 4ed8482ed29fe7c3273db733fa141743c181d460 data/create/recipes/crafting/copper/waxed_exposed_copper_tile_stairs_from_honeycomb.json -cdd66bdfddbcdfacb27c030872d10b6e7f1356fd data/create/recipes/crafting/copper/waxed_exposed_copper_tiles_from_honeycomb.json +0ca4e58d715d5ed4b051a94f2dff42d4d413ef07 data/create/recipes/crafting/copper/waxed_oxidized_copper_shingles_from_honeycomb.json b421f16aea7c47fa8a62e69973f30e4e382f8a2c data/create/recipes/crafting/copper/waxed_oxidized_copper_shingle_slab_from_honeycomb.json 7ab7f673f57e219d3e486d0add1d7e2a8820cc6b data/create/recipes/crafting/copper/waxed_oxidized_copper_shingle_stairs_from_honeycomb.json -0ca4e58d715d5ed4b051a94f2dff42d4d413ef07 data/create/recipes/crafting/copper/waxed_oxidized_copper_shingles_from_honeycomb.json +b7edffb9b1a936fd34fe23defefc8cb9ea4f6977 data/create/recipes/crafting/copper/waxed_oxidized_copper_tiles_from_honeycomb.json 24582e83e8d36a6267df5c028addfb44c1a637e6 data/create/recipes/crafting/copper/waxed_oxidized_copper_tile_slab_from_honeycomb.json 9185ea241bcb5f2fe09d0d5c65832ef379e06c58 data/create/recipes/crafting/copper/waxed_oxidized_copper_tile_stairs_from_honeycomb.json -b7edffb9b1a936fd34fe23defefc8cb9ea4f6977 data/create/recipes/crafting/copper/waxed_oxidized_copper_tiles_from_honeycomb.json +90bce9f262b87fb821210aceb88d09d815d15e5a data/create/recipes/crafting/copper/waxed_weathered_copper_shingles_from_honeycomb.json a2cc99ad9b1234f5327971ee535af9bc25d0154c data/create/recipes/crafting/copper/waxed_weathered_copper_shingle_slab_from_honeycomb.json 0952753a079593d748b38ca84b666f2f886f5c1e data/create/recipes/crafting/copper/waxed_weathered_copper_shingle_stairs_from_honeycomb.json -90bce9f262b87fb821210aceb88d09d815d15e5a data/create/recipes/crafting/copper/waxed_weathered_copper_shingles_from_honeycomb.json +724802d206db185ebf20bafbcfc35fe0f982f58a data/create/recipes/crafting/copper/waxed_weathered_copper_tiles_from_honeycomb.json 98d0b72eb20e1d80cc590800ae2d642a47c3ae5f data/create/recipes/crafting/copper/waxed_weathered_copper_tile_slab_from_honeycomb.json 594b8fd5c30a84df97667b2c6dccc5dedd039d26 data/create/recipes/crafting/copper/waxed_weathered_copper_tile_stairs_from_honeycomb.json -724802d206db185ebf20bafbcfc35fe0f982f58a data/create/recipes/crafting/copper/waxed_weathered_copper_tiles_from_honeycomb.json 97c3e430ef2aecf61c457d0b8c4bbd23e1b01cc3 data/create/recipes/crafting/kinetics/black_seat.json 1129d02609125b48af2efa48f84dd3f90d51a341 data/create/recipes/crafting/kinetics/black_seat_from_other_seat.json 9e5a73e2343054d35e2fbfd20f0c49834d1a87a6 data/create/recipes/crafting/kinetics/black_valve_handle_from_other_valve_handle.json @@ -4136,6 +4136,7 @@ db333d47f9e1d6b02aa670ea0aa10dabbcb0e319 data/create/recipes/crafting/logistics/ c3f4fd2206f3885904913289761f2b8b758e4c95 data/create/recipes/crimsite_pillar_from_stone_types_crimsite_stonecutting.json e1815f97fbc2786d77f5378a2696e36050d8a1fd data/create/recipes/crimson_window.json 96009a12fe3f5ebf677ac069999e2ea2adbc9b7c data/create/recipes/crimson_window_pane.json +82cb9be82ce5109781169bdb47bbd49238b9824b data/create/recipes/cut_andesite_bricks_from_stone_types_andesite_stonecutting.json d6a41fc914a4a41478f115d9503658dba04a4d02 data/create/recipes/cut_andesite_brick_slab.json edf981198463ac58524606f86dc15d2265e8b993 data/create/recipes/cut_andesite_brick_slab_from_stone_types_andesite_stonecutting.json 72486864f3a0d31a92212552441eb659f2541b60 data/create/recipes/cut_andesite_brick_slab_recycling.json @@ -4143,7 +4144,6 @@ edf981198463ac58524606f86dc15d2265e8b993 data/create/recipes/cut_andesite_brick_ 22f463c679249738bf1a340a3b8ff14806303a70 data/create/recipes/cut_andesite_brick_stairs_from_stone_types_andesite_stonecutting.json 42b7105c1d776aed25c1c6bbd9254375079d7438 data/create/recipes/cut_andesite_brick_wall.json 7d25517650c9f66b65f0f8841cf9bcda7ea401ec data/create/recipes/cut_andesite_brick_wall_from_stone_types_andesite_stonecutting.json -82cb9be82ce5109781169bdb47bbd49238b9824b data/create/recipes/cut_andesite_bricks_from_stone_types_andesite_stonecutting.json c3ab483224c3adbd467a4ec0b26a1f6a53fe81c4 data/create/recipes/cut_andesite_from_stone_types_andesite_stonecutting.json 9f316131bb538da9f6b1bde9eaaa0a5bd5972a66 data/create/recipes/cut_andesite_slab.json 50dcff201da369bdc591fdc320aae3547f114284 data/create/recipes/cut_andesite_slab_from_stone_types_andesite_stonecutting.json @@ -4152,6 +4152,7 @@ c3ab483224c3adbd467a4ec0b26a1f6a53fe81c4 data/create/recipes/cut_andesite_from_s c284fc46aabae9c5ab79071eb63ec9b07a9d1002 data/create/recipes/cut_andesite_stairs_from_stone_types_andesite_stonecutting.json 3b6e66e92656ab5b0d1e15444db62ccb1cc01866 data/create/recipes/cut_andesite_wall.json 5df6e8d558f656533aff514aee8cdec7cf8d6fdf data/create/recipes/cut_andesite_wall_from_stone_types_andesite_stonecutting.json +e335b15907be053ab0f2649338b12a86371b78f7 data/create/recipes/cut_asurine_bricks_from_stone_types_asurine_stonecutting.json 41d085d3b8fce5b12d601d86fd0e88df9b482aec data/create/recipes/cut_asurine_brick_slab.json cf61e0806a3988a771675a261a540cbb62352d80 data/create/recipes/cut_asurine_brick_slab_from_stone_types_asurine_stonecutting.json 86606a0717bba33f457707d96461fec6a22d23de data/create/recipes/cut_asurine_brick_slab_recycling.json @@ -4159,7 +4160,6 @@ cf61e0806a3988a771675a261a540cbb62352d80 data/create/recipes/cut_asurine_brick_s 382a7faa460ac286631fe063280541f2f499d895 data/create/recipes/cut_asurine_brick_stairs_from_stone_types_asurine_stonecutting.json 09699c116bb201e742fef1fd3c987e9de4606e6a data/create/recipes/cut_asurine_brick_wall.json 8bb8a9f8e8dd0d6585311c326dcf3f40227149a9 data/create/recipes/cut_asurine_brick_wall_from_stone_types_asurine_stonecutting.json -e335b15907be053ab0f2649338b12a86371b78f7 data/create/recipes/cut_asurine_bricks_from_stone_types_asurine_stonecutting.json 0188d62fbeede94f8596dd5cc73d361a160e8c95 data/create/recipes/cut_asurine_from_stone_types_asurine_stonecutting.json 118e87a2a344238009b1bbbe70e6f314e27842d9 data/create/recipes/cut_asurine_slab.json 37c502094ee96da9e4983142dae5e023c6bcfe14 data/create/recipes/cut_asurine_slab_from_stone_types_asurine_stonecutting.json @@ -4168,6 +4168,7 @@ fe3dd5c7d5bdea71a75003cf3d50439d9d21458d data/create/recipes/cut_asurine_slab_re cade93c9328afcacf4507aa7699c4b09fb4592d4 data/create/recipes/cut_asurine_stairs_from_stone_types_asurine_stonecutting.json 80bec79b5daea4b2b72c0f5e9f189c1044583465 data/create/recipes/cut_asurine_wall.json 45a712e41a74982cfb94a39da199ec6c95eef798 data/create/recipes/cut_asurine_wall_from_stone_types_asurine_stonecutting.json +da11f21280ba1ed06ffe8afe77db3e9e1bbcb1a3 data/create/recipes/cut_calcite_bricks_from_stone_types_calcite_stonecutting.json 98e849c743ed1e4397bf6168215dfa7006a804c4 data/create/recipes/cut_calcite_brick_slab.json 1c21eb6c785729a8ea274513e1313aed952e105e data/create/recipes/cut_calcite_brick_slab_from_stone_types_calcite_stonecutting.json 2a3f078f7f40ba3bc5c17a037db1f8ee415e4e3f data/create/recipes/cut_calcite_brick_slab_recycling.json @@ -4175,7 +4176,6 @@ e4267c62bc6cfc8373df29ee2685f1e1b286b638 data/create/recipes/cut_calcite_brick_s 10fe509e01e3ed1b04bd2f384c0aa3db96b117f1 data/create/recipes/cut_calcite_brick_stairs_from_stone_types_calcite_stonecutting.json 9b55a6c9cf0ce697a242684953daf9aa94d024dc data/create/recipes/cut_calcite_brick_wall.json 1e67376e484923b84bd64b0b22b4e55b581ac419 data/create/recipes/cut_calcite_brick_wall_from_stone_types_calcite_stonecutting.json -da11f21280ba1ed06ffe8afe77db3e9e1bbcb1a3 data/create/recipes/cut_calcite_bricks_from_stone_types_calcite_stonecutting.json 98b014b64c97371f04aaacbdd23e13e274e36e3b data/create/recipes/cut_calcite_from_stone_types_calcite_stonecutting.json fcab91f11fe97a194b2c1b16115206166d3cd634 data/create/recipes/cut_calcite_slab.json 8426a494b776148056cb4525e62744d0be8b28cd data/create/recipes/cut_calcite_slab_from_stone_types_calcite_stonecutting.json @@ -4184,6 +4184,7 @@ fcab91f11fe97a194b2c1b16115206166d3cd634 data/create/recipes/cut_calcite_slab.js a7e7fb425d3c1f21f5ed53da79957363fed824df data/create/recipes/cut_calcite_stairs_from_stone_types_calcite_stonecutting.json 73eaf7bffa38bc874974871f3002cd3ee7f0c36e data/create/recipes/cut_calcite_wall.json 01b4c23362f15ee0e5c207c46383f96032c89d98 data/create/recipes/cut_calcite_wall_from_stone_types_calcite_stonecutting.json +07aff2bb6424de46463b2c965418ed52efd0a790 data/create/recipes/cut_crimsite_bricks_from_stone_types_crimsite_stonecutting.json 8ffb2c1c747f19ea37c0da3fe248b6c58981c9f6 data/create/recipes/cut_crimsite_brick_slab.json 86c3a5c64561052489b3ceb9e08be5a8729198a9 data/create/recipes/cut_crimsite_brick_slab_from_stone_types_crimsite_stonecutting.json e3215d4e651e70402b896ba50975cb2f23d16278 data/create/recipes/cut_crimsite_brick_slab_recycling.json @@ -4191,7 +4192,6 @@ e49f6e319fae9058cbece0e332a11e108234e608 data/create/recipes/cut_crimsite_brick_ c7186fb1a75f59aff929e843f50a162a090b7bb3 data/create/recipes/cut_crimsite_brick_stairs_from_stone_types_crimsite_stonecutting.json 272d8d01730a88eff4fc6923e93962650b992c46 data/create/recipes/cut_crimsite_brick_wall.json 13ac9464098e8c67e820dc898c025ab0382d852a data/create/recipes/cut_crimsite_brick_wall_from_stone_types_crimsite_stonecutting.json -07aff2bb6424de46463b2c965418ed52efd0a790 data/create/recipes/cut_crimsite_bricks_from_stone_types_crimsite_stonecutting.json 18ce9ff32eda2d869bd11f398a86e78b71f6d0fe data/create/recipes/cut_crimsite_from_stone_types_crimsite_stonecutting.json c39166aa6267ec5bc71893d5756955abfb644217 data/create/recipes/cut_crimsite_slab.json 6271d5bc0377814ba06061bfffcb812ca2ef8f03 data/create/recipes/cut_crimsite_slab_from_stone_types_crimsite_stonecutting.json @@ -4200,6 +4200,7 @@ acfe33dbb889c820c213bcbc8593766703bf3a25 data/create/recipes/cut_crimsite_slab_r 90b03cf1e72d3b803e33755832e0722ff264681b data/create/recipes/cut_crimsite_stairs_from_stone_types_crimsite_stonecutting.json 8dfe19522878af232deaa1fc13d83cf785684cba data/create/recipes/cut_crimsite_wall.json 18f9548175baab0173785d7ef308096067712dd2 data/create/recipes/cut_crimsite_wall_from_stone_types_crimsite_stonecutting.json +de1a11b7ed71f1f7aeea2791fe922feef689fd35 data/create/recipes/cut_deepslate_bricks_from_stone_types_deepslate_stonecutting.json 5e5c0e6b1b3e204de3c48fb6a4cd473a150979c2 data/create/recipes/cut_deepslate_brick_slab.json 2c0795b92759dab751f86f50aa80440df2245526 data/create/recipes/cut_deepslate_brick_slab_from_stone_types_deepslate_stonecutting.json dbcc41c48cf28b71dcd9f3b6ecae43c8de681532 data/create/recipes/cut_deepslate_brick_slab_recycling.json @@ -4207,7 +4208,6 @@ e21f8dc33e70ebd43ea79a4afaf3b4e8a449f4bd data/create/recipes/cut_deepslate_brick 7b3489e5b629a995691be117c5a378769c743449 data/create/recipes/cut_deepslate_brick_stairs_from_stone_types_deepslate_stonecutting.json 158bb41bffebb2543e4aa2d5f14cc8af1cdd8671 data/create/recipes/cut_deepslate_brick_wall.json 73a07a5fa665bb20d131f0a0e40806116316928a data/create/recipes/cut_deepslate_brick_wall_from_stone_types_deepslate_stonecutting.json -de1a11b7ed71f1f7aeea2791fe922feef689fd35 data/create/recipes/cut_deepslate_bricks_from_stone_types_deepslate_stonecutting.json 992fdc2eba2afe3ff8aad0ceee5424ecd3f3026d data/create/recipes/cut_deepslate_from_stone_types_deepslate_stonecutting.json 064e2f5edd9209af7742b0f0eb45204453bed46f data/create/recipes/cut_deepslate_slab.json f341d30b7fd427dea09a51d67e1e9532e5184be8 data/create/recipes/cut_deepslate_slab_from_stone_types_deepslate_stonecutting.json @@ -4216,6 +4216,7 @@ c08e12e44344efca550efa8ba14d0cb2f9f6c2c6 data/create/recipes/cut_deepslate_stair e6deec1352fb5c74c470dc488b71e5f8f55bdfbf data/create/recipes/cut_deepslate_stairs_from_stone_types_deepslate_stonecutting.json 2ad7fb3f3a143e58bea8eefe4cd9db3d1c37a3e6 data/create/recipes/cut_deepslate_wall.json e752527479f71f96bb34878008bf8cfb23fd3045 data/create/recipes/cut_deepslate_wall_from_stone_types_deepslate_stonecutting.json +2c23d13f48f3685bda6c564e080053fbfa71ab99 data/create/recipes/cut_diorite_bricks_from_stone_types_diorite_stonecutting.json 90b83c2a2026d70f49c91813305fdee721926db9 data/create/recipes/cut_diorite_brick_slab.json 9d51c690c77321437561a006dc2f9bba975875e6 data/create/recipes/cut_diorite_brick_slab_from_stone_types_diorite_stonecutting.json fa76e64ac9b569f5d5f2f1ecc54e51f9be15aacf data/create/recipes/cut_diorite_brick_slab_recycling.json @@ -4223,7 +4224,6 @@ aa6aea99e9ce2d5dc3d6555ab3d17928bca6195e data/create/recipes/cut_diorite_brick_s 9a26c4097519a9300e591b6578bbaf6c11f909e1 data/create/recipes/cut_diorite_brick_stairs_from_stone_types_diorite_stonecutting.json 78d37df17c7e2be73ce1d226ee552ff3f49b9e4f data/create/recipes/cut_diorite_brick_wall.json f668f2c78a779bc3d0546a82dea02b9f4688e05c data/create/recipes/cut_diorite_brick_wall_from_stone_types_diorite_stonecutting.json -2c23d13f48f3685bda6c564e080053fbfa71ab99 data/create/recipes/cut_diorite_bricks_from_stone_types_diorite_stonecutting.json 1918ecb2ab16ca7dbb30eee4852b67dd963d872e data/create/recipes/cut_diorite_from_stone_types_diorite_stonecutting.json 07fda5c89128648856f948a03ac56a2a2693cf1b data/create/recipes/cut_diorite_slab.json 28765ac7f8b62373b32f014d1dd7f4afb50e1906 data/create/recipes/cut_diorite_slab_from_stone_types_diorite_stonecutting.json @@ -4232,6 +4232,7 @@ dd5f3c59a5d292f7b5c046be35da7f67e8383aa1 data/create/recipes/cut_diorite_slab_re be2c6c01630b90895e7215edce3d02352793dbc4 data/create/recipes/cut_diorite_stairs_from_stone_types_diorite_stonecutting.json 8984b7b7dbc7e65ee04886516501a13278e889e9 data/create/recipes/cut_diorite_wall.json 8ff5d1ecff2202595f7cba5bd65c466c53ac2cc5 data/create/recipes/cut_diorite_wall_from_stone_types_diorite_stonecutting.json +10550b023989113c26d430136daf1dc49f10ce63 data/create/recipes/cut_dripstone_bricks_from_stone_types_dripstone_stonecutting.json 95717a80bb8ae296c2f77478a8f42b88cea88996 data/create/recipes/cut_dripstone_brick_slab.json f04bf1189b53e24974779d9e959e8973d9677162 data/create/recipes/cut_dripstone_brick_slab_from_stone_types_dripstone_stonecutting.json 332534fc2909ca83f5f7f4ab3adf92680bb17f79 data/create/recipes/cut_dripstone_brick_slab_recycling.json @@ -4239,7 +4240,6 @@ f04bf1189b53e24974779d9e959e8973d9677162 data/create/recipes/cut_dripstone_brick 17bf8160eaf16655d454ddfe22b82c9a86462146 data/create/recipes/cut_dripstone_brick_stairs_from_stone_types_dripstone_stonecutting.json 7d638d156326a2e542ed94837273d9cca5cf4fce data/create/recipes/cut_dripstone_brick_wall.json 154931db54115cf4a64147cdd6d1eb7efff48737 data/create/recipes/cut_dripstone_brick_wall_from_stone_types_dripstone_stonecutting.json -10550b023989113c26d430136daf1dc49f10ce63 data/create/recipes/cut_dripstone_bricks_from_stone_types_dripstone_stonecutting.json 7147f9199f174c9864109fe5723528921aaa0c46 data/create/recipes/cut_dripstone_from_stone_types_dripstone_stonecutting.json f2800b467eac75d0099f2f07e09b47115df4e09f data/create/recipes/cut_dripstone_slab.json a4f62a1a30592f82789988f93d8ae35d176eca59 data/create/recipes/cut_dripstone_slab_from_stone_types_dripstone_stonecutting.json @@ -4248,6 +4248,7 @@ a4f62a1a30592f82789988f93d8ae35d176eca59 data/create/recipes/cut_dripstone_slab_ f2df5efedb6fb25ecb877b888007990082d9aca4 data/create/recipes/cut_dripstone_stairs_from_stone_types_dripstone_stonecutting.json a177092d0270f9e07a4f9bef4d0c8fb2ed91d3bc data/create/recipes/cut_dripstone_wall.json a3731ef689d3ac790bc3e3fd507f1134c99a751a data/create/recipes/cut_dripstone_wall_from_stone_types_dripstone_stonecutting.json +9c4c64666b18d3adb11cd3d56667fabf6e88dfe2 data/create/recipes/cut_granite_bricks_from_stone_types_granite_stonecutting.json aa454bebffd7e77cfa5c1bd711bfbac27e3c5a14 data/create/recipes/cut_granite_brick_slab.json d073b9b0b8ca2fbdc5e1ed16f6f195a5f3af4588 data/create/recipes/cut_granite_brick_slab_from_stone_types_granite_stonecutting.json 1dfd539c17a3342a0cd194ce1465a808aacbeda3 data/create/recipes/cut_granite_brick_slab_recycling.json @@ -4255,7 +4256,6 @@ e069aa5c316feb2823ef98e8e6c89bb1bed23d2e data/create/recipes/cut_granite_brick_s f38fc7014aa83d4914d50d87ee3f8f762c078a78 data/create/recipes/cut_granite_brick_stairs_from_stone_types_granite_stonecutting.json 0fd9c3a778c7bdcd7aa06f892a9c260ad664d367 data/create/recipes/cut_granite_brick_wall.json b81db94b6228f512049324dd1436880f1e86e444 data/create/recipes/cut_granite_brick_wall_from_stone_types_granite_stonecutting.json -9c4c64666b18d3adb11cd3d56667fabf6e88dfe2 data/create/recipes/cut_granite_bricks_from_stone_types_granite_stonecutting.json 01970a95f17648a7ef1fb0337ee2e82eb2279e9e data/create/recipes/cut_granite_from_stone_types_granite_stonecutting.json 8fc1c51591e590c8718be0500a4dbcc2b47830ce data/create/recipes/cut_granite_slab.json d239323b7a3b65b2fd7005350a90d578671c2b81 data/create/recipes/cut_granite_slab_from_stone_types_granite_stonecutting.json @@ -4264,6 +4264,7 @@ d239323b7a3b65b2fd7005350a90d578671c2b81 data/create/recipes/cut_granite_slab_fr 3d85d483073d37fea7d9a95831b3b856c0725b98 data/create/recipes/cut_granite_stairs_from_stone_types_granite_stonecutting.json 3d4130fe5fe6e963fd5e10534e729e0448b9f05f data/create/recipes/cut_granite_wall.json d43a876bf89bf3536c80fd5e3ef0ee36c147cd06 data/create/recipes/cut_granite_wall_from_stone_types_granite_stonecutting.json +7cdd3cf302cfe4ef21c0a89dadef4f781e307bb0 data/create/recipes/cut_limestone_bricks_from_stone_types_limestone_stonecutting.json 0e3285206947bcfdf9606d3f8e61ea7d2899f7d2 data/create/recipes/cut_limestone_brick_slab.json c3d3ff37e29c435b2a13d30bd4ded0f6ca9fbfbc data/create/recipes/cut_limestone_brick_slab_from_stone_types_limestone_stonecutting.json 459babb2bd01e9e1ece4c8cd2865690997f01c66 data/create/recipes/cut_limestone_brick_slab_recycling.json @@ -4271,7 +4272,6 @@ d4f8dc640becf1c35416016500424ecd68d7ecee data/create/recipes/cut_limestone_brick 570983b2b27862dabe9f3d1bcd76d2909b8bdb3c data/create/recipes/cut_limestone_brick_stairs_from_stone_types_limestone_stonecutting.json aad4342a726fd65ca2b4c52a4e8857190e50b5be data/create/recipes/cut_limestone_brick_wall.json 5ac226aff9d854efc47ed71241e6c098b170b9b0 data/create/recipes/cut_limestone_brick_wall_from_stone_types_limestone_stonecutting.json -7cdd3cf302cfe4ef21c0a89dadef4f781e307bb0 data/create/recipes/cut_limestone_bricks_from_stone_types_limestone_stonecutting.json 329950373aaaf8e70c54cf5e2467c7a84f372078 data/create/recipes/cut_limestone_from_stone_types_limestone_stonecutting.json cbacfd31703ac908d28e42968bb571dccfa20612 data/create/recipes/cut_limestone_slab.json 628a0a64c2dcd63f17a3ec9ce55ac643b194eacc data/create/recipes/cut_limestone_slab_from_stone_types_limestone_stonecutting.json @@ -4280,6 +4280,7 @@ cbacfd31703ac908d28e42968bb571dccfa20612 data/create/recipes/cut_limestone_slab. ba301da212ee14ff42c38487d0906a2da203e3c3 data/create/recipes/cut_limestone_stairs_from_stone_types_limestone_stonecutting.json d2aac4ac16f9c842af1efd3896dd3250f6d8424e data/create/recipes/cut_limestone_wall.json b14e6972f8586e569a7ab4ecf6ed5d6db1a2bded data/create/recipes/cut_limestone_wall_from_stone_types_limestone_stonecutting.json +a1a2b95283d88e1d990e00da9a095fe928b2aa2f data/create/recipes/cut_ochrum_bricks_from_stone_types_ochrum_stonecutting.json d5a4fa7787d2e56e0b5c8d533567543b93cf694b data/create/recipes/cut_ochrum_brick_slab.json 58514a5f216706e9bb62b27ad03701fe02bac013 data/create/recipes/cut_ochrum_brick_slab_from_stone_types_ochrum_stonecutting.json 6cc3167ebf075d7b302a359d1afdddf5753d0e26 data/create/recipes/cut_ochrum_brick_slab_recycling.json @@ -4287,7 +4288,6 @@ d5a4fa7787d2e56e0b5c8d533567543b93cf694b data/create/recipes/cut_ochrum_brick_sl ec6339d6658b0d32e46c8a4a4e06d94a388a6332 data/create/recipes/cut_ochrum_brick_stairs_from_stone_types_ochrum_stonecutting.json c4139ae7a9742f7111d308fe66bf1d627533550b data/create/recipes/cut_ochrum_brick_wall.json 1b8a4c81680df542a5e6b9e665c96649cf3eb7fa data/create/recipes/cut_ochrum_brick_wall_from_stone_types_ochrum_stonecutting.json -a1a2b95283d88e1d990e00da9a095fe928b2aa2f data/create/recipes/cut_ochrum_bricks_from_stone_types_ochrum_stonecutting.json 2b967f3424196b5da9b396ea58fb969d406af789 data/create/recipes/cut_ochrum_from_stone_types_ochrum_stonecutting.json 5baa701f3cbe8d69e2e6a5554622dd78ef3ac451 data/create/recipes/cut_ochrum_slab.json 9a26cba276cf135a10c71d31f5b960b2ee6ac444 data/create/recipes/cut_ochrum_slab_from_stone_types_ochrum_stonecutting.json @@ -4296,6 +4296,7 @@ a1a2b95283d88e1d990e00da9a095fe928b2aa2f data/create/recipes/cut_ochrum_bricks_f 75a232ccede0ffa7feb3e69da17c6a514a908907 data/create/recipes/cut_ochrum_stairs_from_stone_types_ochrum_stonecutting.json d9c05b7e4ce4ee86d0f6a9e1ee6c1b585ffee58b data/create/recipes/cut_ochrum_wall.json ee0dff8e1317aeffd061688879b97e81a00b7adb data/create/recipes/cut_ochrum_wall_from_stone_types_ochrum_stonecutting.json +087eefb8ffd61fd88f1db6ca25f9ac31e93f2fdf data/create/recipes/cut_scorchia_bricks_from_stone_types_scorchia_stonecutting.json 72ac9293e5791df07914e2d3ed00e5ff59d64b08 data/create/recipes/cut_scorchia_brick_slab.json 2f38c410d5eb93bdb8c8be0f68ac89726e3c765c data/create/recipes/cut_scorchia_brick_slab_from_stone_types_scorchia_stonecutting.json e296e6af6865bf6e4618dab8a96bb88f6999a9a5 data/create/recipes/cut_scorchia_brick_slab_recycling.json @@ -4303,7 +4304,6 @@ bd5984a6b96443319b7fad32db771d8ded0b0591 data/create/recipes/cut_scorchia_brick_ bd5c803c855222a29998dd784e6d12a18dd612d9 data/create/recipes/cut_scorchia_brick_stairs_from_stone_types_scorchia_stonecutting.json adfe0b08b5b72e579d47f36a4f835045e433e7f7 data/create/recipes/cut_scorchia_brick_wall.json 37fc5ae45d0260de9a5c45b0a1b208e4d146a562 data/create/recipes/cut_scorchia_brick_wall_from_stone_types_scorchia_stonecutting.json -087eefb8ffd61fd88f1db6ca25f9ac31e93f2fdf data/create/recipes/cut_scorchia_bricks_from_stone_types_scorchia_stonecutting.json f6dfd648418f24da093b80978c2f6e070f33ff6d data/create/recipes/cut_scorchia_from_stone_types_scorchia_stonecutting.json 7df99605c0c8761aeb9301d5391e1f16d41f89b3 data/create/recipes/cut_scorchia_slab.json fbd9a92d3c3d9e823cac51347320219f1734ec04 data/create/recipes/cut_scorchia_slab_from_stone_types_scorchia_stonecutting.json @@ -4312,6 +4312,7 @@ ad54182c3142ac9d9dd9bb4c5acc18f82e3fc5e5 data/create/recipes/cut_scorchia_stairs 1ddfefce136201ae78dbc53ba472080332fd6366 data/create/recipes/cut_scorchia_stairs_from_stone_types_scorchia_stonecutting.json 0a011b7cee33200fec5546168734c330952124da data/create/recipes/cut_scorchia_wall.json c594d886a303ad6e24d1283004442835ee861fbc data/create/recipes/cut_scorchia_wall_from_stone_types_scorchia_stonecutting.json +8650c0db70a3521b50404252106e0185b4f25a45 data/create/recipes/cut_scoria_bricks_from_stone_types_scoria_stonecutting.json 8baf09b5ff2004d71091b6f95307aa179a21f4df data/create/recipes/cut_scoria_brick_slab.json e7080ca9b6a507bec4a4a3dd52a28c1c33975628 data/create/recipes/cut_scoria_brick_slab_from_stone_types_scoria_stonecutting.json f5b56f6eb9c1ac0f8168b2b0f0b0ab00655ebfdb data/create/recipes/cut_scoria_brick_slab_recycling.json @@ -4319,7 +4320,6 @@ f5b56f6eb9c1ac0f8168b2b0f0b0ab00655ebfdb data/create/recipes/cut_scoria_brick_sl 3fd560355163f0afafefe886e75fd8b2c3cf2b6f data/create/recipes/cut_scoria_brick_stairs_from_stone_types_scoria_stonecutting.json ed803a4cdcf1dd01af03fff52e783f3539f78546 data/create/recipes/cut_scoria_brick_wall.json 553642a4e0dc5f934da8127a427ccdf53d3f51f9 data/create/recipes/cut_scoria_brick_wall_from_stone_types_scoria_stonecutting.json -8650c0db70a3521b50404252106e0185b4f25a45 data/create/recipes/cut_scoria_bricks_from_stone_types_scoria_stonecutting.json 5702063be3d38fa6b3ae5c998337676a0cf91149 data/create/recipes/cut_scoria_from_stone_types_scoria_stonecutting.json 295356022aee8a33272b430879615af638fc5a2c data/create/recipes/cut_scoria_slab.json 1656e822e823fcdf04120b55235aa477845a69a6 data/create/recipes/cut_scoria_slab_from_stone_types_scoria_stonecutting.json @@ -4328,6 +4328,7 @@ d0c88c037004911e377d88cf5a28ff85a413d07e data/create/recipes/cut_scoria_slab_rec 8748df6152c923930452397367562bb6007058cf data/create/recipes/cut_scoria_stairs_from_stone_types_scoria_stonecutting.json 7f9bd9de7bfba21eef449f8e11ffc8cf37de6b88 data/create/recipes/cut_scoria_wall.json 42235c6ded520ecda3321e8cd8910dcfa05cd61e data/create/recipes/cut_scoria_wall_from_stone_types_scoria_stonecutting.json +c02b4daf0050d705c145c0698aaa3094724ba2f1 data/create/recipes/cut_tuff_bricks_from_stone_types_tuff_stonecutting.json 214b6219b86d94ea5705e40f254a4d9a9ac894b7 data/create/recipes/cut_tuff_brick_slab.json 9e0182206fab754daa0596259be0b98a712ba859 data/create/recipes/cut_tuff_brick_slab_from_stone_types_tuff_stonecutting.json 86938ed4ef969e85163c25e2a60181433247b73b data/create/recipes/cut_tuff_brick_slab_recycling.json @@ -4335,7 +4336,6 @@ b4212528d6c8893c1d57c0a5ada60673105e399d data/create/recipes/cut_tuff_brick_stai 90f3241a3eb47d9b0902b639fadee76e41b92a72 data/create/recipes/cut_tuff_brick_stairs_from_stone_types_tuff_stonecutting.json b920d14ac41465f70b1fb8211c1c06d6c41ccadb data/create/recipes/cut_tuff_brick_wall.json aa41f89028dfa995dc11b881894e5a5993e4c4f9 data/create/recipes/cut_tuff_brick_wall_from_stone_types_tuff_stonecutting.json -c02b4daf0050d705c145c0698aaa3094724ba2f1 data/create/recipes/cut_tuff_bricks_from_stone_types_tuff_stonecutting.json 41dc800ae0a8918f4602d610ff0ba9714cdfe8dc data/create/recipes/cut_tuff_from_stone_types_tuff_stonecutting.json 573fff8b4fba92289dc6b113b58c8de25427f62d data/create/recipes/cut_tuff_slab.json 94667fb1e6203bd66bef10acfee7cd990009d26f data/create/recipes/cut_tuff_slab_from_stone_types_tuff_stonecutting.json @@ -4344,6 +4344,7 @@ c02b4daf0050d705c145c0698aaa3094724ba2f1 data/create/recipes/cut_tuff_bricks_fro 3b3ba319bd67a4e7f555cfcb54f9dc1fc22cf015 data/create/recipes/cut_tuff_stairs_from_stone_types_tuff_stonecutting.json 0c241d763e87b23b8799528e132e0d12b0e16141 data/create/recipes/cut_tuff_wall.json 5705b0312c5c70d48662c2ff375f0b2cfe3b4902 data/create/recipes/cut_tuff_wall_from_stone_types_tuff_stonecutting.json +8ab3c640b57421a8c0341ab4ec5bade31376d059 data/create/recipes/cut_veridium_bricks_from_stone_types_veridium_stonecutting.json 822f97726c72d31c4c614767c08140b3535e0640 data/create/recipes/cut_veridium_brick_slab.json 1705fd5fc9ecc9a650812c89f500b5ef9aec2626 data/create/recipes/cut_veridium_brick_slab_from_stone_types_veridium_stonecutting.json 238aeedf55624671809a37246581d28fe6b2c19e data/create/recipes/cut_veridium_brick_slab_recycling.json @@ -4351,7 +4352,6 @@ dfbef691643cead7111b3b1c51aabcda8419bc19 data/create/recipes/cut_veridium_brick_ db2ea87f3ec8924ba9e0b87cd6a6edeb93c0c2d8 data/create/recipes/cut_veridium_brick_stairs_from_stone_types_veridium_stonecutting.json 5e5c9fab7ba7143d206df7d8184742fb1a17c99c data/create/recipes/cut_veridium_brick_wall.json ed752a7f698e3ecbb5e4f848a78f8b3c7c6bf12e data/create/recipes/cut_veridium_brick_wall_from_stone_types_veridium_stonecutting.json -8ab3c640b57421a8c0341ab4ec5bade31376d059 data/create/recipes/cut_veridium_bricks_from_stone_types_veridium_stonecutting.json e0355543105e4ec9d672d2a050e70b5c198ea472 data/create/recipes/cut_veridium_from_stone_types_veridium_stonecutting.json fb3c671f64676538ea3aa96be483ac15b3cdeb3d data/create/recipes/cut_veridium_slab.json 7d7c80ac03ad8623f9a5d7f0ff0bb6f68985efa5 data/create/recipes/cut_veridium_slab_from_stone_types_veridium_stonecutting.json @@ -4537,6 +4537,7 @@ a157a43e7788d285b8d72eade5955369c9b9a1de data/create/recipes/rose_quartz_block_f 1268cc2bdd088d26b84fb4e481db27af61f94bd1 data/create/recipes/scorchia_pillar_from_stone_types_scorchia_stonecutting.json 2e8f4cdb3498547a5e6fe658bb33d4be5ce8f54b data/create/recipes/scoria_from_stone_types_scoria_stonecutting.json 770d3453c75f77b16db661f6e636892d3117690b data/create/recipes/scoria_pillar_from_stone_types_scoria_stonecutting.json +75dc56fcdcd6a10288f2d607bf6dcbbe10b35a64 data/create/recipes/small_andesite_bricks_from_stone_types_andesite_stonecutting.json 2e86fddc76285b4e380b845eb1150580b134d0ac data/create/recipes/small_andesite_brick_slab.json 311727e5c08ddbe0aa26275be74e9b83201ac8ab data/create/recipes/small_andesite_brick_slab_from_stone_types_andesite_stonecutting.json 2767e239c9d704b6bb5325b4f40e0aa0acdcdce1 data/create/recipes/small_andesite_brick_slab_recycling.json @@ -4544,7 +4545,7 @@ a157a43e7788d285b8d72eade5955369c9b9a1de data/create/recipes/rose_quartz_block_f 9e82896e00c1e14e514fac818e11e5b9ef5b10d7 data/create/recipes/small_andesite_brick_stairs_from_stone_types_andesite_stonecutting.json 5287d389b4954d954881d9f0293c52870bba88d0 data/create/recipes/small_andesite_brick_wall.json 1172ca76affd948c50b207124ee03c4f480f4ee8 data/create/recipes/small_andesite_brick_wall_from_stone_types_andesite_stonecutting.json -75dc56fcdcd6a10288f2d607bf6dcbbe10b35a64 data/create/recipes/small_andesite_bricks_from_stone_types_andesite_stonecutting.json +e3b69122b2cfe64b043384235eeb6d04f346e58b data/create/recipes/small_asurine_bricks_from_stone_types_asurine_stonecutting.json 9196a055491052afc14ed01667cccf2a0920e793 data/create/recipes/small_asurine_brick_slab.json f4cc3330837a647c098ccb24fbbbf583c3f960fc data/create/recipes/small_asurine_brick_slab_from_stone_types_asurine_stonecutting.json 063b2f0ad7e93698999922040132eb2b23661a38 data/create/recipes/small_asurine_brick_slab_recycling.json @@ -4552,7 +4553,7 @@ a85d2f957223f87ffa2c3f63cdf6f9f0f84bb921 data/create/recipes/small_asurine_brick c7cb218b0d8a1e358d593fc1fef82fc074289552 data/create/recipes/small_asurine_brick_stairs_from_stone_types_asurine_stonecutting.json 08d10ee57995e67ac1fb5feba04b03aee51dbe16 data/create/recipes/small_asurine_brick_wall.json 4c0aa6203295a36a6d7ffe9d7bf0973277162689 data/create/recipes/small_asurine_brick_wall_from_stone_types_asurine_stonecutting.json -e3b69122b2cfe64b043384235eeb6d04f346e58b data/create/recipes/small_asurine_bricks_from_stone_types_asurine_stonecutting.json +07125218f9025833afa189fa0090f4d6b4660db0 data/create/recipes/small_calcite_bricks_from_stone_types_calcite_stonecutting.json a72719de028ca9e07756dae6031af48525520fc2 data/create/recipes/small_calcite_brick_slab.json d8ebf6f1eb2e2372fb20def956398089adec5d13 data/create/recipes/small_calcite_brick_slab_from_stone_types_calcite_stonecutting.json ab4cfc2b34989d41a434781a3150ecd530c4f15b data/create/recipes/small_calcite_brick_slab_recycling.json @@ -4560,7 +4561,7 @@ c77a7700d978e23db14d947915591061dda8eab3 data/create/recipes/small_calcite_brick 4e066bfc60ea142d54ce939d025b6679ac9634ad data/create/recipes/small_calcite_brick_stairs_from_stone_types_calcite_stonecutting.json 64e53d8090fa26cc4cb62efea7c1615ff7f705c2 data/create/recipes/small_calcite_brick_wall.json 3ba736ae76249fa61692c13f7879af954f9bbd36 data/create/recipes/small_calcite_brick_wall_from_stone_types_calcite_stonecutting.json -07125218f9025833afa189fa0090f4d6b4660db0 data/create/recipes/small_calcite_bricks_from_stone_types_calcite_stonecutting.json +a3309c81f84bf4fb78e9db2316fb758f9b2f8429 data/create/recipes/small_crimsite_bricks_from_stone_types_crimsite_stonecutting.json 92cf7e99229c1e72405bb0875e6f939b3f5aea12 data/create/recipes/small_crimsite_brick_slab.json b993e081103c019b7b9b73b38ef8c408fb4500ac data/create/recipes/small_crimsite_brick_slab_from_stone_types_crimsite_stonecutting.json 7f6fa1fab65d910388f5f2ec4ee7d99cbda8df57 data/create/recipes/small_crimsite_brick_slab_recycling.json @@ -4568,7 +4569,7 @@ b993e081103c019b7b9b73b38ef8c408fb4500ac data/create/recipes/small_crimsite_bric 260da721849d1afd6f431d51538d1587ee3af8d5 data/create/recipes/small_crimsite_brick_stairs_from_stone_types_crimsite_stonecutting.json 093ac919f793111b442029198383a9de5b6df027 data/create/recipes/small_crimsite_brick_wall.json 8b8280a8282fa8718620ee3d69182e241a7852c0 data/create/recipes/small_crimsite_brick_wall_from_stone_types_crimsite_stonecutting.json -a3309c81f84bf4fb78e9db2316fb758f9b2f8429 data/create/recipes/small_crimsite_bricks_from_stone_types_crimsite_stonecutting.json +e7a3cb889ce6b530cd40f19e23bad943374e61b5 data/create/recipes/small_deepslate_bricks_from_stone_types_deepslate_stonecutting.json 022690548a46f5cc63adda3626824a81c6ebf490 data/create/recipes/small_deepslate_brick_slab.json 655be9ddf21dea2255fb2cb2628a5fee39eb10e2 data/create/recipes/small_deepslate_brick_slab_from_stone_types_deepslate_stonecutting.json d6d3db5604279cd402f64dbdeae7c3bee6d7ab78 data/create/recipes/small_deepslate_brick_slab_recycling.json @@ -4576,7 +4577,7 @@ d6d3db5604279cd402f64dbdeae7c3bee6d7ab78 data/create/recipes/small_deepslate_bri 0a458e8248fe395748bd6025d43c002db5a7d343 data/create/recipes/small_deepslate_brick_stairs_from_stone_types_deepslate_stonecutting.json 96e2c36ac2f2899c9681f12f43c8ae232ae09180 data/create/recipes/small_deepslate_brick_wall.json e5644f4227b9cc9b98158ce3ded98bff1ffb97f9 data/create/recipes/small_deepslate_brick_wall_from_stone_types_deepslate_stonecutting.json -e7a3cb889ce6b530cd40f19e23bad943374e61b5 data/create/recipes/small_deepslate_bricks_from_stone_types_deepslate_stonecutting.json +38b80603a86df24f6be0df9fd5f7d9b7aa33d2f9 data/create/recipes/small_diorite_bricks_from_stone_types_diorite_stonecutting.json 6c66b44941c8b97cfec5948b5d8b08355f8d8f67 data/create/recipes/small_diorite_brick_slab.json 801f6cc6e06db56344b37c9b76c69f921c6d9293 data/create/recipes/small_diorite_brick_slab_from_stone_types_diorite_stonecutting.json c1fe4bff306e2d2b5d5595e4b35dd85f7e6bf0ce data/create/recipes/small_diorite_brick_slab_recycling.json @@ -4584,7 +4585,7 @@ af6feedf00bdfa45c1b8f0dd46ddaa80da622fed data/create/recipes/small_diorite_brick 30a6f2bdfec2b3f578572c9f94112906411e7c54 data/create/recipes/small_diorite_brick_stairs_from_stone_types_diorite_stonecutting.json 8728b791808736de2ac31e8dc81aa43638ae0ac8 data/create/recipes/small_diorite_brick_wall.json 7a1fdcef7091d76230fbee410fa5241f584845c4 data/create/recipes/small_diorite_brick_wall_from_stone_types_diorite_stonecutting.json -38b80603a86df24f6be0df9fd5f7d9b7aa33d2f9 data/create/recipes/small_diorite_bricks_from_stone_types_diorite_stonecutting.json +8840d538648516dd02628fbe3ea4f032ceda78bb data/create/recipes/small_dripstone_bricks_from_stone_types_dripstone_stonecutting.json 39a545b60040bd2d922cd3bd5af5036b1b9b23ef data/create/recipes/small_dripstone_brick_slab.json c91e4dc211305456c38e5823def91811ad851202 data/create/recipes/small_dripstone_brick_slab_from_stone_types_dripstone_stonecutting.json 55bb37d07e841bb8eecf2013445c01c8e09ff824 data/create/recipes/small_dripstone_brick_slab_recycling.json @@ -4592,7 +4593,7 @@ c91e4dc211305456c38e5823def91811ad851202 data/create/recipes/small_dripstone_bri 1e23c8df90aef6cd3561369f72c6c3106da883f5 data/create/recipes/small_dripstone_brick_stairs_from_stone_types_dripstone_stonecutting.json fda46cc15c21e7843537df5b5331874fd7511e19 data/create/recipes/small_dripstone_brick_wall.json 336e47b35437ffea4bb86d34f94e6361b2bbcfb0 data/create/recipes/small_dripstone_brick_wall_from_stone_types_dripstone_stonecutting.json -8840d538648516dd02628fbe3ea4f032ceda78bb data/create/recipes/small_dripstone_bricks_from_stone_types_dripstone_stonecutting.json +42c74dec6c64d3675e15b2b73cb32fc9d24839e9 data/create/recipes/small_granite_bricks_from_stone_types_granite_stonecutting.json d1bb4e91d80ca8eb9c2f935cbb66ef08b9ca7059 data/create/recipes/small_granite_brick_slab.json ddb2f4652607b56332a927af939212a5789a34db data/create/recipes/small_granite_brick_slab_from_stone_types_granite_stonecutting.json f1388636bcf98d7d9103c23528053b28c6305b4e data/create/recipes/small_granite_brick_slab_recycling.json @@ -4600,7 +4601,7 @@ f1388636bcf98d7d9103c23528053b28c6305b4e data/create/recipes/small_granite_brick ba935a3d64eedbd9b7017d0abfab351f57589593 data/create/recipes/small_granite_brick_stairs_from_stone_types_granite_stonecutting.json dac22c54e8034587a3fcf3aa0ce19bb4b7607cd7 data/create/recipes/small_granite_brick_wall.json 7a8d9e2291675de9e72363d93410de9039216f32 data/create/recipes/small_granite_brick_wall_from_stone_types_granite_stonecutting.json -42c74dec6c64d3675e15b2b73cb32fc9d24839e9 data/create/recipes/small_granite_bricks_from_stone_types_granite_stonecutting.json +714f6a84a5b3d5d57c07364925555e6f545b0b3d data/create/recipes/small_limestone_bricks_from_stone_types_limestone_stonecutting.json b844632a588cb96397750f4387c7e6517f85092c data/create/recipes/small_limestone_brick_slab.json a1c0bc263cd4659a89213f4fcdd87eba7ae04427 data/create/recipes/small_limestone_brick_slab_from_stone_types_limestone_stonecutting.json ec9154a3791113f57dc1c16dfef4c837533b6fc6 data/create/recipes/small_limestone_brick_slab_recycling.json @@ -4608,7 +4609,7 @@ ec9154a3791113f57dc1c16dfef4c837533b6fc6 data/create/recipes/small_limestone_bri 6943fdc8162e4d53c459f425b2ff5b34e9caa477 data/create/recipes/small_limestone_brick_stairs_from_stone_types_limestone_stonecutting.json 27ff69345efea14b9688fe9b182809995ea8ad4a data/create/recipes/small_limestone_brick_wall.json 98a83f757f0ac9cc2a876ae407bb5765071e700d data/create/recipes/small_limestone_brick_wall_from_stone_types_limestone_stonecutting.json -714f6a84a5b3d5d57c07364925555e6f545b0b3d data/create/recipes/small_limestone_bricks_from_stone_types_limestone_stonecutting.json +22c69e391110280e13d50693b9c81355da57a315 data/create/recipes/small_ochrum_bricks_from_stone_types_ochrum_stonecutting.json abdd280694cb30ce0d2703aadeeb378af9a7f8b2 data/create/recipes/small_ochrum_brick_slab.json e37612fa2523fa3711242cac4ec5e596b3e55698 data/create/recipes/small_ochrum_brick_slab_from_stone_types_ochrum_stonecutting.json 8f3f47cb3e759104cf86a422339345f8795143d3 data/create/recipes/small_ochrum_brick_slab_recycling.json @@ -4616,8 +4617,8 @@ de8d7f8e57645c0b5a6e98eb0cc4e573c5cf96ac data/create/recipes/small_ochrum_brick_ 04ebbdd14f81f4b4dc7986cb5241caa9f48f4ff1 data/create/recipes/small_ochrum_brick_stairs_from_stone_types_ochrum_stonecutting.json 07876725f97ff611f8d1710462224f07cab3ebbd data/create/recipes/small_ochrum_brick_wall.json 2331801569ec95562afc802f7e2ff191d329a5c6 data/create/recipes/small_ochrum_brick_wall_from_stone_types_ochrum_stonecutting.json -22c69e391110280e13d50693b9c81355da57a315 data/create/recipes/small_ochrum_bricks_from_stone_types_ochrum_stonecutting.json 68a9f80b97d9322ed33067d7717180494b904bed data/create/recipes/small_rose_quartz_tiles_from_polished_rose_quartz_stonecutting.json +bf27af2e54ed1b09611d67ee7afa6c7f56d00d09 data/create/recipes/small_scorchia_bricks_from_stone_types_scorchia_stonecutting.json 133057778480e1d2e13fe7b2766ba0891feea3a5 data/create/recipes/small_scorchia_brick_slab.json dad342d215c98f3214752e0ebfaf3015943c5ac7 data/create/recipes/small_scorchia_brick_slab_from_stone_types_scorchia_stonecutting.json 0a57ad5fce22d69cdc1dd880403612ffb47af4ba data/create/recipes/small_scorchia_brick_slab_recycling.json @@ -4625,7 +4626,7 @@ dad342d215c98f3214752e0ebfaf3015943c5ac7 data/create/recipes/small_scorchia_bric 7f89c9c6dcea06a3022c72029a5e547aa1721773 data/create/recipes/small_scorchia_brick_stairs_from_stone_types_scorchia_stonecutting.json 43310b3fa43bd791ef0e2e30971a24e788c20139 data/create/recipes/small_scorchia_brick_wall.json de8edc4fa5eec031ad0a63c7f59141985ae9af9e data/create/recipes/small_scorchia_brick_wall_from_stone_types_scorchia_stonecutting.json -bf27af2e54ed1b09611d67ee7afa6c7f56d00d09 data/create/recipes/small_scorchia_bricks_from_stone_types_scorchia_stonecutting.json +b1a67d052e26c2129c34ee0732cfe533beb3e571 data/create/recipes/small_scoria_bricks_from_stone_types_scoria_stonecutting.json d8a41adcc6ae9b0eb71a83b2dd89ff92a10e0057 data/create/recipes/small_scoria_brick_slab.json 34f4dd094f2949e3fd21f95ac890ae803b81fbea data/create/recipes/small_scoria_brick_slab_from_stone_types_scoria_stonecutting.json f15ad1cb05f5b02b630b982d23bd951178a3650c data/create/recipes/small_scoria_brick_slab_recycling.json @@ -4633,7 +4634,7 @@ df5a1437fb112519d904cc9f1cd28d5d891fb04d data/create/recipes/small_scoria_brick_ d36428daf8bf4e560f649e5eb40a8cd7a27e7a0e data/create/recipes/small_scoria_brick_stairs_from_stone_types_scoria_stonecutting.json cad432398d8886d60b94e96b2c2096ae27fffb50 data/create/recipes/small_scoria_brick_wall.json 9cff8370aaa81ece466fe15642c00a9992bd416c data/create/recipes/small_scoria_brick_wall_from_stone_types_scoria_stonecutting.json -b1a67d052e26c2129c34ee0732cfe533beb3e571 data/create/recipes/small_scoria_bricks_from_stone_types_scoria_stonecutting.json +e51ced16059f7c37fe3652a1cf4d938f91e956fc data/create/recipes/small_tuff_bricks_from_stone_types_tuff_stonecutting.json dd83af4a10a9b0ba6a4efb272d8b6b1611524a39 data/create/recipes/small_tuff_brick_slab.json e3a12b87830e47387e9ac118bb3d12b73558d757 data/create/recipes/small_tuff_brick_slab_from_stone_types_tuff_stonecutting.json 85dff00dc49eaf65f1f149a7f21a9f307b1b9710 data/create/recipes/small_tuff_brick_slab_recycling.json @@ -4641,7 +4642,7 @@ e03a8270b01b9a5cad238db4ce2b8f66ea78e8bf data/create/recipes/small_tuff_brick_st cd50bb5842c90038f6ac74e45971ab2e914d1463 data/create/recipes/small_tuff_brick_stairs_from_stone_types_tuff_stonecutting.json e795fbe5062ec47cc660ee26c8398477509c5f18 data/create/recipes/small_tuff_brick_wall.json 34471a7ebb431b6d1e3be5fa480b800b96556fee data/create/recipes/small_tuff_brick_wall_from_stone_types_tuff_stonecutting.json -e51ced16059f7c37fe3652a1cf4d938f91e956fc data/create/recipes/small_tuff_bricks_from_stone_types_tuff_stonecutting.json +82f17edc61a319c74dbdfa730584305899bd7572 data/create/recipes/small_veridium_bricks_from_stone_types_veridium_stonecutting.json f9a2f4ca078364e05b3446fe890ea207e5a56e87 data/create/recipes/small_veridium_brick_slab.json 234c3baee4c9428caab3e344f396ec87064103e3 data/create/recipes/small_veridium_brick_slab_from_stone_types_veridium_stonecutting.json b0db8335e3c7fd88f074c3895bea952efc0e8df8 data/create/recipes/small_veridium_brick_slab_recycling.json @@ -4649,7 +4650,6 @@ a1e214c230574526ca0a2fec059b4157ddec557d data/create/recipes/small_veridium_bric f63031587a64ed88ddba1df07767dd8d8caa1d2e data/create/recipes/small_veridium_brick_stairs_from_stone_types_veridium_stonecutting.json 9b003fbf2bcd975501ba307ea68c6c4bab397683 data/create/recipes/small_veridium_brick_wall.json 1ba48c5cae05b6f4b1ad223ce80925f1eaaf5dfd data/create/recipes/small_veridium_brick_wall_from_stone_types_veridium_stonecutting.json -82f17edc61a319c74dbdfa730584305899bd7572 data/create/recipes/small_veridium_bricks_from_stone_types_veridium_stonecutting.json 47973044b19b35ce169e7d46abc9d11a2f67a487 data/create/recipes/spruce_window.json 810544f79bf4b002981e614eaa8e49b48a7b5397 data/create/recipes/spruce_window_pane.json e343a80c92dab60f99c9b441d00189aceee477a0 data/create/recipes/tiled_glass_from_glass_colorless_stonecutting.json @@ -4819,7 +4819,7 @@ c741ba83b562ae3459d7c4f2db69537f549ea411 data/forge/tags/items/tools/wrench.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/dripstone_replaceable_blocks.json f8bd9b33238ab9f2f2a83b63bf0c52fbf705b452 data/minecraft/tags/blocks/impermeable.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/lush_ground_replaceable.json -632b3589bae819777af7129b534f1c10e810cf5d data/minecraft/tags/blocks/mineable/axe.json +435e59881e2d9a8cae6c23fc6ce6d43111d40277 data/minecraft/tags/blocks/mineable/axe.json 47df6c90d9474d7a708063b0207e520ad01f1998 data/minecraft/tags/blocks/mineable/pickaxe.json 515a1c773e617dd7e38aa1b893acc7db2dd30e08 data/minecraft/tags/blocks/moss_replaceable.json 0c13aae0eeb99e89febe8dbe5e002af2ff843a9e data/minecraft/tags/blocks/needs_iron_tool.json diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json b/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json index f676ea6278..9189599f80 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json @@ -107,7 +107,6 @@ "create:red_postbox", "create:black_postbox", "create:stock_ticker", - "create:redstone_requester", "create:display_link", "create:redstone_link", "create:analog_lever", diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 503ed8b76f..514c7a4fc5 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -1943,9 +1943,9 @@ public class AllBlocks { public static final BlockEntry REDSTONE_REQUESTER = REGISTRATE.block("redstone_requester", RedstoneRequesterBlock::new) .initialProperties(SharedProperties::stone) - .properties(p -> p.sound(SoundType.WOOD)) + .properties(p -> p.sound(SoundType.NETHERITE_BLOCK)) .properties(p -> p.noOcclusion()) - .transform(axeOrPickaxe()) + .transform(pickaxeOnly()) .blockstate((c, p) -> BlockStateGen.horizontalAxisBlock(c, p, AssetLookup.forPowered(c, p))) .item(RedstoneRequesterBlockItem::new) .transform(customItemModel("_", "block")) diff --git a/src/main/java/com/simibubi/create/compat/curios/GogglesCurioRenderer.java b/src/main/java/com/simibubi/create/compat/curios/GogglesCurioRenderer.java index f40af962b0..e17fbc899b 100644 --- a/src/main/java/com/simibubi/create/compat/curios/GogglesCurioRenderer.java +++ b/src/main/java/com/simibubi/create/compat/curios/GogglesCurioRenderer.java @@ -45,6 +45,7 @@ public class GogglesCurioRenderer implements ICurioRenderer { // Translate and rotate with our head matrixStack.pushPose(); matrixStack.translate(model.head.x / 16.0, model.head.y / 16.0, model.head.z / 16.0); + matrixStack.mulPose(Axis.ZP.rotation(model.head.zRot)); matrixStack.mulPose(Axis.YP.rotation(model.head.yRot)); matrixStack.mulPose(Axis.XP.rotation(model.head.xRot)); diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageVisual.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageVisual.java index 2c44d9bcd8..40790b6906 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageVisual.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageVisual.java @@ -57,7 +57,7 @@ public class PackageVisual extends AbstractEntityVisual implement instance.setIdentityTransform() .translate(x - 0.5 + xNudge, y + yNudge, z - 0.5 + zNudge) - .rotateYCenteredDegrees(yaw) + .rotateYCenteredDegrees(-yaw - 90) .light(computePackedLight(partialTick)) .setChanged(); } diff --git a/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothBlockEntity.java index 930229df70..37d2e07046 100644 --- a/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/tableCloth/TableClothBlockEntity.java @@ -104,8 +104,6 @@ public class TableClothBlockEntity extends SmartBlockEntity { public InteractionResult use(Player player, BlockHitResult ray) { if (isShop()) return useShop(player); - if (level.isClientSide()) - return InteractionResult.SUCCESS; ItemStack heldItem = player.getItemInHand(InteractionHand.MAIN_HAND); @@ -149,7 +147,6 @@ public class TableClothBlockEntity extends SmartBlockEntity { ItemStack itemInHand = player.getItemInHand(InteractionHand.MAIN_HAND); ItemStack prevListItem = ItemStack.EMPTY; boolean addOntoList = false; - boolean clientSide = level.isClientSide(); // Remove other lists from inventory for (int i = 0; i < 9; i++) { @@ -159,9 +156,8 @@ public class TableClothBlockEntity extends SmartBlockEntity { continue; prevListItem = item; addOntoList = true; - if (!clientSide) - player.getInventory() - .setItem(i, ItemStack.EMPTY); + player.getInventory() + .setItem(i, ItemStack.EMPTY); } // add onto existing list if in hand @@ -171,20 +167,16 @@ public class TableClothBlockEntity extends SmartBlockEntity { } if (!itemInHand.isEmpty() && !addOntoList) { - if (clientSide) { - CreateLang.translate("stock_keeper.shopping_list_empty_hand") - .sendStatus(player); - AllSoundEvents.DENY.playAt(level, worldPosition, 1, 1, false); - } + CreateLang.translate("stock_keeper.shopping_list_empty_hand") + .sendStatus(player); + AllSoundEvents.DENY.playOnServer(level, worldPosition, 0.5f, 1); return InteractionResult.SUCCESS; } if (getPaymentItem().isEmpty()) { - if (clientSide) { - CreateLang.translate("stock_keeper.no_price_set") - .sendStatus(player); - AllSoundEvents.DENY.playAt(level, worldPosition, 1, 1, false); - } + CreateLang.translate("stock_keeper.no_price_set") + .sendStatus(player); + AllSoundEvents.DENY.playOnServer(level, worldPosition, 0.5f, 1); return InteractionResult.SUCCESS; } @@ -196,30 +188,25 @@ public class TableClothBlockEntity extends SmartBlockEntity { int stockLevel = getStockLevelForTrade(ShoppingListItem.getList(prevListItem)); if (tickerID == null) { - if (clientSide) { - CreateLang.translate("stock_keeper.keeper_missing") - .style(ChatFormatting.RED) - .sendStatus(player); - AllSoundEvents.DENY.playAt(level, worldPosition, 1, 1, false); - } + CreateLang.translate("stock_keeper.keeper_missing") + .style(ChatFormatting.RED) + .sendStatus(player); + AllSoundEvents.DENY.playOnServer(level, worldPosition, 0.5f, 1); return InteractionResult.SUCCESS; } if (stockLevel == 0) { - if (clientSide) { - CreateLang.translate("stock_keeper.out_of_stock") - .style(ChatFormatting.RED) - .sendStatus(player); - AllSoundEvents.DENY.playAt(level, worldPosition, 1, 1, false); - } else { - if (!prevListItem.isEmpty()) { - if (player.getItemInHand(InteractionHand.MAIN_HAND) - .isEmpty()) - player.setItemInHand(InteractionHand.MAIN_HAND, prevListItem); - else - player.getInventory() - .placeItemBackInInventory(prevListItem); - } + CreateLang.translate("stock_keeper.out_of_stock") + .style(ChatFormatting.RED) + .sendStatus(player); + AllSoundEvents.DENY.playOnServer(level, worldPosition, 0.5f, 1); + if (!prevListItem.isEmpty()) { + if (player.getItemInHand(InteractionHand.MAIN_HAND) + .isEmpty()) + player.setItemInHand(InteractionHand.MAIN_HAND, prevListItem); + else + player.getInventory() + .placeItemBackInInventory(prevListItem); } return InteractionResult.SUCCESS; @@ -240,17 +227,12 @@ public class TableClothBlockEntity extends SmartBlockEntity { if (worldPosition.equals(entry.getValue())) entry.setFirst(Math.min(stockLevel, entry.getFirst())); - if (clientSide) - CreateLang.translate("stock_keeper.limited_stock") - .style(ChatFormatting.RED) - .sendStatus(player); + CreateLang.translate("stock_keeper.limited_stock") + .style(ChatFormatting.RED) + .sendStatus(player); } else { - if (clientSide) { - AllSoundEvents.CONFIRM_2.playAt(level, worldPosition, 0.5f, 1, false); - return InteractionResult.SUCCESS; - } - + AllSoundEvents.CONFIRM_2.playOnServer(level, worldPosition, 0.5f, 1.0f); list.addPurchases(worldPosition, 1); if (!addOntoList) CreateLang.translate("stock_keeper.use_list_to_add_purchases") @@ -260,9 +242,6 @@ public class TableClothBlockEntity extends SmartBlockEntity { level.playSound(null, worldPosition, SoundEvents.BOOK_PAGE_TURN, SoundSource.BLOCKS, 1, 1.5f); } - if (clientSide) - return InteractionResult.SUCCESS; - ItemStack newListItem = ShoppingListItem.saveList(AllItems.SHOPPING_LIST.asStack(), list, requestData.encodedTargetAdress); diff --git a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/EntityNameDisplaySource.java b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/EntityNameDisplaySource.java index 8dd981462f..c24205668e 100644 --- a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/EntityNameDisplaySource.java +++ b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/EntityNameDisplaySource.java @@ -6,6 +6,7 @@ import com.simibubi.create.content.contraptions.actors.seat.SeatEntity; import com.simibubi.create.content.redstone.displayLink.DisplayLinkContext; import com.simibubi.create.content.redstone.displayLink.target.DisplayTargetStats; +import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.world.entity.Entity; import net.minecraft.world.phys.AABB; @@ -24,7 +25,7 @@ public class EntityNameDisplaySource extends SingleLineDisplaySource { if (passengers.isEmpty()) return EMPTY_LINE; - return passengers.get(0).getDisplayName().copy(); + return Component.literal(passengers.get(0).getDisplayName().getString()); } @Override diff --git a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/ItemNameDisplaySource.java b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/ItemNameDisplaySource.java index 5c7aef3c84..87dee247c9 100644 --- a/src/main/java/com/simibubi/create/content/redstone/displayLink/source/ItemNameDisplaySource.java +++ b/src/main/java/com/simibubi/create/content/redstone/displayLink/source/ItemNameDisplaySource.java @@ -4,6 +4,7 @@ import org.apache.commons.lang3.mutable.MutableObject; import com.simibubi.create.content.kinetics.belt.behaviour.TransportedItemStackHandlerBehaviour; import com.simibubi.create.content.kinetics.belt.behaviour.TransportedItemStackHandlerBehaviour.TransportedResult; +import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.content.redstone.displayLink.DisplayLinkBlockEntity; import com.simibubi.create.content.redstone.displayLink.DisplayLinkContext; import com.simibubi.create.content.redstone.displayLink.target.DisplayTargetStats; @@ -11,6 +12,7 @@ import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; +import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.world.item.ItemStack; @@ -40,8 +42,12 @@ public class ItemNameDisplaySource extends SingleLineDisplaySource { }); ItemStack stack = stackHolder.getValue(); - if (stack != null && !stack.isEmpty()) - combined = combined.append(stack.getHoverName()); + if (stack != null && !stack.isEmpty()) { + Component hoverName = stack.getHoverName(); + if (PackageItem.isPackage(stack)) + hoverName = Component.literal(PackageItem.getAddress(stack)); + combined = combined.append(hoverName); + } } return combined; diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsInputHandler.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsInputHandler.java index 3875736fdc..4fa8dca7eb 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsInputHandler.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueSettingsInputHandler.java @@ -5,7 +5,6 @@ import com.simibubi.create.AllTags.AllItemTags; import com.simibubi.create.CreateClient; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.filtering.SidedFilteringBehaviour; -import com.simibubi.create.foundation.utility.RaycastHelper; import net.minecraft.core.BlockPos; import net.minecraft.world.InteractionHand; @@ -53,7 +52,7 @@ public class ValueSettingsInputHandler { if (!valueSettingsBehaviour.mayInteract(player)) continue; - BlockHitResult ray = RaycastHelper.rayTraceRange(world, player, 10); + BlockHitResult ray = event.getHitVec(); if (ray == null) return; if (behaviour instanceof SidedFilteringBehaviour) { From 1cad65d2d0eabd9389814e08042c09f85c52bbe7 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Wed, 22 Jan 2025 16:44:05 -0500 Subject: [PATCH 347/515] An odd looking wrench II --- .../chainConveyor/ChainConveyorInteractionHandler.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorInteractionHandler.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorInteractionHandler.java index 8431c3cff1..cca47498dc 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorInteractionHandler.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorInteractionHandler.java @@ -53,7 +53,7 @@ public class ChainConveyorInteractionHandler { Minecraft mc = Minecraft.getInstance(); ItemStack mainHandItem = mc.player.getMainHandItem(); - boolean isWrench = AllItemTags.WRENCH.matches(mainHandItem); + boolean isWrench = AllItemTags.CHAIN_RIDEABLE.matches(mainHandItem); boolean dismantling = isWrench && mc.player.isShiftKeyDown(); double range = mc.player.getAttribute(ForgeMod.BLOCK_REACH.get()) .getValue() + 1; @@ -115,7 +115,7 @@ public class ChainConveyorInteractionHandler { private static boolean isActive() { Minecraft mc = Minecraft.getInstance(); ItemStack mainHandItem = mc.player.getMainHandItem(); - return AllItemTags.WRENCH.matches(mainHandItem) || AllBlocks.PACKAGE_FROGPORT.isIn(mainHandItem) + return AllItemTags.CHAIN_RIDEABLE.matches(mainHandItem) || AllBlocks.PACKAGE_FROGPORT.isIn(mainHandItem) || PackageItem.isPackage(mainHandItem); } @@ -126,7 +126,7 @@ public class ChainConveyorInteractionHandler { Minecraft mc = Minecraft.getInstance(); ItemStack mainHandItem = mc.player.getMainHandItem(); - if (AllItemTags.WRENCH.matches(mainHandItem)) { + if (AllItemTags.CHAIN_RIDEABLE.matches(mainHandItem)) { if (!mc.player.isShiftKeyDown()) { ChainConveyorRidingHandler.embark(selectedLift, selectedChainPosition, selectedConnection); return true; From eed9447e5dc9a1c328dd83089d3e75dc31394a51 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Wed, 22 Jan 2025 21:45:47 -0500 Subject: [PATCH 348/515] Capturing blazes --- .../com/simibubi/create/AllPartialModels.java | 1 + .../stockTicker/StockKeeperRequestScreen.java | 86 +++++++++++-------- 2 files changed, 51 insertions(+), 36 deletions(-) diff --git a/src/main/java/com/simibubi/create/AllPartialModels.java b/src/main/java/com/simibubi/create/AllPartialModels.java index a803bb378d..0c060abd0e 100644 --- a/src/main/java/com/simibubi/create/AllPartialModels.java +++ b/src/main/java/com/simibubi/create/AllPartialModels.java @@ -181,6 +181,7 @@ public class AllPartialModels { SIGNAL_RED = block("track_signal/red_tube"), SIGNAL_YELLOW_CUBE = block("track_signal/yellow_cube"), SIGNAL_YELLOW_GLOW = block("track_signal/yellow_glow"), SIGNAL_YELLOW = block("track_signal/yellow_tube"), + BLAZE_CAGE = block("blaze_burner/block"), BLAZE_INERT = block("blaze_burner/blaze/inert"), BLAZE_SUPER_ACTIVE = block("blaze_burner/blaze/super_active"), BLAZE_GOGGLES = block("blaze_burner/goggles"), BLAZE_GOGGLES_SMALL = block("blaze_burner/goggles_small"), BLAZE_IDLE = block("blaze_burner/blaze/idle"), BLAZE_ACTIVE = block("blaze_burner/blaze/active"), diff --git a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperRequestScreen.java b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperRequestScreen.java index b43d939526..1cb5b961f7 100644 --- a/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperRequestScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/stockTicker/StockKeeperRequestScreen.java @@ -18,6 +18,7 @@ import com.mojang.blaze3d.platform.Lighting; import com.mojang.blaze3d.platform.Window; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.math.Axis; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllPackets; @@ -39,23 +40,26 @@ import com.simibubi.create.foundation.gui.menu.AbstractSimiContainerScreen; import com.simibubi.create.foundation.utility.CreateLang; import dev.engine_room.flywheel.lib.model.baked.PartialModel; -import net.createmod.catnip.gui.UIRenderHelper; -import net.createmod.catnip.gui.element.GuiGameElement; import net.createmod.catnip.animation.AnimationTickHolder; +import net.createmod.catnip.animation.LerpedFloat; +import net.createmod.catnip.animation.LerpedFloat.Chaser; import net.createmod.catnip.data.Couple; import net.createmod.catnip.data.Iterate; import net.createmod.catnip.data.Pair; -import net.createmod.catnip.animation.LerpedFloat; -import net.createmod.catnip.animation.LerpedFloat.Chaser; +import net.createmod.catnip.gui.UIRenderHelper; +import net.createmod.catnip.gui.element.GuiGameElement; import net.createmod.catnip.lang.Components; import net.createmod.catnip.math.AngleHelper; +import net.createmod.catnip.render.CachedBuffers; import net.createmod.catnip.theme.Color; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.EditBox; import net.minecraft.client.gui.screens.inventory.InventoryScreen; +import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.Rect2i; +import net.minecraft.client.renderer.RenderType; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; @@ -69,6 +73,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.phys.AABB; + import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.network.simple.SimpleChannel; import net.minecraftforge.registries.ForgeRegistries; @@ -88,7 +93,9 @@ public class StockKeeperRequestScreen extends AbstractSimiContainerScreen